ZGlmZiAtLWdpdCBhLy5jdnNpZ25vcmUgYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI2YzMyLi4wMDAwMDAwCi0tLSBhLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0qLWFsbAotKi1jbwotKi1kaXJzCi0qLWRvbmUKLSotaW5zdGFsbC1pbmZvCi0qLXNyYwotKi1zdGFtcC0qCi0qLXRhZ2dlZAotYmxvY2tpdAotY2ZnLXBhcGVyLmluZm8KLWNvbmZpZy5zdGF0dXMKLWNvbmZpZ3VyZS5hdXgKLWNvbmZpZ3VyZS5jcAotY29uZmlndXJlLmNwcwotY29uZmlndXJlLmR2aQotY29uZmlndXJlLmZuCi1jb25maWd1cmUuZm5zCi1jb25maWd1cmUua3kKLWNvbmZpZ3VyZS5reXMKLWNvbmZpZ3VyZS5sb2cKLWNvbmZpZ3VyZS5wZwotY29uZmlndXJlLnBncwotY29uZmlndXJlLnRvYwotY29uZmlndXJlLnRwCi1jb25maWd1cmUudHBzCi1jb25maWd1cmUudnIKLWNvbmZpZ3VyZS52cnMKLWRpci5pbmZvCi1NYWtlZmlsZQotbG9zdCtmb3VuZApkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL0NPUFlJTkcuTElCIGIvQ09QWUlORy5MSUIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWEzZDEuLjAwMDAwMDAKLS0tIGEvQ09QWUlORy5MSUIKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcwotIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKLW90aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKLXlvdXIgbGlicmFyaWVzLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKLXlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAotdGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1saWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCi12ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCi10aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0MCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCi1zb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAotdHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCi13ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKLWZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCi1saWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCi1kZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKLW9uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwotdGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCi0KLSAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKLXRoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCi1wcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAotY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKLWFuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgotYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQotZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi10cmVhdHMgaXQgYXMgc3VjaC4KLQotICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCi1zaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKLWNvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCi0KLSAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKLXVzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQotbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bwotcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQotcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCi1saWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQotdGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCi1jaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcwotd2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKLXdvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCi0KLSAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KLQwKLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKLWNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCi1wYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKLWFkZHJlc3NlZCBhcyAieW91Ii4KLQotICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCi1wcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKLSh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCi0KLSAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKLXdoaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCi1jb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQotcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAotc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcwotaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKLQotICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucwotYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKLWludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgotYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQotc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgotd3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcwotYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCi0gIAotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotDAotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCi0gICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKLSAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCi0gICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQotICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAotICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgotICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCi0gICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgotCi0gICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKLSAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi0gICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKLSAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAotICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCi0gICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQotaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKLXdpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KLXRoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KLXRoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKLWluc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKLXRoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KLXRoZXNlIG5vdGljZXMuCi0MCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQwKLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAotICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwotICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKLSAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCi0KLSAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQotICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KLQotICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQotICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgotCi0gIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQotTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKLXJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAotdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQotZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQwKLSAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKLWZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKLWxpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgotdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCi1wZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKLSAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5Ci0gICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgU2VjdGlvbnMgYWJvdmUuCi0KLSAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAotICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCi0gICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgotCi0gIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCi10aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQotYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKLXJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKLW9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKLXRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQotc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQwKLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotDAotICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCi13cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwotY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKLWRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKLW9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCi1hbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KLVdBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCi1FWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgotT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLUtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKLUxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCi1USEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KLVdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCi1BTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQotRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKLUxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKLVJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCi1TVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi1EQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0gICAgIEFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0Ci1ldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKLXJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCi0KLSAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwotc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQotImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgIE1BIDAyMTExLTEzMDcsIFVTQQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKLSAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhMTljNC4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw2NjIwICswLDAgQEAKLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIGNvbmZpZ3VyaW5nIGZvciBwai4KLQotMTk5OS0wOC0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAobWF5YmVfb3MpOiBBZGQgc3VwcG9ydCBmb3IgY29uZmlndXJpbmcgZm9yIGZyMzAuIAotCi0xOTk5LTA4LTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvIG5vdCBjb25maWd1cmUgb3IgYnVpbGQgbGQgZm9yIEFJWAotCXBsYXRmb3Jtcy4gIGxkIGlzIGtub3duIHRvIGJlIGJyb2tlbiBvbiB0aGVzZSBwbGF0Zm9ybXMuCi0KLTE5OTktMDgtMDkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTERGTEFHUyk6IERlZmluZS4KLQotMTk5OS0wOC0wOCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDU2XS0qLW1pbmd3MzIqKTogRG9uJ3QgcHV0IGdwcm9mIGluCi0Jbm9jb25maWdkaXJzLgotCSgqLSotY3lnd2luKik6IExpa2V3aXNlLgotCi0xOTk5LTA4LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbWtkZXA6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEdBU19TVVBQT1JUX0RJUlMpOiBBZGQgbWtkZXAuCi0JKEJJTlVUSUxTX1NVUFBPUlRfRElSUyk6IEFkZCBta2RlcC4KLQotCUZyb20gRWxpIFphcmV0c2tpaSA8ZWxpekBpcy5lbHRhLmNvLmlsPjoKLQkqIGNvbmZpZ3VyZSAodG1wZmlsZSk6IENoYW5nZSBjT05mJCQgdG8gY05mJCQgdG8gYXZvaWQgYW4gb3Zlcmx5Ci0JbG9uZyBmaWxlIG5hbWUgd2hlbiB1c2luZyBESkdQUCBvbiBNUy1ET1MuCi0KLTE5OTktMDctMzAgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrLXRhcmdldC1saWJpbyk6IFJlbW92ZSBhbGwtdGFyZ2V0LWxpYnN0ZGMrKwotCWRlcGVuZGVuY3kgYXMgdGhpcyBjYXVzZXMgIm1ha2UgY2hlY2siIHRvIGdsb2JhbGx5ICJtYWtlIGFsbCIKLQotMTk5OS0wNy0yMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChiaW51dGlscy50YXIuYnoyKTogRG9uJ3QgcGFzcyBtYWtlYWxsLmJhdCBhbmQKLQljb25maWd1cmUuYmF0IGluIFNVUFBPUlRfRklMRVMuCi0JKGdhcytiaW51dGlscy50YXIuYnoyKTogTGlrZXdpc2UuCi0KLQkqIG1ha2VhbGwuYmF0OiBSZW1vdmU7IG9ic29sZXRlLgotCi0xOTk5LTA3LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gTWFyayBFbGJyZWNodDoKLQkqIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZTsgb2Jzb2xldGUuCi0KLTE5OTktMDctMTEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWd1cmU6IEFkZCAtVyAtV2FsbCB0byB0aGUgZGVmYXVsdCBDRkxBR1Mgd2hlbiBjb21waWxpbmcgd2l0aAotCWdjYy4KLQotVGh1IEp1bCAgOCAxMjozMjoyMyAxOTk5ICBKb2huIERhdmlkIEFuZ2xpbiA8ZGF2ZUBoaWF1bHkxLmhpYS5ucmMuY2E+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgbGQsIGJpbnV0aWxzICYgZ2FzIGZvciBocHBhKi0qLWxpbnV4LWdudSouCi0KLTE5OTktMDYtMzAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgbGQgb24gSVJJWDYuCi0KLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGRpc3RyaWJ1dGlvbiB0YXJnZXRzIHRvIHVzZSBiemlwMiBpbnN0ZWFkIG9mCi0JZ3ppcC4KLQkoVEVYSU5GT19TVVBQT1JUKTogU2V0IHRvIGp1c3QgdGV4aW5mby90ZXhpbmZvLnRleC4KLQkodGF6KTogRG9uJ3QgdXNlIHRleGluZm8vZ3BsLnRleGluZm8gb3IgdGV4aW5mby9sZ3BsLnRleGluZm8uCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+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+IGNmZy1wYXBlci50ZXhpLgotCi1GcmkgSmFuIDMxIDIxOjQ4OjE4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKG5lYXIgY2FzZSAkb3MpOiAgRG9uJ3QgY29udmVydCBuZXdzb3MqIHRvIGJzZCEKLQotRnJpIEphbiAzMSAwMjoyNzozMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZWluc3RhbGwgY2hhbmdlIGZyb20gZ2RiLTQuMyB0aGF0IHJlZHVjZXMKLQl0aGUgbnVtYmVyIG9mIGNvcGllcyBvZiBDT1BZSU5HIHRoYXQgZ28gaW50byB0aGUgR0RCIHRhciBmaWxlLgotCi1UaHUgSmFuIDMwIDE2OjE3OjMwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC9jb25maWd1cmUuaW4sIGNvbmZpZy9taC1zY28sIGdkYi9jb25maWcvbWgtaTM4NnNjbywKLQlnZGIvY29uZmlnL210LWkzODZ2MzIsIGdkYi9jb25maWd1cmUuaW4sIHJlYWRsaW5lL2NvbmZpZ3VyZS5pbjoKLQlGaXggU0NPIGNvbmZpZ3VyYXRpb24gc3R1ZmYuCi0KLVR1ZSBKYW4gMjggMjM6NTE6MDcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgRm9yIGxpYmcrKywgbWFrZSBzdXJlIHRoZSAtSSBwb2ludGluZwotCXRvIHRoZSBnY2MgZGlyZWN0b3J5IGdvZXMgKmFmdGVyKiBhbGwgdGhlIGxpYmcrKy1sb2NhbCAtSSBmbGFncy4KLQlBbHNvLCBtb3ZlIGp1c3QtZ2NjIGRlcGVuZGVuY3kgZnJvbSBqdXN0LWxpYmcrKyB0byBhbGwtbGliZysrLgotCi1UdWUgSmFuIDI4IDEyOjU2OjI0IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIENoYW5nZSAteCB0byAtZiB0byBrZWVwIFVsdHJpeCAvYmluL3Rlc3QgaGFwcHkuCi0KLVNhdCBKYW4gMTggMTc6NDU6MTEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5aKTogIFJlbW92ZSB0ZXhpbmZvIHRhcmdldHMuCi0KLVNhdCBKYW4gMTggMTc6MDM6MjEgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBZGQgc3RyYXR1cyBjb25maWd1cmF0aW9uIGZyYWdzLiAgQWxzbwotCXN1Ym1pdHRlZCB0byBGU0YuCi0KLVNhdCBKYW4gMTggMTU6MzU6MjkgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERFVl9TVVBQT1JUKTogIGFkZCBjb25maWd1cmUubWFuLgotCi0JKiBjb25maWcuc3ViKERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMpOiAgYWRkIC1ub25lKi4KLQotRnJpIEphbiAxNyAxNzo1ODowNSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIHJlbW92ZSBmb3JtIGZlZWRzIHRvIG1ha2UgU3VuJ3MgbWFrZSBoYXBweS4KLQkoREVWT19TVVBQT1JUKTogIERPQy5jb25maWd1cmUgPT4gY2ZnLXBhcGVyLnRleGkuCi0KLVNhdCBKYW4gIDQgMTY6MTE6NDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6ICBNYWtlIHF1aWV0ZXIuCi0KLVRodSBKYW4gIDIgMjI6NTc6MTIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBsaWJnKysuCi0JKiBjb25maWd1cmU6ICBXaGVuIHZlcmJvc2UsIGRvbid0IG91dHB1dCB0aGUgY29tbWFuZCBsaW5lIGF0IGVhY2gKLQlsZXZlbDsgaXQgd2lsbCBiZSB1bnJlbWFya2FibHkgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIHZlcnNpb24sCi0Jd2hpY2ggd2lsbCBiZSB0aGUgc2FtZSBhcyB3aGF0IHRoZSB1c2VyIHR5cGVkLgotCi1GcmkgRGVjIDI3IDE2OjI2OjQ3IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBmaXggY2xlYW4taW5mbywgYWRkIGZsZXguICBhZGQKLQkgIGZpbGV1dGlscy4KLQotCSogY29uZmlndXJlOiBiZSBsZXNzIHNlbnNpdGl2ZSB0byBzcGFjZXMgaW4gTWFrZWZpbGUuaW4uICBEbyBub3QKLQkgIGxvb2sgZm9yIHNvdXJjZXMgaW4gIi4uIi4gIERvaW5nIHNvIGJyZWFrcyBzdWJkaXJlY3RvcmllcyB0aGF0Ci0JICBtaWdodCBoYXZlIHRoZWlyIG93biBjb25maWd1cmUuICBJZiBhIHN1YmRpciBoYXMgaXQncyBvd24KLQkgIGNvbmZpZ3VyZSBzY3JpcHQsIHVzZSBpdC4KLQotVGh1IERlYyAyNiAxNjozMDoyNiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogY2ZnLXBhcGVyLnRleGk6IHNvbWUgY2hhbmdlcyBzdWdnZXN0ZWQgYnkgcm1zLgotCi1UaHUgRGVjIDI2IDEwOjEzOjM2IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgTWVyZ2UgaW4gc29tZSBzbWFsbCBhZGRpdGlvbnMgZnJvbSB0aGUgRlNGIHZlcnNpb24sCi0JdGFrZW4gZnJvbSB0aGUgZ2NjIGRpc3RyaWJ1dGlvbiwgdG8gYnJpbmcgdGhlIEN5Z251cyBhbmQgRlNGCi0JdmVyc2lvbnMgaW50byBjbG9zZXIgc3luYy4KLQotRnJpIERlYyAyMCAxMTozNDoxOCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQ2hhbmdlZCBzdnI0IHJlZmVyZW5jZXMgdG8gc3lzdjQuCi0KLVRodSBEZWMgMTkgMTU6NTQ6MjkgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWRkZWQgLVYgZm9yIHZlcnNpb24gbnVtYmVyIG9wdGlvbi4KLQotV2VkIERlYyAxOCAxNTozOTozNCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogRE9DLmNvbmZpZ3VyZSwgY2ZnLXBhcGVyLnRleGk6IHJldmlzZWQsIHVwZGF0ZWQsIGFuZCB0ZXhpbmZvJ2QuCi0JICByZW5hbWVkIGZyb20gRE9DLmNvbmZpZ3VyZSB0byBjZmctcGFwZXIudGV4aS4KLQotTW9uIERlYyAxNiAyMzowNToxOSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLnN1YnIsIGNvbmZpZy5zdWI6IGNvbmZpZy5zdWJyIGlzIG5vdwotCSAgY29uZmlnLnN1YiBhZ2Fpbi4KLQotRnJpIERlYyAxMyAwMToxNzowNiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLnRleGk6IG5ldyBmaWxlLCBpbiBwcm9ncmVzcy4KLQotCSogTWFrZWZpbGUuaW46IGJ1aWxkIGluZm8gZmlsZSBhbmQgaW5zdGFsbCB0aGUgbWFuIHBhZ2UgZm9yCi0JICBjb25maWd1cmUuCi0KLQkqIGNvbmZpZ3VyZS5tYW46IG5ldyBmaWxlLCBmaXJzdCBjdXQuCi0KLQkqIGNvbmZpZ3VyZTogZmluZCBjb25maWcuc3ViciBhZ2FpbiBub3cgdGhhdCBjb25maWd1cmF0aW9uICJub25lIgotCSAgaGFzIGdvbmUuICByZW1vdmVkIGFsbCB0cmFjZXMgb2YgdGhlIC1hbnNpIG9wdGlvbi4gIHJlbW92ZWQgYWxsCi0JICB0cmFjZXMgb2YgdGhlIC1sYW5ndWFnZXMgb3B0aW9uLgotCi0JKiBjb25maWcuc3VicjogcmVzeW5jIGZyb20gcm1zLgotCi1XZWQgRGVjIDExIDIyOjI1OjIwIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLCBjb25maWcuc3ViLCBjb25maWcuc3VicjogbWVyZ2UgY29uZmlnLnN1YiBpbnRvCi0JICBjb25maWcuc3ViciwgY2FsbCB0aGUgcmVzdWx0IGNvbmZpZy5zdWJyLCByZW1vdmUgY29uZmlnLnN1YiwgdXNlCi0JICBjb25maWcuc3Vici4KLQotCSogTWFrZWZpbGUuaW46IHJldmlzZWQgaW5zdGFsbCBmb3IgZGlyLmluZm8uCi0KLVR1ZSBEZWMgMTAgMDA6MDQ6MzUgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCBkZWNzdGF0aW9uIGhvc3QgbWFrZWZpbGUgZnJhZy4KLQotCSogTWFrZWZpbGUuaW46IEJJU09OIG5vdyBiaXNvbiAteSBhZ2Fpbi4gIGFsc28gaW5zdGFsbC1nY2Mgb24KLQkgIGluc3RhbGwuICBjbGVhbi1nZGJtIG9uIGNsZWFuLiAgaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0JICBNYWtlIGRpcmVjdG9yaWVzIGZvciBpbmZvIGluc3RhbGwuICBCdWlsZCBkaXIuaW5mbyBoZXJlIHRoZW4KLQkgIGluc3RhbGwgaXQuCi0KLU1vbiBEZWMgIDkgMTY6NDg6MzMgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZml4IGZvciBiYWQgZGlyZWN0b3J5IHRlc3RzLgotCi1TYXQgRGVjICA3IDAwOjE3OjAxIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBcezEsMlx9IGFwcGVhcnMgdG8gYmUgYSBzeXN2J2lzbS4gIFVzZSBhIGRpZmZlcmVudAotCSAgcmVnZXhwLiAgLXNyY2RpciByZWxhdGl2ZSB3YXMgYmVpbmcgaGFuZGxlZCBpbmNvcnJlY3RseS4KLQotCSogTWFrZWZpbGUuaW46IHVud3JhcHBlZCBzb21lIGZvciBsb29wcyBzbyB0aGF0IHBhcmFsbGVsIG1ha2VzCi0JICB3b3JrIGFnYWluIGFuZCBzbyBvbmUgY2FuIGZvY3VzIG9uZSdzIGF0dGVudGlvbiBvbiBhIHBhcnRpY3VsYXIKLQkgIHBhY2thZ2UuCi0KLUZyaSBEZWMgIDYgMDA6MjI6MDggMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFkZGVkIFBXRCBhcyBhIHN0YW5kIGluIGZvciBgcHdkYCAoZm9yIHNwZWVkKS4gdXNlCi0JICBlbGlmIHdoZXJldmVyIHBvc3NpYmxlLiAgbWFrZSAtc3JjZGlyIHdvcmsgd2l0aG91dCAtb2JqZGlyLgotCSAgLW9iamRpcj0gY29tbWVudGVkIG91dC4KLQotVGh1IERlYyAgNSAyMjo0Njo1MiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogK29wdGlvbnMgYmVjb21lIC0tb3B0aW9ucy4gIC1zdWJkaXJzIGNvbW1lbnRlZCBvdXQuCi0JICBhZGRlZCAtaG9zdCwgLWRhdGFkaXIuICBSZW5hbWVkIC1kZXN0ZGlyIHRvIC1wcmVmaXguICBDb21tZW50IGluCi0JICBNYWtlZmlsZSBub3cgYXQgdG9wIG9mIGdlbmVyYXRlZCBNYWtlZmlsZS4gIFJlbW92ZWQgY3ZzIGxvZwotCSAgZW50cmllcy4gIGFkZGVkIC1zcmNkaXIuICBjcmVhdGUgLmdkYmluaXQgb25seSBpZiB0aGVyZSBpcyBvbmUKLQkgIGluICR7c3JjZGlyfS4KLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotRnJpIE5vdiAyMiAwNzozODoxMSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIEZyZXNobHkgY3JlYXRlZCBDaGFuZ2VMb2cuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzYKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZTM0YTQuLjAwMDAwMDAKLS0tIGEvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxODE4ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGRpcmVjdG9yeSB3aXRoIHN1YmRpcnMgdG8gYnVpbGQuCi0jICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0KLXNyY2RpciA9IC4KLQotcHJlZml4ID0gL3Vzci9sb2NhbAotZXhlY19wcmVmaXggPSAkKHByZWZpeCkKLQotYmluZGlyPSR7ZXhlY19wcmVmaXh9L2Jpbgotc2JpbmRpcj0ke2V4ZWNfcHJlZml4fS9zYmluCi1saWJleGVjZGlyPSR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMKLWRhdGFkaXI9JHtwcmVmaXh9L3NoYXJlCi1zeXNjb25mZGlyPSR7cHJlZml4fS9ldGMKLXNoYXJlZHN0YXRlZGlyPSR7cHJlZml4fS9jb20KLWxvY2Fsc3RhdGVkaXI9JHtwcmVmaXh9L3ZhcgotbGliZGlyPSR7ZXhlY19wcmVmaXh9L2xpYgotaW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQotb2xkaW5jbHVkZWRpcj0vdXNyL2luY2x1ZGUKLWluZm9kaXI9JHtwcmVmaXh9L2luZm8KLW1hbmRpcj0ke3ByZWZpeH0vbWFuCi1neHhfaW5jbHVkZV9kaXI9JHtpbmNsdWRlZGlyfS9nKysKLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0KQotCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0KLQotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1tYW4yZGlyID0gJChtYW5kaXIpL21hbjIKLW1hbjNkaXIgPSAkKG1hbmRpcikvbWFuMwotbWFuNGRpciA9ICQobWFuZGlyKS9tYW40Ci1tYW41ZGlyID0gJChtYW5kaXIpL21hbjUKLW1hbjZkaXIgPSAkKG1hbmRpcikvbWFuNgotbWFuN2RpciA9ICQobWFuZGlyKS9tYW43Ci1tYW44ZGlyID0gJChtYW5kaXIpL21hbjgKLW1hbjlkaXIgPSAkKG1hbmRpcikvbWFuOQotaW5mb2RpciA9ICQocHJlZml4KS9pbmZvCi1pbmNsdWRlZGlyID0gJChwcmVmaXgpL2luY2x1ZGUKLSMgRGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21waWxlciBmaW5kcyBleGVjdXRhYmxlcywgbGlicmFyaWVzLCBldGMuCi1saWJzdWJkaXIgPSAkKGxpYmRpcikvZ2NjLWxpYi8kKHRhcmdldF9hbGlhcykvJChnY2NfdmVyc2lvbikKLUdEQl9OTE1fREVQUyA9IAotCi1TSEVMTCA9IC9iaW4vc2gKLQotIyBJTlNUQUxMX1BST0dSQU1fQVJHUyBpcyBjaGFuZ2VkIGJ5IGNvbmZpZ3VyZS5pbiB0byB1c2UgLXggZm9yIGEKLSMgY3lnd2luIGhvc3QuCi1JTlNUQUxMX1BST0dSQU1fQVJHUyA9Ci0KLUlOU1RBTEwgPSAkKFNIRUxMKSAkJHMvaW5zdGFsbC1zaCAtYwotSU5TVEFMTF9QUk9HUkFNID0gJChJTlNUQUxMKSAkKElOU1RBTExfUFJPR1JBTV9BUkdTKQotSU5TVEFMTF9TQ1JJUFQgPSAkKElOU1RBTEwpCi1JTlNUQUxMX0RBVEEgPSAkKElOU1RBTEwpIC1tIDY0NAotCi1JTlNUQUxMX0RPU1JFTCA9IGluc3RhbGwtZG9zcmVsLWZha2UKLQotQVMgPSBhcwotQVIgPSBhcgotQVJfRkxBR1MgPSByYwotQ0MgPSBjYwotCi0jIFNwZWNpYWwgdmFyaWFibGVzIHBhc3NlZCBkb3duIGluIEVYVFJBX0dDQ19GTEFHUy4gIFRoZXkgYXJlIGRlZmluZWQKLSMgaGVyZSBzbyB0aGF0IHRoZXkgY2FuIGJlIG92ZXJyaWRkZW4gYnkgTWFrZWZpbGUgZnJhZ21lbnRzLgotSE9TVF9DQyA9ICQoQ0NfRk9SX0JVSUxEKQotSE9TVF9QUkVGSVggPSAKLUhPU1RfUFJFRklYXzEgPSBsb3Nlci0KLQotIyBUaGVzZSBmbGFnIHZhbHVlcyBhcmUgbm9ybWFsbHkgb3ZlcnJpZGRlbiBieSB0aGUgY29uZmlndXJlIHNjcmlwdC4KLUNGTEFHUyA9IC1nCi1DWFhGTEFHUyA9IC1nIC1PMgotCi1MREZMQUdTID0gCi1MSUJDRkxBR1MgPSAkKENGTEFHUykKLUNGTEFHU19GT1JfVEFSR0VUID0gJChDRkxBR1MpCi1MREZMQUdTX0ZPUl9UQVJHRVQgPSAKLUxJQkNGTEFHU19GT1JfVEFSR0VUID0gJChDRkxBR1NfRk9SX1RBUkdFVCkKLVBJQ0ZMQUcgPSAKLVBJQ0ZMQUdfRk9SX1RBUkdFVCA9IAotCi1DSElMTEZMQUdTID0gJChDRkxBR1MpCi1DSElMTF9MSUIgPSAtbGNoaWxsCi1DWFggPSBjKysKLQotIyBVc2UgLU8yIHRvIHN0cmVzcyB0ZXN0IHRoZSBjb21waWxlci4KLUxJQkNYWEZMQUdTID0gJChDWFhGTEFHUykgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZXMgLWZleGNlcHRpb25zCi1DWFhGTEFHU19GT1JfVEFSR0VUID0gJChDWFhGTEFHUykKLUxJQkNYWEZMQUdTX0ZPUl9UQVJHRVQgPSAkKENYWEZMQUdTX0ZPUl9UQVJHRVQpIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzIC1mZXhjZXB0aW9ucwotCi1SQU5MSUIgPSByYW5saWIKLQotRExMVE9PTCA9IGRsbHRvb2wKLVdJTkRSRVMgPSB3aW5kcmVzCi0KLU5NID0gbm0KLQotTEQgPSBsZAotCi1CWklQUFJPRyA9IGJ6aXAyCi0KLSMgVGhlc2UgdmFsdWVzIGFyZSBzdWJzdGl0dXRlZCBieSBjb25maWd1cmUuCi1ERUZBVUxUX1lBQ0MgPSB5YWNjCi1ERUZBVUxUX0xFWCA9IGxleAotREVGQVVMVF9NNCA9IG00Ci0KLUJJU09OID0gYGlmIFsgLWYgJCRyL2Jpc29uL2Jpc29uIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYmlzb24vYmlzb24gLUwgJCRzL2Jpc29uLyA7IFwKLQkgZWxzZSBcCi0JICAgIGVjaG8gYmlzb24gOyBcCi0JIGZpYAotCi1ZQUNDID0gYGlmIFsgLWYgJCRyL2Jpc29uL2Jpc29uIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYmlzb24vYmlzb24gLXkgLUwgJCRzL2Jpc29uLyA7IFwKLQllbGlmIFsgLWYgJCRyL2J5YWNjL2J5YWNjIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYnlhY2MvYnlhY2MgOyBcCi0JZWxzZSBcCi0JICAgIGVjaG8gJHtERUZBVUxUX1lBQ0N9IDsgXAotCWZpYAotCi1MRVggPSBgaWYgWyAtZiAkJHIvZmxleC9mbGV4IF0gOyBcCi0JdGhlbiBlY2hvICQkci9mbGV4L2ZsZXggOyBcCi0JZWxzZSBlY2hvICR7REVGQVVMVF9MRVh9IDsgZmlgCi0KLU00ID0gYGlmIFsgLWYgJCRyL200L200IF0gOyBcCi0JdGhlbiBlY2hvICQkci9tNC9tNCA7IFwKLQllbHNlIGVjaG8gJHtERUZBVUxUX000fSA7IGZpYAotCi1NQUtFSU5GTyA9IGBpZiBbIC1mICQkci90ZXhpbmZvL21ha2VpbmZvL01ha2VmaWxlIF0gOyBcCi0JdGhlbiBlY2hvICQkci90ZXhpbmZvL21ha2VpbmZvL21ha2VpbmZvIDsgXAotCWVsc2UgZWNobyBtYWtlaW5mbyA7IGZpYAotCi0jIFRoaXMganVzdCBiZWNvbWVzIHBhcnQgb2YgdGhlIE1BS0VJTkZPIGRlZmluaXRpb24gcGFzc2VkIGRvd24gdG8KLSMgc3ViLW1ha2VzLiAgSXQgbGV0cyBmbGFncyBiZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIHdoaWxlIHN0aWxsCi0jIHVzaW5nIHRoZSBtYWtlaW5mbyBmcm9tIHRoZSBvYmplY3QgdHJlZS4KLU1BS0VJTkZPRkxBR1MgPQotCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHIvZXhwZWN0L2V4cGVjdCBdIDsgXAotCXRoZW4gZWNobyAkJHIvZXhwZWN0L2V4cGVjdCA7IFwKLQllbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLVJVTlRFU1QgPSBgaWYgWyAtZiAkJHMvZGVqYWdudS9ydW50ZXN0IF0gOyBcCi0JdGhlbiBlY2hvICQkcy9kZWphZ251L3J1bnRlc3QgOyBcCi0JZWxzZSBlY2hvIHJ1bnRlc3QgOyBmaWAKLQotCi0jIGNvbXBpbGVycyB0byB1c2UgdG8gY3JlYXRlIHByb2dyYW1zIHdoaWNoIG11c3QgYmUgcnVuIGluIHRoZSBidWlsZAotIyBlbnZpcm9ubWVudC4KLUNDX0ZPUl9CVUlMRCA9ICQoQ0MpCi1DWFhfRk9SX0JVSUxEID0gJChDWFgpCi0KLVNVQkRJUlMgPSAidGhpcyBpcyBzZXQgdmlhIGNvbmZpZ3VyZSwgZG9uJ3QgZWRpdCB0aGlzIgotT1RIRVJTID0gCi0KLSMgVGhpcyBpcyBzZXQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hpY2gKLSMgc2hvdWxkIGJlIGJ1aWx0IHVzaW5nIHRoZSB0YXJnZXQgdG9vbHMuCi0KLQotVEFSR0VUX0NPTkZJR0RJUlMgPSBsaWJpYmVydHkgbGliZ2xvc3MgJChTUEVDSUFMX0xJQlMpIG5ld2xpYiBsaWJpbyBsaWJyeCBsaWJzdGRjKysgbGliZysrIHdpbnN1cCBvcGNvZGVzIGJzcCBsaWJzdHViIGN5Z21vbgotCi0jIFRhcmdldCBsaWJyYXJpZXMgYXJlIHB1dCB1bmRlciB0aGlzIGRpcmVjdG9yeToKLSMgQ2hhbmdlZCBieSBjb25maWd1cmUgdG8gJCh0YXJnZXRfYWxpYXMpIGlmIGNyb3NzLgotVEFSR0VUX1NVQkRJUiA9IC4KLQotIyBUaGlzIGlzIHNldCBieSB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBjb25maWd1cmUuCi1DT05GSUdfQVJHVU1FTlRTID0gCi0KLSMgVGhpcyBpcyBzZXQgYnkgY29uZmlndXJlIHRvIFJFQUxMWV9TRVRfTElCX1BBVEggaWYgLS1lbmFibGUtc2hhcmVkCi0jIHdhcyB1c2VkLgotU0VUX0xJQl9QQVRIID0KLQotIyBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB1c2VkIGZvciB0aGUgcGF0aCB0bwotIyB0aGUgbGlicmFyaWVzLiAgVGhpcyBtYXkgYmUgY2hhbmdlZCBieSBjb25maWd1cmUuaW4uCi1SUEFUSF9FTlZWQVIgPSBMRF9MSUJSQVJZX1BBVEgKLQotIyBjb25maWd1cmUuaW4gc2V0cyBTRVRfTElCX1BBVEggdG8gdGhpcyBpZiAtLWVuYWJsZS1zaGFyZWQgd2FzIHVzZWQuCi1SRUFMTFlfU0VUX0xJQl9QQVRIID0gXAotICBpZiBbIHgiJCQkKFJQQVRIX0VOVlZBUikiICE9IHggXTsgdGhlbiBcCi0gICAgJChSUEFUSF9FTlZWQVIpPSQkci9iZmQ6JCRyL29wY29kZXM6JCQkKFJQQVRIX0VOVlZBUik7IFwKLSAgZWxzZSBcCi0gICAgJChSUEFUSF9FTlZWQVIpPSQkci9iZmQ6JCRyL29wY29kZXM7IFwKLSAgZmk7IFwKLSAgZXhwb3J0ICQoUlBBVEhfRU5WVkFSKTsKLQotQUxMID0gYWxsLm5vcm1hbAotSU5TVEFMTF9UQVJHRVQgPSBpbnN0YWxsZGlycyBcCi0JaW5zdGFsbC1nY2MgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX0RPU1JFTCkKLQotSU5TVEFMTF9UQVJHRVRfQ1JPU1MgPSBpbnN0YWxsZGlycyBcCi0JaW5zdGFsbC1nY2MtY3Jvc3MgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX0RPU1JFTCkKLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgY2FzZSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgaW4gXAotICAgICAgICBpWzM0NTZdODYtKi1jeWd3aW4qKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtQiQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi8gLUwkJHIvJChUQVJHRVRfU1VCRElSKS93aW5zdXAgLWlkaXJhZnRlciAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL3dpbnN1cC9pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvc3lzL2N5Z3dpbiAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luMzIgLW5vc3RkaW5jOyBcCi0gICAgICAgICAgOzsgXAotICAgICAgICAqKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtaWRpcmFmdGVyICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLQkgIDs7IFwKLSAgICAgIGVzYWMgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBnY2MgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLSMgSWYgQ0NfRk9SX1RBUkdFVCBpcyBub3Qgb3ZlcnJpZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZW4gdGhpcwotIyB2YXJpYWJsZSBpcyBwYXNzZWQgZG93biB0byB0aGUgZ2NjIE1ha2VmaWxlLCB3aGVyZSBpdCBpcyB1c2VkIHRvCi0jIGJ1aWxkIGxpYmdjYzIuYS4gIFdlIGRlZmluZSBpdCBoZXJlIHNvIHRoYXQgaXQgY2FuIGl0c2VsZiBiZQotIyBvdmVycmlkZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1HQ0NfRk9SX1RBUkdFVCA9ICQkci9nY2MveGdjYyAtQiQkci9nY2MvCi0KLUNISUxMX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGVjaG8gJCRyL2djYy94Z2NjIC1CJCRyL2djYy8gLUwkJHIvZ2NjL2NoL3J1bnRpbWUvOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBnY2MgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUNYWF9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBjYXNlICIkKHRhcmdldF9jYW5vbmljYWwpIiBpbiBcCi0gICAgICAgIGlbMzQ1Nl04Ni0qLWN5Z3dpbiopIFwKLSAgICAgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1CJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliLyAtTCQkci8kKFRBUkdFVF9TVUJESVIpL3dpbnN1cCAtaWRpcmFmdGVyICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHMvd2luc3VwL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL3N5cy9jeWd3aW4zMiAtbm9zdGRpbmM7IFwKLSAgICAgICAgICA7OyBcCi0gICAgICAgICopIFwKLSAgICAgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1pZGlyYWZ0ZXIgJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotCSAgOzsgXAotICAgICAgZXNhYyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDWFgpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBjKysgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUFTX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvZ2FzL2FzLW5ldyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvZ2FzL2FzLW5ldyA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChBUyk7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBhcyB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUxEX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvbGQvbGQtbmV3IF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9sZC9sZC1uZXcgOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoTEQpOyBcCi0gICAgZWxzZSBcCi0gICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gbGQgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1ETExUT09MX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvYmludXRpbHMvZGxsdG9vbCBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvZGxsdG9vbCA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChETExUT09MKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGRsbHRvb2wgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1XSU5EUkVTX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvYmludXRpbHMvd2luZHJlcyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvd2luZHJlcyA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChXSU5EUkVTKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIHdpbmRyZXMgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1BUl9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL2FyIF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9iaW51dGlscy9hciA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChBUik7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBhciB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLVJBTkxJQl9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL3JhbmxpYiBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvcmFubGliIDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKFJBTkxJQik7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyByYW5saWIgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1OTV9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL25tLW5ldyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvbm0tbmV3IDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKE5NKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIG5tIHwgc2VkIC1lICdzL3gveC8nICQkdCA7IFwKLSAgICBmaTsgXAotICBmaWAKLQotIyBUaGUgZmlyc3QgcnVsZSBpbiB0aGUgZmlsZSBoYWQgYmV0dGVyIGJlIHRoaXMgb25lLiAgRG9uJ3QgcHV0IGFueSBhYm92ZSBpdC4KLSMgVGhpcyBsaXZlcyBoZXJlIHRvIGFsbG93IG1ha2VmaWxlIGZyYWdtZW50cyB0byBjb250YWluIGRlcGVuZGVuY2llcy4KLWFsbDogYWxsLm5vcm1hbAotLlBIT05ZOiBhbGwKLQotIyBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBjb25maWcvbXQtKi4KLSMgVGhlIF9UQVJHRVRfIGlzIGJlY2F1c2UgdGhleSdyZSBzcGVjaWZpZWQgaW4gbXQtZm9vLgotIyBUaGUgX0hPU1RfIGlzIGJlY2F1c2UgdGhleSdyZSBwcm9ncmFtcyB0aGF0IHJ1biBvbiB0aGUgaG9zdC4KLUVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTID0KLUVYVFJBX1RBUkdFVF9IT1NUX0lOU1RBTExfTU9EVUxFUyA9Ci1FWFRSQV9UQVJHRVRfSE9TVF9DSEVDS19NT0RVTEVTID0KLQotIyMjIyBob3N0IGFuZCB0YXJnZXQgc3BlY2lmaWMgbWFrZWZpbGUgZnJhZ21lbnRzIGNvbWUgaW4gaGVyZS4KLSMjIwotCi0jIEZsYWdzIHRvIHBhc3MgZG93biB0byBhbGwgc3ViLW1ha2VzLgotIyBQbGVhc2Uga2VlcCB0aGVzZSBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi1CQVNFX0ZMQUdTX1RPX1BBU1MgPSBcCi0JIkFSX0ZMQUdTPSQoQVJfRkxBR1MpIiBcCi0JIkFSX0ZPUl9UQVJHRVQ9JChBUl9GT1JfVEFSR0VUKSIgXAotCSJBU19GT1JfVEFSR0VUPSQoQVNfRk9SX1RBUkdFVCkiIFwKLQkiQklTT049JChCSVNPTikiIFwKLQkiQ0NfRk9SX0JVSUxEPSQoQ0NfRk9SX0JVSUxEKSIgXAotCSJDQ19GT1JfVEFSR0VUPSQoQ0NfRk9SX1RBUkdFVCkiIFwKLQkiQ0ZMQUdTPSQoQ0ZMQUdTKSIgXAotCSJDRkxBR1NfRk9SX1RBUkdFVD0kKENGTEFHU19GT1JfVEFSR0VUKSIgXAotCSJDSElMTEZMQUdTPSQoQ0hJTExGTEFHUykiIFwKLQkiQ0hJTExfRk9SX1RBUkdFVD0kKENISUxMX0ZPUl9UQVJHRVQpIiBcCi0JIkNISUxMX0xJQj0kKENISUxMX0xJQikiIFwKLQkiQ1hYX0ZPUl9CVUlMRD0kKENYWF9GT1JfQlVJTEQpIiBcCi0JIkNYWEZMQUdTPSQoQ1hYRkxBR1MpIiBcCi0JIkNYWEZMQUdTX0ZPUl9UQVJHRVQ9JChDWFhGTEFHU19GT1JfVEFSR0VUKSIgXAotCSJDWFhfRk9SX1RBUkdFVD0kKENYWF9GT1JfVEFSR0VUKSIgXAotCSJETExUT09MX0ZPUl9UQVJHRVQ9JChETExUT09MX0ZPUl9UQVJHRVQpIiBcCi0JIklOU1RBTEw9JChJTlNUQUxMKSIgXAotCSJJTlNUQUxMX0RBVEE9JChJTlNUQUxMX0RBVEEpIiBcCi0JIklOU1RBTExfUFJPR1JBTT0kKElOU1RBTExfUFJPR1JBTSkiIFwKLQkiSU5TVEFMTF9TQ1JJUFQ9JChJTlNUQUxMX1NDUklQVCkiIFwKLQkiTERGTEFHUz0kKExERkxBR1MpIiBcCi0JIkxFWD0kKExFWCkiIFwKLQkiTERfRk9SX1RBUkdFVD0kKExEX0ZPUl9UQVJHRVQpIiBcCi0JIkxJQkNGTEFHUz0kKExJQkNGTEFHUykiIFwKLQkiTElCQ0ZMQUdTX0ZPUl9UQVJHRVQ9JChMSUJDRkxBR1NfRk9SX1RBUkdFVCkiIFwKLQkiTElCQ1hYRkxBR1M9JChMSUJDWFhGTEFHUykiIFwKLQkiTElCQ1hYRkxBR1NfRk9SX1RBUkdFVD0kKExJQkNYWEZMQUdTX0ZPUl9UQVJHRVQpIiBcCi0JIk00PSQoTTQpIiBcCi0JIk1BS0U9JChNQUtFKSIgXAotCSJNQUtFSU5GTz0kKE1BS0VJTkZPKSAkKE1BS0VJTkZPRkxBR1MpIiBcCi0JIk5NX0ZPUl9UQVJHRVQ9JChOTV9GT1JfVEFSR0VUKSIgXAotCSJSQU5MSUJfRk9SX1RBUkdFVD0kKFJBTkxJQl9GT1JfVEFSR0VUKSIgXAotCSJSUEFUSF9FTlZWQVI9JChSUEFUSF9FTlZWQVIpIiBcCi0JIlNIRUxMPSQoU0hFTEwpIiBcCi0JIkVYUEVDVD0kKEVYUEVDVCkiIFwKLQkiUlVOVEVTVD0kKFJVTlRFU1QpIiBcCi0JIlJVTlRFU1RGTEFHUz0kKFJVTlRFU1RGTEFHUykiIFwKLQkiVEFSR0VUX1NVQkRJUj0kKFRBUkdFVF9TVUJESVIpIiBcCi0JIldJTkRSRVNfRk9SX1RBUkdFVD0kKFdJTkRSRVNfRk9SX1RBUkdFVCkiIFwKLQkiWUFDQz0kKFlBQ0MpIiBcCi0JImJpbmRpcj0kKGJpbmRpcikiIFwKLQkiZGF0YWRpcj0kKGRhdGFkaXIpIiBcCi0JImV4ZWNfcHJlZml4PSQoZXhlY19wcmVmaXgpIiBcCi0JImluY2x1ZGVkaXI9JChpbmNsdWRlZGlyKSIgXAotCSJpbmZvZGlyPSQoaW5mb2RpcikiIFwKLQkibGliZGlyPSQobGliZGlyKSIgXAotCSJsaWJleGVjZGlyPSQobGliZXhlY2RpcikiIFwKLQkibGlzcGRpcj0kKGxpc3BkaXIpIiBcCi0JImxvY2Fsc3RhdGVkaXI9JChsb2NhbHN0YXRlZGlyKSIgXAotCSJtYW5kaXI9JChtYW5kaXIpIiBcCi0JIm9sZGluY2x1ZGVkaXI9JChvbGRpbmNsdWRlZGlyKSIgXAotCSJwcmVmaXg9JChwcmVmaXgpIiBcCi0JInNiaW5kaXI9JChzYmluZGlyKSIgXAotCSJzaGFyZWRzdGF0ZWRpcj0kKHNoYXJlZHN0YXRlZGlyKSIgXAotCSJzeXNjb25mZGlyPSQoc3lzY29uZmRpcikiIFwKLQkidG9vbGRpcj0kKHRvb2xkaXIpIiBcCi0JImd4eF9pbmNsdWRlX2Rpcj0kKGd4eF9pbmNsdWRlX2RpcikiIFwKLQkiZ2NjX3ZlcnNpb249JChnY2NfdmVyc2lvbikiIFwKLQkiZ2NjX3ZlcnNpb25fdHJpZ2dlcj0kKGdjY192ZXJzaW9uX3RyaWdnZXIpIiBcCi0JInRhcmdldF9hbGlhcz0kKHRhcmdldF9hbGlhcykiIFwKLQkibGlic3ViZGlyPSQobGlic3ViZGlyKSIKLQotIyBGbGFncyB0byBwYXNzIGRvd24gdG8gbW9zdCBzdWItbWFrZXMsIGluIHdoaWNoIHdlJ3JlIGJ1aWxkaW5nIHdpdGgKLSMgdGhlIGhvc3QgZW52aXJvbm1lbnQuCi0jIElmIGFueSB2YXJpYWJsZXMgYXJlIGFkZGVkIGhlcmUsIHRoZXkgbXVzdCBiZSBhZGRlZCB0byBkby0qLCBiZWxvdy4KLUVYVFJBX0hPU1RfRkxBR1MgPSBcCi0JJ0FSPSQoQVIpJyBcCi0JJ0FTPSQoQVMpJyBcCi0JJ0NDPSQoQ0MpJyBcCi0JJ0NYWD0kKENYWCknIFwKLQknRExMVE9PTD0kKERMTFRPT0wpJyBcCi0JJ0xEPSQoTEQpJyBcCi0JJ05NPSQoTk0pJyBcCi0JJ1JBTkxJQj0kKFJBTkxJQiknIFwKLQknV0lORFJFUz0kKFdJTkRSRVMpJwotCi1GTEFHU19UT19QQVNTID0gJChCQVNFX0ZMQUdTX1RPX1BBU1MpICQoRVhUUkFfSE9TVF9GTEFHUykKLQotIyBGbGFncyB0aGF0IGFyZSBjb25jZXJuZWQgd2l0aCB0aGUgbG9jYXRpb24gb2YgdGhlIFgxMSBpbmNsdWRlIGZpbGVzCi0jIGFuZCBsaWJyYXJ5IGZpbGVzCi0jCi0jIE5PVEU6IHVudGlsIHRoZSB0b3AtbGV2ZWwgaXMgZ2V0dGluZyB0aGUgdmFsdWVzIHZpYSBhdXRvY29uZiwgaXQgb25seQotIyBjYXVzZXMgcHJvYmxlbXMgdG8gaGF2ZSB0aGlzIHRvcC1sZXZlbCBNYWtlZmlsZSBvdmVycmlkaW5nIHRoZSBhdXRvY29uZi1zZXQKLSMgdmFsdWVzIGluIGNoaWxkIGRpcmVjdG9yaWVzLiAgT25seSB2YXJpYWJsZXMgdGhhdCBkb24ndCBjb25mbGljdCB3aXRoCi0jIGF1dG9jb25mJ2VkIG9uZXMgc2hvdWxkIGJlIHBhc3NlZCBieSBYMTFfRkxBR1NfVE9fUEFTUyBmb3Igbm93LgotIwotWDExX0ZMQUdTX1RPX1BBU1MgPSBcCi0JJ1gxMV9FWFRSQV9DRkxBR1M9JChYMTFfRVhUUkFfQ0ZMQUdTKScgXAotCSdYMTFfRVhUUkFfTElCUz0kKFgxMV9FWFRSQV9MSUJTKScKLQotIyBGbGFncyB0byBwYXNzIGRvd24gdG8gbWFrZXMgd2hpY2ggYXJlIGJ1aWx0IHdpdGggdGhlIHRhcmdldCBlbnZpcm9ubWVudC4KLSMgVGhlIGRvdWJsZSAkIGRlY3JlYXNlcyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGxpbmU7IHRoZSB2YXJpYWJsZXMKLSMgYXJlIHNldCBpbiBCQVNFX0ZMQUdTX1RPX1BBU1MsIGFuZCB0aGUgc3ViLW1ha2Ugd2lsbCBleHBhbmQgdGhlbS4KLSMgSWYgYW55IHZhcmlhYmxlcyBhcmUgYWRkZWQgaGVyZSwgdGhleSBtdXN0IGJlIGFkZGVkIHRvIGRvLSosIGJlbG93LgotRVhUUkFfVEFSR0VUX0ZMQUdTID0gXAotCSdBUj0kJChBUl9GT1JfVEFSR0VUKScgXAotCSdBUz0kJChBU19GT1JfVEFSR0VUKScgXAotCSdDQz0kJChDQ19GT1JfVEFSR0VUKScgXAotCSdDRkxBR1M9JCQoQ0ZMQUdTX0ZPUl9UQVJHRVQpJyBcCi0JJ0NYWD0kJChDWFhfRk9SX1RBUkdFVCknIFwKLQknQ1hYRkxBR1M9JCQoQ1hYRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknRExMVE9PTD0kJChETExUT09MX0ZPUl9UQVJHRVQpJyBcCi0JJ0xEPSQkKExEX0ZPUl9UQVJHRVQpJyBcCi0JJ0xJQkNGTEFHUz0kJChMSUJDRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknTElCQ1hYRkxBR1M9JCQoTElCQ1hYRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknTk09JCQoTk1fRk9SX1RBUkdFVCknIFwKLQknUkFOTElCPSQkKFJBTkxJQl9GT1JfVEFSR0VUKScgXAotCSdXSU5EUkVTPSQkKFdJTkRSRVNfRk9SX1RBUkdFVCknCi0KLVRBUkdFVF9GTEFHU19UT19QQVNTID0gJChCQVNFX0ZMQUdTX1RPX1BBU1MpICQoRVhUUkFfVEFSR0VUX0ZMQUdTKQotCi0jIEZsYWdzIHRvIHBhc3MgZG93biB0byBnY2MuICBnY2MgYnVpbGRzIGEgbGlicmFyeSwgbGliZ2NjLmEsIHNvIGl0Ci0jIHVuZm9ydHVuYXRlbHkgbmVlZHMgdGhlIG5hdGl2ZSBjb21waWxlciBhbmQgdGhlIHRhcmdldCBhciBhbmQKLSMgcmFubGliLgotIyBJZiBhbnkgdmFyaWFibGVzIGFyZSBhZGRlZCBoZXJlLCB0aGV5IG11c3QgYmUgYWRkZWQgdG8gZG8tKiwgYmVsb3cuCi0jIFRoZSBIT1NUXyogdmFyaWFibGVzIGFyZSBhIHNwZWNpYWwgY2FzZSwgd2hpY2ggYXJlIHVzZWQgZm9yIHRoZSBnY2MKLSMgY3Jvc3MtYnVpbGRpbmcgc2NoZW1lLgotRVhUUkFfR0NDX0ZMQUdTID0gXAotCSdBUj0kKEFSKScgXAotCSdBUz0kKEFTKScgXAotCSdDQz0kKENDKScgXAotCSdDWFg9JChDWFgpJyBcCi0JJ0RMTFRPT0w9JCQoRExMVE9PTF9GT1JfVEFSR0VUKScgXAotCSdIT1NUX0NDPSQoQ0NfRk9SX0JVSUxEKScgXAotCSdIT1NUX1BSRUZJWD0kKEhPU1RfUFJFRklYKScgXAotCSdIT1NUX1BSRUZJWF8xPSQoSE9TVF9QUkVGSVhfMSknIFwKLQknTk09JChOTSknIFwKLQknUkFOTElCPSQoUkFOTElCKScgXAotCSdXSU5EUkVTPSQkKFdJTkRSRVNfRk9SX1RBUkdFVCknIFwKLQkiR0NDX0ZPUl9UQVJHRVQ9JChHQ0NfRk9SX1RBUkdFVCkiIFwKLQkiYGVjaG8gJ0xBTkdVQUdFUz0kKExBTkdVQUdFUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnU1RNUF9GSVhQUk9UTz0kKFNUTVBfRklYUFJPVE8pJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJTUlUU19IX1RFU1Q9JChMSU1JVFNfSF9URVNUKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdMSUJHQ0MxX1RFU1Q9JChMSUJHQ0MxX1RFU1QpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfQ0ZMQUdTPSQoTElCR0NDMl9DRkxBR1MpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfREVCVUdfQ0ZMQUdTPSQoTElCR0NDMl9ERUJVR19DRkxBR1MpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfSU5DTFVERVM9JChMSUJHQ0MyX0lOQ0xVREVTKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdFTlFVSVJFPSQoRU5RVUlSRSknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnQk9PVF9DRkxBR1M9JChCT09UX0NGTEFHUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIKLQotR0NDX0ZMQUdTX1RPX1BBU1MgPSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgJChFWFRSQV9HQ0NfRkxBR1MpCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUgY29tcGlsZWQKLSMgdXNpbmcgJChGTEFHU19UT19QQVNTKS4KLUFMTF9NT0RVTEVTID0gXAotCWFsbC1hcGFjaGUgXAotCWFsbC1hc2ggXAotCWFsbC1hdXRvY29uZiBcCi0JYWxsLWF1dG9tYWtlIFwKLQlhbGwtYmFzaCBcCi0JYWxsLWJmZCBcCi0JYWxsLWJpbnV0aWxzIFwKLQlhbGwtYmlzb24gXAotCWFsbC1ieWFjYyBcCi0JYWxsLWJ6aXAyIFwKLQlhbGwtY3Zzc3JjIFwKLQlhbGwtZGIgXAotCWFsbC1kZWphZ251IFwKLQlhbGwtZGlmZiBcCi0JYWxsLWRvc3V0aWxzIFwKLQlhbGwtZXRjIFwKLQlhbGwtZmlsZXV0aWxzIFwKLQlhbGwtZmluZHV0aWxzIFwKLQlhbGwtZmluZCBcCi0JYWxsLWZsZXggXAotCWFsbC1nYXMgXAotCWFsbC1nYXdrIFwKLQlhbGwtZ2V0dGV4dCBcCi0JYWxsLWdudXNlcnYgXAotCWFsbC1ncHJvZiBcCi0JYWxsLWdyZXAgXAotCWFsbC1ncmV6IFwKLQlhbGwtZ3ppcCBcCi0JYWxsLWhlbGxvIFwKLQlhbGwtaW5kZW50IFwKLQlhbGwtaW5ldCBcCi0JYWxsLWludGwgXAotCWFsbC1pc3BlbGwgXAotCWFsbC1pdGNsIFwKLQlhbGwtbGQgXAotCWFsbC1saWJndWkgXAotCWFsbC1saWJpYmVydHkgXAotCWFsbC1saWJ0b29sIFwKLQlhbGwtbTQgXAotCWFsbC1tYWtlIFwKLQlhbGwtbW1hbGxvYyBcCi0JYWxsLW9wY29kZXMgXAotCWFsbC1wYXRjaCBcCi0JYWxsLXBlcmwgXAotCWFsbC1wcm1zIFwKLQlhbGwtcmNzIFwKLQlhbGwtcmVhZGxpbmUgXAotCWFsbC1yZWxlYXNlIFwKLQlhbGwtcmVjb2RlIFwKLQlhbGwtc2VkIFwKLQlhbGwtc2VuZC1wciBcCi0JYWxsLXNoZWxsdXRpbHMgXAotCWFsbC1zaW0gXAotCWFsbC10YXIgXAotCWFsbC10Y2wgXAotCWFsbC10Y2w4LjEgXAotCWFsbC10ZXhpbmZvIFwKLQlhbGwtdGV4dHV0aWxzIFwKLQlhbGwtdGdhcyBcCi0JYWxsLXRpbWUgXAotCWFsbC11dWRlY29kZSBcCi0JYWxsLXdkaWZmIFwKLQlhbGwtemlwIFwKLQkkKEVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTKQotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjaGVjayB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoRkxBR1NfVE9fUEFTUykuCi0jCi0jIFRoZSBsaXN0IGlzIGluIHR3byBwYXJ0cy4gIFRoZSBmaXJzdCBsaXN0cyB0aG9zZSB0b29scyB3aGljaAotIyBhcmUgdGVzdGVkIGFzIHBhcnQgb2YgdGhlIGhvc3QncyBuYXRpdmUgdG9vbC1jaGFpbiwgYW5kIG5vdAotIyB0ZXN0ZWQgaW4gYSBjcm9zcyBjb25maWd1cmF0aW9uLgotTkFUSVZFX0NIRUNLX01PRFVMRVMgPSBcCi0JY2hlY2stYmlzb24gXAotCWNoZWNrLWJ5YWNjIFwKLQljaGVjay1mbGV4IFwKLQljaGVjay16aXAKLQotQ1JPU1NfQ0hFQ0tfTU9EVUxFUyA9IFwKLQljaGVjay1hcGFjaGUgXAotCWNoZWNrLWFzaCBcCi0JY2hlY2stYXV0b2NvbmYgXAotCWNoZWNrLWF1dG9tYWtlIFwKLQljaGVjay1iYXNoIFwKLQljaGVjay1iZmQgXAotCWNoZWNrLWJpbnV0aWxzIFwKLQljaGVjay1iemlwMiBcCi0JY2hlY2stY3Zzc3JjIFwKLQljaGVjay1kYiBcCi0JY2hlY2stZGVqYWdudSBcCi0JY2hlY2stZGlmZiBcCi0JY2hlY2stZXRjIFwKLQljaGVjay1maWxldXRpbHMgXAotCWNoZWNrLWZpbmR1dGlscyBcCi0JY2hlY2stZmluZCBcCi0JY2hlY2stZ2FzIFwKLQljaGVjay1nYXdrIFwKLQljaGVjay1nZXR0ZXh0IFwKLQljaGVjay1nbnVzZXJ2IFwKLQljaGVjay1ncHJvZiBcCi0JY2hlY2stZ3JlcCBcCi0JY2hlY2stZ3ppcCBcCi0JY2hlY2staGVsbG8gXAotCWNoZWNrLWluZGVudCBcCi0JY2hlY2staW5ldCBcCi0JY2hlY2staW50bCBcCi0JY2hlY2staXNwZWxsIFwKLQljaGVjay1pdGNsIFwKLQljaGVjay1sZCBcCi0JY2hlY2stbGliZ3VpIFwKLQljaGVjay1saWJpYmVydHkgXAotCWNoZWNrLWxpYnRvb2wgXAotCWNoZWNrLW00IFwKLQljaGVjay1tYWtlIFwKLQljaGVjay1tbWNoZWNrb2MgXAotCWNoZWNrLW9wY29kZXMgXAotCWNoZWNrLXBhdGNoIFwKLQljaGVjay1wZXJsIFwKLQljaGVjay1wcm1zIFwKLQljaGVjay1yY3MgXAotCWNoZWNrLXJlYWRsaW5lIFwKLQljaGVjay1yZWNvZGUgXAotCWNoZWNrLXNlZCBcCi0JY2hlY2stc2VuZC1wciBcCi0JY2hlY2stc2hlbGx1dGlscyBcCi0JY2hlY2stc2ltIFwKLQljaGVjay10YXIgXAotCWNoZWNrLXRjbCBcCi0JY2hlY2stdGV4aW5mbyBcCi0JY2hlY2stdGV4dHV0aWxzIFwKLQljaGVjay10Z2FzIFwKLQljaGVjay10aW1lIFwKLQljaGVjay11dWRlY29kZSBcCi0JY2hlY2std2RpZmYgXAotCSQoRVhUUkFfVEFSR0VUX0hPU1RfQ0hFQ0tfTU9EVUxFUykKLQotQ0hFQ0tfTU9EVUxFUz0kKE5BVElWRV9DSEVDS19NT0RVTEVTKSAkKENST1NTX0NIRUNLX01PRFVMRVMpCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGluc3RhbGwgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKEZMQUdTX1RPX1BBU1MpLgotIyBXZSBwdXQgaW5zdGFsbC1vcGNvZGVzIGJlZm9yZSBpbnN0YWxsLWJpbnV0aWxzIGJlY2F1c2UgdGhlIGluc3RhbGxlZAotIyBiaW51dGlscyBtaWdodCBiZSBvbiBQQVRILCBhbmQgdGhleSBtaWdodCBuZWVkIHRoZSBzaGFyZWQgb3Bjb2RlcwotIyBsaWJyYXJ5LgotIyBXZSBwdXQgaW5zdGFsbC10Y2wgYmVmb3JlIGluc3RhbGwtaXRjbCBiZWNhdXNlIGl0Y2wgd2FudHMgdG8gcnVuIGEKLSMgcHJvZ3JhbSBvbiBpbnN0YWxsYXRpb24gd2hpY2ggdXNlcyB0aGUgVGNsIGxpYnJhcmllcy4KLUlOU1RBTExfTU9EVUxFUyA9IFwKLQlpbnN0YWxsLWFwYWNoZSBcCi0JaW5zdGFsbC1hc2ggXAotCWluc3RhbGwtYXV0b2NvbmYgXAotCWluc3RhbGwtYXV0b21ha2UgXAotCWluc3RhbGwtYmFzaCBcCi0JaW5zdGFsbC1iZmQgXAotCWluc3RhbGwtYnppcDIgXAotCWluc3RhbGwtb3Bjb2RlcyBcCi0JaW5zdGFsbC1iaW51dGlscyBcCi0JaW5zdGFsbC1iaXNvbiBcCi0JaW5zdGFsbC1ieWFjYyBcCi0JaW5zdGFsbC1jdnNzcmMgXAotCWluc3RhbGwtZGIgXAotCWluc3RhbGwtZGVqYWdudSBcCi0JaW5zdGFsbC1kaWZmIFwKLQlpbnN0YWxsLWRvc3V0aWxzIFwKLQlpbnN0YWxsLWV0YyBcCi0JaW5zdGFsbC1maWxldXRpbHMgXAotCWluc3RhbGwtZmluZHV0aWxzIFwKLQlpbnN0YWxsLWZpbmQgXAotCWluc3RhbGwtZmxleCBcCi0JaW5zdGFsbC1nYXMgXAotCWluc3RhbGwtZ2F3ayBcCi0JaW5zdGFsbC1nZXR0ZXh0IFwKLQlpbnN0YWxsLWdudXNlcnYgXAotCWluc3RhbGwtZ3Byb2YgXAotCWluc3RhbGwtZ3JlcCBcCi0JaW5zdGFsbC1ncmV6IFwKLQlpbnN0YWxsLWd6aXAgXAotCWluc3RhbGwtaGVsbG8gXAotCWluc3RhbGwtaW5kZW50IFwKLQlpbnN0YWxsLWluZXQgXAotCWluc3RhbGwtaW50bCBcCi0JaW5zdGFsbC1pc3BlbGwgXAotCWluc3RhbGwtdGNsIFwKLQlpbnN0YWxsLXRjbDguMSBcCi0JaW5zdGFsbC1pdGNsIFwKLQlpbnN0YWxsLWxkIFwKLQlpbnN0YWxsLWxpYmd1aSBcCi0JaW5zdGFsbC1saWJpYmVydHkgXAotCWluc3RhbGwtbGlidG9vbCBcCi0JaW5zdGFsbC1tNCBcCi0JaW5zdGFsbC1tYWtlIFwKLQlpbnN0YWxsLW1tYWxsb2MgXAotCWluc3RhbGwtcGF0Y2ggXAotCWluc3RhbGwtcGVybCBcCi0JaW5zdGFsbC1wcm1zIFwKLQlpbnN0YWxsLXJjcyBcCi0JaW5zdGFsbC1yZWFkbGluZSBcCi0JaW5zdGFsbC1yZWNvZGUgXAotCWluc3RhbGwtc2VkIFwKLQlpbnN0YWxsLXNlbmQtcHIgXAotCWluc3RhbGwtc2hlbGx1dGlscyBcCi0JaW5zdGFsbC1zaW0gXAotCWluc3RhbGwtdGFyIFwKLQlpbnN0YWxsLXRleGluZm8gXAotCWluc3RhbGwtdGV4dHV0aWxzIFwKLQlpbnN0YWxsLXRnYXMgXAotCWluc3RhbGwtdGltZSBcCi0JaW5zdGFsbC11dWRlY29kZSBcCi0JaW5zdGFsbC13ZGlmZiBcCi0JaW5zdGFsbC16aXAgXAotCSQoRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTKQotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlIGNvbXBpbGVkCi0jIHVzaW5nICQoWDExX0ZMQUdTX1RPX1BBU1MpLgotQUxMX1gxMV9NT0RVTEVTID0gXAotCWFsbC1lbWFjcyBcCi0JYWxsLWVtYWNzMTkgXAotCWFsbC1nZGIgXAotCWFsbC1leHBlY3QgXAotCWFsbC1nYXNoIFwKLQlhbGwtZ3VpbGUgXAotCWFsbC10Y2xYIFwKLQlhbGwtdGsgXAotCWFsbC10azguMSBcCi0JYWxsLXRpeAotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjaGVjayB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoWDExX0ZMQUdTX1RPX1BBU1MpLgotQ0hFQ0tfWDExX01PRFVMRVMgPSBcCi0JY2hlY2stZW1hY3MgXAotCWNoZWNrLWdkYiBcCi0JY2hlY2stZ3VpbGUgXAotCWNoZWNrLWV4cGVjdCBcCi0JY2hlY2stZ2FzaCBcCi0JY2hlY2stdGNsWCBcCi0JY2hlY2stdGsgXAotCWNoZWNrLXRpeAotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBpbnN0YWxsIHRhcmdldHMgZm9yIGFsbCB0aGUgbW9kdWxlcyB3aGljaCBhcmUKLSMgY29tcGlsZWQgdXNpbmcgJChYMTFfRkxBR1NfVE9fUEFTUykuCi1JTlNUQUxMX1gxMV9NT0RVTEVTID0gXAotCWluc3RhbGwtZW1hY3MgXAotCWluc3RhbGwtZW1hY3MxOSBcCi0JaW5zdGFsbC1nZGIgXAotCWluc3RhbGwtZ3VpbGUgXAotCWluc3RhbGwtZXhwZWN0IFwKLQlpbnN0YWxsLWdhc2ggXAotCWluc3RhbGwtdGNsWCBcCi0JaW5zdGFsbC10ayBcCi0JaW5zdGFsbC10azguMSBcCi0JaW5zdGFsbC10aXgKLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBjb21waWxlZAotIyB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUFMTF9UQVJHRVRfTU9EVUxFUyA9IFwKLQlhbGwtdGFyZ2V0LWxpYmlvIFwKLQlhbGwtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JYWxsLXRhcmdldC1saWJyeCBcCi0JYWxsLXRhcmdldC1saWJnKysgXAotCWFsbC10YXJnZXQtbmV3bGliIFwKLQlhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWFsbC10YXJnZXQtd2luc3VwIFwKLQlhbGwtdGFyZ2V0LWxpYmdsb3NzIFwKLQlhbGwtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JYWxsLXRhcmdldC1ncGVyZiBcCi0JYWxsLXRhcmdldC1leGFtcGxlcyBcCi0JYWxsLXRhcmdldC1saWJzdHViIFwKLQlhbGwtdGFyZ2V0LWJzcCBcCi0JYWxsLXRhcmdldC1jeWdtb24KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgY29uZmlndXJlIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaAotIyBhcmUgY29tcGlsZWQgdXNpbmcgdGhlIHRhcmdldCB0b29scy4KLUNPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyA9IFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmlvIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JY29uZmlndXJlLXRhcmdldC1saWJyeCBcCi0JY29uZmlndXJlLXRhcmdldC1saWJnKysgXAotCWNvbmZpZ3VyZS10YXJnZXQtbmV3bGliIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWNvbmZpZ3VyZS10YXJnZXQtd2luc3VwIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmdsb3NzIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JY29uZmlndXJlLXRhcmdldC1ncGVyZiBcCi0JY29uZmlndXJlLXRhcmdldC1leGFtcGxlcyBcCi0JY29uZmlndXJlLXRhcmdldC1saWJzdHViIFwKLQljb25maWd1cmUtdGFyZ2V0LWJzcCBcCi0JY29uZmlndXJlLXRhcmdldC1jeWdtb24KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgY2hlY2sgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUNIRUNLX1RBUkdFVF9NT0RVTEVTID0gXAotCWNoZWNrLXRhcmdldC1saWJpbyBcCi0JY2hlY2stdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JY2hlY2stdGFyZ2V0LWxpYmcrKyBcCi0JY2hlY2stdGFyZ2V0LW5ld2xpYiBcCi0JY2hlY2stdGFyZ2V0LXdpbnN1cCBcCi0JY2hlY2stdGFyZ2V0LWxpYmliZXJ0eSBcCi0JY2hlY2stdGFyZ2V0LWdwZXJmCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGluc3RhbGwgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUlOU1RBTExfVEFSR0VUX01PRFVMRVMgPSBcCi0JaW5zdGFsbC10YXJnZXQtbGliaW8gXAotCWluc3RhbGwtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JaW5zdGFsbC10YXJnZXQtbGliZysrIFwKLQlpbnN0YWxsLXRhcmdldC1uZXdsaWIgXAotCWluc3RhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWluc3RhbGwtdGFyZ2V0LXdpbnN1cCBcCi0JaW5zdGFsbC10YXJnZXQtbGliZ2xvc3MgXAotCWluc3RhbGwtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JaW5zdGFsbC10YXJnZXQtYnNwIFwKLQlpbnN0YWxsLXRhcmdldC1ncGVyZgotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGZvciB3aGljaCB3ZSBjYW4gZG8gYSBjbGVhbi17dGFyZ2V0fS4KLUNMRUFOX01PRFVMRVMgPSBcCi0JY2xlYW4tYXBhY2hlIFwKLQljbGVhbi1hc2ggXAotCWNsZWFuLWF1dG9jb25mIFwKLQljbGVhbi1hdXRvbWFrZSBcCi0JY2xlYW4tYmFzaCBcCi0JY2xlYW4tYmZkIFwKLQljbGVhbi1iaW51dGlscyBcCi0JY2xlYW4tYmlzb24gXAotCWNsZWFuLWJ5YWNjIFwKLQljbGVhbi1iemlwMiBcCi0JY2xlYW4tY3Zzc3JjIFwKLQljbGVhbi1kYiBcCi0JY2xlYW4tZGVqYWdudSBcCi0JY2xlYW4tZGlmZiBcCi0JY2xlYW4tZG9zdXRpbHMgXAotCWNsZWFuLWV0YyBcCi0JY2xlYW4tZmlsZXV0aWxzIFwKLQljbGVhbi1maW5kdXRpbHMgXAotCWNsZWFuLWZpbmQgXAotCWNsZWFuLWZsZXggXAotCWNsZWFuLWdhcyBcCi0JY2xlYW4tZ2F3ayBcCi0JY2xlYW4tZ2V0dGV4dCBcCi0JY2xlYW4tZ251c2VydiBcCi0JY2xlYW4tZ3Byb2YgXAotCWNsZWFuLWdyZXAgXAotCWNsZWFuLWdyZXogXAotCWNsZWFuLWd6aXAgXAotCWNsZWFuLWhlbGxvIFwKLQljbGVhbi1pbmRlbnQgXAotCWNsZWFuLWluZXQgXAotCWNsZWFuLWludGwgXAotCWNsZWFuLWlzcGVsbCBcCi0JY2xlYW4taXRjbCBcCi0JY2xlYW4tbGQgXAotCWNsZWFuLWxpYmd1aSBcCi0JY2xlYW4tbGliaWJlcnR5IFwKLQljbGVhbi1saWJ0b29sIFwKLQljbGVhbi1tNCBcCi0JY2xlYW4tbWFrZSBcCi0JY2xlYW4tbW1hbGxvYyBcCi0JY2xlYW4tb3Bjb2RlcyBcCi0JY2xlYW4tcGF0Y2ggXAotCWNsZWFuLXBlcmwgXAotCWNsZWFuLXBybXMgXAotCWNsZWFuLXJjcyBcCi0JY2xlYW4tcmVhZGxpbmUgXAotCWNsZWFuLXJlbGVhc2UgXAotCWNsZWFuLXJlY29kZSBcCi0JY2xlYW4tc2VkIFwKLQljbGVhbi1zZW5kLXByIFwKLQljbGVhbi1zaGVsbHV0aWxzIFwKLQljbGVhbi1zaW0gXAotCWNsZWFuLXRhciBcCi0JY2xlYW4tdGNsIFwKLQljbGVhbi10ZXhpbmZvIFwKLQljbGVhbi10ZXh0dXRpbHMgXAotCWNsZWFuLXRnYXMgXAotCWNsZWFuLXRpbWUgXAotCWNsZWFuLXV1ZGVjb2RlIFwKLQljbGVhbi13ZGlmZiBcCi0JY2xlYW4temlwCi0KLSMgQWxsIG9mIHRoZSB0YXJnZXQgbW9kdWxlcyB0aGF0IGNhbiBiZSBjbGVhbmVkCi1DTEVBTl9UQVJHRVRfTU9EVUxFUyA9IFwKLQljbGVhbi10YXJnZXQtbGliaW8gXAotCWNsZWFuLXRhcmdldC1saWJzdGRjKysgXAotCWNsZWFuLXRhcmdldC1saWJyeCBcCi0JY2xlYW4tdGFyZ2V0LWxpYmcrKyBcCi0JY2xlYW4tdGFyZ2V0LW5ld2xpYiBcCi0JY2xlYW4tdGFyZ2V0LXdpbnN1cCBcCi0JY2xlYW4tdGFyZ2V0LWxpYmdsb3NzIFwKLQljbGVhbi10YXJnZXQtbGliaWJlcnR5IFwKLQljbGVhbi10YXJnZXQtZ3BlcmYgXAotCWNsZWFuLXRhcmdldC1leGFtcGxlcyBcCi0JY2xlYW4tdGFyZ2V0LWxpYnN0dWIgXAotCWNsZWFuLXRhcmdldC1ic3AgXAotCWNsZWFuLXRhcmdldC1jeWdtb24KLQotIyBBbGwgb2YgdGhlIHgxMSBtb2R1bGVzIHRoYXQgY2FuIGJlIGNsZWFuZWQKLUNMRUFOX1gxMV9NT0RVTEVTID0gXAotCWNsZWFuLWVtYWNzIFwKLQljbGVhbi1lbWFjczE5IFwKLQljbGVhbi1nZGIgXAotCWNsZWFuLWV4cGVjdCBcCi0JY2xlYW4tZ2FzaCBcCi0JY2xlYW4tZ3VpbGUgXAotCWNsZWFuLXRjbFggXAotCWNsZWFuLXRrIFwKLQljbGVhbi10aXgKLQotIyBUaGUgdGFyZ2V0IGJ1aWx0IGZvciBhIG5hdGl2ZSBidWlsZC4KLS5QSE9OWTogYWxsLm5vcm1hbAotYWxsLm5vcm1hbDogXAotCSQoQUxMX01PRFVMRVMpIFwKLQkkKEFMTF9YMTFfTU9EVUxFUykgXAotCSQoQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JYWxsLWdjYwotCi0jIERvIGEgdGFyZ2V0IGZvciBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzLiAgQSBgYG1ha2UgZG8tWCcnIHdpbGwgZG8gYQotIyBgYG1ha2UgWCcnIGluIGFsbCBzdWJkaXJlY3RvcmllcyAoYmVjYXVzZSwgaW4gZ2VuZXJhbCwgdGhlcmUgaXMgYQotIyBkZXBlbmRlbmN5IChiZWxvdykgb2YgWCB1cG9uIGRvLVgsIGEgYGBtYWtlIFgnJyB3aWxsIGFsc28gZG8gdGhpcywKLSMgYnV0IGl0IG1heSBkbyBhZGRpdGlvbmFsIHdvcmsgYXMgd2VsbCkuCi0jIFRoaXMgdGFyZ2V0IGVuc3VyZXMgdGhhdCAkKEJBU0VfRkxBR1NfVE9fUEFTUykgYXBwZWFycyBvbmx5IG9uY2UsCi0jIGJlY2F1c2UgaXQgaXMgc28gbGFyZ2UgdGhhdCBpdCBjYW4gZWFzaWx5IG92ZXJmbG93IHRoZSBjb21tYW5kIGxpbmUKLSMgbGVuZ3RoIGxpbWl0IG9uIHNvbWUgc3lzdGVtcy4KLURPX1ggPSBcCi0JZG8tY2xlYW4gXAotCWRvLWRpc3RjbGVhbiBcCi0JZG8tZHZpIFwKLQlkby1pbmZvIFwKLQlkby1pbnN0YWxsLWluZm8gXAotCWRvLWluc3RhbGxjaGVjayBcCi0JZG8tbW9zdGx5Y2xlYW4gXAotCWRvLW1haW50YWluZXItY2xlYW4gXAotCWRvLVRBR1MKLS5QSE9OWTogJChET19YKQotJChET19YKToKLQlAdGFyZ2V0PWBlY2hvICRAIHwgc2VkIC1lICdzL15kby0vLydgOyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQlmb3IgaSBpbiAkKFNVQkRJUlMpIC1kdW1teS07IGRvIFwKLQkgIGlmIFsgLWYgLi8kJGkvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICAgIGNhc2UgJCRpIGluIFwKLQkgICAgZ2NjKSBcCi0JICAgICAgZm9yIGZsYWcgaW4gJChFWFRSQV9HQ0NfRkxBR1MpOyBkbyBcCi0JCWV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJ3wiYDsgXAotCSAgICAgIGRvbmU7IFwKLQkgICAgICA7OyBcCi0JICAgICopIFwKLQkgICAgICBmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpOyBkbyBcCi0JCWV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJ3wiYDsgXAotCSAgICAgIGRvbmU7IFwKLQkgICAgICA7OyBcCi0JICAgIGVzYWMgOyBcCi0JICAgIGV4cG9ydCBBUiBBUyBDQyBDWFggTEQgTk0gUkFOTElCIERMTFRPT0wgV0lORFJFUzsgXAotCSAgICBpZiAoY2QgLi8kJGk7IFwKLQkgICAgICAgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKLQkJCSJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAotCQkJIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCi0JCQkiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKLQkJCSQke3RhcmdldH0pOyBcCi0JICAgIHRoZW4gdHJ1ZTsgZWxzZSBleGl0IDE7IGZpOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCUB0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvXmRvLS8vJ2A7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWZvciBpIGluICQoVEFSR0VUX0NPTkZJR0RJUlMpIC1kdW1teS07IGRvIFwKLQkgIGlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJGkvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICAgIGZvciBmbGFnIGluICQoRVhUUkFfVEFSR0VUX0ZMQUdTKTsgZG8gXAotCQlldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMid8ImA7IFwKLQkgICAgZG9uZTsgXAotCSAgICBleHBvcnQgQVIgQVMgQ0MgQ1hYIExEIE5NIFJBTkxJQiBETExUT09MIFdJTkRSRVM7IFwKLQkgICAgaWYgKGNkICQoVEFSR0VUX1NVQkRJUikvJCRpOyBcCi0JICAgICAgICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCi0JCQkiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKLQkJCSJSQU5MSUI9JCR7UkFOTElCfSIgXAotCQkJIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCi0JCQkkJHt0YXJnZXR9KTsgXAotCSAgICB0aGVuIHRydWU7IGVsc2UgZXhpdCAxOyBmaTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQotIyBIZXJlIGFyZSB0aGUgdGFyZ2V0cyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBkby1YIHRhcmdldHMuCi0KLS5QSE9OWTogaW5mbyBpbnN0YWxsY2hlY2sgZHZpIGluc3RhbGwtaW5mbwotLlBIT05ZOiBjbGVhbiBkaXN0Y2xlYW4gbW9zdGx5Y2xlYW4gbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4KLS5QSE9OWTogbG9jYWwtY2xlYW4gbG9jYWwtZGlzdGNsZWFuIGxvY2FsLW1haW50YWluZXItY2xlYW4KLWluZm86IGRvLWluZm8KLWluc3RhbGxjaGVjazogZG8taW5zdGFsbGNoZWNrCi1kdmk6IGRvLWR2aQotCi0jIE1ha2Ugc3VyZSBtYWtlaW5mbyBpcyBidWlsdCBiZWZvcmUgd2UgZG8gYSBgbWFrZSBpbmZvJy4KLWRvLWluZm86IGFsbC10ZXhpbmZvCi0KLWluc3RhbGwtaW5mbzogZG8taW5zdGFsbC1pbmZvIGRpci5pbmZvCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCWlmIFsgLWYgZGlyLmluZm8gXSA7IHRoZW4gXAotCSAgJChJTlNUQUxMX0RBVEEpIGRpci5pbmZvICQoaW5mb2RpcikvZGlyLmluZm8gOyBcCi0JZWxzZSB0cnVlIDsgZmkKLQotbG9jYWwtY2xlYW46Ci0JLXJtIC1mICouYSBURU1QIGVycnMgY29yZSAqLm8gKn4gXCMqIFRBR1MgKi5FICoubG9nCi0KLWxvY2FsLWRpc3RjbGVhbjoKLQktcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgbWgtZnJhZyBtdC1mcmFnCi0JLWlmIFsgIiQoVEFSR0VUX1NVQkRJUikiICE9ICIuIiBdOyB0aGVuIFwKLQkgIHJtIC1yZiAkKFRBUkdFVF9TVUJESVIpOyBcCi0JZWxzZSB0cnVlOyBmaQotCi1sb2NhbC1tYWludGFpbmVyLWNsZWFuOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1jbGVhbjogZG8tY2xlYW4gbG9jYWwtY2xlYW4KLW1vc3RseWNsZWFuOiBkby1tb3N0bHljbGVhbiBsb2NhbC1jbGVhbgotZGlzdGNsZWFuOiBkby1kaXN0Y2xlYW4gbG9jYWwtY2xlYW4gbG9jYWwtZGlzdGNsZWFuCi1tYWludGFpbmVyLWNsZWFuOiBsb2NhbC1tYWludGFpbmVyLWNsZWFuIGRvLW1haW50YWluZXItY2xlYW4gbG9jYWwtY2xlYW4gCi1tYWludGFpbmVyLWNsZWFuOiBsb2NhbC1kaXN0Y2xlYW4KLXJlYWxjbGVhbjogbWFpbnRhaW5lci1jbGVhbgotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGNsZWFuIHNwZWNpZmljIG1vZHVsZXMuCi0uUEhPTlk6ICQoQ0xFQU5fTU9EVUxFUykgJChDTEVBTl9YMTFfTU9EVUxFUykgY2xlYW4tZ2NjCi0kKENMRUFOX01PRFVMRVMpICQoQ0xFQU5fWDExX01PRFVMRVMpIGNsZWFuLWdjYzoKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NsZWFuLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgY2xlYW4pOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotLlBIT05ZOiAkKENMRUFOX1RBUkdFVF9NT0RVTEVTKQotJChDTEVBTl9UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jbGVhbi10YXJnZXQtLy8nYDsgXAotCXJtIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9tdWx0aWxpYi5vdXQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dDsgXAotCWlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTsgJChNQUtFKSAkKFRBUkdFVF9GTEFHU19UT19QQVNTKSBjbGVhbik7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi1jbGVhbi10YXJnZXQ6ICQoQ0xFQU5fVEFSR0VUX01PRFVMRVMpCi0KLSMgQ2hlY2sgdGFyZ2V0LgotCi0uUEhPTlk6IGNoZWNrCi1jaGVjazogJChDSEVDS19NT0RVTEVTKSBcCi0JJChDSEVDS19UQVJHRVRfTU9EVUxFUykgXAotCSQoQ0hFQ0tfWDExX01PRFVMRVMpIFwKLQljaGVjay1nY2MKLQotIyBBdXRvbWF0ZWQgcmVwb3J0aW5nIG9mIHRlc3QgcmVzdWx0cy4KLQotd2FybmluZy5sb2c6IGJ1aWxkLmxvZwotCSQoc3JjZGlyKS9jb250cmliL3dhcm5fc3VtbWFyeSBidWlsZC5sb2cgPiAkQAotCi1tYWlsLXJlcG9ydC5sb2c6Ci0JaWYgdGVzdCB4JyQoQk9PVF9DRkxBR1MpJyAhPSB4Jyc7IHRoZW4gXAotCSAgICBCT09UX0NGTEFHUz0nJChCT09UX0NGTEFHUyknOyBleHBvcnQgQk9PVF9DRkxBR1M7IFwKLQlmaTsgXAotCSQoc3JjZGlyKS9jb250cmliL3Rlc3Rfc3VtbWFyeSAtdCA+JEAKLQljaG1vZCAreCAkQAotCWVjaG8gSWYgeW91IHJlYWxseSB3YW50IHRvIHNlbmQgZS1tYWlsLCBydW4gLi8kQCBub3cKLQotbWFpbC1yZXBvcnQtd2l0aC13YXJuaW5ncy5sb2c6IHdhcm5pbmcubG9nCi0JaWYgdGVzdCB4JyQoQk9PVF9DRkxBR1MpJyAhPSB4Jyc7IHRoZW4gXAotCSAgICBCT09UX0NGTEFHUz0nJChCT09UX0NGTEFHUyknOyBleHBvcnQgQk9PVF9DRkxBR1M7IFwKLQlmaTsgXAotCSQoc3JjZGlyKS9jb250cmliL3Rlc3Rfc3VtbWFyeSAtdCAtaSB3YXJuaW5nLmxvZyA+JEAKLQljaG1vZCAreCAkQAotCWVjaG8gSWYgeW91IHJlYWxseSB3YW50IHRvIHNlbmQgZS1tYWlsLCBydW4gLi8kQCBub3cKLQotIyBJbnN0YWxsYXRpb24gdGFyZ2V0cy4KLQotLlBIT05ZOiBpbnN0YWxsIGluc3RhbGwtY3Jvc3MgdW5pbnN0YWxsIHNvdXJjZS12YXVsdCBiaW5hcnktdmF1bHQgdmF1bHQtaW5zdGFsbAotaW5zdGFsbDogJChJTlNUQUxMX1RBUkdFVCkgCi1pbnN0YWxsLWNyb3NzOiAkKElOU1RBTExfVEFSR0VUX0NST1NTKSAKLQotdW5pbnN0YWxsOgotCUBlY2hvICJ0aGUgdW5pbnN0YWxsIHRhcmdldCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdHJlZSIKLQotc291cmNlLXZhdWx0OgotCSQoTUFLRSkgLWYgLi9yZWxlYXNlL0J1aWxkLUEtUmVsZWFzZSBcCi0JCWhvc3Q9JChob3N0X2FsaWFzKSBzb3VyY2UtdmF1bHQKLQotYmluYXJ5LXZhdWx0OgotCSQoTUFLRSkgLWYgLi9yZWxlYXNlL0J1aWxkLUEtUmVsZWFzZSBcCi0JCWhvc3Q9JChob3N0X2FsaWFzKSB0YXJnZXQ9JCh0YXJnZXRfYWxpYXMpCi0KLXZhdWx0LWluc3RhbGw6Ci0JQGlmIFsgLWYgLi9yZWxlYXNlL3ZhdWx0LWluc3RhbGwgXSA7IHRoZW4gXAotCSAgLi9yZWxlYXNlL3ZhdWx0LWluc3RhbGwgJChob3N0X2FsaWFzKSAkKHRhcmdldF9hbGlhcykgOyBcCi0JZWxzZSBcCi0JICB0cnVlIDsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC5hbGwKLWluc3RhbGwuYWxsOiBpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JCXI9YHB3ZGAgOyBleHBvcnQgciA7IFwKLQkJJChTRVRfTElCX1BBVEgpIFwKLQkJKGNkIC4vZ2NjOyBcCi0JCSQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsLWhlYWRlcnMpIDsgXAotCWVsc2UgXAotCQl0cnVlIDsgXAotCWZpCi0KLSMgaW5ldC1pbnN0YWxsIGlzIHVzZWQgYmVjYXVzZSB0aGUgSSpOZXQgd2FudHMgRGVqYUdOVSBpbnN0YWxsZWQgYnV0Ci0jIG5vdCBidWlsdC4gIFNpbWlsYXJseSwgZ3ppcCBpcyBidWlsdCBidXQgbm90IGluc3RhbGxlZC4KLWluZXQtaW5zdGFsbDoKLQkkKE1BS0UpIElOU1RBTExfTU9EVUxFUz0iYGVjaG8gJChJTlNUQUxMX01PRFVMRVMpIHwgc2VkIC1lICdzL2luc3RhbGwtZGVqYWdudS8vJyAtZSAncy9pbnN0YWxsLWd6aXAvLydgIiBpbnN0YWxsCi0KLSMgaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzIGlzIHVzZWQgYmVjYXVzZSBDeWdudXMgY2FuIG5vdCBkaXN0cmlidXRlCi0jIHRoZSBmaXhlZCBoZWFkZXIgZmlsZXMuCi0uUEhPTlk6IGluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcwotaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzOiBcCi0JaW5zdGFsbGRpcnMgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JZ2NjLW5vLWZpeGVkaW5jbHVkZXMgCi0KLSMgSW5zdGFsbCB0aGUgZ2NjIGhlYWRlcnMgZmlsZXMsIGJ1dCBub3QgdGhlIGZpeGVkIGluY2x1ZGUgZmlsZXMsCi0jIHdoaWNoIEN5Z251cyBpcyBub3QgYWxsb3dlZCB0byBkaXN0cmlidXRlLiAgVGhpcyBydWxlIGlzIHZlcnkKLSMgZGVwZW5kZW50IG9uIHRoZSB3b3JraW5ncyBvZiB0aGUgZ2NjIE1ha2VmaWxlLmluLgotLlBIT05ZOiBnY2Mtbm8tZml4ZWRpbmNsdWRlcwotZ2NjLW5vLWZpeGVkaW5jbHVkZXM6Ci0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICBybSAtcmYgZ2NjL3RtcC1pbmNsdWRlOyBcCi0JICBtdiBnY2MvaW5jbHVkZSBnY2MvdG1wLWluY2x1ZGUgMj4vZGV2L251bGw7IFwKLQkgIG1rZGlyIGdjYy9pbmNsdWRlOyBcCi0JICBjcCAkKHNyY2RpcikvZ2NjL2dzeXNsaW1pdHMuaCBnY2MvaW5jbHVkZS9zeXNsaW1pdHMuaDsgXAotCSAgdG91Y2ggZ2NjL3N0bXAtZml4aW5jIGdjYy9pbmNsdWRlL2ZpeGVkOyBcCi0JICBybSAtZiBnY2Mvc3RtcC1oZWFkZXJzIGdjYy9zdG1wLWludC1oZHJzOyBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgIDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgLi9nY2M7IFwKLQkgICAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIGluc3RhbGwpOyBcCi0JICBybSAtcmYgZ2NjL2luY2x1ZGU7IFwKLQkgIG12IGdjYy90bXAtaW5jbHVkZSBnY2MvaW5jbHVkZSAyPi9kZXYvbnVsbDsgXAotCWVsc2UgdHJ1ZTsgZmkKLQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLiAgVG8KLSMgYnVpbGQgYSB0YXJnZXQgYWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBhbGwuCi0jCi0jIGFsbC1ndWksIGFuZCBhbGwtbGlicHJvYyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYmVjYXVzZQotIyB0aGV5IGFyZSBzdGlsbCBleHBlcmltZW50YWwsIGFuZCBpZiB0aGV5IGZhaWwgdG8gYnVpbGQsIHRoYXQKLSMgc2hvdWxkbid0IHN0b3AgIm1ha2UgYWxsIi4KLS5QSE9OWTogJChBTExfTU9EVUxFUykgYWxsLWd1aSBhbGwtbGlicHJvYwotJChBTExfTU9EVUxFUykgYWxsLWd1aSBhbGwtbGlicHJvYzoKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2FsbC0vLydgOyBcCi0JaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoZXNlIHJ1bGVzIGFyZSB1c2VkIHRvIGNoZWNrIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBjaGVjay1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgY2hlY2suICBTb21lCi0jIG1vZHVsZXMgYXJlIG9ubHkgdGVzdGVkIGluIGEgbmF0aXZlIHRvb2xjaGFpbi4KLQotLlBIT05ZOiAkKENIRUNLX01PRFVMRVMpICQoTkFUSVZFX0NIRUNLX01PRFVMRVMpICQoQ1JPU1NfQ0hFQ0tfTU9EVUxFUykKLSQoTkFUSVZFX0NIRUNLX01PRFVMRVMpOgotCUBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotCSAgZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NoZWNrLS8vJ2A7IFwKLQkgIGlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgICAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgICAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGNoZWNrKTsgXAotCSAgZWxzZSBcCi0JICAgIHRydWU7IFwKLQkgIGZpOyBcCi0JZmkKLQotJChDUk9TU19DSEVDS19NT0RVTEVTKToKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NoZWNrLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiAkKElOU1RBTExfTU9EVUxFUykKLSQoSU5TVEFMTF9NT0RVTEVTKTogaW5zdGFsbGRpcnMKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBidWlsdCB3aXRoIHRoZQotIyB0YXJnZXQgdG9vbHMuCi0uUEhPTlk6ICQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKQotJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY29uZmlndXJlLXRhcmdldC0vLydgOyBcCi0JaWYgWyAtZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0gXTsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgJChDQ19GT1JfVEFSR0VUKSAtLXByaW50LW11bHRpLWxpYiA+ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgMj4gL2Rldi9udWxsOyBcCi0JICBpZiBbIC1zICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgXTsgdGhlbiBcCi0JICAgIGlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCBdOyB0aGVuIFwKLQkgICAgICBpZiBjbXAgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0ID4gL2Rldi9udWxsOyB0aGVuIFwKLQkJcm0gLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dDsgXAotCSAgICAgIGVsc2UgXAotCQllY2hvICJNdWx0aWxpYnMgY2hhbmdlZCBmb3IgJCR7ZGlyfSwgcmVjb25maWd1cmluZyI7IFwKLQkJcm0gLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGU7IFwKLQkJbXYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0OyBcCi0JICAgICAgZmk7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgbXYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0OyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWZpOyBleGl0IDAJIyBicmVhayBjb21tYW5kIGludG8gdHdvIHBpZWNlcwotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY29uZmlndXJlLXRhcmdldC0vLydgOyBcCi0JaWYgWyAhIC1kICQoVEFSR0VUX1NVQkRJUikgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxpZiBlY2hvICIgJChUQVJHRVRfQ09ORklHRElSUykgIiB8IGdyZXAgIiAkJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlmIFsgLWQgJChzcmNkaXIpLyQke2Rpcn0gXTsgdGhlbiBcCi0JICAgIFsgLWQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9IF0gfHwgbWtkaXIgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9O1wKLQkgICAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgICAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgICBBUj0iJChBUl9GT1JfVEFSR0VUKSI7IGV4cG9ydCBBUjsgXAotCSAgICBBUz0iJChBU19GT1JfVEFSR0VUKSI7IGV4cG9ydCBBUzsgXAotCSAgICBDQz0iJChDQ19GT1JfVEFSR0VUKSI7IGV4cG9ydCBDQzsgXAotCSAgICBDRkxBR1M9IiQoQ0ZMQUdTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENGTEFHUzsgXAotCSAgICBDWFg9IiQoQ1hYX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENYWDsgXAotCSAgICBDWFhGTEFHUz0iJChDWFhGTEFHU19GT1JfVEFSR0VUKSI7IGV4cG9ydCBDWFhGTEFHUzsgXAotCSAgICBETExUT09MPSIkKERMTFRPT0xfRk9SX1RBUkdFVCkiOyBleHBvcnQgRExMVE9PTDsgXAotCSAgICBMRD0iJChMRF9GT1JfVEFSR0VUKSI7IGV4cG9ydCBMRDsgXAotICAgICAgICAgICAgTERGTEFHUz0iJChMREZMQUdTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IExERkxBR1M7IFwKLQkgICAgTk09IiQoTk1fRk9SX1RBUkdFVCkiOyBleHBvcnQgTk07IFwKLQkgICAgUkFOTElCPSIkKFJBTkxJQl9GT1JfVEFSR0VUKSI7IGV4cG9ydCBSQU5MSUI7IFwKLQkgICAgV0lORFJFUz0iJChXSU5EUkVTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IFdJTkRSRVM7IFwKLQkgICAgZWNobyBDb25maWd1cmluZyBpbiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07IFwKLQkgICAgY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyBcCi0JICAgIGNhc2UgJChzcmNkaXIpIGluIFwKLQkgICAgLyopIFwKLQkgICAgICB0b3BkaXI9JChzcmNkaXIpIDs7IFwKLQkgICAgKikgXAotCSAgICAgIGNhc2UgIiQoVEFSR0VUX1NVQkRJUikiIGluIFwKLQkgICAgICAuKSB0b3BkaXI9Ii4uLyQoc3JjZGlyKSIgOzsgXAotCSAgICAgICopIHRvcGRpcj0iLi4vLi4vJChzcmNkaXIpIiA7OyBcCi0JICAgICAgZXNhYyA7OyBcCi0JICAgIGVzYWM7IFwKLQkgICAgaWYgWyAiJChzcmNkaXIpIiA9ICIuIiBdIDsgdGhlbiBcCi0JICAgICAgaWYgWyAiJChUQVJHRVRfU1VCRElSKSIgIT0gIi4iIF0gOyB0aGVuIFwKLQkJaWYgJChTSEVMTCkgJCRzL3N5bWxpbmstdHJlZSAkJHt0b3BkaXJ9LyQke2Rpcn0gIm5vLXN1Y2gtZmlsZSIgOyB0aGVuIFwKLQkJICBpZiBbIC1mIE1ha2VmaWxlIF07IHRoZW4gXAotCQkgICAgaWYgJChNQUtFKSBkaXN0Y2xlYW47IHRoZW4gXAotCQkgICAgICB0cnVlOyBcCi0JCSAgICBlbHNlIFwKLQkJICAgICAgZXhpdCAxOyBcCi0JCSAgICBmaTsgXAotCQkgIGVsc2UgXAotCQkgICAgdHJ1ZTsgXAotCQkgIGZpOyBcCi0JCWVsc2UgXAotCQkgIGV4aXQgMTsgXAotCQlmaTsgXAotCSAgICAgIGVsc2UgXAotCQl0cnVlOyBcCi0JICAgICAgZmk7IFwKLQkgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPS4iOyBcCi0JICAgICAgbGlic3JjZGlyPSIuIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSQke3RvcGRpcn0vJCR7ZGlyfSI7IFwKLQkgICAgICBsaWJzcmNkaXI9IiQkcy8kJHtkaXJ9IjsgXAotCSAgICBmaTsgXAotCSAgICBpZiBbIC1mICQke2xpYnNyY2Rpcn0vY29uZmlndXJlIF0gOyB0aGVuIFwKLQkgICAgICBybSAtZiBuby1zdWNoLWZpbGUgc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIENPTkZJR19TSVRFPW5vLXN1Y2gtZmlsZSAkKFNIRUxMKSAkJHtsaWJzcmNkaXJ9L2NvbmZpZ3VyZSBcCi0JCSQoQ09ORklHX0FSR1VNRU5UUykgJCR7c3JjZGlyb3B0aW9ufSBcCi0JCS0td2l0aC10YXJnZXQtc3ViZGlyPSIkKFRBUkdFVF9TVUJESVIpIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICBybSAtZiBuby1zdWNoLWZpbGUgc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIENPTkZJR19TSVRFPW5vLXN1Y2gtZmlsZSAkKFNIRUxMKSAkJHMvY29uZmlndXJlIFwKLQkJJChDT05GSUdfQVJHVU1FTlRTKSAkJHtzcmNkaXJvcHRpb259IFwKLQkJLS13aXRoLXRhcmdldC1zdWJkaXI9IiQoVEFSR0VUX1NVQkRJUikiOyBcCi0JICAgIGZpOyBcCi0JICAgIGlmIFsgLWYgc2tpcC10aGlzLWRpciBdIDsgdGhlbiBcCi0JICAgICAgc2ggc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIHJtIC1mIHNraXAtdGhpcy1kaXI7IFwKLQkgICAgICBjZCAuLjsgcm1kaXIgJCR7ZGlyfSB8fCB0cnVlOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGVsc2UgXAotCSAgICB0cnVlOyBcCi0JICBmaTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFRBUkdFVF9GTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KLS5QSE9OWTogJChBTExfVEFSR0VUX01PRFVMRVMpCi0kKEFMTF9UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9hbGwtdGFyZ2V0LS8vJ2A7IFwKLQlpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07ICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgYWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY2hlY2sgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFRBUkdFVF9GTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiAkKENIRUNLX1RBUkdFVF9NT0RVTEVTKQotJChDSEVDS19UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jaGVjay10YXJnZXQtLy8nYDsgXAotCWlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTskKE1BS0UpICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpIGNoZWNrKTtcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZQotIyBUQVJHRVRfRkxBR1NfVE9fUEFTUy4gIFRvIGJ1aWxkIGEgdGFyZ2V0IGluc3RhbGwtWCBtZWFucyB0byBjZCB0byBYCi0jIGFuZCBtYWtlIGluc3RhbGwuCi0uUEhPTlk6ICQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUykKLSQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyk6IGluc3RhbGxkaXJzCi0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9pbnN0YWxsLXRhcmdldC0vLydgOyBcCi0JaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyBcCi0JICAgICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgYWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBhbGwuCi0uUEhPTlk6ICQoQUxMX1gxMV9NT0RVTEVTKQotJChBTExfWDExX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvYWxsLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyBcCi0JICAgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpICQoWDExX0ZMQUdTX1RPX1BBU1MpIGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGNoZWNrIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgY2hlY2stWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KLS5QSE9OWTogJChDSEVDS19YMTFfTU9EVUxFUykKLSQoQ0hFQ0tfWDExX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY2hlY2stLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07IFwKLQkgICAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChYMTFfRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgaW5zdGFsbC1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgaW5zdGFsbC4KLS5QSE9OWTogJChJTlNUQUxMX1gxMV9NT0RVTEVTKQotJChJTlNUQUxMX1gxMV9NT0RVTEVTKTogaW5zdGFsbGRpcnMKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07IFwKLQkgICAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChYMTFfRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIGdjYyBpcyB0aGUgb25seSBtb2R1bGUgd2hpY2ggdXNlcyBHQ0NfRkxBR1NfVE9fUEFTUy4KLS5QSE9OWTogYWxsLWdjYwotYWxsLWdjYzoKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgYWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgQnVpbGRpbmcgR0NDIHVzZXMgc29tZSB0b29scyBmb3IgcmVidWlsZGluZyAic291cmNlIiBmaWxlcwotIyBsaWtlIHRleGluZm8sIGJpc29uL2J5YWNjLCBldGMuICBTbyB3ZSBtdXN0IGRlcGVuZCBvbiB0aG9zZS4KLSMKLSMgV2hpbGUgYnVpbGRpbmcgR0NDLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHJ1biB2YXJpb3VzIHRhcmdldAotIyBwcm9ncmFtcyBsaWtlIHRoZSBhc3NlbWJsZXIsIGxpbmtlciwgZXRjLiAgU28gd2UgZGVwZW5kIG9uCi0jIHRob3NlIHRvby4KLSMKLSMgSW4gdGhlb3J5LCBvbiBhbiBTTVAgYWxsIHRob3NlIGRlcGVuZGVuY2llcyBjYW4gYmUgcmVzb2x2ZWQKLSMgaW4gcGFyYWxsZWwuCi0jCi0uUEhPTlk6IGJvb3RzdHJhcCBib290c3RyYXAtbGVhbiBib290c3RyYXAyIGJvb3RzdHJhcDItbGVhbiBib290c3RyYXAzIGJvb3RzdHJhcDMtbGVhbiBib290c3RyYXA0IGJvb3RzdHJhcDQtbGVhbgotYm9vdHN0cmFwIGJvb3RzdHJhcC1sZWFuIGJvb3RzdHJhcDIgYm9vdHN0cmFwMi1sZWFuIGJvb3RzdHJhcDMgYm9vdHN0cmFwMy1sZWFuIGJvb3RzdHJhcDQgYm9vdHN0cmFwNC1sZWFuOiBhbGwtdGV4aW5mbyBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1sZAotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWVjaG8gIkJvb3RzdHJhcHBpbmcgdGhlIGNvbXBpbGVyIjsgXAotCWNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSAkQAotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQljYXNlICIkQCIgaW4gXAotCSAgKmJvb3RzdHJhcDQtbGVhbiApIFwKLQkJCW1zZz0iQ29tcGFyaW5nIHN0YWdlMyBhbmQgc3RhZ2U0IG9mIHRoZSBjb21waWxlciI7IFwKLQkgIAkJY29tcGFyZT1jb21wYXJlMy1sZWFuIDs7IFwKLQkgICpib290c3RyYXA0ICkgbXNnPSJDb21wYXJpbmcgc3RhZ2UzIGFuZCBzdGFnZTQgb2YgdGhlIGNvbXBpbGVyIjsgXAotCSAgCQljb21wYXJlPWNvbXBhcmUzIDs7IFwKLQkgICotbGVhbiApCW1zZz0iQ29tcGFyaW5nIHN0YWdlMiBhbmQgc3RhZ2UzIG9mIHRoZSBjb21waWxlciI7IFwKLQkgIAkJY29tcGFyZT1jb21wYXJlLWxlYW4gOzsgXAotCSAgKiApCQltc2c9IkNvbXBhcmluZyBzdGFnZTIgYW5kIHN0YWdlMyBvZiB0aGUgY29tcGlsZXIiOyBcCi0JICAJCWNvbXBhcmU9Y29tcGFyZSA7OyBcCi0JZXNhYzsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiJCRtc2ciOyBcCi0JY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpICQkY29tcGFyZQotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYCA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQllY2hvICJCdWlsZGluZyBydW50aW1lIGxpYnJhcmllcyI7IFwKLQkkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSBhbGwKLQotLlBIT05ZOiBjcm9zcwotY3Jvc3M6IGFsbC10ZXhpbmZvIGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWJpbnV0aWxzIGFsbC1nYXMgYWxsLWxkCi0JQHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiQnVpbGRpbmcgdGhlIEMgYW5kIEMrKyBjb21waWxlciI7IFwKLQljZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgTEFOR1VBR0VTPSJjIGMrKyIKLQlAcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGAgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiQnVpbGRpbmcgcnVudGltZSBsaWJyYXJpZXMiOyBcCi0JJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgYWxsIExBTkdVQUdFUz0iYyBjKysiCi0KLS5QSE9OWTogY2hlY2stZ2NjCi1jaGVjay1nY2M6Ci0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIGNoZWNrKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC1nY2MKLWluc3RhbGwtZ2NjOgotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC1nY2MtY3Jvc3MKLWluc3RhbGwtZ2NjLWNyb3NzOgotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBMQU5HVUFHRVM9ImMgYysrIiBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0jIEVYUEVSSU1FTlRBTCBTVFVGRgotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiBpbnN0YWxsLWRvc3JlbAotaW5zdGFsbC1kb3NyZWw6IGluc3RhbGxkaXJzIGluZm8KLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLWluc3RhbGwtZG9zcmVsLWZha2U6Ci0KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiBpbnRlci1kZXBlbmRlbmNpZXMgYW1vbmcgbW9kdWxlcy4KLWFsbC1hcGFjaGU6Ci1hbGwtYXNoOgotYWxsLWF1dG9jb25mOiBhbGwtbTQgYWxsLXRleGluZm8KLWFsbC1hdXRvbWFrZTogYWxsLW00IGFsbC10ZXhpbmZvCi1hbGwtYmFzaDoKLWFsbC1iZmQ6IGFsbC1saWJpYmVydHkgYWxsLWludGwKLWFsbC1iaW51dGlsczogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1mbGV4IGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWludGwKLWFsbC1iaXNvbjogYWxsLXRleGluZm8KLWNvbmZpZ3VyZS10YXJnZXQtYnNwOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWJzcDogY29uZmlndXJlLXRhcmdldC1ic3AgYWxsLWdjYyBhbGwtYmludXRpbHMgYWxsLXRhcmdldC1uZXdsaWIKLWFsbC1ieWFjYzoKLWFsbC1iemlwMjoKLWFsbC1jdnNzcmM6Ci1jb25maWd1cmUtdGFyZ2V0LWN5Z21vbjogJChBTExfR0NDKQotYWxsLXRhcmdldC1jeWdtb246IGNvbmZpZ3VyZS10YXJnZXQtY3lnbW9uIGFsbC1nYXMgYWxsLWxkIGFsbC1nY2MgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1uZXdsaWIgYWxsLXRhcmdldC1saWJpbyBhbGwtdGFyZ2V0LWxpYnN0dWIgYWxsLXRhcmdldC1ic3AKLWFsbC1kYjoKLWFsbC1kZWphZ251OiBhbGwtdGNsIGFsbC1leHBlY3QgYWxsLXRrCi1hbGwtZGlmZjogYWxsLWxpYmliZXJ0eQotYWxsLWVtYWNzOgotYWxsLWVtYWNzMTk6IGFsbC1iaXNvbiBhbGwtYnlhY2MKLWFsbC1ldGM6Ci1jb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWV4YW1wbGVzOiBjb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzCi1hbGwtZXhwZWN0OiBhbGwtdGNsIGFsbC10awotYWxsLWZpbGV1dGlsczogYWxsLWxpYmliZXJ0eQotYWxsLWZpbmR1dGlsczoKLWFsbC1maW5kOgotYWxsLWZsZXg6IGFsbC1saWJpYmVydHkgYWxsLWJpc29uIGFsbC1ieWFjYwotYWxsLWdhczogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1pbnRsCi1hbGwtZ2FzaDogYWxsLXRjbAotYWxsLWdhd2s6Ci1BTExfR0NDID0gYWxsLWdjYwotYWxsLWdjYzogYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtbGQKLWFsbC1ib290c3RyYXA6IGFsbC1saWJpYmVydHkgYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtbGQKLUdEQl9USyA9IGFsbC10ayBhbGwtdGNsIGFsbC1pdGNsIGFsbC10aXggYWxsLWxpYmd1aQotYWxsLWdkYjogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1tbWFsbG9jIGFsbC1yZWFkbGluZSBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1zaW0gJChnZGJubG1yZXF1aXJlbWVudHMpICQoR0RCX1RLKQotYWxsLWdldHRleHQ6Ci1hbGwtZ251c2VydjoKLWNvbmZpZ3VyZS10YXJnZXQtZ3BlcmY6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtZ3BlcmY6IGNvbmZpZ3VyZS10YXJnZXQtZ3BlcmYgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1saWJzdGRjKysKLWFsbC1ncHJvZjogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzIGFsbC1pbnRsCi1hbGwtZ3JlejogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzCi1hbGwtZ3VpOiBhbGwtZ2RiIGFsbC1saWJwcm9jIGFsbC10YXJnZXQtbGlicngKLWFsbC1ndWlsZToKLWFsbC1nemlwOiBhbGwtbGliaWJlcnR5Ci1hbGwtaGVsbG86IGFsbC1saWJpYmVydHkKLWFsbC1pbmRlbnQ6Ci1hbGwtaW5ldDogYWxsLXRjbCBhbGwtc2VuZC1wciBhbGwtcGVybAotYWxsLWludGw6Ci1hbGwtaXNwZWxsOiBhbGwtZW1hY3MxOQotYWxsLWl0Y2w6IGFsbC10Y2wgYWxsLXRrIGFsbC10Y2w4LjEgYWxsLXRrOC4xCi1hbGwtbGQ6IGFsbC1saWJpYmVydHkgYWxsLWJmZCBhbGwtb3Bjb2RlcyBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1mbGV4IGFsbC1pbnRsCi1jb25maWd1cmUtdGFyZ2V0LWxpYmcrKzogJChBTExfR0NDKSBjb25maWd1cmUtdGFyZ2V0LWxpYnJ4Ci1hbGwtdGFyZ2V0LWxpYmcrKzogY29uZmlndXJlLXRhcmdldC1saWJnKysgYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmlvIGFsbC10YXJnZXQtbGlicnggYWxsLXRhcmdldC1saWJzdGRjKysKLWNvbmZpZ3VyZS10YXJnZXQtbGliZ2xvc3M6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliZ2xvc3M6IGNvbmZpZ3VyZS10YXJnZXQtbGliZ2xvc3MgY29uZmlndXJlLXRhcmdldC1uZXdsaWIKLWNvbmZpZ3VyZS10YXJnZXQtbGliaW86ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliaW86IGNvbmZpZ3VyZS10YXJnZXQtbGliaW8gYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYgotY2hlY2stdGFyZ2V0LWxpYmlvOgotYWxsLWxpYmd1aTogYWxsLXRjbCBhbGwtdGsgYWxsLXRjbDguMSBhbGwtdGs4LjEgYWxsLWl0Y2wKLWFsbC1saWJpYmVydHk6Ci1jb25maWd1cmUtdGFyZ2V0LWxpYnJ4OiAkKEFMTF9HQ0MpIGNvbmZpZ3VyZS10YXJnZXQtbmV3bGliCi1hbGwtdGFyZ2V0LWxpYnJ4OiBjb25maWd1cmUtdGFyZ2V0LWxpYnJ4Ci1jb25maWd1cmUtdGFyZ2V0LWxpYnN0ZGMrKzogJChBTExfR0NDKQotYWxsLXRhcmdldC1saWJzdGRjKys6IGNvbmZpZ3VyZS10YXJnZXQtbGlic3RkYysrIGFsbC1nYXMgYWxsLWxkIGFsbC1nY2MgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1uZXdsaWIgYWxsLXRhcmdldC1saWJpbwotY29uZmlndXJlLXRhcmdldC1saWJzdHViOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWxpYnN0dWI6IGNvbmZpZ3VyZS10YXJnZXQtbGlic3R1YgotYWxsLWxpYnRvb2w6Ci1hbGwtbTQ6IGFsbC1saWJpYmVydHkKLWFsbC1tYWtlOiBhbGwtbGliaWJlcnR5Ci1hbGwtbW1hbGxvYzoKLWNvbmZpZ3VyZS10YXJnZXQtbmV3bGliOiAkKEFMTF9HQ0MpCi1jb25maWd1cmUtdGFyZ2V0LWxpYnRlcm1jYXA6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbmV3bGliOiBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYiBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtZ2NjCi1hbGwtdGFyZ2V0LWxpYnRlcm1jYXA6IGNvbmZpZ3VyZS10YXJnZXQtbGlidGVybWNhcCBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtZ2NjCi1hbGwtb3Bjb2RlczogYWxsLWJmZCBhbGwtbGliaWJlcnR5Ci1hbGwtcGF0Y2g6IGFsbC1saWJpYmVydHkKLWFsbC1wZXJsOgotYWxsLXBybXM6IGFsbC1saWJpYmVydHkKLWFsbC1yY3M6Ci1hbGwtcmVhZGxpbmU6Ci1hbGwtcmVjb2RlOiBhbGwtbGliaWJlcnR5Ci1hbGwtc2VkOiBhbGwtbGliaWJlcnR5Ci1hbGwtc2VuZC1wcjogYWxsLXBybXMKLWFsbC1zaGVsbHV0aWxzOgotYWxsLXNpbTogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzIGFsbC1yZWFkbGluZQotYWxsLXRhcjogYWxsLWxpYmliZXJ0eQotYWxsLXRjbDoKLWFsbC10Y2w4LjE6Ci1hbGwtdGNsWDogYWxsLXRjbCBhbGwtdGsKLWFsbC10azogYWxsLXRjbAotYWxsLXRrOC4xOiBhbGwtdGNsOC4xCi1hbGwtdGV4aW5mbzogYWxsLWxpYmliZXJ0eQotYWxsLXRleHR1dGlsczoKLWFsbC10Z2FzOiBhbGwtbGliaWJlcnR5IGFsbC1iZmQgYWxsLW9wY29kZXMKLWFsbC10aW1lOgotYWxsLXRpeDogYWxsLXRjbCBhbGwtdGsgYWxsLXRjbDguMSBhbGwtdGs4LjEKLWFsbC13ZGlmZjoKLWFsbC10YXJnZXQtd2luc3VwOiBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgY29uZmlndXJlLXRhcmdldC13aW5zdXAKLWNvbmZpZ3VyZS10YXJnZXQtd2luc3VwOiBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYgotYWxsLXV1ZGVjb2RlOiBhbGwtbGliaWJlcnR5Ci1hbGwtemlwOgotY29uZmlndXJlLXRhcmdldC1saWJpYmVydHk6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliaWJlcnR5OiBjb25maWd1cmUtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtZ2NjIGFsbC1sZCBhbGwtdGFyZ2V0LW5ld2xpYgotYWxsLXRhcmdldDogJChBTExfVEFSR0VUX01PRFVMRVMpCi1pbnN0YWxsLXRhcmdldDogJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKQotIyMjIG90aGVyIHN1cHBvcnRpbmcgdGFyZ2V0cwotCi1NQUtFRElSUz0gXAotCSQocHJlZml4KSBcCi0JJChleGVjX3ByZWZpeCkKLS5QSE9OWTogaW5zdGFsbGRpcnMKLWluc3RhbGxkaXJzOiBta2luc3RhbGxkaXJzCi0JJChTSEVMTCkgJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChNQUtFRElSUykKLQotZGlyLmluZm86IGRvLWluc3RhbGwtaW5mbwotCWlmIFsgLWYgJChzcmNkaXIpL3RleGluZm8vZ2VuLWluZm8tZGlyIF0gOyB0aGVuIFwKLQkgICQoc3JjZGlyKS90ZXhpbmZvL2dlbi1pbmZvLWRpciAkKGluZm9kaXIpICQoc3JjZGlyKS90ZXhpbmZvL2Rpci5pbmZvLXRlbXBsYXRlID4gZGlyLmluZm8ubmV3IDsgXAotCSAgbXYgLWYgZGlyLmluZm8ubmV3IGRpci5pbmZvIDsgXAotCWVsc2UgdHJ1ZSA7IFwKLQlmaQotCi1kaXN0OgotCUBlY2hvICJCdWlsZGluZyBhIGZ1bGwgZGlzdHJpYnV0aW9uIG9mIHRoaXMgdHJlZSBpc24ndCBkb25lIgotCUBlY2hvICJ2aWEgJ21ha2UgZGlzdCcuICBDaGVjayBvdXQgdGhlIGV0Yy8gc3ViZGlyZWN0b3J5IiAKLQotZXRhZ3MgdGFnczogVEFHUwotCi0jIFJpZ2h0IG5vdyB0aGlzIGp1c3QgYnVpbGRzIFRBR1MgaW4gZWFjaCBzdWJkaXJlY3RvcnkuICBlbWFjczE5IGhhcyB0aGUKLSMgYWJpbGl0eSB0byB1c2Ugc2V2ZXJhbCB0YWdzIGZpbGVzIGF0IG9uY2UsIHNvIHRoZXJlIGlzIHByb2JhYmx5IG5vIG5lZWQKLSMgdG8gY29tYmluZSB0aGVtIGludG8gb25lIGJpZyBUQUdTIGZpbGUgKGxpa2UgQ1ZTIDEuMyBkb2VzKS4gIFdlIGNvdWxkCi0jIChpZiB3ZSBmZWx0IGxpa2UgaXQpIGhhdmUgdGhpcyBNYWtlZmlsZSB3cml0ZSBhIHBpZWNlIG9mIGVsaXNwIHdoaWNoCi0jIHRoZSB1c2VyIGNvdWxkIGxvYWQgdG8gdGVsbCBlbWFjczE5IHdoZXJlIGFsbCB0aGUgVEFHUyBmaWxlcyB3ZSBqdXN0Ci0jIGJ1aWx0IGFyZS4KLVRBR1M6IGRvLVRBR1MKLQotIyB3aXRoIHRoZSBnbnUgbWFrZSwgdGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkuCi0KLU1ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWd1cmUuaW4gJChob3N0X21ha2VmaWxlX2ZyYWcpICQodGFyZ2V0X21ha2VmaWxlX2ZyYWcpICQoZ2NjX3ZlcnNpb25fdHJpZ2dlcikKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIwotIyBTdXBwb3J0IGZvciBidWlsZGluZyBuZXQgcmVsZWFzZXMKLQotIyBGaWxlcyBpbiBkZXZvIHVzZWQgaW4gYW55IG5ldCByZWxlYXNlLgotIyBDaGFuZ2VMb2cgb21pdHRlZCBiZWNhdXNlIGl0IG1heSByZWZlciB0byBmaWxlcyB3aGljaCBhcmUgbm90IGluIHRoaXMKLSMgZGlzdHJpYnV0aW9uIChwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciB0byBpbmNsdWRlIGl0IGFueXdheSkuCi1ERVZPX1NVUFBPUlQ9IFJFQURNRSBNYWtlZmlsZS5pbiBjb25maWd1cmUgY29uZmlndXJlLmluIFwKLQljb25maWcuZ3Vlc3MgY29uZmlnLmlmIGNvbmZpZy5zdWIgY29uZmlnIG1vdmUtaWYtY2hhbmdlIFwKLQltcHctUkVBRE1FIG1wdy1idWlsZC5pbiBtcHctY29uZmlnLmluIG1wdy1jb25maWd1cmUgbXB3LWluc3RhbGwgXAotCUNPUFlJTkcgQ09QWUlORy5MSUIgaW5zdGFsbC1zaCBjb25maWctbWwuaW4gc3ltbGluay10cmVlIFwKLQlta2luc3RhbGxkaXJzIGx0Y29uZmlnIGx0bWFpbi5zaCBtaXNzaW5nIHlsd3JhcAotCi0jIEZpbGVzIGluIGRldm8vZXRjIHVzZWQgaW4gYW55IG5ldCByZWxlYXNlLgotIyBDaGFuZ2VMb2cgb21pdHRlZCBiZWNhdXNlIGl0IG1heSByZWZlciB0byBmaWxlcyB3aGljaCBhcmUgbm90IGluIHRoaXMKLSMgZGlzdHJpYnV0aW9uIChwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciB0byBpbmNsdWRlIGl0IGFueXdheSkuCi1FVENfU1VQUE9SVD0gTWFrZWZpbGUuaW4gY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBzdGFuZGFyZHMudGV4aSBcCi0JbWFrZS1zdGRzLnRleGkgc3RhbmRhcmRzLmluZm8qCi0KLSMgV2hlbiB5b3UgdXNlIGBtYWtlIHNldHVwLWRpcnMnIG9yIGBtYWtlIHRheicgeW91IHNob3VsZCBhbHdheXMgcmVkZWZpbmUKLSMgdGhpcyBtYWNyby4KLVNVUFBPUlRfRklMRVMgPSBsaXN0LW9mLXN1cHBvcnQtZmlsZXMtZm9yLXRvb2wtaW4tcXVlc3Rpb24KLQotLlBIT05ZOiB0YXoKLQotdGF6OiAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSB0ZXhpbmZvL3RleGluZm8udGV4Ci0JIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gYSBmZXcgcGxhY2VzLgotCXNlZCAtZSAnL15hbGxcLm5vcm1hbDogL3MvXGFsbC10ZXhpbmZvIC8vJyBcCi0JICAgIC1lICcvXglpbnN0YWxsLXRleGluZm8gL2QnIFwKLQk8TWFrZWZpbGUuaW4gPnRtcAotCW12IC1mIHRtcCBNYWtlZmlsZS5pbgotCSMKLQkuL2NvbmZpZ3VyZSBzdW40Ci0JWyAteiAiJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIiBdIFwKLQkgIHx8ICQoTUFLRSkgJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIEFMTF9HQ0M9IiIgXAotCSAgICBDQ19GT1JfVEFSR0VUPSIkKENDKSIgQ1hYX0ZPUl9UQVJHRVQ9IiQoQ1hYKSIKLQkjIE1ha2UgbGlua3MsIGFuZCBydW4gIm1ha2UgZGlzdHN0dWZmIiBvciAibWFrZSBpbmZvIiB3aGVuIG5lZWRlZC4KLQlybSAtcmYgcHJvdG8tdG9wbGV2IDsgbWtkaXIgcHJvdG8tdG9wbGV2Ci0Jc2V0IC1lIDsgZGlycz0iJChUT09MKSAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSIgOyBcCi0JZm9yIGQgaW4gJCRkaXJzIDsgZG8gXAotCSAgaWYgWyAtZCAkJGQgXTsgdGhlbiBcCi0JICAgIGlmIFsgISAtZiAkJGQvTWFrZWZpbGUgXSA7IHRoZW4gdHJ1ZSA7IFwKLQkgICAgZWxpZiBncmVwICdeZGlzdHN0dWZmOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKLQkJKGNkICQkZCA7ICQoTUFLRSkgZGlzdHN0dWZmICkgfHwgZXhpdCAxIDsgXAotCSAgICBlbGlmIGdyZXAgJ15pbmZvOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKLQkgICAgICAgIChjZCAkJGQgOyAkKE1BS0UpIGluZm8gKSB8fCBleGl0IDEgOyBcCi0JICAgIGZpIDsgXAotCSAgICBpZiBbIC1kICQkZC9wcm90by0kJGQuZGlyIF07IHRoZW4gXAotCSAgICAgIGxuIC1zIC4uLyQkZC9wcm90by0kJGQuZGlyIHByb3RvLXRvcGxldi8kJGQgOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGxuIC1zIC4uLyQkZCBwcm90by10b3BsZXYvJCRkIDsgXAotCSAgICBmaSA7IFwKLQkgIGVsc2UgbG4gLXMgLi4vJCRkIHByb3RvLXRvcGxldi8kJGQgOyBmaSA7IFwKLQlkb25lCi0JY2QgZXRjIDsgJChNQUtFKSBpbmZvCi0JJChNQUtFKSBkaXN0Y2xlYW4KLQkjCi0JbWtkaXIgcHJvdG8tdG9wbGV2L2V0YwotCShjZCBwcm90by10b3BsZXYvZXRjOyBcCi0JIGZvciBpIGluICQoRVRDX1NVUFBPUlQpOyBkbyBcCi0JCWxuIC1zIC4uLy4uL2V0Yy8kJGkgLiA7IFwKLQkgZG9uZSkKLQkjCi0JIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gY29uZmlndXJhYmxlIGRpcnMKLQlybSBwcm90by10b3BsZXYvY29uZmlndXJlLmluCi0Jc2VkIC1lICcvXmhvc3RfdG9vbHM9L3MvdGV4aW5mbyAvLycgXAotCSAgICA8Y29uZmlndXJlLmluID5wcm90by10b3BsZXYvY29uZmlndXJlLmluCi0JIwotCW1rZGlyIHByb3RvLXRvcGxldi90ZXhpbmZvCi0JbG4gLXMgLi4vLi4vdGV4aW5mby90ZXhpbmZvLnRleAkJcHJvdG8tdG9wbGV2L3RleGluZm8vCi0JaWYgdGVzdCAtciB0ZXhpbmZvL3V0aWwvdGV4M3BhdGNoIDsgdGhlbiBcCi0JICBta2RpciBwcm90by10b3BsZXYvdGV4aW5mby91dGlsICYmIFwKLQkgIGxuIC1zIC4uLy4uLy4uL3RleGluZm8vdXRpbC90ZXgzcGF0Y2gJcHJvdG8tdG9wbGV2L3RleGluZm8vdXRpbCA7IFwKLQllbHNlIHRydWU7IGZpCi0JY2htb2QgLVIgb2c9dSAuIHx8IGNobW9kIG9nPXUgYGZpbmQgLiAtcHJpbnRgCi0JaWYgZ3JlcCBBTV9JTklUX0FVVE9NQUtFICQoVE9PTCkvY29uZmlndXJlLmluID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICB2ZXI9YHNlZCA8ICQoVE9PTCkvY29uZmlndXJlLmluIC1uICdzL0FNX0lOSVRfQVVUT01BS0VbXixdKiwgKlwoW14pXSpcKSkvXDEvcCdgOyBcCi0JZWxzZSBcCi0JICB2ZXI9YHNlZCA8JChUT09MKS9NYWtlZmlsZS5pbiAtbiAncy9eVkVSU0lPTiAqPSAqLy9wJ2A7IFwKLQlmaTsgXAotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gZG8tdGFyLWJ6MiBUT09MPSQoVE9PTCkgVkVSPSQkdmVyCi0KLWRvLXRhci1iejI6Ci0JZWNobyAiPT0+IE1ha2luZyAkKFRPT0wpLSQoVkVSKS50YXIuYnoyIgotCS1ybSAtZiAkKFRPT0wpLSQoVkVSKQotCWxuIC1zIHByb3RvLXRvcGxldiAkKFRPT0wpLSQoVkVSKQotCXRhciBjZmggJChUT09MKS0kKFZFUikudGFyICQoVE9PTCktJChWRVIpCi0JJChCWklQUFJPRykgLXYgLTkgJChUT09MKS0kKFZFUikudGFyCi0KLVRFWElORk9fU1VQUE9SVD0gdGV4aW5mby90ZXhpbmZvLnRleAotRElTVF9TVVBQT1JUPSAkKERFVk9fU1VQUE9SVCkgJChURVhJTkZPX1NVUFBPUlQpCi0KLS5QSE9OWTogZ2FzLnRhci5iejIKLUdBU19TVVBQT1JUX0RJUlM9IGJmZCBpbmNsdWRlIGxpYmliZXJ0eSBvcGNvZGVzIGludGwgc2V0dXAuY29tIG1ha2VmaWxlLnZtcyBta2RlcAotZ2FzLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKEdBU19TVVBQT1JUX0RJUlMpIGdhcwotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9Z2FzIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChHQVNfU1VQUE9SVF9ESVJTKSIKLQotIyBUaGUgRlNGICJiaW51dGlscyIgcmVsZWFzZSBpbmNsdWRlcyBncHJvZiBhbmQgbGQuCi0uUEhPTlk6IGJpbnV0aWxzLnRhci5iejIKLUJJTlVUSUxTX1NVUFBPUlRfRElSUz0gYmZkIGdhcyBpbmNsdWRlIGxpYmliZXJ0eSBvcGNvZGVzIGxkIGdwcm9mIGludGwgc2V0dXAuY29tIG1ha2VmaWxlLnZtcyBta2RlcAotYmludXRpbHMudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpICQoQklOVVRJTFNfU1VQUE9SVF9ESVJTKSBiaW51dGlscwotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9YmludXRpbHMgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKEJJTlVUSUxTX1NVUFBPUlRfRElSUykiCi0KLS5QSE9OWTogZ2FzK2JpbnV0aWxzLnRhci5iejIKLUdBU0JfU1VQUE9SVF9ESVJTPSAkKEdBU19TVVBQT1JUX0RJUlMpIGJpbnV0aWxzIGxkIGdwcm9mCi1nYXMrYmludXRpbHMudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpICQoR0FTQl9TVVBQT1JUX0RJUlMpIGdhcwotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9Z2FzIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChHQVNCX1NVUFBPUlRfRElSUykiCi0KLS5QSE9OWTogbGliZysrLnRhci5iejIKLUxJQkdYWF9TVVBQT1JUX0RJUlM9aW5jbHVkZSBsaWJzdGRjKysgbGliaW8gbGlicnggbGliaWJlcnR5Ci1saWJnKysudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpIGxpYmcrKwotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9bGliZysrIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChMSUJHWFhfU1VQUE9SVF9ESVJTKSIKLQotR05BVFNfU1VQUE9SVF9ESVJTPWluY2x1ZGUgbGliaWJlcnR5IHNlbmQtcHIKLWduYXRzLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKEdOQVRTX1NVUFBPUlRfRElSUykgZ25hdHMKLQkkKE1BS0UpIC1mICBNYWtlZmlsZS5pbiB0YXogVE9PTD1nbmF0cyBcCi0JCVNVUFBPUlRfRklMRVM9IiQoR05BVFNfU1VQUE9SVF9ESVJTKSIKLQotLlBIT05ZOiBnZGIudGFyLmJ6MgotR0RCX1NVUFBPUlRfRElSUz0gYmZkIGluY2x1ZGUgbGliaWJlcnR5IG1tYWxsb2Mgb3Bjb2RlcyByZWFkbGluZSBzaW0gdXRpbHMgaW50bAotZ2RiLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKEdEQl9TVVBQT1JUX0RJUlMpIGdkYgotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9Z2RiIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChHREJfU1VQUE9SVF9ESVJTKSIKLQotLlBIT05ZOiBuZXdsaWIudGFyLmJ6MgotTkVXTElCX1NVUFBPUlRfRElSUz1saWJnbG9zcwotIyB0YXogY29uZmlndXJlcyBmb3IgdGhlIHN1bjQgdGFyZ2V0IHdoaWNoIHdvbid0IGNvbmZpZ3VyZSBuZXdsaWIuCi0jIFdlIG5lZWQgbmV3bGliIGNvbmZpZ3VyZWQgc28gdGhhdCB0aGUgLmluZm8gZmlsZXMgYXJlIG1hZGUuCi0jIFVuZm9ydHVuYXRlbHksIGl0IGlzIG5vdCBlbm91Z2ggdG8ganVzdCBjb25maWd1cmUgbmV3bGliIHNlcGFyYXRlbHk6Ci0jIHRheiB3aWxsIGJ1aWxkIHRoZSAuaW5mbyBmaWxlcyBidXQgc2luY2UgU1VCRElSUyB3b24ndCBjb250YWluIG5ld2xpYiwKLSMgZGlzdGNsZWFuIHdvbid0IGJlIHJ1biAobGVhdmluZyBNYWtlZmlsZSwgY29uZmlnLnN0YXR1cywgYW5kIHRoZSB0bXAgZmlsZXMKLSMgdXNlZCBpbiBidWlsZGluZyB0aGUgLmluZm8gZmlsZXMsIGVnOiAqLmRlZiwgKi5yZWYpLgotIyBUaGUgcHJvYmxlbSBpc24ndCBzb2x2YWJsZSBob3dldmVyIHdpdGhvdXQgYSBsb3Qgb2YgZXh0cmEgd29yayBiZWNhdXNlCi0jIHRhcmdldCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGluIHN1YmRpciAkKHRhcmdldF9hbGlhcykgd2hpY2ggZ2V0cyBudWtlZCBkdXJpbmcKLSMgdGhlIG1ha2UgZGlzdGNsZWFuLiAgRm9yIG5vdyBwdW50IG9uIHRoZSBpc3N1ZSBvZiBzaGlwcGluZyBuZXdsaWIgaW5mbyBmaWxlcwotIyB3aXRoIG5ld2xpYiBuZXQgcmVsZWFzZXMgYW5kIHdhaXQgZm9yIGEgZGF5IHdoZW4gc29tZSBuYXRpdmUgdGFyZ2V0IChzdW40PykKLSMgc3VwcG9ydHMgbmV3bGliIChpZiBvbmx5IG1pbmltYWxseSkuCi1uZXdsaWIudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpICQoTkVXTElCX1NVUFBPUlRfRElSUykgbmV3bGliCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1uZXdsaWIgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKE5FV0xJQl9TVVBQT1JUX0RJUlMpIiBcCi0JCURFVk9fU1VQUE9SVD0iJChERVZPX1NVUFBPUlQpIENPUFlJTkcuTkVXTElCIiBuZXdsaWIKLQotLk5PRVhQT1JUOgotTUFLRU9WRVJSSURFUz0KLQotIyBlbmQgb2YgTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwZTQzNi4uMDAwMDAwMAotLS0gYS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0JCSAgIFJFQURNRSBmb3IgR05VIGRldmVsb3BtZW50IHRvb2xzCi0KLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHZhcmlvdXMgR05VIGNvbXBpbGVycywgYXNzZW1ibGVycywgbGlua2VycywgCi1kZWJ1Z2dlcnMsIGV0Yy4sIHBsdXMgdGhlaXIgc3VwcG9ydCByb3V0aW5lcywgZGVmaW5pdGlvbnMsIGFuZCBkb2N1bWVudGF0aW9uLgotCi1JZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGFzIHBhcnQgb2YgYSBHREIgcmVsZWFzZSwgc2VlIHRoZSBmaWxlIGdkYi9SRUFETUUuCi1JZiB3aXRoIGEgYmludXRpbHMgcmVsZWFzZSwgc2VlIGJpbnV0aWxzL1JFQURNRTsgIGlmIHdpdGggYSBsaWJnKysgcmVsZWFzZSwKLXNlZSBsaWJnKysvUkVBRE1FLCBldGMuICBUaGF0J2xsIGdpdmUgeW91IGluZm8gYWJvdXQgdGhpcwotcGFja2FnZSAtLSBzdXBwb3J0ZWQgdGFyZ2V0cywgaG93IHRvIHVzZSBpdCwgaG93IHRvIHJlcG9ydCBidWdzLCBldGMuCi0KLUl0IGlzIG5vdyBwb3NzaWJsZSB0byBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSBhbmQgYnVpbGQgYSB2YXJpZXR5IG9mCi10b29scyB3aXRoIG9uZSBjb21tYW5kLiAgVG8gYnVpbGQgYWxsIG9mIHRoZSB0b29scyBjb250YWluZWQgaGVyZWluLAotcnVuIHRoZSBgYGNvbmZpZ3VyZScnIHNjcmlwdCBoZXJlLCBlLmcuOgotCi0JLi9jb25maWd1cmUgCi0JbWFrZQotCi1UbyBpbnN0YWxsIHRoZW0gKGJ5IGRlZmF1bHQgaW4gL3Vzci9sb2NhbC9iaW4sIC91c3IvbG9jYWwvbGliLCBldGMpLAotdGhlbiBkbzoKLQltYWtlIGluc3RhbGwKLQotKElmIHRoZSBjb25maWd1cmUgc2NyaXB0IGNhbid0IGRldGVybWluZSB5b3VyIHR5cGUgb2YgY29tcHV0ZXIsIGdpdmUgaXQKLXRoZSBuYW1lIGFzIGFuIGFyZ3VtZW50LCBmb3IgaW5zdGFuY2UgYGAuL2NvbmZpZ3VyZSBzdW40JycuICBZb3UgY2FuCi11c2UgdGhlIHNjcmlwdCBgYGNvbmZpZy5zdWInJyB0byB0ZXN0IHdoZXRoZXIgYSBuYW1lIGlzIHJlY29nbml6ZWQ7IGlmCi1pdCBpcywgY29uZmlnLnN1YiB0cmFuc2xhdGVzIGl0IHRvIGEgdHJpcGxldCBzcGVjaWZ5aW5nIENQVSwgdmVuZG9yLAotYW5kIE9TLikKLQotSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBjb21waWxlciBvbiB5b3VyIHN5c3RlbSwgaXQgaXMgb2Z0ZW4gYmVzdCB0bwotZXhwbGljaXRseSBzZXQgQ0MgaW4gdGhlIGVudmlyb25tZW50IGJlZm9yZSBydW5uaW5nIGNvbmZpZ3VyZSwgYW5kIHRvCi1hbHNvIHNldCBDQyB3aGVuIHJ1bm5pbmcgbWFrZS4gIEZvciBleGFtcGxlIChhc3N1bWluZyBzaC9iYXNoL2tzaCk6Ci0KLQlDQz1nY2MgLi9jb25maWd1cmUKLQltYWtlCi0KLUEgc2ltaWxhciBleGFtcGxlIHVzaW5nIGNzaDoKLQotCXNldGVudiBDQyBnY2MKLQkuL2NvbmZpZ3VyZQotCW1ha2UKLQotTXVjaCBvZiB0aGUgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBlbmNsb3NlZCBpcyBjb3B5cmlnaHQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIG9yCi1DT1BZSU5HLkxJQiBpbiB0aGUgdmFyaW91cyBkaXJlY3RvcmllcywgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0ZXJtcyB1bmRlciB3aGljaCB5b3UgY2FuIGNvcHkgdGhlIGZpbGVzLgotCi1SRVBPUlRJTkcgQlVHUzogQWdhaW4sIHNlZSBnZGIvUkVBRE1FLCBiaW51dGlscy9SRUFETUUsIGV0Yy4sIGZvciBpbmZvCi1vbiB3aGVyZSBhbmQgaG93IHRvIHJlcG9ydCBwcm9ibGVtcy4KZGlmZiAtLWdpdCBhL2JmZC9DT1BZSU5HIGIvYmZkL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvYmZkL0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwotdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQotdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCi15b3VyIHByb2dyYW1zLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91Ci1kaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgotcmlnaHRzLgotCi0gIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKLSgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCi1kaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgotCi0gIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwotdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKLWF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCi1wcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCi1wcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKLXBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuCi0MCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0MCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCi1TZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCi0gICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCi0gICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCi0gICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQotICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCi0gICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKLSAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Ci1hc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KLWNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQotYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCi1hY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50Ci1hY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQwKLSAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1leGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0Ci1vdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKLXZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KLUhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCi10aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAotcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KLXRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotCi0gIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KLWFwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQwKLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0JICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKLWZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi0gIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Ci10byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9iZmQvQ2hhbmdlTG9nIGIvYmZkL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5MTM2OC4uMDAwMDAwMAotLS0gYS9iZmQvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNTU0MiArMCwwIEBACi0xOTk5LTEyLTEwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lzX2RlZmluZWRfYXJjaGl2ZV9zeW1ib2wpOiBOZXcKLQlmdW5jdGlvbjogRGVjaWRlIGlmIGEgc3ltYm9sLCBpbiBhbiBhcmNoaXZlIG1hcCBpcyB0aGVyZQotCWJlY2F1c2UgaXQgaXMgZGVmaW5lZCBpbiB0aGUgYXJjaGl2ZSBlbGVtZW50LCBvciBiZWNhdXNlIGl0IGlzCi0JanVzdCBhbm90aGVyIGNvbW1vbiBkZWNsYXJhdGlvbiBvZiBpdC4KLQkoZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IFVzZQotCWVsZl9saW5rX2lzX2RlZmluZWRfYXJjaGl2ZV9zeW1ib2wgdG8gZGVjaWRlIGlmIGFuIGFyY2hpdmUKLQllbGVtZW50IGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBjb21tb24gc3ltYm9sIHNob3VsZCBiZQotCWxpbmtlZCBpbiBvciBub3QuCi0KLTE5OTktMTItMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaDogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogdGFyZ2V0cy5jOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBsaWJiZmQtaW4yLmg6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIGxpYmJmZC5oOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBlbGZ4eC10YXJnZXQuaDogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogYXJjaGl2ZS5jOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBhb3V0LXRhcmdldC5oOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBhb3V0LXRpYzMwLmg6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIGJmZC5jOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBjb2ZmLWFscGhhLmM6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIGNvZmYtcnM2MDAwLmM6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQkqIGVsZjY0LW1pcHMuYzogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogaWVlZS5jOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBsaWJlY29mZi5oOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBvYXN5cy5jOiBSZXZlcnQgcHJldmlvdXMgcGF0Y2guCi0JKiBzb20uYzogUmV2ZXJ0IHByZXZpb3VzIHBhdGNoLgotCSogdm1zLmM6IFJldmVydCBwcmV2aW91cyBwYXRjaC4KLQotMTk5OS0xMi0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogQWRkIGFuIGFyY2hpdmUKLSAgICAgICAgZWxlbWVudCBldmVuIGlmIGNvbnRhaW5zIGEgc3ltYm9sIHdoaWNoIGlzIGN1cnJlbnRseSBvbmx5Ci0gICAgICAgIGNvbnNpZGVyZWQgdG8gYmUgYSBjb21tb24uCi0KLQkqIHRhcmdldHMuYyAoc3RydWN0IGJmZF90YXJnZXQpOiBBZGQgbmV3IGZpZWxkCi0JX2JmZF9hbGxvd19jb21tb25zX2luX2FybWFwLgotCSogYmZkLWluMi5oOlJlZ2VuZXJhdGUuCi0KLQkqIGxpYmJmZC1pbjIuaCAoX2JmZF9ub2FyY2hpdmVfYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6Ci0JRGVmaW5lLgotCSAoX2JmZF9hcmNoaXZlX2JzZF9hbGxvd19jb21tb25zX2luX2FybWFwKTogRGVmaW5lLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZnh4LXRhcmdldC5oOiBJZiB1c2luZyBDT0ZGIGFyY2hpdmUgbWFwLCBvdmVycmlkZQotCWRlZmluaXRpb24gb2YgYWxsb3dfY29tbW9uc19pbl9hcm1hcCBhbmQgcmVwbGFjZSB3aXRoCi0JYmZkX2ZhbHNlLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IERvIG5vdCBwbGFjZSBjb21tb24KLQlzeW1ib2xzIGludG8gdGhlIGFyY2hpdmUgbWFwIHVubGVzcyBfYmZkX2FsbG93X2NvbW1vbnNfaW5fYXJtYXAKLQlyZXR1cm5zIHRydWUuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2FsbG93X2NvbW1vbnNfaW5fYXJtYXApOiBEZWZpbmUuCi0JKiBhb3V0LXRpYzMwLmggKE1ZX2FsbG93X2NvbW1vbnNfaW5fYXJtYXApOiBEZWZpbmUuCi0JKiBiZmQuYyAoYmZkX2FsbG93X2NvbW1vbnNfaW5fYXJtYXApOiBEZWZpbmUuCi0JKiBjb2ZmLWFscGhhLmggKGFscGhhX2Vjb2ZmX2FsbG93X2NvbW1vbnNfaW5fYXJtYXApOiBEZWZpbmUuCi0JKiBjb2ZmLXJzNjAwMC5oICh4Y29mZl9hbGxvd19jb21tb25zX2luX2FybWFwKTogRGVmaW5lLgotCSogZWxmNjQtbWlwcy5jIChiZmRfZWxmNjRfYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6IERlZmluZS4KLQkqIGllZWUuYyAoaWVlZV9lY29mZl9hbGxvd19jb21tb25zX2luX2FybWFwKTogRGVmaW5lLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9hbGxvd19jb21tb25zX2luX2FybWFwKTogRGVmaW5lLgotCSogb2FzeXMuYyAob2FzeXNfYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6IERlZmluZS4KLQkqIHNvbS5jIChzb21fYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6IERlZmluZS4KLQkqIHZtcy5jICh2bXNfYWxsb3dfY29tbW9uc19pbl9hcm1hcCk6IERlZmluZS4KLQotMTk5OS0xMi0wNyAgSmltIEJsYW5keSAgPGppbWJAY3lnbnVzLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBTU0UgcmVnaXN0ZXJzIGluIEVMRiBjb3JlIGZpbGVzLgotCSogZWxmLmMgKGVsZmNvcmVfbWFrZV9ub3RlX3BzZXVkb3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGVsZmNvcmVfZ3Jva19wcmZwcmVnKTogVXNlIGl0LgotCShlbGZjb3JlX2dyb2tfcHJ4ZnByZWcpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZmNvcmVfZ3Jva19ub3RlKTogUmVjb2duaXplIExpbnV4IE5UX1BSWEZQUkVHIG5vdGVzLgotCi0xOTk5LTEyLTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IERpdmlkZSBSX01JUFNfUEMxNgotCXZhbHVlIGJ5IDQgYmVmb3JlIHN0b3JpbmcgaXQgYmFjayBpbiB0aGUgZmllbGQuICBGcm9tCi0JS291bmRpbnlhLiBLIDxra0BkZGVvcmcuc29mdC5uZXQ+LgotCi1UdWUgTm92IDMwIDIyOjQxOjE0IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfYW0zMyk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNwdS1tMTAzMDAuYyAoYmZkX2FtMzNfYXJjaCk6IEFkZCB0byB0aGUgbW4xMDMgYXJjaGl0ZWN0dXJlIGxpc3QKLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEhhbmRsZSBhbTMzIGluc3RydWN0aW9ucy4KLQkoY29tcHV0ZV9mdW5jdGlvbl9pbmZvKTogSGFuZGxlIGFkZGl0aW9uYWwgcmVnaXN0ZXJzIHNhdmVkIGJ5Ci0JbW92bSBvbiB0aGUgYW0zMy4KLQkoZWxmX21uMTAzMDBfbWFjaCk6IEhhbmRsZSBFX01OMTAzMDBfTUFDSF9BTTMzLgotCShfYmZkX21uMTAzMDBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBIYW5kbGUgYmZkX21hY2hfYW0zMy4KLQotMTk5OS0xMS0yOSAgSmltIEJsYW5keSAgPGppbWJAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9nZXRfZWxmX3BoZHJzLCBiZmRfZ2V0X2VsZl9waGRyX3VwcGVyX2JvdW5kKTogTmV3Ci0JZnVuY3Rpb25zLgotCSogYmZkLWluMi5oIChiZmRfZ2V0X2VsZl9waGRycywgYmZkX2dldF9lbGZfcGhkcl91cHBlcl9ib3VuZCk6IE5ldwotCWRlY2xhcmF0aW9ucy4KLQotMTk5OS0xMS0yNyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUwpOiBOZXcgcmVsb2NhdGlvbiBmb3IKLQlpbnRlcm5hbCB1c2Ugd2l0aGluIGdhcyBmb3IgYWxwaGEgZXhwbGljaXQgcmVsb2NhdGlvbnMuCi0JKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFKTogRGl0dG8uCi0JKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkYpOiBEaXR0by4KLQkoQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUik6IERpdHRvLgotCShCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1ApOiBEaXR0by4KLQkoQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxISUdIKTogRGl0dG8uCi0JKEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMTE9XKTogRGl0dG8uCi0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jX21hcCk6IEFkZCBtYXBwaW5ncyBmb3IKLQlCRkRfUkVMT0NfQUxQSEFfVVNFUl8qLgotCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZS4KLQotMTk5OS0xMS0yNiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChlbGZjb3JlX3JlYWRfbm90ZXMpOiBBZGQgcHJvdG90eXBlIGZvciBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIpOiBSZW5hbWVkIGZyb20gYmZkX3NlY3Rpb25fZnJvbV9waGRyLgotCShiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBSZXBsYWNlbWVudCBmdW5jdGlvbiB0aGF0IGNhbGxzCi0JX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkciBmb3IgZ2VuZXJpYyBzZWdtZW50IHR5cGVzIGFuZAotCWJhY2tlbmQgZnVjbnRpb24gcG9pbnRlZCB0byBieSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkciBmb3IKLQliYWNrZW5kIHNwZWNpZmljIHNlZ21lbnQgdHlwZXMuCi0JKF9iZmRfZWxmY29yZV9zZWN0aW9uX2Zyb21fcGhkcik6IFJlbW92ZSBjYWxsIHRvIGVsZmNvcmVfcmVhZF9ub3RlcywKLQlub3cgY2FsbGVkIGJ5IF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIuICBOb3RlIHRoYXQgdGhpcyBmdW5jCi0JaXMgbm93IGp1c3QgYSBzdHViIGJldHdlZW4gdGhlIGNhbGxlciBhbmQgYmZkX3NlY3Rpb25fZnJvbV9waGRyLgotCQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZnVuY3Rpb24gcG9pbnRlcgotCWVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyLgotCShlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkcik6IEFkZCBwcm90b3R5cGUuCi0JCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBEZWZpbmUgZGVmYXVsdC4KLQkoZWxmTk5fYmVkKTogQWRkIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyLgotCi0xOTk5LTExLTI1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6ICBBZGQKLQlTRUNfQ09ERSBhbmQgU0VDX1JFQURPTkxZIGZsYWdzIHRvIGdsdWUgc2VjdGlvbnMuCi0KLQkqIGVsZjMyLWFybS5oIChiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6IEFkZAotCVNFQ19DT0RFIGFuZCBTRUNfUkVBRE9OTFkgZmxhZ3MgdG8gZ2x1ZSBzZWN0aW9ucy4KLQotMTk5OS0xMS0yMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdHlwbyBpbiBwcmV2aW91cwotCWRlbHRhLiAKLQotMTk5OS0xMS0xOSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX2NwdTMyX3BsdDBfZW50cnkpOiBGaXggZW5jb2RpbmcuCi0JKGVsZl9jcHUzMl9wbHRfZW50cnkpOiBMaWtld2lzZS4KLQotMTk5OS0xMS0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvKTogU3BlY2lhbCBjYXNlIGhhbmRsaW5nCi0JZm9yIFJWQSByZWxvY3MuCi0JKGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbik6IEluaXRpYWxpc2UgYWRkZW5kIHRvIDAuCi0JU3BlY2lhbCBjYXNlIHByb2Nlc3Npbmcgb2YgUlZBIHJlbG9jLgotCi0xOTk5LTExLTE3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVvcmRlciBjb2xsZWN0IGFuZAotCXR5cGVfY2hhbmdlX29rOyBhZGQgc2lnbl9leHRlbmRfdm1hLgotCSogZWxmMzItbWlwcy5jIChlbGZfYmFja2VuZF9zaWduX2V4dGVuZF92bWEpOiBEZWZpbmUuCi0JKiBlbGZjb2RlLmggKGVsZl9zd2FwX3N5bWJvbF9pbik6IE1pbmQgYmUtPnNpZ25fZXh0ZW5kX3ZtYS4KLQkoZWxmX3N3YXBfc2hkcl9pbiwgZWxmX3N3YXBfcGhkcl9pbik6IExpa2V3aXNlLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3NpZ25fZXh0ZW5kX3ZtYSk6IERlZmF1bHQuCi0JKGVsZk5OX2JlZCk6IEZvbGxvdyBzdHJ1dHVyZSBjaGFuZ2VzLgotCi0xOTk5LTExLTA5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9yZWFkKTogQ2hlY2sgcmVzdWx0IG9mIHJlYWQgYWdhaW5zdCBkZXNpcmVkIHJlc3VsdAotCXVzaW5nICE9LCBub3QgPC4KLQkoX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IGJmZF9lcnJvciBpZiB0aGUgc2VlayBpcwotCWludmFsaWQgY29tcGFyZWQgdG8gdGhlIHNlY3Rpb24gc2l6ZS4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX2RlYnVnKTogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGRlYnVnCi0JaW5mb3JtYXRpb24gcmlnaHQgaWYgdGhlcmUgaXMgbm8gZGF0YSBwYXJ0LgotCi1UdWUgTm92ICAyIDAxOjQ0OjQxIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9maXh1cF9mb3JtYXRzKTogSW1wcm92ZSBoYW5kbGluZyBvZiBSX0FVWF9VTldJTkQsCi0JUl9MSU5FVEFCLCBSX0xJTkVUQUJfRVNDLCBhbmQgUl9DT01NRU5ULgotCi0xOTk5LTEwLTI4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBNYWtlIGxhc3RfbG9jYWwgc2lnbmVkLgotCi0xOTk5LTEwLTI3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3RhYnMuYyAoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBNYWtlIHN1cmUgLnN0YWJzdHIgc2VjdGlvbgotCXN0YXJ0cyB3aXRoIGEgemVyby4KLQotU2F0IE9jdCAyMyAxNzozNjoxMiAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmM6IEFkZCBkZWZpbml0aW9ucyBiZmRfbWFjaF9kMTB2LCBiZmRfbWFjaF9kMTB2X3RzMiBhbmQKLSAJYmZkX21hY2hfZDEwdl90czMuCi0JKiBjcHUtZDEwdi5jIChkMTB2X3RzM19pbmZvLCBkMTB2X3RzMl9pbmZvKTogQWRkLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCQotMTk5OS0xMC0xNSAgQW5kcmV3IEhhbGV5ICA8YXBoQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMS5jIChwYXJzZV9kaWUpOiBGYWlsIHRvIHBhcnNlIGEgZGllIGlmIGl0cyBsZW5ndGggaXMgemVyby4KLQotU3VuIE9jdCAxNyAxNzoxOTowMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAoYmZkX2hwcGFfaW5zbjJmbXQpOiBDaGFuZ2UgdG8gcmV0dXJuIGFuIGludC4KLQotMTk5OS0xMC0wOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IFdoZW4gb3ZlcnJpZGluZyBhIHdlYWsgc3ltYm9sIHdpdGgKLQlhIGRlZmluZWQgc3ltYm9sIGluIGEgc2hhcmVkIGxpYnJhcnksIGNsZWFyIHRoZSBERUZfRFlOQU1JQyBmbGFnCi0JdG9vLgotCi1GcmkgT2N0ICA4IDEzOjAzOjQ1IDE5OTkgIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IFJfTUlQU19MSVRFUkFMCi0JcmVsb2NzIGFsc28gbmVlZCB0aGUgR1AgdmFsdWUuCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSB1bnBhaXJlZCBMTzE2IHJlbG9jcwotIAlwcm9wZXJseS4gIEhhbmRsZSBzaWduLWV4dGVuc2lvbiBmb3IgUl9NSVBTXzY0IGNvcnJlY3RseS4gIENvcnJlY3QKLSAJdGhlIEdQIHZhbHVlIGZvciBSX01JUFNfTElURVJBTCByZWxvY3MgdG9vLiAgSGFuZGxlCi0JUl9NSVBTXzY0IHJlbG9jcyBwcm9wZXJseSBvbiBiaWctZW5kaWFuIE1JUFMuCi0JKG1pcHNfZWxmX3NpZ25fZXh0ZW5kKTogQmVoYXZlIHByb3Blcmx5IHdpdGggJ2xvbmcgbG9uZycuCi0JKG1pcHNfZWxmX2hpZ2hlc3QpOiBDb3JyZWN0IHR5cG8uCi0KLU1vbiBPY3QgIDQgMTc6NDk6NDUgMTk5OSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LW0zMnIuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IE5ldyBzdGF0aWMgZ2xvYmFsLgotCShiZmRfbTMycl9hcmNoKTogUmVmZXIgdG8gaXQuCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX29iamVjdF9wKTogUmVjb2duaXplIEVfTTMyUlhfQVJDSC4KLQkobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERpdHRvLgotCShtMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogSGFuZGxlIGJmZF9tYWNoX20zMnJ4LgotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbTMycngpOiBEZWZpbmUgaXQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLTE5OTktMDktMjggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGNpc2NvX2NvcmVfdmVjKTogUmVwbGFjZWQgd2l0aCB0d28gbmV3IHZlY3MgLi4uCi0JKGNpc2NvX2NvcmVfYmlnX3ZlYyk6IEFkZCBuZXcgYmlnZW5kaWFuIHZlYy4KLQkoY2lzY29fY29yZV9saXR0bGVfdmVjKTogQWRkIG5ldyBsaXR0bGUgZW5kaWFuIHZlYy4KLQotCSogY2lzY28tY29yZS5jIChDUkFTSF9JTkZPKTogRml4ZWQgb2Zmc2V0IHJlcGxhY2VkIHdpdGggLi4uCi0JKGNyYXNoX2luZm9fbG9jcyk6IEFkZCBhcnJheSBvZiBwb3NzaWJsZSBvZmZzZXRzLgotCShNQVNLX0FERFIpOiBNYXNrIHRvIGFwcGx5IHRvIGNyYXNoIGluZm8gb2Zmc2V0LgotCShjcmFzaGluZm9fZXh0ZXJuYWwpOiBBZGQgdGV4dGJhc2UsIGRhdGFiYXNlLCBic3NiYXNlIGFuZAotCXR1cm4gaW50byBhIHR5cGVkZWYuCi0JKGNpc2NvX2NvcmVfZmlsZV92YWxpZGF0ZSk6IFJlbmFtZWQgZnJvbSBjaXNjb19jb3JlX2ZpbGVfcC4KLQlNYW55IHNtYWxsIGNoYW5nZXMgdG8gYWNjb3VudCBmb3IgYWRkaXRpb25hbCBoYXJkd2FyZSB2ZXJzaW9ucy4KLQlQaWNrIGEgcmVhc29uYWJsZSBzaXplIGZvciAiLnJlZyIgc2VjdGlvbi4gIEFkZCBhICIuY3Jhc2giCi0Jc2VjdGlvbiB0byBhbGxvdyBhY2Nlc3MgdG8gY3Jhc2hpbmZvX2V4dGVybmFsIHN0cnVjdC4KLQkoY2lzY29fY29yZV9maWxlX3ApOiBOZXcgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIHRoYXQKLQlpdGVyYXRlcyBvdmVyIGNyYXNoX2luZm9fbG9jcywgY2FsbGluZyBjaXNjb19jb3JlX2ZpbGVfdmFsaWRhdGUuCi0JKGNpc2NvX2NvcmVfdmVjKTogT2xkIGJpZyBlbmRpYW4gb25seSB2ZWMgcmVwbGFjZWQgd2l0aCAuLi4KLQkoY2lzY29fY29yZV9iaWdfdmVjKTogQWRkIGJpZyBlbmRpYW4gdmVyc2lvbi4KLQkoY2lzY29fY29yZV9saXR0bGVfdmVjKTogQWRkIGxpdHRsZSBlbmRpYW4gdmVyc2lvbi4KLQotCSogY29uZmlndXJlLmluIChjaXNjb19jb3JlX3ZlYyk6IFNwbGl0IHRvIHR3byBuZXcgdmVjdG9ycyAuLi4KLQkoY2lzY29fY29yZV9iaWdfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKGNpc2NvX2NvcmVfbGl0dGxlX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogY29uZmlnLmJmZCAodGFyZyk6IEZvciBtNjgqLSotYW91dCogdGFyZywgY2hhbmdlIGNpc2NvX2NvcmVfdmVjCi0JdG8gY2lzY29fY29yZV9iaWdfdmVjIGluIHRhcmdfc2VsdmVjcy4KLQotMTk5OS0wOS0yOCAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX2hpMTYpOiBVbnVzZWQsIGRlbGV0ZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfZ290X2xvY2FsKTogVW51c2VkLCBkZWxldGUuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX2dsb2JhbF9nb3QpOiBVbnVzZWQsIGRlbGV0ZS4KLQotMTk5OS0wOS0yNCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBBZGQgdHlwZW5hbWUgdmFyaWFibGUuICBVc2UgcF90eXBlCi0JdG8gaW5pdGlhbGl6ZSBpdCB0byBzb21ldGhpbmcgbWVhbmluZ2Z1bC4gIFRoZW4gdXNlIGl0IHRvIGdlbmVyYXRlCi0JbW9yZSB1c2VmdWwgc2VnbWVudCBuYW1lcy4KLQotU3VuIFNlcCAxOSAxMjoxNjo0NyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChOT19QQ1JFTF9NT0RFUyk6IERlZmluZSBpZiB0aGUgc3lzdGVtIGRvZXMgbm90IGRlZmluZQotCVJfU0hPUlRfUENSRUxfTU9ERS4KLQkoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUgYm90aCBzaG9ydCBhbmQgbG9uZyBwY3JlbCBicmFuY2hlcy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEVsaW1pbmF0ZSByZWR1bmRhbnQgcGNyZWwgbW9kZSByZWxvY3MuICBIYW5kbGUKLQlSX0xPTkdfUENSRUxfTU9ERSBhbmQgUl9TSE9SVF9QQ1JFTF9NT0RFCi0JKiBsaWJocHBhLmggKGRpc19hc3NlbWJsZV8yMik6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2hwcGFfaW5zbjJmbXQpOiBIYW5kbGUgbG9uZyBicmFuY2guCi0KLQkqIGxpYmhwcGEuaCAoYmZkX2hwcGFfaW5zbjJmbXQpOiBEZWNvZGUgYW5kIGhhbmRsZSBmb3JtYXRzIGZvdW5kCi0JaW4gUEEyLjAuCi0KLTE5OTktMDktMTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IFN1cHBvcnQgQkZEX1JFTE9DXzE2LAotCUJGRF9SRUxPQ18xNl9QQ1JFTCwgQkZEX1JFTE9DXzgsIEJGRF9SRUxPQ184X1BDUkVMIHJlbG9jcy4KLQkocmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZSk6IFRpZHkgY29tbWVudHMgYW5kIHdoaXRlc3BhY2UuCi0KLTE5OTktMDktMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5oIChiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6IFVuZG8KLQlwcmV2aW91cyBkZWx0YS4gIFNldCBzZWMtPmdjX21hcmsgaW5zdGVhZC4KLQotVGh1IFNlcCAxNiAxMToyMToxMyAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfY3B1MzJfcGx0MF9lbnRyeSk6IFVzZSBhMSBpbnN0ZWFkIG9mIGEwLgotCShlbGZfY3B1MzJfcGx0X2VudHJ5KTogTGlrZXdpc2UuCi0KLVRodSBTZXAgMTYgMTA6NDg6MTcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogVHVybiBvbiBUUkFQTklMLgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rKTogSWYgdW5hYmxlIHRvIGZpbmQgX19ncCBpbiB0aGUKLQlzeW1ib2wgdGFibGUsIHRoZW4ganVzdCBjb21wdXRlIGEgc3VpdGFibGUgdmFsdWUgKGJ1dCBkbyBub3QKLQljcmVhdGUgYSBfX2dwIHN5bWJvbCkuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBBbGxvdyB1bmRlZmluZWQKLQlzeW1ib2xzIHdoZW4gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLQkoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IENvcnJlY3QgaGFuZGxpbmcgb2YgUENSRUwKLQlyZWxvY2F0aW9ucyBhZ2FpbnN0IHVuZGVmaW5lZCBzeW1ib2xzLgotCi0xOTk5LTA5LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcpOiBNYXJrCi0JaW50ZXJ3b3JraW5nIHNlY3Rpb25zIGFzIGxpbmtlciBjcmVhdGVkIHNvIHRoYXQgdGhleSB3aWxsIG5vdAotCWJlIHJlbW92ZWQgYnkgZ2FyYmFnZSBjb2xsZWN0aW9uLgotCi1XZWQgU2VwIDE1IDAyOjMxOjU3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGluayk6IFJldmFtcCBfX2dwIGhhbmRsaW5nLgotCShlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogQ29uc2lzdGVudGx5IGNyZWF0ZSBhbiBhYnNvbHV0ZQotCWFkZHJlc3MsIHRoZW4gc3VidHJhY3Qgb3V0IHRoZSB2YWx1ZSBvZiBfX2dwLgotCi0xOTk5LTA5LTE0ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChDYW5vbmljYWxpemF0aW9uIG9mIHRhcmdldCBuYW1lcyk6IFJlbW92ZSBhZGRpbmcKLQkke0NPTkZJR19TSEVMTH0gaW4gZnJvbnQgb2YgJGFjX2NvbmZpZ19zdWIsIHNpbmNlIGF1dG9jb25maWcgMi4xNAotCWdlbmVyYXRlcyAkYWNfY29uZmlnX3N1YiB3aXRoIGEgJHtDT05GSUdfU0hFTEx9IGFscmVhZHkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDktMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAoRUxGX01BWFBBR0VTSVpFKTogQ2hhbmdlIHRvIDB4MSAoYXQgcmVxdWVzdCBvZgotCU1pdHN1YmlzaGkpLiAKLQotTW9uIFNlcCAxMyAyMDowMTo0NyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX3JlY29yZF9zZWdtZW50X2FkZHJzKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfaHBwYV9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSB0ZXh0X3NlZ21lbnRfYmFzZSBhbmQKLQlkYXRhX3NlZ21lbnRfYmFzZS4KLQkoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBTRUdSRUwgcmVsb2NhdGlvbnMuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmspOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IExpa2V3aXNlLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBJbml0aWFsaXplIEhPV1RPLgotCi0xOTk5LTA5LTEzICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgQ09NREFUCi0JaGFuZGxpbmcgdG8gc3VwcG9ydCBib3RoIEdOVSBhbmQgTVMgb2JqZWN0cy4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjaGVjayByZWxvY19jb3VudAotCXdoZW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0byBzZXQgRl9SRUxGTEcuCi0KLTE5OTktMDktMTMgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBEb24ndCByYW5nZS1jaGVjawotCVBDMjQgcmVsb2NzIGlmIHRoZSB0YXJnZXQgaXMgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgotCShhcm1fYWRkX3RvX3JlbCk6IEZpeCBjb21waWxlciB3YXJuaW5nLgotCShlbGYzMl9hcm1fcGx0MF9lbnRyeSk6IENvcnJlY3QgY29tbWVudHMuCi0JCi0xOTk5LTA5LTEzICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogQ2hlY2sgZm9yIHRoZV9iZmQgTlVMTCB3aGVuIGhhbmRsaW5nCi0JYW4gYWJzb2x1dGUgc3ltYm9sIGluIFJFTCByZWxvY3MuCi0KLVN1biBTZXAgMTIgMjM6NDc6NTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlIFNFQ1JFTDMyLgotCVN0dWIgU0VHUkVMMzIuICBSZXR1cm4gYW4gZXJyb3IgZm9yIGFueSByZWxvY2F0aW9uIG5vdCBoYW5kbGVkLgotCi0xOTk5LTA5LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogTG9vayBmb3Igc3BlY2lhbCBNU1ZDIHN0cmluZwotCWNvbnN0YW50IHN5bWJvbHMsIGFuZCBhdm9pZCBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9ycyBvbiB0aGVtLgotCi0xOTk5LTA5LTEyICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9sb2cyKTogUmV3cml0ZSB0byBhdm9pZCBpbmZpbml0ZSBsb29wIGlmIG1vc3QKLQlzaWduaWZpY2FudCBiaXQgaXMgc2V0LgotCi0xOTk5LTA5LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29mZi1wcGMuYyAoQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTKTogRGVmaW5lLgotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IEhhbmRsZSBhbiBhYnNvbHV0ZSBzeW1ib2wgaW4gUkVMCi0JcmVsb2NzIGFzIHdlIGRvIGZvciBSRUxBIHJlbG9jcy4KLQotMTk5OS0wOS0xMSAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGxpYnBlaS5oIChfYmZkX3BlaV9maW5hbF9saW5rX3Bvc3RzY3JpcHQpOiBEZWNsYXJlLgotCShjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCk6IERlZmluZS4KLQkqIHBlaWdlbi5jIChfYmZkX3BlaV9zd2FwX2FvdXRoZHJfb3V0KTogRG9uJ3Qgc2V0IHZhbHVlIGZvciBkYXRhCi0JZGlyZWN0b3J5IGVudHJpZXMgaGVyZS4KLQkoX2JmZF9wZWlfZmluYWxfbGlua19wb3N0c2NyaXB0KTogTmV3IGZ1bmN0aW9uLgotCi0JKiBwZWlnZW4uYyAoX2JmZF9wZWlfc3dhcF9zY25oZHJfb3V0KTogUmVtb3ZlIGNvZGUgd2hpY2ggc2V0cwotCXNlY3Rpb24gZmxhZ3MgYmFzZWQgb24gdGhlIHNlY3Rpb24gbmFtZS4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX2luKTogSWYgQ09GRl9JTUFHRV9XSVRIX1BFLCB0aGUKLQlnZXQgdGhlIG92ZXJmbG93IG9mIHRoZSBzX25sbm5vIGZpZWxkIGZyb20gdGhlIHNfbnJlbG9jIGZpZWxkLgotCSogcGVpZ2VuLmMgKF9iZmRfcGVpX3N3YXBfc2NuaGRyX291dCk6IElmIGRvaW5nIGEgZmluYWwgbGluaywgc3dhcAotCXRoZSBzX25sbm5vIG92ZXJmbG93IG9mIHRoZSAudGV4dCBzZWN0aW9uIGludG8gdGhlIHNfbnJlbG9jCi0JZmllbGQuCi0KLQkqIHBlaWdlbi5jIChhZGRfZGF0YV9lbnRyeSk6IERlY2xhcmUuCi0JKHBlaV9zd2FwX2FvdXRoZHJfb3V0KTogR2V0IGltYWdlIHNpemUgcmlnaHQuICBTZXQgbGlua2VyIHZlcnNpb24KLQltb3JlIGludHVpdGl2ZWx5LgotCShwZWlfc3dhcF9zY25oZHJfb3V0KTogVGVzdCBmb3IgVU5JTklUIHNlY3Rpb24sIG5vdCAuYnNzLgotCShwZV9wcmludF9pZGF0YSk6IENvZGUgY2xlYW51cCwgcHJpbnQgbW9yZSBpbmZvLCBnZXQgcmlkIG9mIChub3cpCi0JZXh0cmFuZW91cyBJbWFnZUJhc2UuCi0JKHBlX3ByaW50X2VkYXRhKTogTGlrZXdpc2UuCi0JKHBlX3ByaW50X3BkYXRhKTogTGlrZXdpc2UuICBQcmludCBleGNlcHRpb24gZW50cmllcy4KLQkocGVfcHJpbnRfcmVsb2MpOiBMaWtld2lzZS4gIFByaW50IE1JUFNfSk1QQUREUi4KLQkodGJsKTogTWFrZSBjb25zdCwgYWRkICJVTktOT1dOIi4KLQkoX2JmZF9wZV9wcmludF9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbik6IFByaW50IHRpbWVzdGFtcC4KLQkoX2JmZF9wZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbik6IERvbid0IGNvcHkgZGVsZXRlZAotCXNlY3Rpb24gZGF0YSBkaXJlY3RvcnkuCi0JKF9iZmRfcGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDb3B5IHBlX2ZsYWdzLgotCi0JKiBsaWJwZWkuaCAoX2JmZF9wZV9iZmRfZ2V0X3N5bWJvbF9pbmZvKTogRGVjbGFyZS4KLQkqIHBlaWdlbi5jIChfYmZkX3BlX2JmZF9nZXRfc3ltYm9sX2luZm8pOiBOZXcgZnVuY3Rpb24uCi0JKiBwZWljb2RlLmggKGNvZmZfZ2V0X3N5bWJvbF9pbmZvKTogRGVmaW5lLgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi1pbnRlcml4Kik6IFNldCB0YXJnX2NmbGFncyB0bwotCS1EU1RSSUNUX1BFX0ZPUk1BVC4KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogQ2hlY2sgU1RSSUNUX1BFX0ZPUk1BVCByYXRoZXIKLQl0aGFuIF9fSU5URVJJWC4KLQkoY29mZl9jbGFzc2lmeV9zeW1ib2wpOiBSZS1yZXZlcnQgMTk5OS0wOC0wOCBwYXRjaCBpZgotCVNUUklDVF9QRV9GT1JNQVQuCi0KLQkqIGxpYnBlaS5oOiBOZXcgZmlsZSwgYnJva2VuIG91dCBvZiBwZWljb2RlLmguCi0JKiBwZWlnZW4uYzogTmV3IGZpbGUsIGJyb2tlbiBvdXQgb2YgcGVpY29kZS5oLgotCSogcGVpY29kZS5oOiBBIGJ1bmNoIG9mIGNvZGUgbW92ZWQgb3V0IHRvIGxpYnBlaS5oIGFuZCBwZWlnZW4uYy4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHBlaWdlbi5sbyB0byBsaXN0IG9mIGZpbGVzIHJlcXVpcmVkIGZvciBlYWNoCi0JUEUgdGFyZ2V0LgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBwZWlnZW4ubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBwZWlnZW4uYy4KLQkoU09VUkNFX0hGSUxFUyk6IEFkZCBsaWJwZWkuaC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9pbik6IERvbid0IGNoZWNrIGZvciBhIHNwZWNpYWwKLQlzZWN0aW9uIG5hbWUgb2YgX0JTUzsgY2hlY2sgSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEKLQlpbnN0ZWFkLiAgRG9uJ3QgY2xlYXIgdGhlIHNfcGFkZHIgZmllbGQgZm9yIGFuIHVuaW5pdGlhbGl6ZWQgZGF0YQotCXNlY3Rpb24uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IFNldCB0aW1lc3RhbXAgZmllbGQgaW4KLQljb2ZmX2RhdGFfdHlwZSB0byBmX3RpbWRhdC4KLQkqIHBlaWNvZGUuaCAocGVfbWtvYmplY3RfaG9vayk6IExpa2V3aXNlLgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9maWxlaGRyX2luKTogQ2hlY2sgdGhlIE5UIGV4ZWN1dGFibGUgbWFnaWMKLQludW1iZXIgaWYgQ09GRl9JTUFHRV9XSVRIX1BFLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBJZiBDT0ZGX1dJVEhfUEUsIHNldCBIQVNfREVCVUcKLQl0byB0aGUgcmV2ZXJzZSBvZiBJTUFHRV9GSUxFX0RFQlVHX1NUUklQUEVELgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBJTUFHRV9GSUxFX0RFQlVHX1NUUklQUEVEIGlmCi0JdGhlcmUgaXMgbm8gU0VDX0RFQlVHR0lORyBzZWN0aW9uLgotCSogcGVpY29kZS5oIChwZV9ta29iamVjdF9ob29rKTogU2V0IEhBU19ERUJVRyB0byB0aGUgcmV2ZXJzZSBvZgotCUlNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQuCi0KLQkqIHBlLWkzODYuYyAoQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZS4KLQkoQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTKTogRGVmaW5lLgotCSogcGVpLWkzODYuYyAoQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZS4KLQkoQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTKTogRGVmaW5lLgotCi0JKiBjb2Zmc3dhcC5oIChJTUFHRV9CQVNFKTogRG9uJ3QgZGVmaW5lLgotCSogcGVpLWFybS5jIChJTUFHRV9CQVNFKTogRG9uJ3QgZGVmaW5lLgotCSogcGVpLWkzODYuYyAoSU1BR0VfQkFTRSk6IERvbid0IGRlZmluZS4KLQkqIHBlaS1tY29yZS5jIChJTUFHRV9CQVNFKTogRG9uJ3QgZGVmaW5lLgotCSogcGVpLXBwYy5jIChJTUFHRV9CQVNFKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBXaGVuIHdyaXRpbmcgb3V0IGEKLQlzeW1ib2wsIHN3aXRjaCBvbiB0aGUgY2xhc3Mgd2hlbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIG1vZGlmeSB0aGUKLQl2YWx1ZS4gIEZvciBQRSwgZG9uJ3QgbW9kaWZ5IHRoZSB2YWx1ZSBvZiBhIENfRkNOIHN5bWJvbCBub3QgbmFtZWQKLQkuYmYuCi0KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2Fib3J0KTogRGVjbGFyZS4KLQkoYWJvcnQpOiBEZWZpbmUuCi0JKiBiZmQuYyAoX2JmZF9hYm9ydCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IERlbGV0ZSBQT1dFUlBDX0xFX1BFCi0Jc3BlY2lhbCBoYW5kbGluZy4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgYSBzeW1ib2wgaXMgc3RyaXBwZWQsCi0JZG9uJ3Qgd3JpdGUgb3V0IHRoZSBhc3NvY2lhdGVkIGxpbmUgbnVtYmVycy4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBIYW5kbGUgc2VjdGlvbiBzeW1ib2wKLQlhdXggZW50cmllcy4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3Qgd2FybiBhYm91dCBzeW1ib2wgdHlwZQotCWNoYW5nZXMgd2hlbiB0aGUgYmFzZSB0eXBlIGlzIHVua25vd24uCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBGaXggcHJpbnRpbmcgb2YgYXV4IHJlY29yZCBmb3IKLQlmdW5jdGlvbiBzeW1ib2xzLgotCi0JKiBzeW1zLmMgKEJTRl9ERUJVR0dJTkdfUkVMT0MpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIFBFLCBzZXQgQlNGX0RFQlVHR0lORwotCWZvciBDX0ZDTi9DX0VGQ04gc3ltYm9scywgYW5kIHNldCBCU0ZfREVCVUdHSU5HX1JFTE9DIGZvciBzdWNoCi0Jc3ltYm9scyBuYW1lZCAuYmYuCi0JKiBjb2ZmZ2VuLmMgKGZpeHVwX3N5bWJvbF92YWx1ZSk6IFJlbG9jYXRlIGEgc3ltYm9sIHdoaWNoIGhhcwotCUJTRl9ERUJVR0dJTkdfUkVMT0Mgc2V0LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA5LTEwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWNvZmYuYyAoYmZkX2RlYnVnX3NlY3Rpb24pOiBVcGRhdGUgaW5pdGlhbGl6YXRpb24gZm9yIG5ldwotCWNvbWRhdF9pbmZvIGZpZWxkLgotCShfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogQWRkIHNlY3Rpb24gcGFyYW1ldGVyLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotMTk5OS0wOS0xMCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgdGhlIG5ldwotCV9iZmRfZmlsbm1sZW4gZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotRnJpIFNlcCAxMCAwMDozNToxNCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDcmVhdGUgLm9wZCBlbnRyaWVzCi0JZm9yIEZQVFIgcmVsb2NzIGludm9sdmluZyBsb2NhbCBzeW1ib2xzLgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogR2V0IHRoZSByaWdodAotCXZhbHVlIGZvciB0aGUgc3R1YiBhZGRyZXNzIGluIGEgY2FsbCB0aHJvdWdoIGEgc3R1Yi4KLQlJbnN0YWxsIHRoZSB2YWx1ZSBmb3IgYSBsb2NhbCBzeW1ib2wgZGlyZWN0bHkgaW50byB0aGUgRExUCi0JaW5zdGVhZCBvZiBnZW5lcmF0aW5nIGEgcmVsb2MuICBDb3JyZWN0bHkgaGFuZGxlIEZQVFI2NCByZWxvY3MuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX3VubWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2hwcGFfcmVtYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzKTogU2ltaWxhcmx5LgotCShlbGZfaHBwYV9maW5hbF9saW5rKTogQ2FsbCB0aGVtLgotCi0xOTk5LTA5LTEwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZml4X3N5bWJvbF9mbGFncyk6IE1vdmUgd2Vha2RlZiBoYW5kbGluZyBoZXJlLi4uCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiAuLi5mcm9tIGhlcmUuCi0KLVdlZCBTZXAgIDggMTc6NTY6MTEgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9ob3d0b190YWJsZSk7IFRoZXJlIGlzIG5vIERJUjY0V1IsIERJUjY0RFIKLQlyZWxvY2F0aW9uLCByZW1vdmUgdGhlbS4gIFNFQ1JFTDY0LT5MVE9GRjE2V0YuCi0JKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgTFRPRkYqIHJlbG9jYXRpb25zLiAgSGFuZGxlCi0JRElSKiByZWxvY2F0aW9ucy4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBQTFRPRkYqIHJlbG9jcy4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBEUFJFTCogYW5kCi0JR1BSRUwqIHJlbG9jYXRpb25zLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogU2ltaWxhcmx5LgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9saW5rX2ZpbmFsX3JlbG9jYXRlKTogRml4IHR5cG9zLgotCUhhbmRsZSBMVE9GRl9UUCogcmVsb2NzLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogU2ltaWxhcmx5LgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlIFBDUkVMKiByZWxvY3MuCi0JQ29uc2lzdGVudGx5IGRlYWwgd2l0aCBhZGRlbmRzLiAgSGFuZGxlIERMVElORDE0RiBhbmQgRExUUkVMMTRGLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogSGFuZGxlIFBDUkVMKiByZWxvY3MuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgTFRfT0ZGX0ZQVFIqLAotCURJUjMyLCBESVI2NCBhbmQgRlBUUjY0IHJlbG9jYXRpb25zLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogU2ltaWxhcmx5LgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rKTogU2V0IHRoZSB2YWx1ZSBvZiBfX2dwIHRvIHRoZSAgICAgICAgCi0JYWRkcmVzcyBvZiB0aGUgLlBBUklTQy5nbG9iYWwgc2VjdGlvbi4KLQkoZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IExvb2t1cCBhbmQgcGFzcyB0aGUgUEE2NCBoYXNoCi0JdGFibGUgZW50cnkgZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZS4gIERvIG5vdCBnaXZlIGEgd2FybmluZwotCWZvciBhIHJlbG9jIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sIGlmIGl0IGhhcyBhIFBBNjQgaGFzaAotCXRhYmxlIGVudHJ5LgotCShlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogU2lnbmlmaWNhbnRseSByZXdvcmsuICBIYW5kbGUgICAKLQlETFRJTkQgcmVsb2NhdGlvbnMuICBDb21wdXRlIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgcmVsb2NhdGlvbgotCWJlZm9yZSBwYXNzaW5nIHRoZSB2YWx1ZSBvZiBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogUmV2YW1wIHRvIGhhbmRsZSBqdXN0IGJpdCB0aXdpZGRsaW5nCi0JcmVsb2NhdGlvbiBzdXBwb3J0LiAgSGFuZGxlIERMVElORCByZWxvY2F0aW9uIHJlcXVlc3RzIGp1c3QgbGlrZQotCURMVFJFTCByZWxvY2F0aW9uIHJlcXVlc3RzLiAgU2ltcGxpZnkgYnJhbmNoIGhhbmRsaW5nLgotCi0xOTk5LTA5LTA4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IENhdGNoIHByb2JsZW1zIHdpdGgKLQlub24tYWxsb2NhdGVkIHNlY3Rpb24gYXMgZG9uZSBpbiBpMzg2IHZlcnNpb24uCi0JKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBVbmNvbW1lbnQgUl9QQVJJU0NfMTRGIGluIHN3aXRjaAotCXN0YXRlbWVudCBzaW5jZSB0aGlzIGlzIG5vIGtub3cgcmVsb2NhdGlvbi4KLQotVHVlIFNlcCAgNyAxNzoyNToxMiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBIYW5kbGUgRExUUkVMMTRGCi0JcmVsb2NzLgotCShlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogU2ltaWxhcmx5LgotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlKTogSGFuZGxlIERMVFJFTDE0V1IgYW5kCi0JRExUUkVMMTRXRCByZWxvY3MuICAKLQkoZWxmX2hwcGFfcmVsb2NhdGVfaW5zbik6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBETFRSRUwxNFIgYW5kCi0JRExUUkVMMjFMIHJlbG9jcy4gIFBhc3MgdGhlIG91dHB1dCBiZmQgdG8gZWxmX2hwcGFfcmVsb2NhdGVfaW5zbi4KLQlQYXNzIHRoZSByZWxvY2F0ZSB0eXBlIHJhdGhlciB0aGFuIHRoZSBpbnNuIGZvcm1hdCB0bwotCWVsZl9ocHBhX3JlbG9jYXRlX2luc24uCi0JKGVsZl9ocHBhX3JlbG9jYXRlX2luc24pOiBNYWtlIHN3aXRjaCBkZXBlbmRlbnQgb24gcmVsb2NhdGlvbiB0eXBlCi0JcmF0aGVyIHRoYW4gdGhlIG9wY29kZS4gIEhhbmRsZSBETFRSRUwyMUwgYW5kIERMVFJFTDE0UiByZWxvY3MuCi0KLTE5OTktMDktMDcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgX2JmZF9maWxubWxlbiBmaWVsZC4KLQkoYmZkX2NvZmZfZmlsbm1sZW4pOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZml4X3N5bWJvbF9uYW1lKTogVXNlIGJmZF9jb2ZmX2ZpbG5tbGVuIHJhdGhlcgotCXRoYW4gRklMTk1MRU4uCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IExpa2V3aXNlLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IExpa2V3aXNlLgotCSogY29mZi1zaC5jIChiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLTE5OTktMDktMDYgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBjb2ZmY29kZS5oIChzb3J0X2J5X3NlY2FkZHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIGlmCi0JQ09GRl9JTUFHRV9XSVRIX1BFLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIENPRkZfSU1BR0VfV0lUSF9QRSwgc29ydAotCXNlY3Rpb25zIGJ5IFZNQSB3aGVuIGFzc2lnbmluZyB0YXJnZXRfaW5kZXggdmFsdWVzLiAgQWx3YXlzIHNldAotCXZpcnRfc2l6ZS4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEpOiBBZGQgcGVfZmxhZ3MgZmllbGQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaykgW0NPRkZfV0lUSF9QRSB2ZXJzaW9uXTogU2V0Ci0JcGVfZmxhZ3MgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2N1c3RvbV9zZWN0aW9uX2FsaWdubWVudCk6IEFkZCBjb25zdCB0bwotCWRlY2xhcmF0aW9uIHRvIG1hdGNoIGRlZmluaXRpb24uCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgc2V0IEZfQVIzMlcoUik/IGlmCi0JQ09GRl9XSVRIX1BFLgotCi0JKiBjb2ZmLWkzODYuYyAoaW5fcmVsb2NfcCk6IEFkZCBkZWNsYXJhdGlvbi4KLQkoaTM4NmNvZmZfdmVjKTogU2ltcGxpZnkgaW5pdGlhbGl6YXRpb24gb2YKLQlhcHBsaWNhdGlvbl9zZWN0aW9uX2ZsYWdzLgotCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IFdyaXRlIHNlcGFyYXRlIENPRkZfV0lUSF9QRQotCXZlcnNpb24uICBNb3ZlIENPRkZfV0lUSF9QRSBzcGVjaWZpYyBjb2RlIHRvIG5ldyB2ZXJzaW9uLgotCShzdHlwZV90b19zZWNfZmxhZ3MpOiBMaWtld2lzZS4gIEFkZCBzZWN0aW9uIHBhcmFtZXRlci4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogU2V0IHRhcmdldF9pbmRleCBiZWZvcmUKLQljYWxsaW5nIHN0eXBfdG9fc2VjX2ZsYWdzLiAgUGFzcyBzZWN0aW9uIHRvIHN0eXBfdG9fc2VjX2ZsYWdzLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBzeW1zLmMgKHN0dCk6IEFkZCBzb21lIFBFL1BFSSBzZWN0aW9uIG5hbWVzLgotCShiZmRfZGVjb2RlX3N5bWNsYXNzKTogUmV0dXJuICd3Jywgbm90ICdVJywgZm9yIGEgd2VhayB1bmRlZmluZWQKLQlzeW1ib2wuCi0JKGJmZF9zeW1ib2xfaW5mbyk6IENoZWNrIGZvciAndycuCi0KLQkqIHNlY3Rpb24uYyAoc3RydWN0IGJmZF9jb21kYXRfaW5mbyk6IERlZmluZS4KLQkoYXNlY3Rpb24pOiBBZGQgY29tZGF0IGZpZWxkLgotCShTVERfU0VDVElPTik6IEluaXRpYWxpemUgY29tZGF0IGZpZWxkLgotCShiZmRfbWFrZV9zZWN0aW9uX2FueXdheSk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA5LTA2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENvcHkgTk9OX0dPVF9SRUYgZmxhZwotCXRvIHZlcnNpb24gc3ltYm9scy4KLQotMTk5OS0wOS0wNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZ2NfcmVjb3JkX3Z0ZW50cnkpOiBVc2UgYmZkX3ptYWxsb2MgYW5kCi0JYmZkX3JlYWxsb2MgaW5zdGVhZCBvZiBjYWxsb2MgYW5kIHJlYWxsb2MuCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogY3B1LXBqLmM6IE5ldyBmaWxlLgotCSogZWxmMzItcGouYzogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkIChwaiopOiBOZXcgY3B1LgotCShwai0qLSosIHBqbC0qLSopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX3BqX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShiZmRfZWxmMzJfcGpsX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotIAkqIGFyY2h1cmVzLmMgKGJmZF9hcmNoX3BqKTogRGVmaW5lLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEhhbmRsZSBiZmRfYXJjaF9wai4KLQkqIHJlbG9jLmM6IERlZmluZSBCRkRfUkVMT0NfUEpfKiByZWxvY2F0aW9ucy4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3BqX3ZlYywgYmZkX2VsZjMyX3BqbF92ZWMpOiBEZWNsYXJlIGFuZCBhZGQKLQl0byB0YXJnZXQgdmVjdG9yIGxpc3QuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtcGoubG8uCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgY3B1LXBqLmMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZjMyLXBqLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmMzItcGouYy4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLTE5OTktMDktMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGYtYmZkLmggKEVMRl9MSU5LX05PTl9HT1RfUkVGKTogRGVmaW5lLgotCSogZWxmbGluay5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ29weSBSRUZfUkVHVUxBUl9OT05XRUFLCi0JYW5kIE5PTl9HT1RfUkVGIGZyb20gd2VhayBkZWZpbmVkIHN5bWJvbCB0byByZWFsIHN5bWJvbC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogU2V0IE5PTl9HT1RfUkVGLgotCShlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBOT05fR09UX1JFRiBpcyBub3Qgc2V0LCBkb24ndAotCWNyZWF0ZSBhIENPUFkgcmVsb2MuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBTZXQgTk9OX0dPVF9SRUYuCi0JKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIE5PTl9HT1RfUkVGIGlzIG5vdCBzZXQsCi0JZG9uJ3QgY3JlYXRlIGEgQ09QWSByZWxvYy4KLQotMTk5OS0wOS0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogV2hlbiBjb3VudGluZyByZWxvY2F0aW9ucywgZG9uJ3QKLQljb3VudCB0aG9zZSBpbiBzZWN0aW9ucyB3ZSBhcmUgbm90IGluY2x1ZGluZyBpbiB0aGUgbGluay4KLQotVGh1IFNlcCAgMiAxNzo0MToyMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV29yayBhcm91bmQgYm9ndXMgU0hfTElOSwotCWZpZWxkIGluIGhwdXgxMSBzaGFyZWQgbGlicmFyaWVzLgotCi0xOTk5LTA5LTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9nY19yZWNvcmRfdnRlbnRyeSk6IEZpeCBtZW1vcnkgbGVhay4KLQotV2VkIFNlcCAgMSAxMzozNDoyOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2FkZF9zeW1ib2xfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2hwcGFfZmluYWxfbGluaywgZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlLCBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuKTogTGlrZXdpc2UuCi0KLTE5OTktMDgtMzEgIEFsZXhhbmRyZSBQZXRpdC1CaWFuY28gIDxhcGJpYW5jb0BjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBXaGVuIHBvc3NpYmxlLCBrZWVwIHRoZQotCW9yaWdpbmFsIHR5cGUgb2YgdGhlIHN5bWJvbC4KLQotTW9uIEF1ZyAzMCAxNToyNjo0OCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKF9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUpOiBBbGxvdyBib3RoCi0JUl9QQVJJU0NfRElSMzIgYW5kIFJfUEFSSVNDX0RJUjY0IHJlZ2FyZGxlc3Mgb2YgaG93IHRoZQotCXRvb2xzIHdlcmUgY29uZmlndXJlZC4KLQkqIGVsZjMyLWhwcGEuaCAoX2JmZF9lbGYzMl9ocHBhX2dlbl9yZWxvY190eXBlKTogRGVjbGFyZS4KLQotMTk5OS0wOC0yNiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IERvbid0IGFsbG9jYXRlIGxvY2FsCi0JR09UIGVudHJpZXMgZm9yIEdPVDE2IHJlbG9jYXRpb25zOyB0aGV5J3JlIG5vdCByZXF1aXJlZC4KLQotMTk5OS0wOC0yNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCUZyb20gYSBwYXRjaCBzdWJtaXR0ZWQgYnkgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAYmFhbHBlcmF6aW0uZnJvYi5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGFybS0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChhcm1uZXRic2RfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUKLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgJmFybW5ldGJzZF92ZWMuCi0KLQkqIE1ha2VmaWxlLmFtIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBhcm1uZXRic2QubG8uCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgYXJtbmV0YnNkLmMuCi0JKGFybW5ldGJzZC5sbyk6IE5ldyBydWxlIHdpdGggZGVwcy4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCQotCSogYXJtbmV0YnNkLmM6IE5ldyBmaWxlOiAgRGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gYXJtLW5ldGJzZAotCXRhcmdldC4gCi0KLVR1ZSBBdWcgMjQgMDA6MjU6NTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IEZpeCB0eXBvIGluIGNvbW1lbnQuCi0KLUZyaSBBdWcgMjAgMTc6MDE6MjMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChlbGZfaHBwYV9mYWtlX3NlY3Rpb25zKTogQ29tcHV0ZSBzZWN0aW9uIGluZGljZXMKLQloZXJlIGluc3RlYWQgb2YgdXNpbmcgZWxmX3NlY3Rpb25fZGF0YS4uLgotCi0xOTk5LTA4LTE5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW1jb3JlLmMgKG1jb3JlX2VtaXRfYmFzZV9maWxlX2VudHJ5KTogTmV3IGZ1bmN0aW9uOiAgRW1pdAotCXJlbG9jYXRpb25zIGludG8gdGhlIGJhc2UgZmlsZS4KLQkoY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uKTogQ2FsbCBtY29yZV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSBpZgotCXdlIGFyZSBidWlsZGluZyBhIGJhc2UgZmlsZS4KLQotMTk5OS0wOC0xOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmggKGFybV9hZGRfdG9fcmVsKTogTmV3IGZ1bmN0aW9uLiAgQWRkIGEgdmFsdWUgdG8KLQlhIFJFTCBzdHlsZSByZWxvYy4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UgYXJtX2FkZF90b19yZWwgdG8gaW5jcmVtZW50Ci0JUkVMIHJlbG9jcyB3aGVuIHBlcmZvcm1pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uCi0KLTE5OTktMDgtMTggIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBjb2ZmbGluay5jOiBNb3ZlIGRlZmluaXRpb25zIG9mIE5fVE1BU0ssIGV0LiBhbC4sIG91dCBvZgotCV9iZmRfY29mZl9saW5rX2lucHV0X2JmZCBpbnRvIHRvcCBsZXZlbC4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IEhhbmRsZSBSX0lNQUdFQkFTRS4KLQkoUlRZUEUySE9XVE8pOiBSZXR1cm4gTlVMTCBpZiByZWxvYyB0eXBlIGlzIG91dCBvZiByYW5nZS4KLQkoY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoYW5nZSBhIC0yIHRvIE5fREVCVUcuCi0JQ29tcGxldGVseSBpZ25vcmUgc3ltYm9scyB3aGljaCBhcmUgYWxsIHplcm8uCi0JKGR1bW15X3JlbG9jMTZfZXN0aW1hdGUpOiBBZGQgcmV0dXJuIDAuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBSZW5hbWUgaW5uZXIgc2NvcGUKLQl2YXJpYWJsZSBjb3B5IHRvIG5hbWVfY29weSB0byBhdm9pZCBzaGFkb3dpbmcgb3V0ZXIgc2NvcGUKLQl2YXJpYWJsZS4KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9kYXRhX3R5cGUpOiBDaGFuZ2UgcmF3X3N5bWVudF9jb3VudCBmaWVsZAotCWZyb20gdW5zaWduZWQgaW50IHRvIHVuc2lnbmVkIGxvbmcuICBBZGQgdGltZXN0YW1wIGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTE3ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGVsZjMyLWhwcGEuYyAoYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRml4IHR5cG8gaW4KLQltYWNybyBkZWZpbml0aW9uLgotCi0xOTk5LTA4LTE3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IFNldCBCU0ZfRFlOQU1JQwotCWZvciBzcGVjaWFsIHNlY3Rpb24gc3ltYm9scy4KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IElmIHdlIGhhdmUgbm8gb2xkIEJGRCwgY2hlY2sKLQlCU0ZfRFlOQU1JQyBvbiB0aGUgc2VjdGlvbiBzeW1ib2wgdG8gc2VlIHdoZXRoZXIgdGhlIG9sZCBCRkQgaXMKLQlkeW5hbWljLgotCi0xOTk5LTA4LTE1ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogRml4IHVuZm9ydHVuYXRlCi0JY29pbmNpZGVuY2Ugb2YgdmFyaWFibGUgbmFtZXMgYmV0d2VlbiBvbGQgYW5kIG5ldyBjb2RlLgotCi0xOTk5LTA4LTEyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIpOiAgTWFrZSAnb2Zmc2V0JyBwYXJhbWV0ZXIKLQlpbnRvIGEgYmZkX3ZtYSBhbmQgJ2FkZGVuZCcgcGFyYW1ldGVyIGEgJ2JmZF9zaWduZWRfdm1hJy4KLQkoZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIpOiAgTWFrZSAnb2Zmc2V0JyBwYXJhbWV0ZXIgaW50byBhIGJmZF92bWEKLQlhbmQgJ2FkZGVuZCcgcGFyYW1ldGVyIGEgJ2JmZF9zaWduZWRfdm1hJy4KLQkoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBEbyBub3QgaW52b2x2ZSBzdHVicyBpbgotCVJfQVJNX1RITV9QQzIyIHJlbG9jcyByZWxhdGl2ZSB0byBzZWN0aW9uIHN5bWJvbHMsIHRoZXkgYXJlIGxvbmcKLQlqdW1wcywgbm90IGZ1bmN0aW9uIGNhbGxzLgotCi0xOTk5LTA4LTExICBSb2JpbiBGYXJpbmUgPGFkdmFuY0BkaWFsLmV1bmV0LmNoPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDaGVjayBmb3Igb3ZlcmZsb3cKLQlpbiBSX0FSTV9QQzI0IHJlbG9jcy4KLQotVHVlIEF1ZyAxMCAxMjo0ODowOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2Zha2Vfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpOiBEZWZpbmUuCi0KLQkqIGVsZi1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBVcGRhdGUgZm9yCi0JcmVjZW50IGNoYW5nZXMgdG8gdGhlIGFyY2hfaW5mbyBzdHJ1Y3R1cmUuCi0KLQkqIGVsZi1ocHBhLmggKF9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUKLQlSX0hQUEFfU0VHQkFTRSBhbmQgUl9IUFBBX1NFR1JFTDMyLgotCSogY3B1LWhwcGEuYyAoYmZkX2hwcGEyMHdfYXJjaCk6IE5ldyBlbnRyeSBpbiBhcmNoaXRlY3R1cmUgaW5mbwotCWxpc3QuCi0KLVR1ZSBBdWcgMTAgMDA6MzQ6MjkgMTk5OSAgTWFyayBQLiBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQkgICAgICAgICAgICAgICAgICBSYWxmIEJhZWNobGUgPHJhbGZAdW5pLWtvYmxlbnouZGU+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBbHdheXMKLQlvdXRwdXQgRFRfTUlQU19HT1RTWU0uCi0JKF9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgdGhlIHNhbWUgdmFsdWUgYXMKLQlEVF9NSVBTX1NZTVRBQk5PIGlmIHRoZXJlIGFyZSBubyBnbG9iYWwgR09UIHN5bWJvbHMuCi0KLVR1ZSBBdWcgMTAgMDA6MjE6MDggMTk5OSAgTWFyayBQLiBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19yZWxvY2F0aW9uKTogQ2hhbmdlCi0JcHJvdG90eXBlLiAgSGFuZGxlIGxvY2FsIHN5bWJvbHMuICBBZGQgY29tbWVudGFyeS4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0JKF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzKTogSGFuZGxlIGxvY2FsIHN5bWJvbHMgaW4gUl9NSVBTXzMyCi0JcmVsb2NhdGlvbnMuIAotCQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBUd2VhayBsYXN0IGNoYW5nZS4KLQotMTk5OS0wOC0wOSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19zaXplX3JlbG9jX3NlY3Rpb24pOiBVc2UgdGhlIGNvdW50cyBpbiB0aGUKLQllbGYtc2VjdGlvbiBkYXRhIHRvIGFsbG9jYXRlIGp1c3QgdGhlIHJpZ2h0IGFtb3VudCBvZiByZWxvY2F0aW9uCi0Jc3BhY2UuICBEb24ndCBhbGxvY2F0ZSB0aGUgaGFzaCBzcGFjZSB0d2ljZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogQ2FsY3VsYXRlIHRoZSBhbW91bnQgb2Ygc3BhY2UgdG8gYWxsb2NhdGUgaW4KLQllYWNoIHJlbG9jYXRpb24gc2VjdGlvbi4KLQotTW9uIEF1ZyAgOSAxNzozNzozMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmggKF9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUsIGNhc2UgMzIpOiBXaGVuIGluCi0JNjRiaXQgbW9kZSwgZ2VuZXJhdGUgYSBzZWN0aW9uIHJlbGF0aXZlIHJlbG9jYXRpb24gZm9yIGEgMzJiaXQKLQl3aWRlIHJlbG9jYXRpb24uCi0JKGVsZl9ocHBhX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWxldGVkLiAgVG8gYmUKLQlzaGFyZWQgYmV0d2VlbiAzMmJpdCBhbmQgNjRiaXQgcG9ydC4KLQotMTk5OS0wOC0wOSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19ob3d0b190YWJsZSk6IEZpeCBzcmNfbWFzayBmb3IKLQlSX01JUFNfR09UMTYgYW5kIFJfTUlQU19DQUxMMTYuCi0JKG1pcHNfZWxmX2dvdDE2X2VudHJ5KTogVXNlIG1pcHNfZWxmX2hpZ2ggdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZQotCXRvIHVzZSB3aGVuIGxvb2tpbmcgZm9yIGEgcHJlZXhpc3RpbmcgR09UIGVudHJ5LgotCi0xOTk5LTA4LTA5ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBCYWNrIG91dCBwYXJ0IG9mCi0JdGhlIFNlcC4gNHRoLCAxOTk4IGNoYW5nZS4gIGdsaWJjIDIuMC54IGR5bmFtaWMgbGlua2VyIGhhZCBidWcsCi0Jbm90IGJpbnV0aWxzLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0xOTk5LTA4LTA5ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IG91dHB1dCBhIHdlYWsKLQlyZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCBqdXN0IGJlY2F1c2UgaXQgd2FzIGRlZmluZWQgd2VhawotCWluIGEgc2hhcmVkIG9iamVjdC4KLQotMTk5OS0wOC0wOSAgRWxpIFphcmV0c2tpaSAgPGVsaXpAaXMuZWx0YS5jby5pbD4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogV2hlbiBsb29raW5nIGZvciBmaWxlLCB1c2UKLQlsYXN0IGJlc3QgbWF0Y2ggcmF0aGVyIHRoYW4gZmlyc3QuICBJZiBhZGRyZXNzIGlzIGJleW9uZCBsYXN0IGxpbmUKLQludW1iZXIgcmVjb3JkLCBkb24ndCByZXR1cm4gdGhlIGxhc3QgbGluZSBhcyB0aGUgY29ycmVjdCB2YWx1ZS4KLQotMTk5OS0wOC0wOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoU0VDX1NNQUxMX0RBVEEpOiBSZW5hbWUgZnJvbSBTRUNfU0hPUlQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLTE5OTktMDgtMDggIE1hcmsgRWxicmVjaHQgIDxzbm93YmFsbDNAYmlnZm9vdC5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfZW50cnkpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9jdXN0b21fc2VjdGlvbl9hbGlnbm1lbnQpOiBOZXcgc3RhdGljCi0JZnVuY3Rpb24uCi0JKGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfdGFibGUpOiBOZXcgc3RhdGljIGFycmF5LgotCShjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBVc2UgY29mZl9zZXRfY3VzdG9tZXJfc2VjdGlvbl9hbGlnbm1lbnQuCi0JKiBjb2ZmLWdvMzIuYyAoQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTKTogRGVmaW5lLgotCSogY29mZi1zdGdvMzIuYyAoQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTKTogRGVmaW5lLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlbmFtZSAuZGVwKiBmaWxlcyB0byBERVAqLiAgQ2hhbmdlIERFUCB2YXJpYWJsZSB0bwotCU1LREVQLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDgtMDggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBzZWN0aW9uLmMgKFNFQ19TSEFSRUQpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IEhhbmRsZSBTRUNfU0hBUkVELgotCShzdHlwX3RvX3NlY19mbGFncyk6IExpa2V3aXNlLgotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jbGFzc2lmeV9zeW1ib2wpOiBDb21tZW50IG91dCBwYXJ0IG9mCi0JMTk5OS0wOC0wNSBjaGFuZ2Ugd2hpY2ggYnJlYWtzIGN5Z3dpbiBETExzLgotCi0JKiBhY2luY2x1ZGUubTQgKEJGRF9CSU5BUllfRk9QRU4pOiBDaGFuZ2UgLXdpbmRvd3MgdG8gLXdpbmRvd3MqLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc2VjdGlvbi5jIChnbG9iYWxfc3ltcyk6IE9ubHkgaW5pdGlhbGl6ZSB1bmlvbiBmaWVsZCBpZgotCV9fU1REQ19fLgotCi0xOTk5LTA4LTA0ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2dvdDE2X2VudHJ5KTogRG9uJ3QgbXVsdGlwbHkgR09UIGluZGV4IGJ5Ci0JdGhlIHNpemUgb2YgYSBHT1QgZW50cnkgaGVyZS4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBEb24ndCBjcmVhdGUgYSBsb2NhbCBHT1QgZW50cnkKLQlmb3IgdGhlIHN5bWJvbCBpbiBhIEdPVDE2IHJlbG9jYXRpb247IGp1c3QgZm9yIGl0J3MgaGlnaC1vcmRlciBiaXQKLQkoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHRoaW5rby4KLQotMTk5OS0wOC0wNSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gRG9ubiBUZXJyeSA8ZG9ubkBpbnRlcml4LmNvbT46Ci0JKiBjb2ZmY29kZS5oIChlbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uKTogRGVmaW5lLgotCShiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBSZW5hbWUgX2JmZF9jb2ZmX3N5bV9pc19nbG9iYWwgdG8KLQlfYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sLiAgQ2hhbmdlIHJldHVybiB0eXBlLgotCShiZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wpOiBSZW5hbWUgZnJvbSBiZmRfY29mZl9zeW1faXNfZ2xvYmFsLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBjb2ZmX2NsYXNzaWZ5X3N5bWJvbC4KLQkoY29mZl9jbGFzc2lmeV9zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3N5bV9pc19nbG9iYWwpOiBOZXZlciBkZWZpbmUuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSB3aXRoIGNvZmZfY2xhc3NpZnlfc3ltYm9sLgotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBVc2UKLQliZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wgcmF0aGVyIHRoYW4gYmZkX2NvZmZfc3ltX2lzX2dsb2JhbC4KLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCSogY29mZi1zaC5jIChiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSB3aXRoCi0JY29mZl9jbGFzc2lmeV9zeW1ib2wuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLVdlZCBBdWcgIDQgMTg6MDg6MDcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmggKFJfSFBQQV9MVFBTRUwsIFJfSFBQQV9SVFBTRUwpOiBOZXcgZmllbGQgc2VsZWN0b3JzCi0JKGVfbHRwc2VsLCBlX3J0cHNlbCk6IFNpbWlsYXJseS4KLQotCSogZWxmLWhwcGEuaCAoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSAyMWJpdCBlX2x0cHNlbAotCWFuZCAxNGJpdCBlcnRwc2VsLiAgSGFuZGxlIDY0Yml0IHBzZWwuCi0KLTE5OTktMDgtMDQgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogVHdlYWsgSEkxNi9MTzE2Ci0JaGFuZGxpbmcgZm9yIFJFTCByZWxvY2F0aW9ucy4gIEFuZCBvbmx5IGxlZnQtc2hpZnQgUl9NSVBTMjYKLQlyZWxvY2F0aW9uIGFkZGVuZHMgd2hlcmUgbmVjZXNzYXJ5LgotCi0xOTk5LTA4LTAzICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX25leHRfbG8xNl9hZGRlbmQpOiBSZW5hbWUgdG8gLi4uCi0JKG1pcHNfZWxmX25leHRfbG8xNl9yZWxvY2F0aW9uKTogRG9uJ3QgY29tcHV0ZSB0aGUgYWRkZW5kIGhlcmUuCi0JSnVzdCByZXR1cm4gdGhlIHJlbG9jYXRpb24gZm91bmQuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQdWxsIHRoZSBMTzE2IGFkZGVuZCBvdXQgb2YgdGhlCi0Jc2VjdGlvbiBpdHNlbGYgd2hlbiB1c2luZyBSRUwgcmVsb2NhdGlvbnMuCi0JCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogUmVzdG9yZQotCV9EWU5BTUlDX0xJTksgaGFuZGxpbmcgYW5kIGhhbmRsaW5nIG9mIHVuZGVmaW5lZCBzeW1ib2xzIGluIHNoYXJlZAotCWxpYnJhcmllcy4KLQotMTk5OS0wOC0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCB1c2UgdGhlIHJlbG9jYXRpb24KLQl2YWx1ZSBvZiBhIHN5bWJvbCBpbiBhIFNFQ19ERUJVR0dJTkcgc2VjdGlvbi4gIFdhcm4gd2hlbiBkb2luZyBhCi0JcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc3ltYm9sIGluIGFuIGlucHV0IHNlY3Rpb24gd2l0aCBubyBvdXRwdXQKLQlzZWN0aW9uLiAgRnJvbSBEYW5pZWwgSmFjb2Jvd2l0eiA8ZHJvd0BmYWxzZS5vcmc+LgotCi0JKiBjb2ZmLXN0Z28zMi5jIChnbzMyX3N0dWJiZWRfY29mZl9vYmplY3RfcCk6IFJlbW92ZTsgbm90IHVzZWQuCi0KLQkqIGFjaW5jbHVkZS5tNCAoQkZEX0NDX0ZPUl9CVUlMRCk6IENoYW5nZSB0byB1c2UgY29uZnRlc3QsIGFuZCB0bwotCWxvb2sgZm9yIGdlbmVyYXRlZCBmaWxlIGNvcnJlY3RseS4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wOC0wMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9NSVBTXzI2Ci0JYW5kIFJfTUlQUzE2XzI2IHJlbG9jYXRpb25zIGNvcnJlY3RseSB3aGVuIHJlbG9jYXRpbmcuCi0JKF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzKTogRG9uJ3QgYXNzdW1lIHRoYXQgUl9NSVBTX0NBTExfSEkxNgotCWFuZCBSX01JUFNfQ0FMTF9MTzE2IGFyZSBmb3IgZ2xvYmFsIHN5bWJvbHMuCi0JCi0xOTk5LTA4LTAyICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogQ29weSB0aGUgd2hvbGUgaXN5bSwgbm90IGp1c3QKLQlzb21lIGZpZWxkcy4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX291dHB1dF9hcmNoX3N5bXMpOiBEZWNsYXJlIHVzZWQKLQl2YXJpYWJsZXMgYW5kIGluaXRpYWxpemUgdGhlbS4KLQotMTk5OS0wOC0wMSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmspOiBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUKLQl0aGVyZSBhcmUgbm8gZ2xvYmFsIHN5bWJvbHMgcmVxdWlyaW5nIEdPVCBlbnRyaWVzLgotCShfYmZkX21pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBVbmRlZmluZWQgd2VhawotCXN5bWJvbHMgYXJlIGNvbnNpZGVyZWQgdG8gaGF2ZSB0aGUgdmFsdWUgemVyby4KLQkoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgdHJ5IHRvIHBlcmZvcm0gYQotCXJlbG9jYXRpb24gZm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wuCi0JKF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzKTogQWxsb2NhdGUgbG9jYXRlIEdPVCBzcGFjZSBmb3IgbG9jYWwKLQlHT1QxNiByZWxvY2F0aW9ucy4KLQotMTk5OS0wNy0zMCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9idWlsZF9wbHQpOiBDb3NtZXRpYyBjaGFuZ2UgLSBBQkkKLQl3YW50cyBiYSxhLHB0ICV4Y2MgaW5zdGVhZCBvZiAlaWNjLgotCUVtaXQgY29ycmVjdCAuUExUMC0oLlBMVE4rNCkgaW5pdGlhbCB2YWx1ZSBpbnRvIHRoZSBwb2ludGVyIHNsb3RzCi0Jb2YgbGFyZ2UgUExUIGVudHJpZXMuCi0JKHNwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0KTogRml4IGNhbGN1bGF0aW9uLgotCShzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBOZWdhdGl2ZSB2YWx1ZSBvZiBSX1NQQVJDX0pNUF9TTE9UCi0JYWRkZW5kIHNob3VsZCBiZSByZWxhdGl2ZSB0byBsb2FkIGFkZHJlc3MsIG5vdCAucGx0IHNlY3Rpb24gc3RhcnQuCi0JKHNwYXJjNjRfZWxmX3NpemVfaW5mbyk6IFNwYXJjNjQgdXNlcyAzMmJpdCAuaGFzaCBlbnRyaWVzLgotCi0xOTk5LTA3LTMwICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQKLQlwcmludF9zeW1ib2xfYWxsIGFuZCBvdXRwdXRfYXJjaF9zeW1zIGJhY2tlbmQgbWV0aG9kcy4KLQkqIGVsZnh4LXRhcmdldC5oOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLAotCXNwYXJjNjRfZWxmX2FkZF9zeW1ib2xfaG9vaywgc3BhcmM2NF9lbGZfb3V0cHV0X2FyY2hfc3ltcywKLQlzcGFyYzY0X2VsZl9nZXRfc3ltYm9sX3R5cGUsIHNwYXJjNjRfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogTmV3Ci0JZnVuY3Rpb25zLgotCShzcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMZWF2ZSBzcGFjZSBmb3IgU1RUX1JFR0lTVEVSCi0Jc3ltYm9scyBpbiAuZHluc3ltLCBhZGQgdGhlaXIgbmFtZXMgaW50byAuZHluc3RyLiBQdXQgdGhvc2Ugc3ltYm9scwotCWludG8gZHlubG9jYWwuCi0JKHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRml4IHVwIERUX1NQQVJDX1JFR0lTVEVSCi0JcG9pbnRlcnMgdG8gU1RUX1JFR0lTVEVSIHN5bWJvbHMgaW4gZHluc3ltIHNlY3Rpb24uCi0JKHNwYXJjNjRfZWxmX3ByaW50X3N5bWJvbF9hbGwpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBBbGxvdyBzcGVjaWFsIGJhY2tlbmQgc3ltYm9sCi0JcHJpbnRpbmcgdXNpbmcgdGhlIHByaW50X3N5bWJvbF9hbGwgaG9vay4KLQotMTk5OS0wNy0zMCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fY2hlY2tfcmVsb2NzKTogIFVzZSByX29mZnNldCBmb3IKLQlSX0FSTV9HTlVfVlRFTlRSWS4KLQotMTk5OS0wNy0yOSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmspOiBPbmx5IHJlLXNvcnQgZHluc3ltcyBpZgotCWR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZC4KLQotMTk5OS0wNy0yOSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2luZm9fdG9faG93dG9fcmVsKTogU3BsaXQgb3V0IHN3aXRjaCB0byAuLi4KLQkobWlwc19ydHlwZV90b19ob3d0byk6IC4uLiBuZXcgZnVuY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFVzZSBpdC4KLQotMTk5OS0wNy0yOCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdHlwby4KLQotMTk5OS0wNy0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVBhdGNoIGdlbmVyYXRlZCBieSBCZXJuZCBTY2htaWR0LiA8YmVybmRzQGN5Z251cy5jby51az4KLQkKLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBDaGFuZ2UgdG8gc3RyaXAKLQlvdXQgb25seSBzeW1ib2xzIHRoYXQgc3RhcnQgd2l0aCBMT0NBTF9MQUJFTF9QUkVGSVggZm9sbG93ZWQgYnkgJ0wnLgotCi0xOTk5LTA3LTIzICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogbGliY29mZi1pbi5oIChjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBjb2ZmX2xpbmtfaGFzaF9mbGFncwotCWZpZWxkLCBhbmQgZGVmaW5lIENPRkZfTElOS19IQVNIX1BFX1NFQ1RJT05fU1lNQk9MLgotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogSWYgUEUsIGhhbmRsZSBzZWN0aW9uCi0Jc3ltYm9scyBzcGVjaWFsbHkuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLWludGVyaXgqKTogTmV3IHRhcmdldC4KLQotMTk5OS0wNy0yMSAgTWFyayBFbGJyZWNodCAgPHNub3diYWxsM0BiaWdmb290LmNvbT4KLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBJZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyBhbmQKLQlDT0ZGX1NVUFBPUlRfR05VX0xJTktPTkNFLCBtYXJrIHNlY3Rpb25zIHdob3NlIG5hbWVzIGJlZ2luIHdpdGgKLQkuZ251LmxpbmtvbmNlIHdpdGggU0VDX0xJTktPTkNFIGFuZCBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQuCi0JKiBjb2ZmLWdvMzIuYzogKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCShDT0ZGX1NVUFBPUlRfR05VX0xJTktPTkNFKTogRGVmaW5lLgotCSogY29mZi1zdGdvMzIuYzogKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCShDT0ZGX1NVUFBPUlRfR05VX0xJTktPTkNFKTogRGVmaW5lLgotCi0xOTk5LTA3LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gTWFyayBFbGJyZWNodDoKLQkqIG1ha2VmaWxlLmRvczogUmVtb3ZlOyBvYnNvbGV0ZS4KLQkqIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZTsgb2Jzb2xldGUuCi0KLTE5OTktMDctMjEgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LSotdnh3b3JrcyopOiBBZGQgdGFyZ191bmRlcnNjb3JlPXllcy4KLQotMTk5OS0wNy0yMSAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBJc3N1ZSBhbiBlcnJvcgotCW1lc3NhZ2UJYW5kIGZhaWwgaWYgYSBzeW1ib2wgaW5kZXggaXMgb3V0IG9mIHJhbmdlLgotCi0xOTk5LTA3LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IEdldCB0aGUgR1AgdmFsdWUKLQl3aGVuIGxvb2tpbmcgYXQgYSBSX01JUFNfR09UMTYgcmVsb2NhdGlvbi4KLQotMTk5OS0wNy0yMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tODhrLmM6IFVzZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQy4KLQotTW9uIEp1bCAxOSAxNDowMzo0NCAxOTk5ICBNYXJrIFAuIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluYWxfbGluayk6IFJlc3RvcmUgc2V0dGluZyBvZiBHUAotIAlyZW1vdmVkIGluIHByZXZpb3VzIGNoYW5nZS4KLQkoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRqdXN0IEdQIHJlbGF0aXZlIHJlbG9jYXRpb25zCi0gCWluIHJlbG9jYXRlYWJsZSBvdXRwdXQuCi0KLTE5OTktMDctMTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb2ZmLW04OGsuYyAobTg4a2Jjc192ZWMpOiBJbml0aWFsaXplIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0Ci0Jc3RydWN0dXJlLgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBEbyBtZXJnZSBzeW1ib2xzIGZyb20gdGhlIHNhbWUgQkZECi0JaWYgdGhleSBhcHBlYXIgdG8gYmUgc3BlY2lhbGx5IGNyZWF0ZWQgYnkgdGhlIGxpbmtlci4KLQotMTk5OS0wNy0xOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChhbHRlcm5hdGl2ZV90YXJnZXQpOiBOZXcgZmllbGQgaW4gYmZkX3RhcmdldAotCXN0cnVjdHVyZS4KLQkoYmZkX3NlYXJjaF9mb3JfdGFyZ2V0KTogTmV3IGZ1bmN0aW9uOiAgRmluZCBhIHRhcmdldCB0aGF0Ci0Jc2F0aXNpZmllcyBhIHNlYXJjaCBmdW5jdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQotCSogZWxmeHgtdGFyZ2V0Lmg6IEluaXRpYWxpc2UgdGhlIGFsdGVybmF0aXZlX3RhcmdldCBmaWVsZCBvZgotCXRoZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZXMgdG8gcG9pbnQgdG8gdGhlIG90aGVyIHRhcmdldCAoaWYKLQlkZWZpbmVkKS4KLQkqIG5sbS10YXJnZXQuaDogSW5pdGlhbGlzZSB0aGUgYWx0ZXJuYXRpdmVfdGFyZ2V0IGZpZWxkIG9mCi0JdGhlIGJmZF90YXJnZXQgc3RydWN0dXJlcyB0byBwb2ludCB0byB0aGUgb3RoZXIgdGFyZ2V0IChpZgotCWRlZmluZWQpLgotCQotCSogY29mZmNvZGUuaCAoQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMpOiBOZXcgbWFjcm8uCi0JKENSRUFURV9MSVRUTEVfQ09GRl9UQVJHRVRfVkVDKTogTmV3IG1hY3JvLgotCQotCSogYWl4Mzg2LWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogYW91dC1hZG9iZS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBhb3V0LWFybS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBhb3V0LXRhcmdldC5oOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBhb3V0LXRpYzMwLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGJpbmFyeS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBib3V0LmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGNpc2NvLWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1hMjlrLmM6IFVzZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtYWxwaGEuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1hcG9sbG8uYzogVXNlIENSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi1hcm0uYzogVXNlIENSRUFURV97QklHfExJVFRMRX1fQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi1oODMwMC5jOiBVc2UgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLWg4NTAwLmM6IFVzZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtaTM4Ni5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBjb2ZmLWk4NjAuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi1pOTYwLmM6IFVzZSBDUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtbTY4ay5jOiBVc2UgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLW1jb3JlLmM6IFVzZSBDUkVBVEVfe0JJR3xMSVRUTEV9X0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtbWlwcy5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBjb2ZmLXBwYy5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBjb2ZmLXJzNjAwMC5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBjb2ZmLXNoLmM6ICBVc2UgQ1JFQVRFX3tCSUd8TElUVExFfV9DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLXNwYXJjLmM6IFVzZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtdGljMzAuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogY29mZi10aWM4MC5jOiBVc2UgQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMuCi0JKiBjb2ZmLXc2NS5jOiAgIFVzZSBDUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQy4KLQkqIGNvZmYtd2UzMmsuYzogVXNlIENSRUFURV9CSUdfQ09GRl9UQVJHRVRfVkVDLgotCSogY29mZi16OGsuYzogICBVc2UgQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMuCi0JKiBocHBhYnNkLWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogaHB1eC1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGkzODZtc2Rvcy5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBpMzg2b3M5ay5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBpZWVlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIGloZXguYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogaXJpeC1jb3JlLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIG1pcHNic2QuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogbmV0YnNkLWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogb2FzeXMuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogb3NmLWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogcHBjYm9vdC5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBwdHJhY2UtY29yZS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiBzY281LWNvcmUuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogc29tLmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIHNyZWMuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCSogdGVraGV4LmM6IEluaXRpYWxpc2UgbmV3IGZpZWxkIG9mIGJmZF90YXJnZXQgc3RydWN0dXJlLiAKLQkqIHRyYWQtY29yZS5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiB2ZXJzYWRvcy5jOiBJbml0aWFsaXNlIG5ldyBmaWVsZCBvZiBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gCi0JKiB2bXMuYzogSW5pdGlhbGlzZSBuZXcgZmllbGQgb2YgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuIAotCi0xOTk5LTA3LTE5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIHJlbF9oYXNoCi0JYW5kIHJlbF9oZHIuCi0KLVNhdCBKdWwgMTcgMDI6Mjg6MjggMTk5OSAgTWFyayBQLiBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGp1c3RfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBVc2UgaXQuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IERlYWwgd2l0aCB0aGUgZmFjdCB0aGF0IHRoZXJlIGNhbiBiZSAKLQl0d28gcmVsb2NhdGlvbiBzZWN0aW9ucyBmb3IgYSBzaW5nbGUgc2VjdGlvbi4KLQkoZWxmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgR1AgZm9yIAotCWEgcmVsb2NhdGVhYmxlIG9iamVjdC4KLQkoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHJlbG9jYXRlYWJsZSBsaW5rcy4KLQotMTk5OS0wNy0xNiAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvKTogVXNlIEVMRjY0X1JfVFlQRV9JRC4KLQkoc3BhcmM2NF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLAotCXNwYXJjNjRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kLAotCXNwYXJjNjRfZWxmX3NsdXJwX29uZV9yZWxvY190YWJsZSwgc3BhcmM2NF9lbGZfc2x1cnBfcmVsb2NfdGFibGUsCi0Jc3BhcmM2NF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MsIHNwYXJjNjRfZWxmX3dyaXRlX3JlbG9jcyk6Ci0JTmV3IGZ1bmN0aW9ucy4KLQkoc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzLCBzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlCi0JRUxGNjRfUl9UWVBFX0lEL0RBVEEgd2hlcmUgYXBwcm9wcmlhdGUuCi0KLTE5OTktMDctMTYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogUmVtb3ZlCi0JRFRfU1BBUkNfUExURk1ULgotCi0xOTk5LTA3LTE2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9sb2NhbF9yZWxvY2F0aW9uX3ApOiBOZXcgc3RhdGljCi0JZnVuY3Rpb24uCi0JKG1pcHNfZWxmX25leHRfbG8xNl9hZGRlbmQpOiBDYWxsIGJmZF9zZXRfZXJyb3Igb24gZmFpbHVyZS4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBVc2UgbWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wLgotCUFsd2F5cyBzZXQgKnJlcXVpcmVfamFseHAuCi0JKG1pcHNfZWxmX3N0dWJfc2VjdGlvbl9wKTogTWFyayBhYmZkIHBhcmFtZXRlciBhcyB1bnVzZWQuCi0JKF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE9ubHkgbG9vayBmb3IgTE8xNiBmb2xsb3dpbmcKLQlHT1QxNiBpZiB0aGUgR09UMTYgaXMgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbC4gIERvbid0IHJldHVybiBmYWxzZQotCWZvciBhbiB1bmRlZmluZWQgc3ltYm9sLiAgSWYgdGhlcmUgaXMgYW4gb3ZlcmZsb3csIGFzc2VydCB0aGF0IHdlCi0JaGF2ZSBhIG5hbWUuCi0KLTE5OTktMDctMTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sKTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlcyBgbGluaycgYW5kIGBlbGZzZWMnLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGBvcycuCi0KLVRodSBKdWwgMTUgMTc6NTU6MzEgMTk5OSAgTWFyayBQLiBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcCk6IERvbid0IHJlcXVpcmUKLQlhIFBUX1BIRFIgcHJvZ3JhbSBoZWFkZXJzLgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmspOiBEb24ndCBhc3N1bWUgdGhlcmUgYXJlIGdvaW5nIHRvIGJlCi0Jc2VjdGlvbiBzeW1ib2xzIHdoZW4gd2UncmUgbm90IGJ1aWxkaW5nIGEgc2hhcmVkIG9iamVjdC4KLQkoX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MpOiBNYWtlIHN1cmUgd2UgaGF2ZSBhIEdPVCB3aGVuCi0Jd2UgbmVlZCBvbmUuCi0KLTE5OTktMDctMTUgIEouVC4gQ29ua2xpbiAgPGp0Y0ByZWRiYWNrLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LSotdnh3b3JrcyopOiBOZXcgdGFyZ2V0LgotCi0xOTk5LTA3LTE1ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3N0dWJfc2VjdGlvbl9wKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IEhhbmRsZSBNSVBTMTYgc3R1YiBmdW5jdGlvbnMuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGp1c3QgY2FsbGluZyBzZXF1ZW5jZSBmb3IKLQltaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbiBhbmQgbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uLgotCShtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBUdXJuIGBqYWwnIGludG8gYGphbHgnIHdoZXJlCi0JcmVxdWlyZWQuCi0KLTE5OTktMDctMTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEJ1bXAgdmVyc2lvbiBudW1iZXIgdG8gMi45LjUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBKdWwgMTUgMDI6NTY6MTUgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlLCBjYXNlIFJfSFBQQSk6IEhhbmRsZQotCTY0Yml0IGZvcm1hdC4KLQkoX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSwgY2FzZSBSX0dPVE9GRik6IFVzZSBiYXNlIHJlbG9jIHR5cGUKLQl0byBkZXJpdmUgZmluYWwgdHlwZSBpbnN0ZWFkIG9mIGhhcmR3aXJpbmcgYSBzZWxlY3Rpb24uCi0KLTE5OTktMDctMTQgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfb2J0YWluX2NvbnRlbnRzKTogU3dhcCAxNi1iaXQgaGFsdmVzIG9mCi0JdGhpbmdzIHJlbG9jYXRlZCBieSBSX01JUFMxNl9HUFJFTC4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0KLVdlZCBKdWwgMTQgMTU6MjM6MTkgMTk5OSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmTk5fYmVkKTogQWRkIGVsZl9iYWNrZW5kX3dhbnRfZHluYnNzLgotCi0xOTk5LTA3LTE0ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2dvdF9pbmZvKTogQWRkIGdsb2JhbF9nb3Ruby4KLQkoX2JmZF9taXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgaXQuCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfbGluayk6IFJlLXNvcnQ7IHZlcmlmeSB0aGUgZ290IGRpZCBub3QgZ3Jvdy4KLQkobWlwc19lbGZfc29ydF9oYXNoX3RhYmxlKTogU2V0IG1heF9ub25fZ290X2R5bmluZGV4IGJhc2VkIG9mZgotCW5ldyBhcmd1bWVudCBtYXhfbG9jYWwuCi0KLTE5OTktMDctMTQgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfb2J0YWluX2NvbnRlbnRzKTogU3dhcCB0aGUgMTYtYml0Ci0Jc3Vid29yZHMgd2hlbiBoYW5kbGluZyBhbiBSX01JUFMxNl8yNiByZWxvY2F0aW9uLgotCShtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCBiZSBwYXJhbm9pZCBhYm91ciByaWdodC1zaGlmdAotCXNlbWFudGljcy4KLQkKLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHMxNl9ncHJlbF9ob3d0byk6IEFkanVzdCBzcmNfbWFzayBhbmQKLQlkc3RfbWFzayB0byBtYXRjaCByZWFsaXR5LgotCShfYmZkX21pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogSGFuZGxlIFJfTUlQUzE2X0dQUkVMLgotCShtaXBzX2VsZl9vYnRhaW5fY29udGVudHMpOiBVc2UgYmZkX2dldC4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIFJfTUlQUzE2X0dQUkVMLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLTE5OTktMDctMTMgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBIYW5kbGUgUl9NSVBTMTZfMjYuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGp1c3QgY2FsbGluZyBzZXF1ZW5jZSBmb3IgCi0JbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uLgotCShtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBUYWtlIGFkZGl0aW9uYWwgYXJndW1lbnQuICBIYW5kbGUKLQlSX01JUFMxNl8yNi4gIFVzZSBiZmRfcHV0IGZvciBjb252ZW5pZW5jZS4KLQotMTk5OS0wNy0xMyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBUaGlua28gbGFzdCBjaGFuZ2UuCi0JQWx3YXlzIG92ZXJ3cml0ZSBwX2ZsYWdzLgotCi0xOTk5LTA3LTEzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIHdhbnRfZHluYnNzLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgY3JlYXRlCi0JLmR5bmJzcyBhbmQgLnJlbFthXS5ic3MgaWYgd2FudF9keW5ic3MuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfd2FudF9keW5ic3MpOiBQcm92aWRlIGRlZmF1bHQuCi0KLTE5OTktMDctMTMgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRG9uJ3Qgb3ZlcndyaXRlIHBfZmxhZ3MuCi0KLTE5OTktMDctMTMgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkpOiBOZXcuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGR5bmxvY2FsLgotCShfYmZkX2VsZl9saW5rX2xvb2t1cF9sb2NhbF9keW5pbmR4KTogUHJvdG90eXBlLgotCShfYmZkX2VsZl9saW5rX2FkanVzdF9keW5pbmR4KTogRGVsZXRlLgotCShfYmZkX2VsZl9saW5rX3JlbnVtYmVyX2R5bnN5bXMpOiBQcm90b3R5cGUuCi0JKF9iZmRfZWxmLGxpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sKTogUHJvdG90eXBlLgotCSogZWxmY29kZS5oIChlbGZfbGlua19yZWNvcmRfbG9jYWxfZHluYW1pY19zeW1ib2wpOiBOZXcgYWxpYXMuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHgpOiBEZWxldGUuCi0JKF9iZmRfZWxmX2xpbmtfbG9va3VwX2xvY2FsX2R5bmluZHgpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9saW5rX3JlbnVtYmVyX2hhc2hfdGFibGVfZHluc3ltcyk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfbGlua19yZW51bWJlcl9keW5zeW1zKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmbGluay5oIChlbGZfbGlua19yZWNvcmRfbG9jYWxfZHluYW1pY19zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKHN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8pOiBEZWxldGUgcmVtb3ZlZF9keW5hbWljLgotCShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQKLQlpbnN0ZWFkIG9mIGVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcy4KLQlSZW1vdmUgcmVtb3ZlZF9keW5hbWljIGNvZGUuICBVc2UgX2JmZF9lbGZfbGlua19yZW51bWJlcl9keW5zeW1zLgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBSZW1vdmUgcmVtb3ZlZF9keW5hbWljIGNvZGUuCi0JKGVsZl9saW5rX3JlbnVtYmVyX2R5bnN5bXMpOiBEZWxldGUuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IEluc3RhbGwgc2VjdGlvbiBhbmQgbG9jYWwgc3ltYm9scyBpbnRvIC5keW5zeW0uCi0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmluZHgpOiBEZWxldGUuCi0JKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHNldCBzZWN0aW9uIGR5bmluZGljaWVzLgotCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHdyaXRlIHNlY3Rpb24gZHluc3ltcy4KLQkqIGVsZjMyLW1pcHMuYzogU2ltaWxhcmx5LgotCSogZWxmMzItcHBjLmM6IFNpbWlsYXJseS4KLQkqIGVsZjMyLXNwYXJjLmM6IFNpbWlsYXJseS4KLQkqIGVsZjY0LWFscGhhLmM6IFNpbWlsYXJseS4KLQkqIGVsZjY0LXNwYXJjLmM6IFNpbWlsYXJseS4KLQotMTk5OS0wNy0xMyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IERvIG5vdCBjb21wbGFpbgotCXdoZW4gX2dwX2Rpc3AgaXMgdW5kZWZpbmVkLiAgRG8gbm90IGNoZWNrIFJfTUlQU19MTzE2IGZvciBvdmVyZmxvdwotCXdoZW4gdGhlIHJlbG9jYXRpb24gaXMgYWdhaW5zdCBfZ3BfZGlzcC4KLQotMTk5OS0wNy0xMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZHdhcmYyLmMgKHJlYWRfYXR0cmlidXRlKTogU3VwcG9ydCBEV19GT1JNX3JlZjguCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IENoYW5nZSBtaXBzXzMyX3JlbG9jcwotCXRvIHBvc3NpYmx5X2R5bmFtaWNfcmVsb2NzLiAgQWRqdXN0IHVzYWdlIHRocm91Z2hvdXQgY29kZS4KLQkoZWxmX21pcHNfaG93dG9fdGFibGUpOiBIYW5kbGUgUl9NSVBTXzY0IGNvcnJlY3RseS4KLQkoZWxmX21pcHNfY3RvcjY0X2hvd3RvKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uKTogSGFuZGxlIFJfTUlQU182NCBsaWtlIFJfTUlQU18zMi4KLQlBZGp1c3QgaW5kZW50YXRpb24uCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9NSVBTXzY0IGluIDMyLWJpdCBtb2RlLgotCShfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSBSX01JUFNfNjQgbGlrZSBSX01JUFNfMzIuCi0JVXNlIE1JUFNfRUxGX0dPVF9TSVpFIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBHT1QgZW50cmllcy4KLQkqIGVsZjY0LW1pcHMuYyAoZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxfcCk6IERlZmluZS4KLQotMTk5OS0wNy0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBiZmQtaW4uaDogUmVtb3ZlIHRlc3RzIG9mIENPRkZfSU1BR0VfV0lUSF9QRS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogTWFueSBmaWxlczogQ2hhbmdlcyB0byBhdm9pZCBnY2Mgd2FybmluZ3M6IEFkZCBBVFRSSUJVVEVfVU5VU0VECi0JYXMgYXBwcm9wcmlhdGUuICBVc2UgRU1QVFlfSE9XVE8gYXMgYXBwcm9wcmlhdGUuICBGaWxsIGluCi0Jc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucy4gIEFkZCBjYXN0cy4KLQkqIHJlbG9jLmMgKEVNUFRZX0hPV1RPKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogUmVtb3ZlIHVzZWxlc3MKLQljb21wYXJpc29ucyBhZ2FpbnN0IDAuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2hhbmdlCi0JcHJldmlvdXNfaWJmZF9lX2ZsYWdzIHRvIHVuc2lnbmVkIGxvbmcuCi0JKiB2bXMuaCAoc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0KTogQ2hhbmdlIHNlY3Rpb25fY291bnQgdG8KLQl1bnNpZ25lZC4KLQkqIHZtcy1nc2QuYyAoX2JmZF92bXNfc2x1cnBfZ3NkKTogQ2hhbmdlIHBzZWN0X2lkeCB0byB1bnNpZ25lZC4KLQkoX2JmZF92bXNfd3JpdGVfZ3NkKTogQ2hhbmdlIHN5bW51bSB0byB1bnNpZ25lZC4KLQkqIHZtcy1oZHIuYyAoX2JmZF92bXNfd3JpdGVfaGRyKTogQ2hhbmdlIHN5bW51bSB0byB1bnNpZ25lZC4KLQkqIHZtcy10aXIuYyAoZXRpcl9zdGEpOiBDaGFuZ2UgcHNlY3QgdG8gdW5zaWduZWQuCi0JKGFsbG9jX3NlY3Rpb24pOiBDaGFuZ2UgaWR4IHRvIHVuc2lnbmVkLgotCSh0aXJfc3RhLCB0aXJfY3RsKTogQ2hhbmdlIHBzZWN0IHRvIHVuc2lnbmVkLgotCShfYmZkX3Ztc193cml0ZV90aXIpOiBDaGFuZ2UgbGVuIGFuZCBiZWZvcmUgdG8gYmZkX3NpemVfdHlwZS4KLQkqIHZtcy5jIChwcml2X3NlY3Rpb25fY291bnQpOiBDaGFuZ2UgdG8gdW5zaWduZWQuCi0KLTE5OTktMDctMTIgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYzogQWRkIHNvbWUgQVRUUklCVVRFX1VOVVNFRC4KLQkqIG02OGtsaW51eC5jOiBMaWtld2lzZS4KLQotMTk5OS0wNy0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IENoYW5nZXMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzOiBSZW1vdmUgdW51c2VkIGxvY2FsCi0JdmFyaWFibGVzLiAgQWRkIGRlZmF1bHQgY2FzZSB0byBlbnVtIHN3aXRjaGVzLgotCSogY29mZi1hcm0uYyAoYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpOiBPbmx5Ci0JY29tcGlsZSBpZiBub3QgQ09GRl9JTUFHRV9XSVRIX1BFLgotCShyZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUsIHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSk6IExpa2V3aXNlLgotCShiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6IExpa2V3aXNlLgotCShiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGVwb2MtcGVpLWFybS5jOiBEb24ndCByZW5hbWUgYmZkX2FybSBmdW5jdGlvbnMuCi0JKiBwZWktYXJtLmM6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRG9uJ3QgZGVjbGFyZS4KLQkoTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkpOiBDb3JyZWN0IGxhc3QgY2hhbmdlLgotCShtaXBzX2VsZl9nb3QxNl9lbnRyeSk6IFB1dCBwYXJlbnMgYXJvdW5kICYgaW4gYm9keSBvZiA9PS4KLQkobWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24pOiBDb3JyZWN0IHRlc3QgZm9yIGVtcHR5IHN0cmluZy4KLQkqIHZtcy1nc2QuYzogVXNlIF9iZmRfZXJyb3JfaGFuZGxlciByYXRoZXIgdGhhbiBmcHJpbnRmIHRvCi0Jc3RkZXJyLgotCSogdm1zLW1pc2MuYyAoX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sKTogQ29ycmVjdCBzcHJpbnRmCi0JZm9ybWF0LgotCi0xOTk5LTA3LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFueSBmaWxlczogQ2hhbmdlcyB0byBhdm9pZCBnY2Mgd2FybmluZ3M6IEFkZCBBVFRSSUJVVEVfVU5VU0VECi0JYXMgYXBwcm9wcmlhdGUuICBGaWxsIGluIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMuICBBZGQgdmFyaWFibGUKLQlpbml0aWFsaXphdGlvbnMuICBBZGQgY2FzdHMuCi0JKiBkd2FyZjEuYyAocGFyc2VfbGluZV90YWJsZSk6IENoYW5nZSBlYWNoTGluZSB0byB1bnNpZ25lZCBsb25nLgotCShkd2FyZjFfdW5pdF9maW5kX25lYXJlc3RfbGluZSk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGxvbmcuCi0KLQkqIGVsZi5jIChiZmRfZWxmX2hhc2gpOiBDaGFuZ2UgcGFyYW1ldGVyIGZyb20gdW5zaWduZWQgY2hhciAqIHRvCi0JY2hhciAqLgotCSogZWxmLWJmZC5oIChiZmRfZWxmX2hhc2gpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogUmVtb3ZlIGNhc3RzCi0Jd2hlbiBjYWxsaW5nIGJmZF9lbGZfaGFzaC4KLQotMTk5OS0wNy0xMSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9wdXRfOCk6IE1ha2UgaXQgb2YgdHlwZSBgdm9pZCcuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogZWxmMzItbWlwcy5jIChNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSk6IENvbmRpdGlvbmFsaXplCi0JZm9yIDMyLWJpdCBob3N0cy4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVhZF9yZWxvY3NfZnJvbV9zZWN0aW9uKTogQmUgdHlwZS1jb3JyZWN0LgotCi1UaHUgSnVsICA4IDEyOjMyOjIzIDE5OTkgIEpvaG4gRGF2aWQgQW5nbGluIDxkYXZlQGhpYXVseTEuaGlhLm5yYy5jYT4KLQotCSogY29uZmlnLmJmZCAoaHBwYSotKi1saW51eC1nbnUqKTogTmV3IHRhcmdldAotCi0xOTk5LTA3LTA3ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYtYmZkLmggKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBDb25zdGlmeS4KLQkoX2JmZF9taXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4JCi0JKF9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9nY19tYXJrX2hvb2spOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9nY19zd2VlcF9ob29rKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9kYXRhKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXApOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmMzJfb2JqZWN0X3ApOiBNb3ZlIGNvbnRlbnRzIGludG8KLQlfYmZkX21pcHNfZWxmX29iamVjdF9wLgotCShtaXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IFJlbmFtZSB0bwotCV9iZmRfbWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMuCi0JKG1pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcCk6IFJlbmFtZSB0bwotCV9iZmRfbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwLgotCShlbGZfbWlwc19hYmlfbmFtZSk6IENoYW5nZSBwcm90b3R5cGUuCi0JKG1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIpOiBNZXJnZSBpbnRvCi0JX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkci4KLQkobWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBNZXJnZSBpbnRvCi0JX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcuCi0JKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBSZW5hbWUgdG8gX2JmZF9taXBzX2VsZl9maW5hbF9saW5rLiAgSW52b2tlCi0JdGhlIHJpZ2h0IGJhY2stZW5kIEVMRiBsaW5rZXIuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24uICBDbGVhbiB1cC4gIEFkanVzdCBmb3IgNjQtYml0IGNvZGUuCi0JKG1pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogUmVuYW1lIHRvCi0JX2JmZF9taXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vay4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbik6IFJlbmFtZSB0bwotCV9iZmRfbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbi4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogUmVuYW1lIHRvIF9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzLgotCUFkanVzdCBmb3IgNjQtYml0IGNvZGUuICBVc2UgbWlwc19lbGZfZ290X3NlY3Rpb24uCi0JKG1pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJlbmFtZSB0bwotCV9iZmRfbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLiAgVXNlCi0JbWlwc19lbGZfYWxsb2NhdGVfZHluYW1pY19yZWxvY2F0aW9ucy4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogUmVuYW1lIHRvCi0JX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wuICBVc2UgbWlwc19lbGZfZ290X3NlY3Rpb24uCi0JQWRqdXN0IGZvciA2NC1iaXQgY29kZS4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLiAgQWRqdXN0IGZvciA2NC1iaXQgY29kZS4KLQkobWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMpOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zLgotCShtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBSZW5hbWUgdG8KLQlfYmZkX21pcHNfZWxmX2FkZF9zeW1ib2xfaG9vay4KLQkobWlwc19lbGZfbmV4dF9sbzE2X2FkZGVuZCk6IENvbnN0aWZ5LgotCShtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9vYnRhaW5fY29udGVudHMpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfYWxsb2NhdGVfZHluYW1pY19yZWxvY2F0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUpOiBOZXcgbWFjcm8uCi0JKE1JUFNfRUxGX1JFTF9TSVpFKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX0RZTl9TSVpFKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX0dPVF9TSVpFKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX1NZTV9TSVpFKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX0xPR19GSUxFX0FMSUdOKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX0dFVF9XT1JEKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX1BVVF9XT1JEKTogTGlrZXdpc2UuCi0JKE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZKTogTGlrZXdpc2UuCi0JKFNUVUJfTFcpOiBDb25kaXRpb25hbGl6ZSBmb3IgNjQtYml0IHZhbHVlLgotCShlbGZfbWlwc19ob3d0b190YWJsZSk6IEFkZCBSX01JUFNfSElHSEVSIGFuZCBSX01JUFNfSElHSEVTVAotCWVudHJpZXMuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE1lcmdlIGVfaWRlbnRbRUlfQ0xBU1NdLgotCUNoZWNrIGl0IGZvciBpbmNvbnNpc3RlbmN5LgotCShfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBQcmludCBBQkk9NjQgZm9yIDY0LWJpdAotCUFCSS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogUmVtb3ZlIGR1cGxpY2F0ZSBoYW5kbGluZyBvZgotCS5tc3ltLiAKLQkobWlwc19lbGZfZ2xvYmFsX2dvdF9pbmRleCk6IFVzZSBNSVBTX0VMRl9HT1RfU0laRS4KLQkobWlwc19lbGZfZ290X29mZnNldF9mcm9tX2luZGV4KTogVXNlIG1pc3BfZWxmX2dvdF9zZWN0aW9uLgotCShtaXBzX2VsZl9jcmVhdGVfbG9jYWxfZ290X2VudHJ5KTogVXNlIE1JUFNfRUxGX0dPVF9TSVpFLgotCShtaXBzX2VsZl9sb2NhbF9nb3RfaW5kZXgpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ290X3BhZ2UpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ290X2luZm8pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfcmVsb2NhdGlvbik6IEhhbmRsZSAzMi1iaXQvNjQtYml0IHNwbGl0LgotCShFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUik6IEhhbmRsZSA2NC1iaXQgY29kZS4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgTUlQU19FTEZfTE9HX0ZJTEVfQUxJR04sCi0JaW5zdGVhZCBvZiBjb25zdGFudCBgMicuCi0JKG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IFRpZHkuICBVc2UgTUlQU19FTEZfR09UX1NJWkUuCi0JKG1pcHNfZWxmX2NyZWF0ZV9tc3ltX3NlY3Rpb24pOiBVc2UgTUlQU19FTEZfTE9HX0ZJTEVfQUxJR04uCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZQotCU1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FLCBNSVBTX0VMRl9HT1RfU0laRSwKLQlNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWS4gIFJlbW92ZSAjaWYgMCdkIGNvZGUuCi0JQWRqdXN0IGFsbCByZWxldmVhbnQgZW50cmllcyBpbiBlbGYgYmFja2VuZCB0YWJsZS4KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9zZWN0aW9uX2Zyb21fc2hkcik6IFJlbW92ZS4KLQkobWlwc19lbGY2NF9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQlBZGp1c3QgZWxmIGJhY2tlbmQgZW50cmllcyB0byB1c2UgX2JmZF9taXBzX2VsZiB2YXJpYW50cyBub3cKLQlwdWJsaWNseSBhdmFpbGFibGUuCi0JCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogSGFuZGxlIG5vbi1zdGFuZGFyZAotCWhhc2gtZW50cnkgc2l6ZXMuCi0JKHNpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogTGlrZXdpc2UuCi0JKiBlbGYuYzogKGVsZl9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBsaWJiZmQuYyAoYmZkX2dldCk6IE5ldyBtYWNyby4KLQkoYmZkX3B1dCk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotMTk5OS0wNy0wNyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmLWJmZC5oIChlbGZfc2l6ZV9pbmZvKTogQWRkIGhhc2hfZW50cnlfc2l6ZSwKLQlpbnRfcmVsc19wZXJfZXh0X3JlbCwgc3dhcF9keW5fb3V0LCBzd2FwX3JlbG9jX2luLCBzd2FwX3JlbG9jX291dCwKLQl3YXBfcmVsb2NhX2luLCBhbmQgc3dhcF9yZWxvY2Ffb3V0LiAKLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVhZF9yZWxvY3NfZnJvbV9zZWN0aW9uKTogQWRqdXN0IHRvIGhhbmRsZQotCW11bHRpcGxlIGludGVybmFsIHJlbG9jYXRpb25zIHBlciBleHRlcm5hbCByZWxvY2F0aW9uLgotCShsaW5rX3JlYWRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IExpa2V3aXNlLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkoZWxmX2djX21hcmspOiBMaWtld2lzZS4KLQkoZWxmX2djX3NtYXNoX3VudXNlZF92dGVudHJ5X3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfc3dhcF9keW5fb3V0KTogQWRqdXN0IHR5cGUgdG8gbWF0Y2gKLQllbGZfc3dhcF9keW5faW4uCi0JKHNpemVfaW5mbyk6IEFkZCBlbnRyaWVzIGZvciBuZXcgZmllbGRzLgotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X3N3YXBfcmVsb2Nfb3V0KTogRW5hYmxlLgotCShtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NfaW4pOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmNjRfYmVfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkobWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jYV9pbik6IExpa2V3aXNlLgotCShtaXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX291dCk6IExpa2V3aXNlLgotCShtaXBzX2VsZjY0X3NpemVfaW5mbyk6IEFkZCBlbnRyaWVzIGZvciBuZXcgZmllbGRzLgotCQotMTk5OS0wNy0wNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogQXNzZXJ0IHRoYXQgc2VjdGlvbiByZWxvY19jb3VudAotCWZpZWxkIGVxdWFscyB0aGUgbmV3IHJlbF9jb3VudCBmaWVsZC4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB1c2UgdGhlIG5ldwotCXJlbF9jb3VudCBmaWVsZCByYXRoZXIgdGhhbiB0aGUgcmVsb2NfY291bnQgZmllbGQuCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKGVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBQZXJtaXQgYSBub24td2VhayBkZWZpbml0aW9uIGluIGEKLQlzaGFyZWQgbGlicmFyeSB0byBvdmVycmlkZSBhIHdlYWsgZGVmaW5pdGlvbiBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotCi1UdWUgSnVsICA2IDEwOjIzOjM5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oOiBSZXZlcnQgSnVseSAyLCAxOTk5IHBhdGNoLgotCi0JKiBlbGYtaHBwYS5oIChfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlKTogVCBtb2RlIHNlbGVjdG9ycwotCW5lZWQgdG8gZ2VuZXJhdGUgRExUSU5EIHJlbG9jYXRpb25zLCBub3QgRExUUkVMIHJlbG9jYXRpb25zLgotCi0xOTk5LTA3LTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFJlY29nbmlzZSBhcm0gNQotCWFyY2hpdGVjdHVyZXMuIAotCShjb2ZmX3NldF9mbGFncyk6IFJlY29nbmlzZSBhcm0gNSBhcmNoaXRlY3R1cmVzLgotCi0JKiBjcHUtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciBzdHJvbmdhcm0gYW5kIGFybTkgY3B1cy4KLQlBZGQgc3VwcG9ydCBmb3IgYXJtdjUgYXJjaGl0ZWN0dXJlLgotCi0JKiBhcmNodXJlcy5jOiBBZGQgYmZkX21hY2hfYXJtXzUgYW5kIGJmZF9tYWNoX2FybV81VC4KLQkKLQkqIHJlbG9jLmM6IEFkZCBuZXcsIGFzc2VtYmxlciBvbmx5LCBBUk0gcmVsb2M6Ci0JQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURS4KLQkKLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQotMTk5OS0wNy0wMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZHdhcmYyLmMgKHBhcnNlX2NvbXBfdW5pdCk6IEFkZCBBQkJSRVZfTEVOR1RIIHBhcmFtZXRlci4KLQkoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUpOiBBZGQgQUREUl9TSVpFIHBhcmFtZXRlci4KLQkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFBhc3MgaXQuCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX2ZpbmRfbmVhcmVzdF9saW5lKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKEFCSV82NF9QKTogTmV3IG1hY3JvLgotCShJUklYX0NPTVBBVCk6IFdlIGFyZSBJUklYNi1jb21wYXRpYmxlIGlmIEFCSV82NF9QLgotCShfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogQWRqdXN0IGNhbGwgdG8KLQlfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLTE5OTktMDctMDIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgKiBhdCB0aGUgZW5kIG9mIGlbMzQ1Nl04Ni0qLXVuaXh3YXJlLgotCi1GcmkgSnVsICAyIDEyOjIxOjEwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oIChIUFBBX1JfQVJHX1JFTE9DKTogRGVsZXRlLgotCShIUFBBX1JfQ09OU1RBTlQsIEhQUEFfUl9BRERFTkQpOiBMaWtld2lzZS4KLQotMTk5OS0wNy0wMSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmLWJmZC5oIChiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCByZWxfY291bnQgYW5kIHJlbF9jb3VudDIKLQlmaWVsZHMuCi0JKF9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkcik6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZi5jIChfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rKTogVXNlIGJmZF96YWxsb2MsIHJhdGhlciB0aGFuCi0JYmZkX2FsbG9jIGZvbGxvd2VkIGJ5IG1lbXNldC4KLQkoX2JmZF9lbGZfaW5pdF9yZWxvY19zaGRyKTogTmV3IGZ1bmN0aW9uLCBzcGxpdCBvdXQgZnJvbSAuLi4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBIZXJlLgotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogQXNzaWduIHNlY3Rpb24gbnVtYmVycyBmb3IgdGhlIHNlY29uZAotCXJlbG9jYXRpb24gc2VjdGlvbiwgaWYgcmVxdWlyZWQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9saW5rX3NpemVfcmVsb2Nfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBVc2UgZWxmX2xpbmtfc2l6ZV9yZWxvY19zZWN0aW9uLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBVc2UgZWxmX2xpbmtfb3V0cHV0X3JlbG9jcy4KLQkKLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogVXNlCi0JX2JmZF9lbGZfaW5pdF9yZWxvY19zaGRyIHRvIGluaXRpYWxpemUgcmVsX2hkcjIuCi0KLVRodSBKdWwgIDEgMTM6NTg6NDggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oIChfYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlKTogSGFuZGxlIFJfUENSRUxfQ0FMTAotCXdpdGggMjJiaXQgZm9ybWF0LgotCi0xOTk5LTA2LTI4ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2dvdF9pbmZvKTogTW92ZSBkZWNsYXJhdGlvbiBiZWZvcmUKLQlwcm90b3R5cGVzLiAgQ2hhbmdlIGdsb2JhbF9nb3RzeW0gdG8gYmUgYSBwb2ludGVyIHRvIGEgaGFzaCBlbnRyeSwKLQlyYXRoZXIgdGhhbiBhIG51bWJlciBpbmRleC4KLQkobWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogTW92ZSBkZWNsYXJhdGlvbiBiZWZvcmUgcHJvdG90eXBlcy4KLQkobWlwc19lbGZfaXJpeDZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZl9zaWduX2V4dGVuZCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9oaWdoKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2hpZ2hlcik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9oaWdoZXN0KTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dsb2JhbF9nb3RfaW5kZXgpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfbG9jYWxfZ290X2luZGV4KTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dvdF9vZmZzZXRfZnJvbV9pbmRleCk6IExpa2Vpd3NlLgotCShtaXBzX2VsZl9yZWNvcmRfZ2xvYmFsX2dvdF9zeW1ib2wpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ290X3BhZ2UpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfbmV4dF9sbzE2X2FkZGVuZCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9vYnRhaW5fY29udGVudHMpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2Fzc2lnbl9ncCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9zb3J0X2hhc2hfdGFibGVfZik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9zb3J0X2hhc2hfdGFibGUpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ290X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ290X2luZm8pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY3JlYXRlX2xvY2FsX2dvdF9lbnRyeSk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9nb3QxNl9lbnRyeSk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIGRlc2NyaXB0aW9uIG9mIFJfTUlQU19TQ05fRElTUC4KLQkobWlwc19lbGZfZmluYWxfZ3ApOiBVc2UgbWlwc19lbGZfYXNzaWduX2dwLgotCShfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogRG9uJ3QgbW92ZSBTSE5fQ09NTU9OIHN5bWJvbHMKLQlpbnRvIFNITl9TQ09NTU9OIGF1dG9tYXRpY2FsbHkgb24gSVJJWDYuCi0JKG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmV3cml0ZSwgdXNpbmcKLQltaXBzX2VsZl9jYWxjdWxhdGVfcmVsb2NhdGlvbiBhbmQgbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uLgotCShtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9uKTogVXNlIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FLgotCURvbid0IGRlYWwgd2l0aCAucmxkX21hcCBvbiBJUklYNi4KLQkobWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogQWRqdXN0IHVzZSBvZiBnbG9iYWxfZ290c3ltLiAgU2V0Ci0Jc2VjdGlvbiBmbGFncyBhcHByb3ByaWF0ZWx5IGZvciAuZ290LgotCShtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBIYW5kbGUgSVJJWDYgcmVsb2NhdGlvbnMgbWFraW5nIHVzZSBvZgotCXRoZSBnb3QuICBDYWxsIG1pcHNfZWxmX3JlY29yZF9nbG9iYWxfZ290X3N5bWJvbCBhbmQgYWxsb2NhdGUKLQlsb2NhbCBnb3Qgc3BhY2UgYXBwcm9wcmlhdGVseS4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIGJmZF9ieXRlICosIG5vdCB1bnNpZ25lZAotCWNoYXIgKi4gIFJld29yayBjYWxjdWxhdGlvbiBvZiBHT1Qgc2l6ZS4gIFNvcnQgZHluYW1pYyBzeW1ib2wKLQl0YWJsZSBlbnRyaWVzIHNvIGVudHJpZXMgdGhhdCBkbyBub3QgcmVxdWlyZSBHT1QgZW50cmllcyBhcHBlYXIgYXQKLQl0aGUgYmVnaW5uaW5nLiAgRG9uJ3QgdXNlIERUX01JUFNfSElQQUdFTk8gb24gSVJJWDYuICBSZW1vdmUgZGVhZAotCWNvZGUgZGVhbGluZyB3aXRoIERUX0lOSVQgYW5kIERUX0ZJTkkuICBSZW1vdmUgZmlkZGxpbmcgd2l0aAotCWdsb2JhbF9nb3RzeW0uCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEFkanVzdCBjcmVhdGlvbiBvZiBnbG9iYWwgR09UCi0JZW50cmllcy4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogVXNlCi0JbWlwc19lbGZfaXJpeDZfZmluaXNoX2R5bmFtaWNfc3ltYm9sLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IENvcnJlY3Qgb2ZmLWJ5LW9uZSBlcnJvcgotCXNldHRpbmcgRFRfTUlQU19VTlJFRkVYVE5PLiAgQWRqdXN0IHNldHRpbmcgb2YgRFRfTUlQU19HT1RTWU0gZm9yCi0JY2hhbmdlIHRvIGdsb2JhbF9nb3RzeW0uICBTZXQgRFRfTUlQU19PUFRJT05TIG9uIElSSVg2LgotCQkKLTE5OTktMDYtMzAgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgQ1BJQyB3aGVuIGRvaW5nIGEKLQlyZWxvY2F0ZWFibGUgbGluay4gIEZyb20gUmFsZiBCYWVjaGxlIDxyYWxmQHVuaS1rb2JsZW56LmRlPi4KLQotMTk5OS0wNi0wNCAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogZWxmMzItYXJtLmggKGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplKTogTGlrZXdpc2UuCi0KLTE5OTktMDYtMjggIEppbSBQaWNrICA8amltQGppbXBpY2suY29tPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBNaW5kIG5vX3VuZGVmaW5lZAotCi1UdWUgSnVuIDI5IDAyOjI1OjAzIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLWhwcGEuYyAoZWxmX2hwcGFfaG93dG9fdGFibGUpOiBVc2UgYmZkX2VsZl9nZW5lcmljX3JlbG9jIGFzCi0JcmVsb2NhdGlvbiBmdW5jdGlvbi4KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2MpOiBLaWxsIHVudXNlZC91bndhbnRlZCBmdW5jdGlvbi4KLQotMTk5OS0wNi0yNyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChNSVBTX0VMRl9TUkRBVEFfU0VDVElPTl9OQU1FKTogTmV3IG1hY3JvLgotCShNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRSk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogVXNlIHRoZW0uCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLiAgQWRkIC5zcmRhdGEgdG8gdGhlIGxpc3QKLQlvZiBHUC1yZWxhdGl2ZSBzZWN0aW9ucy4KLQkoX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFVzZSB0aGVtLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyk6IFNoYXJlIGNvZGUgYmV0d2VlbiAuc2RhdGEgYW5kCi0JLmxpdDQvLmxpdDggc2VjdGlvbnMuICBTZXQgYXBwcm9wcmlhdGUgZmxhZ3MgZm9yIC5zcmRhdGEuCi0JKG1pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogQWRkIGhhbmRsaW5nIGZvcgotCVBUX01JUFNfT1BUSU9OUyBzZWdtZW50IG9uIElSSVg2LgotCShtaXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXApOiBMaWtlaXdzZS4KLQkobWlwc19lbGZfZmluYWxfbGluayk6IFNldCBFRl9NSVBTX0NQSUMgd2hlbiByZXF1aXJlZCBieSB0aGUgQUJJLgotCUluY2x1ZGUgdGhlIG9wdGlvbnMgc2VjdGlvbnMgb24gSVJJWDYuICBEb24ndCBsb29rIGZvciBHUC1yZWxhdGl2ZQotCXNlY3Rpb25zIGJ5IG5hbWU7IHVzZSBTSEZfTUlQU19HUFJFTCBpbnN0ZWFkLgotCShFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUik6IEFkanVzdCB0byB1c2UgL3Vzci9saWIzMi9saWJjLnNvLjEgZm9yCi0JdGhlIE4zMiBBQkkuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgbXVjayBhYm91dCB3aXRoIHNlY3Rpb24KLQlhbGlnbm1lbnRzIGFuZCBzdWNoIG9uIElSSVg2LgotCShtaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBVc2UgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLiBBZGp1c3QgdG8gaGFuZGxlIHRoZQotCWZhY3QgdGhhdCBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiBpcyBubyBsb25nZXIgYSBjb25zdGFudC4gIFVzZQotCWJmZF96YWxsb2MgcmF0aGVyIHRoYW4gYmZkX2FsbG9jIGFuZCBtZW1zZXQuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFVzZSBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRS4KLQlEb24ndCBhc3NlcnQgdGhlIGV4aXN0ZW5jZSBvZiAucmxkX21hcCBvbiBJUklYNi4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUuCi0JCQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9hZGp1c3RfZHluaW5keCk6IFJlbW92ZS4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIF9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHgKLQlpbnN0ZWFkLgotCi0xOTk5LTA2LTI2ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3N3YXBfbXN5bV9pbik6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfc3dhcF9tc3ltX291dCk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfY3JlYXRlX21zeW1fc2VjdGlvbik6IExpa2V3aXNlLgotCShNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSk6IE5ldyBtYWNyby4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IHNoX2xpbmsgZm9yIC5tc3ltLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVqZWN0IGFuIFNIVF9NSVBTX01TWU0KLQlzZWN0aW9uIG5vdCBuYW1lZCAubXN5bS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogVXNlIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FLCBub3QKLQkubXN5bSBkaXJlY3RseS4gIFNldCBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGZvciB0aGUgLm1zeW0KLQlzZWN0aW9uLgotCShtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgbWluX2R5bl9yZWxvY19pbmRleCBmaWVsZC4KLQkobWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBDbGVhciBpdC4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDcmVhdGUgdGhlIC5tc3ltIHNlY3Rpb24KLQlvbiBJUklYNi4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUKLQkubXN5bSBzZWN0aW9uLiAgQWRkIGEgRFRfTUlQU19NU1lNIGVudHJ5LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBXcml0ZSBvdXQgYSAubXN5bSBlbnRyeSBmb3IKLQl0aGUgc3ltYm9sLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IEFzc2lnbiBhIHZhbHVlIGZvcgotCURUX01JUFNfTVNZTS4gIEFkZCAubXN5bSBlbnRyaWVzIGZvciB0aGUgc2VjdGlvbiBzeW1ib2xzIGFzIHdlbGwuCi0KLQkqIGVsZjMyLW1pcHMuYyAoaXJpeF9jb21wYXRfdCk6IE5ldyBlbnVtZXJhdGlvbi4KLQkoQUJJX04zMl9QKTogTmV3IG1hY3JvLgotCShJUklYX0NPTVBBVCk6IExpa2V3aXNlLgotCShTR0lfQ09NUEFUKTogSW1wbGVtZW50IGluIHRlcm1zIG9mIElSSVhfQ09NUEFULgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG8uCi0JCi0xOTk5LTA2LTI2ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IE1hcmsgbm9uIHJlYWRvbmx5IEJGRCBzZWN0aW9ucwotCWFzIHdyaXRhYmxlIFBFIHNlY3Rpb25zLgotCi0xOTk5LTA2LTI2ICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyLmMgKHN0cnVjdCBhcmFuZ2UpOiBOZXcgdHlwZS4KLQkoc3RydWN0IGNvbXBfdW5pdCk6IFJlcGxhY2UgTE9XIGFuZCBISUdIIGJ5IG1lbWJlciBBUkFOR0UuCi0JKGFyYW5nZV9hZGQpOiBOZXcgZnVuY3Rpb24uCi0JKGRlY29kZV9saW5lX2luZm8pOiBLZWVwIHRyYWNrIG9mIGFkZHJlc3MgcmFuZ2VzIHRoYXQgYSBjb21waWxhdGlvbgotCXVuaXQgY292ZXJzLgotCShjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyk6IFJldHVybiB0cnVlIGlmIGFkZHJlc3MgaXMgY29udGFpbmVkCi0JaW4gX2FueV8gb2YgdGhlIGFkZHJlc3MgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbXBpbGF0aW9uIHVuaXQuCi0JKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2FsbCBjb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUKLQlvbiB0aGUgZmlyc3QgY29tcF91bml0IHRoYXQgY29udGFpbnMgdGhlIGFkZHJlc3MuCi0KLTE5OTktMDYtMjYgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0JKiBkd2FyZjIuYyAoc3RydWN0IGR3YXJmMl9kZWJ1Zyk6IEFkZCBtZW1iZXIgZHdhcmZfbGluZV9idWZmZXIuCi0JKGRlY29kZV9saW5lX2luZm8pOiBBZGQgdmFyaWFibGUgU1RBU0ggYW5kIGluaXRpYWxpemUgaXQgdG8gcG9pbnQKLQl0byB0aGUgcGVyLWJmZCBkd2FyZjJfZGVidWcgaW5mby4gIFJlbW92ZSBzdGF0aWMgdmFyaWFibGUKLQlkd2FyZl9saW5lX2J1ZmZlciBhbmQgdXNlIHN0YXNoLT5kd2FyZl9saW5lX2J1ZmZlciBpbiBpdHMgcGxhY2UuCi0KLTE5OTktMDYtMjYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBJdCdzIE9LIGZvciBhIC1Cc3ltYm9saWMKLQlzaGFyZWQgbGlicmFyeSB0byBoYXZlIGFuIHVuZGVmaW5lZCBzeW1ib2wuCi0KLQlGcm9tIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPjoKLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggbGFzdCBwYXRjaC4KLQotVGh1IEp1biAyNCAyMDo1OToxMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmMgKGVsZl9ocHBhX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYzMi1ocHBhLmM6IFJlbW92ZSBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gc3ltYm9sIGV4dGVuc2lvbgotCXNlY3Rpb25zICYgcmVjb3Jkcy4gIFVzZSB0aGUgY29tbW9uIGVsZl9ocHBhX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuCi0KLTE5OTktMDYtMjIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIHVzZXItc3BlY2lmaWVkIGluaXQvZmluaQotCWZ1bmN0aW9ucyBpbnN0ZWFkIG9mIF9pbml0L19maW5pIGlmIHJlcXVlc3RlZC4KLQotMTk5OS0wNi0yMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBBdm9pZCBjcmFzaGluZyBvbiBhIGJvZ3VzIHNoX2xpbmsKLQlmaWVsZC4KLQotMTk5OS0wNi0yMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPjoKLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFNldCB1bnVzZWQgZHluaW5keAotCWZpZWxkIHRvIDAsIG5vdCAtMS4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IENoZWNrIGZvciBwb3NpdGl2ZSBzZWN0aW9uCi0JZHluaW5keCBmaWVsZCwgcmF0aGVyIHRoYW4gY29tcGFyaW5nIGFnYWluc3QgLTEuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE9ubHkgcmV0dXJuIGZhbHNlIGlmIHVuZGVmaW5lZF9zeW1ib2wKLQlvciByZWxvY19vdmVyZmxvdyBmYWlsLCBub3QgYWx3YXlzIHVwb24gZW5jb3VudGVyaW5nIGFuIGVycm9yLgotCi0xOTk5LTA2LTIyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGZsaW5rLmggKGxpbmtfcmVhZF9yZWxvY3MpOiBFeHBsaWNpdGx5IGNhc3QgZXh0ZXJuYWxfcmVsb2NzIHRvCi0JYmZkX2J5dGUgKiBiZWZvcmUgcGVyZm9ybWluZyBwb2ludGVyIGFyaXRobWV0aWMuCi0KLVR1ZSBKdW4gMjIgMTM6MDY6MjUgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oOiBOZXcgZmlsZS4gIENvbW1vbiBzdHVmZiBmb3IgZWxmMzIgYW5kIGVsZjY0IFBBCi0Jc3VwcG9ydC4KLQkqIGVsZjMyLWhwcGEuYzogSW5jbHVkZSBlbGYtaHBwYS5oLgotCShBUkNIX1NJWkUpOiBEZWZpbmUuCi0JKGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwKTogRGVsZXRlLiAgRm91bmQgaW4gdGhlIGNvbW1vbiBjb2RlCi0Jbm93LgotCShlbGYzMl9ocHBhX2luZm9fdG9faG93dG8pOiBTaW1pbGFybHkuCi0JKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogU2ltaWxhcmx5LgotCShlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IFNpbWlsYXJseS4KLQkoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBTaW1pbGFybHkuCi0JKiBlbGYzMi1ocHBhLmggKEVMRl9IT1dUT19UQUxCRSwgTl9QQVJJU0NfUkVMT0NTKTogRGVsZXRlLgotCi0xOTk5LTA2LTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDYXRjaCBvdmVyZmxvdwotCWhhbmRsaW5nIFJfVjg1MF8yMl9QQ1JFTCByZWxvY2F0aW9uLgotCi0xOTk5LTA2LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29mZi1hcm0uYyAoYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5KTogRXhwbGljaXRseSBkZWNsYXJlIHJldHVybgotCXR5cGUuCi0KLVN1biBKdW4gMjAgMTQ6MTM6NTcgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc2VjdGlvbi5jIChfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQpOiBJZ25vcmUgc2VjdGlvbnMKLQlESVNDQVJEZWQgYnkgdGhlIGxpbmsgc2NyaXB0LgotCi0xOTk5LTA2LTE5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19yZW1vdmVfc2VjdGlvbl9hbmRfYWRqdXN0X2R5bmluZGljZXMpOgotCVJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgc3BwLgotCi0JKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGNyYXNoIGlmCi0JdGhlIGVudHJ5IHN5bWJvbCBpcyBub3Qgc2V0LgotCi1GcmkgSnVuIDE4IDA0OjI0OjU3IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBhZGp1c3QKLQlHUERJU1Agb3IgTElUVVNFIGluIGEgcmVsb2NhdGFibGUgbGluay4KLQotVGh1IEp1biAxNyAyMToyNDo0MyAxOTk5ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGR3YXJmMS5jIChhbGxvY19kd2FyZjFfdW5pdCk6IEFsbG9jYXRlIHVzaW5nIGJmZF96YWxsb2MuCi0JKiAoYWxsb2NfZHdhcmYxX2Z1bmMpOiBMaWtld2lzZS4KLQotV2VkIEp1biAxNiAwMzowOTo1NyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaDogRml4IHZhcmlvdXMgZm9ybWF0dGluZyBlcnJvcnMuCi0JKGFzc2VtYmxlXzMpOyBSZXdyaXRlIHVzaW5nIENBVEVOQVRFLgotCShhc3NlbWJsZV8xNyk6IEZpeCB2YXJpb3VzIGJ1Z3MuCi0KLTE5OTktMDYtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1jb3JlLmMgKFJfTUNPUkVfUkFXKTogRml4IGRlZmluaXRpb24uCi0KLTE5OTktMDYtMTUgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoU0VDX1NIT1JUKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTEzICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcyk6Ci0JUmVtb3ZlIGFiZmQgcGFyYW1ldGVyLiAgVXNlIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dC4KLQkoYmZkX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGp1c3QgY2FsbGVycyBhY2NvcmRpbmdseS4KLQkKLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfbGlua19hZGp1c3RfZHluaW5keCk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19hZGp1c3RfZHluaW5keCk6IERlZmluZSBpdC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVtb3ZlX3NlY3Rpb25fYW5kX2FkanVzdF9keW5pbmRpY2VzKTogTmV3Ci0JZnVuY3Rpb24uCi0JKGJmZF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIGl0LgotCi0xOTk5LTA2LTEzICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQ2hhbmdlIFJfMzg2X1BDOCBmcm9tCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQgdG8gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgotCi0xOTk5LTA2LTEzICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbik6IE5ldyBmdW5jdGlvbiwKLQlzcGxpdCBvdXQgZnJvbSAuLi4KLQkoZWxmX2xpbmtfcmVhZF9yZWxvY3MpOiBIZXJlLiAgVXNlIGl0IGZvciBib3RoIHJlbG9jYXRpb24KLQlzZWN0aW9ucy4KLQotMTk5OS0wNi0xMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uKTogRG9uJ3QgYXNzdW1lCi0JYXNlY3QtPnJlbG9jX2NvdW50IGlzIHZhbGlkLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyk6IFBlcm1pdCBhCi0JU0hUX01JUFNfUkVHSU5GTyBzZWN0aW9uIHRvIGhhdmUgYSBzaXplIG9mIDAuCi0KLTE5OTktMDYtMTIgIERhdmlkIE8nQnJpZW4gIDxvYnJpZW5AZnJlZWJzZC5vcmc+Ci0KLQkqIGNvbmZpZy5iZmQgKGFscGhhKi0qLWZyZWVic2QqKTogTmV3IHRhcmdldC4KLQkoaVszNDU2XTg2LSotZnJlZWJzZCopOiBOb3cgZGVmYXVsdHMgdG8gRUxGLgotCi0xOTk5LTA2LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogcmVsb2MuYyAoX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IFBlcm1pdCBiaXRmaWVsZCByZWxvY2F0aW9ucyB0bwotCXdyYXAgaWYgdGhlIHJlbG9jYXRpb24gY292ZXJzIHRoZSBoaWdoIGJpdCBvZiBhbiBhZGRyZXNzLgotCi0JKiBkd2FyZjIuYyAoZGVjb2RlX2xpbmVfaW5mbyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgZmlyc3RfdGltZS4KLQotMTk5OS0wNi0xMCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBlbGY2NF9zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlIFJfU1BBUkNfbWF4X3N0ZAotCWluc3RlYWQgb2YgUl9TUEFSQ19tYXguCi0JKHNwYXJjNjRfZWxmX2luZm9fdG9faG93dG8pOiBMaWtld2lzZS4KLQkqIGVsZjMyX3NwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfaW5mb190b19ob3d0byk6IExpa2V3aXNlOyBoYW5kbGUgdnRhYmxlIHJlbG9jYXRpb25zLgotCi0xOTk5LTA2LTA3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzZWN0aW9uLmMgKF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IFJlbW92ZSBvdXRwdXQKLQlzZWN0aW9ucyB3aXRoIG5vIGluaXRpYWwgbGlua19vcmRlci4KLQotMTk5OS0wNi0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTg4ay5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0KLU1vbiBKdW4gIDcgMTE6NDk6NDMgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5hbSAoU09VUkNFX0hGSUxFUyk6IEFkZCBtaXNzaW5nIGhlYWRlcnMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0KLTE5OTktMDYtMDYgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2RhdGEpOiBSZWNvZ25pemUKLQl0aGUgTjMyIEFCSS4KLQotMTk5OS0wNi0wNCAgRnJhbnogU2lybCA8RnJhbnouU2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBiYXJmIG9uIG91dCBvZgotCXJhbmdlIHVuZGVmd2VhayBzeW1ib2xzLgotCSogaGFzaC5jOiBBZGQgbWlzc2luZyBjb21tYSBhZnRlciBAeHJlZnt9Ci0JKiBsaW5rZXIuYzogTGlrZXdpc2UuCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZnh4LXRhcmdldC5oIChFTEZfTUFYUEFHRVNJWkUpOiBQcm9kdWNlIGFuIGVycm9yIG1lc3NhZ2UKLQlpZiBub3QgZGVmaW5lZC4KLQkqIGVsZjMyLWdlbi5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0JKiBlbGYzMi1pODYwLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQkqIGVsZjMyLWk5NjAuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCSogZWxmNjQtZ2VuLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQotMTk5OS0wNi0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZHdhcmYxLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZHdhcmYxLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wNi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBlcG9jLWFybS1wZSB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIHBlLWFybS5jOiBPbmx5IHJlZGVmaW5lIGludGVyd29ya2luZyBmdW5jdGlvbiBuYW1lcyBpZiB0aGV5IGhhdmUKLQlub3QgYWxyZWFkeSBiZWVuIHJlZGVmaW5lZC4KLQkqIHBlaS1hcm0uYzogT25seSByZWRlZmluZSBpbnRlcndvcmtpbmcgZnVuY3Rpb24gbmFtZXMgaWYgdGhleSBoYXZlCi0Jbm90IGFscmVhZHkgYmVlbiByZWRlZmluZWQuCi0JKiBlcG9jLXBlLWFybS5jOiBSZWRlZmluZSBpbnRlcndvcmtpbmcgZnVuY3Rpb24gbmFtZXMgdG8gYXZvaWQgYQotCW5hbWUgc3BhY2UgY2xhc2guCi0JKiBlcG9jLXBlaS1hcm0uYzogUmVkZWZpbmUgaW50ZXJ3b3JraW5nIGZ1bmN0aW9uIG5hbWVzIHRvIGF2b2lkIGEKLQluYW1lIHNwYWNlIGNsYXNoLgotCi0xOTk5LTA2LTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoRUxGX01BWFBBR0VTSVpFKTogRGVmYXVsdCB0byAweDEwMDAgbm90IDEuCi0KLUZyaSBKdW4gIDQgMTA6MDU6MTEgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYuYyAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBVbmRvIGNoYW5nZSBvZiAxOTk5LTA1LTEwLgotCi1GcmkgSnVuICA0IDAzOjEwOjQ5IDE5OTkgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogZWxmMzItc2guYyAoc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IEZpeCBzZXR0aW5nIG9mCi0Jc3RhcnQgLyBzdG9wIGZvciByZWNhbGN1bGF0aW5nIG9mIHJfYWRkZW5kIG9mIFJfU0hfU1dJVENIKi4KLQotRnJpIEp1biAgNCAwMjo1MzoxMyAxOTk5ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBIYW5kbGUgUl9TSF9TV0lUQ0gzMgotCWluIG90aGVyIHRleHQgc2VjdGlvbnMuCi0KLUZyaSBKdW4gIDQgMDI6Mjk6MzQgMTk5OSAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBsaWJiZmQuYyAoX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2gpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2gpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmLXNoLmMgKHNoX21lcmdlX3ByaXZhdGVfZGF0YSk6IERlbGV0ZS4KLQkoY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSB0bwotCV9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoLgotCShlbGYzMi1zaC5jKTogYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhOiBEZWZpbmUuCi0KLTE5OTktMDYtMDMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaDogRml4IHR5cG86IGNoYW5nZSBFTEZfTUFYUEFHRV9TSVpFIHRvIEVMRl9NQVhQQUdFU0laRS4KLQotMTk5OS0wNi0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyk6IENvcnJlY3QKLQlwcm90b3R5cGUuCi0JKGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTAzICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyLmMgKHN0cnVjdCBsaW5lX2luZm8pOiBBZGQgbWVtYmVyIEVORF9TRVFVRU5DRSB0byBrZWVwCi0JdHJhY2sgb2YgZW5kX3NlcXVlbmNlIG1hcmtlcnMuCi0JKGFkZF9saW5lX2luZm8pOiBBZGQgRU5EX1NFUVVFTkNFIGFyZy4KLQkoZGVjb2RlX2xpbmVfaW5mbyk6IERvbid0IHRyeSB0byBpbmZlciBsb19wYyBhbmQgaGlfcGMgZnJvbSB0aGUKLQlkZWJ1Zy1saW5lIGluZm8tLS1pdCBkb2Vzbid0IHdvcmsgcmlnaHQgaWYgYSBjb21waWxhdGlvbiB1bml0Ci0JY29uc2lzdHMgb2YgbXVsdGlwbGUgZGlzY29udGlndW91cyBjb2RlLXNlcXVlbmNlcy4gIEl0IHdvdWxkIGJlCi0Jd29ydGh3aGlsZSB0byBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIGEgY29tcGlsYXRpb24KLQl1bml0IHJlc3VsdHMgaW4gYSBjb250aWd1b3VzIHNldCBvZiBjb2RlIHNlcXVlbmNlcywgYnV0IHRoaXMgaXMKLQlxdWl0ZSB0cmlja3kgdG8gZ2V0IHJpZ2h0IGZvciBhcmJpdHJhcnkgRFdBUkYyIGZpbGVzLgotCShsb29rdXBfYWRkcmVzc19pbl9saW5lX2luZm9fdGFibGUpOiBEb24ndCB1c2UgdGhlIGxhc3QgbGluZSBlbnRyeQotCWZvciBhIGNvbXBpbGF0aW9uIHVuaXQgZm9yIGFueXRoaW5nIHdpdGggYW4gYWRkcmVzcyBoaWdoZXIgdGhhbgotCXRoaXMgbGluZSBlbnRyeS4gIEFsc28sIGNoZWNrIGZvciBlbmRfc2VxdWVuY2UgbWFya2VycyB0bwotCWNvcnJlY3RseSBoYW5kbGUgZGlzY29udGludWl0aWVzLgotCShfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSk6IFdoZW4gY2hlY2tpbmcgcHJldmlvdXNseSBsb2FkZWQKLQljb21waWxhdGlvbiB1bml0cywgY2hlY2sgYWxsIGNvbXBpbGF0aW9uIHVuaXRzIHdpdGggZWFjaC0+aGlnaD09MAotCWp1c3QgbGlrZSB3aGVuIHJlYWRpbmcgY29tcGlsYXRpb24gdW5pdHMuCi0KLQkqIGR3YXJmMi5jIChkZWNvZGVfbGluZV9pbmZvKTogSW5pdGlhbGl6ZSB0YWJsZS0+ZmlsZXMgYW5kCi0JdGFibGUtPmxhc3RfbGluZSB0byBOVUxMIHRvIGF2b2lkIHNlZ2ZhdWx0cyBkdWUgdG8gcmFuZG9tCi0JdmFsdWVzIGluIHRoZXNlIG1lbWJlcnMuCi0JKGNvbmNhdF9maWxlbmFtZSk6IENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgZmlsZSBudW1iZXIgYmVmb3JlCi0JaW5kZXhpbmcgZmlsZW5hbWUgdGFibGUuICBTZWdmYXVsdHMgc3Vjay4KLQotCSogZHdhcmYyLmMgKGRlY29kZV9saW5lX2luZm8pOiBEb24ndCB0cnVuY2F0ZSBhZGRyZXNzIHRvIGxlYXN0Ci0Jc2lnbmlmaWNhbnQgMzIgYml0cyAoYnJlYWtzIDY0IGJpdCB0YXJnZXRzKS4KLQkobG9va3VwX2FkZHJlc3NfaW5fZnVuY3Rpb25fdGFibGUpOiBEaXR0by4KLQkoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MpOiBEaXR0by4KLQotMTk5OS0wNi0wMiAgTWFyayBNaXRjaGVsbCAgPE1hcmsgTWl0Y2hlbGwgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaG93dG9fdGFibGUpOiBBZGQgUl9NSVBTX0pBTFIuCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsYSk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZV9mcm9tX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24sCi0Jc3BsaXQgb3V0IGZyb20gLi4uCi0JKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IEhlcmUuICBVc2UgaXQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEKLQlzaW5nbGUgc2VjdGlvbiBoYXMgdHdvIGFzc29jaWF0ZWQgcmVsb2NhdGlvbiBzZWN0aW9ucy4KLQotMTk5OS0wNi0wMiAgTWFyayBTYWx0ZXIgIDxtc2FsdGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogU2V0IGxtYSBmcm9tIHNfdmFkZHIgaWYKLQlDT0ZGX1dJVEhfUEUgZGVmaW5lZC4KLQotMTk5OS0wNi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGUtYXJtLmM6IFJlbmFtZSBnbG9iYWwgYXJtIGludGVyd29ya2luZyBmdW5jdGlvbnMgdG8gYXZvaWQgbmFtZQotCWNvbGxpc2lvbiB3aGVuIGFsbCB0YXJnZXRzIEJGRCBpcyBidWlsdC4KLQkqIHBlaS1hcm0uYzogRGl0dG8uCi0KLTE5OTktMDUtMzEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSB1c2VfcmVsYV9wLiAgQWRkCi0JbWF5X3VzZV9yZWxfcCwgbWF5X3VzZV9yZWxhX3AsIGRlZmF1bHRfdXNlX3JlbGFfcC4KLQkoYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgdXNlX3JlbGFfcC4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBTZXQgdXNlX3JlbGFfcCBhcHByb3ByaWF0ZWx5LgotCShfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rKTogTGlrZXdpc2UuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogVXNlIG1heV91c2VfcmVsYV9wLCBldGMuLCBpbnN0ZWFkIG9mCi0JdXNlX3JlbGFfcC4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IENvcHkgdXNlX3JlbGFfcC4KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHVzZSByZWxhCi0JcmVsb2NzIGJhc2VkIG9uIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24gaGVhZGVyLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBkZWZhdWx0X3VzZV9yZWxhX3AKLQlpbnN0ZWFkIG9mIHVzZV9yZWxhX3AuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxwKTogTmV3IG1hY3JvLgotCShlbGZfYmFja2VuZF9tYXlfdXNlX3JlbGFfcCk6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9kZWZhdWx0X3VzZV9yZWxhX3ApOiBMaWtld2lzZS4KLQkoZWxmTk5fYmVkKTogVXNlIHRoZW0uCi0KLVdlZCBKdW4gIDIgMTI6Mzg6NDkgMTk5OSAgTWlvZHJhZyBWYWxsYXQgPG1pb2RyYWdAbXVsdGltYW5pYS5jb20+Ci0KLQkqIGhvc3RzL2FscGhhbGludXguaCAoVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRCk6IEV4cGFuZCB0byA0MDk2LgotCi1UdWUgSnVuICAxIDE3OjU3OjU4IDE5OTkgIE1hcmsgUC4gTWl0Y2hlbGwgIDxtaXRjaGVsbEBuMDIuYWNsLmxhbmwuZ292PgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfTUlQU19TVUIpOiBOZXcgcmVsb2NhdGlvbi4KLQkoQkZEX1JFTE9DX01JUFNfR09UX1BBR0UpOiBMaWtld2lzZS4KLQkoQkZEX1JFTE9DX01JUFNfR09UX09GU1QpOiBMaWtld2lzZS4KLQkoQkZEX1JFTE9DX01JUFNfR09UX0RJU1ApOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBsaWJiZmQuaDogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfaW5mb190b19ob3d0b19yZWxhKTogTmV3IGZ1bmN0aW9uLgotCShVU0VfUkVMKTogQWRqdXN0IGZvciBuZXcgY29udmVudGlvbnMuCi0JKE1JTlVTX09ORSk6IE5ldyBtYWNyby4KLQkoZWxmX21pcHNfaG93dG9fdGFibGUpOiBBZGQgUl9NSVBTX1NVQi4KLQkobWlwc19yKTogQWRkIGVudHJpZXMgZm9yIE1JUFNfU1VCLCBNSVBTX0dPVF9QQUdFLCBNSVBTX0dPVF9PRlNULAotCWFuZCBNSVBTX0dPVF9ESVNQLgotCShtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IHNoX2xpbmssIG5vdCBzaF9pbmZvLCBmb3IgYQotCS5NSVBTLmNvbnRlbnQgc2VjdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogVHJlYXQgYWxsIHNlY3Rpb25zIHRoYXQgYmVnaW4KLQl3aXRoIC5NSVBTLmNvbnRlbnQgYXMgLk1JUFMuY29udGVudCBzZWN0aW9ucy4gIFNldAotCVNIRl9NTklQU19OT1NUUklQIGZvciBzdWNoIHNlY3Rpb24uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lIHRvIG1pcHNfaW5mb190b19ob3d0b19yZWxhLgotCSogZWxmNjQtbWlwcy5jIChtaXBzX3IpOiAgQWRkIGVudHJpZXMgZm9yIE1JUFNfU1VCLCBNSVBTX0dPVF9QQUdFLAotCU1JUFNfR09UX09GU1QsIGFuZCBNSVBTX0dPVF9ESVNQLgotCi1XZWQgSnVuICAyIDExOjUxOjEyIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogdm1zLW1pc2MuYyAoX2JmZF92bXNfaGFzaF9uZXdmdW5jKTogRml4IHVzZSBvZiB1bmluaXRpYWxpemVkCi0JdmFyaWFibGUuCi0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQXZvaWQgYW1iaWdvdXMKLQlgZWxzZScuCi0KLTE5OTktMDUtMzAgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFJlaW5zdGF0ZSBjaGFuZ2Ugb2YKLQkxOTkzLTAzLTI1ICghISkuICBUYWtlIGludG8gYWNjb3VudCB0aGUgYml0bWFza3MgZm9yIHRoZSByZWxvYyBzbwotCXRoZSBhZGRlbmQgZG9lcyBub3Qgb3ZlcmZsb3cgaW50byB0aGUgcmVzdCBvZiB0aGUgd29yZC4KLQotMTk5OS0wNS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmg6IEFtZW5kIHByb3RvdHlwZSBmb3IKLQliZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gLgotCSogYmZkLWluLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZmFybS1vYWJpLmMgKE5VTV9FTEVNKTogTmV3IG1hY3JvOiBDb21wdXRlIHRoZSBudW1iZXIgb2YKLQllbGVtZW50cyBpbiBhIGZpeGVkIHNpemVkIGFycmF5LgotCShBUk1fRUxGX0FCSV9WRVJTSU9OKTogRGVmaW5lLgotCShBUk1fRUxGX09TX0FCSV9WRVJTSU9OKTogRGVmaW5lLgotCShSX0FSTV9USE1fQUJTNSk6IEZpeCByaWdodHNoaWZ0IGFuZCBzaXplLgotCShSX0FSTV9USE1fUEMyMik6IEZpeCBzaXplLgotCShSX0FSTV9QTFQzMik6IERlZmluZSBIb3d0by4KLQkoZmluZF9ob3d0byk6IE5ldyBmdW5jdGlvbjogTG9jYXRlIGEgaG93dG8gYmFzZWQgb24gYSByZWxvYwotCW51bWJlci4KLQkoZWxmMzJfYXJtX2luZm9fdG9faG93dG8pOiBVc2UgZmluZF9ob3d0byBpZiBuZWNlc3NhcnkuCi0JKGVsZjMyX2FybV9yZWxvY19tYXApOiBDaGFuZ2UgdHlwZSBvZiBmaWVsZCBiZmRfcmVsb2NfdmFsIHRvCi0JYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLgotCShlbGYzMl9hcm1fcmVsb2NfbWFwW10pOiBBZGQgZW50cmllcyBmb3IgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0JYW5kIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkuCi0JKGVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCk6IFVzZSBmaW5kX2hvd3RvIGlmIG5lY2Vzc2FyeS4KLQotCSogZWxmYXJtLW5hYmkuYyAoTlVNX0VMRU0pOiBOZXcgbWFjcm86IENvbXB1dGUgdGhlIG51bWJlciBvZgotCWVsZW1lbnRzIGluIGEgZml4ZWQgc2l6ZWQgYXJyYXkuCi0JKEFSTV9FTEZfQUJJX1ZFUlNJT04pOiBEZWZpbmUuCi0JKEFSTV9FTEZfT1NfQUJJX1ZFUlNJT04pOiBEZWZpbmUuCi0JKFJfQVJNX1RITV9BQlM1KTogRml4IHJpZ2h0c2hpZnQgYW5kIHNpemUuCi0JKFJfQVJNX1RITV9QQzIyKTogRml4IHNpemUuCi0JKGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvX3JlbCk6IFJlbmFtZSB0byBlbGYzMl9hcm1faW5mb190b19ob3d0by4KLQkoZWxmMzJfYXJtX3JlbG9jX21hcCk6IENoYW5nZSB0eXBlIG9mIGZpZWxkIGJmZF9yZWxvY192YWwgdG8KLQliZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUuCi0KLQkqIGVsZjMyLWFybS5oIChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBuZXcgZmllbGQ6Ci0Jbm9fcGlwZWxpbmVfa25vd2xlZGdlLgotCShlbGYzMl9hcm1fbGlua19oYXNoX2NyZWF0ZSk6IEluaXRpYWxpc2UgbmV3IGZpZWxkIHRvIHplcm8uCi0JKGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IEFkZCBuZXcgcGFyYWVtdGVyOgotCW5vX3BpcGVsaW5lX2tub3dsZWRnZS4gIFVzZSB0aGlzIHBhcmFtZXRlciB0byBpbml0aWFsaXNlIHRoZSBmaWVsZAotCWluIHRoZSBnbG9iYWxzIGRhdGEgc3RydWN0dXJlLgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6IE9ubHkgYWRkIGluIHBpcGVsaW5lIG9mZnNldCBpZgotCW5vX3BpcGVsaW5lX2tub3dsZWRnZSBpcyBmYWxzZSBhbmQgdGhlIGJpbmFyeSBpcyBmcm9tIGFuIG9sZAotCXRvb2xjaGFpbi4KLQkoZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfZGF0YSk6IEdlbmVyYXRlIGFuIGVycm9yIGlmIGFuIGF0dGVtcHQgaXMKLQltYWRlIHRvIGxpbmwgdG9nZXRoZXIgYmlnIGVuZGlhbiBhbmQgbGl0dGxlIGVuZGlhbiBjb2RlLgotCShlbGYzMl9hcm1fcG9zdF9wcm9jZXNzX2hlYWRlcnMpOiBOZXcgZnVuY3Rpb246ICBJbml0aWFsaXNlIHRoZQotCUVJX09TQUJJIGFuZCBFSV9BQklWRVJTSU9OIGZpZWxkcyBvZiB0aGUgbmV3bHkgY3JlYXRlZCBFTEYgcHJvZ3JhbQotCWhlYWRlci4KLQkoZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMpOiBEZWZpbmUuCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkOgotCWVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzLgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMpOiBEZWZpbmUgdG8KLQlOVUxMIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKGVsZk5OX2JlZCk6IEluaXRpYWxpc2UgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMgZmllbGQuCi0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBTZXQgdGhlIEVJX09TQUJJIGFuZCBFSV9BQklWRVJTSU9OIGZpZWxkcwotCXRvIHplcm8uCi0JKF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENhbGwKLQllbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycyBpZiBkZWZpbmVkLgotCi0xOTk5LTA1LTI4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayB3aGV0aGVyIGdldHVpZCBhbmQgZ2V0Z2lkIGV4aXN0LgotCSogYXJjaGl2ZS5jOiBEZWZpbmUgZ2V0dWlkIGFuZCBnZXRnaWQgYXMgbWFjcm9zIGlmIEhBVkVfR0VUVUlEIG9yCi0JSEFWRV9HRVRHSUQgYXJlIG5vdCBkZWZpbmVkLCByZXNwZWN0aXZlbHkuCi0JKGJmZF93cml0ZV9hcm1hcCk6IERvbid0IHNwZWNpYWwgY2FzZSBvbiBfV0lOMzIgZm9yIGdldHVpZCBhbmQKLQlnZXRnaWQuCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IGFjX2N2X2Z1bmNfZ2V0e3VnfWlkIGZvciAqLSotd2luZG93cyouCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wNS0yOCAgTWFydGluIERvcmV5ICA8bWRvcmV5QG1hZGdlLmNvbT4KLQotCSogZWxmMzItaTk2MC5jOiBOZXcgZmlsZS4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBIYW5kbGUgYmZkX2FyY2hfaTk2MC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgJmJmZF9lbGYzMl9pOTYwX3ZlYy4KLQkqIGNvbmZpZy5iZmQgKGk5NjAtKi1lbGYqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX2k5NjBfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKiBNYWtlZmlsZS5hbSAoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmMzItaTk2MC5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjMyLWk5NjAuYy4KLQkqIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDUtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmFybS1vYWJpLmMgKGVsZjMyX2FybV9ob3d0b190YWJsZSk6IEFkZCBlbnRyeSBmb3IKLQlSX0FSTV9QTFQzMi4KLQkoZmluZF9ob3d0byk6IE5ldyBmdW5jdGlvbjogRmluZCBlbnRyaWVzIGluIHRoZQotCWVsZjMyX2FybV9ob3d0b190YWJsZS4KLQkoZWxmMzJfYXJtX2luZm9fdG9faG93dG8pOiBVc2UgZmluZF9ob3d0byBpZiB0aGUgZW50cnkgY2Fubm90IGJlCi0JY29tcHV0ZWQgc2ltcGx5LgotCShlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgbG9va3VwIGZvcgotCUJGRF9SRUxPQ19BUk1fUExUMzIuCi0KLTE5OTktMDUtMjUgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBiZmQvZWxmMzItYXJtLmggKGVsZjMyX2FybV9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBVc2UgYWJvdmUgZnVuY3Rpb24gYXMgdGhlCi0JY29uc3RydWN0b3IgZm9yIGhhc2ggdGFibGUgZW50cmllcy4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBBdm9pZCBjcmFzaCB3aGVuIHRoZXJlIGlzIG5vIG91dHB1dAotCXNlY3Rpb24uCi0JKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IHBhcmFtZXRlciBoLgotCShlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFBhc3Mgc3ltYm9sIGhhc2ggZW50cnkgdG8gYWJvdmUKLSAJcm91dGluZS4KLQkoZWxmMzJfYXJtX2djX3N3ZWVwX2hvb2ssIGVsZjMyX2FybV9jaGVjayByZWxvY3MpOiBDb3JyZWN0Ci0JY29tbWVudHMuCi0KLTE5OTktMDUtMjUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZW1pdAotCWJhc2UgZmlsZSBlbnRyaWVzIGZvciBwYy1yZWxhdGl2ZSB2YWx1ZXMuCi0KLTE5OTktMDUtMjUgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zeW1faW4pOiBXaGVuIHdlIGNyZWF0ZSB0aGUgYWN0dWFsIHNlY3Rpb24KLQl0byByZWZsZWN0IHRoZSBub3QtdGhlcmUgc2VjdGlvbiBDX1NFQ1RJT04gc3ltYm9scyByZWZlciB0bywKLQljaGFuZ2UgdGhlIHN5bWJvbCBjbGFzcyB0byBDX1NUQVQgYXMgdGhlIHNlY3Rpb24gaXMgbm93IHJlYWxseQotCXRoZXJlLgotCi0xOTk5LTA1LTI0ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogVW5kbyBjaGFuZ2Ugb2YKLSAJMTk5OS0wMy0yNS4KLQotTW9uIE1heSAxNyAxMzozNTozNSAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncyk6IENoYW5nZWQKLQlGX1BJQ19JTlQgdG8gRl9QSUMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZGVkIEZfQVJNXzJhLCBhbmQKLQlGX0FSTV8zTSBsYWJlbHMuICBDaGFuZ2VkIEZfUElDX0lOVCB0byBGX1BJQy4KLQotMTk5OS0wNS0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChpbl9yZWxvY19wKTogUmVpbnN0YXRlLgotCi0xOTk5LTA1LTE1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfTUNPUkVfUlZBKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogY29mZi1tY29yZS5jIChpbl9yZWxvY19wKTogUmVtb3ZlIGRlZmludGlvbi4KLQkobWNvcmVfY29mZl9ob3d0byk6IEFkZCBJTUFHRV9SRUxfTUNPUkVfUlZBLgotCShtY29yZV9jb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogTWFwIEJGRF9SRUxPQ19SVkEgdG8KLQlJTUFHRV9SRUxfTUNPUkVfUlZBLgotCShjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvKTogQWRkIHNwZWNpYWwgcHJvY2Vzc2luZyBmb3IKLQlJTUFHRV9SRUxfTUNPUkVfUlZBLgotCShjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgc3VwcG9ydCBmb3IKLQlJTUFHRV9SRUxfTUNPUkVfUlZBLgotCSogZWxmMzItbWNvcmUgKG1jb3JlX2VsZl9ob3d0b18pOiBBZGQgUl9NQ09SRV9SRUxBVElWRS4KLQkobWNvcmVfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTWFwIEJGRF9SRUxPQ19SVkEgdG8KLQlSX01DT1JFX1JFTEFUSVZFLgotCShtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERlbGV0ZSByZWR1bmRhbnQgY2FzZSBsYWJlbHMuCi0KLUZyaSBNYXkgMTQgMTA6NTk6NTUgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggb3BlcmF0b3IKLSAJcHJlY2VkZW5jZSBiZXR3ZWVuIGJpdC1hbmQgYW5kIGNvbXBhcmlzb24uCi0KLVRodSBNYXkgMTMgMDk6NDU6MjMgMTk5OSAgSm9lbCBTaGVycmlsbCAoam9lbEBPQVJjb3JwLmNvbSkKLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2Ki0qLXJ0ZW1zKiwgbTY4ayotKi1ydGVtcyopOiBBZGRlZCB0bwotCWxpc3Qgb2YgdGFyZ2V0IGZvcm1hdHMgKHRhcmdfc2VsdmVjcykuCi0JKGlbMzQ1Nl04NiotKi1ydGVtc2VsZiosIG1pcHMqZWwtKi1ydGVtcyopOiBOZXcgdGFyZ2V0cy4KLQkocG93ZXJwY2xlKi0qcnRlbXMqLCBzaC0qLXJ0ZW1zZWxmKik6IE5ldyB0YXJnZXRzLgotCi0xOTk5LTA1LTEwICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl93cml0ZV9hcm1hcCk6IGdpdmUgdGhlIHN5bXRhYiBlbGVtZW50IGEKLQlyZWFzb25hYmxlIG1vZGUgdW50aWwgImFyIHgiIGlzIHNtYXJ0IGVub3VnaCB0byBza2lwIGl0IChmaXhlcwotCWdjYy9saWJnY2MuYSBidWlsZHMgb24gbWlwcy1lY29mZiB0YXJnZXRzCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogRXhwbGFpbiBob3cgQ09NREFUcyBhcmUgc3VwcG9zZWQKLQl0byB3b3JrLiAgSGFjayB0byBzdXBwb3J0IE1TIGltcG9ydCBsaWJyYXJpZXMsIHdoaWNoIHVzZSBkaWZmZXJlbnQKLQlDT01EQVQgdHlwZXMgdGhhbiBHTlUuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ19TRUNUSU9OIHN5bWJvbHMgYXJlIGxvY2FsOyB0aGV5IHJlZmVyCi0JdG8gaW1wbGllZCB6ZXJvLWxlbmd0aCBzZWN0aW9ucyAoc2VlIHBlaWNvZGUgYmVsb3cpCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogUHJvcGVybHkgcmVhZCBsb25nIE1TCi0JZmlsZW5hbWUgc3ltYm9scywgd2hpY2ggdXNlIG9uZSAqb3IgbW9yZSogYXV4ZW50cy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBkaXR0bwotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc3ltX2luKTogQnVpbGQgdGhlIGltcGxpZWQgemVyby1sZW5ndGgKLQlzZWN0aW9ucwotCi1UdWUgTWF5IDExIDE1OjUxOjU4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9ob3d0b190YWJsZSk6IE1ha2UgcGFydGlhbF9pbnBsYWNlIGZhbHNlCi0JZm9yIGFsbCByZWxvY2F0aW9ucy4KLQotMTk5OS0wNS0xMCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyk6ICBTdGF0aWMKLQlpZiBDT0ZGX0lNQUdFX1dJVEhfUEUuCi0JKGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotCShiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6IExpa2V3aXNlLgotCSogY29mZi1hcm0uYzogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmUuaW4gKGFybXBlX2xpdHRsZV92ZWMpOiBSZW1vdmUgY29mZi1hcm0ubG8uCi0JKGFybXBlX2JpZ192ZWMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wNS0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hlY2sgZm9yIC5yZWwuIGFzIHN0YXJ0IG9mIHJlbAotCXNlY3Rpb24sIG5vdCBqdXN0IC5yZWwuICBTYW1lIGZvciAucmVsYS4KLQotMTk5OS0wNS0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24pOiBSZXBsYWNlIGFzc2VydCBhYm91dAotCWVuZGlhbmlzbSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCi0KLVRodSBNYXkgIDYgMTc6MDk6MDkgMTk5OSAgRnJlZCBGaXNoICA8Zm5mQGJlLmNvbT4KLQotCSogZHdhcmYyLmMgKHJlYWRfYWJicmV2cyk6IENoYW5nZSBjYXN0IG9mIGR3YXJmX2FiYnJldl9idWZmZXIKLQlhc3NpZ25tZW50IGZyb20gInVuc2lnbmVkIGNoYXIgKiIgdG8gImNoYXIgKiIuCi0JKGRlY29kZV9saW5lX2luZm8pOiBMaWtld2lzZSBmb3IgZHdhcmZfbGluZV9idWZmZXIgYXNzaWdubWVudC4KLQotMTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgQWRkIG9uZSB0bwotCWFkZHJlc3Mgb2YgQVJNX1JWQTMyIHRodW1iIGZ1bmN0aW9ucy4KLQotMTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmMzJfbTY4a19zZXRfcHJpdmF0ZV9mbGFncyk6IE5ldy4KLQkoZWxmMzJfbTY4a19jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKGVsZjMyX202OGtfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkoZWxmMzJfbTY4a19wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCShDUFUzMl9GTEFHKTogRGVmaW5lLgotCShQTFRfQ1BVMzJfRU5UUllfU0laRSk6IERlZmluZS4KLQkoZWxmX2NwdTMyX3BsdDBfZW50cnkpOiBEZWNsYXJlLgotCShlbGZfY3B1MzJfcGx0X2VudHJ5KTogRGVjbGFyZS4KLQkoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogR2VuZXJhdGUgY3B1MzIgcGx0IGVudHJpZXMuCi0JKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUpOiBSZW1vdmUgZGVmaW5pdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLQkoYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IERlZmluZS4KLQkoYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCi1Nb24gTWF5ICAzIDA5OjI0OjQ5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9maXh1cF9mb3JtYXRzKTogRml4IGNvbW1lbnRzIGZvciBSX1NIT1JUX1BDUkVMX01PREUKLQlhbmQgUl9MT05HX1BDUkVMX01PREUuCi0KLTE5OTktMDQtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWNvcmUuYyAoY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG9zLgotCi1GcmkgQXByIDI4IDE2OjM2OjE5IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEluY2x1ZGUgcmVsb2NhdGlvbiBhZGRlbmQKLQlpbiByZWxvY2F0aW9uIGNhbGN1bGF0aW9uLgotCi0xOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KLQotMTk5OS0wNC0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUgcmVsb2NzLgotCi0xOTk5LTA0LTIwICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBTY3JhcCB0aGUKLQlpbmNvcnJlY3QgdXNlIEVGX01JUFNfeHhCSVRQVFJTLgotCi0xOTk5LTA0LTE4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgbG9jYWwKLQl2YXJpYWJsZSBpbnNuLgotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotU2F0IEFwciAxNyAyMDo1NToxNSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcnR5cGVfdG9faG93dG8pOiBSZW1vdmUgQVJNMjZEIHRyYW5zZm9ybS4KLQkoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6ICBBZGQgQVJNMjZEIHRyYW5zZm9ybS4gIE9ubHkKLQljaGFuZ2UgdG8gQVJNMjZEIGZvciByZWxvY2F0ZWFibGUgbGlua3MuCi0KLTE5OTktMDQtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkoYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCi0xOTk5LTA0LTE1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6ICBGb3IgUl9BUk1fVEhNX0FCUzUsCi0JcmVmZXRjaCBhZGRlbmQgaWYgVVNFX1JFTCwgYWRkIG1hbnkgY29tbWVudHMgcmVnYXJkaW5nIGN1cnJlbnQgc3RhdGUuCi0JRm9yIFJfQVJNX1RITV9QQzIyLCByZWZldGNoIGFkZGVuZCBpZiBVU0VfUkVMLCBzaW1wbGlmeS4KLQkqIGVsZmFybS1uYWJpLmMgKGVsZjMyX2FybV9ob3d0b190YWJsZSk6IEZvciBSX0FSTV9USE1fQUJTNSwgZml4Ci0Jc2l6ZSBhbmQgcmlnaHRzaGlmdC4gIEZvciBSX0FSTV9USE1fUEMyMiwgZml4IGJpdHNpemUuCi0JKiBlbGZhcm0tb2FiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBEaXR0by4KLQotV2VkIEFwciAxNCAxNDozMzowOCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogWmVybyBgZGVidWcnLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVhZF9lY29mZl9pbmZvKTogTGlrZXdpc2UuCi0KLTE5OTktMDQtMTMgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0JKiBkd2FyZjIuYyAoZGVjb2RlX2xpbmVfaW5mbyk6IERvbid0IHRydW5jYXRlIGFkZHJlc3MgdG8gbGVhc3QKLQlzaWduaWZpY2FudCAzMiBiaXRzIChicmVha3MgNjQgYml0IHRhcmdldHMpLgotCShsb29rdXBfYWRkcmVzc19pbl9mdW5jdGlvbl90YWJsZSk6IERpdHRvLgotCShjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyk6IERpdHRvLgotCi1UdWUgQXByIDEzIDIxOjI3OjE5IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChhcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkpOiBOZXcgcm91dGluZS4KLQkoQTJUM19PRkZTRVQpOiBEZWZpbmUuCi0JKFQyQTNfT0ZGU0VUKTogRGVmaW5lLgotCShjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogIEVtaXQgYmFzZSBmaWxlIGVudHJpZXMgZm9yIGludGVyd29ya2luZwotCXN0dWJzLgotCi0xOTk5LTA0LTEzICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBBZGQgZHVtbXkgZW50cmllcyBmb3IKLQlyZWxvY3MgMTcgdGhyb3VnaCAxOS4KLQotU3VuIEFwciAxMSAwMToyNToxNyAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmg6IFJlbW92ZSBmbm1hdGNoLmguCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IENhbGwgYmFjayB0byBsZAotCWluc3RlYWQgb2YgY2FsbGluZyBmbm1hdGNoLgotCi0JKiBjb25maWcuYmZkIChpPzg2LSotYmVvc2VsZik6IEluY2x1ZGUgcGUgdmVjcy4KLQotU3VuIEFwciAxMSAwMToxNDowNiAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogQWxsb3cgLnBsdAotCXRvIGdvIG1pc3NpbmcuCi0KLTE5OTktMDQtMTAgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IE1pbmQgbm9fdW5kZWZpbmVkCi0Jd2hlbiB0cnlpbmcgdG8gcmVzb2x2ZSBkeW5hbWljIHN5bWJvbCByZWZlcmVuY2VzLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IExpa2V3aXNlLgotCi1TYXQgQXByIDEwIDE1OjEyOjA5IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0KTogTmV3IGZ1bmN0aW9uIG1vdmVkIGZyb20KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQpOiAuLi4gaGVyZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIGl0LgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFVwZGF0ZS4KLQotMTk5OS0wNC0wOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZjY0LXNwYXJjLmM6IEZpeCBpbmNvcnJlY3QgY2FsbHMgdG8gYmZkX2NoZWNrX292ZXJmbG93LgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW1jb3JlLmM6IE5ldyBGaWxlOiBTdXBwb3J0IGZvciBtY29yZS1wZSB0YXJnZXRzLgotCSogY3B1LW1jb3JlLmM6IE5ldyBGaWxlOiBTdXBwb3J0IGZvciBtY29yZSB0YXJnZXRzLgotCSogZWxmMzItbWNvcmUuYzogTmV3IEZpbGU6IFN1cHBvcnQgZm9yIG1jb3JlLWVsZiB0YXJnZXQuCi0JKiBwZS1tY29yZS5jOiBOZXcgRmlsZTogRGVmaW5pdGlvbnMgZm9yIG1jb3JlLXBlIHRhcmdldC4KLQkqIHBlaS1tY29yZS5jOiBOZXcgRmlsZTogRGVmaW5pdGlvbnMgZm9yIG1jb3JlLXBlaSB0YXJnZXQuCi0JKiBNYWtlZmlsZS5hbTogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGFyY2h1cmVzLmM6IEFkZCBzdXBwb3J0IGZvciBNQ29yZSBhcmNoaXRlY3R1cmUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmY29kZS5oOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUtcGUgdGFyZ2V0cy4KLQkqIGVsZi5jOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUtZWxmIHRhcmdldC4KLQkqIHJlbG9jLmM6IEFkZCBzdXBwb3J0IGZvciBNQ29yZSByZWxvY3MuCi0JKiB0YXJnZXRzLmM6IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCi0xOTk5LTA0LTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IKLQlSX0FSTV9YUEMyNSBhbmQgUl9BUk1fVEhNX1hQQzIyLgotCShlbGYzMl9hcm1fcmVsb2NfbWFwKTogUmVtb3ZlIHJlZHVuZGFudCBlbnRyaWVzLgotCi0xOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3lzZGVwLmggKExDX01FU1NBR0VTKTogTmV2ZXIgZGVmaW5lLgotCi0xOTk5LTA0LTA2ICBDaHJpcyBUb3JlayAgPHRvcmVrQGJzZGkuY29tPgotCi0JKiByZWxvYy5jIChiZmRfY2hlY2tfb3ZlcmZsb3cpOiBBZGQgYWRkcnNpemUgcGFyYW1ldGVyLiAgQ2hhbmdlCi0JYWxsIGNhbGxlcnMuICBSZXdyaXRlIGNvbXBsZXRlbHkuCi0JKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBSZXdyaXRlIG92ZXJmbG93IGNoZWNraW5nLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA0LTA1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gR2FicmllbCBQYXViZXJ0IDxwYXViZXJ0QGlyYW0uZXM+OgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogU2V0IFJfUFBDX0dPVDE2X0xPLAotCVJfUFBDX1BMVDE2X0xPIGFuZCBSX1BQQ19TRUNUT0ZGX0xPIHRvIGJlIGNvbXBsYWluX292ZXJmbG93X2RvbnQuCi0JU2V0IFJfUFBDX1BMVDE2X0hBLCBSX1BQQ19TRUNUT0ZGX0hBIGFuZCBSX1BQQ19FTUJfTkFERFIxNl9IQSB0bwotCWhhdmUgYSByaWdodHNoaWZ0IG9mIDE2IGFuZCB1c2UgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MuCi0JKiBwcGNib290LmMgKHBwY2Jvb3RfdmVjKTogVXNlIGxpdHRsZSBlbmRpYW4gcm91dGluZXMgZm9yCi0JaGVhZGVycy4KLQotCSogZWxmLmMgKGVsZmNvcmVfc3RybmR1cCk6IE9ubHkgZGVmaW5lIGlmIGl0IHdpbGwgYmUgdXNlZC4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbGF4X3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIGxvY2FscyBpcmVsCi0JYW5kIGlyZWxlbmQuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBpLgotCShwcGNfZWxmX2djX21hcmtfaG9vayk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gc3dpdGNoLgotCi0JRnJvbSBCZXJuZCBOaXR6bGVyIDxuaXR6bGVyQGthZ2NwZDAxLmFnMDEua29kYWsuQ09NPjoKLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogQWNjZXB0IFxyIGluIHN5bWJvbCBkZWZpbml0aW9ucy4KLQkoc3JlY19vYmplY3RfcCk6IFNldCBIQVNfU1lNUyBpZiB3ZSBzYXcgYW55IHN5bWJvbHMuCi0JKHN5bWJvbHNyZWNfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQotMTk5OS0wNC0wNCAgRG9uIEJvd21hbiA8ZG9uQHBpeHNjaS5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtaXBzKmVsLSotdnh3b3JrcyogYW5kIG1pcHMqLSotdnh3b3JrcyouCi0KLTE5OTktMDQtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkd2FyZjEuYyAocGFyc2VfbGluZV90YWJsZSk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIGxhc3RfcGMgYW5kCi0JbGFzdF9saW5lLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZmNvcmVfc2VjdGlvbl9mcm9tX3BoZHIpOiBEZWNsYXJlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9nY19tYXJrX2hvb2spOiBBZGQgZGVmYXVsdCBjYXNlIHRvCi0Jc3dpdGNoLgotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IFJlbW92ZSB1bnVzZWQKLQlsb2NhbCBpLgotCSogc3ltcy5jIChfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IFJlbW92ZSB1bnVzZWQKLQlsb2NhbCB2YWwuCi0KLTE5OTktMDMtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBhcm0tZXBvYy1wZSB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBhcm0tZXBvYy1wZSB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiB0YXJnZXRzLmM6IEFkZCBzdXBwb3J0IGZvciBhcm0tZXBvYy1wZSB0YXJnZXQuCi0JKiBjb2ZmLWFybS5jOiBBbGxvdyBoZWFkZXIgZmlsZXMgdG8gb3ZlcnJpZGUgZGVmaW5pdGlvbiBvZgotCVRBUkdFVF9VTkRFUlNDT1JFIGFuZCBVU0VSX0xBQkVMX1BSRUZJWC4KLQkqIHBlLWFybS5oOiBBbGxvdyBwcmV2aW91cyBoZWFkZXIgZmlsZXMgdG8gb3ZlcnJpZGUgZGVmaW5pdGlvbiBvZgotCVRBUkdFVF9MSVRUTEVfU1lNIGFuZCBUQVJHRVRfQklHX1NZTS4KLQkqIHBlaS1hcm0uaDogQWxsb3cgcHJldmlvdXMgaGVhZGVyIGZpbGVzIHRvIG92ZXJyaWRlIGRlZmluaXRpb24gb2YKLQlUQVJHRVRfTElUVExFX1NZTSBhbmQgVEFSR0VUX0JJR19TWU0uCi0JKiBlcG9jLXBlLWFybS5jOiBOZXcgZmlsZS4gIFN1cHBvcnQgYXJtLWVwb2MtcGUgdGFyZ2V0LgotCSogZXBvYy1wZWktYXJtLmM6IE5ldyBmaWxlLiAgU3VwcG9ydCBhcm0tZXBvYy1wZWkgdGFyZ2V0LgotCi0xOTk5LTAzLTMwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoZWxmX21hcF9zeW1ib2xzKTogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHNlY3Rpb24KLQlzeW1ib2xzIGFyZSBnZW5lcmF0ZWQgZm9yIGNvbnRlbnQtbGVzcyBzZWN0aW9ucyB3aGljaCBhcmUKLQlub3QgbWFwcGVkIHRvIHRoZSBvdXRwdXQgZmlsZS4KLQotCSogbGlua2VyLmM6IFJlcGxhY2UgZGlyZWN0IHJlZmVyZW5jZXMgdG8gZmllbGRzIGluIEJGRCBzdHJ1Y3R1cmUKLQl3aXRoIGFjY2Vzc29yIG1hY3Jvcy4KLQotCSogZWxmbGluay5oOiBSZXBsYWNlIGRpcmVjdCByZWZlcmVuY2VzIHRvIGZpZWxkcyBpbiBCRkQgc3RydWN0dXJlCi0Jd2l0aCBhY2Nlc3NvciBtYWNyb3MuCi0KLTE5OTktMDMtMjUgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBjb25maWcuYmZkOiBFbGltaW5hdGUgcmVkdW5kYW5jeSBpbiBjaGVja3MgZm9yIExpbnV4L0FSTS4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogVGFrZSB0aGUgcmlnaHRzaGlmdCBpbnRvCi0JYWNjb3VudCB3aGVuIGFkanVzdGluZyBzZWN0aW9uIHN5bWJvbHMgZHVyaW5nIGEgcGFydGlhbCBsaW5rLgotCi0xOTk5LTAzLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNwYXJjLmMgKHN0cnVjdCBjb2ZmX3JlbG9jX21hcCk6IENoYW5nZSB0eXBlIG9mIGZpZWxkCi0JICAnYmZkX3JlbG9jX3ZhbCcgdG8gYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLgotCSogZWxmLW0xMDIwMC5jIChzdHJ1Y3QgbW4xMDIwMF9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZi1tMTAzMDAuYyAoc3RydWN0IG1uMTAzMDBfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1hcmMuYyAoc3RydWN0IGFyY19yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLWQxMHYuYyAoc3RydWN0IGQxMHZfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1kMzB2LmMgKHN0cnVjdCBkMzB2X3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItZnIzMC5jIChzdHJ1Y3QgZnIzMF9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLW0zMnIuYyAoc3RydWN0IG0zMnJfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1zaC5jIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItc3BhcmMuYyAoc3RydWN0IGVsZl9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLXY4NTAuYyAoc3RydWN0IHY4NTBfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGY2NC1zcGFyYy5jIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmYXJtLW5hYmkuYyAoc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZmFybS1vYWJpLmMgKHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwKTogRGl0dG8uCi0KLTE5OTktMDMtMTcgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2hhbmdlZCB0aGlzCi0JZnVuY3Rpb24gc28gc291cmNlLWxldmVsIGFzc2VtYmx5IHdvcmtzLiAgSWYgbXVsdGlwbGUgTl9TT3MKLQlhcmUgc2VlbiB3aXRob3V0IGFuZCBOX0ZVTnMsIGNyZWF0ZSBhbiBpbmRleHRhYmxlIGVudHJ5IHdpdGgKLQlhIE5VTEwgZnVuY3Rpb24gbmFtZS4KLQotMTk5OS0wMy0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKSBBbGxvdyBtZXJnaW5nCi0Jb2YgY2VydGlhbiBzaW1pbGFyIGNwdXMuCi0KLTE5OTktMDMtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6Ci0JQWRkIHRoZSA1MDAwLiAgQ2hhbmdlIHRoZSBhcmNoaXRlY3R1cmUgZm9yIHRoZSA1NDAwIHRvIG1pcHM0LgotCShlbGZfbWlwc19tYWNoKTogQWRkIHI1MDAwLgotCi0xOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNwdS1pOTYwLmMgKHNjYW5faTk2MF9tYWNoKTogUmVjb2duaXplIGk5NjA6a2Ffc2EgYW5kIGk5NjA6a2Jfc2IuCi0KLTE5OTktMDMtMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBHZW5lcmF0ZSB3YXJuaW5nIGFib3V0Ci0JaHVnZSBmaWxlIG9mZnNldHMgZm9yIGFueSBzZWN0aW9uIHRoYXQgd2lsbCBvY2N1cHkgZmlsZSBzcGFjZSwgbm90Ci0JanVzdCB0aG9zZSB0aGF0IGFyZSBsb2FkYWJsZS4KLQotMTk5OS0wMi0yNCAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZSBhZnRlciBOaWNrIENsaWZ0b24ncyBGZWIgMTcgY2hhbmdlcy4KLQotMTk5OS0wMi0yMiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jOiBBZGQgcHBjX2VsZl9yZWxheF9zZWN0aW9uKCkgZm9yIHRoZSBsZCBvcHRpb24gbXBjODYwYzAuCi0KLU1vbiBGZWIgMjIgMTg6MjY6NTEgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSyk6IERlZmluZS4KLQkqIGVsZmxpbmsuaDogUmV2ZXJ0IGFsbCBjaGFuZ2VzIHNpbmNlIEZlYiAxNi4gIEluc3RlYWQ6Ci0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZsYWcgaWYKLQlhcHByb3ByaWF0ZS4gIENvcHkgaXQgdG8gdmVyc2lvbiBzeW1ib2xzLgotCShlbGZfZml4X3N5bWJvbF9mbGFncyk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZvciBub24gRUxGCi0Jc3ltYm9scyBpZiBhcHByb3ByaWF0ZS4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZvciB3ZWFrZGVmCi0Jc3ltYm9sIGlmIGFwcHJvcHJpYXRlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSWYgc3ltYm9sIGlzIG1hcmtlZCBhcyB1bmRlZmluZWQsIGFuZAotCWhhcyBubyBub253ZWFrIHJlZmVyZW5jZXMsIG1hcmsgaXQgYXMgd2VhayB1bmRlZmluZWQuCi0KLUZyaSBGZWIgMTkgMTY6MDE6MTIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBXaGVuIG92ZXJyaWRpbmcgYSBkeW5hbWljCi0JZGVmaW5pdGlvbiB3aXRoIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sLCBzZXQgTkVFRFNfUExUIGlmIGl0IGlzIGEKLQlmdW5jdGlvbi4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgY29weSB0aGUgb3RoZXIgZmllbGQgaWYgd2UKLQlhcmUgb3ZlcnJpZGRpbmcuCi0KLVRodSBGZWIgMTggMTg6MDc6NDMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBEbyBub3QgbWVyZ2UgYW55IHN5bWJvbCBmcm9tIGEKLQlzaGFyZWQgb2JqZWN0IHdpdGggYSB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wuCi0KLTE5OTktMDItMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmFybS1uYWJpLmM6IFNldCBwYXJ0aWFsX2lucGxhY2UgYmFjayB0byBmYWxzZS4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBSZS1lbmFibGUuCi0JKFVTRVJfTEFCRUxfUFJFRklYKTogU2V0IHRvICJfIi4KLQotCVRoZSBmb2xsb3dpbmcgcGF0Y2hlcyBhcmUgZnJvbTogU2NvdHQgQmFtYnJvdWdoCi0JPHNjb3R0YkBjb3JlbGNvbXB1dGVyLmNvbT4KLQotCSogbGliYW91dC5oIChNX0FSTTZfTkVUQlNEKTogU2V0IHRvIDE0My4KLQotCSogcmVsb2MuYzogQWRkIEFSTSBQSUMgcmVsb2NzOiAgIEJGRF9SRUxPQ19BUk1fR09UMTIsCi0JQkZEX1JFTE9DX0FSTV9HT1QzMiwgQkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QsIEJGRF9SRUxPQ19BUk1fQ09QWSwKLQlCRkRfUkVMT0NfQVJNX0dMT0JfREFULCBCRkRfUkVMT0NfQVJNX1BMVDMyLAotCUJGRF9SRUxPQ19BUk1fUkVMQVRJVkUsIEJGRF9SRUxPQ19BUk1fR09UT0ZGLCBCRkRfUkVMT0NfQVJNX0dPVFBDLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBTZXQgcGFydGlhbF9pbnBsYWNlIHRvCi0JJ3RydWUnIGFzIFJFTCByZWxvY3MgYXJlIG5vdyBiZWluZyB1c2VkLiAgQWRkIG5ldyBQSUMgcmVsb2NzOgotCVJfQVJNX0NPUFksIFJfQVJNX0dMT0JfREFULCBSX0FSTV9KVU1QX1NMT1QsIFJfQVJNX1JFTEFUSVZFLAotCVJfQVJNX0dPVE9GRiwgUl9BUk1fR09UUEMsIFJfQVJNX0dPVDMyLCBSX0FSTV9QTFQzMi4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2hlY2sgYnl0ZSBvcmRlcgotCW9mIHRhcmdldHMuCi0JKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogQ2hhbmdlIHBhcmFtZXRlcnMgc28gdGhhdCBlbnRpcmUKLQlyZWxvYyBpcyBwYXNzZWQuICBBZGQgc3VwcG9ydCBmb3IgUElDIHJlbG9jcy4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBQYXNzIGVudGlyZSByZWxvYyB0bwotCWVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlLgotCShlbGYzMl9hcm1fY2hlY2tfcmVsb2NzKTogSGFuZGxlIG5ldyBQSUMgcmVsb2NzLgotCShlbGYzMl9hcm1fYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9hcm1fc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9hcm1fZGlzY2FyZF9jb3BpZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoRUxGX01BWFBBR0VfU0laRSk6IERlZmluZS4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltKTogRGVmaW5lLgotCi1XZWQgRmViIDE3IDEyOjAyOjI2IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYWtlIHJlZ2luZm8KLQlzZWN0aW9ucyBTRUNfTElOS19PTkNFIGFuZCBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgMTcgMTI6MDc6MjMgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGZhcm0tb2FiaS5jIChiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucywKLQliZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZywKLQliZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBEZWZpbmUgdG8gYXZvaWQgY2xhc2gKLQl3aXRoIGVsZmFybS1uYWJpLmMuCi0KLQkqIGVsZjMyLWFybS5oOiBEb24ndCBkZWNsYXJlIGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvLgotCShlbGYzMl90aHVtYl90b19hcm1fc3R1YiwgZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIsCi0JZWxmMzJfYXJtX2ZpbmRfbmVhcmVzdF9saW5lKTogTWFrZSB0aGVtIHN0YXRpYy4KLQotVHVlIEZlYiAxNiAyMjo0NDozNyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IEFkZCBwZmxhZ3MgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBEbyBub3QgbWVyZ2UgYSBkZWZpbml0aW9uIGZyb20gYSBzaGFyZWQgb2JqZWN0IHdpdGggYQotCXdlYWsgdW5kZWZpbmVkIHN5bWJvbC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG8gbm90IGNoYW5nZSB0aGUgc3ltYm9sIHR5cGUgb3IKLQlzaXplIGlmIHRoZSBvbGQgc3ltYm9sIG92ZXJyaWRlcyB0aGUgbmV3IG9uZS4KLQotMTk5OS0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHN0cm9uZ2FybSB0YXJnZXQuCi0KLU1vbiBGZWIgIDggMTE6MTg6MTQgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKHJlbG9jX21hcCk6IFVzZSB0aGUgY29ycmVjdCB0eXBlcyBmb3IgdGhlIHN0cnVjdAotCWZpZWxkcyBpbnN0ZWFkIG9mIHVuc2lnbmVkIGNoYXIuCi0KLUZyaSBGZWIgIDUgMDA6MjI6MzYgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEZlYiAgNCAyMjozMDoxMyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIEFDX1BSRVJFUSB0byAyLjEzLiAgUmVtb3ZlIEFNX0NZR1dJTjMyLgotCUNoYW5nZSBBTV9FWEVFWFQgdG8gQUNfRVhFRVhUIGFuZCBBTV9QUk9HX0lOU1RBTEwgdG8KLQlBQ19QUk9HX0lOU1RBTEwuICBBZGQgY29tbWVudHMgdG8gdXNlcyBvZiBBQ19ERUZJTkUuCi0JKiBhY2luY2x1ZGUubTQ6IEFkZCBjb21tZW50cyB0byB1c2VzIG9mIEFDX0RFRklORS4KLQkqIGFjY29uZmlnLmg6IFJlbW92ZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGN1cnJlbnQgYXV0b2NvbmYvYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBMaWtld2lzZS4KLQkqIGNvbmZpZy5pbjogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLTE5OTktMDItMDQgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYyAocmVhbF9yZWFkKTogZG9uJ3QgY2FsbCBmcmVhZCBmb3IgemVybyBieXRlcy4gIFRoaXMKLQljb3ZlcnMgdXAgYSBidWcgKG9yIG1pc3VzZSBvZiBiZmQpIHRoYXQncyBleHBvc2VkIGJ5IFNvbGFyaXMuCi0KLVRodSBGZWIgIDQgMTI6Mzg6MTAgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEluc3VyZSB0aGF0IHRoZSB0YXJnZXQKLQlvZiBhIGp1bXAgaXMgaW4gdGhlIGN1cnJlbnQgMjU2IE1CIHJlZ2lvbi4KLQotVGh1IEZlYiAgNCAxMjoxNTozOCAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBDaGFuZ2UgbGFzdCBwYXRjaCB0byBvbmx5Ci0JdGFrZSBlZmZlY3QgZm9yIHRoZSBiaW5hcnkgdGFyZ2V0LgotCi1XZWQgRmViICAzIDE5OjQwOjEyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBCRkRfUkVMT0NfQ1RPUi4KLQotV2VkIEZlYiAgMyAxNTowMjo0NCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3IHJvdXRpbmUuCi0KLVR1ZSBGZWIgIDIgMjE6Mzg6MjggMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogSWYgdGhlIHRhcmdldCB3YXMKLQlwcmV2aW91c2x5IHNwZWNpZmllZCwgZG9uJ3QgY2hlY2sgb3RoZXIgdGFyZ2V0cyB3aGVuIGNoZWNraW5nIGZvcgotCWFuIGFyY2hpdmUgZmlsZS4KLQotVHVlIEZlYiAgMiAxODoxNjo0MyAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9yZWxvY19tYXApOiAgUmVtb3ZlZC4KLQkoZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwKTogIFJlbW92ZWQKLQkqIGVsZmFybS1uYWJpLmMgKGVsZjMyX2FybV9yZWxvY19tYXApOiAgTmV3LgotCShlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiAgTmV3LgotCSogZWxmYXJtLW9hYmkuYyAoZWxmMzJfYXJtX3JlbG9jX21hcCk6ICBOZXcuCi0JKGVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCk6ICBOZXcuCi0KLU1vbiBGZWIgIDEgMTk6NDk6MjEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZmFybS1uYWJpLmM6ICBSZW5hbWVkIGZyb20gZWxmMzItYXJtLW5ld2FiaS5jLgotCSogZWxmYXJtLW9hYmkuYzogIFJlbmFtZWQgZnJvbSBlbGYzMi1hcm0tb2xkYWJpLmMKLQkqIE1ha2VmaWxlLmFtOiAgVXNlIG5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiAgUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBuZXcgZmlsZXMuCi0JKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlLgotCi0xOTk5LTAyLTAxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZWxmX2djX21hcmtfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZnIzMF9lbGZfZ2Nfc3dlZXBfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCi1Nb24gRmViICAxIDEyOjIxOjQ3IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogIEFkZCBiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjCi0JYW5kIGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMuCi0KLU1vbiBGZWIgIDEgMTE6NDY6MzEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChlbGYzMi1hcm0tb2xkYWJpLmxvKTogIE5ldy4KLQkoZWxmMzItYXJtLW5ld2FiaS5sbyk6ICBOZXcuCi0JKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCi0JKiBjb25maWcuYmZkICh0aHVtYi0qLWVsZik6ICBSZW1vdmUgZGVmaW5pdGlvbiBvZiB0YXJnX3VuZGVyc2NvcmUuCi0JKGFybS0qLWVsZik6ICBMaWtld2lzZS4KLQkoYXJtLSotb2FiaSk6ICBOZXcuCi0JKHRodW1iLSotb2FiaSk6ICBOZXcuCi0JKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluIChiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjKTogIE5ldy4KLQkoYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYyk6ICBOZXcuCi0JKiBlbGYzMi1hcm0tbmV3YWJpLmM6ICBOZXcuCi0JKiBlbGYzMi1hcm0tb2xkYWJpLmM6ICBOZXcuCi0JKiBlbGYzMi1hcm0uYzogIFJlbW92ZWQuCi0JKiBlbGYzMi1hcm0uaDogIE5ldy4KLQotTW9uIEZlYiAgMSAxMTo1MjoxMiAxOTk5ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogT21pdCB3YXJuaW5ncyBmb3IKLQl1bmxvYWRhYmxlIHNlY3Rpb25zLgotCi0xOTk5LTAxLTMxICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAocG93ZXJwY3ssbGV9LSotdnh3b3JrcyopOiBBZGQgYWxpYXNlcyB0bwotCXBvd2VycGN7LGxlfS0qLWVhYmkuCi0KLTE5OTktMDEtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMi5jIChyZWFkX3Vuc2lnbmVkX2xlYjEyOCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCSogZHdhcmYyLmMgKHJlYWRfc2lnbmVkX2xlYjEyOCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCi1GcmkgSmFuIDI5IDAwOjQ3OjIxIDE5OTkgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBPbmx5IGFkanVzdAotCXBfYWxpZ24gd2hlbiBuZWVkZWQuCi0KLVRodSBKYW4gMjggMjA6MDU6MjIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QgcmV0dXJuIGVhcmx5IGZvciBhCi0gCW5vbi1sb2FkYWJsZSBzZWN0aW9uLCBpbiBjYXNlIHRoZSBmaXJzdCBzZWN0aW9uIGlzIG5vbi1sb2FkYWJsZS4KLSAgCURvbid0IHNldCB0aGUgbG93IGxtYSBmb3IgYSBTRUNfTkVWRVJfTE9BRCBzZWN0aW9uLiAgRnJvbSBNYWNpZWoKLQlXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPi4KLQotMTk5OS0wMS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX3JlbG9jX21hcCk6IEFkZCBSX0ZSMzBfR05VX1ZUSU5IRVJJVCBhbmQKLQlSX0ZSMzBfR05VX1ZURU5UUlkgcmVsb2NzLgotCi1UaHUgSmFuIDI4IDExOjA4OjE2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9zeW0pOiAgWmVybyBzeW1zIHdoaWNoIGFyZQotICAgICAgIHBhcnQgb2Ygc2VjdGlvbnMgd2hpY2ggaGF2ZSBiZWVuIGV4Y2x1ZGVkLgotCi1XZWQgSmFuIDI3IDEzOjM1OjM1IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzKTogQ2hhbmdlZCBGX1BJQwotCXRvIEZfUElDX0lOVC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogUmVtb3ZlZCBGX0FSTV8yYSBhbmQKLQlGX0FSTV8zTSBsYWJlbHMuICBDaGFuZ2VkIEZfUElDIHRvIEZfUElDX0lOVC4KLQotMTk5OS0wMS0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9ob3d0b190YWJsZSk6IEZpeCBuYW1lIG9mIFJfRlIzMF80OAotCXJlbG9jYXRpb24uCi0JKGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSk6IFVzZSBjb21wdXRlZCB2YWx1ZSBhcyByZXN1bHQgb2YKLQlyZWxvY2F0aW9uLgotCi0xOTk5LTAxLTI2ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRW1pdCB3YXJuaW5nIGZvcgotCWh1Z2UgZmlsZSBvZmZzZXRzIGR1ZSB0byB3aWRlbHktZGlzcGVyc2VkIHNlY3Rpb24gTE1Bcy4KLQotTW9uIEphbiAxOCAwMzozNTozNSAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSWYgbm90IERfUEFHRUQsCi0JYWxpZ24gZmlyc3Qgc2VjdGlvbiB0byBsYXJnZXN0IHNlY3Rpb24gYWxpZ25tZW50LCBub3QgZmlyc3QKLQlzZWN0aW9uIGFsaWdubWVudC4KLQotMTk5OS0wMS0wNCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXV0b2NvbmYgMi4xMi4xIG9yIGhpZ2hlci4KLQotVHVlIERlYyAyMiAxNToyMTo0MSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCk6ICBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6ICBMaWtld2lzZS4KLQkqIGNwdS1pMzg2LmMgKGJmZF9pMzg2X2FyY2hfaW50ZWxfc3ludGF4KTogIE5ldy4KLQotMTk5OC0xMi0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMsYmZkLWluMi5oIChiZmRfbWFjaF9taXBzNDExMSk6IE5ldy4KLQkqIGNwdS1taXBzLmM6IEFkZCBzdXBwb3J0IGZvciBhbmQgaW5kZXBlbmRlbnQgNDExMS4KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfbWFjaCk6IEVfTUlQU19NQUNIXzQxMTEgLT4gYmZkX21hY2hfbWlwczQxMTEuCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6Ci0JYmZkX21hY2hfbWlwczQxMTEgLT4gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQxMTEuCi0KLTE5OTgtMTItMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2FiaV9uYW1lKTogTmV3LgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDb21wYXJlIEVGX01JUFNfQUJJIGZsYWdzLgotCi0xOTk4LTEyLTEyICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOgotCUhhbmRsZSBiZmRfbWFjaF9taXBzNDMwMC4KLQotMTk5OC0xMi0xMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYzogUmVtb3ZlIGxlYWtlZCBkZXZlbG9wbWVudCBjb2RlIGZyb20gcGF0Y2gKLQkxOTk4LTEyLTEwIGJ5IFJpY2hhcmQgSGVuZGVyc29uLgotCi0xOTk4LTEyLTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBmYWlsIHJlbG9jYXRpb25zCi0JaW4gZGVidWcgc2VjdGlvbnMgZm9yIHN5bWJvbCBkZWZpbmVkIGV4dGVybmFsbHkuCi0KLVRodSBEZWMgMTAgMTA6NTg6MzggMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyeSBmb3IKLQl0ZWtoZXhfdmVjLgotCi0xOTk4LTEyLTA5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZWxmX2hvd3RvX3RhYmxlKTogU2V0IHNyY19tYXNrIGZpZWxkcyB0byAwCi0Jc2luY2Ugd2UgYXJlIHVzaW5nIFJFTEFzLgotCi1UdWUgRGVjICA4IDIyOjE1OjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVNDTyBPcGVuIFNlcnZlciBSZWxlYXNlIDUgY29yZSBmaWxlIHN1cHBvcnQsIGZyb20gSm91a2UgTnVtYW4KLQk8am51bWFuQGhpc2NvbS5ubD46Ci0JKiBzY281LWNvcmUuYzogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1Nl04Ni0qLXNjbzMuMnY1Kik6IFVzZSBzY281LWNvcmUubG8uCi0JKHNjbzUtY29yZS5sbyk6IERlZmluZSBTQ081X0NPUkUgaW4gQ09SRUZMQUcuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKE9QVElPTkFMX0JBQ0tFTkRTKTogQWRkIHNjbzUtY29yZS5sby4KLQkoT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIHNjbzUtY29yZS5jLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIHNjbzVfY29yZV9kYXRhIGZpZWxkIHRvIHRkYXRhLgotCSogdGFyZ2V0cy5jIChzY281X2NvcmVfdmVjKTogQWRkIHRvIHRhcmdldCBsaXN0IGlmIFNDTzVfQ09SRS4KLQkqIGJmZC1pbjIuaCwgY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIERlYyAgOCAxOTozODo0MiAxOTk4ICBNYXJrIEtsZWluICA8bWtsZWluQGRpcy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGhwcGEqLSotbXBlaXgqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0hFQURFUl9ESVJFTlQuCi0JKGhwcGEqLSotbXBlaXgqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5ob3N0IChocHBhKi0qLW1wZWl4Kik6IE5ldyBob3N0LgotCSogaHB1eC1jb3JlLmM6IENoZWNrIEhPU1RfSFBQQU1QRUlYLiAgVXNlIEhBVkVfRElSRU5UX0ggYW5kCi0JZnJpZW5kcyByYXRoZXIgdGhhbiBqdXN0IGluY2x1ZGluZyA8c3lzL2Rpci5oPi4KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tX3N5bWJvbCk6IEFkZCBocHBhX3ByaXZfbGV2ZWwgYW5kIGFwdG8KLQl0Y19kYXRhLiAgQ2hhbmdlIGFsbCB1c2Vycy4KLQkoc3RydWN0IHNvbWRhdGEpOiBBZGQgY29tcF91bml0IGZpZWxkLgotCShvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQpOiBEZWZpbmUuCi0JKGJmZF9zb21fYXR0YWNoX2NvbXBpbGF0aW9uX3VuaXgpOiBEZWNsYXJlLgotCSogc29tLmM6IENoZWNrIEhPU1RfSFBQQU1QRUlYLgotCShzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8pOiBBZGQgbmV3IGZpZWxkIHByaXZfbGV2ZWwuCi0JKHNvbV9vYmplY3Rfc2V0dXApOiBBZGQgY3VycmVudF9vZmZzZXQgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKHNldHVwX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKHNvbV9vYmplY3RfcCk6IEZvciBFWEVDTElCTUFHSUMsIHJlYWQgdGhlIGxzdCBoZWFkZXIuCi0JKHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyk6IEFkZCBjb21waWxhdGlvbl91bml0IHBhcmFtZXRlci4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKHNvbV9maW5pc2hfd3JpdGluZyk6IFdyaXRlIG91dCBjb21waWxhdGlvbl91bml0LgotCShzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogU2V0IHByaXZfbGV2ZWwuCi0JKHNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlKTogU2V0IHhsZWFzdCBmaWVsZCB0byAzLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IHN5bWJvbCBwcml2X2xldmVsLgotCShiZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml0KTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IFNldCB4bGVhc3QgZmllbGQgdG8gMy4gIFNldAotCXByaXZfbGV2ZWwgaW50byBzeW1ib2xfdmFsdWUuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotVHVlIERlYyAgOCAxNjoyMTozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfY29yZV9maWxlX3ApOiBDaGFuZ2UgY2FsbCB0byBub25leGlzdGVudAotCXdhcm5pbmcgZnVuY3Rpb24gdG8gY2FsbCBfYmZkX2Vycm9yX2hhbmRsZXIgaW5zdGVhZC4KLQotCSogbGliYmZkLmMgKENPRVJDRTMyKTogQ2FzdCB0aHJvdWdoIHVuc2lnbmVkIGxvbmcgYW5kIGxvbmcgdG8KLQlhdm9pZCBidWcgaW4gb2xkIHZlcnNpb24gb2YgZ2NjLgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IFJlbW92ZS4KLQkoZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBEb24ndCBkZWZpbmUuCi0KLTE5OTgtMTItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlKTogRml4IFBDIHJlbGF0aXZlCi0JcmVsb2NhdGlvbnMgdG8gaW5jbHVkZSBvZmZzZXQgb2YgMiBpbmNsdWRlZCBpbiB0aGUgaW5zbnMsIGFuZCB0aGUKLQlvZmZzZXQgb2YgdGhlIHJlbG9jcyB3aXRoaW4gdGhlIHNlY3Rpb24uCi0KLVdlZCBEZWMgIDIgMTU6MDM6NTkgMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQlUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGJ5IERhdmlkIFRheWxvcgotIAk8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+LCBFZGl0aCBFcHN0ZWluCi0gCTxlZXBzdGVpbkBzb3BoaWEuY3lnbnVzLmNvbT4sIEppbSBCbGFuZHkKLSAJPGppbWJAendpbmdsaS5jeWdudXMuY29tPiwgYW5kIEVsZW5hIFphbm5vbmkKLSAJPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIHRoZSBwcm9qZWN0IHRvIG1lcmdlIGluCi0gCWNoYW5nZXMgb3JpZ2luYWxseSBtYWRlIGJ5IEhQOyBIUCBkaWQgbm90IGNyZWF0ZSBDaGFuZ2VMb2cKLSAJZW50cmllcy4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsdCB1c2luZyBsYXRlc3QKLSAJYXV0b21ha2UgbWFjcm8gbGlicmFyeS4KLQotCSogaHB1eC1jb3JlLmMgKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IHRoaXMgZnVuY3Rpb24gbm93Ci0gCXVuZGVyc3RhbmRzIEhQVVggMTAuMzAgdGhyZWFkIGluZm8uIFllcywgdGhlIHRocmVhZCBzdGFja3MgY2FuIGJlCi0gCWZvdW5kIGluIHRoZSBjb3JlZmlsZSEgQWxzbywgaW4gaHB1eF9jb3JlX2NvcmVfZmlsZV9wLCBpZiB3ZQotIAllbmNvdW50ZXIgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLCBkb24ndCBwdW50LiAgSW5zdGVhZCwKLSAJanVzdCBza2lwIGl0LiAgQWxzbywgY291bnQgdGhlIG51bWJlciBvZiBzZWN0aW9ucyBvZiBrbm93biB0eXBlCi0gCXRoYXQgd2UgZW5jb3VudGVyLiAgSWYgd2UgZW5jb3VudGVyIGF0IGxlYXN0IG9uZSBnb29kIG9uZSwgdGhlbgotIAl3ZSdsbCBkZWNsYXJlIHRoYXQgdGhlIGZpbGUgaXMgYSBjb3JlIGZpbGUuICBJZiB3ZSBlbmNvdW50ZXIgYW55Ci0gCXVua25vd24gb25lcyBidXQgc29tZSBrbm93biBvbmVzLCB0aGVuIHdlJ2xsIGlzc3VlIGEgd2FybmluZyAoYnV0Ci0gCXN0aWxsIGRlY2xhcmUgaXQgdG8gYmUgYSBjb3JlIGZpbGUpLiBBbHNvLCBjb3JyZWN0bHkgZGVjaWRlIHdoZW4gYQotIAlmaWxlIGlzIG5vdCBhIGNvcmUuCi0JKFBST0NfSU5GT19IQVNfVEhSRUFEX0lEKTogZGVmaW5lIGlmIENPUkVfQU5PTl9TSE1FTSBkZWZpbmVkLgotCShDT1JFX0FOT05fU0hNRU0pOiBkZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGhwdXhfY29yZV9zdHJ1Y3QpOiBhZGQgbWVtYmVycyBsd3BpZCBhbmQgdXNlcl90aWQuCi0JKGNvcmVfa2VybmVsX3RocmVhZF9pZCwgY29yZV91c2VyX3RocmVhZF9pZCk6IG5ldyBtYWNyb3MuCi0JKG1ha2VfYmZkX2FzZWN0aW9uKTogdXNlIGJmZF9hbGxvYyB0byBhbGxvY2F0ZSByb29tIGZvciBhIGNvcHkgb2YKLSAJdGhlIG5hbWUgYmVmb3JlIHN0b3JpbmcgaXQgaW4gdGhlIGJmZC4KLQkoaHB1eF9jb3JlX2NvcmVfZmlsZV9wKTogaGFuZGxlIHRocmVhZHMuCi0KLQkqIGxpYmhwcGEuaCAoR0VUX0ZJRUxEKTogcHJvdGVjdCBhZ2FpbnN0IHJlZGVmaW5pdGlvbi4KLQkoSFBQQV9XSURFKTogZGVmaW5lLgotCShHRVRfRklFTEQpOiBkZWZpbmUuCi0JKEdFVF9CSVQpOiBkZWZpbmUuCi0JKE1BU0spOiBkZWZpbmUuCi0JKENBVEVOQVRFKTogZGVmaW5lLgotCShFTEVWRU4pOiBkZWZpbmUuCi0JKHNpZ25fZXh0ZW5kKTogcmVkZWZpbmUuCi0JKGFzc2VtYmxlXzYpOiBkZWZpbmUuCi0JKGFzc2VtYmxlXzEyKTogcmV3cml0ZS4KLQkoYXNzZW1ibGVfMTYpOiBkZWZpbmUuCi0JKGFzc2VtYmxlXzE2YSk6IGRlZmluZS4KLQkoYXNzZW1ibGVfMTcpOiByZXdyaXRlLgotCShhc3NlbWJsZV8yMik6IGRlZmluZS4KLQotMTk5OC0xMi0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBVc2luZyBzaWduZWQKLQlyZWxvY2F0aW9ucyBmb3Igc2lnbmVkIHZhbHVlcy4KLQotU3VuIERlYyAgNiAxNjozMDozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHNic2QuYyAoTVkoc2V0X2FyY2hfbWFjaCkpOiBNYWtlIHN0YXRpYy4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogRm9yIGJmZF9hcmNoX21pcHMsIHVzZQotCWJmZF9tYWNoX21pcHMqIG1hY3JvcyByYXRoZXIgdGhhbiBzaW1wbGUgbnVtYmVycy4KLQotCUNPRkYgd2VhayBzeW1ib2wgc3VwcG9ydCwgYmFzZWQgb24gcGF0Y2hlcyBmcm9tIE1hcmsgRWxicmVjaHQKLQk8c25vd2JhbGwzQHVzYS5uZXQ+OgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBIYW5kbGUgQ19XRUFLRVhULgotCSogY29mZmdlbi5jIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBIYW5kbGUgd2VhayBzeW1ib2xzLgotCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCk6IExpa2V3aXNlLgotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSk6IExpa2V3aXNlLgotCi0JKiBlbGYuYyAoY29weV9wcml2YXRlX2JmZF9kYXRhKTogQWx3YXlzIGluaXRpYWxpemUgdGhlCi0JaW5jbHVkZXNfcGhkcnMgZmllbGQuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2ZpeF9zeW1ib2xfZmxhZ3MpOiBDaGVjayBmb3IgY2FzZSB3aGVyZSBhIG5vbi1FTEYKLQlmaWxlIGRlZmluZXMgYSBzeW1ib2wgZmlyc3QgbWVudGlvbmVkIGluIGFuIEVMRiBmaWxlLgotCi0JKiBiZmQtaW4uaDogQWx3YXlzIGRlZmluZSBCRkRfSE9TVF82NF9CSVQgYW5kIEJGRF9IT1NUX1VfNjRfQklUIGlmCi0JcG9zc2libGUsIHJhdGhlciB0aGFuIG9ubHkgaWYgQkZENjQuCi0JKiBlbGZsaW5rLmggKGNvbXB1dGVfYnVja2V0X2NvdW50KTogSnVzdCBjaGVjayBCRkRfSE9TVF9VXzY0X0JJVCwKLQlub3QgX19HTlVDX18uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIHNyZWMuYyAoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IENvcnJlY3QgdGVzdCB0byBhdm9pZAotCXN3aXRjaGluZyB0byA0IGJ5dGUgYWRkcmVzc2VzIGFmdGVyIHNlZWluZyBhIHNlY29uZCBzZWN0aW9uIHdoaWNoCi0JcmVxdWlyZXMgMyBieXRlIGFkZHJlc3Nlcy4gIEZyb20gSm9lbCBTY2hhbnR6Ci0JPGpvZWwuc2NoYW50ekBhcmdvc3lzLmJvZWluZy5jb20+LgotCi0JKiBjb25maWcuYmZkIChtNjgqLSotZ251Kik6IE5ldyB0YXJnZXQuICBGcm9tIEF5bWVyaWMgVmluY2VudAotCTxheW1lcmljLnZpbmNlbnRAZW1pLnUtYm9yZGVhdXguZnI+LgotCi0xOTk4LTEyLTA0ICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBGaXggbG9naWMgdG8KLQlkZWNpZGUgd2hldGhlciB0aGUgb3V0cHV0IGZpbGUgaXMgLW1yZWxvY2F0YWJsZS1saWIsCi0JLW1yZWxvY2F0YWJsZSwgb3IgbmVpdGhlci4gIChnZGIuYmFzZS9ub2RlYnVnLmV4cCkKLQotMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jOiBBZGQgc3VwcG9ydCBmb3IgUl9GUjMwXzQ4IHJlbG9jLgotCSogcmVsb2MuYzogQWRkIEJGRF9SRUxPQ19GUjMwXzQ4IHJlbG9jYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZQotCi1XZWQgRGVjICAyIDAwOjU4OjM3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogV2FybiBvbiBhbiBhdHRlbXB0IHRvCi0JbGluayBhZ2FpbnN0IGEgZHluYW1pYyBzeW1ib2wgd2l0aCBubyB0eXBlIG9yIHNpemUuCi0KLTE5OTgtMTItMDEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGkzODZfY2hlY2tfcmVsb2NzKSBbUl8zODZfMzJdOiBEb24ndCBlbWl0Ci0JcmVsb2NhdGlvbiBmb3Igc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBnZXQgbG9hZGVkLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKSBbUl8zODZfMzJdOiBMaWtld2lzZS4KLQotVHVlIERlYyAgMSAxMTozMzozMyAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBNYWtlIHJlbG9jX3NpemUsCi0JcmVsb2NfY291bnQgYW5kIGkgbG9uZyBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuICBIYW5kbGUgZXJyb3IKLQlyZXR1cm4gZnJvbSBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCi0xOTk4LTEyLTAxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZXRlY3QgdGhlIGFic2VuY2Ugb2YKLQlhIGhhc2ggdGFibGUuCi0KLU1vbiBOb3YgMzAgMTU6Mjg6MDkgMTk5OCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBlbGYzMi1zaC5jIChlbGYvc2guaCk6IEluY2x1ZGUuCi0Jc2hfcmVsb2NfdHlwZTogRGVsZXRlLiAgQ2hhbmdlZCBhbGwgcmVmZXJlbmNlcyB0byBlbGZfc2hfcmVsb2NfdHlwZS4KLQkoc2hfZWxmX2hvd3RvX3RhYik6IEFkZCBIT1dUTyBmb3IgUl9TSF9TV0lUQ0g4LgotCShzaF9yZWxvY19tYXApOiBNYXAgQkZEX1JFTE9DXzhfUENSRUwgdG8gUl9TSF9TV0lUQ0g4LgotCShzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogSGFuZGxlIFJfU0hfU1dJVENIOC4KLQkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jeSBvZiBlbGYzMi1zaC5sbyBvbiAkKElOQ0RJUikvZWxmL3NoLmguCi0KLUZyaSBOb3YgMjcgMTc6NTE6MzggMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmbGluay5oIChjb21wdXRlX2J1Y2tldF9jb3VudCk6IERvbid0IGFsbG93IG1pbnNpemU9PTAsIGl0Ci0JY2F1c2VzIGRpdmlzaW9uIGJ5IHplcm8gbGF0ZXIgb24uCi0KLVRodSBOb3YgMjYgMTE6MTk6MzUgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZWxmX3BjOV9yZWxvYyxmcjMwX2VsZl9wYzEyX3JlbG9jKTogTm90Ci0JbmVlZGVkLgotCi0xOTk4LTExLTI1ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGkzY29mZl9vYmplY3RfcCk6IFJlbW92ZSBoYWNrLiAgVXNlIG5ldyBlbXVsYXRpb24KLQlob29rIG5vdy4KLQotVHVlIE5vdiAyNCAxMDoyNToyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDYWxsCi0JZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlLgotCShmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb246IEhhbmRsZSBJMjAgYW5kIEkzMgotCXJlbG9jcy4KLQkoZnIzMF9lbGZfaTMyX3JlbG9jKTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUgSTMyIHJlbG9jcy4KLQkoZnIzMF9lbGZfcGM5X3JlbG9jKTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUgOV9QQ1JFTCByZWxvY3MuCi0JKGZyMzBfZWxmX3BjMTJfcmVsb2MpOiBOZXcgZnVuY3Rpb246IEhhbmRsZSAxMl9QQ1JFTCByZWxvY3MuCi0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlc2V0IGhpMTZzIHJlbG9jCi0JY2hhaW4gdG8gZW1wdHkuCi0KLQlUaGUgZm9sbG93aW5nIGNoYW5nZXMgYXJlIGJhc2VkIG9uIGEgcGF0Y2ggc3VibWl0dGVkIGJ5IEdpYW5sdWNhCi0JTW9ybyA8Z2xjdHJAYWJjLml0PjoKLQotCSh2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBPbmx5IHVwZGF0ZSBhIGhpMTZzIHJlbG9jIGlmIGl0IGhhcwotCW5vdCBhbHJlYWR5IGJlZW4gdXBkYXRlZC4KLQkoZmluZF9yZW1lbWJlcmVkX2hpMTZzX3JlbG9jKTogTmV3IHBhcmFtZXRlciAnYWxyZWFkeV9mb3VuZCcKLQlyZXR1cm5zIHN0YXRlIG9mIHJlbWVtYmVyZWQgaGkxNnMgcmVsb2MuCi0JKHJlbWVtYmVyX2hpMTZzX3JlbG9jKTogU2V0ICdmb3VuZCcgZmllbGQgdG8gZmFsc2UuCi0JKGhpMTZzX2xvY2F0aW9uKTogQWRkICdmb3VuZCcgZmllbGQuCi0KLTE5OTgtMTEtMjMgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoYmZkX3BlX2RsbF9ub3RfcmVjb2duaXplZF9oYWNrKTogdGhlIGxpbmtlciB3YW50cwotCXRvIHNlZSAuRExMIGZpbGVzIGFzIHVucmVjb2duaXplZC4KLQkoaTNjb2ZmX29iamVjdF9wKTogU29ycnksIGhhZCB0byBoYWNrIGl0IHRvIG5vdCByZWNvZ25pemUgdGhlc2UKLQlmaWxlcyAocGVpLWkzODYpIG9uIHJlcXVlc3QuCi0KLTE5OTgtMTEtMjMgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBvcG5jbHMuYyAoYmZkX21ha2VfcmVhZGFibGUpOiBuZWVkIG1vcmUgY2xlYW51cCBmb3Igc3ltYm9scyBhbmQKLQlyZWxlbnRzLiAgQ2FsbCBiZmRfY2hlY2tfZm9ybWF0IHRvIHJlaW5pdGlhbGl6ZS4KLQotRnJpIE5vdiAyMCAxNDoyMTozNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgc3B1cmlvdXMKLQl3YXJuaW5ncy4KLQotVGh1IE5vdiAxOSAxNDo0MjoxNSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00OiByZWdlbmVyYXRlCi0JKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotVHVlIE5vdiAxNyAyMDoyMzozNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIHZ0YWJsZV9lbnRyaWVzX3NpemUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBDbGVhciBpdC4KLQkqIGVsZmxpbmsuaCAoZWxmX2djX3Byb3BhZ2F0ZV92dGFibGVfZW50cmllc191c2VkKTogQ29weSBpdCwgYW5kCi0JcmVzcGVjdCBpdCBhcyBhbiB1cHBlciBib3VuZCBvbiB3aGF0IG1lbW9yeSB0byByZWZlcmVuY2UuCi0JKGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MpOiBMaWtld2lzZS4KLQkoZWxmX2djX3JlY29yZF92dGVudHJ5KTogSGFuZGxlIGFzLXlldCB1bmRlZmluZWQgdnRhYmxlcy4gIFNldCBhbmQKLQl1cGRhdGUgdnRhYmxlX2VudHJpZXNfc2l6ZSBhcHByb3ByaWF0ZWx5LgotCi1UdWUgTm92IDE3IDE1OjI4OjMxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9yZWxvY190eXBlX2xvb2t1cCk6IFVzZWQgaW50ZWdlcnMgdG8gaG9sZAotCXJlbG9jIG51bWJlci4KLQotTW9uIE5vdiAxNiAyMjoxOToyMSAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSk6IHN1cHBvcnQgQkZEX0lOX01FTU9SWQotIAliZmRzOyB0aGV5IGhhdmUgbm8gImZpbGUiIHNvIHdlIGZha2UgaXQuCi0JKiBiZmQtaW4yLmg6IGFkZCBiZmRfbWFrZV93cml0YWJsZSBhbmQgYmZkX21ha2VfcmVhZGFibGUgKHJlZ2VuKQotCSogbGliYmZkLmMgKGJmZF93cml0ZSk6IEFsbG93IHdyaXRpbmcgdG8gQkZEX0lOX01FTU9SWSBiZmRzIGJ5Ci0gCXJlc2l6aW5nIHRoZSBtZW1vcnkgYnVmZmVyLgotCSogb3BuY2xzLmMgKGJmZF9tYWtlX3dyaXRhYmxlKTogTmV3IGZ1bmN0aW9uOyBsZXRzIHlvdSB3cml0ZSBhCi0gCWJmZF9jcmVhdGUnZCBiZmQgdG8gYW4gaW4tbWVtb3J5IGJ1ZmZlci4KLQkoYmZkX21ha2VfcmVhZGFibGUpOiBOZXcgZnVuY3Rpb247IGxldHMgeW91IHJlYWQgYmFjayB0aGF0IGJ1ZmZlcgotIAlhcyBpZiBpdCB3ZXJlIGZyb20gYmZkX29wZW5yLiAgVXNlZCB0byBidWlsZCBnZW5lcmF0ZWQgYXJjaGl2ZQotIAltZW1iZXJzICh3aW5zdXAncyBsZCdzIGRsbHRvb2wpCi0KLU1vbiBOb3YgMTYgMTk6MTU6MTkgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBwby9iZmQucG90OiBSZWdlbmVyYXRlZC4KLQotTW9uIE5vdiAxNiAxMDo1NzowNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKGhpMTZzX2xvY2F0aW9uKTogUmVwbGFjZWQgZml4ZWQgc2l6ZSBhcnJheSB3aXRoCi0JbGlua2VkIGxpc3QuCi0KLVN1biBOb3YgMTUgMjA6Mjg6MjUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IFNlYXJjaCBmb3IgdGhlIHByb3BlcgotCWVsZW1lbnQgb2YgdGhlIGdvdGVudHJ5IGxpc3QgZm9yIGxvY2FsIHN5bWJvbHMgdG9vLgotCShlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogVW5pZnkgbG9jYWwgYW5kIGdsb2JhbCBoYW5kbGluZy4KLQlBc3NlcnQgdGhhdCBnb3RlbnQtPnVzZV9jb3VudCA+IDAuCi0KLVNhdCBOb3YgMTQgMTU6MTY6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHZtc19hbHBoYV92ZWMpOiBSZW5hbWUgZnJvbSBldmF4X2FscGhhX3ZlYywgYW5kCi0JdXBkYXRlIGZvciBmaWxlIG5hbWUgY2hhbmdlcyBvZiBKdWx5IDIsIDE5OTguCi0JKHZtc192YXhfdmVjKTogTmV3LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgTm92IDEyIDE5OjE5OjU0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vYmZkLnBvdDogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBOb3YgMTAgMTY6MTc6MDYgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogYWNpbmNsdWRlLm00LCBjb25maWcuYmZkOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKi4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UdWUgTm92IDEwIDE1OjEzOjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3IgYmZkX2FyY2hfZnIzMC4KLQotVHVlIE5vdiAxMCAxMzozNzozNiAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNCAoQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFLAotIAlCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKTogZGlkbid0IGRlZmluZSBtYWNybyB3aGVuIHZhbHVlCi0gCXdhcyBjYWNoZWQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IHJlZ2VuZXJhdGVkLgotCi1UdWUgTm92IDEwIDE0OjMxOjAxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMTB2LmMgKHJlbG9jX3R5cGUpOiAgQWRkIFJfRDEwVl9HTlVfVlRJTkhFUklUIGFuZAotCVJfRDEwVl9HTlVfVlRFTlRSWSByZWxvY3MuCi0JKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogIExpa2V3aXNlLgotCShkMTB2X3JlbG9jX21hcCBkMTB2X3JlbG9jX21hcCk6ICBMaWtld2lzZS4KLQkoZWxmMzJfZDEwdl9nY19tYXJrX2hvb2spOiAgTmV3LgotCShlbGYzMl9kMTB2X2djX3N3ZWVwX2hvb2spOiAgTmV3LgotCShlbGYzMl9kMTB2X2NoZWNrX3JlbG9jcyk6ICBOZXcuCi0JKGVsZjMyX2QxMHZfcmVsb2NhdGVfc2VjdGlvbik6ICBOZXcuCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiAgRGVmaW5lLgotCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiAgRGVmaW5lLgotCi1TYXQgTm92ICA3IDE4OjA3OjUxIDE5OTggIFBldGVyIFNjaGF1ZXIgIDxwZXRlci5zY2hhdWVyQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+Ci0KLQkqIE1ha2VmaWxlLmFtIChCRkQzMl9CQUNLRU5EUyk6IE1vdmUgdm1zIGZpbGVzIGhlcmUuLi4KLQkoQkZENjRfQkFDS0VORFMpOiAuLi5mcm9tIGhlcmUuCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IE1vdmUgdm1zIGZpbGVzIGhlcmUuLi4KLQkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogLi4uZnJvbSBoZXJlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBOb3YgIDQgMTU6NTg6NDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBGUjMwIHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBBZGQgRlIzMCB0YXJnZXQuCi0JKiBhcmNodXJlcy5jOiBBZGQgc3VwcG9ydCBmb3IgRlIzMC4KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBGUjMwLgotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgRlIzMC4KLQkqIHJlbG9jLmM6IEFkZCBzdXBwb3J0IGZvciBGUjMwIHJlbG9jYXRpb25zLgotCSogdGFyZ2V0cy5jOiBBZGQgc3VwcG9ydCBmb3IgRlIzMCByZWxvY2F0aW9ucy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGxpYmJmZC5oOiAgUmVnZW5lcmF0ZS4KLQkqIGNwdS1mcjMwLmM6IE5ldyBmaWxlLgotCSogZWxmMzItZnIzMC5jOiBOZXcgZmlsZS4KLQotTW9uIE5vdiAgMiAxNDo1OTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGRldGVjdCBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqCi0JKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotU3VuIE5vdiAgMSAxOTozMjoyOCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IERvIG5vdCB1c2UgYWxsb2NhLAotCXVzZSBiZmRfbWFsbG9jIGFuZCBmcmVlIGluc3RlYWQgYW5kIGNoZWNrIHJldHVybiB2YWx1ZSBmcm9tIGJmZF9tYWxsb2MuCi0KLVN1biBOb3YgIDEgMTY6MjA6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZHluc3ltX3NlY19uYW1lcyk6IENvbW1lbnQgb3V0LgotCShTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVMpOiBMaWtld2lzZS4KLQkoTUlQU19URVhUX0RZTlNZTV9TRUNOKTogTGlrZXdpc2UuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IERvbid0IHNldCBzaF9pbmZvIGZpZWxkIG9mIGEgLmhhc2gKLQlzZWN0aW9uLgotCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKTogUmVtb3ZlIGR5bnN5bV9zZWNfc3RyaW5kZXgKLQlmaWVsZC4KLQkobWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERvbid0IGluaXRpYWxpemUKLQlkeW5zeW1fc2VjX3N0cmluZGV4LgotCShtaXBzX2VsZl9nY19tYXJrX2hvb2spOiBBZGQgZGVmYXVsdCBjYXNlIHRvIGF2b2lkIHdhcm5pbmcuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEdlbmVyYXRlIGEgc2VjdGlvbiBzeW1ib2wgZm9yCi0JZXZlcnkgb3V0cHV0IHNlY3Rpb24uCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogQ291bnQgYWxsIHNlY3Rpb25zIGZvcgotCURUX01JUFNfVU5SRUZFWFROTy4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgZHluYW1pYyBzeW1ib2xzIGZvciBhbGwKLQlvdXRwdXQgc2VjdGlvbnMuCi0KLVN1biBOb3YgIDEgMTI6NDY6NTMgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQWxsb2NhdGUgdHdvIHNsb3RzCi0JZm9yIGxhdGVyIFBMVCBlbnRyaWVzIGluIGxhcmdlIFBMVHMuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQWxsb3cgZm9yIHRoZSBleHRyYSBzbG90cy4KLQotU2F0IE9jdCAzMSAyMDoxMDowOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9hZF9zZWN0aW9uKTogRml4IHR5cG8uCi0KLTE5OTgtMTAtMjYgMTU6NTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIG5ldyBmaWVsZCBlbGZfaGFzaF92YWx1ZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2NvbGxlY3RfaGFzaF9jb2Rlcyk6IE5ldyBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMKLQljYWxsZWQgZm9yIGVhY2ggZXhwb3J0ZWQgc3ltYm9sIGFuZCB3ZSBjb21wdXRlIHRoZSBFTEYgaGFzaCB2YWx1ZSBmb3IKLQlpdC4KLQkoY29tcHV0ZV9idWNrZXRfdmFsdWUpOiBOZXcgZnVuY3Rpb24uICBJdCBpcyBjYWxsZWQgZnJvbQotCXNpemVfZHluYW1pY19zZWN0aW9ucyB0byBkZXRlcm1pbmUgdGhlIGhhc2ggdGFibGUgc2l6ZS4gIFdoZW4gd2UgYXJlCi0Jb3B0aW1pemluZyBhIGJldHRlciwgYnV0IHNsb3dlciwgYWxnb3JpdGhtIGlzIHVzZWQuCi0JKHNpemVfZHluYW1pY19zZWN0aW9ucyk6IENhbGwgY29tcHV0ZV9idWNrZXRfdmFsdWUuCi0KLQkqIGVsZi5jIChiZmRfZWxmX2hhc2gpOiBPcHRpbWl6ZSB0aGUgaGFzaCBmdW5jdGlvbiBhIGJpdC4KLQotTW9uIE9jdCAxOSAyMDowMzoyMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc2guYzogIEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX1NIX0dOVV9WVElOSEVSSVQgYW5kCi0JUl9TSF9HTlVfVlRFTlRSWS4KLQkoc2hfZWxmX2djX21hcmtfaG9vayk6ICBOZXcuCi0JKHNoX2VsZl9nY19zd2VlcF9ob29rKTogIE5ldy4KLQkoc2hfZWxmX2NoZWNrX3JlbG9jcyk6ICBOZXcuCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCi0KLU1vbiBPY3QgMTkgMTY6NTc6MDUgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IHVuZG8gcHJldmlvdXMgZ2V0dGV4dCBjaGFuZ2UKLQkqIGFjbG9jYWwubTQ6IHJlYnVpbGQgd2l0aCByaWdodCB2ZXJzaW9uIG9mIGFjbG9jYWwuCi0KLU1vbiBPY3QgMTkgMDE6NDc6MjEgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQsIGFjbG9jYWwubTQ6IG1vdmUgZ2V0dGV4dC1yZWxhdGVkIGZyYWdtZW50cyBmcm9tCi0gCWFjbG9jYWwubTQgdG8gYWNpbmNsdWRlLm00LCBzbyB0aGV5IGRvbid0IGdldCBsb3N0LgotCi0JKiBlbGZjb3JlLmg6IHJld3JpdGUgZm9yIGJldHRlciBjb3JlZmlsZSBzdXBwb3J0LgotCSogZWxmLmMgKGVsZmNvcmVfKik6IG5ldyBmdW5jdGlvbnMuCi0JKiBlbGYtYmZkLmggKGVsZl9vYmpfdGRhdGEpOiBuZXcgc3RydWN0dXJlIG1lbWJlcnMuCi0JKiBhY2NvbmZpZy5oLCBhY2luY2x1ZGUubTQsIGNvbmZpZ3VyZS5pbjogYWRkIGZlYXR1cmUtdGVzdHMgZm9yCi0gCWZsYXZvciBvZiBwcm9jZnMuCi0JKiBhY2xvY2FsLm00LCBjb25maWcuaW4sIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IHJlZ2VuZXJhdGVkLgotCi1GcmkgT2N0IDE2IDE0OjA3OjQ1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmM6ICBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9NMzJSX0dOVV9WVElOSEVSSVQKLQlhbmQgUl9NMzJSX0dOVV9WVEVOVFJZLgotCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiAgRGVmaW5lLgotCShtMzJyX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3LgotCShtMzJyX2VsZl9nY19tYXJrX2hvb2spOiAgTmV3LgotCShtMzJyX2VsZl9nY19zd2VlcF9ob29rKTogIE5ldy4KLQkobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6ICBIYW5kbGUgVlQgcmVsb2NzLgotCi1Nb24gT2N0IDEyIDE0OjE4OjQwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFybV9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHJlZHVuZGFudCB0ZXN0LgotCi0JKiBiZmQtaW4yLmggKHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiBJbXByb3ZlIGNvbW1lbnQgdG8gbWFrZQotCWNsZWF0IHRoYXQgdGhlICdiaXRzaXplJyBmaWVsZCBpcyB0aGUgc2l6ZSBvZiB0aGUgYml0ZmllbGQgQUZURVIKLQlyZWxvY2F0aW9uIG5vdCBiZWZvcmUuCi0KLQkqIGVsZjMyLW0zMnIuYyAoUl9NMzJSXzE4X1BDUkVMKTogRml4IHNpemUgb2YgYml0ZmllbGQuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX2hpKTogQ29wZSB3aXRoIG1pc3NpbmcgcmVmaGkgb3IgcmVmbG8KLQlyZWxvY3MuCi0KLVR1ZSBPY3QgIDYgMDk6MjA6NDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmM6ICBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9TUEFSQ19HTlVfVlRJTkhFUklUIGFuZAotCVJfU1BBUkNfR05VX1ZURU5UUlkuCi0JKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6ICBIYW5kbGUgdGhlbS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXApOiAgTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiAgTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX2djX21hcmtfaG9vayk6ICBOZXcuCi0JKGVsZjMyX3NwYXJjX2djX3N3ZWVwX2hvb2spOiAgTmV3LgotCi1Nb24gT2N0ICA1IDE0OjU1OjMwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9maW5pc2hfd3JpdGluZyk6IFBlcmZvcm0gc29tZSBzYW5pdHkgY2hlY2tzIHdoZW4KLQl3cml0aW5nIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkIGxpYnJhcnkuCi0KLU1vbiBPY3QgIDUgMTI6MDI6MzEgMTk5OCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMS5jIDogTmV3IGZpbGUuICBBZGRzIF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lLgotCSogY29uZmlndXJlLmluIChlbGYpOiBBZGQgZHdhcmYxLmxvLgotCSogZWxmX2JmZC5oIChlbGZfb2JfdGRhdGEpOiBBZGQgZHdhcmYxX2ZpbmRfbGluZV9pbmZvLgotCSogZWxmLmMgKF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogQWRkIGNhbGwgdG8KLQlfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZS4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6Ci0JQWRkIGNhbGwgdG8gX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLU1vbiBPY3QgIDUgMTA6MDY6MjIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2djX3NlY3Rpb25zKTogIERvIG5vdCBhbGxvdyBnYXJiYWdlCi0JY29sbGVjdGlvbiBpZiBkeW5hbWljIHNlY3Rpb25zIGhhdmUgYmVlbiBjcmVhdGVkLgotCi1Nb24gT2N0ICA1IDA5OjA3OjM3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmM6IEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX1Y4NTBfR05VX1ZUSU5IRVJJVCBhbmQKLQlSX1Y4NTBfR05VX1ZURU5UUlkuCi0JKHY4NTBfZWxmX2NoZWNrX3JlbG9jcyk6ICBIYW5kbGUgVlRJTkhFUklUIGFuZCBWVEVOVFJZIHJlbG9jcy4KLQkodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogIExpa2V3aXNlLgotCSh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogIExpa2V3aXNlLgotCSh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogIExpa2V3aXNlLgotCSh2ODUwX2VsZl9nY19zd2VlcF9ob29rKTogIE5ldyByb3V0aW5lLgotCSh2ODUwX2VsZl9nY19tYXJrX2hvb2spOiAgTmV3IHJvdXRpbmUuCi0JKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCi0KLU1vbiBPY3QgIDUgMDk6MDQ6MjUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfZ2Nfc3dlZXBfaG9vayk6ICBEb24ndCBhc3N1bWUKLQl0aGF0IGR5bm9iaiBleGlzdHMuCi0KLVN1biBPY3QgIDQgMjM6Mjk6MzQgMTk5OCAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+Ci0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKToKLQlEZWNsYXJlIHNpemUgYXMgYmZkX3NpemVfdHlwZS4KLQkocnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlY2xhcmUgY291bnQgYXMgYmZkX3NpemVfdHlwZS4KLQotU3VuIE9jdCAgNCAyMDozODoyOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNwdS1ocHBhLmMgKGJmZF9ocHBhMjBfYXJjaCk6IERlZmluZS4gIExpbmsgaXQgaW50byB0aGUgYmZkX2hwcGFfYXJjaAotCXN0cnVjdHVyZS4KLQkqIHNvbS5jIChDUFVfUEFfUklTQzJfMCk6IERlZmluZS4KLQkoX1BBX1JJU0MyXzBfSUQpOiBMaWtld2lzZS4KLQkoc29tX2ZpbmlzaF93cml0aW5nKTogVXNlIENQVV9QQV9SSVNDMl8wIGZvciB0aGUgc3lzdGVtX2lkIGFzIG5lZWRlZC4KLQotU3VuIE9jdCAgNCAyMToxOTowOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV2hlbiBhIHZlcnNpb25lZCBzeW1ib2wKLQloYXMgYSBiYXNlIHdoaWNoIGlzIGFscmVhZHkgZGVmaW5lZCwgb25seSBhZGQgdGhlIHJlZmVyZW5jZWQKLQlzeW1ib2wgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGlmIGl0IGlzIGRlZmluZWQgb3IgcmVmZXJlbmNlZAotCWJ5IGEgcmVndWxhciBmaWxlLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsKTogSGFuZGxlIHZ0YWJsZSByZWxvY3MKLQljb3JyZWN0bHkuCi0KLTE5OTgtMDktMjcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVuZG8gbGFzdCBjaGFuZ2UuCi0KLVdlZCBTZXAgMjMgMTY6MDk6MzEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCByZWNvcmQgYSBkeW5hbWljCi0Jc3ltYm9sIGZvciB0aGUgaW5kaXJlY3QgYWxpYXMgdG8gYSB2ZXJzaW9uZWQgc3ltYm9sLgotCi1Nb24gU2VwIDIxIDEyOjE1OjIyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvKTogTmV3LgotCShlbGYzMl9pMzg2X3Z0ZW50cnlfaG93dG8pOiBOZXcuCi0JKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogIFJldHVybiBlbGYzMl9pMzg2X3Z0ZW50cnlfaG93dG8KLQlvciBlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0byAgb24gbG9va3VwLgotCi1TdW4gU2VwIDIwIDAwOjQ4OjA3IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmM6IEluY2x1ZGUgImVsZi9tNjhrLmgiLiAgUmVtb3ZlIGRlZmluaXRpb24gb2YgZW51bQotCXJlbG9jX3R5cGUuICBSZW5hbWUgUl82OEtfX21heCB0byBSXzY4S19tYXguCi0JKGhvd3RvX3RhYmxlKTogVXNlIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4gZm9yIGEgVlRFTlRSWQotCXJlbG9jLgotCi1TdW4gU2VwIDIwIDAwOjA5OjI1IDE5OTggIENocmlzIFRvcmVrICA8dG9yZWtAYnNkaS5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0YjMyKTogUmV3cml0ZSBleHByZXNzaW9uIHRvIGdldCBiZXR0ZXIgY29kZS4KLQkoYmZkX2dldGwzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfZ2V0bF9zaWduZWRfMzIpOiBMaWtld2lzZS4KLQotCSogbGliYmZkLmMgKGJmZF9sb2cyKTogQ2FzdCB0byBiZmRfdm1hIGJlZm9yZSBzaGlmdGluZywgbm90Ci0JYWZ0ZXIuCi0KLVNhdCBTZXAgMTkgMjI6NDI6MjMgMTk5OCAgRG91ZyBSYWJzb24gIDxkZnJAbmxzeXN0ZW1zLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBFbnN1cmUgdGhhdCB0aGUgd2FybmluZwotCW1lc3NhZ2UgaGFzIGEgbnVsbCBieXRlIHRlcm1pbmF0b3IuCi0KLUZyaSBTZXAgMTggMTQ6MzU6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBJZ25vcmUgY29udGVudHMgb2YKLQl3b3JkIHN1YmplY3QgdG8gUl9WODUwXzMyIHJlbG9jYXRpb24uCi0KLVRodSBTZXAgMTcgMTc6MjA6MzYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmM6IEFkZCBjb21tZW50IGRlc2NyaWJpbmcgcHJvYmxlbSBjb21wdXRpbmcgbGluZSBudW1iZXJzCi0JZm9yIHVuZGVmaW5lZCBzeW1ib2xzIGF0IGxpbmsgdGltZS4KLQotVGh1IFNlcCAxNyAxNjowMzoyOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndAotCXRyYW5zZm9ybSBhIGRlZndlYWsgaW50byBhIHBsdCBlbnRyeS4KLQkoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBBbGxvdyByb29tIGZvciBzZWNvbmRhcnkKLQlwbHQgZW50cnkgcmVmZXJlbmNlcyB0byByZWNlaXZlIGEgUkVMQVRJVkUgcmVsb2MuCi0JKGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEZpbGwgdGhlbSBpbi4KLQkoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IEFzc2VydCB3ZSBkb24ndCBvdmVycnVuCi0JdGhlIGFsbG9jYXRlZCByZWxvY2F0aW9uIHNwYWNlLgotCi1XZWQgU2VwIDE2IDE4OjAzOjEzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChzd2FwX291dF9zeW1zKTogQWx3YXlzIHRyZWF0IHNlY3Rpb24gc3ltYm9scyBhcwotCXNwZWNpYWwsIGV2ZW4gaWYgdGhleSBhcmUgYXR0YWNoZWQgdG8gYSBjb21tb24gc2VjdGlvbi4KLQotV2VkIFNlcCAxNiAxMDozNDoxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogTW92ZSBzeW1ib2xzIGluCi0Jc2VjdGlvbnMgd2l0aCB2ODUwIGNvbW1vbiBzZWN0aW9uIGF0dHJpYnV0ZXMgaW50byBuYW1lZCB2ODUwCi0JY29tbW9uIHNlY3Rpb25zLgotCSh2ODUwX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBNb3ZlIHN5bWJvbHMgaW4gc2VjdGlvbnMgd2l0aCB2ODUwCi0JY29tbW9uIHNlY3Rpb24gYXR0cmlidXRlcyBpbnRvIG5hbWVkIHY4NTAgY29tbW9uIHNlY3Rpb25zLgotCi1XZWQgU2VwIDE2IDExOjI2OjQ5IENEVCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmMgKGVsZjMyX2FybV9nY19tYXJrX2hvb2spOiAgUmVtb3ZlIHByaW50Ci0Jc3RhdGVtZW50LgotCi0xOTk4LTA5LTE1ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmV2ZXJzZSBvdXRwdXRfb2Zmc2V0Ci0JcGFydCBvZiBWbGFkaW1pcidzIGNoYW5nZSBvZiAxOTk4LTA4LTE5LiAgTWFrZSBhIFJfUFBDX1NEQVJFTDE2Ci0JcmVsb2MgdG8gdGhlIHdyb25nIHNlY3Rpb24gYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IuICAuZHluc2JzcwotCWlzIG5vdCBhbiBvdXRwdXQgc2VjdGlvbiwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBmb3IgaXQuCi0KLVR1ZSBTZXAgMTUgMTI6NDA6MDUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGVsZi1iZmQuaDogIEFkZCBhcmd1bWVudCB0byBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCi0KLVR1ZSBTZXAgMTUgMDg6MzQ6NDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGVsZi5jIChzd2FwX291dF9zeW1zKTogIFBhc3MgdHlwZSB0byBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCi0gICAgICAgKiBlbGYzMi1hcm0uYzogIEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX0FSTV9HTlVfVlRJTkhFUklUIGFuZAotICAgICAgIFJfQVJNX0dOVV9WVEVOVFJZLgotICAgICAgIChlbGYzMl9hcm1fZ2NfbWFya19ob29rKTogTmV3LgotICAgICAgIChlbGYzMl9hcm1fZ2Nfc3dlZXBfaG9vayk6IE5ldy4KLSAgICAgICAoZWxmMzJfYXJtX2NoZWNrX3JlbG9jcyk6IE5ldy4KLSAgICAgICAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgSGFuZGxlIFZUSU5IRVJJVCBhbmQgVlRFTlRSWQotICAgICAgIHJlbG9jYXRpb25zLgotICAgICAgIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBWVElOSEVSSVQgYW5kIFZURU5UUlkKLSAgICAgICByZWxvY2F0aW9ucy4KLQotMTk5OC0wOS0xMCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IElmIGR5bm9iaiBpcyBOVUxMLAotCWFzc3VtZSB0aGVyZSBpcyBubyBQTFQgb3IgR09ULgotCi1XZWQgU2VwICA5IDE0OjI0OjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jIChlbGYzMl9hcm1fZmluZF9uZWFyZXN0X2xpbmUpOiBOZXcgZnVuY3Rpb246ICBqdXN0Ci0JbGlrZSBfZWxmX2JmZF9maW5kX25lYXJlc3RfbGluZSgpIGV4Y2VwdCB0aGF0IFNUVF9BUk1fVEZVTkMgaXMKLQlhbHNvIGFjY2VwdGVkIGFzIGEgZnVuY3Rpb24gc3ltYm9sIHR5cGUuCi0KLU1vbiBTZXAgIDcgMTM6MjQ6MDMgMTk5OCAgUGV0ZXIgU2NoYXVlciAgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgotCi0JKiByczYwMDAtY29yZS5jIChfTE9OR19MT05HKTogIERlZmluZSBmb3IgQUlYIDQueCBvbmx5LgotCi1TYXQgU2VwICA1IDIwOjQwOjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLWluLmggKF9iZmRfbm9saW5rX2JmZF9nY19zZWN0aW9ucyk6IENvcnJlY3QgZGVmaW5pdGlvbiB0bwotCW1hdGNoIGRlZmluaXRpb24gb2YgX2JmZF9nY19zZWN0aW9ucyBmaWVsZC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1GcmkgU2VwICA0IDEzOjU0OjIzIDE5OTggIERhdmlkIE1pbGxlciAgPGRhdmVtQGRtLmNvYmFsdG1pY3JvLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFByb3Blcmx5IGFkanVzdAotCXRoZSBhZGRlbmQgb2YgYSBkeW5hbWljIHJlbG9jYXRpb24gcmVmZXJlbmNpbmcgYSBzZWN0aW9uLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBGaXggdGhlIFBMVCByZWxvY2F0aW9uIG9mZnNldC4KLQotVGh1IFNlcCAgMyAxNzoyODo1MCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGJmZF9lbGZOTl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBWZXJpZnkgdGhhdCB0aGUKLQliZWQgaGFzIGEgc2l6ZV9keW5hbWljX3NlY3Rpb25zIHJvdXRpbmUgYmVmb3JlIHRyeWluZyB0byB1c2UgaXQuCi0KLU1vbiBBdWcgMzEgMTQ6NDk6MjIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0byk6IFVzZQotCV9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4uCi0KLU1vbiBBdWcgMzEgMTA6MjM6NDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiAgQWRkIGVsZjMyLWFybS5jLgotCSogTWFrZWZpbGUuaW46ICBSZWJ1aWxkLgotCSogZWxmLWJmZC5oOiAgQWRkIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZS4KLQkqIGVsZi5jIChzd2FwX291dF9zeW1zKTogIElmIGRlZmluZWQsIGNhbGwKLQllbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCi0JKiBlbGYzMi1hcm0uYzogRGVmaW5lIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZS4KLQkoZWxmMzJfYXJtX2dldF9zeW1ib2wtdHlwZSk6ICBOZXcgcm91dGluZS4KLQkocmVjb3JkX3RodW1iX3RvX2FybV9nbHVlKTogIENoYW5nZSB0byB1c2UgU1RUX0FSTV9URlVOQy4KLQkoYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogIENoYW5nZSB0bwotCWNoZWNrIGZvciBTVFRfQVJNX1RGVU5DLgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6ICBMaWtld2lzZS4KLQkqIGVsZnh4LXRhcmdldC5oOiAgQWRkIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZS4KLQotRnJpIEF1ZyAyOCAxOTo0NDowNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9hbHBoYV9ldls0NTZdKTogTmV3LgotCSogY3B1LWFscGhhLmM6IFJld29yayB0byBtYXRjaCB0aGVzZSB0eXBlcy4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotRnJpIEF1ZyAyOCAxOTozODo1MyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4pOiBEZWNsYXJlLgotCSogZWxmLmMgKF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4pOiBOZXcuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQWRkIHZ0YWJsZSByZWxvY3MuCi0JKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogUmVjb2duaXplIHRoZW0uCi0JKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IFBhc3MgdGhlbSBvZmYgdG8gZ2VuZXJpYyBjb2RlLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogSWdub3JlIHRoZW0uCi0JKGVsZl9pMzg2X2djX21hcmtfaG9vaywgZWxmX2kzODZfZ2Nfc3dlZXBfaG9vayk6IE5ldy4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogVHJ1ZS4KLQotVGh1IEF1ZyAyMCAxNTowMzo0NSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uYyAoZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIpOiBDaGVjayBzeW1fc2VjIGlzIG5vdCBOVUxMCi0JYmVmb3JlIGxvb2tpbmcgYXQgb3duZXIgZmllbGQuCi0JKGVsZjMyX2FybV90b190aHVtYl9zdHViKTogRGl0dG8uCi0JKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogQ29tcHV0ZSBuYW1lIGJlZm9yZSBjYWxsaW5nCi0JZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUoKS4KLQotVGh1IEF1ZyAyMCAxMTozMDoxNyAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBlbGYuYzogY29tbWVudCBhbmQgZm9ybWF0dGluZyBjbGVhbnVwcy4KLQkqIGVsZmNvcmUuaDogZGl0dG8uCi0KLVdlZCBBdWcgMTkgMTU6NDM6MjYgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBSZWplY3QgZmlsZXMgb2YgaGVhZGVyIHR5cGUgRVRfQ09SRQotCShjb3JlIGZpbGVzIGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5IHRoYW4gb2JqZWN0IGZpbGVzKS4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfd3JpdGVfY29yZWZpbGVfY29udGVudHMsCi0JYmZkX2VsZl9ta2NvcmVmaWxlKTogZGVjbGFyZS4KLQkqIGVsZnh4LXRhcmdldC5oIChfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKLQliZmRfZWxmX21rY29yZWZpbGUpOiBhZGQgdG8gYmZkX3RhcmdldCB2ZWN0b3IuCi0JKiBlbGZjb3JlLmggKGVsZl9jb3JlX2ZpbGVfcCk6IHNhdmUgdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlLAotCWFuZCBzZXQgdGhlIGJmZCBhcmNoaXRlY3R1cmUgZnJvbSB0aGUgZWxmIGZpbGUgaGVhZGVyLgotCSogZWxmLmMgKGJmZF9lbGZfbWtjb3JlZmlsZSk6IG5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfd3JpdGVfY29yZWZpbGVfY29udGVudHMpOiBuZXcgZnVuY3Rpb24uCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBhZGQgY2FzZXMgZm9yIGhhbmRsaW5nCi0JUFRfTk9URSBzZWdtZW50cy4gIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6Ci0JY29yZSBmaWxlcyBzaG91bGQgYmUgaGFuZGxlZCB0aGUgc2FtZSBhcyBleGVjIGZpbGVzLgotCShwcmVwX2hlYWRlcnMpOiBpZGVudGlmeSBjb3JlIGZpbGVzIGFzIHR5cGUgRVRfQ09SRS4KLQkoY29weV9wcml2YXRlX2JmZF9kYXRhKTogaWRlbnRpZnkgdGhlIHNlY3Rpb25zIGJlbG9uZ2luZyB0bwotCXRoZSBQVF9OT1RFIHNlZ21lbnQuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOgotCWFkZCBicmVhayBzdGF0ZW1lbnQgdG8gZGVmYXVsdCBjYXNlLgotCi0xOTk4LTA4LTE5ICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIHRoYXQgb3V0cHV0Ci0Jc2VjdGlvbiAobm90IGlucHV0KSB3aWxsIGJlIGluIHNlY3Rpb25zICIuc2JzcyIsICIuc2JzczIiLAotCSIuc2RhdGEiLCBhbmQgIi5zZGF0YSIgZm9yIFJfUFBDX1NEQVJFTDE2LCBSX1BQQ19FTUJfU0RBMlJFTCwKLQlSX1BQQ19FTUJfU0RBMjEsIFJfUFBDX0VNQl9SRUxTREEuICBJbiBhbGwgdGhlc2UgY2FzZXMgYWxzbyBpZ25vcmUKLQlvdXRwdXRfb2Zmc2V0IGZvciBjb3JyZWN0IGV2YWx1YXRpb24gb2YgYWRkZW5kLgotCi1UdWUgQXVnIDE4IDExOjQ4OjEyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uYzogQWRkIHByZWZpeCBiZmRfIHRvIGVsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCi0JZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBhbmQKLQllbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbi4KLQotVHVlIEF1ZyAxOCAxMTo0NjowMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaDogQW1tZW5kIHByb3RvdHlwZSBmb3IKLQllbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiB0byByZW1vdmUgc3VycGx1cyB0aGlyZAotCWFyZ3VtZW50LgotCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLVNhdCBBdWcgMTUgMjA6NTU6MDggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IEhhbmRsZSBpbmRpcmVjdCBzeW1ib2xzLgotCi1GcmkgQXVnIDE0IDA5OjEyOjI4IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBVc2UgdGhlIHJlbG9jYXRpb24gYWxyZWFkeQotCWNhbGN1bGF0ZWQgZm9yIFJFTE9DX1NQQVJDX1JFVjMyIGNhc2UuCi0KLVRodSBBdWcgMTMgMTQ6MDI6MDIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGJmZC1pbi5oOiAgQWRkIHByb3RvdHlwZXMgZm9yIGVsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCi0gICAgICAgZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBhbmQKLSAgICAgICBlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbi4KLSAgICAgICAqIGJmZC1pbjIuaDogIFJlZ2VuZXJhdGVkLgotICAgICAgICogZWxmMzItYXJtLmMgRGVmaW5lIGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUuCi0gICAgICAgKGluc2VydF90aHVtYl9icmFuY2gpOiBOZXcgcm91dGluZS4KLSAgICAgICAoZmluZF90aHVtYl9nbHVlKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGZpbmRfYXJtX2dsdWUpOiBOZXcgcm91dGluZS4KLSAgICAgICAocmVjb3JkX2FybV90b190aHVtYl9nbHVlKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSk6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpIE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbikgTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX3RodW1iX3RvX2FybV9zdHViKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX2FybV90b190aHVtYl9zdHViKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBGaXggdHlwby4KLSAgICAgICAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgQWRkIGFyZ3VtZW50IHN5bV9zZWMuCi0gICAgICAgQ2hlY2sgZm9yIGJyYW5jaGVzIHRvIHRodW1iIHN5bWJvbHMgaW4gY2FzZSBSX0FSTV9QQzI0LgotICAgICAgIENoZWNrIGZvciBicmFuY2hlcyB0byBhcm0gc3ltYm9scyBpbiBjYXNlIFJfQVJNX1RITV9QQzIyLgotICAgICAgIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6ICBQYXNzIHN5bWJvbCBzZWN0aW9uIHRvCi0gICAgICAgZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUuCi0KLVdlZCBBdWcgMTIgMTk6MDA6MzkgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogR2VuZXJhdGUgUExUCi0JZW50cmllcyB1bmxlc3MgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBleGVjdXRhYmxlOyBpbgotCXBhcnRpY3VsYXIsIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbHMgZ2V0IGEgUExUIGVudHJ5LgotCi1XZWQgQXVnIDEyIDE0OjQ4OjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oOiBSZW1vdmUgbmVzdGVkIGNvbW1lbnQgdG8gYXZvaWQgd2FybmluZy4KLQotV2VkIEF1ZyAxMiAwODoxMDoxMSAxOTk4IENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUmV3b3JrCi0gICAgICAgUl9BUk1fUEMyNCByZWxvY2F0aW9uLgotCi1UdWUgQXVnIDExIDE0OjQyOjI2IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUmVtb3ZlIHVudXNlZAotICAgICAgIGFyZ3VtZW50IGlzX2xvY2FsLiAgQWRkIGFyZ3VtZW50IHN5bV9mbGFncy4gIENoZWNrIHN5bV9mbGFncwotICAgICAgIGluIFJfQVJNX0FCUzMyIGNhc2UuICBJbmNsdWRlIGFkZGVuZCBmb3IgUl9BUk1fVEhNX1BDMjIgY2FzZS4KLSAgICAgICAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgRG9uJ3QgcGFzcyBsb2NhbCBzeW0gYW5kIHBhc3MKLSAgICAgICBzeW1fZmxhZ3MgdG8gZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUuCi0KLU1vbiBBdWcgMTAgMjA6Mzg6MzkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBDb3JyZWN0IGxhc3QgY2hhbmdlCi0JdG8gbm90IGNvdW50IHRvbyBmZXcgcmVsb2NzIGZvciBkeW5hbWljbHkgbGlua2VkIGV4ZWN1dGFibGVzLgotCi1Nb24gQXVnIDEwIDE1OjM1OjM0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogTmV2ZXIgY29uc2lkZXIKLQlzeW1ib2xzIHdpdGhvdXQgYSBkeW5hbWljIGluZGV4IGR5bmFtaWMuICBDb25zaWRlciBhbGwgd2VhawotCXN5bWJvbHMgZHluYW1pYy4KLQkoZWxmNjRfYWxwaGFfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IERvbid0IGFzc3VtZSAxLTEKLQljb3JyZXNwb25kYW5jZSBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgc2VjdGlvbnMuCi0KLU1vbiBBdWcgMTAgMTU6MzE6MzkgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IEZvciBiYWNrZW5kcwotCXRoYXQgdXNlIGEgLmdvdC5wbHQgc2VjdGlvbiBzdGFydCB0aGUgZ290IG9mZnNldCBhdCB6ZXJvLgotCi1Nb24gQXVnIDEwIDE3OjMxOjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX3Byb2Nlc3Nvcik6IENvcnJlY3QgdGhlIHByb2Nlc3NvciBJRCB3cml0dGVuCi0Jb3V0IGZvciBiZmRfYXJjaF9tNjhrLCBhY2NvbW1vZGF0aW5nIGNoYW5nZSBvZiBNYXJjaCAyNS4KLQotU3VuIEF1ZyAgOSAyMDo1NTo0NCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmMgKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogIFJld29yawotCVJfQVJNX1RITV9SUEMyMiByZWxvY2F0aW9ucy4KLQotU2F0IEF1ZyAgOCAxNToxNTozMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCk6IFVuZGVmIHdlYWsgc3ltYm9scwotCWFyZSBhbHdheXMgZHluYW1pYy4KLQkoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBBbGxvdyBlbm91Z2ggcm9vbSBmb3IgUkVMQVRJVkUKLQkuZ290IHJlbG9jcyBpbiAtQnN5bWJvbGljIHNoYXJlZCBvYmplY3RzLgotCi1XZWQgQXVnICA1IDE1OjQ4OjA4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jOiBBZGQgcHJpdmF0ZSBmbGFncyB0byBFTEYgaGVhZGVyLgotCShlbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBGdW5jdGlvbi4KLQkoZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzKTogTmV3IEZ1bmN0aW9uLgotCShlbGYzMl9hcm1fY29weV9wcml2YXRlX2ZsYWdzKTogTmV3IEZ1bmN0aW9uLgotCShlbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBGdW5jdGlvbi4KLQotTW9uIEF1ZyAgMyAxNzoxMDoxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IFBlcm1pdCBXUExUMzAgYWdhaW5zdAotCWEgbG9jYWwgc3ltYm9sLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVN1biBBdWcgIDIgMDM6MTk6MjMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogSW5pdCBzZ290IHRvIE5VTEwuICBDcmVhdGUgdGhlCi0JLmdvdCBpZiBhbnkgcmVsb2NhdGlvbiByZWZlcnJzIHRvIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUHVsbCBzZ290IGFuZCBzcGx0IHNlYXJjaCB0byB0aGUgc3RhcnQKLQlvZiB0aGUgZnVuY3Rpb24uICBSZWNvZ25pemUgbm8gLnBsdCBhcyBzdGF0aWMgbGlua2luZy4KLQotMTk5OC0wOC0wMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IERvbid0IHBhc3MKLQkiLmxpYmxpc3QiIHN0cmluZyB0aHJvdWdoIGdldHRleHQuCi0KLUZyaSBKdWwgMzEgMTY6Mzg6MTQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgZWxmMzItYXJtLmxvLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBjb25maWcuYmZkIChhcm0tKi1lbGYpOiAgRGVmaW5lIHRhcmdfZGVmdmVjIGFuZCB0YXJnX3NlbHZlY3MuCi0JKHRodW1iLSotZWxmKTogRGVmaW5lIHRhcmdfZGVmdmVjIGFuZCB0YXJnX3NlbHZlY3MuCi0JKiBjb25maWd1cmUuaW46ICBIYW5kbGUgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMgYW5kIGJmZF9lbGYzMl9iaWdhcm1fdmVjLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogZWxmLmM6IChwcmVwX2hlYWRlcnMpOiAgU3VwcG9ydCBhcmNoX3R5cGUgb2YgRU1fQVJNLgotCSogdGFyZ2V0cy5jOiAgU3VwcG9ydCBuZXcgdGFyZ2V0cyBiZmRfZWxmMzJfYmlnYXJtX3ZlYyBhbmQKLQliZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjLgotCSogZWxmMzItYXJtLmM6ICBOZXcgZmlsZS4KLQotVHVlIEp1biAyOCAxOTowNToyOCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oIChNX1NQQVJDTElURV9MRSk6IE5ldyBtYWNoaW5lLgotCSogc3Vub3MuYyAoTUFDSFRZUEVfT0spOiBBZGQgbWFjaGluZSBNX1NQQVJDTElURV9MRS4KLQkqIGFvdXRmMS5oIChzdW5vc19zZXRfYXJjaF9tYWNoKTogQWRkIG1hY2hpbmUgTV9TUEFSQ0xJVEVfTEUuCi0JKHN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEFkZCBtYWNoaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQotCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogQWRkIHJlbG9jYXRpb24gUl9TUEFSQ19SRVYzMi4KLQkoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpIEFkZCBtYWNoaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBBZGQgUkVMT0NfU1BBUkNfUkVWMzIgc3VwcG9ydC4KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlLCBzcGFyY19yZWxvY19tYXAsCi0JZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbmFtZSBSX1NQQVJDXzMyTEUgdG8gYmUgUl9TUEFSQ19SRVYzMgotCSogbGliYmZkLmggKGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXMpOiBSZW5hbWUgQkZEX1JFTE9DX1NQQVJDXzMyTEUgdG8KLQliZSBCRkRfUkVMT0NfU1BBUkNfUkVWMzIuCi0JKiByZWxvYy5jOiBEaXR0by4KLQkqIGNvbmZpZy5iZmQgKHNwYXJjODZ4LSotYW91dCk6IE5ldwotCi1GcmkgSnVsIDI0IDEzOjU0OjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEFsbG9jYXRlIE5VTEwgc3ltYm9sIGJlZm9yZQotCWFjdHVhbGx5IG1hcHBpbmcgdGhlIG91dHB1dCBzZWN0aW9ucy4KLQotRnJpIEp1bCAyNCAxMToyNDoyOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQotCSogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9ob3d0byk6IEFkZCBSX01OMTAzMDBfMjQgZW50cnkuCi0JKG1uMTAzMDBfZWxmX3JlbG9jX21hcCk6IFNpbWlsYXJseS4KLQkobW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBSX01OMTAzMDBfMjQuCi0KLUZyaSBKdWwgMjQgMTI6MzY6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIHJlbG9jIHR5cGVzIHVzZWQgb24KLQlJcml4IDYuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgZGVmYXVsdCBjYXNlLgotCSogZWxmNjQtbWlwcy5jOiBSZXBsYWNlIGFsbCB1c2VzIG9mIG1pcHNfZWxmNjRfcmVsb2NfdHlwZSB3aXRoCi0JZWxmX21pcHNfcmVsb2NfdHlwZSBkZWZpbmVkIGluIGVsZi9taXBzLmguCi0KLTE5OTgtMDctMjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmM6IFJlbW92ZSByZWxvY190eXBlIGRlZmluaXRpb24gY29tcGxldGVseS4gIEl0J3Mgbm93Ci0JaW4gZWxmL21pcHMuaC4KLQotVGh1IEp1bCAyMyAxMzozMzoxOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfcmVsb2NfdHlwZSk6ICNpZiAwIG91dCBtb3JlIHJlbG9jYXRpb25zCi0JYXMgdGhleSBhcmUgZGVmaW5lZCBpbiBlbGYvbWlwcy5oIG5vdy4KLQotVGh1IEp1bCAyMyAxMToyOTo0MyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQotCSogUmUtYWRkIGxvc3QgY2hhbmdlOgotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBuZXcgZmllbGQKLQkibW92bV9zdGFja19zaXplIi4KLQkobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEluY2x1ZGUgc3RhY2sgc3BhY2UgZm9yIHJlZ2lzdGVyIHNhdmVzCi0JaW4gdGhlIGltbTggZmllbGQgb2YgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uCi0JKGNvbXB1dGVfZnVuY3Rpb25faW5mbyk6IERldGVybWluZSBob3cgbXVjaCBzdGFjayBpcyBhbGxvY2F0ZWQgYnkKLQl0aGUgbW92bSBpbnN0cnVjdGlvbi4gIEZpeCB0eXBvLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBtb3ZtX3N0YWNrX3NpemUuCi0KLVRodSBKdWwgMjMgMTE6Mzg6MDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUpOiBEZWZpbmUgYXMgNC4KLQkqIGVsZjY0LXNwYXJjLmMgKGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSk6IERlZmluZSBhcyA4LgotCi0xOTk4LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmM6IENoYW5nZSB1c2Ugb2YgcHBfcmVsb2NfdHlwZSB0byBlbGZfcHBjX3JlbG9jX3R5cGUuCi0KLVdlZCBKdWwgMjIgMTY6Mjc6MTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaHBwYS5oOiBMZXQgRUxGIGhlYWRlciBkZWZpbmUgdGhlIGVudW0gY29udGFpbmluZyB0aGUKLQlleHRlcm5hbCByZWxvYyBudW1iZXJzLgotCSogZWxmMzItaTM4Ni5oOiBMaWtld2lzZS4KLQotMTk5OC0wNy0yMiAxNDo1NyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1tMTAzMDAuYzogTGV0IEVMRiBoZWFkZXIgbm93IGRlZmluZSB0aGUgbWFjcm9zIHRvIGdldCB0aGUgZW51bS4KLQkqIGVsZjMyLW1pcHMuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYzogTGlrZXdpc2UuCi0KLVdlZCBKdWwgMjIgMTM6NTM6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmZkLWluMi5oOiBDaGFuZ2UgdHlwZSBvZiAnY2xhc3MnIHBhcmFtZXRlciB0byAndW5zaWduZWQgaW50JyBpbgotCWJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MoKSwgaW4gb3JkZXIgdG8gYXZvaWQgSyZSIGNvbXBhdGFiaWxpdHkKLQlwcmJsZW1zLgotCSogYmZkLWluLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmZ2VuLmMgKGJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MpOiBDaGFuZ2UgdHlwZSBvZiAnY2xhc3MnCi0JcGFyYW1ldGVyIHRvICd1bnNpZ25lZCBpbnQnIHRvIGF2b2lkIEsmUiBjb21wYXRhYmlsaXR5IHByb2JsZW1zLgotCi1XZWQgSnVsIDIyIDE2OjQzOjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2hhbmdlIGZpbGVuYW1lX3B0ciBhbmQKLQlmdW5jdGlvbm5hbWVfcHRyIHRvIGJlIGNvbnN0LiAgQ2hhbmdlIGxpbmVfcHRyIHRvIGJlIHVuc2lnbmVkLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bik6IFNpbXBsaWZ5IGhhbmRsaW5nIHdoZW4KLQltYWNybyBpcyBub3QgZGVmaW5lZC4gIENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIGZyb20gYmZkX2xpbmtfaW5mbwotCXRvIGNvZmZfZmluYWxfbGlua19pbmZvLiAgQWRkIHByb3RvdHlwZS4KLQkoY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpOiBTaW1wbGlmeSBoYW5kbGluZyB3aGVuIG1hY3JvIGlzIG5vdAotCWRlZmluZWQuICBBZGQgcHJvdG90eXBlLgotCi0xOTk4LTA3LTIyIDEzOjA4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmLW1uMTAzMDAuYzogQmVmb3JlIGluY2x1ZGUgc3lzdGVtIHNwZWNpZmljIEVMRiBoZWFkZXIgZGVmaW5lCi0JU1RBUlRfUkVMT0NfTlVNQkVSUywgUkVMT0NfTlVNQkVSLCBhbmQgRU5EX1JFTE9DX05VTUJFUlMuCi0JKiBlbGYzMi1taXBzLmM6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmM6IExpa2V3aXNlLgotCi1XZWQgSnVsIDIyIDEzOjQ2OjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X3JlbG9jX3R5cGUpOiBDb3B5IFVscmljaCdzIGVsZjMyLW1pcHMuYwotCXRlbXBvcmFyeSBwYXRjaCBvdmVyIHRvIGVsZjY0LW1pcHMuYyBhcyB3ZWxsLgotCi0xOTk4LTA3LTIxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChyZWxvY190eXBlKTogVGVtcG9yYXJpbHkgZGlzYWJsZSBkZWZpbml0aW9uIG9mCi0Jc3RhbmRhcmQgcmVsb2NhdGlvbiBzaW5jZSB0aGV5IGFyZSBub3cgZGVmaW5lZCBpbiBlbGYvbWlwcy5oLgotCi1UdWUgSnVsIDIxIDA5OjQ3OjAwIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBlbGYtbTEwMjAwLmMgKG1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOgotCU1vZGlmeSByYW5nZSB0ZXN0IGZvciBjYXNlIFJfTU4xMDIwMF84LgotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOgotCU1vZGlmeSByYW5nZSB0ZXN0IGZvciBjYXNlIFJfTU4xMDMwMF84LgotCi1Nb24gSnVsIDIwIDE4OjUwOjU0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgZ290XyAmIHBsdF9oZWFkZXJfc2l6ZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUpOiBEZWZpbmUuCi0JKiBlbGYzMi1tNjhrLmMsIGVsZjMyLW1pcHMuYywgZWxmMzItcHBjLmM6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYywgZWxmNjQtYWxwaGEuYywgZWxmNjQtc3BhcmMuYzogTGlrZXdpc2UuCi0JKiBlbGZ4eC10YXJnZXQuaDogUHJvdmlkZSBhIGRlZmF1bHQgb2YgemVyby4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogVXNlIGdvdF9oZWFkZXJfc2l6ZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCByZW1vdmUgYSBQTFQKLQllbnRyeSBmcm9tIGFuIGV4ZWN1dGFibGUsIGV2ZW4gaWYgdGhlIHBsdCByZWZjb3VudCBnb2VzIHRvIDAuCi0KLU1vbiBKdWwgMjAgMTI6NDc6MjYgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBBbHNvIHJlbWVtYmVyIHRoZQotCWRpcmVjdG9yeSBuYW1lIGF0IHRoZSBsaW5lIG51bWJlci4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogQWxzbyBjb25zaWRlciBzeW1ib2xzCi0Jd2l0aCBhbiB1bnNwZWNpZmllZCB0eXBlLgotCi1XZWQgSnVsIDE1IDExOjIwOjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYzogQWRkIHVuZGVmIG9mIHZhbGlkIHRvIGF2b2lkIHByb2JsZW0gb24gU3VuT1MuCi0KLVR1ZSBKdWwgMTQgMTU6MzA6NTkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaT84Ni1wYy1iZW9ze3BlLGVsZix9Kik6IFJlY29nbml6ZS4KLQotVHVlIEp1bCAxNCAxMToyMjoyMSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19jaGVja19yZWxvY3MpOiBBbHNvIHJlZmVyZW5jZSBjb3VudAotCVJfNjhLX1BDeHggYW5kIFJfNjhLX3h4IHJlbG9jYXRpb25zLiAgTWFrZSBzdXJlIHRoYXQKLQlFTEZfTElOS19IQVNIX05FRURTX1BMVCBpcyBhbHdheXMgc2V0IGZvciBhIFBMVCByZWxvYyByZWZlcmVuY2UuCi0JKGVsZl9tNjhrX2djX3N3ZWVwX2hvb2spOiBBbHNvIHJlZmVyZW5jZSBjb3VudCBSXzY4S19QQ3h4IGFuZAotCVJfNjhLX3h4IHJlbG9jYXRpb25zLgotCShlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXNldCB0aGUgcGx0IG9mZnNldCBvZiBhIHN5bWJvbAotCXRoYXQgaGFzIG5vIHBsdCBlbnRyeS4KLQkoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IElnbm9yZSB0aGUgcGx0IG9mZnNldCBpbiBhIHN0YXRpYwotCWxpbmsuCi0JKiBlbGZsaW5rLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXNldCB0aGUgcGx0IG9mZnNldCBmb3IKLQlhbiBpZ25vcmVkIHN5bWJvbC4KLQkoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IFNldCB0aGUgZ290IG9mZnNldHMgYWxzbyBpbgotCWEgc3RhdGljIGxpbmsuCi0KLQkqIGVsZjMyLW02OGsuYyAoUl82OEtfR05VX1ZUSU5IRVJJVCwgUl82OEtfR05VX1ZURU5UUlkpOiBOZXcgcmVsb2MKLQl0eXBlcy4KLQkoaG93dG9fdGFibGUsIHJlbG9jX21hcCk6IEFkZCBlbnRyaWVzIGZvciB0aGVtLgotCShlbGZfbTY4a19jaGVja19yZWxvY3MpOiBIYW5kbGUgdGhlbS4gIEltcGxlbWVudCByZWZlcmVuY2UKLQljb3VudGluZyBmb3IgZ290IGFuZCBwbHQgZW50cmllcy4KLQkoZWxmX202OGtfZ2NfbWFya19ob29rLCBlbGZfbTY4a19nY19zd2VlcF9ob29rKTogTmV3IGZ1bmN0aW9ucy4KLQkoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSGFuZGxlIHVucmVmZXJlbmNlZCBwbHQKLQlzeW1ib2xzLgotCShydHlwZV90b19ob3d0b19yZWwsIGVsZl9pbmZvX3RvX2hvd3RvX3JlbCk6IERlbGV0ZS4KLQkoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSB0aGUgbmV3IHJlbG9jIHR5cGVzLgotCShiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmssIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vaywKLQllbGZfYmFja2VuZF9nY19zd2VlcF9ob29rLCBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiBEZWZpbmUuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFdoZW4gY3JlYXRpbmcgYW4KLQlpbmRpcmVjdCByZWZlcmVuY2UgZm9yIHN5bWJvbCB2ZXJzaW9uaW5nIGFsc28gY29weSB0aGUgcGx0Ci0Jb2Zmc2V0LgotCShlbGZfZml4X3N5bWJvbF9mbGFncyk6IFdoZW4gY2xlYXJpbmcgdGhlIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUCi0JZmxhZyBhbHNvIHJlc2V0IHRoZSBwbHQgb2Zmc2V0LgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBMaWtld2lzZS4KLQkoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IEluY3JlbWVudCB0aGUgZ290IG9mZnNldCBieQotCXRoZSBzaXplIG9mIHRoZSBlbnRyeSBpbiBieXRlcy4KLQkoZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzKTogTGlrZXdpc2UuCi0KLVR1ZSBKdWwgMTQgMTE6MTg6MTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9nY19zZWN0aW9ucyk6IFJldHVybiB0cnVlIHJhdGhlciB0aGFuIGZhbGxpbmcgb2ZmCi0JdGhlIGJvdHRvbS4KLQotCSogY29mZmdlbi5jIChiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKTogQ2FsbCBiZmRfYWxsb2MsIG5vdAotCXhtYWxsb2MuCi0KLU1vbiBKdWwgMTMgMTE6MDY6MzEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYzogU3VwcmVzcyBkZWZpbml0aW9uIG9mIFRBUkdFVF9VTkRFUlNDT1JFIGFuZCBhZGQgYQotCWNvbW1lbnQgZGVzY3JpYmluZyB3aGVuIGl0IHNob3VsZCBiZSBlbmFibGVkLgotCUNoYW5nZWQgZGVmaW5pdGlvbiBvZiBVU0VSX0xBQkVMX1BSRUZJWCB0byAiIiwgdG8gZmFsbCBpbnRvIGxpbmUKLQl3aXRoIEdDQyBzb3VyY2VzLgotCi1Nb24gSnVsIDEzIDEzOjA2OjU0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBIYW5kbGUgY2FsbCBvcHRpbWl6YXRpb24KLQlpbmZvcm1hdGlvbiBBVE4gcmVjb3Jkcy4KLQotRnJpIEp1bCAxMCAxNjozMTowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzKTogU2VsZWN0IGFuIGFwcHJvcHJpYXRlCi0Jc2VjdGlvbiBmb3IgYW4gYWJzb2x1dGUgc3ltYm9sIGluIGEgZnVsbHkgbGlua2VkIGZpbGUuICBCYXNlZCBvbgotCXBhdGNoIGZyb20gQ2hyaXN0aWFuIEhvbGxhbmQgPENIb2xsYW5kQGRlLmx1Y2VudC5jb20+LgotCi1XZWQgSnVsICA4IDExOjI5OjU2IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29mZi1tODhrLmMgKG04OGtfc3BlY2lhbF9yZWxvYyk6IERvbid0IGxvc2UgdGhlIGluZm9ybWF0aW9uCi0JdGhhdCBhIHN5bWJvbCBpcyB1bmRlZmluZWQuCi0KLVR1ZSBKdWwgIDcgMjE6NDc6MDIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX2JmZF9nY19zZWN0aW9ucyk6IERlZmluZS4KLQotTW9uIEp1bCAgNiAxMTozNTo1MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byk6IERvIG5vdCBjb21wbGFpbiBhYm91dAotCW92ZXJmbG93cyBpbiBBUk1fMjZEIHBhdGNoZXMsIHNpbmNlIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4KLQlpbXBsbWVudGVkLiAgUGF0Y2ggc3VibWl0dGVkIGJ5IERyLiBSLkouIEJsYWNrIDxyamJAZGNzLmdsYS5hYy51az4KLQotU2F0IEp1bCAgNCAxMjoyNTozNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgd2UgaGF2ZSBhbnkgbG9uZwotCXNlY3Rpb24gbmFtZXMsIGNhbGwgY29mZl93cml0ZV9zeW1ib2xzIGV2ZW4gaWYgdGhlcmUgYXJlIG5vCi0Jc3ltYm9scy4KLQotRnJpIEp1bCAgMyAxMzoxMTozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBPbmx5IHNldCBwaGRyX2luY2x1ZGVkIG9uY2UgZm9yIGEKLQlQVF9MT0FEIHNlZ21lbnQsIHJhdGhlciB0aGFuIG9ubHkgc2V0dGluZyBpdCBvbmNlIGZvciB0aGUgZW50aXJlCi0JZmlsZS4KLQotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBXaGVuIHNldHRpbmcgdGhlIExNQSwKLQlyYXRoZXIgdGhhbiBpZ25vcmluZyBldmVyeSBwaGRyIHdpdGggYSBwX3BhZGRyIG9mIDAsIGlnbm9yZSBhbGwKLQl0aGUgcGhkcnMgaWYgdGhleSBhbGwgaGF2ZSBhIHBfcGFkZHIgb2YgMC4KLQotCSogc3RhYnMuYyAoX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MpOiBDaGVjayB3aGV0aGVyIHRoZSAuc3RhYnN0cgotCXNlY3Rpb24gd2FzIGRpc2NhcmRlZCBmcm9tIHRoZSBsaW5rLgotCi1GcmkgSnVsICAzIDE0OjM5OjA1IDE5OTggIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29mZi1zaC5jIChzaF9pbnNuX3VzZXNfZnJlZyk6IElnbm9yZSBsb3dlc3QgYml0IG9mIHJlZ2lzdGVyIG51bWJlci4KLQotRnJpIEp1bCAgMyAxNDozNTo0OCAxOTk4ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvZmYtc2guYyAoc2hfaW5zbnNfY29uZmxpY3QpOiBMb2FkIG9mIGZwc2NyIGNvbmZsaWN0cyB3aXRoCi0JZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucy4KLQotVGh1IEp1bCAgMiAxODozNzoyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IFNraXAgdW5kZWZpbmVkIGdsb2JhbAotCWZ1bmN0aW9uIHN5bWJvbHMuCi0KLVRodSBKdWwgIDIgMTQ6NTk6NDIgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBybWkuZGU+Ci0KLQlNZXJnZSBvZiB2YXgvdm1zIChyZWFkLW9ubHkpIHN1cHBvcnQKLQkqIGNvbmZpZ3VyZS5jb206IFN1cHBvcnQgVmF4IHRhcmdldC4KLQkqIG1ha2VmaWxlLnZtczogU3VwcG9ydCBWYXggdGFyZ2V0LgotCSogdm1zLmg6IFJlbmFtZWQgZnJvbSBldmF4LmgsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpIHN1cHBvcnQuCi0JKiB2bXMuYzogUmVuYW1lZCBmcm9tIGV2YXgtYWxwaGEuYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKLQlzdXBwb3J0LgotCSogdm1zLWhkci5jOiBSZW5hbWVkIGZyb20gZXZheC1lbWguYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKLQlzdXBwb3J0LgotCSogdm1zLWdzZC5jOiBSZW5hbWVkIGZyb20gZXZheC1lZ3NkLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCi0Jc3VwcG9ydC4KLQkqIHZtcy10aXIuYzogUmVuYW1lZCBmcm9tIGV2YXgtZXRpci5jLCBtZXJnZWQgdmF4L3ZtcyAocmVhZC1vbmx5KQotCXN1cHBvcnQuCi0JKiB2bXMtbWlzYy5jOiBSZW5hbWVkIGZyb20gZXZheC1taXNjLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCi0Jc3VwcG9ydC4KLQkqIGxpYmJmZC5jIChyZWFsX3JlYWQpOiBVc2UgdW5idWZmZXJlZCByZWFkIG9uIFZNUy9WYXguCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfb3ZheF9mbGF2b3VyKTogTmV3IGZsYXZvdXIuCi0JKHZtc19hbHBoYV92ZWMpOiBSZW5hbWVkIGZyb20gZXZheF9hbHBoYV92ZWMuCi0JKHZtc192YXhfdmVjKTogTmV3LgotCSh0YXJnZXRfdmVjdG9yKTogVXBkYXRlIGFjY29yZGluZ2x5LgotCSogY29uZmlnLmJmZCAoYWxwaGEqLSotKnZtcyopOiBVc2Ugdm1zX2FscGhhX3ZlYywgbm90Ci0JZXZheF9hbHBoYV92ZWMuCi0JKHZheCotKi0qdm1zKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5hbTogVXBkYXRlIGZvciByZW5hbWVkIGZpbGVzLiAgUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCi1UaHUgSnVsICAyIDEzOjMxOjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gTWF0dCBTZW1lcnNreSA8bWF0dHNAc2NkLmhwLmNvbT46Ci0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBGb3JjZSBhIHRyYWlsaW5nIE5VTEwKLQlwb2ludGVyIG9uIGFiZmQtPm91dHN5bWJvbHMuCi0JKGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wpOiBIYW5kbGUgTlVMTCBzeW0gcGFyYW1ldGVyLgotCi1XZWQgSnVsICAxIDE3OjA1OjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+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+Ci0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMqLSotKik6IFJlbW92ZSBQb3dlclBDIE5UIHN1cHBvcnQgZnJvbSBFTEYKLQlzeXN0ZW1zLgotCi1UdWUgQXByICA3IDE2OjI1OjMxIDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuYyAoY29tcF91bml0KTogTW92ZSBpdCBlYXJsaWVyIGluIHRoZSBzb3VyY2UuIEFkZAotCWFkZHJfc2l6ZS4KLQkocmVhZF9hZGRyZXNzKTogUmVwbGFjZSAnYmRmKicgYXJndW1lbnQgd2l0aCAnY29tcF91bml0KicgYXJndW1lbnQuCi0JVXNlIGFkZHJfc2l6ZSBmb3IgYWRkcmVzcyBzaXplLCByYXRoZXIgdGhhbiBzaXplb2YoYmZkX3ZtYSkuCi0JKHJlYWRfYXR0cmlidXRlKTogUmVwbGFjZSBiZGYqIGFyZ3VtZW50IHdpdGggJ2NvbXBfdW5pdConIGFyZ3VtZW50LgotCUZpeCBjYWxsIHRvIHJlYWRfYWRkcmVzcy4KLQkoZGVjb2RlX2xpbmVfaW5mbyk6IFJlcGxhY2UgYmRmKiBhcmd1bWVudCB3aXRoICdjb21wX3VuaXQqJyBhcmd1bWVudC4KLQlTY3JhcCBvdGhlciB1bm5lZWRlZCBhcmd1bWVudHMuICBGaXggY2FsbCB0byByZWFkX2FkZHJlc3MuCi0JKHNjYW5fdW5pdF9mb3JfZnVuY3Rpb25zKTogRml4IGNhbGwgdG8gcmVhZF9hdHRyaWJ1dGUuCi0JKHBhcnNlX2NvbXBfdW5pdCk6IFdlIG5vdyBoYW5kbGUgbW9yZSB2YWx1ZXMgZm9yIGFkZHJfc2l6ZS4KLQlTZXQgYWRkcl9zaXplIGluIHVuaXQuICBGaXggY2FsbCB0byByZWFkX2F0dHJpYnV0ZSBhbmQKLQlkZWNvZGVfbGluZV9pbmZvLgotCi1UdWUgQXByICA3IDE1OjQ0OjQ3IDE5OTggIEdhdmluIFJvbWlnLUtvY2ggPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMi5jIChwYXJzZV9jb21wX3VuaXQpOiBEcm9wIHVzZSBvZiB1bml0LT5uYW1lIHdoZW4gaXQgaXMgbnVsbC4KLQotVHVlIEFwciAgNyAxMjozNToxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X3NjYW4pOiBBZGQgbTY4ayBjYXNlcyBiYWNrIHRvIGRlZmF1bHQKLQlzd2l0Y2gsIHJldmVydGluZyBwYXRjaCBvZiBNYXJjaCAyNSwgc2luY2UgSUVFRSBzdXBwb3J0IGRlcGVuZHMKLQl1cG9uIHRoZW0uCi0KLU1vbiBBcHIgIDYgMTQ6MDY6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1TdW4gQXByICA1IDE2OjIxOjQ0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogRml4IGNvbXB1dGF0aW9uIG9mCi0Jc29tX29mZnNldCB3aGVuIHdlIGhhdmUgYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLQotU3VuIEFwciAgNSAxNjowNDozOSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIE1ha2VmaWxlLmFtIChzdGFtcC1saWIpOiBDaGVjayB0aGF0IC5saWJzL2xpYmJmZC5hIGV4aXN0cyBiZWZvcmUKLQl0cnlpbmcgdG8gY29weSBpdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXByICAzIDExOjA5OjQyIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEdlbmVyYXRlIHNlY3Rpb24KLQlzeW1ib2xzIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkoZWxmX202OGtfYWRqdXN0X2R5bmluZHgpOiBOZXcgZnVuY3Rpb24sIHVzZWQgYnkgYWJvdmUgY29kZS4KLQkoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBJbml0aWFsaXplIHRoZSBzZWN0aW9uCi0Jc3ltYm9scy4KLQkoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IENoYW5nZSBhYm9ydCB0byBCRkRfQVNTRVJULgotCi1XZWQgQXByICAxIDE2OjA0OjAyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGluX3JlbG9jX3ApOiBVc2UgQVJNX1JWQTMyIGluIHBsYWNlIG9mIGNvbnN0YW50Ci0JdmFsdWUgMTEuCi0KLVdlZCBBcHIgIDEgMTM6MzY6NTggMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbiwgY2FzZSBSXzY4S19QTFQqTyk6IEZpeAotCWFzc2VydGlvbi4KLQotVHVlIE1hciAzMSAwMDoxMjoxMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IENvcnJlY3RseSBoYW5kbGUKLQlhYnNvbHV0ZSBzeW1ib2xzLgotCi1Nb24gTWFyIDMwIDEyOjQ2OjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgdmVyc2lvbiB0byAyLjkuMS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi45LgotCi1Nb24gTWFyIDMwIDEyOjIwOjUwIDE5OTggIEJyZW50IEJhY2NhbGEgIDxiYWNjYWxhQGZyZWVzb2Z0Lm9yZz4KLQotCSogc3ltcy5jIChFTkFCTEVfQ0FDSElORyk6IERlZmluZS4KLQkoc3RydWN0IGluZGV4ZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBzdGFiX2NhY2hlKTogUmVtb3ZlLgotCShjbXBpbmRleGVudHJ5KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RydWN0IHN0YWJfZmluZF9pbmZvKTogQWRkIG5ldyBmaWVsZHM6IGluZGV4dGFibGUsCi0JaW5kZXh0YWJsZXNpemUsIGNhY2hlZF9pbmRleGVudHJ5LCBjYWNoZWRfb2Zmc2V0LCBjYWNoZWRfc3RhYiwgYW5kCi0JY2FjaGVkX2ZpbGVfbmFtZS4gIFJlbW92ZSBmaWVsZHM6IGZpbGVfY2FjaGUsIGZ1bmN0aW9uX2NhY2hlLCBhbmQKLQlsaW5lX2NhY2hlLgotCShfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IFJld3JpdGUgdG8gYnVpbGQgYSBzb3J0ZWQKLQlpbmRleCB0YWJsZSBhbmQgc2VhcmNoIGl0LgotCi1Nb24gTWFyIDMwIDEwOjM5OjM0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDYWxsCi0JY29weV9wcml2YXRlX2JmZF9kYXRhIG9uY2Ugd2UndmUgc2VlbiB0aGUgbGFzdCBTRUNfQUxMT0Mgc2VjdGlvbi4KLQotCSogY3B1LW1pcHMuYzogUmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGF0IGVuZCBvZiBlbnVtZXJhdGlvbiBsaXN0LgotCi1TYXQgTWFyIDI4IDE2OjMzOjAyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYzogRGVmaW5lIGFsbCBnbG9iYWxseSB2aXNpYmxlIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zCi0Jb25seSB3aGVuIENPRkZfV0lUSF9QRSBpcyBub3QgZGVmaW5lZC4KLQkqIGNvbmZpZ3VyZS5pbiAoYXJtcGVfbGl0dGxlX3ZlYywgYXJtcGVfYmlnX3ZlYyk6IEFkZAotCWNvZmYtYXJtLmxvLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI3IDE2OjA2OjAyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZpeCBzb21lIGdjYyAtV2FsbCB3YXJuaW5nczoKLQkqIGFvdXQtYXJtLmMgKE1ZKGZpeF9wY3JlbF8yNikpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBhcmNoaXZlLmMgKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcpOiBMaWtld2lzZS4KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X3NjYW4pOiBMaWtld2lzZS4KLQkqIGJmZC5jIChiZmRfc2Nhbl92bWEpOiBMaWtld2lzZS4KLQkqIGJpbmFyeS5jIChtYW5nbGVfbmFtZSk6IExpa2V3aXNlCi0JKiBjb2ZmLWFybS5jIChhb3V0YXJtX2ZpeF9wY3JlbF8yNik6IExpa2V3aXNlLgotCSogY29mZi1zaC5jIChzaF9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXN0Z28zMi5jIChjcmVhdGVfZ28zMl9zdHViKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX2xpbmVfdGFibGUpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfd3JpdGVfYXJtYXApOiBMaWtld2lzZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogTGlrZXdpc2UuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogTGlrZXdpc2UuCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogcHBjYm9vdC5jIChwcGNib290X29iamVjdF9wKTogTGlrZXdpc2UuCi0JKG1hbmdsZV9uYW1lKTogTGlrZXdpc2UuCi0JKiByaXNjaXguYyAocmlzY2l4X2ZpeF9wY3JlbF8yNik6IExpa2V3aXNlLgotCSogc3JlYy5jIChzcmVjX3NjYW4pOiBMaWtld2lzZS4KLQkqIHN0YWJzLmMgKF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicyk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IExpa2V3aXNlLgotCSogYW91dC1uczMyay5jIChfYmZkX25zMzJrX3JlbG9jYXRlX2NvbnRlbnRzKTogQWRkIGRlZmF1bHQgY2FzZSB0bwotCXN3aXRjaC4gIERlY2xhcmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnMuCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogQWRkIGJyYWNlcyB0byBhdm9pZCBhbWJpZ3VvdXMgaWYKLQl3YXJuaW5nLgotCSogZWxmLmMgKGVsZl9zb3J0X3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWFybS5jIChjb2ZmX3RodW1iX3BjcmVsX2NvbW1vbik6IEluaXRpYWxpemUgcmVsb2NhdGlvbi4KLQlBZGQgZGVmYXVsdCBjYXNlcyB0byBzd2l0Y2hlcy4KLQkoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgotCUFsd2F5cyBzZXQgcnN0YXQuCi0JKGNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IENoYW5nZSBmbGFnIHZhcmlhYmxlIHRvIHR5cGUKLQlmbGFnd29yZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBJbml0aWFsaXplIHVzZV9sby4KLQkqIGNvZmYtcHBjLmMgKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgotCShkdW1wX3RvYyk6IENoYW5nZSBjYXQgdG8gY29uc3QsIGFuZCBpbml0aWFsaXplIGl0LgotCSogY29mZi1zaC5jIChzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBJbml0aWFsaXplIHN0YXJ0IGFuZCB2b2ZmLgotCSogZWxmMzItc2guYyAoc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IExpa2V3aXNlLgotCShzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEluaXRpYWxpemUgcl9zeW1uZHguCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IE9ubHkgZGVjbGFyZQotCW9sZF9zb2ZhciBpZiBBTElHTl9TRUNUSU9OU19JTl9GSUxFLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEluaXRpYWxpemUgY3N5bS4KLQkqIGNvZmZnZW4uYyAoY29mZl9wb2ludGVyaXplX2F1eCk6IE1ha2UgdHlwZSBhbmQgY2xhc3MgdW5zaWduZWQuCi0JKiBjcHUtbnMzMmsuYyAoX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50KTogQWRkIGRlZmF1bHQgY2FzZSB0bwotCXN3aXRjaC4KLQkqIGR3YXJmMi5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShyZWFkXzJfc2lnbmVkX2J5dGVzLCByZWFkXzRfc2lnbmVkX2J5dGVzKTogQ29tbWVudCBvdXQuCi0JKGRlY29kZV9saW5lX2luZm8pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfc2RhMTZfcmVsb2MpOiBMaWtld2lzZS4KLQkobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbik6IExpa2V3aXNlLgotCSh2ODUwX2VsZl9yZWxvYyk6IExpa2V3aXNlLgotCSogZWxmLWJmZC5oIChlbGZfbGlua2VyX3NlY3Rpb25fdCk6IE1ha2UgYWxpZ25tZW50IHVuc2lnbmVkLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE1ha2UgY3ZlcmRlZnMgYW5kIGN2ZXJyZWZzIHVuc2lnbmVkLgotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBBbHdheXMgc2V0IGFkanVzdC4KLQkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jKTogSW5pdGlhbGl6ZSB0bXBfYWRkci4gIEZ1bGx5Ci0JcGFyZW50aGVzaXplIGV4cHJlc3Npb24uCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBbHdheXMgaW5pdGlhbGl6ZSBoLgotCShtMzJyX2VsZl9vYmplY3RfcCk6IFJldHVybiBhIHZhbHVlLgotCShtMzJyX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQ2hhbmdlIGZwcmludGYgZm9ybWF0IHN0cmluZy4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IEluaXRpYWxpemUgbGFzdC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBJbml0aWFsaXplIGxhc3QgYW5kIGRpbmR4LgotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9vYmplY3RfcCk6IFJldHVybiBhIHZhbHVlLgotCSh2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQ2hhbmdlIGZwcmludGYgZm9ybWF0IHN0cmluZy4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoYW5nZSBzeW1jb3VudCBhbmQgaSB0bwotCXVuc2lnbmVkIGxvbmcuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENoYW5nZSB2ZXJudW0gdG8KLQl1bnNpZ25lZCBpbnQsIGFuZCBpbml0aWFsaXplIGl0LiAgQ2hhbmdlIGZwcmludGYgZm9ybWF0IHN0cmluZy4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDYXN0IC0xIHRvIGJmZF9zaXplX3R5cGUKLQl3aGVuIHNldHRpbmcgb3IgY29tcGFyaW5nIHRvIHNvbmFtZV9pbmR4LgotCShlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBDaGFuZ2UgbnVtX3N5bWJvbHMgdG8KLQl1bnNpZ25lZCBpbnQuCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfZGF0YV90eXBlKTogQ2hhbmdlIGZsYWdzIHRvIGZsYWd3b3JkLgotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IEluaXRpYWxpemUgaWR4LiAgQ2hhbmdlIGogdG8KLQliZmRfc2l6ZV90eXBlLiAgSW5pdGlhbGl6ZSBoaW50X21lbWJlci4gIFJlbW92ZSB1c2VsZXNzIHRlc3QgdG8KLQl0aW1lX3N0YW1wLgotCShwZV9wcmludF9lZGF0YSk6IENoYW5nZSBudW1fZnVuY3Rpb25zIGFuZCBudW1fbmFtZXMgaW4gc3RydWN0Ci0JRURUX3R5cGUgdG8gdW5zaWduZWQgbG9uZy4gIFJlbW92ZSBjYXN0LiAgQ2hhbmdlIGZwcmludGYgZm9ybWF0Ci0Jc3RyaW5nLgotCSogcHBjYm9vdC5jIChwcGNib290X29iamVjdF9wKTogQ2hhbmdlIGkgdG8gc2l6ZV90LgotCSogcmVsb2MuYyAoYmZkX2dldF9yZWxvY19zaXplKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIHVuc2lnbmVkCi0JaW50LgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBDaGFuZ2Ugc2hyaW5rcyB0bwotCWludCAqLiAgVXBkYXRlIHVzZXMuICBDaGFuZ2UgaiB0byBsb25nLgotCSogYmZkLWluMi5oLCBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjcgMTA6MTA6NDYgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jIFJlbW92ZSBkZWZpbml0aW9uIG9mIFVTRV9SRUwuCi0JKHY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsYSk6IE5ldyBmdW5jdGlvbi4KLQkodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogIFJlbmFtZWQgZnJvbQotCXY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuLiAgUmVtb3ZlZCByZXBsYWNlIGFyZ3VtZW50LgotCSh2ODUwX2VsZl9yZWxvYyk6IHN0b3JlIHRoZSByZWxvY2F0aW9uIGluIHRoZSBhZGRlbmQgZmllbGQgaW5zdGVhZAotCW9mIHRoZSBpbnNuLgotCSh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogIE5vdyBjYWxscwotCXY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbi4KLQkodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6ICBSZW1vdmUgY29kZSB0byBnZW5lcmF0ZSBSRUwKLQlyZWxvY2F0aW9ucy4KLQotVGh1IE1hciAyNiAxMzozMjoxNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFNldCB0aGUgdHlwZSBhbmQgc3RvcmFnZQotCWNsYXNzIGluIHRoZSBuYXRpdmUgc3ltYm9sIGluZm9ybWF0aW9uIGFsbG9jYXRlZCBmb3IgYSBuZXcgc2VjdGlvbgotCXN5bWJvbC4KLQotVGh1IE1hciAyNiAxMDoxMzo0MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmg6IENoYWluIHRvZ2V0aGVyIGNhbGxzIHRvCi0JY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIGFuZAotCWNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEuCi0KLQkqIGNvZmYtYXJtLmM6IEFkZCBwcm90b3R5cGVzIGZvcgotCWNvZmZfYXJtX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIGFuZAotCWNvZmZfYXJtX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEuCi0KLVdlZCBNYXIgMjUgMTU6NDU6NTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogU2V0IHByaXZhdGUgZmFsZ3MgZXZlbiBmb3IgYSBQRQotCWJ1aWxkLgotCi0JKiBwZWljb2RlLmg6IENhbGwgYXJtLWNvZmYgcHJpdmF0ZSBkYXRhIGZ1bmN0aW9ucyBhZnRlciBoYW5kbGluZwotCXBlIHByaXZhdGUgZGF0YS4KLQotCSogY29mZi1hcm0uYzogVHVybiBzdGF0aWNzIGludG8gZ2xvYmFscyBzbyB0aGF0IHRoZXkgY2FuIGJlIHNoYXJlZAotCWJvdGggcGUgYW5kIHBlaSBiYWNrZW5kcy4KLQotV2VkIE1hciAyNSAxNToxOTozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXRmMS5oIChzdW5vc19zZXRfYXJjaF9tYWNoKTogVXNlIGJmZF9tYWNoX202OCogcmF0aGVyIHRoYW4KLQlwbGFpbiBudW1iZXJzLgotCShzdW5vc193cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IExpa2V3aXNlLgotCi1XZWQgTWFyIDI1IDEzOjU5OjI0IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9tNjgqKTogQWRkIGRlZmluaXRpb25zIGZvciB2YXJpb3VzIG02OGsKLQl2YXJpYW50cy4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IFJlbW92ZSBtNjhrIHNwZWNpYWwgY2FzZXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBtaXBzYnNkLmMgKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBVc2UgYmZkX21hY2hfbTY4KiByYXRoZXIKLQl0aGFuIHBsYWluIG51bWJlcnMuCi0JKiBzcGFyY2x5bnguYyAoTkFNRShseW54LHNldF9hcmNoX21hY2gpKTogTGlrZXdpc2UuCi0JKiBjcHUtbTY4ay5jIChhcmNoX2luZm9fc3RydWN0KTogTGlrZXdpc2UuICBBZGQgZW50cnkgZm9yCi0JbTY4azo2ODAwMC4KLQkoYmZkX202OGtfYXJjaCk6IFNldCBtYWNoIGZpZWxkIHRvIHplcm8gdG8gc2lnbmFsIG5vIGV4cGxpY2l0Ci0Jc2VsZWN0aW9uLCBjaGFuZ2UgcHJpbnRhYmxlX25hbWUgdG8ganVzdCAibTY4ayIgYW5kIG1ha2UgdGhhdCB0aGUKLQlkZWZhdWx0IGluc3RlYWQgb2YgbTY4azo2ODAyMC4KLQotCSogYW91dC10aWMzMC5jIChOQU1FKTogRGVmaW5lIHRoaXMgdG8gYXZvaWQgbXVsdGlwbGUgZGVmaW5pdGlvbnMKLQlmcm9tIGFvdXR4LmguCi0JKE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lIGFzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLQlyYXRoZXIgdGhhbiBOQU1FKGFvdXQsZ2V0X3NlY3Rpb25fY29udGVudHMpLgotCi0JKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEZpeCBjYXN0LgotCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfc2V0X2FyY2hfbWFjaCk6IE9ubHkgYWNjZXB0IGJmZF9hcmNoX2FscGhhCi0JYW5kIGNhbGwgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCB0byBkbyB0aGUgcmVhbCB3b3JrLgotCi1XZWQgTWFyIDI1IDEwOjQxOjM1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGJvdXQuYyAoQkFMWCk6IEluY2x1ZGUgcmV0dXJuIHJlZ2lzdGVyIGcxNCBhcyBwYXJ0IG9mIHRoZSBpbnNuLgotCShCQUxYX01BU0spOiBOZXcuCi0JKGNhbGxqeF9jYWxsYmFjayk6IFVzZSBpdC4KLQotV2VkIE1hciAyNSAxMToxOToyOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChCRkRfQUxJR04pOiBDYXN0IHRoaXMgcGFyYW1ldGVyIHRvIGJmZF92bWEuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5KTogQ2hhbmdlCi0JYnl0ZV9jb3VudCB0byB1bnNpZ25lZCBpbnQuCi0JKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBJbml0aWFsaXplIGludGVybmFsX3JlbG9jcy4gIFJlbW92ZQotCXVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCi0KLQkqIGV2YXgtYWxwaGEuYyAoZXZheF9jbG9zZV9hbmRfY2xlYW51cCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwKLQl2YXJpYWJsZXMgZXIgYW5kIGVyMS4KLQotCSogY3B1LXY4NTAuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKHNjYW4pOiBDYXNlIGlzZGlnaXQgYXJndW1lbnQgdG8gdW5zaWduZWQgY2hhci4KLQotCUZyb20gWWFuIE1lcm90aCA8WUFOLk1FUk9USEBzdC5jb20+OgotCSogaWhleC5jIChpaGV4X3NjYW4pOiBBZGQgZXh0YmFzZSB2YXJpYWJsZSBzbyB0aGF0IGdldHRpbmcgYW4KLSAJZXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MgcmVjb3JkIGRvZXMgbm90IGlnbm9yZSBhbnkgcHJldmlvdXMKLSAJZXh0ZW5kZWQgYWRkcmVzcy4KLQkoaWhleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBXaGVuIHdyaXRpbmcgb3V0IGFuIGV4dGVuZGVkIGxpbmVhcgotIAlhZGRyZXNzIHJlY29yZCwgemVybyBvdXQgYW55IHByZXZpb3VzIGV4dGVuZGVkIGFkZHJlc3MuCi0KLVR1ZSBNYXIgMjQgMTY6MDk6NDMgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBpZWVlLmMgKGRvX29uZSk6IENoZWNrIHNlY3Rpb24gYmVmb3JlIGRlcmVmZXJlbmNpbmcgaXQuCi0JKGllZWVfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2Ugd2l0aCBzcmMtPnJlbGVudC5zeW1fcHRyX3B0ci4KLQkoaWVlZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBMaWtld2lzZSB3aXRoIGFiZmQtPm15X2FyY2hpdmUuCi0KLU1vbiBNYXIgMjMgMTg6NTE6NDcgMTk5OCAgSm9lbCBTaGVycmlsbCAgPGpvZWxAT0FSY29ycC5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IChzaCotKi1ydGVtcyopOiBTd2l0Y2hlZCBmcm9tIEVMRiB0byBDT0ZGLgotCi1Nb24gTWFyIDIzIDE0OjIzOjM2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IEFkZCBpbnRlcndvcmtpbmcgZnVuY3Rpb25zIHRvIHBlIGJhY2tlbmRzLgotCi1GcmkgTWFyIDIwIDE4OjQ3OjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgQU1fRElTQUJMRV9TSEFSRUQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KLQotRnJpIE1hciAyMCAxMToyNTo0MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogQmV0dGVyIGVycm9yIG1lc3NhZ2VzCi0Jd2hlbiBpbnRlcm93cmtpbmcgY29uZmx1Y3RzIG9jY3VyLiAgQ291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uCi0JYW5kIFRvbnkgVGhvbXBzb24uCi0JKGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvKTogRml4ZWQgYml0c2l6ZSBmaWVsZHMgb2YgcmlnaHRzaGlmdGVkCi0JcmVsb2NhdGlvbnMuICBQYXRjaCBjb3VydGVzeSBvZiBKb25hdGhhbiBXYWx0b24gYW5kIFRvbnkKLQlUaG9tcHNvbi4KLQotRnJpIE1hciAyMCAwMjoyNjo0MyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXZlcnQKLQlwYXJ0IG9mIEZlYiAyMiBjaGFuZ2UgY29udHJvbGluZyB3aGVuIHRvIG92ZXJyaWRlIHRoZSBleGlzdGluZwotCXN5bWJvbCB3aXRoIHRoZSAucGx0IGVudHJ5LgotCi1XZWQgTWFyIDE4IDA5OjI2OjI1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHRhcmdfY3B1KTogQWRkIHRodW1iLXBlIHRhcmdldC4KLQotCSogY29mZmNvZGUuaCAoT1RIRVJfR0xPQkFMX0NMQVNTKTogU3VwcG9ydCB0aHVtYiBleHRlcm5hbAotCWZ1bmN0aW9ucyBpbiBQRSBidWlsZC4KLQotU3VuIE1hciAgOCAyMzozNzoyNiAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChzcGFyY2xpdGUtKi1lbGYqKTogQWRkZWQuCi0KLU1vbiBGZWIgMjMgMTk6MzE6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBlbGYubG8gdG8gZWxmIHNoZWxsIHZhcmlhYmxlLgotCSogTWFrZWZpbGUuYW0gKEJGRF9MSUJTKTogUmVtb3ZlIGVsZi5sby4KLQkoQkZEX0xJQlNfQ0ZJTEVTKTogUmVtb3ZlIGVsZi5jLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGYubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYuYy4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTgtMDItMjMgMTU6NTMgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IEEgcGMtcmVsYXRpdmUKLQlyZWxvY2F0aW9uIGFnYWluc3QgYSBub3ctbG9jYWwgc3ltYm9sIHNob3VsZCBub3QgaGF2ZSBhIGR5bmFtaWMKLQlyZWxvY2F0aW9uLgotCi1Nb24gRmViIDIzIDE2OjE3OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IERvbid0IHNldCBCRkQgZmxhZyBIQVNfU1lNUyBpbgotCUNPRkYgZmlsZWhkciBmbGFncy4KLQkocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IFByaW50IFBFIGZsYWdzLiAgRnJvbSBNaWtleQotCTxqZWZmZGJAbmV0em9uZS5jb20+LgotCi1TdW4gRmViIDIyIDIwOjM5OjAwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IGNyZWF0ZQotIAlhIHBsdCBlbnRyeSB3aGVuIHdlIGNhbiBkZXRlcm1pbmUgdGhhdCB3ZSBhdXRob3JpdGF0aXZlbHkgZGVmaW5lCi0gCXRoZSBzeW1ib2wuCi0KLVN1biBGZWIgMjIgMjA6MzM6MDUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChDT1JFRklMRSBzZWxlY3Rpb24pOiBSZW1vdmUgc3BhcmMtKi1saW51eCouICBUaGV5Ci0JZG9uJ3QgYWN0dWFsbHkgdXNlIHRyYWQtY29yZSwgYnV0IGEgU3VuT1Mtc3R5bGUgY29yZSBmaWxlIGhhbmRsZWQKLQlieSBnZGIgZGlyZWN0bHkuCi0JKiBob3N0cy9zcGFyY2xpbnV4Lmg6IFJlbW92ZS4KLQotV2VkIEZlYiAxOCAxNTozMTowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBJZiB0aGVyZSBpcyBubyAuaWRhdGEgc2VjdGlvbiwgbG9vawotCWZvciB0aGUgaW1wb3J0IHRhYmxlcyBpbiBzb21lIG90aGVyIHNlY3Rpb24uICBNYWtlIHRoZSBpbml0aWFsCi0JbGFiZWwgbGluZSB1cCBiZXR0ZXIgd2l0aCB0aGUgZGF0YS4gIFByaW50IHRoZSBpbXBvcnQgYWRkcmVzcwotCXRhYmxlIGV2ZW4gaWYgdGhlcmUgaXMgbm8gaW1wb3J0IG5hbWUgdGFibGUuICBJZiB0aGUgaW1wb3J0Ci0JYWRkcmVzcyB0YWJsZSBob2xkcyBhY3R1YWwgYWRkcmVzc2VzLCBwcmludCB0aGVtLgotCi1UdWUgRmViIDE3IDEyOjU4OjM0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9zZWVrKTogSWYgZnNlZWsgZmFpbHMsIHNhdmUgZXJybm8gYXJvdW5kIGNhbGwgdG8KLQliZmRfdGVsbC4gIElmIGVycm5vIGlzIEVJTlZBTCwgc2V0IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCwgbm90Ci0JYmZkX2Vycm9yX3N5c3RlbV9jYWxsLgotCi1GcmkgRmViIDEzIDEzOjExOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KLQotCUZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogTWFrZWZpbGUuYW0gKGxpYmJmZF9sYV9MREZMQUdTKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBGZWIgMTIgMTc6MzE6MTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JTmV0QlNEIHBhdGNoZXMgZnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiBuZXRic2QuaCAoTUFDSFRZUEVfT0spOiBEZWZpbmUuCi0JKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBVc2UgREVGQVVMVF9BUkNIIGFuZCBERUZBVUxUX01JRCB3aGVuCi0JY2FsbGluZyBOX1NFVF9NQUNIVFlQRSwgcmF0aGVyIHRoYW4gaGF2aW5nIGEgc3dpdGNoLgotCSogbGliYW91dC5oIChlbnVtIG1hY2hpbmVfdHlwZSk6IEFkZCBNX1BNQVhfTkVUQlNELCBNX1ZBWF9ORVRCU0QsCi0JYW5kIE1fQUxQSEFfTkVUQlNELgotCSogaTM4Nm5ldGJzZC5jIChNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZS4KLQkoREVGQVVMVF9NSUQpOiBEZWZpbmUuCi0JKiBtNjhrNGtuZXRic2QuYyAoU0VHTUVOVF9TSVpFKTogRG9uJ3QgZGVmaW5lLgotCShNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZS4KLQkoREVGQVVMVF9NSUQpOiBEZWZpbmUuCi0JKiBtNjhrbmV0YnNkLmM6IChNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZS4KLQkoREVGQVVMVF9NSUQpOiBEZWZpbmUuCi0JKiBuczMya25ldGJzZC5jIChNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZS4KLQkoREVGQVVMVF9NSUQpOiBEZWZpbmUuCi0JKiBzcGFyY25ldGJzZC5jIChNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZS4KLQkoREVGQVVMVF9NSUQpOiBEZWZpbmUuCi0KLQlOZXRCU0QgcGF0Y2hlcyBmcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKLQkqIHZheG5ldGJzZC5jOiBOZXcgZmlsZS4KLQkqIG5ldGJzZC1jb3JlLmM6IENsZWFuIHVwLiAgUmVtb3ZlIHVudXNlZCBtYWNyb3MuICBVc2UgbmV0YnNkCi0JcmF0aGVyIHRoYW4gbmV0YnNkX2NvcmUuCi0JKiB0YXJnZXRzLmMgKHZheG5ldGJzZF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCB2YXhuZXRic2RfdmVjLiAgSWYgTkVUQlNEX0NPUkUgaXMKLQlkZWZpbmVkLCBhZGQgbmV0YnNkX2NvcmVfdmVjLgotCSogY29uZmlndXJlLmluOiBTZXQgQ09SRUZJTEUgZm9yIGFscGhhKi0qLW5ldGJzZCogYW5kCi0JcG93ZXJwYy0qLW5ldGJzZCogdG8gbmV0YnNkLWNvcmUubG8uICBJZiBDT1JFRklMRSBpcwotCW5ldGJzZC1jb3JlLmxvLCBzZXQgQ09SRUZMQUcgdG8gLURORVRCU0RfQ09SRS4KLQkqIGNvbmZpZy5iZmQgKGFscGhhKi0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgdmF4bmV0YnNkLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgdmF4bmV0YnNkLmMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaG9zdDogUmVtb3ZlIHRoZSBvbGQgc2hhcmVkIGxpYnJhcnkgYnVpbGQgc3R1ZmYuICBXZQotCW5vdyB1c2UgbGlidG9vbCBpbnN0ZWFkLgotCi1XZWQgRmViIDExIDE3OjEzOjA5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRla2hleC5jICh0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCB0ZWtoZXhfaW5pdC4KLQotVHVlIEZlYiAxMCAxOToyMzoyOCAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVGFrZSBzdGFiLXN5bXMubG8gb3V0IG9mIHNwYXJjbGludXhfdmVjIGxpc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBGZWIgMTAgMTU6MTY6MzggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQkqIGVsZjMyLXY4NTAuYyAocmVtZW1iZXJfaGkxNnNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKGZpbmRfcmVtZW1iZXJlZF9oaTE2c19yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkodjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24pOiBVc2UgdGhlIGFib3ZlIG5ldyBmdW5jdGlvbnMgdG8KLQltYXRjaCB1cCBISTZTIHJlbG9jcyB3aXRoIExPMTYgcmVsb2NzLgotCi1UdWUgRmViIDEwIDE1OjAxOjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLWxpbnV4KiB0byAtbGludXgtZ251Ki4KLQkqIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5ob3N0OiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIEZlYiAgOSAxOTo0MDo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuKTogRml4IGFub3RoZXIKLQlMTzE2L0hJMTZTIGJ1ZyBhbmQgaW1wcm92ZSBjb21tZW50cyBhYm91dCB3aGF0IGlzIGdvaW5nIG9uLgotCi1TYXQgRmViICA3IDE1OjI3OjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLUZyaSBGZWIgIDYgMTQ6NDg6MjAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRG8gbm90IGNvbXBsYWluCi0Jd2hlbiBtZXJnaW5nIHY4NTAgY29kZSBpbnRvIHY4NTBlL3Y4NTBlYSBjb2RlLiAgRG8gbm90IGluaXRpYWxpc2UKLQlvdXRwdXQgZmxhZ3MgaWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZS4KLQotRnJpIEZlYiAgNiAxMTo1MDoyMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1pcHMuYyAoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEZvciBCRkRfUkVMT0NfQ1RPUgotCWdldCB0aGUgc2l6ZSBmcm9tIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgaW5zdGVhZCBvZiBkaXJlY3RseQotCWZyb20gdGhlIGlzYS4KLQotVGh1IEZlYiAgNSAxNDoyMTozNCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLWluLmggKEJGRF9BTElHTik6IElmIHJvdW5kaW5nIHVwIHdvdWxkIGNhdXNlIHRoZSBhZGRyZXNzCi0JdG8gd3JhcCwganVzdCByZXR1cm4gYWxsIDEncyBiaXRzIGluc3RlYWQuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZS4KLQotVGh1IEZlYiAgNSAxMTo1MTowNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX3BlX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24KLQlpZiBDT0ZGX1dJVEhfUEUuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IElmIENPRkZfV0lUSF9QRSwgZGVmaW5lIGFzCi0JY29mZl9wZV9pMzg2X3JlbG9jYXRlX3NlY3Rpb24uCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIENPRkZfSU1BR0VfV0lUSF9QRSwKLQlza2lwIGVtcHR5IHNlY3Rpb25zLCB0byBtYXRjaCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cy4KLQotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X3N3YXBfcmVsb2NhX291dCk6IFN3YXAgb3V0IHJfYWRkZW5kLAotIAlyYXRoZXIgdGhhbiBzd2FwcGluZyBvdXQgcl9vZmZzZXQgdHdpY2UuICBGcm9tIEx1a2UgRGVsbGVyCi0gCTxsdWtlZEBjc2UudW5zdy5lZHUuYXU+LgotCi1XZWQgRmViICA0IDE5OjExOjI4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgbGlidG9vbF9lbmFibGVfc2hhcmVkIHJhdGhlciB0aGFuCi0JbGlidG9vbF9zaGFyZWQuICBSZW1vdmUgZGl2ZXJzaW9uIGhhY2suCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQKLQl3aXRoIG5ldyBsaWJ0b29sLgotCi1XZWQgRmViICA0IDE2OjEwOjIxIDE5OTggIEJyZW50IEJhY2NhbGEgIDxiYWNjYWxhQGZyZWVzb2Z0Lm9yZz4KLQotCSogc3ltcy5jIChzdHJ1Y3Qgc3RhYl9jYWNoZSk6IERlZmluZS4KLQkoc3RydWN0IHN0YWJfZmluZF9pbmZvKTogUmVtb3ZlIGNhY2hlZF9vZmZzZXQsIGNhY2hlZF9zdGFiLAotCWNhY2hlZF9zdHIsIGFuZCBjYWNoZWRfc3Ryb2ZmIGZpZWxkcy4gIEFkZCBmaWxlX2NhY2hlLAotCWZ1bmN0aW9uX2NhY2hlLCBhbmQgbGluZV9jYWNoZSBmaWVsZHMuCi0JKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogVXNlIGV4dGVuc2l2ZSBjYWNoaW5nIHRvCi0Jc3BlZWQgdXAgc2VhcmNoZXMuCi0KLVdlZCBGZWIgIDQgMTM6MzQ6MjIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogQ2hlY2sgZm9yIGltcG9ydCBvZiBvcmRpbmFsIHJhdGhlcgotCXRoYW4gbmFtZS4KLQkocGVfcHJpbnRfZWRhdGEpOiBJZiB0aGVyZSBpcyBubyAuZWRhdGEgc2VjdGlvbiwgbG9vayBmb3IgdGhlCi0JZXhwb3J0IGRhdGEgaW4gc29tZSBvdGhlciBzZWN0aW9uLgotCi1Nb24gRmViICAyIDIwOjA1OjQyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSB2ZXJzaW9uIHRvIDIuOC40LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotTW9uIEZlYiAgMiAxNzozOTozOSAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JQWRkIHRtczMyMGMzMCBzdXBwb3J0OgotCSogY3B1LXRpYzMwLmM6IE5ldyBmaWxlLgotCSogYW91dC10aWMzMC5jOiBOZXcgZmlsZS4KLQkqIGNvZmYtdGljMzAuYzogTmV3IGZpbGUuCi0JKiBhcmNodXJlcy5jIChiZmRfYXJjaF90aWMzMCk6IERlZmluZS4KLQkoYmZkX3RpYzMwX2FyY2gpOiBEZWNsYXJlLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCBiZmRfdGljMzBfYXJjaC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgdGljMzBfYW91dF92ZWMgYW5kCi0JdGljMzBfY29mZl92ZWMuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfVElDMzBfTERQKTogRGVmaW5lLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBBZGQgdGljMzAgY2FzZS4KLQkoY29mZl9zZXRfZmxhZ3MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy5iZmQgKHRpYzMwLSotKmFvdXQqLCB0aWMzMC0qLSpjb2ZmKik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluICh0aWMzMF9hb3V0X3ZlYywgdGljMzBfY29mZl92ZWMpOiBOZXcgdmVjdG9ycy4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS10aWMzMC5sby4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBjcHUtdGljMzAuYy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgYW91dC10aWMzMC5sbyBhbmQgY29mZi10aWMzMC5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGFvdXQtdGljMzAuYyBhbmQgY29mZi10aWMzMC5jLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotTW9uIEZlYiAgMiAxMjoyNToxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuKTogQWxsb3cgSEkxNl9TIHJlbG9jCi0JdG8gbGFnIGJlaGluZCBMTzE2IHJlbG9jIGJ5IGEgY291cGxlIG9mIGluc3RydWN0aW9ucy4KLQotTW9uIEZlYiAgMiAxNDowOTo0NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICgkKHNyY2RpcikvYmZkLWluMi5oKTogQWRkIGR1bW15IGNvbW1hbmQgdG8gZm9yY2UKLQltYWtlIHRvIHJlZXhhbWluZSB0aGUgZmlsZSB0aW1lc3RhbXAuCi0JKCQoc3JjZGlyKS9saWJiZmQuaCwgJChzcmNkZGlyKS9saWJjb2ZmLmgpOiBMaWtld2lzZS4KLQotCSogZWxmNjQtYWxwaGEuYyAoRUxGX01BWFBBR0VTSVpFKTogQ2hhbmdlIHRvIDB4MTAwMDAgZnJvbQotCTB4MTAwMDAwLgotCi1GcmkgSmFuIDMwIDE5OjA3OjA3IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTmV3IHByb2NlZHVyZQotCXRvIGNyZWF0ZSAuZHluc2JzcyBhbmQgLnJlbGEuc2JzcyBzZWN0aW9ucy4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBQdXQgc3BhY2UgZm9yIHNtYWxsIGRhdGEgdG8gYmUKLQljb3BpZWQgZnJvbSBkeW5hbWljIG9iamVjdHMgaW50byAuc2Jzcy4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBTdHJpcCAucmVsYS5zYnNzIGlmIHdlIGRvbid0Ci0JdXNlIGl0LiAgQ29ycmVjdCB0eXBvIG9mIC5yZWxhLnNkYXRhMi4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBHZW5lcmF0ZSByZWxvYyB0byB3aGVyZSB3ZQotCXB1dCB0aGUgZGF0YSwgd2hpY2ggbWF5IG5vdyBiZSBpbiAuc2Jzcy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQSBTREFSRUwxNiByZWxvYyBjYW4gYmUgaW4gZHluc2Jzcy4KLQkoZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWZpbmUgYXMKLQlwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBEb24ndCBlbWl0IFJfUFBDX1JFTCogcmVsb2NzCi0JYWdhaW5zdCBfR0xPQkFMX09GRlNFVF9UQUJMRV8uCi0gCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBlbWl0IFJfUFBDX1JFTDMyIHJlbG9jcyBpbgotCXNoYXJlZCBsaWJyYXJpZXMgd2hpY2ggcmVmZXIgdG8gbG9jYWwgc3ltYm9scy4gIE1ha2Ugc3VyZSB0aGF0IHRoZQotCXRlc3QgZm9yIGFsbG9jYXRpbmcgc3BhY2UgZm9yIGEgcmVsb2MgaW4gYSBzaGFyZWQgb2JqZWN0IGlzIHRoZQotCXNhbWUgYXMgdGhlIHRlc3QgZm9yIGVtaXR0aW5nIGEgcmVsb2MuCi0KLVRodSBKYW4gMjkgMTU6NTU6MzUgMTk5OCAgSi5KLiB2YW4gZGVyIEhlaWpkZW4gIDxKLkoudmFuZGVySGVpamRlbkBzdHVkZW50LnV0d2VudGUubmw+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl0tKi1taW5ndzMyKik6IE5ldyB0YXJnZXQuCi0JKiBhY2luY2x1ZGUubTQgKEJGRF9CSU5BUllfT1BFTik6IENoZWNrIGZvciBtaW5ndzMyLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgSmFuIDI4IDEzOjQxOjI2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwKTogT25seSBjaGVjayB0aGUgc3RydGFiIGlmIHdlCi0JaGF2ZSBhIGJmZF9vYmplY3QuCi0KLVR1ZSBKYW4gMjcgMjE6NDM6NTUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCVNwYXJjIHY5IEFCSSBjb21wbGlhbnQgUExUOgotCSogZWxmNjQtc3BhcmMuYyAoUExUX0hFQURFUl9TSVpFKTogVjkgQUJJIHVzZXMgNCBlbnRyaWVzLgotCShwbHRfdGVtcGxhdGVzLCBzcGFyYzY0X2VsZl9idWlsZF9wbHRfZW50cnkpOiBEZWxldGUuCi0JKExBUkdFX1BMVF9USFJFU0hPTEQpOiBOZXcgZGVmaW5lLgotCShHT1RfUkVTRVJWRURfRU5UUklFUyk6IFY5IEFCSSBvbmx5IHVzZXMgMS4KLQkoc3BhcmM2NF9lbGZfYnVpbGRfcGx0KTogTmV3IGZ1bmN0aW9uLgotCShzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0KTogTGlrZXdpc2UuCi0JKHNwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0KTogTGlrZXdpc2UuCi0JKHNwYXJjNjRfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENoYW5nZSBoLT5wbHRfb2Zmc2V0IHRvCi0JY29udGFpbiB0aGUgaW5kZXggZm9yIGNvbnZlbmllbmNlLiAgU2tpcCB0aGUgaW5pdGlhbCBlbnRyaWVzCi0JaW4gLnJlbGEucGx0LgotCShzcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBaZXJvIHRoZSBhbGxvY2F0ZWQgY29udGVudHMKLQltZW1vcnkgZm9yIHRoZSBiZW5lZml0IG9mIC5yZWxhLnBsdC4KLQkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENhbGwgc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldC4KLQkoc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogS2lsbCB0ZW1wbGF0ZSBzdHVmZi4gIFVzZQotCXNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQgJiBzcGFyYzY0X2VsZl9wbHRfcHRyX29mZnNldCBmb3IgcmVsb2MuCi0JKHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRFRfUExUR09UIHBvaW50cyB0byAucGx0LgotCUNhbGwgc3BhcmM2NF9lbGZfYnVpbGRfcGx0LgotCShlbGZfYmFja2VuZF93YW50X2dvdF9wbHQpOiBOby4KLQkoZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5KTogTm8uCi0JKGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQpOiA4LgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXApOiBOZXcgZnVuY3Rpb247IGZyZWUgdGhlIHNoc3RydGFiLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cCk6IERlY2xhcmUgaXQuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2Nsb3NlX2FuZF9jbGVhbnVwKTogQXJyYW5nZSBmb3IgaXQKLQl0byBiZSBjYWxsZWQuCi0KLVR1ZSBKYW4gMjcgMjE6NDU6MTUgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9taXBzKik6IEFkZCBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyBNSVBTCi0JcHJvY2Vzc29ycy4KLQkqIGNwdS1taXBzLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgbWlwcyB2YXJpYW50cy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotVHVlIEphbiAyNyAxNTowNjowNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogUHJlc2VydmUgdGhlIGNvbnRlbnRzIG9mCi0JdDJhM19iX2luc24uCi0KLVR1ZSBKYW4gMjcgMTI6NDc6MjcgMTk5OCAgUm9iZXJ0IExpcGUgIDxyb2JlcnRsQGRnaWkuY29tPgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtc2NvMy4ydjUqKTogRUxGIG5vdyB0aGUgZGVmYXVsdC4KLQkoaVszNDU2XTg2c2NvMy4ydjUqY29mZik6IE5ldyB0YXJnZXQuCi0KLU1vbiBKYW4gMjYgMTU6NDE6MzAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQgd2l0aCBjaGFuZ2VzIHRvIGNoZXctLXRhYiBleHBhbnNpb24uCi0KLVRodSBKYW4gMjIgMjE6MjY6NDggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9nZXRfZXJyb3JfaGFuZGxlcik6IEFkZCBvcnRob2dvbmFsIGZ1bmN0aW9uLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCi1UaHUgSmFuIDIyIDIxOjEzOjM5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRla2hleC5jICh0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgZm9yIG5vIHN5bWJvbHMuCi0KLVdlZCBKYW4gMjEgMjE6MTk6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvKTogSWYgQ09GRl9XSVRIX1BFLCBkb24ndAotIAlhZGp1c3QgYWRkZW5kIGZvciBhbiBvdXRwdXQgY29tbW9uIHN5bWJvbCAoZnJvbSBKaW1teSBCbGFpcgotIAk8amltbXliQHdycy5jb20+KS4gIElmIENPRkZfV0lUSF9QRSwgYWRqdXN0IGFkZGVuZCBmb3IgUEMgcmVsYXRpdmUKLSAJZGVmaW5lZCBzeW1ib2wgdG8gY291bnRlcmFjdCBhZGp1c3RtZW50IG1hZGUgaW4gZ2VuZXJpYyByZWxvY2F0aW9uCi0gCWNvZGUuCi0KLQkqIGR3YXJmMi5jOiBJbmNsdWRlIHN5c2RlcC5oLCBub3Qgc3RkaW8uaCBhbmQgc3RkbGliLmguCi0KLVdlZCBKYW4gMjEgMjE6MTY6MDYgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb2ZmLW04OGsuYyAoR0VUX1NDTkRIUl9OUkVMT0MpOiBGaXggdHlwbyBpbiBtYWNybyBuYW1lLgotCShHRVRfU0NOREhSX05MTk5PKTogTGlrZXdpc2UuCi0KLU1vbiBKYW4gMTkgMTI6NDk6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcHUtc2guYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENvcnJlY3QgbmV4dCBmaWVsZCBvZiBzaDNlLgotCi1XZWQgSmFuIDE0IDE3OjIzOjI3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYzogQWRkIG1hY3JvcyB0byBoYW5kbGUgTk9QIGluc2VydGlvbi4KLQotV2VkIEphbiAxNCAxNjoxNToyMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbWFya19zeW1ib2wpOiBEb24ndCBtYXJrIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCSh4Y29mZl9tYXJrKTogTGlrZXdpc2UuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IE1hcmsgYWJzb2x1dGUgc3ltYm9scy4KLQotV2VkIEphbiAxNCAxNjowMzoxMSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBib3V0LmMgKGJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNvcnQgc3ltYm9scyBiZWZvcmUgb3V0cHV0Ci0JdG8ga2VlcCB7Q0FMTCxCQUx9TkFNRSBzeW1ib2xzIGFkamFjZW50LgotCShiX291dF9zeW1ib2xfY21wKTogTmV3IGZ1bmN0aW9uLgotCi1Gb3Igb2xkZXIgY2hhbmdlcyBzZWUgQ2hhbmdlTG9nLTk2OTcKLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JmZC9DaGFuZ2VMb2ctOTE5MyBiL2JmZC9DaGFuZ2VMb2ctOTE5MwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhZjkzMS4uMDAwMDAwMAotLS0gYS9iZmQvQ2hhbmdlTG9nLTkxOTMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODUxICswLDAgQEAKLUZyaSBEZWMgMzEgMTY6MjM6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JTWlub3IgY2xlYW51cHMgc3VnZ2VzdGVkIGJ5IENvZGVDZW50ZXIuCi0JKiBhb3V0eC5oLCBjb2ZmZ2VuLmMsIGVjb2ZmLmMsIGVjb2ZmbGluay5jLCBlbGYuYywgbGliYmZkLmMsCi0JbGlua2VyLmMsIHJlbG9jLmMsIHNlY3Rpb24uYywgc3JlYy5jOiBBZGRlZCAvKkFSR1NVU0VEKi8gYXMKLQlhcHByb3ByaWF0ZS4KLQkqIGFvdXR4LmggKHN0cnVjdCBleHRlcm5hbF9leGVjKTogUmVtb3ZlZCB1bm5lY2Vzc2FyeSBkZWNsYXJhdGlvbi4KLQkoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBTZXQgc29tZSB0ZGF0YSBwb2ludGVycyB0byBOVUxMLgotCShhZGp1c3Rfel9tYWdpYyk6IFJlbW92ZWQgdXNlbGVzcyB2YXJpYWJsZSBkYXRhX3ZtYS4KLQkoc3RyaW5ndGFiX2luaXQpOiBJbml0aWFsaXplIGhhc2hfemVyby4KLQkoYWRkX3RvX3N0cmluZ3RhYik6IFJlbW92ZWQgdW51c2VkIGZvdXJ0aCBhcmd1bWVudC4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkpOiBSZW1vdmVkIHVzZWxlc3MgdmFyaWFibGUKLQlyX2FkZGVuZC4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb24pOiBBZGRlZCBzb21lIGNhc3RzLgotCSogYXJjaGl2ZS5jIChnZXRfZXh0ZW5kZWRfYXJlbHRfZmlsZW5hbWUsIGRvX3NsdXJwX2NvZmZfYXJtYXAsCi0JYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0sIGJzZF93cml0ZV9hcm1hcCwgY29mZl93cml0ZV9hcm1hcCk6Ci0JTWlub3IgY29kZSByZXdyaXRpbmcgdG8gbWFrZSBpdCBtb3JlIEMgbGlrZS4KLQkoZG9fc2x1cnBfYnNkX2FybWFwKTogQWRkZWQgc29tZSBjYXN0cy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZWQgdXNlbGVzcyB2YXJpYWJsZQotCXNjbl9iYXNlLgotCShlY29mZl93cml0ZV9hcm1hcCk6IEFkZGVkIHNvbWUgY2FzdHMuICBVc2UgIiIgcmF0aGVyIHRoYW4gIlwwIi4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfd3JpdGVfZGVidWcpOiBBZGRlZCBhIGNhc3QuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBpbnRlcm5hbF9leGVjKTogUmVtb3ZlZCB1bm5lY2Vzc2FyeQotCWRlY2xhcmF0aW9uLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19pbmRpcmVjdF9saW5rX29yZGVyKTogQWRkZWQgYSBjYXN0LgotCSogb3BuY2xzLmMgKG5ld19iZmQpOiBSZW1vdmVkIGEgY2FzdC4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFkZGVkCi0Jc29tZSBjYXN0cy4KLQkqIHNyZWMuYyAoaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmVkIHVzZWxlc3MKLQl2YXJpYWJsZSBieXRlc193cml0dGVuLgotCi1GcmkgRGVjIDMxIDExOjQ2OjEzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Nm1hY2gzLmMgKE5fVFhUQUREUik6IERvbid0IGRlZmluZSBhZnRlciBhbGwuCi0JKFRFWFRfU1RBUlRfQUREUik6IERvbid0IGluY2x1ZGUgZXhlYyBoZWFkZXIgc2l6ZSBpbiB2YWx1ZS4KLQotVGh1IERlYyAzMCAxNTo0Nzo1NCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGkzODZtYWNoMy5jIChOX1RYVEFERFIpOiBEZWZpbmUuCi0KLVRodSBEZWMgMzAgMTM6Mzc6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JRXh0ZW5zaXZlIGNoYW5nZXMgdG8gbW92ZSB0aGUgYnVsayBvZiB0aGUgbGlua2VyIGludG8gQkZEIHNvIHRoYXQKLQltb3JlIGVmZmljaWVudCBiYWNrZW5kIGNvZGUgY2FuIGJlIHdyaXR0ZW4gZm9yIHNwZWNpZmljIG9iamVjdAotCWZpbGVzLiAgT25seSBleGlzdGluZyBlZmZpY2llbnQgYmFja2VuZCBpcyBhLm91dC4KLQkqIHNlY2xldC5jLCBzZWNsZXQuaDogUmVtb3ZlZC4KLQkqIGhhc2guYywgbGlua2VyLmMsIGdlbmxpbmsuaDogTmV3IGZpbGVzLgotCSogYmZkLWluLmg6IFJlbW92ZWQgYmZkX2Vycm9yX3ZlY3Rvci4gIERlY2xhcmVkIGhhc2ggdGFibGUKLQlzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMuCi0JKEpVTVBfVEFCTEUpOiBSZW1vdmVkIGJmZF9zZWNsZXRfbGluaywgYWRkZWQKLQliZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgYmZkX2xpbmtfYWRkX3N5bWJvbHMgYW5kCi0JYmZkX2ZpbmFsX2xpbmsuCi0JKiBBbGwgYmFja2VuZHM6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGRlZCBsaW5rX25leHQgYW5kIGFyY2hpdmVfcGFzcyBmaWVsZHMuCi0JUmVtb3ZlZCBsZF9zeW1ib2xzIGZpZWxkLgotCShiZmRfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uLCBiZmRfdW5kZWZpbmVkX3N5bWJvbCwKLQliZmRfcmVsb2NfdmFsdWVfdHJ1bmNhdGVkLCBiZmRfcmVsb2NfaXNfZGFuZ2Vyb3VzLAotCWJmZF9lcnJvcl92ZWN0b3IpOiBSZW1vdmVkLgotCShiZmRfZGVmYXVsdF9lcnJvcl90cmFwLCBiZmRfZXJyb3JfdHJhcCwKLQliZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsdHJhcCk6IFJlbW92ZWQuCi0JKGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBQYXNzIGxpbmtfaW5mby4gIFBhc3MKLQlsaW5rX29yZGVyIGluc3RlYWQgb2Ygc2VjbGV0LiAgUGFzcyBzeW1ib2xzLgotCShiZmRfcmVsYXhfc2VjdGlvbik6IFBhc3MgbGlua19pbmZvLgotCShiZmRfc2VjbGV0X2xpbmspOiBSZW1vdmVkLgotCShiZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgYmZkX2xpbmtfYWRkX3N5bWJvbHMsCi0JYmZkX2ZpbmFsX2xpbmspOiBOZXcgbWFjcm9zLgotCSogbGliYmZkLWluLmg6IElmIF9fR05VQ19fIGlzIGRlZmluZWQgYW5kIGFsbG9jYSBpcyBub3QsIGRlZmluZQotCWFsbG9jYSBhcyBfX2J1aWx0aW5fYWxsb2NhLiAgRGVjbGFyZSBpbnRlcm5hbCBsaW5raW5nIGZ1bmN0aW9ucy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmMgKGJmZF9zZWVrKTogQ29tbWVudCBvdXQgZnNlZWsgYXNzZXJ0aW9uLiAgSXQncyB3b3JrZWQKLQlmb3IgbW9udGhzLgotCSogcmVsb2MuYyAocmVsb2NfaG93dG9fdHlwZSk6IEFkZGVkIGVycm9yX21lc3NhZ2UgYXJndW1lbnQgdG8KLQlzcGVjaWFsX2Z1bmN0aW9uIGZpZWxkLiAgQ2hhbmdlZCBhbGwgY2FsbGVycyBhbmQgYWxsIGRlZmluaXRpb25zLgotCShiZmRfZ2V0X3JlbG9jX3NpemUpOiBNYWtlIGFyZ3VtZW50IGEgY29uc3QgcG9pbnRlci4KLQkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEFkZCBlcnJvcl9tZXNzYWdlIGFyZ3VtZW50IHRvIGhvbGQKLQlzdHJpbmcgc2V0IGlmIHJldHVybiB2YWx1ZSBpZiBiZmRfcmVsb2NfZGFuZ2Vyb3VzLiAgQ2hhbmdlZCBhbGwKLQljYWxsZXJzLgotCShfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUsIF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBOZXcgZnVuY3Rpb25zLgotCSogc2VjdGlvbi5jIChhc2VjdGlvbik6IFJlbmFtZWQgc2VjbGV0c19oZWFkIGFuZCBzZWNsZXRzX3RhaWwgdG8KLQlsaW5rX29yZGVyX2hlYWQgYW5kIGxpbmtfb3JkZXJfdGFpbC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlcGxhY2VkIHNlY2xldCBhcmd1bWVudCB3aXRoIGxpbmtfaW5mbwotCWFuZCBsaW5rX29yZGVyIGFuZCBzeW1ib2xzIGFyZ3VtZW50cyBpbgotCWJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuICBBZGRlZCBzeW1ib2xzIGFyZ3VtZW50IHRvCi0JYmZkX3JlbGF4X3NlY3Rpb24uICBSZW1vdmVkIGJmZF9zZWNsZXRfbGluay4gIEFkZGVkCi0JYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIGJmZF9saW5rX2FkZF9zeW1ib2xzIGFuZAotCWJmZF9maW5hbF9saW5rLgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBBZGRlZCBleHRlcm5hbF9zeW1zLAotCWV4dGVybmFsX3N5bV9jb3VudCwgZXh0ZXJuYWxfc3RyaW5ncywgc3ltX2hhc2hlcyBmaWVsZHMuCi0JKG9ial9hb3V0X2V4dGVybmFsX3N5bXMsIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCwKLQlvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzLCBvYmpfYW91dF9zeW1faGFzaGVzKTogTmV3IGFjY2Vzc29yCi0JbWFjcm9zLgotCShXUklURV9IRUFERVJTKTogT25seSBvdXRwdXQgc3ltYm9scyBpZiBvdXRzeW1ib2xzIGlzIG5vdCBOVUxMLgotCSogYW91dHguaDogV3JvdGUgbmV3IGJhY2sgZW5kIGxpbmtlciByb3V0aW5lcy4KLQkodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBSZXR1cm4gYm9vbGVhbiB2YWx1ZS4gIERvbid0IHVzZQotCWJmZF9lcnJvcl92ZWN0b3IuCi0JKE5BTUUoYW91dCx3cml0ZV9zeW1zKSk6IFJldHVybiBib29sZWFuIHZhbHVlLiAgQ2hlY2sgcmV0dXJuIHZhbHVlCi0Jb2YgdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MgYW5kIGJmZF93cml0ZS4KLQkqIGFvdXQtdGFyZ2V0LmggKGZpbmFsX2xpbmtfY2FsbGJhY2spOiBOZXcgZnVuY3Rpb24uCi0JKE1ZX2JmZF9maW5hbF9saW5rKTogTmV3IGZ1bmN0aW9uLgotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybgotCXZhbHVlIG9mIGFvdXRfMzJfd3JpdGVfc3ltcy4KLQkqIGhwMzAwaHB1eC5jIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogTGlrZXdpc2UuCi0JKiBpMzg2bHlueC5jIChXUklURV9IRUFERVJTKTogTGlrZXdpc2UuCi0JKiBsaWJhb3V0LmggKFdSSVRFX0hFQURFUlMpOiBMaWtld2lzZS4KLQkqIGJvdXQuYzogQ2hhbmdlZCBmdW5jdGlvbnMgdG8gdXNlIGxpbmtfaW5mby0+Y2FsbGJhY2tzIHJhdGhlcgotCXRoYW4gYmZkX2Vycm9yX3ZlY3RvciwgYW5kIGxpbmtfb3JkZXJzIHJhdGhlciB0aGFuIHNlY2xldHMuCi0JKiBjb2ZmLWFscGhhLmM6IExpa2V3aXNlLgotCSogY29mZi1oODMwMC5jOiBMaWtld2lzZS4KLQkqIGNvZmYtaDg1MDAuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLXNoLmM6IExpa2V3aXNlLgotCSogY29mZi16OGsuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmM6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jOiBMaWtld2lzZS4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTG9vawotCXVwIF9ncCBpbiB0aGUgaGFzaCB0YWJsZSByYXRoZXIgdGhhbiBpbiBvdXRzeW1ib2xzLgotCSogY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpOiBQYXNzIGVycm9ycyBiYWNrIGluIG5ldyBlcnJvcl9tZXNzYWdlCi0JYXJndW1lbnQgcmF0aGVyIHRoYW4gcHJpbnRpbmcgdGhlbS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBUYWtlIGxpbmtfaW5mbyBhbmQKLQlsaW5rX29yZGVyIGFyZ3VtZW50cyByYXRoZXIgdGhhbiBzZWNsZXQuICBDaGFuZ2VkIGFsbCB1c2VzIGFuZAotCWRlZmluaXRpb25zLgotCShiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKTogUGFzcyBsaW5rX2luZm8gYXJndW1lbnRzLiAgQ2hhbmdlZAotCWFsbCB1c2VzIGFuZCBkZWZpbml0aW9ucy4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dldF9leHRyKTogSWYgc3ltYm9sIGlzIGRlZmluZWQgYnkgbGlua2VyLCBidXQKLQlub3QgYnkgRUNPRkYsIG1ha2UgaXQgc2NBYnMuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogUmVuYW1lZCBmcm9tIGVjb2ZmX2JmZF9zZWNsZXRfbGluayBhbmQKLQlyZXdyaXR0ZW4uCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBSZW5hbWVkIGZyb20KLQltaXBzX2VsZl9zZWNsZXRfbGluayBhbmQgcmV3cml0dGVuLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24pOiBBZGRlZCBsaW5rX2luZm8KLQlmaWVsZC4KLQkobmV3X3N0dWIsIGFkZF9zdHViX2J5X25hbWUsIGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViLAotCWhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIsIGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6Ci0JQWRkZWQgbGlua19pbmZvIGFyZ3VtZW50cy4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBxdWl0IGlmIG91dHN5bWJvbHMgaXMKLQlub3QgTlVMTC4KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUgcmF0aGVyIHRoYW4KLQl1c2luZyBiZmRfZXJyb3JfdmVjdG9yLgotCShvYXN5c193cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQlvYXN5c193cml0ZV9zZWN0aW9ucy4KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6IERvbid0IGRlY2xhcmUgcXNvcnQgb3Igc3RydG9sLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfTElCUyk6IFJlbW92ZWQgc2VjbGV0Lm8uICBBZGRlZCBoYXNoLm8gYW5kIGxpbmtlci5vLgotCShDRklMRVMpOiBSZW1vdmVkIHNlY2xldC5jLiAgQWRkZWQgaGFzaC5jIGFuZCBsaW5rZXIuYy4KLQkoSEZJTEVTKTogUmVtb3ZlZCBzZWNsZXQuaC4gIEFkZGVkIGdlbmxpbmsuaC4KLQotVGh1IERlYyAzMCAwNzo0MTozNiAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogIFJldHVybiB6ZXJvIGZpbGxlZCBidWZmZXIKLQlpZiBzZWN0aW9uIGhhcyBubyBjb250ZW50cy4KLQotVHVlIERlYyAyOCAxMjo0Mzo1NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChiZmRfZWxmX2dlbmVyaWNfcmVsb2MpOiBJZiB0aGlzIGlzIG5vdCBhbiBpbnBsYWNlIHJlbG9jLAotCXRoZW4gc2tpcCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGV2ZW4gaWYgdGhlIGFkZGVuZCBpcyBub24temVyby4KLQotVHVlIERlYyAyMSAwOToyMjoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKSBbU1dBUF9PVVRfUkVMT0NfT0ZGU0VUXTogQ29weQotCWFkZGVuZCB0byByX29mZnNldCBmaWVsZC4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZGVkIGNvZmYtc3BhcmMuYy4gIFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBjb2ZmLXNwYXJjLmMgKFNXQVBfSU5fUkVMT0NfT0ZGU0VULCBTV0FQX09VVF9SRUxPQ19PRkZTRVQsCi0JQ0FMQ19BRERFTkQpOiBEZWZpbmUuCi0KLQkqIGFpeDM4Ni1jb3JlLmMgKGFpeDM4Nl9jb3JlX2ZpbGVfcCk6IFVzZSBjZF9yZWdzWzBdIGZvciBjb21wdXRpbmcKLQl0aGUgb2Zmc2V0b2YgYmVjYXVzZSBBSVggL2Jpbi9jYyBkb2VzIG5vdCBsaWtlIHRvIHRha2UgdGhlIGFkZHJlc3MKLQlvZiBhbiBhcnJheS4gIChGcm9tIE1pbmggVHJhbi1MZS4pCi0KLVRodSBEZWMgMTYgMTM6MDY6MzIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIFRodSBEZWMgMTYgMTU6NDE6MDYgMTk5MyAgUGV0ZXIgSG9vZ2VuYm9vbSAgKGhvb2dlbkBjcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IE1ha2Ugc3VyZSB0byBjb3B5Ci0JdGhlIHJldHVybiBwb2ludGVyIGludG8gJXIyIGlmIG5vIGp1bXAtaW4tY2FsbC1kZWxheS1zbG90Ci0Jb3B0aW1pemF0aW9uIHdhcyBkb25lLgotCi0JKiBob3N0cy9ocDMwMGJzZC5oOiBDb3JyZWN0bHkgaWRlbnRpZnkgNC4zQlNEIHZzIDQuNEJTRC4KLQotV2VkIERlYyAxNSAwODowNDoxNiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6ICh0aW1lKTogRG9uJ3QgZGVjbGFyZTsgY29uZmxpY3RzIG9uIE1hY2gzLgotCi0JKiBob3N0cy9pMzg2bWFjaDMuaCAoSE9TVF9QQUdFX1NJWkUpOiBTZXQgdG8gMSB0byBhdm9pZCBwYWRkaW5nLgotCShIT1NUX1NFR01FTlRfU0laRSk6IFNldCB0byAwIGZvciBzYW1lIHJlYXNvbi4KLQotCSogaTM4Nm1hY2gzLmMgKFBBR0VfU0laRSwgU0VHTUVOVF9TSVpFKTogU2FtZSBjaGFuZ2VzIGFzIGFib3ZlLgotCShURVhUX1NUQVJUX0FERFIpOiBDb3JyZWN0LgotCShNWV9iYWNrZW5kX2RhdGEpOiBEZWZpbmUuCi0KLQkqIGFvdXR4LmggKGFkanVzdF9vX21hZ2ljLCBhZGp1c3Rfel9tYWdpYywgYWRqdXN0X25fbWFnaWMpOgotCU5ldyBmdW5jdGlvbnM7IGNvZGUgbW92ZWQgZnJvbSBhb3V0XzxzaXplPl9hZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMuCi0KLVR1ZSBEZWMgMTQgMjE6NDg6MzMgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLSAgICAgICAgKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBGaXggdGhpbmtvcyBpbiBhdXhpbGlhcnkgaGVhZGVyCi0Jc3VwcG9ydC4KLQkoYmZkX3NvbV9hdHRhY2hfYXV4X2hkcik6IExpa2V3aXNlLgotCi1Nb24gRGVjIDEzIDIzOjM0OjQ4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogSGFuZGxlICdUJyBmaWVsZAotCXNlbGVjdG9ycyBmb3IgUElDIGNvZGUuCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSAnVCcgZmllbGQgc2VsZWN0b3JzLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfRExUX1JFTCwgUl9GU0VMLCBSX1JTRUwsIFJfTFNFTAotCXJlbG9jYXRpb25zIG5lZWRlZCBieSBQSUMuCi0KLVR1ZSBEZWMgIDcgMTU6NDc6NTEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oOiAgRml4ZXMgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuLi4KLQotVHVlIERlYyAgNyAxNToxMDo1NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpYm5sbS5oIChubG1fYmFja2VuZF9kYXRhKTogUmVtb3ZlZCBtYWNybyBkZWZpbml0aW9uLgotCShubG1fYWxwaGFfYmFja2VuZF9kYXRhKTogQWRqdXN0ZWQgYWNjb3JkaW5nbHkuCi0KLVN1biBEZWMgIDUgMTk6MzI6MDggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEZsZXNoIG91dCBjb2RlIGZvciBoYW5kbGluZyBzaW1wbGUKLQlhdXhpbGlhcnkgaGVhZGVycy4KLQkoYmZkX3NvbV9hdHRhY2hfYXV4X2hkcik6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmggKHN0cnVjdCBzb21kYXRhKTogQWRkIGZpZWxkcyBmb3IgYXR0YWNoaW5nIHZlcnNpb24gYW5kCi0JY29weXJpZ2h0IGhlYWRlcnMuICBBZGQgYWNjZXNzb3IgbWFjcm9zLgotCi0JKiBzb20uYyAoUl9ETFRfUkVMLCBSX0FVWF9VTldJTkQsIFJfU0VDX1NUTVQpOiBBZGQgcHJvdGVjdGVkCi0JZGVmaW5pdGlvbnMgZm9yIG9sZCB2ZXJzaW9ucyBvZiBIUFVYIHdoaWNoIGZhaWwgdG8gZGVmaW5lIHRoZW0uCi0JKHNvbV9ocHBhX2hvd3RvX3RhbGJlKTogQWRkIFJfRExUX1JFTCwgUl9BVVhfVU5XSU5ELCBhbmQgUl9TRUNfU1RNVAotCW5vdyB0aGF0IHRoZXkncmUgc2FmZS4gIERlbGV0ZSBib2d1cyBSX1NUQVRFTUVOVCByZWxvY2F0aW9ucy4KLQotCSogc29tLmMgKHNvbV9ocHBhX2hvd3RvX3RhYmxlKTogQWRkIG1pc3NpbmcgUl9FTkRfVFJZLiAgRGVsZXRlIAotCWV4dHJhIFJfREFUQV9PVkVSUklERS4KLQkoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBHZW5lcmF0ZSBhIHJlbG9jYXRpb24gZm9yIHRoZSByb3VuZGluZwotCW1vZGUgc2VsZWN0b3IgaWYgbmVlZGVkLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIHJlcXVlc3RzIGZvciBhIGNoYW5nZSBpbiB0aGUgZGVmYXVsdAotCXJvdW5kaW5nIG1vZGUuICBSb3VuZGluZyBtb2RlcyBkbyBub3QgY29uc3VtZSBpbnB1dCBieXRlcywgYnV0Ci0JYXJlIGp1c3QgbWFya2VycyBtdWNoIGxpa2UgUl9FTlRSWSBhbmQgUl9FWElULgotCi1TYXQgRGVjICA0IDE5OjQwOjMyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JRnJpIERlYyAgMyAwOTo1NToxNyAxOTkzICBQZXRlIEhvb2dlbmJvb20gIChob29nZW5AY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX3JlbG9jKTogIERvIG5vdCBkbyBjb2RlIHJlb3JkZXJpbmcgd2hlbgotCXRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gYXMgb3JpZ2luYWxseSBiZWVuIG51bGxpZmllZC4KLQlocHBhX2VsZl9yZWxvYyk6ICBBdm9pZCB1c2VsZXNzIGNhbGwgdG8gYmZkX3B1dF8zMiAoKSBpbiB0aGUKLQljYXNlIG9mIG5vIGNvZGUgcmVvcmRlcmluZyBkdWUgdG8gYW4gTERPIGluc3RydWN0aW9uIGluIHRoZQotCWRlbGF5IHNsb3Qgb2YgdGhlIGJyYW5jaC4gIE1ha2Ugc3VyZSB0byByZWxvY2F0ZSB0aGUgY29ycmVjdAotCWluc3RydWN0aW9uLiAgRG8gbm90IHBlcmZvcm0gaW5zdHJ1Y3Rpb24gcmVvcmRlcmluZyBmb3IgbWlsbGljb2RlCi0JY2FsbHMuCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogIENoYW5nZSB0aGUgcmVsb2NhdGlvbiB0eXBlCi0JdG8gUl9IUFBBX1NUVUJfQ0FMTF8xNyB3aGVuIHNwZWNpYWwgcHJvY2Vzc2luZyBtaWdodCBiZSBuZWVkZWQuCi0JKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBQcmV2ZW50IGNvZGUgcmVvcmRlcmluZyBvbgotCWEgY2FsbCBmcm9tIGEgbGlua2VyIHN0dWIgdG8gYW5vdGhlciBsaW5rZXIgc3R1YiBhbmQgZm9yIG1pbGxpY29kZQotCWNhbGxzLiAgRG8gbm90IHRyYXNoIHRoZSByZXR1cm4gcmVnaXN0ZXIgZm9yIGNhbGxzIGZyb20gb25lIGxpbmtlcgotCXN0dWIgdG8gYSBzZWNvbmQgbGlua2VyIHN0dWIuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogIFBMQUJFTCBhbmQgRExUCi0JcmVsb2NhdGlvbnMgYXJlIG5vdCBwYy1yZWxhdGl2ZS4KLQotCSogaHBwYV9zdHVicy5oOiAoQkxFX05fWFhYXzBfMzEpOiAgTmV3IGluc3RydWN0aW9uIHVzZWQgaW4KLQlsaW5rZXIgc3R1YiBjb2RlLiAKLQkoQ09QWV8yXzMxKTogIExpa2V3aXNlLgotCi1GcmkgRGVjICAzIDE4OjQwOjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3NvbGFyaXMyLm1oIChIREVGSU5FUyk6IFJlbW92ZSAtRGNvbnN0PQotCSogaG9zdHMvc29sYXJpcy5oOiBJZiBub3QgX19HTlVDX18sIGRlZmluZSBjb25zdCBhcyBlbXB0eS4KLQotVGh1IERlYyAgMiAxNTo0MzozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmM6IEFkZGVkIHZhcmlvdXMgY2FzdHMgZm9yIDMyLzY0IGJpdCBjcm9zcyB0YXJnZXRpbmcuCi0JKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBTZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGZvciB0aGUgLnJlZ2luZm8KLQlzZWN0aW9uIHNvIHRoYXQgdGhlIGxpbmtlciBpZ25vcmVzIGl0LgotCSogZWNvZmZsaW5rLmM6IEFkZGVkIHZhcmlvdXMgY2FzdHMgZm9yIDMyLzY0IGJpdCBjcm9zcyB0YXJnZXRpbmcuCi0JKGVjb2ZmX2FkZF9ieXRlcyk6IENoYW5nZWQgbmVlZCBhcmd1bWVudCB0byBzaXplX3QuCi0JKGJmZF9lY29mZl9kZWJ1Z19saW5rX290aGVyKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JZWNvZmZfYWRkX3N0cmluZy4KLQotCSogbGliYmZkLWluLmggKG5ld19iZmQpOiBVc2Ugdm9pZCByYXRoZXIgdGhhbiBhbiBlbXB0eSBwYXJhbWV0ZXIKLQlsaXN0LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgbmxtX29ial90ZGF0YSk6IE5ldyBmaWVsZCBiYWNrZW5kX2RhdGEuCi0JKG5sbV9iYWNrZW5kX2RhdGEsIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEpOiBOZXcgYWNjZXNzb3IgbWFjcm9zLgotCShzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IE5ldyBmaWVsZCBub191bmluaXRpYWxpemVkX2RhdGEuCi0JKG5sbV9ub191bmluaXRpYWxpemVkX2RhdGEpOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0JKiBubG1jb2RlLmggKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBIYW5kbGUKLQlub191bmluaXRpYWxpemVkX2RhdGEuCi0JKG5sbV9leHRlcm5hbF9yZWxvY19jb21wYXJlKTogU29ydCByZWxvY3MgYnkgYWRkcmVzcyBmb3IgYQotCXBhcnRpY3VsYXIgc3ltYm9sLCB0byBtYWtlIHRoZSBzb3J0IG1vcmUgc3RhYmxlLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FzdCB0aGUgYXJndW1lbnRzIHRvIHFzb3J0LiAgR2V0IHRoZQotCXZhbHVlIG9mIGEgZGVidWdnaW5nIHN5bWJvbCB0aGUgc2FtZSB3YXkgd2UgZ2V0IHRoZSB2YWx1ZSBvZiBhCi0Jbm9ybWFsIHN5bWJvbC4KLQkqIG5sbTMyLWFscGhhLmM6IFZhcmlvdXMgY2hhbmdlcy4gIFdyaXRlIG91dCBHUCBhbmQgLmxpdGEgcmVsb2NzLgotCVNldCBub191bmluaXRpYWxpemVkX2RhdGEgdG8gdHJ1ZS4KLQkqIG5sbTMyLWkzODYuYyAobmxtMzJfaTM4Nl9iYWNrZW5kKSwgbmxtMzItc3BhcmMuYwotCShubG0zMl9zcGFyY19iYWNrZW5kKTogU2V0IG5vX3VuaW5pdGlhbGl6ZWRfZGF0YSBmaWVsZCBmYWxzZS4KLQkqIG5sbXN3YXAuaCAobmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCk6IFplcm8gb3V0IGRlc3RpbmF0aW9uCi0JYmVmb3JlIGZpbGxpbmcgaXQgaW4uCi0KLVdlZCBEZWMgIDEgMjE6NDc6NTggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2VjdGlvbl90eXBlLCBzb21fZGVjb2RlX3N5bWNhbHNzKTogTmV3IGZ1bmN0aW9ucy4KLQkoc29tX2dldF9zeW1ib2xfaW5mbyk6IFVzZSB0aGVtLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IHRoZSBzZWN0aW9uIG9mIGNvbW1vbiBhbmQgdW5kZWZpbmVkCi0Jc3ltYm9scyBjb3JyZWN0bHkuCi0KLVdlZCBEZWMgIDEgMTQ6MTU6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogSW5pdGlhbGl6ZSBsb2NhbCB2YXIgTEFTVF9TWU1fSURYLCB0bwotCW1ha2UgZ2NjIGhhcHB5LgotCi0JKiBtaXBzYnNkLmM6IENoYW5nZXMgZnJvbSBSYWxwaCBDYW1wYmVsbDoKLQkobWlwc19ob3d0b190YWJsZV9leHQpOiBNSVBTX1JFTE9DX0xPMTYgc2hvdWxkIHVzZQotCWNvbXBsYWluX292ZXJmbG93X2RvbnQuCi0JKGFvdXRfbWlwc18qX3ZlYyk6IE1ha2UgbmFtZSB1c2UgImEub3V0IiBpbnN0ZWFkIG9mICJhb3V0IiwgdG8KLQltYWtlIGdkYiBoYXBweS4KLQotCSogYmZkLmMgKGJmZF9lcnJtc2dzKTogUmV3b3JkIGludmFsaWQtdGFyZ2V0IG1lc3NhZ2UuCi0KLQkqIGNvbmZpZy5iZmQ6IEZvciBzcGFyYyotKi1jb2ZmLCB1c2Ugc3BhcmMtY29mZi4KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIHNwYXJjY29mZl92ZWMuCi0JKiB0YXJnZXRzLmMgKHNwYXJjY29mZl92ZWMpOiBEZWNsYXJlLgotCi0JKiByZWxvYy5jIChiZmRfZ2V0X3JlbG9jX3NpemUpOiBOZXcgZnVuY3Rpb24uCi0JKHN0cnVjdCByZWxvY19ob3d0b190eXBlKTogVXBkYXRlIGRvY3VtZW50YXRpb24gb2Ygc2l6ZSBmaWVsZC4KLQotV2VkIERlYyAgMSAxNDozOTowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbTMyLWFscGhhLmM6IE5ldyBmaWxlOyBwcmVsaW1pbmFyeSBBbHBoYSBOZXRXYXJlIHN1cHBvcnQuCi0JKiBjb25maWcuYmZkIChhbHBoYS0qLW5ldHdhcmUqKTogTmV3IHRhcmdldDsgdXNlIGFscGhhLW5sbS4KLQkqIGNvbmZpZy9hbHBoYS1ubG0ubXQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChubG0zMl9hbHBoYV92ZWMpOiBOZXcgdmVjdG9yOyB1c2UgbmxtMzItYWxwaGEubywKLQlubG0zMi5vLCBhbmQgbmxtLm8uCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGRlZCBubG0zMi1hbHBoYS5vLgotCShDRklMRVMpOiBBZGRlZCBubG0zMi1hbHBoYS5jLgotCVJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCSogdGFyZ2V0cy5jIChubG0zMl9hbHBoYV92ZWMpOiBEZWNsYXJlLgotCi0JKiBsaWJubG0uaCAoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBOZXcgZmllbGRzCi0Jb3B0aW9uYWxfcHJlZml4X3NpemUsIG5sbV9iYWNrZW5kX29iamVjdF9wLCBubG1fd3JpdGVfcHJlZml4LAotCW5sbV9zZXRfcHVibGljX3NlY3Rpb24sIG5sbV9nZXRfcHVibGljX29mZnNldC4gIFJlbW92ZWQgdW51c2VkCi0JbmxtX3dyaXRlX3JlbG9jIGZpZWxkLiAgQ2hhbmdlZCBubG1fd3JpdGVfaW1wb3J0IHRvIHJlbW92ZQotCXVubmVjZXNzYXJ5IHN5bWJvbCBhcmd1bWVudC4gIFJlbmFtZWQgbmxtX3dyaXRlX2V4dGVybmFscyB0bwotCW5sbV93cml0ZV9leHRlcm5hbCwgYW5kIGNoYW5nZWQgY291bmQgYXJndW1lbnQgZnJvbSBiZmRfdm1hIHRvCi0JYmZkX3NpemVfdHlwZS4KLQkobmxtX29wdGlvbmFsX3ByZWZpeF9zaXplLCBubG1fYmFja2VuZF9vYmplY3RfcF9mdW5jLAotCW5sbV93cml0ZV9wcmVmaXhfZnVuYywgbmxtX3NldF9wdWJsaWNfc2VjdGlvbl9mdW5jLAotCW5sbV9nZXRfcHVibGljX29mZnNldF9mdW5jKTogTmV3IGFjY2Vzc29yIG1hY3Jvcy4KLQkobmxtX3dyaXRlX3JlbG9jX2Z1bmMpOiBSZW1vdmVkLgotCShubG1fd3JpdGVfZXh0ZXJuYWxfZnVuYyk6IEFkanVzdGVkIGZvciBmaWVsZCByZW5hbWluZy4KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfd3JpdGVfaW1wb3J0KTogUmVuYW1lZCBmcm9tCi0JbmxtX2kzODZfd3JpdGVfcmVsb2MuICBSZW1vdmVkIG9sZCBubG1faTM4Nl93cml0ZV9pbXBvcnQgd2hpY2gKLQlqdXN0IGNhbGxlZCBvbGQgbmxtX2kzODZfd3JpdGVfcmVsb2MuCi0JKG5sbV9pMzg2X3dyaXRlX2V4dGVybmFsKTogUmVuYW1lZCBmcm9tIG5sbV9pMzg2X3dyaXRlX2V4dGVybmFscy4KLQlEZWNsYXJlZC4gIENoYW5nZWQgc2Vjb25kIGFyZ3VtZW50IGZyb20gYmZkX3ZtYSB0byBiZmRfc2l6ZV90eXBlLgotCShubG0zMl9pMzg2X2JhY2tlbmQpOiBBZGp1c3RlZCBmb3IgY2hhbmdlcyB0byBmaWVsZHMgYW5kIG5hbWVzLgotCSogbmxtMzItc3BhcmMuYyAobmxtX3NwYXJjX21hbmdsZV9yZWxvY3MpOiBSZW1vdmVkIHVudXNlZCwKLQlpZmRlZmZlZCBvdXQgY29kZS4KLQkobmxtX3NwYXJjX3dyaXRlX2ltcG9ydCk6IFJlbW92ZWQgc2Vjb25kIGFyZ3VtZW50LgotCShubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWwpOiBSZW5hbWVkIGZyb20KLQlubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWxzLiAgQ2hhbmdlZCBzZWNvbmQgYXJndW1lbnQgZnJvbSBiZmRfdm1hCi0JdG8gYmZkX3NpemVfdHlwZS4KLQkobmxtMzJfc3BhcmNfYmFja2VuZCk6IEFkanVzdGVkIGZvciBjaGFuZ2VzIHRvIGZpZWxkcyBhbmQgbmFtZXMuCi0JKiBubG1jb2RlLmg6IFJlbW92ZWQgc29tZSB1bnVzZWQgY29kZS4KLQkobmxtX29iamVjdF9wKTogRG9uJ3QgZGVzdHJveSB0ZGF0YSBwb2ludGVyLiAgQ2FsbAotCWJhY2tlbmRfb2JqZWN0X3AgZnVuY3Rpb24gaWYgaXQgZXhpc3RzLgotCShubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgcmNvdW50LiAgQ2FsbAotCXNldF9wdWJsaWNfc2VjdGlvbl9mdW5jIGlmIGl0IGV4aXN0cyBpbnN0ZWFkIG9mIGNoZWNraW5nCi0JTkxNX0hJQklULgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWNjb3VudCBmb3IKLQlvcHRpb25hbF9wcmVmaXhfc2l6ZS4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEFjY291bnQgZm9yIG9wdGlvbmFsX3ByZWZpeF9zaXplLgotCVJlbW92ZWQgdXNlbGVzcyB2YXJpYWJsZSB3cml0ZV9yZWxvY19mdW5jLiAgQ2hhbmdlZCBkZWNsYXJhdGlvbgotCWFuZCBjYWxsIG9mIHdyaXRlX2ltcG9ydF9mdW5jLiAgQ2FsbCB3cml0ZV9wcmVmaXhfZnVuYyBpZiBpdAotCWV4aXN0cy4gIFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlcyBsZW4gYW5kIHRlbXAuICBDYWxsCi0JZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyBpZiBpdCBleGlzdHMgcmF0aGVyIHRoYW4gc2V0dGluZyBOTE1fSElCSVQuCi0JKiBubG1zd2FwLmg6IERlY2xhcmUgZnVuY3Rpb25zLgotCi0JKiBiZmQtaW4uaCAodWludDY0X3R5cGVMT1csIHVpbnQ2NF90eXBlSElHSCk6IEZ1bGx5IHBhcmVudGhlc2l6ZQotCWZvciBjbGFyaXR5LgotCShmcHJpbnRmX3ZtYSwgc3ByaW50Zl92bWEpOiBVc2UgJWx4LCBub3QgJXguCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBob3N0cy9hbHBoYW9zZi5oICh1aW50NjRfdHlwZUxPVywgdWludDY0X3R5cGVISUdIKTogQ2FzdCByZXN1bHRzCi0JdG8gdW5zaWduZWQgbG9uZy4KLQotCSogY29uZmlnLmJmZDogRG9uJ3Qgc2V0IHRhcmdldDY0IGhlcmUsIGFzIHRoZSBzZXR0aW5nIGlzIGlnbm9yZWQuCi0JKiBjb25maWd1cmUuaW4gKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IFNldCB0YXJnZXQ2NC4KLQotCSogY29uZmlnL2FscGhhb3NmLm10IChUREVGSU5FUyk6IFJlbW92ZWQ7IHNldHRpbmcgaG9zdCBwYXJhbWV0ZXJzCi0JaW4gVERFRklORVMgaXMgd3JvbmcuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKToKLQlSZW1vdmUgdW51c2VkIHZhcmlhYmxlIG91dHB1dF9zZWN0aW9uLgotCi1UdWUgTm92IDMwIDE2OjQ1OjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaXJpeC1jb3JlLmM6IE5ldyBmaWxlIGZvciBJcml4IDQgYW5kIElyaXggNSBjb3JlIHN1cHBvcnQuCi0JRnVuY3Rpb25zIHRha2VuIG91dCBvZiBjb2ZmLW1pcHMuYy4gIEhhbmRsZSB2bWFwIHR5cGUgVk1BUEZJTEUuCi0JKiBjb2ZmLW1pcHMuYzogSXJpeCA0IGNvcmUgZmlsZSBzdXBwb3J0IG1vdmVkIHRvIGlyaXgtY29yZS5jLgotCSogdGFyZ2V0cy5jOiBJZiBJUklYX0NPUkUgZGVmaW5lZCwgaW5jbHVkZSBpcml4X2NvcmVfdmVjIGluCi0JdGFyZ2V0X3ZlY3Rvci4KLQkqIGNvbmZpZy9pcml4NC5taCAoSERFRklORVMpOiBBZGQgLURJUklYX0NPUkUuCi0JKEhERVBGSUxFUyk6IERlZmluZSB0byBiZSBpcml4LWNvcmUuby4KLQkqIGNvbmZpZy9pcml4NS5taCAoSERFRklORVMpOiBEZWZpbmUgdG8gYmUgLURJUklYX0NPUkUuCi0JKEhERVBGSUxFUyk6IERlZmluZSB0byBiZSBpcml4LWNvcmUuby4KLQkqIE1ha2VmaWxlLmluIChPUFRJT05BTF9CQUNLRU5EUyk6IEFkZGVkIGlyaXgtY29yZS5vLiAgUmVtb3ZlZAotCXNjby1jb3JlLm8sIHdoaWNoIG5vIGxvbmdlciBleGlzdHMuCi0JKENGSUxFUyk6IEFkZGVkIGFsbCAqLWNvcmUuYyBmaWxlcy4KLQlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotV2VkIE5vdiAyNCAwMjowMjo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBSZXN0b3JlIGNoZWNrIG9mIGZpbGVfc2l6ZSAhPQotCW1lbV9zaXplLCBidXQgb25seSBpZiBTSFRfUFJPR0JJVFMuCi0KLQkqIGVjb2ZmbGluay5jOiBOZXcgZmlsZSB0byBob2xkIEVDT0ZGIGRlYnVnIGluZm9ybWF0aW9uIGxpbmtpbmcKLQlyb3V0aW5lcy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NsZWFyX291dHB1dF9mbGFncywgZWNvZmZfcmVsLCBlY29mZl9kdW1wX3NlY2xldCwKLQllY29mZl9hZGRfc3RyaW5nLCBlY29mZl9nZXRfZGVidWcpOiBSZW1vdmVkLiAgRnVuY3Rpb25hbGl0eSBub3cgaW4KLQllY29mZmxpbmsuYy4KLQkoZWNvZmZfZ2V0X2V4dHIsIGVjb2ZmX3NldF9pbmRleCk6IE5ldyBmdW5jdGlvbnMuCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBEb24ndCBzYXZlIHJhd19zaXplLgotCShlY29mZl9iZmRfc2VjbGV0X2xpbmspOiBSZXdyb3RlIHRvIHVzZSBlY29mZmxpbmsuYyBmdW5jdGlvbnMuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvbid0IHNldCBFWEVDX1AganVzdAotCWJlY2F1c2UgdGhlcmUgaXMgYSBzdGFydCBhZGRyZXNzLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBIYW5kbGUgZXh0ZXJuYWwgc3ltYm9scyBoZXJlLiAgVXNlCi0JZWNvZmZsaW5rLmMgZnVuY3Rpb25zIHRvIHdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbywgbWlwc19lbGZfZ2V0X2V4dHIsCi0JbWlwc19lbGZfc2V0X2luZGV4KTogTmV3IGZ1bmN0aW9ucy4KLQkobWlwc19lbGZfc2VjbGV0X2xpbmspOiBEaXNjYXJkIGVtcHR5IHNlY3Rpb25zLCB0aGUgLm9wdGlvbnMKLQlzZWN0aW9uIGFuZCAuZ3B0YWIgc2VjdGlvbnMuICBIYW5kbGUgbGlua2luZyAubWRlYnVnIHNlY3Rpb24uCi0JKiBsaWJlY29mZi5oIChlY29mZl9kYXRhX3R5cGUpOiBSZW1vdmVkIHJhd19zaXplIGFuZCBpZmRiYXNlLgotCSogbGliZWxmLmggKGVsZl9zeW1ib2xfdHlwZSk6IEFkZGVkIG1pcHNfZXh0ciB0byB0Y19kYXRhIHVuaW9uLgotCSogYmZkLWluLmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIHJvdXRpbmVzIGluIGVjb2ZmbGluay5jIChzb21lIGFyZQotCWNhbGxlZCBieSBnYXMsIHNvIHRoZXkgYXJlIHB1YmxpYykuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBBZGRlZCBlY29mZmxpbmsuby4KLQkoQ0ZJTEVTKTogQWRkZWQgZWNvZmZsaW5rLmMuCi0JKGVjb2ZmbGluay5vKTogTmV3IHRhcmdldC4gIFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi1Nb24gTm92IDIyIDIyOjI2OjQyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoaHBwYV9vYmplY3RfcCk6IEFsc28gcmVjb2duaXplIFNIQVJFRF9NQUdJQ19DTlggYXMKLQlhIHZhbGlkIG1hZ2ljIG51bWJlciBpZiBpdCdzIGJlZW4gZGVmaW5lZC4KLQotTW9uIE5vdiAyMiAxNDoxNzozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0KTogRG9uJ3QgY3JlYXRlIC5zY29tbW9uIHNlY3Rpb247IGxpbmtlcgotCW5vIGxvbmdlciByZXF1aXJlcyBpdC4KLQkoZWNvZmZfYmZkX3NlY2xldF9saW5rLCBlY29mZl9zaXplb2ZfaGVhZGVycywKLQllY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCB0cmVhdCAuc2NvbW1vbiBzZWN0aW9uCi0Jc3BlY2lhbGx5LgotCi1Nb24gTm92IDIyIDEwOjU0OjI3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JTWVyZ2VkIGNoYW5nZXMgZnJvbSBrZXZAc3B1ZHMuZ2VnLm1vdC5jb20gKEtldmluIEEuIEJ1ZXR0bmVyKToKLQkqIGJmZC9jb25maWcvZGVsdGE4OC5taCAoSERFRklORVMpOiBEZWZpbmUgdGhpcyB0byBiZSAtRFBUUkFDRV9DT1JFLgotCSogYmZkL2NvbmZpZy9kZWx0YTg4Lm1oIChIREVQRklMRVMpOiBEZWZpbmVkIHRvIGJlIHB0cmFjZS1jb3JlLm8uCi0JKiBiZmQvcHRyYWNlLWNvcmUuYzogIE5ldyBmaWxlIGZvciBkZWFsaW5nIHdpdGggY29yZSBmaWxlcyB3aXRoCi0Jc3RhcnQgd2l0aCB0aGUgcHRyYWNlX3VzZXIgc3RydWN0dXJlIGZvdW5kIG9uIEJDUyBjb21wbGlhbnQgc3lzdGVtcy4KLQkqIGJmZC90YXJnZXRzLmMgKHB0cmFjZV9jb3JlX3ZlYyk6ICBOZXcgdmVjdG9yLgotCi1Nb24gTm92IDIyIDAyOjMzOjEyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNaW5pbWFsIHN1cHBvcnQgZm9yIHJlYWRpbmcgU09NIGZpeHVwIHN0cmVhbXMuICBBbGxvd3MKLQlvYmpkdW1wIC1yIHRvIGRvIHNvbWV0aGluZyByZWFzb25hYmxlLgotCSogc29tLmMgKHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBJbXBsZW1lbnQuCi0JKHNvbV9jYW5vbmljYWxpemVfcmVsb2MpOiBJbXBsZW1lbnQuCi0JKHNvbV9zZXRfcmVsb2NfaW5mbywgc29tX3NsdXJwX3JlbG9jX3RhYmxlKTogTmV3IGZ1bmN0aW9ucy4KLQotU3VuIE5vdiAyMSAxMzo0Njo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2x5bnguaCAoRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVEKTogRGVmaW5lLgotCSogaG9zdHMvc3BhcmNseW54Lmg6IEluY2x1ZGUgbHlueC5oIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgaXQuCi0KLUZyaSBOb3YgMTkgMTQ6MzQ6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyk6IEZvciBSX0lSRUwsIGRvbid0IGxlZnQgc2hpZnQKLQlzaWduZWRfdmFsdWUgYmVmb3JlIHNpZ24gZXh0ZW5kaW5nIGl0LiAgRG9uJ3Qgc3VidHJhY3Qgb3V0Ci0JcmVsb2NfZW50cnktPmFkZHJlc3MuICBUaGlzIG1ha2VzIGl0IGNvbXBhdGlibGUgd2l0aCB3aGF0IGdhcyBpcwotCWdlbmVyYXRpbmcuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBBY2NlcHQgLnNic3MgYXMgdGhlIG5hbWUgZm9yIGEKLQlTSFRfTk9CSVRTIHNlY3Rpb25zLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IERvbid0IGxlYXZlIHRoZSBsb29wIGFmdGVyIHRoZSBmaXJzdAotCVNIVF9OT0JJVFMgc2VjdGlvbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBPbmx5IGZvcmNlIHNoX29mZnNldCBhbmQKLQlzaF9hZGRyIHRvIG1hdGNoIG1vZHVsbyBtYXhwYWdlc2l6ZSBmb3IgYSBzZWN0aW9uIHdoaWNoIGlzIG5vdAotCVNIVF9OT0JJVFMuICBDaGFuZ2VkIHRoZSBtZXRob2QgdXNlZCB0byBmb3JjZSBwYWdlIGFsaWdubWVudCBhZnRlcgotCWEgU0hUX05PQklUUyBzZWN0aW9uIHRvIG9ubHkgZG8gaXQgZm9yIHRoZSBsYXN0IHN1Y2ggY29uc2VjdXRpdmUKLQlzZWN0aW9uLCBhbmQgdG8gcmVhbGx5IGZvcmNlIHBhZ2UgYWxpZ25tZW50LgotCi1GcmkgTm92IDE5IDA0OjAyOjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBQcmludCBtb3JlIHZlcmJvc2UgbWVzc2FnZQotCWluIHRoZSBjYXNlIG9mIGFuIHVua25vd24gKG9yIHVuaGFuZGxlZCkgc3RvcmFnZSBjbGFzcy4KLQotCSogY29uZmlnL2kzODYtbHlueC5tdCAoVERFRklORVMpOiBGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQgc2hvdWxkCi0Jbm90IGJlIGRlZmluZWQgaGVyZSwgc2luY2UgaXQgaXMgYSBob3N0IGF0dHJpYnV0ZSwgbm90IGEgdGFyZ2V0Ci0Jb25lLgotCSogY29uZmlnL202OGstbHlueC5tdCwgY29uZmlnL3NwYXJjLWx5bngubXQ6IERpdHRvLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5Ci0JZGVmaW5lZC4KLQotCSogY29mZi1zcGFyYy5jOiBEZWZpbmUgc29tZSByZWxvY2F0aW9ucywgYmFzZWQgb24gRUxGIHJlbG9jYXRpb25zLgotCShlbnVtIHJlbG9jX3R5cGUsIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIGNvZmZfc3BhcmNfaG93dG9fdGFibGUsCi0Jc3RydWN0IGNvZmZfcmVsb2NfbWFwLCBzcGFyY19yZWxvY19tYXAsCi0JY29mZl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCk6IEJvcnJvd2VkIGZyb20gZWxmMzItc3BhcmMuYyBhbmQKLQllbGYuYywgcmVuYW1lZC4KLQkoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUgdG8gYmUgY29mZl9zcGFyY19yZWxvY18uLi4uCi0JKHJ0eXBlMmhvd3RvKTogSW5kZXggaW50byBjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlIHVzaW5nCi0JZHN0LT5yX3R5cGUuCi0KLVRodSBOb3YgMTggMTE6NDU6MzkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChtaXBzKi0qLWlyaXg1Kik6IE5ldyB0YXJnZXQ7IHVzZSBtaXBzYmVsZi4KLQkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzLXNnaS1pcml4NSopIE5ldyBob3N0OyB1c2UgaXJpeDUgKG5vCi0JaG9zdHMvaXJpeDUuaCBjcmVhdGVkOyBqdXN0IHVzZSBzdGQtaG9zdC5oKS4KLQkqIGNvbmZpZy9pcml4NS5taDogTmV3IGZpbGU7IGxpa2UgaXJpeDQubWgsIGJ1dCBkb24ndCB1c2UgLUcgb3IKLQktbG1hbGxvYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotCSogZWNvZmZzd2FwLmg6IENoYW5nZWQgdHlwZSBvZiBpbnRlcm5hbCBwb2ludGVycyBmb3Igc3dhcCBvdXQKLQlmdW5jdGlvbnMgdG8gY29uc3QgKi4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9nb3QxNl9yZWxvYyk6IE5ldyBmdW5jdGlvbi4gIEhhbmRsZSBHT1QxNgotCWNvcnJlY3RseSBmb3IgYXNzZW1ibGVyLCBidXQgbGlua2VyIHN1cHBvcnQgbm90IGltcGxlbWVudGVkLgotCShlbGZfbWlwc19ob3d0b190YWJsZSk6IFVzZSBtaXBzX2VsZl9nb3QxNl9yZWxvYyBmb3IgR09UMTYuCi0JKG1pcHNfZWxmX3N5bV9pc19nbG9iYWwpOiBOZXcgZnVuY3Rpb247IGF0IGxlYXN0IG9uIElyaXggNSwgYWxsCi0Jbm9uIHNlY3Rpb24gc3ltYm9scyBhcmUgY29uc2lkZXJlZCBnbG9iYWwuCi0JKGVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwpOiBEZWZpbmUuCi0JKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb24uICBTZXQgdGhlIE1JUFMKLQlhcmNoaXRlY3R1cmUgbGV2ZWwgY29ycmVjdGx5LgotCShlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogRGVmaW5lLgotCShtaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfTUlQU19PUFRJT05TLgotCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogU2V0IGVudHNpemUgb2YgLm1kZWJ1ZyBvciAucmVnaW5mbwotCXNlY3Rpb24gdG8gMS4gIEhhbmRsZSAub3B0aW9ucyBzZWN0aW9uLgotCShtaXBzX2VsZl9hY29tX3NlY3Rpb24sIG1pcHNfZWxmX2Fjb21fc3ltYm9sLAotCW1pcHNfZWxmX2Fjb21fc3ltYm9sX3B0cik6IE5ldyBzdGF0aWMgdmFyaWFibGVzLCB1c2VkIHRvIGJ1aWxkIGEKLQlnZW5lcmljIC5hY29tbW9uIHNlY3Rpb24gdG8gaG9sZCBTSE5fTUlQU19BQ09NTU9OIHN5bWJvbHMuCi0JKG1pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogSGFuZGxlIFNITl9NSVBTX0FDT01NT04gc3ltYm9scyBieQotCXB1dHRpbmcgdGhlbSBhbGwgaW4gYSBnbG9iYWwgLmFjb21tb24gc2VjdGlvbi4KLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEb24ndCBkdW1wIGNvcmUgaWYgdGFyZ2V0Ci0Jc2VjdGlvbiBoYXMgbm8gRUxGIHNlY3Rpb24gZGF0YS4KLQkoZWxmX21ha2Vfc2VjdGlvbnMpOiBTZXQgYWRkcmFsaWduIG9mIHJlbG9jIHNlY3Rpb24gdG8gNC4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOglEb24ndCBjb25zaWRlciBzZWN0aW9uIDAuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogRG9uJ3QgY29uc2lkZXIgc2VjdGlvbiAwLgotCUluIHRoZSBtYWluIGxvb3AsIHNraXAgdGhlIHN5bXRhYiBhbmQgc3RydGFiIHNlY3Rpb25zLCBzaW5jZSB0aGVpcgotCXBvc2l0aW9ucyBhcmUgc2V0IGVsc2V3aGVyZS4KLQkoc3dhcF9vdXRfc3ltcyk6IFNldCBhZGRyYWxpZ24gb2Ygc3ltdGFiIHNlY3Rpb24gdG8gNC4gIFNldAotCWFkZHJhbGlnbiBvZiBzdHJ0YWIgc2VjdGlvbnMgdG8gMS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MpOiBEb24ndCBjb25zaWRlciBzZWN0aW9uIDAuCi0JKHdyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHdyaXRlIG91dCBzZWN0aW9uIDAuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIGZpZWxkcwotCWVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwgYW5kIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmMzJfYmVkKTogQWRkZWQgY29ycmVzcG9uZGluZyBpbml0aWFsaXplcnMuCi0JKiBlbGY2NC10YXJnZXQuaCAoZWxmNjRfYmVkKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKHN5bV9pc19nbG9iYWwpOiBUYWtlIGFiZmQgYXJndW1lbnQuICBDYWxsCi0JZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCBpZiBpdCBpcyBub3QgTlVMTC4KLQkoZWxmX21hcF9zeW1ib2xzKTogUGFzcyBhYmZkIHRvIHN5bV9pc19nbG9iYWwuCi0JKHdyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotCWlmIGl0IGlzIGRlZmluZWQuCi0KLVdlZCBOb3YgMTcgMTg6NDM6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJlY29mZi5oOiBJbmNsdWRlIGNvZmYvZWNvZmYuaC4KLQkoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSk6IE1vdmUgZXh0ZXJuYWwgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0JZmllbGRzIGludG8gYSBzaW5nbGUgZmllbGQgcG9pbnRpbmcgdG8gYW4gZWNvZmZfZGVidWdfc3dhcAotCXN0cnVjdHVyZS4KLQkoZWNvZmZfZGF0YV90eXBlKTogTW92ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZmllbGRzIGludG8gYSBzaW5nbGUKLQlmaWVsZCBwb2ludGluZyB0byBhbiBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZS4KLQkqIGNvZmYtYWxwaGEuYywgY29mZi1taXBzLmMsIGVjb2ZmLmM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotV2VkIE5vdiAxNyAxNzozODo1OCAxOTkzICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogbmxtc3dhcC5oOiBOZXcgZmlsZSB0byBzd2FwIGZpeGVkIGhlYWRlci4gIEluY2x1ZGVkIGJ5IE5MTQotCWJhY2tlbmRzLgotCSogbGlibmxtLmggKHN0cnVjdCByZWxvY19hbmRfc2VjKTogRGVmaW5lLgotCShzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZHMgZml4ZWRfaGVhZGVyX3NpemUsCi0JbmxtX3JlYWRfaW1wb3J0LCBubG1fd3JpdGVfaW1wb3J0LCBubG1fc3dhcF9maGRyX2luLAotCW5sbV9zd2FwX2ZoZHJfb3V0LgotCShubG1fZml4ZWRfaGVhZGVyX3NpemUsIG5sbV9yZWFkX2ltcG9ydF9mdW5jLAotCW5sbV93cml0ZV9pbXBvcnRfZnVuYywgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luX2Z1bmMsCi0JbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dF9mdW5jLCBubG1fd3JpdGVfZXh0ZXJuYWxfZnVuYyk6IE5ldwotCWFjY2Vzc29yIG1hY3Jvcy4KLQkqIG5sbWNvZGUuaDogVXNlIG5ldyBmdW5jdGlvbnMuCi0JKiBubG0zMi1pMzg2LmM6IFByb3ZpZGUgbmV3IGZ1bmN0aW9ucy4KLQkqIG5sbTMyLXNwYXJjLmM6IE5ldyBmaWxlOyBTUEFSQyBOTE0gYmFja2VuZC4KLQotV2VkIE5vdiAxNyAxMzo1NjoxMCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGkzODZseW54LmMgKHN3YXBfc3RkX3JlbG9jX2luLCBzd2FwX2V4dF9yZWxvY19pbik6IElnbm9yZQotCWdhcmJhZ2UgYml0cyBhcHBlYXJpbmcgaW4gdGhlIHVwcGVyIGVuZCBvZiBzeW1ib2xudW1zLgotCi0JKiBjb25maWcvc3BhcmMtbHlueC5tdCAoVERFRklORVMpOiBBZGQgLURGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQuCi0KLVR1ZSBOb3YgMTYgMTc6MDM6NDEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbHlueC1jb3JlLmMgKGx5bnhfY29yZV9maWxlX3ApOiAgQ2hhbmdlIGJmZF96YWxsb2MgdG8gYmZkX2FsbG9jLgotCSogbTY4a2x5bnguYzogIERlZmluZSBjb3JlIGZpbGUgbWFjcm9zLgotCSogaG9zdHMvaTM4Nmx5bnguaCwgaG9zdHMvbTY4a2x5bnguaCwgaG9zdHMvbHlueC5oOiAgTW92ZSBhbGwKLQlub24tYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHN0dWZmIGludG8gbHlueC5oLgotCi1UdWUgTm92IDE2IDE1OjQ1OjU0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBpMzg2bGludXguYzogRGVmaW5lIG5ldyBtYWNybyBaTUFHSUNfRElTS19CTE9DS19TSVpFIHRvIDEwMjQsIGFuZAotCWNoYW5nZSBQQUdFX1NJWkUgdG8gNDA5Ni4KLQotTW9uIE5vdiAxNSAxMTo0ODowOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiBOZXcgdGFyZ2V0LgotCi0JKiBWRVJTSU9OOiBVcGRhdGVkLgotCi1TdW4gTm92IDE0IDIzOjMzOjAxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IERvIG5vdCBjcmVhdGUgZHVtbXkgIi50ZXh0IiwgIi5kYXRhIiwKLQlhbmQgIi5ic3MiIHNlY3Rpb25zLgotCShzZXR1cF9zZWN0aW9ucyk6IERvIG5vdCBzZXQgU0VDX0hBU19DT05URU5UUyBpZiBhIHNlY3Rpb24ncyBzaXplCi0JaXMgemVyby4gIFJlY29nbml6ZSBCU1MgdHlwZSBzZWN0aW9ucyBhbmQgdHVybiBvZmYgU0VDX0xPQUQgYW5kCi0JU0VDX0RBVEEgKHNvIGJpbnV0aWxzL3NpemUgd29ya3MpLiAgU2V0IHRoZSBjb3JyZWN0IHZhbHVlIGZvcgotCWEgc2VjdGlvbidzIF9yYXdfc2l6ZS4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFByb2dyYW0gZW50cnkgcG9pbnRzLCBhbmQgbWlsbGljb2RlIGFyZQotCWFsc28gZnVuY3Rpb25zLiAgTWFyayB0aGVtIGFzIHN1Y2guICBBbHNvIG1hcmsgTCQqIHN5bWJvbHMgYXMKLQlkZWJ1Z2dpbmcgc3ltYm9scy4KLQotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1TYXQgTm92IDEzIDE1OjI3OjE1IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBtaXNzaW5nIHByb3RvdHlwZS4gIFJldHVybnMKLQlhIHBvaW50ZXIgdG8gY29uc3RhbnQgZGF0YS4gIERlbGV0ZSBib2d1cyAjZGVmaW5lIHdoaWNoIG1hZGUgdGhlIAotCWZ1bmN0aW9uIHVzZWxlc3MuCi0KLQkqIHNvbS5jIChzb21fcHJlcF9mb3JfZml4dXBzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fd3JpdGVfZml4dXBzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fd3JpdGVfc3BhY2Vfc3RyaW5ncyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmVnaW5fd3JpdGluZyk6IE5ldyBmdW5jdGlvbi4KLQotRnJpIE5vdiAxMiAxNToyOTozNiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEbyBub3QgYWJvcnQuICBGbGVzaCBvdXQuCi0JKHNvbV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERvIG5vdCBhYm9ydC4gIEZsZXNoIG91dC4KLQotCSogc29tLmMgKHNvbV93cml0ZV9oZWFkZXJzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fcHJlcF9oZWFkZXJzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmMgKHNvbV9zaXplb2ZfaGVhZGVycyk6IEFkZCBtaXNzaW5nIHByb3RvdHlwZS4KLQkoc29tX3NldF9hcmNoX21hY2gpOiBEbyBub3QgYWJvcnQuCi0KLQkqIHNvbS5jIChzb21fY291bnRfc3BhY2VzKTogTmV3IGZ1bmN0aW9uLgotCShzb21fY291bnRfc3Vic3BhY2VzKTogTmV3IGZ1bmN0aW9uLgotCShjb21wYXJlX3N5bXMpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9jb21wdXRlX2NoZWNrc3VtKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5jICh0cnlfcHJldl9maXh1cCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3JlbG9jX3NraXApOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9yZWxvY19hZGRlbmQpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9yZWxvY19jYWxsKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uYyAoc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9yZWxvY19xdWV1ZV9pbnNlcnQpOiBMaWtld2lzZS4KLQkoc29tX3JlbG9jX3F1ZXVlX2ZpeCk6IExpa2V3aXNlLgotCShzb21fcmVsb2NfcXVldWVfZmluZCk6IExpa2V3aXNlLgotCi0JKiBzb20uYyAoc29tX2hwcGFfaG93dG9fdGFibGUpOiBTT00gaG93dG8gcmVsb2NhdGlvbiB0YWJsZS4KLQkoaHBwYV9zb21fcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5jIChzdHJ1Y3QgcmVsb2NfcXVldWUpOiBOZXcgc3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YKLQl0aGUgbGFzdCBmb3VyIG11bHRpYnl0ZSByZWxvY2F0aW9ucyBlbWl0dGVkLgotCShlbnVtIHBhX3N5bWJvbF90eXBlKTogVHlwZSB0byBmdWxseSBkZXNjcmliZSB0aGUgc3ltYm9sIHR5cGVzCi0JYXNzb2NpYXRlZCB3aXRoIC5pbXBvcnQvLmV4cG9ydCBhc3NlbWJsZXIgZGlyZWN0aXZlcy4KLQotCSogc29tLmM6IEluY2x1ZGUgbGliaHBwYS5oCi0KLQkqIHNvbS5jIChiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyk6IExpa2V3aXNlLgotCShiZmRfc29tX3NldF9zeW1ib0xfdHlwZSk6IExpa2V3aXNlLgotCShiZmRfc29tX2F0dGFjaF91bndpbmRfaW5mbyk6IExpa2V3aXNlLgotCSogc29tLmg6IERlY2xhcmUgbmV3IGV4cG9ydGVkIGZ1bmN0aW9ucy4KLQotCSogc29tLmggKHN0cnVjdCBzb21fc3ltYm9sKTogQWRkIG5ldyBmaWVsZHMgdG8gaG9sZCBhZGRpdGlvbmFsCi0JaW5mb3JtYXRpb24gbmVlZGVkIHRvIGJ1aWxkL3dyaXRlIHN5bWJvbCB0YWJsZXMgYW5kIGZpeHVwIHN0cmVhbXMuCi0JKHN0cnVjdCBzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCk6IEFkZCBuZXcgZmllbGRzIHRvIGhvbGQgYWRkaXRpb25hbAotCWluZm9ybWF0aW9uIG5lZWRlZCB0byBidWlsZC93cml0ZSBzcGFjZSBhbmQgc3Vic3BhY2UgaGVhZGVycy4KLQkoc29tX3N5bWJvbF9kYXRhKTogTmV3IGFjY2Vzc29yIG1hY3JvIGZvciBTT00gc3ltYm9sIGluZm9ybWF0aW9uLgotCShSX0hQUEFfKik6IEJhc2ljIHJlbG9jYXRpb24gdHlwZXMgdG8gYmUgdXNlZCBieSB0aGUgYXNzZW1ibGVyLgotCi1GcmkgTm92IDEyIDExOjAwOjI4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogSWYgbmV3IGhvb2sKLQlUUkFEX0NPUkVfQUxMT1dfQU5ZX0VYVFJBX1NJWkUgZGVmaW5lZCwgdGhlbiBza2lwIHRoZSBjaGVjayBmb3IgdGhlCi0JY29yZWZpbGUgYmVpbmcgdG9vIGJpZy4KLQkqIGhvc3RzL2kzODZzY28uaDogRGVmaW5lIGl0LgotCi1UaHUgTm92IDExIDE1OjE2OjI4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGQgaHBwYWJzZF9jb3JlX2RhdGEuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBBZGQgaHBwYWJzZF9jb3JlX3ZlYy4KLQkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfY29yZV9maWxlX3ApOiBGYWlsIGlmIGFuIHVua25vd24gY29yZQotCXNlY3Rpb24gaXMgZW5jb3VudGVyZWQgZHVyaW5nIGNvcmUgc2VjdGlvbiBzY2FubmluZy4KLQkqIGhwcGFic2QtY29yZS5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9ocHBhYnNkLm1oOiBFbmFibGUgSFBQQSBCU0QgY29yZSBmaWxlcy4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvYyk6IFJlbW92ZSBERUZVTiBjcnVkLiAgUmVtb3ZlIGNvZGUKLQl3aGljaCBpcyBlaXRoZXIgY29tbWVudGVkIG91dCBvciBpZmRlZidkIG91dC4gIEFkZCwgdXBkYXRlIGFuZAotCWNsZWFuIGNvbW1lbnRzLiAgRml4IHZhcmlvdXMgaW5kZW50aW9uIGFuZCBzcGFjaW5nIHByb2JsZW1zLiAgSGFuZGxlCi0JcHJvYmxlbXMgcmVsYXRlZCB0byB1c2luZyAiYmxlIiB0byBqdW1wIHRvIGEgc3R1YiByYXRoZXIgdGhhbiAiYmwiCi0JKCVyMzEgaXMgdHJhc2hlZCBieSAiYmxlIiwgYnV0IG5vdCBieSAiYmwiKS4KLQkoTkVXX0lOU1RSVUNUSU9OKTogUHV0IGluc2lkZSBjdXJseSBicmFjZXMuCi0JKENVUlJFTlRfU1RVQl9PRkZTRVQpOiBGaXggaW5kZW50aW9uIHByb2JsZW1zLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IEZpeCBpbmRlbnRpb24gYW5kIHNwYWNpbmcgcHJvYmxlbXMuCi0JQWRkLCB1cGRhdGUgYW5kIGNsZWFuIGNvbW1lbnRzLiAgSGFuZGxlICJibGUiICVyMzEgbG9zc2FnZSBwcm9ibGVtcy4KLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IExpa2V3aXNlLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoaHBwYV9lbGZfc3R1Yl9jaGVjayk6IFJlbW92ZSBvYnNvbGV0ZSBmdW5jdGlvbi4KLQotCSogaHBwYV9zdHVicy5oOiBBZGQgbmV3IGluc3RydWN0aW9ucyB0byBkZWFsIHdpdGggJXIzMSBsb3NzYWdlCi0JcHJvYmxlbXMuICBEZWxldGUgdW51c2VkIGluc3RydWN0aW9ucy4KLQkKLVR1ZSBOb3YgIDkgMTE6NDA6MjcgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtNjhrbHlueC5jIChUQVJHRVRfSVNfQklHX0VORElBTl9QKTogRGVmaW5lLgotCi1UdWUgTm92ICA5IDExOjI2OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBSYXRoZXIgdGhhbiBsb29raW5nIHRocm91Z2ggYW4gYXJyYXkKLQlvZiBhcmNoaXRlY3R1cmVzLCBnZXQgdGhlIEVMRiBFTV94eHggY29kZSBmcm9tIHRoZSBiYWNrZW5kCi0JaW5mb3JtYXRpb24uICBMZXQgdGhlIGdlbmVyaWMgRUxGIHRhcmdldCBtYXRjaCBhbnkgRU1feHh4IGNvZGUgbm90Ci0JbWF0Y2hlZCBieSBhbm90aGVyIEVMRiB0YXJnZXQuICBDYWxsIGVsZl9iYWNrZW5kX29iamVjdF9wIHRvIGxldAotCXRoZSBiYWNrZW5kIGRvIG1vcmUgY2hlY2tzIGFuZCBzZXQgZ2xvYmFsIGluZm9ybWF0aW9uLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkZWQgZWxmX21hY2hpbmVfY29kZSBhbmQKLQllbGZfYmFja2VuZF9vYmplY3RfcCBmaWVsZHMuCi0JKHN0cnVjdCBiZmRfZWxmX2FyY2hfbWFwKTogUmVtb3ZlZC4KLQkoYmZkX2VsZl9hcmNoX21hcCwgYmZkX2VsZl9hcmNoX21hcF9zaXplKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaDogSW5pdGlhbGl6ZSBlbGZfbWFjaGluZV9jb2RlCi0JZmllbGQgd2l0aCBFTEZfTUFDSElORV9DT0RFLiAgSW5pdGlhbGl6ZSBlbGZfYmFja2VuZF9vYmplY3RfcAotCWZpZWxkIHdpdGggZWxmX2JhY2tlbmRfb2JqZWN0X3AgKGlmIGl0IGlzIGRlZmluZWQpLgotCSogZWxmMzItZ2VuLmMsIGVsZjMyLWhwcGEuYywgZWxmMzItaTM4Ni5jLCBlbGYzMi1pODYwLmMsCi0JZWxmMzItbTY4ay5jLCBlbGYzMi1tODhrLmMsIGVsZjMyLW1pcHMuYywgZWxmMzItc3BhcmMuYywKLQllbGY2NC1nZW4uYyAoRUxGX01BQ0hJTkVfQ09ERSk6IERlZmluZWQuCi0JKiBlbGYzMi1taXBzLmM6IEluY2x1ZGUgZWNvZmZzd2FwLmggdG8gZ2V0IEVDT0ZGIHN3YXBwaW5nCi0Jcm91dGluZXMuCi0JKG1pcHNfZWxmX29iamVjdF9wKTogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlci4KLQkobWlwc19lbGZfZWNvZmZfZGVidWdfc3dhcCk6IERlZmluZWQuCi0JKGVsZl9iYWNrZW5kX29iamVjdF9wKTogRGVmaW5lZCB0byBiZSBtaXBzX2VsZl9vYmplY3RfcC4KLQkoZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCk6IERlZmluZWQgdG8gYmUKLQltaXBzX2VsZl9lY29mZl9kZWJ1Z19zd2FwLgotCSogZWxmLmMgKGJmZF9lbGZfYXJjaF9tYXAsIGJmZF9lbGZfYXJjaF9tYXBfc2l6ZSk6IFJlbW92ZWQuCi0KLQkqIGxpYmJmZC1pbi5oICh0YXJnZXRfdmVjdG9yLCBkZWZhdWx0X3ZlY3Rvcik6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGZvcm1hdC5jICh0YXJnZXRfdmVjdG9yLCBkZWZhdWx0X3ZlY3Rvcik6IERvbid0IGRlY2xhcmUuCi0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaG93dG9fdGFibGUpOiBEb24ndCBjb21wbGFpbiBvbiBvdmVyZmxvdwotCWZvciBSX01JUFNfMjYuICBDb3JyZWN0IG92ZXJmbG93IGRldGVjdGlvbiByZXF1aXJlcyBtYXRjaGluZyB0aGUKLQl1cHBlciBmb3VyIGJpdHMgb2YgdGhlIGRlc3RpbmF0aW9uIGFnYWluc3QgdGhlIFBDLiAgRnJvbSBUZWQgTGVtb24KLQk8bWVsbG9uQHBlcHBlci5uY2QuY29tPi4KLQotCSogYm91dC5jIChiX291dF9yZWxvY190eXBlX2xvb2t1cCk6IFJldHVybiB0eXBlIHNob3VsZCBwb2ludCB0bwotCWNvbnN0IGRhdGEuCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKHJlbG9jX2hvd3RvX3R5cGVfbG9va3VwKSk6IExpa2V3aXNlLgotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IE1hZGUgaG93dG8gY29uc3QuCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9kYXRhKTogTWFkZSBob3cgY29uc3QuCi0KLQkqIGxpYmVsZi5oOiBBZGRlZCBzb21lIGNvbW1lbnRzLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAKLQlmaWVsZC4gIFJlbW92ZWQgdW51c2VkIHdyaXRlX3JlbG9jcyBmaWVsZC4KLQkqIGVsZjMyLXRhcmdldC5oOiBBZGp1c3RlZCBlbGZfYmFja2VuZF9kYXRhIGluaXRpYWxpemF0aW9uCi0JYWNjb3JkaW5nbHkuCi0JKiBlbGY2NC10YXJnZXQuaDogQ29ycmVjdGVkIGVsZl9iYWNrZW5kX2RhdGEgaW5pdGlhbGl6YXRpb24gdG8KLQlmaWxsIGluIGFsbCBmaWVsZHMgYW5kIHRvIHNldCBlbGZfNjRfcCB0byAxLgotCi1Nb24gTm92ICA4IDE4OjEzOjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBSZW1vdmUgZHVwbGljYXRlIGFzc2lnbm1lbnQKLQl0byBmaWxlcG9zIGluIFNIVF9TVFJUQUIgY2FzZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24pOiBTZXQgQkZEIHNlY3Rpb24gZmlsZXBvcyBhcwotCXdlbGwgYXMgRUxGIHNlY3Rpb24gc2hfb2Zmc2V0LgotCi0JKiByZWxvYy5jOiBVc2UgY29uc3QgaW5zdGVhZCBvZiBDT05TVC4KLQkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IE1ha2UgdmFyaWFibGUgaG93dG8gYSBjb25zdCBwb2ludGVyLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQotTW9uIE5vdiAgOCAxMjoxOToxNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHJlYWxjbGVhbik6IERvbid0IHJlbW92ZSBnZW5lcmF0ZWQgaGVhZGVycy4gIFJldmVydHMKLQljaGFuZ2Ugb2YgMiBKdWwgMTk5My4KLQotTW9uIE5vdiAgOCAwNjowODozMSAxOTkzICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuYmZkOiBtYWtlIHVuaXh3YXJlIGVxdWl2YWxlbnQgdG8gc3lzdjQuCi0KLQkqIGNvbmZpZy9pMzg2LW5sbS5tdDogYnJpbmcgaW4gZWxmIGNvbmZpZzsgbWFrZSBpdCB0aGUgZGVmYXVsdC4KLQotU3VuIE5vdiAgNyAyMDoyMTozOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliYmZkLmMgKGJmZF9wdXRfOCk6IEFkZCBwYXJlbnMgYXJvdW5kIHJlZmVyZW5jZSB0byAidmFsIgotCWFyZ3VtZW50LgotCi1GcmkgTm92ICA1IDIxOjQ1OjA5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4Nm1hY2gzLmggKEhPU1RfU0VHTUVOVF9TSVpFKSwKLQlpMzg2bWFjaDMuYyAoU0VHTUVOVF9TSVpFLCBURVhUX1NUQVJUX0FERFIpOiBDb3JyZWN0IHZhbHVlcyAoPykuCi0KLUZyaSBOb3YgIDUgMTU6MTc6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFplcm8gb3V0IGludGVybmFsX2EuCi0KLUZyaSBOb3YgIDUgMTA6NDE6MDcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oLCBhcmNoaXZlLmMsIGFyY2h1cmVzLmMsIGJmZC5jLCBjYWNoZS5jLCBjb2ZmY29kZS5oLAotCWNvcmUuYywgY3Rvci5jLCBmb3JtYXQuYywgaW5pdC5jLCBsaWJiZmQuYywgb3BuY2xzLmMsIHJlbG9jLmMsCi0Jc2VjdGlvbi5jLCBzeW1zLmMsIHRhcmdldHMuYzoKLQlEb2MgY2xlYW51cCAoc3BlbGxpbmcsIHB1bmN0dWF0aW9uLCBncmFtbWFyLCBmb3JtYXR0aW5nKS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLVRodSBOb3YgIDQgMTQ6NDY6MTQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QHJ0bC5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9jYWNoZWFibGUsIGJmZF9zZXRfY2FjaGVhYmxlKTogIE5ldyBhY2Nlc3NvcnMuCi0JKiBiZmQuYywgb3BuY2xzLmM6ICBJbXByb3ZlIGNvbW1lbnRzIG9uIGZpbGUgZGVzY3JpcHRvciBjYWNoZWluZy4KLQotVGh1IE5vdiAgNCAwODo1NDozMCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogRnJvbSBQZXRlIEhvb2dlbmJvb20gKGhvb2dlbkBjcy51dGFoLmVkdSkKLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBGaXggbG9naWMgZXJyb3IKLQlpbiBsYXN0IGNoYW5nZS4gIEFsd2F5cyByZWJ1aWxkIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiB0aGUgZmlyc3QKLQl0aW1lIHRob3VnaCBpZiBvdXRwdXQgc2VjdGlvbnMgZXhpc3QgKGZpeGVzIGxkIC1yIHByb2JsZW1zKS4KLQotVGh1IE5vdiAwNCAwODowODo0NiAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIC5QSE9OWSBmb3IgY2hlY2sgYW5kIGluc3RhbGxjaGVjayBydWxlcy4KLQotVHVlIE5vdiAgMiAxNDo0MjoyNyAxOTkzICBCaWxsIENveCAoYmlsbEB0YXJrYXMuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKGFydGRhdGEpOiBVc2UgbG9uZywgbm90IHRpbWVfdCBmb3IgcG9ydGFiaWxpdHksIGF0Ci0JICBsZWFzdCB0byBIUFVYLiAgRmlsZSBiZWxvdyBpcyBhIGRlcml2ZWQgZmlsZS4KLQotVHVlIE5vdiAgMiAxNDo0MjoyNyAxOTkzICBCaWxsIENveCAoYmlsbEB0YXJrYXMuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmggKGFydGRhdGEpOiBVc2UgbG9uZywgbm90IHRpbWVfdCBmb3IgcG9ydGFiaWxpdHksIGF0Ci0JICBsZWFzdCB0byBIUFVYLgotCi1UdWUgTm92ICAyIDA5OjMyOjI1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBVc2UgYmlnbWlwcyBmb3IgbWlwcyotKi1ic2QqLgotCi1Nb24gTm92ICAxIDE0OjMwOjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NhX3RhYmxlLCBlbGZfc2x1cnBfcmVsb2NfdGFibGUpOgotCUhhbmRsZSBzeW1ib2wgbnVtYmVyIG9mIHplcm8uCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZGVkCi0JQkZEX1JFTE9DX01JUFNfTElURVJBTCwgQkZEX1JFTE9DX01JUFNfR09UMTYsCi0JQkZEX1JFTE9DX01JUFNfQ0FMTDE2LCBCRkRfUkVMT0NfTUlQU19HUFJFTDMyLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY29mZi1taXBzLmMgKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlCi0JQkZEX1JFTE9DX01JUFNfTElURVJBTC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19yZWxvY19tYXApOiBIYW5kbGUgbmV3IHJlbG9jcy4KLQkobWlwc19lbGZfaGkxNl9yZWxvYywgbWlwc19lbGZfbG8xNl9yZWxvYyk6IFJlYXJyYW5nZSBfZ3BfZGlzcAotCWNoZWNrcyBzbGlnaHRseS4KLQotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQsIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZCwKLQlNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXQgW3NpY10pOiBSZW1vdmUgdW51c2VkIGRlZmluaXRpb25zLgotCShNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLCBNWV9iZmRfcmVsYXhfc2VjdGlvbiwKLQlNWV9iZmRfc2VjbGV0X2xpbmspOiBEZWZpbmUuCi0JKE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZSBmcm9tCi0JTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXAuCi0JKE1ZX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IFJlbmFtZSBmcm9tIE1ZX21ha2VfZGVidWdfc3ltYm9sLgotCShNWSh2ZWMpKTogVXNlIEpVTVBfVEFCTEUgcmF0aGVyIHRoYW4gbGlzdGluZyBmdW5jdGlvbnMuCi0JKiBocDMwMGhwdXguYyAoTVlfZ2V0X3N5bXRhYiwgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwKLQlNWV9jYW5vbmljYWxpemVfcmVsb2MsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGRlZmluZSBpbgotCXRlcm1zIG9mIE1ZLCBiZWNhdXNlIHRoYXQgY2F1c2VzIGEgcmVjdXNpdmUgaW52b2NhdGlvbiBvZiBDQVQgd2hlbgotCWV4cGFuZGVkIHdpdGhpbiBKVU1QX1RBQkxFLCBhbmQgQU5TSSBjb21waWxlcnMgZG9uJ3QgZXhwYW5kCi0JcmVjdXJzaXZlIG1hY3Jvcy4KLQkqIG1pcHNic2QuYyAoTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lIGZyb20KLQlNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cCwgYW5kIGRvbid0IGRlZmluZSBpbiB0ZXJtcyBvZiBNWS4KLQkoTVlfY2Fub25pY2FsaXplX3JlbG9jKTogRG9uJ3QgZGVmaW5lIGluIHRlcm1zIG9mIE1ZLgotCShhb3V0X21pcHNfbGl0dGxlX3ZlYywgYW91dF9taXBzX2JpZ192ZWMpOiBVc2UgSlVNUF9UQUJMRSByYXRoZXIKLQl0aGFuIGxpc3RpbmcgZnVuY3Rpb25zLgotCi1Nb24gTm92ICAxIDA5OjEyOjI1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBVc2UgbTY4ay1lbGYgZm9yIG02OCotKi1zeXN2NCouCi0KLVN1biBPY3QgMzEgMDk6MzU6NDkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYzogTW92ZSBlbnVtIHRhcmdldF9mbGF2b3VyIG91dHNpZGUgb2Ygc3RydWN0IGFuZCBjaGFuZ2UKLQl0aGUgbmFtZSB0byBlbnVtIGJmZF9mbGF2b3VyLiAgVGhpcyBtZWFucyBiZmQgY2xpZW50cyBjYW4gdXNlIGl0LgotCSogYmZkLWluLmg6IEFkZCBtYWNybyBiZmRfZ2V0X2ZsYXZvdXIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIHNvbS5jOiBBZGQgY29tbWVudCBhYm91dCBob3cgYWJvcnQoKSBvbiBjb3JydXB0IGV4ZWN1dGFibGUgaXMgZXZpbC4KLQotU2F0IE9jdCAzMCAxMjoyNzowOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpOiBBdm9pZCBhIGdvdG8uCi0KLUZyaSBPY3QgMjkgMTY6MDQ6MzMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBnZW4tYW91dC5jLCBsaWJiZmQuYzogZXhpdCgxKSBpbnN0ZWFkIG9mIGV4aXQoLTEpLgotCi1GcmkgT2N0IDI5IDEzOjE3OjIxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6IEFkZGVkIGNvbW1hbmRzIGZvciBvYmplY3QgZmlsZSBmbGFnIHZhbHVlcy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogSWYgdHlwZSBpcyBFVF9EWU4sIHNldCBEWU5BTUlDIGZsYWcsCi0Jbm90IEVYRUNfUC4KLQkqIGJvdXQuYywgY29mZi1oODMwMC5jLCBjb2ZmLXNoLmM6IEFkZCBCRkRfSVNfUkVMQVhBQkxFIHRvCi0Jb2JqZWN0X2ZsYWdzIGZpZWxkIGZvciB0YXJnZXQgdmVjdG9yLgotCSogYWl4Mzg2LWNvcmUuYywgYW91dC1hZG9iZS5jLCBhb3V0LXRhcmdldC5oLCBib3V0LmMsIGNvZmYtYTI5ay5jLAotCWNvZmYtYWxwaGEuYywgY29mZi1hcG9sbG8uYywgY29mZi1oODMwMC5jLCBjb2ZmLWg4NTAwLmMsCi0JY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMsIGNvZmYtbWlwcy5jLAotCWNvZmYtcnM2MDAwLmMsIGNvZmYtc2guYywgY29mZi13ZTMyay5jLCBjb2ZmLXo4ay5jLCBocHV4LWNvcmUuYywKLQlpZWVlLmMsIG1pcHNic2QuYywgbmxtLXRhcmdldC5oLCBvYXN5cy5jLCBvc2YtY29yZS5jLCBzb20uYywKLQlzcmVjLmMsIHRla2hleC5jLCB0cmFkLWNvcmUuYzoJUmVtb3ZlIERZTkFNSUMgZnJvbSBvYmplY3RfZmxhZ3MKLQlmaWVsZCBmb3IgdGFyZ2V0IHZlY3Rvci4KLQotVGh1IE9jdCAyOCAyMDowMjozMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6IERvbid0IGRlY2xhcmUgdGltZTsgY2F1c2VzIGVycm9yIG9uIG1hY2gzLgotCSogY29uZmlndXJlLmluIChpMzg2bWFjaDNfdmVjKTogUmVxdWlyZSBhb3V0MzIubyBzdGFiLXN5bXMuby4KLQotVGh1IE9jdCAyOCAxNjozMzoyNiAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQlMeW54T1MgYW5kIFNwYXJjIEx5bnhPUyBjaGFuZ2VzOgotCSogY29uZmlnLmJmZDogUmVjb2duaXplIHNwYXJjLSotbHlueG9zKi4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgc3BhcmMtKi1seW54b3MqLgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgU3BhcmMgTHlueCB2ZWN0b3JzLgotCSogdGFyZ2V0cy5jIChzcGFyY2x5bnhfYW91dF92ZWMpOiBEZWNsYXJlLgotCShzcGFyY2x5bnhfY29mZl92ZWMpOiBEZWNsYXJlLgotCSh0YXJnZXRfdmVjdG9yKTogQWRkIHRoZW0uCi0JKiBjZi1pMzg2bHlueC5jOiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIGkzODZseW54LWNmLmMuCi0JKiBjZi1tNjhrbHlueC5jOiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIG02OGtseW54LWNmLmMuCi0JKiBjZi1zcGFyY2x5bnguYzogTmV3IGZpbGUsIHN1cHBvcnQgZm9yIGNvZmYgaW4gU3BhcmMgTHlueE9TLgotCSogY29mZi1zcGFyYy5jOiBOZXcgZmlsZSwgYmFzaWMgU3BhcmMgY29mZiBzdXBwb3J0LgotCSogc3BhcmNseW54LmM6IE5ldyBmaWxlLCBzdXBwb3J0IGZvciBhLm91dCBpbiBTcGFyYyBMeW54T1MuCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGZpbGVuYW1lcyBhcHByb3ByaWF0ZWx5LCBhZGQgU3BhcmMgcnVsZXMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFJlY29nbml6ZSBTcGFyYyBtYWdpYwotCW51bWJlci4KLQkoY29mZl9zZXRfZmxhZ3MpOiBVc2UgTHlueE9TIG1hZ2ljIG51bWJlciBmb3IgaTM4NiwgbTY4aywgYW5kCi0JU3BhcmMgTHlueE9TLCBzZXQgU3BhcmMgbWFnaWMgbnVtYmVyIGZvciBTcGFyY3MuCi0JKiBjb25maWcvbTY4ay1seW54Lm10IChTRUxFQ1RfVkVDUyk6IFJlbW92ZSByZWR1bmRhbnQgdmVjdG9yLgotCSogY29uZmlnL3NwYXJjLWx5bngubXQ6IE5ldyBmaWxlLgotCSogaG9zdHMvaTM4Nmx5bnguaDogQ29zbWV0aWMgaW1wcm92ZW1lbnRzLgotCSogaG9zdHMvbTY4a2x5bnguaDogQWRkIGlmZGVmcywgI2RlZmluZSBvZiBjZnJlZS4KLQkqIGhvc3RzL3NwYXJjbHlueC5oOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAyOCAxNjoyMzo0MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlnY2MgLVdhbGwgbGludDoKLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IERlY2xhcmUgcmV0dXJuIHR5cGUuCi0JUmVtb3ZlIHVzZWxlc3Mgc3RhdGVtZW50IHByb2JhYmx5IGxlZnQgYnkgY29kZSBjb3B5LgotCSogY3B1LWk5NjAuYyAoY29tcGF0aWJsZSk6IEZ1bGx5IGJyYWNrZXQgbWF0cml4IGluaXRpYWxpemVyLgotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IFVzZSBiZmRfeG1hbGxvYwotCXJhdGhlciB0aGFuIHhtYWxsb2MuICBVc2UgcmVhbGxvYyBhbmQgY2hlY2sgdGhlIHJldHVybiB2YWx1ZQotCXJhdGhlciB0aGFuIHhyZWFsbG9jLgotCShocHBhX2VsZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IEFkZCBzb21lIGNhc3RzLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IFJlbW92ZSB1bnVzZWQKLQl2YXJpYWJsZS4gIEFkZCBkZWZhdWx0IGNhc2UgdG8gc3dpdGNoLgotCSogaHAzMDBocHV4LmM6IERlY2xhcmUgYW91dF8zMl93cml0ZV9zeW1zLgotCSogaTM4NmJzZC5jLCBpMzg2bGludXguYywgbmV0YnNkMzg2LmMgKE5fU0hBUkVEX0xJQik6IERlZmluZSBhcyAwCi0JKGRlZmluaXRpb24gZnJvbSBhb3V0L2FvdXQ2NC5oIGlzIGFsd2F5cyAwIGFueWhvdykuCi0JKiBpMzg2bHlueC5jIChzd2FwX3N0ZF9yZWxvY19pbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfaWQpOiBsZW5ndGggY2FuIG5ldmVyIGJlIG5lZ2F0aXZlLgotCShyZWFkX2lkKTogTGlrZXdpc2UuCi0JKGllZWVfYXJjaGl2ZV9wKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KLQkqIGxpYmNvZmYtaW4uaCAoYmZkX3BlcmZvcm1fc2xpcCk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IFJlbW92ZSB6ZXJvIGluaXRpYWxpemF0aW9uIG9mCi0Jc3RhdGljIHN0cnVjdHVyZS4KLQkqIHJlbG9jMTYuYzogSW5kZW50YXRpb24gY2hhbmdlLgotCi1XZWQgT2N0IDI3IDE2OjUxOjI5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9pMzg2LW1hY2gzLm10OiBVcGRhdGUgZm9yIG5ldyBjb25maWd1cmF0aW9uCi0JKC0td2l0aC10YXJnZXRzCWFuZCBzbyBvbikuCi0JKiBob3N0cy9pMzg2bWFjaDMuaDogRGVjbGFyZSBlcnJuby4KLQkqIHRhcmdldHMuYzogRGVjbGFyZSBpMzg2bWFjaDNfdmVjLgotCi1XZWQgT2N0IDI3IDEyOjE4OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbiwKLQlubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBIYW5kbGUgc2hhcmVkRGVidWdSZWNvcmRPZmZzZXQKLQlhbmQgc2hhcmVkRGVidWdSZWNvcmRDb3VudCBmaWVsZHMuCi0KLVR1ZSBPY3QgMjYgMTY6MjE6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZSBTQ09fQ09SRS4gIE9uIFNlcCAxMSAxOTkzLAotCXdlIHN0YXJ0ZWQgdXNpbmcgdHJhZC1jb3JlLmMgZm9yIFNDTyBpbnN0ZWFkLgotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBSZS1lbmFibGUgZ2VuZXJpYyBFTEYgYW5kIE5MTSB0YXJnZXRzLgotCi1UdWUgT2N0IDI2IDE2OjUzOjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IEFsaWduIHNoX29mZnNldCB0bwotCXNoX2FkZHJhbGlnbiAodGhpcyBpcyB3aGF0IFVuaXhXYXJlIGRvZXMsIGFuZCBpdCBzaG91bGRuJ3QgaHVydCkuCi0KLVR1ZSBPY3QgMjYgMTA6MTY6NTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQlGcm9tIEplZmYgTGF3IGFuZCBQZXRlIEhvb2dlbmJvb20gYXQgVXRhaDoKLQotCSogZWxmMzItaHBwYS5oIChocHBhX2VsZl9zdHViX2ZpbmlzaCk6IEFkZCBwcm90b3R5cGUuCi0JKEVMRjMyX0hQUEFfUl9BUkdfUkVMT0MpOiBSZW5hbWVkIHdpdGhvdXQgdGhlIEVMRjMyIHByZWZpeAotCWFuZCBtb3ZlZCBpbnRvIGxpYmhwcGEuaC4gIEFsbCByZWZlcmVuY2VzIGNoYW5nZWQuCi0JKEVMRjMyX0hQUEFfUl9DT05TVEFOVCwgRUxGMzJfSFBQQV9SX0FEREVORCk6IExpa2V3aXNlLgotCShnZXRfb3Bjb2RlIGFuZCBvcGNvZGUgZGVmaW5lcyk6IE1vdmUgaW50byBsaWJocHBhLmgKLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfaW5zbjJmbXQpOiBSZW5hbWUgYW5kIG1vdmUgaW5mbwotCWxpYmhwcGEuaC4KLQkqIGxpYmhwcGEuaCAoSFBQQV9SXyopOiBNb3ZlZCBoZXJlLiAgUmVmb3JtYXR0ZWQgc2xpZ2h0bHkgdG8gbWFrZQotCWZvciBlYXNpZXIgcmVhZGluZy4KLQkoZ2V0X29wY29kZSk6IE1vdmVkIGhlcmUuICBGSVhNRSEgdGhpcyByZWFsbHkgc2hvdWxkIGJlIGEgQyBmdW5jdGlvbgotCWluc2lkZSB0aGUgb3Bjb2RlIGxpYnJhcnkhCi0JKGJmZF9ocHBhX2luc24yZm10KTogTGlrZXdpc2UuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEVuYWJsZSBlbGYzMi1ocHBhIHZlY3Rvci4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IEFkZCBuZXcgY29tbWVudHMKLQlhbmQgY2xhcmlmeSBleGlzdGluZyBjb21tZW50cy4gIERvIG5vdCB1c2UgREVGVU4gdG8gZGVjbGFyZSB0aGlzCi0JZnVuY3Rpb24uICBGaXggbnVtZXJvdXMgaW5kZW50aW9uIHByb2JsZW1zLiAgQ29ycmVjdGx5IGhhbmRsZSBjYXNlcwotCXdoZXJlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiBtYXkgbmVlZCB0byBiZSByZWFkIGZyb20gZGlzaywgCi0JcmVhZCBmcm9tIG1lbW9yeSwgb3IgYnVpbHQgdGhlbiByZWFkIGZyb20gbWVtb3J5LgotCi0JKiBlbGYzMi1ocHBhLmg6IFJlZm9ybWF0IHdpdGggZ251LWluZGVudCBhbmQgaGFuZCBmaXggbnVtZXJvdXMKLQlmb3JtYXR0aW5nIGFuZCBpbmRlbnRpb24gcHJvYmxlbXMgZ251LWluZGVudCBjYW4gbm90IGhhbmRsZS4KLQlDbGFyaWZ5IHNvbWUgY29tbWVudHMgYWJvdXQgcmVsb2NhdGlvbiB0eXBlcy4gIENvbW1lbnQgYmFzaWMKLQlyZWxvY2F0aW9uICJjbGFzc2VzIi4gIEdyb3VwIFBBUkFNIGRlY2xhcmF0aW9ucyB0b2dldGhlci4KLQkoSFBQQV9TWFRfe05VTEwsIFNZTU5EWCwgUkdfUkVMT0N9KTogTWFrZSBtZW1iZXJzIG9mIGEgbmV3IAotCWVudW1lcmF0ZWQgdHlwZSByYXRoZXIgdGhhbiAjZGVmaW5lcy4KLQotVHVlIE9jdCAyNiAwMjo0MDo0NiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzb20uYyAoaHBwYV9vYmplY3Rfc2V0dXApOiAgU2V0IFNFQ19DT0RFIGZvciAudGV4dCBzZWN0aW9uIHNvCi0JdGhhdCBHREIgY2FuIGZpZ3VyZSBvdXQgdGV4dF9zdGFydCBhbmQgdGV4dF9lbmQuCi0KLU1vbiBPY3QgMjUgMTY6MDU6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JRml4IHVwIHdhcm5pbmdzIGZyb20gZ2NjIC1XYWxsOgotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IFVzZSAlbHggYW5kIGNhc3Qgbl92YWx1ZSB0bwotCXVuc2lnbmVkIGxvbmcuICBVc2UgJWxkIGZvciB0YWduZHguICBVc2UgJWx4IGZvciBvZmZzZXQgKyB2bWEgYW5kCi0JY2FzdCBpdCB0byB1bnNpZ25lZCBsb25nLgotCSogZWNvZmYuYyAoZWNvZmZfZW1pdF9hZ2dyZWdhdGUpOiBVc2UgJWxkLgkKLQkoZWNvZmZfcHJpbnRfc3ltYm9sKTogVXNlICVsZCwgYW5kIGNhc3QgaW5keCBhbmQgc3ltX2Jhc2UgdG8gbG9uZy4KLQkqIGNvZmZjb2RlLmggKGR1bW15X3JlbG9jMTZfZXN0aW1hdGUpOiBTcGVjaWZ5IHJldHVybiB0eXBlLgotCi0JKiBsaWJiZmQuYyAoYmZkX3dyaXRlKTogSWYgbm90IGV2ZXJ5dGhpbmcgaXMgd3JpdHRlbiBvdXQsIHNldAotCWJmZF9lcnJvciB0byBzeXN0ZW1fY2FsbF9lcnJvci4gIElmIHRoZSByZXR1cm4gdmFsdWUgaXMKLQlub24tbmVnYXRpdmUsIHNldCBlcnJubyB0byBFTk9TUEMgKGlmIEVOT1NQQyBpcyBkZWZpbmVkKS4KLQkoYmZkX3NlZWspOiBJZiB0aGUgc2VlayBmYWlscywgc2V0IGJmZF9lcnJvciB0byBzeXN0ZW1fY2FsbF9lcnJvci4KLQkoYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBGb3IgYSBiYWQgb2Zmc2V0ICsgY291bnQsIHNldAotCWJmZF9lcnJvciB0byBiYWRfdmFsdWUuCi0JKiBzZWNsZXQuYyAocmVsKTogRG9uJ3QgYWJvcnQuICBJbnN0ZWFkLCByZXR1cm4gZmFsc2UuCi0KLU1vbiBPY3QgMjUgMDk6NTk6MzcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHJlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyLgotCi1GcmkgT2N0IDIyIDIwOjM1OjU0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogaGFuZGxlIG1pcHMqLSogaW5zdGVhZCBvZiBtaXBzLSosIHVzZSBtaXBzKmVsCi0JICBpbnN0ZWFkIG9mIG1pcHMtKi0qbAotCi1GcmkgT2N0IDIyIDE0OjAzOjMzIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIG02OGstbHlueC5tdCwgaTM4Ni1seW54Lm10IChUREVGSU5FUyk6IHNldAotCUZQUklOVEZfQUxSRUFEWV9ERUNMQVJFRCBiZWNhdXNlIHRoZSBvYmpkdW1wLmMgZGVjbGFyYXRpb24gb2YKLQlmcHJpbnRmIGNvbGxpZGVzIHdpdGggdGhlIG5hdGl2ZSBvbmUuCi0KLUZyaSBPY3QgMjIgMTE6NTA6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBFbmFibGUgTUlQUyBFTEYgdmVjdG9ycy4KLQotRnJpIE9jdCAyMiAwNzo1MTo1MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogVXNlIGJpZ21pcHMgZm9yIG1pcHMtc29ueS1ic2QqLgotCi0JKiBjb25maWd1cmUuaG9zdCwgY29uZmlnLmJmZDogQWRkICogdG8gZW5kIG9mIGFsbCBPUyBuYW1lcy4KLQotVGh1IE9jdCAyMSAxMjoxNjoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChGSUxFX0FMSUdOKTogUmVuYW1lZCBmcm9tIEVBTElHTiwgdG8gYXZvaWQgY29uZmxpY3QKLQl3aXRoIFVsdHJpeCBoZWFkZXIgZmlsZXMuCi0KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBSZW5hbWVkIGZyb20KLQlzb21fc2VjdGlvbl9kYXRhIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggbWFjcm8gYnkgdGhhdCBuYW1lLgotCi0JQ2hhbmdlcyBmcm9tIEplZmYgTGF3IGFuZCBQZXRlciBIb29nZW5ib29tIGF0IFV0YWg6Ci0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2MpOiAgVGFyZ2V0IHJlZ2lzdGVyIGZvciBhICdqdW1wCi0JaW4gZGVsYXkgc2xvdCcgb3B0aW1pemF0aW9uIGluIGNvbWJpbmF0aW9uIHdpdGggYSBsb25nIGNhbGwKLQlzdHViIHNob3VsZCBhbHdheXMgYmUgcjMxLgotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9yZWxvY2F0ZV9pbnNuKTogVG8gYmUgY29uc2lzdGVudAotCWFjcm9zcyBhbGwgcmVsb2NhdGlvbiB0eXBlcywgcmV0cmlldmUgaW5zdHJ1Y3Rpb24gYWRkZW5kcyBmcm9tCi0JdGhlIHJlbG9jYXRpb24gZW50cnkgcmF0aGVyIHRoYW4gZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmLgotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9yZWxvY2F0ZV9pbnNuKTogRml4IGEgcmVsb2NhdGlvbgotCWVycm9yIHRoYXQgb25seSBvY2N1cnJlZCB3aGVuIHRoZSBhZGRlbmQgb2YgYW4gJ2FkZGlsJyBvcgotCSdsZGlsJyB3YXMgbGFyZ2VyIHRoYW4gMjEgYml0cyBhbmQgdmVyeSBjbG9zZSB0byBhIDJLIGJ5dGUKLQlib3VuZGFyeS4KLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfcmVsb2MpOiAgSGFuZGxlIHRoZSBvcHRpbWl6YXRpb24gaW4KLQl3aGljaCBhIGp1bXAgaXMgcGxhY2VkIGluIHRoZSBkZWxheSBzbG90IG9mIGEgZnVuY3Rpb24gY2FsbC4KLQlUaGUganVtcCB3YXMgYmVpbmcgYWNjb21wbGlzaGVkIHZpYSBhbiBhZGp1c3RtZW50IHRvIHRoZQotCXJldHVybiBwb2ludGVyLiAgVGhpcyBvcHRpbWl6YXRpb24gd291bGQgYnJlYWsgdGhlIGxvbmcgY2FsbAotCXN0dWIgY29kZSwgaWYgdGhlcmUgd2FzIGFueS4KLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IENvcnJlY3Rpb25zCi0JdG8gbG9uZyBicmFuY2ggc3R1YnMgdG8gYXZvaWQgdXNlIG9mIGdlbmVyYWwgcmVnaXN0ZXIgMi4KLQotCSogaHBwYV9zdHVicy5oOiBOZXcgc3R1YiBpbnN0cnVjdGlvbnMuCi0KLQkqIGVsZmNvZGUuaDogRGVjbGFyZSBiZmRfZWxmX2ZpbmRfc2VjdGlvbi4KLQotCSogc29tLmggKHNvbV9zZWN0aW9uX2RhdGEpOiBBZGQgbmV3ICJzdWJzcGFjZV9pbmRleCIgZmllbGQuCi0KLQkqIHNvbS5jIChzZXR1cF9zZWN0aW9ucyk6IFNhdmUgdGhlIG9yaWdpbmFsIFNPTSBzdWJzcGFjZSBpbmRleAotCWluIHRoZSBCRkQgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhhdCBzdWJzcGFjZS4gIAotCShzb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IEltcGxlbWVudC4KLQkoc29tX2dldF9zeW10YWIpOiBJbXBsZW1lbnQuCi0JKHNvbV9wcmludF9zeW1ib2wpOiBJbXBsZW1lbnQuCi0JKHNvbV9zbHVycF9zdHJpbmdfdGFibGUpOiBOZXcgZnVuY3Rpb24gdG8gcmVhZCBhIHN0cmluZyB0YWJsZQotCWZyb20gYSBTT00gb2JqZWN0IGZpbGUuCi0JKHNvbV9zZWN0aW9uX2Zyb21fc3Vic3BhY2VfaW5kZXgpOiBOZXcgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZQotCXNlY3Rpb24gd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBTT00gc3Vic3BhY2UgaW5kZXguCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBOZXcgZnVuY3Rpb24gdG8gcmVhZCB0aGUgc3ltYm9sCi0JdGFibGUgZnJvbSBhIFNPTSBvYmplY3QgZmlsZS4KLQkoc29tX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGJmZF96YWxsb2MuCi0JKHNvbV9uZXdfc2VjdGlvbl9ob29rKTogSW5pdGlhbGl6ZSBzdWJzcGFjZV9pbmRleCBmaWVsZCB0bwotCS0xIGluc3RlYWQgb2YgMC4KLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBGaXggcG9sYXJpdHkgb2YgdGVzdCB0byBzZXQgSEFTX1JFTE9DLgotCVNldCBFWEVDX1AgZm9yIGV4ZWN1dGFibGVzLgotCShzZXR1cF9zZWN0aW9ucyk6IENvcnJlY3RseSBpZGVudGlmeSB3aGVuIGEgc2VjdGlvbiBoYXMKLQlyZWxvY2F0aW9ucy4KLQkobG9nMik6IE5ldyBmdW5jdGlvbi4KLQkoc2V0dXBfc2VjdGlvbnMpOiBDb3JyZWN0bHkgY29udmVydCBiZXR3ZWVuIFNPTSBhbGlnbm1lbnRzIGFuZCBCRkQKLQlhbGlnbm1lbnRzLgotCi0JKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBEbyBub3Qgc2V0IFNFQ19BTExPQyBvciBTRUNfTE9BRAotCWZvciBzZWN0aW9ucyB3aGljaCBjb3JyZXNwb25kIHRvIFNPTSBzcGFjZXMsIGRvaW5nIHNvIGNvbmZ1c2VzCi0JbWFueSB1dGlsaXRpZXMuICBTZXQgYXNzb3J0ZWQgU0VDXyogZmxhZ3MgZm9yIFNPTSBzdWJzcGFjZXMKLQl3aGljaCBjb3JyZXNwb25kIHRvIEJGRCBzZWN0aW9ucy4KLQotCSogZWxmMzItaHBwYS5jOiAoZWxmMzJfaHBwYV9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpOiBUaGUgc3RhYgotCXN0cmluZyB0YWJsZSBzaG91bGQgaGF2ZSBzaF90eXBlID09IFNIVF9TVFJUQUIuICBBZGQKLQlwcm9jZXNzaW5nIHRvIG1ha2UgaXQgc28uCi0KLQkqIGVsZmNvZGUuaDogKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFN0cmluZyB0YWJsZXMgKG90aGVyCi0JdGhhbiAuc3RydGFiKSB3ZXJlIG5vdCBnZXR0aW5nIHRoZSBmaWxlIG9mZnNldHMgcmVjb3JkZWQsIHNvCi0JdGhleSBjb3VsZCBub3QgYmUgcmVhZCBmcm9tIGRpc2suCi0KLQkqIGVsZmNvZGUuaDogKGVsZl9tYWtlX3NlY3Rpb25zKTogIExlYXZlIHRoZSBzaF9hZGRyIGZpZWxkIG9mCi0JdGhlIHNlY3Rpb24gaGVhZGVyIGFuZCB0aGUgdm1hIGZpZWxkIG9mIGEgc2VjdGlvbiBhdCAwIGlmIHRoZQotCXNlY3Rpb24gaXMgbm90IHBhcnQgb2YgdGhlIHByb2dyYW0gZXhlY3V0aW9uIGltYWdlLiAoZS5nLiwKLQkuc3RhYikKLQotCSogc29tLltoY106IENoYW5nZSB0YXJnZXQgdmVjdG9yIHByZWZpeCBmcm9tICJocHBhIiB0byAic29tIi4KLQlDb25zaXN0ZW50bHkgdXNlIG9ial9zb20gcHJlZml4IHRvIGFjY2VzcyBmaWVsZHMgaW4gYmFja2VuZCBkYXRhCi0Jc3RydWN0dXJlcy4gIEZpeCBhbGwgY2FsbGVycy9yZWZlcmVuY2VzLgotCi0JKiBzb20uaDogRG8gbm90IGluY2x1ZGUgZmlsZXMgb25seSBuZWVkZWQgZm9yIGNvcmUgZmlsZSByZWFkaW5nIGhlcmUuCi0JSW5jbHVkZSBhLm91dCBmb3IgYm90aCBIT1NUX0hQUEFIUFVYIGFuZCBIT1NUX0hQUEFCU0QuICBEZWxldGUKLQlmb3J3YXJkIHN0cnVjdHVyZSBkZWNsYXJhdGlvbnMsIHRoZXkgYXJlIHVubmVjZXNzYXJ5LgotCShzdHJ1Y3Qgc29tZGF0YSk6IERlbGV0ZSBhdXhfaGRyLCBhbmQgaHBfc3ltYm9sX2VudHJ5X3NpemUgZmllbGRzLgotCUNoYW5nZSAic3ltYm9scyIgdG8gInN5bXRhYiIuICBBZGQgInN0cmluZ3RhYiIgYW5kICJyZWxvY19maWxlcG9zIgotCWZpZWxkcyBmb3IgZnV0dXJlIHVzZS4gIENoYW5nZSBvYmpfc29tXyogbWFjcm9zIGFzIGFwcHJvcHJpYXRlLgotCShzb21fc2VjdGlvbl9kYXRhKTogTmV3IHN0cnVjdHVyZSB0byBrZWVwIFNPTSBzcGVjaWZpYyBpbmZvcm1hdGlvbgotCWFib3V0IEJGRCBzZWN0aW9ucyAoZm9yIGZ1dHVyZSB1c2UpLgotCi0JKiBzb20uYzogUHJvdmlkZSBQQVJBTVMgZGVjbGFyYXRpb25zIGZvciBhbGwgZnVuY3Rpb25zIGN1cnJlbnRseQotCWluIHRoaXMgZmlsZS4KLQkoc3RydWN0IGNvbnRhaW5lcik6IERlbGV0ZSB1bndhbnRlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KLQkoc29tX29iamVjdF9zZXR1cCk6IEFkZCBjb21tZW50cy4gIFVzZSBzb21fbWtvYmplY3QgdG8gYWxsb2NhdGUKLQlTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24gaW4gdGhlIEJGRDsgdXNlIGluZm9ybWF0aW9uIGZyb20gdGhlCi0JZmlsZSBhbmQgKHBvc3NpYmx5IGVtcHR5KSBhdXhpbGlhcnkgaGVhZGVycyB0byBpbml0aWFsaXplIHRoaXMKLQlpbmZvcm1hdGlvbi4gIERlbGV0ZSByZWR1bmRhbnQgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgImNhbGxzIi4KLQkoc2V0dXBfc2VjdGlvbnMpOiBSZXR1cm4gdHlwZSBpcyBub3cgYm9vbGVhbiwgZml4IHJldHVybiBzdGF0ZW1lbnRzLgotCSJGaXgiIGhhbmRsaW5nIG9mIEJTUyBsaWtlIHN1YnNwYWNlcyBpbiB0aGUgY29tcHV0YXRpb24gb2YgdGhlCi0JY29udGFpbmluZyBzcGFjZSdzIHNpemUuICBJZiB0aGUgc3Vic3BhY2UgaGFzIHJlbG9jYXRpb25zLCBzZXQgdGhlCi0JYXBwcm9wcmlhdGUgQkZEIHNlY3Rpb24gZmxhZ3MgYW5kIHJlY29yZCB0aGUgaW5kZXggaW50byBhbmQgdGhlCi0Jc2l6ZSBvZiB0aGUgZml4dXAgc3RyZWFtLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCShzb21fb2JqZWN0X3ApOiBTZXQgYmZkX2Vycm9yIGFwcHJvcHJpYXRlbHkgaWYgZXJyb3JzIGFyZSBkZXRlY3RlZAotCWZyb20gYmZkX3tyZWFkLHNlZWt9IGZ1bmN0aW9ucy4gIEhhbmRsZSBFWEVDTElCTUFHSUMgdHlwZSBmaWxlcy4KLQlEbyBub3QgdHJ5IHRvIHJlYWQgYSBub24tZXhpc3RhbnQgYXV4aWxpYXJ5IGhlYWRlci4KLQkoc29tX21rb2JqZWN0KTogRmxlc2ggb3V0LgotCShzb21fc2VjdGlvbl9ob29rKTogQWxsb2NhdGUgc3BhY2UgdG8gaG9sZCBTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24KLQlhYm91dCBzZWN0aW9ucy4KLQotVGh1IE9jdCAyMSAxMjo0MTozNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCWdjYyAtV2FsbCBsaW50OgotCSogY29mZi1oODMwMC5jLCBjb2ZmY29kZS5oOiBDaGFuZ2Ugc2hyaW5rIHBhcmFtZXRlcgotCWluICpfcmVsb2MxNl9lc3RpbWF0ZSB0byB1bnNpZ25lZCB0byBtYXRjaCBwcm90b3R5cGUuCi0JKiBhcmNoaXZlLmM6IEF2b2lkICIvKiIgaW4gY29tbWVudC4KLQotVGh1IE9jdCAyMSAxMzowNToxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGRlcC1pbi5zZWQ6IENyZWF0ZSBvdXIgb3duIGxpbmUgYnJlYWtzIGZvciBhIG1vcmUgYWVzdGhldGljCi0JTWFrZWZpbGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVsZjMyLW1pcHMuYzogSW5jbHVkZSAic2VjbGV0LmgiLgotCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogRm9yY2Ugc2l6ZSBvZiAucmVnaW5mbyBzZWN0aW9uIHRvIHNpemVvZgotCUVsZjMyX0V4dGVybmFsX1JlZ0luZm8uCi0JKG1pcHNfZWxmX3NlY2xldF9saW5rKTogTmV3IGZ1bmN0aW9uLiAgTGluayB0aGUgLnJlZ2luZm8gc2VjdGlvbgotCXNwZWNpYWxseSwgYW5kIHBhc3MgZXZlcnl0aGluZyBlbHNlIHRvIHRoZSBnZW5lcmljIHJvdXRpbmUuCi0JKGJmZF9lbGYzMl9iZmRfc2VjbGV0X2xpbmspOiBEZWZpbmUgbWFjcm8uCi0JKiBlbGYzMi10YXJnZXQuaDogSWYgYmZkX2VsZjMyX2JmZF9zZWNsZXRfbGluayBpcyBhbHJlYWR5IGRlZmluZWQsCi0JZG9uJ3Qgb3ZlcnJpZGUgaXQuCi0KLVdlZCBPY3QgMjAgMTI6MjI6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJubG0uaCAobmxtX2JhY2tlbmRfZGF0YSk6IEFkZGVkIHNpZ25hdHVyZSBmaWVsZC4KLQkobmxtX3NpZ25hdHVyZSk6IE5ldyBtYWNyby4KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wLCBubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIHRoZSBOTE0KLQlzaWduYXR1cmUgZnJvbSB0aGUgYmFja2VuZCByYXRoZXIgdGhhbiB0aGUgY29uc3RhbnQgTkxNX1NJR05BVFVSRS4KLQkqIG5sbTMyLWkzODYuYyAobmxtMzJfaTM4Nl9iYWNrZW5kKTogSW5pdGlhbGl6ZSBzaWduYXR1cmUgZmllbGQuCi0KLQkqIGFvdXRmMS5oIChNQUNIVFlQRV9PSyk6IEFjY2VwdCBNX1VOS05PV04uCi0JKE5BTUUoc3Vub3Msc2V0X2FyY2hfbWFjaCkpOiBUcmVhdCBNX1VOS05PV04gYXMgNjgwMDAsIG5vdCA2ODAyMC4KLQotV2VkIE9jdCAyMCAxMDoyODoyNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NmJzZC5oIFtfX2JzZGlfX106IERlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUi4KLQotV2VkIE9jdCAyMCAxMDoxMDowNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEhGSUxFUyk6IE5ldyB2YXJpYWJsZSwgZm9yIHVzZSBpbiAibWFrZSBkZXAiLgotCSguZGVwKTogRGVwZW5kIG9uICQoQ0ZJTEVTKSBhbmQgJChIRklMRVMpLiAgRGVsZXRlIC5kZXAxIGFuZAotCXJlbWFrZSBpdCwgc28gdGhhdCAiJD8iIGlzIGNvbXBsZXRlLgotCSguZGVwMSk6IERvbid0IG5lZWQgdG8gcmVtb3ZlIC5kZXAxIGZpcnN0LgotCShkZXAuc2VkKTogRGVwZW5kIG9uIGNvbmZpZy5zdGF0dXMsIG5vdCBNYWtlZmlsZS4KLQkoQ0ZJTEVTKTogQWRkIG5sbS5jLgotCi1UdWUgT2N0IDE5IDE1OjI2OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jOiBJbXBsZW1lbnRlZCByZWxvYyBoYW5kbGluZyBmb3IgdGhlIGxpbmtlciwgbWFkZQotCXZhcmlvdXMgb3RoZXIgcmVsYXRlZCBjaGFuZ2VzLgotCSogbGliZWNvZmYuaCAoZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkZWQgcmRhdGFfaW5fdGV4dCBmaWVsZC4KLQlSZW5hbWVkIGZpbmlzaF9yZWxvYyB0byBhZGp1c3RfcmVsb2NfaW4uICBBZGRlZCBhZGp1c3RfcmVsb2Nfb3V0Ci0JZmllbGQuCi0JKGVjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBEb24ndCBkZWZpbmUuCi0JKiBlY29mZi5jIChlY29mZl9zZWNfdG9fc3R5cF9mbGFncywgZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOgotCUhhbmRsZSAubGl0YSBzZWN0aW9uLgotCShlY29mZl9zbHVycF9yZWxvY190YWJsZSk6IEhhbmRsZSBSRUxPQ19TRUNUSU9OX0ZJTkkuCi0JZmluaXNoX3JlbG9jIGJhY2tlbmQgZmllbGQgcmVuYW1lZCB0byBhZGp1c3RfcmVsb2NfaW4uCi0JKGVjb2ZmX2JmZF9zZWNsZXRfbGluayk6IEFkanVzdCBudW1iZXIgb2YgYXV4IGVudHJpZXMgdG8KLQlkZWJ1Z19hbGlnbiBib3VuZGFyeS4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgcmRhdGFfaW5fdGV4dCBwdXQKLQkucmRhdGEgc2VjdGlvbiBpbiB0ZXh0IHNlZ21lbnQsIG5vdCBkYXRhIHNlZ21lbnQuICBQdXQgLnBkYXRhCi0Jc2VjdGlvbiBpbiB0ZXh0IHNlZ21lbnQuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLiAgQWxzbywgY2FsbAotCWFkanVzdF9yZWxvY19vdXQsIGFuZCBoYW5kbGUgLmxpdGEsIC54ZGF0YSwgLnBkYXRhLCAuZmluaSBhbmQKLQlhYnNvbHV0ZSBzZWN0aW9ucyB3aGVuIHdyaXRpbmcgb3V0IHJlbG9jcy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IEZvciBBTFBIQUVDT0ZGLCBvdXRwdXQgMiBmb3IKLQlibGRyZXYgZmllbGQsIGFzIG9uIEFscGhhIE9TRi8xLiAgUGFkZGluZyBmaWVsZCBpcyBub3cgMiBieXRlcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogQWRkZWQgYXNzZXJ0aW9uLgotCShtaXBzX2FkanVzdF9yZWxvY19pbik6IFJlbmFtZWQgZnJvbSBtaXBzX2ZpbmlzaF9yZWxvYy4KLQkobWlwc19hZGp1c3RfcmVsb2Nfb3V0KTogTmV3IGZ1bmN0aW9uIChkb2VzIG5vdGhpbmcpLgotCShtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkoZWNvZmZfYmZkX2dldF9yZWxvY2F0aW9uX3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUgdG8gYmUKLQliZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBZGRlZCBjYXN0cyB0byBhdm9pZCBBbHBoYQotCU9TRi8xIGNjIGJ1Zy4KLQotVGh1IE9jdCAxNCAwMToxMDozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBZGQgY29tbWVudHMgYXR0ZW1wdGluZyB0bwotCWV4cGxhaW4gUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogRG9uJ3Qgc2V0IFNFQ19ERUJVR0dJTkcgdW50aWwgaXQKLQlpcyBtYWRlIHRvIHdvcmsuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUmVtb3ZlIGNoZWNrIGZvcgotCVVTRV9ESVNDQVJERURfU0VDVElPTlNfQ09VTlQuCi0JKiBjb2ZmLWkzODYuYzogRG9uJ3QgZGVmaW5lIFVTRV9ESVNDQVJERURfU0VDVElPTlNfQ09VTlQuICBCYXNpbmcKLQlpdCBvbiBob3N0IGRlZmluZXMgaXMgd3JvbmcuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9zZWNsZXRfbGluayk6IERvbid0IGxpbmsgYSAucmVnaW5mbyBzZWN0aW9uLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCByZXF1aXJlIHRoZSAucmVnaW5mbyBzZWN0aW9uCi0JdG8gYmUgYSBwYXJ0aWN1bGFyIHNpemUuCi0KLVdlZCBPY3QgMTMgMTg6Mzk6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGVwLWluKTogTmV3IHJ1bGUsIGZvciBlZGl0aW5nIGRlcGVuZGVuY2llcyBpbnRvCi0JTWFrZWZpbGUuaW4gaW4gJChzcmNkaXIpLiAgVXNlIG1vdmUtaWYtY2hhbmdlLgotCSguZGVwMSwgZGVwKTogVXNlIG1vdmUtaWYtY2hhbmdlLgotCShDRklMRVMpOiBBZGQgY29mZi1hcG9sbG8uYy4KLQotCVN1biBPY3QgMTAgMTg6MDI6NTYgMTk5MyAgVHJveSBSb2xsbyAodHJveUBjYm1lLnVuc3cuRURVLkFVKQotCi0JKiBNYWtlZmlsZS5pbjogUmVjb2duaXNlIG5ldyBmaWxlLCBjb2ZmLWFwb2xsby5vCi0KLQkqIGNvZmYtYXBvbGxvLmM6IE5ldyBmaWxlCi0KLQkqIGNvZmZjb2RlLmg6IFJlY29nbmlzZSBhcG9sbG8gbWFnaWMgbnVtYmVycyBhbmQgd3JpdGFibGUgdGV4dAotCi0JKiBjb2Zmc3dhcC5oOiBTd2FwIEFwb2xsbyBvcHRpb25hbCBoZWFkZXIgZW50cmllcwotCi0JKiBjb25maWcuYmZkOiBBZGQgbGluZSBmb3IgQXBvbGxvCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZXBsYWNlIGFwb2xsbzY4YiBhbmQgYXBvbGxvNjh2IHdpdGggQXBvbGxvCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXNlIGFwb2xsb2NvZmZfdmVjCi0KLQkqIHRhcmdldHMuYzogTGlrZXdpc2UKLQotCSogY29uZmlnL2Fwb2xsby5taCwgY29uZmlnL2Fwb2xsby5tdDogTmV3IGZpbGVzCi0KLQkqIGhvc3RzL2Fwb2xsbzY4Lmg6IFJlbW92ZSBpbmNsdXNpb24gb2Ygc3RyaW5ncy5oCi0KLVdlZCBPY3QgMTMgMTQ6Mjg6MTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWkzODYuYyAoaTNjb2ZmX29iamVjdF9wKTogTm93IHN0YXRpYy4KLQotCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgZGVwZW5kZW5jaWVzLgotCSguZGVwLCAuZGVwMSwgZGVwLnNlZCk6IE5ldyB0YXJnZXRzLCB0byBtYWtlICJtYWtlIGRlcCIgd29yawotCWJldHRlci4KLQkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLgotCi0JKiBtNjhrbHlueC1jZi5jIChPTkxZX0RFQ0xBUkVfUkVMT0NTKTogRGVmaW5lLCB0byBhdm9pZCBuYW1lCi0JY29uZmxpY3RzIHdoZW4gIi0td2l0aC10YXJnZXRzPWFsbCIuCi0JKiBjb2ZmLW02OGsuYyAobTY4a2NvZmZfaG93dG9fdGFibGUsIG02OGtfcnR5cGUyaG93dG8sCi0JbTY4a19ob3d0bzJydHlwZSk6IFJlbmFtZSB2aWEgbWFjcm9zIHRvIGtlZXAgbmFtZXNwYWNlIGNsZWFuLgotCSogY29uZmlndXJlLmluOiBGb3IgbTY4a2x5bnhfY29mZl92ZWMsIGluY2x1ZGUgY29mZi1tNjhrLm8gZm9yCi0Jbm93LgotCi1UdWUgT2N0IDEyIDE3OjAzOjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbWlwcy5jOiBFeHRlbnNpdmUgYWRkaXRpb25zIHRvIGRvIHJlbG9jYXRpb25zIGFuZCB0bwotCWhhbmRsZSBNSVBTIHNwZWNpZmljIHNlY3Rpb25zLgotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBQYXNzIGZvdXJ0aCBhcmd1bWVudCB0bwotCWVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiB0byBwZXJtaXQgaXQgdG8gY29udHJvbCB0aGUKLQlzZWN0aW9uIGluZGV4IHRvIHVzZS4KLQkoZWxmX29ial90ZGF0YSk6IEFkZCBncCBhbmQgZ3Bfc2l6ZSBmaWVsZHMuCi0JKGVsZl9ncCwgZWxmX2dwX3NpemUpOiBOZXcgYWNjZXNzb3IgbWFjcm9zLgotCSogZWxmY29kZS5oOiBSZW1vdmVkIGEgbnVtYmVyIG9mIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2xlYXIgc2VjdGlvbiBoZWFkZXIgYmVmb3JlIGNhbGxpbmcKLQllbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zLCBub3QgYWZ0ZXIuCi0JKHByZXBfaGVhZGVycyk6IFJldHVybiB0cnVlIGF0IGVuZC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFBhc3MgcmV0dmFsIGFyZ3VtZW50IHRvCi0JZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKToKLQlBY2NlcHQgYW5kIGlnbm9yZSBuZXcgcmV0dmFsIGFyZ3VtZW50LgotCSogYmZkLmM6IEluY2x1ZGUgbGliZWxmLmguCi0JKGJmZF9zZXRfZ3Bfc2l6ZSk6IEhhbmRsZSBFTEYgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluIChiZmQubyk6IERlcGVuZHMgdXBvbiBsaWJlbGYuaC4KLQkoZWxmMzItbWlwcy5vKTogRGVwZW5kcyB1cG9uICQoSU5DRElSKS9lbGYvbWlwcy5oLgotCi1Nb24gT2N0IDExIDE3OjI1OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfbWtvYmplY3QpOiBDaGVjayBiZmRfbWFrZV9zZWN0aW9uIHJldHVybiB2YWx1ZS4KLQkoZWNvZmZfbWtvYmplY3RfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfbmV3X3NlY3Rpb25faG9vaywgZWNvZmZfc2l6ZW9mX2hlYWRlcnMsCi0JZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLCBlY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cywKLQllY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBIYW5kbGUgZHVtbXkgUkVHSU5GTyBzZWN0aW9uLgotCShlY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBmdW5jdGlvbiB0byBoYW5kbGUgcmVhZGluZwotCVJFR0lORk8gc2VjdGlvbi4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hhbmdlIGZyb20gbWFjcm8KLQlkZWZpbml0aW9uIHRvIGZ1bmN0aW9uIHByb3RvdHlwZS4KLQkoZWNvZmZfbWtvYmplY3RfaG9vayk6IE5ldyBwcm90b3R5cGUuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX21rb2JqZWN0X2hvb2spOiBSZW1vdmVkLgotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBVc2UgZWNvZmZfbWtvYmplY3RfaG9vay4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX21rb2JqZWN0X2hvb2spOiBSZW1vdmVkLgotCShtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IFVzZSBlY29mZl9ta29iamVjdF9ob29rLgotCi1GcmkgT2N0ICA4IDE1OjI1OjMzIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogbGliYmZkLmMgKGJmZF9nZXQqMzIsIGJmZF9nZXQqNjQpOiAgUHJldmVudCBBTlNJIHNpZ24gZXh0ZW5zaW9uCi0JYnkgY2FzdGluZyB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIHRvIGJmZF92bWEuCi0KLUZyaSBPY3QgIDggMDI6MzQ6MjEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaW46ICBEbyBub3QgZGVmaW5lIFNFTEVDVF9WRUNTLCBTRUxFQ1RfQVJDSElURUNUVVJFUwotCWlmIGNvbmZpZ3VyaW5nIC0td2l0aC10YXJnZXRzPWFsbC4KLQotVGh1IE9jdCAgNyAxNzozNDowNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX3N0ZCk6IENvcnJlY3QgdGhlICJzaXplIiBmaWVsZCBpbiBzb21lCi0JZW50cmllcy4KLQotCSogcmVsb2MuYyAocmVsb2NfaG93dG9fdHlwZSk6IENoYW5nZSBkb2N1bWVudGF0aW9uIHRvIGRpc3BlbCBhbnkKLQlub3Rpb24gdGhhdCB0aGUgInNpemUiIGZpZWxkIGlzIGEgcG93ZXItb2YtdHdvIGluZGljYXRvci4KLQotVGh1IE9jdCAgNyAxMDo1MDozOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0gICAgICAgKiBjb2Zmc3dhcC5oOiAoYmZkX3N3YXBfcmVsb2NfaW4pOiBhIHN5bW5keCBpcyBzaWduZWQuCi0KLQlNYWtlIHN1cHBvcnQgZm9yIHJlbGF4aW5nIG1vcmUgZ2VuZXJpYy4KLQkqIHJlbG9jMTYuYzogQWRkIG5ldyB0YXJnZXQgZW50cnkgLSBiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlLAotCWZpeCBiaXQgcm90LgotCSogbGliY29mZi5oLCBsaWJjb2ZmLWluLmg6IGRlY2xhcmF0aW9ucy4gUHJvdG90eXBlcwotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBBZGQgY2FsbHMgdG8KLQljb2ZmX3JlbG9jXzE2X2V4dHJhX2Nhc2VzIGFuZCBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUuCi0JKGR1bW15X3JlbG9jMTZfZXN0aW1hdGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBOZXcgZnVuY3Rpb24KLQotVGh1IE9jdCAgNyAxNDoyNDoxMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoRUFMSUdOKTogRGVmaW5lLCBkZXBlbmRlbnQgb24gQVJDSF9TSVpFLgotCShhbGlnbl9maWxlX3Bvc2l0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfbG9jYXRlX3NoKTogRGlzYWJsZWQgZnVuY3Rpb24gZGVsZXRlZC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zeW10YWJfYW5kX3N0cnRhYnMpOiBBbGlnbiBwb3NpdGlvbiwKLQl0aGVuIHBsYWNlIHN5bXRhYiwgdGhlbiBkbyBvdGhlciBzZWN0aW9ucy4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBBbGlnbiBwcm9ncmFtIGhlYWRlci4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBBbGlnbiBzZWN0aW9uIGhlYWRlcnMuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzKTogQWxpZ24gcmVsb2NhdGlvbiBzZWN0aW9ucy4KLQotVHVlIE9jdCAgNSAxMDo0NDozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6IFJlY29nbml6ZSBocHBhKi0qLWhpdXgqIChjdXJyZW50bHkgc3lub255bSBmb3IgaHB1eCkuCi0JQ2hhbmdlIG90aGVyIGhwcGEgZW50cmllcyB0byB1c2UgLSotIG5vdCAtaHAtLgotCSogY29uZmlnLmJmZDogUmVjb2duaXplIGhwcGEqLSotaGl1eCogKGN1cnJlbnRseSBzeW5vbnltIGZvciBocHV4KS4KLQotCSogY29mZi1yczYwMDAuYywgY3B1LXJzNjAwMC5jLCByczYwMDAtY29yZS5jOiBDaGFuZ2Ugbm9uLUFTQ0lJCi0JY2hhcmFjdGVycyBpbiBjb21tZW50IHRvIG9jdGFsIGVzY2FwZXMuCi0KLVN1biBPY3QgIDMgMTI6MzU6MTUgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWkzODZseW54LmM6IFJlbW92ZWQsIG5hbWUgdG9vIGxvbmcuCi0JKiBpMzg2bHlueC1jZi5jOiBOZXcgZmlsZSwgd2FzIGNvZmYtaTM4Nmx5bnguYy4KLQkqIGNvbmZpZ3VyZS5pbjogUmVmbGVjdCBmaWxlIG5hbWUgY2hhbmdlcy4KLQkqIE1ha2VmaWxlLmluOiBNZW50aW9uIEx5bngtcmVsYXRlZCBmaWxlcy4KLQotCSogaTM4Nmx5bnguYyAobHlueF8zMl9zd2FwX2V4dF9yZWxvY19pbik6IGdldCByZWxvYyBiaXRzIGluIGkzODYKLQlMeW54LXNwZWNpZmljIHdheS4KLQotCSogbTY4a2x5bngtY2YuYzogTmV3IGZpbGUsIGRlZmluZXMgY29mZiBmb3JtYXQgZm9yIE02OEsgTHlueE9TLgotCSogbTY4a2x5bnguYzogUmVtb3ZlIGNvZmYgdmVjdG9yIGRlZmluaXRpb24sIG5vdyBpbiBtNjhrbHlueC1jZi5jLgotCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IFNldCBzZWN0aW9uIGZsYWcgdG8gU1RZUF9JTkZPCi0JZm9yIC5zdGFiLCAuc3RhYnN0ciBhbmQgLmRlYnVnIHNlY3Rpb25zLCBhbmQgc2V0IFNFQ19ERUJVR0dJTkcgZm9yCi0Jc2VjdGlvbnMgb2YgdHlwZSBTVFlQX0lORk8uICAoZnJvbSBNaW5oIFRyYW4tTGUpCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRkIGRpc2NhcmRlZF9zZWN0aW9uc19jb3VudAotCXRvIGFiZmQtPnNlY3Rpb25fY291bnQsIHdoaWNoIGhlbHBzIGBzdHJpcCcga2VlcCB0aGUgc2l6ZQotCW9mIHRoZSBleGVjdXRhYmxlIGhlYWRlciBjb25zdGFudC4KLQkqIGNvZmYtaTM4Ni5jIChkaXNjYXJkZWRfc2VjdGlvbnNfY291bnQpOiBOZXcgdmFyaWFibGUsIGluaXRpYWxpemVkCi0JdG8gemVyby4gIEZvciB1c2UgYnkgYHN0cmlwJy4gIEN1cnJlbnRseSBiZWluZyB1c2VkIG9ubHkgaW4gYWl4Mzg2Ci0JY29mZiwgYnV0IG1heSBiZSB1c2VmdWwgZm9yIG90aGVyIGNvZmYgc3lzdGVtcy4gIChmcm9tIE1pbmggVHJhbi1MZSkKLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogQWRkZWQgYSBtaXNzaW5nIGNhc3QuCi0KLQkqIGFyY2hpdmUuYzogQ29zbWV0aWMgaW1wcm92ZW1lbnRzLgotCSogb3BuY2xzLmM6IENvc21ldGljIGltcHJvdmVtZW50cy4KLQkobmV3X2JmZCk6IFJlbW92ZWQgcmVkdW5kYW50IHN0cnVjdHVyZSBzbG90IGluaXQuCi0KLVNhdCBPY3QgIDIgMTg6NDg6MTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9uZXdzLW1pcHMubWgsIGhvc3RzL25ld3MtbWlwcy5oOiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIG5ld3MtbWlwcyBmb3IgbWlwcy1zb255LWJzZCouCi0KLUZyaSBPY3QgIDEgMTM6MTQ6MTcgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGkzODZseW54X2NvZmZfdmVjIHJlcXVpcmVzIGNvZmYtaTM4Nmx5bnguby4KLQkqIGNvZmYtaTM4Nmx5bnguYzogTmV3IGZpbGUsIGRlZmluZXMgTHlueCB0YXJnZXQgdmVjdG9yIGFuZCBuYW1lLAotCWluY2x1ZGVzIGNvZmYtaTM4Ni5jLgotCSogY29mZi1pMzg2LmMgKGkzODZjb2ZmX3ZlYyk6IEFsbG93IHJlZGVmaW5pdGlvbiBvZiB0YXJnZXQgdmVjdG9yCi0Jc3ltYm9sIGFuZCBuYW1lLCBpZiBUQVJHRVRfU1lNIGFuZC9vciBUQVJHRVRfTkFNRSBhcmUgZGVmaW5lZC4KLQkqIGkzODZseW54LmM6IFJlbW92ZSBjb2ZmIHZlY3RvciBkZWZpbml0aW9uIGVudGlyZWx5LgotCShseW54XzMyX3N3YXBfZXh0X3JlbG9jX2luKTogRGVmaW5lLgotCShseW54XzMyX3N3YXBfc3RkX3JlbG9jX2luKTogRGVmaW5lLCBnZXQgcmVsb2MgYml0cyBpbiBpMzg2Ci0JTHlueC1zcGVjaWZpYyB3YXkuCi0JKGx5bnhfMzJfc3dhcF9leHRfcmVsb2Nfb3V0KTogRGVmaW5lLgotCShseW54XzMyX3N3YXBfc3RkX3JlbG9jX291dCk6IERlZmluZS4KLQkobHlueF8zMl9zbHVycF9yZWxvY190YWJsZSk6IERlZmluZSwgY2FsbCBMeW54IHN3YXBwaW5nIGZucy4KLQkobHlueF8zMl9zcXVpcnRfb3V0X3JlbG9jcyk6IERlZmluZSwgY2FsbCBMeW54IHN3YXBwaW5nIGZucy4KLQkobHlueF8zMl9jYW5vbmljYWxpemVfcmVsb2MpOiBEZWZpbmUsIGNhbGwgTHlueCBzd2FwcGluZyBmbnMuCi0JKFdSSVRFX0hFQURFUlMpOiBEZWZpbmUsIGNhbGwgTHlueCBzd2FwcGluZyBmbnMuCi0KLQkqIGNvbmZpZy9pMzg2LWx5bngubXQgKFNFTEVDVF9WRUNTKTogUmVtb3ZlIHJlZHVuZGFudCB2ZWN0b3IuCi0KLVRodSBTZXAgMzAgMTc6NTA6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV90eXBlKTogQWRkIGxpbmthZ2UtdGFibGUgcmVsYXRpdmUKLQlyZWxvY2F0aW9ucyBvZiBzaXplIDgsIDE2LCAzMi4gIFNvcnQgZ2VuZXJpYyByZWxvY3MgYnkgdHlwZSByYXRoZXIKLQl0aGFuIHNpemUuICBBZGRlZCBhIGxpdHRsZSBkb2N1bWVudGF0aW9uIHRvby4KLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfc3RkKTogQWRkIEJBU0UxNiBhbmQgQkFTRTMyIHJlbG9jcy4KLQkoVEFCTEVfU0laRSk6IE5ldyBtYWNyby4KLQkocmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX3sxNiwzMn1fQkFTRVJFTCBmb3Igc3RkCi0JcmVsb2NzLgotCShzd2FwX3N0ZF9yZWxvY19vdXQpOiBXcml0ZSBiYXNlcmVsIHJlbG9jcyBjb3JyZWN0bHkuCi0JKHN3YXBfc3RkX3JlbG9jX2luKTogSGFuZGxlIHJfYmFzZXJlbCBmaWVsZC4gIEFzc2VydCB0aGF0Ci0Jcl9qbXB0YWJsZSBhbmQgcl9yZWxhdGl2ZSBmaWVsZHMgYXJlIGNsZWFyLCBhbmQgdGhhdCB0aGUgY29tcHV0ZWQKLQlpbmRleCBkb2VzIHJlZmVyIHRvIGEgZGVmaW5lZCBlbnRyeSBvZiB0aGUgaG93dG8gdGFibGUuCi0KLVR1ZSBTZXAgMjggMTQ6NDc6NDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkpOiBOZXcgZnVuY3Rpb24uCi0JKiBzZWN0aW9uLmM6IENoYW5nZSBjb21tZW50cyB0byBzYXkgc2V2ZXJhbCBzZWN0aW9ucyBjYW4gaGF2ZQotCXRoZSBzYW1lIG5hbWUuCi0JKiBiZmQtaW4yLmg6IFJlLWdlbmVyYXRlIHRvIHJlZmxlY3QgYWJvdmUgY2hhbmdlLgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBDYWxsIGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5Ci0JaWYgc3RpbGwgbm8gc2VjdGlvbiBhZnRlciB0aGUgYmZkX2NvZmZfbWFrZV9zZWN0aW9uX2hvb2suCi0JKiBjb2ZmY29kZS5oOiBBZGQgY29tbWVudCBhYm91dCBUV09fREFUQV9TRUNTLgotCi1UdWUgU2VwIDI4IDAzOjIyOjI0IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6ICBBbHdheXMgZGV0ZXJtaW5lIHJhd19zaXplCi0JZXhwbGljaXRseS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzLCBlY29mZl9zdHlwX3RvX3NlY19mbGFncyk6ICBIYW5kbGUKLQkuZmluaSBzZWN0aW9uLgotCi1Nb24gU2VwIDI3IDE4OjI5OjE4IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCBjb25maWd1cmUuaG9zdDogTWF0Y2ggb24gKi1seW54b3MqIGZvciBMeW54T1MsCi0JYWRkIG02OCotKi1seW54b3MqLgotCSogY29uZmlndXJlLmluIDogUmVwbGFjZWQgaTM4Nmx5bnhfdmVjIHdpdGggaTM4Nmx5bnhfYW91dF92ZWMKLQlhbmQgaTM4Nmx5bnhfY29mZl92ZWMuCi0JQWRkZWQgbTY4a2x5bnhfYW91dF92ZWMgYW5kIG02OGtseW54X2NvZmZfdmVjLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogUmVtb3ZlZCBpMzg2bHlueF92ZWMsIGFkZGVkCi0Je2kzODYsbTY4a31seW54X3thb3V0LGNvZmZ9X3ZlYy4KLQkqIGkzODZseW54LmM6IEFkZGVkIGNvcHkgb2YgaTM4NmNvZmYuYywgcmVuYW1lZCBiZmQgdGFyZ2V0IHRvCi0JaTM4Nmx5bnhfY29mZl92ZWMuCi0JKiBtNjhrbHlueC5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9pMzg2LWx5bngubXQ6IFJlcGxhY2VkIGkzODZseW54X3ZlYyB3aXRoIGkzODZseW54X2FvdXRfdmVjCi0JYW5kIGkzODZseW54X2NvZmZfdmVjLgotCSogY29uZmlnL202OGstbHlueC5tdDogTmV3IGZpbGUuCi0JKiBob3N0cy9pMzg2bHlueC5oOiBBZGRlZCBkZWZpbml0aW9uIG9mIGNmcmVlIGFzIGZyZWUgKGZyb20gRWljaGluKS4KLQkqIGhvc3RzL202OGtseW54Lmg6IE5ldyBmaWxlLgotCi1Nb24gU2VwIDI3IDE4OjAwOjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmM6IERlZmluZSBvZmZzZXRvZiBoZXJlLgotCSogaG9zdHMvKi5oOiBEb24ndCBkZWZpbmUgaXQgaGVyZS4KLQotTW9uIFNlcCAyNyAxOTowOToyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogU2V0IGZpbGVwb3MgZm9yIFNIVF9TVFJUQUIKLQlzZWN0aW9uLgotCi1GcmkgU2VwIDI0IDE1OjQ3OjQwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBocHV4LWNvcmUuYzogQWRkIGNvbW1lbnQgYWJvdXQgaHB1eCB2ZXJzaW9uIDcuCi0KLUZyaSBTZXAgMjQgMTY6NTA6MjYgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbHlueC1jb3JlLmMgKGx5bnhfY29yZV9maWxlX3ApOiAgQ2hhbmdlIHBlci10aHJlYWQgcmVnaXN0ZXIKLQlzZWN0aW9uIG5hbWVzIGZyb20gLnJlZ1hYWCB0byAucmVnL1hYWCB0byBhdm9pZCBwYXJzaW5nIGFtYmlndWl0eQotCWluIGdkYi9jb3JlbG93LmMuICBDcmVhdGUgYWxpYXMgLnJlZyBzZWN0aW9uIGZvciB0aGUgY3VycmVudGx5Ci0JcnVubmluZyB0aHJlYWQuCi0KLUZyaSBTZXAgMjQgMTM6MjI6MzIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJlY29mZi5oIChlY29mZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmVkIGJpZ19tYWdpYyBhbmQKLQlsaXR0bGVfbWFnaWMgZmllbGRzLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmVkIGluaXRpYWxpemF0aW9uCi0Jb2YgYmlnX21hZ2ljIGFuZCBsaXR0bGVfbWFnaWMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWRfZm9ybWF0X2hvb2spOiBNYWtlIHN1cmUgbWFnaWMgbnVtYmVyCi0JbWF0Y2hlcyBlbmRpYW5lc3Mgb2YgYmZkLgotCShtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZWQgaW5pdGlhbGl6YXRpb24gb2YgYmlnX21hZ2ljIGFuZAotCWxpdHRsZV9tYWdpYy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFNldCBNSVBTIG1hY2hpbmUgbnVtYmVyCi0JYmFzZWQgb24gbWFnaWMgbnVtYmVyLiAgU3VwcG9ydCByNDAwMCBtYWdpYyBudW1iZXJzLgotCShlY29mZl9nZXRfbWFnaWMpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBlY29mZl9nZXRfbWFnaWMsIG5vdCBmaWVsZHMgaW4KLQl0aGUgYmFja2VuZCBzdHJ1Y3R1cmUuCi0JKiBjcHUtbWlwcy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkZWQgY2FzZSBmb3IgcjYwMDAuCi0KLQlGb3IgTUlQUyBjb25maWd1cmF0aW9ucyBwdXQgYm90aCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gdmVyc2lvbnMgaW4KLQl0aGUgbGlzdCBvZiB0YXJnZXRzOyB0aGUgY29kZSBpcyBnZXR0aW5nIGNvbXBpbGVkIGluIGFueWhvdy4KLQkqIGJpZ21pcHMubXQgKFNFTEVDVF9WRUNTKTogRGVmaW5lIHRvIGJlIGVjb2ZmX2xpdHRsZV92ZWMuCi0JKiBkZWNzdGF0aW9uLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBlY29mZl9iaWdfdmVjLgotCSogbWlwc2JlbGYubXQgKFNFTEVDVF9WRUNTKTogRGVmaW5lIHRvIGJlIGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYy4KLQkqIG1pcHNsZWxmLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBiZmRfZWxmMzJfYml0bWlwc192ZWMuCi0JKiByaXNjb3MubXQgKFNFTEVDVF9WRUNTKTogRGVmaW5lIHRvIGJlIGVjb2ZmX2xpdHRsZV92ZWMuCi0KLUZyaSBTZXAgMjQgMDA6NDI6MjMgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBvc2YtY29yZS5jOiAgTmV3IGZpbGUgZm9yIE9TRi8xIGNvcmUgZmlsZSBzdXBwb3J0LgotCSogY29uZmlnL2FscGhhb3NmLm1oIChIREVGSU5FUyk6ICBBZGQgLURPU0ZfQ09SRS4KLQkoSERFUEZJTEVTKTogIFNldCB0byBvc2YtY29yZS5vLgotCSogYmZkLWluMi5oICh1bmlvbiB0ZGF0YSk6ICBBZGQgb3NmX2NvcmVfZGF0YSBtZW1iZXIuCi0JKiB0YXJnZXRzLmM6ICBJZiBPU0ZfQ09SRSBpcyBkZWZpbmVkLCBhZGQgb3NmX2NvcmVfdmVjIHRvIHRhcmdldCBsaXN0LgotCSogTWFrZWZpbGUuaW4gKE9QVElPTkFMX0JBQ0tFTkRTKTogIEFkZCBvc2YtY29yZS5vLgotCShvc2YtY29yZS5vKTogIE5ldyBkZXBlbmRlbmN5LgotCi1UaHUgU2VwIDIzIDIxOjA0OjUzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBUT0RPOiBSZW1vdmUgbm90ZSBhYm91dCBtYWtpbmcgLS13aXRoLWJmZC10YXJnZXRzIHVzZSBjYW5vbmljYWwKLQl0YXJnZXQgY29uZmlndXJhdGlvbiBuYW1lIChhbHJlYWR5IGRvbmUpOyByZXdvcmQgaXRlbSBhYm91dAotCXNlcGFyYXRpbmcgcmVhZGluZyBhbmQgd3JpdGluZyBzdHVmZiB0byBub3QgcmVmZXIgdG8gYQotCW5vbi1leGlzdGVudCBpdGVtLgotCi0JKiBlY29mZi5oIChlY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBBY2NlcHQgTUlQU19NQUdJQ19MSVRUTEUyCi0JYW5kIE1JUFNfTUFHSUNfQklHMi4KLQotVGh1IFNlcCAyMyAxMTowNjozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGdlbi1hb3V0LmMgKG1haW4pOiBPdXRwdXQgbmV3bGluZSBhZnRlciBlbmQgb2YgY29tbWVudCwgbm90Ci0JYmVmb3JlLiAgKFJlcG9ydGVkIGJ5IEpvbmF0aGFuIFN0b25lLAotCWpvbmF0aGFuQG9zY2FyLnN0YW5mb3JkLmVkdSkuCi0KLVRodSBTZXAgMjMgMTA6NDg6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogUHV0IHdlYWsgc3ltYm9scyBpbiB0aGUKLQlhcm1hcC4KLQotCSogZWxmY29kZS5oIChmaXhfdXBfc3RydGFicyk6IFNldCBzaF9lbnRzaXplIGZvciB0aGUgLnN0YWIKLQlzZWN0aW9uLCBub3QgdGhlIC5zdGFic3RyIHNlY3Rpb24uICBTZXQgdGhlIHR5cGUgb2YgdGhlIC5zdGFic3RyCi0Jc2VjdGlvbiB0byBTSFRfU1RSVEFCLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogSGFuZGxlIFNIVF9TVFJUQUIgc2VjdGlvbnMuCi0KLQkqIHNlY3Rpb24uYyAoU0VDX0RFQlVHR0lORyk6IE5ldyBzZWN0aW9uIGZsYWcuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IElmIHNlY3Rpb24gaXMgU0hUX1BST0dCSVRTLAotCWFuZCB0aGUgbmFtZSBzdGFydHMgd2l0aCAuZGVidWcsIC5saW5lIG9yIC5zdGFiLCBzZXQKLQlTRUNfREVCVUdHSU5HLiAgSWYgU0hUX1NUUlRBQiwgY2hlY2sgZm9yIC5kZWJ1ZyBhbmQgLnN0YWIuCi0JKiBlbGYzMi10YXJnZXQuaCAoVEFSR0VUX0JJR19TWU0sIFRBUkdFVF9MSVRUTEVfU1lNKTogQWRkZWQKLQlTRUNfREVCVUdHSU5HIHRvIHNlY3Rpb25fZmxhZ3MuCi0JKiBlbGY2NC10YXJnZXQuaCAoVEFSR0VUX0JJR19TWU0sIFRBUkdFVF9MSVRUTEVfU1lNKTogQWRkZWQKLQlTRUNfREVCVUdHSU5HIGFuZCBTRUNfQ09ERSB0byBzZWN0aW9uX2ZsYWdzLgotCSogYmZkLWluMi5oOiBVcGRhdGVkLgotCi1XZWQgU2VwIDIyIDE2OjM0OjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKHRkYXRhKTogQWRkIGx5bnhfY29yZV9kYXRhLgotCi0JKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBTZXQgZmlsZXBvcyBmb3IKLQlzZWN0aW9ucyB3aXRoIFNFQ19MT0FEIHNldCwgZXZlbiBpZiBTRUNfSEFTX0NPTlRFTlRTIGlzIGNsZWFyLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBzZXQgc2NucHRyIHRvIHplcm8ganVzdAotCWJlY2F1c2Ugc2l6ZSBvZiBzZWN0aW9uIGlzIHplcm8uICBOZWVkZWQgZm9yIElyaXggNC4wLjVGLgotCi1XZWQgU2VwIDIyIDA5OjQ5OjMyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBVc2UgaTk2MC1ib3V0LCBub3QgaTk2MC1jb2ZmIGZvciBpOTYwLSotbmluZHkqLgotCi1XZWQgU2VwIDIyIDA3OjM0OjA5IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChPUFRJT05BTF9CQUNLRU5EUyk6ICBBZGQgbHlueC1jb3JlLm8uCi0JKiBiZmQtaW4yLmggKHRkYXRhKTogIEFkZCBseW54X2NvcmVfZGF0YTsKLQkqIGNvbmZpZy5iZmQgY29uZmlndXJlLmhvc3Q6ICBHZXQgcmlkIG9mIHN1cGVyZmx1b3VzIG5ldGJzZCBhbmQKLQlseW54b3MgZW50cmllcy4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBseW54LWNvcmUubyB0byBMeW54IGNvbmZpZy4KLQkqIGkzODZseW54LmM6ICBBZGQgZGVmcyBmb3IgY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBseW54LWNvcmUuYzogIE5ldyBmaWxlIHdpdGggTHlueCBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGhvc3RzL2kzODZseW54Lmg6ICBNb3ZlIGxvdHMgb2YgaG9zdCBzcGVjaWZpYyBpbmNsdWRlcyB0byBoZXJlLgotCUFkZCBkZWYgb2YgSE9TVF9MWU5YLiAgUmVtb3ZlIHVubmVjZXNzYXJ5IGRlZnMuCi0KLU1vbiBTZXAgMjAgMTk6MTg6MTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE9ubHkgc2V0IFNFQ19EQVRBIGZvciBhCi0JU0hGX1BST0dCSVRTIG9yIFNIVF9TVFJUQUIgc2VjdGlvbiBpZiBTRUNfQUxMT0MgaXMgc2V0LiAgTmV2ZXIgc2V0Ci0JU0VDX0RBVEEgZm9yIGEgU0hGX05PQklUUyBzZWN0aW9uLgotCi0JKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X21hbmdsZV9yZWxvY3MpOiBDaGVjayBTRUNfTE9BRCByYXRoZXIKLQl0aGFuIFNFQ19DT0RFIHwgU0VDX0RBVEEuICBBZGQgc29tZSBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIG5sbWNvZGUuaDogQWRkIHNvbWUgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZ25vcmUgcmVsb2NzIGZvciBzZWN0aW9ucyB0aGF0IGFyZQotCW5laXRoZXIgY29kZSBub3IgZGF0YS4gIEp1c3QgdXNlIHRoZSBzeW1ib2wgdmFsdWUgZm9yIGRlYnVnZ2luZwotCXN5bWJvbHM7IGRvbid0IG9mZnNldCBieSB0aGUgc2VjdGlvbiB2bWEuCi0KLUZyaSBTZXAgMTcgMTg6MDg6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3QgcmV0dXJuIGFuIGVycm9yIHdoZW4KLQlwZXJmb3JtaW5nIGEgcmVsb2MgYWdhaW5zdCBhbiB1bmRlZmluZWQgd2VhayBzeW1ib2wuCi0JKiBzeW1zLmMgKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpOiBTaG93IHZhbHVlIG9mIEJTRl9XRUFLIHJhdGhlcgotCXRoYW4gb2Jzb2xldGUgQlNGX0VYUE9SVC4KLQotRnJpIFNlcCAxNyAwMjowNDozMSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogaG9zdHMve2FscGhhb3NmLmgsIGFtaXguaCwgYXBvbGxvNjguaCwgYXBvbGxvdjY4LmgsCi0JZGVjc3RhdGlvbi5oLCBkZWx0YTg4LmgsIGRndXguaCwgZG9zZS5oLCBnbzMyLmgsIGhhcnJpcy5oLAotCWhwMzAwLmgsIGhwMzAwYnNkLmgsIGhwcGFic2QuaCwgaHBwYWhwdXguaCwgaTM4NmFpeC5oLCBpMzg2YnNkLmgsCi0JaTM4NmxpbnV4LmgsIGkzODZseW54LmgsIGkzODZ2LmgsIGkzODZ2NC5oLCBpcml4My5oLCBpcml4NC5oLAotCW1pcHNic2QuaCwgbmNyMzAwMC5oLCByczYwMDAuaCwgcnRic2QuaCwgc29sYXJpczIuaCwgc3BhcmMtbGwuaCwKLQlzdGQtaG9zdC5oLCBzdHJhdHVzLmgsIHN1bjMuaCwgc3lzdjQuaCwgdGFob2UuaCwgdWx0cmEzLmgsCi0JdmF4dWx0LmgsIHZheHVsdDIuaCwgd2UzMmsuaH06ICBNYWtlIHN1cmUgdGhhdCAib2Zmc2V0b2YiIGlzCi0JZGVmaW5lZCBvbiBhbGwgaG9zdHMsIG5vdyB0aGF0IGFyY2hpdmUuYyB1c2VzIGl0LgotCi1UaHUgU2VwIDE2IDE4OjIwOjMwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBDcmVhdGUgc2VjdGlvbiBzeW1ib2xzIGZvciBhbGwKLQlzZWN0aW9ucywgbm90IGp1c3QgYWxsb2NhdGVkIHNlY3Rpb25zOyBkZWJ1Z2dpbmcgc2VjdGlvbnMgY2FuIGhhdmUKLQlyZWxvY3MuCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogSWYgdGhlcmUgaXMgYW4gb3V0cHV0IHNlY3Rpb24sIHVzZQotCXRoZSBzZWN0aW9uIGluZGV4IGZyb20gdGhhdCByYXRoZXIgdGhhbiB0aGUgaW5wdXQgc2VjdGlvbi4KLQotVGh1IFNlcCAxNiAxMjoyMDo1MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKGJmZF9mbHVzaCwgYmZkX3N0YXQpOiBSZWZsZWN0IEpvaG4ncyBjaGFuZ2VzIHRvCi0JbGliYmZkLmgsIHdoaWNoIGlzIHJlZ2VuZXJhdGVkIGZyb20gdGhpcyBmaWxlLgotCi0JKiBiZmQtaW4uaCAoc3ltdHlwZSk6IERlbGV0ZWQgdHlwZWRlZi4KLQotV2VkIFNlcCAxNSAxMTo0ODozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jIChDT0VSQ0V4eCk6IENhc3QgeCB0byBiZmRfc2lnbmVkX3ZtYSBiZWZvcmUgZG9pbmcgdGhlCi0JeG9yIGFuZCBzdWJ0cmFjdC4gIE90aGVyd2lzZSBpdCB3aWxsIG5vdCBzaWduIGV4dGVuZCBpZiB0aGUgdHlwZQotCW9mIGJmZF92bWEgaXMgbGFyZ2VyIHRoYW4gaW50LgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9wZHJfaW4pOiBHZXQgcmVnb2Zmc2V0LCBpb3B0LCBmcmVnb2Zmc2V0Ci0JYW5kIGZyYW1lb2Zmc2V0IGFzIHNpZ25lZCBudW1iZXJzLiAgRnJvbSBQZXRlciBTY2hhdWVyLgotCi1UdWUgU2VwIDE0IDE4OjIwOjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBBZGQgYmZkX2VsZl9nZW5lcmljX3JlbG9jCi0Jc3BlY2lhbCBmdW5jdGlvbiBmb3IgYWxsIHJlbG9jIGVudHJpZXMuCi0JKiBlbGYzMi10YXJnZXQuaCAoVEFSR0VUX0xJVFRMRV9TWU0pOiBBZGQgU0VDX0NPREUgdG8KLQlzZWN0aW9uX2ZsYWdzLgotCSogbGliZWxmLmggKGVsZl9zeW1ib2xfdHlwZSk6IFJlbW92ZSBkZXNjLCB0eXBlIGFuZCBvdGhlciBmaWVsZHMuCi0JKiBNYWtlZmlsZS5pbiAoZWxmMzItKi5vKTogVGhlc2UgZGVwZW5kIHVwb24gZWxmMzItdGFyZ2V0LmguCi0KLVR1ZSBTZXAgMTQgMTQ6MzQ6NDUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKHN0cnVjdCBhcnRkYXRhKTogIEFkZCBhcm1hcF90aW1lc3RhbXAgYW5kCi0JYXJtYXBfZGF0ZXBvcyBoZXJlIHRvby4KLQotTW9uIFNlcCAxMyAyMTowMzoxOCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY2Fjb3Bob255LmN5Z251cy5jb20pCi0KLQlJbXByb3ZlIHRpbWVzdGFtcCBzdXBwb3J0IGluIEJTRCBhcmNoaXZlIGZpbGVzIHRvIGF2b2lkIGxpbmtlcgotCXdhcm5pbmdzLgotCi0JKiBsaWJiZmQuaCAoc3RydWN0IGFydGRhdGEpOiAgQWRkIGFybWFwX3RpbWVzdGFtcCBhbmQgYXJtYXBfZGF0ZXBvcy4KLQkoYmZkX2ZsdXNoLCBiZmRfc3RhdCk6ICBBZGQgcHJvdG90eXBlcy4KLQkqIGxpYmJmZC5jIChiZmRfZmx1c2gpOiAgQWRkLCBkb2VzIGZmbHVzaCBvbiBhIEJGRC4KLQkoYmZkX3N0YXQpOiAgQWRkLCBkb2VzIGZzdGF0IG9uIGEgQkZELgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IEF0IGVuZCBvZiBmaWxlIHdyaXRpbmcsCi0JdmVyaWZ5IGFuZCBwb3NzaWJseSB1cGRhdGUgdGhlIHRpbWVzdGFtcCBpbiB0aGUgYXJtYXAsIGlmIGEgQlNECi0JYXJjaGl2ZS4gIEZJWE1FISAgS2x1ZGdlIHJlY29nbml6ZXMgQlNEIGFyY2hpdmUsIHJhdGhlciB0aGFuCi0JdmVjdG9yaW5nIHByb3Blcmx5LiAgU2hvdWxkIGFkZCB0byB4dmVjLgotCShjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6ICBNb3ZlIHByb3RvdHlwZSB0byB0b3AsIGF2b2lkIFBST1RPLgotCShic2Rfd3JpdGVfYXJtYXApOiBTYXZlIHRpbWVzdGFtcCBhbmQgZmlsZSBsb2NhdGlvbiB0aGVyZW9mLCB3aGVuCi0Jd3JpdGluZyB0aGUgYXJtYXAgaW4gYSBCU0QgZmlsZS4KLQkoYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiAgTmV3IGZ1bmN0aW9uIHRvIGNoZWNrIGFuZAotCXJld3JpdGUgdGhlIHRpbWVzdGFtcC4KLQotCSogaG9zdHMvc3RkLWhvc3QuaCAob2Zmc2V0b2YpOiAgRGVmaW5lLCBpZiBub3QgYWxyZWFkeSwgZm9yIGFyY2hpdmUuYy4KLQotU2F0IFNlcCAxMSAxODoxMzo0MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NnNjby5oOiBEZWZpbmUgYSBidW5jaCBvZiBzdHVmZiBmb3IgY29yZSBmaWxlcy4KLQkqIHNjby1jb3JlLmM6IFJlbW92ZSwgcmVwbGFjZSBieSB0cmFkLWNvcmUuYy4KLQkqIHRyYWQtY29yZS5jOiBJZiBIT1NUX1NUQUNLX1NUQVJUX0FERFIgaXMgZGVmaW5lZCwgdXNlIGl0LgotCSogY29uZmlnL2kzODZzY28ubWg6IFVzZSB0cmFkLWNvcmUgbm90IHNjby1jb3JlLgotCSogaG9zdHMvaTM4NmlzYy5oLCBjb25maWcvaTM4NmlzYy5taDogUmVtb3ZlLgotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBpMzg2c2NvIGZvciBpc2MuCi0JKiBjb25maWcvaTM4Ni1zY28ubXQ6IFJlbW92ZSwgaWRlbnRpY2FsIHRvIGkzODYtY29mZi5tdC4KLQkqIGNvbmZpZy5iZmQ6IFVzZSBpMzg2LWNvZmYgbm90IGkzODYtc2NvLgotCi0JKiBjb25maWcuYmZkOiBSZWNvZ25pemUgaVszNF04Ni0qLXNvbGFyaXMyKiBzcGVjaWZpY2FsbHkgcmF0aGVyCi0JdGhhbiB1c2luZyAqLSotc29sYXJpczIqIChpNDg2LXVua25vd24tc29sYXJpczIgaXMgaTM4Ni1lbGYsIG5vdAotCWk0ODYtZWxmIHdoaWNoIGRvZXNuJ3QgZXhpc3QpLgotCi1GcmkgU2VwIDEwIDEyOjU2OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogRm9yIEFMUEhBRUNPRkYsIGZvcmNlCi0JcGFkZGluZyBmaWVsZCB0byB6ZXJvLgotCi0JKiBjb25maWcuYmZkIChpWzM0XTg2LSotbmV0YnNkKik6IE5ldyB0YXJnZXQ7IHVzZSBpMzg2LW5ldGJzZC4KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGJvZ3VzIG5ldGJzZDM4NiBoYW5kbGluZy4KLQotCSogY29mZi1taXBzLmM6IERvbid0IHdhcm4gYWJvdXQgb3ZlcmZsb3cgZm9yIE1JUFNfUl9KTVBBRERSIHJlbG9jLgotCUNvcnJlY3Qgb3ZlcmZsb3cgZGV0ZWN0aW9uIHJlcXVpcmVzIG1hdGNoaW5nIHRoZSB1cHBlciBmb3VyIGJpdHMKLQlvZiB0aGUgZGVzdGluYXRpb24gYWdhaW5zdCB0aGUgUEMuCi0KLVRodSBTZXAgIDkgMTY6NTc6NDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IE1ha2UgNjQtYml0IHN0dWZmIHdvcmsgd2l0aCAiLS13aXRoLXRhcmdldHM9YWxsIi4KLQotVHVlIFNlcCAgNyAxNDoxNzowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oOiBSZW1vdmVkIHN3YXBwaW5nIHJvdXRpbmVzIGRlY2xhcmF0aW9ucy4KLQkqIGJmZC1pbi5oOiBBZGRlZCBzd2FwcGluZyByb3V0aW5lIGRlY2xhcmF0aW9ucywgYW5kIHJlbmFtZWQgdGhlbQotCWZyb20gX2RvXyogdG8gYmZkXyouCi0JKiBsaWJiZmQuYzogUmVuYW1lZCBzd2FwcGluZyByb3V0aW5lcyBmcm9tIF9kb18qIHRvIF9iZmRfKi4KLQkqIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1Nb24gU2VwICA2IDE1OjI4OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBTZXQgcGNyZWxfb2Zmc2V0IHRvIHRydWUgZm9yCi0JUl8zODZfUEMzMi4KLQotRnJpIFNlcCAgMyAxMzowNjoxMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVvcmdhbml6ZWQgc2V0dGluZyBvZiBtYWtlZmlsZSB2YXJpYWJsZXMgc28KLQk2NC1iaXQgc3R1ZmYgd29ya3MgYWdhaW4uCi0KLQkqIGxpYmJmZC1pbi5oIChfZG9fZ2V0KiwgX2RvX3B1dCopOiBSZW5hbWVkIHZpYSBtYWNyb3MgdG8gY2xlYW4gdXAKLQluYW1lc3BhY2UuCi0KLQkqIGxpYmVsZi5oIChlbGYzMl9zeW1ib2xfdHlwZSwgZWxmNjRfc3ltYm9sX3R5cGUpOiBEZWxldGVkCi0JIm5hdGl2ZV9lbGZfc3ltIiBmaWVsZCwgbWVyZ2VkIHRvIG1ha2UgbmV3IHR5cGUgImVsZl9zeW1ib2xfdHlwZSIuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogRmllbGQgc3ltYm9scyBpcyBub3cgZWxmX3N5bWJvbF90eXBlKi4KLQlEZWxldGVkIGZpZWxkIHJhd19zeW1zLgotCShvYmpfc3ltYm9scyk6IFJlbW92ZSBjYXN0LgotCShvYmpfcmF3X3N5bXMpOiBEZWxldGVkLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3Qgc2V0IHJhd19zeW1zIG9yCi0JbmF0aXZlX2VsZl9zeW0gZmllbGRzLgotCSogZWxmMzItaHBwYS5jOiBDaGFuZ2VkIHVzZXMgb2YgZWxmMzJfc3ltYm9sX3R5cGUgdG8KLQllbGZfc3ltYm9sX3R5cGUuCi0KLQlGcm9tIFBldGUgSG9vZ2VuYm9vbSBhbmQgSmVmZiBMYXc6Ci0KLQkqIGVsZjMyLWhwcGEuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3RjX3N5bWJvbCk6IElmIHRoZSBhcmd1bWVudCByZWxvY2F0aW9uCi0JYml0cyBhcmUgemVybyAoZS5nLiwgdGhleSBzcGVjaWZ5IG5vIHJlbG9jYXRpb25zKSwgdGhlbiBkbyBub3QKLQlldmVuIGJvdGhlciBhZGRpbmcgdGhlaXIgZW50cmllcyB0byB0aGUgc3ltZXh0biBzZWN0aW9uLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3RjX3N5bWJvbCk6IEFueSBmdW5jdGlvbiwgcmVnYXJkbGVzcwotCW9mIHNjb3BlIGNhbiBoYXZlIGFuIGFyZ3VtZW50IHJlbG9jYXRpb24gc3R1Yi4KLQotCSogZWxmMzItaHBwYS5jOiAoRWxmMzJfaHBwYV9TdHViX2Rlc2NyaXB0aW9uKTogIFJlbmFtZSB0aGlzCi0Jc3RydWN0dXJlIGFuZCB0eXBlIHRvIGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbi4gIFRoaXMgbWFrZXMKLQlpdCBjb25zaXN0ZW50IHdpdGggdGhlIEdOVSBjb2RpbmcgY29udmVudGlvbnMuCi0JKGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbik6IEFkZGVkIGEgJ25leHQnIGZpZWxkIHRvIGFsbG93Ci0JbGlua2luZyBvZiBzdHViIGRlc2NyaXB0aW9uIHN0cnVjdHVyZXMuCi0JKGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbik6IEFkZGVkIGEgJ3N0dWJfbGlzdFAnIGZpZWxkIHRvCi0Ja2VlcCB0cmFjayBvZiBpbmRpdmlkdWFsIHN0dWJzLgotCShFbGYzMl9ocHBhX1N0dWJfbGlzdCwgRWxmMzJfaHBwYV9TdHViX2xpc3Rfc3RydWN0KTogIFJlbW92ZWQuCi0JQ29tYmluZWQgd2l0aCB0aGUgZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uIHN0cnVjdHVyZS4KLQkoZWxmMzJfaHBwYV9zdHViX25hbWVfbGlzdCk6ICBOZXcgdHlwZSB0byBrZWVwIHRyYWNrIG9mCi0JaW5kaXZpZHVhbCBzdHVicy4KLQkoYWRkX3N0dWIpOiAgUmVtb3ZlZC4KLQkoYWRkX3N0dWJfYnlfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZmluZF9zdHViX2J5X25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogQWxsb3cgcmV1c2luZyBzdHVicyB0aGF0Ci0JYWxyZWFkeSBleGlzdC4KLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IEFsbG93IHJldXNpbmcgc3R1YnMgdGhhdAotCWFscmVhZHkgZXhpc3QuCi0KLQkqIGVsZjMyLWhwcGEuYzogKHJldHZhbF9taXNtYXRjaGVzKTogIFRoZSBkaXJlY3Rpb24gb2YgYXJndW1lbnQKLQlyZWxvY2F0aW9uIHdhcyByZXZlcnNlZC4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBSZXR1cm4gYWRkcmVzcyB3YXMgbm90IGJlaW5nCi0JcmVzdG9yZWQuCi0JKGhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWRfcCk6IEFkZCBhcmd1bWVudCBjb250YWluaW5nIGNhbGxlcgotCWFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBzbyB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIHRoZSBjaGVjawotCWZvciBwbGFiZWwgc3R1YnMuCi0JKGhwcGFfZWxmX3N0dWJfY2hlY2spOiBQYXNzIGNhbGxlciBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgaW50bwotCWhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWRfcCgpLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBBZGQgY2hlY2sgZm9yIHBsYWJlbCBzdHVicyBhbmQKLQlwYXNzIGNhbGxlciBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgaW50bwotCWhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWRfcCgpLgotCi1UaHUgU2VwICAyIDAwOjU5OjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmggKGhwcGFfZmllbGRfYWRqdXN0KTogUmVtb3ZlIHVudXNlZCBgaW5pdF92YWx1ZScgdmFyaWFibGUuCi0KLQkqIGhvc3RzL2RlbHRhODh2NC5oOiBOZXcgZm9yIFNWUjQuCi0JKiBjb25maWd1cmUuaG9zdHM6IFVzZSBpdC4KLQotV2VkIFNlcCAgMSAxNDoyMzozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oLCBuZXRic2QzODYuYzogQ2hhbmdlIE1fSTM4NiB0byBNXzM4Nl9ORVRCU0QuICBNX0kzODYKLQlpcyBhbiBTQ08gcHJlLWRlZmluZS4KLQotVHVlIEF1ZyAzMSAxMjo1MDoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogU2V0IEhBU19TWU1TIGlmIHRoZXJlIGFyZSBleHRlcm5hbAotCXJlZmVyZW5jZXMuCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX3tpbixvdXR9KTogVGhlIGNvcHlyaWdodCBsZW5ndGggaXMKLQlvbmx5IG9uZSBieXRlLgotCShubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IEluY2x1ZGUgZGVidWdnaW5nIHN5bWJvbHMgaW4gc3ltYm9sCi0JY291bnQuCi0JKG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBNYWtlIHN5bWxlbmd0aCB1bnNpZ25lZC4gIFJlYWQgZGVidWdnaW5nCi0Jc3ltYm9scyBhcyBCRkQgbG9jYWwgc3ltYm9scy4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGJvdGhlciB3cml0aW5nIG91dCBleHBvcnRlZAotCXN5bWJvbHMgbW9yZSB0aGFuIG9uY2U7IHRoZXkgbm93IGFwcGVhciBpbiB0aGUgc3ltYm9sIHRhYmxlIG1vcmUKLQl0aGFuIG9uY2UgKHdpdGggYW5kIHdpdGhvdXQgYSBwcmVmaXgpIGlmIG5lY2Vzc2FyeS4gIFNldCBvZmZzZXQKLQl2YWx1ZXMgdG8gYmUgbm9uLXplcm8gYXMgTkxNTElOSyBkb2VzLgotCi1UdWUgQXVnIDMxIDEyOjA3OjQzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmg6IFJlc3RvcmUgI3VuZGVmcyBvZiBlX2ZzZWwgYW5kIG90aGVyIGVfKiBzeW1ib2xzLgotCi1GcmkgQXVnIDI3IDE2OjQzOjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChzdHJ1Y3Qgc2VjKTogTW92ZSBwb3NpdGlvbiBvZiB1c2VyX3NldF92bWEsIGFuZAotCWRvY3VtZW50IGl0LgotCShTRUNfQkFMSUdOKTogRGlzYWJsZSBmb3Igbm93LiAgSSBkb24ndCB0aGluayBpdCdzIGN1cnJlbnRseSB1c2VkLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogTm93IHN0YXRpYy4KLQkoc3ltZXh0X3Jvb3RQLCBzeW1leHRfbGFzdFAsIGdsb2JhbF92YWx1ZSwgR09UX3ZhbHVlLAotCWdsb2JhbF9zeW1ib2wsIGdsb2JhbF9zeW1fZGVmaW5lZCwgc3ltZXh0bl9jb250ZW50cywKLQlzeW1leHRuX2NvbnRlbnRzX3JlYWxfc2l6ZSwgZWxmX2hwcGFfc3R1Yl9yb290UCwKLQllbGYzMl9ocHBhX3N5bWV4dG5fbWFwLCBlbGYzMl9ocHBhX3N5bWV4dG5fbWFwX3NpemUpOiBSZWx5IG9uCi0JZGVmYXVsdCBpbml0aWFsaXphdGlvbi4KLQkoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBNYWNybyAiVU5ERUZJTkVEIiBkb2Vzbid0IG5lZWQgYQotCXRyYWlsaW5nIHNlbWljb2xvbi4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogSW50cm9kdWNlIHRlbXBvcmFyaWVzIHRvIG1ha2UKLQljb2RlIG1vcmUgcmVhZGFibGUgaW4gODAgY29sdW1ucy4KLQotCSogbGliaHBwYS5oIChhbGwgZnVuY3Rpb25zKTogTm93IGlubGluZSB1bmRlciBHTlUgQy4KLQotCU1vcmUgcGF0Y2hlcyBmcm9tIEplZmYgTGF3OgotCi0JKiBlbGYzMi1ocHBhLmMgKEFSX1dBUk4pOiBHaXZlIGFyZ3VtZW50IHdoaWNoIGNhdXNlZCB0aGUKLQlpbnZhbGlkIGFyZ3VtZW50IHJlbG9jYXRpb24uCi0JKEFSX1VOSU1QKTogRGVsZXRlIHVudXNlZCBtYWNyby4KLQkoaHBwYV9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF90YWJsZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3Npbmc6IExpa2V3aXNlLgotCi0JKiBzb20uYzogTmV3IGZpbGUgY29udGFpbmluZyBTT00gc3BlY2lmaWMgY29kZSBleHRyYWN0ZWQKLQlmcm9tIGhwcGEuYwotCi0JKiBzb20uaDogTmV3IGZpbGUgY29udGFpbmluZyBTT00gc3BlY2lmaWMgY29kZSBleHRyYWN0ZWQKLQlmcm9tIGxpYmhwcGEuaAotCi0JKiBocHBhLmM6IERlbGV0ZWQuCi0KLQkqIGxpYmhwcGEuaDogRGVsZXRlIFNPTSBzcGVjaWZpYyBjb2RlLiAgQWRkIGdlbmVyaWMgUEEKLQljb2RlIHdoaWNoIGNhbiBiZSBzaGFyZWQgYnkgYm90aCBTT00gYW5kIEVMRiBiYWNrZW5kcy4KLQotCSogTWFrZWZpbGUuaW46IFJlcGxhY2UgaHBwYS5jIHdpdGggc29tLmMuICBlbGYzMi1ocHBhLm8KLQlkZXBlbmRzIG9uIGxpYmhwcGEuaCBub3cuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYV92ZWMpOiBOZWVkcyBzb20ubyBtb2R1bGUgaW5zdGVhZCBvZgotCWhwcGEuby4KLQotCSogZWxmMzItaHBwYS5jOiBJbmNsdWRlIGxpYmhwcGEuaC4gIERvIG5vdCBkZWZpbmUKLQlCWVRFU19JTl9XT1JELgotCi0JKiBlbGYzMi1ocHBhLmggKGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZSk6IERlbGV0ZQotCW5vdyBsaXZlcyBpbiBsaWJocHBhLmguCi0JKGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQpOiBMaWtld2lzZS4KLQotCSogaG9zdHMvaHBwYWJzZC5oOiBJbmNsdWRlIDxzdGRsaWIuaD4gYW5kIDx1bmlzdGQuaD4uICBEbyBub3QKLQlkZWZpbmUgbWFsbG9jIG9yIGZyZWUuCi0KLQkqIGNvbmZpZy9ocHBhLWVsZi5tdCAoU0VMRUNUX0FSQ0hJVEVDVFVSRVMpOiBEb24ndCBkZWZpbmUKLQlTRUxFQ1RfVkVDUy4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvY2F0ZV91bndpbmRfdGFibGUpOiBEZWxldGUgdW51c2VkCi0JdmFyaWFibGVzLgotCShlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWRfcCk6IExpa2V3aXNlLgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogTGlrZXdpc2UuCi0JKGVsZl9yZWxvY19tYXApOiBEZWxldGUsIG5vIGxvbmdlciB1c2VkLgotCShlbGZfaHBwYV9yZWxvY19tYXApOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9zeW1leHRuX21hcF9tYXhfc2l6ZSk6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX2dldF9zeW1fZXh0bik6IEFib3J0IGlmIHR5cGUgaXMgYm9ndXMuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpOiBBZGQgcHJvY2Vzc2luZwotCW9mIHRoZSAuaHBwYV91bndpbmQgc2VjdGlvbi4KLQotV2VkIEF1ZyAyNSAxNjoxMzo0OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IHJlY29nbml6ZSBtODgxMTAuCi0KLVR1ZSBBdWcgMjQgMTY6MzI6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JTWVyZ2VkIGNoYW5nZXMgZnJvbSBKZWZmIExhdyBhbmQgUGV0ZSBIb29nZW5ib29tIGF0IFV0YWg6Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IEFkZCBkZXRlY3Rpb24gb2YKLQlTSFRfTk9URSBzZWN0aW9ucy4KLQotCSogZWxmMzItaHBwYS5jOgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViLGhwcGFfZWxmX2xvbmdfYnJhbmNoX25lZWRlZF9wKToKLQlOZXcgZnVuY3Rpb25zIGZvciBzdXBwb3J0IG9mIGxvbmcgYnJhbmNoIHN0dWJzLgotCShocHBhX2VsZl9zdHViX2NoZWNrLGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6ICBBZGQKLQljaGVjayBmb3IgbG9uZyBicmFuY2ggc3R1YnMuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnMpOiAgVW51c2VkIGZ1bmN0aW9uLiAgUmVtb3ZlZC4KLQkoaHBwYV9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBJbXBsZW1lbnQgYSBQQS9FTEYtc3BlY2lmaWMKLQl2ZXJzaW9uIG9mIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cy4KLQkoaHBwYV9lbGZfbG9uZ19icmFuY2hfbmVlZGVkX3ApOiBPbmx5IG91dHB1dCBkZWJ1Z2dpbmcgZGlhZ25vc3RpY3MKLQl3aGVuIEJGRCBpcyBjb25maWd1cmVkIGZvciBkZWJ1Z2dpbmcuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGVsZjMyX2hwcGFfZ2V0X3N5bWV4dG5fY2hhaW4pOiAgTmV3IGZ1bmN0aW9uCi0JdG8gcmV0dXJuIGEgbGlzdCBvZiBzeW1ib2xzIHRoYXQgaGF2ZSBub24temVybyBhcmd1bWVudAotCXJlbG9jYXRpb24gYml0cy4KLQkoaHBwYV9lbGZfc3R1Yl9maW5pc2gpOiBNYWtlIHN1cmUgc3R1YiBnZW5lcmF0aW9uIGlzIGRvbmUgb25seQotCW9uY2UuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX3N0dWJfcmVsb2MpOiAgTmV3IGZ1bmN0aW9uIGZvcgotCWdlbmVyYXRpb24gcmVsb2NhdGlvbiBlbnRyaWVzIHdpdGhpbiBhIHN0dWIuCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogQ29ycmVjdGlvbnMgdG8gYXJndW1lbnQKLQlyZWxvY2F0aW9uIHN0dWJzLgotCi0JKiBlbGYzMi1ocHBhLmM6IE5ldyAjZGVmaW5lJ3MgZm9yIGFyZ3VtZW50IHJlbG9jYXRpb24gdHlwZXMuCi0JKG1pc21hdGNoZXMsIHJldHZhbF9taXNtYXRjaGVzKTogVXBkYXRlZCB0byByZWZsZWN0IG5ldwotCWFyZ3VtZW50IHJlbG9jYXRpb24gdHlwZXMuCi0JKENVUlJFTlRfU1RVQl9PRkZTRVQpOiBOZXcgbWFjcm8uCi0KLQkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBTZXQgdGhlIFBGX1ggYml0IGZvciBkYXRhCi0Jc2VnbWVudHMuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogQWRkCi0JUl9IUFBBX1NUVUJfQ0FMTF8xNyBmb3Igc3VwcG9ydCBvZiBsaW5rZXIgc3R1YiBnZW5lcmF0aW9uLgotCShocHBhX2VsZl9yZWxvYyk6IEFkZCBzdXBwb3J0IG9mIFJfSFBQQV9TVFVCX0NBTExfMTcKLQlyZWxvY2F0aW9uIHR5cGUuCi0KLQkqIGVsZjMyLWhwcGEuaDogKGVsZjMyX2hwcGFfcmVsb2NfdHlwZSk6IEFkZAotCVJfSFBQQV9TVFVCX0NBTExfMTcgZm9yIHN1cHBvcnQgb2YgbGlua2VyIHN0dWIgZ2VuZXJhdGlvbi4KLQotCSogaHBwYV9zdHVicy5oOiBBZGQgbmV3IGluc3RydWN0aW9ucyB0aGF0IGFyZSB1c2VkIGluIGxpbmtlcgotCXN0dWIgZ2VuZXJhdGlvbi4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvY2F0ZV91bndpbmRfdGFibGUpOiBUaGUgb2Zmc2V0cyBpbiBhbgotCXVud2luZCBkZXNjcmlwdG9yIHdlcmUgaW5jb3JyZWN0LgotCi0JKiBsaWJlbGYuaCAoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiBEZWNsYXJlLgotCi0JKiBlbGYzMi1ocHBhLmM6IChlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcpOiAgTmV3Ci0JZnVuY3Rpb24gaW4gcGxhY2Ugb2YgZ2xvYmFsX3N5bSBmaWVsZCBpbiBlbGZfYmFja2VuZF9kYXRhCi0Jc3RydWN0dXJlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcsCi0JZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZywKLQllbGYzMl9ocHBhX2JhY2tlbmRfZmFrZV9zZWN0aW9ucywKLQllbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIsCi0JZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6ICBOZXcgZnVuY3Rpb25zIHRvCi0JcHJvdmlkZSBzdXBwb3J0IG9mIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbnMgYW5kIGFyZ3VtZW50Ci0JcmVsb2NhdGlvbiBzdHVicy4KLQkoZWxmX2luZm9fdG9faG93dG8pOiAgUmVtb3ZlIGNhbGwgdG8gYWJvcnQoKS4KLQotCSogZWxmMzItdGFyZ2V0Lmg6ICBTdXBwb3J0IGZvciBzcGVjaWFsIHByb2Nlc3NpbmcgYnkgdGhlIGJhY2tlbmQuCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogIEFkZGVkIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nLAotCWVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nLAotCWVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZywgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIsCi0JZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucywgYW5kCi0JZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIGZpZWxkcy4KLQkqIGVsZmNvZGUuaDogKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEFkZCBhIGNoZWNrIGZvcgotCXByb2Nlc3Nvci1zcGVjaWZpYyBzZWN0aW9uIHR5cGVzLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6ICBBZGQgYSBjaGVjayBmb3IgcHJvY2Vzc29yLXNwZWNpZmljCi0Jc2VjdGlvbiB0eXBlcy4KLQkoYmZkX2VsZjMyX3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBBZGQgYSBjaGVjayB0byBzZWUgaWYKLQl0aGVyZSBpcyBhbnkgZmluYWwgc2VjdGlvbiBwcm9jZXNzaW5nIHRvIGJlIGRvbmUgYnkgdGhlCi0JYmFja2VuZC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6ICBBZGQgYSBjaGVjayBmb3IKLQlwcm9jZXNzb3Itc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBSZW1vdmUgcmVmZXJlbmNlIHRvIGdsb2JhbF9zeW0gaW4gdGhlCi0JZWxmX2JhY2tlbmRfZGF0YSBzdHJ1Y3R1cmUuICBSZXBsYWNlIGl0IHdpdGggYSBjYWxsIHRvCi0JZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcuCi0JKiBsaWJlbGYuaDogUmVtb3ZlIGdsb2JhbF9zeW0gZmllbGQgaW4gdGhlIGVsZl9iYWNrZW5kX2RhdGEKLQlzdHJ1Y3R1cmUuICBSZXBsYWNlIGl0IHdpdGggYSBzZXJpZXMgb2YgYmFja2VuZC1zcGVjaWZpYwotCWZ1bmN0aW9ucy4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX2JyYW5jaF9yZWxvYyk6IFRoZSBmb3JtYWwgYXJndW1lbnQKLQlzdHViX3N5bSBzaG91bGQgYmUgY2FsbGVkIHRhcmdldF9zeW0uCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogUmVmZXIgdG8gdGhlIHN0dWIgYmZkIChhYmZkKQotCXJhdGhlciB0aGFuIHRoZSBvdXRwdXQgYmZkIChvdXRwdXRfYmZkKS4KLQkoaHBwYV9lbGZfcmVsb2MpOiBHZXQgcmlkIG9mIHJlZmVyZW5jZXMgdG8gdGhlIGdsb2JhbF9zeW0gZmllbGQgaW4KLQl0aGUgZWxmX2JhY2tlbmRfZGF0YSBzdHJ1Y3R1cmUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBDaGVjayB0aGUgY29ycmVjdCBjb25kaXRpb24gZm9yCi0JLmJzcy4gIEFsc28sIGRldGVjdCB0aGUgZXhpc3RlbmNlIG9mIGEgLm5vdGUgc2VjdGlvbi4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9yZWxvY2F0ZV9pbnNuKTogcl9mb3JtYXQgYXJndW1lbnQgc2hvdWxkCi0JaGF2ZSBiZWVuIHJfZmllbGQuCi0KLQkqIGhvc3RzL2hwcGFic2QuaCAoSE9TVF9NQUNISU5FX0FSQ0gpOiBSZWZlcmVuY2UgdG8gYmZkX2FyY2hfbTY4awotCXNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byBiZmRfYXJjaF9ocHBhLgotCi0JKiBocHBhLmMgKGhwcGFfdmVjKTogUmVwbGFjZSBiZmRfZmFsc2Ugd2l0aCBfYmZkX2R1bW15X3RhcmdldCBpbgotCXRoZSBiZmRfY2hlY2tfZm9ybWF0IHN0cnVjdHVyZSB0byBhdm9pZCBhIHR5cGUgbWlzbWF0Y2guCi0KLU1vbiBBdWcgMjMgMTk5MyAgU2VhbiBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCQkgYW5kIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JQWRkIE5ldEJTRCBzdXBwb3J0OgotCSogbmV0YnNkMzg2LmM6IE5ldyBmaWxlLgotCSogYW91dHguaDogTWFrZSBzeW1faXNfZGVidWdnZXJfaW5mbyB0cnVlIGZvciBOX0ZOLgotCSogTWFrZWZpbGUuaW4sIGFvdXQtdGFyZ2V0LmgsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5ob3N0LCBjb25maWd1cmUuaW4sCi0JbGliYW91dC5oLCB0YXJnZXRzLmM6IE90aGVyIGNoYW5nZXMuCi0KLUZyaSBBdWcgMjAgMTc6MDQ6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tODhrLWVsZi5tdDogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkOiBVc2UgaXQgZm9yIG04OCotKi1zeXN2NCouCi0KLUZyaSBBdWcgMjAgMTU6MTY6NTggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9idWlsZF9waGRycyk6IFVudXNlZCBmdW5jdGlvbiBkZWxldGVkLgotCShiZmRfc2hkcl9mcm9tX3NlY3Rpb24pOiBEaXR0by4KLQkod3JpdGVfcmVsb2NzKTogRG9uJ3QgY2hhbmdlIHNlY3Rpb24gY29udGVudHMgZm9yIGFkZGVuZC4KLQkoZWxmX2xvY2F0ZV9zaCk6IFJldHVybiB0eXBlIGlzIG5vdyBhbHdheXMgZWxmX2ludGVybmFsX3NoZHIsCi0Jc2luY2UgdGhlIG90aGVyIHR5cGVzIHdlcmUgcmVhbGx5IGFsaWFzZXMgZm9yIHRoaXMgdHlwZSBhbnl3YXlzLgotCURvbid0IGNvbXBpbGUgdGhpcyBmdW5jdGlvbiwgc2luY2UgaXQgaXMgc3RhdGljIGFuZCBkb2Vzbid0IGFwcGVhcgotCXRvIGJlIHVzZWQgaW4gdGhpcyBmaWxlLgotCShzeW1faXNfZ2xvYmFsKTogUmV0dXJuIG5vbi16ZXJvIGZvciB3ZWFrIHN5bWJvbHMuICBBYm9ydCBpZgotCXNlY3Rpb24gcG9pbnRlciBpcyBudWxsLgotCShzd2FwX291dF9zeW1zKTogUmVvcmRlciB0ZXN0cyBzbyBmdW5jdGlvbiBzeW1ib2xzIGNhbiBiZSB3ZWFrLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgdXNlIEJTRl9FWFBPUlQuCi0JKGVsZl9zbHVycF9yZWxvY2FfdGFibGUpOiBNYWtlIFJFTE9DX1BST0NFU1NJTkcgc2VjdGlvbiBzbWFsbGVyIGJ5Ci0JZXh0cmFjdGluZyBvdXQgc29tZSBjb21tb24gY29kZS4gIEFib3J0IGlmIEJGRCBzZWN0aW9uIHN5bWJvbCBoYXMKLQludWxsIG5hbWUuCi0JKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IFRyYW5zbGF0ZSBFTEYgc2VjdGlvbiBzeW1ib2xzIGludG8gQkZECi0Jc2VjdGlvbiBzeW1ib2xzLiAgRG9uJ3QgcmVhZCBzZWN0aW9uIGNvbnRlbnRzIHRvIGZpbGwgaW4gYWRkZW5kCi0JZmllbGQuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQWxsIHBhcnRpYWxfaW5wbGFjZSBmaWVsZHMKLQlzaG91bGQgYmUgInRydWUiLgotCi0JKiBNZXJnZWQgZnJvbSBPU0Y6Ci0KLQlUdWUgSnVuIDE1IDE0OjM4OjMyIDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBsaWJlbGYuaCAoc3RydWN0IEVsZl9TeW1fRXh0cmEpOiBOZXcgc3RydWN0dXJlIHRvIGNvbnRhaW4gRUxGCi0Jc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgUHV0IGluIGVsZl9zeW1fbnVtLCB3aGljaAotCWdpdmVzIHRoZSBleHRlcm5hbCBzeW1ib2wgbnVtYmVyIGluIHRoZSBlbGYgb2JqZWN0IGZpbGUsIHNpbmNlCi0JbG9jYWwgc3ltYm9scyBtdXN0IGNvbWUgYmVmb3JlIGdsb2JhbCBzeW1ib2xzLgotCShlbGZfc3ltX2V4dHJhKTogTmV3IG1hY3JvLgotCShlbGZfc3ltdGFiX21hcCk6IERlbGV0ZSwgaW4gZmF2b3Igb2YgdXNpbmcgRWxmX1N5bV9FeHRyYS4KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogVXNlIEVsZl9TeW1fRXh0cmEgdG8gbWFwIGludGVybmFsCi0Jc3ltYm9sIG51bWJlciB0byBleHRlcm5hbCBudW1iZXIuICBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUKLQlFbGZfU3ltX0V4dHJhIGZpZWxkIGZvciB0aGUgc3ltYm9sIGluIHRoZSB1ZGF0YSBmaWVsZC4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBFbGZfU3ltX0V4dHJhIHRvIG1hcCBvdXQgc3ltYm9scy4KLQotCVN1biBKdW4gMjAgMTY6MzA6MTEgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29ial90ZGF0YSk6IEFkZCBmaWVsZCB0byBjb3VudCB0aGUgc2l6ZSBvZiB0aGUKLQlhcnJheSBvZiBwb2ludGVycyB0byBzZWN0aW9uIHN5bWJvbHMuCi0JKGVsZl9tYXBfc3ltYm9scyk6IEJ1bXAgdGhlIG1heCBpbmRleCBvZiB0aGUgc2VjdGlvbiBzeW1ib2xzIHNvCi0JdGhhdCB3ZSBkb24ndCBvdmVyd3JpdGUgbWVtb3J5LiAgU3RvcmUgdGhlIG1heCBpbmRleCBpbnRvIHRoZQotCWVsZl9vYmpfdGRhdGEgZmllbGQuCi0KLQlTYXQgSnVuIDE5IDEwOjEyOjI3IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmpfdGRhdGEpOiBBZGQgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwb2ludGVycwotCXRvIHRoZSBzZWN0aW9uIHN5bWJvbHMgd2UgY3JlYXRlZC4gIFJlbW92ZSB1bnVzZWQgZmllbGQKLQlpbnRlcm5hbF9zeW1zLgotCShlbGZfbWFwX3N5bWJvbHMpOiBGaWxsIGluIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNlY3Rpb24gc3ltYm9scy4KLQlPbmx5IGNyZWF0ZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHNlY3Rpb25zIHRoYXQgaGF2ZSBTRUNfQUxMT0Mgc2V0LAotCWFuZCBoYXZlIG5vbi16ZXJvIHNpemUuCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogSWYgdWRhdGEgaXMgTlVMTCwgYW5kIHRoaXMgaXMgYQotCXNlY3Rpb24gc3ltYm9sLCBsb29rIHVwIHRoZSBzZWN0aW9uIGluIHRoZSBsaXN0IG9mIHNlY3Rpb24KLQlzeW1ib2xzLCBhbmQgc2V0IHRoZSB1ZGF0YSBwb2ludGVyIGFwcHJvcHJpYXRlbHkuICBPdGhlcndpc2UsIGlmCi0JdWRhdGEgaXMgc3RpbGwgTlVMTCwgZmFpbCBhbiBhc3NlcnRpb24sIGFuZCB1c2UgMCwgaW5zdGVhZCBvZgotCWRyb3BwaW5nIGNvcmUuCi0KLUZyaSBBdWcgMjAgMTI6MTg6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChtaXBzLSotZWxmbCosIG1pcHMtKi1lbGYqKTogTmV3IHRhcmdldHMsIHVzaW5nCi0JbWlwc2xlbGYgYW5kIG1pcHNiZWxmIHJlc3BlY3RpdmVseS4KLQkqIGNvbmZpZy9taXBzbGVsZi5tdCwgY29uZmlnL21pcHNiZWxmLm10OiBOZXcgZmlsZXMuCi0JKiBlbGYzMi1taXBzLmM6IEFkZGVkIHNvbWUgcmVsb2MgaW5mb3JtYXRpb24uCi0JKiBjb25maWd1cmUuaW46IEZpeGVkIGVycm9yIG1lc3NhZ2UuCi0KLQkqIGVjb2ZmLmMgKEVDT0ZGX0xPTkdfU0laRSk6IFJlbW92ZWQuICBKdXN0IHVzZSBjb25zdGFudHMuCi0KLVRodSBBdWcgMTkgMDk6NDU6NTEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMsIEFMTF9NQUNISU5FUywgQkZEMzJfQkFDS0VORFMsIEJGRDY0X0JBQ0tFTkRTLAotCU9QVElPTkFMX0JBQ0tFTkRTKTogQWxwaGFiZXRpemUgZW50cmllcyBhbmQgYWRkIGEgZmV3IG1pc3Npbmcgb25lcy4KLQkqIGFyY2h1cmVzLmM6IEFscGhhYmV0aXplIGRlY2xzLgotCi0JKiBjb25maWd1cmUuaW4sIHRhcmdldHMuYzogQWRkIG1pc3NpbmcgdmVjdG9ycyB0byB0aGUgdGFibGVzLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKSBbIVNFTEVDVF9WRUNTXTogQWRkIERFRkFVTFRfVkVDVE9SLgotCVJlbW92ZSBocDMwMGJzZF92ZWMgZHVlIHRvIGNsYXNoIHdpdGggc3Vub3NfYmlnX3ZlYy4KLQotVHVlIEF1ZyAxNyAxODoxMjozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NnttYWNoMyxvc2YxbWt9Lmg6IE5ldyBmaWxlcywgZm9yIE1hY2ggaG9zdGluZy4KLQkqIGhvc3RzL2kzODZtYWNoLmg6IHJlbW92ZWQsIHJlcGxhY2VkIGJ5IGkzODZvc2YxbWsuaC4KLQkqIGNvbmZpZy9pMzg2bWFjaDMubXQsIGkzODZtYWNoMy5jOiBOZXcgZmlsZXMsIGZvciBNYWNoIGEub3V0IGZvcm1hdC4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaG9zdCwgY29uZmlnLmJmZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogaG9zdHMvZGVjc3RhdGlvbi5oOiBJbmNsdWRlIDxzeXMvcGFyYW0uaD4gbm90IDxtYWNoaW5lL3BhcmFtLmg+LgotCi1UdWUgQXVnIDE3IDE1OjE5OjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3NlY3Rpb25fc3ltYm9sKTogSWYgc2VjdGlvbidzIG91dHB1dF9zZWN0aW9uIGlzCi0Jbm90IHlldCBzZXQsIHBvaW50IHRvIGl0c2VsZi4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhpcyBpcwotCWNhbGxlZCBvbiB0aGUgb3V0cHV0IGZpbGUsIG5vdCB0aGUgaW5wdXQgZmlsZS4KLQotCSogY29mZi1yczYwMDAuYyAoZHVtbXlfcmVsb2MsIFJUWVBFMkhPV1RPKTogU2V0IGhvd3RvIGZpZWxkIHRvIGEKLQlkdW1teSB2YWx1ZSwgcmF0aGVyIHRoYW4gbGVhdmluZyBpdCBOVUxMLgotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoKTogU2V0IGJmZF9lcnJvciBvbgotCWZhaWx1cmUuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X2FyY2hfbWFjaCkpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoLgotCi1UdWUgQXVnIDE3IDA5OjQyOjE2IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCAoY3B1KTogRXh0cmFjdCBmcm9tIGNhbm9uaWNhbCBuYW1lIHdpdGggc2VkLgotCSogY29uZmlndXJlLmluOiBEb24ndCBwYXNzIGl0LgotCi1TdW4gQXVnIDE1IDIwOjQ1OjQ1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogUmVtb3ZlIHtCWVRFLFdPUkQsTE9OR31fU0laRTsgdGhleSBhcmUgcG9pbnRsZXNzIGFuZAotCUJZVEVfU0laRSBjb25mbGljdHMgd2l0aCBhIE1hY2ggaGVhZGVyLgotCSogZWNvZmYuYzogQ2hhbmdlIExPTkdfU0laRSB0byBFQ09GRl9MT05HX1NJWkUgYW5kIGRlZmluZSBpdC4KLQotCSogY29uZmlndXJlLmhvc3Q6IE1ha2Ugc3VyZSBhbGwgT1MgZmllbGRzIGVuZCBpbiAqLgotCi1GcmkgQXVnIDEzIDE2OjMzOjMzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBVc2UgYmZkX2Fic19zZWN0aW9uIGZvcgotCVJFTE9DX1NFQ1RJT05fTk9ORSBhbmQgUkVMT0NfU0VDVElPTl9BQlMuICBJZiBhIHJlbG9jIHNlY3Rpb24KLQlkb2Vzbid0IGV4aXN0LCBkb24ndCB0cnkgdG8gY3JlYXRlIGl0LgotCi0JKiBubG1jb2RlLmggKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBwcm9jZWR1cmUgb2Zmc2V0cyBhcmUKLQlmcm9tIHN0YXJ0IG9mIGNvZGUgc2VnbWVudCwgbm90IHN0YXJ0IG9mIGZpbGUuCi0JKiBjb25maWcvaTM4Ni1ubG0ubXQgKERFRkFVTFRfVkVDVE9SKTogSXQncyBubG0zMl9pMzg2X3ZlYywgbm90Ci0JYmZkX25sbTMyX2kzODZfdmVjLgotCSogY29uZmlndXJlLmluIChTRUxFQ1RfVkVDUyBzd2l0Y2gpOiBMaWtld2lzZS4KLQotVGh1IEF1ZyAxMiAxMDozMjo0NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0KTogSWYgdGhlIHRhcmdldCBtYXRjaGVzIHRoZSBkZWZhdWx0Ci0JdGFyZ2V0LCBzZXQgbWF0Y2hfY291bnQgdG8gMSwgdG8gaWdub3JlIGFueSBwcmV2aW91cyBtYXRjaGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgc3JlYy5vLCBhZGQgcmVsb2MxNi5vLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCByZWxvYzE2Lm8gd2hlbiB3ZSBhZGQKLQljb2ZmLWg4MzAwLm8sIGNvZmYtaDg1MDAubywgY29mZi1zaC5vLCBjb2ZmLXo4ay5vLgotCU1ha2VmaWxlLmluIChCRkRfTElCUyk6IFJlbW92ZSByZWxvYzE2Lm8uCi0KLQkqIGNvbmZpZy91NjhrLWNvZmYubXQ6IEZpeCB0eXBvLCBERUZBVUxUX1RBUkdFVCBmb3IKLQlERUZBVUxUX1ZFQ1RPUi4KLQotCSogY29uZmlnL2g4MzAwLWNvZmYubXQsIGg4NTAwLWNvZmYubXQsIHNoLWNvZmYubXQsIHN0MjAwMC5tdCwKLQl6OGstY29mZi5tdCAoREVGQVVMVF9WRUNUT1IpOiBEZWZpbmUuICBEb24ndCBleHBsaWNpdGx5IGFkZAotCVMtcmVjb3JkcyB2aWEgU0VMRUNUX1ZFQ1MuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3RvciksIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IEFsd2F5cwotCXN1cHBvcnQgUy1yZWNvcmRzLCBmb3IgY29udmVuaWVuY2UuCi0KLVRodSBBdWcgMTIgMDg6MzA6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2hvd3RvX3RhYmxlLCBhbHBoYV9maW5pc2hfcmVsb2MsCi0JYWxwaGFfZWNvZmZfc3dhcF9yZWxvY197aW4sb3V0fSwgYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwKToKLQlSZWFkIGFuZCB3cml0ZSBBbHBoYSByZWxvY3MuICBDYW4ndCBwcm9jZXNzIHRoZW0geWV0LgotCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBSZWNvZ25pemUgbmV3IHJlbG9jIHNlY3Rpb25zLgotCUlmIHRoZSBzZWN0aW9uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGNyZWF0ZSBpdC4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX3tpbixvdXR9KTogSGFuZGxlIG5ldyBmaWVsZHMgZGVmaW5lZAotCW9uIHRoZSBBbHBoYS4KLQotCSogbGliZWNvZmYuaCAoZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkZWQgY29uc3RydWN0b3JfcmVsb2MgYW5kCi0JZmluaXNoX3JlbG9jIGZpZWxkcy4KLQkqIGVjb2ZmLmM6IE1vdmUgTUlQUyByZWxvYyBzdXBwb3J0IGZyb20gaGVyZS4uLgotCSogY29mZi1taXBzLmM6IHRvIGhlcmUuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBHZXQgY29uc3RydWN0b3IgcmVsb2MgaG93dG8KLQlmcm9tIGJhY2tlbmQuCi0JKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogUmVtb3ZlZCBNSVBTIHNwZWNpZmljIHN0dWZmLiAgQ2FsbAotCWZpbmlzaF9yZWxvYyBiYWNrZW5kIGZ1bmN0aW9uLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmVkIE1JUFMgc3BlY2lmaWMgYXNzZXJ0aW9ucy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2ZpbmlzaF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBGaWxsIGluIG5ldyBmaWVsZHMuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IFVzZSBOVUxMIGZvciBuZXcKLQlmaWVsZHMuCi0JKiB0YXJnZXRzLmM6IEFkZGVkIGV4dGVybiBmb3IgZWNvZmZhbHBoYV9saXR0bGVfdmVjLgotCi0JKiBiZmQuYyAoX2JmZF9ob3N0X2JpZ19lbmRpYW4pOiBSZW1vdmVkLgotCSogYmZkLWluLmggKEhPU1RfQllURV9PUkRFUl9CSUdfUCwgYmZkX2hlYWRlcl90d2lkZGxlX3JlcXVpcmVkKToKLQlSZW1vdmVkLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotV2VkIEF1ZyAxMSAxMjoxMToyMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IE5ldyBmaWxlLCBicm9rZW4gb3V0IG9mIGNvbmZpZ3VyZS5pbi4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGl0LCBhbmQgdXNlIHN0YW5kYXJkIHRhcmdldCBuYW1lcyBmb3IKLQktLXdpdGgtdGFyZ2V0cywgcmVwbGFjaW5nIC0td2l0aC1iZmQtdGFyZ2V0cy4KLQotCSogYXJjaHVyZXMuYyAoYXJjaHVyZXNfaW5pdF90YWJsZSk6IEFkZCBiZmRfc2hfYXJjaC4KLQotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIGNvZmYtbTY4ay5vIGZvciBtNjhrY29mZnVuX3ZlYy4KLQlJbmNsdWRlIG5sbTMyLm8gYW5kIG5sbS5vIGZvciBiZmRfbmxtMzJfaTM4Nl92ZWMuCi0JRml4IGVycm9yIGluIGVycm9yIG1lc3NhZ2UuCi0KLQkqIG9hc3lzLmM6IE1ha2UgYmZkX2Vycm9yX3ZlY3RvciBleHRlcm4uCi0KLQkqIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBzdGFiLXN5bXMubyBmb3IgYS5vdXQvYi5vdXQgdGFyZ2V0cwotCWFuZCBocDMwMHtic2QsaHB1eH0uCi0KLVdlZCBBdWcgMTEgMDY6NDA6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBZGQgdGhlIC5ic3MKLQlzZWN0aW9uIGJlZm9yZSBzZXR0aW5nIG91dHB1dF9oYXNfYmVndW4uCi0JKG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFJlbW92ZSBhcmd1bWVudCBuYW1lcyBmcm9tCi0JbWFuZ2xlX3JlbG9jc19mdW5jIHByb3RvdHlwZS4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSBzaGFkb3dpbmcgbG9jYWwgdmFyaWFibGUuCi0JRG9uJ3Qgd3JpdGUgb3V0IGRlYnVnZ2luZyBzeW1ib2xzIGlmIGRlYnVnSW5mb09mZnNldCBpcyAtMS4gIEFkZAotCXRoZSBjb2RlSW1hZ2VPZmZzZXQgdG8gdGhlIHN0YXJ0LCBleGl0LCBhbmQgY2hlY2sgcHJvY2VkdXJlCi0Jb2Zmc2V0cy4KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfd3JpdGVfcmVsb2MsIG5sbV9pMzg2X21hbmdsZV9yZWxvY3MpOgotCURvbid0IGNoZWNrIHBhcnRpYWxfaW5wbGFjZSBmaWVsZDsgaXRzIHZhbHVlIGlzIGlycmVsZXZhbnQuCi0KLQkqIEJhc2UgdXNlIG9mIHNjby1jb3JlIG9uIGhvc3QsIG5vdCB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNF04Ni0qLXNjbyopOiBVc2UgaTM4NnNjbyByYXRoZXIgdGhhbiBpMzg2di4KLQkqIGNvbmZpZy9pMzg2LXNjby5tdCAoVERFRklORVMpOiBSZW1vdmVkLgotCSogY29uZmlnL2kzODZzY28ubWg6IE5ldyBmaWxlIHRvIHVzZSBzY28tY29yZS4KLQkqIGhvc3RzL2kzODZzY28uaDogTmV3IGZpbGU7IGp1c3QgaW5jbHVkZXMgaG9zdHMvaTM4NnYuaC4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfe2hkcixleHR9X3tpbixvdXR9KTogVXNlIHNpZ25lZAotCWNvbnZlcnNpb25zIGZvciBzb21lIGZpZWxkcy4KLQotVHVlIEF1ZyAxMCAxMzozMjoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dwcmVsX3JlbG9jKTogSWYgX2dwIGlzIG5vdCBkZWZpbmVkLCBnaXZlIGFuCi0JZXJyb3IgcmF0aGVyIHRoYW4gYWJvcnRpbmcuCi0KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IEFkZGVkIG1hY2ggZmllbGQuCi0JKG5sbV9tYWNoaW5lKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCSogbmxtLmMgKG5sbV9ta29iamVjdCk6IFNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgZnJvbSBiYWNrZW5kCi0JaW5mb3JtYXRpb24uCi0JKiBubG0zMi1pMzg2LmMgKG5sbTMyX2kzODZfYmFja2VuZCk6IEluaXRpYWxpemUgbmV3IG1hY2ggZmllbGQuCi0KLVR1ZSBBdWcgMTAgMDk6MzE6MTggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlcGxhY2UgY2FsbHMgdG8gc29ydCB3aXRoIHNoZWxsIGNvZGUKLQl0byB1bmlxIHRoZSBsaXN0cy4KLQotVHVlIEF1ZyAxMCAwNjoyMzoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBhb3V0MzIubyBmb3IgYW55IGEub3V0L2Iub3V0IGZvcm1hdHMuCi0KLU1vbiBBdWcgIDkgMDk6Mzc6MTggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IGJmZF9lbGYzMl9pMzg2X3ZlYy4KLQkqIGNvbmZpZy9tNjhrLWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IG02OGtjb2ZmX3ZlYy4KLQkqIGNvbmZpZy9pMzg2LWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IGkzODZjb2ZmX3ZlYy4KLQkqIGNvbmZpZy9ocHBhLWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IGhwcGFfdmVjLgotCSogY29uZmlnL3NwYXJjLWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBTdXBwb3J0IHN1bm9zX2JpZ192ZWMuCi0JKiBjb25maWcvaTM4Ni1zY28ubXQgKFNFTEVDVF9WRUNTKTogRG9uJ3QgZGVmaW5lOyBJYW4gc2F5cyBpdCB3YXMKLQlqdXN0IGEgaGFjay4KLQotTW9uIEF1ZyAgOSAxMzoxNTowMCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tODhrLWNvZmYubXQgKERFRkFVTFRfVkVDIC0+IERFRkFVTFRfVkVDVE9SKTogcmVuYW1lZC4KLQotTW9uIEF1ZyAgOSAxNDoyNjo0NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHN5bXMuYyAoQlNGX0VYUE9SVCk6IE5vdyBzYW1lIGFzIEJTRl9HTE9CQUwuCi0KLQkqIGJmZC5jIChiZmRfc2Nhbl92bWEpOiBOZXcgZnVuY3Rpb24uCi0KLU1vbiBBdWcgIDkgMTE6Mjk6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9hcmNoaXRlY3R1cmUsIGJmZF9nZXRfbWFjaGluZSk6IFJlbW92ZWQKLQlvYnNvbGV0ZSBtYWNyb3MuCi0JKiBiZmQtaW4yLmg6IFVwZGF0ZWQuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX2FybWFwKTogQ29ycmVjdCBidWcgaW4gaW5pdGlhbGl6YXRpb24gb2YKLQlzdHJpbmdiYXNlLgotCi1TdW4gQXVnICA4IDEyOjIxOjEzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgdW5uZWVkZWQgdGVzdC4KLQotU3VuIEF1ZyAgOCAxMjo0MToyMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHtkaXN0LHJlYWx9Y2xlYW4pOiBVc2UgJChNQUtFKSwgbm90IG1ha2UuCi0KLVNhdCBBdWcgIDcgMDk6MTQ6MjEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvc3QyMDAwLm10IChUREVGSU5FUyk6IERvbid0IGRlZmluZSBNUkk7IG5vdCB1c2VkLgotCi0JKiBQT1JUSU5HLCBUT0RPLCBjb25maWcvUkVBRE1FOiBVcGRhdGUgdG8gcmVmbGVjdCBiZWxvdyBjaGFuZ2VzLgotCi0JKiBjb25maWd1cmUuaW46IFJlcGxhY2UgTUlOSU1JWkUgYW5kIC0td2l0aC1taW5pbWFsLWJmZCB3aXRoCi0JLS13aXRoLWJmZC10YXJnZXRzPSJ0YXJnZXQxLHRhcmdldDIsLi4uIiBhbmQgdGhlIHNwZWNpYWwgdGFyZ2V0Ci0JImFsbCIgdG8gZ2V0IHRoZSBwcmV2aW91cyBkZWZhdWx0IGJlaGF2aW9yLgotCUZpZ3VyZSBvdXQgd2hpY2ggYXJjaGl0ZWN0dXJlIGFuZCBiYWNrZW5kIC5vIGZpbGVzIGFyZSBuZWVkZWQgZnJvbQotCURFRkFVTFRfVkVDVE9SLCBTRUxFQ1RfVkVDUywgYW5kIFNFTEVDVF9BUkNISVRFQ1RVUkVTIGFzIHNldCBpbgotCXRoZSAubXQgZmlsZXMuICBEZWZpbmUgVERFRkFVTFRTIGJhc2VkIG9uIHRoZW0sIGFsc28uCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgcmVmZXJlbmNlcyB0byBNSU5JTUlaRS4KLQkqIGFyY2h1cmVzLmMsIHRhcmdldHMuYzogRGl0dG8uCi0KLQkqIGNvbmZpZy8qLm10OiBEZWZpbmUgREVGQVVMVF9WRUNUT1IsIFNFTEVDVF9WRUNTLCBhbmQKLQlTRUxFQ1RfQVJDSElURUNUVVJFUyBhcyB2YXJpYWJsZXMgcmF0aGVyIHRoYW4gYXMgLUQgYXJndW1lbnRzIHRvCi0JVERFRkFVTFRTLgotCi0JKiBjb25maWcvYTI5ay1jb2ZmLm10LGFscGhhb3NmLm10LCBpMzg2LXNjby5tdCwgaTk2MC1ib3V0Lm10LAotCWk5NjAtY29mZi5tdCAoVERFRkFVTFRTKTogRG9uJ3QgcHV0IHRoZSBkZWZhdWx0IHZlY3RvciBpbgotCVNFTEVDVF9WRUNTIG1hbnVhbGx5OyBpdCdzIGF1dG9tYXRpYyBub3cuCi0KLQkqIGNvbmZpZy9pMzg2LXNjby5tdCAoVERFRkFVTFRTKTogRG9uJ3QgcHV0ICZzY29fY29yZV92ZWMgaW4KLQlTRUxFQ1RfVkVDUyBtYW51YWxseTsgLURTQ09fQ09SRSBkb2VzIGl0IGF1dG9tYXRpY2FsbHkgbm93LgotCi0JKiBjb25maWcvaDgzMDAtY29mZi5tdCxoODUwMC1jb2ZmLm10LHNoLWNvZmYubXQsc3QyMDAwLm10LHo4ay1jb2ZmLm10Ci0JKFRERUZBVUxUUyk6IERvbid0IGRlZmluZSBCRkQ7IG5vdCB1c2VkLgotCi0JKiBjb25maWcvaHBwYW9zZi5taCAoSERFRklORVMpOiBEb24ndCBkZWZpbmUgU0VMRUNUX0FSQ0hJVEVDVFVSRVM7Ci0JdGhpcyBpcyBhIGhvc3QsIG5vdCBhIHRhcmdldC4KLQotU2F0IEF1ZyAgNyAwNToyODowMyAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiAgQWRkIGNvbW1lbnQgYWJvdXQgd2hhdCB0aGlzIGZ1bmN0aW9uCi0JZG9lcyBhbmQgdG8gd2F0Y2ggb3V0IGZvciBzaWRlIGVmZmVjdHMuICBBZGQgRklYTUUgZm9yIG1lbW9yeSBsZWFrcy4KLQlGaXggY29tbWVudCBhYm91dCBjaGVja2luZyBmb3IgbWF0Y2hpbmcgYnl0ZSBvcmRlci4gIFByZXNlcnZlCi0JcG9pbnRlciB0byBvbGQgdGRhdGEgKGlmIGFueSksIGFuZCByZXN0b3JlIGl0IGlmIHdlIGRvbid0IG1hdGNoCi0JZmlsZSB3aXRoIHRhcmdldCB2ZWN0b3IuICBJZiB3ZSBhcmUgZ29pbmcgdG8gdXNlIGdvdG8ncywgdXNlIHRoZW0KLQljb25zaXN0ZW50bHkgYW5kIG1haW50YWluYWJseS4KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogIEV4cGFuZCBjb21tZW50cyBhYm91dCBsZWFrZWQgbWVtb3J5Ci0JdG8gbm90ZSB0aGF0IHRoZSBwcm9ibGVtIGlzIGV2ZW4gbW9yZSBzZXJpb3VzIHRoYW4ganVzdCBsZWFrZWQKLQltZW1vcnkuICBSZXBsYWNlIGdvdG8gd2l0aCBtb3JlIHRyYWRpdGlvbmFsIHJldHVybi4KLQotRnJpIEF1ZyAgNiAxMjowMDowMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQlGaXggaW5jb3JyZWN0IG9yIHVzZWxlc3MgbWFrZWZpbGUgdmFyaWFibGUgZGVmaW5pdGlvbnM6Ci0JKiBjb25maWcvbmV3cy5tdCwgY29uZmlnL3U2OGstY29mZi5tdCAoVERFRkFVTFRTKTogVXNlIHRoaXMgdG8KLQlkZWZpbmUgREVGQVVMVF9WRUNUT1IsIGluc3RlYWQgb2YgVERFRklORVMuCi0JKiBjb25maWcvaTM4NmFpeC5taCAoTUlOSU1JWkUpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvaHBwYW9zZi5taCAoTUlOSU1JWkUpOiBEb24ndCBjb25kaXRpb25hbGl6ZS4KLQkqIGNvbmZpZy9yczYwMDAubWggKEFMTE9DQSksCi0JKiBjb25maWcvaTM4NnYubWggKEFMTE9DQSksCi0JKiBjb25maWcvaTM4NmxpbnV4Lm1oIChBTExPQ0EpLAotCSogY29uZmlnL2kzODZpc2MubWggKEFMTE9DQSksCi0JKiBjb25maWcvZ28zMi5taCAoRVhUUkFMSUJTKTogRG9uJ3QgZGVmaW5lOyBub3QgdXNlZC4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taCAoSERFRklORVMpOiBSZW5hbWVkIGZyb20gSF9ERUZJTkVTLgotCSogY29uZmlnL2FscGhhb3NmLm10IChUREVGSU5FUyk6IFNldCBpdCwgbm90IEhERUZJTkVTLgotCSogY29uZmlnL3o4ay1jb2ZmLm10IChDQyk6IERvbid0IGRlZmluZS4gIEl0J3MgYSB0YXJnZXQsIG5vdCBhIGhvc3QuCi0KLQkqIGNvbmZpZy9SRUFETUU6IE5ldyBmaWxlLCBleHBsYWluaW5nIHRoZSB2YXJpYWJsZXMuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEFkZCBocDMwMF9ic2RfdmVjLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTLCBDRklMRVMpOiBBZGQgaHAzMDBic2QuCi0JKGhwMzAwYnNkLm8pOiBOZXcgcnVsZS4KLQotRnJpIEF1ZyAgNiAxNToxMzoyMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChOQU1FKTogUHJvdmlkZSBhIGRlZmF1bHQgZGVmaW5pdGlvbiwgdGhhdCdzIG5laXRoZXIKLQlmb3IgMzIgYml0cyBub3IgZm9yIDY0LgotCi0JVHVlIEp1biAxNSAxNDozODozMiAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogbGliZWxmLmggKGVsZl9oYXNoKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvIGJmZF9lbGZfaGFzaCwgc2luY2UKLQl0aGF0IGlzIHdoYXQgaXMgaW4gZWxmLmMuCi0KLUZyaSBBdWcgIDYgMTI6Mjg6MzggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBSZW1vdmVkIHNwZWNpYWwgaGFuZGxpbmcgZm9yCi0Jc2NCc3MgYW5kIHNjU0JzcyBzeW1ib2xzLCBzaW5jZSBpdCB3YXMgd3JvbmcuCi0KLQkqIE1ha2VmaWxlLmluIChjb2ZmLW1pcHMubywgY29mZi1hbHBoYS5vKTogRG9uJ3QgZGVwZW5kIG9uCi0JY29mZmNvZGUuaC4KLQotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJbnNwaXJlZCBieSBtYkB0dGkuQ09NIChNaWNoYWVsCi0JQmxvb20pOiBPbmx5IHNldCBTVFlQX0JTUyBmb3IgU0VDX0FMTE9DIHNlY3Rpb25zLgotCi0JKiBlY29mZi5jIChlY29mZl9zbHVycF9hcm1hcCk6IEZyb20gQXJuZSBIZW5yaWsgSnV1bAotCTxhcm5lakBrYXJpLmZtLnVuaXQubm8+OiBIYW5kbGUgYSBDT0ZGIHN0eWxlIGFybWFwLgotCi1GcmkgQXVnICA2IDA5OjU5OjQ1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBocHV4LWNvcmUuYzogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbSBiZmRfemFsbG9jLgotCi1UaHUgQXVnICA1IDEzOjIyOjQ0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAobG9nMik6IERlbGV0ZSBpMzg3LXNwZWNpZmljIGNvZGUuCi0KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IEFsd2F5cyBpbmNsdWRlIGVsZi5vLgotCShCRkQzMl9CQUNLRU5EUyk6IERvbid0IGluY2x1ZGUgZWxmLm8gaGVyZS4KLQkob2ZpbGVzKTogRGVsZXRlIHJlZmVyZW5jZXMgdG8gb2ZpbGVzMiBhbmQgb2ZpbGVzMy4KLQkoZG9fY2xlYW4pOiBEZWxldGUgb2ZpbGVzLgotCShCRkRJTl9IKTogQ2hhbmdlZCByZWZlcmVuY2VzIHRvICQoc3JjZGlyKS9iZmQtaW4yLmguCi0JKHN0bXAtYmZkLmgpOiBVc2UgYmZkLmgtbmV3IGFzIHRlbXBvcmFyeSBuYW1lLCBub3QgYmZkLmgyLgotCShoZWFkZXJzKTogVXNlIGJmZC1pbjIuaC1uZXcgYXMgdGVtcG9yYXJ5IG5hbWUsIG5vdCBiZmQuaC1uZXcuCi0KLQkqIGJmZC1pbi5oOiBSZXdvcmRlZCBjb21tZW50IHRvIG1ha2UgaXQgY2xlYXIgdGhhdCBiZmQtaW4yLmggaXMgYQotCWdlbmVyYXRlZCBmaWxlLgotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGRlZCBpMzg2LWVsZiByZWxvYyB0eXBlcwotCShmcm9tIE1laXNzbmVyJ3MgYWRkaXRpb25zIHRvIGJmZC1pbjIuaCkuCi0KLQkqIGVsZjMyLWkzODYuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCi0JTWVyZ2VkOgotCi0JV2VkIEp1biAyMyAwNjowNTo1OCAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmY29kZS5oIChlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgZHJvcCBjb3JlIGlmCi0JZWxmX3N5bWJvbF9mcm9tIHJldHVybnMgYSBOVUxMIHBvaW50ZXIgd2hlbiBwcm9jZXNzaW5nIGEgbm9uLWVsZgotCXN5bWJvbCwgdXNlIGEgMCBzaXplIGluc3RlYWQuCi0KLQlUdWUgSnVuIDE1IDE0OjM4OjMyIDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGZjb2RlLmggKGVsZl9oYXNoKTogRGVsZXRlIG1hY3JvIG1hcHBpbmcgZWxmX2hhc2ggdG8KLQliZmRfZWxmMzJfaGFzaCwgc2luY2UgdGhlIGhhc2ggdGFibGUgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIDMyLzY0Ci0JYml0IHN5c3RlbS4KLQotCSogbGliZWxmLmggKGVsZl9oYXNoKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvIGJmZF9lbGZfaGFzaCwgc2luY2UKLQl0aGF0IGlzIHdoYXQgaXMgaW4gZWxmLmMuCi0KLQlTYXQgSnVuIDE5IDEwOjEyOjI3IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGYzMi1pMzg2LmggKHJlbG9jX3R5cGUpOiBSZWZvcm1hdCBzcGFjaW5nLgotCShlbGZfaG93dG9fdGFibGUpOiBBZGQgdGhlIHJlc3Qgb2YgdGhlIDM4Ni9FTEYgcmVsb2NhdGlvbnMuCi0JKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogRGl0dG8uCi0JKGVsZl9pMzg2X2luZm9fdG9faG93dG8pOiBEaXR0by4KLQkoZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwpOiBEaXR0by4KLQotVGh1IEF1ZyAgNSAxMDowNzo0MyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogIFRlc3QgcmV0dXJuIHZhbHVlCi0Jb2YgbmxtX3NsdXJwX3N5bWJvbF90YWJsZSBhcyBib29sZWFuLCBub3QgcG9pbnRlci4KLQkqIG5sbWNvZGUuaCAobmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6ICBUZXN0IHJldHVybiB2YWx1ZQotCW9mIG5sbV9zbHVycF9yZWxvY19maXh1cHMgYXMgYm9vbGVhbiwgbm90IHBvaW50ZXIuCi0KLVdlZCBBdWcgIDQgMTY6MjI6NTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZ28zMi5taDogcmVtb3ZlIEhERUZJTkVTOyBzaW5jZSBfX01TRE9TX18gYW5kIF9fR08zMl9fCi0JYXJlIG5vdyBwcmVkZWZpbmVkIGJ5IEdDQwotCi1XZWQgQXVnICA0IDE2OjA2OjI5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IEFkZCB0aGUgc2VjdGlvbiBvZmZzZXQgdG8gdGhlCi0JbGluZSBudW1iZXIgYWRkcmVzcywgc28gaXQncyBwcmludGVkIHRoZSBzYW1lIHdheSBhcyB0aGUgZnVuY3Rpb24KLQlhZGRyZXNzLiAgT25seSBzaG93ZWQgdXAgZm9yIGxpbmUgbnVtYmVycyB0aGF0IGFyZW4ndCBpbiB0aGUgZmlyc3QKLQlzZWN0aW9uICgudGV4dCkuCi0KLVdlZCBBdWcgIDQgMDg6MzM6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaWJubG0uaCAobmxtX2JhY2tlbmRfZGF0YSk6IEFkZGVkIG5sbV9tYW5nbGVfcmVsb2NzLgotCShubG1fbWFuZ2xlX3JlbG9jc19mdW5jKTogTmV3IG1hY3JvLgotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl93cml0ZV9yZWxvYyk6IFJld3JvdGUgY29ycmVjdGx5LgotCShubG1faTM4Nl9tYW5nbGVfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCSogbmxtY29kZS5oIChubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTW92ZSBhbGwgY29tbW9uCi0Jc3ltYm9scyBpbnRvIHRoZSAuYnNzIHNlY3Rpb24uCi0JKG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IENhbGwgdGhlIG1hbmdsZV9yZWxvY3MgZnVuY3Rpb24uCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBUcmVhdCBhIHJlbG9jIGFnYWluc3QgYW55IGRlZmluZWQKLQlzeW1ib2wgYXMgYW4gaW50ZXJuYWwgcmVsb2MuICBGaXggYnVnIGluIGV4dGVybmFsIHJlbG9jIGNvdW50aW5nLgotCUdldCB0aGUgb2Zmc2V0IGFuZCBkZWJ1Z2dpbmcgdHlwZSByaWdodCBmb3IgLmJzcyBzeW1ib2xzLiAgT25seQotCW91dHB1dCBkZWJ1Z2dpbmcgc3ltYm9scyBmb3IgZGVmaW5lZCBzeW1ib2xzLgotCi0JKiBjb2ZmLWg4NTAwLmMgKHJ0eXBlMmhvd3RvKTogRG8gYW4gZnByaW50ZiB0byBzdGRlcnIgcmF0aGVyIHRoYW4KLQl1c2luZyBwcmludGYuCi0JKiBjb2ZmLXo4ay5jIChydHlwZTJob3d0byk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChUUkFDRSk6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKGNvbnZlcnRfc3ltX3R5cGUsIHN3YXBfc3RkX3JlbG9jX2luKTogTGlrZXdpc2UuCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogRG8gYW4gZnByaW50ZiB0byB0aGUgZmlsZQotCWFyZ3VtZW50IHJhdGhlciB0aGFuIHVzaW5nIHByaW50Zi4KLQotVHVlIEF1ZyAgMyAxODoxNzoyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZzd2FwLmg6IEFkZGVkIG1hY3JvcyB1c2VkIHdoZW4gYWNjZXNzaW5nIHNldmVyYWwgZmllbGRzOwotCWRlZmF1bHQgaXMgdGhlIHNhbWUgYXMgYmVmb3JlLgotCShjb2ZmX3N3YXBfYW91dGhkcl97aW4sb3V0fSk6IEhhbmRsZSB0aGUgQWxwaGEgRUNPRkYgZmllbGRzLgotCSogY29mZi1hbHBoYS5jOiBEZWZpbmVkIG1hY3JvcyB0byB1c2UgdGhlIHJpZ2h0IHNpemVzIGluCi0JY29mZnN3YXAuaC4KLQkqIGxpYmVjb2ZmLmg6IEJhY2tlbmQgaW5mb3JtYXRpb24gaXMgbm93IGluIHRhcmdldCB2ZWN0b3IsIG5vdAotCUJGRC4gIFN0YXJ0IG9mIGJhY2tlbmQgaW5mb3JtYXRpb24gaXMgQ09GRiBiYWNrZW5kIGluZm9ybWF0aW9uLgotCSogY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYzogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0KTogTmV3IGZ1bmN0aW9uLgotCShBUk1BUF9TVEFSVCk6IENoYW5nZWQgaW50byBiYWNrZW5kIGluZm9ybWF0aW9uLCBzaW5jZSBBbHBoYSB1c2VzCi0JYSBkaWZmZXJlbnQgbmFtZS4KLQkoZWNvZmZfc2x1cnBfYXJtYXApOiBEb24ndCBvdmVybGF5IGFyY2hpdmUgaGVhZGVyLgotCSogYmZkLmM6IEluY2x1ZGUgbGliY29mZi5oLgotCi1UdWUgQXVnICAzIDE2OjMzOjExIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBGaXggc2ggc3ludGF4IGVycm9yLgotCi0JKiBhb3V0ZjEuaDogTWFrZSBiZmRfZXJyb3JfdHJhcCBleHRlcm47IGl0J3MgZGVmaW5lZCBpbiBiZmQuYy4KLQotVHVlIEF1ZyAgMyAxNToxOTowOSAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtX3NsdXJwX3N5bWJvbF90YWJsZTogRG9uJ3QgdXNlICcmJyBvbiBhcnJheXMuCi0KLVR1ZSBBdWcgIDMgMTE6MDY6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5jOiBOZXcgZmlsZSBmb3IgZ2VuZXJpYyBFQ09GRiBmdW5jdGlvbnMuCi0JKiBlY29mZnN3YXAuaDogTmV3IGZpbGUgZm9yIEVDT0ZGIHN3YXBwaW5nIGZ1bmN0aW9ucyB3aGljaCBkaWZmZXIKLQlvbmx5IHNsaWdodGx5IGZvciBkaWZmZXJlbnQgdGFyZ2V0cy4KLQkqIGxpYmVjb2ZmLmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIGVjb2ZmLmMgZnVuY3Rpb25zLgotCShlY29mZl9iYWNrZW5kX2RhdGEpOiBOZXcgc3RydWN0dXJlLgotCShlY29mZl90ZGF0YSk6IEFkZGVkIGJhY2tlbmRfZGF0YSBmaWVsZC4gIENoYW5nZWQgZXh0ZXJuYWwgZGF0YQotCXBvaW50ZXJzIHRvIGJlIFBUUiByYXRoZXIgdGhhbiB0byBhIHBhcnRpY3VsYXIgc3RydWN0LgotCShlY29mZl9zeW1ib2xfc3RydWN0KTogTW92ZWQgaW4gZnJvbSBjb2ZmLW1pcHMuYy4KLQkqIGNvZmYtYWxwaGEuYywgY29mZi1taXBzLmM6IE1vdmVkIGNvbW1vbiBmdW5jdGlvbnMgaW50byBlY29mZi5jLgotCUFkZGVkIEVDT0ZGIGJhY2tlbmQgc3RydWN0dXJlcy4gIEluY2x1ZGUgZWNvZmZzd2FwLmguCi0JKiBjb2ZmLW1zeW0uYzogUmVtb3ZlZDsgc3VwZXJzZWRlZCBieSBlY29mZnN3YXAuaC4KLQkqIGJmZC5jOiBJbmNsdWRlIGNvZmYvaW50ZXJuYWwuaC4KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IFJlbW92ZWQgY29mZi1taXBzLm8gYW5kIGNvZmYtbXN5bS5vLgotCUFkZGVkIGVjb2ZmLm8uCi0JKEJGRDY0X0JBQ0tFTkRTKTogQWRkZWQgY29mZi1hbHBoYS5vLgotCShDRklMRVMpOiBSZW1vdmVkIGNvZmYtbXN5bS5jLiAgQWRkZWQgZWNvZmYuYy4KLQkoYmZkLm8pOiBBZGRlZCBkZXBlbmRlbmN5IG9uICQoSU5DRElSKS9jb2ZmL3N5bS5oLgotCShjb2ZmLW1pcHMubyk6IEFkZGVkIGRlcGVuZGVuY3kgb24gZWNvZmZzd2FwLmggYW5kIGNvZmYvZWNvZmYuaC4KLQkoZWNvZmYubywgY29mZi1hbHBoYS5vKTogTmV3IHRhcmdldHMuCi0JKGNvZmYtbXN5bS5vKTogUmVtb3ZlZCB0YXJnZXQuCi0KLU1vbiBBdWcgIDIgMjM6MzM6MzggMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWhwcGEuaCwgaG9zdHMvKjogIFJlbW92ZSAob25lIG1vcmUgdGltZSkgYWxsIG9jY3VycmFuY2VzCi0Jb2YgRVhGVU4gaW4gdGhlIEJGRCBzb3VyY2VzLiAgSGVhdmUgaG8hCi0KLU1vbiBBdWcgIDIgMTY6NDU6NTcgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiAgQWRkIGNoZWNrIGZvciBJMzg2TFlOWE1BR0lDLgotCi1Nb24gQXVnICAyIDEyOjE4OjAzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3VuMy5oOiByZW1vdmUgc29tZSBtb3JlIGNvbmZsaWN0aW5nIGRlY2xzCi0KLU1vbiBBdWcgIDIgMTE6NDg6MjMgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaTM4Nmx5bnguYzogIFJlbW92ZSB1bm5lY2Vzc2FyeSBkZWYgb2YgTl9IRUFERVJfSU5fVEVYVCwKLQlyZWRlZmluZSBURVhUX1NUQVJUX0FERFIgdG8gYmUgMC4KLQotU3VuIEF1ZyAgMSAyMjo1NDowOCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdCwgY29uZmlndXJlLmluLCBob3N0cy9pMzg2bHlueC5oOiAgTHlueC8zODYKLQlob3N0IGFuZCB0YXJnZXQgaW5mby4KLQotRnJpIEp1bCAzMCAxODowODoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbTMyLWkzODYuYzogTmV3IGZpbGUuICBGaXJzdCBjdXQgYXQgaTM4NiBOTE0gY29kZS4KLQkqIGxpYm5sbS5oOiBBZGRlZCBzb21lIG1vcmUgcHJvdG90eXBlcy4KLQkoc3RydWN0IG5sbV9yZWxlbnQpOiBOZXcgc3RydWN0dXJlLgotCShubG1OQU1FKHN5bWJvbF90eXBlKSk6IEFkZGVkIHJjbnQgYW5kIHJlbG9jcyBmaWVsZHMuCi0JKHN0cnVjdCBubG1fb2JqX3RkYXRhKTogQWRkZWQgbmV3IGZpZWxkczogbmxtX3N5bWJvbHMsCi0JbmxtX3RleHRfbG93LCBubG1fZGF0YV9sb3csIG5sbV9yZWxvY19maXh1cHMsCi0JbmxtX3JlbG9jX2ZpeHVwX3NlY3MuCi0JKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhKTogTmV3IHN0cnVjdHVyZSwgd2l0aCBhY2Nlc3NvciBtYWNyb3MuCi0JKiBubG1jb2RlLmg6IFVzZSBOTE1fSElCSVQgcmF0aGVyIHRoYW4gTVNCLgotCShubG1fb2JqZWN0X3ApOiBTZXQgU0VDX1JFTE9DIGZvciAudGV4dCBhbmQgLmRhdGEuICBEb24ndCBzZXQKLQlTRUNfREFUQSBmb3IgLmJzcy4gIFNldCBIQVNfUkVMT0MgYW5kIEhBU19TWU1TIGZvciBhYmZkLiAgU2V0IHRoZQotCWFyY2hpdGVjdHVyZS4KLQkobmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCwgbmxtX3N3YXBfdmFyaWFibGVfaGVhZGVyX291dCwKLQlmaW5kX25vbnplcm8sIG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IE5ldyBvdXRib3VuZAotCXN3YXBwaW5nIGZ1bmN0aW9ucy4KLQkobmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBJbmNsdWRlCi0JZXh0ZXJuYWwgcmVmZXJlbmNlcyBpbiBzeW1ib2wgdGFibGUgYXMgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKG5sbV9nZXRfc3ltdGFiLCBubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogRmlsbCBpbiBhbG9jYXRpb24KLQlhcmd1bWVudCBpbiBnZXRfc3ltdGFiIHJhdGhlciB0aGFuIGluIHNsdXJwX3N5bWJvbF90YWJsZS4KLQkobmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNhdmUgc3ltYm9sIGluZm9ybWF0aW9uIGluIHRkYXRhLgotCShubG1fcHJpbnRfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCShubG1fc2x1cnBfcmVsb2NfZml4dXBzLCBubG1fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLAotCW5sbV9jYW5vbmljYWxpemVfcmVsb2MpOiBOZXcgZnVuY3Rpb25zIHRvIHJlYWQgcmVsb2NzLgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLCBubG1fc2V0X3NlY3Rpb25fY29udGVudHMsCi0JbmxtX2V4dGVybmFsX3JlbG9jX2NvbXBhcmUsIG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBOZXcKLQlmdW5jdGlvbnMgdG8gY3JlYXRlIE5MTSBmaWxlcy4KLQkqIG5sbS10YXJnZXQuaDogRGVmaW5lIGFsbCB0aGUgbmxtIGZ1bmN0aW9ucyBoZXJlIGVpdGhlciBhcwotCWRlZmF1bHQgdmFsdWVzIG9yIGluIHRlcm1zIG9mIG5sbU5BTUUuICBVc2UgSlVNUF9UQUJMRShubG0pLiAgU2V0Ci0JdGhlIGJhY2tlbmRfZGF0YSBmaWVsZCB0byBUQVJHRVRfQkFDS0VORF9EQVRBLgotCSogbmxtMzItZ2VuLmMsIG5sbTY0LWdlbi5jOiBEb24ndCBkZWZpbmUgZnVuY3Rpb24gbWFjcm9zIGhlcmU7Ci0JdGhleSBhcmUgbm93IGluIG5sbS10YXJnZXQuaC4KLQkoVEFSR0VUX0JBQ0tFTkRfREFUQSk6IERlZmluZSBhcyBOVUxMLgotCSogbmxtLmMgKG5sbV9ta29iamVjdCk6IERvIGFsbG9jYXRlIHRoZSB0ZGF0YSBmaWVsZC4KLQkobmxtX3NldF9hcmNoX21hY2gpOiBOZXcgZnVuY3Rpb24uCi0JKiB0YXJnZXRzLmM6IEFkZGVkIG5sbTMyX2kzODZfdmVjLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkZWQgbmxtMzItaTM4Ni5vLgotCShDRklMRVMpOiBBZGRlZCBubG0zMi1pMzg2LmMuCi0JKG5sbTMyLWdlbi5vLCBubG02NC1nZW4ubyk6IERlcGVuZCBvbiBubG0tdGFyZ2V0LmguCi0JKG5sbTMyLWkzODYubyk6IE5ldyB0YXJnZXQuCi0KLVRodSBKdWwgMjkgMjA6MjA6MzkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdW4zLmg6IHJlbW92ZSBzb21lIGZ1bmN0aW9uIGRlY2xzIHRoYXQgY29uZmxpY3Qgdy8gQU5TSQotCUMsIGFuZCBhcmVuJ3QgbmVlZGVkIGFueXdheSAocmV0dXJuIGludCkKLQotV2VkIEp1bCAyOCAxNTo0NjozOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaDogVXNlIGNhc3RzIHdpdGggYmZkX2FsbG9jIGFuZCBhbGxvY2EuCi0KLVR1ZSBKdWwgMjcgMTI6NTE6NDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG5sbXszMiw2NH0tZ2VuLmMgKEpVTVBfVEFCTEVfUFJFRklYKTogIERlbGV0ZS4KLQkqIG5sbXszMiw2NH0tZ2VuLmMgKEpVTVBfVEFCTEVfSU5JVCk6ICBOZXcgbWFjcm8gdGhhdCB3b3JrcyB3aXRoCi0Jb2xkZXIgY3BwJ3MsIHRoYXQgZG9uJ3QgZG8gYWRkaXRpb25hbCByZXBsYWNlbWVudCBvbiB0aGUgSlVNUF9UQUJMRQotCW1hY3JvJ3MgYXJndW1lbnQuCi0JKiBubG0tdGFyZ2V0LmggKEpVTVBfVEFCTEVfSU5JVCk6ICBVc2UgbmV3IG1hY3JvIGluIHBsYWNlIG9mCi0JSlVNUF9UQUJMRSBtYWNyby4KLQotTW9uIEp1bCAyNiAxNzozOTowMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCVlldCBhbm90aGVyIHRyYWQtY29yZSB2YXJpYW50OgotCSogY29uZmlnL2VzaXgubWgsIGhvc3RzL2VzaXguaDogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmhvc3RzOiBVc2UgdGhlbS4KLQotTW9uIEp1bCAyNiAxMzoyMjoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBIYW5kbGUgdGhlIGNhc2Ugb2YKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgcmlnaHRzaGlmdCA+IGJpdHBvcywgYW5kIGEgbmVnYXRpdmUKLQludW1iZXIuCi0KLU1vbiBKdWwgMjYgMTQ6NDA6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmg6IFJlaW1wbGVtZW50IHNlZ21lbnQgd3JpdGluZy4KLQkoZWxmX3dyaXRlX3BoZHJzKTogVXNlIHByZWNvbXB1dGVkIGVfcGhvZmYgcmF0aGVyIHRoYW4gbWFraW5nCi0JYXNzdW1wdGlvbnMuCi0JKGVsZl9idWlsZF9waGRycyk6IERpc2FibGVkLCBmb3Igbm93LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IERvbid0IGNoYW5nZSBmaWxlIG9mZnNldCBmb3IKLQlTSFRfTk9CSVRTLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3N5bXRhYl9hbmRfc3RydGFicyk6IE5ldyBmdW5jdGlvbi4KLQkoc3RydWN0IHNlZ19pbmZvKTogTmV3IHR5cGUuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogTmV3IGZ1bmN0aW9uLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEZvciBleGVjdXRhYmxlcywgbGVhdmUKLQlzZWN0aW9uIGhlYWRlcnMgJmMgZm9yIGxhc3QsIGFuZCBwcm9wZXJseSBhbGlnbiBhbGwgc2VjdGlvbnMgd2l0aAotCWZsYWcgU0hGX0FMTE9DIHNldC4KLQkocHJlcF9oZWFkZXJzKTogTm8gbG9uZ2VyIGFib3J0IHdoZW4gRVhFQ19QIGlzIHNldC4KLQkod3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBEZWxldGVkIGFsbCBjb2RlIHJlbGF0aW5nIHRvIHByb2dyYW0KLQlzZWdtZW50cy4KLQotCSogZWxmY29kZS5oICh2YXJpb3VzKTogRGVsZXRlZCBzb21lIHVudXNlZCBjb2RlLCBhbmQgZGVidWdnaW5nCi0JIm1hbGxvYygwKSIgY2FsbHMuCi0JKHdyaXRlX3JlbG9jcyk6IENhY2hlIHZhbHVlIG9mIGxhc3Qgc3ltYm9sIGxvb2tlZCB1cCwgdG8gc2F2ZQotCXRpbWUgaWYgdGhlIHN5bWJvbCBpcyByZWZlcnJlZCB0byByZXBlYXRlZGx5LgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IENoZWNrIG9ubHkgU0VDX1JFTE9DIGZsYWcsIG5vdCBudW1iZXIgb2YKLQlyZWxvY3MuCi0JKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW4gKG9maWxlcyk6IFN0YXJzIGluIHdpbGRjYXJkcyBiZWxvbmcgb3V0c2lkZSBxdW90ZXMuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IE5ldyBmaWVsZCwgbWF4cGFnZXNpemUuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogTmV3IGZpZWxkLCBwaGRyLgotCSogZWxmMzItdGFyZ2V0LmggKGVsZjMyX2JlZCk6IEluaXRpYWxpemUgbWF4cGFnZXNpemUgZnJvbQotCUVMRl9NQVhQQUdFU0laRS4KLQkoRUxGX01BWFBBR0VTSVpFKTogRGVmYXVsdCB0byAxLgotCSogZWxmNjQtdGFyZ2V0LmggKGVsZjY0X2JlZCwgRUxGX01BWFBBR0VTSVpFKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0JKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IEFsbCByZWxvY3Mgc2hvdWxkIGhhdmUgcGNyZWxfb2Zmc2V0PXRydWUuCi0JTW9zdCBzaG91bGQgaGF2ZSBsZW5ndGggZmllbGQgb2YgYDInLgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIDY0LWJpdCByZWxvY3MuCi0KLQkqIGNvbmZpZy9zcGFyYy1hb3V0Lm10IChUQVJHRVRfQkFDS0VORFMpOiBEZWZpbmUuCi0KLU1vbiBKdWwgMjYgMDg6NTY6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGxvb2sgaW4gJHtzcmNkaXJ9IGZvciAke3RhcmdldF9tYWtlZmlsZV9mcmFnfTsKLQl0aGUgdG9wIGxldmVsIHNjcmlwdCBoYXMgYWxyZWFkeSBhZGp1c3RlZCBmb3IgaXQuCi0KLU1vbiBKdWwgMjYgMDg6MDk6MTkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiAgR2V0IENSIExGIGluIHRoZSByaWdodCBvcmRlci4KLQotTW9uIEp1bCAyNiAwMjowODo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvdmF4YnNkLmg6IEluY2x1ZGUgc3RkLWhvc3QuaC4gIERvbid0IGluY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4uCi0KLVNhdCBKdWwgMjQgMTY6MTM6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIGNhc2Ugb2YgcmlnaHRzaGlmdCAhPQotCWJpdHBvcyB3aGVuIG92ZXJmbG93IGNoZWNraW5nLgotCi1GcmkgSnVsIDIzIDEwOjIwOjI3IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uLCBiZmRfdW5kZWZpbmVkX3N5bWJvbCwKLQliZmRfcmVsb2NfdmFsdWVfdHJ1bmNhdGVkLCBiZmRfcmVsb2NfaXNfZGFuZ2Vyb3VzLCBiZmRfYXNzZXJ0KToKLQlTZW5kIGVycm9yIG1lc3NhZ2VzIHRvIHN0ZGVyci4KLQotVGh1IEp1bCAyMiAxNTo1NzoyOSAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtezMyLDY0fS10YXJnZXQuaDogIFJlbW92ZS4KLQkqIG5sbS10YXJnZXQuaDogIE5ldyBmaWxlLCBtZXJnZWQgZnJvbSBubG17MzIsNjR9LXRhcmdldC5oCi0JKiBsaWJubG0uaCAoTkxNX0FSQ0hfU0laRSk6ICBEZWZpbmUgdG8gQVJDSF9TSVpFLgotCSogbmxtLmMgKEFSQ0hfU0laRSk6ICBSZW1vdmUgZGVmaW5lIHRvIHplcm8uCi0JKiBubG0zMi1nZW4uYyAoQVJDSF9TSVpFKTogIERlZmluZSB0byAzMi4KLQkqIG5sbTMyLWdlbi5jIChKVU1QX1RBQkxFX1BSRUZJWCk6ICBEZWZpbmUgdG8gbmxtMzIuCi0JKiBubG17MzIsNjR9LWdlbi5jIChubG0tdGFyZ2V0LmgpOiAgSW5jbHVkZS4KLQkqIHRhcmdldHMuYywgbGlibmxtLmgsIG5sbS5jLCBubG17MzIsNjR9LWdlbi5jLCBubG17MzIsNjR9LmMsCi0JbmxtY29kZS5oOiAgQ29udmVydCBwcmVmaXhlcyBmcm9tIGJmZF9ubG08c2l6ZT4gdG8ganVzdAotCW5sbTxzaXplPiwgYW5kIHVzZSBtYWNyb3Mgc2VsZWN0IHNpemUuCi0KLVRodSBKdWwgMjIgMTU6NDA6MTQgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBhZGQgY29uZmlndXJlLmluLCBkcm9wIHJlZHVuZGFudAotCSAgJChzcmNkaXIpLCBkcm9wIHJlZHVuZGFudCAuLwotCi1UaHUgSnVsIDIyIDEzOjM0OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaHB1eC1jb3JlLmM6IE5ldyBmaWxlOyBiYWNrZW5kIGZvciBIUC9VWCBzdHlsZSBjb3JlIGZpbGVzLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogUmVuYW1lZCBocHBhX2NvcmVfZGF0YSBmaWVsZCB0bwotCWhwdXhfY29yZV9kYXRhLgotCSogYmZkLWluMi5oOiBVcGRhdGVkLgotCSogaHBwYS5jIChtYWtlX2JmZF9hc2VjdGlvbiwgaHBwYV9jb3JlX2ZpbGVfcCwKLQlocHBhX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQsIGhwcGFfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsLAotCWhwcGFfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogTW92ZWQgaW50byBocHV4LWNvcmUuYy4KLQlSZW1vdmVkIGZyb20gdGFyZ2V0IHZlY3Rvci4KLQkqIGxpYmhwcGEuaCAoc3RydWN0IGhwcGFfY29yZV9zdHJ1Y3QgYW5kIGFjY2Vzc29yIG1hY3Jvcyk6IE1vdmVkCi0JaW50byBocHV4LWNvcmUuYy4KLQkqIHRhcmdldHMuYzogSWYgSFBVWF9DT1JFIGlzIGRlZmluZWQsIGFkZCBocHV4X2NvcmVfdmVjIHRvCi0JdGFyZ2V0IGxpc3QuCi0JKiBjb25maWcvaHAzMDAubWggKEhERUZJTkVTKTogU2V0IHRvIC1ESFBVWF9DT1JFLgotCShIREVQRklMRVMpOiBTZXQgdG8gaHB1eC1jb3JlLm8uCi0JKiBjb25maWcvaHBwYWJzZC5taCwgY29uZmlnL2hwcGFocHV4Lm1oOiBMaWtld2lzZS4KLQkqIGhvc3RzL2hwMzAwLmggKEhPU1RfSFAzMDBIUFVYKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW4gKE9QVElPTkFMX0JBQ0tFTkRTKTogQWRkZWQgc2NvLWNvcmUubywKLQlhaXgzODYtY29yZS5vLCBocHV4LWNvcmUuby4KLQkoc2NvLWNvcmUubywgYWl4Mzg2LWNvcmUubywgaHB1eC1jb3JlLm8pOiBOZXcgZGVwZW5kZW5jaWVzLgotCi0JKiByZWxvYy5jIChlbnVtIGNvbXBsYWluX292ZXJmbG93KTogTmV3IGVudW1lcmF0aW9uIHdpdGggdGhlCi0JdmFyaW91cyBmbGF2b3VycyBvZiBvdmVyZmxvdyBjaGVja2luZy4KLQkoc3J0dWN0IHJlbG9jX2hvd3RvX3N0cnVjdCk6IENoYW5nZWQgY29tcGxhaW5fb25fb3ZlcmZsb3cgZmllbGQKLQlmcm9tIGJvb2xlYW4gdG8gZW11bSBjb21wbGFpbl9vdmVyZmxvdy4gIFJlbW92ZWQgb2Jzb2xldGUgYWJzb2x1dGUKLQlmaWVsZC4KLQkoSE9XVE8pOiBSZW1vdmVkIGFic29sdXRlIGFyZ3VtZW50LgotCShiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG8gb3ZlcmZsb3cgY2hlY2tpbmcgb24gYWxsIHR5cGVzIG9mCi0JZmllbGRzLgotCSogYmZkLWluMi5oOiBVcGRhdGVkIGFjY29yZGluZ2x5LgotCSogYWxsIHRhcmdldHM6IFVwZGF0ZWQgaW5pdGlhbGl6YXRpb24gb2YgcmVsb2MgaG93dG8gdGFibGVzLgotCi1XZWQgSnVsIDIxIDIwOjM0OjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogb3BuY2xzLmMgKGJmZF9jcmVhdGUpOiBEb24ndCB1c2UgQysrIGtleXdvcmQgInRlbXBsYXRlIiBhcyBhIEMKLQl2YXJpYWJsZSBuYW1lLgotCi1UdWUgSnVsIDIwIDE1OjAyOjIzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW02OGsuYyAobTY4a19ob3d0bzJydHlwZSk6ICBNYWtlIGFyZyBDT05TVCB0byBtYXRjaCBjYWxsZXJzLgotCi0JKiBlbGZjb2RlLmg6ICBGaXggc2V2ZXJhbCBpbGxlZ2FsIHBvaW50ZXIgY29tYmluYXRpb24gd2FybmluZ3MgZm9yCi0JdXNhZ2VzIG9mIGJmZF9hbGxvYyBhbmQgYWxsb2NhLgotCi0JKiBsaWJubG0uaCAobmxtX29ial90ZGF0YSk6ICBSZW5hbWUgaGlkZGVuIHN0cnVjdCBtZW1iZXJzIHRvIGF2b2lkCi0JYXBwYXJlbnQgU3VuIEMgcHJlcHJvY2Vzc29yIHJlY3Vyc2lvbi4gIEZpeCBhY2Nlc3MgbWFjcm9zLgotCSogbmxtY29kZS5oOiAgUmVtb3ZlIHNwdXJpb3VzICcmJyBiZWZvcmUgc2V2ZXJhbCBhcnJheSByZWZlcmVuY2VzLgotCi1UdWUgSnVsIDIwIDE0OjM2OjI3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBSZW5hbWUgZm9yIERPUyB1bmlxdWVuZXNzOiBjb2ZmLW02OGstdW4uYyAtPiBjb2ZmLXU2OGsuYwotCWNvbmZpZy9tNjhrLWNvZmZ1bi5tdCAtPiB1NjhrLWNvZmYubXQuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVR1ZSBKdWwgMjAgMTY6MjE6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBEb24ndCB1c2UgIiYiIGJlZm9yZQotCWZ1bmN0aW9uIG5hbWU7IGl0J3MgdmFsaWQgd2l0aG91dCwgYW5kIHNvbWUgY29tcGlsZXJzIGdpdmUKLQl3YXJuaW5ncyB3aXRoIGl0IHRoZXJlLgotCi1UdWUgSnVsIDIwIDA4OjIxOjE1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogIEFwcGx5IHNvbWUgb2YgdGhlIGNoYW5nZXMgdGhhdCB3ZXJlIG1hZGUgdG8gYmZkLWluMi5oLgotCSogYmZkLmMgKHVuaW9uIHRkYXRhKTogIEFkZCBubG1fb2JqX2RhdGE7Ci0JKiB0YXJnZXRzLmMgKGVudW0gdGFyZ2V0X2ZsYXZvdXIpOiAgQWRkIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIuCi0KLU1vbiBKdWwgMTkgMjA6NDY6MTggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldHdhcmUsIGlbMzRdODYtKi1uZXR3YXJlKTogIE5ldyBjb25maWdzLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogIEFkZCBubG0ubywgbmxtMzIubywgbmxtMzItZ2VuLm8uCi0JKiBNYWtlZmlsZS5pbiAoQkZENjRfQkFDS0VORFMpOiAgQWRkIG5sbTY0Lm8sIG5sbTY0LWdlbi5vLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6ICBBZGQgbmxtezMyLDY0fS5jLCBubG17MzIsNjR9LWdlbi5jLgotCSogTWFrZWZpbGUuaW4gKG5sbS5vLCBubG17MzIsNjR9Lm8sIG5sbXszMiw2NH0tZ2VuLm86ICBOZXcgdGFyZ2V0cy4KLQkqIGJmZC1pbjIuaCAoSU5MSU5FKTogIERlZmluZXMgbW92ZWQgaGVyZS4KLQkqIHthb3V0eC5oLCBlbGYuYywgZWxmY29kZS5ofTogIE1vdmUgSU5MSU5FIGRlZmluZXMgdG8gYmZkLWluMi5oLgotCSogbGliZWxmLmggKENBVDQpOiAgTW92ZSBkZWZpbmUgdG8gYmZkLWluMi5oLgotCSogYmZkLWluMi5oIChDQVQ0KTogIE1lcmdlIENBVDQgbWFjcm8gd2l0aCBvdGhlciBDQVQgbWFjcm9zLgotCSogYmZkLWluMi5oICh1bmlvbiB0ZGF0YSk6ICBBZGQgbmxtX29ial9kYXRhLgotCSogYmZkLWluMi5oIChlbnVtIHRhcmdldF9mbGF2b3VyKTogIEFkZCBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLgotCSogdGFyZ2V0cy5jIChiZmRfbmxtezMyLDY0fV97YmlnLGxpdHRsZX1fdmVjKTogIEFkZCBwcm90b3R5cGVzLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogIEFkZCBiZmRfbmxtezMyLDY0fV97YmlnLGxpdHRsZX1fdmVjLgotCSogKGxpYm5sbS5oLCBubG0uYywgbmxtY29kZS5oLCBubG17MzIsNjR9LWdlbi5jLAotCW5sbXszMiw2NH0tdGFyZ2V0LmgsIG5sbXszMiw2NH0uYywgY29uZmlnL2kzODYtbmxtLm10KTogIE5ldyBmaWxlcwotCWZvciBOTE0gc3VwcG9ydC4KLQotTW9uIEp1bCAxOSAxNTowOTowMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS57aG9zdHMsaW59OiBhZGQgaVszNF04Ni0qLWx5bnhvcyogc3VwcG9ydAotCi1Nb24gSnVsIDE5IDE0OjUzOjMwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogZWxmLmMsIGVsZmNvZGUuaCwgbGliZWxmLmg6IFNlcmlvdXMgcmVvcmdhbml6YXRpb24uCi0JRGVsZXRlZCBgdGh1bmsnIHN0cnVjdHVyZSwgbWVyZ2VkIGludG8gdGRhdGEsIGR1cGxpY2F0ZSBkYXRhCi0JZWxpbWluYXRlZC4KLQlSZWFycmFuZ2VkIGZ1bmN0aW9ucywgZ3JvdXBpbmcgYnkgZnVuY3Rpb25hbGl0eS4KLQlCcm9rZSB1cCBtYW55IGZ1bmN0aW9ucyBpbiBlbGZjb2RlLmgsIHJlLW9yZGVyZWQgbWFueSBwYXJ0cyBvZgotCWZpbGUgd3JpdGluZyB0byBoYW5kbGUgdW5wcmVkaWN0YWJsZSBzdGF0ZSBvZiBzZWN0aW9uIHJlbG9jYXRpb24KLQl0YWJsZSBhcyBwcm92aWRlZCBieSB2YXJpb3VzIGFwcGxpY2F0aW9ucy4KLQlTdGlsbCBuZWVkcyBjbGVhbnVwOiBNZXJnZSBmdW5jdGlvbnMgYmFjayB0b2dldGhlciwgc3BsaXQgb3V0Ci0JZGF0YSBzdHJ1Y3R1cmUgd2l0aCBvbmx5IGRhdGEgdGhhdCBpcyB1c2VkIG9ubHkgd2hlbiB3cml0aW5nIG91dAotCW9iamVjdCBmaWxlLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9nZW5lcmljX3JlbG9jKTogTmV3IGZ1bmN0aW9uLCB0YWtlbiBmcm9tCi0JY29mZi1taXBzLmMuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBVc2UgaXQsIHRvIHdvcmsgYXJvdW5kCi0JYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBsb3NzYWdlLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBJbmNsdWRlIGNvZmYtbWlwcy5vIGFuZCBjb2ZmLW1zeW0ubywgc28KLQl0aGF0IGdkYiB3aWxsIGxpbmsuCi0JKG9maWxlcyk6IERvbid0IHVzZSBzb3J0IG9yIHVuaXE7IGRvIGl0IHdpdGggc2ggY29uc3RydWN0cy4KLQotU3VuIEp1bCAxOCAxOTo0MjoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IFJlY29nbml6ZSBJMzg2UFRYTUFHSUMuCi0JKiBhb3V0ZjEuaCwgbGliYW91dC5oOiBBZGQgTV8zODZfRFlOSVguCi0JKiB0cmFkLWNvcmUuYyAoVFJBRF9DT1JFX1VTRVJfT0ZGU0VULCBUUkFEX0NPUkVfU1RBQ0tfRklMRVBPUyk6Ci0JTmV3IG1hY3JvczsgdXNlIGl0IGlmIGRlZmluZWQuCi0JKiBjb25maWcvc3ltbWV0cnkubWgsIGhvc3RzL3N5bW1ldHJ5Lmg6IE5ldyBmaWxlcy4KLQotRnJpIEp1bCAxNiAxNDo1NjozMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIFJlbmFtZSBlbGZ7MzIsNjR9LWdlbmVyaWMuYyB0byAqLWdlbi5jIGZvciAxNCBjaGFyIGZpbGVuYW1lcy4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCi0JKENGSUxFUyk6IEFkZCBlbGY2NC1nZW4uYy4KLQotRnJpIEp1bCAxNiAwOTo1MzoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jOiBVc2UgTUlQU19BT1VUX3tPWn1NQUdJQyByYXRoZXIgdGhhbiB7T1p9TUFHSUMuCi0KLVRodSBKdWwgMTUgMTY6MDI6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW04OGsuYyAoaG93dG9fdGFibGUpOiBDb3JyZWN0ZWQgYml0c2l6ZSBmb3IgUl9QQ1IyNkwgZnJvbQotCTE2IHRvIDI2LgotCi1XZWQgSnVsIDE0IDE1OjI5OjU2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBocHBhLmMgW0hPU1RfSFBQQUJTRF06IFVzZSBocHV4LXN0eWxlIGNvcmUgZmlsZXMuCi0JKiBsaWJocHBhLmggW0hPU1RfSFBQQUJTRF06IEluY2x1ZGUgaHB1eCB2ZXJzaW9uIG9mIGNvcmUuaAotCi1XZWQgSnVsIDE0IDA5OjMwOjQ4IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGg4MzAwaC0qLSouCi0KLVR1ZSBKdWwgMTMgMTI6MDM6MDAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODUwMC5jIChyZWxvY19wcm9jZXNzaW5nLCBydHlwZTJob3d0byk6IE5ldyByZWxvY2F0aW9uCi0JdHlwZSBSX0g4NTAwX0hJR0hfMTYuCi0JKiBjb2ZmLXNoLmMgKHJfaW1tMzIpOiBHZXQgdGhlIHdpZHRoIG9mIHRoZSByZWxvYyByaWdodC4KLQotVHVlIEp1bCAxMyAxNjo0ODo1NiAxOTkzICBGcmVkZXJpYyBQaWVycmVzdGVndXkgKEYuUGllcnJlc3RlZ3V5QGZyY2wuYnVsbC5mcikKLQotCSogY29uZmlndXJlLmluOiBBZGQgbmV3IHRhcmdldCBtNjhrLWNvZmZ1biB0byB0aGUgZHB4LzIuCi0JKiBjb25maWcvbTY4ay1jb2ZmdW4ubXQ6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gY29uZmlnL2RweDIubXQuCi0KLU1vbiBKdWwgMTIgMTA6NDI6NDkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IE1vdmUgU1BBUkNfQkFTRTEzIHJlbG9jIGludG8KLQlzcGFyYy1hb3V0LXNwZWNpZmljIGxpc3QuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBmaWVsZCBgdGh1bmsnLgotCi0JKiBjb25maWcvc3BhcmMtZWxmLm10IChUQVJHRVRfQkFDS0VORFMpOiBOZXcgbWFrZSB2YXJpYWJsZS4KLQotVGh1IEp1bCAgMSAxNDo1Mjo0NyAxOTkzICBGcmVkZXJpYyBQaWVycmVzdGVndXkgKEYuUGllcnJlc3RlZ3V5QGZyY2wuYnVsbC5mcikKLQkJCSAgYW5kIEppbSBLaW5nZG9uIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaDogVXNlIG1lbXNldCBub3QgYnplcm8uCi0JKiB0cmFkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSA8c3lzL2ZpbGUuaD4uCi0JKiBpMzg2bGludXguaDogSW5jbHVkZSA8c3lzL2ZpbGUuaD4uCi0JKiBjb2ZmLW02OGstdW4uYzogbmV3IGZpbGUgdG8gaGFuZGxlIG5hbWVzIHdpdGggdW5kZXJzY29yZXMgb24KLQlzdnIzIG1hY2hpbmVzLgotCSogY29mZi1tNjhrLmMgKG02OGtfcnR5cGUyaG93dG8pOiBhZGRlZCAjaWZkZWYgT05MWV9ERUNMQVJFX1JFTE9DUwotCXRvIG5vdCBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uIGluIHRoZSBleGVjdXRhYmxlLgotCShUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSwgTkFNRVNfSEFWRV9VTkRFUlNDT1JFKTogbmV3IG1hY3JvcyBuZWVkZWQKLQlieSBjb2ZmLW02OGstdW4uYy4KLQkqIGNvZmZjb2RlLmggKE1DNjhLQkNTTUFHSUMpOiBjYXNlIGFkZGVkLgotCSogdGFyZ2V0cy5jOiBBZGQgbTY4a2NvZmZ1bl92ZWMuCi0JKiBjb25maWd1cmUuaG9zdDogYWRkZWQgc3VwcG9ydCBmb3IgQnVsbCBkcHgvMi4KLQkqIGNvbmZpZy9kcHgyLm1oLCBob3N0cy9kcHgyLmg6IG5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCB0YXJnZXQgY29mZi1tNjhrLXVuLgotCi1GcmkgSnVsICA5IDAwOjQzOjA2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaDogQWRkIGRlZmluaXRpb24gb2YgTUFDSFRZUEVfT0suCi0KLVRodSBKdWwgIDggMTQ6Mzc6NDQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3Qgc3VidHJhY3QgdGhlIGFkZGVuZAotCWFnYWluIGZvciBjb2ZmLgotCi0JKiBzeW1zLmMsIGJmZC1pbjIuaDogRG9jIGZpeC4KLQotCSogY29mZmNvZGUuaCAoQ0FMQ19BRERFTkQpOiBDaGVjayBmb3IgY29tbW9uIHNlY3Rpb24gdXNpbmcgdGhlCi0Jc2VjdGlvbiBmbGFnIGFzIHdlbGwgYXMgdGhlIHN5bWJvbCBmbGFnLgotCi1UaHUgSnVsICA4IDEzOjQzOjUyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2YnNkLmg6IENvbmRpdGlvbmFsaXplIEhPU1RfU1RBQ0tfRU5EX0FERFIgb24gX19ic2RpX18uCi0JaTM4NmJzZC5jOiBSZW1vdmUgZGVmaW5lcyBvZiBOX1RYVCo7IHRoZSB2ZXJzaW9ucyBpbiBhb3V0NjQuaCBzaG91bGQKLQliZSBzdWZmaWNpZW50LiAgRGVmaW5lIFRFWFRfU1RBUlRfQUREUi4KLQotV2VkIEp1bCAgNyAxMDo1NjoyMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBSZW1vdmVkIHN0YXRlcAotCWFyZ3VtZW50LiAgSnVzdCBsZXQgYW4gaW5kaXJlY3Qgc3ltYm9sIHBvaW50IHRvIHRoZSBuZXh0IHN5bWJvbAotCXdpdGhvdXQgZm9yY2luZyB0aGUgbmV4dCBzeW1ib2wgdG8gYmUgdW5kZWZpbmVkLiAgQ2hhbmdlZCBhbGwKLQljYWxsZXJzLgotCSogaHAzMDBocHV4LmMgKHNsdXJwX3N5bWJvbF90YWJsZSk6IENoYW5nZWQgY2FsbCB0bwotCXRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MuCi0JKiB0YXJnZXRzLmM6IEFkZGVkIGhwMzAwaHB1eF92ZWMuCi0JKiBNYWtlZmlsZS5pbiAoaHAzMDBocHV4Lm8pOiBBZGRlZCBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBKdWwgIDYgMTM6MjQ6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBQdXQgc2ltcGxlIHBvd2VyLW9mLXR3bwotCXJlbG9jcyB0b2dldGhlciwgYW5kIGFkZCA2NC1iaXQgdmVyc2lvbnMuCi0JKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFyZ3VtZW50IHRvIGFsbG9jYQotCWlzIHNpemVfdC4KLQotCSogbGliYmZkLmMgKGJmZF94bWFsbG9jX2J5X3NpemVfdCk6IE5ldyBmdW5jdGlvbi4KLQkqIG9wbmNscy5jIChiZmRfY2FjaGVfaW5pdCwgYmZkX29wZW5fZmlsZSk6IEFkZCBwcm90b3R5cGVzIHRvCi0JZGVjbGFyYXRpb25zLgotCShvYnN0YWNrX2NodW5rX2FsbG9jKTogVXNlIGJmZF94bWFsbG9jX2J5X3NpemVfdC4KLQkobmV3X2JmZCk6IFByb3RvdHlwZS1zdHlsZSBkZWZpbml0aW9uLCB1c2luZyBERUZVTi4KLQkoYmZkX2FsbG9jX2dyb3csIGJmZF9hbGxvYywgYmZkX3phbGxvYywgYmZkX3JlYWxsb2MpOiBTaXplCi0JYXJndW1lbnQgaXMgdHlwZSBzaXplX3QsIG5vdCBiZmRfc2l6ZV90eXBlLgotCSogaWVlZS5jIChvYnN0YWNrX2NodW5rX2FsbG9jKTogVXNlIGJmZF94bWFsbG9jX2J5X3NpemVfdC4KLQkqIGJmZC5jIChiZmRfZGVmYXVsdF9lcnJvcl90cmFwLCBiZmRfZXJyb3JfdHJhcCwKLQliZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsdHJhcCk6IFByb3RvdHlwZXMuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2FsbG9jLCBiZmRfemFsbG9jLCBiZmRfcmVhbGxvYywKLQliZmRfYWxsb2NfZ3Jvdyk6IEFkanVzdGVkIHByb3RvdHlwZXMgZm9yIGFyZyB0eXBlIGNoYW5nZS4KLQkqIGFyY2hpdmUuYyAoZ2V0X2VsdF9hdF9maWxlcG9zLCBkb19zbHVycF9ic2RfYXJtYXAsIG5vcm1hbGl6ZSwKLQlkb19zbHVycF9jb2ZmX2FybWFwLCBiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOgotCVByb3RvdHlwZXMuCi0JKiBlbGZjb2RlLmggKGVsZl9zdHJpbmdfZnJvbV9lbGZfc3RydGFiKTogUHJvdG90eXBlcy4KLQkqIGxpYmVsZi5oIChlbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24sIGVsZl9nZXRfc3RyX3NlY3Rpb24pOgotCVByb3RvdHlwZXMuCi0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBSZW5hbWVkIGZyb20gQkZEX01BQ0hJTkVTLgotCShvZmlsZXMpOiBOZXcgdGFyZ2V0LiAgQnVpbGQgYSBsaXN0IG9mIHVuaXF1ZSBmaWxlIG5hbWVzLCBpbiBjYXNlCi0JYW55IGdvdCBkdXBsaWNhdGVkLgotCShUQVJHRVRMSUIpOiBVc2UgbGlzdCBvZiBmaWxlcyBmcm9tIG9maWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEJGRF9NQUNISU5FUyBhbmQgQkZEX0JBQ0tFTkRTIGRlcGVuZGluZyBvbgotCW1pbmltYWwtYmZkIGZsYWcgYW5kIHRhcmdldCBtYWtlZmlsZSBmcmFnIGNvbnRlbnRzLgotCi0JKiBlbGZjb2RlLmggKGVsZl9yZWFkKTogRGVsZXRlIHN0YXRpYyBkZWNsYXJhdGlvbiwgc2luY2UgZnVuY3Rpb24KLQloYXMgbW92ZWQuCi0JKGVsZl9tYXBfc3ltYm9scyk6IFdyaXRlIG91dCBzZWN0aW9uIHN5bWJvbHMgZm9yIGFsbCBzZWN0aW9ucywgZm9yCi0Jbm93LgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IEFsbG93IG1hdGNoIGlmIGJvdGggc3ltYm9scyBhcmUKLQlzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHNlY3Rpb24uCi0JKGVsZl9maW5kX25lYXJlc3RfbGluZSk6IERvbid0IHByaW50IG1lc3NhZ2UsIGp1c3QgcmV0dXJuIGZhbHNlLgotCi0JKiBsaWJlbGYuaCAoYmZkX2VsZl9sb2NhdGVfc2gpOiBEZWNsYXJhdGlvbiBkZWxldGVkLgotCi1Nb24gSnVsICA1IDE2OjQ4OjExIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNwdS1oODMwMC5jIChoODMwMF9zY2FuKTogRml4IHBhcnNpbmcgb2YgYXJjaGl0ZWN0dXJlIHN0cmluZy4KLQotRnJpIEp1bCAgMiAxODoyNzowMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlIGJmZC5oIGFuZCBzdG1wLWJmZC5oLgotCShyZWFsY2xlYW4pOiBSZW1vdmUgZ2VuZXJhdGVkIGhlYWRlcnMuCi0KLUZyaSBKdWwgIDIgMTQ6NTE6NTEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50KTogIERlbnkgaWYgZmlsZSBpcyBub3Qgb3BlbmVkIHdpdGgKLQl0aGUgcHJvcGVyIG1vZGUsIHNldCBvdXRwdXRfaGFzX2JlZ3VuIGlmIGZpbGUgaXMgb3BlbmVuZWQgZm9yIHVwZGF0ZS4KLQkqIGFvdXR4LmggKGFvdXRfKl9zZXRfc2VjdGlvbl9jb250ZW50KTogIFJlbW92ZSBjaGVja3MgdGhhdCBhcmUgbm93Ci0JZG9uZSBpbiBiZmRfc2V0X3NlY3Rpb25fY29udGVudC4KLQotRnJpIEp1bCAgMiAwOToyNToyMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6IFJlbW92ZWQgZGVjbGFyYXRpb25zIG9mIHByaW50ZiwgZnByaW50ZiwKLQlmY250bCwgZnJlYWQgYW5kIGZ3cml0ZS4gIFRoZXkgYXJlIGFsbCBlcnJvciBwcm9uZSBmb3Igb25lIHJlYXNvbgotCW9yIGFub3RoZXIuICBDaGFuZ2VkIGRlY2xhcmF0aW9uIG9mIG1lbWNociBmcm9tIGNoYXIgKiB0byBQVFIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLXJpc2NvcyopOiBOZXcgdGFyZ2V0OyB1c2UgcmlzY29zLgotCSogY29uZmlndXJlLmhvc3QgKG1pcHMtKi1yaXNjb3MqKTogTmV3IGhvc3Q7IHVzZSByaXNjb3MuCi0JKiBjb25maWcvcmlzY29zLm1oIChIREVGSU5FUyk6IEFkZCAtRyA0LgotCi0JKiBsaWJhb3V0LmggKEdFVF9TV09SRCk6IFVzZSB0aGUgYmZkX2hfZ2V0X3NpZ25lZCBlbnRyeSBwb2ludHMKLQlyYXRoZXIgdGhhbiBjYXN0aW5nIHRoZSByZXN1bHQgb2YgYmZkX2hfZ2V0LgotCi1GcmkgSnVsICAyIDEwOjEzOjQ4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGhvc3RzL2RlbHRhNjguaCwgY29uZmlnL2RlbHRhNjgubWg6IEFkZCBzdHVmZiBmb3IKLQlNb3Rvcm9sYSBEZWx0YSA2OC4KLQotV2VkIEp1biAzMCAwNjowMjo0MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjY0X3tiaWcsbGl0dGxlfV9nZW5lcmljX3ZlYyk6IERlY2xhcmUsIGFuZAotCWluY2x1ZGUgaW4gc2VhcmNoIGxpc3QgaWYgQkZENjQgaXMgZGVmaW5lZC4KLQotCSogbGliZWxmLmggKENBVDQpOiBBZGRlZCBhIHZlcnNpb24gZm9yIFNhYmVyLUMsIEFOU0kgbW9kZS4KLQkoYmZkX2VsZjY0XyopOiBEZWNsYXJhdGlvbnMgZm9yIDY0LWJpdCB2ZXJzaW9ucyBvZiBtYW55IHJvdXRpbmVzLgotCi1UdWUgSnVuIDI5IDIyOjUwOjU5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmNjQtdGFyZ2V0LmgsIGVsZjY0LWdlbmVyaWMuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKEJGRDY0X0JBQ0tFTkRTKTogSW5jbHVkZSBlbGY2NC1nZW5lcmljLm8uCi0JKGVsZjY0LWdlbmVyaWMubyk6IExpc3QgZGVwZW5kZW5jaWVzLgotCi0JKiBNYWtlZmlsZS5pbjogTGlzdCB0YXJnZXQgYGFsbCcgZXhwbGljaXRseSBiZWZvcmUgaG9zdC90YXJnZXQKLQltYWtlZmlsZSBmcmFnbWVudHMgYXJlIGluY2x1ZGVkLCBpbiBjYXNlIHRoZXkgZGVmaW5lIGFueSBuZXcKLQl0YXJnZXRzLgotCi0JKiBlbGZjb2RlLmggKEVMRl9SX0lORk8sIEVMRl9SX1NZTSk6IERlZmluZSBhcyAzMi0gb3IgNjQtYml0Ci0JdmVyc2lvbnMgYXMgYXBwcm9wcmlhdGUuICBVc2VzIHVwZGF0ZWQuCi0JKGVsZl9kZWJ1Z19zZWN0aW9uKTogRGVjbGFyZSBiZWZvcmUgdXNlLgotCShlbGZfZGVidWdfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyLCBiZmRfc2hkcl9mcm9tX3NlY3Rpb24sIGVsZl9mYWtlX3NlY3Rpb25zKToKLQlBbGlnbm1lbnQgdmFsdWUgaW4gc2VjdGlvbiBoZWFkZXIgaXMgbl9ieXRlcywgbm90IGxvZzIuCi0JKG5ld19zZWN0aW9uX2hvb2spOiBEbyBub3RoaW5nIGZvciBub3cuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSBFbGZfRXh0ZXJuYWxfUmVsW2FdLCBub3QgMzItYml0Ci0JdmVyc2lvbiBleHBsaWNpdGx5LgotCShlbGZfY29yZV9maWxlX3ApOiBTaW1wbGlmeSBjaGVjayBmb3IgY29ycmVjdCBjbGFzcyAod29yZCBzaXplKS4KLQkoZWxmX21ha2Vfc2VjdGlvbnMsIGVsZl9mYWtlX3NlY3Rpb25zLCBlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKToKLQlJbml0aWFsaXplIGFsbCBmaWVsZHMgd2hlbiBjcmVhdGluZyBkYXRhIHN0cnVjdHVyZXMuCi0JKGVsZl9sb2NhdGVfc2gpOiBSZW5hbWVkIGZyb20gYmZkX2VsZlhYX2xvY2F0ZV9zaCwgbWFkZSBzdGF0aWMuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBTZXQgY29ycmVjdCBjbGFzcyBpbiBvdXRwdXQKLQlmaWxlLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2VjdGlvbiBzeW1ib2xzIGhhdmUgZW1wdHkgbmFtZXMgaW4KLQlvdXRwdXQgZmlsZS4KLQotCSogbGliYmZkLmMgKGJmZF94bWFsbG9jLCB6YWxsb2MpOiBCZSBzdXJlIHRvIGNhc3QgbWFsbG9jLCBtZW1zZXQKLQlhcmdzIHRvIHNpemVfdCBiZWZvcmUgY2FsbC4KLQkoYmZkX2FkZF90b19zdHJpbmdfdGFibGUpOiBDYXN0IHphbGxvYyBhcmcgdG8gYmZkX3NpemVfdHlwZS4KLQotVHVlIEp1biAyOSAxMDo0OTo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9maW5kX25lYXJlc3RfbGluZSk6IElmIHByb2NlZHVyZSBoYXMgbm8gbGluZQotCW51bWJlciBpbmZvcm1hdGlvbiwgcmV0dXJuIDAgZm9yIGxpbmUgbnVtYmVyLgotCi1Nb24gSnVuIDI4IDEwOjQ1OjAyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBJZiAqb2xkcmF3cHRyIGlzIG5vbi1OVUxMLCBjb3B5IGl0Ci0JaW50byAqcmF3cHRyLgotCi1TdW4gSnVuIDI3IDA5OjA1OjE5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9yaXNjb3MuaDogRGVmaW5lIE5CUEcgYW5kIFVQQUdFUy4KLQotU3VuIEp1biAyNyAxNjoyODoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgdXNlIG9ial9yYXdfc3ltcyBhcwotCWx2YWx1ZTsgaXQgY29udGFpbnMgYSBjYXN0LgotCi1GcmkgSnVuIDI1IDE3OjA5OjU1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoaGFzaCwgY29tcGFyZSwgc3RydWN0IHN0cmluZ3RhYl9lbnRyeSwgYWRkX3RvX3N0cmluZ3RhYik6Ci0JVXNlIHVuc2lnbmVkIGhhc2ggdmFsdWVzIGZvciBiZXR0ZXIgaGFzaGluZy4KLQkoaGFzaCk6IEhhc2ggaW4gdGhlIHN0cmluZyBsZW5ndGggZm9yIGxvbmcgc3RyaW5ncy4KLQotVGh1IEp1biAyNCAxNTo0Nzo1MSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGNvbXBhcmUpOiBSZXBsYWNlIDMgaWYncyB3aXRoIGEgc3VidHJhY3Rpb24uCi0JKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzLCBhZGRfdG9fc3RyaW5ndGFiKTogUmVvcmRlciB0ZXN0cwotCWluIGRlY3JlYXNpbmcgb3JkZXIgb2Ygc3VjY2VzcywgYXMgYW4gb3B0aW1pemF0aW9uLgotCShoYXNoKTogVGFrZSBhIGxlbmd0aCBhcmc7IGlnbm9yZSBjaGFycyBhZnRlciAjMjUsIGZvciBzcGVlZC4KLQkoYWRkX3RvX3N0cmluZ3RhYik6IFBhc3MgbGVuZ3RoIHRvIGhhc2guCi0KLVRodSBKdW4gMjQgMTc6MjU6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXNwYXJjLmMgKHNwYXJjX3JlbG9jX21hcCk6IEFkZCBTUEFSQ19XRElTUDIyIHJlbG9jLgotCi0JKiBlbGZjb2RlLmggKGVsZl9uZXdfc2VjdGlvbl9ob29rKTogRG8gbm90aGluZyBmb3Igbm93LgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogT3V0cHV0IGNvbW1vbiBzeW1ib2xzIHRoZSB3YXkgRUxGCi0Jd2FudHMgdGhlbS4KLQotV2VkIEp1biAyMyAxNjoyMDowNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhIGFuZCBhc3NvY2lhdGVkIG1hY3Jvcyk6IE1vdmVkCi0JaGVyZSBmcm9tIGVsZmNvZGUuaC4gIEEgY291cGxlIG9mIHNpemUtc3BlY2lmaWMgc3RydWN0dXJlIHBvaW50ZXJzCi0Jd2VyZSBjaGFuZ2VkIHRvIFBUUjsgdXNlcyBmaXhlZCBhcHByb3ByaWF0ZWx5LgotCShlbGYzMl9zeW1ib2xfdHlwZSwgZWxmNjRfc3ltYm9sX3R5cGUpOiBTZXBhcmF0ZWQgZGVmaW5pdGlvbnMuCi0JKGJmZF9lbGZfbWtvYmplY3QpOiBSZW5hbWVkIGZyb20gYmZkX2VsZjMyX21rb2JqZWN0LgotCShiZmRfZWxmMzJfbWtvYmplY3QsIGJmZF9lbGY2NF9ta29iamVjdCwgZWxmX21rb2JqZWN0KTogTmV3Ci0JdGVtcG9yYXJ5IG1hY3JvcyB0byBlYXNlIG5hbWUgY2hhbmdlLgotCSogZWxmLmMgKGVsZl9yZWFkLCBlbGZfbWtvYmplY3QsIGVsZl9nZXRfc3RyX3NlY3Rpb24sCi0JZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uLCBiZmRfZWxmX2ZpbmRfc2VjdGlvbik6IE1vdmVkIGhlcmUKLQlmcm9tIGVsZmNvZGUuaC4KLQkqIGRvYy9NYWtlZmlsZS5pbiAobGliYmZkLmgpOiBQcm9jZXNzIGVsZi5jIHRvby4KLQkqIE1ha2VmaWxlLmluIChlbGYubyk6IE5vdGUgbmV3IGRlcGVuZGVuY2llcy4KLQotCSogZWxmY29kZS5oOiBMb3RzIG9mIHN0dWZmIG1vdmVkIGVsc2V3aGVyZS4gIERlbGV0ZWQgc29tZSB1bnVzZWQKLQljb2RlLCB0d2Vha2VkIHNvbWUgZGVidWcgaG9va3MuCi0JKGVsZl9zbHVycF9yZWxvY2FfdGFibGUpOiBUcmFuc2xhdGUgRUxGIHNlY3Rpb24gc3ltYm9scyBpbnRvIEJGRAotCXNlY3Rpb24gc3ltYm9scy4KLQotV2VkIEp1biAyMyAxMTozNDoyMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvcmlzY29zLmg6IE5ldyBmaWxlLgotCi1UdWUgSnVuIDIyIDE0OjM1OjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkciwgY2FzZSBTSFRfUFJPR0JJVFMpOiBFdmVuIGlmCi0Jc2VjdGlvbiBhbHJlYWR5IGV4aXN0cywgdXNlIGl0cyBwb2ludGVyIHRvIGZpbGwgaW4gcmF3ZGF0YSBzbG90LgotCi1UdWUgSnVuIDIyIDE2OjM2OjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiBSZXR1cm4gdmFsdWUgb2YgcHV0cyBhbmQgZnB1dHMgaXMgaW50IG5vdCB2b2lkLgotCi1UdWUgSnVuIDIyIDE0OjI1OjU4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogQ29tbWVudCB0aGUgZmllbGQgbmFtZXMuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRml4IG1heCBhbmQgbWluIHZhbHVlcy4KLQotTW9uIEp1biAyMSAxODoxOToxNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjMyLWhwcGEuYywgZWxmY29kZS5oOiBVc2UgbmV3Ci0Jc2l6ZS1pbmRlcGVuZGVudCBlbGYgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgotCSogZWxmY29kZS5oIChwdXRfd29yZCwgZ2V0X3dvcmQpOiBEZWZpbmUgYXMgYXBwcm9wcmlhdGUgZm9yCi0JYXJjaGl0ZWN0dXJlIHdvcmQgc2l6ZS4gIFN0cnVjdHVyZSBzd2FwcGluZyBmdW5jdGlvbnMgY2hhbmdlZCB0bwotCXVzZSB0aGVtIGFzIGFwcHJvcHJpYXRlLgotCi0JKiBjb25maWd1cmUuaW46IElmIGNvbXBpbGluZyA2NC1iaXQgYmFjayBlbmRzLCBkbyB0aGVtIGJlZm9yZQotCTMyLWJpdCBvbmVzLgotCi0JKiBsaWJlbGYuaDogVXNlIG5ldyBzaXplLWluZGVwZW5kZW50IHZlcnNpb25zIG9mIGVsZiBpbnRlcm5hbCBkYXRhCi0Jc3RydWN0dXJlcy4KLQkoc3ltYm9sX3R5cGUpOiBSZW9yZGVyZWQgdG8gcHV0IGFueSBmaWVsZHMgZGVwZW5kZW50IG9uIHRhcmdldAotCXNpemUgYXQgdGhlIGVuZC4KLQkoZWxmX2JhY2tlbmRfZGF0YSk6IFJlbmFtZWQgZnJvbSBlbGYjI19iYWNrZW5kX2RhdGEgYW5kIG1hZGUKLQlzaXplLWluZGVwZW5kZW50LgotCShlbGZfc2VjdF90aHVuayk6IE5vdyBzaXplLWluZGVwZW5kZW50LgotCi0JKiBsaWJiZmQuYyAoYmZkX2xvZzIpOiBOb3cgcmV0dXJucyB1bnNpZ25lZCBpbnQuCi0KLU1vbiBKdW4gMjEgMTI6MzA6NDcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIFJlbmFtZSBjb25maWcvbTg4ay1hb3V0Lm10IHRvIGNvbmZpZy9ub29wLm10LgotCWNvbmZpZ3VyZS5pbjogVXNlIGl0IGZvciBtaXBzLSotYnNkKi4KLQotU3VuIEp1biAyMCAyMDozMjoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogY3B1LW02OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEVsaW1pbmF0ZSAicGFydGlhbGx5IGJyYWNrZXRlZAotCWluaXRpYWxpemVyIiB3YXJuaW5nIGZyb20gZ2NjLgotCSogY3B1LWg4NTAwLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBMaWtld2lzZS4KLQkqIGNwdS1zaC5jIChhcmNoX2luZm9fc3RydWN0KTogTGlrZXdpc2UuCi0KLQkqIGNwdS1oODMwMC5jIChsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsIGhvd3RvKl9jYWxsYmFjaywKLQlob3d0b18qKTogVW51c2VkIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGNvbW1lbnRlZCBvdXQuCi0JKiBjcHUtejhrLmMgKGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgaG93dG8qX2NhbGxiYWNrLAotCWhvd3RvXyopOiBMaWtld2lzZS4KLQkqIGNwdS1oODUwMC5jIChjb21wYXRpYmxlKTogTGlrZXdpc2UuCi0JKiBjcHUtc2guYyAoY29tcGF0aWJsZSk6IExpa2V3aXNlLgotCi0JKiBocDMwMGhwdXguYyAoc3dhcF9zdGRfcmVsb2NfaW4pOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlcy4KLQlBbHdheXMgc2V0IGEgdmFsaWQgbGVuZ3RoIHZhbHVlLCBldmVuIGZvciBpbnZhbGlkIGlucHV0LgotCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfc3ltYm9scyk6IFVzZSBzcHJpbnRmX3ZtYS4KLQotCSogYmZkLWluLmggKHVpbnQ2NF90eXBlTE9XLCB1aW50NjRfdHlwZUhJR0gsIGludDY0X3R5cGUsCi0JdWludDY0X3R5cGUpOiBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbnMuCi0JKiBob3N0cy9zdGQtaG9zdC5oIChpbnQ2NCBzdHVmZik6IFJlbW92ZSB0aGVtIGZyb20gaGVyZS4KLQotCSogYmZkLWluLmggKHNwcmludGZfdm1hKTogRGVmaW5lIHBhcmFsbGVsIHRvIGZwcmludGZfdm1hLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogRGVsZXRlIHVudXNlZAotCXZhcmlhYmxlLiAgQWRkZWQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IEJlZm9yZSBjYXN0aW5nCi0JcG9pbnRlcnMgdG8gaW50ZWdlcnMsIG1ha2Ugc3VyZSB0aGUgaW50ZWdlciB0eXBlIGlzIHdpZGUgZW5vdWdoLgotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IERpdHRvLgotCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IFNpbmNlIGBjb3VudCcgaXMgdW5zaWduZWQsCi0JZG9uJ3QgYm90aGVyIGNvbXBhcmluZyBmb3IgbGVzcy10aGFuLXplcm8uCi0JKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCi0JKiBlbGZjb2RlLmggKGJmZF9hZGRfdG9fc3RydGFiKTogTm93IHN0YXRpYy4KLQkoc3ltX2lzX2dsb2JhbCk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX21hcF9zeW1ib2xzKTogQ2FsbCBpdC4gIE5vdyByZXR1cm5zIHZvaWQuICBSZW1vdmVkIHVudXNlZAotCWxvY2FsIHZhcmlhYmxlLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYXJrIHN0cmluZyB0YWJsZXMgb3RoZXIgdGhhbiBmb3Igc2VjdGlvbgotCWFuZCBzeW1ib2wgbmFtZXMgYXMgbm9ybWFsIHNlY3Rpb25zIGhhdmluZyBjb250ZW50cy4KLQkoZml4X3VwX3N0cnRhYnMpOiBOZXcgZnVuY3Rpb247IGZpeGVzIHVwIEVMRiBoZWFkZXIgZmllbGRzIGZvcgotCXN0YWIgc2VjdGlvbnMgd2l0aCBzdHJpbmcgdGFibGVzIGFzc29jaWF0ZWQuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBNYXAgZml4X3VwX3N0cnRhYnMgb3ZlciBhbGwgQkZECi0Jc2VjdGlvbnMuICBSZW9yZGVyZWQgY29uZGl0aW9uIHRlc3RzIGZvciBzeW1ib2wgZmxhZ3M7IGRlZmF1bHQgdG8KLQlsb2NhbC1vYmplY3QgdmFsdWUgaW5zdGVhZCBvZiBnbG9iYWwtb2JqZWN0LgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IEhpZCBjb25kaXRpb25hbGx5LXVzZWQgdmFyaWFibGUKLQlpbnNpZGUgY29uZGl0aW9uIHRlc3QuCi0JKGVsZl9wcmludF9zeW1ib2wpOiBVc2UgZnByaW50Zl92bWEuCi0JKGVsZl9pZHhfb2Zfc3ltLCBiZmRfc2hkcl9mcm9tX3NlY3Rpb24pOiBVbnVzZWQgZnVuY3Rpb25zCi0JY29tbWVudGVkIG91dC4KLQotCSogYmZkLWluLmggKGludDY0X3R5cGUsIHVpbnQ2NF90eXBlKTogRGVmaW5lIHRoZXNlIGlmIHdlIGZhbGwKLQliYWNrIHRvICJsb25nIGxvbmciIGZvciBIT1NUXzY0X0JJVC4KLQotCSogbGliZWxmLmggKGVsZk5BTUUsIEVsZk5BTUUpOiBOZXcgdmVyc2lvbnMgdG8gZ2V0IGRlc2lyZWQgcmVzdWx0cwotCXdpdGhvdXQgdXNpbmcgaW52YWxpZCBBTlNJIEMgcHJlcHJvY2Vzc2luZyB0b2tlbnMuCi0KLQkqIGVsZjMyLXRhcmdldC5oIChiZmRfZWxmMzJfbmV3X3NlY3Rpb25faG9vayk6IERlbGV0ZSBtYWNyby4KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfbmV3X3NlY3Rpb25faG9vayk6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKG5ld19zZWN0aW9uX2hvb2spOiBEZWZpbmUgaGVyZS4KLQotCSogaG9zdHMvc3BhcmMuaCwgaG9zdHMvc3RkLWhvc3QuaCwgaG9zdHMvaTM4NmJzZC5oOiBQcm90ZWN0Ci0JYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCi0JKiBob3N0cy9uZXdzLmg6IEluY2x1ZGUgaG9zdHMvc3RkLWhvc3QuaCwgbm90IHBsYWluIHN0ZC1ob3N0LmguCi0KLQkqIE1ha2VmaWxlLmluIChiZmQuaCk6IEdlbmVyYXRlIGludG8gY3VycmVudCBkaXJlY3RvcnkgYnkgZ3JhYmJpbmcKLQk2NC1iaXQgZGVmaW5pdGlvbiAoaWYgYW55KSBmcm9tIHN5c2RlcC5oLgotCSogYmZkLWluLmg6IFB1dCBpbiBtYXJrZXIgZm9yIHN5c2RlcC5oIGluY2x1c2lvbi4KLQotRnJpIEp1biAxOCAxOTo1NzoyMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBDaGVjayBmb3Igb3ZlcmZsb3cgb24KLQlwYy1yZWxhdGl2ZSByZWxvY2F0aW9ucyBpZiB0aGUgaG93dG8gYXNrZWQgZm9yIGl0LgotCi1GcmkgSnVuIDE4IDE2OjAwOjIwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3RtcC1iZmQuaCk6IElnbm9yZSBub256ZXJvIGV4aXQgc3RhdHVzIGZyb20gZ3JlcC4KLQotRnJpIEp1biAxOCAxNjo1NDoyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3Jpc2Nvcy5te2gsdH06IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS57aG9zdCxpbn06IFVzZSB0aGVtLgotCi1GcmkgSnVuIDE4IDEyOjU1OjEwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1taXBzLmM6IGNvbW1lbnQgY2hhbmdlLiAgVGhpcyBpcyBhIG1pcHMgZmlsZSwgbm90IDg4ay4KLQotTW9uIEp1biAxNCAxNDowMjo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogY2FjaGUuYyAoYmZkX2NhY2hlX2luaXQpOiBJbmNyZW1lbnQgb3Blbl9maWxlcyBhbmQgY2FsbCBjbG9zZV9vbmUKLQlpZiBuZWNlc3NhcnkuCi0JKGJmZF9vcGVuX2ZpbGUpOiBEb24ndCBpbmNyZW1lbnQgb3Blbl9maWxlcyBoZXJlLgotCi1GcmkgSnVuIDE4IDEwOjAwOjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVsdGE4OC5taDogRG9uJ3Qgc2V0IENDLgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGVsZjMyLXttaXBzLG04OGssZ2VuZXJpY30uCi0JZWxmMzIte21pcHMsbTg4ayxnZW5lcmljfS5jOiBOZXcgZmlsZXMuCi0JdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogSW5jbHVkZSBiZmRfZWxmMzJfe21pcHMsbTg4ayxnZW5lcmljfV92ZWMuCi0JZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBNYXRjaCBlbGYzMi1nZW5lcmljIGZvciBhbGwgbWFjaGluZXMgd2hpY2gKLQlkb24ndCBtYXRjaCBhIGRpZmZlcmVudCB0YXJnZXQuCi0KLUZyaSBKdW4gMTggMDM6MTI6MTIgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlFbGltaW5hdGUgImludDhfdHlwZSIsICJpbnQxNl90eXBlIiwgImludDMyX3R5cGUiLCBhbmQgdGhlaXIKLQl2YXJpYW50cyBmcm9tIHRoZSBCRkQgdW5pdmVyc2UuICBMZWF2ZSB0aGUgNjQtYml0IHR5cGVzIGZvciBub3csCi0Jc2luY2UgdGhleSBhcmUgaW4gZmx1eC4KLQotCSogYW91dHguaCwgaHAzMDBocHV4LmM6ICBFbGltaW5hdGUgbmVlZGxlc3MgKGludDMyX3R5cGUpIGNhc3RzLgotCSogbGliYW91dC5oIChHRVRfU1dPUkQpOiAgQ29udmVydCAoaW50MzJfdHlwZSkgdG8gKGludCkuCi0JKiBpZWVlLmM6ICBDb252ZXJ0IHVpbnQ4ZV90eXBlID0+IHVuc2lnbmVkIGNoYXIuCi0JKiBvYXN5cy5jOiAgRXh0ZW5zaXZlIGNoYW5nZXMgdG8gZWxpbWluYXRlIG9ic29sZXRlIHR5cGVzLgotCVRoZXNlIGRlcGVuZCBvbiBjaGFuZ2VzIGluIC4uL2luY2x1ZGUvb2FzeXMuaCBhcyB3ZWxsLgotCSogaG9zdHMvKi5oOiAgUmVtb3ZlIGRlY2xhcmF0aW9ucyBvZiBhbGwgdGhlc2UgdHlwZXMuCi0KLU1vbiBKdW4gMTQgMTQ6MDI6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2RlbHRhODguaDogI2lmIDAgb3V0IHNvbWUgZGVjbGFyYXRpb25zIHdoaWNoIGNvbmZsaWN0IHdpdGgKLQlzeXN0ZW0gaGVhZGVycy4KLQotTW9uIEp1biAxNCAxNzowODoxOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogcmVtb3ZlIHBhcmVudGRpciBjcnVmdAotCi1Nb24gSnVuIDE0IDE5OjA0OjA5IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYyAoaHBwYV9nZXRfc3ltYm9sX2luZm8pOiAgUmVtb3ZlIHJlZHVuZGFudCBjb3B5LgotCSogRXhwdXJnYXRlIHJhbmRvbSBERUZVTnMgdGhhdCBoYXZlIGNyZXB0IGluLgotCi1Nb24gSnVuIDE0IDEwOjIzOjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IENvbnN0cnVjdG9yIHNlY3Rpb25zIHNob3VsZAotCW9ubHkgYmUgYWxpZ25lZCB0byBhIDQgYnl0ZSBib3VuZGFyeS4KLQotU2F0IEp1biAxMiAxNjoxMzoxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaCAoc3RydWN0IGludDY0ZV9zdHJ1Y3QpOiBSZW1vdmUgbmVlZGxlc3MgdHlwZWRlZgotCWtleXdvcmQuCi0KLUZyaSBKdW4gMTEgMTQ6MjU6MzQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgZmxhZ3MgdG8gMSwgYnJlYWtpbmcKLQkxOTI3IGJ1dCBmaXhpbmcgc29tZSBvdGhlciBpbXBvcnRhbnQgdGhpbmdzLgotCi1UaHUgSnVuIDEwIDIwOjM2OjIyIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0LmggKGludDY0ZV90eXBlKTogRml4IGRlZmluaXRpb24uCi0KLVRodSBKdW4gMTAgMTE6NDg6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MpOiBVc2UgU1RZUF9NSVBTX0lOSVQgZm9yCi0Jc2VjdGlvbiBuYW1lZCBfSU5JVC4gIERvbid0IHNldCBTVFlQX1RFWFQgdW5sZXNzIFNFQ19DT0RFIGlzIHNldC4KLQkoZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiBUcmVhdCBhIFNUWVBfTUlQU19JTklUIHNlY3Rpb24gbGlrZQotCWEgU1RZUF9URVhUIHNlY3Rpb24uCi0KLVdlZCBKdW4gIDkgMTY6NDg6MTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCwgaGVhZGVycyk6IGRvbid0IHB1dCBjb21tZW50cyBhZnRlciBhIHRhYgotCWluIHRoZSBhY3Rpb25zIHNlY3Rpb24gb2YgYSBydWxlCi0KLVdlZCBKdW4gIDkgMTU6MDA6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfbWtvYmplY3RfaG9vayk6IE1hcmsgWk1BR0lDIGZpbGVzIGFzIERfUEFHRUQuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIG5vdCBEX1BBR0VELCBkb24ndCBhZGQgdGhlCi0Jc2VjdGlvbiBoZWFkZXJzIHRvIHRleHRfc2l6ZS4gIElmIG5vdCBEX1BBR0VELCBzZXQgdGhlIG1hZ2ljCi0JbnVtYmVyIHRvIE9NQUdJQyByYXRoZXIgdGhhbiBaTUFHSUMuICBJZiBjcmVhdGluZyBhIERfUEFHRUQKLQlleGVjdXRhYmxlLCB0aGUgZXhlY3V0YWJsZSBtdXN0IGZ1bGx5IG9jY3VweSBhbiBldmVuIG51bWJlciBvZgotCXBhZ2VzLgotCShlY29mZl9zZXRfc3ltYm9sX2luZm8sIG1ha2VfYmZkX2FzZWN0aW9uLCBlY29mZl9saXR0bGVfdmVjLAotCWVjb2ZmX2JpZ192ZWMpOiBDb25zaXN0ZW50bHkgc2V0IHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyIHRvIDQsCi0Jc2luY2UgRUNPRkYgc2VjdGlvbnMgc2hvdWxkIGJlIG11bHRpcGxlcyBvZiAxNiBieXRlcy4KLQkoZWNvZmZfbGl0dGxlX3ZlYywgZWNvZmZfYmlnX3ZlYyk6IEFkZGVkIERfUEFHRUQgdG8gb2JqZWN0X2ZsYWdzLgotCU1hZGUgYXJfcGFkX2NoYXIgYW5kIGFyX21heF9uYW1lbGVuIGFncmVlIGZvciBib3RoLgotCi1UdWUgSnVuICA4IDIwOjI4OjAyIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IHN1YnRyYWN0IHNlY3Rpb24gdm1hIGZyb20KLQlzeW1ib2wgdmFsdWUsIHNpbmNlIGJmZCBzeW1ib2xzIGFyZSBzZWN0aW9uIHJlbGF0aXZlLCBidXQgRUxGCi0Jc3ltYm9scyBhcmVuJ3QuCi0KLVR1ZSBKdW4gIDggMTI6MDg6MjcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY3B1LWk5NjAuYywgY3B1LWg4MzAwLmMgKGNvbXBhdGlibGUpOiBNYWtlIHN0YXRpYy4KLQotVHVlIEp1biAgOCAxNDoyNzo1NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL25ld3MuaCwgY29uZmlnL25ld3MubWg6IE5ldyBmaWxlcy4KLQotVHVlIEp1biAgOCAxMjowODoyNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4yLmgsIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2g4MzAwW2hdKTogbmV3IGRlZmluZXMuCi0JKiBjb2ZmLWg4MzAwLmM6IE1vcmUgYWRkcmVzc2luZyBtb2Rlcy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQ29wZSB3aXRoIEg4MzAwIG1hZ2ljCi0JbnVtYmVyLgotCSogY3B1LWg4MzAwLmM6IFJlbW92ZWQgZGlzYXNzZW1ibGUgc3R1ZmYuIChoODMwMF9zY2FuKTogUmVjb2duaXNlCi0JSDgvMzAwSCBuYW1lLiAoY29tcGF0aWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlYyk6IENvcGUgd2l0aCBtb3JlCi0JYWRkcmVzc2luZyBtb2Rlcy4KLQotVHVlIEp1biAgOCAxMDozMDoxMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0JZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogT25seSByb3VuZCB0byBwYWdlIGJvdW5kYXJpZXMgaWYKLQlEX1BBR0VEIGZsYWcgaXMgc2V0IGZvciB0aGUgb3V0cHV0IEJGRC4KLQotRnJpIEp1biAgNCAxNTo0Nzo1MiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChnZXRfaW5kZXgsIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRml4IHBvaW50ZXIKLQljYXN0cyB0byB3b3JrIG9uIG1hY2hpbmUgd2hlcmUgc2l6ZW9mKGxvbmcpICE9IHNpemVvZihpbnQpICE9Ci0Jc2l6ZW9mKGNoYXIgKikuCi0gICAgICAgICogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IERpdHRvLgotCSogY3B1LWg4MzAwLmMgY29mZi1oODMwMC5jOiBTdXBwb3J0IGZvciBIOC8zMDAtSC4KLQotRnJpIEp1biAgNCAxNToyNDoyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9zeW1ib2xzKTogRm9yIGVtcHR5IHN0cmluZyB0YWJsZSwgd3JpdGUKLQlvdXQgNCBpbiBjb3JyZWN0IGJ5dGUgb3JkZXIuICAoZnJvbSBtaW55YXJkQGJuci5jYSkKLQotCSogZWxmMzItaHBwYS5jOiBEb24ndCBpbmNsdWRlIGxpYmhwcGEuaCBmb3Igbm93OyBkZWZpbmUKLQlCWVRFU19JTl9XT1JEIGluc3RlYWQsIHVudGlsIFV0YWggc2VuZHMgYSBiZXR0ZXIgZml4LgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IFVzZSB4bWFsbG9jIGFuZCB4cmVhbGxvYyBpbnN0ZWFkCi0Jb2YgbWFsbG9jIGFuZCByZWFsbG9jLgotCi1GcmkgSnVuICA0IDA3OjQ5OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLSotZWNvZmZsKik6IE5ldyB0YXJnZXQ7IHVzZSBkZWNzdGF0aW9uLgotCShtaXBzLSotZWNvZmYqKTogQWRkZWQgdHJhaWxpbmcgJyonLgotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfZ2V0X2RlYnVnKTogR2V0IHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgUERSCi0JZm9yIHRoZSBGRFIsIG5vdCBmcm9tIHRoZSBmaXJzdCBQRFIgaW4gdGhlIGZpbGUuCi0KLVRodSBKdW4gIDMgMTY6NDE6MTAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jIChocHBhX2dldF9zeW1ib2xfaW5mbyk6ICBOZXcgZnVuYyBuZWVkZWQgZm9yIEpVTVBfVEFCTEUuCi0KLVRodSBKdW4gIDMgMTU6MzM6NTcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBocHBhLmMgKGhwcGFfZ2V0X3N5bWJvbF9pbmZvKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgSnVuICAzIDEzOjA3OjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBEb24ndCBjcmFzaCBpZiBubyBzeW1ib2xzIGhhdmUgYmVlbgotCWFsbG9jYXRlZCB5ZXQuCi0KLQlGcm9tIFBldGVyIEhvb2dlbmJvb20gKGhvb2dlbkBzY2hhZmVyLmNzLnV0YWguZWR1KToKLQkqIGxpYmhwcGEuaCAoTUFYQ09NTEVOKTogRGVmaW5lIHVuY29uZGl0aW9uYWxseS4KLQkoX1BBX1JJU0NfSUQpOiBPbmx5IGRlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCSogZWxmMzItaHBwYS5jOiBJbmNsdWRlIGxpYmhwcGEuaC4KLQotCUZyb20gUmFscGggQ2FtcGJlbGw6Ci0JKiBob3N0cy9taXBzYnNkLmggKEhPU1RfREFUQV9TVEFSVF9BRERSKTogRGVsZXRlIGRlZmluaXRpb24uCi0KLQkqIGVsZjMyLWhwcGEuaCAoc3ltZXh0X3Jvb3RQLCBzeW1leHRfbGFzdFApOiBEZWxldGUgZGVjbHMuCi0KLVRodSBKdW4gIDMgMDA6MjM6NTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZ28zMi5taDogZGVmaW5lIEVYVFJBTElCRVMgdG8gLWxtIChmb3IgYmludXRpbHMpLCBhbHNvCi0JcmVtb3ZlIGRlZmluZXMgb2YgX19NU0RPU19fIGFuZCBfX0dPMzJfXyAodGhlc2UgYXJlIGluIHRoZQotCWNvbXBpbGVyIG5vdykuCi0KLVdlZCBKdW4gIDIgMTc6NTc6MTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JRnJvbSBVdGFoOgotCSogaG9zdHMvaHBwYWJzZC5oOiBFbGltaW5hdGUgdXNlIG9mIG9ic29sZXRlIEVYRlVOLgotCSogY29uZmlnL2hwcGFic2QubWg6IERvbid0IHVzZSByYW5saWIuCi0KLVR1ZSBKdW4gIDEgMDQ6MTU6NTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiBOZXcgZmlsZSwgZm9yIHdvcmQtc2l6ZSBpbmRlcGVuZGVudCBjb2RlLgotCSogZWxmY29kZS5oIChlbGZfaGFzaCk6IE1vdmVkIHRvIHRoZXJlLCByZW5hbWVkIGJmZF9lbGZfaGFzaC4KLQkqIE1ha2VmaWxlLmluOiBJbmNsdWRlIGVsZi5vIGluIHN0YW5kYXJkIG9iamVjdHMuCi0KLQkqIGJmZC1pbi5oIChDQVQzKTogRGVmaW5lIGhlcmUuCi0JKiBsaWJhb3V0LmgsIGxpYmVsZi5oOiBOb3QgaGVyZS4KLQotCSogbGliZWxmLmggKHN0cnVjdCBzdHJ0YWIpOiBEZWZpbmUgaGVyZS4KLQkoYmZkX2VsZl9sb2NhdGVfc2gpOiBEZWNsYXJlIGhlcmUuCi0JKiBlbGZjb2RlLmggKHN0cnVjdCBzdHJ0YWIpOiBEZWZpbml0aW9uIGRlbGV0ZWQuCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZGVkIEhQUEFfUENSRUxfQ0FMTF8xMi4KLQotCSogTWFrZWZpbGUuaW46IE1ha2UgImFsbCIsIG5vdCAiYmZkLmgiLCBiZSB0aGUgZGVmYXVsdCB0YXJnZXQuCi0JKHN0bXAtYmZkLmgpOiBOZXcgdGFyZ2V0OyBwcmV2ZW50cyByZWJ1aWxkaW5nIHdvcmxkIGlmIGJmZC5oCi0JaGFzbid0IHJlYWxseSBjaGFuZ2VkLgotCi0JVHVlIE1heSAyNSAxMjoxNToxNSAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmY29kZS5oIChlbGZfaGFzaCk6IFByb3ZpZGUgZWxmIHN0YW5kYXJkIGhhc2ggZnVuY3Rpb24uCi0JKHZhcmlvdXMpOiBLZXkgb2ZmIG9mIHRoZSBtYWNoaW5lcyB1c2VfcmVsYV9wIGZpZWxkIHRvIGRldGVybWluZQotCXdoZXRoZXIgdG8gdXNlIFJFTCBvciBSRUxBIHJlbG9jYXRpb25zLgotCShlbGZfc3dhcF9yZWxvY19vdXQsIGVsZl9zd2FwX3JlbG9jX2luKTogTmV3IGZ1bmN0aW9ucy4KLQkoZWxmX21ha2Vfc2VjdGlvbnMpOiBBbGxvY2F0ZSBhIHBvaW50ZXIgdG8gaG9sZCBhbGwgZGF0YSBmb3IgYQotCWdpdmVuIHNlY3Rpb24sIGFuZCBjb3B5IGVhY2ggZnJhZ21lbnQgaW50byB0aGUgZGF0YSByZWdpb24uCi0JVXBkYXRlIHRoZSBzZWN0aW9uJ3MgcG9pbnRlciB3aXRoIHRoZSBSRUwgaW1wbGljaXQgYWRkZW5kcyBpZiB0aGUKLQltYWNoaW5lIHVzZXMgUkVMIHJlbG9jYXRpb24uCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZSB0bwotCWVsZl9pMzg2X2JmZF9yZWxvY190eXBlX2xvb2t1cCwgYW5kIHVzZSBjcHAgdG8gbWFwIHRoZSBuYW1lIGJhY2sKLQlpbnRvIHdhcyBlbGYzMi10YXJnZXQuaCBleHBlY3RzLgotCShlbGZfaW5mb190b19ob3d0byk6IFJlbmFtZSB0byBlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvLgotCShlbGZfaTM4Nl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgcmVsb2NhdGlvbiBzdXBwb3J0LgotCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvKTogQWRkIG1pbmltYWwgcmVsb2NhdGlvbiBzdXBwb3J0LgotCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCB1c2VfcmVsYV9wLCBlbGZfNjRfcCwKLQllbGZfaW5mb190b19ob3d0b19yZWwgZmllbGRzLgotCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmX2JlZCk6IEFkZCBzdXBwb3J0IGZvciBuZXcgZmllbGRzIGluCi0JZWxmX2JhY2tlbmRfZGF0YS4KLQotCVN1biBNYXkgMzAgMTY6Mzg6MjQgMTk5MyAgUGV0ZXIgSG9vZ2VuYm9vbSAgKGhvb2dlbkBmYXN0LmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmM6IEFkZCBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gc3VwcG9ydCwgZml4Ci0JcmVsb2NhdGlvbiBob3d0byB0YWJsZSwgYWRkIHN0dWIgZ2VuZXJhdGlvbiBzdXBwb3J0LgotCi0JKiBlbGYzMi1ocHBhLmg6IEFkZCBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gc3VwcG9ydCwgZml4Ci0JcmVsb2NhdGlvbiBob3d0byB0YWJsZSwgYWRkIHN0dWIgZ2VuZXJhdGlvbiBzdXBwb3J0LgotCi0JKiBlbGZjb2RlLmggKGJmZF9lbGZfbG9jYXRlX3NoKTogTmV3IGZ1bmN0aW9uIHRvIGxvY2F0ZSBFTEYKLQlzZWN0aW9uIGhlYWRlci4KLQotCSogZWxmY29kZS5oIChiZmRfYWRkX3RvX3N0cnRhYik6IE1hZGUgbm9uLXN0YXRpYyBkdWUgdG8gYSBjYWxsCi0JZnJvbSBlbGYzMi1ocHBhLmMuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2lkeF9vZl9zeW0pOiBSZXR1cm4gU1ROX1VOREVGIGluc3RlYWQgb2YgMCB3aGVuCi0JdGhlIHN5bWJvbCBpcyBub3QgZm91bmQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IE5vdCBhbGwgc2VjdGlvbgotCWZpbGUgcG9zaXRpb25zIHdlcmUgY29tcHV0ZWQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9zZWN0X3RodW5rKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBocHBhLmMgKHNpZ25fZXh0KTogUmVpbXBsZW1lbnQuCi0KLQkqIGhwcGEuYyAocm91bmRfZG93bixyb3VuZCxyb3VuZF91cCxMLFIsTFMsUlMsTEQsUkQsTFIsUlIpOiBNYWtlCi0JdGhlc2UgZnVuY3Rpb25zIHN0YXRpYy4KLQotVHVlIEp1biAgMSAxNDo0MDo0MSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChiZmQuaCk6ICBNb3ZlIGNsb3NlciB0byBoZWFkZXJzIC0gYW5kIGFmdGVyICdhbGwnIQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogIERvbid0IHNldAotCUJTRl9ERUJVR0dJTkcgZm9yIGNvbnN0cnVjdG9yIHN5bWJvbHMsIG9ubHkgQlNGX0NPTlNUUlVDVE9SLgotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiAgVHJhbnNsYXRlCi0JY29uc3RydWN0b3Igc3ltYm9scyBwcm9wZXJseS4KLQotVGh1IE1heSAyNyAxNjowOTowNCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdCk6IHVzZSA0IGJ5dGUgYWxpZ25tZW50IGFzIGEKLQltaW5pbXVtLgotCSogYW91dC10YXJnZXQuaCAobWluaW11bV9hbGlnbm1lbnQpOiA4IGJ5dGUgYWxpZ25tZW50IGlzIHJpZ2h0LgotCShmaXggbGQvMjY4MCkKLQotVGh1IE1heSAyNyAxMzozODo0NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IEJ1aWxkIGJmZC1pbjIuaCBpbiBzb3VyY2UgZGlyZWN0b3J5LAotCWZyb20gYmZkLWluLmggYW5kIC5jIGZpbGVzLiAgQnVpbGQgYmZkLmggaW4gYnVpbGQgZGlyZWN0b3J5LAotCXN1YnN0aXR1dGluZyBpbiByZXF1ZXN0ZWQgdGFyZ2V0IHdvcmQgc2l6ZS4gIEluc2VydCB3b3JkIHNpemUgaW50bwotCW1ha2VmaWxlLCBhbmQgbWF5YmUgZW5hYmxlIDY0LWJpdCB0YXJnZXRzLgotCi0JKiBiZmQtaW4uaCwgbGliYmZkLmMsIGRlbW82NC5jLCB0YXJnZXRzLmM6IERlZmluZSBCRkQ2NCBpZiA2NCBiaXRzCi0JYXJlIGF2YWlsYWJsZS4gIENvbmRpdGlvbmFsaXplIG9uIHRoaXMuICBBc3N1bWUgSE9TVF82NF9CSVQKLQl3aWxsIGJlIGRlZmluZWQgaWYgbmVlZGVkLCBzbyA2NC1iaXQgdGFyZ2V0cyBhcmUgY29uZGl0aW9uYWxpemVkCi0Jb25seSBpbiB0aGUgTWFrZWZpbGUuCi0KLVR1ZSBNYXkgMjUgMTQ6MDM6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYyAoQ09FUkNFNjQpOiBSZXdyaXRlIHRvIGF2b2lkIG91dC1vZi1yYW5nZSB2YWx1ZXMuCi0KLQkqIGNvZmYtc2guYyAocnR5cGUyaG93dG8pOiBQdXQgZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIuCi0JKGV4dHJhX2Nhc2UpOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlLgotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfcHJpbnRfc3ltYm9sKTogQ2FzdCBiZmRfdm1hIHZhbHVlcyB0byBsb25nCi0JYmVmb3JlIGNhbGxpbmcgcHJpbnRmLgotCi0JKiBlbGZjb2RlLmg6IE5ldyBmaWxlLCBhbG1vc3QgY29tcGxldGVseSBkZXJpdmVkIGZyb20gb2xkIGVsZjMyLmMuCi0JKiBlbGYzMi5jOiBOb3cganVzdCBkZWZpbmUgQVJDSF9TSVpFIGFuZCBpbmNsdWRlIGVsZmNvZGUuaC4KLQkqIE1ha2VmaWxlLmluIChlbGY2NC5vKTogTGlzdCBkZXBlbmRlbmNpZXMsIGRvbid0IGJ1aWxkIGJ5Ci0JZGVmYXVsdC4KLQkoZWxmNjQuYyk6IEFkZCB0byBsaXN0IG9mIHNvdXJjZXMuCi0JKGVsZjMyLm8pOiBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogZWxmMzItKi5jOiBVcGRhdGVkIHR5cGUvbWFjcm8vc3RydWN0dXJlIG5hbWVzLiAgQ2xlYW5lZCB1cAotCW5hbWVzcGFjZSBwb2xsdXRpb247IHJlbmFtZSB2ZWN0b3JzLgotCSogdGFyZ2V0cy5jLCBjb25maWcvKi1lbGYubXQ6IFVwZGF0ZWQuCi0JKiBBbGwgdXNlcyBvZiAzMi1iaXQgdmVyc2lvbnMgb2Ygc3RydWN0dXJlcywgcm91dGluZXMsIGFuZCBtYWNyb3MKLQlyZW5hbWVkLgotCi0JKiBNYWtlZmlsZS5pbiAoYXJjaHVyZXMubywgdGFyZ2V0cy5vKTogRGVwZW5kIG9uIE1ha2VmaWxlLgotCi1Nb24gTWF5IDI0IDE1OjUzOjEzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1pMzg2LmMgKGVudW0gcmVsb2NfdHlwZSk6IE5vIGNvbW1hIGFmdGVyIGxhc3QgZW51bWVyYXRvci4KLQotCSogZWxmMzIuYyAoZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uKTogSGFuZGxlIGluZGV4IG9mIHplcm8KLQlzcGVjaWFsbHkuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkciwgZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IG5lZWQgdG8gZG8KLQlzbyBoZXJlLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGVsZXRlZCBvbmUgdW51c2VkIHZhcmlhYmxlIGFuZAotCWluaXRpYWxpemVkIGFub3RoZXIgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzLgotCShlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlLgotCi1GcmkgTWF5IDIxIDE5OjA0OjIxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGkzODZseW54LmM6ICBOZXcgbW9kdWxlIGZvciBMeW54IHZhcmlhbnQgb2YgYS5vdXQuCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0JBQ0tFTkRTIENGSUxFUyBkZXBlbmRzKTogIEFkZCBpMzg2bHlueC5jLgotCSogZ2VuLWFvdXQuYzogIEdldCByaWQgb2YgZGVmdW5jdCBlbmRpYW4gc3R1ZmYsIHByaW50IG91dCB0cnVlCi0JcGFnZXNpemUuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiAgQWRkIGkzODZseW54X3ZlYy4KLQotRnJpIE1heSAyMSAxNzowMjoyMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgaTM4Ni1zY28ubXQgZm9yIGlbMzZdODYtKi1pc2MqLgotCi1GcmkgTWF5IDIxIDEzOjQ0OjE4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogYWl4Mzg2LWNvcmUuYywgYW91dC10YXJnZXQuaCwgYW91dHguaCwgY29mZi1hbHBoYS5jLAotCWNvZmYtbWlwcy5jLCBjb2ZmZ2VuLmMsIGVsZjMyLmMsIGllZWUuYywgbGliYW91dC5oLCBsaWJjb2ZmLWluLmgsCi0JbGliZWxmLmgsIG1pcHNic2QuYywgb2FzeXMuYywgc2NvLWNvcmUuYywgc3JlYy5jLCB0ZWtoZXguYywKLQl0cmFkLWNvcmUuYzogRGVmaW5lIGEgVEFSR0VUX2dldF9zeW1ib2xfaW5mbyBmdW5jdGlvbiBvciBtYWNyby4KLQlSZW1vdmUgdGhlIGJmZF9wcmludF9zeW1ib2xfbm0gY2FzZSBmcm9tIFRBUkdFVF9wcmludF9zeW1ib2wuCi0KLQkqIGJmZC1pbi5oOiBEb24ndCBkZWZpbmUgYmZkX3ByaW50X3N5bWJvbF9ubS4KLQlEZWZpbmUgc3ltYm9sX2luZm8gdHlwZS4KLQkoSlVNUF9UQUJMRSk6IFNldCBfZ2V0X3N5bWJvbF9pbmZvIGVsZW1lbnQuCi0KLQkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUsIGJmZF9zeW1ib2xfaW5mbyk6IE5ldyBmdW5jdGlvbnMuCi0JKGJmZF9kZWNvZGVfc3ltY2xhc3MpOiBVc2UgY29mZl9zZWN0aW9uX3R5cGUuCi0KLQkqIHRhcmdldHMuYzogQWRkIGJmZF9nZXRfc3ltYm9sX2luZm8gY2FsbC4KLQotV2VkIE1heSAxOSAxNTozMDo1MiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogIFVzZSB1bnNpZ25lZCBjaGFyIHRvIGF2b2lkCi0JY29tcGxhaW50cyBmcm9tIGFuY2llbnQgZ2NjJ3MuCi0KLVdlZCBNYXkgMTkgMTU6NTE6MTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jOiAgQ2hlY2sgbWFjcm8gVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRC4KLQlob3N0cy9pMzg2bGludXguaDogIERlZmluZSBpdC4KLQotTW9uIE1heSAxNyAxNTowMDozMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogVkVSU0lPTiwgYmZkLWluLmg6IEJ1bXAgdmVyc2lvbiBudW1iZXIgdG8gMi4yLgotCi0JKiBocHBhLmMgKGFzc2VtYmxlXzMsIGRpc19hc3NlbWJsZV8zLCBhc3NlbWJsZV8xMiwKLQlkaXNfYXNzZW1ibGVfMTIsIGFzc2VtYmxlXzE3LCBkaXNfYXNzZW1ibGVfMTcsIGFzc2VtYmxlXzIxLAotCWRpc19hc3NlbWJsZV8yMSwgc2lnbl9leHQsIG9uZXMsIHNpZ25fdW5leHQsIGxvd19zaWduX2V4dCwKLQlsb3dfc2lnbl91bmV4dCwgcm91bmRfZG93biwgcm91bmQsIHJvdW5kX3VwLCBMLCBSLCBMUywgUlMsIExELCBSRCwKLQlMUiwgUlIsIGhwcGFfZmllbGRfYWRqdXN0KTogTmV3IGZ1bmN0aW9ucy4KLQotTW9uIE1heSAxNyAxMDowNDoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBBZGRlZCBzdXBwb3J0IGZvciBpbmRpcmVjdAotCXN0YWJzIHN5bWJvbHMsIGluY2x1ZGluZyBuZXcgaW5kaXJlY3RfcHRyX3B0ciBhcmd1bWVudC4KLQkoZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogUGFzcyBuZXcgYXJndW1lbnQgaW4gY2FsbHMgdG8KLQllY29mZl9zZXRfc3ltYm9sX2luZm8uCi0KLUZyaSBNYXkgMTQgMDA6MDU6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEZvciBtNjhrIHN5c3Ygc3lzdGVtcywgdXNlIG02OGstY29mZi4KLQotCSogY29uZmlnL2hwcGEtZWxmLm10IChUREVGSU5FUyk6IERvbid0IGRlZmluZSBERUZBVUxUX1ZFQ1RPUiBoZXJlLgotCShUREVGQVVMVFMpOiBEZWZpbmUgaXQgaGVyZS4gIFVzZSB0aGUgbmV3IG5hbWUuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfYmFja2VuZF9kYXRhKTogRGVsZXRlOyByZWx5IG9uIGRlZmF1bHQKLQl2YWx1ZXMgaW5zdGVhZC4KLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKTogQWRkIHNvbWUgSFBQQSByZWxvYyB0eXBlcy4KLQotCSogYWl4Mzg2LWNvcmUuYyAoTk9fR0VUUyk6IEZpeCBQUk9UTyBpbnZvY2F0aW9uIHRvIGhhdmUgY29ycmVjdAotCW51bWJlciBvZiBhcmd1bWVudHMuCi0JKGFpeDM4Nl9jb3JlX2ZpbGVfcCk6IEluaXRpYWxpemUgY29yZV9zaXplIHRvIGNvcnJlY3QgdmFsdWUuCi0KLVdlZCBNYXkgMTIgMTQ6Mzk6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX0JVSUxEKTogTmV3IHZhcmlhYmxlLCBzZXQgdG8gJChDQykuCi0JKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gQ0NfRk9SX0JVSUxELgotCi0JKiBib3V0LmMgKGFvdXQzMl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lIHRvIGJlCi0JX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIHJhdGhlciB0aGFuIGJmZF90cnVlLgotCi0JKiBjb2ZmLW1pcHMuYzogSW5jbHVkZSBsaWJhb3V0LmggYW5kIGFvdXQvYW91dDY0LmggdG8gZ2V0Ci0JZGVmaW5pdGlvbnMgZm9yIE5fU0VUW0FUREJdLgotCShlY29mZl9ob3d0b190YWJsZSk6IE1vdmVkIG5lYXIgdG9wIG9mIGZpbGUuCi0JKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IElmIGEgU1RBQlMgc3ltYm9sIG9mIHR5cGUgTl9TRVRbQVREQl0gaXMKLQlzZWVuLCBjb29rIHVwIGEgY29uc3RydWN0b3Igc2VjdGlvbiBvZiB0aGUgc2FtZSBuYW1lIGFuZCBwdXQgaW4gYQotCXJlbG9jIHBvaW50aW5nIHRvIHRoZSBzeW1ib2wuICBUaGlzIGxldHMgdGhlIEdOVSBsaW5rZXIgYnVpbGQKLQlnbG9iYWwgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyB3aXRob3V0IHVzaW5nIGNvbGxlY3QuCi0KLVR1ZSBNYXkgMTEgMDA6MzM6MzEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTg4ay5jIChtODhrYmNzX3ZlYyk6ICBTeW1ib2xzIGhhdmUgdW5kZXJiYXJzLgotCi1Nb24gTWF5IDEwIDA1OjU1OjQ1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBob3N0cy9taW5pZnJhbWUuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIGl0LgotCi1TdW4gTWF5ICA5IDE2OjM2OjU5IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotYnNkKTogIENoYW5nZSB0byBocHBhKi0qLWJzZCoKLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1ocHV4KTogIENoYW5nZSB0byBocHBhKi0qLWhwdXgqCi0JKiBjb25maWd1cmUuaW4gKG02OCotaHAtYnNkKTogIENoYW5nZSB0byBtNjgqLWhwLWJzZCoKLQkqIGNvbmZpZ3VyZS5pbiAobTY4Ki0qLWhwdXgpOiAgQ2hhbmdlIHRvIG02OCotKi1ocHV4KgotCSogY29uZmlndXJlLmluICgqLSotYnNkKTogIENoYW5nZSB0byAqLSotYnNkKgotCi1XZWQgTWF5ICA1IDE2OjA4OjMyIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwKTogIENhc3QgZW51bXMgdG8KLQlpbnQsIGZvciB0aGUgc2FrZSBvZiB0aGUgb2xkIFBvcnRhYmxlIEMgQ29tcGlsZXIuCi0KLU1vbiBNYXkgIDMgMTQ6Mzc6MDEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6ICBBZGQgY3B1LXNoLmMgYW5kIGNvZmYtc2guYy4KLQotTW9uIE1heSAgMyAxNDowMzoyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBHZXQgdGFyZ2V0IG5hbWUgcmlnaHQgZm9yIG02OCotKi1ocHV4LgotCi1TdW4gTWF5ICAyIDExOjM5OjQ0IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAoTk9fU0lHTkVEX0dFVCk6ICBOZXcgbWFjcm8uCi0JKiB0cmFkLWNvcmUuYyAodHJhZF9jb3JlX3ZlYyk6ICBVc2UgbmV3IE5PX1NJR05FRF9HRVQgaW5zdGVhZCBvZgotCXNpZ25lZCBOT19HRVQsIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1saW51eCopOiAgQWRkOyBiZmRfdGFyZ2V0ID0gaTM4Ni1saW51eC4KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLWxpbnV4Kik6ICBSZW1vdmUgdW50aWwgbGludXggcG9ydCBmb3IgYQotCW5vbi1pMzg2L2k0ODYgc3lzdGVtIGlzIGFjdHVhbGx5IGF2YWlsYWJsZS4KLQotRnJpIEFwciAzMCAyMDowNDoxMCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmg6ICAjdW5kZWYgZV8qIHN5bWJvbHMgd2hpY2ggY29tZSBmcm9tIDxtYWNoaW5lL3NvbS5oPgotCXdoZW4gY29tcGlsaW5nIHVuZGVyIEhQVVguCi0KLUZyaSBBcHIgMzAgMTc6MjU6MjMgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogVGhlIGZvbGxvd2luZyBwYXRjaGVzIGFyZSBmcm9tIEplZmZyZXkgTGF3IDxsYXdAY3MudXRhaC5lZHU+LgotCSogaHBwYS5jIChocHBhX2NvcmVfZmlsZV9wKTogUHJvdmlkZSBhIHRlbXBvcmFyeSBkdW1teSByb3V0aW5lCi0JZm9yIEhPU1RfSFBQQUJTRC4KLQkqIGJmZC9ob3N0cy9ocHBhYnNkLmg6IEZpeCBkZWNsYXJhdGlvbnMgb2YgbWFsbG9jIGFuZCBmcmVlLgotCSogYmZkL2xpYmhwcGEuaDogSW5jbHVkZSBzeXNkZXAgaGVyZS4gIENvbmRpdGlvbmFsaXplCi0JaW5jbHVkZXMgYmFzZWQgb24gSE9TVF9IUFBBSFBVWCBvciBIT1NUX0hQUEFCU0QuCi0JUHJvdmlkZSBkZWZpbml0aW9ucyBmb3IgTUFYQ09NTEVOIGFuZCBfUEFfUklTQ19JRCBzdWl0YWJsZQotCWZvciBCU0QuCi0KLUZyaSBBcHIgMzAgMTc6MzQ6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1ocHBhLmM6IERvbid0IGluY2x1ZGUgYS5vdXQuaC4gIEFwcGFyZW50bHkgbm90IGV2ZW4gdGhlCi0JR05VIHZlcnNpb24gaXMgbmVlZGVkLgotCi1GcmkgQXByIDMwIDA5OjM4OjU5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiB1c2UgZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyByYXRoZXIgdGhhbiBjYXN0aW5nIGFib3J0LgotCi1UaHUgQXByIDI5IDExOjMwOjMyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgZWxmMzItaHBwYS5vLgotCi0JKiBzeW1zLmMgKEJTRl9GVU5DVElPTik6IE5ldyBzeW1ib2wgZmxhZy4KLQotCSogZWxmMzItaHBwYS5jOiBGaXhlZCB0byB3b3JrIHdpdGggZWxmMzItdGFyZ2V0LmguCi0KLQkqIGhwMzAwaHB1eC5jIChOQU1FLCBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4pOiBGaXggZm9yCi0JdHJhZGl0aW9uYWwgQy4KLQkqIGxpYmFvdXQuaCAoTkFNRSk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCi0KLQkqIGxpYmVsZi5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQkoZWxmX3N5bWJvbF90eXBlKTogTW92ZWQgaGVyZSwgYWRkZWQgbmV3IGZpZWxkcy4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBOZXcgZmllbGQgYGdsb2JhbF9zeW0nOyBJIHN1c3BlY3QgdGhpcwotCW1heSBiZSBtaXNwbGFjZWQuCi0JKiBlbGYzMi5jIChlbGZfc3ltYm9sX3R5cGUpOiBEZWxldGVkIGZyb20gaGVyZS4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBOZXcgZmllbGRzIHJhd19zeW1zIGFuZCBpbnRlcm5hbF9zeW1zLCB0bwotCXBvaW50IHRvIGJhY2tlbmQgdmVyc2lvbnMgb2Ygc3ltYm9scy4KLQkob2JqX3N5bWJvbHMsIG9ial9yYXdfc3ltcywgb2JqX2ludGVybmFsX3N5bXMpOiBOZXcgbWFjcm9zLgotCShlbGZfc3dhcF9waGRyX291dCwgZWxmX2J1aWxkX3BoZHJzLCBlbGZfd3JpdGVfcGhkcnMpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBXcml0ZSBwcm9ncmFtIGhlYWRlcnMgaWYgYXBwcm9wcmlhdGUuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVubmFtZWQgc2VjdGlvbnMgZ2V0IGVtcHR5IHN0cmluZyBmb3IKLQluYW1lLCBub3QgInVubmFtZWQiLiAgSGFuZGxlIFNIVF9OT0JJVFMgc2VwYXJhdGVseSBmcm9tCi0JU0hUX1BST0dCSVRTLCBhbmQgc2V0IHNvbWUgZGlmZmVyZW50IGZsYWdzLgotCShlbGZfZmlsZV9wKTogTmV3IHJvdXRpbmUuCi0JKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogQ2FsbCBpdC4KLQkoZWxmX29iamVjdF9wKTogSGFuZGxlIEVNX0hQUEEuCi0JKGVsZl9zeW1ib2xfZnJvbSwgZWxmX2lkeF9vZl9zeW0pOiBOZXcgZnVuY3Rpb25zLgotCShlbGZfbWFrZV9zZWN0aW9ucyk6IEdldCBzeW1ib2wgbnVtYmVyIHJpZ2h0IGZvciByZWxvY2F0aW9ucy4gIFNldAotCVNIRl9BTExPQywgU0hGX1dSSVRFLCBTSEZfRVhFQ0lOU1RSIHdoZW4gYXBwcm9wcmlhdGUuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogQlNTIHNlY3Rpb24gc2hvdWxkIGJlIFNIVF9OT0JJVFMsIG5vdAotCVNIVF9QUk9HQklUUy4gIEFsd2F5cyBnZW5lcmF0ZSBzeW10YWIgYW5kIHN0cnRhYiwgbm90IG9ubHkgaWYKLQlyZWxvY2F0aW9ucyBhcmUgbmVlZGVkLiAgU2V0IFNIRl8qIGZsYWdzIGFzIGFwcHJvcHJpYXRlLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSGFuZGxlIGJmZF9hcmNoX2hwcGEuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBGaXggb2ZmLWJ5LW9uZSBlcnJvciBpbiBzeW1ib2wgY291bnQuCi0JU3RvcmUgYSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgc3ltYm9sOyB3cml0ZSB0aGUgc2l6ZSBmaWVsZAotCXByb3Blcmx5OyBtYWtlIHNvbWUgZ3Vlc3NlcyBhYm91dCB0aGUgdHlwZSBmaWVsZC4gIFNldCBzZWN0aW9uCi0JdHlwZSBjb3JyZWN0bHkgZm9yIHN0cmluZyB0YWJsZXMuCi0JKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBDaGVjayBmb3IgYWJzb2x1dGUgYW5kIGNvbW1vbiBzZWN0aW9ucwotCWZpcnN0LgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRGl0dG8uCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBVc2UgZWxmX3N5bWJvbF90eXBlIGluc3RlYWQgb2YgYXN5bWJvbC4KLQlVc2UgZW1wdHkgc3RyaW5nIGluc3RlYWQgb2YgInVubmFtZWQiIGZvciBuYW1lbGVzcyBzeW1ib2xzLgotCUhhbmRsZSBTVFRZX0ZVTkMgdHlwZSwgYW5kIHdlaXJkbmVzcyB3aXRoICIkZ2xvYmFsJCIgc3ltYm9sIGZvcgotCUhQUEEgKG9ubHk/KS4gIERvbid0IGZyZWUgcmF3IHN5bWJvbHM7IGtlZXAgdGhlIHBvaW50ZXIgYXJvdW5kIGZvcgotCWxhdGVyLgotCShlbGZfc2V0X2FyY2hfbWFjaCk6IEhhbmRsZSBiZmRfYXJjaF9ocHBhLgotCShlbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBKdXN0IHJldHVybiBmYWxzZS4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cywgZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0Ci0Jb3V0cHV0X2hhc19iZWd1biBmaWVsZCBhZnRlciBjb21wdXRpbmcgZmlsZSBwb3NpdGlvbnMuCi0JKGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFdyaXRlIHNlY3Rpb24gY29udGVudHMgaW1tZWRpYXRlbHksCi0JcmF0aGVyIHRoYW4gY2FjaGluZyB0aGUgd2hvbGUgZmlsZSBhbmQgd3JpdGluZyBpdCBhdCBjbG9zZSB0aW1lLgotCi0JKiBsaWJocHBhLmggKGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlLCBlbnVtCi0JaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBfYWx0LCBlbnVtIGhwcGFfcmVsb2NfZXhwcl90eXBlLCBlbnVtCi0JaHBwYV9yZWxvY19leHByX3R5cGVfYWx0KTogTmV3IGVudW1lcmF0b3IgdHlwZXMuCi0KLQkqIGNvbmZpZy9ocHBhLWVsZi5tdCwuIGNvbmZpZy9ocHBhb3NmLm1oOiBIUCBQQS9PU0Ygc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlLmhvc3Q6IFVzZSB0aGVtLgotCi1XZWQgQXByIDI4IDIzOjIxOjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdGFyZ2V0Lmg6IEFsbG93IG92ZXJyaWRlcyBvZiBhcm1hcCBkZWZhdWx0cy4KLQotCSogZWxmMzItaHBwYS5jLCBlbGYzMi1ocHBhLmg6IE5ldyBmaWxlcy4KLQotCSogY29uZmlnL2hwMzAwaHB1eC5tdDogTmV3IGZpbGUuCi0KLVR1ZSBBcHIgMjcgMDU6Mzk6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGFpeDM4Ni1jb3JlLmMgKE5PX0dFVFMpOiBOZXcgbWFjcm87IE5PX0dFVCBmb3Igc2lnbmVkIHZhbHVlcy4KLQkoYWl4Mzg2X2NvcmVfdmVjKTogVXBkYXRlIGZvciBuZXcgZmllbGRzLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IENhbGwgdGFyZ2V0LXNwZWNpZmljCi0Jc2x1cnBfYXJtYXAgY29kZSwgaW5zdGVhZCBvZiBiZmRfc2x1cnBfYXJtYXAuCi0JKGJmZF9zbHVycF9ic2RfYXJtYXBfZjIpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IERlY2xhcmUgaXQuCi0JKiBhb3V0LXRhcmdldC5oIChBUl9QQURfQ0hBUik6IERlZmluZSBpdCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCSh2ZWMpOiBVc2UgaXQuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IE5ldyBmaWVsZCBmb3Igc3ViZm9ybWF0LCBmb3IKLQlkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBoaWdobHkgc2ltaWxhciBhLm91dCBmb3JtYXRzLgotCSogYW91dHguaCAoTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luKTogTmV3IG1hY3JvLCBkZWZhdWx0cyB0byBsb2NhbAotCXZlcnNpb24gb2YgZnVuY3Rpb24uCi0JKHN3YXBfZXhlY19oZWFkZXJfaW4pOiBEb24ndCBkZWZpbmUgaWYgTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luIGlzCi0JYWxyZWFkeSBkZWZpbmVkLgotCSogaHAzMDBocHV4LmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IEluY2x1ZGUgaXQuCi0KLU1vbiBBcHIgMjYgMTM6MjQ6NDMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb2ZmY29kZS5oLCB0YXJnZXRzLmM6IFN1cHBvcnQgZm9yCi0JSGl0YWNoaSBTSC4KLQotTW9uIEFwciAyNiAxMzo1NTo0MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IENoZWNrIHRoZSBmaWxlIHNpemUuCi0KLU1vbiBBcHIgMjYgMTM6MjQ6NDMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYzogUmVtb3ZlIGR1cGxpY2F0ZSBmdW5jdGlvbiBhbmQgYWRkIHdhcm5pbmdzLgotCi1Nb24gQXByIDI2IDExOjI1OjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2NvLWNvcmUuYyAoc2NvX2NvcmVfdmVjKTogQWRkIGluaXRpYWxpemVycyBmb3IgbmV3IHRhcmdldAotCWZpZWxkcy4KLQotU2F0IEFwciAyNCAyMTozMzo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCBbX0xJVF06IFJlY29nbml6ZSAubGl0IHNlY3Rpb24uCi0KLUZyaSBBcHIgMjMgMTk6MDA6MzYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYywgY3B1LWFscGhhLmMsIGNvbmZpZy9hbHBoYW9zZi5tdCwKLQljb25maWcvYWxwaGFvc2YubXQsIGhvc3RzL2FscGhhb3NmLmg6ICBOZXcgZmlsZXMuCi0KLUZyaSBBcHIgMjMgMTY6NDg6NDYgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogTWVyZ2UgaW4gSFBQQS9CU0QgY2hhbmdlcyBmcm9tIFV0YWguCi0JKiBocHBhLmM6ICBVc2UgdGhpcyBmb3IgYm90aCBIUFVYICYgQlNELgotCSogdGFyZ2V0cy5jOiAgRW5hYmxlIGhwcGFfdmVjIGZvciBib3RoIEhQVVggJiBCU0QuCi0JKiBjb25maWcvaHBwYWJzZC5tdDogIFRERUZJTkVTID0+IFRERUZBVUxUUy4KLQkqIGhvc3RzL2hwcGFic2QuaDogICNkZWZpbmUgSE9TVF9IUFBBQlNELgotCi1XZWQgQXByIDIxIDAxOjUwOjEwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYzogIFdoaXRlc3BhY2UgY2hhbmdlcyBhcm91bmQgYnl0ZXN3YXAgbWFjcm9zLgotCSogbGliYmZkLWluLmg6ICBXaGl0ZXNwYWNlIGNoYW5nZXMgYXJvdW5kIGJ5dGVzd2FwIGRlY2xhcmF0aW9ucy4KLQotVHVlIEFwciAyMCAxNTo1OTowNyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2NvcmVfZmlsZV9wKTogIERvbid0IGRlZmF1bHQgYmZkX2Vycm9yIHRvCi0Jc3lzdGVtX2Vycm9yIGFueW1vcmUuICBJdCBjb25mdXNlcyBiZmRfY2hlY2tfZm9ybWF0KCkuCi0KLU1vbiBBcHIgMTkgMjM6MDM6MDggMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6ICBBZGQgc2dpX2NvcmVfZGF0YSB0byB0ZGF0YSB1bmlvbi4KLQkqIGNvZmYtbWlwcy5jOiAgQWRkIElyaXggNC54IGNvcmUgZmlsZSBzdXBwb3J0LgotCSogaG9zdHMvaXJpeDQuaDogICNkZWZpbmUgSE9TVF9JUklYNC4KLQotTW9uIEFwciAxOSAxODo1Mjo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IENoZWNrIHRoYXQgdGhlCi0Jc3ltYm9sJ3Mgc2VjdGlvbiBkb2VzIGdldCBzZXQuCi0JKHNsdXJwX3N5bWJvbF90YWJsZSk6IFplcm8gaW5kZXggbWVhbnMgbnVsbC1zdHJpbmcgbmFtZS4KLQotCSogYW91dHguaCAoc3RydWN0IHN0cmluZ3RhYl9lbnRyeSwgc3RydWN0IHN0cmluZ3RhYl9kYXRhKTogTmV3Ci0JZGF0YSBzdHJ1Y3R1cmVzLgotCShoYXNoLCBzdHJpbmd0YWJfaW5pdCwgYWRkX3RvX3N0cmluZ3RhYiwgZW1pdF9zdHJ0YWIsIGNvbXBhcmUpOgotCU5ldyBmdW5jdGlvbnMuCi0JKHdyaXRlX3N5bXMpOiBVc2UgdGhlbSwgdG8gcmVkdWNlIHN0cmluZyB0YWJsZSBzaXplLgotCi1Nb24gQXByIDE5IDE2OjQ1OjEyIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF9jb3JlX3ZlYyk6ICBBZGQgNiBuZXcgaW5pdGlhbGl6ZXJzIHRvIG1hdGNoCi0JICBuZXcgc2lnbmVkIGdldC9wdXQgZmllbGRzLiAgTWlub3IgcmVmb3JtYXR0aW5nIHRvIGxhYmVsCi0JICBzb21lIGZpZWxkcy4KLQotTW9uIEFwciAxOSAwNjowOTo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6IEluc2VydCBjb21tZW50IGFib3V0IFNWUjMgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIGhvc3RzL3tocDMwMCxpMzg2aXNjLGkzODZ2fS5oOiBSZW1vdmUgdW51c2VkICNkZWZpbmVzIG9mIHtyLH1pbmRleAotCShiZmQgdXNlcyBzdHJjaHIgYW5kIHRoZSBicm9rZW4gU1ZSMy4yIGNwcCBsb3NlcyB3aXRoIHRoZSBkZWZpbmVzKS4KLQotCSogbGliYmZkLmM6IGJmZF9wdXQqOiBSZW1vdmUgY2FzdHMgdG8gYmZkX3ZtYS4KLQotRnJpIEFwciAxNiAxNzo0OToyNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKGludGVybmFsX3N1bm9zX2NvcmUpOiBNYWtlIGNfc3RhY2t0b3AgYSBiZmRfdm1hLgotCShzd2FwY29yZV9zcGFyYyk6IE1ha2Ugc3AgYSBiZmRfdm1hLgotCi1UaHUgQXByIDE1IDA5OjA5OjE4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYzogQWRkIHNpZ25lZCB2ZXJzaW9ucyBvZiBiZmRfe2hfLH17Z2V0LHB1dH1fc2lnbmVkXzxzaXplPi4KLQlsaWJiZmQuYywgbGliYmZkLWluLmg6IEFkZCBfZG8qc2lnbmVkKi4KLQl0YXJnZXRzLmMsIGFsbCB0YXJnZXRzOiBBZGQgYmZkKnNpZ25lZCouCi0JYmZkLWluLmg6IEFkZCBiZmRfc2lnbmVkX3ZtYS4gIEFkZCBjb21tZW50cy4KLQotCSogYmZkLWluLmggKGJmZF9lcnJvciksIGJmZC5jIChiZmRfZXJybXNncyk6IEFkZCBmaWxlX3RydW5jYXRlZC4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19lcnJvcik6IENoZWNrIGVycm9yIHJldHVybiBmcm9tCi0JX2JmZF9jaGVja19mb3JtYXQgcm91dGluZXMuCi0KLVdlZCBBcHIgMTQgMjM6NDg6MjUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogSW1wcm92ZSBlcnJvciBjaGVja2luZyBhbmQKLQlyZWNvZ25pemUgLmRhdGEgc2VjdGlvbiBpZiBwcmVzZW50LgotCi1UaHUgQXByIDE1IDAxOjAwOjI5IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0XypfYWRqdXN0X3NpemVzX2FuZF92bWFzKTogIEF2b2lkIGBzYW5pdHknCi0JY2hlY2sgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB1c2VyIHNldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIEJTUwotCXNlY3Rpb24gKGFuZCB0aGUgZmlsZSBoZWFkZXIgY2FuJ3Qgc3BlY2lmeSB0aGlzKS4gIExldCB0aGUgdXNlcgotCXNldCBpdCB3aGVyZXZlciB0aGV5IHdhbnQsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBnb2VzIGluIHRoZSBoZWFkZXIuCi0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9ucyk6ICBQYXNzIGFsbCBpZWVlIHNlY3Rpb24gbmFtZXMKLQlzdHJhaWdodCB0aHJvdWdoIGludG8gQkZEIHNlY3Rpb25zLiAgQWRkIGNvbW1lbnRzLgotCi1XZWQgQXByIDE0IDIwOjM0OjU0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQ2xlYW51cCBpbiBwcmVwYXJhdGlvbiBmb3IgYmV0dGVyIDY0LWJpdCBob3N0IHN1cHBvcnQuCi0KLQkqIGJmZC1pbi5oIChiZmRfNjRfdHlwZSk6ICBSZW1vdmUuCi0JKiBsaWJiZmQuYyAoX2RvX2dldGI2NCwgX2RvX3B1dGI2NCk6ICBVc2UgYmZkX3ZtYSwgbm90IGJmZF82NF90eXBlLgotCi0JKiBiZmQtaW4uaCAoYmZkX3NpemUpOiAgUmVtb3ZlLgotCi0JKiBiZmQtaW4uaCAoYmZkX29mZnNldCk6ICBSZW1vdmUsIGFmdGVyIGZpeGluZyBsZC9sZGxhbmcuW2NoXS4KLQotCSogYmZkLWluLmggKGJmZF93b3JkKTogIFJlbW92ZS4KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiAgUmVwbGFjZSBiZmRfd29yZCB3aXRoIGJmZF92bWEuCi0KLQkqIGJmZC1pbi5oIChyYXdkYXRhX29mZnNldCk6ICBSZW1vdmUuCi0JKiByZWxvYy5jIChhcmVsZW50KTogIFJlcGxhY2UgcmF3ZGF0YV9vZmZzZXQgd2l0aCBiZmRfc2l6ZV90eXBlLgotCShiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogIExpbnQuCi0JKGVudW0gYmZkX3JlbG9jX3N0YXR1cyk6ICBDb21tZW50IGNsZWFudXAuCi0KLQkqIGFvdXQtYWRvYmUuYywgY3B1LWg4MzAwLmMsIG1pcHNic2QuYywgc3JlYy5jOiBsaW50IC1XYWxsLgotCi1UdWUgQXByIDEzIDExOjE5OjUyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3dhcGNvcmVfc3BhcmMpOiBHdWVzcyB0aGUgcmlnaHQgdmFsdWUgb2YgVVNSU1RBQ0suCi0KLU1vbiBBcHIgMTIgMTQ6MTg6MDAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLmM6ICBDbGVhbiB1cCBvbGQgY29tbWVudHMuCi0KLUZyaSBBcHIgIDkgMTA6NDM6MjAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvc3VuMy5oOiBTdHJpbmcgYXJndW1lbnQgdG8gZnByaW50ZiBpcyBjb25zdC4KLQotCSogY29mZi1taXBzLmM6IFJlbmFtZWQgUEFHRV9TSVpFIHRvIFJPVU5EX1NJWkUsIHRvIGF2b2lkIGNvbmZ1c2lvbgotCW9uIHN5c3RlbXMgd2hpY2ggZGVmaW5lIFBBR0VfU0laRSBpbiA8bGltaXRzLmg+LgotCi1UaHUgQXByICA4IDEwOjI4OjAwIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpOiBVc2UgbmV3IG1hY3JvCi0JVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTCB0byBhbGxvdyBob3N0IGZpbGVzIHRvIHNwZWNpZnkKLQl0aGUgY29yZSBmaWxlIGZhaWxpbmcgc2lnbmFsLgotCSogaG9zdHMvZGVjc3RhdGlvbi5oIChUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKTogRGVmaW5lCi0JdG8gc3VwcGx5IHRoZSBjb3JlIGZpbGUgZmFpbGluZyBzaWduYWwuCi0KLVRodSBBcHIgIDggMDk6MTc6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IE9ubHkgc2V0IFNFQ19TSEFSRURfTElCUkFSWSBmb3IKLQlhIFNUWVBfTk9MT0FEIHwgU1RZUF9CU1Mgc2VjdGlvbiBpZiBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0JaXMgZGVmaW5lZC4gIE9uIG1hbnkgQ09GRiB0YXJnZXRzIFNUWVBfQlNTIGlzIGFsd2F5cyBTVFlQX05PTE9BRC4KLQkqIGNvZmYtaTM4Ni5oIChCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZKTogRGVmaW5lLgotCi1XZWQgQXByICA3IDExOjMzOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKFBBR0VTSVpFKTogQ29ycmVjdCB2YWx1ZS4KLQotVHVlIEFwciAgNiAxMjowNTo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEFkZHJlc3Mgb2YgZmlyc3QgUERSIGlzCi0JYW4gb2Zmc2V0IChwYXRjaCBmcm9tIEplYW4tRGFuaWVsIEZla2V0ZSA8amRmQGxyaS5scmkuZnI+KS4KLQotTW9uIEFwciAgNSAxMjowNzoxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogU2V0IFNFQ19TSEFSRURfTElCUkFSWSBmb3IgYQotCVNUWVBfTk9MT0FEIHwgU1RZUF9CU1Mgc2VjdGlvbi4gIERvbid0IHNldCBTRUNfTkVWRVJfTE9BRCBmb3IgYQotCVNUWVBfSU5GTyBzZWN0aW9uLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEZvcmNlIHZtYSBhbmQgbG1hIG9mIF9MSUIKLQlzZWN0aW9uIHRvIGJlIHplcm8uCi0JKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDb3VudCBudW1iZXIgb2YgZW50cmllcyBpbiBuZXcgbG1hCi0JZmllbGQsIG5vdCBpbiB2bWEuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IEZvcmNlIGxpbmVub19jb3VudCBvZgotCVNFQ19TSEFSRURfTElCUkFSWSBzZWN0aW9uIHRvIGJlIHplcm8sIHNpbmNlIGl0IGlzIG5vbi16ZXJvIG9uIHRoZQotCVNDTyAzLjJ2NCBzaGFyZWQgbGlicmFyeS4KLQkqIHNlY2xldC5jIChyZWwpOiBDb3B5IG92ZXIgYW55IHNlY3Rpb24gd2l0aCBjb250ZW50cywgbm90IGp1c3QKLQlsb2FkYWJsZSBzZWN0aW9ucy4KLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX21ha2VfZW1wdHlfc3ltYm9sKTogWmVybyBvdXQgbmV3bHkgYWxsb2NhdGVkCi0Jc3ltYm9sLgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogTmV3IGZ1bmN0aW9uLCB0byBnZW5lcmF0ZQotCXJlbG9jYXRlYWJsZSBvdXRwdXQgY29ycmVjdGx5LgotCShob3d0b190YWJsZSk6IFVzZSBjb2ZmX2kzODZfcmVsb2MgZm9yIGFsbCByZWxvYyB0eXBlcy4KLQkoQ0FMQ19BRERFTkQpOiBVc2UgYSBtb3JlIGVmZmljaWVudCBoYWNrIHRvIGdldCB0aGUgY29ycmVjdCBhZGRlbmQKLQlmb3IgYSBjb21tb24gc3ltYm9sLgotCShpMzg2Y29tbV92YWx1ZSk6IFJlbW92ZWQ7IG5vIGxvbmdlciBuZWVkZWQuCi0KLVN1biBBcHIgIDQgMTU6MDg6NDggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEb24ndCB3cml0ZSBvdXQKLQlzZWN0aW9ucyB3aXRob3V0IGEgZmlsZXBvcy4KLQotRnJpIEFwciAgMiAxNDozNTowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNlY2xldC5jIChzZWNsZXRfZHVtcF9zZWNsZXQpOiBDb3JyZWN0IFNFQ19IQVNfQ09OVEVOVFMgdGVzdC4KLQotV2VkIE1hciAzMSAxNzo0MTowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSk6IEFkZGVkIEJGRF9SRUxPQ19NSVBTX0dQUkVMLgotCSogbGliZWNvZmYuaCAoZWNvZmZfZGF0YV90eXBlKTogQWRkZWQgZ3Bfc2l6ZSBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9ta29iamVjdF9ob29rKTogSW5pdGlhbGl6ZSBncF9zaXplIHRvIDguCi0JKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IENvbXBhcmUgYWdhaW5zdCBncF9zaXplLCBub3QgaGFyZGNvZGVkIDguCi0JU2V0IGZsYWdzIHRvIDAgZm9yIGxhcmdlIGNvbW1vbiBzeW1ib2xzLgotCShlY29mZl9ncHJlbF9yZWxvYyk6IEhhbmRsZSBub24temVybyBhZGRlbmQgZm9yIGV4dGVybmFsIHN5bWJvbHMsCi0Jd2hpY2ggY2FuIG9jY3VyIGZvciBnYXMtZ2VuZXJhdGVkIHJlbG9jcy4KLQkoZWNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkZWQgQkZEX1JFTE9DX01JUFNfR1BSRUwgY2FzZS4KLQkqIGJmZC5jIChiZmRfZ2V0X2dwX3NpemUsIGJmZF9zZXRfZ3Bfc2l6ZSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBNYWtlZmlsZS5pbiAoYmZkLm8pOiBOb3cgZGVwZW5kcyBvbiBjb2ZmL3N5bS5oIGFuZCBsaWJlY29mZi5oLgotCi1UdWUgTWFyIDMwIDA5OjMzOjE2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzcmVjLmMgKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBVc2UgbG1hIGZpZWxkIGZvciBsb2FkCi0JYWRkcmVzcy4KLQkqIHNlY3Rpb24uYzogQWRkIGRlY2xhcmF0aW9uIG9mIGxtYSBmaWVsZCB0byBzZWN0aW9uIHN0cnVjdHVyZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIGxtYSBmaWVsZCBmb3IgbG9hZAotCWFkZHJlc3MuCi0JKiBiZmQtaW4uaCAoYmZkX3NldF9zZWN0aW9uX3ZtYSk6IFNldCBsbWEgYWxvbmcgd2l0aCB2bWEuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBOb3cgaGFuZGxlcyBpbmRpcmVjdAotCXN5bWJvbHMgaW4gYSBiZXR0ZXIgd2F5LiAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZyk6IFNldCB0aGUKLQlOX0lORFIgYml0IHdoZW4gbmVjZXNzYXJ5LiAoYW91dDw+c2x1cnBfc3ltYm9sX3RhYmxlKTogTWFpbnRhaW4KLQlpbmRpcmVjdCBzdGF0ZS4KLQkqIHNlY3Rpb24uYzogQWRkZWQgQkZEX0lORF9TRUNUSU9OX05BTUUgYW5kIGJmZF9pbmRfc2VjdGlvbi4KLQkoYmZkX21ha2Vfc2VjdGlvbik6IENvcGUgd2l0aCBuZXcgYnVpbHRpbiBzZWN0aW9uLgotCSogc3ltcy5jIChiZmRfZGVjb2RlX3N5bWNsYXNzKTogQ2FuIG5vdyBwcmludCBpbmRpcmVjdCBzZWN0aW9uCi0JaW5mby4KLQotV2VkIE1hciAyNCAxMzozNjozMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKG9iamVjdF9wKSk6ICBGYWlsIGlmIE1BQ0hUWVBFX09LIGlzCi0JZGVmaW5lZCwgYW5kIHlpZWxkcyBmYWxzZS4KLQkqIGFvdXQtbWlwc2JzZC5jLCBpMzg2YnNkLmM6ICBEZWZpbmUgTUFDSFRZUEVfT0sgYXBwcm9wcmlhdGVseS4KLQotCSogYXJjaGl2ZS5jIChzbmFyZl9hcl9oZHIpOiAgQWRkIHN1cHBvcnQgZm9yIHJlYWRpbmcgKG9ubHksCi0Jc28gZmFyKSBCU0QtNC40LXN0eWxlIGV4dGVuZGVkIGhlYWRlcnMuCi0JKiBhcmNoaXZlLmM6ICBTb21lIG1vcmUgY29tbWVudHMuCi0KLVdlZCBNYXIgMjQgMDI6MDU6MTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBmaXggcnVsZSBmb3IgZHZpIGFuZCBpbmZvLCBzbyB0aGF0IHRoZSByZWN1cnNpdmUKLQltYWtlcyBkb2VzIHRoZSByaWdodCB0aGluZywgaW5zdGVhZCBvZiBhbHdheXMgaW5mbwotCi1XZWQgTWFyIDI0IDAyOjU2OjQ0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmMgKGJmZF9zZWVrKTogRGlzYWJsZSBvcHRpbWl6ZWQgaGFuZGxpbmcgZm9yIGFyY2hpdmVzIGFuZAotCWFyY2hpdmUgbWVtYmVyczsgdGhleSBuZWVkIG1vcmUgc3BlY2lhbCByZWF0bWVudC4gIEZvciBub3csIHZlcmlmeQotCXRoYXQgY29tcHV0ZWQgYW5kIGFjdHVhbCBmaWxlIHBvc2l0aW9ucyBjb3JyZXNwb25kLgotCi1UdWUgTWFyIDIzIDA4OjQ1OjMzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWlwc2JzZC5jOiBSZW5hbWVkIGZyb20gYW91dC1taXBzYnNkLmMuCi0JKHNldF9hcmNoX21hY2gpOiBEZWxldGUgbm9uLU1JUFMgY29kZS4KLQkocmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBEaXR0by4KLQkqIE1ha2VmaWxlLmluOiBBZGp1c3RlZC4KLQotCSogbGliYmZkLmMgKGJmZF90ZWxsKTogVXBkYXRlIGB3aGVyZScgZmllbGQuCi0JKGJmZF9zZWVrKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UncmUgbm90IGNoYW5naW5nIHRoZSBmaWxlCi0JcG9zaXRpb24uICBJZiBGSUxFX09GRlNFVF9JU19DSEFSX0lOREVYIGlzIGRlZmluZWQsIGNoZWNrIGB3aGVyZScKLQlmaWVsZCBhZ2FpbnN0IGEgU0VFS19TRVQgcmVxdWVzdC4gIENhbGwgYmZkX3RlbGwgdG8gcmUtdXBkYXRlCi0JYHdoZXJlJyBmaWVsZCB3aGVuIGRvbmUuCi0JKGJmZF9yZWFkLCBiZmRfd3JpdGUpIFtGSUxFX09GRlNFVF9JU19DSEFSX0lOREVYXTogTWFpbnRhaW4KLQlgd2hlcmUnIGZpZWxkLgotCSogaG9zdHMvc3BhcmMuaDogRGVmaW5lIEZJTEVfT0ZGU0VUX0lTX0NIQVJfSU5ERVguCi0KLU1vbiBNYXIgMjIgMjM6MTg6MTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgaW5zdGFsbGNoZWNrIHRhcmdldAotCi1Nb24gTWFyIDIyIDE0OjU3OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IFJlbG9jYXRlIGVuY2Fwc3VsYXRlZCBzdGFicwotCWlmIHRoZSB0eXBlIGlzIG5vdCBzdE5pbC4KLQotVHVlIE1hciAxNiAxMDozNToyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZWxmMzIuYyAoZWxmX2xpdHRsZV92ZWMsIGVsZl9iaWdfdmVjKTogRGVsZXRlIG5vdy1pbnZhbGlkCi0JZm9yd2FyZCBkZWNsYXJhdGlvbnMuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IERvbid0IHVzZSBDT05TVCBoZXJlLAotCWl0J3MgaW1wbGllZCBieSB0aGUgdHlwZS4KLQotRnJpIE1hciAxMiAxODo1ODowOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiByZWNvZ25pemUgc3BhcmMtc3VuLXNvbGFyaXMyKiBpbnN0ZWFkIG9mIHNwYXJjLXN1bi1zb2xhcmlzKgotCi1UdWUgTWFyICA5IDA5OjIzOjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiByczYwMDAtY29yZS5jOiBBZGQgLmxkaW5mbyBzZWN0aW9uLgotCi1GcmkgTWFyIDEyIDExOjU3OjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1BS0VPVkVSUklERVMpOiBEZWZpbmUgdG8gYmUgZW1wdHkuCi0KLUZyaSBNYXIgMTIgMDg6MzI6MTEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogd2hpdGVzcGFjZQotCSogc2VjbGV0LmMgKHNlY2xldF9kdW1wX3NlY2xldCk6IERvbid0IHRyeSBhbmQgZmlsbCBzZWN0aW9ucyB3aXRoCi0Jbm8gY29udGVudHMuCi0KLVRodSBNYXIgMTEgMTk6MjY6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9nbzMyLmg6IGRvbid0IGRlZmluZSBQT1NJWF9VVElNRQotCi1UdWUgTWFyICA5IDEwOjUyOjAxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYzMi5jIChlbGZfb2JqZWN0X3ApOiAgVXNlIEVMRl9BUkNIIHN0b3JlZCBpbiB4dmVjIHRvIG1hdGNoCi0JYWdhaW5zdCBtYWNoaW5lIGFyY2hpdGVjdHVyZSBzdG9yZWQgaW4gdGhlIEVMRiBoZWFkZXIsIHRvIHJlc29sdmUKLQlhbWJpZ3VpdGllcy4KLQkqIGVsZjMyLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBCZmRfbWFrZV9zZWN0aW9uIGNhbiByZXR1cm4KLQlOVUxMLCBzbyBvbmx5IHVzZSByZXN1bHRzIHdoZW4gbm9uLU5VTEwuCi0JKiB0YXJnZXRzLmMgKGVsZjMyX202OGtfdmVjLCBlbGYzMl9pODYwX3ZlYyk6ICBBZGQgZXh0ZXJuIGRlY2xzCi0JYW5kIGFkZCB0byB2ZWN0b3Igb2YgdGFyZ2V0cy4KLQotTW9uIE1hciAgOCAxNToxMzo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBFbmNhcHN1bGF0ZWQgU1RBQlMgc3ltYm9scwotCWFyZSBhbHdheXMganVzdCBkZWJ1Z2dpbmcgc3ltYm9scy4KLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX1tnc11ldF9zeW1faW5kZXgpOiBNb3ZlZCBtYWNyb3MgZnJvbSBoZXJlLi4uCi0JbGliZWNvZmYuaCAoZWNvZmZfW2dzXWV0X3N5bV9pbmRleCk6IC4uLnRvIGhlcmUuCi0KLU1vbiBNYXIgIDggMTQ6NTU6MTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBocHBhLmMgKF9QQV9SSVNDX0lEKTogRGVmaW5lZCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkIChlLmcuLCBmb3IKLQlocHV4IDcpLiAgUGF0Y2ggZnJvbSBmcmllZG1hbkBnbnUuYWkubWl0LmVkdS4KLQkoaHBwYV9vYmplY3RfcCk6IE9ubHkgY2hlY2sgZm9yIERMX01BR0lDIGFuZCBTSExfTUFHSUMgaWYgdGhleSdyZQotCWRlZmluZWQsIHdoaWNoIHRoZXkgYXJlbid0IGluIGhwdXggNy4wLgotCi0JKiBhaXgzODYtY29yZS5jOiBJbmNsdWRlIHVpbmZvLmggYW5kIGNvcmVkdW1wLmguICBQYXRjaCBmcm9tIE1pbmgKLQlUcmFuLUxlLCB0cmFubGVAaW50ZWxsaWNvcnAuY29tLgotCi1GcmkgTWFyICA1IDE0OjU0OjIxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX2dlbmVyaWNfcmVsb2MpOiBJZiB0aGUgYWRkZW5kIGlzIG5vbi16ZXJvLCBnbwotCWFoZWFkIGFuZCBkbyB0aGUgcmVsb2NhdGlvbi4KLQkoZWNvZmZfcmVmaGlfcmVsb2MpOiBEb24ndCB0byB0aGUgcmVsb2NhdGlvbiBoZXJlLCBqdXN0IHJlbWVtYmVyCi0Jd2hhdCBuZWVkcyB0byBiZSBkb25lLgotCShlY29mZl9yZWZsb19yZWxvYyk6IERvIHRoZSBSRUZISSByZWxvY2F0aW9uIGhlcmUuCi0KLVRodSBNYXIgIDQgMTQ6NDQ6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBBZGRlZCBCRkRfQVNTRVJUIGNhbGxzIHRvIGVuc3VyZQotCXJlbG9jcyBhcmUgcmVhc29uYWJsZS4KLQkqIGNvZmYtbXN5bS5jOiBFbGltaW5hdGVkIHVzZXMgb2YgREVGVU4uCi0JKGVjb2ZmX3N3YXBfdGlyX291dCk6IE5ldyBmdW5jdGlvbi4KLQotVHVlIE1hciAgMiAxNzo1Mjo1OCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCShVbHRyaXggMi4yIHN1cHBvcnQgZnJvbSBNaWNoYWVsIFJlbmRlbGwgPG1pY2hhZWxAbWVyY3VyeS5jcy5tdW4uY2E+KQotCSogY29uZmlndXJlLmhvc3QgKHZheC0qLXVsdHJpeDIqKTogIEFkZCB0cmlwbGV0LgotCSogaG9zdHMvdmF4dWx0Mi5oOiAgTmV3IGZpbGUuCi0JKiBjb25maWcvdmF4dWx0Mi5taDogIE5ldyBmaWxlLgotCi0JKiBhb3V0eC5oIChzdHJpbmcuaCk6ICBJbmNsdWRlIGZvciBzdHJjaHIgYW5kIGZyaWVuZHMuCi0JKiBhcmNoaXZlLmMgKHN0cmluZy5oKTogIEluY2x1ZGUgZm9yIG1lbWNociBhbmQgZnJpZW5kcy4KLQkqIGVsZjMyLmMgKHN0cmluZy5oKTogIEluY2x1ZGUgZm9yIHN0cnJjaHIgYW5kIGZyaWVuZHMuCi0KLVNhdCBGZWIgMjcgMDA6NDQ6MjQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuYyAoc3Vub3M0X3JlbG9jX3R5cGVfbG9va3VwKTogVW51c2VkOyBkZWxldGVkLgotCShNWV9zZXRfc2l6ZXMpOiBVc2Ugc3Vub3M0X3NldF9zaXplcy4KLQotCSogZWxmMzIuYzogUmVuYW1lZCBmcm9tIGVsZi5jLiAgU2V2ZXJhbCBDUFUtc3BlY2lmaWMgZnVuY3Rpb25zCi0JZGVsZXRlZCwgYXMgd2VsbCBhcyBlbGYtYmlnIGFuZCBlbGYtbGl0dGxlIHRhcmdldHMuCi0JKiBsaWJlbGYuaDogTmV3IGZpbGUuCi0JKiBlbGYzMi1zcGFyYy5jLCBlbGYzMi1pMzg2LmMsIGVsZjMyLWk4NjAuYywgZWxmMzItbTY4ay5jOiBOZXcKLQlmaWxlcywgbmV3IHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnLyotZWxmLm10LCB0YXJnZXRzLmM6IEFkanVzdGVkLgotCi0JKiBpMzg2bGludXguYyAoVEFSR0VUTkFNRSk6IFVzZSBoeXBoZW5zIGluc3RlYWQgb2YgcGFyZW50aGVzZXMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRG9uJ3QgbmVlZAotCXZhcmlhYmxlICJvbGRfc29mYXIiIGlmIGNvbXBpbGluZyBmb3IgaTk2MC4KLQotCSogcmVsb2MuYyAoYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXApOiBGaXJzdCBhcmd1bWVudCBpcyBub3cgYQotCWJmZCBwb2ludGVyLgotCSogbGliYmZkLmg6IFVwZGF0ZWQuCi0KLQkqIGllZWUuYyAoZXh0ZW4sIGVudmkpOiAic3RhdGljIiBiZWxvbmdzIGZpcnN0IGluIGRlY2xhcmF0aW9uLgotCi1GcmkgRmViIDI2IDE3OjM3OjM0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzcmVjLmM6IGFkZCBzdXBwb3J0IGZvciBzeW1ib2xzcmVjLCBzcmVjb3JkcyB3aXRoIHN5bWJvbHMgaW4KLQl0aGVtLgotCi1UaHUgRmViIDI1IDExOjQzOjMwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjYWNvcGhvbnkuY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jOiAgY2FzdCBhbGwgYXJndW1lbnRzIG9mIGllZWVfd3JpdGVfYnl0ZSB0byBiZmRfYnl0ZQotCXRvIGF2b2lkIGxpbnQgY29tcGxhaW50cy4KLQotVGh1IEZlYiAyNSAwMjoxNTo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2VjdGlvbiAiLnNoc3RydGFiIiBzaG91bGQgYmUKLQl0eXBlIFNIVF9TVFJUQUIuICBEb24ndCBhbHRlciBmaWxlIG9mZnNldCBmb3Igc2VjdGlvbiAwLgotCShyZWxvY190eXBlX25hbWVzKTogTm93IGFuIGFycmF5IGluc3RlYWQgb2YgYSBtYWNyby4gIFN0aWxsIGluc2lkZQotCSIjaWYgMCIsIHNpbmNlIGl0J3MgdXNlZCBvbmx5IGluIGRlYnVnZ2luZyBjb2RlIGFsc28gaW4gIiNpZiAwIi4KLQkoc3RydWN0IGVsZl9yZWxvY19tYXBfZWx0LCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IE5ldyB0eXBlcy4KLQkoc29ydF9yZWxvY19tYXApOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX3JlbG9jX21hcCk6IE5ldyB2YXJpYWJsZS4KLQkoZWxmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQotVHVlIEZlYiAyMyAxMjoxNzoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogQWRkZWQgYmZkX3JlbG9jX3R5cGVfbG9va3VwIGFuZAotCWJmZF9tYWtlX2RlYnVnX3N5bWJvbDsgdGhleSB3ZXJlIGFscmVhZHkgaW4gdGhlIHRhcmdldCBzdHJ1Y3R1cmUuCi0JKiBBZGp1c3RlZCBhbGwgdXNlcyBvZiBKVU1QX1RBQkxFLgotCSogY29mZmdlbi5jLCBsaWJjb2ZmLWluLmggKGNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sKTogUmVuYW1lZAotCWZyb20gY29mZl9tYWtlX2RlYnVnX3N5bWJvbC4KLQkqIGxpYmNvZmYuaDogVXBkYXRlZCBhY2NvcmRpbmdseS4KLQotCSogTWlub3IgY2xlYW51cHMgcHJvdm9rZWQgYnkgZ2NjIHdhcm5pbmdzOgotCSogYW91dHguaCAoTkFNRShhb3V0LCByZWxvY190eXBlX2xvb2t1cCkpLAotCWNwdS1oODMwMC5jIChsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXApLAotCWNwdS16OGsuYyAobG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkZWQgZGVmYXVsdCBjYXNlIHRvCi0Jc3dpdGNoZXMuCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2JzZF9hcm1hcCwgZG9fc2x1cnBfY29mZl9hcm1hcCksCi0JaWVlZS5jIChpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSksCi0JZWxmLmMgKGVsZl9tYWtlX3NlY3Rpb25zLCBlbGZfZmFrZV9zZWN0aW9ucywKLQllbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLCBlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKToKLQlSZW1vdmVkIHVudXNlZCB2YXJpYWJsZXMuCi0JKiBhcmNodXJlcy5jOiBSZW1vdmVkIC8qIGZyb20gd2l0aGluIGNvbW1lbnQuCi0JKiBib3V0LmMgKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKTogSW5pdGlhbGl6ZSByX2V4dGVybi4KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX2RhdGEpOiBJbml0aWFsaXplIGkuCi0KLU1vbiBGZWIgMjIgMTg6NDA6MDYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsaWJjb2ZmLmggKG9ial9yYXdfc3ltZW50X2NvdW4pOiAgTmV3IG1hY3JvLgotCSogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6ICBJbml0aWFsaXplCi0JcmF3X3N5bWVudF9jb3VudC4KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6ICBOdW1lcm91cyBsaXR0bGUgZml4ZXMuCi0KLU1vbiBGZWIgMjIgMTU6MDM6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogc3RCbG9jayBzeW1ib2xzIGFyZSBhbHdheXMKLQlkZWJ1Z2dpbmcgc3ltYm9scy4KLQkoZWNvZmZfZ2V0X2RlYnVnKTogT2Zmc2V0IHRoZSBmZHIgYWRyIGJ5IHRoZSBhZHIgb2YgdGhlIGZpcnN0IHBkciwKLQlmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRvb2xzIGZyb20gTUlQUy4KLQotCSogY29uZmlnL2JpZ21pcHMubXQ6IE5ldyBmaWxlOyBkZWZhdWx0IHZlY3RvciBpcyBlY29mZl9iaWdfdmVjLgotCSogY29uZmlnL2lyaXgzLm10LCBjb25maWcvaXJpeDQubXQ6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1lY29mZik6IE5ldyB0YXJnZXQ7IHVzZXMgYmlnbWlwcy5tdC4KLQkobWlwcy1zZ2ktKiwgbWlwcy1iaWctKik6IFVzZSBiaWdtaXBzIHJhdGhlciB0aGFuIGlyaXgzLgotCi1XZWQgRmViIDE3IDIzOjQwOjQxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBob3N0cy9ocDMwMGJzZC5oOiAgQWRkIGdyb3NzIGhhY2sgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UKLQlhcmUgcnVubmluZyBvbiBCU0QgNC4zIG9yIEJTRCA0LjQsIGFuZCB1c2UgYXBwcm9wcmlhdGUgaW5jbHVkZQotCWZpbGVzIChhbmQgc2V0IG90aGVyIHBhcmFtZXRlcnMpIHRvIG1hdGNoLgotCi1XZWQgRmViIDE3IDEyOjI4OjEzIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X21ha2VfZW1wdHlfc3ltYm9sKTogd3JhcCBQQVJBTVMgYXJvdW5kIGFuCi0JICBhbnNpIGRlZmluaXRpb24gd2hpY2ggb3RoZXJ3aXNlIGNvbmZ1c2VzIG5vbi1hbnNpIGNvbXBpbGVycy4KLQotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX29iamVjdF9wKTogZWxpbWluYXRlIGEgd2FybmluZyBmcm9tIHZheAotCSAgdWx0cml4IGNjIGJ5IGZvcndhcmQgZGVjbGFyaW5nIGdldGVudiBhcyBpcyBkb25lIGluCi0JICBiZmRfZmluZF90YXJnZXQuCi0KLVR1ZSBGZWIgMTYgMTc6NTY6NTggMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfaW5mb190b19ob3d0byk6IGNhc3QgYW4gZW51bSBpbnRvIHVuc2lnbmVkIGNoYXIKLQkgIGF2b2lkaW5nIGEgZmF0YWwgZXJyb3IgaW4gdmF4IHVsdHJpeCA0LjIgY2MuCi0KLVR1ZSBGZWIgMTYgMDA6NDQ6NTQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oLCBWRVJTSU9OOiAgUm9sbCB0byB2ZXJzaW9uIDIuMS4KLQotTW9uIEZlYiAxNSAyMDo0Mzo1MSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIExpbnQuCi0JKiBzcmVjLmM6ICBXaGl0ZXNwYWNlIGNsZWFudXAuCi0KLUZyaSBGZWIgMTIgMTQ6MjM6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogUHJpbnQgY29ycmVjdCB0YWduZHggdmFsdWU7Ci0JY2xlYW5lZCB1cCBvdXRwdXQgZm9ybWF0dGluZyBhIGJpdC4KLQotRnJpIEZlYiAxMiAwODoyODo1NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiAqRklYTUUqIHRoZSBIOC8zMDAgaXMgYWx3YXlzCi0JcmVsYXhhYmxlLiAgU2hvdWxkIGJlIG1vdmVkIHNvbWV3aGVyZSBlbHNlLgotCi1UaHUgRmViIDExIDE0OjA5OjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYW91dC1taXBzYnNkLmM6IEVsaW1pbmF0ZWQgdXNlcyBvZiBERUZVTi4KLQkoYW91dF9taXBzXypfdmVjKTogQWRkZWQgc2VjbGV0X2xpbmsgZWxlbWVudC4KLQotCSogTWFrZWZpbGUuaW4gKEJGRF9CQUNLRU5EUywgQ0ZJTEVTLCBhb3V0LW1pcHNic2Qubyk6IEFkZGVkCi0Jc3VwcG9ydCBmb3IgYW91dC1taXBzYnNkIHRhcmdldC4KLQotCSogYm91dC5jIChnZXRfdmFsdWUpOiBEb24ndCB0cnVuY2F0ZSAzMi1iaXQgYWRkZW5kIHRvIDE2IGJpdHMuCi0KLUZyaSBGZWIgIDUgMDg6MDg6NDMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNwdS1oODUwMC5jIChzY2FuX21hY2gpOiByZXR1cm4gZmFsc2UgaWYgaXQncyBub3QgYW4gSDgvNTAwCi0KLVRodSBGZWIgIDQgMTI6NTI6NDAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQlBZGQgc3VwcG9ydCBmb3IgdGhlIEg4LzUwMAotCi0JKiBjb2ZmLWg4NTAwLmMsIGNwdS1oODUwMC5jLCBhcmNodXJlcy5jLCBjb2ZmY29kZS5oLCB0YXJnZXRzLmMKLQotVGh1IEZlYiAgNCAxMjozNTowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpYmVjb2ZmLmg6IE5ldyBmaWxlLiAgRGVmaW5lcyBFQ09GRiBiYWNrZW5kIGRhdGEgZm9yIGdkYi4KLQkqIGNvZmYtbWlwcy5jOiBOb3cgaW5jbHVkZXMgbGliZWNvZmYuaC4KLQkoZWNvZmZfZGF0YV90eXBlKTogTW92ZWQgdG8gbGliZWNvZmYuaC4KLQkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IE1hZGUgZ2xvYmFsbHkgdmlzaWJsZSBzbyB0aGF0IGdkYiBjYW4KLQljYWxsIGl0LiAgSWYgdGhlcmUgaXMgZXZlciBhbm90aGVyIEVDT0ZGIHRhcmdldCwgdGhpcyBhbmQgdGhlCi0Jc3dhcHBpbmcgZnVuY3Rpb25zIHNob3VsZCBiZSBhY2Nlc3NlZCB2aWEgYW4gRUNPRkYgc3BlY2lmaWMgdGFyZ2V0Ci0JdmVjdG9yLgotCSogTWFrZWZpbGUuaW4gKGNvZmYtbWlwcy5vKTogRGVwZW5kcyBvbiBsaWJlY29mZi5oLgotCi1XZWQgRmViICAzIDA5OjE0OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogUmVtb3ZlZCBNSVBTIHNwZWNpZmljIGluZm9ybWF0aW9uLCBzaW5jZSBjb2ZmLW1pcHMuYwotCW5vIGxvbmdlciBpbmNsdWRlcyB0aGlzIGZpbGUuCi0KLQkqIGNvZmYtbXN5bS5jIChlY29mZl9zd2FwX2Zkcl9pbiwgZWNvZmZfc3dhcF9leHRfaW4pOiBTZXQgcmVzZXJ2ZWQKLQliaXRzIHRvIDAgdG8gbWFrZSBjb21wYXJpc29uIHRlc3QgdXNlZnVsLgotCi0JKiBjb25maWcvaXJpeDMubWgsIGNvbmZpZy9pcml4NC5taCAoSERFRklORVMpOiBTZXQgdG8gLUcgNCB0bwotCWF2b2lkIG92ZXJmbG93aW5nIEdQIGFjY2Vzc2libGUgc2VjdGlvbnMgaW4gYmludXRpbHMvb2JqZHVtcC4KLQotVHVlIEZlYiAgMiAxNTozNjo1NSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiAgTWFkZSBzeW1ib2wKLQlyZWFkaW5nIG1vcmUgcm9idXN0OiAgRmFpbCBpZiBzdHJpbmcgaW5kZXggaXMgb3V0IG9mIHN0cmluZwotCXRhYmxlIHJhbmdlLgotCi1UdWUgRmViICAyIDExOjQzOjI1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMsIGNhc2VzIFBDUkVMMjQgYW5kCi0JUENSRUwxMyk6IERvbid0IHRha2UgZHN0X2FkZHJlc3MgaW50byBhY2NvdW50OyB0aGUgaW5wdXQgZmlsZSBoYXMKLQlhbHJlYWR5IHRha2VuIGNhcmUgb2YgdGhhdC4KLQotVHVlIEZlYiAgMiAxMTo0MTowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jOiBDb21wbGV0ZWQgc3VwcG9ydCBmb3IgbGlua2VyIGFuZCBiaW51dGlscy4KLQotTW9uIEZlYiAgMSAxNDo0NTozOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLCBjYXNlIEFCUzMyKTogS2VlcAotCW9yaWdpbmFsIGFkZGVuZCBmcm9tIHNlY3Rpb24gY29udGVudHMuCi0KLVRodSBKYW4gMjggMjE6MDE6MzcgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlGaXggbWlub3IgYnVncyByZXBvcnRlZCBieSBDYXJsIEdyZWNvLCA8Y2dyZWNvQHBhcnJvdC5jcmVpZ2h0b24uZWR1PjoKLQkqIGhvc3RzL2RlbHRhODguaCAoc3RydG9sKTogIEZpeCBwcm90b3R5cGUuCi0JKiBjb25maWcvbTg4ay1jb2ZmLm10IChTRUxFQ1RfQVJDSElURUNUVVJFUyk6ICBGaXggbmFtZS4KLQotV2VkIEphbiAyNyAxNzoxNjo1MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiBHZXQgcmlkIG9mICIjaWZkZWYgc3BhcmMiLgotCShSRUxPQ19UWVBFX05BTUVTKTogTmV2ZXIgdXNlZCAoY3VycmVudGx5KSwgc28gZG9uJ3QgaW5jbHVkZSBpdC4KLQkoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogUmVuYW1lZCBmcm9tIGVsZl9ob3d0b190YWJsZSwgYW5kIGFsd2F5cwotCXVzZWQuCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogVXNlIHJ1bnRpbWUgY29uZGl0aW9uYWxzIG9uIENQVSB0eXBlLCBub3QKLQljb21waWxlIHR5cGUgY29uZGl0aW9uYWxzIG9uIGhvc3QgQ1BVLgotCShlbGZfbGl0dGxlX3ZlYywgZWxmX2JpZ192ZWMpOiBVc2UgYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAsCi0Jbm90IG51bGwgcG9pbnRlci4KLQkocmVsb2NfdHlwZSwgUkVMT0NfVFlQRV9OQU1FUyk6IEluY2x1ZGUgaTM4NiB2YWx1ZXMuCi0KLVR1ZSBKYW4gMjYgMTE6NDM6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNFQ19JU19DT01NT04pOiBOZXcgc2VjdGlvbiBmbGFnLCBuZWVkZWQgZm9yIE1JUFMKLQlFQ09GRiB3aGljaCBoYXMgdHdvIGNvbW1vbiBzZWN0aW9ucy4KLQkoYmZkX2NvbV9zZWN0aW9uKTogU2V0IFNFQ19JU19DT01NT04gZmxhZy4KLQkqIGJmZC1pbi5oIChiZmRfaXNfY29tX3NlY3Rpb24pOiBOZXcgbWFjcm8gdG8gdGVzdCBTRUNfSVNfQ09NTU9OLgotCSogYW91dHguaCwgYXJjaGl2ZS5jLCBib3V0LmMsIGNvZmYtYTI5ay5jLCBjb2ZmLW04OGsuYywKLQljb2ZmLW1pcHMuYywgY29mZmdlbi5jLCBpZWVlLmMsIG9hc3lzLmMsIHJlbG9jLmMsIHN5bXMuOiBVc2UKLQliZmRfaXNfY29tX3NlY3Rpb24gbWFjcm8gcmF0aGVyIHRoYW4gY2hlY2tpbmcgZm9yIGVxdWFsaXR5IHRvCi0JYmZkX2NvbV9zZWN0aW9uLgotCi1Nb24gSmFuIDI1IDE1OjI3OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoX2JmZF9jb2ZmX21rb2JqZWN0X2hvb2spOiBQYXNzIGFvdXRoZHIgYXJndW1lbnQuCi0JKGNvZmZfbWtvYmplY3RfaG9vayk6IEFjY2VwdCBhb3V0aGRyIGFyZ3VtZW50LgotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBQYXNzIGFvdXRoZHIgdG8gbWtvYmplY3RfaG9vay4KLQlIYW5kbGUgTlVMTCBhb3V0aGRyIGFyZ3VtZW50LgotCShjb2ZmX29iamVjdF9wKTogSWYgdGhlcmUgaXMgbm8gYW91dGhkciwgcGFzcyBpdCBhcyBOVUxMIHRvCi0JY29mZl9yZWFsX29iamVjdF9wLgotCSogbGliY29mZi5oOiBSZWJ1aWx0IGZvciBta29iamVjdF9ob29rIGNoYW5nZXMuCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luLCBjb2ZmX3N3YXBfYW91dGhkcl9pbik6IFN3YXAKLQlhZGRpdGlvbmFsIE1JUFMgRUNPRkYgZmllbGRzLgotCi1TYXQgSmFuIDIzIDE4OjM2OjIwIFBTVCAxOTkzICBSYWxwaCBDYW1wYmVsbCAgKHJhbHBoY0BweXJhbWlkLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6IGFkZGVkIG1pcHMtZGVjLWJzZCoKLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgbWlwcy1kZWMtYnNkKgotCSogYW91dC1taXBzYnNkLmM6IG5ldyBmaWxlIGZvciBtaXBzLWRlYy1ic2QqCi0JKiBhb3V0LXRhcmdldC5oOiBkb24ndCBkZWZpbmUgJycgaWYgJ01ZX0JGRF9UQVJHRVQnIGlzIGRlZmluZWQuCi0JKiBhb3V0eC5oOiBhZGRlZCBtaXBzIHN1cHBvcnQuCi0JKiBhcmNodXJlcy5jOiBhZGRlZCBtaXBzIHN1cHBvcnQgdG8gYmZkX2RlZmF1bHRfc2NhbigpLgotCSogY3B1LW1pcHMuYzogYWRkZWQgc3VwcG9ydCBmb3IgUjQwMDAgKHVudGVzdGVkKS4KLQkqIGxpYmFvdXQuaDogYWRkZWQgTUlQUzEgJiBNSVBTMiBtYWdpYyBudW1iZXJzLgotCSogcmVsb2MuYzogZml4IHR5cG8ncyBpbiBjb21tZW50cy4gQWRkZWQgQkZEX1JFTE9DIGVudHJpZXMgd2hpY2ggSQotCQlob3BlIHdpbGwgbWFrZSBpdCBpbnRvIGluY2x1ZGUvYmZkLmguCi0JKiB0YXJnZXRzLmM6IGFkZGVkIGFvdXRfbWlwc18qX3ZlYy4KLQotV2VkIEphbiAyMCAxNzoxNTo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWNzdGF0aW9uLm10OiBTZXQgREVGQVVMVF9WRUNUT1IgdG8gZWNvZmZfbGl0dGxlX3ZlYy4KLQotVHVlIEphbiAxOSAwOTowNjoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChiZmRfYXN5bWJvbF92YWx1ZSk6IEFkZCBuZWVkZWQgcGFyZW50aGVzZXMuCi0KLQkqIGxpYmNvZmYtaW4uaDogVXBkYXRlIHByb3RvdHlwZSBmb3IgY29mZl9jb3VudF9saW5lbnVtYmVycy4KLQotRnJpIEphbiAxNSAxODoxMzoxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbXN5bS5jIChlY29mZl9zd2FwX2hkcl9vdXQsIGVjb2ZmX3N3YXBfZmRyX291dCwKLQllY29mZl9zd2FwX3Bkcl9vdXQsIGVjb2ZmX3N3YXBfc3ltX291dCwgZWNvZmZfc3dhcF9leHRfb3V0LAotCWVjb2ZmX3N3YXBfcm5keF9vdXQsIGVjb2ZmX3N3YXBfcmZkX291dCwgZWNvZmZfc3dhcF9vcHRfaW4sCi0JZWNvZmZfc3dhcF9vcHRfb3V0LCBlY29mZl9zd2FwX2Rucl9pbiwgZWNvZmZfc3dhcF9kbnJfb3V0KTogTmV3Ci0JZnVuY3Rpb25zLgotCSogY29mZnN3YXAuaDogSWYgTk9fQ09GRl9SRUxPQ1MgaXMgZGVmaW5lZCwgZG9uJ3QgZGVmaW5lCi0JYmZkX3N3YXBfcmVsb2NfaW4gb3IgY29mZl9zd2FwX3JlbG9jX291dC4KLQkqIGNvZmYtbWlwcy5jOiBBZGRlZCBjb2RlIHRvIGxpbmsgYW5kIHdyaXRlIG91dCBzeW1ib2xpYyBkZWJ1Z2dpbmcKLQlpbmZvcm1hdGlvbiwgYW5kIHRvIHN3YXAgcmVsb2NzIGluIGFuZCBvdXQuCi0KLVRodSBKYW4gMTQgMTU6NTE6NTggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxpYmNvZmYuaCwgY29mZmdlbi5jIChjb2ZmX2NvdW50X2xpbmVudW1iZXJzKSwgY29mZmNvZGUuaAotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IGNvZmZfY291bnRfbGluZW51bWJlcnMgcmV0dXJucyB0aGUKLQludW1iZXIgb2YgbGluZSBudW1iZXIgcmVjb3JkcyBpdCBmb3VuZC4KLQotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX2xpbmVudW1iZXJzKTogb25seSB3cml0ZSBvdXQgbGluZSBudW1iZXJzCi0JaW4gdGhlIHNlY3Rpb24gdGhleSBiZWxvbmcgdG8uCi0KLU1vbiBKYW4gMTEgMTg6MzI6MjIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGRlZCByZWxvY2F0ZWFibGUgYXJndW1lbnQgdG8KLQlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cy4gIEFkZGVkIF9iZmRfc2VjbGV0X2xpbmsKLQl0YXJnZXQgdmVjdG9yIGZvciBsaW5rZXIgdXNlLgotCSogYmZkLmMgKGJmZF9zZWNsZXRfbGluayk6IE5ldyBtYWNyby4KLQkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogQWRkZWQgX2JmZF9zZWNsZXRfbGluay4KLQkqIHNlY2xldC5jIChyZWwsIHNlY2xldF9kdW1wX3NlY2xldCk6IEFkZGVkIHJlbG9jYXRlYWJsZSBhcmd1bWVudAotCWFuZCBib29sZWFuIHJldHVybiB2YWx1ZS4gIE1hZGUgc3RhdGljLgotCShiZmRfZ2VuZXJpY19zZWNsZXRfbGluayk6IFJlbmFtZWQgZnJvbSBzZWNsZXRfZHVtcC4gIEFkZGVkCi0JcmVsb2NhdGVhYmxlIGFyZ3VtZW50LgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogQWRkZWQKLQlyZWxvY2F0ZWFibGUgYXJndW1lbnQgKGlmIHJlbG9jYXRlYWJsZSwgc2F2ZXMgcmVsb2NzKS4KLQkqIGJvdXQuYyAoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSwKLQlyZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogQWRkZWQKLQlyZWxvY2F0ZWFibGUgYXJndW1lbnQgKGlmIHJlbG9jYXRlYWJsZSwganVzdCBjYWxscwotCWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cykuCi0JKiBsaWJjb2ZmLWluLmggKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKTogQWRkZWQgcmVsb2NhdGVhYmxlCi0JYXJndW1lbnQgdG8gcHJvdG90eXBlLgotCSogQWxsIHRhcmdldHM6IFNldCBuZXcgX2JmZF9zZWNsZXRfbGluayB2ZWN0b3IgdG8KLQliZmRfZ2VuZXJpY19zZWNsZXRfbGluay4KLQotU2F0IEphbiAgOSAyMToyOTozMiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmM6ICAjaW5jbHVkZSBzZWNsZXQuaC4KLQotU2F0IEphbiAgOSAxOTo0ODoxNCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBocHBhLmMgKGhwcGFfb2JqZWN0X3NldHVwKTogIEdldCByaWQgb2YgYWxsIGtub3dsZWRnZSBvZiBzdGFicwotCWRlYnVnIGluZm8uICBTZXR1cCBpbmZvIGFib3V0IGxpbmtlciBzeW1ib2xzIG9ubHksIGFuZCB1c2UKLQlzdGFuZGFyZCBiZmQgZmllbGRzIHRvIGhvbGQgdGhlIGluZm8uCi0JKiAoaHBwYV9vYmplY3RfcCk6ICBSZW1vdmUgdW5uZWVkZWQgZGVjbHMuCi0JKiAoaHBwYV9uZXdfc2VjdGlvbl9ob29rKTogIEdldCByaWQgb2YgbW9zdCBvZiB0aGlzLgotCSogbGliaHBwYS5oIChzdHJ1Y3QgaHBwYWRhdGEpOiAgUmVtb3ZlIHRlbiBwb3VuZHMgb2YgdXNlbGVzcyB1Z2x5Ci0JZmF0LiAgUmVtb3ZlIGFsbCBrbm93bGVkZ2Ugb2Ygc3RhYnMsIHJlbW92ZSByZWR1bmRhbnQga25vd2xlZGdlIG9mCi0JbGlua2VyIHN5bWJvbHMuCi0JKiBSZW1vdmUgbWFjcm9zIGZvciBhY2Nlc3NpbmcgZmllbGRzIHdoaWNoIGFyZSBub3cgZ29uZS4KLQotRnJpIEphbiAgOCAxNToyMDowMCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBhbGxvdyBTRUNfTkVWRVJfTE9BRCB0byB0dXJuIG9uCi0JU1RZUF9OT0xPQUQgYml0LgotCSogY29mZi16OGsuYzogZGVsZXRlIHVudXNlZCByZWxvYyBmdW5jdGlvbnMKLQotRnJpIEphbiAgOCAxNTo0Nzo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZGVkIGVjb2ZmX3RkYXRhIHRvIHRkYXRhIHVuaW9uLgotCSogdGFyZ2V0cy5jIChlbnVtIHRhcmdldF9mbGF2b3VyKTogQWRkZWQgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLgotCSogY29mZi1tc3ltLmM6IFVzZSBERUZVTiBmb3IgZnVuY3Rpb24gZGVmaW5pdG9ucy4KLQkqIGNvZmYtbWlwcy5jOiBBZGRlZCBjb2RlIHRvIHJlYWQgYW5kIHByaW50IHN5bWJvbHMsIGFuZCB0byBmaW5kCi0JbGluZSBudW1iZXJzLgotCi0JKiBjb2ZmY29kZS5oOiBNb3ZlZCBtYW55IGdlbmVyaWMgZnVuY3Rpb25zIGludG8gY29mZmdlbi5jLiAgTW92ZWQKLQlzd2FwcGluZyBmdW5jdGlvbnMgaW50byBjb2Zmc3dhcC5oIGZvciBFQ09GRiB1c2UuICBNb3ZlZAotCXJlbG9jYXRpb24gZnVuY3Rpb25zLCBvbmx5IHVzZWQgYnkgaDgzMDAgYW5kIHo4aywgaW50byByZWxvYzE2LmMuCi0JQWRkZWQgaG9va3MgZm9yIGNvZmZnZW4uYyBmdW5jdGlvbnMgdG8gYmFja2VuZCBkYXRhIHN0cnVjdHVyZSwgYW5kCi0JYWRkZWQgaG9vayBmdW5jdGlvbnMuICBTdGlsbCBtb3JlIGNvdWxkIGJlIGRvbmUuCi0JKiBjb2Zmc3dhcC5oOiBOZXcgZmlsZSB0byBob2xkIENPRkYgc3dhcHBpbmcgcm91dGluZXMuCi0JKiBjb2ZmZ2VuLmM6IE5ldyBmaWxlIHRvIGhvbGQgZ2VuZXJpYyBDT0ZGIGZ1bmN0aW9ucy4KLQkqIHJlbG9jMTYuYzogTmV3IGZpbGUgdG8gaG9sZCBoODMwMCBhbmQgejhrIHNwZWNpZmljIHJlbG9jYXRpb24KLQlmdW5jdGlvbnMuCi0JKiBsaWJjb2ZmLWluLmg6IEFkZGVkIGRlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIGluIGNvZmZnZW4uYy4KLQkqIGxpYmNvZmYuaDogUmVidWlsdCB0byBpbmNvcnBvcmF0ZSBjaGFuZ2VzLgotCSogY29mZi1oODMwMC5jOiBGdW5jdGlvbiBuYW1lIGNoYW5nZXMuCi0JKiBjb2ZmLXo4ay5jOiBGdW5jdGlvbiBuYW1lIGNoYW5nZXMuICBVc2UgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0JaG9vayByYXRoZXIgdGhhbiBkZWZpbmluZyBFWFRSQV9DQVNFUy4KLQkqIE1ha2VmaWxlLmluOiBCdWlsZCBuZXcgZmlsZXMgY29mZmdlbiBhbmQgcmVsb2MxNi4gIEFkZGVkCi0JZGVwZW5kZW5jaWVzIG9mIGNvZmYtKi5vIG9uIGNvZmZzd2FwLmggYW5kIHNlY2xldC5oLgotCi1UaHUgSmFuICA3IDE2OjE2OjI2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfc2VjdGlvbnMpOiAgQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZwotCWFib3V0IGRpc2NhcmRpbmcgY29uc3QuCi0KLVdlZCBKYW4gIDYgMDA6MTY6NDkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMsIHNlY2xldC5jLCBlbGYuYyB1c2UgYmZkX3htYWxsb2MgaW5zdGVhZCBvZiBtYWxsb2MKLQotVHVlIEphbiAgNSAwOTozNTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocG9zdC10YXJnZXQpOiBJZiAtLXdpdGgtbWluaW1hbC1iZmQgaXMgc3BlY2lmaWVkLAotCXNldCBNSU5JTUlaRT0xLgotCi1Nb24gSmFuICA0IDA3OjIwOjAxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfcmVjb3Jkcyk6IG9uZSBvZiBteSBib2FyZHMgd2FudHMgYSBDUiBiZXR3ZWVuCi0JcmVjb3Jkcy4KLQotV2VkIERlYyAzMCAxMjo0NjozMCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfY29mZl9hcm1hcCk6IHNldCBzeW1kZWZfY291bnQgY29ycmVjdGx5Ci0JKGl0IGJyb2tlIGEgY291cGxlIG9mIHdlZWtzIGFnbykuCi0KLVR1ZSBEZWMgMjkgMjE6NDE6MDUgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYuYyAoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiBTd2l0Y2ggYmFjayB0byAic3RydWN0IC4uLiIgZm9yCi0JcmV0dXJuIHR5cGUsIHNvIGxpYmJmZC5oIGRvZXNuJ3QgcmVmZXJlbmNlIHVuZGVmaW5lZCB0eXBlZGVmbmFtZXMuCi0KLVR1ZSBEZWMgMjkgMTM6NTQ6MzUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiB1c2UgbmFtZSBJMzg2QUlYTUFHSUMgcmF0aGVyCi0JdGhhbiBJMzg2U1ZNQUdJQy4KLQkoY29mZl9wb2ludGVyaXplX2F1eCk6IGRvbid0IHBvaW50ZXJpemUgYSBuZWdhdGl2ZSB0YWduZHgKLQkoc29tZXRpbWVzIGdlbmVyYXRlZCBieSBTQ08gMy4ydjQgY2MpLgotCi0JKiBib3V0LmMgKGNhbGxqeF9jYWxsYmFjaywgY2FsbGpfY2FsbGJhY2ssCi0JYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogd2FybiBpZiByZWxvY2F0aW5nIGFnYWluc3QKLQlhbiB1bmRlZmluZWQgc3ltYm9sLgotCi1Nb24gRGVjIDI4IDE0OjMwOjU1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYzogIEdldCByaWQgb2YgREVGVU4sIHVzZSBtb3JlIGNvbnZlbnRpb25hbCBwcm9sb2cgc3R1ZmYuCi0JTWFrZSBhIGJ1bmNoIG1vcmUgcm91dGluZXMgYmUgc3RhdGljLgotCSogaHBwYS5jIChmaWxsX3NwYWNlcyk6ICBHZXQgcmlkIG9mIHRoaXMsIHJlcGxhY2Ugd2l0aCBtdWNoIGJldHRlcgotCXdyaXR0ZW4gc2V0dXBfc2VjdGlvbnMoKS4KLQkqIChzZXR1cF9zZWN0aW9ucyk6ICBOZXcgcm91dGluZSB0byBjcmVhdGUgQkZEIHNlY3Rpb25zIGZvciBlYWNoCi0Jc3BhY2UgYW5kIHN1YnNwYWNlIGluIFNPTSBmaWxlcy4KLQkqIChocHBhX29iamVjdF9zZXR1cCk6ICBVc2UgQkZEIHNlY3Rpb25zIGNyZWF0ZWQgYnkKLQlzZXR1cF9zZWN0aW9ucygpIHRvIGxvY2F0ZSBHREIgc3ltYm9sIHRhYmxlIGluZm8uCi0JKiAobWFrZV91bmlxdWVfc2VjdGlvbik6ICBOZXcgcm91dGluZSB0byBjcmVhdGUgYSBCRkQgc2VjdGlvbi4gIEl0Ci0JZW5zdXJlcyB0aGF0IHRoZSBnaXZlbiBuYW1lIGlzIHVuaXF1ZSwgYW5kIHdpbGwgZ2VuZXJhdGUgYSB1bmlxdWUKLQlvbmUgaWYgbmVjZXNzYXJ5LgotCSogKGhwcGFfb2JqZWN0X3ApOiAgQmVjb21lIG11Y2ggbW9yZSBwYXJhbm9pZCBhYm91dCBmaWxlIGhlYWRlci4KLQkqIChtYWtlX2JmZF9hc2VjdGlvbik6ICBDYWxsIGJmZF9tYWtlX3NlY3Rpb24gdG8gZG8gdGhlIGRpcnR5Ci0Jd29yay4gIFNpbXBsaWZ5IGNvZGUgc29tZXdoYXQuCi0JKiAoaHBwYV9jb3JlX2ZpbGVfcCk6ICBVc2UgcHJvcGVyIG5hbWUgZm9yIHN0YWNrIHNlY3Rpb24uCi0JKiBsaWJocHBhLmg6ICBSZW1vdmUgbWlsbGljb2RlX3N0YXJ0LCBtaWxsaWNvZGVfZW5kIGRlY2xzLgotCi1Nb24gRGVjIDI4IDExOjAzOjIyIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY29mZi13ZTMyay5vLCBjb2ZmLXo4ay5vKTogTm90ZSBkZXBlbmRlbmNpZXMuCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBGb3Igbm9ybWFsIDItIG9yIDQtYnl0ZQotCXJlbG9jcywgZG9uJ3QgYm90aGVyIGRvaW5nIHRoZSBhZGp1c3RtZW50IGlmIHRoZSB2YWx1ZSB0byBhZGQgaXMKLQl6ZXJvLgotCi1TdW4gRGVjIDI3IDE3OjQ1OjA1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX2dldF9zaXplKTogIE5ldyBmdW5jdGlvbiB0aGF0IGdldHMgYW4gdXBwZXIgYm91bmQKLQlvbiB0aGUgcG9zc2libGUgc2l6ZSBvZiBhbnkgb2JqZWN0IGluIGEgYmZkLgotCSogZWxmLmMgKGJmZF9lbGZfZmluZF9zZWN0aW9uLCBlbGZfZ2V0X3N0cl9zZWN0aW9uLAotCWVsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogIFJld3JpdGUgdG8gYXZvaWQgTlVMTCBwb2ludGVyCi0JZGVyZWZlcmVuY2VzLgotCSogZWxmLmMgKGVsZl9iaWdfdmVjLCBlbGZfbGl0dGxlX3ZlYyk6ICBEb2N1bWVudCBsYXN0IHRocmVlCi0JbWVtYmVycyBpbml0aWFsaXplZCB0byBOVUxMLgotCi1UaHUgRGVjIDI0IDE3OjQ5OjA5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jOiBjaGFuZ2UgYSAnY29uc3QnIHRvICdDT05TVCcsIG9yIGVsc2UgSFAgQyBjb21waWxlciBkaWVzCi0KLU1vbiBEZWMgMjEgMTY6MzM6MzQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiAgTmV3IGZpbGUuICBBdHRlbXB0IGF0IGEgZ2VuZXJpYy9kZWZhdWx0Ci0Jc2V0IG9mIGRlZmluaXRpb25zLCB0byBkaXNjb3VyYWdlIHBvcnRpbmcgdG8gbmV3IGhvc3RzIGJ5IGNvcHlpbmcuCi0JKiBob3N0cy9uZXdzLmg6ICBSZW1vdmVkLgotCSogaG9zdHMvc3BhcmMuaDogIFVzZSBzdGQtaG9zdC5oLgotCSogYmZkLWluLmg6ICBOZXcgbWFjcm9zIGJmZF9hc3ltYm9sX2JmZCBhbmQgYmZkX2FzeW1ib2xfZmxhdm91cjsKLQlwZXJoYXBzIHdlIGNhbiBsYXRlciByZW1vdmUgdGhlIHRoZV9iZmQgZmllbGQgZnJvbSBlYWNoIHN5bWJvbC4KLQkqIHN5bXMuYyAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSk6ICBSZW1vdmUgdW51c2VkIGZpZWxkCi0JYXBwX2RhdGEuICBBZGQgY29tbWVudCBub3RpbmcgdGhhdCB0aGVfYmZkIGlzIGFsbW9zdCByZWR1bmRhbnQsCi0JYnV0IG5vdCBxdWl0ZS4KLQkqIGFvdXR4LmgsIGNvZmYtYTI5ay5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmZjb2RlLmg6Ci0JVXNlIG5ldyBtYWNyb3MgYmZkX2FzeW1ib2xfYmZkIGFuZCBiZmRfYXN5bWJvbF9mbGF2b3VyLgotCSogaHBwYS5jIChmaWxsX3NwYWNlcyk6ICBNYWtlIHNsaWdodGx5IG1vcmUgcmVidXN0LgotCSogY29uZmlndXJlLmluOiAgQWxsb3cgc3RkLWhvc3QgYXMgdGhlICJkZWZhdWx0IiBob3N0LgotCi1Nb24gRGVjIDIxIDE3OjI0OjEzIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiAgQWRkIHN0cnVjdCBocHBhX2NvcmVfZGF0YSB0byB0ZGF0YSB1bmlvbi4KLQkqIGhwcGEuYzogIENvbmRpdGlvbmFsaXplIG9uIEhPU1RfSFBQQUhQVVggaW5zdGVhZCBvZiBocDkwMDBzODAwLgotCUdldCByaWQgb2YgSFBQQS9CU0Qgc3BlY2lmaWMgY29kZS4gIFRoYXQgd2lsbCBnbyBzb21ld2hlcmUgZWxzZQotCXNvbWVkYXkuCi0JKiAoZmlsbF9zcGFjZXMpOiAgRG9uJ3Qgc3BpbiBmb3JldmVyIGFuZCBkaWUgaWYgeW91IGRvbid0IGZpbmQKLQkkTUlMTElDT0RFJCBzdWJzcGFjZS4KLQkqIChocHBhX29iamVjdF9wKTogIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSByZWFsIGhvbmVzdC10by1jdGh1bHUKLQlleGVjIGZpbGUhCi0JKiAoaHBwYV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwsIGhwcGFfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCk6Ci0JTWFrZSB0aGVzZSB3b3JrIGZvciBIUFVYLgotCSogKG1ha2VfYmZkX2FzZWN0aW9uKTogIE5ldyByb3V0aW5lIHRvIG1ha2Ugc2VjdGlvbiBjcmVhdGlvbiBhCi0JbGl0dGxlIGVhc2llci4KLQkqIChocHBhX2NvcmVfZmlsZV9wKTogIENvbXBsZXRlbHkgcmV3cml0ZSwgbGVhdmUgb3V0IGJ1Z3MuCi0JKiBsaWJocHBhLmg6ICAjaW5jbHVkZSB0aGUgcmlnaHQgc3lzdGVtIGZpbGVzLiAgUmVkZWZpbmUgYWxsIG9mCi0JdGhlIHN0cnVjdHMvbWFjcm9zIGZvciBoYWNraW5nIGNvcmUgZmlsZXMgdG8gdXNlIG1vcmUgc2Vuc2libGUKLQlIUFVYIGNvcmUgZmlsZSBzdHJ1Y3R1cmVzLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogIENvbmRpdGlvbmFsaXplIGhwcGFfdmVjIG9uCi0JSE9TVF9IUFBBSFBVWCwgbm90IGhwOTAwMHM4MDAuCi0JKiBob3N0cy9ocHBhaHB1eC5oOiAgI2luY2x1ZGUgc3RkbGliLmggdG8gZ2V0IGNvcnJlY3QgZGVjbHMgZm9yCi0JbWFsbG9jIGFuZCByZWFsbG9jLiAgI2RlZmluZSBIT1NUX0hQUEFIUFVYLgotCi1Nb24gRGVjIDIxIDEyOjQwOjEwIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogUGF0Y2hlcyBmcm9tIE1pbmggVHJhbi1sZSA8bXRyYW5sZUBwYXJpcy5pbnRlbGxpY29ycC5jb20+LgotCSogY29uZmlndXJlLmluIChpMzg2LSotaXNjKiwgaTM4Ni0qLWFpeCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpMzg2LSotaXNjKiwgaTM4Ni0qLWFpeCopOiBOZXcgaG9zdHMuCi0JKiBob3N0cy9pMzg2aXNjLmgsIGNvbmZpZy9pMzg2aXNjLm1oOiBOZXcgZmlsZXMgZm9yIEludGVyYWN0aXZlCi0JVW5peC4KLQkqIGhvc3RzL2kzODZhaXguaCwgY29uZmlnL2kzODZhaXgubWg6IE5ldyBmaWxlcyBmb3IgQUlYIG9uIFBTLzIuCi0JKiBhaXgzODYtY29yZS5jOiBOZXcgZmlsZSBmb3IgaGFuZGxpbmcgY29yZSBmaWxlcyBvbiBBSVggb24gUFMvMi4KLQkqIHRhcmdldHMuYzogaWYgQUlYMzg2X0NPUkUsIHVzZSBhaXgzODZfY29yZV92ZWMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBjaGVjayBmb3IgSTM4NlNWTUFHSUMgYXMgd2VsbAotCWFzIEkzODZNQUdJQy4KLQotRnJpIERlYyAxOCAxMDoyMDoyNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgZmxhZ3MgdG8gMCwgZml4aW5nCi0JMTkyNy4KLQotVGh1IERlYyAxNyAxOTozNTozMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBkdmkgdGFyZ2V0Ci0KLVRodSBEZWMgMTcgMDA6MzY6MjQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiAgVXNlIHJpZ2h0IG5hbWUgZm9yIHRla2hleCB0ZGF0YSBzdHJ1Y3QuCi0JKiB0ZWtoZXguYzogIEluc2VydCBsZWFkaW5nX2NoYXIgKDApIGludG8gYmZkX3RhcmdldCBzdHJ1Y3QuICBTdHlsZS4KLQkqIGxpYmNvZmYuaDogIFVwZGF0ZWQgdG8gZ2V0IHNwYWNpbmcgY2hhbmdlIGZyb20gY29mZmNvZGUuaC4KLQkqIHRyYWQtY29yZS5jOiAgbGVhZGluZ19jaGFyIGlzIDAgKG5vIHN5bWJvbHMhKSwgbm90ICdfJy4KLQotVHVlIERlYyAxNSAxNTo0MDozMCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChkb19zbHVycF9ic2RfYXJtYXAsIGRvX3NsdXJwX2NvZmZfYXJtYXApOiAgTmV3Ci0JZnVuY3Rpb25zLCB3aXRoIHRoZSAiZ3V0cyIgb2YgdGhlIG9sZCBiZmRfc2x1cnBfYnNkX2FybWFwCi0JYW5kIGJmZF9zbHVycF9jb2ZmX2FybWFwLCBidXQgYXNzdW1pbmcgd2UndmUgYWxyZWFkeSBjaGVja2VkCi0JaWYgdGhlIGFybWFwIGlzIHByZXNlbnQgb3Igbm90LgotCUFsc28sIHJld3JpdGUgYSBiaXQgdG8gYXZvaWQga2VlcGluZyBhcm91bmQgb2JzdGFjayBkYXRhCi0JdGhhdCB3ZSBkb24ndCBuZWVkLgotCSogYXJjaGl2ZS5jIChzbmFyZl9hcl9oZWFkZXIsIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6Ci0JVmFyaW91cyBmaXhlcyB0byBjb3JyZWN0bHkgaGFuZGxlIENPRkZfc3R5bGUgYXJjaGl2ZXMgbmFtZXMuCi0JKE5vdGUgdGhhdCBiZWNhdXNlIHRoZXNlIGhhdmUgYSB0cmFpbGluZyAnLycsIHRoZSBuYW1lcyBjYW4KLQloYXZlIGVtYmVkZGVkIHNwYWNlcy4pCi0JKiBhcmNoaXZlLmMgKGJmZF9zbHVycF9hcm1hcCk6ICBOZXcgZnVuY3Rpb24sIHJlcGxhY2VzIG9sZAotCWJmZF9zbHVycF9ic2RfYXJtYXAgYW5kIGJmZF9zbHVycF9jb2ZmX2FybWFwLiAgUmVjb2duaXplcwotCV9laXRoZXJfIGZvcm1hdCwgYW5kIGNhbGxzIGRvX3NsdXJwX2JzZF9hcm1hcCBvcgotCWRvX3NsdXJwX2NvZmZfYXJtYXAgaWYgZWl0aGVyIGZvcm0gb2YgbWFwIGlzIHNlZW4uCi0JKiBsaWJiZmQtaW4uaDogIENoYW5nZWQgYmZkX3NsdXJwX2JzZF9hcm1hcCBhbmQKLQliZmRfc2x1cnBfY29mZl9hcm1hcCBpbnRvIG1hY3JvIHN5bm9ueW1zIGZvciBiZmRfc2x1cnBfYXJtYXAuCi0JKiBlbGYuYyAoZWxmX3NsdXJwX2FybWFwLCBlbGZfd3JpdGVfYXJtYXApOiAgRml4LgotCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogIFVzZSByYyBpbnN0ZWFkIG9mIG5vbi1zdGFuZGFyZCBxYy4KLQotTW9uIERlYyAxNCAxNzowODowOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBocHBhLmM6ICAjaW5jbHVkZSAic3lzZGVwLmgiLCBub3QgPHN5c2RlcC5oPi4KLQkqIGxpYmhwcGEuaDogIE1ha2UgbWlsbGljb2RlX3N0YXJ0IGFuZCBtaWxsaWNvZGVfZW5kIGJlIHVuc2lnbmVkCi0JaW50IHRvIGJlIHNhbWUgdHlwZSBhcyBDT1JFX0FERFIgaW4gR0RCLiAgV2h5IGFyZSB0aGVzZSBoZXJlPwotCi1TYXQgRGVjIDEyIDE1OjU0OjM2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1pMzg2LmMgKENBTENfQURERU5EKTogaWYgcmVsb2MgaXMgUEMgcmVsYXRpdmUsIGFkZCB0aGUKLQl2YWRkciBvZiB0aGUgc2VjdGlvbiB0byB0aGUgYWRkZW5kLgotCSogdGFyZ2V0cy5jOiBpZiBNSU5JTUlaRSBpcyAxLCBhbmQgU0NPX0NPUkUgaXMgZGVmaW5lZCwgYWRkCi0JU0NPX0NPUkUgdG8gU0VMRUNUX1ZFQ1MuCi0JKHRhcmdldF92ZWN0b3IpOiBhZGQgc2NvX2NvcmVfdmVjLgotCSogc2NvLWNvcmUuYyAoc2NvX2NvcmVfdmVjKTogYWRkIGxlYWRpbmcgdW5kZXJzY29yZSBpbml0aWFsaXplci4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNjbyopOiB1c2UgdGFyZ2V0IGkzODYtc2NvLgotCSogY29uZmlnL2kzODYtc2NvLm10OiBuZXcgZmlsZTsgZGVmaW5lIFNDT19DT1JFLgotCi1UaHUgRGVjIDEwIDAyOjEzOjE1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfb2JqZWN0X3ApOiAgRml4ICFzdHJjbXAgdGhpbmtvLgotCi1GcmkgRGVjICA0IDE0OjAyOjQ5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBOb3cgc3RhdGljIGFuZCBjb25zdC4KLQotVGh1IERlYyAgMyAxNjo1NDo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZsaW51eC5oOiBJbmNsdWRlIHVuaXN0ZC5oLgotCi0JKiBhb3V0eC5oIChwcmludF9zeW1ib2wpOiBhb3V0X3N0YWJfbmFtZSByZXR1cm5zIGEgY29uc3RhbnQKLQlzdHJpbmcuCi0JKiBsaWJhb3V0LmggKGFvdXRfc3RhYl9uYW1lKTogRml4IHByb3RvdHlwZS4KLQkqIHN0YWItc3ltcy5jIChhb3V0X3N0YWJfbmFtZXMpOiBBcnJheSBpcyBub3cgY29uc3QuCi0JKGFvdXRfc3RhYl9uYW1lKTogUmV0dXJuIHZhbHVlIGlzIG5vdyBwb2ludGVyIHRvIGNvbnN0LgotCi0JKiBhb3V0eC5oLCBhcmNoaXZlLmMsIGFyY2h1cmVzLmMsIGNvZmZjb2RlLmgsIGN0b3IuYywgcmVsb2MuYywKLQlzeW1zLmM6IERvYyBmaXhlcy4KLQotCSogc3ltcy5jIChhc3ltYm9sKTogQWRkZWQgbmV3IGZpZWxkICJhcHBfZGF0YSIsIGZvciBkYXRhCi0JcGFydGljdWxhciB0byB0aGUgYXBwbGljYXRpb24uICBTb21lIG9mIHRoZSBsaW5rZXIgZmxhZ3Mgb3VnaHQgdG8KLQlnZXQgbW92ZWQgdG8gdGhpcyBmaWVsZCBzb21lZGF5LgotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogUmVjb2duaXplIGEgZmV3IG1vcmUgbnVtYmVyczoKLQk4MDQ4NiwgODA5NjAsIGFuZCA5NjAuCi0KLQkqIGJmZC1pbi5oIChDT0ZGX1NXQVBfVEFCTEUpOiBOZXcgaXMganVzdCBhZGRyZXNzIG9mCi0JYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUsIGNhc3QgdG8gUFRSLgotCSogYmZkLmMgKGJmZF9jb2ZmX3N3YXBfKik6IERlbGV0ZWQgbWFjcm9zLgotCSogdGFyZ2V0cy5jIChzdHJ1Y3QgYmZkX3RhcmdldCk6IERlbGV0ZWQgQ09GRi1zcGVjaWZpYyBzd2FwcGluZwotCXJvdXRpbmUgcG9pbnRlcnMuCi0JKiBjb2ZmY29kZS5oICh0eXBlIGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IE5ldyBzdHJ1Y3R1cmUgdHlwZSwKLQljb250YWlucyBwb2ludGVycyB0byB0aGUgQ09GRi1zcGVjaWZpYyBzd2FwcGluZyByb3V0aW5lcy4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBOZXcgZGF0YSBzdHJ1Y3R1cmUsIHRvIGJlIHVzZWQgd2hlbgotCU5PX0NPRkZfU1lNQk9MUyBhbmQgTk9fQ09GRl9MSU5FTk9TIGFyZSBub3QgZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3dhcF8qKTogTmV3IG1hY3Jvcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2NvZmZfc3dhcF90YWJsZSk6IE5ldyBkYXRhIHN0cnVjdHVyZS4KLQkoZWNvZmZfYmlnX3ZlYyk6IFVzZSBpdC4KLQkqIEFsbCBDT0ZGIHRhcmdldHM6IE1vdmVkIENPRkZfU1dBUF9UQUJMRSB0byB0YXJnZXQtc3BlY2lmaWMgZGF0YS4KLQkqIEFsbCBvdGhlciB0YXJnZXRzOiBEZWxldGVkIGNvZmYtc3BlY2lmaWMgdmVjdG9yIGVudHJpZXMuCi0KLQkqIHRyYWQtY29yZS5jOiBGaXhlZCBzb21lIGBQQVJBTVMnIHVzZXMgdGhhdCB3ZXJlIG1pc3NpbmcKLQlwYXJlbnRoZXNlcy4KLQotU3VuIE5vdiAyOSAwODozNzoxMyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogIFByb3RlY3QgYXJnIHByb3RvdHlwZSBpbgotCWNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3Agd2l0aCBQQVJBTVMgbWFjcm8gZm9yIG5vbi1BTlNJIGNvbXBpbGVycy4KLQotU2F0IE5vdiAyOCAwNDowMToyMSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCwgYW91dGYxLmgsIHRyYWQtY29yZS5jLCBjb2ZmY29kZS5oLCBsaWJhb3V0LmgsCi0JbGliYmZkLWluLmgsIGJmZC1pbi5oOiBFbGltaW5hdGUgYWxsIFBST1RPIGNhbGxzLCByZXBsYWNlIHdpdGgKLQlQQVJBTVMgZm9yIHJlYWRhYmlsaXR5LgotCi0JKiBhb3V0eC5oOiAgQWRkIHR5cGUgdG8gY2FsbGJhY2sgcGFyYW1ldGVyLgotCSogY29mZi1taXBzLmM6ICBEb24ndCBjYWxsIHRyYWQtY29yZS5oLCBub3QgbmVlZGVkLgotCSogdHJhZC1jb3JlLmM6ICBJbmNvcnBvcmF0ZSB0cmFkLWNvcmUuaCBkZWNsYXJhdGlvbnMuICBGaXggY29tbWVudHMuCi0JKiB0cmFkLWNvcmUuaDogIEVsaW1pbmF0ZSwgdW51c2VkLgotCi1XZWQgTm92IDE4IDEzOjE2OjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdCk6IGlmIGRlZmF1bHQgdGFyZ2V0IGlzbid0IGZvdW5kCi0JdGhlbiBsb29rIHRocm91Z2ggdGhlIGVudGlyZSBsaXN0IHJhdGhlciB0aGFuIHJldHVybiBlYXJseS4KLQotTW9uIE5vdiAxNiAxNDozMzowMyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pOTYwLWNvZmYubXQ6IHJlb3JkZXIgdmVjIHRvIG1hdGNoIGJmZF9jaGVja19mb3JtYXQgKGZyb20gUGVyKQotCi1UaHUgTm92IDEyIDE3OjAxOjQxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHBhc3MgZG93biBwcmVmaXggYW5kIGV4ZWNfcHJlZml4IGluIEZMQUdTX1RPX1BBU1MKLQotVGh1IE5vdiAxMiAwOTo0Njo0NyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi16OGsuYzogY2hlY2twb2ludCwgbW9yZSBhZGRyZXNzaW5nIG1vZGVzIGhhbmRsZWQKLQkqIGNvZmZjb2RlLmggKGdldF92YWx1ZSk6IGRvbid0IHRydW5jYXRlIHJlbG9jLT5hZGRlbmQgZmllbGQsIGl0J3MKLQlhIGxvbmcgbm93LgotCi1XZWQgTm92IDExIDIzOjU3OjU1IDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQkqIHdlMzJrLm10IChUREVGQVVMVFMpOiBVc2Ugd2UzMmtjb2ZmX3ZlYywgbm90IGkzODZjb2ZmX3ZlYy4KLQotVHVlIE5vdiAxMCAxNDowNDozOCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtaW5vciB0d2Vha3MgdG8gbWFrZSAkKENDKSBjb21tYW5kIGxpbmVzIG1vcmUgY29uc2lzdGVudAotCi1Nb24gTm92ICA5IDIzOjU4OjE3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIsIGJmZF9jbG9zZSk6ICBBZGQgZG9jIGFib3V0IGNhY2hlaW5nCi0JYW5kIGFib3V0IHdoZW4gZmlsZSBkZXNjcmlwdG9ycyBhcmUgY2xvc2VkLgotCi1TYXQgTm92ICA3IDAwOjQyOjIwIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IE1ha2Ugc3VyZSBhbGlnbm1lbnQgcmVsb2NzIGdldAotCXdyaXR0ZW4gb3V0IGNvcnJlY3RseS4KLQotVGh1IE5vdiAgNSAxNTozNDoxOSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYzogTmV3IHNlY3Rpb24gYml0IFNFQ19TSEFSRURfTElCUkFSWS4KLQljb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IGlmIFNUWVBfTk9MT0FEICYmIChTVFlQX1RFWFQgfHwKLQlTVFlQX0RBVEEpLCBzZXQgU0VDX1NIQVJFRF9MSUJSQVJZLiAgVGhpcyBzZWVtcyB0byBiZSBjb3JyZWN0IGZvcgotCWkzODYtc3lzdi4KLQotVGh1IE5vdiAgNSAwNDo0MzowOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0LmMgKHN0cnVjdCBiZmRfdGFyZ2V0KTogIEVsaW1pbmF0ZSB0aGUgU0RFRiBhbmQgU0RFRl9GTVQKLQltYWNyb3M7IHVzZSBQQVJBTVMgdG8gZGVjbGFyZSB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgaW52b2x2ZWQuCi0KLQkqIGJmZC1pbi5oLCBiZmQuYywgbGliYmZkLmgsIHJlbG9jLmMsIHNlY2xldC5oLCBzZWN0aW9uLmMsCi0JdGFyZ2V0cy5jOiBSZW5hbWUgc3RydWN0IGJmZF9zZWNsZXRfc3RydWN0IHRvIHN0cnVjdCBiZmRfc2VjbGV0LgotCi1UaHUgTm92ICA1IDAyOjU5OjA5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQ2xlYW51cDogIFJlcGxhY2UgYWxsIHVzZXMgb2YgRVhGVU4gaW4gdGhlIEJGRCBzb3VyY2VzLCB3aXRoIFBBUkFNUy4KLQotCSogYXJjaHVyZXMuYywgcmVsb2MuYywgc2VjdGlvbi5jLCB0ZWtoZXguYzogIFVzZSBQQVJBTVMgaW4KLQlkZWNsYXJpbmcgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLgotCSogY2FjaGUuYywgZWxmLmM6ICBNb3ZlIHN0YXRpYyBmdW5jdGlvbiBkZWNscyB0byB0b3AsIHVzZSBQQVJBTVMuCi0JKiBzZWNsZXQuaDogIERlY2xhcmUgZXh0ZXJuYWwgZnVuY3Rpb24gd2l0aCBQQVJBTVMuCi0KLQkqIGRvYy9jaGV3LmMgKGV4ZnVuc3R1ZmYpOiAgRWxpbWluYXRlLgotCShwYXJhbXN0dWZmKTogIFJlcGxhY2UgZXhmdW5zdHVmZiB3aXRoIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIFBBUkFNUy4KLQkqIGRvYy9wcm90by5zdHI6ICBVc2UgcGFyYW1zdHVmZiByYXRoZXIgdGhhbiBleGZ1bnN0dWZmLgotCi0JKiBsaWJiZmQuaDogIFVwZGF0ZSwgYmFzZWQgb24gY2hhbmdlcyBpbiBzb3VyY2UgY29kZSBhbmQgY2hldy4KLQotV2VkIE5vdiAgNCAyMjo0NzoyOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbGliaWVlZS5oOiAgQWRkIEZJWE1FIGFib3V0IHJlbW92aW5nIGxpbWl0IG9uIG51bWJlciBvZiBzZWN0aW9ucy4KLQkqIGJmZC1pbi5oOiAgSW1wcm92ZSBjb21tZW50cyB0byBtYWtlIGl0IGNsZWFyIHRoYXQgYmZkLmggaXMKLQl0aGUgd3JvbmcgcGxhY2UgdG8gZWRpdCB0aGlzIGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6ICBJbnN0YWxsIGFuc2lkZWNsLmggYW5kIG9ic3RhY2suaCBpbiB0aGUKLQlzYW1lIHBsYWNlcyB3aGVyZSB3ZSBpbnN0YWxsIGJmZC5oLgotCi1XZWQgTm92ICA0IDEzOjQwOjIzIDE5OTIgIFNlYW4gRXJpYyBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X291dCwgY29mZl9zd2FwX2F1eF9pbik6ICBjaGVjayBmb3IKLQlzeW1ib2wgdHlwZSBiZWZvcmUgYmxpbmRseSBtb2RpZnlpbmcgdGhlIGF1eGVudC4gIFNwZWNpZmljYWxseSwKLQlvbmx5IG1vZGlmeSB0aGUgZW5kbmR4IGZpZWxkcyBmb3IgdHlwZXMgdGhhdCBuZWVkIGl0LCBhbmQgZG9uJ3QKLQlzZXQgdGhlIGFycmF5IGluZm9ybWF0aW9uIGZvciBub24tYXJyYXlzLgotCi1XZWQgTm92ICA0IDA5OjMwOjUwIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBTZWN0aW9uIGxpc3Qgc2hvdWxkIGJlIHNldCB1cAotCWNvcnJlY3RseSBhbnl3YXlzOyBkb24ndCBoYXZlIHRvIHNldCB1cCAibmV4dCIgcG9pbnRlcnMgbWFudWFsbHkuCi0KLU1vbiBOb3YgIDIgMTI6MzY6MTQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVsdGE4OC5taCwgY29uZmlnL2hwMzAwLm1oLCBjb25maWcvaHBwYWhwdXgubWgsCi0JY29uZmlnL2kzODZ2Lm1oOiByZW1vdmVkIC1EVVNHIGZyb20gSERFRklORVMuCi0JaG9zdHMvZGVsdGE4OC5oLCBob3N0cy9ocDMwMC5oLCBob3N0cy9ocHBhaHB1eC5oLCBob3N0cy9pMzg2di5oOgotCWRlZmluZWQgVVNFX1VUSU1FLgotCWhvc3RzL2kzODZ2Lmg6IGRvbid0IGRlZmluZSBQT1NJWF9VVElNRS4KLQotRnJpIE9jdCAzMCAxNjoxMzo1MiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX3NlY3Rpb25zKTogbWFrZSBhIHByaXZhdGUgY29weSBvZiB0aGUKLQlzZWN0aW9uJ3MgbmFtZSBiZWZvcmUgdHJ1bmNhdGluZyBpdC4KLQotVGh1IE9jdCAyOSAwODozMDo1MCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jOiBhZGQgc3ltYm9sX2xlYWRpbmdfY2hhciBlbnRyeSBpbiB0cmFuc2ZlciB2ZWMKLQotLFdlZCBPY3QgMjggMTY6MTE6NTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGllZWUuYyAoZ2V0X3N5bWJvbCk6IGNhbiBub3cgY29wZSB3aGVuIHR3byBzeW1ib2xzIG9mIGEKLQlkaWZmZXJlbnQgY2xhc3MsIGJ1dCB0aGUgc2FtZSBpbmRleCBudW1iZXIgb2NjdXIgY29uc2VjdXRpdmVseS4KLQkoZ2V0X3NlY3Rpb25fZW50cnkpOiBuaWNlciBuYW1lIGZvciBzZWN0aW9ucyBiZWluZyBmb3J3YXJkCi0JcmVmZXJlbmNlZC4gKGllZWVfYXJjaGl2ZV9wKTogZG9uJ3QgZnJlZSB0aGUgZmlsZW5hbWUgc3RyaW5nLAotCXNpbmNlIGl0IHdhcyBuZXZlciBtYWxsb2NlZC4KLQotV2VkIE9jdCAyOCAxMzo0MjowOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiAgWmVybyB0aW1lc3RhbXAgZmllbGQuCi0KLVR1ZSBPY3QgMjcgMTI6MjQ6MzQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X291dCk6IHNldCB0aGUgZmNuYXJ5IGluZm8gYmVmb3JlCi0Jb3B0aW9uYWxseSBzZXR0aW5nIHRoZSBkaW1lbiBpbmZvLCBzaW5jZSB0aGV5IGFyZSBpbiB0aGUgc2FtZQotCW1lbW9yeSBsb2NhdGlvbnMuICBBbHNvIHplcm8gb3V0IGV4dGVybmFsIGF1eGVudC4KLQkoY29mZl93cml0ZV9zeW1ib2wpOiBkb24ndCB6ZXJvIGV4dGVybmFsIGF1eGVudDsgbm93IGRvbmUgaW4KLQljb2ZmX3N3YXBfYXV4X291dC4KLQotRnJpIE9jdCAyMyAxMzo1NTozNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIENoZWNrIGZjbG9zZSByZXR1cm4gdmFsdWUgZm9yIGVycm9ycy4KLQlsaWJiZmQuaDogYmZkX2NhY2hlX2Nsb3NlIG5vdyByZXR1cm5zIGEgYm9vbGVhbi4KLQljYWNoZS5jIChiZmRfY2FjaGVfZGVsZXRlKTogcmV0dXJuIGZjbG9zZSBzdWNjZXNzIHZhbHVlLgotCShiZmRfY2FjaGVfY2xvc2UpOiByZXR1cm4gYmZkX2NhY2hlX2RlbGV0ZSByZXR1cm4gdmFsdWUuCi0Jb3BuY2xzLmMgKGJmZF9jbG9zZSwgYmZkX2Nsb3NlX2FsbF9kb25lKTogcmV0dXJuIHJlc3VsdCBvZgotCWJmZF9jYWNoZV9jbG9zZS4KLQotRnJpIE9jdCAyMyAxMDozMjozNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc2VjbGV0LmMgKHJlbCk6IGRvbid0IGxvYWQgc2VjdGlvbnMgd2l0aG91dCB0aGUgU0VDX0xPQUQgYml0LgotCi1UaHUgT2N0IDE1IDEwOjE2OjM1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW02OGsuYyAobTY4a19ob3d0bzJ0eXBlLCBTRUxFQ1RfUkVMT0MpOiBuZXcgZnVuY3Rpb24gdG8KLQl3b3JrIG91dCBhIGNvZmYgcmVsb2NhdGlvbiB0eXBlIGZyb20gYSBob3d0bydzIGF0dHJpYnV0ZXMgcmF0aGVyCi0JdGhhbiB1c2luZyB0aGUgaW5wdXQgcl90eXBlIGZpZWxkLiBUaGlzIGZpeGVzIFBSMTY3NyBhbmQgYWxsb3dzCi0JY29udmVyc2lvbiBvZiBhLm91dCByZWxvY3MgdG8gY29mZiByZWxvY3MuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogaWYgc3VwcGxpZWQgYSByZWxvY2F0aW9uCi0JcmVsYXRpdmUgdG8gYW4gYWJzb2x1dGUgc3ltYm9sLCB1c2UgdGhlIHJpZ2h0IHN5bWJvbCBpbmRleC4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IGRvIGEgcGFydGlhbCBsaW5rIGZvciBjb2ZmCi0JcmVsb2NzIHJpZ2h0LgotCi1GcmkgT2N0IDIzIDA4OjE1OjU2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY2hhbmdlcyB0byBzdXBwb3J0IGkzODYtc3lzdiB3aXRoIHNoYXJlZCBsaWJyYXJpZXM6Ci0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IGlmIFRXT19EQVRBX1NFQ1MgaXMgZGVmaW5lZCwKLQljaGVjayBmb3IgLmRhdGEyOyBpZiBfTElCIGlzIGRlZmluZWQsIGNoZWNrIGZvciBpdDsgbWFwCi0JU0VDX05FVkVSX0xPQUQgdG8gU1RZUF9OT0xPQUQuCi0JKHN0eXBfdG9fc2VjX2ZsYWdzKTogbWFwIFNUWVBfTk9MT0FEIHRvIFNFQ19ORVZFUl9MT0FELgotCShtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBpZiBUV09fREFUQV9TRUNTLCBhY2NlcHQgLmRhdGEyLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IGZvcmNlIHZhZGRyIG9mIC5saWIgdG8gMDsgc2V0IHNjbnB0cgotCWlmIHNlY3Rpb24gaGFzIGNvbnRlbnRzLCBub3QganVzdCBpZiBpdCBpcyBsb2FkYWJsZTsgaWYKLQlUV09fREFUQV9TRUNTLCBjaGVjayBmb3IgLmRhdGEyCi0JKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBzZXQgdm1hIG9mIC5saWIgc2VjdGlvbiB0byBudW1iZXIgb2YKLQkubGliIHNlY3Rpb25zLgotCSogY29mZi1pMzg2LmM6IGRlZmluZSBUV09fREFUQV9TRUNTOyB1c2UgYSBzcGVjaWFsIENBTENfQURERU5EOwotCWRvbid0IGRlZmluZSBjb2ZmX3dyaXRlX2FybWFwIHRvIGJzZF93cml0ZV9hcm1hcC4KLQkqIGhvc3RzL2kzODZ2Lmg6IGRvbid0IGluY2x1ZGUgPHV0aW1lLmg+LCBzaW5jZSBpdCBpcyBub3QgcHJvdmlkZWQKLQlieSBTVlIzLjIuCi0KLVRodSBPY3QgMjIgMjI6NDA6MjAgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBzb2xhcmlzMi5oOiBHZXQgdGhlIGRlZmluaXRpb24gb2YgYWxsb2NhIGZyb20gYWxsb2NhLmggaWYgd2UKLQlhcmVuJ3QgdXNpbmcgZ2NjLgotCi1UaHUgT2N0IDIyIDAzOjA3OjI4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGk5NjAtKi17YW91dCxib3V0fSk6ICBTdXBwb3J0IHRoZXNlLgotCi1XZWQgT2N0IDIxIDAzOjQ2OjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWcvYTI5ay1hb3V0Lm10IChERUZBVUxUX1RBUkdFVCk6ICBTZXQgdG8gb25lIHRoYXQgZXhpc3RzLgotCi1UaHUgT2N0IDE1IDE1OjA1OjM5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhcG9sbG82OC5oLCBhcG9sbG92NjguaCwgaHAzMDAuaCwgaTM4NnYuaCwgaXJpeDMuaDogUmVtb3ZlCi0Jbm8tbG9uZ2VyLXVzZWQgZGVmaW5pdGlvbnMgb2YgTF9TRVQgYW5kIExfSU5DUi4KLQkqIGkzODZsaW51eC5oOiAgVHdlYWtzIHRvIHNtb290aCBMaW51eCBidWlsZC4KLQotVGh1IE9jdCAxNSAwMTozMjoyMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogc2VjbGV0Lmg6ICBBZGQgZW51bSB0YWcgdG8gYmZkX3NlY2xldF9lbnVtX3R5cGUuCi0KLQkqIGJmZC1pbi5oIChmaWxlX3B0cik6ICBVcGRhdGUgY29tbWVudHMsIG1ha2UgRklYTUUgcmUgb2ZmX3QuCi0KLQkqIGFvdXQtYWRvYmUuYywgYW91dGYxLmgsIGFyY2hpdmUuYywgYm91dC5jLCBjb2ZmLXJzNjAwMC5jLAotCWNvZmZjb2RlLmgsIGVsZi5jLCBpZWVlLmMsIGxpYmFvdXQuaCwgbGliYmZkLmMsIG9hc3lzLmMsCi0Jc2NvLWNvcmUuYzogIExpbnQ6ICBTZWNvbmQgYXJndW1lbnQgb2YgYmZkX3NlZWsgaXMgYWx3YXlzIGZpbGVfcHRyLgotCVRoaXJkIGFyZ3VtZW50IGlzIFNFRUtfU0VUIG9yIFNFRUtfQ1VSLiAgUmVzdWx0IGlzIGFsd2F5cyAwIG9yIC0xLgotCi0JKiBhb3V0LWFkb2JlLmMsIGFvdXRmMS5oLCBhb3V0eC5oLCBib3V0LmMgY29mZi1tNjhrLmMsIGNvZmYtejhrLmMsCi0JY29mZmNvZGUuaCwgZWxmLmMsIGxpYmFvdXQuaCwgbGliYmZkLWluLmgsIHNyZWMuYzogIExpbnQuCi0KLUZyaSBPY3QgIDkgMDM6NDY6MzcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiAgTmV3IGZpbGUsIGNvbnRhaW5zIG1hcHBpbmcgb2YgaG9zdCBjb25maWdzCi0JdG8gaG9zdCBzdXBwb3J0IGZpbGUgbmFtZXMgZm9yIGJmZCwgYmludXRpbHMsIG9wY29kZXMuCi0JKiBjb25maWd1cmUuaW46ICBVc2UgaXQuCi0JKiBpMzg2YW91dC5jOiAgQ2xlYW51cCwgZHVtcCBUQVJHRVRfSVNfTElUVExFX0VORElBTl9QLgotCSogaTM4NmJzZC5jOiAgQ2xlYW51cCwgcmVmb3JtYXQuCi0JKiBjb25maWcvaTM4Ni1ic2QubXQ6ICBDb21tZW50IGNoYW5nZXMuCi0JKiBjb25maWcvaTM4NmJzZC5taDogIE5ldyBmaWxlIGZvciBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGhvc3RzL2kzODZic2QuaDogIE1lcmdlIGNoYW5nZXMgZnJvbSBQZXRlciBTY2hhdWVyLgotCSogYm91dC5jIChBTElHTik6ICBSZW5hbWUgdG8gQUxJR05FUiwgc2luY2Ugc3lzdGVtIGhlYWRlciBmaWxlcwotCW9uIEJTRCA0LjQgZGVmaW5lIEFMSUdOIChzaWdoISkuCi0KLVRodSBPY3QgIDggMjI6MTg6MTAgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgdHdlZWRsZWR1bWJlci5jeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKGFvdXRfYmFja2VuZF9kYXRhKTogYWRkZWQgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQKLQlmaWVsZC4gRm9yIFpNQUdJQyBmaWxlcyBvbmx5LCB3aGVuIHRleHRfaW5jbHVkZXNfaGVhZGVyIGlzIHNldCwgYnkKLQlkZWZhdWx0IHRoZSBsZW5ndGggb2YgdGhlIGV4ZWMgaGVhZGVyIGlzIGNvdW50ZWQgaW4gdGhlIHRleHQKLQlzZWN0aW9uIHNpemUuIEZvciBnbzMyLCBleGVjIGhlYWRlciBpcyBtYXBwZWQgaW4gYnV0IGRvZXMgKm5vdCoKLQljb250cmlidXRlIHRvIHRoZSBzaXplIG9mIHNlY3Rpb24uCi0JKiBhb3V0eC5oIChhb3V0X2FkanVzdF9zaXplc19hbmRfdm1hcyk6IGlmIGV4ZWNfaGVhZGVyX25vdF9jb3VudGVkCi0JaXMgbm90IHNldCwgYnV0IHp0aWggaXMsIGFkZCB0aGUgc2l6ZSBvZiB0aGUgZXhlYyBoZWFkZXIgdG8gdGhlCi0JcmVjb3JkZWQgc2l6ZSBvZiB0aGUgdGV4dCBzZWN0aW9uLgotCSogYW91dGYxLmggKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBjbGVhciBleGVjX2hlYWRlcl9ub3RfY291bnRlZC4KLQkqIGkzODZhb3V0LmMgKGkzODZhb3V0X2JhY2tlbmRfZGF0YSk6IHNldCBleGVjX2hlYWRlcl9ub3RfY291bnRlZC4KLQlBbHNvIHNldCB0ZXh0X2luY2x1ZGVzX2hlYWRlci4KLQkqIGFvdXQtdGFyZ2V0LmggKCpfYmFja2VuZF9kYXRhKTogY2xlYXJlIGV4ZWNfaGVhZGVyX25vdF9jb3VudGVkCi0JYnkgZGVmYXVsdCBpbiBNWShiYWNrZW5kX2RhdGEpLgotCi1UaHUgT2N0ICA4IDE4OjEyOjQ5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oIChjYWxsYmFjayk6IERvbid0IGRlZmluZSB0aGlzIGZ1bmN0aW9uIGlmIGl0IHdvbid0IGJlCi0JdXNlZC4KLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogUmVzdG9yZSBvbGQgYW91dF9kYXRhIHZhbHVlIGlmIHRoaXMKLQl0eXBlIGRvZXNuJ3QgbWF0Y2guICBEb24ndCBsb3NlIGlmIGZpbGUgc2VjdGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4KLQljcmVhdGVkLgotCShzZXRfYXJjaF9tYWNoKTogU2V0IHJlbG9jX2VudHJ5X3NpemUuCi0JKHNsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBiZmRfaF9nZXRfezE2LDh9IGZvciByZWFlZGluZyBzeW1ib2wgZGF0YS4KLQotCSogaG9zdHMvaTM4NmJzZC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGlbMzRdODYtKi1ic2QgaG9zdC4KLQotCSogYW91dC10YXJnZXQuaCAoY2FsbGJhY2ssIHdyaXRlX29iamVjdF9jb250ZW50cyk6IERlbGV0ZSB1bnVzZWQKLQl2YXJpYWJsZXMuCi0KLQkqIGFvdXR4LmggKHJlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCSogYW91dC10YXJnZXQuaCAoTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBVc2UgaXQgYXMgZGVmYXVsdC4KLQkqIGFvdXRmMS5oIChzdW5vczRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWxldGVkLgotCShNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IERvbid0IGRlZmluZSBpdC4KLQotCSogYW91dHguaCAoYWRqdXN0X3NpemVzX2FuZF92bWFzKTogRG9uJ3QgYm90aGVyIHdpdGggcGFkZGluZyBmb3IKLQlPTUFHSUMgZmlsZXMuCi0JKHNsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBoZWFkZXIgYnl0ZSBvcmRlciwgbm90IHRhcmdldCBieXRlCi0Jb3JkZXIsIGZvciByZWFkaW5nIHN5bWJvbCBkYXRhLgotCi1UaHUgT2N0ICA4IDE3OjMzOjM5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBVbmRvIHNvbWUgYnJhaW4gZGFtYWdlIGluIHRoZSBob3N0IHNlY3Rpb24uCi0JKiBjb25maWd1cmUuaW46ICBSZWZvcm1hdCB0aGUgdGFyZ2V0IHNlY3Rpb24sIHRlc3QgbWFueSBjb25maWdzLgotCSogTWFrZWZpbGUuaW4gKG1ha2UpOiAgUmVtb3ZlIG9ic29sZXRlIGBtYWtlIG1ha2UnLgotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogIE1ha2UgZGVmaW5lcyBsaW5lIHVwLgotCi1UaHUgT2N0ICA4IDA4OjUyOjQ4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JTm93IGEgYmZkIGtub3dzIHdoZXRoZXIgdW5kZXJzY29yZXMgYXJlIG5vcm1hbGx5IHByZXBlbmRlZAotCXRvIHN5bWJvbHMgaW4gaXRzIGZpbGUgZm9ybWF0LgotCi0JKiBhb3V0LWFkb2JlLmMsIGFvdXQtdGFyZ2V0LmgsIGJvdXQuYywgY29mZi1hMjlrLmMsIGNvZmYtaDgzMDAuYywKLQljb2ZmLXo4ay5jOiB0YXJnZXRzIHNldCBzbyB0aGV5IGhhdmUgbGVhZGluZyB1bmRlcnNjb3JlCi0JKiBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmLW1pcHMuYywgY29mZi1tODhrLmMsCi0JY29mZi1yczYwMDAuYywgY29mZi13ZTMyay5jLCBlbGYuYywgaWVlZS5jLCBzcmVjLmM6IHRhcmdldHMgc2V0Ci0Jd2l0aG91dCBsZWFkaW5nIHVuZGVyc2NvcmUgZmxhZwotCSogdGFyZ2V0cy5jOiBhZGQgc3ltYm9sIGxlYWRpbmcgY2hhciB0byB4dmVjIGRlc2NyaXB0aW9uCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyKTogbmV3IG1hY3JvLgotCi1Nb24gT2N0ICA1IDE0OjMyOjU1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmM6ICBNYWtlIGVycm5vIGdsb2JhbC4KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogIElmIHJlYWQgZmFpbHMgKGFuZAotCWVycm5vIT0wKSBzZXQgYmZkX2Vycm9yIHRvIG1hbGZvcm1lZF9hcmNoaXZlIChzaW5jZSB0aGlzIHByb2JhYmx5Ci0JaW5kaWNhdGVzIGEgdHJ1bmNhdGVkIGFyY2hpdmUpLCByYXRoZXIgdGhhbiBzeXN0ZW1fY2FsbF9lcnJvci4KLQotTW9uIE9jdCAgNSAwMzozMzozOSAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCB0d2VlZGxlZHVtYmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBydWxlcyBmb3IgaTM4NmJzZC5jCi0JKiBpMzg2YnNkLmM6IG5ldyBmaWxlLCBzdXBwb3J0aW5nIDM4NmJzZC4KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGkzODYtKi1ic2QgdGFyZ2V0LgotCSogY29uZmlnL2kzODYtYnNkLm10OiBuZXcgZmlsZSAtIDM4NmJzZCB0YXJnZXQgY29uZmlndXJhdGlvbi4KLQotVGh1IE9jdCAgMSAxNzo1MTowNyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmUtYXJyYW5nZSBob3N0IHNlY3Rpb24gdG8gdXNlICotKi0qIG5vdGF0aW9uLAotCWNsZWFuIHVwIHNvbWUgb2YgdGhlIHRhcmdldCBzZWN0aW9uIGFzIHdlbGwKLQotCSogc2VjbGV0LmM6IGNhc3QgcmVzdWx0IG9mIGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgdG8KLQlhdm9pZCBjb21waWxlciB3YXJuaW5ncwotCi1UdWUgU2VwIDI5IDEzOjI0OjA5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NlY3Rpb25fc3ltYm9sKTogQ3JlYXRlIHNlY3Rpb24gaWYgaXQgZG9lc24ndAotCWFscmVhZHkgZXhpc3QuCi0KLQkqIGJvdXQuYzogUmVtb3ZlZCBzb21lIHVudXNlZCB2YXJpYWJsZXMuCi0KLVR1ZSBTZXAgMjkgMDg6MzA6MjEgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBQb3J0YWJpbGl0eSBmaXhlcyBmcm9tIHAzOgotCWNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogcmVtb3ZlZCBzYW5pdHkgY2hlY2sgdW50aWwgaXQKLQl3b3JrcyBvbiBhbGwgdGFyZ2V0cyAocGVyIGFkdmljZSBmcm9tIHNhYykuCi0JY29uZmlnL2hwOTAwMC5taDogbmV3IGZpbGUgdG8gZGVmaW5lIFVTRy4KLQlocHBhLmM6ICN1bmRlZiBocHBhIGJlZm9yZSB0aGUgSlVNUF9UQUJMRS4KLQlob3N0cy9ocHBhaHB1eC5oOiAjZGVmaW5lIE5BVElWRV9IUFBBSFBVWF9DT01QSUxFUiBpZiBub3QKLQlfX1NURENfXy4KLQl0YXJnZXRzLmMgKGJmZF90YXJnZXRfbGlzdCk6IGlmIE5BVElWRV9IUFBBSFBVWF9DT01QSUxFUiwgbWFrZQotCWxvY2FsIHZhcmlhYmxlIHRhcmdldCB2b2xhdGlsZSB0byBhdm9pZCBteXN0ZXJpb3VzIGJ1ZyBpbgotCUhQOTAwMC83MDAgY2MuCi0KLVNhdCBTZXAgMjYgMDM6NTg6NDkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9ocHBhYnNkLm1oLCBjb25maWcuaHBwYWhwdXgubWg6ICBSZW1vdmUgdmFyaW91cyBib2dvc2l0eS4KLQkqIGhvc3RzL2hwcGFocHV4Lmg6ICBSZW1vdmUgYmNvcHkgYW5kIGluZGV4IGNpcmN1bXZlbnRpb25zLgotCi1GcmkgU2VwIDI1IDIyOjM2OjUyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXo4ay5jIChmdW5jX2RhLCBmdW5jX2pyKTogIExpbnQuCi0JKiBjb2ZmY29kZS5oOiAgVXNlIG1lbXNldCByYXRoZXIgdGhhbiBiemVyby4KLQkqIGVsZi5jOiAgVXNlIG1lbWNweSByYXRoZXIgdGhhbiBiY29weS4KLQkqIHRla2hleC5jOiAgVXNlIG1lbXNldCByYXRoZXIgdGhhbiBiemVyby4KLQotRnJpIFNlcCAyNSAxOToxNDo0OCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUFkZCBBZG9iZSBhLm91dCBzdXBwb3J0LgotCi0JKiBhb3V0LWFkb2JlLmM6ICBOZXcgZmlsZS4gIFNvIGZhciwgb25seSByZWFkcyBhLm91dC5hZG9iZS4gIEZJWE1FLgotCSogY29uZmlnL2Fkb2JlLm10OiAgQWRkLgotCSogY29uZmlndXJlLmluICgqLWFkb2JlLSogdGFyZ2V0KTogIEFkZC4KLQkqIHRhcmdldHMuYyAoYV9vdXRfYWRvYmVfdmVjKTogIEFkZC4KLQkqIE1ha2VmaWxlLmluOiAgYWRkIGFvdXQtYWRvYmUuYy4KLQotCSogY29uZmlndXJlLmluOiAgUHV0IHR3byBkYXNoZXMgaW4gYWxsIGVudHJpZXMgdG8gYmUgbWF0Y2hlZC4KLQlBZGQgY29tbWVudHMgdG8gcmVtaW5kIHBlb3BsZSB0byBkbyB0aGlzLgotCVJlb3JkZXIgYWxsIGVudHJpZXMgdGhhdCBtYXRjaCBtYW51ZmFjdHVyZXIgbmFtZXMsIHRvIG9jY3VyCi0JbGFzdCwgc28gdGhleSB3aWxsIG9ubHkgYmUgbWF0Y2hlZCBpZiBubyBtb3JlIHNwZWNpZmljIG1hdGNoCi0Jb2NjdXJzLiAgUmVtb3ZlIG1hbnVmYWN0dXJlcnMgYGFvdXQnLCBgYm91dCcsIGBjb2ZmJywgYW5kIGBlbGYnLgotCi1GcmkgU2VwIDI1IDE1OjAzOjIyIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBlbGYuYyAoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IFJldHVybiBiZmRfYWJzX3NlY3Rpb24sIG5vdCAwLAotCXNpbmNlIHdlIHNob3VsZCBuZXZlciBoYXZlIGEgTlVMTCBzZWN0aW9uLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgc3Rfc2huZHggZG9lc24ndCBtYXRjaCBhbnkgb2Ygb3VyCi0JdGVzdHMsIHNldCB0aGUgc2VjdGlvbiB0byBiZmRfYWJzX3NlY3Rpb24uCi0KLUZyaSBTZXAgMjUgMTE6MTE6NTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtejhrLmM6IGdldHRpbmcgY2xvc2VyCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IGFsbG93Ci0JRVhUUkFfQ0FTRVMgaG9va3MgZm9yIGRpZmZlcmVudCBhcmNoZXMgdG8gcHJvdmlkZSBkaWZmZXJlbnQgcmVsb2MKLQl0eXBlcy4KLQkqIHNlY2xldC5oOiAjaWZuZGVmIGFyb3VuZCBpdCB0byBhbGxvdyBtdWx0aXBsZSBpbmNsdXNpb24KLQkqIHNyZWMuYzogbWlub3IgZG9jIGZpeAotCi1Nb24gU2VwIDIxIDE0OjMzOjU4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaHA5MDAwLmgsIGhvc3RzL2lyaXgzLmg6IGNoYW5nZXMgZnJvbSBXUlMuCi0KLVN1biBTZXAgMjAgMDg6NDg6MjUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBpMzg2LWVsZiBmb3IgYWxsIGkzODYvaTQ4NiBzeXN2NCBob3N0cywgbm90Ci0JanVzdCBuY3IuCi0KLVRodSBTZXAgMTcgMDY6NDA6NDYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlKTogQ2xlYXIgaG93dG8gZmllbGQgYmVmb3JlCi0JZmlsbGluZyBpbiByZWxvYywgaW4gY2FzZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgY29kZSBkb2Vzbid0IHNldAotCWl0LgotCi1GcmkgU2VwIDExIDE1OjM3OjA2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogc2V0IHRoZSBsYXN0IHJlbnVtYmVyZWQKLQlzeW1ib2wgcG9pbnRlciB0byBOVUxMLCBhcyBleHBlY3RlZCBieSBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzLgotCShjb2ZmX3dyaXRlX3JlbG9jcyk6IGFwcGFyZW50bHkgYSBub24temVybyBhZGRlbmQgaXMgT0sgZm9yIHJlbG9jCi0JdHlwZSBSX0lIQ09OU1QgdXNlZCBvbiB0aGUgMjlrLgotCi1UaHUgU2VwIDEwIDEzOjI4OjI0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgRGV0ZXJtaW5lIHdoZXRoZXIgdG8gZmRvcGVuIGZvcgotCXVwZGF0ZSwgYmFzZWQgb24gaG93IHRoZSB1bmRlcmx5aW5nIGZpbGUgd2FzIG9wZW5lZC4gIE9ic29sZXRlcwotCUZBU0NJU1RfRkRPUEVOLgotCSogaG9zdHMvcnM2MDAwLmgsIGhvc3RzL3RhaG9lLmgsIGhvc3RzL3ZheGJzZC5oOiAgUmVtb3ZlCi0JYWxsIEZBU0NJU1RfRkRPUEVOIGNvbmZpZyBkZWZpbmVzLgotCi1UdWUgU2VwICA4IDIxOjM3OjU4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmM6IE1vdmVkIHRvIG9wY29kZXMgbGlicmFyeSwgbm93IHRoYXQgd2UgaGF2ZSBvbmUuCi0JKiBNYWtlZmlsZTogRG9uJ3QgY29tcGlsZSBpdC4KLQotVHVlIFNlcCAgOCAxMDoxMDozNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4Lmg6IGFkanVzdF9zaXplc19hbmRfdm1hcyBkaWQgbm90IHJldHVybiBhbnl0aGluZy4KLQotVGh1IFNlcCAgMyAxOToyOTowNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoYmZkX3NldF9zZWN0aW9uX2ZsYWdzKTogIFJlbW92ZSBhIHNhbml0eSBjaGVjay4KLQlJdCBpcyB1bmZvcnR1bmF0ZWx5IGJyb2tlbiwgYW5kIHByZXZlbnRzIHN0cmlwIGZyb20gd29ya2luZy4KLQotVGh1IFNlcCAgMyAxNjoxNDo0MCAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jIChjb25kcik6IFJlbW92ZSBleHRyYW5lb3VzLCBidXQgaGFybWxlc3MsIGJhY2tsYXNoCi0JY3JlYXRlZCBieSBsYXN0IGNoYW5nZS4KLQotVGh1IFNlcCAgMyAxMzo1MjozOCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3N0cnVjdCk6ICBNYWtlIHNpemUgZmllbGQgYmUgdW5zaWduZWQuCi0JKiBiZmQtaW4uaDogIEJ1bXAgdG8gdmVyc2lvbiAyLjAuCi0KLVRodSBTZXAgIDMgMDk6MDU6MzcgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYm91dC5jLCBjcHUtejhrLmM6ICBVc2UgZW51bXMgd2hlbiBpbml0aWFsaXppbmcgc3RydWN0cyB0byBrZWVwCi0JYnJhaW5kYW1hZ2VkIEhQL0Fwb2xsbyBjb21waWxlciBoYXBweS4KLQotV2VkIFNlcCAgMiAwMjo1MzoyOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogZm9ybWF0LmM6ICBGaXggZGVzY3JpcHRpb24gb2Ygc2VhcmNoIGZvciBtYXRjaGluZyB0YXJnZXQuCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiAgU2V0IFNFQ19DT0RFIGFuZCBTRUNfREFUQS4KLQkqIHRhcmdldHMuYzogIFVwZGF0ZSBkZXNjcmlwdGlvbiBvZiBzZWFyY2ggZm9yIG1hdGNoaW5nIHRhcmdldC4KLQkqIE1ha2VmaWxlLmluIChkb19jbGVhbiwgY2xlYW4pOiAgRml4IGluZmFudCBtb3J0YWxpdHkgdHlwby4KLQkoZG9jZGlyKTogIFNldCB0byAuL2RvYywgbm90ICR7c3JjZGlyfS9kb2MsIHdoaWNoIGhhcyBubyBtYWtlZmlsZS4KLQkoejhrIGFuZCB3ZTMyayBmaWxlcyk6ICBgKi5vOiAqLmMnOiBhdm9pZCBTdW4gTWFrZSBidWcuCi0KLVdlZCBTZXAgIDIgMDA6MjY6MzIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZGVkIG1vc3RseWNsZWFuL2NsZWFuL2Rpc3RjbGVhbiBydWxlcy4KLQotVHVlIFNlcCAgMSAxMzozODo0MCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogIFRha2Ugb3V0IG9hc3lzICh1bmxlc3MgdGhhdCBpcwotCXRoZSBkZWZhdWx0KTogIEJlY2F1c2UgdGhlcmUgaXMgbm8gbWFnaWMgbnVtYmVyIGluIGFyY2hpdmVzLAotCXRoZXJlIGNhbiBiZSBhbm5veWluZyB0YXJnZXQgbWlzLW1hdGNoZXMuCi0KLU1vbiBBdWcgMzEgMTA6MTE6MzcgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYzogUmlnb3JvdXNseSB1cGRhdGVkIHRvIG1hdGNoIGFyY2hpdGVjdHVyZSBtYW51YWwuCi0KLU1vbiBBdWcgMzEgMDg6MDc6NTggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXQ8bj5zd2FwX2V4dF9yZWxvY19vdXQpLCBib3V0LmMKLQkoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOiBmaXggYnVnIDE1MDYgd2hlcmUgYWJzIHN5bWJvbHMgYXR0YWNoZWQKLQl0byB0aGUgYnVpbHQtaW4gYWJzX3NlY3Rpb24gd2VyZSBub3Qgd3JpdHRlbiBvdXQgY29ycmVjdGx5LgotCi1GcmkgQXVnIDI4IDE2OjI5OjE1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYnNkX2FybWFwKTogaWYgdGhlIHN5bWRlZl9jb3VudCBpcyB0b28KLQlsYXJnZSwgYXNzdW1lIHdlJ3JlIHVzaW5nIGEgc3dhcHBlZCBieXRlIG9yZGVyIGFuZCBmYWlsIHdpdGgKLQl3cm9uZ19mb3JtYXQgcmF0aGVyIHRoYW4gZHVtcGluZyBjb3JlLgotCi1GcmkgQXVnIDI4IDE1OjM4OjAzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBSZW5hbWVkIG9wYy1zcGFyYy5jIHRvIHNwYXJjLW9wYy5jIGZvciBzeXN0ZW1zIHdpdGggc2hvcnQKLQlmaWxlbmFtZSBjb25zdHJhaW50cy4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIHRvIHJlZmxlY3QgY2hhbmdlLgotCi1UaHUgQXVnIDI3IDEzOjA1OjI4IDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQlBZGQgcHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgdGhlIHdlMzJrOgotCi0JKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29mZm9jb2RlLmgsIGNvbmZpZ3VyZS5pbiwgdGFyZ2V0cy5jOgotCU1pbm9yIGVkaXRzLgotCSogY29mZi13ZTMyay5jLCBjcHUtd2UzMmsuYywgY29uZmlnL3dlMzJrLm10LCBob3N0cy93ZTMyay5oOiBOZXcgZmlsZXMuCi0KLVdlZCBBdWcgMjYgMTQ6MjA6MTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYzogYWRkZWQgc3VwcG9ydCBmb3IgcmVsYXhhYmxlIGFsaWdubWVudCByZWxvY3MuCi0KLQkqIHNlY2xldC5jIChyZWwsIHNlY2xldF9kdW1wX3NlY2xldCwgc2VjbGV0X2R1bXApOiBnZXQgdGhlIGFwcCB0bwotCXBhc3MgZG93biBwb2ludGVyIHRvIHBsYXkgYXJlYSByYXRoZXIgdGhhbiB1c2UgYWxsb2NhCi0KLQkqIGNwdS16OGsuYyAoY29tcGF0aWJsZSk6IG1hZGUgc3RhdGljIHRvIHJlZHVjZSBuYW1lIHNwYWNlCi0JcG9sdXRpb24uCi0KLVR1ZSBBdWcgMjUgMDg6Mzk6MTAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLSAgICAgICAgQWRkIGJhc2ljIHN1cHBvcnQgZm9yIHRoZSB6OGs6Ci0KLQkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb2ZmY29kZS5oLCBjb25maWd1cmUuaW4sIHJlbG9jLmMsCi0Jc2VjdGlvbi5jLCB0YXJnZXRzLmMsCi0KLQkqIHN5bXMuYzogbW92ZSBtaXMtaW5zZXJ0ZWQgcGF0Y2guCi0KLUZyaSBBdWcgMTQgMTU6Mzk6MjkgUERUIDE5OTIgIEhvd2FyZCBDaHUgIChoeWNAaGFuYXVtYS5qcGwubmFzYS5nb3YpCi0KLQlEb2N1bWVudGF0aW9uIGZpeGVzOgotCSogY3RvcnMuYywgZm9ybWF0LmMsIHNlY3Rpb24uYywgcmVsb2MuYzogYXBwZW5kICIgLSIgdG8gaXRlbSB0YWdzLgotCSogcmVsb2MuYywgc2VjdGlvbi5jLCBzeW1zLmMsIHRhcmdldHMuYzogYWRkIERPQ0REIGJlZm9yZSBAbm9kZQotCQljb21tZW50cy4KLQkqIHJlbG9jLmM6IGJyZWFrIG91dCBhZGRlbmQgaXRlbSBmcm9tIHN1cnJvdW5kaW5nIHRleHQuCi0KLQkqIGRvYy5zdHIgKERPQ0REKTogRGVmaW5lZC4gQWRkcyB0ZXh0IHRvIG91dHB1dC4KLQkoYm9keXRleHQpOiBQdXQgYnVsbGV0aXplIGJlZm9yZSBraWxsX2JvZ3VzX2xpbmVzLgotCSogY2hldy5jIChidWxsZXRpemUpOiBFbmQgaXRlbWl6YXRpb24gYWZ0ZXIgYSBibGFuayBsaW5lLCB0bwotCXByZXZlbnQgZm9sbG93aW5nIHRleHQgZnJvbSBiZWluZyBzd2FsbG93ZWQgdXAgaW4gYW4gaXRlbS4KLQotTW9uIEF1ZyAyNCAyMDo1MDoyMiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgc3BhcmNsaXRlIGFzIGEgdGFyZ2V0LgotCi1Nb24gQXVnIDI0IDEyOjA2OjMxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGllZWVfZ2V0X3N5bXRhYik6IGFsd2F5cyBudWxsIHRlcm1pbmF0ZSB0aGUgc3ltYm9sIGxpc3QsCi0JbGludC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogaWYgc3ltYm9scyBkb24ndCBjb21lCi0JZnJvbSBhIGNvZmYgZmlsZSAoY3N5bSBpcyBudWxsKSwgZG9udCBkZXJlZiB0aGVtCi0KLQkqIGllZWUuYyAocGFyc2VfZXhwcmVzc2lvbik6IGdldCB0aGUgYW5zd2VyIHJpZ2h0IHdoZW4gYWRkaW5nIGFuCi0JYWJzKyhzZWMrb2ZmKSwgKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogY2FsbCBpZWVlX29iamVjdF9wCi0Jb24gZWx0cyBzbyB0aGF0IGZpbGVuYW1lIGlzIGZpbGxlZCBpbi4KLQotVGh1IEF1ZyAyMCAxOTowNTo0OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChob3d0b19hbGlnbl90YWJsZSk6IE5ldyBzZXQgb2YgcmVsb2NzLCB3aXRoIGVub3VnaAotCWRhdGEgZm9yICJvYmpkdW1wIC1yIiB0byB3b3JrLgotCShiX291dF9yZWxvY190eXBlX2xvb2t1cCk6IFJlY29nbml6ZSBhbGlnbm1lbnQgcmVsb2NzLgotCi1UdWUgQXVnIDE4IDEyOjU3OjQ1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotIAkqIE1ha2VmaWxlLmluOiBhZGRlZCBGTEFHU19UT19QQVNTLCBhbmQgdXNlZCBpdCBmb3IgYWxsIHJlY3Vyc2l2ZQotCWludm9jYXRpb25zIG9mIG1ha2UuICBBbHNvLCBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbgotCWRpcmVjdG9yaWVzLgotCi0JKiBjb25maWcvYXBvbGxvdjY4Lm1oOiByZW1vdmVkIC1nIGZyb20gQ0MgZGVmaW5pdGlvbi4KLQotTW9uIEF1ZyAxNyAxMzo0MDowOCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlY3N0YXRpb24ubWggKEhERUZJTkVTKTogU3BlY2lmeSAiLUcgNCIgdG8gYXZvaWQKLQlvdmVyZmxvd2luZyBncC1vZmZzZXQgcmFuZ2UuCi0KLU1vbiBBdWcgMTcgMTE6NDQ6MjggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYyAoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IGRvbid0IHdyaXRlIG91dCBzZWN0aW9ucwotCXdpdGhvdXQgdGhlIExPQUQgYW5kIEFMTE9DIGF0dHJpYnV0ZXMKLQotTW9uIEF1ZyAxNyAxMTo1NTowNyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmMsIGNwdS1tNjhrLmMsIGNwdS1zcGFyYy5jOiBVbmRvIDE2IEp1bmUgY2hhbmdlcy4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogTmV3IGNhbGxiYWNrICJzZXRfc2l6ZXMiLgotCSogYW91dC10YXJnZXQuaCAoY2FsbGJhY2spOiBEb24ndCBzZXQgcGFnZS9zZWcgc2l6ZXMuCi0JKG1rb2JqZWN0KTogRGl0dG8uCi0JKHNldF9zaXplcyk6IE5ldyByb3V0aW5lLgotCShiYWNrZW5kX2RhdGEpOiBQb2ludCB0byBpdC4KLQkqIGFvdXRmMS5oIChzdW5vczRfc2V0X3NpemVzKTogSGVlZCBhcmNoaXRlY3R1cmUgd2hlbiBzZXR0aW5nIHNpemVzLgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogUG9pbnQgdG8gaXQuCi0JKiBhb3V0eC5oIChzZXRfYXJjaF9tYWNoKTogQ2FsbCBzZXRfc2l6ZXMgY2FsbGJhY2suCi0KLUZyaSBBdWcgMTQgMTk6MjI6MTggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0Lmg6ICBNYWtlIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZQotCXRoZSBkZWZhdWx0LiAgR2l2ZW4gdGhhdCB3ZSAqd3JpdGUqIHRoZSBzdWNrZXJzIChmb3IgbG9uZwotCWFyY2hpdmUgbWVtYmVyIG5hbWVzKSwgd2UgcmVhbGx5IG91Z2h0IHRvIGJlIGFibGUgdG8gcmVhZCB0aGVtIQotCSogdHJhZC1jb3JlLmM6ICBEb24ndCBpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPi4gIEl0IGRvZXNuJ3QKLQlzZWVtIHRvIGJlIG5lZWRlZCwgYW5kIG1hbnkgbWFjaGluZXMgZG9uJ3QgaGF2ZSBpdC4KLQotVGh1IEF1ZyAxMyAwOTo1MzozOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tNjhrLmMgKHZlY3Rvcik6IHJlYWQgYW5kIHdyaXRlIGFyY2hpdmVzIGluIGNvZmYgZm9ybWF0LgotCi1UdWUgQXVnIDExIDEyOjE5OjQyIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBvcGMtc3BhcmMuYzogTmV3IGZpbGUuCi0KLVNhdCBBdWcgIDggMjM6MTU6MzUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYmZkX3JlbG9jX3N0YXR1c190eXBlLCBjYWxsal9jYWxsYmFjayk6ICBDYXN0IHZvaWQqCi0JcG9pbnRlcnMgdG8gYmZkX2J5dGUqIGJlZm9yZSBwZXJmb3JtaW5nIGFyaXRobWV0aWMgb24gdGhlbS4gIFN1Y2gKLQl1c2Ugd2l0aCBiYXJlIHZvaWQqIHBvaW50ZXJzIGlzIGEgZ2NjIGV4dGVuc2lvbi4KLQkqIGNhY2hlLmMgKGJmZF9jYWNoZV9kZWxldGUpOiAgRm9yd2FyZCBkZWNsIHdpdGggcHJvdG90eXBlIGZvcm0uCi0JKiBhcmNoaXZlIChub3JtYWxpemUpOiAgQWRkIHRvIENPTlNUIHRvIG1hdGNoIGFjdHVhbCB1c2FnZXMgd2l0aAotCUNPTlNULgotCi1Nb24gQXVnICAzIDAwOjM1OjI5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgaTQ4NiBob3N0IGNwdSwgYW5kIHVzZSBpMzg2LWVsZgotCWZvciBpNDg2LW5jci1zeXN2NC4KLQotU2F0IEF1ZyAgMSAxMzo0OTo1OSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3N0cmF0dXMubXQgKENDKTogIFJlbW92ZSBkZWZpbml0aW9uLgotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBUZXN0IGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdAotCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXggcmV0dXJucyBOVUxMIGFuZCBkb24ndCBkZXJlZmVyZW5jZSBpdC4KLQotTW9uIEp1bCAyMCAwMjo0NjowOSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGFkZCBocHBhX2RhdGEgdG8gYmZkIHRkYXRhIChpbmRpcmVjdGx5IHZpYSBzZWYpLgotCi0JKiBjb25maWcvaHBwYWhwdXgubWg6IGhwdXggaXMgLURVU0cgKHBhdGNoIGJ5IHNlZikKLQotU2F0IEp1bCAxOCAxNTo1MDoxMSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyLCBub3Qgc3Rkb3V0Ci0KLUZyaSBKdWwgMTcgMTg6MzI6NDYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBiZmQuYywgY2FjaGUuYywgY29mZi1hMjlrLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywKLQkgIGNvZmYtbTY4ay5jLCBjb2ZmLW04OGsuYywgZGVtbzY0LmMsIGxpYmFvdXQuaCwgbGliYmZkLmMsCi0JICBvYXN5cy5jLCBvcG5jbHMuYywgc3Vub3MuYywgdGFyZ2V0cy5jOiByZW1vdmVkIHJjc2lkJ3MuCi0KLUZyaSBKdWwgMTcgMTc6MDY6NTYgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBocHBhKiBpbnN0ZWFkIG9mIGhwcGEKLQotVGh1IEp1bCAxNiAxNjozOToyNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tNjhrLmM6IGFkZGVkIFJfUkVMTE9OR19ORUcgcmVsb2MgdHlwZSwgYW5kIGNoYW5nZWQKLQlSVFlQRTJIT1dUTyB0byBjb3BlIHdpdGggc2FtZS4KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBhZGRlZCBzdXBwb3J0IGZvciBzaXplIG9mIC0yCi0JKHN1YnRyYWN0IGEgd29yZCByZWxvYyB0eXBlKS4gVXBkYXRlZCBkb2MuCi0KLVRodSBKdWwgMTYgMTY6Mjg6MDkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWVyZ2VkIGNoYW5nZXMgZnJvbSBwcm9ncmVzc2l2ZSwgcmVtb3ZlZCByY3NpZC4KLQotCSogYXJjaHVyZXMuYywgYXJjaGl2ZS5jLCBNYWtlZmlsZS5kb3M6IHJlbW92ZWQgcmNzaWQuCi0KLVRodSBKdWwgMTYgMDg6MDg6MjUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIDogYWRkIEJGRF9JU19SRUxBWEFCTEUgZmxhZwotCSogYm91dC5jIChib3V0X3N3YXBfZXhlY19oZWFkZXJfW2luX291dF0pOiBuZXcgZmllbGQgaW4gZXhlYwotCWhlYWRlciBlX3JlbGF4YWJsZSwgbWFqb3IgaGFja2VyeSBpbiBjYWxsYmFja3MKLQkqIGxpYmFvdXQuaCA6IGFkZCBzcGFjZSBmb3IgYV9yZWxheGFibGUuCi0JKiBzZWNsZXQuYyAocmVsKTogZG9uJ3QgcmVsYXggZW1wdHkgc2VjdGlvbnMKLQotCi1XZWQgSnVsIDE1IDA3OjU3OjQ2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNURF9TRUNUSU9OKTogYWRkIHNvbWUgY2FzdHMgdG8gdGhlIGluaXRpYWxpemVycyBmb3IKLQlkdW1iIGNvbXBpbGVycwotCi1UdWUgSnVsIDE0IDE0OjA2OjI4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogIEdyZWF0bHkgc2ltcGxpZnkgZXhwcmVzc2lvbiwKLQlhbmQgYWRkIGFwcHJvcHJpYXRlIGNhc3RzIHRvIGtlZXAgKHBpY2F5dW5lKSBhaXgtY2MgaGFwcHkuCi0KLU1vbiBKdWwgMTMgMDU6MDY6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIE5vdyAybmQgYXJnIGlzIHdoZXJlIHRvIHdyaXRlCi0Jc3ltYm9sIHBvaW50ZXJzLiAgUHVudCBleHBlbnNpdmUgJiB1c2VsZXNzIGJmZF9yZWFsbG9jLiAgVXNlCi0JbWFsbG9jIGZvciByYXcgc3ltYm9scywgYW5kIGZyZWUgaXQgYmVmb3JlIHJldHVybmluZy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIERvIG5vdCBzbHVycCBzeW1ib2wgdGFibGUgdW50aWwgcG9saXRlbHkKLQlhc2tlZC4gCURvIG5vdCBldmVuIHNsdXJwIHN0cmluZyB0YWJsZXMuCi0JKGVsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogIENvdW50ICdlbSB3aXRob3V0IHJlYWRpbmcgdGhlbS4KLQkoZWxmX2dldF9zeW10YWIpOiAgVGhpcyBpcyBob3cgdG8gcG9saXRlbHkgYXNrLiAgU2NobHVycCEKLQlUaGlzIHNob3VsZCBwcm9iYWJseSBqdXN0ICpiZWNvbWUqIGVsZl9zbHVycF9zeW1ib2xfdGFibGUsIEZJWE1FLgotCi1XZWQgSnVsICA4IDE2OjI0OjMzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcm1hcCk6IHdyaXRlIHRoZSB0aW1lc3RhbXAgb2YgdGhlCi0JYXJjaGl2ZSBoZWFkZXIgdG8gYmUganVzdCBhIGxpdHRsZSBiaXQgbGF0ZXIgdGhhbiB0aGUgdGltZXN0YW1wIG9mCi0JdGhlIGZpbGUsIG90aGVyd2lzZSB0aGUgbGlua2VyIHdpbGwgY29tcGxhaW4gdGhhdCB0aGUgaW5kZXggaXMKLQlvdXQgb2YgZGF0ZS4KLQotVHVlIEp1bCAgNyAwMDoyMzoyMyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgbTY4ay1lcmljc3Nvbi0qLgotCi1TYXQgSnVsICA0IDAzOjI5OjQxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzeW1zLmg6ICBEZWZpbmUgQlNGX0ZJTEUsIHVwZGF0ZSBCU0ZfU0VDVElPTl9TWU0gZGVzYy4KLQkqIGVsZi5jOiAgUmVtb3ZlIHVuY29uZGl0aW9uYWwgZGVidWcgcHJpbnRmJ3MuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMsIGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgSGFuZGxlCi0JQlNGX1NFQ1RJT05fU1lNIDw9PiBTVFRfU0VDVElPTiwgQlNGX0ZJTEUgPD0+IFNUVF9GSUxFLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIEhhbmQgb3V0IHN5bWJvbHMgaW4gZm9yd2FyZCwgbm90Ci0JcmV2ZXJzZSBvcmRlci4gIFNpbXBsaWZ5IGR1cGxpY2F0ZSBjb2RlLgotCi1GcmkgSnVsICAzIDIwOjIzOjM0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogIFJlbW92ZSAiKHZvaWQpIiBjYXN0cyBmcm9tIGZ1bmN0aW9uIGNhbGxzIHdoZXJlIHRoZQotCXJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLCBpbiBhY2NvcmRhbmNlIHdpdGggR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLVR1ZSBKdW4gMzAgMTY6NDk6MTIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYzogIEFwcGx5IEpvaG4ncyBzdGFuZGFyZCBmaXggdG8gYXZvaWQgImVtcHR5IHRyYW5zbGF0aW9uCi0JdW5pdCIgd2FybmluZ3MgZnJvbSBzb21lIEFOU0ktQyBjb21waWxlcnMuCi0KLVRodSBKdW4gMjUgMDQ6Mzk6MjUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3NvbGFyaXMyLmg6ICBDb25maWd1cmUgc2FtZSBhcyBzeXN2NC4KLQotVHVlIEp1biAyMyAyMTo1NDo0NCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmgsIGxpYmJmZC1pbi5oIChiZmRfc2Vlayk6ICBNYWtlIHByb3RvdHlwZSBtYXRjaCBkZWZpbml0aW9uLgotCSogcmVsb2MuYyAoYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXApOiAgTWFrZSBjYXN0IG9uIHJldHVybgotCXR5cGUgbWF0Y2ggYWN0dWFsIHJldHVybiB0eXBlLgotCSogZWxmX3ByaW50X3N5bWJvbCAoc2VjdGlvbl9uYW1lKTogIE1ha2UgQ09OU1QuCi0KLU1vbiBKdW4gMjIgMTc6MzU6MjQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGkzODZsaW51eC5jLCBob3N0cy9pMzg2bGludXguaCwgY29uZmlnL2kzODYtbGludXgubXQ6Ci0JTmV3IGZpbGVzLCBmb3IgTGludXggKGEgZnJlZSBVbml4IGNsb25lIGZvciAzODYgbWFjaGluZXMpLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbiwgdGFyZ2V0cy5jOiAgVXBkYXRlIGFjY29yZGluZ2x5LgotCi1GcmkgSnVuIDE5IDIwOjIzOjIxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCUxpbnRzIGZvciBiZmRfcmVsb2NfY29kZV90eXBlLT5iZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsIGFuZAotCWNvcnJlY3QgY2FsbGluZyBvZiBob3d0byBzcGVjaWFsIGZ1bmN0aW9ucyBhbmQgZml4ZXMgZnJvbSBSYWVidXJuCi0JZm9yIGdhczw+YmZkbmVzcwotCSogYXJjaHVyZXMuYzogbnVrZSBiZmRfcmVsb2NfY29kZV90eXBlCi0JKiBib3V0LmMsIGNwdS1oODMwMC5jLCBjb2ZmLWk5NjAuYywgY29mZi1tODhrLmM6IHNwZWNpYWwgZnVuY3Rpb24gbGludAotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBTVFlQX0lORk8gaXMgbWFya2VkIGFzCi0JU0VDX05FVkVSX0xPQUQsIHZhcmlvdXMgb3RoZXIgYmZkZ2FzIG5ld25lc3MKLQkqIHJlbG9jLmMtPmxpYmJmZC5oOiBjaGFuZ2UgcHJvdHlwZSBvZiBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotCSogdGFyZ2V0cy5jOiBjaGFuZ2UganVtcCB0YWJsZSB2ZWN0b3IgdG8gYWJvdmUKLQotCi1GcmkgSnVuIDE5IDE5OjAwOjQ1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiAgTWFyayBhcyBJTlRFUk5BTF9GVU5DVElPTiBzbwotCWl0cyBwcm90b3R5cGUgd2lsbCBiZSBpbmNsdWRlZCBpbiBsaWJiZmQuaC4gIENoYW5nZSByZXN1bHQgdHlwZQotCXRvIHN0cnVjdCAqIChyYXRoZXIgdGhhbiBlcXVpdmFsZW50IHR5cGVkZWYpIHNvIGl0IGNhbiBiZSB1c2VkIGluCi0JdGhlIHByb3RvdHlwZSwgd2hlcmUgdGhleSB0eXBlZGVmIHdvbid0IGJlIGtub3duLgotCSogbGliYmZkLmg6ICBVcGRhdGVkIHZlcnNpb24uCi0KLUZyaSBKdW4gMTkgMTU6MjE6NTYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGFyY2h1cmVzLmMsIGNvbmZpZ3VyZS5pbiwgY3B1LWhwcGEuYywgaHBwYS5jLCBsaWJocHBhLmgsCi0JdGFyZ2V0cy5jOiAgSFBQQSBtZXJnZS4KLQotRnJpIEp1biAxOSAxMjoyMTozOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgU2VwYXJhdGUgU29sYXJpczIgZnJvbSBTWVNWNCBvbiBTUEFSQy4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taDogIEtsdWRnZSBhcm91bmQgU3VuIGNvbXBpbGVyIGJ1Zy4KLQotV2VkIEp1biAxNyAxNDowMjo0NiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKGFvdXRfYmFja2VuZF9kYXRhKTogIENoYW5nZSBkZWZzIG9mIHR3byBiaXRmaWVsZHMgdG8KLQliZSB1bnNpZ25lZCBjaGFycyBpbnN0ZWFkIHRvIGdldCBhcm91bmQgcnM2MDAwIGNvbXBpbGVyIHByb2JsZW0uCi0KLVdlZCBKdW4gMTcgMTM6NTU6MzEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIsIGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOgotCUNvcnJlY3QgbWlzY29uY2VwdGlvbiB0aGF0IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBzeW1ib2wgdGFibGUuCi0JT25seSBjYWxsIGVsZl9zbHVycF9zeW1ib2xfdGFibGUgb24gdGhlIGZ1bGwgc3ltYm9sIHRhYmxlLCBub3QKLQl0aGUgZHluYW1pYyBvbmUgd2hpY2ggaXMgb25seSBhIHN1YnNldCBvZiB0aGUgZnVsbCBvbmUuCi0KLVdlZCBKdW4gMTcgMTU6NTQ6NTcgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRm9yIEk5NjAsCi0JZG9uJ3QgYWxpZ24gc2VjdGlvbnMgaW4gZmlsZS4KLQotVHVlIEp1biAxNiAwNjoyODoyMSAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogdGFyZ2V0cy5jIChzdHJ1Y3QgYmZkX3RhcmdldCk6IEFkZGVkIGZpZWxkIGZvciB0YXJnZXQtc3BlY2lmaWMKLQkoYnV0IG5vdCBmaWxlLXNwZWNpZmljKSBkYXRhLCBmb3IgZGlzdGluZ3Vpc2hpbmcgbWlub3IKLQljaGFyYWN0ZXJpc3RpY3MgYmV0d2VlbiAoZS5nLikgYS5vdXQgZm9ybWF0cy4KLQotCSogc2VjdGlvbi5jIChzdHJ1Y3Qgc2VjKTogTmV3IGZpZWxkIHVzZXJfc2V0X3ZtYSBpbmRpY2F0ZXMgdm1hCi0JZmllbGQgc2hvdWxkIGJlIGhlZWRlZCwgbm90IGFzc3VtZWQgdG8gYmUgdW5zZXQuCi0JKFNURF9TRUNUSU9OKTogSW5pdGlhbGl6ZSB0aGF0IGZpZWxkIG9mIHN0YW5kYXJkIHNlY3Rpb25zIHRvIHplcm8uCi0JKiBiZmQtaW4uaCAoYmZkX3NldF9zZWN0aW9uX3ZtYSk6IFNldCB1c2VyX3NldF92bWEgdG8gdHJ1ZS4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9yZWxvY3MpOiBXcml0ZSBvdXQgc3dhcHBlZCByZWxvYywgbm90Ci0JcHJlLXN3YXBwZWQgdmVyc2lvbi4KLQotCSogYXJjaHVyZXMuYyAoc3RydWN0IGJmZF9hcmNoX2luZm8pOiBGaXhlZCBvcmRlciBvZiBjb21tZW50IGFuZAotCWZpZWxkIGRlY2wuICBOZXcgZmllbGRzIGluZGljYXRlIHNpemUgb2YgcGFnZSBhbmQgc2VnbWVudCBmb3IKLQlhcmNoaXRlY3R1cmUuCi0JKiBjcHUtbTY4ay5jIChOKTogRmlsbCBpbiB2YWx1ZXMuCi0JKiBjcHUtc3BhcmMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IERpdHRvLgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IFZhcmlvdXMgYml0cyBvZiBkYXRhIChub3QKLQlhbGwgdXNlZCBjdXJyZW50bHkpIHdpdGggY2hhcmFjdGVyaXN0aWNzIG9mIGEub3V0IGltcGxlbWVudGF0aW9uLgotCUltcG9ydGFudCBmaWVsZCBmb3Igbm93IGlzIHRleHRfaW5jbHVkZXNfaGVhZGVyLCBpbmRpY2F0aW5nIHRoYXQKLQl0aGUgdGV4dCBzZWN0aW9uIHN0YXJ0cyBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlsZSBoZWFkZXIsIHdoaWNoCi0JZ2V0cyBtYXBwZWQgaW4gd2l0aCBpdC4KLQkoc3RydWN0IGFvdXRfZGF0YSk6IE5ldyBmaWVsZHMgaW5kaWNhdGUgd2hldGhlciB2bWEgaGFzIGJlZW4KLQlhZGp1c3RlZCB5ZXQgKG5vdCB5ZXQgdXNlZCksIGFuZCB3aGF0IG1hZ2ljIG51bWJlciB3aWxsIGJlIHVzZWQgaW4KLQl0aGUgb3V0cHV0IGZpbGUgKHNob3VsZCBnbyBhd2F5IGluIGZhdm9yIG9mIHZtYV9hZGp1c3RlZCkuCi0JKFdSSVRFX0hFQURFUlMpOiBDb2RlIGZvciBkZWFsaW5nIHdpdGggc2VjdGlvbiBzaXplcyBhbmQgcmVsYXRlZAotCWhlYWRlciBmaWVsZHMgcmVwbGFjZWQgd2l0aCBjYWxsIHRvIGFkanVzdF9zaXplc19hbmRfdm1hcy4KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6IEZpbGwgaW4gbWFnaWMgbnVtYmVyIGZpZWxkLgotCVNldCBXUF9URVhUIGZsYWcgZm9yIFpNQUdJQyBhcyB3ZWxsIGFzIE5NQUdJQyBmaWxlcy4KLQkoc2V0X2FyY2hfbWFjaCk6IFNldCBwYWdlIHNpemUgYW5kIHNlZ21lbnQgc2l6ZSBvbmNlIENQVQotCXR5cGUgaXMga25vd24uCi0JKGFkanVzdF9zaXplc19hbmRfdm1hcyk6IE5ldyBmdW5jdGlvbjsgaGFzIG11Y2ggY29kZSBtb3ZlZAotCWZyb20gc2V0X3NlY3Rpb25fY29udGVudHMgYW5kIFdSSVRFX0hFQURFUlMuICBTZXRzIG9yIGFkanVzdHMgdm1hCi0JYW5kIHNpemUgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBtYW55IGhlYWRlciBmaWVsZHMsIGFmdGVyIGRlY2lkaW5nCi0Jb24gbWFnaWMgbnVtYmVyIGZvciBvdXRwdXQgZmlsZS4gIENoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGlzCi0JYWRqdXN0bWVudCBoYXMgb25seSBiZWVuIGRvbmUgb25jZS4KLQkoc2V0X3NlY3Rpb25fY29udGVudHMpOiBDYWxsIGFkanVzdF9zaXplc19hbmRfdm1hcyBpbnN0ZWFkIG9mCi0JZG9pbmcgbXVjaCBvZiB0aGUgd29yayBoZXJlLgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV9tYWtlX2RlYnVnX3N5bWJvbCwgTVlfYmFja2VuZF9kYXRhKTogUHJvdmlkZQotCWRlZmF1bHQgKG51bGwpIHZhbHVlcyBvZiB0aGVzZSBmaWVsZHMuCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IG92ZXJyaWRlIGFfdGV4dAotCXZhbHVlIGluIGV4ZWMgaGVhZGVyLgotCShzdW5vczRfYW91dF9iYWNrZW5kLCBNWV9iYWNrZW5kX2RhdGEpOiBEZWZpbmUgYmFja2VuZCBkYXRhCi0JaW5kaWNhdGluZyBmaWxlIGhlYWRlciBpcyBpbmNsdWRlZCBpbiB0ZXh0IHNlY3Rpb24uCi0KLQkqIGFvdXRmMS5oIChNWV9yZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IEZpeCB0eXBvLgotCi0JKiBob3N0cy9zcGFyYy5oIChhYm9ydCwgZXhpdCk6IEhpZGUgdGhlc2UgbmFtZXMgaWYgY29tcGlsaW5nIHdpdGgKLQlnY2MgdmVyc2lvbiAyLCB0byBhdm9pZCB3YXJuaW5ncy4KLQotTW9uIEp1biAxNSAxMjoyNjo1NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL25jcjMwMDAubWggKElOU1RBTEwsIFJBTkxJQik6ICBEb24ndCB1c2UgL3Vzci91Y2IvaW5zdGFsbCwKLQlpdCdzIGJyb2tlbiBvbiBuY3IgMzAwMCdzLiAgVXNlIHNpbXBsZSAidHJ1ZSIgZm9yIFJBTkxJQi4KLQotU2F0IEp1biAxMyAwOToxNjo0MyAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG02ODBbMDEyMzRdMC13cnMtKik6IEZpeCB0eXBvIGluIG1hdGNoIHBhdHRlcm4uCi0KLUZyaSBKdW4gMTIgMTk6NDg6MzQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoU1REX1NFQ1RJT04pOiAgUmVtb3ZlIGV4dHJhIHNlbWljb2xvbiBpbiBkZWNsYXJhdGlvbnMuCi0JKiBjb25maWd1cmUuaW46ICBSZXdyaXRlIHRhcmdldCBwYXJzaW5nIHRvIHVzZSBzaW1wbGUgZm9ybWF0LgotCUhhbmRsZSBzcGFyYy1zdW4tc29sYXJpczIgY29uZmlndXJhdGlvbi4KLQkqIGFvdXQ2NC5oOiAgQXZvaWQgQU5TSSBDIGJyYWluIGRlYXRoIHdhcm5pbmcuCi0JKiBlbGYuYzogIEF2b2lkIHRyaWdyYXBoICg/Pz8pIG9yIC8qIGluIGNvbW1lbnRzLgotCi1GcmkgSnVuIDEyIDE0OjUxOjE0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3N5c3Y0Lm1oOiBuZXcgZmlsZSwgUkFOTElCPWVjaG8KLQotCSogY29uZmlndXJlLmluOiBoYW5kbGUgU29sYXJpczIgYXMgLXN5c3Y0IG9yIC1zb2xhcmlzMgotCi1UaHUgSnVuIDExIDAwOjUyOjAzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX29ial90ZGF0YSk6ICBNZXJnZSBlbGZfb2JqX3RkYXRhX3N0cnVjdCBhbmQKLQllbGZfY29yZV90ZGF0YV9zdHJ1Y3QgaW50byBhIHNpbmdsZSBjb21tb24gc3RydWN0LiAgQ29yZSBmaWxlcwotCXdvdWxkbid0IGhhdmUgd29ya2VkIGF0IGFsbCB3aXRob3V0IHRoaXMuCi0JKGJmZF9lbGZfZmluZF9zZWN0aW9uKTogIE5ldyBmdW5jdGlvbiBmb3IgR0RCJ3MgdW5kZXJjb3ZlciB1c2UKLQl0byBmaW5kIHN0cmluZyBzZWN0aW9ucyB0aGF0IEJGRCBoaWRlcyBmcm9tIGl0LgotCShlbGZfZ2V0X3N0cl9zZWN0aW9uKTogIEF2b2lkIG11bHRpcGxlIGFsbG9jJnJlYWRzIGZvciBzYW1lIGRhdGE7Ci0JbGludC4KLQkoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiAgQWxsb2NhdGUgaW50ZXJuYWwgZmlsZSBoZWFkZXIKLQlzdG9yYWdlIGR5bmFtaWNhbGx5LgotCSogYmZkLmMgKHVuaW9uIHsuLi59IHRkYXRhKTogIFJlbW92ZSBlbGZfY29yZV90ZGF0YV9zdHJ1Y3QuCi0JKiBkZW1vNjQuYzogIFByZXZlbnQgImVtcHR5IHRyYW5zbGF0aW9uIHVuaXQiIHdhcm5pbmdzIGZyb20gaWRpb3RzLgotCi1UdWUgSnVuICA5IDE3OjE1OjI2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcve2kzODZ2NC5taCwgbmNyMzAwMC5taH06ICBVcGRhdGUgUkFOTElCLCBhZGQgSU5TVEFMTC4KLQotU2F0IEp1biAgNiAxNzowMjo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgSGFuZGxlIFNvbGFyaXMyIGFzICotc3VuLXN5c3Y0IG9yIGFzICotc3VuLXN1bm9zNS4KLQotU3VuIE1heSAzMSAwNTo0NTowMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGhhbmRsZSBtNjgwWzAxMjM0XTAgYXMgYWxpYXNlcyBmb3IgbTY4awotCi1UdWUgTWF5IDI2IDE2OjUwOjU5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWEyOWsuYzogZG8gYnl0ZSByZWxvY3MgY29ycmVjdGx5Ci0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IG5ldmVyIGxvYWQgSU5GTyBzZWN0aW9ucwotCSogc2VjbGV0LmMgKHJlbCk6IGRvbid0IHJlbG9jYXRlIElORk8gc2VjdGlvbnMKLQotV2VkIE1heSAyMCAwODoxODoxOCAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogc2VjdGlvbi5jIChiZmRfKl9zeW1ib2wsIGJmZF8qX3NlY3Rpb24pOiBJbml0aWFsaXplIHN0YXRpY2FsbHkuCi0JTWFrZSB0aGUgc3ltYm9scyB1bm1vZGlmaWFibGUuCi0JKGJmZF9zZWN0aW9uX2luaXQpOiBEZWxldGVkLgotCSogaW5pdC5jIChiZmRfaW5pdCk6IERvbid0IGNhbGwgYmZkX3NlY3Rpb25faW5pdC4KLQotCSogc2VjdGlvbi5jIChiZmRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBFbnN1cmUgdGhhdCByYW5nZSB0byBiZQotCXdyaXR0ZW4gaXMgd2l0aGluIHNlY3Rpb24gYm91bmRhcmllcy4KLQkoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuICBEb24ndCBib3RoZXIgZGlzcGF0Y2hpbmcgaWYKLQlzaXplIGlzIHplcm8uCi0KLQkqIGxpYmJmZC5jIChiZmRfeG1hbGxvYyk6IFRleHQgb2YgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgY29uc3QuCi0KLQkqIGNvZmYtaTk2MC5jIChob3d0b190YWJsZSk6IERlbGV0ZWQuCi0JKGhvd3RvX3JlbGxvbmcsIGhvd3RvX2lwcm1lZCwgaG93dG9fb3B0Y2FsbCk6IE5ldyB2YXJzOwotCWludGVyZXN0aW5nIGVudHJpZXMgZnJvbSBvbGQgaG93dG9fdGFibGUuCi0JKFJUWVBFMkhPV1RPKTogQWRqdXN0ZWQgdG8gdXNlIHN3aXRjaC4KLQkoY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBBbGxvY2F0ZSBzdG9yYWdlIGZvciBhdXgKLQlyZWNvcmRzIGZvciBzZWN0aW9uIHN5bWJvbC4KLQkobWFrZV9hYnNfc2VjdGlvbik6IFVudXNlZDsgZGVsZXRlZC4KLQkocmVudW1iZXJfc3ltYm9scyk6IFJlLW9yZGVyIHN5bWJvbHMgc28gdW5kZWZpbmVkIHN5bWJvbHMgY29tZQotCWxhc3QsIGFzIENPRkYgZm9ybWF0IGRlc2lyZXMuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogUHV0IENfRklMRSBzeW1ib2xzIGluIGRlYnVnIHNlY3Rpb24gYWx3YXlzLgotCShjb2ZmX3NlY3Rpb25fc3ltYm9sKTogTmV3IGZ1bmN0aW9uOyBjcmVhdGVzIGEgc3ltYm9sIHdpdGggdGhlCi0Jc2FtZSBuYW1lIGFzIGEgc2VjdGlvbiwgYW5kIHNldHMgdXAgYXV4IHJlY29yZHMgZm9yIGl0LgotCShjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb247IGFkZHMgc2VjdGlvbiBzeW1ib2xzIHRvCi0Jc3ltYm9sIHRhYmxlIGlmIHRoZXkgYXJlbid0IHRoZXJlIGFscmVhZHkuICBTaG91bGQgc29tZWRheSBhbHNvCi0JYWRkIGEgZHVtbXkgQ19GSUxFIHN5bWJvbCBpZiBub25lIGlzIHByZXNlbnQuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQWRkIG1pc3Npbmcgc3ltYm9scyBiZWZvcmUgcHJlcGFyaW5nCi0Jc3ltYm9sIHRhYmxlIHRvIGJlIHdyaXR0ZW4uCi0JKGNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBWZXJpZnkgdGhhdCBzeW1ib2wgaW5kaWNlcyByZWFkIGluIGFyZQotCWluIGEgcmVhc29uYWJsZSByYW5nZS4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfdGRhdGEpOiBOZXcgZmllbGQgY29udl90YWJsZV9zaXplLgotCShvYmpfY29udl90YWJsZV9zaXplKTogQWNjZXNzb3IgbWFjcm8uCi0KLQkqIGJvdXQuYyAoYl9vdXRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uICBIYW5kbGVzIHRocmVlCi0JcmVsb2MgdHlwZXMgb24gaTk2MC4KLQotCSogYmZkLWluLmggKGJmZF9nZXRfc2VjdGlvbl9uYW1lKTogTmV3IG1hY3JvLiAgTGlrZQotCWJmZF9zZWN0aW9uX25hbWUsIGJ1dCByZXR1cm5zIHJ2YWx1ZSwgbm90IGx2YWx1ZS4KLQkoYmZkX2dldF9zZWN0aW9uX3ZtYSwgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCk6IFNpbWlsYXIuCi0JKGJmZF9nZXRfc2VjdGlvbl9mbGFncyk6IE5vdyByZXR1cm5zIHJ2YWx1ZS4KLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkIHNldmVyYWwgbmV3IHZhbHVlcywgc29tZQotCWdlbmVyYWwsIHNvbWUgc3BlY2lmaWMgdG8gc3BhcmMgb3IgaTk2MC4KLQotCSogYW91dHguaCAoc2V0X3NlY3Rpb25fY29udGVudHMpOiBTZXQgVk1BIGZvciBlYWNoIHNlY3Rpb24gYmFzZWQKLQlvbiBwcmV2aW91cyBzZWN0aW9uLiAgSWYgdGV4dCBzZWN0aW9uIFZNQSBkb2Vzbid0IGFwcGVhciB0byBoYXZlCi0JYmVlbiBzZXQsIG1ha2UgYSBiZXN0IGd1ZXNzIGZyb20gdGhlIHR5cGUgb2YgZmlsZS4KLQotCSogYW91dC10YXJnZXQuaCAoTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBEZWZpbmUgYXMgemVybyBpZgotCW5vdCBkZWZpbmVkLgotCShNWSh2ZWMpKTogSW5pdGlhbGl6ZSByZWxvY190eXBlX2xvb2t1cCBmaWVsZC4KLQotCSogYW91dHguaCAoaG93dG9fdGFibGVfKik6IEV4cG9ydCBhcyBhb3V0XyNfKl9ob3d0b190YWJsZS4KLQkoYmZkX2Vycm9yX3RyYXAsIGJmZF9lcnJvcl92ZWN0b3IpOiBFeHRlcm4sIG5vdCBjb21tb24uCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uICBIYW5kbGVzIGEKLQlmZXcgdHlwZXMgb2YgcmVsb2NzIGZvciBzcGFyYzsgd2lsbCBuZWVkIGVuaGFuY2VtZW50LgotCi0JKiBib3V0LmMgKGNhbGxqX2NhbGxiYWNrKTogVXNlIERFRlVOIG1hY3JvIGluIGRlZmluaXRpb24uCi0JKiBjb2ZmLWk5NjAuYyAob3B0Y2FsbF9jYWxsYmFjayk6IExpa2V3aXNlLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGRlZCBmaWVsZHMgcmVsb2NfdHlwZV9sb29rdXAgYW5kCi0JX2JmZF9tYWtlX2RlYnVnX3N5bWJvbC4gIEFsc28gbWlub3IgY29tbWVudCBjaGFuZ2VzLgotCSogc3ltcy5jIChiZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBOZXcgZGlzcGF0Y2hpbmcgbWFjcm8uCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfdHlwZV9sb29rdXApOiBUYWtlIGEgQkZEIHB0ciBhcyBhcmcgcmF0aGVyCi0JdGhhbiBhcmNoIGluZm8sIGFuZCBkaXNwYXRjaCB3aXRoIEJGRF9TRU5ELiAgQ2FsbGVycyBjaGFuZ2VkLgotCSogYXJjaHVyZXMuYyAoc3RydWN0IGJmZF9hcmNoX2luZm8pOiBEZWxldGVkIGZpZWxkCi0JcmVsb2NfdHlwZV9sb29rdXAuCi0JKiBjcHUtKi5jOiBEb24ndCBpbml0aWFsaXplIHRoYXQgZmllbGQuCi0KLQkqIGJmZC1pbi5oIChlbnVtIGJmZF9lcnJvcik6IEFkZCBuZXcgdmFsdWUgImJhZF92YWx1ZSIuCi0JKiBiZmQuYyAoYmZkX2Vycm1zZ3MpOiBOb3cgY29uc3Q7IGFkZGVkIGVudHJ5IGZvciBiYWRfdmFsdWUuCi0JKGJmZF9lcnJtc2cpOiBOb3cgcmV0dXJucyBwdHIgdG8gY29uc3QuCi0JKiBiZmQtaW4uaCAoYmZkX2Vycm1zZyk6IEZpeCBwcm90b3R5cGUuCi0KLQkqIGNhY2hlLmMgKEJGRF9DQUNIRV9NQVhfT1BFTik6IEZpeCB0eXBvIGluIGRvYy4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24pOiBEaXR0by4KLQotCSogc2VjdGlvbi5jIChTZWN0aW9uIE91dHB1dCBkb2MpOiBJbXByb3ZlIGRlc2NyaXB0aW9uIG9mIHVzZSBvZgotCW91dHB1dF9zZWN0aW9uIGFuZCBvdXRwdXRfb2Zmc2V0LgotCi1UdWUgTWF5IDE5IDIzOjQyOjEwIDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogc2NvLWNvcmUuYzogbmV3IGZpbGUgZnJvbSBuZXQuCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IGJ1Z2ZpeCBmcm9tIG5ldDoKLQkgIE5vdyB3ZSBoYXZlIHRoZSBoYWlyeSBsaW5rZXIsIGl0J3MgcG9zc2libGUgdG8gbW92ZSBzeW1ib2xzIGZyb20KLQkgIG9uZSBzZWN0aW9uIGludG8gYW5vdGhlci4gIEFjdHVhbGx5IG1ha2UgdGhhdCB3b3JrIQotCi1TYXQgTWF5IDE2IDE3OjU3OjU5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3VuMy5oOiBmaXggZGVjbGFyYXRpb24gb2YgZnJlZS4KLQotVHVlIE1heSAxMiAxNDowODo1OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hMjlrLmMgKHBlcmZvcm1fcmVsb2MpOiBmaXggYnVnIGluIGptcC9jYWxsIGV2YWx1YXRpb24KLQkqIGNvZmYtaDgzMDAuYyAocmVsb2NfcHJvY2Vzc2luZyk6IGFsbCByZWxvY3MgYXJlIHJlbGF0aXZlIHRvCi0Jc2VjdGlvbiBzdGFydC4KLQkqIG9wbmNscy5jOiBkb24ndCB1c2UgZmRvcGVuIG9uIERPUyBzeXN0ZW1zCi0KLQlzaG9ydCBwYXRjaGVzIGZyb20gR2xlbm4gS2FzdGVuIChnbGVubkByZWFkeS5jb20pCi0JKiB0YXJnZXQuYzogZW5hYmxlZCBvYXN5cyBzdXBwb3J0Ci0JKiBvYXN5cy5jOiAgSW5zZXJ0IC4gd2hlbiBVTkRFUlNDT1JFX0hBQ0sgaXMgZW5hYmxlZCwKLQlmaXggcHJvYmxlbSB3aGVyZSBhIHJlbG9jYXRpb24gd2hpY2ggY3Jvc3NlZCBhIG1vZGlmaWNhdGlvbiBieXRlCi0JYm91bmRhcnkgZGlkIG5vdCB3b3JrLiBGaXggcHJvYmxlbSB3aGVyZSBhIHJlbG9jYXRpb24gbmVhciB0aGUgZW5kCi0Jb2YgYSBkYXRhIHJlY29yZCBkaWQgbm90IHdvcmsuCi0KLQotVHVlIE1heSAgNSAxODoxMToyNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfY29mZl9hcm1hcCk6IG9sZCB2ZXJzaW9ucyBvZiBCRkQgd3JvdGUKLQlhcmNodmllIGhlYWRlciBzdHJpbmcgY291bnRzIHRoZSBlbmRpYW4gd2F5LCB0aGlzIGhldXJpc3RpYyBzZWVzCi0JaG93IGJpZyBhbiBhcmNoaXZlIHN0cmluZyB0byByZWFkIGJ5IHRyeWluZyBpdCBvbmUgd2F5IGFuZCBpZiB0aGUKLQlzdHJpbmcgdGFibGUgaXMgdW5yZWFzb25hYmx5IGJpZywgdHJ5aW5nIGl0IHRoZSBvdGhlci4gKkZJWE1FKi4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IGNhbid0IGRvIGZkb3BlbnMgb24gVk1TCi0KLVR1ZSBNYXkgIDUgMTQ6MTg6MjQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogIEluY3JlYXNlIHZlcnNpb24gbnVtYmVyIHRvIDEuOTcsIGZvciBjb25zaXN0ZW5jeQotCXdpdGggLi4vYmludXRpbHMuCi0JKiBNYWtlZmlsZS5pbjogIGRvY2RpciBpcyAuL2RvYywgbm90ICR7c3JjZGlyfS9kb2MuCi0KLU1vbiBNYXkgIDQgMTE6NDk6MTUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBiZmQtaW4uaDogYnVtcCB2ZXJzaW9uIHRvIDEuOTYKLSAgICAgICAgIE1ham9yIGNoYW5nZTsgY2hhbmdlZCBjYWxsaW5nIGNvbnZlbnRpb24gZm9yCi0JIGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgc28gdGhhdCBjYWxsZXIgYWxsb2NhdGVzCi0JIG1lbW9yeSBmb3Igc2VjdGlvbiBkYXRhLgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSwgcmVsb2MuYywKLQlzZWNsZXQuYywgdGFyZ2V0cy5jLCBiZmQuYzogcmVmbGVjdCBuZXcgY29udmVudGlvbi4KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogaWYgc3R5cF9mbGFncyBpcyBub3QgYSBzcGVjaWFsCi0JY2FzZSwgdGhlbiB1c2UgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcyBmb3IgU0VDXyogZmxhZ3MuCi0KLUZyaSBNYXkgIDEgMTI6NTg6MzQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogdXNlIFJFTFNaIHRvIHdvcmsgb3V0Ci0Jc2l6ZSBvZiBvdXRwdXQgcmVsb2Mgc3RydWN0LgotCSogdGFyZ2V0cy5jLCBNYWtlZmlsZS5pbjogY29tbWVudCBvdXQgdGVraGV4IGZvciB0aGUgbW9tZW50LgotCSogaWVlZS5jOiBpZiBzb21lIHBsYWNlcyB3aGVyZSBudWxsIHBvaW50ZXJzIHdlcmUgdXNlZCBpbnN0ZWFkIG9mICZiZmRfYWJzX3NlY3Rpb24uCi0JKiBjb25maWd1cmUuaW46IHRhbmRlbSB0YXJnZXQgaXMgc3QyMDAwCi0JKiBjb2ZmLW02OGsuYzogcmVuYW1lIHN0YXRpYyBob3d0b190YWJsZSB0byBnbG9iYWwKLQltNjhrY29mZl9ob3d0b190YWJsZS4KLQkqIGJvdXQuYzogcmVtb3ZlIHVubmVjZXNzYXJ5IGFib3J0Ci0JKiBjb2ZmLWEyOWsuYzogdmFyaW91cyBjaGFuZ2VzIHRvIHRoZSB3YXkgcmVsb2NhdGlvbnMgd29yayB0byBjb3BlCi0Jd2l0aCB0aGUgIm5ldyBvcmRlciIgYW5kIGxhdGVudCBidWdzLgotCSogY29mZmNvZGUuaDogbGludAotCi1XZWQgQXByIDI5IDEyOjM3OjA3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X3N3YXBfZXh0X3JlbG9jX291dCwgYW91dF9zd2FwX3N0ZF9yZWxvY19vdXQpCi0JYm91dC5jIChiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IHRyZWF0IGFicyBzdW1ib2xzIHRoZSByaWdodCB3YXkuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybS1yZWxvY2F0aW9uKTogZG9uJ3QgcmVsb2NhdGUgcmVmcyB0bwotCWFic29sdXRlIHN5bWJvbHMgaWYgZG9pbmcgYSBwYXJ0aWFsIGxpbmsuCi0KLUZyaSBBcHIgMjQgMDc6MzU6MjYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWRkIGEyOWstYW1kLXVkaS4KLQotVGh1IEFwciAyMyAxODozNzo1NSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF88Yml0cz5fc3dhcF9leGVjX2hlYWRlcl9pbik6ICBaZXJvIG91dCB0aGUKLQlpbnRlcm5hbF9leGVjIHN0cnVjdHVyZSBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZSBmaWVsZHMgdGhhdAotCWFyZSB1c2VkLCBzbyB0aGF0IHRoZSB1bnVzZWQgZmllbGRzIGFyZSBpbiBhIGtub3duIHN0YXRlLgotCi1XZWQgQXByIDIyIDA5OjM2OjA4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiB0ZWtoZXguYyAoc3RydWN0IGRhdGFfc3RydWN0KTogIENvbnZlcnQgZnJvbSB0eXBlZGVmIHRoYXQKLQl0eXBlZGVmcyBub3RoaW5nIHRvIGEgbm9ybWFsIHN0cnVjdHVyZSBkZWNsYXJhdGlvbi4KLQkqIHRla2hleC5jIChwYXNzX292ZXIpOiAgUHJvdG90eXBlIGFyZ3MgZm9yIGZ1bmN0aW9uIHRoYXQKLQlzZWNvbmQgYXJnIHBvaW50cyB0by4KLQotTW9uIEFwciAyMCAyMjoyMjo1MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgb2xkIHN0eWxlIHN0YWdpbmcuICBEbyBub3QgcHJpbnQgcmVjdXJzaW9uCi0JICBsaW5lcy4KLQotCSogTWFrZWZpbGUuaW46IHJld29yayBDRkxBR1Mgc28gdGhhdCBDRkxBR1MgY2FuIGJlIHBhc3NlZCBmcm9tIHRoZQotCSAgTWFrZWZpbGUgY29tbWFuZCBsaW5lLiAgUmVtb3ZlIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KLQkgIFBhc3MgQ0ZMQUdTLgotCi1GcmkgQXByIDE3IDA5OjE1OjMxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuYywgTWFrZWZpbGUuaW46IGFkZGVkIHRla2hleAotCSogYW91dHguaCAoc2V0X3NlY3Rpb25fY29udGVudHMpOiBwYWdlcyBzaG91bGQgYmUgcGFkZGVkIHRvIHRoZQotCXNpemUgb2YgYSBwYWdlLCBub3QgdGhlIHNpemUgb2YgYSBzZWdtZW50LgotCSogY29uZmlndXJlLmluOiBhZGRlZCBnbzMyIGhvc3QgYW5kIGkzODYtYW91dCB0YXJnZXQuCi0JKiBpMzg2YW91dC5jLCBsaWJhb3V0Lmg6IG5vdyB3b3JrcyBmb3IgZ28zMiB0YXJnZXQKLQkqIGllZWUuYzogZml4IGJpdCByb3QuCi0JKiBzZWNsZXQuYzogc3VwcG9ydCBmb3IgcGFkZGluZyBzZWNsZXQgdHlwZS4KLQotV2VkIEFwciAxNSAxODoxMTo1OCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAuTk9FWFBPUlQ6Ci0KLVR1ZSBBcHIgMTQgMTQ6MzQ6NDIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChiZmRfYWRkX3N0cnRhYiwgYmZkX2FkZF8yX3RvX3N0cnRhYik6ICBDT05TVCBzcHJlYWRzCi0JbGlrZSBvb3plLgotCSogZWxmLmMgKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0JZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBSZXR1cm4gYm9vbGVhbiwgbm90IE5VTEwgKHdoaWNoCi0JY2FuIGJlIHZvaWQgKikuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIElmZGVmLW91dCBkZWJ1Z2dpbmcgY29kZS4KLQlBbHNvIGlmZGVmLW91dCBjb2RlIHRoYXQgYWJvcnRzIG9uIHVuaGFuZGxlZCBzZWN0aW9uIHR5cGVzLgotCi1GcmkgQXByIDEwIDIyOjI5OjE4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgbmNyMzAwMCBjb25maWcKLQkqIE1ha2VmaWxlLmluIChNSU5VU19HKTogIFBhc3Mgb24gdG8gcmVjdXJzaXZlIG1ha2VzLgotCSogaG9zdHMvbmNyMzAwMC5oLCBjb25maWcvbmNyMzAwMC5taDogIEFkZCBob3N0IGNvbmZpZyBmaWxlcy4KLQotVGh1IEFwciAgMiAxNzo0Mjo0NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBOb3cgdGhhdCB3ZSBoYXZlIHN5bS5oIGFuZCBzeW1jb25zdC5oLCBjb21waWxlCi0JY29mZi1tc3ltLmMgb24gYWxsIHN5c3RlbXMuCi0JKiBjb25maWcve2RlY3N0YXRpb24ubWgsIGlyaXgzLm1oLCBpcml4NC5taH06ICBSZW1vdmUgY29mZi1tc3ltLm8gZGVwLgotCSogY29mZi1tc3ltLmM6ICBVcGRhdGUgaW5jbHVkZSBmaWxlcyBhbmQgY29tbWVudHM7IGFkZCB3ZWFrZXh0IGJpdC4KLQotV2VkIEFwciAgMSAyMzoxNjozOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jLCBiZmQuYywgYm91dC5jLCBjb2ZmY29kZS5oLCBpbml0LmMsIHJlbG9jLmMsCi0Jc2VjdGlvbi5jLCBzcmVjLmMsIHN5bXMuYywgY29mZi1oODMwMC5jOiAgTGludC4KLQotU3VuIE1hciAyOSAwOTozNzo1OSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYm91dC5jLCBjb2ZmLWEyOWsuYywgY29mZi1pOTYwLmM6ICBMaW50LgotCSogY29uZmlndXJlLmluOiAgQWRkIG5ldyBob3N0IGFuZCB0YXJnZXQgY29uZmlncy4KLQkqIGVsZi5jIChiZmRfcHJzdGF0dXMsIGJmZF9mcHJlZ3NldCk6ICBBdm9pZCB0eXBlbmFtZSBvZiByZWdpc3RlcgotCXN0cnVjdHMsIHdoaWNoIHZhcnk7IGp1c3QgdXNlIG1lbWJlciBuYW1lLgotCShlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6ICBMaW50LCBmaXggY29tbWVudHMuCi0JKiBjb25maWcvc3BhcmMtZWxmLm10LCBob3N0cy9zeXN2NC5oOiAgTmV3IGNvbmZpZyBmaWxlcy4KLQotU2F0IE1hciAyOCAxMzowNzowMiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogIEZpeCB0byB1c2Ugb25seSBhIHNpbmdsZQotCWxvY2FsLCBkaXNwb3NhYmxlLCBjb3B5IG9mIHRoZSBleHRlcm5hbCBmb3JtIG9mIHNlY3Rpb24gaGVhZGVyCi0JdGFibGUgYW5kIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJpZXMuCi0KLVRodSBNYXIgMjYgMTY6NTk6NTggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgU2V0IE1JTklNSVpFIGJhY2sgdG8gMCBmb3IgYSByZWFsIHJlbGVhc2UuCi0KLVR1ZSBNYXIgMjQgMTU6NTc6MDMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogY29uZmlnL2lyaXg0Lm1baHRdLCBob3N0cy9pcml4NC5oOiBhZGQgc3VwcG9ydCBmb3IKLQkgIGlyaXg0LgotCi1Nb24gTWFyIDIzIDIyOjM3OjM0IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbXN5bS5jIChlY29mZl9zd2FwX3JmZF9pbik6ICByZW1vdmUgJiBmb3IgYXJyYXkgcmVmLgotCi1UdWUgTWFyIDE3IDE0OjEyOjI1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9zbHVycF9yZWxvY190YWJsZSk6ICBVc2UgQkZEX0FTU0VSVCBtYWNybywKLQlub3QgaW50ZXJuYWwgYmZkX2Fzc2VydCBmdW5jdGlvbiAodHdpY2UpLgotCi1UdWUgTWFyIDE3IDEwOjQ1OjEyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oOiBjaGFuZ2UgYXJfbWF4X25hbWVsZW4gdG8gMTUgKHRoZSByaWdodCB2YWx1ZSkKLQkqIGNvZmYtYTI5aywgY29mZmNvZGUuaDogbW9yZSBoYW5nb3ZlcnMgZnJvbSB0aGUgYmZkX2Fic19zZWN0aW9uCi0JY2hhbmdlCi0KLU1vbiBNYXIgMTYgMTQ6NTc6MjIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogY2hlY2sgZm9yIGJvdXQgYXJjaGl2ZXMgdG9vLgotCSogYm91dC5jOiBtYWtlIGl0IHdvcmsgYWdhaW4uCi0KLVNhdCBNYXIgMTQgMTc6MzA6NDAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfY29yZWZpbGVfbm90ZSk6ICBDYWxsIGJmZF94bWFsbG9jKCkgaW5zdGVhZCBvZiBiYXJlCi0JbWFsbG9jKCkuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiAgQ2FsbAotCWJmZF94bWFsbG9jKCkgaW5zdGVhZCBvZiBiYXJlIG1hbGxvYygpLgotCi1GcmkgTWFyIDEzIDE1OjQ0OjM3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcGFzcyBkb3duIE1BS0VJTkZPIG9uIGluZm8uCi0KLUZyaSBNYXIgMTMgMDc6NDE6MTMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC08Zm9vPiBub3cgPGZvbz4ubXQsIGNvbmZpZy9taC08Zm9vPiBub3cgPGZvbz4ubWguCi0JaG9zdC9oLTxmb28+IG5vdyBqdXN0IDxmb28+LgotCSogY29uZmlndXJlLmluOiByZWZsZWN0IGNoYW5nZXMKLQotVGh1IE1hciAxMiAxMToxNTowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKHNldF90ZGF0YSk6ICBNYWtlIGNoYW5nZSBvZiBGZWIgMjcgaW4gdGhlCi0JYWN0dWFsIHNvdXJjZSBmaWxlLCBub3QganVzdCB0aGUgZ2VuZXJhdGVkIGxpYmJmZC5oLgotCi1TYXQgTWFyICA3IDEwOjMzOjQxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYyAoaWNvZmZfbGl0dGxlX3ZlYyk6IGFkZCBDT0ZGX1NXQVBfVEFCTEUgc28gd2UgY2FuIHJ1bgotCWdkYiBvbiBsaXR0bGUtZW5kaWFuIDk2MCBjb2RlLgotCSogYXJjaGl2ZS5jIChjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IGluZGlyZWN0IHN5bWJvbHMgc2hvdWxkIGdvCi0JaW50byB0aGUgYXJjaGl2ZSBoZWFkZXIgdG9vLgotCi1GcmkgTWFyICA2IDIxOjU1OjE2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgotCi1UaHUgTWFyICA1IDIzOjUxOjQyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1zeW0uYzogIE1vdmUgdGhpcyBmaWxlIGZyb20gZ2RiL2Vjb2ZmLmMuICBJdAotCWhhbmRsZXMgYnl0ZS1zd2FwcGluZyBmb3IgRUNPRkYgKE1JUFMgc3ltYm9sKSBmaWxlcy4KLQkqIGNvbmZpZy9taC1kZWNzdGF0aW9uLCBjb25maWcvbWgtaXJpeDM6ICBBZGQgY29mZi1tc3ltLm8KLQl0byB0aGUgZmlsZXMgYnVpbHQgb24gTUlQUy1iYXNlZCBob3N0cy4KLQkqIE1ha2VmaWxlLmluOiAgQWRkIHJ1bGUgZm9yIGNvZmYtbXN5bS4KLQotVGh1IE1hciAgNSAyMTozNjowNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNsZWFuLWluZm8gdGFyZ2V0LiAgTUlOSU1JWkU9MS4KLQotU3VuIE1hciAgMSAyMjozMjo1OCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29mZi1yczYwMDAuYzogIE1vdmUgY29yZSBmaWxlIGZ1bmN0aW9ucyBpbnRvIHNlcGFyYXRlCi0JbmV3IGZpbGUgcnM2MDAwLWNvcmUuYy4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgcmVhZGluZwotCWNvcmUgZmlsZXMgZGVwZW5kcyBvbiBuYXRpdmUgaW5jbHVkZSBmaWxlcyB0aGF0IGNvbmZsaWN0Ci0Jd2l0aCAuLi9pbmNsdWRlL2NvZmYvcnM2MDAwLmguCi0JKiBjb25maWcvbWgtcnM2MDAwOiAgQWRkIHJzNjAwMC1jb3JlLm8gdG8gSERFUEZJTEVTLgotCi1UaHUgRmViIDI3IDIyOjE5OjU1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQscHJpbnRfc3ltYm9sKSk6IERvbid0IHByaW50Ci0Jc3ltYm9sIGFkZHJlc3NzIGZvciB1bmRlZmluZWQgc3ltYm9scy4KLQkqIGNvZmYtcnM2MDAwLmM6ICBWYXJpb3VzIHVwZGF0ZXMgKGR1ZSB0byB0YXJnZXQtCi0JaW5kZXBlbmRlbnQgY2hhbmdlcykuCi0JKiBsaWJiZmQuaDogIERpdHRvICh0ZGF0YSBmaWVsZCBpcyBub3cgYSB1bmlvbikuCi0JKiBob3N0cy9oLXNwYXJjLmg6ICBSZW1vdmVkIHByb3RvdHlwZSBmb3IgYm9ndXMgZnVuY3Rpb24KLQknZW1zZXQnIChwcmVzdW1hYmx5IHNob3VsZCBoYXZlIGJlZW4gJ21lbXNldCcgLSB3aGljaCBpcyB0aGVyZSkuCi0KLVRodSBGZWIgMjcgMTE6NDY6MzMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1iaWctKiB0YXJnZXQpOiAgU2FtZSBpcyBJcmlzLgotCi1UaHUgRmViIDI3IDA5OjI0OjU2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogd2hlbiBjcmVhdGluZyBhbgotCWFsaWFzIHN5bWJvbCwgZmlsbCBpbiB0aGUgc2VjdGlvbiBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuCi0JbGVhdmluZyBpdCBibGFuay4gSWYgYW4gb3V0cHV0IHNlY3Rpb24gY2FuJ3QgYmUgZm91bmQgZm9yIGEKLQlzeW1ib2wsIHRoZW4gZG9uJ3QgY29yZSBkdW1wLgotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotV2VkIEZlYiAyNiAxOTo0MDo1OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6IGxpbnQKLQkqIGNvZmYtaDgzMDAuYzogZml4IHN0dXBpZCByZWxvYyBzdWJ0cmFjdGlvbiBidWcKLQkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfb3V0KTogb25seSBzd2FwIGEgdHZuZHggYnkgMiBieXRlcywKLQlzaW5jZSB0aGF0J3MgaG93IHdpZGUgaXQgaXMuIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IGFsd2F5cyB6ZXJvIG91dAotCXRoZSBzeW1ib2wuZmxhZ3MgYW5kIGRvbmVfbGluZW5vIGZpZWxkcy4KLQotVHVlIEZlYiAyNSAxNDoyOToyNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9zeW1ib2wpOiB3cml0ZSBvdXQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mCi0JYXV4ZW50cy4KLQkqIGNwdS1oODMwMC5jOiBmaXggZGlzYXNzZW1ibHkgYnVnCi0KLUZyaSBGZWIgMjEgMjE6Mzk6NTYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIChiZmRfZXJybXNnKSwgY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbiwKLQlzZWN0aW9uX2Zyb21fYmZkX2luZGV4KSwgY3B1LWg4MzAwLmMgKGhvd3RvKl9jYWxsYmFjayksCi0JcmVsb2MuYywgc2VjdGlvbi5jIChiZmRfbWFwX292ZXJfc2VjdGlvbnMpLCB0YXJnZXRzLmMKLQkoYmZkX3RhcmdldF9saXN0KTogIFByb3RvbGludC4KLQkqIGxpYmJmZC5oOiAgVXBkYXRlIHRvIG1hdGNoIGEgbGliYmZkLWluLmggZnJvbSBhIG1vbnRoIGFnby4KLQotRnJpIEZlYiAyMSAxMDo1Nzo1NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbik6IGxpbnQsIChjb2ZmX3ByaW50X3N5bWJvbCk6IHByaW50cwotCW91dCB0YWduZHggdG9vLgotCSogYW91dHguaCAoc3dhcF9zdGRfcmVsb2Nfb3V0LCBzd2FwX2V4dF9yZWxvY19vdXQpOiB1c2UgdGhlIG91dHB1dAotCXNlY3Rpb24gb2YgYSBzeW1ib2wgcmF0aGVyIHRoYW4gdGhlIHNlY3Rpb24gb2YgYSByZWZmZWQgc3ltYm9sIHRvCi0JZGV0ZXJtaW5lIHRoZSByX2luZGV4IG9mIGFuIGVtbWl0dGVkIHJlbG9jLgotCi1UaHUgRmViIDIwIDE4OjEwOjM0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBQT1JUSU5HOiBOZXcgKHByZWxpbWluYXJ5KSBwb3J0aW5nIGd1aWRlLgotCi1XZWQgRmViIDE5IDIxOjM5OjM3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGNhbGxqX2NhbGxiYWNrKSwgY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpLCBjb2ZmLW04OGsuYwotCShob3d0b19odnJ0MTYpOiAgbGludC4KLQotTW9uIEZlYiAxNyAxMjowMjoxNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogaHAzMDBic2QuYyAobmV3KSwgY29uZmlnL210LWhwMzAwYnNkOiAgTWFrZSBocDMwMGJzZAotCWEgZnVsbCBjb25maWd1cmF0aW9uICh3aXRoIHBvc3NpYmxlIGNyb3NzLWRldmVsb3BtZW50KSwKLQlpbnN0ZWFkIG9mIHVzaW5nIGhvc3QtYW91dC5jLgotCi1TdW4gRmViIDE2IDEzOjAxOjQ5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpOgotCVNldCBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkuCi0JKiBnZW4tYW91dC5jOiAgQ2hhbmdlIHRvIGVtaXQgYSAuYyBmaWxlcywgbm90IGEgLmggZmlsZS4KLQotVGh1IEZlYiAxMyAyMDoxMTo0NyAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgUmVtb3ZlIG9ic29sZXRlIHVzZSBvZgotCUJTRl9BQlNPTFVURSBhbmQgcmVwbGFjZSB3aXRoIGJmZF9hYnNfc2VjdGlvbiByZWZlcmVuY2UuCi0KLVRodSBGZWIgMTMgMTc6MjI6NDQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGdldF9ub3JtYWxpemVkX3N5bXRhYik6IGZpeGVkIGJ1ZyB3aGVyZSBzeW1ib2xzCi0Jd2l0aCBtb3JlIHRoYW4gb25lIGF1eGVudCBjYW4gY2F1c2UgbmFzdHkgY29yZSBkdW1wcy4KLQotCSogY29mZmNvZGUuaCwgbGliY29mZi5jOiBhZGRlZCBuZXcgZmllbGRlZCB0byBjb2ZmX3N5bWJvbF9zdHJ1Y3QKLQkiZG9uZV9saW5lbm8iIHNvIHRoYXQgYSBzeW1ib2wgd2hpY2ggYXBwZWFycyB0d2ljZSBpbiB0aGUgc3ltYm9sCi0JdGFibGUgb25seSBnZXRzIGl0J3MgbGluZW51bWJlcnMgcmVsb2NhdGVkIG9uY2UuIE1vZGlmZWQKLQkoY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sKSBhbmQgKGNvZmZfbWFrZV9lbXB0eV9zeW1ib2wpIHRvIG1ha2UKLQl1c2Ugb2YgaXQuCi0KLVR1ZSBGZWIgIDQgMTU6Mzk6NTUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4Lmg6ICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogZml4IGNvbnN0cnVjdG9yCi0Jc3R1ZmYgdG8gdXNlIHRoZSBOZXcgT3JkZXIuCi0KLUZyaSBKYW4gMzEgMDE6MzQ6NDUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jOiAgQ2hhbmdlIHR5cGUgb2YgZW52aVtdIHRvIHVuc2lnbmVkIGNoYXIuCi0KLQkqIGNvbmZpZ3VyZS5pbjogIGZpeCB2YXggdWx0cml4IGNvbmZpZ3VyYXRpb24uCi0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgRGVhbCB3aXRoIG51bGwgcmV0dXJuIGZyb20KLQliZmRfbWFrZV9zZWN0aW9uKCkuICAoZWxmX29iamVjdF9wKTogIFNlbGVjdCBlbmRpYW5lc3MgcHJvcGVybHkuCi0KLUZyaSBKYW4gMzEgMDE6MTk6NTUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtdGFob2UuaCwgaC12YXhic2QuaDogIEZpeCBzdGFjayBpbiBjb3JlIGZpbGVzLgotCi1UaHUgSmFuIDMwIDIzOjUxOjA3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIGhvc3QtYW91dC5jIGRvZXNuJ3QgZGVwZW5kIG9uIGFvdXQtcGFyYW1zLmguCi0JKiBhb3V0LXRhcmdldC5oOiAgVXNlIFRBUkdFVF9CSUdfRU5ESUFOX1AgdG8gc2V0IHVwIHZlY3Rvci4KLQkqIGhvc3QtYW91dC5jOiAgRG9uJ3QgdXNlIGFvdXQtcGFyYW1zLmg7IGNvbmZpZ3VyZSB0aGVzZSBzeXN0ZW1zCi0JaW4gdGhlaXIgeG0gZmlsZXMsIG5vdCBpbiBhIHJhbmRvbWx5IGdlbmVyYXRlZCBmaWxlLgotCSogaG9zdHMvaC1ocDMwMGJzZC5oLCBoLXRhaG9lLmgsIGgtdmF4YnNkLmgsIGgtdmF4dWx0Lmg6Ci0JU3BlY2lmeSBieXRlIG9yZGVyLgotCSogaG9zdHMvaC12YXhic2QuaDogIERlZmluZSB0aGUgZm9ybSBvZiBleGVjIGFuZCBjb3JlIGZpbGVzLgotCi1UaHUgSmFuIDMwIDEzOjAyOjQxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbXQtdGFob2UsIGNvbmZpZy9tdC12YXg6ICBDaGFuZ2UgREVGQVVMVF9WRUNUT1IgdG8KLQlob3N0X2FvdXRfdmVjIGhlcmUgYXMgd2VsbC4KLQotVGh1IEphbiAzMCAxMTo0MTo0NSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0LWFvdXQuYzogIENoYW5nZSBUQVJHRVROQU1FIHRvICJhLm91dCIgdG8gYmUgY29tcGF0aWJsZSB3aXRoCi0JZ2RiLiAgY29uZmlnL210LWhwMzAwYnNkOiAgQ2hhbmdlIERFRkFVTFRfVkVDVE9SIHRvIGhvc3RfYW91dF92ZWMKLQl0byBwcmV2ZW50IHVuZGVmaW5lZCBzeW1ib2wuCi0KLVRodSBKYW4gMzAgMDc6MjY6NTMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQlWYXJpb3VzIGxpbnRzIGZvdW5kIG9uIFBlcnNTb255Ci0JKiBhb3V0eC5oOiBjYXN0IGFuIGVudW0KLQkqIGNvZmYtYTI5ay5jOiBtYW55IGludHMgaW4gcmVsb2Mgc3RydWN0dXJlIHR1cm5lZCB0byBlbnVtCi0JKiBjb2ZmY29kZS5oOiBtb3JlIGVudW1zCi0JKiBjcHUtaDgzMDAuYzogbW9yZSBlbnVtcwotCSogb3BuY2xzLmM6IG1vcmUgZW51bXMKLQotVGh1IEphbiAzMCAwMToxOTo1NiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgTWFrZSBUYWhvZSBjb25maWd1cmF0aW9uIHdvcmsgYWdhaW4uCi0JKiBiZmQtaW4uaDogIFJlbW92ZSB0cmFpbGluZyBjb21tYSBmcm9tIGVudW0gZGVjbGFyYXRpb24uCi0JKiBpZWVlLmM6ICBDYW4ndCBwdXQgYnl0ZSB2YWx1ZXMgPjB4N0YgaW50byBhIHNpZ25lZCBjaGFyLgotCi1UdWUgSmFuIDI4IDIxOjEwOjUxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBkZXBlbmRlbmNpZXMgZm9yIHZhcmlvdXMgY29mZi0qLm8gZmlsZXMuCi0KLQkqIGVsZi5jOiAgUmVtb3ZlIGV4dHJhbmVvdXMgcGFyZW4gZnJvbSBjb3JlX3BycHNpbmZvIGFuZAotCWNvcmVfcHJwc3RhdHVzIG1hY3JvcywgcmVuYW1lIGNvcmVfcHJwc3RhdHVzIHRvIGNvcmVfcHJzdGF0dXMuCi0JUmVwbGFjZSByZWZlcmVuY2VzIHRvIG9sZCBzZWN0aW9uICJzaXplIiBtZW1iZXIgd2l0aCBuZXcKLQkiX3Jhd19zaXplIiBtZW1iZXIuICBJbXBsZW1lbnQgZWxmX21ha2VfZW1wdHlfc3ltYm9sLCB3aGljaAotCWlzIG5vdyB1c2VkLgotCi1UdWUgSmFuIDI4IDE0OjUxOjQwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jLCBiZmQuYywgLi4vaW5jbHVkZS9iZmQuaDogIFZhcmlvdXMgZml4ZXMgZm9yIFBNQVgKLQljb3JlIHJlYWRpbmcuCi0KLVR1ZSBKYW4gMjggMTA6NDY6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX3JlbGF4X3NlY3Rpb24pOiBub3cgc3RhdGljLgotCShiZmRfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiB2YXJpb3VzIHR5cGUgbGludHMuCi0KLU1vbiBKYW4gMjcgMTk6NDQ6MDggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQlOZXcgZW50cnkgcG9pbnQgaW4gdGhlIHRyYW5zZmVyIHZlY3RvciAtIGJmZF9yZWxheF9zZWN0aW9uLgotCi0JKiBhb3V0LXRhcmdldC5oOiBhZGQgdG8gdmVjdG9yLCBjYWxsIGdlbmVyaWNfcmVsYXgKLQkqIGJmZC1pbi5oOiBhZGQgdG8gdmVjdG9yCi0JKiBiZmQuYzogYWRkICNkZWZpbmUgZm9yIHZlY3RvcgotCSogYm91dC5jOiBhZGQgdG8gdmVjdG9yLCBjYWxsIGdlbmVyaWNfcmVsYXgKLQkqIGNvZmZjb2RlLmg6IGFkZCB0byB2ZWN0b3IsIGFsc28gbm93IGhhcyBjb2ZmIHNwZWNpZmljIHJlbGF4IGNvZGUKLQlmb3IgdGhlIHJlbGF4YWJsZSBIOC8zMDAgcmVsb2NzLiBBbHNvIGNsZWFuIHVwIGFicyBzZWN0aW9uIGNydWZ0LgotCSogZWxmLmM6IGNhbGwgZ2VuZXJpY19yZWxheAotCSogaWVlZS5jOiBjYWxsIG5ldyB2ZWN0b3IsIGNsZWFuIHVwIHNvbWUgYnVncyBkdWUgdG8gdGhlIGNyZWF0aW9uCi0Jb2YgYmZkX2Fic19zZWN0aW9uCi0JKiBsaWJiZmQuaDogYWRkIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24gRVhGVU4KLQkqIG9hc3lzLmM6IGNhbGwgZ2VuZXJpY19yZWxheAotCSogcmVsb2MuYzogaW1wbGVtZW50IGdlbmVyaWNfcmVsYXgKLQkqIHNlY2xldC5jOiBtb3ZlZCBtdWNoIG9mIHRoaXMgaW50byBjb2ZmY29kZS5oCi0JKiBzcmVjLmM6IGNhbGwgZ2VuZXJpY19yZWxheAotCSogdGFyZ2V0cy5jOiBkZWZpbmUgbmV3IHRyYW5zZmVyIHZlY3RvcgotCi1GcmkgSmFuIDI0IDE0OjQwOjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBldmVyeXRoaW5nOiBub3cgbW9kaWZpZWQgdG8gdXNlIHNtYWxsZXIgcmVsb2MgdHlwZS4gU2VsZiBob3N0cwotCW9uIHN1bjMgJiBzdW40LgotCi1TYXQgSmFuIDE4IDE3OjAwOjE2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3RyYXR1cywgY29uZmlnL210LWk4NjAtZWxmLCBob3N0cy9oLXN0cmF0dXM6Ci0JTmV3IGZpbGVzIGZvciBzdHJhdHVzLgotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgY29uZmlndXJhdGlvbiBmcmFnbWVudHMgZm9yIHN0cmF0dXMuCi0KLVdlZCBKYW4gMTUgMTA6MDI6NDMgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBEZWNsYXJlIHZhcmlvdXMgZmlsZW5hbWUKLQl2YXJpYWJsZXMgYXMgQ09OU1Qgc2luY2UgdGhleSBhcmUgc2V0IHRvIHBvaW50IHRvIGEgY29uc3QgY2hhcgotCXN0cmluZy4gIEZpeGVzIGNvbXBpbGVyIGNvbXBsYWludHMuCi0KLUZyaSBKYW4gMTAgMTc6NDQ6NTMgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtYW1peC5oIGhvc3RzL2gtaTM4NnY0Lmg6ICBDaGFuZ2UgYWJvcnQoKSB0byBhIGZ1bmN0aW9uCi0JcmV0dXJuaW5nIHZvaWQuCi0KLUZyaSBKYW4gMTAgMTQ6MzM6MzIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiAgUmVjb2duaXplIE5fU09MCi0Jc3ltYm9scywgc28gdGhhdCB3ZSBjYW4gZW1pdCB0aGUgY29ycmVjdCBmaWxlIG5hbWUgZXZlbgotCWlmIGl0J3MgYW4gaW5jbHVkZSBmaWxlLgotCi1UaHUgSmFuICAyIDE2OjQzOjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYzogIEFkZCBDT0ZGX1NXQVBfVEFCTEUgdG8gbGl0dGxlX3ZlYyBhcyB3ZWxsIGFzIGJpZ192ZWMuCi0JKFJlcG9ydGVkIGJ5IGpvaG5AbGFidGFtLmxhYnRhbS5vei5hdSAoSm9obiBDYXJleSkpLgotCi1XZWQgSmFuICAxIDA0OjIzOjA2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogIENoYW5nZSBhbGwgJyNpZiBIQVZFX1BST0NGUycgdG8gJyNpZmRlZiBIQVZFX1BST0NGUycuCi0KLQkqIGNvbmZpZy9taC1hbWl4LCBjb25maWcvbWgtaTM4NnY0OiAgUmVtb3ZlIEhERUZJTkVTIHRoYXQgd2FzCi0JYmVpbmcgdXNlZCB0byAtREhBVkVfUFJPQ0ZTLgotCi0JKiBob3N0cy9oLWFtaXgsIGhvc3RzL2gtaTM4NnY0OiAgQWRkICcjZGVmaW5lIEhBVkVfUFJPQ0ZTJy4gIE1vdmUKLQknI2luY2x1ZGUgImZvcGVuLXNhbWUuaCInIHRvIGVuZCBvZiBmaWxlIHRvIG1hdGNoIG90aGVyIGgtKiBmaWxlcy4KLQotRnJpIERlYyAyMCAxMjowNjoxNyAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQ2hhbmdlIHN2cjQgcmVmZXJlbmNlcyB0byBzeXN2NC4gIEFkZCBjYXNlCi0JInVua25vd24iIGZvciB0YXJnZXQgdmVuZG9yIGFuZCBpbmZlciBzb21lIHRhcmdldHMgYmFzZWQKLQlvbiB0aGUgc3BlY2lmaWVkIG9wZXJhdGluZyBzeXN0ZW0uCi0KLVdlZCBEZWMgMTggMTc6MTc6NTkgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmgsIGxpYmFvdXQuaDogIEFOU0lmeSBlbnVtcy4KLQotV2VkIERlYyAxOCAxNjoxMjoyNSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChub3JtYWxpemUpOiBjcmVhdGVkIHZlcnNpb24gZm9yIFZNUyB3aGljaCByZW1vdmVzIHRoZQotCVZNUyBkaXJlY3RvcnkgY3JhcCBmcm9tIHRoZSBmcm9udCBhbmQgZW5kIG9mIGEgZmlsZW5hbWUsIGVnIHR1cm4KLQlbLS5mb29dYmFyLm9iajsxMjMgaW50byBiYXIub2JqCi0JKGJmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IG5vdyB3cml0ZXMgaW5kZXggaW50byBhbgotCWV4dGVuZGVkIG5hbWUgdGFibGUgaW4gZGVjaW1hbCAtIHRoZSBzYW1lIGJhc2UgdXNlZCB0byByZWFkIGFuCi0JZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLQotV2VkIERlYyAxOCAxNDo0MDozOSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC1lbmNhcC5jOiAgRml4IHRvIHVzZSBhb3V0LXRhcmdldC5oLgotCSogYW91dGYxLmg6ICBVc2Ugc3RhbmRhcmQgTVlfb2JqZWN0X3AgYW5kIE1ZX2NhbGxiYWNrCi0JaW4gYW91dC10YXJnZXQuaC4gIFJlbW92ZSB0YXJnZXQtc3BlY2lmaWMgdmVyc2lvbnMuCi0JKiBob3N0LWFvdXQuYzogIFJlLXdyaXRlIHRvIHVzZSBhb3V0LXRhcmdldC5oLgotCSogZ2VuLWFvdXQuYzogIE5ldyBmaWxlcyB1c2Ugd2l0aCBob3N0LWFvdXQuYyB0byBnZW5lcmF0ZQotCWhvc3Qtc3BlY2lmaWMgYS5vdXQtcmVsYXRlZCBwYXJhbWV0ZXJzLgotCSogTWFrZWZpbGUuaW46ICBob3N0LWFvdXQubyBkZXBlbmRzIG9uIGFvdXQtcGFyYW1zLmgsIHdoaWNoIGlzCi0JZ2VuZXJhdGVkIGJ5IGdlbi1hb3V0LgotCSogYW91dC10YXJnZXQuaDogIE1ha2UgYSBsaXR0bGUgbW9yZSBmbGV4aWJsZS4KLQkqIGxpYmFvdXQuaCwgYW91dC10YXJnZXQuaDogIFJlbW92ZWQgV09SS19PVVRfRklMRV9QT1NUSU9OUwotCW1hY3JvLiAgSW5zdGVhZCwgaW5saW5lIGl0IGluIGFvdXQtdGFyZ2V0LmguCi0JKiBuZXdzb3MzLmM6ICBEZWZpbmUgTl9TSEFSRURfTElCKHgpIGFzIDAgdG8gYXZvaWQKLQlhIGdjYyAtV2FsbCB3YXJuaW5nLgotCSogYXJjaGl2ZS5jOiAgQWRkIG1pc3NpbmcgY29tbWFzIGluIERFRlVOIG1hY3JvICgyIHBsYWNlcykuCi0JKiBlbGYuYywgY29mZmNvZGUuaCwgYW91dGYxLmg6ICBVc2UgQU5TSSBmdW5jdGlvbnMgaW5zdGVhZCBvZgotCUJlcmtlbGV5IG9uZXMsIG5vdyB0aGF0IGxpYmliZXJ0eSBoYXMgdGhlbToKLQliY29weS0+bWVtY3B5LCBiemVyby0+bWVtc2V0LCBiY21wLT5tZW1jbXAuCi0JKiBhb3V0eC5oOiAgVmFyaW91cyB0b3VjaC11cHM6ICBSZS1mb3JtYXR0aW5nLCBmaXggYSBjYXN0LAotCXJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0KLVR1ZSBEZWMgMTcgMTk6NDg6NTkgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogIEVuY2xvc2UgY29yZW5hbWUKLQlhbmQgZXhlY25hbWUgaW5zaWRlIEhBVkVfUFJPQ0ZTIGlmZGVmIHNpbmNlIHRoZXkgYXJlIHVudXNlZAotCXdoZW4gaXQgaXMgbm90IGRlZmluZWQuCi0KLU1vbiBEZWMgMTYgMTI6MDA6MTAgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiAgRmxhZyBhbGwgc2VjdGlvbnMgYXMgZWl0aGVyIGNvZGUgb3IgZGF0YS4gIFdlIGNhbid0Ci0JYmUgc3VyZSB3aGF0IHRoZXkgYXJlIGFueXdheSwgc2luY2UgRUxGIGRvZXNuJ3QgZml0IHRoZQotCXRyYWRpdGlvbmFsIG1vZGVsIG9mIHRleHQrZGF0YStic3MgdmVyeSB3ZWxsLiAgQWRkIG5ldyBsb2NhbAotCWZ1bmN0aW9uIGVsZl9yZWFkKCkgdG8gc2ltcGxpZnkgY29kZS4gIFJlY29yZCBlbnRyeSBwb2ludCBpbgotCXRoZSBiZmQgc3RydWN0dXJlLgotCi1UaHUgRGVjIDEyIDIxOjAxOjIyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLSouaDogIENvbmZpZ3VyZSBmb3BlbiB1c2luZyAuLi9pbmNsdWRlL2ZvcGVuLSouaAotCXJhdGhlciB0aGFuIE4gY29waWVzIG9mIHRoZSBzYW1lIGxpbmVzLgotCi1XZWQgRGVjIDExIDE2OjM5OjQ1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjcHUtaDgzMDAuYzogZGlzYXNzZW1ibGUgYnJhbmNoIGRpc3BsYWNlbWVudHMgY29ycmVjdGx5Ci0JKiBjb2ZmLWg4MzAwLmM6IHB1dCByZWxvYyBvZmZzZXRzIG91dCBpbiAzMmJpdHMKLQotCSogbWFrZWZpbGUuZG9zLCBjb25maWdkai5iYXQ6IE5ldyBmaWxlcyBmcm9tIERKCi0JKiBjYWNoZS5jOiBmb3BlbiB3aXRoIG5ldyBtYWNyb3MgaXMgbmVlZGVkIGZvciBET1MuCi0JKiBpZWVlLmM6IGVudmlyb24gcmVuYW1lZCB0byBlbnZpIHRvIHN0b3AgYW4gaW5jbHVkZSBmaWxlCi0JY29uZmxpY3QuCi0JKiBvcG5jbHMuYywgY29mZi1yczYwMDAuYzogbW9yZSBmb3BlbnMgd2l0aCBtYWNyb3MuCi0KLVR1ZSBEZWMgMTAgMDQ6MDc6MjQgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLVNhdCBEZWMgIDcgMTY6Mzk6MjMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkgKiBNYWtlZmlsZS5pbjogZml4IHdoZXJlIGRvY2RpciBsaXZlcwotCi0JICogYW91dHguaCwgYXJjaGl2ZS5jLCBhcmNodXJlcy5jLCBiZmQuYywgY2FjaGUuYywgY29mZi1tODhrLmMsCi0JIGNvZmZjb2RlLmgsIGNvcmUuYywgY3Rvci5jLCBlbGYuYywgZm9ybWF0LmMsIGllZWUuYywgaW5pdC5jLAotCSBsaWJiZmQuYywgbGliYmZkLmgsIGxpYmNvZmYuaCwgb3BuY2xzLmMsIHJlbG9jLmMsIHNlY3Rpb24uYywKLQkgc3JlYy5jLCBzeW1zLmMsIHRhcmdldHMuYyA6IGFsbCBuZXcgZG9jdW1lbnRhdGlvbiBhbmQgbGludAotCSByZW1vdmFsLgotCi0KLVNhdCBEZWMgIDcgMDc6MjI6MDkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmgsIHNyZWMuYzogIExpbnQuCi0KLUZyaSBEZWMgIDYgMjI6NTg6NDggMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5zdGFsbCB1c2luZyBJTlNUQUxMX0RBVEEsIGFkZGVkIHN0YW5kYXJkcy50ZXh0Ci0JICBzdXBwb3J0LgotCi0JKiBjb25maWd1cmUuaW46IG1hcmsgZGlyZWN0b3J5IGFzIHRhcmdldCBkZXBlbmRlbnQuICBjb25maWd1cmUKLQkgIG5vd3Mgd29ya3MgaW4gb2JqZGlyIGFsd2F5cyBzbyBtYWtlIGZpbGUgZXhpc3RlbmNlIGNoZWNrcwotCSAgYWdhaW5zdCAke3NyY2Rpcn0uCi0KLVRodSBEZWMgIDUgMjI6NDY6MTkgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCi0JICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCi0JICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgotCi1XZWQgRGVjICA0IDEwOjE0OjE3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3NfPHNpemU+X29iamVjdF9wLCBzdW5vczRfY2FsbGJhY2spOiBtb3ZlZCB0aGUKLQljb21wdXRhdGlvbiBvZiBhcmNoIGFuZCBtYWNoaW5lIHR5cGUgc28gaXQncyB3b3JrZWQgb3V0IGJlZm9yZQotCXNvbWVfYW91dF9vYmplY3RfcCBpcyBjYWxsZWQuCi0JKiBhb3V0eC5oOiAoc29tZV9hb3V0X29iamVjdF9wKTogZG9uJ3Qgc2V0IGFyY2ggYW5kIG1hY2ggdG8KLQl1bmtub3duLgotCSogYXJjaHVyZXMuYzogYWRkIGV4dHJhIGZpZWxkICdzZWN0aW9uX2FsaWduX3Bvd2VyJyB0byBob2xkCi0JZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCBpbiBvYmplY3QgZmlsZXMuCi0JKiBjcHUtYTI5ay5jLCBjcHUtaDgzMDAuYywgY3B1LWkzODYuYywgY3B1LWk5NjAuYywgY3B1LW02OGsuYywKLQljcHUtbTg4ay5jLCBjcHUtbWlwcy5jLCBjcHUtcnM2MDAwLmMsIGNwdS1zcGFyYy5jLCBjcHUtdmF4LmM6Ci0JaW5pdGlhbGl6ZSB0aGUgbmV3IGZpZWxkLgotCSogYm91dC5jIChiX291dF9jYWxsYmFjayk6IHJlcGxhY2UgdGhlIHRleHQgc2l6ZSwgc2luY2UgYW91dAotCWZyaWVzIHRoZW0uCi0JKiBhb3V0eC5oOiBEb2N1bWVudGF0aW9uIGluIHRoZSBuZXcgc3R5bGUKLQotV2VkIERlYyAgNCAwMjowMDozMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9nZXRfbXRpbWUpOiAgRG9uJ3QgY2FjaGUgbXRpbWUgYW55IG1vcmU7IG9ubHkKLQl1c2UgdGhlIHNhdmVkIHZhbHVlIGlmIG10aW1lX3NldCBpcyBhbHJlYWR5IHNldCAoaW50ZW5kZWQKLQlmb3IgYXJjaGl2ZSBmaWxlcywgdGhvdWdoIGFwcGFyZW50bHkgbm90IHVzZWQgeWV0KS4KLQotVHVlIERlYyAgMyAyMjo1NDo1MCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jOiAgUmV2aXNlIGNvbW1lbnRzIGFib3V0IGhvdyB0byBjb25maWd1cmUgdGhlIHRhcmdldAotCXZlY3RvciwgdG8gbWF0Y2ggcmVhbGl0eS4gIFJlbW92ZSBtZW50aW9uIG9mIG9ic29sZXRlIG1ldGhvZHMuCi0JUmVtb3ZlIGxvbmcgbGlzdHMgb2YgY2FwaXRhbGl6ZWQgbWFjcm9zIHRoYXQgdHVybiBpbnRvIHRoZSBzYW1lCi0JdGhpbmcgaW4gbG93ZXJjYXNlLiAgTm9ybWFsIHZlY3RvciBzaW1wbHkgbGlzdHMgYWxsIGtub3duCi0JbG93ZXJjYXNlIHh2ZWMgbmFtZXM7IGFsbCBvdGhlciBjYXNlcyBhcmUgaGFuZGxlZCBieSBTRUxFQ1RfVkVDUy4KLQotCSogY29uZmlnL210LWkzODYtY29mZjogIFNldCBERUZBVUxUX1ZFQ1RPUiB0byByZWFsIGlkZW50aWZpZXIsCi0Jbm90IG1hY3JvIG5hbWUuCi0KLQkqIGNvbmZpZy9tdC1pOTYwLXtjb2ZmLGJvdXR9OiAgVXNlIFNFTEVDVF9WRUNTIHRvIG1ha2UgYSBzaG9ydAotCWxpc3Qgb2Ygc3VwcG9ydGVkIHRhcmdldHMuCi0KLVR1ZSBEZWMgIDMgMTQ6MDY6MTUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogIFRoZSBwYWQgYnl0ZSBzb21ldGltZXMgYWRkZWQgdG8KLQl0aGUgc3RyaW5nIHRhYmxlIGluIGEgX18uU1lNREVGIG1lbWJlciBpcyBub3cKLQljb3VudGVkIGFzIHBhcnQgb2YgdGhlIHNpemUgb2YgdGhlIHN0cmluZyB0YWJsZS4KLQlUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIHJhbmxpYiwgYXMgd2VsbCBhcyBTdW4ncy4KLQotVHVlIERlYyAgMyAxMDo1MzozMCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jOiBSZXdyb3RlIHRvIGZpeCBtYW55IGJ1Z3M7IG5vdyBnZXRzIHRoZSByZWNvcmQgdHlwZQotCXJpZ2h0LCBkb2Vzbid0IGNob2tlIG9uIGlucHV0LCBzZXRzIHRoZSBzdGFydCBhZGRyZXNzIGluIGFuIFM5IGFuZAotCWZpbGxzIGluIHRoZSBmaWxlbmFtZSBvbiBhbiBTMC4KLQotU2F0IE5vdiAzMCAyMToxOToxNSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY3B1LWg4MzAwLmM6IEFkZCBzdXBwb3J0IGZvciBNRU1JTkQgYWRkcmVzc2luZyBtb2RlCi0KLQkqIGNvZmYtYTI5ay5jOiBkZWZpbmVkIFJFTE9DX1BST0NFU1NJTkcgdG8gdGFrZSB0aGUgI2lmZGVmIG91dCBvZgotCWNvZmZjb2RlLmgKLQkqIGNvZmZjb2RlLmg6IHVzZSB0aGUgbmV3IG1hY3JvIGlmIGF2YWlsYWJsZQotCi0JKiBlbGYuYyAoZWxmX2NvcmVmaWxlX25vdGUpOiBjYXN0IG1hbGxvYyB0byBhdm9pZCB3YXJuaW5nLgotCSogTWFrZWZpbGUuaW46IEZpeGVkIGRlcGVuZGVuY2llcyBkdWUgdG8gZmlsZSByZW5hbWUKLQotCSogYW91dC1lbmNhcC5jLCBhb3V0ZjEuaCwgYW91dHguaCwgYXJjaGl2ZS5jLCBib3V0LmMsIGNvZmYtYTI5ay5jLAotCWNvZmYtaDgzMDAuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMsCi0JY29mZi1taXBzLmMsIGNvZmYtcnM2MDAwLmMsIGNwdS1oMzAwLmMsIGVsZi5jLCBpMzg2YW91dC5jLAotCW5ld29zMy5jLCBzdGFiLXN5bXMuYywgc3ltcy5jOiBBbGwgdGhlc2UgZmlsZXMgaGF2ZSBoYWQgdGhlaXIKLQkjaW5jbHVkZXMgYWx0ZXJlZCB0byBwb2ludCB0byB0aGUgbmV3IHBsYWNlcy4KLQotRnJpIE5vdiAyOSAyMDowNDo0OSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWkzODZ2NCwgY29uZmlnL21oLWkzODYtZWxmLCBob3N0cy9oLWkzODZ2NC5oOiAgTmV3IGZpbGVzLgotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgdmVuZG9yICJuY3IiIGFzIHN1cHBvcnRlZCBwZXItdGFyZ2V0IHZlbmRvci4KLQlBZGQgc3ZyNCBjYXNlIGZvciBpMzg2IHBlci1ob3N0IGNhc2UuCi0KLQkqIGVsZi5jIChlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6ICBBZGQgbWlzc2luZyAiYnJlYWsiIHRvCi0JRUxGREFUQTJMU0IgY2FzZXMuCi0KLUZyaSBOb3YgMjkgMTI6MTY6NTEgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHN5bXMuYyAoYmZkX2RlY29kZV9zeW1jbGFzcyk6ICBSZXR1cm4gJ0EnCi0JZm9yIHN5bWJvbHMgdGhhdCBhcmUgYm90aCBhYnNvbHV0ZSBhbmQgZ2xvYmFsLgotCSogYXJjaGl2ZS5jIChiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSk6ICBSZXR1cm4gTlVMTAotCWlmIGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtIHJldHVybnMgTlVMTC4KLQotVHVlIE5vdiAyNiAwOToxMDo1NSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY29mZi1oODMwMAotCSogY29uZmlndXJlLmluOiBub3cgaDggaXMgYSBjb2ZmIHRhcmdldAotCSogY3B1LWg4MzAwLmM6IGZpeCB2YXJpb3VzIGRpc2Fzc2VtYmx5IHByb2JsZW1zCi0JKiBsaWJjb2ZmLmg6IHRvb2sgb3V0IHNvbWUgY29kZSB3aGljaCBoYXMgYmVlbiAjMGVkIGZvciBhIGxvbmcKLQl0aW1lLgotCSogdGFyZ2V0cy5jOiBhZGRlZCBoOCBjb2ZmCi0JKiBjb2ZmLWEyOWsuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMKLQlhZGRlZCBuZXcgbWFjcm8gUlRZUEUySE9XVE8gdG8gdGFrZSBhIGxvYWQgb2YgI2lmZGVmcyBvdXQgb2YKLQljb2ZmY29kZS5oCi0JKiBjb2ZmY29kZS5oOiBTdGFydGVkIHRvIGNoYW5nZSB0aGUgd2F5IG1hY2hpbmUgZGVwZW5kZW5jaWVzIGFyZQotCWhhbmRsZWQsIGZyb20gdGhlIG5lc3Qgb2YgI2lmZGVmcyB0byBtYWNyb3MgZGVmaW5lZCBpbiB0aGUKLQlpbmNsdWRpbmcgY29mZi08Zm9vPi5jCi0KLUZyaSBOb3YgMjIgMDg6MTE6NDIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBTZXQgdGhlIGBleGVjdXRhYmxlJyBiaXQKLQlpZiB0aGUgZW50cnkgcG9pbnQgaXMgY29udGFpbmVkIGluIHRoZSB0ZXh0IHNlZ21lbnQsIGV2ZW4gaWYgdGhlCi0JdGV4dCBzZWdtZW50IGlzIGF0IGxvY2F0aW9uIDAuCi0KLQkqIGNvZmYtbWlwcy5jLCBjb2ZmY29kZS5oOiAgUGV0ZXIgU2NoYXVlcidzIHBhdGNoIHRvIGtsdWRnZSBpbgotCW5vbnN0YW5kYXJkIE1JUFMgc2VjdGlvbnMgKC5yZGF0YSwgLnNkYXRhLCBldGMpLgotCi0JKiBhb3V0eC5oLCBiZmQuYywgY29mZmNvZGUuaCwgaWVlZS5jLCBvYXN5cy5jLCB0YXJnZXRzLmM6IENPTlNUIGxpbnQuCi0JKiBsaWJiZmQtaW4uaCwgbGliYmZkLmgsIGFvdXR4LmgsIGNvZmZjb2RlLmgsIGVsZi5jLCBsaWJhb3V0Lmg6Ci0JUmVuYW1lIEFMSUdOIHRvIEJGRF9BTElHTiB0byBhdm9pZCBjb25mbGljdCB3aXRoIEJTRCA8c3lzL3BhcmFtLmg+LgotCSogbGliYmZkLmM6ICBMaW50LgotCSogaG9zdC1hb3V0LmMsIHRyYWQtY29yZS5jOiAgRml4IHdyaXRlX2FybWFwIHByb3RvdHlwZXMuICBMaW50LgotCi1UaHUgTm92IDIxIDE5OjU2OjQwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzdGFiLXN5bXMuYywgc3ltcy5jOiAgTW92ZWQgYmZkX3N0YWJfbmFtZSgpIGFuZCBiZmRfc3RhYl9uYW1lc1tdCi0JZnJvbSBzeW1zLmMgdG8gbmV3IGZpbGUgc3RhYi1zeW1zLmMuICBBbHNvLCBzaW5jZSBHTlUgZXh0ZW5kZWQKLQl0eXBlIGNvZGVzIHN1Y2ggYXMgTl9TRVRUIGFyZSBubyBsb25nZXIgaW4gLi4vaW5jbHVkZS9zdGFiLmRlZiwKLQlpbmNsdWRlIHRoZW0gbWFudWFsbHkuCi0JKiBzdGFiLXN5bXMuYywgYW91dHguaDogUmVuYW1lZCBiZmRfc3RhYl9uYW1lKCkgYW5kCi0JYmZkX3N0YWJfbmFtZXNbXSB0byBhb3V0X3N0YWJfbmFtZSgpIGFuZCBhb3V0X3N0YWJfbmFtZXNbXS4KLQkqIGxpYmFvdXQuaDogQWRkZWQgcHJvdG90eXBlIGZvciBhb3V0X3N0YWJfbmFtZSgpLgotCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgTWFrZWZpbGUgZm9yIG5ldyBzdGFiLXN5bXMuW2NvXS4KLQotVGh1IE5vdiAyMSAxMTo1MDo0OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChXT1JLX09VVF9GSUxFX1BPU0lUSU9OUyk6ICBPbmUgbW9yZSB0cnkgYXQgdGhpcwotCXJhdGhlciBjb21wbGljYXRlZCBzZWVtaW5nIHByb2JsZW0uICBFbGltaW5hdGUgTE9HSUNBTF8gdmVyc2lvbnMsCi0JanVzdCBtYWtlIE5fWFhYIHdvcmsgYnkgZXhjbHVkaW5nIHRoZSBoZWFkZXIgZnJvbSB0aGUgdGV4dCBzZWdtZW50LgotCSogYW91dHguaDogIEZpeCBjb21tZW50cyB0byBtYXRjaC4KLQotVHVlIE5vdiAxOSAxODo0OTowMSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChXT1JLX09VVF9GSUxFX1BPU0lUSU9OUyk6ICBVc2UgbmV3IExPR0lDQUxfVFhUQUREUiwKLQlMT0dJQ0FMX1RYVE9GRiwgTE9HSUNBTF9UWFRTSVpFIG1hY3JvcyB0byBmaWd1cmUgb3V0IG51bWJlcnMKLQlmb3IgdGhlICJsb2dpY2FsIiB0ZXh0IHNlZ21lbnQgKGkuZS4gbmV2ZXIgY29uc2lkZXIgdGhlIGV4ZWMKLQloZWFkZXIgdG8gYmUgcGFydCBvZiB0aGUgdGV4dCBzZWdtZW50KS4gIFRoaXMgY2hhbmdlIGlzCi0JbmVlZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHZhcmlvdXMgb3RoZXIgcGFydHMgb2YgYmZkIGFuZCBsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb2VfYW91dF9vYmplY3RfcCkpOiAgRml4IGNvbW1lbnQsCi0JYW5kIG1vdmUgY2FsY3VsYXRpb24gb2Ygb2JqX3RleHRzZWMoYWJmZCktPnNpemUgdG8gbGliYW91dC5oLgotCSogYmZkLWluLmg6ICBSZW1vdmVkIGJvZ3VzICc7Jy4KLQotCSogTWFrZWZpbGUuaW46ICBBZGQgTUlOSU1JWkUgZmxhZyB0byBzZWxlY3QgbGVhbgotCW9yIGJsb2F0ZWQgdGFyZ2V0X3ZlY3Rvci4KLQkqIHRhcmdldHMuYzogIFVzZSBuZXcgTUlOSU1JWkUgbWFjcm8sIGFuZCBhZGQgdHJhZF9jb3JlIGlmIG5lZWRlZC4KLQkqIG5ld3NvczMuYzogIEZpeGVzIHRvIC4uL2luY2x1ZGUvYW91dDY0LmggcmVtb3ZlIG5lZWQKLQlmb3Igc3BlY2lhbCBOX1RYVE9GRiBtYWNybywgYnV0IHJlcXVpcmUgTl9IRUFERVJfSU5fVEVYVC4KLQotTW9uIE5vdiAxOCAxMjowMDo1OSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCwgYW91dGYxLmgsIG5ld3NvczMuYzogIE1ha2UgYW91dC10YXJnZXQuaAotCWhhbmRsZSBib3RoIGxpdHRsZSBhbmQgYmlnLWVuZGlhbiB0YXJnZXRzLCB3aXRoIGxpdHRsZQotCXRoZSBkZWZhdWx0IHVubGVzcyBUQVJHRVRfSVNfQklHX0VORElBTl9QIGlzIGRlZmluZWQuCi0JKiBob3N0LWFvdXQuYzogIEFkZCBGSVhNRSBub3RlLgotCi1TdW4gTm92IDE3IDEzOjI5OjM5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmM6ICBNYWtlIHRoZSBkZWZhdWx0IHRhcmdldF92ZWN0b3IgY29udGFpbgotCWp1c3QgJkRFRkFVTFRfVkVDVE9SLiAgVGhpcyBtYWtlcyBleGVjdXRhYmxlcyBhIGxvdCBzbWFsbGVyLgotCU9sZCBiZWhhdmlvciBjYW4gYmUgZ290dGVuIGJ5IGRlZmluaW5nIEFMTF9UQVJHRVRTLgotCSogYW91dGYxLmgsIGRlbW82NC5jLCBpMzg2YW91dC5jLCBuZXdzb3MzLmMsIHN1bm9zLmM6Ci0JRmFjdG9yZWQgb3V0IGNvbW1vbiBjb2RlIGludG8gbmV3IGZpbGUgYW91dC10YXJnZXQuaC4KLQlTYXZlcyBhIGxvdCBvZiBkdXBsaWNhdGUgY29kZSBmb3IgYS5vdXQgdmFyaWFudHMuCi0KLUZyaSBOb3YgMTUgMTM6MDA6NDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQlHZXQgJ21ha2UgaGVhZGVycycgdG8gd29yayB3aGVuIGNvbmZpZ3VyZWQgd2l0aCArc3ViZGlycy4KLQkqIE1ha2VmaWxlLmluOiBBZGQgJChzdWJkaXIpIHRvIGRvY2RpciBwYXRoLgotCSogZG9jL01ha2VmaWxlLmluIChwcm90b3MpOiBBZGQgJChzcmNkaXIpIHByZWZpeAotCXRvIG5hbWUgb2Ygc2VkIHNjcmlwdHMuCi0KLVRodSBOb3YgMTQgMTk6NDk6MTAgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxwcmludF9zeW1ib2wpKTogIEZpeCB0aGlua28uCi0JKiBzeW1zLmMgKGJmZF9zdGFiX25hbWVzKTogIFR1cm4gb24gbmV3IEdOVV9FWFRSQV9TVEFCUyBtYWNybwotCXRvIGluY2x1ZGUgbmFtZXMgb2YgTl9TRVRUIGV0Yy4KLQotVGh1IE5vdiAxNCAxOToxMToxMyAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotICAgIAkqIGVsZi5jOiAgQWRkIG1pbmltYWwgc3VwcG9ydCBmb3IgRUxGIHN5bWJvbCB0YWJsZXMuICBHZW5lcmF0ZXMKLQljYW5vbmljYWwgYmZkIHN5bWJvbCB0YWJsZXMgZnJvbSBFTEYgc3ltYm9sIHRhYmxlcy4gIENoYW5nZSB0aGUKLQluYW1lIG9mIHNvbWUgZnVuY3Rpb25zIGZyb20gYmZkXzxuYW1lPiB0byBlbGZfPG5hbWU+LgotCi0JKiBzeW1zLmM6ICBUcml2aWFsIGZpeCB0byBjb21tZW50IHRvIHJlbW92ZSBhIHJlZHVuZGFudCAidG8iLgotCi1XZWQgTm92IDEzIDE3OjAyOjAxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXtpMzg2LG02OGssbTg4a30uYzogIENoYW5nZSBuYW1lIG9mIGZpbGUgZm9ybWF0IHRvIHN0YW5kYXJkCi0JZm9ybSB0aGF0IEdEQiByZWNvZ25pemVzIGFzIENPRkYuCi0KLVdlZCBOb3YgMTMgMDk6MDk6NDEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChpZWVlX29iamVjdF9wKTogIGNhc3QgTlVMTCBjb3JyZWN0bHkuCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIGhhcnJpcyBob3N0Ci0KLQkqIGNvZmYtYTI5ay5jOiBMb3RzIG9mIGNoYW5nZXMsIG1vc3QgZnJvbSBEYXZpZCBXb29kLgotCi1UdWUgTm92IDEyIDA3OjIxOjQxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW04OGsuYyAoY29mZl93cml0ZV9hcm1hcCk6ICBKdXN0ICN1bmRlZiBpdC4KLQotTW9uIE5vdiAxMSAyMDozMDoxOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogc3RhbmRhcmRpemUgb24gTUlOVVNfRyB0byBkaXNhYmxlIGRlYnVnZ2luZwotCSogY29mZi1tODhrLmM6IGNyZWF0ZSBjb2ZmIGFybWFwcyBpbnN0ZWFkIG9mIGJzZCBvbmVzLgotCSogb3BuY2xzLmMgKGJmZF9jbG9zZV9hbGxfZG9uZSksIChiZmRfY2xvc2UpOiBNYXNrIG91dCByYW5kb20gYml0cwotCXdoZW4gY2FsbGluZyBjaG1vZC4KLQotTW9uIE5vdiAxMSAxOTowNzozMiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6ICBBZGRpdGlvbnMgdG8gc3VwcG9ydCBFTEYgZm9ybWF0IGNvcmUgZmlsZXMuCi0JKiBjb25maWcvbWgtYW1peDogIEFkZCAtREhBVkVfUFJPQ0ZTIHRvIEhERUZJTkVTLCBzaW5jZSBob3N0Ci0JaGFzIHN1cHBvcnQgZm9yIC9wcm9jIChhbGwgdGhlIGluY2x1ZGUgZmlsZXMgaW4gcGFydGljdWxhcikuCi0KLU1vbiBOb3YgMTEgMTg6MzY6NDcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiAgSGFuZGxlIHRoZSBjYXNlCi0Jb2YgdHdvIE5fU08gc3RhYnMsIG9uZSBmb3IgZGlyZWN0b3J5LCBhbmQgb25lIGZvciBmaWxlbmFtZS4KLQotCSogYmZkLWluLmggKHByaW50X3ZtYSk6ICBGYWN0b3Igb3V0IGR1cGxpY2F0ZSBkZWZpbml0aW9uLgotCi0JRXhpdCBhIGxpdHRsZSBtb3JlIGdyYWNlZnVsbHkgd2hlbiBtYWxsb2MgcmV0dXJucyBOVUxMLgotCSogbGliYmZkLmM6IE5ldyBmdW5jdGlvbiBiZmRfeG1hbGxvYyAobWFsbG9jIHdyYXBwZXIpLgotCSogb3BuY2xzLmMsIHN5bXMuYywgYm91dC5jLCBhb3V0eC5oOiAgUmVwbGFjZSBtYWxsb2MgYnkgYmZkX3htYWxsb2MuCi0JKiBsaWJiZmQuaDogUnJlLWdlbmVyYXRlZCBkdWUgdG8gbGliYmZkLmMgdXBkYXRlLgotCi1TYXQgTm92ICA5IDEzOjQ1OjAxIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbXQtbTY4ay1lbGY6ICBEZWZpbmUgREVGQVVMVF9WRUNUT1IgYXMgZWxmX2JpZ192ZWMuCi0KLQkqIGVsZi5jIChlbGZfb2JqZWN0X3ApOiAgRG9uJ3QgdHJ5IHRvIGNyZWF0ZSBhIGJmZCBzZWN0aW9uIGZvcgotCXRoZSBmaXJzdCBFTEYgc2VjdGlvbiBoZWFkZXIuICBJdCBpcyBqdXN0IGEgcGxhY2Vob2xkZXIuCi0KLVNhdCBOb3YgIDkgMDM6MDQ6MjYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtcnM2MDAwLmMsIGNvbmZpZy9taC1yczYwMDA6ICBNYWtlIGl0IHdvcmsgb24gYXJjaGl2ZSBhbmQKLQljb3JlIGZpbGVzLCB3aGVuIGNvbXBpbGluZyBuYXRpdmUuCi0JKiBob3N0cy9oLXJzNjAwMC5oOiAgRGVmaW5lIEZBU0NJU1RfRkRPUEVOIGZvciBiZmRfZmRvcGVuci4KLQotCUZJWE1FOiAgVGhlIGFvdXRmMS5oIGNoYW5nZSBiZWxvdyBuZWVkcyB0byBiZSByZXZlcnNlZCBiYWNrCi0JdG8gdGhlIHdheSBpdCB3YXMuCi0KLVRodSBOb3YgIDcgMTE6MDM6NTUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IERlZmluZWQgbmV3IG1hY3JvcyBbUFVUfEdFVF1MSU5FTk9fTE5OTyBmb3IKLQltYW5pcHVsYXRpb24gb2YgbG5ubyBmaWVsZHMgaW4gbGluZW5vIHN0cnVjdHMgaW4gYSBjb2ZmLTxmPi5oCi0JaW5kZXBlbmRlbnQgd2F5LiBPdmVycmlkZSBpdCBpbiBjb2ZmLTxmPi5oIHRvIHlvdXIgZmF2b3VyaXRlCi0JbnVtYmVyIGlmIHlvdSBkb24ndCBoYXZlIGEgMTZiaXQgbG5ubyBmaWVsZC4gKGNvZmZfc3dhcF9saW5lbm9faW4pCi0JKGNvZmZfc3dhcF9saW5lbm9fb3V0KTogbW9kaWZpZWQgdG8gdXNlIHRoZSBuZXcgbWFjcm9zLgotCi1Nb24gTm92ICA0IDExOjM4OjMzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfY2FsbGJhY2spOiBOb3cgZGVmYXVsdHMgdG8gNjgwMjAgcmF0aGVyIHRoYW4KLQl1bmtub3duIGFyY2ggd2hlbiB0aGUgbWFnaWMgbnVtYmVyIGRvZXNuJ3Qgc3BlY2lmeSB0aGUKLQlhcmNoaXRlY3R1cmUsIHNpbmNlIHNvbWUgT1NzIChlZyBvbGQgc3VuM3MpIGRvbid0IHNldCB0aGUgbnVtYmVyLCBhbmQKLQkwMjAgaXMgcHJvYmFibHkgdGhlIHJpZ2h0IGFuc3dlciBhbnl3YXkuCi0KLVN1biBOb3YgIDMgMTI6MDc6MDggMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtbmV3cy5oLCBob3N0cy9oLXJ0YnNkLmg6Ci0JR2V0IHJpZCBvZiBNSVNTSU5HX1ZGUFJJTlRGLCBzaW5jZSBsaWJpYmVydHkgcHJvdmlkZXMgb25lLgotCSogYmZkLWluLmggKGJmZF9wcmludF9zeW1ib2xfdHlwZV9ob3B3IGVudW0pOiAgIEFkZCBuZXcgb3B0aW9uCi0JYmZkX3ByaW50X3N5bWJvbF9ubSwgZm9yIHVzZSBieSBubS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxwcmludF9zeW1ib2wpKTogIEFkZCBjb2RlIGZvciBuZXcKLQliZmRfcHJpbnRfc3ltYm9sX25tIG9wdGlvbiwgdG8gcHJpbnQgaW4gbm0gZm9ybWF0LgotCSogY29mZmNvZGUuaCAoY29mZl9wcmludF9zeW1ib2wpLCBpZWVlLmMgKGllZWVfcHJpbnRfc3ltYm9sKQotCW9hc3lzLmMgKG9hc3lzX3ByaW50X3N5bWJvbCk6ICBQcm92aWRlIHN0dWIgaW1wbGVtZW50YXRpb25zCi0JZm9yIGJmZF9wcmludF9zeW1ib2xfbm0uCi0JKiBzeW1zLmM6ICBOZXcgZnVuY3Rpb24gYmZkX2RlY29kZV9zeW1jbGFzcywgdXNlZCBieSBubSBwcmludGVyLgotCU5ldyBmdW5jdGlvbiBiZmRfc3RhYl9uYW1lIHRvIGxvb2sgdXAgc3RyaW5nIG5hbWUgb2Ygc3RhYiBjb2RlLgotCi1TYXQgTm92ICAyIDE0OjI2OjAzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZGVkIGN0b3IuYwotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3QpIGFkZGVkCi0JYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAuCi0JKiBjb2ZmY29kZS5oOiByZW1vdmVkIGEgbG9hZCBvZiAjaWYgMGVkIGNvZGUuCi0JKGNvZmZfY29tcHV0ZV9maWxlX3NlY3Rpb25fcG9zaXRpb25zKTogbm93IHdvcmtzIG91dCB0aGUgc2VjdGlvbgotCWFsaWdubWVudCBhbmQgc2l6ZSBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzLgotCShjb2ZmX2dldF9zeW10YWIpOiBsb29rcyBmb3IgY29uc3RydWN0b3Igc3ltYm9scyBhbmQgY2FsbHMgdGhlCi0JcmlnaHQgZnVuY3Rpb24gd2hlbiB0aGV5J3JlIGZvdW5kLiAoY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOgotCWtub3dzIHdoZW4gYSBzZWN0aW9uIGlzIGZ1bGwgb2YgY29uc3RydWN0b3JzIGFuZCBkb2VzIHRoZSByaWdodAotCXRoaW5nLgotCSogY3B1LW04OGsuYzogQWRkZWQgZGVmYXVsdF9yZWxvY190eXBlIGxvb2t1cCB0byB0aGUgYXJjaGl0ZWN0dXJlCi0JZGVzY3JpcHRpb24uCi0JKiBsaWJiZmQtaW4uaDogKGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwKSBkZWZ1biAgYWRkZWQuCi0JKiBsaWJjb2ZmLmg6IHJlbW92ZWQgI2lmIDBlZCBjb2RlCi0JKiByZWxvYy5jOiAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSBhZGRlZCBCRkRfUkVMT0NfQ1RPUiBmb3IKLQlhcmNoIGluZGVwZW5kZW50IGNvbnN0cnVjdG9yIHJlbG9jYXRpb24gdHlwZS4KLQkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogcmVtb3ZlZCB0aGUgY29tbWVudCAidGhpcyB3aWxsIGdvIGF3YXkiCi0Jc2luY2UgaXQgd29uJ3QuIChiZmRfaG93dG9fMzIpOiBzdG9sZW4gZnJvbSA4OGssIHRoaXMgaXMgYSAzMmJpdAotCXJlbG9jIHdoaWNoIGlzIHVzZWQgd2hlbiBCRkRfUkVMT0NfQ1RPUiBmYWxscyB0aHJvdWdoIHRvIGdpdmUgYQotCWRlZmF1bHQgMzJiaXQgcmVsb2MgZm9yIGNvbnN0cnVjdG9ycy4KLQkoYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXApOiBhZGRlZC4KLQkqIGFvdXRmMS5oOiBmaXhlZCBTRUdNRU5UX1NJWkUgdHlwby4KLQotVGh1IE9jdCAzMSAxODoyMzowNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1yczYwMDAuYzogIENoYW5nZSBuYW1lIHRvICJhaXhjb2ZmLXJzNjAwMCIsIHRvIGF2b2lkCi0JbWF0Y2hpbmcgcHJlZml4ICJjb2ZmIi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4sIGNvZmZfc3dhcF9hdXhfb3V0KTogIEhhbmRsZQotCXJzLzYwMDAgY3NlY3QgcmVjb3Jkcy4KLQotU3VuIE9jdCAyNyAxNjo1Njo1OCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTg4ay5jLCB0YXJnZXRzLmM6IGNoYW5nZSBuYW1lIG9mIG04OGtfYmNzIHRvIG04OGtiY3MKLQkqIGNvbmZpZ3VyZS5pbjogYWRkIG1vdG9yb2xhIGRlbHRhODggY2FzZXMKLQkqIGxpYmJmZC5oLCBsaWJiZmQtaW4uaCwgYXJjaGl2ZS5jLCBpZWVlLmMsIGVsZi5jLCBzcmVjLmM6IGZpeAotCXdyaXRlX2FybWFwIHByb3RvdHlwZQotCSogbGliYmZkLmM6IGFkZCBkb2Mgb24gYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQKLQotRnJpIE9jdCAyNSAwMjo0ODoxOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogUmVuYW1lIENPRkYtcmVsYXRlZCBmaWxlcyBpbiBgY29mZi1BUkNILmMnIGZvcm0uCi0JY29mZi1hMjlrLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jLAotCWNvZmYtbWlwcy5jLCBjb2ZmLXJzNjAwMC5jIHRvIGJlIGV4YWN0LgotCi0JKiBNYWtlZmlsZS5pbjogIE9ubHkgc3VwcGx5IFRBUkdFVF9ERUZBVUxUUyB0byB0YXJnZXRzLmMsIHJlZHVjaW5nCi0JbWFrZSBvdXRwdXQgY2x1dHRlci4KLQkqIGNvbmZpZy9tdC0qOiAgRGl0dG8uCi0KLVRodSBPY3QgMjQgMjI6NDA6MDcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQlSUy82MDAwIHN1cHBvcnQsIGJ5IE1ldGluIEcuIE96aXNpaywgTWltaSBQaPv0bmctVGjlbyBW9SwgYW5kCi0JSm9obiBHaWxtb3JlLiAgQXJjaGl2ZSBzdXBwb3J0IGZyb20gRGFtb24gQS4gUGVybWV6ZWwuCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGNwdS1yczYwMDAuYyBhbmQgcnM2MDAwY29mZi5jLgotCSogY29uZmlndXJlLmluOiAgQWRkIHJzNjAwMCBjYXNlLgotCSogdGFyZ2V0cy5jOiAgQWRkIHJzNjAwMCB2ZWN0b3IuCi0JKiBhcmNodXJlcy5jOiAgQWRkIHJzNjAwMCwgZml4IGNvbW1lbnQgb24gcm9tcC4KLQkqIGJmZC1pbi5oIChlbnVtIGJmZF9lcnJvcik6ICBBZGQgbm9fZGVidWdfc2VjdGlvbiBlcnJvci4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfdGRhdGEpOiAgUmVtb3ZlIHVudXNlZCBzdHJpbmdfdGFibGUuCi0JKiBiZmQuYyAoYmZkX2Vycm1zZ3MpOiAgQWRkIG5vX2RlYnVnX3NlY3Rpb24gZXJyb3IgbWVzc2FnZS4KLQkqIHNlY3Rpb24uYyAoYmZkX21ha2Vfc2VjdGlvbik6ICBSZXR1cm4gTlVMTCBvbiBhdHRlbXB0IHRvIGNyZWF0ZQotCWEgc2VjdGlvbiB0d2ljZS4KLQkqIGNvZmZjb2RlLmggKGJmZF9zd2FwX3JlbG9jX2luKTogIEhhbmRsZSByX3R5cGUgYW5kIHJfc2l6ZS4KLQkoYmZkX3N3YXBfYW91dGhkcl9pbik6ICBIYW5kbGUgbG90cyBtb3JlIG1lbWJlcnMuCi0JKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6ICBJZiBzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gc2VlbiwKLQlqdXN0IHJldHVybiBmYWxzZSByYXRoZXIgdGhhbiBvdmVyd3JpdGluZyBpdC4KLQkoY29mZl9yZWFsX29iamVjdF9wKTogIFVuZGVyc3RhbmQgaW5jb21pbmcgbWFnaWMgbnVtYmVycy4KLQkoY29mZl9zZXRfZmxhZ3MpOiAgVW5kZXJzdGFuZCBvdXRnb2luZyBtYWdpYyBudW1iZXJzLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6ICBvdXRnb2luZyBhb3V0aGRyIG1hZ2ljICMuCi0JKGJ1aWxkX2RlYnVnX3NlY3Rpb24pOiAgQWRkIGZuIGZvciByZWFkaW5nIGRlYnVnIHN0cmluZyBzZWN0aW9uLgotCShnZXRfbm9ybWFsaXplZF9zeW10YWIpOiAgSGFuZGxlIHN5bWJvbCBuYW1lcyBpbiBkZWJ1ZyBzdHJpbmcgc2VjdGlvbi4KLQlSZW1vdmUgdW51c2VkIG9ial9zdHJpbmdfdGFibGUuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIEhhbmRsZSByczYwMDAtc3BlY2lmaWMgc3RvcmFnZSBjbGFzc2VzLgotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncywgTl9TRVQqKTogIENoZWNrIGZvcgotCWV4aXN0aW5nIHNlY3Rpb24gYmVmb3JlIG1ha2luZyBvbmUuCi0JKiBjcHUtcnM2MDAwLmM6ICBOZXcgZmlsZS4KLQkqIHJzNjAwMGNvZmYuYzogIE5ldyBmaWxlLgotCi1UaHUgT2N0IDI0IDAyOjAzOjI0IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogQWRkIHBhcnRpYWwgc3VwcG9ydCBmb3IgRUxGIGZvcm1hdCBjb3JlZmlsZXMuIFN0aWxsIG5lZWRzCi0Jc3VwcG9ydCBmb3IgZXh0cmFjdGluZyByZWdpc3RlcnMgZnJvbSBjb3JlZmlsZXMuCi0KLQkqIGNvbmZpZy90LW02OGstZWxmOiAgU2V0IERFRkFVTFRfVkVDVE9SIHRvIGVsZl9iaWdfdmVjLgotCi0JKiBjb25maWcve2gtYW1peCxoLWRndXgsaC1pcml4MyxoLXVsdHJhM306IEZvciBzeXN0ZW1zIHdoZXJlCi0JUkFOTElCIGlzIGRlZmluZWQgYXMgZWNobywgc2VuZCB0aGUgb3V0cHV0IHRvIC9kZXYvbnVsbCB0byBoZWxwCi0JcmVkdWNlIGNsdXR0ZXIgaW4gdGhlIG91dHB1dCBmcm9tIGRvaW5nIGEgbWFrZS4KLQotTW9uIE9jdCAyMSAxNzo0ODo0OCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaC12YXh1bHQuaDogIFJlbW92ZSBtYWxsb2MvZnJlZSBkZWNscyBjb3ZlcmVkIGluIHN0ZGxpYi5oLgotCUZpeCBIT1NUX1BBR0VfU0laRSBhbmQgSE9TVF9TRUdNRU5UX1NJWkUuICBGcm9tIERhdmlkIFRheWxvci4KLQotTW9uIE9jdCAyMSAwOTozNDoxMSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IG1ha2UgaXQgcGFkCi0Jc2VjdGlvbiBzaXplIG91dCBpZiB0aGVyZSBhcmUgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBzbyB0aGF0IHRoZQotCWltYWdlIHdpbGwgYmUgb2sgb24gYSBzeXN0ZW0gd2hlcmUgc2VjdGlvbiBwb3NpdGlvbnMgYXJlIHdvcmtlZAotCW91dCBieSBhY2N1bXVsYXRpbmcgc2l6ZXMgcmF0aGVyIHRoYW4gZnJvbSB0aGUgc2VjdGlvbiBoZWFkZXJzLgotCSogdGFyZ2V0cy5jIChwcm90byB3cml0ZV9hcm1hcCkuIENoYW5nZWQgb3JsX2NvdW50IHRvIHVuc2lnbmVkLgotCSogb3BuY2xzLmMgKGJmZF9jbG9zZV9hbGxfZG9uZSkuIEFkZGVkIHNvIHRoYXQgZ2VuZXJhdGl2ZQotCXByb2dyYW1zIGxpa2UgZ2FzIGNhbiBjbG9zZSBhIGJmZCB3aXRob3V0IGNhdXNpbmcgYmZkIGNvbmZ1c2lvbi4KLQkqIGxpYmJmZC5oIChjaGFuZ2VkIGJlY3Vhc2Ugb2YgcHJvdG9zKQotCSogYW1kY29mZi5jOiBtZXNzZWQgd2l0aCB0aGUgd2F5IHRoYXQgam1wIGRpc3BsYWNlbWVudHMgYXJlCi0JY2FsY3VhbGF0ZWQuIFRoaXMgbWF5IG5vdCB5ZXQgYmUgdG90YWxseSBjb3JyZWN0LgotCSogYXJjaGl2ZS5jIChjb2ZmX3dyaXRlX2FybWFwKTogcmV3cm90ZSB0aGUgd2F5IHRoYXQgcmFubGlicyBhcmUKLQl3cml0dGVuIG91dC4KLQkqIGNvZmZjb2RlLmggKGZpeHVwX3N5bWJvbF92YWx1ZSk6IG5vdyBkb2Vzbid0IGNvcmUgZHVtcCBpZiBhIG5vbgotCWFicyBzeW1ib2wgaGFzIG5vIHNlY3Rpb24gKGxpa2UgYSByZWdpc3RlciBzeW1ib2wpLgotCShjb2ZmX3dyaXRlX3N5bWJvbCkgbm93IHplcm9zIGF1eGVudCBiZWZvcmUgZmlsbGluZyBpdCB1cCB0byBoZWxwCi0Jd2l0aCBzZW5zaXRpdmUgYXBwbGljYXRpb25zLgotCSogbGliYmZkLmMgKGJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50KTogYWRkZWQuCi0KLVdlZCBPY3QgMTYgMjI6NTg6NDUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiAgTWFrZSBzdXJlIHdlIGRvbid0IGdldCBhIG1hY3JvIHN0cmVycm9yKCkuCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgSWYgRkFTQ0lTVF9GRE9QRU4sIHVzZSAiciIsIG5vdCAicisiLgotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKTogIFN1cHByZXNzCi0JYXR0ZW1wdCB0byByZWNvdmVyIGNvbW1hbmQsIGlmZGVmIE5PX0NPUkVfQ09NTUFORC4KLQkqIGhvc3RzL2gtdGFob2UuaDogIEFkZCBGQVNDSVNUX0ZET1BFTiBhbmQgTk9fQ09SRV9DT01NQU5EOwotCXJldmFtcCBIT1NUXyosIGV0Yy4KLQkqIGhvc3RzL2gtaTM4NnYuaDogIFVzZSA8dXRpbWUuaD4sIG5vdCA8c3lzL3V0aW1lLmg+LCB1bmxpa2UgUE9TSVguCi0KLVdlZCBPY3QgMTYgMTI6NDM6NDkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FyZ21hcCk6IFRoZSBzaXplIG9mIHRoZSByYW5saWIgc3RydWN0dXJlcwotCXNob3VsZCBub3QgaW5jbHVkZSB0aGUgc2l6ZSBmaWVsZCBpdHNlbGYuCi0JKiBhb3V0eC5oLCBsaWJhb3V0LmggKE5BTUUoYW91dCwgc2l6ZW9mX2hlYWRlcnMpKTogIFVzZQotCWFkYXRhKGFiZmQpLT5leGVjX2J5dGVzX3NpemUgZmllbGQgaW5zdGVhZCBvZiBjb25zdGFudCBtYWNybywKLQliZWNhdXNlIGFvdXR4LmggY29tcGlsZXMgdG8gYSBzaW1wbGUgLm8gZmlsZSBzaGFyZWQgYnkKLQlhbGwgMzItYml0cyBhLm91dCB0YXJnZXRzLgotCi1XZWQgT2N0IDE2IDExOjExOjA1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBbGxvdyBpMzg2LXNjby1zeXN2LgotCSogYm91dC5jOiAgUmVtb3ZlIHVudXNlZCBpOTYwX2FsaWduOyBsaW50IGR1bW15IGNvcmUgZmlsZSBoYW5kbGVycy4KLQkqIGNwdS1oODMwMC5jOiAgbGludC4KLQotCSogaG9zdC1hb3V0LmM6ICBOZXcgc3RyYXRlZ3kuICBXZSB1c2UgY29tbW9uIGNvZGUsIGluY2x1ZGUgZmlsZXMsCi0JYW5kIGRhdGEgc3RydWN0dXJlcyB0byBoYW5kbGUgdGhlIGZpbGUsIGJ1dCBzZXQgYSBmZXcgcGFyYW1ldGVycwotCWZyb20gdGhlIGhvc3QncyBjb25maWcgZmlsZSAocGFnZSBzaXplLCB0ZXh0IHN0YXJ0IGFkZHIsIGV0YykuCi0JKiBsaWJhb3V0Lmg6ICBEZWZpbmUgSFAgQlNEIG1hY2hpbmUgdHlwZXMuCi0JKiBhb3V0ZjEuaDogIEhhbmRsZSByZWFkaW5nIGEub3V0cyB3aXRoIHRoZXNlIHR5cGVzLgotCi0JKiB0cmFkLWNvcmUuYzogIFBhc3MgdGhlIHUudV9hcjAgdmFsdWUgYXMgdGhlIG5lZ2F0aXZlIG9mIHRoZQotCXZpcnR1YWwtbWVtb3J5LWFkZHJlc3Mgb2YgdGhlIC5yZWcgc2VjdGlvbi4gIFdlIGNhbid0IGp1c3QgbWFrZSBhCi0Jc2VjdGlvbiBmb3IgImFsbCB0aGUgcmVncyBhbmQgbm90aGluZyBlbHNlIiBiZWNhdXNlIG9ubHkgR0RCIGtub3dzCi0JZXhhY3RseSB3aGVyZSB0aGUgcmVncyBhcmUgKHNjYXR0ZXJlZCBhcm91bmQgdGhlIHVwYWdlIGFuZCBzdGFjaykuCi0JQ2xlYW4gdXAgbWVtb3J5IGFsbG9jYXRpb24uICBSZW1vdmUgYmlnLSBhbmQgbGl0dGxlLWVuZGlhbgotCXZlY3RvcnMsIHJlcGxhY2Ugd2l0aCBzaW5nbGUgdmVjdG9yOyB0aGlzIG9ubHkgcnVucyBvbiB0aGUgaG9zdCwKLQlpbiBob3N0IGJ5dGUgb3JkZXIuICBSZXBsYWNlIGJ5dGVzd2FwIHJvdXRpbmVzIHdpdGggYWJvcnRzIGluIGNhc2UKLQlhbnlvbmUgY2FsbHMgdGhlbS4KLQkqIHRhcmdldHMuYzogIFRoZXJlJ3Mgb25seSBvbmUgdHJhZF9jb3JlX3ZlYyBub3cuCi0JKiBhb3V0ZjEuaCAoc3Vub3NfY29yZV9maWxlX3ApOiAgVk1BIG9mIC5yZWcqIG5vdyBuZWVkcyB0byBiZSAwLgotCi1UdWUgT2N0IDE1IDA4OjI5OjAzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLWFtaXguaCAoZnJlZSk6ICBGaXggcHJvdG90eXBlLgotCi0JKiBhb3V0eC5oOiAgRG9uJ3QgdXNlIE5VTEwgYXMgYW4gaW50ZWdlciwgZm9yIGJyYWluZGVhZCBzeXN0ZW1zCi0JdGhhdCBkZWNsYXJlIGl0IGFzICh2b2lkICopMC4gIChGcm9tIFBldGVyIFNjaGF1ZXIuKQotCi1Nb24gT2N0IDE0IDE3OjIwOjQ3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgQWRkIHBhcmVudGhlc2VzIHRvIGF2b2lkIHJlcG9ydGVkCi0JcHJvYmxlbSB3aXRoIGJhZCBVbHRyaXggc3lzdGVtIGhlYWRlcnMuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpKTogIFRyeSB0byBoYW5kbGUgdGhlCi0JdmFyaW91cyBraW5kcyBvZiBhbGlnbm1lbnRzIGZvciB0aGUgdmFyaW91cyBraW5kcyBvZgotCW1hZ2ljIG51bWJlcnMuCi0KLU1vbiBPY3QgMTQgMTQ6MjM6MTAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZTogIERvbid0IGFzc3VtZSAuIGlzIG9uIHRoZSBwYXRoIChmcm9tIEphbWVzIENsYXJrKS4KLQotRnJpIE9jdCAxMSAyMjo0NToxNCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBdm9pZCBTdW4gTWFrZSBWUEFUSCBidWdzLgotCSogdGFyZ2V0cy5jOiAgRGVjbGFyZSB0cmFkX2NvcmUgdmVjdG9ycyBleHRlcm4uCi0KLUZyaSBPY3QgMTEgMTM6MDM6MDIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IE1vdmVkIEFMSUdOIG1hY3JvIHRvIGxpYmJmZC5oLiBSZW1vdmVkIGk5NjBfYWxpZ24uCi0JKiBsaWJiZmQuaDogTW92ZWQgQUxJR04gbWFjcm8gaGVyZS4KLQkqIGJvdXQuYyAoYl9vdXRfY2FsbGJhY2spOiBSZXBsYWNlIGk5NjBfYWxpZ24gYnkgYWxpZ25fcG93ZXIuCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogIEFkZGVkIGZpZWxkcyBwYWdlX3NpemUsCi0Jc2VnbWVudF9zaXplIGFuZCBleGVjX2J5dGVzX3NpemUuICBUaGVzZSBoZWxwIGdlbmVyaWMgY29kZQotCShpbiBhb3V0eC5oIGFuZCBsaWJhb3V0LmgpIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdG8gYWxpZ24KLQl0aGUgdmFyaW91cyBzZWdtZW50cyBpbiBhIGRlbWFuZCBwYWdlZCBmaWxlLgotCSogbGliYW91dC5oIChXUklURV9IRUFERVIpOiAgVXNlIG5ldyAoc3RydWN0IGFvdXRkYXRhKSBmaWVsZHMKLQl0byBkZWNpZGUgaWYgdGhlIGV4ZWMgaGVhZGVyIGNvdW50cyBpbiBhX3RleHQgKHRleHQgc2VnbWVudCBzaXplKS4KLQlBbHNvLCBhc3N1bWUgRF9QQUdFRCBmbGFnIGlzIHNldDsgZG9uJ3Qgc2V0IGl0IGhlcmUuCi0JKiBib3V0LmMgKGJfb3V0X2NhbGxiYWNrKTogQWRkIGluaXRpYWxpemF0aW9uIG9mCi0JYWRhdGEgZmllbGRzIHBhZ2Vfc2l6ZSwgc2VnbWVudF9zaXplLCBhbmQgZXhlY19ieXRlc19zaXplLgotCSogaG9zdC1hb3V0LmMgKE5BTUUoaG9zdF9hb3V0LCBjYWxsYmFjaykgYW5kCi0JTkFNRShob3N0X2FvdXQsbWtvYmplY3QpOiBEaXR0by4KLQkqIGkzODZhb3V0LmMgKGFvdXQzODZfY2FsbGJhY2spIGFuZCBuZXcgYW91dDM4Nl9ta29iamVjdCk6IERpdHRvLgotCSogbmV3b3MzLmMgKG5ld3NvczNfY2FsbGJhY2spIGFuZCBuZXcgbmV3c29zX21rb2JqZWN0KTogRGl0dG8uCi0JKiBhb3V0ZjEuYyAoc3Vub3M0X2NhbGxiYWNrKSBhbmQgbmV3IHN1bm9zX21rb2JqZWN0KTogRGl0dG8uCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IERvbid0IHN1YnRyYWN0Ci0JRVhFQ19CWVRFU19TSVpFIGZyb20gdGhlIGFfdGVzdCBzaXplOyB0aGlzIGlzIG9ubHkgYXBwcm9wcmlhdGUKLQlmb3Igc29tZSBzeXN0ZW1zIChtYWlubHkgc3Vub3MpLCBzbyBkbyBpdCBpbiB0aGUgY2FsbGJhY2sgaW5zdGVhZC4KLQlTYW1lIHJvdXRpbmU6IEFkZCBzdHVmZiB0byB0aGUgVEhJU19JU19PTkxZX0RPQ1VNRU5UQVRJT04gY29tbWVudC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSB0aGUgd2F5Ci0JZmlsZXBvcyBhbmQgc2l6ZSBvZiBzZWN0aW9ucyBhcmUgY2FycmllZCBvdXQgdG8gc3VwcG9ydAotCW9sZGVyIHN0eWxlcyBvZiBkZW1hbmQgcGFnZWQgZXhlY3V0YWJsZXMuCi0KLQotRnJpIE9jdCAxMSAxMjozMzozNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiBBZGRlZCBtb3JlIG1hY3JvcyB0byBDT0ZGX1NXQVBfVEFCTEUuCi0JKiBiZmQuYzogQWRkZWQgbWFjcm9zIHRvIGVuYWJsZSBnYXMgdG8gc3dhcCBjb2ZmIHJlY29yZHMuCi0JKiBjb2ZmY29kZS5oOiBNYWtlIHRoZSBjb2ZmX3N3YXBfKl9vdXQgcm91dGluZXMgcmV0dXJuIHRoZSBudW1iZXIKLQlvZiBieXRlcyBzd2FwcGVkLCBhbmQgY2xlYW5lZCB1cCB0aGVpciBwcm90b3R5cGVzLgotCSogY29uZmlndXJlLmluOiBBZGRlZCBlYm1vbi9jb2ZmIHN1cHBvcnQKLQkqIGVjb2ZmLmM6IENoYW5nZWQgbnVsbCBkZWZpbml0aW9ucyBvZiBjb2ZmX3N3YXBfKl9vdXQgdG8gY29uZm9ybQotCXRvIG5ldyBwcm90b3R5cGVzCi0JKiB0YXJnZXRzLmM6IEFkZGVkIG5ldyBlbnRyeSBwb2ludHMgZm9yIGNvZmYgc3dhcHBpbmcKLQotRnJpIE9jdCAxMSAwMzowMTo1MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJlc3RydWN0dXJlIGNvbmZpZ3VyYXRpb24gc2NoZW1lIGZvciBiZmQsIGJpbnV0aWxzLCBsZC4KLQotCSogaW5jbHVkZS9zeXMvaC0qLmg6ICBNb3ZlIHRvIGJmZC9ob3N0cy9oLSouaC4KLQkqIGNvbmZpZ3VyZS5pbjogIFJldmlzZSB0byBzeW1saW5rIHN5c2RlcC5oIHRvIGhvc3RzL2gteHh4LmguCi0JQ2hhbmdlIHNvbWUgY29uZmlnIG5hbWVzIHRvIG1hdGNoIG90aGVyIGRpcnMuCi0JKiAqLmM6ICBJbmNsdWRlIGJmZC5oIGJlZm9yZSBzeXNkZXAuaCwgc28gYW5zaWRlY2wgYW5kIFBST1RPKCkKLQlnZXQgZGVmaW5lZCBmaXJzdC4KLQkqIE1ha2VmaWxlLmluOiAgVXNlIC1JLiB0byBnZXQgc3lzZGVwLmguICBSZW1vdmUgcmVmcyB0bwotCS4uL2luY2x1ZGUvc3lzZGVwLmguCi0JKiBjcHUtaTk2MC5jOiAgU3RybmNtcCBuZWVkZWQgYSBsZW5ndGggYXJnLgotCSogZWNvZmYuYzogIERvbid0IGV2ZXIgY2FsbCB0cmFkX3VuaXhfY29yZV9maWxlX3AgZnJvbSBoZXJlLgotCSogaTM4NmFvdXQuYzogIFJlbW92ZSBkZWFkIE5fVFhUT0ZGIG92ZXJyaWRlLgotCSogdHJhZC1jb3JlLmM6ICBEb24ndCBkaXNhYmxlIHRoZSB3aG9sZSBmaWxlIGlmIFNVTjRfU1lTLgotCSogY29uZmlnLzogIFJlbmFtZSBzb21lIGNvbmZpZyBmaWxlcyB0byBtYXRjaCB1cCBoLSouaCBuYW1lcy4KLQlSZW1vdmUgYWxsIHRoZSBIT1NUX1NZUyBkZWZpbml0aW9ucyBmcm9tIHRoZSBjb25maWcgZmlsZXMuCi0JKiBob3N0cy9oLWFtaXguaCwgaC1pMzg2di5oOiAgRGVmaW5lIFBPU0lYX1VUSU1FLCBub3QgVVNHLgotCSogaG9zdHMvaC1ocDkwMDAuaDogIFJlbW92ZSBVU0cgY29tbWVudC4KLQkqIGhvc3RzL2gtcnM2MDAwLmg6ICBJbmNsdWRlIDxzdGRsaWIuaD4gZm9yIG1hbGxvYy4KLQkqIGhvc3RzL2gtbmV3cy5oLCBoLXNwYXJjLTY0Lmg6ICBOZXcgY29uZmlnIGZpbGVzIHRoYXQgaGFkCi0JcHJldmlvdXNseSBiZWVuIGtsdWRnZWQgaW4gdGhlIDxzeXNkZXAuaD4gZmlsZS4KLQotVGh1IE9jdCAxMCAxNzo1NDowOCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLyo6ICB0cmFkLWNvcmUgc3VwcG9ydCBpcyBIT1NUIGRlcGVuZGVudCwgbm90IHRhcmdldAotCWRlcGVuZGVudC4gIFRhcmdldCBjb25maWcgZmlsZXMgb25seSBzZXQgREVGQVVMVF9WRUNUT1IgYW5kL29yCi0Jb3RoZXIgdmVjdG9yIGVsZW1lbnRzLiAgRXhjZXB0aW9uOiAgd2hlbiBob3N0LWFvdXQuYyBpcyBpbiB1c2UsCi0JaW4gd2hpY2ggY2FzZSB3ZSdyZSBmb3JjZWQgdG8gYXNzdW1lIHdlJ3JlIG5hdGl2ZSAoaHAsIHZheCwKLQl0YWhvZSkuICBSZW5hbWUgWERFUEZJTEVTIHRvIEhERVBGSUxFUy4KLQkqIE1ha2VmaWxlLmluOiAgUmVuYW1lIFhERVBGSUxFUy4KLQkqIGNvbmZpZy9oLXN1bio6ICBEb24ndCBmb3JjZSBzdGF0aWMgbGlua2luZy4KLQkqIHRyYWQtY29yZS5jOiAgRG9jdW1lbnQgaG93IHRvIHVzZSBpdCBub3dhZGF5cy4KLQkqIGkzODZhb3V0LmMsIG5ld3NvczMuYzogIENsZWFuIHVwLgotCSogaTM4NmNvZmYuYzogIEFsbG93IDM4NiBjb2ZmIGZpbGVzIHRvIGJlIHVzZWQgYXMgY29yZSBmaWxlcyB0b28KLQkoZm9yIHJlYWRpbmcgY29yZSBmaWxlcyBmcm9tIGVtYmVkZGVkIHN5c3RlbXMpLgotCi1UdWUgT2N0ICA4IDE1OjMwOjM5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBBZGQgaTM4NmFvdXQuYyBmb3IgYS5vdXQgc3VwcG9ydCBvbiB0aGUgaTM4Ni4KLQotVHVlIE9jdCAgOCAxMjoxODo1NCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiByZWxvYy5jLCBzZWN0aW9uLmMsIHN5bXMuYywgdGFyZ2V0cy5jOiBjb3JyZWN0IGluZm8tbm9kZQotCXN0cnVjdHVyZSBpbiAqZG9jKiBjb21tZW50cy4KLQlkb2MvTWFrZWZpbGU6IHN0b3AgaGlkaW5nIGNvbXBsYWludHMgZnJvbSBtYWtlaW5mby4KLQotU3VuIE9jdCAgNiAxOToxMDowNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoLi4uc29tZV9hb3V0X29iamVjdF9wKTogIFRha2UgYSB0aGlyZCBwYXJhbWV0ZXIsCi0JdGhlIGludGVybmFsX2V4ZWMgc3RydWN0LCBhbmQgYXZvaWQgZXZlciBsb29raW5nIGF0IGFuCi0JZXh0ZXJuYWxfZXhlYy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQgdG8gcmVhZCB0aGUgZW50aXJlCi0JZXh0ZXJuYWxfZXhlYyBzdHJ1Y3QsIHN3YXAgYW5kIGNoZWNrIGl0cyBtYWdpYyBudW1iZXIsCi0Jc3dhcCBpbiB0aGUgd2hvbGUgc3RydWN0dXJlLCBhbmQgcGFzcyB0aGUgc3dhcHBlZC1pbiB2ZXJzaW9uIHRvCi0Jc29tZV9hb3V0X29iamVjdF9wLgotCSogYm91dC5jOiAgQnJpbmcgaW50byBtb2Rlcm4gZXJhLiAgVXNlIHNpbmdsZSBfb2JqZWN0X3Agcm91dGluZQotCWZvciBiaWctIGFhbmQgbGl0dGxlLWVuZGlhbi4gIFByb3ZpZGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsCi0JZXhlYyBoZWFkZXIgc3RydWN0cy4gIFVzZSBzZXBhcmF0ZSBzd2FwLWluIGFuZCBzd2FwLW91dCByb3V0aW5lcy4KLQotCSogbGliYW91dC5oOiAgTW92ZSBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBmcm9tIC4uL2luY2x1ZGUvYW91dDY0LmgKLQl0byBoZXJlLiAgQWRkIG9ial9zeW1ib2xfZW50cnlfc2l6ZSB0byBzdHJ1Y3QgYW91dGRhdGEuCi0JKiBhb3V0eC5oICguLi5zb21lX2FvdXRfb2JqZWN0X3ApOiAgU2V0IG9ial9zeW1ib2xfZW50cnlfc2l6ZS4KLQotCSogLi4vaW5jbHVkZS9hb3V0NjQuaDogIENoYW5nZSBFWFRFUk5BTF9MSVNUX1NJWkUgdG8KLQlFWFRFUk5BTF9OTElTVF9TSVpFLiAgQ2FsbGVycyBjaGFuZ2VkLgotCi1GcmkgT2N0ICA0IDE4OjE4OjQ2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuYzogIFJlbW92ZSBzdHJlcnJvcigpIHRvIGxpYmliZXJ0eS4KLQotCSogZWxmLmM6ICBSZW1vdmUgZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzLCB1c2UgZ2VuZXJpYyBvbmUuICBMaW50LgotCSogbGliYmZkLWluLmgsIGxpYmJmZC5jOiAgQWRkIGJmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzLgotCSogbGliYmZkLmMgKGJmZF9nZW5lcmljX3tnZXQsc2V0fV9zZWN0aW9uX2NvbnRlbnRzKTogIENoZWNrIHRoYXQKLQlsYXN0IGJ5dGUgb2YgdHJhbnNmZXIsIG5vdCBmaXJzdCBieXRlLCBpcyB3aXRoaW4gdGhlIHNlY3Rpb24uCi0KLQkqIGhvc3QtYW91dC5jOiAgUmVtb3ZlIGBCU0QnIGFyY2hpdmUgc3VwcG9ydC4gIExpbnQuCi0KLQkqIGFyY2h1cmVzLmM6IFJlbmFtZSBgc3RydWN0IGJmZF9hcmNoX2luZm9fc3RydWN0JyB0byBgc3RydWN0Ci0JYmZkX2FyY2hfaW5mbycuICBSZW5hbWUgYHR5cGVkZWYgYmZkX2FyY2hfaW5mb19zdHJ1Y3RfdHlwZScgdG8KLQlgYmZkX2FyY2hfaW5mb190eXBlJy4gIEFsbCB1c2VzIGNoYW5nZWQuCi0JKiByZWxvYy5jOiAgUmVuYW1lIGBiZmRfcmVsb2Nfc3RhdHVzX2VudW1fdHlwZScgdG8KLQlgYmZkX3JlbG9jX3N0YXR1c190eXBlJy4gIFJlbmFtZSBgYmZkX3JlbG9jX2NvZGVfZW51bV9yZWFsX3R5cGUnCi0JdG8gYGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZScuICAoVGhpcyBzZWVtcyB0byBiZSBhIG1pc25vbWVyLAotCWl0IG5lZWRzIGEgYmV0dGVyIG5hbWUuKSAgQWxsIHVzZXMgY2hhbmdlZC4KLQkqIHRhcmdldHMuYzogIFJlbmFtZSBgZW51bSB0YXJnZXRfZmxhdm91cl9lbnVtJyB0byBgZW51bQotCXRhcmdldF9mbGF2b3VyJywgYW5kIHJlbW92ZSB0aGUgYF9lbnVtJyBmcm9tIGFsbCBvZiB0aGUgZW51bQotCXZhbHVlcyB0aGVtc2VsdmVzLiAgQWxsIHVzZXMgY2hhbmdlZC4KLQotCSogY29uZmlndXJlLmluLCBjb25maWcvaC1pMzg2bWFjaDogIGkzODYgbWFjaCBob3N0LgotCSogY29uZmlnL3QtaTM4Ni1hb3V0OiAgVXNlIGhvc3QtYW91dC5jLgotCi0JKiB0cmFkLWNvcmUuYzogIEdpdmUgaXQgaXRzIG93biB4dmVjJ3MgdG8gbWFrZSBpdCBpbmRlcGVuZGVudAotCW9mIG90aGVyIGZpbGUgZm9ybWF0cy4KLQkqIGVjb2ZmLmMsIGhvc3QtYW91dC5jOiAgUmVtb3ZlIHJlZnMgdG8gdHJhZC1jb3JlLgotCSogY29uZmlnL3QtZGVjMzEwMCwgdC1ocDMwMGJzZCwgdC10YWhvZSwgdC12YXg6ICBEZWZpbmUgVFJBRF9DT1JFLgotCSogdGFyZ2V0cy5jOiAgI2lmZGVmIFRSQURfQ09SRSwgaW5jbHVkZSBpdCBpbiB0aGUgdmVjdG9yLgotCi1GcmkgT2N0ICA0IDE3OjM4OjAzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYzogRXh0ZW5kZWQgTkVXSE9XVE8gbWFjcm8KLQkqIGllZWUuYzogQ2hhbmdlZCB0aGUgd2F5IDhiaXQgcGNyZWwgaXMgZG9uZQotCSogY3B1LWg4MzAwLmM6IGdvdCB0aGUgcmVnaXN0ZXJzIGluIHRoZSByaWdodCBvcmRlcgotCi1UaHUgT2N0ICAzIDE5OjM5OjU1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogIGVudW0gYm9vbGVhbiA9PiBlbnVtIGJmZF9ib29sZWFuIGZvciBTVlI0LiAgR3VtYnkncwotCXByZWRpY3Rpb24gaXMgdmluZGljYXRlZCEKLQotCSogYmZkLWluLmgsIGxpYmJmZC1pbi5oLCBkb2MvTWFrZWZpbGUsIGRvYy90b2xpYmJmZCwgZG9jL2ludG9iZmQ6Ci0JUmVtb3ZlIHJlZnMgdG8gaG93dG8uYywgc2luY2UgU3RldmUgZm9yZ290LgotCi1UaHUgT2N0ICAzIDA3OjQ5OjIxIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6IHRvb2sgdGhlIGFib3J0IG91dCBvZiBzZXRfYXJjaF9tYWNoIHNvIHRoYXQgb2JqZHVtcCAtaSB3aWxsCi0Jc3RpbGwgd29yay4gTm93IGFsbG93cyBhbnkgYXJjaGl0ZWN0dXJlL21hY2hpbmUgdG8gYmUgc2V0LgotCi1XZWQgT2N0ICAyIDEzOjUwOjM1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG93dG8uYyBkZWxldGVkIGFuZCBtb3ZlZCBjb2RlIHRvIHJlbG9jLmMKLQotCSogbGliYmZkLmgsIGxpYmJmZC1pbi5oIHJlbW92ZWQgJGlkIHN0dWZmIGZvciByZWFsCi0KLQkqIGNwdS1oODMwMC5jIE1hZGUgaXQgbWF0Y2ggdmFyaW91cyBkaWZmZXJlbnQgc3BlbGxpbmdzIG9mIGg4MzAwLgotCi0JKiBhcmNodXJlcy5jOiBUb29rIG91dCB0aGUgZmlyc3QgY2hhciBmaWx0ZXIgd2hpY2ggbWFkZSBpdCBvbmx5Ci0JbG9vayBmb3IgYSBjcHUvYXJjaCBtYXRjaCB3aGVuIHRoZSBmaXJzdCBjaGFycyBvZiBzdXBwbGllZCBhbmQKLQl0ZXN0ZWQgbmFtZXMgd2VyZSB0aGUgc2FtZS4KLQotCSogdGFyZ2V0cy5jIHJlbW92ZWQgb2FzeXMgc3R1ZmYsIHBlbmRpbmcgc29tZW9uZSB0byBmaXggdGhlIGJ1Z3MKLQlpbiBpdC4KLQotCi1UdWUgT2N0ICAxIDEyOjI5OjQ0IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCB0YXJnZXRzLmMsIGVsZi5jOiAgQWRkIHByZWxpbWluYXJ5Ci0JRUxGIHN1cHBvcnQgZ29vZCBlbm91Z2ggZm9yIEdEQi4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL2gtYW1peCwgY29uZmlnL3QtbTY4ay1lbGY6ICBIYW5kbGUKLQltNjhrLWNibS1zdnI0IGhvc3QgYW5kIHRhcmdldC4KLQkqIGNvbmZpZy90LW02OGstY29mZiwgdC1tODhrLWNvZmYsIHQtbTg4ay1hb3V0OiAgTWFrZSBmaWxlcyBub25lbXB0eQotCXNvIGBkaWZmJyBhbmQgYHBhdGNoJyBjYW4gY29wZS4KLQotVHVlIE9jdCAgMSAxMToyNDozMSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmM6IHJlbW92ZWQgdGV4aW5mbyBlcnJvcgotCi0JKiBpbml0LmM6IGFkZGVkIHRleGluZm8gaG9va3MsIGFuZCByZW1vdmVkIGluaXRpYWxpemF0aW9uIGVycm9yCi0JbWVzc2FnZS4KLQotCSogbGliY29mZi1pbi5oLCBsaWJiZmQtaW4uaCByZW1vdmVkICRpZCBmaWVsZCBzbyBjdnMgY2FuIG1lcmdlCi0Jd2l0aG91dCBjb21wbGFpbnRzLgotCi1UdWUgT2N0ICAxIDA1OjAyOjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjcHUtaTk2MC5jOiAgQXZvaWQgbnVtZXJpY2FsIGNvdW50IG9mIGluaXRpYWxpemVycy4KLQotCVZheCBVbHRyaXggY2hhbmdlcyBmcm9tIERhdmlkIFRheWxvciA8dGF5bG9yQHRoaW5rLmNvbT46Ci0JKiBob3N0LWFvdXQuYzogIE1ha2UgbGl0dGxlLWVuZGlhbiB2ZWN0b3IgcmVhbGx5IGxpdHRsZS1lbmRpYW4uCi0JKiBjb25maWd1cmUuaW46ICBTZXBhcmF0ZSB2YXggYW5kIHRhaG9lIGNhc2VzLCBoYW5kbGUgdWx0cml4LgotCSogY29uZmlnL3QtdmF4OiAgQWRkIHRyYWQtY29yZS5vLgotCSogY29uZmlnL2gtdmF4dWx0OiAgTmV3IGhvc3Qgc3lzdGVtLgotCi1Nb24gU2VwIDMwIDE1OjEzOjQ2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggVkVSU0lPTiwgY2hhbmdlIHZlcnNpb24gbnVtYmVyIHRvIDAuMTgsIHRoaXMgbWFrZXMgYQotCWdhcCwgYnV0IG5vdyBpcyB0aGUgc2FtZSBhcyB0aGUgbGlua2VyIHZlcnNpb24gbnVtYmVyLgotCi0JKiBjcHUtYTI5ay5jLCBjcHUtaTM4Ni5jLCBjcHUtbTY4ay5jLCBjcHUtbWlwcy5jLCBjcHUtdmF4LmMsCi0JY3B1LWg4MzAwLmMsIGNwdS1pOTYwLmMsIGNwdS1tODhrLmMsIGNwdS1zcGFyYy5jOiBhZGRlZC4gVGhlc2UKLQlmaWxlcyB3aWxsIGV2ZW50dWFsbHkgY29udGFpbiBwcm9jZXNzb3Igc3BlY2lmaWMgYml0cyBmb3IgYmZkLAotCWxpa2Ugc3RyYW5nZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGFuZCBkaXMvYXNzZW1ibHkuICBTbyBmYXIgb25seQotCXRoZSBIOCBoYXMgYmVlbiBldmVuIHBhcnRpYWxseSBkb25lLiAgVGhpcyB3b3JrIGFsc28gdGllcyBpbiB3aXRoCi0JdGhlIGNoYW5nZSBpbiBoYW5kbGluZyBhcmNoaXRlY3R1cmVzLgotCi0JKiBhbWRjb2ZmLmM6IChhMjlrX3JlbG9jKSBmaXggZXJyb3IgbWVzc2FnZS4KLQotCSogYW91dC1mMS5oOiAoY2hvb3NlX3JlbG9jX3NpemUpIG5vdyBjYWxscyBiZmRfZ2V0X2FyY2ggdG8KLQlkaXNjb3ZlciB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBiZmQuIChzdW5vczRfY2FsbGJhY2spIGNhbGxzIHRoZQotCWZ1bmN0aW9uIGJmZF9zZXRfYXJjaF9tYWNoIHJhdGhlciB0aGFuIHN0dWZmaW5nIHN0dWZmIGRpcmVjdGx5Ci0JaW50byB0aGUgYmZkLiAoc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyksIGNoYW5nZWQgbmFtZXMgb2YKLQlhY2Nlc3NvciBmdW5jdGlvbnMuCi0KLQkqIGFvdXR4Lmg6IChzZXRfYXJjaF9tYWNoKSBub3cgY2FsbHMgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCB0bwotCXNldHVwIHRoZSBlbnZpcm9ubWVudC4KLQotCSogYXJjaGl2ZS5jOiAoYmZkX3NsdXJwX2NvZmZfYXJtYXApIGNvZmYgYXJjaGl2ZXMgYWx3YXlzIGhhdmUgdGhlCi0JaGVhZGVycyBpbiBiaWcgZW5kaWFuIGZvcm1hdCwgcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZQotCWhvc3Qgb3IgdGFyZ2V0LgotCi0JKiBhcmNodXJlcy5jOiB0b3RhbGx5IGNoYW5nZWQuIE5vdyBhbiBhcmNoaXRlY3R1cmUgaXMgcmVwcmVzZW50ZWQKLQl3aXRoIGEgcG9pbnRlciB0byBhbiBpbmZvIHN0cnVjdHVyZSByYXRoZXIgdGhhbiBhbiBlbnVtZXJhdGVkIHR5cGUKLQlhbmQgYSBsb25nLiBUaGUgb2xkIGluZm8gaXMgYXZhaWxhYmxlIGFzIHR3byBlbGVtZW50cyBpbiB0aGUKLQlzdHJ1Y3R1cmUuICBGdXR1cmUgZW5oYW5jZW1lbnRzIHRvIGFyY2hpdGVjdXJlIHN1cHBvcnQgd2lsbAotCWludm9sdmUgcG9pbnRlcnMgdG8gbWV0aG9kcyBiZWluZyBwbGFjZWQgaW50byB0aGUgaW5mbyBzdHJ1Y3R1cmUuCi0KLQkqIGJmZC5jOiBjaGFuZ2VkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBiZmQgc3RydWN0dXJlIGZvciB0aGUgbmV3Ci0JYXJjaGl0ZWN0dXJlIHN0dWZmLgotCi0JKiBib3V0LmM6IChiX291dF9zZXRfYXJjaF9tYWNoKSBjaGFuZ2VkIHRvIHVzZSB0aGUgbmV3Ci0JYXJjaGl0ZWN0dXJlIG1lY2hhbmlzbS4KLQotCSogY29mZmNvZGUuaDogKGNvZmZfc2V0X2FyY2hfbWFjaCwgY29mZl9zZXRfZmxhZ3MpIGNoYW5nZWQgdG8gdXNlCi0JdGhlIG5ldyBhcmNoaXRlY3R1cmUgbWVjaGFuaXNtLgotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIGg4IHN0dWZmLgotCi0JKiBpZWVlLmM6IHRvbyBtYW55IGNoYW5nZXMgdG8gbm90ZS4gIE5vdyBpZWVlIGZpbGVzIHdyaXR0ZW4gd2l0aAotCWJmZCBnYXMgYW5kIGxkIGNhbiBiZSByZWFkIGJ5IGdsZCBhbmQgaWVlZSBvbmx5IGxpbmtlcnMgYW5kCi0Jc2ltdWxhdG9ycy4KLQotCSogbGliYmZkLmMsIGxpYmJmZC5oOiBjaGFuZ2VkIHByb3RvdHlwZSBvZiBiZmRfd3JpdGUuCi0KLQkqIG5ld3NvczMuYzogKG5ld29zM19jYWxsYmFjaykgbm93IGNhbGxzIGJmZF9zZXRfYXJjaF9tYWNoIHJhdGhlcgotCXRoYW4gZml4aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkuCi0KLQkqIG9hc3lzLmM6IChvYXN5c19vYmplY3RfcCkgbm93IGNhbGxzIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggcmF0aGVyCi0JdGhhbiBmaXhpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseS4KLQotCSogb3BuY2xzLmM6IChuZXdfYmZkKSBtYWtlcyBzdXJlIHRoYXQgYmZkX2luaXQgaGFzIGJlZW4gY2FsbGVkCi0JYmVmb3JlIG9wZW5pbmcgYSBiZmQuCi0KLQkqIHNyZWMuYzogKHNyZWNfc2V0X2FyY2hfbWFjaCkgbm93IGNhbGxzIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLQlyYXRoZXIgdGhhbiBmaXhpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseS4KLQotCSogdGFyZ2V0cy5jOiAodGFyZ2V0X3ZlY3Rvcikgbm93IGJ5IGRlZmluaW5nIFNFTEVDVF9WRUNTIChwZXJoYXBzCi0JaW4gdGhlIHQvaG1ha2UgZmlsZSkgYSB1c2VyIGNhbiBzZWxlY3Qgd2hpY2ggYmFja2VuZHMgdGhleSB3YW50Ci0JbGlua2VkIHdpdGggYmZkIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNvdXJjZS4KLQotCSogaW5pdC5jOiBuZXcsIGxvb2tzIGFmdGVyIGluaXRpYWxpemluZyBtb2R1bGVzLgotCi0JKiBob3d0by5jOiBmb3IgZnV0dXJlIHVzZSwgd2lsbCBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byB3b3JrIG91dAotCXdoYXQgY29va2llIHRvIHVzZSBhcyBhIGhhbmRsZSBvbiBhIHJlbGNvYXRpbyBob3d0by4KLQotTW9uIFNlcCAzMCAxMzozMToxNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jOiAgQmV0dGVyIGVycm9yIGNoZWNraW5nLCBwYXJ0bHkgZnJvbSBQZXRlciBTY2hhdWVyLgotCShzcmVjX29iamVjdF9wKTogIEF2b2lkIGFzc3VtaW5nIGFueSBmaWxlIHRoYXQgc3RhcnRzIHdpdGggJ1MnIGlzCi0JYW4gUy1yZWNvcmQgZmlsZSEgIChDaGVjayBmb3IgMyB1cHBlcmNhc2UtaGV4IGRpZ2l0cyBhZnRlciBpdC4pCi0JKElTSEVYKTogIERlZmluZSBuZXcgbWFjcm8gZm9yIGNoZWNraW5nIHN1cHBvc2VkbHkgaGV4IGNoYXJhY3RlcnMuCi0JKHBhc3Nfb3Zlcik6ICBUcmVhdCBhcyBFT0YgYW55IFMtcmVjb3JkIGxpbmUgdGhhdDoKLQkgICAgKiAgZG9lc24ndCBoYXZlIGhleCBpbiBlaXRoZXIgc2l6ZSBjaGFyYWN0ZXIKLQkgICAgKiAgcHJvZHVjZXMgYSBzaXplIGxhcmdlciB0aGFuIDB4N0YKLQkgICAgKiAgaGFzIGFuIHVucmVjb2duaXplZCB0eXBlIG51bWJlcgotCi1UaHUgU2VwIDI2IDE1OjI3OjI5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCwgYW91dHguaCwgYm91dC5jLCBjb2ZmY29kZS5oLCBob3N0LWFvdXQuYywgb2FzeXMuYywKLQlvcG5jbHMuYzogIExpbnQgKHNhYmVyIGFjdHVhbGx5KS4KLQotVGh1IFNlcCAyNiAxMToyNDoyNCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChXUklURV9IRUFERVJTKTogU2V0IGhlYWRlcidzIGFfdGV4dCBmaWVsZCBhbHdheXMuCi0JKiBuZXdzb3MzLmM6IEZpeGVkIHR3byB0eXBlczogbmV3b3MzIC0+IG5ld3NvczMuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRml4IHBjLXJlbGF0aXZlIHJlbG9jYXRpb24KLQl0byB1c2UgY29ycmVjdCBzZWdtZW50LgotCi1Nb24gU2VwIDIzIDE4OjI0OjM0IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChwcmludF9zeW1ib2wpOiAgSGFuZGxlIG1pc3Npbmcgc3ltYm9sLT5uYW1lLgotCi1GcmkgU2VwIDIwIDEyOjI2OjAxIDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzd2FwY29yZV9zcGFyYyk6ICBDaGFuZ2UgbmFtZSBvZiBVU1JTVEFDSywgZml4IGNvbW1lbnQKLQlhdCB0b3Agb2Ygcm91dGluZS4KLQotVHVlIFNlcCAxNyAxNzoyMzo0OSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBvYXN5cy5jLCBjb25maWd1cmUuaW4sIGNvbmZpZy9oLWlyaXgzLCBjb25maWcvdC1pcml4MzoKLQlhZGQgc2dpL2lyaXggc3VwcG9ydC4KLQotVGh1IFNlcCAxMiAxNDoyOTowOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIGZvciB0aGUgQU1EIDI5MDAwIFVsdHJhY29tcHV0ZXIgcG9ydCBmcm9tIERhdmlkIFdvb2QuCi0JKHdvb2RAbnl1LmVkdSkuCi0KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6ICBIYW5kbGUgTk9fRkNOVEwuCi0KLQkqIE1ha2VmaWxlLmluOiAgTWFrZSBzdWJkaXJzIHdvcmsgYnkgdXNpbmcgJChJTkNESVIpIGluIHRoZQotCWNydWRlIGRlcGVuZGVuY2llcy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9yZWFsX29iamVjdF9wKTogIFBhc3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JY3VycmVudCBmaWxlJ3MgY29mZiBzeW1ib2wgZm9ybWF0IHRvIEJGRCB2aWEgdGhlIGNvZmZfZGF0YSBzdHJ1Y3QuCi0JKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiAgb2JqX2ljb2YgPT4gY29mZl9kYXRhLgotCShjb2ZmX3N3YXBfc3ltX3tpbixvdXR9KTogIENoZWNrIHRoYXQgU1lNTk1MRU4gPT0gRV9TWU1OTUxFTi4KLQkoY29mZl9zd2FwX2F1eF97aW4sb3V0fSk6ICBDaGVjayB0aGF0IEZJTE5NTEVOID09IEVfRklMTk1MRU4KLQlhbmQgRElNTlVNID09IEVfRElNTlVNLgotCSogY29uZmlndXJlLmluOiAgSGFuZGxlIGEyOWstKi0qIGhvc3RzLCBhbmQgdGFyZ2V0cwotCWEyOWstKi1jb2ZmLCBhMjlrLSotYW91dCwgYW5kIGEyOWstKi1zeW0xLgotCSogbGliY29mZi1pbi5oOiAgQWRkIGxvY2FsX25fYnRtYXNrLCBsb2NhbF9uX2J0c2hmdCwKLQlsb2NhbF9uX3RtYXNrLCBsb2NhbF9uX3RzaGlmdCwgbG9jYWxfc3ltZXN6LCBsb2NhbF9hdXhlc3osCi0JbG9jYWxfbGluZXN6IHRvIGBjb2ZmX2RhdGEnICh0ZGF0YSkgc3RydWN0LgotCShjb2ZmX2RhdGEsIGNvZmZfZGF0YV90eXBlLCBjb2ZmX3RkYXRhKTogIFJlbmFtZSBzdHJ1Y3QgaWNvZmRhdGEuCi0JKiBjb25maWcvaC11bHRyYTM6ICBIYW5kbGUgYTI5ay0qLSogaG9zdHMgYXMgVWx0cmFjb21wdXRlcnMuCi0KLVRodSBTZXAgMTIgMTQ6MDc6MjIgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAkKE1BS0UpIGZvciBtYWtlLCAkKGRvY2RpcikgZm9yIGRvYwotCSogZG9jL01ha2VmaWxlOiByZWR1bmRhbnQgZGVwZW5kZW5jaWVzIGZvciBTdW4tbWFrZSBWUEFUSCBidWcKLQotVHVlIFNlcCAxMCAyMDozNDoxMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfY29yZV9maWxlX3ApOiAgUmVsZWFzZSB0aGUgcmlnaHQgc3RvcmFnZSBpbgotCWVycm9yIGNhc2UuCi0JKHN1bm9zNF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiAgRml4IGhlYWRlciBjb21wYXJpc29uLgotCSogYW91dHguaDogIEF2b2lkIHNoaWZ0cyBvZiAzMiBiaXRzLCB1bmRlZmluZWQgaW4gQy4gIExpbnQuCi0JKiBib3V0LmMsIGljb2ZmLmMsIGllZWUuYywgbGliYmZkLmMsIG9hc3lzLmM6ICBnY2MgLU8gLVcgbGludC4KLQotV2VkIFNlcCAgNCAwMDo0NDo1MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlBbGxvdyBHREIgdG8gcGF0Y2ggb2JqZWN0IGZpbGVzLgotCi0JKiBhb3V0ZjEuaCAoc3Vub3NfY29yZV9maWxlX3ApOiAgU2V0IFNFQ19IQVNfQ09OVEVOVFMgb24gYWxsIHNlY3Rpb25zLgotCSogdHJhZC1jb3JlLmggKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6ICBEaXR0by4KLQkqIGFvdXR4LmggKGFvdXRfc2V0X3NlY3Rpb25fY29udGVudHMpOiAgT24gZmlyc3Qgb3V0cHV0LCBjaGVjawotCWFiZmQtPmRpcmVjdGlvbiBhbmQgY29tcGxhaW4gaWYgZXJyb25lb3VzLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBjcnVkZSBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBTZXAgIDMgMTM6NDY6MTkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLyogYW91dHguaCBjb25maWd1cmUqIHNob3J0ZW5lZCBhbGwgdGhlIGgvdG1ha2UteHh4eAotCXRvIGgvdC14eHh4IGZpbGVzIHNvIHRoYXQgZXZlcnl0aGluZyB3aWxsIHdvcmsgb24gU3lzdGVtIFYuCi0KLUZyaSBBdWcgMjMgMTM6NTE6MDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oOiAgQWRkIGluZm9ybWF0aW9uIG9uIGhvc3QtYW91dC5jIGFuZCBob3cgdG8gY29uZmlndXJlCi0JdG8gdXNlIGl0LCB0byB0aGUgbWFudWFsLgotCSogY29uZmlndXJlLmluOiAgVGl4IHR5cG8uCi0JKiBlY29mZi5jOiAgSWYgY29tcGlsaW5nIGZvciBERUMzMTAwLCB1c2UgdHJhZF91bml4IGNvcmUgZmlsZXMsCi0JZWxzZSBkdW1teSBvdXQgdGhlIGNvcmUgZmlsZSBzdXBwb3J0LgotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6ICBJZiBIT1NUX0RBVEFfU1RBUlRfQUREUiBpcwotCXNwZWNpZmllZCwgdXNlIGl0IHRvIGxvY2F0ZSB0aGUgZGF0YSBzZWN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9zeW1ib2xzKTogIERlY2xhcmUgYnVmZmVyIGFzIGJmZF9ieXRlcwotCXJhdGhlciB0aGFuIGFzIGNoYXJzIChsaW50KS4KLQotVGh1IEF1ZyAyMiAyMjoyMDoxOSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCwgY29mZmNvZGUuaDogIHNhYmVyaXplZC4KLQotVGh1IEF1ZyAyMiAxMToyNzowNiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IHNvbWUgY2xlYW51cCwgcmVpbmNvcnBvcmF0ZWQgbW9yZSBpbnRybyBtYXR0ZXIgZnJvbQotCWJmZC5kb2MKLQliZmQuYywgdGFyZ2V0cy5jOiBtaW5vciByZXdvcmRpbmcgb2YgZG9jIHNlZ21lbnRzCi0KLQotV2VkIEF1ZyAyMSAxOToxMzoyMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiAgVXNlIEhPU1RfVEVYVF9TVEFSVF9BRERSLAotCWV0YywgcmF0aGVyIHRoYW4gVEVYVF9TVEFSVF9BRERSLgotCSogaG9zdC1hb3V0LmM6ICBSZW1vdmUgI2lmIDAgYXJvdW5kIHdob2xlIHRoaW5nLgotCVVwZGF0ZSB0byBtb2Rlcm4gKDMyLzY0LWJpdCkgYS5vdXQgbmFtaW5nIGNvbnZlbnRpb25zLgotCUluY2x1ZGUgYSBsYXJnZSBjaHVuayBvZiAuLi9pbmNsdWRlL2Eub3V0LmdudS5oIHRvIGdldCBtYWNyb3MgdGhhdAotCWFyZSBub3QgZGVmaW5lZCBieSB0aGUgc3lzdGVtIGluY2x1ZGUgZmlsZXMuCi0JKGhvc3RfYW91dF97MzIsNjR9X3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBVc2UgdGhlIFdSSVRFX0hFQURFUlMKLQltYWNybyB1c2VkIGJ5IHRoZSBvdGhlciBhLm91dCBpbXBsZW1lbnRhdGlvbnMuCi0JKiBNYWtlZmlsZS5pbjogIEdpdmUgZGVwZW5kZW5jaWVzIHRvIE9QVElPTkFMX0JBQ0tFTkRTLgotCi1XZWQgQXVnIDIxIDE0OjMzOjA2IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogdXNlIHRhcmdldHMgImJmZC5kdmkiIGFuZCAiYmZkLnBzIiBpbnN0ZWFkIG9mCi0JdGV4ZG9jIGFuZCBwc2RvYzsgbWFrZSB0aGVzZSBkZXBlbmQgb24gZ2VuZXJhdGVkIC50ZXhpJ3MKLQotCSogc2Nhbml0LCAobmV3KSB1blBST1RPOiB0dXJuIFBST1RPIG1hY3JvcyBpbnRvIEFOU0kgZGVjbGFyYXRpb25zIGluCi0JZG9jCi0KLQkqIGJmZC5jLCByZWxvYy5jLCBzeW1zLmM6IG1pbm9yIHNwZWxsaW5nL3dvcmRpbmcgZml4ZXMgaW4gZG9jCi0JcG9ydGlvbnMKLQotCSogTWFrZWZpbGUuaW4sIGF3a3NjYW4taXAsIGF3a3NjYW4tcCwgaW50b2JmZCwKLQlsaWJiZmQuaCwgbGliY29mZi5oLCB0b2xpYmNvZmY7IG5ldyBiZmQtaW4uaCwgbGliYmZkLWluLmgsCi0JbGliY29mZi1pbi5oOiAoYSkgdXNlIHNlcGFyYXRlIGZpbGVzIGZvciBpbnZhcmlhbnQgcGFydHMgb2YgYmZkLmgsCi0JbGliYmZkLmgsIGFuZCBsaWJjb2ZmLmg7IChiKSBpbiBnZW5lcmF0ZWQgcGFydHMgb2Ygc2FtZSwgdXNlIGxlc3MKLQlvYnRydXNpdmUgbWFya3MgaW5kaWNhdGluZyAuYyBvcmlnaW5zLgotCi0JKiBiZmQudGV4aW5mbzogZ2VuZXJhbGl6ZSBtb3N0IHJlZmVyZW5jZXMgdG8gbGlua2VyCi0KLVR1ZSBBdWcgMjAgMTU6MTg6MDIgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbmNsdWRlIGNvcmUucCBpbiBQUk9UT1MgKGJ1aWxkaW5nIGJldHRlciBiZmQuaCkKLQkqIGFyY2h1cmVzLmM6IHJlbW92ZSBlbXB0eSBmb28oKSBkZWZpbml0aW9uIChjcmVwdCBpbiBhdCB2bjEuOSkKLQotTW9uIEF1ZyAxOSAxMzo0ODoyMiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IHVzZSBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb24gaW5zdGVhZCBvZiBsb3RzIG9mCi0JQHBhZ2UnczsgbWlub3IgcmVwaHJhc2luZyBpbiBJbnRyb2R1Y3Rpb24uCi0KLQkqIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgYmZkLmMsIGJmZC50ZXhpbmZvLCBjYWNoZS5jLAotCWNvZmZjb2RlLmgsIGNvcmUuYywgZm9ybWF0LmMsIGllZWUuYywgbGliYmZkLmMsIGxpYmJmZC5oLCBsaWJjb2ZmLmgsCi0Jb2FzeXMuYywgb3BuY2xzLmMsIHJlbG9jLmMsIHNlY3Rpb24uYywgc3ltcy5jLCB0YXJnZXRzLmMgKGRvY3VtZW50YXRpb24KLQlzZWdtZW50cyk6IHVzZWQgQkZEIChjYXBzKSBtb3JlIGNvbnNpc3RlbnRseSBhcyBhIG5hbWUgaW4KLQlkaXNjb3Vyc2UsIGZpeGVkIGEgZmV3IG90aGVyIG1pbm9yIHR5cG9zIGFuZCB1c2VzIG9mIGZvbnRzCi0KLQotVGh1IEF1ZyAgOCAxNjo0Nzo0MyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiBmaXhlZCBidWcgd2hlcmUgc3RyaW5nIHRhYmxlIHNpemUgd2Fzbid0IGJlaW5nIHN3YXBwZWQuCi0KLVRodSBBdWcgIDEgMTY6MzU6MjggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jOiBhZGRlZCBTRUNfQ09OU1RSVUNUT1JfVEVYVHxEQVRBfEJTUyBmbGFncwotCi0JKiBzeW1zLmM6IGFkZGVkIEJTRl9DT05TVFJVQ1RPUiwgQlNGX1dBUk5JTkcgYW5kIEJTRl9JTkRJUkVDVAotCWZsYWdzLiAoYmZkX3ByaW50X3N5bWJvbF92YW5kZikgbm93IGtub3dzIHdoYXQgdG8gZG8gd2l0aCB0aGUKLQlhYm92ZSBmbGFncy4KLQotCSogYW91dHguaDogbWFkZSB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzIGFuZAotCXRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzIHByb2R1Y2UgdGhlIGFib3ZlIGZsYWdzLgotCi0KLVdlZCBKdWwgMzEgMDk6NTM6NTIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhbGwgZmlsZXM6ICB1cGRhdGUgY29weXJpZ2h0IG5vdGljZXMgZm9yIEdQTCB2ZXJzaW9uIDIuCi0JSW5zdGFsbCBoZWFkZXIgY29tbWVudHMgYW5kIGF0dHJpYnV0ZSBtb3N0IG1vZHVsZXMgdG8gdGhlaXIKLQlhdXRob3JzLiAgQkZEJ3MgbmFtZSBpcyBub3cgb2ZmaWNpYWxseSAiQmluYXJ5IEZpbGUgRGVzY3JpcHRvciIsCi0Jc28gcmVtb3ZlIGFueSBjb25mbGljdGluZyBwZWpvcmF0aXZlcy4KLQlhcmNodXJlcy5oOiAgQ29uc2lzdHMgc29sZWx5IG9mIGNvbW1lbnRzOyByZW1vdmUgaXQuCi0KLUZyaSBKdWwgMjYgMTg6MTE6MzQgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGJmZC5jOiBNYWRlIGl0IGNvbXBpbGUgYWdhaW4uCi0KLUZyaSBKdWwgMTkgMDg6MTc6MDkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogbmV3c29zMy5jLCB0YXJnZXRzLmMsIGNvZmZjb2RlLmg6IG5ldyBwYXRjaGVzIGZyb20gRGF2aWQgV29vZAotCi0KLU1vbiBKdWwgMTUgMTY6Mjc6NDIgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggYXJjaGl2ZS5jIGJmZC5jIGNvZmZjb2RlLmggY29yZS5jIGVjb2ZmLmMgaWVlZS5jCi0JYmZkLnRleGluZm8gb2FzeXMuYyBvcG5jbHMuYyByZWxvYy5jIHNyZWMuYzogTW9yZSBkb2N1bWVudGF0aW9uIG9uCi0JbGludCBmaXhlcy4KLQotCSogYW1kY29mZi5jIGJmZC50ZXhpbmZvIE1ha2VmaWxlLmluIDogRm9sZGVkIGluIGNoYW5nZXMgZm9yIGFtZAotCTI5ayBjb2ZmIGJ5IERhdmlkIFdvb2QgKHdvb2RAbGFiLnVsdHJhLm55dS5lZHUpLgotCi1UaHUgSnVsICA0IDA5OjUzOjE2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIEV2ZXJ5dGhpbmc6IGNyZWF0ZWQgc29tZSBuZXcgZmlsZXMsIGNvcmUuYyBmb3JtYXQuYywgcmVsb2MuYywKLQlzZWN0aW9uLmMgYW5kIHN5bXMuYyB0byBzcGxpdCB0aGUgZnVuY3Rpb25hbGl0eSBhIGJpdCBiZXR0ZXIuCi0JQ2xlYW5lZCB1cCB0aGUgcmVzdCBvZiB0aGUgZmlsZXMgYSBiaXQsIGFuZCBhZGRlZCBzb21lCi0JZG9jdW1lbnRhdGlvbi4KLQotCi1Nb24gSnVsICAxIDEzOjI5OjQ3IDE5OTEgIERhdmlkIFdvb2QgKHdvb2QgYXQgZGF2aWQudWx0cmEubnlhLmVkdSkKLQotCSogb3BuY2xzLmMsIC4uL2luY2x1ZGUvc3lzL2gtc3VuMy5oIC4uL2luY2x1ZGUvc3lzL2gtc3VuNC5oOiBmY250bAotCXJlYWxseSB0YWtlcyAzIGFyZ3VtZW50cywgcGF0Y2hlZCBjb2RlIGFuZCBhbW1lbmRlZCBwcm90b3R5cGVzLgotCi1GcmkgSnVuIDE0IDEzOjE5OjQwIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIC4uL2luY2x1ZGUvYmZkLmggKHN0cnVjdCBiZmRfdGFyZ2V0KTogQWRkZWQgbmV3IGZpZWxkCi0JImFsaWduX3Bvd2VyX21pbiIgd2hpY2ggY29udGFpbnMgdGhlIG1pbmltdW0gYWxpZ25tZW50IGZvciBhCi0Jc2VjdGlvbi4gVGhpcyBpcyB1c2VkIGluIGNvZmZfbmV3X3NlY3Rpb25faG9vay4gVGhlIGZpZWxkCi0JaW5zZXJ0aW9uIG5lY2Vzc2l0YXRlcyBhbiB1cGRhdGUgb2YgYWxsIGJhY2tlbmRzLi4KLQotCSogYW91dGYxLmgganVtcCB0YWJsZSBmaWVsZCBpbnNlcnRlZAotCi0JKiBhcmNoaXZlLmMoc25hcmZfYXJfaGRyKShiZmRfc2x1cnBfY29mZl9hcm1hcCkgY2FuIG5vdyBwYXJzZSBkZ3V4IHN0eWxlIGV4dGVuZGVkCi0JZmlsZW5hbWVzIHRvby4KLQotCSogYm91dC5jKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKSBmaXggdG8gYXNzZXJ0aW9uIHRlc3RzLiBKdW1wCi0JdGFibGUgZmllbGQgaW5zZXJ0ZWQuCi0KLQkqIGNvZmZjb2RlLmgoanVzdCBhYm91dCBldmVyeXRoaW5nKSBOb3cgcGF0Y2hlcyB1cCBzeW1ib2wgdGFibGVzCi0JdXNpbmcgYSBkaWZmZXJlbnQgbWVjaGFuaXNtLiBUaGUgSW50ZWwgbWFqb3IgYnVnIGhhcyBiZWVuIGZpeGVkLAotCWFuZCB0aGUgbGlua2VyIGNhbiBzZWxmIGhvc3Qgb24gdGhlIEF2aWlvbiBhbmQgYmUgZGVidWdnZWQgd2l0aAotCWdkYi4KLQotCSogZWNvZmYuYzogbmV3IGluY2x1ZGUgYW5kIGp1bXAgdGFibGUgcGF0Y2gsIGkzODZjb2ZmLmM6IG5ldwotCWluY2x1ZGUgYW5kIGp1bXAgdGFibGUgcGF0Y2gsICBpY29mZi5jOiBuZXcgaW5jbHVkZSBhbmQganVtcCB0YWJsZQotCXBhdGNoLCBpZWVlLmM6IGNhbiBub3cgcmVhZCBhcmNoaXZlcyBjb250YWluaW5nIGllZWUgbW9kdWxlcy4sCi0JbGliY29mZi5oOiBhZGRlZCAoY29tYmluZWRfZW50cnlfdHlwZSksIGxpYmllZWUuaDogdXBlZCBtYXgKLQlzZWN0aW9ucyB0byAyMCwgbTY4a2NvZmYuYzogbmV3IGluY2x1ZGUgYW5kIGp1bXAgdGFibGUgcGF0Y2gsCi0JbTg4a2Jjcy5jOiBuZXcgaW5jbHVkZSBhbmQganVtcCB0YWJsZSBwYXRjaCwgb2FzeXMuYzogdmFyaW91cyBidWdzCi0JZml4ZWQuIG9wbmNscy5jOiBhZGRlZCBiZmRfYWxsb2NfZ3JvdyBhbmQgYmZkX2FsbG9jX2ZpbmlzaC4KLQlzcmVjLmM6IGp1bXAgdGFibGUgcGF0Y2guIHRyYWQtY29kZS5jIGZpeGVkICNJRiB0eXBlbwotCi1GcmkgSnVuICA3IDEyOjM1OjQ2IDE5OTEgIFNlYW4gRmFnYW4gIChzZWYgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLSAJKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luKTogYWRkZWQgZWxzZSBjYXNlIHRvIGRlYWwgd2l0aAotIAlmaWxlbmFtZXMgbGVzcyB0aGFuIDkgY2hhcmFjdGVycy4KLQotCi1UaHUgSnVuICA2IDE4OjI3OjM4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIC4uL2luY2x1ZGUvb2FzeXMuaCBvYXN5cy5jIChvYXN5c19hcmNoaXZlX3ApOiBmaXhlZCBzbyBpdCB3b3JrcwotCi0JKiBzcmVjLmM6IG5vdyBhbGxvd3MgYW55IG51bWJlciBvZiBzZWN0aW9ucyB0byBiZSBjcmVhdGVkIGluIGEKLQlmaWxlLiBPdXRwdXRzIGFkZHJlc3NlcyBvZiB0aGUgcmlnaHQgbGVuZ3RoLgotCi1UaHUgTWF5IDMwIDE1OjMwOjEwIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfY2hlY2tfZm9ybWF0KTogRml4ZWQgcHJvYmxlbSB3aGVyZSB3aGVuIGEgZGVmYXVsdGVkCi0JdGFyZ2V0IGRpZG4ndCBtYXRjaCwgdGhlIGZvcm1hdCBnb3Qgc2V0IHRvIHRoZSBhdHRlbXB0ZWQgbWF0Y2gsCi0JYnJlYWtpbmcgYSBmdXR1cmUgdGVzdC4KLQotICAgICAgICAqLi4vaW5jbHVkZS9pMzg2Y29mZi5oIDogZml4ZWQgdHlwbyBpbiB0eXBlIGZpZWxkIHdpdGggc2l6ZQotCi0JKiBpMzg2Y29mZi5jIGljb2ZmLmMgbTg4ay1iY3MuYyBlY29mZi5jIC4uL2luY2x1ZGUvYmZkLmggOiBBZGRlZAotCXN1cHBvcnQgaW4gdGhlIGp1bXAgdGFibGUgZm9yIHRoZSBzd2FwcGluZyByb3V0aW5lcyBleHBvcnRlZCB0bwotCWdkYi4gTm93IGdkYiB3b3JrcyB3aXRoIHRoZSAzODYuCi0KLVR1ZSBNYXkgMjggMTc6MjE6NDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBNZXJnZSBpbiBjaGFuZ2VzIGZyb20gZ2RiLTMuOTUgcmVsZWFzZS4KLQlNYWtlZmlsZS5pbjogIEFsbG93IGhtYWtlIGFuZCB0bWFrZSBmaWxlcyB0byBhZGQgT0ZJTEVTLgotCWFvdXRmMS5oOgotCWJmZC5jOiAgc3VwcG9ydCBzcGVjaWZpYyB0YXJnZXRzIGFzIHdlbGwgYXMgc2VhcmNoaW5nLiAgV2hlbgotCXNlYXJjaGluZywgdGFrZSBkZWZhdWx0IHRhcmdldCBpbiBwcmVmZXJlbmNlIHRvIG90aGVycy4KLQliZmQuZG9jOiAgdHlwb3MKLQlpZWVlLmMsIG9hc3lzLmM6ICBBdm9pZCB1c2luZyB0aGUgInRkYXRhIiBtYWNyb3MgbGVmdCBvZiBhc3NpZ25tZW50LgotCWxpYmEub3V0Lmg6ICBEb24ndCBoYXJkLWNvZGUgZmlsZSBvZmZzZXRzOyB1c2UgTl8gbWFjcm9zIGZvciB0aGVtLgotCWxpYmJmZC5oOiAgU3VwcG9ydCBzcGVjaWZpYyB0YXJnZXRzIGFzIHdlbGwgYXMgc2VhcmNoaW5nLgotCW9wbmNscy5jOiAgU3VwcG9ydCBzcGVjaWZpYyB0YXJnZXRzIGFzIHdlbGwgYXMgc2VhcmNoaW5nLgotCXRhcmdldHMuYzogIFNlYXJjaCBpcyBzaG9ydC1jaXJjdWl0ZWQgaWYgZGVmYXVsdCB0YXJnZXQgbWF0Y2hlcy4KLQlsaWJvYXN5cy5jLCBsaWJpZWVlLmM6ICBVbmRvIGJvdGhuZXIgY2hhbmdlcyB0aGF0IG1ha2UgbWFjcm9zCi0Jd29yayB0byB0aGUgbGVmdCBvZiBhc3NpZ25tZW50LCBidXQgd2hpY2ggZGVwZW5kIG9uIHRoZQotCXJlcHJlc2VudGF0aW9ucyBvZiBkaWZmZXJlbnQgcG9pbnRlciB0eXBlcyBiZWluZyB0aGUgc2FtZS4KLQotRnJpIE1heSAyNCAxODo1Njo1MiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBpMzg2Y29mZi5jOiBjcmVhdGVkLgotCSogY29mZmNvZGUuaDogYWRkZWQgc3VwcG9ydCBmb3IgMzg2LgotCSogTWFrZWZpbGUuaW46IGFkZGVkIHN1cHBvcnQgZm9yIDM4Ni4KLQkqIC4uL2luY2x1ZGUvaTM4NmNvZmYuaDogY3JlYXRlZAotCi1XZWQgTWF5IDIyIDA3OjI2OjM4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IHJlbW92ZWQgYWxsIHB1dF94XzxzaXplcz4KLQkqIGxpYmJmZC5jOiBDaGFuZ2VkICNpZmRlZiBfX0dOVUNfXyB0byAjaWZkZWYgSE9TVF82NF9CSVQsIEFkZGVkCi0JREVGVU5TCi0KLQotVHVlIE1heSAyMSAwODo1ODo1OCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCShib3RobmVyKQotCSogb3BuY2xzLmM6IENoYW5nZWQgb2JzdGFja19jaHVua19hbGxvYyB1c2UgeG1hbGxvYwotCi1Nb24gTWF5IDIwIDE3OjEyOjE3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGV2ZXJ5dGhpbmc6IFJlbW92ZWQgc3lzZGVwLmggZnJvbSBiZmQuaCBhbmQgcHV0IGJhY2sgaW50byBmaWxlcwotCWZyb20gd2hpY2ggaXQgd2FzIHNwbGl0IG91dC4gTm93IDY0IGJpdCB2ZXJzaW9uIGlzIGJ1aWx0IHdpdGggYQotCS1ESE9TVF82NF9CSVQ9ImxvbmcgbG9uZyIgb24gdGhlIGNvbXBpbGUgbGluZS4KLQotRnJpIE1heSAxNyAxOTozNToyNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JQ2hhbmdlZCBhbGwgdGhlIFtnZXR8cHV0XVtuYW1lXSByb3V0aW5lcyB0byB1c2UgIFtnZXR8cHV0XV9bc2l6ZQotCWluIGJ5dGVzXS4KLQotCVB1dCBpbiBzdXBwb3J0IGZvciA2NCBiaXQgd29yay4gTm93IHR3byB2ZXJzaW9ucyBvZiBiZmQgbWF5IGJlCi0JZ2VuZXJhdGVkLCBhY2NvcmRpbmcgdG8gdGhlIHN0YXRlIG9mIFRBUkdFVF82NF9CSVQsIG9uZSB3aGljaCBpcwotCTMyIGJpdCBvbmx5LCBhbmQgb25lIHdoaWNoIGlzIDY0LzMyIGJpdHMuCi0JQ3JlYXRlZCBuZXcgYmFjayBlbmQgJ2RlbW82NCcgdG8gdGVzdCA2NCBiaXQgZnVuY3Rpb25hbGl0eS4KLQotCVJlbmFtZWQgc29tZSBmaWxlcyB0byB3b3JrIG9uIERPUy4KLQotCSogYXJjaGl2ZS5jOiBsaW50ICogYmZkLmM6IHByb3RvdHlwZXMgYW5kIGxpbnQuICogZWNvZmYuYzogYWRkZWQKLQk2NGJpdCB0cmFuc2ZlciAJKiBpY29mZi5jOiBhZGRlZCA2NGJpdCB0cmFuc2ZlciAqIGllZWUuYzogbmFtZQotCWNoYWdlLCA2NCBiaXQgdHJhbnNmZXIuICogbGliYS5vdXQuaDogU3BsaXQgb3V0IGNvbW1vbiBjb2RlIGZyb20KLQlzdW5vcyBhbmQgbmV3c29zIGludG8gbGliYS5vdXQuIE5hbWUgY2hhbmdlcyBhbmQgcHJvdG90eXBlIG1vZHMuICoKLQlsaWJiZmQuYzogbGludCBhbmQgcHJvdG90eXBlcywgZXh0cmEgNjRiaXQgc3dhcHMuICogbGliYmZkLmg6Ci0JcHJvdG90eXBlcyBmb3IgbmV3IGZ1bmN0aW9ucy4gKiBsaWJjb2ZmLmg6IGxpbnQgKiBsaWJpZWVlLmg6IG1ha2UKLQl3b3JrIG9uIERPUyAqIGxpYm9hc3lzLmg6IG1ha2Ugd29yayBvbiBET1MgKiBtODhrLWJjcy5jOiBOYW1lCi0JY2hhbmdlIGFuZCA2NGJpdCBzdHVmZi4qIG5ld3NvczMuYzogY29tbW9uIGNvZGUgcmVtb3ZlZCwgbmV3IGp1bXAKLQl0YWJsZS4gKiBvYXN5cy5jOiBOYW1lIGNoYW5nZSAqIG9wbmNscy5jOiBQb3J0YWJpbGl0eSBmaXhlcyAqCi0Jc3JlYy5jOiBOYW1lIGNoYW5nZXMgKiBzdW5vcy5jOiBSZW1vdmVkIGNvbW9uIGNvZGUuICogdGFyZ2V0cy5jOgotCUFkZGVkIGRlbW8gKiBhb3V0MzIsIGFvdXQ2NC5jIGluY2x1ZGUgIGFvdXR4LmggKiBib3V0LmM6IHVzZWQgdG8KLQliZSBjYWxsZWQgYi5vdXQuYyAqIGNvZmZjb2RlLmg6IHVzZWQgdG8gYmUgY2FsbGVkIGNvZmYtY29kZS5oLCBub3cKLQk2NGJpdCBpemVkLiAqIGRlbW82NC5jOiA2NCBiaXQgYS5vdXQgYmFjayBlbmQKLQotVGh1IE1heSAxNiAxNjowMjowNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCWZyb20gYm90aG5lcgotIAkqIGxpYmllZWUuaDogTWFrZSBpZWVlX2RhdGEgYW5kIGllZWVfYXJfZGF0YSBtYWNyb3MgdXNhYmxlCi0Jb24gTEhTIG9mIGFzc2lnbm1lbnQsIGV2ZW4gd2hlbiB1c2luZyBvbGQgY29tcGlsZXJzLgotCSogbGlib2FzeXMuaDogRGl0dG8gZm9yIG9hc3lzX2RhdGEgYW5kIG9hc3lzX2FyX2RhdGEuCi0JKiBtNjhrY29mZi5jOiBBZGQgZW51bS10by1pbnQgY2FzdHMgdG8gYWNjb21vZGF0ZSBvbGQgY29tcGlsZXJzLgotCSogbmV3c29zMy5jOiBGaXggZGVmaW5pdGlvbnMgb2YgU0VHTUVOVF9TSVpFIGFuZCBURVhUX1NUQVJUX0FERFIuCi0JKiBvcG5jbHMuYzogRGVmaW5lIFNfSVhVU1IsIFNfSVhHUlAsIFNfSVhPVEggaWYgdW5kZWZpbmVkLgotCSogdGFyZ2V0cy5jOiBBZGQgZGVjbGFyYXRpb24gb2YgbmV3c29zM192ZWMuCi0KLU1vbiBNYXkgMTMgMTA6MDM6MjkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYW91dC5jOiBmaXh4ZWQgc29tZSBvZiB0aGUgcHJvYmxlbXMgd2l0aCBmaWxlcG9zIGNhbGN1bGF0aW9uLgotCShzd2FwX2V4dF9yZWxvYyk6IGZpeGVkIHByb2JsZW0gd2l0aCBjcmVhdGlvbiBvZiByZWxvY3MuCi0JKGFvdXRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBmaXhlZCBmaWxlcG9zIHByb2JsZW0KLQotCSogY29mZi1jb2RlLmg6IChzd2FwX2ZpbGVoZHJfaW4sIHN3YXBfZmlsZWhkcl9vdXQpIGFkZC4KLQkoc3dhcF9maWxlaGRyKSBkZWxldGUuIENoYW5nZWQgYWxsIHRoZSB1c2FnZSBvZiBiZmRfaF9wdXRfeC4KLQkoc3dhcF9hb3V0aGRyX2luLCBzd2FwX2FvdXRoZHJfb3V0KSBhZGQuIChzd2FwX2FvdXRoZHIpIGRlbGV0ZS4KLQkoY29mZl9yZWFsX29iamVjdF9wKSBjbGVhbmVkIHVwLCBhZGRlZCBNSVBTLiAoY29mZl9vYmplY3RfcCkKLQljbGVhbmVkIHVwLiAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpIGNsZWFuZWQgdXAuCi0KLQkqIGVjb2ZmLmM6IFRvdGFsbHkgZGlmZmVyZW50LiBOb3cgc3VwcG9ydHMgZWNvZmYgZnVsbHkuCi0KLQkqIGljb2ZmLmM6IGZpeGVkIHByb2JsZW1zIGluIHJlbG9jYXRpb24gY2FsbG91dC4KLQotCSogbGliY29mZi5oOiAoc3RydWN0IGljb2ZkYXRhKSByZW1vdmVkIGhkciBzdHJ1Y3R1cmUgZnJvbSB0ZGF0YS4KLQotCSogbTY4a2NvZmYuYzogdXBkYXRlZCB0YXJnZXQgdmVjdG9yLgotCi0JKiBzdW5vcy5jOiAoY2hvb3NlX3JlbG9jX3NpemUpIGFkZGVkOiAoc3Vub3M0X2NhbGxiYWNrKSBjYWxscwotCWNob29zZV9yZWxvY19zaXplLiAoc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cykgbm93IGNhbGxzCi0JY2hvb3NlX3JlbG9jX3NpemUgc28gb3V0cHV0cyByZWxvY3MgY29ycmVjdGx5LCBhbHNvIGNhbGN1bGF0ZXMgdGhlCi0Jc2l6ZSBvZiB0aGUgc2VjdGlvbnMgY29ycmVjdGx5LgotCi0KLQotRnJpIE1heSAxMCAxNjo1ODo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQlNZXJnZSBQZXIgQm90aG5lcidzIGNoYW5nZXMgdG8gbW9kdWxhcml6ZSBCRkQgYS5vdXQgYSBiaXQuCi0KLQkqIGxpYmJmZC5oLCBsaWJiZmQuYyAoYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiAgQWRkLgotCSogaWVlZS5jOiAgQ2FzdCBlbnVtcyB0byBpbnQgYmVmb3JlIGNvbXBhcmluZyB0aGVtLCBmb3IgYnJhaW4tCi0JZGVhZCBjb21waWxlcnMuCi0JKiBjb2ZmLWNvZGUuaDogIFJlbW92ZSBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzLCBhbmQgdXNlIHRoZQotCWdlbmVyaWMgb25lIGluc3RlYWQuCi0KLQkqIGFvdXQuYzogIERlcml2ZSBuZXcgbW9kdWxlIGZyb20gc3Vub3MuYywgY29udGFpbmluZyBnZW5lcmljCi0Jc3VwcG9ydCBjb2RlIGZvciBhbGwga2luZHMgb2YgYS5vdXQgZmlsZXMuCi0KLQkqIHN1bm9zLmM6IFJlbW92ZSBhbGwgY29kZSB0aGF0IGdvZXMgaW4gYW91dC5jLiAgU3BsaXQgb3V0Ci0JbWFjaGluZSBkZXBlbmRlbnQgZm9sbG93dXAgaW4gc3Vub3M0X29iamVjdF9wIGludG8KLQlzdW5vczRfY2FsbGJhY2suICBVc2UgSlVNUF9UQUJMRShhb3V0KSBmb3IgdGhlIHRyYW5zdmVyIHZlY3RvciwKLQlhbmQgcmVkZWZpbmUgb25seSB0aGUgbmFtZXMgd2UgQ0hBTkdFLCBub3QgYWxsIHRoZSBuYW1lcy4gIERyb3AKLQl0aGUgbGl0dGxlLWVuZGlhbiB2ZWN0b3IsIGFuZCByZW5hbWUgdGhlIHZlY3RvciBhcyBzdW5vczQgcmF0aGVyCi0JdGhhbiBnZW5lcmljLgotCi0JKiBiLm91dC5jOiAgVXNlIGFvdXQuYyByb3V0aW5lcyBmb3IgbW9zdCBvZiB0aGUgd29yay4gIFNsaWdodAotCWNoYW5nZXMgZm9yIHRoZSBuZXcgcmVnaW1lLiAgUmVtb3ZlIGNsb3NlX2FuZF9jbGVhbnVwIGFuZAotCWdldF9zZWN0aW9uX2NvbnRlbnRzIGluIGZhdm9yIG9mIGdlbmVyaWNzLiAgTmV3IHRyYW5zZmVyIHZlY3RvcgotCXJlZ2ltZS4KLQotCSogbmV3c29zLmM6ICBOZXcgc3VwcG9ydCBmb3IgU29ueSBORVdTLCBhbm90aGVyIGEub3V0IGZvcm1hdC4KLQotCSogZWNvZmYuYzogIFJlbW92ZSBjbG9zZV9hbmRfY2xlYW51cC4gIE5ldyB0dmVjIHJlZ2ltZS4KLQkqIGljb2ZmLmMsIG04OGstYmNzLmM6ICBBZGQgd3JpdGVfY29udGVudHMgdG8gdHZlYy4KLQkqIGllZWUuYywgb2FzeXMuYzogIFJlbW92ZSBjbG9zZV9hbmRfY2xlYW51cCwgYWRkIHdyaXRlX2NvbnRlbnRzCi0JdG8gdHZlYy4KLQkqIG9wbmNscy5jIChiZmRfY2xvc2UpOiAgQ2FsbCBmb3JtYXQtZGVwZW5kZW50IHdyaXRlX2NvbnRlbnRzCi0Jcm91dGluZSwgaWYgd3JpdGluZywgYmVmb3JlIGNhbGxpbmcgdGFyZ2V0LWRlcGVuZGVudAotCWNsb3NlX2FuZF9jbGVhbnVwIHJvdXRpbmUgKHdoaWNoIGlzIG5vdyBhbHdheXMgZ2VuZXJpYywgSSB0aGluaykuCi0JKiBzcmVjLmM6ICBVc2UgYmZkX2FsbG9jIGluc3RlYWQgb2YgbWFsbG9jLiAgUmVtb3ZlCi0JY2xvc2VfYW5kX2NsZWFudXAgYW5kIG1vdmUgY29kZSBmcm9tIGl0IHRvCi0Jc3JlY193cml0ZV9vYmplY3RfY29udGVudHMuICBBZGQgd3JpdGVfY29udGVudHMgdG8gdHZlYy4KLQkqIHRhcmdldHMuYzogIFJlbW92ZSBhLm91dCBsaXR0bGUgdmVjdG9yLCByZXBsYWNlIGEub3V0IGJpZwotCXZlY3RvciB3aXRoIFN1bk9TIHZlY3Rvci4gIEZJWE1FOiAgTmVlZCBWYXggc3VwcG9ydCBhZ2FpbiBub3cuCi0KLQkqIGxpYmJmZC5oOiAgQWRkIHdyaXRlX2NvbnRlbnRzIGZvcm1hdC1kZXBlbmRlbnQtdmVjdG9yIHRvIHRoZQotCWJmZF90YXJnZXQgdmVjdG9yLiAgU3VwcGx5IGEgZ2VuZXJpYyBjbG9zZV9hbmRfY2xlYW51cCByb3V0aW5lLgotCSogbGliYS5vdXQuaDogIEhhbmRsZSB0aGUgbmV3IGFvdXQuYyBzcGxpdC4gIEFkZCBwcm90b3R5cGVzIGZvcgotCWFsbCByb3V0aW5lcyBkZWZpbmVkIGluIGFvdXQuYy4gIFJlbmFtZSAic3Vub3MiIHRoaW5ncyB0byAiYW91dCIKLQl0aGluZ3MuICBBZGQgYSBmZXcgZmllbGRzIHdoZXJlIG5lZWRlZCBmb3IgdmFyaW91cyBmb3JtYXRzLgotCSogTWFrZWZpbGUuaW46ICBBZGQgYW91dC5jIGFuZCBuZXdzb3MuYy4KLQotCSogYXJjaGl2ZS5jLCBpZWVlLmMsIG9hc3lzLmM6ICBMaW50LgotCi1GcmkgTWF5IDEwIDEyOjM0OjQ4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIC4uL2luY2x1ZGUvYmZkLmgKLQljaGFuZ2VkIGZvcndhcmQgZGVjbGFyYXRpb24gc3RydWN0IHN0YXQ7IHRvIHJlZHVjZSB3YXJuaW5ncy4gQ2hhbmdlZAotCWNvbW1lbnQgb24gYmZkX2hfPHg+X3guCi0KLQkqIC4uL2luY2x1ZGUvbTY4a2NvZmYuaCwgLi4vaW5jbHVkZS9pbnRlbC1jb2ZmLmgsCi0JLi4vaW5jbHVkZS9tODhrLWJjcy5oCi0JTm93IHRoZXJlIGFyZSB0d28gaW5jYXJuYXRpb25zIG9mIHJlbG9jcywgbGluZW5vcyBhbmQgc3ltZW50cy4gT25lIGZvcgotCWludGVybmFsIGRpZ2VzdGlvbiwgYW5kIG9uZSBmdWxsIG9mIGNoYXIgYXJyYXlzIGZvciBJL08uIFRoZSBvcmlnaW5hbAotCW5hbWVzIGhhdmUgZ29uZSB0byBkZXRlY3QgZXJyb3JzLgotCi0JKiBNYWtlZmlsZS5pbiwgbTY4a2NvZmYuYywgdGFyZ2V0cy5jCi0JVGVzdCBuZXcgc3RydWN0dXJlIGNvZGUgd2l0aCBhIDY4ayBjb2ZmIGltcGxlbWVudGFpb24KLQotCSogY29mZi1jb2RlLmgsIGljb2ZmLmMsIGNvZmZzd2FwLmMsIGxpYmNvZmYuaAotCUZpeGVkIGFsbCB0aGUgcGxhY2VzIHdoZXJlIHRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCB0aGUgc2l6ZSBhbmQKLQlhbGlnbm1lbnRzIG9mIHN0cnVjdHVyZXMgb24gZGlzayBhbmQgc3RydWN0dXJlcyBpbiBtZW1vcnkuICNpZmVkIG91dAotCWFsbCB0aGUgY29kZSBpbiBjb2Zmc3dhcC5jLCBzaW5jZSBpdCBzaG91bGQgYmUgZG9uZSB1c2luZyB0aGUgdGFyZ2V0Ci0Jc3dhcCByb3V0aW5lcyBub3cuCi0KLVRodSBNYXkgIDkgMTE6MDA6NDUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChkb19vbmUsIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogbm93IHN1cHBvcnRzIHRoZSBsb2FkCi0JbXVsdGlwbGUgcmVsb2MgY29tbWFuZC4KLQotCSogc3Vub3MuYyAoc3Vub3M0X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTWFkZSBpdCBzbyB0aGF0IHNlY3Rpb25zCi0JYXJlIGFsd2F5cyBwYWRkZWQgdG8gdGhlaXIgYWxpZ25tZW50IHNpemUuCi0KLVNhdCBNYXkgIDQgMTU6NDk6NDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMsIGJmZC5jLCBjb2ZmLWNvZGUuaCwgb3BuY2xzLmMsIHN1bm9zLmMsIHRyYWQtY29yZS5jOgotCUNsZWFuIHVwIHR5cGVzIGFuZCBzdWNoIChzYWJlciBDIHByb2JsZW1zKS4KLQkqIGVjb2ZmLmM6ICBDbGVhbiB1cCB0eXBlcyBhbmQgc3VjaC4gIFJlbW92ZSByb3V0aW5lcyB0aGF0IGFyZQotCW5vdCB1c2VkLiAgRml4IHVwIHJlYWRpbmcgYW5kIHN3YXBwaW5nIG9mIHNob3J0cyBmcm9tIGZpbGVzLgotCi0gICBOb3RlcyBvbiBiZmQtMC41LjItcGF0Y2gxYSwgZnJvbSBQZXIgQm90aG5lcjoKLQotCSogYS5vdXQudmF4LmM6IFJlbW92ZSB0d28gYm9ndXMgInN0YXRpYyIgZnJvbSBwcm90b3R5cGVzLgotCi0JKiBlY29mZi5jOiBHb3QgcmlkIG9mIGxvdHMgb2Ygbm9uLXdvcmtpbmcganVuayAodGhhdCBoYWQKLQliZWVuIGNvcGllZCBkaXJlY3RseSBmcm9tIGNvZmYtY29kZS5oKS4KLQlVcGRhdGVkIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB1cGRhdGVzIHRvIGljb2ZmLmMgYW5kIGNvZmYtY29kZS5oLgotCi0JKiBsaWJiZmQuaDogQWRkZWQgZGVmaW5pdGlvbnMgZm9yIFNfSVhVU1IsIFNfSVhHUlAsIGFuZCBTX0lYT1RICi0JaWYgdGhleSdyZSBtaXNzaW5nIChhcyB0aGV5IGFyZSBpbiAoQkRTLTQuMy1iYXNlZCkgTmV3c09TLTMpLgotCi0JKiBzdW5vcy5jIChuX3R4dG9mZik6IChSZS0pQWRkIHN1cHBvcnQgZm9yIHNvbnkuIFRoaXMgaXMgYSBrbHVkZ2UsCi0JYnV0IHVudGlsIHRoZSB0YXJnZXRfdmVjdG9yIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLAotCWl0J3MgYXMgZ29vZCBhcyBhbnkuIE5vdGUgdGhhdCB0aGUgdGV4dCBvZmZzZXQgaXMgdGhlIG9ubHkKLQlkaWZmZXJlbmNlIGJldHdlZW4gTmV3c09TIGFuZCBTdW5PcyAoaW5jbHVkaW5nIG1hZ2ljIG51bWJlcnMpLgotCShNb3N0IG9mIHRoZSBzdW5vc18qIHJvdXRpbmVzIHNob3VsZCB0byByZW5hbWVkIGJzZF8qCi0JYW5kIG1vdmUgdG8gYSBic2QuYyBmaWxlLiBUaGVuIChhbmQgd2hlbiB0aGUgdGFyZ2V0X3ZlY3RvcgotCWlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkKSBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIGNyZWF0ZQotCWEgc2VwYXJhdGUgU29ueSB0YXJnZXQuKQotCi0JKiBzeXNkZXAuaDogRG9uJ3QgZGVjbGFyZSBmcmVhZCBhbmQgZndyaXRlLiBDYXVzZXMgdHJvdWJsZQotCW9uIHNvbWUgc3lzdGVtcywgYW5kIGRvZXNuJ3QgaGVscCBvbiBvdGhlcnMuCi0JU2ltaWxhcmx5LCBvbmx5IGRlZmluZSBYX09LIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0KLQkqIHRyYWQtY29yZS5jOiBEb24ndCBpbmNsdWRlIHN5cy9zdGF0LmggLSBhdCBsZWFzdAotCW9uIE5ld3NPUyAzLCBpdCBoYXMgYWxyZWFkeSBiZWVuIGluY2x1ZGVkLgotCi1UdWUgTWFyICA1IDAxOjQ3OjU3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogY29mZi1jb2RlLmggKGJmZF9jb2ZmX3N3YXBfc3ltLCBiZmRfY29mZl9zd2FwX2F1eCwKLQliZmRfY29mZl9zd2FwX2xpbmVubyk6ICBFeHBvcnQgdGhlIHJvdXRpbmVzIHRoYXQgYnl0ZS1zd2FwIENPRkYKLQlzeW1ib2wgdGFibGVzIGlmIG5lY2Vzc2FyeSB3aGVuIHJlYWRpbmcgdGhlbSBpbiwgc28gZ2RiIGNhbiB1c2UKLQl0aGVtLiAgQWRkICJiZmRfY29mZl8iIHRvIHRoZSBuYW1lcyBzbyB0aGV5IHdvbid0IGNvbmZsaWN0IHdpdGgKLQluYW1lcyBpbiBjYWxsaW5nIHByb2dyYW1zLiAgRklYTUUtc29vbjogIGlmIGNvZmYtY29kZS5oIGlzCi0JaW5jbHVkZWQgaW4gdHdvIEJGRCBtb2R1bGVzLCB0aGlzIHdpbGwgY2F1c2UgZHVwbGljYXRlCi0JZGVmaW5pdGlvbnM7IHRoZSByb3V0aW5lcyBzaG91bGQgYmUgZXhwb3J0ZWQgdG8gYSBzZXBhcmF0ZSwKLQljb21tb24sIG1vZHVsZSAocHJvYmFibHkgYWxvbmcgd2l0aCBhIG1lc3Mgb2Ygb3RoZXIgb25lcykuCi0KLVNhdCBNYXIgIDIgMTI6MTE6MjYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JSW1wcm92ZSBtb2R0aW1lIHN1cHBvcnQuCi0KLQkqIGJmZC5oOiAgQWRkIGJvb2xlYW4gbXRpbWVfc2V0LCBhbmQgZGVjbGFyZSBiZmRfZ2V0X210aW1lLgotCVJlbW92ZSAjZGVmaW5lIGZvciBiZmRfZ2V0X210aW1lLiAgUmVtb3ZlIGdyYXR1aXRvdXMgY29tbWVudC4KLQkqIGJmZC5jIChiZmRfZ2V0X210aW1lKTogIE5ldyBmbiwgY2FjaGVzIG10aW1lLCBnZXRzIGlmIG5vdCBjYWNoZWQuCi0JQlVHOiAgYXJjaGl2ZSBtZW1iZXJzIHN0aWxsIGRvIG5vdCBnZXQgY29ycmVjdCBtb2QgdGltZXMuCi0KLQlJbXByb3ZlIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgZm9yIGNvcmUgZmlsZXMuCi0KLQkqIHN1bm9zLmMgKHN0cnVjdCBjb3JlKTogIENoYW5nZSB2b2lkICpmcGFfZHVtbXkgdG8gZG91YmxlIGZwX3N0dWZmLgotCShzdW5vczRfY29yZV9maWxlX3ApOiAgQ3JlYXRlIGEgc2Vjb25kIHJlZ2lzdGVycyBzZWN0aW9uIGluIHRoZQotCWNvcmUgZmlsZSwgY2FsbGVkICIucmVnMiIsIGZvciB0aGUgZmxvYXQgcmVnaXN0ZXJzLgotCi1UaHUgRmViIDE0IDE1OjQ5OjA2IDE5OTEgIEd1bWJ5IFZpbmF5YWsgV2FsbGFjZSAgKGd1bWJ5IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBtYW55IGNoYW5nZXMgdG8gaW1wcm92ZSBhcmNoaXZlIGhhbmRsaW5nOyBmb3VuZCBhIGxvZ2ljIGZsYXcgaW4KLQkgIGJmZF9jaGVja19mb3JtYXQgd2hpY2ggb25seSBqdXN0IGhhcHBlbmVkIHRvIHdvcmsgYnkgY29vbmNpZGVuY2UuCi0KLVRodSBGZWIgMTQgMDc6NTM6MTYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBmaXhlZCB0byB1c2Ugb3V0cHV0X29mZnNldHMKLQljb3JyZWN0bHkuCi0KLQkqIGJmZC5oOiBjaGFuZ2VkIHR5cGUgb2YgdWRhdGEgaW4gYXN5bWJvbCB0byB2b2lkICosIGxpa2UgaXQKLQlzaG91bGQgYmUuIEFkZGVkIGJmZF9yZWxvY19kYW5nZXJvdXMgZW51bSBtZW1iZXIuCi0KLQkqIGNvZmYtY29kZS5oOiBGaXhlZCBpdCBzbyB0aGF0IGludGVybmFsbHkgZ2VuZXJhdGVkIHN5bWJvbHMgZ2V0Ci0JdGhlaXIgdmFsdWVzIHJlbG9jYXRlZCBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzLiBSZW1vdmVkIGNhbGxzIHRvCi0JeG1hbGxvYy4KLQotCSogaWNvZmYuYzogTm90IHVuZGVyc3RhbmRpbmcgdGhlIGRlc3RpbmF0aW9uIHN5bWJvbCBvZiBhIHJlbG9jIGlzCi0Jbm90IGEgZmFpbHVyZSBhbnkgbW9yZSwganVzdCAnZGFuZ2Vyb3VzJy4gVGhpcyBhbGxvd3MgbGlua2luZyBvZgotCWIub3V0IGFuZCBjb2ZmIGltYWdlcy4KLQotCSogc3Vub3MuYzogQ2xlYW5lZCB1cCB0aGUgd2F5IHRoYXQgWk1BR0lDIHNlY3Rpb24gc2l6ZXMgYXJlCi0JY2FsY3VsYXRlZC4KLQotCi1UdWUgRmViIDEyIDEzOjI1OjQ2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIHN1bm9zLmMgKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogZml4ZWQKLQlzeW1fcG9pbnRlci0+bl92YWx1ZSBzbyB0aGF0IHN5bWJvbHMgb24gdGhlIHdheSBvdXQgZ2V0IHRoZWlyCi0Jc2VjdGlvbiByZWxhdGl2ZSB2YWx1ZXMgY2FsY3VsYXRlZCBjb3JyZWN0bHkuCi0KLQkqIGNvZmYtY29kZS5oIChtYW5nbGVfc3ltYm9scyk6IGZpeGVkIHByb2JsZW0gd2hlcmUgdGFncyB3ZXJlIG5vdAotCWJlaW5nIHJlbG9jYXRlZCBmb3Igc3RydWN0cywgZW51bXMsIHVuaW9ucy4gQWxzbyB2YXJpb3VzIGxpbnRzLgotCi1Nb24gRmViIDExIDE5OjUyOjI2IDE5OTEgIEd1bWJ5IFZpbmF5YWsgV2FsbGFjZSAgKGd1bWJ5IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGdldF9lbHRfYXRfZmlsZXBvcyk6IHN5c3RlbV9jYWxsX2Vycm9yIHJldHVybmVkCi0JICBpbmNvcnJlY3RseS4KLQotU3VuIEZlYiAxMCAyMzoxODo0MCAxOTkxICBHdW1ieSBWaW5heWFrIFdhbGxhY2UgIChndW1ieSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogUmVzb2x2ZSB0aGUgdXNlIG9mIG5vX2Vycm9yIGFuZCBzeXN0ZW1fY2FsbF9lcnJvci4KLQkgIFRoZSBiZmQgbGlicmFyeSBpdHNlbGYgbm93IHdpbGwgbmV2ZXIgc2V0IGJmZF9lcnJvciB0bwotCSAgbm9fZXJyb3IuCi0KLQkgIFRoZSBjb2RlIHN0aWxsIG5lZWRzIHRvIGJlIGNvbWJlZCB0byBtYWtlIHN1cmUgYWxsIHRoZSBlcnJvcgotCSAgY29kZXMgYXJlIGNvcnJlY3QuICBJIHN1c3BlY3QgdGhleSBhcmUgbm90IGFsd2F5cyBzZXQgY29ycmVjdGx5LgotCi0JKiBUaGUgbmFtZXMgb2YgYWxsIHRoZSBtZXNzYWdlcyBoYXZlIF8gcHJlcGVuZGVkIGJlY2F1c2UgdGhlIHN1bgotCSAgYnVuZGxlZCBjb21waWxlciBjYW4ndCBkaXN0aW5ndWlzaCBmcm9tIGEgbWFjcm8gd2hpY2ggdGFrZXMgYW4KLQkgIGFyZ3VtZW50IGFuZCB0aGUgc2FtZSBpZGVudGlmaWVyIGluIGEgbm9uLW1hY3JvIGNvbnRleHQuCi0KLQkqIFRoZSByZWFzb24gZm9yIHRoZSBhYm92ZSBiZWluZyB0aGF0IGVudHJ5IHBvaW50cyB3aGljaCB1c2VkIHRvCi0JICBiZSB0cmFtcG9saW5lIGZ1bmN0aW9ucyBhcmUgbm93IGp1c3QgbWFjcm9zIHdoaWNoIGV4cGFuZCB0byBhCi0JICBkaXJlY3QgY2FsbCB0aHJvdWdoIHRoZSBiZmQncyB4ZmVyIHZlY3Rvci4KLQotCSogKC4uL2luY2x1ZGUvaW50ZWwtY29mZi5oKSBGX0FSMzJXUjogZml4IHRoaXMgY29uc3RhbnQuICBXaHkKLQkgIG11c3QgZ2FzIGhhdmUgaXRzIG93biB2ZXJzaW9uIG9mIGV2ZXJ5dGhpbmcgKHRoZSBnYXMgdmVyc2lvbgotCSAgaGFkIHRoZSBjb3JyZWN0IHZhbHVlKQotCi1UdWUgRmViICA1IDExOjQ2OjUzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGIub3V0LmM6IEFkZGVkIHBhdGNoZXMgc3VwcGxpZWQgYnkgY2hyaXNiQG1pcG9uMi5pbnRlbC5jb20gdG8KLQlwcm9wZXJseSBzdXBwb3J0IGk5NjAgYXJjaGl0ZWN0dXJlIGFuZCBvdXRwdXQgY29ycmVjdCByZWxvYyBzdHVmZi4KLQotCSogYmZkLmg6IGFkZGVkIHByb3RvdHlwZSBmb3IgYmZkX3ByaW50YWJsZV9hcmNoX21hY2gsIGFkZGVkCi0JQkZEX0ZBSUwKLQotCSogY29mZi1jb2RlLmg6IEFwcGxpZWQgcGF0Y2hlcyBmcm9tIGNocmlzYiB0byBzdXBwb3J0IGk5NjAKLQlhcmNoaXRlY3R1cmUsIHplcm8gcmVsb2NzIGFuZCBzd2FwIHRoZW0gY29ycmVjbHkgYW5kIGNvbmRpdGlvbmFsbHkKLQljb21waWxlZCB0aGUgdGltZXN0YW1wLgotCi0JKiBzdW5vcy5jOiBNYWRlIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IDJeMyBzbyB0aGF0IGRvdWJsZXMKLQlhcmUgZG9uZSBwcm9wZXJseS4gRml4ZWQgdGhlIHNhbWUgcmVsb2MgYnVnIHRoYXQgd2FzIGluIGIub3V0LmMKLQotCSogc3lzZGVwLmg6IE5vdyBjb21waWxlcyBvbiBhIFBvc2l4IGJveAotCi1XZWQgSmFuIDMwIDIxOjM2OjI2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogaWNvZmYuYzogIEZpeCBjb21tZW50IG9uIGJpZy1lbmRpYW4gdmVyc2lvbi4KLQkqIGNvZmYtY29kZS5oOiAgTWFrZSBIQVNfUkVMT0MgcmVhbGx5IHdvcmsgKGl0J3MgYmFja3dhcmRzIGZyb20KLQlGX1JFTEZMRykuICBTZXQgRl9BUjMyV1IgaW4gb3V0cHV0IGZpbGVzIGlmIGxpdHRsZSBlbmRpYW4KLQlhcmNoaXRlY3R1cmUuCi0KLVR1ZSBKYW4gMjkgMjA6NTY6MTAgUFNUIDE5OTEgc3RldmVAY3lnbnVzLmNvbQotCi0JKiBhcmNodXJlcy5jIGZpeGVkID0vPT0gdHlwbwotCi0JKiBzdW5vcy5jIGFkZGVkIGFyY2hpdGVjdHVyZSBzdHVmZiBmb3Igb3V0cHV0LiBGaXhlZAotCWJ1ZyB3aGVyZSBmaWxlcyB3aGVyZSB2bWEoZGF0YSkgIT0gc2l6ZSh0ZXh0KQotCXdlcmUgcHJvY2Vzc2VkIHdyb25nLgotCi0JKiBjb2ZmLWNvZGUuaCBhZGRlZCBhIGxpbnQgY2FzdAotCi0JKiAoLi4vaW5jbHVkZS9hLm91dC5zdW40LmgpIGZpeGVkIGl0IHNvIHptYWdpYwotCXdvcmtlZAotCi1Nb24gSmFuIDI4IDE5OjE1OjI5IFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KLQotCSogYXJjaGl2ZS5jIHJlbW92ZWQgbG9hZHMgb2YgaW5jbHVkZXMsIGFuZCBmaXhlZCBidWcgd2hlcmUgc3RyaW5nCi0JdGFibGUgZGlkbid0IGhhdmUgYSBudWxsIGF0IHRoZSBlbmQuCi0KLQkqIGJmZC5jIGZpeGVkIGluY2x1ZGVzLCBhZGRlZCBzeW1ib2xzIGFyZ3VtZW50IHRvCi0JY2Fub25pY2FsaXplX3JlbG9jIGVudHJ5IHBvaW50LgotCi0JKiBsaWJiZmQuYyBmaXhlZCBpbmNsdWRlcyBhbmQgYWRkZWQgc29tZSBsaW50IHBhdGNoZXMuCi0KLQkqIHRhcmdldHMuYyBhZGRlZCBib3RoIHNvcnRzIG9mIGludGVsIGNvZmYuCi0KLQkqIGIub3V0LmMgZml4ZWQgaW5jbHVkZWQsIGNoYW5nZWQgd2FzIHRoZSBjYW5vbmljYWwKLQlyZWxvY3Mgd2VyZSBkb25lLgotCi0JKiBpY29mZi5jIGFkZGVkIHN1cHBvcnQgZm9yIGNhbGxqIGFuZCBiaWcgYW5kIGxpdHRsZQotCWVuaWRpYW4gdGFibGVzLgotCi0JKiBvcG5jbHMuYyBhZGRlZCBjaG1vZCt4aW5nIGZvciBmaWxlcyB3aXRoIEVYRUNfUCBzZXQuCi0KLQkqIHN1bm9zLmMgZml4ZWQgaW5jbHVkZXMuIENoYW5nZWQgZGVmYXVsdCBzZWN0aW9uCi0JYWxpZ25lbWVudCB0byB3b3Jkcy4gRml4ZWQgcmVsb2NhdGlvbiBzdHVmZiB0byB3b3JrIHdpdGgKLQluZXcgc2NoZW1lCi0KLQkqIGJmZC5oIHZhcmlvdXMgbmV3IHR5cGVzIGFkZGVkLCBwcm90b3R5cGUgZm9yIG5ldwotCXJlbG9jIGNhbGxzLCBjaGFuZ2VkIGJmZC0+aW9zdHJlYW0gdG8gYSB2b2lkICoKLQl0byBpbmNsdWRpbmcgZmlsZXMgZG9uJ3QgbmVlZCBzdGRpby5oLgotCi0JKiBsaWJjb2ZmLmggYWRkZWQgY29udmVyc2lvbiB0YWJsZSB0byB0aWUgcmVsb2NzIHRvCi0JY2Fub25pY2FsIHN5bWJvbHMKLQotCSogc3lzZGVwLmggY3JlYXRlZAotCi0JKiBjb2ZmLWNvZGUuaCBmaXhlZCBpbmNsdWRlcy4gQWRkZWQgY29kZSB0byBzdXBwb3J0Ci0JYmlnIGFuZCBsaXR0bGUgZW5kaWFuIGZvcm1hdHMuIFZhcmlvdXMgbGludHMuIEJldHRlcgotCXByb2Nlc3Npbmcgb2Ygc3ltYm9scy4gQ2hhbmdlZCByZWxvYyBzdHVmZiB0byBuZXcKLQlvcmRlcgotCi0JKiBsaWJiZmQuaCBmaXhlZCBpbmNsdWRlcwotCi0KLU1vbiBKYW4gMjEgMTE6NTM6NTEgUFNUIDE5OTEgc3RldmVAY3lnbnVzLmNvbQotCi0JKiBiZmQuaAljaGFuZ2VkIG5hbWUgb2YgYWxpZ25tZW50IGVudHJ5IGluIHNlY19zdHJ1Y3QgdG8KLQlhbGlnbm1lbnRfcG93ZXIsIGJlY2F1c2Ugb2YgY29uZmxpY3RpbmcgdXNlcyB3aXRoaW4gYmZkLgotCU5vdyBpdCBzaG91bGQgYmUgb2J2aW91cyB0aGF0IGl0J3MgYSAyKipuIGFsaWdubWVudAotCXNwZWNpZmllci4gUmVtb3ZlZCBzdGFydF9wYWQsIGVuZF9hbGlnbm1lbnQsIGJsb2NrLCBtaW5zaXplLAotCW91dHB1dF9maWxlX2FsaWdubWVudCwgc3Vic2VjdGlvbl9hbGlnbm1lbnQgYW5kIG9yaWdpbmFsX3ZtYSBmaWVsZHMuCi0JQWRkZWQgYWxpZ25fcG93ZXIoKSBtYWNyby4gRml4ZWQgYmZkX3NlY3Rpb25fYWxpZ25tZW50Ci0JYWNlc3NvciBtYWNyb3MuIEFkZGVkIGJmZF9zeW1ib2xfc2FtZV90YXJnZXQgbWFjcm8uCi0KLQkqIGIub3V0LmMgKGJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cykgZml4ZWQgdG8gdXNlCi0JbmV3IGFsaWdubWVudCBtZW1iZXIuIEZpeGVkIChjYWxsal9jYWxsYmFjaykgdG8gdXNlIHNlY3Rpb24KLQlyZWxhdGl2ZSBzeW1ib2xzIHByb3Blcmx5LgotCi0JKiBzdW5vcy5jIChzdW5vczRfb2JqZWN0X3ApIGZpeGVkIHRvIHVzZSBuZXcgYWxpZ25tZW50X3Bvd2VyLgotCUZpeGVkICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKSB0byBjb3JyZWN0bHkgbWFrZQotCXN5bWJvbHMgc2VjdGlvbiByZWxhdGl2ZS4KLQotCSogYmZkLmMgKGJmZF9lcnJtc2cpIGZpeGVkIHZhcmlvdXMgZW51bSBjYXN0IHByb2JsZW1zLgotCShiZmRfbWFrZV9zZWN0aW9uKSB0b29rIG91dCBpbml0aWFsaXphdGlvbiBvZiBvYnNvbGV0ZSBtZW1iZXJzLgotCShiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKSBhZGRlZAotCi0JKiBvcG5jbHMuYyAoYmZkX2NyZWF0ZSkgY3JlYXRlZC4KLQotCSogY29mZi1jb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vaykgdG9vayBhd2F5IHJlZnMKLQl0byBvYnNvbGV0ZSBtZW1iZXJzLiAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKSBhZGRlZAotCWNvbnZlcnNpb24gYmV0d2VlbiBhbGlnbm1lbnQgdHlwZXMuIChjb2ZmX3N5bWJvbF9mcm9tKQotCWFkZGVkLiAoY29mZl9jb3VudF9saW5lbnVtYmVycykgb25seSBjb3VudHMgbGluZW51bWJlcnMKLQlpZiBzeW1ib2wgaXMgb2YgY29mZi10eXBlLiAoY29mZl9tYW5nbGVfc3ltYm9scykgb25seQotCWhlYXZpbHkgbWFuZ2xlcyBzeW1ib2xzIGlmIHN5bWJvbCBpcyBjb2ZmLXR5cGUuCi0JKGNvZmZfd3JpdGVfc3ltYm9scykgdmFyaW91cyBsaW50cy4gKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotCXZhcmlvdXMgbGludHMgYW5kIG1vZGlmaWNhdGlvbiBmb3IgYWxpZ25tZW50IGNvbnZlcnNpb24uCi0JKGNvZmZfc2x1cnBfcmVsb2NzKSBmaXhlZCBmb3IgdXNlIHdpdGggbmV3IGFzZWN0aW9uIHNoYXBlLgotCi1TYXQgSmFuIDE5IDE2OjEwOjQyIFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KLQotCSogYXJjaGl2ZS5jIGxvdHMgb2YgbGludAotCi0JKiBiLm91dC5jIGFkZGVkIGNhbGxqIHJlbG9jYXRpb24gc3VwcG9ydCwgdXBncmF0ZWQgcmVsb2MgaG93dG8uCi0JRml4ZWQgc28gdGhhdCBhc3ltYm9sIGFuZCByZWxvYyByZWNvcmRzIGFyZSBvdXRwdXQKLQljb3JyZWN0bHkuCi0KLQkqIGJmZC5jIGxvdHMgb2YgbGludCwgc3VwcG9ydCBmb3IgbmV3IGJmZCBlbnRyeSBwb2ludAotCWJmZF9wcmludF9zeW1ib2wuCi0KLQkqIGJmZC5oIGNoYW5nZWQgZGVmaW5pdGlvbiBvZiBhc3ltYm9sIHRvIGNvbnRhaW4gcG9pbnRlciB0bwotCW93bmluZyBiZmQsIHJlbW92ZWQgdGFyZ2V0IGRlcGVuZGVuY2llcy4KLQotCSogY2FjaGUuYyB0b29rIG91dCBwcmludCBzdGF0ZW1lbnRzLCBwdXQgaW4gQkZEX0FTU0VSVCBjYWxscy4KLQotCSogY29mZi1jb2RlLmggdmFyaW91cyBsaW50cywgY29ycmVjdGVkIGxpbmVudW1iZXIgb3V0cHV0Ci0JZnVuY3Rpb25hbGl0eS4gQWRkZWQgc3VwcG9ydCBmb3IgbmV3IHN0eWxlIGFzeW1ib2xzIGFuZAotCWJmZF9wcmludF9zeW1ib2wuIEZpeGVkIHNvIHRoYXQgYXN5bWJvbCBhbmQKLQlyZWxvYyByZWNvcmRzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4gQWRkZWQgdGltZXN0YW1wLgotCi0JKiBpY29mZi5jIEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBob3d0byBzaGFwZS4KLQotCSogbGliYS5vdXQuaCBBZGRlZCBzdXBwb3J0IGZvciBuZXcgYXN5bWJvbCBzaGFwZQotCi0JKiBsaWJiZmQuYyB2YXJpb3VzIGxpbnRzCi0KLQkqIGxpYmJmZC5oIHZhcmlvdXMgbGludHMKLQotCSogbGliY29mZi5oIGFkZGVkIHN1cHBvcnQgZm9yIG5ldyBhc3ltYm9sIHNoYXBlLgotCi0JKiBzdW5vcy5jICB2YXJpb3VzIGxpbnRzLiBBZGRlZCBzdXBwb3J0IGZvciBuZXcgYXN5bWJvbCBzaGFwZQotCWFuZCBiZmRfcHJpbnRfc3ltYm9sLgotCi1XZWQgSmFuIDE2IDIxOjM4OjA5IFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KLQotCSogYi5vdXQuYyByZW1vdmVkIHByb3RvdHlwZSBvZiBzdW5vczRfZW5uYXRpdmF0ZV9zeW10YWIsIGxvdHMgb2YKLQlwb2ludGVyIGxpbnQuIEFkZGVkIHN1cHBvcnQgZm9yIGNhbGxqIHJlbG9jYXRpb24uIEZpeGVkIGJ1ZyB3aGVyZQotCXRoZSBsYXN0IDMyIGJ5dGVzIG9mIHRoZSB0ZXh0IHNlY3Rpb24gd2VyZSBvdmVyd3JpdHRlbiBieSBkYXRhLiBGaXhlZCBidWcKLQl3aGVyZSBhcmNoaXZlcyBvZiBiLm91dCBkaWRuJ3Qgd29yayBkdWUgYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLQlyZXR1cm5pbmcgZmFsc2UuCi0KLQkqIHN1bm9zLmMgYWRkZWQgc3VwcG9ydCBmb3Igbl9vdGhlciBmaWVsZC4gQnJhY2VkIHRoZSBob3d0byB0YWJsZSBzbwotCXRoYXQgaXQgd29uJ3QgYmUgYWZmZWN0ZWQgYnkgYW55IGxlbmd0aGluZyBvZiB0aGUgaG93dG8gc3RydWN0IHR5cGVkZWYuCi0JVmFyaW91cyBsaW50cwotCi0JKiBiZmQuaCBhZGRlZCBzdXBwb3J0IGZvciBuX290aGVyIGZpZWxkLCBhZGRlZCBzcGVjaWFsX2Z1bmN0aW9uCi0JcmVsb2MgdHlwZSwgbW9kaWZpZWQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBwcm90b3R5cGUuIEFkZGVkIGJmZF9oX2dldF94Ci0JbWFjcm9zLgotCi0JKiBiZmQuYyB1cGdyYWRlZCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCB2YXJpb3VzIGxpbnRzLgotCi1XZWQgSmFuIDE2IDAxOjU1OjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBydGwpCi0KLQkqIENoYW5nZUxvZzogIFN0YXJ0ZWQgQ2hhbmdlTG9nIGZvciBCRkQuCi0JKiBUb0RvOiAgQ3JlYXRlIGZpbGUgZm9yIHN1Z2dlc3Rpb25zLgotCi0JKiBNYWtlZmlsZTogIFN1cHBvcnQgZWFzeSBsb2FkaW5nIGludG8gU2FiZXIgQy4KLQlBZGQgZGVwZW5kZW5jaWVzIGZvciBpY29mZi5vIGFuZCBiY3M4OGtjb2ZmLm8uCi0JUmVuYW1lIGNvZmYuYyB0byBjb2ZmLWNvZGUuaC4gIENoYW5nZSBjYWxsZXJzLgotCi0JKiBiZmQuYyAoYmZkX2NoZWNrX2Zvcm1hdCk6ICBBbGxvdyB0aGUgY2hlY2tfZm9ybWF0IHJvdXRpbmVzCi0JdG8gcmV0dXJuIHRoZSBkZXNpcmVkIHRhcmdldCB2ZWN0b3IsIHJhdGhlciB0aGFuIGp1c3QgYSBCb29sZWFuLgotCWJmZC5oIChiZmRfY2hlY2tfZm9ybWF0KTogIENoYW5nZSBmdW5jdGlvbiBwb2ludGVyIHJldHVybiB0eXBlLgotCWFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogIGNoYW5nZSBjYWxsZWUuCi0JYi5vdXQuYyAoYl9vdXRfbGl0dGxlX29iamVjdF9wLCBiX291dF9iaWdfb2JqZWN0X3AsCi0JYl9vdXRfcmVhbF9vYmplY3RfcCk6ICBjaGFuZ2UgY2FsbGVlLgotCWxpYmJmZC5jIChfYmZkX2R1bW15X3RhcmdldCk6ICBEdW1teSByb3V0aW5lIHJlcGxhY2luZyBiZmRfZmFsc2UKLQlpbiBjaGVja19mb3JtYXQgdHJhbnNmZXIgdmVjdG9ycyB0aGF0IG5lZWQgYSBmaWxsZXIuCi0JbGliYmZkLmggKGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXQpOiAgRml4IGRlY2xzLgotCWJjczg4a2NvZmYuYzogIGNoYW5nZSBjYWxsZWUuCi0JY29mZi1jb2RlLmggKGNvZmZfcmVhbF9vYmplY3RfcCwgY29mZl9iaWdfb2JqZWN0X3ApOiAgY2hhbmdlIGNhbGxlZS4KLQlpY29mZi5jOiAgY2hhbmdlIGNhbGxlZS4KLQlzdW5vcy5jIChzdW5vczRfb2JqZWN0X3AsIHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBjaGFuZ2UgY2FsbGVlLgotCi0JKiBsaWJiZmQuYyAoemFsbG9jKTogIEl0IHNob3VsZCBhY3R1YWxseSB6ZXJvIHRoZSBzdG9yYWdlIQotCVRoaXMgd2FzIGNvbW1lbnRlZCBvdXQgZm9yIHNvbWUgcmVhc29uLgotCi0JKiBsaWJiZmQuaDogIEFkZCBtYWxsb2MsIHhtYWxsb2MsIG1lbWNweSwgYW5kIGZhdGFsIGRlY2xzLgotCVRoaXMgaXMgc28gY2FsbGVycyBjYW4gYXZvaWQgPHN0ZGxpYi5oPiB3aGljaCBkb2Vzbid0IGV4aXN0Ci0Jb24gb2xkZXIgc3lzdGVtcy4KLQotCSogYmZkLmMgKG1hcF9vdmVyX3NlY3Rpb25zKTogIEFkZCBkZWJ1Z2dpbmcgY29kZSwgc2luY2UgSQotCW5vdGljZWQgdGhlIHNlY3Rpb24gY291bnQgZm9yIHN1bm9zIGNvcmUgZmlsZXMgd2FzIGJhZCwgYnV0IG9ubHkKLQlHREIgaGFkIGRldGVjdGVkIHRoZSBwcm9ibGVtLgotCShiZmRfc2V0X3NlY3Rpb25fbGluZW5vX3NpemUsIGJmZF9zZXRfc2VjdGlvbl9saW5lbm9zLAotCWJmZF9nZXRfc2VjdGlvbl9saW5lbm9zKTogIFJlbW92ZSBvYnNvbGV0ZSBmdW5jdGlvbnMuCi0JKGJmZF9hcHBseV9yZWxvY2F0aW9ucyk6ICBVc2UgbG9uZ3MsIG5vdCBpbnRzLCBmb3IgdGhlIG1hdGguCi0KLQkqIGJmZC5oOiAgRGVjbGFyZSBlbnVtIGJvb2xlYW4gYW5kIHN0cnVjdCBiZmRfdGFyZ2V0IGFzIHdlbGwKLQlhcyB0eXBlZGVmcyBmb3IgdGhlbS4gIFJlbW92ZSBvYnNvbGV0ZQotCWJmZF9nZXRfc2VjdGlvbl9saW5lbm9fc2l6ZS4KLQotCSogY2FjaGUuYzogIE1ha2UgdGhlICJmZG9wZW4iIHN1cHBvcnQgd29yay4gIEtlZXAgYmV0dGVyIHRyYWNrCi0Jb2YgaG93IG1hbnkgZmlsZXMgYXJlIG9wZW4uICBDZW50cmFsaXplIHRoZSBvcGVuaW5nIG9mIGZpbGVzCi0JYW5kIGJlIHN1cmUgYmZkX29wZW5bcnddIGFjdHVhbGx5IHRyeSB0byBvcGVuIHRoZSBmaWxlLiAgRXZhZGUKLQlsaW5rZWQgbGlzdCBpbml0aWFsaXphdGlvbiBwcm9ibGVtcy4KLQotCSogYi5vdXQuYywgY29mZi1jb2RlLmgsIG9wbmNscy5jLCBzdW5vcy5jOiAgbGludC4KLQotCSogY29mZi1jb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIE51bGwtdGVybWluYXRlIHN5bXRhYiBuYW1lcy4KLQotCSogY3BsdXMtZGVtLmM6ICBEZWxldGUgZmlsZSwgc2luY2UgaXQgaXMgbm90IHBhcnQgb2YgQkZELgotCi0JKiBvcG5jbHMuYyAoYmZkX29wZW5yKTogIEVsaW1pbmF0ZSBtaXNwbGFjZWQgI2lmIDAgY29kZS4KLQkoYmZkX29wZW5yLCBiZmRfb3BlbncpOiAgQWN0dWFsbHkgb3BlbiB0aGUgZmlsZSwgZ2l2ZSBlcnJvciBub3cuCi0KLQkqIHN1bm9zLmMgKHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBTZXQgc2VjdGlvbiBjb3VudC4KLQkoc3Vub3M0X3NldF9zZWN0aW9uX2xpbmVub3MsIHN0YWJfbmFtZXMsIGZwcmludF9uYW1lKTogIEVsaW1pbmlhdGUKLQlvYnNvbGV0ZSBkZWZpbml0aW9ucy4KLQkoX3dyaXRlX3N5bWJvbF90YWJsZSk6ICBJbml0aWFsaXplIDxpZHg+IGNvdW50ZXIuCi0JKGZvb3ApOiAgRWxpbWluYXRlIGRlYnVnZ2luZyBjb2RlLgotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL0NoYW5nZUxvZy05NDk1IGIvYmZkL0NoYW5nZUxvZy05NDk1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODY4NTgzLi4wMDAwMDAwCi0tLSBhL2JmZC9DaGFuZ2VMb2ctOTQ5NQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDQzICswLDAgQEAKLVRodSBEZWMgMjEgMTI6NDM6NDkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBBZGQgYSBwaG9ueSByZWxvYyB0byBoYW5kbGUgdGhlCi0Jb2xkIHN0eWxlIFRPQzE2IHJlZmVyZW5jZXMgd2l0aG91dCB1c2luZyBSX1BQQ19HT1QuCi0JKHBwY19yZWxvY190eXBlKTogRGl0dG8uCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgc3VwcG9ydCBmb3IgVE9DMTYuCi0JKHBwY19lbGZfdG9jMTZfaW5uZXIpOiBSZW5hbWVkIGZyb20gcHBjX2VsZl9nb3QxNl9pbm5lci4KLQkocHBjX2VsZl90b2MxNl9yZWxvYyk6IFJlbmFtZWQgZnJvbSBwcGNfZWxmX3RvYzE2X3JlbG9jLgotCShwcGNfZWxmX2dvdDE2X3tpbm5lcixyZWxvY30pOiBTdHVicyBmb3IgcmVhbCBHT1Qgc3VwcG9ydC4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBOZXcgZnVuY3Rpb24gZm9yIEdPVC9QTFQgc3VwcG9ydCB0aGF0IGlzCi0Jd29yayBpbiBwcm9ncmVzcy4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEaXR0by4KLQkocHBjX2VsZl9hZGp1c3RfZHluaW5keCk6IERpdHRvLgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERpdHRvLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IERpdHRvLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRGl0dG8uCi0JKEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSKTogRGVmaW5lLgotCi1XZWQgRGVjIDIwIDE5OjE0OjE4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoY29weV9wcml2YXRlX2JmZF9kYXRhKTogV2hlbiBhdHRhY2hpbmcgc2VjdGlvbnMgdG8KLQlzZWdtZW50cyBpZ25vcmUgc2VjdGlvbnMgdGhhdCB3b24ndCBiZSBhbGxvY2F0ZWQuICBQYXRjaCBmcm9tCi0JQW5kcmVhcyBTY2h3YWIuCi0KLVR1ZSBEZWMgMTkgMjA6MDE6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IE1hdGNoIG9uIG02OGstY2JtLSogb25seSBpZiBPUyBkb2Vzbid0IG1hdGNoCi0JYW55dGhpbmcgZWxzZS4KLQotVHVlIERlYyAxOSAxNjozODo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChDQUxDX0FEREVORCk6IERlZmluZS4KLQkoY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgdGhlIGlucHV0IHNlY3Rpb24gVk1BIHRvIHRoZQotCWFkZGVuZCBmb3IgUEMgcmVsYXRpdmUgcmVsb2NzLgotCi1TdW4gRGVjIDE3IDIwOjExOjU1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X3BkYXRhKTogTXVzdCB0ZXN0IHRoZSBlbnRpcmUgZW50cnkgZm9yIHplcm8KLQl0byBjb3JyZWN0bHkgdGVybWluYXRlLgotCi1GcmkgRGVjIDE1IDEyOjA1OjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChlbnVtIGJmZF9lbmRpYW4pOiBEZWZpbmUuCi0JKGJmZF90YXJnZXQpOiBSZW5hbWUgYnl0ZW9yZGVyX2JpZ19wIHRvIGJ5dGVvcmRlciwgYW5kIGNoYW5nZSBpdAotCWZyb20gYm9vbGVhbiB0byBlbnVtIGJmZF9lbmRpYW4uICBDaGFuZ2UgaGVhZGVyX2J5dGVvcmRlcl9iaWdfcAotCWNvcnJlc3BvbmRpbmdseS4KLQkqIGJmZC1pbi5oIChiZmRfYmlnX2VuZGlhbiwgYmZkX2xpdHRsZV9lbmRpYW4pOiBOZXcgbWFjcm9zLgotCShiZmRfaGVhZGVyX2JpZ19lbmRpYW4sIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbik6IE5ldyBtYWNyb3MuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBBbGwgdGFyZ2V0czogQ2hhbmdlIGluaXRpYWxpemF0aW9uIG9mIGJ5dGVvcmRlciBhbmQKLQloZWFkZXJfYnl0ZW9yZGVyIHRvIHVzZSBlbnVtIGJmZF9lbmRpYW4gdmFsdWVzIHJhdGhlciB0aGFuCi0JYm9vbGVhbnMuCi0JKiBBbGwgZmlsZXM6IENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBieXRlb3JkZXJfYmlnX3AgYW5kCi0JaGVhZGVyX2J5dGVvcmRlcl9iaWdfcCB0byB1c2UgbmV3IGJmZF8qX2VuZGlhbiBtYWNyb3MuCi0KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogU2V0IGxtYSB0byBzX3BhZGRyLCBub3QKLQlzX3ZhZGRyLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgc19wYWRkciB0byBsbWEsIG5vdAotCXZtYS4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLUZyaSBEZWMgMTUgMDc6MzI6MDkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcGVbaV0taTM4Ni5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IERlZmluZSB0byAnXycuCi0KLVRodSBEZWMgMTQgMTM6NDU6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IExvdHMgb2YgbWlub3IgY2xlYW51cHMuICBNYWtlIG1hbnkgZnVuY3Rpb25zIHJldHVybgotCWVycm9ycyByYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LiAgQWxzbzoKLQkoaWVlZV93cml0ZV90d29ieXRlKTogUmVtb3ZlOyBjaGFuZ2UgY2FsbGVycyB0byBjYWxsIGV4aXN0aW5nCi0JaWVlZV93cml0ZV8yYnl0ZXMgZnVuY3Rpb24uCi0JKGllZWVfd3JpdGVfZXhwcmVzc2lvbik6IERvbid0IG91dHB1dCB0aGUgc2VjdGlvbiB0d2ljZSB3aGVuCi0Jb3V0cHV0dGluZyBhIGxvY2FsIHN5bWJvbC4gIERvbid0IGVtaXQgYW4gZXh0cmFuZW91cyB6ZXJvIGlmIHRoZXJlCi0JaXMgb25seSBvbmUgdGVybS4KLQkoaWVlZV9zbHVycF9zZWN0aW9ucyk6IFNldCB0aGUgbG1hIGFzIHdlbGwgYXMgdGhlIHZtYS4KLQkoaWVlZV9hcmNoaXZlX3ApOiBVc2UgYmZkX2FsbG9jX2dyb3cgcmF0aGVyIHRoYW4gYW4gb2JzdGFjay4KLQotCSogaWhleC5jIChpaGV4X3NldF9hcmNoX21hY2gpOiBEb24ndCBhY2NlcHQgYW55IGFyY2hpdGVjdHVyZSwganVzdAotCWEgcmVjb2duaXplZCBvbmUgb3IgYmZkX2FyY2hfdW5rbm93bi4KLQkoaWhleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogRGVmaW5lIGFzIGJmZF8wbCwgdG8gcGVybWl0IG9iamNvcHkKLQl0byBzdWNjZWVkLgotCShpaGV4X2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQotV2VkIERlYyAxMyAxNTo0NDowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4Lmg6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RhYmxlKTogRGVmaW5lLgotCShzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscyk6IERlZmluZS4KLQkoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSk6IERlZmluZS4KLQkoYW91dF9saW5rX2luY2x1ZGVzX2xvb2t1cCk6IERlZmluZSBtYWNyby4KLQkoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvKTogQWRkIGluY2x1ZGVzIGZpZWxkLgotCShhb3V0X2xpbmtfaW5jbHVkZXNfbmV3ZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IEluaXRpYWxpemUgaW5jbHVkZXMgaGFzaCB0YWJsZS4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBFbGltaW5hdGUgZHVwbGljYXRlIE5fQklOQ0wgZW50cmllcy4KLQotV2VkIERlYyAxMyAxMDo1MjoxNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IE1hdGNoIG9uIG1pcHMtKi0qIGluc3RlYWQgb2YgbWlwcy1pZHQtZWNvZmYuCi0KLVdlZCBEZWMgMTMgMTE6MDc6NDUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiByZW1vdmVkIGRlYnVnZ2luZyBjb2RlLgotCi1UdWUgRGVjIDEyIDE3OjQyOjA2IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X3JlbG9jKTogTmV3IGZ1bmN0aW9uIHRvIGR1bXAgdGhlIC5yZWxvYyBzZWN0aW9uLgotCShwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogY2FsbCBwZV9wcmludF9yZWxvYy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogLnJlbG9jIHNlY3Rpb24gYWxpZ25tZW50LgotCSogY29mZi1wcGMuYyAoaW5fcmVsb2NfcCk6IEFkZGVkIG1pc3Npbmcgbm9uLWVsaWdpYmxlIHJlbG9jcy4gU3BpZmZlZAotCXVwIHNvbWUgZGVidWdnaW5nIGFzIHdlbGwuCi0KLVR1ZSBEZWMgMTIgMTE6MzQ6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBIYW5kbGUgc3BhcmMtKi1lbGYqLiAgRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlCi0JPHJmZ0Btb25rZXlzLmNvbT4uCi0KLUZyaSBEZWMgIDggMTc6NDc6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFNldCBzZWN0aW9uX2NvdW50IHRvIDAKLQl3aGVuIHNldHRpbmcgc2VjdGlvbnMgdG8gTlVMTC4KLQotV2VkIERlYyAgNiAxNzowNTozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChzdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8pOiBBZGQgZXhwb3J0X2RlZmluZWRzCi0JZmllbGQuCi0JKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgZXhwb3J0X2RlZmluZWRzIHBhcmFtZXRlci4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogSWYgZXhwb3J0X2RlZmluZWRzIGlzIHNldCwgc2V0IFhDT0ZGX0VYUE9SVAotCWZvciBhbGwgc3ltYm9scy4KLQkqIGJmZC1pbi5oIChiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gRGVjICA0IDE2OjQwOjQ3IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFJlbW92ZWQgc29tZSBkZWJ1Z2dpbmcgcHJpbnRmJ3MKLQotTW9uIERlYyAgNCAxMToyNTozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGloZXguYyAoaWhleF9zY2FuKTogSGFuZGxlIHJlY29yZCB0eXBlcyA0IGFuZCA1LgotCShpaGV4X29iamVjdF9wKTogUGVybWl0IHR5cGVzIDQgYW5kIDUuCi0JKGloZXhfc2V0X3NlY3Rpb25fY29udGVudHMpOiBSZW1vdmUgY2hlY2sgZm9yIG91dCBvZiByYW5nZQotCWFkZHJlc3Nlcy4KLQkoaWhleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBHZW5lcmF0ZSB0eXBlcyA0IGFuZCA1LgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBKdXN0IGlnbm9yZSB3YXJuaW5nIGFuZAotCWluZGlyZWN0IHJlZmVyZW5jZXMgdG8gc3ltYm9scyB3aGljaCBkb24ndCByZWFsbHkgZXhpc3QuCi0KLVN1biBEZWMgIDMgMTk6MDA6MjcgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBNaW5vciBmb3JtYXQgZml4ZXMKLQkocGVfcHJpbnRfZWRhdGEpOiBOZXcgZnVuY3Rpb24uIFVuZGVyIHByaXZhdGUgcHJpbnRpbmcsIHRoaXMgZm9ybWF0cwotCXRoZSBlZGF0YSBzZWN0aW9uIG9mIGEgUEUgZmlsZS4KLQkocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZGVkIGNhbGwgdG8gcGVfcHJpbnRfZWRhdGEuCi0KLVN1biBEZWMgIDMgMTY6NDY6NTQgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBhb3V0LWFybS5jIChNWV9zd2FwX3N0ZF9yZWxvY19vdXQpOiBVc2UgS0VFUElUIHRvIGdldCB0aGUgc3ltYm9sCi0JaW5kZXgsIGRvbid0IGNhbGwgc3RvaS4KLQotRnJpIERlYyAgMSAxNDo0Njo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogU2V0IGxtYSBhcyB3ZWxsIGFzIHZtYS4KLQotCSogaWhleC5jOiBOZXcgZmlsZTsgc3VwcG9ydCBmb3IgSW50ZWwgSGV4IGZvcm1hdC4KLQkqIHRhcmdldHMuYyAoZW51bSBiZmRfZmxhdm91cik6IEFkZCBiZmRfdGFyZ2V0X2loZXhfZmxhdm91ci4KLQkoaWhleF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFsd2F5cyBpbmNsdWRlIGloZXhfdmVjLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIGloZXhfZGF0YSBmaWVsZCB0byB0ZGF0YSB1bmlvbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0xJQlMpOiBBZGQgaWhleC5vCi0JKEJGRF9MSUJTX0NGSUxFUyk6IEFkZCBpaGV4LmMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogU29ydCB0aGUgc2VjdGlvbnMgaW4KLQllYWNoIHNlZ21lbnQuCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogUmV0dXJuIHRoZSByaWdodCBzaXplIGlmIHNlZ21lbnRfbWFwIGlzCi0Jbm90IE5VTEwuCi0JKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IGJvdGhlciB0byBzb3J0IHRoZSBzZWN0aW9ucy4KLQotCSogYmZkLmMgKGJmZF9yZWNvcmRfcGhkcik6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfcmVjb3JkX3BoZHIpOiBEZWNsYXJlLgotCSogYmZkX2luMi5oOiBSZWJ1aWxkLgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIGJvZ3VzCi0JQkZEX0FTU0VSVC4KLQotCSogbGliYmZkLmMgKGJmZF9tYWxsb2MsIGJmZF9yZWFsbG9jKTogTmV3IGZ1bmN0aW9ucy4KLQkoYmZkX3ptYWxsb2MpOiBSZXR1cm4gUFRSLCBub3QgY2hhciAqLiAgVGFrZSBzaXplX3QsIG5vdAotCWJmZF9zaXplX3R5cGUuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX21hbGxvYywgYmZkX3JlYWxsb2MpOiBEZWNsYXJlLgotCShiZmRfem1hbGxvYyk6IENoYW5nZSBkZWNsYXJhdGlvbi4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogTWFueSBmaWxlczogVXNlIGJmZF9tYWxsb2MgYW5kIGJmZF9yZWFsbG9jIHJhdGhlciB0aGFuIG1hbGxvYwotCWFuZCByZWFsbG9jLiAgRG9uJ3Qgc2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgdGhleSBmYWlsLgotCi1UaHUgTm92IDMwIDE5OjMyOjI2IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jOiBBZGRlZCBtYWNyb3MgdG8gdGlkeSB1cCB0b2MgY2VsbCB0cmVhdG1lbnQuIE51bWVyb3VzCi0JdXNlcyBhcyB3ZWxsLiBBZGRlZCBhIG5ldyBob3d0byB0byBkZWFsIHdpdGggVE9DUkVMMTYgcmVsb2NzIHRoYXQKLQlhcmUgVE9DREVGTiBhcyB3ZWxsLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogRXhwYW5kZWQgdHJlYXRtZW50IG9mIEFERFIzMk5CIHJlbG9jcwotCXRvIGhhbmRsZSBSVkEgcmVsb2NzIGZyb20gZGxsdG9vbC4KLQkocHBjX2NvZmZfcnR5cGUyaG93dG8pOiBUT0NERUZOIHJlbG9jIGFkZGl0aW9uLgotCShjb2ZmX3BwY19ydHlwZV90b19ob3d0byk6IFRPQ0RFRk4gcmVsb2MgYWRkaXRpb24uCi0JKHBwY19jb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogVE9DREVGTiByZWxvYyBhZGRpdGlvbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBjaGVjayBpZGF0YSRYIHNlY3Rpb25zCi0JdG8gZ2V0IHRoZSByaWdodCBzZWN0aW9uIGFsaWdubWVudC4KLQotVGh1IE5vdiAzMCAxNjo0ODoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3Qgc2V0IGxtYSBiYXNlZCBvbgotCXBfcGFkZHIgaWYgcF9wYWRkciBpcyB6ZXJvLgotCShtYWtlX21hcHBpbmcpOiBTZXQgaW5jbHVkZXNfZmlsZWhkciBhbmQgaW5jbHVkZXNfcGhkcnMgZm9yIGZpcnN0Ci0JUFRfTE9BRCBzZWdtZW50LgotCShtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBTZXQgaW5jbHVkZXNfcGhkcnMgZm9yIFBUX1BIRFIKLQlzZWdtZW50LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSGFuZGxlIGluY2x1ZGVzX2ZpbGVoZHIgYW5kCi0JaW5jbHVkZXNfcGhkcnMuICBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZiBQVF9QSERSIGFuZCBmaXJzdAotCVBUX0xPQUQgc2VnbWVudHMuCi0JKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFNldCBpbmNsdWRlc19maWxlaGRyIGFuZCBpbmNsdWRlc19waGRyCi0Jd2hlbiBhcHByb3ByaWF0ZS4gIFJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIG9mIFBUX1BIRFIgc2VnbWVudC4KLQlVc2UgYSBtb3JlIGNvbXBsZXggY29uZGl0aW9uIGZvciB3aGVuIGEgc2VjdGlvbiBpcyBpbmNsdWRlZCBpbiBhCi0Jc2VnbWVudCB0byBoYW5kbGUgU29sYXJpcyBsaW5rZXIgb2RkaXRpZXMuCi0KLVRodSBOb3YgMzAgMTE6MTc6MzMgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNvZmYtbTg4ay5jIChob3d0b190YWJsZSk6IFJlZm9ybWF0dGVkIGZvciBlYXNpZXIgcmVhZGluZzsKLQlzcGVjaWFsX2Z1bmN0aW9uIG5vdyBwb2ludHMgdG8gbmV3IGZ1bmN0aW9uIG04OGtfc3BlY2lhbF9yZWxvYy4KLQkoaG93dG9faHZydDE2KTogRnVuY3Rpb24gcHJldmlvdXNseSB1c2VkIGZvciBoYW5kbGluZyBIVlJUMTYgcmVsb2NzCi0JcmVtb3ZlZC4KLQkocnR5cGUyaG93dG8pOiBEbyBub3QgYWRkIHJlbG9jJ3Mgcl9vZmZzZXQgdG8gdGhlIGFkZGVuZCwgdGhpcyB3aWxsCi0JYmUgZG9uZSBjb3JyZWN0bHkgYnkgbTg4a19zcGVjaWFsX3JlbG9jLgotCShyZWxvY19wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uIHRvIGJlIHVzZWQgYnkgUkVMT0NfUFJPQ0VTU0lORy4KLQkoUkVMT0NfUFJPQ0VTU0lORyk6IERlZmluZSB0byBjYWxsIHJlbG9jX3Byb2Nlc3NpbmcuCi0KLVdlZCBOb3YgMjkgMTI6NDI6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogQ2FsbCBtYWxsb2MgcmF0aGVyIHRoYW4geG1hbGxvYy4KLQkocGVfcHJpbnRfcGRhdGEpOiBMaWtld2lzZS4KLQotCSogb3BuY2xzLmMgKGJmZF9hbGxvY19ieV9zaXplX3QpOiBTZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZgotCW9ic3RhY2tfYWxsb2MgZmFpbHMuCi0JKGJmZF9hbGxvY19maW5pc2gpOiBTZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZiBvYnN0YWNrX2ZpbmlzaAotCWZhaWxzLgotCSogbGliYmZkLmMgKGJmZF96bWFsbG9jKTogU2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgbWFsbG9jIGZhaWxzLgotCSogTWFueSBmaWxlczogZG9uJ3Qgc2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgb25lIG9mIHRoZSBhYm92ZQotCXJvdXRpbmVzIGZhaWxzLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IERvbid0IGFkanVzdCBwX3BhZGRyCi0JaWYgcF9wYWRkcl92YWxpZCBpcyBzZXQuCi0JKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDYWxsIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YS4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBGaXggY2FzZSB3aGVyZSBleHRyYQotCXByb2dyYW0gaGVhZGVycyB3ZXJlIGFsbG9jYXRlZC4KLQotCSogZWxmLmMgKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWNsYXJlLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSB0bwotCV9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19pbik6IERvbid0IGFib3J0IGlmCi0Jcl9zeW1uZHggaXMgUkVMT0NfU0VDVElPTl9OT05FIGZvciBhbiBBTFBIQV9SX0lHTk9SRSByZWxvYy4KLQlDaGFuZ2UgYSBSRUxPQ19TRUNUSU9OX0xJVEEgc3ltbmR4IHRvIFJFTE9DX1NFQ1RJT05fQUJTLgotCShhbHBoYV9lY29mZl9zd2FwX3JlbG9jX291dCk6IENoYW5nZSBSRUxPQ19TRUNUSU9OX0FCUyB0bwotCVJFTE9DX1NFQ1RJT05fTElUQSBmb3IgQUxQSEFfUl9JR05PUkUuCi0JKGFscGhhX2FkanVzdF9yZWxvY19vdXQpOiBGb3IgQUxQSEFfUl9JR05PUkUsIGRvbid0IGNoYW5nZQotCVJFTE9DX1NFQ1RJT05fQUJTIHRvIFJFTE9DX1NFQ1RJT05fTk9ORS4KLQotVHVlIE5vdiAyOCAxNjo1OTo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgc2VnbWVudF9tYXAgZmllbGQuCi0JKiBlbGYuYyAobWFrZV9tYXBwaW5nKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX3NvcnRfc2VjdGlvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBSZW1vdmUuCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogUmVtb3ZlIHNvcnRlZF9oZHJzLCBjb3VudCwgYW5kCi0JbWF4cGFnZXNpemUgcGFyYW1ldGVycy4gIFNpbXBsaWZ5LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFdoZW4gZ2VuZXJhdGluZyBhbgotCWV4ZWN1dGFibGUsIHVzZSBhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzLgotCShlbGZfc29ydF9oZHJzKTogUmVtb3ZlLgotCShfYmZkX2VsZl9zaXplb2ZfaGVhZGVycyk6IFJlbW92ZSBlbGltaW5hdGVkIHBhcmFtZXRlcnMgZnJvbSBjYWxsCi0JdG8gZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUuCi0KLU1vbiBOb3YgMjcgMTI6Mjc6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBocDMwMGhwdXguYyAoTVkoY2FsbGJhY2spKTogU2V0IGxtYSBhcyB3ZWxsIGFzIHZtYS4KLQotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjcuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5KTogU2V0IGNvcnJlY3RseSwgdG8gMS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSk6IFNldCBjb3JyZWN0bHksIHRvIDAuCi0KLVdlZCBOb3YgMjIgMTI6MDI6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBIYW5kbGUgLnJjb25zdCBzZWN0aW9uLgotCShlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogSGFuZGxlIFNUWVBfUkNPTlNULgotCShlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBIYW5kbGUgc2NSQ29uc3QuCi0JKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogSGFuZGxlIFJFTE9DX1NFQ1RJT05fUkNPTlNULgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBIYW5kbGUgLnJjb25zdCBzZWN0aW9uLgotCShfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCShlY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IEhhbmRsZSBzY1JDb25zdC4KLQkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBIYW5kbGUgLnJjb25zdCBzZWN0aW9uLgotCShlY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBIYW5kbGUgc2NSQ29uc3QuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MpOiBIYW5kbGUgLnJjb25zdAotCXNlY3Rpb24uCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUkVMT0NfU0VDVElPTl9SQ09OU1QuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBPbmx5IHNldCB3cml0dGVuIGlmIHRoZQotCURFRl9EWU5BTUlDIGZsYWcgaXMgc2V0LgotCi1UdWUgTm92IDIxIDEzOjI1OjI5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBob3N0LWFvdXQuYzogSWYgVFJBRF9IRUFERVIgaXMgZGVmaW5lZCwgaW5jbHVkZSBpdC4KLQotVHVlIE5vdiAyMSAxMzowMzo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKEFDX1BST0dfQ0MpOiBSZW1vdmUgbG9jYWwgZGVmaW5pdGlvbi4KLQkoQkZEX0JJTkFSWV9GT1BFTik6IFJlcXVpcmUgQUNfQ0FOT05JQ0FMX1NZU1RFTS4KLQkoQkZEX05FRURfREVDTEFSQVRJT04pOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWd1cmUuaW46IFVzZSBCRkRfTkVFRF9ERUNMQVJBVElPTi4KLQkqIGFjY29uZmlnLmg6IFB1dCBORUVEX0RFQ0xBUkFUSU9OXyogaW4gQFRPUEAgc2VjdGlvbi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi42LgotCi0JKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENsZWFyCi0Jc3BlY2lhbF9zZWN0aW9ucyBiZWZvcmUgcmV0dXJuaW5nIHdoZW4gY2FsbGVkIHdpdGggYSBub24gWENPRkYKLQlCRkQuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogU29ydCBjb21tb24gc3ltYm9scyB3aXRoCi0JZ2xvYmFsIHN5bWJvbHMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogT25seSBwYWQgdGhlCi0JcHJldmlvdXMgc2VjdGlvbiB0byBmb3JjZSBmaWxlIGFsaWdubWVudCB3aGVuIGNyZWF0aW5nIGFuCi0JZXhlY3V0YWJsZS4KLQotTW9uIE5vdiAyMCAxNDo1NDowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYKLQlSUzYwMDBDT0ZGX0MsIHNldCB1cCB0aGUgLmRlYnVnIHNlY3Rpb24uCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IEFkanVzdCB0aGUgVE9DIGFuY2hvciB2YWx1ZQotCWlmIGl0IGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gYWNjb21vZGF0ZSB0aGUgZW50aXJlIFRPQyBhcmVhIHdpdGgKLQlzaWduZWQgMTYgYml0IG9mZnNldHMuCi0JKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBIYW5kbGUgbmVnYXRpdmUgVE9DIG9mZnNldHMgaW4gZ2xvYmFsCi0JbGlua2FnZSBjb2RlLgotCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRqdXN0IHJlbG9jYXRpb25zIGFnYWluc3QgYQotCVRPQyBhbmNob3IgdG8gdXNlIHRoZSBUT0MgdmFsdWUgdXNlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLVNhdCBOb3YgMTggMTg6MDE6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IENhc3QgbWFsbG9jIHJldHVybi4KLQkoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogTGlrZXdpc2UuCi0KLVNhdCBOb3YgMTggMTk6NDM6MDQgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBwZS1hcm0uYzogRml4IHR5cG9zLgotCSogY29mZi1hcm0uYzogTGlrZXdpc2UuCi0KLUZyaSBOb3YgMTcgMTY6MjI6MDQgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGxpc3RfZWxlKTogQWRkZWQgImNhdCJlZ29yeSBtZW1iZXIuCi0JKHJlY29yZF90b2MpOiBOZXcgY2F0ZWdvcnkgcGFyYW1ldGVyIChwcml2IG9yIHB1YikuCi0JKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogQ2hlY2sgdG8gc2VlIGlmIHRvYyBib3VuZHMgZXhjZWVkZWQuCi0JKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogUmVtb3ZlZCBlbWJyaW9uaWMgZGF0YS1pbi10b2MgZnJvbQotCXRoZSBtYWlubGluZS4gSXQgYWRkZXMgZXh0cmEgdG9jIGNlbGxzIGluIGVycm9yLgotCShwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rKTogQWRkZWQgc29tZSBkb2N1bWVudGF0aW9uLgotCShkdW1wX3RvYyk6IENhbiBub3cgZGlhZ25vc2UgInZpcnR1YWwgdG9jIiBjaGljYW5lcnkuCi0KLUZyaSBOb3YgMTcgMTA6NDE6MjUgMTk5NSAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IENoYW5nZSB0eXBlIG9mCi0JZHluc3ltY291bnQgYW5kIGJ1Y2tldGNvdW50IGZpZWxkcyBmcm9tIHNpemVfdCB0byBiZmRfc2l6ZV90eXBlLgotCi1GcmkgTm92IDE3IDEwOjAyOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9wb2ludGVyaXplX2F1eF9ob29rKTogSTk2MCB2ZXJzaW9uOiBkb24ndAotCXBvaW50ZXJpemUgQ19MRUFGU1RBVCBvciBDX0xFQUZFWFQgZW50cmllcy4KLQotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IE9ubHkgY3JlYXRlCi0JRFRfSU5JVCBhbmQgRFRfRklOSSBlbnRyaWVzIGlmIHRoZSBfaW5pdCBvciBfZmluaSBzeW1ib2wgaXMKLQlkZWZpbmVkIG9yIG1lbnRpb25lZCBpbiBhIHJlZ3VsYXIgZmlsZS4KLQotVGh1IE5vdiAxNiAxNToxNjo0MiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocHBjX3JlY29yZF9kYXRhX2luX3RvY19lbnRyeSk6IG5ldyBmdW5jdGlvbgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFRPQ0RFRk4gYXR0cmlidXRlCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IFJFTDI0IGhhbmRsaW5nCi0JKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogQ29ycmVjdCBUT0NERUZOIGhhbmRsaW5nCi0KLQkqIHBlaWNvZGUuaCAoZGlyX25hbWVzKTogQWRkZWQgbmFtZSBkZXNjcmlwdGlvbnMKLQotVGh1IE5vdiAxNiAwMzozODowMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogVkVSU0lPTjogVXBkYXRlZCB0byBjeWdudXMtMi42LgotCi1XZWQgTm92IDE1IDE5OjMwOjA3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKG02OGs0a25ldGJzZF92ZWMpOiBEZWNsYXJlLgotCi1XZWQgTm92IDE1IDE4OjA1OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQ2hhbmdlIHR5cGUgb2Ygc2Vjb25kIGFyZ3VtZW50IHRvCi0JX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIGZyb20gdm9pZCAqIHRvIFBUUi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBDYXN0Ci0JdXNpbmcgUFRSIHJhdGhlciB0aGFuIHZvaWQgKi4KLQkqIGJmZC1pbjIsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogcGVpY29kZS5oIChwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQ2hhbmdlIHZmaWxlIGZyb20gdm9pZCAqCi0JdG8gUFRSLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSBhcwotCV9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSByYXRoZXIgdGhhbiBjYXN0aW5nCi0JYmZkX3RydWUuCi0KLVdlZCBOb3YgMTUgMDQ6MDk6MTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICguZGVwMSk6IEZpeCBzdHVwaWQgdHlwbyBpbiBsYXN0IGNoYW5nZS4gIFJlbW92ZSBhbnkKLQkiRE8gTk9UIERFTEVURSIgbGluZXMgb3IgYmxhbmsgbGluZXMgdGhhdCBta2RlcCB3cml0ZXMgb24gc29tZQotCXN5c3RlbXMuCi0JKEJGRF9MSUJTX0NGSUxFUywgQUxMX01BQ0hJTkVTX0NGSUxFUywgQkZEMzJfQkFDS0VORFNfQ0ZJTEVTLAotCUJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKENGSUxFUyk6IFVzZSB0aGVtLgotCi1UdWUgTm92IDE0IDExOjUyOjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBGb3IgUFBDIFBFLCBzdGFydCBpc2l6ZSBhdCAwLAotCW5vdCBhdCB0aGUgZmlsZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQXZvaWQgdXNpbmcKLQl1bnBvcnRhYmxlICNlbGlmLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFdoZW4gZ2VuZXJhdGluZyBhIFBQQyBQRSBleGVjdXRhYmxlCi0Jd2l0aCBubyBzeW1ib2xzLCByb3VuZCB1cCB0aGUgZmlsZSBzaXplIHRvIGEgQ09GRl9QQUdFX1NJWkUKLQlib3VuZGFyeS4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsCi0JZG9uJ3Qgd3JpdGUgb3V0IGEgc3RyaW5nIHRhYmxlLgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogV2hlbiB1c2luZyBhIGRpZmZlcmVudCBzZWN0aW9uCi0JaGVhZGVyLCBwYXNzIHRoZSBuZXcgb25lIHRvIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHNoX2luZm8gYW5kIHNoX2VudHNpemUgZmllbGRzLgotCShlbGZfbWFwX3N5bWJvbHMpOiBBZGQgc2VjdGlvbiBWTUEgdG8gc3ltYm9sIHZhbHVlIHdoZW4gY29tcGFyaW5nCi0JYWdhaW5zdCAwLgotCShfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBPbmx5IGJ1aWxkIHN5bWJvbCB0YWJsZQotCWlmIHRoZXJlIGFyZSBzb21lIHN5bWJvbHMuICBTZXQgZmlsZSBvZmZzZXQgb2Ygc3ltdGFiIGFuZCBzdHJ0YWIKLQlzZWN0aW9ucy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBSZW1vdmUgZG9zeW1zIHBhcmFtZXRlci4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuICBOZXZlciBzZXQgZmlsZSBvZmZzZXQgb2Ygc3ltdGFiIGFuZCBzdHJ0YWIKLQlzZWN0aW9ucy4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoTUFQX09ORVNZTVRBQiwgTUFQX0RZTlNZTVRBQiwgTUFQX1NUUlRBQiwgTUFQX1NIU1RSVEFCKTogRGVmaW5lLgotCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKHN3YXBfb3V0X3N5bXMpOiBDaGVjayBmb3Igc3BlY2lhbCBtYXBwaW5nIG9mIHN0X3NobmR4IGNyZWF0ZWQgYnkKLQljb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEuCi0JKiBlbGZ4eC10YXJnZXQuaDogVXNlIG5ldyBjb3B5IHJvdXRpbmVzLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogRGVjbGFyZS4KLQotCSogY29uZmlnLmJmZCAoc2gtKi0qKTogU2V0IHRhcmdfZGVmdmVjIHRvIHNoY29mZl92ZWMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgQ09GRl9XSVRIX1BFLCBoYW5kbGUKLQlDX05UX1dFQUsuCi0KLQkqIGNvZmYtc2guYyAoc2hsY29mZl92ZWMpOiBVc2UgX2JmZF9nZW5lcmljX2FyY2hpdmVfcCwgbm90Ci0JX2JmZF9kdW1teV90YXJnZXQsIG1hdGNoaW5nIHRoZSByZWNlbnQgY2hhbmdlIHRvIGFyY2hpdmUKLQlyZWNvZ25pdGlvbi4KLQotTW9uIE5vdiAxMyAxMzoyNDozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogVXNlIGNhc3RzIHRvIGF2b2lkIGRvaW5nCi0JYXJpdGhtZXRpYyBvbiBQVFIgdHlwZXMuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IFNldCB0aGUgbG1hIG9mIHRoZSBzZWN0aW9ucy4KLQotCSogZWNvZmYuYyAoZWNvZmZfcmVsb2NfbGlua19vcmRlcik6IFR1cm4gYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZAotCXN5bWJvbCBpbnRvIGEgcmVsb2MgYWdhaW5zdCB0aGUgc2VjdGlvbi4KLQotTW9uIE5vdiAxMyAwNzozMTozNSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocHBjX2NvZmZfbGlua19oYXNoX2VudHJ5KTogYWRkZWQgc3VwcG9ydCBmb3IgaW5saW5lCi0JZ2x1ZSBmb3IgdGhlIHJlbG9jczogSU1HTFVFIGFuZCBJRkdMVUUuCi0JKHJlY29yZF90b2MpOiBuZXcgZnVuY3Rpb24gLSB0cmFja3MgdG9jIGNvbnRlbnRzCi0JKHBwY19tYXJrX3N5bWJvbF9hc19nbHVlKTogbmV3IGZ1bmN0aW9uIC0gc3VwcG9ydHMgdGhlIElNR0xVRSByZWxvYwotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogQWRkZWQgc3VwcG9ydCBhbmQgZml4ZXMgZm9yIElNR0xVRS9JRkdMVUUKLQkocHBjX2NvZmZfcnR5cGUyaG93dG8pOiByZW1vdmVkIGludmFsaWQgSU1HTFVFIGhhY2sKLQkoY29mZl9wcGNfcnR5cGVfdG9faG93dG8pOiByZW1vdmVkIGludmFsaWQgSU1HTFVFIGhhY2sKLQkocHBjX3JlY29yZF90b2NfZW50cnkpOiBSZW1vdmVkIGEgZGVidWcgZGVmaW5lIChkdWgpCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBGaXhlZCBpbnZhbGlkIHN0cmNtcCBmb3IgIi5yZWxkYXRhIgotCShwZV9wcmludF9pZGF0YSk6IE5ldyBmdW5jdGlvbiAtIGZvcm1hdHMgdGhlIGlkYXRhIHNlY3Rpb24gZGF0YQotCShwZV9wcmludF9wZGF0YSk6IE5ldyBmdW5jdGlvbiAtIGZvcm1hdHMgdGhlIHBkYXRhIHNlY3Rpb24gZGF0YQotCShwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogY2FsbHMgdG8gYWJvdmUKLQotU3VuIE5vdiAxMiAxMjoyMzoyNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChiZmRfbGlic19oZXJlLCBldGMpOiBQcm92aWRlIGVtcHR5IGRlZmluaXRpb25zLgotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl92ZWMpOiBBZGQgY29uZGl0aW9uYWwgZGVmaW5lcwotCVRBUkdFVF9TWU0gYW5kIFRBUkdFVF9OQU1FIGZvciB2ZWN0b3IgYW5kIEJGRCBuYW1lLgotCSogY29mZi1wbWFjLmMgKHBtYWNfeGNvZmZfdmVjKTogUmVtb3ZlLgotCShUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSBbUE9XRVJNQUNdOiBTZXQgdGhlCi0JbWFjaGluZSB0byAwLCBub3QgYWxsIFBvd2VyTWFjcyBhcmUgNjAxcy4KLQotRnJpIE5vdiAxMCAxMjoxMDoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogUmVhZCBpbiBhbnkgcHJvZ3JhbSBoZWFkZXJzLgotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBBZGp1c3Qgc2VjdGlvbiBsbWEKLQliYXNlZCBvbiB0aGUgcHJvZ3JhbSBoZWFkZXJzLCBpZiBhbnkuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogU2V0IHNoX2FkZHIgZnJvbSB0aGUgdm1hLCBub3QgdGhlIGxtYS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBTZXQgcF9wYWRkciBvZiBwcm9ncmFtIGhlYWRlcnMgYmFzZWQgb24KLQl0aGUgbG1hLgotCi1UaHUgTm92ICA5IDEzOjAxOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBQcmVzZXJ2ZSB0ZGF0YSBpbiBjYXNlIG9mCi0JZmFpbHVyZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogUmVwb3J0IGEgcmVhc29uYWJsZSBlcnJvciB3aGVuCi0JdHJ5aW5nIHRvIGRvIGEgcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCBhIG5vbi1hLm91dCBvYmplY3QgZmlsZS4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBDaGVjayB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUKLQlpbiBhbiBhcmNoaXZlIGV2ZW4gaWYgdGFyZ2V0X2RlZmF1bHRlZCBpcyBzZXQuICBJZiB0aGUgb2JqZWN0IGZpbGUKLQloYXMgdGhlIHdyb25nIHh2ZWMsIHJlamVjdCBpdC4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSk6IElmIGEgc2VjdGlvbiBjYW4gbm90Ci0JYmUgcmVwcmVzZW50ZWQsIHJlcG9ydCB0aGUgbmFtZSB2aWEgX2JmZF9lcnJvcl9oYW5kbGVyLgotCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFdyaXRlIFJTNjAwMENPRkZfQyB2ZXJzaW9uCi0Jd2hpY2ggY2hlY2tzIGZvciBTVFlQX09WUkZMTyBzZWN0aW9ucy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZQotCXJlbG9jIGFuZCBsaW5lbm8gY291bnQgb3ZlcmZsb3dzLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgY29mZl9jb3VudF9saW5lbnVtYmVycyBiZWZvcmUKLQljb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gIElmIFJTNjAwMENPRkZfQywgaGFuZGxlCi0JcmVsb2MgYW5kIGxpbmVubyBjb3VudCBvdmVyZmxvd3MuCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IENvdW50IGxpbmUgbnVtYmVycyBhbmQKLQlyZWxvY3MgYmVmb3JlIGRlYWxpbmcgd2l0aCAucGFkIHNlY3Rpb25zLiAgQ291bnQgb3ZlcmZsb3cgc2VjdGlvbgotCWhlYWRlcnMgd2hlbiBoYW5kbGluZyAucGFkIHNlY3Rpb25zLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBhLm91dCB2c3RhbXAgdG8gMQotCWlmIFJTNjAwMENPRkZfQy4KLQotCSogeGNvZmZsaW5rLmMgKFhDT0ZGX0RFU0NSSVBUT1IpOiBEZWZpbmUuCi0JKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgZGVzY3JpcHRvcl9zZWN0aW9uIGFuZAotCXNwZWNpYWxfc2VjdGlvbnMgZmllbGRzLgotCShfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogU2V0IGxpbmthZ2Ugc2VjdGlvbiBhbGlnbm1lbnQuICBDcmVhdGUKLQlkZXNjcmlwdG9yIHNlY3Rpb24uICBDaGVjayBmb3IgbWFnaWMgc3ltYm9sIG5hbWVzIChfdGV4dCwgZXRjLiksCi0JYW5kIHJlY29yZCB0aGVtIGluIHNwZWNpYWxfc2VjdGlvbnMgaWYgZm91bmQuICBTZXQKLQlYQ09GRl9ERVNDUklQVE9SIGZsYWcgZm9yIGEgZnVuY3Rpb24gZGVzY3JpcHRvciwgYW5kIHNldCBpdHMKLQlkZXNjcmlwdG9yIGZpZWxkIHRvIHBvaW50IGJhY2sgdG8gdGhlIGZ1bmN0aW9uIGNvZGUgc3ltYm9sLgotCSh4Y29mZl9zd2VlcCk6IEFsd2F5cyBtYXJrIHRoZSBzcGVjaWFsIGRlc2NyaXB0b3Jfc2VjdGlvbi4KLQkoYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wpOiBDaGVjayB3aGV0aGVyIHRoZSBzeW1ib2wgbWlnaHQgYmUgYQotCWZ1bmN0aW9uIGRlc2NyaXB0b3IsIGFuZCBtYXJrIGl0IGlmIGl0IGlzLgotCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIG5ldyBzcGVjaWFsX3NlY3Rpb25zCi0JcGFyYW1ldGVyLCBhbmQgZmlsbCBpdCBpbi4gIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZGVzY3JpcHRvcgotCXNlY3Rpb24uCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IFNldCBYQ09GRl9ERUZfUkVHVUxBUiBmbGFnIHdoZW4gZGVmaW5pbmcKLQlnbG9iYWwgbGlua2FnZSBjb2RlLiAgSWYgYW4gdW5kZWZpbmVkIGZ1bmN0aW9uIGRlc2NyaXB0b3IgaXMKLQlleHBvcnRlZCwgYXJyYW5nZSB0byBkZWZpbmUgaXQuICBXYXJuIGFib3V0IGFueSBvdGhlciB1bmRlZmluZWQKLQlleHBvcnRlZCBzeW1ib2wuCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgdGhlIGRlc2NyaXB0b3Igc2VjdGlvbi4KLQkoeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IENyZWF0ZSBhIGZ1bmN0aW9uIGRlc2NyaXB0b3Igd2hlbgotCW5lY2Vzc2FyeS4KLQkqIGJmZC1pbi5oIChiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1UaHUgTm92ICA5IDA4OjQwOjIzIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfY29mZl9saW5rX2hhc2hfZW50cnkpOiBuZXcgdHlwZXMgZm9yIGhhc2hpbmcKLQkocHBjX2NvZmZfbGlua19oYXNoX3RhYmxlKTogbmV3IHR5cGVzIGZvciBoYXNoaW5nCi0JKHBwY19jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogaGFzaCBlbnRyeSBjb25zdHJ1Y3RvcgotCShwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IGhhc2ggdGFibGUgaW5pdGlhbGl6ZXIKLQkocHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IGhhc2ggdGFibGUgY29uc3RydWN0b3IKLQkocHBjX3JlY29yZF90b2NfZW50cnkpOiBjaGFuZ2VkIHJlZmVyZW5jZXMgdG8gaGFzaCB0YWJsZQotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogY2hhbmdlZCByZWZlcmVuY2VzIHRvIGhhc2ggdGFibGUKLQotCSogbGliY29mZi1pbi5oIChjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IHJlbW92ZWQgdG9jX29mZnNldAotCSogbGliY29mZi5oOiBSZWJ1aWxkCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IHJlbW92ZWQgdG9jX29mZnNldCBpbml0Ci0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IHJlbW92ZWQgdG9jX29mZnNldCBpbml0Ci0KLVRodSBOb3YgIDkgMDQ6MDA6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICguZGVwMSk6IE1ha2Ugc3VyZSB0aGUgZmlsZSBta2RlcCBpcyB0byB3cml0ZSBleGlzdHMKLQlmaXJzdC4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBuZXcgb3B0aW9uIC0td2l0aFtvdXRdLW1tYXAuICBTZXQgVVNFX01NQVAKLQlpZiBpdCBpcyBnaXZlbiBhbmQgbW1lcCBpcyBhdmFpbGFibGUuCi0JKiBhY2NvbmZpZy5oOiBVbmRlZiBVU0VfTU1BUC4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWdlbmVyYXRlZC4KLQkqIGFvdXR4Lmg6IElmIFVTRV9NTUFQIGlzIG5vdCBkZWZpbmVkLCBkbyBhbGwgc3ltYm9sIGFuZCBzdHJpbmcKLQl0YWJsZSBoYW5kbGluZyB0aGUgb2xkIHdheS4KLQkoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IERvbid0IGNvbXBsYWluIGlmIGxhc3QgYnl0ZSBvZiBzdHJpbmcKLQl0YWJsZSBpcyBub256ZXJvLgotCSogbGliYmZkLmMgW0hBVkVfTUFEVklTRV06IEluY2x1ZGUgc3lzL3R5cGVzLmggYW5kIHN5cy9tbWFuLmguCi0JKGJmZF9mcmVlX3dpbmRvdykgWyEgVVNFX01NQVBdOiBEb24ndCBkZWZpbmUuCi0JKGJmZF9nZXRfZmlsZV93aW5kb3csCi0JX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykgWyEgVVNFX01NQVBdOiBBYm9ydC4KLQotV2VkIE5vdiAgOCAyMDowMzo0NCAxOTk1ICBFcmljIEZyZXVkZW50aGFsIDxmcmV1ZGVudGhhbEBueXUuZWR1PgotCi0JKiBjb2ZmLWEyOWsuYyAoU0lHTl9FWFRFTkRfSFdPUkQpOiBVc2UgfjB4ZmZmZiByYXRoZXIgdGhhbgotCTB4ZmZmZjAwMDAuCi0KLVdlZCBOb3YgIDggMTE6MzE6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyk6IENoYW5nZSBoYW5kbGluZyBvZiBSX0lSRUwgcmVsb2MgdG8gYmUKLQljb21wYXRpYmxlIHdpdGggQU1EIGdlbmVyYXRlZCBDT0ZGIGZpbGVzLiAgVHJ5IHRvIHN1cHBvcnQgYm90aCBBTUQKLQlhbmQgR05VIGZvcm1hdHMgc2ltdWx0YW5lb3VzbHkuCi0JKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogQ2hhbmdlIHdyaXRhYmxlIHBhcmFtZXRlciBmcm9tCi0JaW50IHRvIGJvb2xlYW47IHVwZGF0ZSBhbGwgY2FsbGVycy4gIFBhc3MgTUFQX1NIQVJFRCBpZiBub3QKLQl3cml0YWJsZS0taXQncyByZXF1aXJlZCBvbiBTb2xhcmlzLiAgQ2FzdCBmcHJpbnRmIGFyZ3VtZW50IHRvCi0JYXZvaWQgd2FybmluZy4KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogYW91dHguaDogVXBkYXRlIGNhbGxzIHRvIGJmZF9nZXRfZmlsZV93aW5kb3cuCi0KLQkqIHhjb2ZmbGluay5jIChYQ09GRl9ERUZfRFlOQU1JQyk6IFJlbmFtZSBmcm9tIFhDT0ZGX1JFRl9EWU5BTUlDLgotCUNoYW5nZSBhbGwgdXNlcy4KLQkoeGNvZmZfc3dhcF9sZGhkcl9pbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHhjb2ZmX3N3YXBfbGRzeW1faW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh4Y29mZl9maW5kX3JlbG9jKTogSGFuZGxlIHRoZSBjYXNlIG9mIGEgc2luZ2xlIHJlbG9jIGNvcnJlY3RseS4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IElmIHdlIGp1c3QgY3JlYXRlZCBhIGRlc2NyaXB0b3IsIHBhc3MgaXQKLQl0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCwgdG8gc2F2ZSBhIGhhc2ggbG9va3VwLgotCUhhbmRsZSBYVFlfRVIvWE1DX1hPIHN5bWJvbHMgY29ycmVjdGx5LgotCSh4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMpOiBSZXdyaXRlIHRvIHJlYWQgLmxvYWRlciBzeW1ib2xzCi0JcmF0aGVyIHRoYW4gbm9ybWFsIHN5bWJvbCB0YWJsZS4KLQkoYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wpOiBJdCdzIG5vdCBhbiBlcnJvciBpZiB0aGUgc3ltYm9sIGlzCi0JYWxyZWFkeSBkZWZpbmVkIHdpdGggdGhlIHNhbWUgYWJzb2x1dGUgdmFsdWUuCi0JKHhjb2ZmX21hcmspOiBXaGVuIGNvbnNpZGVyaW5nIGNhbGxlZCBzeW1ib2xzLCBjaGVjayB3aGV0aGVyIHRoZQotCWRlc2NyaXB0b3IgaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCByYXRoZXIgdGhhbiB0aGUgc3ltYm9sCi0JaXRzZWxmLgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBMaWtld2lzZS4KLQotCSogbGliYmZkLmMgKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQlDYXN0IHJlYWxsb2MgYW5kIG1hbGxvYyByZXR1cm4gdmFsdWVzLiAgSWYgbWFsbG9jIG9yIHJlYWxsb2MgZmFpbCwKLQlzZXQgYmZkX2Vycm9yX25vX21lbW9yeS4KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogQ2hhbmdlIHR5cGUgdG8gYm9vbGVhbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotVHVlIE5vdiAgNyAxMTo1Mzo0OCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocHBjX3JlY29yZF90b2NfZW50cnkpOiBuZXcgZnVuY3Rpb24uCi0JKGluX3JlbG9jX3ApOiBjaGFuZ2VkIHJldHVybiB2YWx1ZS4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IG11Y2ggcmV3b3JrLgotCShwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24pOiBuZXcgZnVuY3Rpb24uCi0JKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogbmV3IGZ1bmN0aW9uLgotCShwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rKTogbmV3IGZ1bmN0aW9uLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBpbml0aWFsaXplIHRvY19vZmZzZXQuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IGluaXRpYWxpemUgdG9jX29mZnNldC4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc3ltX2luKTogQWRkZWQgY29mZl9zd2FwX3N5bV9pbl9ob29rCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IEFkZGVkIG1vcmUgc2VjdGlvbnMgdG8gdGhlIGRhdGEKLQlkaWN0aW9uYXJ5IGZvciB0aGUgcGUgZmlsZSBoZWFkZXIuIEFsc28gY2hhbmdlZCBsaW5rZXIgdmVyc2lvbgotCW51bWJlciBvbiB0aGUgcHBjIHNpZGUuCi0JKGRpcl9uYW1lcyk6IHNtYWxsIGltcHJvdmVtZW50cyB0byB0aGUgZGljdGlvbmFyeSBwcmludGluZy4KLQkocGVfbWtvYmplY3RfaG9vayk6IHNhdmUgdGhlIGZpbGUgbGV2ZWwgZmxhZ3MuCi0KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9saW5rX2hhc2hfZW50cnkpOiBhZGRlZCB0b2Nfb2Zmc2V0IGZpZWxkCi0JKHBlX3RkYXRhKTogYWRkZWQgcmVhbF9mbGFncyBmaWVsZAotCShjb2ZmX3RkYXRhKTogYWRkZWQgbG9jYWxfdG9jX3N5bV9tYXAgYW5kIGFjY2VzcyBtYWNybwotCi0JKiBsaWJjb2ZmLmggKGNvZmZfbGlua19oYXNoX2VudHJ5KTogYWRkZWQgdG9jX29mZnNldCBmaWVsZAotCShwZV90ZGF0YSk6IGFkZGVkIHJlYWxfZmxhZ3MgZmllbGQKLQkoY29mZl90ZGF0YSk6IGFkZGVkIGxvY2FsX3RvY19zeW1fbWFwIGFuZCBhY2Nlc3MgbWFjcm8KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBhZGRlZCBob29rIGZvciBQRS4KLQkoY29mZl9ta29iamVjdCk6IGluaXQgZm9yIGxvY2FsX3RvY19zeW1fbWFwCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IHRoZSBpbnRlcm5hbF9hLm1hZ2ljIHRvCi0gICAgICAgIElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyB3aGljaCBhcHBlYXJzIHRvIGJlIHdoYXQgb3RoZXIKLQlwcGMgY29tcGlsZXJzIHVzZS4KLQotVHVlIE5vdiAgNyAxMzo0ODo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmbGluay5jIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogS2VlcCBsb29raW5nIHRocm91Z2ggc3RhYnMKLQllbnRyaWVzIHVudGlsIGJvdGggdGhlIGxpbmUgbnVtYmVyIGFkZHJlc3MgYW5kIHRoZSBmdW5jdGlvbiBuYW1lCi0JYWRkcmVzcyBhcmUgdG9vIGxhcmdlLgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ0hFQ0tfUFJPRyB0byBmaW5kIGFuZCBjYWNoZSBBUi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotCSogYWNsb2NhbC5tNCAoQkZEX0NDX0ZPUl9CVUlMRCk6IERvbid0IGRlZmluZSBDQ19GT1JfQlVJTEQgaWYgaXQKLQlpcyBkZWZpbmVkIGluIHRoZSBlbnZpcm9ubWVudC4KLQotVHVlIE5vdiAgNyAxMDo1NzoyNCAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KTogRGVmaW5lIHRvIHVzZQotCWdlbmVyaWMgdmVyc2lvbi4KLQotTW9uIE5vdiAgNiAxNzoxMzoxNSAxOTk1ICBIYXJyeSBEb2xhbiAgPGRvbGFuQHNzZC5pbnRlbC5jb20+Ci0KLQkqIGNvZmYtaTg2MC5jOiBOZXcgZmlsZSwgYmFzZWQgb24gY29mZi1pMzg2LmMuCi0JKiBjcHUtaTg2MC5jOiBOZXcgZmlsZSwgYmFzZWQgb24gY3B1LWkzODYuYy4KLQkqIGhvc3RzL2k4NjBtYWNoMy5oOiBOZXcgZmlsZSwgYmFzZWQgb24gaG9zdHMvaTM4Nm1hY2gzLmguCi0JKiBjb25maWcuYmZkIChpODYwLSotbWFjaDMqLCBpODYwLSotb3NmMSosIGk4NjAtKi1jb2ZmKik6IE5ldwotCXRhcmdldHMsIHVzaW5nIGk4NjBjb2ZmX3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbiAoaTg2MC0qLW1hY2gzKiwgaTg2MC0qLW9zZjEqKTogTmV3IGhvc3RzLCB1c2luZwotCXRyYWQtY29yZS5vIGFuZCBob3N0cy9pODYwbWFjaDMuaC4KLQkoaTg2MGNvZmZfdmVjKTogVXNlIGNvZmYtaTg2MC5vIGFuZCBjb2ZmbGluay5vLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShBTExfTUFDSElORVMpOiBBZGQgY3B1LWk4NjAuby4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1pODYwLm8uCi0JKENGSUxFUyk6IEFkZCBjcHUtaTg2MC5jIGFuZCBjb2ZmLWk4NjAuYy4KLQkqIHRhcmdldHMuYyAoaTg2MGNvZmZfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgJmk4NjBjb2ZmX3ZlYy4KLQkqIGFyY2h1cmVzLmMgKGJmZF9pODYwX2FyY2gpOiBEZWNsYXJlLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCAmYmZkX2k4NjBfYXJjaC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogSGFuZGxlIEk4NjAgbWFnaWMgbnVtYmVyLgotCShjb2ZmX3NldF9mbGFncyk6IEhhbmRsZSBiZmRfYXJjaF9pODYwLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBJODYwIGEub3V0IG1hZ2ljIG51bWJlci4KLQotTW9uIE5vdiAgNiAxNDozNDowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogU2V0IHRoZSBhbGlnbm1lbnQgcG93ZXIgb2YKLQl0aGUgY3JlYXRlZCAudGMgc2VjdGlvbiB0byAyLgotCSh4Y29mZl9tYXJrKTogRG9uJ3Qga2VlcCBhIC5sb2FkZXIgcmVsb2MgZm9yIGEgY2FsbCB0byBhbgotCXVuZGVmaW5lZCBzeW1ib2wgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGdlbmVyYXRlCi0JZ2xvYmFsIGxpbmthZ2UgY29kZSBmb3IgYSBjYWxsIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wuCi0KLVN1biBOb3YgIDUgMjE6NDQ6MTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBSZWJ1aWxkIGxpc3QgZnJvbSBCRkRfTElCUywgQUxMX01BQ0hJTkVTLAotCUJGRDMyX0JBQ0tFTkRTLCBCRkQ2NF9CQUNLRU5EUy4KLQkoLmRlcDEpOiBQdXQgbWtkZXAgb3V0cHV0IGluIGEgc2VwYXJhdGUgZmlsZS4KLQlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9zbHVycF9hcm1hcCk6IENhc3QgX2JmZF9yZWFkX2FyX2hkciByZXR1cm4KLQl2YWx1ZS4KLQotCVBlcm1pdCB1c2Ugb2YgbW1hcCB3aGVuIGF2YWlsYWJsZToKLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgbW1hcCwgbWFkdmlzZSwgbXByb3RlY3QuCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLQkqIGxpYmJmZC5jIChzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwpOiBEZWZpbmUgdHlwZS4KLQkoYmZkX2luaXRfd2luZG93LCBiZmRfZnJlZV93aW5kb3csIGJmZF9nZXRfZmlsZV93aW5kb3cpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKG9rX3RvX21hcCk6IE5ldyBzdGF0aWMgdmFyaWFibGUgZm9yIGRlYnVnZ2luZy4KLQkoX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfd2luZG93X2ludGVybmFsKTogRGVjbGFyZSB0eXBlLgotCShiZmRfd2luZG93KTogRGVmaW5lIHR5cGUuCi0JKGJmZF9pbml0X3dpbmRvdywgYmZkX2ZyZWVfd2luZG93LCBiZmRfZ2V0X2ZpbGVfd2luZG93KTogRGVjbGFyZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KToKLQlEZWNsYXJlLgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCB0d28gd2luZG93IGZpZWxkcy4KLQkob2JqX2FvdXRfc3ltX3dpbmRvdywgb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyk6IE5ldyBtYWNyb3MuCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBJbml0aWFsaXplIHdpbmRvd3MuCi0JKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBHZXQgc3ltYm9sIGRhdGEgYW5kIHN0cmluZ3MgaW4KLQl3aW5kb3dzIGluc3RlYWQgb2YgZXhwbGljaXRseSBhbGxvY2F0ZWQgYnVmZmVycy4KLQkoc2x1cnBfc3ltYm9sX3RhYmxlKTogRnJlZSB3aW5kb3cgaW5zdGVhZCBvZiBtZW1vcnkuCi0JKGJmZF9mcmVlX2NhY2hlZF9pbmZvKTogUmVsZWFzZSB3aW5kb3dzIGluc3RlYWQgb2YgZnJlZWluZyBzdG9yYWdlCi0JZGlyZWN0bHkuCi0JKGFvdXRfbGlua19mcmVlX3N5bWJvbHMpOiBEaXR0by4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIG5ldyBmaWVsZCBmb3IKLQlnZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cuCi0JKEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMpOiBVcGRhdGVkLgotCSogYW91dC1hZG9iZS5jLCBhb3V0LXRhcmdldC5oLCBiaW5hcnkuYywgYm91dC5jLCBjb2ZmLWFscGhhLmMsCi0JY29mZi1taXBzLmMsIGVsZnh4LXRhcmdldC5oLCBpMzg2bXNkb3MuYywgaTM4Nm9zOWsuYywgaWVlZS5jLAotCWxpYmNvZmYtaW4uaCwgb2FzeXMuYywgc3JlYy5jLCB0ZWtoZXguYywgdmVyc2Fkb3MuYzogQWRkZWQgbmV3Ci0JbWFjcm9zIGZvciBnZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgZmllbGQuCi0KLVNhdCBOb3YgIDQgMTI6MjM6MjYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvcmUuYzogUmVuYW1lZCB0byBjb3JlZmlsZS5jCi0JKiBtYWtlZmlsZS5kb3MgKE9CSlMpOiBDaGFuZ2UgY29yZS5vIHRvIGNvcmVmaWxlLm8KLQkqIE1ha2VmaWxlLmluIChDRklMRVMsIEJGRF9MSUJTKTogVXNlIGNvcmVmaWxlLmMgaW5zdGVhZCBvZiBjb3JlLmMKLQotRnJpIE5vdiAgMyAxNTo1NDo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogUmVuYW1lIGxvY2FsIHZhcmlhYmxlIHN1YgotCXRvIG8uICBDbG9iYmVyIGFuZCByZXN0b3JlIHRoZSBsaXN0IG9mIG5ldyBjc2VjdHMgYXJvdW5kIHRoZSBjYWxsCi0JdG8gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wsIGluIGNhc2UgaXQgd2FudHMgdG8gcmVwb3J0IGEKLQlsaW5rZXIgZXJyb3IgYW5kIHRoZSBsaW5rZXIgd2FudHMgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAgUmVzZXQKLQl0aGUgbGluZSBudW1iZXIgY291bnQgb2YgYSByZWFsIHNlY3Rpb24gZXZlbiBpZiBpdCBoYXMgbm8gcmVsb2NzLgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogSWYgc2hhcmVkLCBzZXQgdGhlIERZTkFNSUMgZmxhZy4KLQotCSogY29mZmdlbi5jIChfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBXYXJuIGlmIHRoZSBzdHJpbmcgc2l6ZQotCWlzIHRvbyBzbWFsbC4KLQotVGh1IE5vdiAgMiAyMzoxNjozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3Qgd2FybiBhYm91dAotCWFuIHVuZGVmaW5lZCBzeW1ib2wgaW4gYSBzaGFyZWQgbGluay4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogQ29ycmVjdCB0eXBlIG9mCi0Jb2xkdHlwZSBmcm9tIGJmZF9saW5rX29yZGVyX3R5cGUgdG8gYmZkX2xpbmtfaGFzaF90eXBlLiAgRnJvbQotCXBoZG1AaW5mby51Y2wuYWMuYmUgKFBoaWxpcHBlIERlIE11eXRlcikuCi0KLVdlZCBOb3YgIDEgMTQ6MjY6MDIgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNvZmYtbTg4ay5jIChydHlwZTJob3d0byk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKFJUWVBFMkhPV1RPKTogVXNlIGl0IHJhdGhlciB0aGFuIGEgbWFjcm8gZGVmaW5pdGlvbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgaW50ZXJuYWxfYS5tYWdpYwotCXRvIFBBR0VNQUdJQ1BFWEVDUEFHRUQgI2lmIGRlZmluZWQgKE02OCkgJiYgIWRlZmluZWQgKExZTlhPUykuCi0KLQkqIGNvbmZpZ3VyZS5pbjogbTY4Ki1tb3Rvcm9sYS1zeXN2KiBkb2VzIG5vdCB1c2UgcHRyYWNlLWNvcmUubzsKLQlkZWZpbmUgVFJBRF9IRUFERVIgdG8gbmV3IGZpbGUgaG9zdHMvZGVsdGE2OC5oLgotCW04OCotbW90b3JvbGEtc3lzdiosIGhvd2V2ZXIsIGRvZXMgdXNlIHB0cmFjZS1jb3JlLm8uCi0JKiBob3N0cy9kZWx0YTY4Lmg6IE5ldyBmaWxlLgotCi0JKiBwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCk6IGNoYW5nZSBiZmRfem1hbGxvYyB0bwotCWJmZF96YWxsb2M7IHByb3ZpZGUgcHJvcGVyIHBhcm0gYWJmZCB0byBjYWxscyB0byBiZmRfemFsbG9jLgotCi1XZWQgTm92ICAxIDEzOjUxOjU0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpMzg2bGludXguYyAoTVkodmVjKSk6IERlY2xhcmUgYmVmb3JlIHVzZS4KLQotV2VkIE5vdiAgMSAxMTo0NTowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOgotCVBhc3MgaW5wdXRfYmZkLCBub3QgaW5fYmZkLCB0byBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUKLQlCRkQgaXMgbm90IG9mIHRoZSByaWdodCB0eXBlLgotCShiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCk6IExpa2V3aXNlLgotCSogaTM4NmxpbnV4LmMgKGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKGJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QpOiBMaWtld2lzZS4KLQkqIHhjb2ZmbGluay5jIChYQ09GRl9YVkVDUCk6IERlZmluZS4KLQkoYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCk6IERvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBCRkQgaXMgbm90Ci0Jb2YgdGhlIHJpZ2h0IHR5cGUuCi0JKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9leHBvcnRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogT25seSBjaGVjayB0aGUgcmVsb2Mgc3ltYm9sCi0JdGFibGUgaW5kZXggYWdhaW5zdCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgZm9yIGEgYmFzZSByZWxhdGl2ZQotCXJlbG9jLgotCi0JKiBjb2ZmLXJzNjAwMC5jIChfYmZkX3hjb2ZmX3NpemVvZl9oZWFkZXJzKTogQ2hhbmdlIGZyb20gbWFjcm8gdG8KLQlzdGF0aWMgZnVuY3Rpb24uCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IFNldAotCWZ1bGxfYW91dGhkciBmbGFnIGhlcmUuLi4KLQkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IC4uLm5vdCBoZXJlLgotCi1UdWUgT2N0IDMxIDEyOjUyOjAyIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaDogIFJlbmFtZSB0byBlbGYtYmZkLmggdG8gYXZvaWQgY29uZmxpY3Qgd2l0aAotCXN5c3RlbXMgdGhhdCBoYXZlIGEgc3lzdGVtIDxsaWJlbGYuaD4uCi0JKiBNYWtlZmlsZS5pbjogR2xvYmFsbHkgcmVwbGFjZSBsaWJlbGYuaCB3aXRoIGVsZi1iZmQuaC4KLQkqIGJmZC5jLCBlbGYuYywgZWxmMzItYXJjLmMsIGVsZjMyLWdlbi5jLCBlbGYzMi1ocHBhLmMsCi0JZWxmMzItaHBwYS5oLCBlbGYzMi1pMzg2LmMsIGVsZjMyLWk4NjAuYywgZWxmMzItbTY4ay5jLAotCWVsZjMyLW04OGsuYywgZWxmMzItbWlwcy5jLCBlbGYzMi1wcGMuYywgZWxmMzItc3BhcmMuYywKLQllbGY2NC1nZW4uYywgZWxmNjQtc3BhcmMuYywgZWxmY29kZS5oLCBlbGZsaW5rLmMsCi0JZWxmeHgtdGFyZ2V0Lmg6IEluY2x1ZGUgZWxmLWJmZC5oIHJhdGhlciB0aGFuIGxpYmVsZi5oLgotCSogZWxmeHgtdGFyZ2V0Lmg6IENoYW5nZSBsaWJlbGYuaCByZWZlcmVuY2UgdG8gZWxmLWJmZC5oLgotCi1UdWUgT2N0IDMxIDE1OjMwOjA3IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IEFkZCBuZXcgcGFyYW1ldGVyIHdlYWsuICBJZgotCXNldCwgc2V0IEJTRl9XRUFLIGluIHN5bWJvbC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZWNvZmZfZ2V0X2V4dHIpOiBTZXQgd2Vha2V4dCBiYXNlZCBvbiBCU0ZfV0VBSy4KLQkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogSWYgd2Vha2V4dCBpcyBzZXQsIHBhc3MgQlNGX1dFQUsgdG8KLQlfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkoZWNvZmZfaW5kaXJlY3RfbGlua19vcmRlcik6IENoZWNrIHRoYXQgdGhlIHNlY3Rpb24gdGRhdGEgcmVsb2NzCi0JYXJlIG5vdCBOVUxMIGJlZm9yZSB1c2luZyB0aGVtLgotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhKi0qLWxpbnV4Kik6IFNldCBDT1JFRklMRSB0byB0cmFkLWNvcmUubyBhbmQKLQlkZWZpbmUgVFJBRF9IRUFERVIgYXMgaG9zdHMvYWxwaGFsaW51eC5oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogaG9zdHMvYWxwaGFsaW51eC5oOiBOZXcgZmlsZS4KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBDYXN0IHUudV9hcjAgdG8gYmZkX3ZtYSwKLQlub3QgaW50LgotCi1UdWUgT2N0IDMxIDEyOjM0OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBY2NlcHQgQ19CQ09NTSBhbmQKLQlDX0VDT01NIHN0b3JhZ2UgY2xhc3Nlcy4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX21hcmtfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dAotCW9mIHhjb2ZmX21hcmsuCi0JKHhjb2ZmX21hcmspOiBDYWxsIHhjb2ZmX21hcmtfc3ltYm9sLgotCShiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCk6IENhbGwgeGNvZmZfbWFya19zeW1ib2wuCi0JKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogQ2FsbCB4Y29mZl9tYXJrX3N5bWJvbCByYXRoZXIgdGhhbgotCWRvaW5nIGl0IGJ5IGhhbmQuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IEJ1aWxkIGEgLmxvYWRlciBzeW1ib2wgZm9yIGFuIGV4cG9ydCBzeW1ib2wuCi0KLU1vbiBPY3QgMzAgMTQ6NTM6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBuZXcgbGluZV9maWxlcG9zCi0JZmllbGQuCi0JKHhjb2ZmX2ZpbmRfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogVXNlIGl0LgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogU2V0IGZpbmZvLmxpbmVfZmlsZXBvcy4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBIYW5kbGUgQ19CSU5DTCBhbmQgQ19FSU5DTC4gIERvbid0Ci0JcmVsb2NhdGUgdGhlIHZhbHVlIG9mIENfREVDTC4KLQotCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogUmVtb3ZlIGJvZ3VzIEJGRF9BU1NFUlQuCi0KLVNhdCBPY3QgMjggMDE6MjU6MzQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IE1ha2UKLQljYWxsYmFjayBkZWNpZGUgd2hhdCBnb2VzIGluIC5yZWxvY3MuCi0JKiBwZVtpXS1pMzg2LmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogRGVmaW5lLgotCSogcGVpY29kZS5oIChwZV9ta29iamVjdF9ob29rKTogT25seSBjb3B5IGFvdXRoZHIgaWYKLQl0aGVyZSBpcyBvbmUuCi0KLVNhdCBPY3QgMjggMDE6NTE6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IEhhbmRsZSBjc2VjdHMgaW4gdGhlCi0JYWJzb2x1dGUgc2VjdGlvbi4KLQotRnJpIE9jdCAyNyAxODoxNDozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jOiBNb3JlIGltcHJvdmVtZW50cywgbW9zdGx5IHRvIGZpeCBoYW5kbGluZyBvZgotCWNvbnN0cnVjdG9ycyBhbmQgYSBmZXcgb3RoZXIgc3BlY2lhbCBjYXNlcy4KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfdmVjKTogU2V0IHN5bWJvbF9sZWFkaW5nX2NoYXIgYmFjayB0bwotCXplcm8sIHJldmVydGluZyB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0JKiBiZmQtaW4uaCAoYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCk6IERlY2xhcmUuCi0JKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogRGVjbGFyZS4KLQkoYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1GcmkgT2N0IDI3IDE0OjQyOjE1IDE5OTUgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIFBPUlRJTkcsIGFvdXQtYXJtLmMsIGFvdXQtZW5jYXAuYywgYW91dC10YXJnZXQuaCwKLQlhb3V0eC5oLCBnZW4tYW91dC5jLCBob3N0LWFvdXQuYywgaHAzMDBic2QuYywgaTM4NmFvdXQuYwotCWkzODZic2QuYywgaTM4NmR5bml4LmMsIGkzODZsaW51eC5jLCBpMzg2bHlueC5jLCBpMzg2bWFjaDMuYywKLQlpMzg2bmV0YnNkLmMsIG02OGtseW54LmMsIG04OGttYWNoMy5jLCBtaXBzYnNkLmMsIG5ld3NvczMuYywKLQluczMya25ldGJzZC5jLCBwYzUzMi1tYWNoLmMsIHJpc2NpeC5jLCBzcGFyY2x5bnguYywgc3BhcmNuZXRic2QuYzoKLQlDaGFuZ2UgUEFHRV9TSVpFIHRvIFRBUkdFVF9QQUdFX1NJWkUuCi0KLQkqIG02OGtuZXRic2QuYzogRGl0dG8gYXMgd2VsbCBhcyBhZGQgc3VwcG9ydCBmb3IgdGhlIG02OGs0ayBvYmplY3QKLQlmb3JtYXQuCi0KLQkqIG5ldGJzZC5oOiBEb3VibGUgZGl0dG8gKGluY2wuIG02OGs0ayBzdXBwb3J0KS4gIE5ldEJTRCdzIHRleHQKLQlzZWdtZW50cyBpbmNsdWRlcyB0aGUgYS5vdXQgaGVhZGVyLiAgU2VlIHRvIHRoYXQgdGhlIG1hZ2ljIG51bWJlcgotCSphbHdheXMqIGlzIGJpZy1lbmRpYW4uCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtNjgqLWhwKi1uZXRic2QqIGNhc2UuICBDcm9zcy1wb2xsaW5hdGUgbTY4ayBhbmQKLQltNjhrNGsgTmV0QlNEIGNvbmZpZ3VyYXRpb25zLgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogU2VwYXJhdGUgaTM4NiAmIG1pcHMgTmV0QlNECi0JY29uZmlndXJhdGlvbnMgZnJvbSBvdGhlciBCU0Qgb25lcy4gIERvbid0IGFzc3VtZSBERUMgaXMgdGhlIG9ubHkKLQl0aGluZyBOZXRCU0QvbWlwcyBydW4gb24uICBBZGQge202OGssbnMzMmssc3BhcmN9LSotbmV0YnNkKgotCWNvbmZpZ3VyYXRpb25zLiAgQWRkIHN1cHBvcnQgZm9yIG02OGs0ayBOZXRCU0Qgb2JqZWN0IGZvcm1hdC4KLQotCSogbGliYW91dC5oOiBBZGRlZCBNXzY4SzRLX05FVEJTRCBtYWdpYy4KLQotCSogbTY4azRrbmV0YnNkLmM6IE5ldyBmaWxlLgotCi0JKiBob3N0cy97bTY4ayxzcGFyY31uYnNkLmg6IERvbid0IGRlZmluZSBIT1NUX0JJR19FTkRJQU5fUC4KLQotCSogaG9zdHMvbmJzZC5oOiBEZWZpbmUgSE9TVF9CSUdfRU5ESUFOX1AgYWNjb3JkaW5nIHRvCi0JPG1hY2hpbmUvZW5kaWFuLmg+LgotCi0JKiBob3N0cy9taXBzbmJzZC5oOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAyNiAxNDoxNjo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jOiBOdW1lcm91cyBjaGFuZ2VzIHRvIGdldCBjbG9zZXIgdG8gYSB3b3JraW5nIFhDT0ZGCi0JbGlua2VyLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgZnVsbF9hb3V0aGRyLAotCXRvY19zZWN0aW9uLCBhbmQgZW50cnlfc2VjdGlvbiBmaWVsZHMuCi0JKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKTogUmVtb3ZlIGxkcmVsX2NvdW50IGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogSW5pdGlhbGl6ZSBuZXcgeGNvZmZfZGF0YQotCWZpZWxkcy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBSUzYwMDBDT0ZGX0MsIGdlbmVyYXRlCi0JZnVsbCBhLm91dCBoZWFkZXIgaWYgZnVsbF9hb3V0aGRyIGlzIHNldCBpbiB4Y29mZl9kYXRhLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLiAgU2V0IG9fc25lbnRyeSBhbmQgb19zbnRvYwotCWJhc2VkIG9uIHNlY3Rpb25zIHN0b3JlZCBpbiB4Y29mZl9kYXRhLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBuZXcgeGNvZmZfZGF0YQotCWZpZWxkcy4KLQkoeGNvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1IuCi0JKHJzNjAwMGNvZmZfdmVjKTogU2V0IHN5bWJvbF9sZWFkaW5nX2NoYXIgdG8gJy4nLgotCSogY29mZmdlbi5jIChjb2ZmX2dldF9zeW1ib2xfaW5mbyk6IElmIGZpeF92YWx1ZSBpcyBzZXQsIGZpeCB0aGUKLQl2YWx1ZSBzdG9yZWQgaW4gcmV0IHJhdGhlciB0aGFuIHJldHVybmluZyBhIHBvaW50ZXIgdmFsdWUuCi0KLVdlZCBPY3QgMjUgMjM6MTA6MzkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjeyxsZX0te2VsZixzeXN2NCxlYWJpLHNvbGFyaXMyfSk6IFJlbW92ZSBNQUMKLQlmb3JtYXQgZm9yIG5vdy4KLQotV2VkIE9jdCAyNSAxNjoxOToyNyAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogQWxsb2NhdGUgdGhlIHN0cmluZ3Mgd2l0aCBtYWxsb2MKLQlzaW5jZSB0aGV5J3JlIGZyZWUnZCBieSBmcmVlX2NhY2hlZF9pbmZvLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2ltaWxhcmx5IGZvciB0aGUgc3ltYm9sIHRhYmxlLgotCi1XZWQgT2N0IDI1IDE0OjU5OjIyIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogIERvbid0IG1ha2UgaGVhZGVycy4KLQotV2VkIE9jdCAyNSAxMTozMjo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogc3Vub3MuYyAoYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEb24ndCBkbyBhbnl0aGluZyBpZgotCW91dHB1dF9iZmQgaXMgbm90IFN1bk9TLgotCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuICBEb24ndCBzY2FuIHJlbG9jcyBvZgotCW5vbi1TdW5PUyBpbnB1dCBmaWxlcy4KLQotCSogeGNvZmZsaW5rLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHN1cHBvcnQgbGlua2luZyBzaGFyZWQgb2JqZWN0cwotCWFuZCBnZW5lcmF0aW5nIGEgLmxvYWRlciBzZWN0aW9uLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgaW1wb3J0X2ZpbGVfaWQgZmllbGQuCi0JKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIGxpbmVub19jb3VudCwgZmlyc3Rfc3ltbmR4LAotCWxhc3Rfc3ltbmR4LCBhbmQgbGRyZWxfY291bnQgZmllbGRzLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfaG93dG9fdGFibGUpOiBDb3JyZWN0IHJlbG9jIG5hbWVzLgotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBEb24ndCBzZXQgYW55IGZsYWdzIGlmIFNUWVBfUEFECi0JaXMgc2V0LgotCSogYmZkLWluLmggKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogRGVjbGFyZS4KLQkoYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wpOiBEZWNsYXJlLgotCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotVHVlIE9jdCAyNCAxNzo0NDoyMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHhjb2ZmbGluay5vIHRvIHBtYWNfeGNvZmZfdmVjLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogbXB3LWNvbmZpZy5pbjogQWRkIHhjb2ZmbGluay5jLm8gdG8gcG93ZXJwYy1hcHBsZS1tYWNvcy4KLQkqIGNvZmYtcG1hYy5jOiBJbmNsdWRlIGNvZmYtcnM2MDAwLmMgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBpdHMKLQljb250ZW50cy4KLQkocG1hY194Y29mZl92ZWMpOiBVcGRhdGUgdG8gdXNlIG5ldyB4Y29mZiBzdXBwb3J0LgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogTWFrZSBzdGF0aWMuCi0JKHhjb2ZmX3dyaXRlX2FybWFwKTogRGVjbGFyZSBidWYgYXMgdW5zaWduZWQgY2hhci4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogRGVjbGFyZSBhIGxvY2FsIGFzIFBUUi4KLQotCSogbXB3LW1ha2Uuc2VkOiBHZW5lcmFsaXplIHN1YmRpcl9kbyBlZGl0LgotCi1UdWUgT2N0IDI0IDEwOjI1OjAxIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYWJzZC1jb3JlLmMgKG1ha2VfYmZkX2FzZWN0aW9uKTogSW5pdGlhbGl6ZSBhc2VjdC0+ZmlsZXBvcwotCWNvcnJlY3RseS4gIERvbid0IGluaXRpYWxpemUgYXNlY3QtPnZtYS4KLQotRnJpIE9jdCAyMCAxMzoyMzo0OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogb3BuY2xzLmMgKF9iZmRfbmV3X2JmZCk6IElmIF9iZmRfY2h1bmtzaXplIHdhc24ndCBwcmVzZXQsIHVzZQotCXNvbWV0aGluZyBhIGxpdHRsZSBsZXNzIHRoYW4gdGhlIHBhZ2Ugc2l6ZS4KLQotVGh1IE9jdCAxOSAxMzowNjowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keCk6IENsZWFyICphZGp1c3RlZHAuCi0KLVdlZCBPY3QgMTggMTY6MjA6MDggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IE5ldy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgLmJzcyBpcyBiZWZvcmUKLQkuZGF0YSB1cyB0aGF0IGFzIGRhdGFfc3RhcnQuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogR2V0IHJlbG9jCi0JY2FsYyBjb3JyZWN0LgotCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IFVzZSBfY29va2VkX3NpemUgb2YgZGF0YSBkaXJlY3RvcnkuCi0JKGNvZmZfc3dhcF9vdXRoZHJfb3V0KTogSGFyZHdpcmUgaW4gdmVyc2lvbiBudW1iZXIuCi0KLVdlZCBPY3QgMTggMTY6NTA6NTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBSZW5hbWUgbG9jYWwgdmFyaWFibGVzCi0JbWFqb3IgYW5kIG1pbm9yIHRvICpfdm5vLCBzaW5jZSB0aGUgZm9ybWVyIGFyZSBhbHNvIG1hY3JvcyBpbgotCVN1bk9TIGhlYWRlciBmaWxlcy4gIENhc3QgcmVzdWx0IG9mIGJmZF9hbGxvYyB0byBhcHByb3ByaWF0ZQotCXR5cGUuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IENhc3QgdXNlZF9ieV9iZmQgdmFsdWUKLQliZWZvcmUgYXNzaWduaW5nIHRvIHNlY19kYXRhLgotCi1XZWQgT2N0IDE4IDEzOjI1OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IFRoZSBvZmZzZXQgYXJndW1lbnQgaXMKLQlub3cgcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24sIG5vdCBhYnNvbHV0ZS4KLQkqIGVjb2ZmbGluay5jIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogVXNlIHRoZSByaWdodCBzeW1ib2wgdG8KLQlnZXQgdGhlIGZpbGUgbmFtZSB3aGVuIHRoZXJlIGlzIGEgTl9TTyBkaXJlY3RvcnkgbmFtZS4gIFdoZW4KLQloYW5kbGluZyBzdGFicywgcmVtZW1iZXIgdGhhdCBzZWN0aW9uLT52bWEgd2FzIGFkZGVkIHRvIHRoZQotCW9mZnNldC4KLQotVHVlIE9jdCAxNyAxODoyNDo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUpOiBBZGQgbmVlZGVkIGZpZWxkLgotCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogQ2FsbCBiZmRfcmVsZWFzZSwgbm90IGZyZWUuCi0JKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIG5lZWRlZCBmaWVsZC4KLQkoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IFJlY29yZCBuZWVkZWQgb2JqZWN0cy4KLQkoYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0KTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIE9jdCAxNiAxNDo0Mzo1OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKHBlX2RhdGFfdHlwZS5pbl9yZWxvY19wKTogTmV3LgotCi1Nb24gT2N0IDE2IDEwOjUyOjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCk6IFJlbmFtZSBmcm9tCi0JYmZkX2VsZl9saW5rX25lZWRlZF9saXN0LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogZWxmLmMsIGVsZmxpbmsuaCwgbGliZWxmLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotCUFkZCBzdGFydCBhdCBBSVggbGlua2VyIHN1cHBvcnQ7IG5vIHNoYXJlZCBsaWJyYXJpZXMgeWV0LgotCSogeGNvZmZsaW5rLmM6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChyczYwMGNvZmZfdmVjKTogVXNlIHhjb2ZmbGluay5vLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgY3NlY3RzIGFuZCBkZWJ1Z19pbmRpY2VzCi0JZmllbGRzLgotCShzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSk6IERlZmluZS4KLQkoeGNvZmZfc2VjdGlvbl9kYXRhKTogRGVmaW5lIG1hY3JvLgotCShfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVjbGFyZS4KLQkoX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUuCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEZWNsYXJlLgotCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmYtcnM2MDAwLmM6IENsZWFuIHVwIGEgYml0LgotCSh4Y29mZl9ta29iamVjdCk6IERlZmF1bHQgbW9kdHlwZSB0byAxTCwgbm90IFJFLiAgSW5pdGlhbGl6ZQotCWNwdXR5cGUsIGNzZWN0cywgYW5kIGRlYnVnX2luZGljZXMuCi0JKHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgY3B1dHlwZS4KLQkoeGNvZmZfaG93dG9fdGFibGUpOiBSZW5hbWUgZnJvbSByczYwMDBjb2ZmX2hvd3RvX3RhYmxlLgotCSh4Y29mZl9ydHlwZTJob3d0byk6IFJlbmFtZSBmcm9tIHJzNjAwMGNvZmZfcnR5cGUyaG93dG8uCi0JKHhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lIGZyb20KLQlyczYwMDBjb2ZmX3JlbG9jX3R5cGVfbG9va3VwLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKF9iZmRfeGNvZmZfc2l6ZW9mX2hlYWRlcnMpOiBEZWZpbmUuCi0JKF9iZmRfeGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZS4KLQkoX2JmZF94Y29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkoX2JmZF94Y29mZl9iZmRfbGlua19zcGxpdF9zZWN0aW9uKTogRGVmaW5lLgotCShyczYwMDBjb2ZmX3ZlYyk6IEZvciBCRkRfSlVNUF9UQUJMRV9MSU5LLCB1c2UgX2JmZF94Y29mZiwgbm90Ci0JY29mZi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgQUlYLAotCWluY3JlbWVudCBzb2ZhciBieSBTTUFMTF9BT1VUU1ogaWYgbm90IGV4ZWN1dGFibGUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgQUlYLCBhbHdheXMgb3V0cHV0IGFuIGEub3V0Ci0JaGVhZGVyOyBpZiBub3QgZXhlY3V0YWJsZSwgaGVhZGVyIHNpemUgb2YgU01BTExfQU9VVFNaLgotCSogaGFzaC5jIChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoKTogQWRkIHhjb2ZmIGZpZWxkLgotCShfYmZkX3N0cmluZ3RhYl9pbml0KTogSW5pdGlhbGl6ZSB4Y29mZiBmaWVsZC4KLQkoX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9zdHJpbmd0YWJfYWRkKTogSW4gWENPRkYgbW9kZSwgbGVhdmUgdHdvIGJ5dGVzIGZvciBsZW5ndGguCi0JKF9iZmRfc3RyaW5ndGFiX2VtaXQpOiBJbiBYQ09GRiBtb2RlLCB3cml0ZSBvdXQgbGVuZ3RoLgotCSogbGliYmZkLWluLmggKF9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHhjb2ZmbGluay5vLgotCShDRklMRVMpOiBBZGQgeGNvZmZsaW5rLmMuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBTZXQgU0VDX0FMTE9DLCBub3QKLQlTRUNfTk9fRkxBR1MsIGZvciAuYWNvbW1vbiBzZWN0aW9uLiAgRnJvbSBQZXRlciBTY2hhdWVyCi0JPFBldGVyLlNjaGF1ZXJAUmVnZW50LkUtVGVjaG5pay5UVS1NdWVuY2hlbi5ERT4uCi0KLVNhdCBPY3QgMTQgMjE6MzY6MDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChpbl9yZWxvY19wKTogQWRkLCBjbG9uZSBmcm9tIGNvZmYtaTM4Ni5jLgotCi1GcmkgT2N0IDEzIDE3OjQ4OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBhY2NvbmZpZy5oIChIQVZFX1NZU19QUk9DRlNfSCk6IFVuZGVmLCB3aXRoIGNvbW1lbnQuCi0JKiBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgotCi0JKiBvcG5jbHMuYyAoZ2V0cGFnZXNpemUpIFshSEFWRV9HRVRQQUdFU0laRV06IERlZmluZSBhcyAyMDQ4LgotCShfYmZkX2NodW5rc2l6ZSk6IE5ldyB2YXJpYWJsZS4KLQkoX2JmZF9uZXdfYmZkKTogU2V0IGl0IHRvIGdldHBhZ2VzaXplKCkgaWYgbmVnYXRpdmUsIGFuZCB1c2UgaXQKLQlmb3Igb2JzdGFjayBjaHVuayBzaXplLgotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgZ2V0cGFnZXNpemUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogdHJhZC1jb3JlLmMgKHJhd3B0cik6IE1ha2UgaXQgYSBsb2NhbCB2YXJpYWJsZSBvZgotIAlwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcC4KLQotRnJpIE9jdCAxMyAxMToyMjowMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChpbl9yZWxvY19wKTogTmV3LgotCSogY29mZi1pMzg2LmMgKGluX3JlbG9jX3ApOiBOZXcuCi0JKiBjb2ZmY29kZS5oOiBBbGx3YXlzIGluY2x1ZGUgcGVpY29kZS5oIGlmIENPRkZfV0lUSF9QRS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBPbmx5IHNldCBoYXNfcmVsb2Nfc2VjdGlvbgotCWlmIFBFX0lNQUdFLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IENhbGwKLQlpbl9yZWxvY19wIHRvIGRlY2lkZSBpZiByZWxvYyBzaG91bGQgYmUgZW1pdHRlZC4KLQkqIGxpYmNvZmYuaCAocGVfZGF0YV90eXBlLmluX3JlbG9jX3ApOiBOZXcuCi0JKiBwZWljb2RlLmggKHBlX21rb2JqZWN0KTogSW5pdGlhbGl6ZSBpbl9yZWxvY19wLgotCi1XZWQgT2N0IDExIDAwOjQ5OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogTW92ZSB0byBjb2ZmZ2VuLmMuCi0JKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBDb3B5IGZyb20gY29mZmdlbi5jLgotCShfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBMaWtld2lzZS4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDb3JyZWN0IGNvbmRpdGlvbnMKLQl1bmRlciB3aGljaCB0eXBlIGFuZCBzaXplIGNoYW5nZSB3YXJuaW5ncyBhcmUgaXNzdWVkLgotCi1UdWUgT2N0IDEwIDE4OjMyOjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2NvdW50X2xpbmVudW1iZXJzKTogRG9uJ3QgY291bnQgbGluZSBudW1iZXJzIGZvcgotCWEgc3ltYm9sIHdoaWNoIGlzIG5vdCBpbiBhIHJlYWwgc2VjdGlvbi4KLQkoY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IFJlbmFtZSBmcm9tCi0JY29mZl9saW5rX2hhc2hfbmV3ZnVuYyBhbmQgbWFrZSBub24tc3RhdGljLgotCShfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZS4KLQkoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBVc2UgaXQuCi0JKHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMpOiBNYWtlIHN0YXRpYy4KLQkqIGxpYmNvZmYtaW4uaCAoKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IERlY2xhcmUuCi0JKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IElmIFJTNjAwMENPRkZfQywgc2V0IGNwdXR5cGUKLQlmaWVsZCBpbiBYQ09GRiB0ZGF0YS4KLQkoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBDaGVjayBpZmRlZiBSUzYwMDBDT0ZGX0MsIG5vdCBpZmRlZgotCVU4MDJST01BR0lDLCBmb3IgY2xhcml0eS4gIFRyeSB0byBzZXQgYXJjaCBhbmQgbWFjaGluZSBjb3JyZWN0bHkKLQliYXNlZCBvbiBjcHV0eXBlIHN0b3JlZCBpbiBhLm91dCBoZWFkZXIsIG9yIGluIG5fdHlwZSBvZiBpbml0aWFsCi0JLmZpbGUgc3ltYm9sLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBjcHV0eXBlIGNvcnJlY3RseSBpbiBhLm91dAotCWhlYWRlci4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBZGQgY2FzdHMgdG8gZmlsZV9wdHIgdG8gYXZvaWQKLQl3YXJuaW5ncy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogU3dhcCBpbiBjcHV0eXBlIGZpZWxkLgotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBTd2FwIG91dCBjcHV0eXBlIGZpZWxkLiAgRG9uJ3QgY2xlYXIKLQlvbGQgcmVzdjEgZmllbGQuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IEFkZCBjcHV0eXBlIGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBjcHUtcnM2MDAwLmMgKHJzNjAwMF9jb21wYXRpYmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX3JzNjAwMF9hcmNoKTogVXNlIGl0LgotCSogY3B1LXBvd2VycGMuYyAocG93ZXJwY19jb21wYXRpYmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IERlZmluZSB2YXJpb3VzIGZsYXZvdXJzIG9mIFBvd2VyUEMuCi0JKGJmZF9wb3dlcnBjX2FyY2gpOiBVc2UgcG93ZXJwY19jb21wYXRpYmxlLiAgUG9pbnQgYXQKLQlhcmNoX2luZm9fc3RydWN0LgotCi1UdWUgT2N0IDEwIDEwOjUwOjQ2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6ICBSZW1vdmUgQklTT04uCi0KLVR1ZSBPY3QgMTAgMDE6Mjg6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IHdhcm4gYWJvdXQKLQljaGFuZ2luZyB0aGUgc2l6ZSBvciB0eXBlIGlmIHRoZSBvbGQgZGVmaW5pdGlvbiB3YXMgd2Vhay4KLQotTW9uIE9jdCAgOSAxMToyNDowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvbWJpbmVkX2VudHJ5X3R5cGUpOiBBZGQgZml4X2xpbmUgZmllbGQuCi0JKGNvZmZfc2x1cnBfbGluZV90YWJsZSk6IFdhcm4gaWYgd2UgdHJ5IHRvIHNldCB0aGUgbGluZW5vIGZpZWxkIG9mCi0JYSBzeW1ib2wgdHdpY2UuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgUlM2MDAwQ09GRl9DLCBoYW5kbGUgQ19CSU5DTCBhbmQKLQlDX0VJTkNMIGJ5IHNldHRpbmcgZml4X2xpbmUuICBGaXggQ19CU1RBVCBzeW1ib2wgdmFsdWUuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfbWFuZ2xlX3N5bWJvbHMpOiBIYW5kbGUgZml4X2xpbmUuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogT25seSB1c2UgTl9ERUJVRyBpZiB0aGUgc3ltYm9sIGlzIGluIHRoZQotCWFic29sdXRlIHNlY3Rpb24uCi0JKGNvZmZfcHJpbnRfc3ltYm9sKTogUHJpbnQgZml4X3ZhbHVlIHN5bWJvbHMgaW4gYSB1c2VmdWwgZmFzaGlvbi4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBEZWZpbmUuCi0JKHhjb2ZmX2RhdGEpOiBEZWZpbmUuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGQgeGNvZmZfb2JqX2RhdGEgZmllbGQgdG8gdGRhdGEgdW5pb24uCi0JKiBiZmQtaW4yLmgsIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX21rb2JqZWN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9ta29iamVjdCk6IERlZmluZS4KLQkoeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCShyczYwMDBjb2ZmX2hvd3RvX3RhYmxlKTogQ2hhbmdlIFJfVE9DIGNvbXBsYWluX29uX292ZXJmbG93IGZyb20KLQlzaWduZWQgdG8gYml0ZmllbGQuCi0JKHJzNjAwMGNvZmZfdmVjKTogQWRkIERZTkFNSUMgdG8gb2JqZWN0X2ZsYWdzLgotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZSAucGFkIGFuZAotCS5sb2FkZXIgc2VjdGlvbnMgc3BlY2lhbGx5LgotCShjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBJZiBSUzYwMDBDT0ZGX0MsIGdldCB0aGUgLnRleHQgYW5kIC5kYXRhCi0Jc2VjdGlvbiBhbGlnbm1lbnQgZnJvbSB0aGUgWENPRkYgdGRhdGEgaW5mb3JtYXRpb24uCi0JKGNvZmZfbWtvYmplY3RfaG9vayk6IElmIFJTNjAwMENPRkZfQywgc2V0IERZTkFNSUMgYmFzZWQgb24KLQlGX1NIUk9CSiwgYW5kIGNvcHkgdGhlIGV4dHJhIGEub3V0IGhlYWRlciBpbmZvcm1hdGlvbiBpbnRvIHRoZQotCVhDT0ZGIHRkYXRhIHN0cnVjdHVyZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBSUzYwMDBDT0ZGX0MsIHNldCBGX1NIUk9CSiwKLQlGX0RZTkxPQUQgYW5kIHRoZSBleHRyYSBhLm91dCBoZWFkZXIgaW5mb3JtYXRpb24uCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IEJTRl9OT1RfQVRfRU5EIGZvciBhIENfRVhUIG9yCi0JQ19ISURFWFQgc3ltYm9sIHdpdGggYXR0YWNoZWQgY3NlY3QgaW5mb3JtYXRpb24uCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbik6IElmIFJTNjAwMENPRkZfQywgc3dhcAotCWluIHRoZSBvX21heGRhdGEgZmllbGQuCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IElmIFJTNjAwMENPRkZfQywgc3dhcCBleHRyYSBYQ09GRiBmaWVsZHMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IERvbid0IG1vdmUgYW55IHN5bWJvbCB0byB0aGUKLQllbmQgaWYgQlNGX05PVF9BVF9FTkQgaXMgc2V0LgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZW5hbWUgX2JmZF9yZWFkX2FyX2hkciBmaWVsZCB0bwotCV9iZmRfcmVhZF9hcl9oZHJfZm4uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9yZWFkX2FyX2hkcik6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBhcmNoaXZlLmMgKF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zKTogQ2FzdCBfYmZkX3JlYWRfYXJfaGRyCi0JcmV0dXJuIHZhbHVlLgotCShkb19zbHVycF9ic2RfYXJtYXAsIGRvX3NsdXJwX2NvZmZfYXJtYXApOiBMaWtld2lzZS4KLQkoYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IExpa2V3aXNlLgotCShfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOiBMaWtld2lzZS4KLQotRnJpIE9jdCAgNiAxNjoxODozNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGFyY2hpdmUuYyAoYmZkX2dldF9uZXh0X21hcGVudCk6IFJldHVybiBCRkRfTk9fTU9SRV9TWU1CT0xTCi0Jd2hlbiB0aGUgc3ltYm9sIHRhYmxlIGlzIGVtcHR5LgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHJlc2VydmUKLQlzcGFjZSBmb3Igc2VjdGlvbiBzeW1ib2xzLCBzaW5jZSB3ZSBkb24ndCBvdXRwdXQgdGhlbSBlaXRoZXIuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5pbmR4KTogUmVtb3ZlZC4KLQotCSogcHRyYWNlLWNvcmUuYyAocmF3cHRyKTogTWFrZSBpdCBhIGxvY2FsIHZhcmlhYmxlIG9mCi0gCXB0cmFjZV91bml4X2NvcmVfZmlsZV9wLgotCi1GcmkgT2N0ICA2IDEyOjI0OjQ3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFJldHVybiBmYWxzZSwgbm90Ci0JTlVMTC4KLQotCSogY29uZmlnLmJmZCAocG93ZXJwY3ssbGV9LXtlbGYsc3lzdjQsZWFiaSxzb2xhcmlzMn0pOiBBZGQgTlQsIGFuZAotCU1hYyBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1GcmkgT2N0ICA2IDEyOjA0OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpeF9zeW1ib2xfbmFtZSk6IERvbid0IHRyeSB0byBzZXQgdXAgZmlsZQotCWF1eGVudCBpZiB0aGVyZSBpc24ndCBvbmUuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IElmIHRoZXJlIGlzIG5vIGZpbGUgYXV4ZW50LCB1c2UgU1lNTk1MRU4KLQlyYXRoZXIgdGhhbiBGSUxOTUxFTiBhcyB0aGUgbWF4aW11bSBuYW1lIGxlbmd0aC4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAotCV9iZmRfY29mZl9wcmludF9hdXguCi0JKGJmZF9jb2ZmX3ByaW50X2F1eCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAoUlM2MDAwQ09GRl9DIHZlcnNpb24pKTogUG9pbnRlcml6ZSB0aGUKLQlzY25sZW4gZmllbGQgb2YgYW4gWFRZX0xEIGNzZWN0IGF1eCBlbnRyeS4KLQkoY29mZl9wcmludF9hdXgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHBvaW50ZXJpemUgc2NubGVuIGZpZWxkOyBub3cgZG9uZQotCWluIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vay4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBDYWxsIGJmZF9jb2ZmX3ByaW50X2F1eC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBPbiBBSVgsIGNsZWFyIEZfUkVMRkxHCi0JaWYgdGhlcmUgYXJlIHN5bWJvbHMsIGZvciBuYXRpdmUgQUlYIGxkIGNvbXBhdGliaWxpdHkuCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKLQlfYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vay4KLQkoY29mZl9wb2ludGVyaXplX2F1eF9ob29rKTogRGVmaW5lIGFzIGEgZnVuY3Rpb24gaWYgUlM2MDAwQ09GRl9DCi0Jb3IgSTk2MCwgYW5kIGFzIDAgb3RoZXJ3aXNlLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmdlbi5jIChjb2ZmX3BvaW50ZXJpemVfYXV4KTogQ2hhbmdlIHBhcmFtZXRlcnMgIHRvIHRha2UKLQlzeW1ib2wgcG9pbnRlciBpbnN0ZWFkIG9mIHR5cGUgYW5kIGNsYXNzLCBhbmQgdG8gdGFrZSBhdXggaW5kZXguCi0JQ2FsbCBfYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayBpZiBpdCBpcyBkZWZpbmVkLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IEFsd2F5cyBjYWxsIGNvZmZfcG9pbnRlcml6ZV9hdXguCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgYWxsIGZpZWxkcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBjb2ZmLXJzNjAwMC5jOiBBZGQgZnVsbCBzdXBwb3J0IGZvciBBSVggYXJjaGl2ZXMuICBSZXdyaXRlIG9sZAotCXJlYWQtb25seS9ob3N0LW9ubHkgc3VwcG9ydC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgQ19ISURFWFQgc3ltYm9scyB0byBiZQotCUJTRl9MT0NBTC4KLQkoT1RIRVJfR0xPQkFMX0NMQVNTKTogRG8gbm90IGRlZmluZSB0byBiZSBDX0hJREVYVCBpZgotCVJTNjAwMENPRkZfQy4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIF9iZmRfcmVhZF9hcl9oZHIgZmllbGQuICBNb2RpZnkKLQlCRkRfSlVNUF9UQUJMRV9BUkNISVZFIGFjY29yZGluZ2x5LgotCSogbGliYmZkLWluLmggKF9iZmRfc25hcmZfYXJfaGRyKTogRG9uJ3QgZGVjbGFyZS4KLQkoX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IERlY2xhcmUuCi0JKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcik6IERlY2xhcmUuCi0JKF9iZmRfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKF9iZmRfbm9hcmNoaXZlX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfYnNkX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfY29mZl9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkqIGFyY2hpdmUuYzogQ2hhbmdlIGFsbCBjYWxsZXJzIG9mIF9iZmRfc25hcmZfYXJfaGRyIHRvIGNhbGwKLQlfYmZkX3JlYWRfYXJfaGRyIGluc3RlYWQuCi0JKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcik6IFJlbmFtZSBmcm9tIF9iZmRfc25hcmZfYXJfaGRyLgotCShfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogUmVuYW1lIGZyb20KLQljb21wdXRlX2FuZF93cml0ZV9hcm1hcC4gIE1ha2Ugbm9uLXN0YXRpYy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfc2x1cnBfYXJtYXApOiBDYWxsIF9iZmRfcmVhZF9hcl9oZHIgcmF0aGVyCi0JdGhhbiBfYmZkX3NuYXJmX2FyX2hkci4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlYWRfYXJfaGRyKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCSogaWVlZS5jIChpZWVlX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCSogc29tLmMgKHNvbV9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLVRodSBPY3QgIDUgMTQ6MDQ6MDcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5jIChjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IElmIHN5bXB0ciBpcwotCXplcm8sIHRoZXJlIGFyZW4ndCBhbnkgc3ltYm9scywgZXZlbiBpZiBuc3ltcyBpcyBzZXQuCi0KLVRodSBPY3QgIDUgMTE6NDU6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkIGFkanVzdF9oZWFkZXJzCi0JZmllbGQuCi0JKiBlY29mZi5jIChlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IENoZWNrIGZvciB2YXJpb3VzIEFscGhhCi0Jc2VjdGlvbnMsIGFuZCBzZXQgc3R5cCBjb3JyZWN0bHkgZm9yIHRoZW06IC5nb3QsIC5oYXNoLCAuZHluYW1pYywKLQkubGlibGlzdCwgLnJlbC5keW4sIC5jb25mbGljLCAuZHluc3RyLCAuZHluc3ltLCAuY29tbWVudC4KLQkoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IENoZWNrIGZvciB2YXJpb3VzIEFscGhhIHNlY3Rpb24KLQl0eXBlcy4KLQkoZWNvZmZfc29ydF9oZHJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUmV0dXJuIGJvb2xlYW4sIG5vdCB2b2lkLgotCVNvcnQgdGhlIHNlY3Rpb25zIGJ5IFZNQSBiZWZvcmUgbG9va2luZyB0aHJvdWdoIHRoZW0uICBQdXQgdGhlCi0JZmlyc3Qgbm9uIFNFQ19BTExPQyBzZWN0aW9uIG9uIGEgbmV3IHBhZ2UuICBQdXQgZXZlcnkgU0VDX0FMTE9DCi0Jc2VjdGlvbiBvbiBhbiBhcHByb3ByaWF0ZSBib3VuZGFyeSB3aXRoaW4gdGhlIHBhZ2UuCi0JKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQllY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuCi0JKF9iZmRfZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBmb3IgdmFyaW91cyBBbHBoYQotCXNlY3Rpb24gdHlwZXMgd2hlbiBpbmNyZW1lbnRpbmcgdGV4dF9zaXplIGFuZCBkYXRhX3NpemUuICBDYWxsCi0JYWRqdXN0X2hlYWRlcnMgYmFja2VuZCBmdW5jdGlvbiBpZiBpdCBleGlzdHMuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2FkanVzdF9oZWFkZXJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBhZGp1c3RfaGVhZGVycyBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBob3N0cy9pMzg2YnNkLmg6IFJlc3RvcmUgZmlsZSBpbmNvcnJlY3RseSBkZWxldGVkIG9uIFNlcCA2LgotCi1XZWQgT2N0ICA0IDE4OjE1OjAyIDE5OTUgIEplZmYgTGF3ICAobGF3QGh1cmwuY3lnbnVzLmNvbSkKLQotCSogcnM2MDAwLWNvcmUuYyAoQ09SRV9WRVJTSU9OXzEpOiBVc2UgQ09SRV9WRVJTSU9OXzEgaW5zdGVhZAotCW9mIEFMVEVSTkFURV9BSVhfQ09SRV9GT1JNQVQuCi0JKiBjb25maWd1cmUuaW4gKGFpeDQpOiBObyBsb25nZXIgbmVlZCBDT1JFX0ZMQUdTLgotCSogY29uZmlndXJlOiBVcGRhdGVkLgotCi1XZWQgT2N0ICA0IDE1OjM2OjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTlMzMmsgY2hhbmdlcyBmcm9tIElhbiBEYWxsOgotCSogYW91dHguaCAoTVlfZmluYWxfbGlua19yZWxvY2F0ZSwgTVlfcmVsb2NhdGVfY29udGVudHMpOiBOZXcKLQltYWNyb3MuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCwgYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0LAotCWFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogQ2FsbCB0aGVtIGluc3RlYWQgb2YgX2JmZF8qCi0JdmVyc2lvbnMuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCk6IE5ldyBtYWNybywgZGVmYXVsdHMKLQl0byB6ZXJvLgotCShiYWNrZW5kX2RhdGEpOiBVc2UgaXQgaW5zdGVhZCBvZiBoYXJkY29kZWQgemVyby4KLQotCSogYW91dC1uczMyay5jIChDVE9SX1RBQkxFX1JFTE9DX0hPV1RPKTogTmV3IG1hY3JvLgotCShNWV9zd2FwX3N0ZF9yZWxvY19vdXQpOiBVc2UgdWRhdGEuaSBmb3IgS0VFUElULCBkb24ndCBjYWxsIHN0b2kuCi0KLQkqIG5zMzJrbmV0YnNkLmM6IEluY2x1ZGUgYmZkLmguCi0JKE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyLCBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgbWFjcm9zLgotCShNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWNsYXJlIGZ1bmN0aW9uIHRvby4KLQkqIHBjNTMyLW1hY2guYyAoc2V0X3NpemVzKTogRG9uJ3QgZGVjbGFyZS4KLQkoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkKTogRGVmaW5lLgotCShiYWNrZW5kX2RhdGEsIE1ZX2JhY2tlbmRfZGF0YSk6IERvbid0IGRlZmluZS4KLQotCSogY29uZmlnLmJmZDogVHJlYXQgbnMzMmstcGM1MzItdXgqIGxpa2UgbnMzMmstcGM1MzItbWFjaCosIGFuZAotCW5zMzJrLSotbGl0ZXMqIGxpa2UgbnMzMmstKi1uZXRic2QqLgotCi0JKiBob3N0cy9uYnNkLmg6IFN3YXAgb3JkZXIgb2Ygc3lzL3ZtcGFyYW0uaCBhbmQgc3lzL3BhcmFtLmgsIHRvCi0JY29tcGlsZSBvbiBsaXRlcy4KLQotV2VkIE9jdCAgNCAxNDoxNTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVzdG9yZSBzZXR0aW5nCi0JZl90aW1kYXQgdG8gMCwgZGVsZXRlZCBvbiBBdWd1c3QgMjIuCi0KLVR1ZSBPY3QgIDMgMTY6Mjg6MzIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhLAotCWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEsCi0JY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogaWZkZWYgdG8gYWxsb3cgb3ZlcnJpZGVzLgotCSogcGVpY29kZS5oIChjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcKLQkocGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkoY29mZl9zd2FwX3Njbmhkcl9pbik6IFN3YXAgYnNzIHNpemUgaW50byB0aGUgcmlnaHQgcGxhY2UuCi0JKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGQgc29tZSBuZXdsaW5lcy4KLQotVHVlIE9jdCAgMyAxMTo1MzowNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BodXJsLmN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzZXR1cF9zZWN0aW9ucyk6IERvbid0IGRpZSBpZiBhIHNwYWNlIGhhcyBubyBzdWJzcGFjZXMuCi0KLU1vbiBPY3QgIDIgMTQ6MDg6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGxldCBhIHdlYWsKLQlkeW5hbWljIHN5bWJvbCBvdmVycmlkZSBhIGNvbW1vbiBzeW1ib2wuICBEb24ndCBjaGFuZ2UgdGhlIHNpemUgb3IKLQl0eXBlIGlmIHRoZXkgaGF2ZSBiZWVuIHNldCBhbmQgdGhlIG5ldyBzeW1ib2wgaXMgbm90IGEgZGVmaW5pdGlvbi4KLQlXYXJuIGlmIHRoZSBzaXplIG9yIHR5cGUgY2hhbmdlcy4KLQotU3VuIE9jdCAgMSAwMTozNDo0MSAxOTk1ICBKZWZmIExhdyAgKGxhd0BodXJsLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBEb24ndCB3cml0ZSB0aGUgc3ltYm9sIHRhYmxlIG9yCi0Jc3ltYm9sCXN0cmluZ3MuCi0JKHNvbV9maW5pc2hfd3JpdGluZyk6IFdyaXRlIHRoZW0gaGVyZS4gIFBsYWNlIHRoZW0gYWZ0ZXIgdGhlCi0Jc3Vic3BhY2UgZGF0YSwgYnV0IGJlZm9yZSB0aGUgcmVsb2NzLgotCi1GcmkgU2VwIDI5IDExOjAxOjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBKdXN0IHBhc3MgZmFsc2UsIG5vdAotCWluZm8tPnNoYXJlZF9saWJyYXJ5LCB0byBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogRG9uJ3Qgd2FybiBhYm91dCBhIHJlbG9jIGluIHRoZSAudGV4dAotCXNlY3Rpb24uCi0JKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBSZW1vdmUgLnRleHQgc2VjdGlvbiBhc3NlcnRpb24uCi0KLVRodSBTZXAgMjggMTg6NDg6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgcG93ZXJwYy0qLW1hY29zKiwgcG93ZXJwYy0qLW1wdyouCi0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogQWRkIHBtYWNfeGNvZmZfdmVjIGNhc2UuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1wbWFjLm8uCi0JKiBjb2ZmLXBtYWMuYzogTmV3IGZpbGUsIFBvd2VyTWFjIFhDT0ZGIHN1cHBvcnQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZCBQb3dlck1hYyBjYXNlLgotCSogdGFyZ2V0cy5jIChwbWFjX3hjb2ZmX3ZlYyk6IERlY2xhcmUuCi0KLQkqIG1wdy1jb25maWcuaW46IFZhcmlvdXMgY2hhbmdlcyB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlCi0JYXV0b2NvbmYtYmFzZWQgY29uZmlndXJ5LgotCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgc2VkIGNvbW1hbmRzIHRvIHRyYW5zbGF0ZSBVbml4Ci0JbWFrZWZpbGUgaW50byBNUFcgc3ludGF4LgotCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KLQkqIGhvc3RzL21wdy5oOiBSZW1vdmUuCi0JKiBiZmQtaW4uaCwgYmZkLWluMi5oOiBJZiBNUFcsIGluY2x1ZGUgdGhlIGZpbGUgdGhhdCBkZWZpbmVzCi0JdHJ1ZSBhbmQgZmFsc2UgYXMgZW51bXMsIHRoZW4gZGVmaW5lIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVELgotCi1UaHUgU2VwIDI4IDE3OjA2OjIzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfZ2V0X3N5bXRhYik6IFJldHVybiBhbiBlbXB0eSBzdHJpbmcgb24gZXJyb3IuCi0JKiBvcG5jbHMuYyAoYmZkX2ZkcGVucik6IENoYW5nZSBXSU4zMiByZXN0cmljdGlvbiB0byBXSU5HREIuCi0KLVRodSBTZXAgMjggMTU6MzA6NDQgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQG5lbGxpZT4KLQotCSogY29mZi1wcGMuYzogUmVmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIGdudSBjb252ZW50aW9ucwotCSAgICAgICAgICAgICAgUmVtb3ZlZCBpcnJlbGV2YW50ICJpZiAwIiBjb2RlCi0KLVRodSBTZXAgMjggMTE6MTk6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBocDMwMGhwdXguYyAoY29udmVydF9zeW1fdHlwZSk6IFRyZWF0IHNlY29uZGFyeSBzeW1ib2xzIGFzIHdlYWsKLQlzeW1ib2xzIHJhdGhlciB0aGFuIGFzIGluZGlyZWN0IHN5bWJvbHMuCi0JKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEb24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIGFib3V0Ci0Jc2Vjb25kYXJ5IHN5bWJvbHMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IE1ha2Ugc3VyZSB0aGF0IHRoZSBhbGlnbm1lbnQKLQlvZiAuY3RvcnMgYW5kIC5kdG9ycyBzZWN0aW9ucyBpcyBubyBsYXJnZXIgdGhhbiAyLgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IERvbid0IGNoYW5nZQotCWJmZF9saW5rX2hhc2hfY29tbW9uIHRvIGJmZF9saW5rX2hhc2hfbmV3LCBzaW5jZSBpdCBtYXkgYmUgb24gdGhlCi0JdW5kZWYgbGlzdC4KLQkoYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEb24ndCBwdXQgX19EWU5BTUlDIGluIHRoZQotCWR5bmFtaWMgc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IEhhbmRsZSByZWxvY3MgY29ycmVjdGx5IHdoZW4gY3JlYXRpbmcgYQotCXNoYXJlZCBsaWJyYXJ5LgotCShzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbWFyayB0aGUgX19EWU5BTUlDIHN5bWJvbCBhcwotCXdyaXR0ZW4gZXZlbiBpZiBpdCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotCShzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IFVzZSBwbHRfb2Zmc2V0IGZvciB0aGUgYWRkcmVzcyBvZgotCXRoZSBqdW1wIHRhYmxlIHJlbG9jLiAgQWRkIGFuIGFzc2VydGlvbi4gIFVzZSBSRUxPQ19KTVBfU0xPVAotCXJhdGhlciB0aGFuIHRoZSBjb25zdGFudCAyMi4KLQkoc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYyk6IEhhbmRsZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCShzdW5vc19maW5pc2hfZHluYW1pY19saW5rKTogU2V0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgR09UIHRvCi0JemVybyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBJZiB0aGVyZSBpcyBhIHN5bWJvbCBfX0RZTkFNSUMsCi0Jd3JpdGUgaXQgb3V0IGF0IHRoZSBzdGFydCBvZiB0aGUgc3ltYm9sIHRhYmxlLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1hcm0uby4KLQotVGh1IFNlcCAyOCAwMDo1ODowNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBhcm0tKi1jb2ZmLgotCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6IEFkZCBhcm1jb2ZmX3tsaXR0bGUsYmlnfV92ZWMuCi0JKiB0YXJnZXRzLmMgKGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYy4KLQkqIGNvZmYtYXJtLmMgKGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYyk6IEFsd2F5cyBkZWZpbmUuCi0KLVdlZCBTZXAgMjcgMTA6Mzc6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF9maW5kX3RhcmdldCk6IFJlbW92ZSBkZWJ1Z2dpbmcgY29kZS4KLQotV2VkIFNlcCAyNyAwNzoyMzozOSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAbmVsbGllPgotCi0JKiBjb2ZmLXBwYy5jLCBwZS1wcGMuYywgcGVpLXBwYy5jOiBJbml0aWFsIGJmZCBmb3IgY29mZi9QRQotICAgICAgICBzdXBwb3J0IG9uIHBvd2VycGMuCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgKi1wcGMgZmlsZXMKLQkqIGNvZmZjb2RlLmg6IHBwYyBNQUdJQywgYW5kIHVzZSBwZWljb2RlLmggcmF0aGVyIHRoYW4gY29mZnN3YXAuaCB0bwotICAgICAgICBhbGxvdyBwZSBiYXNlZCAubydzIHRvIGJlIHNoYXJlZCB3aXRoIG90aGVyIHRvb2xzIG9uIHBwYy9OVAotCSogY29uZmlnLmJmZDogYWRkZWQgcG93ZXJwY1tsZV0tW3BlfHdpbm50XSBjb25maWcgc3VwcG9ydAotCSogY29uZmlndXJlLCBjb25maWd1cmUuaW46IGFkZGVkIGJmZF9wb3dlcnBjW2xlXV9wZVtpXV92ZWMKLQkqIHBlaWNvZGUuaDogQWRkZWQgbW9yZSBzZWN0aW9uIGZsYWdzIGZvciBQRSBvbiBwcGMKLQkgICAgICAgICAgICAgQWRkZWQgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IHRvIGFsbG93IHBlaWNvZGUuaCB0byBiZQotCQkgICAgIHVzZWQgZm9yIG5vbi1pbWFnZSBQRSBmaWxlcyBvbiBwcGMuCi0JCSAgICAgQ2hlY2sgZm9yIGltYWdlLCBvciBub3QsIGJlZm9yZSBjb3B5aW5nIHBlX29wdGhkcgotCSogdGFyZ2V0cy5jOiBBZGRlZCBuZXcgYmZkJ3MKLQkqIHRhcmdldHMuYzogUmVtb3ZlZCB0d28gaW5hY3RpdmUgYmZkcyB0aGF0IHNob3VsZG4ndCBoYXZlIG1hZGUgaXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgZmFyLgotCi1UdWUgU2VwIDI2IDE0OjA2OjQxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19yZWxvY190eXBlKTogUmVuYW1lIGZyb20gcmVsb2NfdHlwZSwgYW5kIHVzZQotCWV4cGxpY2l0IHZhbHVlcyB0byBpbml0aWFsaXplIGFsbCByZWxvY3MuICBDaGFuZ2UgYWxsIHVzZXJzLgotCShwcGNfZWxmX2JydGFrZW5faW5uZXIpOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlIGJyYW5jaCBwcmVkaWNpdGlvbgotCXJlbG9jcy4KLQkocHBjX2VsZl9icnRha2VuX3JlbG9jKTogRGl0dG8uCi0JKHBwY19lbGZfaG93dG9fcmF3KTogVXNlIG5ldyBmdW5jdGlvbnMuICBNYWtlIHN1cmUgYWxsIHVuc3VwcG9ydGVkCi0JcmVsb2NzIHVzZSBwcGNfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jLgotCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgYW4gZXJyb3IKLQluZWVkcyB0byBiZSByZXBvcnRlZC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogU3VwcG9ydCBicmFuY2ggcHJlZGljdGlvbiByZWxvY3MuCi0KLVR1ZSBTZXAgMjYgMTI6NDg6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX2Fzc2VydCk6IFJlbW92ZSBcbiBmcm9tIHN0cmluZyBwYXNzZWQgdG8KLSAgICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyLgotCi0JKiBjb2ZmLWkzODYuYzogKFRXT19EQVRBX1NFQ1MpOiBEb24ndCBkZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgX2JmZF9tYWtlX3NlY3Rpb25faG9vay4KLQkoYmZkX2NvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBEb24ndCBkZWZpbmUuCi0JKGNvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBSZW1vdmUuCi0JKHNlY190b19zdHlwX2ZsYWdzKTogUmVtb3ZlIFRXT19EQVRBX1NFQ1MgY2FzZS4KLQkoc3R5cF90b19zZWNfZmxhZ3MpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBEb24ndCBpbml0aWFsaXplIG1ha2Vfc2VjdGlvbl9ob29rCi0JZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IEp1c3QgY2FsbAotCWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5LCBub3QgYmZkX21ha2Vfc2VjdGlvbiBvcgotCWJmZF9jb2ZmX21ha2Vfc2VjdGlvbl9ob29rLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9tYWtlX3NlY3Rpb25faG9vayk6IFJlbW92ZS4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBEb24ndCBkZWNsYXJlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBEb24ndCBpbml0aWFsaXplCi0JbWFrZV9zZWN0aW9uX2hvb2sgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IERvbid0IHRyeSB0byBzdHVmZgotCXBvaW50ZXJzIGludG8gdmFsdWUgZmllbGQgZm9yIHdhcm5pbmcgYW5kIGluZGlyZWN0IHN5bWJvbHM7IGp1c3QKLQlsZWF2ZSB0aGUgdmFsdWUgZmllbGQgYWxvbmUuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFVzZSBuZXh0IHN5bWJvbCBmb3IKLQl3YXJuaW5nIGFuZCBpbmRpcmVjdCBzeW1ib2xzLCByYXRoZXIgdGhhbiBsb29raW5nIGluIHN5bWJvbCB2YWx1ZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IFJlbW92ZSBpbmRpcmVjdF9wdHJfcHRyCi0JcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgUmVtb3ZlIHN1cHBvcnQgZm9yIGluZGlyZWN0Ci0Jc3ltYm9sczsgaXQgZGlkbid0IHdvcmsgYW55aG93LgotCShfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFJlbW92ZSBpbmRpcmVjdF9wdHIgdmFyaWFibGUuCi0JKiBzeW1zLmM6IENoYW5nZSBjb21tZW50cyBhYm91dCBCU0ZfV0FSTklORyBhbmQgQlNGX0lORElSRUNULgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gU2VwIDI1IDE2OjA0OjA5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogRm9yIGFsbCAxNC1iaXQgYnJhbmNoIHJlbG9jcywKLQlnbyBiYWNrIHRvIHRlbGxpbmcgdGhlIHRvb2xzIHRoaXMgcmVsb2Mgb3BlcmF0ZXMgb24gMzIgYml0cy4KLQotTW9uIFNlcCAyNSAxMTo0ODowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9jYWxsYmFjayk6IFVzZSBfYmZkX2Vycm9yX2hhbmRsZXIKLQlyYXRoZXIgdGhhbiBhIGRpcmVjdCBmcHJpbnRmLgotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKHBwY19lbGZfdW5zdXBwb3J0ZWRfcmVsb2MpOiBMaWtld2lzZS4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBpMzg2bGludXguYyAobGludXhfdGFsbHlfc3ltYm9scyk6IExpa2V3aXNlLgotCShsaW51eF9maW5pc2hfZHluYW1pY19saW5rKTogTGlrZXdpc2UuCi0JKiBvc2YtY29yZS5jIChvc2ZfY29yZV9jb3JlX2ZpbGVfcCk6IExpa2V3aXNlLgotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV9zaXplb2ZfaGVhZGVycyk6IExpa2V3aXNlLgotCSogc3JlYy5jIChzcmVjX2JhZF9ieXRlKTogTGlrZXdpc2UuCi0JKiBiZmQuYyAoYmZkX2Fzc2VydCk6IExpa2V3aXNlLiAgQWxzbyBjaGFuZ2UgZmlsZSB0byBiZSBjb25zdC4KLQkqIGxpYmJmZC1pbi5oIChiZmRfYXNzZXJ0KTogRGVjbGFyZSBmaXJzdCBwYXJhbWV0ZXIgY29uc3QuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogRG9uJ3QgYm90aGVyIHRvIGZwcmludGY7IHJldHVybmluZwotCWJmZF9yZWxvY19vdmVyZmxvdyBpcyBlbm91Z2guCi0JKiBjb2ZmLWg4MzAwLmMgKHJ0eXBlMmhvd3RvKTogRG9uJ3QgYm90aGVyIHRvIGZwcmludGY7IGp1c3QgYWJvcnQuCi0JKiBjb2ZmLWg4NTAwLmMgKHJ0eXBlMmhvd3RvKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXo4ay5jIChydHlwZTJob3d0byk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgotCSogZWxmLmMgKF9iZmRfZWxmX2dldF9saW5lbm8pOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfbm9faW5mb190b19ob3d0byk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvX3JlbCk6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKGNvbnZlcnRfc3ltX3R5cGUpOiBMaWtld2lzZS4KLQkoTVkoc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVtb3ZlICNpZiAwIHNlY3Rpb25zLgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBsaW5lX2J1ZiBmaWVsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBSZW1vdmUgc3RhdGljcyBidWZmZXIKLQlhbmQgZmlsZW5hbWVfYnVmZmVyLiAgSW5zdGVhZCwgdXNlIGEgbWFsbG9jIGJ1ZmZlciBzdG9yZWQgaW4gdGhlCi0JbmV3IGxpbmVfYnVmIGZpZWxkLiAgUmVtb3ZlIGxlbmd0aCByZXN0cmljdGlvbnMuCi0KLQkqIGNvZmZnZW4uYyAoc3RyaW5nX3NpemUpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShkZWJ1Z19zdHJpbmdfc2l6ZSwgZGVidWdfc3RyaW5nX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoY29mZl9maXhfc3ltYm9sX25hbWUpOiBBZGQgc3RyaW5nX3NpemVfcCwgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwKLQlhbmQgZGVidWdfc3RyaW5nX3NpemVfcCBwYXJhbWV0ZXJzLiAgVXNlIHRoZW0gaW5zdGVhZCBvZiB0aGUKLQlnbG9iYWwgdmFyaWFibGVzLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCwgY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IEFkZCBsb2NhbCB2YXJpYWJsZXMgdG8gcmVwbGFjZSByZW1vdmVkCi0JZ2xvYmFsIHZhcmlhYmxlcy4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIG9mZnNldCwgaSwKLQlmdW5jdGlvbiwgYW5kIGxpbmVfYmFzZSBmaWVsZHMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBVc2Ugc2VjdGlvbiB0ZGF0YSB0byBjYWNoZQotCWluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiB1c2luZyBzdGF0aWMgdmFyaWFibGVzLgotCi0JKiBzdW5vcy5jIChzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyk6IEFkanVzdCBvZmZzZXRzIGluIGFuIE5NQUdJQwotCWZpbGUuICBGcm9tIFBldGVyIERlV29sZiA8cGxkQGFtdC50YXkxLmRlYy5jb20+LgotCi0JKiBpbml0LmMgKGluaXRpYWxpemVkKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZS4KLQkoYmZkX2luaXQpOiBEb24ndCBib3RoZXIgc2V0dGluZyBpbml0aWFsaXplZC4KLQkoYmZkX2NoZWNrX2luaXQpOiBSZW1vdmUuCi0JKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkKTogRG9uJ3QgY2FsbCBiZmRfY2hlY2tfaW5pdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1TYXQgU2VwIDIzIDAxOjIyOjIzIDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiAgRG9uJ3QgY2hlY2sgdGhlIGNvcmUgZmlsZQotCXNpemUgZm9yIGZ1bGwgY29yZSBkdW1wcy4gQ29weSBjb3JlIGZpbGUgaGVhZGVyIHRvIHByaXZhdGUgZGF0YS4KLQkocnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kLAotCXJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKTogIE5ldyBmdW5jdGlvbnMgdG8gZXh0cmFjdAotCXRoZSBmaWxlIG5hbWUgYW5kIHRlcm1pbmF0aW5nIHNpZ25hbCBmcm9tIHRoZSBjb3JlIGZpbGUuCi0JKiBjb2ZmLXJzNjAwMC5jOiAgVXNlIHRoZW0uCi0KLUZyaSBTZXAgMjIgMTc6NDQ6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQ2hhbmdlIGFyY2ggaW5mbyB0byBiZSBjb25zdCwgaW5pdGlhbGl6ZWQgYXQgY29tcGlsZSB0aW1lLgotCSogYXJjaHVyZXMuYzogUmVpbmRlbnQgbWFueSBmdW5jdGlvbnMuICBDaGFuZ2UgQ09OU1QgdG8gY29uc3QuCi0JKGJmZF9hcmNoX2luZm9fdHlwZSk6IE1ha2UgYXJjaF9uYW1lIGNvbnN0LiAgUmVtb3ZlIGRpc2Fzc2VtYmxlOwotCW5vdGhpbmcgc2V0IGl0IGFueWhvdy4gIE1ha2UgbmV4dCBjb25zdC4KLQkoYmZkX2FyY2hfaW5mb19saXN0KTogUmVtb3ZlLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IFJlbmFtZSBmcm9tIGFyY2h1cmVzX2luaXRfdGFibGUuICBDaGFuZ2UgZnJvbQotCWEgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdG8gYSB0YWJsZSBvZiBiZmRfYXJjaF9pbmZvX3R5cGUKLQlzdHJ1Y3R1cmUgYWRkcmVzc2VzLgotCShiZmRfc2Nhbl9hcmNoKTogUmV3cml0ZSBhY2NvcmRpbmdseS4gIFJldHVybiBhIGNvbnN0IHBvaW50ZXIuCi0JKGJmZF9sb29rdXBfYXJjaCk6IExpa2V3aXNlLgotCShiZmRfc2V0X2FyY2hfaW5mbyk6IFJld3JpdGUgYWNjb3JkaW5nbHkuICBDaGFuZ2UgYXJndW1lbnQgdG8gYmUgYQotCWNvbnN0IHBvaW50ZXIuCi0JKGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0KTogTWFrZSBjb25zdC4KLQkoYmZkX2FyY2hfaW5pdCwgYmZkX2FyY2hfbGlua2luKTogUmVtb3ZlLgotCShiZmRfZ2V0X2FyY2hfaW5mbyk6IFJldHVybiBhIGNvbnN0IHBvaW50ZXIuCi0JKiBpbml0LmMgKGJmZF9pbml0KTogRG9uJ3QgY2FsbCBiZmRfYXJjaF9pbml0LgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogTWFrZSBhcmNoX2luZm8gY29uc3QuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5pbjogUHV0ICYgYmVmb3JlIGV2ZXJ5dGhpbmcgaW4gJHNlbGFyY2hzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY3B1LSouYzogQ2hhbmdlIGJmZF8qX2FyY2ggZnJvbSBhIGZ1bmN0aW9uIHdoaWNoIGNhbGxzCi0JYmZkX2FyY2hfbGlua2luIHRvIGEgY29uc3Qgc3RydWN0dXJlLgotCSogaWVlZS5jIChpZWVlX29iamVjdF9wKTogTWFrZSBhcmNoIGNvbnN0LgotCi1GcmkgU2VwIDIyIDE2OjIzOjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfdHlwZSk6IEFkZCByZWxvY2F0aW9ucyB0byBzdXBwb3J0IGFsbCBvZgotCVBvd2VyUEMgVi40LgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZjMyLXBwYy5jIChyZWxvY190eXBlKTogVXBkYXRlIG5hbWVzIHRvIG1hdGNoIGN1cnJlbnQgZHJhZnQuCi0JKHBwY19lbGZfaG93dG9fcmF3KTogTWFyayAxNCBiaXQgcmVsb2NzIGFzIHNob3J0IHNpemVkIGFuZCBQQwotCXJlbGF0aXZlLiAgVXBkYXRlIG5hbWVzIHRvIGN1cnJlbnQgVi40IGRyYWZ0LgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIHN1cHBvcnQgZm9yIG1vcmUgcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlbmFtZSByZWxvY2F0aW9ucyB0byBtYXRjaCBkcmFmdC4KLQotVGh1IFNlcCAyMSAyMTo1MzoxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IEFsbG93IG1vZHVsZXMKLQljb21waWxlZCB3aXRoIC1tcmVsb2NhdGFibGUtbGliIHRvIGJlIGxpbmtlZCB3aXRoIGVpdGhlciBub3JtYWwKLQltb2R1bGVzIG9yIC1tcmVsb2NhdGFibGUgbW9kdWxlcy4KLQotV2VkIFNlcCAyMCAxMjowMzoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2xlYXIgdGhlIHZzdGFtcCBmaWVsZAotCWluIHRoZSBhLm91dCBoZWFkZXIuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpKTogRG9uJ3Qgc2V0IHJfZXh0ZXJuIGZvcgotCWEgcmVsb2MgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgZXZlbiBpZiBpdCdzIG5vdCBhIHNlY3Rpb24uCi0KLVR1ZSBTZXAgMTkgMTc6MDI6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZW1vdmUgdW51c2VkIGFsaWduX3Bvd2VyX21pbiBmaWVsZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIEFsbCBiYWNrZW5kczogUmVtb3ZlIGluaXRpYWxpemF0aW9uIG9mIGFsaWduX3Bvd2VyX21pbi4KLQotVHVlIFNlcCAxOSAxNDowMjoyMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogR2V0IHNpemVzIGZvciBCU1MgcmlnaHQuCi0KLU1vbiBTZXAgMTggMTQ6MzU6MDEgMTk5NSAgQXJuZSBILiBKdXVsICA8YXJuZWpAcHZ2LnVuaXQubm8+Ci0KLQkqIGNvbmZpZy5iZmQgKG1pcHMtZGVjLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmhvc3QgKG1pcHMtZGVjLW5ldGJzZCopOiBOZXcgaG9zdC4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1kZWMtbmV0YnNkKik6IE5ldyBuYXRpdmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBTZXAgMTUgMTA6MjQ6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JTWFrZSB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlciBtZXJnZSBjb21tb24gdHlwZXM6Ci0JKiBjb2ZmbGluay5jIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50KTogRGVmaW5lLgotCShzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlKTogRGVmaW5lLgotCShzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlKTogRGVmaW5lLgotCShjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCk6IERlZmluZS4KLQkoY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUpOiBEZWZpbmUuCi0JKGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXApOiBEZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBkZWJ1Z19tZXJnZSBmaWVsZC4KLQkoY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX2NvZmZfZmluYWxfbGluayk6IEFsbG9jYXRlIGFuZCBmcmVlIGRlYnVnX21lcmdlIHRhYmxlLgotCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogTWVyZ2UgaWRlbnRpY2FsIGVudW0sIHN0cnVjdCBhbmQgdW5pb24KLQl0eXBlcy4KLQotVGh1IFNlcCAxNCAxNDo1Mzo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlDb252ZXJ0IGk5NjAgQ09GRiB0byB1c2UgQ09GRiBiYWNrZW5kIGxpbmtlci4KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBVc2UgYSBjb2ZmX3NlY3Rpb25fZGF0YQotCXN0cnVjdHVyZSB0byBzdG9yZSB0aGUgc3ltYm9sIGJlaW5nIHVzZWQuCi0JKGNvZmZfaTk2MF9zdGFydF9maW5hbF9saW5rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfc3RhcnRfZmluYWxfbGluayk6IERlZmluZS4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCShjb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGNhbGxiYWNrIGZ1bmN0aW9uCi0JX2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsuCi0JKGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspOiBEZWZpbmUuCi0JKGNvZmZfc3RhcnRfZmluYWxfbGluayk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBBZGQgY29mZl9zdGFydF9maW5hbF9saW5rLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogTWFrZSBnbG9iYWxseQotCXZpc2libGUuCi0JKF9iZmRfY29mZl9maW5hbF9saW5rKTogQ2FsbCBiZmRfY29mZl9zdGFydF9maW5hbF9saW5rIGlmIHRoZQotCWZ1bmN0aW9uIGNhbGxiYWNrIGlzIG5vdCBOVUxMLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIHRkYXRhIGZpZWxkLgotCShfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluIChpY29mZl9iaWdfdmVjKTogQWRkIGNvZmZsaW5rLm8uCi0JKGljb2ZmX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIFNlcCAxMyAxNzozODoyMyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAcnRsLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjbGVhbi1pbmZvKTogUmVtb3ZlIGV4dHJhbmVvdXMgdGFiIGZyb20gbGluZQotCWZvbGxvd2luZyBhY3Rpb24uCi0KLVdlZCBTZXAgMTMgMTM6Mjc6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRmFpbCBpZiBhIHNlY3Rpb24gd2l0aCBubwotCWNvbnRlbnRzIGhhcyByZWxvY3MuCi0KLVRodSBTZXAgMTIgMTI6NDU6MzQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBLZWVwIHRoZQotCXJhdyBzaXplIHNhZmUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtZW1iZXIgaWYgaXQncyBhIHJlbG9jYXRhYmxlCi0JZmlsZS4KLQkqIGxpYmNvZmYtaW4uaCAocGVfZGF0YV90eXBlKTogTmV3IG1lbWJlciAnaGFzX3JlbG9jX3NlY3Rpb24nCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IENsZWFyIG5vdC1yZWxvYyBmbGFnCi0JaWYgcmVsb2NhdGFibGUgZmlsZS4gU3dhcCBvdXQgc2F2ZWQgcmF3IHNpemUuCi0KLVR1ZSBTZXAgMTIgMTI6MTQ6MzMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZG9fbWFpbnRhaW5lcl9jbGVhbik6IFJlbmFtZSBmcm9tIGRvX3JlYWxjbGVhbi4KLQkobWFpbnRhaW5lci1jbGVhbik6IFJlbmFtZSBmcm9tIHJlYWxjbGVhbiwgcGFzc2luZwotCW1haW50YWluZXItY2xlYW4gZG93biB0byBzdWJkaXJlY3RvcmllcywgYnV0IGxlYXZlIHJlYWxjbGVhbiBhcyBhCi0Jc3lub255bS4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUGFzcyBzeW1ib2wgbmFtZSB0bwotCXdhcm5pbmcgY2FsbGJhY2suCi0KLQkqIGRlcC1pbi5zZWQ6IFJlbW92ZSBjb25maWcuaCBmcm9tIGdlbmVyYXRlZCBkZXBlbmRlbmNpZXMuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwKLQlicm9rZW4gb3V0IG9mIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYi4KLQkoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogQ2FsbCBuZXcgZnVuY3Rpb24KLQlzdW5vc19zbHVycF9keW5hbWljX3N5bXRhYi4KLQkoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IEFkZCB0aHJlZSBuZXcgcGFyYW1ldGVycy4gIFJldHVybiB0aGUKLQlkeW5hbWljIHN5bWJvbCB0YWJsZSB0byB0aGUgY2FsbGVyLgotCSogYW91dHguaCAoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogUGVybWl0IGFkZF9keW5hbWljX3N5bWJvbHMKLQljYWxsYmFjayB0byBvdmVycmlkZSB0aGUgc3ltYm9scyBiZWluZyByZWFkLgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBBZGQgdGhyZWUgbmV3IHBhcmFtZXRlcnMKLQl0byBhZGRfZHluYW1pY19zeW1ib2xzIGNhbGxiYWNrLgotCi0JRXh0ZW5zaXZlIG1pbm9yIGNoYW5nZXMgdG8gYXZvaWQgdmFyaW91cyBnY2Mgd2FybmluZ3MuICBBbHNvOgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIGNvZmYtYXJtLm8uCi0JKiBhcmNodXJlcy5jIChiZmRfYXJjaF9pbmZvX3R5cGUpOiBDaGFuZ2UgbWFjaCBmaWVsZCBmcm9tIGxvbmcgdG8KLQl1bnNpZ25lZCBsb25nLgotCShiZmRfbG9va3VwX2FyY2gpOiBDaGFuZ2UgbWFjaGluZSBwYXJhbWV0ZXIgZnJvbSBsb25nIHRvIHVuc2lnbmVkCi0JbG9uZy4KLQotTW9uIFNlcCAxMSAxMDo1NTo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fc3RkX3JlbG9jcyk6IEZpeCBCRkRfQVNTRVJUOiBpdCdzIE9LIHRvIGZpbmQKLQlhIHN5bWJvbCB3aXRoIGEgbm9uLXplcm8gcGx0X29mZnNldC4KLQotRnJpIFNlcCAgOCAxMTo0NzoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoYWxpZ25fZmlsZV9wb3NpdGlvbik6IFJlbW92ZTsgbm90IHVzZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogT25seSBjaGVjayBmb3IgPHN5cy9wcm9jZnMuaD4gb24gYSBuYXRpdmUgc3lzdGVtLAotCWFuZCBtYWtlIHN1cmUgaXQgZGVmaW5lcyBwcnN0YXR1c190LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgU2VwICA3IDEyOjQ4OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBDb3JyZWN0IG02OGsgYWJvcnQgdGVzdC4KLQotCSogY29uZmlnLmluOiBSZW5hbWUgZnJvbSBjb25maWcuaC5pbi4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSIHdpdGggY29uZmlnLmg6Y29uZmlnLmluLgotCUNoZWNrIGZvciBjb25maWcuaDpjb25maWcuaW4gd2hlbiBjcmVhdGluZyBzdGFtcC1oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKHN0YW1wLWgpOiBEZXBlbmQgdXBvbiBjb25maWcuaW4gcmF0aGVyIHRoYW4KLQljb25maWcuaC5pbi4gIFNldCBDT05GSUdfSEVBREVSUyB0byBjb25maWcuaDpjb25maWcuaW4gd2hlbgotCWNhbGxpbmcgY29uZmlnLnN0YXR1cy4KLQotCSogTWFrZWZpbGUuaW4gKGRvX2Rpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuaCBhbmQgc3RhbXAtaC4KLQkoTWFrZWZpbGUpOiBKdXN0IHJlYnVpbGQgTWFrZWZpbGUuCi0JKGNvbmZpZy5oLCBzdGFtcC1oKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW46IENyZWF0ZSBzdGFtcC1oIHdoZW4gcmVidWlsZGluZyBjb25maWcuaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIFNlcCAgNiAxNTowMDozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSLiAgU3Vic3RpdHV0ZQotCUhPU1RfNjRCSVRfTE9ORy4gIENoZWNrIHRoYXQgdmFyaW91cyBoZWFkZXIgZmlsZXMgZXhpc3QuICBDaGVjawotCXRoYXQgZmNudGwgZXhpc3RzLiAgQ2FsbCBCRkRfQklOQVJZX0ZPUEVOLiAgQ2hlY2sgd2hldGhlciBtYWxsb2MKLQlhbmQvb3IgZnJlZSBuZWVkIHRvIGJlIGRlY2xhcmVkLiAgRG9uJ3QgbWFrZSBhIGxpbmsgdG8gc3lzZGVwLmguCi0JRGVmaW5lIFRSQURfSEVBREVSIGZvciB2YXJpb3VzIGhvc3RzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IERvbid0IHNldCBteV9ob3N0LiAgQWRkIGRlZmluaXRpb25zIHRha2VuIGZyb20KLQlob3N0IGhlYWRlciBmaWxlcyBmb3IgdmFyaW91cyBlbnRyaWVzLiAgUmVtb3ZlIGVudHJpZXMgd2hpY2ggbm93Ci0JZG8gbm90aGluZy4KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogY29uZmlnLmguaW46IE5ldyBmaWxlLCBidWlsdCBieSBhdXRvaGVhZGVyLgotCSogc3lzZGVwLmg6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKGRvX2Rpc3RjbGVhbik6IERvbid0IHJlbW92ZSBzeXNkZXAuaC4KLQkoUkVDT05GSUcpOiBSZW1vdmUuCi0JKExPQ0FMX0hfREVQUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChCRkRfTElCUykpOiBVc2UgJChMT0NBTF9IX0RFUFMpIHJhdGhlciB0aGFuIGxpYmJmZC5oIGFuZAotCSQoUkVDT05GSUcpLgotCSgkKEJGRF9NQUNISU5FUyksICQoQkZEX0JBQ0tFTkRTKSk6IExpa2V3aXNlLgotCSgkKE9QVElPTkFMX0JBQ0tFTkRTKSk6IExpa2V3aXNlLgotCShzdG1wLWJmZC5oKTogSnVzdCBzdWJzdGl0dXRlIGZvciBCRkRfSE9TVF82NEJJVF9MT05HLCByYXRoZXIgdGhhbgotCWxvb2tpbmcgdGhyb3VnaCBzeXNkZXAuaC4KLQkqIGJmZC1pbi5oIChCRkRfSE9TVF82NEJJVF9MT05HKTogRGVmaW5lOyBzZXQgYnkgTWFrZWZpbGUuCi0JKEJGRF9IT1NUXzY0X0JJVCk6IERlZmluZSBiYXNlZCBvbiBCRkRfSE9TVF82NEJJVF9MT05HLgotCShmcHJpbnRmX3ZtYSwgc3ByaW50Zl92bWEpOiBMaWtld2lzZS4KLQkoaW50NjRfdHlwZSwgdWludDY0X3R5cGUpOiBEb24ndCBkZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhcmNodXJlcy5jLCBiZmQuYywgc3JlYy5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkqIGVsZmNvcmUuaDogQ2hlY2sgSEFWRV9TWVNfUFJPQ0ZTX0ggcmF0aGVyIHRoYW4gSEFWRV9QUk9DRlMuCi0JKiBseW54LWNvcmUuYzogSW5jbHVkZSBzdHVmZiBmcm9tIG9sZCBob3N0cy9seW54LmguCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBDaGVjayBIQVZFX0ZOQ1RMIGFuZCBkZWZpbmVkIChGX0dFVEZMKSwKLQlyYXRoZXIgdGhhbiBOT19GQ05UTC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF9saXN0KTogQ2hlY2sgSE9TVF9IUFBBSFBVWCBhbmQgISBfX1NURENfXwotCXJhdGhlciB0aGFuIE5BVElWRV9IUFBBSFBVWF9DT01QSUxFUi4KLQkqIHRyYWQtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxlcnJuby5oPi4gIEluY2x1ZGUgVFJBRF9IRUFERVIgaWYgaXQKLQlpcyBkZWZpbmVkLgotCSogaG9zdHMvKi5oOiBSZW1vdmUgYWxsIGhlYWRlciBmaWxlcyB3aGljaCBtZXJlbHkgaW5jbHVkZSwKLQlkZWNsYXJlLCBhbmQgZGVmaW5lIHRoaW5ncy4gIExlYXZlIGhlYWRlciBmaWxlcyB3aGljaCBkZWZpbmUKLQlpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdHJhZC1jb3JlLmMuCi0KLQkqIGFjbG9jYWwubTQgKEJGRF9CSU5BUllfRk9QRU4pOiBEZWZpbmUuCi0JKEJGRF9DQ19GT1JfQlVJTEQpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW46IFVzZSBCRkRfQ0NfRk9SX0JVSUxELgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwICA1IDE5OjM1OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogRG9uJ3QgdHJ5IHRvIGdyZXAgLi4vTWFrZWZpbGUgaWYgaXQgZG9lc24ndCBleGlzdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29mZi1zcGFyYy5jIChDQUxDX0FEREVORCk6IERvbid0IHNldCB0aGUgYWRkZW5kIHRvIHRoZSB2YWx1ZSBvZgotCWEgZ2xvYmFsIHN5bWJvbC4KLQotVHVlIFNlcCAgNSAxMjo0ODoyNiAxOTk1ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IGkzODZwZV92ZSAtPiBpMzg2cGVfdmVjLgotCi1Nb24gU2VwICA0IDE0OjAyOjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IEluY29ycG9yYXRlIGhvc3QgTWFrZWZpbGUgZnJhZ21lbnRzIGJ5IHNldHRpbmcKLQlzaGVsbCB2YXJpYWJsZXMuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfUFJPR19DQy4gIFN1YnN0aXR1dGUgQ0ZMQUdTLCBIREVGSU5FUyBhbmQKLQlBUi4gIENhbGwgQUNfUFJPR19JTlNUQUxMLiAgU3Vic3RpdHV0ZSBDQ19GT1JfQlVJTEQsIGNob29zaW5nIGEKLQl2YWx1ZSBiYXNlZCBvbiB3aGV0aGVyIHRoZSBjb2RlIGlzIGJlaW5nIGNvbXBpbGVkIGJ5IGEgY3Jvc3MKLQljb21waWxlci4gIERvbid0IHN1YnN0aXR1dGUgaG9zdF9tYWtlZmlsZV9mcmFnIG9yIGZyYWdzLgotCSogYWNsb2NhbC5tNDogTmV3IGZpbGUgdG8gZGVmaW5lIGxvY2FsIEFDX1BST0dfQ0MuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfUFJPR1JBTSk6IFNldCB0byBASU5TVEFMTF9QUk9HUkFNQC4KLQkoSU5TVEFMTF9EQVRBKTogU2V0IHRvIEBJTlNUQUxMX0RBVEFALgotCShBUik6IFNldCB0byBAQVJALgotCShDQyk6IERlZmluZSBhcyBAQ0NALgotCShDRkxBR1MpOiBTZXQgdG8gQENGTEFHU0AuCi0JKENDX0ZPUl9CVUlMRCk6IFNldCB0byBAQ0NfRk9SX0JVSUxEQC4KLQkoQGhvc3RfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCi0JKEFMTF9DRkxBR1MpOiBDaGFuZ2UgJChIREVGSU5FUykgdG8gQEhERUZJTkVTQC4gIE1vdmUgJChDRkxBR1MpCi0JYWZ0ZXIgb3RoZXIgb3B0aW9ucy4KLQkoY29uZmlnLnN0YXR1cyk6IFJlbW92ZSBkZXBlbmRlbmN5IHVwb24gQGZyYWdzQC4KLQkqIGNvbmZpZy8qLm1oLCBjb25maWcvUkVBRE1FOiBSZW1vdmUuCi0KLQkqIGNvbmZpZy5iZmQ6IFJld3JpdGUgdG8gaW5jb3Jwb3JhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBNYWtlZmlsZQotCWZyYWdtZW50cyBieSBzZXR0aW5nIHNoZWxsIHZhcmlhYmxlcywgcmF0aGVyIHRoYW4gbWVyZWx5IHJldHVybmluZwotCXRoZSBuYW1lIG9mIGEgTWFrZWZpbGUgZnJhZ21lbnQuCi0JKiBjb25maWd1cmUuaW46IFVzZSBzaGVsbCB2YXJpYWJsZXMgc2V0IGJ5IGNvbmZpZy5iZmQgcmF0aGVyIHRoYW4KLQlsb29raW5nIGF0IHRoZSB0YXJnZXQgTWFrZWZpbGUgZnJhZ21lbnQgZmlsZXMuICBEb24ndCBzdWJzdGl0dXRlCi0JdGFyZ2V0X21ha2VmaWxlX2ZyYWcuICBEbyBzdWJzdGl0dXRlIFRERUZJTkVTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEB0YXJnZXRfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCi0JKEFMTF9DRkxBR1MpOiBDaGFuZ2UgJChUREVGSU5FUykgdG8gQFRERUZJTkVTQC4KLQkqIGNvbmZpZy8qLm10OiBSZW1vdmUuCi0KLU1vbiBTZXAgIDQgMDM6MTM6MjggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUHV0IGNoYW5nZXF1b3RlIGxpbmVzIGFyb3VuZCAiaVszNDVdODYiIHBhdHRlcm5zCi0Jc2VjdGlvbiBvZiBjb3JlIGZpbGUgc3VwcG9ydC4KLQotU3VuIFNlcCAgMyAxMTozMTo1OCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSB0byB1c2UgdGhlCi0JZ2VuZXJpYyB2ZXJzaW9uLgotCi1GcmkgU2VwICAxIDE3OjA4OjQwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBBZGQgSW1hZ2VCYXNlIHRvCi0JZW50cnksIHRleHRfc3RhcnQgYW5kIGRhdGFfc3RhcnQuCi0KLUZyaSBTZXAgIDEgMTg6MDY6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoT0ZJTEVTKTogUmVtb3ZlICQoVERFUEZJTEVTKS4KLQkqIGNvbmZpZy9hcG9sbG8ubXQgKFRERVBGSUxFUyk6IFJlbW92ZS4KLQkqIGNvbmZpZy9SRUFETUU6IFVwZGF0ZS4KLQotCSogY29uZmlndXJlLmluOiBGb3IgYSBuYXRpdmUgY29uZmlndXJhdGlvbiwgc2V0IENPUkVGSUxFIGFuZAotCUNPUkVGTEFHIGJhc2VkIG9uIHRoZSBjYW5vbmljYWwgaG9zdCBuYW1lLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShBTExfQ0ZMQUdTKTogQWRkIEBDT1JFRkxBR0AuCi0JKE9GSUxFUyk6IFJlcGxhY2UgJChIREVQRklMRVMpIHdpdGggQENPUkVGSUxFQC4KLQkqIGNvZmYtcnM2MDAwLmM6IENoZWNrIEFJWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfQUlYIGZvciBjb3JlIGZpbGUKLQlzdXBwb3J0IHJvdXRpbmVzLiAgQ2hlY2sgTFlOWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfTFlOWC4KLQkqIGx5bngtY29yZS5jOiBDaGVjayBMWU5YX0NPUkUgcmF0aGVyIHRoYW4gSE9TVF9MWU5YLgotCSogaTM4Nmx5bnguYzogTGlrZXdpc2UuCi0JKiBtNjhrbHlueC5jOiBMaWtld2lzZS4KLQkqIHNwYXJjbHlueC5jOiBMaWtld2lzZS4KLQkqIHJzNjAwMC1jb3JlLmM6IENoZWNrIEFJWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfQUlYLgotCSogKi1jb3JlLmM6IENvbW1lbnQgY2hhbmdlcy4KLQkqIGNvbmZpZy9kZWNzdGF0aW9uLm1oIChIREVQRklMRVMpOiBSZW1vdmUuCi0JKEhERUZJTkVTKTogUmVtb3ZlIC1EVFJBRF9DT1JFLgotCSogY29uZmlnL2lyaXgzLm1oIChSQU5MSUIpOiBSZW1vdmUuCi0JKiBjb25maWcvaXJpeDQubWggKEhERVBGSUxFUywgUkFOTElCKTogUmVtb3ZlLgotCShIREVGSU5FUyk6IFJlbW92ZSAtRElSSVhfQ09SRS4KLQkqIGNvbmZpZy9yaXNjb3MubWggKFJBTkxJQiwgSERFUEZJTEVTKTogUmVtb3ZlLgotCShIREVGSU5FUyk6IFJlbW92ZSAtRFRSQURfQ09SRS4KLQkqIGNvbmZpZy9uY3IzMDAwLm1oIChBUl9GTEFHUywgUkFOTElCKTogUmVtb3ZlLgotCSogY29uZmlnL3VsdHJhMy5taCAoUkFOTElCKTogUmVtb3ZlLgotCSogY29uZmlnL2FpeDQubWgsIGNvbmZpZy9hbHBoYW9zZi5taCwgY29uZmlnL2FtaXgubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9hcG9sbG8ubWgsIGNvbmZpZy9kZWx0YTY4Lm1oLCBjb25maWcvZGVsdGE4OC5taDogUmVtb3ZlLgotCSogY29uZmlnL2RweDIubWgsIGNvbmZpZy9lc2l4Lm1oLCBjb25maWcvaGFycmlzLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvaHAzMDAubWgsIGNvbmZpZy9ocDMwMGJzZC5taCwgY29uZmlnL2hwcGFic2QubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9ocHBhaHB1eC5taCwgY29uZmlnL2hwcGFvc2YubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9pMzg2YWl4Lm1oLCBjb25maWcvaTM4NmJzZC5taDogUmVtb3ZlLgotCSogY29uZmlnL2kzODZsaW51eC5taCwgY29uZmlnL2kzODZtYWNoMy5taDogUmVtb3ZlLgotCSogY29uZmlnL2kzODZzY28ubWgsIGNvbmZpZy9pMzg2di5taCwgY29uZmlnL2kzODZ2NC5taDogUmVtb3ZlLgotCSogY29uZmlnL2lyaXg1Lm1oLCBjb25maWcvbTg4a21hY2gzLm1oLCBjb25maWcvbWlwc2JzZC5taDogUmVtb3ZlLgotCSogY29uZmlnL21pcHNtYWNoMy5taCwgY29uZmlnL25ld3MtbWlwcy5taDogUmVtb3ZlLgotCSogY29uZmlnL25ld3MubWgsIGNvbmZpZy9wYzUzMm1hY2gubWgsIGNvbmZpZy9yaXNjaXgubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9yczYwMC5taCwgY29uZmlnL3JzNjAwMGx5bngubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taCwgY29uZmlnL3N0cmF0dXMubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9zeW1tZXRyeS5taCwgY29uZmlnL3N5c3Y0Lm1oLCBjb25maWcvdGFob2UubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy92YXhic2QubWgsIGNvbmZpZy92YXh1bHQubWgsIGNvbmZpZy92YXh1bHQyLm1oOiBSZW1vdmUuCi0KLUZyaSBTZXAgIDEgMTU6MTg6NTAgMTk5NSAgS2F6dW1vdG8gS29qaW1hICA8a2tvamltYUBpbmZvLmthbmFnYXdhLXUuYWMuanA+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3QgY2hhbmdlIGEgRFRfSU5JVCBvcgotCURUX0ZJTkkgZW50cnkgaWYgdGhlIGFwcHJvcHJpYXRlIHN5bWJvbCBpcyBub3QgaW4gdGhlIGhhc2ggdGFibGUuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBjcmVhdGVfcHJvZ3JhbV9oZWFkZXJzCi0JYW5kIHdhbnRfaGRyX2luX3NlZyBmaWVsZHMuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfd2FudF9oZHJfaW5fc2VnKTogRGVmaW5lIGlmIG5vdAotCWRlZmluZWQuCi0JKGVsZl9iYWNrZW5kX2NyZWF0ZV9wcm9ncmFtX2hlYWRlcnMpOiBMaWtld2lzZS4KLQkoZWxmTk5fYmVkKTogSW5pdGlhbGl6ZSBjcmVhdGVfcHJvZ3JhbV9oZWFkZXJzIGFuZAotCXdhbnRfaGRyX2luX3NlZy4KLQkqIGVsZi5jIChnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IENhbGwgY3JlYXRlX3Byb2dyYW1faGVhZGVycwotCWJhY2tlbmQgcm91dGluZS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBDaGVjayB3YW50X2hkcl9pbl9zZWcgYmFja2VuZCBmaWVsZC4gIENhbGwKLQljcmVhdGVfcHJvZ3JhbV9oZWFkZXJzIGJhY2tlbmQgcm91dGluZS4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogQWxpZ24gbm9uIGFsbG9jYXRlZAotCXNlY3Rpb25zIHdoZW4gY3JlYXRpbmcgYW4gZXhlY3V0YWJsZS4KLQotCSogZWxmY29kZS5oIChlbGZfc3dhcF9waGRyX2luKTogTWFrZSBub24gc3RhdGljLgotCShlbGZfc3dhcF9waGRyX291dCk6IE1ha2Ugbm9uIHN0YXRpYy4KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfc3dhcF9waGRyX2luKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3N3YXBfcGhkcl9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9waGRyX2luKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfcGhkcl9vdXQpOiBEZWNsYXJlLgotCi0JKiBlY29mZmxpbmsuYyAoZWNvZmZfY29sbGVjdF9zaHVmZmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0pOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3Bkcik6IERlY2xhcmUuCi0JKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSk6IERlY2xhcmUuCi0JKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1GcmkgU2VwICAxIDEzOjIwOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEZpeCB0eXBvLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEhhbmRsZSBpbmRpcmVjdCBhbmQKLQl3YXJuaW5nIHN5bWJvbHMuICBJZiBhbnkgc2VjdGlvbiBpcyBuYW1lZCAuZ251Lndhcm5pbmcuWFhYLCB0cmVhdAotCXRoZSBjb250ZW50cyBhcyBhIHdhcm5pbmcgdG8gYmUgaXNzdWVkIGlmIHRoZSBzeW1ib2wgWFhYIGlzCi0JcmVmZXJlbmNlZC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IEZvciBhbiBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbCwganVzdAotCW91dHB1dCB0aGUgc3ltYm9sIGl0IHBvaW50cyB0by4KLQotCSogbGlua2VyLmMgKF9iZmRfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBib3RoZXIgdG8gc2V0IGJmZF9lcnJvcgotCWlmIGJmZF9oYXNoX2FsbG9jYXRlIGZhaWxzLCBzaW5jZSBpdCB3aWxsIGFscmVhZHkgYmUgc2V0LgotCShnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogTGlrZXdpc2UuCi0JKGFyY2hpdmVfaGFzaF9uZXdmdW5jKTogTGlrZXdpc2UuCi0JKGhhc2hfZW50cnlfYmZkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBQYXNzIG5ldyBhcmd1bWVudHMgdG8gd2FybmluZwotCWNhbGxiYWNrLiAgQWxsb2NhdGUgYSBuZXcgd2FybmluZyB1c2luZyB0aGUgaGFzaCB0YWJsZSBuZXdmdW5jLgotCVVzZSBiZmRfaGFzaF9yZXBsYWNlIHRvIHVwZGF0ZSB0aGUgZW50cnkgaW4gdGhlIGhhc2ggdGFibGUsIHJhdGhlcgotCXRoYW4gYXNzdW1pbmcgd2UgY2FuIGNvcHkgdGhlIGZpZWxkcyB3aXRoIHN0cnVjdHVyZSBhc3NpZ25tZW50LgotCi0JKiBoYXNoLmMgKGJmZF9oYXNoX3JlcGxhY2UpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2hhc2hfcmVwbGFjZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLUZyaSBTZXAgIDEgMDg6MTI6NTAgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAYmVhdXR5LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtaXBzKnZyNDMwMC0qLWVsZiogdGFyZ2V0LgotCSogY29uZmlnL21pcHNidnI0MzAwLm10OiBBZGRlZC4KLQotVGh1IEF1ZyAzMSAxNjowMDo1MyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogYmZkLWluLmggKFBFIFNUVUZGKTogRGVsZXRlZC4KLQkqIGJmZC5jICh0ZGF0YS0+cGVfb2JqX2RhdGEpOiBOZXcuCi0JKGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogY29mZi1pMzg2LmMsIGNvZmYtYXJtLmMgKGNvZmZfKi1ydHlwZV90b19ob3d0byk6IEdldCBpbWFnZSBiYXNlIGZyb20KLQluZXcgcGxhY2UuCi0JKiBsaWJjb2ZmLmgsIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChwZV92YWx1ZSk6IERlbGV0ZQotCShjb2ZmX21rb2JqZWN0LCBjb2ZmX21rb2JqZWN0X2hvb2spOiBDb25kaXRpb25hbGx5IGJ1aWxkLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExvb2sgaW4gbmV3IHBsYWNlLgotCShhZGRfZGF0YV9lbnRyeSwgZmlsbF9wZV9oZWFkZXJfaW5mbyk6IERlbGV0ZWQuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlIFBFIHN0dWZmLgotCShjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogY29mZnN3YXAuaDogUmVtb3ZlIFBFIHN0dWZmLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiBsaWJjb2ZmLWluLmggKHBlX2RhdGFfdHlwZSk6IE5ldy4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiB0YXJnZXRzLmMgKF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIHBlaWNvZGUuaDogTmV3IGZpbGUuCi0KLVRodSBBdWcgMzEgMTE6NDk6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaDogQWRkIGV4dGVybiAiQyIgaWYgX19jcGx1c3BsdXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBjb252ZXJ0IGEgcmVsb2MKLQlhZ2FpbnN0IGFuIGFic29sdXRlIHN5bWJvbCBpbnRvIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24uCi0KLVRodSBBdWcgMzEgMDg6MDA6MTQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQkKLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jKTogRml4IGNvbW1vbiBzaXplIHByb2JsZW0uCi0JKGkzY29mZl9vYmplY3RfcCk6IERlbGV0ZS4KLQotV2VkIEF1ZyAzMCAyMDo0MToyNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChkZWxldGVtZWFjb2ZmX2FybV9yZWxvYyk6IERlbGV0ZWQuCi0JKGFybTI2KTogTm90IHBhcnRpYWwgaW5wbGFjZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRG9uJ3QKLQlkbyBwYWdlIGFsaWduaW5nIGlmIENPRkZfUEFHRV9TSVpFIGlzbid0IGRlZmluZWQuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX2luKTogVXBkYXRlIGltYWdlIGJhc2UgY29ycmVjdGx5LgotCi1UdWUgQXVnIDI5IDEzOjUwOjIxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKToKLQlDb21waWxlIGV2ZW4gaWYgQ09GRl9QQUdFX1NJWkUgaXNuJ3QgZGVmaW5lZC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmF0ZV9yZWxvY19zZWN0aW9uKTogV3JpdGUKLQliYXNlIGZpbGUgaW5mbyBhcyBydmFzLgotCSogY29mZi1hcm0uYyAoY29mZl9ydHlwZV90b19ob3d0byk6IERlYWwgd2l0aCByZWxvYyAxMS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlICNpZjBlZCBjb2RlCi0JT25seSByZW1vdmUgZW1wdHkgc2VjdGlvbnMgaW4gUEUgaW5tYWdlIGZpbGVzLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogcmVnZW5lcmF0ZWQuCi0JKiBjb2ZmLWFybS5jIChhb3V0YXJtX3N0ZF9yZWxvKTogTmV3IGVudHJ5IGF0IDExLgotCShhcm1fcmVsb2NfdHlwZV9sb29rdXApIDogVW5kZXJzdGFuZCB0eXBlIDExLgotCSogY29mZi1pMzg2LmMgKGhvd3RvX3RhYmxlKTogZml4IG5hbWUgb2YgcnZhIHR5cGUuCi0JKGNvZmYtaTM4Nl9ydHlwZV90b19ob3d0byk6IFVuZGVyc3RhbmQgUl9JTUFHRUJBU0UgdHlwZS4KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogLmVkYXRhIGlzIGRhdGEuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogR2V0IHBhZ2Ugc2l6ZSByaWdodCBmb3IgUEUuCi0JUGFnZXNpemUgaW5mbyBpcyBvbmx5IHZhbGlkIGluIFBFIGltYWdlIGZpbGVzLgotCShmaWxsX3BlX2hlYWRlcl9pbmZvKTogRml4IGZpZWxkcy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgZW5kX29mX2ltYWdlIGNhbGMuCi0JKF9iZmRfY29mZl9nZW5lcmF0ZV9yZWxvY19zZWN0aW9uKTogUmVtb3ZlIG9ycGhhbmVkIGNvbW1lbnQuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX2luKTogRG9uJ3QgYWx3YXlzIGFkZCBJTUFHRV9CQVNFLgotCVN3YXAgaW4gUEUgaGVhZGVyLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFNldHVwIFBFIGZsYWdzIGNvcnJlY3RseS4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19SVkEpOiBOZXcgZmllbGQuCi0KLVRodSBBdWcgMjQgMTc6NDk6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgaW5jbHVkZSBsaW5lIG51bWJlcnMgZm9yCi0JYSBzZWN0aW9uIGlmIGl0cyBvdXRwdXQgc2VjdGlvbiBoYXMgbm8gY29udGVudHMuCi0KLVdlZCBBdWcgMjMgMTY6NDg6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBBZGQgcGFyZW50aGVzZXMgdG8gRklYCi0JZXhwcmVzc2lvbiB0byBhdm9pZCBjb21waWxlciBidWcgb24gSFAtVVggOS4wMS4KLQotV2VkIEF1ZyAyMyAwOTo0OTozOSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAocGVfdmFsdWUpOiBVbmFuc2lmeS4KLQotTW9uIEF1ZyAyMSAxNzo0OToyOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoYmZkX2xpbmtfc3Vic3lzdGVtKTogVHVybiBlbnVtIGludG8gI2RlZmluZXMuCi0JKGJmZF9saW5rX3BlX2luZm9fZHZhbCk6IE5ldwotCShiZmRfbGlua19zdGFja19oZWFwKTogUmVuYW1lZCBhbmQgbWFzc2FnZWQgaW50byBiZmRfbGlua19wZV9pbmZvLgotCSogYmZkLWluMi5oOiByZWJ1aWx0LgotCSogYmZkLmMgKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IERlbGV0ZWQuCi0JKiBjb2ZmY29kZS5oIChwZV92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkoZmlsbF9wZV9oZWFkZXJfaW5mbyk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgbmV3IGZ1bmN0aW9uLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEluaXRpYWx6ZSBsaW5rX2RhdGEgaWYgbm90IHNldC4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfZmluYWxfbGlua19pbmZvKTogUmVtb3ZlIHBlIHJhbmRvbW5lc3MuCi0JKGRvcmVzX2NvbSk6IFVwZGF0ZSBpbmZvIGluIGJmZF9saW5rX3BlX2luZm9fZHZhbC4KLQkocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IFVzZSB0aGUgYmZkX2xpbmtfcGVfaW5mb19kdmFsLgotCShfYmZkX2NvZmZfZmluYWxfbGluayk6IFJlbW92ZSBQRSBzdHVmZiwgaW5pdGlhbGl6ZQotCWNvZmZfZGF0YS0+bGlua19pbmZvLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX1thb3V0fGZpbGVoZHJdX291dCk6IFVzZSBpbmRpcmVjdCBQRSBwb2ludGVyLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFVzZSByZWFsIGltYWdlYmFzZS4KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9kYXRhX3R5cGUubGlua19pbmZvKTogTmV3IGZpZWxkLgotCi1Nb24gQXVnIDIxIDExOjEwOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGxpbmtfYWN0aW9uKTogSWYgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSBmb2xsb3dzIGFuCi0JdW5kZWZpbmVkIHdlYWsgcmVmZXJlbmNlLCBjaGFuZ2UgdGhlIHR5cGUgdG8gdW5kZWZpbmVkLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogRG9uJ3QgcmVjb3JkIGFuCi0JdW5kZWZpbmVkIHdlYWsgcmVmZXJlbmNlIGFzIGRlZmluZWQsIGluIGNhc2UgaXQgdHVybnMgaW50byBhIHJlYWwKLQl1bmRlZmluZWQgcmVmZXJlbmNlIGxhdGVyIGluIHRoZSBzYW1lIGFyY2hpdmUuCi0KLVRodSBBdWcgMTcgMTY6Mjk6MDkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X3NlY3Rpb24pOiBDYXN0IHZhbHVlIGZvciB1c2VkX2J5X2JmZCBmaWVsZAotCXRvIFBUUiwgbm90IGNvZmZfc2VjdGlvbl90ZGF0YSBwb2ludGVyLCBzaW5jZSBQVFIgaXMgdGhlIHJlYWwgdHlwZQotCW9mIHRoZSBmaWVsZC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IERpdHRvLgotCi1UaHUgQXVnIDE3IDE0OjQ0OjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBsaW5raW5nIFNQQVJDIFN1bk9TIFBJQyBjb21waWxlZCBjb2RlLgotCSogc3Vub3MuYyAoU1BBUkNfUExUX1BJQ19XT1JEMCk6IERlZmluZS4KLQkoU1BBUkNfUExUX1BJQ19XT1JEMSwgU1BBUkNfUExUX1BJQ19XT1JEMik6IERlZmluZS4KLQkoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBnb3Rfb2Zmc2V0IGFuZCBwbHRfb2Zmc2V0Ci0JZmllbGRzLgotCShzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlKTogQWRkIGR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCBhbmQKLQlkeW5hbWljX3NlY3Rpb25zX25lZWRlZCBmaWVsZHMuCi0JKHN1bm9zX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCShzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQKLQlvZiBzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzLgotCShzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogQ2FsbCBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQkoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBDYWxsIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbCBzdW5vc19zY2FuX3JlbG9jcyBiZWZvcmUKLQljaGVja2luZyB3aGV0aGVyIHdlIG5lZWQgdG8gc2V0IHVwIHRoZSBkeW5hbWljIGxpbmsgaW5mb3JtYXRpb24uCi0JRGVmaW5lIF9fR0xPQkFMX09GRlNFVF9UQUJMRSBpZiBhbnl0aGluZyByZWZlcnJlZCB0byBpdC4KLQkoc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzKTogQ2FsbCBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4gIFVzZQotCXBsdF9vZmZzZXQgZmllbGQ7IG9ubHkgcHV0IHN5bWJvbCBpbiAucGx0IGlmIGl0IGlzIG5vdCBkZWZpbmVkIGJ5Ci0JYSByZWd1bGFyIG9iamVjdC4KLQkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogTGlrZXdpc2UuICBIYW5kbGUgYmFzZSByZWxhdGl2ZSByZWxvY3MuCi0JKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBTdG9yZSBkeW5vYmogaW4gbG9jYWwgdmFyaWFibGUuCi0JKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogQ2hlY2sgcGx0X29mZnNldCByYXRoZXIgdGhhbgotCWNoZWNraW5nIHdoZXRoZXIgc3ltYm9sIGlzIGluIC5wbHQgc2VjdGlvbi4gIElmIHN5bWJvbCBpcyBkZWZpbmVkCi0JaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLCB1c2UgU1BBUkNfUExUX1BJQ19XT1JEWzAxMl0sIGFuZCBkb24ndAotCWFkZCBhIEpNUF9UQkwgcmVsb2MuCi0JKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBBZGQgY29udGVudHMgYW5kIHJlbG9jYXRpb25wIGZpZWxkcy4KLQlJZiBwbHRfb2Zmc2V0IGlzIHNldCwgcmVkaXJlY3QgcmVsb2NhdGlvbiB0byBQTFQuICBJZiB0aGlzIGlzIGEKLQliYXNlIHJlbGF0aXZlIHJlbG9jLCByZWRpcmVjdCByZWxvY2F0aW9uIHRvIEdPVC4gIENoZWNrCi0JZHluYW1pY19zZWN0aW9uc19uZWVkZWQgZmllbGQgcmF0aGVyIHRoYW4gd2hldGhlciBkeW5vYmogaXMgc2V0LgotCShzdW5vc19maW5pc2hfZHluYW1pY19saW5rKTogQ2hlY2sgZHluYW1pY19zZWN0aW9uc19uZWVkZWQgZmllbGQKLQlyYXRoZXIgdGhhbiB3aGV0aGVyIGR5bm9iaiBpcyBzZXQuICBEb24ndCBkaWUgaWYgLm5lZWQgYW5kIC5ydWxlcwotCXNlY3Rpb25zIHdlcmUgbm90IGNyZWF0ZWQuCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9leHQpOiBNYXJrIFBDMTAsIFBDMjIsIGFuZCBKTVBfVEJMIGVudHJpZXMKLQlQQyByZWxhdGl2ZS4gIE1hcmsgUEMxMCBjb21wbGFpbl9vdmVyZmxvd19kb250LiAgTWFyayBQQzIyIGFuZAotCUpNUF9UQkwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBJZiBpbmZvLT5zaGFyZWQgaXMgc2V0LCBzZXQgRFlOQU1JQy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogQ2FsbCBjaGVja19keW5hbWljX3JlbG9jIGZvciBhbGwKLQlyZWxvY3MuICBQYXNzIGNvbnRlbnRzIGFuZCAmcmVsb2NhdGlvbi4gIERvbid0IHdhcm4gYWJvdXQgYW4KLQl1bmRlZmluZWQgc3ltYm9sIHVudGlsIGNoZWNrX2R5bmFtaWNfcmVsb2MgaGFzIGJlZW4gY2FsbGVkLiAgRG9uJ3QKLQl3YXJuIGFib3V0IGFuIHVuZGVmaW5lZCBzeW1ib2wgZm9yIGEgYmFzZSByZWxhdGl2ZSByZWxvYy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuICBGb3IgYSBiYXNlIHJlbGF0aXZlCi0JcmVsb2MsIGFsd2F5cyB0cmVhdCByX2luZGV4IGFzIGFuIGluZGV4IGludG8gdGhlIHN5bWJvbCB0YWJsZS4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGNvbnRlbnRzIGFuZAotCXJlbG9jYXRpb24gYXJndW1lbnQgdG8gY2hlY2tfZHluYW1pY19yZWxvYyBlbnRyeSBwb2ludC4KLQkoc3RydWN0IGFvdXRkYXRhKTogQWRkIGxvY2FsX2dvdF9vZmZzZXRzIGZpZWxkLgotCi1XZWQgQXVnIDE2IDAxOjAzOjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBGaXggYnVnIGluIGxhc3QgY2hhbmdlLgotCi1Nb24gQXVnIDE0IDExOjM5OjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBIYW5kbGUgYSBtYWNoaW5lIG9mCi0JYmZkX21hY2hfc3BhcmMgb3IgYmZkX21hY2hfc3BhcmM2NC4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBhIHN5bWJvbCBpcyBhIHdlYWsKLQlkZWZpbml0aW9uLCBhZGQgaXQgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGlmIGFueSBkeW5hbWljCi0Jb2JqZWN0IG1lbnRpb25zIGl0LiAgSWYgd2UgZG8gYWRkIGl0LCBtYWtlIHN1cmUgd2UgYWRkIHRoZQotCWNvcnJlc3BvbmRpbmcgcmVhbCBzeW1ib2wuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBBZGp1c3QgYSB3ZWFrIGRlZmluZWQgc3ltYm9sIHdoaWNoIHdlCi0JcHV0IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgZXZlbiBpZiBubyByZWd1bGFyIG9iamVjdCByZWZlcnMKLQl0byBpdC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogV2hlbiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYnJhcnksIGRvbid0IGFsbG9jYXRlIHNwYWNlIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYQotCWxvY2FsIHN5bWJvbC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ2hhbmdlIGFzc2VydGlvbgotCXRvIGFjY2VwdCBzeW1ib2wgd2l0aCB3ZWFrZGVmIHNldC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJhcnksIGRvbid0IGNvcHkgb3ZlciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBsb2NhbAotCXN5bWJvbC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotU3VuIEF1ZyAxMyAwMDo0MDo1OCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKFJfSFBQQV9CRUdJTl9CUlRBQik6IERlZmluZS4KLQkoUl9IUFBBX0VORF9CUlRBQik6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9CRUdJTl9CUlRBQiBhbmQgUl9FTkRfQlJUQUIuCi0KLVRodSBBdWcgMTAgMTU6NTM6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogU3dhcCB0aGUgYXJyYXkgZGltZW5zaW9ucwotCXdoZW5ldmVyIHhfZmNuYXJ5IGlzIG5vdCBiZWluZyB1c2VkIGZvciBzb21ldGhpbmcgZWxzZSwgcmF0aGVyCi0JdGhhbiBvbmx5IGZvciBhbiBhcnJheS4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBMaWtld2lzZS4KLQotVHVlIEF1ZyAgOCAxNjozNDo1NyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIG1vc3QKLQlvZiBzcGVjaWFsIGNhc2Ugc3R1ZmYgZm9yIFBFLiAgTm93IGhhbmRsZWQgYnkgcmVsb2NzLgotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IFNwZWNpYWwgY2FzZSBvZiBQRSB0eXBlIDdzLgotCShob3d0b190YWJsZSk6IFR5cGUgNyBpcyBkaXIzMi1ydmEuCi0KLVR1ZSBBdWcgIDggMTA6MTU6NDMgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgYWl4NCBleHBsaWNpdGx5LgotCSogcnM2MDAwLWNvcmUuYyAoQ09SRV9EQVRBX1NJWkVfRklFTEQpOiBOZXcgbWFjcm8gdG8gZ2V0IGEgdGhlIHNpemUKLQlvZiBhIGNvcmUgZHVtcCdzIGRhdGEgc2VjdGlvbi4gIFByb3ZpZGUgYWx0ZXJuYXRlIGRlZmluaXRpb24gZm9yIGFpeDQuCi0JKFNBVkVfRklFTEQpOiBTaW1pbGFybHkgZm9yIHNhdmUgc3RhdGUgZmllbGQgKHJlZ2lzdGVyIGluZm8pLgotCShTVEFDS19FTkRfQUREUik6IFByb3ZpZGUgZGVmaW5pdGlvbiBzdWl0YWJsZSBmb3IgYWl4NC4KLQkqIGNvbmZpZy97YWl4NC5taCxhaXg0Lm10fTogTmV3IGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0JKiBob3N0cy9haXg0Lmg6IExpa2V3aXNlLgotCi1Nb24gQXVnICA3IDIzOjAzOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogQ2FzdCBpbml0aWFsaXphdGlvbnMKLQl0byBhdm9pZCB3YXJuaW5ncy4KLQotTW9uIEF1ZyAgNyAxNDo1MTowOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9kZWNvZGVfc3ltY2xhc3MpOiBIYW5kbGUgYWJzb2x1dGUgc3ltYm9scyBieSBjaGVja2luZwotCXRoZSBTT00gdHlwZSAoc2luY2UgdGhleSB3aWxsIHJhcmVseSBpZiBldmVyIGJlIGluIHRoZSBhYnNvbHV0ZQotCXNlY3Rpb24pLgotCi1XZWQgQXVnICA2IDA5OjEyOjUwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyYzY0KTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGNwdS1zcGFyYy5jIChzcGFyY19hcmNoX2luZm8pOiBSZW5hbWVkIGZyb20gYXJjaF9pbmZvX3N0cnVjdC4KLQkoc3BhcmM2NF9hcmNoX2luZm8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShiZmRfc3BhcmNfYXJjaCk6IExpbmsgaW4gc3BhcmM2NF9hcmNoX2luZm8uCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl94eHgpOiBSZW5hbWVkIGZyb20gZWxmNjRfeHh4LgotCShzcGFyYzY0X2VsZl9vYmplY3RfcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX29iamVjdF9wKTogRGVmaW5lLgotCSogY29uZmlnL3NwYXJjNjQtZWxmLm10IChTRUxFQ1RfVkVDUyk6IEFkZCBiZmRfZWxmMzJfc3BhcmNfdmVjLgotCi1TYXQgQXVnICA1IDAwOjA0OjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20gKHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBSZXR1cm4gLTEgb24gZXJyb3IuICBDb21wdXRlCi0JcmV0dXJuIHZhbHVlIHdpdGggc2l6ZW9mIChhcmVsZW50ICopLCBub3Qgc2l6ZW9mIChhcmVsZW50KS4KLQotV2VkIEF1ZyAgMiAxMjozMjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJZiB0aGUgc2VjdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQotCXNoX2xpbmsgZmllbGQgb2YgYSByZWxvYyBzZWN0aW9uIGlzIG5vdCBhIHN5bWJvbCB0YWJsZSwgYW5kIHRoZQotCWZpbGUgY29udGFpbnMgYSBzaW5nbGUgc3ltYm9sIHRhYmxlLCBjbG9iYmVyIHRoZSBzaF9saW5rIGZpZWxkIG9mCi0JdGhlIHJlbG9jIHNlY3Rpb24gdG8gcG9pbnQgdG8gdGhlIHN5bWJvbCB0YWJsZS4KLQotVHVlIEF1ZyAgMSAxMDowOTowMSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChob3d0byByZWxvYyBBUk0yNik6IENoYW5nZSBzaXplIGZyb20gMyB0byAyLgotCShob3d0byByZWxvYyBBUk0yNkQpOiBMaWtld2lzZS4KLQotTW9uIEp1bCAyNCAxNDoxNzo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBVc2UgdGhlIGxpbmUganVzdCBiZWZvcmUKLQl0aGUgb2Zmc2V0LCBub3QgdGhlIG9uZSBqdXN0IGFmdGVyLiAgQnJlYWsgb3V0IG9mIHRoZSBsb29wIGFmdGVyCi0JZmluZGluZyBhIGZ1bmN0aW9uIHBhc3QgdGhlIG9mZnNldCwgbm90IG1lcmVseSB3aGVuIGZpbmRpbmcgYQotCWZ1bmN0aW9uIHdpdGggYSBsaW5lIGRlZmluZWQuCi0KLQkqIGVjb2ZmbGluay5jIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogV2hlbiBoYW5kbGluZyBzdGFiczoKLQljb3JyZWN0IHNldHRpbmcgb2Ygc3ltX3B0cl9lbmQgdG8gY29uc2lkZXIgc3ltYm9scyBza2lwcGVkIHdoZW4KLQlzZXR0aW5nIHN5bV9wdHI7IGRvbid0IGxlYXZlIGxvb3AgZWFybHkgdW5sZXNzIGFuIE5fRlVOIGlzIGZvdW5kCi0Jd2l0aCBhIGxhcmdlciB2YWx1ZS4KLQotCSogY29mZi1zaC5jIChzaF9jb2ZmX2hvd3Rvcyk6IE1hcmsgUl9TSF9QQ0RJU1A4QlkyIGFuZCBSX1NIX1BDRElTUAotCWFzIFBDIHJlbGF0aXZlLiAgRGVzY3JpYmUgUl9TSF9JTU0xNi4gIEFkZCBlbnRyaWVzIGZvcgotCVJfU0hfU1dJVENIMTYsIFJfU0hfU1dJVENIMzIsIFJfU0hfVVNFUywgUl9TSF9DT1VOVCwgYW5kCi0JUl9TSF9BTElHTi4KLQkoU1dBUF9JTl9SRUxPQ19PRkZTRVQpOiBEZWZpbmUuCi0JKFNXQVBfT1VUX1JFTE9DX09GRlNFVCk6IERlZmluZS4KLQkoQ0FMQ19BRERFTkQpOiBEZWZpbmUuCi0JKHNoX3JlbG9jKTogQ2hhbmdlIHN5bV92YWx1ZSBhbmQgYWRkciB0byB0eXBlIGJmZF92bWEuICBTa2lwIHJlbG9jCi0JdHlwZXMgb3RoZXIgdGhhbiBSX1NIX0lNTTMyIGFuZCBSX1NIX1BDRElTUCBvbiBhbiBleHRlcm5hbCBzeW1ib2wuCi0JKGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZS4KLQkoc2hfcmVsYXhfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNoX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9TSF9QQ0RJU1Agb24gYW4gZXh0ZXJuYWwgc3ltYm9sLgotCShzaF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDYWxsCi0JX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzLCBub3QgY29mZl9saW5rX2dldF9zeW1ib2xzLiAgQ2FsbAotCV9iZmRfY29mZl9mcmVlX3N5bWJvbHMsIG5vdCBjb2ZmX2xpbmtfZnJlZV9zeW1ib2xzLiAgQ2FsbAotCV9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSwgbm90IGNvZmZfcmVhZF9zdHJpbmdfdGFibGUuCi0JKGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBMaWtld2lzZS4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCShjb2ZmX2xpbmtfZ2V0X3N5bWJvbHMpOiBNb3ZlIHRvIGNvZmZnZW4uYy4KLQkoY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IExpa2V3aXNlLgotCShjb2ZmX2xpbmtfZnJlZV9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogVXNlIF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZS4KLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBVc2UgY2FjaGVkIHNlY3Rpb24gY29udGVudHMgaWYgYXZhaWxhYmxlLgotCVVzZSBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IGNhbGwgYmZkX3NlZWsuCi0JKGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE9ubHkgZGVmaW5lIGlmIG5vdAotCWFscmVhZHkgZGVmaW5lZC4KLQkoY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChidWlsZF9zdHJpbmdfdGFibGUpOiBSZW1vdmUuCi0JKF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJvbSBvbGQKLQljb2ZmX2xpbmtfZ2V0X3N5bWJvbHMgaW4gY29mZmxpbmsuYy4KLQkoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogTmV3IGZ1bmN0aW9uLCBtb3ZlZCBpbiBmcm9tIG9sZAotCWNvZmZfcmVhZF9zdHJpbmdfdGFibGUgaW4gY29mZmxpbmsuYy4KLQkoX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJtbyBvbGQKLQljb2ZmX2xpbmtfZnJlZV9zeW1ib2xzIGluIGNvZmZsaW5rLmMuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogVXNlIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scwotCXJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIHN5bWJvbHMgZGlyZWN0bHkuICBUbyBmcmVlIHRoZW0sIGNhbGwKLQlfYmZkX2NvZmZfZnJlZV9zeW1ib2xzLiAgVXNlIF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSByYXRoZXIKLQl0aGFuIGJ1aWxkX3N0cmluZ190YWJsZS4KLQkqIGxpYmNvZmYtaW4uaCAob2JqX2NvZmZfa2VlcF9zeW1zKTogRGVmaW5lLgotCShvYmpfY29mZl9rZWVwX3N0cmluZ3MpOiBEZWZpbmUuCi0JKGNvZmZfZGF0YV90eXBlKTogQWRkIGZpZWxkcyBrZWVwX3N5bXMgYW5kIGtlZXBfc3RyaW5ncy4KLQkoY29mZl9zZWN0aW9uX3RkYXRhKTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCi0JKGNvZmZfc2VjdGlvbl9kYXRhKTogRGVmaW5lLgotCShfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBEZWNsYXJlLgotCShfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBEZWNsYXJlLgotCShfYmZkX2NvZmZfZnJlZV9zeW1ib2xzKTogRGVjbGFyZS4KLQkoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotRnJpIEp1bCAyMSAyMjozMjo1NCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogQWRkIHN1cHBvcnQgZm9yIFJfUFBDX1NEQVJFTAotCXJlbG9jYXRpb24uCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBEaXR0by4KLQkocHBjX2VsZl9nb3QxNl9pbm5lcik6IERpdHRvLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotVGh1IEp1bCAyMCAxOToxOTowNiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IEFkZCBuZXcgKGlnbm9yZWQpCi0JYXJndW1lbnQuCi0JKiBlbGYzMi1ocHBhLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi1UaHUgSnVsIDIwIDE5OjAxOjA3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBsaWJhb3V0LmggKHNldF9hb3V0X3NlY3Rpb25fZGF0YSk6IE5ldyBtYWNyby4KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fcmVsb2NzKTogVXNlIGl0LgotCi0JKiBhb3V0LW5zMzJrLmMgKE1ZX3N3YXBfc3RkX3JlbG9jX291dCk6IFVuZGVmIEtFRVBJVCBiZWZvcmUKLQlkZWZpbmluZyBpdC4KLQotVGh1IEp1bCAyMCAxMzo0ODowMCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogaG9zdHMvaTM4NnY0LmggKGdldGdpZCwgZ2V0dWlkKTogIENoYW5nZSBwcm90b3R5cGVzIHRvIGJlCi0JY29tcGF0aWJsZSB3aXRoIFVuaXh3YXJlIDEueCBhbmQgVW5peHdhcmUgMi54LCBhbmQgcHJvYmFibHkgb3RoZXIKLQlpMzg2IHN2cjQgdmVyc2lvbnMgYXMgd2VsbC4KLQotVGh1IEp1bCAyMCAxMzo0MToyMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IFNpbmNlIGFybXBlIGFuZCBhcm1wZWkgaGF2ZSBiZWVuCi0Jc3BsaXQgaW50byBiaWctIGFuZCBsaXR0bGUtZW5kaWFuIHZhcmlhbnRzLCBsaXN0IGFsbCBvZiB0aGVtLAotCWluc3RlYWQgb2YgdGhlIG5vdy1ub25leGlzdGFudCBhcm1wZVtpXV92ZWMuCi0KLVRodSBKdWwgMjAgMDA6MDY6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogU2V0IGxtYSBiYXNlZCBvbiBwX3BhZGRyLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBzaF9hZGRyIGJhc2VkIG9uIGxtYSwgbm90IHZtYS4KLQotV2VkIEp1bCAxOSAxNTo1MjowMSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0JJR19TWU0pOiBSZXBsYWNlcyBUQVJHRVRfU1lNLgotCSogY29uZmlndXJlLmluIChhcm1wZV92ZWMsIGFybXBlaV92ZWMpOiBBZGQgYmktZW5kaWFuIHN1cHBvcnQuCi0JKiBjb25maWd1cmU6ICJyZWdlbmVyYXRlZCIuCi0JKiBwZS1hcm0uYyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9CSUdfU1lNKTogUmVwbGFjZXMgVEFSR0VUX1NZTS4KLQkoVEFSR0VUX0xJVFRMRV9OQU1FLCBUQVJHRVRfQklHX05BTUUpOiBSZXBsYWNlcyBUQVJHRVRfTkFNRS4KLQkqIHBlaS1hcm0uYyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9CSUdfU1lNKTogUmVwbGFjZXMgVEFSR0VUX1NZTS4KLQkoVEFSR0VUX0xJVFRMRV9OQU1FLCBUQVJHRVRfQklHX05BTUUpOiBSZXBsYWNlcyBUQVJHRVRfTkFNRS4KLQkqIHRhcmdldHMuYyAoYXJtcGVfdmVjLCBhcm1wZWlfdmVjKTogRGVsZXRlZC4KLQkoYXJtcGVfbGl0dGxlX3ZlYywgYXJtcGVfYmlnX3ZlYywgYXJtcGVpX2xpdHRsZV92ZWMsIGFybXBlaV9iaWdfdmVjKToKLQlBZGRlZC4KLQkqIGNvbmZpZy9hcm0tcGUubXQgKERFRkFVTFRfVkVDVE9SKTogRGVmYXVsdCBpcyBhcm1wZV9saXR0bGVfdmVjLgotCShTRUxFQ1RfVkVDUyk6IEFkZCBiaS1lbmRpYW4gc3VwcG9ydC4KLQotV2VkIEp1bCAxOSAxMDo0NzoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYzogQ2xlYW4gdXAgYW5kIGNvbW1lbnQuCi0JKHJfaW1tMzIpOiBSZW1vdmUuCi0JKHNoX2NvZmZfaG93dG9zKTogTmV3IHN0YXRpYyBhcnJheS4KLQkoU0hfQ09GRl9IT1dUT19DT1VOVCk6IERlZmluZS4KLQkoZ2V0X3N5bWJvbF92YWx1ZSk6IE1ha2UgcmVsb2NhdGlvbiBiZmRfdm1hIHJhdGhlciB0aGFuIGxvbmcuCi0JKFJUWVBFMkhPV1RPKTogUmV3cml0ZSB0byB1c2Ugc2hfY29mZl9ob3d0b3MuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZSB0byBzaF9yZWxvY2F0ZV9zZWN0aW9uLgotCShzaF9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotU2F0IEp1bCAxNSAwMTowMjo1MyAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiAgQWRkIHN1cHBvcnQgZm9yIGdlbmVyaWMgbTY4ayBTVlI0IGhvc3QuCi0KLUZyaSBKdWwgMTQgMTM6MTM6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChLRUVQSVQpOiBDaGFuZ2UgZGVmaW5pdGlvbiB0byB1ZGF0YS5pLgotCShLRUVQSVRUWVBFKTogUmVtb3ZlLgotCShOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApKTogQWRkIGNhc2VzIHRvIHRoZQotCWV4dGVuZGVkIHJlbG9jIHR5cGUgc3dpdGNoOiBTUEFSQ19HT1QxMCwgU1BBUkNfR09UMTMsIFNQQVJDX0dPVDIyLAotCVNQQVJDX1BDMTAsIFNQQVJDX1BDMjIsIFNQQVJDX1dQTFQzMC4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkpOiBEb24ndCBib3RoZXIgdG8gdXNlIHN0b2kgd2hlbgotCXJldHJpZXZpbmcgS0VFUElUIHZhbHVlLgotCShOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2Nfb3V0KSk6IExpa2V3aXNlLiAgQWxzbywgb25seSBhZGQgaW4KLQlvdXRwdXQgc2VjdGlvbiBWTUEgZm9yIHNlY3Rpb24gc3ltYm9scywgYW5kIGNoZWNrIEJTRl9TRUNUSU9OX1NZTQotCXRvIGNvbnRyb2wgd2hldGhlciB0byBzZXQgcl9leHRlcm4gdG8gMS4KLQotCSogc3ltcy5jOiBGaXggY29tbWVudHMgc28gdGhhdCBgbWFrZSBpbmZvJyB3b3Jrcy4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFNldCBTRUNfSEFTX0NPTlRFTlRTCi0JaW4gLm1kZWJ1ZyBzZWN0aW9uLCBpbiBjYXNlIGJhY2tlbmQgbGlua2VyIGhhcyBjbGVhcmVkIGl0LgotCi1GcmkgSnVsIDE0IDExOjU4OjM0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkcjE2X2hhX2lubmVyKTogUmV3cml0ZSB0byB0YWtlIGp1c3Qgb25lCi0JYXJndW1lbnQsIHRoZSBmaW5hbCByZWxvY2F0ZWQgYWRkcmVzcy4KLQkocHBjX2VsZl9hZGRyMTZfaGFfaW5uZXIpOiBBZGp1c3QgcHBjX2VsZl9hZGRyMTZfaGFfaW5uZXIgY2FsbGVyLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotVGh1IEp1bCAxMyAxNzoyMjowMyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogQ2hvb3NlIGEgcmVhc29uYWJsZSBmaWVsZAotCXNlbGVjdG9yIHJlbG9jYXRpb24gZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLgotCi1UaHUgSnVsIDEzIDEwOjMzOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IENhc3QgYXJndW1lbnQgdG8gc2l6ZV90Ci0JZm9yIG1hbGxvYy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZSwgZm9yIG1lbW1vdmUuCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCSogY29mZmxpbmsuYyAocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfZmluYWxfbGluayk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfZmluYWxfbGlua19kZWJ1Z19hY2N1bXVsYXRlKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZSwgZm9yIG1lbWNweSBhbmQgbWFsbG9jLgotCShlY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiBlY29mZmxpbmsuYyAoZWNvZmZfYWxpZ25fZGVidWcpOiBMaWtld2lzZSwgZm9yIG1lbXNldC4KLQkoZWNvZmZfd3JpdGVfc3ltaGRyKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IExpa2V3aXNlLgotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogTGlrZXdpc2UsIGZvcgotCXFzb3J0LgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBlbGZjb3JlLmggKGVsZl9jb3JlZmlsZV9ub3RlKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgotCShlbGZfbGlua19yZWFkX3JlbG9jcyk6IExpa2V3aXNlLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IExpa2V3aXNlLCBmb3IgbWVtc2V0LgotCSogaTM4NmxpbnV4LmMgKGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGllZWUuYyAoZG9fd2l0aF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogTGlrZXdpc2UuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UsIGZvciBtZW1jcHkuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZSwKLQlmb3IgbWFsbG9jLgotCSogc2VjdGlvbi5jIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZSwgZm9yIG1lbWNweS4KLQkqIHNyZWMuYyAoc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UsIGZvcgotCXJlYWxsb2MgYW5kIG1lbXNldC4KLQkoc3Vub3Nfc2Nhbl9yZWxvY3MpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLCBmb3IgcmVhbGxvYy4KLQkqIHN5bXMuYyAoX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIHZlcnNhZG9zLmMgKHZlcnNhZG9zX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UsIGZvcgotCW1lbWNweS4KLQotCSogbGliYmZkLmMgKHJlYWxfcmVhZCk6IEFkZCBwcm90b3R5cGUuICBDaGFuZ2UgYXJndW1lbnQgdHlwZXMgZnJvbQotCWludCB0byBzaXplX3QuCi0JKGJmZF9yZWFkKTogQ2FzdCByZWFsX3JlYWQgYXJndW1lbnQgdG8gc2l6ZV90LCBub3QgaW50LgotCShiZmRfd3JpdGUpOiBDYXN0IGZ3cml0ZSBhcmd1bWVudCB0byBzaXplX3QsIG5vdCBpbnQuCi0KLQkqIGVsZjY0LWdlbi5jIChlbGZfaW5mb190b19ob3d0byk6IEZpeCBkZWZpbml0aW9uIGZvciByZWNlbnQgZWxmLmMKLQljaGFuZ2VzLgotCi0JKiBjb25maWd1cmUuaW46IEZpeCB0eXBvOiBjaGFuZ2UgeyRlbmFibGV2YWx9IHRvICR7ZW5hYmxldmFsfS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZmxpbmsuby4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIGZpZWxkcyBfcmVhZF9taW5pc3ltYm9scyBhbmQKLQlfbWluaXN5bWJvbF90b19zeW1ib2wuCi0JKEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMpOiBBZGQgX3JlYWRfbWluaXN5bWJvbHMgYW5kCi0JX21pbmlzeW1ib2xfdG9fc3ltYm9sLgotCShiZmRfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KLQkoYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgotCSogc3ltcy5jIChfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KLQkoX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgotCSogbGliYmZkLWluLmggKF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMpOiBEZWZpbmUuCi0JKF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgotCShfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyk6IERlY2xhcmUuCi0JKF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbCk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGFvdXR4LmggKE1JTklTWU1fVEhSRVNIT0xEKTogRGVmaW5lLgotCShOQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykpOiBOZXcgZnVuY3Rpb24uCi0JKE5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxyZWFkX21pbmlzeW1ib2xzKSk6IERlY2xhcmUuCi0JKE5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkpOiBEZWNsYXJlLgotCSogYW91dC10YXJnZXQuaCAoTVlfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KLQkoTVlfbWluaXN5bWJvbF90b19zeW1ib2wpOiBEZWZpbmUuCi0JKiBBbGwgdGFyZ2V0czogRGVmaW5lIHJlYWRfbWluaXN5bWJvbHMgYW5kIG1pbmlzeW1ib2xfdG9fc3ltYm9sLgotCi1XZWQgSnVsIDEyIDE3OjU1OjU1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20KLQliZmRfYWxsb2MuCi0KLQkqIGVsZmNvZGUuaCAoc2l6ZV9pbmZvKTogRG9uJ3QgdXNlICImIiBiZWZvcmUgZnVuY3Rpb24gbmFtZXMuCi0KLVdlZCBKdWwgMTIgMDA6MTY6NDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9kYXRhKTogVXNlIHVuc2lnbmVkLCBub3QgdW5zaWduZWQgY2hhciwKLQlmb3IgYml0ZmllbGRzLgotCi1UdWUgSnVsIDExIDE1OjE5OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEluIGNhc2UgU0hUX1JFTFtBXSwgb25seSBnZXQgdGhlCi0gICAgICAgIEJGRCBzZWN0aW9uIGZvciB0aGUgc2hfbGluayBzZWN0aW9uIGlmIGl0IGlzIGEgU1lNVEFCIHNlY3Rpb24uCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKSk6IERvbid0IGJvdGhlciB0byBjaGVjawotCXRoYXQgYXJjaGl2ZXMgaG9sZCBhLm91dCBvYmplY3RzLgotCSogY2YtaTM4Nmx5bnguYyAoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogUmVtb3ZlLgotCSogY2YtbTY4a2x5bnguYyAoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogUmVtb3ZlLgotCSogZWxmbGluay5oIChlbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBib3RoZXIgdG8gY2hlY2sgdGhhdAotCWFyY2hpdmVzIGhvbGQgRUxGIG9iamVjdHMuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogSWYgdGhlIGFyY2hpdmUgaGFzIGEgbWFwLCBhbmQKLQl0aGUgdGFyZ2V0IHdhcyBkZWZhdWx0ZWQsIGJ1dCB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBhcmNoaXZlIGNhbgotCW5vdCBiZSBtYXRjaGVkIHdpdGggdGhhdCB0YXJnZXQsIHRoZW4gcmV0dXJuIGEgYmFkIGZvcm1hdCBlcnJvci4KLQotCSogZWxmNjQtc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogU2V0IGhvd3RvIGZvciBXRElTUDE2IHRvCi0JZWxmNjRfd2Rpc3AxNl9yZWxvYy4KLQkoZWxmNjRfd2Rpc3AxNl9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZjY0X3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9zaXplX2luZm8pOiBDaGFuZ2UgdHlwZSBvZiBsYXN0IGFyZ3VtZW50IHRvCi0Jc3dhcF9zeW1ib2xfb3V0IGZyb20gY2hhciAqIHRvIFBUUi4KLQkoYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfc3dhcF9zeW1ib2xfb3V0KTogQ2hhbmdlIHR5cGUgb2YgY2RzdCBmcm9tIGNoYXIgKgotCXRvIFBUUi4KLQkqIGVsZi5jIChzd2FwX291dF9zeW1zKTogQ2FzdCB0byBQVFIsIG5vdCBjaGFyICosIHdoZW4gY2FsbGluZwotCXN3YXBfc3ltYm9sX291dCByb3V0aW5lLgotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IExpa2V3aXNlLgotCShlbGZfbGlua19vdXRwdXRfc3ltKTogTGlrZXdpc2UuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLVR1ZSBKdWwgMTEgMTI6Mjk6NDkgMTk5NSAgUmljayBTbGFka2V5ICA8anJzQHdvcmxkLnN0ZC5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IEhhbmRsZSB0aGUgc2ltcGxlIGNhc2Ugd2hlcmUKLQl0aGVyZSBpcyBubyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLU1vbiBKdWwgMTAgMTE6NDU6NTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG1ha2VmaWxlLmRvcyAoT0JKUyk6IEFkZCBiaW5hcnkubyBhbmQgdGVraGV4Lm8uICBGcm9tIERKCi0JRGVsb3JpZS4KLQotTW9uIEp1bCAxMCAxMTowOTo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChzZXRfc3ltYm9sX2Zyb21faGFzaCk6IGJmZF9saW5rX2hhc2hfbmV3IGNhc2U6IERvbid0Ci0JYWJvcnQ7IGl0IGNhbiBoYXBwZW4gZm9yIGNvbnN0cnVjdG9yIHN5bWJvbHMgd2hlbiBub3QgYnVpbGRpbmcKLQljb25zdHJ1Y3RvcnMuCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBDb3JyZWN0IHR5cG86IHVzZSAhIG9uIHN0cmNtcCwKLQlub3Qgb24gc3RyaW5nLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQKLQlsb2NhbCBpLgotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcnR5cGVfdG9faG93dG8pOiBEb24ndCBkZWNsYXJlLgotCShQQ1JFTE9GRlNFVCk6IERlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLWFybS5vCi0JKENGSUxFUyk6IEFkZCBjb2ZmLWFybS5jLCBwZS1hcm0uYywgcGVpLWFybS5jLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkpOiBBbGxvY2F0ZSBoYXNoIHRhYmxlCi0JdXNpbmcgYmZkX2FsbG9jLCBub3QgbWFsbG9jLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIGkzODZsaW51eC5jIChsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhaWIuY29tPjoKLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBJZiAtQnN5bWJvbGljLAotCW91dHB1dCBhIERUX1NZTUJPTElDIGR5bmFtaWMgZW50cnkuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBkb24ndCByZXF1aXJlIGEgUExUCi0JZW50cnkgZm9yIGEgbG9jYWxseSBkZWZpbmVkIHN5bWJvbC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIGRvIHdhcm4KLQlhYm91dCB1bmRlZmluZWQgc3ltYm9scywgYW5kIGZpbGwgaW4gdGhlIEdPVCBlbnRyeSBmb3IgYSBzeW1ib2wKLQlkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QgZmlsZS4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogSWYgLUJzeW1ib2xpYywgb3V0cHV0IGEgUkVMQVRJVkUKLQlyZWxvYyByYXRoZXIgdGhhbiBhIEdMT0JfREFUIHJlbG9jIGZvciBhIHN5bWJvbCBkZWZpbmVkIGluIGEKLQlyZWd1bGFyIG9iamVjdCBmaWxlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgZG8gd2FybgotCWFib3V0IHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgZmlsbCBpbiB0aGUgR09UIGVudHJ5IGZvciBhIHN5bWJvbAotCWRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLgotCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBvdXRwdXQgYSBSRUxBVElWRQotCXJlbG9jIHJhdGhlciB0aGFuIGEgR0xPQl9EQVQgcmVsb2MgZm9yIGEgc3ltYm9sIGRlZmluZWQgaW4gYQotCXJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgZG8KLQl3YXJuIGFib3V0IHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgZmlsbCBpbiB0aGUgR09UIGVudHJ5IGZvciBhCi0Jc3ltYm9sIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBvdXRwdXQgYQotCVJFTEFUSVZFIHJlbG9jIHJhdGhlciB0aGFuIGEgR0xPQl9EQVQgcmVsb2MgZm9yIGEgc3ltYm9sIGRlZmluZWQKLQlpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0KLQkqIGNvbmZpZy9tNjhrLWNvZmYubXQgKFNFTEVDVF9WRUNTKTogUmVuYW1lIGZyb20gU0VMRUNUX1ZFQ1RPUlMuCi0JQ29ycmVjdCBlbGVtZW50cyB0byBiZSBhY3R1YWwgQkZEIHZlY3RvciBuYW1lcy4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogRG9uJ3QgZGVwZW5kIHVwb24gQGZyYWdzQC4KLQkoY29uZmlnLnN0YXR1cyk6IERlcGVuZCB1cG9uIEBmcmFnc0AuCi0KLUZyaSBKdWwgIDcgMTc6MzY6NDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IFNvcnQgZGVmaW5lZCBzeW1ib2xzIHRoYXQgYXJlCi0JbmVpdGhlciBCU0ZfRlVOQ1RJT04gbm90IEJTRl9OT1RfQVRfRU5EIGp1c3QgYmVmb3JlIHVuZGVmaW5lZAotCXN5bWJvbHMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBCU0ZfRlVOQ1RJT04gYXMgd2VsbAotCWFzIEJTRl9OT1RfQVRfRU5ELgotCi1GcmkgSnVsICA3IDE3OjE2OjE1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZG9fbW9zdGx5Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmxvZy4KLQkoZG9fZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5jYWNoZS4KLQotVGh1IEp1bCAgNiAxNDozNzo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFJldmVydCBNYXkgMjQgcGF0Y2guCi0gICAgICAgIERvbid0IGNvcHkgUEMzMiByZWxvYyBhZ2FpbnN0IHNlY3Rpb24gaW50byBzaGFyZWQgb2JqZWN0LgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZGVkIGVsZmxpbmsuYy4KLQkoTWFrZWZpbGUpOiBEZXBlbmQgdXBvbiBjb25maWcuc3RhdHVzLCBub3QgY29uZmlndXJlLmluLgotCShjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldDsgZGVwZW5kIHVwb24gY29uZmlndXJlIGNvbmZpZ3VyZS5ob3N0Ci0JYW5kIGNvbmZpZy5iZmQuCi0KLVdlZCBKdWwgIDUgMjA6MTc6MTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvcmUuaCwgZWxmbGluay5oLCBlbGZjb2RlLmgsIGVsZi5jLCBlbGZsaW5rLmM6IE1vdmVkIHNvbWUKLSAJcHJpbWFyaWx5IHNpemUtaW5kZXBlbmRlbnQgY29kZSBmcm9tIGVsZmNvZGUuaCB0byBlbGYuYyBhbmQgbmV3Ci0gCWZpbGUgZWxmbGluay5jOyBtb3ZlZCBvdXQgb3RoZXIgY29yZS0gb3IgbGlua2VyLXJlbGF0ZWQgcm91dGluZXMKLSAJaW50byBvdGhlciBuZXcgLmggZmlsZXMgZm9yIGNsYXJpdHkuICBSZW5hbWVkIG1hbnkgcm91dGluZXMgdG8KLSAJc3RhcnQgd2l0aCBiZmRfZWxmIG9yIF9iZmRfZWxmLiAgQWRkZWQgYSBzdHJ1Y3R1cmUgb2YKLSAJc2l6ZS1kZXBlbmRlbnQgYnV0IHRhcmdldC1pbmRlcGVuZGVudCBpbmZvIHRvIGVsZmNvZGUuaC4KLQkqIE1ha2VmaWxlLmluOiBCdWlsZCBlbGZsaW5rLm8uICBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogbGliZWxmLmg6IFVwZGF0ZWQgc29tZSBkZWNsYXJhdGlvbnMuICBBZGRlZCBhIGRlZmluaXRpb24gZm9yIHRoZQotCW5ldyBzdHJ1Y3R1cmUgaW4gZWxmY29kZS5oLiAgQWRkZWQgbW9yZSBmaWVsZHMgdG8gZWxmIGJhY2tlbmQgZGF0YQotCXN0cnVjdHVyZS4KLQkqIGVsZnh4LXRhcmdldC5oOiBSZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgc2l6ZS1kZXBlbmRlbnQgaW5mby4KLQkqIGVsZjMyLSouYzogQ2hhbmdlZCBzb21lIGZ1bmN0aW9uIG5hbWVzLiAgTW92ZWQgY29tbW9uCi0JY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgY29kZSBmcm9tIG02OGssIHNwYXJjLCBhbmQgaTM4NiBzdXBwb3J0Ci0JaW50byBlbGZsaW5rLmMuICBEZWZpbmUgc29tZSBuZXcgbWFjcm9zIHRvIGZpbGwgaW4gbmV3IGZpZWxkcyBvZgotCWJhY2sgZW5kIGRhdGEuICBBbHNvIGNsZWFuIHVwIHNvbWUgImdjYyAtV2FsbCIgd2FybmluZ3MgcmVnYXJkaW5nCi0JdW51c2VkIG9yIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBObywgZG9uJ3QgcHV0IGVsZmxpbmsubyBoZXJlLgotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIGl0IGhlcmUgd2hlbmV2ZXIgZWxmLm8gaXMgc3BlY2lmaWVkLgotCi1XZWQgSnVsICA1IDEwOjMxOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9vYmplY3RfcCk6IFVuY29uZGl0aW9uYWxseSBzZXQKLQllbGZfYmFkX3N5bXRhYiwgc2luY2Ugc29tZXRpbWVzIHRoZSBzeW1ib2wgdGFibGUgaXMgbWVzc2VkIHVwIGFuZAotCXRoZSBsYXN0IHN5bWJvbCBpcyBnbG9iYWwuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWNsYXJlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9pc19sb2NhbF9sYWJlbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICRhY19jb25maWdfc3ViLCBub3QgJGNvbmZpZ3N1Yi4KLQkqIGNvbmZpZ3VyZTogTGlrZXdpc2UuCi0KLQlQZXJtaXQgLS1lbmFibGUtdGFyZ2V0cz1pZWVlOgotCSogY29uZmlnLmJmZCAoKi0qLWllZWUqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZy9pZWVlLm10OiBOZXcgZmlsZS4KLQotV2VkIEp1bCAgNSAwNDoxNjozNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2kzODZhaXgubWggKEhERUZJTkVTKTogUmVtb3ZlIC1ERkFTQ0lTVF9GRE9QRU4uCi0KLQlBdXRvY29uZmlzY2F0aW9uOgotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluOiBTd2l0Y2ggZnJvbSBDeWdudXMKLQljb25maWd1cmUgdG8gYXV0b2NvbmYgd2F5cyBvZiBwcm9jZXNzaW5nIC0tZW5hYmxlIGFyZ3VtZW50cywKLQlzZXR0aW5nIHVwIHN5bWxpbmtzLCBpbmNvcnBvcmF0aW5nIG1ha2VmaWxlIGZyYWdtZW50cywgcHJpbnRpbmcKLQltZXNzYWdlcyBhdCBjb25maWd1cmF0aW9uIHRpbWUsIHNldHRpbmcgdmFyaWFibGVzIGluIE1ha2VmaWxlLgotCURlbGV0ZWQgc29tZSB1bnVzZWQgdmFyaWFibGVzLiAgQ2hlY2sgZm9yIHJhbmxpYiB2aWEgYXV0b2NvbmYuCi0JRm9yIG5vdywgY29uZmlndXJlIHNjcmlwdCByZW1vdmVzIGRvYy9jb25maWcuc3RhdHVzLgotCSogY29uZmlndXJlOiBOZXcgZmlsZS4KLQkqIGRlcC1pbi5zZWQ6IFVzZSBAU1JDRElSQCBpbnN0ZWFkIG9mIEBzcmNkaXJALCBzbyBNYWtlZmlsZS5pbgotCWxpbmUgZG9lc24ndCBnZXQgYnJva2VuIGJ5IGNvbmZpZ3VyZS4KLQkqIGRvYy9jb25maWd1cmUuaW46IFJlbW92ZWQuCi0KLVR1ZSBKdWwgIDQgMTI6MjI6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBJZgotCUJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LCBsaW1pdCB0aGUgbGVuZ3RoIG9mIGFsbCBmaWxlIG5hbWVzCi0JdG8gYXJfbWF4X25hbWVsZW4uCi0JKGJmZF9kb250X3RydW5jYXRlX2FybmFtZSk6IElmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LCBjYWxsCi0JYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUuCi0JKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFJldmVydCBKdW5lIDEgY2hhbmdlLgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IEFkZCBwcm92aWRlCi0JYXJndW1lbnQuCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBVcGRhdGUgcHJvdG90eXBlLgotCShiZmRfZWxmNjRfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgbmVlZGVkIGZpZWxkLiAgUmVtb3ZlCi0Jc2F3X25lZWRlZCBmaWVsZC4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgZWxmX2R0X25lZWRlZF9uYW1lCi0JaXMgYW4gZW1wdHkgc3RyaW5nLCBkb24ndCBtYWtlIGEgRFRfTkVFREVEIGVudHJ5IGluIHRoZSBvdXRwdXQKLQlmaWxlLiAgUmVjb3JkIGFsbCBEVF9ORUVERUQgZW50cmllcyBmb3VuZCBpbiBpbnB1dCBkeW5hbWljCi0Jb2JqZWN0cy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IGNoZWNrIHNhd19uZWVkZWQgd2hlbiBpc3N1aW5nCi0Jd2FybmluZ3MuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIG5lZWRlZCwgbm90Ci0Jc2F3X25lZWRlZC4KLQkoYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoc3RydWN0IGJmZF9lbGZfbGlua19uZWVkZWRfbGlzdCk6IERlZmluZS4KLQkoYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBBbHNvIGluaXRpYWxpemUKLQlmaW5kX2J1ZmZlciBhbmQgZmRydGFiX2xlbiBmaWVsZHMgb2YgbmV3bHkgYWxsb2NhdGVkCi0JZmluZF9saW5lX2luZm8gc3RydWN0dXJlLgotCi1Nb24gSnVsICAzIDE3OjAzOjUyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBOZXcgYXJndW1lbnQgInN5bV9kaWZmIiwKLQlub256ZXJvIHdoZW4gd2UncmUgZ2VuZXJhdGluZyByZWxvY2F0aW9ucyBmb3IgYW4gZXhwcmVzc2lvbgotCXVzaW5nIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQlIYW5kbGUgZGlmZmVyZW5jZSBvZiBzeW1ib2xzIGZvciBib3RoIFJfSFBQQSBhbmQgUl9DT01QTEVYCi0JY2FzZXMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9DT01QMSwgUl9DT01QMiBhbmQgUl9DT0RFX0VYUFIKLQlmaXh1cHMuCi0KLU1vbiBKdWwgIDMgMTM6NTU6MTggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAod2luMzIpOiBOZXcgY29uZmlndXJhdGlvbi4KLQkqIGNvbmZpZ3VyZS5ob3N0IChwZSk6IENoYW5nZWQgdG8gaTM4NndpbjMyLgotCSogY29uZmlnL2kzODZwZS5taDogRGVsZXRlZC4KLQkqIGNvbmZpZy9pMzg2d2luMzIubWg6IE5ldyBmaWxlLgotCi1Nb24gSnVsICAzIDExOjMwOjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IElmIHdlIGFsbG9jYXRlCi0JZmluZF9saW5lX2luZm8sIGNsZWFyIHRoZSBmZHJ0YWIgZmllbGQuCi0KLQkqIHRhcmdldHMuYyAoZW51bSBiZmRfZmxhdm91cik6IEFkZCBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIgaGVyZSwKLQlyYXRoZXIgdGhhbiBpbiBiZmQtaW4yLmguCi0KLQkqIGJmZC5jIChlbnVtIGJmZF9lcnJvcik6IERlZmluZSBiZmRfZXJyb3Jfbm9fYXJtYXAuCi0JKGJmZF9lcnJtc2dzKTogQWRkIHN0cmluZyBmb3IgYmZkX2Vycm9yX25vX2FybWFwLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogSWYgYW4gYXJjaGl2ZSBoYXMgbm8KLQlhcm1hcCwgc2V0IGJmZF9lcnJvcl9ub19hcm1hcCByYXRoZXIgdGhhbiBiZmRfZXJyb3Jfbm9fc3ltYm9scy4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBQZXJtaXQgY29tbW9uIGFuZAotCWluZGlyZWN0IHN5bWJvbHMgaW4gd2Vha2RlZnMgQkZEX0FTU0VSVC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogU2ltcGxpZnkKLQlCRkRfQVNTRVJUIHRvIHBlcm1pdCBzb21lIGxlZ2FsLCBidXQgb2RkLCBjYXNlcy4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCB2ZXJzYWRvcy5vLgotCShDRklMRVMpOiBBZGQgcGUtaTM4Ni5jLCBwZWktaTM4Ni5jLCBhbmQgdmVyc2Fkb3MuYy4KLQotU3VuIEp1bCAgMiAxNzo0OTozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDYXN0IGJhc2VfZmlsZQotCXRvIEZJTEUgKiBiZWZvcmUgdXNpbmcgaXQuCi0JKiBzdGFiLXN5bXMuYzogUmV2ZXJ0IHllc3RlcmRheSdzIHBhdGNoLgotCi1TYXQgSnVsICAxIDEyOjEwOjQyIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBzdGFiLXN5bXMuYyAoc3RkaW8uaCk6ICBJbmNsdWRlIHByaW9yIHRvIGxpYmFvdXQuaCwgd2hpY2gKLQlpbmNsdWRlcyBiZmRsaW5rLmgsIHdoaWNoIG5vdyB1c2VzIEZJTEUuCi0KLVNhdCBKdWwgIDEgMDA6MTE6MDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGVsZnh4LXRhcmdldC5oOiBOZXcgZmlsZS4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVtb3ZlIGVsZl82NF9wIGZpZWxkLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZk5OX2JlZCk6IERvbid0IHNldCBpdC4KLQotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oOiBEZWxldGVkLgotCSogTWFrZWZpbGUuaW4gKGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaCk6IEJ1aWxkIHRoZW0gZnJvbQotCWVsZnh4LXRhcmdldC5oLgotCi1GcmkgSnVuIDMwIDE2OjA3OjE4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDb21wYXJlCi0JdGhlIGZ1bGwgdGV4dCBvZiAucmVsb2Mgb3IgLmVkYXRhIHNlY3Rpb24gbmFtZXMuCi0KLUZyaSBKdW4gMzAgMTU6NDc6MzcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOgotCVJlbW92ZSBleHRyYSAnKycuCi0KLVRodSBKdW4gMjkgMTc6MjQ6NTIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1oODMwMC5jIChDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lLgotCi1XZWQgSnVuIDI4IDE4OjA0OjQyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiB2ZXJzYWRvcy5vIGlzIG5vdyBjb25kaXRpb25hbGx5IGJ1aWx0LgotCSogY29mZmNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2xlYW4gdXAuIENhbGN1bGF0ZQotCWRhdGEgZW50cmllcy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOgotCS5yZWxvYyBhbmQgLmVkYXRhIHNlY3Rpb25zIGFyZSBJTUFHRV9CQVNFRCB0b28uCi0JSWYgdGhlcmUncyBhIGJhc2VfZmlsZSB0aGVuIHdyaXRlIG91dCBiYXNlIGluZm9ybWF0aW9uLgotCSogY29uZmlndXJlLmhvc3QgKGkzODYtKi1wZSk6IE5ldy4KLQkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUpOiBPbmx5IHNjYW4gcHJlZml4ZXMuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogVmVyc2Fkb3MgaXMgbm93IGNvbmRpdGlvbmFsbHkKLQlidWlsdC4KLQkqIGNvbmZpZy9tNjhrLWNvZmYubXQ6IEJ1aWxkIHZlcnNhZG9zLm8KLQkqIGhvc3RzL2kzODZwZS5oOiBOZXcgZmlsZS4KLQotTW9uIEp1biAyNiAxMzo1Mzo0OSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IENsb3NlIGNvbW1lbnQgYmVmb3JlCi0JUl9QQVJJU0NfRFBSRUwyMUwgaGFuZGxpbmcuCi0KLVRodSBKdW4gMjIgMTk6Mjg6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVN1biBNYXkgIDcgMTE6NTM6NDEgTURUIDE5OTUgIEJyeWFuIEZvcmQgIDxiYWZvcmRAY3MudXRhaC5lZHU+Ci0KLQkqIGNvbmZpZy9pMzg2LW1vc3MubXQ6IGNyZWF0ZWQuCi0KLVRodSBKdW4gMjIgMDg6NTY6MTAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEFkZCBjYXNlIGZvciAtdmUgd29yZHMuCi0KLVdlZCBKdW4gMjEgMTM6MTM6NDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgdHJ5IHRvIGFwcGx5IGEKLQlyZWxvY2F0aW9uIGFnYWluc3QgYW4gdW5kZWZpbmVkIHN5bWJvbHMuCi0KLVdlZCBKdW4gMjEgMTA6MTY6MTAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogdmVyc2Fkb3MuYzogU2Vjb25kIHBhc3MvcmV3cml0ZS4KLQotTW9uIEp1biAxOSAwODo0MDo0NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlKTogQ29tcGFyZSBvbmx5IHRoZSBmcm9udCBwYXJ0Ci0Jb2YgYSBzZWN0aW9uIG5hbWUuCi0KLVNhdCBKdW4gMTcgMDk6NDA6NDQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogU2V0IHRoZSBzaXplIG9mIHRoZSBzdHViCi0Jc2VjdGlvbiBpZiB3ZSBnZXQgYW4gZXJyb3IuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IERvbid0IG1lc3MKLQl3aXRoIHRoZSBvcGVyYW5kcyBvZiBhbiBSX1BBUklTQ19EUFJFTDIxTCByZWxvY2F0aW9uIGlmIHRoZSBpbnNuCi0JaXMgbm90ICJhZGRpbCA8c3ltYm9sPiwlcjI3Ii4KLQotRnJpIEp1biAxNiAxNTowNDo0NyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWNsYXJlIGJ1dCBkb24ndAotCWRlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGJmZC5jIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWZpbmUuCi0KLUZyaSBKdW4gMTYgMDA6MDc6MjUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iZmRfbGlua19saW5rX3JlbG9jYXRlKTogVXNlIHRoZSByaWdodAotCXR5cGUgZmllbGQgKHRoZXJlIGFyZSB0d28hKSB3aGVuIGNoZWNraW5nIHRvIHNlZSBpZiAkZ2xvYmFsJCBpcwotCWRlZmluZWQuCi0KLVRodSBKdW4gMTUgMTQ6MDM6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCwgYmZkLWluMi5oIChiZmRfYm9vbGVhbik6IFJlbmFtZSBiZmRfdHJ1ZSwgYmZkX2ZhbHNlCi0JdG8gYmZkX3R0dHJ1ZSwgYmZkX2ZmZmFsc2Ugc28gYXMgbm90IHRvIGNvbmZsaWN0IHdpdGggZnVuY3Rpb25zLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBSZW1vdmUgdmVyc2lvbiB0aGF0IHdhcwotCWhhY2tlZCBmb3IgTVBXIEMuCi0JKiBtcHctY29uZmlnLmluOiBTZXQgc2hlbGwgdmFycyBpbnN0ZWFkIG9mIHBhc3RpbmcgdG8gbWFrZWZpbGUKLQlmb3IgZWFjaCBjb25maWd1cmF0aW9uLCBlZGl0IGNvZmZzd2FwLmggdG8gbWFrZSBNUFcgQyBub3QgY2hva2UuCi0JKGkzODYtdW5rbm93bi1jb2ZmLCBzaC1oaXRhY2hpLWhtcyk6IFJlY29nbml6ZS4KLQkqIG1wdy1tYWtlLmluIChCRkRfTElCUyk6IEFkZCB2ZXJzYWRvcy5jLm8uCi0KLQkqIHZlcnNhZG9zLmMgKHZlcnNhZG9zX3NjYW4pOiBQcm9wZXJseSBjYXN0IHJlc3VsdHMgZnJvbSBiZmRfYWxsb2MuCi0KLVdlZCBKdW4gMTQgMTU6Mjc6MzIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IE5ldyBmdW5jdGlvbgotCXJlYWRzIGFuZCBoYW5kbGVzIC5kcmVjdHZlIHNlY3Rpb25zIGZvciBQRS4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IENhbGwgbmV3IGZ1bmN0aW9uIGlmIFBFLgotCi1Nb24gSnVuIDEyIDEyOjA5OjM5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQtaW4uaCAoYmZkX3NldF9zZWN0aW9uX3ZtYSk6IENhc2UgdHJ1ZSB0byBhIGJvb2xlYW4uCi0JKGJmZF9zZXRfY2FjaGVhYmxlKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBKdW4gIDkgMTI6MjA6MjggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IFJld3JpdGUgdG8gYmUgc3ltbWV0cmljYWwuCi0KLUZyaSBKdW4gIDkgMTI6NDk6MDAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHRhcmdldHMuYzogQWRkIGNvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBhbmQgbGlua19zcGxpdF9zZWN0aW9uCi0JdG8gdGhlIHRhcmdldCB2ZWN0b3IuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBEZWZpbmUuCi0JKF9iZmRfbm9saW5rX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uKTogRGVjbGFyZS4KLQkqIHN5bXMuYyAoYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IERlZmluZS4KLQkqIGxpbmtlci5jIChiZl9saW5rX3NwbGl0X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIHNvbS5jIChzb21fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IE5ldyBmdW5jdGlvbgotCShzb21fYmZkX2xpbmtfc3BsaXRfc2VjdGlvbik6IExpa2V3aXNlLgotCSogQWxsIG90aGVyIHRhcmdldHMgdXBkYXRlZCB3aXRoIGRlZmF1bHQgdmVyc2lvbnMgb2YgbmV3IHJvdXRpbmVzLgotCi0JKiBUYWtlIG91dCBteSBicmFpbmRhbWFnZWQgYmZkX3RydWUvYmZkX2ZhbHNlIGNoYW5nZXMgZnJvbSBlYXJsaWVyCi0JdG9kYXkuICBSZXBsYWNlIHdpdGgganVzdDoKLQkqIGJmZC1pbi5oOiAoVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQpOiBEZWZpbmUgdGhpcyBpZgotCWNvbXBpbGluZyB3aXRoIGcrKy0yLjYgb3IgbGF0ZXIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBKdW4gIDkgMDc6NTQ6MjkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogdmVyc2Fkb3MuYyAoc3RydWN0IGVzZCwgZ2V0XzQpOiBMaW50OyB1c2UgdW5zaWduZWQgY2hhcnMuCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiAgQ29tcGFyZSBvdXRwdXQgc2VjdGlvbiBuYW1lcwotCXdoZW4gY29udmVydGluZyBmb3Igdnh3b3Jrcy4KLQotV2VkIEp1biAgNyAxOTowMTozMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogUGVybWl0IC5zY29tbW9uIG9yIENPTU1PTgotCXNlY3Rpb25zIGFzIHJhbmRvbSBTSFRfTk9CSVRTIHNlY3Rpb25zLCBpbiBjYXNlIGEgbGlua2VyIHNjcmlwdCBpcwotCXN0cmFuZ2UuCi0KLVR1ZSBKdW4gIDYgMTc6Mjk6MzIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IE1vdmVkIGZyb20gcGUuaAotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IEdldCBQRSByZWxvY3MgcmlnaHQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0KTogU2V0IHBlIHRkYXRhIGJpdCB3aGVuIHVzaW5nIFBFLgotCSogY29mZmxpbmsuYyAoQ09GRl9XSVRIX1BFIGNvZGUpOiBUZXN0IG9uIG9ial9wZSBiaXQgcmF0aGVyCi0JdGhhbiBjb25kaXRpb25hbCBjb21waWxlLgotCSogY29uZmlndXJlLmluOiBGaXggUEUgZGVwZW5kZW5jaWVzLgotCSogbGliY29mZi1pbi5oIChvYmpfcGUpOiBOZXcuCi0JKGNvZmZfdGRhdGEpOiBBZGRlZCBwZSBlbnRyeS4KLQkqIGxpYmNvZmYuaDogUmVnZW5lcmF0ZWQuCi0KLU1vbiBKdW4gIDUgMDk6MDc6MTMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19hZGp1c3Rfc3ltbmR4KTogQ29tcGxldGVseSBwYXJlbnRoZXNpemUKLQltYWNyby4KLQotTW9uIEp1biAgNSAwMjoxNToyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlMaW5rZXIgc3VwcG9ydCBmb3IgbTY4ay1lbGYgZnJvbSBBbmRyZWFzIFNjaHdhYgotCTxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+OgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDaGVjayBmb3IgTlVMTCB3aGVuCi0JbG9vcGluZyB0aHJvdWdoIHRoZSBzeW1ib2wgaGFzaGVzLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXaGVuIGxvb2tpbmcgZm9yIF9pbml0IGFuZCBfZmluaSBkb24ndCB1c2UKLQl0aGUgc3ltYm9sIGlmIGl0IGlzIGltcG9ydGVkIGZyb20gYW5vdGhlciBvYmplY3QuCi0JKiBlbGYzMi1tNjhrLmM6IFJlbG9jYXRpb24gdHlwZSBjaGFuZ2VkIGZyb20gUkVMIHRvIFJFTEEuICBSZWd1bGFyCi0JYW5kIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0IGZ1bmN0aW9ucyBhZGRlZCwgc2ltaWxhciB0byBvdGhlciBlbGYKLQl0YXJnZXRzLgotCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLWdudSopOiBVc2UgRUxGIGNvbmZpZ3VyYXRpb24uCi0KLUZyaSBKdW4gIDIgMTg6NTQ6NTkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogdmVyc2Fkb3MuYzogTmV3IGZpbGUuCi0JKiBiZmQtaW4yLmggKHN0cnVjdCBfYmZkKTogTmV3IGZpZWxkLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogTmV3IGZpZWxkLgotCSogY29uZmlndXJlLmluICh2ZXJzYWRvc192ZWMpOiBOZXcgZmllbGQuCi0JKiB0YXJnZXRzLmMgKGJmZF9mbGF2b3IpOiBBZGRlZCB2ZXJzYWRvcy4KLQotVGh1IEp1biAgMSAxMzo1MTo0OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncywgc3R5cF90b19zZWNfZmxhZ3MsIAotCWNvZmZfbmV3X3NlY3Rpb25faG9vayk6ICBBbnkgc2VjdGlvbiB0aGF0IHN0YXJ0cyAiLnN0YWIiCi0JaXMgbm93IG1hcmtlZCBhcyBkZWJ1Z2dpbmcuCi0KLVRodSBKdW4gIDEgMTY6MTU6MTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBEaXNhYmxlIGV4dGVuZGVkIG5hbWUKLQl0YWJsZSB1bnRpbCBpdCBjYW4gYmUgbWFkZSBvcHRpb25hbCwgc28gdGhhdCBuYXRpdmUgQVIgaGFzIGhhbGYgYQotCWNoYW5jZSBvbiBTdW5PUyBhbmQgSFAvVVguCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scywgY2FzZQotCWJmZF9saW5rX2hhc2hfaW5kaXJlY3QpOiBBZGQgY2FzdCB0byBjb3JyZWN0IHBvaW50ZXIgdHlwZXMuCi0KLVNhdCBNYXkgMjcgMjE6Mzc6MzEgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChtNjhrLWJ1bGwtc3lzdiopOiBBZGRlZCBzdHJpcF91bmRlcnNjb3JlPXllcy4KLQkgIChtNjhrLWVzdC1jb2ZmKTogUmVtb3ZlZC4gIHRhcmdldCBkb2VzIG5vdCBlZmZlY3Qgb2JqZWN0IGZvcm1hdC4KLQotV2VkIE1heSAyNCAxMDo1MjowMSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBDb3BlIHdpdGgKLQlpbmRpcmVjdCBzeW1ib2xzLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBHaXZlIGVycm9yCi0JbWVzc2FnZSB3aGVuIGxpbmtpbmcgdG8gYSBzaGFyZWQgcmVsb2Mgd2hpY2ggaXNuJ3QgdGhlcmUuCi0KLVdlZCBNYXkgMjQgMTA6NDA6MDAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIEFSTS1QRS4KLQotCSogTWFrZWZpbGUuaW4sIGNvZmZjb2RlLmgsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5pbiwgcGUtYXJtLmMsCi0JIHBlaS1hcm0uYywgY29mZi1hcm0uYywgcmVsb2MuYywgdGFyZ2V0cy5jLCBjb25maWcvYXJtLXBlLm10OgotCSBTdXBwb3J0IGZvciBBUk0gQ09GRi9QRS4KLQotVHVlIE1heSAyMyAxOToyNDo1OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5vdyBhIGZ1bmN0aW9uLAotCXRyaWVzIGNhbGxpbmcgcm91dGluZSBmcm9tIGlucHV0IGJmZCB0YXJnZXQgdmVjdG9yIGZvcgotCWJmZF9pbmRpcmVjdF9saW5rX29yZGVyLiAgUHV0IGEgZGVjbGFyYXRpb24gaW50byB0aGUgaGVhZGVyIGZpbGUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogZWxmMzItbWlwcy5jIChncHJlbDE2X3dpdGhfZ3ApOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG91dCBmcm9tCi0JbWlwc19lbGZfZ3ByZWwxNl9yZWxvYy4KLQkobWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IENhbGwgaXQuICBJZiBvdXRwdXQgYmZkIHRhcmdldCB2ZWN0b3IKLQlpc24ndCBlbGYgZmxhdm91cmVkLCBhYm9ydCwgc2luY2UgaXQncyBhc3N1bWVkIHRvIGJlIGVsZiBpbiBzb21lCi0Jb2YgdGhpcyBjb2RlLCBpbmNsdWRpbmcgdGhlIGNvZGUgdGhhdCBsb29rcyB1cCB0aGUgZ3AgdmFsdWUuCi0JKGVsZjMyX21pcHNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLAotCW1vZGlmaWVkIGZyb20gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIHRvIGRlYWwKLQl3aXRoIHBhc3NpbmcgZ3AgdG8gZ3ByZWwxNl93aXRoX2dwLgotCShiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBtYWNyby4KLQkqIGVsZjMyLXRhcmdldC5oIChiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6Ci0JRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQotVHVlIE1heSAyMyAxNTo1ODoxNSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW46IEluc3RhbGwgYmZkbGluay5oIHRvby4KLQotU3VuIE1heSAyMSAyMjoyNTowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgdW5kZWZpbmVkIGFuZAotCW5vdHN1cHBvcnRlZCByZXR1cm4gY29kZXMgZnJvbSBmaW5hbF9saW5rX3JlbG9jYXRlICh1c2VkIHdoZW4KLQkkZ2xvYmFsJCBpcyB1bmRlZmluZWQgb3Igbm9uZXhpc3RhbnQpLgotCShlbGYzMl9ocHBhX2JmZF9saW5rX2xpbmtfcmVsb2NhdGUpOiBJZiAkZ2xvYmFsJCBleGlzdHMsIGJ1dCBpcwotCW5vdCBkZWZpbmVkLHRoZW4gcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQuCi0KLUZyaSBNYXkgMTkgMTA6MDA6MTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZzd2FwLmg6IChJTUFHRV9CQVNFKTogRGVmaW5lIHRvIDAgaWYgbm90LgotCi1UaHUgTWF5IDE4IDA0OjI0OjAxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0YW5kYXJkKTogSWYgZGVmaW5lZCwgY2FsbAotCU1ZX3JlbG9jYXRhYmxlX3JlbG9jIGJlZm9yZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4KLQotCSogYW91dC1hcm0uYzogKFdSSVRFX0hFQURFUlMpOiBEZWxldGUuCi0JKE5BTUUpOiBEZWZpbmUgdmVyc2lvbiB0byBvdmVycmlkZSBkZWZhdWx0IGluIGFvdXR4LmgKLQkoTVkoaG93dG9fdGFibGUpKTogUmVmb3JtYXQuICBBbHRlciBzb21lIGVudHJpZXMgc2xpZ2h0bHkuCi0JKFJFTE9DX0FSTV9CSVRTX05FR197QklHLExJVFRMRX0pOiBEZWZpbmUuCi0JKE1ZKHJlbG9jX2hvd3RvKSwgTVkocHV0X3JlbG9jKSwgTVkocmVsb2NhdGFibGVfcmVsb2MpKTogTmV3IGZ1bmN0aW9ucy4KLQkoTVlfcmVsb2NfaG93dG8sIE1ZX3B1dF9yZWxvYywgTVlfcmVsb2NhdGFibGVfcmVsb2MpOiBEZWZpbmUuCi0JKE1ZKGZpeF9wY3JlbF8yNikpOiBSZW5hbWVkIGZyb20gYW91dGFybV9maXhfcGNyZWxfMjYsIHJldHVybgotCWJmZF9yZWxvY19vayBub3QgYmZkX3JlbG9jX2NvbnRpbnVlLgotCShNWShmaXhfcGNyZWxfMjZfZG9uZSkpOiBMaWtld2lzZS4KLQkoTVkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKSk6IFJlbmFtZWQgZnJvbSBhb3V0YXJtX3JlbG9jX3R5cGVfbG9va3VwLgotCShNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMsCi0JTVlfYmZkX2ZpbmFsX2xpbmspOiBEZWxldGUuCi0JKE1ZX3N3YXBfc3RkX3JlbG9jX2luLCBNWV9zd2FwX3N0ZF9yZWxvY19vdXQsIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzKToKLQlEZWZpbmUuCi0JKGFvdXR4LmgpOiBJbmNsdWRlIGl0LgotCShNWShzd2FwX3N0ZF9yZWxvY197aW4sb3V0fSkpOiBOZXcgZnVuY3Rpb25zLgotCVVzZSBSRUxPQ19BUk1fQklUU19ORUdfe0JJRyxMSVRUTEV9IHRvIGV4dHJhY3QgbmVnYXRpdmUgcmVsb2MgYml0LgotCShhb3V0YXJtX3NxdWlydF9vdXRfcmVsb2NzKTogRGVsZXRlLgotIAotCUZyb206IERhdmlkIFRheWxvciAoZHRheWxvckBhcm1sdGQuY28udWspCi0JKiBjb25maWcvYXJtW2xiXS1hb3V0Lm10OiBOZXcgZmlsZXMuCi0JKiBhb3V0LWFybS5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQ6IEhhbmRsZSBhcm17LGVbbGJdfS0qLWFvdXQKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHZldG9yIGZvciBhb3V0X2FybV97YmlnLGxpdHRsZX1fdmVjLgotCSogcmVsb2MuYzogTmV3IHJlbG9jYXRpb24gdHlwZXMgZm9yIHRoZSBBUk0uCi0JKiB0YXJnZXRzLmMgKGFvdXRfYXJtX3tiaWcsbGl0dGxlfV92ZWMpOiBkZWNsYXJlLgotCi1UdWUgTWF5IDE2IDEwOjI5OjUxIDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYyAoYmZkX3N0YXQpOiBJZiBiZmRfY2FjaGVfbG9va3VwIHJldHVybnMgYW4gZXJyb3IsCi0JcmV0dXJuIGFuIGVycm9yIHRvIHRoZSBjYWxsZXIuICBDYWxsIGJmZF9zZXRfZXJyb3Igb24gZXJyb3JzLgotCi1UdWUgTWF5IDE2IDE0OjQ0OjQ1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogTW9kaWZpZWQgcHJvdG90eXBlcyBpbgotCWFjY29yZGFuY2Ugd2l0aCAxMSBNYXkgbGliY29mZi5oIGNoYW5nZS4KLQotVGh1IE1heSAxMSAxNjo0MzoxNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JdGVraGV4LmMgKGZpcnN0X3BoYXNlKTogVW5kZXJzdGFuZCB0eXBlIDAgc3ltYm9scy4KLQkodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IEZpeCB0eXBvIGluIGZpbmFsIHJlY29yZC4KLQotVGh1IE1heSAxMSAxNjo0MzoxNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAob3B0Y2FsbF9jYWxsYmFjayk6IGRvbid0IHRyeSBhbmQgb3B0aW1pemUKLQl1bmRlZmluZWQgcmVmcy4gCi0JKGNvZmZfd3JpdGVfcmVsb2NzKTogU2VhcmNoIGZvciBicm9rZW4gcmVsb2NzIG9uIHRoZSB3YXkKLQlvdXQgYW5kIGZpeCB0aGVtIHVwLgotCShjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBDYWxjdWxhdGUgYW5kIHJldHVybiBpbmRleCBvZgotCWZpcnN0IHVuZGVmaW5lZCBzeW1ib2wuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgCi0JYW5kIGNvZmZfd3JpdGVfcmVsb2NzIHdpdGggdGhlIG5ldyBhcmdzLgotCSogbGliY29mZi5oOiAoY29mZl9yZW51bWJlcl9zeW1ib2xzLCBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOgotCU1vZGlmaWVkIHByb3RvdHlwZXMuCi0KLVRodSBNYXkgMTEgMTY6NDM6MTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQkJCSAgVG9tIEdyaWVzdCA8Z3JpZXN0QGNzLnlhbGUuZWR1PgotCi0JSW5pdGlhbCBzdXBwb3J0IGZvciBQRSBmb3JtYXQuIAotCQotCSogTWFrZWZpbGUuaW4sIHRhcmdldHMuYywgY29uZmlndXJlLmluLCBjb25maWcuYmZkOgotCUFkZCBzdXBwb3J0IGZvciBpMzg2LSotd2lubnQgYW5kIGkzODYtKi1wZS4KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfY29mZl9hcm1hcCk6ICBVbmRlcnN0YW5kIE5UUEUgZm9ybWF0Ci0JYXJjaGl2ZXMuCi0JKF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IFR1cm4gXCBpbiBhIGZpbGVuYW1lCi0JaW50byAvLgotCSogYmZkLWluLmggKGJmZF9saW5rX3N1YnN5c3RlbSwgX2JmZF9saW5rX3N0YWNrX2hlYXApOiBOZXcuCi0JKiBjb2ZmLWkzODYuYyAgKGhvd3RvX3RhYmxlKTogQ29uZGl0aW9uYWxpemUgUENSRUxPRkZTRVQuCi0JKiBjb2ZmY29kZS5oIChJTUFHRV9CQVNFKTogTmV3LgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFRocm93IGF3YXkgLmp1bmsKLQlzZWN0aW9ucyBmb3IgUEUsIGFsaWduIHN5bWJvbHMuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVGhyb3cgYXdheSAuanVuayBzZWN0aW9ucwotCWZvciBQRS4gUmVtZW1iZXIgaW5mbyBvbiAuaWRhdGEgYW5kIC5yc3JjIHNlY3Rpb25zLgotCUZpbGwgaW4gdGhlIFBFIGhlYWRlci4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBQRSB1c2VzIENfU0VDVElPTiBjbGFzcy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogS2VlcCBQRSBpbmZvIHVwIHRvIGRhdGUuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3BlIHdpdGggUEUgcmVsb2NzLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3thb3V0L2ZpbGUvc2NuL3N5bX1oZHJfe2luL291dH0pOiAKLQlOZXcgY29kZSBmb3IgUEUgaGVhZGVycy4KLQotVHVlIE1heSAgOSAxNzowMTozOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBsaXR0bGUgZW5kaWFuIFBvd2VyUEMgc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbjogRGl0dG8uCi0JKiB0YXJnZXRzLmM6IERpdHRvLgotCSogY29uZmlnL3BwY2xlLWVsZi5tdDogTmV3IGZpbGUsIGZvciBsaXR0bGUgZW5kaWFuIFBvd2VyUEMKLQlzdXBwb3J0LgotCSogY29uZmlnL3BwYy1lbGYubXQ6IEFkZCBsaXR0bGUgZW5kaWFuIHBvd2VycGMgdG8gdGhlIEJGRAotCXNlbGVjdGlvbiB2ZWN0b3JzLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENvbXBsYWluIGlmCi0JbGlua2luZyBhIGRpZmZlcmVudCBlbmRpYW4gb2JqZWN0IHRoYW4gd2UgZXhwZWN0LgotCShUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0xJVFRMRV9OQU1FKTogRGVmaW5lLCB0byBwcm92aWRlIGxpdHRsZQotCWVuZGlhbiBzdXBwb3J0LgotCi1UdWUgTWF5ICAyIDE2OjMyOjI0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcuYmZkIChocHBhKi0qLWxpdGVzKik6IFRyZWF0IGp1c3QgbGlrZSBocHBhKi0qLSplbGYqLgotCi1UdWUgQXByIDI1IDE5OjM4OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogSW5pdGlhbGl6ZSBsbWEgc2FtZSBhcwotCXZtYS4KLQotVHVlIEFwciAyNSAxMTowMzoyMSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaDogI2luY2x1ZGUgYW5zaWRlY2wuaCAnY2F1c2UgUFRSIGlzIHVzZWQgaW4KLQlzdGQtaG9zdC5oLgotCi1Nb24gQXByIDI0IDIzOjU2OjQ0IDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2bGludXguaCAoSEFWRV9QUk9DRlMpOiBEb24ndCBkZWZpbmUgaXQuICBBZGRlZCBsZW5ndGh5Ci0JY29tbWVudCBleHBsYWluaW5nIHdoeS4KLQotTW9uIEFwciAyNCAxMDozNDowMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogaG9zdHMvaTM4NmxpbnV4LmggKEhBVkVfUFJPQ0ZTKTogSWYgTk9fUFJPQ0ZTIGlzIGRlZmluZWQsIGRvbid0Ci0JZGVmaW5lIEhBVkVfUFJPQ0ZTLgotCi1Nb24gQXByIDI0IDA4OjMzOjEyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG8gbm90IGNvbnRpbnVlCi0JcHJvY2Vzc2luZyB1bmtub3duIHN5bWJvbHMgdG8gcHJldmVudCBhIGNhc2NhZGUgb2YgZXJyb3JzLgotCi1GcmkgQXByIDIxIDEyOjQ4OjQ4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlQYXRjaGVzIGZyb20gSC5KLiBMdSBmb3IgTGludXggRUxGIGNvcmUgZmlsZSBzdXBwb3J0LgotCSogZWxmY29kZS5oIChlbGZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKSBbSEFWRV9QUk9DRlNdOgotCVVzZSBwcnBzaW5mb190IGluc3RlYWQgb2Ygc3RydWN0IHBycHNpbmZvLCBmb3IgY29uc2lzdGVuY3kuCi0JKiBob3N0cy9pMzg2bGludXguaCAoSEFWRV9QUk9DRlMpOiBEZWZpbmUuCi0KLVRodSBBcHIgMjAgMDk6MDc6MzkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGxpbmtfYWN0aW9uKTogRG8gdGhlIHJpZ2h0IHRoaW5nIHdoZW4gYSB1bmRlZmluZWQKLQlzdHJvbmcgc3ltYm9sIGFwcGVhcnMgYWZ0ZXIgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgotCi1GcmkgQXByIDE0IDE2OjUxOjE3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0byByZWxvY2F0ZQotCWEgd2hvbGUgc2VjdGlvbiBmb3IgdGhlIGxpbmtlciwgYnlwYXNzaW5nIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uCi0JKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24gdG8gbWFwIHRoZSBCRkQKLQllbnVtZXJhdGlvbiBjb2RlIGludG8gYSBob3d0byBzdHJ1Y3R1cmUuCi0JKHBwY19lbGZfaG93dG9fcmF3KTogUmVuYW1lIGZyb20gcHBjX2VsZl9ob3d0b190YWJsZS4KLQkocHBjX2VsZl9ob3d0b190YWJsZSk6IE5ldyBhcnJheSB0aGF0IG1hcHMgUG93ZXJQQyByZWxvY2F0aW9uCi0JbnVtYmVycyB0byBob3d0byBzdHJ1Y3R1cmVzIHdpdGhvdXQgYSBsaW5lYXIgc2VhcmNoLiAgQ2hhbmdlIGZyb20KLQl1c2luZyBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgdG8gdXNlIHBwY19lbGZfc3RkX3JlbG9jLgotCShwcGNfZWxmX2hvd3RvX2luaXQpOiBJbml0aWFsaXplIHBwY19lbGZfaG93dG9fdGFibGUgZnJvbQotCXBwY19lbGZfaG93dG9fcmF3LgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogVXNlIGEgY2FzZSBzdGF0ZW1lbnQgaW5zdGVhZCBvZiBhCi0JbG9vcC4KLQkocHBjX2VsZl9zdGRfcmVsb2MpOiBSZXBsYWNlbWVudCBmb3IgYmZkX2VsZl9nZW5lcmljX3JlbG9jLgotCShwcGNfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jKTogUHJpbnQgYSByZWFsIGVycm9yIG1lc3NhZ2UsIGluc3RlYWQKLQlvZiBjYWxsaW5nIGFib3J0LgotCShwcGNfZWxmX2FkZHIxNl9oYV9pbm5lcik6IEFic3RyYWN0IGdldHRpbmcgYWRqdXN0bWVudCBmcm9tCi0JcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIHNvIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBjYW4gdXNlIGl0Ci0JdG9vLgotCShwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYyk6IENhbGwgaXQuCi0JKHBwY19lbGZfZ290MTZfaW5uZXIpOiBBYnN0cmFjdCBnZXR0aW5nIGFkanVzdG1lbnQgZnJvbQotCXBwY19lbGZfZ290MTZfcmVsb2MsIHNvIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBjYW4gdXNlIGl0IHRvby4KLQkocHBjX2VsZl9nb3QxNl9yZWxvYyk6IENhbGwgaXQuCi0JKHBwY19lbGZfaW5mb190b19ob3d0byk6IFJlbmFtZSBmcm9tIHBvd2VycGNfaW5mb190b19ob3d0by4KLQotCSogZWxmY29kZS5oIChlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IE9taXQgc3BhY2UgaW4gZGVidWdnaW5nCi0Jb3V0cHV0LgotCShlbGZfc3ltYm9sX2ZsYWdzKTogQWRkIGRlYnVnIGZ1bmN0aW9uIHRvIGRlY29kZSBmbGFncyBzbyB0aGF0Ci0JZGVmaW5pbmcgREVCVUcgdG8gYmUgNCB3aWxsIGNvbXBpbGUgYWdhaW4uCi0JKGVsZl9kZWJ1Z19zZWN0aW9uKTogRml4IHR5cG8gaW4gZGVidWcgb3V0cHV0LgotCi1GcmkgQXByIDE0IDE2OjAzOjA0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtNjgqLSotZWxmKi4KLQkqIGVsZjMyLW02OGsuYzogRmlsbGVkIG91dCBpbXBsZW1lbnRhdGlvbiwgZXhjZXB0IGZvciBkeW5hbWljCi0JbGlua2luZyBzdXBwb3J0LgotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkZWQgKl9HT1RfUENSRUwsICpfR09UT0ZGLAotCSpfUExUX1BDUkVMLCAqX1BMVE9GRiwgKl82OEtfKiByZWxvY2F0aW9ucyBmb3IgRUxGLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBBcHIgMTMgMTQ6Mjg6MDQgMTk5NSAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQGFkZGVyLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbTY4ay5jIChDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpOiBDaGFuZ2UgZnJvbQotCTEgdG8gMi4KLQkoYmZkX3RhcmdldCk6IENoYW5nZSBtaW5pbXVtIHNlY3Rpb24gYWxpZ25tZW50IGZyb20gMSB0byAyLgotCi1XZWQgQXByIDEyIDEyOjQwOjA0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKG1hY2hpbmVfdHlwZSwgY2FzZSBiZmRfYXJjaF9taXBzKTogVHJlYXQgUjgwMDAgbGlrZQotCVI2MDAwIGFuZCBSNDAwMCBmb3Igbm93LgotCi1UdWUgQXByICA0IDEyOjI4OjI1IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIGNvbmZpZ3VyZS5pbi4KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgTWFrZWZpbGUuaW4uCi0JKiBob3N0cy9tcHcuaDogTmV3IGZpbGUsIE1QVyBob3N0IGRlZmluaXRpb25zLgotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX2luLCBlY29mZl9zd2FwX3Bkcl9pbikgW01QV19DXToKLQlBbHRlcm5hdGUgdmVyc2lvbnMgd2l0aG91dCBFQ09GRl82NCB0aGF0IGNob2tlcyBNUFcgQy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogQWRkIGFsdGVybmF0aXZlIHZlcnNpb24gd2l0aAotCXBhcnRseS1leHBhbmRlZCBtYWNyb3MuCi0KLVRodSBNYXIgMzAgMTQ6NTY6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGZvcgotCW92ZXJmbG93IGlmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLgotCi1UaHUgTWFyIDMwIDE0OjMyOjI2IDE5OTUgIEguSi4gTHUgKGhqbEBueW5leHN0LmNvbSkKLQotCSogY29uZmlnLmJmZDogQ2hhbmdlIGxpbnV4IHRvIGRlZmF1bHQgdG8gZWxmLiAgVXNpbmcKLQlpWzM0NV04Ni0qLWxpbnV4YW91dCB3aWxsIGJ1aWxkIGEgbGlicmFyeSB3aGljaCBkZWZhdWx0cyB0byBhLm91dC4KLQkqIGNvbmZpZy9pMzg2LWxhb3V0Lm10OiBSZW5hbWUgZnJvbSBvbGQgY29uZmlnL2kzODYtbGludXgubXQuCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdDogUmVuYW1lIGZyb20gb2xkIGNvbmZpZy9pMzg2LWxlbGYubXQuCi0JQ29tbWVudCBvdXQgRVhUUkFMSUJTLgotCSogY29uZmlnL2kzODYtbGVsZi5tdDogUmVtb3ZlLgotCi1XZWQgTWFyIDI5IDEyOjAxOjMwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IENhY2hlIHRoZSBzZWN0aW9uIHN5bWJvbCBpbgotCXRoZSB1c2VkX2J5X2JmZCBmaWVsZCBvZiB0aGUgc2VjdGlvbiwgdG8gYXZvaWQgbG9vcGluZyBmb3IgZWFjaAotCXJlbG9jLgotCi0JKiBjcHUtaDg1MDAuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENoYW5nZSBuYW1lIGZyb20gIkg4LzMwMCIgdG8KLQkiaDgzMDAiIGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIGNwdS0qIGZpbGVzLgotCi1UdWUgTWFyIDI4IDE1OjE0OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYm91dC5jIChiX291dF9jYW5vbmljYWxpemVfcmVsb2MpOiBIYW5kbGUgU0VDX0NPTlNUUlVDVE9SCi0Jc2VjdGlvbnMuCi0JKGJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFNraXAgY29uc3RydWN0b3IKLQlzeW1ib2xzIHdoaWNoIHRoZSBtYWluIGxpbmtlciBjb2RlIGRpZCBub3QgZG8gYW55dGhpbmcgd2l0aC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBVc2UgdWRhdGEucCBpZiBpdCBpcyBzZXQsCi0JcmF0aGVyIHRoYW4gbG9va2luZyB0aGUgc3ltYm9sIHVwIGluIHRoZSBoYXNoIHRhYmxlLiAgSnVzdCBwYXNzCi0JdGhyb3VnaCBjb25zdHJ1Y3RvciBzeW1ib2xzIGZvciB3aGljaCB1ZGF0YS5wIGlzIG5vdCBzZXQuICBJZiB0aGUKLQlsaW5rZXIgZGVmaW5lZCB0aGUgc3ltYm9sLCBjbGVhciB0aGUgY29uc3RydWN0b3IgZmxhZy4KLQotVHVlIE1hciAyMSAxMDo1MDozMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbyk6IFNpZ24gZXh0ZW5kIGNvbnN0YW50cyBmcm9tCi0JUl9EQVRBX09WRVJSSURFIGZpeHVwcy4KLQkqIGxpYmhwcGEuaCAoc2lnbl9leHRlbmQpOiBSZW5hbWVkIGZyb20gc2lnbl9leHQuICBGaXguCi0JKGxvd19zaWduX2V4dGVuZCk6IExpa2V3aXNlLgotCi1Nb24gTWFyIDIwIDIyOjM5OjEwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFRpZ2h0ZW4gdGVzdCB0byBkZXRlcm1pbmUKLQl3aGF0IHN5bWJvbHMgYXJlIHNlY3Rpb24gc3ltYm9scy4KLQotU2F0IE1hciAxOCAwMTo1NDo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogQW4gZW1wdHkgYXJjaGl2ZSBpcyBPSy4KLQotRnJpIE1hciAxNyAxNjoyOTowMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IEp1c3QgcmV0dXJuIHRydWUgd2hlbgotCWVpdGhlciB0aGUgaW5wdXQgb3Igb3V0cHV0IHNlY3Rpb24gaXNuJ3QgYXR0YWNoZWQgdG8gYSBTT00gQkZELgotCShzb21fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFNpbWlsYXJseSBmb3IgQkZEIHByaXZhdGUgZGF0YS4KLQotRnJpIE1hciAxNyAxMTo1MDozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2hlY2sgd2hldGhlciBhIGR5bmFtaWMKLQlvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBpbmNsdWRlZCwgYW5kIGlnbm9yZSBpdCB0aGUgc2Vjb25kIHRpbWUuCi0KLVdlZCBNYXIgMTUgMTE6NTY6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBDaGFuZ2UgUl9TUEFSQ19HT1QxMyBmcm9tCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQgdG8gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgotCi0JKiBsaWJlbGYuaCAoYmZkX2VsZjMyX193cml0ZV9yZWxvY3MpOiBEb24ndCBkZWNsYXJlLgotCShiZmRfZWxmNjRfX3dyaXRlX3JlbG9jcyk6IERvbid0IGRlY2xhcmUuCi0KLVR1ZSBNYXIgMTQgMDU6NTQ6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIHN0YWItc3ltcy5jIChhb3V0X3N0YWJfbmFtZSk6IE1vdmVkIGFvdXRfc3RhYl9uYW1lcyB0byBiZSBsb2NhbAotCXRvIHRoaXMgZnVuY3Rpb24uICBSZWNvZGVkIGZ1bmN0aW9uIHRvIHN0b3AgdXNpbmcgdGFibGUsIHRvCi0JaW1wcm92ZSBwZXJmb3JtYW5jZSAob24gaTQ4Ni1uZXRic2QgaG9zdCkuICBMZWZ0IG9sZCB2ZXJzaW9uCi0JaW50YWN0IHVuZGVyICIjaWYgMCIgZm9yIGZ1cnRoZXIgcGVyZm9ybWFuY2UgdGVzdGluZy4KLQotTW9uIE1hciAxMyAxMzo0ODo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogTWFrZSBzdGF0aWMuICBVc2UgUFRSIGFyZ3VtZW50IGFzIGEKLQlwb2ludGVyIHRvIGEgYm9vbGVhbiB2YXJpYWJsZSBzZXQgdG8gdHJ1ZSBpZiBzb21ldGhpbmcgZmFpbHMuCi0JQ2FzdCB0byBQVFIgcmF0aGVyIHRoYW4gdm9pZCAqLgotCShzeW1faXNfZ2xvYmFsKTogUmV3cml0ZSBmb3IgY2xhcml0eS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBJZiB0aGUgcHJvZ3JhbSBoZWFkZXIgc2l6ZSBpcyB0b28gc21hbGwsCi0JY2FsbCBfYmZkX2Vycm9yX2hhbmRsZXIgYW5kIHJldHVybiBmYWlsdXJlIHJhdGhlciB0aGFuIGFib3J0aW5nLgotCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFBhc3MgYm9vbGVhbiB2YXJpYWJsZSB3aGVuCi0JY2FsbGluZyB3cml0ZV9yZWxvY3MuCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYWJvcnQuCi0JKHN0cnVjdCBlbGZfaW5mb19mYWlsZWQpOiBEZWZpbmUuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogRGVjbGFyZSB2YXJpYWJsZXMgaW4gaW5uZXIKLQlibG9ja3MuICBQYXNzIGVsZl9pbmZvX2ZhaWxlZCBzdHJ1Y3R1cmUgd2hlbiBjYWxsaW5nCi0JZWxmX2V4cG9ydF9zeW1ib2wgYW5kIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wuCi0JKGVsZl9leHBvcnRfc3ltYm9sKTogVHJlYXQgZGF0YSBhcmd1bWVudCBhcyBlbGZfaW5mb19mYWlsZWQgcmF0aGVyCi0JdGhhbiBiZmRfbGlua19pbmZvLiAgU2V0IGZhaWxlZCBmaWVsZCBvbiBlcnJvci4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShzdHJ1Y3QgZWxmX2ZpbmZvX2ZhaWxlZCk6IERlZmluZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogUGFzcyBlbGZfZmluZm9fZmFpbGVkIHN0cnVjdHVyZSB3aGVuIGNhbGxpbmcKLQllbGZfbGlua19vdXRwdXRfZXh0c3ltLiAgVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYWJvcnQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBUcmVhdCBkYXRhIGFyZ3VtZW50IGFzIGVsZl9maW5mb19mYWlsZWQKLQlyYXRoZXIgdGhhbiBlbGZfZmluYWxfbGlua19pbmZvLiAgU2V0IGZhaWxlZCBmaWVsZCBvbiBlcnJvci4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYWJvcnQuCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgd3JpdGUKLQlvdXQgUExUUkVMU1osIFBMVFJFTCBhbmQgSk1QUkVMIHJlbG9jcyBpZiB0aGVyZSBpcyBhIC5yZWxhLnBsdAotCXNlY3Rpb24uICBTb2xhcmlzIDIuNCBhcHBhcmVudGx5IGRvZXMgbm90IGhhbmRsZSBlbXB0eSByZWxvYwotCWluZm9ybWF0aW9uIGNvcnJlY3RseS4KLQotCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJtYXApOiBDYXN0IGdldHVpZCBhbmQgZ2V0Z2lkIHJlc3VsdHMgdG8KLQlsb25nLCBhbmQgcHJpbnQgd2l0aCAlbGQuCi0KLUZyaSBNYXIgMTAgMTY6NDE6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IEFsd2F5cyB1c2UgdGhlIG91dHB1dAotCXNlY3Rpb24gaWYgaXQgaXMgbm90IE5VTEwuCi0KLVRodSBNYXIgIDkgMTU6MDY6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IElmIHRoZSBsaW5lIG51bWJlciBjb3VudCBvcgotCXRoZSByZWxvYyBjb3VudCBkb2VzIG5vdCBmaXQsIHByaW50IGFuIGVycm9yIGFuZCByZXR1cm4gMC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JY29mZl9zd2FwX3Njbmhkcl9vdXQuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZQotCW9mIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dC4KLQotCSogYmZkLmM6IEluY2x1ZGUgPHN0ZGFyZy5oPiBvciA8dmFyYXJncy5oPiwgZGVwZW5kaW5nIHVwb24KLQlBTlNJX1BST1RPVFlQRVMuCi0JKGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpOiBOZXcgZ2xvYmFsIHR5cGUuCi0JKF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX2Vycm9yX2hhbmRsZXIpOiBOZXcgQkZEIHByaXZhdGUgZ2xvYmFsIHZhcmlhYmxlLgotCShiZmRfc2V0X2Vycm9yX2hhbmRsZXIpOiBOZXcgZ2xvYmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KLQkoYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUpOiBOZXcgZ2xvYmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2Vycm9yX2hhbmRsZXIpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSk6IEFkZCBzeW1jb3VudCBwYXJhbWV0ZXIsCi0JYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIGJmZF9nZXRfc3ltY291bnQuICBDaGVjayByX2luZGV4IGFmdGVyCi0Jc2V0dGluZyByX2V4dGVybiBiYXNlZCBvbiB3aGV0aGVyIHRoaXMgaXMgYSBiYXNlIHJlbGF0aXZlIHJlbG9jLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfSU4pKTogQWRkIHN5bWNvdW50IHBhcmFtZXRlciwgYW5kIHVzZSBpdAotCWluc3RlYWQgb2YgYmZkX2dldF9zeW1jb3VudC4KLQkoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IFBhc3MgYmZkX2dldF9zeW1jb3VudCB0byByZWxvYwotCXN3YXAgcm91dGluZXMuCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBBZGQgc3ltY291bnQgcGFyYW1ldGVyCi0JdG8gZGVjbGFyYXRpb24uCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogUGFzcwotCWluZm8tPmR5bnN5bV9jb3VudCB0byByZWxvYyBzd2FwIHJvdXRpbmVzLgotCSogYW91dC1uczMyay5jIChNWV9zd2FwX3N0ZF9yZWxvY19pbik6IEFkZCBzeW1jb3VudCBwYXJhbWV0ZXIuCi0JKiBocDMwMGhwdXguYyAoTVkoc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0JKE1ZKHNsdXJwX3JlbG9jX3RhYmxlKSk6IFBhc3MgYmZkX2dldF9zeW1jb3VudCB0byByZWxvYyBzd2FwCi0Jcm91dGluZS4KLQkqIGkzODZseW54LmMgKE5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikpOiBBZGQgc3ltY291bnQKLQlwYXJhbWV0ZXIuCi0JKE5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQkoTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSk6IFBhc3MgYmZkX2dldF9zeW1jb3VudCB0byByZWxvYwotCXN3YXAgcm91dGluZXMuCi0KLVRodSBNYXIgIDkgMTI6MDQ6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24gdmVjdG9yIHRvIGJlCi0JY2FsbGVkIGJ5IHRoZSBsaW5rZXIgdG8gbWVyZ2UgYW55IHByaXZhdGUgYmZkIGRhdGEgb2YgdGhlIGlucHV0Ci0JZmlsZXMgYW5kIHRoZSBvdXRwdXQgZmlsZS4gIFVzZWQgYnkgdGhlIFBvd2VyUEMgRUxGIHN1cHBvcnQgdG8KLQljaGVjayB3aGV0aGVyIC1tcmVsb2NhdGFibGUgaXMgdXNlZCBmb3IgYWxsIG1vZHVsZXMuCi0JKGJmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IE5ldyBmdW5jdGlvbiB2ZWN0b3IgdG8gYmUgY2FsbGVkIGJ5IHRoZQotCWFzc2VtYmxlciB0byBzZXQgcHJpdmF0ZSBmbGFncy4gIFVzZWQgYnkgdGhlIFBvd2VyUEMgRUxGIHN1cHBvcnQKLQl0byBzZXQgdGhhdCBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgd2FzIGFzc2VtYmxlZCB3aXRoIHRoZQotCS1tcmVsb2NhdGFibGUgb3B0aW9uLgotCi0JKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX0NPUFkpOiBBZGQgaW50aWlhbGl6YXRpb24gb2YgdGhlCi0JYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgYW5kIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyBmdW5jdGlvbgotCXZlY3RvcnMuCi0KLQkqIGJmZC1pbjIuaCwgbGliYmZkLWluLmg6IFJlYnVpbGQgd2l0aCBiZmQuYyBhbmQgdGFyZ2V0cy5jCi0JY2hhbmdlcy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiBOZXcgZnVuY3Rpb24gdG8gc2V0IHRoZQotCUVMRiBlX2ZsYWdzIGZpZWxkLgotCShwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgdGhlIGVfZmxhZ3MgZmllbGQgZnJvbSB0aGUKLQlpbnB1dCBmaWxlIHRvIHRoZSBvdXRwdXQgZmlsZS4KLQkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2hlY2sgZm9yIGEgbWlzbWF0Y2ggYmV0d2VlbiB0aGUKLQllX2ZsYWdzIGZpZWxkIG9mIGFsbCBvZiB0aGUgbGlua2VyIGlucHV0IGZpbGVzLgotCi0JKiBsaWJlbGYuaCAoZWxmX29ial90ZGF0YSk6IEFkZCBwcGNfZmxhZ3NfaW5pdCBmaWVsZCBzbyB0aGF0IHRoZQotCVBvd2VyUEMgc3VwcG9ydCBjYW4gY2hlY2sgaWYgY29tcGF0YWlibGUgZV9mbGFncyBhcmUgcHJlc2VudC4KLQotCSogYW91dC10YXJnZXQuaDogQWRkIE5PUCBmb3IgdGhlIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0JYW5kIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyBmdW5jdGlvbiB2ZWN0b3JzLgotCSogY29mZmNvZGUuaDogRGl0dG8uCi0JKiBlbGYzMi10YXJnZXQuaDogRGl0dG8uCi0JKiBlbGY2NC10YXJnZXQuaDogRGl0dG8uCi0JKiBsaWJiZmQuaDogRGl0dG8uCi0JKiBsaWJlY29mZi5oOiBEaXR0by4KLQkqIHNvbS5jOiBEaXR0by4KLQotV2VkIE1hciAgOCAwMDo1Mzo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1taXBzLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgbWlwczo4MDAwIGVudHJ5LgotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBNYXJrIGFuIHVuZGVmaW5lZCBCU0ZfV0VBSyBzeW1ib2wgYXMKLQlTVEJfV0VBSyByYXRoZXIgdGhhbiBTVEJfR0xPQkFMLgotCi1UdWUgTWFyICA3IDEyOjIzOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAotCV9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4LgotCShiZmRfY29mZl9hZGp1c3Rfc3ltbmR4KTogRGVmaW5lLgotCShjb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUgYXMgTlVMTCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkIHRvCi0JY29mZl9hZGp1c3Rfc3ltbmR4LgotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IENhbGwgY29mZl9hZGp1c3Rfc3ltbmR4IGlmIGl0Ci0JaXMgZGVmaW5lZC4KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfYWRqdXN0X3N5bW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfYWRqdXN0X3N5bW5keCk6IERlZmluZSBiZWZvcmUgaW5jbHVkaW5nIGNvZmZjb2RlLmguCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBTa2lwIGJpbmFyeV92ZWMgd2hlbgotCXNlYXJjaGluZyB0aHJvdWdoIGJmZF90YXJnZXRfdmVjdG9yLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBDaGVjayBTSFRfTk9CSVRTIGJlZm9yZSBjaGVja2luZwotCXNoX3NpemUuCi0KLU1vbiBNYXIgIDYgMjM6MzE6MzYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBLZWVwIFNIVF9OT0JJVFMgc2VjdGlvbnMgYWZ0ZXIKLQkhU0hUX05PQklUUyBvbmVzLgotCi1Nb24gTWFyICA2IDA5OjUzOjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjcHUtaHBwYS5jIChhcmNoX2luZm9fc3RydWN0KTogU3VwcG9ydCBib3RoIFBBMS4wIGFuZCBQQTEuMQotCW1hY2hpbmUgdHlwZXMuCi0JKGJmZF9ocHBhX2FyY2gpOiBMaW5rIGluIGJvdGggUEExLjAgYW5kIFBBMS4xIGFyY2hpdGVjdHVyZSBpbmZvCi0Jc3RydWN0dXJlcy4KLQkqIGxpYmhwcGEuaCAoZW51bSBwYV9hcmNoKTogTmV3IGVudW1lcmF0aW9uIHRvIGRlc2NyaWJlIHRoZQotCWRpZmZlcmVudCB2YXJpYW50cyBvZiB0aGUgUEEgYXJjaGl0ZWN0dXJlLgotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBVc2UgbmV3IGVudW1lcmF0aW9uIHRvIHNldCBtYWNoaW5lCi0JdHlwZS4KLQkoc29tX2ZpbmlzaF93cml0aW5nKTogSWYgdGhlIG1hY2hpbmUgdHlwZSBpcyBQQTEuMSwgdGhlbiB1c2UgdGhlCi0JUEExLjEgbWFjaGluZSBpZGVudGlmaWVyIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotVGh1IE1hciAgMiAxNTo1ODoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBUcmVhdCB0aGUgaW5kZXggb2YgYQotICAgICAgICBiYXNlIHJlbGF0aXZlIHJlbG9jIGFzIGFuIGluZGV4IGludG8gdGhlIHN5bWJvbCB0YWJsZSwgcmVnYXJkbGVzcwotICAgICAgICBvZiB0aGUgc2V0dGluZyBvZiByX2V4dGVybi4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpKTogRG91YmxlIGNoZWNrIHRoYXQgdGhlCi0JY2FsbGVyIGlzIHdyaXRpbmcgdG8gYSB2YWxpZCBzZWN0aW9uLgotCi1UaHUgTWFyICAyIDE0OjM3OjU3IDE5OTUgIEJyeWFuIEZvcmQgIDxiYWZvcmRAY3MudXRhaC5lZHU+Ci0KLQkqIGJpbmFyeS5jOiBBZGQgc3VwcG9ydCBmb3IgcmVhZGluZyBiaW5hcnkgZmlsZXMuICBMb2FkcyB0aGUgcmF3Ci0JY29udGVudHMgb2YgdGhlIGZpbGUgaW50byBhIGRhdGEgc2VjdGlvbiBhbmQgd3JhcHMgc29tZSBzeW1ib2xzCi0JYXJvdW5kIGl0LiAgVGhlIHN5bWJvbHMgYF9iaW5hcnlfPGZpbGVuYW1lPl9zdGFydCcgYW5kCi0JYF9iaW5hcnlfPGZpbGVuYW1lPl9lbmQnIGluZGljYXRlIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBkYXRhLAotCXdoaWxlIGBfYmluYXJ5XzxmaWxlbmFtZT5fc2l6ZScgaXMgYW4gYWJzb2x1dGUgc3ltYm9sIHdob3NlIHZhbHVlCi0JaXMgdGhlIHNpemUgb2YgdGhlIGRhdGEuICA8ZmlsZW5hbWU+IGlzIHRoZSBuYW1lIG9mIHRoZSBiaW5hcnkKLQlpbnB1dCBmaWxlLCB3aXRoIGFsbCBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgY29udmVydGVkIHRvCi0JdW5kZXJzY29yZXMuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9hcmNoX2dldF9jb21wYXRpYmxlKTogQXNzdW1lIHVzZXJzIGtub3dzIHdoYXQKLQl0aGV5J3JlIGRvaW5nIGlmIG9uZSBvZiB0aGUgYXJjaGl0ZWN0dXJlcyBpcyBiZmRfYXJjaF91bmtub3duLgotCi1XZWQgTWFyICAxIDE3OjMwOjQ2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAoZWxmX3Bvd2VycGNfaG93dG9fdGFibGUpOiBGb3IgcmVsb2NhdGlvbgotCVJfUFBDX0dPVDE2LCBjaGFuZ2UgY29tcGxhaW5fb25fb3ZlcmZsb3cgdG8gYmUKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQuCi0KLVdlZCBNYXIgIDEgMTE6NTI6NTUgMTk5NSAgSmFzb24gTW9sZW5kYSAgPGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgcG93ZXJwYy0qLWFpeCouCi0KLVdlZCBNYXIgIDEgMTE6NTc6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAoQ09GRl9QQUdFX1NJWkUpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmV3cml0ZSBvdXRwdXQgb2YgVERFRkFVTFRTIHRvIGF2b2lkIHJlbHlpbmcgb24KLQlzZW1hbnRpY3Mgb2Ygc2luZ2xlIHF1b3RlcyBpbiBwYXJhbWV0ZXIgc3Vic3RpdHV0aW9uLgotCi1UdWUgRmViIDI4IDEyOjUzOjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogU29ydCBlbXB0eSBzZWN0aW9ucyBiZWZvcmUgbm9uLWVtcHR5Ci0Jc2VjdGlvbnMsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBWTUEuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotbGludXhlbGYqKTogTmV3IHRhcmdldC4gIFVzZSBpMzg2LWxlbGYuCi0JKGlbMzQ1XTg2LSotZ251ZWxmKik6IE5ldyB0YXJnZXQuICBVc2UgaTM4Ni1nZWxmLgotCSogY29uZmlnL2kzODYtbGVsZi5tdDogTmV3IGZpbGUuCi0JKiBjb25maWcvaTM4Ni1nZWxmLm10OiBOZXcgZmlsZS4KLQotTW9uIEZlYiAyNyAxMjo1ODoyNSAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBhZGQgYTI5ay0qLXZ4d29ya3MgY29uZmlndXJhdGlvbi4KLQotV2VkIEZlYiAyMiAxNDo0MDoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IENoYW5nZSBkZWNsYXJhdGlvbiB0bwotCXVzZSByZWxvY19ob3d0b190eXBlIHJhdGhlciB0aGFuIGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QuCi0KLVR1ZSBGZWIgMjEgMTg6MTk6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBib3V0LmMgKGJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlKTogRG9uJ3QgcmV0dXJuIGFuIGVycm9yIGlmIGFza2VkCi0JZm9yIHJlbG9jYXRpb25zIGZvciB0aGUgLmJzcyBzZWN0aW9uLgotCi1UdWUgRmViIDIxIDE1OjEzOjA1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBIYW5kbGUgb2JqZWN0cyB3aXRoIG9kZAotCWxlbmd0aHMuCi0KLUZyaSBGZWIgMTcgMTI6MzQ6MzYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2dvdDE2X3JlbG9jKTogTWFrZSBHT1Qgc3R5bGUgcmVsb2NzIGFkZAotCTMyNzY4LCBzbyB0aGUgR09UIHBvaW50ZXIgY2FuIHBvaW50IHRvIDE2Mzg0IHBvaW50ZXJzLCBpbnN0ZWFkIG9mCi0JODE5Mi4KLQotRnJpIEZlYiAxNyAxMTo0NTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhvc3RzL3N5c3Y0Lmg6IEluY2x1ZGUgPHVuaXN0ZC5oPiwgPHN0ZGxpYi5oPiwgYW5kIDx0aW1lLmg+LgotCU9ubHkgZGVmaW5lIFNFRUtfU0VUIGFuZCBTRUVLX0NVUiBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBkZWZpbmVkLgotCVJlbW92ZSBhbGwgZXh0ZXJuYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCi0JKiBzeW1zLmMgKGJmZF9kZWNvZGVfc3ltY2xhc3MpOiBSZXR1cm4gJ1cnIGZvciBhIHdlYWsgc3ltYm9sLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IFNldCBzdGFydCBhZGRyZXNzIGFuZCBmbGFncwotCWJlZm9yZSBjYWxsaW5nIGNvZmZfbWtvYmplY3RfaG9vay4gIFJlc3RvcmUgdGhlbSBvbiBmYWlsdXJlLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9ta29iamVjdF9ob29rKTogSWYgbm90IEVDT0ZGX0FPVVRfWk1BR0lDLAotCWNsZWFyIERfUEFHRUQuCi0KLQkqIGNvZmZnZW4uYzogUmVpbmRlbnRlZC4KLQotVGh1IEZlYiAxNiAxNDozNzoyMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCB1c2UgYml0cG9zIGluIG92ZXJmbG93Ci0JY2FsY3VsYXRpb25zLgotCShiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0KLVRodSBGZWIgMTYgMTM6MjI6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiBSZW1vdmUgYWxsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB3aGljaCByZXR1cm4KLQlpbnQgb3Igdm9pZCwgZXhjZXB0IHRoZSBvbmUgZm9yIGZyZWUuCi0KLVdlZCBGZWIgMTUgMTQ6NTQ6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAoZWxmX3Bvd2VycGNfaG93dG9fdGFibGUpOiBVc2UgYSBkZXN0aW5hdGlvbiBtYXNrIG9mCi0JMHhmZmZmZmZmZiBmb3IgUl9QUENfUkVMMzIsIG5vdCAwLgotCShwb3dlcnBjX3JlbG9jX21hcCk6IEFkZCBsb3cgMTYgYml0LCBoaWdoIDE2IGJpdCwgYW5kIGhpZ2ggMTYgYml0Ci0JYWRqdXN0ZWQgcmVsb2NhdGlvbnMuCi0KLVR1ZSBGZWIgMTQgMTc6NDc6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUpOiBEZWZpbmUuCi0JKG1pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVmaW5lLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGZpbmRfbGluZV9pbmZvIGZpZWxkLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luKTogTW92ZSB0byBlY29mZmxpbmsuYy4KLQkoX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4pOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0KTogTGlrZXdpc2UuCi0JKGNtcF9mZHJ0YWJfZW50cnkpOiBMaWtld2lzZS4KLQkobWtfZmRydGFiKTogTGlrZXdpc2UuCi0JKGxvb2t1cCk6IExpa2V3aXNlLgotCShfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSnVzdCBjYWxsIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUKLQl0byBkbyBtb3N0IG9mIHRoZSB3b3JrLiAgQWxsb2NhdGUgZmluZF9saW5lX2luZm8gaWYgbmVjZXNzYXJ5LgotCSogZWNvZmZsaW5rLmM6IEluY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIuCi0JKF9iZmRfZWNvZmZfc3dhcF90aXJfaW4pOiBNb3ZlIGluIGZyb20gZWNvZmYuYy4KLQkoX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4pOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0KTogTGlrZXdpc2UuCi0JKGNtcF9mZHJ0YWJfZW50cnkpOiBMaWtld2lzZS4gIFVzZSBQVFIgaW5zdGVhZCBvZiB2b2lkICouCi0JKG1rX2ZkcnRhYik6IE1vdmUgaW4gZnJvbSBlY29mZi5jLiAgQWRkIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsCi0JYW5kIGxpbmVfaW5mbyBhcmd1bWVudHMsIGFuZCB1c2UgdGhlbSBpbnN0ZWFkIG9mIGVjb2ZmX2RhdGEuCi0JKGZkcnRhYl9sb29rdXApOiBNb3ZlIGluIGZyb20gbG9va3VwIGluIGVjb2ZmLmMuICBSZW1vdmUgYWJmZAotCWFyZ3VtZW50LCBhZGQgbGluZV9pbmZvIGFyZ3VtZW50LiAgVXNlIGl0IGluc3RlYWQgb2YgZWNvZmZfZGF0YS4KLQkoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IE5ldyBmdW5jdGlvbiwgbW9zdGx5IGZyb20gdGhlIG9sZAotCV9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUgaW4gZWNvZmYuYy4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IFJlbW92ZSBmaW5kX2J1ZmZlciwgZmRydGFiX2xlbiBhbmQKLQlmZHJ0YWIgZmllbGRzLCByZXBsYWNpbmcgdGhlbSBmaW5kX2xpbmVfaW5mbyBmaWVsZC4KLQkoX2JmZF9lY29mZl9zd2FwX3Rpcl9pbik6IERlY2xhcmUuCi0JKF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4pOiBEZWNsYXJlLgotCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQpOiBEZWNsYXJlLgotCSogbGliYmZkLWluLmggKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW46IERvbid0IHVzZSBlY29mZi5vIGZvciBiZmRfZWxmMzJfYmlnbWlwc192ZWMgb3IKLQliZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBGZWIgMTQgMTQ6MDQ6MjIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZHMgZWxmX21hY2hpbmVfYWx0MSBhbmQKLQllbGZfbWFjaGluZV9hbHQyIHdoaWNoIHByb3ZpZGUgYWx0ZXJuYXRlIHZlcnNpb25zIG9mIHRoZSBtYWNoaW5lCi0JY29kZS4KLQotCSogZWxmMzItcHBjLmMgKEVMRl9NQUNISU5FX0FMVDEsIEVMRl9NQUNISU5FX0FMVDIpOiBEZWZpbmUgdG8KLQlyZWNvZ25pemUgb2xkIHZlcnNpb25zIG9mIHRoZSBQb3dlclBDIG1hY2hpbmUgY29kZS4KLQotCSogZWxmMzItdGFyZ2V0LmggKGVsZjMyX2JlZCk6IEluaXRpYWxpemUgYWx0ZXJuYXRlIG1hY2hpbmUgY29kZQotCWZpZWxkcyBkZWZpbmVkIGJ5IEVMRl9NQUNISU5FX0FMVDEgYW5kIEVMRl9NQUNISU5FX0FMVDIuCi0KLQkqIGVsZjY0LXRhcmdldC5oIChlbGY2NF9iZWQpOiBJbml0aWFsaXplIGFsdGVybmF0ZSBtYWNoaW5lIGNvZGUKLQlmaWVsZHMgZGVmaW5lZCBieSBFTEZfTUFDSElORV9BTFQxIGFuZCBFTEZfTUFDSElORV9BTFQyLgotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogSW4gYWRkaXRpb24gdG8gdGhlCi0JbWFpbiBtYWNoaW5lIGNvZGUgZmllbGQsIGNoZWNrIHRoZSB0d28gYWx0ZXJuYXRlIG1hY2hpbmUgY29kZQotCWZpZWxkcy4KLQotVHVlIEZlYiAxNCAxMjo0Njo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXRmMS5oIChNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuICBEb24ndAotCWFjY2VwdCBNX1NQQVJDIGlmIGJmZF9hcmNoX3NwYXJjIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQKLQlhcmNoaXRlY3R1cmVzLCBhbmQgZG9uJ3QgYWNjZXB0IGEgNjgweDAgbWFjaGluZSB0eXBlIGlmCi0JYmZkX2FyY2hfbTY4ayBpcyBub3QgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGFyY2hpdGVjdHVyZXMuCi0JKiBhb3V0MC5jIChNQUNIVFlQRV9PSyk6IERlZmluZS4KLQotTW9uIEZlYiAxMyAyMzoyNTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBEb24ndCByZXR1cm4gYSBwb2ludGVyCi0JdG8gZ2FyYmFnZSBpZiB0aGUgc3ltYm9sIGluZGV4IGlzIG91dCBvZiByYW5nZS4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCi1UaHUgRmViICA5IDE4OjM2OjUyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBpMzg2bXNkb3Muby4KLQotVGh1IEZlYiAgOSAxMjowMjozNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODZsaW51eC5jIChORUVEU19TSFJMSUIpOiBEZWZpbmUuCi0JKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBDcmFzaCBpZiBhIE5FRURTX1NIUkxJQiBzeW1ib2wgaXMKLQl1bmRlZmluZWQuICBGcm9tIGhqbEBueW5leHN0LmNvbSAoSC5KLiBMdSkuCi0KLVdlZCBGZWIgIDggMTc6MjY6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IEFsbG9jYXRlIGNvbW1vbgotCXN5bWJvbCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICBEb24ndCBib3RoZXIgdG8gY2hlY2sgZm9yIGNvbW1vbgotCXN5bWJvbCBzaXplIG92ZXJmbG93LgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogQWRqdXN0IHJlZmVyZW5jZXMKLQl0byBjb21tb24gc3ltYm9sIGluZm9ybWF0aW9uIGZvciBuZXcgc3RydWN0dXJlLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgIDggMDk6NTM6NDIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogUHV0IFNIVF9OT0JJVFMgc2VjdGlvbnMgYWZ0ZXIgIVNIVF9OT0JJVFMuCi0KLVR1ZSBGZWIgIDcgMTY6Mjc6MzMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2ZpbmRfbmVhcmVzdF9saW5lKTogSnVzdCByZXR1cm4gZmFsc2UsIGRvbid0Ci0JYWJvcnQuCi0KLVR1ZSBGZWIgIDcgMTQ6NDM6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmM6IFJlZm9ybWF0dGVkIHNvbWUgY29tbWVudHMgYW5kIGJyYWNlIGNvbnN0cnVjdHMgaW4KLQlyZWNlbnQgY2hhbmdlcyB0byBHTlUgc3R5bGUuCi0JKGNtcF9mZHJ0YWJfZW50cnksIG1rX2ZkcnRhYiwgbG9va3VwKTogVXNlIG9sZC1zdHlsZSBmdW5jdGlvbgotCWRlZmluaXRpb25zLgotCi1UdWUgRmViICA3IDE0OjIxOjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX2luKTogWmVybyBvdXQgaW50ZXJuIGJlZm9yZSBzZXR0aW5nCi0JYW55IG9mIHRoZSBmaWVsZHMuCi0KLU1vbiBGZWIgIDYgMjA6MDE6MjQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVNhdCBGZWIgIDQgMTQ6MjA6MjQgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1PgotCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9wZHJfaW4sIGVjb2ZmX3N3YXBfcGRyX291dCk6IGFkZGVkCi0JaW50ZXJuYWxpemluZy9leHRlcm5hbGl6aW5nIG5ldyAicHJvZiIgZmllbGQuCi0KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX3RkYXRhKTogYWRkZWQgZmRydGFiLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRml4ZWQuCi0KLU1vbiBGZWIgIDYgMTQ6MjU6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgc2F3X25lZWRlZCBmaWVsZC4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU2V0IHNhd19uZWVkZWQgaWYKLQlEVF9ORUVERUQgc2VlbiBpbiAuZHluYW1pYyBzZWN0aW9uLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogV2FybiBpZiBhbiB1bmRlZmluZWQgc3ltYm9sIGlzCi0Jb25seSByZWZlcmVuY2VkIGZyb20gYSBkeW5hbWljIG9iamVjdCwgYW5kIG5vdCBtYWtpbmcgYSBzaGFyZWQKLQlvYmplY3QsIGFuZCBzYXdfbmVlZGVkIGlzIGZhbHNlLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBzYXdfbmVlZGVkLgotCi0JKiBsaWJlbGYuaCAoRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUspOiBEb24ndCBkZWZpbmUuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGNsZWFyIG9yIHNldAotCUVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogRG9uJ3QgY2hlY2sgRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUsuCi0KLQlEaXN0aW5ndWlzaCBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgZnJvbSBhIHJlZ3VsYXIgZGVmaW5lZCBzeW1ib2wuCi0JKiBsaW5rZXIuYyAoZW51bSBsaW5rX2FjdGlvbik6IEFkZCBERUZXLgotCShsaW5rX2FjdGlvbik6IEFkZCBiZmRfbGlua19oYXNoX2RlZndlYWsgY29sdW1uLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEFkZCBERUZXIGNhc2UuICBIYW5kbGUKLQliZmRfbGlua19oYXNoX2RlZndlYWsgaW4gYSBmZXcgb3RoZXIgY2FzZXMuCi0JKiBNYW55IGZpbGVzIChiZmRfbGlua19oYXNoX3VuZGVmd2Vhayk6IFJlbmFtZWQgZnJvbQotCWJmZF9saW5rX2hhc2hfd2Vhay4KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSGFuZGxlIGJmZF9saW5rX2hhc2hfZGVmd2Vhay4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKiBib3V0LmMgKGdldF92YWx1ZSk6IExpa2V3aXNlLgotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MpOiBMaWtld2lzZS4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcyk6IExpa2V3aXNlLgotCSogY29mZmxpbmsuYyAoY29mZl93cml0ZV9nbG9iYWxfc3ltKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IExpa2V3aXNlLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogTElrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KLQkqIGkzODZsaW51eC5jIChsaW51eF9hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCShsaW51eF90YWxseV9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmspOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IExpa2V3aXNlLgotCShzZXRfc3ltYm9sX2Zyb21faGFzaCk6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IExpa2V3aXNlLgotCShiZmRfcGVyZm9ybV9zbGlwKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCShzdW5vc19zY2FuX3N0ZF9yZWxvY3MpOiBMaWtld2lzZS4KLQkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotTW9uIEZlYiAgNiAwMzoyMDoxNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyBmcm9tIEJyeWFuIEZvcmQsIGJhZm9yZEBzY2hpcmYuY3MudXRhaC5lZHU6Ci0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLW1zZG9zKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGkzODZtc2Rvc192ZWMpOiBIYW5kbGUgaXQuCi0JKiBpMzg2bXNkb3MuYzogTmV3IGZpbGUuCi0JKiBjb25maWcvaTM4Ni1tc2Rvcy5tdDogTmV3IGZpbGUuCi0JKiBiZmQuYyAoZW51bSBiZmRfZXJyb3IpOiBBZGRlZCBuZXcgdmFsdWUgYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZy4KLQkoYmZkX2Vycm1zZ3MpOiBBZGRlZCBzdHJpbmcgdG8gdGFibGUuCi0JKiBsaWJhb3V0LmggKHJlbG9jX3R5cGUtbG9va3VwKTogRGVjbGFyZSBpdC4KLQkqIHRhcmdldHMuYyAoZW51bSBiZmRfZmxhdm91cik6IEFkZGVkIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91ci4KLQkoaTM4Nm1zZG9zX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGl0IHRvIHRoZSBsaXN0LgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotV2VkIEZlYiAgMSAwMTozMjoxNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbywgY2FzZSBSX0RBVEFfT05FX1NZTUJPTCk6IElmIHRoZXJlJ3MKLQlub3RoaW5nIGluIFJfREFUQV9PVkVSUklERSwgdGhlbiB0cnkgdG8gZmluZCB0aGUgYWRkZW5kIGluIHRoZQotCXNlY3Rpb24ncyBjb250ZW50cy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IElnbm9yZSB0aGUgYWRkZW5kIGluIGEgUl9EQVRBX09ORV9TWU1CT0wgZml4dXAuCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogTW9yZSBoZXJ1aXN0aWNzIHRvIGRldGVjdCB0aGUKLQlicmFpbmRhbWFnZWQgSFAgT1NGMSBsaW5rZXIuIAotCShzZXR1cF9zZWN0aW9ucyk6IERvbid0IGZvcmdldCB0byBmcmVlIHN1YnNwYWNlX3NlY3Rpb25zIGlmIHdlIGdldAotCWFuIGVycm9yLgotCShzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogQWxsb2NhdGUgc3RyaW5ncyBvbiB0aGlzIGJmZCdzIG9ic3RhY2sKLQlyYXRoZXIgdGhhbiBkaXJlY3RseSBvdXQgb2YgdGhlIGhlYXAuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZSBmb3IgdGhlIHNhdmVkIGNvcHkgb2YgdGhlCi0JY2Fub25pY2FsIHN5bWJvbHMuCi0JKHNvbV9zbHVycF9yZWxvY190YWJsZSk6IExpa2V3aXNlIGZvciB0aGUgc2F2ZWQgY29weSBvZiB0aGUKLQljYW5vbmljYWwgcmVsb2NhdGlvbnMuICBGcmVlIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMgd2hlbiB3ZSdyZQotCWRvbmUgd2l0aCB0aGVtLgotCi1UdWUgSmFuIDMxIDIxOjUzOjI4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE5ldyBtZW1iZXIgcHJvZ3JhbV9oZWFkZXJfc2l6ZS4KLQkqIGVsZmNvZGUuaCAoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBOZXcgcGFyYW1ldGVycyBzb3J0ZWRfaGRycywKLQljb3VudCwgYW5kIG1heHBhZ2VzaXplLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQlJZiBzb3J0ZWRfaGRycyBpcyBub24tTlVMTCwgdXNlIGl0IHRvIGNvbXB1dGUgdGhlIG51bWJlciBvZiBzZWdtZW50cy4KLQlTYXZlIHJlc3VsdCBpbiBjYXNlIGNhbGxlZCBhZ2Fpbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBTb3J0IGhlYWRlcnMgYmVmb3JlIGNhbGxpbmcKLQlnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZS4KLQotVHVlIEphbiAzMSAxNToyNzo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBBZGQgc29ydGVkX2hkcnMgcGFyYW1ldGVyLgotCVNlYXJjaCB0aHJvdWdoIGl0IHJhdGhlciB0aGFuIHRocm91Z2ggdW5zb3J0ZWQgc2VjdGlvbiBoZWFkZXJzLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFBhc3Mgc29ydGVkX2hkcnMgdG8KLQltYXBfcHJvZ3JhbV9zZWdtZW50cy4KLQotTW9uIEphbiAzMCAyMjowNDo1MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRml4IHByb2JsZW1zIGluIHJhbmdlCi0JY2hlY2tpbmcuICBFeHBlY3QgYXJndW1lbnQgT0ZGU0VUIHRvIGJlIHNlY3Rpb24tcmVsYXRpdmUuICBGcm9tCi0JRGF2aWQgTW9zYmVyZ2VyLVRhbmcsIGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUuCi0KLU1vbiBKYW4gMzAgMTE6MjI6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IERvbid0IGRvCi0JYW55dGhpbmcgaWYgd2UgYXJlIG5vdCBsaW5raW5nIGFuIEVMRiBmaWxlLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IExpa2V3aXNlLgotCi1TYXQgSmFuIDI4IDEyOjQ4OjU3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoY29tcGFyZV9zdWJzcGFjZXMpOiBOZXcgZnVuY3Rpb24gdG8gc29ydCBzdWJzcGFjZXMgYnkKLQl0aGVpciBsb2NhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUuCi0JKHNldHVwX3NlY3Rpb25zKTogV2hlbiBjb21wdXRpbmcgdGhlIGluZGV4IGZvciBlYWNoIHN1YnNwYWNlLAotCWhhbmRsZSBjYXNlIHdoZXJlIHNldHVwX3NlY3Rpb25zIHJlYWRzIHRoZSBzdWJzcGFjZXMgaW4gYQotCWRpZmZlcmVudCBvcmRlciB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSBvYmplY3QgZmlsZS4KLQkoc29tX2lzX3NwYWNlKTogQWxzbyBleGFtaW5lIHRoZSBvdXRwdXQgc2VjdGlvbiBmb3IgdGhlIGNvbnRhaW5pbmcKLQlzZWN0aW9uLgotCShzb21faXNfc3Vic3BhY2UsIHNvbV9pc19jb250YWluZXIpOiBMaWtld2lzZS4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBEb24ndCBwcmVwYXJlIG9yIHdyaXRlIGZpeHVwcyBoZXJlLiAgV2hlbgotCXdyaXRpbmcgdGhlIHN5bWJvbCBzdHJpbmdzLCB1c2UgdGhlIHVuc29ydGVkIHN5bWJvbCB0YWJsZS4KLQkoc29tX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHdyaXRlIHRoZSBzeW1ib2wgdGFibGUgaGVyZS4KLQkoc29tX2ZpbmlzaF93cml0aW5nKTogUHJlcGFyZSBhbmQgd3JpdGUgdGhlIGZpeHVwcyBoZXJlLiAgTGlrZXdpc2UKLQlmb3IgdGhlIHN5bWJvbCB0YWJsZS4KLQkoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFVuZGVmaW5lZCBzeW1ib2xzIGFsd2F5cyBoYXZlCi0JdHlwZSBTU19VTlNBVCByZWdhcmRsZXNzIG9mIEJTRl9FWFBPUlQuCi0JKHNvbV9zZXRfcmVsb2NfaW5mbyk6IFVucGFjayBhbmQgYXR0YWNoIGFyZ3VtZW50IGxvY2F0aW9uCi0JaW5mb3JtYXRpb24gZm9yIFJfUENSRUxfQ0FMTCBhbmQgUl9BQlNfQ0FMTCByZWxvY2F0aW9ucy4KLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBOZXcgaGV1cmlzdGljIHRvIGRldGVybWluZSBpZiB0aGUKLQllbnRyeSBhbmQgZmxhZ3MgZmllbGRzIGFyZSBzd2l0Y2hlZCBpbiB0aGUgZXhlYyBoZWFkZXIuCi0KLVNhdCBKYW4gMjggMDA6MTY6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSAqc3ltX2hhc2ggaW5zdGVhZAotCW9mIGggaWYgd2UgbWlnaHQgbm90IGJlIGRvaW5nIGFuIEVMRiBsaW5rLgotCi1GcmkgSmFuIDI3IDE2OjEzOjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogSWYgdGhlIHNpemUgb2YgYW4gaW5wdXQKLQkucmVnaW5mbyBzZWN0aW9uIGlzIHplcm8sIGZvcmNlIGl0IHRvIHRoZSBjb3JyZWN0IHNpemUsIHNpbmNlIHRoZQotCWxpbmtlciBlbXVsYXRpb24gY29kZSBtYXkgaGF2ZSBjbG9iYmVyZWQgaXQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IENvcnJlY3QgU0hGX0FMTE9DIHRlc3QuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogRnJlZSBzb3J0ZWRfaGRycy4KLQotVGh1IEphbiAyNiAwOTowMDoxMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogc3JlYy5jIChzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRml4IG9mZiBieQotCW9uZSBlbmQgYWRkcmVzcyBjYWxjdWxhdGlvbi4KLQotCSogY29uZmlnLmJmZDogKG02OCotZXN0LWNvZmYpOiBOZXcgY29uZmlndXJhdGlvbi4KLQotVGh1IEphbiAyNiAxMTozOToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBleGFtaW5lIHdlYWtkZWYgaWYKLQl3ZSBhcmUgdXNpbmcgYW4gRUxGIGhhc2ggdGFibGUuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogQWx3YXlzIHNldCBFWEVDX1AgaWYKLQl0aGUgc3RhcnQgYWRkcmVzcyBpcyBpbiB0aGUgLnRleHQgc2VjdGlvbiwgZXZlbiBpZiBTVEFUX0ZPUl9FWEVDCi0JaXMgc2V0LiAgSnVzdCB1c2UgU1RBVF9GT1JfRVhFQyBhcyBhbiBhZGRpdGlvbmFsIHRlc3QuCi0KLVRodSBKYW4gMjYgMTE6MTI6NTQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogVXNlIEVNX1BQQyBpbnN0ZWFkIG9mCi0JRU1fQ1lHTlVTX1BPV0VSUEMuCi0KLQkqIGVsZjMyLXBwYy5jIChyZWxvY190eXBlKTogQWRkIGFsbCBTeXN0ZW0gVi40IGFuZCBlQUJJCi0JcmVsb2NhdGlvbnMgY3VycmVudGx5IGRlZmluZWQuCi0JKHBvd2VycGNfcmVsb2NfbWFwKTogQWRqdXN0IHRvIG5ldyByZWxvY2F0aW9uIG5hbWVzLgotCShlbGZfcG93ZXJwY19ob3d0b190YWJsZSk6IEFkZCBtb3N0IG9mIHRoZSBuZXcgcmVsb2NhdGlvbnMuCi0JKEVMRl9NQUNISU5FX0NPREUpOiBVc2UgRU1fUFBDIGluc3RlYWQgb2YgRU1fQ1lHTlVTX1BPV0VSUEMuCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBwb3dlcnBjLSotZWFiaS4KLQotCSogY29uZmlnL3BwYy1lbGYubXQ6IEFkZCByczYwMDAgYXJjaGl0ZWN0dXJlIHN1cHBvcnQgdG8gdGhlCi0JUG93ZXJQQy4gIEFsc28gYWRkIFhDT0ZGIHN1cHBvcnQuCi0KLVdlZCBKYW4gMjUgMjM6MjY6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKENBTENfQURERU5EKTogRG9uJ3QgZGVmaW5lLgotCShjb2ZmX3NoX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IFVzZSBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLgotCi1UdWUgSmFuIDI0IDE0OjIyOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9vdXRwdXRfZXh0c3ltKTogU2V0IHRoZSB2YWx1ZSBvZiB0aGUKLQlFQ09GRiBzeW1ib2wgZnJvbSB0aGUgaGFzaCB0YWJsZSBlbnRyeS4KLQotTW9uIEphbiAyMyAxNDo1MzozNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogY29mZi1zaC5jIChjb2ZmX3NoX3JlbG9jYXRlX3NlY3Rpb24pOiAgRG9uJ3Qgc3VidHJhY3QKLQl2bWEgdHdpY2UuCi0KLU1vbiBKYW4gMjMgMTM6MzM6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbG9jKTogRG9uJ3QgaWdub3JlIHRoZSBwcmV2aW91cyBjb250ZW50cyBvZiBhbgotCVJfU0hfSU1NMzIgcmVsb2MuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotZ251Kik6IFNldCBiZmRfbmFtZSB0byBpMzg2LWdudS4KLQkqIGNvbmZpZy9pMzg2LWdudS5tdDogTmV3IGZpbGUuICBJbmNsdWRlIEVMRiBzdXBwb3J0LgotCi0JKiBvcG5jbHMuYyAoYmZkX29wZW5zdHJlYW1yKTogQ2FsbCBiZmRfY2FjaGVfaW5pdC4KLQotRnJpIEphbiAyMCAxMTo0NDo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogT25seSBzZXQgdGhlIHN1bm9zIHNwZWNpZmljCi0JZmllbGRzIGlmIHdlIGFyZSBkb2luZyBhIHN1bm9zIGxpbmsuCi0KLVdlZCBKYW4gMTggMTI6Mjg6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjcHUtaDgzMDAuYyAoaDgzMDBfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgbmFtZSBmcm9tICJIOC8zMDAiIHRvCi0JImg4MzAwIiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBjcHUtKiBmaWxlcy4KLQkoaDgzMDBoX2luZm9fc3RydWN0KTogQ2hhbmdlIG5hbWUgZnJvbSAiSDgvMzAwSCIgdG8gImg4MzAwaCIuCi0JKiBjb2ZmLWg4MzAwLmMgKHNwZWNpYWwpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGRpZmYuCi0KLVR1ZSBKYW4gMTcgMTA6NTI6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoYmZkX2J5dGUsIHJlbG9jX2hvd3RvX3R5cGUpOiBEZWZpbmUgaGVyZSwgbm90Li4uCi0JKiByZWxvYy5jIChiZmRfYnl0ZSwgcmVsb2NfaG93dG9fdHlwZSk6IGhlcmUuCi0JKiBDaGFuZ2VkIGFsbCBvY2N1cnJlbmNlcyBvZiBgYGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QnJwotCXRvIGJlIGBgcmVsb2NfaG93dG9fdHlwZScnIGluc3RlYWQuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oLCBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0KLQkqIG9wbmNscy5jIChiZmRfb3BlbnN0cmVhbXIpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGVsZjMyLW1pcHMuYyAoZW51bSByZWxvY190eXBlKTogRGVmaW5lIG5ldyByZWxvY3MgdXNlZCBvbiBJcml4LgotCShlbGZfbWlwc19ob3d0b190YWJsZSk6IEFkZCBlbnRyaWVzIGZvciBuZXcgcmVsb2NzLgotCShtaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfTUlQU19NU1lNLAotCVNIVF9NSVBTX0RXQVJGLCBhbmQgU0hUX01JUFNfRVZFTlRTLgotCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogSGFuZGxlIHNlY3Rpb25zIG5hbWVkIC5tc3ltLCAuZGVidWdfKgotCWFuZCAuTUlQUy5ldmVudHMuKi4KLQotCSogc3JlYy5jIChzcmVjX2luaXQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCi0KLVNhdCBKYW4gMTQgMTk6MDk6NDggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAam9ubnk+Ci0KLQkqIGFyY2h1cmVzLmMsIE1ha2VmaWxlLmluLCB0YXJnZXRzLmMsIGJmZC1pbjIuaCwgY29mZmNvZGUuaCwKLQljb25maWcuYmZkLCBjb25maWd1cmUuaW4sIGNvbmZpZy93NjUubXQ6IEluaXRpYWwgc3VwcG9ydCBmb3IgdGhlIFc2NS4KLQotU3VuIEphbiAxNSAxMzo1Nzo0NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogQ29uZmlndXJlIGZvciBXSU4zMi4KLQotVGh1IEphbiAxMiAxNjozMDo0NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogSW5jbHVkZSBgaGVhZGVycycuCi0KLQkqIHN1bm9zLmMgKG02OGtfcGx0X2ZpcnN0X2VudHJ5LCBzcGFyY19wbHRfZmlyc3RfZW50cnkpOiBOb3cKLQljb25zdC4KLQkqIHRla2hleC5jIChkaWdzKTogRGl0dG8uCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3BsdDBfZW50cnksIGVsZl9pMzg2X3BsdF9lbnRyeSk6IERpdHRvLgotCi0JKiBzcmVjLmMsIHRla2hleC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLiAgRGVsZXRlIHN0YXRpYyBhcnJheQotCWhleF92YWx1ZSBhbmQgcmVwbGFjZSByZWZlcmVuY2VzIHRvIGl0IHdpdGggcmVmZXJlbmNlcyB0bwotCWhleF9pbml0LCBoZXhfcCwgYW5kIGhleF92YWx1ZS4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIGRlcGVuZGVuY2llcy4KLQotCSogYXJjaHVyZXMuYyAoYXJjaHVyZXNfaW5pdF90YWJsZSk6IE5vdyBjb25zdC4KLQkoYmZkX2FyY2hfaW5pdCk6IEFkanVzdGVkIHR5cGUgb2YgbG9jYWwgdmFyIGBwdGFibGUnLgotCi1UaHUgSmFuIDEyIDA5OjMzOjI0IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaG9zdHMvc3ltbWV0cnkuaDogIFJlZGVmaW5lIGBzaGFyZWQnIHRvIGVuYWJsZSBjb21waWxhdGlvbgotCXdpdGggdGhlIG5hdGl2ZSBEeW5peCBjYyBjb21waWxlci4KLQkqIGkzODZkeW5peC5jOiAgSW5jbHVkZSBhb3V0eC5oIGluc3RlYWQgb2YgdXNpbmcgcm91dGluZXMKLQlmcm9tIGFvdXQzMi5jLgotCi1XZWQgSmFuIDExIDIxOjMxOjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBNYWtlIHR5cGVkZWYgaW5jbHVkZSBgY29uc3QnLgotCSogYW91dC1uczMyay5jLCBhb3V0eC5oLCBib3V0LmMsIGNmLW02OGtseW54LmMsIGNvZmYtaTM4Ni5jLAotCWNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZmxpbmsuYywgY3B1LW5zMzJrLmMsIGVjb2ZmLmMsCi0JZWxmMzItaHBwYS5jLCBlbGYzMi1pMzg2LmMsIGVsZjMyLW1pcHMuYywgZWxmMzItc3BhcmMuYywKLQllbGZjb2RlLmgsIGxpYmJmZC1pbi5oLCBsaW5rZXIuYywgbWlwc2JzZC5jLCBubG0zMi1wcGMuYywgb2FzeXMuYywKLQlyZWxvYy5jLCBzb20uYzogRG9uJ3QgdXNlIGBjb25zdCcgaW4gY29tYmluYXRpb24gd2l0aAotCWByZWxvY19ob3d0b190eXBlJy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBlY29mZi5jIChlY29mZl90eXBlX3RvX3N0cmluZyk6IExvY2FsIHZhcmlhYmxlIGBidWZmZXIxJyBkb2Vzbid0Ci0JbmVlZCB0byBiZSBzdGF0aWMuCi0KLVdlZCBKYW4gMTEgMTQ6MzY6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IERvbid0IGNvcmUgZHVtcCBpZiBhIG11bHRpcGxlCi0JZGVmaW5pdGlvbiBvZiBhbiBhYnNvbHV0ZSBzeW1ib2wgaXMgZW5jb3VudGVyZWQuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IElnbm9yZQotCXJlZGVmaW5pdGlvbnMgb2YgYW4gYWJzb2x1dGUgc3ltYm9sIHRvIHRoZSBzYW1lIHZhbHVlLgotCi1Nb24gSmFuICA5IDE1OjUxOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJdCdzIHJlYXNvbmFibGUgZm9yIG5vCi0JZmxhZ3MgdG8gYmUgc2V0LCBzbyBkb24ndCBpbnNpc3Qgb3RoZXJ3aXNlLgotCi1GcmkgSmFuICA2IDE2OjM5OjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3Qgc2V0IEJTRl9HTE9CQUwgZm9yIGFuCi0JdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgotCi1XZWQgSmFuICA0IDE0OjE0OjA1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogT25seSByZXR1cm4gc2VjdGlvbnMgd2hpY2gKLQljb3JyZXNwb25kIHRvIHN1YnNwYWNlcy4KLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRG9uJ3QgZm9yZ2V0IHRvIGJ1bXAgdGhlCi0JdG90YWxfc3Vic3BhY2VzIHdoZW4gd3JpdGluZyB0aGUgdW5sb2FkYWJsZSBzdWJzcGFjZXMuCi0KLVdlZCBEZWMgMjggMjA6NTQ6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogVXNlIFNFQ19IQVNfQ09OVEVOVFMgdG8gaWRlbnRpZnkKLQlic3MtbGlrZSBzZWN0aW9ucy4KLQkoc29tX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKHNvbV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi1UdWUgRGVjIDI3IDE0OjAzOjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBUdXJuIG9mZiBTRUNfSEFTX0NPTlRFTlRTIGZvciBic3MtbGlrZQotCXNlY3Rpb25zLgotCi1UdWUgRGVjIDIwIDE1OjMwOjEyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoYmZkX2RlYnVnX3NlY3Rpb24pOiBEZWxldGVkLgotCShjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXgpOiBSZXR1cm4gYWJzb2x1dGUgc2VjdGlvbiBmb3IgZGVidWcKLQlzeW1ib2wuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogU2V0IEJTRl9ERUJVR0dJTkcgZm9yIENfRklMRSBzeW1ib2xzLiAgSWYKLQlCU0ZfREVCVUdHSU5HIGlzIHNldCwgc2V0IHNlY3Rpb24gdG8gTl9ERUJVRy4KLQkoY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBVc2UgYWJzb2x1dGUgc2VjdGlvbi4KLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEluIGFzc2VydGlvbiwKLQlmb3JjZSBhbGwgdmFsdWVzIHRvIHRoZSBzYW1lIHR5cGUuCi0KLVR1ZSBEZWMgMjAgMTE6MTE6NTggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChob3d0b190YWJsZSk6IEFsbCByZWxvY3MgZ2V0IGEgc3BlY2lhbCBmdW5jdGlvbi4KLQkoc3BlY2lhbCk6IE5ldmVyIGRvIGFueXRoaW5nIHdoZW4gbGlua2luZyAtci4KLQotVHVlIERlYyAyMCAxMzo1ODowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGkzODZsaW51eC5jIChsaW51eF9hZGRfb25lX3N5bWJvbCk6IERvbid0IGRvIGFueXRoaW5nIExpbnV4Ci0Jc3BlY2lmaWMgaWYgdGhpcyBpcyBub3QgYSBMaW51eCBoYXNoIHRhYmxlLiAgRnJvbSBFcmljIFlvdW5nZGFsZQotCTxlcmljQGFpYi5jb20+LgotCi0JUGF0Y2hlcyBmcm9tIGtrb2ppbWFAbWl4Lm9yLmpwIChLYXp1bW90byBLb2ppbWEpOgotCSogbWlwc2JzZC5jIChtaXBzX2hvd3RvX3RhYmxlX2V4dCk6IENoYW5nZSBzaXplcyBvZiBtZW1vcnkgcmVsb2NzCi0JYXBwbHkgdG8gZnJvbSB0d28gYnl0ZXMgdG8gZm91ciBieXRlcy4KLQkqIE1ZKHJlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IGFuZCBleHBhbmQgdGhlCi0JbGlzdCBvZiBjYXNlcyBmb3Igd2hpY2ggcmVsb2NhdGlvbiBuZWVkIG5vdCBiZSBjb21wdXRlZC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotTW9uIERlYyAxOSAyMzowOToxNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBEZWxldGUgZG9fbG9jYWxzIGFuZAotCWRvX2dsb2JhbHMgYXJndW1lbnRzLCBhbHdheXMgcmVhZCBzeW1ib2wgZXh0ZW5zaW9uIGluZm9ybWF0aW9uIGZvcgotCWdsb2JhbHMgYW5kIGxvY2Fscy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IFJld29yayB0byBvbmx5IHJlYWQgc3ltYm9sIGV4dGVuc2lvbgotCWluZm9ybWF0aW9uIG9uY2UgZm9yIGVhY2ggaW5wdXQgYmZkLiAgMTAlIGltcHJvdmVtZW50IGluIGxpbmtlcgotCXBlcmZvcm1hbmNlLgotCi1GcmkgRGVjIDE2IDEyOjI4OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogQ2hlY2sKLQliZmRfaXNfYWJzX3NlY3Rpb24sIGV0Yy4sIG9ubHkgYWZ0ZXIgY2hlY2tpbmcgZm9yIHRoZSBzZWN0aW9uIGluCi0JdGhlIEJGRCBhbmQgYWZ0ZXIgY2FsbGluZyB0aGUgYmFja2VuZCByb3V0aW5lLgotCi1XZWQgRGVjIDE0IDIwOjIxOjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBPbmx5IHVzZSBzZWN0aW9uIHN5bWJvbHMgd2hvc2UKLQl2YWx1ZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIGNoZWNraW5nIG91dHB1dF9vZmZzZXQgd2hlbgotCXVzaW5nIG91dHB1dF9zZWN0aW9uLiAgV2hlbiBjcmVhdGluZyBhIG5ldyBzeW1ib2wsIHNldCB0aGUgdmFsdWUKLQl0byAwLCBzaW5jZSBCRkQgc3ltYm9sIHZhbHVlcyBhcmUgc2VjdGlvbiByZWxhdGl2ZS4KLQotVHVlIERlYyAxMyAxMzozMTowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNwdS16OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IE1ha2UgejgwMDIgdGhlIGRlZmF1bHQKLQlhcmNoaXRlY3R1cmUuCi0KLUZyaSBEZWMgIDkgMTI6NDM6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IElmIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlCi0JYXJjaGl2ZSBpcyBub3QgYW4gRUxGIG9iamVjdCwgcGFzcyB0aGUgYXJjaGl2ZSB0byB0aGUgYWRkX3N5bWJvbHMKLQllbnRyeSBwb2ludCBhcHByb3ByaWF0ZSBmb3IgdGhlIGZpcnN0IG9iamVjdC4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKLQk8ZXJpY0BhaWIuY29tPi4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKSk6IFNpbWlsYXIgY2hhbmdlIGlmIHRoZQotCWZpcnN0IG9iamVjdCBpcyBub3QgYW4gYS5vdXQgb2JqZWN0LgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBjb21wdXRlCi0JcmVsb2NhdGlvbiBpbiBjYXNlcyB3aGVyZSB3ZSB3b24ndCB1c2UgaXQuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVRodSBEZWMgIDggMTQ6MTk6NDEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcGM1MzItbWFjaC5jIChOQU1FKTogRGVmaW5lIHRvIHVzZSBuczMya2FvdXQgcHJlZml4LgotCSogbnMzMmtuZXRic2QuYyAoTkFNRSk6IERpdHRvLgotCShuczMya2FvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUgdG8gc3RhbmRhcmQgYW91dC0zMgotCXZlcnNpb24uCi0KLUZyaSBEZWMgIDIgMTM6NTY6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBydGwuY3lnbnVzLmNvbT4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfcmVhZF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0Ci0Jb2YgbWlwc19yZWxheF9zZWN0aW9uLgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBDYWxsIG1pcHNfcmVhZF9yZWxvY3MuCi0JKGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX21uaXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1XZWQgTm92IDMwIDE0OjEyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1zaC5jOiBVc2UgX2JmZF9kdW1teV90YXJnZXQgaW5zdGVhZCBvZiBub19hcmNoaXZlLgotCi1UdWUgTm92IDI5IDE0OjAwOjE5IDE5OTQgIEouVC4gQ29ua2xpbiAgPGp0Y0AucnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotZnJlZWJzZCopOiBVc2UgaTM4Ni1ic2QgYXMgYmZkX25hbWUuCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtKi1mcmVlYnNkKik6IFVzZSBpMzg2YnNkIGFzIG15X2hvc3QuCi0KLU1vbiBOb3YgMjggMTU6MzY6MDQgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbTY4ay1uYnNkLm10IChERUZBVUxUX1ZFQ1RPUik6IHNldCB0byBtNjhrbmV0YnNkX3ZlYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGFuY2llcy4KLQkgIChDRklMRVMpOiBBZGRlZCBtNjhrbmV0YnNkLmMuCi0JICAoSEZJTEVTKTogQWRkZWQgbmV0YnNkLmguCi0KLVdlZCBOb3YgMjMgMTk6MjE6NDEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZi1zaC5jIChzaGxjb2ZmX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShub19hcmNoaXZlKTogTmV3IGZ1bmN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssIGNvZmZfc2V0X2ZsYWdzKTogSGFuZGxlCi0JbGl0dGxlIGVuZGlhbiBTSC4KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIHNobC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgc2hsY29mZl92ZWMuCi0JKiBjb25maWcvc2gtY29mZi5tdCAoU0VMRUNUX1ZFQ1MpOiBIYW5kbGUgc2hsX2NvZmZfdmVjLgotCi1XZWQgTm92IDIzIDEwOjUwOjEzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IERvIG5vdCBzdWJ0cmFjdCB0aGUgc2VjdGlvbidzIHZtYSBmcm9tCi0JdGhlIHJlbG9jJ3Mgb2Zmc2V0IHdoZW4gd3JpdGluZyAubydzLiAgSW5zdGVhZCBhZGQgdGhlIHNlY3Rpb24ncwotCXZtYSB0byB0aGUgcmVsb2MncyBvZmZzZXQgd2hlbiB3cml0aW5nIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkCi0JbGlicmFyeS4KLQotVHVlIE5vdiAyMiAyMzozNDozNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogRG8gbm90IGFkZAotCWlucHV0X3NlY3Rpb24tPnZtYSB0byB0aGUgcmVsb2NhdGlvbidzIG9mZnNldC4KLQotTW9uIE5vdiAyMSAxMjozNzoyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHNyZWMuYyAoc3JlY19nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKHNyZWNfY2Fub25pY2FsaXplX3JlbG9jKTogRGVmaW5lLgotCShzcmVjX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KLQkoc3JlY192ZWMsIHN5bWJvbHNyZWNfdmVjKTogVXNlIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoc3JlYykuCi0KLVNhdCBOb3YgMTkgMDM6MTA6NTEgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtKi1zb2xhcmlzKik6ICBVc2Ugc29sYXJpczIgdG8KLQllbmFibGUgZXh0cmFjdGlvbiBvZiBwcm9jZnMgaW5mbyBmcm9tIGNvcmUgZmlsZSBmb3IgR0RCLgotCi1UaHUgTm92IDE3IDE3OjM3OjM5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3R5cGUpOiBBZGQgbmV3IHZhbHVlIEJGRF9SRUxPQ18xMl9QQ1JFTC4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLVRodSBOb3YgMTcgMTM6MTI6MDggMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJmZC9lbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGVkKTogVXNlIHRoZQotCXZtYSBmcm9tIHRoZSBvdXRwdXRfc2VjdGlvbiBjb250YWluaW5nICRnbG9iYWwkIHdoZW4gY29tcHV0aW5nCi0JZ2xvYmFsX3ZsYXVlLgotCi1UaHUgTm92IDE3IDE0OjI5OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBSb3VuZCB1cCB0aGUgYXJjaGl2ZQotCWhlYWRlciBzaXplIG9mIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlIHRvIGFuIGV2ZW4gbnVtYmVyLgotCi1XZWQgTm92IDE2IDE2OjA4OjA2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYzogRGVsZXRlZCBzb21lIGNvZGUgdGhhdCB3YXMgY29tbWVudGVkIG91dCBvciBpbnNpZGUKLQkiI2lmIDAiLgotCShDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lLgotCi0JKiBjcHUtc2guYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENvbnZlcnQgbmFtZSB0byBsb3dlcmNhc2UsIGZvcgotCWNvbnNpc3RlbmN5IHdpdGggb3RoZXIgYXJjaGl0ZWN0dXJlcy4KLQotU2F0IE5vdiAxMiAyMzo1MDoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2V4cG9ydF9zeW1ib2wpOiBBbHNvIGV4cG9ydCBzeW1ib2xzIHdoaWNoIGFyZQotCXJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIGZpbGUuCi0KLUZyaSBOb3YgMTEgMTQ6Mjk6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkCi0JZXhwb3J0X2R5bmFtaWMgYXJndW1lbnQsIGFuZCBoYW5kbGUgaXQuCi0JKGVsZl9leHBvcnRfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLUZyaSBOb3YgMTEgMTA6MzU6MzMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfc3RydWN0KTogRGVsZXRlIGhhbmRsZXMgZm9yIHRoZQotCWRhdGEsIHJlZyBhbmQgc3RhY2sgc2VjdGlvbnMuICBUaGV5J3JlIG5ldmVyIHVzZWQuICBEZWxldGUKLQlhY2Nlc3NvciBtYWNyb3MuCi0JKG1ha2VfYmZkX2FzZWN0aW9uKTogVXNlIGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IHNpbmNlIGRlYnVnZ2luZwotCWNvcmVzIGZyb20gZHluYW1pYyBleGVjdXRhYmxlcyBtYXkgaGF2ZSBzZXZlcmFsIHNlY3Rpb25zIHdpdGggdGhlCi0Jc2FtZSBsb2dpY2FsIG5hbWUuCi0JKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IERvbid0IHNhdmUgaGFuZGxlcyB0byBkYXRhLCByZWcgYW5kCi0Jc3RhY2sgc2VjdGlvbnMuICBIYW5kbGUgQ09SRV9URVhULCBDT1JFX01NRiBhbmQgQ09SRV9TSE0uCi0KLVR1ZSBOb3YgIDggMTM6MDM6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBib3V0LmMgKGNhbGxqX2NhbGxiYWNrKTogQWRkIG5ldyBhcmd1bWVudCBzaHJpbmtpbmcuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIEhhbmRsZSByZWxvY3MgYWdhaW5zdCBzZWN0aW9uIHN5bWJvbHMgY29ycmVjdGx5LiAgSWYgbm90Ci0Jc2hyaW5raW5nLCBkb24ndCBzdWJ0cmFjdCBvdXQgZHN0aWR4OyB0aGUgc3VidHJhY3Rpb24gaXMgYWxyZWFkeQotCWluIHRoZSBvYmplY3QgZmlsZS4KLQotU3VuIE5vdiAgNiAxMjo1MjowMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmg6IENvbmRpdGlvbmFsbHkgaW5jbHVkZSA8c2hsLmg+IGFuZCA8ZGwuaD4uCi0KLVRodSBOb3YgIDMgMTg6MTk6MTMgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEluY2x1ZGUgbTY4a25ldGJzZC5vLgotCi0JKiBjb25maWcvaTM4NmxpbnV4Lm1oIChFWFRSQUxJQlMpOiBJbmNsdWRlIC1sbS4KLQotCVBhdGNoZXMgZnJvbSBESiBEZWxvcmllOgotCSogY29mZi1nbzMyLmM6IFJlcGxhY2VtZW50IGZpbGUsIHVzZXMgY29mZi1pMzg2LmMgd2l0aCBtaW5vcgotCWNoYW5nZXMuCi0JKiBjb2ZmLWkzODYuYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBhbGxvdyBvdGhlciBmaWxlcyB0byBvdmVycmlkZQotCXVuZGVyc2NvcmUgYWxzbwotCSogbWFrZWZpbGUuZG9zOiBkZWwgY3Rvci5vLCBhZGQgY29mZmxpbmsubyBhbmQgZWxmMzIubwotCi0JKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYyk6IElmIHVzZXIgc2V0IGRhdGEgc2VjdGlvbiB2bWEsIHVzZSBpdAotCXRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBic3Mgdm1hLiAgUGF0Y2ggZnJvbSBUYWthZGEgSGlyb2FraSwKLQloaXJvQGlzLnMudS10b2t5by5hYy5qcC4KLQkobWFjaGluZV90eXBlLCBjYXNlIGJmZF9hcmNoX3ZheCk6IFNldCAqdW5rbm93biB0byBmYWxzZS4gIFBhdGNoCi0JZnJvbSBKb2huIERhdmlkIEFuZ2xpbiA8ZGF2ZUBoaWF1bHkxLmhpYS5ucmMuY2E+LgotCi0JKiBjb25maWd1cmUuaW4gKHRiKTogUmVuYW1lIG5zMzJrbmV0YnNkX3ZlYyB0byBwYzUzMm5ldGJzZF92ZWMsCi0Jc2luY2UgdGhhdCdzIHdoYXQgaXQncyBjYWxsZWQuCi0KLVdlZCBOb3YgIDIgMTU6MjQ6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKG5vcm1hbGl6ZSk6IENoYW5nZSB0byB0YWtlIGEgQkZEIGFzIGFuIGFyZ3VtZW50LgotCUNoYW5nZSBWTVMgdmVyc2lvbiB0byB1c2UgYmZkX2FsbG9jIHJhdGhlciB0aGFuIG1hbGxvYywgc28gdGhhdCB3ZQotCWRvbid0IGxvc2UgdGhlIG1lbW9yeSBmb3JldmVyLgotCShfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogQ2hlY2sgdGhlIG5hbWUgb2YgYW4gYXJjaGl2ZQotCWVudHJ5IHdoaWNoIGlzIG5vdCBiZWluZyBleHRlbmRlZCwgYW5kIGNvcnJlY3QgaXQgaWYgaXQgaXMgd3JvbmcuCi0JVGhpcyBpcyBuZWNlc3NhcnkgaW4gY2FzZSB0aGUgYXJjaGl2ZSB3YXMgY29uc3RydWN0ZWQgYnkgYW5vdGhlcgotCXByb2dyYW0gd2hpY2ggcHV0IGFuIGVudHJ5IGluIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlIHdoaWNoIHdlCi0JZG9uJ3QgcGxhbiB0byBwdXQgaW4gb3Vyc2VsdmVzLiAgRnJvbSBqamNAamNsYXJrLmNvbSAoSmFtZXMKLQlDbGFyaykuCi0JKGJmZF9kb250X3RydW5jYXRlX2FybmFtZSk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBub3JtYWxpemUuCi0KLU1vbiBPY3QgMzEgMTQ6MTk6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1ocHBhLmMgKEVMRjMyX1BBUklTQ19TWF9TSVpFKTogRGVmaW5lLgotCShFTEYzMl9QQVJJU0NfU1hfR0VULCBFTEYzMl9QQVJJU0NfU1hfUFVUKTogRGVmaW5lLgotCShzeW1leHRuX2VudHJ5KTogRG9uJ3QgZGVmaW5lLgotCShzeW1leHRfY2hhaW5fc2l6ZSk6IENoYW5nZSB0eXBlIHRvIGJmZF9zaXplX3R5cGUuCi0JKHN5bWV4dG5fY29udGVudHMpOiBDaGFuZ2UgdHlwZSB0byBiZmRfYnl0ZSAqLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IFVzZQotCUVMRjMyX1BBUklTQ19TWF9TSVpFIGluc3RlYWQgb2Ygc2l6ZW9mIChzeW1leHRfZW50cnlTKS4KLQkoZWxmMzJfaHBwYV9zaXplX3N5bWV4dCk6IExpa2V3aXNlLiAgQWxzbywgY2hhbmdlIHR5cGUgb2Ygc2l6ZXAgdG8KLQliZmRfc2l6ZV90eXBlICouCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBDYXN0IHN5bWV4dG5fY29udGVudHMgYXNzaWdubWVudCB0bwotCWJmZF9ieXRlICouICBVc2UgRUxGMzJfUEFSSVNDX1NYX1BVVCBpbnN0ZWFkIG9mIGRpcmVjdCBhc3NpZ25tZW50LgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpOiBVc2UKLQlFTEYzMl9QQVJJU0NfU1hfU0laRSBpbnN0ZWFkIG9mIHNpemVvZiAoc3ltZXh0X2VudHJ5UykuICBVc2UKLQlFTEYzMl9QQVJJU0NfU1hfR0VUIGluc2V0YWQgb2YgZGlyZWN0IGFzc2lnbm1lbnQuCi0JKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IENoYW5nZSB0eXBlIG9mIGNvbnRlbnRzLCBhbmQgaXRzCi0JYXNzaWdubWVudCBjYXN0LCB0byBiZmRfYnl0ZSAqLiAgVXNlIEVMRjMyX1BBUklTQ19TWF9TSVpFIGluc3RlYWQKLQlvZiBzaXplb2YgKHN5bWV4dG5fZW50cnkpLiAgVXNlIHN5bWV4dF9lbnRyeVMgaW5zdGVhZCBvZgotCXN5bWV4dG5fZW50cnkuICBVc2UgRUxGMzJfUEFSSVNDX1NYX0dFVCBpbnN0ZWFkIG9mIGRpcmVjdAotCWFzc2lnbm1lbnQuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lKTogQWRkIHRoZSBhciBwYWRkaW5nCi0JY2hhcmFjdGVyLCBpZiB0aGVyZSBpcyByb29tIGZvciBpdCwgZXZlbiBpZiB0aGUgbmFtZSBpcyB0aGUKLQltYXhpbXVtIGxlbmd0aC4KLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFNvcnQgdGhlIEVMRgotCWhlYWRlcnMgYnkgc2VjdGlvbiBhZGRyZXNzIHdoZW4gYXNzaWduaW5nIGZpbGUgcG9zaXRpb25zLgotCShlbGZfc29ydF9oZHJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotU3VuIE9jdCAzMCAxODo1Njo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDcmVhdGUgRFRfSU5JVAotCWFuZCBEVF9GSU5JIGR5bmFtaWMgZW50cmllcyBiYXNlZCBvbiB0aGUgZXhpc3RlbmNlIG9mIF9pbml0IGFuZAotCV9maW5pIHN5bWJvbHMsIG5vdCBvbiB0aGUgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zLiAgVGhpcyBpcwotCWNvbXBhdGlibGUgd2l0aCBzb21lIFNWUjQgbGlua2Vycy4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLVNhdCBPY3QgMjkgMTI6MTg6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IG1vdmUgYQotCXN5bWJvbCB3aXRoIGEgUExUIGVudHJ5IGludG8gdGhlIC5wbHQgc2VjdGlvbiBpZiBpdCBpcyBkZWZpbmVkIGluCi0JYSByZWd1bGFyIGZpbGUuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJdCdzIG5vdCBhbgotCWVycm9yIGlmIGFuIGVtcHR5IGFyY2hpdmUgaGFzIG5vIHN5bWJvbCB0YWJsZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLUZyaSBPY3QgMjggMTA6MDg6NDEgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQotCi0gICAgICAgIE5ldEJTRC9tNjhrIHN1cHBvcnQsIGJhc2VkIG9uIHdvcmsgYnkgbWlrZWJAc25vdy5kYXRhbWV0cmljcy5jb206IAotCSogY29uZmlnLmJmZCAobTY4Ki0qLW5ldGJzZCopOiBVc2UgbTY4ay1uYnNkIGFzIGJmZF9uYW1lLgotCSogY29uZmlndXJlLmluIChtNjhrbmV0YnNkX3ZlYyk6IEFkZGVkLgotCSogdGFyZ2V0cy5jIChiZmRfbTY4a25ldGJzZF92ZWMpOiBBZGRlZC4KLQkqIGhvc3RzL202OGtuYnNkLmgsIGNvbmZpZy9tNjhrLW5ic2QubXQsIG02OGtuZXRic2QuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTLCBDRklMRVMpOiBBZGQgbTY4a25ldGJzZC5jLgotCi0JbWlzY2VsbGFuZW91cyBjbGVhbnVwIHJlcXVpcmVkIGJ5IGFsbCBuZXRic2QgdGFyZ2V0cywgYmFzZWQgb24gd29yayAKLQlieSBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PjoKLQkqIG5ldGJzZC5oIChOX01BR0lDLCBOX1NFVF9NQUdJQywgTl9HRVRNQUdJQywgTl9HRVRNQUdJQzIsIE5fVFhUQUREUiwKLQkgIE5fVFhUT0ZGLCBOX0FMSUdOLCBOX0RBVEFERFIsIE5fREFUT0ZGKTogUmVtb3ZlZC4gIEdlbmVyaWMgYS5vdXQKLQkgIGRlZmluaXRpb25zIHdvcmsuCi0JKiBpMzg2bmJzZC5jLCBuczMya25ic2QuYywgc3BhcmNuYnNkLmMgKF9fTERQR1NaKTogUmVtb3ZlZC4KLQkgIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogVXNlIE5ldEJTRCdzIG1hZ2ljIG51bWJlcnMKLQotVGh1IE9jdCAyNyAxNjo1OTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgZmllbGQgZHluaW5keC4KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBEb24ndCBmaW5hbGl6ZQotCXRoZSAuZHluc3ltLCAuZHluc3RyIG9yIC5oYXNoIHNlY3Rpb25zIHVudGlsIGFmdGVyIHRoZSBiYWNrZW5kCi0Jc2l6ZV9keW5hbWljX3NlY3Rpb25zIHJvdXRpbmUsIHNvIHRoYXQgaXQgY2FuIGFkZCBkeW5hbWljIHN5bWJvbHMKLQlpZiBpdCB3YW50cyB0by4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgZGVmaW5lIHRoZQotCXN5bWJvbCB0byBiZSBpbiB0aGUgLnBsdCBzZWN0aW9uIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5Ci0JaWYgaXQgaXMgYSBkZWZpbmVkIHN5bWJvbC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBkeW5hbWljIHN5bWJvbCBmb3IgZWFjaCBvdXRwdXQKLQlzZWN0aW9uLCBzdG9yaW5nIHRoZSBpbmRleCBpbiB0aGUgZHluaW5keCBmaWVsZCBvZiB0aGUgRUxGIHNlY3Rpb24KLQlkYXRhLiAgQWRqdXN0IHRoZSBvdGhlciBkeW5pbmR4IGZpZWxkcyB0byBhY2NvdW50IGZvciB0aGlzLgotCShlbGYzMl9zcGFyY19hZGp1c3RfZHluaW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBXaGVuIGNvcHlpbmcgYSByZWxvYyBpbnRvIGEgc2hhcmVkCi0JbGlicmFyeSwgdXNlIHRoZSBvcmlnaW5hbCBhZGRlbmQgYXMgYXBwcm9wcmlhdGUuICBDb252ZXJ0IGFuCi0JUl9TUEFSQ18zMiByZWxvYyBpbnRvIGFuIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2MuICBVc2UgdGhlIGR5bmFtaWMKLQlzeW1ib2wgaW5kZXggb2YgdGhlIG91dHB1dCBzZWN0aW9uLCBub3QgdGhlIG5vcm1hbCBzeW1ib2wgaW5kZXguCi0JKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgZGllIGlmIGEgc2VjdGlvbiBkb2VzCi0Jbm90IGV4aXN0IHdoZW4gc2V0dGluZyB0aGUgdmFsdWUgb2YgdGhlIGR5bmFtaWMgdGFncy4gIFdyaXRlIG91dAotCWEgZHluYW1pYyBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24uCi0KLVdlZCBPY3QgMjYgMDE6MTU6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbik6IERvbid0IGJvdGhlciB0byByZWFkIG9yIHdyaXRlCi0JdGhlIHJlbG9jcyBpZiB0aGVyZSBhcmVuJ3QgYW55LgotCi1UdWUgT2N0IDI1IDExOjQ0OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCB0ZWtoZXguby4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBJZiBTRUxFQ1RfVkVDUyBpcyBub3QgZGVmaW5lZCwKLQlpbmNsdWRlIHRla2hleF92ZWMuCi0JKiB0ZWtoZXguYyAoTklCQkxFLCBJU0hFWCk6IENhc3QgYXJyYXkgYXJndW1lbnRzIHRvIHVuc2lnbmVkIGNoYXIuCi0JKGdldHZhbHVlLCBnZXRzeW0sIG91dCk6IExpa2V3aXNlLgotCShmaW5kX2NodW5rKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzLgotCShmaXJzdF9waGFzZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgcy4KLQkocGFzc19vdmVyKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBhZGRyZXNzLgotCSh0ZWtoZXhfb2JqZWN0X3ApOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHNlY3Rpb24uCi0JKG1vdmVfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSByZXR1cm4gdHlwZSBmcm9tIGJvb2xlYW4gdG8gdm9pZC4KLQkodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIHRkYXRhIGFuZAotCWxpc3QuCi0KLQkqIGxpbmtlci5jIChlbnVtIGxpbmtfYWN0aW9uKTogQWRkIENJTkQuCi0JKGxpbmtfYWN0aW9uKTogQ2hhbmdlIENPTU1PTl9ST1dcaW5kciBmcm9tIE1ERUYgdG8gQ1JFRi4gIENoYW5nZQotCUlORFJfUk9XXGNvbW1vbiBmcm9tIE1ERUYgdG8gQ0lORC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBJbiBDUkVGIGNhc2UsIGhhbmRsZSBhbgotCWV4aXN0aW5nIHN5bWJvbCB3aGljaCBpcyBpbmRpcmVjdCByYXRoZXIgdGhhbiBkZWZpbmVkLiAgQWRkIG5ldwotCUNJTkQgY2FzZS4KLQotTW9uIE9jdCAyNCAxNTozMzoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2UgUy1yZWNvcmQgYmFja2VuZCB0byB1c2UgbXVsdGlwbGUgc2VjdGlvbnMgdG8gaGFuZGxlIGdhcHMgaW4KLQlmaWxlLgotCSogc3JlYy5jIChzcmVjX2RhdGFfbGlzdF9zdHJ1Y3QpOiBNb3ZlIGZpZWxkIG5leHQgZnJvbSBsYXN0IHBsYWNlCi0JdG8gZmlyc3QuICBDaGFuZ2UgdHlwZSBvZiBkYXRhIHRvIGJmZF9ieXRlICouCi0JKHN0cnVjdCBzcmVjX3N5bWJvbCk6IERlZmluZS4KLQkodGRhdGFfdHlwZSk6IFJlbW92ZSBkb25lX3N5bWJvbF9yZWFkLCBjb3VudCwgc3RyaW5ncywgc3ltYm9sX2lkeCwKLQlzdHJpbmdfc2l6ZSwgc3RyaW5nX2lkeC4gIENoYW5nZSB0eXBlIG9mIHN5bWJvbHMgdG8gc3RydWN0Ci0Jc3JlY19zeW1ib2wgKi4gIEFkZCBzeW10YWlsIGFuZCBjc3ltYm9scy4KLQkobG93LCBoaWdoKTogUmVtb3ZlLgotCShzaXplX3N5bWJvbHMsIGZpbGx1cF9zeW1ib2xzLCBzaXplX3NyZWMsIGZpbGx1cCk6IFJlbW92ZS4KLQkod2hpdGUsIHNraXB3aGl0ZSwgcGFzc19vdmVyLCBvYmplY3RfcCk6IFJlbW92ZS4KLQkoc3JlY19ta29iamVjdCk6IENhbGwgc3JlY19pbml0LiAgQWRqdXN0IHRkYXRhIGluaXRpYWxpemF0aW9uIGZvcgotCWZpZWxkIGNoYW5nZXMuCi0JKHNyZWNfZ2V0X2J5dGUsIHNyZWNfYmFkX2J5dGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc3JlY19uZXdfc3ltYm9sLCBzcmVjX3NjYW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc3JlY19vYmplY3RfcCk6IENoYW5nZSB0eXBlIG9mIGIgdG8gYmZkX2J5dGUuICBFeHBsaWNpdGx5IHNldAotCXdyb25nX2Zvcm1hdCBlcnJvci4gIENhbGwgc3JlY19ta29iamVjdCBhbmQgc3JlY19zY2FuIGluc3RlYWQgb2YKLQlvYmplY3RfcC4KLQkoc3ltYm9sc3JlY19vYmplY3RfcCk6IExpa2V3aXNlLiAgQWxzbywgY2hhbmdlIGIgdG8gYmUgb25seSB0d28KLQlieXRlcy4KLQkoc3JlY19yZWFkX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2FsbCBzcmVjX3JlYWRfc2VjdGlvbiByYXRoZXIgdGhhbgotCXBhc3Nfb3Zlci4gIEhhbmRsZSB6ZXJvIGxlbmd0aCBzZWN0aW9uIGNvcnJlY3RseS4KLQkoc2V0X3NldF9hcmNoX21hY2gpOiBDaGFuZ2UgZnJvbSBmdW5jdGlvbiB0byBtYWNyby4KLQkoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSBkYXRhIHRvIGJmZF9ieXRlICouCi0JKHNyZWNfd3JpdGVfcmVjb3JkKTogQ2hhbmdlIGRhdGEsIGVuZCBhbmQgc3JjIHRvIGJmZF9ieXRlICouCi0JKHNyZWNfd3JpdGVfaGVhZGVyKTogQ2hhbmdlIGJ1ZmZlciBhbmQgZHN0IHRvIGJmZF9ieXRlICouCi0JKHNyZWNfd3JpdGVfc2VjdGlvbik6IENoYW5nZSBsb2NhdGlvbiB0byBiZmRfYnl0ZSAqLgotCShzcmVjX3dyaXRlX3Rlcm1pbmF0b3IpOiBDaGFuZ2UgYnVmZmVyIHRvIGJmZF9ieXRlICouCi0JKHNyZWNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IERvbid0IGNhbGwKLQlzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzLgotCShzcmVjX2dldF9zeW10YWIpOiBSZXdyaXRlLgotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBTZXQgdWRhdGEuaSB0byAwLCBub3QgTlVMTC4KLQotRnJpIE9jdCAyMSAxNjo0MzoxMyAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAobWFjaGluZV90eXBlKTogYWRkZWQgTV82OEtfTkVUQlNEIGFuZCBNX1NQQVJDX05FVEJTRC4KLQkqIGkzODZuZXRic2QuYywgbnMzMmtuZXRic2QuYywgc3BhcmNuZXRic2QuYzogcmVtb3ZlZCBSQ1MgSWQncy4KLQkgIGNoYW5nZWQgaG93IFBBR0VfU0laRSBhbmQgU0VHTUVOVF9TSVpFIGFyZSBkZWZpbmVkIHNvIHRoZXkgYXJlCi0JICBjb25zaXN0YW50IHdpdGggZWFjaCBvdGhlci4KLQkqIG5ldGJzZC5oIChOX0hFQURFUl9JTl9URVhULCBURVhUX1NUQVJUX0FERFIpOiBOZXRCU0QgZml0cyBpdHMKLQkgIGhlYWRlciBpbnRvIHRoZSBzdGFydCBvZiBpdHMgdGV4dCBzZWdtZW50LgotCi1GcmkgT2N0IDIxIDE3OjEzOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChCRkRfSlVNUF9UQUJMRV9BUkNISVZFKTogQWRkIGNhc2UgZm9yCi0JX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlLgotCShiZmRfdGFyZ2V0KTogQWRkIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUuCi0JKiBhcmNoaXZlLmMgKF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBOZXcKLQlmdW5jdGlvbi4KLQkoX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBSZW5hbWVkIGJ5IGFkZGluZyBhIGxlYWRpbmcKLQl1bmRlcnNjb3JlLCBhbmQgbWFkZSBleHRlcm5hbGx5IHZpc2libGUuICBBZGRlZCB0cmFpbGluZ19zbGFzaAotCWFyZ3VtZW50LCBhbmQgdXNlZCBpdCBpbnN0ZWFkIG9mIGVsZl9zdHlsZS4gIENoYW5nZWQgdHlwZSBvZgotCXRhYmxlbiB0byBiZmRfc2l6ZV90eXBlICouCi0JKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFVzZSBCRkRfU0VORCB0byBjYWxsCi0JY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUuICBVc2UgdGhlIHJldHVybmVkIG5hbWUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlY2xhcmUuCi0JKF9iZmRfbm9hcmNoaXZlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVjbGFyZS4KLQkoX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBzb20uYyAoc29tX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6Ci0JRGVmaW5lLgotCSogaWVlZS5jIChpZWVlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQkqIG9hc3lzLmMgKG9hc3lzX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCi0JRml4IHRoZSBFTEYgbGlua2VyIHRvIG5vdCByZXF1aXJlIGFuIGludGVycHJldGVyIGlmIG5vIGR5bmFtaWMKLQlvYmplY3RzIHdlcmUgc2VlbiwgZXZlbiB3aGVuIGxpbmtpbmcgUElDIGNvZGUuCi0JKiBsaWJlbGYuaCAoRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGZpZWxkIGR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZC4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogQ3JlYXRlIGR5bnN0ciBpZiBpdAotCWRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgYmFzZWQgb24KLQlkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgZmllbGQsIG5vdCBkeW5vYmogZmllbGQuICBEb24ndCBib3RoZXIgdG8KLQlzZXQgZHlub2JqLgotCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IElmIGR5bmFtaWMgc2VjdGlvbnMgd2VyZQotCWFscmVhZHkgY3JlYXRlZCwgZG9uJ3QgZG8gYW55dGhpbmcuICBJZiBkeW5vYmogaXMgYWxyZWFkeSBzZXQsIHVzZQotCWl0OyBvdGhlcndpc2UsIHNldCBpdCB0byB0aGUgYmZkIGFyZ3VtZW50LiAgRG9uJ3QgaW5pdGlhbGl6ZQotCWR5bnN5bWNvdW50LiAgT25seSBjcmVhdGUgZHluc3RyIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAgU2V0Ci0JZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIHRvIHRydWUuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogU2tpcCBtb3N0IG9mIHRoaXMgZnVuY3Rpb24KLQlpZiBubyBkeW5hbWljIG9iamVjdHMgd2VyZSBzZWVuLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgaGFzIHRoZQotCUVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIGZsYWcgc2V0LCBsZXQgdGhlIGJhY2tlbmQgYWRqdXN0IGl0LgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBDaGFuZ2UgbW9zdCBkZWNpc2lvbnMgYmFzZWQgb24gZHlub2JqIHRvCi0JY2hlY2sgZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIGluc3RlYWQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBPbmx5IGhhbmRsZSBkeW5hbWljIHN5bWJvbHMgaWYgYSBkeW5hbWljCi0Jb2JqZWN0IHdhcyBzZWVuLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBuZXcgZmllbGQKLQlkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQuICBTZXQgZHluc3ltY291bnQgdG8gMSwgbm90IDAuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbAotCWVsZl9pMzg2X2NyZWF0ZV9nb3Rfc2VjdGlvbiByYXRoZXIgdGhhbiBjcmVhdGluZyB0aGUgLmdvdCBhbmQKLQkuZ290LnBsdCBzZWN0aW9ucy4KLQkoZWxmX2kzODZfY3JlYXRlX2dvdF9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogSnVzdCBjYWxsIGVsZl9pMzg2X2NyZWF0ZV9nb3Rfc2VjdGlvbiBpZgotCWEgR09UIHRhYmxlIGlzIG5lZWRlZCwgbm90IGJmZF9lbGYzMl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCU9ubHkgY3JlYXRlIHRoZSAucmVsLmdvdCBzZWN0aW9uLCBhbmQgb25seSBtYWtlIHNwYWNlIGZvciBhIHJlbG9jLAotCWZvciBhIGdsb2JhbCBzeW1ib2wgb3Igd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4gIEZvciBhCi0JUl8zODZfUExUMzIgcmVsb2MsIGp1c3Qgc2V0IHRoZQlFTEZfTElOS19IQVNIX05FRURTX1BMVCBmbGFnLgotCShlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXdvcmsgaW5pdGlhbCBhc3NlcnRpb24gdG8KLQlwZXJtaXQgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgbm9uIGR5bmFtaWMgc3ltYm9scy4gIENyZWF0ZSBhCi0JcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkgZm9yIHN1Y2ggc3ltYm9scy4gIEJ1dCwgaWYgbm8KLQlkeW5hbWljIG9iamVjdHMgd2VyZSBzZWVuLCBuZXZlciBjcmVhdGUgYSBQTFQgZW50cnkuCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIG5vIGR5bmFtaWMgb2JqZWN0cyB3ZXJlIHNlZW4sCi0Jc2tpcCBtb3N0IG9mIHRoaXMgZnVuY3Rpb24sIGFuZCBmb3JjZSB0aGUgc2l6ZSBvZiB0aGUgLnJlbC5nb3QKLQlzZWN0aW9uIHRvIHplcm8uCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBGb3IgYSBSXzM4Nl9HT1QzMiByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsCi0Jc3ltYm9sIHdoZW4gbm8gZHluYW1pYyBvYmplY3Qgd2FzIHNlZW4sIGluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mCi0JdGhlIC5nb3Qgc2VjdGlvbi4gIEZvciBhIFJfMzg2X0dPVDMyIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIG9ubHkKLQljcmVhdGUgYSBSXzM4Nl9SRUxBVElWRSByZWxvYyB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LgotCVRyZWF0IGEgUl8zODZfUExUMzIgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBmb3Igd2hpY2ggd2UgZGlkIG5vdAotCWNyZWF0ZSBhIFBMVCBlbnRyeSBhcyBhIFJfMzg2X1BDMzIgcmVsb2MuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT25seSBmaWRkbGUgd2l0aCB0aGUgZHluYW1pYwotCWVudHJpZXMgYW5kIHRoZSBQTFQgaWYgd2Ugc2F3IGEgZHluYW1pYyBvYmplY3QuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBGaXggUl9TUEFSQ19QQzIyIGJ5Ci0Jc2V0dGluZyByaWdodHNoaWZ0IHRvIDEwLiAgRml4IFJfU1BBUkNfV1BMVDIwIGJ5IHNldHRpbmcKLQlyaWdodHNoaWZ0IHRvIDIsIHNpemUgdG8gMiwgYml0c2l6ZSB0byAzMCwgYW5kIGRzdF9tYXNrIHRvCi0JMHgzZmZmZmZmZi4KLQkoZWxmMzJfc3BhcmNfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQgdGhlIHNpemUgb2YgdGhlCi0JLnBsdCBzZWN0aW9uLiAgQ2FsbCBlbGYzMl9zcGFyY19jcmVhdGVfZ290X3NlY3Rpb24gcmF0aGVyIHRoYW4KLQljcmVhdGluZyB0aGUgLmdvdCBzZWN0aW9uLgotCShlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBDYWxsIGVsZjMyX3NwYXJjX2NyZWF0ZV9nb3Rfc2VjdGlvbiBpZgotCWEgR09UIHRhYmxlIGlzIG5lZWRlZCwgbm90IGJmZF9lbGYzMl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCU9ubHkgY3JlYXRlIHRoZSAucmVsYS5nb3Qgc2VjdGlvbiwgYW5kIG9ubHkgbWFrZSBzcGFjZSBmb3IgYQotCXJlbG9jLCBmb3IgYSBnbG9iYWwgc3ltYm9sIG9yIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuCi0JU2V0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIC5yZWxhLmdvdCBzZWN0aW9uIHRvIDIuICBGb3IgYQotCVJfU1BBUkNfV1BMVDMwIHJlbG9jLCBqdXN0IHNldCB0aGUgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgZmxhZy4KLQkoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmV3b3JrIGluaXRpYWwgYXNzZXJ0aW9uIHRvCi0JcGVybWl0IEVMRl9MSU5LX0hBU0hfTkVEU19QTFQgbm9uIGR5bmFtaWMgc3ltYm9scy4gIENyZWF0ZSBhCi0JcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZm9yIHN1Y2ggc3ltYm9scy4gIEJ1dCwgaWYgbm8gZHluYW1pYwotCW9iamVjdHMgd2VyZSBzZWVuLCBuZXZlciBjcmVhdGUgYSBQTFQgZW50cnkuICBJbml0aWFsaXplIHRoZSBzaXplCi0Jb2YgdGhlIC5wbHQgc2VjdGlvbi4KLQkoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgbm8gZHluYW1pYyBvYmplY3RzIHdlcmUKLQlzZWVuLCBza2lwIG1vc3Qgb2YgdGhpcyBmdW5jdGlvbiwgYW5kIGZvcmNlIHRoZSBzaXplIG9mIHRoZQotCS5yZWxhLmdvdCBzZWN0aW9uIHRvIHplcm8uICBTdHJpcCBlbXB0eSByZWxvYyBzZWN0aW9ucywgYW5kIHN0cmlwCi0JYW4gZW1wdHkgLnBsdCBzZWN0aW9uLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogRm9yIGEgR09UIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwKLQlzeW1ib2wgd2hlbiBubyBkeW5hbWljIG9iamVjdCB3YXMgc2VlbiwgaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YKLQl0aGUgLmdvdCBzZWN0aW9uLiAgRm9yIGEgR09UIHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIG9ubHkKLQljcmVhdGUgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuCi0JVHJlYXQgYSBSX1NQQVJDX1dQTFQzMCByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGZvciB3aGljaCB3ZSBkaWQgbm90Ci0JY3JlYXRlIGEgUExUIGVudHJ5IGFzIGEgUl9TUEFSQ19XRElTUDMwIHJlbG9jLgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgZmlkZGxlIHdpdGggdGhlCi0JZHluYW1pYyBlbnRyaWVzIGFuZCB0aGUgUExUIGlmIHdlIHNhdyBhIGR5bmFtaWMgb2JqZWN0LgotCi1UaHUgT2N0IDIwIDEzOjI4OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBEb24ndCB3b3JyeSBhYm91dCBzZWN0aW9uIHN5bWJvbHMKLQlpbiBhIHNlY3Rpb24gbm90IG93bmVkIGJ5IGFueSBCRkQuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBTZXBhcmF0ZSBvdXQgbG9vcCB3aGljaCBjYWxscwotCWJhY2tlbmQgcm91dGluZS4gIENoZWNrIGJmZF9zZWN0aW9uIGFuZCBjYWxsIHRoZSBiYWNrZW5kIHJvdXRpbmUKLQlldmVuIGZvciBhIHNlY3Rpb24gbm90IG93bmVkIGJ5IGFueSBCRkQuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IEhhbmRsZQotCS5hY29tbW9uIHNlY3Rpb24uCi0KLVdlZCBPY3QgMTkgMTM6Mjg6MjkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBNYWtlIG5hbWVzIGZvciBzZWN0aW9uIG51bWJlciBhbmQKLQlzdG9yYWdlIGNsYXNzIHNsaWdodGx5IG1vcmUgdmVyYm9zZS4gIEl0J3Mgbm90IGNsZWFyIGhvdyBtYW55Ci0JY2hhcmFjdGVycyBJIGNhbiBqdXN0aWZ5IHVzaW5nIHVwLCBidXQgYmVmb3JlIHRoaXMgY2hhbmdlIHRoZXkKLQlib3RoIHdlcmUgYWJicmV2aWF0ZWQgInNjIiB3aGljaCBpcyAoSU1ITykgY2xlYXJseSB1bmFjY2VwdGFibGUuCi0KLVdlZCBPY3QgMTkgMDE6MjY6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IHRoZSBiYXNlIGZpbGUKLQlwb3NpdGlvbiBmcm9tIHRoZSBsb3dlc3Qgc2VjdGlvbiBWTUEsIG5vdCB0aGUgc3RhcnQgYWRkcmVzcy4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEb24ndCByZXR1cm4gYW4gZXJyb3IKLQlpZiB0aGVyZSBhcmUgbm8gc3ltYm9scy4KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9zeW1ib2xfdGFibGUpKTogTGlrZXdpc2UuCi0KLVR1ZSBPY3QgMTggMTI6NTY6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE9ubHkgY29weQotCXN1YmZvcm1hdCB0byBhbm90aGVyIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyIGZpbGUuCi0KLQkqIGJpbmFyeS5jOiBOZXcgZmlsZSBmb3IgcmF3IGJpbmFyeSBvdXRwdXQgZm9ybWF0LgotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogQWRkIGJpbmFyeS5vLgotCShDRklMRVMpOiBBZGQgYmluYXJ5LmMuCi0JKiB0YXJnZXRzLmMgKGJpbmFyeV92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEluY2x1ZGUgYmluYXJ5X3ZlYy4KLQotCSogc3JlYy5jICh0ZGF0YV90eXBlKTogQWRkIGZpZWxkIHRhaWwuCi0JKHNyZWNfbWtvYmplY3QpOiBJbml0aWFsaXplIHRhaWwuCi0JKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTb3J0IFMgcmVjb3JkIGxpc3QgYnkgYWRkcmVzcy4KLQotTW9uIE9jdCAxNyAxMTozODoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogU29ydCB0aGUgc3ltYm9scyBpbnRvIGEgbmV3IGFycmF5LAotCXJhdGhlciB0aGFuIG1lc3Npbmcgd2l0aCBFbGZfU3ltX0V4dHJhLiAgU3RvcmUgdGhlIHN5bWJvbCBpbmRleCBpbgotCXRoZSB1ZGF0YS5pIGZpZWxkLgotCShzd2FwX291dF9zeW1zKTogVXNlIG91dGJvdW5kX3N5bXMgYXMgYSBwb2ludGVyIHJhdGhlciB0aGFuIGFzIGFuCi0JYXJyYXkuICBEb24ndCB3b3JyeSBhYm91dCBlbGZfc3ltX251bS4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX3N5bV9leHRyYSk6IERvbid0IGRlZmluZS4KLQkoRWxmX1N5bV9FeHRyYSk6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBSZW1vdmUgc3ltX2V4dHJhIGZpZWxkLgotCShlbGZfc3ltX2V4dHJhKTogRG9uJ3QgZGVmaW5lLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFVzZQotCXVkYXRhLmkgcmF0aGVyIHRoYW4gZWxmX3N5bV9leHRyYSBhcnJheS4KLQotCSogc3ltcy5jIChhc3ltYm9sKTogQ2hhbmdlIHVkYXRhIGZpZWxkIGludG8gYSB1bmlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSk6IFVzZSB1ZGF0YS5wIHJhdGhlcgotCXRoYW4ganVzdCB1ZGF0YS4KLQkqIGJvdXQuYyAocGVyZm9ybV9zbGlwKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IExpa2V3aXNlLgotCSogaWVlZS5jIChpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogTGlrZXdpc2UuCi0JKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogb2FzeXMuYyAob2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0JKiByZWxvYzE2LmMgKGJmZF9wZXJmb3JtX3NsaXApOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoZmlsbHVwX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGdldF9pbmRleCk6IFVzZSB1ZGF0YS5pIHJhdGhlciB0aGFuIGp1c3QgdWRhdGEuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKHNldF9pbmRleCk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBsaWJlY29mZi5oIChlY29mZl9nZXRfc3ltX2luZGV4LCBlY29mZl9zZXRfc3ltX2luZGV4KTogTGlrZXdpc2UuCi0JKiBzb20uYyAoY29tcGFyZV9zeW1zKTogTGlrZXdpc2UuCi0JKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBMaWtld2lzZS4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IExpa2V3aXNlLgotCi0JVXNlIGEgaGFzaCB0YWJsZSB3aGVuIHdyaXRpbmcgb3V0IEVMRiBzeW1ib2wgbmFtZXMuCi0JKiBlbGZjb2RlLmggKGVsZl9zdHJpbmd0YWJfaW5pdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9uZXdfc3RydGFiLCBiZmRfYWRkX3RvX3N0cnRhYiwgYmZkX2FkZF8yX3RvX3N0cnRhYik6IFJlbW92ZS4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMgdG8gdXNlIGVsZl9zdHJpbmd0YWJfaW5pdCBvcgotCV9iZmRfc3RyaW5ndGFiX2FkZCwgYW5kIGdldCBzdHJpbmd0YWIgbGVuZ3RocyB1c2luZwotCV9iZmRfc3RyaW5ndGFiX3NpemUuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hhbmdlIGlnbm9yZWQgYXJndW1lbnQgdG8gcG9pbnRlciB0bwotCWJvb2xlYW4sIGFuZCBzZXQgdGhlIGJvb2xlYW4gdG8gdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnMuICBJZiBhbgotCWVycm9yIGhhcyBhbHJlYWR5IG9jY3VycmVkLCBkb24ndCBkbyBhbnl0aGluZy4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IEp1c3Qgc2V0IHNoX3NpemUsIG5vdCBjb250ZW50cy4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFBhc3MgdGhlIGFkZHJlc3Mgb2YgYQotCWJvb2xlYW4gdG8gZWxmX2Zha2Vfc2VjdGlvbnMuICBQYXNzIHRoZSBhZGRyZXNzIG9mIGEKLQliZmRfc3RydGFiX2hhc2ggdG8gc3dhcF9vdXRfc3ltcy4gIFdyaXRlIG91dCB0aGUgLnN0cnRhYiBzZWN0aW9uLgotCShwcmVwX2hlYWRlcnMpOiBDaGFuZ2Ugc2hzdHJ0YWIgdG8gYmZkX3N0cnRhYl9oYXNoLgotCShzd2FwX291dF9zeW1zKTogVGFrZSBhIHBvaW50ZXIgdG8gYSBiZmRfc3RydGFiX2hhc2ggYXMgYW4KLQlhcmd1bWVudC4gIFNldCBpdCB0byB0aGUgc3ltYm9sIG5hbWVzLgotCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFdyaXRlIG91dCB0aGUgc2VjdGlvbgotCWhlYWRlciBuYW1lcyB1c2luZyBfYmZkX3N0cmluZ3RhYl9lbWl0LgotCShlbGZfZGVidWdfc2VjdGlvbik6IFJlbW92ZSBmaXJzdCBhcmd1bWVudDsgZ2V0IHRoZSBzZWN0aW9uIG5hbWUKLQl2aWEgdGhlIGJmZF9zZWN0aW9uIHBvaW50ZXIuICBDaGFuZ2UgY2FsbGVyLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgdGhlIHN5bWJvbCBuYW1lcyB1c2luZwotCV9iZmRfc3RyaW5ndGFiX2VtaXQuICBMaWtld2lzZSBmb3IgdGhlIC5keW5zdHIgc2VjdGlvbiBjb250ZW50cy4KLQlGcmVlIHRoZSBzeW1ib2wgbmFtZXMgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFJlbW92ZSB0aGUgbGFzdCBhcmd1bWVudCwgb3V0cHV0X25hbWVzLAotCWZyb20gcmVsb2NhdGVfc2VjdGlvbi4gIFNhdmUgdGhlIG9sZCBzeW1ib2wgY29udGVudHMgYmVmb3JlCi0JY2FsbGluZyBlbGZfbGlua19vdXRwdXRfc3ltLCBhbmQgcmVzdG9yZSB0aGVtIGFmdGVyd2FyZC4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IENoYW5nZSBkeW5zdHIgZmllbGQgdG8KLQlzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSBsYXN0IGFyZ3VtZW50LCBvdXRwdXRfbmFtZXMsCi0JZnJvbSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgotCShzdHJ1Y3Qgc3RydGFiKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IENoYW5nZSBzdHJ0YWJfcHRyIGZpZWxkIHRvIHN0cnVjdAotCWJmZF9zdHJ0YWJfaGFzaC4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIGxhc3QKLQlhcmd1bWVudCwgb3V0cHV0X25hbWVzLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogbGliYmZkLWluLmggKERFRkFVTFRfU1RSSU5HX1NQQUNFX1NJWkUpOiBEb24ndCBkZWZpbmUuCi0JKGJmZF9hZGRfdG9fc3RyaW5nX3RhYmxlKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmMgKGJmZF9hZGRfdG9fc3RyaW5nX3RhYmxlKTogUmVtb3ZlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zd2FwX3NoZHJfaW4pOiBVc2UgYmZkX3NlY3Rpb24sIG5vdCByYXdkYXRhLgotCUNsZWFyIGNvbnRlbnRzIGZpZWxkLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJbiBTSFRfU1RSVEFCIGNhc2UsIGNoZWNrIGJmZF9zZWN0aW9uLAotCW5vdCByYXdkYXRhLiAgRG9uJ3Qgc2V0IHJhd2RhdGEgaWYgZV9zaHN0cm5keC4gIFVzZSBiZmRfc2VjdGlvbgotCXJhdGhlciB0aGFuIHJhd2RhdGEgaW4gY29tbWVudGVkIG91dCBjb2RlLiAgSW4gU0hUX1JFTFtBXSBjYXNlLAotCWRvbid0IGJvdGhlciB0byBjaGVjayBlbGZfc2VjdGlvbl9kYXRhIG9mIHNlY3Rpb24gcmV0dXJuZWQgYnkKLQlzZWN0aW9uX2Zyb21fZWxmX2luZGV4LgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBiZmRfc2VjdGlvbiwgbm90IHJhd2RhdGEuICBEb24ndCBzZXQKLQlzaXplLgotCShlbGZfbWFwX3N5bWJvbHMpOiBEb24ndCBzZXQgZWxmX251bV9zZWN0aW9uX3N5bXMuICBEb24ndCBjcmVhdGUKLQlzZWN0aW9uIHN5bWJvbHMgdGhhdCBhbHJlYWR5IGV4aXN0LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IFVzZSBiZmRfc2VjdGlvbiwgbm90IHJhd2RhdGEuCi0JKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBKdXN0IGNoZWNrIGJmZF9zZWN0aW9uIGZpZWxkLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9kZWJ1Z19zZWN0aW9uKTogRG9uJ3QgcHJpbnQgcmF3ZGF0YSwgY29udGVudHMsIG9yIHNpemUuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGVycm9yIG91dCBpZgotCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXggcmV0dXJucyBOVUxMLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBDaGVjayByZXR1cm4gdmFsdWUgZnJvbQotCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXggYWdhaW5zdCBOVUxMLCBub3QgYmZkX2lzX2Fic19zZWN0aW9uLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBjaGVjayBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IHJldHVybgotCXZhbHVlLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVtb3ZlIG51bV9zZWN0aW9uX3N5bXMgZmllbGQuCi0JKGVsZl9udW1fc2VjdGlvbl9zeW1zKTogRG9uJ3QgZGVmaW5lLgotCSogZWxmLmMgKGVsZl9nZXRfc3RyX3NlY3Rpb24pOiBTdG9yZSBzZWN0aW9uIGNvbnRlbnRzIGluIGNvbnRlbnRzCi0JZmllbGQgcmF0aGVyIHRoYW4gcmF3ZGF0YSBmaWVsZC4KLQkoZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBTdG9yZSBCRkQgc2VjdGlvbiBwb2ludGVyIGluCi0JYmZkX3NlY3Rpb24gZmllbGQgcmF0aGVyIHRoYW4gcmF3ZGF0YSBmaWVsZC4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogVXNlIGJmZF9zZWN0aW9uCi0JcmF0aGVyIHRoYW4gcmF3ZGF0YS4KLQkoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyk6IERvbid0IHNldAotCXN5bWV4dG5faGRyLT5zaXplOyBqdXN0IHVzZSBzaF9zaXplLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogVXNlIGJmZF9zZWN0aW9uCi0JcmF0aGVybiB0aGFuIHJhd2RhdGEuCi0JKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBSZW1vdmUgcmF3ZGF0YSBjaGVjay4KLQotCSogc3JlYy5jIChwYXNzX292ZXIpOiBTZXQgdGhlIHN0YXJ0IGFkZHJlc3MgZm9yIFM3LCBTOCBvciBTOS4KLQotRnJpIE9jdCAxNCAxOToxNTo0NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBWRVJTSU9OOiBVcGRhdGVkIHRvIDIuNS4KLQotRnJpIE9jdCAxNCAxMTowNzo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfc2Nhbl92bWEpOiBDYXN0IGVuZCB0byBiZSBub24gY29uc3QgYmVmb3JlIHBhc3NpbmcgaXQKLQl0byBzdHJ0b3VsLgotCi1UaHUgT2N0IDEzIDE0OjQwOjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9zY2FuX3ZtYSk6IFBhc3MgZW5kIGFyZ3VtZW50IG9uIHRvIHN0cnRvdWwuCi0KLVdlZCBPY3QgMTIgMTY6NDY6NDMgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogb3BuY2xzLmMgKGJmZF9yZWFsbG9jKTogRGVsZXRlZCwgc2luY2UgaXQncyBicm9rZW4gYW5kIGZpeGluZyBpdAotCXdvdWxkIG1ha2UgaXQgc2xvdy4gIEJlc2lkZXMsIGl0IGlzbid0IHVzZWQgbXVjaC4KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogQWx3YXlzIGFsbG9jYXRlIG5ldyBzdG9yYWdlIGZvciB0aGUKLQlzeW1ib2wgdGFibGUuCi0KLVdlZCBPY3QgMTIgMTE6NTQ6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBNYXJrIGxvY2FsIHN0UHJvYywgc3RMYWJlbCBvcgotCXN0YWJzIHN5bWJvbHMgYXMgQlNGX0RFQlVHR0lORy4KLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiBNYWtlCi0Jc3RyMSBhbmQgc3RyMiBjb25zdCBwb2ludGVycy4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBVc2UgdG9wIGxldmVsIGluc3RhbGwuc2ggc2NyaXB0LgotCSogY29uZmlnL1JFQURNRSAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9kZWx0YTg4Lm1oIChJTlNUQUxMKTogUmVtb3ZlLgotCSogY29uZmlnL2kzODZ2NC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9pcml4NC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9pcml4NS5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9uY3J0MzAwMC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQotVHVlIE9jdCAxMSAxMzo1Nzo1NiAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWNAYW5kYW50ZS5haWIuY29tKQotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IE1ha2Ugc3VyZSB0aGF0IGEgc3ltYm9sCi0Jd2l0aCBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgb3IgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZQotCWVudHJ5IGlzIGFkZGVkIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCBoYXMKLQlhbHJlYWR5IGdvdHRlbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LCBjaGFuZ2UgdGhlCi0JZGVmaW5pdGlvbiB0byB0aGUgUExUIGVudHJ5LgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLVR1ZSBPY3QgMTEgMTc6MTI6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBseW54LWNvcmUuYyAobHlueF9jb3JlX2ZpbGVfcCk6IFNQQVJDIEx5bnggYXBwZWFycyB0byBzdGFydAotCWR1bXBpbmcgdGhlIC5kYXRhIHNlY3Rpb24gaW4gYSBjb3JlIGZpbGUgYXQgYSBwYWdlIGJvdW5kYXJ5LgotCi1Nb24gT2N0IDEwIDE2OjI0OjQ0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogQ2FzdCBhcmd1bWVudCB0byBiZmRfaF9wdXRfMzIKLQl0byBjb3JyZWN0IHR5cGUuCi0JKGNvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBDYXN0IGFyZ3VtZW50IHRvIGJmZF9oX2dldF8zMiB0byBjb3JyZWN0Ci0JdHlwZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IENhc3QgYXJndW1lbnQgdG8KLQliZmRfZWxmX2hhc2ggdG8gY29ycmVjdCB0eXBlLgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBUaGUgUEMxMCwgUEMyMiwgYW5kCi0JV1BMVDMwIHJlbG9jYXRpb25zIGFyZSBQQy1yZWxhdGl2ZS4KLQotVGh1IE9jdCAgNiAxMjo1NzoyNiAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYyk6IENvcnJlY3RseSBpbml0aWFsaXplIHZtYSBpZiB0aGUgdm1hIG9mCi0JdGhlIHRleHQgc2VjdGlvbiB3YXMgdXNlci1kZWZpbmVkLgotCi1XZWQgT2N0ICA1IDE0OjQyOjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBTVlI0IHVzZXMgc2xhc2gKLQluZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgbmFtZSwgbm90IGp1c3QgbmV3bGluZS4KLQotVHVlIE9jdCAgNCAxMToyMzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IERlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQKLQlwb3dlciB0byA0LCByYXRoZXIgdGhhbiB1c2luZyBhbGlnbl9wb3dlcl9taW4uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IERvbid0IHVzZSBhbGlnbl9wb3dlcl9taW47Ci0JdXNlIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiBpbnN0ZWFkLiAgRm9yY2UgdGhlIC5zdGFiCi0JYW5kIC5zdGFic3RyIHNlY3Rpb25zIHRvIGJlIGFsaWduZWQgdG8gbm8gbW9yZSB0aGFuIDIuICBSZW1vdmUKLQlDT0ZGX1NQQVJDIHNwZWNpYWwgY2FzZXMuCi0JKiBjb2ZmLWEyOWsuYzogRGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUi4KLQkqIGNvZmYtYXBvbGxvLmMsIGNvZmYtZ28zMi5jLCBjb2ZmLWg4MzAwLmM6IExpa2V3aXNlLgotCSogY29mZi1oODUwMC5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jOiBMaWtld2lzZS4KLQkqIGNvZmYtbTg4ay5jLCBjb2ZmLXJzNjAwMC5jLCBjb2ZmLXNoLmMsIGNvZmYtc3BhcmMuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLXdlMzJrLmMsIGNvZmYtejhrLmM6IExpa2V3aXNlLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAke2NvbmZpZ19zaGVsbH0gd2hlbiBydW5uaW5nIGNvbmZpZy5iZmQuCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCB0cnkgdG8gY29udmVydCBhIGxvbmcKLQlmaWxlbmFtZSBpZiB0aGUgb2Zmc2V0IGZpZWxkIGlzIHplcm8uCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IElmIHRoZSBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sCi0Jd2FzIG5vdCBzZXQsIHVzZSBhIHNlbnNpYmxlIGRlZmF1bHQgcmF0aGVyIHRoYW4gemVyby4KLQotTW9uIE9jdCAgMyAxNjowNDoyOSAxOTk0ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCi0KLQkqIG9wbmNscy5jIChiZmRfY2xvc2UpOiBIb25vciB1bWFzayB3aGVuIHNldHRpbmcgZXhlY3V0aW9uIGJpdHMuCi0JKGJmZF9jbG9zZV9hbGxfZG9uZSk6IExpa2V3aXNlLgotCi1Nb24gT2N0ICAzIDA0OjQxOjQ5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiAgU2V0IFNFQ19IQVNfQ09OVEVOVFMgZmxhZwotCWZvciAuc3RhY2sgYW5kIC5sZGluZm8gc2VjdGlvbnMuIENhc3QgY29yZWRhdGEuY190YWIgdG8gYQotCWZpbGVfcHRyIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gZ2NjLgotCi1GcmkgU2VwIDMwIDEzOjExOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBSZW1vdmUgYXNzZXJ0aW9uIHdoZW4gYSBub24KLSAgICAgICAgU0VDX0lOX01FTU9SWSBzZWN0aW9uIGlzIGZvdW5kIGluIGR5bm9iai4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuCi0JbGlua2luZyBQSUMgY29tcGlsZWQgY29kZS4KLQotVGh1IFNlcCAyOSAxNToyMTo0NCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogQ2hhbmdlIHR5cGUgb2YgImRhdGEiIHRvCi0JYmZkX2J5dGUgKiwgdG8gZ28gYWxvbmcgd2l0aCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IE1vdmVkIGhlcmUgZnJvbSBlbGZfcHJpbnRfc3ltYm9sCi0JaW4gZWxmY29kZS5oLiAgKGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGwpOiBQcmludCBzeW1ib2wncyBzaXplCi0JZmllbGQsIGV4Y2VwdCBmb3IgY29tbW9uIHN5bWJvbHM7IHByaW50IHRoZWlyIGFsaWdubWVudC4KLQkqIGVsZmNvZGUuaCAoZWxmX3ByaW50X3N5bWJvbCk6IERlbGV0ZWQuCi0JKiBsaWJlbGYuaCAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBEZWNsYXJlLgotCShiZmRfZWxmezMyLDY0fV9wcmludF9zeW1ib2wpOiBSZXBsYWNlIGRlY2xhcmF0aW9ucyB3aXRoIG1hY3Jvcy4KLQotCSogc3ltcy5jIChiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogU2hvdyBCU0ZfTE9DQUwgYW5kIEJTRl9HTE9CQUwKLQlpbiBvbmUgY29sdW1uLiAgVXNlIHRoZSBjb2x1bW4gZnJlZWQgdXAgdG8gc2hvdyBCU0ZfRlVOQ1RJT04gYW5kCi0JQlNGX0ZJTEUuCi0KLVRodSBTZXAgMjkgMTI6Mjk6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzeW1zLmMgKHN0dCk6IEFkZCAucmRhdGEgYW5kIC5yb2RhdGEuCi0KLVdlZCBTZXAgMjggMTM6MzU6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogQ2FzdCBkYXRhX3N0YXJ0IHRvIGJmZF9ieXRlICoKLQliZWZvcmUgdHJ5aW5nIHRvIGFkZCB2YWx1ZXMgdG8gaXQuCi0KLVR1ZSBTZXAgMjcgMTY6NDc6NTggMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IENhc3QKLQlyZXR1cm4gdmFsdWUgZnJvbSBlbGZfc3ltX2V4dHJhLgotCShlbGYzMl9ocHBhX2J1aWxkX3N0dWJzKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbSBiZmRfemFsbG9jLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBDYXN0IHJldHVybiB2YWx1ZSBmcm9tIG1hbGxvYy4KLQotCSogZ2VuLWFvdXQuYyAobWFpbik6IERlY2xhcmUgYW5kIGluaXRpYWxpemUgImFyY2giLgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBDYXN0IHJldHVybiB2YWx1ZSBvZgotCWJmZF9oYXNoX2FsbG9jYXRlLgotCi0JKiByaXNjaXguYyAocmlzY2l4X2NhbGxiYWNrKTogVXNlIFBBUkFNUyBtYWNybyBpbiBwcm90b3R5cGUuCi0KLQkqIHJlbG9jLmMgKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24sIG1vc3RseSBjb3BpZWQKLQlmcm9tIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGFkanVzdGVkIGZvciB0aGUgYXNzZW1ibGVyJ3MgbmVlZHMuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1Nb24gU2VwIDI2IDExOjAwOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEFsaWduIHRoZQotCXNlY3Rpb24gVk1BIGFuZCB0aGUgZmlsZSBwb3NpdGlvbiBldmVuIGlmIERfUEFHRUQgaXMgbm90IHNldC4KLQotCSogYmZkLWluLmggKGJmZF9zZWVrKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvIG5vdCBtYXJrIGZwIGNvbnN0LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmMgKGJmZF9zZWVrKTogRG9uJ3QgbWFyayBwYXJhbWV0ZXJzIGNvbnN0LCB0byBhdm9pZAotCWNvbmZsaWN0cyB3aXRoIGRlY2xhcmF0aW9uLgotCi1GcmkgU2VwIDIzIDE1OjE1OjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IERvbid0IGFib3J0IGlmIHdlIGFsbG9jYXRlZAotCXRvbyBtdWNoIHNwYWNlIGZvciB0aGUgcHJvZ3JhbSBoZWFkZXIsIG9ubHkgaWYgd2UgYWxsb2NhdGVkIHRvbwotCWxpdHRsZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBTaW1pbGFyIGNoYW5nZS4KLQotVHVlIFNlcCAyMCAxMzoxNzowNyAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaDogRml4IGNvbW1lbnQuCi0JKiBuczMya25ic2QuaDogQ2hhbmdlZCBNX05TMzJLX05FVEJTRCB0byBNXzUzMl9ORVRCU0QgdG8gbWF0Y2gKLQkgIGxpYmFvdXQuaC4KLQotVHVlIFNlcCAyMCAxNToyMzoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgc3BhcmNuZXRic2Quby4KLQkoQ0ZJTEVTKTogQWRkIG5zMzJrbmV0YnNkLmMgYW5kIHNwYXJjbmV0YnNkLmMuCi0JKiB0YXJnZXRzLmM6IG5zMzJrbmV0YnNkX3ZlYyB3YXMgcmVuYW1lZCB0byBwYzUzMm5ldGJzZF92ZWMuCi0KLQkqIGNvZmYtc2guYyAocnR5cGUyaG93dG8pOiBSZW1vdmU7IHVudXNlZC4KLQkoY29mZl9zaF9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSByc3RhdC4KLQkocmVsb2NfcHJvY2Vzc2luZyk6IENvbW1lbnQgb3V0OyB1bnVzZWQuCi0KLUZyaSBTZXAgMTYgMTI6MTI6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogSWYgaC0+aW5keCBpcyAtMiwgdGhlbgotCWFsd2F5cyB3cml0ZSBpdCBvdXQgZXZlbiBpZiBpdCB3b3VsZCBub3JtYWxseSBiZSBzdHJpcHBlZC4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogSWYgd2UgZmluZCBhIHJlbG9jIGFnYWluc3QgYQotCXN0cmlwcGVkIGdsb2JhbCBzeW1ib2wsIGZvcmNlIGl0IHRvIGJlIHdyaXR0ZW4gb3V0IHJhdGhlciB0aGFuCi0JbWVyZWx5IGNhbGxpbmcgdW5hdHRhY2hlZF9yZWxvYy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLVdlZCBTZXAgMTQgMTU6Mzc6MTkgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tZGF0YSk6IE5ldyBmaWVsZCBzb3J0ZWRfc3ltcy4KLQkob2JqX3NvbV9zb3J0ZWRfc3ltcyk6IEFjY2Vzc29yIG1hY3JvLgotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBJbml0aWFsaXplIHNvcnRlZF9zeW1zIHRvIE5VTEwuCi0JKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBTb3J0IGEgY29weSBvZiB0aGUgQkZEJ3Mgc3ltYm9sIHRhYmxlOwotCXN0b3JlIHRoZSBzb3J0ZWQgc3ltYm9sIHRhYmxlIGluIHNvcnRlZF9zeW1zLgotCShzb21fd3JpdGVfZml4dXBzKTogSW5pdGFsaXplIHRtcF9yZWxvYyB0byBOVUxMIHRvIG1ha2UgR0NDIGhhcHB5LgotCShzb21fYmVnaW5fd3JpdGluZyk6IFNpbWlsYXJseSBmb3IgZXhlY19oZWFkZXIuICBQYXNzIHRoZSBzb3J0ZWQKLQlzeW1ib2wgdGFibGUgdG8gc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IFVzZSB0aGUgc29ydGVkIHN5bWJvbHMgcmF0aGVyCi0JdGhhbiB0aGUgY2Fub25pY2FsIHN5bWJvbCB0YWJsZS4KLQotCSogc29tLmggKHNvbV9zeW1ib2xfdHlwZSk6IEFkZCAic3RyaW5ndGFiX29mZnNldCIgZmllbGQuCi0JKiBzb20uYyAoc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzKTogVXNlICJzdHJpbmd0YWJfb2Zmc2V0IgotCXJhdGhlciB0aGFuIGRlc3Ryb3lpbmcgdGhlICJuYW1lIiBmaWVsZCBpbiB0aGUgQkZEIHN5bWJvbC4KLQkoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUpOiBMaWtld2lzZS4KLQotV2VkIFNlcCAxNCAxNTowNjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogUmVuYW1lIHNraXBfaW5kaXJlY3QgdG8KLQlza2lwX25leHQuICBJZiB3ZSBmaW5kIGFuIE5fV0FSTklORyBzeW1ib2wgd2hpY2ggaGFzIGFscmVhZHkgYmVlbgotCXdyaXR0ZW4gb3V0LCBzZXQgc2tpcF9uZXh0LgotCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfdGRhdGEpOiBBZGQgZmllbGQgZmluZF9idWZmZXIuCi0JKiBlY29mZi5jOiBJbmNsdWRlIGFvdXQvc3RhYl9nbnUuaC4KLQkoZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBIYW5kbGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBLZWVwIGEgc3ltYm9sIG1hcmtlZCBhcyB3ZWFrCi0JZXZlbiBpZiBpdCBpcyByZWZlcmVuY2VkIGJ5IGFub3RoZXIgb2JqZWN0LgotCi1UdWUgU2VwIDEzIDE3OjU3OjAwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2ZpeHVwX2Zvcm1hdHMpOiBDYXNlIFJfRU5UUlkgKDB4YjMpLCBzZXQgYm90aAotCSdUJyBhbmQgJ1UnIHRvIGdyYWIgYWxsIHRoZSB1bndpbmQgaW5mb3JtYXRpb24uCi0JKHNvbV9zZXRfcmVsb2NfaW5mbyk6IE1ha2UgJ1UnIHVud2luZCBiaXRzIHBlcnNpc3QgYWNyb3NzCi0JbXVsdGlwbGUgU09NIHJlbG9jYXRpb25zLiAgU2V0IHRoZSBhZGRlbmQgZmllbGQgb2YgYW4gUl9FTlRSWQotCXJlbG9jYXRpb24gdG8gdGhlIHZhbHVlIGluICdUJzsgc2V0IHRoZSBhZGRlbmQgZmllbGQgb24gYW4KLQlSX0VYSVQgcmVsb2NhdGlvbiB0byB0aGUgdmFsdWUgaW4gJ1UnLgotCi0JKiBzb20uaCAoc29tX3N5bWJvbF90eXBlKTogRGVsZXRlIHVud2luZCBmaWVsZC4KLQotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBGb3IgUl9FTlRSWSBmaXh1cHMsIGdldCAzMmJpdHMgb2YKLQl1bndpbmQgaW5mb3JtYXRpb24gZnJvbSB0aGUgYWRkZW5kIGZpZWxkIG9mIHRoZSBSX0VOVFJZLCBnZXQgdGhlCi0Jb3RoZXIgMzJiaXRzIGZyb20gdGhlIGFkZGVuZCBmaWVsZCBvZiB0aGUgUl9FWElULgotCShiZmRfc29tX2F0dGFjaF91bndpbmRfaW5mbyk6IERlbGV0ZSBmdW5jdGlvbiBhbmQgYWxsIHJlZmVyZW5jZXMuCi0KLQkqIHNvbS5oIChzb21fc3ltYm9sX3R5cGUpOiBEZWxldGUgdW51c2VkIGEub3V0LXJlbGF0ZWQgZmllbGRzLgotCi0JKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogVXNlIGJmZF9hYnNfc2VjdGlvbl9wdHIKLQlpbnN0ZWFkIG9mICZiZmRfYWJzX3NlY3Rpb24uCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogSGFuZGxlIGV4ZWNfZW50cnkgYW5kIGV4ZWNfZmxhZ3MgYmVpbmcKLQlzd2l0Y2hlZCBpbiBleGVjdXRhYmxlcyBjcmVhdGVkIGJ5IHRoZSBPU0YxIGxpbmtlci4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0VYSVQganVzdCBsaWtlIHRoZSBSX3tGLEwsUn1TRUwKLQlmaXh1cHMuICBTdXBwb3J0IFJfQUxUX0VOVFJZIChoYW5kbGUganVzdCBsaWtlIFJfRVhJVCkuCi0KLVR1ZSBTZXAgMTMgMTY6MDQ6MDcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IHN5bWVudF9iYXNlIGlzIHVuc2lnbmVkCi0Jc28gY2FuJ3QgY29tcGFyZSAtdmUgbnVtYmVycyB3aXRoIGl0LgotCi1Nb24gU2VwIDEyIDIwOjMxOjE3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoc2hjb2ZmX3ZlYyk6IFVzZSBjb2ZmbGluay5vIG5vdy4KLQkqIGNvZmYtc2guYzogUmV3cml0dGVuIHRvIHVzZSBuZXcgZmFzdCBjb2ZmIGJhY2tlbmQuCi0KLVR1ZSBTZXAgMTMgMTY6MjM6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBEb24ndCBhc3N1bWUgdGhhdCBhbGwgdGhlIGlucHV0Ci0gICAgICAgIGZpbGVzIGFyZSBhLm91dC4KLQotVHVlIFNlcCAxMyAxMTowOTozOSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLW5ldGJzZCk6IHVzZSBzcGFyY25ic2QuCi0JICAobnMzMmstKi1uZXRic2QpOiB1c2UgbnMzMmtuYnNkLgotCi0JKiBob3N0cy97bmJzZCxpMzg2bmJzZCxuczMya25ic2Qsc3BhcmNuYnNkfS5oOiBOZXcgZmlsZXMsIE5ldEJTRAotCSAgaG9zdCBzdXBwb3J0LgotCi0JKiBzcGFyY25ldGJzZC5jOiBOZXcgZmlsZSwgYWRkcyBzdXBwb3J0IGZvciBOZXRCU0Qvc3BhcmMuCi0JKiBjb25maWcvc3BhcmMtbmJzZC5tdDogTGlrZXdpc2UuCi0KLQkqIG5ldGJzZC5oOiBOZXcgZmlsZSwgZGVmaW5pdGlvbnMgY29tbW9uIHRvIGFsbCBuZXRic2QgcG9ydHMuCi0JKiBpMzg2bmV0YnNkLmM6IFVzZSBpdC4KLSAgICAgICAgKiBuczMya25ldGJzZC5jOiBVc2UgaXQuCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIHRhcmdldHMuYywgY29uZmlnL2kzODYtbmJzZC5tdCwKLQkgIGNvbmZpZy9uczMyay1uYnNkLm10OiBjYW5vbmljYWxpemUgbmV0YnNkIHRhcmdldHMgdG8gY29uZm9ybSB0bwotCSAgZmlsZS92YXJpYWJsZSBuYW1pbmcgY29udmVudGlvbnMuCi0JKiBpMzg2bmV0YnNkLmM6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gbmV0YnNkMzg2LmMuCi0JKiBuczMya25ldGJzZC5jOiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIG5ldGJzZDUzMi5jLgotCQotTW9uIFNlcCAxMiAyMTo1NjoyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9yZWxvY19za2lwKTogQ29ycmVjdCBvZmYtYnktb25lIGVycm9yIGZvciA0LWJ5dGUKLQlSX05PX1JFTE9DQVRJT04gZml4dXBzLgotCShiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBSZXR1cm4gdGhlIGFic29sdXRlIHNlY3Rpb24gaWYgdGhlCi0Jc3ltYm9sIGlzbid0IGNvbnRhaW5lZCBpbiBhbnkgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTVF9QUklfUFJPRyBhbmQgU1RfU0VDX1BST0cgc3ltYm9scyBhcmUKLQlub3QgZnVuY3Rpb24gc3ltYm9scyAodGhleSBhcmUgbWFnaWMgY29kZSBsYWJlbHMgd2hpY2ggKmNhbiogYmUgdGhlCi0JdGFyZ2V0cyBvZiBjcm9zcyBzcGFjZSBicmFuY2hlcykuICAkU1RBUlQkIGlzIG5vdCBhIHNlY3Rpb24gc3ltYm9sLgotCi1Nb24gU2VwIDEyIDExOjQzOjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jIChlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBBZGQgU0VDX0NPREUgYW5kIFNFQ19EQVRBCi0JdG8gc2VjdGlvbl9mbGFncy4KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9saXR0bGVfdmVjLCBlY29mZl9iaWdfdmVjKTogTGlrZXdpc2UuCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IFNldCB0aGUgdHlwZSBvZiBhbiB1bmRlZmluZWQgc3ltYm9sCi0JdG8gU1RUX0ZVTkMgaWYgdGhlIEJTRl9GVU5DVElPTiBmbGFnIGlzIHNldC4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IElmIHJfc3ltbmR4IGlzIC0xLCBkb24ndAotCWNoYW5nZSBpdC4KLQkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IElmIHJfc3ltbmR4IGlzIC0xLCBpdCBpcyBhbgotCWFic29sdXRlIHJlbG9jLiAgRG9uJ3QgZHVtcCBjb3JlIHVzaW5nIHJfc3ltbmR4IGFzIGFuIGFycmF5IGluZGV4LgotCSogY2YtbTY4a2x5bnguYyAoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlZmluZS4KLQkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiAoY29weSBvZiBmdW5jdGlvbiBpbgotCWNvZmYtaTM4Ni5jKS4KLQkoY29mZl9tNjhrX2x5bnhydHlwZV90b19ob3d0byk6IHN5bSBhcmd1bWVudCBtYXkgYmUgTlVMTC4KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8pOiBMaWtld2lzZS4KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBhbiByX3N5bW5keAotCXZhbHVlIG9mIC0xLCBtZWFuaW5nIGFuIGFic29sdXRlIHJlbG9jLgotCi0JKiBjdG9yLmM6IFJlbW92ZTsgb2Jzb2xldGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9MSUJTKTogUmVtb3ZlIGN0b3Iuby4KLQkoQ0ZJTEVTKTogUmVtb3ZlIGN0b3IuYy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1Nb24gU2VwIDEyIDAxOjU4OjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IElmIHRoZXJlIHdhcyBhIGxpbmsKLQllcnJvciBvZiBzb21lIHNvcnQgKGZvciBleGFtcGxlLCB1bmRlZmluZWQgc3ltYm9scyksIHRoZW4gZG8gbm90Ci0JYXBwbHkgYW55IHJlbG9jcywganVzdCBub3RpZnkgdGhlIHVzZXIgb2YgdGhlIGVycm9ycy4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBEbyBub3QgYnVpbGQgYSBzeW1ib2wKLQlleHRlbnNpb24gc2VjdGlvbiBmb3IgYW4gZXhlY3V0YWJsZSAoaXQncyB1c2VsZXNzKS4KLQkoZWxmMzJfaHBwYV9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IERvIG5vdGhpbmcgaWYgdGhlcmUgd2FzIGEKLQlsaW5rIGVycm9yIG9mIHNvbWUgc29ydCAoZm9yIGV4YW1wbGUsIHVuZGVmaW5lZCBzeW1ib2xzKS4KLQkoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogS2x1ZGdlLiAgVHVybiBvZmYgU0VDX0hBU19DT05URU5UUwotCWZvciBhbGwgdGhlIGlucHV0IHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbnMgdG8ga2VlcCB0aGUgZ2VuZXJpYwotCUJGRCBjb2RlIGhhcHB5LiAgVGVtcG9yYXJpbHkgdHVybiBpdCBvbiB0byByZWFkIHRoZSBjb250ZW50cyBvZgotCXRoZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24uCi0KLVN1biBTZXAgMTEgMjE6NTg6NTkgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy9ocHBhb3NmLm1oIChSQU5MSUIpOiBEbyBub3Qgc2V0LgotCSogY29uZmlnL2hwcGFic2QubWggKFJBTkxJQik6IExpa2V3aXNlLgotCi1TdW4gU2VwIDExIDIyOjUwOjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY2YtaTM4Nmx5bnguYzogUmVtb3ZlICNpZiAwIGNvZGUuCi0JKGkzODZfbHlueG9zX2NvZmZfb2JqZWN0X3ApOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVmaW5lLgotCShseW54X2xpbmtfYWRkX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IElmCi0JY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGlzIGRlZmluZWQsIG9ubHkgZGVmaW5lIHRoaXMgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCShjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzLCBjb2ZmX2JmZF9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEhhbmRsZQotCWJmZF9pbmRpcmVjdF9saW5rX29yZGVyIGV4cGxpY2l0bHksIHJhdGhlciB0aGFuIHZpYQotCV9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgotCShzZXRfc3ltYm9sX2Zyb21faGFzaCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sLgotCShfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogU3ltYm9sIHNldHRpbmcgY29kZSBtb3ZlZAotCXRvIHNldF9zeW1ib2xfZnJvbV9oYXNoOyBjYWxsIGl0LgotCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBBZGQgZ2VuZXJpY19saW5rZXIgYXJndW1lbnQuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLiAgSWYgZmFsc2UsIHNldCB0aGUgZ2VuZXJpYyBzeW1ib2xzIGJhc2VkIG9uCi0JdGhlIGhhc2ggdGFibGUgZW50cmllcy4KLQotRnJpIFNlcCAgOSAxMTo1MTo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfc3ltdGFiKTogUmVpbmRlbnRlZC4gIFJlbW92ZWQgY29tbWVudGVkIG91dAotCWNhbGwgdG8gYmZkX2NvbnN0cnVjdG9yX2VudHJ5LgotCi0JQ29udmVydCBtNjhrIENPRkYgdG8gdXNlIG5ldyBDT0ZGIGJhY2tlbmQgbGlua2VyLgotCSogY29mZi1tNjhrLmMgKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkqIGNmLW02OGtseW54LmMgKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUuCi0JKGNvZmZfbTY4a19seW54X3J0eXBlX3RvX2hvd3RvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4a2NvZmZfdmVjKTogQnVpbGQgY29mZmxpbmsuby4KLQkobTY4a2NvZmZ1bl92ZWMsIG02OGtseW54X2NvZmZfdmVjKTogTGlrZXdpc2UuCi0KLVRodSBTZXAgIDggMTY6MjA6MzggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzLCBjYXNlIFJFTEJZVEUpOiBGbGFnCi0Jb3ZlcmZsb3dzIGNvcnJlY3RseS4KLQotV2VkIFNlcCAgNyAxOTowMTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IENoYW5nZSBzZWNvbmQgYXJndW1lbnQgb2YKLQllbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIGhvb2sgdG8gYm9vbGVhbi4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgbGlua2VyIGZpZWxkLgotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFBhc3MgdmFsdWUgb2YKLQl0ZGF0YSBsaW5rZXIgZmllbGQgdG8gZmluYWxfd3JpdGVfcHJvY2Vzc2luZywgcmF0aGVyIHRoYW4gTlVMTC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3QgY2FsbCBmaW5hbF93cml0ZV9wcm9jZXNzaW5nIGhvb2suICBTZXQKLQl0ZGF0YSBsaW5rZXIgZmllbGQgdG8gdHJ1ZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IENoYW5nZSB0eXBlIG9mCi0Jc2Vjb25kIGFyZ3VtZW50IHRvIGJvb2xlYW4uCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKToKLQlMaWtld2lzZS4KLQotCSogY29mZi1nbzMyLmMgKFJUWVBFMkhPV1RPKTogRnVsbHkgcGFyZW50aGVzaXplIGFyZ3VtZW50cy4KLQkqIGNvZmYtaTk2MC5jIChSVFlQRTJIT1dUTyk6IExpa2V3aXNlLgotCSogY29mZi1tODhrLmMgKFJUWVBFMkhPV1RPKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXdlMzJrLmMgKFJUWVBFMkhPV1RPKTogTGlrZXdpc2UuCi0KLQlNYWtlIGkzODYgQ09GRiB1c2UgbmV3IENPRkYgYmFja2VuZCBsaW5rZXIuCi0JKiBjb2ZmLWkzODYuYyAoUlRZUEUySE9XVE8pOiBGdWxseSBwYXJlbnRoZXNpemUgYXJndW1lbnRzLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4NmNvZmZfdmVjKTogVXNlIGNvZmZsaW5rLm8uCi0JKGkzODZseW54X2NvZmZfdmVjKTogTGlrZXdpc2UuCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKLQlfYmZkX2NvZmZfcnR5cGVfdG9faG93dG8uCi0JKGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lLgotCShjb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lIHRvIHVzZSBSVFlQRTJIT1dUTywgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBBbGxvY2F0ZSBzZWN0aW9uX2NvdW50ICsgMQotCXNlY3Rpb25faW5mbyBzdHJ1Y3R1cmVzLCBzaW5jZSB0aGUgdGFyZ2V0X2luZGV4IGlzIDEgYmFzZWQuCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBTZXQgKnNlY3BwIHRvIGJmZF9jb21fc2VjdGlvbl9wdHIgZm9yIGEKLQljb21tb24gc3ltYm9sLiAgQWRqdXN0IHJlbF9oYXNoIGJ5IHRoZSBvdXRwdXQgcmVsb2MgY291bnQuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJjb2ZmLWluLmggKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi1UdWUgU2VwICA2IDIzOjI4OjUyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFRyZWF0IHVuZGVmaW5lZCBjb2RlCi0Jc3ltYm9scyBhbmQgdW5kZWZpbmVkIHN5bWJvbHMgd2hpY2ggbm8gdHlwZSBpbiB0aGUgc2FtZSBtYW5uZXIKLQlpZiB0aGUgYXNzb2NpYXRlZCBCRkQgc3ltYm9sIGhhcyBCU0ZfRlVOQ1RJT04gc2V0LiAgRm9yIGEgZGVmaW5lZAotCXN5bWJvbCB3aGljaCBubyB0eXBlLCBzZWxlY3QgYSBTT00gdHlwZSBiYXNlZCBvbiB0aGUgZmxhZ3Mgb2YgdGhlCi0Jc2VjdGlvbiBjb250YWluaW5nIHRoZSBzeW1ib2wuCi0JKHNvbV9zbHVycF9zeW1ib2xfdHlwZSk6IFNldCBCU0ZfRlVOQ1RJT04gZm9yIHVuZGVmaW5lZCBTVF9TVFVCCi0Jb3IgU1RfQ09ERSBzeW1ib2xzIChpbXBvcnRpbmcgYSBub24tZnVuY3Rpb24gY29kZSBzeW1ib2wgaXMKLQltZWFuaW5nbGVzcyBpbiBTT00pLgotCShzb21fc2V0X3JlbG9jX2luZm8pOiBEb24ndCBzZXQgIm9mZnNldCIgdG8gdGhlIHNlY3Rpb24ncyB2bWE7IGl0Ci0Jc2hvdWxkIGFsd2F5cyBzdGFydCBhdCB6ZXJvLgotCi1UdWUgU2VwICA2IDE0OjUxOjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCUFkZCBuZXcgc3R5bGUgbGlua2VyIHN1cHBvcnQgdG8gQ09GRiBiYWNrZW5kLiAgYTI5ayBvbmx5IGZvciBub3cuCi0JKiBjb2ZmbGluay5jOiBOZXcgZmlsZS4KLQkqIGxpYmNvZmYtaW4uaDogSW5jbHVkZSBiZmRsaW5rLmguCi0JKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMsIG9ial9jb2ZmX3N0cmluZ3MpOiBEZWZpbmUgYWNjZXNzb3IgbWFjcm8uCi0JKG9ial9jb2ZmX3N5bV9oYXNoZXMpOiBEZWZpbmUgYWNjZXNzb3IgbWFjcm8uCi0JKHN0cnVjdCBjb2ZmX3RkYXRhKTogQWRkIGZpZWxkcyBleHRlcm5hbF9zeW1zLCBzdHJpbmdzLCBhbmQKLQlzeW1faGFzaGVzLgotCShzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoY29mZl9saW5rX2hhc2hfbG9va3VwLCBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSk6IERlZmluZS4KLQkoY29mZl9oYXNoX3RhYmxlKTogRGVmaW5lLgotCShfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlY2xhcmUuCi0JKF9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzLCBfYmZkX2NvZmZfZmluYWxfbGluayk6IERlY2xhcmUuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIF9iZmRfcmVsc3osCi0JX2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4sIF9iZmRfY29mZl9zeW1faXNfZ2xvYmFsLAotCV9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0JX2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24uCi0JKGJmZF9jb2ZmX3JlbHN6LCBiZmRfY29mZl9zd2FwX3JlbG9jX2luKTogRGVmaW5lLgotCShiZmRfY29mZl9zeW1faXNfZ2xvYmFsKTogRGVmaW5lLgotCShiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGNvZmZfbWtvYmplY3RfaG9vayk6IEluaXRpYWxpemUgb2JqX3Jhd19zeW1lbnRfY291bnQgYW5kCi0Jb2JqX2NvbnZfdGFibGVfc2l6ZS4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBTZXQgdGFyZ2V0X2luZGV4IG9mIGFsbAotCXNlY3Rpb25zLiAgU2V0IG91dHB1dF9oYXNfYmVndW4gZmllbGQuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgc2V0IHRhcmdldF9pbmRleDsgbm93IGRvbmUgYnkKLQljb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gIFJlbW92ZSBvYnNvbGV0ZSBoYW5kbGluZyBvZgotCXNjbl9iYXNlIGFuZCBkYXRhX2Jhc2UuICBEb24ndCBib3RoZXIgdG8gY2hlY2sgdGhhdCB0YXJnZXRfaW5kZXgKLQlpcyBwb3NpdGl2ZSwgc2luY2UgaXQgYWx3YXlzIGlzLiAgUmVtb3ZlIHVzZSBvZiBwYWQsIHdoaWNoIGlzCi0JYWx3YXlzIHplcm8uICBDaGVjayBvYmpfcmF3X3N5bWVudF9jb3VudCwgbm90IGJmZF9nZXRfc3ltY291bnQsCi0JZm9yIHRoZSBudW1iZXIgb2Ygc3ltYm9scywgYnV0IG9ubHkgd3JpdGUgdGhlbSBvdXQgaWYKLQliZmRfZ2V0X3N5bWNvdW50IGlzIG5vbi16ZXJvLiAgRG9uJ3QgY2hlY2sgb2JqX3Jhd19zeW1lbnRfY291bnQKLQl1bnRpbCBhZnRlciBjb2ZmX3dyaXRlX3N5bWJvbHMgaXMgY2FsbGVkLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBvYmpfcmF3X3N5bWVudF9jb3VudCwgbm90Ci0JYmZkX2dldF9zeW1jb3VudCBmb3IgdGhlIG51bWJlciBvZiBzeW1ib2xzLiAgRG9uJ3Qgc2V0Ci0Jb2JqX2NvbnZfdGFibGVfc2l6ZS4KLQkoY29mZl9zeW1faXNfZ2xvYmFsKTogTmV3IHN0YXRpYyBmdW5jdGlvbiBvciBtYWNyby4KLQkoY29mZl9zbHVycF9yZWxvY190YWJsZSk6IENhbGwgY29mZl9zd2FwX3JlbG9jX2luLCBub3QKLQliZmRfc3dhcF9yZWxvY19pbi4KLQkoY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IElmIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBpcwotCWRlZmluZWQsIGRlZmluZSBhcyBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZS4KLQkoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IFNpbWlsYXIgY2hhbmdlLgotCShjb2ZmX2JmZF9maW5hbF9saW5rKTogU2ltaWxhciBjaGFuZ2UuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZSBhcyBOVUxMIGlmIG5vdCBkZWZpbmVkLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogRG9uJ3Qgc2V0IG9ial9yYXdfc3ltZW50X2NvdW50Ci0JYW5kIG9ial9jb252X3RhYmxlX3NpemUgaGVyZS4KLQkoY29mZl9jb3VudF9saW5lbnVtYmVycyk6IFJlaW5kZW50LiAgSWYgYmZkX2dldF9zeW1jb3VudCBpcyB6ZXJvLAotCWFkZCB1cCB0aGUgbGluZSBudW1iZXJzIGZyb20gdGhlIHNlY3Rpb25zLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBTZXQgb2JqX3Jhd19zeW1lbnRfY291bnQsIG5vdAotCWJmZF9nZXRfc3ltY291bnQuCi0JKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBEb24ndCBwb2ludGVyaXplIGEgbm9ucG9zaXRpdmUgeF9lbmRuZHgKLQlmaWVsZC4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBVc2Ugb2JqX3Jhd19zeW1lbnRfY291bnQsIG5vdAotCWJmZF9nZXRfc3ltY291bnQuCi0JKGNvZmZfcHJpbnRfc3ltYm9sKTogSWYgYXV4cC0+Zml4X2VuZCwgcHJpbnQgeF9lbmRuZHggdmFsdWUuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfcmVsb2NfaW4pOiBSZW5hbWUgZnJvbSBiZmRfc3dhcF9yZWxvY19pbi4KLQlSZWluZGVudC4gIENoYW5nZSBhcmd1bWVudCB0eXBlIHRvICBQVFIuCi0JKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW4gKGEyOWtjb2ZmX2JpZ192ZWMpOiBDb21waWxlIGNvZmZsaW5rLm8uCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmbGluay5vLgotCShDRklMRVMpOiBBZGQgY29mZmxpbmsuYy4KLQotVHVlIFNlcCAgNiAxNDowMDo0NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sLCBjYXNlIGJmZF9zeW1ib2xfcHJpbnRfYWxsKTogQ2hlY2sKLQlmb3Igc2VjdGlvbiBzeW1ib2wsIGFuZCBwcmludCBpdHMgYXV4IGZpZWxkcyB3aXRoIGFwcHJvcHJpYXRlCi0JbGFiZWxzLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkZWQgY3B1LWFybS5vLgotCi1TdW4gU2VwIDA0IDE3OjU4OjEwIDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogUmVjb2duaXplIHRoZSBBUk0gcHJvY2Vzc29yLgotCSogYXJjaHVyZXMuYywgY29uZmlnLmJmZCwgY29uZmlndXJlLmhvc3QsIGxpYmFvdXQuaCwgcmVsb2MuYywKLQl0YXJnZXRzLmM6IEFkZCBzdXBwb3J0IGZvciB0aGUgQVJNLgotCSogY3B1LWFybS5jLCByaXNjaXguYywgY29uZmlnL3Jpc2NpeC5taCwgY29uZmlnL3Jpc2NpeC5tdDogTmV3IGZpbGVzLgotCi0JKiBhb3V0eC5oIChhZGRfdG9fc3RyaW5ndGFibGUpOiBDaGVjayB0aGF0IHN0ciBpc24ndCBhIE5VTEwgcG9pbnRlci4KLQotRnJpIFNlcCAgMiAxNDoxMDozMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBSZXdyb3RlIGRlZmluaXRpb24gdG8gdXNlCi0JbmV3ICJjaGV3IiBjb21tYW5kcyBmb3Igc2ltdWx0YW5lb3VzIGRlZmluaXRpb24gb2YgZW51bWVyYXRvciBhbmQKLQllbnVtZXJhdG9yIG5hbWUgdGFibGUuCi0JKGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lKTogTmV3IGZ1bmN0aW9uLCBmb3IgcmV0cmlldmluZyBhIHN5bWJvbGljCi0JbmFtZSBhc3NvY2lhdGVkIHdpdGggYW4gZW51bWVyYXRvci4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1UdWUgQXVnIDMwIDIxOjI0OjU0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcywgY2FzZSBSX0VOVFJZKTogSGFuZGxlIGNhc2Ugd2hlcmUgbm8KLQl1bndpbmQgZGVzY3JpcHRvciBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCi0KLVR1ZSBBdWcgMzAgMTE6NDM6MzAgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkIHNvbmFtZQotCWFyZ3VtZW50LCBhbmQgdXNlIGl0IHRvIHNldCBEVF9TT05BTUUgZHluYW1pYyBlbnRyeS4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIHByb3RvdHlwZS4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBBdWcgMjYgMTU6NDc6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IFNldCBvYmpfcmF3X3N5bWVudF9jb3VudC4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBWZXJpZnkgb2JqX3Jhd19zeW1lbnRfY291bnQsIHJhdGhlcgotCXRoYW4gc2V0dGluZyBpdC4KLQotVGh1IEF1ZyAyNSAxMDo0NDo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogUmVtb3ZlIGhvc3QgZGVwZW5kZW5jaWVzLgotCi0JKiBhb3V0eC5oIChhZGRfdG9fc3RyaW5ndGFiKTogQ2hlY2sgZm9yIF9iZmRfc3RyaW5ndGFiX2FkZCBlcnJvcgotCWJlZm9yZSBhZGRpbmcgQllURVNfSU5fV09SRC4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogTG9vayBmb3IgdGhlIGJlc3QgQ19GSUxFLAotCW5vdCBtZXJlbHkgdGhlIGZpcnN0LgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogSWYgd2UgYXJlIG5vdCB1c2luZyB0aGUKLQlzeW1ib2wsIGNsZWFyIHRoZSBuYW1lIHNvIHRoYXQgaXQgaXMgbm90IHB1dCBpbiB0aGUgc3RyaW5nIHRhYmxlLgotCUZyb20gQW50dGkuTWlldHRpbmVuQG50Yy5ub2tpYS5jb20uCi0KLVdlZCBBdWcgMjQgMTE6NDk6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogQ2FzdCBwb2ludGVyIGRpZmZlcmVudCB0byBsb25nCi0JYW5kIHVzZSAlbGQgdG8gcHJpbnQgaXQuCi0JKiBvc2YtY29yZS5jIChvc2ZfY29yZV9jb3JlX2ZpbGVfcCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKLQlkc2VjY250LgotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfZXh0X291dCk6IElmIEVDT0ZGXzY0LCBjbGVhciByZW1haW5pbmcKLQlieXRlcyBpbiBiaXRzMi4KLQotCSogY29uZmlndXJlLmhvc3QsIGNvbmZpZy5iZmQ6IENoYW5nZSBpWzM0XTg2IHRvIGlbMzQ1XTg2LgotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBTZXQgb2JqX2NvbnZfdGFibGVfc2l6ZSBoZXJlLAotCXJhdGhlciB0aGFuIHdhaXRpbmcgdW50aWwgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuCi0JKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogSnVzdCBpZ25vcmUgQlNGX0RFQlVHR0lORyBzeW1ib2xzLgotCUZyb20gQW50dGkuTWlldHRpbmVuQG50Yy5ub2tpYS5jb20uCi0KLQkqIHNlY3Rpb24uYyAoYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkpOiBGaXggZmFpbHVyZSBjaGVjayBvZgotCWJmZF9tYWtlX2VtcHR5X3N5bWJvbC4gIEZyb20gQW50dGkuTWlldHRpbmVuQG50Yy5ub2tpYS5jb20uCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogVXNlIHRoZSBvdXRwdXRfc2VjdGlvbgotCShhbmQgb3V0cHV0X29mZnNldCkgaWYgdGhlcmUgaXMgb25lLgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogRGlzY2FyZCB0aGUgc3ltYm9scwotCWlmIHRoZSBhcmNoaXZlIGVsZW1lbnQgd2FzIG5vdCBuZWVkZWQuCi0KLQkqIGFvdXR4LmggKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBFbnN1cmUgdGhhdCBhIHplcm8gc3RyaW5nCi0JaW5kZXggeWllbGRzIGFuIGVtcHR5IHN0cmluZy4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBJZiBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgdXNlIG5hbWUKLQlmcm9tIG9yaWdpbmFsIGhhc2ggdGFibGUgZW50cnksIG5vdCBmcm9tIGVudHJ5IGluICpzeW1faGFzaC4KLQotCSogYW91dHguaCAoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvKTogQWRkIGZpZWxkcyBjb250ZW50cywKLQlyZWxvY3MsIHN5bWJvbF9tYXAgYW5kIG91dHB1dF9zeW1zLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBXb3JrIG91dCB0aGUgbGFyZ2VzdCBzZWN0aW9uIHNpemUsIHJlbG9jCi0Jc2l6ZSwgYW5kIG51bWJlciBvZiBzeW1ib2xzLiAgVXNlIHRoZW0gdG8gcHJlYWxsb2NhdGUgYnVmZmVycyB0aGF0Ci0JYXJlIGxhcmdlIGVub3VnaCBmb3IgYWxsIGNhc2VzLgotCShhb3V0X2xpbmtfaW5wdXRfYmZkKTogVXNlIHByZWFsbG9jYXRlZCBzeW1ib2xfbWFwLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFJlbW92ZSBzeW1ib2xfbWFwIGFyZ3VtZW50OyB1c2UKLQlwcmVhbGxvY2F0ZWQgc3ltYm9sX21hcCBpbnN0ZWFkLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgVXNlCi0JcHJlYWxsb2NhdGVkIG91dHB1dF9zeW1zLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbik6IFJlbW92ZSBzeW1ib2xfbWFwIGFyZ3VtZW50LiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBVc2UgcHJlYWxsb2NhdGVkIGNvbnRlbnRzIGFuZCByZWxvY3MuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFJlbW92ZSBzeW1ib2xfbWFwIGFyZ3VtZW50OyB1c2UKLQlwcmVhbGxvY2F0ZWQgc3ltYm9sX21hcCBpbnN0ZWFkLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQotVHVlIEF1ZyAyMyAxMDo1MTowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogRG9uJ3QgdXBkYXRlIHRoZQotCXN5bWJvbCBtYXAgdGltZXN0YW1wIGlmIHRoZXJlIGlzIG5vIHN5bWJvbCBtYXAuICBGcm9tCi0Jc2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlIChBbmRyZWFzIFNjaHdhYikuCi0KLU1vbiBBdWcgMjIgMTI6MjY6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUpOiBBZGQgX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAuCi0JKGJmZF90YXJnZXQpOiBBZGQgZmllbGQgX2JmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLgotCSogYmZkLmMgKGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLWluLmggKF9iZmRfbm9hcmNoaXZlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlY2xhcmUuCi0JKF9iZmRfYXJjaGl2ZV9jb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogQ2FsbAotCWJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGluc3RlYWQgb2YgY2hlY2tpbmcgZm9yIGEgQlNEIGFyY2hpdmUKLQlhbmQgY2FsbGluZyBic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcC4KLQkoX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogUmVuYW1lIGZyb20KLQlfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAuICBEb24ndCBhc3N1bWUgdGhhdCBhcm1hcF9kYXRlcG9zIGlzCi0JYWxyZWFkeSBzZXQuCi0JKiBhb3V0LXRhcmdldC5oIChNWV91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIGllZWUuYyAoaWVlZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogb2FzeXMuYyAob2FzeXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIHNvbS5jIChzb21fdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQotCSogaGFzaC5jOiBDb3B5IHN0cmluZyBoYXNoIGZ1bmN0aW9ucyBmcm9tIGFvdXR4LmguCi0JKiBhb3V0eC5oOiBTdHJpbmcgaGFzaCBmdW5jdGlvbnMgbW92ZWQgdG8gaGFzaC5jLiAgUmV0YWluCi0Jc2ltcGxpZmllZCB2ZXJzaW9ucyBvZiBhZGRfdG9fc3RyaW5ndGFiIGFuZCBlbWl0X3N0cmluZ3RhYi4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMgdG8gdXNlIG5ldyBmdW5jdGlvbiBhbmQgc3RydWN0dXJlIG5hbWVzLgotCSogbGliYmZkLWluLmggKF9iZmRfc3RyaW5ndGFiX2luaXQsIF9iZmRfc3RyaW5ndGFiX2ZyZWUpOiBEZWNsYXJlLgotCShfYmZkX3N0cmluZ3RhYl9zaXplLCBfYmZkX3N0cmluZ3RhYl9hZGQpOiBEZWNsYXJlLgotCShfYmZkX3N0cmluZ3RhYl9lbWl0KTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1Nb24gQXVnIDIyIDEwOjQ5OjM3IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogaTM4NmxpbnV4LmMgKGxpbnV4X2FkZF9vbmVfc3ltYm9sKTogQ3JlYXRlIGEgZml4dXAgZm9yIGFueQotCWRlZmluZWQgYWJzb2x1dGUgc3ltYm9sLCBub3QganVzdCBHT1Qgb3IgUExUIHN5bWJvbHMuCi0JKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIHJlZmVyZW5jZXMgdG8gZGVmaW5lZAotCXN5bWJvbHMuCi0KLVRodSBBdWcgMTggMTY6Mjk6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JR2V0IGxkIC14IC1yIHRvIGhhbmRsZSBhLm91dCBzZXQgc3ltYm9scyBjb3JyZWN0bHkuCi0JKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYyk6IElmIHRoZSAuYnNzIFZNQSB3YXMgc2V0IG91dHNpZGUgb2YKLQlCRkQsIHBhZCB0aGUgLmRhdGEgc2VjdGlvbiB1cCB0byB0aGUgVk1BIG9mIHRoZSAuYnNzIHNlY3Rpb24uCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IElmIGEgc2V0IHN5bWJvbCBkb2VzIG5vdCBnZXQgbW9kaWZpZWQsCi0JdHJlYXQgaXQgYXMgYSBsb2NhbCBzeW1ib2wuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogU2V0IHRoZSB2YWx1ZSBvZiBzZXQgc3ltYm9scwotCWNvcnJlY3RseS4gIERvbid0IGRpc2NhcmQgc2V0IHN5bWJvbHMgZXZlbiBpZiBkaXNjYXJkaW5nIGxvY2FsCi0Jc3ltYm9scy4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IERvbid0IGFib3J0IG9uIGJmZF9saW5rX2hhc2hfbmV3LAotCXNpbmNlIGl0IGNhbiBub3cgaGFwcGVuIGZvciBzZXQgc3ltYm9scy4KLQotCSogZWxmY29kZS5oIChlbGZfZmFrZV9zZWN0aW9ucyk6IEp1c3QgY2hlY2sgZm9yICIucmVsYSIgYW5kCi0JIi5yZWwiLCBub3QgIi5yZWxhLiIgYW5kICIucmVsLiI7IG1ha2UgdGhpcyB3b3JrIGJ5IGNoZWNraW5nCi0JdXNlX3JlbGFfcC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogSnVzdCBjaGVjayBmb3IgIi5yZWwiLCBub3QKLQkiLnJlbC4iCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBKdXN0IGNoZWNrIGZvcgotCSIucmVsYSIsIG5vdCAiLnJlbGEuIgotCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1XZWQgQXVnIDE3IDE2OjU0OjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJbml0aWFsaXplCi0JUEFTUyB0byB0aGUgb2xkIHZhbHVlICsgMS4KLQotCSogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IElmIGEgQ19GSUxFIHN5bWJvbCBoYXMKLQlubyBhdXggZW50cmllcywgdXNlIHRoZSBzeW1ib2wgbmFtZSBhcyB0aGUgZmlsZSBuYW1lLgotCShjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogTG9vayBmb3IgdGhlIHJpZ2h0IENfRklMRSBzeW1ib2wsIHJhdGhlcgotCXRoYW4gYWx3YXlzIHVzaW5nIHRoZSBmaXJzdCBvbmUuICBJZiB0aGVyZSBpcyBhIGRlYnVnZ2luZyBzeW1ib2wKLQlhZnRlciBhIGZ1bmN0aW9uIHN5bWJvbCwgc2tpcCBpdC4gIEFkZCB0aGUgc2VjdGlvbiBWTUEgdG8gdGhlIGxpbmUKLQlvZmZzZXQsIHNpbmNlIGl0IHdhcyBzdWJ0cmFjdGVkIG91dCBpbiBjb2ZmX3NsdXJwX2xpbmVfdGFibGUuCi0KLVR1ZSBBdWcgMTYgMTY6NTM6MDAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcHJlcF9oZWFkZXJzKTogSWYgd3JpdGluZyBzb21lIGZvcm0gb2YgYW4gZXhlY3V0YWJsZSwKLQlhbGxvY2F0ZSBhbmQgYXR0YWNoIGFuIGV4ZWMgaGVhZGVyIHRvIHRoZSBCRkQgcHJpdmF0ZSBkYXRhLgotCShzb21fYmVnaW5fd3JpdGluZyk6IERvbid0IGZpbGwgZmllbGRzIG9mIHRoZSBleGVjIGhlYWRlciBiYXNlZAotCW9uIEJGRCBwcml2YXRlIGRhdGEgaGVyZSAobGlrZSB0aGUgZXhlYyBmbGFncykuICBEbyBub3Qgd3JpdGUKLQl0aGUgZXhlYyBoZWFkZXIgaGVyZS4KLQkoc29tX3dyaXRlX2hlYWRlcnMpOiBJbnN0ZWFkIGRvIGl0IGhlcmUuCi0JKiBzb20uaCAoc3RydWN0IHNvbWRhdGEpOiBOZXcgZmllbGQgImV4ZWNfaGRyIiBmb3IgdGhlIGV4ZWN1dGFibGUKLQlmaWxlIGhlYWRlci4KLQkob2JqX3NvbV9leGVjX2hkcik6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQotVHVlIEF1ZyAxNiAwMDoxMjozMSAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGkzODZsaW51eC5jIChsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ3JlYXRlIHNlY3Rpb24KLQluYW1lZCAubGludXgtZHluYW1pYywgbm90IC5keW5hbWljLgotCShsaW51eF9hZGRfb25lX3N5bWJvbCk6IFVzZSAubGludXgtZHluYW1pYywgbm90IC5keW5hbWljLgotCShiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmspOiBMaWtld2lzZS4KLQotTW9uIEF1ZyAxNSAxMjoxNjo1NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoU1RSSU5HX1NJWkVfU0laRSk6IERlZmluZS4KLQkoY29mZl9maXhfc3ltYm9sX25hbWUpOiBVc2UgU1RSSU5HX1NJWkVfU0laRSwgbm90IDQuCi0JKGNvZmZfd3JpdGVfc3ltYm9scywgYnVpbGRfc3RyaW5nX3RhYmxlKTogTGlrZXdpc2UuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogTGlrZXdpc2UuCi0KLQkqIGxpYmNvZmYtaW4uaCAob2JqX3N5bWJvbF9zbGV3KTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgY29mZl90ZGF0YSk6IFJlbW92ZSB1bnVzZWQgZmllbGRzIGluZGV4X3NsZXcsIHJhd19saW5lbm9zLAotCWFuZCBmbGFncy4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3QpOiBEb24ndCBpbml0aWFsaXplIHJhd19saW5lbm9zLgotCShjb2ZmX21rb2JqZWN0X2hvb2spOiBEb24ndCBpbml0aWFsaXplIGZsYWdzLgotCi0JKiBhb3V0LXRhcmdldC5oIChNWV96bWFnaWNfY29udGlndW91cyk6IERlZmluZSBhcyAwIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQkoTVkoYmFja2VuZF9kYXRhKSk6IFVzZSBNWV96bWFnaWNfY29udGlndW91cywgbm90IGhhcmRjb2RlZCAwLgotCSogaTM4NmxpbnV4LmMgKE1ZX3ptYWdpY19jb250aWd1b3VzKTogRGVmaW5lLgotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IElmIGEgU0hUX1NZTVRBQiBzZWN0aW9uIGluIGEKLQlzaGFyZWQgb2JqZWN0IGhhcyBTSEZfQUxMT0Mgc2V0LCBjcmVhdGUgYSBCRkQgc2VjdGlvbiBmb3IgaXQuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBUaGVyZSBtYXkgYmUgYSBCRkQgc2VjdGlvbiBmb3IgYQotCVNIVF9TWU1UQUIgc2VjdGlvbi4KLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBBZGQgbmFtZSBhcmd1bWVudC4gIElmIG5vIGZsYWdzCi0JYXJlIHJlY29nbml6ZWQsIGNob3NlIHNlY3Rpb24gZmxhZ3MgYmFzZWQgb24gdGhlIG5hbWUuCi0JKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IF9iZmRfc3R5cF90b19zZWNfZmxhZ3NfaG9vayBmaWVsZDogQWRkCi0JbmFtZSBhcmd1bWVudC4KLQkoYmZkX2NvZmZfc3R5cF90b19zZWNfZmxhZ3NfaG9vayk6IEFkZCBuYW1lIGFyZ3VtZW50LgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvbid0IGFkanVzdCB0aGUgc2VjdGlvbgotCXBvc2l0aW9uIGJ5IENPRkZfUEFHRV9TSVpFIHVubGVzcyBTRUNfQUxMT0MgaXMgc2V0LgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBQYXNzIHNlY3Rpb24gbmFtZSB0bwotCWJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2suCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogQWRkIHVudXNlZCBuYW1lCi0JYXJndW1lbnQuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogQWRkIG5hbWUgYXJndW1lbnQgdG8KLQlwcm90b3R5cGUuCi0KLUZyaSBBdWcgMTIgMTE6MjI6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBDb3JyZWN0IGNoZWNrIGZvciBpbnZhbGlkCi0Jc2VjdGlvbiBpbmRleC4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiB0aGVyZSBpcyBubyBzeW1ib2wKLQl0YWJsZSwgdHJ5IHVzaW5nIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKLQk8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLXNvbGFyaXMyKik6IFVzZSBzb2xhcmlzMiwgbm90IHN5c3Y0LgotCVRoZSBsaW5rZXIgZGVwZW5kcyB1cG9uIGNvbmZpZ3VyaW5nIGZvciBzb2xhcmlzMi4KLQkqIGhvc3RzL3NvbGFyaXMyLmg6IE5ldyBmaWxlOyBpbmNsdWRlIGhvc3RzL3N5c3Y0LmguCi0JKiBjb25maWcvc29sYXJpczIubWg6IE5ldyBmaWxlOyBjb3B5IG9mIGNvbmZpZy9zeXN2NC5taC4KLQotV2VkIEF1ZyAxMCAxMzowOTozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFkanVzdF96X21hZ2ljKTogTWFrZSBzdXJlIGRhdGEgc2VjdGlvbiBpcyBwYWRkZWQgdG8KLQlwYWdlIGJvdW5kYXJ5IHdoZW4gdGhlIFZNQSBpcyBzZXQgYnkgdGhlIGNhbGxpbmcgcHJvZ3JhbS4gIEZyb20KLQlFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0KLU1vbiBBdWcgIDggMTc6MTg6NDkgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JVXBkYXRlIHRvIG5zMzJrIHN1cHBvcnQsIGZyb20gSWFuIERhbGwgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkuCi0JKiBhb3V0LW5zMzJrLmM6IEFkZCBkZWNsYXJhdGlvbnMgdGhhdCB3ZXJlIGluIGFvdXQtbnMzMmsuaCwgY2hhbmdlCi0JZGVjbGFyYXRpb25zIHRvIHRyYWRpdGlvbmFsIGZvcm0uCi0JKE1ZX3JlbG9jX2hvd3RvLCBNWV9wdXRfcmVsb2MpOiBDaGFuZ2UgZnJvbSBtYWNybyB0byBmdW5jdGlvbi4KLQkobnMzMmtfcmVsb2NhdGVfY29udGVudHMpOiBOZXcgZnVuY3Rpb24uCi0JKiBhb3V0LW5zMzJrLmg6IFJlbW92ZS4KLQkqIGNwdS1uczMyay5jOiBBZGQgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSBpbiBhb3V0LW5zMzJrLmgsIGNoYW5nZQotCWRlY2xhcmF0aW9ucyB0byB0cmFkaXRpb25hbCBmb3JtLgotCShuczMya19maW5hbF9saW5rX3JlbG9jYXRlKTogQ2FsbCBuczMya19yZWxvY2F0ZV9jb250ZW50cy4KLQkqIG5ldGJzZDUzMi5jOiBSZWZvcm1hdCB0byBzdGFuZGFyZHMsIGFkZCBjb3B5cmlnaHQgbm90aWNlLgotCShBUkNIKTogRG9uJ3QgZGVmaW5lLgotCShhb3V0LW5zMzJrLmgpOiBEb24ndCBpbmNsdWRlLgotCSogcGM1MzItbWFjaC5jOiBEaXR0by4KLQotTW9uIEF1ZyAgOCAxNzo1NTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBEb24ndCB0cnkgdG8gY29udmVydCByZWxvY3MKLQlhZ2FpbnN0IGNvbW1vbiBzeW1ib2xzLgotCi1TYXQgQXVnICA2IDIyOjI3OjMwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaXJpeC1jb3JlLmMgKGlyaXhfY29yZV9jb3JlX2ZpbGVfcCk6ICBJZ25vcmUgc2VjdGlvbnMgdGhhdAotCWFyZSBub3QgY29udGFpbmVkIGluIHRoZSBjb3JlIGZpbGUuCi0KLVRodSBBdWcgIDQgMTE6MzI6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW02OGsuYyAobTY4a19yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUuCi0JKiBjZi1tNjhrbHlueC5jIChfYmZkX202OGtjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgotCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IEZvcmNlIHRoZSB2bWEgb2Ygc2VjdGlvbnMgd2hpY2gKLQlkbyBub3QgaGF2ZSBTRUNfQUxMT0Mgc2V0IHRvIGJlIDAuICBUaGlzIGlzIG5lZWRlZCB0byBoYW5kbGUKLQlyZWxvY3MgYWdhaW5zdCBkZWJ1Z2dpbmcgc2VjdGlvbnMuCi0KLVdlZCBBdWcgIDMgMTY6NDU6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogUmV3cm90ZSB0byBjaGFuZ2UgcmVsb2NzCi0JYWdhaW5zdCBsb2NhbGx5IGRlZmluZWQgc3ltYm9scyBpbnRvIHJlbG9jcyBhZ2FpbnN0IHNlY3Rpb24KLQlzeW1ib2xzLCBmb3IgVnhXb3JrcyA1LjEuCi0KLVdlZCBBdWcgIDMgMTA6MzQ6MzcgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBpMzg2bGludXguYyAobGludXhfYWRkX29uZV9zeW1ib2wpOiBPbmx5IGhhbmRsZQotCVNIQVJBQkxFX0NPTkZMSUNUUyBzcGVjaWFsbHkgaWYgQlNGX0NPTlNUUlVDVE9SIGlzIHNldC4gIFNldCBoYXNocAotCWZvciBhIEdPVCBvciBQTFQgc3ltYm9sLiAgU2V0IGp1bXAgZmllbGQgb2YgZml4dXAgZm9yIGEgUExUIHN5bWJvbC4KLQkobGludXhfdGFsbHlfc3ltYm9scyk6IENoZWNrIHNlY3Rpb24gb2YgcmVhbCBzeW1ib2wuICBXaGVuIGxvb2tpbmcKLQlmb3IgYSBidWlsdGluIGZpeHVwLCBjaGVjayBidWlsdGluIGFuZCBqdW1wIGZsYWdzLiAgQ3JlYXRlIG5vIG1vcmUKLQl0aGFuIG9uZSBmaXh1cCwgYW5kIGFsd2F5cyBjcmVhdGUgb25lIGlmIHRoZSByZWFsIHN5bWJvbCBpcyBpbiB0aGUKLQlhYnNvbHV0ZSBzZWN0aW9uLiAgT25seSBzdHJpcCBhYnNvbHV0ZSBzeW1ib2xzLgotCi1XZWQgQXVnICAzIDA1OjA4OjI0IDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgaW50ZXJuYWxfYS5tYWdpYyB0bwotCUxZTlhDT0ZGTUFHSUMgd2hlbmV2ZXIgNjhrLCBTUEFSQyBvciBpMzg2IEx5bnhPUwotCSh5ZXMsIHRoZXkgaGF2ZSB0aGUgc2FtZSBtYWdpYyBudW1iZXIhKQotCi1UdWUgQXVnICAyIDEwOjQzOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogaHAzMDBocHV4LmMgKEJNQUdJQyk6IERlZmluZSBhcyBIUFVYX0RPVF9PX01BR0lDLCB0byBtYWtlIHRlc3QKLQlpbiBhb3V0eC5oIHdvcmsgY29ycmVjdGx5LgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgotCShob3d0b19yZWxsb25nLCBob3d0b19pcHJtZWQpOiBVc2UgaXQgYXMgc3BlY2lhbF9mdW5jdGlvbi4KLQotCSogbGliYmZkLWluLmg6IE1vdmUgZGVjbGFyYXRpb25zIG9mIGJmZF9yZWFkLCBiZmRfd3JpdGUsIGJmZF9zZWVrLAotCWJmZF90ZWxsLCBiZmRfZmx1c2gsIGFuZCBiZmRfc3RhdCBmcm9tIGhlcmUuLi4KLQkqIGJmZC1pbi5oOiAuLi50byBoZXJlLCB0byBtYWtlIHRoZW0gdmlzaWJsZSB0byBwcm9ncmFtcyB3aGljaAotCWtub3cgbW9yZSBhYm91dCB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IHRoYW4gQkZEIGRvZXMuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1Nb24gQXVnICAxIDE3OjU1OjUzIDE5OTQgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCk6ICBDb252ZXJ0IHphbGxvYyB1c2FnZQotCXRvIGJmZF96YWxsb2MuCi0KLU1vbiBBdWcgIDEgMTI6MDQ6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGY2NC1zcGFyYy5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0KLQlFTEYgbGlua2VyIHBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IHR5cGUgb2YKLQlfRFlOQU1JQyB0byBTVFRfT0JKRUNULgotCShOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBBbHdheXMgY3JlYXRlIGhhc2ggdGFibGUKLQllbnRyeS4gIFNldCB0eXBlIHRvIFNUVF9PQkpFQ1QuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBEb24ndCBzZXQgdHlwZSBvZiB3ZWFrIGRlZmluZWQgc3ltYm9sIHRvCi0JU1RCX1dFQUsgaWYgc3ltYm9sIHdhcyByZWZlcmVuY2VkLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENoZWNrIERZTkFNSUMgYXMgd2VsbCBhcyBFWEVDX1AuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IHR5cGUgb2YKLQlfR0xPQkFMX09GRlNFVF9UQUJMRSB0byBTVFRfT0JKRUNULgotCShlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBJZ25vcmUgbG9jYWwgUExUMzIgcmVsb2NzLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogVHJlYXQgbG9jYWwgUExUMzIgcmVsb2NzIGFzIFBDMzIuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENvcnJlY3Qgd2VhayBzeW1ib2wKLQloYW5kbGluZyBhZ2Fpbi4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBEb24ndCB0cnkgdG8gcmVhZCB0aGUgcmVsb2NzCi0JaWYgdGhlcmUgYXJlbid0IGFueS4KLQotCSogY29uZmlndXJlLmhvc3QgKHNwYXJjLSotc29sYXJpczIqKTogVXNlIHN5c3Y0LCBub3Qgc29sYXJpczIuCi0JKiBob3N0cy9zb2xhcmlzMi5oOiBSZW1vdmUuCi0JKiBjb25maWcvc29sYXJpczIubWg6IFJlbW92ZS4KLQotU3VuIEp1bCAzMSAxNDoyNzowNCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jLCBlbGYzMi1ocHBhLmg6IFVwZGF0ZSBjb21tZW50IHJlZmxlY3Rpbmcgd2hpY2gKLQlIUFBBIEVMRiBzcGVjIHRoZSBjb2RlIGltcGxlbWVudHMuCi0KLVR1ZSBKdWwgMjYgMTc6Mzg6MDEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY3B1LWk5NjAuYyAoTUFYX0FSQ0gpOiBOZXcgbWFjcm8uCi0JKGNvbXBhdGlibGUpOiBVc2UgaXQgaW4gY29tcHV0aW5nIGFycmF5IGJvdW5kcy4gIFB1dCBjb21tYSBhZnRlcgotCWxhc3QgZW50cnkgaW4gYXJyYXksIGZvciByZWd1bGFyaXR5LgotCShhcmNoX2luZm9fc3RydWN0KTogQWRqdXN0IHNwYWNpbmcgZm9yIGVhc2llciByZWFkaW5nLgotCi0JKiBjb2ZmLWk5NjAuYyAoaG93dG9fcmVsbG9uZywgaG93dG9faXBybWVkLCBob3d0b19vcHRjYWxsKTogVXNlCi0JSE9XVE8gbWFjcm8uCi0KLQkqIGNwdS1pOTYwLmMgKEpYKTogRGVmaW5lIGFzIGJmZF9tYWNoX2k5NjBfanguCi0JKHNjYW5fOTYwX21hY2gpOiBSZWNvZ25pemUganggbWFjaGluZS4KLQkoTUFYX0FSQ0gpOiBEZWZpbmUgdG8gYmUgSlguCi0JKGNvbXBhdGlibGUpOiBBZGQgSlggcm93IHRvIGFycmF5LgotCShhcmNoX2luZm9fc3RydWN0KTogQWRkIEpYIGVudHJ5LgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9pOTYwX2p4KTogTmV3IG1hY3JvLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBGb3IgRl9JOTYwSlgsIHNldCBtYWNoaW5lCi0JdG8gYmZkX21hY2hfaTk2MF9qeC4KLQkoY29mZl9zZXRfZmxhZ3MpOiBGb3IgYmZkX21hY2hfaTk2MF9qeCwgc2V0IEZfSTk2MEpYLgotCi1UdWUgSnVsIDI2IDExOjA0OjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogV2hlbiBoYW5kbGluZyBhIHdlYWsKLQlzeW1ib2wsIGNvcnJlY3QgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGVxdWl2YWxlbnQgbm9ybWFsIHN5bWJvbAotCXdhcyByZWZlcmVuY2VkLgotCi0JQWRkIHN1cHBvcnQgZm9yIGNyZWF0aW5nIHNoYXJlZCBsaWJyYXJpZXMgdW5kZXIgaTM4NiBFTEYgYW5kIFNQQVJDCi0JRUxGLiAgQmFzZWQgb24gcGF0Y2hlcyBieSBFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBSZW1vdmUgY29weV9vZmZzZXQgZmllbGQuCi0JQWRkIGdvdF9vZmZzZXQgYW5kIHBsdF9vZmZzZXQgZmllbGRzLgotCShFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDX01VTFRJUExFKTogRG9uJ3QgZGVmaW5lLgotCShFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDX01VTFRJUExFKTogRG9uJ3QgZGVmaW5lLgotCShFTEZfTElOS19IQVNIX05FRURTX0NPUFkpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIGNoZWNrX3JlbG9jcyBmaWVsZC4KLQkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQ2hhbmdlIHJlbG9jcyBmcm9tIFBUUiB0bwotCUVsZl9JbnRlcm5hbF9SZWxhICouCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGxvY2FsX2dvdF9vZmZzZXRzIGZpZWxkLgotCShlbGZfbG9jYWxfZ290X29mZnNldHMpOiBEZWZpbmUgYWNjZXNzb3IgbWFjcm8uCi0JKGJmZF9lbGYzMl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBEb24ndCB1c2UgdGhlIHNlY3Rpb24gZGF0YQotCXJlbG9jcyBmaWVsZC4KLQkoZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgVXNlCi0JbWFjcm8gdG8gcmVuYW1lIHRvIE5BTUUoYmZkX2VsZixsaW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCkuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHB1dAotCW1ha2UgYWxsIGxvY2FsIHN5bWJvbHMgZHluYW1pYy4gIERvbid0IGJvdGhlciB3aXRoIHRoZQotCURZTkFNSUNfTVVMVElQTEUgZmxhZ3MuICBDYWxsIHRoZSBjaGVja19yZWxvY3MgYmFja2VuZCBmdW5jdGlvbiBpZgotCWl0IGlzIGRlZmluZWQuCi0JKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgVXNlCi0JbWFjcm8gdG8gcmVuYW1lIHRvIE5BTUUoYmZkX2VsZixsaW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKS4gIElmCi0JY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgbWFrZSBzdXJlIHRoYXQgX0RZTkFNSUMgaXMgYWRkZWQgYXMgYQotCWR5bmFtaWMgc3ltYm9sLgotCShlbGZfbGlua19yZWFkX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogSWYgY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LCBhbHdheXMgY3JlYXRlIHN5bWJvbHMsIGFuZCBhbHdheXMgbWFrZSB0aGVtIGR5bmFtaWMuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFBlcm1pdCBjcmVhdGlvbiBvZiBzaGFyZWQgbGlicmFyaWVzLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBVc2UgZWxmX2xpbmtfcmVhZF9yZWxvY3MgdG8gZ2V0IHRoZSByZWxvY3MuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBpbml0aWFsaXplCi0JY29weV9vZmZzZXQuICBJbml0aWFsaXplIGdvdF9vZmZzZXQgYW5kIHBsdF9vZmZzZXQuCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lIGFzIDAgaWYgbm90Ci0JZGVmaW5lZC4KLQkoZWxmMzJfYmVkKTogSW5pdGlhbGl6ZSBjaGVja19yZWxvY3MgZmllbGQuCi0JKiBlbGY2NC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lIGFzIDAgaWYgbm90Ci0JZGVmaW5lZC4KLQkoZWxmNjRfYmVkKTogSW5pdGlhbGl6ZSBjaGVja19yZWxvY3MgZmllbGQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IENoYW5nZSBSXzM4Nl9QTFQzMiBhbmQKLQlSXzM4Nl9HT1RQQyB0byBiZSBwY19yZWxhdGl2ZSBhbmQgcGNyZWxfb2Zmc2V0LgotCShlbGZfaTM4Nl9waWNfcGx0MF9lbnRyeSk6IERlZmluZS4KLQkoZWxmX2kzODZfcGljX3BsdF9lbnRyeSk6IERlZmluZS4KLQkoZWxmX2kzODZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDcmVhdGUgYSAuZ290LnBsdCBzZWN0aW9uLCBhbmQKLQlkZWZpbmUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiBpdC4gIElmIGNyZWF0aW5nIGEKLQlzaGFyZWQgbGlicmFyeSwgbWFrZSBzdXJlIHRoYXQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGFkZGVkIGFzIGEKLQlkeW5hbWljIHN5bWJvbC4gIERvbid0IGNyZWF0ZSAucmVsLmJzcyBpZiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYnJhcnkuCi0JKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbWFrZSBhIFBMVCBlbnRyeSBpZiB0aGUKLQlzeW1ib2wgYWxyZWFkeSBoYXMgb25lLiAgV2hlbiBtYWtpbmcgYSBQTFQgZW50cnksIHNldCBwbHRfb2Zmc2V0LgotCURvbid0IGNyZWF0ZSBhIGNvcHkgcmVsb2Mgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgRG9uJ3QKLQlzZXQgY29weV9vZmZzZXQsIGp1c3Qgc2V0IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWS4KLQkoZWxmX2kzODZfYWxsb2NhdGVfZHluYW1pY19zZWN0aW9uKTogUmVtb3ZlLgotCShlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMb29rIHRocm91Z2ggYWxsIHRoZSBzZWN0aW9ucwotCXJhdGhlciB0aGFuIGFzc3VtaW5nIHdlIGtub3cgdGhlaXIgbmFtZXMuICBSZW1vdmUgYW55IGVtcHR5IHJlbG9jCi0Jb3IgcGx0IHNlY3Rpb25zLiAgT25seSBhZGQgYSBEVF9ERUJVRyBlbnRyeSBpZiBub3QgY3JlYXRpbmcgYQotCXNoYXJlZCBsaWJyYXJ5LiAgT25seSBhZGQgYSBEVF9QTFRHT1QgZW50cnkgaWYgdGhlcmUgaXMgYSBQTFQuCi0JQWRkIGEgRFRfVEVYVFJFTCBlbnRyeSBpZiByZXF1aXJlZC4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFBlcm1pdCB1bmRlZmluZWQgc3ltYm9scyB3aGVuCi0JY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIEhhbmRsZSB0aGUgc3BlY2lhbCByZWxvY2F0aW9uIHR5cGVzCi0Jc3BlY2lhbGx5LgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBDcmVhdGUgYSBQTFQgZW50cnkgaWYgcGx0X29mZnNldAotCWlzIHNldC4gIElmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHByb2R1Y2UgYSBQSUMgUExUIGVudHJ5LgotCU9ubHkgbWFyayBhIFBMVCBzeW1ib2wgYXMgdW5kZWZpbmVkIGlmIGl0IHdhcyBub3QgZGVmaW5lZCBieSBhCi0JcmVndWxhciBvYmplY3QgZmlsZS4gIENyZWF0ZSBhIEdPVCBlbnRyeSBpZiBnb3Rfb2Zmc2V0IGlzIHNldC4KLQlDcmVhdGUgYSBjb3B5IHJlbG9jIGlmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSBpcyBzZXQuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogQ2hhbmdlIHRoZSBoYW5kbGluZyBvZgotCURUX1JFTFNaIHRvIHNpbXBseSBzdWJ0cmFjdCBvdXQgdGhlIHNpemUgb2YgLnJlbC5wbHQuICBJZiBjcmVhdGluZwotCWEgc2hhcmVkIGxpYnJhcnksIHByb2R1Y2UgUElDIFBMVCBjb2RlLgotCShlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBDaGFuZ2UgUl9TUEFSQ19HT1QxMCwKLQlSX1NQQVJDX0dPVDIyLCBhbmQgUl9TUEFSQ19QQzEwIHRvIG5vdCB3YXJuIGFib3V0IHJlbG9jIG92ZXJmbG93LgotCShlbGYzMl9zcGFyY19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IElmIGNyZWF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeSwgbWFrZSBzdXJlIHRoYXQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGFkZGVkIGFzIGEKLSAgICAgICAgZHluYW1pYyBzeW1ib2wsIGFuZCBzZXQgdGhlIHR5cGUgdG8gU1RUX09CSkVDVC4gIExpa2V3aXNlIGZvcgotICAgICAgICBfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfLiAgRG9uJ3QgY3JlYXRlIC5yZWwuYnNzIGlmIGNyZWF0aW5nIGEKLSAgICAgICAgc2hhcmVkIGxpYnJhcnkuCi0JKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbWFrZSBhIFBMVCBlbnRyeSBpZiB0aGUKLQlzeW1ib2wgYWxyZWFkeSBoYXMgb25lLiAgV2hlbiBtYWtpbmcgYSBQTFQgZW50cnksIHNldCBwbHRfb2Zmc2V0LgotCURvbid0IGNyZWF0ZSBhIGNvcHkgcmVsb2Mgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgRG9uJ3QKLQlzZXQgY29weV9vZmZzZXQsIGp1c3Qgc2V0IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWS4KLQkoZWxmMzJfc3BhcmNfYWxsb2NhdGVfZHluYW1pY19zZWN0aW9uKTogUmVtb3ZlLgotCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMb29rIHRocm91Z2ggYWxsIHRoZSBzZWN0aW9ucwotCXJhdGhlciB0aGFuIGFzc3VtaW5nIHdlIGtub3cgdGhlaXIgbmFtZXMuICBPbmx5IGFkZCBhIERUX0RFQlVHCi0JZW50cnkgaWYgbm90IGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBBZGQgYSBEVF9URVhUUkVMIGVudHJ5IGlmCi0JcmVxdWlyZWQuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBQZXJtaXQgdW5kZWZpbmVkIHN5bWJvbHMgd2hlbgotCWNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBIYW5kbGUgdGhlIHNwZWNpYWwgcmVsb2NhdGlvbiB0eXBlcwotCXNwZWNpYWxseS4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQ3JlYXRlIGEgUExUIGVudHJ5IGlmIHBsdF9vZmZzZXQKLQlpcyBzZXQuICBPbmx5IG1hcmsgYSBQTFQgc3ltYm9sIGFzIHVuZGVmaW5lZCBpZiBpdCB3YXMgbm90IGRlZmluZWQKLQlieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuICBDcmVhdGUgYSBHT1QgZW50cnkgaWYgZ290X29mZnNldCBpcwotCXNldC4gIENyZWF0ZSBhIGNvcHkgcmVsb2MgaWYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZIGlzIHNldC4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBTdG9yZSBkeW5vYmogaW4gYSBsb2NhbAotCXZhcmlhYmxlLgotCShlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUuCi0KLU1vbiBKdWwgMjUgMTI6MjE6MDcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHBjNTMybWFjaF92ZWMpOiBDaGFuZ2UgdG8gcGM1MzJtYWNoYW91dF92ZWMuCi0JKiBjb25maWcuYmZkIChuczMyay0qLW5ldGJzZCopOiBVc2UgbnMzMmstbmJzZCBhcyBiZmRfbmFtZS4KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgY3B1LW5zMzJrLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGFvdXQtbnMzMmsubywgbmV0YnNkNTMyLm8sIG04OGttYWNoMy5vLAotCXBjNTMyLW1hY2guby4KLQkqIHRhcmdldHMuYyAocGM1MzJtYWNoYW91dF92ZWMpOiBVc2UgaW5zdGVhZCBvZiBwYzUzMm1hY2hfdmVjLgotCSogY29uZmlnL3BjNTMyLW1hY2gubXQgKERFRkFVTFRfVkVDVE9SKTogRGl0dG8uCi0JKFNFTEVDVF9WRUNTKTogUmVtb3ZlLgotCSogY29uZmlnL25zMzJrLW5ic2QubXQ6IE5ldyBmaWxlLCB3YXMgbnMzMmstbmV0YnNkLm10LgotCSogY29uZmlnL25zMzJrLW5ldGJzZC5tdDogUmVtb3ZlLCBuYW1lIHRvbyBsb25nLgotCi1GcmkgSnVsIDIyIDExOjA3OjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBXaGVuIGNoYW5naW5nIGEKLQlzeW1ib2wgdG8gY29tbW9uLCBzZXQgdGhlIGFsaWdubWVudC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBXaGVuIGNyZWF0aW5nIGEgY29tbW9uIHN5bWJvbCwKLQlzZXQgdGhlIGFsaWdubWVudC4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogV2hlbiBjaGFuZ2luZyBhIHN5bWJvbCB0bwotCWNvbW1vbiwgc2V0IHRoZSBhbGlnbm1lbnQuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IFJlc3RyaWN0IHRoZSBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sCi0JdG8gdGhlIGFsaWdubWVudCBwb3dlciBnaXZlbiBieSB0aGUgYXJjaGl0ZWN0dXJlLgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogUmVtb3ZlIGFsaWduIGZpZWxkLiAgQWRkCi0JY29weV9vZmZzZXQgZmllbGQuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFN0b3JlIGFsaWdubWVudCBpbgotCW5ldyBiZmRfbGlua19oYXNoX2VudHJ5IGZpZWxkLCBub3QgaW4gZWxmX2xpbmtfaGFzaF9lbnRyeSBmaWVsZC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFNpbWlsYXIgY2hhbmdlIHdoZW4gZ2V0dGluZyBhbGlnbm1lbnQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBpbml0aWFsaXplIGFsaWduLiAgRG8KLQlpbml0aWFsaXplIGNvcHlfb2Zmc2V0LgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBVc2UgY29weV9vZmZzZXQKLQlmaWVsZCByYXRoZXIgdGhhbiBhbGlnbiBmaWVsZC4gIEdldCBhbGlnbm1lbnQgdXNpbmcgYmZkX2xvZzIKLQlyYXRoZXIgdGhhbiBzd2l0Y2guCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogVXNlIGNvcHlfb2Zmc2V0LAotCW5vdCBhbGlnbi4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IEp1c3QgY2hlY2sKLQlTVEFUX0ZPUl9FWEVDLCBkb24ndCBjaGVjayBNQUNILgotCSogbTg4a21hY2gzLmMgKE1BQ0gpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvaTM4Ni1tYWNoMy5tdCAoVERFRklORVMpOiBEZWZpbmUgU1RBVF9GT1JfRVhFQy4KLQkqIGNvbmZpZy9tODhrLW1hY2gzLm10IChUREVGSU5FUyk6IExpa2V3aXNlLgotCSogY29uZmlnL21pcHMtbWFjaDMubXQgKFRERUZJTkVTKTogTGlrZXdpc2UuCi0KLVRodSBKdWwgMjEgMTc6MjQ6MzEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBpMzg2bWFjaDMuYzogUmV2ZXJ0ZWQgdG8gdmVyc2lvbiBmcm9tIGJlZm9yZSBKdWwgNSAxOTk0IGNoYW5nZXMuCi0KLVRodSBKdWwgMjEgMTI6MjY6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0KTogUmVtb3ZlIHNwZWNpYWxfZnVuY3Rpb24xLgotCUl0J3MgdGhlIHdyb25nIHdheSB0byBkbyB0aGluZ3MuCi0JKEhPV1RPKTogQ2hhbmdlIGFjY29yZGluZ2x5LgotCShIT1dUTzIpOiBSZW1vdmUuCi0JKF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IFJlbW92ZSByZWZlcmVuY2VzIHRvCi0Jc3BlY2lhbF9mdW5jdGlvbjEuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBSZW1vdmUgcmVmZXJlbmNlcyB0bwotCXNwZWNpYWxfZnVuY3Rpb24xLgotCShhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi1XZWQgSnVsIDIwIDE1OjQ2OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZCBycGF0aAotCWFyZ3VtZW50LiAgSWYgaXQgaXMgbm90IE5VTEwsIHVzZSBpdCB0byBzZXQgRFRfUlBBVEguCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotU2F0IEp1bCAxNiAyMToxMDozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IElmIHRoZXJlIGlzIG5vCi0JZHluYW1pYyBzeW10YWIsIHJldHVybiBlcnJvci4KLQotCSogbGliZWxmLmggKEVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLKTogRGVmaW5lLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBzeW1ib2wgaXMgZGVmaW5lZCBhcwotCXdlYWssIHNldCBFTEZfTElOS19IQVNIX0RFRklORURfV0VBSy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IElmIHN5bWJvbCBpcyBkZWZpbmVkIGFzIHdlYWssIG1hcmsgaXQKLQlTVEJfV0VBSy4KLQotCSogbGliZWxmLmggKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCByZWxvY3MgZmllbGQuCi0JKHNoZHJfbmFtZSk6IFJlbW92ZTsgdW51c2VkLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBSZXdyb3RlIHRvIGhhbmRsZSBib3RoIFJFTAotCWFuZCBSRUxBIHJlbG9jcy4gIEZyZWUgdXAgdGhlIHVuc3dhcHBlZCByZWxvY3MuICBQZXJtaXQgdGhlIHJlbG9jcwotCXRvIGJlIGNhY2hlZCBpbiB0aGUgc2VjdGlvbl9kYXRhLiAgQ29ycmVjdCB0aGUgcmVsb2MgYWRkcmVzcy4KLQkoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IFJlbW92ZS4KLQkoZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IFJld3JvdGUuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFBlcm1pdCB0aGUgcmVsb2NzIHRvIGJlIGNhY2hlZCBpbiB0aGUKLQlzZWN0aW9uIGRhdGEuCi0KLVNhdCBKdWwgMTYgMTM6NTU6MzggMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChtODgqLWhhcnJpcy1jeHV4Kik6IFJlY29nbml6ZS4KLQkqIGhvc3RzL2hhcnJpcy5oIChQT1NJWF9VVElNRSwgSEFWRV9QUk9DRlMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtNjgqLWF0YXJpLXN5c3Y0Kik6IE5ldyBob3N0LgotCShtNjgqLWNibS1zeXN2NCopOiBVc2UgbTY4a3Y0IGluc3RlYWQgb2YgYW1peC4KLQkqIGhvc3RzL2FtaXguaDogUmVtb3ZlLgotCSogaG9zdHMvbTY4a3Y0Lmg6IE5ldyBmaWxlLCB3YXMgYW1peC5oLgotCi1UaHUgSnVsIDE0IDE1OjEyOjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCwgYmZkX3R5cGUsIHN0cnVjdAotCXJlbG9jX2hvd3RvX3N0cnVjdCwgcmVsb2NfaG93dG9fdHlwZSwgSE9XVE8sIEhPV1RPMik6IENvcGllZAotCWNoYW5nZXMgb3ZlciBmcm9tIGJmZC1pbjIuaCBzbyB0aGV5IGdldCBnZW5lcmF0ZWQgcHJvcGVybHkgbmV4dAotCXRpbWUgc29tZW9uZSBydW5zICJtYWtlIGhlYWRlcnMiLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiB0YXJnZXRzLmMgKG5ldGJzZDUzMl92ZWMsIHBjNTMybWFjaF92ZWMpOiBEZWNsYXJlIGNvbnN0LgotCShtODhrbWFjaDNfdmVjKTogUmVzdG9yZSBkZWxldGVkIGRlY2xhcmF0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IEFscGhhYmV0aXplIHRhcmdldCB2ZWN0b3IgbmFtZXMuCi0KLQkqIGNvbmZpZy9wYzUzMm1hY2gubWg6IE5ldyBmaWxlLgotCShIREVQRklMRVMsIEhERUZJTkVTKTogRGVmaW5lIGhlcmUuCi0JKiBjb25maWcvcGM1MzItbWFjaC5tdCAoSERFUEZJTEVTLCBIREVGSU5FUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvbnMzMmstbmV0YnNkLm10IChIREVQRklMRVMsIEhERUZJTkVTKTogRGVsZXRlZC4KLQotCVN1biBKdWwgMTAgMDA6MDQ6MjAgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIHBjNTMyLW1hY2guYzogTmV3IEZpbGUuIHBjNTMyLW1hY2ggYS5vdXQgZm9ybWF0LgotCi0JKiBuZXRic2Q1MzIuYzogTmV3IGZpbGUuIHBjNTMyLW5ldGJzZDUzMiBhLm91dCBmb3JtYXQuCi0KLQkqIGhvc3RzL3BjNTMybWFjaC5oOiBOZXcgZmlsZS4gcGM1MzItbWFjaCBob3N0IHN1cHBvcnQuCi0KLQkqIGNwdS1uczMyay5jOiBOZXcgZmlsZS4gbnMzMmsgc3VwcG9ydCBjcHUgc3BlY2lmaWMgY29kZSByYXRoZXIKLQl0aGFuIGZvcm1hdCBzcGVjaWZpYyBjb2RlLgotCi0JKiBjb25maWcvcGM1MzItbWFjaC5tdDogTmV3IGZpbGUuIFN1cHBvcnQgZm9yIHBjNTMyLW1hY2ggdGFyZ2V0LgotCi0JKiBjb25maWcvbnMzMmstbmV0YnNkLm10OiBOZXcgZmlsZS4gU3VwcG9ydCBmb3IgbmV0YnNkNTMyIHRhcmdldC4KLQotCSogYW91dC1uczMyay5jLCBhb3V0LW5zMzJrLmg6IE5ldyBmaWxlcyBzdXBwb3J0aW5nIGFvdXQgZm9ybWF0IGZvcgotCW5zMzJrIHNlcmllcy4gCi0KLQkqIHRhcmdldHMuYzogQWRkIG5ldGJzZDUzMl92ZWMgYW5kIHBjNTMybWFjaGFvdXRfdmVjIGludG8KLQliZmRfdGFyZ2V0X3ZlY3RvciBhcnJheS4gTW92ZSBuZXRic2QzODZfdmVjIHRvIGFscGhhYmV0aWMgb3JkZXIKLQlsb2NhdGlvbi4KLQotCSogcmVsb2MuYyAoX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKSBBZGQgc3VwcG9ydCBmb3IKLQlzcGVjaWFsX2Z1bmN0aW9uMSBpbiBob3d0by4KLQotCSogbGliYW91dC5oOiBhZGQgTV9OUzMyMDMyLCBNX05TMzI1MzIsIE1fNTMyX05FVEJTRCBlbnRyaWVzIGluCi0JbWFjaGluZV90eXBlIGVudW0uCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIHBjNTMybWFjaF92ZWMgYW5kIG5ldGJzZDUzMl92ZWMgZW50cmllcy4KLQotCSogY29uZmlnLmJmZDogYWRkIHBjNTMybWFjaCBob3N0IGVudHJpZXMuIFVzZSBmb3IgYm90aAotCW5zMzJrLXBjNTMyLW1hY2ggYW5kIG5zMzJrLXBjNTMyLW5ldGJzZC4KLQotCSogY29uZmlnLmJmZDogaXQgZG9lc24ndCB3b3JrIHRvIHVzZSBpMzg2LW1hY2gzIGZvciBuczMyayotKi1tYWNoLgotCWFkZCBuczMyay1wYzUzMi1tYWNoKiBhbmQgbnMzMmstKi1uZXRic2QqIGVudHJpZXMuCi0KLQkqIGJmZC1pbjIuaDogQWRkIG5zMzJrIHNwZWNpZmljIHJlbG9jYXRpb25zIHRvIGJmZF9yZWxvY19jb2RlX3JlYWwKLQllbnVtLgotCi0JKiBiZmQtaW4yLmg6IEFkZCBzcGVjaWFsX2Z1bmN0aW9uMSB0byBzdHJ1Y3QgaG93dG8uIENoYW5nZSBIT1dUTwotCWFuZCBORVdIT1dUTyBtYWNyb3MgdG8gbWFrZSBzcGVjaWFsX2Z1bmN0aW9uMSBOVUxMLiBOZXd3IEhPV1RPMgotCW1hY3JvLgotCi0JKiBiZmQtaW4yLmg6IFNwbGl0IGRlZmluaXRpb24gb2Ygc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdAotCWFuZCBjb3JyZXNwb25kaW5nIHR5cGVkZWYgaW50byB0d28gc3RhdGVtZW50cy4KLQotCSogYmZkLWluMi5oOiBBZGQgZW50cnkgYmZkX2FyY2hfbnMzMmsgdG8gYmZkX2FyY2hpdGVjdHVyZSBlbnVtLgotCi0JKiBhcmNodXJlcy5jOiBBZGQgYmZkX25zMzJrX2FyY2ggcHJvdG90eXBlLCBhbmQgZW50cnkgaW4KLQlhcmNodXJlc19pbml0X3RhYmxlLiAKLQotCSogYW91dHguaCAoYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBBbGxvdyBmb3IgdGFyZ2V0IGRlcGVuZGVudAotCU1ZX3B1dF9yZWxvYyBtYWNyby4gQWxsb3cgZm9yIHRhcmdldCBkZXBlbmRlbnQgc3BlY2lhbF9mdW5jdGlvbjEKLQl0byBhcHBseSB0aGUgcmVsb2NhdGlvbi4gCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IEFsbG93IGZvciB0YXJnZXQKLQlkZXBlbmRlbnQgZGV0ZXJtaW5hdGlvbiBvZiByZWxvYyBob3d0by4gQWxsb3cgZm9yIHRhcmdldCBkZXBlbmRlbnQKLQlzcGVjaWFsX2Z1bmN0aW9uMSB0byBhcHBseSB0aGUgcmVsb2NhdGlvbi4KLQotCSogYW91dHguaCAoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGV0ZWN0IGJzcyBhbmQgcmV0dXJuIDAuCi0KLQkqIGFvdXR4LmggKHNsdXJwX3JlbG9jX3RhYmxlKTogRGV0ZWN0IGJzcyBhbmQgc3VjY2VzZnVsbHkgcmVhZAotCXplcm8gcmVsb2MgZW50cmllcy4KLQotCSogYW91dHguaCAobWFjaGluZV90eXBlKTogQWRkIGJmZF9hcmNoX25zMzJrIGNhc2UuCi0KLQkqIGFvdXR4Lmg6IFN0YXQgdG8gZGV0ZXJtaW5lIGV4ZWN1dGFibGUgc3RhdHVzIGlmIFNUQVRfRk9SX0VYRUMKLQlpcyBkZWZpbmVkIChub3QganVzdCBNQUNIKS4gVXNlIGZzdGF0IGluc3RlYWQgb2Ygc3RhdCBhbmQgY2hlY2sKLQlmb3IgZnN0YXQgZXJyb3IuCi0KLQkqIGFvdXR4Lmg6IEFsbG93IHRhcmdldCBkZXBlbmRlbnQgc3dhcF9zdGRfcmVsb2Nfe2luLG91dH0uCi0KLQkqIGFvdXR4Lmg6IEFsbG93IENUT1JTIHJlbG9jIGluZm8gdG8gYmUgaW4gdGFyZ2V0IGRlcGVuZGVudCByZWxvYwotCXRhYmxlLgotCi0JKiBhb3V0LXRhcmdldC5oOiBBcHBseSBTV0FQX01BR0lDIChpZiBkZWZpbmVkKSBhZnRlcgotCXN3YXBfZXhlY19oZWFkZXJfaW4sIG90aGVyd2lzZSB3ZSBoYXZlIG1hZ2ljIGluIHRoZSB3cm9uZyBvcmRlci4KLQotVGh1IEp1bCAxNCAxMTo0NzoyNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IEhhdmUgbGVhZGluZyB1bmRlcnNjb3Jlcy4KLQotVHVlIEp1bCAxMiAxMjowODoxMCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFpeDM4Ni1jb3JlLmMsIGFvdXRmMS5oLCBjaXNjby1jb3JlLmMsIGVsZmNvZGUuaCwgaHBwYWJzZC1jb3JlLmMsCi0JaHB1eC1jb3JlLmMsIGlyaXgtY29yZS5jLCBseW54LWNvcmUuYywgb3NmLWNvcmUuYywgcHRyYWNlLWNvcmUuYywKLQlyczYwMDAtY29yZS5jLCB0cmFkLWNvcmUuYzogIFJlbW92ZSBTRUNfQUxMT0MgZmxhZyBmcm9tIC5yZWcKLQlzZWN0aW9ucywgLnJlZyBzZWN0aW9ucyBhcmUgbm90IGFsbG9jYXRlZCBhbmQgY29udGFpbiBkZWJ1ZwotCWluZm9ybWF0aW9uIG9ubHkuCi0JKiBvc2YtY29yZS5jIChtYWtlX2JmZF9hc2VjdGlvbiwgb3NmX2NvcmVfY29yZV9maWxlX3ApOiAgVXNlCi0JYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgaW5zdGVhZCBvZiBidWlsZGluZyB1bmlxdWUgc2VjdGlvbiBuYW1lcy4KLQotVHVlIEp1bCAxMiAxMTo0MToyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4pOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luLCBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0KTogRGVjbGFyZS4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9hcmdzX2hhc2hfdGFibGVfaW5pdCk6IENvcnJlY3QgY2FzdC4KLQotCSogYW91dC1lbmNhcC5jIChBUkNIKTogRG9uJ3QgZGVmaW5lLiAgT2Jzb2xldGUuCi0JKiBhb3V0MC5jLCBhb3V0eC5oLCBnZW4tYW91dC5jLCBocDMwMGJzZC5jLCBocDMwMGhwdXguYzogTGlrZXdpc2UuCi0JKiBpMzg2YW91dC5jLCBpMzg2YnNkLmMsIGkzODZkeW5peC5jLCBpMzg2bGludXguYzogTGlrZXdpc2UuCi0JKiBpMzg2bHlueC5jLCBtNjhrbHlueC5jLCBtaXBzYnNkLmMsIG5ldGJzZDM4Ni5jOiBMaWtld2lzZS4KLQkqIG5ld3NvczMuYywgc3BhcmNseW54LmMsIHN1bm9zLmM6IExpa2V3aXNlLgotCi1Nb24gSnVsIDExIDIwOjA4OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChTVERfU0VDVElPTik6IE1ha2UgdGhlIHNpeHRoIGFyZ3VtZW50IGJvb2xlYW4sIG5vdAotCXRoZSBzZXZlbnRoLiAgRnJvbSBnYXJ5QHR1dmEucGFjc2VtaS5vei5hdSAoZ2FyeSBrb3BmZikuCi0KLVN1biBKdWwgMTAgMDk6MTI6MDIgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChiZmRfZnJlZV9jYWNoZWRfaW5mbyk6IENoYW5nZSBuYW1lIG9mIEZSRUUgdG8gQkZDSV9GUkVFCi0JaW4gb3JkZXIgbm90IHRvIGNvbGxpZGUgd2l0aCBMeW54T1MncyBkZWZpbml0aW9uIG9mIEZSRUUgaW4KLQkvdXNyL2luY2x1ZGUvc3lzL3Byb2MuaAotCi1UaHUgSnVsICA3IDE0OjE4OjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IGNsb2JiZXIgdGhlIHJlbG9jYXRpb24KLQl2YWx1ZSBmb3IgY29mZi1JbnRlbC1saXR0bGUgb3IgY29mZi1JbnRlbC1iaWcuICBIYWNrIHVwb24gaGFjay4KLQotVGh1IEp1bCAgNyAxMDoxMDozNCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX3N0ZCk6ICBBZGQgZW50cnkgZm9yIEdPVCByZWxvY2F0aW9ucwotCXdoaWNoIGFyZSBwcmVzZW50IGluIHN1bjMgc2hhcmVkIGxpYnJhcmllcywgdG8gYXZvaWQgYXNzZXJ0aW9ucwotCXdoZW4gcmVhZGluZyB0aGUgZHluYW1pYyByZWxvY2F0aW9ucy4KLQotVGh1IEp1bCAgNyAxMDoxOToyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKFJfSFBQQV9DT01QTEVYKTogRml4IGR1bWIgdHlwby4gCi0KLVdlZCBKdWwgIDYgMTk6MjE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zeXN2NC5oIChxc29ydCwgc3RydG9sKTogRG9uJ3QgZGVjbGFyZS4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19vdXRwdXRfc3ltKTogRG9uJ3QgY2FsbCBvdXRwdXRfc3ltYm9sX2hvb2sKLQlpZiBpdCBpcyBOVUxMLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBBZGQgaWdub3JlZCBpbmZvCi0JYXJndW1lbnQgdG8gY29ycmVzcG9uZCB0byByZWNlbnQgbGliZWxmLmggY2hhbmdlLgotCi1XZWQgSnVsICA2IDAwOjQ4OjU3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9ta29iamVjdF9ob29rKTogIE5ldyBob29rIHRvCi0JYWRkaXRpb25hbGx5IGNvcHkgb2JqZWN0IHR5cGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYWxwaGEgZmlsZQotCWhlYWRlciB0byB0aGUgQkZEIGZsYWdzLgotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiAgVXNlIGl0LgotCShlY29mZmFscGhhX2xpdHRsZV92ZWMpOiAgQWRkIERZTkFNSUMgdG8gb2JqZWN0X2ZsYWdzLgotCSogYW91dDY0LmM6ICBGaXggdHlwbyBpbiBjb25kaXRpb25hbCBRTUFHSUMgZGVmaW5pdGlvbi4KLQotV2VkIEp1bCAgNiAwMDoxMzoxNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYWJzZC1jb3JlLmMgKGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCk6IFNhbml0eSBjaGVjayB0aGUKLQl2YWx1ZSBvZiBjbGlja3N6IHRvIGhlbHAgd2VlZCBvdXQgbm9uIEhQUEEgQlNEIGNvcmUgZmlsZXMuCi0KLVR1ZSBKdWwgIDUgMTM6MjY6MDIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JTWFjaCAzIHN1cHBvcnQuCi0JKiBjb25maWcuYmZkIChtODgqLSotbWFjaDMqLCBtaXBzKi1kZWMtbWFjaDMqLCBtaXBzKi0qLW1hY2gzKik6Ci0JTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNF04Ni0qLW1hY2gzKiwgbnMzMmstKi1tYWNoMyopOiBSZWNvZ25pemUKLQkibWFjaDMiIGluc3RlYWQgb2YgIm1hY2giLgotCShtODgqLSotbWFjaDMqLCBtaXBzKi1kZWMtbWFjaDMqLCBtaXBzKi0qLW1hY2gzKik6IE5ldyBob3N0cy4KLQkqIHRhcmdldHMuYyAobTg4a21hY2gzX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBpMzg2bWFjaDNfdmVjIGFuZCBtODhrbWFjaDNfdmVjLCBidXQKLQlpbnNpZGUgI2lmIDAuCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApIFtNQUNIXTogUmVjb2duaXplIGV4ZWN1dGFibGVzIGJ5Ci0JY2hlY2tpbmcgZm9yIGV4ZWN1dGUgcGVybWlzc2lvbiwgaW5zdGVhZCBvZiBsb29raW5nIGF0IGVudHJ5Ci0JcG9pbnQuCi0JKiBpMzg2bWFjaDMuYzogVXBkYXRlLCBkZWZpbmUgTUFDSCwgTl9UWFRPRkYsIE5fVFhUQUREUiwKLQlOX1NIQVJFRF9MSUIsIGRvbid0IGluY2x1ZGUgYW91dC8qLmggZmlsZXMsIGV0Yy4KLQkqIG04OGttYWNoMy5jOiBOZXcgZmlsZSwgbTg4ayBNYWNoIDMgdGFyZ2V0LgotCSogY29uZmlnL204OGstbWFjaDMubXQsCWNvbmZpZy9taXBzLW1hY2gzLm10OiBOZXcgZmlsZXMsIHRhcmdldAotCW1ha2VmaWxlIGZyYWdtZW50cy4KLQkqIGNvbmZpZy9pMzg2bWFjaDMubWgsIGNvbmZpZy9tODhrbWFjaDMubWgsIGNvbmZpZy9taXBzbWFjaDMubWg6Ci0JTmV3IGZpbGVzLCBob3N0CW1ha2VmaWxlIGZyYWdtZW50cy4KLQkqIGhvc3RzL204OGttYWNoMy5oLCBob3N0cy9taXBzbWFjaDMuaDogTmV3IGZpbGVzLCBob3N0IGRlZmluaXRpb25zLgotCi1UdWUgSnVsICA1IDEzOjU2OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogR2V0IGFsaWdubWVudCBvZiBjb21tb24gc3ltYm9sIGZyb20KLQlzdF92YWx1ZSBmaWVsZCBvZiBzYXZlZCBFTEYgc3ltYm9sIGluZm9ybWF0aW9uLCBpZiB0aGVyZSBpcyBhbnkuCi0KLU1vbiBKdWwgIDQgMTk6MTM6MzIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChSX0hQUEFfQ09NUExFWCk6IERlZmluZS4KLQkqIGVsZjMyLWhwcGEuaCAoUl9IUFBBX0NPTVBMRVgpOiBEZWZpbmUuCi0JKGVsZjMyX2hwcGFfcmVsb2NfdHlwZSk6IERlbGV0ZSBSX1BBUklTQ19TVFVCX0NBTExfMTcuCi0KLUZyaSBKdWwgIDEgMTI6MDc6NDEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIFN1cHBvcnQgY29kZSBmb3IgZW5hYmxpbmcgdGhlIG5ldyBzdHlsZSBsaW5rZXIgZm9yIFBBIEVMRi4KLQkqIGVsZmNvZGUuaCAoc3dhcF9zeW1ib2xfaW4sIHN3YXBfc3ltYm9sX291dCk6IEV4dGVybmFsaXplLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUGFzcyBsaW5rX2luZm8gdG8KLQl0aGUgYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyBob29rLgotCShiZmRfZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFBhc3MgTlVMTCBmb3IgbmV3IGxpbmtfaW5mbwotCWFyZ3VtZW50IHRvIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgaG9vay4KLQkoZWxmX2xpbmtfb3V0cHV0X3N5bSk6IEFjY2VwdCBuZXcgImlucHV0X3NlY3Rpb24iIGFyZ3VtZW50IGZvcgotCXRoZSBzeW1ib2xzJ3MgaW5wdXQgc2VjdGlvbi4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuICBDYWxsIHRoZQotCWxpbmtfb3V0cHV0X3N5bWJvbF9ob29rIGlmIGl0J3MgZGVmaW5lZC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogQ2FsbCB0aGUgZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBob29rIGlmCi0JaXQncyBkZWZpbmVkLgotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogRGVjbGFyZS4KLQkoZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IEFkZCBuZXcgImluZm8iIGFyZ3VtZW50LgotCShlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBQcm92aWRlCi0JYSBkZWZhdWx0IGRlZmluaXRpb24uCi0JKGVsZjMyX2JlZCk6IEFkZCBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vay4KLQkqIGVsZjY0LXRhcmdldC5oOiBMaWtld2lzZS4KLQkKLQkqIE1ham9yIHJld29yayBvZiB0aGUgUEEgRUxGIGNvZGUuICBVc2VzIHRoZSBuZXcgc3R5bGUgQkZECi0JbGlua2VyLCBtYWpvciBjbGVhbnVwcy4KLQkqIGhwcGFfc3R1YnMuaDogUmV3cml0ZSBmcm9tIHNjcmF0Y2guICBNdWNoIHNtYWxsZXIgYW5kIHNpbXBsZXIuCi0JKiBlbGYzMi1ocHBhLmg6IERlbGV0ZSBhbGwgc3ltYm9sIGV4dGVuc2lvbiByZWxhdGVkIGNvZGUuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IERlbGV0ZSBkZWNsLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMsIGVsZjMyX2hwcGFfYnVpbGRfc3R1YnMpOiBOZXcgZGVjbHMuCi0JKiBlbGYzMi1ocHBhLmM6IFN5bWJvbCBleHRlbnNpb24gc3R1ZmYgbW92ZWQgZm9ybSBlbGYzMi1ocHBhLmgKLQlpbnRvIGVsZjMyLWhwcGEuYy4gIERvIG5vdCBpbmNsdWRlIGFvdXQ2NC5oLgotCSh0eXBkZWYgaHBwYV9zdHViX3R5cGUpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfc3R1Yl9uYW1lX2xpc3Rfc3RydWN0KTogRGVsZXRlLgotCShlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb25fc3RydWN0KTogRGVsZXRlLgotCShhcmdfcmVsb2NfdHlwZSk6IFVzZSBzaW1wbGVyIGVudW1lcmF0aW9ucy4gIEFsbCByZWZlcmVuY2VzIGNoYW5nZWQuCi0JKGFyZ19sb2NhdGlvbiwgYXJnX3JlbG9jX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9zeW1leHRuX21hcF9zdHJ1Y3QpOiBEZWxldGUuCi0JKGdldF9zeW1ib2xfdmFsdWUpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfZ2V0X3N5bV9leHRuKTogRGVsZXRlLgotCShmaW5kX3N0dWJzLCBuZXdfc3R1YnMsIHR5cGVfb2ZfbWlzbWF0Y2gpOiBEZWxldGUuCi0JKGZpbmRfc3R1Yl9ieV9uYW1lLCBhZGRfc3R1Yl9ieV9uYW1lKTogRGVsZXRlLgotCShocHBhX2VsZl9zdHViX2ZpbmlzaCwgaHBwYV9lbGZfc3R1Yl9yZWxvYyk6IERlbGV0ZS4KLQkoaHBwYV9lbGZfYXJnX3JlbG9jX25lZWRlZCk6IFJlbmFtZWQuICBTaW1wbGlmeS4KLQkoaHBwYV9lbGZfYnVpbGRfbGlua2VyX3N0dWIsIGhwcGFfZWxmX2NyZWF0ZV9zdHViX3NlYyk6IERlbGV0ZS4KLQkoaHBwYV9lbGZfbG9uZ19icmFuY2hfbmVlZGVkX3ApOiBEZWxldGUuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IERlbGV0ZS4KLQkoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZyk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZyk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfZmFrZV9zZWN0aW9ucyk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERlbGV0ZS4KLQkoTkVXX0lOU1RSVUNUSU9OKTogRGVsZXRlLgotCShDVVJSRU5UX1NUVUJfT0ZGU0VUKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfc2l6ZV9zeW1leHQpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9hZGRfc3ltYm9sX2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfbmFtZV9vZl9zdHViKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX3NpemVfb2Zfc3R1Yik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9idWlsZF9vbmVfc3ViKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX2J1aWxkX3N0dWJzKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBOZXcgZnVuY3Rpb24uCi0JKGxpbmtlciwgc3R1YiBhbmQgYXJndW1lbnQgaGFzaCB0YWJsZXMpOiBBZGQgYXBwcm9wcmlhdGUKLQlzdHJ1Y3R1cmVzLCBkZWZpbml0aW9ucyBhbmQgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBhbGwgdGhyZWUKLQloYXNoIHRhYmxlcy4KLQkoaHBwYV9lbGZfcmVsb2NhdGVfaW5zbik6IERvbid0IG5lZWQgYXJndW1lbnQgbG9jYXRpb24gaW5mb3JtYXRpb24KLQlpbiB0aGlzIGZ1bmN0aW9uLgotCShhZGRfZW50cnlfdG9fc3ltZXh0X2NoYWluKTogQWNjZXB0IGEgc3ltYm9sJ3MgYXJndW1lbnQgbG9jYXRpb24KLQlpbmZvcm1hdGlvbiByYXRoZXIgdGhhbiB0aGUgc3ltYm9sIGl0c2VsZi4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogU2ltcGxpZnkuCi0JKGhwcGFfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU3R1YiBzZWN0aW9uIGlzIG5vIGxvbmdlciBzcGVjaWFsLgotCShocHBhX2VsZl9yZWxvYyk6IEdyZWF0bHkgc2ltcGxpZnkuCi0JKGVsZjMyX2hwcGFfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IEFjY2VwdCBsaW5rX2luZm8gYXJndW1lbnQuCi0JSGFuZGxlIGJlaW5nIGNhbGxlZCBmcm9tIHRoZSBCRkQgYmFja2VuZCBsaW5rZXIuCi0JKGVsZjMyX2hwcGFfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTm8gbG9uZ2VyIGNhbGwgc3R1Yl9maW5pc2guCi0JCi1Nb24gSnVuIDI3IDE4OjA3OjA2IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IFB1dCBpbiBwYXJlbnMgdG8gZ2V0Ci0JcHJlY2VkZW5jZSByaWdodC4KLQotU3VuIEp1biAyNiAxODowODoyOSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliZWxmLmggKHJlbG9jYXRlX3NlY3Rpb24pOiBOZXcgYXJndW1lbnQgIm91dHB1dF9uYW1lcyIgYWRkZWQKLQl0byBwcm90b3R5cGUuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IE5ldyBhcmd1bWVudCAib3V0cHV0X25hbWVzIgotCWFkZGVkIHRvIHByb3RvdHlwZSBvZiByZWxvY2F0ZV9zZWN0aW9uLiAgUGFzcyB0aGUgb3V0cHV0IHN5bWJvbAotCW5hbWVzIHRvIHJlbG9jYXRlX3NlY3Rpb24uCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UgIm91dHB1dF9uYW1lcyIgdG8KLQlkZXRlcm1pbmUgdGhlIG5hbWUgb2YgYSBsb2NhbCBzeW1ib2wuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotRnJpIEp1biAyNCAwODoxNTo0MiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQlBZGQgU29sYXJpcyBCQ1AgKHRoZSBwYXJ0IG9mIFNvbGFyaXMgd2hpY2ggYWxsb3dzIGl0IHRvIHJ1bgotCVN1bk9TNCBhLm91dCBmaWxlcykgY29yZSBmaWxlIGhhbmRsaW5nLgotCSogYW91dGYxLmggKGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUsIHN3YXBjb3JlX3NvbGFyaXNfYmNwKToKLQlOZXcgc3RydWN0dXJlIGFuZCBpdHMgc3dhcCBpbiBmdW5jdGlvbi4KLQkoaW50ZXJuYWxfc3Vub3NfY29yZSk6ICBOZXcgbWVtYmVyIGNfZGF0YV9hZGRyLCB0byByZWNlaXZlIHRoZQotCXN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VjdGlvbiBpbiB0aGUgY29yZSBmaWxlLgotCShzd2FwY29yZV9zdW4zLCBzd2FwY29yZV9zcGFyYywgc3Vub3M0X2NvcmVfZmlsZV9wKTogIFVzZSBpdC4KLQkoc3Vub3M0X2NvcmVfZmlsZV9wKTogIFJlY29nbml6ZSBTb2xhcmlzIEJDUCBjb3JlIGZpbGUuCi0JKHN1bm9zNF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiAgQWx3YXlzIGluZGljYXRlIG1hdGNoCi0JZm9yIFNvbGFyaXMgQkNQIGNvcmUgZmlsZXMuCi0KLVRodSBKdW4gMjMgMTU6MzE6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBzaGFyZWQgbGlicmFyaWVzLCBmcm9tIEVyaWMKLQlZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBJZiBEWU5BTUlDLCBzZXQgZV90eXBlIHRvIEVUX0RZTi4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LAotCWNyZWF0ZSBkeW5hbWljIHNlY3Rpb25zIGZvciBmaXJzdCBpbnB1dCBCRkQgd2l0aCB0aGUgcmlnaHQgZm9ybWF0LgotCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGNyZWF0ZSAuaW50ZXJwIHNlY3Rpb24KLQlpZiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBTa2lwIGR5bmFtaWMgc2VjdGlvbnMgaW4gaW5wdXQgZmlsZS4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogSWYgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgaXQncyBPSyBmb3IKLQlkeW5vYmogdG8gaGF2ZSBzZWN0aW9ucyB3aGljaCBhcmUgbm90IFNFQ19JTl9NRU1PUlkuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgc2V0IC5pbnRlcnAKLQlzZWN0aW9uIGlmIG5vdCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IERvbid0IHNldCBEWU5BTUlDIGp1c3QgYmVjYXVzZSB0aGVyZQotCWlzIGFuIFNIVF9EWU5BTUlDIHNlY3Rpb24uCi0KLQkqIGNmLWkzODZseW54LmMgKGkzODZjb2ZmX3ZlYyk6IERvbid0IGluY2x1ZGUgRFlOQU1JQyBpbgotCW9iamVjdF9mbGFncy4KLQkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IExpa2V3aXNlLgotCSogaHBwYWJzZC1jb3JlLmMgKGhwcGFic2RfY29yZV92ZWMpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBEb24ndCBzZXQgU0VDX1JFTE9DCi0JanVzdCBiZWNhdXNlIERZTkFNSUMgaXMgc2V0LgotCi1UaHUgSnVuIDIzIDEyOjUzOjQxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLS13aXRoLXRhcmdldHMgdG8gLS1lbmFibGUtdGFyZ2V0cyBhbmQKLQktLXdpdGgtNjQtYml0LWJmZCB0byAtLWVuYWJsZS02NC1iaXQtYmZkLgotCSogTWFrZWZpbGUuaW4sIG1wdy1tYWtlLmluLCB0YXJnZXRzLmM6IENoYW5nZSBjb21tZW50cy4KLQotV2VkIEp1biAyMiAxNzo1OTo1OSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjLSotZWxmKik6IE5ldyB0YXJnZXQsIGp1c3QgbGlrZQotCXBvd2VycGMtKi1zeXN2NCouCi0KLQkqIGxpbmtlci5jIChGQUlMKTogVW5kZWZpbmUgbWFjcm8gYmVmb3JlIGRlZmluaW5nIGFzIGVudW0uCi0KLVdlZCBKdW4gMjIgMTA6NTI6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IEluaXRpYWxpemUKLQlwYXNzIGZyb20gYWJmZC0+YXJjaGl2ZV9wYXNzLCBhbmQgc2F2ZSBpdCB0aGVyZSBhcyB3ZWxsLgotCi0JKiBoYXNoLmMgKGJmZF9oYXNoX2FsbG9jYXRlKTogRG9uJ3QgY2FsbCBiZmRfc2V0X2Vycm9yIGlmCi0Jb2JzdGFja19hbGxvYyByZXR1cm5zIE5VTEwgdW5sZXNzIHRoZSBzaXplIGlzIG5vbi16ZXJvLgotCi0JKiBsaW5rZXIuYyAoYXJjaGl2ZV9oYXNoX2FsbG9jYXRlKTogRGVmaW5lLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogVXNlIGFyY2hpdmVfaGFzaF9hbGxvY2F0ZQotCXJhdGhlciB0aGFuIG9ic3RhY2tfYWxsb2MsIGZvciBjbGFyaXR5LgotCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBDb3JyZWN0LgotCi0JKiBhb3V0NjQuYyAoQk1BR0lDLCBRTUFHSUMpOiBEZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4gIEZyb20KLQlQZXRlciBTY2hhdWVyIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4uCi0KLQlMaW51eCBaTUFHSUMgc3VwcG9ydCBmcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIGZpZWxkIHptYWdpY19kaXNrX2Jsb2NrX3NpemUuCi0JKiBhb3V0LXRhcmdldC5oIChNWShjYWxsYmFjaykpOiBPbmx5IHNldCBhbGlnbm1lbnQgYWNjb3JkaW5nIHRvCi0JYXJjaGl0ZWN0dXJlIGlmIHRoZSBzZWN0aW9uIHNpemVzIGFyZSBhbGlnbmVkIHRvIHRoYXQgYWxpZ25tZW50LAotCWZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCShNWShzZXRfc2l6ZXMpKTogSW5pdGlhbGl6ZSB6bWFnaWNfZGlza19ibG9ja19zaXplIGZpZWxkLgotCSogYW91dHguaCAoYWRqdXN0X3pfbWFnaWMpOiBTZXQgenRpaCBpZiB1c2luZyBxX21hZ2ljX2Zvcm1hdC4gIFNldAotCXRleHQgc2VjdGlvbiBmaWxlcG9zIHRvIHptYWdpY19kaXNrX2Jsb2NrX3NpemUgaWYgbm90IHp0aWguICBVc2UgYQotCWRpZmZlcmVudCBwYWRkaW5nIGFsZ29yaXRobSBpZiBub3QgenRpaC4KLQkqIGkzODZsaW51eC5jIChNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcik6IERvbid0IGRlZmluZS4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBKdXN0IHNraXAgTl9TVEFCIGFuZCBOX0ZOCi0gICAgICAgIHN5bWJvbHM7IGRvbid0IGxvb2sgdGhlbSB1cCBpbiB0aGUgaGFzaCB0YWJsZS4gIEZyb20KLSAgICAgICAgcmFscGhjQHB5cmFtaWQuY29tIChSYWxwaCBDYW1wYmVsbCkuCi0KLVR1ZSBKdW4gMjEgMTE6NDc6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWdvMzIuYyAoZ28zMmNvZmZfYXJjaGl2ZV9wKTogUmVtb3ZlIHVudXNlZCBmdW5jdGlvbi4KLQotCSogc2VjdGlvbi5jIChiZmRfYWJzX3NlY3Rpb24pOiBNYWtlIGNvbnN0LgotCShiZmRfYWJzX3NlY3Rpb25fcHRyLCBiZmRfaXNfYWJzX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGJmZF91bmRfc2VjdGlvbik6IE1ha2UgY29uc3QuCi0JKGJmZF91bmRfc2VjdGlvbl9wdHIsIGJmZF9pc191bmRfc2VjdGlvbik6IERlZmluZS4KLQkoYmZkX2NvbV9zZWN0aW9uKTogTWFrZSBjb25zdC4KLQkoYmZkX2NvbV9zZWN0aW9uX3B0cik6IERlZmluZS4KLQkoYmZkX2luZF9zZWN0aW9uKTogTWFrZSBjb25zdC4KLQkoYmZkX2luZF9zZWN0aW9uX3B0ciwgYmZkX2lzX2luZF9zZWN0aW9uKTogRGVmaW5lLgotCShiZmRfYWJzX3N5bWJvbCwgYmZkX2NvbV9zeW1ib2wpOiBNYWtlIGNvbnN0LgotCShiZmRfdW5kX3N5bWJvbCwgYmZkX2luZF9zeW1ib2wpOiBMaWtld2lzZS4KLQkoZ2xvYmFsX3N5bXMpOiBDYXN0IGluaXRpYWxpemF0aW9uIG9mIHNlY3Rpb24gZmllbGQuCi0JKFNURF9TRUNUSU9OKTogRGVmaW5lIGFzIGNvbnN0LCBhbmQgY2FzdCBpbml0aWFsaXphdGlvbnMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBNYW55IGZpbGVzOiBDaGFuZ2UgdXNlcyBvZiBiZmRfYWJzX3NlY3Rpb24sIGV0Yy4sIHRvIHVzZQotCWJmZF9hYnNfc2VjdGlvbl9wdHIgb3IgYmZkX2lzX2Fic19zZWN0aW9uLCBldGMuCi0KLU1vbiBKdW4gMjAgMTE6MDY6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYW55IGZpbGVzOiBjaGFuZ2UgYWxsIGJmZF90YXJnZXQgdmVjdG9ycyB0byBiZSBjb25zdC4gIENoYW5nZQotCWFsbCB1c2VzIG9mIGJmZF90YXJnZXQgKiB0byBiZSBjb25zdCBiZmRfdGFyZ2V0ICouICBDaGFuZ2UKLQliZmRfdGFyZ2V0X3ZlY3RvciBhbmQgYmZkX2RlZmF1bHRfdmVjdG9yIGFycmF5cyB0byBiZSBjb25zdAotCWJmZF90YXJnZXQgKiBjb25zdCAqLgotCi0JKiBlY29mZi5jLCBsaWJlY29mZi5oLCBlY29mZnN3YXAuaCwgY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYywKLQllbGYzMi1taXBzLmM6IFJlbmFtZWQgYWxsIGV4dGVybmFsbHkgdmlzaWJsZSBFQ09GRiByb3V0aW5lcyB3aGljaAotCWFyZSBsb2NhbCB0byBCRkQgdG8gc3RhcnQgd2l0aCBfYmZkX2Vjb2ZmIGluc3RlYWQgb2YganVzdCBlY29mZi4KLQotCSogZWNvZmYuYyAoZWNvZmZfc3dhcF90aXJfaW4pOiBDaGFuZ2UgaW5wdXQgYXJndW1lbnQgdG8gY29uc3QuCi0JKGVjb2ZmX3N3YXBfdGlyX291dCk6IExpa2V3aXNlLgotCShlY29mZl9zd2FwX3JuZHhfaW4sIGVjb2ZmX3N3YXBfcm5keF9vdXQpOiBMaWtld2lzZS4KLQkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IEFkZCBuZXcgYXJndW1lbnRzIHRvIGNvcnJlc3BvbmQgdG8KLQlyZWFkX2RlYnVnX2luZm8gZW50cnkgcG9pbnQgaW4gZWNvZmZfZGVidWdfc3dhcCBzdHJ1Y3R1cmUuCi0JQ2hhbmdlIGFsbCBjYWxscy4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBDaGFuZ2UgZGVjbGFyYXRpb24uCi0JKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF90aXJfaW4sIGVjb2ZmX3N3YXBfdGlyX291dCk6IERlY2xhcmUuCi0JKGVjb2ZmX3N3YXBfcm5keF9pbiwgZWNvZmZfc3dhcF9ybmR4X291dCk6IERlY2xhcmUuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3Ci0JZWNvZmZfZGVidWdfc3dhcCBmaWVsZHMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogVW5kZWZpbmUgUkVBRC4KLQkobWlwc19lbGZfZWNvZmZfZGVidWdfc3dhcCk6IEluaXRpYWxpemUgbmV3IGVjb2ZmX2RlYnVnX3N3YXAKLQlmaWVsZHMuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9iaWdtaXBzX3ZlYyk6IFVzZSBlY29mZi5vIGFuZAotCWVjb2ZmbGluay5vLgotCShiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMpOiBMaWtld2lzZS4KLQkoZWNvZmZfYmlnX3ZlYywgZWNvZmZfbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgotCShlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IFJlbW92ZSBlY29mZi5vIGFuZCBlY29mZmxpbmsuby4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWNvZmYubyBhbmQgZWNvZmZsaW5rLm8uCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IENoZWNrIGZsYXZvdXIgb2Ygc3ViLCBub3QgYWJmZCwKLQl3aGVuIGNvbXB1dGluZyByZWxvYyBzaXplcy4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKLQk8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IHRyeSB0byBjb21wdXRlIG1heGltdW0KLQlyZWxvYyBjb3VudCBvciBzaXplIGZvciBhIG5vbi1FTEYgZmlsZS4KLQotCSogbWlwc2JzZC5jIChNWV9maW5hbF9saW5rX2NhbGxiYWNrKTogRGVmaW5lIHRvIGF2b2lkIHdhcm5pbmcuCi0KLQkqIGhwMzAwaHB1eC5jIChNWV9maW5hbF9saW5rX2NhbGxiYWNrKTogRGVmaW5lIHRvIGF2b2lkIHdhcm5pbmcuCi0JKEJNQUdJQywgUU1BR0lDKTogRGVmaW5lOyB1c2VkIGJ5IGFvdXR4LmguCi0JKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBDaGFuZ2UgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncwotCWNhbGxzIHRvIHVzZSBuZXcgcGFyYW1ldGVycy4KLQotRnJpIEp1biAxNyAxNDo0NTozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IFNldCB0aGUgYWxpZ25tZW50cyBvZiB0aGUgdGV4dCwKLQlkYXRhIGFuZCBic3Mgc2VjdGlvbnMgYWZ0ZXIgZGV0ZXJtaW5pbmcgdGhlIGFyY2hpdGVjdHVyZS4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBUcmVhdCBhIGNvbW1vbiBzeW1ib2wgZnJvbSBhCi0JZHluYW1pYyBvYmplY3QgYXMgYmVpbmcgaW4gdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgb2JqZWN0LCByYXRoZXIKLQl0aGFuIGFzIGJlaW5nIHVuZGVmaW5lZC4KLQotRnJpIEp1biAxNyAxMToxNjo1MCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliaHBwYS5oIChiZmRfaHBwYV9pbnNuMmZtdCwgaHBwYV9yZWJ1aWxkX2luc24pOiBNYWtlIElOTElORS4KLQotCSogZWxmMzItaHBwYS5oIChlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogRGVsZXRlIGRlY2wuCi0KLVRodSBKdW4gMTYgMjM6MzY6MjMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgdHJ5IHRvIHJlYWQgbG9jYWwgc3ltYm9scwotCWlmIHRoZXJlIGFyZW4ndCBhbnkgaW4gdGhlIGlucHV0IGZpbGUuCi0KLVRodSBKdW4gMTYgMTQ6MjU6MjIgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBpMzg2bGludXguYzogTWFueSBuZXcgZnVuY3Rpb25zIGFuZCBkZWZpbml0aW9ucyBmb3IgbGlua2VyCi0Jc3VwcG9ydCBmb3IgTGludXggc2hhcmVkIGxpYnJhcmllcy4KLQkqIGJmZC1pbi5oIChiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotVGh1IEp1biAxNiAxNDoyMzo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IElmIHNlY29uZCBhcmd1bWVudCBpcyBgYF8nJywgdGhlbiwgaW5zdGVhZCBvZgotCWVjaG9pbmcgY29uZmlnIGZpbGUgbmFtZSwgZWNobyB3aGV0aGVyIHRhcmdldCB1c2VzIGxlYWRpbmcKLQl1bmRlcnNjb3JlcyBvbiBzeW1ib2wgbmFtZXMuICBBZGQgYXBwcm9wcmlhdGUgc2V0dGluZ3MgdG8KLQlkaWZmZXJlbnQgY2FzZXMuICBVc2VkIGJ5IGJpbnV0aWxzL2NvbmZpZ3VyZS5pbiB0byBzZXQgZGVmYXVsdCBmb3IKLQljKytmaWx0LgotCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IElmIHRyeWluZyB0byBnZW5lcmF0ZSBhIHNoYXJlZAotCW9iamVjdCwgd2FybiBhbmQgcmV0dXJuIGZhbHNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IEFjY2VwdCBCTUFHSUMgb2JqZWN0cwotCWFuZCB0cmVhdCB0aGVtIGFzIE9NQUdJQy4KLQotV2VkIEp1biAxNSAxODowMjoyMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JRW5hYmxlIHNwYXJjIHY5IHN1cHBvcnQgZm9yIHJlbGVhc2UuICBOb3RlIHRoYXQgdGhpcyBpcyBzdGlsbCBhCi0Jd29yayBpbiBwcm9ncmVzcywgcGVuZGluZyByZWxlYXNlIG9mIGFuIEFCSSBzcGVjaWZpY2F0aW9uLgotCSogY29uZmlnLmJmZCwgY29uZmlndXJlLmluOiBJbmNsdWRlIHNwYXJjIHY5IGVsZiBjb25maWcuCi0JKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycyk6IEhhbmRsZSBzcGFyYyB2OSAoNjQgYml0KS4KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWwpOiBOZXcgcmVsb2MgdHlwZXMuCi0JKiBlbGY2NC1zcGFyYy5jOiBJbXBsZW1lbnQgZWxmNjQtc3BhcmMgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4sIHRhcmdldHMuYzogVXBkYXRlZC4KLQotV2VkIEp1biAxNSAwMTozNDowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE5ldyBmaWVsZCBkdF9uZWVkZWRfbmFtZS4KLQkoZWxmX2R0X25lZWRlZF9uYW1lKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBlbGZfZHRfbmVlZGVkX25hbWUKLQlpcyBzZXQsIHVzZSB0aGF0IGluc3RlYWQgb2YgdGhlIGZpbGVuYW1lIGZvciB0aGUgRFRfTkVFREVEIGR5bmFtaWMKLQllbnRyeS4KLQkqIGVsZi5jIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQgc2ludGVycHB0cgotCWFyZ3VtZW50LCBhbmQgc2V0IGl0IHRvIHRoZSAuaW50ZXJwIHNlY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogY29mZi1zcGFyYy5jIChTV0FQX09VVF9SRUxPQ19FWFRSQSk6IERlZmluZSB0byBjbGVhciB0aGUgcl9zcGFyZQotCWZpZWxkIG9mIHRoZSByZWxvYyByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IGJlIGdhcmJhZ2UuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2FybWFwKTogUmVjb2duaXplIF9fLlNZTURFRi8gYXMgd2VsbCBhcwotCV9fLlNZTURFRjsgdGhlIGZvcm1lciB3YXMgdXNlZCBpbiBvbGQgTGludXggYXJjaGl2ZXMuICBGcm9tCi0JanJzQHdvcmxkLnN0ZC5jb20gKFJpY2sgU2xhZGtleSkuCi0KLQkqIGkzODZsaW51eC5jIChpMzg2bGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGVmaW5lOyBsaWtlCi0JTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBpbiBhb3V0LXRhcmdldC5oLCBidXQgc2V0IE1BQ0hUWVBFIHRvCi0JTV8zODYuICBGcm9tIGpyc0B3b3JsZC5zdGQuY29tIChSaWNrIFNsYWRrZXkpLgotCShNWV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWZpbmUuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBUcmVhdCBOX1NFVFYgc3ltYm9scwotCWFzIE5fREFUQSBzeW1ib2xzLgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotCSogYW91dHguaDogUmV3cml0ZSBzeW1ib2wgZHVwbGljYXRlIGVsaW1pbmF0aW9uIHRvIHVzZSBCRkQgaGFzaAotCXRhYmxlcy4KLQkoc3RydWN0IHN0cmluZ3RhYl9lbnRyeSwgc3RydWN0IHN0cmluZ3RhYl9kYXRhKTogUmVtb3ZlLgotCShIQVNITUFYTEVOLCBIQVNIX0NIQVIsIGhhc2gsIGNvbXBhcmUsIGxvZzIsIGVtaXRfc3RydGFiKTogUmVtb3ZlLgotCShzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnksIHN0cnVjdCBzdHJ0YWJfaGFzaCk6IERlZmluZS4KLQkoc3RydGFiX2hhc2hfbmV3ZnVuYywgc3RydGFiX2hhc2hfbG9va3VwKTogRGVmaW5lLgotCShzdHJpbmd0YWJfZnJlZSwgZW1pdF9zdHJpbmd0YWIpOiBEZWZpbmUuCi0JKHN0cmluZ3RhYl9pbml0LCBhZGRfdG9fc3RyaW5ndGFiKTogUmV3cml0ZS4KLQkoTkFNRShhb3V0LHdyaXRlX3N5bXMpKTogVXNlIG5ldyBzdHJpbmd0YWIgY29kZS4KLQkoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvLCBOQU1FKGFvdXQsZmluYWxfbGluaykpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMsIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogYmZkLWluLmggKEJGRF9UUkFESVRJT05BTF9GT1JNQVQpOiBEZWZpbmUgbmV3IEJGRCBmbGFnIHRvCi0JcmVxdWVzdCBCRkQgdG8gd3JpdGUgb2JqZWN0IGluIHRoZSB0cmFkaXRpb25hbCBmb3JtYXQsIHdoYXRldmVyCi0JdGhhdCBtZWFucyBmb3IgdGhlIHBhcnRpY3VsYXIgYmFja2VuZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogaGFzaC5jIChiZmRfaGFzaF9hbGxvY2F0ZSk6IElmIG9ic3RhY2tfYWxsb2MgZmFpbHMsIHNldAotCWJmZF9lcnJvcl9ub19tZW1vcnkuCi0KLVR1ZSBKdW4gMTQgMTM6MDA6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBxX21hZ2ljX2Zvcm1hdCB0byBzdWJmb3JtYXQKLQllbnVtLgotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSBhcyBmdW5jdGlvbgotCWlmIG5vdCBhbHJlYWR5IGRlZmluZWQuICBDb3B5IHN1YmZvcm1hdCBpbmZvcm1hdGlvbi4KLQkoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIpOiBEZWZpbmUgYXMgMCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShNWShiYWNrZW5kX2RhdGEpKTogVXNlIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIHJhdGhlciB0aGFuIDAuCi0JKE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOiBSZW5hbWUgZnJvbSBmaW5hbF9saW5rX2NhbGxiYWNrLCBhbmQKLQlkZWZpbmUgb25seSBpZiBNWV9maW5hbF9saW5rX2NhbGxiYWNrIGlzIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKE1ZX2JmZF9maW5hbF9saW5rKTogUmVuYW1lIHVzZSBvZiBmaW5hbF9saW5rX2NhbGxiYWNrIHRvCi0JTVlfZmluYWxfbGlua19jYWxsYmFjay4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogSGFuZGxlIFFNQUdJQyBsaWtlCi0JWk1BR0lDLCBidXQgc2V0IHRoZSBzdWJmb3JtYXQgdG8gcV9tYWdpY19mb3JtYXQuICBBYm9ydCBpZiB0aGUKLQltYWdpYyBudW1iZXIgaWYgbm90IHJlY29nbml6ZWQuCi0JKGFkanVzdF96X21hZ2ljKTogVXNlIFFNQUdJQyBpZiBxX21hZ2ljX2Zvcm1hdC4KLQkqIGkzODZsaW51eC5jIChNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcik6IERlZmluZSBhcyAxLgotCShpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmspOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShNWV9iZmRfZmluYWxfbGluayk6IERlZmluZSBhcyBpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogQ2hlY2sgYm90aCBzZWN0aW9uIGFuZAotCW91dHB1dF9zZWN0aW9uIGFnYWluc3Qgc2VjdGlvbnMgb2YgYWJmZC4KLQotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IENoYW5nZSB0eXBlIG9mCi0Jd3JpdHRlbiBmcm9tIGJvb2xlYW4gdG8gY2hhci4gIEFkZCBuZXcgZmllbGQgc21hbGwuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgd3JpdHRlbiB0byAwCi0JcmF0aGVyIHRoYW4gZmFsc2UuICBJbml0aWFsaXplIHNtYWxsIHRvIDAuCi0JKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IElmIEVDT0ZGIHR5cGUgaXMgc2NTVW5kZWZpbmVkLCBzZXQKLQlzbWFsbC4gIElmIHNtYWxsIGlzIHNldCwgYW5kIGhhc2ggdGFibGUgdHlwZSBpcyBjb21tb24sIGZvcmNlIHRoZQotCXN5bWJvbCBpbnRvIGEgc2VjdGlvbiBuYW1lZCBTQ09NTU9OIGFuZCBjaGFuZ2UgdGhlIEVDT0ZGIHR5cGUgZnJvbQotCXNjQ29tbW9uIHRvIHNjU0NvbW1vbi4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IFNldCB3cml0dGVuIHRvIDEgcmF0aGVyIHRoYW4gdHJ1ZS4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IEpNUEFERFIgcmVsb2MKLQlvdmVyZmxvdyBjaGVjayB0byBjb25zaWRlciBzZWN0aW9uIFZNQSBvZiBpbnB1dCBmaWxlLgotCi1Nb24gSnVuIDEzIDE0OjIwOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBhCi0JbWFjaGluZSB0eXBlIG9mIDY4MDAwLgotCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBBZGQgbmV3IGFyZ3VtZW50IHVua25vd24uCi0JU2V0ICp1bmtub3duIHRvIHRydWUgaWYgbWFjaGluZSB0eXBlIGlzIHJlYWxseSB1bmtub3duLCBhcyBvcHBvc2VkCi0JdG8gTV9VTktOT1dOIGZvciB0aGUgNjgwMDAuCi0JKE5BTUUoYW91dCxzZXRfYXJjaF9tYWNoKSk6IENoYW5nZSBOQU1FKGFvdXQsbWFjaGluZV90eXBlKSBjYWxsCi0JYWNjb3JkaW5nbHkuCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogQWRkIG5ldyBhcmd1bWVudCB0bwotCXByb3RvdHlwZS4KLQotU3VuIEp1biAxMiAyMDoyMTowMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKEVYRUNfQVVYX0lEKTogRGVmaW5lIGJhc2VkIG9uIGF2YWlsYWJsaXR5IG9mIEhQVVhfQVVYX0lECi0Jb3IgSElVWF9BVVhfSUQuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogVXNlIEVYRUNfQVVYX0lEIGluc3RlYWQgb2YgSFBVWF9BVVhfSUQuCi0JKHNvbV93cml0ZV9hcm1hcCk6IFVzZSBDUFVfUEFfUklTQzFfMCBhcyB0aGUgbWFnaWMgbnVtYmVyLiAgTm90ZQotCXNvbS5jIGlzIGNhcmVmdWwgdG8gYWx3YXlzIGRlZmluZSBDUFVfUEFfUklTQzFfMC4KLQotU2F0IEp1biAxMSAxNjozMjozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgd2VhayBzeW1ib2xzIGFzIGFuIGV4dGVuc2lvbiB0byBhLm91dC4KLQkqIGFvdXR4LmggKHN5bV9pbl90ZXh0X3NlY3Rpb24pOiBEb24ndCBkZWZpbmUuCi0JKHN5bV9pbl9kYXRhX3NlY3Rpb24sIHN5bV9pbl9ic3Nfc2VjdGlvbik6IExpa2V3aXNlLgotCShzeW1faXNfdW5kZWZpbmVkLCBzeW1faXNfZ2xvYmFsX2RlZm4pOiBMaWtld2lzZS4KLQkoc3ltX2lzX2RlYnVnZ2VyX2luZm8sIHN5bV9pc19mb3J0cmFuY29tbW9uKTogTGlrZXdpc2UuCi0JKHN5bV9pc19hYnNvbHV0ZSwgc3ltX2lzX2luZGlyZWN0KTogTGlrZXdpc2UuCi0JKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBSZXdyaXRlIGZvciBjbGFyaXR5LiAgUmVhcnJhbmdlCi0JYXJndW1lbnRzIGFuZCBjaGFuZ2UgY2FsbGVyLiAgSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBEb24ndCBpZ25vcmUgd2VhayBzeW1ib2xzLiAgUHVsbAotCW9iamVjdCBpbiBmcm9tIGFyY2hpdmUgaWYgYSB3ZWFrIGRlZmludGlvbiBpcyBmb3VuZCBmb3IgYW4KLQlleGlzdGluZyB1bmRlZmluZWQgc3ltYm9sLgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBQdXQgYWxsIGNhc2VzIGluIHN3aXRjaC4gIFNldCBmbGFncyBvZiBhbgotCXVuZGVmaW5lZCBzeW1ib2wgdG8gMC4gIEhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi1GcmkgSnVuIDEwIDEzOjI1OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBIYW5kbGUgLmJzcyBzZWN0aW9uLgotCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIEJGRF9SRUxPQ19DVE9SLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBEb24ndCBhc3N1bWUKLQl0aGUgc2VjdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wgaXMgbm90IE5VTEwuCi0KLVdlZCBKdW4gIDggMjM6MTU6NTMgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiAgU2V0IEVYRUNfUCBhbmQgc3RhcnQgYWRkcmVzcyBmb3IgR0RCLgotCi1XZWQgSnVuICA4IDIzOjU3OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IERvbid0IHRyeSB0byByZWFkIHRoZQotCXN0cmluZ3MgaWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMuCi0JKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBVc2UgdGhlIG91dHB1dCBzZWN0aW9uIHdoZW4KLQl3b3JraW5nIG91dCB0aGUgdHlwZS4KLQotVHVlIEp1biAgNyAxMzoyNTowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IFB1dCBzaHN0cnRhYiwgc3ltdGFiIGFuZAotCXN0cnRhYiBzZWN0aW9ucyBhdCBlbmQgb2YgZmlsZS4gIEF2b2lkcyBidWcgaW4gc29tZSB2ZXJzaW9ucyBvZgotCVNWUjQgc3RyaXAuICBGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQHRhbnRhbHVzLm5ybC5uYXZ5Lm1pbD4uCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogSWYgQ09GRl9QQUdFX1NJWkUgaXMgZGVmaW5lZCwKLQlzZXQgU0VDX0RFQlVHR0lORyBmb3IgU1RZUF9JTkZPIHNlY3Rpb25zLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIENPRkZfUEFHRV9TSVpFIGlzCi0JZGVmaW5lZCwgYW5kIERfUEFHRUQgaXMgc2V0LCBzZXQgdGhlIGZpbGUgcG9zaXRpb24gZXF1YWwgdG8gdGhlCi0Jc2VjdGlvbiBWTUEgbW9kdWxvIENPRkZfUEFHRV9TSVpFLgotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBJZiBGX0VYRUMgaXMgc2V0LCBzZXQgRF9QQUdFRC4KLQkqIGNvZmYtaTM4Ni5jOiBTZXQgRF9QQUdFRCBpbiBCRkQgdGFyZ2V0LgotCShDT0ZGX1BBR0VfU0laRSk6IERlZmluZS4KLQkqIGNvZmYtbTY4ay5jLCBjb2ZmLXNwYXJjLmM6IExpa2V3aXNlLgotCi1Nb24gSnVuICA2IDEwOjU3OjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEb24ndCB0dXJuIGEgcmVsb2Mgc2VjdGlvbgotCWludG8gYSBCRkQgc2VjdGlvbiBqdXN0IGJlY2F1c2UgU0hGX0FMTE9DIGlzIHNldDsgcmVxdWlyZSB0aGF0IGl0Ci0Jbm90IHVzZSB0aGUgbm9ybWFsIHN5bWJvbCB0YWJsZS4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi0JQmV0dGVyIGluZGlyZWN0IGFuZCB3YXJuaW5nIHN5bWJvbCBoYW5kbGluZyBpbnNwaXJlZCBieSBTdHVhcnQKLQlRdWljayA8c3R1Y2tAY3MubWFuLmFjLnVrPi4KLQkqIGxpbmtlci5jIChlbnVtIGxpbmtfYWN0aW9uKTogQWRkIFJFRiwgTUlORCwgQ1dBUk4sIFJFRkMuCi0JKGxpbmtfYWN0aW9uKTogQ2hhbmdlIFVOREVGX1JPVy9kZWYgYW5kIFVOREVGV19ST1cvZGVmIGZyb20gTk9BQ1QKLQl0byBSRUYuICBDaGFuZ2UgVU5ERUZfUk9XL2luZHIgYW5kIFVOREVGV19ST1cvaW5kciBmcm9tIENZQ0xFIHRvCi0JUkVGQy4gIENoYW5nZSBERUZfUk9XL2luZHIgYW5kIENPTU1PTl9ST1cvaW5kciBmcm9tIENZQ0xFIHRvIE1ERUYuCi0JQ2hhbmdlIERFRldfUk9XL2luZHIgZnJvbSBDWUNMRSB0byBOT0FDVC4gIENoYW5nZSBJTkRSX1JPVy9pbmRyCi0JZnJvbSBNREVGIHRvIE1JTkQuICBDaGFuZ2UgSU5EUl9ST1cvd2FybiBmcm9tIFdBUk5DIHRvIENZQ0xFLgotCUNoYW5nZSBXQVJOX1JPVy9kZWYgYW5kIFdBUk5fUk9XL2luZHIgZnJvbSBNV0FSTiB0byBDV0FSTi4gIENoYW5nZQotCVdBUk5fUk9XL2NvbSBmcm9tIE1XQVJOIHRvIFdBUk4uICBDaGFuZ2UgV0FSTl9ST1cvd2FybiBmcm9tIE5PQUNUCi0JdG8gQ1lDTEUuICBDaGFuZ2UgU0VUX1JPVy93YXJuIGZyb20gV0FSTkMgdG8gQ1lDTEU+Ci0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSGFuZGxlIFJFRiwgTUlORCwgQ1dBUk4gYW5kCi0JUkVGQy4gIElmIGEgbmV3IGluZGlyZWN0IHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkLCBwdXNoIHRoZQotCXJlZmVyZW5jZSBkb3duIHRvIHRoZSBzeW1ib2wgaXQgcG9pbnRzIHRvLiAgRkl4IGhhbmRsaW5nIG9mIFdBUk4uCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogSWYgTl9XQVJOSU5HLCBkb24ndAotCWNsb2JiZXIgZV90eXBlIG9mIG5leHQgc3ltYm9sLgotCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IExvb3Agb24gYmZkX2xpbmtfaGFzaF93YXJuaW5nIGFzIHdlbGwKLQlhcyBiZmRfbGlua19oYXNoX2luZGlyZWN0LgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSk6IE5ldyBmaWVsZCB3cml0dGVuLgotCSogYW91dHguaCAoTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSk6IEluaXRpYWxpemUgd3JpdHRlbi4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBVc2Ugd3JpdHRlbiwgbm90IHJvb3Qud3JpdHRlbi4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IE5ldyBmaWVsZCB3cml0dGVuLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIHdyaXR0ZW4uCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiB1c2Ugd3JpdHRlbiwgbm90IHJvb3Qud3JpdHRlbi4KLQkqIGdlbmxpbmsuaCAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5KTogTmV3IGZpZWxkIHdyaXR0ZW4uCi0JKiBsaW5rZXIuYyAoX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyk6IERvbid0IGluaXRpYWxpemUgd3JpdHRlbi4KLQkoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgd3JpdHRlbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBVc2Ugd3JpdHRlbiwgbm90IHJvb3Qud3JpdHRlbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi0JKiBsaWJlY29mZi5oIChlY29mZl9kYXRhX3R5cGUpOiBBZGQgbGlua2VyIGZpZWxkLgotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgbmV3IHRkYXRhIGxpbmtlcgotCWZpZWxkLCByYXRoZXIgdGhhbiBvdXRzeW1ib2xzIGJlaW5nIG5vbi1OVUxMLCB0byBkZWNpZGUgd2hldGhlciB0bwotCW91dHB1dCB0aGUgc3ltYm9scyBhbmQgcmVsb2NzLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IFNldCBuZXcgdGRhdGEgbGlua2VyIGZpZWxkIHRvIHRydWUuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCB0cnkgdG8gY29weQotCWRhdGEgdG8gYSBub24tRUNPRkYgZmlsZS4KLQotCSogbGliYmZkLWluLmg6IEFkZCB3YXJuaW5nIHRoYXQgbGliYmZkLmggaXMgYSBnZW5lcmF0ZWQgZmlsZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1TdW4gSnVuICA1IDE1OjAyOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgdG8gc3VwcG9ydCBFTEYgc3RyaXAgYW5kIG9iamNvcHkgb24gZHluYW1pY2FsbHkgbGlua2VkCi0JZmlsZXMuCi0JKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogQWRkIHByb3RvdHlwZS4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogTWFrZSBhIEJGRCBzZWN0aW9uIGZyb20gYW4gU0hUX0hBU0gKLQlzZWN0aW9uLCBhbmQgZnJvbSBhbiBTSFRfRFlOU1lNIHNlY3Rpb24sIGFuZCBmcm9tIHRoZSBkeW5hbWljCi0Jc3RyaW5nIHRhYmxlIHNlY3Rpb24uCi0JKGVsZl9vYmplY3RfcCk6IFNldCBEX1BBR0VEIGlmIHRoZXJlIGlzIGEgcHJvZ3JhbSBoZWFkZXIuCi0JKGVsZl9tYWtlX3NlY3Rpb25zKTogUmVtb3ZlLgotCShmaXhfdXBfc3RydGFicyk6IFJlbW92ZS4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBSZXdyaXRlLiAgTm93IHNldHMgc2hfZW50c2l6ZS4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IFJld3JpdGUuICBOb3cgc2V0cyBzaF9saW5rIGFuZCBzaF9pbmZvCi0JZm9yIGFsbCBzZWN0aW9ucy4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6ICBEb24ndCBjYWxsIG9ic29sZXRlCi0JZnVuY3Rpb25zIGVsZl9tYWtlX3NlY3Rpb25zIG9yIGZpeF91cF9zdHJ0YWJzLgotCShzd2FwX291dF9zeW1zKTogU2V0IHNoX2FkZHJhbGlnbiB0byBGSUxFX0FMSUdOIHJhdGhlciB0aGFuIDQuCi0JKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogUGVybWl0IHdyaXRpbmcgRFlOQU1JQwotCW9iamVjdHMuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBUcmVhdCBTSFRfRFlOU1lNIGxpa2Ugb3RoZXIgbm9ybWFsCi0Jc2VjdGlvbnMuICBJZiBhbiBTSFRfUkVMIG9yIFNIVF9SRUxBIHNlY3Rpb24gaXMgYWxsb2NhdGVkIG9yIHVzZXMKLQlhbiB1bnVzdWFsIHN5bWJvbCB0YWJsZSwgcGVybWl0IGEgQkZEIHNlY3Rpb24gdG8gbWFwIHRvIGl0LgotCVBlcm1pdCBtb3N0IFNIVF9TVFJUQUIgc2VjdGlvbnMgdG8gaGF2ZSBhIEJGRCBzZWN0aW9uIG1hcHBlZCB0bwotCXRoZW0uCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IHNldCBzaF9saW5rLCBzaF9pbmZvIG9yIHNoX2VudHNpemUKLQlmaWVsZHMgb2YgZHluYW1pYyBzZWN0aW9ucyBoZXJlOyBkbyBpdCBpbiBhc3NpZ25fc2VjdGlvbl9udW1iZXJzLgotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oOiBBZGQgRF9QQUdFRCB0byBwZXJtaXR0ZWQgb2JqZWN0Ci0JZmxhZ3MuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogT25seSBzZXQgU0VDX0RBVEEgaWYKLQlTRUNfTE9BRCBpcyBzZXQsIHJhdGhlciB0aGFuIGNoZWNraW5nIFNFQ19BTExPQy4KLQotCSogbGliYmZkLWluLmggKGJmZF9yZWFsbG9jKTogQ2hhbmdlIGxhc3QgYXJnIHRvICJzaXplX3Qgc2l6ZSIuCi0KLUZyaSBKdW4gIDMgMTA6NTg6MDIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgY29tcHV0ZSB0aGUgZmlsZSBoZWFkZXIncwotCWNoZWNrc3VtIGhlcmUuCi0JKHNvbV93cml0ZV9oZWFkZXJzKTogSW5zdGVhZCBkbyBpdCBoZXJlLgotCi0JKiBsaWJiZmQuaCAoYmZkX3JlYWxsb2MpOiBDaGFuZ2UgbGFzdCBhcmcgdG8gInNpemVfdCBzaXplIi4KLQotVGh1IEp1biAgMiAxNzozOToyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N1bjMuaDogSW5jbHVkZSA8c3RkbGliLmg+LiAgRG9uJ3QgZGVjbGFyZSBmcmVlLCBleGl0IG9yCi0JZ2V0ZW52LgotCi0JQWRkIGxpbmtlciBzdXBwb3J0IGZvciBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLgotCSogc3Vub3MuYzogSW5jbHVkZSBiZmRsaW5rLmguICBBZGQgbWFueSBuZXcgZnVuY3Rpb25zIGFuZAotCWRlZmluaXRpb25zIGZvciBTdW5PUyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotCSogYmZkLWluLmggKGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRGVjbGFyZS4KLQkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBhb3V0eC5oIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkpOiBNb3ZlIHRvIGxpYmFvdXQuaC4KLQkoc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19oYXNoX2xvb2t1cCwgYW91dF9saW5rX2hhc2hfdHJhdmVyc2UpOiBMaWtld2lzZS4KLQkoYW91dF9oYXNoX3RhYmxlKTogTGlrZXdpc2UuCi0JKE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpOiBSZW5hbWUgZnJvbSBhb3V0X2xpbmtfaGFzaF9uZXdmdW5jCi0JYW5kIG1ha2UgZXh0ZXJuYWxseSB2aXNpYmxlLgotCShOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpKTogTmV3IGZ1bmN0aW9uLgotCShOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkpOiBDYWxsCi0JTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSwgbm90IF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGZhaWwgaWYgbm8gc3ltYm9scy4gIElmIGl0IGV4aXN0cywKLQljYWxsIGFkZF9keW5hbWljX3N5bWJvbHMgYmFja2VuZCBlbnRyeSBwb2ludCBmb3IgZHluYW1pYyBvYmplY3RzLgotCVVzZSBhZGRfb25lX3N5bWJvbCBiYWNrZW5kIGVudHJ5IHBvaW50IGlmIGl0IGV4aXN0cy4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogQ2FsbCBmaW5pc2hfZHluYW1pY19saW5rIGJhY2tlbmQgZW50cnkKLQlwb2ludCwgaWYgaXQgZXhpc3RzLgotCShhb3V0X2xpbmtfaW5wdXRfYmZkKTogRm9yIGEgZHluYW1pYyBvYmplY3QsIGNhbGwKLQlsaW5rX2R5bmFtaWNfb2JqZWN0IGJhY2tlbmQgZW50cnkgcG9pbnQsIGlmIGl0IGV4aXN0cy4KLQkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IENhbGwgd3JpdGVfZHluYW1pY19zeW1ib2wgYmFja2VuZAotCWVudHJ5IHBvaW50LCBpZiBpdCBleGlzdHMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uKTogRG9uJ3QgcmVhZCB0aGUgcmVsb2NzIGlmIHRoZXkgaGF2ZQotCWFscmVhZHkgYmVlbiByZWFkLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBXaGVuIGRvaW5nIGEgZmluYWwgbGluaywgZm9yIGEKLQlyZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgY2FsbCBjaGVja19keW5hbWljX3JlbG9jIGJhY2tlbmQKLQllbnRyeSBwb2ludCwgaWYgaXQgZXhpc3RzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQkqIGxpYmFvdXQuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4gIEluY2x1ZGUKLQliZmRsaW5rLmguCi0JKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSk6IE1vdmUgaW4gZnJvbSBhb3V0eC5oLgotCShzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2hhc2hfbG9va3VwLCBhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSk6IExpa2V3aXNlLgotCShhb3V0X2hhc2hfdGFibGUpOiBMaWtld2lzZS4KLQkoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkcyBhZGRfZHluYW1pY19zeW1ib2xzLAotCWFkZF9vbmVfc3ltYm9sLCBsaW5rX2R5bmFtaWNfb2JqZWN0LCB3cml0ZV9keW5hbWljX3N5bWJvbCwKLQljaGVja19keW5hbWljX3JlbG9jLCBhbmQgZmluaXNoX2R5bmFtaWNfbGluay4KLQkoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCk6IERlZmluZSBuZXcgc3RydWN0dXJlLgotCShhb3V0X3NlY3Rpb25fZGF0YSk6IERlZmluZSBuZXcgYWNjZXNzb3IgbWFjcm8uCi0JKE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpOiBEZWNsYXJlLgotCShOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpKTogRGVjbGFyZS4KLQkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSBuZXcgYW91dF9iYWNrZW5kX2RhdGEKLQlmaWVsZHMuCi0JKiBhb3V0LXRhcmdldC5oIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBpMzg2YW91dC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBpMzg2bWFjaDMuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBzcGFyY2x5bnguYyAoc3BhcmNseW54X2FvdXRfYmFja2VuZCk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IERvbid0IHplcm8gb3V0IGNhY2hlZAotCXVudGlsIHdlIGtub3cgaXQgaXMgbm9uLU5VTEwuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogRG9uJ3Qgc2tpcCBhIHdhcm5pbmcgc3ltYm9sIGV2ZW4gaWYgaXQKLQloYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gb3V0LiAgSWYgc2tpcHBpbmcgYW4gaW5kaXJlY3Qgc3ltYm9sLAotCXNraXAgdGhlIG5leHQgc3ltYm9sIGFzIHdlbGwuCi0KLVdlZCBKdW4gIDEgMTQ6Mzc6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdW4zLmg6IERvbid0IGRlY2xhcmUgcXNvcnQsIG1hbGxvYyBvciByZWFsbG9jLgotCi1UaHUgTWF5IDI2IDEzOjU2OjAzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBDYXN0IGJmZF9ieXRlIHBvaW50ZXIKLQl0byBjaGFyIHBvaW50ZXIgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIGRlcC1pbi5zZWQ6IFJlbW92ZSBzcGFjZXMgYmVmb3JlIGNvbG9ucy4KLQotCU1lcmdlZCBjaGFuZ2VzIGJhY2sgaW4gZnJvbSBGU0YgZ2FzIHJlbGVhc2UgMi4zOgotCi0JKiBNYWtlZmlsZS5pbiAoc3RtcC1iZmQuaCk6IFdyYXAgYGlmJyBibG9jayBhcm91bmQgZ3JlcAotCWludm9jYXRpb24sIHRvIGF2b2lkIGEgYnVnIGluIEJTRCA0LjQgbWFrZS4KLQotCUZyb20gUmFscGggQ2FtcGJlbGw6Ci0JKiBtaXBzYnNkLmMgKG1pcHNfZml4X2ptcF9hZGRyKTogSWYgc3ltYm9sIGlzIHVuZGVmaW5lZCwgcmV0dXJuIGFuCi0JZXJyb3IuCi0JKG1pcHNfZml4X2hpMTZfcyk6IERpdHRvLgotCi0JRnJpIE1heSAxMyAyMToyMTowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIG1ha2VmaWxlLmRvczogZGVmaW5lIGEgZGVmYXVsdCB0YXJnZXQsIG9yIGFyY2hpdmVzIHdvbid0IHdvcmsKLQkgIGR1ZSB0byBtdWx0aXBsZSBtYXRjaGVzLgotCi0JV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSBmb3IgbGF0ZXN0IGZpbGVzCi0JKiBtYWtlZmlsZS5kb3M6IHVwZGF0ZSBmb3IgY29ycmVjdCB0YXJnZXRzIGFuZCBzb3VyY2VzCi0JKiBjb2ZmLWdvMzIuYzogW25ld10gZ28zMidzIENPRkYgZm9ybWF0IChpMzg2Y29mZiB3aXRoIHVuZGVyc2NvcmVzKQotCSogdGFyZ2V0cy5jOiBhZGQgZ28zMmNvZmYgdGFyZ2V0Ci0JKiBtYWtlZmlsZS5pbjogYWRkIGNvZmYtZ28zMi5jIHN1cHBvcnQKLQotVGh1IE1heSAyNiAxMDoxMDoyMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9wcmVwX2hlYWRlcnMpOiBEbyBub3Qgc2V0IHRoZSBzeXN0ZW1faWQgaGVyZSwgcHJpdmF0ZQotCWJmZCBkYXRhIGhhcyBub3QgYmVlbiBjb3BpZWQgeWV0LgotCShzb21fd3JpdGVfaGVhZGVycyk6IEluc3RlYWQgZG8gaXQgaGVyZS4KLQotVHVlIE1heSAyNCAxNjoxNzoxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlNYWtlIE1JUFMgRUxGIHVzZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyLiAgTm8gc2hhcmVkIGxpYnJhcnkKLQlzdXBwb3J0IHlldC4KLQkqIGVsZjMyLW1pcHMuYyAoYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9pbik6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9vdXQpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX29iamVjdF9wKTogSWYgbGFzdCBzeW1ib2wgaXMgTE9DQUwsIHNldCBlbGZfYmFkX3N5bXRhYi4KLQkobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFNldCBzaF9pbmZvIGZpZWxkIGZvciAuZ3B0YWIuKgotCXNlY3Rpb25zLgotCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogU2V0IHNoX2VudHNpemUgZm9yIC5ncHRhYi4qIHNlY3Rpb25zLgotCShtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBSZWFkIGFuZCBmcmVlIGV4dGVybmFsIHN5bWJvbHMgbGFzdCwKLQlub3QgZmlyc3QsIGZvciBjbGFyaXR5LgotCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCi0JKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KLQkobWlwc19lbGZfbGlua19oYXNoX2xvb2t1cCk6IERlZmluZSBuZXcgbWFjcm8uCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSk6IERlZmluZSBuZXcgbWFjcm8uCi0JKG1pcHNfZWxmX2hhc2hfdGFibGUpOiBEZWZpbmUgbmV3IG1hY3JvLgotCShtaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJ1Y3QgZXh0c3ltX2luZm8pOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KLQkobWlwc19lbGZfZ2V0X2V4dHIsIG1pcHNfZWxmX3NldF9pbmRleCk6IFJlbW92ZS4KLQkobWlwc19lbGZfb3V0cHV0X2V4dHN5bSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdwdGFiX2NvbXBhcmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZl9maW5hbF9saW5rKTogUmV3cml0ZSB0byB1c2UgRUxGIGJhY2tlbmQgbGlua2VyLCBhbmQgdG8KLQltZXJnZSBncHRhYiBpbmZvcm1hdGlvbiBpbiBpbnB1dCBmaWxlcy4KLQkobWlwc19lbGZfcmVsb2NhdGVfaGkxNik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWZpbmUgYXMgbWFjcm8gYmVmb3JlCi0JaW5jbHVkaW5nIGVsZjMyLXRhcmdldC5oLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogUmVuYW1lIGZyb20KLQllbGZfbGlua19oYXNoX25ld2Z1bmMgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIENoYW5nZSBjYWxsZXIuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZS4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IFVzZQotCV9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0LgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIG5ldyBmaWVsZCBiYWRfc3ltdGFiLgotCShlbGZfYmFkX3N5bXRhYik6IERlZmluZSBuZXcgYWNjZXNzb3IgbWFjcm8uCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogRGVjbGFyZS4KLQkoX2Jld19lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBDYWxsIGJhY2tlbmQgb2JqZWN0X3AgaG9vayBhZnRlcgotCXN3YXBwaW5nIGluIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENvcnJlY3QgdHlwbzogSW50ZXJuYWwgZm9yIEV4dGVybmFsLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBlbGZfYmFkX3N5bXRhYiBpcyBzZXQsIHJlYWQgYWxsCi0JdGhlIHN5bWJvbHMuICBTa2lwIFNUQl9MT0NBTCBzeW1ib2xzIHJhdGhlciB0aGFuIGdpdmluZyBhbiBlcnJvci4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogSWYgZWxmX2JhZF9zeW10YWIgaXMgc2V0LCBhbGxvY2F0ZSBzcGFjZSBmb3IKLQlhbGwgc3ltYm9scywgbm90IGp1c3QgbG9jYWxzLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogT25seSBza2lwIGEgc3ltYm9sIG5vdCBtZW50aW9uZWQgYnkgYQotCXJlZ3VsYXIgZmlsZSBpZiBpdCBpcyBtZW50aW9uZWQgYnkgYSBkeW5hbWljIG9iamVjdC4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogSWYgZWxmX2JhZF9zeW10YWIgaXMgc2V0LCByZWFkIGFsbCB0aGUKLQlzeW1ib2xzLgotCi1GcmkgTWF5IDIwIDEzOjM4OjIzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NldF9yZWxvY19pbmZvKTogRG8gbm90IHNldCBhbnkgcmVsb2NhdGlvbiBpbmZvCi0JZm9yIFNPTSBmaXh1cHMgd2hpY2ggYXJlIG5ldmVyIHBhc3NlZCB0byBCRkQuCi0KLUZyaSBNYXkgMjAgMTE6NTc6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIE1JUFNfUl9KTVBBRERSIG92ZXJmbG93Ci0JY2hlY2tpbmcuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIERUX0RFQlVHIHRvCi0JdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIGRlYnVnZ2VyLgotCUZyb20gUGV0ZXIgU2NoYXVlci4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IE5ldyBmdW5jdGlvbiwgYmFzZWQgb24KLQljb2RlIHJlcGVhdGVkIHRocmVlIHRpbWVzIGluIGJmZF9zZWN0aW9uX2Zyb21fc2hkciBpbiBlbGZjb2RlLmguCi0JKiBsaWJlbGYuaCAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSBuZXcgZnVuY3Rpb24KLQlfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIHRvIGNyZWF0ZSBCRkQgc2VjdGlvbnMuICBJZiBhCi0JcmVsb2Mgc2VjdGlvbiBkb2VzIG5vdCB1c2UgdGhlIG1haW4gc3ltYm9sIHRhYmxlLCBvciBpdCBpcyBwYXJ0IG9mCi0JdGhlIHByb2Nlc3MgaW1hZ2UsIHRyZWF0IGl0IGFzIGEgbm9ybWFsIHNlY3Rpb24sIG5vdCByZWxvY3MuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogVXNlIG5ldyBmdW5jdGlvbgotCV9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIuCi0KLVRodSBNYXkgMTkgMTE6Mzc6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0Lmg6IENoYW5nZSBhcl9tYXhfbmFtZWxlbiB2YWx1ZSBmcm9tCi0JMTUgdG8gMTQgdG8gbWF0Y2ggU1ZSNCBhci4KLQotCUFkZCBzdXBwb3J0IGZvciBFTEYgc2hhcmVkIGxpYnJhcmllcy4gIExvb3NlbHkgYmFzZWQgb24gd29yayBieQotCUVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNvbT4uCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkcyBmb3IgZHluYW1pYwotCWxpbmtpbmc6IGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLAotCWVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCwKLQllbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMsCi0JZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sLAotCWVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IENoYW5nZSB0eXBlIG9mIGFsaWduIGZpZWxkIHRvCi0JYmZkX3NpemVfdHlwZS4gIEFkZCBmaWVsZHMgZHluaW5keCwgZHluc3RyX2luZGV4LCB3ZWFrZGVmLAotCWVsZl9saW5rX2hhc2hfZmxhZ3MuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGZpZWxkcyBkeW5vYmosIGR5bnN5bWNvdW50LAotCWR5bnN0ciwgYnVja2V0Y291bnQuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jX2luLCBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4sIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc3dhcF9keW5faW4sIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY19pbiwgYmZkX2VsZjY0X3N3YXBfcmVsb2Nfb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2NhX2luLCBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfZHluX2luLCBiZmRfZWxmNjRfc3dhcF9keW5fb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5KTogRGVjbGFyZS4KLQkqIGVsZmNvZGUuaCAoRWxmX0V4dGVybmFsX0R5bik6IERlZmluZS4KLQkoZWxmX3N3YXBfcmVsb2NfaW4pOiBEZWZpbmUgYXMgbWFjcm8gdXNpbmcgTkFNRS4gIE1ha2UgZXh0ZXJuYWxseQotCXZpc2libGUuCi0JKGVsZl9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9yZWxvY2FfaW4sIGVsZl9zd2FwX3JlbG9jYV9vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfZHluX2luLCBlbGZfc3dhcF9keW5fb3V0KTogRGVmaW5lIGFzIG1hY3JvIHVzaW5nIE5BTUUKLQlhbmQgYXMgbmV3IGV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgc2VjdGlvbiB0eXBlIG9mIGR5bmFtaWMgc2VjdGlvbnMgYmFzZWQgb24KLQlzZWN0aW9uIG5hbWVzLgotCShlbGZfd3JpdGVfcGhkcnMpOiBSZW1vdmUuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uKTogQWRkIG5ldyBhbGlnbiBhcmd1bWVudC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RydWN0IHNlZ19pbmZvKTogUmVtb3ZlLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENvbXBsZXRlbHkgcmV3cml0ZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBDb21wbGV0ZWx5IHJld3JpdGUuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzKTogRG9uJ3Qgc2V0IGEgZmlsZSBwb3NpdGlvbiBmb3IKLQlzZWN0aW9ucyB3aGljaCBhbHJlYWR5IGhhdmUgb25lLiAgRG9uJ3QgYm90aGVyIHRvIGFsaWduIHRoZSBmaWxlCi0JcG9zaXRpb24gaGVyZS4KLQkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IEhhbmRsZSBTSFRfSEFTSCBhbmQgU0hUX0RZTkFNSUMKLQlzZWN0aW9uIHR5cGVzLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IGZhaWxzLCBqdXN0Ci0JdXNlIGJmZF9hYnNfc2VjdGlvbiByYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gZXJyb3IuCi0JKGVsZl9zaXplb2ZfaGVhZGVycyk6IE1ha2UgdXNlZnVsLgotCShlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBIYW5kbGUgZHluYW1pYyBvYmplY3RzLgotCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9hZGRfZHluYW1pY19lbnRyeSk6IERlZmluZSBhcyBtYWNybyB1c2luZyBOQU1FIGFuZCBhcyBuZXcKLQlleHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb24uCi0JKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2J1Y2tldHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IE5ldyBmdW5jdGlvbi4KLQkoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8pOiBBZGQgZHluc3ltX3NlYyBhbmQgaGFzaF9zZWMgZmllbGRzLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBIYW5kbGUgZHluYW1pYyBsaW5raW5nLiAgQ3JlYXRlIGEgc2VjdGlvbgotCXN5bWJvbCBmb3IgYWxsIEVMRiBzZWN0aW9ucywgbm90IGFsbCBCRkQgc2VjdGlvbnMuICBTdG9yZSBzZWN0aW9uCi0Jc3ltYm9sIGluZGV4IGluIHRhcmdldF9pbmRleCBmaWVsZCwgbm90IGluZGV4IGZpZWxkLiAgVHJhdmVyc2UKLQlvdmVyIGdsb2JhbCBzeW1ib2xzIGV2ZW4gaWYgc3RyaXBwaW5nLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogT3V0cHV0IGR5bmFtaWMgc3ltYm9scy4gIE1hcmsgc3ltYm9scwotCWRlZmluZWQgYnkgZHluYW1pYyBvYmplY3RzIGFzIHVuZGVmaW5lZC4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogSWdub3JlIGR5bmFtaWMgb2JqZWN0cy4gIFVzZSB0YXJnZXRfaW5kZXgKLQlmaWVsZCBmb3Igc2VjdGlvbiByZWxvY3MsIGFuZCBtYWtlIHN1cmUgaXQgaXMgc2V0LgotCShlbGZfcmVsb2NfbGlua19vcmRlcik6IFVzZSB0YXJnZXRfaW5kZXggZmllbGQgZm9yIHNlY3Rpb24gcmVsb2NzLAotCWFuZCBtYWtlIHN1cmUgaXQgaXMgc2V0LgotCSogZWxmLmMgKGVsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgZHluaW5keCwgZHluc3RyX2luZGV4LAotCXdlYWtkZWYgYW5kIGVsZl9saW5rX2hhc2hfZmxhZ3MgZmllbGRzLgotCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBkeW5vYmosIGR5bnN5bWNvdW50LAotCWR5bnN0ciBhbmQgYnVja2V0Y291bnQgZmllbGRzLgotCSogZWxmMzItdGFyZ2V0Lmg6IEluaXRpYWxpemUgbmV3IGR5bmFtaWMgbGlua2luZyBmaWVsZHMuCi0JKiBlbGY2NC10YXJnZXQuaDogTGlrZXdpc2UuICAKLQkqIGVsZjMyLWkzODYuYzogTmV3IGZ1bmN0aW9ucyBmb3IgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQuCi0JKiBlbGYzMi1zcGFyYy5jOiBMaWtld2lzZS4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1XZWQgTWF5IDE4IDA4OjI5OjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc29tLmM6IERvbid0IGluY2x1ZGUgPHN5cy9kaXIuaD4gb3IgPHN5cy91c2VyLmg+LgotCShzb21fcmVsb2NfcXVldWVfZmluZCk6IENhbGwgbWVtY21wIGluc3RlYWQgb2YgYmNtcC4KLQkoc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IENoYW5nZSBmaXJzdCBhcmd1bWVudCB0byBiZmQgKi4KLQkoY29tcGFyZV9zeW1zKTogQ2hhbmdlIHR5cGVzIG9mIGFyZ3VtZW50cyB0byBjb25zdCB2b2lkICouCi0JKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFJlbW92ZWQgdW51c2VkIGxvY2FsIGZvdW5kLgotCShzb21fd3JpdGVfYXJtYXApOiBBZGQgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQgYW5kIGludCBhcmd1bWVudHMuCi0JKHNvbV93cml0ZV9hcm1hcCk6IFVzZSAlbGQgYW5kIGNhc3QgdG8gbG9uZyBmb3IgZ2V0dWlkIHJlc3VsdC4KLQotV2VkIE1heSAxOCAwOTowOTozMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5oIChSX0hQUEFfQUJTX0NBTEwpOiBEZWZpbmUuCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogSGFuZGxlIGFic29sdXRlIGNhbGxzLgotCi0JKiBzb20uaCAoUl9IUFBBX0FCU19DQUxMKTogRGVmaW5lLgotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogRGVsZXRlIGNvbXBsZXggcmVsb2NhdGlvbiB0eXBlcy4KLQotVHVlIE1heSAxNyAxOTozMzoxMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYyAoaWNvZmZfbGl0dGxlX3ZlYywgaWNvZmZfYmlnX3ZlYyk6IEluZGljYXRlIGxlYWRpbmcKLQl1bmRlcnNjb3JlLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEludGVsIHRvb2wgY2hhaW4gKGdudTk2MHYyKS4KLQotTW9uIE1heSAxNiAxMDowOToyMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBlbGYzMi1ocHBhLmM6IENoYW5nZSAuaHBwYV9saW5rZXJfc3R1YnMgdG8gLlBBUklTQy5zdHVicywKLQlsaWtld2lzZSBmb3Igb3RoZXIgUEEgc3BlY2lmaWMgc2VjdGlvbnMuCi0JKGhwcGFfZWxmX3JlbG9jYXRlX3Vud2luZF90YWJsZSk6IERlbGV0ZSB1bnVzZWQKLQlmdW5jdGlvbi4KLQkoZWxmX2hwcGFfaG93dG9fdGFibGUpOiBDb21wbGV0ZWx5IG5ldyB0YWJsZSBiYXNlZCBvbiA5NC0wMi0wMgotCWRyYWZ0IFBBIEVMRiBzcGVjLiAgQ2hhbmdlIHJlbG9jYXRpb24gdGFncyBhcHByb3ByaWF0ZWx5Ci0JdGhyb3VnaG91dCBlbGYzMi1ocHBhLmMKLQkoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBSZXdyaXRlIGFuZCBzaW1wbGlmeSBiYXNlZCBvbiA5NC0wMi0wMgotCXNwZWMuCi0JKGhwcGFfZWxmX3JlbG9jKTogTGlrZXdpc2UuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IExpa2V3aXNlCi0JKEVMRl9NQUNISU5FX0NPREUpOiBDaGFuZ2UgdG8gRU1fUEFSSVNDLgotCSogZWxmMzItaHBwYS5oOiBJbmNsdWRlICJlbGYvaHBwYS5oIi4gIENoYW5nZSByZWxvY2F0aW9uIHRhZ3MgCi0JYXBwcm9wcmlhdGVseSB0aHJvdWdob3V0IGVsZjMyLWhwcGEuaC4KLQkoZWxmMzJfaHBwYV9yZWxvY190eXBlKTogTmV3IHRhYmxlIGJhc2VkIG9uIDk0LTAyLTAyIGRyYWZ0IFBBIEVMRgotCXNwZWMuCi0JKFJfSFBQQV9BQlNfQ0FMTCwgUl9IUFBBX0NPTVBMRVgqLCBSX0hQUEFfVU5XSU5EKTogRGVsZXRlIGRlZmluaXRpb25zLgotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBVc2UgRU1fUEFSSVNDIGluc3RlYWQgb2YgRU1fSFBQQS4KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWwpOiBEZWxldGUgdW51c2VkIEhQUEEgcmVsb2NhdGlvbnMuCi0JKiBzb20uaCAoUl9IUFBBX0FCU19DQUxMLCBSX0hQUEFfQ09NUExFWCk6IERlbGV0ZSBkZWZpbml0aW9ucy4KLQotCSogbGliaHBwYS5oIChocHBhX2ZpZWxkX2FkanVzdCk6IEF2b2lkIGFkZGluZyBjb25zdGFudF92YWx1ZSBpbnRvCi0JdGhlIGZpbmFsIHZhbHVlIHR3aWNlIGZvciBMUiBhbmQgUlIgZmllbGQgc2VsZWN0b3JzLgotCi1TYXQgTWF5IDE0IDA5OjA5OjE5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhZGRfdG9fc3RyaW5ndGFiKTogVXNlIEJGRF9BU1NFUlQgbm90IGFzc2VydC4gIFRoaXMKLQlhdm9pZHMgX19lcHJpbnRmIHRyb3VibGVzLgotCi1GcmkgTWF5IDEzIDEwOjUxOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1IuCi0KLQkqIGNvbmZpZy9taXBzYmVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBBZGQgZWNvZmZfYmlnX3ZlYyBhbmQKLQllY29mZl9saXR0bGVfdmVjIHNpbmNlIElyaXggNSBzdXBwb3J0cyBFQ09GRiBleGVjdXRhYmxlcy4KLQotV2VkIE1heSAxMSAwMDozMTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSGFuZGxlIGZkci5hZHIgIT0gcGRyLmFkcgotCWNvcnJlY3RseS4KLQotCSogTWFrZWZpbGUuaW4gKHN0bXAtYmZkLmgpOiBVc2UgfHwgaW5zdGVhZCBvZiA7IHRvIGZvcmNlIFN1bk9TCi0JbWFrZSB0byBpbnZva2UgdGhlIHNoZWxsLgotCi1UdWUgTWF5IDEwIDE0OjIzOjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChTRUNfQ09GRl9TSEFSRURfTElCUkFSWSk6IFJlbmFtZWQgZnJvbQotCVNFQ19TSEFSRURfTElCUkFSWSBmb3IgY2xhcml0eS4gIENoYW5nZWQgYWxsIHVzZXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IElmIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZIGlzCi0Jc2V0LCBzZXQgU1RZUF9OT0xPQUQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCk6IERvbid0IGdldCBhbiBhc3NlcnRpb24KLQlmYWlsdXJlIGJlY2F1c2Ugb2YgYSBiYWQgc2hhcmVkIGxpYnJhcnkuCi0KLU1vbiBNYXkgIDkgMTg6NTM6NDAgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYzogQWRkIG1pc3NpbmcgY29tbWVudCB0ZXJtaW5hdG9yLgotCi1Nb24gTWF5ICA5IDExOjUzOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSWYgaGFzaHAgYW5kICpoYXNocAotCWFyZSBub3QgTlVMTCwgYXNzdW1lIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgbG9va2VkIHVwIHRoZSBzeW1ib2wKLQlpbiB0aGUgaGFzaCB0YWJsZSBhbmQgaGFzIHN0b3JlZCB0aGUgZW50cnkgaW4gKmhhc2hwLgotCShnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogU2V0IGggdG8gTlVMTCBiZWZvcmUgY2FsbGluZwotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogTGlrZXdpc2UuCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBEb24ndCByZXF1aXJlCi0JcGFnZSBzaGFyZWQgYmV0d2VlbiAuZGF0YSBhbmQgLmJzcyBzZWdtZW50cyB0byBjb250YWluIHplcm9lcy4KLQotCSogZWxmY29kZS5oOiBJbmNsdWRlIGJmZGxpbmsuaC4gIEFkZGVkIHNldmVyYWwgbmV3IGZ1bmN0aW9ucyB0byBkbwotCWxpbmtpbmcuCi0JKEVMRl9SX1RZUEUpOiBEZWZpbmUuCi0JKGJmZF9hZGRfdG9fc3RydGFiKTogUmV0dXJuIHVuc2lnbmVkIGxvbmcuICBDaGFuZ2UgY2hlY2sgZm9yCi0JcmVhbGxvYyBmYWlsdXJlLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfYWRkX3RvX3N0cnRhYi4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkZCBsaW5rX2luZm8gYXJndW1lbnQuCi0JQ2FsbCBlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nIGhvb2sgYW5kIHByZXBfaGVhZGVycwotCWhlcmUuICBPbmx5IGNhbGwgc3dhcF9vdXRfc3ltcyBpZiBsaW5rX2luZm8gaXMgTlVMTC4gIFNldCB1cAotCS5zaHN0cnRhYiBzZWN0aW9uIGhlcmUuICBQYXNzIGRvc3ltcyBhcmd1bWVudCB0bwotCWFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzLiAgU2V0IG91dHB1dF9oYXNfYmVndW4gZmxhZy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zeW10YWJfYW5kX3N0cnRhYnMpOiBBZGQgZG9zeW1zCi0JYXJndW1lbnQsIGFuZCB1c2UgaXQgdG8gY29udHJvbCBzZXR0aW5nIC5zeW10YWIgYW5kIC5zdHJ0YWIgZmlsZQotCXBvc2l0aW9ucy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBBZGQgZG9zeW1zIGFyZ3VtZW50LCBhbmQKLQlwYXNzIGl0IG9uLgotCShwcmVwX2hlYWRlcnMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX2FkZF90b19zdHJ0YWIuCi0JKHN3YXBfb3V0X3N5bXMpOiBMaWtld2lzZS4gIEFsc28sIGRvbid0IHNldCB1cCAuc2hzdHJ0YWIgaGVyZS4KLQkoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBTb21lIGNhbGxzIG1vdmVkIGludG8KLQllbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLgotCShlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNITl9MT1JFU0VSViBjb3JyZWN0ZWQgdG8gU0hOX0xPUkVTRVJWRS4KLQkqIGxpYmVsZi5oOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIGNvbGxlY3QsCi0JZWxmX2FkZF9zeW1ib2xfaG9vaywgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbi4KLQkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIGZpZWxkIHJlbF9oYXNoZXMuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVtb3ZlIGZpZWxkcyBpbnRlcm5hbF9zeW1zIGFuZCBzeW1ib2xzLgotCUFkZCBmaWVsZCBzeW1faGFzaGVzLgotCShvYmpfc3ltYm9scywgb2JqX2ludGVybmFsX3N5bXMpOiBSZW1vdmUgZGVmaW5pdGlvbnMuCi0JKGVsZl9zeW1faGFzaGVzKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGVsZl9saW5rX2hhc2hfbG9va3VwKTogRGVmaW5lLgotCShlbGZfbGlua19oYXNoX3RyYXZlcnNlKTogRGVmaW5lLgotCShlbGZfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9iZmRfZmluYWxfbGluayk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9iZmRfZmluYWxfbGluayk6IERlY2xhcmUuCi0JKiBlbGYuYzogSW5jbHVkZSBiZmRsaW5rLmguCi0JKGVsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZjMyLXRhcmdldC5oIChlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgbm90IGRlZmluZWQsCi0JZGVmaW5lIGFzIDAgYW5kIHVzZSBnZW5lcmljIGxpbmtlci4gIE90aGVyd2lzZSwgdXNlIEVMRiBiYWNrZW5kCi0JbGlua2VyLgotCShlbGZfYmFja2VuZF9jb2xsZWN0KTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyBmYWxzZS4KLQkoZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAwLgotCShlbGYzMl9iZWQpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKiBlbGY2NC10YXJnZXQuaDogU2FtZSBjaGFuZ2VzIGFzIGVsZjMyLXRhcmdldC5oLgotCSogZWxmMzItaTM4Ni5jOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkqIGVsZjMyLXNwYXJjLmM6IEluY2x1ZGUgYmZkbGluay5oLgotCShlbGZfaW5mb190b19ob3d0byk6IENoYW5nZSB0eXBlIG9mIGRzdCBmcm9tIEVsZjMyX0ludGVybmFsX1JlbGEKLQl0byBFbGZfSW50ZXJuYWxfUmVsYSAodGhleSdyZSB0aGUgc2FtZSB0eXBlIGFueWhvdykuCi0JKGVsZl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCSogZWxmMzItbWlwcy5jIChlbGZfYmFja2VuZF9jb2xsZWN0KTogRGVmaW5lLgotCi0JKiBNYWtlZmlsZS5pbiAoc3RtcC1iZmQuaCk6IEF2b2lkIHVzZWxlc3MgbWFrZSBlcnJvciBtZXNzYWdlIGluIGEKLQlkaWZmZXJlbnQgd2F5OyB0b3VjaCB0YWtlcyBhIG51bWVyaWMgYXJndW1lbnQgb24gc29tZSBzeXN0ZW1zLgotCi1GcmkgTWF5ICA2IDEzOjM0OjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IFJld29yayBjdXN0b20gaGVhZGVyCi0JaGFuZGxpbmcgZm9yIGxhdGVzdCBzdWdnZXN0ZWQgZm9ybWF0LgotCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBMaWtld2lzZS4KLQkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCi1GcmkgTWF5ICA2IDExOjExOjUwIDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IGhhbmRsZSBlcnJpY3Nzb24gY29uZmlnIChmb3IgT1NFKS4KLQotVGh1IE1heSAgNSAxNTo0MDo0NyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JUGF0Y2hlcyBmcm9tIFJhbHBoIENhbXBiZWxsOgotCSogbWlwc2JzZC5jIChtaXBzX2ZpeF9qbXBfYWRkcik6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19maXhfaGkxNl9zKTogVXNlIGJmZF9pc19jb21fc2VjdGlvbi4KLQkobWlwc19ob3d0b190YWJsZV9leHQpOiBDYWxsIG1pcHNfZml4X2ptcF9hZGRyIGZvciBNSVBTX1JFTE9DX0pNUC4KLQotRnJpIE1heSAgNiAxMTo0ODo1NSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvZ28zMi5taDogWFggc3VwcG9ydC4KLQotCUZyb20gYmlsbAotCSogTWFrZWZpbGUuaW46IEJ1aWxkIHN5c2RlcC5oIHdpdGhvdXQgY2F1c2luZyB3b3JyeWluZyBidXQKLQloYXJtbGVzcyBlcnJvciBtZXNzYWdlLgotCi1XZWQgTWF5ICA0IDExOjA5OjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCUNoYW5nZWQgbTY4ay1hb3V0IHRvIHNldCBmbGFncyB0byAwOyBtNjhrLXN1bm9zIHN0aWxsIHVzZXMgMS4KLQkqIGFvdXQwLmM6IE5ldyBmaWxlLgotCSogdGFyZ2V0cy5jIChhb3V0MF9iaWdfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYW91dDBfYmlnX3ZlYy4KLQkqIGNvbmZpZy5iZmQgKG02OCotKi1hb3V0Kik6IFVzZSBtNjhrLTBhb3V0LCBub3QgbTY4ay1hb3V0LgotCSogY29uZmlnL202OGstYW91dC5tdCAoU0VMRUNUX1ZFQ1MpOiBSZW1vdmVkLgotCSogY29uZmlnL202OGstMGFvdXQubXQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChhb3V0MF9iaWdfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3I6IHVzZSBhb3V0MC5vLAotCWFvdXQzMi5vIGFuZCBzdGFiLXN5bXMuby4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgYW91dDAuby4KLQkoQ0ZJTEVTKTogQWRkIGFvdXQwLmMuCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkIGV4ZWNfaGRyX2ZsYWdzLgotCSogYW91dC10YXJnZXQuaCAoTVlfZXhlY19oZHJfZmxhZ3MpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDAuCi0JTVkoYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KLQkqIGFvdXRmMS5oIChzdW5vc18zMl9zZXRfYXJjaF9tYWNoKTogTWFrZSBzdGF0aWMuCi0JKGFvdXQzMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGZsYWdzIGZyb20gYmFja2VuZAotCWluZm8uCi0JKE1ZX2V4ZWNfaGRyX2ZsYWdzKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAxLgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KLQkqIGFvdXQtZW5jYXAuYyAoZW5jYXBfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGZsYWdzIGZyb20KLQliYWNrZW5kIGluZm8uCi0JKE1ZX2V4ZWNfaGRyX2ZsYWdzKTogRGVmaW5lIGFzIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURS4KLQkqIGhwMzAwaHB1eC5jIChNWV9leGVjX2hkcl9mbGFncyk6IERlZmluZSBhcyAweDIuCi0JKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBTZXQgZmxhZ3MgZnJvbSBiYWNrZW5kIGluZm8uCi0JKiBpMzg2YW91dC5jIChNWShiYWNrZW5kX2RhdGEpKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KLQkqIGkzODZtYWNoMy5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIHNwYXJjbHlueC5jIChOQU1FKGFvdXQsc3BhcmNseW54X3dyaXRlX29iamVjdF9jb250ZW50cykpOiBTZXQKLQlmbGFncyBmcm9tIGJhY2tlbmQgaW5mby4KLQkoc3BhcmNseW54X2FvdXRfYmFja2VuZCk6IEluaXRpYWxpemUgZXhlY19oZHJfZmxhZ3MgZmllbGQuCi0KLVdlZCBNYXkgIDQgMDI6NTY6MDAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKGkzODYtKi1nbnUqKTogVHJlYXQgbGlrZSBpMzg2LSotbWFjaCouCi0JKG02OCotYXBvbGxvLSopOiBUcmVhdCBhbGwgQXBvbGxvIGNvbmZpZ3MgdGhlIHNhbWUsIGRvbid0IGhhbmRsZQotCUJTRCBzcGVjaWFsbHkuCi0KLVR1ZSBNYXkgIDMgMTk6NDM6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjYWNoZS5jOiBSZXdyb3RlIHRvIHdvcmsgY29ycmVjdGx5LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBvcG5jbHMuYyAoYmZkX2NhY2hlX2luaXQsIGJmZF9vcGVuX2ZpbGUpOiBEb24ndCBkZWNsYXJlLgotCShiZmRfZmRvcGVucik6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfY2FjaGVfaW5pdC4KLQotRnJpIEFwciAyOSAxNTowODoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNmLW02OGtseW54LmMgKENBTENfQURERU5EKTogQ2hlY2sgZm9yIFBDIHJlbGF0aXZlIHJlbG9jcyBieQotCWVudW1lcmF0aW5nIHRoZW0sIHNpbmNlIHRoZSByZWxvYyB0eXBlIGNhbiBub3Qgc2VydmUgYXMgYW4gaW5kZXgKLQlpbnRvIHRoZSBtNjhrIENPRkYgaG93dG9fdGFibGUuCi0KLUZyaSBBcHIgMjkgMDk6NDI6MzkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy5iZmQgKCotZ28zMik6IENoYW5nZWQgdG8gY29mZi4KLQkqIGNvZmYtaDgzMDAuYyAoSk1QTDEpOiBHZXQgSE9XVE8gcmlnaHQgZm9yIDI0Yml0IGJyYW5jaGVzLgotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBXcml0ZSBvdXQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mCi0Jc3ltYm9scyBhbmQgZG9uJ3Qgc3RpY2sgaW4gZXh0cmEgbnVsbHMuCi0KLVR1ZSBBcHIgMjYgMTU6MDc6MjQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjZi1zcGFyY2x5bnguYyAoTFlOWE9TLCBDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lLgotCSogY29mZi1zcGFyYy5jIChCQURNQUcpOiBSZWNvZ25pemUgTFlOWENPRkZNQUdJQy4KLQkoQ09GRl9TUEFSQyk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IElmIENPRkZfU1BBUkMsIHNldCBhbGlnbm1lbnQKLQlwb3dlciBvZiBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgdG8gMy4KLQkqIGhvc3RzL2x5bnguaCAoX19MWU5YT1MpOiBEZWZpbmUuCi0KLVR1ZSBBcHIgMjYgMTU6MDQ6MjYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2MpOiBBZGp1c3QgdGhlIGFkZGVuZCBvZiByZWxvY2F0aW9ucwotCWFnYWluc3Qgc2VjdGlvbiBzeW1ib2xzIHRvIGF2b2lkIGxvc2luZyBkdXJpbmcgbGQgLXIuCi0KLVR1ZSBBcHIgMjYgMTI6MTY6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHNoc3RydGFiX2xlbmd0aF9maXhlZCk6IFJlbW92ZSB1c2VsZXNzIHN0YXRpYwotCXZhcmlhYmxlLgotCShzdHJ1Y3QgZWxmX3NlY3RfZGF0YSk6IFJlbW92ZSB1bnVzZWQgc3RydWN0dXJlLgotCShlbGZfb2JqZWN0X3ApOiBGcmVlIG1lbW9yeSBpZiBlcnJvciBvY2N1cnMuICBDaGVjayByZXR1cm4gdmFsdWUKLQlvZiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoLiAgSWYgZWxmX2dldF9zdHJfc2VjdGlvbiBmYWlscywKLQlwcmVzZXJ2ZSBlcnJvciBjb2RlIHJhdGhlciB0aGFuIHNldHRpbmcgd3JvbmdfZm9ybWF0LgotCShudWxsX3NoZHIpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogUmVtb3ZlIHNoc3RydGFiX2xlbmd0aF9maXhlZCBhc3NpZ25tZW50LgotCUFsbG9jYXRlIGZpcnN0IHNlY3Rpb24gaGVhZGVyIG9uIEJGRCBvYnN0YWNrIHJhdGhlciB0aGFuIHVzaW5nCi0JbnVsbF9zaGRyLgotCShiZmRfcHJwc2luZm8pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIG5ld3NlY3QuCi0KLU1vbiBBcHIgMjUgMTU6MzE6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IFVuZG8gcGF0Y2ggb2YgQXByIDEwOyBicmVha3MgU29sYXJpcy4KLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVc2UgYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkKLQl0byBjcmVhdGUgc2VjdGlvbnMuICBDaGVjayByZXR1cm4gdmFsdWUgb2YgcmVjdXJzaXZlIGNhbGxzLgotCShiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX21ha2Vfc2VjdGlvbi4KLQkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmX29iamVjdF9wKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9zZWN0aW9uX2Zyb21fc2hkci4KLQkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IExpa2V3aXNlLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0Jc2VjdGlvbl9mcm9tX2VsZl9pbmRleC4KLQkoYmZkX3Byc3RhdHVzKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUuICBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfbWFrZV9zZWN0aW9uLgotCShiZmRfZnByZWdzZXQpOiBMaWtld2lzZS4KLQkoYmZkX3BycHNpbmZvKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUuCi0JKGVsZl9jb3JlZmlsZV9ub3RlKTogQ2hlY2sgcmV0dXJuIHZhbHVlcyBvZiBiZmRfcHJzdGF0dXMsCi0JYmZkX2ZwcmVnc2V0LCBhbmQgYmZkX3BycHNpbmZvLgotCShlbGZfY29yZV9maWxlX3ApOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgZWxmX2NvcmVmaWxlX25vdGUuCi0KLUZyaSBBcHIgMjIgMTE6MDg6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JR2V0IHJpZCBvZiB0aGUgRUNPRkYgLnJlZ2luZm8gc2VjdGlvbiBoYWNrLgotCSogZWNvZmYuYyAoZWNvZmZfbWtvYmplY3RfaG9vayk6IERvbid0IGNyZWF0ZSBhIC5yZWdpbmZvIHNlY3Rpb24uCi0JKGVjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBEb24ndCBoYW5kbGUgdGhlIC5yZWdpbmZvIHNlY3Rpb24uCi0JKGVjb2ZmX3NpemVvZl9oZWFkZXJzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCShlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCi0JKGVjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IExpa2V3aXNlLgotCShlY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSB0aGUgR1AgdmFsdWUgYW5kIHRoZQotCXJlZ2lzdGVyIG1hc2tzLgotCShiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWNvZmZfc2V0X3JlZ21hc2tzKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUpOiBEZWNsYXJlLgotCShiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlKTogRGVjbGFyZS4KLQkoYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQlGaXggRUNPRkYgb2JqY29weSB0byBhY3R1YWxseSBjb3B5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX2dldF9leHRyKTogQXNzdW1lIHRoYXQgYW55IEVDT0ZGIHN5bWJvbCB3aXRoIGxvY2FsIGNsZWFyIGlzCi0JYW4gZXh0ZXJuYWwgc3ltYm9sLCByYXRoZXIgdGhhbiBjaGVja2luZyB0aGUgc3ltYm9sIGZsYWdzLiAgT25seQotCWNoZWNrIHRoZSBmbGFncyBmb3Igbm9uLUVDT0ZGIHN5bWJvbHMuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyk6IERvbid0IGNyYXNoIGlmIHRoZQotCW91dHB1dF9zZWN0aW9uIGZpZWxkIG9mIHRoZSBzeW1ib2wgc2VjdGlvbiBpcyBOVUxMLgotCSogbGliZWNvZmYuaCAoZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlY2xhcmUgYXMKLQlmdW5jdGlvbiByYXRoZXIgdGhhbiBkZWZpbmluZyBhcyBtYWNyby4KLQotCSogaWVlZS5jIChpZWVlX29iamVjdF9wKTogU2V0IGJmZF9lcnJvcl9nb3Rfd3JvbmdfZm9ybWF0IGlmCi0JYXBwcm9wcmlhdGUuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYmZkX2VsZjMyX3Bvd2VycGNfdmVjLgotCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfc2V0X2FyY2hfbWFjaCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guICBBY2NlcHQgYmZkX2FyY2hfbTY4ayBhcyB3ZWxsIGFzCi0JYmZkX2FyY2hfdW5rbm93bi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guCi0JKiBlbGZjb2RlLmggKGVsZl9zZXRfYXJjaF9tYWNoKTogRG9uJ3QgY2hlY2sgYSBsaXN0IG9mIEVMRgotCWFyY2hpdGVjdHVyZXMsIGp1c3Qgc2VlIGlmIHRoZSBkZXNpcmVkIGFyY2hpdGVjdHVyZSBtYXRjaGVzIHdoYXQKLQl0aGUgRUxGIGJhY2tlbmQgcGVybWl0cy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBSZW5hbWUgU0hNQUdJQyB0bwotCVNIX0FSQ0hfTUFHSUMgdG8gbWF0Y2ggY2hhbmdlIGluIGNvZmYvc2guaC4KLQkoY29mZl9zZXRfZmxhZ3MpOiBMaWtld2lzZS4KLQotCUZvbGxvdyBjb252ZW50aW9uIGluIHdoaWNoIGVhY2ggTkxNIGhlYWRlciBoYXMgYW4gOCBieXRlIHN0YW1wCi0JZm9sbG93ZWQgYnkgYSBmb3VyIGJ5dGUgbGVuZ3RoLgotCSogbGlibmxtLmggKHN0cnVjdCBubG1fb2JqX3RkYXRhKTogUmVuYW1lIG5sbV9jeWdudXNfc2VjdGlvbl9oZHIKLQl0byBubG1fY3lnbnVzX2V4dF9oZWFkZXIsIGFuZCBjaGFuZ2UgdHlwZSB0bwotCU5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlci4KLQkobmxtX2N5Z251c19leHRfaGVhZGVyKTogUmVuYW1lIGZyb20gbmxtX2N5Z251c19zZWN0aW9uX2hlYWRlci4KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBVc2UgQ3lHblVzRXggaW5zdGVhZAotCW9mIEN5R25Vc1NlQ3MuICBSZW5hbWUgZnJvbSBjeWdudXNfc2VjdGlvbiB0byBjeWdudXNfZXh0LiAgUmVxdWlyZQotCWxlbmd0aCB3b3JkIHRvIGJlIDguCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IFJlbmFtZSBmcm9tIGN5Z251c19zZWN0aW9uIHRvCi0JY3lnbnVzX2V4dC4gIFNldCBsZW5ndGggd29yZCB0byA4LgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUmVuYW1lIGZyb20gY3lnbnVzX3NlY3Rpb24KLQl0byBjeWdudXNfZXh0LgotCi1UaHUgQXByIDIxIDIyOjU0OjIyIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiAgS2VlcCBzZWN0aW9uIHRhYmxlCi0JKGZyb20gQ3lHblVzU2VDcykgaW4gbW9yZSBwZXJtYW5lbnQgbWVtb3J5IHRvIGtlZXAgc2VjdGlvbiBuYW1lcwotCWZyb20gZ2V0dGluZyB0cmFzaGVkLgotCi1UaHUgQXByIDIxIDA5OjI5OjM3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogbGliZWxmLmggKGVsZl9vYmpfdGRhdGEpOiAgQWRkIG1lbWJlcnMgZm9yIGR5bmFtaWMgc3ltYm9sIHRhYmxlCi0JaGFuZGxpbmcuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBIYW5kbGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgVGFrZSBhZGRpdGlvbmFsIHBhcmFtZXRlcgotCXRvIHNlbGVjdCBzdGF0aWMgb3IgZHluYW1pYyBzeW1ib2wgdGFibGUgYW5kIHJldHVybiBudW1iZXIgb2YKLQlzeW1ib2xzIHNsdXJwZWQgb3IgLTEgb24gZXJyb3IuCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfc3ltdGFiKTogIFNldCBiZmQgc3ltY291bnQgZnJvbQotCWVsZl9zbHVycF9zeW1ib2xfdGFibGUgcmVzdWx0LgotCSogZWxmY29kZS5oIChlbGZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kLAotCWVsZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiAgTmV3IGZ1bmN0aW9ucyB0byBoYW5kbGUgZHluYW1pYwotCXN5bWJvbCB0YWJsZS4KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaCAoQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyk6Ci0JQ2hhbmdlIHRvIGhhbmRsZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgcHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zCi0JZm9yIGR5bmFtaWMgcmVsb2NzLgotCSogYW91dHguaCAoaG93dG9fdGFibGVfc3RkLCBOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSwKLQlOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pLCBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQsCi0JYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiAgSGFuZGxlIHJfam1wdGFibGUgYW5kIHJfcmVsYXRpdmUKLQlyZWxvY2F0aW9ucy4KLQotVGh1IEFwciAyMSAxMTo1ODoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlDbGVhbiB1cCB1c2VzIG9mIF9iZmRfZHVtbXlfdGFyZ2V0IChmcm9tIFBldGVyIFNjaGF1ZXIpLgotCSogbGliYmZkLmMgKF9iZmRfZHVtbXlfdGFyZ2V0KTogU2V0IGJmZF9lcnJvcl93cm9uZ19mb3JtYXQuCi0JKiBubG0tdGFyZ2V0LmggKG5sbV9jb3JlX2ZpbGVfcCk6IERlZmluZSBhcyBfYmZkX2R1bW15X3RhcmdldCwgbm90Ci0JTlVMTC4KLQkqIHNyZWMuYyAoc3JlY192ZWMpOiBVc2UgX2JmZF9kdW1teV90YXJnZXQsIG5vdCBOVUxMLCBpbgotCV9iZmRfY2hlY2tfZm9ybWF0LgotCShzeW1ib2xzcmVjX3ZlYyk6IExpa2V3aXNlLgotCSogdGVraGV4LmMgKHRla2hleF92ZWMpOiBMaWtld2lzZS4KLQotCSogbGlibmxtLmggKHN0cnVjdCBubG1fb2JqX3RkYXRhKTogQWRkIG5sbV9jeWdudXNfc2VjdGlvbl9oZHIKLQlmaWVsZC4KLQkobmxtX2N5Z251c19zZWN0aW9uX2hlYWRlcik6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogRnJlZSBuZXcgdGRhdGEgc3RydWN0dXJlIGlmIGZhaWx1cmUuCi0JQWRkIGZpeGVkIHNlY3Rpb25zIGJlZm9yZSBzd2FwcGluZyBpbiBhdXhpbGlhcnkgaGVhZGVycy4gIEFmdGVyCi0JYWRkaW5nIHNlY3Rpb25zLCB0cmVhdCBlcnJvcnMgYXMgcmVhbCwgbm90IGFzIHdyb25nIGZvcm1hdC4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBTd2FwIGluIHRoZSBzZWN0aW9ucyBoZWFkZXI7IGFkZAotCXNlY3Rpb25zIHRvIHRoZSBCRkQgZm9yIGVhY2ggc2VjdGlvbiBpdCBkZXNjcmliZXMuCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IFN3YXAgb3V0IHRoZSBzZWN0aW9ucyBoZWFkZXIuCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBY2NvdW50IGZvciB0aGUgc2l6ZSBvZiB0aGUKLQlzZWN0aW9ucyBoZWFkZXIuCi0KLVdlZCBBcHIgMjAgMTY6NDU6NTEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29mZi1zcGFyYy5jIChzcGFyY2NvZmZfdmVjKTogQ2hhbmdlIG1pbmltdW0gYWxpZ25tZW50IHBvd2VyIHRvCi0JMiwgc28gdGhhdCBzdGFiIHNlY3Rpb25zIGNhbiBiZSBtdWx0aXBsZXMgb2YgNCBieXRlcyBvbmx5LgotCi0JKiBob3N0cy9pMzg2YWl4Lmg6IENoYW5nZXMgdG8gYXZvaWQgcHJvdG90eXBlcyBjb25mbGljdHMgd2l0aCB0aGUKLQlvbmVzIGRlZmluZWQgaW4gc3RkbGliLmguICAoRnJvbSBNaW5oIFRyYW4tTGUuKQotCi1XZWQgQXByIDIwIDE0OjE1OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtMzItcHBjLmM6IENvbXBsZXRlIHJld3JpdGUgZm9yIG5ldyB2ZXJzaW9uIG9mIFBvd2VyUEMKLQlOZXRXYXJlLiAgT2xkIGNvZGUgc3RpbGwgcHJlc2VudCwgYnV0IGlmZGVmZmVkIG91dC4KLQotCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IERvbid0IGFzc3VtZSBhCi0JcGFydGljdWxhciBmb3JtYXQgZm9yIHRoZSBjdXN0b21lciBoZWFkZXIuICBBbGxvY2F0ZSBhIGJsb2NrIG9mCi0JbWVtb3J5IGFuZCByZWFkIGl0IGludG8gdGhhdC4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogV3JpdGUgb3V0IHRoZSBibG9jayBvZiBtZW1vcnkuCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJbmNsdWRlIGxlbmd0aCBvZiBjdXN0b21lcgotCWhlYWRlciB3aGVuIGNvbXB1dGluZyBpdHMgc2l6ZS4KLQotTW9uIEFwciAxOCAxNDoyNzoxNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9wcmVwX2hlYWRlcnMpOiBHZXQgdGhlIHNwYWNlJ3MgbnVtYmVyIGZyb20gdGhlCi0JYmFja2VuZCBwcml2YXRlIHNlY3Rpb24gZGF0YSByYXRoZXIgdGhhbiB0YXJnZXRfaW5kZXguCi0JKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IFN0b3JlIHRoZSBzcGFjZSdzIG51bWJlcgotCWluIHRoZSBiYWNrZW5kIHByaXZhdGUgc2VjdGlvbiBkYXRhIHJhdGhlciB0aGFuIHRhcmdldF9pbmRleC4KLQotCSogc29tLmggKHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KTogQWRkIHNwYWNlX251bWJlci4KLQotRnJpIEFwciAxNSAxMjoyMjowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYTI5ay5jIChyZWxvY19wcm9jZXNzaW5nKTogQWx3YXlzIHNldCB0aGUgYWRkcmVzcyBvZiBhCi0JUl9JSENPTlNUIHJlbG9jIHRvIHRoYXQgb2YgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyBSX0lISUhBTEYuCi0JZ2FzIGRvZXMgdGhpcyBhbnlob3csIGJ1dCBzb21lIG90aGVyIGFzc2VtYmxlcnMgc2VlbSB0byBsZWF2ZQotCWdhcmJhZ2UgaW4gdGhlIFJfSUhDT05TVCBhZGRyZXNzIGZpZWxkLgotCi0JKiBiZmQvYXJjaGl2ZS5jOiBDb25zaXN0ZW50bHkgdXNlIEFSRk1BRzsgZnJvbQotCXNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSAoQW5kcmVhcyBTY2h3YWIpLgotCShfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBVc2UgQVJGTUFHIHJhdGhlciB0aGFuICdgJyBhbmQKLQknXDAxMicuCi0JKGJzZF93cml0ZV9hcm1hcCk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX2FybWFwKTogTGlrZXdpc2UuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBXaGVuIHJlbGF4aW5nLCBhZGp1c3QgbG9jYWwKLQlyZWxvY3MgYWdhaW5zdCB0aGUgLnRleHQgc2VjdGlvbiBhcyByZXF1aXJlZC4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IFdoZW4gcmVsYXhpbmcsIGFkanVzdAotCVBEUiBhZGRyZXNzZXMgYXMgcmVxdWlyZWQuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2VtaXRfYWdncmVnYXRlKTogVGFrZSBmZHIgYXJndW1lbnQuICBNYXAgZmRyCi0JaW5kZXggdGhyb3VnaCByZmQgbWFwIGlmIGl0IGV4aXN0cy4gIENoZWNrIGZvciBhIGNvdXBsZSBvZiBjYXNlcwotCXdoaWNoIGdkYiBoYW5kbGVzIHNwZWNpYWxseS4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZWNvZmZfdHlwZV90b19zdHJpbmcpOiBUYWtlIGZkciBhcmd1bWVudCByYXRoZXIgdGhhbiBhdXhfcHRyIGFuZAotCWJpZ2VuZGlhbiBhcmd1bWVudC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZWNvZmZfcHJpbnRfc3ltYm9sKTogSGFuZGxlIHN0U3RydWN0LCBzdFVuaW9uIGFuZCBzdEVudW0uCi0KLVRodSBBcHIgMTQgMTM6MDU6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IEFkZCBkdW1teSBlbnRyaWVzIHRvIGFjY291bnQgZm9yCi0JbnVtYmVyaW5nIGNoYW5nZXMgaW4gaW5jbHVkZS9jb2ZmL21pcHMuaC4gIEFkZCBlbnRyaWVzIGZvcgotCU1JUFNfUl9SRUxISSBhbmQgTUlQU19SX1JFTExPLgotCShtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4pOiBIYW5kbGUgYW4gZXh0cmEgYml0IGZvciB0aGUgcmVsb2MgdHlwZQotCXdoZW4gbGl0dGxlIGVuZGlhbi4gIFRyZWF0IGludGVybmFsIE1JUFNfUl9SRUxMTyBvciBNSVBTX1JfUkVMSEkKLQlyZWxvY3MgbGlrZSBNSVBTX1JfU1dJVENILCBhbmQgY29udmVydCByX29mZnNldCBmcm9tIDI0IHRvIDMyCi0JYml0cy4KLQkobWlwc19lY29mZl9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgotCShtaXBzX2FkanVzdF9yZWxvY19pbik6IEhhbmRsZSBpbnRlcm5hbCBNSVBTX1JfUkVMTE8gb3IKLQlNSVBTX1JfUkVMSEkgcmVsb2NzIGxpa2UgTUlQU19SX1NXSVRDSC4KLQkobWlwc19hZGp1c3RfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKG1pcHNfcmVsaGlfYWRkciwgbWlwc19yZWxoaV9hZGRlbmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobWlwc19yZWxoaV9yZWxvYywgbWlwc19yZWxsb19yZWxvYyk6IE5ldyBmdW5jdGlvbnMuCi0JKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVHVybiBCRkRfUkVMT0NfUENSRUxfSEkxNl9TIGludG8KLQlNSVBTX1JfUkVMSEkgYW5kIHR1cm4gQkZEX1JFTE9DX1BDUkVMX0xPMTYgaW50byBNSVBTX1JfUkVMTE8uCi0JKG1pcHNfcmVsb2NhdGVfaGkpOiBSZW5hbWUgZnJvbSBtaXBzX3JlbG9jYXRlX3JlZmhpLCBhbmQgYWRkIHBjcmVsCi0JYXJndW1lbnQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW5hbWUgZ290X3JlZmxvIHRvIGdvdF9sbyBhbmQKLQlyZWZsb19pbnRfcmVsIHRvIGxvX2ludF9yZWwuICBIYW5kbGUgTUlQU19SX1JFTExPIGFuZCBNSVBTX1JfUkVMSEkKLQlyZWxvY3MuCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IEFkanVzdCBNSVBTX1JfUkVMSEkvTUlQU19SX1JFTExPIHBhaXJzIHdoZW4KLQlleHBhbmRpbmcgYSBQQyByZWxhdGl2ZSBjYWxsLgotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGQgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUwotCWFuZCBCRkRfUkVMT0NfUENSRUxfTE8xNi4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotV2VkIEFwciAxMyAxMTo1MDowNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IFNldCBtaW5pbXVtIGFsaWdubWVudCBwb3dlciB0byAzLgotCi1UdWUgQXByIDEyIDEzOjM2OjIwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IEFsd2F5cyBlbWl0IGF0IGxlYXN0Ci0gICAgICAgIG9uZSByZWxvY2F0aW9uIGZvciBhbnkgbm9uLWJzcyBzZWN0aW9uLgotCi1Nb24gQXByIDExIDE0OjQxOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IERvbid0IHJlcXVpcmUKLQl0aGUgZmlsZSBhbGlnbm1lbnQgdG8gY29ycmVzcG9uZCB0byB0aGUgcGFnZSBzaXplIHdoZW4gbGlua2luZwotCXdpdGggLU4uCi0KLVN1biBBcHIgMTAgMDE6MDI6MjQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogRm9yIHJlbGEgcmVsb2NhdGlvbnMsIGFkanVzdCB0aGUKLQlhZGRlbmQgZm9yIHJlbG9jYXRpb25zIGludm9sdmluZyBzZWN0aW9uIHN5bWJvbHMgdG8gYWNjb3VudAotCWZvciB0aGUgbG9zc2FnZSBvZiAxOjEgbWFwcGluZyBmcm9tIGlucHV0IHNlY3Rpb24gc3ltYm9scyB0bwotCW91dHB1dCBzZWN0aW9uIHN5bWJvbHMuCi0KLUZyaSBBcHIgIDggMTI6MjI6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykpOiBOZXcgZnVuY3Rpb24uCi0JKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogQ2FsbCBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykKLQlyYXRoZXIgdGhhbiBtYWtpbmcgc2VjdGlvbnMgaW5saW5lLgotCShOQU1FKGFvdXQsbWtvYmplY3QpKTogRG9uJ3QgbWFrZSBhbnkgc2VjdGlvbnMuCi0JKE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpKTogQ2FsbCBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykuCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IERvbid0IGRlcmVmZXJlbmNlIG9ial90ZXh0c2VjIChhYmZkKSBvcgotCW9ial9kYXRhc2VjIChhYmZkKSBpZiB0aGV5IGFyZSBOVUxMLgotCSogbGliYW91dC5oIChOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykpOiBEZWNsYXJlLgotCSogYm91dC5jIChiX291dF9ta29iamVjdCk6IERvbid0IG1ha2UgYW55IHNlY3Rpb25zLgotCShiX291dF93cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGFvdXRfMzJfbWFrZV9zZWN0aW9ucy4KLQkoYl9vdXRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIGkzODZvczlrLmMgKG9zOWtfbWtvYmplY3QpOiBEb24ndCBtYWtlIGFueSBzZWN0aW9ucy4KLQkob3M5a193cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGFvdXRfMzJfbWFrZV9zZWN0aW9ucy4KLQkob3M5a19zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vaykpOiBEb24ndCBzZXQgTl9FWFQgaW4gdGFyZ2V0Ci0JaW5kZXguCi0KLVdlZCBBcHIgIDYgMjA6NDQ6NTYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdDogIEFkZCBtaXBzLSotc3lzdjQqIHN1cHBvcnQuCi0KLVRodSBBcHIgIDcgMTQ6MjM6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IEFkZCBlbnRyeSBmb3IgTUlQU19SX1NXSVRDSC4KLQkobWlwc19lY29mZl9zd2FwX3JlbG9jX2luKTogRm9yIE1JUFNfUl9TV1RJQ0gsIGNvcHkgcl9zeW1uZHggaW50bwotCXJfb2Zmc2V0IGFuZCBzZXQgcl9zeW1uZHggdG8gUkVMT0NfU0VDVElPTl9URVhULgotCShtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogRm9yIE1JUFNfUl9TV0lUQ0gsIGdldCB0aGUgcl9zeW1uZHgKLQl2YWx1ZSBmcm9tIHRoZSByX29mZnNldCBmaWVsZC4KLQkobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBNYXhpbXVtIHJfdHlwZSB2YWx1ZSBpcyBub3cgTUlQU19SX1NXSVRDSC4KLQlGb3IgTUlQU19SX1NXSVRDSCwgY29weSB0aGUgcl9vZmZzZXQgZmllbGQgaW50byB0aGUgYWRkZW5kIGZpZWxkLgotCShtaXBzX2FkanVzdF9yZWxvY19vdXQpOiBGb3IgTUlQU19SX1NXSVRDSCwgY29weSB0aGUgYWRkZW5kIGZpZWxkCi0JaW50byB0aGUgcl9vZmZzZXQgZmllbGQuCi0JKG1pcHNfc3dpdGNoX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFRyYW5zbGF0ZSBCRkRfUkVMT0NfR1BSRUwzMiBpbnRvCi0JTUlQU19SX1NXSVRDSC4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIE1JUFNfUl9TV0lUQ0guCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IEFkanVzdCBNSVBTX1JfU1dJVENIIG9mZnNldCBpZiBuZWNlc3NhcnkuCi0KLVRodSBBcHIgIDcgMTE6MTA6NTEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU3VwcG9ydCBjYWxsaW5nIHRoZSBiYWNrZW5kCi0JZnVuY3Rpb24gZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyB3aGVuIGp1c3QgYmVnaW5uaW5nIHRvCi0Jd3JpdGUgYW4gb2JqZWN0IGZpbGUuCi0KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogRGVjbGFyZS4KLQotCSogZWxmezMyLDY0fS10YXJnZXQuaCAoZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IFByb3ZpZGUKLQlhIGRlZmF1bHQgZGVmaW5pdGlvbi4KLQkoZWxmezMyLDY0fV9iZWQpOiBBZGQgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZy4KLQkKLQkqIGVsZjMyLWhwcGEuaCAoZWxmX2hwcGFfdGNfc3ltYm9sKTogRGVsZXRlIGV4dGVybiBkZWNsYXJhdGlvbi4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1ocHBhLmMgKHN5bWV4dF9jaGFpbl9idWlsdCk6IERlbGV0ZS4KLQkoc3ltZXh0X2NoYWluX3NpemUpOiBSZW5hbWVkIGZyb20gc3ltZXh0bl9jb250ZW50c19yZWFsX3NpemUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF97YmVnaW4sZmluYWx9X3dyaXRlX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb25zLgotCShhZGRfZW50cnlfdG9fc3ltZXh0X2NoYWluKTogTmV3IGZ1bmN0aW9uLgotCShocHBhX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IElnbm9yZSB3cml0ZXMgdG8gdGhlIHN5bWJvbCBleHRlbnNpb24KLQlzZWN0aW9uIHVudGlsIGl0J3MgYmVlbiByZWJ1aWx0IGludGVybmFsbHkuCi0JKGhwcGFfZWxmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogU3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIGlzIG5vCi0JbG9uZ2VyIHNwZWNpYWwuCi0JKGVsZl9iYWNrZW5kX3tiZWdpbixmaW5hbH1fd3JpdGVfcHJvY2Vzc2luZyk6IERlZmluZS4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IFNpbXBsaWZ5IG5vdyB0aGF0IG11Y2ggY29kZSBoYXMKLQltaWdyYXRlZCBpbnRvIGVsZjMyX2hwcGFfYmFja2VuZF97YmVpbmcsZmluYWx9X3dyaXRlX3Byb2Nlc3NpbmcuCi0KLVdlZCBBcHIgIDYgMTc6MjQ6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkIG5ldyB0YXJnZXQgdmVjdG9ycyB0byByZWFkIHRoZSBkeW5hbWljIHN5bWJvbHMgYW5kIGR5bmFtaWMKLQlyZWxvY3MuICBDaGFuZ2UgYS5vdXQgdG8gdXNlIHRoZXNlIHJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIGR5bmFtaWMKLQlzeW1ib2xzIGFuZCByZWxvY3MgYWxvbmcgd2l0aCB0aGUgbm9ybWFsIHN5bWJvbHMgYW5kIHJlbG9jcy4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBmaWVsZHMKLQlfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCwKLQlfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiwKLQlfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kLAotCV9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MuCi0JKEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMpOiBEZWZpbmUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKToKLQlEZWZpbmUuCi0JKF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IERlZmluZS4KLQkoX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVmaW5lLgotCSogYmZkLmMgKGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBEZWZpbmUuCi0JKGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVmaW5lLgotCSogc3Vub3MuYyAoTVlfcmVhZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUuCi0JKE1ZX3JlYWRfZHluYW1pY19yZWxvY3MpOiBEb24ndCBkZWZpbmUuCi0JKE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogRGVmaW5lLgotCShNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZS4KLQkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWZpbmUuCi0JKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8pOiBDaGFuZ2UgdHlwZSBvZiBkeW5zeW1fY291bnQgYW5kCi0JZHlucmVsX2NvdW50IHRvIGxvbmcuICBBZGQgZmllbGRzIGNhbm9uaWNhbF9keW5zeW0gYW5kCi0JY2Fub25pY2FsX2R5bnJlbC4KLQkoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiBDaGVjayB0aGF0IEJGRCBoYWQgRFlOQU1JQyBmbGFnIHNldC4KLQlDbGVhciBpbmZvLT5jYW5vbmljYWxfZHluc3ltIGFuZCBpbmZvLT5jYW5vbmljYWxfZHlucmVsLgotCShNWShyZWFkX2R5bmFtaWNfc3ltYm9scykpOiBSZW1vdmVkLgotCShNWShyZWFkX2R5bmFtaWNfcmVsb2NzKSk6IFJlbW92ZWQuCi0JKHN1bm9zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogTmV3IGZ1bmN0aW9uLgotCShzdW5vc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJhb3V0Lmg6IERlY2xhcmUgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCBhbmQKLQlyZWxvY19zdGRfZXh0ZXJuYWwgdG8gYXZvaWQgcHJvdG90eXBlIHByb2JsZW1zLgotCShzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgZmllbGRzIHJlYWRfZHluYW1pY19zeW1ib2xzIGFuZAotCXJlYWRfZHluYW1pY19yZWxvY3MuCi0JKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSk6IERlY2xhcmUuCi0JKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBEZWNsYXJlLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pKTogRGVjbGFyZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSk6IFJlbmFtZWQgZnJvbQotCXRyYW5zbGF0ZV9zeW1ib2xfdGFibGUgYW5kIG1hZGUgbm9uLXN0YXRpYy4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogRG9uJ3QgcmVhZCBkeW5hbWljIHN5bWJvbHMuCi0JKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBEb24ndCByZWFkIGR5bmFtaWMgcmVsb2NzLgotCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IERvbid0IGNvdW50IGR5bmFtaWMgcmVsb2NzLgotCSogYW91dGYxLmggKGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGJvdGhlciB0bwotCXJlbW92ZSBkeW5hbWljIHN5bWJvbHMgYW5kIHJlbG9jcy4gIFRoZXkgd2lsbCBubyBsb25nZXIgYmUKLQlwcmVzZW50LgotCShNWV9yZWFkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkoTVlfcmVhZF9keW5hbWljX3JlbG9jcyk6IERvbid0IGRlZmluZS4KLQkoc3Vub3M0X2FvdXRfYmFja2VuZCk6IERvbid0IGluaXRpYWxpemUgZHluYW1pYyBlbnRyeSBwb2ludHMuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9yZWFkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGRlZmluZS4KLQkoTVlfcmVhZF9keW5hbWljX3JlbG9jcyk6IERvbid0IGRlZmluZS4KLQkoTVkoYmFja2VuZF9kYXRhKSk6IERvbid0IGluaXRpYWxpemUgZHluYW1pYyBlbnRyeSBwb2ludHMuCi0JKE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgdG8KLQlfYmZkX25vZHluYW1pYyB2ZXJzaW9uLgotCShNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBMaWtld2lzZS4KLQkoTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBMaWtld2lzZS4KLQkqIEFsbCBiYWNrZW5kczogQWRkZWQgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyB0byB0YXJnZXQgdmVjdG9yLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGNmLW02OGtseW54LmM6IEluY2x1ZGUgc3lzZGVwLmguCi0KLQkqIGhwMzAwaHB1eC5jOiBSZW1vdmVkIHNvbWUgc3BhY2VzIGluIHVzZXMgb2YgTkFNRSB0byBhdm9pZAotCXByb2JsZW1zIHdpdGggdHJhZGl0aW9uYWwgQyBjb21waWxlcnMuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlYXJyYW5nZWQgZmllbGRzIGluIHRhcmdldCB2ZWN0b3IuCi0JUmVtb3ZlZCBfYmZkX2RlYnVnX2luZm9fc3RhcnQsIF9iZmRfZGVidWdfaW5mb19lbmQgYW5kCi0JX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUsIHdoaWNoIHdlcmUgbmV2ZXIgdXNlZC4KLQkoQkZEX0pVTVBfVEFCTEVfR0VORVJJQywgQkZEX0pVTVBfVEFCTEVfQ09QWSk6IERlZmluZWQuCi0JKEJGRF9KVU1QX1RBQkxFX0NPUkUsIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUpOiBEZWZpbmVkLgotCShCRkRfSlVNUF9UQUJMRV9TWU1CT0xTLCBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MpOiBEZWZpbmVkLgotCShCRkRfSlVNUF9UQUJMRV9XUklURSwgQkZEX0pVTVBfVEFCTEVfTElOSyk6IERlZmluZWQuCi0JKiBBbGwgYmFja2VuZHM6IENoYW5nZWQgdG8gdXNlIHRoZSBuZXcgQkZEX0pVTVBfVEFCTEVfKiBtYWNyb3MKLQlyYXRoZXIgdGhhbiB0aGUgc2luZ2xlIEpVTVBfVEFCTEUgbWFjcm8uICBSZW1vdmVkIG1hbnkgb2YgdGhlCi0Jd2VpcmQgbWFjcm8gZGVmaW5pdGlvbnMgbmVlZGVkIHRvIHN1cHBvcnQgdGhlIG1vbm9saXRoaWMKLQlKVU1QX1RBQkxFLgotCSogYmZkLWluLmggKEpVTVBfVEFCTEUpOiBSZW1vdmVkLgotCSogbGliYmZkLWluLmg6IERlZmluZSBhIGJ1bmNoIG9mIG1hY3JvcywgYW5kIGRlY2xhcmUgYSBmZXcKLQlmdW5jdGlvbnMsIGZvciB1c2Ugd2l0aCB0aGUgbmV3IEJGRF9KVU1QX1RBQkxFXyogbWFjcm9zLgotCSogbGliYmZkLmMgKF9iZmRfZHVtbXlfbmV3X3NlY3Rpb25faG9vayk6IFJlbW92ZWQuCi0JKGJmZF9mYWxzZSk6IFNldCBiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24uCi0JKGJmZF9udWxsdm9pZHB0cik6IExpa2V3aXNlLgotCShiZmRfbjEpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6IFJlbmFtZWQgZnJvbQotCV9iZmRfZHVtbXlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wLgotCShfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKTogU2ltaWxhciByZW5hbWUuICBTZXQKLQliZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24uCi0JKF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBSZW5hbWVkIGZyb20KLQliZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cy4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IFNpbWlsYXIgcmVuYW1lLgotCSogaWVlZS5jOiAjaWYgMCBvdXQgaWVlZV9iZmRfZGVidWdfaW5mb19zdGFydCwKLQlpZWVlX2JmZF9kZWJ1Z19pbmZvX2VuZCwgaWVlZV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlLiAgVGhleQotCXdlcmUgbmV2ZXIgY2FsbGVkLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVR1ZSBBcHIgIDUgMjI6MTA6MDQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIENydWRlIHN1cHBvcnQgZm9yIGV4YW1pbmluZyBkeW5hbWljIGxpYnJhcmllcy4KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogU2V0IERZTkFNSUMgZmxhZyBmb3IgU0hMX01BR0lDIGFuZAotCURMX01BR0lDIG9iamVjdHMuCi0JKHNvbV9wcmVwX2hlYWRlcnMpOiBQcmVzZXJ2ZSB0aGUgc3lzdGVtX2lkIGZvciBEWU5BTUlDIG9iamVjdHMuCi0JVXNlIFNITF9NQUdJQyBhcyB0aGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBEWU5BTUlDIGZsYWcgaXMgc2V0LgotCVdyaXRlIGV4ZWMgaGVhZGVycyBmb3IgRFlOQU1JQyBvYmplY3RzLgotCShzb21fYmVnaW5fd3JpdGluZyk6IERZTkFNSUMgb2JqZWN0cyBoYXZlIHRoZSBzYW1lIGFsaWdubWVudAotCXJlc3RyaWN0aW9ucyBhcyBEX1BBR0VEIG9iamVjdHMuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFRyZWF0IERZTkFNSUMgb2JqZWN0cyBsaWtlIEVYRUNfUAotCW9iamVjdHMuCi0JKG9iamVjdF9mbGFncyk6IEFkZCBEWU5BTUlDLgotCi1UdWUgQXByICA1IDE3OjQ4OjUyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogaTM4Nmx5bnguYywgc3BhcmNseW54LmMgKE5BTUUpOiBSZW1vdmUgZW1iZWRkZWQgd2hpdGVzcGFjZSBpbgotCW1hY3JvIHVzZXMsIGNvbmZ1c2VzIHNvbWUgbm9uLUFOU0kgY29tcGlsZXJzLgotCi1UdWUgQXByICA1IDE1OjUwOjAxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogQWRkIG1pc3NpbmcgUEFSQU1TIGRlY2wuCi0JRG9uJ3QgZnJlZSBhbnl0aGluZyBpZiB3ZSBkb24ndCBoYXZlIGEgYmZkX29iamVjdC4KLQkoc29tX2Nsb3NlX2FuZF9jbGVhbnVwKTogQ2FsbCBzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8uCi0KLVR1ZSBBcHIgIDUgMTE6MjI6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBEb24ndCByZW1vdmUgZW1wdHkgc2VjdGlvbnMuCi0JSXQgdHVybnMgb3V0IG5vdCB0byBiZSByZXF1aXJlZCBvbiBJcml4IDUsIGFuZCBpdCBjYXVzZXMgcHJvYmxlbXMKLQlpZiB0aGUgc2VjdGlvbnMgaGFwcGVuIHRvIGNvbnRhaW4gc3ltYm9scy4KLQotCSogZWxmY29kZS5oICh3cml0ZV9zaGRyc19hbmRfZWhkcik6IENvcnJlY3QgYmZkX3dyaXRlIGNoZWNrLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSk6IERvbid0IGVycm9yIG91dCBpZgotCXNlY3Rpb24tPnJlbG9jYXRpb24gaXMgTlVMTDsgbWFsbG9jIG1pZ2h0IGhhdmUgcmV0dXJuZWQgTlVMTCB3aGVuCi0JZ2l2ZW4gYSB6ZXJvIHNpemUgaWYgdGhlcmUgd2VyZSBubyByZWxvY2F0aW9ucy4KLQkqIGJvdXQuYyAoYl9vdXRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkoY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIG5sbWNvZGUuaCAobmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9yZWxvY190YWJsZSkpOiBMaWtld2lzZS4gIEFsc28sIGlmIG1hbGxvYwotCXJldHVybnMgTlVMTCwgZG9uJ3QgcmVwb3J0IGFuIGVycm9yIGlmIHdlIGFza2VkIGZvciB6ZXJvIGJ5dGVzLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSk6IElmIG1hbGxvYyByZXR1cm5zCi0JTlVMTCwgZG9uJ3QgcmVwb3J0IGFuIGVycm9yIGlmIHdlIGFza2VkIGZvciB6ZXJvIGJ5dGVzLgotCSogbmxtY29kZS5oIChubG1fc2x1cnBfcmVsb2NfZml4dXBzKTogTGlrZXdpc2UuCi0KLU1vbiBBcHIgIDQgMTU6MzA6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pKTogRG9uJ3QgZnJlZSBhbnl0aGluZwotCWlmIHdlIGRvbid0IGhhdmUgYSBiZmRfb2JqZWN0LgotCi0JTWFkZSBzdXJlIHRoYXQgZXZlcnkgY2FsbCB0byBiZmRfcmVhZCwgYmZkX3dyaXRlLCBhbmQgYmZkX3NlZWsKLQljaGVja3MgdGhlIHJldHVybiB2YWx1ZSBhbmQgaGFuZGxlZCBiZmRfZXJyb3IgY29ycmVjdGx5LiAgVGhlc2UKLQljaGFuZ2VzIGFyZSBub3QgaXRlbWlzZWQuICBBbHNvOgotCSogYW91dHguaCAoZW1pdF9zdHJ0YWIpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbiwgYW5kIHJldHVybgotCWVycm9ycy4KLQkoTkFNRShhb3V0LHdyaXRlX3N5bXMpKTogQ2hlY2sgZW1pdF9zdHJ0YWIgcmV0dXJuIHZhbHVlLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4sCi0JYW5kIHJldHVybiBlcnJvcnMuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgY29mZl93cml0ZV9yZWxvY3MgcmV0dXJuCi0JdmFsdWUuCi0JKiBpMzg2b3M5ay5jIChvczlrX3N3YXBfZXhlY19oZWFkZXJfaW4pOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8KLQlib29sZWFuLgotCShvczlrX29iamVjdF9wKTogQ2hlY2sgb3M5a19zd2FwX2V4ZWNfaGVhZGVyX2luIHJldHVybiB2YWx1ZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3JlYWRfcmVjb3JkKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JKG9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZTogQ2hlY2sgb2FzeXNfcmVhZF9yZWNvcmQgcmV0dXJuIHZhbHVlLgotCShvYXN5c19vYmplY3RfcCwgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhKTogTGlrZXdpc2UuCi0JKG9hc3lzX3dyaXRlX3JlY29yZCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCShvYXN5c193cml0ZV9zeW1zKTogTGlrZXdpc2UuICBBbHNvLCBjaGVjayBvYXN5c193cml0ZV9yZWNvcmQKLQlyZXR1cm4gdmFsdWUuCi0JKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogQ2hlY2sgb2FzeXNfd3JpdGVfcmVjb3JkIHJldHVybiB2YWx1ZS4KLQkob2FzeXNfd3JpdGVfaGVhZGVyKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uICBDaGVjawotCW9hc3lzX3dyaXRlX3JlY29yZCByZXR1cm4gdmFsdWUuCi0JKG9hc3lzX3dyaXRlX2VuZCwgb2FzeXNfd3JpdGVfZGF0YSk6IExpa2V3aXNlLgotCShvYXN5c193cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWVzIG9mCi0Jb2FzeXNfd3JpdGVfaGVhZGVyLCBvYXN5c193cml0ZV9zeW1zLCBvYXN5c193cml0ZV9kYXRhLCBhbmQKLQlvYXN5c193cml0ZV9lbmQuCi0JKiBzcmVjLmMgKHNyZWNfd3JpdGVfcmVjb3JkKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JKHNyZWNfd3JpdGVfaGVhZGVyKTogTGlrZXdpc2UuICBBbHNvLCBjaGVjayBzcmVjX3dyaXRlX3JlY29yZAotCXJldHVybiB2YWx1ZS4KLQkoc3JlY193cml0ZV9zZWN0aW9uLCBzcmVjX3dyaXRlX3Rlcm1pbmF0b3IpOiBMaWtld2lzZS4KLQkoc3JlY193cml0ZV9zeW1ib2xzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JKGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0Jc3JlY193cml0ZV9zeW1ib2xzLCBzcmVjX3dyaXRlX2hlYWRlciwgc3JlY193cml0ZV9zZWN0aW9uLCBhbmQKLQlzcmVjX3dyaXRlX3Rlcm1pbmF0b3IuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotTW9uIEFwciAgNCAxMDo1Njo0NSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFpeDM4Ni1jb3JlLmMgKGFpeDM4Nl9iZmRfaXNfbG9jYWxfbGFiZWwpOiAgQ29ycmVjdCBjYXN0IGZyb20KLQlhc2VjdGlvbiB0byBhc3ltYm9sLgotCSogcHRyYWNlLWNvcmUuYyAocHRyYWNlX3VuaXhfYmZkX2lzX2xvY2FsX2xhYmVsKTogIENvcnJlY3QgY2FzdCBmcm9tCi0JYmZkIHRvIGFzeW1ib2wuCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2JmZF9pc19sb2NhbF9sYWJlbCk6ICBDb3JyZWN0IGNhc3QgZnJvbQotCWFzZWN0aW9uIHRvIGFzeW1ib2wuCi0KLVN1biBBcHIgIDMgMTg6Mjc6MjkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogVXNlIG1hbGxvYyB0byBhbGxvY2F0ZSBzcGFjZQotCWZvciB0aGUgY2FjaGVkIGNvcHkgb2YgdGhlIG5hdGl2ZSBzdHJpbmcgdGFibGUuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZSBmb3IgdGhlIG5hdGl2ZSBzeW1ib2wgdGFibGUuCi0JKHNvbV9zbHVycF9yZWxvY190YWJsZSk6IExpa2V3aXNlIGZvciB0aGUgbmF0aXZlIGFuZCBnZW5lcmljCi0JcmVsb2NhdGlvbiB0YWJsZXMuCi0JKHNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IEZyZWUgdGhlIGNhY2hlZCBuYXRpdmUgc3RyaW5ncywKLQlzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbnMuICBBbHNvIGZyZWUgdGhlIGNhbm9uaWNhbCBjYWNoZWQKLQlyZWxvY2F0aW9ucy4KLQotRnJpIEFwciAgMSAxMjo0MDo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSWYga2VlcF9tZW1vcnkgaXMgZmFsc2UsIG1ha2UKLQlzdXJlIHRoZSBzeW1ib2wgbmFtZSBpcyBzdG9yZWQgaW4gcGVybWFuZW50IG1lbW9yeSBiZWZvcmUgYWRkaW5nCi0JaXQgdG8gdGhlIHN0cmluZyB0YWJsZS4KLQotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBPbmNlIHdlJ3ZlIGZvdW5kIGFuCi0Jb2JqZWN0LCBkb24ndCBib3RoZXIgdG8gbG9vayBmb3IgbW9yZSB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8KLQlidWlsZCBhIG1hcC4KLQkoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBBZnRlciBhZGRpbmcgdGhlIHN5bWJvbHMgZm9yIGEgQkZELAotCWNhbGwgYmZkX2ZyZWVfY2FjaGVkX2luZm8gb24gaXQuCi0KLQlBZGQgYmZkX2ZyZWVfY2FjaGVkX2luZm8gc3VwcG9ydCB0byBhLm91dCBiYWNrZW5kcy4KLQkqIGFvdXR4LmggKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBSZW5hbWVkIGZyb20KLQlhb3V0X2xpbmtfZ2V0X3N5bWJvbHMuICBSZWFkIHN0cmluZ3MgZXZlbiBpZiBzeW1ib2xzIGhhdmUgYmVlbgotCXJlYWQuICBTdG9yZSBzdHJpbmcgc2l6ZSBpbiBvYmpfYW91dF9zdHJpbmdfc2l6ZS4KLQkoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBDYWxsIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgdG8KLQlyZWFkIHRoZSBzeW1ib2xzLiAgQWxsb2NhdGUgdGhlIGNhY2hlZCBzeW1ib2xzIHdpdGggbWFsbG9jLCBub3QKLQliZmRfYWxsb2MuCi0JKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBBbGxvY2F0ZSB0aGUgY2FjaGVkIHJlbG9jcyB3aXRoCi0JbWFsbG9jLCBub3QgYmZkX2FsbG9jLgotCShOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pKTogTmV3IGZ1bmN0aW9uOyBmcmVlIGNhY2hlZAotCXN5bWJvbHMgYW5kIHJlbG9jcy4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIGV4dGVybmFsX3N0cmluZ19zaXplIGZpZWxkLgotCShvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSk6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkoTkFNRShhb3V0LGNsb3NlX2FuZF9jbGVhbnVwKSk6IERvbid0IGRlY2xhcmUuCi0JKE5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykpOiBEZWNsYXJlLgotCShhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwKTogRG9uJ3QgZGVmaW5lLgotCShhb3V0XzY0X2Nsb3NlX2FuZF9jbGVhbnVwKTogRG9uJ3QgZGVmaW5lLgotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBJZiBub3QgYWxyZWFkeSBkZWZpbmVkLAotCWRlZmluZSBhcyBOQU1FKGFvdXQsZnJlZV9jYWNoZWRfaW5mbykuCi0JKE1ZX2Nsb3NlX2FuZF9jbGVhbnVwKTogSWYgbm90IGFscmVhZHkgZGVmaW5lZCwgZGVmaW5lIGFzCi0JTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8uCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXApOiBEZWZpbmUuCi0JKGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEb24ndCBkZWZpbmUuCi0JKiBib3V0LmMgKGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXApOiBEZWZpbmUuCi0JKGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEb24ndCBkZWZpbmUuCi0JKiBocDMwMGhwdXguYyAoTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEZWZpbmUgYXMgYmZkX3RydWUuCi0JKE1ZX2Nsb3NlX2FuZF9jbGVhbnVwKTogRG9uJ3QgZGVmaW5lLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSk6IEFsbG9jYXRlIHRoZSBjYWNoZWQKLQlyZWxvY3Mgd2l0aCBtYWxsb2MsIG5vdCBiZmRfYWxsb2MuCi0JKiBpMzg2b3M5ay5jIChhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwKTogRGVmaW5lLgotCShhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRG9uJ3QgZGVmaW5lLgotCi0JQWRkIGEgbmV3IGVudHJ5IHBvaW50IHRvIGZyZWUgbWVtb3J5IGNhY2hlZCBieSBhIEJGRC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBfYmZkX2ZyZWVfY2FjaGVkX2luZm8gZmllbGQuCi0JKiBiZmQuYyAoYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEZWZpbmUuCi0JKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IEFkZCBfYmZkX2ZyZWVfY2FjaGVkX2luZm8uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBBbGwgYmFja2VuZHM6IEluaXRpYWxpemUgYmZkX2ZyZWVfY2FjaGVkX2luZm8gZW50cnkgcG9pbnQgdG8KLQliZmRfdHJ1ZS4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IENvcnJlY3QgdHlwZSBvZgotCWZpcnN0LCB1bnVzZWQsIGFyZ3VtZW50LgotCShocHBhX2VsZl9pc19sb2NhbF9sYWJlbCk6IERlY2xhcmUgaW5zdGVhZCBvZgotCXNvbV9iZmRfaXNfbG9jYWxfbGFiZWwuCi0KLQkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogQWRkIHJlbG9jX2VudHJ5LT5hZGRyZXNzIHRvIHZhbHVlIG9mCi0JYWJzb2x1dGUgUl9JUkVMIHJlbG9jLgotCi1UaHUgTWFyIDMxIDExOjUyOjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgSXJpeCA0IHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBlY29mZi5jIChlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IFNFQ19TSEFSRURfTElCUkFSWSBmb3IgYQotCS5saWIgc2VjdGlvbi4KLQkoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MpOiBTZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGlmCi0JU1RZUF9FQ09GRl9MSUIgYml0IGlzIHNldC4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUm91bmQgdGhlIGNvbnRlbnRzIG9mIGEKLQkubGliIHNlY3Rpb24gdXAgdG8gdGhlIG5leHQgcGFnZSBib3VuZGFyeS4KLQkoZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBJZiB3ZSBzZWUgYSAubGliIHNlY3Rpb24sIGluY3JlbWVudAotCXRoZSB2bWEgYnkgb25lIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygc2hhcmVkIGxpYnJhcmllcyB3ZSBoYXZlLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjcmFzaCBpZiB3ZSBzZWUgYQotCVNUWVBfRUNPRkZfTElCIHNlY3Rpb24sIGFuZCBkb24ndCBhZGp1c3QgdGV4dF9zdGFydCBvciBkYXRhX3N0YXJ0Ci0Jb3IgYnNzX3NpemUgZWl0aGVyLgotCi0JKiBjb2ZmY29kZS5oIChDQUxDX0FEREVORCk6IENoYW5nZSB0byBmZXRjaCBvcmlnaW5hbCBzeW1ib2wgdmFsdWUKLQlmcm9tIG9yaWdpbmFsIEJGRCwgcmF0aGVyIHRoYW4gdXNpbmcgdmFsdWUgb2YgY3VycmVudCBCRkQgc3ltYm9sLgotCU5lZWRlZCBmb3IgbmV3IGxpbmtlci4KLQkqIGNvZmYtc3BhcmMuYyAoQ0FMQ19BRERFTkQpOiBMaWtld2lzZS4KLQotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IHRoZSB0ZXh0X3N0YXJ0IGFuZAotCWRhdGFfc3RhcnQgZW50cmllcyBpbiB0aGUgb3B0aW9uYWwgaGVhZGVyIGNvcnJlY3RseSBldmVuIGlmIGEgdGV4dAotCW9yIGRhdGEgc2VjdGlvbiBzdGFydHMgYXQgbG9jYXRpb24gemVyby4KLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKTogQWRkZWQgQkZEX1JFTE9DXzI2IChmcm9tIHNlZgotCWFuZCByYWVidXJuKS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl9yZWFkX2ltcG9ydCk6IE51bGwgdGVybWluYXRlIHRoZSBzeW1ib2wKLQluYW1lLgotCSogbmxtMzItYWxwaGEuYyAobmxtX2FscGhhX3JlYWRfaW1wb3J0KTogTGlrZXdpc2UuCi0JKiBubG0zMi1zcGFyYy5jIChubG1fc3BhcmNfcmVhZF9pbXBvcnQpOiBMaWtld2lzZS4KLQotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX3N5bWJvbCk6IFJlaW5kZW50ZWQuICBDaGFuZ2VkIHRvIHJldHVybgotCWJvb2xlYW4sIGFuZCBjaGFuZ2VkIHdyaXR0ZW4gdG8gdW5zaWduZWQgaW50ICouICBDaGVjayBlcnJvcgotCXJldHVybnMgZnJvbSBjYWxsZWQgZnVuY3Rpb25zLgotCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogTGlrZXdpc2UuICBSZXdvcmtlZCBjaGVja3Mgb24gd2hldGhlciB0bwotCXdyaXRlIHN5bWJvbCBuYW1lIHRvIHN0cmluZyB0YWJsZSBmb3IgY2xhcml0eSBhbmQgdG8gYXZvaWQgY29yZQotCWR1bXBpbmcgd2hlbiBnaXZlbiBhIG5vbiBDT0ZGIHN5bWJvbC4KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl93cml0ZV9zeW1ib2xzKTogRGVjbGFyZSBhcyByZXR1cm5pbmcgYm9vbGVhbi4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JY29mZl93cml0ZV9zeW1ib2xzLgotCi1XZWQgTWFyIDMwIDE2OjI1OjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgdG8gbGV0IEJGRCByZXR1cm4gYW4gZXJyb3IgaW5kaWNhdGlvbiBmcm9tCi0JZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIsCi0JYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCwgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuICBUaGV5IG5vdwotCXJldHVybiBsb25nIGluc3RlYWQgb2YgdW5zaWduZWQgaW50LCBhbmQgdXNlIC0xIHRvIGluZGljYXRlIGFuCi0JZXJyb3IuICBBbG9uZyB0aGUgd2F5LCByZW5hbWUgZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCB0bwotCWJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLgotCSogYmZkLmMgKGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uCi0JZXJyb3JzLgotCShiZmRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBzeW1zLmMgKGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogUmVuYW1lZCBmcm9tCi0JZ2V0X3N5bXRhYl91cHBlcl9ib3VuZC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlbmFtZWQgX2dldF9zeW10YWJfdXBwZXJfYm91bmQgdG8KLQlfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIGFuZCBjaGFuZ2VkIGl0IGFuZAotCV9iZmRfY2Fub25pY2FsaXplX3N5bXRhYiBhbmQgX2dldF9yZWxvY191cHBlcl9ib3VuZCBhbmQKLQlfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyB0byBhbGwgcmV0dXJuIGxvbmcuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZ2V0X3N5bXRhYikpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uIGVycm9ycy4KLQkoTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkoTkFNRShhb3V0LGdldF9zeW10YWJfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKiBib3V0LmMgKGJfb3V0X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCShiX291dF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShjb2ZmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoZWNvZmZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShlY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShlbGZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKGVsZl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoTVkoZ2V0X3N5bXRhYikpOiBMaWtld2lzZS4KLQkoTVkoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkoTVkoY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCSogaTM4Nmx5bnguYyAoTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvCi0JYm9vbGVhbi4gIENoZWNrIGZvciBlcnJvcnMgZnJvbSBnZXRfc3ltYm9sLgotCShpZWVlX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLiAgQ2hlY2sKLQlmb3IgZXJyb3JzIGZyb20gaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzLgotCShpZWVlX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uIGVycm9ycy4KLQkoaWVlZV9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGllZWVfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGllZWVfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIG5sbWNvZGUuaCAobmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkobmxtX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkobmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShubG1fY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBvYXN5cy5jIChvYXN5c19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKG9hc3lzX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkob2FzeXNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKG9hc3lzX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogc29tLmMgKHNvbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKHNvbV9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogc3JlYy5jIChzcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoc3JlY19nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKHNyZWNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lIGFzIGJmZF8wbC4KLQkoc3JlY19jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIHRla2hleC5jICh0ZWtoZXhfZ2V0X3N5bXRhYik6IFJldHVybiBsb25nLCBhbmQgLTEgb24gZXJyb3JzLgotCSh0ZWtoZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCSh0ZWtoZXhfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lIGFzIGJmZF8wbC4KLQkodGVraGV4X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogbGliYW91dC5oIChOQU1FKGFvdXQsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkpOiBDaGFuZ2UKLQlkZWNsYXJhdGlvbiB0byByZXR1cm4gbG9uZy4KLQkoTkFNRShhb3V0LGdldF9zeW10YWIpKTogTGlrZXdpc2UuCi0JKE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShjb2ZmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoZWNvZmZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShlY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGxpYmVsZi5oIChiZmRfZWxmMzJfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBsaWJubG0uaCAobmxtTkFNRShnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCShubG1OQU1FKGdldF9zeW10YWIpKTogTGlrZXdpc2UuCi0JKG5sbU5BTUUoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCShubG1OQU1FKGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIGFyY2hpdmUuYyAoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBVc2UgZXJyb3JfcmV0dXJuIGFuZAotCW5vX21lbW9yeV9yZXR1cm4gbGFiZWxzIHJhdGhlciB0aGFuIGZyZWVpbmcgaW5mb3JtYXRpb24gaW4gdmFyaW91cwotCXBsYWNlcy4gIENoYW5nZSBzdG9yYWdlLCBzeW1jb3VudCBhbmQgc3JjX2NvdW50IHRvIGxvbmcuICBDaGVjawotCWVycm9ycyBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCSogYm91dC5jIChiX291dF9yZWxheF9zZWN0aW9uKTogQ2hhbmdlIHJlbG9jX3NpemUgdG8gbG9uZy4gIENoZWNrCi0JZm9yIGVycm9ycyBmcm9tIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6Ci0JTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmM6IExpa2V3aXNlLgotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX2ZpbmlzaCk6IExpa2V3aXNlLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBDaGVjayBmb3IgZXJyb3JzIGZyb20KLQliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIsIGFuZAotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIpOiBDaGVjayBmb3IgZXJyb3JzCi0JZnJvbSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBsaWJiZmQuYyAoYmZkXzBsKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKGJmZF8wbCk6IERlY2xhcmUuCi0JKiBhaXgzODYtY29yZS5jOiBDaGFuZ2UgZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgZ2V0X3N5bXRhYiwKLQlnZXRfcmVsb2NfdXBwZXJfYm91bmQsIGFuZCBjYW5vbmljYWxpemVfcmVsb2MgdG8gdXNlIGJmZF8wbCByYXRoZXIKLQl0aGFuIGJmZF8wdS4KLQkqIGNpc2NvLWNvcmUuYywgaHBwYWJzZC1jb3JlLmMsIGhwdXgtY29yZS5jOiBMaWtld2lzZS4KLQkqIGlyaXgtY29yZS5jLCBvc2YtY29yZS5jLCBwdHJhY2UtY29yZS5jLCB0cmFkLWNvcmUuYzogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQotCSogbmxtMzItc3BhcmMuYyAobmxtX3NwYXJjX3JlYWRfcmVsb2MpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcwotCXRlbXAgYW5kIG5hbWUuCi0KLVdlZCBNYXIgMzAgMDg6MzM6MDQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2RweDIuaDogRGVmaW5lIFBPU0lYX1VUSU1FLgotCi1XZWQgTWFyIDMwIDAwOjMxOjQ5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaTM4NmR5bml4LmMsIGNvbmZpZy9pMzg2LWR5bml4Lm10OiAgTmV3IGZpbGVzLCBoYW5kbGluZyBEeW5peAotCXZhcmlhbnQgb2YgYS5vdXQuCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy5iZmQ6ICBVc2UgdGhlbSBmb3IgRHluaXguCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBkZXBlbmRlbmNpZXMgZm9yIGkzODZkeW5peC5vLiAKLQkqIHRhcmdldHMuYzogIEFkZCBkZWZpbml0aW9uIGZvciBpMzg2ZHluaXhfdmVjLgotCSogaG9zdHMvc3ltbWV0cnkuaDogIERvIG5vdCBkZWZpbmUgVFJBRF9DT1JFX1VTRVJfT0ZGU0VUIGZvciBEeW5peC4KLQlEZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgYW5kIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwKLQlmb3IgRHluaXguIFJlbW92ZSBpbmNsdXNpb24gb2YgZHluaXgzLmgsIER5bml4IGJmZCBpcyBub3cgaGFuZGxlZCBieQotCWkzODZkeW5peC5jCi0KLU1vbiBNYXIgMjggMTI6NTM6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1zcGFyYy5vLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9mbGFncyk6IEhhbmRsZSBiZmRfYXJjaF9wb3dlcnBjIGxpa2UKLQliZmRfYXJjaF9yczYwMDAuCi0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1haXgqKTogTmV3IHRhcmdldDsgdXNlIHJzNjAwMC5tdC4KLQkqIGNvbmZpZy9yczYwMDAubXQgKFNFTEVDVF9BUkNISVRFQ1RVUkVTKTogQWRkIGJmZF9wb3dlcnBjX2FyY2guCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBTZXQgU0VDX1JFTE9DIGZsYWcKLQlmb3IgZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHNlY3Rpb24uCi0KLVN1biBNYXIgMjcgMTY6MjU6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IE5ldyBhcHByb2FjaCBhdCBkZWFsaW5nIHdpdGggaG9sZXMKLQlpbiBleGVjdXRhYmxlcyBsZWZ0IGJ5IHRoZSBIUCBsaW5rZXIuICBEb2VzIG5vdCByZWx5IG9uIHN1YnNwYWNlCi0JYWxpZ25tZW50cyBhcyBzdWJzcGFjZXMgYXJlICpOT1QqIGd1YXJhbnRlZWQgdG8gYmUgcHJvcGVybHkKLQlhbGlnbmVkIGluIGFuIGV4ZWN1dGFibGUgKGNhbiB5b3UgYmVsaWV2ZSB0aGF0ISkuCi0KLVNhdCBNYXIgMjYgMTA6MjU6NDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fZ2V0X3NlY3Rpb25fY29udGVudHMpOiBOZXcgZnVuY3Rpb24uICBEbyBub3QgdHJ5Ci0JdG8gYWN0dWFsbHkgcmVhZCBkYXRhIGZyb20gYSBzZWN0aW9uIHRoYXQgZG9lc24ndCBoYXZlIGVpdGhlcgotCVNFQ19MT0FEIG9yIFNFQ19ERUJVR0dJTkcgc2V0IChlZyAkQlNTJCkganVzdCByZXR1cm4gdHJ1ZS4KLQotICAgICAgICAqIGxpYmJmZC5jIChiZmRfcmVhZCk6IFNldCBiZmRfZXJyb3IgYXMgYXBwcm9wcmlhdGUgZm9yIGEgc2hvcnQKLQlyZWFkLiAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsIG9yIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkuCi0KLQkqIHNvbS5jOiBEbyBub3QgYmxpbmRseSBzZXQgYmZkX2Vycm9yX3N5c3RlbV9jYWxsIGFmdGVyIGEKLQlmYWlsaW5nIGJmZF9yZWFkLCBiZmRfd3JpdGUsIG9yIGJmZF9zZWVrLiAgSW4gYSBmZXcgcGxhY2VzCi0JKGxpa2Ugc29tX29iamVjdF9wKSBvdmVycmlkZSB0aGUgZXJyb3Igc3RhdHVzIHNldCBieSBiZmRfcmVhZC4KLQotCSogYWl4Mzg2LWNvcmUuYywgYW91dC1lbmNhcCxjIGFyY2hpdmUuYywgYm91dC5jOiBMaWtld2lzZS4KLQkqIGNvZmYtcnM2MDAwLmMsIGNvZmZnZW4uYyBlY29mZi5jLCBlbGYuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMsIGVsZmNvZGUuaCwgaHAzMDBocHV4LmMsIGkzODZseW54LmM6IExpa2V3aXNlLgotCSogbmxtMzItYWxwaGEuYywgbmxtMzItaTM4Ni5jLCBubG0zMi1zcGFyYy5jOiBMaWtld2lzZS4KLQotCSogc29tLmM6IENoZWNrIHJldHVybiB2YWx1ZXMgZnJvbSBzZXZlcmFsIGJmZF97c2VlayxyZWFkLHdyaXRlfQotCWNhbGxzIHRoYXQgd2UganVzdCBhc3N1bWVkIHdlcmUgbm90IGZhaWxpbmcuCi0KLUZyaSBNYXIgMjUgMTE6NDQ6MDYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N5c3Y0LmggKEhBVkVfUFJPQ0ZTKTogQWRkIGNvbW1lbnRzIGFib3V0IHB0eDQuCi0JKiBjb25maWcvc3lzdjQubWg6IEFkZCBjb21tZW50LgotCSogY29uZmlnL3N5bW1ldHJ5Lm1oOiBDaGFuZ2UgY29tbWVudC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2Ugc3lzdjQsIG5vdCBzeW1tZXRyeSwgZm9yIGlbMzRdODYtc2VxdWVudC1zeXN2NCouCi0KLUZyaSBNYXIgMjUgMTc6MTA6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyB0byBzdXBwb3J0IGxpbmtlciByZWxheGluZyBvZiBlbWJlZGRlZCBNSVBTIFBJQyBjb2RlIHRvCi0JdXNlIGEgZml2ZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBmb3IgZnVuY3Rpb24gY2FsbHMgd2hpY2ggYXJlIG91dCBvZgotCXJhbmdlIG9mIHRoZSBiYWwgaW5zdHJ1Y3Rpb24uCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSk6IERlZmluZS4KLQkoZWNvZmZfc2VjdGlvbl9kYXRhKTogRGVmaW5lLgotCShlY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERvbid0IGRlZmluZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSk6IERvbid0IHJlYWQgb3IgZnJlZQotCXRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaWYgaXQgaGFzIGFscmVhZHkgYmVlbiByZWFkLgotCShlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyKTogSGFuZGxlIF9jb29rZWRfc2l6ZSBiZWluZyBkaWZmZXJlbnQKLQlmcm9tIF9yYXdfc2l6ZS4gIERvbid0IHJlcmVhZCB0aGUgY29udGVudHMgb3IgdGhlIHJlbG9jcyBpZiB0aGV5Ci0JaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBpbi4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2hvd3RvX3RhYmxlKTogQ2hhbmdlIGJpdHNpemUgb2YgUENSRUwxNiBmcm9tCi0JMTggdG8gMTYuCi0JKFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQpOiBEZWZpbmUuCi0JKG1pcHNfcmVsb2NhdGVfcmVmaGkpOiBUYWtlIGFkanVzdCBhcmd1bWVudC4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHJlbG9jIG9mZnNldHMgc3RvcmVkIGluIHNlY3Rpb24KLQl1c2VkX2J5X2JmZCBmaWVsZC4gIENhbGwgbWlwc19yZWxheF9wY3JlbDE2IHRvIGhhbmRsZSBkZXRhaWxzIG9mCi0JZXhwYW5kaW5nIGFuIG91dCBvZiByYW5nZSBQQ1JFTDE2LiAgS2VlcCB0cmFjZSBvZiBhZGp1c3RtZW50cwotCXJlcXVpcmVkIGJ5IGV4cGFuc2lvbnMuICBTZXQgcyBhbmQgdW5zZXQgaCB3aGVuIGNvbnZlcnRpbmcgYSByZWxvYwotCWZyb20gdW5kZWZpbmVkIHRvIHNlY3Rpb24uICBDaGFuZ2UgaGFuZGxpbmcgb2YgUEMgcmVsYXRpdmUgcmVsb2NzOgotCWlmIGFnYWluc3QgYSBzZWN0aW9uLCB0aGV5IGFyZSBjb3JyZWN0IGluIHRoZSBvYmplY3QgZmlsZSwgaWYKLQlhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCB0aGV5IGFyZSBwY3JlbF9vZmZzZXQuCi0JKG1pcHNfcmVsYXhfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19yZWxheF9wY3JlbDE2KTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkqIGNvZmYtYWxwaGEuYyAoZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBIYW5kbGUgYWRqdXN0bWVudHMKLQlidWlsdCBieSBtaXBzX3JlbGF4X3NlY3Rpb24gd2hlbiB3cml0aW5nIG91dCBhZGRyZXNzZXMuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IENsZWFyIGFkanVzdCBmaWVsZC4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IFRoZSBjYWxsZXIgZXhwZWN0cwotCWZ1bmN0aW9ubmFtZV9wdHIgdG8gYmUgc2V0IHRvIGEgc3ltYm9sIG5hbWUsIHNvIHByZXBlbmQKLQlzeW1ib2xfbGVhZGluZ19jaGFyLgotCi1UaHUgTWFyIDI0IDExOjMzOjQ2IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IEFkZCByZWxheGluZyBpbmZvCi0JZm9yIDE2Yml0IHJlbGF0aXZlIGJyYW5jaGVzLgotCSogY29mZi1oODUwMC5jIChyX2hpZ2g4LCByX2xvdzE2LCByX2hpZ2gxNik6IERvbid0IGNvbXBsYWluIG9uCi0Jb3ZlcmZsb3cuCi0KLVRodSBNYXIgMjQgMDk6MjE6MTMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlKTogSWdub3JlIG5vbi1TT00gb2JqZWN0cy4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYsIHNvbV93cml0ZV9hcm1hcCk6IExpa2V3aXNlLgotCi1XZWQgTWFyIDIzIDE0OjI5OjMxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogbmV0YnNkMzg2LmMgKE5fU0VUX0ZMQUdTKTogRGVsZXRlIHRoZSBvbGQgZGVmaW5pdGlvbi4KLQotV2VkIE1hciAyMyAxNDo1ODo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlDbGVhbiB1cCB0aGUgcmVsYXhpbmcgY29kZSBmb3IgdGhlIG5ldyBsaW5rZXIuCi0JKiB0YXJnZXRzLmMgKF9iZmRfcmVsYXhfc2VjdGlvbik6IFRha2UgYm9vbGVhbiAqYWdhaW4gYXJndW1lbnQKLQlyYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuCi0JKiBiZmQuYyAoYmZkX3JlbGF4X3NlY3Rpb24pOiBDaGFuZ2UgbmFtZSBvZiBmb3VydGggYXJndW1lbnQgZnJvbQotCXN5bWJvbHMgdG8gYWdhaW4uCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uKTogVGFrZSBib29sZWFuICphZ2FpbgotCWFyZ3VtZW50IHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4gIEFsd2F5cyByZXR1cm4gdHJ1ZS4KLQkqIGJvdXQuYzogSW5jbHVkZSBnZW5saW5rLmguCi0JKGFsaWduY29kZSwgcGVyZm9ybV9zbGlwKTogRGVjbGFyZS4KLQkocGVyZm9ybV9zbGlwKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LgotCUNoYW5nZWQgYWxsIGNhbGxlcnMuICBHZXQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZELiAgQ2hhbmdlIHRoZQotCWhhc2ggdGFibGUgZW50cnkgdmFsdWUgYXMgd2VsbCBhcyB0aGUgc3ltYm9sIHZhbHVlLgotCShhYnMzMmNvZGUpOiBUYWtlIEJGRCBhcmd1bWVudCByYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuICBDaGFuZ2VkCi0JYWxsIGNhbGxlcnMuCi0JKGFsaWduY29kZSk6IExpa2V3aXNlLgotCShiX291dF9yZWxheF9zZWN0aW9uKTogVGFrZSBib29sZWFuICphZ2FpbiBhcmd1bWVudCByYXRoZXIgdGhhbgotCWFzeW1ib2wgbGlzdC4gIE9ubHkgcmV0dXJuIGZhbHNlIGlmIGFuIGVycm9yIG9jY3VycmVkLiAgU2V0ICphZ2FpbgotCXRvIGZhbHNlLiAgR2V0IHN5bWJvbHMgZnJvbSBCRkQuCi0JKiByZWxvYzE2LmM6IEluY2x1ZGUgZ2VubGluay5oLgotCShiZmRfcGVyZm9ybV9zbGlwKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LgotCUdldCB0aGUgc3ltYm9scyBmcm9tIHRoZSBCRkQuICBDaGFuZ2UgdGhlIGhhc2ggdGFibGUgZW50cnkgdmFsdWUKLQlhcyB3ZWxsIGFzIHRoZSBzeW1ib2wgdmFsdWUuCi0JKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IFRha2UgYm9vbGVhbiAqYWdhaW4gYXJndW1lbnQKLQlyYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuICBPbmx5IHJldHVybiBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLQlTZXQgKmFnYWluIHRvIGZhbHNlLiAgR2V0IHN5bWJvbHMgZnJvbSBCRkQuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBDaGFuZ2UKLQlfYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSB0byB0YWtlIEJGRCBhcmd1bWVudCByYXRoZXIgdGhhbgotCWFzeW1ib2wgbGlzdC4KLQkoYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCShkdW1teV9yZWxvYzE2X2VzdGltYXRlKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0JKiBsaWJjb2ZmLWluLmggKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IENoYW5nZQotCWRlY2xhcmF0aW9uIHRvIHRha2UgYm9vbGVhbiAqIHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4KLQkoYmZkX3BlcmZvcm1fc2xpcCk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byB0YWtlIEJGRCByYXRoZXIgdGhhbgotCWFzeW1ib2wgbGlzdC4KLQkqIGNvZmYtaDgzMDAuYyAoaDMwMF9yZWxvYzE2X2VzdGltYXRlKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyCi0JdGhhbiBhc3ltYm9sIGxpc3QuICBDaGFuZ2VkIGNhbGxzIHRvIGJmZF9wZXJmb3JtX3NsaXAuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotCSogZ2VubGluay5oIChfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyk6IERlZmluZS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50KTogRGVmaW5lLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24uCi0JKGdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgaXQuICBVc2UKLQlfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyBhbmQgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50Ci0JdG8gZ2V0IHRoZSBzeW1ib2xzIGZyb20gdGhlIEJGRC4KLQkoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IExpa2V3aXNlLgotCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFN0b3JlIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeQotCWluIGFzeW1ib2wgdWRhdGEgZmllbGQuCi0KLVR1ZSBNYXIgMjIgMTM6MDk6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IEFkZCBlbnRyeSBmb3IgbmV3IE1JUFNfUl9QQ1JFTDE2Ci0JcmVsb2MsIHVzZWQgaW4gZW1iZWRkZWQgUElDIGNvZGUuCi0JKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogQ2hhbmdlIHNhbml0eSBjaGVjayB0byBwZXJtaXQgbmV3IHJlbG9jLgotCShtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFR1cm4gQkZEX1JFTE9DXzE2X1BDUkVMX1MyIGludG8KLQlNSVBTX1JfUENSRUwxNi4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogQWNjb3VudCBmb3IgbGlua19vcmRlcgotCXJlbG9jcyB3aGVuIGFsbG9jYXRpbmcgc3BhY2UgZm9yIHJlbG9jYXRpb25zLiAgU2V0IFNFQ19SRUxPQyBmbGFnCi0JZm9yIGFueSBzZWN0aW9uIHdoaWNoIGhhcyByZWxvY3MuICBIYW5kbGUgbGlua19vcmRlciByZWxvY3MgaW4KLQlsaW5rX29yZGVyIGxvb3AuICBVc2UgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCBmb3IKLQlhZGRfc3ltYmxzIGVudHJ5IHBvaW50LgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBTZXQgcmVsb2NfY291bnQgdG8gMCBiZWZvcmUKLQljb3VudGluZyByZWxvY3MuICBTZXQgU0VDX1JFTE9DIGZsYWcgZm9yIGFueSBzZWN0aW9uIHdoaWNoIGhhcwotCXJlbG9jcy4KLQotCSogbGlua2VyLmMgKF9iZmRfZGVmYXVsdF9saW5rX29yZGVyKTogSGFuZGxlIGJmZF9kYXRhX2xpbmtfb3JkZXIuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyk6IEp1c3QgY2FsbAotCWdlbmVyaWNfbGlua19hZGRfc3ltYm9scy4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCk6IE5ldyBmdW5jdGlvbiwgbGlrZQotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIGJ1dCBhbHNvIGNvbGxlY3QgY29uc3RydWN0b3JzIGFuZAotCWRlc3RydWN0b3JzIGJ5IG5hbWUgYXMgY29sbGVjdDIgZG9lcy4KLQkoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLCBsaWtlIG9sZAotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIGJ1dCB3aXRoIGNvbGxlY3QgYXJndW1lbnQuCi0JKGdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBUYWtlIGNvbGxlY3QgYXJndW1lbnQuCi0JKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfbm9fY29sbGVjdCk6IE5ldyBmdW5jdGlvbi4KLQkoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9jb2xsZWN0KTogTmV3IGZ1bmN0aW9uLgotCShnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogVGFrZSBjb2xsZWN0IGFyZ3VtZW50LgotCShnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogVGFrZSBjb2xsZWN0IGFyZ3VtZW50LgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFJlbmFtZSBjb25zdHJ1Y3RvciBhcmd1bWVudCB0bwotCWNvbGxlY3QuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotVHVlIE1hciAyMiAxMDowNDowMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYXJjaGl2ZS5jIChiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBVc2UgYXJfcGFkY2hhcgotCWZvciBmaXJzdCBjaGFyYWN0ZXIgaW4gYW4gZXh0ZW5kZWQgbmFtZS4KLQkoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogSWYgYXJfcGFkY2hhciA9PSAnLycsIHRoZW4gdXNlCi0JIi8vIiBhcyB0aGUgbmFtZSBvZiB0aGUgc3BlY2lhbCBhcmNoaXZlIG1lbWJlciBob2xkaW5nIHRoZQotCWV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLU1vbiBNYXIgMjEgMTI6Mjg6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JU3VwcG9ydCBmb3IgbGlua19vcmRlciB0eXBlcyB3aGljaCBnZW5lcmF0ZSByZWxvY3MgaW4gb3JkZXIgdG8KLQlzdXBwb3J0IC1VciBpbiB0aGUgbGlua2VyLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudAotCWZyb20gY2FsbCB0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudC4KLQlEb24ndCBwYXNzIGJpdHNpemUgdG8gY29uc3RydWN0b3IgY2FsbCBiYWNrLiAgUGFzcyBCRkRfUkVMT0NfQ1RPUgotCWluc3RlYWQgb2YgYml0c2l6ZSB0byBhZGRfdG9fc2V0IGNhbGwgYmFjay4KLQkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBBY2NvdW50IGZvciBsaW5rX29yZGVyIHJlbG9jcyB3aGVuCi0JYWxsb2NhdGluZyBzcGFjZSBmb3IgcmVsb2NhdGlvbnMuICBIYW5kbGUgdGhlbSBpbiBsaW5rX29yZGVyIGxvb3AuCi0JKF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2RlZmF1bHRfbGlua19vcmRlcik6IElmIGEgcmVsb2NfbGlua19vcmRlciBpcyBzZWVuIGhlcmUsCi0JYWJvcnQuCi0JKF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBSZW1vdmUgYml0c2l6ZQotCWFyZ3VtZW50IGZyb20gZGVjbGFyYXRpb24uCi0JKF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogRGVjbGFyZS4KLQkoX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcyk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50IGZyb20KLQljYWxsIHRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBBY2NvdW50IGZvciBsaW5rX29yZGVyIHJlbG9jcyB3aGVuCi0JYWxsb2NhdGluZyBzcGFjZSBmb3IgcmVsb2NhdGlvbnMuICBIYW5kbGUgdGhlbSBhZnRlciBoYW5kbGluZyBhbGwKLQlpbnB1dCBCRkRzLgotCShhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IE5ldyBmdW5jdGlvbi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50IGZyb20KLQljYWxsIHRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IEFjY291bnQgZm9yIGxpbmtfb3JkZXIgcmVsb2NzIHdoZW4KLQlhbGxvY2F0aW5nIHNwYWNlIGZvciByZWxvY2F0aW9ucy4gIEhhbmRsZSB0aGVtIGluIGxpbmtfb3JkZXIgbG9vcC4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IFNldCB0aGUgc3RvcmFnZSBjbGFzcyBvZiBhIGRlZmluZWQKLQlsaW5rZXIgY3JlYXRlZCBzeW1ib2wgYmFzZWQgb24gdGhlIHNlY3Rpb24gaXQgaXMgaW4uICBDb3JyZWN0Ci0JYmZkX2xpbmtfaGFzaF93ZWFrIGNhc2UgdG8gdXNlIC5zYyByYXRoZXIgdGhhbiAuc3QuCi0JKGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZQotCUJGRF9SRUxPQ19DVE9SLgotCSogY29mZi1taXBzLmMgKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgZHluc3ltCi0JYW5kIGJ1Zi4KLQotCSogY2lzY28tY29yZS5jIChjaXNjb19jb3JlX2ZpbGVfcCk6IE9ubHkgcGFzcyBvbmUgYXJndW1lbnQgdG8KLQliZmRfem1hbGxvYy4gIEZyZWUgYSBwb2ludGVyLCBub3QgYSB1bmlvbi4KLQkoY2lzY29fYmZkX2lzX2xvY2FsX2xhYmVsKTogQ29ycmVjdCBjYXN0IGZyb20gYXNlY3Rpb24gdG8gYXN5bWJvbC4KLQotU3VuIE1hciAyMCAwOToyNDozNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkL3NvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEZpeCB0aGlua28gKG9mZiBieSBvbmUgZXJyb3IpLgotCi0JKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogT25seSB0byBkbyB0aGUgdmFsdWUKLQljb21wYXJpc29uIGZvciBmdW5jdGlvbiBzeW1ib2xzIHdpdGhpbiBleGVjdXRhYmxlcy4KLQotCSogc29tLmMgKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFJlbmFtZWQgZnJvbQotCXNvbV9zZWN0aW9uX2Zyb21fc3Vic3BhY2VfaW5kZXguICBQYXNzIGluIGEgbmF0aXZlIFNPTSBzeW1ib2wuCi0JRm9yIGV4ZWN1dGFibGVzLCBpdGVyYXRlIHRocm91Z2ggdGhlIHNlY3Rpb25zIHRvIGZpbmQgb3V0Ci0Jd2hpY2ggY29udGFpbnMgdGhlIHN5bWJvbCdzIGFkZHJlc3MgcmF0aGVyIHRoYW4gdXNpbmcgdGhlCi0Jc3ltYm9sX2luZm8gZmllbGQuICAoc3ltYm9sX2luZm8gaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgZm9yCi0JZHluYW1pY2x5IGxpbmtlZCBleGVjdXRhYmxlcy4pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBEb24ndCBwYXNzIGFiZmQgdG8KLQliZmRfem1hbGxvYy4KLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRml4IGJyYWlubyAob25lIGNhbGwgdG8gYWxpZ24KLQlzcGFjZS9zdWJzcGFjZSBkYXRhIHdhcyBkb25lIHVuY29uZGl0aW9uYWxseSByYXRoZXIgdGhhbgotCWp1c3QgZm9yIGV4ZWN1dGFibGVzLikKLQotCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogQWxpZ24gdGV4dCBpbiBhbGwgZXhlY3V0YWJsZXMgdG8KLQltYWtlIEhQVVgga2VybmVsIGhhcHB5LiAgRml4ZXMgc3RyaXAvb2JqY29weSBmb3Igc2hhcmVkCi0JZXhlY3V0YWJsZXMuCi0KLVNhdCBNYXIgMTkgMDc6MDY6NTkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEFjY291bnQgZm9yIGFsaWdubWVudCBuZWVkcyBvZgotCXN1YnNwYWNlcyB0b28gd2hlbiB3cml0aW5nIGV4ZWN1dGFibGVzLiAgTmV2ZXIgcmVxdWVzdCBhIG5lZ2F0aXZlCi0JYnNzIHNpemUuICBGaXhlcyBzb21lIHByb2JsZW1zIHdpdGggZGVtYW5kIHBhZ2VkIGV4ZWN1dGFibGVzLAotCXN0aWxsIGhhdmluZyBwcm9ibGVtcyB3aXRoIHB1cmUgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZCBleGVjdXRhYmxlcy4KLQotRnJpIE1hciAxOCAxOToxMjo0NyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IENhbGwgYmZkX3ptYWxsb2Mgbm90Ci0JYmZkX3phbGxvYyBmb3IgcmF3cHRyLCBiZWNhdXNlIGxhdGVyIG9uIHdlIG1heSBjYWxsIGZyZWUsIG5vdAotCWJmZF9yZWxlYXNlLCBvbiBpdC4KLQotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIGNpc2NvX2NvcmVfc3RydWN0IHRvIHRkYXRhIHVuaW9uLgotCSogbGliYmZkLmMgKGJmZF9yZWFkLCBiZmRfc2Vlayk6IEFkZCBjb21tZW50cyByZWdhcmRpbmcgZXJyb3JzLgotCSogY2lzY28tY29yZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBjaXNjb19jb3JlX3ZlYy4KLQkqIGNvbmZpZy9tNjhrLWFvdXQubXQgKFNFTEVDVF9WRUNTKTogQWRkIGNpc2NvX2NvcmVfdmVjLgotCSogdGFyZ2V0cy5jOiBBZGQgY2lzY29fY29yZV92ZWMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLUZyaSBNYXIgMTggMTg6MTM6NDkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCk6IE5ldyBzdHJ1Y3R1cmUKLQljb250YWluaW5nIGFsbCB0aGUgcHJpdmF0ZSBzZWN0aW9uIGluZm9ybWF0aW9uIHdoaWNoIG5lZWRzCi0JdG8gYmUgY29waWVkIGZyb20gaW5wdXQgc2VjdGlvbiB0byBvdXRwdXQgc2VjdGlvbiBkdXJpbmcKLQlvYmpjb3B5IG9yIHN0cmlwLgotCShzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCk6IFJlbW92ZSBzZXZlcmFsIGZpZWxkcyBub3cgaW4KLQlzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdC4gIE1ha2UgdGhlIHNwYWNlIGFuZCAKLQlzdWJzcGFjZSBkaWN0aW9uYXJpZXMgYmUgcG9pbnRlcnMgKHRvIHNhdmUgc3BhY2Ugd2hlbgotCW9ubHkgcmVhZGluZyBvYmplY3RzKS4KLQotCSogc29tLmMgKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IE5vdyByZXR1cm5zIGEgYm9vbGVhbjsKLQlzb21lIHJlZmVyZW5jZXMgY2hhbmdlZC4gIEFsbG9jYXRlIGEgY29weWFibGUgZGF0YSBzdHVjdHVyZSBpZgotCW5vbmUgZXhpc3RzLiAgU3RvcmUgaW5mbyBpbnRvIHRoZSBjb3B5YWJsZSBkYXRhIHN0cnVjdHVyZS4KLQkoYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzKTogTGlrZXdpc2UuCi0JKHNvbV9pc19zcGFjZSwgc29tX2lzX3N1YnNwYWNlLCBzb21faXNfY29udGFpbmVyKTogTmV3IGZ1bmN0aW9ucy4KLQlVc2UgdGhlc2UgaW5zdGVhZCBvZiBkaXJlY3RseSBhY2Nlc3NpbmcgcHJpdmF0ZSBkYXRhLgotCShzb21fcHJlcF9oZWFkZXJzKTogQWxsb2NhdGUgc3BhY2UgYW5kIHN1YnNwYWNlIGhlYWRlcnMgaGVyZS4KLQlGaWxsIGluIHNvbWUgZmllbGRzIGluIHRoZSBzcGFjZS9zdWJzcGFjZSBoZWFkZXJzIGZyb20gdGhlCi0JY29weWFibGUgZGF0YS4KLQkoc29tX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogT25seSBjb3B5IHRoZSBzdHVmZgotCXRoYXQgd2UgcmVhbGx5IG5lZWQgdG8gbWFrZSBvYmpjb3B5IGFuZCBzdHJpcCB3b3JrLiAgQWxsb2NhdGUKLQl0aGUgY29weV9kYXRhIHN0cnVjdHVyZSBmb3IgdGhlIG91dHB1dCBiZmQgYmVmb3JlIGNvcHlpbmcuCi0KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSk6IE5ldyBzdHJ1Y3R1cmUgdG8gaG9sZCBleGVjCi0JaW5mbyB0aGF0IG11c3QgYmUgcHJlc2VydmVkIHdoZW4gcnVubmluZyBvYmpjb3B5L3N0cmlwLgotCShzdHJ1Y3Qgc29tZGF0YSk6IEFkZCBuZXcgImV4ZWNfZGF0YSIgZmllbGQgYW5kIGFjY2Vzc29yCi0JbWFjcm8uICBBZGQgc29tZSBjb21tZW50cyBvbiBob3cgdGhlIHZhcmlvdXMgZmllbGRzIGFyZSB1c2VkLgotCShzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCk6IE1ha2UgaXNfc3BhY2UgYW5kIGlzX3N1YnNwYWNlIGJpdGZpZWxkcy4KLQlEZWxldGUgdW51c2VkIHN1YnNwYWNlX2luZGV4LiAgQWxsIHJlZmVyZW5jZXMgbm93IHVzZSB0aGUKLQl0YXJnZXRfaW5kZXggZmllbGQgd2l0aGluIHRoZSBzZWN0aW9uIHN0cnVjdHVyZSBpdHNlbGYuCi0KLQkqIHNvbS5jIChtYWtlX3VuaXF1ZV9zZWN0aW9uKTogRGVsZXRlIHVudXNlZCBkZWNsYXJhdGlvbi4KLQkoc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9vYmplY3Rfc2V0dXApOiBBbGxvY2F0ZSBzcGFjZSBmb3IgYW5kIHNhdmUgZXhlYyBpbmZvcm1hdGlvbgotCXRoYXQgbmVlZHMgdG8gYmUgY29waWVkIGR1cmluZyBvYmpjb3B5L3N0cmlwLgotCShzb21fbWtvYmplY3QpOiBEbyBub3QgYWxsb2NhdGUgc3BhY2UgZm9yIGEgZmlsZSBoZWFkZXIgaGVyZS4KLQlJdCBpcyBub3QgdXNlZCB3aGVuIG9ubHkgcmVhZGluZyBTT00gb2JqZWN0cy4KLQkoc29tX3ByZXBfaGVhZGVycyk6IEFsbG9jYXRlIHNwYWNlIGZvciBhbmQgYXR0YWNoIGEgZmlsZSBoZWFkZXIKLQl0byB0aGUgb3V0cHV0IGJmZC4gIEZvciBleGVjdXRhYmxlcywgdXNlIHRoZSBzYXZlZCBzeXN0ZW1faWQKLQl2YWx1ZSByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZ3Vlc3MgdGhlIHJpZ2h0IHZhbHVlLiAgRG8gbm90IGFib3J0Ci0Jd3doZW4gc2V0dGluZyBmaWxlX2hkci0+ZW50cnkqIGZvciBleGVjdXRhYmxlcy4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBGb3IgZXhlY3V0YWJsZXMsIHNldCB0aGUgZXhlY19lbnRyeSBhbmQKLQlleGVjX2ZsYWdzIGZpZWxkcy4KLQkoc29tX2NvcHlfcHJpdmF0ZV9iYWNrZW5kX3NlY3Rpb25fZGF0YSk6IEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQotCSogbGliaHBwYS5oIChQQV9QQUdFU0laRSk6IERlZmluZS4KLQotCSogc29tLmMgKFNPTV9BTElHTik6IERlZmluZS4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBJZiB3cml0aW5nIGFuIGV4ZWN1dGFibGUsIGluaXRpYWxpemUgYWxsCi0JZmllbGRzIGluIHRoZSBleGVjIGhlYWRlciB0byB6ZXJvLiAgVXBkYXRlIGZpZWxkcyBpbiB0aGUgZXhlYwotCWhlYWRlciBhcyBzaXplcyBvZiBsb2FkYWJsZSBzdWJzcGFjZXMgYXJlIGNvbXB1dGVkLiAgQ2FyZWZ1bGx5Ci0JcHJlc2VydmUgYWxpZ25tZW50cyB3aGVuIGJ1aWxkaW5nIGV4ZWN1dGFibGVzLiAgQWN0dWFsbHkgd3JpdGUgdGhlCi0JZXhlYyBhZnRlciBhbGwgdGhlIGZpZWxkcyBhcmUgZmlsbGVkIGluLgotCi0gICAgICAgICogQmV0dGVyIGxvbmctZmlsZW5hbWUgaGFuZGxpbmcuICBSZWFkcyBTT00gQUJJIGNvbXBsaWFudCBleHRlbmRlZAotCW5hbWVzLCBidXQgZG9lc24ndCBxdWl0ZSB3cml0ZSBjb21wbGlhbnQgZXh0ZW5kZWQgbmFtZXMgeWV0LgotCSogc29tLmMgKHNvbV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVsZXRlIGZ1bmN0aW9uLiAgVGhlCi0JZ2VuZXJpYyBjb2RlIHdpbGwgaGFuZGxlIHRoaW5ncyBjb3JyZWN0bHkuCi0JKHNvbV9zbHVycF9hcm1hcCk6IFNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBtZW1iZXIuCi0JKG5vcm1hbGl6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBUYWtlIHRoZSBzaXplIG9mIHRoZSBleHRlbmRlZAotCW5hbWUgdGFibGUgaW50byBhY2NvdW50IHdoZW4gY29tcHV0aW5nIHRoZSBmaWxlIG9mZnNldHMgaW4gdGhlCi0JU09NIGRpY3Rpb25hcnkuICBNYWtlIHN1cmUgdG8gYWxpZ24gdG8gYW4gZXZlbiBib3VuZGFyeS4KLQkoc29tX3dyaXRlX2FybWFwKTogSW5pdGlhbGl6ZSB0aGUgY2hlY2tzdW0gdG8gemVyby4KLQkoYXJfbWF4Y2hhcnMpOiBGaXguICBPcHBzLgotCi1GcmkgTWFyIDE4IDIwOjM1OjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHJlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SIG9uIGEgNjQtYml0Ci0JbWFjaGluZS4gIEhhbmRsZSBCRkRfUkVMT0NfU1BBUkMxMyBhbmQgQkZEX1JFTE9DX1NQQVJDX0JBU0UxMy4KLQotVGh1IE1hciAxNyAxODoyNjo0NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoQkZEX1ZFUlNJT04pOiBVc2UgQFZFUlNJT05ALgotCSogTWFrZWZpbGUuaW4gKGJmZC5oKTogUmVwbGFjZSBpdCB3aXRoIGNvbnRlbnRzIG9mIFZFUlNJT04gZmlsZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfYmZkX2lzX2xvY2FsX2xhYmVsKTogRml4ZWQgdHlwbyB3aGVyZQotCXRoaXMgd2FzIGFsc28gbmFtZWQgdHJhZF91bml4X2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEuCi0KLVRodSBNYXIgMTcgMTA6Mzc6MDcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmgsIGVsZmNvZGUuaCwgY29mZi1hbHBoYS5jLCBib3V0LmMsIGVjb2ZmLmMsIGVjb2ZmbGluay5jLAotCWVsZjMyLWhwcGEuYywgZWxmMzItbWlwcy5jLCBsaW5rZXIuYywgc29tLmMsIHN1bm9zLmM6IElmIG1hbGxvYygwKQotCXJldHVybnMgTlVMTCwgaXQgaXMgbm90IGFuIGVycm9yLiAgSXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgb2YKLQl0aGVzZSBjaGVja3MgYXJlIG5vdCBuZWNlc3NhcnkgKGJlY2F1c2UgdGhlIHNpemUgY2FuIG5ldmVyIGJlCi0JemVybyksIGJ1dCBwdXR0aW5nIGluIHRoZSBjaGVja3MgaXMgdGhlIGNvbnNlcnZhdGl2ZSB0aGluZyB0byBkbwotCWluIGxpZ2h0IG9mIHRoZSBmYWN0IHRoYXQgc29tZSBvZiB0aGVzZSBtYWxsb2MgY2FsbHMgcmVwbGFjZWQKLQl1bmNoZWNrZWQgYWxsb2NhIGNhbGxzLCBpbiB3aGljaCBhIHplcm8gYXJndW1lbnQgd291bGQgd29yayBmaW5lLgotCi1UaHUgTWFyIDE3IDExOjQ0OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb3NmLWNvcmUuYyAob3NmX2NvcmVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFJlbW92ZQotCWR1cGxpY2F0ZSBkZWZpbml0aW9uLgotCShvc2ZfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWZpbmUuCi0KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IGZhaWwKLQlpZiBtYWxsb2MgKDApIGZhaWxzLiAgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyByZXR1cm5pbmcgMCBpcyBub3QgYQotCWZhaWx1cmUgaW5kaWNhdGlvbiwgaXQgbWVyZWx5IG1lYW5zIHRoZXJlIGFyZSBubyByZWxvY3MuCi0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBEb24ndCB1c2Ugc3BhY2UKLQlhZnRlciBOQU1FLCBzaW5jZSBTdW5PUyAvYmluL2NjIGNhbid0IGhhbmRsZSBpdC4KLQotV2VkIE1hciAxNiAxNjo0MzozMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG5ldGJzZDM4Ni5jIChOX1NFVF9GTEFHUyk6IERvbid0IG51a2UgdGhlIG1hY2hpbmUgaWQgZmllbGQuCi0JRnJvbSBzdWtlc0BnbHVlLnVtZC5lZHUgKFRhc3VraSBIaXJhdGEpLgotCi1XZWQgTWFyIDE2IDA3OjU1OjU0IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoNCBwbGFjZXMpOiBVc2UgYSBzaW1wbGUgI2lmIG9uIEFSQ0hfU0laRSwgcmF0aGVyIHRoYW4KLQlhbGwgdGhhdCBjb252b2x1dGVkIHN0dWZmIHdpdGggTkFNRSwgQ0FUMywgZXRjLiAgVGhlIGNvbnZvbHV0ZWQKLQlzdHVmZiBicm9rZSBmb3IgU3VuT1M0IC9iaW4vY2MgKGR1ZSB0byBERUZVTiBlbGltaW5hdGlvbiwgSSBndWVzcykuCi0KLVdlZCBNYXIgMTYgMDA6MDI6MDUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcHJlcF9mb3JfZml4dXBzKTogRGV0ZWN0IHNlY3Rpb24gc3ltYm9scyBiYXNlZAotCW9uIGVpdGhlciB0aGUgbGFjayBvZiBwcml2YXRlIGRhdGEgb3IgdGhlIHN5bWJvbCBmbGFncy4gIERvIG5vdAotCW11bmdlIHNlY3Rpb24gc3ltYm9sIG5hbWVzIGFueW1vcmUgLS0gdGhleSBubyBsb25nZXIgY29uZnVzZSBHREIuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogTGVhdmUgc3BhY2UgZm9yIGFuIGV4ZWMgaGVhZGVyIGlmIHdyaXRpbmcKLQlhbiBleGVjdXRhYmxlLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogUmVjb2duaXplIGJvdGggZm9ybXMgb2Ygc2VjdGlvbiBzeW1ib2wKLQluYW1lcyAiTCQwXDAwMiIgYW5kICIkPEZPTz4kIi4gIENoYW5nZSB0aGUgbmFtZSBvZiAiTCQwXDAwMiIKLQlzZWN0aW9uIHN5bWJvbHMgdG8gYmUgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gdGhleSByZXByZXNlbnQuCi0JRGVidWdnaW5nICBzeW1ib2xzIGJlZ2luIHdpdGggIkwkMFwwMDEiLCBub3QganVzdCAiTCQiLgotCi1UdWUgTWFyIDE1IDIyOjU4OjI4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oLCBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0KLQkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogQWRkIG5ldyBlbnRyaWVzIHRvIHRoZSBqdW1wIHRhYmxlCi0JZm9yIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLCBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLAotCWFuZCBiZmRfaXNfbG9jYWxfbGFiZWwuCi0KLQkqIHRhcmdldHMuYzogQWRkIG5ldyBlbnRyaWVzIHRvIHRoZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4KLQkKLQkqIGJmZC5jIChiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGRlZmluaXRpb24uCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBOZXcgZGVmaW5pdGlvbi4KLQotCSogc3ltcy5jIChiZmRfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZGVmaW5pdGlvbi4KLQotCSogbGliYmZkLWluLmggKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsKTogRGVjbGFyZS4KLQotCSogbGliYmZkLmMgKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCi0JKiAqLWNvcmUuYzogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zIGZvciBuZXcgZnVuY3Rpb25zIGluCi0JdGhlIHRhcmdldCB2ZWN0b3Igd2hpY2ggYWxsIHBvaW50IHRvIGJmZF9mYWxzZS4KLQotCSogYW91dC10YXJnZXQuaCwgY29mZmNvZGUuaCwgZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0LmgsIGllZWUuYwotCWxpYmFvdXQuaCwgbGliZWNvZmYuaCwgbmxtLXRhcmdldC5oLCBvYXN5cy5jLCBzcmVjLmMsIHRla2hleC5jCi0JRGVmYXVsdCBuZXcgdmVjdG9ycyBmb3IgY29weWluZyBwcml2YXRlIGJhY2tlbmQgZGF0YSB0byBiZmRfdHJ1ZS4KLQlEZWZhdWx0IG5ldyB2ZWN0b3IgZm9yIGRldGVybWluaW5nIGlmIGEgc3ltYm9sIGlzIGEgbG9jYWwgbGFiZWwKLQl0byBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbC4KLQotCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9pc19sb2NhbF9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBGb3Igbm93IGRlZmF1bHQgdG8gYmZkX3RydWUuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBNYXIgMTUgMjM6NTU6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjZi1tNjhrbHlueC5jIChDQUxDX0FEREVORCk6IFVzZSBfYmZkX202OGtseW54X2hvd3RvX3RhYmxlLgotCi1UdWUgTWFyIDE1IDA0OjQxOjEzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogTW9zdCBmaWxlczoKLQlSZXBsYWNlIERFRlVOIGFuZCBERUZVTl9WT0lEIHdpdGggSyZSLXN0eWxlIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0JSW5kZW50IHNvbWUgb2YgdGhlbSB0byBHTlUgc3RhbmRhcmRzLgotCi0JKiBhb3V0MzIuYywgYXJjaHVyZXMuYywgY29yZS5jLCBjcHUtaDgzMDAuYywgY3B1LWk5NjAuYywKLQljcHUtbTY4ay5jLCBjcHUtbTg4ay5jLCBjcHUtbWlwcy5jLCBjcHUtdmF4LmMsIGN0b3IuYywgZGVtbzY0LmMsCi0JZWxmMzItaHBwYS5oLCBnZW4tYW91dC5jLCBob3N0LWFvdXQuYywgaW5pdC5jLCBsaWJocHBhLmgsCi0JbGliaWVlZS5oLCBsaWJvYXN5cy5oLCBuZXdzb3MzLmMsIHNvbS5oLCBzdGFiLXN5bXMuYywgc3Vub3MuYzoKLQlVcGRhdGUgY29weXJpZ2h0IHllYXJzLgotCi1Nb24gTWFyIDE0IDExOjQxOjIzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3ByZXBfZm9yX2ZpeHVwcyk6IEEgcmVsb2NhdGlvbiBpbnZvbHZpbmcgdGhlIHNlY3Rpb24KLQlzeW1ib2wgZm9yIHRoZSAqQUJTKiBzZWN0aW9uIGlzIHJlYWxseSBhIHJlbG9jYXRpb24gaW52b2x2aW5nCi0Jbm8gc3ltYm9sLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogRG8gbm90IHNldCBCU0ZfR0xPQkFMIG9yIEJTRl9FWFBPUlQgZm9yCi0JdW5kZWZpbmVkIHN5bWJvbHMuICBDb3JyZWN0bHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBkZWJ1Z2dlciBzeW1ib2xzCi0JYW5kIHNlY3Rpb24gc3ltYm9scy4KLQotCSogc29tIChzZXR1cF9zZWN0aW9ucyk6IFNldCBTRUNfREVCVUdHSU5HIGFuZCB0aGUgc2VjdGlvbiBhdHRyaWJ1dGVzCi0JZm9yIHNwYWNlcyBhbmQgc3Vic3BhY2VzLgotCi0JKiBzb20uYyAoc29tX2JmZF9jb3VudF9hcl9zeW1ib2xzKTogRml4IHR5cG8uCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogU2V0IEVYRUNfUCwgRF9QQUdFRCwgV1BfVEVYVCwgYW5kCi0JSEFTX1JFTE9DIGJhc2VkIG9uIHRoZSBvYmplY3QncyBtYWdpYyBudW1iZXIuCi0JKG1ha2VfdW5pcXVlX3NlY3Rpb24pOiBEZWxldGUgZnVuY3Rpb24uICBCRkQgYW5kIGl0cyB1c2VycyBhcmUKLQlwcmVwYXJlZCB0byBoYW5kbGUgbXVsdGlwbGUgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLgotCShzZXR1cF9zZWN0aW9ucyk6IEFsbG9jYXRlIHNwYWNlIG9uIHRoZSBCRkQncyBvYnN0YWNrIHRvIGhvbGQKLQlzZWN0aW9uIG5hbWVzLiAgVXNlIGJmZF9tYWtlX3NldGlvbl9hbnl3YXkgcmF0aGVyIHRoYW4gdGhlCi0Jb2Jzb2xldGUgbWFrZV91bmlxdWVfc2VjdGlvbi4KLQkoc29tX3ByZXBfaGVhZGVycyk6IENob29zZSB0aGUgY29ycmVjdCBTT00gbWFnaWMgbnVtYmVyIGJhc2VkCi0Jb24gdGhlIEJGRCdzIGZsYWdzLgotCShzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyk6IFJldHVybiBmYWxzZSwgbm90IE5VTEwgb24gZXJyb3IuCi0KLVNhdCBNYXIgMTIgMDk6NDY6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1wcGMuYzogUmVuYW1lZCBmcm9tIGVsZjMyLXBvd2VycGMuYy4KLQkqIG5sbTMyLXBwYy5jOiBSZW5hbWVkIGZyb20gbmxtMzItcG93ZXJwYy5jLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1GcmkgTWFyIDExIDIyOjI3OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItcG93ZXJwYy5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byB1cGRhdGUgdG8gcHJlbGltaW5hcnkgQUJJLgotCi1GcmkgTWFyIDExIDAwOjM0OjU5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc3Vub3MuYyAoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiAgQXNzdW1lIHRoYXQgZHluYW1pYyBpbmZvCi0JaXMgYWx3YXlzIGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlY3Rpb24gdG8gYWxsb3cKLQlyZWNvdmVyeSBvZiB0aGUgZHluYW1pYyBpbmZvIGZyb20gYSBzdHJpcHBlZCBleGVjdXRhYmxlLgotCSogZWNvZmYuYyAoZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiAgSGFuZGxlIFNUWVBfUERBVEEsIFNUWVBfWERBVEEKLQlhbmQgU1RZUF9DT01NRU5ULgotCi1XZWQgTWFyICA5IDE3OjE3OjUzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaDogUmVtb3ZlIGFsbG9jYSBjcnVmdC4gIEl0IHdhcyBtaXNzaW5nIHNvbWUgbmVjZXNzYXJ5Ci0JY3J1ZnQgKGxpa2UgdGhlICNwcmFnbWEgYWxsb2NhIGZvciBBSVgpLgotCUluIGFkZGl0aW9uIHRvIHRoYXQgcHJvYmxlbSwgdGhlIEMgYWxsb2NhIGNhbGxzIHhtYWxsb2MsIHdoaWNoCi0JbWVhbnMgY2hlY2tpbmcgZm9yIGJlaW5nIG91dCBvZiBtZW1vcnkgY2FuJ3Qgd29yayByaWdodC4gIFRoZQotCWZvbGxvd2luZyBjaGFuZ2VzIHJlbW92ZSBhbGwgdXNlcyBvZiBhbGxvY2EgZnJvbSBCRkQuCi0JKiBob3N0cy9zb2xhcmlzMi5oOiBSZW1vdmUgYWxsb2NhIGNydWZ0LgotCSogc29tLmM6IFJlcGxhY2UgYWxsb2NhIHdpdGggYSBmaXhlZCBzaXplIGF1dG8gYXJyYXkuCi0JKiBhb3V0eC5oLCBlbGZjb2RlLmgsIG5sbWNvZGUuaCwgYm91dC5jLCBjb2ZmLWFscGhhLmMsIGVjb2ZmLmMsCi0JZWNvZmZsaW5rLmMsIGVsZjMyLWhwcGEuYywgZWxmMzItbWlwcy5jLCBsaW5rZXIuYywgcmVsb2MuYywgc29tLmMsCi0Jc3Vub3MuYzogUmVwbGFjZSBhbGxvY2Egd2l0aCBtYWxsb2MgYW5kIGFwcHJvcHJpYXRlIGVycm9yIGNoZWNraW5nIGFuZAotCWZyZWVpbmcuCi0JKiBsaW5rZXIuYzogUmVwbGFjZSBhbGxvY2Egd2l0aCBvYnN0YWNrX2FsbG9jLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVR1ZSBNYXIgIDggMTI6MTA6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIE1JUFNfUl9MSVRFUkFMIGxpa2UKLQlNSVBTX1JfR1BSRUwuCi0KLVNhdCBNYXIgIDUgMTQ6MDg6NTQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlbGYzMi1ocHBhLmgsIGVsZmNvZGUuaDogIFJlcGxhY2UgdXNlcyBvZiBFbGYqX0hhbGYsIEVsZipfV29yZCwKLQlFbGYqX09mZiB0eXBlZGVmcyBieSB0aGVpciBleHBhbnNpb24sIHRoZSB0eXBlZGVmcyBoYXZlIGJlZW4KLQlyZW1vdmVkIGZyb20gaW5jbHVkZS9lbGYvaW50ZXJuYWwuaC4KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIEhhbmRsZSBTSFRfRFlOQU1JQyBzZWN0aW9uIGxpa2UKLQlTSFRfUFJPR0JJVFMgc2VjdGlvbi4KLQotVGh1IE1hciAgMyAyMDowMzozOSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKF9QQV9SSVNDX0lEKTogVHJlYXQgSE9TVF9IUFBBT1NGIGp1c3QgbGlrZSBIT1NUX0hQUEFCU0QuCi0KLVdlZCBNYXIgIDIgMTM6Mjg6MDYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgaVszNF04Ni1zZXF1ZW50LSouCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBBIG5vbi16ZXJvLCBub3QgemVybywKLQlyZXR1cm4gZnJvbSBiZmRfc2VlayBpbmRpY2F0ZXMgYW4gZXJyb3IuCi0JTmV3IG1hY3JvIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRSB0byByZXBsYWNlCi0JVFJBRF9DT1JFX1NUQUNLX09GRlNFVC4KLQkqIGhvc3RzL3N5bW1ldHJ5Lmg6IERlZmluZSBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUgYW5kCi0JVFJBRF9DT1JFX1VTRVJfT0ZGU0VUIGJ1dCBub3QgSE9TVF9TVEFDS19PRkZTRVQuCi0KLVdlZCBNYXIgIDIgMTE6NTc6MDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5bY2hdOiBEbyBub3QgaW5jbHVkZSBsaWJocHBhLmggaW4gc29tLmMsIGluc3RlYWQgaW5jbHVkZQotCWl0IGluIHNvbS5oLgotCi0JKiBlbGYzMi1ocHBhLltjaF06IERvIG5vdCBpbmNsdWRlIGxpYmhwcGEuaCBpbiBlbGYzMi1ocHBhLmMsIGluc3RlYWQKLQlpbmNsdWRlIGl0IGluIGVsZjMyLWhwcGEuaC4KLQotCSogc29tLmMgKGxvZzIpOiBSZXR1cm4gLTEgb24gZXJyb3IgcmF0aGVyIHRoYW4gYWJvcnRpbmcuCi0JKHNldHVwX3NlY3Rpb25zKTogQnViYmxlIHVwIGFuIGVycm9yIGZyb20gbG9nMi4KLQotCSogQ2hhbmdlcyB0byBtYWtlIEhQIEMgY29tcGlsZXIgaGFwcHkgaW4gYm90aCB0cmFkaXRpb25hbAotCWFuZCBBTlNJIG1vZGUuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBVc2UgY29ycmVjdCBlbnVtIHR5cGUgZm9yCi0JZmllbGQgcGFyYW1ldGVyLgotCShiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMpOiBVc2UgdW5zaWduZWQgaW50IHJhdGhlciB0aGFuCi0JdW5zaWduZWQgY2hhciB0byBhdm9pZCBHTlUtQyBleHRlbnNpb25zLgotCShiZmRfc29tX2F0dGFjaF9hdXhfaGRyKTogUmV0dXJuIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSBzdWNjZXNzCi0Jb3IgZmFpbHVyZSByYXRoZXIgdGhhbiBhYm9ydGluZyBvbiBmYWlsdXJlLgotCi0JKiBzb20uaCAoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzKTogRml4IHByb3RvdHlwZSB0byBtYXRjaAotCXNvbS5jIGNoYW5nZXMuCi0JKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBBZGQgcHJvdG90eXBlLgotCShocHBhX3NvbS1nZW5fcmVsb2NfdHlwZSk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1ocHBhLmM6IEFkZCBhIGNvdXBsZSBjYXN0cyB0byBtYWtlIEhQIGNvbXBpbGVyIGhhcHB5LgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBEbyBub3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKLQl1bnRpbCByZXN0IG9mIGNvZGUgaXMgcmVhZHkgdG8gaGFuZGxlIGl0LiAgQWJvcnQgZm9yIG5vdy4KLQotVHVlIE1hciAgMSAxODozMzo1OSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1UdWUgTWFyICAxIDEzOjA2OjUzIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGkzODZvczlrLmM6IHVzZSBuZXcgZnVuY3Rpb25zIGJmZF9zZXRfZXJyb3IgYW5kIGJmZF9nZXRfZXJyb3IuCi0JKiBNYWtlZmlsZS5pbjogZGVsZXRlIGFuIGV4dHJhIGJsYW5rLgotCSogY29uZmlndXJlLmluIDogQWRkIGkzOTZvczlrX3ZlYy4KLQotTW9uIEZlYiAyOCAxNTo0MTowMSAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIDogQWRkIGkzODYtb3M5ay4KLQkqIGNvbmZpZy9pMzg2LW9zOWsubXQgOiBOZXdseSBhZGQgb3M5ayB0YXJnZXQgbWFrZWZpbGUuCi0KLQkqIGkzODZvczlrLmMgOiBuZXcgZmlsZSB0byBoYW5kbGUgb3M5ayBmb3JtYXQgYmZkLgotCSogTWFrZWZpbGUuaW4gOiBIYW5kbGUgbmV3IGZpbGUgaTM4Nm9zOWsuYwotCSogdGFyZ2V0cy5jIDogQWRkIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyIGFuZCBpMzg2b3M5a192ZWMuCi0JKiBjYWNoZS5jIDogSW5pdGlhbGl6ZSBjYWNoZV9zZW50aW5lbCB0byAwLgotCi1TdW4gRmViIDI3IDE2OjMwOjU1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKG1pc21hdGNoZXMsIHJldHZhbF9taXNtYXRjaGVzKTogRml4IG1pc21hdGNoCi0JYWN0aW9uIGluIGNhc2Ugd2hlcmUgY2FsbGVyIHNwZWNpZmllZCBubyBhcmd1bWVudCByZWxvY2F0aW9uLgotCShocHBhX2VsZl9idWlsZF9saW5rZXJfc3R1Yik6IFRyeSBhZ2FpbiB0byBnZXQgdGhlIHN5bV9wdHJfcHRyCi0JcmlnaHQgaW4gdGhlIG9yaWdpbmFsIHJlbG9jYXRpb24gYW5kIHRoZSBzdHViJ3MgcmVsb2NhdGlvbi4KLQotICAgICAgICAqIGVsZjMyLWhwcGEuaCAoaHBwYV9sb29rX2Zvcl9zdHViX2luX3NlY3Rpb24pOiBGaXggdHlwby4gIERlbGV0ZQotCXVudXNlZCBzeW1ib2xzIGFyZ3VtZW50LgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfcmVsb2MpOiBBY2NlcHQgYXN5bWJvbCAqKiByYXRoZXIKLQl0aGFuIGFzeW1ib2wgKiBmb3Igb3JpZ2luYWwgdGFyZ2V0IHN5bWJvbC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JU2V0IHJlbG9jLT5zeW1fcHRyX3B0ciBhcHByb3ByaWF0ZWx5LgotCShocHBhX2VsZl9idWlsZF9saW5rZXJfc3R1Yik6IFNldCByZWxvYy0+c3ltX3B0cl9wdHIgY29ycmVjdGx5LgotCShocHBhX2VsZl9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogTm8gbG9uZ2VyIG5lZWQgc3ltYm9scwotCWFyZ3VtZW50LiAgVXNlIHRoZSBvdXRwdXQgc3ltYm9scyB3aGVuIGNhbm9uaWNhbGl6aW5nIHRoZSByZWxvY3MsCi0JY3JlYXRpbmcgdGhlbSBpZiBuZWNlc3NhcnkuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IERvIG5vdAotCXJlYnVpbGQvY2xvYmJlciB0aGUgb3V0cHV0IHN5bWJvbHMgaWYgdGhleSBhbHJlYWR5IGV4aXN0LgotCi1TdW4gRmViIDI3IDE1OjIyOjM2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jIChCRkRfU0VORCwgQkZEX1NFTkRfRk1UKTogQWRkIGRlYnVnZ2luZyB2ZXJzaW9ucyB0aGF0Ci0JY2hlY2sgYWxsIHRoZSBwb2ludGVyIGRlcmVmZXJlbmNlcy4gIEVuYWJsZWQgdmlhIERFQlVHX0JGRF9TRU5ELgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBzcmVjLmMgKGhleF92YWx1ZSk6IEFsd2F5cyBzZXQgdG8gYSBzaXplIG9mIDI1NiBieXRlcy4KLQkoc3JlY19pbml0KTogQ29zbWV0aWMgY2hhbmdlcy4KLQotU3VuIEZlYiAyNyAxMToxODo0NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jOiBTZWNvbmQgaGFsZiBvZiBtYWpvciBjbGVhbnVwLiAgTW9yZSBjb21tZW50cywKLQlQQVJBTWl6ZSBhbmQgc3RhdGljaXplIHJlc3Qgb2YgZnVuY3Rpb25zLiAgRGVsZXRlIHVudXNlZAotCWZ1bmN0aW9ucy4gIERlbGV0ZSB1bnVzZWQvdW5uZWNlc3NhcnkgYXJndW1lbnRzIHRvIHNvbWUgZnVuY3Rpb25zLgotCUdyb3VwIHN0YXRpYyB2YXJzIHRvZ2V0aGVyLiAgQWJvcnQgZm9yIGJhZCBlcnJvcnMgdW50aWwgd2UgaGF2ZQotCWVycm9yIGNvZGUgcHJvcG9nYXRpb24gd29ya2luZy4gIFdvcmsgb24gc3BhY2luZyBhbmQgaW5kZW50aW9uLgotCUFkZCBGSVhNRXMgZm9yIHVucmVzb2x2ZWQgcHJvYmxlbXMuICBVc2UgZW51bXMgcmF0aGVyIHRoYW4KLQkjZGVmaW5lcyBmb3IgbG90cyBvZiB0aGluZ3MuICBNZXJnZSB0d28gZnVuY3Rpb25zIHdoaWNoIGJ1aWxkCi0JbGlua2VyIHN0dWJzIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gKHNvIHRoZXkgY2FuIGVhc2lseSBzaGFyZSBhCi0JdG9uIG9mIGNvbW1vbiBjb2RlKS4KLQotU2F0IEZlYiAyNiAxMDowMDo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBBZGp1c3QgaGFuZGxpbmcgb2Ygb3ZlcmZsb3cgdG8KLQlhdm9pZCBkZXBlbmRpbmcgdXBvbiByaWdodCBzaGlmdHMgb2Ygc2lnbmVkIG51bWJlcnMsIGFuZCB0bwotCWNvcnJlY3QgaGFuZGxpbmcgb2Ygc3JjX21hc2sgd2l0aCBsb3dlciBiaXRzIHplcm8uCi0KLQkqIGFvdXR4LmgsIGFyY2hpdmUuYzogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gU1ZSNCBjYy4KLQkqIGVjb2ZmLmMsIGVjb2ZmbGluay5jLCBlY29mZnN3YXAuaCwgc3JlYy5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYzogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE1ha2UgaSB1bnNpZ25lZDsgcmVtb3ZlIG9sZAotCSNpZiAwIGNvZGUuCi0JKGVsZl93cml0ZV9waGRycyk6IE1ha2UgaSB1bnNpZ25lZC4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBNYWtlIGkgYW5kIG5fbGVmdCB1bnNpZ25lZC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBNYWtlIGkgdW5zaWduZWQuCi0JKHdyaXRlX3NoZHJzX2FuZF9laGRyKTogTWFrZSBjb3VudCB1bnNpZ25lZC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MpOiBNYWtlIGkgdW5zaWduZWQuCi0JKE5BTUUoYmZkLGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpKTogTWFrZSBjb3VudCB1bnNpZ25lZC4KLQkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IE1ha2UgaW5kZXggYXJndW1lbnQgdW5zaWduZWQuCi0KLUZyaSBGZWIgMjUgMjE6MzQ6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmg6IERvbid0IGluY2x1ZGUgYXNzZXJ0LmguCi0JKHN3YXBfb3V0X3N5bXMpOiBVc2UgQkZEX0FTU0VSVCByYXRoZXIgdGhhbiBhc3NlcnQuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogQWRkIG1pc3NpbmcKLQlicmVhayBpbiBzd2l0Y2guCi0KLQkqIGhvc3RzL2kzODZ2NC5oIChxc29ydCwgc3RydG9sKTogUmVtb3ZlIGluY29ycmVjdCBhbmQgdXNlbGVzcwotCWRlY2xhcmF0aW9ucy4KLQotRnJpIEZlYiAyNSAxNjozNTo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGliaHBwYS5oIChocHBhX3JlYnVpbGRfaW5zbik6IE1vdmVkIGhlcmUgZnJvbSBlbGYzMi1ocHBhLmMuCi0KLQkqIGVsZjMyLWhwcGEuaCAoZWxmX2hwcGFfdGNfc3ltYm9sKTogQWRkIG5ldyBhcmd1bWVudHMuCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IEFkZCBleHRlcm4gZGVjbC4KLQotCSogZWxmMzItaHBwYS5jOiBGaXJzdCBoYWxmIG9mIG1ham9yIGNsZWFudXAuICBBZGQvY2xlYW51cCBsb3RzIG9mCi0JY29tbWVudHMuICBQQVJBTWl6ZSBzb21lIHN0YXRpYyBmdW5jdGlvbnMuICBEZWxldGUgdW51c2VkIGZ1bmN0aW9ucy4KLQlEZWxldGUgdW51c2VkL3VubmVjZXNzYXJ5IGFyZ3VtZW50cyB0byBtYW55IGZ1bmN0aW9ucy4gIEdyb3VwCi0Jc3RhdGljIHZhcnMgdG9nZXRoZXIuICBDb2xsYXBzZSBjb21tb24gY2FzZSBzdGF0ZW1lbnRzIHRvZ2V0aGVyCi0JaW4gbWFueSBwbGFjZXMuICBVc2UgZGVmYXVsdCBjYXNlIHdoZW4gcG9zc2libGUgaW5zdGVhZCBvZiBsaXN0aW5nCi0JZWFjaCBjYXNlIHNlcGFyYXRlbHkuICBBYm9ydCBmb3IgYmFkIGVycm9ycyB1bnRpbCB3ZSBnZXQgZXJyb3IKLQljb2RlIHByb3BvZ2F0aW9uIHdvcmtpbmcuICBXb3JrIG9uIHNwYWNpbmcgYW5kIGluZGVudGlvbiBwcm9ibGVtcy4KLQlBZGQgRklYTUVzIGZvciBzb21lIHVucmVzb2x2ZWQgcHJvYmxlbXMuICBEZWxldGUgaG9wZWxlc3NseSBicm9rZW4gCi0JQ09NUExFWCByZWxvY2F0aW9uIHN1cHBvcnQgKGl0J3MgbmV2ZXIgdXNlZCBhbnl3YXkpLgotCShocHBhX2VsZl9yZWJ1aWxkX2luc24pOiBEZWxldGUuICBNb3ZlZCBpbnRvIGxpYmhwcGEuaC4KLQkoZWxmX2hwcGFfdGNfc3ltYm9sKTogQWNjZXB0IGFuZCB1c2UgbmV3IGFyZ3VtZW50cyAoc3ltZXh0IGNoYWlucykuCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IEluaXRpYWxpemUgbWF0Y2hpbmdfdmVjdG9yCi0JdG8ga2VlcCBnY2MgLVdhbGwgcXVpZXQuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IEZpeCB0eXBvLgotCi0JKiBzb20uYyAoc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBVc2UgInNpemVvZiAoYXN5bWJvbCAqKSIKLQlub3QgInNpemVvZiAoc29tX3N5bWJvbF90eXBlICopIi4KLQotCSogZWxmY29kZS5oIChlbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IFVzZSAic2l6ZW9mIChhc3ltYm9sICopIgotCW5vdCAic2l6ZW9mIChhc3ltYm9sIikuICBPcHBzLgotCi1GcmkgRmViIDI1IDEzOjE5OjA0IDE5OTQgIFRlZCBMZW1vbiAgKG1lbGxvbkBwZXBwZXIubmNkLmNvbSkKLQotCSogYmZkLmMgKGJmZF9nZXRfZ3Bfc2l6ZSk6IENhbid0IHJldHVybiBncCB2YWx1ZSBvbiBhbiBhcmNoaXZlLgotCShiZmRfc2V0X2dwX3NpemUpOiAgQ2FuJ3Qgc2V0IGdwIHZhbHVlIG9uIGFuIGFyY2hpdmUuCi0KLUZyaSBGZWIgMjUgMTI6NTc6MDAgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jIChwYXNzX292ZXIpOiBEb24ndCBza2lwIHRvbyBtYW55IGNoYXJhY3RlcnMgd2hlbgotCWVuZCBvZiBsaW5lIHNlZW4uCi0KLUZyaSBGZWIgMjUgMTE6NDE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zaXplb2ZfaGVhZGVycyk6IEFsaWduIHJlc3VsdCB0byAxNiBieXRlCi0JYm91bmRhcnkuCi0KLVRodSBGZWIgMjQgMDc6MTM6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogRGVyaXZlIHN5bWJvbF9pbmZvCi0JZmllbGQgZm9yIGFic29sdXRlIHN5bWJvbHMgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHVuZGVmaW5lZAotCWFuZCBjb21tb24gc3ltYm9scy4KLQotVGh1IEZlYiAyNCAwNDoyOToxOSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2NvcmVfZmlsZV9wKTogIENoZWNrIGZvciBjb3JlIGZpbGUgZV9tYWNoaW5lIG1hdGNoCi0JbGlrZSBpbiBlbGZfb2JqZWN0X3AuCi0KLVdlZCBGZWIgMjMgMTg6Mjg6MzcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAoYWxsb2NhKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCi0JKiBzb20uYyAoc29tX3ByZXBfaGVhZGVycyk6IFVzZSBDUFVfUEFfUklTQzFfMCBmb3IgbWFnaWMKLQludW1iZXIgcmF0aGVyIHRoYW4gSFA5MDAwUzgwMF9JRC4gIE5vdGUgc29tLmMgaXMgY2FyZWZ1bAotCXRvIG1ha2Ugc3VyZSBDUFVfUEFfUklTQzFfMCBpcyBhbHdheXMgZGVmaW5lZC4KLQotTW9uIEZlYiAyMSAxMDoxMjowMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXJnZXRzLm8sIGFyY2h1cmVzLm8pOiBVc2UgQUxMX0NGTEFHUyB0byBzdXBwbHkKLQlmbGFncyB0byBleHBsaWNpdCBjb21waWxlIGFjdGlvbnMuCi0KLU1vbiBGZWIgMjEgMDk6NTA6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmbGluay5jIChlY29mZl93cml0ZV9zeW1oZHIpOiBTZXQgc3ltaGRyLT5tYWdpYyBoZXJlLgotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTWFrZSBzdXJlIC5ic3Mgc2VjdGlvbgotCWVuZHMgb24gYSBwYWdlIGJvdW5kYXJ5IGlmIHRoZXJlIGlzIG5vIHN5bWJvbCB0YWJsZS4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgc3ltaGRyLT5tYWdpYyBoZXJlLgotCi0JKiBob3N0cy9ocDMwMC5oOiBJbmNsdWRlIDxzdGRsaWIuaD47IGRvbid0IGRlY2xhcmUgZnJlZS4KLQotCSogc29tLmMgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyk6IFVzZSBhIHBvaW50ZXIgYW5kIGFsbG9jYQotCXJhdGhlciB0aGFuIGFuIGFycmF5IG9mIHZhcmlhYmxlIHNpemUuCi0JKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogTGlrZXdpc2UuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IFJld3JpdGUgbWFzayBhbmQgc2hpZnQKLQlvcGVyYXRpb24gdG8gYXZvaWQgT1NGIDEuMyBjYyBidWcuCi0JKiBlY29mZi5jIChlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBNYWtlIHRleHRfc2l6ZSwgZGF0YV9zaXplCi0JYW5kIGJzc19zaXplIGJmZF9zaXplX3R5cGUgaW5zdGVhZCBvZiB1bnNpZ25lZCBsb25nLiAgTWFrZQotCXRleHRfc3RhcnQgYW5kIGRhdGFfc3RhcnQgYmZkX3ZtYSBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuCi0JKiBlY29mZmxpbmsuYyAoZWNvZmZfYWRkX3N0cmluZyk6IFJlbW92ZSBpbmNvcnJlY3QgY2FzdCBvZiByZXR1cm4KLQl2YWx1ZS4KLQotU3VuIEZlYiAyMCAxNjowNjo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBDb25zaWRlcgotCXN5bWJvbHMgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBhcmNoaXZlIG1hcC4KLQotU2F0IEZlYiAxOSAwMzoxNzozMiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvZmYtYWxwaGEuYyAocmVsb2NfbmlsKTogIEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uLCBhZGQgbWlzc2luZwotCWVycm9yX21lc3NhZ2UgYXJndW1lbnQuCi0JKiBjb2ZmLXNwYXJjLmMgKGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MpOiAgQWRkIGZvcndhcmQgZGVjbGFyYXRpb24sCi0JYWRkIG1pc3NpbmcgZXJyb3JfbWVzc2FnZSBhcmd1bWVudC4KLQkqIG1pcHNic2QuYyAobWlwc19maXhfaGkxNl9zKTogIEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uLCBhZGQgbWlzc2luZwotCWVycm9yX21lc3NhZ2UgYXJndW1lbnQuCi0KLUZyaSBGZWIgMTggMTE6NDE6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JU3VwcG9ydCBmb3IgUG93ZXJQQyBOZXRXYXJlLgotCSogbmxtMzItcG93ZXJwYy5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1uZXR3YXJlKik6IE5ldyB0YXJnZXQ7IHVzZSBwcGMtbmxtLgotCSogY29uZmlnL3BwYy1ubG0ubXQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChubG0zMl9wb3dlcnBjX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yOyB1c2UKLQlubG0zMi1wb3dlcnBjLm8sIG5sbTMyLm8sIG5sbS5vLgotCSogdGFyZ2V0cy5jIChubG0zMl9wb3dlcnBjX3ZlYyk6IERlY2xhcmUuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgbmxtMzItcG93ZXJwYy5vLgotCShDRklMRVMpOiBBZGQgbmxtMzItcG93ZXJwYy5jLgotCi0JSW5pdGlhbCBzdXBwb3J0IGZvciBQb3dlclBDIEVMRi4gIERvbmUgd2l0aG91dCBhbiBBQkksIGFuZAotCXByb2JhYmx5IHRvIGJlIGNoYW5nZWQgd2hlbiBJIGdldCBhbiBBQkkuCi0JKiBjb25maWcuYmZkIChwb3dlcnBjLSotc3lzdjQqKTogTmV3IHRhcmdldDsgdXNlIHBwYy1lbGYuCi0JKiBjb25maWcvcHBjLWVsZi5tdDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9wb3dlcnBjX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yOyB1c2UKLQllbGYzMi1wb3dlcnBjLm8sIGVsZjMyLm8sIGVsZi5vLgotCSogZWxmMzItcG93ZXJwYy5jOiBOZXcgZmlsZS4KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogQWRkIGJmZF9hcmNoX3Bvd2VycGMgY2FzZS4KLQkoZWxmX3NldF9hcmNoX21hY2gpOiBMaWtld2lzZS4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3Bvd2VycGNfdmVjKTogRGVjbGFyZS4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGYzMi1wb3dlcnBjLm8uCi0JKENGSUxFUyk6IEFkZCBlbGYzMi1wb3dlcnBjLmMuCi0JUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLVRodSBGZWIgMTcgMTU6Mjk6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfbGluZW51bWJlcnMpOiBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEhhbmRsZSB6ZXJvIHN5bWJvbHMKLQlyZWFzb25hYmx5LiAgQWxsb2NhdGUgeF9zeW1wIHVzaW5nIGFsbG9jYS4KLQotCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IEVMRiBwcm9ncmFtIGhlYWRlciBlbnRyaWVzCi0JbXVzdCBiZSBzb3J0ZWQgYnkgbG9hZCBhZGRyZXNzLiAgVGhpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBlbnRyaWVzCi0JaW4gcmV2ZXJzZSBvcmRlci4KLQotCSogc2VjdGlvbi5jIChTRUNfSU5fTUVNT1JZKTogRGVmaW5lLgotCShhc2VjdGlvbik6IFJlbmFtZSB1bnVzZWQgZmllbGQgb3RoZXJ1c2VyZGF0YSB0byBjb250ZW50cywgYW5kCi0JbWFrZSBpdCBjaGFyICouCi0JKGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KTogSW5pdGlhbGl6ZSBjb250ZW50cyBmaWVsZCB0byBOVUxMLgotCShiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBJZiBTRUNfSU5fTUVNT1JZIGlzIHNldCwgZ2V0IHNlY3Rpb24KLQljb250ZW50cyBmcm9tIGNvbnRlbnRzIGZpZWxkIHJhdGhlciB0aGFuIGZyb20gZmlsZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotVGh1IEZlYiAxNyAwODozMDo1MyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfZ2V0X2Vycm9yLCBiZmRfc2V0X2Vycm9yKTogTmV3IGZ1bmN0aW9ucy4KLQkoYmZkX2Vycm9yKTogTWFrZSBzdGF0aWMuCi0JKGJmZF9lcnJvcl90eXBlKTogUmVuYW1lZCBmcm9tIGJmZF9lYy4gIFByZXBlbmQgImJmZF9lcnJvcl8iIHRvCi0JYWxsIHZhbHVlcy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBhaXgzODYtY29yZS5jLCBhb3V0LWFkb2JlLmMsIGFvdXQtZW5jYXAuYywgYW91dC10YXJnZXQuaCwgCi0JYW91dGYxLmgsIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgCi0JYmZkLmMsIGJvdXQuYywgY2FjaGUuYywgY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYywgCi0JY29mZi1yczYwMDAuYywgY29mZmNvZGUuaCwgY29mZmdlbi5jLCBjb3JlLmMsIGN0b3IuYywgCi0JZWNvZmYuYywgZWNvZmZsaW5rLmMsIGVsZi5jLCBlbGYzMi1ocHBhLmMsIGVsZjMyLW1pcHMuYywgCi0JZWxmY29kZS5oLCBmb3JtYXQuYywgaGFzaC5jLCBocDMwMGhwdXguYywgaHBwYWJzZC1jb3JlLmMsIAotCWkzODZseW54LmMsIGllZWUuYywgbGliYmZkLmMsIGxpYmVsZi5oLCBsaW5rZXIuYywgCi0JbHlueC1jb3JlLmMsIG5sbS5jLCBubG0zMi1hbHBoYS5jLCBubG0zMi1pMzg2LmMsIAotCW5sbTMyLXNwYXJjLmMsIG5sbWNvZGUuaCwgb2FzeXMuYywgb3BuY2xzLmMsIG9zZi1jb3JlLmMsIAotCXB0cmFjZS1jb3JlLmMsIHJlbG9jMTYuYywgcnM2MDAwLWNvcmUuYywgc2VjdGlvbi5jLCBzb20uYywgCi0Jc3JlYy5jLCBzdW5vcy5jLCBzeW1zLmMsIHRhcmdldHMuYywgdGVraGV4LmMsIAotCXRyYWQtY29yZS5jOiBDaGFuZ2UgY2FsbGVycy4KLQotVHVlIEZlYiAxNSAyMjoyNzoyNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmM6IFJlbW92ZSBGSVhNRXMgZm9yIHRoaW5ncyB3aGljaCBoYXZlIGJlZW4gZGVhbHQgd2l0aC4KLQotVHVlIEZlYiAxNSAxOTozOToyNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IFNpbmNlIHRoaXMgZnVuY3Rpb24gcmVhZHMKLQl1bnJlbG9jYXRlZCBjb250ZW50cywgdGhlIHNlY3Rpb24ncyByYXcgc2l6ZSBpcyBhbHdheXMgdGhlIG9uZSB0bwotCXVzZSBmb3IgYm91bmRzIGNoZWNraW5nLgotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogSW4gYXNzZXJ0aW9uLCBjb21wYXJlCi0JbGlua19vcmRlciBzaXplIGZpZWxkIGFnYWluc3QgY29va2VkIHNpemUsIG5vdCByYXcgc2l6ZSwgb2YgaW5wdXQKLQlzZWN0aW9uLgotCi0JKiBib3V0LmMgKGJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IEZvciBCU1Mgc2VjdGlvbiwganVzdAotCXJldHVybiAwLgotCShhbGlnbmNvZGUpOiBXaGVuIHNocmlua2luZywgdGhlIGFkZGVuZCBzaG91bGQgYmUgc2V0IHRvIHRoZQotCWN1cnJlbnQgb2Zmc2V0IGluIHRoZSBzZWN0aW9uIHBsdXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBwYWRkaW5nCi0JdGhhdCB3aWxsIGFjdHVhbGx5IGJlIHJldGFpbmVkLgotCShiX291dF9yZWxheF9zZWN0aW9uKTogSWYgYSBzZWN0aW9uIGNvbnRhaW5zIG5vIHJlbG9jYXRpb25zLCBkb24ndAotCWJvdGhlciBwcm9jZXNzaW5nIHRoZW0uCi0JKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFNldCByZWxvY19kb25lLiAgQXNzZXJ0Ci0JdGhhdCBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgcmV0dXJucyB0cnVlLiAgQ2hlY2sgdGhhdCByZWxvY3MgYXJlCi0JcHJvcGVybHkgb3JkZXJlZC4KLQkoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLCBjYXNlIEFMSUdORE9ORSk6IEFzc2VydAotCXRoYXQgcmVsb2MtPmFkZGVuZCBmYWxscyBiZXR3ZWVuIHRoZSBjdXJyZW50IHNvdXJjZSBvZmZzZXQgYW5kIHRoZQotCXJhdyBzaXplIG9mIHRoZSBpbnB1dCBzZWN0aW9uLgotCi0JKiBjb25maWcuYmZkOiBTdXBwb3J0IGk5NjAgdnh3b3JrcyB2ZXJzaW9ucyA+IDUuMCB3aXRoIGNvZmYsIG5vdAotCWJvdXQuICBEZWZhdWx0IHdpdGggbm8gdmVyc2lvbiBudW1iZXIgaXMgc3RpbGwgYm91dC4gIFN1cHBvcnQKLQlleHBsaWNpdCBpOTYwLWNvZmYgdGFyZ2V0IHRvby4KLQotCSogYm91dC5jOiBDaGFuZ2VkIHNvbWUgaW5kZW50YXRpb24sIGRlbGV0ZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwKLQlmaXhlZCBzb21lIGNvbW1lbnRzLCByZW1vdmVkIHNvbWUgIiNpZiAxIiBsaW5lcy4KLQkob3V0cHV0X2FkZHIpOiBOZXcgbWFjcm8uCi0JKGNhbGxqeF9jYWxsYmFjaywgY2FsbGpfY2FsbGJhY2ssIGdldF92YWx1ZSwgYWJzMzJjb2RlLCBhbGlnbmNvZGUsCi0JYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogVXNlIGl0IGZvciByZWFkYWJpbGl0eS4KLQotVHVlIEZlYiAxNSAwOTowMDoxNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUpOiBJdGVyYXRlIHRocm91Z2ggdGhlIFNPTQotCXN5bWJvbHMsIG5vdCB0aGUgQkZEIHN5bWJvbHMuCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogTGlrZXdpc2UuCi0KLU1vbiBGZWIgMTQgMjI6NTU6MjAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogRG8gbm90IGRpZSBpZiBhIEJGRCBkb2Vzbid0Ci0JaGF2ZSBhbnkgc3ltYm9scy4KLQotCSogRmluaXNoIGJhc2ljIHJlYWQtd3JpdGUgc3VwcG9ydCBmb3IgU09NIGFyY2hpdmUgbGlicmFyaWVzLiAgQnVncwotCXN1cmVseSByZW1haW4gYXMgdGhpcyBoYXNuJ3QgYmVlbiB0ZXN0ZWQgYWxsIHRoYXQgbXVjaC4KLQkqIHNvbS5jIChTT01fTFNUX0hBU0hfU0laRSwgU09NX0xTVF9NT0RVTEVfTElNSVQpOiBEZWZpbmUuCi0JKHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyk6IE5ldyBzdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvIG5lY2Vzc2FyeQotCXRvIGJ1aWxkIGJvdGggbm9ybWFsIGFuZCBsaWJyYXJ5IHN5bWJvbCB0YWJsZXMuCi0JKHNvbV9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IE5ldyBmdW5jdGlvbiB0byBkZXJpdmUgaW5mbyBuZWNlc3NhcnkKLQl0byBidWlsZCBib3RoIG5vcm1hbCBhbmQgbGlicmFyeSBzeW1ib2wgdGFibGVzLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IFVzZSBuZXcgZnVuY3Rpb24gdG8gZGVyaXZlIG1pc2MKLQlzeW1ib2wgaW5mb3JtYXRpb24uCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBVcGRhdGUgYmFja2VuZCBwcml2YXRlIGRhdGEgZm9yIHN5bWJvbHMKLQlhcHByb3ByaWF0ZWx5LgotCShzb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2FyX3N5bWJvbF9oYXNoKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3dyaXRlX2FybWFwKTogRmxlc2ggb3V0LgotCShzb21fdmVjKTogRml4IGFyIHBhZGRpbmcgY2hhcmFjdGVyLgotCi0JKiBzb20uYzogQ29uc2lzdGVudGx5IHVzZSBtZW1zZXQgcmF0aGVyIHRoYW4gYnplcm8uCi0KLU1vbiBGZWIgMTQgMTc6MDI6MjggMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1yczYwMDAuYzogIEFkZCBMeW54IGNvcmUgZmlsZSBzdXBwb3J0LCB1c2UgSE9TVF9BSVgsIHdoZXJlCi0JYXBwcm9wcmlhdGUuCi0JKiByczYwMDAtY29yZS5jOiAgVXNlIEhPU1RfQUlYIGluc3RlYWQgb2YgQ09SRUZJTEVTX1BMRUFTRS4KLQkqIGNvbmZpZy9yczYwMDAubWg6ICBSZW1vdmUgZGVmcyBvZiBBUkNISVZFU19QTEVBU0UgYW5kCi0JQ09SRUZJTEVTX1BMRUFTRS4KLQkqIGNvbmZpZy9yczYwMDBseW54Lm1oOiAgVHVybiBvbiBMeW54IGNvcmUgZmlsZSBzdXBwb3J0LgotCSogaG9zdHMvcnM2MDAwLmg6ICAjZGVmaW5lIEhPU1RfQUlYLgotCSogaG9zdHMvcnM2MDAwbHlueC5oOiAgQ3JlYXRlIHRoaXMgdG8gZW5hYmxlIEx5bnggaG9zdCBzdXBwb3J0LgotCi1TdW4gRmViIDEzIDE0OjMwOjAwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoc29tX3N5bWJvbF9kYXRhKTogU2FmZWx5IGFjY2VzcyBiYWNrZW5kIHByaXZhdGUgZGF0YQotCWZvciBCRkQgc3ltYm9scy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0KLQkqIFJlYWQtb25seSBTT00gYXJjaGl2ZSBzdXBwb3J0LgotCSogc29tLmMgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyk6IE5ldyBoZWxwZXIgZnVuY3Rpb24uCi0JKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzKTogTmV3IGhlbHBlciBmdW5jdGlvbi4KLQkoc29tX3NsdXJwX2FybWFwKTogTmV3IGZ1bmN0aW9uIHRvIHJlYWQgYSBTT00gTFNULgotCi0JKiBzb20uaDogSW5jbHVkZSA8bHN0Lmg+IGFuZCA8YXIuaD4uCi0KLVNhdCBGZWIgMTIgMjI6MzQ6MTQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogRml4IHR5cG8uCi0JKHdyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZXMgZnJvbSBwcmVwX2hlYWRlcnMgYW5kCi0JZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4KLQkoc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotRnJpIEZlYiAxMSAxNjo1Njo1MCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAobm9ybWFsaXplKSBbVk1TXTogQ2FsbCBtYWxsb2MsIG5vdCBiZmRfeG1hbGxvYy4KLQkoYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogQ2hlY2sgcmVzdWx0IG9mIG5vcm1hbGl6ZS4KLQotVHVlIEZlYiAgOCAwODo1NzozMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQlNYWtlIGFsbCBjYWxsZXJzIG9mIG1hbGxvYyBvciByZWFsbG9jIChpbmNsdWRpbmcgdmlhIG9ic3RhY2tzKQotCWNoZWNrIHRoZSByZXN1bHQgZm9yIE5VTEwuICBNb3N0IHNldCBiZmRfZXJyb3IgdG8gbm9fbWVtb3J5IGFuZAotCXJldHVybiBpbiB0aGF0IGNhc2U7IGEgZmV3IGFyZSBoYXJkZXIgdG8gZml4LCBhbmQgYXJlIG1hcmtlZAotCXdpdGggIkZJWE1FIDxyZXR1cm4gdHlwZT4iLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViCi0JaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6ICBDaGVjayBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgcmV0dXJuLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzCi0JX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IERpdHRvCi0JKiBzZWN0aW9uLmMgKGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KTogRGl0dG8uCi0KLQkqIHRla2hleC5jIChmaW5kX2NodW5rIHRla2hleF9ta29iamVjdCk6IENoZWNrIGJmZF9hbGxvYy4KLQkoZmlyc3RfcGhhc2UpOiBEaXR0by4gIEZJWE1FIHZvaWQKLQkodGVraGV4X21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogc3Vub3MuYyAoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiBDaGVjayBiZmRfemFsbG9jLgotCShNWShyZWFkX2R5bmFtaWNfc3ltYm9scykgTVkocmVhZF9keW5hbWljX3JlbG9jcykpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIHN0cmluZ2hhc2guYyAoX2JmZF9zdHJpbmd0YWJfaGFzaF9uZXdmdW5jKTogQ2hlY2sgYmZkX2hhc2hfYWxsb2NhdGUuCi0KLQkqIHNyZWMuYzogSW5kZW50LgotCShmaWxsdXBfc3ltYm9scyk6IENoZWNrIGJmZF9hbGxvYy4gIEZJWE1FIHZvaWQKLQkoc3JlY19ta29iamVjdCBzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0Jc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IENoZWNrIGJmZF9hbGxvYy4gCi0JKHNyZWNfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBDaGVjayBiZmRfYWxsb2NfYnlfc2l6ZV90LgotCShtYWtlX3VuaXF1ZV9zZWN0aW9uKTogQ2hlY2sgYmZkX2FsbG9jLgotCShzb21fbmV3X3NlY3Rpb25faG9vayk6IENoZWNrIGJmZF96YWxsb2MuCi0JKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBEaXR0by4gIEZJWE1FIHZvaWQKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBvc2YtY29yZS5jIChvc2ZfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0JKG9zZl9jb3JlX2NvcmVfZmlsZV9wKTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBvYXN5cy5jIChvYXN5c19zbHVycF9zeW1ib2xfdGFibGUgb2FzeXNfYXJjaGl2ZV9wCi0Jb2FzeXNfbWtvYmplY3Qgb2FzeXNfb2JqZWN0X3Agb2FzeXNfbmV3X3NlY3Rpb25faG9vawotCW9hc3lzX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hlY2sgYmZkX2FsbG9jLgotCShvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEpOiBDaGVjayBiZmRfemFsbG9jIGFuZCBiZmRfYWxsb2MuCi0JKG9hc3lzX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogbmxtY29kZS5oIChubG1fbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCShubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgYmZkX3phbGxvYyBhbmQgYmZkX2FsbG9jLgotCi0JKiBubG0zMi1zcGFyYy5jIChubG1fc3BhcmNfcmVhZF9pbXBvcnQpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfcmVhZF9pbXBvcnQpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIG5sbTMyLWFscGhhLmMgKG5sbV9hbHBoYV9yZWFkX2ltcG9ydCk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogbGlua2VyLmMgKF9iZmRfbGlua19oYXNoX25ld2Z1bmMKLQkoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYwotCShhcmNoaXZlX2hhc2hfbmV3ZnVuYwotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlLgotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scwotCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBDaGVjayBiZmRfYWxsb2MuCi0JKGJmZF9uZXdfbGlua19vcmRlcik6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuCi0KLQkqIGlyaXgtY29yZS5jIChpcml4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBpZWVlLmM6IEluZGVudC4KLQkocmVhZF9pZCBnZXRfc3ltYm9sIGdldF9zZWN0aW9uX2VudHJ5IGllZWVfYXJjaGl2ZV9wIGllZWVfb2JqZWN0X3AKLQlpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSBpZWVlX25ld19zZWN0aW9uX2hvb2spOiBDaGVjayBiZmRfYWxsb2MuCi0JKGRvX29uZSk6IENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogQ2hlY2sgaXQuCi0JKGluaXRfZm9yX291dHB1dCk6IENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGllZWVfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGVjayBpdC4KLQkoZG9fd2l0aF9yZWxvY3MpOiAgQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoaWVlZV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlKTogRGl0dG8uICBGSVhNRSB2b2lkLgotCShpZWVlX21rb2JqZWN0KTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoaWVlZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96bWFsbG9jLgotCi0JKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sKLQliZmRfemFsbG9jLgotCi0JKiBocHBhYnNkLWNvcmUuYyAoaHBwYWJzZF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sKLQliZmRfemFsbG9jLgotCShocHBhYnNkX2NvcmVfY29yZV9maWxlX3ApOiBDaGVjayBiZmRfemFsbG9jLgotCi0JKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogZWxmY29kZS5oIChlbGZfbmV3X3NlY3Rpb25faG9vayk6IENoZWNrIGJmZF9hbGxvYy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogRGl0dG8uCi0JKHdyaXRlX3JlbG9jcyk6IERpdHRvLiAgRklYTUUgdm9pZAotCShlbGZfbWFwX3N5bWJvbHMgYXNzaWduX3NlY3Rpb25fbnVtYmVycyBtYXBfcHJvZ3JhbV9zZWdtZW50cyk6Ci0JRGl0dG8uICBSZXR1cm4gYSBib29sZWFuLiAKLQkoc3dhcF9vdXRfc3ltcyk6IERpdHRvLiAgQ2hlY2sgZWxmX21hcF9zeW1ib2xzLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IENoZWNrIGJmZF9hbGxvYy4KLQkoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogRGl0dG8uCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDaGVjayBhc3NpZ25fc2VjdGlvbl9udW1iZXJzLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFJldHVybiBhIGJvb2xlYW4uCi0JQ2hlY2sgbWFwX3Byb2dyYW1fc2VnbWVudHMuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDaGVjayBpdC4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfYnJhbmNoX3JlbG9jKTogQ2hlY2sgYmZkX3ptYWxsb2MgYW5kCi0JcmVhbGxvYy4gCi0JKGhwcGFfZWxmX3N0dWJfcmVsb2MpOiBEaXR0by4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBDaGVjayBiZmRfemFsbG9jLgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogRGl0dG8uCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyk6IERpdHRvLgotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBDaGVjayBiZmRfYWxsb2MuICBSZXR1cm4gYSBib29sZWFuLgotCShlY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGVjayBpdC4KLQkoZWNvZmZfc2x1cnBfYXJtYXApOiBDaGVjayBiZmRfYWxsb2MuCi0JKGVjb2ZmX3dyaXRlX2FybWFwKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBDaGVjayBiZmRfaGFzaF9hbGxvY2F0ZSBhbmQKLQlfYmZkX2xpbmtfaGFzaF9uZXdmdW5jLiAKLQkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBjdG9yLmMgKGJmZF9jb25zdHJ1Y3Rvcl9lbnRyeSk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBDaGVjayBiZmRfYWxsb2MuCi0JKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuICBSZXR1cm4gYSBib29sZWFuLgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IENoZWNrIGJmZF9hbGxvYy4gIEZJWE1FIGludAotCShjb2ZmX3dyaXRlX2xpbmVudW1iZXJzKTogQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoY29mZl9zZWN0aW9uX3N5bWJvbCk6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogQ2hlY2sgYmZkX2FsbG9jLgotCShjb2ZmX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0JKiBsaWJjb2ZmLWluLmg6IENoYW5nZSBkZWNscyBvZiBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMsCi0JY29mZl93cml0ZV9saW5lbnVtYmVycy4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sKLQljb2ZmX3JlbnVtYmVyX3N5bWJvbHMsIGNvZmZfd3JpdGVfbGluZW51bWJlcnMuCi0KLQkqIGNvZmZjb2RlLmg6IEluZGVudC4KLQkoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogQ2hlY2sgYmZkX2FsbG9jX2J5X3NpemVfdC4gIFJldHVybiBhCi0JYm9vbGVhbi4gCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgaXQuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIGJmZF9hbGxvYy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYnNkX2FybWFwX2YyKTogQ2hlY2sgYmZkX2FsbG9jIHZhbHVlLgotCShkb19zbHVycF9ic2RfYXJtYXApOiBEaXR0by4KLQkoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBDaGVjayBiZmRfcmVhbGxvYyB2YWx1ZS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IENoZWNrIGJmZF9hbGxvYwotCXJldHVybiB2YWx1ZS4gIFJldHVybiBib29sZWFuIHZhbHVlLgotCShOQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpKTogQ2hlY2sgYmZkX3phbGxvYyByZXR1cm4gdmFsdWUuCi0JKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogQ2hlY2sgYmZfYWxsb2MgYW5kIGJmZF96YWxsb2MKLQlyZXR1cm4gdmFsdWUuCi0JKGFkZF90b19zdHJpbmd0YWIpOiBEaXR0by4gIEZJWE1FIHZvaWQKLQkoYW91dF9saW5rX2hhc2hfbmV3ZnVuYyk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlIHJldHVybiB2YWx1ZS4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogQ2hlY2sgYmZkX2FsbG9jIHZhbHVlLgotCSh0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKTogQ2hlY2sgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncy4KLQkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9zeW1ib2xfdGFibGUpKTogRGl0dG8uCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaGFzaF9uZXdmdW5jKTogQ2hlY2sgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYy4KLQotCSogb3BuY2xzLmMgKGJmZF96YWxsb2MgYmZkX3JlYWxsb2MpOiBDaGVjayByZXN1bHQgb2YgYmZkX2FsbG9jLgotCi0JKiBvcG5jbHMuYyAob2JzdGFja19jaHVua19hbGxvYyk6IERlZmluZSBhcyBtYWxsb2MsIG5vdAotCWJmZF94bWFsbG9jX2J5X3NpemVfdC4gCi0JKF9iZmRfbmV3X2JmZCk6IENoZWNrIG9ic3RhY2tfYmVnaW4gZm9yIDAgcmV0dXJuLgotCi0JKiBpZWVlLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBEZWZpbmUgYXMgbWFsbG9jLCBub3QKLQliZmRfeG1hbGxvY19ieV9zaXplX3QuIAotCShpZWVlX2FyY2hpdmVfcCk6IENoZWNrIG9ic3RhY2tfYmVnaW4gZm9yIDAgcmV0dXJuIGFuZAotCW9ic3RhY2tfZmluaXNoIGZvciBOVUxMIHJldHVybi4KLQotCSogaGFzaC5jIChvYnN0YWNrX2NodW5rX2FsbG9jKTogRGVmaW5lIGFzIG1hbGxvYywgbm90Ci0JYmZkX3htYWxsb2NfYnlfc2l6ZV90LiAKLQkoYmZkX2hhc2hfdGFibGVfaW5pdF9uKTogQ2hlY2sgb2JzdGFja19iZWdpbiBmb3IgMCByZXR1cm4gYW5kCi0Jb2JzdGFja19maW5pc2ggZm9yIE5VTEwgcmV0dXJuLgotCShiZmRfaGFzaF9sb29rdXApOiBDaGVjayBvYnN0YWNrX2FsbG9jIGZvciBOVUxMIHJldHVybi4KLQotCSogZWNvZmZsaW5rLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBEZWZpbmUgYXMgbWFsbG9jLCBub3QKLQliZmRfeG1hbGxvY19ieV9zaXplX3QuIAotCWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCi0JYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIpOiBDaGVjayBvYnN0YWNrX2FsbG9jLgotCShhZGRfZmlsZV9zaHVmZmxlIGFkZF9tZW1vcnlfc2h1ZmZsZSk6IENoZWNrIG9ic3RhY2tfYWxsb2MgZm9yCi0JTlVMTCByZXR1cm4uICBSZXR1cm4gYm9vbGVhbiwgbm90IHZvaWQuCi0JKGJmZF9lY29mZl9kZWJ1Z19pbml0KTogQ2hlY2sgb2JzdGFja19iZWdpbiBmb3IgMCByZXR1cm4uCi0JKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogQ2hlY2sgYWRkX2ZpbGVfc2h1ZmZsZQotCWFuZCBhZGRfbWVtb3J5X3NodWZmbGUgcmV0dXJuLiAKLQkoc3RyaW5nX2hhc2hfbmV3ZnVuYyk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlIGFuZCBiZmRfaGFzaF9uZXdmdW5jLgotCShiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IENoZWNrIGJmZF9hbGxvYy4KLQkoZWNvZmZfYWRkX3N0cmluZyk6IENoZWNrIGFkZF9tZW1vcnlfc2h1ZmZsZSByZXR1cm4uCi0KLQkqIGxpYmJmZC1pbi5oICh4bWFsbG9jLCBiZmRfeG1hbGxvYywgYmZkX3htYWxsb2NfYnlfc2l6ZV90KToKLQlSZW1vdmUgZGVjbHMuIAotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLUZyaSBGZWIgMTEgMTU6MzU6MzIgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6ICBBZGQgTHlueC9yczYwMDAgc3VwcG9ydC4KLQkqIGNvbmZpZy9pMzg2LW5sbS5tdDogIEVuYWJsZSBhLm91dCBmaWxlIHN1cHBvcnQuCi0JKiBjb25maWcvcnM2MDAwbHlueC5taDogIEx5bngvcnM2MDAwIGhvc3Qgc3VwcG9ydC4KLQotRnJpIEZlYiAxMSAxNzoyNTo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBSZXdyaXRlIHNvbWV3aGF0IHRvIGltcHJvdmUKLQltZW1vcnkgdXNhZ2UuCi0KLUZyaSBGZWIgMTEgMTM6MTA6NDIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmM6IENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byAnXG4nIGluIGFyY2hpdmUgbWFnaWMKLQl0byAnXDAxMicsIGZvciBncmVhdGVyIHBvcnRhYmlsaXR5LgotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfYXJtYXApOiBEaXR0by4KLQotVGh1IEZlYiAxMCAxMjo1ODo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBDaGVjayBzdHJpcCBzZXR0aW5ncyB0bwotCXNlZSB3aGV0aGVyIHN5bWJvbCBzaG91bGQgYmUgb3V0cHV0LgotCSogZ2VubGluay5oIChzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8pOiBBZGRlZCBpbmZvCi0JZmllbGQuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIHdnaW5mby5pbmZvLgotCShfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogQ2hlY2sgc3RyaXAgc2V0dGluZ3MgdG8KLQlzZWUgd2hldGhlciBzeW1ib2wgc2hvdWxkIGJlIG91dHB1dC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IEluaXRpYWxpemUgd2dpbmZvLmluZm8uCi0KLVdlZCBGZWIgIDkgMjE6MzQ6NTggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcmVsb2NfcXVldWVfZmluZCk6IERvIG5vdCBleGFtaW5lIGEgTlVMTCBxdWV1ZSBlbnRyeS4KLQotCSogc29tLmM6IENhc3QgcmV0dXJuIHZhbHVlcyBmcm9tIEJGRCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyB0bwotCWF2b2lkIHdhcm5pbmdzIGZyb20gdGhlIEhQIGNvbXBpbGVyLgotCi1XZWQgRmViICA5IDEyOjU1OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogQWNjZXB0IGEgTElURVJBTAotCXJlbG9jIG9uIGFuICJsZGwiIGluc3RydWN0aW9uIHRvby4KLQotCSogYXJjaGl2ZS5jIChiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSk6IENhc3Qgc3RhdHVzIGVsZW1lbnRzCi0Jd2hlbiBwYXNzaW5nIHRoZW0gdG8gc3ByaW50Zi4gIFVzZSAlbGQgaW5zdGVhZCBvZiAlZC4KLQotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl9ta2FyY2hpdmUpOiBSZXR1cm4gZmFsc2UuCi0JKHJzNjAwMF9jb2ZmX3NuYXJmX2FyX2hkcik6IERvbid0IGRlY2xhcmUgZXJybm87IGl0J3Mgbm90IHVzZWQuCi0JQWxzbyByZW1vdmVkIHVudXNlZCB2YXJpYWJsZSBuYW1lbGVuLgotCShyczYwMDBjb2ZmX3dyaXRlX2FybWFwKTogRGVjbGFyZSBvcmxfY291bnQgYW5kIHN0cmlkeCBwYXJhbWV0ZXJzLgotCi1UdWUgRmViICA4IDE4OjAwOjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKHhtYWxsb2MpOiBEb24ndCBkZWNsYXJlIHBhcmFtZXRlciB0eXBlLCB0byBhdm9pZAotCWNvbmZsaWN0cy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UdWUgRmViICA4IDE1OjU1OjUwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYyAocmVsb2NfbmlsKTogTmV3IGZ1bmN0aW9uLgotCShhbHBoYV9ob3d0b190YWJsZSk6IFVzZSBpdCBhcyBzcGVjaWFsX2Z1bmN0aW9uIHRvIHByZXZlbnQgY2VydGFpbgotCXJlbG9jcyBmcm9tIGJlaW5nIGFkanVzdGVkIGJ5IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJR05PUkUKLQlyZWxvYyBzaG91bGQgYmUgcGFydGlhbF9pbnBsYWNlLgotCShhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBY2NlcHQgYSBMSVRFUkFMCi0JcmVsb2Mgb24gYW4gImxkbCIgaW5zdHJ1Y3Rpb24gdG9vLgotCi1UdWUgRmViICA4IDAwOjMyOjI4IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmMzItaHBwYS5jIChDVVJSRU5UX1NUVUJfT0ZGU0VULCBocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1YiwKLQlocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogIENhc3QgdG8gY2hhciAqIGluc3RlYWQgb2YgaW50Ci0JYmVmb3JlIHBlcmZvcm1pbmcgcG9pbnRlciBhcml0aG1ldGljLgotCi1Nb24gRmViICA3IDIwOjU2OjI3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcuYmZkIChocHBhKi0qLW9zZiopOiBVc2UgYmZkX25hbWUgaHBwYW9zZiBmb3IgdGhpcwotCWNvbmZpZ3VyYXRpb24uCi0JKGhwcGEqLSotKmVsZiopOiBUaGlzIGNvbmZpZ3VyYXRpb24gdXNlZCBocHBhLWVsZiBub3cuCi0KLQkqIHNvbS5jOiBUaGlzIGZpbGUgaXMgYWxzbyB1c2VkIGZvciBIT1NUX0hQUEFPU0YuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBFbmFibGUgc29tX3ZlYyBmb3IgSE9TVF9IUFBBT1NGLgotCi0JKiBob3N0cy9ocHBhb3NmLmg6IE5ldyBob3N0IGNvbmZpZ3VyYXRpb24gZmlsZS4KLQotCSogY29uZmlnL2hwcGFic2QubXQgKFNFTEVDVF9WRUNTKTogQWRkIGJmZF9lbGYzMl9ocHBhX3ZlYyBhcwotCUJTRCBoYW5kbGVzIGJvdGggU09NIGFuZCBFTEYgb2JqZWN0IGZpbGVzLgotCi0JKiBjb25maWcvaHBwYW9zZi5taCAoSERFRklORVMpOiBEZWxldGUuICBObyBsb25nZXIgbmVlZGVkLgotCShSQU5MSUIpOiBEb2Vzbid0IGRvIGFueXRoaW5nLCBkZWZpbmUgaXQgdG8gYmUgImVjaG8iLgotCi0JKiBjb25maWcvaHBwYW9zZi5tdDogTmV3IHRhcmdldCBtYWtlZmlsZSBmcmFnbWVudCBmb3IgYSBQQSBydW5uaW5nCi0JT1NGMS4KLQotTW9uIEZlYiAgNyAxNTowMjowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmMgKGVudW0gYmZkX2FyY2hpdGVjdHVyZSk6IEFkZGVkIGJmZF9hcmNoX3Bvd2VycGMuCi0JKGFyY2h1cmVzX2luaXRfdGFibGUpOiBJZiBTRUxFQ1RfQVJDSElURUNUVVJFUyBpcyBub3QgZGVmaW5lZCwKLQlhZGRlZCBiZmRfcG93ZXJwY19hcmNoLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY3B1LXBvd2VycGMuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTLCBDRklMRVMpOiBBZGRlZCBjcHUtcG93ZXJwYy5jLgotCVJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEdldCB2bWEgYW5kIGFsaWdubWVudF9wb3dlcgotCW9mIGFuIFNIVF9TVFJUQUIgc2VjdGlvbiBmcm9tIHNoX2FkZHIgYW5kIHNoX2FkZHJhbGlnbiwgcmF0aGVyCi0JdGhhbiBqdXN0IHNldHRpbmcgdGhlbSB0byB6ZXJvLgotCi1TdW4gRmViICA2IDIwOjA0OjEwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMsIHN3YXBfb3V0X3N5bXMpOiBDaGVjayBmb3IgTlVMTCByZXR1cm4KLQlmcm9tIGJmZF9uZXdfc3RydGFiLiAKLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENoZWNrIGZvciBmYWxzZSByZXR1cm4gZnJvbQotCXN3YXBfb3V0X3N5bXMuIAotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogQ2hlY2sgZm9yIE5VTEwgcmV0dXJuCi0JZnJvbSBiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLgotCi0JKiBzeW1zLmM6IE1ha2UgZXhhbXBsZSBhcHBsaWNhdGlvbiBpbiBkb2MgY2FsbCB4bWFsbG9jLCBub3QKLQliZmRfeG1hbGxvYy4gCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpLAotCWFvdXRfbGlua19nZXRfc3ltYm9scywgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpKToKLQkqIGJvdXQuYyAoYl9vdXRfc2x1cnBfcmVsb2NfdGFibGUsIGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKToKLQkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2luaXQpOiAKLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiAKLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IAotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IAotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiAKLQkoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiAKLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiAKLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IAotCSogZWxmY29kZS5oIChiZmRfbmV3X3N0cnRhYik6IAotCShiZmRfYWRkXzJfdG9fc3RydGFiKTogCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAKLQkoZWxmX2NvcmVmaWxlX25vdGUpOiAKLQkqIGxpYmJmZC5jIChiZmRfem1hbGxvYyk6IAotCVVzZSBtYWxsb2MgYW5kIGNoZWNrIHRoZSByZXN1bHQsIGluc3RlYWQgb2YgYmZkX3htYWxsb2MuCi0KLVNhdCBGZWIgIDUgMTI6Mzk6MjggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFB1dCBtNjgqLSotc3lzdiogbGluZSBhZnRlciBtNjgqLSotc3lzdjQqLgotCi1TYXQgRmViICA1IDA1OjMyOjQ0IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc3JlYy5jIChzcmVjX3dyaXRlX3JlY29yZCk6ICBQdXQgQ09OU1Qga2V5d29yZCBmb3IgInNyYyIgYmVmb3JlCi0JInVuc2lnbmVkIiwgc29tZSBjb21waWxlcnMgZG9uJ3QgbGlrZSBpdCBhZnRlciAidW5zaWduZWQiLgotCSogbGliY29mZi5oLCBsaWJjb2ZmLWluLmggKGJmZF9wZXJmb3JtX3NsaXApOiAgUmVuYW1lICJ2YWx1ZSIgdG8KLQkidmFsIiBpbiBwcm90b3R5cGUgZGVjbGFyYXRpb24gYmVjYXVzZSBzb21lIGNvbXBpbGVycyBkb24ndCBsaWtlCi0JYXJndW1lbnRzIHdob3NlIG5hbWVzIGFyZSB0aGUgc2FtZSBhcyB0eXBlcy4KLQotU2F0IEZlYiAgNSAwMToxNDozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogQ29ycmVjdCB0ZXN0IGZvciB3aGV0aGVyCi0Jb2JqZWN0IGZpbGUgZGVmaW5lcyBzeW1ib2wuICBBbHNvLCBpZiBza2lwcGluZyBhIHN5bWJvbCwgc2tpcCB0aGUKLQlzZWNvbmQgc3ltYm9sIG9mIGEgTl9XQVJOSU5HIG9yIE5fSU5EUiBzeW1ib2wgYXMgd2VsbC4KLQotRnJpIEZlYiAgNCAyMzo1NTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgYmFzaWMgc3VwcG9ydCBmb3Igd3JpdGluZyBSUy82MDAwIFhDT0ZGIGZpbGVzLgotCSogY29mZi1yczYwMDAuYyAoZHVtbXlfcmVsb2MpOiBSZW1vdmVkLgotCShyczYwMDBjb2ZmX2hvd3RvX3RhYmxlKTogRGVmaW5lZCBYQ09GRiByZWxvY3MuCi0JKFJUWVBFMkhPV1RPKTogRGVmaW5lZCB0byB1c2UgcnM2MDAwY29mZl9ydHlwZTJob3d0by4KLQkocnM2MDAwY29mZl9ydHlwZTJob3d0byk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmVkIHRvIHVzZQotCXJzNjAwMGNvZmZfcmVsb2NfdHlwZV9sb29rdXAuIAotCShyczYwMDBjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCShTRUxFQ1RfUkVMT0MpOiBEZWZpbmVkIHRvIHNldCByX3R5cGUgYW5kIHJfc2l6ZSBmaWVsZHMuCi0JKENPRkZfTE9OR19GSUxFTkFNRVMpOiBEZWZpbmVkLgotCSogY29mZmNvZGUuaCAoY29tYmluZWRfZW50cnlfdHlwZSk6IENoYW5nZWQgZml4X3RhZyBhbmQgZml4X2VuZAotCWZpZWxkcyB0byBiaXRmaWVsZHMuICBBZGRlZCBmaWVsZHMgZml4X3ZhbHVlIGFuZCBmaXhfc2NubGVuLgotCShzZWNfdG9fc3R5cF9mbGFncyk6IElmIFNUWVBfREVCVUcgaXMgZGVmaW5lZCwgdXNlIGl0IHJhdGhlciB0aGFuCi0JU1RZUF9JTkZPIGZvciB0aGUgdHlwZSBvZiBhIHNlY3Rpb24gbmFtZWQgLmRlYnVnLgotCShjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUgaWYgUlM2MDAwQ09GRl9DLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIFJTNjAwMENPRkZfQywgZG9uJ3QgY2FsbAotCWNvZmZfYWRkX21pc3Npbmdfc3ltYm9scy4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBSUzYwMDBDT0ZGX0MsIHRoZW4gaWYgdGhlIGxhc3QgYXV4Ci0JZW50cnkgaGFzIHR5cGUgU1RZX0xEIGNoYW5nZSB0aGUgeF9zY25sZW4gaW50byBhIHBvaW50ZXIgdG8gYQotCXN5bWJvbCBhbmQgc2V0IGZpeF9zY25sZW4uICBBbHNvLCBmb3IgYSBDX0JTVEFUIHN5bWJvbCwgY2hhbmdlIHRoZQotCXZhbHVlIGludG8gYSBwb2ludGVyIHRvIGEgc3ltYm9sIGFuZCBzZXQgZml4X3ZhbHVlLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZmdlbi5jIChjb2ZmX21hbmdsZV9zeW1ib2xzKTogUmVpbmRlbnQuICBJZiBmaXhfdmFsdWUgaXMgc2V0LAotCWdldCB0aGUgc3ltYm9sIG9mZnNldC4gTGlrZXdpc2UgZm9yIGZpeF9zY25sZW4uCi0JKHN0cmluZ19zaXplKTogQ2hhbmdlIHR5cGUgdG8gYmZkX3NpemVfdHlwZS4KLQkoZGVidWdfc3RyaW5nX3NpemUsIGRlYnVnX3N0cmluZ19zZWN0aW9uKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGNvZmZfZml4X3N5bWJvbF9uYW1lKTogSWYgYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyByZXR1cm5zIHRydWUsCi0Jd3JpdGUgdGhlIHN5bWJvbCBuYW1lIGludG8gdGhlIC5kZWJ1ZyBzZWN0aW9uOyBhc3N1bWUgdGhhdCB0aGUKLQlzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCB3aXRoIHRoZSByaWdodCBzaXplLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBJbml0aWFsaXplIGRlYnVnX3N0cmluZ19zaXplIHRvIDAuICBJZgotCWJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgcmV0dXJucyB0cnVlLCBkb24ndCBwdXQgc3ltYm9sIG5hbWUgaW4KLQl1c3VhbCBzdHJpbmcgdGFibGUuICBBZnRlciB3cml0aW5nIG91dCBhbGwgc3ltYm9scywgaWYKLQlkZWJ1Z19zdHJpbmdfc2l6ZSBpcyBub3QgMCwgY2hlY2sgdGhhdCBpdCBtYXRjaGVzIHRoZSBzaXplIG9mIHRoZQotCS5kZWJ1ZyBzZWN0aW9uLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IENsZWFyIG5ldyBmaXhfdmFsdWUgYW5kIGZpeF9zY25sZW4KLQlmaWVsZHMuICBJZiB0aGUgc3RyaW5nIG9mZnNldCBpcyAwLCBhbHdheXMgdXNlIGFuIGVtcHR5IHN0cmluZyBhcwotCXRoZSBuYW1lLgotCShjb2ZmX21ha2VfZW1wdHlfc3ltYm9sKTogWmVybyBvdXQgdGhlIHN5bWJvbCBzdHJ1Y3R1cmUuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogV29yayBhcm91bmQgb25lIGdyb3NzIGhhY2sKLQl3aXRoIGFub3RoZXI6IGFjdHVhbGx5IGxvb2sgYXQgdGhlIHRhcmdldCBuYW1lIHRvIGF2b2lkIHRoZSBicm9rZW4KLQlDT0ZGIGNoZWNrLgotCShiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGQgQkZEX1JFTE9DX1BQQ19CMjYsCi0JQkZEX1JFTE9DX1BQQ19CQTI2IGFuZCBCRkRfUkVMT0NfUFBDX1RPQzE2LgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1GcmkgRmViICA0IDE3OjI4OjMyIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmMgKGJmZF96bWFsbG9jKTogQ2FsbCBiZmRfeG1hbGxvYyBpbnN0ZWFkIG9mIG1hbGxvYy4KLQkoYmZkX3htYWxsb2MsIGJmZF94bWFsbG9jX2J5X3NpemVfdCk6IEZ1bmN0aW9ucyBkZWxldGVkLgotCSogbGliYmZkLWluLmg6IERlZmluZSB0aGVtIGFzIG1hY3JvcyBjYWxsaW5nIHhtYWxsb2MgYW5kIGRlY2xhcmUKLQl4bWFsbG9jLiAKLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UaHUgRmViICAzIDE2OjQ5OjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMpOiBJZiBhIHNtYWxsIHVuZGVmaW5lZAotCXN5bWJvbCBoYXMgYSB2YWx1ZSBpbiB0aGUgRUNPRkYgc3ltYm9sIGJ1dCBub3QgaW4gdGhlIEJGRCBzeW1ib2wsCi0Ja2VlcCB0aGUgdmFsdWUgaW4gdGhlIEVDT0ZGIHN5bWJvbC4gIFRoaXMgaGVscHMgZ2FzLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMsCi0JX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IERvbid0IHJlcXVpcmUgdGhhdCBhbGwKLQlyZWZlcmVuY2VzIHRvIGEgY29tbW9uIHN5bWJvbCBiZSB0aGVtc2VsdmVzIGNvbW1vbiBzeW1ib2xzLgotCi0JKiBhb3V0eC5oIChhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24pOiBIYW5kbGUgTl9VTkRGLgotCi1XZWQgRmViICAyIDIwOjM3OjE5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYywgYmZkLWluLmgsIGhvc3RzL2FscGhhb3NmLmgsIGhvc3RzL3NwYXJjLWxsLmgsIGFvdXRmMS5oLAotCXNwYXJjbHlueC5jLCBNYWtlZmlsZS5pbjogQ2hhbmdlIEhPU1RfNjRfQklUIHRvIEJGRF9IT1NUXzY0X0JJVC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotV2VkIEZlYiAgMiAxMjozMDoxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9yZWxvY19vdXQpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZSB0eXBlCi0JYW5kIHNpemUgY29ycmVjdGx5LgotCShjb2ZmX3N3YXBfYXV4X2luKTogSWYgUlM2MDAwQ09GRl9DLCBjaGFuZ2UgeF9jc2VjdC54X3NjbmxlbiB0bwotCXhfY3NlY3QueF9zY25sZW4ubCB0byBtYXRjaCBjaGFuZ2UgaW4gY29mZi9pbnRlcm5hbC5oLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IExpa2V3aXNlLgotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpLCBjb2ZmLWFscGhhLmMKLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogQ2hhbmdlIGNhc3RzIG9mIGF1eF9pbiBhbmQgYXV4X291dAotCWZpZWxkcyB0byBtYXRjaCB5ZXN0ZXJkYXkncyBjaGFuZ2VzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IElmIFNFTEVDVF9SRUxPQyBpcyBkZWZpbmVkLCBwYXNzCi0JaW4gdGhlIGludGVybmFsX3JlbG9jIGl0c2VsZiwgbm90IHRoZSB0eXBlLgotCSogY29mZi1hcG9sbG8uYywgY29mZi1oODMwMC5jLCBjb2ZmLWg4NTAwLmMsIGNvZmYtaTM4Ni5jLAotCWNvZmYtbTY4ay5jLCBjb2ZmLXNoLmMsIGNvZmYtd2UzMmsuYywgY29mZi16OGsuYzogQ2hhbmdlZAotCWRlZmluaXRpb24gb2YgU0VMRUNUX1JFTE9DIGFjY29yZGluZ2x5LgotCi1UdWUgRmViICAxIDEyOjA1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkZWQgbmV3IGFyZ3VtZW50cyB0bwotCV9iZmRfY29mZl9zd2FwX2F1eF9pbiBhbmQgX2JmZF9jb2ZmX3N3YXBfYXV4X291dDogYXV4IGluZGV4IG51bWJlcgotCWFuZCBudW1iZXIgb2YgYXV4IGVudHJpZXMuCi0JKGJmZF9jb2ZmX3N3YXBfYXV4X2luLCBiZmRfY29mZl9zd2FwX2F1eF9vdXQpOiBDaGFuZ2VkCi0JYWNjb3JkaW5nbHkuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luLCBjb2ZmX3N3YXBfYXV4X291dCk6IEFjY2VwdCBuZXcKLQlhcmd1bWVudHMuICBJZiBSUzYwMDBDT0ZGX0MsIG9ubHkgdHJlYXQgQ19FWFQgYW5kIENfSElERVhUCi0Jc3BlY2lhbGx5IGlmIHRoaXMgaXMgdGhlIGxhc3QgYXV4IGVudHJ5LgotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX3N5bWJvbCwgY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBQYXNzCi0JbmV3IGFyZ3VtZW50cyB0byBzd2FwX2F1eCBmdW5jdGlvbnMuCi0KLVN1biBKYW4gMzAgMTU6MTQ6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2VuLWFvdXQuYyAobWFpbik6IFNldCBERUZBVUxUX0FSQ0ggYmFzZWQgb24gcHJlcHJvY2Vzc29yIG1hY3JvcwotCShvbmx5IHRlc3RpbmcgZm9yIG02OGsgYW5kIHZheCBhdCB0aGUgbW9tZW50KTsgZG8gdmVyaWZ5IHRoYXQgdGhlCi0JcHJlcHJvY2Vzc29yIGRpZG4ndCB0cmFzaCB0aGUgYXJjaCBuYW1lIGluc2lkZSB0aGUgc3RyaW5nIHZlcnNpb24uCi0JRG9uJ3QgcHJpbnQgb3V0ICJwYWdlc2l6ZSA9IiBsaW5lIHRoYXQgcHJldmVudHMgb3V0cHV0IGZyb20KLQljb21waWxpbmcuICBEZXJpdmUgQllURVNfSU5fV09SRCBhbmQgQVJDSCB2YWx1ZXMgZnJvbSBzaXplb2YKLQlyZXN1bHRzLgotCSogTWFrZWZpbGUuaW4gKGFvdXQtcGFyYW1zLmgpOiBQYXNzIGdlbi1hb3V0IGEgZHVtbXkgdGFyZ2V0IG5hbWUuCi0JKGNoZWNrLCBpbnN0YWxsY2hlY2spOiBJZGVudGlmeSBkaXJlY3RvcnkgaW4gIm5vIHRlc3RzdWl0ZXMiCi0JbWVzc2FnZS4KLQotU3VuIEphbiAzMCAxMzoyNToyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogV3JpdGUgb3V0IGNvcnJlY3QgdmFsdWUgZm9yCi0Jb2JqZWN0IGZpbGUgc3ltYm9sLgotCi1GcmkgSmFuIDI4IDE4OjM0OjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3ZheGJzZC5oIChIT1NUX1NUQUNLX0VORF9BRERSKTogVmF4IEJTRCBkb2Vzbid0IGRlZmluZQotCUtFUk5CQVNFLCBzbyBoYXJkLWNvZGUgMHg4MDAwMDAwMCBpbnN0ZWFkLgotCi1UaHUgSmFuIDI3IDEzOjU0OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBJZiBzeW1ib2wgaXMgY29tbW9uLAotCXNldCB0aGUgQlNGX09MRF9DT01NT04gZmxhZy4KLQotV2VkIEphbiAyNiAxMzo0NzoxNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBQdXQgdGhlIG5ldyBlbnRyeSBpbiB0aGUKLQljb3JyZWN0IGVsZW1lbnQgb2YgbWF0Y2hpbmdfdmVjdG9yLgotCi1UdWUgSmFuIDI1IDExOjQzOjI4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzb20uYywgc29tLmggKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcywKLQliZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMpOiBDaGFuZ2UgcGFyYW1ldGVycyBmcm9tIGNoYXIKLQl0byBpbnQuICBGb2xsb3dpbmcgYSBwcm90b3R5cGUgd2l0aCBhbiBvbGQtc3R5bGUgZnVuY3Rpb24gZGVmaW5pdGlvbgotCWluIHRoZSBwcmVzZW5jZSBvZiB3aWRlbmVkIHBhcmFtZXRlcnMgaXMgYSBHQ0MtaXNtIG5vdCBzdXBwb3J0ZWQKLQlieSB0aGUgSFAgY29tcGlsZXIgaW4gQU5TSSBtb2RlLgotCi1UdWUgSmFuIDI1IDExOjQ2OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX2dldF9yZWxvY19zaXplKTogU2l6ZSBvZiB0eXBlIC0yIGlzIDQgYnl0ZXMsIG5vdCAyLgotCi0JKiBocDMwMGhwdXguYyAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFdyaXRlIG91dCB0aGUgc3ltYm9scwotCWJlZm9yZSB3cml0aW5nIG91dCB0aGUgcmVsb2NzLCBzbyB0aGF0IHRoZSByaWdodCBzeW1ib2wgaW5kaWNlcwotCWFyZSB1c2VkLgotCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2JzZF9hcm1hcCwgYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IERvIG5vdAotCXRyeSB0byBvdmVybGF5IHRoZSBpbnRlcm5hbCBjYXJzeW1zIG9uIHRoZSBleHRlcm5hbCBzeW1kZWZzLiAgVGhhdAotCWNhbiBub3Qgd29yayBpZiB0aGUgc2l6ZSBvZiBhIGhvc3QgcG9pbnRlciBpcyBsYXJnZXIgdGhhbiA0IGJ5dGVzLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogQ2FzdCByZXN1bHQgb2YKLQliZmRfeG1hbGxvY19ieV9zaXplX3QuCi0JKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkKTogQXZvaWQgQU5TSSBDIHByb3RvdHlwZS4KLQotCSogYXJjaGl2ZS5jOiBSZWluZGVudGVkIHRvIEdOVSBzdGFuZGFyZHMuCi0KLU1vbiBKYW4gMjQgMTQ6NDE6MjMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkLCBfYmZkX25ld19iZmRfY29udGFpbmVkX2luKTogQWRkCi0JIl9iZmRfIiB0byBmdW5jdGlvbiBuYW1lcy4KLQkqIGFyY2hpdmUuYyAoX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsKSwKLQlsaWJiZmQtaW4uaDogQ2hhbmdlIGNhbGxlcnMuCi0KLQkqIGxpYmJmZC5jIChiZmRfem1hbGxvYyk6IFJlbmFtZWQgZnJvbSB6YWxsb2MuCi0JKiBsaWJiZmQuYyAoYmZkX2FkZF90b19zdHJpbmdfdGFibGUpLAotCXRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApLAotCXRhcmdldHMuYyAoYmZkX3RhcmdldF9saXN0KSwKLQlwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCksCi0Jb3BuY2xzLmMgKG5ld19iZmQpLCBsaWJiZmQtaW4uaCwKLQlpZWVlLmMgKGllZWVfbWFrZV9lbXB0eV9zeW1ib2wpLAotCWVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9icmFuY2hfcmVsb2MpLAotCShocHBhX2VsZl9zdHViX3JlbG9jKTogQ2hhbmdlIGNhbGxlcnMuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIGFyY2hpdmUuYyAoX2JmZF9sb29rX2Zvcl9iZmRfaW5fY2FjaGUpOiBBZGQgIl9iZmRfIiB0byBuYW1lLgotCShfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyksIAotCWNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zKSwgbGliYmZkLWluLmg6Ci0JQ2hhbmdlIGNhbGxlcnMuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpLCBsaWJiZmQtaW4uaCwgdGFyZ2V0cy5jLAotCWVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogUmVuYW1lIHRhcmdldF92ZWN0b3IgdG8gYmZkX3RhcmdldF92ZWN0b3IKLQlhbmQgZGVmYXVsdF92ZWN0b3IgdG8gYmZkX2RlZmF1bHRfdmVjdG9yLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfY2hlY2tfZm9ybWF0KTogQ2FsbCBpdC4KLQkoYmZkX21hdGNoaW5nX2Zvcm1hdHMpOiBGdW5jdGlvbiByZW1vdmVkLgotCSogdGFyZ2V0cy5jOiBSZXBsYWNlIHRoZSB2ZWN0b3IgYWRkZWQgb24gSmFuIDIxIHdpdGggYSBjb3VudCBvZgotCWVudHJpZXMgaW4gZGVmYXVsdF92ZWN0b3IuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1Nb24gSmFuIDI0IDEyOjM4OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9vYmplY3RfcCk6IE5ldyBmdW5jdGlvbi4gIFNldCBzaXplIG9mCi0JLnBkYXRhIHNlY3Rpb24gYmFzZWQgb24gbG5ub3B0ciBmaWVsZCwgbm90IHNlY3Rpb24gaGVhZGVyLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGlmIHJfc3ltbmR4ID49IDAsCi0Jc2luY2UgaXQgaXMgdW5zaWduZWQuCi0JKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IFVzZSBhbHBoYV9lY29mZl9vYmplY3RfcCByYXRoZXIgdGhhbgotCWNvZmZfb2JqZWN0X3AuCi0JKiBlY29mZi5jIChlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IGFsaWdubWVudF9wb3dlciBmaWVsZCBvZgotCS5wZGF0YSBzZWN0aW9uIHRvIDMuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFNhdmUgdGhlIHNpemUgb2YgdGhlCi0JLnBkYXRhIHNlY3Rpb24gaW4gdGhlIGxpbmVfZmlsZXBvcyBmaWVsZCwgYW5kIGFjdHVhbGx5IGFsaWduIHRoZQotCS5wZGF0YSBzZWN0aW9uIHRvIGFuIGFsaWdubWVudCBwb3dlciBvZiA0LgotCShlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogU2V0IG91dHB1dF9oYXNfYmVndW4gYWZ0ZXIKLQljYWxsaW5nIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IHNfbG5ub3B0ciBmb3IgdGhlIC5wZGF0YQotCXNlY3Rpb24gZnJvbSB0aGUgbGluZV9maWxlcG9zIGZpZWxkLiAgU2V0IHZzdGFtcCBmb3IgdGhlIG9wdGlvbmFsCi0JaGVhZGVyIGZyb20gdGhlIHZzdGFtcCBvZiB0aGUgc3ltYm9saWMgaGVhZGVyLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IFNldCB2c3RhbXAgb2YgdGhlIHN5bWJvbGljIGhlYWRlciB0byB0aGUKLQl2c3RhbXAgdXNlZCBieSB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUgaW4gdGhlIGxpbmsuCi0KLQkqIGVjb2ZmbGluay5jIChlY29mZl9hbGlnbl9kZWJ1Zyk6IEFsaWduIFJGRHMgdG8gZGVidWdfYWxpZ24uCi0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYWNoaXZlX2VsZW1lbnQpOiBTZXQgU0VDX0FMTE9DIGZsYWcKLQlmb3IgYSBjcmVhdGVkIGNvbW1vbiBzZWN0aW9uLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBVc2UgZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiB0bwotCWdldCB0aGUgaW5kZXggb2YgYSBjb21tb24gc2VjdGlvbiwgcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nCi0JU0hOX0NPTU1PTiAoTUlQUyBoYXMgbXVsdGlwbGUgY29tbW9uIHNlY3Rpb25zKS4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IFR5cG8gKD09IGZvciA9KS4KLQotCSogYmZkL2FvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCwKLQlhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBQYXNzIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvCi0JcmVsb2Nfb3ZlcmZsb3cgY2FsbGJhY2suCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywKLQlhbHBoYV9yZWxvY2F0X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgotCSogY29mZi1oODUwMC5jIChleHRyYV9jYXNlKTogTGlrZXdpc2UuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXo4ay5jIChleHRyYV9jYXNlKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfZmluaXNoKTogTGlrZXdpc2UuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotCSogYm91dC5jIChjYWxsanhfY2FsbGJhY2ssIGNhbGxqX2NhbGxiYWNrKTogVXNlIGdldF92YWx1ZSB0byBnZXQKLQl0aGUgc3ltYm9sIHZhbHVlIGFuZCBjaGVjayBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKGdldF92YWx1ZSk6IElmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLCBsb29rIGl0IHVwIGluIHRoZSBsaW5rZXIKLQloYXNoIHRhYmxlLgotCShiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBGb3IgUENSRUwyNCBhbmQgUENSRUwxMwotCXVzZSBnZXRfdmFsdWUgdG8gZ2V0IHRoZSBzeW1ib2wgdmFsdWUgYW5kIGNoZWNrIGZvciB1bmRlZmluZWQKLQlzeW1ib2xzLgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IElmIHRoZSBzeW1ib2wgaXMKLQl1bmRlZmluZWQsIGxvb2sgaXQgdXAgaW4gdGhlIGxpbmtlciBoYXNoIHRhYmxlLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKTogVGhlIHN0cmluZyBpbmRleCAwIGhhcyBhCi0Jc3BlY2lhbCBtZWFuaW5nIGZvciBub3JtYWwgc3ltYm9scywgYnV0IG5vdCBmb3IgZHluYW1pYyBzeW1ib2xzLgotCi1TYXQgSmFuIDIyIDEyOjI2OjAxIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjbHlueC5jOiAgU2V0dXAgYXBwcm9wcmlhdGUgbWFjcm9zIHRvIGVuYWJsZSBjb3JlIGZpbGUKLQlzdXBwb3J0LgotCi1GcmkgSmFuIDIxIDE2OjI1OjM1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jOiBBZGQgYSB2ZWN0b3Igb2YgbWF0Y2hpbmcgZm9ybWF0IG5hbWVzLgotCSogZm9ybWF0LmMgKGJmZF9tYXRjaGluZ19mb3JtYXRzKTogTmV3IGZ1bmN0aW9uIHRvIHJldHVybiBpdC4KLQkoYmZkX2NoZWNrX2Zvcm1hdCk6IFNldCBpdC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIGJmZC1pbi5oOiBSZW1vdmUgZGVjbHMgb2YgYmZkX2VjIHR5cGUgYW5kIGVycm9yIHByaW50aW5nIGZ1bmN0aW9ucy4KLQlSZW1vdmUgZGVjbCBvZiB0eXBlIHN5bWNsYXNzOyB3YXNuJ3QgdXNlZC4KLQkqIGJmZC5jOiBEb2N1bWVudCBlcnJvciBoYW5kbGluZywgaW5jbHVkaW5nIGNvZGUgZnJhZ21lbnRzCi0JY29udGFpbmluZyB0aGUgZXJyb3IgZGVjbHMgdGhhdCB3ZXJlIGluIGJmZC1pbi5oLgotCVJlbW92ZSBERUZVTnMuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1GcmkgSmFuIDIxIDE0OjExOjE2IDE5OTQgIFNlYW4gRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oLCBsaWJsbm0uaCwgbmxtMzItYWxwaGEuYyBubG0zMi1pMzg2LmMgbmxtMzItc3BhcmMuYzoKLQlUaGUgc3BhcmMgKGFuZCBwb3NzaWJseSBvdGhlcj8pIE5MTSBmb3JtYXQgcmVxdWlyZXMgYSBkaWZmZXJlbnQKLQl3YXkgdG8gd3JpdGUgZXhwb3J0cywgc28gYWRkIGEgd3JpdGVfZXhwb3J0IGZpZWxkIHRvIHRoZSBiYWNrZW5kCi0JZGF0YSAoYW5kIHNldCBpdCB0byBOVUxMIGZvciBldmVyeXRoaW5nIGJ1dCB0aGUgc3BhcmMpLgotCi1GcmkgSmFuIDIxIDE0OjExOjE2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzdW5vcy5jIChNWShyZWFkX2R5bmFtaWNfcmVsb2NzKSk6IENvbXBhcmUgaW5mby0+ZHlucmVsIHdpdGggTlVMTCwKLQlub3QgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMLiAgaW5mby0+ZHlucmVsIGlzIGEgUFRSLCBub3QKLQlhIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqLgotCi1GcmkgSmFuIDIxIDA5OjI5OjAxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6IFJlbW92ZSBlcnJvciBzdHJpbmdzIGZvciBlcnJvcnMgcmVtb3ZlZCBiZWxvdy4KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKSwgYmZkLWluLmggKGJmZF9lYyksCi0Jb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBSZW5hbWUKLQliZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uIHRvIG5vbnJlcHJlc2VudGFibGVfc2VjdGlvbi4KLQlOb25lIG9mIHRoZSBvdGhlciBiZmQgZXJyb3IgbmFtZXMgc3RhcnQgd2l0aCAiYmZkX2Vycm9yIi4KLQlSZW1vdmUgZXJyb3JzIHN5bWJvbF9ub3RfZm91bmQgYW5kIG5vX3JlbG9jYXRpb25faW5mbywgd2hpY2ggc2VlbQotCXRvIGJlIHVudXNlZC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLUZyaSBKYW4gMjEgMDE6MTE6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX2dldF9ncF9zaXplKTogQWRkZWQgc3VwcG9ydCBmb3IgRUxGLgotCi0JKiBzeW1zLmMgKEJTRl9EWU5BTUlDKTogTmV3IHN5bWJvbCBmbGFnLgotCShiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogUHJpbnQgaXQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IE5ldyByZWFkX2R5bmFtaWNfc3ltYm9scwotCWFuZCByZWFkX2R5bmFtaWNfcmVsb2NzIGZpZWxkcy4KLQkoc3RydWN0IGFvdXRkYXRhKTogTmV3IGR5bmFtaWNfaW5mbyBmaWVsZC4KLQkob2JqX2FvdXRfZHluYW1pY19pbmZvKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCSogc3Vub3MuYyAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyk6IE5ldyBzdHJ1Y3R1cmUuCi0JKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvLCBNWShyZWFkX2R5bmFtaWNfc3ltYm9scyksCi0JTVkocmVhZF9keW5hbWljX3JlbG9jcykpOiBOZXcgZnVuY3Rpb25zIHRvIHJlYWQgZHluYW1pYyBzeW1ib2xzCi0JYW5kIHJlbG9jcy4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogSWYgdGhlIG9iamVjdCBpcwotCWR5bmFtaWNhbGx5IGxpbmtlZCwgc2V0IFNFQ19SRUxPQyBmb3IgYm90aCB0aGUgLnRleHQgYW5kIC5kYXRhCi0Jc2VjdGlvbnMuCi0JKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBEb24ndCBzZXQgQlNGX0xPQ0FMIGZvciBhbgotCXVuZGVmaW5lZCBzeW1ib2wuCi0JKHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG91dCBvZgotCXNsdXJwX3N5bWJvbF90YWJsZTsgc2V0IHRoZSBCU0ZfRFlOQU1JQyBmbGFnIGFwcHJvcHJpYXRlbHkuCi0JKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogUmVhZCBkeW5hbWljIHN5bWJvbHMsIGlmIGFueS4KLQkoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IFJlYWQgZHluYW1pYyByZWxvY3MsIGlmIGFueS4KLQkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBJbmNsdWRlIGR5bmFtaWMgcmVsb2MgY291bnQgaW4KLQlyZXR1cm4gdmFsdWUuCi0JKiBhb3V0ZjEuaCAoTkFNRShhb3V0LHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpKTogRG9uJ3Qgd3JpdGUKLQlvdXQgZHluYW1pYyBzeW1ib2xzIG9yIHJlbG9jcyBhZ2FpbnN0IHJlbG9jIHN5bWJvbHMsIHNpbmNlIHRoZXkKLQlhcmUgYWxyZWFkeSBpbiB0aGUgLnRleHQgc2VjdGlvbiBhbmQgd2Ugd291bGRuJ3Qga25vdyB3aGVyZSB0bwotCXdyaXRlIHRoZW0gYW55aG93LgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSByZWFkX2R5bmFtaWNfc3ltYm9scyBhbmQKLQlyZWFkX2R5bmFtaWNfcmVsb2NzIGZpZWxkcy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGJhY2tlbmRfZGF0YSkpOiBJbml0aWFsaXplCi0JcmVhZF9keW5hbWljX3N5bWJvbHMgYW5kIHJlYWRfZHluYW1pY19yZWxvY3MgZmllbGRzLgotCi1UaHUgSmFuIDIwIDIwOjU3OjI3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2FscGhhb3NmLmggKHVpbnQ2NGVfdHlwZSwgdWludDY0X3R5cGUsIGludDY0X3R5cGUpOiBEZWxldGUKLQl0eXBlZGVmcywgc2luY2UgSE9TVF82NF9CSVQgd2lsbCB0YWtlIGNhcmUgb2YgZGVmaW5pbmcgdGhlbSBpbgotCWJmZC5oLgotCi1XZWQgSmFuIDE5IDE3OjI4OjU5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9hbHBoYW9zZi5taCAoSERFRklORVMpOiBEb24ndCBkZWZpbmUgSE9TVF82NF9CSVQgaGVyZTsKLQl0aGF0J3MgZGVhbHQgd2l0aCBlbHNld2hlcmUuCi0JKiBob3N0cy9hbHBoYW9zZi5oIChzcHJpbnRmX3ZtYSwgZnByaW50Zl92bWEpOiBOZXcgbWFjcm9zLgotCSh1aW50NjRfdHlwZUhJR0gsIHVpbnQ2NF90eXBlTE9XKTogQ29tbWVudCB3aXRoIEhPU1RfNjRfQklUIHNvCi0JdGhleSBnZXQgY29waWVkIHRvIGJmZC5oLgotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGQgc29tZSBBbHBoYSByZWxvY2F0aW9uCi0JdHlwZXMuICBSZW9yZ2FuaXplZCBzb21lIG9mIHRoZSBleGlzdGluZyBvbmVzLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9ob3d0b190YWJsZSk6IENvbnN0cnVjdCA2NC1iaXQgbmVnYXRpdmUgb25lCi0JdmFsdWVzIGluIGNhc2Ugb2YgY29tcGlsYXRpb24gb24gYSAzMi1iaXQgbWFjaGluZS4gIEZpeCBwY3JlbAotCWZpZWxkcyBvZiBzb21lIHJlbG9jIHR5cGVzLgotCShhbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgbW9yZSByZWxvY2F0aW9uIHR5cGVzLgotCi0JKiBiZmQtaW4uaCAodWludDY0X3R5cGVISUdILCB1aW50NjRfdHlwZUxPVyk6IFN1cHBseSBkZWZhdWx0Ci0JZGVmaW5pdGlvbnMgd2hlbiBub3QgZGVmaW5lZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHVpbnQ2NF90eXBlIGlzCi0JYSBkZWZpbmVkIG1hY3JvIG9yIG5vdC4KLQkoZnByaW50Zl92bWEsIHNwcmludGZfdm1hKTogRGVmaW5lIG9ubHkgaWYgZnByaW50Zl92bWEgaXMgbm90Ci0JYWxyZWFkeSBkZWZpbmVkLgotCi1XZWQgSmFuIDE5IDAwOjAyOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBTZXQgdGhlIHR5cGUgb2YgYQotCUJTRl9XQVJOSU5HIHN5bWJvbCB0byBOX1dBUk5JTkcuCi0KLVR1ZSBKYW4gMTggMTY6NDM6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBJbmNyZW1lbnQgc3ltX2hhc2ggYXMgd2VsbCBhcyBwCi0JZm9yIGFuIGluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFVwZGF0ZSBzeW1faGFzaCB3aXRoIHRoZSB0YXJnZXQgb2YgYW4KLQlpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbC4gIElmIGFuIGluZGlyZWN0IHN5bWJvbCBpcyBkZWZpbmVkLAotCW91dHB1dCB0aGUgY2FsY3VsYXRlZCB2YWx1ZSBhbmQgZG9uJ3Qgb3V0cHV0IHRoZSB0YXJnZXQgc3ltYm9sLgotCi1UdWUgSmFuIDE4IDAzOjU0OjU5IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IEdpdmUgd2FybmluZyBzeW1ib2xzCi0JYW4gKHVudXNlZCkgbm9uemVybyBzZWN0aW9uIHZhbHVlLCBuZWVkZWQgZm9yIGNoZWNrIGJlbG93LgotCi1Nb24gSmFuIDE3IDE1OjEyOjA3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncywKLQlhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBUcmVhdCBOX1NFVFtBQkRUXSB8IE5fRVhUIGxpa2UKLQlOX1NFVFtBQkRUXS4KLQotRnJpIEphbiAxNCAxNjo0NTo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogSWYgdGhlcmUgaXMgYSBTSFRfRFlOQU1JQyBzZWN0aW9uLCBzZXQKLQl0aGUgRFlOQU1JQyBmbGFnIGZvciB0aGUgQkZELgotCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IERvbid0IHRyeSB0byB3cml0ZSBvdXQgYQotCUJGRCB3aXRoIHRoZSBEWU5BTUlDIGZsYWcgc2V0LCBzaW5jZSB3ZSBkb24ndCBnZW5lcmF0ZSB0aGUgcHJvZ3JhbQotCWhlYWRlciB0YWJsZSBjb3JyZWN0bHkuCi0KLUZyaSBKYW4gMTQgMDE6MDQ6MzYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgRnJlZSB4X3N5bXAgYXQgdGhlIGVuZAotCW9mIHRoZSBmdW5jdGlvbiB0byBhdm9pZCBzdG9yYWdlIGxlYWsuCi0KLVRodSBKYW4gMTMgMjM6MDc6MzIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogQW4gaWZkIGNhbiBiZSAtMS4KLQotVGh1IEphbiAxMyAxMjozMzoyNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbyk6IFByb3ZpZGUgYSBkZWZhdWx0IHN5bWJvbCBmb3IKLQlyZWxvY2F0aW9ucyB3aGljaCBkb24ndCBhY3R1YWxseSBoYXZlIGFuIGFzc29jaWF0ZWQgc3ltYm9sLgotCi0JKiBzb20uYyAoaHBwYV9zb21fcmVsb2MpOiBBZGQgbmV3ICJlcnJvciBtZXNzYWdlIiBhcmd1bWVudC4KLQotV2VkIEphbiAxMiAxMzozNjo0MyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQlFbmFibGUgZ2RiIHRvIHdyaXRlIHRvIGNvcmUgZmlsZXMgb24gbW9yZSBjb3JlIGZpbGUgcmVhZGVycy4KLQkqIGxpYmJmZC5jIChiZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyk6ICBSZW1vdmUgcmFuZ2UgY2hlY2sKLQlmb3Igc2VjdGlvbiBzaXplLCBpdCBpcyBhbHJlYWR5IGRvbmUgaW4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0Jd2l0aCBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9ub3cuCi0JKiBhaXgzODYtY29yZS5jLCBocHBhYnNkLWNvcmUuYywgaHB1eC1jb3JlLmMsIGlyaXgtY29yZS5jLAotCW9zZi1jb3JlLmMsIHB0cmFjZS1jb3JlLmMsIHRyYWQtY29yZS5jICgqX3NldF9zZWN0aW9uX2NvbnRlbnRzKToKLQlVc2UgYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMgaW5zdGVhZCBvZiBiZmRfZmFsc2UuCi0KLVdlZCBKYW4gMTIgMTU6MzE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYzogQWRkZWQgaW5pdGlhbCBkb2N1bWVudGF0aW9uLgotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogRG9uJ3QgZXhwZWN0IHNwYWNlIGZvcgotCW91dHB1dCByZWxvY2F0aW9ucyBpZiB0aGVyZSBhcmVuJ3QgYW55IGlucHV0IHJlbG9jYXRpb25zLgotCi1UdWUgSmFuIDExIDE0OjM3OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogU2V0IGFfZW50cnkgYmVmb3JlIGNvbXB1dGluZwotCWZpbGUgb2Zmc2V0cy4KLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogQSBjb21tb24gc3ltYm9sIGlzIFNUVF9PQkpFQ1QsIG5vdAotCVNUVF9OT1RZUEUuCi0KLVR1ZSBKYW4gMTEgMDk6MTA6NTYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFVzZSBFTEYsIG5vdCBDT0ZGIGZvciBtODgqLSotZGd1eCouCi0JQ29tYmluZSBtODhrLSotKiBhbmQgbTg4MTEwLSotKiBjYXNlcyBpbnRvIG04OCotKi0qLgotCi1UdWUgSmFuIDExIDAwOjA3OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmZsaW5rLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIGNvbXByZXNzIGFuZCBtZXJnZSBkZWJ1Z2dpbmcKLQlpbmZvcm1hdGlvbiwgYW5kIHRvIHdyaXRlIHNvbWUgb2Ygb3V0IGRpcmVjdGx5IHJhdGhlciB0aGFuIHNhdmluZwotCWl0IGluIG1lbW9yeS4gIFNldmVyYWwgbmV3IGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcywgYW5kIG5ldwotCWFyZ3VtZW50cyB0byBleGlzdGluZyBmdW5jdGlvbnMuCi0JKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogQ29tcHV0ZQotCXN5bV9maWxlcG9zIGFzIHdlbGwuCi0JKGVjb2ZmX2dldF9leHRyKTogVXNlIGlmZG1hcCBpbnN0ZWFkIG9mIGlmZGJhc2UuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGNvbXB1dGUgc3ltX2ZpbGVwb3MgaGVyZS4KLQlPbmx5IG91dHB1dCBzeW1ib2xzIGlmIG91dHN5bWJvbHMgaXMgbm90IE5VTEwuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogQWRqdXN0IGZvciBjaGFuZ2VzIGluIGVjb2ZmX2RlYnVnX2luZm8gYW5kCi0JYmZkX2Vjb2ZmX2RlYnVnIGZ1bmN0aW9ucy4gIFdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaGVyZS4KLQkoZWNvZmZfZmluYWxfbGlua19kZWJ1Z19hY2N1bXVsYXRlKTogQWRqdXN0IGZvciBjaGFuZ2VzIGluCi0JYmZkX2Vjb2ZmX2RlYnVnIGZ1bmN0aW9ucy4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IFVzZSBpZmRtYXAgcmF0aGVyIHRoYW4gaWZkYmFzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogUmVhZCBleHRlcm5hbCBzeW1ib2xzCi0JZmlyc3QsIHRvIHB1dCB0aGVtIGluIHRoZSBmaXJzdCBtZW1vcnkgYnVmZmVyLiAgQ2xlYXIgZmRyIGZpZWxkLgotCShtaXBzX2VsZl9nZXRfZXh0cik6IFVzZSBwb2ludGVyIHRvIHVuc3dhcHBlZCBleHRlcm5hbCBzeW1ib2wuCi0JKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBBZGp1c3QgZm9yIGNoYW5nZXMgaW4gYmZkX2Vjb2ZmIGZ1bmN0aW9ucy4KLQlQcmVzZXJ2ZSAudGV4dCwgLmRhdGEgYW5kIC5ic3MgZXZlbiBpZiB0aGV5IGFyZSBlbXB0eS4gIFNhdmUKLQlwb2ludGVyIHRvIHVuc3dhcHBlZCBleHRlcm5hbCBzeW1ib2wgcmF0aGVyIHRoYW4gY29weWluZyBpdC4KLQlEb24ndCBmcmVlIHVwIHRoZSBleHRlcm5hbCBzeW1ib2xzLgotCSogbGliZWxmLmggKGVsZl9zeW1ib2xfdHlwZSk6IENoYW5nZSBtaXBzX2V4dHIgdG8gUFRSLgotCSogYmZkLWluLmggKGJmZF9lY29mZl9kZWJ1Z19pbml0LCBiZmRfZWNvZmZfZGVidWdfZnJlZSk6IERlY2xhcmUuCi0JKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlcik6IFJlbmFtZSBkZWNsYXJhdGlvbiBmcm9tCi0JYmZkX2Vjb2ZmX2RlYnVnX2xpbmtfb3RoZXIgYW5kIHVwZGF0ZS4KLQkoYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotTW9uIEphbiAxMCAyMDo0Njo1MyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZW1vdmUgIkAiIHdoaWNoIGZvbGxvd3MgYSBiYWNrc2xhc2guICBJbgotCXRoaXMgcG9zaXRpb24gaXQganVzdCBjYXVzZXMgZXJyb3JzLCBub3Qgc3VwcHJlc3NlcyBlY2hvZXMuCi0KLU1vbiBKYW4gMTAgMDk6MDY6MjEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEZpeCBoYW5kbGluZyBvZiBMVCBhbmQgUlQKLQlmaWVsZCBzZWxlY3RvcnMuCi0KLVN1biBKYW4gIDkgMDQ6MzI6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pMzg2LW5ldGJzZC5tdCAoU0VMRUNUX1ZFQ1MpOiBJbmNsdWRlIGkzODZic2RfdmVjLgotCi1GcmkgSmFuICA3IDEwOjI3OjI3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYWRqdXN0X3pfbWFnaWMpOiBEb24ndCBtZXJnZSB0aGUgc3RhcnQgb2YgYnNzIHdpdGggdGhlCi0JZW5kIG9mIGRhdGEgaWYgdGhleSBhcmUgbm90IGNvbnRpZ3VvdXMuCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogQ29tbWVudCB0aGUgZmllbGRzJyBtZWFuaW5ncy4KLQotRnJpIEphbiAgNyAxNTo0MDoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBEb24ndCBzZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGZsYWcKLQlmb3IgLnJlZ2luZm8gc2VjdGlvbiBoZXJlLgotCShlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IGl0IGhlcmUgaW5zdGVhZC4KLQotRnJpIEphbiAgNyAxMDoyOToyNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLSAgICAJKiBiZmQtaW4uaDogKGJmZF9ib29sZWFuKTogQWRkIHdvcmthcm91bmQgZm9yIHN5c3RlbXMgdGhhdCBhbHNvCi0JZGVmaW5lIHRydWUgYW5kIGZhbHNlIGFzIGVudW1zLgotCShBTE1PU1RfU1REQyk6IEFkZCBhcyBhbHRlcm5hdGl2ZSB0byBfX1NURENfXy4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIHN5bXMuYyAoYmZkX3ByaW50X3N5bWJvbF92YW5kZik6IENvbnZlcnQgYSBQVFIgdG8gRklMRSouCi0KLVRodSBKYW4gIDYgMTQ6MjQ6NDQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IENhdGNoIHRoZSBjYXNlIHdoZXJlCi0JdGhlcmUgaXMgbm8gb3V0cHV0IHNlY3Rpb24uCi0KLVRodSBKYW4gIDYgMTQ6Mzc6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6IElmIHdlIGNhbid0IHJlYWQgdGhlIGZpeGVkIGhlYWRlciwKLQljb3VudCBpdCBhcyBhIHdyb25nIGZvcm1hdCBlcnJvciwgbm90IGEgc3lzdGVtIGNhbGwgZXJyb3IsIHNpbmNlCi0JdGhlIG9iamVjdCBmaWxlIG1pZ2h0IHNpbXBseSBiZSB0b28gc21hbGwuCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEFkZGVkIG5sbTMyX2FscGhhX3ZlYyBpbnNpZGUgI2lmZGVmCi0JQkZENjQuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgbmxtMzItYWxwaGEuby4KLQkoQkZENjRfQkFDS0VORFMpOiBBZGQgbmxtMzItYWxwaGEuby4gIEl0IGRlcGVuZHMgb24gNjQgYml0Ci0Jc3VwcG9ydCwgZXZlbiB0aG91Z2ggaXQgaXMgZm9yIGFuIEFscGhhIGluIDMyIGJpdCBtb2RlLgotCSogY29uZmlndXJlLmluIChubG0zMl9hbHBoYV92ZWMpOiBTZXQgdGFyZ2V0NjQgdG8gdHJ1ZS4KLQotCSogbmxtMzItZ2VuLmMsIG5sbTY0LWdlbi5jOiBSZW1vdmVkLiAgQWxsIG5sbSB0YXJnZXRzIGFyZQotCWRpZmZlcmVudCwgc28gdGhlcmUgaXMgbm8gcG9pbnQgdG8gcHJvdmlkaW5nIGEgZ2VuZXJpYyBvbmUuCi0JKiBsaWJubG0uaDogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGZvciBubG1fYmFja2VuZChiZmQpIGJlaW5nIE5VTEwKLQlpbiB0aGUgYmFja2VuZCBhY2Nlc3NvciBtYWNyb3M7IHRoYXQgc2hvdWxkIG5vIGxvbmdlciBiZSBwb3NzaWJsZS4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZWQgbmxtMzJfYmlnX2dlbmVyaWNfdmVjLAotCW5sbTY0X2JpZ19nZW5lcmljX3ZlYywgbmxtNjRfbGl0dGxlX2dlbmVyaWNfdmVjLgotCSogY29uZmlndXJlLmluIChubG0zMl9iaWdfZ2VuZXJpY192ZWMsIG5sbTMyX2xpdHRsZV9nZW5lcmljX3ZlYywKLQlubG02NF9iaWdfZ2VuZXJpY192ZWMsIG5sbTY0X2xpdHRsZV9nZW5lcmljX3ZlYyk6IFJlbW92ZWQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMsIGFuZAotCShCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZWQgbmxtMzItZ2VuLm8uCi0JKEJGRDY0X0JBQ0tFTkRTKTogUmVtb3ZlZCBubG02NC1nZW4uby4KLQkoQ0ZJTEVTKTogUmVtb3ZlZCBubG0zMi1nZW4uYyBhbmQgbmxtNjQtZ2VuLmMuCi0KLQkqIGhwMzAwaHB1eC5jIChBUkNIX1NJWkUpOiBEZWZpbmUgYmVmb3JlIGluY2x1ZGluZyBhb3V0eC5oLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBBZGQgY29uc3RydWN0b3IgYW5kCi0JYml0c2l6ZSBhcmd1bWVudHMuICBDaGFuZ2VkIGFsbCBjYWxsZXJzIChhb3V0eC5oKS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEFkZCBjb25zdHJ1Y3RvcgotCWFuZCBiaXRzaXplIGFyZ3VtZW50cyB0byBkZWNsYXJhdGlvbi4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBlY29mZi5jOiBGaXJzdCBjdXQgYXQgbmV3IHN0eWxlIG9mIGxpbmtlciBiYWNrZW5kIGZvcgotCUVDT0ZGLS1hZGRlZCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucy4gIEFsc286Ci0JKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzKTogU2V0IGZsYWdzIGZvciAucGRhdGEgYW5kIC54ZGF0YS4KLQkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogQ2FsbCBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIuCi0JKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogR2V0IG91dCBxdWlja2x5IGlmIGNvdW50IGlzIHplcm8uCi0JQ2hlY2sgZXJyb3JzIGJldHRlci4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUHV0IC54ZGF0YSBzZWN0aW9uIGluIGRhdGEgc2VnbWVudC4KLQlDYWxsIGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMuICBEb24ndCBvdXRwdXQgcmVsb2NzIG9yCi0JZXh0ZXJuYWwgc3ltYm9scyBpZiBvdXRzeW1ib2xzIGlzIE5VTEwuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogQ29tcGxldGVseSByZXdyaXR0ZW4uCi0JKiBsaWJlY29mZi5oOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCByZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgotCShlY29mZl9kYXRhX3R5cGUpOiBBZGQgc3ltX2hhc2hlcyBhbmQgc3ltbmR4X3RvX3NlY3Rpb24gZmllbGRzLgotCShzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlKTogRGVmaW5lLgotCShlY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUgYXMgZnVuY3Rpb24sIG5vdCBtYWNyby4KLQkoZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzKTogQ2FsbCBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsLgotCSogYmZkLWluLmggKGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9ob3d0b190YWJsZSk6IE1hcmsgQlJBRERSIGFzCi0JcGFydGlhbF9pbnBsYWNlLCBhbmQgc2V0IHRoZSBzcmNfbWFzayB0byAweDFmZmZmZi4KLQkoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlIGdwX3dhcm5lZC4KLQkoYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIHJlbG9jYXRlX3NlY3Rpb24gZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9yZWZoaSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSByZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgotCi0JKiByZWxvYy5jIChfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogQ29ycmVjdGVkIHNpZ25lZCBvdmVyZmxvdwotCWNoZWNraW5nIHdoZW4gdGhlcmUgaXMgYW4gYWRkZW5kLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBEb24ndCBhYm9ydCB3aGVuIHRyeWluZyB0byBsaW5rCi0JYSBub24gYS5vdXQgZmlsZSwganVzdCBwYXNzIGl0IHRvIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBXaGVuIGRvaW5nIGEgZmluYWwgUEMgcmVsYXRpdmUgbGluawotCWFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgc3VidHJhY3QgdGhlIFZNQSBvZiB0aGUgaW5wdXQgc2VjdGlvbi4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0KLQkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBSZW5hbWVkIGZyb20KLQlfYmZkX2dlbmVyaWNfaW5kaXJlY3RfbGlua19vcmRlciBhbmQgbWFkZSBzdGF0aWMuCi0JKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogRG9uJ3Qgc3dpdGNoIG9uIGxpbmtfb3JkZXIgdHlwZSwganVzdAotCWNhbGwgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIuCi0JKF9iZmRfZGVmYXVsdF9saW5rX29yZGVyKTogSGFuZGxlIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyIHR5cGUuCi0JKiBnZW5saW5rLmg6IFJlbW92ZWQgZGVjbGFyYXRpb24gb2YKLQlfYmZkX2dlbmVyaWNfaW5kaXJlY3RfbGlua19vcmRlci4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IERvbid0IHN3aXRjaCBvbiBsaW5rX29yZGVyCi0JdHlwZSwganVzdCBjYWxsIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgotCi1UdWUgSmFuICA0IDIxOjIzOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBCYXNlIHRoZSBuYW1lIG9mCi0JdGhlIGNyZWF0ZWQgY29tbW9uIHNlY3Rpb24gb24gdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gdGhlIHN5bWJvbAotCWNhbWUgZnJvbS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiAoY2FzZSBCSUcpOiBBIGNvbW1vbiBzeW1ib2wKLQltdXN0IGhhdmUgYSBzZWN0aW9uLCBzbyBkb24ndCBib3RoZXIgdG8gY3JlYXRlIG9uZS4KLQotTW9uIEphbiAgMyAxNTozMjoxNiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKHZlYykpOiBBZGQgRFlOQU1JQyB0byBtYXNrIG9mIG9iamVjdCBmbGFncy4KLQkqIGFvdXRmMS5oIChOQU1FKGFvdXQsc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cykpOgotCUlmIHRoZSBEWU5BTUlDIGZsYWcgaXMgc2V0LCBzZXQgaXQgaW4gdGhlIGV4ZWMgaGVhZGVyLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBJZiB0aGUgb2JqZWN0IGlzCi0JZHluYW1pY2FsbHkgbGlua2VkLCBzZXQgdGhlIERZTkFNSUMgZmxhZyBpbiB0aGUgQkZELgotCSogbGliYW91dC5oIChOX1NFVF9EWU5BTUlDKTogTmV3IG1hY3JvLgotCShOX0RZTkFNSUMpOiBBZGQgbWlzc2luZyAwIGluIG1hc2suCi0KLU1vbiBKYW4gIDMgMTE6NDE6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9nZXRfZXh0cik6IERvbid0IG91dHB1dCBzZWN0aW9uIHN5bWJvbHMgYXMKLQlleHRlcm5hbCBzeW1ib2xzLgotCi0JKiBiZmQtaW4uaCwgaGFzaC5jOiBDaGFuZ2UgYmZkX2hhc2hfYWxsb2NhdGUgYXJndW1lbnQgZnJvbSBzaXplX3QKLQl0byB1bnNpZ25lZCBpbnQsIGJlY2F1c2Ugc2l6ZV90IG1heSBub3QgYmUgZGVmaW5lZCBpbiBiZmQuaC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogYmZkLWluLmggKGJmZF9nZXR7YixsfVtfc2lnbmVkX117MTYsMzIsNjR9KTogRGVjbGFyZSBhcmd1bWVudCB0bwotCWJlIGEgY29uc3QgcG9pbnRlci4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmJmZC5jIChiZmRfZ2V0e2IsbH1bX3NpZ25lZF9dezE2LDMyLDY0fSk6IERlY2xhcmUgYXJndW1lbnQgdG8KLQliZSBhIGNvbnN0IHBvaW50ZXIuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBDaGFuZ2Ugc3dhcCBmdW5jdGlvbiBwb2ludGVycwotCWFjY29yZGluZ2x5LgotCSogYXJjaGl2ZS5jIChkb19zbHVycF9jb2ZmX2FybWFwKTogQ2hhbmdlIHN3YXAgYWNjb3JkaW5nbHkuCi0JKiBhaXgzODYtY29yZS5jOiBDaGFuZ2UgTk9fR0VUIGFuZCBOT19HRVRTIGFjY29yZGluZ2x5LgotCSogaHBwYWJzZC1jb3JlLmMsIGhwdXgtY29yZS5jLCBpcml4LWNvcmUuYywgb3NmLWNvcmUuYywKLQlwdHJhY2UtY29yZS5jLCB0cmFkLWNvcmUuYzogQ2hhbmdlIE5PX0dFVCBhbmQgTk9fU0lHTkVEX0dFVAotCWFjY29yZGluZ2x5LgotCi0JKiBsaWJiZmQtaW4uaCAoc3RydWN0IGFydGRhdGEpOiBBZGRlZCB0ZGF0YSBmaWVsZC4KLQkoX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUpOiBEZWNsYXJlLgotCShfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyk6IERlY2xhcmUuCi0JKF9iZmRfc25hcmZfYXJfaGRyKTogUmVuYW1lZCBmcm9tIHNuYXJmX2FyX2hkci4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogYXJjaGl2ZS5jOiBDbGVhbmVkIHVwIHNvbWUgbW9yZS4KLQkoX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogSW5pdGlhbGl6ZQotCXBvaW50ZXIgZWxlbWVudHMgb2YgYXJ0ZGF0YS4KLQkoX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUpOiBSZW5hbWVkIGZyb20gYWRkX2JmZF90b19jYWNoZS4KLQkoX2JmZF9zbmFyZl9hcl9oZHIpOiBSZW5hbWVkIGZyb20gc25hcmZfYXJfaGRyLgotCShfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyk6IFJlbmFtZWQgZnJvbSBnZXRfZWx0X2F0X2ZpbGVwb3MuCi0JKGdldF9leHRlbmRlZF9hcmVsdF9maWxlbmFtZSwgYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlLAotCWJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtLCBjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IE1hZGUgc3RhdGljLgotCSogZWNvZmYuYzogU29tZSBjb21tZW50IGNoYW5nZXMuCi0JKGVjb2ZmX3NsdXJwX2FybWFwKTogSGFuZGxlIHJlbmFtZSBvZiBzbmFyZl9hcl9oZHIuICBTZXQKLQlhcmRhdGEtPnRkYXRhIHRvIHJhd19hcm1hcC4KLQkoZWNvZmZfYXJjaGl2ZV9wKTogSW5pdGlhbGl6ZSBwb2ludGVyIGVsZW1lbnRzIG9mIGFydGRhdGEuCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyk6IEhhbmRsZSByZW5hbWUgb2YKLQlhZGRfYmZkX3RvX2NhY2hlLgotCi0JKiBoYXNoLmM6IEFkZGVkIHNvbWUgZG9jdW1lbnRhdGlvbi4KLQotTW9uIEphbiAgMyAxMTowOToyOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCwgbmV0YnNkMzg2LmM6IFJlcGxhY2UgTk9fU1dBUF9NQUdJQyB3aXRoIFNXQVBfTUFHSUMsCi0JYW5kIGRvIHRoZSBzd2FwcGluZyBoZXJlIHJhdGhlciB0aGFuIGNhbGxpbmcgbnRvaGwgZnJvbSB0aGUgTl8qCi0JbWFjcm9zLiAgVGhpcyBjbGVhbnMgdXAgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHNpemUgb2YgYSBob3N0IGxvbmcsCi0JdGhlIGV4aXN0ZW5jZSB0byBudG9obCwgZXRjLgotCi1TYXQgSmFuICAxIDEzOjUwOjA1IDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIFZTVGEgbWljcm8ta2VybmVsLiBJdCBjdXJyZW50bHkgdXNlcwotCWkzODYtYW91dC4KLQotU2F0IEphbiAgMSAxMDoxODo1NCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZtYWNoMy5oIChIT1NUX1NFR01FTlRfU0laRSk6IEZpeCB2YWx1ZS4KLQkqIGkzODZtYWNoMy5jIChTRUdNRU5UX1NJWkUpOiBGaXggdmFsdWUuCi0KLUZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTE5MwotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL0NoYW5nZUxvZy05Njk3IGIvYmZkL0NoYW5nZUxvZy05Njk3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzIyYzhjLi4wMDAwMDAwCi0tLSBhL2JmZC9DaGFuZ2VMb2ctOTY5NworKysgL2Rldi9udWxsCkBAIC0xLDY3MTEgKzAsMCBAQAotVHVlIERlYyAzMCAxMjo0NToxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IElmIC1Cc3ltYm9saWMsIGRvbid0Ci0JYWxsb2NhdGUgc3BhY2UgZm9yIGEgUEMgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCB3aGljaCBpcwotCWRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCBkb24ndCBjb3B5IGEgUEMKLQlyZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYSByZWd1bGFyCi0JZmlsZS4KLQotTW9uIERlYyAyOSAxODowMjoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEpvbmF0aGFuIFN0b25lIDxqb25hdGhhbkBEU0cuU3RhbmZvcmQuRURVPjoKLQkqIGNvbmZpZy5iZmQgKG1pcHMtZGVjLW5ldGJzZCopOiBBZGQgRUNPRkYgdmVjdG9ycyB0bwotCXRhcmdfc2VsdmVjcy4KLQkobWlwcyplbC0qLW5ldGJzZCopOiBMaWtlIG1pcHMtZGVjLW5ldGJzZCouCi0JKG1pcHMqLSotbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0KLU1vbiBEZWMgMjkgMTc6MTM6MjggMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUub3JnKQotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IENoYW5nZSBlcnJvciBtZXNzYWdlCi0JZnJvbSAidW5kZWZpbmVkIHZlcnNpb24gbmFtZSIgdG8gInVuZGVmaW5lZCB2ZXJzaW9uZWQgc3ltYm9sCi0JbmFtZSIuCi0KLU1vbiBEZWMgMjkgMTE6NDE6MTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB0eXBvIGZyb20gcHJldmlvdXMKLQlkZWx0YS4KLQotVHVlIERlYyAyMyAxNzowMToxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFNldCAucmVsb2Mgc2VjdGlvbiB0byBiZQotCXNoYXJlZC4gIFNldCBzdGFiKiBzZWN0aW9ucyB0byBiZSBzaGFyZWQgYW5kIHJlYWQuICBTZXQgLnJzcmMKLQlzZWN0aW9uIHRvIGJlIHJlYWQgYW5kIHNoYXJlZC4KLQotTW9uIERlYyAyMiAxMzoyMDo1NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgZHdhcmYyLmxvLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGR3YXJmMi5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvZmYtYXJtLmM6IERvbid0IGluY2x1ZGUgb2JzdGFjay5oLgotCi1Nb24gRGVjIDIyIDEzOjA0OjMzIDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlnLmJmZCAoaVszNDU2XTg2Ki1nbzMyLXJ0ZW1zKik6IEZpeCB0byBiZSB0aGUgc2FtZSBhcwotCWlbMzQ1Nl04Ni1nbzMyLgotCi1UaHUgRGVjIDE4IDE2OjAxOjI1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB0byBnZXQgQFNIRUxMQCBzdWJzdGl0dXRlZC4KLQotV2VkIERlYyAxNyAwOTo0NTowOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogT25seSBsb29rIGF0IHNlY3Rpb24KLQlvd25lciBpZiB0aGVyZSBpcyBvbmUuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRmFpbCBpZiB0aGVyZSBpcyBub3QKLQllbm91Z2ggcm9vbSBmb3IgdGhlIHByb2dyYW0gaGVhZGVycy4KLQotVHVlIERlYyAxNiAwODowOTo1NiAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2FsbAotCV9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIGZpcnN0LgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogU2FtZS4KLQkqIGR3YXJmMi5jOiBOZXcgZmlsZTsgaW1wbGVtZW50IF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lLgotCi1Nb24gRGVjIDE1IDE2OjA4OjUyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmM6IEFkZCBiZmRfbWFjaF9tMzJyLgotCi1Nb24gRGVjIDE1IDE2OjExOjIyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChBTElHTl9TRUNUSU9OU19JTl9GSUxFKTogRGVmaW5lIGlmIEk5NjAgbm90IGRlZmluZWQuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVXNlIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKLQl0byBkZWNpZGUgd2hlbiB0byBhbGlnbiB0aGUgZmlsZSBzZWN0aW9ucyBmb3IgcGFnaW5nLgotCSogY29mZmNvZGUuaCAoQUxJR05fU0VDVElPTlNfSU5fRklMRSk6IFVuZGVmaW5lIGZvciBUSUM4MENPRkYuCi0KLU1vbiBEZWMgMTUgMTU6MDE6MTUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9vYmplY3RfcCk6IE5ldyBGdW5jdGlvbi4KLQkobTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6ICBOZXcgRnVuY3Rpb24uCi0JKG0zMnJfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogIE5ldyBGdW5jdGlvbi4KLQkobTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogIE5ldyBGdW5jdGlvbi4KLQkobTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6ICBOZXcgRnVuY3Rpb24uCi0JKG0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiAgTmV3IEZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9vYmplY3RfcCk6IFBvaW50IHRvIG0zMnJfb2JqZWN0X3AuCi0JKGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBQb2ludCB0bwotCW0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuCi0JKGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogUG9pbnQgdG8KLQltMzJyX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEuCi0JKGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IFBvaW50IHRvCi0JbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YS4KLQkoYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IFBvaW50IHRvCi0JbTMycl9lbGZfc2V0X3ByaXZhdGVfYmZkX2RhdGEuCi0JKGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IFBvaW50IHRvCi0JbTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YS4KLQotCi0JKiBiZmQtaW4yLmggKGJmZF9tYWNoX20zMnIpOiBBZGQgaWRlbnRpZmllciBmb3IgTTMyUiBhcmNoaXRlY3R1cmUKLQltYWNoaW5lcy4KLQotRnJpIERlYyAxMiAxMTozMDoyOCAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBPbmx5IGJ1aWxkIGxpYmJmZCBzaGFyZWQgaWYgLS1lbmFibGUtc2hhcmVkJ3MgdmFsdWUKLQl3YXMgYHllcycsIG9yIHdhcyBzZXQgdG8gYCpiZmQqJy4KLQkqIGFjbG9jYWwubTQ6IExpa2V3aXNlLgotCSogTk9URTogdGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgZml4ZWQgaW4gbGlidG9vbC9saWJ0b29sLm00LCB0aGUKLQlvcmlnaW5hbCBzb3VyY2Ugb2YgdGhpcyBiaXQgb2YgY29kZS4gIEl0J3Mgbm90IGNsZWFyIHdoYXQgdGhlIGJlc3QgZml4Ci0Jd291bGQgYmUsIHRob3VnaC4KLQotVGh1IERlYyAxMSAxNzo0ODoxMSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IEFsd2F5cyBpbml0IHVkYXRhLnAgc28KLQl0aGF0IHRoZSBnZW5lcmljIHJlbGF4YXRpb24gY29kZSBjYW4gZnVuY3Rpb24gd2hlbiBpbnB1dCBhbmQgb3V0cHV0Ci0JZmlsZSBmb3JtYXRzIGFyZSBtaXNtYXRjaGVkLgotCi1UaHUgRGVjIDExIDAxOjAyOjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEZvciBhIGxvYWRhYmxlCi0Jc2VjdGlvbiwgbWFrZSBzdXJlIHRoYXQgdGhlIGxvYWQgYWRkcmVzcyBpcyBjb3JyZWN0IHJlbGF0aXZlIHRvCi0JdGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgc2VnbWVudCBwbHVzIHRoZSBzaXplIG9mIHRoZSBzZWdtZW50IHNvCi0JZmFyLgotCi0JKiBjb2ZmY29kZS5oIChfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pOiBNYWtlIHN0YXRpYy4KLQkoX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KTogTGlrZXdpc2UuCi0KLVdlZCBEZWMgMTAgMjM6Mzc6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IEhhbmRsZSBhIHJlbG9jYXRlYWJsZSBsaW5rIGluCi0Jd2hpY2ggYSByZWxvY2F0aW9uIHJlZmVycyB0byBhbiBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbC4KLQotV2VkIERlYyAxMCAxMToxNTo1NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChiZmRfYXJtX2NvZmZfZmluYWxfbGluayk6IEZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGNvZmZfYXJtX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9hcm1fbGlua19vdXRwdXRfaGFzX2JlZ3VuKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBsaWJjb2ZmLmggKHN0cnVjdCBiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkczoKLQlfYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIGFuZAotCV9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQuICBBZGQgbmV3IG1hY3JvczoKLQliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4oKSBhbmQKLQliZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQoKS4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJbnNlcnQgY2FsbHMgdG8KLQliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4oKSBhbmQKLQliZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQoKS4KLQotCSogY29mZmNvZGUuaDogQWRkIHR3byBuZXcgZmllbGRzIHRvIGJmZF9jb2ZmX2JhY2tlbmRfZGF0YQotCXN0cnVjdHVyZTogX2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biBhbmQKLQlfYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0LiAgQWRkIGRlZmF1bHQgaW5pdGlhbGlzZXJzIGZvcgotCXRoZXNlIGZpZWxkcy4gIEFkZCBvdmVycmlkYWJsZSBhbGlhc2VzIGZvciB0aGUgY29mZiBzd2FwIGZ1bmN0aW9ucwotCWluIHRoZSBiYWNrZW5kIGRhdGEgc3RydWN0dXJlLgotCi0JKiBlbGYzMi12ODUwLmM6IFVwZGF0ZSB3aXRoIHBhdGNoZXMgZnJvbSB0aGUgYnJhbmNoIHRvIGZpeAotCUhJMTZfUy9MTzE2IHJlbG9jIHBhaXJzLgotCi1XZWQgRGVjIDEwIDE0OjA2OjQ4IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMzB2LmMgKGQzMHZfaW5mb190b19ob3d0b19yZWxhKTogTmV3IGZ1bmN0aW9uIHRvIHN1cHBvcnQKLQlSRUxBIHJlbG9jYXRpb25zLgotCShVU0VfUkVMKTogRG9uJ3QgZGVmaW5lIGFueSBtb3JlLCBzd2l0Y2ggdG8gdXNpbmcgUkVMQQotCXJlbG9jYXRpb25zLgotCShlbGZfaW5mb190b19ob3d0byk6IERlZmluZSBhcyBkMzB2X2luZm9fdG9faG93dG9fcmVsYS4KLQotVHVlIERlYyAgOSAxMTozNzo1MyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX21pcHMqKTogRGVmaW5lLgotCShiZmRfZGVmYXVsdF9zY2FuKTogRm9yIDMwMDAgYW5kIDQwMDAgcmVwbGFjZSBtYWdpYyBjb25zdGFudCB3aXRoCi0gCW1hY3JvLgotCi0JKiBjcHUtbWlwcy5jIChOKTogRGVmaW5lLgotCShiZmRfbWlwc19hcmNoLCBhcmNoX2luZm9fc3RydWN0KTogUmUtd3JpdGUgdXNpbmcgbWFjcm8gTiwgcmVwbGFjZQotIAludW1iZXJzIHdpdGggYmZkX21hY2hfbWlwcyogbWFjcm9zLgotCi1GcmkgRGVjICA1IDExOjEzOjQ2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2MsIHY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuLAotCXY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggcmVsb2MgYWRkZW5kIGhhbmRsaW5nLgotCSh2ODUwX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24sIHY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nLAotCXY4NTBfZWxmX2FkZF9zeW1ib2xfaG9vaywgdjg1MF9lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2ssCi0Jdjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIsIHY4NTBfZWxmX2Zha2Vfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb25zCi0JdG8gY3JlYXRlIGFuZCBoYW5kbGUgc3BlY2lhbCBjb21tb24gc2VjdGlvbnMuCi0JKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBGaXggSEkxNiBhbmQgSEkxNl9TIHJlbG9jYXRpb25zCi0Jd2hpY2ggaGF2ZSBkYXRhIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb25zLgotCi1UdWUgRGVjICAyIDEwOjI2OjE2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogUmV2ZXJ0IGJhY2sgdG8gJ18nCi0JKFVTRVJfTEFCRUxfUFJFRklYKTogUmV2ZXJ0IGJhY2sgdG8gJ18nCi0KLQkqIGNvbmZpZy5iZmQgKHRhcmdfY3B1KTogQWRkIHN1cHBvcnQgZm9yIFRodW1iIHRhcmdldC4KLQotTW9uIERlYyAgMSAyMDoyNDoxOCAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvZmYtc2guYyAoc2hfY29mZl9ob3d0b3MpOiBBZGQgUl9TSF9TV0lUQ0g4IGVudHJ5LgotCShnZXRfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIFJfU0hfU1dJVENIOC4KLQkoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogTGlrZXdpc2UuCi0KLVdlZCBOb3YgMjYgMTQ6MTM6MzQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBDaGFuZ2VkIHRvIG1hdGNoIGRlZmluaXRpb24gaW4KLQlnY2MvY29uZmlnL2FybS9zZW1pLmgKLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBZGQgQVJNIGFuZCBUaHVtYiBzeW1ib2wKLQljbGFzc2VzLgotCi1TdW4gTm92IDIzIDE2OjAyOjU4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogZnJlZWJzZC5oIChTV0FQX01BR0lDKTogUmVhZCBtYWdpYyBudW1iZXIgbGl0dGxlIGFuZCBub3QgYmlnCi0gCWVuZGlhbi4KLQotV2VkIE5vdiAyNiAwOTozMDozNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBPbmx5IHNldCBwcml2YXRlIGZsYWdzIGZvciBub24KLQlQRSBBUk0gcG9ydHMuCi0KLVR1ZSBOb3YgMjUgMTU6MzM6MjMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEFsc28gaWdub3JlIE5FVkVSX0xPQUQKLQlzZWN0aW9ucy4KLQotVHVlIE5vdiAyNSAxMDo1NTozNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERvIG5vdAotCWNvbXBsYWluIGlmIGlub3V0IGFuZCBvdXRwdXQgZm9ybWF0cyBkaWZmZXIuCi0KLVR1ZSBOb3YgMjUgMTE6MjY6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgdGVraGV4LmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBSZW1vdmUgdGVraGV4LmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgc3JjL01ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggY3VycmVudAotCWF1dG9tYWtlIGFuZCBhdXRvY29uZi4KLQotCSogY29mZi1hcm0uYyAoYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyk6IEZpeCB0eXBvCi0JKENPRkZfV0lUSF9QUiB0byBDT0ZGX1dJVEhfUEUpLgotCi1Nb24gTm92IDI0IDE1OjQ3OjQ5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IE1ha2UgdmFyaWFibGVzIGFuZCBzb21lIGZ1bmN0aW9ucyBzdGF0aWMsIHNvIHRoYXQKLQl0aGlzIGZpbGUgY2FuIGJlIGluY2x1ZGVkIGluIG11bHRpcGxlIG9iamVjdCBmaWxlcy4KLQkoY29mZl9hcm1fYmZkX2ZpbmFsX2xpbmspOiBGaXggbWlub3IgYnVnLgotCi1TYXQgTm92IDIyIDE1OjE2OjAwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciBQSUMgYW5kIEFQQ1MtRkxPQVQgdHlwZSBiaW5hcmllcy4KLQotCSogY29mZmNvZGUuaDogQWRkIHN1cHBvcnQgZm9yIFBJQyBhbmQgQVBDUy1GTE9BVCB0eXBlIGJpbmFyaWVzLgotCi1TYXQgTm92IDIyIDE2OjA2OjU2IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBldmF4LWVtaC5jIChfYmZkX2V2YXhfd3JpdGVfZW1oKTogVXNlIGFsbG9jYSBpbnN0ZWFkIG9mIHN0cmR1cC4KLQotU2F0IE5vdiAyMiAxMjoyOTozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogV2hlbiBvdmVycmlkaW5nIGEgZGVmaW5lZAotCXN5bWJvbCwgc2V0IGl0IHRvIHVuZGVmaW5lZCwgbm90IG5ldy4KLQotCSogZWxmMzItc2guYyAoc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IERvbid0IGtpbGwgTEFCRUwKLQlyZWxvY3MuCi0KLUZyaSBOb3YgMjEgMTQ6MTQ6MjIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxheF9zZWN0aW9uKTogRm9yY2Ugc2lnbiBleHRlbnRpb24gb2YgVVNFUyByX29mZnNldC4KLQkoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogRG9uJ3Qga2lsbCBMQUJFTCByZWxvY3MuCi0KLU1vbiBOb3YgMTcgMTU6MDg6MzggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkpOiBGaXggdHlwby4KLQkobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgotCi1TYXQgTm92IDE1IDE1OjM2OjA3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogQ2FzdCBzZWNvbmQgYXJnIG9mCi0JYmZkX2hfZ2V0XyogY2FsbHMgdG8gImJmZF9ieXRlICoiLgotCi1UdWUgTm92IDExIDEwOjM3OjIzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBuZXcgZmllbGQKLQkibW92bV9zdGFja19zaXplIi4KLQkobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEluY2x1ZGUgc3RhY2sgc3BhY2UgZm9yIHJlZ2lzdGVyIHNhdmVzCi0JaW4gdGhlIGltbTggZmllbGQgb2YgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uCi0JKGNvbXB1dGVfZnVuY3Rpb25faW5mbyk6IERldGVybWluZSBob3cgbXVjaCBzdGFjayBpcyBhbGxvY2F0ZWQgYnkKLQl0aGUgbW92bSBpbnN0cnVjdGlvbi4gIEZpeCB0eXBvLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBtb3ZtX3N0YWNrX3NpemUuCi0KLU1vbiBOb3YgMTAgMTQ6MzI6NDAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBEb24ndCBjcmFzaCBpZgotCWEgdmVyc2lvbiBkZXBlbmRlbmN5IGNvdWxkIG5vdCBiZSBmb3VuZC4KLQotVHVlIE5vdiAgNCAxMjowNTo1NiAxOTk3ICBLbGF1cyBLImFtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlndXJlLmNvbTogR2V0IHZlcnNpb24gaW5mbyBmcm9tIGNvbmZpZ3VyZS5pbgotCi1GcmkgT2N0IDI0IDExOjE1OjU4IDE5OTcgIEpha3ViIEplbGluZWsgIDxqakBzdW5zaXRlLm1mZi5jdW5pLmN6PgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKToKLQlOZXcgZnVuY3Rpb24uIEF2b2lkIG1peGluZyBVUzEgYW5kIEhBTCBSMSBjb2RlLgotCVNldCByZXN1bHRpbmcgbWVtb3J5IG9yZGVyaW5nIHRvIHRoZSBzdHJvbmdlc3Qgb25lIHVzZWQuCi0JKHNwYXJjNjRfZWxmX29iamVjdF9wKTogU2V0IGJmZF9tYWNoIGNvcnJlY3RseS4KLQotVGh1IE9jdCAyMyAxNDowOTozMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IEFkZCBVQTY0ICYgVUExNi4KLQkoc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzKTogSGFuZGxlIHRoZW0uCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4gIEJlZm9yZSBlbWl0dGluZyBhIGR5biByZWxvYywKLQljaGVjayBhbGlnbm1lbnQgYW5kIHRyYW5zbXV0ZSBSX1NQQVJDX3g8LT5SX1NQQVJDX1VBeC4KLQotVGh1IE9jdCAyMyAwMDo1MzoxNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzcGFyYyotKi1saW51eCopOiBVc2UgdHJhZC1jb3JlIGFuZCAuLi4KLQkqIGhvc3RzL3NwYXJjbGludXguaDogTmV3IGZpbGUuCi0KLVRodSBPY3QgMjMgMDA6MjU6MjkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAZG90LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHNwYXJjNjQtKi1saW51eCopOiBOZXcgdGFyZ2V0LgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIHBsdF9hbGlnbm1lbnQgbWVtYmVyLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBTZXQgLmdvdCBhbGlnbm1lbnQgYmFzZWQKLQlvbiBhcmNoX3NpemUuCi0JKF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UgZm9yIC5yZWwqIHNlY3Rpb25zLgotCVNldCAucGx0IGFsaWdubWVudCBmcm9tIG5ldyBwbHRfYWxpZ25tZW50LgotCSogZWxmbGluay5oIChlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFNldCB2ZXJzaW9uIHNlY3Rpb24KLQlhbGlnbm1lbnQgdG8gTE9HX0ZJTEVfQUxJR04uCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudCk6IFByb3ZpZGUgZGVmYXVsdC4KLQkoZWxmWFhfYmVkKTogSW5pdCBwbHRfYWxpZ25tZW50LgotCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9jaGVja19yZWxvY3MsCi0Jc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLCBzcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMsCi0Jc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmluZHgsIHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCwKLQlzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbnMuCi0JKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogRml4IGEgZmV3IG5hbWUgc3RyaW5ncy4KLQkoRUxGX0RZTkFNSUNfSU5URVJQUkVURVIpOiBOZXcgZGVmaW5pdGlvbi4KLQkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBzaGFyZWQgbGlicmFyaWVzLgotCi0JKiBlbGY2NC1zcGFyYy5jIChzdHJ1Y3QgcGx0X3RlbXBsYXRlLCBwbHRfKl9oZWFkZXIsIHBsdF8qX2VudHJ5LAotCXNwYXJjNjRfZWxmX2J1aWxkX3BsdF9lbnRyeSwgc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKToKLQlQTFQgZGVmaW5pdGlvbnMgc3BhcmM2NC1saW51eCBvcmlnaW5hbGx5IGNob29zZS4gIFRoZXNlIHdpbGwgZ28KLQlhd2F5IHNvb24gaW4gZmF2b3VyIG9mIHRoZSBvZmZpY2lhbCBhYmkgZGVmaW5pdGlvbnMuCi0KLVdlZCBPY3QgMjIgMTY6MDg6NDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKGNvZmZfc21hbGxfb2JqZWN0X3ApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3NtYWxsX25ld19zZWN0aW9uX2hvb2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlKTogTmV3IHN0YXRpYyBjb25zdCBzdHJ1Y3R1cmUuCi0JKGNvZmZfc21hbGxfY2xvc2VfYW5kX2NsZWFudXApOiBEZWZpbmUuCi0JKGNvZmZfc21hbGxfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEZWZpbmUuCi0JKGNvZmZfc21hbGxfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUuCi0JKGNvZmZfc21hbGxfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KTogRGVmaW5lLgotCShzaGNvZmZfc21hbGxfdmVjKTogTmV3IHN0YXRpYyBzdHJ1Y3R1cmUuCi0JKHNobGNvZmZfc21hbGxfdmVjKTogTmV3IHN0YXRpYyBzdHJ1Y3R1cmUuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHNoY29mZl9zbWFsbF92ZWMgYW5kCi0Jc2hsY29mZl9zbWFsbF92ZWMuCi0JKiBjb25maWcuYmZkIChzaC0qLWVsZiopOiBBZGQgc2hjb2ZmX3NtYWxsX3ZlYyBhbmQKLQlzaGxjb2ZmX3NtYWxsX3ZlYyB0byB0YXJnX3NlbHZlY3MuCi0JKHNoLSotKik6IExpa2V3aXNlLgotCSogY29uZmlndXJlLmluOiBBZGQgc2hjb2ZmX3NtYWxsX3ZlYyBhbmQgc2hsY29mZl9zbWFsbF92ZWMgY2FzZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBPY3QgMjAgMTU6MDE6MjcgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGV2YXgtZWdzZC5jOiBXZWFrIHN5bWJvbHMgYXJlIGdsb2JhbC4KLQotCSogZXZheC1lbWguYzogVXNlIHByb3BlciBjYXN0cy4KLQotCSogZXZheC1lZ3NkLmMgKF9iZmRfZXZheF93cml0ZV9lZ3NkKTogUmVtb3ZlIHVubmVlZGVkIHVuYW1lLgotCi0JKiBldmF4LWVnc2QuYzogU2VjdGlvbiBuYW1lcyBhbmQgc3ltYm9scyBoYXZlIGRpZmZlcmVudAotCWxlbmd0aCByZXN0cmljdGlvbnMuIEFkZCBsZW5ndGggcGFyYW1ldGVyIHRvCi0JX2JmZF9ldmF4X2xlbmd0aF9oYXNoX3N5bWJvbC4KLQkqIGV2YXgtZXRpci5jOiBMaWtld2lzZS4KLQkqIGV2YXgtbWlzYy5jIChfYmZkX2V2YXhfbGVuZ3RoX2hhc2hfc3ltYm9sKTogQWRkIGxlbmd0aAotCXBhcmFtZXRlci4KLQkqIGV2YXguaCAoRU9CSl9TX0NfU0VDU0laKTogRGVmaW5lLgotCi0JKiBldmF4LWFscGhhLmM6IFJlbW92ZSBkdXBsaWNhdGUgdGVzdC4KLQotCSogZXZheC1lbWguYzogU1lTJCBmdW5jdGlvbnMgYXJlIHVwcGVyLWNhc2UuCi0KLQkqIGV2YXgtZWdzZC5jOiBDcmVhdGUgc2VwYXJhdGUgc2VjdGlvbnMgZm9yIGNvbW1vbiBzeW1ib2xzLgotCSogZXZheC1ldGlyLmM6IERvbid0IG91dHB1dCBjb21tb24gc2VjdGlvbi4KLQkqIGV2YXguaDogQnVtcCB1cCBzZWN0aW9uIGNvdW50LgotCi0JKiBjb25maWd1cmUuY29tOiBVc2UgNjRiaXQgaW50ZWdlcnMgd2l0aCBERUMgQy4KLQotCSogZXZheC1lZ3NkLmM6IE1ha2Ugc2VjdGlvbiBmbGFncyBkZWMgYyBjb21wYXRpYmxlLgotCi1Nb24gT2N0IDIwIDA5OjM4OjMxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKG5vcm1hbGl6ZSk6IERlbGV0ZSBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBOZXcgcGFyYW1ldGVyIGVsZW5ndGguICBBbGwgY2FsbGVycwotCWNoYW5nZWQuICBVc2UgcGFzc2VkIGluIGVsZW5ndGggdG8gZGV0ZXJtaW5lIHNpemUgb2YgdGhlIGV4dGVuZGVkCi0JbmFtZSB0YWJsZSBpbnN0ZWFkIG9mIGNvbXB1dGluZyBpdCBhZ2Fpbi4KLQotU3VuIE9jdCAxOSAyMzozNjoyMSAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBVc2UgfD0gbm90ID0gdG8gc2V0Ci0JSU1BR0VfU0NOX01FTV9SRUFEIGZvciBhbiB1bnJlY29nbml6ZWQgc2VjdGlvbi4KLQotU3VuIE9jdCAxOSAyMTowNDo1NiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IEFjY291bnQgZm9yIHRyYWlsaW5nCi0JJy8nIGluIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLgotCi1GcmkgT2N0IDE3IDAwOjA0OjEzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogRm9yIGV4cGxpY2l0bHkgdmVyc2lvbmVkCi0Jc3ltYm9scywgY2hlY2sgZ2xvYmFscyBsaXN0IGJlZm9yZSBtYXRjaGluZyBvbiBsb2NhbHMuCi0KLVRodSBPY3QgMTYgMDg6MTc6MDYgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQscGVfcHJpbnRfaWRhdGEpOiBGaXggbWFuZ2xlZAotCXBhdGNoLgotCi1XZWQgT2N0IDE1IDEzOjQ1OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9ta29iamVjdF9ob29rKTogU2V0IERMTCBmbGFnLgotCShwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBETEwgZmxhZy4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFNldCBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFCi0JZm9yIC5zdGFiKiBzZWN0aW9ucy4gIFJlcGxhY2Ugc3RybGVuIG9mIGNvbnN0YW50IHN0cmluZ3Mgd2l0aAotCW51bWJlci4KLQotVHVlIE9jdCAxNCAxNTo0Mjo0NSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9tZXJnZV9pbmRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiB0bwotCW1lcmdlIGdvdCBhbmQgcmVsb2MgZW50cmllcyBmcm9tIGluZCBzeW1zIHRvIHRoZWlyIHRhcmdldC4KLQkoZWxmNjRfYWxwaGFfYWx3YXlzX3NpemVfc2VjdGlvbnMpOiBDYWxsIGl0LgotCShlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MpOiBPcGVyYXRlIG9uIHRoZSB0YXJnZXQgb2YgaW5kaXJlY3Qgc3ltYm9scy4KLQkoZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMpOiBMaWtld2lzZS4KLQkoZWxmNjRfYWxwaGFfbWVyZ2VfZ290cyk6IExpa2V3aXNlLgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogQmFjayBvdXQgSEoncyBjaGFuZ2UsCi0JYXMgaXQgaXMgaW5zdWZmaWNpZW50IHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbiBjaGFuZ2VzIGFzIHdlbGwuCi0KLU1vbiBPY3QgMTMgMjM6MTA6MDggMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBBbGxvdyBmb3IgUkVMQVRJVkUKLQlyZWxvY3MgZm9yIHN5bWJvbHMgaW4gc2hsaWJzIHRoYXQgaGF2ZSBiZWVuIGZvcmNlZCBsb2NhbC4KLQkoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IE91dHB1dCBSRUxBVElWRXMgaW4gLmdvdCBmb3Igc2FtZS4KLQotTW9uIE9jdCAxMyAyMToyNDowNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlIHRoZQotCWdvdF9lbnRpZXMgb2YgdGhlIGRlZmF1bHQgc3ltYm9sIGZvciB0aGUgZGVmYXVsdCB2ZXJzaW9uZWQKLQlzeW1ib2wuICBQYXRjaCBmcm9tIGhqbEBnbnUuYWkubWl0LmVkdSwgbW9kaWZpZWQgbm90IHRvIHVzZQotCWFsbG9jYSBpbiB0aGUgbG9vcC4KLQotTW9uIE9jdCAxMyAxNzozNzozNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBPbmx5IHVzZSB0aGUgYm90dG9tCi0JMjQgYml0cyBvZiB0aGUgUEMgd2hlbiBjb21wdXRpbmcgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLgotCi1GcmkgT2N0IDEwIDE2OjAxOjMwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2MsIHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOgotCUNvcnJlY3QgdmFsdWUgZm9yIG1heGltdW0gcG9zaXRpdmUgMjIgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uCi0JKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUHJldmVudCBvdmVyZmxvdyBmcm9tIEhJMTZfUyBhbmQKLQlISV8xNiByZWxvY2F0aW9ucy4gIENvcnJlY3QgYml0IGFkanVzdG1lbnQgaW4gVERBIG9mZnNldHMuCi0KLVRodSBPY3QgIDkgMTY6NDM6MzkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmNfZWxmX3toaXgyMixsb3gxMH1fcmVsb2MpOiBOZXcgZnVuY3Rpb25zLgotCShzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IFVzZSB0aGVtIGZvciBISVgyMixMT1gxMCByZWxvY3MuCi0KLVdlZCBPY3QgIDggMTE6Mzg6NDUgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmY29yZS5oIChiZmRfcHJzdGF0dXMpOiBQZWRhbnRpY2x5LCBhbGlnbm1lbnRfcG93ZXIgc2hvdWxkCi0JYmUgTE9HX0ZJTEVfQUxJR04uCi0KLVdlZCBPY3QgIDggMTE6MzY6MDAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogTWlzc2VkIG9uZSBhbHBoYSogY2hhbmdlLgotCi1UdWUgT2N0ICA3IDEzOjAwOjE3IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogUmVtb3ZlIEJGRDY0IHN1cHBvcnQuCi0JKiBlbGY2NC1zcGFyYy5jIChTUEFSQzY0X09MRF9SRUxPQ1MpOiBVbmRlZi4KLQkoTUlOVVNfT05FKTogTmV3IG1hY3JvLgotCShzcGFyY19lbGZfbm90c3VwX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IEFkZCBlbnRyaWVzIGZvciBESVNQNjQsUExUNjQsSElYMjIsTE9YMTAsCi0JSDQ0LE00NCxMNDQsUkVHSVNURVIuCi0JKHNwYXJjX3JlbG9jX21hcCk6IExpa2V3aXNlLiAgTWFwIEJGRF9SRUxPQ19DVE9SIHRvIFJfU1BBUkNfNjQuCi0JKGluaXRfaW5zbl9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MpOiBVc2UgaXQuCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgZW50cmllcyBmb3IgT0xPMTAsSElYMjIsTE9YMTAuCi0KLVR1ZSBPY3QgIDcgMTE6NDA6MzcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzb20uYyAoc29tX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogUmVtb3ZlIHN0YXRpYwotCWZ1bmN0aW9uLCBhbmQgZGVmaW5lIGFzIG1hY3JvIGluc3RlYWQuCi0KLUZyaSBPY3QgIDMgMTQ6MDI6MTcgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQ2hhbmdlIGFscGhhLSotKiB0byBhbHBoYSotKi0qOyBjb25maWcuZ3Vlc3Mgbm93Ci0JcmVjb2duaXplcyBhbHBoYWV2NSBldGMuCi0JKiBjb25maWd1cmUuaG9zdDogTGlrZXdpc2UuCi0KLUZyaSBPY3QgIDMgMTE6MjM6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JTWFrZSBsZCAtcyB3b3JrIG9uIEFJWDoKLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgY3JlYXRlIHRoZSAuZGVidWcKLQlzZWN0aW9uIGlmIHdlIGFyZSBzdHJpcHBpbmcuCi0JKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQgdGhlIC5kZWJ1ZyBzZWN0aW9uCi0Jc2l6ZSBpZiB3ZSBhcmUgc3RyaXBwaW5nLgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IFNFQ19SRUxPQyBvciByZWxfZmlsZXBvcywKLQlhbmQgZG9uJ3Qgd3JpdGUgb3V0IHJlbG9jcywgaWYgd2UgYXJlIHN0cmlwcGluZy4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBzZXQgdXAgcmVsb2MgaWYgd2UgYXJlIHN0cmlwcGluZy4KLQkoeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IERvbid0IHdyaXRlIG91dCBzeW1ib2wgb3IgcmVsb2MgaWYgd2UKLQlhcmUgc3RyaXBwaW5nLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGluY2x1ZGUgZWxmLmxvIGFnYWluIGZvciBFTEYgdGFyZ2V0czsgaXQncwotCWFsd2F5cyBpbiB0aGUgbGlicmFyeSBhbnlob3cuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogZWxmMzItc3BhcmMuYyAoc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MpOiBDYXN0IHRvIGJmZF9ieXRlICosIG5vdAotCWNoYXIgKiwgd2hlbiBjYWxsaW5nIGJmZF9nZXRfMzIgYW5kIGJmZF9wdXRfMzIuCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogQ2FzdCBjb250ZW50cyB0byBjaGFyICoKLQl3aGVuIGNhbGxpbmcgc3RyY3B5LgotCi1UaHUgT2N0ICAyIDE2OjE1OjUwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9jaGVja19vdmVyZmxvdyk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiwgYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IFVzZSBpdC4KLQkoQkZEX1JFTE9DX1NQQVJDX3tESVNQNjQsUExUNjR9KTogTmV3IHJlbG9jcy4KLQkoQkZEX1JFTE9DX1NQQVJDX3tISVgyMixMT1gxMCxINDQsTTQ0LEw0NCxSRUdJU1RFUn0pOiBOZXcgcmVsb2NzLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLVRodSBPY3QgIDIgMTM6MTc6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogU2V0IElNQUdFX1NDTl9NRU1fUkVBRCBmb3IgYW4KLQl1bnJlY29nbml6ZWQgc2VjdGlvbi4gIEZyb20gSm9uIFRoYWNrcmF5IDxqb250QGhhcmxlcXVpbi5jby51az4uCi0KLVdlZCBPY3QgIDEgMTQ6MDM6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoJChCRkRfSCkpOiBDaGFuZ2Ugc3RtcC1iZmQuaCB0byBzdG1wLWJmZC1oLgotIAkoc3RtcC1iZmQtaCk6IFJlbmFtZSBmcm9tIHN0bXAtYmZkLmguCi0gCShCRkRfSF9GSUxFUywgTElCQkZEX0hfRklMRVMsIExJQkNPRkZfSF9GSUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKCQoc3JjZGlyKS9iZmQtaW4yLmgpOiBKdXN0IGRlcGVuZCB1cG9uIHN0bXAtYmluMi1oLgotCShzdG1wLWJpbjItaCk6IE5ldyB0YXJnZXQuCi0JKCQoc3JjZGlyKS9saWJiZmQuaCk6IEp1c3QgZGVwZW5kIHVwb24gc3RtcC1sYmZkLWguCi0JKHN0bXAtbGJmZC1oKTogTmV3IHRhcmdldC4KLQkoJChzcmNkaXIpL2xpYmNvZmYuaCk6IEp1c3QgZGVwZW5kIHVwb24gc3RtcC1sY29mZi1oLgotCShzdG1wLWxjb2ZmLWgpOiBOZXcgdGFyZ2V0LgotCShDTEVBTkZJTEVTKTogQ2hhbmdlIHN0bXAtYmZkLmggdG8gc3RtcC1iZmQtaC4gIEFkZCBzdG1wLWJpbjIuaCwKLQlzdG1wLWxiZmQtaCwgYW5kIHN0bXAtbGNvZmYtaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBhIGRpdmVyc2lvbiB0byBzZXQgZW5hYmxlX3NoYXJlZCBiZWZvcmUgdGhlCi0JYXJndW1lbnRzIGFyZSBwYXJzZWQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBTZXAgMzAgMTQ6MTg6MzIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSX1NQQVJDX0dMT0JfSk1QCi0JcmVuYW1lZCB0byBSX1NQQVJDX1VOVVNFRF80Mi4KLQkoc3BhcmNfcmVsb2NfbWFwKTogRGVsZXRlIFJfU1BBUkNfR0xPQl9KTVAgZW50cnkuCi0JKiBlbGY2NC1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJfU1BBUkNfR0xPQl9KTVAKLQlyZW5hbWVkIHRvIFJfU1BBUkNfVU5VU0VEXzQyLgotCShzcGFyY19yZWxvY19tYXApOiBEZWxldGUgUl9TUEFSQ19HTE9CX0pNUCBlbnRyeS4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19TUEFSQ19HTE9CX0pNUCk6IERlbGV0ZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBTZXAgMjUgMTI6MTU6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBEb24ndCBjaGVjayB0aGUgaGFzaCBjcmVhdG9yIHVudGlsCi0JYWZ0ZXIgd2UgaGF2ZSBzZXQgKnN5bV9oYXNoLgotCi1XZWQgU2VwIDI0IDE2OjUyOjI4IDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlnLmJmZCAoc2gqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBzaC0qLSplbGYqLgotCi1XZWQgU2VwIDI0IDExOjI3OjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmJmZF9hX1NPVVJDRVMpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NIRUNLX1RPT0wgYmVmb3JlIEFNX1BST0dfTElCVE9PTC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIFNlcCAyMyAxOTowMzoxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBFdmVuIGlmIHdlIGFyZSBub3QgZGVtYW5kCi0JcGFnZWQsIGRvbid0IHB1dCBhIGxvYWRhYmxlIHNlY3Rpb24gYWZ0ZXIgYSBub25sb2FkYWJsZSBzZWN0aW9uLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSW5jcmVtZW50IHRoZSBmaWxlIG9mZnNldAotCWZvciBhIHNlY3Rpb24gd2l0aCBjb250ZW50cywgZXZlbiBpZiBpdCBpcyBub3QgbG9hZGFibGUuCi0KLVN1biBTZXAgMjEgMTE6MDM6MjQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogQWRkIHJldHVybiBjb2RlCi0JaW5kaWNhdGluZyB0aGF0IF9fY3RicCBjb3VsZCBub3QgYmUgZm91bmQuCi0KLVRodSBTZXAgMTggMTU6MDQ6NTcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9jaGVja19yZWxvY3MpOiBJbXByb3ZlIGVycm9yIG1lc3NhZ2UuCi0KLVdlZCBTZXAgMTcgMDk6NTQ6NTEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlLCB2ODUwX2VsZl9yZWxvYywKLQl2ODUwX2VsZl9jaGVja19yZWxvY3MsIHY4NTBfZWxmX3JlbG9jX21hcCwgdjg1MF9lbGZfaG93dG9fdGFibGUpOgotCUFkZCBzdXBwb3J0IGZvciB0aGUgQ0FMTFQgcmVsb2NzLgotCi0JKiByZWxvYy5jIChDT01NRU5UKTogQWRkIEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQgYW5kCi0JQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBBZGQgY2hlY2tzIHRvIGNhdGNoCi0JcmVsb2NhdGlvbnMgYWdhaW5zdCBub24tZXhpc3RhbnQgc3ltYm9scy4KLQotVHVlIFNlcCAxNiAxNDoyMDoyNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBBZGQgQkZSX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVC4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvYywgdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSwKLQl2ODUwX2VsZl9ob3d0b190YWJsZSwgdjg1MF9lbGZfcmVsb2NfbWFwKTogQWRkIHN1cHBvcnQgZm9yIGEgMTYKLQliaXQgcmVsb2MgaW4gdGhlIHRpbnkgZGF0YSBhcmVhLgotCi1Nb24gU2VwIDE1IDExOjI3OjM2IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTWVyZ2VkIGNoYW5nZXMgZnJvbSBNYXJ0aW4gSHVudDoKLQotCSogZWxmMzItZDMwdi5jIChiZmRfZWxmX2QzMHZfcmVsb2MpOiBDaGFuZ2UgcGMtcmVsYXRpdmUgcmVsb2NzCi0Jb3ZlciAyXjMyIGJ5dGVzIHRvIGJlIGFic29sdXRlLiAgTmVlZGVkIGJlY2F1c2UgRDMwViBQQyBkb2Vzbid0Ci0JbmVjZXNzYXJpbHkgd3JhcC4KLQotCSogcmVsb2MuYywgZWxmMzItZDMwdi5jIChCRkRfUkVMT0NfRDMwVl85X1BDUkVMLAotCUJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUik6IE5ldyByZWxvY3MuCi0KLQkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jXzIxKTogTmV3IGZ1bmN0aW9uLgotCURvIDE1IGFuZCAyMSBiaXQgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SLCBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SKToKLQlOZXcgcmVsb2NhdGlvbnMuCi0KLQkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jKTogQWRkZW5kIG5lZWRzIHRvIGJlCi0JYWRkZWQgdG8gdGhlIHJlbG9jYXRpb24sIG5vdCBvcidkLgotCi1XZWQgU2VwIDEwIDE1OjE3OjI1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2MpOiBSZW1vdmUgc3B1cmlvdXMgZXJyb3IgbWVzc2FnZS4KLQotV2VkIFNlcCAxMCAxMToxNzo1MCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X3NjYW4pOiBVc2Ugc3RyY2FzZWNtcC4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IFRlc3QgZm9yIG1hdGNoIHdpdGggYXJjaF9uYW1lICsgIjoiICsKLSAJcHJpbnRhYmxlX25hbWUuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBUZXN0IGZvciBtYXRjaCB3aXRoIHByaW50YWJsZV9uYW1lIC0gIjoiLgotCShiZmRfZGVmYXVsdF9zY2FuKTogRGVsZXRlIHc2NSwgaDgzMDAsIGg4NTAwLCB6OGssIGk5NjAgc3BlY2lhbAotIAljYXNlcy4gIEVhY2ggaW1wbGVtZW50cyB0aGVpciBvd24gc2NhbiBmdW5jdGlvbi4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IERlbGV0ZSAzODYsIDI5MDAsIDg2MCwgbWlwcyAyMDAwLCBtaXBzIDQ0MDAKLSAJc3BlY2lhbCBjYXNlcy4gIFNpbmNlIGluZm8tPm1hY2ggPT0gMC4gIFRoZSB0ZXN0IG1hY2ggPT0gbnVtYmVyCi0gCWZhaWxzLgotCShiZmRfYXJjaF9saXN0KTogTmV3IGZ1bmN0aW9uLCByZXR1cm4gbmFtZSBvZiBhbGwgdGhlIHN1cHBvcnRlZAotIAlhcmNoaXRlY3R1cmVzLgotCi1UdWUgU2VwICA5IDEwOjIxOjU2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEJyZWFrIGFmdGVyCi0JZGVjb2RpbmcgYXJjaGl0ZWN0dXJlLgotCSh2ODUwX2VsZl9yZWxvYyk6IERvIG5vdCBjb21wbGFpbiBpZiBhIFJfVjg1MF9MTzE2IHJlbG9jIGhhcyBiaXQKLQkxNSBzZXQuCi0KLVN1biBTZXAgIDcgMTI6MjU6MjIgMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUuYWkubWl0LmVkdSkKLQotCSogYmZkL2VsZjY0LWFscGhhLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBGaXggdGhlIGhvd3RvIHRhYmxlLgotCi1UaHUgU2VwICA0IDA5OjQ0OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBjcHUtdjg1MC5jLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGVsZjMyLXY4NTAuYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiByZWxvYy5jOiBSZW1vdmUgZXh0cmFuZW91cyBjb21tYXMgZnJvbSByZWxvY2F0aW9uIGVudHJpZXMuCi0JUmVtb3ZlIEJGRF9SRUxPQ19WODUwXzE2X1BDUkVMLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFB1dCBYVFlfQ00vWE1DX1REIHN5bWJvbHMKLQlpbiBzZWN0aW9ucyBuYW1lZCAudG9jYnNzIHJhdGhlciB0aGFuIC5ic3MuCi0KLVdlZCBTZXAgIDMgMTE6MjM6MjMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmgsIGJmZC1pbjIuaCwgZWxmMzItdjg1MC5jOiBSZW1vdmVkCi0JQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwuCi0KLVR1ZSBTZXAgIDIgMjA6NDQ6MTAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogSGFuZGxlIENfU1lTVEVNIHN5bXMKLQl0aGUgc2FtZSBhcyBDX0VYVCBzeW1zLgotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEaXR0by4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogRGl0dG8uCi0JKF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMpOiBBZGQgc2F2ZV9nbG9iYWxfdG9fc3RhdGljLiAgVXNlCi0JaXQgdG8gcHJlc2VydmUgYW5kIHJlc3RvcmUgc3RhdGUgb2YgZ2xvYmFsX3RvX3N0YXRpYyBmbGFnLgotCi1UdWUgU2VwICAyIDE3OjQ1OjIyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfb2JqZWN0X3ApOiBTZXQgbWFjaGluZSBudW1iZXIgYmFzZWQgb24KLQliaXRzIGluIGVfZmxhZ3MgZmllbGQgcmF0aGVyIHRoYW4gbWFnaWMgbnVtYmVycy4KLQkodjg1MF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZywgdjg1MF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MsCi0Jdjg1MF9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhLCB2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLAotCXY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb25zLgotCi1UdWUgU2VwICAyIDE3OjQzOjQ5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBSZW1vdmUgVjg1MEUgbWFnaWMgbnVtYmVyLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IFJlbW92ZSBWODUwRUEgbWFnaWMgbnVtYmVyLgotCi1UdWUgU2VwICAyIDE3OjM1OjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwdS1hcmMuYyAoYXJjX2dldF9tYWNoKTogUHJvcGVybHkgc2NhbiBkZWZpbmVkIG1hY2ggZW50cmllcy4KLQotVHVlIFNlcCAgMiAxODoyOTozNyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAyMDAuYyAobW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IFBDIHJlbGF0aXZlCi0JaW5zdHJ1Y3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgbm90IHRoZQotCWN1cnJlbnQgaW5zdHJ1Y3Rpb24uCi0JKG1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBTaW1pbGFybHkuCi0KLVR1ZSBTZXAgIDIgMTU6NDU6NDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LXY4NTAuYzogVXNlIGEgbWFjcm8gdG8gY29uc3RydWN0IGJmZF9hcmNoX2luZm9fdHlwZQotCWVudHJpZXMuCi0KLQkqIHJlbG9jLmMsIGxpYmJmZC5oLCBiZmQtaW4yLmgsIGVsZjMyLXY4NTAuYzogUmVwbGFjZQotCUJGRF9SRUxPQ19WODUwX3tTREEvVERBL1pEQX1fT0ZGU0VUIHJlbG9jcyB3aXRoIG5ldyBiaXQgcGF0dGVybgotCXNwZWNpZmljIHZlcnNpb25zOiBCRkRfUkVMT0NfVjg1MF97YXJlYX1fe2JpdHN9X09GRlNFVC4KLQotVGh1IEF1ZyAyOCAxNzowMTowOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNwdS12ODUwLmM6IFJlbW92ZSAicGxhaW4iIGZyb20gdjg1MCBwcmludGFibGUgbmFtZS4KLQkoc2Nhbik6IFVzZSBzdHJjYXNlY21wLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF92ODUwKTogRGVmaW5lLgotCi0JKiBjcHUtc2guYyAoc2Nhbl9tYWNoKTogQ29tcGFyZSB3aXRoIHRhYmxlIGluc3RlYWQgb2YgaGFyZHdpcmVkIHRvCi0gCWp1c3Qgc2gvU0gsIHVzZSBzdHJjYXNlY21wLgotCShhcmNoX2luZm9fc3RydWN0KTogQWRkIGVudHJpZXMgZm9yIHNoMyBldC5hbC4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc2gsIC4uLik6IERlZmluZS4KLQotV2VkIEF1ZyAyNyAxNzozMzowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9hcmNodXJlc19saXN0KTogQWx3YXlzIE5VTEwgdGVybWluYXRlIHRoZSBsaXN0LgotCi1UdWUgQXVnIDI2IDE3OjI2OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS1hcmMuYy4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBlbGYzMi1hcmMuYy4KLQkoZWxmMzItYXJjLmxvKTogUmVtb3ZlIGV4cGxpY2l0IGRlcGVuZGVuY3kuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogYWNpbmNsdWRlLm00IChCRkRfQ0NfRk9SX0JVSUxEKTogU2V0IEVYRUVYVF9GT1JfQlVJTEQuCi0JKiBkb2MvTWFrZWZpbGUuYW0gKE1LRE9DKTogVXNlIEVYRUVYVF9GT1JfQlVJTEQsIG5vdCBFWEVFWFQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBBdWcgMjUgMTY6MTQ6MzQgMTk5NyAgQ2hyaXN0b3BoZXIgUHJvdmVuemFubyAgPHByb3ZlbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsYXRlc3QgZGV2byBhdXRvY29uZiBmb3IgTlQgc3VwcG9ydAotCi1Nb24gQXVnIDI1IDE2OjExOjA0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1hcm0uYyAoY29tcGF0aWJsZSk6IElmIEIgaXMgYSBkZWZhdWx0IHR5cGUsIHJldHVybiBBLgotCi1Nb24gQXVnIDI1IDE1OjM1OjQ2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS12ODUwLmMgKHNjYW4pOiBOZXcgZnVuY3Rpb24uCi0JKGFyY2hfaW5mb19zdHJ1Y3QpOiBOZXcgc3RydWN0dXJlLgotCShiZmRfdjg1MF9hcmNoKTogQWRkIGxpbmsgaW50byBhcmNoX2luZm9fc3RydWN0dXJlLgotCi0JKiBjb25maWcuYmZkICh0YXJnX2NwdSk6IEFsbCB2ODUwIHZhcmlhbnRzIHVzZSB0aGUgYmZkX2FyY2hfdjg1MAotCWFyY2hpdGVjdHVyZS4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9vYmplY3RfcCk6IE5ldyBmdW5jdGlvbi4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfdjg1MGUpOiBNYWNoaW5lIHZhbHVlIGZvciB2ODUwZS4KLQotCSogYmZkLWluMi5oIChiZmRfbWFjaF92ODUwZSk6IE1hY2hpbmUgdmFsdWUgZm9yIHY4NTBlLgotCi0JKiBlbGYzMi12ODUwLmMgKEVMRl9NQUNISU5FX0NPREUpOiBEZWZhdWx0IHRvIHY4NTBlIG1hY2hpbmUKLQludW1iZXIuCi0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgbWFjaGluZSBudW1iZXIuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3Y4NTBlYSk6IE1hY2hpbmUgdmFsdWUgZm9yIHY4NTBlYS4KLQotCSogYmZkLWluMi5oIChiZmRfbWFjaF92ODUwZWEpOiBNYWNoaW5lIHZhbHVlIGZvciB2ODUwZWEuCi0KLQkqIGVsZjMyLXY4NTAuYyAoRUxGX01BQ0hJTkVfQ09ERSk6IERlZmF1bHQgdG8gdjg1MGVhIG1hY2hpbmUKLQludW1iZXIuCi0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIG1hY2hpbmUgbnVtYmVyLgotCi1Nb24gQXVnIDI1IDE0OjA3OjMzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jIChfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IENsZWFyIHRoZQotIAljYWNoZWRfc3RhYiBmaWVsZCBpZiB0aGUgb2Zmc2V0IHByZXZlbnRzIHVzIGZyb20gdXNpbmcgdGhlIGNhY2hlLgotCi1Nb24gQXVnIDI1IDEyOjA4OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dC10YXJnZXQuaCAoTVkodmVjKSk6IEFkZCBTRUNfQ09ERSBhbmQgU0VDX0RBVEEgdG8gc2VjdGlvbgotCWZsYWdzLgotCSogYW91dC1hcm0uYyAoYW91dF9hcm1fbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgotCShhb3V0X2FybV9iaWdfdmVjKTogTGlrZXdpc2UuCi0JKiBib3V0LmMgKGJfb3V0X3ZlY19iaWdfaG9zdCk6IExpa2V3aXNlLgotCShiX291dF92ZWNfbGl0dGxlX2hvc3QpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoYW91dF9taXBzX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KLQkoYW91dF9taXBzX2JpZ192ZWMpOiBMaWtld2lzZS4KLQotVHVlIEF1ZyAxOSAxMDowOToxMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jIChDT0ZGX0FMSUdOX0lOX1NGTEFHUyk6IERlZmluZSB0byAxLgotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBJZ25vcmUgaW5jb21pbmcgU1RZUF9JTkZPCi0JYml0IGluIHNfZmxhZ3MgaWYgQ09GRl9BTElHTl9JTl9TX0ZMQUdTIGlzIGRlZmluZWQuCi0KLVR1ZSBBdWcgMTkgMDg6NDc6MTcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSKTogRGVmaW5lIHRvIDEuCi0JKEdFVF9TQ05IRFJfQUxJR04sIFBVVF9TQ05IRFJfQUxJR04pOiBEZWZpbmUuCi0JKiBjb2ZmLW04OGsuYyAoR0VUX1NDTkhEUl9OUkVMT0MsIEdFVF9TQ05IRFJfTkxOTk8pOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IENvbmRpdGlvbmFsbHkgY29tcGlsZSBpbiBpZgotCUNPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgaXMgZGVmaW5lZC4gIENvbnZlcnQgYWxpZ25tZW50IHRvIHBvd2VyCi0Jb2YgdHdvIGZvciBJOTYwIG9ubHkuCi0JKiBjb2Zmc3dhcC5oIChHRVRfU0NOSERSX05SRUxPQywgUFVUX1NDTkhEUl9OUkVMT0MsIEdFVF9TQ05ESFJfTkxOTk8sCi0JUFVUX1NDTkhEUl9OTE5OTywgR0VUX1NDTkhEUl9GTEFHUywgUFVUX1NDTkhEUl9GTEFHUyk6IFByb3ZpZGUKLQlkZWZhdWx0IGRlZmluaXRpb25zLgotCShjb2ZmX3N3YXBfc2NuaGRyX2luKTogVXNlIEdFVF9TQ05IRFJfRkxBR1MsIEdFVF9TQ05IRFJfTlJFTE9DLAotCUdFVF9TQ05IRFJfTkxOTk8sIGFuZCBHRVRfU0NOSERSX0FMSUdOLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFVzZSBQVVRfU0NOSERSX0ZMQUdTLCBQVVRfU0NOSERSX0FMSUdOLgotCSogTWFrZWZpbGUuaW4gKGNvZmYtdGljODAubyk6IERlcGVuZHMgdXBvbiBjb2Zmc3dhcC5oLgotCSogY29mZi10aWM4MC5jIChDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSKTogRGVmaW5lIHRvIDEuCi0JKEdFVF9TQ05IRFJfRkxBR1MsIFBVVF9TQ05IRFJfRkxBR1MpOiBEZWZpbmUKLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGFsaWdubWVudCBmaWVsZCBpbgotIAlzZWN0aW9uIGhlYWRlciBmb3IgVElDODBDT0ZGIGZpbGVzLgotCi1Nb24gQXVnIDE4IDExOjM2OjE5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfaG93dG9fdGFibGUsIHY4NTBfZWxmX3JlbG9jX21hcCwKLQl2ODUwX2VsZl9jaGVja19yZWxvY3MsIHY4NTBfZWxmX3JlbG9jLAotCXY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgQWRkIHN1cHBvcnQgZm9yCi0JQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwgcmVsb2NhdGlvbi4KLQotCSogcmVsb2MuYyAoQ09NTUVOVCk6IEFkZCBzdXVwb3J0IGZvciBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTAotCXJlbG9jYXRpb24uCi0KLQkqIGxpYmJmZC5oOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwgcmVsb2NhdGlvbi4KLQotCSogYmZkLWluMi5oOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwgcmVsb2NhdGlvbi4KLQotTW9uIEF1ZyAxOCAxMTozMzo1NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtdjg1MGU6IE5ldyBmaWxlLgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotCSogYmZkLWluMi5oIChiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotCSogYXJjaHVyZXMuYzogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotTW9uIEF1ZyAxOCAxMTozMzo1NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtdjg1MGVhOiBOZXcgZmlsZS4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCi0JKiBiZmQtaW4yLmggKGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLQkqIGFyY2h1cmVzLmM6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCi1GcmkgQXVnIDE1IDEyOjAxOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogQ29ycmVjdGx5IGhhbmRsZSB0aGUgb2Zmc2V0Ci0JYXJndW1lbnQgYXMgc2VjdGlvbiByZWxhdGl2ZSwgcmF0aGVyIHRoYW4gYW4gYWJzb2x1dGUgYWRkcmVzcy4KLQlGcm9tIEphbiBIb29nZW5yYWFkIDxob29nZW5yZEBuYXRsYWIucmVzZWFyY2gucGhpbGlwcy5jb20+LgotCi1GcmkgQXVnIDE1IDA0OjU4OjAyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGFyYy0qLWVsZiopOiBBZGQuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl97bGl0dGxlLGJpZ31hcmNfdmVjKTogQWRkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuYW0gKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtYXJjLmxvLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGYzMi1hcmMubG8uCi0JKGNwdS1hcmMubG8sZWxmMzItYXJjLmxvKTogQWRkIHJ1bGVzIGZvci4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogYXJjaHVyZXMuYyAoYXJjaGl0ZWN0dXJlIGxpc3QpOiBBZGQgYmZkX2FyY2hfYXJjLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCBiZmRfYXJjX2FyY2guCi0JKGJmZF9tYWNoX2FyY19iYXNlKTogRGVmaW5lLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwsQkZEX1JFTE9DX0FSQ19CMjYpOiBBZGQuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl97bGl0dGxlLGJpZ31hcmNfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0KTogQWRkIHRoZW0uCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY3B1LWFyYy5jLCBlbGYzMi1hcmMuYzogTmV3IGZpbGVzLgotCSogZWxmLmMgKHByZV9oZWFkZXJzKTogUmVjb2duaXplIGJmZF9hcmNoX2FyYy4KLQotVHVlIEF1ZyAxMiAxMTo0NToxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IElmIG5vIHN5bWJvbHMsIG1ha2Ugc3VyZSB0aGUKLQlkYXRhIHNlY3Rpb24gaXMgY29ycmVjdGx5IHJvdW5kZWQgdG8gYSBwYWdlIGluIHRoZSBmaWxlLgotCi1Nb24gQXVnIDExIDEyOjQ1OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogRG9uJ3QgZW1pdCB0aGUgc3RyaW5nIHRhYmxlIGlmCi0JdGhlcmUgYXJlIG5vIHN5bWJvbHMuCi0KLVN1biBBdWcgMTAgMTQ6NDU6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXN0Z28zMi5jOiBSZW5hbWUgZnJvbSBjb2ZmLXN0dWJnbzMyLmMgdG8gYXZvaWQgb2xkIFN5c3RlbSBWCi0JZmlsZSBzeXN0ZW0gMTQgY2hhcmFjdGVyIGxpbWl0LgotCSogTWFrZWZpbGUuYW0sIGNvbmZpZ3VyZS5pbjogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEF1ZyAgOCAxODozNDozNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiAoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBlbGYzMi1kMTB2LmMuCi0JUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEF1ZyAgNiAxODo1Njo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChkb2NkaXIpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEF1ZyAgNSAyMzowNTowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuMS4KLQotTW9uIEF1ZyAgNCAxMjowMDozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIG5ldyBhdXRvbWFrZSBwYXRjaGVzLgotCi1TdW4gQXVnICAzIDA4OjE1OjEyIDE5OTcgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogcnM2MDAwLWNvcmUuYyAobWFrZV9iZmRfYXNlY3Rpb24pOiAgTmV3IGZ1bmN0aW9uIHRvIGFkZCBhIHNlY3Rpb24KLQl0byB0aGUgY29yZSBmaWxlIGJmZC4KLQkocnM2MDAwY29mZl9jb3JlX3ApOiAgVXNlIG1ha2VfYmZkX2FzZWN0aW9uIHRvIGFkZCB0aGUgY29yZSBmaWxlCi0Jc2VjdGlvbnMuCi0JVXNlIEJGRCByb3V0aW5lcyB0byBzZWVrLCByZWFkIGFuZCBzdGF0IHRoZSBjb3JlIGZpbGUuCi0JSGFuZGxlIC5kYXRhIHNlY3Rpb25zIGZyb20gbG9hZGVkIG9iamVjdHMgYW5kIGFub255bW91c2x5IG1tYXBwZWQKLQlyZWdpb25zLCB0aGVzZSBhcmUgYXZhaWxhYmxlIGluIEFJWCA0IGNvcmUgZmlsZXMuCi0KLUZyaSBBdWcgIDEgMTI6NTg6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBlbmFibGVfc2hhcmVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wuCi0JKiBhY2luY2x1ZGUubTQ6IE1vdmUgYWNtYWNyb3MubTQgaW4gaGVyZS4gIFJlbW92ZSBBTV9QUk9HX0xJQlRPT0wKLQljb3B5OyB1c2UgYSBwYXRjaGVzIGxpYnRvb2wgaW5zdGVhZC4KLQkqIGFjbWFjcm9zLm00OiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgSnVsIDMxIDE5OjU1OjM2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgTWFrZWZpbGUuaW4uCi0JKiBhY21hY3Jvcy5tNDogTmV3IGZpbGUsIGNvcGllZCBmcm9tIG9sZCBhY2xvY2FsLm00LgotCSogYWNpbmNsdWRlLm00OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9QUk9HX0xJQlRPT0wuICBSZW1vdmUgc2hhcmVkIGxpYnJhcnkKLQloYW5kbGluZzsgbm93IGhhbmRsZWQgYnkgbGlidG9vbC4gIFJlcGxhY2UgQUNfQ09ORklHX0hFQURFUiB3aXRoCi0JQU1fQ09ORklHX0hFQURFUi4gIFJlcGxhY2UgQUNfUFJPR19JTlNUQUxMIHdpdGggQU1fUFJPR19JTlNUQUxMLgotCUNhbGwgQU1fTUFJTlRBSU5FUl9NT0RFLCBBTV9DWUdXSU4zMiwgYW5kIEFNX0VYRUVYVC4gIENoYW5nZSBhbGwKLQkubyBmaWxlcyB0byAubG8uICBSZW1vdmUgc3RhbXAtaCBoYW5kbGluZyBpbiBBQ19PVVRQVVQuCi0JKiBhY2NvbmZpZy5oOiBNZW50aW9uIFBBQ0tBR0UgYW5kIFZFUlNJT04uCi0JKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KLQkqIGRlcC1pbi5zZWQ6IENoYW5nZSAubyB0byAubG8uCi0JKiBNYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBOb3cgYnVpbHQgd2l0aCBhY2xvY2FsLgotCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBWRVJTSU9OOiBSZW1vdmUuCi0KLVRodSBKdWwgMzEgMTI6MDk6MjAgMTk5NyAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IFRFWFRSRUwKLSAJaWYgdGhlcmUgaXMgb25seSBhIHJlbG9jYXRpb24gdG8gYSByZWFkLW9ubHkgYnV0IG5vdCBhbGxvY2F0YWJsZQotIAlzZWN0aW9uIChsaWtlIC5zdGFiKS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IENvcnJlY3QgdmFyaW91cyBjb21tZW50cy4KLQkocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBUaGVzZSBzZWN0aW9ucyBhcmUgbm90Ci0JY3JlYXRlZCBieSB0aGUgbGlua2VyICh0aGF0IGlzLCB0aGV5IGFyZSBjcmVhdGVkIGJ5IHRoZSB1c2VyCi0JcHV0dGluZyBkYXRhIGluIHRoZW0pLiBJbiBwYXJ0aWN1bGFyLCB0aGV5IGNhbiBiZSB0aGUgc291cmNlCi0JYW5kIHRhcmdldCBvZiByZWxvY2F0aW9ucy4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDaGVjayBwb3N0Y29uZGl0aW9uIG9mCi0gCWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbC4gIEFsaWduIDE2LWJ5dGUgY29tbW9uCi0gCW9iamVjdHMgKGZvciBpbnN0YW5jZSwgJ2xvbmcgZG91YmxlJykgdG8gMTYtYnl0ZSBib3VuZGFyaWVzLgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE1ha2UgdGhlIGNvZGUgdGhhdCBnZW5lcmF0ZXMKLQlzZWN0aW9uIHN5bWJvbHMgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3Igc3BhcmMsIHJlZHVjaW5nIHRoZQotCW51bWJlciBvZiBzZWN0aW9uIHN5bWJvbHMgb3V0cHV0LgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IENoZWNrIHBvc3Rjb25kaXRpb24gb2YKLQliZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wuICBNYWtlIGRlZmF1bHQgY2FzZSB0aGUKLQlzYW1lIGFzIGNvcnJlc3BvbmRpbmcgY29kZSBmb3Igc3BhcmMsIGZpeGluZyBidWcgaW52b2x2aW5nCi0JLnJlbGEuc3RhYnMuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRml4IGNhc2UgaW52b2x2aW5nIEdPVCBzeW1ib2xzCi0gCWZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIHZlcnNpb25pbmcgKGJ5IHJlcGxpY2F0aW5nCi0gCWNvcnJlc3BvbmRpbmcgY2hhbmdlIGluIHNwYXJjKS4gIFRyZWF0IFJfUFBDX1JFTEFUSVZFIFJFTEEgcmVsb2NzCi0gCWFzIHVzdWFsIGluIEVMRiwgbm90IGFzIHBzZXVkby1SRUwgcmVsb2NzIChhcyB0aGUgc3BhcmMgbGlua2VyCi0gCWRvZXMpLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgaGFuZHkgZGVidWdnaW5nIGNvZGUgZm9yIHdoZW4KLSAJYXNzZXJ0aW9uIGZhaWxzLiAgQWRkIHNvbWUgbW9yZSAnc3ltYm9sIG1hZGUgbG9jYWwgYmVjYXVzZSBvZgotIAl2ZXJzaW9uaW5nJyBjYXNlcy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENvcGUgd2l0aCBhZGRlbmQgd2hlbgotCXByb2Nlc3NpbmcgYSBHT1QgcmVsb2NhdGlvbiBhcyByZXF1aXJlZCBieSBBQkkuCi0KLVdlZCBKdWwgMzAgMjE6MzA6MzUgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogUmVtb3ZlIGFueQotCXZlcnNpb24gaW5mbyBpZiB0aGlzIHN5bWJvbCBjYW1lIGZyb20gYSBkeW5hbWljIG9iamVjdC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU2V0IHRoZSB2ZXJzaW9uIGluZm8gb2YgYSBzeW1ib2wKLQlvbmx5IGlmIHRoZSBvYmplY3QgYWN0dWFsbHkgY29udGFpbnMgdmVyc2lvbiBkZWZpbml0aW9ucyBhbmQKLQlkZWZpbmVzIHRoaXMgc3ltYm9sLgotCi1Nb24gSnVsIDI4IDE4OjA3OjQzIDE5OTcgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQ6IEFkZCBDWUdXSU4gYW5kIEVYRUVYVCBhdXRvY29uZiBtYWNyb3MuCi0gICAgICAgICogY29uZmlndXJlLmluOiBVc2UgQ1lHV0lOIGFuZCBFWEVFWFQgYXV0b2NvbmYgbWFjcm8gdG8gbG9vayBmb3IKLSAgICAgICAgd2luMzIgZGVwZW5kZW5jaWVzLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZiAyLjEyLgotICAgICAgICAqIGRvYy9NYWtlZmlsZS5pbjogQWRkICQoRVhFRVhUKSB0byBjaGV3IGV4ZWN1dGFibGUuCi0KLU1vbiBKdWwgMjggMDI6NTA6MjkgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6ICBJZiBDT1JFX1RSVU5DIGlzIHNldCwgcHJpbnQKLQlhIHdhcm5pbmcgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIGVycm9yLgotCi1TdW4gSnVsIDI3IDE5OjU0OjE0IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbik6IGFkZCBzZW1pY29sb24gdG8gbWFrZSBNU1ZDIGhhcHB5LgotCi1GcmkgSnVsIDI1IDE0OjUwOjA4IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY2lzY28tY29yZS5jOiBkZWZpbmUgc2lnbmFscyBmb3Igd2luZ2RiLgotCi1GcmkgSnVsIDI1IDE2OjI3OjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogT25seSBtZXJnZSBmaWxlcyB3aXRoCi0JdGhlIHNhbWUgbnVtYmVyIG9mIGF1eCBlbnRyaWVzLgotCi1GcmkgSnVsIDI1IDA4OjIyOjE1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogVXNlIFJfREFUQV9FWFBSIGZvciB0aGUKLQlkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGlmIHRoZSByZWxvY2F0aW9uIHNpemUgaXMgMzIgYml0cy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0RBVEFfRVhQUi4KLQotV2VkIEp1bCAyMyAxNjowODowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiBEb24ndCBvZmZzZXQgYSBjb21tb24gc3ltYm9sIGJ5Ci0JaXRzIHZhbHVlIGlmIENPRkZfV0lUSF9QRSBpcyBkZWZpbmVkLgotCi1UdWUgSnVsIDIyIDE3OjE5OjQ1IDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogY29mZi1zdHViZ28zMi5jOiBOZXcgZmlsZS4KLQkqIGdvMzJzdHViLmg6IE5ldyBmaWxlLgotCSogY29mZi1pMzg2LmM6IElmIENPRkZfR08zMl9FWEUsIGluY2x1ZGUgY29mZi9nbzMyZXhlLmguCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IEludm9rZQotCUNPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUFJFIGFuZCBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BPU1QgaWYgdGhleQotCWFyZSBkZWZpbmVkLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBJbnZva2UgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUFJFIGFuZAotCUNPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkoY29mZl9zd2FwX2F1eF9pbik6IEludm9rZSBDT0ZGX0FESlVTVF9BVVhfSU5fUFJFIGFuZAotCUNPRkZfQURKVVNUX0FVWF9JTl9QT1NUIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogSW52b2tlIENPRkZfQURKVVNUX0FVWF9PVVRfUFJFIGFuZAotCUNPRkZfQURKVVNUX0FVWF9PVVRfUE9TVCBpZiB0aGV5IGFyZSBkZWZpbmVkLgotCShjb2ZmX3N3YXBfc2NuaGRyX2luKTogSW52b2tlIENPRkZfQURKVVNUX1NDTkhEUl9JTl9QUkUgYW5kCi0JQ09GRl9BREpVU1RfU0NOSERSX0lOX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBJbnZva2UgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QUkUgYW5kCi0JQ09GRl9BREpVU1RfU0NOSERSX09VVF9QT1NUIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKiB0YXJnZXRzLmMgKGdvMzJzdHViYmVkY29mZl92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBnbzMyc3R1YmJlZGNvZmZfdmVjLgotCSogY29uZmlndXJlLmluIChnbzMyY29mZl92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkoZ28zMnN0dWJiZWRjb2ZmX3ZlYyk6IExpa2V3aXNlLgotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LSotbXNkb3NkamdwcCopOiBOZXcgdGFyZ2V0LgotCShpWzM0NTZdODYtKi1nbzMyKik6IENoYW5nZSB0byBiZSBsaWtlIG5ldyBtc2Rvc2RqZ3BwKi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtc3R1YmdvMzIuby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGNvZmYtc3R1YmdvMzIuYy4KLQkoSEZJTEVTKTogQWRkIGdvMzJzdHViLmguCi0KLVR1ZSBKdWwgMjIgMTU6MDk6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBmZG9wZW4uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IENoZWNrIEhBVkVfRkRPUEVOIHJhdGhlciB0aGFuIFZNUyBvcgotCV9fR08zMl9fLiAgUmVpbmRlbnQgYSBiaXQuCi0KLVN1biBKdWwgMjAgMjA6MDU6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFNldCBTRUNfTElOS0VSX0NSRUFURUQKLQlmbGFnIGZvciBuZXdseSBjcmVhdGVkIHNlY3Rpb25zLgotCShzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogRG9uJ3QgZGlzY2FyZCBuZXdseSBjcmVhdGVkIHNlY3Rpb25zCi0JaWYgc2hhcmVkIGxpYnJhcnkgaXMgZHlub2JqLgotCi1Nb24gSnVsIDE0IDE1OjMzOjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IFdoZW4gY2hlY2tpbmcgd2hldGhlcgotCWluY2x1ZGluZyBhIHNlY3Rpb24gaW4gYSBzZWdtZW50IHdvdWxkIGZvcmNlIHVzIHRvIHNraXAgYSBwYWdlLAotCWFsaWduIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IHNlZ21lbnQgdG8gYXZvaWQgd3JhcGFyb3VuZAotCXByb2JsZW1zLgotCi1UdWUgSnVsICA4IDEyOjExOjI5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEluaXRpYWxpemUKLSAJdGFyZ2V0IGlkIGZpZWxkIHRvIFRJQzgwX1RBUkdFVF9JRC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IFN3YXAgb3V0IHRhcmdldCBpZCBmaWVsZAotIAlpZiB1c2VkLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IFN3YXAgaW4gdGFyZ2V0IGlkIGZpZWxkIGlmIHVzZWQuCi0KLU1vbiBKdWwgIDcgMTY6NDE6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uCi0JaWYgVEFSR0VUX1VOREVSU0NPUkUuCi0JKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUgaWYgVEFSR0VUX1VOREVSU0NPUkUuCi0JKGkzODZjb2ZmX3ZlYyk6IEFkZCBTRUNfQ09ERSBhbmQgU0VDX0RBVEEgdG8gc2VjdGlvbl9mbGFncy4KLQotTW9uIEp1biAzMCAxNDoyOToyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW02OGsuYyAoaG93dG9fdGFibGUpOiBVc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIG5vdAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgZm9yIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQotVGh1IEp1biAyNiAwMToyNjozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV2hlbiBhIHZlcnNpb24KLQlpbmRpcmVjdGlvbiBzeW1ib2wgaXMgb3ZlcnJpZGRlbiwgbWFrZSB0aGUgb3JpZ2luYWwgc3ltYm9sIHBvaW50Ci0JYXQgdGhlIHJlYWwgb3ZlcnJpZGluZyBzeW1ib2wuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uKTogQ2hlY2sgZm9yIGFuIGludmFsaWQKLQlzdHJpbmcgaW5kZXguCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFVzZSB0aGUgcmlnaHQgc2VjdGlvbiBmb3IgYQotCWNvbW1vbiBzeW1ib2wuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogSWYgYSBjb21tb24KLQlzeW1ib2wgd2FzIGluIC5zY29tbW9uLCBtYXJrIGl0IGFzIFNITl9NSVBTX1NDT01NT04uCi0KLVdlZCBKdW4gMjUgMTI6NDM6MTAgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9scyk6IFJlc29sdmUgaW5kaXJlY3QgYW5kIHdhcm5pbmcKLQlzeW1ib2xzIGJlZm9yZSBjaGVja2luZyBmb3IgbmV3IHN5bWJvbHMuCi0KLQkqIGVsZmNvcmUuaCAoZWxmX2NvcmVmaWxlX25vdGUpOiBNb3ZlIG91dCBvZiBIQVZFX1NZU19QUk9DRlNfSC4KLQotVHVlIEp1biAyNCAxMToyMDo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9vYmplY3RfcCk6IFJlYWQgdGhlIGZfb3B0aGRyIGJ5dGVzIGZyb20gdGhlCi0JZmlsZSwgbm90IGFvdXRzeiBieXRlcyAodGhleSBhcmUgZGlmZmVyZW50IGluIFhDT0ZGIC5vIGZpbGVzKS4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBQZXJtaXQgc3ltYm9scyB0byBiZQotCXJlZGVmaW5lZCBieSBvYmplY3RzIGluY2x1ZGVkIGZyb20gYXJjaGl2ZXMuCi0KLU1vbiBKdW4gMjMgMTg6MDM6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBJbiB0aGUgY2FzZSBvZiBhIG5ldyBkZWZpbmVkCi0Jc3ltYm9sIG92ZXJyaWRpbmcgYW4gb2xkIGRlZmluZWQgc3ltYm9sLCByZXR1cm4gdGhlIGhhc2ggdGFibGUKLQllbnRyeSB3aGljaCB3ZSBtb2RpZnksIGV2ZW4gaWYgaXQgaXMgdGhlIHRhcmdldCBvZiBhbgotCWluZGlyZWN0aW9uLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiB0aGUgcmVhbCBuYW1lIG9mIHRoZSBzeW1ib2wgZ2V0cwotCW92ZXJyaWRkZW4sIGNvbnZlcnQgdGhlIHZlcnNpb25lZCBzeW1ib2wgaW50byBhbiBpbmRpcmVjdCBzeW1ib2wKLQl0byB0aGUgcmVhbCBzeW1ib2wuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQllbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENhbGwgaXQuCi0KLVN1biBKdW4gMjIgMTk6NDA6NTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoaTNjb2ZmX29iamVjdF9wKTogSWYgQ09GRl9JTUFHRV9XSVRIX1BFLCBoYWNrIHRvCi0JaGFuZGxlIGNhc2Ugd2hlcmUgQ09GRiBmaWxlaGRyIGRvZXMgbm90IGltbWVkaWF0ZWx5IGZvbGxvdyBQRQotCWhlYWRlci4KLQkqIGNvZmZnZW4uYyAoY29mZl9vYmplY3RfcCk6IFJlbW92ZSB1c2VsZXNzIHNlZWsgdG8gY3VycmVudAotCWxvY2F0aW9uLgotCi1XZWQgSnVuIDE4IDE5OjAzOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGxpbmtfYWN0aW9uKTogQ2hhbmdlIENPTU1PTl9ST1cvaW5kciB0byBmcm9tIENSRUYgdG8KLQlSRUZDLgotCi1UdWUgSnVuIDE3IDExOjU1OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgc3RyaXBwaW5nIGRlYnVnZ2luZwotCXN5bWJvbHMsIHNraXAgTl9BQlMgc3ltYm9scyB3aXRoIGRlYnVnZ2luZyBzdG9yYWdlIGNsYXNzZXMuCi0KLU1vbiBKdW4gMTYgMTg6NTY6MjcgMTk5NyAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGVtaXQgUl9QUENfUkVMKgotCXJlbG9jcyBpbiBzaGFyZWQgbGlicmFyaWVzIHdoaWNoIHJlZmVyIHRvIGxvY2FsIHN5bWJvbHMuICBDb3BlCi0Jd2l0aCBhZGRlbmQgd2hlbiBwcm9jZXNzaW5nIGEgR09UIHJlbG9jYXRpb24uCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgY3JlYXRlIHN5bWJvbHMKLQlmb3Igc2VjdGlvbnMgdGhhdCB0aGUgbGlua2VyIGRpZG4ndCBjcmVhdGUuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IHRyeSB0byB3cml0ZSBvdXQgYSBzZWN0aW9uCi0Jc3ltYm9sIGlmIGl0IHdhcyBjcmVhdGVkIGluIHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDb21wbGFpbiBpZiB3ZSBoYXZlIHRvIGdlbmVyYXRlIGEgcmVsb2MKLQlyZWxhdGl2ZSB0byBhIHNlY3Rpb24gZm9yIHdoaWNoIHdlIGRpZG4ndCBvdXRwdXQgYSBzeW1ib2wuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENsZWFuIHVwLiAgUExUCi0JcmVsb2NzIGFyZSAncmVsYScgcmVsb2NzLCBsaWtlIGV2ZXJ5dGhpbmcgZWxzZS4gIC5yZWxhLnBsdCBpcyBub3QKLQlhIHJlYWQtb25seSBzZWN0aW9uLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHNwZWNpYWwtY2FzZSBpdC4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRW50cmllcyBpbiB0aGUKLQkucmVsYS5ic3Mgc2VjdGlvbiBhcmUgKG9mIGNvdXJzZSkgJ3JlbGEnIHJlbG9jcyBub3QgJ3JlbCcgcmVsb2NzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBJbml0aWFsaXNlIHNyZWxnb3QuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEBnb3Qgb2Zmc2V0cyBhcmUgNCBmcm9tIHN0YXJ0IG9mIHRoZQotCWFjdHVhbCAuZ290IHNlY3Rpb24uCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IFRoZSB0aHJlZSByZXNlcnZlZAotCXdvcmRzIHN0YXJ0IGZyb20gdGhlIHN5bWJvbCAnX0dMT0JBTF9PRkZTRVRfVEFCTEVfJy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogJy5yZWxhJyBpcyA1Ci0JY2hhcmFjdGVycywgbm90IDQuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFVzZQotCV9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiB0byBjcmVhdGUgdGhlIEdPVCByYXRoZXIgdGhhbgotCXBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uLiBDcmVhdGUgdGhlICcucmVsYS5nb3QnIHNlY3Rpb24KLQlvdXJzZWx2ZXMuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogU2V0IHVwIEdPVCByZWxvY2F0aW9ucyB3aGVuIGEKLQlzeW1ib2wgaGFzIGEgR09UIGVudHJ5LgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZWNvcmQgd2hlbiBhIHN5bWJvbCBpcyB1c2VkIHRocm91Z2gKLQl0aGUgR09ULCBhbmQgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIEdPVCBmb3IgZWFjaCBzdWNoIHN5bWJvbC4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEZWxldGUgdW51c2VkIC5nb3QucGx0IHN0dWZmLgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IERlbGV0ZSB1bnVzZWQgTElOS0VSX1NFQ1RJT05fR09UCi0Jc3R1ZmYuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEdPVDE2X0hBIHJlbG9jcyBzaG91bGQgYmUKLQl0cmVhdGVkIGluIGEgc2ltaWxhciB3YXkgdG8gQUREUjE2X0hBIHJlbG9jcy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUExUUkVMMjQgcmVsb2NzIGRvIG5vdCBnZXQgY29waWVkIGludG8KLQlzaGFyZWQgb2JqZWN0czsgdGhlIGxpbmtlciBtdXN0IGRlYWwgd2l0aCB0aGVtLgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IFN0b3Agc2V0dGluZwotCV9HTE9CQUxfT0ZGU0VUX1RBQkxFXyB0byB0aGUgd3JvbmcgdmFsdWU7IGRlbGV0ZSB1bnVzZWQKLQlMSU5LRVJfU0VDVElPTl9QTFQgc3R1ZmYuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogRGVsZXRlIHVudXNlZCBMSU5LRVJfU0VDVElPTl9QTFQgc3R1ZmYuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgQkZEIGNhbGxzIHRvIGdldCBHT1QKLQlzZWN0aW9uLCBub3QgRUxGLXNwZWNpZmljIGNhbGxzLgotCShlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZCk6IFNldCB0byAxLgotCShlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldCk6IFNldCB0byA0LgotCSogZWxmLWJmZC5oIChlbGZfYmFja2VuZF9kYXRhKTogQWRkICdwbHRfbm90X2xvYWRlZCcgbWVtYmVyCi0JZm9yIHdoZW4gbGQuc28gZmlsbHMgaW4gdGhlIFBMVDsgYW5kICdnb3Rfc3ltYm9sX29mZnNldCcgbWVtYmVyLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IEFwcGx5Ci0JcGx0X25vdF9sb2FkZWQgbWVtYmVyLgotCShfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBBcHBseSBnb3Rfc3ltYm9sX29mZnNldC4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZCk6IFNldCBkZWZhdWx0IHRvCi0JJ2xvYWRlZCcuCi0JKGVsZl9iYWNrZW5kX0dfT19UX29mZnNldCk6IFNldCBkZWZhdWx0IHRvIDAuCi0JKGVsZk5OX2JlZCk6IFNldCBhZGRlZCBmaWVsZHMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFdhcyBzZXR0aW5nCi0JRFRfUkVMRU5UIGluIHNoYXJlZCBvYmplY3RzOyBzaG91bGQgYmUgRFRfUkVMQUVOVC4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFByb3BhZ2F0ZQotCVJfUFBDX0FERFIxNl9IQSByZWxvY3MgdG8gc2hhcmVkIG9iamVjdHMuIENvcGUgd2l0aCBjYXNlIHdoZXJlCi0Jc3VjaCBhIHJlbG9jIChpbiBhIG5vbi1zaGFyZWQgb2JqZWN0KSByZWZlcnMgdG8gYSBzeW1ib2wgdGhhdCdzCi0Jbm90IGRlZmluZWQuCi0KLU1vbiBKdW4gMTYgMTQ6NDI6MTQgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogZWxmY29kZS5oIChwdXRfc2lnbmVkX3dvcmQpOiBEZWZpbmUuCi0JKGdldF9zaWduZWRfd29yZCk6IERlZmluZS4KLQkoZWxmX3N3YXBfcmVsb2NhX2luKTogVXNlIGdldF9zaWduZWRfd29yZCBmb3IgdGhlIHJfYWRkZW5kIGZpZWxkLgotCShlbGZfc3dhcF9yZWxvY2Ffb3V0KTogVXNlIHB1dF9zaWduZWRfd29yZCBmb3IgdGhlIHJfYWRkZW5kCi0JZmllbGQuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFVzZQotCWJmZF9nZXRfc2lnbmVkXzMyIHRvIHNldCB0aGUgcl9hZGRlbmQgZmllbGQuCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfc3dhcF9yZWxvY2FfaW4pOiBVc2UKLQliZmRfaF9nZXRfc2lnbmVkXzY0IHRvIHNldCB0aGUgcl9hZGRlbmQgZmllbGQuCi0KLU1vbiBKdW4gMTYgMTI6MzE6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBXaGVuIGdlbmVyYXRpbmcgYQotCXNoYXJlZCBsaWJyYXJ5LCBkbyB0aGUgcmVsb2NhdGlvbiBpZiB0aGUgaW5wdXQgc2VjdGlvbiBpcyBub3QKLQlhbGxvY2F0ZWQgaW4gbWVtb3J5LgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ2FsbAotCWVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbiBiZWZvcmUgZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbC4KLQkoZWxmX2ZpeF9zeW1ib2xfZmxhZ3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbC4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENhbGwgZWxmX2ZpeF9zeW1ib2xfZmxhZ3MuCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IExpa2V3aXNlLiAgUGVybWl0IGEgc3ltYm9sIHRvIGJlCi0JZm9yY2VkIGxvY2FsIGV2ZW4gaWYgTkVFRFNfUExUIGlzIHNldC4gIFdoZW4gZm9yY2luZyBhIHN5bWJvbCB0bwotCWJlIGxvY2FsLCBjbGVhciBORUVEU19QTFQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBSZW1vdmUgdW51c2VkIGxvY2FsIGJlZC4KLQotV2VkIEp1biAxMSAyMjo0NDoyMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkpOiBOZXcgc3RydWN0dXJlCi0JZm9yIGRlcml2ZWQgZWxmIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICBSZWZlcmVuY2VzIHRvCi0JZWxmX2xpbmtfaGFzaF9lbnRyeSBjaGFuZ2VkIGFwcHJvcHJpYXRlbHkuCi0JKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlKTogTmV3IHN0cnVjdHVyZSBmb3IgZGVyaXZlZCBlbGYKLQlsaW5rZXIgaGFzaCB0YWJsZS4KLQkoZWxmMzJfbW4xMDMwMF9oYXNoX3RhYmxlKTogRGVmaW5lLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSk6IExpa2V3aXNlLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkoZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSk6IExpa2V3aXNlLgotCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogSGFuZGxlICJjYWxsIiAtPiAiY2FsbHMiLCByZW1vdmFsCi0Jb2YgcHJvbG9ndWUgY29kZSwgYW5kIGNhbGw6MzItPmNhbGw6MTYgcmVsYXhpbmcuCi0JKGNvbXB1dGVfZnVuY3Rpb25faW5mbzogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX2lsaW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVmaW5lLgotCi1XZWQgSnVuIDExIDAwOjAwOjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogQ2FsbCBmaW5pc2hfZHluYW1pY19zeW1ib2wKLQlmb3IgYSBzeW1ib2wgd2hpY2ggaXMgYmVpbmcgZm9yY2VkIHRvIGJlIGxvY2FsLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogV3JpdGUgb3V0IHRoZQotCXJlbG9jYXRpb24gdmFsdWUgZm9yIGEgR09UIHJlbG9jIGZvciBhIHN5bWJvbCB3aGljaCBpcyB0dXJuaW5nCi0JaW50byBhIGxvY2FsIHN5bWJvbC4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgaXMgdHVybmluZyBpbnRvIGEKLQlsb2NhbCBzeW1ib2wsIHdyaXRlIG91dCBhIFJFTEFUSVZFIHJlbG9jIHJhdGhlciB0aGFuIGEgR0xPQl9EQVQKLQlyZWxvYy4KLQkqIGVsZjMyLW02OGsuYywgZWxmMzItc3BhcmMuYzogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBHZXQgdGhlIHJlbG9jYXRpb24KLQl2YWx1ZSBpZiB0aGUgc3ltYm9sIGlzIHR1cm5pbmcgaW50byBhIGxvY2FsIHN5bWJvbC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0xOTk3LTA2LTEwIDIyOjU4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBBbHNvIHJlYWQgdmVybmVlZAotCWluZm9ybWF0aW9uIGJ5IGNhbGxpbmcgYF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzJy4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRm9yIHVuZGVmaW5lZCBzeW1ib2xzIGxvb2sgZm9yCi0JdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiB0aGUgdmVybmVlZCByZWNvcmRzLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2Ugc29uYW1lIG9mIHNoYXJlZCBvYmplY3QKLQlmb3IgdmVybmVlZCByZWNvcmQgaWYgaXQgaXMgYXZhaWxhYmxlLgotCi1UdWUgSnVuIDEwIDExOjEzOjAzIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNwdS1hcm0uYzogQWRkIHByb3RvdHlwZXMgZm9yIGNvbXBhdGlibGUgYW5kIHNjYW4uCi0JKiBjb2ZmbGluay5jOiBBZGQgcHJvdG90eXBlIGZvciBtYXJrX3JlbG9jcy4KLQotCSogYXJjaGl2ZS5jIChiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSk6IENoYW5nZSBmaWxlbmFtZSB0bwotCWNvbnN0IHBvaW50ZXIuICBBZGQgcHJvdG90eXBlLgotCi1Nb24gSnVuICA5IDEyOjM0OjIxIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElnbm9yZSByZWxvY2F0aW9ucyBvZgotCXNlY3Rpb25zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQuCi0KLTE5OTctMDYtMDYgMjI6NTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMpOiBXaGVuIHNlYXJjaGluZwotCWZvciBrbm93biB2ZXJzaW9uIHN5bWJvbCBza2lwIG5vbi1tYXRjaGluZyB2ZXJkZWYgcmVjb3Jkcywgbm90Ci0JbWF0Y2hpbmcgcmVjb3Jkcy4KLQotVGh1IEp1biAgNSAxNTo1Mjo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBXcml0ZSBhIGxvbmcsCi0Jbm90IGEgYmZkX3ZtYSwgdG8gdGhlIGJhc2UgZmlsZSwgdG8gbWF0Y2ggaG93IGRsbHRvb2wgcmVhZHMgaXQuCi0KLVR1ZSBKdW4gIDMgMTY6NTc6NDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogQWRkIHRodW1iIHJlbG9jYXRpb25zLgotCi0JKiBiZmQtaW4yLmg6IEFkZCBUaHVtYiByZWxvY2F0aW9ucy4KLQotCSogbGliYmZkLmg6IEFkZCBUaHVtYiByZWxvY2F0aW9ucy4KLQotTW9uIEp1biAgMiAxMDo0MTo1MiAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY3B1LW02OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEZpeCA2ODA2MCBjcHUgbmFtZS4KLQotRnJpIE1heSAzMCAxMjo0NjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFNldCBkeW5pbmR4Ci0JZm9yIGEgc2VjdGlvbiBldmVuIGlmIGl0IGlzIG5vdCBsb2FkZWQuCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IElmIFBFIGZpbGUsIGRvbid0IHN1YnRyYWN0Ci0Jc2VjdGlvbiBWTUEuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IFNlcGFyYXRlIHNlY3Rpb24gVk1BIGhhbmRsaW5nIGZvcgotCWlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayB3aGV0aGVyIGlucHV0IGZpbGUsCi0Jbm90IG91dHB1dCBmaWxlLCBpcyBhIFBFIGZpbGUuCi0KLVdlZCBNYXkgMjggMTU6NDg6NDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYzogKGNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IE1ha2Ugc3RhdGljLgotCi1XZWQgTWF5IDI4IDE2OjE2OjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IERvbid0IGp1c3QgZXhpdCBpZiB3ZSBzZWUgYW4KLQlSX0lNQUdFQkFTRSByZWxvYy4KLQotV2VkIE1heSAyOCAwOTo0ODo0MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtYXJtLmMgKGNvbXBhdGlibGUpOiBBZGQgdGVzdCBmb3Igc3VwZXJzZXRzIG9mIEFSTQotCWFyY2hpdGVjdHVyZXMuCi0KLVR1ZSBNYXkgMjcgMTk6NDI6MDMgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSBnbG9iYWxfdG9fc3RhdGljCi0JbWVtYmVyLgotCi1UdWUgTWF5IDI3IDE0OjM0OjA4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IE1ha2UgZ2xvYmFsLiAgSXQgaXMKLQljYWxsZWQgZGlyZWN0bHkgYnkgZ2FzL2NvbmZpZy90Yy1hcm0uYy4KLQotVHVlIE1heSAyNyAxNTo1ODo1MyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoUExUX0VOVFJZXyopOiBVc2UgYSBuZXcgdGhyZWFkLXNhZmUgZm9ybWF0LgotCShlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBGaWxsIGl0IGluIHByb3Blcmx5LgotCi1Nb24gTWF5IDI2IDE0OjA1OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IElmIFBFIGZpbGUsIGRvbid0IGFkZAotCXNlY3Rpb24gVk1BLgotCi1Nb24gTWF5IDI2IDEwOjU3OjQ4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiAjdW5kZWYgYmVmb3JlICNkZWZpbmUuCi0JKGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERpdHRvLgotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBNYWtlIHN0YXRpYy4KLQkoY29mZl9hcm1fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEaXR0by4KLQkoY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogRGl0dG8uCi0JKGNvZmZfYXJtX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEaXR0by4KLQotRnJpIE1heSAyMyAxNToxNDo1OCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8pOiBBZGQgYm9vbGVhbgotCWdsb2JhbF90b19zdGF0aWMgbWVtYmVyIGZvciBzdXBwb3J0IG9mIHRhc2sgbGlua2luZy4KLQkoX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyk6IEFkZCBwcm90b3R5cGUuCi0JKiBsaWJjb2ZmLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSAjaWZkZWYgdG8KLQljaGVjayBSUzYwMDBDT0ZGX0MsIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBhbGwgb3RoZXIgdXNlcwotCWluIHRoaXMgZmlsZS4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSWYgZG9pbmcgdGFzayBsaW5raW5nLAotCWNhbGwgX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscy4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgZG9pbmcgdGFzayBsaW5raW5nLCBjb252ZXJ0Ci0JZ2xvYmFsIGZ1bmN0aW9ucyB0byBzdGF0aWMuCi0JKF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltKTogSWYgZG9pbmcgdGFzayBsaW5raW5nLCBjb252ZXJ0Ci0JZ2xvYmFsIHZhcmlhYmxlcyB0byBzdGF0aWMuCi0JKF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb2ZmLXRpYzgwLmMgKFRJQzgwQ09GRik6IERlZmluZSB0aGlzIGluc3RlYWQgb2YganVzdCBUSUM4MC4KLQkoQ19BVVRPQVJHKTogI3VuZGVmIHNpbmNlIGl0IGNsYXNoZXMgd2l0aCBDX1VFWFQuCi0JKENfTEFTVEVOVCk6ICN1bmRlZiBzaW5jZSBpdCBjbGFzaGVzIHdpdGggQ19TVEFUTEFCLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgVElDODBDT0ZGCi0JcmF0aGVyIHRoYW4gVElDODAuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogVXNlIENfU1lTVEVNLiAgSGlkZSBDX0FVVE9BUkcgdXNlCi0Jd2hlbiBUSUM4MENPRkYgZGVmaW5lZCAoY2xhc2hlcyB3aXRoIENfVUVYVCkuICBFeHBsaWNpdGx5Ci0JcmVjb2duaXplIENfVUVYVCwgQ19TVEFUTEFCLCBhbmQgQ19FWFRMQUIgYXMgdW5zdXBwb3J0ZWQuCi0KLUZyaSBNYXkgMjMgMTI6Mzg6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwX2hvd3RvX3RhYmxlKTogQ2hhbmdlIG92ZXJmbG93IGNoZWNrIGZvciBtb3N0Ci0JUFAgcmVsb2NhdGlvbnMgdG8gY29tcGxhaW5fb3ZlcmZsb3dfZG9udC4KLQotVGh1IE1heSAyMiAyMDoyMjoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAodGljODBfaG93dG9fdGFibGUpOiBBZGQgUFAgcmVsb2NhdGlvbnMuICBDaGFuZ2UKLQluYW1lIG9mIFJfUkVMTE9ORyB0byAiUkVMTE9ORyIuICBTZXQgcmlnaHRzaGlmdCBhbmQgY29tcGxhaW4gZm9yCi0JTV9QUENSLgotCShwcGJhc2VfcmVsb2MsIGdsb2IxNV9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShnbG9iMTZfcmVsb2MsIGxvY2FsMTZfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkocnR5cGUyaG93dG8pOiBIYW5kbGUgYWxsIHJlbG9jYXRpb24gdHlwZXMuCi0JKGNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZSB0byBjb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24uCi0JKiBNYWtlZmlsZS5pbiAoY29mZi10aWM4MC5vKTogRGVwZW5kcyB1cG9uIGluY2x1ZGUvY29mZi90aWM4MC5oLgotCi1XZWQgTWF5IDIxIDE3OjE1OjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBDT0ZGX1dJVEhfUEUgb3IKLQlDT0ZGX0lNQUdFX1dJVEhfUEUsIGRvbid0IHN1YnRyYWN0IHRoZSBzZWN0aW9uIFZNQSBmcm9tIHRoZSBzeW1ib2wKLQl2YWx1ZS4KLQkqIGNvZmZnZW4uYyAoZml4dXBfc3ltYm9sX3ZhbHVlKTogQWRkIGFiZmQgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBJZiBQRSBmaWxlLCBkb24ndCBhZGQgc2VjdGlvbiBWTUEuCi0JKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogSWYgUEUgZmlsZSwgZG9uJ3QgYWRkIHNlY3Rpb24gVk1BLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogcGVpY29kZS5oOiBBZGQgJiAweGZmZmZmZmZmIHdoZW4gdXNpbmcgSW1hZ2VCYXNlIGluIGNhc2UgYmZkX3ZtYQotCWlzIDY0IGJpdHMuCi0KLVdlZCBNYXkgMjEgMDk6NTg6MTAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAobWFya19yZWxvY3MpOiBBZGQgbmV3IGZ1bmN0aW9uIHRvIG1hcmsgc3ltYm9scyB3aGljaAotCWFyZSB1c2VkIGJ5IHJlbG9jYXRpb25zLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBBZGQgY2FsbCB0byBtYXJrX3JlbG9jcygpIGFuZCBjb2RlIHRvCi0Jc3VwcHJlc3MgdGhlIHNraXBwaW5nIG9mIHN5bWJvbHMgdGhhdCBoYXZlIHRodXMgYmVlbiBtYXJrZWQuCi0KLVR1ZSBNYXkgMjAgMTg6NDU6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX21lcmdlX3ByaXZhdGVfZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0KLU1vbiBNYXkgMTkgMTQ6NDY6MDAgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmM6IFJlbW92ZSB1bm5lY2Vzc2FyeSAjaWZkZWZzLgotCSogY29uZmlnLmJmZDogU2V0IHRhcmdfdW5kZXJzY29yZSB0byB5ZXMgZm9yIHRpYzgwLgotCi1Nb24gTWF5IDE5IDE0OjI2OjM2IDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jIChOQU1FU19IQVZFX1VOREVSU0NPUkUpOiBEZWZpbmUgKGZpeGVzIHByb2JsZW0KLQl3aXRoIHVucmVzb2x2ZWQgZXh0ZXJuYWwgc3ltYm9scyBpbiBHREIpLgotCi1GcmkgTWF5IDE2IDEwOjIzOjAzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX3JlbGF4X3NlY3Rpb24pOiBSZWFkIGluIGFsbAotCXRoZSBzeW1ib2xzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEJGRC4KLQkobW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogRG9uJ3QgYWRqdXN0IHRoZSBzYW1lIHN5bWJvbAotCW1vcmUgdGhhbiBvbmNlLgotCSogZWxmLW0xMDIwMC5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLW0zMnIuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1zaC5jOiBMaWtld2lzZS4KLQotRnJpIE1heSAxNiAxMjoxMDo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgZGVjcmVhc2UgdGhlCi0JYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbC4gIElmIHR3byBzeW1ib2xzIHRoYXQgbG9vayBsaWtlCi0JY29tbW9uIHN5bWJvbHMgYXJlIGZvdW5kIGluIHR3byBzaGFyZWQgbGlicmFyaWVzLCBhbmQgdGhlIHNpemUgaXMKLQlkaWZmZXJlbnQsIHVzZSB0aGUgbGFyZ2VyIHNpemUsIGFuZCB3YXJuIGlmIC0td2Fybi1jb21tb24uICBJZiBhCi0JY29tbW9uIHN5bWJvbCBvdmVycmlkZXMgYSBkZWZpbml0aW9uIGluIGEgc2hhcmVkIGxpYnJhcnksIHNldCB0aGUKLQlzaXplIHRvIHRoZSBsYXJnZXIgc2l6ZSwgYW5kIHdhcm4gaWYgLS13YXJuLWNvbW1vbi4KLQotVGh1IE1heSAxNSAxNDozMToyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtYXJtLmMgKGNvbXBhdGlibGUpOiAgQWxsb3cgZGVmYXVsdCBtYWNoaW5lIHRvIGJlIHBvbHltb3JwaGVkCi0JaW50byBhbnkgb3RoZXIgbWFjaGluZSB0eXBlLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9mbGFncyk6ICBJbml0aWFsaXNlIGZsYWdzIHZhcmlhYmxlIHRvIDAuCi0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogIFdoZW4gbWVyZ2luZwotCWRhdGEgaW50byBhbiB1bml0aWFsaXNlZCBkZXN0aW5hdGlvbiBzZXQgaXRzIG1hY2hpbmUgdHlwZSBhcyB3ZWxsLgotCi1UaHUgTWF5IDE1IDE2OjQwOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBGb3JjZSBFTEYgc3ltYm9sIHNpemUKLQl0byBjb21tb24gc3ltYm9sIHNpemUuICBDb25zaXN0ZW50bHkgdHJlYXQgdW5pbml0aWFsaXplZCBzeW1ib2xzCi0JaW4gc2hhcmVkIG9iamVjdHMgYXMgY29tbW9uIHN5bWJvbHMuCi0KLUZyaSBNYXkgIDkgMTA6MTU6MjcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoY29uc3RhbnRzKTogIEFkZGVkIG5ldyBjb25zdGFudHMgdG8gaWRlbnRpZnkgdGhlCi0JdHlwZSBvZiB0aGUgQVJNIGFyY2hpdGVjdHVyZTogYmZkX21hY2hfYXJtXzIsIGJmZF9tYWNoX2FybV8yYSwKLQliZmRfbWFjaF9hcm1fMywJYmZkX21hY2hfYXJtXzNNLCBiZmRfbWFjaF9hcm1fNCBhbmQgYmZkX21hY2hfYXJtXzRULgotCi0JKiBiZmQtaW4yLmggKGNvbnN0YW50cyk6ICAgQWRkZWQgbmV3IGNvbnN0YW50cyB0byBpZGVudGlmeQotCXRoZSB0eXBlIG9mIHRoZSBBUk0gYXJjaGl0ZWN0dXJlOiBiZmRfbWFjaF9hcm1fMiwgYmZkX21hY2hfYXJtXzJhLAotCWJmZF9tYWNoX2FybV8zLCBiZmRfbWFjaF9hcm1fM00sIGJmZF9tYWNoX2FybV80IGFuZAotCWJmZF9tYWNoX2FybV80VC4gIFRoaXMgZmlsZSBpcyBhdXRvLW1hZ2ljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUKLQlhcmNodXJlcy5jIGZpbGUuICBUaGlzIHVwZGF0ZSBpcyBqdXN0IHRvIHNhdmUgd29yay4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsCi0JY29mZl9hcm1fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEsCi0JY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzLAotCWNvZmZfYXJtX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGRlZCB0aGVzZSBuZXcgZnVuY3Rpb25zLgotCShnbG9iYWwpOiBNYWNybyByZWRlZmluaXRpb25zIHNldCB1cCB0byB1c2UgdGhlc2UgbmV3IGZ1bmN0aW9ucy4KLQotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogQWRkZWQgY2FsbCB0bwotCWNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncygpLgotCShjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZGVkIGNvZGUgdG8gc2V0IG1hY2hpbmUgdHlwZSBiYXNlZCBvbgotCWJpdHMgc3RvcmVkIGluIGludGVybmFsIGZsYWdzLgotICAJKGNvZmZfc2V0X2ZsYWdzKTogQWRkZWQgY29kZSB0byBzZXQgdGhlIG5ldyBiaXRzIGluIHRoZSBmbGFncwotCWZpZWxkIGJhc2VkIG9uIHRoZSBtYWNoaW5lIG51bWJlci4KLQkoZnVuY3Rpb24gZGVmaW5pdGlvbiBtYWNyb3MpOiBNYWRlIGFsbCBmdW5jdGlvbiBkZWZpbml0aW9uIG1hY3JvcwotCWNvbmRpdGlvbmFsIHNvIHRoYXQgdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0YXJnZXQgc3BlY2lmaWMKLQlmaWxlcy4KLQotCSogY3B1LWFybS5jIChjb21wYXRpYmxlKTogQWRkZWQgdGhpcyBmdW5jdGlvbi4gIChhcmNoX2luZm9fc3RydWN0KToKLQlTdHJ1Y3R1cmUgZXh0ZW5kZWQgdG8gaW5jbHVkZSBuZXcgdHlwZXMsIG9uZSBlYWNoIGZvciBBUk12MiwKLQlBUk12MmEsIEFSTXYzLCBBUk12M00sIEFSTXY0IGFuZCBBUk12NFQuCi0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfdGRhdGEpOiAgQWRkZWQgZmxhZ3MgZmllbGQuCi0KLUZyaSBNYXkgIDkgMTc6NDA6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi1nbnUqKTogRG9uJ3QgaW5jbHVkZSBNYWNoIHN1cHBvcnQuCi0KLQkqIGNvbmZpZy5iZmQ6IENoYW5nZSAjaWYgMCBhcm91bmQgdXNlcyBvZiBob3N0X2FvdXRfdmVjIHRvICNpZgotCUhBVkVfaG9zdF9hb3V0X3ZlYy4KLQotTW9uIE1heSAgNSAxMzo1NzozMiAxOTk3ICBNaWtlIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSWYgdGhlcmUgYXJlIG5vIHN5bWVudHMsCi0JanVzdCByZXR1cm4gZmFsc2UuCi0KLU1vbiBNYXkgIDUgMTg6MTg6NDUgMTk5NyAgUGhpbGlwIEJsdW5kZWxsICA8cGpiMjdAY2FtLmFjLnVrPgotCi0JKiBjb25maWcuYmZkOiBjb3BlIHdpdGggJyotKi1saW51eC1nbnVhb3V0JyB0YXJnZXRzLgotCi1UaHUgTWF5ICAxIDExOjMxOjEyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ21hdGNoLnNlZDogQWRkIGV4cGxpY2l0IFxuIGNoYXJhY3RlcnMgdG8gd29yayBhcm91bmQgYnVnIGluCi0JSFAvVVggMTAuMjAgc2VkIHByb2dyYW0uCi0KLVdlZCBBcHIgMzAgMTI6Mjc6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ2FzdCBjc2VjcyB0byBhdm9pZCBzaWduCi0JZXh0ZW5zaW9uIHByb2JsZW1zLgotCi1UdWUgQXByIDIyIDEyOjA2OjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRvX21haW50YWluZXJfY2xlYW4pOiBEb24ndCByZW1vdmUgYmZkLWluMi5oLgotCi1Nb24gQXByIDIxIDExOjIxOjMxIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmM6IEZvbGxvdyB0aGUgbGFzdCBjaGFuZ2VzIGluIGVsZjMyLWkzODYuYzoKLQkoc3RydWN0IGVsZl9tNjhrX3BjcmVsX3JlbG9jc19jb3BpZWQsIHN0cnVjdAotCWVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSwgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZSwKLQllbGZfbTY4a19saW5rX2hhc2hfdHJhdmVyc2UsIGVsZl9tNjhrX2hhc2hfdGFibGUsCi0JZWxmX202OGtfbGlua19oYXNoX25ld2Z1bmMsIGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsCi0JZWxmX202OGtfZGlzY2FyZF9jb3BpZXMsIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6Ci0JTmV3IGRlZmluaXRpb25zLgotCShlbGZfbTY4a19jaGVja19yZWxvY3MpOiBJZiBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywgZG9uJ3QgY29weQotCVBDIHJlbGF0aXZlIHJlbG9jcyBmb3IgYSBnbG9iYWwgc3ltYm9sIGRlZmluZWQgaW4gYSByZWd1bGFyCi0Jb2JqZWN0LCBhbmQgY291bnQgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3MgY29waWVkIGZvciBhbnkKLQlnbG9iYWwgc3ltYm9sLgotCShlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywKLQl0cmF2ZXJzZSB3aXRoIGVsZl9tNjhrX2Rpc2NhcmRfY29waWVzLgotCi1TYXQgQXByIDE5IDIyOjUwOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBPbmx5IGNvdW50IFBDIHJlbGF0aXZlCi0JcmVsb2NzLiAgRnJvbSBKYW1pZSBMb2tpZXIgPGphbWllQHJlYmVsbGlvbi5jby51az4uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRm9yY2UgdGhlCi0JcG90ZW50aWFsIGxhc3QgYnl0ZSBpbiB0aGUgZmlsZSB0byBiZSB3cml0dGVuIG91dCB3aGVuCi0JQ09GRl9JTUFHRV9XSVRIX1BFLgotCi1UaHUgQXByIDE3IDEzOjQ2OjU2IDE5OTcgIFBlciBGb2dlbHN0cm9tICA8cGVmb0BvcGVuYnNkLm9yZz4KLQotCSogY29uZmlndXJlLmhvc3QgKG1pcHMqLSotb3BlbmJzZCopOiBOZXcgaG9zdC4KLQotVGh1IEFwciAxNyAxMToxMDo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBzdWJ0cmFjdCB0aGUKLQlzZWN0aW9uIFZNQSBmcm9tIHRoZSBzeW1ib2wgdmFsdWUgaWYgdGhpcyBpcyBhIGZ1bGx5IGxpbmtlZCBmaWxlLgotCi0JKiBlbGYzMi1pMzg2LmMgKHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlKTogRGVmaW5lLgotCShlbGZfaTM4Nl9saW5rX2hhc2hfdHJhdmVyc2UpOiBEZWZpbmUuCi0JKGVsZl9pMzg2X2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGVsZl9pMzg2X2xpbmtfaGFzaF9uZXdmdW5jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2kzODZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IElmIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCBkb24ndCBjb3B5Ci0JUEMgcmVsYXRpdmUgcmVsb2NzIGZvciBhIGdsb2JhbCBzeW1ib2wgZGVmaW5lZCBpbiBhIHJlZ3VsYXIKLQlvYmplY3QsIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyBjb3BpZWQgZm9yIGFueQotCWdsb2JhbCBzeW1ib2wuCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLAotCXRyYXZlcnNlIHdpdGggZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMuCi0JKGVsZl9pMzg2X2Rpc2NhcmRfY29waWVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVmaW5lLgotCi0JRnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiBhb3V0ZjEuaCAoTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShzdW5vczRfYW91dF9iYWNrZW5kKTogVXNlIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcy4KLQotV2VkIEFwciAxNiAxMjo0MzozMiAxOTk3ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDMwdi5jIChlbGZfZDMwdl9ob3d0b190YWJsZSk6IENoYW5nZWQgc2l6ZSBvZgotCVJfRDMwVl8zMl9OT1JNQUwgdG8gMiAoNCBieXRlcykuCi0KLVdlZCBBcHIgMTYgMTQ6MDI6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiBuZXRic2QuaCAoTl9TSEFSRURfTElCKTogRGVmaW5lLgotCShTRUdNRU5UX1NJWkUpOiBEb24ndCBkZWZpbmUuCi0JKiBtNjhrbmV0YnNkLmMgKFNFR01FTlRfU0laRSk6IERvbid0IGRlZmluZSAocmV2ZXJ0IGNoYW5nZSBvZgotCUFwcmlsIDExKS4KLQkqIHNwYXJjbmV0YnNkLmMgKFRBUkdFVF9QQUdFX1NJWkUpOiBEZWZpbmUgYXMgMHgyMDAwLgotCShTRUdNRU5UX1NJWkUpOiBEb24ndCBkZWZpbmUuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFNldCAucmVsYS5ic3Mgc2l6ZQotCXRvIHNpemVvZiBSZWxhIHN0cnVjdHVyZSwgbm90IHNpemVvZiBSZWwgc3RydWN0dXJlLiAgRnJvbSBHYXJ5Ci0JVGhvbWFzIDxnLnRob21hc0BvcGVuZ3JvdXAub3JnPi4KLQotVHVlIEFwciAxNSAxMTo1MDozNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IElmIGVudHJ5X2lzX3RleHRfYWRkcmVzcywgYWRqdXN0Ci0Jd2hlbmV2ZXIgZW50cnkgaXMgbGFyZ2VyIHRoYW4gdGV4dCBhZGRyZXNzLCBidXQgb25seSBieSB3aG9sZQotCXBhZ2VzLiAgRnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT4uCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuICBVc2UKLQlta2luc3RhbGxkaXJzIHRvIGJ1aWxkICQob2xkaW5jbHVkZWRpcikuCi0JKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBjYWxsIGNoZWNrX3JlbG9jcwotCWlmIHRoaXMgaXMgYSBkZWJ1Z2dpbmcgc2VjdGlvbiB3aGljaCB3ZSBhcmUgc3RyaXBwaW5nLgotCi1Nb24gQXByIDE0IDEyOjM5OjMwIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9vYmplY3RfcCk6IEFsbG9jYXRlIHRoZQotCWFscGhhLXNwZWNpZmljIHRhcmdldCBkYXRhIHN0cnVjdC4KLQotTW9uIEFwciAxNCAxMTo0NTo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT46Ci0JKiBNYWtlZmlsZS5pbjogQWx3YXlzIHVzZSAkKFNIRUxMKSB3aGVuIHJ1bm5pbmcgbW92ZS1pZi1jaGFuZ2UuCi0JKiBjb25maWd1cmUuaW46IFVzZSAke0NPTkZJR19TSEVMTH0gd2hlbiBydW5uaW5nICRhY19jb25maWdfc3ViLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByIDExIDE1OjQzOjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogT25seSBzdWJ0cmFjdCB0aGUgc2VjdGlvbgotCVZNQSBpZiB0aGlzIGlzIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBhIHNoYXJlZCBvYmplY3QuCi0KLQkqIHRhcmdldHMuYyAobmV0YnNkX2NvcmVfdmVjKTogRGVjbGFyZS4gIEZyb20gR29yZG9uIFcuIFJvc3MKLQk8Z3dyQG1jLmNvbT4uCi0KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGVudHJ5X2lzX3RleHRfYWRkcmVzcwotCWZpZWxkLgotCSogYW91dC10YXJnZXQuaCAoU0VHTUVOVF9TSVpFKTogRGVmaW5lIHRvIFRBUkdFVF9QQUdFX1NJWkUgYXQgdGhlCi0Jc3RhcnQgb2YgdGhlIGZpbGUuICBSZW1vdmUgdXNlcyBsYXRlciBvbiB3aGljaCBzd2l0Y2ggdXNpbmcKLQlpZmRlZi4KLQkoTVkoY2FsbGJhY2spKTogSGFuZGxlIGVudHJ5X2lzX3RleHRfYWRkcmVzcy4KLQkoTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShNWShiYWNrZW5kX2RhdGEpKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2FvdXRfYmFja2VuZCk6IExpa2V3aXNlLgotCSogaTM4NmFvdXQuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogaTM4Nm1hY2gzLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogc3BhcmNseW54LmMgKHNwYXJjbHlueF9hb3V0X2JhY2tlbmQpOiBMaWtld2lzZS4KLQkqIG5ldGJzZC5oIChTRUdNRU5UX1NJWkUpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyk6IERlZmluZS4KLQkqIG02OGtuZXRic2QuYyAoU0VHTUVOVF9TSVpFKTogRGVmaW5lIGFzIDB4MjAwMDAuCi0KLQkqIHhjb2ZmbGluay5jIChiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCk6IEhhbmRsZSBpbXBvcnRpbmcgYSBzeW1ib2wKLQl3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGAuJy4KLQotRnJpIEFwciAxMSAxMTo1NzoxNSAxOTk3ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiBjb25maWcuYmZkOiAoaVszNDU2XTg2LSotb3BlbmJzZCosIG02OCotKi1vcGVuYnNkKiwKLQltaXBzKmVsKi0qLW9wZW5ic2QqLCBtaXBzKi0qLW9wZW5ic2QqLCBuczMyay0qLW9wZW5ic2QqLAotCXBvd2VycGMtKi0qYnNkKiwgc3BhcmMtKi1vcGVuYnNkKik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtKi1vcGVuYnNkKiwgbWlwcyotKi1vcGVuYnNkKiwKLQltNjgqLSotb3BlbmJzZCosIG5zMzJrLSotb3BlbmJzZCosIHBvd2VycGMtKi0qYnNkKiwKLQlzcGFyYy0qLW9wZW5ic2QqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBBcHIgIDggMTg6MDk6MjkgMTk5NyAgSmFtaWUgTG9raWVyICA8amFtaWVAcmViZWxsaW9uLmNvLnVrPgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8pOiBOZXcgZmllbGQKLQlgY3VtdWxhdGl2ZV9za2lwcycuCi0JKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogRmlsbCB0aGUgYWJvdmUgYXJyYXkuCi0JKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldCk6IFVzZSBgY3VtdWxhdGl2ZV9za2lwcycgdG8KLQlzcGVlZCB1cCBvZmZzZXQgY2FsY3VsYXRpb24uCi0KLVR1ZSBBcHIgIDggMDA6MDE6MzEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogZWxmLW1uMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IERvbid0IGZvcmdldCB0aGUKLSAgICAgICAgYWRkZW5kIGZvciBub24gcGMtcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0KLQkqIGVsZi1tMTAzMDAuYyAoYmZkX2VsZjMyX21uMTAzMDBfcmVsb2MpOiBSZW1vdmUgcHJvdG90eXBlCi0JZm9yIG5vbi1leGlzdGVudCBmdW5jdGlvbi4KLQotCSogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkobW4xMDMwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcCk6IExpa2V3aXNlLgotCShtbjEwMzAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCShiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi1Nb24gQXByICA3IDE2OjQ3OjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBTSExJQl9MSUJTLgotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIFNITElCX0xJQlMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoU0hMSUJfTElCUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChTSExJQikpOiBVc2UgJChTSExJQl9MSUJTKS4KLQotTW9uIEFwciAgNyAxMDo1Mzo1MiAxOTk3ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCBiZmQtaW4yLmg6IGFkZCBiZmRfc2VjdGlvbl9sbWEgbWFjcm8gdG8gY29ycmVzcG9uZAotCXdpdGggYmZkX3NlY3Rpb25fdm1hLgotCi1GcmkgQXByICA0IDExOjM3OjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVcGRhdGUgZmlsZSBuYW1lcyBmb3IgYmZkX2VsZjMyX21uMTBbMjNdMDBfdmVjLgotCUNvcnJlY3QgQ1BVIGZpbGUgbmFtZXMgZm9yIG1uMTBbMjNdMDAuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGJmZC5jIChiZmRfcmVjb3JkX3BoZHIpOiBDYXN0IGNvdW50IHRvIHNpemVfdCBiZWZvcmUKLQlzdWJ0cmFjdGlvbi4KLQotCSogY29mZi1wcGMuYyAoZHVtcF90b2MpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nIGZyb20gU3VuT1MgY2MuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9yZWFkX2FyX2hkcik6IExpa2V3aXNlLgotCSh4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogTElrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSk6IExpa2V3aXNlLgotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IExpa2V3aXNlLgotCShwZV9wcmludF9lZGF0YSwgcGVfcHJpbnRfcGRhdGEsIHBlX3ByaW50X3JlbG9jKTogTGlrZXdpc2UuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBMaWtld2lzZS4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9zZXRfYXJjaF9tYWNoKTogTWFrZSBzdGF0aWMuCi0JKHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19jdG9yNjRfaG93dG8pOiBTZXQgY29tcGxhaW5fb25fb3ZlcmZsb3cKLQl0byBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQuCi0KLVRodSBBcHIgIDMgMTE6NTE6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBWRVJTSU9OOiBTZXQgdG8gMi44LjEuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOC4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogIERvbid0IGNoZWNrIFNFQ19BTExPQyB3aGVuCi0JZGVjaWRpbmcgd2hldGhlciB0byBjb3B5IGEgcmVsb2MgaW50byBhIHNoYXJlZCBvYmplY3QuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLiAgUmVsb2NhdGUgUl9QUENfUkVMQVRJVkUKLQlyZWxvY3MgaW4gdW5hbGxvY2F0ZWQgc2VjdGlvbnMuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVsb2NhdGUKLQlSX1NQQVJDX1JFTEFUSVZFIHJlbG9jcyBpbiB1bmFsbG9jYXRlZCBzZWN0aW9ucy4KLQotV2VkIEFwciAgMiAxNjoxOTo0MSAxOTk3ICBNaWtlIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogVW5kbyBNYXJjaCAyNiBjaGFuZ2UgYW5kCi0JYWx3YXlzIGNyZWF0ZSBnb3Qgc2VjdGlvbiBzbyB0aGF0IHRoZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gbGFiZWwKLQlpcyBhbHdheXMgY3JlYXRlZC4KLQotV2VkIEFwciAgMiAxMDo0OTowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGV0IGEgY29tbW9uIHN5bWJvbAotCW92ZXJyaWRlIGFuIHVuaW5pdGlhbGl6ZWQgc3ltYm9sIGZyb20gYSBzaGFyZWQgbGlicmFyeSB3aXRoIGEKLQlzbWFsbGVyIHNpemUuCi0KLQkqIGVsZi1tMTAyMDAuYzogUmVuYW1lIGZyb20gZWxmMzItbW4xMDIwMC5jLgotCSogZWxmLW0xMDMwMC5jOiBSZW5hbWUgZnJvbSBlbGYzMi1tbjEwMzAwLmMuCi0JKiBjcHUtbTEwMjAwLmM6IFJlbmFtZSBmcm9tIGNwdS1tbjEwMjAwLmMKLQkqIGNwdS1tMTAzMDAuYzogUmVuYW1lIGZyb20gY3B1LW1uMTAzMDAuYwotCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19jdG9yNjRfaG93dG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShlbGZfbWlwc19pc2EpOiBNb3ZlIHRvIGVhcmxpZXIgaW4gZmlsZS4KLQkobWlwc19yZWxvY19tYXApOiBSZW1vdmUgQkZEX1JFTE9DX0NUT1IgZW50cnkuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1IKLQlzcGVjaWFsbHkuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwczE2X2p1bXBfcmVsb2MpOiBQcmludCBhIHdhcm5pbmcgcmF0aGVyIHRoYW4KLQljYWxsaW5nIGFib3J0LgotCi1UdWUgQXByICAxIDE2OjE4OjA1IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWd1cmUuY29tOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5oLXZtczogUmVtb3ZlIGZpbGUuCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSBmb3IgbmV3IGNvbmZpZ3VyZSBzY2hlbWUuCi0KLU1vbiBNYXIgMzEgMjM6Mjg6MzkgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbGliY29mZi1pbi5oIChwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24pOiBEZWNsYXJlLgotCShwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IERlY2xhcmUgaWYgbm90IGEgbWFjcm8uCi0KLU1vbiBNYXIgMzEgMTY6Mjk6NTAgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWcuYmZkIChocHBhKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgaHBwYS0qLSplbGYqLgotCi1Nb24gTWFyIDMxIDE2OjExOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgdXNlIHN5bW5keCBhcyBhCi0Jc3ltYm9sIGluZGV4IGZvciBhIFJfSUhDT05TVCByZWxvYy4KLQotTW9uIE1hciAzMSAxNTo0MDo1OSAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiB0YXJnbWF0Y2guc2VkOiBEbyBub3QgdXNlIFwoXCkgcmVjdXJzaXZlbHkuCi0KLUZyaSBNYXIgMjggMTQ6NDQ6MDggMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbTY4a2xpbnV4LmMgKE1BQ0hUWVBFX09LKTogRGVmaW5lLgotCSogaTM4NmxpbnV4LmMgKE1BQ0hUWVBFX09LKTogRGVmaW5lLgotCi1GcmkgTWFyIDI4IDExOjU2OjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1PiBhbmQgSC5KLiBMdQotCTxoamxAZ251LmFpLm1pdC5lZHU+OgotCSogc3BhcmNsaW51eC5jOiBOZXcgZmlsZS4KLQkqIGJmZC1pbi5oIChiZmRfc3BhcmNsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29uZmlnLmJmZCAoc3BhcmMtKi1saW51eGFvdXQqLCBzcGFyYy0qLWxpbnV4Kik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChzcGFyY2xpbnV4X3ZlYyk6IEFkZCB0byBsaXN0IG9mIHZlY3RvcnMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiB0YXJnZXRzLmMgKHNwYXJjbGludXhfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgc3BhcmNsaW51eF92ZWMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHNwYXJjbGludXguby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIHNwYXJjbGludXguYy4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcKLQliZmRfY29mZl9iYWNrZW5kX2RhdGEgZmllbGQuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcuYmZkOiBBZGQgYmZkX2VsZjY0X3tiaWcsbGl0dGxlfW1pcHNfdmVjIHRvIHRhcmdfc2VsdmVjcwotCWZvciBtaXBzKmVsKi0qLWxpbnV4KiBhbmQgbWlwcyotKi1saW51eCouICBGcm9tIEguSi4gTHUKLQk8aGpsQGx1Y29uLm9yZz4gYW5kIFJhbGYgQmFlY2hsZSA8cmFsZkBnbnUuYWkubWl0LmVkdT4uCi0KLQkqIGJmZC5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCi0JKHN0cmVycm9yKTogRG9uJ3QgZGVjbGFyZS4KLQkoYmZkX2Vycm1zZyk6IENhbGwgeHN0cmVycm9yIHJhdGhlciB0aGFuIHN0cmVycm9yLgotCi1UaHUgTWFyIDI3IDEyOjU1OjQyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBHZW5lcmF0ZSBhIENPUFkKLQlyZWxvYyBldmVuIGlmIHRoZSBzeW1ib2wgaXMgaW4gdGhlIC5ic3Mgc2VjdGlvbi4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkCi0JX2JmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIuCi0JKGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIpOiBEZWZpbmUuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaW1pdCBhbGlnbm1lbnQgb2YgYSBjb21tb24KLQlzeW1ib2wgdG8gdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQuCi0KLQkqIENPUFlJTkc6IFVwZGF0ZSBGU0YgYWRkcmVzcy4KLQotVGh1IE1hciAyNyAwMDo0NTo1NyAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDMwdi5jIChlbGZfZDMwdl9ob3d0b190YWJsZSk6IEZpeCBhIHR5cG8gaW4gdGhlCi0JMjEtYml0IGFic29sdXRlIHRoYXQgbWFkZSBpdCBhY3QgYXMgYSByZWxhdGl2ZS4KLQotV2VkIE1hciAyNiAxNDo1MDoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogRG9uJ3Qgc2V0Ci0JYnNzX3NlY3Rpb24gYW5kIHJlbF9zZWN0aW9uIGZyb20gZXhpc3Rpbmcgc2VjdGlvbnMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IE9ubHkgY3JlYXRlIHRoZSBnb3Qgc2VjdGlvbgotCWlmIGl0IGlzIG5lZWRlZC4KLQotVHVlIE1hciAyNSAyMjoyNjo1NiAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiAgQ2hhbmdlIGV4ZWN1dGFibGUgdGVzdCB0byBmaXgKLQlwcm9ibGVtcyB3aXRoIGVtYmVkZGVkIGEub3V0IHN5c3RlbXMuCi0KLVR1ZSBNYXIgMjUgMTQ6MzU6MzcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0KTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRqdXN0IHRoZSBvZmZzZXQgb2YgYQotCXN0YWIgcmVsb2MuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBzdGFicy5jIChfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyk6IENvcHkgb3ZlciB0aGUgZmlyc3QgaGVhZGVyCi0Jc3ltYm9sLiAgQ2hlY2sgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgb2YgKnBzaW5mby4KLQkoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzKTogQWRkIHBzaW5mbyBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIFNldCB0aGUgdmFsdWUgb2YgdGhlIGhlYWRlciBzeW1ib2wuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLU1vbiBNYXIgMjQgMjA6MDc6MjkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAodGljODBfaG93dG9fdGFibGUpOiBBZGQgUl9BQlMgZW50cnkuCi0JKHJ0eXBlMmhvd3RvKTogSGFuZGxlIFJfQUJTIHJlbG9jIHR5cGUuICBBbHNvIGFib3J0IG9uIHVuaGFuZGxlZAotCXJlbG9jIHR5cGVzLCByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWlsaW5nIHRvIGdlbmVyYXRlIGFuIG91dHB1dCBmaWxlLgotCi1Nb24gTWFyIDI0IDEzOjQxOjAwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ21hdGNoLnNlZDogVXNlIHRoZSBob2xkIHNwYWNlIHRvIHB1dCB0aGUgI2lmZGVmIGFyb3VuZCB0aGUKLQl0aGUgc3RyaW5nIGNvbnN0YW50LgotCSogdGFyZ2V0cy5jIChVTlNVUFBPUlRFRF9UQVJHRVQpOiBEb24ndCBkZWZpbmUuCi0JKGZpbmRfdGFyZ2V0KTogRG9uJ3QgY2hlY2sgZm9yIFVOU1VQUE9SVEVEX1RBUkdFVC4KLQkoYmZkX3NldF9kZWZhdWx0X3RhcmdldCk6IERvbid0IHRyeSB0byBvcHRpbWl6ZSBieSBjaGVja2luZyBmb3IKLQlkZWZhdWx0LgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS1tMzJyLmMuCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYzMi1tMzJyLmMuCi0JKGVsZjMyLW0zMnIubyk6IFJlbW92ZSBleHBsaWNpdCB0YXJnZXQuCi0KLQkqIGNvbmZpZy5iZmQ6IERvbid0IHNldCB0YXJnX3VuZGVyc2NvcmUgZm9yIGlbMzQ1Nl04Ni0qLWdudSogb3IKLQlpWzM0NTZdODYtKi1saW51eCouCi0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0Ci0JY291bnQgc2VjdGlvbiBzeW1ib2xzIGZvciBzZWN0aW9ucyB0aGF0IHdlcmUgY3JlYXRlZCBieSB0aGUKLQlsaW5rZXIsIG9yIGFyZSBub3QgYWxsb2NhdGFibGUgb3Igbm90IGxvYWRhYmxlLgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE91dHB1dCBvdXRwdXQgc2VjdGlvbgotCXN5bWJvbHMgZm9yIHNlY3Rpb24gZm9yIHdoaWNoIHdlIG1hZGUgc3BhY2UgZm9yIHRoZW0uCi0KLUZyaSBNYXIgMjEgMTM6MDg6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiB0aGVyZSBpcwotCW5vIC5yZWxhLnBsdCBzZWN0aW9uLCBkb24ndCBvdXRwdXQgYSBEVF9QTFRHT1QgZHluYW1pYyBlbnRyeS4KLQotRnJpIE1hciAyMSAxMjozNjo0NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX2hvd3RvX3RhYmxlKTogVXNlIHNwZWNpYWwgZnVuY3Rpb24gZm9yIExPMTYuCi0JKG0zMnJfaGkxNl9saXN0KTogTmV3IHN0YXRpYyBsb2NhbC4KLQkobTMycl9lbGZfaGkxNl9yZWxvYyk6IERvbid0IHBlcmZvcm0gcmVsb2MsIGp1c3QgcXVldWUgaXQgdXAuCi0JKG0zMnJfZWxmX2RvX2hpMTZfcmVsb2MpOiBEZWxldGUuCi0JKG0zMnJfZWxmX3JlbG9jYXRlX2hpMTYpOiBOZXcgZnVuY3Rpb24uCi0JKG0zMnJfZWxmX2xvMTZfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGb3IgSEkxNiByZWxvY3MsIHNjYW4gZm9yIGNvcnJlc3BvbmRpbmcKLQlMTzE2IHJlbG9jLgotCi0JTW9uIE1hciAxMCAxNjowMzozMSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBEZWxldGUuCi0JKG0zMnJfZWxmX2FkZF9zeW1ib2xfaG9vayk6IFJld3JpdGUgX1NEQV9CQVNFXyBzdXBwb3J0LgotCShtMzJyX2VsZl9maW5hbF9zZGFfYmFzZSk6IE5ldyBmdW5jdGlvbi4KLQkobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJld3JpdGUgc2RhdGEgc3VwcG9ydC4KLQkobTMycl9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWxldGUuCi0KLVRodSBNYXIgMjAgMTI6Mzk6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uCi0JKiBjb2ZmLXN2bTY4ay5jOiBOZXcgZmlsZS4gIEp1c3QgZGVmaW5lcyBzb21lIG1hY3JvcyBhbmQgaW5jbHVkZXMKLQljb2ZmLW02OGsuYy4KLQkqIGNvZmYtbTY4ay5jOiBBZGQgZnVuY3Rpb25zIHRvIGhhbmRsZSBjb21tb24gYWRkZW5kcywgbW92ZWQgaW4KLQlmcm9tIGNmLW02OGtseW54LmMuICBDb250cm9sIHRoZW0gdXNpbmcgQ09GRl9DT01NT05fQURERU5EIG1hY3JvLgotCUNvbnRyb2wgd2hldGhlciByZWxvY3MgYXJlIHZpc2libGUgdXNpbmcgU1RBVElDX1JFTE9DUy4KLQkqIGNmLW02OGtseW54LmM6IFNpbXBsaWZ5IGdyZWF0bHk6IGp1c3QgZGVmaW5lIG1hY3JvcyB0byBjb250cm9sCi0JY29mZi1tNjhrLmMuCi0JKiBjb2ZmLWF1eC5jOiBMaWtld2lzZS4gIEp1c3QgbGVhdmUgYWRkX29uZV9zeW1ib2wgcm91dGluZS4KLQkqIHRhcmdldHMuIChtNjhrc3lzdmNvZmZfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgbTY4a3N5c3Zjb2ZmX3ZlYy4KLQkqIGNvbmZpZy5iZmQgKG02OCotbW90b3JvbGEtc3lzdiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChtNjhrc3lzdmNvZmZfdmVjKTogTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtc3ZtNjhrLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBjb2ZmLXN2bTY4ay5jLgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QgZ2V0IG1pc2xlZCBpZiB0aGUKLSAJZmlyc3Qgc2VjdGlvbiBpcyBub3QgbG9hZGFibGUuICBGcm9tIE1hdHRoZXcgTC4gTWFydGluCi0gCTxtbG1AeGVkaWEuY29tPi4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBTZXQgdGhlIHZhbHVlIG9mIGEgc2VjdGlvbgotCXN5bWJvbCB0byB0aGUgc2VjdGlvbiBhZGRyZXNzIHVubGVzcyBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLgotCi1UdWUgTWFyIDE4IDIzOjAzOjE3IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBjcmVhdGUKLQkucGx0IGVudHJ5IGlmIHdlJ3ZlIHRha2VuIHRoZSBmdW5jdGlvbidzIGFkZHJlc3MuCi0JKGVsZjY0X2FscGhhX21lcmdlX2dvdHMpOiBNZXJnZSBjb2xsZWN0ZWQgZmxhZ3MgaW5mbyBhcyB3ZWxsLgotCi1UdWUgTWFyIDE4IDIyOjQwOjA5IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBNYW55IGZpbGVzOiBBZGQgZnVuY3Rpb24gcHJvdG90eXBlcy4KLQkqIGNwdS1tNjhrLmMgKGJmZF9kZWZhdWx0X3NjYW5fbnVtX21hY2gpOiBEb24ndCBkZWNsYXJlLgotCSogZWNvZmZsaW5rLmM6IEluY2x1ZGUgImxpYmNvZmYuaCIgYW5kICJsaWJlY29mZi5oIi4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBNYWtlIHN0YXRpYy4KLQkqIG9wbmNscy5jIChiZmRfb3BlbnN0cmVhbXIpOiBDaGFuZ2Ugc3RyZWFtIHBhcmFtZXRlciB0byBQVFIuCi0JKiBwZWljb2RlLmg6IENoYW5nZSBzZXZlcmFsIHZvaWQgKiBwYXJhbWV0ZXJzIHRvIFBUUi4KLQkqIHNyZWMuYyAoc3JlY19nZXRfc3ltYm9sX2luZm8pOiBNYWtlIHN0YXRpYy4KLQkqIHN5bXMuYyAoYmZkX3N5bWJvbF9pc19hYnNvbHV0ZSk6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotVHVlIE1hciAxOCAxMjo1ODowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IFJlbW92ZS4KLQkoYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbCk6IERvbid0IGRlZmluZS4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBDYWxsIGJmZF9tYWxsb2MgcmF0aGVyCi0JdGhhbiBtYWxsb2MuCi0KLU1vbiBNYXIgMTcgMTE6MzI6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaDogRG9uJ3QgaW5jbHVkZSBvYnN0YWNrLmguCi0JKHN0cnVjdCBiZmRfaGFzaF90YWJsZSk6IENoYW5nZSBtZW1vcnkgZmllbGQgdG8gUFRSLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQ2hhbmdlIG1lbW9yeSBmaWVsZCB0byBQVFIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX3JlbGVhc2UpOiBEZWNsYXJlIGFzIGZ1bmN0aW9uLCBkb24ndCBkZWZpbmUgYXMKLQltYWNyby4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogb3BuY2xzLmM6IEluY2x1ZGUgIm9iamFsbG9jLmgiIHJhdGhlciB0aGFuICJvYnN0YWNrLmgiLiAgVXNlCi0Jb2JqYWxsb2Mgcm91dGluZXMgcmF0aGVyIHRoYW4gb2JzdGFjayByb3V0aW5lcy4KLQkob2JzdGFja19jaHVua19hbGxvYywgb2JzdGFja19jaHVua19mcmVlKTogRG9uJ3QgZGVmaW5lLgotCShnZXRwYWdlc2l6ZSk6IERvbid0IGRlZmluZS4KLQkoX2JmZF9uZXdfYmZkKTogRG9uJ3Qgc2V0IF9iZmRfY2h1bmtzaXplLgotCShiZmRfb3BlbnIpOiBGcmVlIG5ldyBiZmQgYW5kIG9iamFsbG9jIG9uIGZhaWx1cmUuCi0JKGJmZF9mZG9wZW5yLCBiZmRfb3BlbnN0cmVhbXIsIGJmZF9vcGVudyk6IExpa2V3aXNlLgotCShiZmRfYWxsb2Nfc2l6ZSk6IFJlbW92ZS4KLQkoYmZkX3JlbGVhc2UpOiBOZXcgZnVuY3Rpb24uCi0JKiBoYXNoLmM6IEluY2x1ZGUgIm9iamFsbG9jLmgiIHJhdGhlciB0aGFuICJvYnN0YWNrLmgiLiAgVXNlCi0Jb2JqYWxsb2Mgcm91dGluZXMgcmF0aGVyIHRoYW4gb2JzdGFjayByb3V0aW5lcy4KLQkob2JzdGFja19jaHVua19hbGxvYywgb2JzdGFja19jaHVua19mcmVlKTogRG9uJ3QgZGVmaW5lLgotCSogZWNvZmZsaW5rLmM6IEluY2x1ZGUgIm9iamFsbG9jLmgiIHJhdGhlciB0aGFuICJvYnN0YWNrLmgiLiAgVXNlCi0Jb2JqYWxsb2Mgcm91dGluZXMgcmF0aGVyIHRoYW4gb2JzdGFjayByb3V0aW5lcy4KLQkob2JzdGFja19jaHVua19hbGxvYywgb2JzdGFja19jaHVua19mcmVlKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgYWNjdW11bGF0ZSk6IENoYW5nZSBtZW1vcnkgdG8gc3RydWN0IG9iamFsbG9jICouCi0JKiBsaWJvYXN5cy5oIChvYXN5c19kYXRhX3R5cGUpOiBSZW1vdmUgb2FzeXNfb2JzdGFjayBmaWVsZC4KLQkqIGRlcC1pbi5zZWQ6IERvbid0IHJlbW92ZSBvYnN0YWNrLmggZnJvbSBkZXBlbmRlbmN5IGxpc3QuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9IX0RFUFMpOiBSZW1vdmUgb2JzdGFjay5oLgotCShpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBvYnN0YWNrLmguCi0JKiBNYW55IGZpbGVzOiBEb24ndCBpbmNsdWRlICJvYnN0YWNrLmgiLgotCSogVkVSU0lPTjogQnVtcC4KLQotCSogb3BuY2xzLmMgKGJmZF9hbGxvY19ncm93LCBiZmRfYWxsb2NfZmluaXNoKTogUmVtb3ZlLgotCSogbGliYmZkLWluLmggKGJmZF9hbGxvY19ncm93LCBiZmRfYWxsb2NfZmluaXNoKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogaWVlZS5jIChpZWVlX2FyY2hpdmVfcCk6IFJld3JpdGUgdG8gbm90IHVzZSBiZmRfYWxsb2NfZ3Jvdy4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogUmV3cml0ZSB0byBub3QgdXNlIG9ic3RhY2tfMWdyb3cuCi0KLQkqIG9wbmNscy5jIChiZmRfYWxsb2MpOiBSZW5hbWUgZnJvbSBiZmRfYWxsb2NfYnlfc2l6ZV90LiAgUmVtb3ZlCi0Jb2xkIHZlcnNpb24gb2YgYmZkX2FsbG9jLgotCSogbGliYmZkLWluLmggKGJmZF9hbGxvY19ieV9zaXplX3QpOiBEb24ndCBkZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBTZXZlcmFsIGZpbGVzOiBDYWxsIGJmZF9hbGxvYyByYXRoZXIgdGhhbiBiZmRfYWxsb2NfYnlfc2l6ZV90LgotCi1TYXQgTWFyIDE1IDE1OjI0OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogQWNjZXB0IHRoZSBnZW5lcmljCi0JRUxGIGxvY2FsIGxhYmVsIHN5bnRheCBhcyB3ZWxsLgotCi1TYXQgTWFyIDE1IDEwOjE2OjQyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjLSotYmVvcyopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChwb3dlcnBjLSotYmVvcyopOiBBZGQgY2FzZSB0aGF0IGV4cGxpY2l0bHkKLQlkb2VzIG5vdCBzZXQgQ09SRUZJTEUgZm9yIG5vdy4gIEEgZnV0dXJlIEJlT1MgdmVyc2lvbiBpcwotCWV4cGVjdGVkIHRvIHN1cHBvcnQgY29yZSBmaWxlcy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgotCi1GcmkgTWFyIDE0IDE2OjQzOjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBHaXZlIGFuIGVycm9yIGlmIENBTEwxNiBpcwotIAlzZWVuIHdpdGggYSBsb2NhbCBzeW1ib2wsIHJhdGhlciB0aGFuIGNyYXNoaW5nLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCB0cnkgdG8gcmVhZCB0aGUKLQl2ZXJzaW9uIHN5bWJvbHMgaWYgdGhlcmUgYXJlbid0IGFueS4KLQotVGh1IE1hciAxMyAxNjozODozMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jIChjb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lCi0JKGNvZmZfdGljODBfcnR5cGVfdG9faG93dG8pOiBDbG9uZSBnZW5lcmljIGNvZmYgdmVyc2lvbiBhbmQKLQlhZGQgY29kZSB0byBoYW5kbGUgdGhlIGZ1bmt5IFRJICJpbnRlcm5hbCByZWxvY2F0aW9ucyIuCi0KLVRodSBNYXIgMTMgMTQ6MDg6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IHdhcm4gYWJvdXQgdHlwZQotCW9yIHNpemUgY2hhbmdlcyBiZWNhdXNlIG9mIGEgd2VhayBzeW1ib2wuCi0KLQkqIGNpc2NvLWNvcmUuYyAoU0lHRU1UKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCi1XZWQgTWFyIDEyIDIxOjM2OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgZXh0c3ltb2ZmIHdoZW4KLQlzZXR0aW5nIGV2ZXIuICBTYW5pdHkgY2hlY2sgdGhlIHZlcnNpb24gbnVtYmVyLiAgU29ydCBvdXQgY29weWluZwotCWZsYWdzIGFuZCBvdGhlciBpbmZvcm1hdGlvbiB3aGVuIGFkZGluZyBhbiBpbmRpcmVjdCBzeW1ib2wuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogUHJlc2VydmUgYW55IGR5bmFtaWMKLQlzeW1ib2xzIGFkZGVkIGJ5IHRoZSBiYWNrZW5kLiAgQ2xlYXIgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUKLQl2ZXJzeW0gc2VjdGlvbi4KLQkoZWxmX2V4cG9ydF9zeW1ib2wpOiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IEFjY2VwdCBhIHNlY3Rpb24gd2l0aG91dCBhbiBvd25lciBpbiBhbgotCWFzc2VydC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEFkZCBhIHNhbml0eSBjaGVjayBvbiB0aGUKLQl2ZXJzaW9uIGNvdW50LiAgQ29ycmVjdCB0aGUgYWxsb2NhdGlvbiBvZiB4X3ZlcnN5bXAuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogRG9uJ3Qgc2V0IHRoZSBvd25lciBvZgotCXRoZSBtYWdpYyBzZWN0aW9ucyB1c2VkIGZvciBTSE5fTUlQU19URVhUIGFuZCBTSE5fTUlQU19EQVRBLgotCURvbid0IHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyIHdoZW4gaW5mby0+c2hhcmVkLgotCShtaXBzX2VsZl9maW5hbF9saW5rKTogU2V0IHRoZSBhbGlnbm1lbnQgb2YgLnJ0cHJvYyB0byA0LCBub3QgMTIuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ29ycmVjdCB0eXBlOiBePSBmb3IgJj0uCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlc29sdmUgYW4gaW5kaXJlY3Qgc3ltYm9sIGluCi0Jc3ltX2hhc2hlcy4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgY2hhbmdlIFNITl9BQlMgaW50bwotCVNITl9NSVBTX1RFWFQgb3IgU0hOX01JUFNfREFUQS4KLQotCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogVHdlYWsgdmVyc2lvbiBvdXRwdXQgc2xpZ2h0bHkuCi0KLVR1ZSBNYXIgMTEgMDE6Mzg6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogZWxmLWJmZC5oIChFTEZfTElOS19GT1JDRURfTE9DQUwpOiBEZWZpbmUuCi0JKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBDb3JyZWN0IGVycm9ycyBpbiBsYXN0IGNoYW5nZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSGFuZGxlIGNhc2VzIGluIHdoaWNoIGEKLQl2ZXJzaW9uZWQgc3ltYm9sIGFwcGVhcnMgaW4gYm90aCBhIHJlZ3VsYXIgYW5kIGEgc2hhcmVkIG9iamVjdC4KLQkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogU2V0IEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCB3aGVuCi0JYXBwcm9wcmlhdGUuICBJbXByb3ZlIGVycm9yIG1lc3NhZ2UuCi0JKHN0cnVjdCBlbGZfb3V0ZXh0X2luZm8pOiBSZW5hbWUgZnJvbSBlbGZfZmluZm9fZmFpbGVkLiAgQ2hhbmdlCi0JYWxsIHVzZXMuICBBZGQgbG9jYWxzeW1zIGZpZWxkLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgY2FsbAotCWVsZl9saW5rX291dHB1dF9leHRzeW0gdG8gb3V0cHV0IGFsbCBsb2NhbCBzeW1ib2xzLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSGFuZGxlIHN5bWJvbHMgd2hpY2ggd2VyZSBmb3JjZWQgdG8KLQliZWNvbWUgbG9jYWwuCi0KLVN1biBNYXIgIDkgMjM6MDg6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogZWxmLWJmZC5oIChlbGZfc3ltYm9sX3R5cGUpOiBBZGQgdmVyc2lvbiBmaWVsZC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCB2ZXJzaW9uIGZpZWxkLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBXaGVuIGNyZWF0aW5nIGFuCi0gCWluZGlyZWN0IHN5bWJvbCBmb3IgYSBkZWZhdWx0IHZlcnNpb24gc3ltYm9sLCBzZXQgREVGX0RZTkFNSUMgaWYKLSAJYXBwcm9wcmlhdGUuICBTZXQgdXAgYW4gaW5kaXJlY3Rpb24gZnJvbSB0aGUgbm9uZGVmYXVsdCB2ZXJzaW9uIG9mCi0JdGhlIHN5bWJvbCBhcyB3ZWxsLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IENhbGwKLQllbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24gYmVmb3JlIGNoZWNraW5nIHdoZXRoZXIgdGhlcmUgYXJlIGFueQotCXZlcnNpb25zLiAgQWx3YXlzIHJlY29yZCB0aGUgdmVyc2lvbiBuYW1lIGFzIGEgZHluYW1pYyBzeW1ib2wuCi0JSW5pdGlhbGl6ZSBjb3VudGVycy4KLQkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogQWZ0ZXIgZmluZGluZyBhIHZlcnNpb24sIHNlZSBpZiBhCi0Jc3ltYm9sIHNob3VsZCBiZSBmb3JjZWQgdG8gbG9jYWwgc2NvcGUuICBDcmVhdGUgYSBuZXcgdmVyc2lvbgotCWRlZmluaXRpb24gaWYgYXBwcm9wcmlhdGUuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBDb3JyZWN0IGluZGlyZWN0IHN5bWJvbCBoYW5kbGluZy4KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24uCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFR1cm4gdmVyc2lvbiBzZWN0aW9ucyBpbnRvIEJGRCBzZWN0aW9ucy4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBPbmx5IGNvcHkgY3ZlcmRlZnMgYW5kIGN2ZXJyZWZzIGludG8gc2hfaW5mbwotCWlmIHNoX2luZm8gaXMgbm90IGFscmVhZHkgc2V0LgotCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ29weSBzaF9pbmZvIGZvciB2ZXJzaW9uCi0Jc2VjdGlvbnMuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogVGVsbAotCV9iZmRfc3RyaW5ndGFiX2FkZCB0byBjb3B5IHRoZSBuYW1lIGludG8gcGVybWFuZW50IG1lbW9yeSBpZgotCWFwcHJvcHJpYXRlLgotCi1GcmkgTWFyICA3IDExOjU1OjMxIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogRnVsbHkgcGFyZW50aGVzaXplLgotCi1GcmkgTWFyICA3IDEwOjM3OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQ2hhbmdlCi0JX2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyB0byByZXR1cm4gYSBib29sZWFuCi0JdmFsdWUuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvCi0JYm9vbGVhbi4gIElmIHRoZSBzaXplIG9mIHRoZSBsYXN0IHNlY3Rpb24gY2hhbmdlZCwgdGhlbiBvdXRwdXQgYQotCXplcm8gYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IEFsd2F5cyBhbGxvY2F0ZSBzcGFjZQotCWZvciBhdCBsZWFzdCA2IG91dHB1dCBzeW1ib2xzLgotCSh4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sKTogV2hlbiBlbWl0dGluZyBUT0MgZW50cnkgcmVsb2NzLCBhbHNvCi0JZW1pdCBhIFRDIGNzZWN0IHRvIHJlcHJlc2VudCB0aGUgc3BhY2UgdGhleSB0YWtlIHVwLiAgRm9yIGFuIFhPCi0Jc3ltYm9sLCBqdXN0IGVtaXQgYSByZWZlcmVuY2UsIG5vdCBhIGNzZWN0LgotCi0JKiBNYWtlZmlsZS5pbiAoJChTSExJTkspKTogSnVzdCB1c2UgbG4gLXMsIG5vdCBsbiAtc2YsIHNpbmNlCi0JU29sYXJpcyBkb2Vzbid0IGxpa2UgdGhlIGNvbWJpbmVkIG9wdGlvbnMsIGFuZCB0aGUgLWYgaXMKLQl1bm5lY2Vzc2FyeS4KLQkoc3RhbXAtdHNobGluaywgaW5zdGFsbCk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IFJfTUlQUzE2XzI2Ci0JaGFuZGxpbmcgd2hlbiBsaXR0bGUgZW5kaWFuLgotCi1UaHUgTWFyICA2IDEzOjUxOjUxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgotCShtbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAocmVsb2NfdHlwZSk6IFJlbW92ZSBQQ1JFTHs4LDE2LDMyfV97MSwyfUJZVEUKLQlyZWxvY3MuICBSZXBsYWNlIHRoZW0gd2l0aCBnZW5lcmljIFBDUkVMX3s4LDE2LDMyfSByZWxvY3MuCi0JKGVsZjMyX21uMTAzMDBfaG93dG9fdGFibGUpOiBMaWtld2lzZS4KLQkoZWxmMzJfbW4xMDMwMF9yZWxvY19tYXApOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX21uMTAzMDBfcmVsb2MpOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgotCi1UaHUgTWFyICA2IDEyOjE5OjU5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHJ0eXBlMmhvd3RvKTogSWYgcGFzc2VkIGEgcmVsb2NhdGlvbiB0eXBlIHdlIGRvbid0Ci0JdW5kZXJzdGFuZCwganVzdCBzZXQgdGhlIGhvd3RvIGZpZWxkIHRvIE5VTEwsIGFuZCB0aGUgY2FsbGVyIHdpbGwKLQlwcmludCBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9yZWxvY190YWJsZSk6IFB1bGwgZHVwbGljYXRlIGRlY2xhcmF0aW9ucyBhbmQKLQljb2RlIGZyYWdtZW50IG91dCBvZiBib3RoIGxlZ3Mgb2YgI2lmZGVmIFJFTE9DX1BST0NFU1NJTkcgLi4uICNlbmRpZgotCWJsb2NrLiAgVXNlIE5VTEwgZm9yIGluaXRpYWxpemF0aW9ucyBvZiAicHRyIiByYXRoZXIgdGhhbiBiYXJlIDAuCi0JKiBjb2ZmLWg4MzAwLmM6IEZpeCB0eXBvIGluIGNvbW1lbnQuCi0JKiBjb2ZmLWg4NTAwLmM6IERpdHRvLgotCSogY29mZi13NjUuYzogRGl0dG8KLQkqIGNvZmYtejhrLmM6IERpdHRvLgotCi1XZWQgTWFyICA1IDEzOjU5OjA5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jKTogRml4IG92ZXJmbG93IGNhbGMuCi0JKG0zMnJfZWxmX3JlbGF4X3NlY3Rpb24sIG0zMnJfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcywKLQltMzJyX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBGaXJzdCBwYXNzIGF0IHJlbGF4IHN1cHBvcnQuCi0KLU1vbiBNYXIgIDMgMTM6Mjc6MDkgMTk5NyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQHJ0bC5jeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBjb3JyZWN0IHNoX3NpemUKLQllbnRyeSBmb3IgcmVhZGluZyB2ZXJkZWYgcmVjb3Jkcy4KLQlVc2UgY29ycmVjdCBicmFjZXMgZm9yIGNvbXB1dGluZyBpbmNyZW1lbnRzIG9mIGV4dHZlcmRhdXggYW5kCi0JZXh0ZXZlcmRlZiByZWNvcmQgcG9pbnRlcnMuCi0KLVN1biBNYXIgIDIgMjI6NDc6NTQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAoQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSKTogU2V0IHRoaXMgdG8gMgotCWluc3RlYWQgb2YgNC4KLQotU3VuIE1hciAgMiAxNjoyNTozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcyk6IENoZWNrIHRoYXQKLQlERUZfUkVHVUxBUiBpcyBub3Qgc2V0IGFzIHdlbGwgYXMgY2hlY2tpbmcgdGhhdCBERUZfRFlOQU1JQyBpcwotCXNldC4KLQotRnJpIEZlYiAyOCAxNjo1Mjo0MCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfZmxhZ3MpOiBBZGQgY2FzZSBmb3IgVElDODBfQVJDSF9NQUdJQy4KLQotRnJpIEZlYiAyOCAxNTowNjo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoYmZkX2RlZmF1bHRfdmVjdG9yKTogTWFrZSBub24tY29uc3QuCi0JKGZpbmRfdGFyZ2V0KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCWJmZF9maW5kX3RhcmdldC4KLQkoYmZkX3NldF9kZWZhdWx0X3RhcmdldCk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2ZpbmRfdGFyZ2V0KTogQ2FsbCBmaW5kX3RhcmdldC4gIFdoZW4gZGVmYXVsdGluZywgdXNlCi0JYmZkX2RlZmF1bHRfdmVjdG9yWzBdIGlmIGl0IGlzIG5vdCBOVUxMLgotCSogbGliYmZkLWluLmggKGJmZF9kZWZhdWx0X3ZlY3Rvcik6IEFkanVzdCBkZWNsYXJhdGlvbi4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIHN5bXMuYyAoYmZkX2lzX2xvY2FsX2xhYmVsKTogUmV0dXJuIGZhbHNlIGlmIHRoZSBzeW1ib2wgaGFzIG5vCi0JbmFtZS4KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLQkqIGNvZmYtbTY4ay5jIChtNjhrX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IFRyZWF0IHN5bWJvbHMgYmVnaW5uaW5nCi0Jd2l0aCAuLiBvciBfLkxfIGFzIGxvY2FsLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBUcmVhdCBzeW1ib2xzCi0JYmVnaW5uaW5nIHdpdGggJCBhcyBsb2NhbC4KLQotVGh1IEZlYiAyNyAxODozNjoyMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogVXNlIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0JcmF0aGVyIHRoYW4gY29tcGFyaW5nIGFnYWluc3QgaW5mby0+bHByZWZpeC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IExpa2V3aXNlLgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUgYXMKLQlfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlY2xhcmUuCi0KLQkqIGNvZmYtbTg4ay5jIChjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgotCShtODhrX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lIGFzCi0JX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkqIGNvZmZnZW4uYyAoX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJjb2ZmLWluLmggKF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogdGFyZ2V0cy5jIChCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKTogQ2hhbmdlIF9iZmRfaXNfbG9jYWxfbGFiZWwKLQl0byBfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUuCi0JKGJmZF90YXJnZXQpOiBMaWtld2lzZS4KLQkqIHN5bXMuYyAoYmZkX2lzX2xvY2FsX2xhYmVsKTogRGVmaW5lIGFzIGZ1bmN0aW9uLCBub3QgbWFjcm8uCi0JKGJmZF9pc19sb2NhbF9uYW1lKTogRGVmaW5lLgotCSogbGliYmZkLmMgKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBSZW5hbWUgZnJvbQotCWJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsLCBhbmQgdGFrZSBhIHN0cmluZyByYXRoZXIgdGhhbiBhCi0Jc3ltYm9sLgotCSogbGliYmZkLWluLmggKF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbCk6IERvbid0IGRlZmluZS4KLQkoX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0gCShiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbCk6IERvbid0IGRlY2xhcmUuCi0JKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIEFsbCBiYWNrZW5kczogQ2hhbmdlIGxvY2FsX2xhYmVsIHRvIGxvY2FsX2xhYmVsX25hbWUuCi0KLQkqIGVsZjMyLW1pcHMuYyAoc3RydWN0IG1pcHNfZ290X2luZm8pOiBBZGQgYXNzaWduZWRfZ290bm8gZmllbGQuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX2dvdF9sb2NhbCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCURvbid0IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCB6ZXJvIGVudHJ5IGlzIHVuYXNzaWduZWQ7IGluc3RlYWQsIHVzZQotCWFzc2lnbmVkX2dvdG5vLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JbWlwc19lbGZfcmVsb2NhdGVfZ290X2xvY2FsLgotCShtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBJbml0aWFsaXplIGFzc2lnbmVkX2dvdG5vIGZpZWxkLgotCi1XZWQgRmViIDI2IDE1OjE5OjUxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvYyk6IEFkZCBjb2RlIHRvIGRvIDMyLWJpdAotCXJlbG9jYXRpb25zLgotCi1XZWQgRmViIDI2IDEzOjMzOjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBza2lwIHN5bWJvbHMgZnJvbSBzZWN0aW9ucwotCXRoYXQgaGF2ZSBubyBjb250ZW50cyBtZXJlbHkgYmVjYXVzZSBsaW5rZXJfbWFyayBpcyBub3Qgc2V0LgotCi1UdWUgRmViIDI1IDE4OjUxOjM1IDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAobWlwcyotKi1sbmV3cyopOiBOZXcgdGFyZ2V0LgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IE1ha2UgYXNzZXJ0IGNvbXBhcmUKLQljb250ZW50IGJ5dGVvcmRlciBpbnN0ZWFkIG9mIGhlYWRlciBieXRlb3JkZXIuCi0JKGVjb2ZmX2JpZ2xpdHRsZV92ZWMpOiBOZXcgQkZELCBiaWctZW5kaWFuIGhlYWRlcnMsIGxpdHRsZS1lbmRpYW4KLQlkYXRhLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBlY29mZl9iaWdsaXR0bGVfdmVjLgotCSogY29uZmlndXJlLmluIChlY29mZl9iaWdsaXR0bGVfdmVjKTogQWRkIGNhc2UuCi0JKiBjb25maWd1cmU6IFVwZGF0ZS4KLQotVHVlIEZlYiAyNSAwMDozMjo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChlbGZfZmFrZV9zZWN0aW9ucyk6IFVzZSBTSFRfTk9URSBmb3IgYW55IHNlY3Rpb24gd2hvc2UKLQluYW1lIGJlZ2lucyB3aXRoICIubm90ZSIuCi0JKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IEFkZCBhIFBUX05PVEUgc2VnbWVudCBmb3IgYW55IGxvYWRhYmxlCi0Jc2VjdGlvbiB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoICIubm90ZSIuCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIGZvciBtaXNhbGlnbmVkCi0JamFsIGFuZCBmb3IgamFsIG92ZXJmbG93LgotCi1Nb24gRmViIDI0IDE3OjUzOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IElmIGEgZGVmYXVsdCBzeW1ib2wgaXMKLQlub3QgZm91bmQsIHRyeSBsb29raW5nIGl0IHVwIGFnYWluIHdpdGhvdXQgdGhlIHZlcnNpb24gbmFtZS4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQWx3YXlzIGxpbmsgYWdhaW5zdCB0aGUgZHluYW1pYwotCXN5bWJvbCB0YWJsZSBvZiBhIGR5bmFtaWMgb2JqZWN0LiAgV2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljCi0Jb2JqZWN0LCBpbmNsdWRlIHZlcnNpb24gc3RyaW5ncyBpbiBzeW1ib2wgbmFtZXMsIGFuZCBzZXQgdXAKLQl2ZXJzaW9uIGluZm9ybWF0aW9uLiAgQWRkIGluZGlyZWN0IHN5bWJvbHMgZm9yIGRlZmF1bHQgdmVyc2lvbnMuCi0JKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIHNwZWNpYWwgdmVyc2lvbiBzZWN0aW9ucy4KLQkoc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9maW5kX3ZlcmRlcF9pbmZvKTogRGVmaW5lLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZCB2ZXJkZWZzIHBhcmFtZXRlci4gIFNldAotCXVwIHZlcnNpb24gc2VjdGlvbnMuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4KLQkoZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9saW5rX3JlbnVtYmVyX2R5bnN5bXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBzeW12ZXJfc2VjIGZpZWxkLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGZpbmZvLnN5bXZlcl9zZWMuICBEb24ndCBjb3VudAotCWxvY2FsIHN5bWJvbHMgb2YgYSBkeW5hbWljIG9iamVjdC4gIEhhbmRsZSBEVF9WRVIqIGNvbnN0YW50cy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFNpbXBsaWZ5IEJGRF9BU1NFUlQgY2hlY2tpbmcgZm9yIGEKLQlkeW5hbWljIG9iamVjdC4gIFNraXAgaW5kaXJlY3Qgc3ltYm9scyBmcm9tIEVMRiBvYmplY3RzLiAgUmVtb3ZlCi0JdGhlIHZlcnNpb24gbmFtZSBiZWZvcmUgY2hvb3NpbmcgYSBoYXNoIGJ1Y2tldC4gIFdyaXRlIG91dCB0aGUKLQl2ZXJzaW9uIGluZm9ybWF0aW9uIGlmIGFwcHJvcHJpYXRlLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBDaGVjayBmb3IgRFlOQU1JQywgbm90IEVUX0RZTi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIHZlcmluZm8gZmllbGQuCi0JQ2hhbmdlIGVsZl9saW5rX2hhc2hfZmxhZ3MgdG8gdW5zaWduZWQgc2hvcnQuCi0JKEVMRl9MSU5LX0hJRERFTik6IERlZmluZS4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgZmllbGRzIGR5bnZlcnN5bV9oZHIsIGR5bnZlcnJlZl9oZHIsCi0JZHludmVyZGVmX2hkciwgZHludmVyc3ltX3NlY3Rpb24sIGR5bnZlcmRlZl9zZWN0aW9uLAotCWR5bnZlcnJlZl9zZWN0aW9uLCBjdmVyZGVmcywgY3ZlcnJlZnMsIHZlcmRlZiwgdmVycmVmLgotCShlbGZfZHludmVyc3ltLCBlbGZfZHludmVyZGVmLCBlbGZfZHludmVycmVmKTogRGVmaW5lLgotCShfYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbiwgX2JmZF9lbGZfc3dhcF92ZXJkZWZfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJkYXV4X2luLCBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJuZWVkX2luLCBfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luLCBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0KTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4sIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzKTogRGVjbGFyZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbik6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfc3dhcF92ZXJkZWZfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dCk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfaW4sIF9iZmRfZWxmX3N3YXBfdmVybmVlZF9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luLCBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX3N3YXBfdmVyc3ltX2luLCBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZCBEVF9WRVIqIGNvbnN0YW50cy4gIFByaW50Ci0JdmVyc2lvbiBpbmZvcm1hdGlvbiBpZiB0aGVyZSBpcyBhbnkuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSB2ZXJpbmZvIGZpZWxkLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX0dOVV92ZXIqIHNlY3Rpb24gdHlwZXMuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogSGFuZGxlIC5nbnUudmVyc2lvbiogc2VjdGlvbiBuYW1lcy4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IEhhbmRsZSBTSFRfR05VX3Zlciogc2VjdGlvbiB0eXBlcy4KLQkoX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgaW5jbHVkZQotCXZlcnNpb24gbmFtZSBpbiBzdHJpbmcgZW50ZXJlZCBpbiBkeW5hbWljIGhhc2ggdGFibGUuCi0JKiBlbGZjb2RlLmg6IEluY2x1ZGUgZm5tYXRjaC5oLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIGEgZHluYW1pYwotCXN5bWJvbCB3aGljaCB3YXMgZm9yY2VkIHRvIGJlY29tZSBsb2NhbC4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmNjQtYWxwaGEuYyAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3ApOiBMaWtld2lzZS4KLQotRnJpIEZlYiAyMSAxNjoxNToxOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAobW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IFNpbXBsaWZ5Ci0Jc29tZXdoYXQuCi0JKG1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBDb3JyZWN0bHkgY29tcHV0ZSBhIHN5bWJvbCdzIHZhbHVlCi0Jd2hlbiB0aGUgc3ltYm9sIGlzIGxvY2FsLCBidXQgbm90IGluIHRoZSBzYW1lIHNlY3Rpb24gYXMgd2UgYXJlCi0JcmVsYXhpbmcuICBJbXBsZW1lbnQgYWJzMjQgLT4gYWJzMTYsIGltbTI0IC0+IGltbTE2IGFuZCBkMjQgLT4gZDE2Ci0JcmVsYXhpbmcuCi0KLUZyaSBGZWIgMjEgMTM6NTU6MTQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYzogUmV3cml0ZSB0byB1c2UgRUxGIGJhY2tlbmQgbGlua2VyLgotCVN0b3JlIGxvd2VyIDE2IGJpdHMgb2YgYWRkZW5kIGluIFJfTTMyUl9ISTE2X1tTVV1MTyBpbnNucy4KLQlBZGQgc21hbGwgZGF0YSBhcmVhIHN1cHBvcnQgKFJfTTMyUl9TREExNikuCi0JKiByZWxvYy5jOiBEb2N1bWVudCBCRkRfUkVMT0NfTTMyUl9TREExNi4KLQkqIGJmZC1pbjIuaCxsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBGZWIgMjAgMjM6NTA6MzEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKG1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IExpa2V3aXNlLgotCShtbjEwMjAwX2VsZl9zeW1ib2xfYWRkcmVzc19wKTogTGlrZXdpc2UuCi0JKG1uMTAyMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAobW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBmdW5jdGlvbi4KLQkobW4xMDIwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCi1UdWUgRmViIDE4IDE3OjIyOjU5IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29uZmlnLmJmZCwgY29uZmlndXJlLmluLCBlbGYuYywKLQlyZWxvYy5jLCB0YXJnZXRzLmM6IE5ldyB0YXJnZXQsIGVsZi0qLUQzMFYuCi0KLQkqIGJmZC1pbjIuaCwgY29uZmlndXJlLCBsaWJiZmQuaDogUmVidWlsdC4KLQotCSogY3B1LWQzMHYuYywgZWxmMzItZDMwdi5jOiBOZXcgZmlsZXMuCi0KLVR1ZSBGZWIgMTggMTU6MzE6NDggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiBGaXggdHlwbyBpbiBjb21tZW50LgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGNvZmYtdGljODAuYyAoUlRZUEUySE9XVE8pOiBSZXBsYWNlIGFib3J0IHdpdGggcmVhbCBmdW5jdGlvbi4KLQkocnR5cGUyaG93dG8pOiBBZGQgZnVuY3Rpb24uCi0JKHRpYzgwX2hvd3RvX3RhYmxlKTogQWRkLgotCi1UdWUgRmViIDE4IDExOjQxOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogc3lzZGVwLmg6IERvbid0IGRlZmluZSBlcnJubyBpbiBNU1ZDIGlmIGVycm9yLmggaXMgaW5jbHVkZWQuCi0KLVR1ZSBGZWIgMTggMTA6MDQ6MTMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBNYWtlIHN1cmUgcl9zeW1uZHgKLQlpcyBpbml0aWFsaXplZCBiZWZvcmUgaXQgaXMgdXNlZC4KLQotTW9uIEZlYiAxNyAxMToyODo0MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGhwMzAwaHB1eC5jIChjb252ZXJ0X3N5bV90eXBlKTogRG9uJ3QgY29udmVydCBhIHNlY29uZGFyeSBjb21tb24KLQlzeW1ib2wgaW50byBhIHdlYWsgdW5kZWZpbmVkIHN5bWJvbDsgbGVhdmUgaXQgYXMgYSBjb21tb24gc3ltYm9sLgotCi1GcmkgRmViIDE0IDE5OjA4OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBpc3N1ZSBhIHdhcm5pbmcKLQlhYm91dCBhIHN5bWJvbCBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QgaWYgaXQgaGFzIGFscmVhZHkgYmVlbgotCWRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4KLQotVGh1IEZlYiAxMyAyMDo1MzoyMiAxOTk3ICBLbGF1cyBLYWVtcGYgIChra2FlbXBmQHByb2dpcy5kZSkKLQotCSogbWFrZWZpbGUudm1zOiBBZGQgZ2NjIGZsYWdzIHRvIGFsbG93IGNvbXBpbGluZyB3aXRoIGN1cnJlbnQgZ2NjCi0Jc25hcHNob3QKLQkodGFyZ21hdGNoLmgpOiBOZXcgZGVwZW5kZW5jeS4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSKTogTmV3IHJlbG9jYXRpb24gZm9yCi0Jb3BlblZNUy9BbHBoYS4KLQkqIGV2YXguaCAoQUxQSEFfUl9DT0RFQUREUik6IE5ldyByZWxvY2F0aW9uLgotCSogZXZheC1hbHBoYS5jIChBTFBIQV9SX0NPREVBRERSKTogNjQgYml0IHByb2NlZHVyZSByZWxvY2F0aW9uIGZvcgotCW9wZW5WTVMvQWxwaGEuCi0JKiBldmF4LWV0aXIuYyAoQUxQSEFfUl9DT0RFQUREUik6IE91dHB1dCBvYmplY3QgY29kZSBmb3IgdGhpcwotCXJlbG9jYXRpb24uCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JUmVzdHJpY3Qgc3ltYm9sIGxlbmd0aCB0byA2NCBieXRlcywgY2FzZSBwcmVzZXJ2aW5nOgotCSogZXZheC1lbWguYyAoX2JmZF9ldmF4X3dyaXRlX2VtaCk6IFJlbW92ZSBjYXNlIGhhY2tpbmcuCi0JKiBldmF4LW1pc2MuYyAoX2JmZF9ldmF4X2Nhc2VfaGFja19zeW1ib2wpOiBSZW1vdmUuCi0JKF9iZmRfZXZheF9sZW5ndGhfaGFzaF9zeW1ib2wpOiBBZGRlZC4KLQkqIGV2YXgtZXRpci5jIChfYmZkX2V2YXhfd3JpdGVfZXRpcik6IENhbGwKLQlfYmZkX2V2YXhfbGVuZ3RoX2hhc2hfc3ltYm9sIGJlZm9yZSBvdXRwdXQgb2Ygc3ltYm9sLgotCSogZXZheC1lZ3NkLmMgKF9iZmRfZXZheF93cml0ZV9lZ3NkKTogTGlrZXdpc2UuCi0JKiBldmF4LmggKGZsYWdfaGFzaF9sb25nX25hbWVzLCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpOiBSZW1vdmUuCi0KLQkqIGV2YXgtZW1oLmM6IE91dHB1dCBmaWxlbmFtZSB0byBvYmplY3QgZmlsZSB3aXRob3V0IHBhdGguCi0KLQkqIGV2YXgtZWdzZC5jOiBOZXcgc2VjdGlvbnMgZm9yIGxvY2FsIGFuZCBnbG9iYWwgY29tbW9ucy4KLQotCSogZXZheC1hbHBoYS5jLCBldmF4LWVtaC5jLCBldmF4LWVnc2QuYywgZXZheC1ldGlyLmMsCi0JZXZheC1taXNjLmMsIGV2YXguaDogUmVtb3ZlIDggYml0IGNoYXJhY3RlcnMgZnJvbSBjb3B5cmlnaHQKLQlub3RpY2VzLiAgUmVwbGFjZSBBWFAgd2l0aCBBbHBoYS4KLQotV2VkIEZlYiAxMiAxODoxMDozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogV2UgbmVlZCB0aGUgZHluYW1pYwotCXNlY3Rpb25zIGlmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCi1UdWUgRmViIDExIDE1OjQ1OjQzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChpMzg2LXdpbmRvd3MpOiBEb24ndCBzZXQgaG9zdDY0PXRydWUuCi0KLVR1ZSBGZWIgMTEgMTU6Mjc6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHJlbG9jX3R5cGUpOiBBZGQgUl9NSVBTMTZfR1BSRUwuCi0JKGVsZl9taXBzMTZfZ3ByZWxfaG93dG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzMTZfZ3ByZWxfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwuCi0JKG1pcHNfaW5mb190b19ob3d0b19yZWwpOiBIYW5kbGUgUl9NSVBTMTZfR1BSRUwuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9NSVBTMTZfR1BSRUwuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfTUlQUzE2X0dQUkVMKTogRGVmaW5lLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotTW9uIEZlYiAxMCAyMzoyNTowMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChlbGZfbTMycl9ob3d0b190YWJsZSk6IENoYW5nZSBwYXJ0aWFsX2lucGxhY2UgdG8gdHJ1ZQotCWZvciBSX00zMlJfezE2LDMyLDI0LEhJMTZfVUxPLEhJMTZfU0xPLExPMTZ9LgotCi1GcmkgRmViICA3IDEyOjM5OjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBJZiB3ZSd2ZSBkaXNjYXJkZWQgYSBzZWN0aW9uLAotCXRoZSBvdXRwdXQgc2VjdGlvbiB3aWxsIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uOyBkb24ndCBwcmludCBhbgotCWFzc2VydGlvbiBtZXNzYWdlIGZvciB0aGF0IGNhc2Ugd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLgotCi1UaHUgRmViICA2IDE2OjU1OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChGTl9TVFVCLCBDQUxMX1NUVUIsIENBTExfRlBfU1RVQik6IERlZmluZS4KLQkoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBuZXcgZmllbGRzIGZuX3N0dWIsCi0JbmVlZF9mbl9zdWIsIGNhbGxfc3R1YiwgYW5kIGNhbGxfZnBfc3R1Yi4KLQkoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBmaWVsZCBtaXBzMTZfc3R1YnNfc2Vlbi4KLQkobWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlZGlyZWN0IHJlbG9jYXRpb25zIHRvIHVzZSBtaXBzMTYKLQlzdHVicyB3aGVuIGFwcHJvcHJpYXRlLgotCShtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBBdHRhY2ggc3R1YiBzZWN0aW9ucyB0byB0aGUgYXBwcm9wcmlhdGUKLQlzeW1ib2wuICBTZXQgbmVlZF9mbl9zdHViIHdoZW4gYXBwcm9wcmlhdGUuCi0JKG1pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lbGZfY2hlY2tfbWlwczE2X3N0dWJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMpOiBEZWZpbmUuCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGxvY2FsX3N0dWJzIGZpZWxkLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IERpc2NhcmQgbG9jYWwgc3ltYm9scyB0aGF0IGFyZQotCWF0dGFjaGVkIHRvIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuCi0KLVdlZCBGZWIgIDUgMTM6MjA6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogSWdub3JlIHRoZQotCXN5bWJvbCB2YWx1ZSB3aGVuIGNvbXB1dGluZyB0aGUgYWRkZW5kIGZvciBhIHBjX3JlbGF0aXZlCi0JcGNyZWxfb2Zmc2V0IHJlbG9jLgotCi1Nb24gRmViICAzIDExOjU0OjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IElmIGRvaW5nIGEKLQlyZWxvY2F0ZWFibGUgbGluaywganVzdCBza2lwIHBjX3JlbGF0aXZlIHBjcmVsX29mZnNldCByZWxvY3MuCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9ydHlwZV90b19ob3d0byk6IFJldHVybiBhIGRpZmZlcmVudCBob3d0bwotCXN0cnVjdHVyZSBmb3IgYW4gQVJNMjYgcmVsb2Mgd2hpY2ggY2FuIGJlIHJlc29sdmVkLgotCShjb2ZmX2FybV9hZGp1c3Rfc3ltbmR4KTogT25seSBjb252ZXJ0IEFSTTI2IHRvIEFSTTI2RCBpZiB0aGUKLQlyZWxvYyBjYW4gYmUgcmVzb2x2ZWQuCi0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IENvcnJlY3Qgb2ZmIGJ5IG9uZQotCWVycm9yIGluIG92ZXJmbG93IGNoZWNrIGZvciBSX1JFTEJZVEUuCi0KLUZyaSBKYW4gMzEgMTQ6MDc6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogUGljayB1cCB0aGUgc3RhcnQgYWRkcmVzcy4KLQlGcm9tIE1hcmsgUmFzaW4gPG1hcmsucmFzaW5AdGVscmFkLmNvLmlsPi4KLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBEb24ndCBhcHBseSBkaXNjYXJkX2wgdG8KLQlkZWJ1Z2dpbmcgc3ltYm9scy4KLQotV2VkIEphbiAyOSAwMDowMDo0OSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAocmVsb2NfdHlwZSk6IEFkZCAxNmJpdCBwYy1yZWxhdGl2ZSByZWxvYy4KLQkoZWxmX21uMTAyMDBfaG93dG9fdGFibGUpOiBMaWtld2lzZS4KLQkobW4xMDIwMF9yZWxvY19tYXApOiBMaWtld2lzZS4KLQotTW9uIEphbiAyNyAxMjowNzozNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogQWRkIHJlbG9jcyBCRkRfUkVMT0NfTTMyUl97SEkxNl9bVVNdTE8sTE8xNn0uCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQkqIGVsZjMyLW0zMnIuYzogQWRkIHN1cHBvcnQgZm9yIHRoZW0uCi0KLU1vbiBKYW4gMjcgMTI6MjU6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0LWFybS5jIChNWV9zd2FwX3N0ZF9yZWxvY19pbik6IFJlbW92ZSB1bnVzZWQgcl9sZW5ndGguCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBSZW1vdmUgdW51c2VkIHBsdC4KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IFJlbW92ZSB1c2VkCi0Jcl9mb3JtYXQgYW5kIHJfcGNyZWwuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JKiByaXNjaXguYyAoTVlfZmluYWxfbGlua19jYWxsYmFjayk6IERlZmluZSB0byBkdW1teSB2YWx1ZS4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBXaGVuIGNoZWNraW5nIGZvcgotCXJlbG9jYXRpb25zIGFnYWluc3QgdGhlIHRleHQgc2VnbWVudCwgbG9vayB1cCB0aGUgb3V0cHV0IG5hbWUgb2YKLQl0aGUgcmVsb2Mgc2VjdGlvbi4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi1XZWQgSmFuIDIyIDE1OjQwOjI4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwY29mZl92ZWMpOiBVc2UgY29ycmVjdCBkYXRhIHB1dC9nZXQKLQlyb3V0aW5lcyBmb3IgbGl0dGxlIGVuZGlhbiBkYXRhLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgbWFnaWMgdG8KLSAJVElDODBfQVJDSF9NQUdJQyBmb3IgVEljODAuCi0KLVR1ZSBKYW4gMjEgMTI6MzI6NDMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAodGljODBjb2ZmX3ZlYyk6IENoYW5nZSB0byBsaXR0bGUgZW5kaWFuIGRhdGEKLQlhcyB0aGUgZGVmYXVsdC4KLQotVGh1IEphbiAxNiAxNzo0NTo1NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDaGFuZ2UgdHlwZSBvZgotCWF1eGlsaWFyeV9maWx0ZXJzIHBhcmFtZXRlciB0byBiZSBjb25zdCBjaGFyICogY29uc3QgKi4gIEFjY2VwdCBhCi0JTlVMTCB0ZXJtaW5hdGVkIGFycmF5LgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLVdlZCBKYW4gMTUgMTE6MjE6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBUcmVhdCBhCi0JTk9UWVBFIHN5bWJvbCBpbiBhIHRleHQgc2VjdGlvbiBhcyBhIEZVTkMgc3ltYm9sLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEZvcmNlCi0JcmVsb2NiYXNlIHRvIGJlIGFsaWduZWQgdG8gQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSLgotCi1UdWUgSmFuIDE0IDA4OjQ2OjMzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaCAobWFjaGluZV90eXBlKTogUmVzZXJ2ZSBzZXZlcmFsIHZhbHVlcyBmb3Igc3BhcmNsZXQuCi0KLU1vbiBKYW4gMTMgMjI6Mzk6MDggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkICh0aWM4MC0qLSopOiBEb24ndCByZXF1aXJlICdjb2ZmJy4KLQotTW9uIEphbiAxMyAxOTozNjoyNSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfaG93dG9fdGFibGUpOiBTZXQgdGhlIHNwZWNpYWxfZnVuY3Rpb24KLQl0YWJsZSB0byB2ODUwX2VsZl9yZWxvYyBmb3IgYWxsIG5vbi1zdGFuZGFyZCByZWxvY2F0aW9ucy4KLQkodjg1MF9lbGZfY2hlY2tfcmVsb2NzKTogQWRkIGNoZWNrIGZvciBoIGJlaW5nIG5vbi1udWxsLgotCSh2ODUwX2VsZl9yZWxvYyk6IEFkZCAgUl9WODUwX1pEQV9PRkZTRVQgc3VwcG9ydC4gIFVzZSBzd2l0Y2gKLQlzdGF0ZW1lbnQgaW5zdGVhZCBvZiBtdWx0aXBsZSBpZnMuCi0JKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdXAgZXJyb3IgbWVzc2FnZSwgZG9uJ3QganVzdCBjYWxsCi0JYWJvcnQuCi0KLU1vbiBKYW4gIDYgMTM6Mjg6MzUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKGVsZl9tbjEwMjAwX2hvd3RvKTogRG9uJ3QgZXZlciBzZXQgcGFydGlhbC1pbnBsYWNlLgotCVVzZSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgYXMgc3BlY2lhbCBmdW5jdGlvbiBmb3IgYWxsIHJlbG9jcy4KLQkoYmZkX2VsZjMyX21uMTAyMDBfcmVsb2MpOiBSZW1vdmUgdW5uZWNlc3NhcnkgZnVuY3Rpb24uCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAoZWxmX21uMTAyMDBfaG93dG8pOiBTZXQgcGNyZWxfb2Zmc2V0IGZvcgotCTI0Yml0IHBjLXJlbGF0aXZlIHJlbG9jLgotCi1GcmkgSmFuICAzIDE2OjMzOjAwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY29mZi10aWM4MC5vKTogQWRkIGNvZmZjb2RlLmggdG8gZGVwZW5kZW5jeSBsaXN0LgotCSogY29mZi10aWM4MC5jICh0aWM4MGNvZmZfdmVjKTogRGF0YSBieXRlIG9yZGVyIGlzIGJpZyBlbmRpYW4gYW5kCi0JaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIGVuZGlhbi4gIFVzZSBjb3JyZWN0IGJmZF9nZXQgYW5kCi0JYmZkX3B1dCByb3V0aW5lcyBmb3IgbGl0dGxlIGVuZGlhbiBoZWFkZXJzLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBTZXQgYXJjaCB0bwotCWJmZF9hcmNoX3RpYzgwIGZvciBUSUM4MF9BUkNIX01BR0lDIG51bWJlci4KLQotRnJpIEphbiAgMyAxNjo1NDowOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmM6IEFkZCBCRkRfUkVMT0NfMjQuCi0JKiBlbGYzMi1tbjEwMjAwLmMgKGVudW0gcmVsb2NfdHlwZSk6IEFkZCAyNGJpdCBhbmQgcGNyZWwgcmVsb2NzLgotCShlbGZfbW4xMDIwMF9ob3d0bywgbW4xMDIwMF9yZWxvY19tYXApOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1GcmkgSmFuICAzIDE2OjU4OjMxIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JZWxmNjQtYWxwaGEgbXVsdGlwbGUgLmdvdCByZXdyaXRlOgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIGFsd2F5c19zaXplX3NlY3Rpb25zIGVudHJ5LgotCShiZmRfZWxmKl9ta29iamVjdCk6IERvbid0IGRlZmluZSBoZXJlIC4uLgotCSogZWxmeHgtdGFyZ2V0Lmg6IC4uLiBidXQgcmF0aGVyIGhlcmUuICBEZWZhdWx0IGFsd2F5c19zaXplX3NlY3Rpb25zCi0JaG9vayB0byBOVUxMLgotCSogZWxmLmMgKGVsZl9ta29iamVjdCk6IFJlbmFtZSB0byBiZmRfZWxmX21rb2JqZWN0LCBzaW5jZSB0aGF0IHdhcwotCXdoYXQgdGhlICNkZWZpbmVzIGluIGVsZi1iZmQuaCB0cmFuc211dGVkIGl0IHRvIGFueXdheS4KLQotCSogc2VjdGlvbi5jOiBBZGQgU0VDX0xJTktFUl9DUkVBVEVEIGZsYWcuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IEFkZCBTRUNfTElOS0VSX0NSRUFURUQgdG8KLQlyZWxvY2F0aW9uIHNlY3Rpb24gZmxhZ3MuCi0JKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBTRUNfTElOS0VSX0NSRUFURUQgaW5zdGVhZCBvZgotCVNFQ19JTl9NRU1PUlkgdG8gcmVjb2duaXplIGdlbmVyYXRlZCBiaXRzLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19jaGVja19yZWxvY3MsIGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6Ci0JTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmssIG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLAotCW1pcHNfZWxmX2NyZWF0ZV9jb21wYWN0X3JlbF9zZWN0aW9uLCBtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24sCi0JbWlwc19lbGZfY2hlY2tfcmVsb2NzLCBtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiwKLQlwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzLAotCWVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBBZGQgU0VDX0xJTktFUl9DUkVBVEVEIHRvCi0Jc2VjdGlvbiBmbGFncy4KLQkoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbCB0aGUgYWx3YXlzX3NpemVfc2VjdGlvbnMgaG9vay4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogVXNlIFNFQ19MSU5LRVJfQ1JFQVRFRCBpbnN0ZWFkIG9mIFNFQ19JTl9NRU1PUlkKLQl0byBpZGVudGlmeSBnZW5lcmF0ZWQgYml0cy4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0KLQkqIGVsZjY0LWFscGhhLmM6IFJld3JpdGUgZXZlcnl0aGluZyB0b3VjaGluZyByZWxvY2F0aW9ucy4KLQotRnJpIEphbiAgMyAxMTo0Mjo1MyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAoYWxsIGZ1bmN0aW9ucyBhbmQgc3RhdGljIHZhcmlhYmxlcyk6IEdvIHRocm91Z2gKLQlhbmQgcmVndWxhcml6ZSBuYW1lcyB0byBiZSBvZiB0aGUgZm9ybSB2ODUwX2VsZl88eHh4Pi4KLQkodG9wbGV2ZWwpOiBJbmNsdWRlIDxlbGYvdjg1MC5oPi4KLQkoZW51bSByZWxvY190eXBlKTogTW92ZSB0byBpbmNsdWRlL2VsZi92ODUwLmguCi0JKHY4NTBfZWxmX2NoZWNrX3JlbG9jcyk6IEZvciBjb21tb24gdmFyaWFibGVzLCBpZiB0aGUgdmFyaWFibGUgaXMKLQlyZWZlcmVuY2VkIGJ5IGEgUl9WODUwX3tTREEsWkRBLFREQX0gcmVsb2NhdGlvbiwgcHV0IHRoZSB2YXJpYWJsZQotCWludG8gdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24uCi0JKGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyk6IERlZmluZS4KLQotVHVlIERlYyAzMSAxNToxNToyOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBGaXggc29tZSBzcGFjaW5nLgotCi1UdWUgRGVjIDMxIDE0OjQ0OjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAobWlwcyplbC0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCi0JKG1pcHMqLSotbGludXgqKTogTmV3IHRhcmdldC4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDbGVhbiB1cC4KLQlSZXR1cm4gYSB1c2VmdWwgdmFsdWUuCi0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogQWRkIC1EX0dOVV9TT1VSQ0UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCwgbm90Ci0JYWNfY3ZfZnVuY19tbWFwLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIGluc3RlYWQgb2YKLQlhY19jdl9mdW5jX21tYXAgaW4gYmZkL2NvbmZpZ3VyZS5ob3N0LgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkCi0JZmlsdGVyX3NobGliIGFuZCBhdXhpbGlhcnlfZmlsdGVyX3NobGliIHBhcmFtZXRlcnMuCi0JKiBlbGYuYyAoX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEhhbmRsZSBEVF9BVVhJTElBUlkgYW5kCi0JRFRfRklMVEVSLgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIERlYyAzMCAxODo0ODo1MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9idWlsZF9sZHN5bXMpOiBXaGVuIGV4cG9ydGluZyBhbGwgZGVmaW5lZAotCXN5bWJvbHMsIGRvbid0IGV4cG9ydCBhIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGJ5IGFuIG9iamVjdCBpbiBhbgotCWFyY2hpdmUgd2hpY2ggY29udGFpbnMgc2hhcmVkIG9iamVjdHMuCi0KLU1vbiBEZWMgMzAgMTY6MTI6NTggMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGVudW0gYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBiZmRfYXJjaF90aWM4MAotCWZvciBUSSBUTVMzMjBjODAgKE1WUCkuCi0JKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF90aWM4MF9hcmNoLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlIGJ5IHJ1bm5pbmcgIm1ha2UgaGVhZGVycyIuCi0KLVN1biBEZWMgMjkgMTY6MTg6NTIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNwdS10aWM4MC5jIChiZmRfdGljODBfYXJjaCk6IEFkZCBzdHJ1Y3QuCi0JKiBjb25maWd1cmUuaW4gKGNhc2UgJHZlYyk6IENvcnJlY3QgdHlwbywgInRiIiBub3QgInRwIi4KLQlBbHNvIGFkZCBjb2ZmbGluay5vIGZvciB0aWM4MGNvZmZfdmVjLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCi0KLU1vbiBEZWMgMzAgMTE6NTQ6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYzogUGF0Y2ggdXAgdGhlIG1tYXAgY29kZSBzbyB0aGF0IGl0IGlzIG9ubHkgYnVpbHQgaWYgQkZECi0JaXMgY29uZmlndXJlZCB3aXRoIC0td2l0aC1tbWFwLgotCi1TdW4gRGVjIDI5IDEwOjQ4OjU3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi10aWM4MC5vCi0JKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtdGljODAubwotCShjcHUtdGljODAubywgY29mZi10aWM4MC5vKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIGNvZmYtdGljODAuYzogQWRkIHNrZWxldG9uLCBjbG9uZWQgZnJvbSBhbm90aGVyIGNvZmYgY29uZmlnLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgbWFnaWMgdG8gVElDODBNQUdJQwotIAlmb3IgVEljODAuCi0KLUZyaSBEZWMgMjcgMjA6NTY6NDEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIFRPRE86IENvcnJlY3QgYSBtaXNzcGVsbGluZy4KLQkqIGNvZmYtdGljODAuYzogTmV3IGZpbGUgZm9yIFRJIFRNUzMyMEM4MCAoTVZQKS4KLQkqIGNwdS10aWM4MC5jOiBOZXcgZmlsZSBmb3IgVEkgVE1TMzIwQzgwIChNVlApLgotCSogY29uZmlndXJlLmluIChjYXNlICR2ZWMpOiBBZGQgdGljODBjb2ZmX3ZlYyBlbnRyeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgotCSogYXJjaHVyZXMuYyAoYmZkX3RpYzgwX2FyY2gpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgYmZkX2FyY2hfdGljODAuCi0JKiBjb25maWcuYmZkIChjYXNlICR7dGFyZ30pOiBBZGQgdGljODAqLSotY29mZiogdGFyZ2V0LgotCSogdGFyZ2V0cy5jICh0aWM4MGNvZmZfdmVjKTogQWRkIGRlY2wgYXMgZXh0ZXJuIGJmZF90YXJnZXQuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHRpYzgwY29mZl92ZWMgZW50cnkuCi0KLUZyaSBEZWMgMjcgMTE6NDg6MTIgMTk5NiAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2J1Y2tldHMpOiBBZGQgc29tZSBtb3JlIHZhbHVlcyBmb3IgbGFyZ2VyCi0JYmluYXJpZXMuCi0KLVRodSBEZWMgMjYgMTg6MzY6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IE1vdmUgc3ViZGlyX2RvIG91dCBvZiBjb25kaXRpb25hbC4gRnJvbQotCUZyZWQgRmlzaCA8Zm5mQGN5Z251cy5jb20+LgotCi1XZWQgRGVjIDE4IDEwOjA0OjMwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDIwMC5jIChlbnVtIHJlbG9jX3R5cGUpOiBFbmFibGUgYmFzaWMgOCwgMTYsIGFuZAotCTMyIGJpdCByZWxvY3MuCi0JKGVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlKTogTGlrZXdpc2UuCi0JKG1uMTAyMDBfcmVsb2NfbWFwKTogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgMTcgMTE6MDk6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IEFkZCAxIHRvIHRoZSB2YWx1ZSBvZiBhCi0JbWlwczE2IHN5bWJvbCBkdXJpbmcgdGhlIGxpbmsuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFN1YnRyYWN0IDEgZnJvbSB0aGUgdmFsdWUgb2YgYQotCW1pcHMxNiBzeW1ib2wuCi0JKG1pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBEZWZpbmUuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IFByaW50IHRoZSBzdF9vdGhlciBmaWVsZCBpZiBpdCBpcwotCW5vdCB6ZXJvLgotCi1Nb24gRGVjIDE2IDE0OjM4OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IERvbid0IGNoZWNrIGZvciByZWxvYyBzZWN0aW9ucwotCWFnYWluc3QgU0VDX0RFQlVHR0lORyBzZWN0aW9ucyBoZXJlIChyZXZlcnQgcGF0Y2ggb2YgRGVjZW1iZXIgNSkuCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IENoZWNrIGZvciB0aGVtIGhlcmUsIGluc3RlYWQuCi0KLVN1biBEZWMgMTUgMTQ6NDY6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IEFkZCBkeW5hbWljIHBhcmFtZXRlci4KLQkqIGVsZi5jIChfYmZkX2VsZl9jYW5vbmljYWxpemVfcmVsb2MpOiBQYXNzIG5ldyBhcmd1bWVudCB0bwotCXNsdXJwX3JlbG9jX3RhYmxlLgotCShfYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfc2l6ZV9pbmZvKTogVXBkYXRlIGRlY2xhcmF0aW9uIG9mCi0Jc2x1cnBfcmVsb2NfdGFibGUuCi0JKF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWNsYXJlLgotCSogZWxmeHgtdGFyZ2V0Lmg6IFVzZSBuZXcgZHluYW1pYyByZWxvYyByb3V0aW5lcyBieSBkZWZhdWx0LgotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X3NsdXJwX3JlbG9jX3RhYmxlKTogQWRkIGR5bmFtaWMKLQlwYXJhbWV0ZXIuCi0KLUZyaSBEZWMgMTMgMTM6MTg6NDkgMTk5NiAgRGFuIFdpbGRlciAgPGRhbkBnYXNib3kuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9mbGFncyk6IFVzZSBNQzY4S0JDU01BR0lDIGZvciBiZmRfYXJjaF9tNjhrCi0JaWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFIGlzIGRlZmluZWQuCi0KLUZyaSBEZWMgMTMgMTE6MTM6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oIChlbnVtIG1hY2hpbmVfdHlwZSk6IENoYW5nZSBNX1NQQVJDTEVUIGZyb20gMTQyIHRvIDEzMS4KLQotVGh1IERlYyAxMiAxNTowNzoyMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IE1vdmUgUl9QUENfUExUUkVMMjQgaW50byB0aGUKLQlzdXBwb3J0ZWQgcmVsb2NzLgotCi1UaHUgRGVjIDEyIDE0OjU1OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBPbmx5IGFkZCBhIHdlYWsKLQlzeW1ib2wgaWYgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0JQWZ0ZXIgZmluZGluZyB0aGUgcmVhbCBkZWZpbml0aW9uLCB0aGVuLCBpZiBpdCBpcyBkeW5hbWljLCBhZGQgdGhlCi0Jd2VhayBzeW1ib2wgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotCi0JKiBjb2ZmLWF1eC5jIChjb2ZmX202OGtfYXV4X2xpbmtfYWRkX29uZV9zeW1ib2wpOiBNYWtlIHN0YXRpYy4KLQotCSogcHBjYm9vdC5jIChwcGNib290X3NldF9hcmNoX21hY2gpOiBEb24ndCBkZWZpbmU7IGl0J3MgYQotCWZ1bmN0aW9uLgotCShwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3QgdGFrZSB0aGUgYWRkcmVzcyBvZiBhbgotCWFycmF5LgotCi1UdWUgRGVjIDEwIDIzOjIzOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChyZWxvY190eXBlKTogUmVtb3ZlIGJpZyBlbmRpYW4gbW4xMDMwMCByZWxvYwotCXZhcmlhbnRzLgotCShlbGYzMl9tbjEwMzAwX2hvd3RvX3RhYmxlLCBtbjEwMzAwX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfbW4xMDMwMF9yZWxvYyk6IFdyaXRlIGRhdGEgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQuCi0JKiByZWxvYy5jOiBSZW1vdmUgbW4xMDMwMCBiaWcgZW5kaWFuIHJlbG9jcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGVsZjMyLW1uMTAyMDAuYzogVXBkYXRlIGZyb20gZWxmMzItbW4xMDMwMC5jLgotCi1GcmkgRGVjICA2IDE1OjE4OjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChlbGZfc3ltYm9sX2xlYWRpbmdfY2hhcik6IERlZmluZS4KLQotCSogZWxmMzItbW4xMDMwMC5jOiBBZGQgc29tZSBjb21tZW50cy4KLQotRnJpIERlYyAgNiAxNzoxNjo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGloZXguYyAoaWhleF9zY2FuKTogQWx3YXlzIGluaXRpYWxpemUgYnVmIGJlZm9yZSBqdW1waW5nIHRvCi0JZXJyb3JfcmV0dXJuLgotCShpaGV4X3JlYWRfc2VjdGlvbik6IExpa2V3aXNlLgotCi1UaHUgRGVjICA1IDIyOjI5OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jIChlbGZfbW4xMDMwMF9ob3d0b190YWJsZSk6IERvbid0IHNldCBwYXJ0aWFsLQotCWlucGxhY2UgZm9yIG1vc3QgcmVsb2NzLgotCi1UaHUgRGVjICA1IDEzOjI0OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDYWxsaW5nIGNoZWNrX3JlbG9jcwotCWV2ZW4gaWYgU0VDX0FMTE9DIGlzIG5vdCBzZXQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IERvbid0IGNoZWNrIFNFQ19BTExPQwotCXdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBjb3B5IGEgcmVsb2MgaW50byBhIHNoYXJlZCBvYmplY3QuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IERvbid0IHNldCBTRUNfQUxMT0MgaW4gYQotCXJlbG9jIHNlY3Rpb24gaWYgaXQgaXMgbm90IHNldCBpbiB0aGUgc291cmNlIHNlY3Rpb24uCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYXJrIGEgcmVsb2Mgc2VjdGlvbiBhc3NvY2lhdGVkCi0Jd2l0aCBhIFNFQ19ERUJVR0dJTkcgc2VjdGlvbiBhcyBTRUNfREVCVUdHSU5HLgotCi1XZWQgRGVjICA0IDE0OjE4OjEzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogI2lmIDAgY29kZSB0aGF0Ci0JZXhwZWN0cyBhIC5nb3QucGx0IHVudGlsIHdlIGFjdHVhbGx5IGNyZWF0ZSBpdC4KLQotTW9uIERlYyAgMiAxMjoxMzo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBQcmludCBhbiBlcnJvcgotCW1lc3NhZ2UgZm9yIGJmZF9yZWxvY19vdXRvZnJhbmdlLCByYXRoZXIgdGhhbiBhYm9ydGluZy4gIEZyb20KLQlQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG1AaW5mby51Y2wuYWMuYmU+LgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NzIGluCi0JYSByZWxvY2F0ZWFibGUgbGluaywgZG9uJ3QgdHJ5IHRvIHByb2Nlc3MgdGhlbS4gIEZyb20gSGVpbnogV3JvYmVsCi0JPHdyb2JlbEBscHIuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPi4KLQotTW9uIERlYyAgMiAwMDozOToyNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAobW4xMDMwMF9pbmZvX2hvd3RvKTogUmVuYW1lZCBmcm9tCi0JbW4xMDMwMF9pbmZvX2hvd3RvX3JlbC4gIFR3ZWFrIHJlbG9jIGFyZ3VtZW50IHRvIGJlIGFuCi0JRWxmMzJfSW50ZXJuYWxfUmVsYS4KLQkoVVNFX1JFTEEpOiBEZWZpbmUgaW5zdGVhZCBvZiBVU0VfUkVMLgotCShlbGZfaW5mb190b19ob3d0bywgZWxmX2luZm9faG93dG9fcmVsKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1TdW4gRGVjICAxIDAwOjE4OjU5IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6ICBIYW5kbGUgbWlwcyotc2dpLWlyaXg2Ki4KLQkqIGlyaXgtY29yZS5jIChpcml4X2NvcmVfY29yZV9maWxlX3ApOiAgQWNjZXB0IENPUkVfTUFHSUNOMzIKLQljb3JlIGZpbGVzLgotCi1XZWQgTm92IDI3IDEyOjEwOjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogV2FybiBhYm91dCBhCi0JcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgaW4gYSBzZWN0aW9uIHdpdGggbm8gb3V0cHV0Ci0Jc2VjdGlvbi4KLQotVHVlIE5vdiAyNiAxMTowNzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKEJGRF9DQ19GT1JfQlVJTEQpOiBEb24ndCByZXF1aXJlIEFDX0NfQ1JPU1MuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgb3RoZXIgZmllbGQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG90aGVyIGZpZWxkLgotCShzd2FwX291dF9zeW1zKTogU2V0IHN0X290aGVyIGZyb20gZXhpc3Rpbmcgc3Rfb3RoZXIgZmllbGQuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFN0b3JlIHN0X290aGVyIGluIGhhc2gKLQl0YWJsZSBvdGhlciBmaWVsZC4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFNldCB0aGUgb3RoZXIgZmllbGQgZnJvbSB0aGUgZ2xvYmFsIGhhc2gKLQl0YWJsZSBlbnRyeS4KLQkqIGVsZjMyLW1pcHMuYyAoZW51bSByZWxvY190eXBlKTogQWRkIFJfTUlQUzE2XzI2LgotCShlbGZfbWlwczE2X2p1bXBfaG93dG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzMTZfanVtcF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX01JUFMxNl9KTVAuCi0JKG1pcHNfaW5mb190b19ob3d0b19yZWwpOiBIYW5kbGUgUl9NSVBTMTZfMjYuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9NSVBTMTZfMjYuICBIYW5kbGUgUl9NSVBTXzI2Ci0JdG8gYSBtaXBzMTYgc3ltYm9sLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX01JUFMxNl9KTVApOiBBZGQgdG8gbGlzdCBvZiByZWxvY3MuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY3B1LW1pcHMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBtaXBzOjE2IGVudHJ5LgotCi1Nb24gTm92IDI1IDExOjIzOjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBsb25nIGxvbmcgZm9yIG1pcHMtc2dpLWlyaXg2Ki4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBNYWtlIGxpbmUgbnVtYmVyIG92ZXJmbG93Ci0Jb25seSBhIHdhcm5pbmcuICBGcm9tIFBoaWxpcHBlIERlIE11eXRlciA8cGhkZW11eXRAdWxiLmFjLmJlPi4KLQotTW9uIE5vdiAyNSAwODo1MjoyOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAoYmZkX2VsZjMyX21uMTAzMDBfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBtb3JlIHJlbG9jIHR5cGVzLgotCShlbGYzMl9tbjEwMzAwX2hvd3RvX3RhYmxlKTogVXBkYXRlIGZvciBuZXcgcmVsb2MgdHlwZXMuCi0JKGVsZjMyX21uMTAzMDBfcmVsb2NfbWFwKTogVXBkYXRlIGZvciBuZXcgcmVsb2MgdHlwZXMuCi0JKiByZWxvYy5jOiBBZGQgc29tZSBuZXcgcmVsb2NzIGZvciB0aGUgbW4xMDMwMCBzZXJpZXMuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1TYXQgTm92IDIzIDEzOjI2OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNldHVwX3NlY3Rpb25zKTogRG9uJ3QgbG9zZSBmb3IgYSBzcGFjZSB3aGljaCBoYXMKLQlubyBkYXRhLCBidXQgc29tZSBzeW1ib2xzLgotCi1GcmkgTm92IDIyIDExOjMyOjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBnb3RfbmVlZGVkIGZpZWxkLgotCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBnb3RfbmVlZGVkLgotCShzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgc2V0IC5nb3Qgc2VjdGlvbiBzaXplIGlmIGl0Ci0JaXMgbm90IGFscmVhZHkgc2V0LiAgU2V0IGdvdF9uZWVkZWQuCi0JKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDaGVjayBnb3RfbmVlZGVkLiAgT25seSBzZXQKLQlzZHlucHRyLCBhbmQgb25seSBoYW5kbGUgZHluYW1pYyBzZWN0aW9ucywgaWYgZHluYW1pYyBzZWN0aW9ucyBhcmUKLQluZWVkZWQuCi0JKHN1bm9zX3NjYW5fc3RkX3JlbG9jcyk6IFBhc3MgZmFsc2UgdG8gY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0JSW5pdGlhbGl6ZSAuZ290IHNlY3Rpb24uCi0JKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IExpa2V3aXNlLgotCShzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IFNldCB1cCBQTFQgZW50cnkgZXZlbiBpZiB0aGlzIGlzIG5vdAotCWEgZHluYW1pYyBzeW1ib2wuCi0JKHN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmspOiBDaGVjayBnb3RfbmVlZGVkLiAgT25seSBzZXQgdXAKLQlkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gaWYgbmVlZGVkLgotCi1UaHUgTm92IDIxIDEwOjMxOjMxIDE5OTYgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogQWRkZWQgVmVyc2FET1MgZm9ybWF0IHRvIHRoZSBFcmljc3NvbiBjb25maWd1cmF0aW9uLgotCi1XZWQgTm92IDIwIDE2OjMxOjMxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDMwMC5jOiBSb3VnaCBjdXQgYXQgcmVsb2NzIGZvciB0aGUgbW4xMDMwMC4KLQotV2VkIE5vdiAxMyAwODoxMjozOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlbGYzMi1kMTB2Lm8pOiBEb24ndCBkZXBlbmQgb24gZWxmL2QxMHYuaAotCWFueW1vcmUuCi0KLVR1ZSBOb3YgMTIgMTM6MzA6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBmaWxlbW9kZS5jOiBJbmNsdWRlIHN5c2RlcC5oLgotCSogaWhleC5jOiBBZGQgY2FzdHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgotCSogc3Vub3MuYzogQWRkIGNhc3RzIHRvIGVsaW1pbmF0ZSBjb21waWxlciB3YXJuaW5ncy4KLQotTW9uIE5vdiAxMSAxMDozNzowMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENyZWF0ZSAuZ290LnBsdAotCXNlY3Rpb24uCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogQWRkIHN1cHBvcnQgZm9yIFJfUFBDX0xPQ0FMMjRQQy4gIE1ha2UKLQlhcHByb3ByaWF0ZSByZWxvY2F0aW9ucyBpbiB0aGUgLnNvIGZpbGUgaWYgc2hhcmVkLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotVHVlIE9jdCAyOSAxNTowMzowMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKGVsZl9tMzJyX2hvd3RvX3RhYmxlLCBSX00zMlJfMjQpOiBVc2UKLQljb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZC4KLQotVHVlIE9jdCAyOSAxMjo1Mzo0NiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChlbGZfZDEwdl9ob3d0b190YWJsZSk6IERvbid0IGNvbXBsYWluIG9uCi0Jb3ZlcmZsb3dzIGZvciBSX0QxMFZfMTYgYW5kIFJfRDEwVl8xOC4KLQotVHVlIE9jdCAyOSAxMzoyMzo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9zZWN0aW9uX3BhcnQpOiBVc2UgTE1BIHJhdGhlciB0aGFuIFZNQS4KLQkoZG9fd2l0aF9yZWxvY3MpOiBMaWtld2lzZS4KLQkoZG9fYXNfcmVwZWF0KTogTGlrZXdpc2UuCi0JKGNvcHlfZXhwcmVzc2lvbik6IExpa2V3aXNlLgotCi1GcmkgT2N0IDI1IDE2OjU2OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX2V4dGVybmFsX3BhcnQpOiBDb3JyZWN0bHkgcmVjb3JkIHdoZXRoZXIKLQl0aGVyZSBpcyBhbiBleHRlcm5hbCBwYXJ0LgotCi1UaHUgT2N0IDI0IDE0OjMyOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChlbGYzMl92ODUwX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogQ29ycmVjdGx5Ci0JaGFuZGxlIHRkYSBvZmZzZXRzIGZvciBzbGQudyBhbmQgc3N0LncgaW5zdHJ1Y3Rpb25zLgotCUZpeCBhbGlnbm1lbnQgY2hlY2sgaW4gc2xkLncgYW5kIHNzdC53IHRkYSByZWxvYyBoYW5kbGluZy4KLQotVGh1IE9jdCAyNCAwOTowODo0NyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6ICBTZXQgVVNFX0JJTkFSWV9GT1BFTiBmb3IgKi0qLXdpbmRvd3MuCi0KLVdlZCBPY3QgMjMgMDA6NTM6MTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmM6IEFkZCBjb21tZW50cyBhYm91dCBhc3N1bXB0aW9ucyBhYm91dAotCWNoYXIsIHNob3J0ICYgbG9uZyBzaXplcy4KLQkoZWxmMzJfdjg1MF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IEZpeCBzaWduIGV4dGVuc2lvbgotCXByb2JsZW1zIGZvciBzZXZlcmFsIHJlbG9jcy4KLQotCSogZWxmMzItdjg1MC5jIChlbGYzMl92ODUwX2hvd3RvX3RhYmxlKTogRml4IHR5cG8gaW4KLQlSX1Y4NTBfU0RBX09GRlNFVCBlbnRyeS4KLQotV2VkIE9jdCAyMyAwMDoyMDozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCk6IERvbid0IGFsbG9jYXRlIGxkc3ltLgotCVN0b3JlIGltcG9ydCBmaWxlIGluZGV4IGluIGxkaW5keC4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogQXNzdW1lIHRoYXQgbGRzeW0gd2FzIG5vdCBwcmV2aW91c2x5Ci0JYWxsb2NhdGVkLiAgRm9yIGFuIGltcG9ydGVkIHN5bWJvbCwgY29weSBsZGluZHggaW50byBsX2lmaWxlLgotCi1UdWUgT2N0IDIyIDE5OjIwOjM4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChlbGZfdjg1MF9ob3d0b190YWJsZSk6IEZpeCBvcmRlcmluZyBvZgotCVJfVjg1MF9aREFfT0ZGU0VUIGFuZCBSX1Y4NTBfVERBX09GRlNFVC4gIEZpeCB2YXJpb3VzCi0JZmllbGRzIGluIFJfVjg1MF9UREFfT0ZGU0VULgotCShlbGYzMl92ODUwX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogVHdlYWsgcGMtcmVsYXRpdmUKLQlyZWxvY3MgdG8gd29yayBtb3JlIGxpa2Ugb3RoZXIgcmVsb2NzLiAgSGFuZGxlIFJfVjg1MF9UREFfT0ZGU0VUCi0JcmVsb2NhdGlvbnMuCi0KLQkqIGVsZjMyLXY4NTAuYzogSW5jbHVkZSBiZmRsaW5rLmguCi0JKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogUmV0dXJuIGFuIGVycm9yIGlmIHdlIGdldCBhIHJlbG9jCi0Jd2UgY2FuJ3QgaGFuZGxlLgotCShlbGYzMl92ODUwX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgotCSh2ODUwX2VsZl9yZWxvY2F0aW9uX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQotVHVlIE9jdCAyMiAxNzoyMjo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBJZ25vcmUgc2VjdGlvbnMgd2hpY2gKLQlkb24ndCBoYXZlIFNFQ19MT0FEIGFuZCBTRUNfQUxMT0Mgc2V0LgotCi1Nb24gT2N0IDIxIDEyOjEzOjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogQXZvaWQgbG9zaW5nIHN0YXRpYwotCXN5bWJvbHMgaW4gdGhlIC5ic3Mgc2VjdGlvbi4KLQotTW9uIE9jdCAyMSAxMDo1NDo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaG93dG9fdGFibGUpOiBEZXNjcmliZSBSX01JUFNfNjQuCi0JKG1pcHMzMl82NGJpdF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfcmVsb2NfbWFwKTogQWRkIGVudHJ5IGZvciBCRkRfUkVMT0NfNjQuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9NSVBTXzY0LgotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZQotCXdoZW4gYXR0ZW1wdGluZyB0byBkbyBhIHJlbG9jYXRlYWJsZSBsaW5rIHdpdGggZGlmZmVyZW50IG9iamVjdAotCWZpbGUgZm9ybWF0cywgcmF0aGVyIHRoYW4gY2FsbGluZyBhYm9ydC4KLQotVGh1IE9jdCAxNyAxMDo0MzoyOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChtMzJyIHJlbG9jcyk6IFJlbmFtZSB0aGVtLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0JKiBlbGYzMi1tMzJyLmM6IFVwZGF0ZS4KLQkobTMycl9lbGZfMTBfcGNyZWxfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9tMzJyX2hvd3RvX3RhYmxlLCBSX00zMlJfMTBfUENSRUwgZW50cnkpOiBVc2UgaXQuCi0JKGVsZl9tMzJyX2hvd3RvX3RhYmxlLCBSX00zMlJfMjQgZW50cnkpOiBGaXgge3NyYyxkc3R9X21hc2tzLgotCi1XZWQgT2N0IDE2IDExOjI0OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogU2V0ICJsaW5rZXJfbWFyayIgZm9yCi0JYWxsIHNlY3Rpb25zIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0JKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogRGlzY2FyZCBzeW1ib2xzIGluIHNlY3Rpb25zCi0Jd2hpY2ggYXJlIGJlaW5nIGRpc2NhcmRlZC4KLQkqIGVsZjMyLXY4NTAuYyAoZW51bSByZWxvY190eXBlKTogQWRkIFJfVjg1MF9TREFfT0ZGU0VULAotCVJfVjg1MF9UREFfT0ZGU0VUIGFuZCBSX1Y4NTBfWkRBX09GRlNFVC4KLQkoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKGVsZl92ODUwX3JlbG9jX21hcCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIHJlbG9jLmM6IEFkZCBhZGRpdGlvbmFsIFY4NTAgcmVsb2NhdGlvbnMuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogTWFzayBvdXQgYml0cyB3ZQotCW5vIGxvbmdlciB3YW50IGluIHBjLXJlbGF0aXZlIHJlbG9jcy4KLQotVHVlIE9jdCAxNSAyMjoxNzozNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfcmVsb2MpOiBEb24ndCBzaWxlbnRseQotCWFjY2VwdCBhIHJlbG9jIGFnYWluc3QgYW4gdW5kZWZpbmVkIHN5Ym1vbCEKLQotVHVlIE9jdCAxNSAxNjoxNzoyOCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmM6ICBEZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIgdG8gYmUgJ18nLgotCi1UdWUgT2N0IDE1IDEyOjQwOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogVkVSU0lPTjogQnVtcCBmb3IgbmV3IHJlbG9jYXRpb24uCi0KLQkqIGhvc3RzL2kzODZic2QuaDogSWYgTkJQRyBpcyBub3QgZGVmaW5lZCwgZGVmaW5lIGl0IGFzCi0JUEFHRV9TSVpFLCBmb3IgcmVjZW50IHZlcnNpb25zIG9mIEZyZWVCU0QuCi0KLU1vbiBPY3QgMTQgMTI6Mzc6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIGBsb25nIGxvbmcnIGFzIHRoZSA2NCBiaXQgdHlwZSBvbiBhIFNvbGFyaXMKLQlob3N0LCBzaW5jZSBib3RoIGdjYyBhbmQgdGhlIFN1blBSTyBjb21waWxlcnMgc3VwcG9ydCBpdC4KLQotTW9uIE9jdCAxNCAxMToxNzoyNCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogcmVsb2MuYzogQ3JlYXRlIGEgbmV3IEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTC4gIEl0IHdhcyBhCi0JbWlzdGFrZSB0byBoYXZlIHJldXNlZCB0aGUgRUNPRkYgTElURVJBTCBmb3IgRUxGIHNpbmNlIHRoZXkgaGF2ZQotCWRpZmZlcmVudCBzZW1hbnRpY3MuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGZfcmVsb2NfbWFwKTogTWFwIGZyb20gRUxGX0xJVEVSQUwuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBUcmFwIC5nb3QKLQlzZWN0aW9uIG92ZXJmbG93LgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG8gbm90IGVtaXQgYQotCWR5bmFtaWMgcmVsb2NhdGlvbiBmb3IgYW4gdW5kZWZ3ZWFrIHN5bWJvbCB3aGVuIHdlIGFyZSBidWlsZGluZwotCWEgc3RhdGljIGV4ZWN1dGFibGUuCi0KLVRodSBPY3QgMTAgMTE6MTU6MDYgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQgKGNvbmZpZy5iZmQsIHRhcmdtYXRjaC5zZWQpOiBFZGl0IHJlZmVyZW5jZXMgdG8KLQlwb2ludCBleHBsaWNpdGx5IHRvIHNyY2Rpci4KLQkodGFyZ21hdGNoLmgpOiBFZGl0IHJlZmVyZW5jZXMgdG8gcG9pbnQgZXhwbGljaXRseSB0byBvYmpkaXIuCi0KLVRodSBPY3QgMTAgMTQ6MTQ6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBXaGVuIHNldHRpbmcgdGFyZ19jcHUsIGRvbid0IGdldCBjb25mdXNlZCBieQotCWxpbnV4LWdudS4KLQotVHVlIE9jdCAgOCAwODo1MToxOSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogIEFkZCBzdXBwb3J0IGZvciB3aW5kb3dzIGhvc3QgKGEgYnVpbGQgZG9uZQotCXVuZGVyIHRoZSBNaWNyb3NvZnQgYnVpbGQgZW52aXJvbm1lbnQpLgotCi1UdWUgT2N0ICA4IDExOjQwOjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBhIHN5bWJvbCBpcyBhIHdlYWsKLQlkZWZpbml0aW9uIGluIGEgZHluYW1pYyBvYmplY3QsIGFkZCBpdCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUKLQlpZiBhbnkgZHluYW1pYyBvYmplY3QgbWVudGlvbnMgaXQuICBSZXZlcnRzIHBhcnQgb2YgbGFzdCBwYXRjaC4KLQotCSogc3Vub3MuYyAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBnb3RfYmFzZSBmaWVsZC4KLQkoc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgZ290X2Jhc2UuCi0JKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiB0aGUgLmdvdCBzZWN0aW9uIGlzIG1vcmUKLQl0aGFuIDB4MTAwMCBieXRlcywgc2V0IF9fR0xPQkFMX09GRlNFVF9UQUJMRV8gYW5kIGdvdF9iYXNlIHRvCi0JMHgxMDAwLgotCShzdW5vc19jaGVja19keW5hbWljX3JlbG9jKTogU3VidHJhY3QgZ290X2Jhc2UgZnJvbSBhIGJhc2UKLQlyZWxhdGl2ZSByZWxvY2F0aW9uLgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2lzYSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IHdhcm4gYWJvdXQgbGlua2luZwotCS1taXBzMSBhbmQgLW1pcHMyIGNvZGUgdG9nZXRoZXIsIG9yIC1taXBzMyBhbmQgLW1pcHM0IGNvZGUuCi0KLU1vbiBPY3QgIDcgMTE6NDQ6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2NvZmZfYXJtYXApOiBPbmx5IHRyZWF0IGFyY2hpdmUgYXMgbGl0dGxlCi0JZW5kaWFuIGZvciBpOTYwIENPRkYuCi0KLUZyaSBPY3QgIDQgMTM6NDk6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkanVzdCBzb2ZhcgotIAlieSB0aGUgY2hhbmdlIGluIHNpemUgb2YgdGhlIHNlY3Rpb24gd2hlbiBFWEVDX1AgaXMgbm90IHNldC4KLQotCSogY29mZi1tNjhrLmMgKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKG02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGNmLW02OGtseW54LmMgKGNvZmZfbTY4a19seW54X3J0eXBlX3RvX2hvd3RvKTogQWRkIHRoZSBzZWN0aW9uCi0JVk1BIHRvIHRoZSBhZGRlbmQgZm9yIGEgUEMgcmVsYXRpdmUgcmVsb2MuCi0KLQkqIGRlcC1pbi5zZWQ6IFJld29yayBiYWNrc2xhc2ggbG9vcCBhIGJpdCB0byBhdm9pZCBidWcgaW4gc2VkIG9uCi0JSFAvVVggMTAuMjAuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGRlcC1pbi5zZWQ6IFJlbW92ZSAuLi9iZmQvc3lzZGVwLmgsIHNpbmNlIGl0IHdpbGwgYXBwZWFyIHdoZW4KLQlzb20uaCBpcyBpbmNsdWRlZC4KLQotRnJpIE9jdCAgNCAxMTo0MTozOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgZXhwbGljaXQgZGVwZW5kZW5jaWVzIGZvciBtbjEwMjAwIGFuZAotCW1uMTAzMDAgZmlsZXMuCi0JKEFMTF9NQUNISU5FX0NGSUxFUyk6IEFkZCBjcHUtbW4xMDIwMC5jIGFuZCBjcHUtbW4xMDMwMC5jLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmMzItbW4xMDIwMC5jIGFuZCBlbGYzMi1tbjEwMzAwLmMKLQkoZGVwZW5kZW5jaWVzKTogUmVidWlsdC4KLQotVGh1IE9jdCAgMyAxNjo1Nzo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFNldCBvYmpfY29mZl9rZWVwX3N5bXMKLQlkdXJpbmcgdGhpcyBmdW5jdGlvbi4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBPbmx5IHVzZSBhbiBleGlzdGluZwotCXNlY3Rpb24gaWYgdGhlIGZsYWdzIGFyZSBjb21wYXRpYmxlLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBoYXZldmVjcywgYW5kIHB1dCBpdCBpbiB0ZGVmYXVsdHMuCi0JKiBtcHctY29uZmlnLmluOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHRhcmdtYXRjaC5zZWQ6IE5ldyBmaWxlOyBhIHNlZCBzY3JpcHQgdG8gYnVpbGQgdGFyZ21hdGNoLmggZnJvbQotCWNvbmZpZy5iZmQuCi0JKiBjb25maWcuYmZkOiBBZGQgI2lmLCAjZW5kaWYsIGFuZCBjb21tZW50cyBmb3IgdGFyZ21hdGNoLmguCi0JKiB0YXJnZXRzLmM6IEluY2x1ZGUgImZubWF0Y2guaCIuCi0JKHN0cnVjdCB0YXJnbWF0Y2gpOiBEZWZpbmUuCi0JKGJmZF90YXJnZXRfbWF0Y2gpOiBEZWZpbmUgYnkgaW5jbHVkaW5nIHRhcmdtYXRjaC5oLgotCShiZmRfZmluZF90YXJnZXQpOiBJZiB0aGUgdGFyZ2V0IGlzIG5vdCBmb3VuZCBieSBuYW1lLCBzZWFyY2ggZm9yCi0JaXQgYXMgYSBjb25maWd1cmF0aW9uIHRyaXBsZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBhb3V0LWFybS5vLCBhb3V0LXNwYXJjbGUubywgaHAzMDBic2QubywKLQlpMzg2ZHluaXgubywgbTY4azRrbmV0YnNkLm8sIGFuZCByaXNjaXguby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGFvdXQtYXJtLmMsIGFvdXQtc3BhcmNsZS5jLAotCWhwMzAwYnNkLmMsIGkzODZkeW5peC5jLCBtNjhrNGtuZXRic2QuYywgYW5kIHJpc2NpeC5jLgotCShIRklMRVMpOiBBZGQgdGFyZ21hdGNoLmguICBBbHNvLCBhbHBoYWJldGl6ZSBhbmQgcmVpbmRlbnQuCi0JKENGSUxFUyk6IFJlbW92ZSBpMzg2ZHluaXguYyBhbmQgaHAzMDBic2QuYy4KLQkodGFyZ21hdGNoLmgpOiBOZXcgdGFyZ2V0LgotCShkb19jbGVhbik6IFJlbW92ZSB0YXJnbWF0Y2guaC4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQkZEX05FRURfREVDTEFSQVRJT04oZ2V0ZW52KS4KLQkqIGFjY29uZmlnLmg6IEFkZCBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogc3lzZGVwLmg6IElmIE5FRURfREVDTEFSQVRJT05fR0VURU5WLCBkZWNsYXJlIGdldGVudi4KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9vYmplY3RfcCk6IERvbid0IGRlY2xhcmUgZ2V0ZW52LgotCi1UaHUgT2N0ICAzIDA5OjI5OjA5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY3B1LW1uMTB4MDAuYywgZWxmMzItbW4xMHgwMDogUmVtb3ZlZC4KLQkqIGNwdS1tbjEwMjAwLmMsIGNwdS1tbjEwMzAwLmM6IE5ldyBmaWxlcy4KLQkqIGVsZjMyLW1uMTAyMDAuYywgZWxmMzItbW4xMDMwMC5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbjogQnJlYWsgbW4xMHgwMCBzdXBwb3J0IGludG8gdHdvIHNlcGFyYXRlCi0JY29uZmlndXJhdGlvbnMsIG1uMTAyMDAgYW5kIG1uMTAzMDAuCi0JKiBhcmNodXJlcy5jLCBjb25maWcuYmZkLCBjb25maWd1cmUuaW4sIGVsZi5jLCB0YXJnZXRzLmM6IExpa2V3aXNlLgotCSogYmZkLWluMi5oLCBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVRodSBPY3QgIDMgMTU6Mzg6MTkgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGRvX2NsZWFuKTogTW92ZSBjb25maWcubG9nIHRvIGRvX2Rpc3RjbGVhbi4KLQotV2VkIE9jdCAgMiAyMTo0MDo1NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNwdS1tbjEweDAwLmMsIGVsZjMyLW1uMTB4MDAuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtbW4xMHgwMC5vLgotCShCRkQzMl9CQUNLRU5EUyk6IFNpbWlsYXJseSBmb3IgZWxmMzItbW4xMHgwMC5vLgotCShlbGYzMi1tbjEweDAwLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogYXJjaHVyZXMuYyAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIGJmZF9hcmNoX21uMTB4MDAuCi0JKGJmZF9tbjEweDAwX2FyY2gpOiBEZWNsYXJlLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCBiZmRfbW4xMHgwMF9hcmNoLgotCSogY29uZmlnLmJmZDogQWRkIG1uMTB4MDAtKi0qLgotCSogY29uZmlndXJlLmluOiBBZGQgYmZkX2VsZjMyX21uMTB4MDBfdmVjLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEhhbmRsZSBiZmRfYXJjaF9tbjEweDAwLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfbW4xMHgwMF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBiZmRfZWxmMzJfbW4xMHgwMF92ZWMuCi0JKiBiZmQtaW4yLmgsIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotV2VkIE9jdCAgMiAxNTo0Njo0NSAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCW9wZW5WTVMvQWxwaGE6IFByb3ZpZGUgZmlsZW5hbWUgYW5kIGNhc2VfaGFjayBmbGFncyB2aWEKLQlzeW1ib2wgdGFibGUgZnJvbSBnYXMuCi0JQWRkIGNhc2VfaGFjayBjb2RlIGZvciBzeW1ib2wgb3V0cHV0IGZyb20gdmF4L3Ztcy4KLQkqIGV2YXgtYWxwaGEuYyAoZXZheF9pbml0aWFsaXplKTogUmVtb3ZlIGZpbGVuYW1lIGhhbmRsaW5nLAotCWZpbGVuYW1lIGlzIHByb3ZpZGVkIHZpYSBzeW1ib2wgdGFibGUuCi0JKGV2YXhfZ2V0X3N5bXRhYik6IFVzZSBsb2NhbCBzeW1ib2wgY291bnQgd2hlbiBzZXR0aW5nIHVwIHRhYmxlLgotCSogZXZheC1lZ3NkLmMgKF9iZmRfZXZheF9zbHVycF9lZ3NkKTogUHJpbnQgY29ycmVjdCBuYW1lIHdoZW4KLQlkZWJ1Z2dpbmcuCi0JKF9iZmRfZXZheF93cml0ZV9lZ3NkKTogU2tpcCBmaWxlIG5hbWUgc3ltYm9sLgotCSogZXZheC1lbWguYyAoZ2V0X3Ztc190aW1lX3N0cmluZyk6IExvY2FsIGZ1bmN0aW9uIG5vdy4KLQkoX2JmZF9ldmF4X3dyaXRlX2VtaCk6IEV4dHJhY3Qgc291cmNlIGZpbGVuYW1lIGFuZCBjYXNlX2hhY2sgZmxhZ3MKLQlmcm9tIHN5bWJvbCB0YWJsZS4KLQkqIGV2YXhfd3JpdGVfZXRpciAoX2JmZF9ldmF4X3dyaXRlX2V0aXIpOiBQYXNzIGFsbCBzeW1ib2wgbmFtZXMKLQl0aHJvdWdoIF9iZmRfZXZheF9jYXNlX2hhY2tfc3ltYm9sLgotCSogZXZheC1taXNjLmMgKGhhc2hfc3RyaW5nLCBfYmZkX2V2YXhfY2FzZV9oYWNrX3N5bWJvbCk6IE5ldwotCWZ1bmN0aW9ucy4KLQkoX2JmZF9ldmF4X2Jhc2VuYW1lKTogUmVtb3ZlZC4KLQkoX2JmZF9nZXRfdm1zX3RpbWVfc3RyaW5nKTogTW92ZWQgdG8gZXZheC1lbWguYy4KLQkqIGV2YXguaCAoZXZheF9wcml2YXRlX2RhdGFfc3RydWN0KTogUmVtb3ZlIGZpbGVuYW1lLgotCShmbGFnX2hhc2hfbG9uZ19uYW1lcywgZmxhZ19zaG93X2FmdGVyX3RydW5jLAotCWZsYWdfbm9faGFzaF9taXhlZF9jYXNlLCB2bXNfbmFtZV9tYXBwaW5nKTogTmV3IGZsYWdzIGZvcgotCXZtc19jYXNlX2hhY2suCi0KLVdlZCBPY3QgIDIgMTI6MDI6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmcmVlYnNkLmggKE5fR0VUX01BR0lDX05FVCk6IERvbid0IHVzZSBudG9obC4KLQkoTl9HRVRNSURfTkVULCBOX0dFVEZMQUdfTkVUKTogTGlrZXdpc2UuCi0JKE5PX1NXQVBfTUFHSUMpOiBEb24ndCBkZWZpbmUuCi0JKFNXQVBfTUFHSUMpOiBEZWZpbmUuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGNyYXNoIGlmIHRoZXJlIGlzCi0Jbm8gaGFzaCB0YWJsZSBlbnRyeSBmb3IgYSBnbG9iYWwgc3ltYm9sLgotCi1UdWUgT2N0ICAxIDE2OjE0OjIyIDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0JKiBjb25maWcuYmZkIChtaXBzKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgbWlwcyotKi1lbGYqLgotCi1UdWUgT2N0ICAxIDEyOjMxOjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3Qgb3ZlcnJpZGUgYSBtZWFuaW5nZnVsCi0Jc3ltYm9sIHR5cGUgd2l0aCBUX05VTEwuICBXYXJuIGlmIHN5bWJvbCB0eXBlIGNoYW5nZXMuICBCYXNlZCBvbgotCXBhdGNoIGZyb20gUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBPbmx5IHB1dCBhIHN5bWJvbCBmcm9tCi0JYSBkeW5hbWljIG9iamVjdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaWYgaXQgaXMgcmVmZXJlbmNlZAotCW9yIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4KLQotRnJpIFNlcCAyNyAxODo0MTowNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX2lzX2xvY2FsX2xhYmVsKTogIE5ldyBmdW5jdGlvbiB0bwotCXJlbW92ZSBkd2FyZiBsb2NhbCBsYWJlbHMuICBTaHJpbmtzIGJpbmFyaWVzIGJ5IGEgZmFjdG9yIG9mIDMhCi0KLU1vbiBTZXAgMjMgMTM6MzM6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBDcmVhdGUgdGhlIC5zYnNzIHNlY3Rpb24KLQlieSBoYW5kLCByYXRoZXIgdGhhbiBieSBjYWxsaW5nIGJmZF9tYWtlX3NlY3Rpb24uCi0KLU1vbiBTZXAgMjMgMDk6MjM6NDEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IFJlbmFtZSBtMzJyIHJlbG9jcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBlbGYzMi1tMzJyLmM6IFVwZGF0ZS4KLQotRnJpIFNlcCAyMCAxMTo0Mzo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IFdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUKLQlsaW5rLCBhZGp1c3QgdGhlIHN5bWJvbCBpbmRleCBvZiBhIGJhc2UgcmVsYXRpdmUgcmVsb2MuICBEb24ndAotCWNoYW5nZSB0aGUgYWRkZW5kIG9mIGEgUEMgcmVsYXRpdmUgcmVsb2MgaWYgcGNyZWxfb2Zmc2V0IGlzIHNldC4KLQkqIHN1bm9zLmMgKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBkbyBhbnl0aGluZyBmb3IKLQlhIHJlbG9jYXRlYWJsZSBsaW5rLgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQXBwbHkgdGhlIHJlbG9jYXRpb24gZXZlbiBpZgotCWl0IGlzIHplcm8sIGluIGNhc2Ugc3JjX21hc2sgbWF0dGVycy4KLQkoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCi1UaHUgU2VwIDE5IDExOjAzOjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBBbHdheXMgaW5pdGlhbGl6ZQotCWtlZXBfc3ltcy4KLSAJKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgdGFyZ2V0X2luZGV4Ci0JdG8gYW4gdW5pbml0aWFsaXplZCB2YWx1ZS4KLQotVHVlIFNlcCAxNyAxNDoxODozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfbGluZV90YWJsZSk6IFdhcm4gYWJvdXQgaWxsZWdhbCBzeW1ib2wKLQlpbmRpY2VzLCByYXRoZXIgdGhhbiBjcmFzaGluZy4KLQkoY29mZl9zbHVycF9yZWxvY190YWJsZSk6IExpa2V3aXNlLiAgQ2hlY2sgd2hldGhlciB0aGUgaG93dG8gZmllbGQKLQlpcyBOVUxMLgotCSogY29mZi1zaC5jIChzaF9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgZm9yIGFuIGlsbGVnYWwgc3ltYm9sCi0JaW5kZXguCi0KLU1vbiBTZXAgMTYgMTI6Mzk6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byk6IENoYW5nZSBkc3RfbWFzayBmb3IgQVJNMjZECi0gCXJlbG9jIHRvIDAuCi0JKGNvZmZfYXJtX2FkanVzdF9zeW1uZHgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUuCi0KLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogQWNjZXB0IG11bHRpcGxlIHN5bWJvbHMgb24gYSBzaW5nbGUgbGluZS4KLQlGcm9tIFBhc2NhbCBNYXJ0aW4gPHBtYXJ0aW5AYWxzeXMuY29tPi4KLQotCSogUkVBRE1FOiBOZXcgZmlsZS4KLQotRnJpIFNlcCAxMyAxNDozMjo0MiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhb3V0ZjEuaCAoTVlfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0JKHN1bm9zX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0KLUZyaSBTZXAgMTMgMTU6NTA6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFN3aXRjaCBvbiBvdXRwdXQgQkZEIHJhdGhlcgotCXRoYW4gaW5wdXQgQkZELgotCShiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCSogc2VjdGlvbi5jIChiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IExpa2V3aXNlLgotCSogc3ltcy5jIChiZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IENoZWNrIHRoYXQKLQlib3RoIEJGRCdzIGFyZSB0aGUgcmlnaHQgZmxhdm91ci4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCSogZWxmLmMgKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkqIHBlaWNvZGUuaCAocGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBMaWtld2lzZS4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9ob3d0b190YWJsZSk6IEZpbGwgaW4gc29tZSBmaWVsZHMgZm9yCi0JUl9QQVJJU0NfRElSMzIsIHNvIHRoYXQgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgcGFzc2VzCi0JaXRzIHNhbml0eSBjaGVjay4KLQotVGh1IFNlcCAxMiAxMTo0NTo1NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogQWRkIG0zMnIgcmVsb2NzLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGNwdS1tMzJyLmMsZWxmMzItbTMyci5jOiBOZXcgZmlsZXMuCi0KLVRodSBTZXAgMTIgMTE6MTA6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfdmVjKTogU2V0IHN5bWJvbF9sZWFkaW5nX2NoYXIgZmllbGQgdG8gJ18nLgotCi1XZWQgU2VwIDExIDExOjU3OjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGVraGV4LmMgKGZpcnN0X3BoYXNlKTogQ2hhbmdlIHR5cGUgcGFyYW1ldGVyIGZyb20gY2hhciB0byBpbnQuCi0JKG91dCk6IExpa2V3aXNlLgotCShwYXNzX292ZXIpOiBDaGFuZ2UgZnVuYyB0byBleHBlY3QgaW50LCBub3QgY2hhci4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBUZXN0IFNFQ19BTExPQwotCXJhdGhlciB0aGFuIFNFQ19MT0FEIHdoZW4gYWxpZ25pbmcgdGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgZmlyc3QKLQlzZWN0aW9uIGluIGEgc2VnbWVudC4KLQotVHVlIFNlcCAxMCAxNjoxODozMCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jIChjb2ZmX3NlY3Rpb25fdHlwZSk6IE1ha2UgYXJnIGNvbnN0LgotCSogaXJpeC1jb3JlLmMgKGlyaXhfY29yZV9jb3JlX2ZpbGVfcCk6IFJlbW92ZSBleHRyYW5lb3VzIGV4dHJhIGFyZwotCXRvIG1ha2VfYmZkX2FzZWN0aW9uKCkuCi0JKiBlbGYtYmZkLmggKGJmZF9zZWN0aW9uX2Zyb21fcGhkcik6IEFkZCBwcm90b3R5cGUuCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fcGhkcik6IFJlbW92ZSBwcm90b3R5cGUuCi0JKF9iZmRfZWxmX3N0cmluZ3RhYl9pbml0KTogUmVtb3ZlIHByb3RvdHlwZS4KLQotCSogbmV0YnNkLWNvcmUuYyAoc3dhcF9hYm9ydCk6IEFkZCBwcm90b3R5cGUuCi0JKiBhaXgzODYtY29yZS5jIChzd2FwX2Fib3J0KTogRGl0dG8gJiBtYWtlIHN0YXRpYwotCSogaHB1eC1jb3JlLmMgKHN3YXBfYWJvcnQpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSogaXJpeC1jb3JlLmMgKHN3YXBfYWJvcnQpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSogcHRyYWNlLWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKiB0cmFkLWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfcmVsb2NfaW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX3JlbG9jX291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX3N5bV9pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfc3ltX291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfYXV4X2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9saW5lbm9faW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX2xpbmVub19vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBEaXR0by4KLQkqIGloZXguYyAoaWhleF9zaXplb2ZfaGVhZGVycyk6IERpdHRvLgotCSogdGVraGV4LmMgKGdldHN5bSk6IERpdHRvLgotCShmaW5kX2NodW5rKTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkoaW5zZXJ0X2J5dGUpOiBEaXR0by4KLQkoZmlyc3RfcGhhc2UpOiBEaXR0by4KLQkocGFzc19vdmVyKTogRGl0dG8uCi0JKHRla2hleF9nZXRfc3ltdGFiKTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkodGVraGV4X2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSh0ZWtoZXhfbWtvYmplY3QpOiBEaXR0by4KLQkodGVraGV4X29iamVjdF9wKTogRGl0dG8uCi0JKG1vdmVfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgotCSh0ZWtoZXhfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkodGVraGV4X3NldF9hcmNoX21hY2gpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSh0ZWtoZXhfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkod3JpdGV2YWx1ZSk6IERpdHRvLgotCSh3cml0ZXN5bSk6IERpdHRvLgotCShvdXQpOiBEaXR0by4KLQkodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IERpdHRvLgotCSh0ZWtoZXhfc2l6ZW9mX2hlYWRlcnMpOiBEaXR0by4KLQkodGVraGV4X21ha2VfZW1wdHlfc3ltYm9sKTogRGl0dG8uCi0JKHRla2hleF9nZXRfc3ltYm9sX2luZm8pOiBEaXR0by4KLQkodGVraGV4X3ByaW50X3N5bWJvbCk6IERpdHRvLgotCSogaXJpeC1jb3JlLmMgKG1ha2VfYmZkX2FzZWN0aW9uKTogRGl0dG8uCi0JKGlyaXhfY29yZV9jb3JlX2ZpbGVfcCk6IERpdHRvLgotCShpcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCk6IERpdHRvLgotCShpcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKTogRGl0dG8uCi0JKGlyaXhfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiBEaXR0by4KLQkoaXJpeF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogRGl0dG8uCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEaXR0by4KLQkqIHNyZWMuYyAoc3JlY19uZXdfc3ltYm9sKTogRGl0dG8uCi0JKHNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkoc3JlY19zZXRfYXJjaF9tYWNoKTogRGl0dG8uCi0JKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkoaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBEaXR0by4KLQkoc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBEaXR0by4KLQkoc3ltYm9sc3JlY193cml0ZV9vYmplY3RfY29udGVudHMpOiBEaXR0by4KLQkoc3JlY19zaXplb2ZfaGVhZGVycyk6IERpdHRvLgotCShzcmVjX21ha2VfZW1wdHlfc3ltYm9sKTogRGl0dG8uCi0JKHNyZWNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IERpdHRvLgotCShzcmVjX2dldF9zeW10YWIpOiBEaXR0by4KLQkoc3JlY19wcmludF9zeW1ib2wpOiBEaXR0byBhbmQgbWFrZSBzdGF0aWMuCi0JKiBlbGYuYyAoZWxmX3JlYWQpOiBEaXR0bwotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogRGl0dG8uCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogRGl0dG8uCi0JKHN5bV9pc19nbG9iYWwpOiBEaXR0by4KLQkoZWxmX21hcF9zeW1ib2xzKTogRGl0dG8uCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogRGl0dG8uCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IERpdHRvLgotCShjb2ZmX3JlYWxfb2JqZWN0X3ApOiBEaXR0by4KLQkoZml4dXBfc3ltYm9sX3ZhbHVlKTogRGl0dG8uCi0JKGJ1aWxkX2RlYnVnX3NlY3Rpb24pOiBEaXR0by4KLQkoY29weV9uYW1lKTogRGl0dG8uCi0JKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlKTogRGl0dG8uCi0KLU1vbiBTZXAgIDkgMjI6MzY6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQgYWZ0ZXIgbTMyciBjaGFuZ2VzLgotCi1Nb24gU2VwICA5IDEyOjMxOjIyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQsY29uZmlndXJlLmluLGNvbmZpZ3VyZTogQWRkIG0zMnIgc3VwcG9ydC4KLQkqIE1ha2VmaWxlLmluLGFyY2h1cmVzLmMsZWxmLmMsdGFyZ2V0cy5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy5iZmQ6IEtlZXAgdGFyZ2V0IGxpc3QgYWxwaGFiZXRpY2FsbHkgc29ydGVkLgotCi1Nb24gU2VwICA5IDExOjQ4OjQxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYywgY2FzZSBSX1Y4NTBfSEkxNik6IERvbid0IGZvcmdldAotCXRvIGFkZCBpbiB0aGUgY29uc3RhbnQgcGFydCBmb3VuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmLgotCShjYXNlIFJfVjg1MF9ISTE2X1MpOiBMaWtld2lzZS4KLQotRnJpIFNlcCAgNiAxNzowNDozOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChlbGZfZDEwdl9ob3d0b190YWJsZSk6IE1vZGlmeSB0aGUgc2l6ZSBvZiBSX0QxMFZfMTYKLQlhbmQgUl9EMTBWXzE4IHRvIGJlIDEgKHdvcmQpLgotCi1UaHUgU2VwICA1IDE1OjIzOjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBJZiB0aGUgb3V0cHV0X3NlY3Rpb24gZmllbGQKLQlvZiBlaXRoZXIgc2VjdGlvbiBpcyBiZmRfYWJzX3NlY3Rpb24sIHRoZW4gdGhlIGxpbmtlciBpcwotCWRpc2NhcmRpbmcgdGhlIHNlY3Rpb24gYW5kIHdlIHNob3VsZCBub3Qgb3B0aW1pemUgaXQuCi0KLVR1ZSBTZXAgIDMgMTI6MTY6MjAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFvdXQtc3BhcmNsZS5vKTogTmV3IHRhcmdldC4KLQkqIGFvdXRmMS5oIChUQVJHRVRfSVNfQklHX0VORElBTl9QKTogRG9uJ3QgZGVmaW5lIGlmIGxpdHRsZSBlbmRpYW4uCi0JKiBjb25maWcuYmZkIChzcGFyY2xldC0qLWFvdXQqKTogQWRkIGNhc2UuCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjbGVfYW91dF92ZWMpOiBBZGQgY2FzZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiB0YXJnZXRzLmMgKHNwYXJjbGVfYW91dF92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBzcGFyY2xlX2FvdXRfdmVjLgotCSogYW91dC1zcGFyY2xlLmM6IE5ldyBmaWxlLgotCi1UdWUgU2VwICAzIDAwOjU3OjAyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYyk6IEZpeCBoYW5kbGluZyBvZgotCWxvdyBvcmRlciBzaWduIGJpdCBwcm9wb2dhdGlvbiBmb3IgUl9WODUwX0hJMTZfUy4KLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYyk6IE5ldyBmdW5jdGlvbiBmb3IKLQloYW5kbGluZyBWODUwIHNwZWNpZmljIHJlbG9jcy4KLQkoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBVc2UgdGhlIG5ldyBmdW5jdGlvbiBmb3Igc29tZQotCXJlbG9jYXRpb25zLiAgVHdpZGRsZSBtYXNrcyAmIHNoaWZ0cyBmb3Igc29tZSByZWxvY3MuCi0JU2V0IHBhcnRpYWxfaW5wbGFjZSB3aGVyZSBuZWVkZWQuCi0KLU1vbiBTZXAgIDIgMTI6MTI6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcHUtbWlwcy5jOiBBZGQgYW4gZXhwbGljaXQgbWlwczozMDAwIGVudHJ5LCBhbmQgY2hhbmdlIHRoZQotCWRlZmF1bHQgYXJjaGl0ZWN0dXJlIHRvIGEgbWFjaGluZSBudW1iZXIgb2YgMC4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9vYmplY3RfcCk6IFNldCB0aGUgbWFjaGluZSBudW1iZXIKLQlmb3IgRV9NSVBTX0FSQ0hfMS4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogSWYgdGhlIG1hY2hpbmUgbnVtYmVyIG9mCi0JdGhlIG91dHB1dCBCRkQgaXMgdGhlIGRlZmF1bHQsIHNldCBpdCBmcm9tIHRoZSBmaXJzdCBpbnB1dCBCRkQuCi0KLVN1biBTZXAgIDEgMTg6Mzg6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogQWxsIHRoZSAxNmJpdCByZWxvY3MKLQlpbnNlcnQgYXQgYml0cG9zIHplcm8uICBUaGUgSEkxNiByZWxvY3MgYXJlIHNoaWZ0ZWQgcmlnaHQKLQlieSAxNiBiaXRzLiAgRml4IHNyY19tYXNrIGZvciBhbGwgcmVsb2NzLgotCShUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0xJVFRMRV9OQU1FKTogRGVmaW5lLiAgVGhlIFY4NTAgaXMKLQlsaXR0bGUgZW5kaWFuIQotCShUQVJHRVRfQklHX1NZTSwgVEFSR0VUX0JJR19OQU1FKTogUmVtb3ZlLiAgVGhlIFY4NTAgaXMgbGl0dGxlCi0JZW5kaWFuIQotCi1TdW4gU2VwICAxIDE1OjQxOjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOgotCVJld3JpdGUgdG8gdXNlIEJGRCBmaWxlIHJlYWQgcm91dGluZXMgYW5kIHRvIGF2b2lkIHVzaW5nIGEgZml4ZWQKLQlsZW5ndGggZm9yIHRoZSBmaWxlIG5hbWUuCi0KLVNhdCBBdWcgMzEgMTA6MjI6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX1Y4NTBfezMyLDE2LDh9LgotCShlbGZfdjg1MF9ob3d0b190YWJsZSk6IEFkZCBzdXBwb3J0IGZvciBSX1Y4NTBfezMyLDE2LDh9LgotCSh2ODUwX3JlbG9jX21hcCk6IEFkZCB0cmFuc2xhdGlvbiBmcm9tIEJGRF9SRUxPQ197MzIsMTYsOH0KLQl0byBSX1Y4NTBfezMyLDE2LDh9LgotCi1GcmkgQXVnIDMwIDE4OjA2OjA0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHJlbG9jX3R5cGUpOiBBZGQgUl9WODUwX0hJMTZfUy4KLQkoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBBZGQgaW5mbyBmb3IgSEkxNl9TIHJlbG9jLgotCSh2ODUwX3JlbG9jX21hcCk6IEFkZCBISV8xNl9TIHJlbG9jLgotCSogcmVsb2MuYzogRGVmaW5lIEJGRF9SRUxPQ19WODUwXyogcmVsb2NzLgotCi1GcmkgQXVnIDMwIDExOjQ5OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBTSCBFTEYgc3VwcG9ydC4KLQkqIGVsZjMyLXNoLmM6IE5ldyBmaWxlLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEhhbmRsZSBiZmRfYXJjaF9zaC4KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogSGFuZGxlIGFic29sdXRlIHN5bWJvbC4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzKTogRGVjbGFyZS4KLQkoX2JmZF9lbGY2NF9saW5rX3JlYWRfcmVsb2NzKTogRGVjbGFyZS4KLQkqIGVsZmxpbmsuaCAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKSk6IFJlbmFtZSBmcm9tCi0JZWxmX2xpbmtfcmVhZF9yZWxvY3MuICBNYWtlIGdsb2JhbGx5IHZpc2libGUuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogR2V0IGV4dGVybmFsIHN5bWJvbHMgZnJvbSBjYWNoZSBpbgotCXN5bXRhYl9oZHItPmNvbnRlbnRzLiAgR2V0IGNvbnRlbnRzIGZyb20gY2FjaGUgaW4KLQllbGZfc2VjdGlvbl9kYXRhLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmRF9lbGZOTl9iZmRfcmVsYXhfc2VjdGlvbik6IE9ubHkgZGVmaW5lIGlmIG5vdAotCWFscmVhZHkgZGVmaW5lZC4KLQkqIHJlbG9jLmM6IERlZmluZSBCRkRfUkVMT0NfU0hfKiByZWxvY3MuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4pOiBEZWNsYXJlLgotCSogY29mZi1zaC5jIChzaF9pbnNuc19jb25mbGljdCk6IEZpeCBhIHJldHVybiB2YWx1ZS4KLQkoX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4pOiBOZXcgZ2xvYmFsbHkgdmlzaWJsZSBmdW5jdGlvbiwgYnJva2VuCi0Jb3V0IG9mIHNoX2FsaWduX2xvYWQuCi0JKHNoX2FsaWduX2xvYWQpOiBDYWxsIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuLgotCShzaF9zd2FwX2luc25zKTogQ2hhbmdlIHJlbG9jcyBwYXJhbWV0ZXIgdG8gUFRSLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3NoX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9zaGxfdmVjKTogRGVjbGFyZS4KLQkqIGNvbmZpZy5iZmQgKHNoLSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9zaF92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkoYmZkX2VsZjMyX3NobF92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZjMyLXNoLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYzMi1zaC5jLgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogQ2hlY2sgdGhhdCBMTUEgZG9lcyBub3Qgc2tpcCBhCi0JcGFnZSBiZWZvcmUgY2hlY2tpbmcgRF9QQUdFRC4KLQotCSogaWhleC5jIChpaGV4X3NjYW4pOiBSZW1vdmVkIHVubmVjZXNzYXJ5IGV4dGJhc2UgdmFyaWFibGUuCi0JKGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlIGV4dGJhc2U7IGFsd2F5cyB1c2Ugc2VnYmFzZQotCWluc3RlYWQuCi0KLVRodSBBdWcgMjkgMTY6NTI6MTcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtIHByby4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni0qLSopOiBEaXR0by4KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotKik6IERpdHRvLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi1kZ3V4Kik6IFJlY29nbml6ZSBhcyBhIHN5bm9ueW0gZm9yIHg4NgotCWVsZi4KLQotVHVlIEF1ZyAyNyAwOToxODoxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBBZGQgbmV3IGFyZ3VtZW50LgotCSogZWxmMzItaHBwYS5oIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBBZGQgbmV3IGFyZ3VtZW50LiAgSWYKLQl3ZSBlbmNvdW50ZXIgYW4gUl9EQVRBX09ORV9TWU1CT0wgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCB0aGF0Ci0Jd2lsbCBoYXZlIGFuIFNUX0NPREUgdHlwZSwgY2hhbmdlIHRoZSBzeW1ib2wncyB0eXBlIHRvIFNUX0RBVEEuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBVcGRhdGUgcHJvdG90eXBlLgotCi1UdWUgQXVnIDI3IDAwOjEyOjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBTZXQgZHlub2JqIGlmIG5lZWRlZCBmb3IKLQlSX01JUFNfMzIgYW5kIFJfTUlQU19SRUwzMi4gIFNldCBzZ290IGFuZCBnIGFzIHNvb24gYXMgcG9zc2libGUuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHJlcXVpcmUgLmdvdCB0byBleGlzdC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotVGh1IEF1ZyAyMiAxMDo1NDozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChITERFTlYpOiBOZXcgdmFyaWFibGUgdG8gc2V0LiAgU2V0IGl0IGZvcgotCSotKi1zeXN2NCosIHNpbmNlIHRob3NlIGxpbmtlcnMgbWF5IG5vdCBzdXBwb3J0IC1SIGJ1dCB0aGV5IGFsd2F5cwotCXN1cHBvcnQgTERfUlVOX1BBVEguCi0KLQkqIGxpYmllZWUuaCAoTlNFQ1RJT05TKTogRG9uJ3QgZGVmaW5lLgotCShpZWVlX2RhdGFfc3RydWN0KTogQ2hhbmdlIHNlY3Rpb25fdGFibGUgdG8gYXNlY3Rpb24gKiouICBBZGQKLQlzZWN0aW9uX3RhYmxlX3NpemUuCi0JKiBpZWVlLmMgKGdldF9zZWN0aW9uX2VudHJ5KTogSWYgdGhlIHRhYmxlIGlzbid0IGJpZyBlbm91Z2gsIG1ha2UKLQlpdCBiaWdnZXIuCi0JKGllZWVfc2x1cnBfc2VjdGlvbnMpOiBSZW1vdmUgYXNzZXJ0aW9uIGFib3V0IG51bWJlciBvZiBzZWN0aW9ucy4KLQkoaWVlZV9vYmplY3RfcCk6IEFkanVzdCBpbml0aWFsaXphdGlvbiBvZiBpZWVlIHRvIG1hdGNoIGNoYW5nZXMgdG8KLQl0aGUgc3RydWN0dXJlLgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbWFyayk6IERvbid0IGNvcHkgcmVsb2NzIGZvciB1bmRlZmluZWQKLQlzeW1ib2xzIG1lcmVseSBiZWNhdXNlIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IERvbid0IHNldCB1cCBnbG9iYWwgbGlua2FnZSBjb2RlIGZvciBhbgotCXVuZGVmaW5lZCBzeW1ib2wgbWVyZWx5IGJlY2F1c2Ugd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LgotCi1UdWUgQXVnIDIwIDE1OjA2OjA1IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS12ODUwLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKSBBZGQgZWxmMzItdjg1MC5vLgotCSogYXJjaHVyZXMuYzogQWRkIGJmZF92ODUwX2FyY2guCi0JKiBiZmQtaW4yLmg6IEFkZCBiZmRfdjg1MF9hcmNoLgotCSogY29uZmlnLmJmZCAodjg1MC0qLSopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiAoYmZkX2VsZjMyX3Y4NTBfdmVjKSBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlLmluOiAoYmZkX2VsZjMyX3Y4NTBfdmVjKSBOZXcgdmVjdG9yLgotCSogY3B1LXY4NTAuYzogTmV3IGZpbGUuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkZWQgY2FzZSBiZmRfYXJjaF92ODUwLgotCSogZWxmMzItdjg1MC5jOiBOZXcgZmlsZS4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3Y4NTBfdmVjKTogTmV3IHZlY3Rvci4KLQotRnJpIEF1ZyAxNiAxNjoyNTozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMpOiBDcmVhdGUgYW5kIGRlZmluZQotIAlhIGZ1bmN0aW9uIGNvZGUgc3ltYm9sIGZvciBhbiBYTUNfWE8gc3ltYm9sLgotCi1UaHUgQXVnIDE1IDEyOjMzOjI5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogVXBkYXRlIGVkaXRpbmcgb2YgYXV0b2NvbmYgdmFycyB0byByZWZsZWN0Ci0JSnVsIDE4IGNvbmZpZ3VyZS5pbiBjaGFuZ2UuCi0JKiBtcHctbWFrZS5zZWQ6IFVwZGF0ZSBlZGl0aW5nIG9mIGluY2x1ZGUgcGF0aG5hbWVzIHRvIGJlCi0JbW9yZSBnZW5lcmFsLCBhZGQgQERBU0hfQ19GTEFHQCB0byBleHBsaWNpdCBjb21waWxlIHJ1bGUgZWRpdC4KLQotVGh1IEF1ZyAxNSAxMDozNToxMyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfb3V0cHV0X2V4dHN5bSk6IFRoZSBzZWN0aW9uIGZyb20KLQl3aGljaCB0byBvZmZzZXQgdG8gZ2V0IHRoZSAucGx0IGVudHJ5IGFkZHJlc3MgaXMgIi5wbHQiLgotCi1UaHUgQXVnIDE1IDE2OjQwOjMwIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogcmVsb2MuYzogKEJGRF9SRUxPQ19BUk1fVEhVTUJfQURELCBCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTSwKLQlCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZULCBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCk6Ci0gCUFkZGVkLCBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBBUk0gZ2FzLgotCSogbGliYmZkLmg6IFJlYnVpbHQKLQkqIGJmZC1pbjIuaDogUmVidWlsdAotCi1XZWQgQXVnIDE0IDE3OjAyOjA5IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDb3JyZWN0IHR5cG8KLQlpbiBzZWN0aW9uIGR5bmlkeCBzdGFydC4KLQotVHVlIEF1ZyAxMyAxNDozNTozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogVHJlYXQgc2VjdGlvbnMgd2hvc2UKLQluYW1lIGJlZ2lucyB3aXRoIC5nbnUubGlua29uY2UgYXMgU0VDX0xJTktfT05DRS4gIFRoaXMgaXMgYW4KLQlvcHRpbWl6YXRpb24gZm9yIGcrKy4KLQotVHVlIEF1ZyAxMyAxNzowNDo0MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBJZiBvbmUgbW9kdWxlIGhhcwotCXRoZSAtbXJlbG9jYXRhYmxlLWxpYiBiaXQgc2V0IGFuZCB0aGUgb3RoZXIgZG9lc24ndCwgY2xlYXIgdGhlCi0JLW1yZWxvY2F0YWJsZS1saWIgYml0IGluIHRoZSBoZWFkZXIuCi0KLVNhdCBBdWcgMTAgMjI6NTk6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvIG5vdCByZXNvbHZlIGEgY29tbW9uCi0Jc3ltYm9sIGFnYWluc3QgYSBTVFRfRlVOQyBzeW1ib2wgaW4gYSBzaGFyZWQgbGlicmFyeS4KLQotRnJpIEF1ZyAgOSAxMjo0NDo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMpOiBJZiBhIGRlc2NyaXB0b3IKLSAJc3ltYm9sIGlzIGZvdW5kLCBhdXRvbWF0aWNhbGx5IGRlZmluZSB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgotIAljb2RlLgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBPbmx5IHNldCAoKnN5bV9oYXNoKS0+bnVtYXV4Ci0JaWYgc3ltLm5fbnVtYXV4IGlzIG5vdCB6ZXJvLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBQZXJtaXQgdGhlIHN5bWJvbCBhbmQgdGhlIGhhc2ggdGFibGUKLQllbnRyeSB0byBkaXNhZ3JlZSBhYm91dCB0aGUgbnVtYmVyIG9mIGF1eCBlbnRyaWVzIGlmIHRoZSBzeW1ib2wKLQloYXMgemVyby4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBDcmVhdGUgdGhlIC5yZWwuZHluCi0Jc2VjdGlvbiBpZiBpdCBtaWdodCBiZSBuZWVkZWQsIG5vdCBqdXN0IGlmIGluZm8tPnNoYXJlZC4KLQkobWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTWFrZSByb29tIGZvciBhIG51bGwgZWxlbWVudCBhdAotCXRoZSBzdGFydCBvZiAucmVsLmR5biBpZiB3ZSBhcmUgZ29pbmcgdG8gdXNlIGl0LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgY2xlYXIgdGhlIGZpcnN0IGVsZW1lbnQKLQlvZiAucmVsLmR5biBpZiB0aGUgc2l6ZSBpcyBncmVhdGVyIHRoYW4gemVyby4KLQotVGh1IEF1ZyAgOCAxNjoyNDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IElmIHdlIGFscmVhZHkgY2FsbGVkIHRoZQotCXVuZGVmaW5lZF9zeW1ib2wgY2FsbGJhY2sgZm9yIGEgc3ltYm9sLCB0aGVuIGRvbid0IGlzc3VlIGFueSBtb3JlCi0Jd2FybmluZ3MgYWJvdXQgbG9hZGVyIHJlbG9jcy4KLQkoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGRvIGFueSBmdXJ0aGVyIHByb2Nlc3NpbmcKLQlhZnRlciBjYWxsaW5nIHRoZSB1bmRlZmluZWRfc3ltYm9sIGNhbGxiYWNrLgotCi0JKiB4Y29mZmxpbmsuYyAoWENPRkZfTVVMVElQTFlfREVGSU5FRCk6IERlZmluZS4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFBlcm1pdCBtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiBhIHN5bWJvbAotCWFzIHRoZSBBSVggbGlua2VyIHNlZW1zIHRvIGRvLgotCi1UaHUgQXVnICA4IDEyOjIxOjU2IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfYWxwaGFfdmVjKTogQ29ycmVjdGVkIGZsYWdzLCBjbGVhbnVwLgotCShldmF4X2luaXRpYWxpemUpOiBSZW1vdmUgZXZheF9yZWxvY190YWJsZS4KLQkoZXZheF9jbG9zZV9hbmRfY2xlYW51cCk6IERpdHRvLgotCShyZWxvY19uaWwpOiBEaXR0by4KLQkoYWxwaGFfaG93dG9fdGFibGUpOiBSZW1vdmUgQUxQSEFfUl9TV1JFTDMyIGFuZCBBTFBIQV9SX1NXUkVMNjQKLQllbnRyaWVzLgotCShldmF4X2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERpdHRvLgotCSogZXZheC1lZ3NkLmMgKF9iZmRfZXZheF9zbHVycF9lZ3NkKTogQWRkIGEgZmV3IGNhc3RzOyBzZXQKLQljb29rZWRfc2l6ZSA9PSByYXdfc2l6ZS4KLQkqIGV2YXgtZW1oLmMgKF9iZmRfZXZheF9yZWdpc3Rlcl9maWxlbmFtZSk6IFJlbW92ZS4KLQkqIGV2YXgtZXRpci5jIChldGlyX3N0Yyk6IEFsbG93IEVUSVJfU19DX1NUQ194eCBjb21tYW5kcy4KLQkqIGV2YXgtbWlzYy5jIChhZGRfbmV3X2NvbnRlbnRzKTogTWFsbG9jIHNlY3Rpb24gYXQgZnVsbCBzaXplLgotCShfYmZkX3NhdmVfZXZheF9zZWN0aW9uKTogTWVtY3B5IHNlY3Rpb24gY29udGVudHMgZGlyZWN0bHkuCi0JKiBldmF4LmggKEFMUEhBX1JfU1dSRUwzMiwgQUxQSEFfUl9TV1JFTDY0KTogUmVtb3ZlLgotCShldmF4X3JlbG9jX3RhYmxlKTogUmVtb3ZlLgotCi0JKiBob3N0cy9hbHBoYXZtcy5oIChPX0FDQ01PREUpOiBEZWZpbmUgaWYgbmVlZGVkLgotCi0JKiBtYWtlZmlsZS52bXM6IEFkZCBiZXR0ZXIgc3VwcG9ydCBmb3IgREVDIEMgY29tcGlsYXRpb24KLQlBZGQgZXZheC5oIGRlcGVuZGVuY2llcwotCi0JKiByZWxvYy5jIChiZmRfZ2V0X3JlbG9jX3NpemUpOiBBZGQgY2FzZSBmb3IgMTYgYnl0ZSByZWxvYy4KLQkoQkZEX1JFTE9DX1NXUkVMMzIsQkZEX1JFTE9DX1NXUkVMNjQpOiBSZW1vdmUuCi0JKEJGRF9SRUxPQ19BTFBIQV9CQVNFUkVHKTogUmVtb3ZlLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotVGh1IEF1ZyAgOCAwODoxNzozMiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcm1hcCk6ICBJZmRlZiBhcm91bmQgY2FsbHMgdG8gZ2V0dWlkIGFuZAotCWdldGdpZCBpZiBfV0lOMzIgaXMgZGVmaW5lZC4KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6ICBSZW1vdmUgdW5uZWNlc3NhcnkgV0lOR0RCIGlmZGVmLgotCi1XZWQgQXVnICA3IDIzOjE5OjAwIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggYmZkLWluLmggYmZkLWluMi5oIG9wbmNscy5jIHJpc2NpeC5jIHNvbS5jIHRhcmdldHMuYzoKLQlDaGFuZ2UgTk9fRkxBR1MgdG8gQkZEX05PX0ZMQUdTIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggYW4gSFBVWAotCWluY2x1ZGUgZmlsZS4KLQkqIGxpYmJmZC5jOiAgQ3JlYXRlIGR1bW15IGdldHBhZ2VzaXplKCkgbWFjcm8gaWYgSEFWRV9HRVRQQUdFU0laRQotCWlzbid0IGRlZmluZWQuCi0KLVdlZCBBdWcgIDcgMTQ6MTE6NDQgMTk5NiAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEJGRF9ORUVERURfREVDTEFSQVRJT04gb24gc3Ryc3RyIGFuZAotCXJlYWxsb2MuCi0JKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUik6IE5ldyBtYWNyby4KLQkoTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBzeXNkZXAuaCAoc3Ryc3RyKTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUi4KLQkocmVhbGxvYyk6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DLgotCi0JKiBhY2xvY2FsLm00IChCRkRfTkVFRF9ERUNMQVJBVElPTik6IEluY2x1ZGUgPHN0cmluZy5oPiBvcgotCTxzdHJpbmdzLmg+IGlmIHRoZXkgZXhpc3QuCi0KLQkqIGllZWUuYyAoaWVlZV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IENhc3QgYmZkX2FsbG9jIHJldHVybi4KLQotV2VkIEF1ZyAgNyAxMjoxMjowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1pMzg2LmMgKGk4MDg2X2FyY2gpOiBBcmNoaXRlY3R1cmUgaW5mbyBmb3IgdGhlIGk4MDg2LgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEVyaWMgVmFsZXR0ZSA8dmFsZXR0ZUBjcmYuY2Fub24uZnI+OgotCSogZWxmMzItaTM4Ni5jIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgRklSU1RfSU5WQUxJRF9SRUxPQywKLQlMQVNUX0lOVkFMSURfUkVMT0MsIFJfMzg2XzE2LCBSXzM4Nl9QQzE2LCBSXzM4Nl84LCBSXzM4Nl9QQzguCi0JKGVsZl9ob3d0b190YWJsZSk6IEFkZCBlbnRyaWVzIGZvciBuZXcgcmVsb2NzLgotCShlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBuZXcgcmVsb2NzLgotCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvKTogSnVzdCBjYWxsIGFib3J0LgotCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbCk6IENoZWNrIHRoYXQgdGhlIHJlbG9jIHR5cGUgaXMgdmFsaWQuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotVHVlIEF1ZyAgNiAxMjo1NDo1NiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChlbGZfZDEwdl9ob3d0b190YWJsZSk6IEFkZGVkIFJfRDEwVl8zMi4KLQotTW9uIEF1ZyAgNSAxMzo0Mjo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogRm9yIGEgbG9hZGFibGUgc2VjdGlvbiwKLQlvbmx5IGdldCB0aGUgTE1BIGZyb20gdGhlIHBoZHIgaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgcGFydCBvZiB0aGUKLQlmaWxlLgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogUmV3cml0ZSB0ZXN0cyBmb3Igc3RhcnRpbmcgYQotCW5ldyBzZWdtZW50IHRvIG1ha2UgdGhlbSBtb3JlIGNvbXByZWhlbnNpYmxlLiAgSWYgdGhlIHJlbGF0aW9uc2hpcAotCWJldHdlZW4gdGhlIExNQSBhbmQgdGhlIFZNQSBjaGFuZ2VkLCBzdGFydCBhIG5ldyBzZWdtZW50LiAgRG9uJ3QKLQljaGVjayBkeW5zZWMgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIHN0YXJ0IGEgbmV3IHNlZ21lbnQgZm9yIGEKLQl3cml0ZWFibGUgc2VjdGlvbjsgLU4gd2lsbCBub3cgaGFuZGxlIHRoaXMuCi0KLVRodSBBdWcgIDEgMjI6NDM6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmg6IFJlbW92ZSAiZXNlbCIgY2hhbmdlcy4gIE5vdCB0aGUgcmlnaHQgYXBwcm9hY2guCi0JKiBzb20uYzogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCShzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogVXNlIFNUX0RBVEEgZm9yIHN5bWJvbHMKLQl3aGljaCBkb24ndCBoYXZlIGEgU09NIHN5bWJvbCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgotCVJldmVyc2VzIGEgMTk5NCBjaGFuZ2UuCi0KLVdlZCBKdWwgMzEgMTU6NTA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JTWFrZSBsZCAtTiBtb3JlIHJlYXNvbmFibGUgZm9yIEVMRjoKLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBJZiBEX1BBR0VEIGlzIG5vdCBzZXQsIHNldAotCXBoZHJfaW5fc2VjdGlvbiB0byBmYWxzZSwgYW5kIGFsd2F5cyB1c2UgYSBzaW5nbGUgbG9hZCBzZWdtZW50LgotCShlbGZfc29ydF9zZWN0aW9ucyk6IFNvcnQgc2VjdGlvbnMgYnkgTE1BIGFmdGVyIFZNQS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IElmIERfUEFHRUQgaXMgbm90IHNldCwgZG9uJ3QKLQlhbGlnbiB0byBtYXhwYWdlc2l6ZS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogSWYgYSBzZWN0aW9uIGlzIGxvYWRlZCBidXQgbm90IHBhZ2UKLQlhbGlnbmVkLCBjbGVhciBEX1BBR0VELgotCi1XZWQgSnVsIDMxIDE1OjAwOjEyIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogcmVsb2MuYzogKEJGRF9SRUxPQ19BUk1fT0ZGU0VUSU1NOCwgQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwpOgotIAlBZGRlZCwgZm9yIGludGVybmFsIHVzZSBieSB0aGUgQVJNIGdhcy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0Ci0JKiBiZmQtaW4yLmg6IFJlYnVpbHQKLQotVHVlIEp1bCAzMCAxNDoxNDo1NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAoUl9IUFBBX0VTRUwpOiBOZXcgZmllbGQgc2VsZWN0b3IuCi0JKGVfZXNlbCk6IFNpbWlsYXJseS4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IElmIHdlIGVuY291bnRlciBhbiBlX2VzZWwsCi0JdGhlbiBnZW5lcmF0ZSBSX0NPTVAyIChQVVNIX1NZTSksIFJfREFUQV9FWFBSIGZpeHVwIHN0cmVhbS4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0RBVEFfRVhQUiBqdXN0IGxpa2UgUl9DT0RFX0VYUFIuCi0KLVR1ZSBKdWwgMzAgMTM6MzE6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERvIHRoZSByZWd1bGFyCi0JYXJjaGl2ZSBzZWFyY2ggYmVmb3JlIGxvb2tpbmcgZm9yIHN0cmlwcGVkIGR5bmFtaWMgb2JqZWN0cy4KLQotRnJpIEp1bCAyNiAxNzo1MTozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9idWlsZF9sZHN5bXMpOiBNYWtlIGV4cG9ydGluZyBhbiB1bmRlZmluZWQKLQlzeW1ib2wgYSB3YXJuaW5nIHJhdGhlciB0aGFuIGFuIGVycm9yLgotCi1XZWQgSnVsIDI0IDEyOjAyOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBUcmFjayB0aGUgdmlydHVhbAotCW1lbW9yeSBwb3NpdGlvbiBzZXBhcmF0ZWx5IGZyb20gdGhlIGZpbGUgcG9zaXRpb24sIGFuZCB1c2UgaXQgdG8KLQljb21wdXRlIHRoZSBhbGlnbm1lbnQgYWRqdXN0bWVudC4KLQotVHVlIEp1bCAyMyAxMDo0MzozMSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDEwdi5jIChlbGZfZDEwdl9ob3d0b190YWJsZSk6IENoYW5nZWQgYWxsIHJlbG9jcyB0byAibG9uZyIKLSAJYW5kIGZpeGVkIG1hc2sgb24gUl9EMTBWXzEwX1BDUkVMX0wuCi0KLU1vbiBKdWwgMjIgMTU6MzA6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmM6IEluY2x1ZGUgImFvdXQvYXIuaCIuCi0JKG1pcHNfZWxmNjRfc2x1cnBfYXJtYXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZjY0X3dyaXRlX2FybWFwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjY0X2FyY2hpdmVfKik6IERlZmluZS4KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fYXJjaGl2ZV9wKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCVVzZSBpbnN0ZWFkIG9mIGJmZF9nZW5lcmljX2FyY2hpdmVfcC4KLQkoYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuICBVc2UKLQlpbnN0ZWFkIG9mIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cy4KLQkoYmZkX2VsZk5OX21rZGFyY2hpdmUpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuICBVc2UgaW5zdGVhZCBvZgotCV9iZmRfZ2VuZXJpY19ta2FyY2hpdmUuCi0JKFRBUkdFVF9CSUdfU1lNKTogSWYgYmZkX2VsZk5OX2FyY2hpdmVfZnVuY3Rpb25zIGlzIGRlZmluZWQsIHVzZQotCWJmZF9lbGZOTl9hcmNoaXZlIGluIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgcmF0aGVyIHRoYW4KLQlfYmZkX2FyY2hpdmVfY29mZi4KLQkoVEFSR0VUX0xJVFRMRV9TWU0pOiBMaWtld2lzZS4KLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2FybWFwKTogQ2hlY2sgZm9yIGFuZCByZWplY3QgYW4gYXJjaGl2ZSBtYXAKLQluYW1lIG9mIC9TWU02NC8uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogSGFuZGxlCi0JU0hUX01JUFNfTElCTElTVCwgU0hUX01JUFNfQ09OVEVOVCwgU0hUX01JUFNfU1lNQk9MX0xJQiwgYW5kCi0JU0hUX01JUFNfRVZFTlRTIHNlY3Rpb25zLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogSGFuZGxlIFNIVF9NSVBTX0lGQUNFLAotCVNIVF9NSVBTX0NPTlRFTlQsIFNIVF9NSVBTX1NZTUJPTF9MSUIsIGFuZCBTSFRfTUlQU19FVkVOVFMKLQlzZWN0aW9ucy4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IEFkZCByZGF0YV9pbl90ZXh0IGZpZWxkLgotCSogZWNvZmYuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQ29weQotCXJkYXRhX2luX3RleHQgZnJvbSBiYWNrZW5kIGluZm8gdG8gdGRhdGEuICBDbGVhciBpdCBpZiBhbnkgZGF0YQotCXNlY3Rpb24gY29tZXMgYmVmb3JlIC5yZGF0YS4KLQkoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgcmRhdGFfaW5fdGV4dCBmaWVsZCBpbgotCXRkYXRhIHJhdGhlciB0aGFuIGJhY2tlbmQgaW5mby4KLQotRnJpIEp1bCAxOSAxODoxNTo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRml4IHRlc3QgZm9yIHdoZXRoZXIgYSBjb21waWxlciBoYXMgYSA2NCBiaXQKLQl0eXBlLiAgRnJvbSBKaW0gV2lsc29uIDx3aWxzb25AY3lnbnVzLmNvbT4uCi0KLVRodSBKdWwgMTggMTU6Mzk6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdCAobWlwcy1zZ2ktaXJpeDYqKTogTmV3IGhvc3QuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGFuZCBzdWJzdGl0dXRlIFZFUlNJT04sIEJGRF9IT1NUXzY0QklUX0xPTkcKLQkocmVwbGFjaW5nIEhPU1RfNjRCSVRMT05HKSwgQkZEX0hPU1RfNjRfQklUX0RFRklORUQsCi0JQkZEX0hPU1RfNjRfQklULCBhbmQgQkZEX0hPU1RfVV82NF9CSVQuICBBZGQgYmZkLWluMi5oOmJmZC1pbjIuaAotCXRvIEFDX09VVFBVVCBjYWxsLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogYmZkLWluLmggKEJGRF9BUkNIX1NJWkUpOiBEZWZpbmUgYXMgQHdvcmRzaXplQCwgbm90IEBXT1JEU0laRUAuCi0JKEJGRF9IT1NUXzY0X0JJVCk6IERlZmluZSBjb25kaXRpb25hbGx5LgotCShCRkRfSE9TVF9VXzY0X0JJVCk6IERlZmluZSB3aGVuIEJGRF9IT1NUXzY0X0JJVCBpcyBkZWZpbmVkLgotCShiZmRfdm1hKTogVHlwZWRlZiBhcyBCRkRfSE9TVF9VXzY0X0JJVC4KLQkoc3ltdmFsdWUsIGJmZF9zaXplX3R5cGUpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChkb19jbGVhbik6IFJlbW92ZSBiZmQtdG1wLmguCi0JKGRvX2Rpc3RjbGVhbik6IFJlbW92ZSBiZmQtaW4zLmguCi0JKHN0bXAtYmZkLmgpOiBKdXN0IGRvIGNvcHktaWYtY2hhbmdlIGJmZC1pbjMuaCBiZmQuaC4KLQkoYmZkLWluMy5oKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlnLmJmZCAoc3BhcmMtKi1zeXN2NCopOiBEb24ndCBidWlsZCBzdW5vc19iaWdfdmVjLiAgRnJvbQotCUFuZHJldyBHaWVydGggPEFORFJFV0dAbWljcm9saXNlLmNvLnVrPi4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBJTlNUQUxMX1NITElCLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1NVQlNUIChJTlNUQUxMX1NITElCKS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogVXNlIEBJTlNUQUxMX1NITElCQC4KLQotCSogY29uZmlnLmJmZCAobWlwcyotKi1pcml4NiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmhvc3Q6IEhhbmRsZSBJcml4IDYgc2hhcmVkIGxpYnJhcnkgbGlrZSBJcml4IDUuCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgY2hlY2sgYW4gWE1DX1RECi0Jc3ltYm9sIGZvciBhIG1hZ2ljIG5hbWUuCi0JKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgY2hhbmdlIHRoZSByZWxvYyBzeW1ib2wgZm9yIGFuCi0JWE1DX1REIHN5bWJvbC4KLQkoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGdldCB0aGUgVE9DIG9mZnNldCBmb3IgYW4KLQlYTUNfVEQgc3ltYm9sLgotCi1UaHUgSnVsIDE4IDExOjM2OjMxIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIEVMRiBzdXBwb3J0IHRvIG1pcHMgY29uZmlnLCBjcmVhdGUgdGhlCi0JZWxmMzItdGFyZ2V0LmggZmlsZSBpbiB0aGUgb2JqZWN0IGRpci4KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBlbGZYWC10YXJnZXQuaCByZWZzIGF0IGJlZ2lubmluZ3Mgb2YgbGluZXMuCi0KLVdlZCBKdWwgMTcgMTg6MDI6MzIgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmM6IFJlZGlkIGRlYnVnIHNjaGVtZSAtIG51bWVyb3VzIGZwcmludGYncyBnb25lLgotCUFsc28gcmVtb3ZlZCBtb3N0IGFib3J0IGNhbGxzLCBpbiBmYXZvciBvZiB1c2luZyBiZmQgcmVwb3J0aW5nLgotCi1XZWQgSnVsIDE3IDE0OjUxOjUyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1kMTB2Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTKSBBZGQgZWxmMzItZDEwdi5vLgotCSogYXJjaHVyZXMuYzogQWRkIGJmZF9kMTB2X2FyY2guCi0JKiBiZmQtaW4yLmg6IEFkZCBiZmRfZDEwdl9hcmNoLgotCSogY29uZmlnLmJmZCAoZDEwdi0qLSopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiAoYmZkX2VsZjMyX2QxMHZfdmVjKSBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlLmluOiAoYmZkX2VsZjMyX2QxMHZfdmVjKSBOZXcgdmVjdG9yLgotCSogY3B1LWQxMHYuYzogTmV3IGZpbGUuCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkZWQgY2FzZSBiZmRfYXJjaF9kMTB2LgotCSogZWxmMzItZDEwdi5jOiBOZXcgZmlsZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUiwgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTCwKLSAJQkZEX1JFTE9DX0QxMFZfMTgsIEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMKTogRGVmaW5lLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfZDEwdl92ZWMpOiBOZXcgdmVjdG9yLgotCi1XZWQgSnVsIDE3IDEwOjU4OjU1IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlZCBib2d1cyBmcHJpbnRmCi0KLVR1ZSBKdWwgMTYgMjM6NDk6MDIgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyBiZmQtaW4yLmg6ICBBZGQgYmZkX21hY2hfaTM4Nl9pMzg2IGFuZAotCWJmZF9tYWNoX2kzODZfaTgwODYgbWFjaGluZSB0eXBlcy4KLQotV2VkIEp1bCAxMCAxMjo0Mjo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFNldCBTRUNfQ09ERSBmb3IgX0lOSVQKLQlhbmQgX0ZJTkkgc2VjdGlvbnMuCi0KLVdlZCBKdWwgMTAgMTE6MTg6MjEgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBBL1VYIGRvZXMgbm90IHJlcXVpcmUKLQlzcGVjaWFsIGhhbmRsaW5nIG9mIHRoZSBfTElCIHNlY3Rpb24uCi0KLVR1ZSBKdWwgIDkgMTU6NTI6MjAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBVc2UgdGhlIGNvcnJlY3QKLQl2YWx1ZSBmb3IgUl9SRUxCWVRFLgotCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IE9ubHkgInNocmlua3MiCi0JYXJyYXkgaWYgb25lIHdhcyBhbGxvY2F0ZWQuCi0KLVR1ZSBKdWwgIDkgMTI6MjE6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBLYXp1bW90byBLb2ppbWEgPGtrb2ppbWFAa2suaW5mby5rYW5hZ2F3YS11LmFjLmpwPjoKLQkqIGVsZjMyLW1pcHMuYyAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBuZXcgZmllbGRzCi0JdXNlX3JsZF9vYmpfaGVhZCBhbmQgcmxkX3ZhbHVlLgotCShtaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCShtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBNYXJrIF9fcmxkX29ial9oZWFkIHN5bWJvbCBhcwotCWR5bmFtaWMuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ3JlYXRlIC5ybGRfbWFwIHNlY3Rpb24uICBJZgotCV9fcmxkX29ial9oZWFkIHN5bWJvbCBub3Qgc2VlbiwgY3JlYXRlIGFuIF9fcmxkX21hcCBzeW1ib2wuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE1ha2Ugc3BhY2UgaW4gLnJsZF9tYXAgc2VjdGlvbi4KLQlDcmVhdGUgYSBEVF9NSVBTX1JMRF9NQVAgZW50cnkgcmF0aGVyIHRoYW4gYSBEVF9ERUJVRyBlbnRyeS4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogU2F2ZSB2YWx1ZSBvZiBfX3JsZF9tYXAgb3IKLQlfX3JsZF9vYmpfaGVhZCBzeW1ib2wuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogSGFuZGxlIERUX01JUFNfUkxEX01BUC4KLQotTW9uIEp1bCAgOCAxNjoxODowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19yZWxvY19tYXApOiBSZW1vdmUgQkZEX1JFTE9DXzMyX1BDUkVMIGVudHJ5LgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBGb3IgUl9QUENfQUREUjE2X0hBLCB1c2UKLQlwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYy4KLQkocHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb2ZmLW1pcHMuYyAoc3RydWN0IG1pcHNfaGkpOiBEZWZpbmUuCi0JKG1pcHNfcmVmaGlfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0gCShtaXBzX3JlZmhpX2FkZHIsIG1pcHNfcmVmaGlfYWRkZW5kKTogUmVtb3ZlLgotCShtaXBzX3JlZmhpX3JlbG9jKTogTWFpbnRhaW4gYSBsaXN0IG9mIHVubWF0Y2hlZCBSRUZISSByZWxvY3MuCi0JKG1pcHNfcmVmbG9fcmVsb2MpOiBQcm9jZXNzIG1pcHNfcmVmaGlfbGlzdC4KLQkobWlwc19yZWxoaV9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwc19yZWxoaV9hZGRyLCBtaXBzX3JlbGhpX2FkZGVuZCk6IFJlbW92ZS4KLQkobWlwc19yZWxoaV9yZWxvYyk6IE1haW50YWluIGEgbGlzdCBvZiB1bm1hdGNoZWQgUkVMSEkgcmVsb2NzLgotCShtaXBzX3JlbGxvX3JlbG9jKTogUHJvY2VzcyBtaXBzX3JlbGhpX2xpc3QuCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IFBlcm1pdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIFJFRkhJIG9yCi0JUkVMSEkgcmVsb2NzIGJlZm9yZSB0aGUgYXNzb2NpYXRlZCBSRUZMTyBvciBSRUxMTyByZWxvYy4KLQotRnJpIEp1bCAgNSAxOToyNzo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IFNldCByZWxvY19jb3VudCBmaWVsZHMuCi0KLVRodSBKdWwgIDQgMTI6MDA6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogRG9uJ3QgY3JlYXRlIGR5bmFtaWMKLQlzZWN0aW9ucyB1bmxlc3MgdGhpcyBpcyBhIFN1bk9TIGxpbmsuCi0KLQkqIFZFUlNJT046IFNldCB0byAyLjcuMS4KLQotCSogUmVsZWFzZWQgYmludXRpbHMgMi43LgotCi1XZWQgSnVsICAzIDE0OjU5OjQ3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4NmFvdXQuYzogSW5jbHVkZSAiYW91dC9hb3V0NjQuaCIuCi0gCShpMzg2YW91dF93cml0ZV9vYmplY3RfY29udGVudHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShNWV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWZpbmUuCi0KLQkqIG5ldGJzZC5oIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogTWFrZSBzdXJlIHRoYXQKLQlhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMgaXMgY2FsbGVkIGJlZm9yZSBmaWRkbGluZyB3aXRoIHRoZSBtYWdpYwotCW51bWJlci4KLQotVHVlIEp1bCAgMiAyMzozMDozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogRml4IGNhc3RzIG9mIHBzaW5mby4KLQotU3VuIEp1biAzMCAxMzozNDozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChpdG9zLCBzdG9pKTogRG9uJ3QgZGVmaW5lLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBpMzg2bHlueC5jIChLRUVQSVQpOiBEZWZpbmUgYXMgdWRhdGEuaS4KLQkoTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX291dCkpOiBEb24ndCB1c2Ugc3RvaS4KLQkoTkFNRShseW54LHN3YXBfZXh0X3JlbG9jX291dCkpOiBMaWtld2lzZS4KLQkqIHJpc2NpeC5jIChyaXNjaXhfc3dhcF9zdGRfcmVsb2Nfb3V0KTogVXNlIHVkYXRhLmkgcmF0aGVyIHRoYW4KLQlmbGFncy4gIERvbid0IHVzZSBzdG9pLgotCi0JKiBlbGYzMi1taXBzLmMgKEVMRl9NQUdQQUdFU0laRSk6IENoYW5nZSBkZWZpbml0aW9uIHRvIDB4MTAwMC4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IERvbid0IHN0YXJ0IGEgbmV3IHNlZ21lbnQgZm9yCi0gCWEgd3JpdGFibGUgc2VjdGlvbiBpZiBpdCdzIG9uIHRoZSBzYW1lIHBhZ2UgYXMgdGhlIHByZXZpb3VzCi0gCXNlZ21lbnQuICBSZXNldCB0aGUgd3JpdGFibGUgdmFyaWFibGUgZm9yIGEgcmVhZG9ubHkgc2VjdGlvbi4KLQotU2F0IEp1biAyOSAxNjoxODo1MSAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbik6IE1pc3NpbmcgaW5pdGlhbGl6YXRpb25zIG9mCi0JZmlyc3RfdGh1bmtfYWRkcmVzcywgdGh1bmtfc2l6ZSwgYW5kIGltcG9ydF90YWJsZV9zaXplLgotCSogcGVpY29kZS5oOiBJbXByb3ZlZCBzb21lIGRpYWdub3N0aWNzIHJlZ2FyZGluZyBlZGF0YSBzZWN0aW9ucy4KLQotCSogY29mZi1wcGMuYyAoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEVhcmxpZXIgZXJyb3IgY2hlY2sKLQlvbiBJTUdMVUUgcmVsb2NzLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogSW1wcm92ZWQgZGlhZ25vc3RpYyBmb3IgbGFyZ2UgVE9DREVGTidzLgotCShUQVJHRVRfTElUVExFX1NZTSk6IEFkZGVkIG1pc3NpbmcgRF9QQUdFRC4KLQotRnJpIEp1biAyOCAxMzo0ODo0NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBBbiB1bmRlZmluZWQgc3ltYm9sCi0Jd2l0aCBYQ09GRl9ERUZfRFlOQU1JQyBzZXQgaXMgcmVhbGx5IGRlZmluZWQuCi0JKHhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBPbmx5IGNyZWF0ZSBzcGVjaWFsIHNlY3Rpb25zIGlmIHVzaW5nIGFuCi0JWENPRkYgaGFzaCB0YWJsZS4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEhhbmRsZSB4Y29mZi1wb3dlcm1hYyBsaWtlCi0JYWl4Y29mZi1yczYwMDAuCi0JKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQotRnJpIEp1biAyOCAxMToxNzowMCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgZmxhZ3MKLQlmaWVsZC4KLQkoQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9BRERSKTogRGVmaW5lLgotCShBTFBIQV9FTEZfTElOS19IQVNIX0xVX01FTSk6IERlZmluZS4KLQkoQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9GVU5DKTogRGVmaW5lLgotCShlbGY2NF9hbHBoYV9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgZmxhZ3MgZmllbGQuCi0JKGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcyk6IFJlY29yZCB0eXBlcyBvZiBMSVRVU0UgZW50cmllcyB0aGF0Ci0JYXJlIGZvdW5kIGZvciBMSVRFUkFMIHJlbG9jcy4KLQkoZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgaGFzIGl0cyBhZGRyZXNzCi0JdGFrZW4sIHdlIGNhbm5vdCBnZW5lcmF0ZSBhIC5wbHQgZW50cnkgZm9yIHRoZSBzeW1ib2wuCi0KLVRodSBKdW4gMjcgMTE6MjQ6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19JU0NfUE9TSVgsIGFuZCBjaGVjayBmb3Igc2V0aXRpbWVyIGFuZAotCXN5c2NvbmYgZnVuY3Rpb25zIChmb3IgZ3Byb2YpLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLVdlZCBKdW4gMjYgMTY6Mjk6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2FyY2hpdmVfcCk6IENoZWNrIHRoZSBmaXJzdCBvYmplY3QgZmlsZSBpbgotCWFuIGFyY2hpdmUgaWYgaXQgaGFzIGEgbWFwLiAgSWYgdGhlIG9iamVjdCBmaWxlIGhhcyB0aGUgd3JvbmcKLQl4dmVjLCByZWplY3QgaXQuCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfYWRqdXN0X3JlbG9jX2luKTogU2V0IHRoZSBhZGRlbmQgZm9yIGEKLQlCUkFERFIsIFNSRUwxNiwgU1JFTDMyLCBvciBTUkVMNjQgcmVsb2MgYWdhaW5zdCBhbiBleHRlcm5hbAotCXN5bWJvbC4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogVXNlIFJFTFNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBVc2UgRklMSFNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfc3ltX291dCk6IFVzZSBTWU1FU1osIG5vdCBzaXplb2YuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogVXNlIEFVWEVTWiwgbm90IHNpemVvZi4KLQkoY29mZl9zd2FwX2xpbmVub19vdXQpOiBVc2UgTElORVNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBVc2UgQU9VVFNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFVzZSBTQ05IU1osIG5vdCBzaXplb2YuCi0JKiBwZWljb2RlLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVHVlIEp1biAyNSAxNToyODozNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogQ29tbWVudCBvdXQgY29kZQotCWRlYWxpbmcgd2l0aCBtYWtpbmcgR09UIHBvaW50ZXJzIG5lZ2F0aXZlIG9mIHRoZSBHT1Qgc3ltYm9sIGZvcgotCW5vdy4KLQotVHVlIEp1biAyNSAxMTo0MToyNCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QKLQlpbmNyZW1lbnQgdGhlIC5yZWxhLnBsdCBzaXplIHVudGlsIGFmdGVyIHdlJ3JlIGRvbmUgY3JlYXRpbmcgdGhlCi0JLnBsdCBlbnRyeS4KLQkoZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQ2hhbmdlIC5wbHQgZW50cnkgdG8gbG9hZCB0aGUKLQkucmVsYS5wbHQgb2Zmc2V0IGRpcmVjdGx5IHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nIGl0LgotCi1Nb24gSnVuIDI0IDE3OjE1OjEwIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbiwgKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIpOgotCVVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgotICAgICAgICAqIGRvYy9NYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwKLQlpbmNsdWRlZGlyLCBJTlNUQUxMLCBJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZi1zZXQKLQl2YWx1ZXMuCi0gICAgICAgIChkb2NkaXIpOiBEZWxldGVkLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgdjIuNSBvciBoaWdoZXIuCi0gICAgICAgICogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gSnVuIDI0IDIyOjUwOjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBGaXggdHlwbyBpbiBSX0VORF9UUlkgZm9yIGV4Y2VwdGlvbgotCWhhbmRsaW5nIGNvZGUgPiAxayBhd2F5LgotCi1Nb24gSnVuIDI0IDE4OjQxOjA2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBJZiBERUJVRyBpcwotCWRlZmluZWQsIG91dHB1dCB3aGVuZXZlciB0aGUgc3ltYm9sIGlzIHVwZGF0ZWQuCi0KLU1vbiBKdW4gMjQgMTc6NTg6MTIgMTk5NiAgSm91a2UgTnVtYW4gIDxqbnVtYW5AYmF6aXMubmw+Ci0KLQkqIGVsZi5jIChlbGZfZmFrZV9zZWN0aW9ucyk6IERvbid0IHNldCBzaF9hZGRyIG9mIGEgbm9uIFNFQ19BTExPQwotCXNlY3Rpb24gdG8gMCBpZiB1c2VyX3NldF92bWEgaXMgc2V0LgotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQotU3VuIEp1biAyMyAyMDo0Mjo1MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JUGFydGlhbGx5IHVuZG8gcGF0Y2ggb2YgSnVuIDIwLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBVc2UgQ09GRl9JTUFHRV9XSVRIX1BFLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLiAgUmUtYWRkIGRlbGV0ZWQgY29kZSwgYnV0Ci0JdXNlICNpZmRlZiBDT0ZGX1dJVEhfUEUsIG5vdCBDT0ZGX09CSl9XSVRIX1BFLgotCSogcGVpY29kZS5oIChwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogUmUtYWRkICNpZmRlZi4KLQotRnJpIEp1biAyMSAxNzozODoxNSAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBtZXJsaW4uZ2NzLnJlZHN0b25lLmFybXkubWlsPgotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgKi0qLXJ0ZW1zKiBjb25maWd1cmF0aW9ucy4KLQotRnJpIEp1biAyMSAxNToxOTo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgYmZkX2FyY2hfYWxwaGEgY2FzZS4KLQotRnJpIEp1biAyMSAxMjozNToyNyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYzogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkIChhbHBoYS0qLWxpbnV4ZWNvZmYqKTogTmV3IHRhcmdldC4KLQkoYWxwaGEtKi1saW51eCosIGFscGhhLSotZWxmKik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChiZmRfZWxmNjRfYWxwaGFfdmVjKTogTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjY0X2FscGhhX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGJmZF9lbGY2NF9hbHBoYV92ZWMgaWYgQkZENjQuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfQUxQSEFfR1BESVNQKTogRGVmaW5lLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDY0X0JBQ0tFTkRTKTogQWRkIGVsZjY0LWFscGhhLm8uCi0JKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGY2NC1hbHBoYS5jLgotCi1UaHUgSnVuIDIwIDE4OjE0OjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfYXJtYXBfaGFzaCk6IElmIGhsb2cgaXMgMCwganVzdCByZXR1cm4gMCwgcmF0aGVyCi0JdGhhbiByZWx5aW5nIG9uIGEgcmlnaHQgc2hpZnQgb2YgMzIuCi0KLVRodSBKdW4gMjAgMTE6MDA6NTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBDaGFuZ2UgQ09GRl9JTUFHRV9XSVRIX1BFCi0JaWZkZWYgdG8gQ09GRl9XSVRIX1BFLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLiAgRGVsZXRlIENPRkZfT0JKX1dJVEhfUEUuCi0JKiBwZS17YXJtLGkzODYscHBjfS5jIChDT0ZGX09CSl9XSVRIX1BFKTogRGVsZXRlLgotCSogcGVpY29kZS5oIChwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVsZXRlIGlmZGVmCi0JQ09GRl9JTUFHRV9XSVRIX1BFLCBhbHdheXMgaW5jbHVkZS4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6ICIuZHJlY3R2ZSIgZG9lc24ndCBoYXZlIHRyYWlsaW5nIDAuCi0KLVdlZCBKdW4gMTkgMTE6Mzc6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogRml4IHVwIHRoZSB0ZXN0IGZvciAtVHRleHQgdG8KLQlhcHByb3hpbWF0ZSB0aGUgY29ycmVjdCBhbnN3ZXIgaWYgU0laRU9GX0hFQURFUlMgd2FzIG5vdCB1c2VkLgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IHNlY3Rpb24gZmlsZQotCXBvc2l0aW9uIGJhc2VkIG9uIExNQSByYXRoZXIgdGhhbiBWTUEuCi0KLVdlZCBKdW4gMTkgMTE6MTk6MjUgMTk5NiAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUlDNSA2MC8zLzE0MiAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogRG9uJ3Qgb3V0cHV0IGFueQotCXN5bWJvbHMgaWYgaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsLgotCi1UdWUgSnVuIDE4IDE1OjE3OjM2IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWg4MzAwLmM6IFJlbW92ZSAjaWYgMCBjb2RlLgotCShjb21wYXRhYmxlKTogRG9uJ3QgYWxsb3cgbWl4aW5nL21hdGNoaW5nIG9mIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9oODMwMHMpOiBBZGQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBjb2ZmLWg4MzAwLmMgKGZ1bmN2ZWNfaGFzaF9uZXdmdW5jKTogSGFuZGxlIEg4L1MgdG9vLgotCShCQURNQUcpOiBMaWtld2lzZS4KLQkoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IExpa2V3aXNlLgotCShoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTGlrZXdpc2UuCi0JKGg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IExpa2V3aXNlLgotCShjb2ZmX3NldF9mbGFncyk6IExpa2V3aXNlLgotCSogY3B1LWg4MzAwLmMgKGg4MzAwX3NjYW4pOiBMaWtld2lzZS4KLQlBZGQgSDgvUyB0byBiZmRfaDgzMDBfYXJjaCBsaXN0LgotCi1UdWUgSnVuIDE4IDE0OjQyOjU4IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JQWRkZWQgc3VwcG9ydCBmb3IgQWxwaGEgT3BlblZNUzoKLQkqIGV2YXguaCwgZXZheC1hbHBoYS5jLCBldmF4LWVnc2QuYywgZXZheC1lbWguYzogTmV3IGZpbGVzLgotCSogZXZheC1ldGlyLmMsIGV2YXgtbWlzYy5jLCBob3N0cy9hbHBoYXZtcy5oOiBOZXcgZmlsZXMuCi0JKiBjb25maWcuaC12bXMsIG1ha2VmaWxlLnZtczogTmV3IGZpbGVzLgotCSogY29uZmlnLmJmZCAoYWxwaGEtKi0qdm1zKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGV2YXhfYWxwaGFfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfU1dSRUwzMiwgQkZEX1JFTE9DX1NXUkVMNjQpOiBEZWZpbmUuCi0JKEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFLCBCRkRfUkVMT0NfQUxQSEFfQkFTRVJFRyk6IERlZmluZS4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIpOiBEZWZpbmUuCi0JKGV2YXhfYWxwaGFfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgZWNvZmZhbHBoYV9saXR0bGVfdmVjIGFuZCBldmF4X2FscGhhX3ZlYwotCWlmIEJGRDY0IGlzIGRlZmluZWQuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQ2NF9CQUNLRU5EUyk6IEFkZCBldmF4LWFscGhhLm8sIGV2YXgtZWdzZC5vLCBldmF4LWV0aXIubywKLQlldmF4LWVtaC5vLCBhbmQgZXZheC1taXNjLm8uCi0JKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBldmF4LWFscGhhLmMsIGV2YXgtZWdzZC5jLAotCWV2YXgtZXRpci5jLCBldmF4LWVtaC5jLCBhbmQgZXZheC1taXNjLmMuCi0JKEhGSUxFUyk6IEFkZCBldmF4LmguCi0KLVR1ZSBKdW4gMTggMTM6NTQ6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBNYWtlIG5hbWUgYSBjb25zdAotCXBvaW50ZXIuCi0JKGg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLU1vbiBKdW4gMTcgMTA6MDY6NTAgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNvbS5oIChSX0hQUEFfQkVHSU5fVFJZLCBSX0hQUEFfRU5EX1RSWSk6IERlZmluZS4KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfQkVHSU5fVFJZIGFuZCBSX0VORF9UUlkuCi0KLU1vbiBKdW4gMTcgMTI6NDk6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBjcmVhdGUgYSByZWxvYwotCWZvciBSX01JUFNfUkVMMzIgYW5kIFJfTUlQU18zMiByZWxvY3MgaWYgbm8gZHluYW1pYyBzZWN0aW9ucyB3ZXJlCi0JY3JlYXRlZC4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogT25seSBjcmVhdGUgLnJlbC5keW4gZm9yIFJfTUlQU19SRUwzMiBhbmQKLQlSX01JUFNfMzIgcmVsb2NzIGlmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0KLVRodSBKdW4gMTMgMjA6MTQ6NTEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IFVzZSBwZWlfc2VjdGlvbl9kYXRhIHJhdGhlciB0aGFuCi0JX2Nvb2tlZF9zaXplLiAgQ29ycmVzcG9uZHMgdG8gTWF5IDEzIGNoYW5nZSBpbiBjb2ZmY29kZS5oLgotCi1UaHUgSnVuIDEzIDEwOjIzOjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiB0aGVyZSBhcmUgbG9uZwotCXNlY3Rpb24gbmFtZXMsIGFsd2F5cyBzZXQgdGhlIGZfc3ltcHRyIGZpZWxkLCBldmVuIGlmIHRoZXJlIGFyZSBubwotCXN5bWJvbHMuCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9maWxlaGRyX2luKTogRG9uJ3QgY2xlYXIgdGhlIGZfc3ltcHRyIGZpZWxkCi0JaWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMuCi0KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLgotCShjb2ZmX3JlYWxfb2JqZWN0X3ApOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQltYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUuCi0JKF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IENoZWNrIHRoYXQgdGhlcmUgYXJlIHNvbWUgc3ltYm9scwotCWJlZm9yZSB0cnlpbmcgdG8gcmVhZCB0aGUgc3RyaW5nIHRhYmxlIHNpemUuCi0KLVdlZCBKdW4gMTIgMTE6MTY6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFdoZW4gY29uc2lkZXJpbmcgd2hldGhlcgotCXRvIHJlcGxhY2UgYSBzeW1ib2wgaW4gYSBkeW5hbWljIG9iamVjdCB3aXRoIGEgc3ltYm9sIGZyb20gYW5vdGhlcgotCWR5bmFtaWMgb2JqZWN0LCBkbyB0aGUgcmVwbGFjZW1lbnQgaWYgdGhlIGV4aXN0aW5nIHN5bWJvbCBpcwotCWdsb2JhbCBsaW5rYWdlIGNvZGUuCi0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgZXhwbGljaXRseQotCWZvciBfcHRyZ2wsIGFuZCB0cmVhdCBpdCBhcyBnbG9iYWwgbGlua2FnZSBjb2RlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogTm90aWNlIGlmIHdlIGZpbmQgYQotCWZpbGVuYW1lIG9yIE5fU08gc3ltYm9sIHBhc3QgdGhlIG9mZnNldCwgYW5kIHVzZSBpdCB0byBpbmRpY2F0ZQotCXRoYXQgdGhlcmUgaXMgbm8gbGluZSBudW1iZXIgb3IgZnVuY3Rpb24gd2hlbiBhcHByb3ByaWF0ZS4KLQotVHVlIEp1biAxMSAxNToyNDo0OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9idWlsZF9sZHN5bXMpOiBTZXQgWENPRkZfREVGX1JFR1VMQVIgZm9yIGEKLQljb21tb24gc3ltYm9sIGRlZmluZWQgYnkgdGhlIGxpbmtlci4gIERvbid0IGV4cG9ydCBmdW5jdGlvbiBjb2RlCi0JZXZlbiBpZiBleHBvcnRfZGVmaW5lZHMgaXMgc2V0LgotCi1Nb24gSnVuIDEwIDExOjU3OjI3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChob3d0b190YWJsZSk6IEFkZCBuZXcgZW50cmllcyBmb3IgUl9CQ0NfSU5WCi0JYW5kIFJfSk1QX0RFTC4KLQkocnR5cGUyaG93dG8pOiBIYW5kbGUgUl9CQ0NfSU5WIGFuZCBSX0pNUF9ERUwuCi0JKGg4MzAwX3N5bWJvbF9hZGRyZXNzX3ApOiBOZXcgZnVuY3Rpb24uCi0JKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBFbGltaW5hdGUganVtcHMgbWFkZSB1bm5lY2Vzc2FyeSBieQotCXJlbGF4aW5nLgotCi1TdW4gSnVuICA5IDE2OjMwOjIwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogRml4IG1hbnkgbWlub3Igc3BhY2luZwotCXByb2JsZW1zLgotCShoODMwMF9yZWxvYzE2X2VzdGltYXRlLCBjYXNlcyBSX0pNUDEsIFJfSk1QMik6IEFkanVzdCAiZG90IgotCWNvcnJlY3RseSBmb3IgdGhlIHR3byB2YXJpYW50cy4gIEFsbG93IHJlbGF4aW5nIGlmIHRoZSB0YXJnZXQKLQlpcyAxMjggYnl0ZXMgYXdheSBzaW5jZSBhZnRlciByZWxheGF0aW9uIGl0J2xsIGJlIDEyNiBieXRlcyBhd2F5LgotCShoODMwMF9yZWxvYzE2X2VzdGltYXRlLCBjYXNlIFJfUENSV09SRCk6IENvcnJlY3RseSBhZGp1c3QKLQkiZG90IiBhbmQgInZhbHVlIi4gIEFsbG93IHJlbGF4aW5nIGlmIHRoZSB0YXJnZXQgaXMgMTI4IGJ5dGVzCi0JYXdheSBzaW5jZSBhZnRlciByZWxheGF0aW9uIGl0J2xsIGJlIDEyNiBieXRlcyBhd2F5LgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBLZWVwIHJlbGF4aW5nCi0JdGhlIGdpdmVuIHNlY3Rpb24gdW50aWwgbm90aGluZyBjaGFuZ2VzLgotCi1UaHUgSnVuICA2IDE1OjI0OjQ1IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBSZW1vdmUgdGhlIF9QREFUQQotIAlhbGlnbm1lbnQgaGFjay0td2UgY2FuIGdldCB0aGUgbG5ub3B0ciBpbmZvIGFub3RoZXIgd2F5IHdpdGhvdXQKLSAJc3VkZGVubHkgaW5jcmVhc2luZyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gIFNldCB0aGUgZmxhZ3MgZm9yCi0JdGhlIF9QREFUQSBzZWN0aW9uLgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEbyBzby4KLQotVGh1IEp1biAgNiAxMToyNDozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9vYmplY3RfY29udGVudHMpOiBQdXQgYSB0aW1lc3RhbXAgaW4gdGhlIGZpbGUKLQl0byBrZWVwIHRoZSBIUCBlbXVsYXRvciBkYXRhYmFzZSBoYXBweS4KLQotCSogY29uZmlnLmJmZDogUmVjb2duaXplIHBvd2VycGMtKi1saW51eCogYW5kIHBvd2VycGNsZS0qLWxpbnV4Ki4KLQlGcm9tIEtldmluIEJ1ZXR0bmVyIDxrZXZAcHJpbWVuZXQuY29tPi4KLQotV2VkIEp1biAgNSAxNToxNjowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogRG9uJ3QgdHJ5IHRvIHByaW50IHRoZQotCW5hbWUgb2YgYSBOVUxMIHNlY3Rpb24uCi0KLVR1ZSBKdW4gIDQgMTg6NTM6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBJZiBub3RpY2VfYWxsIGlzCi0Jc2V0LCBhbHdheXMgY2FsbCB0aGUgbm90aWNlIGNhbGxiYWNrLgotCi0JKiBWRVJTSU9OOiBJbmNyZW1lbnQgZm9yIGJmZGxpbmsuaCBjaGFuZ2UuCi0KLU1vbiBKdW4gIDMgMTE6MDE6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUik6IFNldCB0byA0LgotCShzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIGRpZmZlcmVudGx5IHNpemVkCi0JdHJhaWxpbmcgYWxpZ25tZW50IHJlbG9jLgotCi0JKiBiZmQtaW4uaDogVXNlICNlcnJvciBpZiBCRkRfSE9TVF82NF9CSVQgY2FuIG5vdCBiZSBkZWZpbmVkLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluOiBXYXJuIGlmIHRoZXJlIGlzIG5vIGtub3duIDY0IGJpdCB0eXBlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBwcGNib290Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBwcGNib290LmMuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSBjLgotCUZyb20gUGVyIEZvZ2Vsc3Ryb20gPHBlci5mb2dlbHN0cm9tQG1haWxib3gyMDAuc3dpcG5ldC5zZT4uCi0KLVNhdCBKdW4gIDEgMjE6NDk6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmMgKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbikKLQkoYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dCk6IE1vdmUgZnJvbSBoZXJlLi4uCi0JKiBlbGYzMi1taXBzLmMgKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbikKLQkoYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dCk6IC4uLnRvIGhlcmUuCi0KLUZyaSBNYXkgMzEgMTM6NTE6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmM6IEltcHJvdmUgcmVsb2Mgc3BlY2lhbF9mdW5jdGlvbnMgYW5kIGhhbmRsaW5nIG9mCi0JU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2hpMTZfcmVsb2MgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jKTogUmVuYW1lIGZyb20gbWlwc19lbGZfbG8xNl9yZWxvYyBhbmQKLQltYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MpOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9nb3QxNl9yZWxvYyBhbmQKLQltYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IFJlbmFtZSBmcm9tIG1pcHNfZWxmX2dwcmVsMTZfcmVsb2MKLQlhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShncHJlbDE2X3dpdGhfZ3ApOiBDaGVjayBob3d0by0+c3JjX21hc2sgYmVmb3JlIHVzaW5nIHZhbHVlIGluCi0JaW5zbi4KLQkoX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogUmVuYW1lIGZyb20gbWlwc19lbGZfZ3ByZWwzMl9yZWxvYwotCWFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKGdwcmVsMzJfd2l0aF9ncCk6IENoZWNrIGhvd3RvLT5zcmNfbWFzayBiZWZvcmUgZmV0Y2hpbmcgdmFsdWUuCi0JKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4pOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0KTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogQWNjZXB0IC5NSVBTLm9wdGlvbnMgYXMgYSBuYW1lCi0JZm9yIGEgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgotCShtaXBzX2VsZjMyX3NlY3Rpb25fZnJvbV9zaGRyKTogSGFuZGxlIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogQ29uc2lkZXIgLk1JUFMub3B0aW9ucyB0byBiZSB0aGUKLQluYW1lIG9mIGEgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgotCShfYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyk6IFNldCB0aGUgR1AgdmFsdWUgaW4gYQotCVNIVF9NSVBTX09QVElPTlMgc2VjdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoYmZkX2VsZjMyX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lLgotCSogZWxmLWJmZC5oIChfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWNsYXJlLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfaW5mb190b19ob3d0byk6IFJlbmFtZSBmcm9tCi0JZWxmX2luZm9fdG9faG93dG8uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfaW5mb190b19ob3d0byk6IFJlbmFtZSBmcm9tCi0JZWxmX2luZm9fdG9faG93dG8uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfaW5mb190b19ob3d0byk6IFJlbmFtZSBmcm9tCi0JZWxmX2luZm9fdG9faG93dG8uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lLgotCi0JKiBjb2ZmLXc2NS5jIChoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogUmVuYW1lIFJfTU9WQlsxMl0gdG8KLQlSX01PVjE2QlsxMl0sIHRvIG1hdGNoIGNoYW5nZSBpbiBjb2ZmL2ludGVybmFsLmguCi0KLVRodSBNYXkgMzAgMTI6Mzg6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmM6IEV4dGVuc2l2ZSBhZGRpdGlvbnMgdG8gcHJvdmlkZSBiZXR0ZXIgc3VwcG9ydCBmb3IKLQl3cml0aW5nIGZpbGVzIGFuZCBmb3IgZ2FzLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX29iamVjdF9wKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0Ci0Jb2YgbWlwc19lbGZfb2JqZWN0X3AuCi0JKG1pcHNfZWxmMzJfb2JqZWN0X3ApOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9vYmplY3RfcDsgY2FsbAotCV9iZmRfbWlwc19lbGZfb2JqZWN0X3AuCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2Zha2Vfc2VjdGlvbnMgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCW1pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZy4KLQkobWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZzsgY2FsbAotCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nLgotCShfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKG1pcHNfZWxmMzJfZWNvZmZfZGVidWdfc3dhcCk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfZWNvZmZfZGVidWdfc3dhcC4KLQkqIGVsZi5jIChfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogVXNlIGFzeW1ib2wgcmF0aGVyIHRoYW4KLQlzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5LgotCShfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJvbQotCWVsZmNvZGUuaDp2YWxpZGF0ZV9yZWxvYy4KLQkqIGVsZmNvZGUuaCAodmFsaWRhdGVfcmVsb2MpOiBSZW1vdmU7IG1vdmVkIGludG8gZWxmLmMgYW5kIHJlbmFtZWQKLQl0byBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkqIGVsZi1iZmQuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9vYmplY3RfcCk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBEb24ndCBkZWZpbmUKLQlpZiBhbHJlYWR5IGRlZmluZWQuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfb2JqZWN0X3ApOiBIYW5kbGUgRV9NSVBTX0FSQ0hfNC4KLQkobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCi1XZWQgTWF5IDI5IDE2OjE1OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCTY0LWJpdCBNSVBTIEVMRiBBQkkgb2JqZHVtcCBzdXBwb3J0OgotCSogZWxmNjQtbWlwcy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDY0X0JBQ0tFTkRTKTogQWRkIGVsZjY0LW1pcHMuby4KLQkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjY0LW1pcHMuYy4KLQkqIGNvbmZpZy5iZmQgKG1pcHMqZWwtKi1lbGYqKSBBZGQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGFuZAotCWJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyB0byB0YXJnX3NlbHZlY3MuCi0JKG1pcHMqLSotZWxmKik6IExpa2V3aXNlLgotCSogY29uZmluZ3VyZS5pbjogQWRkIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBhbmQKLQliZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMgdG8gdmVjdG9yIHN3aXRjaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IE5ldyBmdW5jdGlvbiwKLQlicm9rZW4gb3V0IG9mIG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyLgotCShtaXBzX2VsZjMyX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkci4gIENhbGwgbmV3IGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVwZGF0ZSBuYW1lIG9mIHJlbmFtZWQgZnVuY3Rpb24uCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfc2l6ZV9pbmZvKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgb2YKLQl3cml0ZV9vdXRfcGhkcnMgdG8gYmUgY29uc3QuICBMaWtld2lzZSBmb3Igc2Vjb25kIHBhcmFtZXRlciBvZgotCXN3YXBfc3ltYm9sX291dC4KLQkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHJlbF9oZHIyIGZpZWxkLgotCShiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4pOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciB0byBiZSBjb25zdC4KLQkoYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY19pbik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcmVsb2NhX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcGhkcl9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9waGRyX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9keW5faW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfZHluX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc2x1cnBfc3ltYm9sX3RhYmxlKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3dyaXRlX3NoZHJzX2FuZF9laGRyKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3dyaXRlX291dF9waGRycyk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9pbik6IENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGJlIGNvbnN0LgotCShiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY2FfaW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9waGRyX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3BoZHJfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX2R5bl9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9keW5fb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zbHVycF9zeW1ib2xfdGFibGUpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfd3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfd3JpdGVfb3V0X3BoZHJzKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IERlY2xhcmUuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVtb3ZlIGFzc2VydGlvbiByZXF1aXJpbmcKLQlTSFRfUkVML1NIVF9SRUxBIHRvIG1hdGNoIHVzZV9yZWxhX3AuICBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVsb2MKLQlzZWN0aW9uIGZvciB0aGUgc2VjdGlvbiwgYWRkIHRoZSBuZXcgb25lIHRvIHJlbF9oZHIyLiAgSW5jcmVtZW50Ci0JcmVsb2NfY291bnQgcmF0aGVyIHRoYW4gc2V0dGluZyBpdC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERlZmluZSBuYW1lIGFzIG1hY3JvLgotCVJlbW92ZSBzdGF0aWMgZGVjbGFyYXRpb24uCi0JKGVsZl93cml0ZV9zaGRyc19hbmRfZWhkcik6IERlZmluZSBuYW1lIGFzIG1hY3JvLgotCShlbGZfd3JpdGVfb3V0X3BoZHJzKTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX2VoZHJfaW4sIGVsZl9zd2FwX2VoZHJfb3V0KTogRGVjbGFyZS4KLQkoZWxmX3N3YXBfc2hkcl9pbiwgZWxmX3N3YXBfc2hkcl9vdXQpOiBEZWNsYXJlLgotCShlbGZfc3dhcF9zeW1ib2xfaW4pOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciB0byBiZSBjb25zdC4KLQkoZWxmX3N3YXBfc3ltYm9sX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9laGRyX2luLCBlbGZfc3dhcF9laGRyX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9zaGRyX2luLCBlbGZfc3dhcF9zaGRyX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9waGRyX2luLCBlbGZfc3dhcF9waGRyX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9yZWxvY19pbiwgZWxmX3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX3JlbG9jYV9pbiwgZWxmX3N3YXBfcmVsb2NhX291dCk6IExpa2V3aXNlLgotCShlbGZfd3JpdGVfb3V0X3BoZHJzKTogUmVuYW1lIGZyb20gd3JpdGVfb3V0X3BoZHJzLiAgQ2hhbmdlIHNlY29uZAotCXBhcmFtZXRlciB0byBiZSBjb25zdC4gIE1ha2Ugbm9uLXN0YXRpYy4KLQkoZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyKTogUmVuYW1lIGZyb20gd3JpdGVfc2hkcnNfYW5kX2VoZHIuCi0JTWFrZSBub24tc3RhdGljLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogTWFrZSBub24tc3RhdGljLgotCShOQU1FKF9iZmRfZWxmLHNpemVfaW5mbykpOiBVcGRhdGUgbmFtZXMgb2YgcmVuYW1lZCBmdW5jdGlvbnMuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGVsZl9iYWNrZW5kX3NpemVfaW5mbyk6IExpa2V3aXNlLgotCShlbGZOTl9iZWQpOiBVc2UgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmNjRfYmlnbWlwc192ZWMpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYW5kCi0JYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIGlmIEJGRDY0IGlzIGRlZmluZWQuCi0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogQWRkIGNhc3QgdG8gZnByaW50ZiBhcmd1bWVudC4KLQotVHVlIE1heSAyOCAxMTo0MjowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogSW5zZXJ0IG5vcCBpbnN0cnVjdGlvbnMsIG5vdAotCXplcm9lcywgaW4gYWxpZ25tZW50IGhvbGVzLgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogTWFrZSByb29tIGZvciB0aGUKLQlwb3RlbnRpYWwgbGVhZGluZyB1bmRlcnNjb3JlIGluIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgotCi1GcmkgTWF5IDI0IDE0OjI4OjM4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogRG8gbm90IHB1dCBzbWFsbCBjb21tb24KLQlzeW1ib2xzIGludG8gLnNic3MgaWYgdGhpcyBpcyBhIHJlbG9jYXRhYmxlIGxpbmsuCi0KLVRodSBNYXkgMjMgMTI6MjY6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IFdhcm4gYWJvdXQKLQl1bmRlZmluZWQgc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0KLUZyaSBNYXkgMTcgMTM6NTQ6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmM6IEFkZCBhIGJ1bmNoIG9mIG5ldyBjb2RlIGFuZCBzdGF0aWMgY29uc3QgYXJyYXlzIHRvCi0Jc3VwcG9ydCBhbGlnbmluZyBsb2FkcyBhbmQgc3RvcmVzIG9uIGZvdXIgYnl0ZSBtZW1vcnkgYm91bmRhcmllcy4KLQlBbHNvOgotCShzaF9jb2ZmX2hvd3Rvcyk6IEFkZCBlbnRyaWVzIGZvciBSX1NIX0NPREUsIFJfU0hfREFUQSBhbmQKLQlSX1NIX0xBQkVMLgotCShzaF9yZWxheF9zZWN0aW9uKTogTG9vayBmb3IgUl9TSF9DT0RFIHJlbG9jcy4gIElmIHdlIGZpbmQgb25lLAotCWNhbGwgc2hfYWxpZ25fbG9hZHMuCi0JKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IERvbid0IG1hcmsgUl9TSF9DT0RFIG9yIFJfU0hfREFUQSByZWxvY3MKLQlhcyB1bnVzZWQuCi0KLVRodSBNYXkgMTYgMTY6MzQ6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjYWNoZS5jIChiZmRfb3Blbl9maWxlKTogVW5saW5rIHRoZSBmaWxlIGJlZm9yZSBvcGVuaW5nIGl0IGZvcgotCXdyaXRlLiAgRnJvbSBNYXJ0eSBMZWlzbmVyIDxsZWlzbmVyQHNkc3AubWMueGVyb3guY29tPi4KLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogU2V0IG9wZW5lZF9vbmNlLgotCi1UdWUgTWF5IDE0IDEyOjM1OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc29tLmMgKHNvbV9zbHVycF9yZWxvY190YWJsZSk6IENsZWFyIGV4dGVybmFsX3JlbG9jcyBjYWNoZSBhZnRlcgotCWZyZWVpbmcgaXQuCi0KLQkqIGxpYmJmZC5jOiBSZW1vdmUgI2lmZGVmIEZJTEVfT0ZGU0VUX0lTX0NIQVJfSU5ERVgsIGFuZCBjb21waWxlCi0JdGhlIGNvZGUgdW5jb25kaXRpb25hbGx5LgotCi1Nb24gTWF5IDEzIDE5OjUxOjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEpOiBEZWZpbmUgc3RydWN0dXJlLgotCShwZWlfc2VjdGlvbl9kYXRhKTogRGVmaW5lIG1hY3JvLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBJZiBDT0ZGX0lNQUdFX1dJVEhfUEUsCi0Jc3RvcmUgc19wYWRkciBmaWVsZCBpbiBwZWlfc2VjdGlvbl9kYXRhLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFVzZSBwZWlfc2VjdGlvbl9kYXRhIHJhdGhlcgotCXRoYW4gX2Nvb2tlZF9zaXplLCBhbmQgZG9uJ3Qgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHZhbHVlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIENPRkZfT0JKX1dJVEhfUEUsIHNldCBzX3BhZGRyIHRvCi0JMC4gIElmIENPRkZfSU1BR0VfV0lUSF9QRSwgc2V0IHNfcGFkZHIgdG8gcGVpX3NlY3Rpb25fZGF0YS4KLQkqIHBlaWNvZGUuaCAoY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IERlZmluZSBpZgotCUNPRkZfSU1BR0VfV0lUSF9QRS4KLSAJKHBlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTmV3IHN0YXRpYyBmdW5jdGlvbiBpZgotCUNPRkZfSU1BR0VfV0lUSF9QRS4KLQotV2VkIE1heSAgOCAxNjoxMDozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNyZWMuYyAoc3JlY19zZXRfYXJjaF9tYWNoKTogV3JpdGUgYXMgYSBmdW5jdGlvbiByYXRoZXIgdGhhbiBhCi0JbWFjcm8gZGVmaW5pdGlvbi4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBJZiBhbiBhcmNoaXZlIGhhcwotCW5vIG1hcCwganVzdCBjaGVjayBlYWNoIG1lbWJlciBpbiB0dXJuIHRvIHNlZSB3aGV0aGVyIGl0IGlzCi0JcmVxdWlyZWQuCi0KLVdlZCBNYXkgIDggMDk6MTc6MzQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGNib290LmMgKHBwY2Jvb3Rfb2JqZWN0X3ApOiBDaGVjayBmb3IgdHlwZSAweDQxIGluIHBhcnRpdGlvbgotCXRhYmxlLiAgQ2FsbCBCRkRfQVNTRVJUIHRvIHZhbGlkYXRlIGhlYWRlciBzaXplLCBpbnN0ZWFkIG9mCi0JY2FsbGluZyBmYXRhbC4KLQkocHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IFB1dCBxdW90ZXMgYXJvdW5kIHBhcnRpdGlvbgotCW5hbWUuCi0KLVR1ZSBNYXkgIDcgMTY6MTA6MTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGNib290LmM6IE5ldyB0YXJnZXQgZm9yIGxvb2tpbmcgYXQgUFBDYnVnIGJvb3QgcmVjb3Jkcy4KLQotCSogY29uZmlne3VyZS5pbiwuYmZkfTogQWRkIHN1cHBvcnQgZm9yIHBwY2Jvb3QgdGFyZ2V0LgotCSogdGFyZ2V0cy5jOiBEaXR0by4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVHVlIE1heSAgNyAxMToxNToxOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaG93dG9fdGFibGUpOiBVcGRhdGUgbmFtZXMgdG8gbWF0Y2ggcmVjZW50Ci0JY2hhbmdlcyB0byBpbmNsdWRlL2NvZmYvaW50ZXJuYWwuaC4gIEZpeCBtaW5vciBlcnJvcnMgaW4gdGhlCi0JZXhpc3RpbmcgcmVsb2NzLiAgQWRkIFJfTU9WTDEgYW5kIFJfTU9WTDIuCi0JKHJ0eXBlMmhvd3RvKTogU2ltaWxhcmx5LgotCShoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogUmV3cml0ZSB0byBzaW1wbGlmeSwgZml4IGJ1Z3MgaW4gdGhlCi0JZXhpc3RpbmcgcmVsYXhpbmcgY29kZSAgYW5kIHBlZm9ybSBtb3JlIHJlbGF4aW5nLgotCShoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTGlrZXdpc2UuCi0KLU1vbiBNYXkgIDYgMTg6MjQ6MDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKTogSGFuZGxlIGNvbW1vbgotCXN5bWJvbHMgY29ycmVjdGx5LgotCi1TYXQgTWF5ICA0IDA1OjA4OjQ1IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiAgUmVqZWN0IGdlbmVyaWMgRUxGIHRhcmdldCBpZgotCWVfbWFjaGluZSBtYXRjaGVzIGFuIGFsdGVybmF0ZSBtYWNoaW5lIGNvZGUgaW4gYSBzcGVjaWZpYyBiYWNrZW5kLgotCi0JKiBuZXRic2QtY29yZS5jIChuZXRic2RfY29yZV92ZWMpOiAgUmVtb3ZlIGluaXRpYWxpemVyIGZvcgotCW9ic29sZXRlIGFsaWduX3Bvd2VyX21pbiBmaWVsZC4KLQotRnJpIE1heSAgMyAxMzowNzozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAocmVsb2NfaG93dG9fdHlwZSk6IEFkZCBob3d0byBlbnRyeSBmb3IKLQlSX1BDUldPUkRfQi4KLQkocnR5cGUyaG93dG8pOiBIYW5kbGUgUl9QQ1JXT1JEX0IuCi0JKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBIYW5kbGUgUl9QQ1JXT1JEX0IuCi0JKGg4MzAwX3JlbG9jXzE2X2VzdGltYXRlKTogTGlrZXdpc2UuICBUcnkgdG8gdHVybiBhIDE2Yml0Ci0JcGMtcmVsYXRpdmUgYnJhbmNoIChSX1BDUldPUkQpIGludG8gYW4gOGJpdCBwYy1yZWxhdGl2ZQotCWJyYW5jaCAoUl9QQ1dPUkRfQikuCi0KLUZyaSBNYXkgIDMgMTA6NDc6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogU2V0IHRoZSBzZWN0aW9uIGZvcgotCUJTRl9DT05TVFJVQ1RPUiBzeW1ib2xzLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBDb3JyZWN0IHNldHRpbmcgb2YKLQlsYXN0X2JmX2luZGV4LgotCi1XZWQgTWF5ICAxIDE4OjM5OjMyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSW4gY29tZGF0IHNlY3Rpb24gbG9va3VwLAotCXN0b3AgbG9va2luZyB3aGVuIHNlY3Rpb24gaXMgZm91bmQuCi0KLVdlZCBNYXkgIDEgMTQ6MTc6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChTVFJJTkdfU0laRV9TSVpFKTogRGVmaW5lLgotCShzdHlwX3RvX3NlY19mbGFncyk6IEhhbmRsZSBsb25nIHN5bWJvbCBuYW1lcyB3aGVuIGxvb2tpbmcgZm9yIHRoZQotCXNlY3Rpb24gc3ltYm9sLgotCShiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgX2JmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyBmaWVsZC4KLQkoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzKTogRGVmaW5lLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IEhhbmRsZSBsb25nIHNlY3Rpb24KLQluYW1lcy4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQkqIHBlLWFybS5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQkqIHBlaS1hcm0uYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKiBwZS1pMzg2LmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCSogcGVpLWkzODYuYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKiBwZS1wcGMuYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKiBwZWktcHBjLmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCi0JKiBib3V0LmMgKGJfb3V0X2NhbGxiYWNrKTogU2V0IGxtYSBvZiBzZWN0aW9ucy4KLQkoYl9vdXRfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFJlbmFtZSBpbl9hYmZkCi0JcGFyYW1ldGVyIHRvIG91dHB1dF9iZmQuICBVc2VkIGlucHV0X2JmZCBpbnN0ZWFkIG9mIG91dHB1dF9iZmQgaW4KLQlzZXZlcmFsIHBsYWNlcy4KLQotVHVlIEFwciAzMCAxNzo1NjozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBEb24ndCBjcmVhdGUKLQlTRUNfQ09OU1RSVUNUT1Igc2VjdGlvbnMuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBMaWtld2lzZS4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IGVsZl9ncC4KLQlGcm9tIERvbiBCb3dtYW4gPGJvd21hbkB3YXRlcmxvby5ocC5jb20+LgotCi1UdWUgQXByIDMwIDE3OjA2OjMyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFybWNvZmZfbGl0dGxlX3ZlYyk6IElmIENPRkZfV0lUSF9QRSBpcyBkZWZpbmVkLCBhZGQKLQlTRUNfTElOS19PTkNFIGFuZCBTRUNfTElOS19EVVBMSUNBVEVTIHRvIHNlY3Rpb25fZmxhZ3MuCi0KLU1vbiBBcHIgMjkgMTM6MTU6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQKLQltaXBzXzMyX3JlbG9jcyBmaWVsZC4KLQkobWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG1pcHNfMzJfcmVsb2NzIGZpZWxkLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ29weSBSX01JUFNfUkVMMzIgYW5kIFJfTUlQU18zMgotCXJlbG9jcyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aGljaCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIKLQlmaWxlLgotCShtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBGb3IgYSBSX01JUFNfUkVMMzIgb3IgUl9NSVBTXzMyIHJlbG9jCi0JYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIGluY3JlbWVudCBtaXBzXzMyX3JlbG9jcy4KLQkobWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgbWlwc18zMl9yZWxvY3MgaXMgc2V0LCBhbmQKLQl0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBtYWtlIHJvb20gaW4gdGhlCi0JLnJlbC5keW4gc2VjdGlvbi4KLQotRnJpIEFwciAyNiAxODowMDozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFRyYWNrIHRoZSByZWFsCi0JZmlsZSBwb3NpdGlvbiBhbmQgdGhlIHZpcnR1YWwgZmlsZSBwb3NpdGlvbiBzZXBhcmF0ZWx5LiAgU2V0Ci0JZmlsZXBvcyBpbmZvcm1hdGlvbiBic2FlZCBvbiB0aGUgcmVhbCBmaWxlIHBvc2l0aW9uLgotCShfYmZkX2Vjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogSGFuZGxlIC5saWIgc2VjdGlvbnMgbGlrZSB0aGUKLQlKYW4gMjMgY2hhbmdlIHRvIGNvZmZjb2RlLmguCi0KLQkqIHNvbS5jIChzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IHRoZSBzeW1ib2wgY291bnQgdG8gdGhlCi0JbnVtYmVyIG9mIEJGRCBzeW1ib2xzIGNyZWF0ZWQuCi0KLUZyaSBBcHIgMjYgMTI6MzQ6MjkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBGb3J3YXJkIHJlbG9jYXRpb25zIHRvIHRoZQotCW91dHB1dCBmaWxlIGlmIGxpbmtpbmcgc2hhcmVkIG9iamVjdHMuICBMb29wIHRvIGNoZWNrIGFsbCByZWxvY3MsCi0JcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGZhbHNlIG9uIGZpcnN0IGVycm9yLgotCi1UaHUgQXByIDI1IDEzOjI1OjEyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogQWRkIFBMVCBjYXNlLgotCShwcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogSWYgLmludGVycCBzZWN0aW9uLCBidW1wICMKLQlvZiBwcm9ncmFtIGhlYWRlcnMgYnkgMS4KLQkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBGbGVzaCBvdXQgc3VwcG9ydC4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3IgLnBsdCBzZWN0aW9uLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFByaW50IG91dCBmaWxlbmFtZSBpbiBkZWJ1ZyBjb2RlLiAgRW5hYmxlCi0JUExUIHN1cHBvcnQuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQWRkIHN1cHBvcnQgZm9yIFBMVCdzLCBiZWVmIHVwCi0JZGVidWcgb3V0cHV0LgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiB0aGUgb3V0cHV0IHNlY3Rpb24gaXNuJ3QgZGVmaW5lZCwKLQlkb24ndCBhYm9ydCwganVzdCBnaXZlIGFuIGVycm9yIG1lc3NhZ2UuCi0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiB0aGUgc2VjdGlvbgotCWJlaW5nIGNyZWF0ZWQgaXMgLnNkYXRhIG9yIC5zZGF0YTIsIGRvbid0IG1ha2UgdGhlIHN5bWJvbCBkeW5hbWljLgotCi1XZWQgQXByIDI0IDE0OjA0OjA3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBMb29rIHRocm91Z2ggdGhlCi0JbWVtYmVycyBvZiBhbiBhcmNoaXZlIGZvciBkeW5hbWljIG9iamVjdHMgd2l0aCBubyBzeW1ib2xzLCBhbmQKLQlwYXNzIHRoZW0gZGlyZWN0bHkgdG8gY2hlY2tfYXJjaGl2ZV9lbGVtZW50LgotCSh4Y29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBQYXNzIGR5bmFtaWMgb2JqZWN0cyB0bwotCXhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzLgotCSh4Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfdmVjKTogQ2hhbmdlIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMKLQlmcm9tIF9iZmRfbm9keW5hbWljIHRvIF9iZmRfeGNvZmYuCi0JKiBsaWJjb2ZmLWluLmggKF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKToKLQlEZWNsYXJlLgotCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IERlY2xhcmUuCi0JKF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWNsYXJlLgotCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9zd2FwX2xkcmVsX2luKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBOZXcgZnVuY3Rpb24uCi0JKHhjb2ZmX2R5bmFtaWNfcmVsb2MpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCSh4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMpOiBVc2UgeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMuCi0KLVR1ZSBBcHIgMjMgMTI6NDg6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNwYXJjLmMgKGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MpOiBSZXR1cm4gYmZkX3JlbG9jX29rIGV2ZW4KLQlpZiByZWxvY19lbnRyeS0+YWRkZW5kIGlzIG5vdCAwLgotCShDQUxDX0FEREVORCk6IEp1c3Qgc2V0IHRoZSBhZGRlbmQgdG8gcmVsb2Mucl9vZmZzZXQuCi0KLU1vbiBBcHIgMjIgMTg6Mjk6MDEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBGaXggc3BlbGxpbmcgb2YKLQlSX1NQQVJDX0dMT0JfSk1QLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBMaWtld2lzZS4KLQlBZGQgZW50cmllcyBmb3IgUl9TUEFSQ19bNTZdLgotCShzcGFyY19yZWxvY19tYXApOiBBZGQgZW50cmllcyBmb3IgUl9TUEFSQ19bNTZdLgotCi1Nb24gQXByIDIyIDE1OjA3OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCU9wdGltaXplIGxpbmtpbmcgb2Ygc3RhYnMgaW4gc2VjdGlvbnMgYXMgdXNlZCBpbiBFTEYgYW5kIENPRkYuCi0JKiBzdGFicy5jOiBOZXcgZmlsZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyk6IERlY2xhcmUuCi0JKF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicyk6IERlY2xhcmUuCi0JKF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIHN0YWJfaW5mbyBmaWVsZC4KLQkoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlKTogQWRkIHN0YWJfaW5mbyBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUKLQlzdGFiX2luZm8gZmllbGQuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IENhbGwgX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMgaWYKLQlhcHByb3ByaWF0ZS4KLQkoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgc3RhYiBzdHJpbmdzIGhhc2ggdGFibGUuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IEhhbmRsZSBvcHRpbWl6ZWQgc3RhYnMgc2VjdGlvbnMuCi0JKiBjb2ZmLXBwYy5jIChwcGNfYmZkX2NvZmZfZmluYWxfbGluayk6IFdyaXRlIG91dCBzdGFiIHN0cmluZ3MKLQloYXNoIHRhYmxlLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBzdGFiX2luZm8gZmllbGQuCi0JKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCBzdGFiX2luZm8gZmllbGQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIHN0YWJfaW5mbwotCWZpZWxkLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBhcHByb3ByaWF0ZSwgY2FsbAotCV9iZmRfbGlua19zZWN0aW9uX3N0YWJzLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgc3RhYiBzdHJpbmdzIGhhc2ggdGFibGUuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IEhhbmRsZSBvcHRpbWl6ZWQgc3RhYnMgc2VjdGlvbnMuCi0JKiByZWxvYy5jIChfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDaGVjayBhZGRyZXNzIGFnYWluc3QKLQlfcmF3X3NpemUgcmF0aGVyIHRoYW4gX2Nvb2tlZF9zaXplLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfTElCUyk6IEFkZCBzdGFicy5vCi0JKEJGRF9MSUJTX0NGSUxFUyk6IEFkZCBzdGFicy5jLgotCi0JKiBWRVJTSU9OOiBJbmNyZW1lbnQgZm9yIGJmZGxpbmsuaCBjaGFuZ2UuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogQ29ycmVjdCBoYW5kbGluZyBvZgotCUJTRl9OT1RfQVRfRU5EIGNvbW1vbiBzeW1ib2xzLgotCi1GcmkgQXByIDE5IDE5OjIxOjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocmVjb3JkX3RvYyk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbik6IExpa2V3aXNlLgotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIEFOU0kgQyBzdHJpbmcgY29uY2F0ZW5hdGlvbi4KLQkocHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBSZW1vdmUgdW5yZWFjaGVkIGNvZGUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHRha2UgdGhlIGFkZHJlc3MKLQlvZiBhbiBhcnJheS4KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZy4KLQkocGVfcHJpbnRfZWRhdGEpOiBMaWtld2lzZS4KLQkocGVfcHJpbnRfcmVsb2MpOiBSZW1vdmUgQU5TSSBDIHN0cmluZyBjb25jYXRlbmF0aW9uLgotCi1UaHUgQXByIDE4IDE4OjUxOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8pOiBBZGQgbGFzdF9iZl9pbmRleAotCWFuZCBsYXN0X2JmIGZpZWxkcy4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBTd2FwIGVuZG5keCBmaWVsZCBmb3IgQ19GQ04KLQlzeW1ib2xzLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IExpa2V3aXNlLgotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luKTogTGlrZXdpc2UuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogTGlrZXdpc2UuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBDaGVjayBlbmRuZHggZmllbGQgZm9yIENfRkNOCi0Jc3ltYm9scy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSBsYXN0X2JmX2luZGV4Ci0JZmllbGQuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IENoZWNrIGVuZG5keCBmaWVsZCBmb3IgQ19GQ04gc3ltYm9scy4KLQlGaXggdXAgLmJmIGVuZG5keCBsaW5rIGZpZWxkcy4KLQkqIGNvZmYtcHBjLmMgKHBwY19iZmRfY29mZl9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSBsYXN0X2JmX2luZGV4Ci0JZmllbGQuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBDaGVjayBlbmRuZHggZmllbGQgZm9yIENfRkNOCi0Jc3ltYm9scy4KLQotV2VkIEFwciAxNyAxMjowODoyNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBleyxpfS1wcGMuYyAoUFBDX1BFKTogRGVmaW5lIGluc3RlYWQgb2YgUFBDLCBzbyB0aGF0IGNvbXBpbGluZwotCW9uIFNvbGFyaXMgUG93ZXJQQyBzeXN0ZW1zIGRvZXNuJ3QgZ2V0IGNvbmZ1c2VkLgotCi0JKiBjY2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSAjaWZkZWYgUFBDX1BFLCBub3QKLQkjaWZkZWYgUFBDLgotCi0JKiBlbGZjb3JlLmggKGJmZF9wcnN0YXR1cywgYmZkX2ZwcmVnc2V0KTogQWRkIHRocmVhZCBhcmd1bWVudC4KLQkoZWxmX2NvcmVmaWxlX25vdGUpOiBJZiBIQVZFX1NZU19QUk9DRlNfSCBpcyBub3QgZGVmaW5lZCwgZG9uJ3QKLQl1cGRhdGUgZGlkX3JlZyBhbmQgZGlkX3JlZzIuCi0KLVdlZCBBcHIgMTcgMTM6MDc6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBDaGVjayBmb3IgVE9DIG92ZXJmbG93LgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBXaGVuIGNhbGxpbmcgdGhlCi0JY2FsbGJhY2sgcm91dGluZXMsIHBhc3MgaC0+cm9vdC5zdHJpbmcgcmF0aGVyIHRoYW4gbmFtZSwgaW4gY2FzZQotCWNvcHkgaXMgdHJ1ZSBhbmQgbmFtZSBpcyB0cmFuc2llbnQuCi0KLVR1ZSBBcHIgMTYgMTY6MzY6MzggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBlbGZjb3JlLmg6ICBBZGQgc3VwcG9ydCBmb3IgY29yZSBmaWxlcyB3aXRoIG11bHRpcGxlIHRocmVhZHMuCi0JKFByaW1hcmlseSBmb3IgU29sYXJpcy4pCi0KLVR1ZSBBcHIgMTYgMTM6NDQ6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYKLQlzZWN0aW9uLT5vcmVsb2NhdGlvbiBpcyBOVUxMLgotCi0JKiBjb2ZmZ2VuLmMgKGJmZF9jb2ZmX2dldF9zeW1lbnQpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9jb2ZmX2dldF9hdXhlbnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2NvZmZfZ2V0X3N5bWVudCk6IERlY2xhcmUuCi0JKGJmZF9jb2ZmX2dldF9hdXhlbnQpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gQXByIDE1IDE5OjA2OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19oaTE2KTogRGVmaW5lLgotCShtaXBzX2hpMTZfYWRkciwgbWlwc19oaTE2X2FkZGVuZCk6IFJlbW92ZS4KLQkobWlwc19oaTE2X2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzX2VsZl9oaTE2X3JlbG9jKTogTWFpbnRhaW4gYSBsaXN0IG9mIHVubWF0Y2hlZCBISTE2IHJlbG9jcy4KLQkobWlwc19lbGZfbG8xNl9yZWxvYyk6IFByb2Nlc3MgbWlwc19oaTE2X2xpc3QuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQZXJtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBISTE2Ci0JcmVsb2NzIGJlZm9yZSB0aGUgYXNzb2NpYXRlZCBMTzE2IHJlbG9jLgotCi1XZWQgQXByIDEwIDAwOjIzOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdmVyc2Fkb3MuYyAodmVyc2Fkb3Nfc2Nhbik6IENoZWNrIGJmZF9hbGxvYyByZXR1cm4gdmFsdWUuCi0JKHZlcnNhZG9zX29iamVjdF9wKTogQ2hlY2sgYWxsIGJmZF9yZWFkIHJldHVybiB2YWx1ZXMuICBSZXF1aXJlCi0JdGhhdCBsYW5nIGZpZWxkIGJlIGxlc3MgdGhhbiAxMCwgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggSW50ZWwgSGV4Ci0JZmlsZXMuCi0KLQkqIGxpYmFvdXQuaCAoV1JJVEVfSEVBREVSUyk6IFdyaXRlIG91dCB0aGUgcmVsb2NzIGV2ZW4gaWYgdGhlcmUKLQlhcmVuJ3QgYW55IHN5bWJvbHMuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSk6IFNldCByX2luZGV4IHRvIE5fQUJTLAotCW5vdCAwLCBmb3IgYW4gYWJzb2x1dGUgc3ltYm9sLgotCShOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2Nfb3V0KSk6IExpa2V3aXNlLgotCi0JKiBpaGV4LmMgKGloZXhfc2Nhbik6IEFjY2VwdCBhIGxlbmd0aCBvZiA0IGZvciByZWNvcmQgdHlwZSA1LgotCShpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IEZvciBhIGxhcmdlIHN0YXJ0IGFkZHJlc3MsIG91dHB1dAotCXRoZSBmdWxsIDMyIGJpdCBhZGRyZXNzIGluIHJlY29yZCB0eXBlIDUuCi0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9ieXRlKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgZnJvbSBiZmRfYnl0ZQotCXRvIGludCB0byBhdm9pZCBwcm9tb3Rpb24gcHJvYmxlbXMgaW4gcHJvdG90eXBlLgotCi1UdWUgQXByICA5IDExOjQ0OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFVzZSAke3NyY2Rpcn0gd2hlbiBsb29raW5nIGZvciBwaWNmcmFnLgotCi0JKiBjb25maWd1cmUuaG9zdDogU3dpdGNoIG9uICR7bGliZGlyfSwgbm90ICQobGliZGlyKS4gIEZyb20KLQlhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdSAoQWxhbiBNb2RyYSkuCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IEFsd2F5cyBjYWxsIGFkZF9keW5hbWljX3N5bWJvbHMKLQllbnRyeSBwb2ludCwgbm90IGp1c3QgZm9yIERZTkFNSUMgb2JqZWN0cy4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBBbHdheXMgY2FsbAotCXN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLiAgSWYgY2FsbGVkIHdpdGggYSBub24gRFlOQU1JQwotCW9iamVjdCwgZG9uJ3QgZG8gYW55dGhpbmcgZWxzZS4KLQkoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBEb24ndCBjYWxsIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCi1Nb24gQXByICA4IDEyOjA5OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSExERkxBR1MgYW5kIFNITElCX0NGTEFHUyBmb3IgKi1kZWMtb3NmKgotCWhvc3Qgd2hlbiBjb25maWd1cmluZyB3aXRoIC0tZW5hYmxlLXNoYXJkLgotCi1GcmkgQXByICA1IDEyOjI0OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIGlbMzQ1XTg2LSotZnJlZWJzZGVsZiogdGFyZ2V0OyBmcm9tIEpvaG4gUG9sc3RyYQotCTxqZHBAcG9sc3RyYS5jb20+LgotCi0JKiBsaW5rZXIuYyAobGlua19hY3Rpb24pOiBGb3IgV0FSTl9ST1cvd2FybiwgdXNlIE1XQVJOLCBub3QgQ1lDTEUsCi0JdG8gYXZvaWQgY3Jhc2hpbmcgaW4gYmZkX2hhc2hfcmVwbGFjZS4KLQotCSogc3lzZGVwLmg6IFVzZSAjaWZkZWYsIG5vdCAjaWYuCi0KLVRodSBBcHIgIDQgMjM6MzI6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuaW46IFJlYnVpbGQuCi0KLVRodSBBcHIgIDQgMTg6NDk6MDkgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1zb255LWJzZCopOiBGaXggdHlwbyBpbiBBQ19ERUZJTkUuCi0JKEFDX0NIRUNLX0hFQURFUlMpOiBDaGVjayBmb3Igc3lzL3RpbWUuaAotCShBQ19IRUFERVJfVElNRSk6IEFkZCBtYWNyby4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHN5c2RlcC5oOiBVc2UgVElNRV9XSVRIX1NZU19USU1FIGFuZCBIQVZFX1NZU19USU1FX0gKLQl0byBjb250cm9sIHdoYXQgY29tYmluYXRpb24gb2YgPHRpbWU+IGFuZCA8c3lzL3RpbWUuaD4KLQlnZXQgaW5jbHVkZWQuCi0KLVR1ZSBBcHIgIDIgMTM6MTE6NTMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYW91dGYxLmggKHN1bm9zXzMyX3NldF9hcmNoX21hY2gpOiBIYW5kbGUgTV9TUEFSQ0xFVC4KLQkoYW91dF8zMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IEhhbmRsZQotCWJmZF9tYWNoX3NwYXJjX3tzcGFyY2xldCxzcGFyY2xpdGV9LgotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc3BhcmNfe3NwYXJjbGV0LHNwYXJjbGl0ZX0pOiBEZWZpbmUuCi0JKGJmZF9tYWNoX3NwYXJjX3Y5X3ApOiBVcGRhdGUuCi0JKiBjcHUtc3BhcmMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBlbnRyaWVzIGZvciBzcGFyY2xldCxzcGFyY2xpdGUuCi0JKiBsaWJhb3V0LmggKGVudW0gbWFjaGluZV90eXBlKTogQWRkIE1fU1BBUkNMRVQuCi0JKiBzdW5vcy5jIChNQUNIVFlQRV9PSyk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBBcHIgIDIgMDA6MzM6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGhnb3QgZmllbGQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIGhnb3QgZmllbGQuCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IFN0b3JlIHRoZQotCV9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBoYXNoIHRhYmxlIGVudHJ5IGluIHRoZSBoZ290IGZpZWxkLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogSWYgdGhlIHNpemUgb2YgdGhlCi0JZ2xvYmFsIG9mZnNldCB0YWJsZSBnb2VzIG92ZXIgMHgxMDAwLCBzZXQgdGhlIHZhbHVlIG9mCi0JX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHRvIDB4MTAwMCBpbnRvIHRoZSBzZWN0aW9uLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogU3VidHJhY3QgdGhlIG9mZnNldCBvZgotCV9HTE9CQUxfT0ZGU0VUX1RBQkxFXyB3aGVuIGhhbmRsaW5nIEdPVCByZWxvY2F0aW9ucy4KLQotCSogZWxmY29kZS5oOiBEb24ndCBpbmNsdWRlIDxzdHJpbmcuaD4uCi0KLU1vbiBBcHIgIDEgMTA6Mzk6MjQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogUmVuYW1lZCBmcm9tCi0JZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYy4gIEFsbCByZWZlcmVuY2VzIGNoYW5nZWQuCi0JKiBnZW5saW5rLmggKF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IERlY2xhcmF0aW9uCi0JbW92ZWQgaGVyZSBmcm9tIGxpYmJmZC1pbi5oLgotCSogbGliYmZkLWluLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQotTW9uIEFwciAgMSAxMjozNTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFdoZW4gcmVwb3J0aW5nIGFuCi0Jb3ZlcmZsb3cgZXJyb3IsIHVzZSB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlIGlmCi0JYXZhaWxhYmxlLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQotCSogZWxmbGluay5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBjb21tb24gc3ltYm9sIGdvdAotCWRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIHNldCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSLgotCi1TdW4gTWFyIDMxIDAxOjU4OjQxIDE5OTYgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogRGVsZXRlIHRlc3QgZm9yIC5qdW5rLgotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQotRnJpIE1hciAyOSAxMjo0NDozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoU0VDX0xJTktfT05DRSk6IERlZmluZS4KLQkoU0VDX0xJTktfRFVQTElDQVRFUyk6IERlZmluZS4KLQkoU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEKTogRGVmaW5lLgotCShTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZKTogRGVmaW5lLgotCShTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSk6IERlZmluZS4KLQkoU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJZiBDT0ZGX1dJVEhfUEUsIHR1cm4KLQlTRUNfTElOS19PTkNFIGludG8gSU1BR0VfU0NOX0xOS19DT01EQVQuCi0JKHN0eXBfdG9fc2VjX2ZsYWdzKTogSWYgQ09GRl9XSVRIX1BFLCB0dXJuIElNQUdFX1NDTl9MTktfUkVNT1ZFCi0JaW50byBTRUNfRVhDTFVERS4gIElmIElNQUdFX1NDTl9MTktfQ09NREFUIGlzIHNldCwgc2V0Ci0JU0VDX0xJTktfT05DRSwgYW5kIGxvb2sgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGZvciB0aGUgc2V0dGluZwotCWZvciBTRUNfTElOS19EVVBMSUNBVEVTLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIENPRkZfV0lUSF9QRSwgaWYgU0VDX0xJTktfT05DRSBpcwotCXNldCBmb3IgYSBzZWN0aW9uLCBmaW5kIHRoZSBzZWN0aW9uIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlLAotCWFuZCBzZXQgdGhlIGF1eCBlbnRyeSBiYXNlZCBvbiBTRUNfTElOS19EVVBMSUNBVEVTLgotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IEFkZCBhIHNwYWNlIGJlZm9yZSAiY2hlY2tzdW0iLgotCSogY29mZi1hcm0uYyAoYXJtY29mZl9iaWdfdmVjKTogSWYgQ09GRl9XSVRIX1BFIGlzIGRlZmluZWQsIGFkZAotCVNFQ19MSU5LX09OQ0UgYW5kIFNFQ19MSU5LX0RVUExJQ0FURVMgdG8gc2VjdGlvbl9mbGFncy4KLQkqIGNvZmYtaTM4Ni5jIChpMzg2Y29mZl92ZWMpOiBMaWtld2lzZS4KLQkqIGNvZmYtcHBjLmMgKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfQklHX1NZTSk6IExpa2V3aXNlLgotCi0JKiBWRVJTSU9OOiBCdW1wIHRvIDIuNi4xLgotCSogTWFrZWZpbGUuaW4gKHN0YW1wLWgpOiBEZXBlbmQgdXBvbiBWRVJTSU9OLgotCi1UaHUgTWFyIDI4IDIzOjQ4OjQ5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmggKGdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBBZGQgZGVjbGFyYXRpb24uCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogTm8gbG9uZ2VyIHN0YXRpYy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfYmZkX2xpbmtfaGFzaF9jcmVhdGUpOiBBbGxvdyBzcGVjaWZpYyB0YXJnZXRzCi0JdG8gb3ZlcnJpZGUuCi0JKiBjb2ZmLWg4MzAwLmM6IEFkZCB0d28gZGVyaXZlZCBoYXNoIHRhYmxlcyBhbmQgdGhlaXIgYXNzb2NpYXRlZAotCWZ1bnRpb25zIGFuZCAjZGVmaW5lcyBmb3IgdXNlIGJ5IHRoZSBoODMwMCBsaW5rZXIuCi0JKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMsIGNhc2UgUl9NRU1fSU5ESVJFQ1QpOiBDcmVhdGUgZW50cmllcyBpbgotCXRoZSBmdW5jdGlvbiB2ZWN0b3IgYXMgbmVlZGVkLiAgUGxhY2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uCi0JdmVjdG9yIGVudHJ5IGluIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIFJfTUVNX0lORElSRUNUIHJlbG9jLgotCVJld3JpdGUgdGhlIHZlY3RvcnMgc2VjdGlvbiBjb250ZW50cyBhcyBuZWNlc3NhcnkuCi0JKGg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uIGZvciB0aGUgaDgzMDAgbGlua2VyLgotCShjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVmaW5lIHRvIHVzZSBoODMwMCBzcGVjaWZpYyB2ZXJzaW9uLgotCShjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjggMTc6NDQ6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJocHBhLmg6IElmIGdjYyAyLjcgb3IgaGlnaGVyLCBkZWNsYXJlIGFsbCB0aGUgZnVuY3Rpb25zIHdpdGgKLQlfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpIHNvIHRoYXQgLVdhbGwgZG9lc24ndCB3YXJuIGFib3V0Ci0JdGhlbS4KLQkoaHBwYV9yZWJ1aWxkX2luc24pOiBQYXNzIHBvaW50ZXIgdG8gY29ycmVjdCB0eXBlIHRvCi0JbG93X3NpZ25fdW5leHQgYW5kIGRpc19hc3NlbWJsZV8yMS4KLQotVGh1IE1hciAyOCAxMTowMDozNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChzcGFyYzY0LXtzeXN2NCosc29sYXJpczIqfSk6IERlbGV0ZS4KLQlTdGljayB3aXRoIHNwYXJjLSote3N5c3Y0Kixzb2xhcmlzMip9LgotCi1XZWQgTWFyIDI3IDEwOjQzOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luKTogU3dhcCBpbiBleHRyYSBQRSB4X3NjbiBmaWVsZHMuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogU3dhcCBvdXQgZXh0cmEgUEUgeF9zY24gZmllbGRzLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbik6IFplcm8gb3V0IGV4dHJhIFBFIHhfc2NuIGZpZWxkcy4KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBJZiBhbnkgb2YgdGhlIGV4dHJhIFBFIHhfc2NuCi0JZmllbGRzIGlzIG5vbi16ZXJvLCBwcmludCB0aGVtLgotCi0JKiBjb2ZmLXBwYy5jIChwcGNfcmVjb3JkX3RvY19lbnRyeSk6IFB1dCBpbnNpZGUgQ09GRl9JTUFHRV9XSVRIX1BFCi0JaWZkZWYuICBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkocHBjX3JlY29yZF9kYXRhX2luX3RvY19lbnRyeSk6IElmZGVmIG91dC4gIFJlbW92ZWQgdW51c2VkCi0JdmFyaWFibGVzLgotCShwcGNfbWFya19zeW1ib2xfYXNfZ2x1ZSk6IFB1dCBpbnNpZGUgQ09GRl9JTUFHRV9XSVRIX1BFIGlmZGVmLgotCShnZXRfc3ltYm9sX3ZhbHVlKTogSWZkZWYgb3V0LgotCShwZV9wcGNfcmVsb2MpOiBJZmRlZiBvdXQuICBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgTWFrZQotCWZwcmludGYgc3RyaW5ncyBhbmQgYXJndW1lbnQgdHlwZXMgY29ycmVzcG9uZC4gIFB1dCBiZWZvcmVfYWRkciBpbgotCURFQlVHX1JFTE9DIGlmZGVmLgotCShkdW1wX3RvYyk6IE1ha2UgZnByaW50ZiBzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcyBjb3JyZXNwb25kLgotCShwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgQWx3YXlzCi0JcmV0dXJuIGEgdmFsdWUuCi0JKHBwY19yZWZsb19yZWxvYyk6IElmZGVmIG91dC4KLQkocHBjX2FkZHIzMm5iX3JlbG9jKTogSWZkZWYgb3V0LgotCShwcGNfY29mZl9ydHlwZTJob3d0byk6IE1ha2UgZnByaW50ZiBzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcwotCWNvcnJlc3BvbmQuCi0JKGNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvKTogTGlrZXdpc2UuCi0JKHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2spOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IE1vdmUgb3RoZXJ3aXNlIHVudXNlZCB2YXJpYWJsZXMgaW50bwotCXRoZSAjaWZkZWYgd2hlcmUgdGhleSBhcmUgdXNlZC4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQkocGVfcHJpbnRfZWRhdGEpOiBNYWtlIGZwcmludGYgc3RyaW5ncyBhbmQgYXJndW1lbnQgdHlwZXMKLQljb3JyZXNwb25kLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCShwZV9wcmludF9wZGF0YSk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIGFkZHJfdmFsdWUuICBBbHdheXMKLQlyZXR1cm4gYSB2YWx1ZS4KLQkocGVfcHJpbnRfcmVsb2MpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIG9uYWxpbmUuICBNYWtlIGZwcmludGYKLQlzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcyBjb3JyZXNwb25kLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9mYWtlX3NlY3Rpb25zKTogUmV0dXJuIHRydWUuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTW92ZSBkZWZpbml0aW9uIG9mIHVudXNlZAotCXZhcmlhYmxlIHJlbGEgaW5zaWRlICNpZiAwIHNlY3Rpb24gd2hlcmUgaXQgaXMgdXNlZC4KLQotCSogbnMzMmsuaDogTmV3IGZpbGUuCi0JKiBjcHUtbnMzMmsuaDogSW5jbHVkZSBuczMyay5oLiAgUmVuYW1lIGV4dGVybmFsbHkgdmlzaWJsZQotCWZ1bmN0aW9ucyB0byBzdGFydCB3aXRoIF9iZmRfLgotCSogYW91dC1uczMyay5jOiBJbmNsdWRlIG5zMzJrLmguICBDaGFuZ2UgcmVmZXJlbmNlcyB0byByZW5hbWVkCi0JZnVuY3Rpb25zIGluIGNwdS1uczMyay5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShIRklMRVMpOiBBZGQgbnMzMmsuaC4KLQotCSogc2VjdGlvbi5jIChzdHJ1Y3Qgc2VjKTogQWRkIGxpbmtlcl9tYXJrIGZpZWxkLiAgQ2hhbmdlCi0JdXNlcl9zZXRfdm1hIGFuZCByZWxvY19kb25lIHRvIGJlIHNpbmdsZSBiaXQgZmllbGRzLgotCShTVERfU0VDVElPTik6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQgaW4gdGhlCi0JbGluay4KLQkoYW91dF9saW5rX2lucHV0X2JmZCk6IERvbid0IGxpbmsgdW5tYXJrZWQgc2VjdGlvbnMuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQgaW4gdGhlCi0JbGluay4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgbGluayB1bm1hcmtlZCBzZWN0aW9ucy4KLQkqIGNvZmYtcHBjLmMgKHBwY19iZmRfY29mZl9maW5hbF9saW5rKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZCBpbgotCXRoZSBsaW5rLgotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBNYXJrIHNlY3Rpb25zIGluY2x1ZGVkIGluIHRoZQotCWxpbmsuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGxpbmsgdW5tYXJrZWQgc2VjdGlvbnMuCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQKLQlpbiB0aGUgbGluay4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBsaW5rIHVubWFya2VkIHNlY3Rpb25zLgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IEluY2x1ZGUgc2VjdGlvbiBuYW1lIGluCi0Jb3ZlcmZsb3cgZXJyb3IgbWVzc2FnZXMuCi0KLVR1ZSBNYXIgMjYgMTU6NDY6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIpOiBJZiBfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZQotCWlzIG5vdCBzZXQsIHByaW50ICJCRkQ6ICIgYmVmb3JlIHRoZSBlcnJvciBtZXNzYWdlLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBBQ19DSEVDS19UT09MIHRvIGZpbmQgYXIgYW5kIHJhbmxpYi4gIEZyb20KLQlNaWxlcyBCYWRlciA8bWlsZXNAZ251LmFpLm1pdC5lZHU+LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDIyIDEyOjE3OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRml4IHNjYW4gZm9yIENfQklOQ0wvQ19FSU5DTAotCXN5bWJvbHMuCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBpZWVlX3ZlYyB0byB0YXJnX3NlbHZlY3MgZm9yIGk5NjAgdGFyZ2V0cyBhbmQKLQltNjhrLWFvdXQsIG02OGstY29mZiwgYW5kIG02OGstZWxmIHRhcmdldHMuCi0KLUZyaSBNYXIgMjIgMTE6MzM6NDQgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBnb29meS5pbWVjaC51bmktZHVpc2J1cmcuZGU+Ci0KLQkqIGllZWUuYzogQ2hhbmdlZCAjaWZkZWYgS0VFUE1JTlVTUENJTklOU1QgdG8gI2lmIEtFRVBNSU5VU1BDSU5JTlNULgotCShpZWVlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IFJlc3RydWN0dXJlZCB0byBwcmV2ZW50Ci0JaWVlZV9vYmplY3RfcCBmcm9tIGJlaW5nIGNhbGxlZCByZXBlYXRlZGx5LgotCi1UaHUgTWFyIDIxIDExOjAwOjQ3IDE5OTYgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIEFsbG9jYXRlCi0JYnVmZmVycyBsYXJnZSBlbm91Z2ggZm9yIGFueSBGSUxFSERSIG9yIEFPVVRIRFIuCi0KLVRodSBNYXIgMjEgMTY6Mjg6MTcgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogZWNvZmZsaW5rLmMgKGxvb2t1cF9saW5lKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgcmVuYW1lZCBhbmQKLQlzbGlnaGx5IGNoYW5nZWQgZnJvbSBvbGQgX2JmZF9lY29mZl9sb2NhdGVfbGluZS4KLQkoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IENhY2hlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgVXNlCi0JbG9va3VwX2xpbmUgZm9yIGFjdHVhbCBsb29rdXAuCi0KLVRodSBNYXIgMjEgMTQ6NTk6MTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X3BkYXRhKTogV2FybiBpZiB0aGUgLnBkYXRhIHNlY3Rpb24gaXMgbm90IGEKLQltdWx0aXBsZSBvZiAyMCBieXRlcy4KLQotVGh1IE1hciAyMSAxMzo1NDo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBVc2UgYmZkX3phbGxvYyB0bwotCWFsbG9jYXRlIGVjb2ZmX2ZpbmRfbGluZSwgYW5kIGRvbid0IGluaXRpYWxpemUgYnkgaGFuZC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBVc2UgYmZkX3phbGxvYyBmb3IKLQltaXBzX2VsZl9maW5kX2xpbmUsIGFuZCBkb24ndCBjYWxsIG1lbXNldC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBub3QKLQlwcm9kdWNpbmcgYSBmaW5hbCBleGVjdXRhYmxlLCBkb24ndCBjb25zaWRlciBzb2ZhciB3aGVuIGFsaWduaW5nCi0JdGhlIHNlY3Rpb24gdG8gdGhlIGNvcnJlY3Qgc2l6ZS4KLQotV2VkIE1hciAyMCAxNjo1MzoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyk6IElmZGVmIG91dC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjYWxsIGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scy4KLQkqIGNvZmZnZW4uYyAoY29mZl9zZWN0aW9uX3N5bWJvbCk6IElmZGVmIG91dC4KLQotTW9uIE1hciAxOCAxMjo1NDo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZ3ByZWwzMl9yZWxvYyk6IEluaXRpYWxpemUgZ3AgaWYKLQlvdXRwdXRfYmZkIGlzIG5vdCBOVUxMLgotCi1UaHUgTWFyIDE0IDE3OjEyOjA2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogQ2FsbCBiZmRfemFsbG9jIGluc3RlYWQKLQlvZiBiZmRfYWxsb2MgKGZpeGVzIGZpeF9saW5lIG5vdCBiZWluZyBpbml0aWFsaXplZCkuCi0JRGVsZXRlIHplcm9pbmcgb2YgZml4X3t2YWx1ZSx0YWcsZW5kLHNjbmxlbn0gZmllbGRzLgotCi1UaHUgTWFyIDE0IDE2OjA2OjA2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogQWxsb3cgc3BlY2lmaWMgYmFja2VuZHMgdG8gb3ZlcnJpZGUgdGhlCi0JYmZkX2xpbmtfYWRkX3N5bWJvbHMgcm91dGluZS4KLQotCSogY29mZi1oODMwMC5jOiBJbmNsdWRlIGdlbmxpbmsuaC4KLQkoaG93dG9fdGFibGUpOiBBZGQgUl9NRU1fSU5ESVJFQ1QuCi0JKHJ0eXBlMmhvd3RvKTogU3VwcG9ydCBSX01FTV9JTkRJUkVDVC4KLQkoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IEhhbmRsZSBSX01FTV9JTkRJUkVDVCBsaWtlIFJfUkVMQllURQotCWZvciBub3cuCi0KLVR1ZSBNYXIgMTIgMTI6NDE6MTcgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1Aa29hbGEuYXpzdGFybmV0LmNvbT4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlCi0JaW5mby0+Y2FsbGJhY2tzX3dhcm5pbmcsIHJhdGhlciB0aGFuIF9iZmRfZXJyb3JfaGFuZGxlciwgZm9yCi0JIm11bHRpcGxlIGdwIiB3YXJuaW5nLgotCi1UdWUgTWFyIDEyIDEyOjEwOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUmVtb3ZlIEJGRF9BU1NFUlQgb24gaGFzaAotCXRhYmxlIHN0cmluZy4gIFVzZSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwLgotCShfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogUmVtb3ZlIEJGRF9BU1NFUlQgb24gaGFzaAotCXRhYmxlIHN0cmluZy4KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogVXNlIHRoZSBuYW1lIGZyb20gdGhlIGhhc2gKLQl0YWJsZSwgaWYgYW55LCB3aGVuIHdyaXRpbmcgb3V0IHN5bWJvbHMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFVzZSB0aGUgbmFtZSBmcm9tIHRoZSBoYXNoIHRhYmxlLAotCWlmIGFueSwgd2hlbiByZXBvcnRpbmcgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IFVzZSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwLgotCSogYm91dC5jIChnZXRfdmFsdWUpOiBMaWtld2lzZS4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgotCShlbGZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogTGlrZXdpc2UuCi0JKHhjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfZmRyX2luKTogSWYgRUNPRkZfNjQsIHR1cm4gMHhmZmZmZmZmZgotCWludG8gLTEgZm9yIGludGVybi0+cnNzLgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCi0KLU1vbiBNYXIgMTEgMTI6Mjg6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFiLXN5bXMuYyAoX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUpOiBEZWZpbmUuCi0JKGJmZF9nZXRfc3RhYl9uYW1lKTogUmVuYW1lIGZyb20gYW91dF9zdGFiX25hbWUuICBSZXdyaXRlIHRvIHVzZSBhCi0Jc3dpdGNoLgotCSogYmZkLWluLmggKGJmZF9nZXRfc3RhYl9uYW1lKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0xJQlMpOiBBZGQgc3RhYi1zeW1zLm8uCi0JKEJGRF9MSUJTX0NGSUxFUyk6IEFkZCBzdGFiLXN5bXMuYy4KLQkoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgc3RhYi1zeW1zLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IFJlbW92ZSBzdGFiLXN5bXMuYy4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgbGlzdCBzdGFiLXN5bXMubyBpbiBiZmRfYmFja2VuZHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBsaWJhb3V0LmggKGFvdXRfc3RhYl9uYW1lKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pKTogQ2FsbCBiZmRfZ2V0X3N0YWJfbmFtZSwKLQlub3QgYW91dF9zdGFiX25hbWUuCi0KLUZyaSBNYXIgIDggMTE6MjY6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEFkanVzdCBmaWxlIG9mZnNldAotCWZvciBzZWN0aW9uIGFsaWdubWVudCBldmVuIGlmIFNFQ19MT0FEIGlzIG5vdCBzZXQuCi0KLVR1ZSBNYXIgIDUgMTI6MDI6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBTSExJQiBvciBTSExJTksgdG8gYW4gZW1wdHkgc3RyaW5nLAotCXNpbmNlIHRoZXkgYXBwZWFyIGFzIHRhcmdldHMgaW4gTWFrZWZpbGUuaW4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IElmIG5vdCBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSwKLQlkb24ndCBmaWRkbGUgd2l0aCBhIHN5bWJvbCB3aGljaCBpcyBub3QgZGVmaW5lZCBhbnl3aGVyZS4KLQotTW9uIE1hciAgNCAxMjo0OToxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9tYXJrKTogVHJlYXQgdW5kZWZpbmVkIGltcG9ydGVkIHN5bWJvbHMgYXMKLQl0aG91Z2ggdGhleSBhcmUgZGVmaW5lZCBpbiBhIHNoYXJlZCBsaWJyYXJ5LgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBMaWtld2lzZS4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRG9uJ3QgbG9vayBhdCB0aGUgbGluZQotCW51bWJlcnMgZm9yIHRoZSBzZWN0aW9uIGlmIHNlY3Rpb24tPmxpbmVubyBpcyBOVUxMLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IFByaW50IGEgdXNlZnVsIGVycm9yCi0JbWVzc2FnZSByYXRoZXIgdGhhbiBjYWxsaW5nIEJGRF9BU1NFUlQuCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCV9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wuCi0KLUZyaSBNYXIgIDEgMDk6NDI6NTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBEb24ndCBzZXQgU0VDX0xPQUQgZmxhZwotCWZvciAuc2JzcyBzZWN0aW9uLgotCi1XZWQgRmViIDI4IDExOjI1OjQ3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oIChocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUpOiBBZGQgUl9IUFBBX05MU0VMCi0JYW5kIFJfSFBQQV9OTFJTRUwuCi0JKGVfbnNlbCwgZV9ubHNlbCwgZV9ubHJzZWwpOiBVbmRlZmluZS4gIEFkZCB0bwotCWhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQuCi0JKGhwcGFfZmllbGRfYWRqdXN0KTogSGFuZGxlIGVfbmxzZWwsIGVfbmxyc2VsLiAgRml4IGVfbnNlbCBoYW5kbGluZy4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSBOJywgTkwnIE5MUicgZmllbGQKLQlzZWxlY3RvcnMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBGaW5pc2ggaGFuZGxpbmcgb2YgUl9OMFNFTCBhbmQgUl9OMVNFTC4KLQotV2VkIEZlYiAyOCAxMTowMDoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWRqdXN0IHRoZSBzZWdtZW50Ci0JbWVtb3J5IHNpemUgZm9yIHRoZSBhbGlnbm1lbnQgb2YgYSBTRUNfQUxMT0Mgc2VjdGlvbiwgbm90IGp1c3QgYQotCVNFQ19MT0FEIHNlY3Rpb24uCi0KLVR1ZSBGZWIgMjcgMTQ6MTc6MzEgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGtsaW51eC5jOiBOZXcgZmlsZS4KLQkqIGhvc3RzL202OGtsaW51eC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5iZmQgKG02OCotKi1saW51eGFvdXQqLCBtNjgqLSotbGludXgqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKG02OCotKi1saW51eCopOiBOZXcgbmF0aXZlIGhvc3QuCi0JKG02OGtsaW51eF92ZWMpOiBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogdGFyZ2V0cy5jIChtNjhrbGludXhfdmVjKTogRGVjbGFyZS4KLQkqIGkzODZsaW51eC5jIChiZmRfaTM4NmxpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFJlbmFtZWQgZnJvbQotCWJmZF9saW51eF9zaXplX2R5bm1pY19zZWN0aW9ucyB0byBhdm9pZCBjbGFzaCB3aXRoIG02OGtsaW51eC5jLgotCSogYmZkLWluLmggKGJmZF9pMzg2bGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogUmVuYW1lCi0JZGVjbGFyYXRpb24gZnJvbSBiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCShiZmRfbTY4a2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIG02OGtsaW51eC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgbTY4a2xpbnV4LmMuCi0KLVR1ZSBGZWIgMjcgMTE6MzE6MzQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmggKHBhX2FyY2gpOiBBZGQgcGEyMC4KLQkoaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlKTogQWRkIFJfSFBQQV9OU0VMLgotCShlX25zZWwpOiBVbmRlZmluZS4gIEFkZCB0byBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0LgotCShocHBhX2ZpZWxkX2FkanVzdCk6IEhhbmRsZSBlX25zZWwuCi0JKiBzb20uYzogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zIGZvciBtYW55IG5ldyByZWxvY3MgZm91bmQgb25seQotCWluIGhwdXgxMCBpbmNsdWRlIGZpbGVzLgotCShzb21fZml4dXBfZm9ybWF0cyk6IEFkZCBzZXZlcmFsIG5ldyByZWxvY3MgZnJvbSBocHV4MTAuCi0JKHNvbV9ocHBhX2hvd3RvX3RhYmxlKTogQWRkIGhwdXgxMCByZWxvY3MuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9OMFNFTCBhbmQgUl9OMVNFTCBocHV4MTAgcmVsb2NzLgotCi1Nb24gRmViIDI2IDEyOjUyOjQ4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IG91dCByZWNlbnQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCwgYW5kCi0JcnVsZXMgdG8gcmVidWlsZCAuaCBmaWxlcyB1c2luZyBkb2MvY2hldy4KLQotTW9uIEZlYiAyNiAxNDo0ODozOSAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBBWlN0YXJOZXQuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBZGp1c3QgdGhlIGZpbGUKLQlzaXplIGV2ZW4gb2Ygc2VjdGlvbnMgd2l0aCBubyBjb250ZW50cy4KLQotTW9uIEZlYiAyNiAxNDowMToxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IFdoZW4gbWVyZ2luZywgc2tpcCBuYW1lcwotCXN0YXJ0aW5nIHdpdGggJyQnIHRoZSB3YXkgd2Ugc2tpcCBuYW1lcyBzdGFydGluZyB3aXRoICcuJy4gIFdoZW4KLQl1cGRhdGluZyB4X2VuZG5keCwgZG9uJ3QgYmUgZm9vbGVkIGJ5IGFuIGluZGV4IHdoaWNoIGhhcyBiZWVuCi0JbWVyZ2VkLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCB0cnkgdG8gb3B0aW1pemUgYQotCXN0cnVjdC91bmlvbi9lbnVtIHR5cGUgd2l0aCBubyBlbGVtZW50cy4KLQotU2F0IEZlYiAyNCAxMTozODo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfZXJybXNnKTogSGFuZGxlIGEgTlVMTCByZXR1cm4gZnJvbSBzdHJlcnJvci4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBJZiB0aGUgZmlyc3QgZmlsZSBpbiB0aGUKLQlhcmNoaXZlIGNhbiBub3QgYmUgcmVjb2duaXplZCBhcyBhbiBvYmplY3QsIGRvbid0IGFzc3VtZSB0aGF0IHRoaXMKLQlpcyB0aGUgd3JvbmcgZm9ybWF0LgotCi0JKiBlbGYuYyAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUKLQlmb3JtYXQgaXMgbm90IGJmZF9vYmplY3QuCi0JKGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSk6IExpa2V3aXNlLgotCi1XZWQgRmViIDIxIDEzOjU4OjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBDb3JyZWN0IHJhbmdlIG9mIFJfU0hfVVNFUwotCXJlbG9jLgotCi1UdWUgRmViIDIwIDE2OjIyOjQ0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKHRkYXRhKTogQWRkIG5ldGJzZF9jb3JlX2RhdGEuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1UdWUgRmViIDIwIDE2OjUwOjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoU1VOT1NfQ09OU1RSVUNUT1IpOiBEZWZpbmUuCi0JKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogRG9uJ3QgbGV0IGEgc3ltYm9sIGZyb20gYSBkeW5hbWljIG9iamVjdAotCW92ZXJyaWRlIGEgY29uc3RydWN0b3Igc3ltYm9sLiAgU2V0IFNVTk9TX0NPTlNUUlVDVE9SIHdoZW4KLQlhcHByb3ByaWF0ZS4KLQotCSogYm91dC5jIChiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IFVzZSB1ZGF0YS5pIHJhdGhlciB0aGFuIGZsYWdzCi0JdG8gZ2V0IHRoZSBzeW1ib2wgaW5kZXgsIG1hdGNoaW5nIDE0IEp1bCA5NSBjaGFuZ2UuCi0KLVR1ZSBGZWIgMjAgMDg6MjY6MjcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKToKLQlSZW1vdmUgZHVwbGljYXRlIGRlZmluaXRpb24gb2YgZ3AuCi0KLU1vbiBGZWIgMTkgMTI6Mzc6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0Ci0JYXNzdW1lIHRoYXQgd2UgY2FuIHNldCB0aGUgR1AgdmFsdWUgYW5kIHRoZW4gZ2V0IHRoZSBzYW1lIHZhbHVlLAotCXNpbmNlIGl0IHdvbid0IGJlIHRydWUgaWYgdGhlIG91dHB1dCBmaWxlIGlzIG5laXRoZXIgRUxGIG5vcgotCUVDT0ZGLgotCSogY29mZi1taXBzLmMgKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogRG9uJ3QgYm90aGVyIHRvIHVzZQotCV9iZmRfZ2V0X2dwX3ZhbHVlIGhlcmUuCi0JKG1pcHNfZ3ByZWxfcmVsb2MpOiBEb24ndCBhc3N1bWUgd2UgY2FuIHNldCBhbmQgZ2V0IHRoZSBHUCB2YWx1ZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfaGkxNl9yZWxvYyk6IEdldCBncCB2YWx1ZSBmcm9tCi0JbWlwc19lbGZfZmluYWxfZ3AuCi0JKG1pcHNfZWxmX2xvMTZfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZmluYWxfZ3ApOiBBZGQgcGdwIHBhcmFtZXRlci4gIFNldCBpdCB0byB0aGUgR1AgdmFsdWUuCi0JRG9uJ3QgcmVxdWlyZSB0aGF0IHRoZSBCRkQgYmUgRUxGLgotCShtaXBzX2VsZl9ncHJlbDE2X3JlbG9jKTogR2V0IGdwIHZhbHVlIGZyb20gbWlwc19lbGZfZmluYWxfZ3AuCi0JKG1pcHNfZWxmX2dwcmVsMzJfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGFzc3VtZSB3ZSBjYW4gc2V0IGFuZCBnZXQgdGhlCi0JR1AgdmFsdWUuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IERvbid0IGJvdGhlciB0byB1c2UKLQlfYmZkX2dldF9ncF92YWx1ZSBoZXJlLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUpOiBJbml0aWFsaXplIHN2LgotCURvbid0IGNoYW5nZSBlcGRyIGJldHdlZW4gbWFsbG9jIGFuZCBmcmVlLiAgQmUgY2FyZWZ1bCBub3QgdG8gZnJlZQotCU5VTEwgcG9pbnRlcnMuICBaZXJvIG91dCB0aGUgZmlyc3QgUlBEUi4KLQotCSogY29uZmlndXJlLmhvc3Q6IE9uIExpbnV4LCBvbmx5IHBhc3MgLXJwYXRoIG9wdGlvbiBpZiAkKGxpYmRpcikKLQlpcyBuZWl0aGVyIC9saWIgbm9yIC91c3IvbGliLiAgRnJvbSBBbGFuIE1vZHJhCi0JPGFsYW5AbXVsbGV0LkxldmVscy5VbmlTQS5FZHUuQXU+LgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVuYW1lIGR0X25lZWRlZF9uYW1lIHRvCi0JZHRfbmFtZS4KLQkoZWxmX2R0X25hbWUpOiBSZW5hbWUgZnJvbSBlbGZfZHRfbmVlZGVkX25hbWUuCi0JKiBlbGYuYyAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBVc2UgZWxmX2R0X25hbWUsIG5vdAotCWVsZl9kdF9uZWVkZWRfbmFtZS4KLQkoYmZkX2VsZl9nZXRfZHRfc29uYW1lKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgZWxmX2R0X25hbWUsIG5vdAotCWVsZl9kdF9uZWVkZWRfbmFtZS4gIFNhdmUgdGhlIFNPTkFNRSBiYWNrIGluIGVsZl9kdF9uYW1lLgotCSogYmZkLWluLmggKGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBGZWIgMTkgMDI6NTA6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lZCBmcm9tCi0JX2JmZF9zcGFyY19lbGZfcmVsb2NfdHlwZV9sb29rdXAuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBVcGRhdGUuCi0JKiBlbGY2NC1zcGFyYy5jIChTUEFSQzY0X09MRF9SRUxPQ1MpOiBEZWZpbmUuCi0JKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogRGVmaW5lLgotCShzcGFyY19yZWxvY19tYXApOiBEZWZpbmUuCi0JKHNwYXJjNjRfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBVc2Ugc3BhcmM2NF9lbGZfaG93dG9fdGFibGUuCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFVwZGF0ZS4KLQotU3VuIEZlYiAxOCAxNTowMjoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBDaGVjayBmb3IgJ2RvIG5vdCBtaXgnIGZyb20gbmF0aXZlIGxpbmtlciBiZWZvcmUKLQl0cnlpbmcgdG8gdXNlIC1ycGF0aC4KLQotRnJpIEZlYiAxNiAxMjo0NjoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChfYmZkX2dldF9ncF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9zZXRfZ3BfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZXRfZ3BfdmFsdWUpOiBEZWNsYXJlLgotCShfYmZkX3NldF9ncF92YWx1ZSk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogVXNlCi0JX2JmZF9nZXRfZ3BfdmFsdWUgYW5kIF9iZmRfc2V0X2dwX3ZhbHVlIHJhdGhlciB0aGFuIHJlZmVycmluZwotCWRpcmVjdGx5IHRvIHRoZSBmaWVsZHMgaW4gdGhlIHRkYXRhIGluZm9ybWF0aW9uLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBMaWtld2lzZS4KLQkobWlwc19ncHJlbF9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfaGkxNl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9sbzE2X3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2ZpbmFsX2dwKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dwcmVsMTZfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfZ3ByZWwzMl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBib3V0LmMgKGJfb3V0X3NldF9hcmNoX21hY2gpOiBSZWNvZ25pemUgYmZkX21hY2hfaTk2MF9qeC4KLQotVGh1IEZlYiAxNSAxMToyOToxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19QUk9HX0NDIGJlZm9yZSBjb25maWd1cmUuaG9zdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBEb24ndCBzZXQgaW5mb3JtYXRpb24gd2hpY2ggYXV0b2NvbmYgc2hvdWxkCi0JZmlndXJlIG91dCwgbmFtZWx5IENDLCBDRkxBR1MsIExERkxBR1MsIEFSLCBhbmQgUkFOTElCLgotCi0JKiBjb25maWd1cmUuaG9zdDogUmVtb3ZlIGdvMzIgYW5kIHdpbjMyIGhvc3QgaW5mb3JtYXRpb24sIHNpbmNlIGl0Ci0Jc2hvdWxkIG5vIGxvbmdlciBiZSBuZWVkZWQuCi0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBJZiB3ZSBoYXZlIGEgLmR5bmFtaWMgc2VjdGlvbiwKLQl0aGVuIHN0YXJ0IGEgbmV3IHNlZ21lbnQgcmF0aGVyIHRoYW4gcHV0IGEgd3JpdGFibGUgc2VjdGlvbiBpbiBhCi0JcmVhZG9ubHkgc2VnbWVudC4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBSUEFUSF9FTlZWQVIuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkCi0JemVyb19zZWN0aW9uIHZhcmlhYmxlLgotCi1UaHUgRmViIDE1IDEwOjM5OjE3IDE5OTYgIEguSi4gTHUgIDxoamxAem9vbS5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKHNyY2RpcikvYmZkLWluMi5oKTogUmVuYW1lIHRhcmdldCBmcm9tIGJmZC1pbjIuaC4KLQkoJChzcmNkaXIpL2xpYmJmZC5oKTogUmVuYW1lIGZyb20gbGliYmZkLmguCi0JKCQoc3JjZGlyKS9saWJjb2ZmLmgpOiBSZW5hbWUgZnJvbSBsaWJjb2ZmLmguCi0KLVdlZCBGZWIgMTQgMTY6Mjk6MDcgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX2V4cHJlc3Npb24pOiBPbmx5IHVzZSBhbiBSIHZhcmlhYmxlIGZvciBhCi0JbG9jYWwgc3ltYm9sLiAgRG9uJ3Qgb3V0cHV0IGEgemVybyBvZmZzZXQuICBIYW5kbGUgYSB6ZXJvIGFkZHJlc3MuCi0JKFNSQ19NQVNLLCBQQ1JFTF9PRkZTRVQpOiBEZWZpbmUgYmFzZWQgb24gS0VFUE1JTlVTUENJTklOU1QuCi0JKHJlbDMyX2hvd3RvLCByZWwxNl9ob3d0bywgcmVsOF9ob3d0byk6IFVzZSBTUkNfTUFTSyBhbmQKLQlQQ1JFTF9PRkZTRVQuCi0JKHBhcnNlX2V4cHJlc3Npb24pOiBEb24ndCB0cnkgdG8gaGFuZGxlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIGEKLQlQIHZhcmlhYmxlLiAgSGFuZGxlIEkgdmFyaWFibGVzIGRpZmZlcmVudGx5IGZyb20gWCB2YXJpYWJsZXMuICBGaXgKLQl0aGUgb3JkZXIgb2YgbWludXMgZXhwcmVzc2lvbnMuCi0JKGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyk6IEdlbmVyYXRlIGFuIEkgdmFyaWFibGUgZm9yIGFuIE5OCi0JcmVjb3JkLiAgRml4IGhhbmRsaW5nIG9mIEFUSSBhbmQgQVRYIHJlY29yZHMuCi0JKGllZWVfc2x1cnBfc2VjdGlvbnMpOiBPbmx5IHNldCBtaW5pbWFsIHNlY3Rpb24gYXR0cmlidXRlcy4KLQlBZGp1c3QgdGhlbSBsYXRlciwgYmFzZWQgb24gdGhlIHNlY3Rpb24gY29udGVudHMuCi0JKGllZWVfb2JqZWN0X3ApOiBSZWFkIGluIHRoZSBmaWxlIHVudGlsIGp1c3QgYWZ0ZXIgdGhlIE1FIHJlY29yZC4KLQlDYWxsIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIHRvIHNldCB0aGUgc2VjdGlvbiBmbGFncy4KLQkoZG9fb25lKTogQWRkIGl0ZXJhdGlvbnMgcGFyYW1ldGVyLiAgT25seSByZXBlYXQgdGhlIGZpcnN0IGxvYWQKLQlpdGVtLiAgU2V0IHRoZSBzZWN0aW9uIGFuZCBmaWxlIHJlbG9jIGZsYWdzLgotCShpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSk6IFNldCBzZWN0aW9uIGZsYWdzLiAgUGFzcyBpdGVyYXRpb25zIHRvCi0JZG9fb25lLgotCShpZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IEhhbmRsZSBJIHZhcmlhYmxlcy4KLQkoZG9fd2l0aF9yZWxvY3MpOiBPbmx5IGVtaXQgcmVsb2NhdGlvbiBzaXplIHdoZW4gbmVjZXNzYXJ5LgotCUluY3JlYXNlIE1BWFJVTiB0byAxMjcuICBDaGFuZ2Ugb3YgdG8gYmUgYXNzaWduZWQsIGFuZCB0YWtlCi0Jc3JjX21hc2sgYW5kIHBjcmVsX29mZnNldCBpbnRvIGFjY291bnQuCi0JKGllZWVfd3JpdGVfZGF0YV9wYXJ0KTogU2tpcCBzZWN0aW9ucyB0aGF0IGFyZSBub3QgbG9hZGVkLgotCShpZWVlX3dyaXRlX2V4dGVybmFsX3BhcnQpOiBEb24ndCBvdXRwdXQgb3B0aW9uYWwgbGFzdCBlbnRyeSBvZiBXWAotCXJlY29yZHMuCi0JKGllZWVfd3JpdGVfbWVfcGFydCk6IE1ha2Ugc2V0dGluZyBvZiBtZV9yZWNvcmQgbmVhdGVyLgotCShpZWVlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IEdldCB0aGUgc2l6ZSBvZiBhbiBhcmNoaXZlIGVsZW1lbnQuCi0KLQkqIHN5bXMuYyAoc3R0KTogQWRkIGVudHJpZXMgZm9yIHplcm92YXJzLCB2YXJzLCBhbmQgY29kZS4KLQotCSogZWxmY29kZS5oICh2YWxpZGF0ZV9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHdyaXRlX3JlbG9jcyk6IENhbGwgdmFsaWRhdGVfcmVsb2MgZm9yIG5vbiBFTEYgcmVsb2NzLgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKFRBUkdFVF9CSUdfU1lNKTogVXNlIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyLgotCShUQVJHRVRfTElUVExFX1NZTSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcuYmZkIChtNjgqLSotcHNvcyopOiBOZXcgdGFyZ2V0LgotCi1UdWUgRmViIDEzIDE1OjU2OjIyIDE5OTYgIEJyeWFuIEZvcmQgIDxiYWZvcmRAc25ha2UuY3MudXRhaC5lZHU+Ci0KLQkqIGkzODZtc2Rvcy5jOiBSZW1vdmUgc29tZSAjaWYgMCBjb2RlLgotCShtc2Rvc193cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBpbmNsdWRlIGVtcHR5IHNlY3Rpb25zIGluIHRoZQotCXNpemUgY29tcHV0YXRpb24sIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgYWRkcmVzcy4KLQotVHVlIEZlYiAxMyAxNTozNjozNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBzZWdmYXVsdCBpZiBkeW5ib2oKLQlpcyBOVUxMLCBpZSwgdGhlIC1yIHN3aXRjaCBpcyB1c2VkLgotCi1UdWUgRmViIDEzIDE0OjM1OjE1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOiBEZWZpbmUuCi0JKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KTogRGVmaW5lLgotCShCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYsIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNik6IERlZmluZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfcmVsb2NfbWFwKTogTWFwIG5ldyByZWxvY3MuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSERMRkxBR1MgZm9yICotKi1ocHV4IHdpdGggLS1lbmFibGUtc2hhcmVkLgotCi0JKiBNYWtlZmlsZS5pbiAoJChTSExJTkspKTogQ2hlY2sgdHMgYWdhaW5zdCAkKFNITElCKSwgbm90Ci0JJChTSExJTkspLgotCi0JKiBpZWVlLmMgKGdldF9zeW1ib2wpOiBTZXQgdGhlIHNlY3Rpb24gdG8gYmZkX2Fic19zZWN0aW9uLgotCShkb193aXRoX3JlbG9jcyk6IElmIEVYRUNfUCBpcyBzZXQgYW5kIHRoZXJlIGFyZSBubyByZWxvY3MsIHVzZSBhCi0Jc2ltcGxlIG51bWJlciBmb3IgdGhlIHNlY3Rpb24gYWRkcmVzcywgcmF0aGVyIHRoYW4gYW4gZXhwcmVzc2lvbi4KLQlMaW1pdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gcmVsb2NzIHRvIE1BWFJVTi4KLQkoaWVlZV93cml0ZV9tZV9wYXJ0KTogU2V0IG1lX3JlY29yZCB0byB0aGUgZmlsZSBvZmZzZXQgYWZ0ZXIgdGhlCi0Jc3RhcnQgYWRkcmVzcy4KLQkoaWVlZV93cml0ZV9wcm9jZXNzb3IpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpZWVlX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBpZWVlX3dyaXRlX3Byb2Nlc3Nvci4KLQotRnJpIEZlYiAgOSAxMDo1MzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgJHtDQy1nY2N9IHdoZW4gdGVzdGluZyBmb3IgLXJwYXRoIG9uIFN1bk9TLgotCi0JKiBjb2ZmLWF1eC5jOiBDaGFuZ2UgaW5jbHVkZSBvZiBhdXguaCB0byBhdXgtY29mZi5oLgotCi1UaHUgRmViICA4IDE0OjAxOjAzIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBGb3IgYSBSXzY4S19SRUxBVElWRQotCXJlbG9jYXRpb24gcHV0IHRoZSBhZGRlbmQgYm90aCBpbiB0aGUgcmVsb2MgZW50cnkgYW5kIHRoZSBkYXRhLgotCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4gIE1hc2sgb3V0IG1hcmtlciBpbgotCUdPVCBvZmZzZXQgdmFsdWUuCi0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIHJlc29sdmUKLQlhIFJfNjhLX1BDeHggcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQgZ2xvYmFsIHN5bWJvbCBkaXJlY3RseS4KLQkoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogRG9uJ3QgY291bnQgc3VjaCBhIHJlbG9jLgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IERvbid0IHJlY29yZCBhIHN5bWJvbCB3aXRoCi0JYSBQTFR4eCByZWxvYyBhcyBkeW5hbWljLiAgRGlzYWxsb3cgUExUeHhPIHJlbG9jIGFnYWluc3QgYSBsb2NhbAotCXN5bWJvbCBmb3Igbm93LCBvdGhlcndpc2UgYWx3YXlzIHJlY29yZCB0aGUgc3ltYm9sIGFzIGR5bmFtaWMuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIGEgc3ltYm9sIHdpdGggYSBQTFR4eCByZWxvYwotCWlzIG5vdCByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGFuZCB3ZSBhcmUgbm90IG1ha2luZyBhCi0Jc2hhcmVkIG9iamVjdCwgdGhlbiBkb24ndCBtYWtlIGEgUExUIGVudHJ5LiAgSWYgd2UgZG8gbWFrZSBhIFBMVAotCWVudHJ5LCBtYWtlIHN1cmUgdGhlIHN5bWJvbCBoYXMgYmVlbiByZWNvcmRlZCBhcyBkeW5hbWljLgotCi1XZWQgRmViICA3IDEzOjU2OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFdoZW4gbWFraW5nIGEgc2hhcmVkIGxpYnJhcnksIHNldCBITERGTEFHUyB0bwotCXBhc3MgYW4gYXBwcm9wcmlhdGUgLXJwYXRoIG9wdGlvbi4gIFVzZSB0aGUgbWFrZSB2YXJpYWJsZSBTT05BTUUKLQlhcyB0aGUgc2hhcmVkIGxpYnJhcnkgc29uYW1lLCByYXRoZXIgdGhhbiBjb21wdXRpbmcgaXQgaGVyZS4gIE9uCi0JU3VuT1MsIGJ1aWxkIHN0YW1wLXRzaGxpbmsgaW4gcGxhY2Ugb2YgJChTSExJTkspLgotCSogTWFrZWZpbGUuaW4gKFNPTkFNRSk6IE5ldyB2YXJpYWJsZS4KLQkoJChTSExJTkspKTogTWFrZSBhIGxpbmsgdG8gdGhlIHRyYW5zZm9ybWVkIG5hbWUsIGFzIHdlbGwuCi0JKHN0YW1wLXRzaGxpbmspOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsKTogU2tpcCBzdGFtcC10c2hsaW5rIGR1cmluZyBpbnN0YWxsLgotCi1XZWQgRmViICA3IDEzOjM3OjM5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogRG8gbm90IGFzc3VtZSB0aGF0IHRoZQotCWxpbmtlciBzZWN0aW9ucyBoYXZlIGJlZW4gc2V0IHVwIHlldC4KLQotCSogZWxmLmMgKG1ha2VfbWFwcGluZyk6IEFkZCBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHN1cHByZXNzCi0JbWFraW5nIHRoZSBmaXJzdCBzZWN0aW9uIGluY2x1ZGUgdGhlIHByb2dyYW0gaGVhZGVycy4KLQkobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogSWYgdGhlIHVzZXIgdXNlZCAtVHRleHQgc3VjaCB0aGF0IHRoZQotCXByb2dyYW0gaGVhZGVycyBhcmUgb24gYSBkaWZmZXJlbnQgcGFnZSwgZG8gbm90IHNldCB0aGUgZmxhZ3MKLQlzYXlpbmcgdGhhdCB0aGlzIHNlY3Rpb24gaW5jbHVkZXMgdGhlIHByb2dyYW0gaGVhZGVycy4KLQotVHVlIEZlYiAgNiAxNDowNDo0OSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldGJzZCopOiBTZXQgQ09SRUZJTEUgdG8gbmV0YnNkLWNvcmUuYy4KLQlkb24ndCBkZWZpbmUgVFJBRF9IRUFERVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIG5ldGJzZC1jb3JlLmM6IE5ldyBmaWxlLCBzdXBwb3J0IGZvciBOZXRCU0QgY29yZSBmaWxlcy4KLQkqIGhvc3RzLypuYnNkLmg6IFJlbW92ZWQuCi0KLVR1ZSBGZWIgIDYgMTE6NDc6NDkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19TUEFSQ19bNTY3XSk6IE5ldyByZWxvYyB0eXBlcy4KLQkoQkZEX1JFTE9DX1NQQVJDX0xPNyByZWxvYyB0eXBlKTogRGVsZXRlZC4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWVkIGZyb20KLQliZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwLgotCShyZWxvY190eXBleyxfbmFtZXN9KTogRGVsZXRlZC4KLQkoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSZW5hbWVkIGZyb20gZWxmX3NwYXJjX2hvd3RvX3RhYmxlLgotCUFkZCBzcGFyYzY0IHJlbG9jcy4KLQkoc3BhcmNfcmVsb2NfbWFwKTogQWRkIHNwYXJjNjQgcmVsb2NzLgotCShzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBIYW5kbGUgUl9TUEFSQ19XRElTUHsxNiwxOX0uCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3dkaXNwMTZfcmVsb2MpOiBEZWxldGVkLgotCShyZWxvY190eXBleyxfbmFtZXN9KTogRGVsZXRlZC4KLQkoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogRGVsZXRlZC4KLQkoc3BhcmNfcmVsb2NfbWFwKTogRGVsZXRlZC4KLQkoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSZW5hbWVkIGZyb20gZWxmX3NwYXJjX2hvd3RvX3RhYmxlLgotCShiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQ2hhbmdlIGZyb20gZnVuY3Rpb24gdG8gI2RlZmluZS4KLQotVHVlIEZlYiAgNiAxMjoxMjoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBNYWtlIFNITElCX0NGTEFHUyBpbmNsdWRlICQoUElDRkxBRykgb24gYQotCSotKi1ocHV4KiBob3N0LgotCi0JKiBNYWtlZmlsZS5pbiAocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSk6IE5ldyB2YXJpYWJsZS4KLQkoaW5zdGFsbCk6IFRyYW5zZm9ybSBsaWJyYXJ5IG5hbWUgYmVmb3JlIGluc3RhbGxpbmcgaXQuCi0KLU1vbiBGZWIgIDUgMTA6Mzg6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9pOTYwX2h4KTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogY3B1LWk5NjAuYyAoc2Nhbl85NjBfbWFjaCk6IEFjY2VwdCBtYWNoaW5lICJoeCIuCi0JKE1BVFJJWCk6IEV4cGFuZCBlbnRyaWVzIGZvciBIWC4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBpOTYwOmh4IGVudHJ5LgotCSogYm91dC5jIChiX291dF9zZXRfYXJjaF9tYWNoKTogSGFuZGxlIGJmZF9tYWNoX2k5NjBfaHguCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEhhbmRsZSBGX0k5NjBIWC4KLQkoY29mZl9zZXRfZmxhZ3MpOiBIYW5kbGUgYmZkX21hY2hfaTk2MF9oeC4KLQotCVN1cHBvcnQgZm9yIGJ1aWxkaW5nIGFzIGEgc2hhcmVkIGxpYnJhcnksIGJhc2VkIG9uIHBhdGNoZXMgZnJvbQotCUFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0FSR19FTkFCTEUgZm9yIHNoYXJlZCBhbmQgY29tbW9uYmZkbGliLgotCU5ldyBzdWJzdGl0dXRpb25zOiBBTExMSUJTLCBQSUNGTEFHLCBTSExJQiwgU0hMSUJfQ0MsCi0JU0hMSUJfQ0ZMQUdTLCBDT01NT05fU0hMSUIsIFBJQ0xJU1QsIFNITElOSy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBJZiAtLWVuYWJsZS1zaGFyZWQsIGFkanVzdCBzaGFyZWQgbGlicmFyeSBzdHVmZgotCWJhc2VkIG9uIHRoZSBob3N0LiAgSWYgdGhlIGhvc3QgaXMgU3VuT1MsIGFuZCB0aGUgbGlua2VyIHN1cHBvcnRzCi0JLXJwYXRoLCBzZXQgSExERkxBR1MgdG8gdXNlIGl0LgotCSogTWFrZWZpbGUuaW4gKEFMTExJQlMpOiBOZXcgdmFyaWFibGUuCi0JKFBJQ0ZMQUcsIFNITElCLCBTSExJQl9DQywgU0hMSUJfQ0ZMQUdTKTogTmV3IHZhcmlhYmxlcy4KLQkoQ09NTU9OX1NITElCLCBTSExJTkspOiBOZXcgdmFyaWFibGVzLgotCSguYy5vKTogSWYgUElDRkxBRyBpcyBzZXQsIGNvbXBpbGUgdHdpY2UsIG9uY2UgUElDLCBvbmNlIG5vcm1hbC4KLQkoU1RBR0VTVFVGRik6IFJlbW92ZSB2YXJpYWJsZS4KLQkoYWxsKTogRGVwZW5kIHVwb24gJChBTExMSUJTKSBhbmQgQFBJQ0xJU1RAIHJhdGhlciB0aGFuCi0JJChUQVJHRVRMSUIpLgotCShzdGFtcC1vZmlsZXMpOiBOZXcgdGFyZ2V0LCBsaWtlIG9sZCBvZmlsZXMgdGFyZ2V0LCBidXQgYnVpbGQKLQl1c2luZyBhIHRlbXBvcmFyeSBmaWxlIGFuZCBtb3ZlLWlmLWNoYW5nZSwgYW5kIHRvdWNoIHN0YW1wLW9maWxlcwotCXdoZW4gZG9uZS4KLQkob2ZpbGVzKTogSnVzdCBkZXBlbmQgdXBvbiBzdGFtcC1vZmlsZXMuCi0JKHN0YW1wLXBpY2xpc3QsIHBpY2xpc3QpOiBOZXcgdGFyZ2V0cy4KLQkoJChTSExJQiksICQoU0hMSU5LKSk6IE5ldyB0YXJnZXRzLgotCSh0YXJnZXRzLm8sIGFyY2h1cmVzLm8pOiBCdWlsZCB0d2ljZSBpZiBQSUNGTEFHIGlzIHNldC4KLQkoZG9fbW9zdGx5Y2xlYW4pOiBSZW1vdmUgcGljLyouby4KLQkoZG9fY2xlYW4pOiBSZW1vdmUgc3RhbXAtb2ZpbGVzLCAkKFNITElCKSwgJChTSExJTkspLCBwaWNsaXN0LCBhbmQKLQlzdGFtcC1waWNsaXN0LgotCShkb19kaXN0Y2xlYW4pOiBSZW1vdmUgcGljIGFuZCBzdGFtcC1waWNkaXIuCi0JKGluc3RhbGwpOiBJbnN0YWxsIHNoYXJlZCBsaWJyYXJpZXMuCi0JKCQoT0ZJTEVTKSk6IERlcGVuZCB1cG9uIHN0YW1wLXBpY2Rpci4KLQkoc3RhbXAtcGljZGlyKTogTmV3IHRhcmdldC4KLQotCSogbGliY29mZi1pbi5oOiBBZGQgY29tbWVudCByZW1pbmRpbmcgcGVvcGxlIHRoYXQgbGliY29mZi5oIGlzIGEKLQlnZW5lcmF0ZWQgZmlsZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogZWxmbGluay5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgdHJ5IHRvIGdldCB0aGUKLQlmbGF2b3VyIG9mIGEgc2VjdGlvbiB3aXRoIG5vIG93bmVyLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ2xlYXIKLQlFTEZfTElOS19OT05fRUxGIGZsYWcuCi0JKG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBlbGYuYzogUmV2ZXJ0IGxhc3QgY2hhbmdlLCBzaW5jZSBpdCBicmVha3MgZHluYW1pYyBsaW5raW5nLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSB3YW50X2hkcl9pbl9zZWcKLQlmaWVsZC4KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX2JhY2tlbmRfd2FudF9oZHJfaW5fc2VnKTogRG9uJ3QgZGVmaW5lLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3dhbnRfaGRyX2luX3NlZyk6IERvbid0IGRlZmluZS4KLQkoZWxmTk5fYmVkKTogRG9uJ3QgaW5pdGlhbGl6ZSB3YW50X2hkcl9pbl9zZWcgZmllbGQuCi0KLVN1biBGZWIgIDQgMjA6NDU6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IElmIHRoZSBiYWNrZW5kIGRvZXMKLQlub3Qgd2FudCB0aGUgZWxmIGhlYWRlciBvciB0aGUgcHJvZ3JhbSBoZWFkZXJzIGluIHRoZSBhZGRyZXNzCi0Jc3BhY2UsIGRvIG5vdCBpbmNsdWRlIHRoZW0gaW4gdGhlIGNhbGN1bGF0aW9ucy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBOZXcgaG9vawotCWZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIGFkZGl0aW9uYWwgcHJvZ3JhbSBoZWFkZXJzLgotCShwcGNfZWxmX21vZGlmeV9zZWdtZW50X21hcCk6IERlZmluZSBhcyBhIE5PUCBmdW5jdGlvbiBmb3Igbm93LgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IC5zZGF0YTIgaXMgYSByZWFkLW9ubHkgc2VjdGlvbi4KLQotU2F0IEZlYiAgMyAyMzowMDowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmg6IE1vdmUgdG9kYXkncyBsaWJjb2ZmLmggY2hhbmdlIGludG8gY29mZmNvZGUuaC4KLQotU2F0IEZlYiAgMyAxNTo0Mzo0NCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi5oIChiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKTogQ29tYmluZSBtYWNybyBhcmdzCi0JYmFjayBpbnRvIG9uZSBsaW5lLiAgU29tZSBjb21waWxlcnMgKHN1bm9zIDQuMS4zIGZvciBleGFtcGxlKQotCXdvbid0IGFjY2VwdCBhcmdzIHNwbGl0IGFjcm9zcyBtb3JlIHRoYW4gb25lIGxpbmUuCi0KLUZyaSBGZWIgIDIgMTE6NDI6MTUgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoQkZEX0JJTkFSWV9GT1BFTik6IFVuZGVyc3RhbmQgY3lnd2luMzIuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLUZyaSBGZWIgIDIgMTI6MTI6MTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyk6IERvbid0Ci0JdHJ5IHRvIGRvIGFyaXRobWV0aWMgb24gYSB2b2lkICosIGNhc3QgaXQgdG8gYSB1bnNpZ25lZCBjaGFyICogZmlyc3QuCi0KLVRodSBGZWIgIDEgMTY6MDQ6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKEVMRl9MSU5LX05PTl9FTEYpOiBEZWZpbmUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBTZXQgZWxmX2xpbmtfaGFzaF9mbGFncyB0bwotCUVMRl9MSU5LX05PTl9FTEYuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFJlc2V0IEVMRl9MSU5LX05PTl9FTEYKLQlmbGFnIGZvciBhIG5ld2x5IGRlZmluZWQgc3ltYm9sLgotCShOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBMaWtld2lzZS4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIEVMRl9MSU5LX05PTl9FTEYgaXMgc2V0LCB0cnkgdG8KLQlzZXQgdGhlIERFRiBvciBSRUZfUkVHVUxBUiBmbGFncyBjb3JyZWN0bHkuCi0KLQkqIE1ha2VmaWxlLmluIChiZmQtaW4yLmgpOiBNYWtlIGJmZC5oLCBub3QgcHJvdG9zLCBpbiBkb2NkaXIuCi0JKGxpYmJmZC5oLCBsaWJjb2ZmLmgpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBEb24ndCByZWNvcmQgYSBzeW1ib2wgd2l0aAotCWEgUExUMzIgcmVsb2MgYXMgZHluYW1pYy4KLQkoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgd2l0aCBhIFBMVDMyIHJlbG9jCi0JaXMgbm90IHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgYW5kIHdlIGFyZSBub3QgbWFraW5nIGEKLQlzaGFyZWQgb2JqZWN0LCB0aGVuIGRvbid0IG1ha2UgYSBQTFQgZW50cnkuICBJZiB3ZSBkbyBtYWtlIGEgUExUCi0JZW50cnksIG1ha2Ugc3VyZSB0aGUgc3ltYm9sIGhhcyBiZWVuIHJlY29yZGVkIGFzIGR5bmFtaWMuCi0KLVdlZCBKYW4gMzEgMTc6MjM6MzIgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBCRkRfUkVMT0NfMzJfUENSRUwuCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLXdpbjMyKTogQmVjb21lcyBpWzM0NV04Ni0qLWN5Z3dpbjMyLgotCShwb3dlcnBjbGUtKi1jeWd3aW4zMik6IE5ldy4KLQkqIHBlaWNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBHZXQgYWRkcmVzcyBmcm9tIHZtYS4KLQotV2VkIEphbiAzMSAxNjoyMzo1NyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogSWYgdGhlIHN5bWJvbAotCWF0dGFjaGVkIHRvIHRoZSBzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBhcyBhbiB1bmRlZmluZWQKLQlzeW1ib2wsIHRyZWF0IGl0IGFzIGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LgotCi1XZWQgSmFuIDMxIDE2OjE2OjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBvdXRwdXQgaW5pdGlhbCBkdW1teQotCXN5bWJvbCBvciBzZWN0aW9uIHN5bWJvbHMgaWYgc3RyaXBwaW5nIGFsbCBzeW1ib2xzIGFuZCB0aGlzIGlzIG5vdAotCWEgcmVsb2NhdGVhYmxlIGxpbmsuICBEb24ndCBvdXRwdXQgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUgaWYKLQl0aGVyZSBhcmUgbm8gc3ltYm9scy4KLQkoZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGVyZSBhcmUgbm8KLQlzeW1ib2xzIHRvIGZsdXNoLgotCi1XZWQgSmFuIDMxIDEyOjU1OjQ5IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb2ZmLWF1eC5jOiBOZXcgZmlsZS4KLQkqIGhvc3RzL202OGthdXguaDogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkIChtNjgqLWFwcGxlLWF1eCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChtNjgqLWFwcGxlLWF1eCopOiBOZXcgbmF0aXZlIGhvc3QuCi0JKG02OGthdXhfY29mZl92ZWMpOiBOZXcgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogdGFyZ2V0cy5jIChtNjhrYXV4X2NvZmZfdmVjKTogRGVjbGFyZS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZAotCV9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sLgotCShiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKTogRGVmaW5lLgotCShjb21wYXJlX2FyZWxlbnRfcHRyKTogTmV3IHN0YXRpYyBmdW5jdGlvbiBpZiBUQVJHX0FVWC4KLQkoY29mZl93cml0ZV9yZWxvY3MpOiBJZiBUQVJHX0FVWCwgc29ydCB0aGUgcmVsb2NzLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBBL1VYIGFvdXRoZHIgbWFnaWMgbnVtYmVyLgotCShjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBDYWxsCi0JYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCByYXRoZXIgdGhhbgotCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgotCSogY29mZi1tNjhrLmMgKENPRkZfUEFHRV9TSVpFKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1hdXguby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGNvZmYtYXV4LmMuCi0KLVdlZCBKYW4gMzEgMTE6Mzc6NDYgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCBSXzY4S19HT1QqCi0JcmVsb2NhdGlvbjsgaWdub3JlIGFkZGVuZCB3aXRoIFJfNjhLX3tHT1QsUExUfSpPIHJlbG9jYXRpb24uCi0KLVR1ZSBKYW4gMzAgMTI6MDk6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZG9fbWFpbnRhaW5lcl9jbGVhbik6IFJlbW92ZSAkKHNyY2RpcikvYmZkLWluMi5oLAotCSQoc3JjZGlyKS9saWJiZmQuaCBhbmQgJChzcmNkaXIpL2xpYmNvZmYuaC4KLQkobWFpbnRhaW5lci1jbGVhbik6IFdhcm4gYWJvdXQgZGVsZXRpbmcgc3BlY2lhbCBmaWxlcy4KLQkoYmZkLWluMi5oLCBsaWJiZmQuaCwgbGliY29mZi5oKTogTmV3IHRhcmdldHMuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIGluZGlyZWN0IGFuZAotCXdhcm5pbmcgc3ltYm9scyBjb3JyZWN0bHkuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIHN5bXMuYyAoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBBZGQgY2FzdHMgdG8gYXZvaWQKLQl3YXJuaW5ncy4KLQotTW9uIEphbiAyOSAxNDoyNzoyNCAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oOiBhbGlnbmVkIG5ld2x5IGV4cG9ydGVkIG5hbWVzIHdpdGggYmZkIG5hbWluZwotCWNvbnZlbnRpb25zLiBSZW1vdmVkIGFuIGVycm9uZW91cyBkZWZpbmUgb2YgUE9XRVJQQ19MRV9QRS4KLSAJKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmbGluay5jLCBjb2ZmLXBwYy5jOiB0aGUgYWJvdmUgZnVuY3Rpb24gbmFtZSBjaGFuZ2VzCi0KLU1vbiBKYW4gMjkgMTM6MDY6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBCYXNpbSBLYWRoaW0gPGthZGhpbUBzcG9jay5jcy5jb2xvcmFkby5lZHU+OgotCSogZWNvZmYuYyAoc3RydWN0IGV4dHN5bV9pbmZvKTogRGVmaW5lLgotCShfYmZkX2Vjb2ZmX2JmZF9maW5hbF9saW5rKTogUGFzcyBhIHBvaW50ZXIgdG8gc3RydWN0IGV4dHN5bV9pbmZvCi0JdG8gZWNvZmZfbGlua193cml0ZV9leHRlcm5hbC4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IEFjY2VwdCBhIHN0cnVjdCBleHRzeW1faW5mbyBwb2ludGVyLgotCVN0cmlwIHN5bWJvbHMgd2hlbiBhcHByb3ByaWF0ZS4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgotCSogc3ltcy5jIChCU0ZfT0JKRUNUKTogRGVmaW5lLgotCShiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogUHJpbnQgJ08nIGZvciBCU0ZfT0JKRUNULgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IEJTRl9PQkpFQ1QgZm9yIGFuCi0JU1RUX09CSkVDVCBzeW1ib2wuCi0JKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6IE9ubHkgc2V0IHR5cGUgdG8gU1RUX09CSkVDVCBpZiBCU0ZfT0JKRUNUCi0JaXMgc2V0LgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCB3aGVuCi0JY29weWluZyByZWxvY3MgaW50byBhIHNoYXJlZCBvYmplY3QsIHRyZWF0IGEgZGVmaW5lZCBnbG9iYWwgc3ltYm9sCi0JYXMgYSBsb2NhbCBzeW1ib2wuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IE9ubHkgc2V0IHdlYWtkZWYgdG8gYQotCXJlYWwgZGVmaW5lZCBzeW1ib2wsIG5vdCB0byBhIHdlYWsgZGVmaW5lZCBzeW1ib2wuCi0KLU1vbiBKYW4gMjkgMTE6MzQ6MzYgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmM6IHJlbW92ZWQgdGhlIFBPV0VSUENfTEVfUEUgaGFjaywgcHJvbW90ZWQgc29tZSB0eXBlcwotCWFuZCBtYWRlIGEgZmV3IHN0YXRpYyBmdW5jdGlvbnMgZXh0ZXJucy4KLQotCSogY29mZi1wcGMuYyAocHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBuZXcgZnVuY3Rpb24sIHJlcGxhY2VzIHRoZQotCVBPV0VSUENfTEVfUEUgaGFjayBpbiBjb2ZmbGluay4KLQotCSogbGliY29mZi1pbi5oOiBwcm9tb3RlZCB0aGUgZm9sbG93aW5nIGZyb20gY29mZmxpbmsuYyB0byBhbGxvdwotCV9iZmRfY29mZl9maW5hbF9saW5rIHRvIGJlIG92ZXJyaWRkZW4gLSAgU1RSSU5HX1NJWkVfU0laRSwKLQljb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQsIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUsCi0JY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5LCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUsCi0JY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2luaXQsICBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSwKLQljb2ZmX2RlYnVnX21lcmdlX2hhc2hfbG9va3VwLCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvLAotCWNvZmZfZmluYWxfbGlua19pbmZvLCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYywKLQljb2ZmX3dyaXRlX2dsb2JhbF9zeW0sIGNvZmZfbGlua19pbnB1dF9iZmQsIGNvZmZfcmVsb2NfbGlua19vcmRlci4KLQotCSogbGliY29mZi5oOiByZS1nZW4nZAotCi1GcmkgSmFuIDI2IDE4OjMzOjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jOiBJbmNsdWRlICJiZmRsaW5rLmgiLgotCShzdHJ1Y3Qgc3RhYl9maW5kX2luZm8pOiBEZWZpbmUuCi0JKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBsaW5lX2luZm8gZmllbGQuCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBUcnkgY2FsbGluZwotCV9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIGJlZm9yZSBzZWFyY2hpbmcgdGhlIEVMRgotCXN5bWJvbCB0YWJsZS4gIEZpbmQgdGhlIGNsb3Nlc3QgU1RUX0ZVTkMgc3ltYm9sLCBub3QgdGhlIGxhc3Qgb25lLgotCSogbGliY29mZi1pbi5oIChjb2ZmX2RhdGFfdHlwZSk6IEFkZCBsaW5lX2luZm8gZmllbGQuCi0gCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogVHJ5IGNhbGxpbmcKLQlfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSBiZWZvcmUgc2VhcmNoaW5nIHRoZSBDT0ZGCi0Jc3ltYm9sIHRhYmxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1GcmkgSmFuIDI2IDE2OjExOjE5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKFJfUFBDX0VNQl9TREEyMSByZWxvY2F0aW9ucyk6IE1ha2UgcmVsb2NhdGlvbiBzaXplCi0JNCBieXRlcywgc28gd2UgZ2V0IHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4gdXBkYXRpbmcgdGhlIHJlZ2lzdGVyCi0JZmllbGQgaW4gbGl0dGxlIGVuZGlhbiBtb2RlLgotCi1UaHUgSmFuIDI1IDEyOjE0OjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBSZW1vdmUgdG9jX3NlY3Rpb24gYW5kCi0JZW50cnlfc2VjdGlvbiBmaWVsZHMuICBBZGQgc250b2MgYW5kIHNuZW50cnkgZmllbGRzLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogSW5pdGlhbGl6ZSBzbnRvYyBhbmQgc25lbnRyeSwKLQlub3QgdG9jX3NlY3Rpb24gYW5kIGVudHJ5X3NlY3Rpb24gKHRoZSBDT0ZGIGZpbGUgZG9lcyBub3QgaGF2ZSBhbnkKLQlzZWN0aW9ucyBhdCB0aGlzIHBvaW50KS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgb19zbmVudHJ5IGFuZCBvX3NudG9jIGZyb20KLQlzbmVudHJ5IGFuZCBzbnRvYyByYXRoZXIgdGhhbiBlbnRyeV9zZWN0aW9uIGFuZCB0b2Nfc2VjdGlvbi4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgc250b2MgYW5kCi0Jc25lbnRyeSwgbm90IHRvY19zZWN0aW9uIGFuZCBlbnRyeV9zZWN0aW9uLgotCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQKLQllbnRyeV9zZWN0aW9uIGZyb20gaGVudHJ5LgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IElmIGEgZGVmaW5lZCBzeW1ib2wgaGFzIFhDT0ZGX0VOVFJZIHNldCwKLQlzZXQgc25lbnR5LgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IFNldCBzbnRvYywgbm90IHRvY19zZWN0aW9uLgotCSh4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sKTogR2V0IHRvY19zZWN0aW9uIGZyb20gc250b2MsIHJhdGhlcgotCXRoYW4gdXNpbmcgdG9jX3NlY3Rpb24gZGlyZWN0bHkuCi0KLQkqIGFyY2h1cmVzLmM6IEFkZCBtaXNzaW5nIGAuJyBpbiBlbnVtIGJmZF9hcmNoaXRlY3R1cmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotc2NvKmVsZiopOiBVc2UgYmZkX2VsZjMyX2kzODZfdmVjLiAgRnJvbQotCVJvYmVydCBMaXBlIDxyb2JlcnRsQGFybmV0LmNvbT4uCi0KLVRodSBKYW4gMjUgMTI6MDg6NTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgLnJlbGEuc2RhdGF7LDJ9Ci0JdG8gc2VjdGlvbnMgd2UgYWxsb2NhdGUuICBVc2UgYmZkX3phbGxvYyB0byBhbGxvY2F0ZSBpbml0aWFsaWFsCi0Jc2VjdGlvbnMsIG5vdCBiZmRfYWxsb2MuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogUmVtb3ZlIEJGRF9BU1NFUlRzIGZvciAhc2hhcmVkIGZyb20KLQlTREF7LDJ9STE2IHJlbG9jYXRpb25zLgotCShwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IFVzZSB0aGUgdmFsdWUgb2YgLUcgbm4gdG8gZGV0ZXJtaW5lCi0Jd2hldGhlciB0byBwdXQgc29tZXRoaW5nIGluIC5zYnNzIG9yIG5vdC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIHN1cHBvcnQgZm9yIG1vcmUgcmVsb2NhdGlvbnMuICBBZGQKLQlpbiBzZWMtPm91dHB1dF9vZmZzZXQgd2hlcmUgYXBwcm9wcmlhdGUuICBNYWtlIGVycm9yIG1lc3NhZ2VzCi0JaW5jbHVkZSB0aGUgc3ltYm9sIG5hbWUuCi0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogTG9va3VwIHN5bWJvbCBiZWZvcmUKLQl0cnlpbmcgdG8gYWRkIGl0IHRvIHRoZSBzeW1ib2wgdGFibGUsIHNvIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXwotCWRvZXNuJ3QgZ2V0IHJlZGVmaW5lZCBtZXNzYWdlcyBpZiAtc2hhcmVkLgotCi0JKiBlbGZsaW5rLmggKGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbikgT25seSBidW1wIFJFTEEKLQlzZWN0aW9uIGlmIHRoZSByZWxfc2VjdGlvbiBmaWVsZCBoYXMgYmVlbiBzZXQgdXAuCi0KLVdlZCBKYW4gMjQgMjA6NDA6MjYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG8gaW4gZWFiaQotCXJlbG9jYXRpb25zLgotCi1XZWQgSmFuIDI0IDEwOjM4OjM0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRGVsZXRlIGNoZWNraW5nCi0Jb2YgZmxhZ3MsIG9ubHkgZmxhZ3MgdXNlZCBhcmUgY29udHJvbGxlZCBieSBtYWNoIG51bWJlci4gIEJ1bXAgdXAKLQlvdXRwdXQgZmlsZSBtYWNoIG51bWJlciB0byBoaWdoZXN0IG9mIGlucHV0IGZpbGUgbWFjaCBudW1iZXJzLgotCShlbGYzMl9zcGFyY19vYmplY3RfcCk6IFdhdGNoIGZvciBFRl9TUEFSQ19TVU5fVVMxLgotCShlbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IEVGX1NQQVJDX1NVTl9VUzEgaWYgdjhwbHVzYS4KLQotCSogY29uZmlnLmJmZCAoc3BhcmM2NC0qLXtzeXN2NCosc29sYXJpczIqfSk6IENvbW1lbnQgb3V0Ci0JYmZkX2VsZjY0X3NwYXJjX3ZlYyBzdXBwb3J0LgotCi1UdWUgSmFuIDIzIDE0OjMzOjA1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3QgY29tcGxhaW4gaWYKLQl0aGUgZW1iZWRkZWQgYml0IGlzIHNldCBvbiBzb21lIG9iamVjdHMgYW5kIG5vdCBvbiBvdGhlcnMuICBKdXN0Ci0Jb3IgaXQgdG9nZXRoZXIuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEltcGxlbWVudCBSX1BQQ19FTUJfe1NEQTIxLFJFTFNEQX0KLQlyZWxvY2F0aW9ucy4KLQotVHVlIEphbiAyMyAxNDoyMjo0NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IERvbid0IHRyeSB0byBhbGlnbiB0aGUKLQkuc3RhYnN0ciBzZWN0aW9uLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRml4IHRoZSBoYW5kbGluZyBvZiB0aGUKLQkubGliIHNlY3Rpb24gdG8gd29yayBldmVuIGlmIHRoZSBlbnRpcmUgc2VjdGlvbiBjb250ZW50cyBhcmUKLQl3cml0dGVuIGF0IG9uY2UuICBGcm9tIEd2cmFuIFVkZGVib3JnIDxndnJhbkB1ZGRlYm9yZy5wcC5zZT4gYW5kCi0JUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KLQotTW9uIEphbiAyMiAxODo0NTo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogRG9uJ3QgYWxsb2NhdGUKLQltZW1vcnkgaGVyZSBmb3IgY29udGVudHMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBCdW1wIHVwIF9TREFfQkFTRV8gYW5kCi0JX1NEQTJfQkFTRV8gYnkgMzI3NjguCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogI2lmIG91dCBQTFQgY29kZSB3aGljaCB3ZSBoYXZlbid0Ci0Jc3RhcnRlZCB1c2luZy4gIEFsbG9jYXRlIGNvbnRlbnRzIGZvciAuc2RhdGEgYW5kIC5zZGF0YTIgc2VjdGlvbnMKLQlhbHNvLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFVzZSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSBpbiBkZWJ1ZyBtZXNzYWdlLAotCXJhdGhlciB0aGFuIF9uYW1lLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFJlbW92ZSBjb2RlIHRoYXQgYXR0ZW1wdGVkIHRvCi0Jc2l6ZSBfU0RBeywyfV9CQVNFXy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hhbmdlIGhvdyBzZGF0YXssMn0gcmVsb2NhdGlvbnMgYXJlCi0JZG9uZS4KLQotTW9uIEphbiAyMiAwODo1MjowNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBGaXggdHlwby4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfc3BhcmNfdjkpOiBSZW5hbWVkIGZyb20gYmZkX21hY2hfc3BhcmM2NC4KLQkoYmZkX21hY2hfc3BhcmNfe3Y4cGx1cyx2OHBsdXNhfSk6IERlZmluZS4KLQkoYmZkX21hY2hfc3BhcmNfdjlhKTogRGVmaW5lLgotCShiZmRfbWFjaF9zcGFyY192OV9wKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGFvdXR4LmggKGFvdXQsbWFjaGluZV90eXBlKTogYmZkX21hY2hfc3BhcmM2NCByZW5hbWVkIHRvCi0JYmZkX21hY2hfc3BhcmNfdjkuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9vYmplY3RfcCk6IExpa2V3aXNlLgotCSogY29uZmlnLmJmZCAoc3BhcmM2NC0qLXN5c3Y0KixzcGFyYzY0LSotc29sYXJpczIqKTogU2V0IHRhcmdfZGVmdmVjCi0JdG8gYmZkX2VsZjMyX3NwYXJjX3ZlYy4KLQkqIGNwdS1zcGFyYy5jIChhcmNoX2luZm9fc3RydWN0KTogUmVuYW1lZCBmcm9tIHNwYXJjX2FyY2hfaW5mby4KLQlBZGQgdjhwbHVzeyxhfSBzdXBwb3J0LgotCUFkZCB2OWEgc3VwcG9ydC4KLQkoc3BhcmNfY29tcGF0aWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZjMyLXNwYXJjLmg6ICNpbmNsdWRlICJlbGYvc3BhcmMuaCIuCi0JKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsIGVsZjMyX3NwYXJjX29iamVjdF9wLAotCWVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb25zLgotCShiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsIGVsZl9iYWNrZW5kX29iamVjdF9wLAotCWVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBEZWZpbmUuCi0KLU1vbiBKYW4gMjIgMTE6MjE6NTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQWRkCi0JbGlua2VyX3NlY3Rpb25fcG9pbnRlciBmaWVsZC4KLQkoZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bSk6IEVudW1lcmF0aW9uIGZvciBuZXcgd2F5IG9mCi0JY3JlYXRpbmcgbGlua2VyIGR5bmFtaWMgc2VjdGlvbnMgYW5kIHN5bWJvbHMuCi0JKGVsZl9saW5rZXJfc2VjdGlvbnssX3BvaW50ZXJzfSk6IE5ldyBzdHJ1Y3R1cmVzIGZvciBjcmVhdGluZwotCWR5bmFtaWMgc2VjdGlvbnMgYW5kIHN5bWJvbHMuCi0JKGVsZl9vYmpfdGRhdGEpOiBBZGQgbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMgYW5kIGxpbmtlcl9zZWN0aW9uCi0JZmllbGRzLgotCShlbGZfbG9jYWxfcHRyX29mZnNldHMsZWxmX2xpbmtlcl9zZWN0aW9uKTogTmV3IGFjY2Vzc29yIG1hY3Jvcy4KLQkoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogTmV3IGRlY2xhcmF0aW9ucy4KLQkoX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogRGl0dG8uCi0JKGJmZF9lbGZ7MzIsNjR9X3tjcmVhdGUsZmluaXNofV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogRGl0dG8uCi0JKF9iZmRfZWxmX21ha2VfbGlua2VyX3NlY3Rpb25fcmVsYSk6IERpdHRvLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVsZXRlLgotCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0byBjcmVhdGUgdGhlCi0Jc2VjdGlvbnMgLmdvdCwgLnNkYXRhLCBhbmQgLnNkYXRhMi4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBaYXAgLnJlbGEue3NkYXRhLHNkYXRhMn0gaWYKLQluZWVkZWQuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogU3VwcG9ydCBtb3JlIG9mIHRoZSBlYWJpIHJlbG9jYXRpb25zLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2xzKTogQWRqdXN0IF9TREF7LDJ9X0JBU0VfIGJ5IDMyNzY4Ci0JaWYgdGhlIC5zZGF0YXssMn0gKyAuc2Jzc3ssMn0gc2VjdGlvbiBzaXplIGlzID4gMzJrLgotCi0JKiBlbGZsaW5rLmggKGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0bwotCWNyZWF0ZSBpbml0aWFsaXplZCBwb2ludGVycyBpbiBkeW5hbWljIGxpbmtlciBzZWN0aW9ucy4KLQkoZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogQWN0dWFsbHkgaW50aWFsaXplIHRoZQotCXBvaW50ZXJzIGNyZWF0ZWQgYWJvdmUuCi0KLQkqIGVsZmNvZGUuaCAoYmZkX2VsZnszMiw2NH1fY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBOZXcKLQltYWNyb3MgdG8gcHJvdmlkZSBib3RoIDMyIGFuZCA2NCBiaXQgdmVyc2lvbnMgb2YKLQllbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24uCi0JKGJmZF9lbGZ7MzIsNjR9X2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogTmV3IG1hY3JvcyB0bwotCXByb3ZpZGUgYm90aCAzMiBhbmQgNjQgYml0IHZlcnNpb25zIG9mCi0JZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uLgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0bwotCWNyZWF0ZSBhIGxpbmtlciBzZWN0aW9uLgotCShfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBGaW5kIGEgdW5pcXVlIHBvaW50ZXIgdG8gYQotCWdpdmVuIGFkZHJlc3MgaW4gdGhlIGxpbmtlciBwb2ludGVyIG9mZnNldHMgY3JlYXRlZCBmb3IgYSBnaXZlbgotCXN5bWJvbC4KLQkoX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhKTogTWFrZSBhIFJFTEEgc2VjdGlvbgotCWNvcnJlc3BvbmRpbmcgdG8gdGhlIGdlbmVyYXRlZCBsaW5rZXIgc2VjdGlvbi4KLQotU2F0IEphbiAyMCAwODozNjoxMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChFTEZfTUFDSElORV9BTFQxKTogRGVmaW5lLgotCi1UaHUgSmFuIDE4IDE4OjI1OjM0IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogY2hhbmdlZCBUT0NERUZOIHJlbG9jcy4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBzcGVjaWFsIHZhbHVlcyBmb3IgZ2NjIGJ1aWx0IGRsbHMuCi0JKGR1bXBfdG9jKTogZml4IGRpYWdub3NpbmcgY29kZSB0byBpZGVudGlmeSBvdXQtb2YtdG9jLWJvdW5kcyBlbnRyaWVzLgotCUFsc28gYmVnaW4gdGhlIHRvYyBhdCA0IGFzIGFuIGV5ZSBjYXRjaGVyICgnMzEzMTMxMzEnIG1hcmtzIHRoZSBmaXJzdAotCXRvYyBlbnRyeSBpbiBhbiBvYmpkdW1wKSBmb3Igbm93LgotCShwcGNfZG9fbGFzdCwgcHBjX2dldF9sYXN0KTogTmV3IGZ1bmN0aW9uIC0gbmVlZGVkIHRvIHNhdmUgcHJvY2Vzc2luZwotCXRoZSB0b2Mgb3duZXIgdG8gdGhlIGVuZC4KLQkocHBjX2NvZmZfc3dhcF9zeW1faW5faG9vayk6IFJlbW92ZWQgYW4gaW5jb3JyZWN0IGhhY2sgZm9yIGRvaW5nIHRoZQotCXRvYyBvd25lciBsYXN0LgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEFkZGVkIGEgbmV3IGhhY2sgdG8ga2VlcCB0aGUKLQl0b2Mgb3duZXIgZnJvbSBiZWluZyBkb25lIHRpbGwgbGFzdC4gTXVzdCBkZWZpbmUgUE9XRVJQQ19MRV9QQwotCXRvIGVuYWJsZSBpdC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBhbGlnbm1lbnQgc2V0dGluZyBmb3IgLnN0YWIKLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IHNldCBzZWN0aW9uIGZsYWdzIGZvciBzdGFiL3N0cgotCXRvIElORk8uCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IFJlbW92ZWQgYSBub24td29ya2luZyBoYWNrIGZvciBjb21wdXRpbmcgdGhlCi0JU2l6ZU9mSW1hZ2UgZm9yIFBvd2VyUEMuIElnbm9yZSB0aGUgc2l6ZSBvZiB0aGUgLmp1bmsgc2VjdGlvbi4KLQotVGh1IEphbiAxOCAxNzo0MjoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvcmUuaDogSW5jbHVkZSA8c2lnbmFsLmg+IGJlZm9yZSA8c3lzL3Byb2Nmcy5oPi4KLQotV2VkIEphbiAxNyAxMjo0MDoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwdS1wb3dlcnBjLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgbGFzdCBlbnRyeSB0byBub3QgcG9pbnQKLQliYWNrIHRvIGZpcnN0LgotCShiZmRfcG93ZXJwY19hcmNoKTogUG9pbnQgYXQgZmlyc3QgZW50cnkgaW4gYXJjaF9pbmZvX3N0cnVjdC4KLQotVHVlIEphbiAxNiAxNToxMDo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRG9uJ3QgaW5jcmVtZW50IGZpbGUKLQlvZmZzZXQgZm9yIGEgc2VnbWVudCB3aGljaCBjb250YWlucyBubyBsb2FkYWJsZSBzZWN0aW9ucy4KLQotTW9uIEphbiAxNSAxNzo0NjoyNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IEFkZCBuZXcgUG93ZXJQQyByZWxvY2F0aW9ucy4KLQkqIHtiZmQtaW4yLGxpYmJmZH0uaDogUmVnZW5lcmF0ZS4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogQWRkIG1vcmUgUFBDIHJlbG9jYXRpb25zLgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTG9va3VwIG5ldyByZWxvY2F0aW9ucy4KLQotTW9uIEphbiAxNSAxNDoyOTo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX2V4dCk6IEZpeCBSRUxPQ19CQVNFMTAgYW5kIFJFTE9DX0JBU0UyMgotCWVudHJpZXMuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IERvbid0IGZhaWwgYXNzZXJ0IGlmCi0gICAgICAgIGluZm8tPnNoYXJlZC4KLQotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRG9uJ3QgdHJ5IHRvIGNhY2hlCi0JaW5mb3JtYXRpb24gaW4gc2VjdGlvbnMgdGhhdCBhcmUgbm90IG93bmVkIGJ5IGEgQkZELiAgRnJvbSBSaWNoYXJkCi0JSGVuZGVyc29uIDxyaWNoYXJkQGF0aGVpc3QudGFtdS5lZHU+LgotCi0JKiBlbGYzMi1taXBzLmM6IE51bWVyb3VzIGNoYW5nZXMgdG8gZHluYW1pYyBsaW5raW5nIGNvZGUsIG1vc3RseQotCWZyb20gS2F6dW1vdG8gS29qaW1hIDxra29qaW1hQGluZm8ua2FuYWdhd2EtdS5hYy5qcD4uCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBSZW1vdmUgc3BlY2lhbCBjaGVjayBmb3IKLQlfcmxkX25ld19pbnRlcmZhY2UuCi0KLQkqIGVjb2Zmc3dhcC5oOiBBZGQgcHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4KLQotU3VuIEphbiAxNCAyMTozNjowOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3t1bnN1cHBvcnRlZCxzdGR9X3JlbG9jKTogUmVtb3ZlIGZ1bmN0aW9ucy4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBSZW1vdmUgcHBjX2VsZl97dW5zdXBwb3J0ZWQsc3RkfV9yZWxvYwotCXJlZmVyZW5jZXMuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6ICBObyBsb25nZXIgYWxsb3cgLnNkYXRhLy5zYnNzIHNlY3Rpb25zCi0JdG8gc2F0aXNmeSBhIFRPQzE2IHJlbG9jYXRpb24uIAlSZXdyaXRlIHVuc3VwcG9ydGVkIHJlbG9jYXRpb24KLQlzdXBwb3J0LiAgQmVnaW4gc3VwcG9ydCBmb3IgUl9QUENfU0RBezIsfVJFTC4KLQotU2F0IEphbiAxMyAwOTozNjo1MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uIHRvCi0JY3JlYXRlIHRoZSAuZ290IGFuZCAuZ290Lm5lZyBzZWN0aW9ucy4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDYWxsIGl0LgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IENhbGwgaXQuCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogU3VwcG9ydCAuZ290Lm5lZywganVzdCBsaWtlIC5nb3QuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogQWRkIGVycm9yIG1lc3NhZ2VzIGZvciByZWxvY2F0aW9ucyB3ZQotCWRvbid0IHlldCBzdXBwb3J0LiAgRG8gbm90IGluY2x1ZGUgUl9QUENfU0RBUkVMMTYgbGlrZSBhIEdPVAotCXJlbG9jYXRpb24uCi0KLUZyaSBKYW4gMTIgMTU6Mjc6NTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9mYWtlX3NlY3Rpb25zKTogRGVmaW5lLCBhbmQgaGFuZGxlIHRoZSBuZXcKLQlzZWN0aW9uIGZsYWdzIGZvciBWLjQgYW5kIGVhYmkuCi0KLUZyaSBKYW4gMTIgMTM6NTk6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IElmIGEgc2VnbWVudAotCWNvbnRhaW5zIG5vIHNlY3Rpb25zLCBkb24ndCBtYXJrIGl0IGFzIHJlYWRhYmxlLgotCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERvbid0IGRlY2xhcmUuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRHVtcCBjb250ZW50cyBvZgotCWR5bmFtaWMgc2VjdGlvbiwgaWYgdGhlcmUgaXMgb25lLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX3NpemVfaW5mbyk6IEFkZCBzd2FwX2R5bl9pbiBmaWVsZC4KLQkoYmZkX2VsZjMyX3N3YXBfZHluX2luKTogQ2hhbmdlIHR5cGUgb2Ygc2Vjb25kIHBhcmFtZXRlciB0byBQVFIuCi0JKGJmZF9lbGY2NF9zd2FwX2R5bl9pbik6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfc3dhcF9keW5faW4pOiBDaGFuZ2UgdHlwZSBvZiBzZWNvbmQgcGFyYW1ldGVyIHRvCi0JUFRSLgotCShOQU1FKF9iZmRfZWxmLHNpemVfaW5mbykpOiBJbml0aWFsaXplIHN3YXBfZHluX2luIGZpZWxkLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGNyZWF0ZSBhCi0JRFRfVEVYVFJFTCBlbnRyeSBiZWNhdXNlIG9mIC5yZWwucGx0LiAgRnJvbSBNYXJ0aW4gUGlya2VyCi0JPHBpcmtlckBlaXVuaXgudHV3aWVuLmFjLmF0Pi4KLQotVGh1IEphbiAxMSAxNzowNjoxNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoU0VDX3tFWENMVURFLFNPUlRfRU5UUklFU30pOiBOZXcgc2VjdGlvbiBmbGFncyBmb3IKLQlQb3dlclBDIFYuNCBhbmQgZWFiaS4KLSAJKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBsaWJmZC5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoVEFSR0VUX3tCSUcsTElUVExFfV9TWU0pOiBBZGQgbmV3IGZsYWdzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IFN1cHBvcnQgU0hUX09SREVSRUQKLQlzZWN0aW9uIHR5cGUgYW5kIFNIRl9FWENMVURFIHNlY3Rpb24gZmxhZywgdHVybmluZyB0aGVtIGludG8gdGhlCi0JYXBwcm9wcmlhdGUgYmZkIHNlY3Rpb24gZmxhZy4KLQotVGh1IEphbiAxMSAxMToyMzozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogQ3JlYXRlIHRoZSBzcGVjaWFsCi0Jc2VjdGlvbnMgaWYgd2Ugc2VlIGEgRFlOQU1JQyBvYmplY3QsIGluIGNhc2UgdGhhdCBpcyB0aGUgb25seQotCVhDT0ZGIGlucHV0IG9iamVjdCB3ZSBzZWUuCi0KLQkqIGVsZjMyLW1pcHMuYzogRXh0ZW5zaXZlIGNoYW5nZXMgZm9yIGEgc3RhcnQgYXQgZHluYW1pYyBsaW5raW5nCi0Jc3VwcG9ydCwgZnJvbSBLYXp1bW90byBLb2ppbWEgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPi4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCB0eXBlX2NoYW5nZV9vayBmaWVsZC4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUKLQllbGZfYmFja2VuZF9jcmVhdGVfcHJvZ3JhbV9oZWFkZXJzIGZpZWxkLiAgQWRkCi0JZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgYW5kCi0JZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwIGZpZWxkcy4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vayk6IERlZmluZSBpZiBub3QKLQlkZWZpbmVkLgotCShlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXApOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfY3JlYXRlX3Byb2dyYW1faGVhZGVycyk6IERvbid0IGRlZmluZS4KLQkoZWxmTk5fYmVkKTogQ2hhbmdlIHRvIGFjY291bnQgZm9yIGZpZWxkIGNoYW5nZXMuCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IENhbGwgbmV3Ci0JbW9kaWZ5X3NlZ21lbnRfbWFwIGJhY2tlbmQgZnVuY3Rpb24uICBEb24ndCBjYWxsIG9sZAotCWNyZWF0ZV9wcm9ncmFtX2hlYWRlcnMgYmFja2VuZCBmdW5jdGlvbi4KLQkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBDYWxsIGFkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIHJhdGhlcgotCXRoYW4gY3JlYXRlX3Byb2dyYW1faGVhZGVycy4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSW5pdGlhbGl6ZQotCXR5cGVfY2hhbmdlX29rIGZyb20gbmV3IGJhY2tlbmQgZmllbGQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBEb24ndCB3YXJuIGlmIF9ybGRfbmV3X2ludGVyZmFjZSBpcwotCWRlZmluZWQuCi0JKGVsZl9yZWxvY19saW5rX29yZGVyKTogVHJlYXQgYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBzeW1ib2wgYXMKLQlhIHJlbG9jIGFnYWluc3QgdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24uCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHRkYXRhIGZpZWxkLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IFJlbmFtZSBwcGNfZmxhZ3NfaW5pdCBmaWVsZCB0byBmbGFnc19pbml0LgotCShlbGZfZmxhZ3NfaW5pdCk6IFJlbmFtZSBmcm9tIGVsZl9wcGNfZmxhZ3NfaW5pdC4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogVXNlIGVsZl9mbGFnc19pbml0LCBub3QKLQllbGZfcHBjX2ZsYWdzX2luaXQuCi0JKHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1tNjhrLmMgKGhvd3RvX3RhYmxlKTogQ2hhbmdlIHNyY19tYXNrIHRvIDAgZm9yIGFsbAotCXJlbG9jYXRpb24gZW50cmllcy4KLQotVHVlIEphbiAgOSAxNToyMjo1MyAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBEdXJpbmcgZmluYWwgbGluaywgYWxsb3cKLSAJb3V0cHV0IC5saXRhIHNlY3Rpb24gdG8gYmUgYmlnZ2VyIHRoYW4gNjRrIGJ5IGFkanVzdGluZyBncCB2YWx1ZQotIAlvbiBhIHBlci1pbnB1dCBzZWN0aW9uIGJhc2lzLgotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX3RkYXRhKTogQWRkIGlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nCi0JZmllbGQuCi0JKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIGdwIGZpZWxkLgotCi1UdWUgSmFuICA5IDEyOjAwOjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUhhbmRsZSBBbHBoYSBFQ09GRiBjaGFuZ2VzIGluIE9TRi8xIDMuMi4KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgZ2V0X2VsdF9hdF9maWxlcG9zCi0JZmllbGQuCi0JKiBjb2ZmLWFscGhhLmM6IEluY2x1ZGUgImFvdXQvYXIuaCIuCi0JKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IHJlcXVpcmUgYW4KLQlBTFBIQV9SX0lHTk9SRSByZWxvYyBhZnRlciBhbiBBTFBIQV9SX0dQRElTUCByZWxvYywgc2luY2UgT1NGLzEKLQkzLjIgZG9lc24ndCBnZW5lcmF0ZSBvbmUuCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYWxwaGFfZWNvZmZfc2x1cnBfYXJtYXApOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl90cnVuY2F0ZV9hcm5hbWUpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3dyaXRlX2FybWFwKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKEFSRlpNQUcpOiBEZWZpbmUuCi0JKGFscGhhX2Vjb2ZmX3JlYWRfYXJfaGRyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9pbmRleCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgZ2V0X2VsdF9hdF9maWxlcG9zIGZpZWxkLgotCShlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBDaGFuZ2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSBmcm9tCi0JX2JmZF9lY29mZiB0byBhbHBoYV9lY29mZi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IFVzZSBnZXRfZWx0X2F0X2ZpbGVwb3MKLQlmaWVsZCBmcm9tIGJhY2tlbmQgc3RydWN0dXJlLCByYXRoZXIgdGhhbiBhbHdheXMgY2FsbGluZwotCV9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZQotCWdldF9lbHRfYXRfZmlsZXBvcyBmaWVsZC4KLQkqIGFyY2hpdmUuYyAoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyk6IE5ldyBmdW5jdGlvbiwgY29waWVkCi0JZnJvbSBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgd2l0aCBtaW5vciBjaGFuZ2VzLgotCShfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIpOiBVc2UgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZy4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBiZmQtaW4uaCAoQkZEX0lOX01FTU9SWSk6IERlZmluZS4KLQkqIGxpYmJmZC1pbi5oIChzdHJ1Y3QgYmZkX2luX21lbW9yeSk6IERlZmluZS4KLQkqIGxpYmJmZC5jIChiZmRfcmVhZCk6IEhhbmRsZSBCRkRfSU5fTUVNT1JZIGZsYWcuCi0JKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBEb24ndCB0cnkgdG8gbWFwIGEgQkZEX0lOX01FTU9SWSBmaWxlLgotCShiZmRfd3JpdGUsIGJmZF9zdGF0KTogQWJvcnQgaWYgQkZEX0lOX01FTU9SWSBpcyBzZXQuCi0JKGJmZF90ZWxsLCBiZmRfZmx1c2gsIGJmZF9zZWVrKTogSGFuZGxlIEJGRF9JTl9NRU1PUlkgZmxhZy4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IENoYW5nZSBpb3N0cmVhbSBmaWVsZCBmcm9tIGNoYXIgKiB0byBQVFIuCi0JKGJmZF9nZXRfc2l6ZSk6IEhhbmRsZSBCRkRfSU5fTUVNT1JZIGZsYWcuCi0JKiBjYWNoZS5jIChiZmRfY2FjaGVfY2xvc2UpOiBJZ25vcmUgQkZEX0lOX01FTU9SWSBmaWxlcy4KLQkoYmZkX29wZW5fZmlsZSk6IENhc3QgdG8gUFRSLCBub3QgY2hhciAqLCB3aGVuIHNldHRpbmcgaW9zdHJlYW0uCi0JKGJmZF9jYWNoZV9sb29rdXBfd29ya2VyKTogQWJvcnQgaWYgQkZEX0lOX01FTU9SWSBpcyBzZXQuCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBDYXN0IHRvIFBUUiwgbm90IGNoYXIgKiwgd2hlbiBzZXR0aW5nCi0JaW9zdHJlYW0uCi0JKGJmZF9vcGVuc3RyZWFtcik6IExpa2V3aXNlLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBPbmx5IGZzdGF0IGlvc3RyZWFtIGlmCi0JQkZEX0lOX01FTU9SWSBpcyBub3Qgc2V0LgotCSogcmlzY2l4LmMgKHJpc2NpeF9zb21lX2FvdXRfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBfYmZkX2dldF9lbHRfYXRfaW5kZXggZmllbGQuCi0JKEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUpOiBBZGQgX2dldF9lbHRfYXRfaW5kZXguCi0JKGJmZF9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleCk6IFJlbmFtZSBmcm9tCi0JYmZkX2dldF9lbHRfYXRfaW5kZXguICBDaGFuZ2UgaW5kZXggcGFyYW1ldGVyIGZyb20gaW50IHRvCi0Jc3ltaW5kZXguCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgpOiBEZWNsYXJlLgotCShfYmZkX25vYXJjaGl2ZV9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfYnNkX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKF9iZmRfYXJjaGl2ZV9jb2ZmX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogYW91dC10YXJnZXQuaCAoTVlfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBpZWVlLmMgKGllZWVfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIG9hc3lzLmMgKG9hc3lzX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBzb20uYyAoc29tX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBEb24ndCByZXN0cmljdCBsaW5lCi0JbnVtYmVycyB0byB0aGUgLnRleHQgc2VjdGlvbi4KLQotTW9uIEphbiAgOCAxNzowMDo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9kZWJ1Z19wYXJ0KTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JSWYgdGhlcmUgaXMgYSBTRUNfREVCVUdHSU5HIHNlY3Rpb24sIGdldCB0aGUgY29udGVudHMgb2YgdGhlIGRlYnVnCi0JaW5mb3JtYXRpb24gcGFydCBmcm9tIGl0LgotCShpZWVlX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU3RvcmUgdGhlIGNvbnRlbnRzIG9mIGEgU0VDX0RFQlVHR0lORwotCXNlY3Rpb24gaW4gbWVtb3J5LgotCShpZWVlX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIGllZWVfd3JpdGVfZGVidWdfcGFydCByZXR1cm4uCi0KLVRodSBKYW4gIDQgMTc6MTI6MzcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotZnJlZWJzZCopOiBBZGQgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChpMzg2ZnJlZWJzZF92ZWMpOiBBZGQgdmVjLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGkzODZmcmVlYnNkLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBpMzg2ZnJlZWJzZC5jLgotCVJlYnVpbGQgZGVwZW5kZW5jaWVzLi4KLQkqIGZyZWVic2QuaDogTmV3IGZpbGUuCi0JKiBpMzg2ZnJlZWJzZC5jOiBOZXcgZmlsZS4KLQkqIHRhcmdldHMuYyAoaTM4NmZyZWVic2RfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgaTM4NmZyZWVic2RfdmVjLgotCSogaTM4NmxpbnV4LmMgKFNFR01FTlRfU0laRSk6IERlZmluZSBhcyBUQVJHRVRfUEFHRV9TSVpFCi0JKiBpMzg2bmV0YnNkLmMgKFNFR01FTlRfU0laRSk6ICBEZWZpbmUgYXMgVEFSR0VUX1BBR0VfU0laRQotCi1UaHUgSmFuICA0IDE2OjI3OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX2RlYnVnKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaWVlZV9vYmplY3RfcCk6IENhbGwgaXQuCi0JKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogU2tpcCBkZWJ1Z2dpbmcgc2VjdGlvbnMuCi0JKGllZWVfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGllZWVfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoaWVlZV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkoaWVlZV93cml0ZV9zZWN0aW9uX3BhcnQpOiBMaWtld2lzZS4KLQkoaWVlZV93cml0ZV9kZWJ1Z19wYXJ0KTogTGlrZXdpc2UuCi0JKGllZWVfd3JpdGVfZGF0YV9wYXJ0KTogTGlrZXdpc2UuCi0JKGluaXRfZm9yX291dHB1dCk6IExpa2V3aXNlLgotCi1XZWQgSmFuICAzIDE5OjQyOjQ3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBNYWtlIEBHT1QgcmVsb2NhdGlvbnMKLQl3b3JrLgotCShwcGNfZWxmX2hvd3RvX3Jhdyk6IEp1c3QgdXNlIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyBmb3IgYWxsIGhvd3RvCi0JcmVsb2NzLCBzaW5jZSBwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gaGFuZGxlcyB0aGUgbGlua2VyIGNhc2UuCi0JKHBwY19lbGZfe2FkZHIxNl9oYSxnb3QxNix0b2MxNixicnRha2VufV9yZWxvYyk6IERlbGV0ZSwgbm8gbG9uZ2VyCi0JdXNlZC4KLQkocHBjX2VsZl97YWRkcjE2X2hhLGdvdDE2LHRvYzE2LGJydGFrZW59X2lubmVyKTogTWVyZ2UgdGhlc2UgaW50bwotCXBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBzaW5jZSB0aGF0IGlzIG5vdyB0aGUgb25seSBjYWxsZXIuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgotCi1XZWQgSmFuICAzIDE1OjExOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiB3ZSBkb24ndCBrbm93IHRoZQotCXNlY3Rpb24gb2YgdGhlIGVudHJ5IHBvaW50IGZvciBhbiBYQ09GRiBleGVjdXRhYmxlLCBhbHdheXMgc2V0IHRoZQotCWVudHJ5IGFkZHJlc3MgdG8gLTEuCi0KLVR1ZSBKYW4gIDIgMTQ6MTc6MTUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogQWRkIHN1cHBvcnQgZm9yIG5vdGUgc2VjdGlvbnMuCi0KLVR1ZSBKYW4gIDIgMTM6MTA6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoc3RydWN0IF9zeW1ib2xfaW5mbyk6IEFkZCBzdGFiX3R5cGUgZmllbGQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKSk6IFNldCBzdGFiX3R5cGUuCi0KLQkqIGVsZjMyLXBwYy5jOiBSZW1vdmUgdHJhaWxpbmcgbmV3bGluZSBmcm9tIGNhbGxzIHRvCi0gICAgICAgIF9iZmRfZXJyb3JfaGFuZGxlci4KLQkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogT25seSB3YXJuIGFib3V0IGVuZGlhbm5lc3MKLQlkaWZmZXJlbmNlIGlmIHRhcmdldCBlbmRpYW5uZXNzIGlzIGtub3duLgotCi1Gb3Igb2xkZXIgY2hhbmdlcyBzZWUgQ2hhbmdlTG9nLTk0OTUKLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JmZC9NYWtlZmlsZS5hbSBiL2JmZC9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiNGNhZS4uMDAwMDAwMAotLS0gYS9iZmQvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTAzICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1JTkNESVIgPSAkKHNyY2RpcikvLi4vaW5jbHVkZQotQ1NFQVJDSCA9IC1JLiAtSSQoc3JjZGlyKSAtSSQoSU5DRElSKQotTUtERVAgPSBta2RlcAotCi1TVUJESVJTID0gZG9jIHBvCi0KLWRvY2RpciA9IGRvYwotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJiZmQubGEKLQotIyBiZmQuaCBnb2VzIGhlcmUsIGZvciBub3cKLUJGRF9IID0gYmZkLmgKLQotIyBKaW0gS2luZ2RvbiBub3RlczoKLSMgV3JpdGluZyBTLXJlY29yZHMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFsbCAob3IgYXQgbGVhc3QgbW9zdCkKLSMgKi0qLWNvZmYsICotKi1hb3V0LCBldGMuLCBjb25maWd1cmF0aW9ucywgYmVjYXVzZSBwZW9wbGUgd2lsbCB3YW50IHRvCi0jIGJlIGFibGUgdG8gdXNlIG9iamNvcHkgdG8gY3JlYXRlIFMtcmVjb3Jkcy4gIChTLXJlY29yZHMgYXJlIG5vdCB1c2VmdWwKLSMgZm9yIHRoZSBkZWJ1Z2dlciwgc28gaWYgeW91IGFyZSBkb3dubG9hZGluZyB0aGluZ3MgYXMgUy1yZWNvcmRzIHlvdQotIyBuZWVkIHR3byBjb3BpZXMgb2YgdGhlIGV4ZWN1dGFibGUsIG9uZSB0byBkb3dubG9hZCBhbmQgb25lIGZvciB0aGUKLSMgZGVidWdnZXIpLgotQkZEX0xJQlMgPSBcCi0JYXJjaGl2ZS5sbyBhcmNodXJlcy5sbyBiZmQubG8gY2FjaGUubG8gY29mZmdlbi5sbyBjb3JlZmlsZS5sbyBcCi0JZm9ybWF0LmxvIGluaXQubG8gbGliYmZkLmxvIG9wbmNscy5sbyByZWxvYy5sbyBcCi0Jc2VjdGlvbi5sbyBzeW1zLmxvIHRhcmdldHMubG8gaGFzaC5sbyBsaW5rZXIubG8gXAotCXNyZWMubG8gYmluYXJ5LmxvIHRla2hleC5sbyBpaGV4LmxvIHN0YWJzLmxvIHN0YWItc3ltcy5sbwotCi1CRkRfTElCU19DRklMRVMgPSBcCi0JYXJjaGl2ZS5jIGFyY2h1cmVzLmMgYmZkLmMgY2FjaGUuYyBjb2ZmZ2VuLmMgY29yZWZpbGUuYyBcCi0JZm9ybWF0LmMgaW5pdC5jIGxpYmJmZC5jIG9wbmNscy5jIHJlbG9jLmMgXAotCXNlY3Rpb24uYyBzeW1zLmMgdGFyZ2V0cy5jIGhhc2guYyBsaW5rZXIuYyBcCi0Jc3JlYy5jIGJpbmFyeS5jIHRla2hleC5jIGloZXguYyBzdGFicy5jIHN0YWItc3ltcy5jCi0KLSMgVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc2llciB0byBrZWVwIGluIHN5bmMKLSMgd2l0aCB0aGUgZGVjbHMgYW5kIGluaXRpYWxpemVyIGluIGFyY2h1cmVzLmMuCi1BTExfTUFDSElORVMgPSBcCi0JY3B1LWEyOWsubG8gXAotCWNwdS1hbHBoYS5sbyBcCi0JY3B1LWFyYy5sbyBcCi0JY3B1LWFybS5sbyBcCi0JY3B1LWQxMHYubG8gXAotCWNwdS1kMzB2LmxvIFwKLQljcHUtZnIzMC5sbyBcCi0JY3B1LWg4MzAwLmxvIFwKLQljcHUtaDg1MDAubG8gXAotCWNwdS1ocHBhLmxvIFwKLQljcHUtaTM4Ni5sbyBcCi0JY3B1LWk4NjAubG8gXAotCWNwdS1pOTYwLmxvIFwKLQljcHUtbTMyci5sbyBcCi0JY3B1LW02OGsubG8gXAotCWNwdS1tODhrLmxvIFwKLQljcHUtbTEwMjAwLmxvIFwKLQljcHUtbTEwMzAwLmxvIFwKLQljcHUtbWNvcmUubG8gXAotCWNwdS1taXBzLmxvIFwKLQljcHUtbnMzMmsubG8gXAotCWNwdS1wai5sbyBcCi0JY3B1LXBvd2VycGMubG8gXAotCWNwdS1yczYwMDAubG8gXAotCWNwdS1zaC5sbyBcCi0JY3B1LXNwYXJjLmxvIFwKLQljcHUtdGljMzAubG8gXAotCWNwdS10aWM4MC5sbyBcCi0JY3B1LXY4NTAubG8gXAotCWNwdS12YXgubG8gXAotCWNwdS13ZTMyay5sbyBcCi0JY3B1LXc2NS5sbyBcCi0JY3B1LXo4ay5sbwotCi1BTExfTUFDSElORVNfQ0ZJTEVTID0gXAotCWNwdS1hMjlrLmMgXAotCWNwdS1hbHBoYS5jIFwKLQljcHUtYXJjLmMgXAotCWNwdS1hcm0uYyBcCi0JY3B1LWQxMHYuYyBcCi0JY3B1LWQzMHYuYyBcCi0JY3B1LWZyMzAuYyBcCi0JY3B1LWg4MzAwLmMgXAotCWNwdS1oODUwMC5jIFwKLQljcHUtaHBwYS5jIFwKLQljcHUtaTM4Ni5jIFwKLQljcHUtaTg2MC5jIFwKLQljcHUtaTk2MC5jIFwKLQljcHUtbTMyci5jIFwKLQljcHUtbTY4ay5jIFwKLQljcHUtbTg4ay5jIFwKLQljcHUtbTEwMjAwLmMgXAotCWNwdS1tMTAzMDAuYyBcCi0JY3B1LW1jb3JlLmMgXAotCWNwdS1taXBzLmMgXAotCWNwdS1uczMyay5jIFwKLQljcHUtcGouYyBcCi0JY3B1LXBvd2VycGMuYyBcCi0JY3B1LXJzNjAwMC5jIFwKLQljcHUtc2guYyBcCi0JY3B1LXNwYXJjLmMgXAotCWNwdS10aWMzMC5jIFwKLQljcHUtdGljODAuYyBcCi0JY3B1LXY4NTAuYyBcCi0JY3B1LXZheC5jIFwKLQljcHUtd2UzMmsuYyBcCi0JY3B1LXc2NS5jIFwKLQljcHUtejhrLmMKLQotIyBUaGUgLm8gZmlsZXMgbmVlZGVkIGJ5IGFsbCBvZiB0aGUgMzIgYml0IHZlY3RvcnMgdGhhdCBhcmUgY29uZmlndXJlZCBpbnRvCi0jIHRhcmdldF92ZWN0b3IgaW4gdGFyZ2V0cy5jIGlmIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS10YXJnZXRzPWFsbC4KLUJGRDMyX0JBQ0tFTkRTID0gXAotCWFvdXQtYWRvYmUubG8gXAotCWFvdXQtYXJtLmxvIFwKLQlhb3V0LW5zMzJrLmxvIFwKLQlhb3V0LXNwYXJjbGUubG8gXAotCWFvdXQtdGljMzAubG8gXAotCWFvdXQwLmxvIFwKLQlhb3V0MzIubG8gXAotCWFybW5ldGJzZC5sbyBcCi0JYm91dC5sbyBcCi0JY2YtaTM4Nmx5bngubG8gXAotCWNmLW02OGtseW54LmxvIFwKLQljZi1zcGFyY2x5bngubG8gXAotCWNvZmYtYTI5ay5sbyBcCi0JY29mZi1hcG9sbG8ubG8gXAotCWNvZmYtYXJtLmxvIFwKLQljb2ZmLWF1eC5sbyBcCi0JY29mZi1oODMwMC5sbyBcCi0JY29mZi1oODUwMC5sbyBcCi0JY29mZi1pMzg2LmxvIFwKLQljb2ZmLWdvMzIubG8gXAotCWNvZmYtaTg2MC5sbyBcCi0JY29mZi1pOTYwLmxvIFwKLQljb2ZmLW02OGsubG8gXAotCWNvZmYtbTg4ay5sbyBcCi0JY29mZi1taXBzLmxvIFwKLQljb2ZmLXBtYWMubG8gXAotCWNvZmYtcnM2MDAwLmxvIFwKLQljb2ZmLXNoLmxvIFwKLQljb2ZmLXNwYXJjLmxvIFwKLQljb2ZmLXN0Z28zMi5sbyBcCi0JY29mZi1zdm02OGsubG8gXAotCWNvZmYtdGljMzAubG8gXAotCWNvZmYtdGljODAubG8gXAotCWNvZmYtdTY4ay5sbyBcCi0JY29mZi13ZTMyay5sbyBcCi0JY29mZi13NjUubG8gXAotCWNvZmYtejhrLmxvIFwKLQljb2ZmbGluay5sbyBcCi0JZHdhcmYxLmxvIFwKLQlkd2FyZjIubG8gXAotCWVjb2ZmLmxvIFwKLQllY29mZmxpbmsubG8gXAotCWVsZi5sbyBcCi0JZWxmMzItYXJjLmxvIFwKLQllbGZhcm0tb2FiaS5sbyBcCi0JZWxmYXJtLW5hYmkubG8gXAotCWVsZjMyLWQxMHYubG8gXAotCWVsZjMyLWQzMHYubG8gXAotCWVsZjMyLWZyMzAubG8gXAotCWVsZjMyLWdlbi5sbyBcCi0JZWxmMzItaHBwYS5sbyBcCi0JZWxmMzItaTM4Ni5sbyBcCi0JZWxmMzItaTg2MC5sbyBcCi0JZWxmMzItaTk2MC5sbyBcCi0JZWxmMzItbTMyci5sbyBcCi0JZWxmMzItbTY4ay5sbyBcCi0JZWxmMzItbTg4ay5sbyBcCi0JZWxmLW0xMDIwMC5sbyBcCi0JZWxmLW0xMDMwMC5sbyBcCi0JZWxmMzItbWNvcmUubG8gXAotCWVsZjMyLW1pcHMubG8gXAotCWVsZjMyLXBqLmxvIFwKLQllbGYzMi1wcGMubG8gXAotCWVsZjMyLXNoLmxvIFwKLQllbGYzMi1zcGFyYy5sbyBcCi0JZWxmMzItdjg1MC5sbyBcCi0JZWxmMzIubG8gXAotCWVsZmxpbmsubG8gXAotCWVwb2MtcGUtYXJtLmxvIFwKLQllcG9jLXBlaS1hcm0ubG8gXAotCWhwMzAwYnNkLmxvIFwKLQlocDMwMGhwdXgubG8gXAotCXNvbS5sbyBcCi0JaTM4NmFvdXQubG8gXAotCWkzODZic2QubG8gXAotCWkzODZkeW5peC5sbyBcCi0JaTM4NmZyZWVic2QubG8gXAotCWkzODZsaW51eC5sbyBcCi0JaTM4Nmx5bngubG8gXAotCWkzODZtc2Rvcy5sbyBcCi0JaTM4Nm5ldGJzZC5sbyBcCi0JaTM4Nm1hY2gzLmxvIFwKLQlpMzg2b3M5ay5sbyBcCi0JaWVlZS5sbyBcCi0JbTY4azRrbmV0YnNkLmxvIFwKLQltNjhrbGludXgubG8gXAotCW02OGtseW54LmxvIFwKLQltNjhrbmV0YnNkLmxvIFwKLQltODhrbWFjaDMubG8gXAotCW1pcHNic2QubG8gXAotCW5ld3NvczMubG8gXAotCW5sbS5sbyBcCi0JbmxtMzItaTM4Ni5sbyBcCi0JbmxtMzItc3BhcmMubG8gXAotCW5sbTMyLXBwYy5sbyBcCi0JbmxtMzIubG8gXAotCW5zMzJrbmV0YnNkLmxvIFwKLQlvYXN5cy5sbyBcCi0JcGM1MzItbWFjaC5sbyBcCi0JcGUtYXJtLmxvIFwKLQlwZWktYXJtLmxvIFwKLQlwZS1pMzg2LmxvIFwKLQlwZWktaTM4Ni5sbyBcCi0JcGUtbWNvcmUubG8gXAotCXBlaS1tY29yZS5sbyBcCi0JcGUtcHBjLmxvIFwKLQlwZWktcHBjLmxvIFwKLQlwZWlnZW4ubG8gXAotCXBwY2Jvb3QubG8gXAotCXJlbG9jMTYubG8gXAotCXJpc2NpeC5sbyBcCi0Jc3BhcmNsaW51eC5sbyBcCi0Jc3BhcmNseW54LmxvIFwKLQlzcGFyY25ldGJzZC5sbyBcCi0Jc3Vub3MubG8gXAotCXZheG5ldGJzZC5sbyBcCi0JdmVyc2Fkb3MubG8gXAotCXZtcy5sbyBcCi0Jdm1zLWdzZC5sbyBcCi0Jdm1zLWhkci5sbyBcCi0Jdm1zLW1pc2MubG8gXAotCXZtcy10aXIubG8gXAotCXhjb2ZmbGluay5sbwotCi1CRkQzMl9CQUNLRU5EU19DRklMRVMgPSBcCi0JYW91dC1hZG9iZS5jIFwKLQlhb3V0LWFybS5jIFwKLQlhb3V0LW5zMzJrLmMgXAotCWFvdXQtc3BhcmNsZS5jIFwKLQlhb3V0LXRpYzMwLmMgXAotCWFvdXQwLmMgXAotCWFvdXQzMi5jIFwKLQlhcm1uZXRic2QuYyBcCi0JYm91dC5jIFwKLQljZi1pMzg2bHlueC5jIFwKLQljZi1tNjhrbHlueC5jIFwKLQljZi1zcGFyY2x5bnguYyBcCi0JY29mZi1hMjlrLmMgXAotCWNvZmYtYXBvbGxvLmMgXAotCWNvZmYtYXJtLmMgXAotCWNvZmYtYXV4LmMgXAotCWNvZmYtaDgzMDAuYyBcCi0JY29mZi1oODUwMC5jIFwKLQljb2ZmLWkzODYuYyBcCi0JY29mZi1pODYwLmMgXAotCWNvZmYtZ28zMi5jIFwKLQljb2ZmLWk5NjAuYyBcCi0JY29mZi1tNjhrLmMgXAotCWNvZmYtbTg4ay5jIFwKLQljb2ZmLW1pcHMuYyBcCi0JY29mZi1wbWFjLmMgXAotCWNvZmYtcnM2MDAwLmMgXAotCWNvZmYtc2guYyBcCi0JY29mZi1zcGFyYy5jIFwKLQljb2ZmLXN0Z28zMi5jIFwKLQljb2ZmLXN2bTY4ay5jIFwKLQljb2ZmLXRpYzMwLmMgXAotCWNvZmYtdGljODAuYyBcCi0JY29mZi11NjhrLmMgXAotCWNvZmYtd2UzMmsuYyBcCi0JY29mZi13NjUuYyBcCi0JY29mZi16OGsuYyBcCi0JY29mZmxpbmsuYyBcCi0JZHdhcmYxLmMgXAotCWR3YXJmMi5jIFwKLQllY29mZi5jIFwKLQllY29mZmxpbmsuYyBcCi0JZWxmLmMgXAotCWVsZjMyLWFyYy5jIFwKLQllbGZhcm0tb2FiaS5jIFwKLQllbGZhcm0tbmFiaS5jIFwKLQllbGYzMi1kMTB2LmMgXAotCWVsZjMyLWQzMHYuYyBcCi0JZWxmMzItZnIzMC5jIFwKLQllbGYzMi1nZW4uYyBcCi0JZWxmMzItaHBwYS5jIFwKLQllbGYzMi1pMzg2LmMgXAotCWVsZjMyLWk4NjAuYyBcCi0JZWxmMzItaTk2MC5jIFwKLQllbGYzMi1tMzJyLmMgXAotCWVsZjMyLW02OGsuYyBcCi0JZWxmMzItbTg4ay5jIFwKLQllbGYtbTEwMjAwLmMgXAotCWVsZi1tMTAzMDAuYyBcCi0JZWxmMzItbWNvcmUuYyBcCi0JZWxmMzItbWlwcy5jIFwKLQllbGYzMi1wai5jIFwKLQllbGYzMi1wcGMuYyBcCi0JZWxmMzItc2guYyBcCi0JZWxmMzItc3BhcmMuYyBcCi0JZWxmMzItdjg1MC5jIFwKLQllbGYzMi5jIFwKLQllbGZsaW5rLmMgXAotCWVwb2MtcGUtYXJtLmMgXAotCWVwb2MtcGVpLWFybS5jIFwKLQlocDMwMGJzZC5jIFwKLQlocDMwMGhwdXguYyBcCi0Jc29tLmMgXAotCWkzODZhb3V0LmMgXAotCWkzODZic2QuYyBcCi0JaTM4NmR5bml4LmMgXAotCWkzODZmcmVlYnNkLmMgXAotCWkzODZsaW51eC5jIFwKLQlpMzg2bHlueC5jIFwKLQlpMzg2bXNkb3MuYyBcCi0JaTM4Nm5ldGJzZC5jIFwKLQlpMzg2bWFjaDMuYyBcCi0JaTM4Nm9zOWsuYyBcCi0JaWVlZS5jIFwKLQltNjhrNGtuZXRic2QuYyBcCi0JbTY4a2xpbnV4LmMgXAotCW02OGtseW54LmMgXAotCW02OGtuZXRic2QuYyBcCi0JbTg4a21hY2gzLmMgXAotCW1pcHNic2QuYyBcCi0JbmV3c29zMy5jIFwKLQlubG0uYyBcCi0JbmxtMzItaTM4Ni5jIFwKLQlubG0zMi1zcGFyYy5jIFwKLQlubG0zMi1wcGMuYyBcCi0JbmxtMzIuYyBcCi0JbnMzMmtuZXRic2QuYyBcCi0Jb2FzeXMuYyBcCi0JcGM1MzItbWFjaC5jIFwKLQlwZS1hcm0uYyBcCi0JcGVpLWFybS5jIFwKLQlwZS1pMzg2LmMgXAotCXBlaS1pMzg2LmMgXAotCXBlLW1jb3JlLmMgXAotCXBlaS1tY29yZS5jIFwKLQlwZS1wcGMuYyBcCi0JcGVpLXBwYy5jIFwKLQlwZWlnZW4uYyBcCi0JcHBjYm9vdC5jIFwKLQlyZWxvYzE2LmMgXAotCXJpc2NpeC5jIFwKLQlzcGFyY2xpbnV4LmMgXAotCXNwYXJjbHlueC5jIFwKLQlzcGFyY25ldGJzZC5jIFwKLQlzdW5vcy5jIFwKLQl2YXhuZXRic2QuYyBcCi0JdmVyc2Fkb3MuYyBcCi0Jdm1zLmMgXAotCXZtcy1nc2QuYyBcCi0Jdm1zLWhkci5jIFwKLQl2bXMtbWlzYy5jIFwKLQl2bXMtdGlyLmMgXAotCXhjb2ZmbGluay5jCi0KLSMgVGhlIC5vIGZpbGVzIG5lZWRlZCBieSBhbGwgb2YgdGhlIDY0IGJpdCB2ZWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW50bwotIyB0YXJnZXRfdmVjdG9yIGluIHRhcmdldHMuYyBpZiBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtdGFyZ2V0cz1hbGwKLSMgYW5kIC0tZW5hYmxlLTY0LWJpdC1iZmQuCi1CRkQ2NF9CQUNLRU5EUyA9IFwKLQlhb3V0NjQubG8gXAotCWNvZmYtYWxwaGEubG8gXAotCWRlbW82NC5sbyBcCi0JZWxmNjQtYWxwaGEubG8gXAotCWVsZjY0LWdlbi5sbyBcCi0JZWxmNjQtbWlwcy5sbyBcCi0JZWxmNjQtc3BhcmMubG8gXAotCWVsZjY0LmxvIFwKLQlubG0zMi1hbHBoYS5sbyBcCi0JbmxtNjQubG8KLQotQkZENjRfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFvdXQ2NC5jIFwKLQljb2ZmLWFscGhhLmMgXAotCWRlbW82NC5jIFwKLQllbGY2NC1hbHBoYS5jIFwKLQllbGY2NC1nZW4uYyBcCi0JZWxmNjQtbWlwcy5jIFwKLQllbGY2NC1zcGFyYy5jIFwKLQllbGY2NC5jIFwKLQlubG0zMi1hbHBoYS5jIFwKLQlubG02NC5jCi0KLU9QVElPTkFMX0JBQ0tFTkRTID0gXAotCWFpeDM4Ni1jb3JlLmxvIFwKLQlocHV4LWNvcmUubG8gXAotCWlyaXgtY29yZS5sbyBcCi0JbHlueC1jb3JlLmxvIFwKLQlvc2YtY29yZS5sbyBcCi0Jc2NvNS1jb3JlLmxvIFwKLQl0cmFkLWNvcmUubG8gXAotCWNpc2NvLWNvcmUubG8KLQotT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFpeDM4Ni1jb3JlLmMgXAotCWhwdXgtY29yZS5jIFwKLQlpcml4LWNvcmUuYyBcCi0JbHlueC1jb3JlLmMgXAotCW9zZi1jb3JlLmMgXAotCXNjbzUtY29yZS5jIFwKLQl0cmFkLWNvcmUuYyBcCi0JY2lzY28tY29yZS5jCi0KLSMgVGhlc2UgYXJlIGRlZmluZWQgYnkgY29uZmlndXJlLmluOgotV09SRFNJWkUgPSBAd29yZHNpemVACi1BTExfQkFDS0VORFMgPSBAYWxsX2JhY2tlbmRzQAotQkZEX0JBQ0tFTkRTID0gQGJmZF9iYWNrZW5kc0AKLUJGRF9NQUNISU5FUyA9IEBiZmRfbWFjaGluZXNACi1UREVGQVVMVFMgPSBAdGRlZmF1bHRzQAotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgQEhERUZJTkVTQCBAQ09SRUZMQUdAIEBUREVGSU5FU0AgJChDU0VBUkNIKSAkKENTV0lUQ0hFUykgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwKLQotIyBDIHNvdXJjZSBmaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gLm8ncy4KLUNGSUxFUyA9IFwKLQkkKEJGRF9MSUJTX0NGSUxFUykgXAotCSQoQUxMX01BQ0hJTkVTX0NGSUxFUykgXAotCSQoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKSBcCi0JJChCRkQ2NF9CQUNLRU5EU19DRklMRVMpIFwKLQkkKE9QVElPTkFMX0JBQ0tFTkRTX0NGSUxFUykKLQotIyMgVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIC5oIGZpbGVzIHdoaWNoIGFyZSBpbiB0aGUgc291cmNlIHRyZWUuCi1TT1VSQ0VfSEZJTEVTID0gXAotCWFvdXQtdGFyZ2V0LmggYW91dGYxLmggYW91dHguaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmggXAotCWVjb2Zmc3dhcC5oIGVsZjMyLWFybS5oIGVsZjMyLWhwcGEuaCBlbGZjb2RlLmggZWxmY29yZS5oIFwKLQllbGZsaW5rLmggZnJlZWJzZC5oIGdlbmxpbmsuaCBnbzMyc3R1Yi5oIGhwcGFfc3R1YnMuaCBsaWJhb3V0LmggXAotCWxpYmJmZC5oIGxpYmNvZmYuaCBsaWJlY29mZi5oIGVsZi1iZmQuaCBsaWJocHBhLmggbGliaWVlZS5oIFwKLQlsaWJubG0uaCBsaWJvYXN5cy5oIGxpYnBlaS5oIG5ldGJzZC5oIG5sbS10YXJnZXQuaCBubG1jb2RlLmggXAotCW5sbXN3YXAuaCBuczMyay5oIHBlaWNvZGUuaCBzb20uaCB2bXMuaAotCi1IRklMRVMgPSBcCi0JZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0LmggdGFyZ21hdGNoLmggXAotCSQoU09VUkNFX0hGSUxFUykKLQotUE9URklMRVMgPSAkKENGSUxFUykgJChTT1VSQ0VfSEZJTEVTKQotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1kaXN0c3R1ZmY6IGluZm8KLQotIyBWYXJpb3VzIGtpbmRzIG9mIC5vIGZpbGVzIHRvIHB1dCBpbiBsaWJiZmQuYToKLSMgQkZEX0JBQ0tFTkRTCVJvdXRpbmVzIHRoZSBjb25maWd1cmVkIHRhcmdldHMgbmVlZC4KLSMgQkZEX01BQ0hJTkVTCUFyY2hpdGVjdHVyZS1zcGVjaWZpYyByb3V0aW5lcyB0aGUgY29uZmlndXJlZCB0YXJnZXRzIG5lZWQuCi0jIENPUkVGSUxFCUNvcmUgZmlsZSByb3V0aW5lcyBmb3IgYSBuYXRpdmUgY29uZmlndXJhdGlvbgotT0ZJTEVTID0gJChCRkRfQkFDS0VORFMpICQoQkZEX01BQ0hJTkVTKSBAQ09SRUZJTEVACi0KLXN0YW1wLW9maWxlczogTWFrZWZpbGUKLQlybSAtZiB0b2ZpbGVzCi0JZj0iIjsgXAotCWZvciBpIGluICQoT0ZJTEVTKSA7IGRvIFwKLQkgIGNhc2UgIiAkJGYgIiBpbiBcCi0JICAgICoiICQkaSAiKikgOzsgXAotCSAgICAqKSBmPSIkJGYgJCRpIiA7OyBcCi0JICBlc2FjIDsgXAotCWRvbmUgOyBcCi0JZWNobyAkJGYgPiB0b2ZpbGVzCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRvZmlsZXMgb2ZpbGVzCi0JdG91Y2ggc3RhbXAtb2ZpbGVzCi0KLW9maWxlczogc3RhbXAtb2ZpbGVzIDsgQHRydWUKLQotbGliYmZkX2xhX1NPVVJDRVMgPSAkKEJGRF9MSUJTX0NGSUxFUykKLWxpYmJmZF9sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykgb2ZpbGVzCi1saWJiZmRfbGFfTElCQUREID0gYGNhdCBvZmlsZXNgIEBXSU4zMkxJQkFEREAKLWxpYmJmZF9sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSBAV0lOMzJMREZMQUdTQAotCi0jIGxpYnRvb2wgd2lsbCBidWlsZCAubGlicy9saWJiZmQuYS4gIFdlIGNyZWF0ZSBsaWJiZmQuYSBpbiB0aGUgYnVpbGQKLSMgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUgcHJvZ3JhbXMgdGhhdCB1c2UKLSMgbGliYmZkLmEgc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGEgaGFjayB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZCBpZgotIyBldmVyeXRoaW5nIGVsc2Ugc3RhcnRzIHVzaW5nIGxpYnRvb2wuICBGSVhNRS4KLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYmJmZC5hCi1saWJiZmRfYV9TT1VSQ0VTID0KLQotc3RhbXAtbGliOiBsaWJiZmQubGEKLQlpZiBbIC1mIC5saWJzL2xpYmJmZC5hIF07IHRoZW4gXAotCSAgY3AgLmxpYnMvbGliYmZkLmEgbGliYmZkLnRtcDsgXAotCSAgJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC50bXAgbGliYmZkLmE7IFwKLQllbHNlIHRydWU7IGZpCi0JdG91Y2ggc3RhbXAtbGliCi0KLWxpYmJmZC5hOiBzdGFtcC1saWIgOyBAdHJ1ZQotCi0jIFRoaXMgZmlsZSBob2xkcyBhbiBhcnJheSBhc3NvY2lhdGluZyBjb25maWd1cmF0aW9uIHRyaXBsZXRzIGFuZAotIyB2ZWN0b3IgbmFtZXMuICBJdCBpcyBidWlsdCBmcm9tIGNvbmZpZy5iZmQuICBJdCBpcyBub3QgY29tcGlsZWQgYnkKLSMgaXRzZWxmLCBidXQgaXMgaW5jbHVkZWQgYnkgdGFyZ2V0cy5jLgotdGFyZ21hdGNoLmg6IGNvbmZpZy5iZmQgdGFyZ21hdGNoLnNlZAotCXJtIC1mIHRhcmdtYXRjaC5oCi0Jc2VkIC1mICQoc3JjZGlyKS90YXJnbWF0Y2guc2VkIDwgJChzcmNkaXIpL2NvbmZpZy5iZmQgPiB0YXJnbWF0Y2gubmV3Ci0JbXYgLWYgdGFyZ21hdGNoLm5ldyB0YXJnbWF0Y2guaAotCi0jIFdoZW4gY29tcGlsaW5nIGFyY2h1cmVzLmMgYW5kIHRhcmdldHMuYywgc3VwcGx5IHRoZSBkZWZhdWx0IHRhcmdldAotIyBpbmZvIGZyb20gY29uZmlndXJlLgotCi10YXJnZXRzLmxvOiB0YXJnZXRzLmMgY29uZmlnLnN0YXR1cwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkKFRERUZBVUxUUykgJChzcmNkaXIpL3RhcmdldHMuYwotCi1hcmNodXJlcy5sbzogYXJjaHVyZXMuYyBjb25maWcuc3RhdHVzCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQoVERFRkFVTFRTKSAkKHNyY2RpcikvYXJjaHVyZXMuYwotCi1lbGYzMi10YXJnZXQuaCA6IGVsZnh4LXRhcmdldC5oCi0Jcm0gLWYgZWxmMzItdGFyZ2V0LmgKLQlzZWQgLWUgcy9OTi8zMi9nIDwgJChzcmNkaXIpL2VsZnh4LXRhcmdldC5oID4gZWxmMzItdGFyZ2V0Lm5ldwotCW12IC1mIGVsZjMyLXRhcmdldC5uZXcgZWxmMzItdGFyZ2V0LmgKLQotZWxmNjQtdGFyZ2V0LmggOiBlbGZ4eC10YXJnZXQuaAotCXJtIC1mIGVsZjY0LXRhcmdldC5oCi0Jc2VkIC1lIHMvTk4vNjQvZyA8ICQoc3JjZGlyKS9lbGZ4eC10YXJnZXQuaCA+IGVsZjY0LXRhcmdldC5uZXcKLQltdiAtZiBlbGY2NC10YXJnZXQubmV3IGVsZjY0LXRhcmdldC5oCi0KLUJGRF9IX0RFUFM9ICQoSU5DRElSKS9hbnNpZGVjbC5oCi1MT0NBTF9IX0RFUFM9IGxpYmJmZC5oIHN5c2RlcC5oIGNvbmZpZy5oCi0kKEJGRF9MSUJTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoQkZEX01BQ0hJTkVTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoQkZEX0JBQ0tFTkRTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLSQoT1BUSU9OQUxfQkFDS0VORFMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotCi0jIEluc3RhbGwgQkZEIGluY2x1ZGUgZmlsZSwgYW5kIG90aGVycyB0aGF0IGl0IG5lZWRzLgotaW5zdGFsbC1kYXRhLWxvY2FsOiAkKEJGRF9IKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChpbmNsdWRlZGlyKQotCSQoSU5TVEFMTF9EQVRBKSAkKEJGRF9IKSAkKGluY2x1ZGVkaXIpL2JmZC5oCi0JJChJTlNUQUxMX0RBVEEpICQoSU5DRElSKS9hbnNpZGVjbC5oICQoaW5jbHVkZWRpcikvYW5zaWRlY2wuaAotCSQoSU5TVEFMTF9EQVRBKSAkKElOQ0RJUikvYmZkbGluay5oICQoaW5jbHVkZWRpcikvYmZkbGluay5oCi0KLSMgSGF2ZSB0byBnZXQgcmlkIG9mIERFUDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLURFUDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpIGJmZC5oCi0Jcm0gLWYgREVQMQotCSQoTUFLRSkgTUtERVA9JChNS0RFUCkgREVQMQotCXNlZCAtZiBkZXAuc2VkIDxERVAxID5ERVAKLQotIyBUaGlzIHJ1bGUgcmVhbGx5IHdhbnRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLSMgVGhlIE5ldEJTRCBta2RlcCBvdmVyd3JpdGVzIGFueSBleGlzdGluZyBmaWxlIGNvbnRlbnRzLCBhbmQgZG9lc24ndCBpbnNlcnQKLSMgdGhlICJETyBOT1QgREVMRVRFIiBsaW5lLgotIyBPdGhlciBta2RlcCB2ZXJzaW9ucyByZXF1aXJlIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzLCBhbmQgZG8gaW5zZXJ0IGl0LgotIyBIZW5jZSB0aGUgd2VpcmRuZXNzLi4uLgotREVQMTogJChDRklMRVMpCi0Jcm0gLWYgREVQMiBERVAyYQotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQMgotCWVjaG8gPiBERVAyYQotCSQoTUtERVApIC1mIERFUDJhICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPwotCXNlZCAtZSAnL0RPIE5PVCBERUxFVEUvZCcgLWUgJy9eJCQvZCcgPCBERVAyYSA+PiBERVAyCi0Jcm0gLWYgREVQMmEKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgREVQMiBERVAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFAQkZEX0hAISQoQkZEX0gpIScJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCi0KLWRlcDogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi1ob3N0LWFvdXQubG86IE1ha2VmaWxlCi0KLSMgVGhlIGZvbGxvd2luZyBwcm9ncmFtIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgc2ltcGxlIGNvbmZpZyBmaWxlCi0jIHdoaWNoIGNhbiBiZSBmb2xkZWQgaW50byBhbiBoLVhYWCBmaWxlIGZvciBhIG5ldyBob3N0LCB3aXRoIHNvbWUgZWRpdGluZy4KLWFvdXQtcGFyYW1zLmg6IGdlbi1hb3V0Ci0JLi9nZW4tYW91dCBob3N0ID4gYW91dC1wYXJhbXMuaAotZ2VuLWFvdXQ6ICQoc3JjZGlyKS9nZW4tYW91dC5jIE1ha2VmaWxlCi0JJChDQykgLW8gZ2VuLWFvdXQgJChDRkxBR1MpICQoTEZMQUdTKSAkKHNyY2RpcikvZ2VuLWFvdXQuYwotCi0kKEJGRF9IKTogc3RtcC1iZmQtaCA7IEB0cnVlCi0KLXN0bXAtYmZkLWg6IGJmZC1pbjMuaAotCXJtIC1mIGJmZC10bXAuaAotCWNwIGJmZC1pbjMuaCBiZmQtdG1wLmgKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLXRtcC5oICQoQkZEX0gpCi0Jcm0gLWYgYmZkLXRtcC5oCi0JdG91Y2ggc3RtcC1iZmQtaAotCi1CRkRfSF9GSUxFUyA9IGJmZC1pbi5oIGluaXQuYyBvcG5jbHMuYyBsaWJiZmQuYyBzZWN0aW9uLmMgYXJjaHVyZXMuYyBcCi0JcmVsb2MuYyBzeW1zLmMgYmZkLmMgYXJjaGl2ZS5jIGNvcmVmaWxlLmMgdGFyZ2V0cy5jIGZvcm1hdC5jCi1MSUJCRkRfSF9GSUxFUyA9IGxpYmJmZC1pbi5oIGluaXQuYyBsaWJiZmQuYyBjYWNoZS5jIHJlbG9jLmMgYXJjaHVyZXMuYyBlbGYuYwotTElCQ09GRl9IX0ZJTEVTID0gbGliY29mZi1pbi5oIGNvZmZjb2RlLmgKLQotIyBDb3VsZCByZWFsbHkgdXNlIGEgImNvcHktaWYtY2hhbmdlIi4uLgotaGVhZGVyczoKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpIHByb3RvcyAkKEZMQUdTX1RPX1BBU1MpKQotCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC1pbjIuaC1uZXcgJChzcmNkaXIpL2JmZC1pbjIuaAotCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAotCWNwICQoZG9jZGlyKS9saWJjb2ZmLmggbGliY29mZi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJjb2ZmLmgtbmV3ICQoc3JjZGlyKS9saWJjb2ZmLmgKLQotIyBXZSBvbmx5IHJlYnVpbGQgdGhlIGhlYWRlciBmaWxlcyBhdXRvbWF0aWNhbGx5IGlmIHdlIGhhdmUgYmVlbgotIyBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlLgotCi0kKHNyY2RpcikvYmZkLWluMi5oOiBATUFJTlRAIHN0bXAtYmluMi1oIDsgQHRydWUKLXN0bXAtYmluMi1oOiAkKEJGRF9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBiZmQuaCkKLQljcCAkKGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKLQl0b3VjaCBzdG1wLWJpbjItaAotCi0kKHNyY2RpcikvbGliYmZkLmg6IEBNQUlOVEAgc3RtcC1sYmZkLWggOyBAdHJ1ZQotc3RtcC1sYmZkLWg6ICQoTElCQkZEX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmJmZC5oKQotCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAotCXRvdWNoIHN0bXAtbGJmZC1oCi0KLSQoc3JjZGlyKS9saWJjb2ZmLmg6IEBNQUlOVEAgc3RtcC1sY29mZi1oIDsgQHRydWUKLXN0bXAtbGNvZmYtaDogJChMSUJDT0ZGX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmNvZmYuaCkKLQljcCAkKGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliY29mZi5oLW5ldyAkKHNyY2RpcikvbGliY29mZi5oCi0JdG91Y2ggc3RtcC1sY29mZi1oCi0KLU1PU1RMWUNMRUFORklMRVMgPSBlbGYzMi10YXJnZXQuaCBlbGY2NC10YXJnZXQuaCBvZmlsZXMgc3RhbXAtb2ZpbGVzIFwKLQl0YXJnbWF0Y2guaAotCi1DTEVBTkZJTEVTID0gYmZkLmggZGVwLnNlZCBzdG1wLWJmZC1oIERFUCBERVAxIGxpYmJmZC5hIHN0YW1wLWxpYiBcCi0Jc3RtcC1iaW4yLWggc3RtcC1sYmZkLWggc3RtcC1sY29mZi1oCi0KLSMgV2Ugd2FudCB0byByZXJ1biBjb25maWd1cmUgaWYgY29uZmlnLmJmZCBvciBjb25maWd1cmUuaG9zdCBjaGFuZ2UuCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWcuYmZkICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdAotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotCi1lbGZhcm0tb2FiaS5sbzogZWxmYXJtLW9hYmkuYyBlbGYzMi1hcm0uaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLWVsZmFybS1uYWJpLmxvOiBlbGZhcm0tbmFiaS5jIGVsZjMyLWFybS5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi1hcmNoaXZlLmxvOiBhcmNoaXZlLmMgJChJTkNESVIpL2FvdXQvYXIuaCAkKElOQ0RJUikvYW91dC9yYW5saWIuaAotYXJjaHVyZXMubG86IGFyY2h1cmVzLmMKLWJmZC5sbzogYmZkLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIGxpYmNvZmYuaCBcCi0gIGxpYmVjb2ZmLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWNhY2hlLmxvOiBjYWNoZS5jCi1jb2ZmZ2VuLmxvOiBjb2ZmZ2VuLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1jb3JlZmlsZS5sbzogY29yZWZpbGUuYwotZm9ybWF0LmxvOiBmb3JtYXQuYwotaW5pdC5sbzogaW5pdC5jCi1saWJiZmQubG86IGxpYmJmZC5jCi1vcG5jbHMubG86IG9wbmNscy5jICQoSU5DRElSKS9vYmphbGxvYy5oCi1yZWxvYy5sbzogcmVsb2MuYyAkKElOQ0RJUikvYmZkbGluay5oCi1zZWN0aW9uLmxvOiBzZWN0aW9uLmMgJChJTkNESVIpL2JmZGxpbmsuaAotc3ltcy5sbzogc3ltcy5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi10YXJnZXRzLmxvOiB0YXJnZXRzLmMgJChJTkNESVIpL2ZubWF0Y2guaCB0YXJnbWF0Y2guaAotaGFzaC5sbzogaGFzaC5jICQoSU5DRElSKS9vYmphbGxvYy5oCi1saW5rZXIubG86IGxpbmtlci5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oCi1zcmVjLmxvOiBzcmVjLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1iaW5hcnkubG86IGJpbmFyeS5jCi10ZWtoZXgubG86IHRla2hleC5jICQoSU5DRElSKS9saWJpYmVydHkuaAotaWhleC5sbzogaWhleC5jICQoSU5DRElSKS9saWJpYmVydHkuaAotc3RhYnMubG86IHN0YWJzLmMgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3RhYi1zeW1zLmxvOiBzdGFiLXN5bXMuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1jcHUtYTI5ay5sbzogY3B1LWEyOWsuYwotY3B1LWFscGhhLmxvOiBjcHUtYWxwaGEuYwotY3B1LWFyYy5sbzogY3B1LWFyYy5jCi1jcHUtYXJtLmxvOiBjcHUtYXJtLmMKLWNwdS1kMTB2LmxvOiBjcHUtZDEwdi5jCi1jcHUtZDMwdi5sbzogY3B1LWQzMHYuYwotY3B1LWZyMzAubG86IGNwdS1mcjMwLmMKLWNwdS1oODMwMC5sbzogY3B1LWg4MzAwLmMKLWNwdS1oODUwMC5sbzogY3B1LWg4NTAwLmMKLWNwdS1ocHBhLmxvOiBjcHUtaHBwYS5jCi1jcHUtaTM4Ni5sbzogY3B1LWkzODYuYwotY3B1LWk4NjAubG86IGNwdS1pODYwLmMKLWNwdS1pOTYwLmxvOiBjcHUtaTk2MC5jCi1jcHUtbTMyci5sbzogY3B1LW0zMnIuYwotY3B1LW02OGsubG86IGNwdS1tNjhrLmMKLWNwdS1tODhrLmxvOiBjcHUtbTg4ay5jCi1jcHUtbTEwMjAwLmxvOiBjcHUtbTEwMjAwLmMKLWNwdS1tMTAzMDAubG86IGNwdS1tMTAzMDAuYwotY3B1LW1jb3JlLmxvOiBjcHUtbWNvcmUuYwotY3B1LW1pcHMubG86IGNwdS1taXBzLmMKLWNwdS1uczMyay5sbzogY3B1LW5zMzJrLmMgbnMzMmsuaAotY3B1LXBqLmxvOiBjcHUtcGouYwotY3B1LXBvd2VycGMubG86IGNwdS1wb3dlcnBjLmMKLWNwdS1yczYwMDAubG86IGNwdS1yczYwMDAuYwotY3B1LXNoLmxvOiBjcHUtc2guYwotY3B1LXNwYXJjLmxvOiBjcHUtc3BhcmMuYwotY3B1LXRpYzMwLmxvOiBjcHUtdGljMzAuYwotY3B1LXRpYzgwLmxvOiBjcHUtdGljODAuYwotY3B1LXY4NTAubG86IGNwdS12ODUwLmMKLWNwdS12YXgubG86IGNwdS12YXguYwotY3B1LXdlMzJrLmxvOiBjcHUtd2UzMmsuYwotY3B1LXc2NS5sbzogY3B1LXc2NS5jCi1jcHUtejhrLmxvOiBjcHUtejhrLmMKLWFvdXQtYWRvYmUubG86IGFvdXQtYWRvYmUuYyAkKElOQ0RJUikvYW91dC9hZG9iZS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1hb3V0LWFybS5sbzogYW91dC1hcm0uYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXR4LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotYW91dC1uczMyay5sbzogYW91dC1uczMyay5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgbnMzMmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotYW91dC1zcGFyY2xlLmxvOiBhb3V0LXNwYXJjbGUuYyAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGliYW91dC5oIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLWFvdXQtdGljMzAubG86IGFvdXQtdGljMzAuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oIGFvdXR4LmgKLWFvdXQwLmxvOiBhb3V0MC5jIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLWFvdXQzMi5sbzogYW91dDMyLmMgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1hcm1uZXRic2QubG86IGFybW5ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotYm91dC5sbzogYm91dC5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oICQoSU5DRElSKS9ib3V0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIGxpYmFvdXQuaAotY2YtaTM4Nmx5bngubG86IGNmLWkzODZseW54LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY2YtbTY4a2x5bngubG86IGNmLW02OGtseW54LmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY2Ytc3BhcmNseW54LmxvOiBjZi1zcGFyY2x5bnguYyBjb2ZmLXNwYXJjLmMgJChJTkNESVIpL2NvZmYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYTI5ay5sbzogY29mZi1hMjlrLmMgJChJTkNESVIpL2NvZmYvYTI5ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXBvbGxvLmxvOiBjb2ZmLWFwb2xsby5jICQoSU5DRElSKS9jb2ZmL2Fwb2xsby5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hcm0ubG86IGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hdXgubG86IGNvZmYtYXV4LmMgJChJTkNESVIpL2NvZmYvYXV4LWNvZmYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvbTY4ay5oIGNvZmYtbTY4ay5jIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWg4MzAwLmxvOiBjb2ZmLWg4MzAwLmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggXAotICAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWg4NTAwLmxvOiBjb2ZmLWg4NTAwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWkzODYubG86IGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWk4NjAubG86IGNvZmYtaTg2MC5jICQoSU5DRElSKS9jb2ZmL2k4NjAuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWdvMzIubG86IGNvZmYtZ28zMi5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTk2MC5sbzogY29mZi1pOTYwLmMgJChJTkNESVIpL2NvZmYvaTk2MC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbTY4ay5sbzogY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbTg4ay5sbzogY29mZi1tODhrLmMgJChJTkNESVIpL2NvZmYvbTg4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbWlwcy5sbzogY29mZi1taXBzLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvbWlwcy5oIGxpYmNvZmYuaCBsaWJlY29mZi5oIGNvZmZzd2FwLmggXAotICBlY29mZnN3YXAuaAotY29mZi1wbWFjLmxvOiBjb2ZmLXBtYWMuYyBjb2ZmLXJzNjAwMC5jICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9yczYwMDAuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1yczYwMDAubG86IGNvZmYtcnM2MDAwLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXNoLmxvOiBjb2ZmLXNoLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXNwYXJjLmxvOiBjb2ZmLXNwYXJjLmMgJChJTkNESVIpL2NvZmYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc3RnbzMyLmxvOiBjb2ZmLXN0Z28zMi5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvZ28zMmV4ZS5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oIFwKLSAgZ28zMnN0dWIuaAotY29mZi1zdm02OGsubG86IGNvZmYtc3ZtNjhrLmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi10aWMzMC5sbzogY29mZi10aWMzMC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi10aWM4MC5sbzogY29mZi10aWM4MC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvdGljODAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi11NjhrLmxvOiBjb2ZmLXU2OGsuYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXdlMzJrLmxvOiBjb2ZmLXdlMzJrLmMgJChJTkNESVIpL2NvZmYvd2UzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdzY1LmxvOiBjb2ZmLXc2NS5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvdzY1LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtejhrLmxvOiBjb2ZmLXo4ay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvejhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmZsaW5rLmxvOiBjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaAotZHdhcmYxLmxvOiBkd2FyZjEuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2R3YXJmLmgKLWR3YXJmMi5sbzogZHdhcmYyLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9kd2FyZjIuaAotZWNvZmYubG86IGVjb2ZmLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgJChJTkNESVIpL2FvdXQvcmFubGliLmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmgKLWVjb2ZmbGluay5sbzogZWNvZmZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JqYWxsb2MuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oCi1lbGYubG86IGVsZi5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oCi1lbGYzMi1hcmMubG86IGVsZjMyLWFyYy5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGZhcm0tb2FiaS5sbzogZWxmYXJtLW9hYmkuYyAkKElOQ0RJUikvZWxmL2FybS1vYWJpLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItYXJtLmggZWxmMzItdGFyZ2V0LmgKLWVsZmFybS1uYWJpLmxvOiBlbGZhcm0tbmFiaS5jICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZjMyLWFybS5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWQxMHYubG86IGVsZjMyLWQxMHYuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1kMzB2LmxvOiBlbGYzMi1kMzB2LmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItZnIzMC5sbzogZWxmMzItZnIzMC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9mcjMwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItZ2VuLmxvOiBlbGYzMi1nZW4uYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1ocHBhLmxvOiBlbGYzMi1ocHBhLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGxpYmhwcGEuaCBcCi0gIGVsZjMyLWhwcGEuaCBlbGYtaHBwYS5oIGhwcGFfc3R1YnMuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItaTM4Ni5sbzogZWxmMzItaTM4Ni5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9pMzg2LmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItaTg2MC5sbzogZWxmMzItaTg2MC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWk5NjAubG86IGVsZjMyLWk5NjAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvaTk2MC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW0zMnIubG86IGVsZjMyLW0zMnIuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvbTMyci5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW02OGsubG86IGVsZjMyLW02OGsuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvbTY4ay5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW04OGsubG86IGVsZjMyLW04OGsuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYtbTEwMjAwLmxvOiBlbGYtbTEwMjAwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmLW0xMDMwMC5sbzogZWxmLW0xMDMwMC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9tbjEwMzAwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tY29yZS5sbzogZWxmMzItbWNvcmUuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvbWNvcmUuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW1pcHMubG86IGVsZjMyLW1pcHMuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9taXBzLmggZWNvZmZzd2FwLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItcGoubG86IGVsZjMyLXBqLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3BqLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItcHBjLmxvOiBlbGYzMi1wcGMuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItc2gubG86IGVsZjMyLXNoLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3NoLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItc3BhcmMubG86IGVsZjMyLXNwYXJjLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi12ODUwLmxvOiBlbGYzMi12ODUwLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3Y4NTAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi5sbzogZWxmMzIuYyBlbGZjb2RlLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICBlbGZjb3JlLmggZWxmbGluay5oCi1lbGZsaW5rLmxvOiBlbGZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWVwb2MtcGUtYXJtLmxvOiBlcG9jLXBlLWFybS5jIHBlLWFybS5jIGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotZXBvYy1wZWktYXJtLmxvOiBlcG9jLXBlaS1hcm0uYyBwZWktYXJtLmMgY29mZi1hcm0uYyBcCi0gICQoSU5DRElSKS9jb2ZmL2FybS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIFwKLSAgbGlicGVpLmgKLWhwMzAwYnNkLmxvOiBocDMwMGJzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaHAzMDBocHV4LmxvOiBocDMwMGhwdXguYyAkKElOQ0RJUikvYW91dC9ocDMwMGhwdXguaCBcCi0gIGFvdXR4LmggJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1zb20ubG86IHNvbS5jCi1pMzg2YW91dC5sbzogaTM4NmFvdXQuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZic2QubG86IGkzODZic2QuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZkeW5peC5sbzogaTM4NmR5bml4LmMgJChJTkNESVIpL2FvdXQvZHluaXgzLmggYW91dHguaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotaTM4NmZyZWVic2QubG86IGkzODZmcmVlYnNkLmMgZnJlZWJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmxpbnV4LmxvOiBpMzg2bGludXguYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLWkzODZseW54LmxvOiBpMzg2bHlueC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4Nm1zZG9zLmxvOiBpMzg2bXNkb3MuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotaTM4Nm5ldGJzZC5sbzogaTM4Nm5ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4Nm1hY2gzLmxvOiBpMzg2bWFjaDMuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLWkzODZvczlrLmxvOiBpMzg2b3M5ay5jICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL29zOWsuaAotaWVlZS5sbzogaWVlZS5jICQoSU5DRElSKS9pZWVlLmggbGliaWVlZS5oCi1tNjhrNGtuZXRic2QubG86IG02OGs0a25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTY4a2xpbnV4LmxvOiBtNjhrbGludXguYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLW02OGtseW54LmxvOiBtNjhrbHlueC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTY4a25ldGJzZC5sbzogbTY4a25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTg4a21hY2gzLmxvOiBtODhrbWFjaDMuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW1pcHNic2QubG86IG1pcHNic2QuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW5ld3NvczMubG86IG5ld3NvczMuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLW5sbS5sbzogbmxtLmMgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLW5sbTMyLWkzODYubG86IG5sbTMyLWkzODYuYyAkKElOQ0RJUikvbmxtL2kzODYtZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi1zcGFyYy5sbzogbmxtMzItc3BhcmMuYyAkKElOQ0RJUikvbmxtL3NwYXJjMzItZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi1wcGMubG86IG5sbTMyLXBwYy5jICQoSU5DRElSKS9ubG0vcHBjLWV4dC5oIGxpYm5sbS5oIFwKLSAgJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oIFwKLSAgbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtMzIubG86IG5sbTMyLmMgbmxtY29kZS5oIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggXAotICAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1uczMya25ldGJzZC5sbzogbnMzMmtuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW9hc3lzLmxvOiBvYXN5cy5jICQoSU5DRElSKS9vYXN5cy5oIGxpYm9hc3lzLmgKLXBjNTMyLW1hY2gubG86IHBjNTMyLW1hY2guYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXBlLWFybS5sbzogcGUtYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZWktYXJtLmxvOiBwZWktYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZS1pMzg2LmxvOiBwZS1pMzg2LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlaS1pMzg2LmxvOiBwZWktaTM4Ni5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZS1tY29yZS5sbzogcGUtbWNvcmUuYyBjb2ZmLW1jb3JlLmMgJChJTkNESVIpL2NvZmYvbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZWktbWNvcmUubG86IHBlaS1tY29yZS5jIGNvZmYtbWNvcmUuYyAkKElOQ0RJUikvY29mZi9tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlLXBwYy5sbzogcGUtcHBjLmMgY29mZi1wcGMuYyAkKElOQ0RJUikvY29mZi9wb3dlcnBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGVpLXBwYy5sbzogcGVpLXBwYy5jIGNvZmYtcHBjLmMgJChJTkNESVIpL2NvZmYvcG93ZXJwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlaWdlbi5sbzogcGVpZ2VuLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYnBlaS5oCi1wcGNib290LmxvOiBwcGNib290LmMKLXJlbG9jMTYubG86IHJlbG9jMTYuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oCi1yaXNjaXgubG86IHJpc2NpeC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaAotc3BhcmNsaW51eC5sbzogc3BhcmNsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotc3BhcmNseW54LmxvOiBzcGFyY2x5bnguYyAkKElOQ0RJUikvYW91dC9zdW40LmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1zcGFyY25ldGJzZC5sbzogc3BhcmNuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXN1bm9zLmxvOiBzdW5vcy5jICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIGFvdXRmMS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3VuNC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLXZheG5ldGJzZC5sbzogdmF4bmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi12ZXJzYWRvcy5sbzogdmVyc2Fkb3MuYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXZtcy5sbzogdm1zLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAotdm1zLWdzZC5sbzogdm1zLWdzZC5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy1oZHIubG86IHZtcy1oZHIuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtbWlzYy5sbzogdm1zLW1pc2MuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtdGlyLmxvOiB2bXMtdGlyLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAoteGNvZmZsaW5rLmxvOiB4Y29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmgKLWFvdXQ2NC5sbzogYW91dDY0LmMgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1jb2ZmLWFscGhhLmxvOiBjb2ZmLWFscGhhLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvYWxwaGEuaCAkKElOQ0RJUikvYW91dC9hci5oIGxpYmNvZmYuaCBcCi0gIGxpYmVjb2ZmLmggY29mZnN3YXAuaCBlY29mZnN3YXAuaAotZGVtbzY0LmxvOiBkZW1vNjQuYyBhb3V0ZjEuaCAkKElOQ0RJUikvYW91dC9zdW40LmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLWVsZjY0LWFscGhhLmxvOiBlbGY2NC1hbHBoYS5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL2FscGhhLmggJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oIGVjb2Zmc3dhcC5oIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1nZW4ubG86IGVsZjY0LWdlbi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LW1pcHMubG86IGVsZjY0LW1pcHMuYyAkKElOQ0RJUikvYW91dC9hci5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBnZW5saW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL2FscGhhLmggZWNvZmZzd2FwLmggXAotICBlbGY2NC10YXJnZXQuaAotZWxmNjQtc3BhcmMubG86IGVsZjY0LXNwYXJjLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjY0LXRhcmdldC5oCi1lbGY2NC5sbzogZWxmNjQuYyBlbGZjb2RlLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICBlbGZjb3JlLmggZWxmbGluay5oCi1ubG0zMi1hbHBoYS5sbzogbmxtMzItYWxwaGEuYyAkKElOQ0RJUikvbmxtL2FscGhhLWV4dC5oIFwKLSAgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtNjQubG86IG5sbTY0LmMgbmxtY29kZS5oIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggXAotICAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1haXgzODYtY29yZS5sbzogYWl4Mzg2LWNvcmUuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ocHV4LWNvcmUubG86IGhwdXgtY29yZS5jCi1pcml4LWNvcmUubG86IGlyaXgtY29yZS5jCi1seW54LWNvcmUubG86IGx5bngtY29yZS5jCi1vc2YtY29yZS5sbzogb3NmLWNvcmUuYwotc2NvNS1jb3JlLmxvOiBzY281LWNvcmUuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotdHJhZC1jb3JlLmxvOiB0cmFkLWNvcmUuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGhvc3RzL2kzODZsaW51eC5oCi1jaXNjby1jb3JlLmxvOiBjaXNjby1jb3JlLmMKLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQpkaWZmIC0tZ2l0IGEvYmZkL01ha2VmaWxlLmluIGIvYmZkL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2UyNjY5Li4wMDAwMDAwCi0tLSBhL2JmZC9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE2MzcgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUJGRF9IT1NUXzY0QklUX0xPTkcgPSBAQkZEX0hPU1RfNjRCSVRfTE9OR0AKLUJGRF9IT1NUXzY0X0JJVCA9IEBCRkRfSE9TVF82NF9CSVRACi1CRkRfSE9TVF82NF9CSVRfREVGSU5FRCA9IEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKLUJGRF9IT1NUX1VfNjRfQklUID0gQEJGRF9IT1NUX1VfNjRfQklUQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotQ09SRUZJTEUgPSBAQ09SRUZJTEVACi1DT1JFRkxBRyA9IEBDT1JFRkxBR0AKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRVhFRVhUID0gQEVYRUVYVEAKLUVYRUVYVF9GT1JfQlVJTEQgPSBARVhFRVhUX0ZPUl9CVUlMREAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSERFRklORVMgPSBASERFRklORVNACi1JTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLUlOVExMSUJTID0gQElOVExMSUJTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTk0gPSBATk1ACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1UREVGSU5FUyA9IEBUREVGSU5FU0AKLVVTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotVVNFX05MUyA9IEBVU0VfTkxTQAotVVNFX1NZTUJPTF9VTkRFUlNDT1JFID0gQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLVdJTjMyTERGTEFHUyA9IEBXSU4zMkxERkxBR1NACi1XSU4zMkxJQkFERCA9IEBXSU4zMkxJQkFEREAKLWFsbF9iYWNrZW5kcyA9IEBhbGxfYmFja2VuZHNACi1iZmRfYmFja2VuZHMgPSBAYmZkX2JhY2tlbmRzQAotYmZkX21hY2hpbmVzID0gQGJmZF9tYWNoaW5lc0AKLWwgPSBAbEAKLXRkZWZhdWx0cyA9IEB0ZGVmYXVsdHNACi13b3Jkc2l6ZSA9IEB3b3Jkc2l6ZUAKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1JTkNESVIgPSAkKHNyY2RpcikvLi4vaW5jbHVkZQotQ1NFQVJDSCA9IC1JLiAtSSQoc3JjZGlyKSAtSSQoSU5DRElSKQotTUtERVAgPSBta2RlcAotCi1TVUJESVJTID0gZG9jIHBvCi0KLWRvY2RpciA9IGRvYwotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJiZmQubGEKLQotIyBiZmQuaCBnb2VzIGhlcmUsIGZvciBub3cKLUJGRF9IID0gYmZkLmgKLQotIyBKaW0gS2luZ2RvbiBub3RlczoKLSMgV3JpdGluZyBTLXJlY29yZHMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFsbCAob3IgYXQgbGVhc3QgbW9zdCkKLSMgKi0qLWNvZmYsICotKi1hb3V0LCBldGMuLCBjb25maWd1cmF0aW9ucywgYmVjYXVzZSBwZW9wbGUgd2lsbCB3YW50IHRvCi0jIGJlIGFibGUgdG8gdXNlIG9iamNvcHkgdG8gY3JlYXRlIFMtcmVjb3Jkcy4gIChTLXJlY29yZHMgYXJlIG5vdCB1c2VmdWwKLSMgZm9yIHRoZSBkZWJ1Z2dlciwgc28gaWYgeW91IGFyZSBkb3dubG9hZGluZyB0aGluZ3MgYXMgUy1yZWNvcmRzIHlvdQotIyBuZWVkIHR3byBjb3BpZXMgb2YgdGhlIGV4ZWN1dGFibGUsIG9uZSB0byBkb3dubG9hZCBhbmQgb25lIGZvciB0aGUKLSMgZGVidWdnZXIpLgotQkZEX0xJQlMgPSBcCi0JYXJjaGl2ZS5sbyBhcmNodXJlcy5sbyBiZmQubG8gY2FjaGUubG8gY29mZmdlbi5sbyBjb3JlZmlsZS5sbyBcCi0JZm9ybWF0LmxvIGluaXQubG8gbGliYmZkLmxvIG9wbmNscy5sbyByZWxvYy5sbyBcCi0Jc2VjdGlvbi5sbyBzeW1zLmxvIHRhcmdldHMubG8gaGFzaC5sbyBsaW5rZXIubG8gXAotCXNyZWMubG8gYmluYXJ5LmxvIHRla2hleC5sbyBpaGV4LmxvIHN0YWJzLmxvIHN0YWItc3ltcy5sbwotCi0KLUJGRF9MSUJTX0NGSUxFUyA9IFwKLQlhcmNoaXZlLmMgYXJjaHVyZXMuYyBiZmQuYyBjYWNoZS5jIGNvZmZnZW4uYyBjb3JlZmlsZS5jIFwKLQlmb3JtYXQuYyBpbml0LmMgbGliYmZkLmMgb3BuY2xzLmMgcmVsb2MuYyBcCi0Jc2VjdGlvbi5jIHN5bXMuYyB0YXJnZXRzLmMgaGFzaC5jIGxpbmtlci5jIFwKLQlzcmVjLmMgYmluYXJ5LmMgdGVraGV4LmMgaWhleC5jIHN0YWJzLmMgc3RhYi1zeW1zLmMKLQotCi0jIFRoaXMgbGlzdCBpcyBhbHBoYWJldGl6ZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8ga2VlcCBpbiBzeW5jCi0jIHdpdGggdGhlIGRlY2xzIGFuZCBpbml0aWFsaXplciBpbiBhcmNodXJlcy5jLgotQUxMX01BQ0hJTkVTID0gXAotCWNwdS1hMjlrLmxvIFwKLQljcHUtYWxwaGEubG8gXAotCWNwdS1hcmMubG8gXAotCWNwdS1hcm0ubG8gXAotCWNwdS1kMTB2LmxvIFwKLQljcHUtZDMwdi5sbyBcCi0JY3B1LWZyMzAubG8gXAotCWNwdS1oODMwMC5sbyBcCi0JY3B1LWg4NTAwLmxvIFwKLQljcHUtaHBwYS5sbyBcCi0JY3B1LWkzODYubG8gXAotCWNwdS1pODYwLmxvIFwKLQljcHUtaTk2MC5sbyBcCi0JY3B1LW0zMnIubG8gXAotCWNwdS1tNjhrLmxvIFwKLQljcHUtbTg4ay5sbyBcCi0JY3B1LW0xMDIwMC5sbyBcCi0JY3B1LW0xMDMwMC5sbyBcCi0JY3B1LW1jb3JlLmxvIFwKLQljcHUtbWlwcy5sbyBcCi0JY3B1LW5zMzJrLmxvIFwKLQljcHUtcGoubG8gXAotCWNwdS1wb3dlcnBjLmxvIFwKLQljcHUtcnM2MDAwLmxvIFwKLQljcHUtc2gubG8gXAotCWNwdS1zcGFyYy5sbyBcCi0JY3B1LXRpYzMwLmxvIFwKLQljcHUtdGljODAubG8gXAotCWNwdS12ODUwLmxvIFwKLQljcHUtdmF4LmxvIFwKLQljcHUtd2UzMmsubG8gXAotCWNwdS13NjUubG8gXAotCWNwdS16OGsubG8KLQotCi1BTExfTUFDSElORVNfQ0ZJTEVTID0gXAotCWNwdS1hMjlrLmMgXAotCWNwdS1hbHBoYS5jIFwKLQljcHUtYXJjLmMgXAotCWNwdS1hcm0uYyBcCi0JY3B1LWQxMHYuYyBcCi0JY3B1LWQzMHYuYyBcCi0JY3B1LWZyMzAuYyBcCi0JY3B1LWg4MzAwLmMgXAotCWNwdS1oODUwMC5jIFwKLQljcHUtaHBwYS5jIFwKLQljcHUtaTM4Ni5jIFwKLQljcHUtaTg2MC5jIFwKLQljcHUtaTk2MC5jIFwKLQljcHUtbTMyci5jIFwKLQljcHUtbTY4ay5jIFwKLQljcHUtbTg4ay5jIFwKLQljcHUtbTEwMjAwLmMgXAotCWNwdS1tMTAzMDAuYyBcCi0JY3B1LW1jb3JlLmMgXAotCWNwdS1taXBzLmMgXAotCWNwdS1uczMyay5jIFwKLQljcHUtcGouYyBcCi0JY3B1LXBvd2VycGMuYyBcCi0JY3B1LXJzNjAwMC5jIFwKLQljcHUtc2guYyBcCi0JY3B1LXNwYXJjLmMgXAotCWNwdS10aWMzMC5jIFwKLQljcHUtdGljODAuYyBcCi0JY3B1LXY4NTAuYyBcCi0JY3B1LXZheC5jIFwKLQljcHUtd2UzMmsuYyBcCi0JY3B1LXc2NS5jIFwKLQljcHUtejhrLmMKLQotCi0jIFRoZSAubyBmaWxlcyBuZWVkZWQgYnkgYWxsIG9mIHRoZSAzMiBiaXQgdmVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIGludG8KLSMgdGFyZ2V0X3ZlY3RvciBpbiB0YXJnZXRzLmMgaWYgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLXRhcmdldHM9YWxsLgotQkZEMzJfQkFDS0VORFMgPSBcCi0JYW91dC1hZG9iZS5sbyBcCi0JYW91dC1hcm0ubG8gXAotCWFvdXQtbnMzMmsubG8gXAotCWFvdXQtc3BhcmNsZS5sbyBcCi0JYW91dC10aWMzMC5sbyBcCi0JYW91dDAubG8gXAotCWFvdXQzMi5sbyBcCi0JYXJtbmV0YnNkLmxvIFwKLQlib3V0LmxvIFwKLQljZi1pMzg2bHlueC5sbyBcCi0JY2YtbTY4a2x5bngubG8gXAotCWNmLXNwYXJjbHlueC5sbyBcCi0JY29mZi1hMjlrLmxvIFwKLQljb2ZmLWFwb2xsby5sbyBcCi0JY29mZi1hcm0ubG8gXAotCWNvZmYtYXV4LmxvIFwKLQljb2ZmLWg4MzAwLmxvIFwKLQljb2ZmLWg4NTAwLmxvIFwKLQljb2ZmLWkzODYubG8gXAotCWNvZmYtZ28zMi5sbyBcCi0JY29mZi1pODYwLmxvIFwKLQljb2ZmLWk5NjAubG8gXAotCWNvZmYtbTY4ay5sbyBcCi0JY29mZi1tODhrLmxvIFwKLQljb2ZmLW1pcHMubG8gXAotCWNvZmYtcG1hYy5sbyBcCi0JY29mZi1yczYwMDAubG8gXAotCWNvZmYtc2gubG8gXAotCWNvZmYtc3BhcmMubG8gXAotCWNvZmYtc3RnbzMyLmxvIFwKLQljb2ZmLXN2bTY4ay5sbyBcCi0JY29mZi10aWMzMC5sbyBcCi0JY29mZi10aWM4MC5sbyBcCi0JY29mZi11NjhrLmxvIFwKLQljb2ZmLXdlMzJrLmxvIFwKLQljb2ZmLXc2NS5sbyBcCi0JY29mZi16OGsubG8gXAotCWNvZmZsaW5rLmxvIFwKLQlkd2FyZjEubG8gXAotCWR3YXJmMi5sbyBcCi0JZWNvZmYubG8gXAotCWVjb2ZmbGluay5sbyBcCi0JZWxmLmxvIFwKLQllbGYzMi1hcmMubG8gXAotCWVsZmFybS1vYWJpLmxvIFwKLQllbGZhcm0tbmFiaS5sbyBcCi0JZWxmMzItZDEwdi5sbyBcCi0JZWxmMzItZDMwdi5sbyBcCi0JZWxmMzItZnIzMC5sbyBcCi0JZWxmMzItZ2VuLmxvIFwKLQllbGYzMi1ocHBhLmxvIFwKLQllbGYzMi1pMzg2LmxvIFwKLQllbGYzMi1pODYwLmxvIFwKLQllbGYzMi1pOTYwLmxvIFwKLQllbGYzMi1tMzJyLmxvIFwKLQllbGYzMi1tNjhrLmxvIFwKLQllbGYzMi1tODhrLmxvIFwKLQllbGYtbTEwMjAwLmxvIFwKLQllbGYtbTEwMzAwLmxvIFwKLQllbGYzMi1tY29yZS5sbyBcCi0JZWxmMzItbWlwcy5sbyBcCi0JZWxmMzItcGoubG8gXAotCWVsZjMyLXBwYy5sbyBcCi0JZWxmMzItc2gubG8gXAotCWVsZjMyLXNwYXJjLmxvIFwKLQllbGYzMi12ODUwLmxvIFwKLQllbGYzMi5sbyBcCi0JZWxmbGluay5sbyBcCi0JZXBvYy1wZS1hcm0ubG8gXAotCWVwb2MtcGVpLWFybS5sbyBcCi0JaHAzMDBic2QubG8gXAotCWhwMzAwaHB1eC5sbyBcCi0Jc29tLmxvIFwKLQlpMzg2YW91dC5sbyBcCi0JaTM4NmJzZC5sbyBcCi0JaTM4NmR5bml4LmxvIFwKLQlpMzg2ZnJlZWJzZC5sbyBcCi0JaTM4NmxpbnV4LmxvIFwKLQlpMzg2bHlueC5sbyBcCi0JaTM4Nm1zZG9zLmxvIFwKLQlpMzg2bmV0YnNkLmxvIFwKLQlpMzg2bWFjaDMubG8gXAotCWkzODZvczlrLmxvIFwKLQlpZWVlLmxvIFwKLQltNjhrNGtuZXRic2QubG8gXAotCW02OGtsaW51eC5sbyBcCi0JbTY4a2x5bngubG8gXAotCW02OGtuZXRic2QubG8gXAotCW04OGttYWNoMy5sbyBcCi0JbWlwc2JzZC5sbyBcCi0JbmV3c29zMy5sbyBcCi0JbmxtLmxvIFwKLQlubG0zMi1pMzg2LmxvIFwKLQlubG0zMi1zcGFyYy5sbyBcCi0JbmxtMzItcHBjLmxvIFwKLQlubG0zMi5sbyBcCi0JbnMzMmtuZXRic2QubG8gXAotCW9hc3lzLmxvIFwKLQlwYzUzMi1tYWNoLmxvIFwKLQlwZS1hcm0ubG8gXAotCXBlaS1hcm0ubG8gXAotCXBlLWkzODYubG8gXAotCXBlaS1pMzg2LmxvIFwKLQlwZS1tY29yZS5sbyBcCi0JcGVpLW1jb3JlLmxvIFwKLQlwZS1wcGMubG8gXAotCXBlaS1wcGMubG8gXAotCXBlaWdlbi5sbyBcCi0JcHBjYm9vdC5sbyBcCi0JcmVsb2MxNi5sbyBcCi0JcmlzY2l4LmxvIFwKLQlzcGFyY2xpbnV4LmxvIFwKLQlzcGFyY2x5bngubG8gXAotCXNwYXJjbmV0YnNkLmxvIFwKLQlzdW5vcy5sbyBcCi0JdmF4bmV0YnNkLmxvIFwKLQl2ZXJzYWRvcy5sbyBcCi0Jdm1zLmxvIFwKLQl2bXMtZ3NkLmxvIFwKLQl2bXMtaGRyLmxvIFwKLQl2bXMtbWlzYy5sbyBcCi0Jdm1zLXRpci5sbyBcCi0JeGNvZmZsaW5rLmxvCi0KLQotQkZEMzJfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFvdXQtYWRvYmUuYyBcCi0JYW91dC1hcm0uYyBcCi0JYW91dC1uczMyay5jIFwKLQlhb3V0LXNwYXJjbGUuYyBcCi0JYW91dC10aWMzMC5jIFwKLQlhb3V0MC5jIFwKLQlhb3V0MzIuYyBcCi0JYXJtbmV0YnNkLmMgXAotCWJvdXQuYyBcCi0JY2YtaTM4Nmx5bnguYyBcCi0JY2YtbTY4a2x5bnguYyBcCi0JY2Ytc3BhcmNseW54LmMgXAotCWNvZmYtYTI5ay5jIFwKLQljb2ZmLWFwb2xsby5jIFwKLQljb2ZmLWFybS5jIFwKLQljb2ZmLWF1eC5jIFwKLQljb2ZmLWg4MzAwLmMgXAotCWNvZmYtaDg1MDAuYyBcCi0JY29mZi1pMzg2LmMgXAotCWNvZmYtaTg2MC5jIFwKLQljb2ZmLWdvMzIuYyBcCi0JY29mZi1pOTYwLmMgXAotCWNvZmYtbTY4ay5jIFwKLQljb2ZmLW04OGsuYyBcCi0JY29mZi1taXBzLmMgXAotCWNvZmYtcG1hYy5jIFwKLQljb2ZmLXJzNjAwMC5jIFwKLQljb2ZmLXNoLmMgXAotCWNvZmYtc3BhcmMuYyBcCi0JY29mZi1zdGdvMzIuYyBcCi0JY29mZi1zdm02OGsuYyBcCi0JY29mZi10aWMzMC5jIFwKLQljb2ZmLXRpYzgwLmMgXAotCWNvZmYtdTY4ay5jIFwKLQljb2ZmLXdlMzJrLmMgXAotCWNvZmYtdzY1LmMgXAotCWNvZmYtejhrLmMgXAotCWNvZmZsaW5rLmMgXAotCWR3YXJmMS5jIFwKLQlkd2FyZjIuYyBcCi0JZWNvZmYuYyBcCi0JZWNvZmZsaW5rLmMgXAotCWVsZi5jIFwKLQllbGYzMi1hcmMuYyBcCi0JZWxmYXJtLW9hYmkuYyBcCi0JZWxmYXJtLW5hYmkuYyBcCi0JZWxmMzItZDEwdi5jIFwKLQllbGYzMi1kMzB2LmMgXAotCWVsZjMyLWZyMzAuYyBcCi0JZWxmMzItZ2VuLmMgXAotCWVsZjMyLWhwcGEuYyBcCi0JZWxmMzItaTM4Ni5jIFwKLQllbGYzMi1pODYwLmMgXAotCWVsZjMyLWk5NjAuYyBcCi0JZWxmMzItbTMyci5jIFwKLQllbGYzMi1tNjhrLmMgXAotCWVsZjMyLW04OGsuYyBcCi0JZWxmLW0xMDIwMC5jIFwKLQllbGYtbTEwMzAwLmMgXAotCWVsZjMyLW1jb3JlLmMgXAotCWVsZjMyLW1pcHMuYyBcCi0JZWxmMzItcGouYyBcCi0JZWxmMzItcHBjLmMgXAotCWVsZjMyLXNoLmMgXAotCWVsZjMyLXNwYXJjLmMgXAotCWVsZjMyLXY4NTAuYyBcCi0JZWxmMzIuYyBcCi0JZWxmbGluay5jIFwKLQllcG9jLXBlLWFybS5jIFwKLQllcG9jLXBlaS1hcm0uYyBcCi0JaHAzMDBic2QuYyBcCi0JaHAzMDBocHV4LmMgXAotCXNvbS5jIFwKLQlpMzg2YW91dC5jIFwKLQlpMzg2YnNkLmMgXAotCWkzODZkeW5peC5jIFwKLQlpMzg2ZnJlZWJzZC5jIFwKLQlpMzg2bGludXguYyBcCi0JaTM4Nmx5bnguYyBcCi0JaTM4Nm1zZG9zLmMgXAotCWkzODZuZXRic2QuYyBcCi0JaTM4Nm1hY2gzLmMgXAotCWkzODZvczlrLmMgXAotCWllZWUuYyBcCi0JbTY4azRrbmV0YnNkLmMgXAotCW02OGtsaW51eC5jIFwKLQltNjhrbHlueC5jIFwKLQltNjhrbmV0YnNkLmMgXAotCW04OGttYWNoMy5jIFwKLQltaXBzYnNkLmMgXAotCW5ld3NvczMuYyBcCi0JbmxtLmMgXAotCW5sbTMyLWkzODYuYyBcCi0JbmxtMzItc3BhcmMuYyBcCi0JbmxtMzItcHBjLmMgXAotCW5sbTMyLmMgXAotCW5zMzJrbmV0YnNkLmMgXAotCW9hc3lzLmMgXAotCXBjNTMyLW1hY2guYyBcCi0JcGUtYXJtLmMgXAotCXBlaS1hcm0uYyBcCi0JcGUtaTM4Ni5jIFwKLQlwZWktaTM4Ni5jIFwKLQlwZS1tY29yZS5jIFwKLQlwZWktbWNvcmUuYyBcCi0JcGUtcHBjLmMgXAotCXBlaS1wcGMuYyBcCi0JcGVpZ2VuLmMgXAotCXBwY2Jvb3QuYyBcCi0JcmVsb2MxNi5jIFwKLQlyaXNjaXguYyBcCi0Jc3BhcmNsaW51eC5jIFwKLQlzcGFyY2x5bnguYyBcCi0Jc3BhcmNuZXRic2QuYyBcCi0Jc3Vub3MuYyBcCi0JdmF4bmV0YnNkLmMgXAotCXZlcnNhZG9zLmMgXAotCXZtcy5jIFwKLQl2bXMtZ3NkLmMgXAotCXZtcy1oZHIuYyBcCi0Jdm1zLW1pc2MuYyBcCi0Jdm1zLXRpci5jIFwKLQl4Y29mZmxpbmsuYwotCi0KLSMgVGhlIC5vIGZpbGVzIG5lZWRlZCBieSBhbGwgb2YgdGhlIDY0IGJpdCB2ZWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW50bwotIyB0YXJnZXRfdmVjdG9yIGluIHRhcmdldHMuYyBpZiBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtdGFyZ2V0cz1hbGwKLSMgYW5kIC0tZW5hYmxlLTY0LWJpdC1iZmQuCi1CRkQ2NF9CQUNLRU5EUyA9IFwKLQlhb3V0NjQubG8gXAotCWNvZmYtYWxwaGEubG8gXAotCWRlbW82NC5sbyBcCi0JZWxmNjQtYWxwaGEubG8gXAotCWVsZjY0LWdlbi5sbyBcCi0JZWxmNjQtbWlwcy5sbyBcCi0JZWxmNjQtc3BhcmMubG8gXAotCWVsZjY0LmxvIFwKLQlubG0zMi1hbHBoYS5sbyBcCi0JbmxtNjQubG8KLQotCi1CRkQ2NF9CQUNLRU5EU19DRklMRVMgPSBcCi0JYW91dDY0LmMgXAotCWNvZmYtYWxwaGEuYyBcCi0JZGVtbzY0LmMgXAotCWVsZjY0LWFscGhhLmMgXAotCWVsZjY0LWdlbi5jIFwKLQllbGY2NC1taXBzLmMgXAotCWVsZjY0LXNwYXJjLmMgXAotCWVsZjY0LmMgXAotCW5sbTMyLWFscGhhLmMgXAotCW5sbTY0LmMKLQotCi1PUFRJT05BTF9CQUNLRU5EUyA9IFwKLQlhaXgzODYtY29yZS5sbyBcCi0JaHB1eC1jb3JlLmxvIFwKLQlpcml4LWNvcmUubG8gXAotCWx5bngtY29yZS5sbyBcCi0Jb3NmLWNvcmUubG8gXAotCXNjbzUtY29yZS5sbyBcCi0JdHJhZC1jb3JlLmxvIFwKLQljaXNjby1jb3JlLmxvCi0KLQotT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTID0gXAotCWFpeDM4Ni1jb3JlLmMgXAotCWhwdXgtY29yZS5jIFwKLQlpcml4LWNvcmUuYyBcCi0JbHlueC1jb3JlLmMgXAotCW9zZi1jb3JlLmMgXAotCXNjbzUtY29yZS5jIFwKLQl0cmFkLWNvcmUuYyBcCi0JY2lzY28tY29yZS5jCi0KLQotIyBUaGVzZSBhcmUgZGVmaW5lZCBieSBjb25maWd1cmUuaW46Ci1XT1JEU0laRSA9IEB3b3Jkc2l6ZUAKLUFMTF9CQUNLRU5EUyA9IEBhbGxfYmFja2VuZHNACi1CRkRfQkFDS0VORFMgPSBAYmZkX2JhY2tlbmRzQAotQkZEX01BQ0hJTkVTID0gQGJmZF9tYWNoaW5lc0AKLVRERUZBVUxUUyA9IEB0ZGVmYXVsdHNACi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSBASERFRklORVNAIEBDT1JFRkxBR0AgQFRERUZJTkVTQCAkKENTRUFSQ0gpICQoQ1NXSVRDSEVTKSAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bAotCi0jIEMgc291cmNlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byAubydzLgotQ0ZJTEVTID0gXAotCSQoQkZEX0xJQlNfQ0ZJTEVTKSBcCi0JJChBTExfTUFDSElORVNfQ0ZJTEVTKSBcCi0JJChCRkQzMl9CQUNLRU5EU19DRklMRVMpIFwKLQkkKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUykgXAotCSQoT1BUSU9OQUxfQkFDS0VORFNfQ0ZJTEVTKQotCi0KLVNPVVJDRV9IRklMRVMgPSBcCi0JYW91dC10YXJnZXQuaCBhb3V0ZjEuaCBhb3V0eC5oIGNvZmZjb2RlLmggY29mZnN3YXAuaCBcCi0JZWNvZmZzd2FwLmggZWxmMzItYXJtLmggZWxmMzItaHBwYS5oIGVsZmNvZGUuaCBlbGZjb3JlLmggXAotCWVsZmxpbmsuaCBmcmVlYnNkLmggZ2VubGluay5oIGdvMzJzdHViLmggaHBwYV9zdHVicy5oIGxpYmFvdXQuaCBcCi0JbGliYmZkLmggbGliY29mZi5oIGxpYmVjb2ZmLmggZWxmLWJmZC5oIGxpYmhwcGEuaCBsaWJpZWVlLmggXAotCWxpYm5sbS5oIGxpYm9hc3lzLmggbGlicGVpLmggbmV0YnNkLmggbmxtLXRhcmdldC5oIG5sbWNvZGUuaCBcCi0Jbmxtc3dhcC5oIG5zMzJrLmggcGVpY29kZS5oIHNvbS5oIHZtcy5oCi0KLQotSEZJTEVTID0gXAotCWVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oIHRhcmdtYXRjaC5oIFwKLQkkKFNPVVJDRV9IRklMRVMpCi0KLQotUE9URklMRVMgPSAkKENGSUxFUykgJChTT1VSQ0VfSEZJTEVTKQotCi0jIFZhcmlvdXMga2luZHMgb2YgLm8gZmlsZXMgdG8gcHV0IGluIGxpYmJmZC5hOgotIyBCRkRfQkFDS0VORFMJUm91dGluZXMgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cyBuZWVkLgotIyBCRkRfTUFDSElORVMJQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHJvdXRpbmVzIHRoZSBjb25maWd1cmVkIHRhcmdldHMgbmVlZC4KLSMgQ09SRUZJTEUJQ29yZSBmaWxlIHJvdXRpbmVzIGZvciBhIG5hdGl2ZSBjb25maWd1cmF0aW9uCi1PRklMRVMgPSAkKEJGRF9CQUNLRU5EUykgJChCRkRfTUFDSElORVMpIEBDT1JFRklMRUAKLQotbGliYmZkX2xhX1NPVVJDRVMgPSAkKEJGRF9MSUJTX0NGSUxFUykKLWxpYmJmZF9sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykgb2ZpbGVzCi1saWJiZmRfbGFfTElCQUREID0gYGNhdCBvZmlsZXNgIEBXSU4zMkxJQkFEREAKLWxpYmJmZF9sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSBAV0lOMzJMREZMQUdTQAotCi0jIGxpYnRvb2wgd2lsbCBidWlsZCAubGlicy9saWJiZmQuYS4gIFdlIGNyZWF0ZSBsaWJiZmQuYSBpbiB0aGUgYnVpbGQKLSMgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUgcHJvZ3JhbXMgdGhhdCB1c2UKLSMgbGliYmZkLmEgc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGEgaGFjayB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZCBpZgotIyBldmVyeXRoaW5nIGVsc2Ugc3RhcnRzIHVzaW5nIGxpYnRvb2wuICBGSVhNRS4KLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYmJmZC5hCi1saWJiZmRfYV9TT1VSQ0VTID0gCi0KLUJGRF9IX0RFUFMgPSAkKElOQ0RJUikvYW5zaWRlY2wuaAotTE9DQUxfSF9ERVBTID0gbGliYmZkLmggc3lzZGVwLmggY29uZmlnLmgKLQotQkZEX0hfRklMRVMgPSBiZmQtaW4uaCBpbml0LmMgb3BuY2xzLmMgbGliYmZkLmMgc2VjdGlvbi5jIGFyY2h1cmVzLmMgXAotCXJlbG9jLmMgc3ltcy5jIGJmZC5jIGFyY2hpdmUuYyBjb3JlZmlsZS5jIHRhcmdldHMuYyBmb3JtYXQuYwotCi1MSUJCRkRfSF9GSUxFUyA9IGxpYmJmZC1pbi5oIGluaXQuYyBsaWJiZmQuYyBjYWNoZS5jIHJlbG9jLmMgYXJjaHVyZXMuYyBlbGYuYwotTElCQ09GRl9IX0ZJTEVTID0gbGliY29mZi1pbi5oIGNvZmZjb2RlLmgKLQotTU9TVExZQ0xFQU5GSUxFUyA9IGVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oIG9maWxlcyBzdGFtcC1vZmlsZXMgXAotCXRhcmdtYXRjaC5oCi0KLQotQ0xFQU5GSUxFUyA9IGJmZC5oIGRlcC5zZWQgc3RtcC1iZmQtaCBERVAgREVQMSBsaWJiZmQuYSBzdGFtcC1saWIgXAotCXN0bXAtYmluMi1oIHN0bXAtbGJmZC1oIHN0bXAtbGNvZmYtaAotCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzCi1DT05GSUdfSEVBREVSID0gY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9ICBiZmQtaW4zLmgKLUxJQlJBUklFUyA9ICAkKG5vaW5zdF9MSUJSQVJJRVMpCi0KLQotREVGUyA9IEBERUZTQCAtSS4gLUkkKHNyY2RpcikgLUkuCi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQlMgPSBATElCU0AKLWxpYmJmZF9hX0xJQkFERCA9IAotbGliYmZkX2FfT0JKRUNUUyA9IAotTFRMSUJSQVJJRVMgPSAgJChsaWJfTFRMSUJSQVJJRVMpCi0KLWxpYmJmZF9sYV9PQkpFQ1RTID0gIGFyY2hpdmUubG8gYXJjaHVyZXMubG8gYmZkLmxvIGNhY2hlLmxvIGNvZmZnZW4ubG8gXAotY29yZWZpbGUubG8gZm9ybWF0LmxvIGluaXQubG8gbGliYmZkLmxvIG9wbmNscy5sbyByZWxvYy5sbyBzZWN0aW9uLmxvIFwKLXN5bXMubG8gdGFyZ2V0cy5sbyBoYXNoLmxvIGxpbmtlci5sbyBzcmVjLmxvIGJpbmFyeS5sbyB0ZWtoZXgubG8gXAotaWhleC5sbyBzdGFicy5sbyBzdGFiLXN5bXMubG8KLUNGTEFHUyA9IEBDRkxBR1NACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotRElTVF9DT01NT04gPSAgUkVBRE1FIC4vc3RhbXAtaC5pbiBDT1BZSU5HIENoYW5nZUxvZyBNYWtlZmlsZS5hbSBcCi1NYWtlZmlsZS5pbiBUT0RPIGFjaW5jbHVkZS5tNCBhY2xvY2FsLm00IGJmZC1pbjIuaCBjb25maWcuaW4gY29uZmlndXJlIFwKLWNvbmZpZ3VyZS5pbgotCi0KLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi0KLVRBUiA9IGd0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci1TT1VSQ0VTID0gJChsaWJiZmRfYV9TT1VSQ0VTKSAkKGxpYmJmZF9sYV9TT1VSQ0VTKQotT0JKRUNUUyA9ICQobGliYmZkX2FfT0JKRUNUUykgJChsaWJiZmRfbGFfT0JKRUNUUykKLQotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLlMgLmMgLmxvIC5vIC5zCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotYmZkLWluMy5oOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyBiZmQtaW4yLmgKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgQ09ORklHX0ZJTEVTPSRAOmJmZC1pbjIuaCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLW1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCS10ZXN0IC16ICIkKG5vaW5zdF9MSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1tb3N0bHljbGVhbi1saWJMVExJQlJBUklFUzoKLQotY2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCi0KLWRpc3RjbGVhbi1saWJMVExJQlJBUklFUzoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUzoKLQotaW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCi0JQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgJChMSUJUT09MKSAgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAotCWRvbmUKLQotbGliYmZkLmxhOiAkKGxpYmJmZF9sYV9PQkpFQ1RTKSAkKGxpYmJmZF9sYV9ERVBFTkRFTkNJRVMpCi0JJChMSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGliYmZkX2xhX0xERkxBR1MpICQobGliYmZkX2xhX09CSkVDVFMpICQobGliYmZkX2xhX0xJQkFERCkgJChMSUJTKQotCi0jIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAotIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCi0jIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCi0jICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKLSMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7Ci0jICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgotCi1AU0VUX01BS0VACi0KLWFsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLWluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAotY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgZG90X3NlZW49eWVzOyBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmU7IFwKLQlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAotCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKLQlmaTsgdGVzdCAteiAiJCRmYWlsIgotCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAotCWRvbmU7IFwKLQl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKLXRhZ3MtcmVjdXJzaXZlOgotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKLQlkb25lCi0KLXRhZ3M6IFRBR1MKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKLQkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQotCi1UQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLSAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0gICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChFVEFHU19BUkdTKWNvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAotCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKLQotbW9zdGx5Y2xlYW4tdGFnczoKLQotY2xlYW4tdGFnczoKLQotZGlzdGNsZWFuLXRhZ3M6Ci0JLXJtIC1mIFRBR1MgSUQKLQotbWFpbnRhaW5lci1jbGVhbi10YWdzOgotCi1kaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCi10b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKLQotIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgotIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgotIyB0YXJmaWxlLgotZGlzdGNoZWNrOiBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6Ci0JbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKLQlta2RpciAkKGRpc3RkaXIpLz1pbnN0Ci0JZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKLQljZCAkKGRpc3RkaXIpLz1idWlsZCBcCi0JICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAotCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCi0JZWNobyAiJCRkYXNoZXMiOyBcCi0JZWNobyAiJCRiYW5uZXIiOyBcCi0JZWNobyAiJCRkYXNoZXMiCi1kaXN0OiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdC1hbGw6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQktcm0gLXJmICQoZGlzdGRpcikKLQlta2RpciAkKGRpc3RkaXIpCi0JLWNobW9kIDc3NyAkKGRpc3RkaXIpCi0JQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgY3AgLXByICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi1pbmZvLWFtOgotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbToKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtZGF0YS1sb2NhbAotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMKLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKExJQlJBUklFUykgJChMVExJQlJBUklFUykgY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQobGliZGlyKQotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoTU9TVExZQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTU9TVExZQ0xFQU5GSUxFUykKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBtb3N0bHljbGVhbi10YWdzIFwKLQkJbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdExJQlJBUklFUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgXAotCQltb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJMVExJQlJBUklFUyBcCi0JCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTIGRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotY2xlYW4tbm9pbnN0TElCUkFSSUVTIG1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBcCi1kaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGliTFRMSUJSQVJJRVMgXAotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgXAotaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBpbmZvLWFtIGluZm8gXAotZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIGluc3RhbGwtaW5mby1hbSBcCi1pbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIFwKLWluc3RhbGwtZGF0YS1sb2NhbCBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gaW5zdGFsbCBcCi11bmluc3RhbGwtYW0gdW5pbnN0YWxsIGFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIFwKLWluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBcCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1kaXN0c3R1ZmY6IGluZm8KLQotc3RhbXAtb2ZpbGVzOiBNYWtlZmlsZQotCXJtIC1mIHRvZmlsZXMKLQlmPSIiOyBcCi0JZm9yIGkgaW4gJChPRklMRVMpIDsgZG8gXAotCSAgY2FzZSAiICQkZiAiIGluIFwKLQkgICAgKiIgJCRpICIqKSA7OyBcCi0JICAgICopIGY9IiQkZiAkJGkiIDs7IFwKLQkgIGVzYWMgOyBcCi0JZG9uZSA7IFwKLQllY2hvICQkZiA+IHRvZmlsZXMKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG9maWxlcyBvZmlsZXMKLQl0b3VjaCBzdGFtcC1vZmlsZXMKLQotb2ZpbGVzOiBzdGFtcC1vZmlsZXMgOyBAdHJ1ZQotCi1zdGFtcC1saWI6IGxpYmJmZC5sYQotCWlmIFsgLWYgLmxpYnMvbGliYmZkLmEgXTsgdGhlbiBcCi0JICBjcCAubGlicy9saWJiZmQuYSBsaWJiZmQudG1wOyBcCi0JICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLnRtcCBsaWJiZmQuYTsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1saWIKLQotbGliYmZkLmE6IHN0YW1wLWxpYiA7IEB0cnVlCi0KLSMgVGhpcyBmaWxlIGhvbGRzIGFuIGFycmF5IGFzc29jaWF0aW5nIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgYW5kCi0jIHZlY3RvciBuYW1lcy4gIEl0IGlzIGJ1aWx0IGZyb20gY29uZmlnLmJmZC4gIEl0IGlzIG5vdCBjb21waWxlZCBieQotIyBpdHNlbGYsIGJ1dCBpcyBpbmNsdWRlZCBieSB0YXJnZXRzLmMuCi10YXJnbWF0Y2guaDogY29uZmlnLmJmZCB0YXJnbWF0Y2guc2VkCi0Jcm0gLWYgdGFyZ21hdGNoLmgKLQlzZWQgLWYgJChzcmNkaXIpL3RhcmdtYXRjaC5zZWQgPCAkKHNyY2RpcikvY29uZmlnLmJmZCA+IHRhcmdtYXRjaC5uZXcKLQltdiAtZiB0YXJnbWF0Y2gubmV3IHRhcmdtYXRjaC5oCi0KLSMgV2hlbiBjb21waWxpbmcgYXJjaHVyZXMuYyBhbmQgdGFyZ2V0cy5jLCBzdXBwbHkgdGhlIGRlZmF1bHQgdGFyZ2V0Ci0jIGluZm8gZnJvbSBjb25maWd1cmUuCi0KLXRhcmdldHMubG86IHRhcmdldHMuYyBjb25maWcuc3RhdHVzCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQoVERFRkFVTFRTKSAkKHNyY2RpcikvdGFyZ2V0cy5jCi0KLWFyY2h1cmVzLmxvOiBhcmNodXJlcy5jIGNvbmZpZy5zdGF0dXMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJChUREVGQVVMVFMpICQoc3JjZGlyKS9hcmNodXJlcy5jCi0KLWVsZjMyLXRhcmdldC5oIDogZWxmeHgtdGFyZ2V0LmgKLQlybSAtZiBlbGYzMi10YXJnZXQuaAotCXNlZCAtZSBzL05OLzMyL2cgPCAkKHNyY2RpcikvZWxmeHgtdGFyZ2V0LmggPiBlbGYzMi10YXJnZXQubmV3Ci0JbXYgLWYgZWxmMzItdGFyZ2V0Lm5ldyBlbGYzMi10YXJnZXQuaAotCi1lbGY2NC10YXJnZXQuaCA6IGVsZnh4LXRhcmdldC5oCi0Jcm0gLWYgZWxmNjQtdGFyZ2V0LmgKLQlzZWQgLWUgcy9OTi82NC9nIDwgJChzcmNkaXIpL2VsZnh4LXRhcmdldC5oID4gZWxmNjQtdGFyZ2V0Lm5ldwotCW12IC1mIGVsZjY0LXRhcmdldC5uZXcgZWxmNjQtdGFyZ2V0LmgKLSQoQkZEX0xJQlMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChCRkRfTUFDSElORVMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChCRkRfQkFDS0VORFMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChPUFRJT05BTF9CQUNLRU5EUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0KLSMgSW5zdGFsbCBCRkQgaW5jbHVkZSBmaWxlLCBhbmQgb3RoZXJzIHRoYXQgaXQgbmVlZHMuCi1pbnN0YWxsLWRhdGEtbG9jYWw6ICQoQkZEX0gpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKGluY2x1ZGVkaXIpCi0JJChJTlNUQUxMX0RBVEEpICQoQkZEX0gpICQoaW5jbHVkZWRpcikvYmZkLmgKLQkkKElOU1RBTExfREFUQSkgJChJTkNESVIpL2Fuc2lkZWNsLmggJChpbmNsdWRlZGlyKS9hbnNpZGVjbC5oCi0JJChJTlNUQUxMX0RBVEEpICQoSU5DRElSKS9iZmRsaW5rLmggJChpbmNsdWRlZGlyKS9iZmRsaW5rLmgKLQotIyBIYXZlIHRvIGdldCByaWQgb2YgREVQMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgotREVQOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgYmZkLmgKLQlybSAtZiBERVAxCi0JJChNQUtFKSBNS0RFUD0kKE1LREVQKSBERVAxCi0Jc2VkIC1mIGRlcC5zZWQgPERFUDEgPkRFUAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotIyBUaGUgTmV0QlNEIG1rZGVwIG92ZXJ3cml0ZXMgYW55IGV4aXN0aW5nIGZpbGUgY29udGVudHMsIGFuZCBkb2Vzbid0IGluc2VydAotIyB0aGUgIkRPIE5PVCBERUxFVEUiIGxpbmUuCi0jIE90aGVyIG1rZGVwIHZlcnNpb25zIHJlcXVpcmUgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMsIGFuZCBkbyBpbnNlcnQgaXQuCi0jIEhlbmNlIHRoZSB3ZWlyZG5lc3MuLi4uCi1ERVAxOiAkKENGSUxFUykKLQlybSAtZiBERVAyIERFUDJhCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVAyCi0JZWNobyA+IERFUDJhCi0JJChNS0RFUCkgLWYgREVQMmEgJChJTkNMVURFUykgJChDRkxBR1MpICQ/Ci0Jc2VkIC1lICcvRE8gTk9UIERFTEVURS9kJyAtZSAnL14kJC9kJyA8IERFUDJhID4+IERFUDIKLQlybSAtZiBERVAyYQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBERVAyIERFUDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBCRkRfSEAhJChCRkRfSCkhJwlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLWhvc3QtYW91dC5sbzogTWFrZWZpbGUKLQotIyBUaGUgZm9sbG93aW5nIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBzaW1wbGUgY29uZmlnIGZpbGUKLSMgd2hpY2ggY2FuIGJlIGZvbGRlZCBpbnRvIGFuIGgtWFhYIGZpbGUgZm9yIGEgbmV3IGhvc3QsIHdpdGggc29tZSBlZGl0aW5nLgotYW91dC1wYXJhbXMuaDogZ2VuLWFvdXQKLQkuL2dlbi1hb3V0IGhvc3QgPiBhb3V0LXBhcmFtcy5oCi1nZW4tYW91dDogJChzcmNkaXIpL2dlbi1hb3V0LmMgTWFrZWZpbGUKLQkkKENDKSAtbyBnZW4tYW91dCAkKENGTEFHUykgJChMRkxBR1MpICQoc3JjZGlyKS9nZW4tYW91dC5jCi0KLSQoQkZEX0gpOiBzdG1wLWJmZC1oIDsgQHRydWUKLQotc3RtcC1iZmQtaDogYmZkLWluMy5oCi0Jcm0gLWYgYmZkLXRtcC5oCi0JY3AgYmZkLWluMy5oIGJmZC10bXAuaAotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtdG1wLmggJChCRkRfSCkKLQlybSAtZiBiZmQtdG1wLmgKLQl0b3VjaCBzdG1wLWJmZC1oCi0KLSMgQ291bGQgcmVhbGx5IHVzZSBhICJjb3B5LWlmLWNoYW5nZSIuLi4KLWhlYWRlcnM6Ci0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSBwcm90b3MgJChGTEFHU19UT19QQVNTKSkKLQljcCAkKGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKLQljcCAkKGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC5oLW5ldyAkKHNyY2RpcikvbGliYmZkLmgKLQljcCAkKGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliY29mZi5oLW5ldyAkKHNyY2RpcikvbGliY29mZi5oCi0KLSMgV2Ugb25seSByZWJ1aWxkIHRoZSBoZWFkZXIgZmlsZXMgYXV0b21hdGljYWxseSBpZiB3ZSBoYXZlIGJlZW4KLSMgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLW1haW50YWluZXItbW9kZS4KLQotJChzcmNkaXIpL2JmZC1pbjIuaDogQE1BSU5UQCBzdG1wLWJpbjItaCA7IEB0cnVlCi1zdG1wLWJpbjItaDogJChCRkRfSF9GSUxFUykKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgYmZkLmgpCi0JY3AgJChkb2NkaXIpL2JmZC5oIGJmZC1pbjIuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLWluMi5oLW5ldyAkKHNyY2RpcikvYmZkLWluMi5oCi0JdG91Y2ggc3RtcC1iaW4yLWgKLQotJChzcmNkaXIpL2xpYmJmZC5oOiBATUFJTlRAIHN0bXAtbGJmZC1oIDsgQHRydWUKLXN0bXAtbGJmZC1oOiAkKExJQkJGRF9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBsaWJiZmQuaCkKLQljcCAkKGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC5oLW5ldyAkKHNyY2RpcikvbGliYmZkLmgKLQl0b3VjaCBzdG1wLWxiZmQtaAotCi0kKHNyY2RpcikvbGliY29mZi5oOiBATUFJTlRAIHN0bXAtbGNvZmYtaCA7IEB0cnVlCi1zdG1wLWxjb2ZmLWg6ICQoTElCQ09GRl9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBsaWJjb2ZmLmgpCi0JY3AgJChkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmNvZmYuaC1uZXcgJChzcmNkaXIpL2xpYmNvZmYuaAotCXRvdWNoIHN0bXAtbGNvZmYtaAotCi0jIFdlIHdhbnQgdG8gcmVydW4gY29uZmlndXJlIGlmIGNvbmZpZy5iZmQgb3IgY29uZmlndXJlLmhvc3QgY2hhbmdlLgotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvY29uZmlnLmJmZCAkKHNyY2RpcikvY29uZmlndXJlLmhvc3QKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLWVsZmFybS1vYWJpLmxvOiBlbGZhcm0tb2FiaS5jIGVsZjMyLWFybS5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotZWxmYXJtLW5hYmkubG86IGVsZmFybS1uYWJpLmMgZWxmMzItYXJtLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWFyY2hpdmUubG86IGFyY2hpdmUuYyAkKElOQ0RJUikvYW91dC9hci5oICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oCi1hcmNodXJlcy5sbzogYXJjaHVyZXMuYwotYmZkLmxvOiBiZmQuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggbGliY29mZi5oIFwKLSAgbGliZWNvZmYuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotY2FjaGUubG86IGNhY2hlLmMKLWNvZmZnZW4ubG86IGNvZmZnZW4uYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWNvcmVmaWxlLmxvOiBjb3JlZmlsZS5jCi1mb3JtYXQubG86IGZvcm1hdC5jCi1pbml0LmxvOiBpbml0LmMKLWxpYmJmZC5sbzogbGliYmZkLmMKLW9wbmNscy5sbzogb3BuY2xzLmMgJChJTkNESVIpL29iamFsbG9jLmgKLXJlbG9jLmxvOiByZWxvYy5jICQoSU5DRElSKS9iZmRsaW5rLmgKLXNlY3Rpb24ubG86IHNlY3Rpb24uYyAkKElOQ0RJUikvYmZkbGluay5oCi1zeW1zLmxvOiBzeW1zLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXRhcmdldHMubG86IHRhcmdldHMuYyAkKElOQ0RJUikvZm5tYXRjaC5oIHRhcmdtYXRjaC5oCi1oYXNoLmxvOiBoYXNoLmMgJChJTkNESVIpL29iamFsbG9jLmgKLWxpbmtlci5sbzogbGlua2VyLmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmgKLXNyZWMubG86IHNyZWMuYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWJpbmFyeS5sbzogYmluYXJ5LmMKLXRla2hleC5sbzogdGVraGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1paGV4LmxvOiBpaGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zdGFicy5sbzogc3RhYnMuYyAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1zdGFiLXN5bXMubG86IHN0YWItc3ltcy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLWNwdS1hMjlrLmxvOiBjcHUtYTI5ay5jCi1jcHUtYWxwaGEubG86IGNwdS1hbHBoYS5jCi1jcHUtYXJjLmxvOiBjcHUtYXJjLmMKLWNwdS1hcm0ubG86IGNwdS1hcm0uYwotY3B1LWQxMHYubG86IGNwdS1kMTB2LmMKLWNwdS1kMzB2LmxvOiBjcHUtZDMwdi5jCi1jcHUtZnIzMC5sbzogY3B1LWZyMzAuYwotY3B1LWg4MzAwLmxvOiBjcHUtaDgzMDAuYwotY3B1LWg4NTAwLmxvOiBjcHUtaDg1MDAuYwotY3B1LWhwcGEubG86IGNwdS1ocHBhLmMKLWNwdS1pMzg2LmxvOiBjcHUtaTM4Ni5jCi1jcHUtaTg2MC5sbzogY3B1LWk4NjAuYwotY3B1LWk5NjAubG86IGNwdS1pOTYwLmMKLWNwdS1tMzJyLmxvOiBjcHUtbTMyci5jCi1jcHUtbTY4ay5sbzogY3B1LW02OGsuYwotY3B1LW04OGsubG86IGNwdS1tODhrLmMKLWNwdS1tMTAyMDAubG86IGNwdS1tMTAyMDAuYwotY3B1LW0xMDMwMC5sbzogY3B1LW0xMDMwMC5jCi1jcHUtbWNvcmUubG86IGNwdS1tY29yZS5jCi1jcHUtbWlwcy5sbzogY3B1LW1pcHMuYwotY3B1LW5zMzJrLmxvOiBjcHUtbnMzMmsuYyBuczMyay5oCi1jcHUtcGoubG86IGNwdS1wai5jCi1jcHUtcG93ZXJwYy5sbzogY3B1LXBvd2VycGMuYwotY3B1LXJzNjAwMC5sbzogY3B1LXJzNjAwMC5jCi1jcHUtc2gubG86IGNwdS1zaC5jCi1jcHUtc3BhcmMubG86IGNwdS1zcGFyYy5jCi1jcHUtdGljMzAubG86IGNwdS10aWMzMC5jCi1jcHUtdGljODAubG86IGNwdS10aWM4MC5jCi1jcHUtdjg1MC5sbzogY3B1LXY4NTAuYwotY3B1LXZheC5sbzogY3B1LXZheC5jCi1jcHUtd2UzMmsubG86IGNwdS13ZTMyay5jCi1jcHUtdzY1LmxvOiBjcHUtdzY1LmMKLWNwdS16OGsubG86IGNwdS16OGsuYwotYW91dC1hZG9iZS5sbzogYW91dC1hZG9iZS5jICQoSU5DRElSKS9hb3V0L2Fkb2JlLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWFvdXQtYXJtLmxvOiBhb3V0LWFybS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dHguaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1hb3V0LW5zMzJrLmxvOiBhb3V0LW5zMzJrLmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICBuczMyay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1hb3V0LXNwYXJjbGUubG86IGFvdXQtc3BhcmNsZS5jICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsaWJhb3V0LmggYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotYW91dC10aWMzMC5sbzogYW91dC10aWMzMC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmggYW91dHguaAotYW91dDAubG86IGFvdXQwLmMgYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotYW91dDMyLmxvOiBhb3V0MzIuYyBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmgKLWFybW5ldGJzZC5sbzogYXJtbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1ib3V0LmxvOiBib3V0LmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggJChJTkNESVIpL2JvdXQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgbGliYW91dC5oCi1jZi1pMzg2bHlueC5sbzogY2YtaTM4Nmx5bnguYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jZi1tNjhrbHlueC5sbzogY2YtbTY4a2x5bnguYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jZi1zcGFyY2x5bngubG86IGNmLXNwYXJjbHlueC5jIGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvY29mZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hMjlrLmxvOiBjb2ZmLWEyOWsuYyAkKElOQ0RJUikvY29mZi9hMjlrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hcG9sbG8ubG86IGNvZmYtYXBvbGxvLmMgJChJTkNESVIpL2NvZmYvYXBvbGxvLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWFybS5sbzogY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWF1eC5sbzogY29mZi1hdXguYyAkKElOQ0RJUikvY29mZi9hdXgtY29mZi5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9tNjhrLmggY29mZi1tNjhrLmMgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaDgzMDAubG86IGNvZmYtaDgzMDAuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaDg1MDAubG86IGNvZmYtaDg1MDAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTM4Ni5sbzogY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTg2MC5sbzogY29mZi1pODYwLmMgJChJTkNESVIpL2NvZmYvaTg2MC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtZ28zMi5sbzogY29mZi1nbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1pOTYwLmxvOiBjb2ZmLWk5NjAuYyAkKElOQ0RJUikvY29mZi9pOTYwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1tNjhrLmxvOiBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1tODhrLmxvOiBjb2ZmLW04OGsuYyAkKElOQ0RJUikvY29mZi9tODhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1taXBzLmxvOiBjb2ZmLW1pcHMuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9taXBzLmggbGliY29mZi5oIGxpYmVjb2ZmLmggY29mZnN3YXAuaCBcCi0gIGVjb2Zmc3dhcC5oCi1jb2ZmLXBtYWMubG86IGNvZmYtcG1hYy5jIGNvZmYtcnM2MDAwLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXJzNjAwMC5sbzogY29mZi1yczYwMDAuYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvcnM2MDAwLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc2gubG86IGNvZmYtc2guYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3NoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc3BhcmMubG86IGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvY29mZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zdGdvMzIubG86IGNvZmYtc3RnbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9nbzMyZXhlLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmggXAotICBnbzMyc3R1Yi5oCi1jb2ZmLXN2bTY4ay5sbzogY29mZi1zdm02OGsuYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXRpYzMwLmxvOiBjb2ZmLXRpYzMwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXRpYzgwLmxvOiBjb2ZmLXRpYzgwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXU2OGsubG86IGNvZmYtdTY4ay5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtd2UzMmsubG86IGNvZmYtd2UzMmsuYyAkKElOQ0RJUikvY29mZi93ZTMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi13NjUubG86IGNvZmYtdzY1LmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi93NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi16OGsubG86IGNvZmYtejhrLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi96OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZmxpbmsubG86IGNvZmZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oCi1kd2FyZjEubG86IGR3YXJmMS5jICQoSU5DRElSKS9saWJpYmVydHkuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvZHdhcmYuaAotZHdhcmYyLmxvOiBkd2FyZjIuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1lY29mZi5sbzogZWNvZmYuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FyLmggXAotICAkKElOQ0RJUikvYW91dC9yYW5saWIuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBsaWJjb2ZmLmggbGliZWNvZmYuaAotZWNvZmZsaW5rLmxvOiBlY29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYmphbGxvYy5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmgKLWVsZi5sbzogZWxmLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKLWVsZjMyLWFyYy5sbzogZWxmMzItYXJjLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZmFybS1vYWJpLmxvOiBlbGZhcm0tb2FiaS5jICQoSU5DRElSKS9lbGYvYXJtLW9hYmkuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi1hcm0uaCBlbGYzMi10YXJnZXQuaAotZWxmYXJtLW5hYmkubG86IGVsZmFybS1uYWJpLmMgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggZWxmMzItYXJtLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItZDEwdi5sbzogZWxmMzItZDEwdi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWQzMHYubG86IGVsZjMyLWQzMHYuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1mcjMwLmxvOiBlbGYzMi1mcjMwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2ZyMzAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1nZW4ubG86IGVsZjMyLWdlbi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWhwcGEubG86IGVsZjMyLWhwcGEuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggbGliaHBwYS5oIFwKLSAgZWxmMzItaHBwYS5oIGVsZi1ocHBhLmggaHBwYV9zdHVicy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pMzg2LmxvOiBlbGYzMi1pMzg2LmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2kzODYuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pODYwLmxvOiBlbGYzMi1pODYwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItaTk2MC5sbzogZWxmMzItaTk2MC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9pOTYwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTMyci5sbzogZWxmMzItbTMyci5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTY4ay5sbzogZWxmMzItbTY4ay5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9tNjhrLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTg4ay5sbzogZWxmMzItbTg4ay5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZi1tMTAyMDAubG86IGVsZi1tMTAyMDAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYtbTEwMzAwLmxvOiBlbGYtbTEwMzAwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW1jb3JlLmxvOiBlbGYzMi1tY29yZS5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItbWlwcy5sbzogZWxmMzItbWlwcy5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL21pcHMuaCBlY29mZnN3YXAuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1wai5sbzogZWxmMzItcGouYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvcGouaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1wcGMubG86IGVsZjMyLXBwYy5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1zaC5sbzogZWxmMzItc2guYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvc2guaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1zcGFyYy5sbzogZWxmMzItc3BhcmMuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXY4NTAubG86IGVsZjMyLXY4NTAuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvdjg1MC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLmxvOiBlbGYzMi5jIGVsZmNvZGUuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gIGVsZmNvcmUuaCBlbGZsaW5rLmgKLWVsZmxpbmsubG86IGVsZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotZXBvYy1wZS1hcm0ubG86IGVwb2MtcGUtYXJtLmMgcGUtYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1lcG9jLXBlaS1hcm0ubG86IGVwb2MtcGVpLWFybS5jIHBlaS1hcm0uYyBjb2ZmLWFybS5jIFwKLSAgJChJTkNESVIpL2NvZmYvYXJtLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggXAotICBsaWJwZWkuaAotaHAzMDBic2QubG86IGhwMzAwYnNkLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1ocDMwMGhwdXgubG86IGhwMzAwaHB1eC5jICQoSU5DRElSKS9hb3V0L2hwMzAwaHB1eC5oIFwKLSAgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLXNvbS5sbzogc29tLmMKLWkzODZhb3V0LmxvOiBpMzg2YW91dC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmJzZC5sbzogaTM4NmJzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmR5bml4LmxvOiBpMzg2ZHluaXguYyAkKElOQ0RJUikvYW91dC9keW5peDMuaCBhb3V0eC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1pMzg2ZnJlZWJzZC5sbzogaTM4NmZyZWVic2QuYyBmcmVlYnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bGludXgubG86IGkzODZsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotaTM4Nmx5bngubG86IGkzODZseW54LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bXNkb3MubG86IGkzODZtc2Rvcy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1pMzg2bmV0YnNkLmxvOiBpMzg2bmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bWFjaDMubG86IGkzODZtYWNoMy5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotaTM4Nm9zOWsubG86IGkzODZvczlrLmMgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvb3M5ay5oCi1pZWVlLmxvOiBpZWVlLmMgJChJTkNESVIpL2llZWUuaCBsaWJpZWVlLmgKLW02OGs0a25ldGJzZC5sbzogbTY4azRrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tNjhrbGludXgubG86IG02OGtsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotbTY4a2x5bngubG86IG02OGtseW54LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tNjhrbmV0YnNkLmxvOiBtNjhrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tODhrbWFjaDMubG86IG04OGttYWNoMy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbWlwc2JzZC5sbzogbWlwc2JzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbmV3c29zMy5sbzogbmV3c29zMy5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotbmxtLmxvOiBubG0uYyBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaAotbmxtMzItaTM4Ni5sbzogbmxtMzItaTM4Ni5jICQoSU5DRElSKS9ubG0vaTM4Ni1leHQuaCBcCi0gIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKLW5sbTMyLXNwYXJjLmxvOiBubG0zMi1zcGFyYy5jICQoSU5DRElSKS9ubG0vc3BhcmMzMi1leHQuaCBcCi0gIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKLW5sbTMyLXBwYy5sbzogbmxtMzItcHBjLmMgJChJTkNESVIpL25sbS9wcGMtZXh0LmggbGlibmxtLmggXAotICAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggXAotICBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi5sbzogbmxtMzIuYyBubG1jb2RlLmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCi0gICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLW5zMzJrbmV0YnNkLmxvOiBuczMya25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotb2FzeXMubG86IG9hc3lzLmMgJChJTkNESVIpL29hc3lzLmggbGlib2FzeXMuaAotcGM1MzItbWFjaC5sbzogcGM1MzItbWFjaC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotcGUtYXJtLmxvOiBwZS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlaS1hcm0ubG86IHBlaS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlLWkzODYubG86IHBlLWkzODYuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGVpLWkzODYubG86IHBlaS1pMzg2LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlLW1jb3JlLmxvOiBwZS1tY29yZS5jIGNvZmYtbWNvcmUuYyAkKElOQ0RJUikvY29mZi9tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmggbGlicGVpLmgKLXBlaS1tY29yZS5sbzogcGVpLW1jb3JlLmMgY29mZi1tY29yZS5jICQoSU5DRElSKS9jb2ZmL21jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGUtcHBjLmxvOiBwZS1wcGMuYyBjb2ZmLXBwYy5jICQoSU5DRElSKS9jb2ZmL3Bvd2VycGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oIGxpYnBlaS5oCi1wZWktcHBjLmxvOiBwZWktcHBjLmMgY29mZi1wcGMuYyAkKElOQ0RJUikvY29mZi9wb3dlcnBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaCBsaWJwZWkuaAotcGVpZ2VuLmxvOiBwZWlnZW4uYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggbGlicGVpLmgKLXBwY2Jvb3QubG86IHBwY2Jvb3QuYwotcmVsb2MxNi5sbzogcmVsb2MxNi5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmgKLXJpc2NpeC5sbzogcmlzY2l4LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1zcGFyY2xpbnV4LmxvOiBzcGFyY2xpbnV4LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1zcGFyY2x5bngubG86IHNwYXJjbHlueC5jICQoSU5DRElSKS9hb3V0L3N1bjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLXNwYXJjbmV0YnNkLmxvOiBzcGFyY25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotc3Vub3MubG86IHN1bm9zLmMgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggYW91dGYxLmggXAotICAkKElOQ0RJUikvYW91dC9zdW40LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotdmF4bmV0YnNkLmxvOiB2YXhuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXZlcnNhZG9zLmxvOiB2ZXJzYWRvcy5jICQoSU5DRElSKS9saWJpYmVydHkuaAotdm1zLmxvOiB2bXMuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtZ3NkLmxvOiB2bXMtZ3NkLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAotdm1zLWhkci5sbzogdm1zLWhkci5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy1taXNjLmxvOiB2bXMtbWlzYy5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy10aXIubG86IHZtcy10aXIuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi14Y29mZmxpbmsubG86IHhjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaAotYW91dDY0LmxvOiBhb3V0NjQuYyBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmgKLWNvZmYtYWxwaGEubG86IGNvZmYtYWxwaGEuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9hbHBoYS5oICQoSU5DRElSKS9hb3V0L2FyLmggbGliY29mZi5oIFwKLSAgbGliZWNvZmYuaCBjb2Zmc3dhcC5oIGVjb2Zmc3dhcC5oCi1kZW1vNjQubG86IGRlbW82NC5jIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotZWxmNjQtYWxwaGEubG86IGVsZjY0LWFscGhhLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmggZWNvZmZzd2FwLmggZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LWdlbi5sbzogZWxmNjQtZ2VuLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGY2NC10YXJnZXQuaAotZWxmNjQtbWlwcy5sbzogZWxmNjQtbWlwcy5jICQoSU5DRElSKS9hb3V0L2FyLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGdlbmxpbmsuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCBlY29mZnN3YXAuaCBcCi0gIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1zcGFyYy5sbzogZWxmNjQtc3BhcmMuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LmxvOiBlbGY2NC5jIGVsZmNvZGUuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gIGVsZmNvcmUuaCBlbGZsaW5rLmgKLW5sbTMyLWFscGhhLmxvOiBubG0zMi1hbHBoYS5jICQoSU5DRElSKS9ubG0vYWxwaGEtZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG02NC5sbzogbmxtNjQuYyBubG1jb2RlLmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCi0gICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLWFpeDM4Ni1jb3JlLmxvOiBhaXgzODYtY29yZS5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLWhwdXgtY29yZS5sbzogaHB1eC1jb3JlLmMKLWlyaXgtY29yZS5sbzogaXJpeC1jb3JlLmMKLWx5bngtY29yZS5sbzogbHlueC1jb3JlLmMKLW9zZi1jb3JlLmxvOiBvc2YtY29yZS5jCi1zY281LWNvcmUubG86IHNjbzUtY29yZS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi10cmFkLWNvcmUubG86IHRyYWQtY29yZS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgaG9zdHMvaTM4NmxpbnV4LmgKLWNpc2NvLWNvcmUubG86IGNpc2NvLWNvcmUuYwotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2JmZC9QT1JUSU5HIGIvYmZkL1BPUlRJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmZkNzcuLjAwMDAwMDAKLS0tIGEvYmZkL1BPUlRJTkcKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0JUHJlbGltaW5hcnkgTm90ZXMgb24gUG9ydGluZyBCRkQKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgJ2hvc3QnIGlzIHRoZSBzeXN0ZW0gYSB0b29sIHJ1bnMgKm9uKi4KLVRoZSAndGFyZ2V0JyBpcyB0aGUgc3lzdGVtIGEgdG9vbCBydW5zICpmb3IqLCBpLmUuCi1hIHRvb2wgY2FuIHJlYWQvd3JpdGUgdGhlIGJpbmFyaWVzIG9mIHRoZSB0YXJnZXQuCi0KLVBvcnRpbmcgdG8gYSBuZXcgaG9zdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QaWNrIGEgbmFtZSBmb3IgeW91ciBob3N0LiBDYWxsIHRoYXQgPGhvc3Q+LgotKDxob3N0PiBtaWdodCBiZSBzdW40LCAuLi4pCi1DcmVhdGUgYSBmaWxlIGhvc3RzLzxob3N0Pi5taC4KLQotUG9ydGluZyB0byBhIG5ldyB0YXJnZXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QaWNrIGEgbmFtZSBmb3IgeW91ciB0YXJnZXQuIENhbGwgdGhhdCA8dGFyZ2V0Pi4KLUNhbGwgdGhlIG5hbWUgZm9yIHlvdXIgQ1BVIGFyY2hpdGVjdHVyZSA8Y3B1Pi4KLVlvdSBuZWVkIHRvIGNyZWF0ZSA8dGFyZ2V0Pi5jIGFuZCBjb25maWcvPHRhcmdldD4ubXQsCi1hbmQgYWRkIGEgY2FzZSBmb3IgaXQgdG8gYSBjYXNlIHN0YXRlbWVudHMgaW4gYmZkL2NvbmZpZ3VyZS5ob3N0IGFuZAotYmZkL2NvbmZpZy5iZmQsIHdoaWNoIGFzc29jaWF0ZXMgZWFjaCBjYW5vbmljYWwgaG9zdCB0eXBlIHdpdGggYSBCRkQKLWhvc3QgdHlwZSAodXNlZCBhcyB0aGUgYmFzZSBvZiB0aGUgbWFrZWZpbGUgZnJhZ21lbnQgbmFtZXMpLCBhbmQgdG8gdGhlCi10YWJsZSBpbiBiZmQvY29uZmlndXJlLmluIHdoaWNoIGFzc29jaWF0ZXMgZWFjaCB0YXJnZXQgdmVjdG9yIHdpdGgKLXRoZSAubyBmaWxlcyBpdCB1c2VzLgotCi1jb25maWcvPHRhcmdldD4ubXQgaXMgYSBNYWtlZmlsZSBmcmFnbWVudC4KLVRoZSBmb2xsb3dpbmcgaXMgdXN1YWxseSBlbm91Z2g6Ci1ERUZBVUxUX1ZFQ1RPUj08dGFyZ2V0Pl92ZWMKLVNFTEVDVF9BUkNISVRFQ1RVUkVTPWJmZF88Y3B1Pl9hcmNoCi0KLVNlZSB0aGUgbGlzdCBvZiBjcHUgdHlwZXMgaW4gYXJjaHVyZXMuYywgb3IgImxzIGNwdS0qLmMiLgotSWYgeW91ciBhcmNoaXRlY3R1cmUgaXMgbmV3LCB5b3UgbmVlZCB0byBhZGQgaXQgdG8gdGhlIHRhYmxlcwotaW4gYmZkL2FyY2h1cmVzLmMsIG9wY29kZXMvY29uZmlndXJlLmluLCBhbmQgYmludXRpbHMvb2JqZHVtcC5jLgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCAubXQgYW5kIC5taCBmaWxlcywgc2VlIGNvbmZpZy9SRUFETUUuCi0KLVRoZSBmaWxlIDx0YXJnZXQ+LmMgaXMgdGhlIGhhcmQgcGFydC4gIEl0IGltcGxlbWVudHMgdGhlCi1iZmRfdGFyZ2V0IDx0YXJnZXQ+X3ZlYywgd2hpY2ggaW5jbHVkZXMgcG9pbnRlcnMgdG8KLWZ1bmN0aW9ucyB0aGF0IGRvIHRoZSBhY3R1YWwgPHRhcmdldD4tc3BlY2lmaWMgbWV0aG9kcy4KLQotUG9ydGluZyB0byBhIDx0YXJnZXQ+IHRoYXQgdXNlcyB0aGUgYS5vdXQgYmluYXJ5IGZvcm1hdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JbiB0aGlzIGNhc2UsIHRoZSBpbmNsdWRlIGZpbGUgYW91dC10YXJnZXQuaCBwcm9iYWJ5IGRvZXMgbW9zdAotb2Ygd2hhdCB5b3UgbmVlZC4gVGhlIHByb2dyYW0gZ2VuLWFvdXQgZ2VuZXJhdGVzIDx0YXJnZXQ+LmMgZm9yCi15b3UgYXV0b21hdGljYWxseSBmb3IgbWFueSBhLm91dCBzeXN0ZW1zLiAgRG86Ci0JbWFrZSBnZW4tYW91dAotCS4vZ2VuLWFvdXQgPHRhcmdldD4gPiA8dGFyZ2V0Pi5jCi0oVGhpcyBvbmx5IHdvcmtzIGlmIHlvdSBhcmUgYnVpbGRpbmcgb24gdGhlIHRhcmdldCAoIm5hdGl2ZSIpLgotSWYgeW91IG11c3QgbWFrZSBhIGNyb3NzLXBvcnQgZnJvbSBzY3JhdGNoLCBjb3B5IHRoZSBtb3N0Ci1zaW1pbGFyIGV4aXN0aW5nIGZpbGUgdGhhdCBpbmNsdWRlcyBhb3V0LXRhcmdldC5oLCBhbmQgZml4IHdoYXQgaXMgd3JvbmcuKQotCi1DaGVjayB0aGUgcGFyYW1ldGVycyBpbiA8dGFyZ2V0Pi5jLCBhbmQgZml4IGFueXRoaW5nIHRoYXQgaXMgd3JvbmcuCi0oQWxzbyBsZXQgdXMga25vdyBhYm91dCBpdDsgcGVyaGFwcyB3ZSBjYW4gaW1wcm92ZSBnZW4tYW91dC5jLikKLQotVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCVNob3VsZCBiZSBkZWZpbmVkIGlmIDx0YXJnZXQ+IGlzIGJpZy1lbmRpYW4uCi0KLU5fSEVBREVSX0lOX1RFWFQoeCkKLQlTZWUgZGlzY3Vzc2lvbiBpbiAuLi9pbmNsdWRlL2FvdXQvYW91dDY0LmguCi0KLUJZVEVTX0lOX1dPUkQKLQlOdW1iZXIgb2YgYnl0ZXMgcGVyIHdvcmQuIChVc3VhbGx5IDQgYnV0IGNhbiBiZSA4LikKLQotQVJDSAotCU51bWJlciBvZiBiaXRzIHBlciB3b3JkLiAgKFVzdWFsbHkgMzIsIGJ1dCBjYW4gYmUgNjQuKQotCi1FTlRSWV9DQU5fQkVfWkVSTwotCURlZmluZSBpZiB0aGUgZXh0cnkgcG9pbnQgKHN0YXJ0IGFkZHJlc3Mgb2YgYW4KLQlleGVjdXRhYmxlIHByb2dyYW0pIGNhbiBiZSAweDAuCi0KLVRFWFRfU1RBUlRfQUREUgotCVRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWdlbW50IGluCi0JdmlydHVhbCBtZW1vcnkuICBOb3JtYWxseSwgdGhlIHNhbWUgYXMgdGhlIGVudHJ5IHBvaW50LgotCi1UQVJHRVRfUEFHRV9TSVpFCi0KLVNFR01FTlRfU0laRQotICAgICAgICBVc3VhbGx5LCB0aGUgc2FtZSBhcyB0aGUgVEFSR0VUX1BBR0VfU0laRS4KLSAgICAgICAgQWxpZ25tZW50IG5lZWRlZCBmb3IgdGhlIGRhdGEgc2VnbWVudC4KLQotVEFSR0VUTkFNRQotCVRoZSBuYW1lIG9mIHRoZSB0YXJnZXQsIGZvciBydW4tdGltZSBsb29rdXBzLgotCVVzdWFsbHkgImEub3V0LTx0YXJnZXQ+IgpkaWZmIC0tZ2l0IGEvYmZkL1JFQURNRSBiL2JmZC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxY2UxMzMuLjAwMDAwMDAKLS0tIGEvYmZkL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLUJGRCBpcyBhIGFuIG9iamVjdCBmaWxlIGxpYnJhcnkuICBJdCBwZXJtaXRzIGFwcGxpY2F0aW9ucyB0byB1c2UgdGhlCi1zYW1lIHJvdXRpbmVzIHRvIHByb2Nlc3Mgb2JqZWN0IGZpbGVzIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgZm9ybWF0LgotCi1CRkQgaXMgdXNlZCBieSB0aGUgR05VIGRlYnVnZ2VyLCBhc3NlbWJsZXIsIGxpbmtlciwgYW5kIHRoZSBiaW5hcnkKLXV0aWxpdGllcy4KLQotVGhlIGRvY3VtZW50YXRpb24gb24gdXNpbmcgQkZEIGlzIHNjYW50eSBhbmQgbWF5IGJlIG9jY2FzaW9uYWxseQotaW5jb3JyZWN0LiAgUG9pbnRlcnMgdG8gZG9jdW1lbnRhdGlvbiBwcm9ibGVtcywgb3IgYW4gZW50aXJlbHkKLXJld3JpdHRlbiBtYW51YWwsIHdvdWxkIGJlIGFwcHJlY2lhdGVkLgotCi1UaGVyZSBpcyBzb21lIEJGRCBpbnRlcm5hbHMgZG9jdW1lbnRhdGlvbiBpbiBkb2MvYmZkaW50LnRleGkgd2hpY2ggbWF5Ci1oZWxwIHByb2dyYW1tZXJzIHdobyB3YW50IHRvIG1vZGlmeSBCRkQuCi0KLUJGRCBpcyBub3JtYWxseSBidWlsdCBhcyBwYXJ0IG9mIGFub3RoZXIgcGFja2FnZS4gIFNlZSB0aGUgYnVpbGQKLWluc3RydWN0aW9ucyBmb3IgdGhhdCBwYWNrYWdlLCBwcm9iYWJseSBpbiBhIFJFQURNRSBmaWxlIGluIHRoZQotYXBwcm9wcmlhdGUgZGlyZWN0b3J5LgotCi1CRkQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb25maWd1cmUgb3B0aW9uczoKLQotICAtLXRhcmdldD1UQVJHRVQKLQlUaGUgZGVmYXVsdCB0YXJnZXQgZm9yIHdoaWNoIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LiAgVEFSR0VUIGlzCi0JYSBjb25maWd1cmF0aW9uIHRhcmdldCB0cmlwbGV0LCBzdWNoIGFzIHNwYXJjLXN1bi1zb2xhcmlzLgotICAtLWVuYWJsZS10YXJnZXRzPVRBUkdFVCxUQVJHRVQsVEFSR0VULi4uCi0JQWRkaXRpb25hbCB0YXJnZXRzIHRoZSBsaWJyYXJ5IHNob3VsZCBzdXBwb3J0LiAgVG8gaW5jbHVkZQotCXN1cHBvcnQgZm9yIGFsbCBrbm93biB0YXJnZXRzLCB1c2UgLS1lbmFibGUtdGFyZ2V0cz1hbGwuCi0gIC0tZW5hYmxlLTY0LWJpdC1iZmQKLQlJbmNsdWRlIHN1cHBvcnQgZm9yIDY0IGJpdCB0YXJnZXRzLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5Ci0JdHVybmVkIG9uIGlmIHlvdSBleHBsaWNpdGx5IHJlcXVlc3QgYSA2NCBiaXQgdGFyZ2V0LCBidXQgbm90Ci0JZm9yIC0tZW5hYmxlLXRhcmdldHM9YWxsLiAgVGhpcyByZXF1aXJlcyBhIGNvbXBpbGVyIHdpdGggYSA2NAotCWJpdCBpbnRlZ2VyIHR5cGUsIHN1Y2ggYXMgZ2NjLgotICAtLWVuYWJsZS1zaGFyZWQKLQlCdWlsZCBCRkQgYXMgYSBzaGFyZWQgbGlicmFyeS4KLSAgLS13aXRoLW1tYXAKLQlVc2UgbW1hcCB3aGVuIGFjY2Vzc2luZyBmaWxlcy4gIFRoaXMgaXMgZmFzdGVyIG9uIHNvbWUgaG9zdHMsCi0JYnV0IHNsb3dlciBvbiBvdGhlcnMuICBJdCBtYXkgbm90IHdvcmsgb24gYWxsIGhvc3RzLgotCi1SZXBvcnQgYnVncyB3aXRoIEJGRCB0byBidWctZ251LXV0aWxzQGdudS5vcmcuCi0KLVBhdGNoZXMgYXJlIGVuY291cmFnZWQuICBXaGVuIHNlbmRpbmcgcGF0Y2hlcywgYWx3YXlzIHNlbmQgdGhlIG91dHB1dAotb2YgZGlmZiAtdSBvciBkaWZmIC1jIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUgdG8gdGhlIG5ldyBmaWxlLiAgRG8gbm90Ci1zZW5kIGRlZmF1bHQgZGlmZiBvdXRwdXQuICBEbyBub3QgbWFrZSB0aGUgZGlmZiBmcm9tIHRoZSBuZXcgZmlsZSB0bwotdGhlIG9yaWdpbmFsIGZpbGUuICBSZW1lbWJlciB0aGF0IGFueSBwYXRjaCBtdXN0IG5vdCBicmVhayBvdGhlcgotc3lzdGVtcy4gIFJlbWVtYmVyIHRoYXQgQkZEIG11c3Qgc3VwcG9ydCBjcm9zcyBjb21waWxhdGlvbiBmcm9tIGFueQotaG9zdCB0byBhbnkgdGFyZ2V0LCBzbyBwYXRjaGVzIHdoaWNoIHVzZSBgYCNpZmRlZiBIT1NUJycgYXJlIG5vdAotYWNjZXB0YWJsZS4gIFBsZWFzZSBhbHNvIHJlYWQgdGhlIGBgUmVwb3J0aW5nIEJ1Z3MnJyBzZWN0aW9uIG9mIHRoZQotZ2NjIG1hbnVhbC4KLQotQnVnIHJlcG9ydHMgd2l0aG91dCBwYXRjaGVzIHdpbGwgYmUgcmVtZW1iZXJlZCwgYnV0IHRoZXkgbWF5IG5ldmVyIGdldAotZml4ZWQgdW50aWwgc29tZWJvZHkgdm9sdW50ZWVycyB0byBmaXggdGhlbS4KZGlmZiAtLWdpdCBhL2JmZC9UT0RPIGIvYmZkL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTI3MzUuLjAwMDAwMDAKLS0tIGEvYmZkL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1UaGluZ3MgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIGRvbmU6IC0qLSBUZXh0IC0qLQotCi0gbyAtIEEgc291cmNlIG9mIHNwYWNlIGxvc3NhZ2UgaXMgdGhhdCBhbGwgdGhlIHRhcmdldC1kZXBlbmRlbnQgY29kZQotICAgICBpcyBpbiBhIHNpbmdsZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4gIEhlbmNlIGFsbCB0aGUgY29kZSBmb3IKLSAgICAgKndyaXRpbmcqIG9iamVjdCBmaWxlcyBpcyBzdGlsbCBwdWxsZWQgaW50byBhbGwgdGhlIGFwcGxpY2F0aW9ucwotICAgICB0aGF0IG9ubHkgY2FyZSBhYm91dCAqcmVhZGluZyogKGdkYiwgbm0sIG9iamR1bXApLCB3aGlsZSBnYXMgaGFzCi0gICAgIHRvIGNhcnJ5IGFsb25nIGFsbCB0aGUgdW5uZWVkZWQgYmFnZ2FnZSBmb3IgcmVhZGluZyBvYmplY3RzLiAgQW5kCi0gICAgIHNvIG9uLiAgVGhpcyB3b3VsZCBiZSBhIHN1YnN0YW50aWFsIGNoYW5nZSwgYW5kIHRoZSBwYXlvZmYgd291bGQKLSAgICAgbm90IGFsbCB0aGF0IGdyZWF0IChlc3NlbnRpYWxseSBub25lIGlmIGJmZCBpcyB1c2VkIGFzIGEgc2hhcmVkCi0gICAgIGxpYnJhcnkpLgotCi0gbyAtIFRoZSBzdG9yYWdlIG5lZWRlZCBieSBCRkQgZGF0YSBzdHJ1Y3R1cmVzIGlzIGFsc28gbGFyZ2VyIHRoYW4gc3RyaWN0bHkKLSAgICAgbmVlZGVkLiAgVGhpcyBtYXkgYmUgZGlmZmljdWx0IHRvIGRvIG11Y2ggYWJvdXQuCi0KLSBvIC0gaW1wbGVtZW50IGJmZF9hYm9ydCwgd2hpY2ggc2hvdWxkIGNsb3NlIHRoZSBiZmQgYnV0IG5vdCBhbHRlciB0aGUKLSAgICAgZmlsZXN5c3RlbS4KLQotIG8gLSB1cGRhdGUgdGhlIGJmZCBkb2M7IHdyaXRlIGEgaG93LXRvLXdyaXRlLWEtYmFja2VuZCBkb2MsIHRha2Ugb3V0Ci0gICAgIHRoZSBzdHVwaWQgcXVpcHMgYW5kIGZpbGwgaW4gYWxsIHRoZSBibGFua3MuCi0KLSBvIC0gdXBncmFkZSB0aGUgcmVsb2MgaGFuZGxpbmcgYXMgcGVyIFN0ZXZlJ3Mgc3VnZ2VzdGlvbi4KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYmZkL2FjaW5jbHVkZS5tNCBiL2JmZC9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYzI2ZTguLjAwMDAwMDAKLS0tIGEvYmZkL2FjaW5jbHVkZS5tNAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi1kbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCB0byB1c2UgZm9wZW4tYmluLmggcmF0aGVyIHRoYW4gZm9wZW4tc2FtZS5oLgotQUNfREVGVU4oQkZEX0JJTkFSWV9GT1BFTiwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfU1lTVEVNXSkKLWNhc2UgIiR7aG9zdH0iIGluCi1jaGFuZ2VxdW90ZSgsKWRubAotKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotICBBQ19ERUZJTkUoVVNFX0JJTkFSWV9GT1BFTiwgMSwgW1VzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/XSkgOzsKLWVzYWNdKWRubAotCi1kbmwgR2V0IGEgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIHRvIHB1dCBpbnRvIE1ha2VmaWxlLgotQUNfREVGVU4oQkZEX0NDX0ZPUl9CVUlMRCwKLVsjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIGVsc2UKLSAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gIGZpCi1maQotQUNfU1VCU1QoQ0NfRk9SX0JVSUxEKQotIyBBbHNvIHNldCBFWEVFWFRfRk9SX0JVSUxELgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgRVhFRVhUX0ZPUl9CVUlMRD0nJChFWEVFWFQpJwotZWxzZQotICBBQ19DQUNIRV9DSEVDSyhbZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeF0sIGJmZF9jdl9idWlsZF9leGVleHQsCi0gICAgW3JtIC1mIGNvbmZ0ZXN0KgotICAgICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LmMKLSAgICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD0KLSAgICAgJHtDQ19GT1JfQlVJTER9IC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgMT4mNSAyPiY1Ci0gICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICAqKSBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgICBlc2FjCi0gICAgIGRvbmUKLSAgICAgcm0gLWYgY29uZnRlc3QqCi0gICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ub10pCi0gIEVYRUVYVF9GT1JfQlVJTEQ9IiIKLSAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KLWZpCi1BQ19TVUJTVChFWEVFWFRfRk9SX0JVSUxEKV0pZG5sCi0KLWRubCBTZWUgd2hldGhlciB3ZSBuZWVkIGEgZGVjbGFyYXRpb24gZm9yIGEgZnVuY3Rpb24uCi1BQ19ERUZVTihCRkRfTkVFRF9ERUNMQVJBVElPTiwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgJDEgbXVzdCBiZSBkZWNsYXJlZF0pCi1BQ19DQUNIRV9WQUwoYmZkX2N2X2RlY2xfbmVlZGVkXyQxLAotW0FDX1RSWV9DT01QSUxFKFsKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZl0sCi1bY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgJDFdLAotYmZkX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBiZmRfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKV0pCi1BQ19NU0dfUkVTVUxUKCRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEpCi1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEgPSB5ZXM7IHRoZW4KLSAgQUNfREVGSU5FKFtORUVEX0RFQ0xBUkFUSU9OX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQotZmkKLV0pZG5sCi0KLWRubCBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIGEgdHlwZSAkMSBpbiBzeXMvcHJvY2ZzLmgKLQotQUNfREVGVU4oQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFLAotW0FDX01TR19DSEVDS0lORyhbZm9yICQxIGluIHN5cy9wcm9jZnMuaF0pCi0gQUNfQ0FDSEVfVkFMKGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXJdLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxPXllcywKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMT1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxID0geWVzOyB0aGVuCi0gICBBQ19ERUZJTkUoW0hBVkVfXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSkKLV0pCi0KLQotZG5sIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgbWVtYmVyICQyIGluIHR5cGUgJDEgaW4gc3lzL3Byb2Nmcy5oCi0KLUFDX0RFRlVOKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIsCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEuJDIgaW4gc3lzL3Byb2Nmcy5oXSkKLSBBQ19DQUNIRV9WQUwoYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLiQyXSwKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDI9eWVzLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMj1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiA9IHllczsgdGhlbgotICAgQUNfREVGSU5FKFtIQVZFX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKVtfXXRyYW5zbGl0KCQyLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuJDIuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIpCi1dKQotCi0KZGlmZiAtLWdpdCBhL2JmZC9hY2xvY2FsLm00IGIvYmZkL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYWVmN2MuLjAwMDAwMDAKLS0tIGEvYmZkL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE3ICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40Ci0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1kbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCB0byB1c2UgZm9wZW4tYmluLmggcmF0aGVyIHRoYW4gZm9wZW4tc2FtZS5oLgotQUNfREVGVU4oQkZEX0JJTkFSWV9GT1BFTiwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfU1lTVEVNXSkKLWNhc2UgIiR7aG9zdH0iIGluCi1jaGFuZ2VxdW90ZSgsKWRubAotKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotICBBQ19ERUZJTkUoVVNFX0JJTkFSWV9GT1BFTiwgMSwgW1VzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/XSkgOzsKLWVzYWNdKWRubAotCi1kbmwgR2V0IGEgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIHRvIHB1dCBpbnRvIE1ha2VmaWxlLgotQUNfREVGVU4oQkZEX0NDX0ZPUl9CVUlMRCwKLVsjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCi1pZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgotICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCi0gIGVsc2UKLSAgICBDQ19GT1JfQlVJTEQ9Z2NjCi0gIGZpCi1maQotQUNfU1VCU1QoQ0NfRk9SX0JVSUxEKQotIyBBbHNvIHNldCBFWEVFWFRfRk9SX0JVSUxELgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgRVhFRVhUX0ZPUl9CVUlMRD0nJChFWEVFWFQpJwotZWxzZQotICBBQ19DQUNIRV9DSEVDSyhbZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeF0sIGJmZF9jdl9idWlsZF9leGVleHQsCi0gICAgW3JtIC1mIGNvbmZ0ZXN0KgotICAgICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LmMKLSAgICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD0KLSAgICAgJHtDQ19GT1JfQlVJTER9IC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgMT4mNSAyPiY1Ci0gICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICAqKSBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgICBlc2FjCi0gICAgIGRvbmUKLSAgICAgcm0gLWYgY29uZnRlc3QqCi0gICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ub10pCi0gIEVYRUVYVF9GT1JfQlVJTEQ9IiIKLSAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KLWZpCi1BQ19TVUJTVChFWEVFWFRfRk9SX0JVSUxEKV0pZG5sCi0KLWRubCBTZWUgd2hldGhlciB3ZSBuZWVkIGEgZGVjbGFyYXRpb24gZm9yIGEgZnVuY3Rpb24uCi1BQ19ERUZVTihCRkRfTkVFRF9ERUNMQVJBVElPTiwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgJDEgbXVzdCBiZSBkZWNsYXJlZF0pCi1BQ19DQUNIRV9WQUwoYmZkX2N2X2RlY2xfbmVlZGVkXyQxLAotW0FDX1RSWV9DT01QSUxFKFsKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZl0sCi1bY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgJDFdLAotYmZkX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBiZmRfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKV0pCi1BQ19NU0dfUkVTVUxUKCRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEpCi1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEgPSB5ZXM7IHRoZW4KLSAgQUNfREVGSU5FKFtORUVEX0RFQ0xBUkFUSU9OX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQotZmkKLV0pZG5sCi0KLWRubCBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIGEgdHlwZSAkMSBpbiBzeXMvcHJvY2ZzLmgKLQotQUNfREVGVU4oQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFLAotW0FDX01TR19DSEVDS0lORyhbZm9yICQxIGluIHN5cy9wcm9jZnMuaF0pCi0gQUNfQ0FDSEVfVkFMKGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXJdLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxPXllcywKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMT1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxID0geWVzOyB0aGVuCi0gICBBQ19ERUZJTkUoW0hBVkVfXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSkKLV0pCi0KLQotZG5sIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgbWVtYmVyICQyIGluIHR5cGUgJDEgaW4gc3lzL3Byb2Nmcy5oCi0KLUFDX0RFRlVOKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIsCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEuJDIgaW4gc3lzL3Byb2Nmcy5oXSkKLSBBQ19DQUNIRV9WQUwoYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLiQyXSwKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDI9eWVzLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMj1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiA9IHllczsgdGhlbgotICAgQUNfREVGSU5FKFtIQVZFX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKVtfXXRyYW5zbGl0KCQyLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuJDIuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIpCi1dKQotCi0KLQotIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoIC0tCi0jIHNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZiB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4KLSMgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCi0KLSMgc2VyaWFsIDEKLQotZG5sIFVzYWdlOgotZG5sIEFNX0lOSVRfQVVUT01BS0UocGFja2FnZSx2ZXJzaW9uLCBbbm8tZGVmaW5lXSkKLQotQUNfREVGVU4oQU1fSU5JVF9BVVRPTUFLRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKQotUEFDS0FHRT1bJDFdCi1BQ19TVUJTVChQQUNLQUdFKQotVkVSU0lPTj1bJDJdCi1BQ19TVUJTVChWRVJTSU9OKQotZG5sIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQotZmkKLWlmZWxzZShbJDNdLCwKLUFDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKLUFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pKQotQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSkKLUFDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSkKLWRubCBGSVhNRSBUaGlzIGlzIHRydWx5IGdyb3NzLgotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLUFNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlciwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbywgJG1pc3NpbmdfZGlyKQotQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pXSkKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4KLSMKLQotQUNfREVGVU4oQU1fU0FOSVRZX0NIRUNLLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiWyRdKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIlskXSoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiWyRdKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiWyRdMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotQUNfTVNHX1JFU1VMVCh5ZXMpXSkKLQotZG5sIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNLCBESVJFQ1RPUlkpCi1kbmwgVGhlIHByb2dyYW0gbXVzdCBwcm9wZXJseSBpbXBsZW1lbnQgLS12ZXJzaW9uLgotQUNfREVGVU4oQU1fTUlTU0lOR19QUk9HLAotW0FDX01TR19DSEVDS0lORyhmb3Igd29ya2luZyAkMikKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmICgkMiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICQxPSQyCi0gICBBQ19NU0dfUkVTVUxUKGZvdW5kKQotZWxzZQotICAgJDE9IiQzL21pc3NpbmcgJDIiCi0gICBBQ19NU0dfUkVTVUxUKG1pc3NpbmcpCi1maQotQUNfU1VCU1QoJDEpXSkKLQotCi0jIHNlcmlhbCAzNSBBQ19QUk9HX0xJQlRPT0wKLUFDX0RFRlVOKEFDX1BST0dfTElCVE9PTCwKLVtBQ19SRVFVSVJFKFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1BQ19DQUNIRV9TQVZFCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgQUNfTVNHX0VSUk9SKFtsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWRdKQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1BQ19DQUNIRV9MT0FECi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1BQ19TVUJTVChMSUJUT09MKWRubAotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi1dKQotCi1BQ19ERUZVTihBQ19MSUJUT09MX1NFVFVQLAotW0FDX1BSRVJFUSgyLjEzKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKLWRubAotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCi0gICAgW0FDX1RSWV9MSU5LKFtdLFtdLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKV0pCi0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICBBQ19TWVNfTElCVE9PTF9DWUdXSU4KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotQUNfQVJHX0VOQUJMRShsaWJ0b29sLWxvY2ssCi1bICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmddLAotbmVlZF9sb2Nrcz0kZW5hYmxldmFsLAotbmVlZF9sb2Nrcz15ZXMpCi0KLWlmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KLSAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi1maQotXSkKLQotIyBBQ19MSUJUT09MX0RMT1BFTiAtIGNoZWNrIGZvciBkbG9wZW4gc3VwcG9ydAotQUNfREVGVU4oQUNfTElCVE9PTF9ETE9QRU4sIFtsdF9kbG9wZW49eWVzXSkKLQotIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU0hBUkVELAotW2RlZmluZShbQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHNoYXJlZCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3NoYXJlZD1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU0hBUkVEIC0gc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU0hBUkVELAotW0FDX0VOQUJMRV9TSEFSRUQobm8pXSkKLQotIyBBQ19FTkFCTEVfU1RBVElDIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NUQVRJQ1soREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU1RBVElDLAotW2RlZmluZShbQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHN0YXRpYywKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3N0YXRpYz1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU1RBVElDIC0gc2V0IHRoZSBkZWZhdWx0IHN0YXRpYyBmbGFnIHRvIC0tZGlzYWJsZS1zdGF0aWMKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU1RBVElDLAotW0FDX0VOQUJMRV9TVEFUSUMobm8pXSkKLQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwsCi1bZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoZmFzdC1pbnN0YWxsLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD0+PkFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9mYXN0X2luc3RhbGw9QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gc2V0IHRoZSBkZWZhdWx0IHRvIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwKLUFDX0RFRlVOKEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMLAotW0FDX0VOQUJMRV9GQVNUX0lOU1RBTEwobm8pXSkKLQotCi0jIEFDX1BST0dfTEQgLSBmaW5kIHRoZSBwYXRoIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKLUFDX0RFRlVOKEFDX1BST0dfTEQsCi1bQUNfQVJHX1dJVEgoZ251LWxkLAotWyAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXV0sCi10ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMsIHdpdGhfZ251X2xkPW5vKQotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotY2hhbmdlcXVvdGUoLClkbmwKLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQotZWxzZQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKLWZpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9MRCwKLVtpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotQUNfU1VCU1QoTEQpCi1BQ19QUk9HX0xEX0dOVQotXSkKLQotQUNfREVGVU4oQUNfUFJPR19MRF9HTlUsCi1bQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgYWNfY3ZfcHJvZ19nbnVfbGQsCi1bIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maV0pCi1dKQotCi0jIEFDX1BST0dfTk0gLSBmaW5kIHRoZSBwYXRoIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKLUFDX0RFRlVOKEFDX1BST0dfTk0sCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTk0sCi1baWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maV0pCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1BQ19NU0dfUkVTVUxUKFskTk1dKQotQUNfU1VCU1QoTk0pCi1dKQotCi0jIEFDX1NZU19OTV9QQVJTRSAtIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZAotIyBieSBDIHN5bWJvbCBuYW1lIGZyb20gbm0uCi1BQ19ERUZVTihBQ19TWVNfTk1fUEFSU0UsCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotQUNfTVNHX0NIRUNLSU5HKFtjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUsCi1bIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQotCi1jaGFuZ2VxdW90ZSgsKWRubAotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJGFjX3N5bWNvZGVcKVsgCV1bIAldKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIAotICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1jaGFuZ2VxdW90ZSgsKWRubAotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci1jaGFuZ2VxdW90ZShbLF0pZG5sCi17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotCSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi0JICBmaQotCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotXSkKLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1BQ19NU0dfUkVTVUxUKCRhY19yZXN1bHQpCi1dKQotCi0jIEFDX1NZU19MSUJUT09MX0NZR1dJTiAtIGZpbmQgdG9vbHMgbmVlZGVkIG9uIGN5Z3dpbgotQUNfREVGVU4oQUNfU1lTX0xJQlRPT0xfQ1lHV0lOLAotW0FDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCi1BQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi1dKQotCi0jIEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSAtIGRvZXMgdGhlIGNvbXBpbGVyIHByZWZpeCBnbG9iYWwgc3ltYm9scwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIHVuZGVyc2NvcmU/Ci1BQ19ERUZVTihBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAotQUNfTVNHX0NIRUNLSU5HKFtmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9sc10pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlLAotW2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICBhY19ubGlzdD1jb25mdGVzdC5ubQotICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi1maQotcm0gLXJmIGNvbmZ0ZXN0KgotXSkKLUFDX01TR19SRVNVTFQoJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSkKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KLUFDX1NVQlNUKFVTRV9TWU1CT0xfVU5ERVJTQ09SRSlkbmwKLV0pCi0KLSMgQUNfQ0hFQ0tfTElCTSAtIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKLUFDX0RFRlVOKEFDX0NIRUNLX0xJQk0sIFsKLUFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wpCi1BQ19DSEVDS19MSUIobSwgY29zKQotXSkKLQotIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSwgYWRkcyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi1BQ19ERUZVTihBQ19MSUJMVERMX0NPTlZFTklFTkNFLCBbCi0gIGNhc2UgIiRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSIgaW4KLSAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7Ci0gICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKLSAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKLSAgZXNhYwotICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKLV0pCi0KLSMgQUNfTElCTFRETF9JTlNUQUxMQUJMRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnksIGFuZCBhZGRzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotIyBJbiB0aGUgZnV0dXJlLCB0aGlzIG1hY3JvIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBhZnRlciBBQ19QUk9HX0xJQlRPT0wuCi1BQ19ERUZVTihBQ19MSUJMVERMX0lOU1RBTExBQkxFLCBbCi0gIEFDX0NIRUNLX0xJQihsdGRsLCBtYWluLCBMSUJMVERMPSItbGx0ZGwiLCBbCi0gICAgY2FzZSAiJGVuYWJsZV9sdGRsX2luc3RhbGwiIGluCi0gICAgbm8pIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKSA7OwotICAgICIiKSBlbmFibGVfbHRkbF9pbnN0YWxsPXllcwotICAgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIgOzsKLSAgICBlc2FjCi0gIF0pCi0gIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geCJubyI7IHRoZW4KLSAgICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbC5sYQotICBmaQotXSkKLQotZG5sIG9sZCBuYW1lcwotQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLCBbaW5kaXIoW0FDX1BST0dfTElCVE9PTF0pXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRU5BQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0VOQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRElTQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRElTQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fUFJPR19MRCwgW2luZGlyKFtBQ19QUk9HX0xEXSldKWRubAotQUNfREVGVU4oQU1fUFJPR19OTSwgW2luZGlyKFtBQ19QUk9HX05NXSldKWRubAotQUNfREVGVU4oQU1fU1lTX05NX1BBUlNFLCBbaW5kaXIoW0FDX1NZU19OTV9QQVJTRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwgW2luZGlyKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTElCVE9PTF9DWUdXSU4sIFtpbmRpcihbQUNfU1lTX0xJQlRPT0xfQ1lHV0lOXSldKWRubAotCi0jIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCi0KLUFDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCi1bQUNfUFJFUkVRKFsyLjEyXSkKLUFDX0NPTkZJR19IRUFERVIoWyQxXSkKLWRubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKLWRubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KLUFDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKLWlmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKLTw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCi08PGFtX2luZHg9MQotZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbwotICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCi0gICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+Ci0gICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKLSAgICA7OwotICBlc2FjCi0gIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAotZG9uZTw8Pj5kbmw+PikKLWNoYW5nZXF1b3RlKFssXSkpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotQUNfREVGVU4oQ1lfV0lUSF9OTFMsCi0gIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKLSAgICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAotICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKLSAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICAgIEFDX1NVQlNUKFVTRV9OTFMpCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCi0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQotICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KLQlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KLQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKLQkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAotCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCi0JICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKLQkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCi0JCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCi0JCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCi0gICAgZmkKLSAgZmldKQotCmRpZmYgLS1naXQgYS9iZmQvYWl4Mzg2LWNvcmUuYyBiL2JmZC9haXgzODYtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjY3YjE3Li4wMDAwMDAwCi0tLSBhL2JmZC9haXgzODYtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQUlYIG9uIFBTLzIgY29yZSBmaWxlcy4KLSAgIFRoaXMgd2FzIGJhc2VkIG9uIHRyYWQtY29yZS5jLCB3aGljaCB3YXMgd3JpdHRlbiBieSBKb2huIEdpbG1vcmUgb2YKLSAgICAgICAgQ3lnbnVzIFN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk4OCwgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWluaCBUcmFuLUxlIDxUUkFOTEVASU5URUxMSUNPUlAuQ09NPi4KLSAgIENvbnZlcnRlZCB0byBiYWNrIGVuZCBmb3JtIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pMzg2LmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jaWYgZGVmaW5lZCAoX0FJWCkgJiYgZGVmaW5lZCAoX0kzODYpCi0jZGVmaW5lIE5PQ0hFQ0tTCQkvKiB0aGlzIGlzIGZvciBjb3JlZHVtcC5oICovCi0jZGVmaW5lIF9oX1VTRVIJCQkvKiBhdm9pZCBpbmNsdWRpbmcgdXNlci5oIGZyb20gY29yZWR1bXAuaCAqLwotI2luY2x1ZGUgPHVpbmZvLmg+Ci0jaW5jbHVkZSA8c3lzL2kzODYvY29yZWR1bXAuaD4KLSNlbmRpZiAvKiBfQUlYICYmIF9JMzg2ICovCi0KLS8qIG1heWJlIHRoaXMgY291bGQgd29yayBvbiBzb21lIG90aGVyIGkzODYgYnV0IEkgaGF2ZSBub3QgdHJpZWQgaXQKLSAqIG10cmFubGVAcGFyaXMgLSBUdWUgU2VwIDI0IDEyOjQ5OjM1IDE5OTEKLSAqLwotCi0jaWZuZGVmIENPUl9NQUdJQwotIyBkZWZpbmUgQ09SX01BR0lDICJjb3JlIgotI2VuZGlmCi0KLS8qIG5lZWQgdGhpcyBjYXN0IGJlY2F1c2UgcHRyIGlzIHJlYWxseSB2b2lkICogKi8KLSNkZWZpbmUgY29yZV9oZHIoYmZkKSBcCi0gICAgKCgoYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YSkpLT5oZHIpCi0jZGVmaW5lIGNvcmVfc2VjdGlvbihiZmQsbikgXAotICAgICgoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhKS0+c2VjdGlvbnNbbl0pCi0jZGVmaW5lIGNvcmVfcmVnc2VjKGJmZCkgXAotICAgICgoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhKS0+cmVnX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfcmVnMnNlYyhiZmQpIFwKLSAgICAoKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YSktPnJlZzJfc2VjdGlvbikKLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KLXN0cnVjdCB0cmFkX2NvcmVfc3RydWN0IHsKLSAgc3RydWN0IGNvcmVoZHIgKmhkcjsJCS8qIGNvcmUgZmlsZSBoZWFkZXIgKi8KLSAgYXNlY3Rpb24gKnJlZ19zZWN0aW9uOwotICBhc2VjdGlvbiAqcmVnMl9zZWN0aW9uOwotICBhc2VjdGlvbiAqc2VjdGlvbnNbTUFYX0NPUkVfU0VHU107Ci19OwotCi1zdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYWl4Mzg2X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBpLG47Ci0gIHVuc2lnbmVkIGNoYXIgbG9uZ2J1Zls0XTsJLyogUmF3IGJ5dGVzIG9mIHZhcmlvdXMgaGVhZGVyIGZpZWxkcyAqLwotICBpbnQgY29yZV9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgY29yZWhkcik7Ci0gIHN0cnVjdCBjb3JlaGRyICpjb3JlOwotICBzdHJ1Y3QgbWVyZ2VtIHsKLSAgICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCBjb3JlZGF0YTsKLSAgICBzdHJ1Y3QgY29yZWhkciBpbnRlcm5hbF9jb3JlOwotICB9ICptZXJnZW07Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKWxvbmdidWYsIDEsIHNpemVvZiAobG9uZ2J1ZiksIGFiZmQpICE9IHNpemVvZiAobG9uZ2J1ZikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChzdHJuY21wKGxvbmdidWYsQ09SX01BR0lDLDQpKSByZXR1cm4gMDsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDBMLCBmYWxzZSkgPCAwKSByZXR1cm4gMDsKLQotICBtZXJnZW0gPSAoc3RydWN0IG1lcmdlbSAqKWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG1lcmdlbSkpOwotICBpZiAobWVyZ2VtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgY29yZSA9ICZtZXJnZW0tPmludGVybmFsX2NvcmU7Ci0KLSAgaWYgKChiZmRfcmVhZCAoKFBUUikgY29yZSwgMSwgY29yZV9zaXplLCBhYmZkKSkgIT0gY29yZV9zaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKW1lcmdlbSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgc2V0X3RkYXRhIChhYmZkLCAmbWVyZ2VtLT5jb3JlZGF0YSk7Ci0gIGNvcmVfaGRyIChhYmZkKSA9IGNvcmU7Ci0KLSAgLyogY3JlYXRlIHRoZSBzZWN0aW9ucy4gIFRoaXMgaXMgcmF1bmNoeSwgYnV0IGJmZF9jbG9zZSB3YW50cyB0byByZWNsYWltCi0gICAgIHRoZW0gKi8KLSAgY29yZV9yZWdzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfcmVnc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICBsb3NlcjoKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKW1lcmdlbSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9yZWcyc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICBsb3NlcjE6Ci0gICAgIGJmZF9yZWxlYXNlIChhYmZkLCBjb3JlX3JlZ3NlYyAoYWJmZCkpOwotICAgICAgZ290byBsb3NlcjsKLSAgICB9Ci0KLSAgZm9yIChpPTAsIG49MCA7IChpIDwgTUFYX0NPUkVfU0VHUykgJiYgKGNvcmUtPmNkX3NlZ3NbaV0uY3NfdHlwZSkgOyBpKyspCi0gICAgewotICAgICAgaWYgKGNvcmUtPmNkX3NlZ3NbaV0uY3Nfb2Zmc2V0ID09IDApCi0JY29udGludWU7Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsbikgPQotCShhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gICAgICBpZiAoY29yZV9zZWN0aW9uIChhYmZkLG4pID09IE5VTEwpCi0JewotCSAgaW50IGo7Ci0JICBpZiAobiA+IDApCi0JICAgIHsKLQkgICAgICBmb3IgKGo9MDsgaiA8IG47IGorKykKLQkJYmZkX3JlbGVhc2UgKGFiZmQsIGNvcmVfc2VjdGlvbihhYmZkLCBqKSk7Ci0JICAgIH0KLQkgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKW1lcmdlbSk7Ci0JICBnb3RvIGxvc2VyMTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoY29yZS0+Y2Rfc2Vnc1tpXS5jc190eXBlKQotCXsKLQljYXNlIENPUl9UWVBFX0RBVEE6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi5kYXRhIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19MT0FEICsKLQkJCQkJICAgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQljYXNlIENPUl9UWVBFX1NUQUNLOgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIuc3RhY2siOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0xPQUQgKwotCQkJCQkgICBTRUNfSEFTX0NPTlRFTlRTKTsKLQkgIGJyZWFrOwotCWNhc2UgQ09SX1RZUEVfTElCREFUQToKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLmxpYmRhdGEiOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQljYXNlIENPUl9UWVBFX1dSSVRFOgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIud3JpdGVhYmxlIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JfVFlQRV9NU0M6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi5taXNjIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLnVua25vd24iOwotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5fcmF3X3NpemUgPSBjb3JlLT5jZF9zZWdzW2ldLmNzX2xlbjsKLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPnZtYSAgICAgICA9IGNvcmUtPmNkX3NlZ3NbaV0uY3NfYWRkcmVzczsKLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZpbGVwb3MgICA9IGNvcmUtPmNkX3NlZ3NbaV0uY3Nfb2Zmc2V0OwotICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5leHQgICAgICA9IE5VTEw7Ci0gICAgICBpZiAobiA+IDApCi0JY29yZV9zZWN0aW9uIChhYmZkLCAobi0xKSktPm5leHQgPSBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pOwotCi0gICAgICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gKytuOwotICAgIH0KLQotICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5hbWUgPSAiLnJlZyI7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPm5hbWUgPSAiLnJlZzIiOwotCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBzaXplb2YoY29yZS0+Y2RfcmVncyk7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IHNpemVvZihjb3JlLT5jZF9mcHJlZ3MpOwotCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gLTE7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPnZtYSA9IC0xOwotCi0gIC8qIFdlJ2xsIGFjY2VzcyB0aGUgcmVncyBhZnJlc2ggaW4gdGhlIGNvcmUgZmlsZSwgbGlrZSBhbnkgc2VjdGlvbjogKi8KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5maWxlcG9zID0gKGZpbGVfcHRyKW9mZnNldG9mKHN0cnVjdCBjb3JlaGRyLGNkX3JlZ3NbMF0pOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5maWxlcG9zID0gKGZpbGVfcHRyKW9mZnNldG9mKHN0cnVjdCBjb3JlaGRyLAotCQkJCQkJICAgIGNkX2ZwcmVncyk7Ci0KLSAgLyogYWRkIHRoZSAyIHJlZyBmYWtlIHNlY3Rpb25zIHRvIGFiZmQgKi8KLSAgYWJmZC0+c2VjdGlvbl9jb3VudCArPSAyOwotICBhYmZkLT5zZWN0aW9ucyA9IGNvcmVfcmVnc2VjIChhYmZkKTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9yZWcyc2VjIChhYmZkKTsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfc2VjdGlvbiAoYWJmZCwgMCk7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWFpeDM4Nl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2hkciAoYWJmZCktPmNkX2NvbW07Ci19Ci0KLXN0YXRpYyBpbnQKLWFpeDM4Nl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfaGRyIChhYmZkKS0+Y2RfY3Vyc2lnOwotfQotCi1zdGF0aWMgYm9vbGVhbgotYWl4Mzg2X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkOwotICAgICBiZmQgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCQkvKiBGSVhNRSwgV2UgaGF2ZSBubyB3YXkgb2YgdGVsbGluZyBhdCB0aGlzCi0JCQkJICAgcG9pbnQgKi8KLX0KLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoUFJPVE8oYmZkX3ZtYSwgKCopLCAoICAgICAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lIE5PX0dFVFMgKChQUk9UTyhiZmRfc2lnbmVkX3ZtYSwgKCopLCAoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgoUFJPVE8odm9pZCwgICAgICAgICgqKSwgKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgYWl4Mzg2X2NvcmVfdmVjID0KLSAgewotICAgICJhaXgzODYtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5HX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAgICcgJywJCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwKLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwKLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwgLyogZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULAotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULAotICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULCAvKiBoZHJzICovCi0KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgICBfYmZkX2R1bW15X3RhcmdldCwgYWl4Mzg2X2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF9jcmVhdGVfb2JqZWN0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoYWl4Mzg2KSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIE5VTEwsCi0gICAgCi0gICAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9hb3V0LWFkb2JlLmMgYi9iZmQvYW91dC1hZG9iZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjE2YzdlLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LWFkb2JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhLm91dC5hZG9iZSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LiAgQmFzZWQgb24gYm91dC5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImFvdXQvYWRvYmUuaCIKLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFfb3V0X2Fkb2JlX3ZlYzsJCS8qIEZvcndhcmQgZGVjbCAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqYW91dF9hZG9iZV9jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBhb3V0XzMyX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBib29sZWFuIGFvdXRfMzJfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBzZWN0KSk7Ci0KLS8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciB0YWtlbiBmcm9tIGEgcmF3IGJ5dGUKLSAgIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyIHN0cnVjdHVyZS4gICovCi0KLXZvaWQgYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX2luCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3ApKTsKLQkgCi12b2lkCi1hb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+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+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7Ci0gICAgICAgICAgaWYgKCFhb3V0XzMyX3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBzZWN0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hb3V0X2Fkb2JlX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHNlY3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIHNlY3QgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogRklYTUUgWFhYICovCi19Ci0MCi1zdGF0aWMgYm9vbGVhbgotYW91dF9hZG9iZV9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBmaWxlX3B0ciBzZWN0aW9uX3N0YXJ0OwotICBzZWNfcHRyIHNlY3Q7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpIHsgLyogc2V0IGJ5IGJmZC5jIGhhbmRsZXIgKi8KLQotICAgIC8qIEFzc2lnbiBmaWxlIG9mZnNldHMgdG8gc2VjdGlvbnMuICBUZXh0IHNlY3Rpb25zIGFyZSBmaXJzdCwgYW5kCi0gICAgICAgYXJlIGNvbnRpZ3VvdXMuICBUaGVuIGRhdGEgc2VjdGlvbnMuICBFdmVyeXRoaW5nIGVsc2UgYXQgdGhlIGVuZC4gICovCi0KLSAgICBzZWN0aW9uX3N0YXJ0ID0gTl9UWFRPRkYgKGlnbm9yZTwtLT5tZSk7Ci0KLSAgICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19DT0RFKQl7Ci0gICAgICAgIHNlY3QtPmZpbGVwb3MgPSBzZWN0aW9uX3N0YXJ0OwotCS8qIEZJWE1FOiAgUm91bmQgdG8gYWxpZ25tZW50ICovCi0Jc2VjdGlvbl9zdGFydCArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfREFUQSkJewotICAgICAgICBzZWN0LT5maWxlcG9zID0gc2VjdGlvbl9zdGFydDsKLQkvKiBGSVhNRTogIFJvdW5kIHRvIGFsaWdubWVudCAqLwotCXNlY3Rpb25fc3RhcnQgKz0gc2VjdC0+X3Jhd19zaXplOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgICAgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUyAmJgotCSAgIShzZWN0LT5mbGFncyAmIChTRUNfQ09ERXxTRUNfREFUQSkpKQl7Ci0gICAgICAgIHNlY3QtPmZpbGVwb3MgPSBzZWN0aW9uX3N0YXJ0OwotCS8qIEZJWE1FOiAgUm91bmQgdG8gYWxpZ25tZW50ICovCi0Jc2VjdGlvbl9zdGFydCArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogcmVnYXJkbGVzcywgb25jZSB3ZSBrbm93IHdoYXQgd2UncmUgZG9pbmcsIHdlIG1pZ2h0IGFzIHdlbGwgZ2V0IGdvaW5nICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjb3VudCAhPSAwKSB7Ci0gICAgcmV0dXJuIChiZmRfd3JpdGUgKChQVFIpbG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSA9PSBjb3VudCkgP3RydWU6ZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2Fkb2JlX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24KLSAgICAgIHx8IGFyY2ggPT0gYmZkX2FyY2hfbTY4aykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgCi1hb3V0X2Fkb2JlX3NpemVvZl9oZWFkZXJzIChpZ25vcmVfYWJmZCwgaWdub3JlKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBzaXplb2Yoc3RydWN0IGludGVybmFsX2V4ZWMpOwotfQotCi0KLQotCi0vKiBCdWlsZCB0aGUgdHJhbnNmZXIgdmVjdG9yIGZvciBBZG9iZSBBLk91dCBmaWxlcy4gICovCi0KLSNkZWZpbmUgYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCBhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgYW91dF8zMl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgdm9pZCAqLCB1bnNpZ25lZCBsb25nKSkpIGJmZF9udWxsdm9pZHB0cikKLQotI2RlZmluZSBhb3V0XzMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gICgocmVsb2NfaG93dG9fdHlwZSAqKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSkpIGJmZF9udWxsdm9pZHB0cikKLQotI2RlZmluZQlhb3V0XzMyX3NldF9hcmNoX21hY2gJCWFvdXRfYWRvYmVfc2V0X2FyY2hfbWFjaAotI2RlZmluZQlhb3V0XzMyX3NldF9zZWN0aW9uX2NvbnRlbnRzCWFvdXRfYWRvYmVfc2V0X3NlY3Rpb25fY29udGVudHMKLQotI2RlZmluZQlhb3V0XzMyX3NpemVvZl9oZWFkZXJzCQlhb3V0X2Fkb2JlX3NpemVvZl9oZWFkZXJzCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZGVmaW5lIGFvdXRfMzJfYmZkX3JlbGF4X3NlY3Rpb24gICAgICAgYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBhb3V0XzMyX2JmZF9nY19zZWN0aW9ucyAgICAgICAgIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBhb3V0XzMyX2JmZF9saW5rX2FkZF9zeW1ib2xzCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2ZpbmFsX2xpbmsJCV9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbglfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgYV9vdXRfYWRvYmVfdmVjID0KLXsKLSAgImEub3V0LmFkb2JlIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIHVua25vd24gKGJpZyBhc3N1bWVkKSAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhkciBieXRlIG9yZGVyIGlzIGJpZyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUICksCi0gIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUkVMT0MpLAotICAnXycsCQkJCS8qICBzeW1ib2wgbGVhZGluZyBjaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBhb3V0X2Fkb2JlX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBhb3V0X2Fkb2JlX21rb2JqZWN0LCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSB7YmZkX2ZhbHNlLCBhb3V0X2Fkb2JlX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvYW91dC1hcm0uYyBiL2JmZC9hb3V0LWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzY1ZjlkLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUyICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgcmF3IEFSTSBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotICAgCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotICAoKE5fTUFHSUMoeCkgPT0gTk1BR0lDKSA/IDB4ODAwMCA6IFwKLSAgIChOX01BR0lDKHgpICE9IFpNQUdJQykgPyAwIDogXAotICAgKE5fU0hBUkVEX0xJQih4KSkgPyAoKHgpLmFfZW50cnkgJiB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKSkgOiBcCi0gICBURVhUX1NUQVJUX0FERFIpCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDB4ODAwMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDB4ODAwMAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfYXJtCi0KLSNkZWZpbmUgTVkoT1ApIENBVChhb3V0YXJtXyxPUCkKLSNkZWZpbmUgTl9CQURNQUcoeCkgKCgoKHgpLmFfaW5mbyAmIH4wMDcyMDApICE9IFpNQUdJQykgJiYgXAotICAgICAgICAgICAgICAgICAgICAgKCgoeCkuYV9pbmZvICYgfjAwNjAwMCkgIT0gT01BR0lDKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAoKHgpLmFfaW5mbyAhPSBOTUFHSUMpKQotI2RlZmluZSBOX01BR0lDKHgpICgoeCkuYV9pbmZvICYgfjA3MjAwKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNkZWZpbmUgTVlBUk0oT1ApIENBVChhb3V0YXJtXyxPUCkKLXJlbG9jX2hvd3RvX3R5cGUgCSpNWUFSTShiZmRfcmVsb2NfdHlwZV9sb29rdXApCi0JCQkJUEFSQU1TKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiAJCU1ZQVJNKHdyaXRlX29iamVjdF9jb250ZW50cykJUEFSQU1TKChiZmQgKikpOwotCi0vKiBBdm9pZCBtdWx0aXBsZSBkZWZpbmluaXRpb25zIGZyb20gYW91dHggaWYgc3VwcG9ydGluZyBzdGFuZGFyYWQgYS5vdXQgCi0gICBhcyB3ZWxsIGFzIG91ciBvd24uICAqLwotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhhb3V0YXJtLF8zMl8seSkKLQotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYW91dGFybV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1NWShmaXhfcGNyZWxfMjZfZG9uZSkJUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkJIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLU1ZKGZpeF9wY3JlbF8yNikJIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkJCSAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIE1ZKHN3YXBfc3RkX3JlbG9jX2luKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqLAotCQkJCQkgICBhcmVsZW50ICosIGFzeW1ib2wgKiosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUpKTsKLXZvaWQgTVkoc3dhcF9zdGRfcmVsb2Nfb3V0KSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCAKLQkJCQkgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikpOwotCi1yZWxvY19ob3d0b190eXBlIE1ZKGhvd3RvX3RhYmxlKVtdID0KLXsKLSAgLyogdHlwZSBycyBzaXplIGJzeiBwY3JlbCBiaXRwb3Mgb3ZyZiBzZiBuYW1lIHBhcnRfaW5wbCByZWFkbWFzayBzZXRtYXNrCi0gICAgIHBjZG9uZSAqLwotICBIT1dUTyAoMCwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiOCIsIHRydWUsCi0JIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDEsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIxNiIsIHRydWUsCi0JIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICIzMiIsIHRydWUsCi0JIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDMsIDIsIDIsIDI2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIE1ZKGZpeF9wY3JlbF8yNiksCi0JICJBUk0yNiIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIHRydWUpLAotICBIT1dUTyAoNCwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDgiLCB0cnVlLAotCSAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLSAgSE9XVE8gKDUsIDAsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMTYiLCB0cnVlLAotCSAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCB0cnVlKSwKLSAgSE9XVE8gKDYsIDAsIDIsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMzIiLCB0cnVlLAotCSAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCB0cnVlKSwKLSAgSE9XVE8gKDcsIDIsIDIsIDI2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCSBNWShmaXhfcGNyZWxfMjZfZG9uZSksICJBUk0yNkQiLCB0cnVlLCAweDAsIDB4MCwKLQkgZmFsc2UpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBIT1dUTyAoOSwgMCwgLTEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJORUcxNiIsIHRydWUsCi0JIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDEwLCAwLCAtMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIk5FRzMyIiwgdHJ1ZSwKLQkgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpCi19OwotCi0jZGVmaW5lIFJFTE9DX0FSTV9CSVRTX05FR19CSUcgICAgICAoKHVuc2lnbmVkIGludCkgMHgwOCkKLSNkZWZpbmUgUkVMT0NfQVJNX0JJVFNfTkVHX0xJVFRMRSAgICgodW5zaWduZWQgaW50KSAweDEwKQotCi1yZWxvY19ob3d0b190eXBlICoKLU1ZKHJlbG9jX2hvd3RvKShhYmZkLCByZWwsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbDsKLSAgICAgaW50ICpyX2luZGV4OwotICAgICBpbnQgKnJfZXh0ZXJuOwotICAgICBpbnQgKnJfcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgdW5zaWduZWQgaW50IHJfcGNyZWxfZG9uZTsKLSAgdW5zaWduZWQgaW50IHJfbmVnOwotICBpbnQgaW5kZXg7Ci0KLSAgKnJfcGNyZWwgPSAwOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICAqcl9pbmRleCAgICAgPSAgKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCSAgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICAgIHwgcmVsLT5yX2luZGV4WzJdKTsKLSAgICAgICpyX2V4dGVybiAgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICAgIHJfcGNyZWxfZG9uZSA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotICAgICAgcl9uZWcgCSAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRykpOwotICAgICAgcl9sZW5ndGggICAgID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCi0JCSAgICAgID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpyX2luZGV4ICAgICA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICAgfCByZWwtPnJfaW5kZXhbMF0pOwotICAgICAgKnJfZXh0ZXJuICAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotICAgICAgcl9wY3JlbF9kb25lID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFKSk7Ci0gICAgICByX25lZyAJICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19BUk1fQklUU19ORUdfTElUVExFKSk7Ci0gICAgICByX2xlbmd0aCAgICAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkKLQkJICAgICAgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgfQotICBpbmRleCA9IHJfbGVuZ3RoICsgNCAqIHJfcGNyZWxfZG9uZSArIDggKiByX25lZzsKLSAgaWYgKGluZGV4ID09IDMpCi0gICAgKnJfcGNyZWwgPSAxOwotCi0gIHJldHVybiBNWShob3d0b190YWJsZSkgKyBpbmRleDsKLX0KLSAKLSNkZWZpbmUgTVlfcmVsb2NfaG93dG8oQkZELCBSRUwsIElOLCBFWCwgUEMpIFwKLQlNWShyZWxvY19ob3d0bykgKEJGRCwgUkVMLCAmSU4sICZFWCwgJlBDKQotCi12b2lkCi1NWShwdXRfcmVsb2MpKGFiZmQsIHJfZXh0ZXJuLCByX2luZGV4LCB2YWx1ZSwgaG93dG8sIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCByX2V4dGVybjsKLSAgICAgaW50IHJfaW5kZXg7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvYzsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfbmVnOwotCi0gIFBVVF9XT1JEIChhYmZkLCB2YWx1ZSwgcmVsb2MtPnJfYWRkcmVzcyk7Ci0gIHJfbGVuZ3RoID0gaG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0KLSAgLyogU3BlY2lhbCBjYXNlIGZvciBicmFuY2ggcmVsb2NhdGlvbnMuICovCi0gIGlmIChob3d0by0+dHlwZSA9PSAzIHx8IGhvd3RvLT50eXBlID09IDcpCi0gICAgcl9sZW5ndGggPSAzOwotCi0gIHJfcGNyZWwgID0gaG93dG8tPnR5cGUgJiA0OyAJLyogUEMgUmVsYXRpdmUgZG9uZT8gKi8KLSAgcl9uZWcgPSBob3d0by0+dHlwZSAmIDg7CS8qIE5lZ2F0aXZlIHJlbG9jYXRpb24gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2MtPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotICAgICAgcmVsb2MtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICByZWxvYy0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICByZWxvYy0+cl90eXBlWzBdID0KLQkoKHJfZXh0ZXJuID8gICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCSB8IChyX3BjcmVsID8gICAgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHIDogMCkKLQkgfCAocl9uZWcgPwkgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRyA6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsb2MtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgICAgcmVsb2MtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICByZWxvYy0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICByZWxvYy0+cl90eXBlWzBdID0KLQkoKHJfZXh0ZXJuID8gICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUgOiAwKQotCSB8IChyX3BjcmVsID8gICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFIDogMCkKLQkgfCAocl9uZWcgPwkgUkVMT0NfQVJNX0JJVFNfTkVHX0xJVFRMRSA6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKSk7Ci0gICAgfQotfQotIAotI2RlZmluZSBNWV9wdXRfcmVsb2MoQkZELCBFWFQsIElEWCwgVkFMLCBIT1dUTywgUkVMT0MpIFwKLSAgTVkocHV0X3JlbG9jKShCRkQsIEVYVCwgSURYLCBWQUwsIEhPV1RPLCBSRUxPQykKLQotdm9pZAotTVkocmVsb2NhdGFibGVfcmVsb2MpKGhvd3RvLCBhYmZkLCByZWxvYywgYW1vdW50LCByX2FkZHIpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jOwotICAgICBiZmRfdm1hICphbW91bnQ7Ci0gICAgIGJmZF92bWEgcl9hZGRyOwotewotICBpZiAoaG93dG8tPnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICBpZiAocmVsb2MtPnJfdHlwZVswXSAKLQkgICYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkKLQkgICAgID8gUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRyA6IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKQotCXsKLQkgIC8qIFRoZSByZWxvYyBpcyBzdGlsbCBleHRlcm5hbCwgc28gZG9uJ3QgbW9kaWZ5IGFueXRoaW5nLiAqLwotCSAgKmFtb3VudCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICphbW91bnQgLT0gcl9hZGRyOwotCSAgLyogQ2hhbmdlIHRoZSByX3BjcmVsIHZhbHVlIC0tIG9uIHRoZSBBUk0sIHRoaXMgYml0IGlzIHNldCBvbmNlIHRoZQotCSAgICAgcmVsb2NhdGlvbiBpcyBkb25lLiAgKi8KLQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCSAgICByZWxvYy0+cl90eXBlWzBdIHw9IFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRzsKLQkgIGVsc2UKLQkgICAgcmVsb2MtPnJfdHlwZVswXSB8PSBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoaG93dG8tPnR5cGUgPT0gNykKLSAgICAqYW1vdW50ID0gMDsKLX0KLQotI2RlZmluZSBNWV9yZWxvY2F0YWJsZV9yZWxvYyhIT1csIEJGRCwgUkVMLCBBTU9VTlQsIEFERFIpIFwKLSAgTVkocmVsb2NhdGFibGVfcmVsb2MpKEhPVywgQkZELCBSRUwsICYoQU1PVU5UKSwgQUREUikKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotTVkoZml4X3BjcmVsXzI2X2RvbmUpIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogVGhpcyBpcyBkZWFkIHNpbXBsZSBhdCBwcmVzZW50LiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotTVkoZml4X3BjcmVsXzI2KSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX29rIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKLSAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIHJlbG9jYXRpb24gPSAodGFyZ2V0ICYgMHgwMGZmZmZmZikgPDwgMjsKLSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gMHgwMjAwMDAwMCkgLSAweDAyMDAwMDAwOyAvKiBTaWduIGV4dGVuZCAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiAtPSBhZGRyOwotICBpZiAocmVsb2NhdGlvbiAmIDMpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgaWYgKHJlbG9jYXRpb24gJiAweDAyMDAwMDAwKQotICAgIHsKLSAgICAgIGlmICgocmVsb2NhdGlvbiAmIH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpICE9IH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlbG9jYXRpb24gJiB+MHgwM2ZmZmZmZikKLSAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHRhcmdldCAmPSB+MHgwMGZmZmZmZjsKLSAgdGFyZ2V0IHw9IChyZWxvY2F0aW9uID4+IDIpICYgMHgwMGZmZmZmZjsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgdGFyZ2V0LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIC8qIE5vdyB0aGUgQVJNIG1hZ2ljLi4uIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBzbyB0aGF0IGl0IGlzIG1hcmtlZCBhcyBkb25lLgotICAgICBTdHJpY3RseSB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4gICovCi0gIHJlbG9jX2VudHJ5LT5ob3d0byA9ICZNWShob3d0b190YWJsZSlbN107Ci0gIAotICByZXR1cm4gZmxhZzsKLX0KLQotcmVsb2NfaG93dG9fdHlwZSAqCi1NWShiZmRfcmVsb2NfdHlwZV9sb29rdXApKGFiZmQsY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSNkZWZpbmUgQVNURChpLGopICAgICAgIGNhc2UgaTogcmV0dXJuICZNWShob3d0b190YWJsZSlbal0KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCi0gICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0gICAgICB7Ci0gICAgICBjYXNlIDMyOgotICAgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6IHJldHVybiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSAwOwotICAgICAgfQotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTYsIDEpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyLCAyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAzKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ184X1BDUkVMLCA0KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18xNl9QQ1JFTCwgNSk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMzJfUENSRUwsIDYpOwotICAgIGRlZmF1bHQ6IHJldHVybiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSAwOwotICAgIH0KLX0KLQotI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19pbiBNWShzd2FwX3N0ZF9yZWxvY19pbikKLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IE1ZKHN3YXBfc3RkX3JlbG9jX291dCkKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0vKiAjZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlICovCi0vKiAjZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzICovCi0vKiAjZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rICovCi0KLSNpbmNsdWRlICJhb3V0eC5oIgotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIGludCByX3BjcmVsOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcyk7Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IE1ZX3JlbG9jX2hvd3RvIChhYmZkLCBieXRlcywgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpOwotCi0gIE1PVkVfQUREUkVTUyAoMCk7Ci19Ci0KLXZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX291dCAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX25lZyA9IDA7CS8qIE5lZ2F0aXZlIHJlbG9jcyB1c2UgdGhlIEJBU0VSRUwgYml0LiAgKi8KLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICBQVVRfV09SRChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl9sZW5ndGggPSBnLT5ob3d0by0+c2l6ZSA7ICAgLyogU2l6ZSBhcyBhIHBvd2VyIG9mIHR3byAqLwotICBpZiAocl9sZW5ndGggPCAwKQotICAgIHsKLSAgICAgIHJfbGVuZ3RoID0gLXJfbGVuZ3RoOwotICAgICAgcl9uZWcgPSAxOwotICAgIH0KLQotICByX3BjcmVsICA9IChpbnQpIGctPmhvd3RvLT5wY19yZWxhdGl2ZTsgLyogUmVsYXRpdmUgdG8gUEM/ICovCi0KLSAgLyogRm9yIFJJU0MgaVgsIGluIHBjLXJlbGF0aXZlIHJlbG9jcyB0aGUgcl9wY3JlbCBiaXQgbWVhbnMgdGhhdCB0aGUKLSAgICAgcmVsb2NhdGlvbiBoYXMgYmVlbiBkb25lIGFscmVhZHkgKE9ubHkgZm9yIHRoZSAyNi1iaXQgb25lIEkgdGhpbmspPz8/ISEhCi0gICAgICovCi0KLSAgaWYgKGctPmhvd3RvLT50eXBlID09IDMpCi0gICAgewotICAgICAgcl9sZW5ndGggPSAzOwotICAgICAgcl9wY3JlbCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChnLT5ob3d0by0+dHlwZSA9PSA3KQotICAgIHsgCi0gICAgICByX2xlbmd0aCA9IDM7Ci0gICAgICByX3BjcmVsID0gMTsKLSAgICB9Ci0gIAotCi0jaWYgMAotICAvKiBGb3IgYSBzdGFuZGFyZCByZWxvYywgdGhlIGFkZGVuZCBpcyBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQotICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQotICAgICAqLwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbgotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uLnN5bWJvbCA9PSBzeW0pCi0JewotCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQkgIHJfaW5kZXggPSAwOwotCSAgcl9leHRlcm4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBGaWxsIGluIHN5bWJvbCAqLwotCSAgcl9leHRlcm4gPSAxOwotCSAgcl9pbmRleCA9ICgqKGctPnN5bV9wdHJfcHRyKSktPktFRVBJVDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCSggIChyX2V4dGVybiA/ICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRzogMCkKLQkgfCAocl9wY3JlbCAgPyAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRzogMCkKLQkgfCAocl9uZWcgICAgPyAgIFJFTE9DX0FSTV9CSVRTX05FR19CSUc6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKCAgKHJfZXh0ZXJuID8gICBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFOiAwKQotCSB8IChyX3BjcmVsICA/ICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOiAwKQotCSB8IChyX25lZyAgICA/ICAgUkVMT0NfQVJNX0JJVFNfTkVHX0xJVFRMRTogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpKTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgTVlfQkZEX1RBUkdFVAotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fYmlnX3ZlYzsKLQotY29uc3QgYmZkX3RhcmdldCBhb3V0X2FybV9saXR0bGVfdmVjID0KLXsKLSAgImEub3V0LWFybS1saXR0bGUiLCAgICAgICAgICAgLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsICAgICAgICAgICAgLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsICAgICAgICAgICAgLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgICAgICAgICAvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAotICBBUl9QQURfQ0hBUiwgICAgICAgICAgICAgICAgICAvKiBhcl9wYWRfY2hhciAqLwotICAxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCi0gICAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsICAgIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAotCi0gICYgYW91dF9hcm1fYmlnX3ZlYywKLSAgCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fYmlnX3ZlYyA9Ci17Ci0gICJhLm91dC1hcm0tYmlnIiwgICAgICAgICAgIC8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLCAgICAgICAgICAgICAgIC8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLCAgICAgICAgICAgICAgIC8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8ICAgICAgICAgLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgQVJfUEFEX0NIQVIsICAgICAgICAgICAgICAgICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAotICAgIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LCAgICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKE1ZKSwKLQotICAmIGFvdXRfYXJtX2xpdHRsZV92ZWMsCi0gIAotICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtZW5jYXAuYyBiL2JmZC9hb3V0LWVuY2FwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNWY5MDM3Li4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LWVuY2FwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhLm91dCBmaWxlcyBlbmNhcHN1bGF0ZWQgd2l0aCBDT0ZGIGhlYWRlcnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVEhJUyBNT0RVTEUgSVMgTk9UIEZJTklTSEVELiAgSVQgUFJPQkFCTFkgRE9FU04nVCBFVkVOIENPTVBJTEUuICAqLwotCi0jaWYgMAotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgPHN5c2RlcC5oPgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgPGFvdXQvYW91dDY0Lmg+Ci0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKmVuY2FwX3JlYWxfY2FsbGJhY2sgKCk7Ci0KLWNvbnN0IGJmZF90YXJnZXQgKgotZW5jYXBfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciBtYWdpY2J1Zls0XTsgLyogUmF3IGJ5dGVzIG9mIG1hZ2ljIG51bWJlciBmcm9tIGZpbGUgKi8KLSAgdW5zaWduZWQgbG9uZyBtYWdpYzsJCS8qIFN3YXBwZWQgbWFnaWMgbnVtYmVyICovCi0gIHNob3J0IGNvZmZfbWFnaWM7Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGV4ZWM7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKW1hZ2ljYnVmLCAxLCBzaXplb2YgKG1hZ2ljYnVmKSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobWFnaWNidWYpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgCi0gIGNvZmZfbWFnaWMgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIG1hZ2ljYnVmKTsKLSAgaWYgKGNvZmZfbWFnaWMgIT0gQ09GRl9NQUdJQykKLSAgICByZXR1cm4gMDsJCQkvKiBOb3QgYW4gZW5jYXAgY29mZiBmaWxlICovCi0KLSAgX19oZWFkZXJfb2Zmc2V0X3RlbXA9PUNPRkZfTUFHSUMgPyBzaXplb2Yoc3RydWN0IGNvZmZoZWFkZXIpIDogMCkKLSAgKGZzZWVrICgoZiksIEhFQURFUl9PRkZTRVQoKGYpKSwgMSkpCi0KLSAgbWFnaWMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIG1hZ2ljYnVmKTsKLQotICBpZiAoTl9CQURNQUcgKCooKHN0cnVjdCBpbnRlcm5hbF9leGVjICopICZtYWdpYykpKSByZXR1cm4gMDsKLQotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKLSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikoYWJmZCwgJmV4ZWNfYnl0ZXMsICZleGVjKTsKLQotICByZXR1cm4gYW91dF8zMl9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsICZleGVjLCBlbmNhcF9yZWFsY2FsbGJhY2spOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIHJlYWRpbmcgb2YgYSBlbmNhcHN1bGF0ZWQtY29mZiBhLm91dCBmaWxlIGhlYWRlciAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1lbmNhcF9yZWFsX2NhbGxiYWNrIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgCi0gIE1ZKGNhbGxiYWNrKShhYmZkLCBleGVjcCk7Ci0gIAotICAvKiBJZiB3ZSBoYXZlIGEgY29mZiBoZWFkZXIsIGl0IGNhbiBnaXZlIHVzIGJldHRlciB2YWx1ZXMgZm9yCi0gICAgIHRleHRfc3RhcnQgYW5kIGV4ZWNfZGF0YV9zdGFydC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bAotICAgICBmb3IgcmVtb3RlIGRlYnVnZ2luZyBvZiBlbWJlZGRlZCBzeXN0ZW1zLiAgKi8KLSAgaWYgKE5fRkxBR1MoZXhlY19hb3V0aGRyKSAmIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURSkKLSAgewotCSAgc3RydWN0IGNvZmZoZWFkZXIgY2g7Ci0JICBpbnQgdmFsOwotCSAgdmFsID0gbHNlZWsgKGV4ZWNjaGFuLCAtKHNpemVvZiAoQU9VVEhEUikgKyBzaXplb2YgKGNoKSksIDEpOwotCSAgaWYgKHZhbCA9PSAtMSkKLQkJICBwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7Ci0JICB2YWwgPSBteXJlYWQgKGV4ZWNjaGFuLCAmY2gsIHNpemVvZiAoY2gpKTsKLQkgIGlmICh2YWwgPCAwKQotCQkgIHBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKLQkgIHRleHRfc3RhcnQgPSBjaC50ZXh0X3N0YXJ0OwotCSAgZXhlY19kYXRhX3N0YXJ0ID0gY2guZGF0YV9zdGFydDsKLSAgfSBlbHNlCi0JIHsKLQkgIHRleHRfc3RhcnQgPQotCSAgICBJU19PQkpFQ1RfRklMRSAoZXhlY19hb3V0aGRyKSA/IDAgOiBOX1RYVEFERFIgKGV4ZWNfYW91dGhkcik7Ci0JICBleGVjX2RhdGFfc3RhcnQgPSBJU19PQkpFQ1RfRklMRSAoZXhlY19hb3V0aGRyKQotCSAgICA/IGV4ZWNfYW91dGhkci5hX3RleHQgOiBOX0RBVEFERFIgKGV4ZWNfYW91dGhkcik7Ci0gIH0KLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgYmZkX2FyY2hfbTY4aywgMCk7IC8qIEZJWE1FICovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlIGluIEVuY2Fwc3VsYXRlZCBDT0ZGIGZvcm1hdC4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotYm9vbGVhbgotZW5jYXBfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgZGF0YV9wYWQgPSAwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLS8qKioqKiogRklYTUU6ICBGcmFnbWVudHMgZnJvbSB0aGUgb2xkIEdOVSBMRCBwcm9ncmFtIGZvciBkZWFsaW5nIHdpdGgKLSAgICAgICAgZW5jYXAgY29mZi4gICovCi1zdHJ1Y3QgY29mZmhlYWRlciBjb2ZmaGVhZGVyOwotaW50IG5lZWRfY29mZl9oZWFkZXI7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgdG8gY291bnQgdGhlIGhlYWRlciBhcyBwYXJ0IG9mCi0gICAgIHRoZSB0ZXh0IHNpemUsIGFuZCBpbml0aWFsaXplIHRoZSB0ZXh0IHNpemUgYWNjb3JkaW5nbHkuCi0gICAgIFRoaXMgZGVwZW5kcyBvbiB0aGUga2luZCBvZiBzeXN0ZW0gYW5kIG9uIHRoZSBvdXRwdXQgZm9ybWF0IHNlbGVjdGVkLiAgKi8KLQotICBOX1NFVF9NQUdJQyAob3V0aGVhZGVyLCBtYWdpYyk7Ci0jaWZkZWYgSU5JVElBTElaRV9IRUFERVIKLSAgSU5JVElBTElaRV9IRUFERVI7Ci0jZW5kaWYKLQotICB0ZXh0X3NpemUgPSBzaXplb2YgKHN0cnVjdCBleGVjKTsKLSNpZmRlZiBDT0ZGX0VOQ0FQU1VMQVRFCi0gIGlmIChyZWxvY2F0YWJsZV9vdXRwdXQgPT0gMCAmJiBmaWxlX3RhYmxlWzBdLmp1c3Rfc3ltc19mbGFnID09IDApCi0gICAgewotICAgICAgbmVlZF9jb2ZmX2hlYWRlciA9IDE7Ci0gICAgICAvKiBzZXQgdGhpcyBmbGFnIG5vdywgc2luY2UgaXQgd2lsbCBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBOX1RYVE9GRiwgZXRjICovCi0gICAgICBOX1NFVF9GTEFHUyAob3V0aGVhZGVyLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLSAgICAgIHRleHRfc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBjb2ZmaGVhZGVyKTsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgaWYgKG5lZWRfY29mZl9oZWFkZXIpCi0gICAgewotICAgICAgLyogV2UgYXJlIGVuY2Fwc3VsYXRpbmcgQlNEIGZvcm1hdCB3aXRoaW4gQ09GRiBmb3JtYXQuICAqLwotICAgICAgc3RydWN0IGNvZmZzY24gKnRwLCAqZHAsICpicDsKLQotICAgICAgdHAgPSAmY29mZmhlYWRlci5zY25zWzBdOwotICAgICAgZHAgPSAmY29mZmhlYWRlci5zY25zWzFdOwotICAgICAgYnAgPSAmY29mZmhlYWRlci5zY25zWzJdOwotCi0gICAgICBzdHJjcHkgKHRwLT5zX25hbWUsICIudGV4dCIpOwotICAgICAgdHAtPnNfcGFkZHIgPSB0ZXh0X3N0YXJ0OwotICAgICAgdHAtPnNfdmFkZHIgPSB0ZXh0X3N0YXJ0OwotICAgICAgdHAtPnNfc2l6ZSA9IHRleHRfc2l6ZTsKLSAgICAgIHRwLT5zX3NjbnB0ciA9IHNpemVvZiAoc3RydWN0IGNvZmZoZWFkZXIpICsgc2l6ZW9mIChzdHJ1Y3QgZXhlYyk7Ci0gICAgICB0cC0+c19yZWxwdHIgPSAwOwotICAgICAgdHAtPnNfbG5ub3B0ciA9IDA7Ci0gICAgICB0cC0+c19ucmVsb2MgPSAwOwotICAgICAgdHAtPnNfbmxubm8gPSAwOwotICAgICAgdHAtPnNfZmxhZ3MgPSAweDIwOwotICAgICAgc3RyY3B5IChkcC0+c19uYW1lLCAiLmRhdGEiKTsKLSAgICAgIGRwLT5zX3BhZGRyID0gZGF0YV9zdGFydDsKLSAgICAgIGRwLT5zX3ZhZGRyID0gZGF0YV9zdGFydDsKLSAgICAgIGRwLT5zX3NpemUgPSBkYXRhX3NpemU7Ci0gICAgICBkcC0+c19zY25wdHIgPSB0cC0+c19zY25wdHIgKyB0cC0+c19zaXplOwotICAgICAgZHAtPnNfcmVscHRyID0gMDsKLSAgICAgIGRwLT5zX2xubm9wdHIgPSAwOwotICAgICAgZHAtPnNfbnJlbG9jID0gMDsKLSAgICAgIGRwLT5zX25sbm5vID0gMDsKLSAgICAgIGRwLT5zX2ZsYWdzID0gMHg0MDsKLSAgICAgIHN0cmNweSAoYnAtPnNfbmFtZSwgIi5ic3MiKTsKLSAgICAgIGJwLT5zX3BhZGRyID0gZHAtPnNfdmFkZHIgKyBkcC0+c19zaXplOwotICAgICAgYnAtPnNfdmFkZHIgPSBicC0+c19wYWRkcjsKLSAgICAgIGJwLT5zX3NpemUgPSBic3Nfc2l6ZTsKLSAgICAgIGJwLT5zX3NjbnB0ciA9IDA7Ci0gICAgICBicC0+c19yZWxwdHIgPSAwOwotICAgICAgYnAtPnNfbG5ub3B0ciA9IDA7Ci0gICAgICBicC0+c19ucmVsb2MgPSAwOwotICAgICAgYnAtPnNfbmxubm8gPSAwOwotICAgICAgYnAtPnNfZmxhZ3MgPSAweDgwOwotCi0gICAgICBjb2ZmaGVhZGVyLmZfbWFnaWMgPSBDT0ZGX01BR0lDOwotICAgICAgY29mZmhlYWRlci5mX25zY25zID0gMzsKLSAgICAgIC8qIHN0b3JlIGFuIHVubGlrZWx5IHRpbWUgc28gcHJvZ3JhbXMgY2FuCi0gICAgICAgKiB0ZWxsIHRoYXQgdGhlcmUgaXMgYSBic2QgaGVhZGVyCi0gICAgICAgKi8KLSAgICAgIGNvZmZoZWFkZXIuZl90aW1kYXQgPSAxOwotICAgICAgY29mZmhlYWRlci5mX3N5bXB0ciA9IDA7Ci0gICAgICBjb2ZmaGVhZGVyLmZfbnN5bXMgPSAwOwotICAgICAgY29mZmhlYWRlci5mX29wdGhkciA9IDI4OwotICAgICAgY29mZmhlYWRlci5mX2ZsYWdzID0gMHgxMDM7Ci0gICAgICAvKiBhb3V0aGRyICovCi0gICAgICBjb2ZmaGVhZGVyLm1hZ2ljID0gWk1BR0lDOwotICAgICAgY29mZmhlYWRlci52c3RhbXAgPSAwOwotICAgICAgY29mZmhlYWRlci50c2l6ZSA9IHRwLT5zX3NpemU7Ci0gICAgICBjb2ZmaGVhZGVyLmRzaXplID0gZHAtPnNfc2l6ZTsKLSAgICAgIGNvZmZoZWFkZXIuYnNpemUgPSBicC0+c19zaXplOwotICAgICAgY29mZmhlYWRlci5lbnRyeSA9IG91dGhlYWRlci5hX2VudHJ5OwotICAgICAgY29mZmhlYWRlci50ZXh0X3N0YXJ0ID0gdHAtPnNfdmFkZHI7Ci0gICAgICBjb2ZmaGVhZGVyLmRhdGFfc3RhcnQgPSBkcC0+c192YWRkcjsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgaWYgKG5lZWRfY29mZl9oZWFkZXIpCi0gICAgbXl3cml0ZSAoJmNvZmZoZWFkZXIsIHNpemVvZiBjb2ZmaGVhZGVyLCAxLCBvdXRkZXNjKTsKLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgcGFkZmlsZSAoTl9UWFRPRkYgKG91dGhlYWRlcikgLSBzaXplb2Ygb3V0aGVhZGVyLCBvdXRkZXNjKTsKLSNlbmRpZgotCi0gIHRleHRfc2l6ZSAtPSBOX1RYVE9GRiAob3V0aGVhZGVyKTsKLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50IGVuY2FwX3dyaXRlX29iamVjdF9jb250ZW50cwotI2RlZmluZSBNWV9vYmplY3RfcCBlbmNhcF9vYmplY3RfcAotI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dC1uczMyay5jIGIvYmZkL2FvdXQtbnMzMmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhYzg0ZS4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC1uczMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgbnMzMmsgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gRGFsbCAoaWRhbGxAZWxlY2VuZy5hZGVsYWlkZS5lZHUuYXUpLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgIm5zMzJrLmgiCi0KLSNkZWZpbmUgTVlOUyhPUCkgQ0FUKG5zMzJrYW91dF8sT1ApCi1yZWxvY19ob3d0b190eXBlICoKLU1ZTlMoYmZkX3JlbG9jX3R5cGVfbG9va3VwKQotICBQQVJBTVMoKGJmZCAqYWJmZCBBTkQKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLWJvb2xlYW4KLU1ZTlMod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotICBQQVJBTVMoKGJmZCAqYWJmZCkpOwotCi0vKiBBdm9pZCBtdWx0aXBsZSBkZWZpbml0aW9ucyBmcm9tIGFvdXR4IGlmIHN1cHBvcnRpbmcgc3RhbmRhcmQgYS5vdXQgZm9ybWF0KHMpCi0gKiBhcyB3ZWxsIGFzIHRoaXMgb25lCi0gKi8KLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMobnMzMmthb3V0LF8zMl8seSkKLQotdm9pZCBiZmRfbnMzMmtfYXJjaCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNkZWZpbmUgTVkoT1ApIE1ZTlMoT1ApCi0KLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2NfaW4gTVkoc3dhcF9zdGRfcmVsb2NfaW4pCi0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX291dCBNWShzd2FwX3N0ZF9yZWxvY19vdXQpCi0KLXN0YXRpYyB2b2lkCi1NWV9zd2FwX3N0ZF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzLAotCQkJICAgICAgYXJlbGVudCAqY2FjaGVfcHRyLCBhc3ltYm9sICoqc3ltYm9scywKLQkJCSAgICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQpKTsKLQotc3RhdGljIHZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKmFiZmQsIGFyZWxlbnQgKmcsCi0JCQkgICAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyKSk7Ci0KLS8qIFRoZSBuczMyayBzZXJpZXMgaXMgYWgsIHVudXN1YWwsIHdoZW4gaXQgY29tZXMgdG8gcmVsb2NhdGlvbi4KLSAqIFRoZXJlIGFyZSB0aHJlZSBzdG9yYWdlIG1ldGhvZHMgZm9yIHJlbG9jYXRlYWJsZSBvYmplY3RzLiAgVGhlcmUKLSAqIGFyZSBkaXNwbGFjZW1lbnRzLCBpbW1lZGlhdGUgb3BlcmFuZHMgYW5kIG9yZGluYXJ5IHR3b3MgY29tcGxlbWVudAotICogZGF0YS4gT2YgdGhlc2UsIG9ubHkgdGhlIGxhc3QgZml0cyBpbnRvIHRoZSBzdGFuZGFyZCByZWxvY2F0aW9uCi0gKiBzY2hlbWUuICBJbW1lZGlhdGUgb3BlcmFuZHMgYXJlIHN0b3JlZCBodWZmbWFuIGVuY29kZWQgYW5kCi0gKiBpbW1lZGlhdGUgb3BlcmFuZHMgYXJlIHN0b3JlZCBiaWcgZW5kaWFuICh3aGVyZSBhcyB0aGUgbmF0dXJhbCBieXRlCi0gKiBvcmRlciBpcyBsaXR0bGUgZW5kaWFuIGZvciB0aGlzIGFjaGl0ZWN0dXJlKS4KLQotICogTm90ZSB0aGF0IHRoZSBuczMyayBkaXNwbGFjZW1lbnQgc3RvcmFnZSBtZXRob2QgaXMgb3J0aG9nb25hbCB0bwotICogd2hldGhlciB0aGUgcmVsb2NhdGlvbiBpcyBwYyByZWxhdGl2ZSBvciBub3QuIFRoZSAiZGlzcGxhY2VtZW50IgotICogc3RvcmFnZSBzY2hlbWUgaXMgdXNlZCBmb3IgZXNzZW50aWFsbHkgYWxsIGFkZHJlc3MgY29uc3RhbnRzLiBUaGUKLSAqIGRpc3BsYWNlbWVudCBjYW4gYmUgcmVsYXRpdmUgdG8gemVybyAoYWJzb2x1dGUgZGlzcGxhY2VtZW50KSwKLSAqIHJlbGF0aXZlIHRvIHRoZSBwYyAocGMgcmVsYXRpdmUpLCB0aGUgc3RhY2sgcG9pbnRlciwgdGhlIGZyYW1lCi0gKiBwb2ludGVyLCB0aGUgc3RhdGljIGJhc2UgcmVnaXN0ZXIgYW5kIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBldGMuCi0KLSAqIEZvciBleGFtcGxlOgotICoKLSAqICBzeW0xOiAubG9uZyAuCSMgcGMgcmVsYXRpdmUgMidzIGNvbXBsZW1lbnQKLSAqICBzeW0xOiAubG9uZyBmb28JIyAyJ3MgY29tcGxlbWVudCBub3QgcGMgcmVsYXRpdmUKLSAqCi0gKiAgc2VsZjogIG1vdmQgQHNlbGYsIHIwICMgcGMgcmVsYXRpdmUgZGlzcGxhY2VtZW50Ci0gKgkgICBtb3ZkIGZvbywgcjAgIyBub24gcGMgcmVsYXRpdmUgZGlzcGxhY2VtZW50Ci0gKgotICogIHNlbGY6ICBtb3ZkIHNlbGYsIHIwICMgcGMgcmVsYXRpdmUgaW1tZWRpYXRlCi0gKiAgICAgICAgIG1vdmQgZm9vLCByMCAjIG5vbiBwYyByZWxhdGl2ZSBpbW1lZGlhdGUKLSAqCi0gKiBJbiBhZGRpdGlvbiwgZm9yIGhpc3RvcmljYWwgcmVhc29ucyB0aGUgZW5jb2Rpbmcgb2YgdGhlIHJlbG9jYXRpb24gdHlwZXMKLSAqIGluIHRoZSBhLm91dCBmb3JtYXQgcmVsb2NhdGlvbiBlbnRyaWVzIGlzIHN1Y2ggdGhhdCBldmVuIHRoZSByZWxvY2F0aW9uCi0gKiBtZXRob2RzIHdoaWNoIGFyZSBzdGFuZGFyZCBhcmUgbm90IGVuY29kZWQgdGhlIHN0YW5kYXJkIHdheS4KLSAqCi0gKi8KLQotcmVsb2NfaG93dG9fdHlwZSBNWShob3d0b190YWJsZSlbXSA9IAotewotICAvKiBuczMyayBpbW1lZGlhdGUgb3BlcmFuZHMgKi8KLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fOCwgMCwgMCwgOCwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiTlMzMktfSU1NXzgiLAotCSB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwgdHJ1ZSwKLQkgX2JmZF9uczMya19yZWxvY19pbW0sICAiTlMzMktfSU1NXzE2IiwKLQkgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiTlMzMktfSU1NXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwsIDAsIDAsIDgsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgIlBDUkVMX05TMzJLX0lNTV84IiwKLQkgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTCwgMCwgMSwgMTYsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgIlBDUkVMX05TMzJLX0lNTV8xNiIsCi0JIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCwgMCwgMiwgMzIsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgIlBDUkVMX05TMzJLX0lNTV8zMiIsCi0JIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotCi0gIC8qIG5zMzJrIGRpc3BsYWNlbWVudHMgKi8KLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19ESVNQXzgsIDAsIDAsIDgsIGZhbHNlLCAwLCB0cnVlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJOUzMyS19ESVNQXzgiLAotCSB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIk5TMzJLX0RJU1BfMTYiLAotCSB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwgMCwgMiwgMzIsIGZhbHNlLCAwLCB0cnVlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJOUzMyS19ESVNQXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTCwgMCwgMCwgOCwgdHJ1ZSwgMCwgZmFsc2UsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIlBDUkVMX05TMzJLX0RJU1BfOCIsCi0JIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwsIDAsIDEsIDE2LCB0cnVlLCAwLCBmYWxzZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiUENSRUxfTlMzMktfRElTUF8xNiIsCi0JIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwsIDAsIDIsIDMyLCB0cnVlLCAwLCBmYWxzZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiUENSRUxfTlMzMktfRElTUF8zMiIsCi0JIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotCi0gIC8qIE5vcm1hbCAyJ3MgY29tcGxlbWVudCAqLwotICBIT1dUTyAoQkZEX1JFTE9DXzgsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLAotCSAiOCIsIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsCi0JICIxNiIsIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsCi0JICIzMiIsIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzhfUENSRUwsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkgIlBDUkVMXzgiLCB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ18xNl9QQ1JFTCwgMCwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkgIlBDUkVMXzE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfMzJfUENSRUwsIDAsIDIsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsCi0JICJQQ1JFTF8zMiIsIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLQotCi0jZGVmaW5lIENUT1JfVEFCTEVfUkVMT0NfSE9XVE8oQkZEKSAoTVkoaG93dG9fdGFibGUpICsgMTQpCi0KLSNkZWZpbmUgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9CSUcgMHgwNgotI2RlZmluZSBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX0xJVFRMRSAweDYwCi0jZGVmaW5lIFJFTE9DX1NURF9CSVRTX05TMzJLX1RZUEVfU0hfQklHIDEKLSNkZWZpbmUgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9TSF9MSVRUTEUgNQotCi1yZWxvY19ob3d0b190eXBlICoKLU1ZKHJlbG9jX2hvd3RvKShhYmZkLCByZWwsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsOwotICAgICBpbnQgKnJfaW5kZXg7Ci0gICAgIGludCAqcl9leHRlcm47Ci0gICAgIGludCAqcl9wY3JlbDsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9uczMya190eXBlOwotLyogIEJGRF9BU1NFUlQoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChhYmZkKSk7ICovCi0gICpyX2luZGV4ID0gICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCSAgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkgICAgICAgfCAgcmVsLT5yX2luZGV4WzBdICk7Ci0gICpyX2V4dGVybiAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICpyX3BjcmVsICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgcl9sZW5ndGggID0gICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKQotCQk+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLSAgcl9uczMya190eXBlICA9ICAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9MSVRUTEUpCi0JCSAgICA+PiBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSk7Ci0gIHJldHVybiAoTVkoaG93dG9fdGFibGUpICsgcl9sZW5ndGggKyAzICogKCpyX3BjcmVsKSArIDYgKiByX25zMzJrX3R5cGUpOwotfQotCi0jZGVmaW5lIE1ZX3JlbG9jX2hvd3RvKEJGRCxSRUwsSU4sRVgsUEMpIE1ZKHJlbG9jX2hvd3RvKShCRkQsIFJFTCwgJklOLCAmRVgsICZQQykKLQotdm9pZAotTVkocHV0X3JlbG9jKShhYmZkLCByX2V4dGVybiwgcl9pbmRleCwgdmFsdWUsIGhvd3RvLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcl9leHRlcm47Ci0gICAgIGludCByX2luZGV4OwotICAgICBsb25nIHZhbHVlOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2M7Ci17Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX25zMzJrX3R5cGU7Ci0gIFBVVF9XT1JEIChhYmZkLCB2YWx1ZSwgcmVsb2MtPnJfYWRkcmVzcyk7Ci0gIHJfbGVuZ3RoID0gaG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIHJfcGNyZWwgID0gKGludCkgaG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLSAgcl9uczMya190eXBlID0gKGhvd3RvIC0gTVkoaG93dG9fdGFibGUpICkvNjsKLS8qICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsgKi8KLSAgcmVsb2MtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICByZWxvYy0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgcmVsb2MtPnJfaW5kZXhbMF0gPSByX2luZGV4OwotICByZWxvYy0+cl90eXBlWzBdID0KLSAgICAocl9leHRlcm4/ICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEU6IDApCi0gICAgICB8IChyX3BjcmVsPyAgICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOiAwKQotCXwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKQotCSAgfCAocl9uczMya190eXBlIDw8ICBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSk7Ci19Ci0KLSNkZWZpbmUgTVlfcHV0X3JlbG9jKEJGRCwgRVhULCBJRFgsIFZBTCwgSE9XVE8sIFJFTE9DKSBcCi0gIE1ZKHB1dF9yZWxvYykoQkZELCBFWFQsIElEWCwgVkFMLCBIT1dUTywgUkVMT0MpCi0KLSNkZWZpbmUgU1RBVF9GT1JfRVhFQwotCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgX2JmZF9uczMya19maW5hbF9saW5rX3JlbG9jYXRlCi0jZGVmaW5lIE1ZX3JlbG9jYXRlX2NvbnRlbnRzIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMKLQotI2luY2x1ZGUgPGFvdXR4Lmg+Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTVkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKShhYmZkLGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0KLSNkZWZpbmUgRU5UUlkoaSxqKQljYXNlIGk6IHJldHVybiAmTVkoaG93dG9fdGFibGUpW2pdCi0KLSAgaW50IGV4dCA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9PSBSRUxPQ19FWFRfU0laRTsKLQotICBCRkRfQVNTRVJUKGV4dCA9PSAwKTsKLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCi0gICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0gICAgICB7Ci0gICAgICBjYXNlIDMyOgotCWNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzgsIDApOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwgMSk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzMyLCAyKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwgMyk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLCA0KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwsIDUpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwgNik7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8xNiwgNyk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwgOCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLCA5KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2X1BDUkVMLCAxMCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCwgMTEpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzgsIDEyKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ18xNiwgMTMpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzMyLCAxNCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfOF9QQ1JFTCwgMTUpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzE2X1BDUkVMLCAxNik7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfMzJfUENSRUwsIDE3KTsKLSAgICBkZWZhdWx0OiByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci0jdW5kZWYgRU5UUlkKLX0KLQotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIGludCByX3BjcmVsOwotICBzdHJ1Y3QgYW91dGRhdGEgICpzdSA9ICYoYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hKTsKLQotICBjYWNoZV9wdHItPmFkZHJlc3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IE1ZX3JlbG9jX2hvd3RvKGFiZmQsIGJ5dGVzLCByX2luZGV4LCByX2V4dGVybiwgcl9wY3JlbCk7Ci0KLSAgTU9WRV9BRERSRVNTKDApOwotfQotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfYWRkZW5kOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIHJfYWRkZW5kID0gZy0+YWRkZW5kICsgKCooZy0+c3ltX3B0cl9wdHIpKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICAKLSAgLyogbmFtZSB3YXMgY2xvYmJlcmVkIGJ5IGFvdXRfd3JpdGVfc3ltcyB0byBiZSBzeW1ib2wgaW5kZXggKi8KLQotICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gYSBzeW1ib2wgdGhlbiBzZXQgdGhlIAotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBDaGVjayBmb3IgdGhhdCBoZXJlLiAgKi8KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IG91dHB1dF9zZWN0aW9uID09ICZiZmRfYWJzX3NlY3Rpb24KLSAgICAgIHx8IG91dHB1dF9zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24pIAotICAgIHsKLSAgICAgIGlmIChiZmRfYWJzX3NlY3Rpb24uc3ltYm9sID09IHN5bSkKLQl7Ci0JICAvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiAqLwotCSAgcl9pbmRleCA9IDA7Ci0JICByX2V4dGVybiA9IDA7Ci0JfQotICAgICAgZWxzZSAKLQl7Ci0JICAvKiBGaWxsIGluIHN5bWJvbCAqLwotCSAgcl9leHRlcm4gPSAxOwotI3VuZGVmIEtFRVBJVAotI2RlZmluZSBLRUVQSVQgdWRhdGEuaQotCSAgcl9pbmRleCA9ICAoKihnLT5zeW1fcHRyX3B0cikpLT5LRUVQSVQ7Ci0jdW5kZWYgS0VFUElUICAgICAKLQl9Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCAgPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OyAgICAgIAotICAgIH0KLQotICBNWV9wdXRfcmVsb2MgKGFiZmQsIHJfZXh0ZXJuLCByX2luZGV4LCBnLT5hZGRyZXNzLCBnLT5ob3d0bywgbmF0cHRyKTsKLX0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX25zMzJrX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLCBsb2NhdGlvbikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLXsKLSAgaW50IHJfbnMzMmtfdHlwZSA9IChob3d0byAtIE1ZKGhvd3RvX3RhYmxlKSkgLyA2OwotICBsb25nICgqZ2V0X2RhdGEpIFBBUkFNUyAoKGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLSAgaW50ICgqcHV0X2RhdGEpIFBBUkFNUyAoKGxvbmcsIGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKLQotICBzd2l0Y2ggKHJfbnMzMmtfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgZ2V0X2RhdGEgPSBfYmZkX25zMzJrX2dldF9pbW1lZGlhdGU7Ci0gICAgICBwdXRfZGF0YSA9IF9iZmRfbnMzMmtfcHV0X2ltbWVkaWF0ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIGdldF9kYXRhID0gX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50OwotICAgICAgcHV0X2RhdGEgPSBfYmZkX25zMzJrX3B1dF9kaXNwbGFjZW1lbnQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgICAgbG9jYXRpb24pOwotICAgICAgLyogTk9UIFJFQUNIRUQgKi8KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci0gIHJldHVybiBfYmZkX2RvX25zMzJrX3JlbG9jX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgICAgICBsb2NhdGlvbiwgZ2V0X2RhdGEsIHB1dF9kYXRhKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9hb3V0LXNwYXJjbGUuYyBiL2JmZC9hb3V0LXNwYXJjbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzYjEzNi4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC1zcGFyY2xlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3Igc3BhcmMgbGl0dGxlLWVuZGlhbiBhb3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXNwYXJjLWxpdHRsZSIKLSNkZWZpbmUgTVkoT1ApIENBVChzcGFyY2xlX2FvdXRfLE9QKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9TUEFSQyB8fCAobXR5cGUpID09IE1fU1BBUkNMRVQpCi0KLS8qIEluY2x1ZGUgdGhlIHVzdWFsIGEub3V0IHN1cHBvcnQuICAqLwotI2RlZmluZSBUQVJHRVRfSVNfTElUVExFX0VORElBTl9QCi0jaW5jbHVkZSAiYW91dGYxLmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dC10YXJnZXQuaCBiL2JmZC9hb3V0LXRhcmdldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2E1MGFjLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LXRhcmdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUzICswLDAgQEAKLS8qIERlZmluZSBhIHRhcmdldCB2ZWN0b3IgYW5kIHNvbWUgc21hbGwgcm91dGluZXMgZm9yIGEgdmFyaWFudCBvZiBhLm91dC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotLyojaW5jbHVkZSAibGliYW91dC5oIiovCi0KLSNpZm5kZWYgU0VHTUVOVF9TSVpFCi0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZW5kaWYKLQotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgKiBOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotLyogU2V0IHBhcmFtZXRlcnMgYWJvdXQgdGhpcyBhLm91dCBmaWxlIHRoYXQgYXJlIG1hY2hpbmUtZGVwZW5kZW50LgotICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHNvbWVfYW91dF9vYmplY3RfcCBqdXN0IGJlZm9yZSBpdCByZXR1cm5zLiAgKi8KLSNpZm5kZWYgTVlfY2FsbGJhY2sKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKk1ZKGNhbGxiYWNrKSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWShjYWxsYmFjaykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgYXJjaF9hbGlnbl9wb3dlcjsKLSAgdW5zaWduZWQgbG9uZyBhcmNoX2FsaWduOwotCi0gIC8qIENhbGN1bGF0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgb2YgdGhlIHBhcnRzIG9mIGEgbmV3bHkgcmVhZCBhb3V0IGhlYWRlciAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IE5fVFhUU0laRSgqZXhlY3ApOwotCi0gIC8qIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gTl9UWFRBRERSKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSKCpleGVjcCk7Ci0gIG9ial9ic3NzZWMgIChhYmZkKS0+dm1hID0gTl9CU1NBRERSKCpleGVjcCk7Ci0KLSAgLyogRm9yIHNvbWUgdGFyZ2V0cywgaWYgdGhlIGVudHJ5IHBvaW50IGlzIG5vdCBpbiB0aGUgc2FtZSBwYWdlCi0gICAgIGFzIHRoZSBzdGFydCBvZiB0aGUgdGV4dCwgdGhlbiBhZGp1c3QgdGhlIFZNQSBzbyB0aGF0IGl0IGlzLgotICAgICBGSVhNRTogRG8gdGhpcyB3aXRoIGEgbWFjcm8gbGlrZSBTRVRfQVJDSF9NQUNIIGluc3RlYWQ/ICAqLwotICBpZiAoYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSAgICAgICYmIGV4ZWNwLT5hX2VudHJ5ID4gb2JqX3RleHRzZWMgKGFiZmQpLT52bWEpCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGp1c3Q7Ci0KLSAgICAgIGFkanVzdCA9IGV4ZWNwLT5hX2VudHJ5IC0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gICAgICAvKiBBZGp1c3Qgb25seSBieSB3aG9sZSBwYWdlcy4gKi8KLSAgICAgIGFkanVzdCAmPSB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKTsKLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hICs9IGFkanVzdDsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hICs9IGFkanVzdDsKLSAgICAgIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgKz0gYWRqdXN0OwotICAgIH0KLQotICAvKiBTZXQgdGhlIGxvYWQgYWRkcmVzc2VzIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSB2aXJ0dWFsIGFkZHJlc3Nlcy4gICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9EUkVMT0ZGKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKLSAgCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSNpZmRlZiBTRVRfQVJDSF9NQUNICi0gIFNFVF9BUkNIX01BQ0goYWJmZCwgKmV4ZWNwKTsKLSNlbHNlCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgREVGQVVMVF9BUkNILCAwKTsKLSNlbmRpZgotCi0gIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlcgotICAgICBTRVRfQVJDSF9NQUNILiAgSXQgYXNzdW1lcyB0aGF0IFNFVF9BUkNIX01BQ0ggd2lsbCBzZXQKLSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgY29ycmVjdGx5LCBpZiB0aGUgcmVsb2Mgc2l6ZSBpcyBub3QKLSAgICAgUkVMT0NfU1REX1NJWkUuICAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID0KLSAgICBleGVjcC0+YV90cnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQotICAgIGV4ZWNwLT5hX2Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLQotICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBhcmNoaXRlY3R1cmUsIHNldCB0aGUgYWxpZ25tZW50cyBvZiB0aGUKLSAgICAgc2VjdGlvbnMuICBUaGlzIGlzIG5vcm1hbGx5IGRvbmUgYnkgTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spLAotICAgICBidXQgd2hlbiB0aGUgaW5pdGlhbCBzZWN0aW9ucyB3ZXJlIGNyZWF0ZWQgdGhlIGFyY2hpdGVjdHVyZSBoYWQKLSAgICAgbm90IHlldCBiZWVuIHNldC4gIEhvd2V2ZXIsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB3ZSBkb24ndAotICAgICBzZXQgdGhlIGFsaWdubWVudCBwb3dlciBhbnkgaGlnaGVyIHRoYW4gYXMgcmVxdWlyZWQgYnkgdGhlIHNpemUKLSAgICAgb2YgdGhlIHNlY3Rpb24uICAqLwotICBhcmNoX2FsaWduX3Bvd2VyID0gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyOwotICBhcmNoX2FsaWduID0gMSA8PCBhcmNoX2FsaWduX3Bvd2VyOwotICBpZiAoKEJGRF9BTElHTiAob2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCi0gICAgICAgPT0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUpCi0gICAgICAmJiAoQkZEX0FMSUdOIChvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKLQkgID09IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplKQotICAgICAgJiYgKEJGRF9BTElHTiAob2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKLQkgID09IG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUpKQotICAgIHsKLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKLSAgICAgIG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBhcmNoX2FsaWduX3Bvd2VyOwotICAgIH0KLQotICAvKiBEb24ndCBzZXQgc2l6ZXMgbm93IC0tIGNhbid0IGJlIHN1cmUgdW50aWwgd2Uga25vdyBhcmNoICYgbWFjaC4KLSAgICAgU2l6ZXMgZ2V0IHNldCBpbiBzZXRfc2l6ZXMgY2FsbGJhY2ssIGxhdGVyLiAgKi8KLSNpZiAwCi0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotI2VuZGlmCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBNWV9vYmplY3RfcAotLyogRmluaXNoIHVwIHRoZSByZWFkaW5nIG9mIGFuIGEub3V0IGZpbGUgaGVhZGVyICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpNWShvYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotTVkob2JqZWN0X3ApIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CS8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsJCS8qIENsZWFuZWQtdXAgZXhlYyBoZWFkZXIgKi8KLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkgewotICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSNpZmRlZiBTV0FQX01BR0lDCi0gIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOwotI2Vsc2UKLSAgZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbmRpZiAvKiBTV0FQX01BR0lDICovCi0KLSAgaWYgKE5fQkFETUFHIChleGVjKSkgcmV0dXJuIDA7Ci0jaWZkZWYgTUFDSFRZUEVfT0sKLSAgaWYgKCEoTUFDSFRZUEVfT0sgKE5fTUFDSFRZUEUgKGV4ZWMpKSkpIHJldHVybiAwOwotI2VuZGlmCi0KLSAgTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pKGFiZmQsICZleGVjX2J5dGVzLCAmZXhlYyk7Ci0KLSNpZmRlZiBTV0FQX01BR0lDCi0gIC8qIHN3YXBfZXhlY19oZWFkZXJfaW4gcmVhZCBpbiBhX2luZm8gd2l0aCB0aGUgd3JvbmcgYnl0ZSBvcmRlciAqLwotICBleGVjLmFfaW5mbyA9IFNXQVBfTUFHSUMgKGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbmRpZiAvKiBTV0FQX01BR0lDICovCi0KLSAgdGFyZ2V0ID0gTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkgKGFiZmQsICZleGVjLCBNWShjYWxsYmFjaykpOwotCi0jaWZkZWYgRU5UUllfQ0FOX0JFX1pFUk8KLSAgLyogVGhlIE5FV1NPUzMgZW50cnktcG9pbnQgaXMvd2FzIDAsIHdoaWNoIChhbW9uZ3N0IG90aGVyIGxvc3NhZ2UpCi0gICAqIG1lYW5zIHRoYXQgaXQgaXNuJ3Qgb2J2aW91cyBpZiBFWEVDX1Agc2hvdWxkIGJlIHNldC4KLSAgICogQWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlIGZvciBhbiBleGVjdXRhYmxlOgotICAgKiBUaGVyZSBtdXN0IGJlIG5vIHJlbG9jYXRpb25zLCB0aGUgYmZkIGNhbiBiZSBuZWl0aGVyIGFuCi0gICAqIGFyY2hpdmUgbm9yIGFuIGFyY2hpdmUgZWxlbWVudCwgYW5kIHRoZSBmaWxlIG11c3QgYmUgZXhlY3V0YWJsZS4gKi8KLQotICBpZiAoZXhlYy5hX3Ryc2l6ZSArIGV4ZWMuYV9kcnNpemUgPT0gMAotICAgICAgJiYgYmZkX2dldF9mb3JtYXQoYWJmZCkgPT0gYmZkX29iamVjdCAmJiBhYmZkLT5teV9hcmNoaXZlID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgYnVmOwotI2lmbmRlZiBTX0lYVVNSCi0jZGVmaW5lIFNfSVhVU1IgMDEwMAkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KLSNlbmRpZgotICAgICAgaWYgKHN0YXQoYWJmZC0+ZmlsZW5hbWUsICZidWYpID09IDAgJiYgKGJ1Zi5zdF9tb2RlICYgU19JWFVTUikpCi0JYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICAgIH0KLSNlbmRpZiAvKiBFTlRSWV9DQU5fQkVfWkVSTyAqLwotCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0jZGVmaW5lIE1ZX29iamVjdF9wIE1ZKG9iamVjdF9wKQotI2VuZGlmCi0KLQotI2lmbmRlZiBNWV9ta29iamVjdAotCi1zdGF0aWMgYm9vbGVhbiBNWShta29iamVjdCkgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4KLU1ZKG1rb2JqZWN0KSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoTkFNRShhb3V0LG1rb2JqZWN0KShhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0jaWYgMCAvKiBTaXplcyBnZXQgc2V0IGluIHNldF9zaXplcyBjYWxsYmFjaywgbGF0ZXIsIGFmdGVyIHdlIGtub3cKLQkgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZS4gICovCi0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotI2RlZmluZSBNWV9ta29iamVjdCBNWShta29iamVjdCkKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0KLS8qIENvcHkgcHJpdmF0ZSBzZWN0aW9uIGRhdGEuICBUaGlzIGFjdHVhbGx5IGRvZXMgbm90aGluZyB3aXRoIHRoZQotICAgc2VjdGlvbnMuICBJdCBjb3BpZXMgdGhlIHN1YmZvcm1hdCBmaWVsZC4gIFdlIGNvcHkgaXQgaGVyZSwgYmVjYXVzZQotICAgd2UgbmVlZCB0byBrbm93IHdoZXRoZXIgdGhpcyBpcyBhIFFNQUdJQyBmaWxlIGJlZm9yZSB3ZSBzZXQgdGhlCi0gICBzZWN0aW9uIGNvbnRlbnRzLCBhbmQgY29weV9wcml2YXRlX2JmZF9kYXRhIGlzIG5vdCBjYWxsZWQgdW50aWwKLSAgIGFmdGVyIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBNWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotTVlfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMsIG9iZmQsIG9zZWMpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKmlzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cgotICAgICAgJiYgYmZkX2dldF9mbGF2b3VyIChvYmZkKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKLSAgICBvYmpfYW91dF9zdWJmb3JtYXQgKG9iZmQpID0gb2JqX2FvdXRfc3ViZm9ybWF0IChpYmZkKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZgotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZS4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotI2lmbmRlZiBNWV93cml0ZV9vYmplY3RfY29udGVudHMKLXN0YXRpYyBib29sZWFuCi1NWSh3cml0ZV9vYmplY3RfY29udGVudHMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotI2lmIENIT09TRV9SRUxPQ19TSVpFCi0gIENIT09TRV9SRUxPQ19TSVpFKGFiZmQpOwotI2Vsc2UKLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0jZW5kaWYKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX3NldF9zaXplcwotCi1zdGF0aWMgYm9vbGVhbiBNWShzZXRfc2l6ZXMpIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1NWShzZXRfc2l6ZXMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLQotI2lmZGVmIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUKLSAgYWRhdGEoYWJmZCkuem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSA9IFpNQUdJQ19ESVNLX0JMT0NLX1NJWkU7Ci0jZWxzZQotICBhZGF0YShhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSNlbmRpZgotCi0gIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0jZGVmaW5lIE1ZX3NldF9zaXplcyBNWShzZXRfc2l6ZXMpCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9leGVjX2hkcl9mbGFncwotI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyAwCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iYWNrZW5kX2RhdGEKLQotI2lmbmRlZiBNWV96bWFnaWNfY29udGlndW91cwotI2RlZmluZSBNWV96bWFnaWNfY29udGlndW91cyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIKLSNkZWZpbmUgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcwotI2RlZmluZSBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkCi0jZGVmaW5lIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfZHluYW1pY19zeW1ib2xzCi0jZGVmaW5lIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9saW5rX2R5bmFtaWNfb2JqZWN0Ci0jZGVmaW5lIE1ZX2xpbmtfZHluYW1pY19vYmplY3QgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9jaGVja19keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLSNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayAwCi0jZW5kaWYKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0gewotICBNWV96bWFnaWNfY29udGlndW91cywKLSAgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsCi0gIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcywKLSAgTVlfZXhlY19oZHJfZmxhZ3MsCi0gIDAsCQkJCS8qIHRleHQgdm1hPyAqLwotICBNWV9zZXRfc2l6ZXMsCi0gIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkLAotICBNWV9hZGRfZHluYW1pY19zeW1ib2xzLAotICBNWV9hZGRfb25lX3N5bWJvbCwKLSAgTVlfbGlua19keW5hbWljX29iamVjdCwKLSAgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wsCi0gIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MsCi0gIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLX07Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZmluYWxfbGlua19jYWxsYmFjawotCi0vKiBDYWxsYmFjayBmb3IgdGhlIGZpbmFsX2xpbmsgcm91dGluZSB0byBzZXQgdGhlIHNlY3Rpb24gb2Zmc2V0cy4gICovCi0KLXN0YXRpYyB2b2lkIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKLQotc3RhdGljIHZvaWQKLU1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgKGFiZmQsIHB0cmVsb2ZmLCBwZHJlbG9mZiwgcHN5bW9mZikKLSAgICAgYmZkICphYmZkOwotICAgICBmaWxlX3B0ciAqcHRyZWxvZmY7Ci0gICAgIGZpbGVfcHRyICpwZHJlbG9mZjsKLSAgICAgZmlsZV9wdHIgKnBzeW1vZmY7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAqcHRyZWxvZmYgPSBOX1RSRUxPRkYgKCpleGVjcCk7Ci0gICpwZHJlbG9mZiA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKLSAgKnBzeW1vZmYgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2ZpbmFsX2xpbmsKLQotLyogRmluYWwgbGluayByb3V0aW5lLiAgV2UgbmVlZCB0byB1c2UgYSBjYWxsIGJhY2sgdG8gZ2V0IHRoZSBjb3JyZWN0Ci0gICBvZmZzZXRzIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuIE1ZX2JmZF9maW5hbF9saW5rIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1NWV9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIE5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNlbmRpZgotCi0vKiBXZSBhc3N1bWUgQkZEIGdlbmVyaWMgYXJjaGl2ZSBmaWxlcy4gICovCi0jaWZuZGVmCU1ZX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZQlNWV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBNWV9nZXRfZWx0X2F0X2luZGV4CQlfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2VuZGlmCi0jaWZuZGVmCU1ZX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZQlNWV9nZW5lcmljX3N0YXRfYXJjaF9lbHQJYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2VuZGlmCi0jaWZuZGVmCU1ZX3NsdXJwX2FybWFwCi0jZGVmaW5lCU1ZX3NsdXJwX2FybWFwCQkJYmZkX3NsdXJwX2JzZF9hcm1hcAotI2VuZGlmCi0jaWZuZGVmCU1ZX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUJTVlfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQlfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNlbmRpZgotI2lmbmRlZiBNWV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBNWV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNlbmRpZgotI2lmbmRlZglNWV93cml0ZV9hcm1hcAotI2RlZmluZQlNWV93cml0ZV9hcm1hcAkJYnNkX3dyaXRlX2FybWFwCi0jZW5kaWYKLSNpZm5kZWYgTVlfcmVhZF9hcl9oZHIKLSNkZWZpbmUgTVlfcmVhZF9hcl9oZHIJCV9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2VuZGlmCi0jaWZuZGVmCU1ZX3RydW5jYXRlX2FybmFtZQotI2RlZmluZQlNWV90cnVuY2F0ZV9hcm5hbWUJCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lCi0jZW5kaWYKLSNpZm5kZWYgTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcAotI2RlZmluZSBNWV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcAotI2VuZGlmCi0KLS8qIE5vIGNvcmUgZmlsZSBkZWZpbmVkIGhlcmUgLS0gY29uZmlndXJlIGluIHRyYWQtY29yZS5jIHNlcGFyYXRlbHkuICAqLwotI2lmbmRlZglNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwJX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZW5kaWYKLSNpZm5kZWYJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAlcCi0JCQkJX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZW5kaWYKLSNpZm5kZWYJTVlfY29yZV9maWxlX3AKLSNkZWZpbmUJTVlfY29yZV9maWxlX3AJCV9iZmRfZHVtbXlfdGFyZ2V0Ci0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19zdGFydAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19zdGFydAkJYmZkX3ZvaWQKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19lbmQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fZW5kCQliZmRfdm9pZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZQlcCi0JCQkodm9pZCAoKikgUEFSQU1TICgoYmZkKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgTkFNRShhb3V0LGNvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBOQU1FKGFvdXQsY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgTkFNRShhb3V0LGNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkKLSNlbmRpZgotI2lmbmRlZiBNWV9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBNWV9zZXRfc2VjdGlvbl9jb250ZW50cyBOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgTkFNRShhb3V0LGdldF9zZWN0aW9uX2NvbnRlbnRzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2VuZGlmCi0jaWZuZGVmIE1ZX25ld19zZWN0aW9uX2hvb2sKLSNkZWZpbmUgTVlfbmV3X3NlY3Rpb25faG9vayBOQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vaykKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9zeW10YWJfdXBwZXJfYm91bmQgTkFNRShhb3V0LGdldF9zeW10YWJfdXBwZXJfYm91bmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bXRhYgotI2RlZmluZSBNWV9nZXRfc3ltdGFiIE5BTUUoYW91dCxnZXRfc3ltdGFiKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfcmVsb2MKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX3JlbG9jIE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgTVlfbWFrZV9lbXB0eV9zeW1ib2wKLSNkZWZpbmUgTVlfbWFrZV9lbXB0eV9zeW1ib2wgTkFNRShhb3V0LG1ha2VfZW1wdHlfc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3ByaW50X3N5bWJvbAotI2RlZmluZSBNWV9wcmludF9zeW1ib2wgTkFNRShhb3V0LHByaW50X3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgTVlfZ2V0X3N5bWJvbF9pbmZvIE5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2xpbmVubwotI2RlZmluZSBNWV9nZXRfbGluZW5vIE5BTUUoYW91dCxnZXRfbGluZW5vKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NldF9hcmNoX21hY2gKLSNkZWZpbmUgTVlfc2V0X2FyY2hfbWFjaCBOQU1FKGFvdXQsc2V0X2FyY2hfbWFjaCkKLSNlbmRpZgotI2lmbmRlZiBNWV9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBNWV9maW5kX25lYXJlc3RfbGluZSBOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgTVlfc2l6ZW9mX2hlYWRlcnMgTkFNRShhb3V0LHNpemVvZl9oZWFkZXJzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0JCQliZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBNWV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2djX3NlY3Rpb25zCi0jZGVmaW5lIE1ZX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgTkFNRShhb3V0LHJlbG9jX3R5cGVfbG9va3VwKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgTVlfcmVhZF9taW5pc3ltYm9scyBOQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykKLSNlbmRpZgotI2lmbmRlZiBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbAotI2RlZmluZSBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbCBOQU1FKGFvdXQsbWluaXN5bWJvbF90b19zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMgTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBNWV9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0jZW5kaWYKLQotCi0jaWZuZGVmIE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgTVlfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgTVlfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIE1ZX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBNWV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBNWV9jbG9zZV9hbmRfY2xlYW51cCBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBcCi0gIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgXAotICBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBcCi0gIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAotICBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotI2VuZGlmCi0KLS8qIEFvdXQgc3ltYm9scyBub3JtYWxseSBoYXZlIGxlYWRpbmcgdW5kZXJzY29yZXMgKi8KLSNpZm5kZWYgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAKLSNkZWZpbmUgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLSNlbmRpZgotCi0vKiBBb3V0IGFyY2hpdmVzIG5vcm1hbGx5IHVzZSBzcGFjZXMgZm9yIHBhZGRpbmcgKi8KLSNpZm5kZWYgQVJfUEFEX0NIQVIKLSNkZWZpbmUgQVJfUEFEX0NIQVIgJyAnCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9CRkRfVEFSR0VUCi1jb25zdCBiZmRfdGFyZ2V0IE1ZKHZlYykgPQotewotICBUQVJHRVROQU1FLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSNpZmRlZiBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChiaWcpICovCi0jZWxzZQotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBieXRlIG9yZGVyIChsaXR0bGUpICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotI2VuZGlmCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgQVJfUEFEX0NIQVIsCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0jaWZkZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLSNlbHNlCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotI2VuZGlmCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAotICAgIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKE1ZKSwKLQotICAvKiBBbHRlcm5hdGl2ZV90YXJnZXQgKi8KLSAgTlVMTCwKLSAgCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YQotfTsKLSNlbmRpZiAvKiBNWV9CRkRfVEFSR0VUICovCmRpZmYgLS1naXQgYS9iZmQvYW91dC10aWMzMC5jIGIvYmZkL2FvdXQtdGljMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjYWUwYy4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFRNUzMyMEMzMCBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAxMDI0Ci0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMTI4Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF90aWMzMAotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2RlZmluZSBNWShPUCkgQ0FUKHRpYzMwX2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC10aWMzMCIKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDModGljMzBfYW91dCxfMzJfLHkpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9maXhfMTYKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZml4XzMyCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB0aWMzMF9hb3V0X2ZpeF9wY3JlbF8xNgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICp0aWMzMF9hb3V0X3JlbG9jX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosIGludCAqLCBpbnQgKiwgaW50ICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9yZWxvY2F0ZV9jb250ZW50cwotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hLAotCSAgIGJmZF92bWEsIGJmZF92bWEpKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp0aWMzMF9hb3V0X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB0aWMzMF9hb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdGljMzBfYW91dF9zZXRfc2l6ZXMgUEFSQU1TICgoYmZkICopKTsKLQotI2RlZmluZSBNWV9yZWxvY19ob3d0byhCRkQsUkVMLElOLEVYLFBDKSB0aWMzMF9hb3V0X3JlbG9jX2hvd3RvKEJGRCxSRUwsJklOLCZFWCwmUEMpCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgdGljMzBfYW91dF9maW5hbF9saW5rX3JlbG9jYXRlCi0jZGVmaW5lIE1ZX29iamVjdF9wIHRpYzMwX2FvdXRfb2JqZWN0X3AKLSNkZWZpbmUgTVlfbWtvYmplY3QgTkFNRShhb3V0LG1rb2JqZWN0KQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgdGljMzBfYW91dF93cml0ZV9vYmplY3RfY29udGVudHMKLSNkZWZpbmUgTVlfc2V0X3NpemVzIHRpYzMwX2FvdXRfc2V0X3NpemVzCi0KLSNpZm5kZWYgTVlfZXhlY19oZHJfZmxhZ3MKLSNkZWZpbmUgTVlfZXhlY19oZHJfZmxhZ3MgMQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmFja2VuZF9kYXRhCi0KLSNpZm5kZWYgTVlfem1hZ2ljX2NvbnRpZ3VvdXMKLSNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyCi0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSNkZWZpbmUgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZAotI2RlZmluZSBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCAxCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX2R5bmFtaWNfc3ltYm9scwotI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfbGlua19keW5hbWljX29iamVjdAotI2RlZmluZSBNWV9saW5rX2R5bmFtaWNfb2JqZWN0IDAKLSNlbmRpZgotI2lmbmRlZiBNWV93cml0ZV9keW5hbWljX3N5bWJvbAotI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2hlY2tfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9maW5pc2hfZHluYW1pY19saW5rCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgMAotI2VuZGlmCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgdGljMzBfYW91dF9iYWNrZW5kX2RhdGEgPQotewotICBNWV96bWFnaWNfY29udGlndW91cywKLSAgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsCi0gIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcywKLSAgTVlfZXhlY19oZHJfZmxhZ3MsCi0gIDAsCQkJCS8qIHRleHQgdm1hPyAqLwotICBNWV9zZXRfc2l6ZXMsCi0gIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkLAotICBNWV9hZGRfZHluYW1pY19zeW1ib2xzLAotICBNWV9hZGRfb25lX3N5bWJvbCwKLSAgTVlfbGlua19keW5hbWljX29iamVjdCwKLSAgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wsCi0gIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MsCi0gIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLX07Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmdGljMzBfYW91dF9iYWNrZW5kX2RhdGEKLSNlbmRpZgotCi0vKiBGSVhNRTogVGhpcyBpcyB3cm9uZy4gIGFvdXR4Lmggc2hvdWxkIHJlYWxseSBvbmx5IGJlIGluY2x1ZGVkIGJ5Ci0gICBhb3V0MzIuYy4gICovCi0KLSNpbmNsdWRlICJhb3V0eC5oIgotCi0vKiBUaGlzIHRhYmxlIGxpc3RzIHRoZSByZWxvY2F0aW9uIHR5cGVzIGZvciB0aGUgVE1TMzIwQzMwLiAgVGhlcmUgYXJlCi0gICBvbmx5IGEgZmV3IHJlbG9jYXRpb25zIHJlcXVpcmVkLCBhbmQgYWxsIG11c3QgYmUgZGl2aWRlZCBieSA0ICg+PgotICAgMikgdG8gZ2V0IHRoZSAzMi1iaXQgYWRkcmVzc2VzIGluIHRoZSBmb3JtYXQgdGhlIFRNUzMyMEMzMCBsaWtlcwotICAgaXQuICovCi1yZWxvY19ob3d0b190eXBlIHRpYzMwX2FvdXRfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEVNUFRZX0hPV1RPICgtMSksCi0gIEhPV1RPICgxLCAyLCAxLCAxNiwgZmFsc2UsIDAsIDAsIHRpYzMwX2FvdXRfZml4XzE2LAotCSAiMTYiLCBmYWxzZSwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoMiwgMiwgMiwgMjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIjI0IiwgZmFsc2UsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDMsIDE4LCAzLCAyNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiTERQIiwgZmFsc2UsIDB4MDBGRjAwMDAsIDB4MDAwMDAwRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDQsIDIsIDQsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHRpYzMwX2FvdXRfZml4XzMyLAotCSAiMzIiLCBmYWxzZSwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoNSwgMiwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgdGljMzBfYW91dF9maXhfcGNyZWxfMTYsICJQQ1JFTCIsIHRydWUsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYsIHRydWUpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBFTVBUWV9IT1dUTyAoLTEpLAotICBFTVBUWV9IT1dUTyAoLTEpCi19OwotCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSAqTkFNRSAoYW91dCwgcmVsb2NfdHlwZV9sb29rdXApICgpOwotCi1yZWxvY19ob3d0b190eXBlICoKLXRpYzMwX2FvdXRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgIGNhc2UgQkZEX1JFTE9DX1RJQzMwX0xEUDoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVszXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVsxXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNDoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVsyXTsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVs1XTsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIHJldHVybiAmdGljMzBfYW91dF9ob3d0b190YWJsZVs0XTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi10aWMzMF9hb3V0X3JlbG9jX2hvd3RvIChhYmZkLCByZWxvY3MsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jczsKLSAgICAgaW50ICpyX2luZGV4OwotICAgICBpbnQgKnJfZXh0ZXJuOwotICAgICBpbnQgKnJfcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgdW5zaWduZWQgaW50IHJfcGNyZWxfZG9uZTsKLSAgaW50IGluZGV4OwotCi0gICpyX3BjcmVsID0gMDsKLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgKnJfaW5kZXggPSAoKHJlbG9jcy0+cl9pbmRleFswXSA8PCAxNikgfCAocmVsb2NzLT5yX2luZGV4WzFdIDw8IDgpIHwgcmVsb2NzLT5yX2luZGV4WzJdKTsKLSAgICAgICpyX2V4dGVybiA9ICgwICE9IChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICAgIHJfcGNyZWxfZG9uZSA9ICgwICE9IChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotICAgICAgcl9sZW5ndGggPSAoKHJlbG9jcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRykgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnJfaW5kZXggPSAoKHJlbG9jcy0+cl9pbmRleFsyXSA8PCAxNikgfCAocmVsb2NzLT5yX2luZGV4WzFdIDw8IDgpIHwgcmVsb2NzLT5yX2luZGV4WzBdKTsKLSAgICAgICpyX2V4dGVybiA9ICgwICE9IChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLSAgICAgIHJfcGNyZWxfZG9uZSA9ICgwICE9IChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSkpOwotICAgICAgcl9sZW5ndGggPSAoKHJlbG9jcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgfQotICBpbmRleCA9IHJfbGVuZ3RoICsgNCAqIHJfcGNyZWxfZG9uZTsKLSAgcmV0dXJuIHRpYzMwX2FvdXRfaG93dG9fdGFibGUgKyBpbmRleDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgY2FsbGJhY2sgZm9yIDE2LWJpdCByZWxvY3MuICBUaGlzIGlzCi0gICByZXF1aXJlZCBmb3IgcmVsb2NhdGlvbnMgYmV0d2VlbiBzZWdtZW50cy4gIEEgbGluZSBpbiBhb3V0eC5oCi0gICByZXF1aXJlcyB0aGF0IGFueSByZWxvY2F0aW9ucyBmb3IgdGhlIGRhdGEgc2VjdGlvbiBzaG91bGQgcG9pbnQgdG8KLSAgIHRoZSBlbmQgb2YgdGhlIGFsaWduZWQgdGV4dCBzZWN0aW9uLCBwbHVzIGFuIG9mZnNldC4gIEJ5IGRlZmF1bHQsCi0gICB0aGlzIGRvZXMgbm90IGhhcHBlbiwgdGhlcmVmb3JlIHRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZgotICAgdGhhdC4gKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9maXhfMTYgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzeW1ib2wncyBzZWN0aW9uIGlzIGRlZmluZWQuICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbiAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX29rIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLSAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzZWN0aW9uIGFuZCB0dXJuIGl0IGludG8gdGhlIFRNUzMyMEMzMAotICAgICAzMi1iaXQgYWRkcmVzcyBmb3JtYXQuICovCi0gIHJlbG9jYXRpb24gPSAoc3ltYm9sLT5zZWN0aW9uLT52bWEgPj4gMik7Ci0gIHJlbG9jYXRpb24gKz0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jYXRpb24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGljMzBfYW91dF9maXhfMTYgZXhjZXB0IGZvciAzMgotICAgYml0IHJlbG9jYXRpb25zLiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi10aWMzMF9hb3V0X2ZpeF8zMiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHN5bWJvbCdzIHNlY3Rpb24gaXMgZGVmaW5lZC4gKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIG91dHB1dF9iZmQgPyBiZmRfcmVsb2Nfb2sgOiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIGlucHV0IHNlY3Rpb24gYW5kIHR1cm4gaXQgaW50byB0aGUgVE1TMzIwQzMwCi0gICAgIDMyLWJpdCBhZGRyZXNzIGZvcm1hdC4gKi8KLSAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnNlY3Rpb24tPnZtYSA+PiAyKTsKLSAgcmVsb2NhdGlvbiArPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgcmVsb2NhdGlvbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3b3JrIG91dCBwYy1yZWxhdGl2ZSBvZmZzZXRzIGZvciB0aGUKLSAgIFRNUzMyMEMzMC4gIFRoZSBkYXRhIGFscmVhZHkgcGxhY2VkIGJ5IG1kX3BjcmVsX2Zyb20gd2l0aGluIGdhcyBpcwotICAgdXNlbGVzcyBmb3IgYSByZWxvY2F0aW9uLCBzbyB3ZSBqdXN0IGdldCB0aGUgb2Zmc2V0IHZhbHVlIGFuZCBwbGFjZQotICAgYSB2ZXJzaW9uIG9mIHRoaXMgd2l0aGluIHRoZSBvYmplY3QgY29kZS4KLSAgIHRpYzMwX2FvdXRfZmluYWxfbGlua19yZWxvY2F0ZSB3aWxsIHRoZW4gY2FsY3VsYXRlIHRoZSByZXF1aXJlZAotICAgcmVsb2NhdGlvbiB0byBhZGQgb24gdG8gdGhlIHZhbHVlIGluIHRoZSBvYmplY3QgY29kZS4gKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9maXhfcGNyZWxfMTYgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uID0gMTsKLSAgYmZkX2J5dGUgb2Zmc2V0X2RhdGEgPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgLSAxKTsKLQotICAvKiBUaGUgYnl0ZSBiZWZvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXggY29udGFpbnMgYml0cyAyMy0xNiBvZgotICAgICB0aGUgcGNyZWwgaW5zdHJ1Y3Rpb24uICBCaXQgMjEgaXMgc2V0IGZvciBhIGRlbGF5ZWQgaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggcmVxdWlyZXMgb24gb2Zmc2V0IG9mIDMgaW5zdGVhZCBvZiAxLiAqLwotICBpZiAob2Zmc2V0X2RhdGEgJiAweDIwKQotICAgIHJlbG9jYXRpb24gLT0gMzsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gLT0gMTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgcmVsb2NhdGlvbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+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+c2l6ZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgYmZkX3B1dGJfMjQgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gb3ZlcmZsb3cgPyBiZmRfcmVsb2Nfb3ZlcmZsb3cgOiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgcmVhZGluZyBvZiBhbiBhLm91dCBmaWxlIGhlYWRlciAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi10aWMzMF9hb3V0X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CS8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsJLyogQ2xlYW5lZC11cCBleGVjIGhlYWRlciAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNpZmRlZiBTV0FQX01BR0lDCi0gIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOwotI2Vsc2UKLSAgZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbmRpZiAvKiBTV0FQX01BR0lDICovCi0KLSAgaWYgKE5fQkFETUFHIChleGVjKSkKLSAgICByZXR1cm4gMDsKLSNpZmRlZiBNQUNIVFlQRV9PSwotICBpZiAoIShNQUNIVFlQRV9PSyAoTl9NQUNIVFlQRSAoZXhlYykpKSkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIE5BTUUgKGFvdXQsIHN3YXBfZXhlY19oZWFkZXJfaW4pIChhYmZkLCAmZXhlY19ieXRlcywgJmV4ZWMpOwotCi0jaWZkZWYgU1dBUF9NQUdJQwotICAvKiBzd2FwX2V4ZWNfaGVhZGVyX2luIHJlYWQgaW4gYV9pbmZvIHdpdGggdGhlIHdyb25nIGJ5dGUgb3JkZXIgKi8KLSAgZXhlYy5hX2luZm8gPSBTV0FQX01BR0lDIChleGVjX2J5dGVzLmVfaW5mbyk7Ci0jZW5kaWYgLyogU1dBUF9NQUdJQyAqLwotCi0gIHRhcmdldCA9IE5BTUUgKGFvdXQsIHNvbWVfYW91dF9vYmplY3RfcCkgKGFiZmQsICZleGVjLCB0aWMzMF9hb3V0X2NhbGxiYWNrKTsKLQotI2lmZGVmIEVOVFJZX0NBTl9CRV9aRVJPCi0gIC8qIFRoZSBORVdTT1MzIGVudHJ5LXBvaW50IGlzL3dhcyAwLCB3aGljaCAoYW1vbmdzdCBvdGhlciBsb3NzYWdlKQotICAgKiBtZWFucyB0aGF0IGl0IGlzbid0IG9idmlvdXMgaWYgRVhFQ19QIHNob3VsZCBiZSBzZXQuCi0gICAqIEFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZSBmb3IgYW4gZXhlY3V0YWJsZToKLSAgICogVGhlcmUgbXVzdCBiZSBubyByZWxvY2F0aW9ucywgdGhlIGJmZCBjYW4gYmUgbmVpdGhlciBhbgotICAgKiBhcmNoaXZlIG5vciBhbiBhcmNoaXZlIGVsZW1lbnQsIGFuZCB0aGUgZmlsZSBtdXN0IGJlIGV4ZWN1dGFibGUuICovCi0KLSAgaWYgKGV4ZWMuYV90cnNpemUgKyBleGVjLmFfZHJzaXplID09IDAKLSAgICAgICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfb2JqZWN0ICYmIGFiZmQtPm15X2FyY2hpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0jaWZuZGVmIFNfSVhVU1IKLSNkZWZpbmUgU19JWFVTUiAwMTAwCQkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KLSNlbmRpZgotICAgICAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmYnVmKSA9PSAwICYmIChidWYuc3RfbW9kZSAmIFNfSVhVU1IpKQotCWFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgICB9Ci0jZW5kaWYgLyogRU5UUllfQ0FOX0JFX1pFUk8gKi8KLQotICByZXR1cm4gdGFyZ2V0OwotfQotCi0vKiBDb3B5IHByaXZhdGUgc2VjdGlvbiBkYXRhLiAgVGhpcyBhY3R1YWxseSBkb2VzIG5vdGhpbmcgd2l0aCB0aGUKLSAgIHNlY3Rpb25zLiAgSXQgY29waWVzIHRoZSBzdWJmb3JtYXQgZmllbGQuICBXZSBjb3B5IGl0IGhlcmUsIGJlY2F1c2UKLSAgIHdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIHRoaXMgaXMgYSBRTUFHSUMgZmlsZSBiZWZvcmUgd2Ugc2V0IHRoZQotICAgc2VjdGlvbiBjb250ZW50cywgYW5kIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBpcyBub3QgY2FsbGVkIHVudGlsCi0gICBhZnRlciB0aGUgc2VjdGlvbiBjb250ZW50cyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotLypBUkdTVVNFRCAqLwotc3RhdGljIGJvb2xlYW4KLU1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjLCBvYmZkLCBvc2VjKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICppc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0gICAgb2JqX2FvdXRfc3ViZm9ybWF0IChvYmZkKSA9IG9ial9hb3V0X3N1YmZvcm1hdCAoaWJmZCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZS4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXRpYzMwX2FvdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotI2lmIENIT09TRV9SRUxPQ19TSVpFCi0gIENIT09TRV9SRUxPQ19TSVpFIChhYmZkKTsKLSNlbHNlCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotI2VuZGlmCi0gIHsKLSAgICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsJLyogZHVtbXkgdmFycyAqLwotICAgIGZpbGVfcHRyIHRleHRfZW5kOwotICAgIGlmIChhZGF0YSAoYWJmZCkubWFnaWMgPT0gdW5kZWNpZGVkX21hZ2ljKQotICAgICAgTkFNRSAoYW91dCwgYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsKLQotICAgIGV4ZWNwLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0gICAgZXhlY3AtPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotCi0gICAgZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gICAgZXhlY3AtPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gICAgTkFNRSAoYW91dCwgc3dhcF9leGVjX2hlYWRlcl9vdXQpIChhYmZkLCBleGVjcCwgJmV4ZWNfYnl0ZXMpOwotCi0gICAgaWYgKGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPiAwKQotICAgICAgewotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAoYmZkX3dyaXRlICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIDEsIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUsIGFiZmQpICE9IGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCi0KLSAgICBpZiAoYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSAhPSAoYXN5bWJvbCAqKikgTlVMTAotCSYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgICB7Ci0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChOX1NZTU9GRiAoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JaWYgKCFOQU1FIChhb3V0LCB3cml0ZV9zeW1zKSAoYWJmZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fVFJFTE9GRiAoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghTkFNRSAoYW91dCwgc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChOX0RSRUxPRkYgKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIU5BTUUgKGFvdXQsIHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdGljMzBfYW91dF9zZXRfc2l6ZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0KLSNpZmRlZiBTRUdNRU5UX1NJWkUKLSAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKLSNlbHNlCi0gIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotI2VuZGlmCi0KLSNpZmRlZiBaTUFHSUNfRElTS19CTE9DS19TSVpFCi0gIGFkYXRhIChhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplID0gWk1BR0lDX0RJU0tfQkxPQ0tfU0laRTsKLSNlbHNlCi0gIGFkYXRhIChhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSNlbmRpZgotCi0gIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZm5kZWYgTVlfZmluYWxfbGlua19jYWxsYmFjawotCi0vKiBDYWxsYmFjayBmb3IgdGhlIGZpbmFsX2xpbmsgcm91dGluZSB0byBzZXQgdGhlIHNlY3Rpb24gb2Zmc2V0cy4gICovCi0KLXN0YXRpYyB2b2lkIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKLQotc3RhdGljIHZvaWQKLU1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgKGFiZmQsIHB0cmVsb2ZmLCBwZHJlbG9mZiwgcHN5bW9mZikKLSAgICAgYmZkICphYmZkOwotICAgICBmaWxlX3B0ciAqcHRyZWxvZmY7Ci0gICAgIGZpbGVfcHRyICpwZHJlbG9mZjsKLSAgICAgZmlsZV9wdHIgKnBzeW1vZmY7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAqcHRyZWxvZmYgPSBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgKyBleGVjcC0+YV9kYXRhOwotICAqcGRyZWxvZmYgPSAqcHRyZWxvZmYgKyBleGVjcC0+YV90cnNpemU7Ci0gICpwc3ltb2ZmID0gKnBkcmVsb2ZmICsgZXhlY3AtPmFfZHJzaXplOzsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2ZpbmFsX2xpbmsKLQotLyogRmluYWwgbGluayByb3V0aW5lLiAgV2UgbmVlZCB0byB1c2UgYSBjYWxsIGJhY2sgdG8gZ2V0IHRoZSBjb3JyZWN0Ci0gICBvZmZzZXRzIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1NWV9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICBmaWxlX3B0ciBwb3M7Ci0gIGJmZF92bWEgdm1hID0gMDsKLSAgaW50IHBhZDsKLQotICAvKiBTZXQgdGhlIGV4ZWN1dGFibGUgaGVhZGVyIHNpemUgdG8gMCwgYXMgd2UgZG9uJ3Qgd2FudCBvbmUgZm9yIGFuCi0gICAgIG91dHB1dC4gKi8KLSAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IDA7Ci0gIHBvcyA9IGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci0gIC8qIFRleHQuICAqLwotICB2bWEgPSBpbmZvLT5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbi0+dm1hOwotICBwb3MgKz0gdm1hOwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gdm1hOwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnVzZXJfc2V0X3ZtYSA9IDE7Ci0gIHBvcyArPSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgdm1hICs9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIERhdGEuICAqLwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKQotICAgIHsKLSAgICAgIGlmIChpbmZvLT5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbi0+bmV4dC0+dm1hID4gMCkKLQlvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uLT5uZXh0LT52bWE7Ci0gICAgICBlbHNlCi0Jb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgNCk7Ci0gICAgfQotICBpZiAob2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPCB2bWEpCi0gICAgewotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgNCk7Ci0gICAgfQotICBvYmpfZGF0YXNlYyAoYWJmZCktPnVzZXJfc2V0X3ZtYSA9IDE7Ci0gIHZtYSA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSB2bWEgKyBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplOwotICBleGVjcC0+YV90ZXh0ID0gdm1hIC0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfdGV4dDsKLQotICAvKiBTaW5jZSBCU1MgZm9sbG93cyBkYXRhIGltbWVkaWF0ZWx5LCBzZWUgaWYgaXQgbmVlZHMgYWxpZ25tZW50LiAgKi8KLSAgdm1hICs9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBwYWQgPSBhbGlnbl9wb3dlciAodm1hLCBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKSAtIHZtYTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOwotICBwb3MgKz0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBCU1MuICAqLwotICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gdm1hOwotICBvYmpfYnNzc2VjIChhYmZkKS0+dXNlcl9zZXRfdm1hID0gMTsKLQotICAvKiBXZSBhcmUgZnVsbHkgcmVzaXplZCwgc28gZG9uJ3QgcmVhZGp1c3QgaW4gZmluYWxfbGluay4gKi8KLSAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gel9tYWdpYzsKLQotICByZXR1cm4gTkFNRSAoYW91dCwgZmluYWxfbGluaykgKGFiZmQsIGluZm8sIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOwotfQotCi0jZW5kaWYKLQotZW51bSBtYWNoaW5lX3R5cGUKLXRpYzMwX2FvdXRfbWFjaGluZV90eXBlIChhcmNoLCBtYWNoaW5lLCB1bmtub3duKQotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gKnVua25vd247Ci17Ci0gIGVudW0gbWFjaGluZV90eXBlIGFyY2hfZmxhZ3M7Ci0KLSAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgKnVua25vd24gPSB0cnVlOwotCi0gIHN3aXRjaCAoYXJjaCkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF90aWMzMDoKLSAgICAgICp1bmtub3duID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgICB9Ci0gIGlmIChhcmNoX2ZsYWdzICE9IE1fVU5LTk9XTikKLSAgICAqdW5rbm93biA9IGZhbHNlOwotICByZXR1cm4gYXJjaF9mbGFnczsKLX0KLQotYm9vbGVhbgotdGljMzBfYW91dF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGlmICghYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYXJjaCAhPSBiZmRfYXJjaF91bmtub3duKQotICAgIHsKLSAgICAgIGJvb2xlYW4gdW5rbm93bjsKLSAgICAgIHRpYzMwX2FvdXRfbWFjaGluZV90eXBlIChhcmNoLCBtYWNoaW5lLCAmdW5rbm93bik7Ci0gICAgICBpZiAodW5rbm93bikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgcmV0dXJuICgqYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5zZXRfc2l6ZXMpIChhYmZkKTsKLX0KLQotLyogV2UgYXNzdW1lIEJGRCBnZW5lcmljIGFyY2hpdmUgZmlsZXMuICAqLwotI2lmbmRlZglNWV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUJTVlfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgTVlfZ2V0X2VsdF9hdF9pbmRleAkJX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNlbmRpZgotI2lmbmRlZglNWV9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUJTVlfZ2VuZXJpY19zdGF0X2FyY2hfZWx0CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9hcm1hcAotI2RlZmluZQlNWV9zbHVycF9hcm1hcAkJCWJmZF9zbHVycF9ic2RfYXJtYXAKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lCU1ZX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUJX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYJTVlfd3JpdGVfYXJtYXAKLSNkZWZpbmUJTVlfd3JpdGVfYXJtYXAJCWJzZF93cml0ZV9hcm1hcAotI2VuZGlmCi0jaWZuZGVmIE1ZX3JlYWRfYXJfaGRyCi0jZGVmaW5lIE1ZX3JlYWRfYXJfaGRyCQlfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNlbmRpZgotI2lmbmRlZglNWV90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUJTVlfdHJ1bmNhdGVfYXJuYW1lCQliZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2VuZGlmCi0jaWZuZGVmIE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNkZWZpbmUgTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNlbmRpZgotCi0vKiBObyBjb3JlIGZpbGUgZGVmaW5lZCBoZXJlIC0tIGNvbmZpZ3VyZSBpbiB0cmFkLWNvcmUuYyBzZXBhcmF0ZWx5LiAgKi8KLSNpZm5kZWYJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNlbmRpZgotI2lmbmRlZglNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AJXAotCQkJCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wCQlfYmZkX2R1bW15X3RhcmdldAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQJCWJmZF92b2lkCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fZW5kCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAkJYmZkX3ZvaWQKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAotCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCosIHN0cnVjdCBzZWMgKikpKSBiZmRfdm9pZAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIE5BTUUoYW91dCxjb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgTkFNRShhb3V0LGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUgTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIE5BTUUoYW91dCxjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfc2V0X3NlY3Rpb25fY29udGVudHMgTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNlbmRpZgotI2lmbmRlZiBNWV9uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIE1ZX25ld19zZWN0aW9uX2hvb2sgTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zeW10YWIKLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBOQU1FKGFvdXQsZ2V0X3N5bXRhYikKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKQotI2VuZGlmCi0jaWZuZGVmIE1ZX21ha2VfZW1wdHlfc3ltYm9sCi0jZGVmaW5lIE1ZX21ha2VfZW1wdHlfc3ltYm9sIE5BTUUoYW91dCxtYWtlX2VtcHR5X3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9wcmludF9zeW1ib2wKLSNkZWZpbmUgTVlfcHJpbnRfc3ltYm9sIE5BTUUoYW91dCxwcmludF9zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIE1ZX2dldF9zeW1ib2xfaW5mbyBOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9saW5lbm8KLSNkZWZpbmUgTVlfZ2V0X2xpbmVubyBOQU1FKGFvdXQsZ2V0X2xpbmVubykKLSNlbmRpZgotI2lmbmRlZiBNWV9zZXRfYXJjaF9tYWNoCi0jZGVmaW5lIE1ZX3NldF9hcmNoX21hY2ggdGljMzBfYW91dF9zZXRfYXJjaF9tYWNoCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgTVlfZmluZF9uZWFyZXN0X2xpbmUgTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NpemVvZl9oZWFkZXJzCi0jZGVmaW5lIE1ZX3NpemVvZl9oZWFkZXJzIE5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBNWV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHRpYzMwX2FvdXRfcmVsb2NfdHlwZV9sb29rdXAKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIE1ZX3JlYWRfbWluaXN5bWJvbHMgTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgTVlfbWluaXN5bWJvbF90b19zeW1ib2wgTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2VuZGlmCi0KLQotI2lmbmRlZiBNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBNWV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBNWV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8gTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgTVlfY2xvc2VfYW5kX2NsZWFudXAgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNlbmRpZgotCi0vKiBBb3V0IHN5bWJvbHMgbm9ybWFsbHkgaGF2ZSBsZWFkaW5nIHVuZGVyc2NvcmVzICovCi0jaWZuZGVmIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIKLSNkZWZpbmUgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLSNlbmRpZgotCi0vKiBBb3V0IGFyY2hpdmVzIG5vcm1hbGx5IHVzZSBzcGFjZXMgZm9yIHBhZGRpbmcgKi8KLSNpZm5kZWYgQVJfUEFEX0NIQVIKLSNkZWZpbmUgQVJfUEFEX0NIQVIgJyAnCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9CRkRfVEFSR0VUCi1jb25zdCBiZmRfdGFyZ2V0IHRpYzMwX2FvdXRfdmVjID0KLXsKLSAgVEFSR0VUTkFNRSwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotICAoSEFTX1JFTE9DIHwJCQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgQVJfUEFEX0NIQVIsCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEKLX07Ci0jZW5kaWYgLyogTVlfQkZEX1RBUkdFVCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQwLmMgYi9iZmQvYW91dDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjN2FlMC4uMDAwMDAwMAotLS0gYS9iZmQvYW91dDAuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBTdW5PUyBzdHlsZSBhLm91dCB3aXRoIGZsYWdzIHNldCB0byAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtemVyby1iaWciCi0jZGVmaW5lIE1ZKE9QKSBDQVQoYW91dDBfYmlnXyxPUCkKLQotI2luY2x1ZGUgImJmZC5oIgotCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDAKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgXAotICAoKG10eXBlKSA9PSBNX1VOS05PV04gfHwgKG10eXBlKSA9PSBNXzY4MDEwIHx8IChtdHlwZSkgPT0gTV82ODAyMCkKLQotLyogSW5jbHVkZSB0aGUgdXN1YWwgYS5vdXQgc3VwcG9ydC4gICovCi0jaW5jbHVkZSAiYW91dGYxLmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dDMyLmMgYi9iZmQvYW91dDMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzQwYjQuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciAzMi1iaXQgYS5vdXQgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAiYW91dHguaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0NjQuYyBiL2JmZC9hb3V0NjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQwMzZjOC4uMDAwMDAwMAotLS0gYS9iZmQvYW91dDY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIDY0LWJpdCBhLm91dCBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgNjQKLQotLyogYW91dHguaCByZXF1aXJlcyBkZWZpbml0aW9ucyBmb3IgQk1BR0lDIGFuZCBRTUFHSUMuICAqLwotI2lmbmRlZiBCTUFHSUMKLSNkZWZpbmUgQk1BR0lDIDAKLSNlbmRpZgotI2lmbmRlZiBRTUFHSUMKLSNkZWZpbmUgUU1BR0lDIDAKLSNlbmRpZgotCi0jaW5jbHVkZSAiYW91dHguaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0ZjEuaCBiL2JmZC9hb3V0ZjEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmOTViNS4uMDAwMDAwMAotLS0gYS9iZmQvYW91dGYxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NTkgKzAsMCBAQAotLyogQS5vdXQgImZvcm1hdCAxIiBmaWxlIGhhbmRsaW5nIGNvZGUgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImFvdXQvc3VuNC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIJCS8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLQotLyogVGhpcyBpcyBuZWVkZWQgdG8gcmVqZWN0IGEgTmV3c09TIGZpbGUsIGUuZy4gaW4KLSAgIGdkYi90ZXN0c3VpdGUvZ2RiLnQxMC9jcm9zc2xvYWQuZXhwLiA8a2luZ2RvbkBjeWdudXMuY29tPgotICAgSSBuZWVkZWQgdG8gYWRkIE1fVU5LTk9XTiB0byByZWNvZ25pemUgYSA2ODAwMCBvYmplY3QsIHNvIHRoaXMgd2lsbAotICAgcHJvYmFibHkgbm8gbG9uZ2VyIHJlamVjdCBhIE5ld3NPUyBvYmplY3QuICA8aWFuQGN5Z251cy5jb20+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/IHRydWUgOiBmYWxzZTsKLX0KLQotI2RlZmluZSBNWV9zZXRfc2l6ZXMgc3Vub3M0X3NldF9zaXplcwotc3RhdGljIGJvb2xlYW4KLXN1bm9zNF9zZXRfc2l6ZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDB4MjAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDB4MjAwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQotCi0vKiBXZSBkZWZhdWx0IHRvIHNldHRpbmcgdGhlIHRvb2x2ZXJzaW9uIGZpZWxkIHRvIDEsIGFzIGlzIHJlcXVpcmVkIGJ5Ci0gICBTdW5PUy4gICovCi0jaWZuZGVmIE1ZX2V4ZWNfaGRyX2ZsYWdzCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcwotI2RlZmluZSBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMKLSNkZWZpbmUgTVlfYWRkX2R5bmFtaWNfc3ltYm9scyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2xpbmtfZHluYW1pY19vYmplY3QKLSNkZWZpbmUgTVlfbGlua19keW5hbWljX29iamVjdCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfY2hlY2tfZHluYW1pY19yZWxvYyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluaXNoX2R5bmFtaWNfbGluawotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIDAKLSNlbmRpZgotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIHN1bm9zNF9hb3V0X2JhY2tlbmQgPQotewotICAwLAkJCQkvKiB6bWFnaWMgZmlsZXMgYXJlIG5vdCBjb250aWd1b3VzICovCi0gIDEsCQkJCS8qIHRleHQgaW5jbHVkZXMgaGVhZGVyICovCi0gIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcywKLSAgTVlfZXhlY19oZHJfZmxhZ3MsCi0gIDAsCQkJCS8qIGRlZmF1bHQgdGV4dCB2bWEgKi8KLSAgc3Vub3M0X3NldF9zaXplcywKLSAgMCwJCQkJLyogaGVhZGVyIGlzIGNvdW50ZWQgaW4gem1hZ2ljIHRleHQgKi8KLSAgTVlfYWRkX2R5bmFtaWNfc3ltYm9scywKLSAgTVlfYWRkX29uZV9zeW1ib2wsCi0gIE1ZX2xpbmtfZHluYW1pY19vYmplY3QsCi0gIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sLAotICBNWV9jaGVja19keW5hbWljX3JlbG9jLAotICBNWV9maW5pc2hfZHluYW1pY19saW5rCi19OwotDAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIAlzdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwJc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3Agc3Vub3M0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CQliZmRfdm9pZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19lbmQJCWJmZF92b2lkCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAotCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKLSNkZWZpbmUgTVlfY29yZV9maWxlX3AJCQlzdW5vczRfY29yZV9maWxlX3AKLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCU5BTUUoYW91dCxzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEJCQkmc3Vub3M0X2FvdXRfYmFja2VuZAotCi0jaWZuZGVmIFRBUkdFVF9JU19MSVRUTEVfRU5ESUFOX1AKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2VuZGlmCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2FvdXR4LmggYi9iZmQvYW91dHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1YTMyMS4uMDAwMDAwMAotLS0gYS9iZmQvYW91dHguaAorKysgL2Rldi9udWxsCkBAIC0xLDU3MTUgKzAsMCBAQAotLyogQkZEIHNlbWktZ2VuZXJpYyBiYWNrLWVuZCBmb3IgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlhLm91dCBiYWNrZW5kcwotCi0KLURFU0NSSVBUSU9OCi0KLQlCRkQgc3VwcG9ydHMgYSBudW1iZXIgb2YgZGlmZmVyZW50IGZsYXZvdXJzIG9mIGEub3V0IGZvcm1hdCwKLQl0aG91Z2ggdGhlIG1ham9yIGRpZmZlcmVuY2VzIGFyZSBvbmx5IHRoZSBzaXplcyBvZiB0aGUKLQlzdHJ1Y3R1cmVzIG9uIGRpc2ssIGFuZCB0aGUgc2hhcGUgb2YgdGhlIHJlbG9jYXRpb24KLQlpbmZvcm1hdGlvbi4KLQotCVRoZSBzdXBwb3J0IGlzIHNwbGl0IGludG8gYSBiYXNpYyBzdXBwb3J0IGZpbGUgQGZpbGV7YW91dHguaH0KLQlhbmQgb3RoZXIgZmlsZXMgd2hpY2ggZGVyaXZlIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlLiBPbmUKLQlkZXJpdmF0aW9uIGZpbGUgaXMgQGZpbGV7YW91dGYxLmh9IChmb3IgYS5vdXQgZmxhdm91ciAxKSwgYW5kCi0JYWRkcyB0byB0aGUgYmFzaWMgYS5vdXQgZnVuY3Rpb25zIHN1cHBvcnQgZm9yIHN1bjMsIHN1bjQsIDM4NgotCWFuZCAyOWsgYS5vdXQgZmlsZXMsIHRvIGNyZWF0ZSBhIHRhcmdldCBqdW1wIHZlY3RvciBmb3IgYQotCXNwZWNpZmljIHRhcmdldC4KLQotCVRoaXMgaW5mb3JtYXRpb24gaXMgZnVydGhlciBzcGxpdCBvdXQgaW50byBtb3JlIHNwZWNpZmljIGZpbGVzCi0JZm9yIGVhY2ggbWFjaGluZSwgaW5jbHVkaW5nIEBmaWxle3N1bm9zLmN9IGZvciBzdW4zIGFuZCBzdW40LAotCUBmaWxle25ld3NvczMuY30gZm9yIHRoZSBTb255IE5FV1MsIGFuZCBAZmlsZXtkZW1vNjQuY30gZm9yIGEKLQlkZW1vbnN0cmF0aW9uIG9mIGEgNjQgYml0IGEub3V0IGZvcm1hdC4KLQotCVRoZSBiYXNlIGZpbGUgQGZpbGV7YW91dHguaH0gZGVmaW5lcyBnZW5lcmFsIG1lY2hhbmlzbXMgZm9yCi0JcmVhZGluZyBhbmQgd3JpdGluZyByZWNvcmRzIHRvIGFuZCBmcm9tIGRpc2sgYW5kIHZhcmlvdXMKLQlvdGhlciBtZXRob2RzIHdoaWNoIEJGRCByZXF1aXJlcy4gSXQgaXMgaW5jbHVkZWQgYnkKLQlAZmlsZXthb3V0MzIuY30gYW5kIEBmaWxle2FvdXQ2NC5jfSB0byBmb3JtIHRoZSBuYW1lcwotCTw8YW91dF8zMl9zd2FwX2V4ZWNfaGVhZGVyX2luPj4sIDw8YW91dF82NF9zd2FwX2V4ZWNfaGVhZGVyX2luPj4sIGV0Yy4KLQotCUFzIGFuIGV4YW1wbGUsIHRoaXMgaXMgd2hhdCBnb2VzIG9uIHRvIG1ha2UgdGhlIGJhY2sgZW5kIGZvciBhCi0Jc3VuNCwgZnJvbSBAZmlsZXthb3V0MzIuY306Ci0KLXwJI2RlZmluZSBBUkNIX1NJWkUgMzIKLXwJI2luY2x1ZGUgImFvdXR4LmgiCi0KLQlXaGljaCBleHBvcnRzIG5hbWVzOgotCi18CS4uLgotfAlhb3V0XzMyX2Nhbm9uaWNhbGl6ZV9yZWxvYwotfAlhb3V0XzMyX2ZpbmRfbmVhcmVzdF9saW5lCi18CWFvdXRfMzJfZ2V0X2xpbmVubwotfAlhb3V0XzMyX2dldF9yZWxvY191cHBlcl9ib3VuZAotfAkuLi4KLQotCWZyb20gQGZpbGV7c3Vub3MuY306Ci0KLXwJI2RlZmluZSBUQVJHRVRfTkFNRSAiYS5vdXQtc3Vub3MtYmlnIgotfAkjZGVmaW5lIFZFQ05BTUUgICAgc3Vub3NfYmlnX3ZlYwotfAkjaW5jbHVkZSAiYW91dGYxLmgiCi0KLQlyZXF1aXJlcyBhbGwgdGhlIG5hbWVzIGZyb20gQGZpbGV7YW91dDMyLmN9LCBhbmQgcHJvZHVjZXMgdGhlIGp1bXAgdmVjdG9yCi0KLXwJc3Vub3NfYmlnX3ZlYwotCi0JVGhlIGZpbGUgQGZpbGV7aG9zdC1hb3V0LmN9IGlzIGEgc3BlY2lhbCBjYXNlLiAgSXQgaXMgZm9yIGEgbGFyZ2Ugc2V0Ci0Jb2YgaG9zdHMgdGhhdCB1c2UgYGBtb3JlIG9yIGxlc3Mgc3RhbmRhcmQnJyBhLm91dCBmaWxlcywgYW5kCi0JZm9yIHdoaWNoIGNyb3NzLWRlYnVnZ2luZyBpcyBub3QgaW50ZXJlc3RpbmcuICBJdCB1c2VzIHRoZQotCXN0YW5kYXJkIDMyLWJpdCBhLm91dCBzdXBwb3J0IHJvdXRpbmVzLCBidXQgZGV0ZXJtaW5lcyB0aGUKLQlmaWxlIG9mZnNldHMgYW5kIGFkZHJlc3NlcyBvZiB0aGUgdGV4dCwgZGF0YSwgYW5kIEJTUwotCXNlY3Rpb25zLCB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSwgYW5kIHRoZQotCWVudHJ5IHBvaW50IGFkZHJlc3MsIGluIGEgaG9zdC1kZXBlbmRlbnQgbWFubmVyLiAgT25jZSB0aGVzZQotCXZhbHVlcyBoYXZlIGJlZW4gZGV0ZXJtaW5lZCwgZ2VuZXJpYyBjb2RlIGlzIHVzZWQgdG8gaGFuZGxlCi0JdGhlICBvYmplY3QgZmlsZS4KLQotCVdoZW4gcG9ydGluZyBpdCB0byBydW4gb24gYSBuZXcgc3lzdGVtLCB5b3UgbXVzdCBzdXBwbHk6Ci0KLXwgICAgICAgIEhPU1RfUEFHRV9TSVpFCi18ICAgICAgICBIT1NUX1NFR01FTlRfU0laRQotfCAgICAgICAgSE9TVF9NQUNISU5FX0FSQ0ggICAgICAgKG9wdGlvbmFsKQotfCAgICAgICAgSE9TVF9NQUNISU5FX01BQ0hJTkUgICAgKG9wdGlvbmFsKQotfCAgICAgICAgSE9TVF9URVhUX1NUQVJUX0FERFIKLXwgICAgICAgIEhPU1RfU1RBQ0tfRU5EX0FERFIKLQotCWluIHRoZSBmaWxlIEBmaWxley4uL2luY2x1ZGUvc3lzL2gtQHZhcntYWFh9Lmh9IChmb3IgeW91ciBob3N0KS4gIFRoZXNlCi0JdmFsdWVzLCBwbHVzIHRoZSBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MgZGVmaW5lZCBpbiBAZmlsZXthLm91dC5ofSBvbgotCXlvdXIgaG9zdCBzeXN0ZW0sIHdpbGwgcHJvZHVjZSBhIEJGRCB0YXJnZXQgdGhhdCB3aWxsIGFjY2VzcwotCW9yZGluYXJ5IGEub3V0IGZpbGVzIG9uIHlvdXIgaG9zdC4gVG8gY29uZmlndXJlIGEgbmV3IG1hY2hpbmUKLQl0byB1c2UgQGZpbGV7aG9zdC1hb3V0LmN9LCBzcGVjaWZ5OgotCi18CVRERUZBVUxUUyA9IC1EREVGQVVMVF9WRUNUT1I9aG9zdF9hb3V0X2JpZ192ZWMKLXwJVERFUEZJTEVTPSBob3N0LWFvdXQubyB0cmFkLWNvcmUubwotCi0JaW4gdGhlIEBmaWxle2NvbmZpZy9AdmFye1hYWH0ubXR9IGZpbGUsIGFuZCBtb2RpZnkgQGZpbGV7Y29uZmlndXJlLmlufQotCXRvIHVzZSB0aGUKLQlAZmlsZXtAdmFye1hYWH0ubXR9IGZpbGUgKGJ5IHNldHRpbmcgIjw8YmZkX3RhcmdldD1YWFg+PiIpIHdoZW4geW91cgotCWNvbmZpZ3VyYXRpb24gaXMgc2VsZWN0ZWQuCi0KLSovCi0KLS8qIFNvbWUgYXNzdW1wdGlvbnM6Ci0gICAqIEFueSBCRkQgd2l0aCBEX1BBR0VEIHNldCBpcyBaTUFHSUMsIGFuZCB2aWNlIHZlcnNhLgotICAgICBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBzZXR0aW5nIG9mIFdQX1RFWFQgaXMgb24gb3V0cHV0LCBidXQgaXQnbGwKLSAgICAgZ2V0IHNldCBvbiBpbnB1dC4KLSAgICogQW55IEJGRCB3aXRoIERfUEFHRUQgY2xlYXIgYW5kIFdQX1RFWFQgc2V0IGlzIE5NQUdJQy4KLSAgICogQW55IEJGRCB3aXRoIGJvdGggZmxhZ3MgY2xlYXIgaXMgT01BR0lDLgotICAgKEp1c3Qgd2FudCB0byBtYWtlIHRoZXNlIGV4cGxpY2l0LCBzbyB0aGUgY29uZGl0aW9ucyB0ZXN0ZWQgaW4gdGhpcwotICAgZmlsZSBtYWtlIHNlbnNlIGlmIHlvdSdyZSBtb3JlIGZhbWlsaWFyIHdpdGggYS5vdXQgdGhhbiB3aXRoIEJGRC4pICAqLwotCi0jZGVmaW5lIEtFRVBJVCB1ZGF0YS5pCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLXN0YXRpYyBib29sZWFuIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGFvdXRfc3ltYm9sX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3RydWN0IGV4dGVybmFsX25saXN0ICopKTsKLXN0YXRpYyB2b2lkIGFkanVzdF9vX21hZ2ljIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqKSk7Ci1zdGF0aWMgdm9pZCBhZGp1c3Rfel9tYWdpYyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2V4ZWMgKikpOwotc3RhdGljIHZvaWQgYWRqdXN0X25fbWFnaWMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9leGVjICopKTsKLQotLyoKLVNVQlNFQ1RJT04KLQlSZWxvY2F0aW9ucwotCi1ERVNDUklQVElPTgotCVRoZSBmaWxlIEBmaWxle2FvdXR4Lmh9IHByb3ZpZGVzIGZvciBib3RoIHRoZSBAZW1waHtzdGFuZGFyZH0KLQlhbmQgQGVtcGh7ZXh0ZW5kZWR9IGZvcm1zIG9mIGEub3V0IHJlbG9jYXRpb24gcmVjb3Jkcy4KLQotCVRoZSBzdGFuZGFyZCByZWNvcmRzIGNvbnRhaW4gb25seSBhbgotCWFkZHJlc3MsIGEgc3ltYm9sIGluZGV4LCBhbmQgYSB0eXBlIGZpZWxkLiBUaGUgZXh0ZW5kZWQgcmVjb3JkcwotCSh1c2VkIG9uIDI5a3MgYW5kIHNwYXJjcykgYWxzbyBoYXZlIGEgZnVsbCBpbnRlZ2VyIGZvciBhbgotCWFkZGVuZC4KLQotKi8KLSNpZm5kZWYgQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTwotI2RlZmluZSBDVE9SX1RBQkxFX1JFTE9DX0lEWCAyCi0jZGVmaW5lIENUT1JfVEFCTEVfUkVMT0NfSE9XVE8oQkZEKSAoKG9ial9yZWxvY19lbnRyeV9zaXplKEJGRCkgPT0gUkVMT0NfRVhUX1NJWkUgXAotCSAgICAgPyBob3d0b190YWJsZV9leHQgOiBob3d0b190YWJsZV9zdGQpIFwKLQkgICAgKyBDVE9SX1RBQkxFX1JFTE9DX0lEWCkKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX3N3YXBfc3RkX3JlbG9jX2luCi0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX2luIE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX3N3YXBfc3RkX3JlbG9jX291dAotI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19vdXQgTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSNkZWZpbmUgTVlfZmluYWxfbGlua19yZWxvY2F0ZSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX3JlbG9jYXRlX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX3JlbG9jYXRlX2NvbnRlbnRzIF9iZmRfcmVsb2NhdGVfY29udGVudHMKLSNlbmRpZgotCi0jZGVmaW5lIGhvd3RvX3RhYmxlX2V4dCBOQU1FKGFvdXQsZXh0X2hvd3RvX3RhYmxlKQotI2RlZmluZSBob3d0b190YWJsZV9zdGQgTkFNRShhb3V0LHN0ZF9ob3d0b190YWJsZSkKLQotcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZV9leHRbXSA9Ci17Ci0gIC8qIHR5cGUgICAgICAgICAgIHJzICAgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgICAgICBwYXJ0X2lucGwgcmVhZG1hc2sgc2V0bWFzayBwY2RvbmUgKi8KLSAgSE9XVE8oUkVMT0NfOCwgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjgiLCAgICAgICAgZmFsc2UsIDAsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ18xNiwgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIxNiIsICAgICAgIGZhbHNlLCAwLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfMzIsICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMzIiLCAgICAgICBmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0RJU1A4LCAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJESVNQOCIsIAlmYWxzZSwgMCwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0RJU1AxNiwgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJESVNQMTYiLCAJZmFsc2UsIDAsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19ESVNQMzIsIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiRElTUDMyIiwgCWZhbHNlLCAwLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfV0RJU1AzMCwyLCAgMiwgCTMwLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIldESVNQMzAiLCAJZmFsc2UsIDAsMHgzZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19XRElTUDIyLDIsICAyLCAJMjIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiV0RJU1AyMiIsIAlmYWxzZSwgMCwweDAwM2ZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0hJMjIsICAgMTAsIDIsIAkyMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkhJMjIiLAlmYWxzZSwgMCwweDAwM2ZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DXzIyLCAgICAgMCwgIDIsIAkyMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjIyIiwgICAgICAgZmFsc2UsIDAsMHgwMDNmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ18xMywgICAgIDAsICAyLCAJMTMsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIxMyIsICAgICAgIGZhbHNlLCAwLDB4MDAwMDFmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfTE8xMCwgICAwLCAgMiwgCTEwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwwLCJMTzEwIiwgICAgIGZhbHNlLCAwLDB4MDAwMDAzZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfU0ZBX0JBU0UsMCwgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiU0ZBX0JBU0UiLCBmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1NGQV9PRkYxMywwLDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlNGQV9PRkYxMyIsZmFsc2UsIDAsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19CQVNFMTAsIDAsICAyLCAJMTAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIkJBU0UxMCIsICAgZmFsc2UsIDAsMHgwMDAwMDNmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19CQVNFMTMsIDAsICAyLAkxMywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJCQVNFMTMiLCAgIGZhbHNlLCAwLDB4MDAwMDFmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfQkFTRTIyLCAxMCwgMiwJMjIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFMjIiLCAgIGZhbHNlLCAwLDB4MDAzZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfUEMxMCwgICAwLCAgMiwJMTAsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIlBDMTAiLAlmYWxzZSwgMCwweDAwMDAwM2ZmLCB0cnVlKSwKLSAgSE9XVE8oUkVMT0NfUEMyMiwgICAxMCwgIDIsCTIyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIlBDMjIiLCBmYWxzZSwgMCwweDAwM2ZmZmZmLCB0cnVlKSwKLSAgSE9XVE8oUkVMT0NfSk1QX1RCTCwyLCAgMiwgCTMwLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkpNUF9UQkwiLCAJZmFsc2UsIDAsMHgzZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19TRUdPRkYxNiwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlNFR09GRjE2IiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19HTE9CX0RBVCwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkdMT0JfREFUIiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19KTVBfU0xPVCwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkpNUF9TTE9UIiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19SRUxBVElWRSwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJFTEFUSVZFIiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotICBIT1dUTygwLCAgMCwgMCwgICAgMCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTygwLCAgMCwgMCwgICAgMCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotI2RlZmluZSBSRUxPQ19TUEFSQ19SRVYzMiBSRUxPQ19XRElTUDE5Ci0gIEhPV1RPKFJFTE9DX1NQQVJDX1JFVjMyLCAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwwLCJSX1NQQVJDX1JFVjMyIiwgICAgICAgZmFsc2UsIDAsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLQotLyogQ29udmVydCBzdGFuZGFyZCByZWxvYyByZWNvcmRzIHRvICJhcmVsZW50IiBmb3JtYXQgKGluY2wgYnl0ZSBzd2FwKS4gICovCi0KLXJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVfc3RkW10gPSB7Ci0gIC8qIHR5cGUgICAgICAgICAgICAgIHJzIHNpemUgYnN6ICBwY3JlbCBiaXRwb3Mgb3ZyZiAgICAgICAgICAgICAgICAgICAgIHNmIG5hbWUgICAgIHBhcnRfaW5wbCByZWFkbWFzayAgc2V0bWFzayAgICBwY2RvbmUgKi8KLUhPV1RPKCAwLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCI4IiwJCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotSE9XVE8oIDEsCSAgICAgICAwLCAgMSwgCTE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLUhPV1RPKCAyLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi1IT1dUTyggMywJICAgICAgIDAsICA0LCAJNjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCI2NCIsCXRydWUsIDB4ZGVhZGRlYWQsMHhkZWFkZGVhZCwgZmFsc2UpLAotSE9XVE8oIDQsCSAgICAgICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLUhPV1RPKCA1LAkgICAgICAgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1AxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotSE9XVE8oIDYsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi1IT1dUTyggNywJICAgICAgIDAsICA0LCAJNjQsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQNjQiLAl0cnVlLCAweGZlZWRmYWNlLDB4ZmVlZGZhY2UsIGZhbHNlKSwKLUhPV1RPKCA4LAkgICAgICAgMCwgIDIsICAgIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJHT1RfUkVMIiwJZmFsc2UsICAgICAgICAgMCwweDAwMDAwMDAwLCBmYWxzZSksCi1IT1dUTyggOSwJICAgICAgIDAsICAxLCAgIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiQkFTRTE2IiwJZmFsc2UsMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi1IT1dUTygxMCwJICAgICAgIDAsICAyLCAgIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiQkFTRTMyIiwJZmFsc2UsMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLSAgSE9XVE8oMTYsCSAgICAgICAwLCAgMiwJIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJKTVBfVEFCTEUiLCBmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLSAgSE9XVE8oMzIsCSAgICAgICAwLCAgMiwJIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSRUxBVElWRSIsICBmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi1FTVBUWV9IT1dUTyAoLTEpLAotRU1QVFlfSE9XVE8gKC0xKSwKLUVNUFRZX0hPV1RPICgtMSksCi0gIEhPV1RPKDQwLAkgICAgICAgMCwgIDIsCSAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiQkFTRVJFTCIsICAgZmFsc2UsICAgICAgICAgMCwweDAwMDAwMDAwLCBmYWxzZSksCi19OwotCi0jZGVmaW5lIFRBQkxFX1NJWkUoVEFCTEUpCShzaXplb2YoVEFCTEUpL3NpemVvZihUQUJMRVswXSkpCi0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTkFNRShhb3V0LHJlbG9jX3R5cGVfbG9va3VwKSAoYWJmZCxjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotI2RlZmluZSBFWFQoaSxqKQljYXNlIGk6IHJldHVybiAmaG93dG9fdGFibGVfZXh0W2pdCi0jZGVmaW5lIFNURChpLGopCWNhc2UgaTogcmV0dXJuICZob3d0b190YWJsZV9zdGRbal0KLSAgaW50IGV4dCA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9PSBSRUxPQ19FWFRfU0laRTsKLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCi0gICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0gICAgICB7Ci0gICAgICBjYXNlIDMyOgotCWNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDY0OgotCWNvZGUgPSBCRkRfUkVMT0NfNjQ7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIGlmIChleHQpCi0gICAgc3dpdGNoIChjb2RlKQotICAgICAgewotCUVYVCAoQkZEX1JFTE9DXzMyLCAyKTsKLQlFWFQgKEJGRF9SRUxPQ19ISTIyLCA4KTsKLQlFWFQgKEJGRF9SRUxPQ19MTzEwLCAxMSk7Ci0JRVhUIChCRkRfUkVMT0NfMzJfUENSRUxfUzIsIDYpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIsIDcpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDMTMsIDEwKTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwgMTQpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX0JBU0UxMywgMTUpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCAxNSk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfR09UMjIsIDE2KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19QQzEwLCAxNyk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfUEMyMiwgMTgpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwgMTkpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1JFVjMyLCAyNik7Ci0gICAgICBkZWZhdWx0OiByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICAgIH0KLSAgZWxzZQotICAgIC8qIHN0ZCByZWxvY3MgKi8KLSAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICB7Ci0JU1REIChCRkRfUkVMT0NfMTYsIDEpOwotCVNURCAoQkZEX1JFTE9DXzMyLCAyKTsKLQlTVEQgKEJGRF9SRUxPQ184X1BDUkVMLCA0KTsKLQlTVEQgKEJGRF9SRUxPQ18xNl9QQ1JFTCwgNSk7Ci0JU1REIChCRkRfUkVMT0NfMzJfUENSRUwsIDYpOwotCVNURCAoQkZEX1JFTE9DXzE2X0JBU0VSRUwsIDkpOwotCVNURCAoQkZEX1JFTE9DXzMyX0JBU0VSRUwsIDEwKTsKLSAgICAgIGRlZmF1bHQ6IHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgICAgfQotfQotCi0vKgotU1VCU0VDVElPTgotCUludGVybmFsIGVudHJ5IHBvaW50cwotCi1ERVNDUklQVElPTgotCUBmaWxle2FvdXR4Lmh9IGV4cG9ydHMgc2V2ZXJhbCByb3V0aW5lcyBmb3IgYWNjZXNzaW5nIHRoZQotCWNvbnRlbnRzIG9mIGFuIGEub3V0IGZpbGUsIHdoaWNoIGFyZSBnYXRoZXJlZCBhbmQgZXhwb3J0ZWQgaW4KLQl0dXJuIGJ5IHZhcmlvdXMgZm9ybWF0IHNwZWNpZmljIGZpbGVzIChlZyBzdW5vcy5jKS4KLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JIGFvdXRfQHZhcntzaXplfV9zd2FwX2V4ZWNfaGVhZGVyX2luCi0KLVNZTk9QU0lTCi0Jdm9pZCBhb3V0X0B2YXJ7c2l6ZX1fc3dhcF9leGVjX2hlYWRlcl9pbiwKLSAgICAgICAgICAgKGJmZCAqYWJmZCwKLSAgICAgICAgICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMsCi0gICAgICAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3ApOwotCi1ERVNDUklQVElPTgotCVN3YXAgdGhlIGluZm9ybWF0aW9uIGluIGFuIGV4ZWN1dGFibGUgaGVhZGVyIEB2YXJ7cmF3X2J5dGVzfSB0YWtlbgotCWZyb20gYSByYXcgYnl0ZSBzdHJlYW0gbWVtb3J5IGltYWdlIGludG8gdGhlIGludGVybmFsIGV4ZWMgaGVhZGVyCi0Jc3RydWN0dXJlIEB2YXJ7ZXhlY3B9LgotKi8KLQotI2lmbmRlZiBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKSAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBUaGUgaW50ZXJuYWxfZXhlYyBzdHJ1Y3R1cmUgaGFzIHNvbWUgZmllbGRzIHRoYXQgYXJlIHVudXNlZCBpbiB0aGlzCi0gICAgIGNvbmZpZ3VyYXRpb24gKElFIGZvciBpOTYwKSwgc28gZW5zdXJlIHRoYXQgYWxsIHN1Y2ggdW5pbml0aWFsaXplZAotICAgICBmaWVsZHMgYXJlIHplcm8nZCBvdXQuICBUaGVyZSBhcmUgcGxhY2VzIHdoZXJlIHR3byBvZiB0aGVzZSBzdHJ1Y3RzCi0gICAgIGFyZSBtZW1jbXAnZCwgYW5kIHRodXMgdGhlIGNvbnRlbnRzIGRvIG1hdHRlci4gKi8KLSAgbWVtc2V0ICgoUFRSKSBleGVjcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYykpOwotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+YV9pbmZvICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOwotICBleGVjcC0+YV90ZXh0ICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGV4dCk7Ci0gIGV4ZWNwLT5hX2RhdGEgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kYXRhKTsKLSAgZXhlY3AtPmFfYnNzICAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Jzcyk7Ci0gIGV4ZWNwLT5hX3N5bXMgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKLSAgZXhlY3AtPmFfZW50cnkgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgZXhlY3AtPmFfdHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kcnNpemUpOwotfQotI2RlZmluZSBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4gTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pCi0jZW5kaWYKLQotLyoKLUZVTkNUSU9OCi0JYW91dF9AdmFye3NpemV9X3N3YXBfZXhlY19oZWFkZXJfb3V0Ci0KLVNZTk9QU0lTCi0Jdm9pZCBhb3V0X0B2YXJ7c2l6ZX1fc3dhcF9leGVjX2hlYWRlcl9vdXQKLQkgIChiZmQgKmFiZmQsCi0JICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwLAotCSAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMpOwotCi1ERVNDUklQVElPTgotCVN3YXAgdGhlIGluZm9ybWF0aW9uIGluIGFuIGludGVybmFsIGV4ZWMgaGVhZGVyIHN0cnVjdHVyZQotCUB2YXJ7ZXhlY3B9IGludG8gdGhlIGJ1ZmZlciBAdmFye3Jhd19ieXRlc30gcmVhZHkgZm9yIHdyaXRpbmcgdG8gZGlzay4KLSovCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9vdXQpIChhYmZkLCBleGVjcCwgcmF3X2J5dGVzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopcmF3X2J5dGVzOwotCi0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgcmF3IGRhdGEsIGZyb20gdGhlIGZpZWxkcyBpbiB0aGUgZXhlYyBzdHJ1Y3QuICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfaW5mbyAgLCBieXRlcy0+ZV9pbmZvKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3RleHQgICwgYnl0ZXMtPmVfdGV4dCk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kYXRhICAsIGJ5dGVzLT5lX2RhdGEpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfYnNzICAgLCBieXRlcy0+ZV9ic3MpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfc3ltcyAgLCBieXRlcy0+ZV9zeW1zKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2VudHJ5ICwgYnl0ZXMtPmVfZW50cnkpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdHJzaXplLCBieXRlcy0+ZV90cnNpemUpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZHJzaXplLCBieXRlcy0+ZV9kcnNpemUpOwotfQotCi0vKiBNYWtlIGFsbCB0aGUgc2VjdGlvbiBmb3IgYW4gYS5vdXQgZmlsZS4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAob2JqX3RleHRzZWMgKGFiZmQpID09IChhc2VjdGlvbiAqKSBOVUxMCi0gICAgICAmJiBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnRleHQiKSA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChvYmpfZGF0YXNlYyAoYWJmZCkgPT0gKGFzZWN0aW9uICopIE5VTEwKLSAgICAgICYmIGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZGF0YSIpID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG9ial9ic3NzZWMgKGFiZmQpID09IChhc2VjdGlvbiAqKSBOVUxMCi0gICAgICAmJiBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmJzcyIpID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9zb21lX2FvdXRfb2JqZWN0X3AKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfdGFyZ2V0ICphb3V0X0B2YXJ7c2l6ZX1fc29tZV9hb3V0X29iamVjdF9wCi0JIChiZmQgKmFiZmQsCi0JICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApKCkpOwotCi1ERVNDUklQVElPTgotCVNvbWUgYS5vdXQgdmFyaWFudCB0aGlua3MgdGhhdCB0aGUgZmlsZSBvcGVuIGluIEB2YXJ7YWJmZH0KLQljaGVja2luZyBpcyBhbiBhLm91dCBmaWxlLiAgRG8gc29tZSBtb3JlIGNoZWNraW5nLCBhbmQgc2V0IHVwCi0JZm9yIGFjY2VzcyBpZiBpdCByZWFsbHkgaXMuICBDYWxsIGJhY2sgdG8gdGhlIGNhbGxpbmcKLQllbnZpcm9ubWVudCdzICJmaW5pc2ggdXAiIGZ1bmN0aW9uIGp1c3QgYmVmb3JlIHJldHVybmluZywgdG8KLQloYW5kbGUgYW55IGxhc3QtbWludXRlIHNldHVwLgotKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1OQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSAoYWJmZCwgZXhlY3AsIGNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotICAgICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqKSk7Ci17Ci0gIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICpyYXdwdHIsICpvbGRyYXdwdHI7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnJlc3VsdDsKLQotICByYXdwdHIgPSAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKSk7Ci0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBvbGRyYXdwdHIgPSBhYmZkLT50ZGF0YS5hb3V0X2RhdGE7Ci0gIGFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9IHJhd3B0cjsKLQotICAvKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgb2xkIHRkYXRhIHN0cnVjdC4KLSAgICAgSW4gcGFydGljdWxhciwgd2Ugd2FudCB0aGUgc3ViZm9ybWF0LCBzaW5jZSBmb3IgaHB1eCBpdCB3YXMgc2V0IGluCi0gICAgIGhwMzAwaHB1eC5jOnN3YXBfZXhlY19oZWFkZXJfaW4gYW5kIHdpbGwgYmUgdXNlZCBpbgotICAgICBocDMwMGhwdXguYzpjYWxsYmFjay4gICovCi0gIGlmIChvbGRyYXdwdHIgIT0gTlVMTCkKLSAgICAqYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gKm9sZHJhd3B0cjsKLQotICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyID0gJnJhd3B0ci0+ZTsKLSAgKihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyKSA9ICpleGVjcDsJLyogQ29weSBpbiB0aGUgaW50ZXJuYWxfZXhlYyBzdHJ1Y3QgKi8KLSAgZXhlY3AgPSBhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyOwotCi0gIC8qIFNldCB0aGUgZmlsZSBmbGFncyAqLwotICBhYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKLSAgaWYgKGV4ZWNwLT5hX2Ryc2l6ZSB8fCBleGVjcC0+YV90cnNpemUpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotICAvKiBTZXR0aW5nIG9mIEVYRUNfUCBoYXMgYmVlbiBkZWZlcnJlZCB0byB0aGUgYm90dG9tIG9mIHRoaXMgZnVuY3Rpb24gKi8KLSAgaWYgKGV4ZWNwLT5hX3N5bXMpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUzsKLSAgaWYgKE5fRFlOQU1JQygqZXhlY3ApKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gWk1BR0lDKQotICAgIHsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IERfUEFHRUQgfCBXUF9URVhUOwotICAgICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gel9tYWdpYzsKLSAgICB9Ci0gIGVsc2UgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gUU1BR0lDKQotICAgIHsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IERfUEFHRUQgfCBXUF9URVhUOwotICAgICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gel9tYWdpYzsKLSAgICAgIGFkYXRhIChhYmZkKS5zdWJmb3JtYXQgPSBxX21hZ2ljX2Zvcm1hdDsKLSAgICB9Ci0gIGVsc2UgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gTk1BR0lDKQotICAgIHsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IFdQX1RFWFQ7Ci0gICAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSBuX21hZ2ljOwotICAgIH0KLSAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBPTUFHSUMKLQkgICB8fCBOX01BR0lDICgqZXhlY3ApID09IEJNQUdJQykKLSAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSBvX21hZ2ljOwotICBlbHNlCi0gICAgewotICAgICAgLyogU2hvdWxkIGhhdmUgYmVlbiBjaGVja2VkIHdpdGggTl9CQURNQUcgYmVmb3JlIHRoaXMgcm91dGluZQotCSB3YXMgY2FsbGVkLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gZXhlY3AtPmFfZW50cnk7Ci0KLSAgb2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgPSAoYW91dF9zeW1ib2xfdHlwZSAqKU5VTEw7Ci0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gZXhlY3AtPmFfc3ltcyAvIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KTsKLQotICAvKiBUaGUgZGVmYXVsdCByZWxvY2F0aW9uIGVudHJ5IHNpemUgaXMgdGhhdCBvZiB0cmFkaXRpb25hbCBWNyBVbml4LiAgKi8KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0KLSAgLyogVGhlIGRlZmF1bHQgc3ltYm9sIGVudHJ5IHNpemUgaXMgdGhhdCBvZiB0cmFkaXRpb25hbCBVbml4LiAqLwotICBvYmpfc3ltYm9sX2VudHJ5X3NpemUgKGFiZmQpID0gRVhURVJOQUxfTkxJU1RfU0laRTsKLQotI2lmZGVmIFVTRV9NTUFQCi0gIGJmZF9pbml0X3dpbmRvdyAoJm9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpKTsKLSAgYmZkX2luaXRfd2luZG93ICgmb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyAoYWJmZCkpOwotI2VuZGlmCi0gIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gTlVMTDsKLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSBOVUxMOwotICBvYmpfYW91dF9zeW1faGFzaGVzIChhYmZkKSA9IE5VTEw7Ci0KLSAgaWYgKCEgTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX2RhdGE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV9ic3M7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5mbGFncyA9Ci0gICAgKGV4ZWNwLT5hX3Ryc2l6ZSAhPSAwCi0gICAgID8gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFTE9DKQotICAgICA6IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUykpOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZsYWdzID0KLSAgICAoZXhlY3AtPmFfZHJzaXplICE9IDAKLSAgICAgPyAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVMT0MpCi0gICAgIDogKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQzsKLQotI2lmZGVmIFRISVNfSVNfT05MWV9ET0NVTUVOVEFUSU9OCi0gIC8qIFRoZSBjb21tb24gY29kZSBjYW4ndCBmaWxsIGluIHRoZXNlIHRoaW5ncyBiZWNhdXNlIHRoZXkgZGVwZW5kCi0gICAgIG9uIGVpdGhlciB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgdGV4dCBzZWdtZW50LCB0aGUgcm91bmRpbmcKLSAgICAgdXAgb2YgdmlydHVhbCBhZGRyZXNzZXMgYmV0d2VlbiBzZWdtZW50cywgb3IgdGhlIHN0YXJ0aW5nIGZpbGUKLSAgICAgcG9zaXRpb24gb2YgdGhlIHRleHQgc2VnbWVudCAtLSBhbGwgb2Ygd2hpY2ggdmFyaWVzIGFtb25nIGRpZmZlcmVudAotICAgICB2ZXJzaW9ucyBvZiBhLm91dC4gICovCi0KLSAgLyogQ2FsbCBiYWNrIHRvIHRoZSBmb3JtYXQtZGVwZW5kZW50IGNvZGUgdG8gZmlsbCBpbiB0aGUgcmVzdCBvZiB0aGUKLSAgICAgZmllbGRzIGFuZCBkbyBhbnkgZnVydGhlciBjbGVhbnVwLiAgVGhpbmdzIHRoYXQgc2hvdWxkIGJlIGZpbGxlZAotICAgICBpbiBieSB0aGUgY2FsbGJhY2s6ICAqLwotCi0gIHN0cnVjdCBleGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCktPnNpemUgPSBOX1RYVFNJWkUoKmV4ZWNwKTsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yYXdfc2l6ZSA9IE5fVFhUU0laRSgqZXhlY3ApOwotICAvKiBkYXRhIGFuZCBic3MgYXJlIGFscmVhZHkgZmlsbGVkIGluIHNpbmNlIHRoZXkncmUgc28gc3RhbmRhcmQgKi8KLQotICAvKiBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSA9IE5fVFhUQUREUigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IE5fREFUQUREUigqZXhlY3ApOwotICBvYmpfYnNzc2VjICAoYWJmZCktPnZtYSA9IE5fQlNTQUREUigqZXhlY3ApOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fREFUT0ZGKCpleGVjcCk7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX1RSRUxPRkYoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRigqZXhlY3ApOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHN0cmluZyB0YWJsZSBhbmQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBzd2l0Y2ggKE5fTUFDSFRZUEUgKCpleGVjX2hkciAoYWJmZCkpKSB7Ci0gIGRlZmF1bHQ6Ci0gICAgYWJmZC0+b2JqX2FyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOwotICAgIGJyZWFrOwotICB9Ci0KLSAgYWRhdGEoYWJmZCktPnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLT5zZWdtZW50X3NpemUgPSBTRUdNRU5UX1NJWkU7Ci0gIGFkYXRhKGFiZmQpLT5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLSAgLyogVGhlIGFyY2hpdGVjdHVyZSBpcyBlbmNvZGVkIGluIHZhcmlvdXMgd2F5cyBpbiB2YXJpb3VzIGEub3V0IHZhcmlhbnRzLAotICAgICBvciBpcyBub3QgZW5jb2RlZCBhdCBhbGwgaW4gc29tZSBvZiB0aGVtLiAgVGhlIHJlbG9jYXRpb24gc2l6ZSBkZXBlbmRzCi0gICAgIG9uIHRoZSBhcmNoaXRlY3R1cmUgYW5kIHRoZSBhLm91dCB2YXJpYW50LiAgRmluYWxseSwgdGhlIHJldHVybiB2YWx1ZQotICAgICBpcyB0aGUgYmZkX3RhcmdldCB2ZWN0b3IgaW4gdXNlLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gemVybyBhbmQKLSAgICAgc2V0IGJmZF9lcnJvciB0byB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KLQotICAgICBGb3JtYXRzIHN1Y2ggYXMgYi5vdXQsIHdoaWNoIGhhdmUgYWRkaXRpb25hbCBmaWVsZHMgaW4gdGhlIGEub3V0Ci0gICAgIGhlYWRlciwgc2hvdWxkIGNvcGUgd2l0aCB0aGVtIGluIHRoaXMgY2FsbGJhY2sgYXMgd2VsbC4gICovCi0jZW5kaWYJCQkJLyogRE9DVU1FTlRBVElPTiAqLwotCi0gIHJlc3VsdCA9ICgqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkoYWJmZCk7Ci0KLSAgLyogTm93IHRoYXQgdGhlIHNlZ21lbnQgYWRkcmVzc2VzIGhhdmUgYmVlbiB3b3JrZWQgb3V0LCB0YWtlIGEgYmV0dGVyCi0gICAgIGd1ZXNzIGF0IHdoZXRoZXIgdGhlIGZpbGUgaXMgZXhlY3V0YWJsZS4gIElmIHRoZSBlbnRyeSBwb2ludAotICAgICBpcyB3aXRoaW4gdGhlIHRleHQgc2VnbWVudCwgYXNzdW1lIGl0IGlzLiAgKFRoaXMgbWFrZXMgZmlsZXMKLSAgICAgZXhlY3V0YWJsZSBldmVuIGlmIHRoZWlyIGVudHJ5IHBvaW50IGFkZHJlc3MgaXMgMCwgYXMgbG9uZyBhcwotICAgICB0aGVpciB0ZXh0IHN0YXJ0cyBhdCB6ZXJvLikuCi0KLSAgICAgVGhpcyB0ZXN0IGhhZCB0byBiZSBjaGFuZ2VkIHRvIGRlYWwgd2l0aCBzeXN0ZW1zIHdoZXJlIHRoZSB0ZXh0IHNlZ21lbnQKLSAgICAgcnVucyBhdCBhIGRpZmZlcmVudCBsb2NhdGlvbiB0aGFuIHRoZSBkZWZhdWx0LiAgVGhlIHByb2JsZW0gaXMgdGhhdCB0aGUKLSAgICAgZW50cnkgYWRkcmVzcyBjYW4gYXBwZWFyIHRvIGJlIG91dHNpZGUgdGhlIHRleHQgc2VnbWVudCwgdGh1cyBjYXVzaW5nIGFuCi0gICAgIGVycm9uZW91cyBjb25jbHVzaW9uIHRoYXQgdGhlIGZpbGUgaXNuJ3QgZXhlY3V0YWJsZS4KLQotICAgICBUbyBmaXggdGhpcywgd2Ugbm93IGFjY2VwdCBhbnkgbm9uLXplcm8gZW50cnkgcG9pbnQgYXMgYW4gaW5kaWNhdGlvbiBvZgotICAgICBleGVjdXRhYmlsaXR5LiAgVGhpcyB3aWxsIHdvcmsgbW9zdCBvZiB0aGUgdGltZSwgc2luY2Ugb25seSB0aGUgbGlua2VyCi0gICAgIHNldHMgdGhlIGVudHJ5IHBvaW50LCBhbmQgdGhhdCBpcyBsaWtlbHkgdG8gYmUgbm9uLXplcm8gZm9yIG1vc3Qgc3lzdGVtcy4gKi8KLQotICBpZiAoZXhlY3AtPmFfZW50cnkgIT0gMAotICAgICAgfHwgKGV4ZWNwLT5hX2VudHJ5ID49IG9ial90ZXh0c2VjKGFiZmQpLT52bWEKLQkgICYmIGV4ZWNwLT5hX2VudHJ5IDwgb2JqX3RleHRzZWMoYWJmZCktPnZtYSArIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUpKQotICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSNpZmRlZiBTVEFUX0ZPUl9FWEVDCi0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKLQotICAgICAgLyogVGhlIG9yaWdpbmFsIGhldXJpc3RpYyBkb2Vzbid0IHdvcmsgaW4gc29tZSBpbXBvcnRhbnQgY2FzZXMuCi0gICAgICAgIFRoZSBhLm91dCBmaWxlIGhhcyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGV4dCBzdGFydAotICAgICAgICBhZGRyZXNzLiAgRm9yIGZpbGVzIChsaWtlIGtlcm5lbHMpIGxpbmtlZCB0byBub24tc3RhbmRhcmQKLSAgICAgICAgYWRkcmVzc2VzIChsZCAtVHRleHQgbm5uKSB0aGUgZW50cnkgcG9pbnQgbWF5IG5vdCBiZSBiZXR3ZWVuCi0gICAgICAgIHRoZSBkZWZhdWx0IHRleHQgc3RhcnQgKG9ial90ZXh0c2VjKGFiZmQpLT52bWEpIGFuZAotICAgICAgICAob2JqX3RleHRzZWMoYWJmZCktPnZtYSkgKyB0ZXh0IHNpemUuICBUaGlzIGlzIG5vdCBqdXN0IGEgbWFjaAotICAgICAgICBpc3N1ZS4gIE1hbnkga2VybmVscyBhcmUgbG9hZGVkIGF0IG5vbiBzdGFuZGFyZCBhZGRyZXNzZXMuICAqLwotICAgICAgaWYgKGFiZmQtPmlvc3RyZWFtICE9IE5VTEwKLQkgICYmIChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpID09IDAKLQkgICYmIChmc3RhdChmaWxlbm8oKEZJTEUgKikgKGFiZmQtPmlvc3RyZWFtKSksICZzdGF0X2J1ZikgPT0gMCkKLQkgICYmICgoc3RhdF9idWYuc3RfbW9kZSAmIDAxMTEpICE9IDApKQotCWFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgICB9Ci0jZW5kaWYgLyogU1RBVF9GT1JfRVhFQyAqLwotCi0gIGlmIChyZXN1bHQpCi0gICAgewotI2lmIDAgLyogVGhlc2Ugc2hvdWxkIGJlIHNldCBjb3JyZWN0bHkgYW55d2F5cy4gICovCi0gICAgICBhYmZkLT5zZWN0aW9ucyA9IG9ial90ZXh0c2VjIChhYmZkKTsKLSAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+bmV4dCA9IG9ial9kYXRhc2VjIChhYmZkKTsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+bmV4dCA9IG9ial9ic3NzZWMgKGFiZmQpOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnJlZSAocmF3cHRyKTsKLSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9IG9sZHJhd3B0cjsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9ta29iamVjdAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYW91dF9AdmFye3NpemV9X21rb2JqZWN0LCAoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlJbml0aWFsaXplIEJGRCBAdmFye2FiZmR9IGZvciB1c2Ugd2l0aCBhLm91dCBmaWxlcy4KLSovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxta29iamVjdCkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgICpyYXdwdHI7Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQotICAvKiBVc2UgYW4gaW50ZXJtZWRpYXRlIHZhcmlhYmxlIGZvciBjbGFyaXR5ICovCi0gIHJhd3B0ciA9IChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqKWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKSk7Ci0KLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSByYXdwdHI7Ci0gIGV4ZWNfaGRyIChhYmZkKSA9ICYocmF3cHRyLT5lKTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotICBvYmpfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotICBvYmpfYnNzc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYW91dF9AdmFye3NpemV9X21hY2hpbmVfdHlwZQotCi1TWU5PUFNJUwotCWVudW0gbWFjaGluZV90eXBlICBhb3V0X0B2YXJ7c2l6ZX1fbWFjaGluZV90eXBlCi0JIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLQkgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwotCi1ERVNDUklQVElPTgotCUtlZXAgdHJhY2sgb2YgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBmb3IKLQlhLm91dCdzLiBSZXR1cm4gdGhlIDw8bWFjaGluZV90eXBlPj4gZm9yIGEgcGFydGljdWxhcgotCWFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSwgb3IgPDxNX1VOS05PV04+PiBpZiB0aGF0IGV4YWN0IGFyY2hpdGVjdHVyZQotCWFuZCBtYWNoaW5lIGNhbid0IGJlIHJlcHJlc2VudGVkIGluIGEub3V0IGZvcm1hdC4KLQotCUlmIHRoZSBhcmNoaXRlY3R1cmUgaXMgdW5kZXJzdG9vZCwgbWFjaGluZSB0eXBlIDAgKGRlZmF1bHQpCi0JaXMgYWx3YXlzIHVuZGVyc3Rvb2QuCi0qLwotCi1lbnVtIG1hY2hpbmVfdHlwZQotTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkgKGFyY2gsIG1hY2hpbmUsIHVua25vd24pCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci0gICAgIGJvb2xlYW4gKnVua25vd247Ci17Ci0gIGVudW0gbWFjaGluZV90eXBlIGFyY2hfZmxhZ3M7Ci0KLSAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgKnVua25vd24gPSB0cnVlOwotCi0gIHN3aXRjaCAoYXJjaCkgewotICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgIGlmIChtYWNoaW5lID09IDAKLQl8fCBtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjCi0JfHwgbWFjaGluZSA9PSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUKLQl8fCBtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQotCXx8IG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmNfdjkpCi0gICAgICBhcmNoX2ZsYWdzID0gTV9TUEFSQzsKLSAgICBlbHNlIGlmIChtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0KQotICAgICAgYXJjaF9mbGFncyA9IE1fU1BBUkNMRVQ7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgIHN3aXRjaCAobWFjaGluZSkgewotICAgIGNhc2UgMDoJCSAgYXJjaF9mbGFncyA9IE1fNjgwMTA7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDAwOiBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOyAqdW5rbm93biA9IGZhbHNlOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAxMDogYXJjaF9mbGFncyA9IE1fNjgwMTA7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDIwOiBhcmNoX2ZsYWdzID0gTV82ODAyMDsgYnJlYWs7Ci0gICAgZGVmYXVsdDoJCSAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICBpZiAobWFjaGluZSA9PSAwKQlhcmNoX2ZsYWdzID0gTV8zODY7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgIGlmIChtYWNoaW5lID09IDApCWFyY2hfZmxhZ3MgPSBNXzI5SzsKLSAgICBicmVhazsKLQotICBjYXNlIGJmZF9hcmNoX2FybToKLSAgICBpZiAobWFjaGluZSA9PSAwKQlhcmNoX2ZsYWdzID0gTV9BUk07Ci0gICAgYnJlYWs7Ci0gICAgCi0gIGNhc2UgYmZkX2FyY2hfbWlwczoKLSAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzMzAwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHMzOTAwOgotICAgICAgYXJjaF9mbGFncyA9IE1fTUlQUzE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM2MDAwOgotICAgICAgYXJjaF9mbGFncyA9IE1fTUlQUzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMTA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDEwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MzAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQ0MDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDYwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjUwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczgwMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzMTAwMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzMTY6Ci0gICAgICAvKiBGSVhNRTogVGhlc2Ugc2hvdWxkIGJlIE1JUFMzIG9yIE1JUFM0LiAgKi8KLSAgICAgIGFyY2hfZmxhZ3MgPSBNX01JUFMyOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF9uczMyazoKLSAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKLSAgICBjYXNlIDA6ICAgIAkJYXJjaF9mbGFncyA9IE1fTlMzMjUzMjsgYnJlYWs7Ci0gICAgY2FzZSAzMjAzMjoJCWFyY2hfZmxhZ3MgPSBNX05TMzIwMzI7IGJyZWFrOwotICAgIGNhc2UgMzI1MzI6CQlhcmNoX2ZsYWdzID0gTV9OUzMyNTMyOyBicmVhazsKLSAgICBkZWZhdWx0OgkJYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfdmF4OgotICAgICp1bmtub3duID0gZmFsc2U7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOwotICB9Ci0KLSAgaWYgKGFyY2hfZmxhZ3MgIT0gTV9VTktOT1dOKQotICAgICp1bmtub3duID0gZmFsc2U7Ci0KLSAgcmV0dXJuIGFyY2hfZmxhZ3M7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYW91dF9AdmFye3NpemV9X3NldF9hcmNoX21hY2gKLQotU1lOT1BTSVMKLQlib29sZWFuIGFvdXRfQHZhcntzaXplfV9zZXRfYXJjaF9tYWNoLAotCSAoYmZkICosCi0JICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLQkgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCB0aGUgbWFjaGluZSBvZiB0aGUgQkZEIEB2YXJ7YWJmZH0gdG8gdGhlCi0JdmFsdWVzIEB2YXJ7YXJjaH0gYW5kIEB2YXJ7bWFjaGluZX0uICBWZXJpZnkgdGhhdCBAdmFye2FiZmR9J3MgZm9ybWF0Ci0JY2FuIHN1cHBvcnQgdGhlIGFyY2hpdGVjdHVyZSByZXF1aXJlZC4KLSovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxzZXRfYXJjaF9tYWNoKSAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICB7Ci0gICAgICBib29sZWFuIHVua25vd247Ci0KLSAgICAgIE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpIChhcmNoLCBtYWNoaW5lLCAmdW5rbm93bik7Ci0gICAgICBpZiAodW5rbm93bikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERldGVybWluZSB0aGUgc2l6ZSBvZiBhIHJlbG9jYXRpb24gZW50cnkgKi8KLSAgc3dpdGNoIChhcmNoKSB7Ci0gIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX0VYVF9TSVpFOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuICgqYW91dF9iYWNrZW5kX2luZm8oYWJmZCktPnNldF9zaXplcykgKGFiZmQpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X29fbWFnaWMgKGFiZmQsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgZmlsZV9wdHIgcG9zID0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLSAgYmZkX3ZtYSB2bWEgPSAwOwotICBpbnQgcGFkID0gMDsKLQotICAvKiBUZXh0LiAgKi8KLSAgb2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0gIGlmICghb2JqX3RleHRzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hID0gdm1hOwotICBlbHNlCi0gICAgdm1hID0gb2JqX3RleHRzZWMoYWJmZCktPnZtYTsKLQotICBwb3MgKz0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgdm1hICs9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogRGF0YS4gICovCi0gIGlmICghb2JqX2RhdGFzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICB7Ci0jaWYgMAkgICAgLyogPz8gRG9lcyBhbGlnbm1lbnQgaW4gdGhlIGZpbGUgaW1hZ2UgcmVhbGx5IG1hdHRlcj8gKi8KLSAgICAgIHBhZCA9IGFsaWduX3Bvd2VyICh2bWEsIG9ial9kYXRhc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpIC0gdm1hOwotI2VuZGlmCi0gICAgICBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplICs9IHBhZDsKLSAgICAgIHBvcyArPSBwYWQ7Ci0gICAgICB2bWEgKz0gcGFkOwotICAgICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSA9IHZtYTsKLSAgICB9Ci0gIGVsc2UKLSAgICB2bWEgPSBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hOwotICBvYmpfZGF0YXNlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLSAgcG9zICs9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHZtYSArPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIEJTUy4gICovCi0gIGlmICghb2JqX2Jzc3NlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIHsKLSNpZiAwCi0gICAgICBwYWQgPSBhbGlnbl9wb3dlciAodm1hLCBvYmpfYnNzc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpIC0gdm1hOwotI2VuZGlmCi0gICAgICBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplICs9IHBhZDsKLSAgICAgIHBvcyArPSBwYWQ7Ci0gICAgICB2bWEgKz0gcGFkOwotICAgICAgb2JqX2Jzc3NlYyhhYmZkKS0+dm1hID0gdm1hOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoZSBWTUEgb2YgdGhlIC5ic3Mgc2VjdGlvbiBpcyBzZXQgYnkgdGhlIHRoZSBWTUEgb2YgdGhlCi0gICAgICAgICAuZGF0YSBzZWN0aW9uIHBsdXMgdGhlIHNpemUgb2YgdGhlIC5kYXRhIHNlY3Rpb24uICBXZSBtYXkKLSAgICAgICAgIG5lZWQgdG8gYWRkIHBhZGRpbmcgYnl0ZXMgdG8gbWFrZSB0aGlzIHRydWUuICAqLwotICAgICAgcGFkID0gb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSAtIHZtYTsKLSAgICAgIGlmIChwYWQgPiAwKQotCXsKLQkgIG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplICs9IHBhZDsKLQkgIHBvcyArPSBwYWQ7Ci0JfQotICAgIH0KLSAgb2JqX2Jzc3NlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLQotICAvKiBGaXggdXAgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLSAgZXhlY3AtPmFfdGV4dCA9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBleGVjcC0+YV9ic3MgPSBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIE5fU0VUX01BR0lDICgqZXhlY3AsIE9NQUdJQyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfel9tYWdpYyAoYWJmZCwgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBiZmRfc2l6ZV90eXBlIGRhdGFfcGFkLCB0ZXh0X3BhZDsKLSAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0gIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSAqYWJkcDsKLSAgaW50IHp0aWg7CQkJLyogTm9uemVybyBpZiB0ZXh0IGluY2x1ZGVzIGV4ZWMgaGVhZGVyLiAgKi8KLSAgCi0gIGFiZHAgPSBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCk7Ci0KLSAgLyogVGV4dC4gICovCi0gIHp0aWggPSAoYWJkcCAhPSBOVUxMCi0JICAmJiAoYWJkcC0+dGV4dF9pbmNsdWRlc19oZWFkZXIKLQkgICAgICB8fCBvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IHFfbWFnaWNfZm9ybWF0KSk7Ci0gIG9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zID0gKHp0aWgKLQkJCQk/IGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZQotCQkJCTogYWRhdGEoYWJmZCkuem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSk7Ci0gIGlmICghIG9ial90ZXh0c2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgewotICAgICAgLyogPz8gRG8gd2UgcmVhbGx5IG5lZWQgdG8gY2hlY2sgZm9yIHJlbG9jcyBoZXJlPyAgKi8KLSAgICAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEgPSAoKGFiZmQtPmZsYWdzICYgSEFTX1JFTE9DKQotCQkJCT8gMAotCQkJCTogKHp0aWgKLQkJCQkgICA/IChhYmRwLT5kZWZhdWx0X3RleHRfdm1hCi0JCQkJICAgICAgKyBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUpCi0JCQkJICAgOiBhYmRwLT5kZWZhdWx0X3RleHRfdm1hKSk7Ci0gICAgICB0ZXh0X3BhZCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhlIC50ZXh0IHNlY3Rpb24gaXMgYmVpbmcgbG9hZGVkIGF0IGFuIHVudXN1YWwgYWRkcmVzcy4gIFdlCi0gICAgICAgICBtYXkgbmVlZCB0byBwYWQgaXQgc3VjaCB0aGF0IHRoZSAuZGF0YSBzZWN0aW9uIHN0YXJ0cyBhdCBhIHBhZ2UKLSAgICAgICAgIGJvdW5kYXJ5LiAgKi8KLSAgICAgIGlmICh6dGloKQotCXRleHRfcGFkID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgLSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSkKLQkJICAgICYgKGFkYXRhIChhYmZkKS5wYWdlX3NpemUgLSAxKSk7Ci0gICAgICBlbHNlCi0JdGV4dF9wYWQgPSAoKC0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWEpCi0JCSAgICAmIChhZGF0YSAoYWJmZCkucGFnZV9zaXplIC0gMSkpOwotICAgIH0KLQotICAvKiBGaW5kIHN0YXJ0IG9mIGRhdGEuICAqLwotICBpZiAoenRpaCkKLSAgICB7Ci0gICAgICB0ZXh0X2VuZCA9IG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyArIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICAgICAgdGV4dF9wYWQgKz0gQkZEX0FMSUdOICh0ZXh0X2VuZCwgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSkgLSB0ZXh0X2VuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBOb3RlIHRoYXQgaWYgcGFnZV9zaXplID09IHptYWdpY19kaXNrX2Jsb2NrX3NpemUsIHRoZW4KLQkgZmlsZXBvcyA9PSBwYWdlX3NpemUsIGFuZCB0aGlzIGNhc2UgaXMgdGhlIHNhbWUgYXMgdGhlIHp0aWgKLQkgY2FzZS4gICovCi0gICAgICB0ZXh0X2VuZCA9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICAgICAgdGV4dF9wYWQgKz0gQkZEX0FMSUdOICh0ZXh0X2VuZCwgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSkgLSB0ZXh0X2VuZDsKLSAgICAgIHRleHRfZW5kICs9IG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvczsKLSAgICB9Ci0gIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gdGV4dF9wYWQ7Ci0gIHRleHRfZW5kICs9IHRleHRfcGFkOwotCi0gIC8qIERhdGEuICAqLwotICBpZiAoIW9ial9kYXRhc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgewotICAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgICB2bWEgPSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hICsgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgICAgIG9ial9kYXRhc2VjKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplKTsKLSAgICB9Ci0gIGlmIChhYmRwICYmIGFiZHAtPnptYWdpY19tYXBwZWRfY29udGlndW91cykKLSAgICB7Ci0gICAgICB0ZXh0X3BhZCA9IChvYmpfZGF0YXNlYyhhYmZkKS0+dm1hCi0JCSAgLSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hCi0JCSAgLSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplKTsKLSAgICAgIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gdGV4dF9wYWQ7Ci0gICAgfQotICBvYmpfZGF0YXNlYyhhYmZkKS0+ZmlsZXBvcyA9IChvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcwotCQkJCSsgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSk7Ci0gIAotICAvKiBGaXggdXAgZXhlYyBoZWFkZXIgd2hpbGUgd2UncmUgYXQgaXQuICAqLwotICBleGVjcC0+YV90ZXh0ID0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgaWYgKHp0aWggJiYgKCFhYmRwIHx8IChhYmRwICYmICFhYmRwLT5leGVjX2hlYWRlcl9ub3RfY291bnRlZCkpKQotICAgIGV4ZWNwLT5hX3RleHQgKz0gYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplOwotICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBxX21hZ2ljX2Zvcm1hdCkKLSAgICBOX1NFVF9NQUdJQyAoKmV4ZWNwLCBRTUFHSUMpOwotICBlbHNlCi0gICAgTl9TRVRfTUFHSUMgKCpleGVjcCwgWk1BR0lDKTsKLQotICAvKiBTcGVjIHNheXMgZGF0YSBzZWN0aW9uIHNob3VsZCBiZSByb3VuZGVkIHVwIHRvIHBhZ2UgYm91bmRhcnkuICAqLwotICBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplCi0gICAgPSBhbGlnbl9wb3dlciAob2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkJICAgb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKTsKLSAgZXhlY3AtPmFfZGF0YSA9IEJGRF9BTElHTiAob2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkJCSAgICAgYWRhdGEoYWJmZCkucGFnZV9zaXplKTsKLSAgZGF0YV9wYWQgPSBleGVjcC0+YV9kYXRhIC0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBCU1MuICAqLwotICBpZiAoIW9ial9ic3NzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEgPSAob2JqX2RhdGFzZWMoYWJmZCktPnZtYQotCQkJICAgICArIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUpOwotICAvKiBJZiB0aGUgQlNTIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIGRhdGEgc2VjdGlvbiBhbmQgZXh0cmEgc3BhY2UKLSAgICAgaW4gdGhlIHBhZ2UgaXMgbGVmdCBhZnRlciB0aGUgZGF0YSBzZWN0aW9uLCBmdWRnZSBkYXRhCi0gICAgIGluIHRoZSBoZWFkZXIgc28gdGhhdCB0aGUgYnNzIHNlY3Rpb24gbG9va3Mgc21hbGxlciBieSB0aGF0Ci0gICAgIGFtb3VudC4gIFdlJ2xsIHN0YXJ0IHRoZSBic3Mgc2VjdGlvbiB0aGVyZSwgYW5kIGxpZSB0byB0aGUgT1MuCi0gICAgIChOb3RlIHRoYXQgYSBsaW5rZXIgc2NyaXB0LCBhcyB3ZWxsIGFzIHRoZSBhYm92ZSBhc3NpZ25tZW50LAotICAgICBjb3VsZCBoYXZlIGV4cGxpY2l0bHkgc2V0IHRoZSBCU1Mgdm1hIHRvIGltbWVkaWF0ZWx5IGZvbGxvdwotICAgICB0aGUgZGF0YSBzZWN0aW9uLikgICovCi0gIGlmIChhbGlnbl9wb3dlciAob2JqX2Jzc3NlYyhhYmZkKS0+dm1hLCBvYmpfYnNzc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpCi0gICAgICA9PSBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hICsgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSkKLSAgICBleGVjcC0+YV9ic3MgPSAoZGF0YV9wYWQgPiBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemUpID8gMCA6Ci0gICAgICBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemUgLSBkYXRhX3BhZDsKLSAgZWxzZQotICAgIGV4ZWNwLT5hX2JzcyA9IG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9uX21hZ2ljIChhYmZkLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIGZpbGVfcHRyIHBvcyA9IGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLSAgYmZkX3ZtYSB2bWEgPSAwOwotICBpbnQgcGFkOwotICAKLSAgLyogVGV4dC4gICovCi0gIG9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zID0gcG9zOwotICBpZiAoIW9ial90ZXh0c2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgb2JqX3RleHRzZWMoYWJmZCktPnZtYSA9IHZtYTsKLSAgZWxzZQotICAgIHZtYSA9IG9ial90ZXh0c2VjKGFiZmQpLT52bWE7Ci0gIHBvcyArPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotICB2bWEgKz0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBEYXRhLiAgKi8KLSAgb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0gIGlmICghb2JqX2RhdGFzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hID0gQkZEX0FMSUdOICh2bWEsIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSk7Ci0gIHZtYSA9IG9ial9kYXRhc2VjKGFiZmQpLT52bWE7Ci0gIAotICAvKiBTaW5jZSBCU1MgZm9sbG93cyBkYXRhIGltbWVkaWF0ZWx5LCBzZWUgaWYgaXQgbmVlZHMgYWxpZ25tZW50LiAgKi8KLSAgdm1hICs9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHBhZCA9IGFsaWduX3Bvd2VyICh2bWEsIG9ial9ic3NzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcikgLSB2bWE7Ci0gIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOwotICBwb3MgKz0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBCU1MuICAqLwotICBpZiAoIW9ial9ic3NzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEgPSB2bWE7Ci0gIGVsc2UKLSAgICB2bWEgPSBvYmpfYnNzc2VjKGFiZmQpLT52bWE7Ci0KLSAgLyogRml4IHVwIGV4ZWMgaGVhZGVyLiAgKi8KLSAgZXhlY3AtPmFfdGV4dCA9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBleGVjcC0+YV9ic3MgPSBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIE5fU0VUX01BR0lDICgqZXhlY3AsIE5NQUdJQyk7Ci19Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCB0ZXh0X3NpemUsIHRleHRfZW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnRleHRfc2l6ZTsKLSAgICAgZmlsZV9wdHIgKnRleHRfZW5kIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBpZiAoISBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYWRhdGEoYWJmZCkubWFnaWMgIT0gdW5kZWNpZGVkX21hZ2ljKQotICAgIHJldHVybiB0cnVlOwotCi0gIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgPQotICAgIGFsaWduX3Bvd2VyKG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JCW9ial90ZXh0c2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpOwotCi0gICp0ZXh0X3NpemUgPSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgLyogUnVsZSAoaGV1cmlzdGljKSBmb3Igd2hlbiB0byBwYWQgdG8gYSBuZXcgcGFnZS4gIE5vdGUgdGhhdCB0aGVyZQotICAgICBhcmUgKGF0IGxlYXN0KSB0d28gd2F5cyBkZW1hbmQtcGFnZWQgKFpNQUdJQykgZmlsZXMgaGF2ZSBiZWVuCi0gICAgIGhhbmRsZWQuICBNb3N0IEJlcmtlbGV5LWJhc2VkIHN5c3RlbXMgc3RhcnQgdGhlIHRleHQgc2VnbWVudCBhdAotICAgICAoVEFSR0VUX1BBR0VfU0laRSkuICBIb3dldmVyLCBuZXdlciB2ZXJzaW9ucyBvZiBTVU5PUyBzdGFydCB0aGUgdGV4dAotICAgICBzZWdtZW50IHJpZ2h0IGFmdGVyIHRoZSBleGVjIGhlYWRlcjsgdGhlIGxhdHRlciBpcyBjb3VudGVkIGluIHRoZQotICAgICB0ZXh0IHNlZ21lbnQgc2l6ZSwgYW5kIGlzIHBhZ2VkIGluIGJ5IHRoZSBrZXJuZWwgd2l0aCB0aGUgcmVzdCBvZgotICAgICB0aGUgdGV4dC4gKi8KLQotICAvKiBUaGlzIHBlcmhhcHMgaXNuJ3QgdGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzLCBidXQgbWFkZSBpdCBzaW1wbGVyIGZvciBtZQotICAgICB0byB1bmRlcnN0YW5kIGVub3VnaCB0byBpbXBsZW1lbnQgaXQuICBCZXR0ZXIgd291bGQgcHJvYmFibHkgYmUgdG8gZ28KLSAgICAgcmlnaHQgZnJvbSBCRkQgZmxhZ3MgdG8gYWxpZ25tZW50L3Bvc2l0aW9uaW5nIGNoYXJhY3RlcmlzdGljcy4gIEJ1dCB0aGUKLSAgICAgb2xkIGNvZGUgd2FzIHNsb3BweSBlbm91Z2ggYWJvdXQgaGFuZGxpbmcgdGhlIGZsYWdzLCBhbmQgaGFkIGVub3VnaAotICAgICBvdGhlciBtYWdpYywgdGhhdCBpdCB3YXMgYSBsaXR0bGUgaGFyZCBmb3IgbWUgdG8gdW5kZXJzdGFuZC4gIEkgdGhpbmsKLSAgICAgSSB1bmRlcnN0YW5kIGl0IGJldHRlciBub3csIGJ1dCBJIGhhdmVuJ3QgdGltZSB0byBkbyB0aGUgY2xlYW51cCB0aGlzCi0gICAgIG1pbnV0ZS4gICovCi0KLSAgaWYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkKLSAgICAvKiBXaGV0aGVyIG9yIG5vdCBXUF9URVhUIGlzIHNldCAtLSBsZXQgRF9QQUdFRCBvdmVycmlkZS4gICovCi0gICAgYWRhdGEoYWJmZCkubWFnaWMgPSB6X21hZ2ljOwotICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0gICAgYWRhdGEoYWJmZCkubWFnaWMgPSBuX21hZ2ljOwotICBlbHNlCi0gICAgYWRhdGEoYWJmZCkubWFnaWMgPSBvX21hZ2ljOwotCi0jaWZkZWYgQkZEX0FPVVRfREVCVUcgLyogcmVxdWlyZXMgZ2NjMiAqLwotI2lmIF9fR05VQ19fID49IDIKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXMgdGV4dD08JXgsJXgsJXg+IGRhdGE9PCV4LCV4LCV4PiBic3M9PCV4LCV4LCV4PlxuIiwKLQkgICAoeyBjaGFyICpzdHI7Ci0JICAgICAgc3dpdGNoIChhZGF0YShhYmZkKS5tYWdpYykgewotCSAgICAgIGNhc2Ugbl9tYWdpYzogc3RyID0gIk5NQUdJQyI7IGJyZWFrOwotCSAgICAgIGNhc2Ugb19tYWdpYzogc3RyID0gIk9NQUdJQyI7IGJyZWFrOwotCSAgICAgIGNhc2Ugel9tYWdpYzogc3RyID0gIlpNQUdJQyI7IGJyZWFrOwotCSAgICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotCSAgICAgIH0KLQkgICAgICBzdHI7Ci0JICAgIH0pLAotCSAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEsIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JICAgCW9ial90ZXh0c2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIsCi0JICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSwgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX2RhdGFzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlciwKLQkgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEsIG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgc3dpdGNoIChhZGF0YShhYmZkKS5tYWdpYykKLSAgICB7Ci0gICAgY2FzZSBvX21hZ2ljOgotICAgICAgYWRqdXN0X29fbWFnaWMgKGFiZmQsIGV4ZWNwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugel9tYWdpYzoKLSAgICAgIGFkanVzdF96X21hZ2ljIChhYmZkLCBleGVjcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG5fbWFnaWM6Ci0gICAgICBhZGp1c3Rfbl9tYWdpYyAoYWJmZCwgZXhlY3ApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotI2lmZGVmIEJGRF9BT1VUX0RFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiAgICAgICB0ZXh0PTwleCwleCwleD4gZGF0YT08JXgsJXgsJXg+IGJzcz08JXgsJXg+XG4iLAotCSAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEsIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JICAgCW9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zLAotCSAgIG9ial9kYXRhc2VjKGFiZmQpLT52bWEsIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JICAgCW9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zLAotCSAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fbmV3X3NlY3Rpb25faG9vawotCi1TWU5PUFNJUwotICAgICAgICBib29sZWFuIGFvdXRfQHZhcntzaXplfV9uZXdfc2VjdGlvbl9ob29rLAotCSAgIChiZmQgKmFiZmQsCi0JICAgIGFzZWN0aW9uICpuZXdzZWN0KSk7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbGVkIGJ5IHRoZSBCRkQgaW4gcmVzcG9uc2UgdG8gYSBAY29kZXtiZmRfbWFrZV9zZWN0aW9ufQotCXJlcXVlc3QuCi0qLwotYm9vbGVhbgotTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spIChhYmZkLCBuZXdzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpuZXdzZWN0OwotewotICAvKiBhbGlnbiB0byBkb3VibGUgYXQgbGVhc3QgKi8KLSAgbmV3c2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gYmZkX2dldF9hcmNoX2luZm8oYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0KLQotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9vYmplY3QpCi0gIHsKLSAgICBpZiAob2JqX3RleHRzZWMoYWJmZCkgPT0gTlVMTCAmJiAhc3RyY21wKG5ld3NlY3QtPm5hbWUsICIudGV4dCIpKSB7Ci0Jb2JqX3RleHRzZWMoYWJmZCk9IG5ld3NlY3Q7Ci0JbmV3c2VjdC0+dGFyZ2V0X2luZGV4ID0gTl9URVhUOwotCXJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgaWYgKG9ial9kYXRhc2VjKGFiZmQpID09IE5VTEwgJiYgIXN0cmNtcChuZXdzZWN0LT5uYW1lLCAiLmRhdGEiKSkgewotCW9ial9kYXRhc2VjKGFiZmQpID0gbmV3c2VjdDsKLQluZXdzZWN0LT50YXJnZXRfaW5kZXggPSBOX0RBVEE7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICBpZiAob2JqX2Jzc3NlYyhhYmZkKSA9PSBOVUxMICYmICFzdHJjbXAobmV3c2VjdC0+bmFtZSwgIi5ic3MiKSkgewotCW9ial9ic3NzZWMoYWJmZCkgPSBuZXdzZWN0OwotCW5ld3NlY3QtPnRhcmdldF9pbmRleCA9IE5fQlNTOwotCXJldHVybiB0cnVlOwotICAgICAgfQotCi0gIH0KLQotICAvKiBXZSBhbGxvdyBtb3JlIHRoYW4gdGhyZWUgc2VjdGlvbnMgaW50ZXJuYWxseSAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwotCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgaWYgKCEgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fY29udGVudHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoc2VjdGlvbiAhPSBvYmpfdGV4dHNlYyAoYWJmZCkKLSAgICAgICYmIHNlY3Rpb24gIT0gb2JqX2RhdGFzZWMgKGFiZmQpKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJlYWQgdGhlIGV4dGVybmFsIHN5bWJvbHMgZnJvbSBhbiBhLm91dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID09IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOwotCi0gICAgICBjb3VudCA9IGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zIC8gRVhURVJOQUxfTkxJU1RfU0laRTsKLQotI2lmZGVmIFVTRV9NTUFQCi0gICAgICBpZiAoYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwKLQkJCSAgICAgICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBleGVjX2hkciAoYWJmZCktPmFfc3ltcywKLQkJCSAgICAgICAmb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCksIHRydWUpID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN5bXMgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIG9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpLmRhdGE7Ci0jZWxzZQotICAgICAgLyogV2UgYWxsb2NhdGUgdXNpbmcgbWFsbG9jIHRvIG1ha2UgdGhlIHZhbHVlcyBlYXN5IHRvIGZyZWUKLQkgbGF0ZXIgb24uICBJZiB3ZSBwdXQgdGhlbSBvbiB0aGUgb2JqYWxsb2MgaXQgbWlnaHQgbm90IGJlCi0JIHBvc3NpYmxlIHRvIGZyZWUgdGhlbS4gICovCi0gICAgICBzeW1zID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKLQkgICAgICBiZmRfbWFsbG9jICgoc2l6ZV90KSBjb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkUpKTsKLSAgICAgIGlmIChzeW1zID09IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCAmJiBjb3VudCAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChzeW1zLCAxLCBleGVjX2hkciAoYWJmZCktPmFfc3ltcywgYWJmZCkKLQkgICAgICAhPSBleGVjX2hkciAoYWJmZCktPmFfc3ltcykpCi0JewotCSAgZnJlZSAoc3ltcyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotI2VuZGlmCi0KLSAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gc3ltczsKLSAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCkgPSBjb3VudDsKLSAgICB9Ci0gICAgICAKLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID09IE5VTEwKLSAgICAgICYmIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciBzdHJpbmdfY2hhcnNbQllURVNfSU5fV09SRF07Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN0cmluZ3NpemU7Ci0gICAgICBjaGFyICpzdHJpbmdzOwotCi0gICAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIHN0cmluZ3MuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkICgoUFRSKSBzdHJpbmdfY2hhcnMsIEJZVEVTX0lOX1dPUkQsIDEsIGFiZmQpCi0JICAgICAgIT0gQllURVNfSU5fV09SRCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3RyaW5nc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBzdHJpbmdfY2hhcnMpOwotCi0jaWZkZWYgVVNFX01NQVAKLSAgICAgIGlmIChiZmRfZ2V0X2ZpbGVfd2luZG93IChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBzdHJpbmdzaXplLAotCQkJICAgICAgICZvYmpfYW91dF9zdHJpbmdfd2luZG93IChhYmZkKSwgdHJ1ZSkgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3RyaW5ncyA9IChjaGFyICopIG9ial9hb3V0X3N0cmluZ193aW5kb3cgKGFiZmQpLmRhdGE7Ci0jZWxzZQotICAgICAgc3RyaW5ncyA9IChjaGFyICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHN0cmluZ3NpemUgKyAxKTsKLSAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTa2lwIHNwYWNlIGZvciB0aGUgc3RyaW5nIGNvdW50IGluIHRoZSBidWZmZXIgZm9yIGNvbnZlbmllbmNlCi0JIHdoZW4gdXNpbmcgaW5kZXhlcy4gICovCi0gICAgICBpZiAoYmZkX3JlYWQgKHN0cmluZ3MgKyBCWVRFU19JTl9XT1JELCAxLCBzdHJpbmdzaXplIC0gQllURVNfSU5fV09SRCwKLQkJICAgIGFiZmQpCi0JICAhPSBzdHJpbmdzaXplIC0gQllURVNfSU5fV09SRCkKLQl7Ci0JICBmcmVlIChzdHJpbmdzKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0jZW5kaWYKLQotICAgICAgLyogRW5zdXJlIHRoYXQgYSB6ZXJvIGluZGV4IHlpZWxkcyBhbiBlbXB0eSBzdHJpbmcuICAqLwotICAgICAgc3RyaW5nc1swXSA9ICdcMCc7Ci0KLSAgICAgIHN0cmluZ3Nbc3RyaW5nc2l6ZSAtIDFdID0gMDsKLQotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSBzdHJpbmdzOwotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5nX3NpemUgKGFiZmQpID0gc3RyaW5nc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBhLm91dCBzeW1ib2wgaW50byBhIEJGRCBzeW1ib2wuICBUaGUgZGVzYywgb3RoZXIsIHR5cGUKLSAgIGFuZCBzeW1ib2wtPnZhbHVlIGZpZWxkcyBvZiBDQUNIRV9QVFIgd2lsbCBiZSBzZXQgZnJvbSB0aGUgYS5vdXQKLSAgIG5saXN0IHN0cnVjdHVyZS4gIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcKLSAgIHN5bWJvbC0+ZmxhZ3MgYW5kIHN5bWJvbC0+c2VjdGlvbiwgYW5kIGFkanVzdGluZyBzeW1ib2wtPnZhbHVlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGNhY2hlX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhb3V0X3N5bWJvbF90eXBlICpjYWNoZV9wdHI7Ci17Ci0gIGZsYWd3b3JkIHZpc2libGU7Ci0KLSAgaWYgKChjYWNoZV9wdHItPnR5cGUgJiBOX1NUQUIpICE9IDAKLSAgICAgIHx8IGNhY2hlX3B0ci0+dHlwZSA9PSBOX0ZOKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBkZWJ1Z2dpbmcgc3ltYm9sLiAgKi8KLQotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCi0gICAgICAvKiBXb3JrIG91dCB0aGUgc3ltYm9sIHNlY3Rpb24uICAqLwotICAgICAgc3dpdGNoIChjYWNoZV9wdHItPnR5cGUgJiBOX1RZUEUpCi0JewotCWNhc2UgTl9URVhUOgotCWNhc2UgTl9GTjoKLQkgIHNlYyA9IG9ial90ZXh0c2VjIChhYmZkKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9EQVRBOgotCSAgc2VjID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0JTUzoKLQkgIHNlYyA9IG9ial9ic3NzZWMgKGFiZmQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIE5fQUJTOgotCSAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IHNlYzsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IHNlYy0+dm1hOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBkZWZhdWx0IHZpc2liaWxpdHkuICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIGFsbCB0eXBlcywgc28KLSAgICAgd2UganVzdCBob2xkIGl0IGluIGEgbG9jYWwgdmFyaWFibGUgdG8gdXNlIGlmIHdhbnRlZC4gICovCi0gIGlmICgoY2FjaGVfcHRyLT50eXBlICYgTl9FWFQpID09IDApCi0gICAgdmlzaWJsZSA9IEJTRl9MT0NBTDsKLSAgZWxzZQotICAgIHZpc2libGUgPSBCU0ZfR0xPQkFMOwotCi0gIHN3aXRjaCAoY2FjaGVfcHRyLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgTl9BQlM6IGNhc2UgTl9BQlMgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSB2aXNpYmxlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgotICAgICAgaWYgKGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlICE9IDApCi0JewotCSAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICAqLwotCSAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCSAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gMDsKLQkgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1RFWFQ6IGNhc2UgTl9URVhUIHwgTl9FWFQ6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgLT0gY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSB2aXNpYmxlOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIE5fU0VUViBzeW1ib2xzIHVzZWQgdG8gcmVwcmVzZW50IHNldCB2ZWN0b3JzIHBsYWNlZCBpbiB0aGUKLQkgZGF0YSBzZWN0aW9uLiAgVGhleSBhcmUgbm8gbG9uZ2VyIGdlbmVyYXRlZC4gIFRoZW9yZXRpY2FsbHksCi0JIGl0IHdhcyBwb3NzaWJsZSB0byBleHRyYWN0IHRoZSBlbnRyaWVzIGFuZCBjb21iaW5lIHRoZW0gd2l0aAotCSBuZXcgb25lcywgYWx0aG91Z2ggSSBkb24ndCBrbm93IGlmIHRoYXQgd2FzIGV2ZXIgYWN0dWFsbHkKLQkgZG9uZS4gIFVubGVzcyB0aGF0IGZlYXR1cmUgaXMgcmVzdG9yZWQsIHRyZWF0IHRoZW0gYXMgZGF0YQotCSBzeW1ib2xzLiAgKi8KLSAgICBjYXNlIE5fU0VUVjogY2FzZSBOX1NFVFYgfCBOX0VYVDoKLSAgICBjYXNlIE5fREFUQTogY2FzZSBOX0RBVEEgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IHZpc2libGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9CU1M6IGNhc2UgTl9CU1MgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gdmlzaWJsZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1NFVEE6IGNhc2UgTl9TRVRBIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX1NFVFQ6IGNhc2UgTl9TRVRUIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX1NFVEQ6IGNhc2UgTl9TRVREIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX1NFVEI6IGNhc2UgTl9TRVRCIHwgTl9FWFQ6Ci0gICAgICB7Ci0JLyogVGhpcyBjb2RlIGlzIG5vIGxvbmdlciBuZWVkZWQuICBJdCB1c2VkIHRvIGJlIHVzZWQgdG8gbWFrZQotICAgICAgICAgICB0aGUgbGlua2VyIGhhbmRsZSBzZXQgc3ltYm9scywgYnV0IHRoZXkgYXJlIG5vdyBoYW5kbGVkIGluCi0gICAgICAgICAgIHRoZSBhZGRfc3ltYm9scyByb3V0aW5lIGluc3RlYWQuICAqLwotI2lmIDAKLQlhc2VjdGlvbiAqc2VjdGlvbjsKLQlhcmVsZW50X2NoYWluICpyZWxvYzsKLQlhc2VjdGlvbiAqaW50b19zZWN0aW9uOwotCi0JLyogVGhpcyBpcyBhIHNldCBzeW1ib2wuICBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGlzIHRoZSBuYW1lCi0JICAgb2YgdGhlIHNldCAoZS5nLiwgX19DVE9SX0xJU1RfXykuICBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbAotCSAgIGlzIHRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIHNldC4gIFdlIGNyZWF0ZSBhIHNlY3Rpb24gd2l0aAotCSAgIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHN5bWJvbCwgYW5kIGFkZCBhIHJlbG9jIHRvIGluc2VydCB0aGUKLQkgICBhcHByb3ByaWF0ZSB2YWx1ZSBpbnRvIHRoZSBzZWN0aW9uLgotCi0JICAgVGhpcyBhY3Rpb24gaXMgYWN0dWFsbHkgb2Jzb2xldGU7IGl0IHVzZWQgdG8gbWFrZSB0aGUKLQkgICBsaW5rZXIgZG8gdGhlIHJpZ2h0IHRoaW5nLCBidXQgdGhlIGxpbmtlciBubyBsb25nZXIgdXNlcwotCSAgIHRoaXMgZnVuY3Rpb24uICAqLwotCi0Jc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBjYWNoZV9wdHItPnN5bWJvbC5uYW1lKTsKLQlpZiAoc2VjdGlvbiA9PSBOVUxMKQotCSAgewotCSAgICBjaGFyICpjb3B5OwotCi0JICAgIGNvcHkgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoY2FjaGVfcHRyLT5zeW1ib2wubmFtZSkgKyAxKTsKLQkgICAgaWYgKGNvcHkgPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgc3RyY3B5IChjb3B5LCBjYWNoZV9wdHItPnN5bWJvbC5uYW1lKTsKLQkgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIGNvcHkpOwotCSAgICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCXJlbG9jID0gKGFyZWxlbnRfY2hhaW4gKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFyZWxlbnRfY2hhaW4pKTsKLQlpZiAocmVsb2MgPT0gTlVMTCkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIEJ1aWxkIGEgcmVsb2NhdGlvbiBlbnRyeSBmb3IgdGhlIGNvbnN0cnVjdG9yLiAgKi8KLQlzd2l0Y2ggKGNhY2hlX3B0ci0+dHlwZSAmIE5fVFlQRSkKLQkgIHsKLQkgIGNhc2UgTl9TRVRBOgotCSAgICBpbnRvX3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX0FCUzsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE5fU0VUVDoKLQkgICAgaW50b19zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX1RFWFQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NFVEQ6Ci0JICAgIGludG9fc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLQkgICAgY2FjaGVfcHRyLT50eXBlID0gTl9EQVRBOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRCOgotCSAgICBpbnRvX3NlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQkgICAgY2FjaGVfcHRyLT50eXBlID0gTl9CU1M7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JLyogQnVpbGQgYSByZWxvY2F0aW9uIHBvaW50aW5nIGludG8gdGhlIGNvbnN0cnVjdG9yIHNlY3Rpb24KLQkgICBwb2ludGluZyBhdCB0aGUgc3ltYm9sIGluIHRoZSBzZXQgdmVjdG9yIHNwZWNpZmllZC4gICovCi0JcmVsb2MtPnJlbGVudC5hZGRlbmQgPSBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZTsKLQljYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gaW50b19zZWN0aW9uOwotCXJlbG9jLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSBpbnRvX3NlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCi0JLyogV2UgbW9kaWZ5IHRoZSBzeW1ib2wgdG8gYmVsb25nIHRvIGEgc2VjdGlvbiBkZXBlbmRpbmcgdXBvbgotCSAgIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wsIGFuZCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24KLQkgICB0byBjb250YWluIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sLiBCdWlsZCBhIHJlbG9jIGVudHJ5IHRvCi0JICAgcmVsb2NhdGUgdG8gdGhpcyBzeW1ib2wgYXR0YWNoZWQgdG8gdGhpcyBzZWN0aW9uLiAgKi8KLQlzZWN0aW9uLT5mbGFncyA9IFNFQ19DT05TVFJVQ1RPUiB8IFNFQ19SRUxPQzsKLQotCXNlY3Rpb24tPnJlbG9jX2NvdW50Kys7Ci0Jc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotCXJlbG9jLT5uZXh0ID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0Jc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW4gPSByZWxvYzsKLQlyZWxvYy0+cmVsZW50LmFkZHJlc3MgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0Jc2VjdGlvbi0+X3Jhd19zaXplICs9IEJZVEVTX0lOX1dPUkQ7Ci0KLQlyZWxvYy0+cmVsZW50Lmhvd3RvID0gQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyhhYmZkKTsKLQotI2VuZGlmIC8qIDAgKi8KLQotCXN3aXRjaCAoY2FjaGVfcHRyLT50eXBlICYgTl9UWVBFKQotCSAgewotCSAgY2FzZSBOX1NFVEE6Ci0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRUOgotCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVREOgotCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRCOgotCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0FSTklORzoKLSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIHRoZSB0ZXh0IG9mIGEgd2FybmluZyBtZXNzYWdlLiAgVGhlIG5leHQKLQkgc3ltYm9sIGlzIHRoZSBzeW1ib2wgdG8gYXNzb2NpYXRlIHRoZSB3YXJuaW5nIHdpdGguICBJZiBhCi0JIHJlZmVyZW5jZSBpcyBtYWRlIHRvIHRoYXQgc3ltYm9sLCBhIHdhcm5pbmcgaXMgaXNzdWVkLiAgKi8KLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORyB8IEJTRl9XQVJOSU5HOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9JTkRSOiBjYXNlIE5fSU5EUiB8IE5fRVhUOgotICAgICAgLyogQW4gaW5kaXJlY3Qgc3ltYm9sLiAgVGhpcyBjb25zaXN0cyBvZiB0d28gc3ltYm9scyBpbiBhIHJvdy4KLQkgVGhlIGZpcnN0IHN5bWJvbCBpcyB0aGUgbmFtZSBvZiB0aGUgaW5kaXJlY3Rpb24uICBUaGUgc2Vjb25kCi0JIHN5bWJvbCBpcyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0LiAgQSByZWZlcmVuY2UgdG8gdGhlIGZpcnN0Ci0JIHN5bWJvbCBiZWNvbWVzIGEgcmVmZXJlbmNlIHRvIHRoZSBzZWNvbmQuICAqLwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HIHwgQlNGX0lORElSRUNUIHwgdmlzaWJsZTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfaW5kX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0VBS1U6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XRUFLQToKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1dFQUtUOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IG9ial90ZXh0c2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XRUFLRDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0VBS0I6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGZpZWxkcyBvZiBTWU1fUE9JTlRFUiBhY2NvcmRpbmcgdG8gQ0FDSEVfUFRSLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzIChhYmZkLCBjYWNoZV9wdHIsIHN5bV9wb2ludGVyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKmNhY2hlX3B0cjsKLSAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1fcG9pbnRlcjsKLXsKLSAgYmZkX3ZtYSB2YWx1ZSA9IGNhY2hlX3B0ci0+dmFsdWU7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF92bWEgb2ZmOwotCi0gIC8qIE1hc2sgb3V0IGFueSBleGlzdGluZyB0eXBlIGJpdHMgaW4gY2FzZSBjb3B5aW5nIGZyb20gb25lIHNlY3Rpb24KLSAgICAgdG8gYW5vdGhlci4gICovCi0gIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gJj0gfk5fVFlQRTsKLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKGNhY2hlX3B0cik7Ci0gIG9mZiA9IDA7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY2FzZSBvY2N1cnMsIGUuZy4sIGZvciB0aGUgKkRFQlVHKiBzZWN0aW9uIG9mIGEgQ09GRgotCSBmaWxlLiAgKi8KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBmb3Igc3ltYm9sIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAKLQkgY2FjaGVfcHRyLT5uYW1lICE9IE5VTEwgPyBjYWNoZV9wdHItPm5hbWUgOiBfKCIqdW5rbm93bioiKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBvZmYgPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotICAgIH0KLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gfD0gTl9BQlM7Ci0gIGVsc2UgaWYgKHNlYyA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX1RFWFQ7Ci0gIGVsc2UgaWYgKHNlYyA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX0RBVEE7Ci0gIGVsc2UgaWYgKHNlYyA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdIHw9IE5fQlNTOwotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fVU5ERiB8IE5fRVhUOwotICBlbHNlIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHNlYykpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fSU5EUjsKLSAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gPSBOX1VOREYgfCBOX0VYVDsKLSAgZWxzZQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFR1cm4gdGhlIHN5bWJvbCBmcm9tIHNlY3Rpb24gcmVsYXRpdmUgdG8gYWJzb2x1dGUgYWdhaW4gKi8KLSAgdmFsdWUgKz0gc2VjLT52bWEgKyBvZmY7Ci0KLSAgaWYgKChjYWNoZV9wdHItPmZsYWdzICYgQlNGX1dBUk5JTkcpICE9IDApCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fV0FSTklORzsKLQotICBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gPSAoKGFvdXRfc3ltYm9sX3R5cGUgKikgY2FjaGVfcHRyKS0+dHlwZTsKLSAgZWxzZSBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gfD0gTl9FWFQ7Ci0KLSAgaWYgKChjYWNoZV9wdHItPmZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHsKLSAgICAgIGludCB0eXBlID0gKChhb3V0X3N5bWJvbF90eXBlICopIGNhY2hlX3B0ciktPnR5cGU7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgTl9BQlM6CXR5cGUgPSBOX1NFVEE7IGJyZWFrOwotCWNhc2UgTl9URVhUOgl0eXBlID0gTl9TRVRUOyBicmVhazsKLQljYXNlIE5fREFUQToJdHlwZSA9IE5fU0VURDsgYnJlYWs7Ci0JY2FzZSBOX0JTUzoJdHlwZSA9IE5fU0VUQjsgYnJlYWs7Ci0JfQotICAgICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IHR5cGU7Ci0gICAgfQotCi0gIGlmICgoY2FjaGVfcHRyLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotCi0gICAgICBzd2l0Y2ggKHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gJiBOX1RZUEUpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBOX0FCUzoJdHlwZSA9IE5fV0VBS0E7IGJyZWFrOwotCWNhc2UgTl9URVhUOgl0eXBlID0gTl9XRUFLVDsgYnJlYWs7Ci0JY2FzZSBOX0RBVEE6CXR5cGUgPSBOX1dFQUtEOyBicmVhazsKLQljYXNlIE5fQlNTOgl0eXBlID0gTl9XRUFLQjsgYnJlYWs7Ci0JY2FzZSBOX1VOREY6CXR5cGUgPSBOX1dFQUtVOyBicmVhazsKLQl9Ci0gICAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdID0gdHlwZTsKLSAgICB9Ci0KLSAgUFVUX1dPUkQoYWJmZCwgdmFsdWUsIHN5bV9wb2ludGVyLT5lX3ZhbHVlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIE5hdGl2ZS1sZXZlbCBpbnRlcmZhY2UgdG8gc3ltYm9scy4gKi8KLQotYXN5bWJvbCAqCi1OQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFvdXRfc3ltYm9sX3R5cGUgICpuZXcgPQotICAgIChhb3V0X3N5bWJvbF90eXBlICopYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSk7Ci0gIGlmICghbmV3KQotICAgIHJldHVybiBOVUxMOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi0vKiBUcmFuc2xhdGUgYSBzZXQgb2YgaW50ZXJuYWwgc3ltYm9scyBpbnRvIGV4dGVybmFsIHN5bWJvbHMuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkgKGFiZmQsIGluLCBleHQsIGNvdW50LCBzdHIsIHN0cnNpemUsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYW91dF9zeW1ib2xfdHlwZSAqaW47Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZXh0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBjaGFyICpzdHI7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3Ryc2l6ZTsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKmV4dF9lbmQ7Ci0KLSAgZXh0X2VuZCA9IGV4dCArIGNvdW50OwotICBmb3IgKDsgZXh0IDwgZXh0X2VuZDsgZXh0KyssIGluKyspCi0gICAgewotICAgICAgYmZkX3ZtYSB4OwotCi0gICAgICB4ID0gR0VUX1dPUkQgKGFiZmQsIGV4dC0+ZV9zdHJ4KTsKLSAgICAgIGluLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0KLSAgICAgIC8qIEZvciB0aGUgbm9ybWFsIHN5bWJvbHMsIHRoZSB6ZXJvIGluZGV4IHBvaW50cyBhdCB0aGUgbnVtYmVyCi0JIG9mIGJ5dGVzIGluIHRoZSBzdHJpbmcgdGFibGUgYnV0IGlzIHRvIGJlIGludGVycHJldGVkIGFzIHRoZQotCSBudWxsIHN0cmluZy4gIEZvciB0aGUgZHluYW1pYyBzeW1ib2xzLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluCi0JIHRoZSBzdHJpbmcgdGFibGUgaXMgc3RvcmVkIGluIHRoZSBfX0RZTkFNSUMgc3RydWN0dXJlIGFuZCB0aGUKLQkgemVybyBpbmRleCBwb2ludHMgYXQgYW4gYWN0dWFsIHN0cmluZy4gICovCi0gICAgICBpZiAoeCA9PSAwICYmICEgZHluYW1pYykKLQlpbi0+c3ltYm9sLm5hbWUgPSAiIjsKLSAgICAgIGVsc2UgaWYgKHggPCBzdHJzaXplKQotCWluLT5zeW1ib2wubmFtZSA9IHN0ciArIHg7Ci0gICAgICBlbHNlCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpbi0+c3ltYm9sLnZhbHVlID0gR0VUX1NXT1JEIChhYmZkLCAgZXh0LT5lX3ZhbHVlKTsKLSAgICAgIGluLT5kZXNjID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQtPmVfZGVzYyk7Ci0gICAgICBpbi0+b3RoZXIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgZXh0LT5lX290aGVyKTsKLSAgICAgIGluLT50eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsICBleHQtPmVfdHlwZSk7Ci0gICAgICBpbi0+c3ltYm9sLnVkYXRhLnAgPSBOVUxMOwotCi0gICAgICBpZiAoISB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzIChhYmZkLCBpbikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoZHluYW1pYykKLQlpbi0+c3ltYm9sLmZsYWdzIHw9IEJTRl9EWU5BTUlDOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgcmVhZCB0aGUgc3ltYm9scyBpbnRvIGEgYnVmZmVyLCB3aGljaCBpcyBkaXNjYXJkZWQgd2hlbiB0aGlzCi0gICBmdW5jdGlvbiBleGl0cy4gIFdlIHJlYWQgdGhlIHN0cmluZ3MgaW50byBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8KLSAgIGhvbGQgdGhlbSBhbGwgcGx1cyBhbGwgdGhlIGNhY2hlZCBzeW1ib2wgZW50cmllcy4gKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvbGRfZXh0ZXJuYWxfc3ltczsKLSAgYW91dF9zeW1ib2xfdHlwZSAqY2FjaGVkOwotICBzaXplX3QgY2FjaGVkX3NpemU7Ci0KLSAgLyogSWYgdGhlcmUncyBubyB3b3JrIHRvIGJlIGRvbmUsIGRvbid0IGRvIGFueSAqLwotICBpZiAob2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgIT0gKGFvdXRfc3ltYm9sX3R5cGUgKikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBvbGRfZXh0ZXJuYWxfc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOwotCi0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjYWNoZWRfc2l6ZSA9IChvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpCi0JCSAqIHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSkpOwotICBjYWNoZWQgPSAoYW91dF9zeW1ib2xfdHlwZSAqKSBiZmRfbWFsbG9jIChjYWNoZWRfc2l6ZSk7Ci0gIGlmIChjYWNoZWQgPT0gTlVMTCAmJiBjYWNoZWRfc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGNhY2hlZF9zaXplICE9IDApCi0gICAgbWVtc2V0IChjYWNoZWQsIDAsIGNhY2hlZF9zaXplKTsKLQotICAvKiBDb252ZXJ0IGZyb20gZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uIHRvIGludGVybmFsLiAgKi8KLSAgaWYgKCEgKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKQotCSAoYWJmZCwgY2FjaGVkLAotCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCksCi0JICBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpLAotCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCksCi0JICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSAoYWJmZCksCi0JICBmYWxzZSkpKQotICAgIHsKLSAgICAgIGZyZWUgKGNhY2hlZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKLQotICBvYmpfYW91dF9zeW1ib2xzIChhYmZkKSA9IGNhY2hlZDsKLQotICAvKiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFueWJvZHkgd2hvIGNhbGxzIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QKLSAgICAgd2FudCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLCBzbyBpZiBpdCB3YXMgYWxsb2NhdGVkCi0gICAgIGJlY2F1c2Ugb2Ygb3VyIGNhbGwgdG8gYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scywgd2UgZnJlZSBpdCB1cAotICAgICByaWdodCBhd2F5IHRvIHNhdmUgc3BhY2UuICAqLwotICBpZiAob2xkX2V4dGVybmFsX3N5bXMgPT0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMCi0gICAgICAmJiBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSAhPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwpCi0gICAgewotI2lmZGVmIFVTRV9NTUFQCi0gICAgICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSk7Ci0jZWxzZQotICAgICAgZnJlZSAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOwotI2VuZGlmCi0gICAgICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB3aGVuIHdyaXRpbmcgb3V0IHN5bWJvbHMgc28gdGhhdCB3ZSBvbmx5IHdyaXRlCi0gICBvdXQgYSBwYXJ0aWN1bGFyIHN0cmluZyBvbmNlLiAgVGhpcyBoZWxwcyBwYXJ0aWN1bGFybHkgd2hlbiB0aGUKLSAgIGxpbmtlciB3cml0ZXMgb3V0IHN0YWJzIGRlYnVnZ2luZyBlbnRyaWVzLCBiZWNhdXNlIGVhY2ggZGlmZmVyZW50Ci0gICBjb250cmlidXRpbmcgb2JqZWN0IGZpbGUgdGVuZHMgdG8gaGF2ZSBtYW55IGR1cGxpY2F0ZSBzdGFicwotICAgc3RyaW5ncy4KLQotICAgVGhpcyBoYXNoIHRhYmxlIGNvZGUgYnJlYWtzIGRieCBvbiBTdW5PUyA0LjEuMywgc28gd2UgZG9uJ3QgZG8gaXQKLSAgIGlmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LiAgKi8KLQotc3RhdGljIGJmZF9zaXplX3R5cGUgYWRkX3RvX3N0cmluZ3RhYgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGVtaXRfc3RyaW5ndGFiIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogR2V0IHRoZSBpbmRleCBvZiBhIHN0cmluZyBpbiBhIHN0cnRhYiwgYWRkaW5nIGl0IGlmIGl0IGlzIG5vdAotICAgYWxyZWFkeSBwcmVzZW50LiAgKi8KLQotc3RhdGljIElOTElORSBiZmRfc2l6ZV90eXBlCi1hZGRfdG9fc3RyaW5ndGFiIChhYmZkLCB0YWIsIHN0ciwgY29weSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgYm9vbGVhbiBjb3B5OwotewotICBib29sZWFuIGhhc2g7Ci0gIGJmZF9zaXplX3R5cGUgaW5kZXg7Ci0KLSAgLyogQW4gaW5kZXggb2YgMCBhbHdheXMgbWVhbnMgdGhlIGVtcHR5IHN0cmluZy4gICovCi0gIGlmIChzdHIgPT0gMCB8fCAqc3RyID09ICdcMCcpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogRG9uJ3QgaGFzaCBpZiBCRkRfVFJBRElUSU9OQUxfRk9STUFUIGlzIHNldCwgYmVjYXVzZSBTdW5PUyBkYngKLSAgICAgZG9lc24ndCB1bmRlcnN0YW5kIGEgaGFzaGVkIHN0cmluZyB0YWJsZS4gICovCi0gIGhhc2ggPSB0cnVlOwotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLSAgICBoYXNoID0gZmFsc2U7Ci0KLSAgaW5kZXggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKHRhYiwgc3RyLCBoYXNoLCBjb3B5KTsKLQotICBpZiAoaW5kZXggIT0gKGJmZF9zaXplX3R5cGUpIC0xKQotICAgIHsKLSAgICAgIC8qIEFkZCBCWVRFU19JTl9XT1JEIHRvIHRoZSByZXR1cm4gdmFsdWUgdG8gYWNjb3VudCBmb3IgdGhlCi0JIHNwYWNlIHRha2VuIHVwIGJ5IHRoZSBzdHJpbmcgdGFibGUgc2l6ZS4gICovCi0gICAgICBpbmRleCArPSBCWVRFU19JTl9XT1JEOwotICAgIH0KLQotICByZXR1cm4gaW5kZXg7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN0cnRhYi4gIEFCRkQgaXMgYWxyZWFkeSBhdCB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlCi0gICBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVtaXRfc3RyaW5ndGFiIChhYmZkLCB0YWIpCi0gICAgIHJlZ2lzdGVyIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFiOwotewotICBiZmRfYnl0ZSBidWZmZXJbQllURVNfSU5fV09SRF07Ci0KLSAgLyogVGhlIHN0cmluZyB0YWJsZSBzdGFydHMgd2l0aCB0aGUgc2l6ZS4gICovCi0gIFBVVF9XT1JEIChhYmZkLCBfYmZkX3N0cmluZ3RhYl9zaXplICh0YWIpICsgQllURVNfSU5fV09SRCwgYnVmZmVyKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZmVyLCAxLCBCWVRFU19JTl9XT1JELCBhYmZkKSAhPSBCWVRFU19JTl9XT1JEKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgdGFiKTsKLX0KLQwKLWJvb2xlYW4KLU5BTUUoYW91dCx3cml0ZV9zeW1zKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgY291bnQgOwotICBhc3ltYm9sICoqZ2VuZXJpYyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLQotICBzdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoc3RydGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOyBjb3VudCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKmcgPSBnZW5lcmljW2NvdW50XTsKLSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLSAgICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCBuc3A7Ci0KLSAgICAgIGluZHggPSBhZGRfdG9fc3RyaW5ndGFiIChhYmZkLCBzdHJ0YWIsIGctPm5hbWUsIGZhbHNlKTsKLSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIFBVVF9XT1JEIChhYmZkLCBpbmR4LCAoYmZkX2J5dGUgKikgbnNwLmVfc3RyeCk7Ci0KLSAgICAgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyKGcpID09IGFiZmQtPnh2ZWMtPmZsYXZvdXIpCi0JewotCSAgYmZkX2hfcHV0XzE2KGFiZmQsIGFvdXRfc3ltYm9sKGcpLT5kZXNjLCAgbnNwLmVfZGVzYyk7Ci0JICBiZmRfaF9wdXRfOChhYmZkLCBhb3V0X3N5bWJvbChnKS0+b3RoZXIsICBuc3AuZV9vdGhlcik7Ci0JICBiZmRfaF9wdXRfOChhYmZkLCBhb3V0X3N5bWJvbChnKS0+dHlwZSwgIG5zcC5lX3R5cGUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfaF9wdXRfMTYoYWJmZCwwLCBuc3AuZV9kZXNjKTsKLQkgIGJmZF9oX3B1dF84KGFiZmQsIDAsIG5zcC5lX290aGVyKTsKLQkgIGJmZF9oX3B1dF84KGFiZmQsIDAsIG5zcC5lX3R5cGUpOwotCX0KLQotICAgICAgaWYgKCEgdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGcsICZuc3ApKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3dyaXRlKChQVFIpJm5zcCwxLEVYVEVSTkFMX05MSVNUX1NJWkUsIGFiZmQpCi0JICAhPSBFWFRFUk5BTF9OTElTVF9TSVpFKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBOQjogYEtFRVBJVCcgY3VycmVudGx5IG92ZXJsYXlzIGB1ZGF0YS5wJywgc28gc2V0IHRoaXMgb25seQotCSBoZXJlLCBhdCB0aGUgZW5kLiAgKi8KLSAgICAgIGctPktFRVBJVCA9IGNvdW50OwotICAgIH0KLQotICBpZiAoISBlbWl0X3N0cmluZ3RhYiAoYWJmZCwgc3RydGFiKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBfYmZkX3N0cmluZ3RhYl9mcmVlIChzdHJ0YWIpOwotCi0gIHJldHVybiB0cnVlOwotCi1lcnJvcl9yZXR1cm46Ci0gIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKHN0cnRhYik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotDAotbG9uZwotTkFNRShhb3V0LGdldF9zeW10YWIpIChhYmZkLCBsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci17Ci0gICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICAgIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0KLSAgICBpZiAoIU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKGFiZmQpKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgZm9yIChzeW1iYXNlID0gb2JqX2FvdXRfc3ltYm9scyhhYmZkKTsgY291bnRlcisrIDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7KQotICAgICAgKihsb2NhdGlvbisrKSA9IChhc3ltYm9sICopKCBzeW1iYXNlKyspOwotICAgICpsb2NhdGlvbisrID0wOwotICAgIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotDAotLyogU3RhbmRhcmQgcmVsb2Mgc3R1ZmYgKi8KLS8qIE91dHB1dCBzdGFuZGFyZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGEgZmlsZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gKi8KLQotZXh0ZXJuIHZvaWQgIE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikpOwotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgUFVUX1dPUkQoYWJmZCwgZy0+YWRkcmVzcywgbmF0cHRyLT5yX2FkZHJlc3MpOwotCi0gIHJfbGVuZ3RoID0gZy0+aG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIHJfcGNyZWwgID0gKGludCkgZy0+aG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLSAgLyogWFhYIFRoaXMgcmVsaWVzIG9uIHJlbG9jcyBjb21pbmcgZnJvbSBhLm91dCBmaWxlcy4gICovCi0gIHJfYmFzZXJlbCA9IChnLT5ob3d0by0+dHlwZSAmIDgpICE9IDA7Ci0gIHJfam1wdGFibGUgPSAoZy0+aG93dG8tPnR5cGUgJiAxNikgIT0gMDsKLSAgcl9yZWxhdGl2ZSA9IChnLT5ob3d0by0+dHlwZSAmIDMyKSAhPSAwOwotCi0jaWYgMAotICAvKiBGb3IgYSBzdGFuZGFyZCByZWxvYywgdGhlIGFkZGVuZCBpcyBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQotICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQotICAgICAqLwotCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCi0gICAgewotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCA9PSBzeW0pCi0gICAgICB7Ci0JLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgIGZyb20gdGhlIGFicyBzZWN0aW9uICovCi0Jcl9pbmRleCA9IE5fQUJTOwotCXJfZXh0ZXJuID0gMDsKLSAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JLyogRmlsbCBpbiBzeW1ib2wgKi8KLQlyX2V4dGVybiA9IDE7Ci0Jcl9pbmRleCA9ICgqKGctPnN5bV9wdHJfcHRyKSktPktFRVBJVDsKLQotICAgICAgfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCAgPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0gICAgICAgKHJfZXh0ZXJuPyAgICBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOiAwKQotCXwgKHJfcGNyZWw/ICAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUc6IDApCi0JIHwgKHJfYmFzZXJlbD8gICBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRzogMCkKLQkgIHwgKHJfam1wdGFibGU/ICBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUc6IDApCi0JICAgfCAocl9yZWxhdGl2ZT8gIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRzogMCkKLQkgICAgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotICAgIH0gZWxzZSB7Ci0JbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLQluYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLQluYXRwdHItPnJfdHlwZVswXSA9Ci0JIChyX2V4dGVybj8gICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKLQkgIHwgKHJfcGNyZWw/ICAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU6IDApCi0JICAgfCAocl9iYXNlcmVsPyAgIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFOiAwKQotCSAgICB8IChyX2ptcHRhYmxlPyAgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFOiAwKQotCSAgICAgfCAocl9yZWxhdGl2ZT8gIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRTogMCkKLQkgICAgICB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgICB9Ci19Ci0KLQotLyogRXh0ZW5kZWQgc3R1ZmYgKi8KLS8qIE91dHB1dCBleHRlbmRlZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGEgZmlsZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gKi8KLQotZXh0ZXJuIHZvaWQgTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICB1bnNpZ25lZCBpbnQgcl9hZGRlbmQ7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEIChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl90eXBlID0gKHVuc2lnbmVkIGludCkgZy0+aG93dG8tPnR5cGU7Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQ7Ci0gIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICByX2FkZGVuZCArPSAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZS4gICovCi0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLSAgICB7Ci0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gTl9BQlM7Ci0gICAgfQotICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICB8fCAoc3ltLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDApCi0Jcl9leHRlcm4gPSAxOwotICAgICAgZWxzZQotCXJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSAoKihnLT5zeW1fcHRyX3B0cikpLT5LRUVQSVQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLSAgICAgICgocl9leHRlcm4/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUc6IDApCi0gICAgICAgfCAocl90eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7Ci0gIH0gZWxzZSB7Ci0gICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0gICAgIChyX2V4dGVybj8gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKLSAgICAgIHwgKHJfdHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0gIH0KLQotICBQVVRfV09SRCAoYWJmZCwgcl9hZGRlbmQsIG5hdHB0ci0+cl9hZGRlbmQpOwotfQotCi0vKiBCRkQgZGVhbHMgaW50ZXJuYWxseSB3aXRoIGFsbCB0aGluZ3MgYmFzZWQgZnJvbSB0aGUgc2VjdGlvbiB0aGV5J3JlCi0gICBpbi4gc28sIHNvbWV0aGluZyBpbiAxMCBieXRlcyBpbnRvIGEgdGV4dCBzZWN0aW9uICB3aXRoIGEgYmFzZSBvZgotICAgNTAgd291bGQgaGF2ZSBhIHN5bWJvbCAoLnRleHQrMTApIGFuZCBrbm93IC50ZXh0IHZtYSB3YXMgNTAuCi0KLSAgIEFvdXQga2VlcHMgYWxsIGl0J3Mgc3ltYm9scyBiYXNlZCBmcm9tIHplcm8sIHNvIHRoZSBzeW1ib2wgd291bGQKLSAgIGNvbnRhaW4gNjAuIFRoaXMgbWFjcm8gc3VicyB0aGUgYmFzZSBvZiBlYWNoIHNlY3Rpb24gZnJvbSB0aGUgdmFsdWUKLSAgIHRvIGdpdmUgdGhlIHRydWUgb2Zmc2V0IGZyb20gdGhlIHNlY3Rpb24gKi8KLQotCi0jZGVmaW5lIE1PVkVfQUREUkVTUyhhZCkgICAgICAgCQkJCQkJXAotICBpZiAocl9leHRlcm4pIHsJCQkJCQkJXAotICAgLyogdW5kZWZpbmVkIHN5bWJvbCAqLwkJCQkJCVwKLSAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyByX2luZGV4OwkJCVwKLSAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZDsJCQkJCQlcCi0gICAgIH0gZWxzZSB7CQkJCQkJCQlcCi0gICAgLyogZGVmaW5lZCwgc2VjdGlvbiByZWxhdGl2ZS4gcmVwbGFjZSBzeW1ib2wgd2l0aCBwb2ludGVyIHRvICAgIAlcCi0gICAgICAgc3ltYm9sIHdoaWNoIHBvaW50cyB0byBzZWN0aW9uICAqLwkJCQlcCi0gICAgc3dpdGNoIChyX2luZGV4KSB7CQkJCQkJCVwKLSAgICBjYXNlIE5fVEVYVDoJCQkJCQkJXAotICAgIGNhc2UgTl9URVhUIHwgTl9FWFQ6CQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfdGV4dHNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgIC0gc3UtPnRleHRzZWMtPnZtYTsJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBjYXNlIE5fREFUQToJCQkJCQkJXAotICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6CQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfZGF0YXNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgLSBzdS0+ZGF0YXNlYy0+dm1hOwkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIGNhc2UgTl9CU1M6CQkJCQkJCQlcCi0gICAgY2FzZSBOX0JTUyB8IE5fRVhUOgkJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyICA9IG9ial9ic3NzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkIC0gc3UtPmJzc3NlYy0+dm1hOwkJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBkZWZhdWx0OgkJCQkJCQkJXAotICAgIGNhc2UgTl9BQlM6CQkJCQkJCQlcCi0gICAgY2FzZSBOX0FCUyB8IE5fRVhUOgkJCQkJCQlcCi0gICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZDsJCQkJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotICB9ICAgICAJCQkJCQkJCVwKLQotdm9pZAotTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqYnl0ZXM7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci17Ci0gIHVuc2lnbmVkIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gKEdFVF9TV09SRCAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcykpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgcl9pbmRleCA9ICAoYnl0ZXMtPnJfaW5kZXhbMF0gPDwgMTYpCi0JICAgICB8IChieXRlcy0+cl9pbmRleFsxXSA8PCA4KQotCSAgICAgfCAgYnl0ZXMtPnJfaW5kZXhbMl07Ci0gICAgcl9leHRlcm4gPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICByX3R5cGUgICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcpCi0JCQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUc7Ci0gIH0gZWxzZSB7Ci0gICAgcl9pbmRleCA9ICAoYnl0ZXMtPnJfaW5kZXhbMl0gPDwgMTYpCi0JICAgICB8IChieXRlcy0+cl9pbmRleFsxXSA8PCA4KQotCSAgICAgfCAgYnl0ZXMtPnJfaW5kZXhbMF07Ci0gICAgcl9leHRlcm4gPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLSAgICByX3R5cGUgICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUpCi0JCQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEU7Ci0gIH0KLQotICBjYWNoZV9wdHItPmhvd3RvID0gIGhvd3RvX3RhYmxlX2V4dCArIHJfdHlwZTsKLQotICAvKiBCYXNlIHJlbGF0aXZlIHJlbG9jcyBhcmUgYWx3YXlzIGFnYWluc3QgdGhlIHN5bWJvbCB0YWJsZSwKLSAgICAgcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiByX2V4dGVybi4gIHJfZXh0ZXJuIGp1c3QgcmVmbGVjdHMKLSAgICAgd2hldGhlciB0aGUgc3ltYm9sIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGlzIGxvY2FsIG9yIGdsb2JhbC4gICovCi0gIGlmIChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0gICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0gICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotICAgIHJfZXh0ZXJuID0gMTsKLQotICBpZiAocl9leHRlcm4gJiYgcl9pbmRleCA+IHN5bWNvdW50KQotICAgIHsKLSAgICAgIC8qIFdlIGNvdWxkIGFycmFuZ2UgdG8gcmV0dXJuIGFuIGVycm9yLCBidXQgaXQgbWlnaHQgYmUgdXNlZnVsCi0gICAgICAgICB0byBzZWUgdGhlIGZpbGUgZXZlbiBpZiBpdCBpcyBiYWQuICAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9IE5fQUJTOwotICAgIH0KLQotICBNT1ZFX0FERFJFU1MoR0VUX1NXT1JEKGFiZmQsIGJ5dGVzLT5yX2FkZGVuZCkpOwotfQotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLXsKLSAgdW5zaWduZWQgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZTsKLSAgc3RydWN0IGFvdXRkYXRhICAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0gIHVuc2lnbmVkIGludCBob3d0b19pZHg7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIHJfaW5kZXggPSAgKGJ5dGVzLT5yX2luZGV4WzBdIDw8IDE2KQotICAgICAgfCAoYnl0ZXMtPnJfaW5kZXhbMV0gPDwgOCkKLQl8ICBieXRlcy0+cl9pbmRleFsyXTsKLSAgICByX2V4dGVybiAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgICByX3BjcmVsICAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotICAgIHJfYmFzZXJlbCA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcpKTsKLSAgICByX2ptcHRhYmxlPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRykpOwotICAgIHJfcmVsYXRpdmU9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHKSk7Ci0gICAgcl9sZW5ndGggID0gICAgICAgKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfQklHKQotICAgICAgCQkJPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRzsKLSAgfSBlbHNlIHsKLSAgICByX2luZGV4ID0gIChieXRlcy0+cl9pbmRleFsyXSA8PCAxNikKLSAgICAgIHwgKGJ5dGVzLT5yX2luZGV4WzFdIDw8IDgpCi0JfCAgYnl0ZXMtPnJfaW5kZXhbMF07Ci0gICAgcl9leHRlcm4gID0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICAgcl9wY3JlbCAgID0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgICByX2Jhc2VyZWwgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFKSk7Ci0gICAgcl9qbXB0YWJsZT0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpKTsKLSAgICByX3JlbGF0aXZlPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSkpOwotICAgIHJfbGVuZ3RoICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkKLSAgICAgIAkJCT4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEU7Ci0gIH0KLQotICBob3d0b19pZHggPSByX2xlbmd0aCArIDQgKiByX3BjcmVsICsgOCAqIHJfYmFzZXJlbAotCSAgICAgICsgMTYgKiByX2ptcHRhYmxlICsgMzIgKiByX3JlbGF0aXZlOwotICBCRkRfQVNTRVJUIChob3d0b19pZHggPCBUQUJMRV9TSVpFIChob3d0b190YWJsZV9zdGQpKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICBob3d0b190YWJsZV9zdGQgKyBob3d0b19pZHg7Ci0gIEJGRF9BU1NFUlQgKGNhY2hlX3B0ci0+aG93dG8tPnR5cGUgIT0gKHVuc2lnbmVkIGludCkgLTEpOwotCi0gIC8qIEJhc2UgcmVsYXRpdmUgcmVsb2NzIGFyZSBhbHdheXMgYWdhaW5zdCB0aGUgc3ltYm9sIHRhYmxlLAotICAgICByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHJfZXh0ZXJuLiAgcl9leHRlcm4ganVzdCByZWZsZWN0cwotICAgICB3aGV0aGVyIHRoZSBzeW1ib2wgdGhlIHJlbG9jIGlzIGFnYWluc3QgaXMgbG9jYWwgb3IgZ2xvYmFsLiAgKi8KLSAgaWYgKHJfYmFzZXJlbCkKLSAgICByX2V4dGVybiA9IDE7Ci0KLSAgaWYgKHJfZXh0ZXJuICYmIHJfaW5kZXggPiBzeW1jb3VudCkKLSAgICB7Ci0gICAgICAvKiBXZSBjb3VsZCBhcnJhbmdlIHRvIHJldHVybiBhbiBlcnJvciwgYnV0IGl0IG1pZ2h0IGJlIHVzZWZ1bAotICAgICAgICAgdG8gc2VlIHRoZSBmaWxlIGV2ZW4gaWYgaXQgaXMgYmFkLiAgKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBOX0FCUzsKLSAgICB9Ci0KLSAgTU9WRV9BRERSRVNTKDApOwotfQotCi0vKiBSZWFkIGFuZCBzd2FwIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKLSAgUFRSIHJlbG9jczsKLSAgYXJlbGVudCAqcmVsb2NfY2FjaGU7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLSAgYXJlbGVudCAqY2FjaGVfcHRyOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyKGFiZmQpLT5hX2Ryc2l6ZTsKLSAgZWxzZSBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKQotICAgIHJlbG9jX3NpemUgPSBleGVjX2hkcihhYmZkKS0+YV90cnNpemU7Ci0gIGVsc2UgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJlbG9jX3NpemUgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhc2VjdC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0KLSAgY291bnQgPSByZWxvY19zaXplIC8gZWFjaF9zaXplOwotCi0gIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgKGNvdW50ICogc2l6ZW9mIChhcmVsZW50KSkpOwotICBpZiAocmVsb2NfY2FjaGUgPT0gTlVMTCAmJiBjb3VudCAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtc2V0IChyZWxvY19jYWNoZSwgMCwgY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvY3MgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxvY19zaXplKTsKLSAgaWYgKHJlbG9jcyA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbG9jcyk7Ci0gICAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlOwotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJwdHIgPQotCShzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jczsKLQotICAgICAgZm9yICg7IGNvdW50ZXIgPCBjb3VudDsgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotCU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKLQkJCQkgICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcnB0ciA9Ci0JKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzOwotCi0gICAgICBmb3IgKDsgY291bnRlciA8IGNvdW50OyBjb3VudGVyKyssIHJwdHIrKywgY2FjaGVfcHRyKyspCi0JTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKLQkJCSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLSAgICB9Ci0KLSAgZnJlZSAocmVsb2NzKTsKLQotICBhc2VjdC0+cmVsb2NhdGlvbiA9IHJlbG9jX2NhY2hlOwotICBhc2VjdC0+cmVsb2NfY291bnQgPSBjYWNoZV9wdHIgLSByZWxvY19jYWNoZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgcmVsb2NhdGlvbiBzZWN0aW9uIGludG8gYW4gb2JqZWN0IGZpbGUuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBhcmVsZW50ICoqZ2VuZXJpYzsKLSAgdW5zaWduZWQgY2hhciAqbmF0aXZlLCAqbmF0cHRyOwotICBzaXplX3QgZWFjaF9zaXplOwotCi0gIHVuc2lnbmVkIGludCBjb3VudCA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICBzaXplX3QgbmF0c2l6ZTsKLQotICBpZiAoY291bnQgPT0gMCB8fCBzZWN0aW9uLT5vcmVsb2NhdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLSAgbmF0c2l6ZSA9IGVhY2hfc2l6ZSAqIGNvdW50OwotICBuYXRpdmUgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChhYmZkLCBuYXRzaXplKTsKLSAgaWYgKCFuYXRpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGdlbmVyaWMgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKLQotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOwotCSAgIGNvdW50ICE9IDA7Ci0JICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotCU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiluYXRwdHIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOwotCSAgIGNvdW50ICE9IDA7Ci0JICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotCU1ZX3N3YXBfc3RkX3JlbG9jX291dChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiluYXRwdHIpOwotICAgIH0KLQotICBpZiAoIGJmZF93cml0ZSAoKFBUUikgbmF0aXZlLCAxLCBuYXRzaXplLCBhYmZkKSAhPSBuYXRzaXplKSB7Ci0gICAgYmZkX3JlbGVhc2UoYWJmZCwgbmF0aXZlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIG5hdGl2ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLwotbG9uZwotTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaWYgKHNlY3Rpb24gPT0gb2JqX2Jzc3NlYyAoYWJmZCkpCi0gICAgewotICAgICAgKnJlbHB0ciA9IE5VTEw7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKCEodGJscHRyIHx8IE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpIHsKLSAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCArKykgewotICAgICAgKnJlbHB0ciArKyA9ICZjaGFpbi0+cmVsZW50OwotICAgICAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotICAgICAgewotCSpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgICAgfQotICB9Ci0gICpyZWxwdHIgPSAwOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotbG9uZwotTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpIHsKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqIChhc2VjdC0+cmVsb2NfY291bnQrMSkpOwotICB9Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKQotCSAgICAqICgoZXhlY19oZHIoYWJmZCktPmFfZHJzaXplIC8gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKQotCSAgICAgICArIDEpKTsKLQotICBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKQotICAgIHJldHVybiAoc2l6ZW9mIChhcmVsZW50ICopCi0JICAgICogKChleGVjX2hkcihhYmZkKS0+YV90cnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpCi0JICAgICAgICsgMSkpOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICByZXR1cm4gc2l6ZW9mIChhcmVsZW50ICopOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICByZXR1cm4gMDsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gLTE7Ci19Ci0KLQwKLWxvbmcKLU5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKzEpICogKHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSAqKSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotIGFsZW50ICoKLU5BTUUoYW91dCxnZXRfbGluZW5vKSAoaWdub3JlX2FiZmQsIGlnbm9yZV9zeW1ib2wpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqaWdub3JlX3N5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gKGFsZW50ICopTlVMTDsKLX0KLQotLypBUkdTVVNFRCovCi12b2lkCi1OQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKSAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci0KLSAgaWYgKHJldC0+dHlwZSA9PSAnPycpCi0gICAgewotICAgICAgaW50IHR5cGVfY29kZSA9IGFvdXRfc3ltYm9sKHN5bWJvbCktPnR5cGUgJiAweGZmOwotICAgICAgY29uc3QgY2hhciAqc3RhYl9uYW1lID0gYmZkX2dldF9zdGFiX25hbWUgKHR5cGVfY29kZSk7Ci0gICAgICBzdGF0aWMgY2hhciBidWZbMTBdOwotCi0gICAgICBpZiAoc3RhYl9uYW1lID09IE5VTEwpCi0JewotCSAgc3ByaW50ZihidWYsICIoJWQpIiwgdHlwZV9jb2RlKTsKLQkgIHN0YWJfbmFtZSA9IGJ1ZjsKLQl9Ci0gICAgICByZXQtPnR5cGUgPSAnLSc7Ci0gICAgICByZXQtPnN0YWJfdHlwZSA9IHR5cGVfY29kZTsKLSAgICAgIHJldC0+c3RhYl9vdGhlciA9ICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+b3RoZXIgJiAweGZmKTsKLSAgICAgIHJldC0+c3RhYl9kZXNjID0gKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5kZXNjICYgMHhmZmZmKTsKLSAgICAgIHJldC0+c3RhYl9uYW1lID0gc3RhYl9uYW1lOwotICAgIH0KLX0KLQotLypBUkdTVVNFRCovCi12b2lkCi1OQU1FKGFvdXQscHJpbnRfc3ltYm9sKSAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopYWZpbGU7Ci0KLSAgc3dpdGNoIChob3cpIHsKLSAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgaWYgKHN5bWJvbC0+bmFtZSkKLSAgICAgIGZwcmludGYoZmlsZSwiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICBmcHJpbnRmKGZpbGUsIiU0eCAlMnggJTJ4IiwodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPmRlc2MgJiAweGZmZmYpLAotCSAgICAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPm90aGVyICYgMHhmZiksCi0JICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+dHlwZSkpOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgIHsKLSAgIENPTlNUIGNoYXIgKnNlY3Rpb25fbmFtZSA9IHN5bWJvbC0+c2VjdGlvbi0+bmFtZTsKLQotCi0gICAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKChQVFIpZmlsZSxzeW1ib2wpOwotCi0gICAgICBmcHJpbnRmKGZpbGUsIiAlLTVzICUwNHggJTAyeCAlMDJ4IiwKLQkgICAgICBzZWN0aW9uX25hbWUsCi0JICAgICAgKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5kZXNjICYgMHhmZmZmKSwKLQkgICAgICAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPm90aGVyICYgMHhmZiksCi0JICAgICAgKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT50eXBlICAmIDB4ZmYpKTsKLSAgICAgIGlmIChzeW1ib2wtPm5hbWUpCi0gICAgICAgIGZwcmludGYoZmlsZSwiICVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotLyogSWYgd2UgZG9uJ3QgaGF2ZSB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gMU1CIHRvIGhvbGQgdGhlIGdlbmVyaWMKLSAgIHN5bWJvbHMsIHdlIHVzZSB0aGUgZ2VuZXJpYyBtaW5pc3ltYm9sIG1ldGhvcmQ6IGl0J3MgZmFzdGVyLCBzaW5jZQotICAgaXQgb25seSB0cmFuc2xhdGVzIHRoZSBzeW1ib2xzIG9uY2UsIG5vdCBtdWx0aXBsZSB0aW1lcy4gICovCi0jZGVmaW5lIE1JTklTWU1fVEhSRVNIT0xEICgxMDAwMDAwIC8gc2l6ZW9mIChhc3ltYm9sKSkKLQotLyogUmVhZCBtaW5pc3ltYm9scy4gIEZvciBtaW5pc3ltYm9scywgd2UgdXNlIHRoZSB1bm1vZGlmaWVkIGEub3V0Ci0gICBzeW1ib2xzLiAgVGhlIG1pbmlzeW1ib2xfdG9fc3ltYm9sIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlc2UgaW50bwotICAgQkZEIGFzeW1ib2wgc3RydWN0dXJlcy4gICovCi0KLWxvbmcKLU5BTUUoYW91dCxyZWFkX21pbmlzeW1ib2xzKSAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiAqbWluaXN5bXNwOwotICAgICB1bnNpZ25lZCBpbnQgKnNpemVwOwotewotICBpZiAoZHluYW1pYykKLSAgICB7Ci0gICAgICAvKiBXZSBjb3VsZCBoYW5kbGUgdGhlIGR5bmFtaWMgc3ltYm9scyBoZXJlIGFzIHdlbGwsIGJ1dCBpdCdzCi0gICAgICAgICBlYXNpZXIgdG8gaGFuZCB0aGVtIG9mZi4gICovCi0gICAgICByZXR1cm4gX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgc2l6ZXApOwotICAgIH0KLQotICBpZiAoISBhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCkgPCBNSU5JU1lNX1RIUkVTSE9MRCkKLSAgICByZXR1cm4gX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgc2l6ZXApOwotCi0gICptaW5pc3ltc3AgPSAoUFRSKSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKTsKLQotICAvKiBCeSBwYXNzaW5nIHRoZSBleHRlcm5hbCBzeW1ib2xzIGJhY2sgZnJvbSB0aGlzIHJvdXRpbmUsIHdlIGFyZQotICAgICBnaXZpbmcgdXAgY29udHJvbCBvdmVyIHRoZSBtZW1vcnkgYmxvY2suICBDbGVhcgotICAgICBvYmpfYW91dF9leHRlcm5hbF9zeW1zLCBzbyB0aGF0IHdlIGRvIG5vdCB0cnkgdG8gZnJlZSBpdAotICAgICBvdXJzZWx2ZXMuICAqLwotICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7Ci0KLSAgKnNpemVwID0gRVhURVJOQUxfTkxJU1RfU0laRTsKLSAgcmV0dXJuIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCk7Ci19Ci0KLS8qIENvbnZlcnQgYSBtaW5pc3ltYm9sIHRvIGEgQkZEIGFzeW1ib2wuICBBIG1pbmlzeW1ib2wgaXMganVzdCBhbgotICAgdW5tb2RpZmllZCBhLm91dCBzeW1ib2wuICBUaGUgU1lNIGFyZ3VtZW50IGlzIGEgc3RydWN0dXJlIHJldHVybmVkCi0gICBieSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wsIHdoaWNoIHdlIGZpbGwgaW4gaGVyZS4gICovCi0KLWFzeW1ib2wgKgotTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKSAoYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgY29uc3QgUFRSIG1pbmlzeW07Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgaWYgKGR5bmFtaWMKLSAgICAgIHx8IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCkgPCBNSU5JU1lNX1RIUkVTSE9MRCkKLSAgICByZXR1cm4gX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pOwotCi0gIG1lbXNldCAoc3ltLCAwLCBzaXplb2YgKGFvdXRfc3ltYm9sX3R5cGUpKTsKLQotICAvKiBXZSBjYWxsIHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUgdG8gdHJhbnNsYXRlIGEgc2luZ2xlIHN5bWJvbC4gICovCi0gIGlmICghIChOQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkKLQkgKGFiZmQsCi0JICAoYW91dF9zeW1ib2xfdHlwZSAqKSBzeW0sCi0JICAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIG1pbmlzeW0sCi0JICAoYmZkX3NpemVfdHlwZSkgMSwKLQkgIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpLAotCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5nX3NpemUgKGFiZmQpLAotCSAgZmFsc2UpKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gc3ltOwotfQotCi0vKgotIHByb3ZpZGVkIGEgQkZELCBhIHNlY3Rpb24gYW5kIGFuIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uLCBjYWxjdWxhdGUKLSBhbmQgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUKLSB3YW50ZWQgbG9jYXRpb24uCi0qLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpCi0gICAgIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIC8qIFJ1biBkb3duIHRoZSBmaWxlIGxvb2tpbmcgZm9yIHRoZSBmaWxlbmFtZSwgZnVuY3Rpb24gYW5kIGxpbmVudW1iZXIgKi8KLSAgYXN5bWJvbCAqKnA7Ci0gIENPTlNUIGNoYXIgKmRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLSAgQ09OU1QgY2hhciAqbWFpbl9maWxlX25hbWUgPSBOVUxMOwotICBDT05TVCBjaGFyICpjdXJyZW50X2ZpbGVfbmFtZSA9IE5VTEw7Ci0gIENPTlNUIGNoYXIgKmxpbmVfZmlsZV9uYW1lID0gTlVMTDsgLyogVmFsdWUgb2YgY3VycmVudF9maWxlX25hbWUgYXQgbGluZSBudW1iZXIuICovCi0gIENPTlNUIGNoYXIgKmxpbmVfZGlyZWN0b3J5X25hbWUgPSBOVUxMOyAvKiBWYWx1ZSBvZiBkaXJlY3RvcnlfbmFtZSBhdCBsaW5lIG51bWJlci4gKi8KLSAgYmZkX3ZtYSBsb3dfbGluZV92bWEgPSAwOwotICBiZmRfdm1hIGxvd19mdW5jX3ZtYSA9IDA7Ci0gIGFzeW1ib2wgKmZ1bmMgPSAwOwotICBzaXplX3QgZmlsZWxlbiwgZnVuY2xlbjsKLSAgY2hhciAqYnVmOwotCi0gICpmaWxlbmFtZV9wdHIgPSBhYmZkLT5maWxlbmFtZTsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSAwOwotICAqbGluZV9wdHIgPSAwOwotICBpZiAoc3ltYm9scyAhPSAoYXN5bWJvbCAqKilOVUxMKSB7Ci0gICAgZm9yIChwID0gc3ltYm9sczsgKnA7IHArKykgewotICAgICAgYW91dF9zeW1ib2xfdHlwZSAgKnEgPSAoYW91dF9zeW1ib2xfdHlwZSAqKSgqcCk7Ci0gICAgbmV4dDoKLSAgICAgIHN3aXRjaCAocS0+dHlwZSl7Ci0gICAgICBjYXNlIE5fVEVYVDoKLQkvKiBJZiB0aGlzIGxvb2tzIGxpa2UgYSBmaWxlIG5hbWUgc3ltYm9sLCBhbmQgaXQgY29tZXMgYWZ0ZXIKLSAgICAgICAgICAgdGhlIGxpbmUgbnVtYmVyIHdlIGhhdmUgZm91bmQgc28gZmFyLCBidXQgYmVmb3JlIHRoZQotICAgICAgICAgICBvZmZzZXQsIHRoZW4gd2UgaGF2ZSBwcm9iYWJseSBub3QgZm91bmQgdGhlIHJpZ2h0IGxpbmUKLSAgICAgICAgICAgbnVtYmVyLiAgKi8KLQlpZiAocS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldAotCSAgICAmJiAoKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19saW5lX3ZtYQotCQkgJiYgKGxpbmVfZmlsZV9uYW1lICE9IE5VTEwKLQkJICAgICB8fCAqbGluZV9wdHIgIT0gMCkpCi0JCXx8IChxLT5zeW1ib2wudmFsdWUgPiBsb3dfZnVuY192bWEKLQkJICAgICYmIGZ1bmMgIT0gTlVMTCkpKQotCSAgewotCSAgICBjb25zdCBjaGFyICpzeW1uYW1lOwotCi0JICAgIHN5bW5hbWUgPSBxLT5zeW1ib2wubmFtZTsKLQkgICAgaWYgKHN0cmNtcCAoc3ltbmFtZSArIHN0cmxlbiAoc3ltbmFtZSkgLSAyLCAiLm8iKSA9PSAwKQotCSAgICAgIHsKLQkJaWYgKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19saW5lX3ZtYSkKLQkJICB7Ci0JCSAgICAqbGluZV9wdHIgPSAwOwotCQkgICAgbGluZV9maWxlX25hbWUgPSBOVUxMOwotCQkgIH0KLQkJaWYgKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19mdW5jX3ZtYSkKLQkJICBmdW5jID0gTlVMTDsKLQkgICAgICB9Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgTl9TTzoKLQkvKiBJZiB0aGlzIHN5bWJvbCBpcyBsZXNzIHRoYW4gdGhlIG9mZnNldCwgYnV0IGdyZWF0ZXIgdGhhbgotICAgICAgICAgICB0aGUgbGluZSBudW1iZXIgd2UgaGF2ZSBmb3VuZCBzbyBmYXIsIHRoZW4gd2UgaGF2ZSBub3QKLSAgICAgICAgICAgZm91bmQgdGhlIHJpZ2h0IGxpbmUgbnVtYmVyLiAgKi8KLQlpZiAocS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldCkKLQkgIHsKLQkgICAgaWYgKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19saW5lX3ZtYSkKLQkgICAgICB7Ci0JCSpsaW5lX3B0ciA9IDA7Ci0JCWxpbmVfZmlsZV9uYW1lID0gTlVMTDsKLQkgICAgICB9Ci0JICAgIGlmIChxLT5zeW1ib2wudmFsdWUgPiBsb3dfZnVuY192bWEpCi0JICAgICAgZnVuYyA9IE5VTEw7Ci0JICB9Ci0KLQltYWluX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lID0gcS0+c3ltYm9sLm5hbWU7Ci0JLyogTG9vayBhaGVhZCB0byBuZXh0IHN5bWJvbCB0byBjaGVjayBpZiB0aGF0IHRvbyBpcyBhbiBOX1NPLiAqLwotCXArKzsKLQlpZiAoKnAgPT0gTlVMTCkKLQkgIGJyZWFrOwotCXEgPSAoYW91dF9zeW1ib2xfdHlwZSAqKSgqcCk7Ci0JaWYgKHEtPnR5cGUgIT0gKGludClOX1NPKQotCSAgZ290byBuZXh0OwotCi0JLyogRm91bmQgYSBzZWNvbmQgTl9TTyAgRmlyc3QgaXMgZGlyZWN0b3J5OyBzZWNvbmQgaXMgZmlsZW5hbWUuICovCi0JZGlyZWN0b3J5X25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZTsKLQltYWluX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lID0gcS0+c3ltYm9sLm5hbWU7Ci0JaWYgKG9ial90ZXh0c2VjKGFiZmQpICE9IHNlY3Rpb24pCi0JICBnb3RvIGRvbmU7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE5fU09MOgotCWN1cnJlbnRfZmlsZV9uYW1lID0gcS0+c3ltYm9sLm5hbWU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgTl9TTElORToKLQotICAgICAgY2FzZSBOX0RTTElORToKLSAgICAgIGNhc2UgTl9CU0xJTkU6Ci0JLyogV2UnbGwga2VlcCB0aGlzIGlmIGl0IHJlc29sdmVzIG5lYXJlciB0aGFuIHRoZSBvbmUgd2UgaGF2ZQotICAgICAgICAgICBhbHJlYWR5LiAgKi8KLQlpZiAocS0+c3ltYm9sLnZhbHVlID49IGxvd19saW5lX3ZtYQotCSAgICAmJiBxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KQotCSAgewotCSAgICAqbGluZV9wdHIgPSBxLT5kZXNjOwotCSAgICBsb3dfbGluZV92bWEgPSBxLT5zeW1ib2wudmFsdWU7Ci0JICAgIGxpbmVfZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWU7Ci0JICAgIGxpbmVfZGlyZWN0b3J5X25hbWUgPSBkaXJlY3RvcnlfbmFtZTsKLQkgIH0KLQlicmVhazsKLSAgICAgIGNhc2UgTl9GVU46Ci0JewotCSAgLyogV2UnbGwga2VlcCB0aGlzIGlmIGl0IGlzIG5lYXJlciB0aGFuIHRoZSBvbmUgd2UgaGF2ZSBhbHJlYWR5ICovCi0JICBpZiAocS0+c3ltYm9sLnZhbHVlID49IGxvd19mdW5jX3ZtYSAmJgotCSAgICAgIHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQpIHsKLQkgICAgbG93X2Z1bmNfdm1hID0gcS0+c3ltYm9sLnZhbHVlOwotCSAgICBmdW5jID0gKGFzeW1ib2wgKilxOwotCSAgfQotCSAgZWxzZSBpZiAocS0+c3ltYm9sLnZhbHVlID4gb2Zmc2V0KQotCSAgICBnb3RvIGRvbmU7Ci0JfQotCWJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gZG9uZToKLSAgaWYgKCpsaW5lX3B0ciAhPSAwKQotICAgIHsKLSAgICAgIG1haW5fZmlsZV9uYW1lID0gbGluZV9maWxlX25hbWU7Ci0gICAgICBkaXJlY3RvcnlfbmFtZSA9IGxpbmVfZGlyZWN0b3J5X25hbWU7Ci0gICAgfQotCi0gIGlmIChtYWluX2ZpbGVfbmFtZSA9PSBOVUxMCi0gICAgICB8fCBtYWluX2ZpbGVfbmFtZVswXSA9PSAnLycKLSAgICAgIHx8IGRpcmVjdG9yeV9uYW1lID09IE5VTEwpCi0gICAgZmlsZWxlbiA9IDA7Ci0gIGVsc2UKLSAgICBmaWxlbGVuID0gc3RybGVuIChkaXJlY3RvcnlfbmFtZSkgKyBzdHJsZW4gKG1haW5fZmlsZV9uYW1lKTsKLSAgaWYgKGZ1bmMgPT0gTlVMTCkKLSAgICBmdW5jbGVuID0gMDsKLSAgZWxzZQotICAgIGZ1bmNsZW4gPSBzdHJsZW4gKGJmZF9hc3ltYm9sX25hbWUgKGZ1bmMpKTsKLQotICBpZiAoYWRhdGEgKGFiZmQpLmxpbmVfYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYWRhdGEgKGFiZmQpLmxpbmVfYnVmKTsKLSAgaWYgKGZpbGVsZW4gKyBmdW5jbGVuID09IDApCi0gICAgYWRhdGEgKGFiZmQpLmxpbmVfYnVmID0gYnVmID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1ZiA9IChjaGFyICopIGJmZF9tYWxsb2MgKGZpbGVsZW4gKyBmdW5jbGVuICsgMyk7Ci0gICAgICBhZGF0YSAoYWJmZCkubGluZV9idWYgPSBidWY7Ci0gICAgICBpZiAoYnVmID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAobWFpbl9maWxlX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobWFpbl9maWxlX25hbWVbMF0gPT0gJy8nIHx8IGRpcmVjdG9yeV9uYW1lID09IE5VTEwpCi0JKmZpbGVuYW1lX3B0ciA9IG1haW5fZmlsZV9uYW1lOwotICAgICAgZWxzZQotCXsKLQkgIHNwcmludGYgKGJ1ZiwgIiVzJXMiLCBkaXJlY3RvcnlfbmFtZSwgbWFpbl9maWxlX25hbWUpOwotCSAgKmZpbGVuYW1lX3B0ciA9IGJ1ZjsKLQkgIGJ1ZiArPSBmaWxlbGVuICsgMTsKLQl9Ci0gICAgfQotCi0gIGlmIChmdW5jKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uID0gZnVuYy0+bmFtZTsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIC8qIFRoZSBjYWxsZXIgZXhwZWN0cyBhIHN5bWJvbCBuYW1lLiAgV2UgYWN0dWFsbHkgaGF2ZSBhCi0JIGZ1bmN0aW9uIG5hbWUsIHdpdGhvdXQgdGhlIGxlYWRpbmcgdW5kZXJzY29yZS4gIFB1dCB0aGUKLQkgdW5kZXJzY29yZSBiYWNrIGluLCBzbyB0aGF0IHRoZSBjYWxsZXIgZ2V0cyBhIHN5bWJvbCBuYW1lLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09ICdcMCcpCi0Jc3RyY3B5IChidWYsIGZ1bmN0aW9uKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBidWZbMF0gPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpOwotCSAgc3RyY3B5IChidWYgKyAxLCBmdW5jdGlvbik7Ci0JfQotICAgICAgLyogSGF2ZSB0byByZW1vdmUgOiBzdHVmZiAqLwotICAgICAgcCA9IHN0cmNociAoYnVmLCAnOicpOwotICAgICAgaWYgKHAgIT0gTlVMTCkKLQkqcCA9ICdcMCc7Ci0gICAgICAqZnVuY3Rpb25uYW1lX3B0ciA9IGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qQVJHU1VTRUQqLwotaW50Ci1OQU1FKGFvdXQsc2l6ZW9mX2hlYWRlcnMpIChhYmZkLCBleGVjYWJsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGV4ZWNhYmxlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci19Ci0KLS8qIEZyZWUgYWxsIGluZm9ybWF0aW9uIHdlIGhhdmUgY2FjaGVkIGZvciB0aGlzIEJGRC4gIFdlIGNhbiBhbHdheXMKLSAgIHJlYWQgaXQgYWdhaW4gbGF0ZXIgaWYgd2UgbmVlZCBpdC4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHJldHVybiB0cnVlOwotCi0jZGVmaW5lIEJGQ0lfRlJFRSh4KSBpZiAoeCAhPSBOVUxMKSB7IGZyZWUgKHgpOyB4ID0gTlVMTDsgfQotICBCRkNJX0ZSRUUgKG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpKTsKLSNpZmRlZiBVU0VfTU1BUAotICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IDA7Ci0gIGJmZF9mcmVlX3dpbmRvdyAoJm9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpKTsKLSAgYmZkX2ZyZWVfd2luZG93ICgmb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyAoYWJmZCkpOwotICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSA9IDA7Ci0jZWxzZQotICBCRkNJX0ZSRUUgKG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpKTsKLSAgQkZDSV9GUkVFIChvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSk7Ci0jZW5kaWYKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIEJGQ0lfRlJFRSAoby0+cmVsb2NhdGlvbik7Ci0jdW5kZWYgQkZDSV9GUkVFCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBhLm91dCBsaW5rIGNvZGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19mcmVlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLU5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT53cml0dGVuID0gZmFsc2U7Ci0gICAgICByZXQtPmluZHggPSAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIGFuIGEub3V0IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHJldHVybiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIGFiZmQsIG5ld2Z1bmMpOwotfQotCi0vKiBDcmVhdGUgYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKHJldCwgYWJmZCwKLQkJCQkJIE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogR2l2ZW4gYW4gYS5vdXQgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0dXJuIGFvdXRfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICByZXR1cm4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCShhYmZkLCBpbmZvLCBhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIGEub3V0IG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgYW91dF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19mcmVlX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDaGVjayBhIHNpbmdsZSBhcmNoaXZlIGVsZW1lbnQgdG8gc2VlIGlmIHdlIG5lZWQgdG8gaW5jbHVkZSBpdCBpbgotICAgdGhlIGxpbmsuICAqUE5FRURFRCBpcyBzZXQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhpcyBlbGVtZW50IGlzCi0gICBuZWVkZWQgaW4gdGhlIGxpbmsgb3Igbm90LiAgVGhpcyBpcyBjYWxsZWQgZnJvbQotICAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICBpZiAoISBhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8ICEgKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnJlZSB1cCB0aGUgaW50ZXJuYWwgc3ltYm9scyByZWFkIGZyb20gYW4gYS5vdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfZnJlZV9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSAhPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwpCi0gICAgewotI2lmZGVmIFVTRV9NTUFQCi0gICAgICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSk7Ci0jZWxzZQotICAgICAgZnJlZSAoKFBUUikgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOwotI2VuZGlmCi0gICAgICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTDsKLSAgICB9Ci0gIGlmIChvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSAhPSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSNpZmRlZiBVU0VfTU1BUAotICAgICAgYmZkX2ZyZWVfd2luZG93ICgmb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyAoYWJmZCkpOwotI2Vsc2UKLSAgICAgIGZyZWUgKChQVFIpIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpKTsKLSNlbmRpZgotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSAoY2hhciAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgaW50ZXJuYWwgc3ltYm9scyB0byBzZWUgaWYgdGhpcyBvYmplY3QgZmlsZSBzaG91bGQKLSAgIGJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgV2Ugc2hvdWxkIGluY2x1ZGUgdGhpcyBvYmplY3QgZmlsZSBpZiBpdAotICAgZGVmaW5lcyBhbnkgc3ltYm9scyB3aGljaCBhcmUgY3VycmVudGx5IHVuZGVmaW5lZC4gIElmIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGRlZmluZXMgYSBjb21tb24gc3ltYm9sLCB0aGVuIHdlIG1heSBhZGp1c3QgdGhlIHNpemUgb2YgdGhlCi0gICBrbm93biBzeW1ib2wgYnV0IHdlIGRvIG5vdCBpbmNsdWRlIHRoZSBvYmplY3QgZmlsZSBpbiB0aGUgbGluawotICAgKHVubGVzcyB0aGVyZSBpcyBzb21lIG90aGVyIHJlYXNvbiB0byBpbmNsdWRlIGl0KS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGV4dGVybmFsX25saXN0ICpwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnBlbmQ7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0KLSAgKnBuZWVkZWQgPSBmYWxzZTsKLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzLiAgKi8KLSAgcCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBwZW5kID0gcCArIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCk7Ci0gIHN0cmluZ3MgPSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKTsKLSAgZm9yICg7IHAgPCBwZW5kOyBwKyspCi0gICAgewotICAgICAgaW50IHR5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgcC0+ZV90eXBlKTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogSWdub3JlIHN5bWJvbHMgdGhhdCBhcmUgbm90IGV4dGVybmFsbHkgdmlzaWJsZS4gIFRoaXMgaXMgYW4KLQkgb3B0aW1pemF0aW9uIG9ubHksIGFzIHdlIGNoZWNrIHRoZSB0eXBlIG1vcmUgdGhvcm91Z2hseQotCSBiZWxvdy4gICovCi0gICAgICBpZiAoKCh0eXBlICYgTl9FWFQpID09IDAKLQkgICB8fCAodHlwZSAmIE5fU1RBQikgIT0gMAotCSAgIHx8IHR5cGUgPT0gTl9GTikKLQkgICYmIHR5cGUgIT0gTl9XRUFLQQotCSAgJiYgdHlwZSAhPSBOX1dFQUtUCi0JICAmJiB0eXBlICE9IE5fV0VBS0QKLQkgICYmIHR5cGUgIT0gTl9XRUFLQikKLQl7Ci0JICBpZiAodHlwZSA9PSBOX1dBUk5JTkcKLQkgICAgICB8fCB0eXBlID09IE5fSU5EUikKLQkgICAgKytwOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChhYmZkLCBwLT5lX3N0cngpOwotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgdGhhdCBhcmUgY3VycmVudGx5Ci0JIHVuZGVmaW5lZCBvciBjb21tb24uICAqLwotICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgIHx8IChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikpCi0JewotCSAgaWYgKHR5cGUgPT0gKE5fSU5EUiB8IE5fRVhUKSkKLQkgICAgKytwOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAodHlwZSA9PSAoTl9URVhUIHwgTl9FWFQpCi0JICB8fCB0eXBlID09IChOX0RBVEEgfCBOX0VYVCkKLQkgIHx8IHR5cGUgPT0gKE5fQlNTIHwgTl9FWFQpCi0JICB8fCB0eXBlID09IChOX0FCUyB8IE5fRVhUKQotCSAgfHwgdHlwZSA9PSAoTl9JTkRSIHwgTl9FWFQpKQotCXsKLQkgIC8qIFRoaXMgb2JqZWN0IGZpbGUgZGVmaW5lcyB0aGlzIHN5bWJvbC4gIFdlIG11c3QgbGluayBpdAotCSAgICAgaW4uICBUaGlzIGlzIHRydWUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjdXJyZW50Ci0JICAgICBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIG9yIGNvbW1vbi4gIElmIHRoZQotCSAgICAgY3VycmVudCBkZWZpbml0aW9uIGlzIGNvbW1vbiwgd2UgaGF2ZSBhIGNhc2UgaW4gd2hpY2ggd2UKLQkgICAgIGhhdmUgYWxyZWFkeSBzZWVuIGFuIG9iamVjdCBmaWxlIGluY2x1ZGluZwotCSAgICAgICAgIGludCBhOwotCSAgICAgYW5kIHRoaXMgb2JqZWN0IGZpbGUgZnJvbSB0aGUgYXJjaGl2ZSBpbmNsdWRlcwotCSAgICAgICAgIGludCBhID0gNTsKLQkgICAgIEluIHN1Y2ggYSBjYXNlIHdlIG11c3QgaW5jbHVkZSB0aGlzIG9iamVjdCBmaWxlLgotCi0JICAgICBGSVhNRTogVGhlIFN1bk9TIDQuMS4zIGxpbmtlciB3aWxsIHB1bGwgaW4gdGhlIGFyY2hpdmUKLQkgICAgIGVsZW1lbnQgaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSAuZGF0YSBzZWN0aW9uLAotCSAgICAgYnV0IG5vdCBpZiBpdCBpcyBkZWZpbmVkIGluIHRoZSAudGV4dCBzZWN0aW9uLiAgVGhhdAotCSAgICAgc2VlbXMgYSBiaXQgY3JhenkgdG8gbWUsIGFuZCBJIGhhdmVuJ3QgaW1wbGVtZW50ZWQgaXQuCi0JICAgICBIb3dldmVyLCBpdCBtaWdodCBiZSBjb3JyZWN0LiAgKi8KLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICpwbmVlZGVkID0gdHJ1ZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaWYgKHR5cGUgPT0gKE5fVU5ERiB8IE5fRVhUKSkKLQl7Ci0JICBiZmRfdm1hIHZhbHVlOwotCi0JICB2YWx1ZSA9IEdFVF9XT1JEIChhYmZkLCBwLT5lX3ZhbHVlKTsKLQkgIGlmICh2YWx1ZSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzeW1ib2wgaXMgY29tbW9uIGluIHRoZSBvYmplY3QgZnJvbSB0aGUgYXJjaGl2ZQotCQkgZmlsZS4gICovCi0JICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JCXsKLQkJICBiZmQgKnN5bWJmZDsKLQkJICB1bnNpZ25lZCBpbnQgcG93ZXI7Ci0KLQkJICBzeW1iZmQgPSBoLT51LnVuZGVmLmFiZmQ7Ci0JCSAgaWYgKHN5bWJmZCA9PSAoYmZkICopIE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIGFzIHVuZGVmaW5lZCBmcm9tCi0JCQkgb3V0c2lkZSBCRkQuICBXZSBhc3N1bWUgdGhhdCB3ZSBzaG91bGQgbGluawotCQkJIGluIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgaXMgZG9uZSBmb3IgdGhlIC11Ci0JCQkgb3B0aW9uIGluIHRoZSBsaW5rZXIuICAqLwotCQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sCi0JCQkJCQkJCSAgICAgYWJmZCwKLQkJCQkJCQkJICAgICBuYW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgKnBuZWVkZWQgPSB0cnVlOwotCQkgICAgICByZXR1cm4gdHJ1ZTsKLQkJICAgIH0KLQkJICAvKiBUdXJuIHRoZSBjdXJyZW50IGxpbmsgc3ltYm9sIGludG8gYSBjb21tb24KLQkJICAgICBzeW1ib2wuICBJdCBpcyBhbHJlYWR5IG9uIHRoZSB1bmRlZnMgbGlzdC4gICovCi0JCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfY29tbW9uOwotCQkgIGgtPnUuYy5wID0gKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkgKikKLQkJCSAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJICBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSkpKTsKLQkJICBpZiAoaC0+dS5jLnAgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIGgtPnUuYy5zaXplID0gdmFsdWU7Ci0KLQkJICAvKiBGSVhNRTogVGhpcyBpc24ndCBxdWl0ZSByaWdodC4gIFRoZSBtYXhpbXVtCi0JCSAgICAgYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbCBzaG91bGQgYmUgc2V0IGJ5IHRoZQotCQkgICAgIGFyY2hpdGVjdHVyZSBvZiB0aGUgb3V0cHV0IGZpbGUsIG5vdCBvZiB0aGUgaW5wdXQKLQkJICAgICBmaWxlLiAgKi8KLQkJICBwb3dlciA9IGJmZF9sb2cyICh2YWx1ZSk7Ci0JCSAgaWYgKHBvd2VyID4gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyKQotCQkgICAgcG93ZXIgPSBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0JCSAgaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotCi0JCSAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN5bWJmZCwKLQkJCQkJCQkJIkNPTU1PTiIpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb21tb24gc3ltYm9sIGlmCi0JCSAgICAgbmVjZXNzYXJ5LiAgKi8KLQkJICBpZiAodmFsdWUgPiBoLT51LmMuc2l6ZSkKLQkJICAgIGgtPnUuYy5zaXplID0gdmFsdWU7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHR5cGUgPT0gTl9XRUFLQQotCSAgfHwgdHlwZSA9PSBOX1dFQUtUCi0JICB8fCB0eXBlID09IE5fV0VBS0QKLQkgIHx8IHR5cGUgPT0gTl9XRUFLQikKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBpcyB3ZWFrIGJ1dCBkZWZpbmVkLiAgV2UgbXVzdCBwdWxsIGl0IGluIGlmCi0JICAgICB0aGUgY3VycmVudCBsaW5rIHN5bWJvbCBpcyB1bmRlZmluZWQsIGJ1dCB3ZSBkb24ndCB3YW50Ci0JICAgICBpdCBpZiB0aGUgY3VycmVudCBsaW5rIHN5bWJvbCBpcyBjb21tb24uICAqLwotCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsIG5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgKnBuZWVkZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBXZSBkbyBub3QgbmVlZCB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhbGwgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYm9vbGVhbiAoKmFkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JCQkJICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sCi0JCQkJICAgICBib29sZWFuLAotCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOwotICBiZmRfc2l6ZV90eXBlIHN5bV9jb3VudDsKLSAgY2hhciAqc3RyaW5nczsKLSAgYm9vbGVhbiBjb3B5OwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgcmVnaXN0ZXIgc3RydWN0IGV4dGVybmFsX25saXN0ICpwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnBlbmQ7Ci0KLSAgc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBzeW1fY291bnQgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpOwotICBzdHJpbmdzID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCk7Ci0gIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBjb3B5ID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBjb3B5ID0gdHJ1ZTsKLQotICBpZiAoYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5hZGRfZHluYW1pY19zeW1ib2xzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCgqYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5hZGRfZHluYW1pY19zeW1ib2xzKQotCSAgICAgKGFiZmQsIGluZm8sICZzeW1zLCAmc3ltX2NvdW50LCAmc3RyaW5ncykpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kCi0gICAgIHRvIHBhcnRpY3VsYXIgc3ltYm9scy4gIFdlIGNvdWxkIGp1c3QgbG9vayB0aGVtIHVwIGluIHRoZSBoYXNoCi0gICAgIHRhYmxlLCBidXQga2VlcGluZyB0aGUgbGlzdCBpcyBtb3JlIGVmZmljaWVudC4gIFBlcmhhcHMgdGhpcwotICAgICBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gaW5mby0+a2VlcF9tZW1vcnkuICAqLwotICBzeW1faGFzaCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAoKHNpemVfdCkgc3ltX2NvdW50Ci0JCQkgICogc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpKSk7Ci0gIGlmIChzeW1faGFzaCA9PSBOVUxMICYmIHN5bV9jb3VudCAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCkgPSBzeW1faGFzaDsKLQotICBhZGRfb25lX3N5bWJvbCA9IGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+YWRkX29uZV9zeW1ib2w7Ci0gIGlmIChhZGRfb25lX3N5bWJvbCA9PSBOVUxMKQotICAgIGFkZF9vbmVfc3ltYm9sID0gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w7Ci0KLSAgcCA9IHN5bXM7Ci0gIHBlbmQgPSBwICsgc3ltX2NvdW50OwotICBmb3IgKDsgcCA8IHBlbmQ7IHArKywgc3ltX2hhc2grKykKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLQotICAgICAgKnN5bV9oYXNoID0gTlVMTDsKLQotICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCBwLT5lX3R5cGUpOwotCi0gICAgICAvKiBJZ25vcmUgZGVidWdnaW5nIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCh0eXBlICYgTl9TVEFCKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChhYmZkLCBwLT5lX3N0cngpOwotICAgICAgdmFsdWUgPSBHRVRfV09SRCAoYWJmZCwgcC0+ZV92YWx1ZSk7Ci0gICAgICBmbGFncyA9IEJTRl9HTE9CQUw7Ci0gICAgICBzdHJpbmcgPSBOVUxMOwotICAgICAgc3dpdGNoICh0eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIE5fVU5ERjoKLQljYXNlIE5fQUJTOgotCWNhc2UgTl9URVhUOgotCWNhc2UgTl9EQVRBOgotCWNhc2UgTl9CU1M6Ci0JY2FzZSBOX0ZOX1NFUToKLQljYXNlIE5fQ09NTToKLQljYXNlIE5fU0VUVjoKLQljYXNlIE5fRk46Ci0JICAvKiBJZ25vcmUgc3ltYm9scyB0aGF0IGFyZSBub3QgZXh0ZXJuYWxseSB2aXNpYmxlLiAgKi8KLQkgIGNvbnRpbnVlOwotCWNhc2UgTl9JTkRSOgotCSAgLyogSWdub3JlIGxvY2FsIGluZGlyZWN0IHN5bWJvbC4gICovCi0JICArK3A7Ci0JICArK3N5bV9oYXNoOwotCSAgY29udGludWU7Ci0KLQljYXNlIE5fVU5ERiB8IE5fRVhUOgotCSAgaWYgKHZhbHVlID09IDApCi0JICAgIHsKLQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgICAgICBmbGFncyA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgTl9URVhUIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBicmVhazsKLQljYXNlIE5fREFUQSB8IE5fRVhUOgotCWNhc2UgTl9TRVRWIHwgTl9FWFQ6Ci0JICAvKiBUcmVhdCBOX1NFVFYgc3ltYm9scyBhcyBOX0RBVEEgc3ltYm9sOyBzZWUgY29tbWVudCBpbgotCSAgICAgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncy4gICovCi0JICBzZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBicmVhazsKLQljYXNlIE5fQlNTIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9JTkRSIHwgTl9FWFQ6Ci0JICAvKiBBbiBpbmRpcmVjdCBzeW1ib2wuICBUaGUgbmV4dCBzeW1ib2wgaXMgdGhlIHN5bWJvbAotCSAgICAgd2hpY2ggdGhpcyBvbmUgcmVhbGx5IGlzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKHAgKyAxIDwgcGVuZCk7Ci0JICArK3A7Ci0JICBzdHJpbmcgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGFiZmQsIHAtPmVfc3RyeCk7Ci0JICBzZWN0aW9uID0gYmZkX2luZF9zZWN0aW9uX3B0cjsKLQkgIGZsYWdzIHw9IEJTRl9JTkRJUkVDVDsKLQkgIGJyZWFrOwotCWNhc2UgTl9DT01NIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgTl9TRVRBOiBjYXNlIE5fU0VUQSB8IE5fRVhUOgotCSAgc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBmbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICBicmVhazsKLQljYXNlIE5fU0VUVDogY2FzZSBOX1NFVFQgfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0JICBmbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9TRVREOiBjYXNlIE5fU0VURCB8IE5fRVhUOgotCSAgc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLQkgIGZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1NFVEI6IGNhc2UgTl9TRVRCIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0JICBmbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9XQVJOSU5HOgotCSAgLyogQSB3YXJuaW5nIHN5bWJvbC4gIFRoZSBuZXh0IHN5bWJvbCBpcyB0aGUgb25lIHRvIHdhcm4KLQkgICAgIGFib3V0LiAgKi8KLQkgIEJGRF9BU1NFUlQgKHAgKyAxIDwgcGVuZCk7Ci0JICArK3A7Ci0JICBzdHJpbmcgPSBuYW1lOwotCSAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoYWJmZCwgcC0+ZV9zdHJ4KTsKLQkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZmxhZ3MgfD0gQlNGX1dBUk5JTkc7Ci0JICBicmVhazsKLQljYXNlIE5fV0VBS1U6Ci0JICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGZsYWdzID0gQlNGX1dFQUs7Ci0JICBicmVhazsKLQljYXNlIE5fV0VBS0E6Ci0JICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGZsYWdzID0gQlNGX1dFQUs7Ci0JICBicmVhazsKLQljYXNlIE5fV0VBS1Q6Ci0JICBzZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBmbGFncyA9IEJTRl9XRUFLOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1dFQUtEOgotCSAgc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgIGJyZWFrOwotCWNhc2UgTl9XRUFLQjoKLQkgIHNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCEgKCgqYWRkX29uZV9zeW1ib2wpCi0JICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsIGNvcHksIGZhbHNlLAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgc3ltX2hhc2gpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFJlc3RyaWN0IHRoZSBtYXhpbXVtIGFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wgYmFzZWQgb24KLQkgdGhlIGFyY2hpdGVjdHVyZSwgc2luY2UgYS5vdXQgaGFzIG5vIHdheSB0byByZXByZXNlbnQKLQkgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZiBhIHNlY3Rpb24gaW4gYSAubyBmaWxlLiAgRklYTUU6Ci0JIFRoaXMgaXNuJ3QgcXVpdGUgcmlnaHQ6IGl0IHNob3VsZCB1c2UgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUKLQkgb3V0cHV0IGZpbGUsIG5vdCB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgaWYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICYmICgoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyID4KLQkgICAgICBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXIpKQotCSgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPQotCSAgYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgc2V0IHN5bWJvbCwgYW5kIHdlIGFyZSBub3QgYnVpbGRpbmcgc2V0cywgdGhlbgotCSBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGhhc2ggZW50cnkgdG8gbm90IGhhdmUgYmVlbiBzZXQuICBJbgotCSBzdWNoIGEgY2FzZSwgdHJlYXQgdGhlIHN5bWJvbCBhcyBub3QgZ2xvYmFsbHkgZGVmaW5lZC4gICovCi0gICAgICBpZiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQl7Ci0JICBCRkRfQVNTRVJUICgoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDApOwotCSAgKnN5bV9oYXNoID0gTlVMTDsKLQl9Ci0KLSAgICAgIGlmICh0eXBlID09IChOX0lORFIgfCBOX0VYVCkgfHwgdHlwZSA9PSBOX1dBUk5JTkcpCi0JKytzeW1faGFzaDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBBIGhhc2ggdGFibGUgdXNlZCBmb3IgaGVhZGVyIGZpbGVzIHdpdGggTl9CSU5DTCBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIEEgbGlua2VkIGxpc3Qgb2YgdG90YWxzIHRoYXQgd2UgaGF2ZSBmb3VuZCBmb3IgYSBwYXJ0aWN1bGFyIGhlYWRlcgotICAgZmlsZS4gICovCi0KLXN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzICpuZXh0OwotICBiZmRfdm1hIHRvdGFsOwotfTsKLQotLyogQW4gZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBMaXN0IG9mIHRvdGFscyB3ZSBoYXZlIGZvdW5kIGZvciB0aGlzIGZpbGUuICAqLwotICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscyAqdG90YWxzOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYW91dF9saW5rX2luY2x1ZGVzX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogRHVyaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAgd2UgbmVlZCB0byBwYXNzIGFyb3VuZCBhIGJ1bmNoIG9mCi0gICBpbmZvcm1hdGlvbiwgc28gd2UgZG8gaXQgaW4gYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBiZmQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIFJlbG9jIGZpbGUgcG9zaXRpb25zLiAgKi8KLSAgZmlsZV9wdHIgdHJlbG9mZiwgZHJlbG9mZjsKLSAgLyogRmlsZSBwb3NpdGlvbiBvZiBzeW1ib2xzLiAgKi8KLSAgZmlsZV9wdHIgc3ltb2ZmOwotICAvKiBTdHJpbmcgdGFibGUuICAqLwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJ0YWI7Ci0gIC8qIEhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RhYmxlIGluY2x1ZGVzOwotICAvKiBBIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgY29udGVudHMgb2YgYW55IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSByZWxvY3Mgb2YgYW55IHNlY3Rpb24uICAqLwotICBQVFIgcmVsb2NzOwotICAvKiBBIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgc3ltYm9sIG1hcCBvZiBhbnkgaW5wdXQgQkZELiAgKi8KLSAgaW50ICpzeW1ib2xfbWFwOwotICAvKiBBIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgc3ltYm9scyBvZiBhbnkgaW5wdXQgQkZELiAgKi8KLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvdXRwdXRfc3ltczsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmFvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfaW5wdXRfYmZkCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCkpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX3dyaXRlX3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGJmZCAqaW5wdXRfYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCwKLQkgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgZmlsZV9wdHIgKnJlbG9mZl9wdHIsCi0JICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZSkpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCwKLQkgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqLAotCSAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemUsIGJmZF9ieXRlICpjb250ZW50cykpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0Ci0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCwKLQkgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqLAotCSAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemUsIGJmZF9ieXRlICpjb250ZW50cykpOwotc3RhdGljIElOTElORSBhc2VjdGlvbiAqYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWFvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPnRvdGFscyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gIFRoaXMgaXMgY2FsbGVkIG9uIHRoZSBvdXRwdXQgQkZELiAgVGhlCi0gICBJTkZPIHN0cnVjdHVyZSBzaG91bGQgcG9pbnQgdG8gYSBsaXN0IG9mIEJGRHMgbGlua2VkIHRocm91Z2ggdGhlCi0gICBsaW5rX25leHQgZmllbGQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmluZCBlYWNoIEJGRCB3aGljaCB0YWtlcyBwYXJ0Ci0gICBpbiB0aGUgb3V0cHV0LiAgQWxzbywgZWFjaCBzZWN0aW9uIGluIEFCRkQgc2hvdWxkIHBvaW50IHRvIGEgbGlzdAotICAgb2YgYmZkX2xpbmtfb3JkZXIgc3RydWN0dXJlcyB3aGljaCBsaXN0IGFsbCB0aGUgaW5wdXQgc2VjdGlvbnMgZm9yCi0gICB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsZmluYWxfbGluaykgKGFiZmQsIGluZm8sIGNhbGxiYWNrKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICB2b2lkICgqY2FsbGJhY2spIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci17Ci0gIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyBhb3V0X2luZm87Ci0gIGJvb2xlYW4gaW5jbHVkZXNfaGFzaF9pbml0aWFsaXplZCA9IGZhbHNlOwotICByZWdpc3RlciBiZmQgKnN1YjsKLSAgYmZkX3NpemVfdHlwZSB0cnNpemUsIGRyc2l6ZTsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBzaXplX3QgbWF4X3JlbG9jc19zaXplOwotICBzaXplX3QgbWF4X3N5bV9jb3VudDsKLSAgYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7Ci0gIGZpbGVfcHRyIHRleHRfZW5kOwotICByZWdpc3RlciBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIGFzZWN0aW9uICpvOwotICBib29sZWFuIGhhdmVfbGlua19vcmRlcl9yZWxvY3M7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0gIGFvdXRfaW5mby5pbmZvID0gaW5mbzsKLSAgYW91dF9pbmZvLm91dHB1dF9iZmQgPSBhYmZkOwotICBhb3V0X2luZm8uY29udGVudHMgPSBOVUxMOwotICBhb3V0X2luZm8ucmVsb2NzID0gTlVMTDsKLSAgYW91dF9pbmZvLnN5bWJvbF9tYXAgPSBOVUxMOwotICBhb3V0X2luZm8ub3V0cHV0X3N5bXMgPSBOVUxMOwotCi0gIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAoJmFvdXRfaW5mby5pbmNsdWRlcy5yb290LAotCQkJICAgICAgIGFvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jLAotCQkJICAgICAgIDI1MSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGluY2x1ZGVzX2hhc2hfaW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGxhcmdlc3Qgc2VjdGlvbiBzaXplLiAgQWxzbywgaWYgZ2VuZXJhdGluZwotICAgICByZWxvY2F0ZWFibGUgb3V0cHV0LCBjb3VudCB0aGUgcmVsb2NzLiAgKi8KLSAgdHJzaXplID0gMDsKLSAgZHJzaXplID0gMDsKLSAgbWF4X2NvbnRlbnRzX3NpemUgPSAwOwotICBtYXhfcmVsb2NzX3NpemUgPSAwOwotICBtYXhfc3ltX2NvdW50ID0gMDsKLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgc2l6ZV90IHN6OwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKHN1YikgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0JICAgIHsKLQkgICAgICB0cnNpemUgKz0gZXhlY19oZHIgKHN1YiktPmFfdHJzaXplOwotCSAgICAgIGRyc2l6ZSArPSBleGVjX2hkciAoc3ViKS0+YV9kcnNpemU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBXZSBuZWVkIHRvIGlkZW50aWZ5IHRoZSAudGV4dCBhbmQgLmRhdGEgc2VjdGlvbnMKLQkJIGFuZCBjYWxsIGdldF9yZWxvY191cHBlcl9ib3VuZCBhbmQgY2Fub25pY2FsaXplX3JlbG9jIHRvCi0JCSB3b3JrIG91dCB0aGUgbnVtYmVyIG9mIHJlbG9jcyBuZWVkZWQsIGFuZCB0aGVuIG11bHRpcGx5Ci0JCSBieSB0aGUgcmVsb2Mgc2l6ZS4gICovCi0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogcmVsb2NhdGVhYmxlIGxpbmsgZnJvbSAlcyB0byAlcyBub3Qgc3VwcG9ydGVkIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJIHN1Yi0+eHZlYy0+bmFtZSwgYWJmZC0+eHZlYy0+bmFtZSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoc3ViKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKLQl7Ci0JICBzeiA9IGJmZF9zZWN0aW9uX3NpemUgKHN1Yiwgb2JqX3RleHRzZWMgKHN1YikpOwotCSAgaWYgKHN6ID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JICAgIG1heF9jb250ZW50c19zaXplID0gc3o7Ci0JICBzeiA9IGJmZF9zZWN0aW9uX3NpemUgKHN1Yiwgb2JqX2RhdGFzZWMgKHN1YikpOwotCSAgaWYgKHN6ID4gbWF4X2NvbnRlbnRzX3NpemUpCi0JICAgIG1heF9jb250ZW50c19zaXplID0gc3o7Ci0KLQkgIHN6ID0gZXhlY19oZHIgKHN1YiktPmFfdHJzaXplOwotCSAgaWYgKHN6ID4gbWF4X3JlbG9jc19zaXplKQotCSAgICBtYXhfcmVsb2NzX3NpemUgPSBzejsKLQkgIHN6ID0gZXhlY19oZHIgKHN1YiktPmFfZHJzaXplOwotCSAgaWYgKHN6ID4gbWF4X3JlbG9jc19zaXplKQotCSAgICBtYXhfcmVsb2NzX3NpemUgPSBzejsKLQotCSAgc3ogPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKHN1Yik7Ci0JICBpZiAoc3ogPiBtYXhfc3ltX2NvdW50KQotCSAgICBtYXhfc3ltX2NvdW50ID0gc3o7Ci0JfQotICAgIH0KLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGlmIChvYmpfdGV4dHNlYyAoYWJmZCkgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JdHJzaXplICs9IChfYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzIChvYmpfdGV4dHNlYyAoYWJmZCkKLQkJCQkJCSAtPmxpbmtfb3JkZXJfaGVhZCkKLQkJICAgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwotICAgICAgaWYgKG9ial9kYXRhc2VjIChhYmZkKSAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQlkcnNpemUgKz0gKF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MgKG9ial9kYXRhc2VjIChhYmZkKQotCQkJCQkJIC0+bGlua19vcmRlcl9oZWFkKQotCQkgICAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gICAgfQotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgPSB0cnNpemU7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgPSBkcnNpemU7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLQotICAvKiBBZGp1c3QgdGhlIHNlY3Rpb24gc2l6ZXMgYW5kIHZtYXMgYWNjb3JkaW5nIHRvIHRoZSBtYWdpYyBudW1iZXIuCi0gICAgIFRoaXMgc2V0cyBhX3RleHQsIGFfZGF0YSBhbmQgYV9ic3MgaW4gdGhlIGV4ZWNfaGRyIGFuZCBzZXRzIHRoZQotICAgICBmaWxlcG9zIGZvciBlYWNoIHNlY3Rpb24uICAqLwotICBpZiAoISBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGUgcmVsb2NhdGlvbiBhbmQgc3ltYm9sIGZpbGUgcG9zaXRpb25zIGRpZmZlciBhbW9uZyBhLm91dAotICAgICB0YXJnZXRzLiAgV2UgYXJlIHBhc3NlZCBhIGNhbGxiYWNrIHJvdXRpbmUgZnJvbSB0aGUgYmFja2VuZAotICAgICBzcGVjaWZpYyBjb2RlIHRvIGhhbmRsZSB0aGlzLgotICAgICBGSVhNRTogQXQgdGhpcyBwb2ludCB3ZSBkbyBub3Qga25vdyBob3cgbXVjaCBzcGFjZSB0aGUgc3ltYm9sCi0gICAgIHRhYmxlIHdpbGwgcmVxdWlyZS4gIFRoaXMgd2lsbCBub3Qgd29yayBmb3IgYW55IChub25zdGFuZGFyZCkKLSAgICAgYS5vdXQgdGFyZ2V0IHRoYXQgbmVlZHMgdG8ga25vdyB0aGUgc3ltYm9sIHRhYmxlIHNpemUgYmVmb3JlIGl0Ci0gICAgIGNhbiBjb21wdXRlIHRoZSByZWxvY2F0aW9uIGZpbGUgcG9zaXRpb25zLiAgVGhpcyBtYXkgb3IgbWF5IG5vdAotICAgICBiZSB0aGUgY2FzZSBmb3IgdGhlIGhwMzAwaHB1eCB0YXJnZXQsIGZvciBleGFtcGxlLiAgKi8KLSAgKCpjYWxsYmFjaykgKGFiZmQsICZhb3V0X2luZm8udHJlbG9mZiwgJmFvdXRfaW5mby5kcmVsb2ZmLAotCSAgICAgICAmYW91dF9pbmZvLnN5bW9mZik7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBhb3V0X2luZm8udHJlbG9mZjsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IGFvdXRfaW5mby5kcmVsb2ZmOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gYW91dF9pbmZvLnN5bW9mZjsKLQotICAvKiBXZSBrZWVwIGEgY291bnQgb2YgdGhlIHN5bWJvbHMgYXMgd2Ugb3V0cHV0IHRoZW0uICAqLwotICBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpID0gMDsKLQotICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBzdHJpbmcgdGFibGUgYXMgd2Ugd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLSAgYW91dF9pbmZvLnN0cnRhYiA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChhb3V0X2luZm8uc3RydGFiID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogQWxsb2NhdGUgYnVmZmVycyB0byBob2xkIHNlY3Rpb24gY29udGVudHMgYW5kIHJlbG9jcy4gICovCi0gIGFvdXRfaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGFvdXRfaW5mby5yZWxvY3MgPSAoUFRSKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NzX3NpemUpOwotICBhb3V0X2luZm8uc3ltYm9sX21hcCA9IChpbnQgKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAoaW50ICopKTsKLSAgYW91dF9pbmZvLm91dHB1dF9zeW1zID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKLQkJCSAgIGJmZF9tYWxsb2MgKChtYXhfc3ltX2NvdW50ICsgMSkKLQkJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCkpKTsKLSAgaWYgKChhb3V0X2luZm8uY29udGVudHMgPT0gTlVMTCAmJiBtYXhfY29udGVudHNfc2l6ZSAhPSAwKQotICAgICAgfHwgKGFvdXRfaW5mby5yZWxvY3MgPT0gTlVMTCAmJiBtYXhfcmVsb2NzX3NpemUgIT0gMCkKLSAgICAgIHx8IChhb3V0X2luZm8uc3ltYm9sX21hcCA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkKLSAgICAgIHx8IGFvdXRfaW5mby5vdXRwdXRfc3ltcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHdlIGhhdmUgYSBzeW1ib2wgbmFtZWQgX19EWU5BTUlDLCBmb3JjZSBpdCBvdXQgbm93LiAgVGhpcyBpcwotICAgICByZXF1aXJlZCBieSBTdW5PUy4gIERvaW5nIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiBzdW5vcy5jIGlzIGEKLSAgICAgaGFjaywgYnV0IGl0J3MgZWFzaWVyIHRoYW4gZXhwb3J0aW5nIGV2ZXJ5dGhpbmcgd2hpY2ggd291bGQgYmUKLSAgICAgbmVlZGVkLiAgKi8KLSAgewotICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgIGggPSBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKGFvdXRfaGFzaF90YWJsZSAoaW5mbyksICJfX0RZTkFNSUMiLAotCQkJICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgIGlmIChoICE9IE5VTEwpCi0gICAgICBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLCAmYW91dF9pbmZvKTsKLSAgfQotCi0gIC8qIFRoZSBtb3N0IHRpbWUgZWZmaWNpZW50IHdheSB0byBkbyB0aGUgbGluayB3b3VsZCBiZSB0byByZWFkIGFsbAotICAgICB0aGUgaW5wdXQgb2JqZWN0IGZpbGVzIGludG8gbWVtb3J5IGFuZCB0aGVuIHNvcnQgb3V0IHRoZQotICAgICBpbmZvcm1hdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFVuZm9ydHVuYXRlbHksIHRoYXQgd2lsbAotICAgICBwcm9iYWJseSB1c2UgdG9vIG11Y2ggbWVtb3J5LiAgQW5vdGhlciBtZXRob2Qgd291bGQgYmUgdG8gc3RlcAotICAgICB0aHJvdWdoIGV2ZXJ5dGhpbmcgdGhhdCBjb21wb3NlcyB0aGUgdGV4dCBzZWN0aW9uIGFuZCB3cml0ZSBpdAotICAgICBvdXQsIGFuZCB0aGVuIGV2ZXJ5dGhpbmcgdGhhdCBjb21wb3NlcyB0aGUgZGF0YSBzZWN0aW9uIGFuZCB3cml0ZQotICAgICBpdCBvdXQsIGFuZCB0aGVuIHdyaXRlIG91dCB0aGUgcmVsb2NzLCBhbmQgdGhlbiB3cml0ZSBvdXQgdGhlCi0gICAgIHN5bWJvbHMuICBVbmZvcnR1bmF0ZWx5LCB0aGF0IHJlcXVpcmVzIHJlYWRpbmcgc3R1ZmYgZnJvbSBlYWNoCi0gICAgIGlucHV0IGZpbGUgc2V2ZXJhbCB0aW1lcywgYW5kIHdlIHdpbGwgbm90IGJlIGFibGUgdG8ga2VlcCBhbGwgdGhlCi0gICAgIGlucHV0IGZpbGVzIG9wZW4gc2ltdWx0YW5lb3VzbHksIGFuZCByZW9wZW5pbmcgdGhlbSB3aWxsIGJlIHNsb3cuCi0KLSAgICAgV2hhdCB3ZSBkbyBpcyBiYXNpY2FsbHkgcHJvY2VzcyBvbmUgaW5wdXQgZmlsZSBhdCBhIHRpbWUuICBXZSBkbwotICAgICBldmVyeXRoaW5nIHdlIG5lZWQgdG8gZG8gd2l0aCBhbiBpbnB1dCBmaWxlIG9uY2UtLWNvcHkgb3ZlciB0aGUKLSAgICAgc2VjdGlvbiBjb250ZW50cywgaGFuZGxlIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCBhbmQgd3JpdGUKLSAgICAgb3V0IHRoZSBzeW1ib2xzLS1hbmQgdGhlbiB3ZSB0aHJvdyBhd2F5IHRoZSBpbmZvcm1hdGlvbiB3ZSByZWFkCi0gICAgIGZyb20gaXQuICBUaGlzIGFwcHJvYWNoIHJlcXVpcmVzIGEgbG90IG9mIGxzZWVrcyBvZiB0aGUgb3V0cHV0Ci0gICAgIGZpbGUsIHdoaWNoIGlzIHVuZm9ydHVuYXRlIGJ1dCBzdGlsbCBmYXN0ZXIgdGhhbiByZW9wZW5pbmcgYSBsb3QKLSAgICAgb2YgZmlsZXMuCi0KLSAgICAgV2UgdXNlIHRoZSBvdXRwdXRfaGFzX2JlZ3VuIGZpZWxkIG9mIHRoZSBpbnB1dCBCRkRzIHRvIHNlZQotICAgICB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIGl0LiAgKi8KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gKGJmZCAqKSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLQotICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBUaGlzCi0gICAgIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQgdG8gZG8gdGhpcyBzbyB0aGF0IHdlCi0gICAgIGNhbiBpZGVudGlmeSBhbnkgc2VjdGlvbnMgd2hpY2ggdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QKLSAgICAgaW5jbHVkZS4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5saW5rZXJfbWFyayA9IHRydWU7Ci0JfQotICAgIH0KLQotICBoYXZlX2xpbmtfb3JkZXJfcmVsb2NzID0gZmFsc2U7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKSkKLQkgICAgewotCSAgICAgIGJmZCAqaW5wdXRfYmZkOwotCi0JICAgICAgaW5wdXRfYmZkID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBpZiAoISBpbnB1dF9iZmQtPm91dHB1dF9oYXNfYmVndW4pCi0JCXsKLQkJICBpZiAoISBhb3V0X2xpbmtfaW5wdXRfYmZkICgmYW91dF9pbmZvLCBpbnB1dF9iZmQpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgaW5wdXRfYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICAvKiBUaGVzZSBhcmUgaGFuZGxlZCBiZWxvdy4gICovCi0JICAgICAgaGF2ZV9saW5rX29yZGVyX3JlbG9jcyA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCBhbnkgc3ltYm9scyB0aGF0IHdlIGhhdmUgbm90IGFscmVhZHkgd3JpdHRlbiBvdXQuICAqLwotICBhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSAoYW91dF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wsCi0JCQkgICAoUFRSKSAmYW91dF9pbmZvKTsKLQotICAvKiBOb3cgaGFuZGxlIGFueSByZWxvY3Mgd2Ugd2VyZSBhc2tlZCB0byBjcmVhdGUgYnkgdGhlIGxpbmtlci4KLSAgICAgVGhlc2UgZGlkIG5vdCBjb21lIGZyb20gYW55IGlucHV0IGZpbGUuICBXZSBtdXN0IGRvIHRoZXNlIGFmdGVyCi0gICAgIHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBzeW1ib2xzLCBzbyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbAotICAgICBpbmRpY2VzIHRvIHVzZS4gICovCi0gIGlmIChoYXZlX2xpbmtfb3JkZXJfcmVsb2NzKQotICAgIHsKLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkJewotCQkgIGlmICghIGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyICgmYW91dF9pbmZvLCBvLCBwKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChhb3V0X2luZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChhb3V0X2luZm8uY29udGVudHMpOwotICAgICAgYW91dF9pbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChhb3V0X2luZm8ucmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoYW91dF9pbmZvLnJlbG9jcyk7Ci0gICAgICBhb3V0X2luZm8ucmVsb2NzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChhb3V0X2luZm8uc3ltYm9sX21hcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGFvdXRfaW5mby5zeW1ib2xfbWFwKTsKLSAgICAgIGFvdXRfaW5mby5zeW1ib2xfbWFwID0gTlVMTDsKLSAgICB9Ci0gIGlmIChhb3V0X2luZm8ub3V0cHV0X3N5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChhb3V0X2luZm8ub3V0cHV0X3N5bXMpOwotICAgICAgYW91dF9pbmZvLm91dHB1dF9zeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChpbmNsdWRlc19oYXNoX2luaXRpYWxpemVkKQotICAgIHsKLSAgICAgIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZhb3V0X2luZm8uaW5jbHVkZXMucm9vdCk7Ci0gICAgICBpbmNsdWRlc19oYXNoX2luaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEZpbmlzaCB1cCBhbnkgZHluYW1pYyBsaW5raW5nIHdlIG1heSBiZSBkb2luZy4gICovCi0gIGlmIChhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmZpbmlzaF9keW5hbWljX2xpbmsgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKmFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZmluaXNoX2R5bmFtaWNfbGluaykgKGFiZmQsIGluZm8pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBVcGRhdGUgdGhlIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCi0gIGFiZmQtPnN5bWNvdW50ID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgPSBhYmZkLT5zeW1jb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpICsgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXM7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQotICAgIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQotICAgIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzdHJpbmcgdGFibGUsIHVubGVzcyB0aGVyZSBhcmUgbm8gc3ltYm9scy4gICovCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgISBlbWl0X3N0cmluZ3RhYiAoYWJmZCwgYW91dF9pbmZvLnN0cnRhYikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotICBlbHNlIGlmIChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID09IDAKLQkgICAmJiBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID09IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYjsKLQotICAgICAgYiA9IDA7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zCi0JCSAgICAgKyBleGVjX2hkciAoYWJmZCktPmFfZGF0YQotCQkgICAgIC0gMSksCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3dyaXRlICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhb3V0X2luZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChhb3V0X2luZm8uY29udGVudHMpOwotICBpZiAoYW91dF9pbmZvLnJlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGFvdXRfaW5mby5yZWxvY3MpOwotICBpZiAoYW91dF9pbmZvLnN5bWJvbF9tYXAgIT0gTlVMTCkKLSAgICBmcmVlIChhb3V0X2luZm8uc3ltYm9sX21hcCk7Ci0gIGlmIChhb3V0X2luZm8ub3V0cHV0X3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChhb3V0X2luZm8ub3V0cHV0X3N5bXMpOwotICBpZiAoaW5jbHVkZXNfaGFzaF9pbml0aWFsaXplZCkKLSAgICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYW91dF9pbmZvLmluY2x1ZGVzLnJvb3QpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIExpbmsgYW4gYS5vdXQgaW5wdXQgQkZEIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19pbnB1dF9iZmQgKGZpbmZvLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBiZmRfc2l6ZV90eXBlIHN5bV9jb3VudDsKLQotICBCRkRfQVNTRVJUIChiZmRfZ2V0X2Zvcm1hdCAoaW5wdXRfYmZkKSA9PSBiZmRfb2JqZWN0KTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBvYmplY3QsIGl0IG1heSBuZWVkIHNwZWNpYWwgaGFuZGxpbmcuICAqLwotICBpZiAoKGlucHV0X2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiBhb3V0X2JhY2tlbmRfaW5mbyAoaW5wdXRfYmZkKS0+bGlua19keW5hbWljX29iamVjdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiAoKCphb3V0X2JhY2tlbmRfaW5mbyAoaW5wdXRfYmZkKS0+bGlua19keW5hbWljX29iamVjdCkKLQkgICAgICAoZmluZm8tPmluZm8sIGlucHV0X2JmZCkpOwotICAgIH0KLQotICAvKiBHZXQgdGhlIHN5bWJvbHMuICBXZSBwcm9iYWJseSBoYXZlIHRoZW0gYWxyZWFkeSwgdW5sZXNzCi0gICAgIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZS4gICovCi0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN5bV9jb3VudCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoaW5wdXRfYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHN5bWJvbHMgYW5kIGdldCBhIG1hcCBvZiB0aGUgbmV3IGluZGljZXMuICBUaGUgbWFwCi0gICAgIGlzIHBsYWNlZCBpbnRvIGZpbmZvLT5zeW1ib2xfbWFwLiAgKi8KLSAgaWYgKCEgYW91dF9saW5rX3dyaXRlX3N5bWJvbHMgKGZpbmZvLCBpbnB1dF9iZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWxvY2F0ZSBhbmQgd3JpdGUgb3V0IHRoZSBzZWN0aW9ucy4gIFRoZXNlIGZ1bmN0aW9ucyB1c2UgdGhlCi0gICAgIHN5bWJvbCBtYXAgY3JlYXRlZCBieSBhb3V0X2xpbmtfd3JpdGVfc3ltYm9scy4gIFRoZSBsaW5rZXJfbWFyawotICAgICBmaWVsZCB3aWxsIGJlIHNldCBpZiB0aGVzZSBzZWN0aW9ucyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi0gICAgIGxpbmssIHdoaWNoIHdpbGwgbm9ybWFsbHkgYmUgdGhlIGNhc2UuICAqLwotICBpZiAob2JqX3RleHRzZWMgKGlucHV0X2JmZCktPmxpbmtlcl9tYXJrKQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uIChmaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICAgb2JqX3RleHRzZWMgKGlucHV0X2JmZCksCi0JCQkJICAgICAmZmluZm8tPnRyZWxvZmYsCi0JCQkJICAgICBleGVjX2hkciAoaW5wdXRfYmZkKS0+YV90cnNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChvYmpfZGF0YXNlYyAoaW5wdXRfYmZkKS0+bGlua2VyX21hcmspCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2lucHV0X3NlY3Rpb24gKGZpbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICBvYmpfZGF0YXNlYyAoaW5wdXRfYmZkKSwKLQkJCQkgICAgICZmaW5mby0+ZHJlbG9mZiwKLQkJCQkgICAgIGV4ZWNfaGRyIChpbnB1dF9iZmQpLT5hX2Ryc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbm90IGtlZXBpbmcgbWVtb3J5LCB3ZSBkb24ndCBuZWVkIHRoZSBzeW1ib2xzIGFueQotICAgICBsb25nZXIuICBXZSBzdGlsbCBuZWVkIHRoZW0gaWYgd2UgYXJlIGtlZXBpbmcgbWVtb3J5LCBiZWNhdXNlIHRoZQotICAgICBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIHBvaW50IGludG8gdGhlbS4gICovCi0gIGlmICghIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSkKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfZnJlZV9zeW1ib2xzIChpbnB1dF9iZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhbmQgd3JpdGUgb3V0IHRoZSBzeW1ib2xzIGZvciBhbiBhLm91dCBmaWxlLiAgU2V0IHRoZSBuZXcKLSAgIHN5bWJvbCBpbmRpY2VzIGludG8gYSBzeW1ib2xfbWFwLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua193cml0ZV9zeW1ib2xzIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBiZmRfc2l6ZV90eXBlIHN5bV9jb3VudDsKLSAgY2hhciAqc3RyaW5nczsKLSAgZW51bSBiZmRfbGlua19zdHJpcCBzdHJpcDsKLSAgZW51bSBiZmRfbGlua19kaXNjYXJkIGRpc2NhcmQ7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqb3V0c3ltOwotICBiZmRfc2l6ZV90eXBlIHN0cnRhYl9pbmRleDsKLSAgcmVnaXN0ZXIgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW07Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX2VuZDsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIGludCAqc3ltYm9sX21hcDsKLSAgYm9vbGVhbiBwYXNzOwotICBib29sZWFuIHNraXBfbmV4dDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIHN5bV9jb3VudCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoaW5wdXRfYmZkKTsKLSAgc3RyaW5ncyA9IG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGlucHV0X2JmZCk7Ci0gIHN0cmlwID0gZmluZm8tPmluZm8tPnN0cmlwOwotICBkaXNjYXJkID0gZmluZm8tPmluZm8tPmRpc2NhcmQ7Ci0gIG91dHN5bSA9IGZpbmZvLT5vdXRwdXRfc3ltczsKLQotICAvKiBGaXJzdCB3cml0ZSBvdXQgYSBzeW1ib2wgZm9yIHRoaXMgb2JqZWN0IGZpbGUsIHVubGVzcyB3ZSBhcmUKLSAgICAgZGlzY2FyZGluZyBzdWNoIHN5bWJvbHMuICAqLwotICBpZiAoc3RyaXAgIT0gc3RyaXBfYWxsCi0gICAgICAmJiAoc3RyaXAgIT0gc3RyaXBfc29tZQotCSAgfHwgYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBpbnB1dF9iZmQtPmZpbGVuYW1lLAotCQkJICAgICAgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKQotICAgICAgJiYgZGlzY2FyZCAhPSBkaXNjYXJkX2FsbCkKLSAgICB7Ci0gICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgTl9URVhULCBvdXRzeW0tPmVfdHlwZSk7Ci0gICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgMCwgb3V0c3ltLT5lX290aGVyKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIG91dHN5bS0+ZV9kZXNjKTsKLSAgICAgIHN0cnRhYl9pbmRleCA9IGFkZF90b19zdHJpbmd0YWIgKG91dHB1dF9iZmQsIGZpbmZvLT5zdHJ0YWIsCi0JCQkJICAgICAgIGlucHV0X2JmZC0+ZmlsZW5hbWUsIGZhbHNlKTsKLSAgICAgIGlmIChzdHJ0YWJfaW5kZXggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCBzdHJ0YWJfaW5kZXgsIG91dHN5bS0+ZV9zdHJ4KTsKLSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLAotCQkoYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkgICAgICBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKS0+b3V0cHV0X3NlY3Rpb24pCi0JCSArIG9ial90ZXh0c2VjIChpbnB1dF9iZmQpLT5vdXRwdXRfb2Zmc2V0KSwKLQkJb3V0c3ltLT5lX3ZhbHVlKTsKLSAgICAgICsrb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLSAgICAgICsrb3V0c3ltOwotICAgIH0KLQotICBwYXNzID0gZmFsc2U7Ci0gIHNraXBfbmV4dCA9IGZhbHNlOwotICBzeW0gPSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBzeW1fZW5kID0gc3ltICsgc3ltX2NvdW50OwotICBzeW1faGFzaCA9IG9ial9hb3V0X3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIHN5bWJvbF9tYXAgPSBmaW5mby0+c3ltYm9sX21hcDsKLSAgbWVtc2V0IChzeW1ib2xfbWFwLCAwLCBzeW1fY291bnQgKiBzaXplb2YgKnN5bWJvbF9tYXApOwotICBmb3IgKDsgc3ltIDwgc3ltX2VuZDsgc3ltKyssIHN5bV9oYXNoKyssIHN5bWJvbF9tYXArKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgaW50IHR5cGU7Ci0gICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBib29sZWFuIHNraXA7Ci0gICAgICBhc2VjdGlvbiAqc3ltc2VjOwotICAgICAgYmZkX3ZtYSB2YWwgPSAwOwotICAgICAgYm9vbGVhbiBjb3B5OwotCi0gICAgICAvKiBXZSBzZXQgKnN5bWJvbF9tYXAgdG8gMCBhYm92ZSBmb3IgYWxsIHN5bWJvbHMuICBJZiBpdCBoYXMKLSAgICAgICAgIGFscmVhZHkgYmVlbiBzZXQgdG8gLTEgZm9yIHRoaXMgc3ltYm9sLCBpdCBtZWFucyB0aGF0IHdlIGFyZQotICAgICAgICAgZGlzY2FyZGluZyBpdCBiZWNhdXNlIGl0IGFwcGVhcnMgaW4gYSBkdXBsaWNhdGUgaGVhZGVyIGZpbGUuCi0gICAgICAgICBTZWUgdGhlIE5fQklOQ0wgY29kZSBiZWxvdy4gICovCi0gICAgICBpZiAoKnN5bWJvbF9tYXAgPT0gLTEpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgKnN5bWJvbF9tYXAgdG8gLTEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHN5bWJvbCB3YXMKLSAgICAgICAgIG5vdCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSB3aWxsIGNoYW5nZSBpdCBsYXRlciBpZgotICAgICAgICAgd2UgZG8gY29weSB0aGUgc3ltYm9sIG92ZXIuICAqLwotICAgICAgKnN5bWJvbF9tYXAgPSAtMTsKLQotICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChpbnB1dF9iZmQsIHN5bS0+ZV90eXBlKTsKLSAgICAgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3N0cngpOwotCi0gICAgICBoID0gTlVMTDsKLQotICAgICAgaWYgKHBhc3MpCi0JewotCSAgLyogUGFzcyB0aGlzIHN5bWJvbCB0aHJvdWdoLiAgSXQgaXMgdGhlIHRhcmdldCBvZiBhbgotCSAgICAgaW5kaXJlY3Qgb3Igd2FybmluZyBzeW1ib2wuICAqLwotCSAgdmFsID0gR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKTsKLQkgIHBhc3MgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlIGlmIChza2lwX25leHQpCi0JewotCSAgLyogU2tpcCB0aGlzIHN5bWJvbCwgd2hpY2ggaXMgdGhlIHRhcmdldCBvZiBhbiBpbmRpcmVjdAotCSAgICAgc3ltYm9sIHRoYXQgd2UgaGF2ZSBjaGFuZ2VkIHRvIG5vIGxvbmdlciBiZSBhbiBpbmRpcmVjdAotCSAgICAgc3ltYm9sLiAgKi8KLQkgIHNraXBfbmV4dCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaHJlc29sdmU7Ci0KLQkgIC8qIFdlIGhhdmUgc2F2ZWQgdGhlIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sLCBpZgotCSAgICAgdGhlcmUgaXMgb25lLiAgTm90ZSB0aGF0IHdlIGNvdWxkIGp1c3QgbG9vayBpdCB1cCBhZ2FpbgotCSAgICAgaW4gdGhlIGhhc2ggdGFibGUsIHByb3ZpZGVkIHdlIGZpcnN0IGNoZWNrIHRoYXQgaXQgaXMgYW4KLQkgICAgIGV4dGVybmFsIHN5bWJvbC4gKi8KLQkgIGggPSAqc3ltX2hhc2g7Ci0KLQkgIC8qIFVzZSB0aGUgbmFtZSBmcm9tIHRoZSBoYXNoIHRhYmxlLCBpbiBjYXNlIHRoZSBzeW1ib2wgd2FzCi0gICAgICAgICAgICAgd3JhcHBlZC4gICovCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQotCSAgLyogSWYgdGhpcyBpcyBhbiBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbCwgdGhlbiBjaGFuZ2UKLQkgICAgIGhyZXNvbHZlIHRvIHRoZSBiYXNlIHN5bWJvbC4gIFdlIGFsc28gY2hhbmdlICpzeW1faGFzaCBzbwotCSAgICAgdGhhdCB0aGUgcmVsb2NhdGlvbiByb3V0aW5lcyByZWxvY2F0ZSBhZ2FpbnN0IHRoZSByZWFsCi0JICAgICBzeW1ib2wuICAqLwotCSAgaHJlc29sdmUgPSBoOwotCSAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykpCi0JICAgIHsKLQkgICAgICBocmVzb2x2ZSA9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgICAgICB3aGlsZSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSAgICAgfHwgaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JCWhyZXNvbHZlID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikKLQkJCSAgICBocmVzb2x2ZS0+cm9vdC51LmkubGluayk7Ci0JICAgICAgKnN5bV9oYXNoID0gaHJlc29sdmU7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhlIHN5bWJvbCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gb3V0LCBza2lwIGl0LiAgKi8KLQkgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3dhcm5pbmcKLQkgICAgICAmJiBoLT53cml0dGVuKQotCSAgICB7Ci0JICAgICAgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0lORFIKLQkJICB8fCB0eXBlID09IE5fV0FSTklORykKLQkJc2tpcF9uZXh0ID0gdHJ1ZTsKLQkgICAgICAqc3ltYm9sX21hcCA9IGgtPmluZHg7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogU2VlIGlmIHdlIGFyZSBzdHJpcHBpbmcgdGhpcyBzeW1ib2wuICAqLwotCSAgc2tpcCA9IGZhbHNlOwotCSAgc3dpdGNoIChzdHJpcCkKLQkgICAgewotCSAgICBjYXNlIHN0cmlwX25vbmU6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2Ugc3RyaXBfZGVidWdnZXI6Ci0JICAgICAgaWYgKCh0eXBlICYgTl9TVEFCKSAhPSAwKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBzdHJpcF9zb21lOgotCSAgICAgIGlmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkKLQkJICA9PSBOVUxMKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBzdHJpcF9hbGw6Ci0JICAgICAgc2tpcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChza2lwKQotCSAgICB7Ci0JICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCQloLT53cml0dGVuID0gdHJ1ZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICAqLwotCSAgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX1RFWFQKLQkgICAgICB8fCB0eXBlID09IE5fV0VBS1QpCi0JICAgIHN5bXNlYyA9IG9ial90ZXh0c2VjIChpbnB1dF9iZmQpOwotCSAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fREFUQQotCQkgICB8fCB0eXBlID09IE5fV0VBS0QpCi0JICAgIHN5bXNlYyA9IG9ial9kYXRhc2VjIChpbnB1dF9iZmQpOwotCSAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fQlNTCi0JCSAgIHx8IHR5cGUgPT0gTl9XRUFLQikKLQkgICAgc3ltc2VjID0gb2JqX2Jzc3NlYyAoaW5wdXRfYmZkKTsKLQkgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0FCUwotCQkgICB8fCB0eXBlID09IE5fV0VBS0EpCi0JICAgIHN5bXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmICgoKHR5cGUgJiBOX1RZUEUpID09IE5fSU5EUgotCQkgICAgJiYgKGhyZXNvbHZlID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkJfHwgKGhyZXNvbHZlLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgJiYgaHJlc29sdmUtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJCSAgICAmJiBocmVzb2x2ZS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKSkpCi0JCSAgIHx8IHR5cGUgPT0gTl9XQVJOSU5HKQotCSAgICB7Ci0JICAgICAgLyogUGFzcyB0aGUgbmV4dCBzeW1ib2wgdGhyb3VnaCB1bmNoYW5nZWQuICBUaGUKLQkJIGNvbmRpdGlvbiBhYm92ZSBmb3IgaW5kaXJlY3Qgc3ltYm9scyBpcyBzbyB0aGF0IGlmCi0JCSB0aGUgaW5kaXJlY3Qgc3ltYm9sIHdhcyBkZWZpbmVkLCB3ZSBvdXRwdXQgaXQgd2l0aAotCQkgdGhlIGNvcnJlY3QgZGVmaW5pdGlvbiBzbyB0aGUgZGVidWdnZXIgd2lsbAotCQkgdW5kZXJzdGFuZCBpdC4gICovCi0JICAgICAgcGFzcyA9IHRydWU7Ci0JICAgICAgdmFsID0gR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKTsKLQkgICAgICBzeW1zZWMgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlIGlmICgodHlwZSAmIE5fU1RBQikgIT0gMCkKLQkgICAgewotCSAgICAgIHZhbCA9IEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV92YWx1ZSk7Ci0JICAgICAgc3ltc2VjID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZ2V0IGhlcmUgd2l0aCBhbiBpbmRpcmVjdCBzeW1ib2wsIGl0IG1lYW5zIHRoYXQKLQkJIHdlIGFyZSBvdXRwdXR0aW5nIGl0IHdpdGggYSByZWFsIGRlZmluaXRpb24uICBJbiBzdWNoCi0JCSBhIGNhc2Ugd2UgZG8gbm90IHdhbnQgdG8gb3V0cHV0IHRoZSBuZXh0IHN5bWJvbCwKLQkJIHdoaWNoIGlzIHRoZSB0YXJnZXQgb2YgdGhlIGluZGlyZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fSU5EUikKLQkJc2tpcF9uZXh0ID0gdHJ1ZTsKLQotCSAgICAgIHN5bXNlYyA9IE5VTEw7Ci0KLQkgICAgICAvKiBXZSBuZWVkIHRvIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgaGFzaCB0YWJsZS4gIFdlIHVzZQotCQkgaHJlc29sdmUgc28gdGhhdCBpZiB3ZSBoYXZlIGRlZmluZWQgYW4gaW5kaXJlY3QKLQkJIHN5bWJvbCB3ZSBvdXRwdXQgdGhlIGZpbmFsIGRlZmluaXRpb24uICAqLwotCSAgICAgIGlmIChoID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkJewotCQkgIHN3aXRjaCAodHlwZSAmIE5fVFlQRSkKLQkJICAgIHsKLQkJICAgIGNhc2UgTl9TRVRUOgotCQkgICAgICBzeW1zZWMgPSBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIE5fU0VURDoKLQkJICAgICAgc3ltc2VjID0gb2JqX2RhdGFzZWMgKGlucHV0X2JmZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBOX1NFVEI6Ci0JCSAgICAgIHN5bXNlYyA9IG9ial9ic3NzZWMgKGlucHV0X2JmZCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBOX1NFVEE6Ci0JCSAgICAgIHN5bXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgdmFsID0gMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICAgfHwgaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkJICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLQkJICAvKiBUaGlzIGNhc2UgdXN1YWxseSBtZWFucyBhIGNvbW1vbiBzeW1ib2wgd2hpY2ggd2FzCi0JCSAgICAgdHVybmVkIGludG8gYSBkZWZpbmVkIHN5bWJvbC4gICovCi0JCSAgaW5wdXRfc2VjdGlvbiA9IGhyZXNvbHZlLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgb3V0cHV0X3NlY3Rpb24gPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkJICBCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotCQkJICAgICAgfHwgb3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOwotCQkgIHZhbCA9IChocmVzb2x2ZS0+cm9vdC51LmRlZi52YWx1ZQotCQkJICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pCi0JCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCQkgIC8qIEdldCB0aGUgY29ycmVjdCB0eXBlIGJhc2VkIG9uIHRoZSBzZWN0aW9uLiAgSWYKLQkJICAgICB0aGlzIGlzIGEgY29uc3RydWN0ZWQgc2V0LCBmb3JjZSBpdCB0byBiZQotCQkgICAgIGdsb2JhbGx5IHZpc2libGUuICAqLwotCQkgIGlmICh0eXBlID09IE5fU0VUVAotCQkgICAgICB8fCB0eXBlID09IE5fU0VURAotCQkgICAgICB8fCB0eXBlID09IE5fU0VUQgotCQkgICAgICB8fCB0eXBlID09IE5fU0VUQSkKLQkJICAgIHR5cGUgfD0gTl9FWFQ7Ci0KLQkJICB0eXBlICY9fiBOX1RZUEU7Ci0KLQkJICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX3RleHRzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgdHlwZSB8PSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgPyBOX1RFWFQKLQkJCSAgICAgOiBOX1dFQUtUKTsKLQkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfZGF0YXNlYyAob3V0cHV0X2JmZCkpCi0JCSAgICB0eXBlIHw9IChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICA/IE5fREFUQQotCQkJICAgICA6IE5fV0VBS0QpOwotCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9ic3NzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgdHlwZSB8PSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgPyBOX0JTUwotCQkJICAgICA6IE5fV0VBS0IpOwotCQkgIGVsc2UKLQkJICAgIHR5cGUgfD0gKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgID8gTl9BQlMKLQkJCSAgICAgOiBOX1dFQUtBKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JCXZhbCA9IGhyZXNvbHZlLT5yb290LnUuYy5zaXplOwotCSAgICAgIGVsc2UgaWYgKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCXsKLQkJICB2YWwgPSAwOwotCQkgIHR5cGUgPSBOX1dFQUtVOwotCQl9Ci0JICAgICAgZWxzZQotCQl2YWwgPSAwOwotCSAgICB9Ci0JICBpZiAoc3ltc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICB2YWwgPSAoc3ltc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3ltc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgKEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV92YWx1ZSkKLQkJICAgICAgLSBzeW1zZWMtPnZtYSkpOwotCi0JICAvKiBJZiB0aGlzIGlzIGEgZ2xvYmFsIHN5bWJvbCBzZXQgdGhlIHdyaXR0ZW4gZmxhZywgYW5kIGlmCi0JICAgICBpdCBpcyBhIGxvY2FsIHN5bWJvbCBzZWUgaWYgd2Ugc2hvdWxkIGRpc2NhcmQgaXQuICAqLwotCSAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgaC0+d3JpdHRlbiA9IHRydWU7Ci0JICAgICAgaC0+aW5keCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAob3V0cHV0X2JmZCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVFQKLQkJICAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VURAotCQkgICAmJiAodHlwZSAmIE5fVFlQRSkgIT0gTl9TRVRCCi0JCSAgICYmICh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVEEpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGRpc2NhcmQpCi0JCXsKLQkJY2FzZSBkaXNjYXJkX25vbmU6Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgZGlzY2FyZF9sOgotCQkgIGlmICgodHlwZSAmIE5fU1RBQikgPT0gMAotCQkgICAgICAmJiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoaW5wdXRfYmZkLCBuYW1lKSkKLQkJICAgIHNraXAgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlIGRpc2NhcmRfYWxsOgotCQkgIHNraXAgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaWYgKHNraXApCi0JCXsKLQkJICBwYXNzID0gZmFsc2U7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBBbiBOX0JJTkNMIHN5bWJvbCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBzdGFicwotCSAgICAgZW50cmllcyBmb3IgYSBoZWFkZXIgZmlsZS4gIFdlIG5lZWQgdG8gc2NhbiBhaGVhZCB0byB0aGUKLQkgICAgIG5leHQgTl9FSU5DTCBzeW1ib2wsIGlnbm9yaW5nIG5lc3RpbmcsIGFkZGluZyB1cCBhbGwgdGhlCi0JICAgICBjaGFyYWN0ZXJzIGluIHRoZSBzeW1ib2wgbmFtZXMsIG5vdCBpbmNsdWRpbmcgdGhlIGZpbGUKLQkgICAgIG51bWJlcnMgaW4gdHlwZXMgKHRoZSBmaXJzdCBudW1iZXIgYWZ0ZXIgYW4gb3BlbgotCSAgICAgcGFyZW50aGVzaXMpLiAgKi8KLQkgIGlmICh0eXBlID09IE5fQklOQ0wpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKmluY2xfc3ltOwotCSAgICAgIGludCBuZXN0OwotCSAgICAgIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKmluY2xfZW50cnk7Ci0JICAgICAgc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMgKnQ7Ci0KLQkgICAgICB2YWwgPSAwOwotCSAgICAgIG5lc3QgPSAwOwotCSAgICAgIGZvciAoaW5jbF9zeW0gPSBzeW0gKyAxOyBpbmNsX3N5bSA8IHN5bV9lbmQ7IGluY2xfc3ltKyspCi0JCXsKLQkJICBpbnQgaW5jbF90eXBlOwotCi0JCSAgaW5jbF90eXBlID0gYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgaW5jbF9zeW0tPmVfdHlwZSk7Ci0JCSAgaWYgKGluY2xfdHlwZSA9PSBOX0VJTkNMKQotCQkgICAgewotCQkgICAgICBpZiAobmVzdCA9PSAwKQotCQkJYnJlYWs7Ci0JCSAgICAgIC0tbmVzdDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKLQkJICAgICsrbmVzdDsKLQkJICBlbHNlIGlmIChuZXN0ID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0KLQkJICAgICAgcyA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLCBpbmNsX3N5bS0+ZV9zdHJ4KTsKLQkJICAgICAgZm9yICg7ICpzICE9ICdcMCc7IHMrKykKLQkJCXsKLQkJCSAgdmFsICs9ICpzOwotCQkJICBpZiAoKnMgPT0gJygnKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIFNraXAgdGhlIGZpbGUgbnVtYmVyLiAgKi8KLQkJCSAgICAgICsrczsKLQkJCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCQkJCSsrczsKLQkJCSAgICAgIC0tczsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBhIGhlYWRlciBmaWxlIHdpdGggdGhlCi0gICAgICAgICAgICAgICAgIHNhbWUgdmFsdWUsIHRoZW4gcmVwbGFjZSB0aGlzIG9uZSB3aXRoIGFuIE5fRVhDTAotICAgICAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgICAgIGNvcHkgPSAhIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeTsKLQkgICAgICBpbmNsX2VudHJ5ID0gYW91dF9saW5rX2luY2x1ZGVzX2xvb2t1cCAoJmZpbmZvLT5pbmNsdWRlcywKLQkJCQkJCSAgICAgIG5hbWUsIHRydWUsIGNvcHkpOwotCSAgICAgIGlmIChpbmNsX2VudHJ5ID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBmb3IgKHQgPSBpbmNsX2VudHJ5LT50b3RhbHM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JCWlmICh0LT50b3RhbCA9PSB2YWwpCi0JCSAgYnJlYWs7Ci0JICAgICAgaWYgKHQgPT0gTlVMTCkKLQkJewotCQkgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBzZWVuIHRoaXMgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICBmaWxlIHdpdGggdGhpcyBzZXQgb2Ygc3RhYnMgc3RyaW5ncy4gICovCi0JCSAgdCA9ICgoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMgKikKLQkJICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmZmluZm8tPmluY2x1ZGVzLnJvb3QsCi0JCQkJCSAgc2l6ZW9mICp0KSk7Ci0JCSAgaWYgKHQgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB0LT50b3RhbCA9IHZhbDsKLQkJICB0LT5uZXh0ID0gaW5jbF9lbnRyeS0+dG90YWxzOwotCQkgIGluY2xfZW50cnktPnRvdGFscyA9IHQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnQgKmluY2xfbWFwOwotCi0JCSAgLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSBoZWFkZXIgZmlsZS4gIFdlIG11c3QgY2hhbmdlCi0gICAgICAgICAgICAgICAgICAgICBpdCB0byBiZSBhbiBOX0VYQ0wgZW50cnksIGFuZCBtYXJrIGFsbCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIHN5bWJvbHMgdG8gcHJldmVudCBvdXRwdXR0aW5nIHRoZW0uICAqLwotCQkgIHR5cGUgPSBOX0VYQ0w7Ci0KLQkJICBuZXN0ID0gMDsKLQkJICBmb3IgKGluY2xfc3ltID0gc3ltICsgMSwgaW5jbF9tYXAgPSBzeW1ib2xfbWFwICsgMTsKLQkJICAgICAgIGluY2xfc3ltIDwgc3ltX2VuZDsKLQkJICAgICAgIGluY2xfc3ltKyssIGluY2xfbWFwKyspCi0JCSAgICB7Ci0JCSAgICAgIGludCBpbmNsX3R5cGU7Ci0KLQkJICAgICAgaW5jbF90eXBlID0gYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgaW5jbF9zeW0tPmVfdHlwZSk7Ci0JCSAgICAgIGlmIChpbmNsX3R5cGUgPT0gTl9FSU5DTCkKLQkJCXsKLQkJCSAgaWYgKG5lc3QgPT0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICAqaW5jbF9tYXAgPSAtMTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCSAgLS1uZXN0OwotCQkJfQotCQkgICAgICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKLQkJCSsrbmVzdDsKLQkJICAgICAgZWxzZSBpZiAobmVzdCA9PSAwKQotCQkJKmluY2xfbWFwID0gLTE7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogQ29weSB0aGlzIHN5bWJvbCBpbnRvIHRoZSBsaXN0IG9mIHN5bWJvbHMgd2UgYXJlIGdvaW5nIHRvCi0JIHdyaXRlIG91dC4gICovCi0gICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgdHlwZSwgb3V0c3ltLT5lX3R5cGUpOwotICAgICAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIGJmZF9oX2dldF84IChpbnB1dF9iZmQsIHN5bS0+ZV9vdGhlciksCi0JCSAgIG91dHN5bS0+ZV9vdGhlcik7Ci0gICAgICBiZmRfaF9wdXRfMTYgKG91dHB1dF9iZmQsIGJmZF9oX2dldF8xNiAoaW5wdXRfYmZkLCBzeW0tPmVfZGVzYyksCi0JCSAgICBvdXRzeW0tPmVfZGVzYyk7Ci0gICAgICBjb3B5ID0gZmFsc2U7Ci0gICAgICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCi0JewotCSAgLyogbmFtZSBwb2ludHMgaW50byBhIHN0cmluZyB0YWJsZSB3aGljaCB3ZSBhcmUgZ29pbmcgdG8KLQkgICAgIGZyZWUuICBJZiB0aGVyZSBpcyBhIGhhc2ggdGFibGUgZW50cnksIHVzZSB0aGF0IHN0cmluZy4KLQkgICAgIE90aGVyd2lzZSwgY29weSBuYW1lIGludG8gbWVtb3J5LiAgKi8KLQkgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIGNvcHkgPSB0cnVlOwotCX0KLSAgICAgIHN0cnRhYl9pbmRleCA9IGFkZF90b19zdHJpbmd0YWIgKG91dHB1dF9iZmQsIGZpbmZvLT5zdHJ0YWIsCi0JCQkJICAgICAgIG5hbWUsIGNvcHkpOwotICAgICAgaWYgKHN0cnRhYl9pbmRleCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHN0cnRhYl9pbmRleCwgb3V0c3ltLT5lX3N0cngpOwotICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHZhbCwgb3V0c3ltLT5lX3ZhbHVlKTsKLSAgICAgICpzeW1ib2xfbWFwID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLSAgICAgICsrb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLSAgICAgICsrb3V0c3ltOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIG91dHB1dCBzeW1ib2xzIHdlIGhhdmUganVzdCBjb25zdHJ1Y3RlZC4gICovCi0gIGlmIChvdXRzeW0gPiBmaW5mby0+b3V0cHV0X3N5bXMpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBvdXRzeW1fY291bnQ7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgZmluZm8tPnN5bW9mZiwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgb3V0c3ltX2NvdW50ID0gb3V0c3ltIC0gZmluZm8tPm91dHB1dF9zeW1zOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgZmluZm8tPm91dHB1dF9zeW1zLAotCQkgICAgIChiZmRfc2l6ZV90eXBlKSBFWFRFUk5BTF9OTElTVF9TSVpFLAotCQkgICAgIChiZmRfc2l6ZV90eXBlKSBvdXRzeW1fY291bnQsIG91dHB1dF9iZmQpCi0JICAhPSBvdXRzeW1fY291bnQgKiBFWFRFUk5BTF9OTElTVF9TSVpFKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZpbmZvLT5zeW1vZmYgKz0gb3V0c3ltX2NvdW50ICogRVhURVJOQUxfTkxJU1RfU0laRTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN5bWJvbCB0aGF0IHdhcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIGEub3V0IGlucHV0Ci0gICBvYmplY3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKikgZGF0YTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBpbnQgdHlwZTsKLSAgYmZkX3ZtYSB2YWw7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCBvdXRzeW07Ci0gIGJmZF9zaXplX3R5cGUgaW5keDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0KLSAgaWYgKGFvdXRfYmFja2VuZF9pbmZvIChvdXRwdXRfYmZkKS0+d3JpdGVfZHluYW1pY19zeW1ib2wgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKCphb3V0X2JhY2tlbmRfaW5mbyAob3V0cHV0X2JmZCktPndyaXRlX2R5bmFtaWNfc3ltYm9sKQotCSAgICAgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLCBoKSkpCi0JewotCSAgLyogRklYTUU6IE5vIHdheSB0byBoYW5kbGUgZXJyb3JzLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPndyaXR0ZW4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaC0+d3JpdHRlbiA9IHRydWU7Ci0KLSAgLyogQW4gaW5keCBvZiAtMiBtZWFucyB0aGUgc3ltYm9sIG11c3QgYmUgd3JpdHRlbi4gICovCi0gIGlmIChoLT5pbmR4ICE9IC0yCi0gICAgICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgfHwgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgZmFsc2UsIGZhbHNlKSA9PSBOVUxMKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIC8qIEF2b2lkIHZhcmlhYmxlIG5vdCBpbml0aWFsaXplZCB3YXJuaW5ncy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIGZvciBzZXQgc3ltYm9scyB3aGVuIHNldHMgYXJlIG5vdCBiZWluZwotICAgICAgICAgYnVpbHQuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKLSAgICAgIHZhbCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHsKLQlhc2VjdGlvbiAqc2VjOwotCi0Jc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQlCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLQkJICAgIHx8IHNlYy0+b3duZXIgPT0gb3V0cHV0X2JmZCk7Ci0JaWYgKHNlYyA9PSBvYmpfdGV4dHNlYyAob3V0cHV0X2JmZCkpCi0JICB0eXBlID0gaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCA/IE5fVEVYVCA6IE5fV0VBS1Q7Ci0JZWxzZSBpZiAoc2VjID09IG9ial9kYXRhc2VjIChvdXRwdXRfYmZkKSkKLQkgIHR5cGUgPSBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkID8gTl9EQVRBIDogTl9XRUFLRDsKLQllbHNlIGlmIChzZWMgPT0gb2JqX2Jzc3NlYyAob3V0cHV0X2JmZCkpCi0JICB0eXBlID0gaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCA/IE5fQlNTIDogTl9XRUFLQjsKLQllbHNlCi0JICB0eXBlID0gaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCA/IE5fQUJTIDogTl9XRUFLQTsKLQl0eXBlIHw9IE5fRVhUOwotCXZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JICAgICAgICsgc2VjLT52bWEKLQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKLSAgICAgIHZhbCA9IGgtPnJvb3QudS5jLnNpemU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgdHlwZSA9IE5fV0VBS1U7Ci0gICAgICB2YWwgPSAwOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEZJWE1FOiBJZ25vcmUgdGhlc2UgZm9yIG5vdy4gIFRoZSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoCi0JIHRoZXkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0IGFyZSBub3QgY2xlYXIgdG8gbWUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCB0eXBlLCBvdXRzeW0uZV90eXBlKTsKLSAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIDAsIG91dHN5bS5lX290aGVyKTsKLSAgYmZkX2hfcHV0XzE2IChvdXRwdXRfYmZkLCAwLCBvdXRzeW0uZV9kZXNjKTsKLSAgaW5keCA9IGFkZF90b19zdHJpbmd0YWIgKG91dHB1dF9iZmQsIGZpbmZvLT5zdHJ0YWIsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkgICBmYWxzZSk7Ci0gIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIGhhbmRsZSBlcnJvcnMuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBQVVRfV09SRCAob3V0cHV0X2JmZCwgaW5keCwgb3V0c3ltLmVfc3RyeCk7Ci0gIFBVVF9XT1JEIChvdXRwdXRfYmZkLCB2YWwsIG91dHN5bS5lX3ZhbHVlKTsKLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsIGZpbmZvLT5zeW1vZmYsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICZvdXRzeW0sIChiZmRfc2l6ZV90eXBlKSBFWFRFUk5BTF9OTElTVF9TSVpFLAotCQkgICAgKGJmZF9zaXplX3R5cGUpIDEsIG91dHB1dF9iZmQpICE9IEVYVEVSTkFMX05MSVNUX1NJWkUpCi0gICAgewotICAgICAgLyogRklYTUU6IE5vIHdheSB0byBoYW5kbGUgZXJyb3JzLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBmaW5mby0+c3ltb2ZmICs9IEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0gIGgtPmluZHggPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKG91dHB1dF9iZmQpOwotICArK29ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExpbmsgYW4gYS5vdXQgc2VjdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfaW5wdXRfc2VjdGlvbiAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2ZmX3B0ciwKLQkJCSByZWxfc2l6ZSkKLSAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBmaWxlX3B0ciAqcmVsb2ZmX3B0cjsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLXsKLSAgYmZkX3NpemVfdHlwZSBpbnB1dF9zaXplOwotICBQVFIgcmVsb2NzOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlucHV0X3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIChQVFIpIGZpbmZvLT5jb250ZW50cywKLQkJCQkgIChmaWxlX3B0cikgMCwgaW5wdXRfc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlYWQgaW4gdGhlIHJlbG9jcyBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBpdC4gICovCi0gIGlmIChhb3V0X3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbikgIT0gTlVMTAotICAgICAgJiYgYW91dF9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MgIT0gTlVMTCkKLSAgICByZWxvY3MgPSBhb3V0X3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jczsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jcyA9IGZpbmZvLT5yZWxvY3M7Ci0gICAgICBpZiAocmVsX3NpemUgPiAwKQotCXsKLQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxfc2l6ZSwgaW5wdXRfYmZkKSAhPSByZWxfc2l6ZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogUmVsb2NhdGUgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGlucHV0X2JmZCkgPT0gUkVMT0NfU1REX1NJWkUpCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkIChmaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzLAotCQkJCQkgcmVsX3NpemUsIGZpbmZvLT5jb250ZW50cykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJIChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jcywKLQkJCQkJIHJlbF9zaXplLCBmaW5mby0+Y29udGVudHMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChmaW5mby0+b3V0cHV0X2JmZCwKLQkJCQkgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgKFBUUikgZmluZm8tPmNvbnRlbnRzLAotCQkJCSAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCwKLQkJCQkgIGlucHV0X3NpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZSByZWxvY3Mgd2VyZQotICAgICBtb2RpZmllZCwgYW5kIHdlIG5vdyB3cml0ZSB0aGVtIG91dC4gICovCi0gIGlmIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlICYmIHJlbF9zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGZpbmZvLT5vdXRwdXRfYmZkLCAqcmVsb2ZmX3B0ciwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF93cml0ZSAocmVsb2NzLCAoYmZkX3NpemVfdHlwZSkgMSwgcmVsX3NpemUsIGZpbmZvLT5vdXRwdXRfYmZkKQotCSAgIT0gcmVsX3NpemUpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgKnJlbG9mZl9wdHIgKz0gcmVsX3NpemU7Ci0KLSAgICAgIC8qIEFzc2VydCB0aGF0IHRoZSByZWxvY3MgaGF2ZSBub3QgcnVuIGludG8gdGhlIHN5bWJvbHMsIGFuZAotCSB0aGF0IGlmIHRoZXNlIGFyZSB0aGUgdGV4dCByZWxvY3MgdGhleSBoYXZlIG5vdCBydW4gaW50byB0aGUKLQkgZGF0YSByZWxvY3MuICAqLwotICAgICAgQkZEX0FTU0VSVCAoKnJlbG9mZl9wdHIgPD0gb2JqX3N5bV9maWxlcG9zIChmaW5mby0+b3V0cHV0X2JmZCkKLQkJICAmJiAocmVsb2ZmX3B0ciAhPSAmZmluZm8tPnRyZWxvZmYKLQkJICAgICAgfHwgKCpyZWxvZmZfcHRyCi0JCQkgIDw9IG9ial9kYXRhc2VjIChmaW5mby0+b3V0cHV0X2JmZCktPnJlbF9maWxlcG9zKSkpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBzZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSByZWxvYyBpbmRleC4gICovCi0KLXN0YXRpYyBJTkxJTkUgYXNlY3Rpb24gKgotYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChhYmZkLCBpbmR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBpbmR4OwotewotICBzd2l0Y2ggKGluZHggJiBOX1RZUEUpCi0gICAgewotICAgIGNhc2UgTl9URVhUOgotICAgICAgcmV0dXJuIG9ial90ZXh0c2VjIChhYmZkKTsKLSAgICBjYXNlIE5fREFUQToKLSAgICAgIHJldHVybiBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gICAgY2FzZSBOX0JTUzoKLSAgICAgIHJldHVybiBvYmpfYnNzc2VjIChhYmZkKTsKLSAgICBjYXNlIE5fQUJTOgotICAgIGNhc2UgTl9VTkRGOgotICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIGEub3V0IHNlY3Rpb24gdXNpbmcgc3RhbmRhcmQgYS5vdXQgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2NzLAotCQkJICAgICByZWxfc2l6ZSwgY29udGVudHMpCi0gICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2NzOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci17Ci0gIGJvb2xlYW4gKCpjaGVja19keW5hbWljX3JlbG9jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgIGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLAotCQkJCQkgIFBUUiwgYmZkX2J5dGUgKiwgYm9vbGVhbiAqLAotCQkJCQkgIGJmZF92bWEgKikpOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGludCAqc3ltYm9sX21hcDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19jb3VudDsKLSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsOwotICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxfZW5kOwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgY2hlY2tfZHluYW1pY19yZWxvYyA9IGFvdXRfYmFja2VuZF9pbmZvIChvdXRwdXRfYmZkKS0+Y2hlY2tfZHluYW1pY19yZWxvYzsKLQotICBCRkRfQVNTRVJUIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoaW5wdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSk7Ci0gIEJGRF9BU1NFUlQgKGlucHV0X2JmZC0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlcgotCSAgICAgID09IG91dHB1dF9iZmQtPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIpOwotCi0gIHJlbG9jYXRlYWJsZSA9IGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGU7Ci0gIHN5bXMgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBzdHJpbmdzID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoaW5wdXRfYmZkKTsKLSAgc3ltX2hhc2hlcyA9IG9ial9hb3V0X3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIHN5bWJvbF9tYXAgPSBmaW5mby0+c3ltYm9sX21hcDsKLQotICByZWxvY19jb3VudCA9IHJlbF9zaXplIC8gUkVMT0NfU1REX1NJWkU7Ci0gIHJlbCA9IHJlbG9jczsKLSAgcmVsX2VuZCA9IHJlbCArIHJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSByX2FkZHI7Ci0gICAgICBpbnQgcl9pbmRleDsKLSAgICAgIGludCByX2V4dGVybjsKLSAgICAgIGludCByX3BjcmVsOwotICAgICAgaW50IHJfYmFzZXJlbCA9IDA7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl9hZGRyID0gR0VUX1NXT1JEIChpbnB1dF9iZmQsIHJlbC0+cl9hZGRyZXNzKTsKLQotI2lmZGVmIE1ZX3JlbG9jX2hvd3RvCi0gICAgICBob3d0byA9IE1ZX3JlbG9jX2hvd3RvKGlucHV0X2JmZCwgcmVsLCByX2luZGV4LCByX2V4dGVybiwgcl9wY3JlbCk7Ci0jZWxzZSAgICAgIAotICAgICAgewotCWludCByX2ptcHRhYmxlOwotCWludCByX3JlbGF0aXZlOwotCWludCByX2xlbmd0aDsKLQl1bnNpZ25lZCBpbnQgaG93dG9faWR4OwotCi0JaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkgIHsKLQkgICAgcl9pbmRleCAgID0gICgocmVsLT5yX2luZGV4WzBdIDw8IDE2KQotCQkJICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJCSAgfCByZWwtPnJfaW5kZXhbMl0pOwotCSAgICByX2V4dGVybiAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHKSk7Ci0JICAgIHJfcGNyZWwgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOwotCSAgICByX2Jhc2VyZWwgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRykpOwotCSAgICByX2ptcHRhYmxlPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcpKTsKLQkgICAgcl9yZWxhdGl2ZT0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHKSk7Ci0JICAgIHJfbGVuZ3RoICA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfQklHKQotCQkJID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgcl9pbmRleCAgID0gKChyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCQkgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCQkgfCByZWwtPnJfaW5kZXhbMF0pOwotCSAgICByX2V4dGVybiAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0JICAgIHJfcGNyZWwgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSkpOwotCSAgICByX2Jhc2VyZWwgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0KLQkJCSAgICAgICAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFKSk7Ci0JICAgIHJfam1wdGFibGU9ICgwICE9IChyZWwtPnJfdHlwZVswXQotCQkJICAgICAgICYgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFKSk7Ci0JICAgIHJfcmVsYXRpdmU9ICgwICE9IChyZWwtPnJfdHlwZVswXQotCQkJICAgICAgICYgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFKSk7Ci0JICAgIHJfbGVuZ3RoICA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKQotCQkJID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpOwotCSAgfQotCi0JaG93dG9faWR4ID0gKHJfbGVuZ3RoICsgNCAqIHJfcGNyZWwgKyA4ICogcl9iYXNlcmVsCi0JCSAgICAgKyAxNiAqIHJfam1wdGFibGUgKyAzMiAqIHJfcmVsYXRpdmUpOwotCUJGRF9BU1NFUlQgKGhvd3RvX2lkeCA8IFRBQkxFX1NJWkUgKGhvd3RvX3RhYmxlX3N0ZCkpOwotCWhvd3RvID0gaG93dG9fdGFibGVfc3RkICsgaG93dG9faWR4OwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JewotCSAgLyogV2UgYXJlIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUsIGFuZCBtdXN0Ci0JICAgICBtb2RpZnkgdGhlIHJlbG9jIGFjY29yZGluZ2x5LiAgKi8KLQkgIGlmIChyX2V4dGVybikKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGtub3cgdGhlIHN5bWJvbCB0aGlzIHJlbG9jYXRpb24gaXMgYWdhaW5zdCwKLQkJIGNvbnZlcnQgaXQgaW50byBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBUaGlzCi0JCSBpcyB3aGF0IHRoZSBuYXRpdmUgbGlua2VyIGRvZXMuICAqLwotCSAgICAgIGggPSBzeW1faGFzaGVzW3JfaW5kZXhdOwotCSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQl7Ci0JCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCi0JCSAgLyogQ2hhbmdlIHRoZSByX2V4dGVybiB2YWx1ZS4gICovCi0JCSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JCSAgICByZWwtPnJfdHlwZVswXSAmPX4gUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRzsKLQkJICBlbHNlCi0JCSAgICByZWwtPnJfdHlwZVswXSAmPX4gUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRTsKLQotCQkgIC8qIENvbXB1dGUgYSBuZXcgcl9pbmRleC4gICovCi0JCSAgb3V0cHV0X3NlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCQkgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfdGV4dHNlYyAob3V0cHV0X2JmZCkpCi0JCSAgICByX2luZGV4ID0gTl9URVhUOwotCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9kYXRhc2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX0RBVEE7Ci0JCSAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2Jzc3NlYyAob3V0cHV0X2JmZCkpCi0JCSAgICByX2luZGV4ID0gTl9CU1M7Ci0JCSAgZWxzZQotCQkgICAgcl9pbmRleCA9IE5fQUJTOwotCi0JCSAgLyogQWRkIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHRoZSBzZWN0aW9uIFZNQSB0byB0aGUKLQkJICAgICBhZGRlbmQgc3RvcmVkIGluIHRoZSBjb250ZW50cy4gICovCi0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBvdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2UgbXVzdCBjaGFuZ2Ugcl9pbmRleCBhY2NvcmRpbmcgdG8gdGhlIHN5bWJvbAotCQkgICAgIG1hcC4gICovCi0JCSAgcl9pbmRleCA9IHN5bWJvbF9tYXBbcl9pbmRleF07Ci0KLQkJICBpZiAocl9pbmRleCA9PSAtMSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGggIT0gTlVMTCkKLQkJCXsKLQkJCSAgLyogV2UgZGVjaWRlZCB0byBzdHJpcCB0aGlzIHN5bWJvbCwgYnV0IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5zIG91dCB0aGF0IHdlIGNhbid0LiAgTm90ZSB0aGF0IHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc2UgdGhlIG90aGVyIGFuZCBkZXNjIGluZm9ybWF0aW9uIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgZG9uJ3QgdGhpbmsgdGhhdCB3aWxsIGV2ZXIgbWF0dGVyIGZvciBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wuICAqLwotCQkJICBpZiAoaC0+aW5keCA8IDApCi0JCQkgICAgewotCQkJICAgICAgaC0+aW5keCA9IC0yOwotCQkJICAgICAgaC0+d3JpdHRlbiA9IGZhbHNlOwotCQkJICAgICAgaWYgKCEgYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCAoaCwKLQkJCQkJCQkJICAoUFRSKSBmaW5mbykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJICAgIH0KLQkJCSAgcl9pbmRleCA9IGgtPmluZHg7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkJICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKLQkJCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCQkgKGZpbmZvLT5pbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICByX2FkZHIpKSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIHJfaW5kZXggPSAwOwotCQkJfQotCQkgICAgfQotCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQotCSAgICAgIC8qIFdyaXRlIG91dCB0aGUgbmV3IHJfaW5kZXggdmFsdWUuICAqLwotCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQotCQl7Ci0JCSAgcmVsLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLQkJICByZWwtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JCSAgcmVsLT5yX2luZGV4WzJdID0gcl9pbmRleDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHJlbC0+cl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0JCSAgcmVsLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCQkgIHJlbC0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFdlIG11c3QKLQkJIGFkanVzdCBieSB0aGUgYW1vdW50IHRoYXQgdGhlIHNlY3Rpb24gbW92ZWQuICAqLwotCSAgICAgIHNlY3Rpb24gPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7Ci0JICAgICAgcmVsb2NhdGlvbiA9IChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgLSBzZWN0aW9uLT52bWEpOwotCSAgICB9Ci0KLQkgIC8qIENoYW5nZSB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbi4gICovCi0JICBQVVRfV09SRCAob3V0cHV0X2JmZCwKLQkJICAgIHJfYWRkciArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQsCi0JCSAgICByZWwtPnJfYWRkcmVzcyk7Ci0KLQkgIC8qIEFkanVzdCBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gYnkgcmVtb3ZpbmcgdGhlIHJlZmVyZW5jZQotCSAgICAgdG8gdGhlIG9yaWdpbmFsIGFkZHJlc3MgaW4gdGhlIHNlY3Rpb24gYW5kIGluY2x1ZGluZyB0aGUKLQkgICAgIHJlZmVyZW5jZSB0byB0aGUgbmV3IGFkZHJlc3MuICAqLwotCSAgaWYgKHJfcGNyZWwpCi0JICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0jaWZkZWYgTVlfcmVsb2NhdGFibGVfcmVsb2MKLQkgIE1ZX3JlbG9jYXRhYmxlX3JlbG9jIChob3d0bywgb3V0cHV0X2JmZCwgcmVsLCByZWxvY2F0aW9uLCByX2FkZHIpOwotI2VuZGlmCi0KLQkgIGlmIChyZWxvY2F0aW9uID09IDApCi0JICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JICBlbHNlCi0JICAgIHIgPSBNWV9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCi0JCQkJCWlucHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkJY29udGVudHMgKyByX2FkZHIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBib29sZWFuIGh1bmRlZjsKLQotCSAgLyogV2UgYXJlIGdlbmVyYXRpbmcgYW4gZXhlY3V0YWJsZSwgYW5kIG11c3QgZG8gYSBmdWxsCi0JICAgICByZWxvY2F0aW9uLiAgKi8KLQkgIGh1bmRlZiA9IGZhbHNlOwotCi0JICBpZiAocl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX2luZGV4XTsKLQotCSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQlyZWxvY2F0aW9uID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBodW5kZWYgPSB0cnVlOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0JICAgICAgc2VjdGlvbiA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQkgICAgICByZWxvY2F0aW9uID0gKHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHNlY3Rpb24tPnZtYSk7Ci0JICAgICAgaWYgKHJfcGNyZWwpCi0JCXJlbG9jYXRpb24gKz0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCSAgICB9Ci0KLQkgIGlmIChjaGVja19keW5hbWljX3JlbG9jICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBib29sZWFuIHNraXA7Ci0KLQkgICAgICBpZiAoISAoKCpjaGVja19keW5hbWljX3JlbG9jKQotCQkgICAgIChmaW5mby0+aW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBoLAotCQkgICAgICAoUFRSKSByZWwsIGNvbnRlbnRzLCAmc2tpcCwgJnJlbG9jYXRpb24pKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChza2lwKQotCQljb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBOb3cgd2FybiBpZiBhIGdsb2JhbCBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgV2UgY291bGQgbm90Ci0gICAgICAgICAgICAgZG8gdGhpcyBlYXJsaWVyLCBiZWNhdXNlIGNoZWNrX2R5bmFtaWNfcmVsb2MgbWlnaHQgd2FudAotICAgICAgICAgICAgIHRvIHNraXAgdGhpcyByZWxvYy4gICovCi0JICBpZiAoaHVuZGVmICYmICEgZmluZm8tPmluZm8tPnNoYXJlZCAmJiAhIHJfYmFzZXJlbCkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQluYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgICBlbHNlCi0JCW5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCSAgICAgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGZpbmZvLT5pbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJfYWRkcikpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgciA9IE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLAotCQkJCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBjb250ZW50cywgcl9hZGRyLCByZWxvY2F0aW9uLAotCQkJCSAgICAgIChiZmRfdm1hKSAwKTsKLQl9Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UgaWYgKHJfZXh0ZXJuKQotCQkgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwKLQkJCQkJICAgICBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBhc2VjdGlvbiAqczsKLQotCQkgICAgcyA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQkJICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHMpOwotCQkgIH0KLQkJaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoZmluZm8tPmluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLAotCQkJKGJmZF92bWEpIDAsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcl9hZGRyKSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIGEub3V0IHNlY3Rpb24gdXNpbmcgZXh0ZW5kZWQgYS5vdXQgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2NzLAotCQkJICAgICByZWxfc2l6ZSwgY29udGVudHMpCi0gICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcmVsb2NzOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci17Ci0gIGJvb2xlYW4gKCpjaGVja19keW5hbWljX3JlbG9jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgIGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLAotCQkJCQkgIFBUUiwgYmZkX2J5dGUgKiwgYm9vbGVhbiAqLAotCQkJCQkgIGJmZF92bWEgKikpOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGludCAqc3ltYm9sX21hcDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19jb3VudDsKLSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcmVsOwotICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpyZWxfZW5kOwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgY2hlY2tfZHluYW1pY19yZWxvYyA9IGFvdXRfYmFja2VuZF9pbmZvIChvdXRwdXRfYmZkKS0+Y2hlY2tfZHluYW1pY19yZWxvYzsKLQotICBCRkRfQVNTRVJUIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoaW5wdXRfYmZkKSA9PSBSRUxPQ19FWFRfU0laRSk7Ci0gIEJGRF9BU1NFUlQgKGlucHV0X2JmZC0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlcgotCSAgICAgID09IG91dHB1dF9iZmQtPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIpOwotCi0gIHJlbG9jYXRlYWJsZSA9IGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGU7Ci0gIHN5bXMgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBzdHJpbmdzID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoaW5wdXRfYmZkKTsKLSAgc3ltX2hhc2hlcyA9IG9ial9hb3V0X3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIHN5bWJvbF9tYXAgPSBmaW5mby0+c3ltYm9sX21hcDsKLQotICByZWxvY19jb3VudCA9IHJlbF9zaXplIC8gUkVMT0NfRVhUX1NJWkU7Ci0gIHJlbCA9IHJlbG9jczsKLSAgcmVsX2VuZCA9IHJlbCArIHJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSByX2FkZHI7Ci0gICAgICBpbnQgcl9pbmRleDsKLSAgICAgIGludCByX2V4dGVybjsKLSAgICAgIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gICAgICBiZmRfdm1hIHJfYWRkZW5kOwotICAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSAgICAgIGFzZWN0aW9uICpyX3NlY3Rpb24gPSBOVUxMOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gICAgICByX2FkZHIgPSBHRVRfU1dPUkQgKGlucHV0X2JmZCwgcmVsLT5yX2FkZHJlc3MpOwotCi0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCXsKLQkgIHJfaW5kZXggID0gKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCSAgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgICB8IHJlbC0+cl9pbmRleFsyXSk7Ci0JICByX2V4dGVybiA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcpKTsKLQkgIHJfdHlwZSAgID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfQklHKQotCQkgICAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJfaW5kZXggID0gKChyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCSAgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgICB8IHJlbC0+cl9pbmRleFswXSk7Ci0JICByX2V4dGVybiA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLQkgIHJfdHlwZSAgID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFKQotCQkgICAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0JfQotCi0gICAgICByX2FkZGVuZCA9IEdFVF9TV09SRCAoaW5wdXRfYmZkLCByZWwtPnJfYWRkZW5kKTsKLQotICAgICAgQkZEX0FTU0VSVCAocl90eXBlIDwgVEFCTEVfU0laRSAoaG93dG9fdGFibGVfZXh0KSk7Ci0KLSAgICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JewotCSAgLyogV2UgYXJlIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUsIGFuZCBtdXN0Ci0JICAgICBtb2RpZnkgdGhlIHJlbG9jIGFjY29yZGluZ2x5LiAgKi8KLQkgIGlmIChyX2V4dGVybgotCSAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCi0JICAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UyMikKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGtub3cgdGhlIHN5bWJvbCB0aGlzIHJlbG9jYXRpb24gaXMgYWdhaW5zdCwKLQkJIGNvbnZlcnQgaXQgaW50byBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBUaGlzCi0JCSBpcyB3aGF0IHRoZSBuYXRpdmUgbGlua2VyIGRvZXMuICAqLwotCSAgICAgIGlmIChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0JCSAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCQkgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCi0JCWggPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0JICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JCXsKLQkJICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLQkJICAvKiBDaGFuZ2UgdGhlIHJfZXh0ZXJuIHZhbHVlLiAgKi8KLQkJICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJICAgIHJlbC0+cl90eXBlWzBdICY9fiBSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHOwotCQkgIGVsc2UKLQkJICAgIHJlbC0+cl90eXBlWzBdICY9fiBSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFOwotCi0JCSAgLyogQ29tcHV0ZSBhIG5ldyByX2luZGV4LiAgKi8KLQkJICBvdXRwdXRfc2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JCSAgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial90ZXh0c2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX1RFWFQ7Ci0JCSAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2RhdGFzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgcl9pbmRleCA9IE5fREFUQTsKLQkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX0JTUzsKLQkJICBlbHNlCi0JCSAgICByX2luZGV4ID0gTl9BQlM7Ci0KLQkJICAvKiBBZGQgdGhlIHN5bWJvbCB2YWx1ZSBhbmQgdGhlIHNlY3Rpb24gVk1BIHRvIHRoZQotCQkgICAgIGFkZGVuZC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBvdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JCSAgLyogTm93IFJFTE9DQVRJT04gaXMgdGhlIFZNQSBvZiB0aGUgZmluYWwKLQkJICAgICBkZXN0aW5hdGlvbi4gIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywKLQkJICAgICB0aGVuIEFEREVORCBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIHNvdXJjZSBWTUEuCi0JCSAgICAgV2Ugd2FudCB0byBzZXQgQURERU5EIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLQkJICAgICB0aGUgZGVzdGluYXRpb24gVk1BIGFuZCB0aGUgc291cmNlIFZNQSwgd2hpY2gKLQkJICAgICBtZWFucyB3ZSBtdXN0IGFkanVzdCBSRUxPQ0FUSU9OIGJ5IHRoZSBjaGFuZ2UgaW4KLQkJICAgICB0aGUgc291cmNlIFZNQS4gIFRoaXMgaXMgZG9uZSBiZWxvdy4gICovCi0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBXZSBtdXN0IGNoYW5nZSByX2luZGV4IGFjY29yZGluZyB0byB0aGUgc3ltYm9sCi0JCSAgICAgbWFwLiAgKi8KLQkJICByX2luZGV4ID0gc3ltYm9sX21hcFtyX2luZGV4XTsKLQotCQkgIGlmIChyX2luZGV4ID09IC0xKQotCQkgICAgewotCQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQkJewotCQkJICAvKiBXZSBkZWNpZGVkIHRvIHN0cmlwIHRoaXMgc3ltYm9sLCBidXQgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybnMgb3V0IHRoYXQgd2UgY2FuJ3QuICBOb3RlIHRoYXQgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zZSB0aGUgb3RoZXIgYW5kIGRlc2MgaW5mb3JtYXRpb24gaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBkb24ndCB0aGluayB0aGF0IHdpbGwgZXZlciBtYXR0ZXIgZm9yIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbC4gICovCi0JCQkgIGlmIChoLT5pbmR4IDwgMCkKLQkJCSAgICB7Ci0JCQkgICAgICBoLT5pbmR4ID0gLTI7Ci0JCQkgICAgICBoLT53cml0dGVuID0gZmFsc2U7Ci0JCQkgICAgICBpZiAoISBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLAotCQkJCQkJCQkgIChQVFIpIGZpbmZvKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkgICAgfQotCQkJICByX2luZGV4ID0gaC0+aW5keDsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCQkgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCQkJICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkJCSAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIHJfYWRkcikpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgcl9pbmRleCA9IDA7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICByZWxvY2F0aW9uID0gMDsKLQotCQkgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgdGhlbiB0aGUgYWRkZW5kCi0JCSAgICAgaXMgdGhlIG5lZ2F0aXZlIG9mIHRoZSBzb3VyY2UgVk1BLiAgV2UgbXVzdAotCQkgICAgIGFkanVzdCBpdCBieSB0aGUgY2hhbmdlIGluIHRoZSBzb3VyY2UgVk1BLiAgVGhpcwotCQkgICAgIGlzIGRvbmUgYmVsb3cuICAqLwotCQl9Ci0KLQkgICAgICAvKiBXcml0ZSBvdXQgdGhlIG5ldyByX2luZGV4IHZhbHVlLiAgKi8KLQkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJewotCQkgIHJlbC0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0JCSAgcmVsLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCQkgIHJlbC0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWwtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotCQkgIHJlbC0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkJICByZWwtPnJfaW5kZXhbMF0gPSByX2luZGV4OwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgV2UgbXVzdAotCQkgYWRqdXN0IGJ5IHRoZSBhbW91bnQgdGhhdCB0aGUgc2VjdGlvbiBtb3ZlZC4gICovCi0JICAgICAgcl9zZWN0aW9uID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOwotCSAgICAgIHJlbG9jYXRpb24gPSAocl9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyByX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHJfc2VjdGlvbi0+dm1hKTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgdGhlbiB0aGUgYWRkZW5kIGlzCi0JCSB0aGUgZGlmZmVyZW5jZSBpbiBWTUEgYmV0d2VlbiB0aGUgZGVzdGluYXRpb24gYW5kIHRoZQotCQkgc291cmNlLiAgV2UgaGF2ZSBqdXN0IGFkanVzdGVkIGZvciB0aGUgY2hhbmdlIGluIFZNQQotCQkgb2YgdGhlIGRlc3RpbmF0aW9uLCBzbyB3ZSBtdXN0IGFsc28gYWRqdXN0IGJ5IHRoZQotCQkgY2hhbmdlIGluIFZNQSBvZiB0aGUgc291cmNlLiAgVGhpcyBpcyBkb25lIGJlbG93LiAgKi8KLQkgICAgfQotCi0JICAvKiBBcyBkZXNjcmliZWQgYWJvdmUsIHdlIG11c3QgYWx3YXlzIGFkanVzdCBhIFBDIHJlbGF0aXZlCi0JICAgICByZWxvYyBieSB0aGUgY2hhbmdlIGluIFZNQSBvZiB0aGUgc291cmNlLiAgSG93ZXZlciwgaWYKLQkgICAgIHBjcmVsX29mZnNldCBpcyBzZXQsIHRoZW4gdGhlIGFkZGVuZCBkb2VzIG5vdCBpbmNsdWRlIHRoZQotCSAgICAgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0IG5lZWQKLQkgICAgIHRvIGFkanVzdCBhbnl0aGluZy4gICovCi0JICBpZiAoaG93dG9fdGFibGVfZXh0W3JfdHlwZV0ucGNfcmVsYXRpdmUKLQkgICAgICAmJiAhIGhvd3RvX3RhYmxlX2V4dFtyX3R5cGVdLnBjcmVsX29mZnNldCkKLQkgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkgIC8qIENoYW5nZSB0aGUgYWRkZW5kIGlmIG5lY2Vzc2FyeS4gICovCi0JICBpZiAocmVsb2NhdGlvbiAhPSAwKQotCSAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgcl9hZGRlbmQgKyByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLQotCSAgLyogQ2hhbmdlIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uLiAgKi8KLQkgIFBVVF9XT1JEIChvdXRwdXRfYmZkLAotCQkgICAgcl9hZGRyICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHJlbC0+cl9hZGRyZXNzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYm9vbGVhbiBodW5kZWY7Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotCSAgLyogV2UgYXJlIGdlbmVyYXRpbmcgYW4gZXhlY3V0YWJsZSwgYW5kIG11c3QgZG8gYSBmdWxsCi0JICAgICByZWxvY2F0aW9uLiAgKi8KLQkgIGh1bmRlZiA9IGZhbHNlOwotCi0JICBpZiAocl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX2luZGV4XTsKLQotCSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQlyZWxvY2F0aW9uID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBodW5kZWYgPSB0cnVlOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkJICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCQkgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW07Ci0JICAgICAgaW50IHR5cGU7Ci0KLQkgICAgICAvKiBGb3IgYmFzZSByZWxhdGl2ZSByZWxvY3MsIHJfaW5kZXggaXMgYWx3YXlzIGFuIGluZGV4Ci0gICAgICAgICAgICAgICAgIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgZXZlbiBpZiByX2V4dGVybiBpcyAwLiAgKi8KLQkgICAgICBzeW0gPSBzeW1zICsgcl9pbmRleDsKLQkgICAgICB0eXBlID0gYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgc3ltLT5lX3R5cGUpOwotCSAgICAgIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9URVhUCi0JCSAgfHwgdHlwZSA9PSBOX1dFQUtUKQotCQlyX3NlY3Rpb24gPSBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKTsKLQkgICAgICBlbHNlIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9EQVRBCi0JCSAgICAgICB8fCB0eXBlID09IE5fV0VBS0QpCi0JCXJfc2VjdGlvbiA9IG9ial9kYXRhc2VjIChpbnB1dF9iZmQpOwotCSAgICAgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0JTUwotCQkgICAgICAgfHwgdHlwZSA9PSBOX1dFQUtCKQotCQlyX3NlY3Rpb24gPSBvYmpfYnNzc2VjIChpbnB1dF9iZmQpOwotCSAgICAgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0FCUwotCQkgICAgICAgfHwgdHlwZSA9PSBOX1dFQUtBKQotCQlyX3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIGVsc2UKLQkJYWJvcnQgKCk7Ci0JICAgICAgcmVsb2NhdGlvbiA9IChyX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHJfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICsgKEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV92YWx1ZSkKLQkJCSAgICAgICAtIHJfc2VjdGlvbi0+dm1hKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJfc2VjdGlvbiA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgdGhlbiBSX0FEREVORCBpcyB0aGUKLQkJIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHZtYXMsIG9yCi0JCSAgIG9sZF9kZXN0X3NlYyArIG9sZF9kZXN0X29mZiAtIChvbGRfc3JjX3NlYyArIG9sZF9zcmNfb2ZmKQotCQkgd2hlcmUKLQkJICAgb2xkX2Rlc3Rfc2VjID09IHNlY3Rpb24tPnZtYQotCQkgYW5kCi0JCSAgIG9sZF9zcmNfc2VjID09IGlucHV0X3NlY3Rpb24tPnZtYQotCQkgYW5kCi0JCSAgIG9sZF9zcmNfb2ZmID09IHJfYWRkcgotCi0JCSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgZXhwZWN0cyBSRUxPQ0FUSU9OICsKLQkJIFJfQURERU5EIHRvIGJlIHRoZSBWTUEgb2YgdGhlIGRlc3RpbmF0aW9uIG1pbnVzCi0JCSByX2FkZHIgKHRoZSBtaW51cyByX2FkZHIgaXMgYmVjYXVzZSB0aGlzIHJlbG9jYXRpb24KLQkJIGlzIG5vdCBwY3JlbF9vZmZzZXQsIHdoaWNoIGlzIGEgYml0IGNvbmZ1c2luZyBhbmQKLQkJIHNob3VsZCwgcGVyaGFwcywgYmUgY2hhbmdlZCksIG9yCi0JCSAgIG5ld19kZXN0X3NlYwotCQkgd2hlcmUKLQkJICAgbmV3X2Rlc3Rfc2VjID09IG91dHB1dF9zZWN0aW9uLT52bWEgKyBvdXRwdXRfb2Zmc2V0Ci0JCSBXZSBhcnJhbmdlIGZvciB0aGlzIHRvIGhhcHBlbiBieSBzZXR0aW5nIFJFTE9DQVRJT04gdG8KLQkJICAgbmV3X2Rlc3Rfc2VjICsgb2xkX3NyY19zZWMgLSBvbGRfZGVzdF9zZWMKLQotCQkgSWYgdGhpcyBpcyBub3QgYSBQQyByZWxhdGl2ZSByZWxvYywgdGhlbiBSX0FEREVORCBpcwotCQkgc2ltcGx5IHRoZSBWTUEgb2YgdGhlIGRlc3RpbmF0aW9uLCBzbyB3ZSBzZXQKLQkJIFJFTE9DQVRJT04gdG8gdGhlIGNoYW5nZSBpbiB0aGUgZGVzdGluYXRpb24gVk1BLCBvcgotCQkgICBuZXdfZGVzdF9zZWMgLSBvbGRfZGVzdF9zZWMKLQkJICovCi0JICAgICAgcmVsb2NhdGlvbiA9IChyX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHJfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gcl9zZWN0aW9uLT52bWEpOwotCSAgICAgIGlmIChob3d0b190YWJsZV9leHRbcl90eXBlXS5wY19yZWxhdGl2ZSkKLQkJcmVsb2NhdGlvbiArPSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICAgIH0KLQotCSAgaWYgKGNoZWNrX2R5bmFtaWNfcmVsb2MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gc2tpcDsKLQotCSAgICAgIGlmICghICgoKmNoZWNrX2R5bmFtaWNfcmVsb2MpCi0JCSAgICAgKGZpbmZvLT5pbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGgsCi0JCSAgICAgIChQVFIpIHJlbCwgY29udGVudHMsICZza2lwLCAmcmVsb2NhdGlvbikpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKHNraXApCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIE5vdyB3YXJuIGlmIGEgZ2xvYmFsIHN5bWJvbCBpcyB1bmRlZmluZWQuICBXZSBjb3VsZCBub3QKLSAgICAgICAgICAgICBkbyB0aGlzIGVhcmxpZXIsIGJlY2F1c2UgY2hlY2tfZHluYW1pY19yZWxvYyBtaWdodCB3YW50Ci0gICAgICAgICAgICAgdG8gc2tpcCB0aGlzIHJlbG9jLiAgKi8KLQkgIGlmIChodW5kZWYKLQkgICAgICAmJiAhIGZpbmZvLT5pbmZvLT5zaGFyZWQKLQkgICAgICAmJiByX3R5cGUgIT0gUkVMT0NfQkFTRTEwCi0JICAgICAgJiYgcl90eXBlICE9IFJFTE9DX0JBU0UxMwotCSAgICAgICYmIHJfdHlwZSAhPSBSRUxPQ19CQVNFMjIpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgZWxzZQotCQluYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKLQkgICAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByX2FkZHIpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChyX3R5cGUgIT0gUkVMT0NfU1BBUkNfUkVWMzIpCi0JICAgIHIgPSBNWV9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0b190YWJsZV9leHQgKyByX3R5cGUsCi0JCQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsIHJfYWRkciwgcmVsb2NhdGlvbiwKLQkJCQkJcl9hZGRlbmQpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB4OwotCi0JICAgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByX2FkZHIpOwotCSAgICAgIHggPSB4ICsgcmVsb2NhdGlvbiArIHJfYWRkZW5kOwotCSAgICAgIGJmZF9wdXRsMzIgKC8qaW5wdXRfYmZkLCovIHgsIGNvbnRlbnRzICsgcl9hZGRyKTsKLQkgICAgICByID0gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQlkZWZhdWx0OgotCQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCQkgIGFib3J0ICgpOwotCQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkJICB7Ci0JCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgICBpZiAoaCAhPSBOVUxMKQotCQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJICAgIGVsc2UgaWYgKHJfZXh0ZXJuCi0JCQkgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkJCSAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCQkJICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotCQkgICAgICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsCi0JCQkJCQkgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlhc2VjdGlvbiAqczsKLQotCQkJcyA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQkJCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHMpOwotCQkgICAgICB9Ci0JCSAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJCSAgIChmaW5mby0+aW5mbywgbmFtZSwgaG93dG9fdGFibGVfZXh0W3JfdHlwZV0ubmFtZSwKLQkJCSAgICByX2FkZGVuZCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByX2FkZHIpKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGEgbGluayBvcmRlciB3aGljaCBpcyBzdXBwb3NlZCB0byBnZW5lcmF0ZSBhIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19yZWxvY19saW5rX29yZGVyIChmaW5mbywgbywgcCkKLSAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYXNlY3Rpb24gKm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jICpwcjsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gIGZpbGVfcHRyICpyZWxvZmZfcHRyID0gTlVMTDsKLSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCBzcmVsOwotICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIGVyZWw7Ci0gIFBUUiByZWxfcHRyOwotCi0gIHByID0gcC0+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+cmVsX2ZpbGVwb3MpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvYXJjaGl2ZS5jIGIvYmZkL2FyY2hpdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyOTNhZi4uMDAwMDAwMAotLS0gYS9iZmQvYXJjaGl2ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEzMCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGFyY2hpdmUgZmlsZXMgKGxpYnJhcmllcykuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuICBNb3N0bHkgR3VtYnkgSGVua2VsLVdhbGxhY2UncyBmYXVsdC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotQHNldGZpbGVuYW1lIGFyY2hpdmUtaW5mbwotU0VDVElPTgotCUFyY2hpdmVzCi0KLURFU0NSSVBUSU9OCi0JQW4gYXJjaGl2ZSAob3IgbGlicmFyeSkgaXMganVzdCBhbm90aGVyIEJGRC4gIEl0IGhhcyBhIHN5bWJvbAotCXRhYmxlLCBhbHRob3VnaCB0aGVyZSdzIG5vdCBtdWNoIGEgdXNlciBwcm9ncmFtIHdpbGwgZG8gd2l0aCBpdC4KLQotCVRoZSBiaWcgZGlmZmVyZW5jZSBiZXR3ZWVuIGFuIGFyY2hpdmUgQkZEIGFuZCBhbiBvcmRpbmFyeSBCRkQKLQlpcyB0aGF0IHRoZSBhcmNoaXZlIGRvZXNuJ3QgaGF2ZSBzZWN0aW9ucy4gIEluc3RlYWQgaXQgaGFzIGEKLQljaGFpbiBvZiBCRkRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgaXRzIGNvbnRlbnRzLiAgVGhlc2UgQkZEcyBjYW4KLQliZSBtYW5pcHVsYXRlZCBsaWtlIGFueSBvdGhlci4gIFRoZSBCRkRzIGNvbnRhaW5lZCBpbiBhbgotCWFyY2hpdmUgb3BlbmVkIGZvciByZWFkaW5nIHdpbGwgYWxsIGJlIG9wZW5lZCBmb3IgcmVhZGluZy4gIFlvdQotCW1heSBwdXQgZWl0aGVyIGlucHV0IG9yIG91dHB1dCBCRkRzIGludG8gYW4gYXJjaGl2ZSBvcGVuZWQgZm9yCi0Jb3V0cHV0OyB0aGV5IHdpbGwgYmUgaGFuZGxlZCBjb3JyZWN0bHkgd2hlbiB0aGUgYXJjaGl2ZSBpcyBjbG9zZWQuCi0KLQlVc2UgPDxiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlPj4gdG8gc3RlcCB0aHJvdWdoCi0JdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgb3BlbmVkIGZvciBpbnB1dC4gIFlvdSBkb24ndAotCWhhdmUgdG8gcmVhZCB0aGUgZW50aXJlIGFyY2hpdmUgaWYgeW91IGRvbid0IHdhbnQKLQl0byEgIFJlYWQgaXQgdW50aWwgeW91IGZpbmQgd2hhdCB5b3Ugd2FudC4KLQotCUFyY2hpdmUgY29udGVudHMgb2Ygb3V0cHV0IEJGRHMgYXJlIGNoYWluZWQgdGhyb3VnaCB0aGUKLQk8PG5leHQ+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+Zmlyc3RfZmlsZV9maWxlcG9zICs9Ci0JKGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MpICUgMjsKLQotICAgICAgLyogRklYTUUsIHdlIGNhbid0IHJlbGVhc2UgbmFtZWRhdGEgaGVyZSBiZWNhdXNlIGl0IHdhcyBhbGxvY2F0ZWQKLQkgYmVsb3cgZXh0ZW5kZWRfbmFtZXMgb24gdGhlIG9iamFsbG9jLi4uICovCi0gICAgICAvKiBiZmRfcmVsZWFzZSAoYWJmZCwgbmFtZWRhdGEpOyAqLwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBWTVMKLQotLyogUmV0dXJuIGEgY29weSBvZiB0aGUgc3R1ZmYgaW4gdGhlIGZpbGVuYW1lIGJldHdlZW4gYW55IDpdPiBhbmQgYQotICAgc2VtaWNvbG9uICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemUgKGFiZmQsIGZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgQ09OU1QgY2hhciAqZmlyc3Q7Ci0gIENPTlNUIGNoYXIgKmxhc3Q7Ci0gIGNoYXIgKmNvcHk7Ci0KLSAgZmlyc3QgPSBmaWxlICsgc3RybGVuIChmaWxlKSAtIDE7Ci0gIGxhc3QgPSBmaXJzdCArIDE7Ci0KLSAgd2hpbGUgKGZpcnN0ICE9IGZpbGUpCi0gICAgewotICAgICAgaWYgKCpmaXJzdCA9PSAnOycpCi0JbGFzdCA9IGZpcnN0OwotICAgICAgaWYgKCpmaXJzdCA9PSAnOicgfHwgKmZpcnN0ID09ICddJyB8fCAqZmlyc3QgPT0gJz4nKQotCXsKLQkgIGZpcnN0Kys7Ci0JICBicmVhazsKLQl9Ci0gICAgICBmaXJzdC0tOwotICAgIH0KLQotICBjb3B5ID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBsYXN0IC0gZmlyc3QgKyAxKTsKLSAgaWYgKGNvcHkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBtZW1jcHkgKGNvcHksIGZpcnN0LCBsYXN0IC0gZmlyc3QpOwotICBjb3B5W2xhc3QgLSBmaXJzdF0gPSAwOwotCi0gIHJldHVybiBjb3B5OwotfQotCi0jZWxzZQotc3RhdGljIGNvbnN0IGNoYXIgKgotbm9ybWFsaXplIChhYmZkLCBmaWxlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlLCAnLycpOwotCi0gIGlmIChmaWxlbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIGZpbGVuYW1lKys7Ci0gIGVsc2UKLSAgICBmaWxlbmFtZSA9IGZpbGU7Ci0gIHJldHVybiBmaWxlbmFtZTsKLX0KLSNlbmRpZgotCi0vKiBCdWlsZCBhIEJGRCBzdHlsZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdGFibG9jLCB0YWJsZW4sIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqKnRhYmxvYzsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOwotICAgICBjb25zdCBjaGFyICoqbmFtZTsKLXsKLSAgKm5hbWUgPSAiQVJGSUxFTkFNRVMvIjsKLSAgcmV0dXJuIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQsIGZhbHNlLCB0YWJsb2MsIHRhYmxlbik7Ci19Ci0KLS8qIEJ1aWxkIGFuIFNWUjQgc3R5bGUgZXh0ZW5kZWQgbmFtZSB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0YWJsb2MsIHRhYmxlbiwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICoqdGFibG9jOwotICAgICBiZmRfc2l6ZV90eXBlICp0YWJsZW47Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lOwotewotICAqbmFtZSA9ICIvLyI7Ci0gIHJldHVybiBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0cnVlLCB0YWJsb2MsIHRhYmxlbik7Ci19Ci0KLS8qIEZvbGxvd3MgYXJjaGl2ZV9oZWFkIGFuZCBwcm9kdWNlcyBhbiBleHRlbmRlZCBuYW1lIHRhYmxlIGlmCi0gICBuZWNlc3NhcnkuICBSZXR1cm5zIChpbiB0YWJsb2MpIGEgcG9pbnRlciB0byBhbiBleHRlbmRlZCBuYW1lCi0gICB0YWJsZSwgYW5kIGluIHRhYmxlbiB0aGUgbGVuZ3RoIG9mIHRoZSB0YWJsZS4gIElmIGl0IG1ha2VzIGFuIGVudHJ5Ci0gICBpdCBjbG9iYmVycyB0aGUgZmlsZW5hbWUgc28gdGhhdCB0aGUgZWxlbWVudCBtYXkgYmUgd3JpdHRlbiB3aXRob3V0Ci0gICBmdXJ0aGVyIG1hc3NhZ2UuICBSZXR1cm5zIHRydWUgaWYgaXQgcmFuIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYKLSAgIHNvbWV0aGluZyB3ZW50IHdyb25nLiAgQSBzdWNjZXNzZnVsIHJldHVybiBtYXkgc3RpbGwgaW52b2x2ZSBhCi0gICB6ZXJvLWxlbmd0aCB0YWJsZW4hICAqLwotCi1ib29sZWFuCi1fYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0cmFpbGluZ19zbGFzaCwgdGFibG9jLCB0YWJsZW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiB0cmFpbGluZ19zbGFzaDsKLSAgICAgY2hhciAqKnRhYmxvYzsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOwotewotICB1bnNpZ25lZCBpbnQgbWF4bmFtZSA9IGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuOwotICB1bnNpZ25lZCBpbnQgdG90YWxfbmFtZWxlbiA9IDA7Ci0gIGJmZCAqY3VycmVudDsKLSAgY2hhciAqc3RycHRyOwotCi0gICp0YWJsZW4gPSAwOwotCi0gIC8qIEZpZ3VyZSBvdXQgaG93IGxvbmcgdGhlIHRhYmxlIHNob3VsZCBiZSAqLwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbm9ybWFsOwotICAgICAgdW5zaWduZWQgaW50IHRoaXNsZW47Ci0KLSAgICAgIG5vcm1hbCA9IG5vcm1hbGl6ZSAoY3VycmVudCwgY3VycmVudC0+ZmlsZW5hbWUpOwotICAgICAgaWYgKG5vcm1hbCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgdGhpc2xlbiA9IHN0cmxlbiAobm9ybWFsKTsKLQotICAgICAgaWYgKHRoaXNsZW4gPiBtYXhuYW1lCi0JICAmJiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0JdGhpc2xlbiA9IG1heG5hbWU7Ci0KLSAgICAgIGlmICh0aGlzbGVuID4gbWF4bmFtZSkKLQl7Ci0JICAvKiBBZGQgb25lIHRvIGxlYXZlIHJvb20gZm9yIFxuLiAgKi8KLQkgIHRvdGFsX25hbWVsZW4gKz0gdGhpc2xlbiArIDE7Ci0JICBpZiAodHJhaWxpbmdfc2xhc2gpCi0JICAgIHsKLQkgICAgICAvKiBMZWF2ZSByb29tIGZvciB0cmFpbGluZyBzbGFzaC4gICovCi0JICAgICAgKyt0b3RhbF9uYW1lbGVuOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGFyY2hfaGRyIChjdXJyZW50KTsKLQkgIGlmIChzdHJuY21wIChub3JtYWwsIGhkci0+YXJfbmFtZSwgdGhpc2xlbikgIT0gMAotCSAgICAgIHx8ICh0aGlzbGVuIDwgc2l6ZW9mIGhkci0+YXJfbmFtZQotCQkgICYmIGhkci0+YXJfbmFtZVt0aGlzbGVuXSAhPSBhcl9wYWRjaGFyIChjdXJyZW50KSkpCi0JICAgIHsKLQkgICAgICAvKiBNdXN0IGhhdmUgYmVlbiB1c2luZyBleHRlbmRlZCBmb3JtYXQgZXZlbiB0aG91Z2ggaXQKLQkgICAgICAgICBkaWRuJ3QgbmVlZCB0by4gIEZpeCBpdCB0byB1c2Ugbm9ybWFsIGZvcm1hdC4gICovCi0JICAgICAgbWVtY3B5IChoZHItPmFyX25hbWUsIG5vcm1hbCwgdGhpc2xlbik7Ci0JICAgICAgaWYgKHRoaXNsZW4gPCBtYXhuYW1lCi0JCSAgfHwgKHRoaXNsZW4gPT0gbWF4bmFtZSAmJiB0aGlzbGVuIDwgc2l6ZW9mIGhkci0+YXJfbmFtZSkpCi0JCWhkci0+YXJfbmFtZVt0aGlzbGVuXSA9IGFyX3BhZGNoYXIgKGN1cnJlbnQpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAodG90YWxfbmFtZWxlbiA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gICp0YWJsb2MgPSBiZmRfemFsbG9jIChhYmZkLCB0b3RhbF9uYW1lbGVuKTsKLSAgaWYgKCp0YWJsb2MgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnRhYmxlbiA9IHRvdGFsX25hbWVsZW47Ci0gIHN0cnB0ciA9ICp0YWJsb2M7Ci0KLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+YXJjaGl2ZV9oZWFkOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPQotICAgICAgIGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbm9ybWFsOwotICAgICAgdW5zaWduZWQgaW50IHRoaXNsZW47Ci0KLSAgICAgIG5vcm1hbCA9IG5vcm1hbGl6ZSAoY3VycmVudCwgY3VycmVudC0+ZmlsZW5hbWUpOwotICAgICAgaWYgKG5vcm1hbCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgdGhpc2xlbiA9IHN0cmxlbiAobm9ybWFsKTsKLSAgICAgIGlmICh0aGlzbGVuID4gbWF4bmFtZSkKLQl7Ci0JICAvKiBXb3JrcyBmb3Igbm93OyBtYXkgbmVlZCB0byBiZSByZS1lbmdpbmVlcmVkIGlmIHdlCi0JICAgICBlbmNvdW50ZXIgYW4gb2RkYmFsbCBhcmNoaXZlIGZvcm1hdCBhbmQgd2FudCB0bwotCSAgICAgZ2VuZXJhbGlzZSB0aGlzIGhhY2suICovCi0JICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSBhcmNoX2hkciAoY3VycmVudCk7Ci0JICBzdHJjcHkgKHN0cnB0ciwgbm9ybWFsKTsKLQkgIGlmICghIHRyYWlsaW5nX3NsYXNoKQotCSAgICBzdHJwdHJbdGhpc2xlbl0gPSAnXDAxMic7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJwdHJbdGhpc2xlbl0gPSAnLyc7Ci0JICAgICAgc3RycHRyW3RoaXNsZW4gKyAxXSA9ICdcMDEyJzsKLQkgICAgfQotCSAgaGRyLT5hcl9uYW1lWzBdID0gYXJfcGFkY2hhciAoY3VycmVudCk7Ci0JICAvKiBXZSBrbm93IHRoZXJlIHdpbGwgYWx3YXlzIGJlIGVub3VnaCByb29tIChvbmUgb2YgdGhlIGZldwotCSAgICAgY2FzZXMgd2hlcmUgeW91IG1heSBzYWZlbHkgdXNlIHNwcmludGYpLiAqLwotCSAgc3ByaW50ZiAoKGhkci0+YXJfbmFtZSkgKyAxLCAiJS1kIiwgKHVuc2lnbmVkKSAoc3RycHRyIC0gKnRhYmxvYykpOwotCSAgLyogS2luZGEgS2x1ZGd5LiAgV2Ugc2hvdWxkIGp1c3QgdXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBvZgotCSAgICAgc3ByaW50ZiBidXQgbm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgZ2V0IHRoaXMgcmlnaHQgKi8KLQkgIHsKLQkgICAgY2hhciAqdGVtcCA9IGhkci0+YXJfbmFtZSArIDI7Ci0JICAgIGZvciAoOyB0ZW1wIDwgaGRyLT5hcl9uYW1lICsgbWF4bmFtZTsgdGVtcCsrKQotCSAgICAgIGlmICgqdGVtcCA9PSAnXDAnKQotCQkqdGVtcCA9ICcgJzsKLQkgIH0KLQkgIHN0cnB0ciArPSB0aGlzbGVuICsgMTsKLQkgIGlmICh0cmFpbGluZ19zbGFzaCkKLQkgICAgKytzdHJwdHI7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKiBBIGNvdXBsZSBvZiBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGFyX2hkcnMgKi8KLQotI2lmbmRlZiBIQVZFX0dFVFVJRAotI2RlZmluZSBnZXR1aWQoKSAwCi0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX0dFVEdJRAotI2RlZmluZSBnZXRnaWQoKSAwCi0jZW5kaWYKLQotLyogVGFrZXMgYSBmaWxlbmFtZSwgcmV0dXJucyBhbiBhcmVsdF9kYXRhIGZvciBpdCwgb3IgTlVMTCBpZiBpdCBjYW4ndAotICAgbWFrZSBvbmUuICBUaGUgZmlsZW5hbWUgbXVzdCByZWZlciB0byBhIGZpbGVuYW1lIGluIHRoZSBmaWxlc3lzdGVtLgotICAgVGhlIGZpbGVuYW1lIGZpZWxkIG9mIHRoZSBhcl9oZHIgd2lsbCBOT1QgYmUgaW5pdGlhbGl6ZWQuICBJZiBtZW1iZXIKLSAgIGlzIHNldCwgYW5kIGl0J3MgYW4gaW4tbWVtb3J5IGJmZCwgd2UgZmFrZSBpdC4gKi8KLQotc3RhdGljIHN0cnVjdCBhcmVsdGRhdGEgKgotYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0gKGFiZmQsIGZpbGVuYW1lLCBtZW1iZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGJmZCAqbWVtYmVyOwotewotICBzdHJ1Y3Qgc3RhdCBzdGF0dXM7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKmFyZWQ7Ci0gIHN0cnVjdCBhcl9oZHIgKmhkcjsKLSAgY2hhciAqdGVtcCwgKnRlbXAxOwotCi0gIGlmIChtZW1iZXIgJiYgKG1lbWJlci0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIEFzc3VtZSB3ZSBqdXN0ICJtYWRlIiB0aGUgbWVtYmVyLCBhbmQgZmFrZSBpdCAqLwotICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSBtZW1iZXItPmlvc3RyZWFtOwotICAgICAgdGltZSgmc3RhdHVzLnN0X210aW1lKTsKLSAgICAgIHN0YXR1cy5zdF91aWQgPSBnZXR1aWQoKTsKLSAgICAgIHN0YXR1cy5zdF9naWQgPSBnZXRnaWQoKTsKLSAgICAgIHN0YXR1cy5zdF9tb2RlID0gMDY0NDsKLSAgICAgIHN0YXR1cy5zdF9zaXplID0gYmltLT5zaXplOwotICAgIH0KLSAgZWxzZSBpZiAoc3RhdCAoZmlsZW5hbWUsICZzdGF0dXMpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBhcmVkID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArCi0JCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSk7Ci0gIGlmIChhcmVkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGhkciA9IChzdHJ1Y3QgYXJfaGRyICopICgoKGNoYXIgKikgYXJlZCkgKyBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLQotICAvKiBhciBoZWFkZXJzIGFyZSBzcGFjZSBwYWRkZWQsIG5vdCBudWxsIHBhZGRlZCEgKi8KLSAgbWVtc2V0ICgoUFRSKSBoZHIsICcgJywgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0KLSAgc3RybmNweSAoaGRyLT5hcl9mbWFnLCBBUkZNQUcsIDIpOwotCi0gIC8qIEdvZGRhbW5lZCBzcHJpbnRmIGRvZXNuJ3QgcGVybWl0IE1BWElNVU0gZmllbGQgbGVuZ3RocyAqLwotICBzcHJpbnRmICgoaGRyLT5hcl9kYXRlKSwgIiUtMTJsZCIsIChsb25nKSBzdGF0dXMuc3RfbXRpbWUpOwotICBzcHJpbnRmICgoaGRyLT5hcl91aWQpLCAiJWxkIiwgKGxvbmcpIHN0YXR1cy5zdF91aWQpOwotICBzcHJpbnRmICgoaGRyLT5hcl9naWQpLCAiJWxkIiwgKGxvbmcpIHN0YXR1cy5zdF9naWQpOwotICBzcHJpbnRmICgoaGRyLT5hcl9tb2RlKSwgIiUtOG8iLCAodW5zaWduZWQgaW50KSBzdGF0dXMuc3RfbW9kZSk7Ci0gIHNwcmludGYgKChoZHItPmFyX3NpemUpLCAiJS0xMGxkIiwgKGxvbmcpIHN0YXR1cy5zdF9zaXplKTsKLSAgLyogQ29ycmVjdCBmb3IgYSBsb3NzYWdlIGluIHNwcmludGYgd2hlcmVieSBpdCBudWxsLXRlcm1pbmF0ZXMuICBJIGNhbm5vdAotICAgICB1bmRlcnN0YW5kIGhvdyB0aGVzZSBDIGxvc2VycyBjb3VsZCBkZXNpZ24gc3VjaCBhIHJhbXNoYWNrbGUgYnVuY2ggb2YKLSAgICAgSU8gb3BlcmF0aW9ucyAqLwotICB0ZW1wID0gKGNoYXIgKikgaGRyOwotICB0ZW1wMSA9IHRlbXAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpIC0gMjsKLSAgZm9yICg7IHRlbXAgPCB0ZW1wMTsgdGVtcCsrKQotICAgIHsKLSAgICAgIGlmICgqdGVtcCA9PSAnXDAnKQotCSp0ZW1wID0gJyAnOwotICAgIH0KLSAgc3RybmNweSAoaGRyLT5hcl9mbWFnLCBBUkZNQUcsIDIpOwotICBhcmVkLT5wYXJzZWRfc2l6ZSA9IHN0YXR1cy5zdF9zaXplOwotICBhcmVkLT5hcmNoX2hlYWRlciA9IChjaGFyICopIGhkcjsKLQotICByZXR1cm4gYXJlZDsKLX0KLQotLyogVGhpcyBpcyBtYWdpYyByZXF1aXJlZCBieSB0aGUgImFyIiBwcm9ncmFtLiAgU2luY2UgaXQncwotICAgIHVuZG9jdW1lbnRlZCwgaXQncyB1bmRvY3VtZW50ZWQuICBZb3UgbWF5IHRoaW5rIHRoYXQgaXQgd291bGQgdGFrZQotICAgIGEgc3Ryb25nIHN0b21hY2ggdG8gd3JpdGUgdGhpcywgYW5kIGl0IGRvZXMsIGJ1dCBpdCB0YWtlcyBldmVuIGEKLSAgICBzdHJvbmdlciBzdG9tYWNoIHRvIHRyeSB0byBjb2RlIGFyb3VuZCBzdWNoIGEgdGhpbmchICAqLwotCi1zdHJ1Y3QgYXJfaGRyICpiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0cnVjdCBhcl9oZHIgKgotYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUgKGFiZmQsIGZpbGVuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICphcl9lbHQgPSBiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSAoYWJmZCwgZmlsZW5hbWUsIDApOwotICBpZiAoYXJfZWx0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiAoc3RydWN0IGFyX2hkciAqKSBhcl9lbHQtPmFyY2hfaGVhZGVyOwotfQotCi0KLS8qIEFuYWxvZ291cyB0byBzdGF0IGNhbGwgKi8KLWludAotYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzdGF0ICpidWY7Ci17Ci0gIHN0cnVjdCBhcl9oZHIgKmhkcjsKLSAgY2hhciAqYWxvc2VyOwotCi0gIGlmIChhYmZkLT5hcmVsdF9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaGRyID0gYXJjaF9oZHIgKGFiZmQpOwotCi0jZGVmaW5lIGZvbyhhcmVsdCwgc3RlbHQsIHNpemUpICBcCi0gIGJ1Zi0+c3RlbHQgPSBzdHJ0b2wgKGhkci0+YXJlbHQsICZhbG9zZXIsIHNpemUpOyBcCi0gIGlmIChhbG9zZXIgPT0gaGRyLT5hcmVsdCkgcmV0dXJuIC0xOwotCi0gIGZvbyAoYXJfZGF0ZSwgc3RfbXRpbWUsIDEwKTsKLSAgZm9vIChhcl91aWQsIHN0X3VpZCwgMTApOwotICBmb28gKGFyX2dpZCwgc3RfZ2lkLCAxMCk7Ci0gIGZvbyAoYXJfbW9kZSwgc3RfbW9kZSwgOCk7Ci0KLSAgYnVmLT5zdF9zaXplID0gYXJjaF9lbHRkYXRhIChhYmZkKS0+cGFyc2VkX3NpemU7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLWJmZF9kb250X3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lOwotICAgICBjaGFyICphcmhkcjsKLXsKLSAgLyogRklYTUU6IFRoaXMgaW50ZXJhY3RzIHVucGxlYXNhbnRseSB3aXRoIGFyJ3MgcXVpY2stYXBwZW5kIG9wdGlvbi4KLSAgICAgRm9ydHVuYXRlbHkgaWM5NjAgdXNlcnMgd2lsbCBuZXZlciB1c2UgdGhhdCBvcHRpb24uICBGaXhpbmcgdGhpcwotICAgICBpcyB2ZXJ5IGhhcmQ7IGZvcnR1bmF0ZWx5IEkga25vdyBob3cgdG8gZG8gaXQgYW5kIHdpbGwgZG8gc28gb25jZQotICAgICBpbnRlbCdzIHJlbGVhc2UgaXMgb3V0IHRoZSBkb29yLiAqLwotCi0gIHN0cnVjdCBhcl9oZHIgKmhkciA9IChzdHJ1Y3QgYXJfaGRyICopIGFyaGRyOwotICBzaXplX3QgbGVuZ3RoOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgc2l6ZV90IG1heGxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOwotCi0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0gICAgewotICAgICAgYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUgKGFiZmQsIHBhdGhuYW1lLCBhcmhkcik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZpbGVuYW1lID0gbm9ybWFsaXplIChhYmZkLCBwYXRobmFtZSk7Ci0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgbGVuZ3RoID0gc3RybGVuIChmaWxlbmFtZSk7Ci0KLSAgaWYgKGxlbmd0aCA8PSBtYXhsZW4pCi0gICAgbWVtY3B5IChoZHItPmFyX25hbWUsIGZpbGVuYW1lLCBsZW5ndGgpOwotCi0gIC8qIEFkZCB0aGUgcGFkZGluZyBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgcm9vbSBmb3IgaXQuICAqLwotICBpZiAobGVuZ3RoIDwgbWF4bGVuCi0gICAgICB8fCAobGVuZ3RoID09IG1heGxlbiAmJiBsZW5ndGggPCBzaXplb2YgaGRyLT5hcl9uYW1lKSkKLSAgICAoaGRyLT5hcl9uYW1lKVtsZW5ndGhdID0gYXJfcGFkY2hhciAoYWJmZCk7Ci19Ci0KLXZvaWQKLWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lIChhYmZkLCBwYXRobmFtZSwgYXJoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqcGF0aG5hbWU7Ci0gICAgIGNoYXIgKmFyaGRyOwotewotICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSAoc3RydWN0IGFyX2hkciAqKSBhcmhkcjsKLSAgaW50IGxlbmd0aDsKLSAgQ09OU1QgY2hhciAqZmlsZW5hbWUgPSBzdHJyY2hyIChwYXRobmFtZSwgJy8nKTsKLSAgaW50IG1heGxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOwotCi0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIGZpbGVuYW1lID0gcGF0aG5hbWU7Ci0gIGVsc2UKLSAgICArK2ZpbGVuYW1lOwotCi0gIGxlbmd0aCA9IHN0cmxlbiAoZmlsZW5hbWUpOwotCi0gIGlmIChsZW5ndGggPD0gbWF4bGVuKQotICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbGVuZ3RoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHBhdGhuYW1lOiBtZWV0IHByb2NydXN0ZXMgKi8KLSAgICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbWF4bGVuKTsKLSAgICAgIGxlbmd0aCA9IG1heGxlbjsKLSAgICB9Ci0KLSAgaWYgKGxlbmd0aCA8IG1heGxlbikKLSAgICAoaGRyLT5hcl9uYW1lKVtsZW5ndGhdID0gYXJfcGFkY2hhciAoYWJmZCk7Ci19Ci0KLS8qIFN0b3JlIG5hbWUgaW50byBhciBoZWFkZXIuICBUcnVuY2F0ZXMgdGhlIG5hbWUgdG8gZml0LgotICAgMT4gc3RyaXAgcGF0aG5hbWUgdG8gYmUganVzdCB0aGUgYmFzZW5hbWUuCi0gICAyPiBpZiBpdCdzIHNob3J0IGVudWYgdG8gZml0LCBzdHVmZiBpdCBpbi4KLSAgIDM+IElmIGl0IGRvZXNuJ3QgZW5kIHdpdGggLm8sIHRydW5jYXRlIGl0IHRvIGZpdAotICAgND4gdHJ1bmNhdGUgaXQgYmVmb3JlIHRoZSAubywgYXBwZW5kIC5vLCBzdHVmZiBUSEFUIGluLiAgKi8KLQotLyogVGhpcyBpcyB3aGF0IGdudSBhciBkb2VzLiAgSXQncyBiZXR0ZXIgYnV0IGluY29tcGF0aWJsZSB3aXRoIHRoZQotICAgYnNkIGFyLiAqLwotCi12b2lkCi1iZmRfZ251X3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lOwotICAgICBjaGFyICphcmhkcjsKLXsKLSAgc3RydWN0IGFyX2hkciAqaGRyID0gKHN0cnVjdCBhcl9oZHIgKikgYXJoZHI7Ci0gIGludCBsZW5ndGg7Ci0gIENPTlNUIGNoYXIgKmZpbGVuYW1lID0gc3RycmNociAocGF0aG5hbWUsICcvJyk7Ci0gIGludCBtYXhsZW4gPSBhcl9tYXhuYW1lbGVuIChhYmZkKTsKLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmaWxlbmFtZSA9IHBhdGhuYW1lOwotICBlbHNlCi0gICAgKytmaWxlbmFtZTsKLQotICBsZW5ndGggPSBzdHJsZW4gKGZpbGVuYW1lKTsKLQotICBpZiAobGVuZ3RoIDw9IG1heGxlbikKLSAgICBtZW1jcHkgKGhkci0+YXJfbmFtZSwgZmlsZW5hbWUsIGxlbmd0aCk7Ci0gIGVsc2UKLSAgICB7CQkJCS8qIHBhdGhuYW1lOiBtZWV0IHByb2NydXN0ZXMgKi8KLSAgICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbWF4bGVuKTsKLSAgICAgIGlmICgoZmlsZW5hbWVbbGVuZ3RoIC0gMl0gPT0gJy4nKSAmJiAoZmlsZW5hbWVbbGVuZ3RoIC0gMV0gPT0gJ28nKSkKLQl7Ci0JICBoZHItPmFyX25hbWVbbWF4bGVuIC0gMl0gPSAnLic7Ci0JICBoZHItPmFyX25hbWVbbWF4bGVuIC0gMV0gPSAnbyc7Ci0JfQotICAgICAgbGVuZ3RoID0gbWF4bGVuOwotICAgIH0KLQotICBpZiAobGVuZ3RoIDwgMTYpCi0gICAgKGhkci0+YXJfbmFtZSlbbGVuZ3RoXSA9IGFyX3BhZGNoYXIgKGFiZmQpOwotfQotDAotLyogVGhlIEJGRCBpcyBvcGVuIGZvciB3cml0ZSBhbmQgaGFzIGl0cyBmb3JtYXQgc2V0IHRvIGJmZF9hcmNoaXZlICovCi0KLWJvb2xlYW4KLV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyAoYXJjaCkKLSAgICAgYmZkICphcmNoOwotewotICBiZmQgKmN1cnJlbnQ7Ci0gIGNoYXIgKmV0YWJsZSA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgZWxlbmd0aCA9IDA7Ci0gIGNvbnN0IGNoYXIgKmVuYW1lID0gTlVMTDsKLSAgYm9vbGVhbiBtYWtlbWFwID0gYmZkX2hhc19tYXAgKGFyY2gpOwotICBib29sZWFuIGhhc29iamVjdHMgPSBmYWxzZTsJLyogaWYgbm8gLm8ncywgZG9uJ3QgYm90aGVyIHRvIG1ha2UgYSBtYXAgKi8KLSAgYmZkX3NpemVfdHlwZSB3cm90ZTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCB0cmllczsKLQotICAvKiBWZXJpZnkgdGhlIHZpYWJpbGl0eSBvZiBhbGwgZW50cmllczsgaWYgYW55IG9mIHRoZW0gbGl2ZSBpbiB0aGUKLSAgICAgZmlsZXN5c3RlbSAoYXMgb3Bwb3NlZCB0byBsaXZpbmcgaW4gYW4gYXJjaGl2ZSBvcGVuIGZvciBpbnB1dCkKLSAgICAgdGhlbiBjb25zdHJ1Y3QgYSBmcmVzaCBhcl9oZHIgZm9yIHRoZW0uICAqLwotICBmb3IgKGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7IGN1cnJlbnQ7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChiZmRfd3JpdGVfcCAoY3VycmVudCkpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoIWN1cnJlbnQtPmFyZWx0X2RhdGEpCi0JewotCSAgY3VycmVudC0+YXJlbHRfZGF0YSA9Ci0JICAgIChQVFIpIGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtIChhcmNoLCBjdXJyZW50LT5maWxlbmFtZSwgY3VycmVudCk7Ci0JICBpZiAoIWN1cnJlbnQtPmFyZWx0X2RhdGEpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogUHV0IGluIHRoZSBmaWxlIG5hbWUgKi8KLQkgIEJGRF9TRU5EIChhcmNoLCBfYmZkX3RydW5jYXRlX2FybmFtZSwgKGFyY2gsCi0JCQkJCQkgY3VycmVudC0+ZmlsZW5hbWUsCi0JCQkJCSAgICAgIChjaGFyICopIGFyY2hfaGRyIChjdXJyZW50KSkpOwotCX0KLQotICAgICAgaWYgKG1ha2VtYXAgJiYgISBoYXNvYmplY3RzKQotCXsJCQkvKiBkb24ndCBib3RoZXIgaWYgd2Ugd29uJ3QgbWFrZSBhIG1hcCEgKi8KLQkgIGlmICgoYmZkX2NoZWNrX2Zvcm1hdCAoY3VycmVudCwgYmZkX29iamVjdCkpCi0jaWYgMAkJCQkvKiBGSVhNRSAtLSB0aGVzZSBhcmUgbm90IHNldCBjb3JyZWN0bHkgKi8KLQkgICAgICAmJiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoY3VycmVudCkgJiBIQVNfU1lNUykpCi0jZW5kaWYKLQkgICAgKQotCSAgICBoYXNvYmplY3RzID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGlmICghQkZEX1NFTkQgKGFyY2gsIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUsCi0JCSAoYXJjaCwgJmV0YWJsZSwgJmVsZW5ndGgsICZlbmFtZSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFyY2gsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotI2lmZGVmIEdOVTk2MAotICB3cm90ZSA9IGJmZF93cml0ZSAoQkZEX0dOVTk2MF9BUk1BRyAoYXJjaCksIDEsIFNBUk1BRywgYXJjaCk7Ci0jZWxzZQotICB3cm90ZSA9IGJmZF93cml0ZSAoQVJNQUcsIDEsIFNBUk1BRywgYXJjaCk7Ci0jZW5kaWYKLSAgaWYgKHdyb3RlICE9IFNBUk1BRykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG1ha2VtYXAgJiYgaGFzb2JqZWN0cykKLSAgICB7Ci0gICAgICBpZiAoX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCkgIT0gdHJ1ZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGVuZ3RoICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGFyX2hkciBoZHI7Ci0KLSAgICAgIG1lbXNldCAoKGNoYXIgKikgKCZoZHIpLCAwLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIHN0cmNweSAoaGRyLmFyX25hbWUsIGVuYW1lKTsKLSAgICAgIC8qIFJvdW5kIHNpemUgdXAgdG8gZXZlbiBudW1iZXIgaW4gYXJjaGl2ZSBoZWFkZXIuICAqLwotICAgICAgc3ByaW50ZiAoJihoZHIuYXJfc2l6ZVswXSksICIlLTEwZCIsCi0JICAgICAgIChpbnQpICgoZWxlbmd0aCArIDEpICYgfjEpKTsKLSAgICAgIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKLQlpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKLQkgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7Ci0gICAgICBpZiAoKGJmZF93cml0ZSAoKGNoYXIgKikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKLQkgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotCSAgfHwgYmZkX3dyaXRlIChldGFibGUsIDEsIGVsZW5ndGgsIGFyY2gpICE9IGVsZW5ndGgpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKChlbGVuZ3RoICUgMikgPT0gMSkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlICgiXDAxMiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGZvciAoY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgY2hhciBidWZmZXJbREVGQVVMVF9CVUZGRVJTSVpFXTsKLSAgICAgIHVuc2lnbmVkIGludCByZW1haW5pbmcgPSBhcmVsdF9zaXplIChjdXJyZW50KTsKLSAgICAgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGFyY2hfaGRyIChjdXJyZW50KTsKLQotICAgICAgLyogd3JpdGUgYXIgaGVhZGVyICovCi0gICAgICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSBoZHIsIDEsIHNpemVvZiAoKmhkciksIGFyY2gpICE9IHNpemVvZiAoKmhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9zZWVrIChjdXJyZW50LCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHdoaWxlIChyZW1haW5pbmcpCi0JewotCSAgdW5zaWduZWQgaW50IGFtdCA9IERFRkFVTFRfQlVGRkVSU0laRTsKLQkgIGlmIChhbXQgPiByZW1haW5pbmcpCi0JICAgIGFtdCA9IHJlbWFpbmluZzsKLQkgIGVycm5vID0gMDsKLQkgIGlmIChiZmRfcmVhZCAoYnVmZmVyLCBhbXQsIDEsIGN1cnJlbnQpICE9IGFtdCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmIChiZmRfd3JpdGUgKGJ1ZmZlciwgYW10LCAxLCBhcmNoKSAhPSBhbXQpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJlbWFpbmluZyAtPSBhbXQ7Ci0JfQotICAgICAgaWYgKChhcmVsdF9zaXplIChjdXJyZW50KSAlIDIpID09IDEpCi0JewotCSAgaWYgKGJmZF93cml0ZSAoIlwwMTIiLCAxLCAxLCBhcmNoKSAhPSAxKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAobWFrZW1hcCAmJiBoYXNvYmplY3RzKQotICAgIHsKLSAgICAgIC8qIFZlcmlmeSB0aGUgdGltZXN0YW1wIGluIHRoZSBhcmNoaXZlIGZpbGUuICBJZiBpdCB3b3VsZCBub3QgYmUKLQkgYWNjZXB0ZWQgYnkgdGhlIGxpbmtlciwgcmV3cml0ZSBpdCB1bnRpbCBpdCB3b3VsZCBiZS4gIElmCi0JIGFueXRoaW5nIG9kZCBoYXBwZW5zLCBicmVhayBvdXQgYW5kIGp1c3QgcmV0dXJuLiAgKFRoZQotCSBCZXJrZWxleSBsaW5rZXIgY2hlY2tzIHRoZSB0aW1lc3RhbXAgYW5kIHJlZnVzZXMgdG8gcmVhZCB0aGUKLQkgdGFibGUtb2YtY29udGVudHMgaWYgaXQgaXMgPjYwIHNlY29uZHMgbGVzcyB0aGFuIHRoZSBmaWxlJ3MKLQkgbW9kaWZpZWQtdGltZS4gIFRoYXQgcGFpbmZ1bCBoYWNrIHJlcXVpcmVzIHRoaXMgcGFpbmZ1bCBoYWNrLiAgKi8KLSAgICAgIHRyaWVzID0gMTsKLSAgICAgIGRvCi0JewotCSAgaWYgKGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIChhcmNoKSkKLQkgICAgYnJlYWs7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIldhcm5pbmc6IHdyaXRpbmcgYXJjaGl2ZSB3YXMgc2xvdzogcmV3cml0aW5nIHRpbWVzdGFtcFxuIikpOwotCX0KLSAgICAgIHdoaWxlICgrK3RyaWVzIDwgNik7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogTm90ZSB0aGF0IHRoZSBuYW1pZHggZm9yIHRoZSBmaXJzdCBzeW1ib2wgaXMgMCAqLwotCi1ib29sZWFuCi1fYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoKQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotewotICBjaGFyICpmaXJzdF9uYW1lID0gTlVMTDsKLSAgYmZkICpjdXJyZW50OwotICBmaWxlX3B0ciBlbHRfbm8gPSAwOwotICBzdHJ1Y3Qgb3JsICptYXAgPSBOVUxMOwotICBpbnQgb3JsX21heCA9IDEwMjQ7CQkvKiBmaW5lIGluaXRpYWwgZGVmYXVsdCAqLwotICBpbnQgb3JsX2NvdW50ID0gMDsKLSAgaW50IHN0cmlkeCA9IDA7CQkvKiBzdHJpbmcgaW5kZXggKi8KLSAgYXN5bWJvbCAqKnN5bXMgPSBOVUxMOwotICBsb25nIHN5bXNfbWF4ID0gMDsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgLyogRHVubm8gaWYgdGhpcyBpcyB0aGUgYmVzdCBwbGFjZSBmb3IgdGhpcyBpbmZvLi4uICovCi0gIGlmIChlbGVuZ3RoICE9IDApCi0gICAgZWxlbmd0aCArPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotICBlbGVuZ3RoICs9IGVsZW5ndGggJSAyOwotCi0gIG1hcCA9IChzdHJ1Y3Qgb3JsICopIGJmZF9tYWxsb2MgKG9ybF9tYXggKiBzaXplb2YgKHN0cnVjdCBvcmwpKTsKLSAgaWYgKG1hcCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlIHB1dCB0aGUgc3ltYm9sIG5hbWVzIG9uIHRoZSBhcmNoIG9iamFsbG9jLCBhbmQgdGhlbiBkaXNjYXJkCi0gICAgIHRoZW0gd2hlbiBkb25lLiAgKi8KLSAgZmlyc3RfbmFtZSA9IGJmZF9hbGxvYyAoYXJjaCwgMSk7Ci0gIGlmIChmaXJzdF9uYW1lID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogRHJvcCBhbGwgdGhlIGZpbGVzIGNhbGxlZCBfXy5TWU1ERUYsIHdlJ3JlIGdvaW5nIHRvIG1ha2Ugb3VyCi0gICAgIG93biAqLwotICB3aGlsZSAoYXJjaC0+YXJjaGl2ZV9oZWFkICYmCi0JIHN0cmNtcCAoYXJjaC0+YXJjaGl2ZV9oZWFkLT5maWxlbmFtZSwgIl9fLlNZTURFRiIpID09IDApCi0gICAgYXJjaC0+YXJjaGl2ZV9oZWFkID0gYXJjaC0+YXJjaGl2ZV9oZWFkLT5uZXh0OwotCi0gIC8qIE1hcCBvdmVyIGVhY2ggZWxlbWVudCAqLwotICBmb3IgKGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gICAgICAgY3VycmVudCAhPSAoYmZkICopIE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQsIGVsdF9ubysrKQotICAgIHsKLSAgICAgIGlmICgoYmZkX2NoZWNrX2Zvcm1hdCAoY3VycmVudCwgYmZkX29iamVjdCkgPT0gdHJ1ZSkKLQkgICYmICgoYmZkX2dldF9maWxlX2ZsYWdzIChjdXJyZW50KSAmIEhBU19TWU1TKSkpCi0JewotCSAgbG9uZyBzdG9yYWdlOwotCSAgbG9uZyBzeW1jb3VudDsKLQkgIGxvbmcgc3JjX2NvdW50OwotCi0JICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGN1cnJlbnQpOwotCSAgaWYgKHN0b3JhZ2UgPCAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKHN0b3JhZ2UgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzdG9yYWdlID4gc3ltc19tYXgpCi0JCXsKLQkJICBpZiAoc3ltc19tYXggPiAwKQotCQkgICAgZnJlZSAoc3ltcyk7Ci0JCSAgc3ltc19tYXggPSBzdG9yYWdlOwotCQkgIHN5bXMgPSAoYXN5bWJvbCAqKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3ltc19tYXgpOwotCQkgIGlmIChzeW1zID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICAgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGN1cnJlbnQsIHN5bXMpOwotCSAgICAgIGlmIChzeW1jb3VudCA8IDApCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgLyogTm93IG1hcCBvdmVyIGFsbCB0aGUgc3ltYm9scywgcGlja2luZyBvdXQgdGhlIG9uZXMgd2Ugd2FudCAqLwotCSAgICAgIGZvciAoc3JjX2NvdW50ID0gMDsgc3JjX2NvdW50IDwgc3ltY291bnQ7IHNyY19jb3VudCsrKQotCQl7Ci0JCSAgZmxhZ3dvcmQgZmxhZ3MgPSAoc3ltc1tzcmNfY291bnRdKS0+ZmxhZ3M7Ci0JCSAgYXNlY3Rpb24gKnNlYyA9IHN5bXNbc3JjX2NvdW50XS0+c2VjdGlvbjsKLQotCQkgIGlmICgoZmxhZ3MgJiBCU0ZfR0xPQkFMIHx8Ci0JCSAgICAgICBmbGFncyAmIEJTRl9XRUFLIHx8Ci0JCSAgICAgICBmbGFncyAmIEJTRl9JTkRJUkVDVCB8fAotCQkgICAgICAgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotCQkgICAgICAmJiAhIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLQkJICAgIHsKLQkJICAgICAgc2l6ZV90IG5hbWVsZW47Ci0JCSAgICAgIHN0cnVjdCBvcmwgKm5ld19tYXA7Ci0KLQkJICAgICAgLyogVGhpcyBzeW1ib2wgd2lsbCBnbyBpbnRvIHRoZSBhcmNoaXZlIGhlYWRlciAqLwotCQkgICAgICBpZiAob3JsX2NvdW50ID09IG9ybF9tYXgpCi0JCQl7Ci0JCQkgIG9ybF9tYXggKj0gMjsKLQkJCSAgbmV3X21hcCA9Ci0JCQkgICAgKChzdHJ1Y3Qgb3JsICopCi0JCQkgICAgIGJmZF9yZWFsbG9jIChtYXAsIG9ybF9tYXggKiBzaXplb2YgKHN0cnVjdCBvcmwpKSk7Ci0JCQkgIGlmIChuZXdfbWFwID09IChzdHJ1Y3Qgb3JsICopIE5VTEwpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgbWFwID0gbmV3X21hcDsKLQkJCX0KLQotCQkgICAgICBuYW1lbGVuID0gc3RybGVuIChzeW1zW3NyY19jb3VudF0tPm5hbWUpOwotCQkgICAgICBtYXBbb3JsX2NvdW50XS5uYW1lID0gKChjaGFyICoqKQotCQkJCQkgICAgIGJmZF9hbGxvYyAoYXJjaCwKLQkJCQkJCQlzaXplb2YgKGNoYXIgKikpKTsKLQkJICAgICAgaWYgKG1hcFtvcmxfY291bnRdLm5hbWUgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICAqKG1hcFtvcmxfY291bnRdLm5hbWUpID0gYmZkX2FsbG9jIChhcmNoLCBuYW1lbGVuICsgMSk7Ci0JCSAgICAgIGlmICgqKG1hcFtvcmxfY291bnRdLm5hbWUpID09IE5VTEwpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQkJICAgICAgc3RyY3B5ICgqKG1hcFtvcmxfY291bnRdLm5hbWUpLCBzeW1zW3NyY19jb3VudF0tPm5hbWUpOwotCQkgICAgICAobWFwW29ybF9jb3VudF0pLnBvcyA9IChmaWxlX3B0cikgY3VycmVudDsKLQkJICAgICAgKG1hcFtvcmxfY291bnRdKS5uYW1pZHggPSBzdHJpZHg7Ci0KLQkJICAgICAgc3RyaWR4ICs9IG5hbWVsZW4gKyAxOwotCQkgICAgICArK29ybF9jb3VudDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIC8qIE5vdyBhc2sgdGhlIEJGRCB0byBmcmVlIHVwIGFueSBjYWNoZWQgaW5mb3JtYXRpb24sIHNvIHdlCi0JICAgICBkb24ndCBmaWxsIGFsbCBvZiBtZW1vcnkgd2l0aCBzeW1ib2wgdGFibGVzLiAgKi8KLQkgIGlmICghIGJmZF9mcmVlX2NhY2hlZF9pbmZvIChjdXJyZW50KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBPSywgbm93IHdlIGhhdmUgY29sbGVjdGVkIGFsbCB0aGUgZGF0YSwgbGV0J3Mgd3JpdGUgdGhlbSBvdXQgKi8KLSAgcmV0ID0gQkZEX1NFTkQgKGFyY2gsIHdyaXRlX2FybWFwLAotCQkgIChhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KSk7Ci0KLSAgaWYgKHN5bXNfbWF4ID4gMCkKLSAgICBmcmVlIChzeW1zKTsKLSAgaWYgKG1hcCAhPSBOVUxMKQotICAgIGZyZWUgKG1hcCk7Ci0gIGlmIChmaXJzdF9uYW1lICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFyY2gsIGZpcnN0X25hbWUpOwotCi0gIHJldHVybiByZXQ7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzeW1zX21heCA+IDApCi0gICAgZnJlZSAoc3ltcyk7Ci0gIGlmIChtYXAgIT0gTlVMTCkKLSAgICBmcmVlIChtYXApOwotICBpZiAoZmlyc3RfbmFtZSAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhcmNoLCBmaXJzdF9uYW1lKTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2xlYW4KLWJzZF93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphcmNoOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICBpbnQgcGFkaXQgPSBzdHJpZHggJiAxOwotICB1bnNpZ25lZCBpbnQgcmFubGlic2l6ZSA9IG9ybF9jb3VudCAqIEJTRF9TWU1ERUZfU0laRTsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemUgPSBzdHJpZHggKyBwYWRpdDsKLSAgLyogSW5jbHVkZSA4IGJ5dGVzIHRvIHN0b3JlIHJhbmxpYnNpemUgYW5kIHN0cmluZ3NpemUgaW4gb3V0cHV0LiAqLwotICB1bnNpZ25lZCBpbnQgbWFwc2l6ZSA9IHJhbmxpYnNpemUgKyBzdHJpbmdzaXplICsgODsKLSAgZmlsZV9wdHIgZmlyc3RyZWFsOwotICBiZmQgKmN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gIGJmZCAqbGFzdF9lbHQgPSBjdXJyZW50OwkvKiBsYXN0IGVsZW1lbnQgYXJjaCBzZWVuICovCi0gIGJmZF9ieXRlIHRlbXBbNF07Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZpcnN0cmVhbCA9IG1hcHNpemUgKyBlbGVuZ3RoICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIFNBUk1BRzsKLQotICBzdGF0IChhcmNoLT5maWxlbmFtZSwgJnN0YXRidWYpOwotICBtZW1zZXQgKChjaGFyICopICgmaGRyKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gIHNwcmludGYgKGhkci5hcl9uYW1lLCBSQU5MSUJNQUcpOwotICAvKiBSZW1lbWJlciB0aGUgdGltZXN0YW1wLCB0byBrZWVwIGl0IGhvbHkuICBCdXQgZnVkZ2UgaXQgYSBsaXR0bGUuICAqLwotICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wID0gc3RhdGJ1Zi5zdF9tdGltZSArIEFSTUFQX1RJTUVfT0ZGU0VUOwotICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfZGF0ZXBvcyA9IChTQVJNQUcKLQkJCQkgICAgICArIG9mZnNldG9mIChzdHJ1Y3QgYXJfaGRyLCBhcl9kYXRlWzBdKSk7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX3RpbWVzdGFtcCk7Ci0gIHNwcmludGYgKGhkci5hcl91aWQsICIlbGQiLCAobG9uZykgZ2V0dWlkICgpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2dpZCwgIiVsZCIsIChsb25nKSBnZXRnaWQgKCkpOwotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbWFwc2l6ZSk7Ci0gIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgIGlmICgoKGNoYXIgKikgKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAgKCgoY2hhciAqKSAoJmhkcikpW2ldKSA9ICcgJzsKLSAgaWYgKGJmZF93cml0ZSAoKGNoYXIgKikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBiZmRfaF9wdXRfMzIgKGFyY2gsIChiZmRfdm1hKSByYW5saWJzaXplLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgMSwgc2l6ZW9mICh0ZW1wKSwgYXJjaCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgb3JsX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGJ1ZltCU0RfU1lNREVGX1NJWkVdOwotCi0gICAgICBpZiAoKChiZmQgKikgKG1hcFtjb3VudF0pLnBvcykgIT0gbGFzdF9lbHQpCi0JewotCSAgZG8KLQkgICAgewotCSAgICAgIGZpcnN0cmVhbCArPSBhcmVsdF9zaXplIChjdXJyZW50KSArIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0JICAgICAgZmlyc3RyZWFsICs9IGZpcnN0cmVhbCAlIDI7Ci0JICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7Ci0JICAgIH0KLQkgIHdoaWxlIChjdXJyZW50ICE9IChiZmQgKikgKG1hcFtjb3VudF0pLnBvcyk7Ci0JfQkJCS8qIGlmIG5ldyBhcmNoaXZlIGVsZW1lbnQgKi8KLQotICAgICAgbGFzdF9lbHQgPSBjdXJyZW50OwotICAgICAgYmZkX2hfcHV0XzMyIChhcmNoLCBtYXBbY291bnRdLm5hbWlkeCwgYnVmKTsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYXJjaCwgZmlyc3RyZWFsLCBidWYgKyBCU0RfU1lNREVGX09GRlNFVF9TSVpFKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgQlNEX1NZTURFRl9TSVpFLCAxLCBhcmNoKSAhPSBCU0RfU1lNREVGX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBub3cgd3JpdGUgdGhlIHN0cmluZ3MgdGhlbXNlbHZlcyAqLwotICBiZmRfaF9wdXRfMzIgKGFyY2gsIHN0cmluZ3NpemUsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCAxLCBzaXplb2YgKHRlbXApLCBhcmNoKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgb3JsX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKCptYXBbY291bnRdLm5hbWUpICsgMTsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKm1hcFtjb3VudF0ubmFtZSwgMSwgbGVuLCBhcmNoKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3BlYyBzZXogdGhpcyBzaG91bGQgYmUgYSBuZXdsaW5lLiAgQnV0IGluIG9yZGVyIHRvIGJlCi0gICAgIGJ1Zy1jb21wYXRpYmxlIGZvciBzdW4ncyBhciB3ZSB1c2UgYSBudWxsLiAqLwotICBpZiAocGFkaXQpCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZSAoIiIsIDEsIDEsIGFyY2gpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXQgdGhlIGVuZCBvZiBhcmNoaXZlIGZpbGUgaGFuZGxpbmcsIHVwZGF0ZSB0aGUgdGltZXN0YW1wIGluIHRoZQotICAgZmlsZSwgc28gdGhlIGxpbmtlciB3aWxsIGFjY2VwdCBpdC4KLQotICAgUmV0dXJuIHRydWUgaWYgdGhlIHRpbWVzdGFtcCB3YXMgT0ssIG9yIGFuIHVudXN1YWwgcHJvYmxlbSBoYXBwZW5lZC4KLSAgIFJldHVybiBmYWxzZSBpZiB3ZSB1cGRhdGVkIHRoZSB0aW1lc3RhbXAuICAqLwotCi1ib29sZWFuCi1fYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgKGFyY2gpCi0gICAgIGJmZCAqYXJjaDsKLXsKLSAgc3RydWN0IHN0YXQgYXJjaHN0YXQ7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBGbHVzaCB3cml0ZXMsIGdldCBsYXN0LXdyaXRlIHRpbWVzdGFtcCBmcm9tIGZpbGUsIGFuZCBjb21wYXJlIGl0Ci0gICAgIHRvIHRoZSB0aW1lc3RhbXAgSU4gdGhlIGZpbGUuICAqLwotICBiZmRfZmx1c2ggKGFyY2gpOwotICBpZiAoYmZkX3N0YXQgKGFyY2gsICZhcmNoc3RhdCkgPT0gLTEpCi0gICAgewotICAgICAgcGVycm9yIChfKCJSZWFkaW5nIGFyY2hpdmUgZmlsZSBtb2QgdGltZXN0YW1wIikpOwotICAgICAgcmV0dXJuIHRydWU7CQkvKiBDYW4ndCByZWFkIG1vZCB0aW1lIGZvciBzb21lIHJlYXNvbiAqLwotICAgIH0KLSAgaWYgKGFyY2hzdGF0LnN0X210aW1lIDw9IGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF90aW1lc3RhbXApCi0gICAgcmV0dXJuIHRydWU7CQkvKiBPSyBieSB0aGUgbGlua2VyJ3MgcnVsZXMgKi8KLQotICAvKiBVcGRhdGUgdGhlIHRpbWVzdGFtcC4gICovCi0gIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF90aW1lc3RhbXAgPSBhcmNoc3RhdC5zdF9tdGltZSArIEFSTUFQX1RJTUVfT0ZGU0VUOwotCi0gIC8qIFByZXBhcmUgYW4gQVNDSUkgdmVyc2lvbiBzdWl0YWJsZSBmb3Igd3JpdGluZy4gICovCi0gIG1lbXNldCAoaGRyLmFyX2RhdGUsIDAsIHNpemVvZiAoaGRyLmFyX2RhdGUpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoaGRyLmFyX2RhdGUpOyBpKyspCi0gICAgaWYgKGhkci5hcl9kYXRlW2ldID09ICdcMCcpCi0gICAgICAoaGRyLmFyX2RhdGUpW2ldID0gJyAnOwotCi0gIC8qIFdyaXRlIGl0IGludG8gdGhlIGZpbGUuICAqLwotICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfZGF0ZXBvcyA9IChTQVJNQUcKLQkJCQkgICAgICArIG9mZnNldG9mIChzdHJ1Y3QgYXJfaGRyLCBhcl9kYXRlWzBdKSk7Ci0gIGlmIChiZmRfc2VlayAoYXJjaCwgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX2RhdGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlIChoZHIuYXJfZGF0ZSwgc2l6ZW9mIChoZHIuYXJfZGF0ZSksIDEsIGFyY2gpCi0JICAhPSBzaXplb2YgKGhkci5hcl9kYXRlKSkpCi0gICAgewotICAgICAgLyogRklYTUU6IGJmZCBjYW4ndCBjYWxsIHBlcnJvci4gICovCi0gICAgICBwZXJyb3IgKF8oIldyaXRpbmcgdXBkYXRlZCBhcm1hcCB0aW1lc3RhbXAiKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsJCS8qIFNvbWUgZXJyb3Igd2hpbGUgd3JpdGluZyAqLwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7CQkJLyogV2UgdXBkYXRlZCB0aGUgdGltZXN0YW1wIHN1Y2Nlc3NmdWxseS4gICovCi19Ci0MCi0vKiBBIGNvZmYgYXJtYXAgbG9va3MgbGlrZSA6Ci0gICBsQVJNQUcKLSAgIHN0cnVjdCBhcl9oZHIgd2l0aCBuYW1lID0gJy8nCi0gICBudW1iZXIgb2Ygc3ltYm9scwotICAgb2Zmc2V0IG9mIGZpbGUgZm9yIHN5bWJvbCAwCi0gICBvZmZzZXQgb2YgZmlsZSBmb3Igc3ltYm9sIDEKLQotICAgb2Zmc2V0IG9mIGZpbGUgZm9yIHN5bWJvbCBuLTEKLSAgIHN5bWJvbCBuYW1lIDAKLSAgIHN5bWJvbCBuYW1lIDEKLQotICAgc3ltYm9sIG5hbWUgbi0xCi0qLwotCi1ib29sZWFuCi1jb2ZmX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoLCBtYXAsIHN5bWJvbF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSByYW5saWIgaXMgdGhlIG51bWJlciBvZiBleHBvcnRlZCBzeW1ib2xzIGluIHRoZQotICAgICBhcmNoaXZlICogdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIGludCwgKyBhbiBpbnQgZm9yIHRoZSBjb3VudCAqLwotICB1bnNpZ25lZCBpbnQgcmFubGlic2l6ZSA9IChzeW1ib2xfY291bnQgKiA0KSArIDQ7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplID0gc3RyaWR4OwotICB1bnNpZ25lZCBpbnQgbWFwc2l6ZSA9IHN0cmluZ3NpemUgKyByYW5saWJzaXplOwotICBmaWxlX3B0ciBhcmNoaXZlX21lbWJlcl9maWxlX3B0cjsKLSAgYmZkICpjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IHBhZGl0ID0gbWFwc2l6ZSAmIDE7Ci0KLSAgaWYgKHBhZGl0KQotICAgIG1hcHNpemUrKzsKLQotICAvKiB3b3JrIG91dCB3aGVyZSB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUgd2lsbCBnbyBpbiB0aGUgYXJjaGl2ZSAqLwotICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciA9IChtYXBzaXplCi0JCQkgICAgICsgZWxlbmd0aAotCQkJICAgICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikKLQkJCSAgICAgKyBTQVJNQUcpOwotCi0gIG1lbXNldCAoKGNoYXIgKikgKCZoZHIpLCAwLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgaGRyLmFyX25hbWVbMF0gPSAnLyc7Ci0gIHNwcmludGYgKGhkci5hcl9zaXplLCAiJS0xMGQiLCAoaW50KSBtYXBzaXplKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCAobG9uZykgdGltZSAoTlVMTCkpOwotICAvKiBUaGlzLCBhdCBsZWFzdCwgaXMgd2hhdCBJbnRlbCBjb2ZmIHNldHMgdGhlIHZhbHVlcyB0by46ICovCi0gIHNwcmludGYgKChoZHIuYXJfdWlkKSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKChoZHIuYXJfZ2lkKSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKChoZHIuYXJfbW9kZSksICIlLTdvIiwgKHVuc2lnbmVkKSAwKTsKLSAgc3RybmNweSAoaGRyLmFyX2ZtYWcsIEFSRk1BRywgMik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKLSAgICBpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKLSAgICAgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7Ci0KLSAgLyogV3JpdGUgdGhlIGFyIGhlYWRlciBmb3IgdGhpcyBpdGVtIGFuZCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhcmNoKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgKGFyY2gsIHN5bWJvbF9jb3VudCk7Ci0KLSAgLyogVHdvIHBhc3NlcywgZmlyc3Qgd3JpdGUgdGhlIGZpbGUgb2Zmc2V0cyBmb3IgZWFjaCBzeW1ib2wgLQotICAgICByZW1lbWJlcmluZyB0aGF0IGVhY2ggb2Zmc2V0IGlzIG9uIGEgdHdvIGJ5dGUgYm91bmRhcnkuICAqLwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBlYWNoCi0gICAgIHN5bWJvbCwgYW5kIHJlbWVtYmVyIHRvIGtlZXAgdGhlIG9mZnNldHMgcGFkZGVkIG91dC4gICovCi0KLSAgY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgY291bnQgPSAwOwotICB3aGlsZSAoY3VycmVudCAhPSAoYmZkICopIE5VTEwgJiYgY291bnQgPCBzeW1ib2xfY291bnQpCi0gICAgewotICAgICAgLyogRm9yIGVhY2ggc3ltYm9sIHdoaWNoIGlzIHVzZWQgZGVmaW5lZCBpbiB0aGlzIG9iamVjdCwgd3JpdGUgb3V0Ci0JIHRoZSBvYmplY3QgZmlsZSdzIGFkZHJlc3MgaW4gdGhlIGFyY2hpdmUgKi8KLQotICAgICAgd2hpbGUgKCgoYmZkICopIChtYXBbY291bnRdKS5wb3MpID09IGN1cnJlbnQpCi0JewotCSAgYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgKGFyY2gsIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyKTsKLQkgIGNvdW50Kys7Ci0JfQotICAgICAgLyogQWRkIHNpemUgb2YgdGhpcyBhcmNoaXZlIGVudHJ5ICovCi0gICAgICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciArPSAoYXJlbHRfc2l6ZSAoY3VycmVudCkKLQkJCQkgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gICAgICAvKiByZW1lbWJlciBhYm9vdXQgdGhlIGV2ZW4gYWxpZ25tZW50ICovCi0gICAgICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciArPSBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciAlIDI7Ci0gICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKLSAgICB9Ci0KLSAgLyogbm93IHdyaXRlIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMgKi8KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc3ltYm9sX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKCptYXBbY291bnRdLm5hbWUpICsgMTsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKm1hcFtjb3VudF0ubmFtZSwgMSwgbGVuLCBhcmNoKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3BlYyBzZXogdGhpcyBzaG91bGQgYmUgYSBuZXdsaW5lLiAgQnV0IGluIG9yZGVyIHRvIGJlCi0gICAgIGJ1Zy1jb21wYXRpYmxlIGZvciBhcmM5NjAgd2UgdXNlIGEgbnVsbC4gKi8KLSAgaWYgKHBhZGl0KQotICAgIHsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCIiLCAxLCAxLCBhcmNoKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvYXJjaHVyZXMuYyBiL2JmZC9hcmNodXJlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWMyMjNhLi4wMDAwMDAwCi0tLSBhL2JmZC9hcmNodXJlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTA1ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIGFyY2hpdGVjdHVyZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IEpvaG4gR2lsbW9yZSBhbmQgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLS8qCi0KLVNFQ1RJT04KLQlBcmNoaXRlY3R1cmVzCi0KLQlCRkQga2VlcHMgb25lIGF0b20gaW4gYSBCRkQgZGVzY3JpYmluZyB0aGUKLQlhcmNoaXRlY3R1cmUgb2YgdGhlIGRhdGEgYXR0YWNoZWQgdG8gdGhlIEJGRDogYSBwb2ludGVyIHRvIGEKLQk8PGJmZF9hcmNoX2luZm9fdHlwZT4+LiAgCi0KLQlQb2ludGVycyB0byBzdHJ1Y3R1cmVzIGNhbiBiZSByZXF1ZXN0ZWQgaW5kZXBlbmRlbnRseSBvZiBhIEJGRAotCXNvIHRoYXQgYW4gYXJjaGl0ZWN0dXJlJ3MgaW5mb3JtYXRpb24gY2FuIGJlIGludGVycm9nYXRlZAotCXdpdGhvdXQgYWNjZXNzIHRvIGFuIG9wZW4gQkZELgotCi0JVGhlIGFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBieSBlYWNoIGFyY2hpdGVjdHVyZSBwYWNrYWdlLgotCVRoZSBzZXQgb2YgZGVmYXVsdCBhcmNoaXRlY3R1cmVzIGlzIHNlbGVjdGVkIGJ5IHRoZSBtYWNybwotCTw8U0VMRUNUX0FSQ0hJVEVDVFVSRVM+Pi4gIFRoaXMgaXMgbm9ybWFsbHkgc2V0IHVwIGluIHRoZQotCUBmaWxle2NvbmZpZy9AdmFye3RhcmdldH0ubXR9IGZpbGUgb2YgeW91ciBjaG9pY2UuICBJZiB0aGUgbmFtZSBpcyBub3QKLQlkZWZpbmVkLCB0aGVuIGFsbCB0aGUgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0ZWQgYXJlIGluY2x1ZGVkLiAKLQotCVdoZW4gQkZEIHN0YXJ0cyB1cCwgYWxsIHRoZSBhcmNoaXRlY3R1cmVzIGFyZSBjYWxsZWQgd2l0aCBhbgotCWluaXRpYWxpemUgbWV0aG9kLiAgSXQgaXMgdXAgdG8gdGhlIGFyY2hpdGVjdHVyZSBiYWNrIGVuZCB0bwotCWluc2VydCBhcyBtYW55IGl0ZW1zIGludG8gdGhlIGxpc3Qgb2YgYXJjaGl0ZWN0dXJlcyBhcyBpdCB3YW50cyB0bzsKLQlnZW5lcmFsbHkgdGhpcyB3b3VsZCBiZSBvbmUgZm9yIGVhY2ggbWFjaGluZSBhbmQgb25lIGZvciB0aGUKLQlkZWZhdWx0IGNhc2UgKGFuIGl0ZW0gd2l0aCBhIG1hY2hpbmUgZmllbGQgb2YgMCkuIAotCi0JQkZEJ3MgaWRlYSBvZiBhbiBhcmNoaXRlY3R1cmUgaXMgaW1wbGVtZW50ZWQgaW4JQGZpbGV7YXJjaHVyZXMuY30uCi0qLwotCi0vKgotCi1TVUJTRUNUSU9OCi0JYmZkX2FyY2hpdGVjdHVyZQotCi1ERVNDUklQVElPTgotCVRoaXMgZW51bSBnaXZlcyB0aGUgb2JqZWN0IGZpbGUncyBDUFUgYXJjaGl0ZWN0dXJlLCBpbiBhCi0JZ2xvYmFsIHNlbnNlLS0taS5lLiwgd2hhdCBwcm9jZXNzb3IgZmFtaWx5IGRvZXMgaXQgYmVsb25nIHRvPwotCUFub3RoZXIgZmllbGQgaW5kaWNhdGVzIHdoaWNoIHByb2Nlc3NvciB3aXRoaW4KLQl0aGUgZmFtaWx5IGlzIGluIHVzZS4gIFRoZSBtYWNoaW5lIGdpdmVzIGEgbnVtYmVyIHdoaWNoCi0JZGlzdGluZ3Vpc2hlcyBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGFyY2hpdGVjdHVyZSwKLQljb250YWluaW5nLCBmb3IgZXhhbXBsZSwgMiBhbmQgMyBmb3IgSW50ZWwgaTk2MCBLQSBhbmQgaTk2MCBLQiwKLQlhbmQgNjgwMjAgYW5kIDY4MDMwIGZvciBNb3Rvcm9sYSA2ODAyMCBhbmQgNjgwMzAuIAotCi0uZW51bSBiZmRfYXJjaGl0ZWN0dXJlIAotLnsKLS4gIGJmZF9hcmNoX3Vua25vd24sICAgeyogRmlsZSBhcmNoIG5vdCBrbm93biAqfQotLiAgYmZkX2FyY2hfb2JzY3VyZSwgICB7KiBBcmNoIGtub3duLCBub3Qgb25lIG9mIHRoZXNlICp9Ci0uICBiZmRfYXJjaF9tNjhrLCAgICAgIHsqIE1vdG9yb2xhIDY4eHh4ICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9tNjgwMDAgMQotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDA4IDIKLS4jZGVmaW5lIGJmZF9tYWNoX202ODAxMCAzCi0uI2RlZmluZSBiZmRfbWFjaF9tNjgwMjAgNAotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDMwIDUKLS4jZGVmaW5lIGJmZF9tYWNoX202ODA0MCA2Ci0uI2RlZmluZSBiZmRfbWFjaF9tNjgwNjAgNwotLiNkZWZpbmUgYmZkX21hY2hfY3B1MzIgIDgKLS4gIGJmZF9hcmNoX3ZheCwgICAgICAgeyogREVDIFZheCAqfSAgIAotLiAgYmZkX2FyY2hfaTk2MCwgICAgICB7KiBJbnRlbCA5NjAgKn0KLS4gICAgeyogVGhlIG9yZGVyIG9mIHRoZSBmb2xsb3dpbmcgaXMgaW1wb3J0YW50LgotLiAgICAgICBsb3dlciBudW1iZXIgaW5kaWNhdGVzIGEgbWFjaGluZSB0eXBlIHRoYXQgCi0uICAgICAgIG9ubHkgYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCi0uICAgICAgIGF2YWlsYWJsZSB0byBtYWNoaW5lcyB3aXRoIGhpZ2hlciBudW1iZXJzLgotLiAgICAgICBUaGUgZXhjZXB0aW9uIGlzIHRoZSAiY2EiLCB3aGljaCBpcwotLiAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbWFjaGluZXMgZXhjZXB0IAotLiAgICAgICAiY29yZSIuICp9Ci0uCi0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NvcmUgICAgICAxCi0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX2thX3NhICAgICAyCi0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX2tiX3NiICAgICAzCi0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX21jICAgICAgICA0Ci0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX3hhICAgICAgICA1Ci0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NhICAgICAgICA2Ci0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX2p4CSA3Ci0uI2RlZmluZSBiZmRfbWFjaF9pOTYwX2h4ICAgICAgICA4Ci0uCi0uICBiZmRfYXJjaF9hMjlrLCAgICAgIHsqIEFNRCAyOTAwMCAqfQotLiAgYmZkX2FyY2hfc3BhcmMsICAgICB7KiBTUEFSQyAqfQotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmMJCQkxCi0ueyogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB2OHBsdXMgYW5kIHY5IGlzIHRoYXQgdjkgaXMgYSB0cnVlIDY0IGJpdCBlbnYuICAqfQotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQJMgotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlCTMKLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cwkJNAotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjhwbHVzYQkJNSB7KiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUJNgotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjkJCTcKLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5YQkJOCB7KiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICp9Ci0ueyogTm9uemVybyBpZiBNQUNIIGhhcyB0aGUgdjkgaW5zdHJ1Y3Rpb24gc2V0LiAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5X3AobWFjaCkgXAotLiAgKChtYWNoKSA+PSBiZmRfbWFjaF9zcGFyY192OHBsdXMgJiYgKG1hY2gpIDw9IGJmZF9tYWNoX3NwYXJjX3Y5YSkKLS4gIGJmZF9hcmNoX21pcHMsICAgICAgeyogTUlQUyBSeHh4eCAqfQotLiNkZWZpbmUgYmZkX21hY2hfbWlwczMwMDAJCTMwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHMzOTAwCQkzOTAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDAwMAkJNDAwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQwMTAJCTQwMTAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0MTAwCQk0MTAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDExMQkJNDExMQotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQzMDAJCTQzMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0NDAwCQk0NDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDYwMAkJNDYwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQ2NTAJCTQ2NTAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM1MDAwCQk1MDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNjAwMAkJNjAwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczgwMDAJCTgwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHMxMDAwMAkJMTAwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHMxNgkJMTYKLS4gIGJmZF9hcmNoX2kzODYsICAgICAgeyogSW50ZWwgMzg2ICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9pMzg2X2kzODYgMAotLiNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pODA4NiAxCi0uI2RlZmluZSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4IDIKLS4gIGJmZF9hcmNoX3dlMzJrLCAgICAgeyogQVQmVCBXRTMyeHh4ICp9Ci0uICBiZmRfYXJjaF90YWhvZSwgICAgIHsqIENDSS9IYXJyaXMgVGFob2UgKn0KLS4gIGJmZF9hcmNoX2k4NjAsICAgICAgeyogSW50ZWwgODYwICp9Ci0uICBiZmRfYXJjaF9yb21wLCAgICAgIHsqIElCTSBST01QIFBDL1JUICp9Ci0uICBiZmRfYXJjaF9hbGxpYW50LCAgIHsqIEFsbGlhbnQgKn0KLS4gIGJmZF9hcmNoX2NvbnZleCwgICAgeyogQ29udmV4ICp9Ci0uICBiZmRfYXJjaF9tODhrLCAgICAgIHsqIE1vdG9yb2xhIDg4eHh4ICp9Ci0uICBiZmRfYXJjaF9weXJhbWlkLCAgIHsqIFB5cmFtaWQgVGVjaG5vbG9neSAqfQotLiAgYmZkX2FyY2hfaDgzMDAsICAgICB7KiBIaXRhY2hpIEg4LzMwMCAqfQotLiNkZWZpbmUgYmZkX21hY2hfaDgzMDAgICAxCi0uI2RlZmluZSBiZmRfbWFjaF9oODMwMGggIDIKLS4jZGVmaW5lIGJmZF9tYWNoX2g4MzAwcyAgMwotLiAgYmZkX2FyY2hfcG93ZXJwYywgICB7KiBQb3dlclBDICp9Ci0uICBiZmRfYXJjaF9yczYwMDAsICAgIHsqIElCTSBSUy82MDAwICp9Ci0uICBiZmRfYXJjaF9ocHBhLCAgICAgIHsqIEhQIFBBIFJJU0MgKn0KLS4gIGJmZF9hcmNoX2QxMHYsICAgICAgeyogTWl0c3ViaXNoaSBEMTBWICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9kMTB2CQkwCi0uI2RlZmluZSBiZmRfbWFjaF9kMTB2X3RzMgkyCi0uI2RlZmluZSBiZmRfbWFjaF9kMTB2X3RzMwkzCi0uICBiZmRfYXJjaF9kMzB2LCAgICAgIHsqIE1pdHN1YmlzaGkgRDMwViAqfQotLiAgYmZkX2FyY2hfejhrLCAgICAgICB7KiBaaWxvZyBaODAwMCAqfQotLiNkZWZpbmUgYmZkX21hY2hfejgwMDEJCTEKLS4jZGVmaW5lIGJmZF9tYWNoX3o4MDAyCQkyCi0uICBiZmRfYXJjaF9oODUwMCwgICAgIHsqIEhpdGFjaGkgSDgvNTAwICp9Ci0uICBiZmRfYXJjaF9zaCwgICAgICAgIHsqIEhpdGFjaGkgU0ggKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3NoICAgICAgICAgICAgMAotLiNkZWZpbmUgYmZkX21hY2hfc2gzICAgICAgICAweDMwCi0uI2RlZmluZSBiZmRfbWFjaF9zaDNlICAgICAgIDB4M2UKLS4gIGJmZF9hcmNoX2FscGhhLCAgICAgeyogRGVjIEFscGhhICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjQgIDB4MTAKLS4jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NSAgMHgyMAotLiNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY2ICAweDMwCi0uICBiZmRfYXJjaF9hcm0sICAgICAgIHsqIEFkdmFuY2VkIFJpc2MgTWFjaGluZXMgQVJNICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9hcm1fMgkJMQotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzJhCTIKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV8zCQkzCi0uI2RlZmluZSBiZmRfbWFjaF9hcm1fM00gCTQKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV80IAk1Ci0uI2RlZmluZSBiZmRfbWFjaF9hcm1fNFQgCTYKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV81IAk3Ci0uI2RlZmluZSBiZmRfbWFjaF9hcm1fNVQJOAotLiAgYmZkX2FyY2hfbnMzMmssICAgICB7KiBOYXRpb25hbCBTZW1pY29uZHVjdG9ycyBuczMyMDAwICp9Ci0uICBiZmRfYXJjaF93NjUsICAgICAgIHsqIFdEQyA2NTgxNiAqfQotLiAgYmZkX2FyY2hfdGljMzAsICAgICB7KiBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgKn0KLS4gIGJmZF9hcmNoX3RpYzgwLCAgICAgeyogVEkgVE1TMzIwYzgwIChNVlApICp9Ci0uICBiZmRfYXJjaF92ODUwLCAgICAgIHsqIE5FQyBWODUwICp9Ci0uI2RlZmluZSBiZmRfbWFjaF92ODUwICAgICAgICAgIDAKLS4jZGVmaW5lIGJmZF9tYWNoX3Y4NTBlIAknRScKLS4jZGVmaW5lIGJmZF9tYWNoX3Y4NTBlYQknQScKLS4gIGJmZF9hcmNoX2FyYywgICAgICAgeyogQXJnb25hdXQgUklTQyBDb3JlICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9hcmNfYmFzZSAwCi0uICBiZmRfYXJjaF9tMzJyLCAgICAgIHsqIE1pdHN1YmlzaGkgTTMyUi9EICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9tMzJyCQkwIHsqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9tMzJyeAkJJ3gnCi0uICBiZmRfYXJjaF9tbjEwMjAwLCAgIHsqIE1hdHN1c2hpdGEgTU4xMDIwMCAqfQotLiAgYmZkX2FyY2hfbW4xMDMwMCwgICB7KiBNYXRzdXNoaXRhIE1OMTAzMDAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX21uMTAzMDAJCTMwMAotLiNkZWZpbmUgYmZkX21hY2hfYW0zMwkJMzMwCi0uICBiZmRfYXJjaF9mcjMwLAotLiNkZWZpbmUgYmZkX21hY2hfZnIzMAkJMHg0NjUyMzMzMAotLiAgYmZkX2FyY2hfbWNvcmUsCi0uICBiZmRfYXJjaF9waiwKLS4gIGJmZF9hcmNoX2xhc3QKLS4gIH07Ci0KLQotKi8KLQotLyoKLQotU1VCU0VDVElPTgotCWJmZF9hcmNoX2luZm8KLQotREVTQ1JJUFRJT04KLQlUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBhcmNoaXRlY3R1cmVzIGZvciB1c2UKLQl3aXRoaW4gQkZELgotCi0uCi0udHlwZWRlZiBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAKLS57Ci0uICBpbnQgYml0c19wZXJfd29yZDsKLS4gIGludCBiaXRzX3Blcl9hZGRyZXNzOwotLiAgaW50IGJpdHNfcGVyX2J5dGU7Ci0uICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLS4gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLS4gIGNvbnN0IGNoYXIgKmFyY2hfbmFtZTsKLS4gIGNvbnN0IGNoYXIgKnByaW50YWJsZV9uYW1lOwotLiAgdW5zaWduZWQgaW50IHNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0uIHsqIHRydWUgaWYgdGhpcyBpcyB0aGUgZGVmYXVsdCBtYWNoaW5lIGZvciB0aGUgYXJjaGl0ZWN0dXJlICp9Ci0uICBib29sZWFuIHRoZV9kZWZhdWx0OwkKLS4gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogKCpjb21wYXRpYmxlKQotLglQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYSwKLS4JICAgICAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmIpKTsKLS4KLS4gIGJvb2xlYW4gKCpzY2FuKSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLS4KLS4gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICpuZXh0OwotLn0gYmZkX2FyY2hfaW5mb190eXBlOwotKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYTI5a19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYWxwaGFfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FyY19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYXJtX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMTB2X2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMzB2X2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODMwMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaDg1MDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGFfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzODZfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k4NjBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k5NjBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX20zMnJfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX202OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX204OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21pcHNfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAyMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAzMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Bvd2VycGNfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3JzNjAwMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfcGpfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3NoX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9zcGFyY19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdGljMzBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3RpYzgwX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF92YXhfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3dlMzJrX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF96OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX25zMzJrX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF93NjVfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Y4NTBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2ZyMzBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21jb3JlX2FyY2g7Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBjb25zdCBiZmRfYXJjaHVyZXNfbGlzdFtdID0KLXsKLSNpZmRlZiBTRUxFQ1RfQVJDSElURUNUVVJFUwotICBTRUxFQ1RfQVJDSElURUNUVVJFUywKLSNlbHNlCi0gICZiZmRfYTI5a19hcmNoLAotICAmYmZkX2FscGhhX2FyY2gsCi0gICZiZmRfYXJjX2FyY2gsCi0gICZiZmRfYXJtX2FyY2gsCi0gICZiZmRfZDEwdl9hcmNoLAotICAmYmZkX2QzMHZfYXJjaCwKLSAgJmJmZF9oODMwMF9hcmNoLAotICAmYmZkX2g4NTAwX2FyY2gsCi0gICZiZmRfaHBwYV9hcmNoLAotICAmYmZkX2kzODZfYXJjaCwKLSAgJmJmZF9pODYwX2FyY2gsCi0gICZiZmRfaTk2MF9hcmNoLAotICAmYmZkX20zMnJfYXJjaCwKLSAgJmJmZF9tNjhrX2FyY2gsCi0gICZiZmRfbTg4a19hcmNoLAotICAmYmZkX21pcHNfYXJjaCwKLSAgJmJmZF9tbjEwMjAwX2FyY2gsCi0gICZiZmRfbW4xMDMwMF9hcmNoLAotICAmYmZkX3Bvd2VycGNfYXJjaCwKLSAgJmJmZF9yczYwMDBfYXJjaCwKLSAgJmJmZF9zaF9hcmNoLAotICAmYmZkX3NwYXJjX2FyY2gsCi0gICZiZmRfdGljMzBfYXJjaCwKLSAgJmJmZF90aWM4MF9hcmNoLAotICAmYmZkX3ZheF9hcmNoLAotICAmYmZkX3dlMzJrX2FyY2gsCi0gICZiZmRfejhrX2FyY2gsCi0gICZiZmRfbnMzMmtfYXJjaCwKLSAgJmJmZF93NjVfYXJjaCwKLSAgJmJmZF92ODUwX2FyY2gsCi0gICZiZmRfZnIzMF9hcmNoLAotICAmIGJmZF9tY29yZV9hcmNoLAotI2VuZGlmCi0gIDAKLX07Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wcmludGFibGVfbmFtZQotCi1TWU5PUFNJUwotCWNvbnN0IGNoYXIgKmJmZF9wcmludGFibGVfbmFtZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHByaW50YWJsZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUKLQlmcm9tIHRoZSBwb2ludGVyIHRvIHRoZSBhcmNoaXRlY3R1cmUgaW5mbyBzdHJ1Y3R1cmUuCi0KLSovCi0KLWNvbnN0IGNoYXIgKgotYmZkX3ByaW50YWJsZV9uYW1lIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPnByaW50YWJsZV9uYW1lOwotfQotCi0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NjYW5fYXJjaAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYmZkX3NjYW5fYXJjaChjb25zdCBjaGFyICpzdHJpbmcpOwotCi1ERVNDUklQVElPTgotCUZpZ3VyZSBvdXQgaWYgQkZEIHN1cHBvcnRzIGFueSBjcHUgd2hpY2ggY291bGQgYmUgZGVzY3JpYmVkIHdpdGgKLQl0aGUgbmFtZSBAdmFye3N0cmluZ30uICBSZXR1cm4gYSBwb2ludGVyIHRvIGFuIDw8YXJjaF9pbmZvPj4KLQlzdHJ1Y3R1cmUgaWYgYSBtYWNoaW5lIGlzIGZvdW5kLCBvdGhlcndpc2UgTlVMTC4KLQotKi8KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9zY2FuX2FyY2ggKHN0cmluZykKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBjb25zdCAqYXBwLCAqYXA7Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgaW5zdGFsbGVkIGFyY2hpdGVjdHVyZXMgKi8KLSAgZm9yIChhcHAgPSBiZmRfYXJjaHVyZXNfbGlzdDsgKmFwcCAhPSBOVUxMOyBhcHArKykKLSAgICB7Ci0gICAgICBmb3IgKGFwID0gKmFwcDsgYXAgIT0gTlVMTDsgYXAgPSBhcC0+bmV4dCkKLQl7Ci0JICBpZiAoYXAtPnNjYW4gKGFwLCBzdHJpbmcpKQotCSAgICByZXR1cm4gYXA7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9hcmNoX2xpc3QKLQotU1lOT1BTSVMKLQljb25zdCBjaGFyICoqYmZkX2FyY2hfbGlzdCh2b2lkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBmcmVzaGx5IG1hbGxvY2VkIE5VTEwtdGVybWluYXRlZCB2ZWN0b3Igb2YgdGhlIG5hbWVzCi0Jb2YgYWxsIHRoZSB2YWxpZCBCRkQgYXJjaGl0ZWN0dXJlcy4gIERvIG5vdCBtb2RpZnkgdGhlIG5hbWVzLgotCi0qLwotCi1jb25zdCBjaGFyICoqCi1iZmRfYXJjaF9saXN0ICgpCi17Ci0gIGludCB2ZWNfbGVuZ3RoID0gMDsKLSAgY29uc3QgY2hhciAqKm5hbWVfcHRyOwotICBjb25zdCBjaGFyICoqbmFtZV9saXN0OwotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBjb25zdCAqYXBwOwotCi0gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGFyY2hpdGVjdHVyZXMgKi8KLSAgdmVjX2xlbmd0aCA9IDA7Ci0gIGZvciAoYXBwID0gYmZkX2FyY2h1cmVzX2xpc3Q7ICphcHAgIT0gTlVMTDsgYXBwKyspCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcDsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgIHZlY19sZW5ndGgrKzsKLQl9Ci0gICAgfQotCi0gIG5hbWVfbGlzdCA9IChDT05TVCBjaGFyICoqKQotICAgIGJmZF9tYWxsb2MgKCh2ZWNfbGVuZ3RoICsgMSkgKiBzaXplb2YgKGNoYXIgKiopKTsKLSAgaWYgKG5hbWVfbGlzdCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFBvaW50IHRoZSBsaXN0IGF0IGVhY2ggb2YgdGhlIG5hbWVzICovCi0gIG5hbWVfcHRyID0gbmFtZV9saXN0OwotICBmb3IgKGFwcCA9IGJmZF9hcmNodXJlc19saXN0OyAqYXBwICE9IE5VTEw7IGFwcCsrKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXA7Ci0gICAgICBmb3IgKGFwID0gKmFwcDsgYXAgIT0gTlVMTDsgYXAgPSBhcC0+bmV4dCkKLQl7Ci0JICAqbmFtZV9wdHIgPSBhcC0+cHJpbnRhYmxlX25hbWU7Ci0JICBuYW1lX3B0cisrOwotCX0KLSAgICB9Ci0gICpuYW1lX3B0ciA9IE5VTEw7Ci0KLSAgcmV0dXJuIG5hbWVfbGlzdDsKLX0KLQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9hcmNoX2dldF9jb21wYXRpYmxlCi0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiZmRfYXJjaF9nZXRfY29tcGF0aWJsZSgKLQkJY29uc3QgYmZkICphYmZkLAotCSAgICAgICAgY29uc3QgYmZkICpiYmZkKTsKLQotREVTQ1JJUFRJT04KLQlEZXRlcm1pbmUgd2hldGhlciB0d28gQkZEcycKLQlhcmNoaXRlY3R1cmVzIGFuZCBtYWNoaW5lIHR5cGVzIGFyZSBjb21wYXRpYmxlLiAgQ2FsY3VsYXRlcwotCXRoZSBsb3dlc3QgY29tbW9uIGRlbm9taW5hdG9yIGJldHdlZW4gdGhlIHR3byBhcmNoaXRlY3R1cmVzCi0JYW5kIG1hY2hpbmUgdHlwZXMgaW1wbGllZCBieSB0aGUgQkZEcyBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8KLQlhbiA8PGFyY2hfaW5mbz4+IHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBjb21wYXRpYmxlIG1hY2hpbmUuCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUgKGFiZmQsIGJiZmQpCi0gICAgIGNvbnN0IGJmZCAqYWJmZDsKLSAgICAgY29uc3QgYmZkICpiYmZkOwotewotICAvKiBJZiBlaXRoZXIgYXJjaGl0ZWN0dXJlIGlzIHVua25vd24sIHRoZW4gYWxsIHdlIGNhbiBkbyBpcyBhc3N1bWUKLSAgICAgdGhlIHVzZXIga25vd3Mgd2hhdCBoZSdzIGRvaW5nLiAgKi8KLSAgaWYgKGFiZmQtPmFyY2hfaW5mby0+YXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQotICAJcmV0dXJuIGJiZmQtPmFyY2hfaW5mbzsKLSAgaWYgKGJiZmQtPmFyY2hfaW5mby0+YXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQotICAJcmV0dXJuIGFiZmQtPmFyY2hfaW5mbzsKLQotICAvKiBPdGhlcndpc2UgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUgaGFzIHRvIGRlY2lkZS4gICovCi0gIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPmNvbXBhdGlibGUgKGFiZmQtPmFyY2hfaW5mbywgYmJmZC0+YXJjaF9pbmZvKTsKLX0KLQotCi0vKgotSU5URVJOQUxfREVGSU5JVElPTgotCWJmZF9kZWZhdWx0X2FyY2hfc3RydWN0Ci0KLURFU0NSSVBUSU9OCi0JVGhlIDw8YmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q+PiBpcyBhbiBpdGVtIG9mCi0JPDxiZmRfYXJjaF9pbmZvX3R5cGU+PiB3aGljaCBoYXMgYmVlbiBpbml0aWFsaXplZCB0byBhIGZhaXJseQotCWdlbmVyaWMgc3RhdGUuICBBIEJGRCBzdGFydHMgbGlmZSBieSBwb2ludGluZyB0byB0aGlzCi0Jc3RydWN0dXJlLCB1bnRpbCB0aGUgY29ycmVjdCBiYWNrIGVuZCBoYXMgZGV0ZXJtaW5lZCB0aGUgcmVhbAotCWFyY2hpdGVjdHVyZSBvZiB0aGUgZmlsZS4KLQotLmV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0KLSovCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdCA9Ci17Ci0gICAgMzIsMzIsOCxiZmRfYXJjaF91bmtub3duLDAsInVua25vd24iLCJ1bmtub3duIiwyLHRydWUsCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLCAKLSAgICAwLAotfTsKLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9hcmNoX2luZm8KLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9zZXRfYXJjaF9pbmZvKGJmZCAqYWJmZCwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmcpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXJjaGl0ZWN0dXJlIGluZm8gb2YgQHZhcnthYmZkfSB0byBAdmFye2FyZ30uCi0qLwotCi12b2lkCi1iZmRfc2V0X2FyY2hfaW5mbyAoYWJmZCwgYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJnOwotewotICBhYmZkLT5hcmNoX2luZm8gPSBhcmc7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYmZkICphYmZkLAotCQllbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwKLQkJdW5zaWduZWQgbG9uZyBtYWNoKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIGluIEJGRCBAdmFye2FiZmR9Ci0JdG8gQHZhcnthcmNofSBhbmQgQHZhcnttYWNofS4gIEZpbmQgdGhlIGNvcnJlY3QKLQlwb2ludGVyIHRvIGEgc3RydWN0dXJlIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgPDxhcmNoX2luZm8+PgotCXBvaW50ZXIuIAotKi8KLQotYm9vbGVhbgotYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoOwotewotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBjb25zdCAqYXBwLCAqYXA7Ci0KLSAgZm9yIChhcHAgPSBiZmRfYXJjaHVyZXNfbGlzdDsgKmFwcCAhPSBOVUxMOyBhcHArKykKLSAgICB7Ci0gICAgICBmb3IgKGFwID0gKmFwcDsgYXAgIT0gTlVMTDsgYXAgPSBhcC0+bmV4dCkKLQl7Ci0JICBpZiAoYXAtPmFyY2ggPT0gYXJjaAotCSAgICAgICYmIChhcC0+bWFjaCA9PSBtYWNoCi0JCSAgfHwgKG1hY2ggPT0gMCAmJiBhcC0+dGhlX2RlZmF1bHQpKSkKLQkgICAgewotCSAgICAgIGFiZmQtPmFyY2hfaW5mbyA9IGFwOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBhYmZkLT5hcmNoX2luZm8gPSAmYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9hcmNoCi0KLVNZTk9QU0lTCi0JZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGJmZF9nZXRfYXJjaChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgZW51bWVyYXRlZCB0eXBlIHdoaWNoIGRlc2NyaWJlcyB0aGUgQkZEIEB2YXJ7YWJmZH0ncwotCWFyY2hpdGVjdHVyZS4KLQotKi8KLQotZW51bSBiZmRfYXJjaGl0ZWN0dXJlCi1iZmRfZ2V0X2FyY2ggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvLT5hcmNoOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X21hY2gKLQotU1lOT1BTSVMKLQl1bnNpZ25lZCBsb25nIGJmZF9nZXRfbWFjaChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbG9uZyB0eXBlIHdoaWNoIGRlc2NyaWJlcyB0aGUgQkZEIEB2YXJ7YWJmZH0ncwotCW1hY2hpbmUuCi0qLwotCi11bnNpZ25lZCBsb25nICAKLWJmZF9nZXRfbWFjaCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAgIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPm1hY2g7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9hcmNoX2JpdHNfcGVyX2J5dGUKLQotU1lOT1BTSVMKLQl1bnNpZ25lZCBpbnQgYmZkX2FyY2hfYml0c19wZXJfYnl0ZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gb25lIG9mIHRoZSBCRkQgQHZhcnthYmZkfSdzCi0JYXJjaGl0ZWN0dXJlJ3MgYnl0ZXMuCi0KLSovCi0KLXVuc2lnbmVkIGludAotYmZkX2FyY2hfYml0c19wZXJfYnl0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvLT5iaXRzX3Blcl9ieXRlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzCi0KLVNZTk9QU0lTCi0JdW5zaWduZWQgaW50IGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIGluIG9uZSBvZiB0aGUgQkZEIEB2YXJ7YWJmZH0ncwotCWFyY2hpdGVjdHVyZSdzIGFkZHJlc3Nlcy4KLSovCi0KLXVuc2lnbmVkIGludAotYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvLT5iaXRzX3Blcl9hZGRyZXNzOwotfQotCi0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTiAKLQliZmRfZGVmYXVsdF9jb21wYXRpYmxlCi0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiZmRfZGVmYXVsdF9jb21wYXRpYmxlCi0JKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYSwKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmIpOwotCi1ERVNDUklQVElPTgotCVRoZSBkZWZhdWx0IGZ1bmN0aW9uIGZvciB0ZXN0aW5nIGZvciBjb21wYXRpYmlsaXR5LgotKi8KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9kZWZhdWx0X2NvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2gpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGEtPm1hY2ggPiBiLT5tYWNoKQotICAgIHJldHVybiBhOwotCi0gIGlmIChiLT5tYWNoID4gYS0+bWFjaCkKLSAgICByZXR1cm4gYjsKLQotICByZXR1cm4gYTsKLX0KLQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZGVmYXVsdF9zY2FuCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfZGVmYXVsdF9zY2FuKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvLCBjb25zdCBjaGFyICpzdHJpbmcpOwotCi1ERVNDUklQVElPTgotCVRoZSBkZWZhdWx0IGZ1bmN0aW9uIGZvciB3b3JraW5nIG91dCB3aGV0aGVyIHRoaXMgaXMgYW4KLQlhcmNoaXRlY3R1cmUgaGl0IGFuZCBhIG1hY2hpbmUgaGl0LgotKi8KLQotYm9vbGVhbiAKLWJmZF9kZWZhdWx0X3NjYW4gKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgY29uc3QgY2hhciAqcHRyX3NyYzsKLSAgY29uc3QgY2hhciAqcHRyX3RzdDsKLSAgdW5zaWduZWQgbG9uZyBudW1iZXI7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICBjb25zdCBjaGFyICpwcmludGFibGVfbmFtZV9jb2xvbjsKLQotICAvKiBFeGFjdCBtYXRjaCBvZiB0aGUgYXJjaGl0ZWN0dXJlIG5hbWUgKEFSQ0hfTkFNRSkgYW5kIGFsc28gdGhlCi0gICAgIGRlZmF1bHQgYXJjaGl0ZWN0dXJlPyAqLwotICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5hcmNoX25hbWUpID09IDAKLSAgICAgICYmIGluZm8tPnRoZV9kZWZhdWx0KQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEV4YWN0IG1hdGNoIG9mIHRoZSBtYWNoaW5lIG5hbWUgKFBSSU5UQUJMRV9OQU1FKT8gKi8KLSAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZywgaW5mby0+cHJpbnRhYmxlX25hbWUpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gICAgIAotICAvKiBHaXZlbiB0aGF0IHByaW50YWJsZV9uYW1lIGNvbnRhaW5zIG5vIGNvbG9uLCBhdHRlbXB0IHRvIG1hdGNoOgotICAgICBBUkNIX05BTUUgWyAiOiIgXSBQUklOVEFCTEVfTkFNRT8gKi8KLSAgcHJpbnRhYmxlX25hbWVfY29sb24gPSBzdHJjaHIgKGluZm8tPnByaW50YWJsZV9uYW1lLCAnOicpOwotICBpZiAocHJpbnRhYmxlX25hbWVfY29sb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgc3RybGVuX2FyY2hfbmFtZSA9IHN0cmxlbiAoaW5mby0+YXJjaF9uYW1lKTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5hcmNoX25hbWUsIHN0cmxlbl9hcmNoX25hbWUpID09IDApCi0JewotCSAgaWYgKHN0cmluZ1tzdHJsZW5fYXJjaF9uYW1lXSA9PSAnOicpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nICsgc3RybGVuX2FyY2hfbmFtZSArIDEsCi0JCQkgICAgICBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKLQkJcmV0dXJuIHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdHJpbmcgKyBzdHJsZW5fYXJjaF9uYW1lLAotCQkJICAgICAgaW5mby0+cHJpbnRhYmxlX25hbWUpID09IDApCi0JCXJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBHaXZlbiB0aGF0IFBSSU5UQUJMRV9OQU1FIGhhcyB0aGUgZm9ybTogPGFyY2g+ICI6IiA8bWFjaD47Ci0gICAgIEF0dGVtcHQgdG8gbWF0Y2g6IDxhcmNoPiA8bWFjaD4/ICovCi0gIGlmIChwcmludGFibGVfbmFtZV9jb2xvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCBjb2xvbl9pbmRleCA9IHByaW50YWJsZV9uYW1lX2NvbG9uIC0gaW5mby0+cHJpbnRhYmxlX25hbWU7Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKHN0cmluZywgaW5mby0+cHJpbnRhYmxlX25hbWUsIGNvbG9uX2luZGV4KSA9PSAwCi0JICAmJiBzdHJjYXNlY21wIChzdHJpbmcgKyBjb2xvbl9pbmRleCwKLQkJCSBpbmZvLT5wcmludGFibGVfbmFtZSArIGNvbG9uX2luZGV4ICsgMSkgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogR2l2ZW4gdGhhdCBQUklOVEFCTEVfTkFNRSBoYXMgdGhlIGZvcm06IDxhcmNoPiAiOiIgPG1hY2g+OyBEbyBub3QKLSAgICAgYXR0ZW1wdCB0byBtYXRjaCBqdXN0IDxtYWNoPiwgaXQgY291bGQgYmUgYW1iaWdpb3VzLiAgVGhpcyB0ZXN0Ci0gICAgIGlzIGxlZnQgdW50aWwgbGF0ZXIuICovCi0KLSAgLyogTk9URTogVGhlIGJlbG93IGlzIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IG9ubHkuIFBsZWFzZSBkbyBub3QKLSAgICAgYWRkIHRvIHRoaXMgY29kZSAqLwotCi0gIC8qIFNlZSBob3cgbXVjaCBvZiB0aGUgc3VwcGxpZWQgc3RyaW5nIG1hdGNoZXMgd2l0aCB0aGUKLSAgICAgYXJjaGl0ZWN0dXJlLCBlZyB0aGUgc3RyaW5nIG02OGs6NjgwMjAgd291bGQgbWF0Y2ggdGhlIDY4ayBlbnRyeQotICAgICB1cCB0byB0aGUgOiwgdGhlbiB3ZSBnZXQgbGVmdCB3aXRoIHRoZSBtYWNoaW5lIG51bWJlciAqLwotCi0gIGZvciAocHRyX3NyYyA9IHN0cmluZywgcHRyX3RzdCA9IGluZm8tPmFyY2hfbmFtZTsgCi0gICAgICAgKnB0cl9zcmMgJiYgKnB0cl90c3Q7Ci0gICAgICAgcHRyX3NyYysrLCBwdHJfdHN0KyspIAotICAgIHsKLSAgICAgIGlmICgqcHRyX3NyYyAhPSAqcHRyX3RzdCkgYnJlYWs7Ci0gICAgfQotCi0gIC8qIENoZXdlZCB1cCBhcyBtdWNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgYXMgd2lsbCBtYXRjaCwgc2tpcCBhbnkKLSAgICAgY29sb25zICovCi0gIGlmICgqcHRyX3NyYyA9PSAnOicpCi0gICAgcHRyX3NyYysrOwotICAKLSAgaWYgKCpwdHJfc3JjID09IDApCi0gICAgewotICAgICAgLyogbm90aGluZyBtb3JlLCB0aGVuIG9ubHkga2VlcCB0aGlzIG9uZSBpZiBpdCBpcyB0aGUgZGVmYXVsdAotCSBtYWNoaW5lIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLwotICAgICAgcmV0dXJuIGluZm8tPnRoZV9kZWZhdWx0OwotICAgIH0KLQotICBudW1iZXIgPSAwOwotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwdHJfc3JjKSkKLSAgICB7Ci0gICAgICBudW1iZXIgPSBudW1iZXIgKiAxMCArICpwdHJfc3JjICAtICcwJzsKLSAgICAgIHB0cl9zcmMrKzsKLSAgICB9Ci0KLSAgLyogTk9URTogVGhlIGJlbG93IGlzIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IG9ubHkuCi0gICAgIFBMRUFTRSBETyBOT1QgQUREIFRPIFRISVMgQ09ERS4gKi8KLQotICBzd2l0Y2ggKG51bWJlcikgCi0gICAgewotICAgICAgLyogRklYTUU6IFRoZXNlIGFyZSBuZWVkZWQgdG8gcGFyc2UgSUVFRSBvYmplY3RzLiAgKi8KLSAgICBjYXNlIDY4MDAwOiAKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODAxMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODAyMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDIwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODAzMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDMwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODA0MDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDQwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODA2MDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbTY4MDYwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2ODMzMjoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfY3B1MzI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzIwMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfd2UzMms7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzAwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbWlwczMwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDAwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgICAgbnVtYmVyID0gYmZkX21hY2hfbWlwczQwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNjAwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9yczYwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6ICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGFyY2ggIT0gaW5mby0+YXJjaCkgCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChudW1iZXIgIT0gaW5mby0+bWFjaCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9hcmNoX2luZm8KLQotU1lOT1BTSVMKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBiZmRfZ2V0X2FyY2hfaW5mbyhiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgYXJjaGl0ZWN0dXJlIGluZm8gc3RydWN0IGluIEB2YXJ7YWJmZH0uCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mbzsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfbG9va3VwX2FyY2gKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmJmZF9sb29rdXBfYXJjaAotCQkoZW51bSBiZmRfYXJjaGl0ZWN0dXJlCi0JCWFyY2gsCi0JCXVuc2lnbmVkIGxvbmcgbWFjaGluZSk7Ci0KLURFU0NSSVBUSU9OCi0JTG9vayBmb3IgdGhlIGFyY2hpdGVjdXJlIGluZm8gc3RydWN0dXJlIHdoaWNoIG1hdGNoZXMgdGhlCi0JYXJndW1lbnRzIEB2YXJ7YXJjaH0gYW5kIEB2YXJ7bWFjaGluZX0uIEEgbWFjaGluZSBvZiAwIG1hdGNoZXMgdGhlCi0JbWFjaGluZS9hcmNoaXRlY3R1cmUgc3RydWN0dXJlIHdoaWNoIG1hcmtzIGl0c2VsZiBhcyB0aGUKLQlkZWZhdWx0LgotKi8KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogCi1iZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2hpbmUpCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0ICphcHAsICphcDsKLQotICBmb3IgKGFwcCA9IGJmZF9hcmNodXJlc19saXN0OyAqYXBwICE9IE5VTEw7IGFwcCsrKQotICAgIHsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgIGlmIChhcC0+YXJjaCA9PSBhcmNoCi0JICAgICAgJiYgKGFwLT5tYWNoID09IG1hY2hpbmUKLQkJICB8fCAobWFjaGluZSA9PSAwICYmIGFwLT50aGVfZGVmYXVsdCkpKQotCSAgICByZXR1cm4gYXA7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfcHJpbnRhYmxlX2FyY2hfbWFjaAotCi1TWU5PUFNJUwotCWNvbnN0IGNoYXIgKmJmZF9wcmludGFibGVfYXJjaF9tYWNoCi0JCShlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwgdW5zaWduZWQgbG9uZyBtYWNoaW5lKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBwcmludGFibGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYXJjaGl0ZWN0dXJlIGFuZAotCW1hY2hpbmUgdHlwZS4gCi0KLQlUaGlzIHJvdXRpbmUgaXMgZGVwcmVjaWF0ZWQuCi0qLwotCi1jb25zdCBjaGFyICoKLWJmZF9wcmludGFibGVfYXJjaF9tYWNoIChhcmNoLCBtYWNoaW5lKQotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXAgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2hpbmUpOwotCi0gICAgaWYgKGFwKQotICAgICAgcmV0dXJuIGFwLT5wcmludGFibGVfbmFtZTsKLSAgICByZXR1cm4gIlVOS05PV04hIjsKLX0KZGlmZiAtLWdpdCBhL2JmZC9hcm1uZXRic2QuYyBiL2JmZC9hcm1uZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2ZWU0Ny4uMDAwMDAwMAotLS0gYS9iZmQvYXJtbmV0YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC9BUk0gYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZQlCWVRFU19JTl9XT1JECQk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZQlERUZBVUxUX0FSQ0gJCWJmZF9hcmNoX2FybQotI2RlZmluZQlERUZBVUxUX01JRCAJCU1fQVJNNl9ORVRCU0QKLS8qI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9BUk02X05FVEJTRCkqLwotCi0jZGVmaW5lIE1ZKE9QKSAJCQlDQVQgKGFybW5ldGJzZF8sIE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAJCSJhLm91dC1hcm0tbmV0YnNkIgotCi0jaWYgMAotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhhb3V0YXJtLF8zMl8seSkKLQotI2RlZmluZSBhb3V0YXJtXzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLQotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYW91dGFybV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImJmZC5oIgkJLyogVG8gZW5zdXJlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiBpcyBPSyAqLwotCi1DT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICoKLU1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiBhYmZkIEFORAotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLSNlbmRpZgotCi0jaW5jbHVkZSAibmV0YnNkLmgiCmRpZmYgLS1naXQgYS9iZmQvYmZkLWluLmggYi9iZmQvYmZkLWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZmY3ZGQuLjAwMDAwMDAKLS0tIGEvYmZkL2JmZC1pbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzI3ICswLDAgQEAKLS8qIE1haW4gaGVhZGVyIGZpbGUgZm9yIHRoZSBiZmQgbGlicmFyeSAtLSBwb3J0YWJsZSBhY2Nlc3MgdG8gb2JqZWN0IGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogYmZkLmggYW5kIGJmZC1pbjIuaCBhcmUgR0VORVJBVEVEIGZpbGVzLiAgRG9uJ3QgY2hhbmdlIHRoZW07Ci0qKiBpbnN0ZWFkLCBjaGFuZ2UgYmZkLWluLmggb3IgdGhlIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMgcHJvY2Vzc2VkIHRvCi0qKiBnZW5lcmF0ZSB0aGVzZSBmaWxlcy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBiZmQuaCAtLSBUaGUgb25seSBoZWFkZXIgZmlsZSByZXF1aXJlZCBieSB1c2VycyBvZiB0aGUgYmZkIGxpYnJhcnkgCi0KLVRoZSBiZmQuaCBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIGJmZC1pbi5oIGFuZCB2YXJpb3VzIC5jIGZpbGVzOyBpZiB5b3UKLWNoYW5nZSBpdCwgeW91ciBjaGFuZ2VzIHdpbGwgcHJvYmFibHkgYmUgbG9zdC4KLQotQWxsIHRoZSBwcm90b3R5cGVzIGFuZCBkZWZpbml0aW9ucyBmb2xsb3dpbmcgdGhlIGNvbW1lbnQgIlRIRSBGT0xMT1dJTkcKLUlTIEVYVFJBQ1RFRCBGUk9NIFRIRSBTT1VSQ0UiIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgc291cmNlIGZpbGVzIGZvcgotQkZELiAgSWYgeW91IGNoYW5nZSBpdCwgc29tZW9uZSBvbmVkYXkgd2lsbCBleHRyYWN0IGl0IGZyb20gdGhlIHNvdXJjZQotYWdhaW4sIGFuZCB5b3VyIGNoYW5nZXMgd2lsbCBiZSBsb3N0LiAgVG8gc2F2ZSB5b3Vyc2VsZiBmcm9tIHRoaXMgYmluZCwKLWNoYW5nZSB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIHNvdXJjZSBpbiB0aGUgYmZkIGRpcmVjdG9yeS4gIFR5cGUgIm1ha2UKLWRvY3MiIGFuZCB0aGVuICJtYWtlIGhlYWRlcnMiIGluIHRoYXQgZGlyZWN0b3J5LCBhbmQgbWFnaWNhbGx5IHRoaXMgZmlsZQotd2lsbCBjaGFuZ2UgdG8gcmVmbGVjdCB5b3VyIGNoYW5nZXMuCi0KLUlmIHlvdSBkb24ndCBoYXZlIHRoZSB0b29scyB0byBwZXJmb3JtIHRoZSBleHRyYWN0aW9uLCB0aGVuIHlvdSBhcmUKLXNhZmUgZnJvbSBzb21lb25lIG9uIHlvdXIgc3lzdGVtIHRyYW1wbGluZyBvdmVyIHlvdXIgaGVhZGVyIGZpbGVzLgotWW91IHNob3VsZCBzdGlsbCBtYWludGFpbiB0aGUgZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0aGlzCi1maWxlIHRob3VnaDsgZXZlcnkgY2hhbmdlIHlvdSBtYWtlIHRvIHRoZSAuYyBmaWxlIHNob3VsZCBiZSByZWZsZWN0ZWQKLWhlcmUuICAqLwotCi0jaWZuZGVmIF9fQkZEX0hfU0VFTl9fCi0jZGVmaW5lIF9fQkZEX0hfU0VFTl9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFRoZXNlIHR3byBsaW5lcyBnZXQgc3Vic3RpdHV0aW9ucyBkb25lIGJ5IGNvbW1hbmRzIGluIE1ha2VmaWxlLmluLiAgKi8KLSNkZWZpbmUgQkZEX1ZFUlNJT04gICJAVkVSU0lPTkAiCi0jZGVmaW5lIEJGRF9BUkNIX1NJWkUgQHdvcmRzaXplQAotI2RlZmluZSBCRkRfSE9TVF82NEJJVF9MT05HIEBCRkRfSE9TVF82NEJJVF9MT05HQAotI2lmIEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKLSNkZWZpbmUgQkZEX0hPU1RfNjRfQklUIEBCRkRfSE9TVF82NF9CSVRACi0jZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIEBCRkRfSE9TVF9VXzY0X0JJVEAKLSNlbmRpZgotCi0jaWYgQkZEX0FSQ0hfU0laRSA+PSA2NAotI2RlZmluZSBCRkQ2NAotI2VuZGlmCi0KLSNpZm5kZWYgSU5MSU5FCi0jaWYgX19HTlVDX18gPj0gMgotI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi10eXBlZGVmIHN0cnVjdCBfYmZkIGJmZDsKLQotLyogVG8gc3F1ZWxjaCBlcnJvbmVvdXMgY29tcGlsZXIgd2FybmluZ3MgKCJpbGxlZ2FsIHBvaW50ZXIKLSAgIGNvbWJpbmF0aW9uIikgZnJvbSB0aGUgU1ZSMyBjb21waWxlciwgd2Ugd291bGQgbGlrZSB0byB0eXBlZGVmCi0gICBib29sZWFuIHRvIGludCAoaXQgZG9lc24ndCBsaWtlIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYm9vbGVhbi4KLSAgIE1ha2luZyBzdXJlIHRoZXkgYXJlIG5ldmVyIGltcGxpY2l0bHkgZGVjbGFyZWQgdG8gcmV0dXJuIGludAotICAgZG9lc24ndCBzZWVtIHRvIGhlbHApLiAgQnV0IHRoaXMgZmlsZSBpcyBub3QgY29uZmlndXJlZCBiYXNlZCBvbgotICAgdGhlIGhvc3QuICAqLwotLyogR2VuZXJhbCBydWxlczogZnVuY3Rpb25zIHdoaWNoIGFyZSBib29sZWFuIHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MKLSAgIGFuZCBmYWxzZSBvbiBmYWlsdXJlICh1bmxlc3MgdGhleSdyZSBhIHByZWRpY2F0ZSkuICAgLS0gYmZkLmRvYyAqLwotLyogSSdtIHN1cmUgdGhpcyBpcyBnb2luZyB0byBicmVhayBzb21ldGhpbmcgYW5kIHNvbWVvbmUgaXMgZ29pbmcgdG8KLSAgIGZvcmNlIG1lIHRvIGNoYW5nZSBpdC4gKi8KLS8qIHR5cGVkZWYgZW51bSBib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsgKi8KLS8qIFl1cCwgU1ZSNCBoYXMgYSAidHlwZWRlZiBlbnVtIGJvb2xlYW4iIGluIDxzeXMvdHlwZXMuaD4gIC1mbmYgKi8KLS8qIEl0IGdldHMgd29yc2UgaWYgdGhlIGhvc3QgYWxzbyBkZWZpbmVzIGEgdHJ1ZS9mYWxzZSBlbnVtLi4uIC1zdHMgKi8KLS8qIEFuZCBldmVuIHdvcnNlIGlmIHlvdXIgY29tcGlsZXIgaGFzIGJ1aWx0LWluIGJvb2xlYW4gdHlwZXMuLi4gLWxhdyAqLwotI2lmIGRlZmluZWQgKF9fR05VR19fKSAmJiAoX19HTlVDX01JTk9SX18gPiA1KQotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmCi0jaWZkZWYgTVBXCi0vKiBQcmUtZW1wdGl2ZSBzdHJpa2UgLSBnZXQgdGhlIGZpbGUgd2l0aCB0aGUgZW51bS4gKi8KLSNpbmNsdWRlIDxUeXBlcy5oPgotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmIC8qIE1QVyAqLwotI2lmbmRlZiBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotdHlwZWRlZiBlbnVtIGJmZF9ib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsKLSNkZWZpbmUgQkZEX1RSVUVfRkFMU0UKLSNlbHNlCi0vKiBVc2UgZW51bSBuYW1lcyB0aGF0IHdpbGwgYXBwZWFyIG5vd2hlcmUgZWxzZS4gICovCi10eXBlZGVmIGVudW0gYmZkX2Jvb2xlYW4ge2JmZF9mZmZhbHNlLCBiZmRfdHR0cnVlfSBib29sZWFuOwotI2VuZGlmCi0KLS8qIEEgcG9pbnRlciB0byBhIHBvc2l0aW9uIGluIGEgZmlsZS4gICovCi0vKiBGSVhNRTogIFRoaXMgc2hvdWxkIGJlIHVzaW5nIG9mZl90IGZyb20gPHN5cy90eXBlcy5oPi4KLSAgIEZvciBub3csIHRyeSB0byBhdm9pZCBicmVha2luZyBzdHVmZiBieSBub3QgaW5jbHVkaW5nIDxzeXMvdHlwZXMuaD4gaGVyZS4KLSAgIFRoaXMgd2lsbCBicmVhayBvbiBzeXN0ZW1zIHdpdGggNjQtYml0IGZpbGUgb2Zmc2V0cyAoZS5nLiA0LjRCU0QpLgotICAgUHJvYmFibHkgdGhlIGJlc3QgbG9uZy10ZXJtIGFuc3dlciBpcyB0byBhdm9pZCB1c2luZyBmaWxlX3B0ciBBTkQgb2ZmX3QgCi0gICBpbiB0aGlzIGhlYWRlciBmaWxlLCBhbmQgdG8gaGFuZGxlIHRoaXMgaW4gdGhlIEJGRCBpbXBsZW1lbnRhdGlvbgotICAgcmF0aGVyIHRoYW4gaW4gaXRzIGludGVyZmFjZS4gICovCi0vKiB0eXBlZGVmIG9mZl90CWZpbGVfcHRyOyAqLwotdHlwZWRlZiBsb25nIGludCBmaWxlX3B0cjsKLQotLyogU3VwcG9ydCBmb3IgZGlmZmVyZW50IHNpemVzIG9mIHRhcmdldCBmb3JtYXQgaW50cyBhbmQgYWRkcmVzc2VzLgotICAgSWYgdGhlIHR5cGUgYGxvbmcnIGlzIGF0IGxlYXN0IDY0IGJpdHMsIEJGRF9IT1NUXzY0QklUX0xPTkcgd2lsbCBiZQotICAgc2V0IHRvIDEgYWJvdmUuICBPdGhlcndpc2UsIGlmIGdjYyBpcyBiZWluZyB1c2VkLCB0aGlzIGNvZGUgd2lsbAotICAgdXNlIGdjYydzICJsb25nIGxvbmciIHR5cGUuICBPdGhlcndpc2UsIEJGRF9IT1NUXzY0X0JJVCBtdXN0IGJlCi0gICBkZWZpbmVkIGFib3ZlLiAgKi8KLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSMgaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotIyAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nCi0jICBkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgdW5zaWduZWQgbG9uZwotIyBlbHNlCi0jICBpZmRlZiBfX0dOVUNfXwotIyAgIGlmIF9fR05VQ19fID49IDIKLSMgICAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nIGxvbmcKLSMgICAgZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIHVuc2lnbmVkIGxvbmcgbG9uZwotIyAgIGVuZGlmIC8qIF9fR05VQ19fID49IDIgKi8KLSMgIGVuZGlmIC8qICEgZGVmaW5lZCAoX19HTlVDX18pICovCi0jIGVuZGlmIC8qICEgQkZEX0hPU1RfNjRCSVRfTE9ORyAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0hPU1RfNjRfQklUKSAqLwotCi0jaWZkZWYgQkZENjQKLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSAjZXJyb3IgTm8gNjQgYml0IGludGVnZXIgdHlwZSBhdmFpbGFibGUKLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9IT1NUXzY0X0JJVCkgKi8KLQotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBiZmRfdm1hOwotdHlwZWRlZiBCRkRfSE9TVF82NF9CSVQgYmZkX3NpZ25lZF92bWE7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIGJmZF9zaXplX3R5cGU7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIHN5bXZhbHVlOwotCi0jaWZuZGVmIGZwcmludGZfdm1hCi0jaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYgKHMsICIlMDE2bHgiLCB4KQotI2RlZmluZSBmcHJpbnRmX3ZtYShmLHgpIGZwcmludGYgKGYsICIlMDE2bHgiLCB4KQotI2Vsc2UKLSNkZWZpbmUgX2JmZF9pbnQ2NF9sb3coeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSAmIDB4ZmZmZmZmZmYpKSkKLSNkZWZpbmUgX2JmZF9pbnQ2NF9oaWdoKHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgPj4gMzIpICYgMHhmZmZmZmZmZikpCi0jZGVmaW5lIGZwcmludGZfdm1hKHMseCkgXAotICBmcHJpbnRmICgocyksICIlMDhseCUwOGx4IiwgX2JmZF9pbnQ2NF9oaWdoICh4KSwgX2JmZF9pbnQ2NF9sb3cgKHgpKQotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIFwKLSAgc3ByaW50ZiAoKHMpLCAiJTA4bHglMDhseCIsIF9iZmRfaW50NjRfaGlnaCAoeCksIF9iZmRfaW50NjRfbG93ICh4KSkKLSNlbmRpZgotI2VuZGlmCi0KLSNlbHNlIC8qIG5vdCBCRkQ2NCAgKi8KLQotLyogUmVwcmVzZW50IGEgdGFyZ2V0IGFkZHJlc3MuICBBbHNvIHVzZWQgYXMgYSBnZW5lcmljIHVuc2lnbmVkIHR5cGUKLSAgIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueSBhcml0aG1ldGljIHR5cGVzCi0gICB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgYmZkX3ZtYTsKLQotLyogQSBnZW5lcmljIHNpZ25lZCB0eXBlIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueQotICAgYXJpdGhtZXRpYyB0eXBlcyB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gIENhbiBiZSBhc3N1bWVkIHRvIGJlIGNvbXBhdGlibGUKLSAgIHdpdGggYmZkX3ZtYSBpbiB0aGUgc2FtZSB3YXkgdGhhdCBzaWduZWQgYW5kIHVuc2lnbmVkIGludHMgYXJlIGNvbXBhdGlibGUKLSAgIChhcyBwYXJhbWV0ZXJzLCBpbiBhc3NpZ25tZW50LCBldGMpLiAgKi8KLXR5cGVkZWYgbG9uZyBiZmRfc2lnbmVkX3ZtYTsKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bXZhbHVlOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGJmZF9zaXplX3R5cGU7Ci0KLS8qIFByaW50IGEgYmZkX3ZtYSB4IG9uIHN0cmVhbSBzLiAgKi8KLSNkZWZpbmUgZnByaW50Zl92bWEocyx4KSBmcHJpbnRmKHMsICIlMDhseCIsIHgpCi0jZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZihzLCAiJTA4bHgiLCB4KQotCi0jZW5kaWYgLyogbm90IEJGRDY0ICAqLwotCi0jZGVmaW5lIHByaW50Zl92bWEoeCkgZnByaW50Zl92bWEoc3Rkb3V0LHgpCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IGZsYWd3b3JkOwkvKiAzMiBiaXRzIG9mIGZsYWdzICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYmZkX2J5dGU7Ci0MCi0vKiogRmlsZSBmb3JtYXRzICovCi0KLXR5cGVkZWYgZW51bSBiZmRfZm9ybWF0IHsKLQkgICAgICBiZmRfdW5rbm93biA9IDAsCS8qIGZpbGUgZm9ybWF0IGlzIHVua25vd24gKi8KLQkgICAgICBiZmRfb2JqZWN0LAkvKiBsaW5rZXIvYXNzZW1iZXIvY29tcGlsZXIgb3V0cHV0ICovCi0JICAgICAgYmZkX2FyY2hpdmUsCS8qIG9iamVjdCBhcmNoaXZlIGZpbGUgKi8KLQkgICAgICBiZmRfY29yZSwJCS8qIGNvcmUgZHVtcCAqLwotCSAgICAgIGJmZF90eXBlX2VuZH0JLyogbWFya3MgdGhlIGVuZDsgZG9uJ3QgdXNlIGl0ISAqLwotICAgICAgICAgYmZkX2Zvcm1hdDsKLQotLyogVmFsdWVzIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBCRkQuICBUaGVzZSBhbHNvCi0gICBhcHBlYXIgaW4gdGhlIG9iamVjdF9mbGFncyBmaWVsZCBvZiB0aGUgYmZkX3RhcmdldCBzdHJ1Y3R1cmUsIHdoZXJlCi0gICB0aGV5IGluZGljYXRlIHRoZSBzZXQgb2YgZmxhZ3MgdXNlZCBieSB0aGF0IGJhY2tlbmQgKG5vdCBhbGwgZmxhZ3MKLSAgIGFyZSBtZWFuaW5nZnVsIGZvciBhbGwgb2JqZWN0IGZpbGUgZm9ybWF0cykgKEZJWE1FOiBhdCB0aGUgbW9tZW50LAotICAgdGhlIG9iamVjdF9mbGFncyB2YWx1ZXMgaGF2ZSBtb3N0bHkganVzdCBiZWVuIGNvcGllZCBmcm9tIGJhY2tlbmQKLSAgIHRvIGFub3RoZXIsIGFuZCBhcmUgbm90IG5lY2Vzc2FyaWx5IGNvcnJlY3QpLiAgKi8KLQotLyogTm8gZmxhZ3MuICAqLwotI2RlZmluZSBCRkRfTk9fRkxBR1MgICAJMHgwMAotCi0vKiBCRkQgY29udGFpbnMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLSNkZWZpbmUgSEFTX1JFTE9DICAgCTB4MDEKLQotLyogQkZEIGlzIGRpcmVjdGx5IGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBFWEVDX1AgICAgICAJMHgwMgotCi0vKiBCRkQgaGFzIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MTk5PIGluIGEKLSAgIENPRkYgaGVhZGVyKS4gICovCi0jZGVmaW5lIEhBU19MSU5FTk8gIAkweDA0Ci0KLS8qIEJGRCBoYXMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgSEFTX0RFQlVHICAgCTB4MDgKLQotLyogQkZEIGhhcyBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgSEFTX1NZTVMgICAgCTB4MTAKLQotLyogQkZEIGhhcyBsb2NhbCBzeW1ib2xzIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MU1lNUyBpbiBhIENPRkYKLSAgIGhlYWRlcikuICAqLwotI2RlZmluZSBIQVNfTE9DQUxTICAJMHgyMAotCi0vKiBCRkQgaXMgYSBkeW5hbWljIG9iamVjdC4gICovCi0jZGVmaW5lIERZTkFNSUMgICAgIAkweDQwCi0KLS8qIFRleHQgc2VjdGlvbiBpcyB3cml0ZSBwcm90ZWN0ZWQgKGlmIERfUEFHRUQgaXMgbm90IHNldCwgdGhpcyBpcwotICAgbGlrZSBhbiBhLm91dCBOTUFHSUMgZmlsZSkgKHRoZSBsaW5rZXIgc2V0cyB0aGlzIGJ5IGRlZmF1bHQsIGJ1dAotICAgY2xlYXJzIGl0IGZvciAtciBvciAtTikuICAqLwotI2RlZmluZSBXUF9URVhUICAgICAJMHg4MAotCi0vKiBCRkQgaXMgZHluYW1pY2FsbHkgcGFnZWQgKHRoaXMgaXMgbGlrZSBhbiBhLm91dCBaTUFHSUMgZmlsZSkgKHRoZQotICAgbGlua2VyIHNldHMgdGhpcyBieSBkZWZhdWx0LCBidXQgY2xlYXJzIGl0IGZvciAtciBvciAtbiBvciAtTikuICAqLwotI2RlZmluZSBEX1BBR0VEICAgICAJMHgxMDAKLQotLyogQkZEIGlzIHJlbGF4YWJsZSAodGhpcyBtZWFucyB0aGF0IGJmZF9yZWxheF9zZWN0aW9uIG1heSBiZSBhYmxlIHRvCi0gICBkbyBzb21ldGhpbmcpIChzb21ldGltZXMgYmZkX3JlbGF4X3NlY3Rpb24gY2FuIGRvIHNvbWV0aGluZyBldmVuIGlmCi0gICB0aGlzIGlzIG5vdCBzZXQpLiAgKi8KLSNkZWZpbmUgQkZEX0lTX1JFTEFYQUJMRSAweDIwMAotCi0vKiBUaGlzIG1heSBiZSBzZXQgYmVmb3JlIHdyaXRpbmcgb3V0IGEgQkZEIHRvIHJlcXVlc3QgdXNpbmcgYQotICAgdHJhZGl0aW9uYWwgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgdXNlZCB0byByZXF1ZXN0IHRoYXQgd2hlbgotICAgd3JpdGluZyBvdXQgYW4gYS5vdXQgb2JqZWN0IHRoZSBzeW1ib2xzIG5vdCBiZSBoYXNoZWQgdG8gZWxpbWluYXRlCi0gICBkdXBsaWNhdGVzLiAgKi8KLSNkZWZpbmUgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCAweDQwMAotCi0vKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIEJGRCBjb250ZW50cyBhcmUgYWN0dWFsbHkgY2FjaGVkIGluCi0gICBtZW1vcnkuICBJZiB0aGlzIGlzIHNldCwgaW9zdHJlYW0gcG9pbnRzIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqLwotI2RlZmluZSBCRkRfSU5fTUVNT1JZIDB4ODAwCi0MCi0vKiBzeW1ib2xzIGFuZCByZWxvY2F0aW9uICovCi0KLS8qIEEgY291bnQgb2YgY2Fyc3ltcyAoY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9scykuICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bWluZGV4OwotCi0vKiBIb3cgdG8gcGVyZm9ybSBhIHJlbG9jYXRpb24uICAqLwotdHlwZWRlZiBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0IHJlbG9jX2hvd3RvX3R5cGU7Ci0KLSNkZWZpbmUgQkZEX05PX01PUkVfU1lNQk9MUyAoKHN5bWluZGV4KSB+MCkKLQotLyogR2VuZXJhbCBwdXJwb3NlIHBhcnQgb2YgYSBzeW1ib2wgWDsKLSAgIHRhcmdldCBzcGVjaWZpYyBwYXJ0cyBhcmUgaW4gbGliY29mZi5oLCBsaWJhb3V0LmgsIGV0Yy4gICovCi0KLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uKHgpICgoeCktPnNlY3Rpb24pCi0jZGVmaW5lIGJmZF9nZXRfb3V0cHV0X3NlY3Rpb24oeCkgKCh4KS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbih4LHkpICgoeCktPnNlY3Rpb24pID0gKHkpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2Jhc2UoeCkgKCh4KS0+c2VjdGlvbi0+dm1hKQotI2RlZmluZSBiZmRfYXN5bWJvbF92YWx1ZSh4KSAoYmZkX2FzeW1ib2xfYmFzZSh4KSArICh4KS0+dmFsdWUpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX25hbWUoeCkgKCh4KS0+bmFtZSkKLS8qUGVyaGFwcyBmdXR1cmU6ICNkZWZpbmUgYmZkX2FzeW1ib2xfYmZkKHgpICgoeCktPnNlY3Rpb24tPm93bmVyKSovCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2JmZCh4KSAoKHgpLT50aGVfYmZkKQotI2RlZmluZSBiZmRfYXN5bWJvbF9mbGF2b3VyKHgpIChiZmRfYXN5bWJvbF9iZmQoeCktPnh2ZWMtPmZsYXZvdXIpCi0KLS8qIEEgY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9sLiAgKi8KLS8qIFRoaXMgaXMgYSB0eXBlIHB1biB3aXRoIHN0cnVjdCByYW5saWIgb24gcHVycG9zZSEgKi8KLXR5cGVkZWYgc3RydWN0IGNhcnN5bSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwkJLyogbG9vayBoZXJlIHRvIGZpbmQgdGhlIGZpbGUgKi8KLX0gY2Fyc3ltOwkJCS8qIHRvIG1ha2UgdGhlc2UgeW91IGNhbGwgYSBjYXJzeW1vZ2VuICovCi0KLSAgCi0vKiBVc2VkIGluIGdlbmVyYXRpbmcgYXJtYXBzIChhcmNoaXZlIHRhYmxlcyBvZiBjb250ZW50cykuCi0gICBQZXJoYXBzIGp1c3QgYSBmb3J3YXJkIGRlZmluaXRpb24gd291bGQgZG8/ICovCi1zdHJ1Y3Qgb3JsIHsJCQkvKiBvdXRwdXQgcmFubGliICovCi0gIGNoYXIgKipuYW1lOwkJCS8qIHN5bWJvbCBuYW1lICovIAotICBmaWxlX3B0ciBwb3M7CQkJLyogYmZkKiBvciBmaWxlIHBvc2l0aW9uICovCi0gIGludCBuYW1pZHg7CQkJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgKi8KLX07Ci0MCi0KLS8qIExpbmVudW1iZXIgc3R1ZmYgKi8KLXR5cGVkZWYgc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSB7Ci0gIHVuc2lnbmVkIGludCBsaW5lX251bWJlcjsJLyogTGluZW51bWJlciBmcm9tIHN0YXJ0IG9mIGZ1bmN0aW9uKi8gIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltOyAvKiBGdW5jdGlvbiBuYW1lICovCi0gICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qIE9mZnNldCBpbnRvIHNlY3Rpb24gKi8KLSAgfSB1OwotfSBhbGVudDsKLQwKLS8qIG9iamVjdCBhbmQgY29yZSBmaWxlIHNlY3Rpb25zICovCi0KLSNkZWZpbmUJYWxpZ25fcG93ZXIoYWRkciwgYWxpZ24pCVwKLQkoICgoYWRkcikgKyAoKDE8PChhbGlnbikpLTEpKSAmICgtMSA8PCAoYWxpZ24pKSkKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VjICpzZWNfcHRyOwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9uYW1lKGJmZCwgcHRyKSAoKHB0ciktPm5hbWUgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fdm1hKGJmZCwgcHRyKSAoKHB0ciktPnZtYSArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIpICgocHRyKS0+YWxpZ25tZW50X3Bvd2VyICsgMCkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fbmFtZShiZmQsIHB0cikgKChwdHIpLT5uYW1lKQotI2RlZmluZSBiZmRfc2VjdGlvbl9zaXplKGJmZCwgcHRyKSAoYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHB0cikpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX3ZtYShiZmQsIHB0cikgKChwdHIpLT52bWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2xtYShiZmQsIHB0cikgKChwdHIpLT5sbWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0cikgKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIpCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhiZmQsIHB0cikgKChwdHIpLT5mbGFncyArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0cikgKChwdHIpLT51c2VyZGF0YSkKLQotI2RlZmluZSBiZmRfaXNfY29tX3NlY3Rpb24ocHRyKSAoKChwdHIpLT5mbGFncyAmIFNFQ19JU19DT01NT04pICE9IDApCi0KLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX3ZtYShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT52bWEgPSAocHRyKS0+bG1hPSAodmFsKSksICgocHRyKS0+dXNlcl9zZXRfdm1hID0gKGJvb2xlYW4pdHJ1ZSksIHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+YWxpZ25tZW50X3Bvd2VyID0gKHZhbCkpLHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT51c2VyZGF0YSA9ICh2YWwpKSx0cnVlKQotCi10eXBlZGVmIHN0cnVjdCBzdGF0IHN0YXRfdHlwZTsgCi0MCi10eXBlZGVmIGVudW0gYmZkX3ByaW50X3N5bWJvbAoteyAKLSAgYmZkX3ByaW50X3N5bWJvbF9uYW1lLAotICBiZmRfcHJpbnRfc3ltYm9sX21vcmUsCi0gIGJmZF9wcmludF9zeW1ib2xfYWxsCi19IGJmZF9wcmludF9zeW1ib2xfdHlwZTsKLSAgICAKLS8qIEluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sIHRoYXQgbm0gbmVlZHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBfc3ltYm9sX2luZm8KLXsKLSAgc3ltdmFsdWUgdmFsdWU7Ci0gIGNoYXIgdHlwZTsKLSAgQ09OU1QgY2hhciAqbmFtZTsgICAgICAgICAgICAvKiBTeW1ib2wgbmFtZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhYl90eXBlOyAgICAgLyogU3RhYiB0eXBlLiAgKi8KLSAgY2hhciBzdGFiX290aGVyOyAgICAgICAgICAgICAvKiBTdGFiIG90aGVyLiAqLwotICBzaG9ydCBzdGFiX2Rlc2M7ICAgICAgICAgICAgIC8qIFN0YWIgZGVzYy4gICovCi0gIENPTlNUIGNoYXIgKnN0YWJfbmFtZTsgICAgICAgLyogU3RyaW5nIGZvciBzdGFiIHR5cGUuICAqLwotfSBzeW1ib2xfaW5mbzsKLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgc3RhYnMgdHlwZSBjb2RlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmJmZF9nZXRfc3RhYl9uYW1lIFBBUkFNUyAoKGludCkpOwotDAotLyogSGFzaCB0YWJsZSByb3V0aW5lcy4gIFRoZXJlIGlzIG5vIHdheSB0byBmcmVlIHVwIGEgaGFzaCB0YWJsZS4gICovCi0KLS8qIEFuIGVsZW1lbnQgaW4gdGhlIGhhc2ggdGFibGUuICBNb3N0IHVzZXMgd2lsbCBhY3R1YWxseSB1c2UgYSBsYXJnZXIKLSAgIHN0cnVjdHVyZSwgYW5kIGFuIGluc3RhbmNlIG9mIHRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgZmllbGQuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkKLXsKLSAgLyogTmV4dCBlbnRyeSBmb3IgdGhpcyBoYXNoIGNvZGUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm5leHQ7Ci0gIC8qIFN0cmluZyBiZWluZyBoYXNoZWQuICAqLwotICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gIC8qIEhhc2ggY29kZS4gIFRoaXMgaXMgdGhlIGZ1bGwgaGFzaCBjb2RlLCBub3QgdGhlIGluZGV4IGludG8gdGhlCi0gICAgIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoYXNoOwotfTsKLQotLyogQSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBoYXNoIGFycmF5LiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoqdGFibGU7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgLyogQSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBuZXcgZWxlbWVudHMgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUKLSAgICAgZmlyc3QgZW50cnkgaXMgaXRzZWxmIGEgcG9pbnRlciB0byBhbiBlbGVtZW50LiAgV2hlbiB0aGlzCi0gICAgIGZ1bmN0aW9uIGlzIGZpcnN0IGludm9rZWQsIHRoaXMgcG9pbnRlciB3aWxsIGJlIE5VTEwuICBIb3dldmVyLAotICAgICBoYXZpbmcgdGhlIHBvaW50ZXIgcGVybWl0cyBhIGhpZXJhcmNoeSBvZiBtZXRob2QgZnVuY3Rpb25zIHRvIGJlCi0gICAgIGJ1aWx0IGVhY2ggb2Ygd2hpY2ggY2FsbHMgdGhlIGZ1bmN0aW9uIGluIHRoZSBzdXBlcmNsYXNzLiAgVGh1cwotICAgICBlYWNoIGZ1bmN0aW9uIHNob3VsZCBiZSB3cml0dGVuIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrIG9mIG1lbW9yeQotICAgICBvbmx5IGlmIHRoZSBhcmd1bWVudCBpcyBOVUxMLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKikpOwotICAgLyogQW4gb2JqYWxsb2MgZm9yIHRoaXMgaGFzaCB0YWJsZS4gIFRoaXMgaXMgYSBzdHJ1Y3Qgb2JqYWxsb2MgKiwKLSAgICAgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2Ygb2JqYWxsb2MuaC4gICovCi0gIFBUUiBtZW1vcnk7Ci19OwotCi0vKiBJbml0aWFsaXplIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUgc3BlY2lmeWluZyBhIHNpemUuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2hhc2hfdGFibGVfaW5pdF9uCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKiksCi0JICAgdW5zaWduZWQgaW50IHNpemUpKTsKLQotLyogRnJlZSB1cCBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdGFibGVfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikpOwotCi0vKiBMb29rIHVwIGEgc3RyaW5nIGluIGEgaGFzaCB0YWJsZS4gIElmIENSRUFURSBpcyB0cnVlLCBhIG5ldyBlbnRyeQotICAgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIHN0cmluZyBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gIFRoZQotICAgQ09QWSBhcmd1bWVudCBtdXN0IGJlIHRydWUgaWYgdGhpcyByb3V0aW5lIHNob3VsZCBjb3B5IHRoZSBzdHJpbmcKLSAgIGludG8gbmV3bHkgYWxsb2NhdGVkIG1lbW9yeSB3aGVuIGFkZGluZyBhbiBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjcmVhdGUsCi0JICAgYm9vbGVhbiBjb3B5KSk7Ci0KLS8qIFJlcGxhY2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3JlcGxhY2UKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqb2xkLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbncpKTsKLQotLyogQmFzZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgaGFzaCB0YWJsZSBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLQotLyogR3JhYiBzb21lIHNwYWNlIGZvciBhIGhhc2ggdGFibGUgZW50cnkuICAqLwotZXh0ZXJuIFBUUiBiZmRfaGFzaF9hbGxvY2F0ZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQpKTsKLQotLyogVHJhdmVyc2UgYSBoYXNoIHRhYmxlIGluIGEgcmFuZG9tIG9yZGVyLCBjYWxsaW5nIGEgZnVuY3Rpb24gb24gZWFjaAotICAgZWxlbWVudC4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgdHJhdmVyc2FsIHN0b3BzLiAgVGhlCi0gICBJTkZPIGFyZ3VtZW50IGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdHJhdmVyc2UgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGJvb2xlYW4gKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCSAgICBQVFIpLAotCQkJCSAgICAgICBQVFIgaW5mbykpOwotDAotLyogU2VtaS1wb3J0YWJsZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpbiBjcHAuCi0gICBUaGUgQ0FUNCBoYWNrIGlzIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoIHNvbWUgc3RyaWN0IEFOU0kgQyBwcmVwcm9jZXNzb3JzLgotICAgVGhlIHByb2JsZW0gaXMsICIzMl8iIGlzIG5vdCBhIHZhbGlkIHByZXByb2Nlc3NpbmcgdG9rZW4sIGFuZCB3ZSBkb24ndAotICAgd2FudCBleHRyYSB1bmRlcnNjb3JlcyAoZS5nLiwgIm5sbV8zMl8iKS4gIFRoZSBYQ0FUMiBtYWNybyB3aWxsIGNhdXNlIHRoZQotICAgaW5uZXIgQ0FUIG1hY3JvcyB0byBiZSBldmFsdWF0ZWQgZmlyc3QsIHByb2R1Y2luZyBzdGlsbC12YWxpZCBwcC10b2tlbnMuCi0gICBUaGVuIHRoZSBmaW5hbCBjb25jYXRlbmF0aW9uIGNhbiBiZSBkb25lLiAgKFNpZ2guKSAgKi8KLSNpZm5kZWYgQ0FUCi0jaWZkZWYgU0FCRVIKLSNkZWZpbmUgQ0FUKGEsYikJYSMjYgotI2RlZmluZSBDQVQzKGEsYixjKQlhIyNiIyNjCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYSMjYiMjYyMjZAotI2Vsc2UKLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotI2RlZmluZSBDQVQoYSxiKSBhIyNiCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEjI2IjI2MKLSNkZWZpbmUgWENBVDIoYSxiKQlDQVQoYSxiKQotI2RlZmluZSBDQVQ0KGEsYixjLGQpCVhDQVQyKENBVChhLGIpLENBVChjLGQpKQotI2Vsc2UKLSNkZWZpbmUgQ0FUKGEsYikgYS8qKi9iCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEvKiovYi8qKi9jCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYS8qKi9iLyoqL2MvKiovZAotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIENPRkZfU1dBUF9UQUJMRSAoUFRSKSAmYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUKLQwKLS8qIFVzZXIgcHJvZ3JhbSBhY2Nlc3MgdG8gQkZEIGZhY2lsaXRpZXMgKi8KLQotLyogRGlyZWN0IEkvTyByb3V0aW5lcywgZm9yIHByb2dyYW1zIHdoaWNoIGtub3cgbW9yZSBhYm91dCB0aGUgb2JqZWN0Ci0gICBmaWxlIHRoYW4gQkZEIGRvZXMuICBVc2UgaGlnaGVyIGxldmVsIHJvdXRpbmVzIGlmIHBvc3NpYmxlLiAgKi8KLQotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX3JlYWQKLSAgUEFSQU1TICgoUFRSLCBiZmRfc2l6ZV90eXBlIHNpemUsIGJmZF9zaXplX3R5cGUgbml0ZW1zLCBiZmQgKmFiZmQpKTsKLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF93cml0ZQotICBQQVJBTVMgKChjb25zdCBQVFIsIGJmZF9zaXplX3R5cGUgc2l6ZSwgYmZkX3NpemVfdHlwZSBuaXRlbXMsIGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc2VlayBQQVJBTVMgKChiZmQgKmFiZmQsIGZpbGVfcHRyIGZwLCBpbnQgZGlyZWN0aW9uKSk7Ci1leHRlcm4gbG9uZyBiZmRfdGVsbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX2ZsdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc3RhdCBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBzdGF0ICopKTsKLQotCi0vKiBDYXN0IGZyb20gY29uc3QgY2hhciAqIHRvIGNoYXIgKiBzbyB0aGF0IGNhbGxlciBjYW4gYXNzaWduIHRvCi0gICBhIGNoYXIgKiB3aXRob3V0IGEgd2FybmluZy4gICovCi0jZGVmaW5lIGJmZF9nZXRfZmlsZW5hbWUoYWJmZCkgKChjaGFyICopIChhYmZkKS0+ZmlsZW5hbWUpCi0jZGVmaW5lIGJmZF9nZXRfY2FjaGVhYmxlKGFiZmQpICgoYWJmZCktPmNhY2hlYWJsZSkKLSNkZWZpbmUgYmZkX2dldF9mb3JtYXQoYWJmZCkgKChhYmZkKS0+Zm9ybWF0KQotI2RlZmluZSBiZmRfZ2V0X3RhcmdldChhYmZkKSAoKGFiZmQpLT54dmVjLT5uYW1lKQotI2RlZmluZSBiZmRfZ2V0X2ZsYXZvdXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+Zmxhdm91cikKLSNkZWZpbmUgYmZkX2JpZ19lbmRpYW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+Ynl0ZW9yZGVyID09IEJGRF9FTkRJQU5fQklHKQotI2RlZmluZSBiZmRfbGl0dGxlX2VuZGlhbihhYmZkKSAoKGFiZmQpLT54dmVjLT5ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9oZWFkZXJfYmlnX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9CSUcpCi0jZGVmaW5lIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9nZXRfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT5mbGFncykKLSNkZWZpbmUgYmZkX2FwcGxpY2FibGVfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT54dmVjLT5vYmplY3RfZmxhZ3MpCi0jZGVmaW5lIGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MoYWJmZCkgKChhYmZkKS0+eHZlYy0+c2VjdGlvbl9mbGFncykKLSNkZWZpbmUgYmZkX215X2FyY2hpdmUoYWJmZCkgKChhYmZkKS0+bXlfYXJjaGl2ZSkKLSNkZWZpbmUgYmZkX2hhc19tYXAoYWJmZCkgKChhYmZkKS0+aGFzX2FybWFwKQotCi0jZGVmaW5lIGJmZF92YWxpZF9yZWxvY190eXBlcyhhYmZkKSAoKGFiZmQpLT54dmVjLT52YWxpZF9yZWxvY190eXBlcykKLSNkZWZpbmUgYmZkX3VzcmRhdGEoYWJmZCkgKChhYmZkKS0+dXNyZGF0YSkKLQotI2RlZmluZSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MoYWJmZCkgKChhYmZkKS0+c3RhcnRfYWRkcmVzcykKLSNkZWZpbmUgYmZkX2dldF9zeW1jb3VudChhYmZkKSAoKGFiZmQpLT5zeW1jb3VudCkKLSNkZWZpbmUgYmZkX2dldF9vdXRzeW1ib2xzKGFiZmQpICgoYWJmZCktPm91dHN5bWJvbHMpCi0jZGVmaW5lIGJmZF9jb3VudF9zZWN0aW9ucyhhYmZkKSAoKGFiZmQpLT5zZWN0aW9uX2NvdW50KQotCi0jZGVmaW5lIGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhcihhYmZkKSAoKGFiZmQpLT54dmVjLT5zeW1ib2xfbGVhZGluZ19jaGFyKQotCi0jZGVmaW5lIGJmZF9zZXRfY2FjaGVhYmxlKGFiZmQsYm9vbCkgKCgoYWJmZCktPmNhY2hlYWJsZSA9IChib29sZWFuKShib29sKSksIHRydWUpCi0KLWV4dGVybiBib29sZWFuIGJmZF9yZWNvcmRfcGhkcgotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywgYm9vbGVhbiwgZmxhZ3dvcmQsIGJvb2xlYW4sIGJmZF92bWEsCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIEJ5dGUgc3dhcHBpbmcgcm91dGluZXMuICAqLwotCi1iZmRfdm1hCQliZmRfZ2V0YjY0CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYSAJYmZkX2dldGw2NAkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRiMzIJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0bDMyCSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGIxNgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRsMTYJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjY0CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGw2NAkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiMzIJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDMyCSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGIxNgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsMTYJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci0MCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgRUNPRkYgcm91dGluZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvOwotc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXA7Ci1zdHJ1Y3QgZWNvZmZfZXh0cjsKLXN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnk7Ci1zdHJ1Y3QgYmZkX2xpbmtfaW5mbzsKLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5Owotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlOwotI2VuZGlmCi1leHRlcm4gYmZkX3ZtYSBiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfdm1hIGdwX3ZhbHVlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfc2V0X3JlZ21hc2tzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyBncHJtYXNrLCB1bnNpZ25lZCBsb25nIGZwcm1hc2ssCi0JICAgdW5zaWduZWQgbG9uZyAqY3BybWFzaykpOwotZXh0ZXJuIFBUUiBiZmRfZWNvZmZfZGVidWdfaW5pdAotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIGJmZF9lY29mZl9kZWJ1Z19mcmVlCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmlucHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICppbnB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsIGJmZCAqaW5wdXRfYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0JICAgYm9vbGVhbiAoKmdldF9leHRyKSAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotCQkJCXN0cnVjdCBlY29mZl9leHRyICopLAotCSAgIHZvaWQgKCpzZXRfaW5kZXgpIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0JCQkgICAgICBiZmRfc2l6ZV90eXBlKSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZWNvZmZfZXh0ciAqZXN5bSkpOwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX2Vjb2ZmX2RlYnVnX3NpemUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXApKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9kZWJ1ZwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZwotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiwgc3RydWN0IHNlYyAqLAotCSAgIGNoYXIgKiopKTsKLQotLyogRXh0ZXJuYWxseSB2aXNpYmxlIEVMRiByb3V0aW5lcy4gICovCi0KLXN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdAotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5leHQ7Ci0gIGJmZCAqYnk7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpiZmRfZWxmX2dldF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKiopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpiZmRfZWxmX2dldF9kdF9zb25hbWUgUEFSQU1TICgoYmZkICopKTsKLQotLyogU3VuT1Mgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IHNlYyAqKikpOwotCi0vKiBMaW51eCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9tNjhrbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3BhcmNsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogbW1hcCBoYWNrcyAqLwotCi1zdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWw7Ci10eXBlZGVmIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCBiZmRfd2luZG93X2ludGVybmFsOwotCi10eXBlZGVmIHN0cnVjdCBfYmZkX3dpbmRvdyB7Ci0gIC8qIFdoYXQgdGhlIHVzZXIgYXNrZWQgZm9yLiAgKi8KLSAgUFRSIGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogVGhlIGFjdHVhbCB3aW5kb3cgdXNlZCBieSBCRkQuICBTbWFsbCB1c2VyLXJlcXVlc3RlZCByZWFkLW9ubHkKLSAgICAgcmVnaW9ucyBzaGFyaW5nIGEgcGFnZSBtYXkgc2hhcmUgYSBzaW5nbGUgd2luZG93IGludG8gdGhlIG9iamVjdAotICAgICBmaWxlLiAgUmVhZC13cml0ZSB2ZXJzaW9ucyBzaG91bGRuJ3QgdW50aWwgSSd2ZSBmaXhlZCB0aGluZ3MgdG8KLSAgICAga2VlcCB0cmFjayBvZiB3aGljaCBwb3J0aW9ucyBoYXZlIGJlZW4gY2xhaW1lZCBieSB0aGUKLSAgICAgYXBwbGljYXRpb247IGRvbid0IHdhbnQgdG8gZ2l2ZSB0aGUgc2FtZSByZWdpb24gYmFjayB3aGVuIHRoZQotICAgICBhcHBsaWNhdGlvbiB3YW50cyB0d28gd3JpdGFibGUgY29waWVzISAgKi8KLSAgc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsICppOwotfSBiZmRfd2luZG93OwotCi1leHRlcm4gdm9pZCBiZmRfaW5pdF93aW5kb3cgUEFSQU1TICgoYmZkX3dpbmRvdyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZnJlZV93aW5kb3cgUEFSQU1TICgoYmZkX3dpbmRvdyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZ2V0X2ZpbGVfd2luZG93Ci0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSwgYmZkX3dpbmRvdyAqLCBib29sZWFuKSk7Ci0KLS8qIFhDT0ZGIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF9zaXplX3R5cGUpKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9leHBvcnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCSAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4sCi0JICAgaW50LCBib29sZWFuLCBib29sZWFuLCBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIEV4dGVybmFsbHkgdmlzaWJsZSBDT0ZGIHJvdXRpbmVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgaW50ZXJuYWxfc3ltZW50OwotdW5pb24gaW50ZXJuYWxfYXV4ZW50OwotI2VuZGlmCi0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX2dldF9zeW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX2dldF9hdXhlbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgaW50LCB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIHVuc2lnbmVkIGludCkpOwotCi0vKiBBUk0gSW50ZXJ3b3JraW5nIHN1cHBvcnQuICBDYWxsZWQgZnJvbSBsaW5rZXIuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGludCkpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBFTEYgQVJNIEludGVyd29ya2luZyBzdXBwb3J0LiAgQ2FsbGVkIGZyb20gbGlua2VyLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBpbnQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQW5kIG1vcmUgZnJvbSB0aGUgc291cmNlLiAgKi8KZGlmZiAtLWdpdCBhL2JmZC9iZmQtaW4yLmggYi9iZmQvYmZkLWluMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2M5YjdlLi4wMDAwMDAwCi0tLSBhL2JmZC9iZmQtaW4yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTE0ICswLDAgQEAKLS8qIE1haW4gaGVhZGVyIGZpbGUgZm9yIHRoZSBiZmQgbGlicmFyeSAtLSBwb3J0YWJsZSBhY2Nlc3MgdG8gb2JqZWN0IGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogYmZkLmggYW5kIGJmZC1pbjIuaCBhcmUgR0VORVJBVEVEIGZpbGVzLiAgRG9uJ3QgY2hhbmdlIHRoZW07Ci0qKiBpbnN0ZWFkLCBjaGFuZ2UgYmZkLWluLmggb3IgdGhlIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMgcHJvY2Vzc2VkIHRvCi0qKiBnZW5lcmF0ZSB0aGVzZSBmaWxlcy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBiZmQuaCAtLSBUaGUgb25seSBoZWFkZXIgZmlsZSByZXF1aXJlZCBieSB1c2VycyBvZiB0aGUgYmZkIGxpYnJhcnkgCi0KLVRoZSBiZmQuaCBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIGJmZC1pbi5oIGFuZCB2YXJpb3VzIC5jIGZpbGVzOyBpZiB5b3UKLWNoYW5nZSBpdCwgeW91ciBjaGFuZ2VzIHdpbGwgcHJvYmFibHkgYmUgbG9zdC4KLQotQWxsIHRoZSBwcm90b3R5cGVzIGFuZCBkZWZpbml0aW9ucyBmb2xsb3dpbmcgdGhlIGNvbW1lbnQgIlRIRSBGT0xMT1dJTkcKLUlTIEVYVFJBQ1RFRCBGUk9NIFRIRSBTT1VSQ0UiIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgc291cmNlIGZpbGVzIGZvcgotQkZELiAgSWYgeW91IGNoYW5nZSBpdCwgc29tZW9uZSBvbmVkYXkgd2lsbCBleHRyYWN0IGl0IGZyb20gdGhlIHNvdXJjZQotYWdhaW4sIGFuZCB5b3VyIGNoYW5nZXMgd2lsbCBiZSBsb3N0LiAgVG8gc2F2ZSB5b3Vyc2VsZiBmcm9tIHRoaXMgYmluZCwKLWNoYW5nZSB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIHNvdXJjZSBpbiB0aGUgYmZkIGRpcmVjdG9yeS4gIFR5cGUgIm1ha2UKLWRvY3MiIGFuZCB0aGVuICJtYWtlIGhlYWRlcnMiIGluIHRoYXQgZGlyZWN0b3J5LCBhbmQgbWFnaWNhbGx5IHRoaXMgZmlsZQotd2lsbCBjaGFuZ2UgdG8gcmVmbGVjdCB5b3VyIGNoYW5nZXMuCi0KLUlmIHlvdSBkb24ndCBoYXZlIHRoZSB0b29scyB0byBwZXJmb3JtIHRoZSBleHRyYWN0aW9uLCB0aGVuIHlvdSBhcmUKLXNhZmUgZnJvbSBzb21lb25lIG9uIHlvdXIgc3lzdGVtIHRyYW1wbGluZyBvdmVyIHlvdXIgaGVhZGVyIGZpbGVzLgotWW91IHNob3VsZCBzdGlsbCBtYWludGFpbiB0aGUgZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0aGlzCi1maWxlIHRob3VnaDsgZXZlcnkgY2hhbmdlIHlvdSBtYWtlIHRvIHRoZSAuYyBmaWxlIHNob3VsZCBiZSByZWZsZWN0ZWQKLWhlcmUuICAqLwotCi0jaWZuZGVmIF9fQkZEX0hfU0VFTl9fCi0jZGVmaW5lIF9fQkZEX0hfU0VFTl9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFRoZXNlIHR3byBsaW5lcyBnZXQgc3Vic3RpdHV0aW9ucyBkb25lIGJ5IGNvbW1hbmRzIGluIE1ha2VmaWxlLmluLiAgKi8KLSNkZWZpbmUgQkZEX1ZFUlNJT04gICJAVkVSU0lPTkAiCi0jZGVmaW5lIEJGRF9BUkNIX1NJWkUgQHdvcmRzaXplQAotI2RlZmluZSBCRkRfSE9TVF82NEJJVF9MT05HIEBCRkRfSE9TVF82NEJJVF9MT05HQAotI2lmIEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKLSNkZWZpbmUgQkZEX0hPU1RfNjRfQklUIEBCRkRfSE9TVF82NF9CSVRACi0jZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIEBCRkRfSE9TVF9VXzY0X0JJVEAKLSNlbmRpZgotCi0jaWYgQkZEX0FSQ0hfU0laRSA+PSA2NAotI2RlZmluZSBCRkQ2NAotI2VuZGlmCi0KLSNpZm5kZWYgSU5MSU5FCi0jaWYgX19HTlVDX18gPj0gMgotI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi10eXBlZGVmIHN0cnVjdCBfYmZkIGJmZDsKLQotLyogVG8gc3F1ZWxjaCBlcnJvbmVvdXMgY29tcGlsZXIgd2FybmluZ3MgKCJpbGxlZ2FsIHBvaW50ZXIKLSAgIGNvbWJpbmF0aW9uIikgZnJvbSB0aGUgU1ZSMyBjb21waWxlciwgd2Ugd291bGQgbGlrZSB0byB0eXBlZGVmCi0gICBib29sZWFuIHRvIGludCAoaXQgZG9lc24ndCBsaWtlIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYm9vbGVhbi4KLSAgIE1ha2luZyBzdXJlIHRoZXkgYXJlIG5ldmVyIGltcGxpY2l0bHkgZGVjbGFyZWQgdG8gcmV0dXJuIGludAotICAgZG9lc24ndCBzZWVtIHRvIGhlbHApLiAgQnV0IHRoaXMgZmlsZSBpcyBub3QgY29uZmlndXJlZCBiYXNlZCBvbgotICAgdGhlIGhvc3QuICAqLwotLyogR2VuZXJhbCBydWxlczogZnVuY3Rpb25zIHdoaWNoIGFyZSBib29sZWFuIHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MKLSAgIGFuZCBmYWxzZSBvbiBmYWlsdXJlICh1bmxlc3MgdGhleSdyZSBhIHByZWRpY2F0ZSkuICAgLS0gYmZkLmRvYyAqLwotLyogSSdtIHN1cmUgdGhpcyBpcyBnb2luZyB0byBicmVhayBzb21ldGhpbmcgYW5kIHNvbWVvbmUgaXMgZ29pbmcgdG8KLSAgIGZvcmNlIG1lIHRvIGNoYW5nZSBpdC4gKi8KLS8qIHR5cGVkZWYgZW51bSBib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsgKi8KLS8qIFl1cCwgU1ZSNCBoYXMgYSAidHlwZWRlZiBlbnVtIGJvb2xlYW4iIGluIDxzeXMvdHlwZXMuaD4gIC1mbmYgKi8KLS8qIEl0IGdldHMgd29yc2UgaWYgdGhlIGhvc3QgYWxzbyBkZWZpbmVzIGEgdHJ1ZS9mYWxzZSBlbnVtLi4uIC1zdHMgKi8KLS8qIEFuZCBldmVuIHdvcnNlIGlmIHlvdXIgY29tcGlsZXIgaGFzIGJ1aWx0LWluIGJvb2xlYW4gdHlwZXMuLi4gLWxhdyAqLwotI2lmIGRlZmluZWQgKF9fR05VR19fKSAmJiAoX19HTlVDX01JTk9SX18gPiA1KQotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmCi0jaWZkZWYgTVBXCi0vKiBQcmUtZW1wdGl2ZSBzdHJpa2UgLSBnZXQgdGhlIGZpbGUgd2l0aCB0aGUgZW51bS4gKi8KLSNpbmNsdWRlIDxUeXBlcy5oPgotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmIC8qIE1QVyAqLwotI2lmbmRlZiBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotdHlwZWRlZiBlbnVtIGJmZF9ib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsKLSNkZWZpbmUgQkZEX1RSVUVfRkFMU0UKLSNlbHNlCi0vKiBVc2UgZW51bSBuYW1lcyB0aGF0IHdpbGwgYXBwZWFyIG5vd2hlcmUgZWxzZS4gICovCi10eXBlZGVmIGVudW0gYmZkX2Jvb2xlYW4ge2JmZF9mZmZhbHNlLCBiZmRfdHR0cnVlfSBib29sZWFuOwotI2VuZGlmCi0KLS8qIEEgcG9pbnRlciB0byBhIHBvc2l0aW9uIGluIGEgZmlsZS4gICovCi0vKiBGSVhNRTogIFRoaXMgc2hvdWxkIGJlIHVzaW5nIG9mZl90IGZyb20gPHN5cy90eXBlcy5oPi4KLSAgIEZvciBub3csIHRyeSB0byBhdm9pZCBicmVha2luZyBzdHVmZiBieSBub3QgaW5jbHVkaW5nIDxzeXMvdHlwZXMuaD4gaGVyZS4KLSAgIFRoaXMgd2lsbCBicmVhayBvbiBzeXN0ZW1zIHdpdGggNjQtYml0IGZpbGUgb2Zmc2V0cyAoZS5nLiA0LjRCU0QpLgotICAgUHJvYmFibHkgdGhlIGJlc3QgbG9uZy10ZXJtIGFuc3dlciBpcyB0byBhdm9pZCB1c2luZyBmaWxlX3B0ciBBTkQgb2ZmX3QgCi0gICBpbiB0aGlzIGhlYWRlciBmaWxlLCBhbmQgdG8gaGFuZGxlIHRoaXMgaW4gdGhlIEJGRCBpbXBsZW1lbnRhdGlvbgotICAgcmF0aGVyIHRoYW4gaW4gaXRzIGludGVyZmFjZS4gICovCi0vKiB0eXBlZGVmIG9mZl90CWZpbGVfcHRyOyAqLwotdHlwZWRlZiBsb25nIGludCBmaWxlX3B0cjsKLQotLyogU3VwcG9ydCBmb3IgZGlmZmVyZW50IHNpemVzIG9mIHRhcmdldCBmb3JtYXQgaW50cyBhbmQgYWRkcmVzc2VzLgotICAgSWYgdGhlIHR5cGUgYGxvbmcnIGlzIGF0IGxlYXN0IDY0IGJpdHMsIEJGRF9IT1NUXzY0QklUX0xPTkcgd2lsbCBiZQotICAgc2V0IHRvIDEgYWJvdmUuICBPdGhlcndpc2UsIGlmIGdjYyBpcyBiZWluZyB1c2VkLCB0aGlzIGNvZGUgd2lsbAotICAgdXNlIGdjYydzICJsb25nIGxvbmciIHR5cGUuICBPdGhlcndpc2UsIEJGRF9IT1NUXzY0X0JJVCBtdXN0IGJlCi0gICBkZWZpbmVkIGFib3ZlLiAgKi8KLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSMgaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotIyAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nCi0jICBkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgdW5zaWduZWQgbG9uZwotIyBlbHNlCi0jICBpZmRlZiBfX0dOVUNfXwotIyAgIGlmIF9fR05VQ19fID49IDIKLSMgICAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nIGxvbmcKLSMgICAgZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIHVuc2lnbmVkIGxvbmcgbG9uZwotIyAgIGVuZGlmIC8qIF9fR05VQ19fID49IDIgKi8KLSMgIGVuZGlmIC8qICEgZGVmaW5lZCAoX19HTlVDX18pICovCi0jIGVuZGlmIC8qICEgQkZEX0hPU1RfNjRCSVRfTE9ORyAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0hPU1RfNjRfQklUKSAqLwotCi0jaWZkZWYgQkZENjQKLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSAjZXJyb3IgTm8gNjQgYml0IGludGVnZXIgdHlwZSBhdmFpbGFibGUKLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9IT1NUXzY0X0JJVCkgKi8KLQotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBiZmRfdm1hOwotdHlwZWRlZiBCRkRfSE9TVF82NF9CSVQgYmZkX3NpZ25lZF92bWE7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIGJmZF9zaXplX3R5cGU7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIHN5bXZhbHVlOwotCi0jaWZuZGVmIGZwcmludGZfdm1hCi0jaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYgKHMsICIlMDE2bHgiLCB4KQotI2RlZmluZSBmcHJpbnRmX3ZtYShmLHgpIGZwcmludGYgKGYsICIlMDE2bHgiLCB4KQotI2Vsc2UKLSNkZWZpbmUgX2JmZF9pbnQ2NF9sb3coeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSAmIDB4ZmZmZmZmZmYpKSkKLSNkZWZpbmUgX2JmZF9pbnQ2NF9oaWdoKHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgPj4gMzIpICYgMHhmZmZmZmZmZikpCi0jZGVmaW5lIGZwcmludGZfdm1hKHMseCkgXAotICBmcHJpbnRmICgocyksICIlMDhseCUwOGx4IiwgX2JmZF9pbnQ2NF9oaWdoICh4KSwgX2JmZF9pbnQ2NF9sb3cgKHgpKQotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIFwKLSAgc3ByaW50ZiAoKHMpLCAiJTA4bHglMDhseCIsIF9iZmRfaW50NjRfaGlnaCAoeCksIF9iZmRfaW50NjRfbG93ICh4KSkKLSNlbmRpZgotI2VuZGlmCi0KLSNlbHNlIC8qIG5vdCBCRkQ2NCAgKi8KLQotLyogUmVwcmVzZW50IGEgdGFyZ2V0IGFkZHJlc3MuICBBbHNvIHVzZWQgYXMgYSBnZW5lcmljIHVuc2lnbmVkIHR5cGUKLSAgIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueSBhcml0aG1ldGljIHR5cGVzCi0gICB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgYmZkX3ZtYTsKLQotLyogQSBnZW5lcmljIHNpZ25lZCB0eXBlIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueQotICAgYXJpdGhtZXRpYyB0eXBlcyB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gIENhbiBiZSBhc3N1bWVkIHRvIGJlIGNvbXBhdGlibGUKLSAgIHdpdGggYmZkX3ZtYSBpbiB0aGUgc2FtZSB3YXkgdGhhdCBzaWduZWQgYW5kIHVuc2lnbmVkIGludHMgYXJlIGNvbXBhdGlibGUKLSAgIChhcyBwYXJhbWV0ZXJzLCBpbiBhc3NpZ25tZW50LCBldGMpLiAgKi8KLXR5cGVkZWYgbG9uZyBiZmRfc2lnbmVkX3ZtYTsKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bXZhbHVlOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGJmZF9zaXplX3R5cGU7Ci0KLS8qIFByaW50IGEgYmZkX3ZtYSB4IG9uIHN0cmVhbSBzLiAgKi8KLSNkZWZpbmUgZnByaW50Zl92bWEocyx4KSBmcHJpbnRmKHMsICIlMDhseCIsIHgpCi0jZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZihzLCAiJTA4bHgiLCB4KQotCi0jZW5kaWYgLyogbm90IEJGRDY0ICAqLwotCi0jZGVmaW5lIHByaW50Zl92bWEoeCkgZnByaW50Zl92bWEoc3Rkb3V0LHgpCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IGZsYWd3b3JkOwkvKiAzMiBiaXRzIG9mIGZsYWdzICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYmZkX2J5dGU7Ci0MCi0vKiogRmlsZSBmb3JtYXRzICovCi0KLXR5cGVkZWYgZW51bSBiZmRfZm9ybWF0IHsKLQkgICAgICBiZmRfdW5rbm93biA9IDAsCS8qIGZpbGUgZm9ybWF0IGlzIHVua25vd24gKi8KLQkgICAgICBiZmRfb2JqZWN0LAkvKiBsaW5rZXIvYXNzZW1iZXIvY29tcGlsZXIgb3V0cHV0ICovCi0JICAgICAgYmZkX2FyY2hpdmUsCS8qIG9iamVjdCBhcmNoaXZlIGZpbGUgKi8KLQkgICAgICBiZmRfY29yZSwJCS8qIGNvcmUgZHVtcCAqLwotCSAgICAgIGJmZF90eXBlX2VuZH0JLyogbWFya3MgdGhlIGVuZDsgZG9uJ3QgdXNlIGl0ISAqLwotICAgICAgICAgYmZkX2Zvcm1hdDsKLQotLyogVmFsdWVzIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBCRkQuICBUaGVzZSBhbHNvCi0gICBhcHBlYXIgaW4gdGhlIG9iamVjdF9mbGFncyBmaWVsZCBvZiB0aGUgYmZkX3RhcmdldCBzdHJ1Y3R1cmUsIHdoZXJlCi0gICB0aGV5IGluZGljYXRlIHRoZSBzZXQgb2YgZmxhZ3MgdXNlZCBieSB0aGF0IGJhY2tlbmQgKG5vdCBhbGwgZmxhZ3MKLSAgIGFyZSBtZWFuaW5nZnVsIGZvciBhbGwgb2JqZWN0IGZpbGUgZm9ybWF0cykgKEZJWE1FOiBhdCB0aGUgbW9tZW50LAotICAgdGhlIG9iamVjdF9mbGFncyB2YWx1ZXMgaGF2ZSBtb3N0bHkganVzdCBiZWVuIGNvcGllZCBmcm9tIGJhY2tlbmQKLSAgIHRvIGFub3RoZXIsIGFuZCBhcmUgbm90IG5lY2Vzc2FyaWx5IGNvcnJlY3QpLiAgKi8KLQotLyogTm8gZmxhZ3MuICAqLwotI2RlZmluZSBCRkRfTk9fRkxBR1MgICAJMHgwMAotCi0vKiBCRkQgY29udGFpbnMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLSNkZWZpbmUgSEFTX1JFTE9DICAgCTB4MDEKLQotLyogQkZEIGlzIGRpcmVjdGx5IGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBFWEVDX1AgICAgICAJMHgwMgotCi0vKiBCRkQgaGFzIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MTk5PIGluIGEKLSAgIENPRkYgaGVhZGVyKS4gICovCi0jZGVmaW5lIEhBU19MSU5FTk8gIAkweDA0Ci0KLS8qIEJGRCBoYXMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgSEFTX0RFQlVHICAgCTB4MDgKLQotLyogQkZEIGhhcyBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgSEFTX1NZTVMgICAgCTB4MTAKLQotLyogQkZEIGhhcyBsb2NhbCBzeW1ib2xzIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MU1lNUyBpbiBhIENPRkYKLSAgIGhlYWRlcikuICAqLwotI2RlZmluZSBIQVNfTE9DQUxTICAJMHgyMAotCi0vKiBCRkQgaXMgYSBkeW5hbWljIG9iamVjdC4gICovCi0jZGVmaW5lIERZTkFNSUMgICAgIAkweDQwCi0KLS8qIFRleHQgc2VjdGlvbiBpcyB3cml0ZSBwcm90ZWN0ZWQgKGlmIERfUEFHRUQgaXMgbm90IHNldCwgdGhpcyBpcwotICAgbGlrZSBhbiBhLm91dCBOTUFHSUMgZmlsZSkgKHRoZSBsaW5rZXIgc2V0cyB0aGlzIGJ5IGRlZmF1bHQsIGJ1dAotICAgY2xlYXJzIGl0IGZvciAtciBvciAtTikuICAqLwotI2RlZmluZSBXUF9URVhUICAgICAJMHg4MAotCi0vKiBCRkQgaXMgZHluYW1pY2FsbHkgcGFnZWQgKHRoaXMgaXMgbGlrZSBhbiBhLm91dCBaTUFHSUMgZmlsZSkgKHRoZQotICAgbGlua2VyIHNldHMgdGhpcyBieSBkZWZhdWx0LCBidXQgY2xlYXJzIGl0IGZvciAtciBvciAtbiBvciAtTikuICAqLwotI2RlZmluZSBEX1BBR0VEICAgICAJMHgxMDAKLQotLyogQkZEIGlzIHJlbGF4YWJsZSAodGhpcyBtZWFucyB0aGF0IGJmZF9yZWxheF9zZWN0aW9uIG1heSBiZSBhYmxlIHRvCi0gICBkbyBzb21ldGhpbmcpIChzb21ldGltZXMgYmZkX3JlbGF4X3NlY3Rpb24gY2FuIGRvIHNvbWV0aGluZyBldmVuIGlmCi0gICB0aGlzIGlzIG5vdCBzZXQpLiAgKi8KLSNkZWZpbmUgQkZEX0lTX1JFTEFYQUJMRSAweDIwMAotCi0vKiBUaGlzIG1heSBiZSBzZXQgYmVmb3JlIHdyaXRpbmcgb3V0IGEgQkZEIHRvIHJlcXVlc3QgdXNpbmcgYQotICAgdHJhZGl0aW9uYWwgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgdXNlZCB0byByZXF1ZXN0IHRoYXQgd2hlbgotICAgd3JpdGluZyBvdXQgYW4gYS5vdXQgb2JqZWN0IHRoZSBzeW1ib2xzIG5vdCBiZSBoYXNoZWQgdG8gZWxpbWluYXRlCi0gICBkdXBsaWNhdGVzLiAgKi8KLSNkZWZpbmUgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCAweDQwMAotCi0vKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIEJGRCBjb250ZW50cyBhcmUgYWN0dWFsbHkgY2FjaGVkIGluCi0gICBtZW1vcnkuICBJZiB0aGlzIGlzIHNldCwgaW9zdHJlYW0gcG9pbnRzIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqLwotI2RlZmluZSBCRkRfSU5fTUVNT1JZIDB4ODAwCi0MCi0vKiBzeW1ib2xzIGFuZCByZWxvY2F0aW9uICovCi0KLS8qIEEgY291bnQgb2YgY2Fyc3ltcyAoY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9scykuICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bWluZGV4OwotCi0vKiBIb3cgdG8gcGVyZm9ybSBhIHJlbG9jYXRpb24uICAqLwotdHlwZWRlZiBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0IHJlbG9jX2hvd3RvX3R5cGU7Ci0KLSNkZWZpbmUgQkZEX05PX01PUkVfU1lNQk9MUyAoKHN5bWluZGV4KSB+MCkKLQotLyogR2VuZXJhbCBwdXJwb3NlIHBhcnQgb2YgYSBzeW1ib2wgWDsKLSAgIHRhcmdldCBzcGVjaWZpYyBwYXJ0cyBhcmUgaW4gbGliY29mZi5oLCBsaWJhb3V0LmgsIGV0Yy4gICovCi0KLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uKHgpICgoeCktPnNlY3Rpb24pCi0jZGVmaW5lIGJmZF9nZXRfb3V0cHV0X3NlY3Rpb24oeCkgKCh4KS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbih4LHkpICgoeCktPnNlY3Rpb24pID0gKHkpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2Jhc2UoeCkgKCh4KS0+c2VjdGlvbi0+dm1hKQotI2RlZmluZSBiZmRfYXN5bWJvbF92YWx1ZSh4KSAoYmZkX2FzeW1ib2xfYmFzZSh4KSArICh4KS0+dmFsdWUpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX25hbWUoeCkgKCh4KS0+bmFtZSkKLS8qUGVyaGFwcyBmdXR1cmU6ICNkZWZpbmUgYmZkX2FzeW1ib2xfYmZkKHgpICgoeCktPnNlY3Rpb24tPm93bmVyKSovCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2JmZCh4KSAoKHgpLT50aGVfYmZkKQotI2RlZmluZSBiZmRfYXN5bWJvbF9mbGF2b3VyKHgpIChiZmRfYXN5bWJvbF9iZmQoeCktPnh2ZWMtPmZsYXZvdXIpCi0KLS8qIEEgY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9sLiAgKi8KLS8qIFRoaXMgaXMgYSB0eXBlIHB1biB3aXRoIHN0cnVjdCByYW5saWIgb24gcHVycG9zZSEgKi8KLXR5cGVkZWYgc3RydWN0IGNhcnN5bSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwkJLyogbG9vayBoZXJlIHRvIGZpbmQgdGhlIGZpbGUgKi8KLX0gY2Fyc3ltOwkJCS8qIHRvIG1ha2UgdGhlc2UgeW91IGNhbGwgYSBjYXJzeW1vZ2VuICovCi0KLSAgCi0vKiBVc2VkIGluIGdlbmVyYXRpbmcgYXJtYXBzIChhcmNoaXZlIHRhYmxlcyBvZiBjb250ZW50cykuCi0gICBQZXJoYXBzIGp1c3QgYSBmb3J3YXJkIGRlZmluaXRpb24gd291bGQgZG8/ICovCi1zdHJ1Y3Qgb3JsIHsJCQkvKiBvdXRwdXQgcmFubGliICovCi0gIGNoYXIgKipuYW1lOwkJCS8qIHN5bWJvbCBuYW1lICovIAotICBmaWxlX3B0ciBwb3M7CQkJLyogYmZkKiBvciBmaWxlIHBvc2l0aW9uICovCi0gIGludCBuYW1pZHg7CQkJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgKi8KLX07Ci0MCi0KLS8qIExpbmVudW1iZXIgc3R1ZmYgKi8KLXR5cGVkZWYgc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSB7Ci0gIHVuc2lnbmVkIGludCBsaW5lX251bWJlcjsJLyogTGluZW51bWJlciBmcm9tIHN0YXJ0IG9mIGZ1bmN0aW9uKi8gIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltOyAvKiBGdW5jdGlvbiBuYW1lICovCi0gICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qIE9mZnNldCBpbnRvIHNlY3Rpb24gKi8KLSAgfSB1OwotfSBhbGVudDsKLQwKLS8qIG9iamVjdCBhbmQgY29yZSBmaWxlIHNlY3Rpb25zICovCi0KLSNkZWZpbmUJYWxpZ25fcG93ZXIoYWRkciwgYWxpZ24pCVwKLQkoICgoYWRkcikgKyAoKDE8PChhbGlnbikpLTEpKSAmICgtMSA8PCAoYWxpZ24pKSkKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VjICpzZWNfcHRyOwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9uYW1lKGJmZCwgcHRyKSAoKHB0ciktPm5hbWUgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fdm1hKGJmZCwgcHRyKSAoKHB0ciktPnZtYSArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIpICgocHRyKS0+YWxpZ25tZW50X3Bvd2VyICsgMCkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fbmFtZShiZmQsIHB0cikgKChwdHIpLT5uYW1lKQotI2RlZmluZSBiZmRfc2VjdGlvbl9zaXplKGJmZCwgcHRyKSAoYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHB0cikpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX3ZtYShiZmQsIHB0cikgKChwdHIpLT52bWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2xtYShiZmQsIHB0cikgKChwdHIpLT5sbWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0cikgKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIpCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhiZmQsIHB0cikgKChwdHIpLT5mbGFncyArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0cikgKChwdHIpLT51c2VyZGF0YSkKLQotI2RlZmluZSBiZmRfaXNfY29tX3NlY3Rpb24ocHRyKSAoKChwdHIpLT5mbGFncyAmIFNFQ19JU19DT01NT04pICE9IDApCi0KLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX3ZtYShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT52bWEgPSAocHRyKS0+bG1hPSAodmFsKSksICgocHRyKS0+dXNlcl9zZXRfdm1hID0gKGJvb2xlYW4pdHJ1ZSksIHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+YWxpZ25tZW50X3Bvd2VyID0gKHZhbCkpLHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT51c2VyZGF0YSA9ICh2YWwpKSx0cnVlKQotCi10eXBlZGVmIHN0cnVjdCBzdGF0IHN0YXRfdHlwZTsgCi0MCi10eXBlZGVmIGVudW0gYmZkX3ByaW50X3N5bWJvbAoteyAKLSAgYmZkX3ByaW50X3N5bWJvbF9uYW1lLAotICBiZmRfcHJpbnRfc3ltYm9sX21vcmUsCi0gIGJmZF9wcmludF9zeW1ib2xfYWxsCi19IGJmZF9wcmludF9zeW1ib2xfdHlwZTsKLSAgICAKLS8qIEluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sIHRoYXQgbm0gbmVlZHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBfc3ltYm9sX2luZm8KLXsKLSAgc3ltdmFsdWUgdmFsdWU7Ci0gIGNoYXIgdHlwZTsKLSAgQ09OU1QgY2hhciAqbmFtZTsgICAgICAgICAgICAvKiBTeW1ib2wgbmFtZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhYl90eXBlOyAgICAgLyogU3RhYiB0eXBlLiAgKi8KLSAgY2hhciBzdGFiX290aGVyOyAgICAgICAgICAgICAvKiBTdGFiIG90aGVyLiAqLwotICBzaG9ydCBzdGFiX2Rlc2M7ICAgICAgICAgICAgIC8qIFN0YWIgZGVzYy4gICovCi0gIENPTlNUIGNoYXIgKnN0YWJfbmFtZTsgICAgICAgLyogU3RyaW5nIGZvciBzdGFiIHR5cGUuICAqLwotfSBzeW1ib2xfaW5mbzsKLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgc3RhYnMgdHlwZSBjb2RlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmJmZF9nZXRfc3RhYl9uYW1lIFBBUkFNUyAoKGludCkpOwotDAotLyogSGFzaCB0YWJsZSByb3V0aW5lcy4gIFRoZXJlIGlzIG5vIHdheSB0byBmcmVlIHVwIGEgaGFzaCB0YWJsZS4gICovCi0KLS8qIEFuIGVsZW1lbnQgaW4gdGhlIGhhc2ggdGFibGUuICBNb3N0IHVzZXMgd2lsbCBhY3R1YWxseSB1c2UgYSBsYXJnZXIKLSAgIHN0cnVjdHVyZSwgYW5kIGFuIGluc3RhbmNlIG9mIHRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgZmllbGQuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkKLXsKLSAgLyogTmV4dCBlbnRyeSBmb3IgdGhpcyBoYXNoIGNvZGUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm5leHQ7Ci0gIC8qIFN0cmluZyBiZWluZyBoYXNoZWQuICAqLwotICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gIC8qIEhhc2ggY29kZS4gIFRoaXMgaXMgdGhlIGZ1bGwgaGFzaCBjb2RlLCBub3QgdGhlIGluZGV4IGludG8gdGhlCi0gICAgIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoYXNoOwotfTsKLQotLyogQSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBoYXNoIGFycmF5LiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoqdGFibGU7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgLyogQSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBuZXcgZWxlbWVudHMgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUKLSAgICAgZmlyc3QgZW50cnkgaXMgaXRzZWxmIGEgcG9pbnRlciB0byBhbiBlbGVtZW50LiAgV2hlbiB0aGlzCi0gICAgIGZ1bmN0aW9uIGlzIGZpcnN0IGludm9rZWQsIHRoaXMgcG9pbnRlciB3aWxsIGJlIE5VTEwuICBIb3dldmVyLAotICAgICBoYXZpbmcgdGhlIHBvaW50ZXIgcGVybWl0cyBhIGhpZXJhcmNoeSBvZiBtZXRob2QgZnVuY3Rpb25zIHRvIGJlCi0gICAgIGJ1aWx0IGVhY2ggb2Ygd2hpY2ggY2FsbHMgdGhlIGZ1bmN0aW9uIGluIHRoZSBzdXBlcmNsYXNzLiAgVGh1cwotICAgICBlYWNoIGZ1bmN0aW9uIHNob3VsZCBiZSB3cml0dGVuIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrIG9mIG1lbW9yeQotICAgICBvbmx5IGlmIHRoZSBhcmd1bWVudCBpcyBOVUxMLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKikpOwotICAgLyogQW4gb2JqYWxsb2MgZm9yIHRoaXMgaGFzaCB0YWJsZS4gIFRoaXMgaXMgYSBzdHJ1Y3Qgb2JqYWxsb2MgKiwKLSAgICAgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2Ygb2JqYWxsb2MuaC4gICovCi0gIFBUUiBtZW1vcnk7Ci19OwotCi0vKiBJbml0aWFsaXplIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUgc3BlY2lmeWluZyBhIHNpemUuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2hhc2hfdGFibGVfaW5pdF9uCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKiksCi0JICAgdW5zaWduZWQgaW50IHNpemUpKTsKLQotLyogRnJlZSB1cCBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdGFibGVfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikpOwotCi0vKiBMb29rIHVwIGEgc3RyaW5nIGluIGEgaGFzaCB0YWJsZS4gIElmIENSRUFURSBpcyB0cnVlLCBhIG5ldyBlbnRyeQotICAgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIHN0cmluZyBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gIFRoZQotICAgQ09QWSBhcmd1bWVudCBtdXN0IGJlIHRydWUgaWYgdGhpcyByb3V0aW5lIHNob3VsZCBjb3B5IHRoZSBzdHJpbmcKLSAgIGludG8gbmV3bHkgYWxsb2NhdGVkIG1lbW9yeSB3aGVuIGFkZGluZyBhbiBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjcmVhdGUsCi0JICAgYm9vbGVhbiBjb3B5KSk7Ci0KLS8qIFJlcGxhY2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3JlcGxhY2UKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqb2xkLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbncpKTsKLQotLyogQmFzZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgaGFzaCB0YWJsZSBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLQotLyogR3JhYiBzb21lIHNwYWNlIGZvciBhIGhhc2ggdGFibGUgZW50cnkuICAqLwotZXh0ZXJuIFBUUiBiZmRfaGFzaF9hbGxvY2F0ZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQpKTsKLQotLyogVHJhdmVyc2UgYSBoYXNoIHRhYmxlIGluIGEgcmFuZG9tIG9yZGVyLCBjYWxsaW5nIGEgZnVuY3Rpb24gb24gZWFjaAotICAgZWxlbWVudC4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgdHJhdmVyc2FsIHN0b3BzLiAgVGhlCi0gICBJTkZPIGFyZ3VtZW50IGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdHJhdmVyc2UgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGJvb2xlYW4gKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCSAgICBQVFIpLAotCQkJCSAgICAgICBQVFIgaW5mbykpOwotDAotLyogU2VtaS1wb3J0YWJsZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpbiBjcHAuCi0gICBUaGUgQ0FUNCBoYWNrIGlzIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoIHNvbWUgc3RyaWN0IEFOU0kgQyBwcmVwcm9jZXNzb3JzLgotICAgVGhlIHByb2JsZW0gaXMsICIzMl8iIGlzIG5vdCBhIHZhbGlkIHByZXByb2Nlc3NpbmcgdG9rZW4sIGFuZCB3ZSBkb24ndAotICAgd2FudCBleHRyYSB1bmRlcnNjb3JlcyAoZS5nLiwgIm5sbV8zMl8iKS4gIFRoZSBYQ0FUMiBtYWNybyB3aWxsIGNhdXNlIHRoZQotICAgaW5uZXIgQ0FUIG1hY3JvcyB0byBiZSBldmFsdWF0ZWQgZmlyc3QsIHByb2R1Y2luZyBzdGlsbC12YWxpZCBwcC10b2tlbnMuCi0gICBUaGVuIHRoZSBmaW5hbCBjb25jYXRlbmF0aW9uIGNhbiBiZSBkb25lLiAgKFNpZ2guKSAgKi8KLSNpZm5kZWYgQ0FUCi0jaWZkZWYgU0FCRVIKLSNkZWZpbmUgQ0FUKGEsYikJYSMjYgotI2RlZmluZSBDQVQzKGEsYixjKQlhIyNiIyNjCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYSMjYiMjYyMjZAotI2Vsc2UKLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotI2RlZmluZSBDQVQoYSxiKSBhIyNiCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEjI2IjI2MKLSNkZWZpbmUgWENBVDIoYSxiKQlDQVQoYSxiKQotI2RlZmluZSBDQVQ0KGEsYixjLGQpCVhDQVQyKENBVChhLGIpLENBVChjLGQpKQotI2Vsc2UKLSNkZWZpbmUgQ0FUKGEsYikgYS8qKi9iCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEvKiovYi8qKi9jCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYS8qKi9iLyoqL2MvKiovZAotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIENPRkZfU1dBUF9UQUJMRSAoUFRSKSAmYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUKLQwKLS8qIFVzZXIgcHJvZ3JhbSBhY2Nlc3MgdG8gQkZEIGZhY2lsaXRpZXMgKi8KLQotLyogRGlyZWN0IEkvTyByb3V0aW5lcywgZm9yIHByb2dyYW1zIHdoaWNoIGtub3cgbW9yZSBhYm91dCB0aGUgb2JqZWN0Ci0gICBmaWxlIHRoYW4gQkZEIGRvZXMuICBVc2UgaGlnaGVyIGxldmVsIHJvdXRpbmVzIGlmIHBvc3NpYmxlLiAgKi8KLQotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX3JlYWQKLSAgUEFSQU1TICgoUFRSLCBiZmRfc2l6ZV90eXBlIHNpemUsIGJmZF9zaXplX3R5cGUgbml0ZW1zLCBiZmQgKmFiZmQpKTsKLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF93cml0ZQotICBQQVJBTVMgKChjb25zdCBQVFIsIGJmZF9zaXplX3R5cGUgc2l6ZSwgYmZkX3NpemVfdHlwZSBuaXRlbXMsIGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc2VlayBQQVJBTVMgKChiZmQgKmFiZmQsIGZpbGVfcHRyIGZwLCBpbnQgZGlyZWN0aW9uKSk7Ci1leHRlcm4gbG9uZyBiZmRfdGVsbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX2ZsdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc3RhdCBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBzdGF0ICopKTsKLQotCi0vKiBDYXN0IGZyb20gY29uc3QgY2hhciAqIHRvIGNoYXIgKiBzbyB0aGF0IGNhbGxlciBjYW4gYXNzaWduIHRvCi0gICBhIGNoYXIgKiB3aXRob3V0IGEgd2FybmluZy4gICovCi0jZGVmaW5lIGJmZF9nZXRfZmlsZW5hbWUoYWJmZCkgKChjaGFyICopIChhYmZkKS0+ZmlsZW5hbWUpCi0jZGVmaW5lIGJmZF9nZXRfY2FjaGVhYmxlKGFiZmQpICgoYWJmZCktPmNhY2hlYWJsZSkKLSNkZWZpbmUgYmZkX2dldF9mb3JtYXQoYWJmZCkgKChhYmZkKS0+Zm9ybWF0KQotI2RlZmluZSBiZmRfZ2V0X3RhcmdldChhYmZkKSAoKGFiZmQpLT54dmVjLT5uYW1lKQotI2RlZmluZSBiZmRfZ2V0X2ZsYXZvdXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+Zmxhdm91cikKLSNkZWZpbmUgYmZkX2JpZ19lbmRpYW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+Ynl0ZW9yZGVyID09IEJGRF9FTkRJQU5fQklHKQotI2RlZmluZSBiZmRfbGl0dGxlX2VuZGlhbihhYmZkKSAoKGFiZmQpLT54dmVjLT5ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9oZWFkZXJfYmlnX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9CSUcpCi0jZGVmaW5lIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9nZXRfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT5mbGFncykKLSNkZWZpbmUgYmZkX2FwcGxpY2FibGVfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT54dmVjLT5vYmplY3RfZmxhZ3MpCi0jZGVmaW5lIGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MoYWJmZCkgKChhYmZkKS0+eHZlYy0+c2VjdGlvbl9mbGFncykKLSNkZWZpbmUgYmZkX215X2FyY2hpdmUoYWJmZCkgKChhYmZkKS0+bXlfYXJjaGl2ZSkKLSNkZWZpbmUgYmZkX2hhc19tYXAoYWJmZCkgKChhYmZkKS0+aGFzX2FybWFwKQotCi0jZGVmaW5lIGJmZF92YWxpZF9yZWxvY190eXBlcyhhYmZkKSAoKGFiZmQpLT54dmVjLT52YWxpZF9yZWxvY190eXBlcykKLSNkZWZpbmUgYmZkX3VzcmRhdGEoYWJmZCkgKChhYmZkKS0+dXNyZGF0YSkKLQotI2RlZmluZSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MoYWJmZCkgKChhYmZkKS0+c3RhcnRfYWRkcmVzcykKLSNkZWZpbmUgYmZkX2dldF9zeW1jb3VudChhYmZkKSAoKGFiZmQpLT5zeW1jb3VudCkKLSNkZWZpbmUgYmZkX2dldF9vdXRzeW1ib2xzKGFiZmQpICgoYWJmZCktPm91dHN5bWJvbHMpCi0jZGVmaW5lIGJmZF9jb3VudF9zZWN0aW9ucyhhYmZkKSAoKGFiZmQpLT5zZWN0aW9uX2NvdW50KQotCi0jZGVmaW5lIGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhcihhYmZkKSAoKGFiZmQpLT54dmVjLT5zeW1ib2xfbGVhZGluZ19jaGFyKQotCi0jZGVmaW5lIGJmZF9zZXRfY2FjaGVhYmxlKGFiZmQsYm9vbCkgKCgoYWJmZCktPmNhY2hlYWJsZSA9IChib29sZWFuKShib29sKSksIHRydWUpCi0KLWV4dGVybiBib29sZWFuIGJmZF9yZWNvcmRfcGhkcgotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywgYm9vbGVhbiwgZmxhZ3dvcmQsIGJvb2xlYW4sIGJmZF92bWEsCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIEJ5dGUgc3dhcHBpbmcgcm91dGluZXMuICAqLwotCi1iZmRfdm1hCQliZmRfZ2V0YjY0CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYSAJYmZkX2dldGw2NAkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRiMzIJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0bDMyCSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGIxNgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRsMTYJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjY0CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGw2NAkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiMzIJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDMyCSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGIxNgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsMTYJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci0MCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgRUNPRkYgcm91dGluZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvOwotc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXA7Ci1zdHJ1Y3QgZWNvZmZfZXh0cjsKLXN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnk7Ci1zdHJ1Y3QgYmZkX2xpbmtfaW5mbzsKLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5Owotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlOwotI2VuZGlmCi1leHRlcm4gYmZkX3ZtYSBiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfdm1hIGdwX3ZhbHVlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfc2V0X3JlZ21hc2tzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyBncHJtYXNrLCB1bnNpZ25lZCBsb25nIGZwcm1hc2ssCi0JICAgdW5zaWduZWQgbG9uZyAqY3BybWFzaykpOwotZXh0ZXJuIFBUUiBiZmRfZWNvZmZfZGVidWdfaW5pdAotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIGJmZF9lY29mZl9kZWJ1Z19mcmVlCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmlucHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICppbnB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsIGJmZCAqaW5wdXRfYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0JICAgYm9vbGVhbiAoKmdldF9leHRyKSAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotCQkJCXN0cnVjdCBlY29mZl9leHRyICopLAotCSAgIHZvaWQgKCpzZXRfaW5kZXgpIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0JCQkgICAgICBiZmRfc2l6ZV90eXBlKSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZWNvZmZfZXh0ciAqZXN5bSkpOwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX2Vjb2ZmX2RlYnVnX3NpemUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXApKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9kZWJ1ZwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZwotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiwgc3RydWN0IHNlYyAqLAotCSAgIGNoYXIgKiopKTsKLQotLyogRXh0ZXJuYWxseSB2aXNpYmxlIEVMRiByb3V0aW5lcy4gICovCi0KLXN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdAotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5leHQ7Ci0gIGJmZCAqYnk7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpiZmRfZWxmX2dldF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKiopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpiZmRfZWxmX2dldF9kdF9zb25hbWUgUEFSQU1TICgoYmZkICopKTsKLQotLyogU3VuT1Mgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IHNlYyAqKikpOwotCi0vKiBMaW51eCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9tNjhrbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3BhcmNsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogbW1hcCBoYWNrcyAqLwotCi1zdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWw7Ci10eXBlZGVmIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCBiZmRfd2luZG93X2ludGVybmFsOwotCi10eXBlZGVmIHN0cnVjdCBfYmZkX3dpbmRvdyB7Ci0gIC8qIFdoYXQgdGhlIHVzZXIgYXNrZWQgZm9yLiAgKi8KLSAgUFRSIGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogVGhlIGFjdHVhbCB3aW5kb3cgdXNlZCBieSBCRkQuICBTbWFsbCB1c2VyLXJlcXVlc3RlZCByZWFkLW9ubHkKLSAgICAgcmVnaW9ucyBzaGFyaW5nIGEgcGFnZSBtYXkgc2hhcmUgYSBzaW5nbGUgd2luZG93IGludG8gdGhlIG9iamVjdAotICAgICBmaWxlLiAgUmVhZC13cml0ZSB2ZXJzaW9ucyBzaG91bGRuJ3QgdW50aWwgSSd2ZSBmaXhlZCB0aGluZ3MgdG8KLSAgICAga2VlcCB0cmFjayBvZiB3aGljaCBwb3J0aW9ucyBoYXZlIGJlZW4gY2xhaW1lZCBieSB0aGUKLSAgICAgYXBwbGljYXRpb247IGRvbid0IHdhbnQgdG8gZ2l2ZSB0aGUgc2FtZSByZWdpb24gYmFjayB3aGVuIHRoZQotICAgICBhcHBsaWNhdGlvbiB3YW50cyB0d28gd3JpdGFibGUgY29waWVzISAgKi8KLSAgc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsICppOwotfSBiZmRfd2luZG93OwotCi1leHRlcm4gdm9pZCBiZmRfaW5pdF93aW5kb3cgUEFSQU1TICgoYmZkX3dpbmRvdyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZnJlZV93aW5kb3cgUEFSQU1TICgoYmZkX3dpbmRvdyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZ2V0X2ZpbGVfd2luZG93Ci0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSwgYmZkX3dpbmRvdyAqLCBib29sZWFuKSk7Ci0KLS8qIFhDT0ZGIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF9zaXplX3R5cGUpKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9leHBvcnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCSAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4sCi0JICAgaW50LCBib29sZWFuLCBib29sZWFuLCBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIEV4dGVybmFsbHkgdmlzaWJsZSBDT0ZGIHJvdXRpbmVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgaW50ZXJuYWxfc3ltZW50OwotdW5pb24gaW50ZXJuYWxfYXV4ZW50OwotI2VuZGlmCi0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX2dldF9zeW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX2dldF9hdXhlbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgaW50LCB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIHVuc2lnbmVkIGludCkpOwotCi0vKiBBUk0gSW50ZXJ3b3JraW5nIHN1cHBvcnQuICBDYWxsZWQgZnJvbSBsaW5rZXIuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGludCkpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBFTEYgQVJNIEludGVyd29ya2luZyBzdXBwb3J0LiAgQ2FsbGVkIGZyb20gbGlua2VyLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBpbnQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQW5kIG1vcmUgZnJvbSB0aGUgc291cmNlLiAgKi8KLXZvaWQgCi1iZmRfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWJmZCAqCi1iZmRfb3BlbnIgUEFSQU1TICgoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCkpOwotCi1iZmQgKgotYmZkX2Zkb3BlbnIgUEFSQU1TICgoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCwgaW50IGZkKSk7Ci0KLWJmZCAqCi1iZmRfb3BlbnN0cmVhbXIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIFBUUikpOwotCi1iZmQgKgotYmZkX29wZW53IFBBUkFNUyAoKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQpKTsKLQotYm9vbGVhbiAKLWJmZF9jbG9zZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbiAKLWJmZF9jbG9zZV9hbGxfZG9uZSBQQVJBTVMgKChiZmQgKikpOwotCi1iZmQgKgotYmZkX2NyZWF0ZSBQQVJBTVMgKChDT05TVCBjaGFyICpmaWxlbmFtZSwgYmZkICp0ZW1wbCkpOwotCi1ib29sZWFuIAotYmZkX21ha2Vfd3JpdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWJvb2xlYW4gCi1iZmRfbWFrZV9yZWFkYWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotCi0gLyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIHVzZXIgc2VjdGlvbiBkYXRhLiAgKi8KLQotI2RlZmluZSBiZmRfcHV0XzgoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICAoKHZvaWQpICgqKCh1bnNpZ25lZCBjaGFyICopKHB0cikpID0gKHVuc2lnbmVkIGNoYXIpKHZhbCkpKQotI2RlZmluZSBiZmRfcHV0X3NpZ25lZF84IFwKLSAgICAgICAgICAgICAgIGJmZF9wdXRfOAotI2RlZmluZSBiZmRfZ2V0XzgoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgKCoodW5zaWduZWQgY2hhciAqKShwdHIpKQotI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF84KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgKCgqKHVuc2lnbmVkIGNoYXIgKikocHRyKSBeIDB4ODApIC0gMHg4MCkKLQotI2RlZmluZSBiZmRfcHV0XzE2KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHgxNiwgKCh2YWwpLChwdHIpKSkKLSNkZWZpbmUgYmZkX3B1dF9zaWduZWRfMTYgXAotICAgICAgICAgICAgICAgIGJmZF9wdXRfMTYKLSNkZWZpbmUgYmZkX2dldF8xNihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDE2LCAocHRyKSkKLSNkZWZpbmUgYmZkX2dldF9zaWduZWRfMTYoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQgKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MzIsICgodmFsKSwocHRyKSkpCi0jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzMyIFwKLSAgICAgICAgICAgICAgICBiZmRfcHV0XzMyCi0jZGVmaW5lIGJmZF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgzMiwgKHB0cikpCi0jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzMyKGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF8zMiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4NjQsICgodmFsKSwgKHB0cikpKQotI2RlZmluZSBiZmRfcHV0X3NpZ25lZF82NCBcCi0gICAgICAgICAgICAgICAgYmZkX3B1dF82NAotI2RlZmluZSBiZmRfZ2V0XzY0KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4NjQsIChwdHIpKQotI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotCi0jZGVmaW5lIGJmZF9nZXQoYml0cywgYWJmZCwgcHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKChiaXRzKSA9PSA4ID8gYmZkX2dldF84IChhYmZkLCBwdHIpICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMTYgPyBiZmRfZ2V0XzE2IChhYmZkLCBwdHIpICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMzIgPyBiZmRfZ2V0XzMyIChhYmZkLCBwdHIpICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gNjQgPyBiZmRfZ2V0XzY0IChhYmZkLCBwdHIpICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYWJvcnQgKCksIChiZmRfdm1hKSAtIDEpKQotCi0jZGVmaW5lIGJmZF9wdXQoYml0cywgYWJmZCwgdmFsLCBwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKChiaXRzKSA9PSA4ID8gYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikgICAgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMTYgPyBiZmRfcHV0XzE2IChhYmZkLCB2YWwsIHB0cikgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gMzIgPyBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHB0cikgICBcCi0gICAgICAgICAgICAgICAgOiAoYml0cykgPT0gNjQgPyBiZmRfcHV0XzY0IChhYmZkLCB2YWwsIHB0cikgICBcCi0gICAgICAgICAgICAgICAgOiAoYWJvcnQgKCksICh2b2lkKSAwKSkKLQotCi0gLyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIGZpbGUgaGVhZGVyIGRhdGEuICAqLwotCi0jZGVmaW5lIGJmZF9oX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzgoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsLCBwdHIpCi0jZGVmaW5lIGJmZF9oX2dldF84KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgYmZkX2dldF84IChhYmZkLCBwdHIpCi0jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgIGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIHB0cikKLQotI2RlZmluZSBiZmRfaF9wdXRfMTYoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MTYsKHZhbCxwdHIpKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzE2IFwKLSAgICAgICAgICAgICAgICBiZmRfaF9wdXRfMTYKLSNkZWZpbmUgYmZkX2hfZ2V0XzE2KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgxNiwocHRyKSkKLSNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF8xNihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCi0KLSNkZWZpbmUgYmZkX2hfcHV0XzMyKGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDMyLCh2YWwscHRyKSkKLSNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8zMiBcCi0gICAgICAgICAgICAgICAgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIGJmZF9oX2dldF8zMihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MzIsKHB0cikpCi0jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQotCi0jZGVmaW5lIGJmZF9oX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHg2NCwodmFsLCBwdHIpKQotI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzY0IFwKLSAgICAgICAgICAgICAgICBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgYmZkX2hfZ2V0XzY0KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHg2NCwocHRyKSkKLSNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF82NCwgKHB0cikpCi0KLSAgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYSBjb21kYXQgc2VjdGlvbiwgYXMgaW4gUEUuICBBIGNvbWRhdAotICAgIHNlY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBzeW1ib2wuICBXaGVuIHRoZSBsaW5rZXIKLSAgICBzZWVzIGEgY29tZGF0IHNlY3Rpb24sIGl0IGtlZXBzIG9ubHkgb25lIG9mIHRoZSBzZWN0aW9ucyB3aXRoIGEKLSAgICBnaXZlbiBuYW1lIGFuZCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBzeW1ib2wuICovCi0KLXN0cnVjdCBiZmRfY29tZGF0X2luZm8KLXsKLSAgIC8qIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgY29tZGF0IHNlY3Rpb24uICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAvKiBUaGUgbG9jYWwgc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEKLSAgICAgY29tZGF0IHNlY3Rpb24uICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICAgIHNwZWNpZmljIGNvZGU7IGl0IGlzIG5vdCBhbiBpbmRleCBpbnRvIHRoZSBsaXN0IHJldHVybmVkIGJ5Ci0gICAgIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLiAgKi8KLSAgbG9uZyBzeW1ib2w7Ci0KLSAgIC8qIElmIHRoaXMgc2VjdGlvbiBpcyBiZWluZyBkaXNjYXJkZWQsIHRoZSBsaW5rZXIgdXNlcyB0aGlzIGZpZWxkCi0gICAgIHRvIHBvaW50IHRvIHRoZSBpbnB1dCBzZWN0aW9uIHdoaWNoIGlzIGJlaW5nIGtlcHQuICAqLwotICBzdHJ1Y3Qgc2VjICpzZWM7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBzZWMKLXsKLSAgICAgICAgIC8qIFRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uOyB0aGUgbmFtZSBpc24ndCBhIGNvcHksIHRoZSBwb2ludGVyIGlzCi0gICAgICAgIHRoZSBzYW1lIGFzIHRoYXQgcGFzc2VkIHRvIGJmZF9tYWtlX3NlY3Rpb24uICovCi0KLSAgICBDT05TVCBjaGFyICpuYW1lOwotCi0gICAgICAgICAvKiBXaGljaCBzZWN0aW9uIGlzIGl0OyAwLi5udGguICAgICAgKi8KLQotICAgaW50IGluZGV4OwotCi0gICAgICAgICAvKiBUaGUgbmV4dCBzZWN0aW9uIGluIHRoZSBsaXN0IGJlbG9uZ2luZyB0byB0aGUgQkZELCBvciBOVUxMLiAqLwotCi0gICAgc3RydWN0IHNlYyAqbmV4dDsKLQotICAgICAgICAgLyogVGhlIGZpZWxkIGZsYWdzIGNvbnRhaW5zIGF0dHJpYnV0ZXMgb2YgdGhlIHNlY3Rpb24uIFNvbWUKLSAgICAgICAgICAgZmxhZ3MgYXJlIHJlYWQgaW4gZnJvbSB0aGUgb2JqZWN0IGZpbGUsIGFuZCBzb21lIGFyZQotICAgICAgICAgICBzeW50aGVzaXplZCBmcm9tIG90aGVyIGluZm9ybWF0aW9uLiAgKi8KLQotICAgIGZsYWd3b3JkIGZsYWdzOwotCi0jZGVmaW5lIFNFQ19OT19GTEFHUyAgIDB4MDAwCi0KLSAgICAgICAgIC8qIFRlbGxzIHRoZSBPUyB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBzZWN0aW9uIHdoZW4gbG9hZGluZy4KLSAgICAgICAgICAgVGhpcyBpcyBjbGVhciBmb3IgYSBzZWN0aW9uIGNvbnRhaW5pbmcgZGVidWcgaW5mb3JtYXRpb24KLSAgICAgICAgICAgb25seS4gKi8KLSNkZWZpbmUgU0VDX0FMTE9DICAgICAgMHgwMDEKLQotICAgICAgICAgLyogVGVsbHMgdGhlIE9TIHRvIGxvYWQgdGhlIHNlY3Rpb24gZnJvbSB0aGUgZmlsZSB3aGVuIGxvYWRpbmcuCi0gICAgICAgICAgIFRoaXMgaXMgY2xlYXIgZm9yIGEgLmJzcyBzZWN0aW9uLiAqLwotI2RlZmluZSBTRUNfTE9BRCAgICAgICAweDAwMgotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBkYXRhIHN0aWxsIHRvIGJlIHJlbG9jYXRlZCwgc28gdGhlcmUgaXMKLSAgICAgICAgICAgc29tZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvby4gKi8KLSNkZWZpbmUgU0VDX1JFTE9DICAgICAgMHgwMDQKLQotI2lmIDAgICAgLyogT2Jzb2xldGUgPyAqLwotI2RlZmluZSBTRUNfQkFMSUdOICAgICAweDAwOAotI2VuZGlmCi0KLSAgICAgICAgIC8qIEEgc2lnbmFsIHRvIHRoZSBPUyB0aGF0IHRoZSBzZWN0aW9uIGNvbnRhaW5zIHJlYWQgb25seQotICAgICAgICAgIGRhdGEuICovCi0jZGVmaW5lIFNFQ19SRUFET05MWSAgIDB4MDEwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvZGUgb25seS4gKi8KLSNkZWZpbmUgU0VDX0NPREUgICAgICAgMHgwMjAKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgZGF0YSBvbmx5LiAqLwotI2RlZmluZSBTRUNfREFUQSAgICAgICAweDA0MAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiB3aWxsIHJlc2lkZSBpbiBST00uICovCi0jZGVmaW5lIFNFQ19ST00gICAgICAgIDB4MDgwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbnN0cnVjdG9yIGluZm9ybWF0aW9uLiBUaGlzIHNlY3Rpb24KLSAgICAgICAgICAgdHlwZSBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gY3JlYXRlIGxpc3RzIG9mIGNvbnN0cnVjdG9ycyBhbmQKLSAgICAgICAgICAgZGVzdHJ1Y3RvcnMgdXNlZCBieSA8PGcrKz4+LiBXaGVuIGEgYmFjayBlbmQgc2VlcyBhIHN5bWJvbAotICAgICAgICAgICB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBhIGNvbnN0cnVjdG9yIGxpc3QsIGl0IGNyZWF0ZXMgYSBuZXcKLSAgICAgICAgICAgc2VjdGlvbiBmb3IgdGhlIHR5cGUgb2YgbmFtZSAoZS5nLiwgPDxfX0NUT1JfTElTVF9fPj4pLCBhdHRhY2hlcwotICAgICAgICAgICB0aGUgc3ltYm9sIHRvIGl0LCBhbmQgYnVpbGRzIGEgcmVsb2NhdGlvbi4gVG8gYnVpbGQgdGhlIGxpc3RzCi0gICAgICAgICAgIG9mIGNvbnN0cnVjdG9ycywgYWxsIHRoZSBsaW5rZXIgaGFzIHRvIGRvIGlzIGNhdGVuYXRlIGFsbCB0aGUKLSAgICAgICAgICAgc2VjdGlvbnMgY2FsbGVkIDw8X19DVE9SX0xJU1RfXz4+IGFuZCByZWxvY2F0ZSB0aGUgZGF0YQotICAgICAgICAgICBjb250YWluZWQgd2l0aGluIC0gZXhhY3RseSB0aGUgb3BlcmF0aW9ucyBpdCB3b3VsZCBwZWZvcm0gb24KLSAgICAgICAgICAgc3RhbmRhcmQgZGF0YS4gKi8KLSNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SIDB4MTAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGlzIGEgY29uc3RydWN0b3IsIGFuZCBzaG91bGQgYmUgcGxhY2VkIGF0IHRoZQotICAgICAgICAgIGVuZCBvZiB0aGUgdGV4dCwgZGF0YSwgb3IgYnNzIHNlY3Rpb24oPykuICovCi0jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9URVhUIDB4MTEwMAotI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfREFUQSAweDIxMDAKLSNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX0JTUyAgMHgzMTAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGhhcyBjb250ZW50cyAtIGEgZGF0YSBzZWN0aW9uIGNvdWxkIGJlCi0gICAgICAgICAgIDw8U0VDX0FMTE9DPj4gfCA8PFNFQ19IQVNfQ09OVEVOVFM+PjsgYSBkZWJ1ZyBzZWN0aW9uIGNvdWxkIGJlCi0gICAgICAgICAgIDw8U0VDX0hBU19DT05URU5UUz4+ICovCi0jZGVmaW5lIFNFQ19IQVNfQ09OVEVOVFMgMHgyMDAKLQotICAgICAgICAgLyogQW4gaW5zdHJ1Y3Rpb24gdG8gdGhlIGxpbmtlciB0byBub3Qgb3V0cHV0IHRoZSBzZWN0aW9uCi0gICAgICAgICAgIGV2ZW4gaWYgaXQgaGFzIGluZm9ybWF0aW9uIHdoaWNoIHdvdWxkIG5vcm1hbGx5IGJlIHdyaXR0ZW4uICovCi0jZGVmaW5lIFNFQ19ORVZFUl9MT0FEIDB4NDAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGlzIGEgQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLiAgVGhpcyBmbGFnIGlzCi0gICAgICAgICAgIG9ubHkgZm9yIHRoZSBsaW5rZXIuICBJZiB0aGlzIHR5cGUgb2Ygc2VjdGlvbiBhcHBlYXJzIGluCi0gICAgICAgICAgIHRoZSBpbnB1dCBmaWxlLCB0aGUgbGlua2VyIG11c3QgY29weSBpdCB0byB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgdm1hIG9yIHNpemUuICBGSVhNRTogQWx0aG91Z2ggdGhpcwotICAgICAgICAgICB3YXMgb3JpZ2luYWxseSBpbnRlbmRlZCB0byBiZSBnZW5lcmFsLCBpdCByZWFsbHkgaXMgQ09GRgotICAgICAgICAgICBzcGVjaWZpYyAoYW5kIHRoZSBmbGFnIHdhcyByZW5hbWVkIHRvIGluZGljYXRlIHRoaXMpLiAgSXQKLSAgICAgICAgICAgbWlnaHQgYmUgY2xlYW5lciB0byBoYXZlIHNvbWUgbW9yZSBnZW5lcmFsIG1lY2hhbmlzbSB0bwotICAgICAgICAgICBhbGxvdyB0aGUgYmFjayBlbmQgdG8gY29udHJvbCB3aGF0IHRoZSBsaW5rZXIgZG9lcyB3aXRoCi0gICAgICAgICAgIHNlY3Rpb25zLiAqLwotI2RlZmluZSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSAweDgwMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBjb21tb24gc3ltYm9scyAoc3ltYm9scyBtYXkgYmUgZGVmaW5lZAotICAgICAgICAgICBtdWx0aXBsZSB0aW1lcywgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGlzIHRoZSBhbW91bnQgb2YKLSAgICAgICAgICAgc3BhY2UgaXQgcmVxdWlyZXMsIGFuZCB0aGUgbGFyZ2VzdCBzeW1ib2wgdmFsdWUgaXMgdGhlIG9uZQotICAgICAgICAgICB1c2VkKS4gIE1vc3QgdGFyZ2V0cyBoYXZlIGV4YWN0bHkgb25lIG9mIHRoZXNlICh3aGljaCB3ZQotICAgICAgICAgICB0cmFuc2xhdGUgdG8gYmZkX2NvbV9zZWN0aW9uX3B0ciksIGJ1dCBFQ09GRiBoYXMgdHdvLiAqLwotI2RlZmluZSBTRUNfSVNfQ09NTU9OIDB4ODAwMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBvbmx5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEZvcgotICAgICAgICAgICBleGFtcGxlLCB0aGlzIGlzIHNldCBmb3IgRUxGIC5kZWJ1ZyBhbmQgLnN0YWIgc2VjdGlvbnMuCi0gICAgICAgICAgIHN0cmlwIHRlc3RzIHRoaXMgZmxhZyB0byBzZWUgaWYgYSBzZWN0aW9uIGNhbiBiZQotICAgICAgICAgICBkaXNjYXJkZWQuICovCi0jZGVmaW5lIFNFQ19ERUJVR0dJTkcgMHgxMDAwMAotCi0gICAgICAgICAvKiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSBoZWxkIGluIG1lbW9yeSBwb2ludGVkIHRvCi0gICAgICAgICAgIGJ5IHRoZSBjb250ZW50cyBmaWVsZC4gIFRoaXMgaXMgY2hlY2tlZCBieQotICAgICAgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsIGFuZCB0aGUgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbQotICAgICAgICAgICBtZW1vcnkgaWYgYXBwcm9wcmlhdGUuICAqLwotI2RlZmluZSBTRUNfSU5fTUVNT1JZIDB4MjAwMDAKLQotICAgICAgICAgLyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgdG8gYmUgZXhjbHVkZWQgYnkgdGhlCi0gICAgICAgICAgIGxpbmtlciBmb3IgZXhlY3V0YWJsZSBhbmQgc2hhcmVkIG9iamVjdHMgdW5sZXNzIHRob3NlCi0gICAgICAgICAgIG9iamVjdHMgYXJlIHRvIGJlIGZ1cnRoZXIgcmVsb2NhdGVkLiAgKi8KLSNkZWZpbmUgU0VDX0VYQ0xVREUgMHg0MDAwMAotCi0gICAgICAgIC8qIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIHRvIGJlIHNvcnRlZCBieSB0aGUKLSAgICAgICAgICBiYXNlZCBvbiB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIGFzc29jaWF0ZWQgc3ltYm9sCi0gICAgICAgICAgdGFibGUuICAqLwotI2RlZmluZSBTRUNfU09SVF9FTlRSSUVTIDB4ODAwMDAKLQotICAgICAgICAvKiBXaGVuIGxpbmtpbmcsIGR1cGxpY2F0ZSBzZWN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIHNob3VsZCBiZQotICAgICAgICAgIGRpc2NhcmRlZCwgcmF0aGVyIHRoYW4gYmVpbmcgY29tYmluZWQgaW50byBhIHNpbmdsZSBzZWN0aW9uIGFzCi0gICAgICAgICAgaXMgdXN1YWxseSBkb25lLiAgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBjb21tb24gc3ltYm9scyBhcmUKLSAgICAgICAgICBoYW5kbGVkLiAgU2VlIFNFQ19MSU5LX0RVUExJQ0FURVMgYmVsb3cuICAqLwotI2RlZmluZSBTRUNfTElOS19PTkNFIDB4MTAwMDAwCi0KLSAgICAgICAgLyogSWYgU0VDX0xJTktfT05DRSBpcyBzZXQsIHRoaXMgYml0ZmllbGQgZGVzY3JpYmVzIGhvdyB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIGhhbmRsZSBkdXBsaWNhdGUgc2VjdGlvbnMuICAqLwotI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTIDB4NjAwMDAwCi0KLSAgICAgICAgLyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IGR1cGxpY2F0ZQotICAgICAgICAgIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBzaG91bGQgc2ltcGx5IGJlIGRpc2NhcmRlZC4gKi8KLSNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEIDB4MAotCi0gICAgICAgIC8qIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIHdhcm4gaWYgdGhlcmUgYXJlIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMsIGFsdGhvdWdoCi0gICAgICAgICAgaXQgc2hvdWxkIHN0aWxsIG9ubHkgbGluayBvbmUgY29weS4gICovCi0jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFkgMHgyMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotICAgICAgICAgIHNob3VsZCB3YXJuIGlmIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMgYXJlIGEgZGlmZmVyZW50IHNpemUuICAqLwotI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSAweDQwMDAwMAotCi0gICAgICAgIC8qIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIHdhcm4gaWYgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucyBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgIGNvbnRlbnRzLiAgKi8KLSNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTIDB4NjAwMDAwCi0KLSAgICAgICAgLyogVGhpcyBzZWN0aW9uIHdhcyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIgYXMgcGFydCBvZiBkeW5hbWljCi0gICAgICAgICAgcmVsb2NhdGlvbiBvciBvdGhlciBhcmNhbmUgcHJvY2Vzc2luZy4gIEl0IGlzIHNraXBwZWQgd2hlbgotICAgICAgICAgIGdvaW5nIHRocm91Z2ggdGhlIGZpcnN0LXBhc3Mgb3V0cHV0LCB0cnVzdGluZyB0aGF0IHNvbWVvbmUKLSAgICAgICAgICBlbHNlIHVwIHRoZSBsaW5lIHdpbGwgdGFrZSBjYXJlIG9mIGl0IGxhdGVyLiAgKi8KLSNkZWZpbmUgU0VDX0xJTktFUl9DUkVBVEVEIDB4ODAwMDAwCi0KLSAgICAgICAgLyogVGhpcyBzZWN0aW9uIHNob3VsZCBub3QgYmUgc3ViamVjdCB0byBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotI2RlZmluZSBTRUNfS0VFUCAweDEwMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgInNob3J0IiBkYXRhLCBhbmQgc2hvdWxkIGJlIHBsYWNlZAotICAgICAgICAgICJuZWFyIiB0aGUgR1AuICAqLwotI2RlZmluZSBTRUNfU01BTExfREFUQSAweDIwMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgZGF0YSB3aGljaCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIKLSAgICAgICAgICBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cy4gICovCi0jZGVmaW5lIFNFQ19TSEFSRUQgMHg0MDAwMDAwCi0KLSAgICAgICAgLyogIEVuZCBvZiBzZWN0aW9uIGZsYWdzLiAgKi8KLQotICAgICAgICAvKiBTb21lIGludGVybmFsIHBhY2tlZCBib29sZWFuIGZpZWxkcy4gICovCi0KLSAgICAgICAgLyogU2VlIHRoZSB2bWEgZmllbGQuICAqLwotICAgICAgIHVuc2lnbmVkIGludCB1c2VyX3NldF92bWEgOiAxOwotCi0gICAgICAgIC8qIFdoZXRoZXIgcmVsb2NhdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gICovCi0gICAgICAgdW5zaWduZWQgaW50IHJlbG9jX2RvbmUgOiAxOwotCi0gICAgICAgIC8qIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBvZiB0aGUgbGlua2VyIGJhY2tlbmRzLiAgKi8KLSAgICAgICB1bnNpZ25lZCBpbnQgbGlua2VyX21hcmsgOiAxOwotCi0gICAgICAgIC8qIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBsaW5rZXIgYmFja2VuZHMgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gICAgICAgdW5zaWduZWQgaW50IGdjX21hcmsgOiAxOwotCi0gICAgICAgIC8qIEVuZCBvZiBpbnRlcm5hbCBwYWNrZWQgYm9vbGVhbiBmaWVsZHMuICAqLwotCi0gICAgICAgIC8qICBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdpbGwgYmUKLSAgICAgICAgICAgYXQgcnVuIHRpbWUuICBUaGUgc3ltYm9scyBhcmUgcmVsb2NhdGVkIGFnYWluc3QgdGhpcy4gIFRoZQotICAgICAgICAgICB1c2VyX3NldF92bWEgZmxhZyBpcyBtYWludGFpbmVkIGJ5IGJmZDsgaWYgaXQncyBub3Qgc2V0LCB0aGUKLSAgICAgICAgICAgYmFja2VuZCBjYW4gYXNzaWduIGFkZHJlc3NlcyAoZm9yIGV4YW1wbGUsIGluIDw8YS5vdXQ+Piwgd2hlcmUKLSAgICAgICAgICAgdGhlIGRlZmF1bHQgYWRkcmVzcyBmb3IgPDwuZGF0YT4+IGlzIGRlcGVuZGVudCBvbiB0aGUgc3BlY2lmaWMKLSAgICAgICAgICAgdGFyZ2V0IGFuZCB2YXJpb3VzIGZsYWdzKS4gICovCi0KLSAgIGJmZF92bWEgdm1hOwotCi0gICAgICAgIC8qICBUaGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIC0gd2hlcmUgaXQgd291bGQgYmUgaW4gYQotICAgICAgICAgICByb20gaW1hZ2U7IHJlYWxseSBvbmx5IHVzZWQgZm9yIHdyaXRpbmcgc2VjdGlvbiBoZWFkZXIKLSAgICAgICAgICAgaW5mb3JtYXRpb24uICovCi0KLSAgIGJmZF92bWEgbG1hOwotCi0gICAgICAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBpbiBieXRlcywgYXMgaXQgd2lsbCBiZSBvdXRwdXQuCi0gICAgICAgICAgIGNvbnRhaW5zIGEgdmFsdWUgZXZlbiBpZiB0aGUgc2VjdGlvbiBoYXMgbm8gY29udGVudHMgKGUuZy4sIHRoZQotICAgICAgICAgICBzaXplIG9mIDw8LmJzcz4+KS4gVGhpcyB3aWxsIGJlIGZpbGxlZCBpbiBhZnRlciByZWxvY2F0aW9uICovCi0KLSAgIGJmZF9zaXplX3R5cGUgX2Nvb2tlZF9zaXplOwotCi0gICAgICAgICAvKiBUaGUgb3JpZ2luYWwgc2l6ZSBvbiBkaXNrIG9mIHRoZSBzZWN0aW9uLCBpbiBieXRlcy4gIE5vcm1hbGx5IHRoaXMKLSAgICAgICAgICAgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUsIGJ1dCBpZiBzb21lIHJlbGF4aW5nIGhhcwotICAgICAgICAgICBiZWVuIGRvbmUsIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIGJlIGJpZ2dlci4gICovCi0KLSAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotCi0gICAgICAgICAvKiBJZiB0aGlzIHNlY3Rpb24gaXMgZ29pbmcgdG8gYmUgb3V0cHV0LCB0aGVuIHRoaXMgdmFsdWUgaXMgdGhlCi0gICAgICAgICAgIG9mZnNldCBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgaW5wdXQKLSAgICAgICAgICAgc2VjdGlvbi4gRS5nLiwgaWYgdGhpcyB3YXMgZ29pbmcgdG8gc3RhcnQgYXQgdGhlIDEwMHRoIGJ5dGUgaW4KLSAgICAgICAgICAgdGhlIG91dHB1dCBzZWN0aW9uLCB0aGlzIHZhbHVlIHdvdWxkIGJlIDEwMC4gKi8KLQotICAgYmZkX3ZtYSBvdXRwdXRfb2Zmc2V0OwotCi0gICAgICAgICAvKiBUaGUgb3V0cHV0IHNlY3Rpb24gdGhyb3VnaCB3aGljaCB0byBtYXAgb24gb3V0cHV0LiAqLwotCi0gICBzdHJ1Y3Qgc2VjICpvdXRwdXRfc2VjdGlvbjsKLQotICAgICAgICAgLyogVGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBvZiB0aGUgc2VjdGlvbiwgYXMgYW4gZXhwb25lbnQgb2YgMiAtCi0gICAgICAgICAgIGUuZy4sIDMgYWxpZ25zIHRvIDJeMyAob3IgOCkuICovCi0KLSAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Ci0KLSAgICAgICAgIC8qIElmIGFuIGlucHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiByZWxvY2F0aW9uCi0gICAgICAgICAgIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKi8KLQotICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICpyZWxvY2F0aW9uOwotCi0gICAgICAgICAvKiBJZiBhbiBvdXRwdXQgc2VjdGlvbiwgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHBvaW50ZXJzIHRvCi0gICAgICAgICAgIHJlbG9jYXRpb24gcmVjb3JkcyBmb3IgdGhlIGRhdGEgaW4gdGhpcyBzZWN0aW9uLiAqLwotCi0gICBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKipvcmVsb2NhdGlvbjsKLQotICAgICAgICAgLyogVGhlIG51bWJlciBvZiByZWxvY2F0aW9uIHJlY29yZHMgaW4gb25lIG9mIHRoZSBhYm92ZSAgKi8KLQotICAgdW5zaWduZWQgcmVsb2NfY291bnQ7Ci0KLSAgICAgICAgIC8qIEluZm9ybWF0aW9uIGJlbG93IGlzIGJhY2sgZW5kIHNwZWNpZmljIC0gYW5kIG5vdCBhbHdheXMgdXNlZAotICAgICAgICAgICBvciB1cGRhdGVkLiAgKi8KLQotICAgICAgICAgLyogRmlsZSBwb3NpdGlvbiBvZiBzZWN0aW9uIGRhdGEgICAgKi8KLQotICAgZmlsZV9wdHIgZmlsZXBvczsKLQotICAgICAgICAgLyogRmlsZSBwb3NpdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gKi8KLQotICAgZmlsZV9wdHIgcmVsX2ZpbGVwb3M7Ci0KLSAgICAgICAgIC8qIEZpbGUgcG9zaXRpb24gb2YgbGluZSBkYXRhICAgICAgICovCi0KLSAgIGZpbGVfcHRyIGxpbmVfZmlsZXBvczsKLQotICAgICAgICAgLyogUG9pbnRlciB0byBkYXRhIGZvciBhcHBsaWNhdGlvbnMgKi8KLQotICAgUFRSIHVzZXJkYXRhOwotCi0gICAgICAgICAvKiBJZiB0aGUgU0VDX0lOX01FTU9SWSBmbGFnIGlzIHNldCwgdGhpcyBwb2ludHMgdG8gdGhlIGFjdHVhbAotICAgICAgICAgICBjb250ZW50cy4gICovCi0gICB1bnNpZ25lZCBjaGFyICpjb250ZW50czsKLQotICAgICAgICAgLyogQXR0YWNoZWQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gKi8KLQotICAgYWxlbnQgKmxpbmVubzsKLQotICAgICAgICAgLyogTnVtYmVyIG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgICAqLwotCi0gICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OwotCi0gICAgICAgICAvKiBPcHRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIENPTURBVCBlbnRyeTsgTlVMTCBpZiBub3QgQ09NREFUICovCi0KLSAgIHN0cnVjdCBiZmRfY29tZGF0X2luZm8gKmNvbWRhdDsKLQotICAgICAgICAgLyogV2hlbiBhIHNlY3Rpb24gaXMgYmVpbmcgb3V0cHV0LCB0aGlzIHZhbHVlIGNoYW5nZXMgYXMgbW9yZQotICAgICAgICAgICBsaW5lbnVtYmVycyBhcmUgd3JpdHRlbiBvdXQgKi8KLQotICAgZmlsZV9wdHIgbW92aW5nX2xpbmVfZmlsZXBvczsKLQotICAgICAgICAgLyogV2hhdCB0aGUgc2VjdGlvbiBudW1iZXIgaXMgaW4gdGhlIHRhcmdldCB3b3JsZCAgKi8KLQotICAgaW50IHRhcmdldF9pbmRleDsKLQotICAgUFRSIHVzZWRfYnlfYmZkOwotCi0gICAgICAgICAvKiBJZiB0aGlzIGlzIGEgY29uc3RydWN0b3Igc2VjdGlvbiB0aGVuIGhlcmUgaXMgYSBsaXN0IG9mIHRoZQotICAgICAgICAgICByZWxvY2F0aW9ucyBjcmVhdGVkIHRvIHJlbG9jYXRlIGl0ZW1zIHdpdGhpbiBpdC4gKi8KLQotICAgc3RydWN0IHJlbGVudF9jaGFpbiAqY29uc3RydWN0b3JfY2hhaW47Ci0KLSAgICAgICAgIC8qIFRoZSBCRkQgd2hpY2ggb3ducyB0aGUgc2VjdGlvbi4gKi8KLQotICAgYmZkICpvd25lcjsKLQotICAgICAgICAgLyogQSBzeW1ib2wgd2hpY2ggcG9pbnRzIGF0IHRoaXMgc2VjdGlvbiBvbmx5ICovCi0gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7Ci0gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9sX3B0cl9wdHI7Ci0KLSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcl9oZWFkOwotICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX3RhaWw7Ci19IGFzZWN0aW9uIDsKLQotICAgICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2xvYmFsLCBhbmQgYXJlIG1hbmFnZWQgYnkgQkZELiAgVGhlIGFwcGxpY2F0aW9uCi0gICAgICAgYW5kIHRhcmdldCBiYWNrIGVuZCBhcmUgbm90IHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIHZhbHVlcyBpbgotICAgICAgIHRoZXNlIHNlY3Rpb25zLiAgTmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgc2VjdGlvbl9wdHIgbWFjcm9zIHJhdGhlcgotICAgICAgIHRoYW4gcmVmZXJyaW5nIGRpcmVjdGx5IHRvIHRoZSBjb25zdCBzZWN0aW9ucy4gIFRoZSBjb25zdCBzZWN0aW9ucwotICAgICAgIG1heSBldmVudHVhbGx5IHZhbmlzaC4gICovCi0jZGVmaW5lIEJGRF9BQlNfU0VDVElPTl9OQU1FICIqQUJTKiIKLSNkZWZpbmUgQkZEX1VORF9TRUNUSU9OX05BTUUgIipVTkQqIgotI2RlZmluZSBCRkRfQ09NX1NFQ1RJT05fTkFNRSAiKkNPTSoiCi0jZGVmaW5lIEJGRF9JTkRfU0VDVElPTl9OQU1FICIqSU5EKiIKLQotICAgICAvKiB0aGUgYWJzb2x1dGUgc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9hYnNfc2VjdGlvbjsKLSNkZWZpbmUgYmZkX2Fic19zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfYWJzX3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9pc19hYnNfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotICAgICAvKiBQb2ludGVyIHRvIHRoZSB1bmRlZmluZWQgc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF91bmRfc2VjdGlvbjsKLSNkZWZpbmUgYmZkX3VuZF9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfdW5kX3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9pc191bmRfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfdW5kX3NlY3Rpb25fcHRyKQotICAgICAvKiBQb2ludGVyIHRvIHRoZSBjb21tb24gc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9jb21fc2VjdGlvbjsKLSNkZWZpbmUgYmZkX2NvbV9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfY29tX3NlY3Rpb24pCi0gICAgIC8qIFBvaW50ZXIgdG8gdGhlIGluZGlyZWN0IHNlY3Rpb24gKi8KLWV4dGVybiBjb25zdCBhc2VjdGlvbiBiZmRfaW5kX3NlY3Rpb247Ci0jZGVmaW5lIGJmZF9pbmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2luZF9zZWN0aW9uKQotI2RlZmluZSBiZmRfaXNfaW5kX3NlY3Rpb24oc2VjKSAoKHNlYykgPT0gYmZkX2luZF9zZWN0aW9uX3B0cikKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfYWJzX3N5bWJvbDsKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX2NvbV9zeW1ib2w7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF91bmRfc3ltYm9sOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfaW5kX3N5bWJvbDsKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHNlY3Rpb24pIFwKLSAgICAgKHNlY3Rpb24tPnJlbG9jX2RvbmUgPyAoYWJvcnQoKSwxKTogKHNlY3Rpb24pLT5fcmF3X3NpemUpCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jKHNlY3Rpb24pIFwKLSAgICAgKChzZWN0aW9uLT5yZWxvY19kb25lKSA/IChzZWN0aW9uKS0+X2Nvb2tlZF9zaXplOiAoYWJvcnQoKSwxKSkKLWFzZWN0aW9uICoKLWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSkpOwotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSkpOwotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X3NlY3Rpb25fZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBmbGFnd29yZCBmbGFncykpOwotCi12b2lkIAotYmZkX21hcF9vdmVyX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICB2b2lkICgqZnVuYykoYmZkICphYmZkLAotICAgIGFzZWN0aW9uICpzZWN0LAotICAgIFBUUiBvYmopLAotICAgIFBUUiBvYmopKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfc2VjdGlvbl9zaXplIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYmZkX3NpemVfdHlwZSB2YWwpKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cwotIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLSAgICBQVFIgZGF0YSwKLSAgICBmaWxlX3B0ciBvZmZzZXQsCi0gICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotCi1ib29sZWFuIAotYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGxvY2F0aW9uLAotICAgIGZpbGVfcHRyIG9mZnNldCwgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotCi1ib29sZWFuIAotYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBhc2VjdGlvbiAqaXNlYywgYmZkICpvYmZkLCBhc2VjdGlvbiAqb3NlYykpOwotCi0jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikgXAotICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLCBcCi0gICAgICAgICAgICAgICAoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKSkKLXZvaWQgCi1fYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQKLSBQQVJBTVMgKChhc2VjdGlvbiAqc2VjdGlvbikpOwotCi1lbnVtIGJmZF9hcmNoaXRlY3R1cmUgCi17Ci0gIGJmZF9hcmNoX3Vua25vd24sICAgIC8qIEZpbGUgYXJjaCBub3Qga25vd24gKi8KLSAgYmZkX2FyY2hfb2JzY3VyZSwgICAgLyogQXJjaCBrbm93biwgbm90IG9uZSBvZiB0aGVzZSAqLwotICBiZmRfYXJjaF9tNjhrLCAgICAgICAvKiBNb3Rvcm9sYSA2OHh4eCAqLwotI2RlZmluZSBiZmRfbWFjaF9tNjgwMDAgMQotI2RlZmluZSBiZmRfbWFjaF9tNjgwMDggMgotI2RlZmluZSBiZmRfbWFjaF9tNjgwMTAgMwotI2RlZmluZSBiZmRfbWFjaF9tNjgwMjAgNAotI2RlZmluZSBiZmRfbWFjaF9tNjgwMzAgNQotI2RlZmluZSBiZmRfbWFjaF9tNjgwNDAgNgotI2RlZmluZSBiZmRfbWFjaF9tNjgwNjAgNwotI2RlZmluZSBiZmRfbWFjaF9jcHUzMiAgOAotICBiZmRfYXJjaF92YXgsICAgICAgICAvKiBERUMgVmF4ICovICAgCi0gIGJmZF9hcmNoX2k5NjAsICAgICAgIC8qIEludGVsIDk2MCAqLwotICAgICAvKiBUaGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZyBpcyBpbXBvcnRhbnQuCi0gICAgICAgbG93ZXIgbnVtYmVyIGluZGljYXRlcyBhIG1hY2hpbmUgdHlwZSB0aGF0IAotICAgICAgIG9ubHkgYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCi0gICAgICAgYXZhaWxhYmxlIHRvIG1hY2hpbmVzIHdpdGggaGlnaGVyIG51bWJlcnMuCi0gICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGUgImNhIiwgd2hpY2ggaXMKLSAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbWFjaGluZXMgZXhjZXB0IAotICAgICAgICJjb3JlIi4gKi8KLQotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NvcmUgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfa2Ffc2EgICAgIDIKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYl9zYiAgICAgMwotI2RlZmluZSBiZmRfbWFjaF9pOTYwX21jICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfeGEgICAgICAgIDUKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9jYSAgICAgICAgNgotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2p4ICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfaHggICAgICAgIDgKLQotICBiZmRfYXJjaF9hMjlrLCAgICAgICAvKiBBTUQgMjkwMDAgKi8KLSAgYmZkX2FyY2hfc3BhcmMsICAgICAgLyogU1BBUkMgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmMgICAgICAgICAgICAgICAgIDEKLSAvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHY4cGx1cyBhbmQgdjkgaXMgdGhhdCB2OSBpcyBhIHRydWUgNjQgYml0IGVudi4gICovCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0ICAgICAgICAyCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZSAgICAgICAzCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyAgICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EgICAgICAgICA1ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCi0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSAgICA2Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5ICAgICAgICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5YSAgICAgICAgICAgICA4ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCi0gLyogTm9uemVybyBpZiBNQUNIIGhhcyB0aGUgdjkgaW5zdHJ1Y3Rpb24gc2V0LiAgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjlfcChtYWNoKSBcCi0gICgobWFjaCkgPj0gYmZkX21hY2hfc3BhcmNfdjhwbHVzICYmIChtYWNoKSA8PSBiZmRfbWFjaF9zcGFyY192OWEpCi0gIGJmZF9hcmNoX21pcHMsICAgICAgIC8qIE1JUFMgUnh4eHggKi8KLSNkZWZpbmUgYmZkX21hY2hfbWlwczMwMDAgICAgICAgICAgICAgIDMwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczM5MDAgICAgICAgICAgICAgIDM5MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQwMDAgICAgICAgICAgICAgIDQwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQwMTAgICAgICAgICAgICAgIDQwMTAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQxMDAgICAgICAgICAgICAgIDQxMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQxMTEgICAgICAgICAgICAgIDQxMTEKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQzMDAgICAgICAgICAgICAgIDQzMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ0MDAgICAgICAgICAgICAgIDQ0MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ2MDAgICAgICAgICAgICAgIDQ2MDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczQ2NTAgICAgICAgICAgICAgIDQ2NTAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczUwMDAgICAgICAgICAgICAgIDUwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczYwMDAgICAgICAgICAgICAgIDYwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczgwMDAgICAgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczEwMDAwICAgICAgICAgICAgIDEwMDAwCi0jZGVmaW5lIGJmZF9tYWNoX21pcHMxNiAgICAgICAgICAgICAgICAxNgotICBiZmRfYXJjaF9pMzg2LCAgICAgICAvKiBJbnRlbCAzODYgKi8KLSNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2IDAKLSNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pODA4NiAxCi0jZGVmaW5lIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXggMgotICBiZmRfYXJjaF93ZTMyaywgICAgICAvKiBBVCZUIFdFMzJ4eHggKi8KLSAgYmZkX2FyY2hfdGFob2UsICAgICAgLyogQ0NJL0hhcnJpcyBUYWhvZSAqLwotICBiZmRfYXJjaF9pODYwLCAgICAgICAvKiBJbnRlbCA4NjAgKi8KLSAgYmZkX2FyY2hfcm9tcCwgICAgICAgLyogSUJNIFJPTVAgUEMvUlQgKi8KLSAgYmZkX2FyY2hfYWxsaWFudCwgICAgLyogQWxsaWFudCAqLwotICBiZmRfYXJjaF9jb252ZXgsICAgICAvKiBDb252ZXggKi8KLSAgYmZkX2FyY2hfbTg4aywgICAgICAgLyogTW90b3JvbGEgODh4eHggKi8KLSAgYmZkX2FyY2hfcHlyYW1pZCwgICAgLyogUHlyYW1pZCBUZWNobm9sb2d5ICovCi0gIGJmZF9hcmNoX2g4MzAwLCAgICAgIC8qIEhpdGFjaGkgSDgvMzAwICovCi0jZGVmaW5lIGJmZF9tYWNoX2g4MzAwICAgMQotI2RlZmluZSBiZmRfbWFjaF9oODMwMGggIDIKLSNkZWZpbmUgYmZkX21hY2hfaDgzMDBzICAzCi0gIGJmZF9hcmNoX3Bvd2VycGMsICAgIC8qIFBvd2VyUEMgKi8KLSAgYmZkX2FyY2hfcnM2MDAwLCAgICAgLyogSUJNIFJTLzYwMDAgKi8KLSAgYmZkX2FyY2hfaHBwYSwgICAgICAgLyogSFAgUEEgUklTQyAqLwotICBiZmRfYXJjaF9kMTB2LCAgICAgICAvKiBNaXRzdWJpc2hpIEQxMFYgKi8KLSNkZWZpbmUgYmZkX21hY2hfZDEwdiAgICAgICAgICAwCi0jZGVmaW5lIGJmZF9tYWNoX2QxMHZfdHMyICAgICAgMgotI2RlZmluZSBiZmRfbWFjaF9kMTB2X3RzMyAgICAgIDMKLSAgYmZkX2FyY2hfZDMwdiwgICAgICAgLyogTWl0c3ViaXNoaSBEMzBWICovCi0gIGJmZF9hcmNoX3o4aywgICAgICAgIC8qIFppbG9nIFo4MDAwICovCi0jZGVmaW5lIGJmZF9tYWNoX3o4MDAxICAgICAgICAgMQotI2RlZmluZSBiZmRfbWFjaF96ODAwMiAgICAgICAgIDIKLSAgYmZkX2FyY2hfaDg1MDAsICAgICAgLyogSGl0YWNoaSBIOC81MDAgKi8KLSAgYmZkX2FyY2hfc2gsICAgICAgICAgLyogSGl0YWNoaSBTSCAqLwotI2RlZmluZSBiZmRfbWFjaF9zaCAgICAgICAgICAgIDAKLSNkZWZpbmUgYmZkX21hY2hfc2gzICAgICAgICAweDMwCi0jZGVmaW5lIGJmZF9tYWNoX3NoM2UgICAgICAgMHgzZQotICBiZmRfYXJjaF9hbHBoYSwgICAgICAvKiBEZWMgQWxwaGEgKi8KLSNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY0ICAweDEwCi0jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NSAgMHgyMAotI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjYgIDB4MzAKLSAgYmZkX2FyY2hfYXJtLCAgICAgICAgLyogQWR2YW5jZWQgUmlzYyBNYWNoaW5lcyBBUk0gKi8KLSNkZWZpbmUgYmZkX21hY2hfYXJtXzIgICAgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2FybV8yYSAgICAgICAgMgotI2RlZmluZSBiZmRfbWFjaF9hcm1fMyAgICAgICAgIDMKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzNNICAgICAgICA0Ci0jZGVmaW5lIGJmZF9tYWNoX2FybV80ICAgICAgICAgNQotI2RlZmluZSBiZmRfbWFjaF9hcm1fNFQgICAgICAgIDYKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzUgICAgICAgICA3Ci0jZGVmaW5lIGJmZF9tYWNoX2FybV81VCAgICAgICAgOAotICBiZmRfYXJjaF9uczMyaywgICAgICAvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9ycyBuczMyMDAwICovCi0gIGJmZF9hcmNoX3c2NSwgICAgICAgIC8qIFdEQyA2NTgxNiAqLwotICBiZmRfYXJjaF90aWMzMCwgICAgICAvKiBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgKi8KLSAgYmZkX2FyY2hfdGljODAsICAgICAgLyogVEkgVE1TMzIwYzgwIChNVlApICovCi0gIGJmZF9hcmNoX3Y4NTAsICAgICAgIC8qIE5FQyBWODUwICovCi0jZGVmaW5lIGJmZF9tYWNoX3Y4NTAgICAgICAgICAgMAotI2RlZmluZSBiZmRfbWFjaF92ODUwZSAgICAgICAgICdFJwotI2RlZmluZSBiZmRfbWFjaF92ODUwZWEgICAgICAgICdBJwotICBiZmRfYXJjaF9hcmMsICAgICAgICAvKiBBcmdvbmF1dCBSSVNDIENvcmUgKi8KLSNkZWZpbmUgYmZkX21hY2hfYXJjX2Jhc2UgMAotICBiZmRfYXJjaF9tMzJyLCAgICAgICAvKiBNaXRzdWJpc2hpIE0zMlIvRCAqLwotI2RlZmluZSBiZmRfbWFjaF9tMzJyICAgICAgICAgIDAgIC8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIGJmZF9tYWNoX20zMnJ4ICAgICAgICAgJ3gnCi0gIGJmZF9hcmNoX21uMTAyMDAsICAgIC8qIE1hdHN1c2hpdGEgTU4xMDIwMCAqLwotICBiZmRfYXJjaF9tbjEwMzAwLCAgICAvKiBNYXRzdXNoaXRhIE1OMTAzMDAgKi8KLSNkZWZpbmUgYmZkX21hY2hfbW4xMDMwMCAgICAgICAgICAgICAgIDMwMAotI2RlZmluZSBiZmRfbWFjaF9hbTMzICAgICAgICAgICAgICAgMzMwCi0gIGJmZF9hcmNoX2ZyMzAsCi0jZGVmaW5lIGJmZF9tYWNoX2ZyMzAgICAgICAgICAgMHg0NjUyMzMzMAotICBiZmRfYXJjaF9tY29yZSwKLSAgYmZkX2FyY2hfcGosCi0gIGJmZF9hcmNoX2xhc3QKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAKLXsKLSAgaW50IGJpdHNfcGVyX3dvcmQ7Ci0gIGludCBiaXRzX3Blcl9hZGRyZXNzOwotICBpbnQgYml0c19wZXJfYnl0ZTsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLSAgY29uc3QgY2hhciAqYXJjaF9uYW1lOwotICBjb25zdCBjaGFyICpwcmludGFibGVfbmFtZTsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0gIC8qIHRydWUgaWYgdGhpcyBpcyB0aGUgZGVmYXVsdCBtYWNoaW5lIGZvciB0aGUgYXJjaGl0ZWN0dXJlICovCi0gIGJvb2xlYW4gdGhlX2RlZmF1bHQ7IAotICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqICgqY29tcGF0aWJsZSkKLSAgICAgICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYikpOwotCi0gIGJvb2xlYW4gKCpzY2FuKSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLQotICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqbmV4dDsKLX0gYmZkX2FyY2hfaW5mb190eXBlOwotY29uc3QgY2hhciAqCi1iZmRfcHJpbnRhYmxlX25hbWUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfc2Nhbl9hcmNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi1jb25zdCBjaGFyICoqCi1iZmRfYXJjaF9saXN0IFBBUkFNUyAoKHZvaWQpKTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9hcmNoX2dldF9jb21wYXRpYmxlIFBBUkFNUyAoKAotICAgIGNvbnN0IGJmZCAqYWJmZCwKLSAgICBjb25zdCBiZmQgKmJiZmQpKTsKLQotdm9pZCAKLWJmZF9zZXRfYXJjaF9pbmZvIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmcpKTsKLQotZW51bSBiZmRfYXJjaGl0ZWN0dXJlIAotYmZkX2dldF9hcmNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi11bnNpZ25lZCBsb25nIAotYmZkX2dldF9tYWNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi11bnNpZ25lZCBpbnQgCi1iZmRfYXJjaF9iaXRzX3Blcl9ieXRlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi11bnNpZ25lZCBpbnQgCi1iZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiAKLWJmZF9nZXRfYXJjaF9pbmZvIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2xvb2t1cF9hcmNoCi0gUEFSQU1TICgoZW51bSBiZmRfYXJjaGl0ZWN0dXJlCi0gICAgYXJjaCwKLSAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLQotY29uc3QgY2hhciAqCi1iZmRfcHJpbnRhYmxlX2FyY2hfbWFjaAotIFBBUkFNUyAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLCB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLQotdHlwZWRlZiBlbnVtIGJmZF9yZWxvY19zdGF0dXMKLXsKLSAgICAgICAgLyogTm8gZXJyb3JzIGRldGVjdGVkICovCi0gIGJmZF9yZWxvY19vaywKLQotICAgICAgICAvKiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgdGhlcmUgd2FzIGFuIG92ZXJmbG93LiAqLwotICBiZmRfcmVsb2Nfb3ZlcmZsb3csCi0KLSAgICAgICAgLyogVGhlIGFkZHJlc3MgdG8gcmVsb2NhdGUgd2FzIG5vdCB3aXRoaW4gdGhlIHNlY3Rpb24gc3VwcGxpZWQuICovCi0gIGJmZF9yZWxvY19vdXRvZnJhbmdlLAotCi0gICAgICAgIC8qIFVzZWQgYnkgc3BlY2lhbCBmdW5jdGlvbnMgKi8KLSAgYmZkX3JlbG9jX2NvbnRpbnVlLAotCi0gICAgICAgIC8qIFVuc3VwcG9ydGVkIHJlbG9jYXRpb24gc2l6ZSByZXF1ZXN0ZWQuICovCi0gIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQsCi0KLSAgICAgICAgLyogVW51c2VkICovCi0gIGJmZF9yZWxvY19vdGhlciwKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIHRvIHJlbG9jYXRlIGFnYWluc3Qgd2FzIHVuZGVmaW5lZC4gKi8KLSAgYmZkX3JlbG9jX3VuZGVmaW5lZCwKLQotICAgICAgICAvKiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgbWF5IG5vdCBiZSBvayAtIHByZXNlbnRseQotICAgICAgICAgIGdlbmVyYXRlZCBvbmx5IHdoZW4gbGlua2luZyBpOTYwIGNvZmYgZmlsZXMgd2l0aCBpOTYwIGIub3V0Ci0gICAgICAgICAgc3ltYm9scy4gIElmIHRoaXMgdHlwZSBpcyByZXR1cm5lZCwgdGhlIGVycm9yX21lc3NhZ2UgYXJndW1lbnQKLSAgICAgICAgICB0byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHdpbGwgYmUgc2V0LiAgKi8KLSAgYmZkX3JlbG9jX2Rhbmdlcm91cwotIH0KLSBiZmRfcmVsb2Nfc3RhdHVzX3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkKLXsKLSAgICAgICAgLyogQSBwb2ludGVyIGludG8gdGhlIGNhbm9uaWNhbCB0YWJsZSBvZiBwb2ludGVycyAgKi8KLSAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnN5bV9wdHJfcHRyOwotCi0gICAgICAgIC8qIG9mZnNldCBpbiBzZWN0aW9uICovCi0gIGJmZF9zaXplX3R5cGUgYWRkcmVzczsKLQotICAgICAgICAvKiBhZGRlbmQgZm9yIHJlbG9jYXRpb24gdmFsdWUgKi8KLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAgICAgLyogUG9pbnRlciB0byBob3cgdG8gcGVyZm9ybSB0aGUgcmVxdWlyZWQgcmVsb2NhdGlvbiAqLwotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotfSBhcmVsZW50OwotZW51bSBjb21wbGFpbl9vdmVyZmxvdwotewotICAgICAgICAvKiBEbyBub3QgY29tcGxhaW4gb24gb3ZlcmZsb3cuICovCi0gIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0KLSAgICAgICAgLyogQ29tcGxhaW4gaWYgdGhlIGJpdGZpZWxkIG92ZXJmbG93cywgd2hldGhlciBpdCBpcyBjb25zaWRlcmVkCi0gICAgICAgICAgYXMgc2lnbmVkIG9yIHVuc2lnbmVkLiAqLwotICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQotICAgICAgICAvKiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBzaWduZWQKLSAgICAgICAgICBudW1iZXIuICovCi0gIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQotICAgICAgICAvKiBDb21wbGFpbiBpZiB0aGUgdmFsdWUgb3ZlcmZsb3dzIHdoZW4gY29uc2lkZXJlZCBhcyBhbgotICAgICAgICAgIHVuc2lnbmVkIG51bWJlci4gKi8KLSAgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQKLX07Ci0KLXN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QKLXsKLSAgICAgICAgLyogIFRoZSB0eXBlIGZpZWxkIGhhcyBtYWlubHkgYSBkb2N1bWVudGFyeSB1c2UgLSB0aGUgYmFjayBlbmQgY2FuCi0gICAgICAgICAgIGRvIHdoYXQgaXQgd2FudHMgd2l0aCBpdCwgdGhvdWdoIG5vcm1hbGx5IHRoZSBiYWNrIGVuZCdzCi0gICAgICAgICAgIGV4dGVybmFsIGlkZWEgb2Ygd2hhdCBhIHJlbG9jIG51bWJlciBpcyBzdG9yZWQKLSAgICAgICAgICAgaW4gdGhpcyBmaWVsZC4gRm9yIGV4YW1wbGUsIGEgUEMgcmVsYXRpdmUgd29yZCByZWxvY2F0aW9uCi0gICAgICAgICAgIGluIGEgY29mZiBlbnZpcm9ubWVudCBoYXMgdGhlIHR5cGUgMDIzIC0gYmVjYXVzZSB0aGF0J3MKLSAgICAgICAgICAgd2hhdCB0aGUgb3V0c2lkZSB3b3JsZCBjYWxscyBhIFJfUENSV09SRCByZWxvYy4gKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgICAgICAgLyogIFRoZSB2YWx1ZSB0aGUgZmluYWwgcmVsb2NhdGlvbiBpcyBzaGlmdGVkIHJpZ2h0IGJ5LiBUaGlzIGRyb3BzCi0gICAgICAgICAgIHVud2FudGVkIGRhdGEgZnJvbSB0aGUgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCByaWdodHNoaWZ0OwotCi0gICAgICAgIC8qICBUaGUgc2l6ZSBvZiB0aGUgaXRlbSB0byBiZSByZWxvY2F0ZWQuICBUaGlzIGlzICpub3QqIGEKLSAgICAgICAgICAgcG93ZXItb2YtdHdvIG1lYXN1cmUuICBUbyBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBvcGVyYXRlZAotICAgICAgICAgICBvbiBieSBhIHR5cGUgb2YgcmVsb2NhdGlvbiwgdXNlIGJmZF9nZXRfcmVsb2Nfc2l6ZS4gICovCi0gIGludCBzaXplOwotCi0gICAgICAgIC8qICBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkLiAgVGhpcyBpcyB1c2VkCi0gICAgICAgICAgIHdoZW4gZG9pbmcgb3ZlcmZsb3cgY2hlY2tpbmcuICAqLwotICB1bnNpZ25lZCBpbnQgYml0c2l6ZTsKLQotICAgICAgICAvKiAgTm90ZXMgdGhhdCB0aGUgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlCi0gICAgICAgICAgIGRhdGEgc2VjdGlvbiBvZiB0aGUgYWRkZW5kLiBUaGUgcmVsb2NhdGlvbiBmdW5jdGlvbiB3aWxsCi0gICAgICAgICAgIHN1YnRyYWN0IGZyb20gdGhlIHJlbG9jYXRpb24gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uCi0gICAgICAgICAgIGJlaW5nIHJlbG9jYXRlZC4gKi8KLSAgYm9vbGVhbiBwY19yZWxhdGl2ZTsKLQotICAgICAgICAvKiAgVGhlIGJpdCBwb3NpdGlvbiBvZiB0aGUgcmVsb2MgdmFsdWUgaW4gdGhlIGRlc3RpbmF0aW9uLgotICAgICAgICAgICBUaGUgcmVsb2NhdGVkIHZhbHVlIGlzIGxlZnQgc2hpZnRlZCBieSB0aGlzIGFtb3VudC4gKi8KLSAgdW5zaWduZWQgaW50IGJpdHBvczsKLQotICAgICAgICAvKiBXaGF0IHR5cGUgb2Ygb3ZlcmZsb3cgZXJyb3Igc2hvdWxkIGJlIGNoZWNrZWQgZm9yIHdoZW4KLSAgICAgICAgICByZWxvY2F0aW5nLiAqLwotICBlbnVtIGNvbXBsYWluX292ZXJmbG93IGNvbXBsYWluX29uX292ZXJmbG93OwotCi0gICAgICAgIC8qIElmIHRoaXMgZmllbGQgaXMgbm9uIG51bGwsIHRoZW4gdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIGlzCi0gICAgICAgICAgY2FsbGVkIHJhdGhlciB0aGFuIHRoZSBub3JtYWwgZnVuY3Rpb24uIFRoaXMgYWxsb3dzIHJlYWxseQotICAgICAgICAgIHN0cmFuZ2UgcmVsb2NhdGlvbiBtZXRob2RzIHRvIGJlIGFjY29tb2RhdGVkIChlLmcuLCBpOTYwIGNhbGxqCi0gICAgICAgICAgaW5zdHJ1Y3Rpb25zKS4gKi8KLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlICgqc3BlY2lhbF9mdW5jdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFIgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLQotICAgICAgICAvKiBUaGUgdGV4dHVhbCBuYW1lIG9mIHRoZSByZWxvY2F0aW9uIHR5cGUuICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgICAgICAgLyogV2hlbiBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rLCBzb21lIGZvcm1hdHMgbXVzdCBtb2RpZnkgdGhlCi0gICAgICAgICAgcmVsb2NhdGlvbnMgcmF0aGVyIHRoYW4gdGhlIGRhdGEgLSB0aGlzIGZsYWcgc2lnbmFscyB0aGlzLiovCi0gIGJvb2xlYW4gcGFydGlhbF9pbnBsYWNlOwotCi0gICAgICAgIC8qIFRoZSBzcmNfbWFzayBzZWxlY3RzIHdoaWNoIHBhcnRzIG9mIHRoZSByZWFkIGluIGRhdGEKLSAgICAgICAgICBhcmUgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbiBzdW0uICBFLmcuLCBpZiB0aGlzIHdhcyBhbiA4IGJpdAotICAgICAgICAgIGJpdCBvZiBkYXRhIHdoaWNoIHdlIHJlYWQgYW5kIHJlbG9jYXRlZCwgdGhpcyB3b3VsZCBiZQotICAgICAgICAgIDB4MDAwMDAwZmYuIFdoZW4gd2UgaGF2ZSByZWxvY3Mgd2hpY2ggaGF2ZSBhbiBhZGRlbmQsIHN1Y2ggYXMKLSAgICAgICAgICBzdW40IGV4dGVuZGVkIHJlbG9jcywgdGhlIHZhbHVlIGluIHRoZSBvZmZzZXQgcGFydCBvZiBhCi0gICAgICAgICAgcmVsb2NhdGluZyBmaWVsZCBpcyBnYXJiYWdlIHNvIHdlIG5ldmVyIHVzZSBpdC4gSW4gdGhpcyBjYXNlCi0gICAgICAgICAgdGhlIG1hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gKi8KLSAgYmZkX3ZtYSBzcmNfbWFzazsKLQotICAgICAgICAvKiBUaGUgZHN0X21hc2sgc2VsZWN0cyB3aGljaCBwYXJ0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIHJlcGxhY2VkCi0gICAgICAgICAgaW50byB0aGUgaW5zdHJ1Y3Rpb24uIEluIG1vc3QgY2FzZXMgc3JjX21hc2sgPT0gZHN0X21hc2ssCi0gICAgICAgICAgZXhjZXB0IGluIHRoZSBhYm92ZSBzcGVjaWFsIGNhc2UsIHdoZXJlIGRzdF9tYXNrIHdvdWxkIGJlCi0gICAgICAgICAgMHgwMDAwMDBmZiwgYW5kIHNyY19tYXNrIHdvdWxkIGJlIDB4MDAwMDAwMDAuICAgKi8KLSAgYmZkX3ZtYSBkc3RfbWFzazsKLQotICAgICAgICAvKiBXaGVuIHNvbWUgZm9ybWF0cyBjcmVhdGUgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zLCB0aGV5IGxlYXZlCi0gICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwYyBvZiB0aGUgcGxhY2UgYmVpbmcgcmVsb2NhdGVkIGluIHRoZSBvZmZzZXQKLSAgICAgICAgICBzbG90IG9mIHRoZSBpbnN0cnVjdGlvbiwgc28gdGhhdCBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gY2FuCi0gICAgICAgICAgYmUgbWFkZSBqdXN0IGJ5IGFkZGluZyBpbiBhbiBvcmRpbmFyeSBvZmZzZXQgKGUuZy4sIHN1bjMgYS5vdXQpLgotICAgICAgICAgIFNvbWUgZm9ybWF0cyBsZWF2ZSB0aGUgZGlzcGxhY2VtZW50IHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24KLSAgICAgICAgICBlbXB0eSAoZS5nLiwgbTg4ayBiY3MpOyB0aGlzIGZsYWcgc2lnbmFscyB0aGUgZmFjdC4qLwotICBib29sZWFuIHBjcmVsX29mZnNldDsKLQotfTsKLSNkZWZpbmUgSE9XVE8oQywgUixTLEIsIFAsIEJJLCBPLCBTRiwgTkFNRSwgSU5QTEFDRSwgTUFTS1NSQywgTUFTS0RTVCwgUEMpIFwKLSAgeyh1bnNpZ25lZClDLFIsUyxCLCBQLCBCSSwgTyxTRixOQU1FLElOUExBQ0UsTUFTS1NSQyxNQVNLRFNULFBDfQotI2RlZmluZSBORVdIT1dUTyggRlVOQ1RJT04sIE5BTUUsU0laRSxSRUwsSU4pIEhPV1RPKDAsMCxTSVpFLDAsUkVMLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCxGVU5DVElPTiwgTkFNRSxmYWxzZSwwLDAsSU4pCi0KLSNkZWZpbmUgRU1QVFlfSE9XVE8oQykgXAotICBIT1dUTygoQyksMCwwLDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LE5VTEwsTlVMTCxmYWxzZSwwLDAsZmFsc2UpCi0KLSNkZWZpbmUgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2wpICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChzeW1ib2wgIT0gKGFzeW1ib2wgKilOVUxMKSB7ICAgICAgICAgICAgIFwKLSAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKSB7IFwKLSAgICAgIHJlbG9jYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOyAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLXVuc2lnbmVkIGludCAKLWJmZF9nZXRfcmVsb2Nfc2l6ZSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqKSk7Ci0KLXR5cGVkZWYgc3RydWN0IHJlbGVudF9jaGFpbiB7Ci0gIGFyZWxlbnQgcmVsZW50OwotICBzdHJ1Y3QgICByZWxlbnRfY2hhaW4gKm5leHQ7Ci19IGFyZWxlbnRfY2hhaW47Ci1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLQotYmZkX2NoZWNrX292ZXJmbG93Ci0gUEFSQU1TICgoZW51bSBjb21wbGFpbl9vdmVyZmxvdyBob3csCi0gICAgdW5zaWduZWQgaW50IGJpdHNpemUsCi0gICAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQsCi0gICAgdW5zaWduZWQgaW50IGFkZHJzaXplLAotICAgIGJmZF92bWEgcmVsb2NhdGlvbikpOwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLQotYmZkX3BlcmZvcm1fcmVsb2NhdGlvbgotIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICBQVFIgZGF0YSwKLSAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi0KLWJmZF9pbnN0YWxsX3JlbG9jYXRpb24KLSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgUFRSIGRhdGEsIGJmZF92bWEgZGF0YV9zdGFydCwKLSAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotCi1lbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwgewotICBfZHVtbXlfZmlyc3RfYmZkX3JlbG9jX2NvZGVfcmVhbCwKLQotCi0vKiBCYXNpYyBhYnNvbHV0ZSByZWxvY2F0aW9ucyBvZiBOIGJpdHMuICovCi0gIEJGRF9SRUxPQ182NCwKLSAgQkZEX1JFTE9DXzMyLAotICBCRkRfUkVMT0NfMjYsCi0gIEJGRF9SRUxPQ18yNCwKLSAgQkZEX1JFTE9DXzE2LAotICBCRkRfUkVMT0NfMTQsCi0gIEJGRF9SRUxPQ184LAotCi0vKiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4gIFNvbWV0aW1lcyB0aGVzZSBhcmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3MKLW9mIHRoZSByZWxvY2F0aW9uIGl0c2VsZjsgc29tZXRpbWVzIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgotdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgcmVsb2NhdGlvbi4gIEl0IGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIHRhcmdldC4KLQotVGhlIDI0LWJpdCByZWxvY2F0aW9uIGlzIHVzZWQgaW4gc29tZSBJbnRlbCA5NjAgY29uZmlndXJhdGlvbnMuICovCi0gIEJGRF9SRUxPQ182NF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzMyX1BDUkVMLAotICBCRkRfUkVMT0NfMjRfUENSRUwsCi0gIEJGRF9SRUxPQ18xNl9QQ1JFTCwKLSAgQkZEX1JFTE9DXzEyX1BDUkVMLAotICBCRkRfUkVMT0NfOF9QQ1JFTCwKLQotLyogRm9yIEVMRi4gKi8KLSAgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzhfR09UX1BDUkVMLAotICBCRkRfUkVMT0NfMzJfR09UT0ZGLAotICBCRkRfUkVMT0NfMTZfR09UT0ZGLAotICBCRkRfUkVMT0NfTE8xNl9HT1RPRkYsCi0gIEJGRF9SRUxPQ19ISTE2X0dPVE9GRiwKLSAgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYsCi0gIEJGRF9SRUxPQ184X0dPVE9GRiwKLSAgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzhfUExUX1BDUkVMLAotICBCRkRfUkVMT0NfMzJfUExUT0ZGLAotICBCRkRfUkVMT0NfMTZfUExUT0ZGLAotICBCRkRfUkVMT0NfTE8xNl9QTFRPRkYsCi0gIEJGRF9SRUxPQ19ISTE2X1BMVE9GRiwKLSAgQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYsCi0gIEJGRF9SRUxPQ184X1BMVE9GRiwKLQotLyogUmVsb2NhdGlvbnMgdXNlZCBieSA2OEsgRUxGLiAqLwotICBCRkRfUkVMT0NfNjhLX0dMT0JfREFULAotICBCRkRfUkVMT0NfNjhLX0pNUF9TTE9ULAotICBCRkRfUkVMT0NfNjhLX1JFTEFUSVZFLAotCi0vKiBMaW5rYWdlLXRhYmxlIHJlbGF0aXZlLiAqLwotICBCRkRfUkVMT0NfMzJfQkFTRVJFTCwKLSAgQkZEX1JFTE9DXzE2X0JBU0VSRUwsCi0gIEJGRF9SRUxPQ19MTzE2X0JBU0VSRUwsCi0gIEJGRF9SRUxPQ19ISTE2X0JBU0VSRUwsCi0gIEJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTCwKLSAgQkZEX1JFTE9DXzhfQkFTRVJFTCwKLSAgQkZEX1JFTE9DX1JWQSwKLQotLyogQWJzb2x1dGUgOC1iaXQgcmVsb2NhdGlvbiwgYnV0IHVzZWQgdG8gZm9ybSBhbiBhZGRyZXNzIGxpa2UgMHhGRm5uLiAqLwotICBCRkRfUkVMT0NfOF9GRm5uLAotCi0vKiBUaGVzZSBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucyBhcmUgc3RvcmVkIGFzIHdvcmQgZGlzcGxhY2VtZW50cyAtLQotaS5lLiwgYnl0ZSBkaXNwbGFjZW1lbnRzIHNoaWZ0ZWQgcmlnaHQgdHdvIGJpdHMuICBUaGUgMzAtYml0IHdvcmQKLWRpc3BsYWNlbWVudCAoPDwzMl9QQ1JFTF9TMj4+IC0tIDMyIGJpdHMsIHNoaWZ0ZWQgMikgaXMgdXNlZCBvbiB0aGUKLVNQQVJDLiAgKFNQQVJDIHRvb2xzIGdlbmVyYWxseSByZWZlciB0byB0aGlzIGFzIDw8V0RJU1AzMD4+LikgIFRoZQotc2lnbmVkIDE2LWJpdCBkaXNwbGFjZW1lbnQgaXMgdXNlZCBvbiB0aGUgTUlQUywgYW5kIHRoZSAyMy1iaXQKLWRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBBbHBoYS4gKi8KLSAgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLAotICBCRkRfUkVMT0NfMTZfUENSRUxfUzIsCi0gIEJGRF9SRUxPQ18yM19QQ1JFTF9TMiwKLQotLyogSGlnaCAyMiBiaXRzIGFuZCBsb3cgMTAgYml0cyBvZiAzMi1iaXQgdmFsdWUsIHBsYWNlZCBpbnRvIGxvd2VyIGJpdHMgb2YKLXRoZSB0YXJnZXQgd29yZC4gIFRoZXNlIGFyZSB1c2VkIG9uIHRoZSBTUEFSQy4gKi8KLSAgQkZEX1JFTE9DX0hJMjIsCi0gIEJGRF9SRUxPQ19MTzEwLAotCi0vKiBGb3Igc3lzdGVtcyB0aGF0IGFsbG9jYXRlIGEgR2xvYmFsIFBvaW50ZXIgcmVnaXN0ZXIsIHRoZXNlIGFyZQotZGlzcGxhY2VtZW50cyBvZmYgdGhhdCByZWdpc3Rlci4gIFRoZXNlIHJlbG9jYXRpb24gdHlwZXMgYXJlCi1oYW5kbGVkIHNwZWNpYWxseSwgYmVjYXVzZSB0aGUgdmFsdWUgdGhlIHJlZ2lzdGVyIHdpbGwgaGF2ZSBpcwotZGVjaWRlZCByZWxhdGl2ZWx5IGxhdGUuICovCi0gIEJGRF9SRUxPQ19HUFJFTDE2LAotICBCRkRfUkVMT0NfR1BSRUwzMiwKLQotLyogUmVsb2MgdHlwZXMgdXNlZCBmb3IgaTk2MC9iLm91dC4gKi8KLSAgQkZEX1JFTE9DX0k5NjBfQ0FMTEosCi0KLS8qIFNQQVJDIEVMRiByZWxvY2F0aW9ucy4gIFRoZXJlIGlzIHByb2JhYmx5IHNvbWUgb3ZlcmxhcCB3aXRoIG90aGVyCi1yZWxvY2F0aW9uIHR5cGVzIGFscmVhZHkgZGVmaW5lZC4gKi8KLSAgQkZEX1JFTE9DX05PTkUsCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyLAotICBCRkRfUkVMT0NfU1BBUkMyMiwKLSAgQkZEX1JFTE9DX1NQQVJDMTMsCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLAotICBCRkRfUkVMT0NfU1BBUkNfR09UMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19QQzEwLAotICBCRkRfUkVMT0NfU1BBUkNfUEMyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0NPUFksCi0gIEJGRF9SRUxPQ19TUEFSQ19HTE9CX0RBVCwKLSAgQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9ULAotICBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsCi0gIEJGRF9SRUxPQ19TUEFSQ19VQTMyLAotCi0vKiBJIHRoaW5rIHRoZXNlIGFyZSBzcGVjaWZpYyB0byBTUEFSQyBhLm91dCAoZS5nLiwgU3VuIDQpLiAqLwotICBCRkRfUkVMT0NfU1BBUkNfQkFTRTEzLAotICBCRkRfUkVMT0NfU1BBUkNfQkFTRTIyLAotCi0vKiBTUEFSQzY0IHJlbG9jYXRpb25zICovCi0jZGVmaW5lIEJGRF9SRUxPQ19TUEFSQ182NCBCRkRfUkVMT0NfNjQKLSAgQkZEX1JFTE9DX1NQQVJDXzEwLAotICBCRkRfUkVMT0NfU1BBUkNfMTEsCi0gIEJGRF9SRUxPQ19TUEFSQ19PTE8xMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0hIMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19ITTEwLAotICBCRkRfUkVMT0NfU1BBUkNfTE0yMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19ITTEwLAotICBCRkRfUkVMT0NfU1BBUkNfUENfTE0yMiwKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTYsCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5LAotICBCRkRfUkVMT0NfU1BBUkNfNywKLSAgQkZEX1JFTE9DX1NQQVJDXzYsCi0gIEJGRF9SRUxPQ19TUEFSQ181LAotI2RlZmluZSBCRkRfUkVMT0NfU1BBUkNfRElTUDY0IEJGRF9SRUxPQ182NF9QQ1JFTAotICBCRkRfUkVMT0NfU1BBUkNfUExUNjQsCi0gIEJGRF9SRUxPQ19TUEFSQ19ISVgyMiwKLSAgQkZEX1JFTE9DX1NQQVJDX0xPWDEwLAotICBCRkRfUkVMT0NfU1BBUkNfSDQ0LAotICBCRkRfUkVMT0NfU1BBUkNfTTQ0LAotICBCRkRfUkVMT0NfU1BBUkNfTDQ0LAotICBCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIsCi0KLS8qIFNQQVJDIGxpdHRsZSBlbmRpYW4gcmVsb2NhdGlvbiAqLwotICBCRkRfUkVMT0NfU1BBUkNfUkVWMzIsCi0KLS8qIEFscGhhIEVDT0ZGIGFuZCBFTEYgcmVsb2NhdGlvbnMuICBTb21lIG9mIHRoZXNlIHRyZWF0IHRoZSBzeW1ib2wgb3IKLSJhZGRlbmQiIGluIHNvbWUgc3BlY2lhbCB3YXkuCi1Gb3IgR1BESVNQX0hJMTYgKCJncGRpc3AiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBpZ25vcmVkIHdoZW4KLXdyaXRpbmc7IHdoZW4gcmVhZGluZywgaXQgd2lsbCBiZSB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wuICBUaGUKLWFkZGVuZCBpcyB0aGUgZGlzcGxhY2VtZW50IGluIGJ5dGVzIG9mIHRoZSAibGRhIiBpbnN0cnVjdGlvbiBmcm9tCi10aGUgImxkYWgiIGluc3RydWN0aW9uICh3aGljaCBpcyBhdCB0aGUgYWRkcmVzcyBvZiB0aGlzIHJlbG9jKS4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2LAotCi0vKiBGb3IgR1BESVNQX0xPMTYgKCJpZ25vcmUiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBoYW5kbGVkIGFzCi13aXRoIEdQRElTUF9ISTE2IHJlbG9jcy4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcgdGhlCi1yZWxvY2F0aW9ucyBvdXQsIGFuZCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uCi1yZWFkaW5nLCBmb3IgY29udmVuaWVuY2UuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNiwKLQotLyogVGhlIEVMRiBHUERJU1AgcmVsb2NhdGlvbiBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBHUERJU1BfSEkxNgotcmVsb2NhdGlvbiBleGNlcHQgdGhhdCB0aGVyZSBpcyBubyBhY2NvbXBhbnlpbmcgR1BESVNQX0xPMTYKLXJlbG9jYXRpb24uICovCi0gIEJGRF9SRUxPQ19BTFBIQV9HUERJU1AsCi0KLS8qIFRoZSBBbHBoYSBMSVRFUkFML0xJVFVTRSByZWxvY3MgYXJlIHByb2R1Y2VkIGJ5IGEgc3ltYm9sIHJlZmVyZW5jZTsKLXRoZSBhc3NlbWJsZXIgdHVybnMgaXQgaW50byBhIExEUSBpbnN0cnVjdGlvbiB0byBsb2FkIHRoZSBhZGRyZXNzIG9mCi10aGUgc3ltYm9sLCBhbmQgdGhlbiBmaWxscyBpbiBhIHJlZ2lzdGVyIGluIHRoZSByZWFsIGluc3RydWN0aW9uLgotCi1UaGUgTElURVJBTCByZWxvYywgYXQgdGhlIExEUSBpbnN0cnVjdGlvbiwgcmVmZXJzIHRvIHRoZSAubGl0YQotc2VjdGlvbiBzeW1ib2wuICBUaGUgYWRkZW5kIGlzIGlnbm9yZWQgd2hlbiB3cml0aW5nLCBidXQgaXMgZmlsbGVkCi1pbiB3aXRoIHRoZSBmaWxlJ3MgR1AgdmFsdWUgb24gcmVhZGluZywgZm9yIGNvbnZlbmllbmNlLCBhcyB3aXRoIHRoZQotR1BESVNQX0xPMTYgcmVsb2MuCi0KLVRoZSBFTEZfTElURVJBTCByZWxvYyBpcyBzb21ld2hlcmUgYmV0d2VlbiAxNl9HT1RPRkYgYW5kIEdQRElTUF9MTzE2LgotSXQgc2hvdWxkIHJlZmVyIHRvIHRoZSBzeW1ib2wgdG8gYmUgcmVmZXJlbmNlZCwgYXMgd2l0aCAxNl9HT1RPRkYsCi1idXQgaXQgZ2VuZXJhdGVzIG91dHB1dCBub3QgYmFzZWQgb24gdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgLmdvdAotc2VjdGlvbiwgYnV0IHJlbGF0aXZlIHRvIHRoZSBHUCB2YWx1ZSBjaG9zZW4gZm9yIHRoZSBmaWxlIGR1cmluZyB0aGUKLWZpbmFsIGxpbmsgc3RhZ2UuCi0KLVRoZSBMSVRVU0UgcmVsb2MsIG9uIHRoZSBpbnN0cnVjdGlvbiB1c2luZyB0aGUgbG9hZGVkIGFkZHJlc3MsIGdpdmVzCi1pbmZvcm1hdGlvbiB0byB0aGUgbGlua2VyIHRoYXQgaXQgbWlnaHQgYmUgYWJsZSB0byB1c2UgdG8gb3B0aW1pemUKLWF3YXkgc29tZSBsaXRlcmFsIHNlY3Rpb24gcmVmZXJlbmNlcy4gIFRoZSBzeW1ib2wgaXMgaWdub3JlZCAocmVhZAotYXMgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sKSwgYW5kIHRoZSAiYWRkZW5kIiBpbmRpY2F0ZXMgdGhlIHR5cGUKLW9mIGluc3RydWN0aW9uIHVzaW5nIHRoZSByZWdpc3RlcjoKLTEgLSAibWVtb3J5IiBmbXQgaW5zbgotMiAtIGJ5dGUtbWFuaXB1bGF0aW9uIChieXRlIG9mZnNldCByZWcpCi0zIC0ganNyICh0YXJnZXQgb2YgYnJhbmNoKQotCi1UaGUgR05VIGxpbmtlciBjdXJyZW50bHkgZG9lc24ndCBkbyBhbnkgb2YgdGhpcyBvcHRpbWl6aW5nLiAqLwotICBCRkRfUkVMT0NfQUxQSEFfTElURVJBTCwKLSAgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMLAotICBCRkRfUkVMT0NfQUxQSEFfTElUVVNFLAotCi0vKiBUaGUgQkZEX1JFTE9DX0FMUEhBX1VTRVJfKiByZWxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgYXNzZW1ibGVyIHRvCi1wcm9jZXNzIHRoZSBleHBsaWNpdCAhPHJlbG9jPiFzZXF1ZW5jZSByZWxvY2F0aW9ucywgYW5kIGFyZSBtYXBwZWQKLWludG8gdGhlIG5vcm1hbCByZWxvY2F0aW9ucyBhdCB0aGUgZW5kIG9mIHByb2Nlc3NpbmcuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUwsCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFLAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQllUT0ZGLAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSLAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1AsCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMSElHSCwKLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxMT1csCi0KLS8qIFRoZSBISU5UIHJlbG9jYXRpb24gaW5kaWNhdGVzIGEgdmFsdWUgdGhhdCBzaG91bGQgYmUgZmlsbGVkIGludG8gdGhlCi0iaGludCIgZmllbGQgb2YgYSBqbXAvanNyL3JldCBpbnN0cnVjdGlvbiwgZm9yIHBvc3NpYmxlIGJyYW5jaC0KLXByZWRpY3Rpb24gbG9naWMgd2hpY2ggbWF5IGJlIHByb3ZpZGVkIG9uIHNvbWUgcHJvY2Vzc29ycy4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0hJTlQsCi0KLS8qIFRoZSBMSU5LQUdFIHJlbG9jYXRpb24gb3V0cHV0cyBhIGxpbmthZ2UgcGFpciBpbiB0aGUgb2JqZWN0IGZpbGUsCi13aGljaCBpcyBmaWxsZWQgYnkgdGhlIGxpbmtlci4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UsCi0KLS8qIFRoZSBDT0RFQUREUiByZWxvY2F0aW9uIG91dHB1dHMgYSBTVE9fQ0EgaW4gdGhlIG9iamVjdCBmaWxlLAotd2hpY2ggaXMgZmlsbGVkIGJ5IHRoZSBsaW5rZXIuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUiwKLQotLyogQml0cyAyNy4uMiBvZiB0aGUgcmVsb2NhdGlvbiBhZGRyZXNzIHNoaWZ0ZWQgcmlnaHQgMiBiaXRzOwotc2ltcGxlIHJlbG9jIG90aGVyd2lzZS4gKi8KLSAgQkZEX1JFTE9DX01JUFNfSk1QLAotCi0vKiBUaGUgTUlQUzE2IGp1bXAgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19NSVBTMTZfSk1QLAotCi0vKiBNSVBTMTYgR1AgcmVsYXRpdmUgcmVsb2MuICovCi0gIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwsCi0KLS8qIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWU7IHNpbXBsZSByZWxvYy4gKi8KLSAgQkZEX1JFTE9DX0hJMTYsCi0KLS8qIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWUgYnV0IHRoZSBsb3cgMTYgYml0cyB3aWxsIGJlIHNpZ24KLWV4dGVuZGVkIGFuZCBhZGRlZCB0byBmb3JtIHRoZSBmaW5hbCByZXN1bHQuICBJZiB0aGUgbG93IDE2Ci1iaXRzIGZvcm0gYSBuZWdhdGl2ZSBudW1iZXIsIHdlIG5lZWQgdG8gYWRkIG9uZSB0byB0aGUgaGlnaCB2YWx1ZQotdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGJvcnJvdyB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQuICovCi0gIEJGRF9SRUxPQ19ISTE2X1MsCi0KLS8qIExvdyAxNiBiaXRzLiAqLwotICBCRkRfUkVMT0NfTE8xNiwKLQotLyogTGlrZSBCRkRfUkVMT0NfSEkxNl9TLCBidXQgUEMgcmVsYXRpdmUuICovCi0gIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MsCi0KLS8qIExpa2UgQkZEX1JFTE9DX0xPMTYsIGJ1dCBQQyByZWxhdGl2ZS4gKi8KLSAgQkZEX1JFTE9DX1BDUkVMX0xPMTYsCi0KLS8qIFJlbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGdsb2JhbCBwb2ludGVyLiAqLwotI2RlZmluZSBCRkRfUkVMT0NfTUlQU19HUFJFTCBCRkRfUkVMT0NfR1BSRUwxNgotCi0vKiBSZWxvY2F0aW9uIGFnYWluc3QgYSBNSVBTIGxpdGVyYWwgc2VjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX01JUFNfTElURVJBTCwKLQotLyogTUlQUyBFTEYgcmVsb2NhdGlvbnMuICovCi0gIEJGRF9SRUxPQ19NSVBTX0dPVDE2LAotICBCRkRfUkVMT0NfTUlQU19DQUxMMTYsCi0jZGVmaW5lIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIgQkZEX1JFTE9DX0dQUkVMMzIKLSAgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYsCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LAotICBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYsCi0gIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiwKLSAgQkZEX1JFTE9DX01JUFNfU1VCLAotICBCRkRfUkVMT0NfTUlQU19HT1RfUEFHRSwKLSAgQkZEX1JFTE9DX01JUFNfR09UX09GU1QsCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9ESVNQLAotCi0KLS8qIGkzODYvZWxmIHJlbG9jYXRpb25zICovCi0gIEJGRF9SRUxPQ18zODZfR09UMzIsCi0gIEJGRF9SRUxPQ18zODZfUExUMzIsCi0gIEJGRF9SRUxPQ18zODZfQ09QWSwKLSAgQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVCwKLSAgQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1QsCi0gIEJGRF9SRUxPQ18zODZfUkVMQVRJVkUsCi0gIEJGRF9SRUxPQ18zODZfR09UT0ZGLAotICBCRkRfUkVMT0NfMzg2X0dPVFBDLAotCi0vKiBuczMyayByZWxvY2F0aW9ucyAqLwotICBCRkRfUkVMT0NfTlMzMktfSU1NXzgsCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMTYsCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMzIsCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYsCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyLAotICBCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTCwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwsCi0KLS8qIFBpY29qYXZhIHJlbG9jcy4gIE5vdCBhbGwgb2YgdGhlc2UgYXBwZWFyIGluIG9iamVjdCBmaWxlcy4gKi8KLSAgQkZEX1JFTE9DX1BKX0NPREVfSEkxNiwKLSAgQkZEX1JFTE9DX1BKX0NPREVfTE8xNiwKLSAgQkZEX1JFTE9DX1BKX0NPREVfRElSMTYsCi0gIEJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyLAotICBCRkRfUkVMT0NfUEpfQ09ERV9SRUwxNiwKLSAgQkZEX1JFTE9DX1BKX0NPREVfUkVMMzIsCi0KLS8qIFBvd2VyKHJzNjAwMCkgYW5kIFBvd2VyUEMgcmVsb2NhdGlvbnMuICovCi0gIEJGRF9SRUxPQ19QUENfQjI2LAotICBCRkRfUkVMT0NfUFBDX0JBMjYsCi0gIEJGRF9SRUxPQ19QUENfVE9DMTYsCi0gIEJGRF9SRUxPQ19QUENfQjE2LAotICBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOLAotICBCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTiwKLSAgQkZEX1JFTE9DX1BQQ19CQTE2LAotICBCRkRfUkVMT0NfUFBDX0JBMTZfQlJUQUtFTiwKLSAgQkZEX1JFTE9DX1BQQ19CQTE2X0JSTlRBS0VOLAotICBCRkRfUkVMT0NfUFBDX0NPUFksCi0gIEJGRF9SRUxPQ19QUENfR0xPQl9EQVQsCi0gIEJGRF9SRUxPQ19QUENfSk1QX1NMT1QsCi0gIEJGRF9SRUxPQ19QUENfUkVMQVRJVkUsCi0gIEJGRF9SRUxPQ19QUENfTE9DQUwyNFBDLAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyLAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2LAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0xPLAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJLAotICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBLAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREFJMTYsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJJMTYsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUwsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQTIxLAotICBCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUYsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2LAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9MTywKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEksCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBLAotICBCRkRfUkVMT0NfUFBDX0VNQl9CSVRfRkxELAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREEsCi0KLS8qIFRoZSB0eXBlIG9mIHJlbG9jIHVzZWQgdG8gYnVpbGQgYSBjb250cnVjdG9yIHRhYmxlIC0gYXQgdGhlIG1vbWVudAotcHJvYmFibHkgYSAzMiBiaXQgd2lkZSBhYnNvbHV0ZSByZWxvY2F0aW9uLCBidXQgdGhlIHRhcmdldCBjYW4gY2hvb3NlLgotSXQgZ2VuZXJhbGx5IGRvZXMgbWFwIHRvIG9uZSBvZiB0aGUgb3RoZXIgcmVsb2NhdGlvbiB0eXBlcy4gKi8KLSAgQkZEX1JFTE9DX0NUT1IsCi0KLS8qIEFSTSAyNiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZQotbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILAotCi0vKiBUaGVzZSByZWxvY3MgYXJlIG9ubHkgdXNlZCB3aXRoaW4gdGhlIEFSTSBhc3NlbWJsZXIuICBUaGV5IGFyZSBub3QKLShhdCBwcmVzZW50KSB3cml0dGVuIHRvIGFueSBvYmplY3QgZmlsZXMuICovCi0gIEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFLAotICBCRkRfUkVMT0NfQVJNX0FEUkxfSU1NRURJQVRFLAotICBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU0sCi0gIEJGRF9SRUxPQ19BUk1fU0hJRlRfSU1NLAotICBCRkRfUkVMT0NfQVJNX1NXSSwKLSAgQkZEX1JFTE9DX0FSTV9NVUxUSSwKLSAgQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NLAotICBCRkRfUkVMT0NfQVJNX0FEUl9JTU0sCi0gIEJGRF9SRUxPQ19BUk1fTERSX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9MSVRFUkFMLAotICBCRkRfUkVMT0NfQVJNX0lOX1BPT0wsCi0gIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTgsCi0gIEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMLAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERCwKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9JTU0sCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQsCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VULAotICBCRkRfUkVMT0NfQVJNX0dPVDEyLAotICBCRkRfUkVMT0NfQVJNX0dPVDMyLAotICBCRkRfUkVMT0NfQVJNX0pVTVBfU0xPVCwKLSAgQkZEX1JFTE9DX0FSTV9DT1BZLAotICBCRkRfUkVMT0NfQVJNX0dMT0JfREFULAotICBCRkRfUkVMT0NfQVJNX1BMVDMyLAotICBCRkRfUkVMT0NfQVJNX1JFTEFUSVZFLAotICBCRkRfUkVMT0NfQVJNX0dPVE9GRiwKLSAgQkZEX1JFTE9DX0FSTV9HT1RQQywKLQotLyogSGl0YWNoaSBTSCByZWxvY3MuICBOb3QgYWxsIG9mIHRoZXNlIGFwcGVhciBpbiBvYmplY3QgZmlsZXMuICovCi0gIEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyLAotICBCRkRfUkVMT0NfU0hfUENESVNQMTJCWTIsCi0gIEJGRF9SRUxPQ19TSF9JTU00LAotICBCRkRfUkVMT0NfU0hfSU1NNEJZMiwKLSAgQkZEX1JFTE9DX1NIX0lNTTRCWTQsCi0gIEJGRF9SRUxPQ19TSF9JTU04LAotICBCRkRfUkVMT0NfU0hfSU1NOEJZMiwKLSAgQkZEX1JFTE9DX1NIX0lNTThCWTQsCi0gIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTIsCi0gIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTQsCi0gIEJGRF9SRUxPQ19TSF9TV0lUQ0gxNiwKLSAgQkZEX1JFTE9DX1NIX1NXSVRDSDMyLAotICBCRkRfUkVMT0NfU0hfVVNFUywKLSAgQkZEX1JFTE9DX1NIX0NPVU5ULAotICBCRkRfUkVMT0NfU0hfQUxJR04sCi0gIEJGRF9SRUxPQ19TSF9DT0RFLAotICBCRkRfUkVMT0NfU0hfREFUQSwKLSAgQkZEX1JFTE9DX1NIX0xBQkVMLAotCi0vKiBUaHVtYiAyMy0sIDEyLSBhbmQgOS1iaXQgcGMtcmVsYXRpdmUgYnJhbmNoZXMuICBUaGUgbG93ZXN0IGJpdCBtdXN0Ci1iZSB6ZXJvIGFuZCBpcyBub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDksCi0gIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMiwKLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzLAotCi0vKiBBcmdvbmF1dCBSSVNDIENvcmUgKEFSQykgcmVsb2NzLgotQVJDIDIyIGJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlCi1ub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSBoaWdoIDIwIGJpdHMgYXJlIGluc3RhbGxlZCBpbiBiaXRzIDI2Ci10aHJvdWdoIDcgb2YgdGhlIGluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTCwKLQotLyogQVJDIDI2IGJpdCBhYnNvbHV0ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlIG5vdAotc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSBoaWdoIDI0IGJpdHMgYXJlIGluc3RhbGxlZCBpbiBiaXRzIDIzCi10aHJvdWdoIDAuICovCi0gIEJGRF9SRUxPQ19BUkNfQjI2LAotCi0vKiBNaXRzdWJpc2hpIEQxMFYgcmVsb2NzLgotVGhpcyBpcyBhIDEwLWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLWFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUiwKLQotLyogTWl0c3ViaXNoaSBEMTBWIHJlbG9jcy4KLVRoaXMgaXMgYSAxMC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi1hc3N1bWVkIHRvIGJlIDAuICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyByZWxvYwotZXhjZXB0IGl0IGlzIGluIHRoZSBsZWZ0IGNvbnRhaW5lciwgaS5lLiwKLXNoaWZ0ZWQgbGVmdCAxNSBiaXRzLiAqLwotICBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MLAotCi0vKiBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLWFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QxMFZfMTgsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDEwVl8xOF9QQ1JFTCwKLQotLyogTWl0c3ViaXNoaSBEMzBWIHJlbG9jcy4KLVRoaXMgaXMgYSA2LWJpdCBhYnNvbHV0ZSByZWxvYy4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfNiwKLQotLyogVGhpcyBpcyBhIDYtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDYtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotb2YgdGhlIGNvbnRhaW5lci4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SLAotCi0vKiBUaGlzIGlzIGEgMTItYml0IGFic29sdXRlIHJlbG9jIHdpdGggdGhlIAotcmlnaHQgMyBiaXRzYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDMwVl8xNSwKLQotLyogVGhpcyBpcyBhIDEyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTItYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotb2YgdGhlIGNvbnRhaW5lci4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUxfUiwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgYWJzb2x1dGUgcmVsb2Mgd2l0aCAKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDMwVl8yMSwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTCwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCi1hcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi1vZiB0aGUgY29udGFpbmVyLiAqLwotICBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SLAotCi0vKiBUaGlzIGlzIGEgMzItYml0IGFic29sdXRlIHJlbG9jLiAqLwotICBCRkRfUkVMT0NfRDMwVl8zMiwKLQotLyogVGhpcyBpcyBhIDMyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYy4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwsCi0KLS8qIE1pdHN1YmlzaGkgTTMyUiByZWxvY3MuCi1UaGlzIGlzIGEgMjQgYml0IGFic29sdXRlIGFkZHJlc3MuICovCi0gIEJGRF9SRUxPQ19NMzJSXzI0LAotCi0vKiBUaGlzIGlzIGEgMTAtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMLAotCi0vKiBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDI2LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfTTMyUl8yNl9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBoaWdoIDE2IGJpdHMgb2YgYW4gYWRkcmVzcwotdXNlZCB3aGVuIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB0cmVhdGVkIGFzIHVuc2lnbmVkLiAqLwotICBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTywKLQotLyogVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBoaWdoIDE2IGJpdHMgb2YgYW4gYWRkcmVzcwotdXNlZCB3aGVuIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB0cmVhdGVkIGFzIHNpZ25lZC4gKi8KLSAgQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8sCi0KLS8qIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgbG93ZXIgMTYgYml0cyBvZiBhbiBhZGRyZXNzLiAqLwotICBCRkRfUkVMT0NfTTMyUl9MTzE2LAotCi0vKiBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIHNtYWxsIGRhdGEgYXJlYSBvZmZzZXQgZm9yIHVzZSBpbgotYWRkMywgbG9hZCwgYW5kIHN0b3JlIGluc3RydWN0aW9ucy4gKi8KLSAgQkZEX1JFTE9DX00zMlJfU0RBMTYsCi0KLS8qIFRoaXMgaXMgYSA5LWJpdCByZWxvYyAqLwotICBCRkRfUkVMT0NfVjg1MF85X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMjItYml0IHJlbG9jICovCi0gIEJGRF9SRUxPQ19WODUwXzIyX1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgMTUgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLXNob3J0IGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9TREFfMTVfMTZfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSAxNSBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotemVybyBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCwKLQotLyogVGhpcyBpcyBhbiA4IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNiBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYW4gOGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNyBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZSB0aW55Ci1kYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSA3IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSA1IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNCBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZSB0aW55Ci1kYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSA0IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLCB3aXRoIHRoZQotYml0cyBwbGFjZWQgbm9uLWNvbnRpZ291c2x5IGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlciwgd2l0aCB0aGUKLWJpdHMgcGxhY2VkIG5vbi1jb250aWdvdXNseSBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSA2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQsCi0KLQotLyogVGhpcyBpcyBhIDMyYml0IHBjcmVsIHJlbG9jIGZvciB0aGUgbW4xMDMwMCwgb2Zmc2V0IGJ5IHR3byBieXRlcyBpbiB0aGUKLWluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfTU4xMDMwMF8zMl9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDE2Yml0IHBjcmVsIHJlbG9jIGZvciB0aGUgbW4xMDMwMCwgb2Zmc2V0IGJ5IHR3byBieXRlcyBpbiB0aGUKLWluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfTU4xMDMwMF8xNl9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDhiaXQgRFAgcmVsb2MgZm9yIHRoZSB0bXMzMjBjMzAsIHdoZXJlIHRoZSBtb3N0Ci1zaWduaWZpY2FudCA4IGJpdHMgb2YgYSAyNCBiaXQgd29yZCBhcmUgcGxhY2VkIGludG8gdGhlIGxlYXN0Ci1zaWduaWZpY2FudCA4IGJpdHMgb2YgdGhlIG9wY29kZS4gKi8KLSAgQkZEX1JFTE9DX1RJQzMwX0xEUCwKLQotLyogVGhpcyBpcyBhIDQ4IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgMzIgYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfNDgsCi0KLS8qIFRoaXMgaXMgYSAzMiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIDIwIGJpdHMgc3BsaXQgdXAgaW50bwotdHdvIHNlY3Rpb25zLiAqLwotICBCRkRfUkVMT0NfRlIzMF8yMCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA2IGJpdCB3b3JkIG9mZnNldCBpbgotNCBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF82X0lOXzQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGFuIDggYml0IGJ5dGUgb2Zmc2V0Ci1pbnRvIDggYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfOF9JTl84LAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDkgYml0IHNob3J0IG9mZnNldAotaW50byA4IGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzlfSU5fOCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSAxMCBiaXQgd29yZCBvZmZzZXQKLWludG8gOCBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF8xMF9JTl84LAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDkgYml0IHBjIHJlbGF0aXZlCi1zaG9ydCBvZmZzZXQgaW50byA4IGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzlfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgMTIgYml0IHBjIHJlbGF0aXZlCi1zaG9ydCBvZmZzZXQgaW50byAxMSBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTCwKLQotLyogTW90b3JvbGEgTWNvcmUgcmVsb2NhdGlvbnMuICovCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0LAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIsCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyLAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfMzIsCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIsCi0gIEJGRF9SRUxPQ19NQ09SRV9SVkEsCi0KLS8qIFRoZXNlIHR3byByZWxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgbGlua2VyIHRvIGRldGVybWluZSB3aGljaCBvZiAKLXRoZSBlbnRyaWVzIGluIGEgQysrIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgYXJlIGFjdHVhbGx5IHVzZWQuICBXaGVuCi10aGUgLS1nYy1zZWN0aW9ucyBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBsaW5rZXIgd2lsbCB6ZXJvIG91dCB0aGUgZW50cmllcwotdGhhdCBhcmUgbm90IHVzZWQsIHNvIHRoYXQgdGhlIGNvZGUgZm9yIHRob3NlIGZ1bmN0aW9ucyBuZWVkIG5vdCBiZQotaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KLQotVlRBQkxFX0lOSEVSSVQgaXMgYSB6ZXJvLXNwYWNlIHJlbG9jYXRpb24gdXNlZCB0byBkZXNjcmliZSB0byB0aGUKLWxpbmtlciB0aGUgaW5oZXJpdGVuY2UgdHJlZSBvZiBhIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgVGhlCi1yZWxvY2F0aW9uJ3Mgc3ltYm9sIHNob3VsZCBiZSB0aGUgcGFyZW50IGNsYXNzJyB2dGFibGUsIGFuZCB0aGUKLXJlbG9jYXRpb24gc2hvdWxkIGJlIGxvY2F0ZWQgYXQgdGhlIGNoaWxkIHZ0YWJsZS4KLQotVlRBQkxFX0VOVFJZIGlzIGEgemVyby1zcGFjZSByZWxvY2F0aW9uIHRoYXQgZGVzY3JpYmVzIHRoZSB1c2Ugb2YgYQotdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBlbnRyeS4gIFRoZSByZWxvYydzIHN5bWJvbCBzaG91bGQgcmVmZXIgdG8gdGhlCi10YWJsZSBvZiB0aGUgY2xhc3MgbWVudGlvbmVkIGluIHRoZSBjb2RlLiAgT2ZmIG9mIHRoYXQgYmFzZSwgYW4gb2Zmc2V0Ci1kZXNjcmliZXMgdGhlIGVudHJ5IHRoYXQgaXMgYmVpbmcgdXNlZC4gIEZvciBSZWxhIGhvc3RzLCB0aGlzIG9mZnNldCAKLWlzIHN0b3JlZCBpbiB0aGUgcmVsb2MncyBhZGRlbmQuICBGb3IgUmVsIGhvc3RzLCB3ZSBhcmUgZm9yY2VkIHRvIHB1dAotdGhpcyBvZmZzZXQgaW4gdGhlIHJlbG9jJ3Mgc2VjdGlvbiBvZmZzZXQuICovCi0gIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwKLSAgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwKLSAgQkZEX1JFTE9DX1VOVVNFRCB9OwotdHlwZWRlZiBlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlOwotcmVsb2NfaG93dG9fdHlwZSAqCi0KLWJmZF9yZWxvY190eXBlX2xvb2t1cCAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi1jb25zdCBjaGFyICoKLWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lICBQQVJBTVMgKChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi0KLXR5cGVkZWYgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeQotewotICAgICAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIEJGRCB3aGljaCBvd25zIHRoZSBzeW1ib2wuIFRoaXMgaW5mb3JtYXRpb24KLSAgICAgICAgICBpcyBuZWNlc3Nhcnkgc28gdGhhdCBhIGJhY2sgZW5kIGNhbiB3b3JrIG91dCB3aGF0IGFkZGl0aW9uYWwKLSAgICAgICAgICBpbmZvcm1hdGlvbiAoaW52aXNpYmxlIHRvIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIpIGlzIGNhcnJpZWQKLSAgICAgICAgICB3aXRoIHRoZSBzeW1ib2wuCi0KLSAgICAgICAgICBUaGlzIGZpZWxkIGlzICphbG1vc3QqIHJlZHVuZGFudCwgc2luY2UgeW91IGNhbiB1c2Ugc2VjdGlvbi0+b3duZXIKLSAgICAgICAgICBpbnN0ZWFkLCBleGNlcHQgdGhhdCBzb21lIHN5bWJvbHMgcG9pbnQgdG8gdGhlIGdsb2JhbCBzZWN0aW9ucwotICAgICAgICAgIGJmZF97YWJzLGNvbSx1bmR9X3NlY3Rpb24uICBUaGlzIGNvdWxkIGJlIGZpeGVkIGJ5IG1ha2luZwotICAgICAgICAgIHRoZXNlIGdsb2JhbHMgYmUgcGVyLWJmZCAob3IgcGVyLXRhcmdldC1mbGF2b3IpLiAgRklYTUUuICovCi0KLSAgc3RydWN0IF9iZmQgKnRoZV9iZmQ7ICAvKiBVc2UgYmZkX2FzeW1ib2xfYmZkKHN5bSkgdG8gYWNjZXNzIHRoaXMgZmllbGQuICovCi0KLSAgICAgICAgLyogVGhlIHRleHQgb2YgdGhlIHN5bWJvbC4gVGhlIG5hbWUgaXMgbGVmdCBhbG9uZSwgYW5kIG5vdCBjb3BpZWQ7IHRoZQotICAgICAgICAgIGFwcGxpY2F0aW9uIG1heSBub3QgYWx0ZXIgaXQuICovCi0gIENPTlNUIGNoYXIgKm5hbWU7Ci0KLSAgICAgICAgLyogVGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBUaGlzIHJlYWxseSBzaG91bGQgYmUgYSB1bmlvbiBvZiBhCi0gICAgICAgICAgbnVtZXJpYyB2YWx1ZSB3aXRoIGEgcG9pbnRlciwgc2luY2Ugc29tZSBmbGFncyBpbmRpY2F0ZSB0aGF0Ci0gICAgICAgICAgYSBwb2ludGVyIHRvIGFub3RoZXIgc3ltYm9sIGlzIHN0b3JlZCBoZXJlLiAgKi8KLSAgc3ltdmFsdWUgdmFsdWU7Ci0KLSAgICAgICAgLyogQXR0cmlidXRlcyBvZiBhIHN5bWJvbDogKi8KLQotI2RlZmluZSBCU0ZfTk9fRkxBR1MgICAgMHgwMAotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgaGFzIGxvY2FsIHNjb3BlOyA8PHN0YXRpYz4+IGluIDw8Qz4+LiBUaGUgdmFsdWUKLSAgICAgICAgICBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICovCi0jZGVmaW5lIEJTRl9MT0NBTCAgICAgIDB4MDEKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGhhcyBnbG9iYWwgc2NvcGU7IGluaXRpYWxpemVkIGRhdGEgaW4gPDxDPj4uIFRoZQotICAgICAgICAgIHZhbHVlIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKi8KLSNkZWZpbmUgQlNGX0dMT0JBTCAgICAgMHgwMgotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgaGFzIGdsb2JhbCBzY29wZSBhbmQgaXMgZXhwb3J0ZWQuIFRoZSB2YWx1ZSBpcwotICAgICAgICAgIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKi8KLSNkZWZpbmUgQlNGX0VYUE9SVCAgICAgQlNGX0dMT0JBTCAgLyogbm8gcmVhbCBkaWZmZXJlbmNlICovCi0KLSAgICAgICAgLyogQSBub3JtYWwgQyBzeW1ib2wgd291bGQgYmUgb25lIG9mOgotICAgICAgICAgIDw8QlNGX0xPQ0FMPj4sIDw8QlNGX0ZPUlRfQ09NTT4+LCAgPDxCU0ZfVU5ERUZJTkVEPj4gb3IKLSAgICAgICAgICA8PEJTRl9HTE9CQUw+PiAqLwotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgaXMgYSBkZWJ1Z2dpbmcgcmVjb3JkLiBUaGUgdmFsdWUgaGFzIGFuIGFyYml0YXJ5Ci0gICAgICAgICAgbWVhbmluZywgdW5sZXNzIEJTRl9ERUJVR0dJTkdfUkVMT0MgaXMgYWxzbyBzZXQuICAqLwotI2RlZmluZSBCU0ZfREVCVUdHSU5HICAweDA4Ci0KLSAgICAgICAgLyogVGhlIHN5bWJvbCBkZW5vdGVzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQuICBVc2VkIGluIEVMRiwKLSAgICAgICAgICBwZXJoYXBzIG90aGVycyBzb21lZGF5LiAgKi8KLSNkZWZpbmUgQlNGX0ZVTkNUSU9OICAgIDB4MTAKLQotICAgICAgICAvKiBVc2VkIGJ5IHRoZSBsaW5rZXIuICovCi0jZGVmaW5lIEJTRl9LRUVQICAgICAgICAweDIwCi0jZGVmaW5lIEJTRl9LRUVQX0cgICAgICAweDQwCi0KLSAgICAgICAgLyogQSB3ZWFrIGdsb2JhbCBzeW1ib2wsIG92ZXJyaWRhYmxlIHdpdGhvdXQgd2FybmluZ3MgYnkKLSAgICAgICAgICBhIHJlZ3VsYXIgZ2xvYmFsIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lLiAgKi8KLSNkZWZpbmUgQlNGX1dFQUsgICAgICAgIDB4ODAKLQotICAgICAgICAvKiBUaGlzIHN5bWJvbCB3YXMgY3JlYXRlZCB0byBwb2ludCB0byBhIHNlY3Rpb24sIGUuZy4gRUxGJ3MKLSAgICAgICAgICBTVFRfU0VDVElPTiBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgQlNGX1NFQ1RJT05fU1lNIDB4MTAwCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCB1c2VkIHRvIGJlIGEgY29tbW9uIHN5bWJvbCwgYnV0IG5vdyBpdCBpcwotICAgICAgICAgIGFsbG9jYXRlZC4gKi8KLSNkZWZpbmUgQlNGX09MRF9DT01NT04gIDB4MjAwCi0KLSAgICAgICAgLyogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGNvbW1vbiBkYXRhLiAqLwotI2RlZmluZSBCRkRfRk9SVF9DT01NX0RFRkFVTFRfVkFMVUUgMAotCi0gICAgICAgIC8qIEluIHNvbWUgZmlsZXMgdGhlIHR5cGUgb2YgYSBzeW1ib2wgc29tZXRpbWVzIGFsdGVycyBpdHMKLSAgICAgICAgICBsb2NhdGlvbiBpbiBhbiBvdXRwdXQgZmlsZSAtIGllIGluIGNvZmYgYSA8PElTRkNOPj4gc3ltYm9sCi0gICAgICAgICAgd2hpY2ggaXMgYWxzbyA8PENfRVhUPj4gc3ltYm9sIGFwcGVhcnMgd2hlcmUgaXQgd2FzCi0gICAgICAgICAgZGVjbGFyZWQgYW5kIG5vdCBhdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gIFRoaXMgYml0IGlzIHNldAotICAgICAgICAgIGJ5IHRoZSB0YXJnZXQgQkZEIHBhcnQgdG8gY29udmV5IHRoaXMgaW5mb3JtYXRpb24uICovCi0KLSNkZWZpbmUgQlNGX05PVF9BVF9FTkQgICAgMHg0MDAKLQotICAgICAgICAvKiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIHRoZSBsYWJlbCBvZiBjb25zdHJ1Y3RvciBzZWN0aW9uLiAqLwotI2RlZmluZSBCU0ZfQ09OU1RSVUNUT1IgICAweDgwMAotCi0gICAgICAgIC8qIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgYSB3YXJuaW5nIHN5bWJvbC4gIFRoZSBuYW1lIGlzIGEKLSAgICAgICAgICB3YXJuaW5nLiAgVGhlIG5hbWUgb2YgdGhlIG5leHQgc3ltYm9sIGlzIHRoZSBvbmUgdG8gd2FybiBhYm91dDsKLSAgICAgICAgICBpZiBhIHJlZmVyZW5jZSBpcyBtYWRlIHRvIGEgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgbmV4dAotICAgICAgICAgIHN5bWJvbCwgYSB3YXJuaW5nIGlzIGlzc3VlZCBieSB0aGUgbGlua2VyLiAqLwotI2RlZmluZSBCU0ZfV0FSTklORyAgICAgICAweDEwMDAKLQotICAgICAgICAvKiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIGluZGlyZWN0LiAgVGhpcyBzeW1ib2wgaXMgYW4gaW5kaXJlY3QKLSAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0IHN5bWJvbC4gKi8KLSNkZWZpbmUgQlNGX0lORElSRUNUICAgICAgMHgyMDAwCi0KLSAgICAgICAgLyogQlNGX0ZJTEUgbWFya3Mgc3ltYm9scyB0aGF0IGNvbnRhaW4gYSBmaWxlIG5hbWUuICBUaGlzIGlzIHVzZWQKLSAgICAgICAgICBmb3IgRUxGIFNUVF9GSUxFIHN5bWJvbHMuICAqLwotI2RlZmluZSBCU0ZfRklMRSAgICAgICAgICAweDQwMDAKLQotICAgICAgICAvKiBTeW1ib2wgaXMgZnJvbSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBCU0ZfRFlOQU1JQyAgICAgICAweDgwMDAKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBkYXRhIG9iamVjdC4gIFVzZWQgaW4gRUxGLCBhbmQgcGVyaGFwcwotICAgICAgICAgIG90aGVycyBzb21lZGF5LiAgKi8KLSNkZWZpbmUgQlNGX09CSkVDVCAgICAgICAgMHgxMDAwMAotCi0gICAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0Ci0gICAgICAgICAgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gIEJTRl9ERUJVR0dJTkcgc2hvdWxkIGJlIHNldAotICAgICAgICAgIGFzIHdlbGwuICAqLwotI2RlZmluZSBCU0ZfREVCVUdHSU5HX1JFTE9DIDB4MjAwMDAKLQotICBmbGFnd29yZCBmbGFnczsKLQotICAgICAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gdG8gd2hpY2ggdGhpcyBzeW1ib2wgaXMKLSAgICAgICAgICByZWxhdGl2ZS4gIFRoaXMgd2lsbCBhbHdheXMgYmUgbm9uIE5VTEwsIHRoZXJlIGFyZSBzcGVjaWFsCi0gICAgICAgICAgc2VjdGlvbnMgZm9yIHVuZGVmaW5lZCBhbmQgYWJzb2x1dGUgc3ltYm9scy4gICovCi0gIHN0cnVjdCBzZWMgKnNlY3Rpb247Ci0KLSAgICAgICAgLyogQmFjayBlbmQgc3BlY2lhbCBkYXRhLiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBQVFIgcDsKLSAgICAgIGJmZF92bWEgaTsKLSAgICB9IHVkYXRhOwotCi19IGFzeW1ib2w7Ci0jZGVmaW5lIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKGFiZmQpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgKGFiZmQpKQotYm9vbGVhbiAKLWJmZF9pc19sb2NhbF9sYWJlbCBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKnN5bSkpOwotCi1ib29sZWFuIAotYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICphYmZkLCBjb25zdCBjaGFyICpuYW1lKSk7Ci0KLSNkZWZpbmUgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUoYWJmZCwgbmFtZSkgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lLCAoYWJmZCwgbmFtZSkpCi0jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiKGFiZmQsIGxvY2F0aW9uKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIsXAotICAgICAgICAgICAgICAgICAgKGFiZmQsIGxvY2F0aW9uKSkKLWJvb2xlYW4gCi1iZmRfc2V0X3N5bXRhYiAgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICoqbG9jYXRpb24sIHVuc2lnbmVkIGludCBjb3VudCkpOwotCi12b2lkIAotYmZkX3ByaW50X3N5bWJvbF92YW5kZiBQQVJBTVMgKChQVFIgZmlsZSwgYXN5bWJvbCAqc3ltYm9sKSk7Ci0KLSNkZWZpbmUgYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9lbXB0eV9zeW1ib2wsIChhYmZkKSkKLSNkZWZpbmUgYmZkX21ha2VfZGVidWdfc3ltYm9sKGFiZmQscHRyLHNpemUpIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wsIChhYmZkLCBwdHIsIHNpemUpKQotaW50IAotYmZkX2RlY29kZV9zeW1jbGFzcyBQQVJBTVMgKChhc3ltYm9sICpzeW1ib2wpKTsKLQotdm9pZCAKLWJmZF9zeW1ib2xfaW5mbyBQQVJBTVMgKChhc3ltYm9sICpzeW1ib2wsIHN5bWJvbF9pbmZvICpyZXQpKTsKLQotYm9vbGVhbiAKLWJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBhc3ltYm9sICppc3ltLCBiZmQgKm9iZmQsIGFzeW1ib2wgKm9zeW0pKTsKLQotI2RlZmluZSBiZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKGliZmQsIGlzeW1ib2wsIG9iZmQsIG9zeW1ib2wpIFwKLSAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhLCBcCi0gICAgICAgICAgICAgICAoaWJmZCwgaXN5bWJvbCwgb2JmZCwgb3N5bWJvbCkpCi1zdHJ1Y3QgX2JmZCAKLXsKLSAgICAgLyogVGhlIGZpbGVuYW1lIHRoZSBhcHBsaWNhdGlvbiBvcGVuZWQgdGhlIEJGRCB3aXRoLiAgKi8KLSAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsgICAgICAgICAgICAgICAgCi0KLSAgICAgLyogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQganVtcCB0YWJsZS4gICAgICAgICAgICAgKi8KLSAgICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqeHZlYzsKLQotICAgICAvKiBUbyBhdm9pZCBkcmFnZ2luZyB0b28gbWFueSBoZWFkZXIgZmlsZXMgaW50byBldmVyeSBmaWxlIHRoYXQKLSAgICAgICBpbmNsdWRlcyBgPDxiZmQuaD4+JywgSU9TVFJFQU0gaGFzIGJlZW4gZGVjbGFyZWQgYXMgYSAiY2hhcgotICAgICAgICoiLCBhbmQgTVRJTUUgYXMgYSAibG9uZyIuICBUaGVpciBjb3JyZWN0IHR5cGVzLCB0byB3aGljaCB0aGV5Ci0gICAgICAgYXJlIGNhc3Qgd2hlbiB1c2VkLCBhcmUgIkZJTEUgKiIgYW5kICJ0aW1lX3QiLiAgICBUaGUgaW9zdHJlYW0KLSAgICAgICBpcyB0aGUgcmVzdWx0IG9mIGFuIGZvcGVuIG9uIHRoZSBmaWxlbmFtZS4gIEhvd2V2ZXIsIGlmIHRoZQotICAgICAgIEJGRF9JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoZW4gaW9zdHJlYW0gaXMgYWN0dWFsbHkgYSBwb2ludGVyCi0gICAgICAgdG8gYSBiZmRfaW5fbWVtb3J5IHN0cnVjdC4gICovCi0gICAgUFRSIGlvc3RyZWFtOwotCi0gICAgIC8qIElzIHRoZSBmaWxlIGRlc2NyaXB0b3IgYmVpbmcgY2FjaGVkPyAgVGhhdCBpcywgY2FuIGl0IGJlIGNsb3NlZCBhcwotICAgICAgIG5lZWRlZCwgYW5kIHJlLW9wZW5lZCB3aGVuIGFjY2Vzc2VkIGxhdGVyPyAgKi8KLQotICAgIGJvb2xlYW4gY2FjaGVhYmxlOwotCi0gICAgIC8qIE1hcmtzIHdoZXRoZXIgdGhlcmUgd2FzIGEgZGVmYXVsdCB0YXJnZXQgc3BlY2lmaWVkIHdoZW4gdGhlCi0gICAgICAgQkZEIHdhcyBvcGVuZWQuIFRoaXMgaXMgdXNlZCB0byBzZWxlY3Qgd2hpY2ggbWF0Y2hpbmcgYWxnb3JpdGhtCi0gICAgICAgdG8gdXNlIHRvIGNob29zZSB0aGUgYmFjayBlbmQuICovCi0KLSAgICBib29sZWFuIHRhcmdldF9kZWZhdWx0ZWQ7Ci0KLSAgICAgLyogVGhlIGNhY2hpbmcgcm91dGluZXMgdXNlIHRoZXNlIHRvIG1haW50YWluIGEKLSAgICAgICBsZWFzdC1yZWNlbnRseS11c2VkIGxpc3Qgb2YgQkZEcyAqLwotCi0gICAgc3RydWN0IF9iZmQgKmxydV9wcmV2LCAqbHJ1X25leHQ7Ci0KLSAgICAgLyogV2hlbiBhIGZpbGUgaXMgY2xvc2VkIGJ5IHRoZSBjYWNoaW5nIHJvdXRpbmVzLCBCRkQgcmV0YWlucwotICAgICAgIHN0YXRlIGluZm9ybWF0aW9uIG9uIHRoZSBmaWxlIGhlcmU6ICovCi0KLSAgICBmaWxlX3B0ciB3aGVyZTsgICAgICAgICAgICAgIAotCi0gICAgIC8qIGFuZCBoZXJlOiAoYGBvbmNlJycgbWVhbnMgYXQgbGVhc3Qgb25jZSkgKi8KLQotICAgIGJvb2xlYW4gb3BlbmVkX29uY2U7Ci0KLSAgICAgLyogU2V0IGlmIHdlIGhhdmUgYSBsb2NhbGx5IG1haW50YWluZWQgbXRpbWUgdmFsdWUsIHJhdGhlciB0aGFuCi0gICAgICAgZ2V0dGluZyBpdCBmcm9tIHRoZSBmaWxlIGVhY2ggdGltZTogKi8KLQotICAgIGJvb2xlYW4gbXRpbWVfc2V0OwotCi0gICAgIC8qIEZpbGUgbW9kaWZpZWQgdGltZSwgaWYgbXRpbWVfc2V0IGlzIHRydWU6ICovCi0KLSAgICBsb25nIG10aW1lOyAgICAgICAgICAKLQotICAgICAvKiBSZXNlcnZlZCBmb3IgYW4gdW5pbXBsZW1lbnRlZCBmaWxlIGxvY2tpbmcgZXh0ZW5zaW9uLiovCi0KLSAgICBpbnQgaWZkOwotCi0gICAgIC8qIFRoZSBmb3JtYXQgd2hpY2ggYmVsb25ncyB0byB0aGUgQkZELiAob2JqZWN0LCBjb3JlLCBldGMuKSAqLwotCi0gICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci0KLSAgICAgLyogVGhlIGRpcmVjdGlvbiB0aGUgQkZEIHdhcyBvcGVuZWQgd2l0aCovCi0KLSAgICBlbnVtIGJmZF9kaXJlY3Rpb24ge25vX2RpcmVjdGlvbiA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkX2RpcmVjdGlvbiA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9kaXJlY3Rpb24gPSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgYm90aF9kaXJlY3Rpb24gPSAzfSBkaXJlY3Rpb247Ci0KLSAgICAgLyogRm9ybWF0X3NwZWNpZmljIGZsYWdzKi8KLQotICAgIGZsYWd3b3JkIGZsYWdzOyAgICAgICAgICAgICAgCi0KLSAgICAgLyogQ3VycmVudGx5IG15X2FyY2hpdmUgaXMgdGVzdGVkIGJlZm9yZSBhZGRpbmcgb3JpZ2luIHRvCi0gICAgICAgYW55dGhpbmcuIEkgYmVsaWV2ZSB0aGF0IHRoaXMgY2FuIGJlY29tZSBhbHdheXMgYW4gYWRkIG9mCi0gICAgICAgb3JpZ2luLCB3aXRoIG9yaWdpbiBzZXQgdG8gMCBmb3Igbm9uIGFyY2hpdmUgZmlsZXMuICAgKi8KLQotICAgIGZpbGVfcHRyIG9yaWdpbjsgICAgICAgICAgICAgCi0KLSAgICAgLyogUmVtZW1iZXIgd2hlbiBvdXRwdXQgaGFzIGJlZ3VuLCB0byBzdG9wIHN0cmFuZ2UgdGhpbmdzCi0gICAgICAgZnJvbSBoYXBwZW5pbmcuICovCi0gICAgYm9vbGVhbiBvdXRwdXRfaGFzX2JlZ3VuOwotCi0gICAgIC8qIFBvaW50ZXIgdG8gbGlua2VkIGxpc3Qgb2Ygc2VjdGlvbnMqLwotICAgIHN0cnVjdCBzZWMgICpzZWN0aW9uczsKLQotICAgICAvKiBUaGUgbnVtYmVyIG9mIHNlY3Rpb25zICovCi0gICAgdW5zaWduZWQgaW50IHNlY3Rpb25fY291bnQ7Ci0KLSAgICAgLyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIG9iamVjdCBmaWxlczogCi0gICAgICAgVGhlIHN0YXJ0IGFkZHJlc3MuICovCi0gICAgYmZkX3ZtYSBzdGFydF9hZGRyZXNzOwotCi0gICAgIC8qIFVzZWQgZm9yIGlucHV0IGFuZCBvdXRwdXQqLwotICAgIHVuc2lnbmVkIGludCBzeW1jb3VudDsKLQotICAgICAvKiBTeW1ib2wgdGFibGUgZm9yIG91dHB1dCBCRkQgKHdpdGggc3ltY291bnQgZW50cmllcykgKi8KLSAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICAqKm91dHN5bWJvbHM7ICAgICAgICAgICAgIAotCi0gICAgIC8qIFBvaW50ZXIgdG8gc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIGFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbiovCi0gICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmFyY2hfaW5mbzsKLQotICAgICAvKiBTdHVmZiBvbmx5IHVzZWZ1bCBmb3IgYXJjaGl2ZXM6Ki8KLSAgICBQVFIgYXJlbHRfZGF0YTsgICAgICAgICAgICAgIAotICAgIHN0cnVjdCBfYmZkICpteV9hcmNoaXZlOyAgICAgIC8qIFRoZSBjb250YWluaW5nIGFyY2hpdmUgQkZELiAgKi8KLSAgICBzdHJ1Y3QgX2JmZCAqbmV4dDsgICAgICAgICAgICAvKiBUaGUgbmV4dCBCRkQgaW4gdGhlIGFyY2hpdmUuICAqLwotICAgIHN0cnVjdCBfYmZkICphcmNoaXZlX2hlYWQ7ICAgIC8qIFRoZSBmaXJzdCBCRkQgaW4gdGhlIGFyY2hpdmUuICAqLwotICAgIGJvb2xlYW4gaGFzX2FybWFwOyAgICAgICAgICAgCi0KLSAgICAgLyogQSBjaGFpbiBvZiBCRkQgc3RydWN0dXJlcyBpbnZvbHZlZCBpbiBhIGxpbmsuICAqLwotICAgIHN0cnVjdCBfYmZkICpsaW5rX25leHQ7Ci0KLSAgICAgLyogQSBmaWVsZCB1c2VkIGJ5IF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMuICBUaGlzIHdpbGwKLSAgICAgICBiZSB1c2VkIG9ubHkgZm9yIGFyY2hpdmUgZWxlbWVudHMuICAqLwotICAgIGludCBhcmNoaXZlX3Bhc3M7Ci0KLSAgICAgLyogVXNlZCBieSB0aGUgYmFjayBlbmQgdG8gaG9sZCBwcml2YXRlIGRhdGEuICovCi0KLSAgICB1bmlvbiAKLSAgICAgIHsKLSAgICAgIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICphb3V0X2RhdGE7Ci0gICAgICBzdHJ1Y3QgYXJ0ZGF0YSAqYW91dF9hcl9kYXRhOwotICAgICAgc3RydWN0IF9vYXN5c19kYXRhICpvYXN5c19vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBfb2FzeXNfYXJfZGF0YSAqb2FzeXNfYXJfZGF0YTsKLSAgICAgIHN0cnVjdCBjb2ZmX3RkYXRhICpjb2ZmX29ial9kYXRhOwotICAgICAgc3RydWN0IHBlX3RkYXRhICpwZV9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCB4Y29mZl90ZGF0YSAqeGNvZmZfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfdGRhdGEgKmVjb2ZmX29ial9kYXRhOwotICAgICAgc3RydWN0IGllZWVfZGF0YV9zdHJ1Y3QgKmllZWVfZGF0YTsKLSAgICAgIHN0cnVjdCBpZWVlX2FyX2RhdGFfc3RydWN0ICppZWVlX2FyX2RhdGE7Ci0gICAgICBzdHJ1Y3Qgc3JlY19kYXRhX3N0cnVjdCAqc3JlY19kYXRhOwotICAgICAgc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKmloZXhfZGF0YTsKLSAgICAgIHN0cnVjdCB0ZWtoZXhfZGF0YV9zdHJ1Y3QgKnRla2hleF9kYXRhOwotICAgICAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKmVsZl9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBubG1fb2JqX3RkYXRhICpubG1fb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqYm91dF9kYXRhOwotICAgICAgc3RydWN0IHN1bl9jb3JlX3N0cnVjdCAqc3VuX2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBzY281X2NvcmVfc3RydWN0ICpzY281X2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICp0cmFkX2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBzb21fZGF0YV9zdHJ1Y3QgKnNvbV9kYXRhOwotICAgICAgc3RydWN0IGhwdXhfY29yZV9zdHJ1Y3QgKmhwdXhfY29yZV9kYXRhOwotICAgICAgc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QgKmhwcGFic2RfY29yZV9kYXRhOwotICAgICAgc3RydWN0IHNnaV9jb3JlX3N0cnVjdCAqc2dpX2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBseW54X2NvcmVfc3RydWN0ICpseW54X2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QgKm9zZl9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgY2lzY29fY29yZV9zdHJ1Y3QgKmNpc2NvX2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCB2ZXJzYWRvc19kYXRhX3N0cnVjdCAqdmVyc2Fkb3NfZGF0YTsKLSAgICAgIHN0cnVjdCBuZXRic2RfY29yZV9zdHJ1Y3QgKm5ldGJzZF9jb3JlX2RhdGE7Ci0gICAgICBQVFIgYW55OwotICAgICAgfSB0ZGF0YTsKLSAgCi0gICAgIC8qIFVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIGhvbGQgcHJpdmF0ZSBkYXRhKi8KLSAgICBQVFIgdXNyZGF0YTsKLQotICAgLyogV2hlcmUgYWxsIHRoZSBhbGxvY2F0ZWQgc3R1ZmYgdW5kZXIgdGhpcyBCRkQgZ29lcy4gIFRoaXMgaXMgYQotICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKiwgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2YKLSAgICAgb2JqYWxsb2MuaC4gICovCi0gICAgUFRSIG1lbW9yeTsKLX07Ci0KLXR5cGVkZWYgZW51bSBiZmRfZXJyb3IKLXsKLSAgYmZkX2Vycm9yX25vX2Vycm9yID0gMCwKLSAgYmZkX2Vycm9yX3N5c3RlbV9jYWxsLAotICBiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQsCi0gIGJmZF9lcnJvcl93cm9uZ19mb3JtYXQsCi0gIGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbiwKLSAgYmZkX2Vycm9yX25vX21lbW9yeSwKLSAgYmZkX2Vycm9yX25vX3N5bWJvbHMsCi0gIGJmZF9lcnJvcl9ub19hcm1hcCwKLSAgYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMsCi0gIGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSwKLSAgYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQsCi0gIGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQsCi0gIGJmZF9lcnJvcl9ub19jb250ZW50cywKLSAgYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiwKLSAgYmZkX2Vycm9yX25vX2RlYnVnX3NlY3Rpb24sCi0gIGJmZF9lcnJvcl9iYWRfdmFsdWUsCi0gIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCwKLSAgYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZywKLSAgYmZkX2Vycm9yX2ludmFsaWRfZXJyb3JfY29kZQotfSBiZmRfZXJyb3JfdHlwZTsKLQotYmZkX2Vycm9yX3R5cGUgCi1iZmRfZ2V0X2Vycm9yICBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQgCi1iZmRfc2V0X2Vycm9yICBQQVJBTVMgKChiZmRfZXJyb3JfdHlwZSBlcnJvcl90YWcpKTsKLQotQ09OU1QgY2hhciAqCi1iZmRfZXJybXNnICBQQVJBTVMgKChiZmRfZXJyb3JfdHlwZSBlcnJvcl90YWcpKTsKLQotdm9pZCAKLWJmZF9wZXJyb3IgIFBBUkFNUyAoKENPTlNUIGNoYXIgKm1lc3NhZ2UpKTsKLQotdHlwZWRlZiB2b2lkICgqYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSkgUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLQotYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSAKLWJmZF9zZXRfZXJyb3JfaGFuZGxlciAgUEFSQU1TICgoYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSkpOwotCi12b2lkIAotYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi1iZmRfZXJyb3JfaGFuZGxlcl90eXBlIAotYmZkX2dldF9lcnJvcl9oYW5kbGVyICBQQVJBTVMgKCh2b2lkKSk7Ci0KLWxvbmcgCi1iZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3QpKTsKLQotbG9uZyAKLWJmZF9jYW5vbmljYWxpemVfcmVsb2MKLSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgYXNlY3Rpb24gKnNlYywKLSAgICBhcmVsZW50ICoqbG9jLAotICAgIGFzeW1ib2wgKipzeW1zKSk7Ci0KLXZvaWQgCi1iZmRfc2V0X3JlbG9jCi0gUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBhcmVsZW50ICoqcmVsLCB1bnNpZ25lZCBpbnQgY291bnQpCi0gICAgCi0gICAgKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfZmlsZV9mbGFncyBQQVJBTVMgKChiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKSk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X3N0YXJ0X2FkZHJlc3MgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfdm1hIHZtYSkpOwotCi1sb25nIAotYmZkX2dldF9tdGltZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotbG9uZyAKLWJmZF9nZXRfc2l6ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotaW50IAotYmZkX2dldF9ncF9zaXplIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi12b2lkIAotYmZkX3NldF9ncF9zaXplIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IGkpKTsKLQotYmZkX3ZtYSAKLWJmZF9zY2FuX3ZtYSBQQVJBTVMgKChDT05TVCBjaGFyICpzdHJpbmcsIENPTlNUIGNoYXIgKiplbmQsIGludCBiYXNlKSk7Ci0KLWJvb2xlYW4gCi1iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqaWJmZCwgYmZkICpvYmZkKSk7Ci0KLSNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YShpYmZkLCBvYmZkKSBcCi0gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSwgXAotICAgICAgICAgICAgICAgKGliZmQsIG9iZmQpKQotYm9vbGVhbiAKLWJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqaWJmZCwgYmZkICpvYmZkKSk7Ci0KLSNkZWZpbmUgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoaWJmZCwgb2JmZCkgXAotICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLCBcCi0gICAgICAgICAgICAgICAoaWJmZCwgb2JmZCkpCi1ib29sZWFuIAotYmZkX3NldF9wcml2YXRlX2ZsYWdzIFBBUkFNUyAoKGJmZCAqYWJmZCwgZmxhZ3dvcmQgZmxhZ3MpKTsKLQotI2RlZmluZSBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MoYWJmZCwgZmxhZ3MpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MsIFwKLSAgICAgICAgICAgICAgIChhYmZkLCBmbGFncykpCi0jZGVmaW5lIGJmZF9zaXplb2ZfaGVhZGVycyhhYmZkLCByZWxvYykgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9zaXplb2ZfaGVhZGVycywgKGFiZmQsIHJlbG9jKSkKLQotI2RlZmluZSBiZmRfZmluZF9uZWFyZXN0X2xpbmUoYWJmZCwgc2VjLCBzeW1zLCBvZmYsIGZpbGUsIGZ1bmMsIGxpbmUpIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZmluZF9uZWFyZXN0X2xpbmUsICAoYWJmZCwgc2VjLCBzeW1zLCBvZmYsIGZpbGUsIGZ1bmMsIGxpbmUpKQotCi0gICAgICAgIC8qIERvIHRoZXNlIHRocmVlIGRvIGFueXRoaW5nIHVzZWZ1bCBhdCBhbGwsIGZvciBhbnkgYmFjayBlbmQ/ICAqLwotI2RlZmluZSBiZmRfZGVidWdfaW5mb19zdGFydChhYmZkKSBcCi0gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fc3RhcnQsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfZGVidWdfaW5mb19lbmQoYWJmZCkgXAotICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX2VuZCwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUoYWJmZCwgc2VjdGlvbikgXAotICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUsIChhYmZkLCBzZWN0aW9uKSkKLQotCi0jZGVmaW5lIGJmZF9zdGF0X2FyY2hfZWx0KGFiZmQsIHN0YXQpIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc3RhdF9hcmNoX2VsdCwoYWJmZCwgc3RhdCkpCi0KLSNkZWZpbmUgYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAoYWJmZCkgXAotICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX3NldF9hcmNoX21hY2goYWJmZCwgYXJjaCwgbWFjaClcCi0gICAgICAgIEJGRF9TRU5EICggYWJmZCwgX2JmZF9zZXRfYXJjaF9tYWNoLCAoYWJmZCwgYXJjaCwgbWFjaCkpCi0KLSNkZWZpbmUgYmZkX3JlbGF4X3NlY3Rpb24oYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3JlbGF4X3NlY3Rpb24sIChhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKSkKLQotI2RlZmluZSBiZmRfZ2Nfc2VjdGlvbnMoYWJmZCwgbGlua19pbmZvKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2Nfc2VjdGlvbnMsIChhYmZkLCBsaW5rX2luZm8pKQotCi0jZGVmaW5lIGJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKGFiZmQpIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX2xpbmtfYWRkX3N5bWJvbHMoYWJmZCwgaW5mbykgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2xpbmtfYWRkX3N5bWJvbHMsIChhYmZkLCBpbmZvKSkKLQotI2RlZmluZSBiZmRfZmluYWxfbGluayhhYmZkLCBpbmZvKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZmluYWxfbGluaywgKGFiZmQsIGluZm8pKQotCi0jZGVmaW5lIGJmZF9mcmVlX2NhY2hlZF9pbmZvKGFiZmQpIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9mcmVlX2NhY2hlZF9pbmZvLCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZChhYmZkKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEoYWJmZCwgZmlsZSlcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSwgKGFiZmQsIGZpbGUpKQotCi0jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIoYWJmZCwgYXN5bWJvbHMpIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIsIChhYmZkLCBhc3ltYm9scykpCi0KLSNkZWZpbmUgYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKGFiZmQpIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyhhYmZkLCBhcmVscywgYXN5bXMpIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYywgKGFiZmQsIGFyZWxzLCBhc3ltcykpCi0KLWV4dGVybiBiZmRfYnl0ZSAqYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYmZkX2J5dGUgKiwKLSAgICAgICAgICAgICAgICAgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotCi1zeW1pbmRleCAKLWJmZF9nZXRfbmV4dF9tYXBlbnQgUEFSQU1TICgoYmZkICphYmZkLCBzeW1pbmRleCBwcmV2aW91cywgY2Fyc3ltICoqc3ltKSk7Ci0KLWJvb2xlYW4gCi1iZmRfc2V0X2FyY2hpdmVfaGVhZCBQQVJBTVMgKChiZmQgKm91dHB1dCwgYmZkICpuZXdfaGVhZCkpOwotCi1iZmQgKgotYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKmFyY2hpdmUsIGJmZCAqcHJldmlvdXMpKTsKLQotQ09OU1QgY2hhciAqCi1iZmRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotaW50IAotYmZkX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbiAKLWNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsIGJmZCAqZXhlY19iZmQpKTsKLQotI2RlZmluZSBCRkRfU0VORChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLSAgICAgICAgICAgICAgICgoKigoYmZkKS0+eHZlYy0+bWVzc2FnZSkpIGFyZ2xpc3QpCi0KLSNpZmRlZiBERUJVR19CRkRfU0VORAotI3VuZGVmIEJGRF9TRU5ECi0jZGVmaW5lIEJGRF9TRU5EKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotICAoKChiZmQpICYmIChiZmQpLT54dmVjICYmIChiZmQpLT54dmVjLT5tZXNzYWdlKSA/IFwKLSAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KSA6IFwKLSAgICAoYmZkX2Fzc2VydCAoX19GSUxFX18sX19MSU5FX18pLCBOVUxMKSkKLSNlbmRpZgotI2RlZmluZSBCRkRfU0VORF9GTVQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0gICAgICAgICAgICAoKChiZmQpLT54dmVjLT5tZXNzYWdlWyhpbnQpKChiZmQpLT5mb3JtYXQpXSkgYXJnbGlzdCkKLQotI2lmZGVmIERFQlVHX0JGRF9TRU5ECi0jdW5kZWYgQkZEX1NFTkRfRk1UCi0jZGVmaW5lIEJGRF9TRU5EX0ZNVChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLSAgKCgoYmZkKSAmJiAoYmZkKS0+eHZlYyAmJiAoYmZkKS0+eHZlYy0+bWVzc2FnZSkgPyBcCi0gICAoKChiZmQpLT54dmVjLT5tZXNzYWdlWyhpbnQpKChiZmQpLT5mb3JtYXQpXSkgYXJnbGlzdCkgOiBcCi0gICAoYmZkX2Fzc2VydCAoX19GSUxFX18sX19MSU5FX18pLCBOVUxMKSkKLSNlbmRpZgotZW51bSBiZmRfZmxhdm91ciB7Ci0gIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfb2FzeXNfZmxhdm91ciwKLSAgYmZkX3RhcmdldF90ZWtoZXhfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9zcmVjX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X29zOWtfZmxhdm91ciwKLSAgYmZkX3RhcmdldF92ZXJzYWRvc19mbGF2b3VyLAotICBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfb3ZheF9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgotfTsKLQotZW51bSBiZmRfZW5kaWFuIHsgQkZEX0VORElBTl9CSUcsIEJGRF9FTkRJQU5fTElUVExFLCBCRkRfRU5ESUFOX1VOS05PV04gfTsKLQotIC8qIEZvcndhcmQgZGVjbGFyYXRpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyBfYmZkX2xpbmtfaW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QgYmZkX3RhcmdldAotewotICBjaGFyICpuYW1lOwotICBlbnVtIGJmZF9mbGF2b3VyIGZsYXZvdXI7Ci0gIGVudW0gYmZkX2VuZGlhbiBieXRlb3JkZXI7Ci0gIGVudW0gYmZkX2VuZGlhbiBoZWFkZXJfYnl0ZW9yZGVyOwotICBmbGFnd29yZCBvYmplY3RfZmxhZ3M7ICAgICAgIAotICBmbGFnd29yZCBzZWN0aW9uX2ZsYWdzOwotICBjaGFyIHN5bWJvbF9sZWFkaW5nX2NoYXI7Ci0gIGNoYXIgYXJfcGFkX2NoYXI7ICAgICAgICAgICAgCi0gIHVuc2lnbmVkIHNob3J0IGFyX21heF9uYW1lbGVuOwotICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4NjQpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHgzMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDMyKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4MTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX3B1dHgxNikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4NjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF82NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4NjQpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfMzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDMyKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHgxNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHgxNikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqKCpfYmZkX2NoZWNrX2Zvcm1hdFtiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotICBib29sZWFuICAgICAgICAgICAgICgqX2JmZF9zZXRfZm9ybWF0W2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGJvb2xlYW4gICAgICAgICAgICAgKCpfYmZkX3dyaXRlX2NvbnRlbnRzW2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSAgIC8qIEdlbmVyaWMgZW50cnkgcG9pbnRzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyhOQU1FKVwKLUNBVChOQU1FLF9jbG9zZV9hbmRfY2xlYW51cCksXAotQ0FUKE5BTUUsX2JmZF9mcmVlX2NhY2hlZF9pbmZvKSxcCi1DQVQoTkFNRSxfbmV3X3NlY3Rpb25faG9vayksXAotQ0FUKE5BTUUsX2dldF9zZWN0aW9uX2NvbnRlbnRzKSxcCi1DQVQoTkFNRSxfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KQotCi0gICAvKiBDYWxsZWQgd2hlbiB0aGUgQkZEIGlzIGJlaW5nIGNsb3NlZCB0byBkbyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuICAqLwotICBib29sZWFuICAgICAgICgqX2Nsb3NlX2FuZF9jbGVhbnVwKSBQQVJBTVMgKChiZmQgKikpOwotICAgLyogQXNrIHRoZSBCRkQgdG8gZnJlZSBhbGwgY2FjaGVkIGluZm9ybWF0aW9uLiAgKi8KLSAgYm9vbGVhbiAoKl9iZmRfZnJlZV9jYWNoZWRfaW5mbykgUEFSQU1TICgoYmZkICopKTsKLSAgIC8qIENhbGxlZCB3aGVuIGEgbmV3IHNlY3Rpb24gaXMgY3JlYXRlZC4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfbmV3X3NlY3Rpb25faG9vaykgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLSAgIC8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KQotICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgYmZkX3dpbmRvdyAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0gICAvKiBFbnRyeSBwb2ludHMgdG8gY29weSBwcml2YXRlIGRhdGEuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9DT1BZKE5BTUUpXAotQ0FUKE5BTUUsX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpLFwKLUNBVChOQU1FLF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSksXAotQ0FUKE5BTUUsX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKSxcCi1DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSksXAotQ0FUKE5BTUUsX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyksXAotQ0FUKE5BTUUsX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKVwKLSAgIC8qIENhbGxlZCB0byBjb3B5IEJGRCBnZW5lcmFsIHByaXZhdGUgZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgICB0byBhbm90aGVyLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLSAgIC8qIENhbGxlZCB0byBtZXJnZSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLSAgICAgdG8gYSBjb21tb24gb3V0cHV0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0gICAvKiBDYWxsZWQgdG8gY29weSBCRkQgcHJpdmF0ZSBzZWN0aW9uIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLSAgICAgdG8gYW5vdGhlci4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqLCBzZWNfcHRyKSk7Ci0gICAvKiBDYWxsZWQgdG8gY29weSBCRkQgcHJpdmF0ZSBzeW1ib2wgZGF0YSBmcm9tIG9uZSBzeW1ib2wgCi0gICAgIHRvIGFub3RoZXIuICAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkICosIGFzeW1ib2wgKikpOwotICAgLyogQ2FsbGVkIHRvIHNldCBwcml2YXRlIGJhY2tlbmQgZmxhZ3MgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotCi0gICAvKiBDYWxsZWQgdG8gcHJpbnQgcHJpdmF0ZSBCRkQgZGF0YSAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLSAgIC8qIENvcmUgZmlsZSBlbnRyeSBwb2ludHMuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9DT1JFKE5BTUUpXAotQ0FUKE5BTUUsX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpLFwKLUNBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpLFwKLUNBVChOQU1FLF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0gIGNoYXIgKiAgICgqX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGludCAgICAgICgqX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkgUEFSQU1TICgoYmZkICopKTsKLSAgYm9vbGVhbiAgKCpfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotICAgLyogQXJjaGl2ZSBlbnRyeSBwb2ludHMuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFKE5BTUUpXAotQ0FUKE5BTUUsX3NsdXJwX2FybWFwKSxcCi1DQVQoTkFNRSxfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSksXAotQ0FUKE5BTUUsX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi1DQVQoTkFNRSxfdHJ1bmNhdGVfYXJuYW1lKSxcCi1DQVQoTkFNRSxfd3JpdGVfYXJtYXApLFwKLUNBVChOQU1FLF9yZWFkX2FyX2hkciksXAotQ0FUKE5BTUUsX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSksXAotQ0FUKE5BTUUsX2dldF9lbHRfYXRfaW5kZXgpLFwKLUNBVChOQU1FLF9nZW5lcmljX3N0YXRfYXJjaF9lbHQpLFwKLUNBVChOQU1FLF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKQotICBib29sZWFuICAoKl9iZmRfc2x1cnBfYXJtYXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSBQQVJBTVMgKChiZmQgKikpOwotICBib29sZWFuICAoKl9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpCi0gICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotICB2b2lkICAgICAoKl9iZmRfdHJ1bmNhdGVfYXJuYW1lKSBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBjaGFyICopKTsKLSAgYm9vbGVhbiAgKCp3cml0ZV9hcm1hcCkgUEFSQU1TICgoYmZkICphcmNoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9ybCAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWR4KSk7Ci0gIFBUUiAoKl9iZmRfcmVhZF9hcl9oZHJfZm4pIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGJmZCAqICAgICgqb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKSBQQVJBTVMgKChiZmQgKmFyY2gsIGJmZCAqcHJldikpOwotI2RlZmluZSBiZmRfZ2V0X2VsdF9hdF9pbmRleChiLGkpIEJGRF9TRU5EKGIsIF9iZmRfZ2V0X2VsdF9hdF9pbmRleCwgKGIsaSkpCi0gIGJmZCAqICAgICgqX2JmZF9nZXRfZWx0X2F0X2luZGV4KSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLSAgaW50ICAgICAgKCpfYmZkX3N0YXRfYXJjaF9lbHQpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0gIGJvb2xlYW4gICgqX2JmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKSBQQVJBTVMgKChiZmQgKikpOwotCi0gICAvKiBFbnRyeSBwb2ludHMgdXNlZCBmb3Igc3ltYm9scy4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMoTkFNRSlcCi1DQVQoTkFNRSxfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCksXAotQ0FUKE5BTUUsX2dldF9zeW10YWIpLFwKLUNBVChOQU1FLF9tYWtlX2VtcHR5X3N5bWJvbCksXAotQ0FUKE5BTUUsX3ByaW50X3N5bWJvbCksXAotQ0FUKE5BTUUsX2dldF9zeW1ib2xfaW5mbyksXAotQ0FUKE5BTUUsX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKSxcCi1DQVQoTkFNRSxfZ2V0X2xpbmVubyksXAotQ0FUKE5BTUUsX2ZpbmRfbmVhcmVzdF9saW5lKSxcCi1DQVQoTkFNRSxfYmZkX21ha2VfZGVidWdfc3ltYm9sKSxcCi1DQVQoTkFNRSxfcmVhZF9taW5pc3ltYm9scyksXAotQ0FUKE5BTUUsX21pbmlzeW1ib2xfdG9fc3ltYm9sKQotICBsb25nICAoKl9iZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICopKTsKLSAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIpIFBBUkFNUyAoKGJmZCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICAqCi0gICAgICAgICAgICAgICAgKCpfYmZkX21ha2VfZW1wdHlfc3ltYm9sKSBQQVJBTVMgKChiZmQgKikpOwotICB2b2lkICAgICAgICAgICgqX2JmZF9wcmludF9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci0jZGVmaW5lIGJmZF9wcmludF9zeW1ib2woYixwLHMsZSkgQkZEX1NFTkQoYiwgX2JmZF9wcmludF9zeW1ib2wsIChiLHAscyxlKSkKLSAgdm9pZCAgICAgICAgICAoKl9iZmRfZ2V0X3N5bWJvbF9pbmZvKSBQQVJBTVMgKChiZmQgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfaW5mbyAqKSk7Ci0jZGVmaW5lIGJmZF9nZXRfc3ltYm9sX2luZm8oYixwLGUpIEJGRF9TRU5EKGIsIF9iZmRfZ2V0X3N5bWJvbF9pbmZvLCAoYixwLGUpKQotICBib29sZWFuICAgICAgICgqX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLSAgYWxlbnQgKiAgICAoKl9nZXRfbGluZW5vKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKSk7Ci0gIGJvb2xlYW4gICAgKCpfYmZkX2ZpbmRfbmVhcmVzdF9saW5lKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZWMgKnNlY3Rpb24sIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1ib2xzLAotICAgICAgICAgICAgICAgICAgICBiZmRfdm1hIG9mZnNldCwgQ09OU1QgY2hhciAqKmZpbGUsIENPTlNUIGNoYXIgKipmdW5jLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmUpKTsKLSAgLyogQmFjay1kb29yIHRvIGFsbG93IGZvcm1hdC1hd2FyZSBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGRlYnVnIHN5bWJvbHMKLSAgICB3aGlsZSB1c2luZyBCRkQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4gIEN1cnJlbnRseSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIKLSAgICB3aGVuIGNyZWF0aW5nIENPRkYgZmlsZXMuICAqLwotICBhc3ltYm9sICogICgqX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCkgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkLAotICAgICAgIHZvaWQgKnB0ciwKLSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpKTsKLSNkZWZpbmUgYmZkX3JlYWRfbWluaXN5bWJvbHMoYiwgZCwgbSwgcykgXAotICBCRkRfU0VORCAoYiwgX3JlYWRfbWluaXN5bWJvbHMsIChiLCBkLCBtLCBzKSkKLSAgbG9uZyAgKCpfcmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKikpOwotI2RlZmluZSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2woYiwgZCwgbSwgZikgXAotICBCRkRfU0VORCAoYiwgX21pbmlzeW1ib2xfdG9fc3ltYm9sLCAoYiwgZCwgbSwgZikpCi0gIGFzeW1ib2wgKigqX21pbmlzeW1ib2xfdG9fc3ltYm9sKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY29uc3QgUFRSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bWJvbCAqKSk7Ci0KLSAgIC8qIFJvdXRpbmVzIGZvciByZWxvY3MuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MoTkFNRSlcCi1DQVQoTkFNRSxfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSxcCi1DQVQoTkFNRSxfY2Fub25pY2FsaXplX3JlbG9jKSxcCi1DQVQoTkFNRSxfYmZkX3JlbG9jX3R5cGVfbG9va3VwKQotICBsb25nICAoKl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci0gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfcmVsb2MpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBhcmVsZW50ICoqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0gICAvKiBTZWUgZG9jdW1lbnRhdGlvbiBvbiByZWxvYyB0eXBlcy4gICovCi0gIHJlbG9jX2hvd3RvX3R5cGUgKgotICAgICAgICgqcmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi0gICAvKiBSb3V0aW5lcyB1c2VkIHdoZW4gd3JpdGluZyBhbiBvYmplY3QgZmlsZS4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1dSSVRFKE5BTUUpXAotQ0FUKE5BTUUsX3NldF9hcmNoX21hY2gpLFwKLUNBVChOQU1FLF9zZXRfc2VjdGlvbl9jb250ZW50cykKLSAgYm9vbGVhbiAgICAoKl9iZmRfc2V0X2FyY2hfbWFjaCkgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZykpOwotICBib29sZWFuICAgICAgICgqX2JmZF9zZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotICAgLyogUm91dGluZXMgdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfTElOSyhOQU1FKVwKLUNBVChOQU1FLF9zaXplb2ZfaGVhZGVycyksXAotQ0FUKE5BTUUsX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpLFwKLUNBVChOQU1FLF9iZmRfcmVsYXhfc2VjdGlvbiksXAotQ0FUKE5BTUUsX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKSxcCi1DQVQoTkFNRSxfYmZkX2xpbmtfYWRkX3N5bWJvbHMpLFwKLUNBVChOQU1FLF9iZmRfZmluYWxfbGluayksXAotQ0FUKE5BTUUsX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pLFwKLUNBVChOQU1FLF9iZmRfZ2Nfc2VjdGlvbnMpCi0gIGludCAgICAgICAgKCpfYmZkX3NpemVvZl9oZWFkZXJzKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotICBiZmRfYnl0ZSAqICgqX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLSAgICAgICAgICAgICAgICAgICAgYmZkX2J5dGUgKmRhdGEsIGJvb2xlYW4gcmVsb2NhdGVhYmxlLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0KLSAgYm9vbGVhbiAgICAoKl9iZmRfcmVsYXhfc2VjdGlvbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKiwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqYWdhaW4pKTsKLQotICAgLyogQ3JlYXRlIGEgaGFzaCB0YWJsZSBmb3IgdGhlIGxpbmtlci4gIERpZmZlcmVudCBiYWNrZW5kcyBzdG9yZQotICAgICBkaWZmZXJlbnQgaW5mb3JtYXRpb24gaW4gdGhpcyB0YWJsZS4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKLQotICAgLyogQWRkIHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCBmaWxlIGludG8gdGhlIGhhc2ggdGFibGUuICAqLwotICBib29sZWFuICgqX2JmZF9saW5rX2FkZF9zeW1ib2xzKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gICAvKiBEbyBhIGxpbmsgYmFzZWQgb24gdGhlIGxpbmtfb3JkZXIgc3RydWN0dXJlcyBhdHRhY2hlZCB0byBlYWNoCi0gICAgIHNlY3Rpb24gb2YgdGhlIEJGRC4gICovCi0gIGJvb2xlYW4gKCpfYmZkX2ZpbmFsX2xpbmspIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSAgIC8qIFNob3VsZCB0aGlzIHNlY3Rpb24gYmUgc3BsaXQgdXAgaW50byBzbWFsbGVyIHBpZWNlcyBkdXJpbmcgbGlua2luZy4gICovCi0gIGJvb2xlYW4gKCpfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpOwotCi0gICAvKiBSZW1vdmUgc2VjdGlvbnMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZWQgZnJvbSB0aGUgb3V0cHV0LiAgKi8KLSAgYm9vbGVhbiAoKl9iZmRfZ2Nfc2VjdGlvbnMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSAgIC8qIFJvdXRpbmVzIHRvIGhhbmRsZSBkeW5hbWljIHN5bWJvbHMgYW5kIHJlbG9jcy4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMoTkFNRSlcCi1DQVQoTkFNRSxfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi1DQVQoTkFNRSxfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKSxcCi1DQVQoTkFNRSxfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpLFwKLUNBVChOQU1FLF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYykKLSAgIC8qIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbHMuICovCi0gIGxvbmcgICgqX2JmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gICAvKiBSZWFkIGluIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKQotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0gICAvKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotICBsb25nICAoKl9iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gICAvKiBSZWFkIGluIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYykKLSAgICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotCi0gIC8qIE9wcG9zaXRlIGVuZGlhbiB2ZXJzaW9uIG9mIHRoaXMgdGFyZ2V0LiAgKi8gIAotIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICogYWx0ZXJuYXRpdmVfdGFyZ2V0OwotIAotIFBUUiBiYWNrZW5kX2RhdGE7Ci0gCi19IGJmZF90YXJnZXQ7Ci1ib29sZWFuIAotYmZkX3NldF9kZWZhdWx0X3RhcmdldCAgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWJmZF9maW5kX3RhcmdldCBQQVJBTVMgKChDT05TVCBjaGFyICp0YXJnZXRfbmFtZSwgYmZkICphYmZkKSk7Ci0KLWNvbnN0IGNoYXIgKioKLWJmZF90YXJnZXRfbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWNvbnN0IGJmZF90YXJnZXQgKiAKLWJmZF9zZWFyY2hfZm9yX3RhcmdldCAgUEFSQU1TICgoaW50ICgqIHNlYXJjaF9mdW5jKShjb25zdCBiZmRfdGFyZ2V0ICosIHZvaWQgKiksIHZvaWQgKikpOwotCi1ib29sZWFuIAotYmZkX2NoZWNrX2Zvcm1hdCBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0KSk7Ci0KLWJvb2xlYW4gCi1iZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCwgY2hhciAqKiptYXRjaGluZykpOwotCi1ib29sZWFuIAotYmZkX3NldF9mb3JtYXQgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCkpOwotCi1DT05TVCBjaGFyICoKLWJmZF9mb3JtYXRfc3RyaW5nIFBBUkFNUyAoKGJmZF9mb3JtYXQgZm9ybWF0KSk7Ci0KLQotLyogUmV0dXJuIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYQotICAgY29weSBvZiBBQkZEJ3MgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcy4gIFJldHVybiAtMSBpZiBhbiBlcnJvcgotICAgb2NjdXJzOyBiZmRfZ2V0X2Vycm9yIHdpbGwgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGNvZGUuICAqLwotZXh0ZXJuIGxvbmcgYmZkX2dldF9lbGZfcGhkcl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogQ29weSBBQkZEJ3MgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcyB0byAqUEhEUlMuICBUaGUgZW50cmllcwotICAgd2lsbCBiZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2YgRWxmX0ludGVybmFsX1BoZHIgc3RydWN0dXJlcywgYXMKLSAgIGRlZmluZWQgaW4gaW5jbHVkZS9lbGYvaW50ZXJuYWwuaC4gIFRvIGZpbmQgb3V0IGhvdyBsYXJnZSB0aGUKLSAgIGJ1ZmZlciBuZWVkcyB0byBiZSwgY2FsbCBiZmRfZ2V0X2VsZl9waGRyX3VwcGVyX2JvdW5kLgotCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzIHJlYWQsIG9yIC0xIGlmIGFuCi0gICBlcnJvciBvY2N1cnM7IGJmZF9nZXRfZXJyb3Igd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgY29kZS4gICovCi1leHRlcm4gaW50IGJmZF9nZXRfZWxmX3BoZHJzIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm9pZCAqcGhkcnMpKTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvYmZkLmMgYi9iZmQvYmZkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDE3MmYuLjAwMDAwMDAKLS0tIGEvYmZkL2JmZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4MyArMCwwIEBACi0vKiBHZW5lcmljIEJGRCBsaWJyYXJ5IGludGVyZmFjZSBhbmQgc3VwcG9ydCByb3V0aW5lcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQk8PHR5cGVkZWYgYmZkPj4KLQotCUEgQkZEIGhhcyB0eXBlIDw8YmZkPj47IG9iamVjdHMgb2YgdGhpcyB0eXBlIGFyZSB0aGUKLQljb3JuZXJzdG9uZSBvZiBhbnkgYXBwbGljYXRpb24gdXNpbmcgQkZELiBVc2luZyBCRkQKLQljb25zaXN0cyBvZiBtYWtpbmcgcmVmZXJlbmNlcyB0aG91Z2ggdGhlIEJGRCBhbmQgdG8gZGF0YSBpbiB0aGUgQkZELgotCi0JSGVyZSBpcyB0aGUgc3RydWN0dXJlIHRoYXQgZGVmaW5lcyB0aGUgdHlwZSA8PGJmZD4+LiAgSXQKLQljb250YWlucyB0aGUgbWFqb3IgZGF0YSBhYm91dCB0aGUgZmlsZSBhbmQgcG9pbnRlcnMKLQl0byB0aGUgcmVzdCBvZiB0aGUgZGF0YS4KLQotQ09ERV9GUkFHTUVOVAotLgotLnN0cnVjdCBfYmZkIAotLnsKLS4gICAgeyogVGhlIGZpbGVuYW1lIHRoZSBhcHBsaWNhdGlvbiBvcGVuZWQgdGhlIEJGRCB3aXRoLiAgKn0KLS4gICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgICAgIAotLgotLiAgICB7KiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBqdW1wIHRhYmxlLiAgICAgICAgICAgICAqfQotLiAgICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqeHZlYzsKLS4KLS4gICAgeyogVG8gYXZvaWQgZHJhZ2dpbmcgdG9vIG1hbnkgaGVhZGVyIGZpbGVzIGludG8gZXZlcnkgZmlsZSB0aGF0Ci0uICAgICAgIGluY2x1ZGVzIGA8PGJmZC5oPj4nLCBJT1NUUkVBTSBoYXMgYmVlbiBkZWNsYXJlZCBhcyBhICJjaGFyCi0uICAgICAgICoiLCBhbmQgTVRJTUUgYXMgYSAibG9uZyIuICBUaGVpciBjb3JyZWN0IHR5cGVzLCB0byB3aGljaCB0aGV5Ci0uICAgICAgIGFyZSBjYXN0IHdoZW4gdXNlZCwgYXJlICJGSUxFICoiIGFuZCAidGltZV90Ii4gICAgVGhlIGlvc3RyZWFtCi0uICAgICAgIGlzIHRoZSByZXN1bHQgb2YgYW4gZm9wZW4gb24gdGhlIGZpbGVuYW1lLiAgSG93ZXZlciwgaWYgdGhlCi0uICAgICAgIEJGRF9JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoZW4gaW9zdHJlYW0gaXMgYWN0dWFsbHkgYSBwb2ludGVyCi0uICAgICAgIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqfQotLiAgICBQVFIgaW9zdHJlYW07Ci0uCi0uICAgIHsqIElzIHRoZSBmaWxlIGRlc2NyaXB0b3IgYmVpbmcgY2FjaGVkPyAgVGhhdCBpcywgY2FuIGl0IGJlIGNsb3NlZCBhcwotLiAgICAgICBuZWVkZWQsIGFuZCByZS1vcGVuZWQgd2hlbiBhY2Nlc3NlZCBsYXRlcj8gICp9Ci0uCi0uICAgIGJvb2xlYW4gY2FjaGVhYmxlOwotLgotLiAgICB7KiBNYXJrcyB3aGV0aGVyIHRoZXJlIHdhcyBhIGRlZmF1bHQgdGFyZ2V0IHNwZWNpZmllZCB3aGVuIHRoZQotLiAgICAgICBCRkQgd2FzIG9wZW5lZC4gVGhpcyBpcyB1c2VkIHRvIHNlbGVjdCB3aGljaCBtYXRjaGluZyBhbGdvcml0aG0KLS4gICAgICAgdG8gdXNlIHRvIGNob29zZSB0aGUgYmFjayBlbmQuICp9Ci0uCi0uICAgIGJvb2xlYW4gdGFyZ2V0X2RlZmF1bHRlZDsKLS4KLS4gICAgeyogVGhlIGNhY2hpbmcgcm91dGluZXMgdXNlIHRoZXNlIHRvIG1haW50YWluIGEKLS4gICAgICAgbGVhc3QtcmVjZW50bHktdXNlZCBsaXN0IG9mIEJGRHMgKn0KLS4KLS4gICAgc3RydWN0IF9iZmQgKmxydV9wcmV2LCAqbHJ1X25leHQ7Ci0uCi0uICAgIHsqIFdoZW4gYSBmaWxlIGlzIGNsb3NlZCBieSB0aGUgY2FjaGluZyByb3V0aW5lcywgQkZEIHJldGFpbnMKLS4gICAgICAgc3RhdGUgaW5mb3JtYXRpb24gb24gdGhlIGZpbGUgaGVyZTogKn0KLS4KLS4gICAgZmlsZV9wdHIgd2hlcmU7ICAgICAgICAgICAgICAKLS4KLS4gICAgeyogYW5kIGhlcmU6IChgYG9uY2UnJyBtZWFucyBhdCBsZWFzdCBvbmNlKSAqfQotLgotLiAgICBib29sZWFuIG9wZW5lZF9vbmNlOwotLgotLiAgICB7KiBTZXQgaWYgd2UgaGF2ZSBhIGxvY2FsbHkgbWFpbnRhaW5lZCBtdGltZSB2YWx1ZSwgcmF0aGVyIHRoYW4KLS4gICAgICAgZ2V0dGluZyBpdCBmcm9tIHRoZSBmaWxlIGVhY2ggdGltZTogKn0KLS4KLS4gICAgYm9vbGVhbiBtdGltZV9zZXQ7Ci0uCi0uICAgIHsqIEZpbGUgbW9kaWZpZWQgdGltZSwgaWYgbXRpbWVfc2V0IGlzIHRydWU6ICp9Ci0uCi0uICAgIGxvbmcgbXRpbWU7ICAgICAgICAgIAotLgotLiAgICB7KiBSZXNlcnZlZCBmb3IgYW4gdW5pbXBsZW1lbnRlZCBmaWxlIGxvY2tpbmcgZXh0ZW5zaW9uLip9Ci0uCi0uICAgIGludCBpZmQ7Ci0uCi0uICAgIHsqIFRoZSBmb3JtYXQgd2hpY2ggYmVsb25ncyB0byB0aGUgQkZELiAob2JqZWN0LCBjb3JlLCBldGMuKSAqfQotLgotLiAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLS4KLS4gICAgeyogVGhlIGRpcmVjdGlvbiB0aGUgQkZEIHdhcyBvcGVuZWQgd2l0aCp9Ci0uCi0uICAgIGVudW0gYmZkX2RpcmVjdGlvbiB7bm9fZGlyZWN0aW9uID0gMCwKLS4gICAgICAgICAgICAgICAgICAgICAgICByZWFkX2RpcmVjdGlvbiA9IDEsCi0uICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZGlyZWN0aW9uID0gMiwKLS4gICAgICAgICAgICAgICAgICAgICAgICBib3RoX2RpcmVjdGlvbiA9IDN9IGRpcmVjdGlvbjsKLS4KLS4gICAgeyogRm9ybWF0X3NwZWNpZmljIGZsYWdzKn0KLS4KLS4gICAgZmxhZ3dvcmQgZmxhZ3M7ICAgICAgICAgICAgICAKLS4KLS4gICAgeyogQ3VycmVudGx5IG15X2FyY2hpdmUgaXMgdGVzdGVkIGJlZm9yZSBhZGRpbmcgb3JpZ2luIHRvCi0uICAgICAgIGFueXRoaW5nLiBJIGJlbGlldmUgdGhhdCB0aGlzIGNhbiBiZWNvbWUgYWx3YXlzIGFuIGFkZCBvZgotLiAgICAgICBvcmlnaW4sIHdpdGggb3JpZ2luIHNldCB0byAwIGZvciBub24gYXJjaGl2ZSBmaWxlcy4gICAqfQotLgotLiAgICBmaWxlX3B0ciBvcmlnaW47ICAgICAgICAgICAgIAotLgotLiAgICB7KiBSZW1lbWJlciB3aGVuIG91dHB1dCBoYXMgYmVndW4sIHRvIHN0b3Agc3RyYW5nZSB0aGluZ3MKLS4gICAgICAgZnJvbSBoYXBwZW5pbmcuICp9Ci0uICAgIGJvb2xlYW4gb3V0cHV0X2hhc19iZWd1bjsKLS4KLS4gICAgeyogUG9pbnRlciB0byBsaW5rZWQgbGlzdCBvZiBzZWN0aW9ucyp9Ci0uICAgIHN0cnVjdCBzZWMgICpzZWN0aW9uczsKLS4KLS4gICAgeyogVGhlIG51bWJlciBvZiBzZWN0aW9ucyAqfQotLiAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudDsKLS4KLS4gICAgeyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIG9iamVjdCBmaWxlczogCi0uICAgICAgIFRoZSBzdGFydCBhZGRyZXNzLiAqfQotLiAgICBiZmRfdm1hIHN0YXJ0X2FkZHJlc3M7Ci0uCi0uICAgIHsqIFVzZWQgZm9yIGlucHV0IGFuZCBvdXRwdXQqfQotLiAgICB1bnNpZ25lZCBpbnQgc3ltY291bnQ7Ci0uCi0uICAgIHsqIFN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IEJGRCAod2l0aCBzeW1jb3VudCBlbnRyaWVzKSAqfQotLiAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICAqKm91dHN5bWJvbHM7ICAgICAgICAgICAgIAotLgotLiAgICB7KiBQb2ludGVyIHRvIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24qfQotLiAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaF9pbmZvOwotLgotLiAgICB7KiBTdHVmZiBvbmx5IHVzZWZ1bCBmb3IgYXJjaGl2ZXM6Kn0KLS4gICAgUFRSIGFyZWx0X2RhdGE7ICAgICAgICAgICAgICAKLS4gICAgc3RydWN0IF9iZmQgKm15X2FyY2hpdmU7ICAgICB7KiBUaGUgY29udGFpbmluZyBhcmNoaXZlIEJGRC4gICp9Ci0uICAgIHN0cnVjdCBfYmZkICpuZXh0OyAgICAgICAgICAgeyogVGhlIG5leHQgQkZEIGluIHRoZSBhcmNoaXZlLiAgKn0KLS4gICAgc3RydWN0IF9iZmQgKmFyY2hpdmVfaGVhZDsgICB7KiBUaGUgZmlyc3QgQkZEIGluIHRoZSBhcmNoaXZlLiAgKn0KLS4gICAgYm9vbGVhbiBoYXNfYXJtYXA7ICAgICAgICAgICAKLS4KLS4gICAgeyogQSBjaGFpbiBvZiBCRkQgc3RydWN0dXJlcyBpbnZvbHZlZCBpbiBhIGxpbmsuICAqfQotLiAgICBzdHJ1Y3QgX2JmZCAqbGlua19uZXh0OwotLgotLiAgICB7KiBBIGZpZWxkIHVzZWQgYnkgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gIFRoaXMgd2lsbAotLiAgICAgICBiZSB1c2VkIG9ubHkgZm9yIGFyY2hpdmUgZWxlbWVudHMuICAqfQotLiAgICBpbnQgYXJjaGl2ZV9wYXNzOwotLgotLiAgICB7KiBVc2VkIGJ5IHRoZSBiYWNrIGVuZCB0byBob2xkIHByaXZhdGUgZGF0YS4gKn0KLS4KLS4gICAgdW5pb24gCi0uICAgICAgewotLiAgICAgIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICphb3V0X2RhdGE7Ci0uICAgICAgc3RydWN0IGFydGRhdGEgKmFvdXRfYXJfZGF0YTsKLS4gICAgICBzdHJ1Y3QgX29hc3lzX2RhdGEgKm9hc3lzX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCBfb2FzeXNfYXJfZGF0YSAqb2FzeXNfYXJfZGF0YTsKLS4gICAgICBzdHJ1Y3QgY29mZl90ZGF0YSAqY29mZl9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgcGVfdGRhdGEgKnBlX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCB4Y29mZl90ZGF0YSAqeGNvZmZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IGVjb2ZmX3RkYXRhICplY29mZl9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgaWVlZV9kYXRhX3N0cnVjdCAqaWVlZV9kYXRhOwotLiAgICAgIHN0cnVjdCBpZWVlX2FyX2RhdGFfc3RydWN0ICppZWVlX2FyX2RhdGE7Ci0uICAgICAgc3RydWN0IHNyZWNfZGF0YV9zdHJ1Y3QgKnNyZWNfZGF0YTsKLS4gICAgICBzdHJ1Y3QgaWhleF9kYXRhX3N0cnVjdCAqaWhleF9kYXRhOwotLiAgICAgIHN0cnVjdCB0ZWtoZXhfZGF0YV9zdHJ1Y3QgKnRla2hleF9kYXRhOwotLiAgICAgIHN0cnVjdCBlbGZfb2JqX3RkYXRhICplbGZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IG5sbV9vYmpfdGRhdGEgKm5sbV9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqYm91dF9kYXRhOwotLiAgICAgIHN0cnVjdCBzdW5fY29yZV9zdHJ1Y3QgKnN1bl9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QgKnNjbzVfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICp0cmFkX2NvcmVfZGF0YTsKLS4gICAgICBzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0ICpzb21fZGF0YTsKLS4gICAgICBzdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAqaHB1eF9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QgKmhwcGFic2RfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgKnNnaV9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgKmx5bnhfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QgKm9zZl9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0ICpjaXNjb19jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IHZlcnNhZG9zX2RhdGFfc3RydWN0ICp2ZXJzYWRvc19kYXRhOwotLiAgICAgIHN0cnVjdCBuZXRic2RfY29yZV9zdHJ1Y3QgKm5ldGJzZF9jb3JlX2RhdGE7Ci0uICAgICAgUFRSIGFueTsKLS4gICAgICB9IHRkYXRhOwotLiAgCi0uICAgIHsqIFVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIGhvbGQgcHJpdmF0ZSBkYXRhKn0KLS4gICAgUFRSIHVzcmRhdGE7Ci0uCi0uICB7KiBXaGVyZSBhbGwgdGhlIGFsbG9jYXRlZCBzdHVmZiB1bmRlciB0aGlzIEJGRCBnb2VzLiAgVGhpcyBpcyBhCi0uICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKiwgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2YKLS4gICAgIG9iamFsbG9jLmguICAqfQotLiAgICBQVFIgbWVtb3J5OwotLn07Ci0uCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0jdW5kZWYgb2JqX3N5bWJvbHMKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotDAotLyogcHJvdmlkZSBzdG9yYWdlIGZvciBzdWJzeXN0ZW0sIHN0YWNrIGFuZCBoZWFwIGRhdGEgd2hpY2ggbWF5IGhhdmUgYmVlbgotICAgcGFzc2VkIGluIG9uIHRoZSBjb21tYW5kIGxpbmUuICBMZCBwdXRzIHRoaXMgZGF0YSBpbnRvIGEgYmZkX2xpbmtfaW5mbwotICAgc3RydWN0IHdoaWNoIHVsdGltYXRlbHkgZ2V0cyBwYXNzZWQgaW4gdG8gdGhlIGJmZC4gIFdoZW4gaXQgYXJyaXZlcywgY29weQotICAgaXQgdG8gdGhlIGZvbGxvd2luZyBzdHJ1Y3Qgc28gdGhhdCB0aGUgZGF0YSB3aWxsIGJlIGF2YWlsYWJsZSBpbiBjb2ZmY29kZS5oCi0gICB3aGVyZSBpdCBpcyBuZWVkZWQuICBUaGUgdHlwZWRlZidzIHVzZWQgYXJlIGRlZmluZWQgaW4gYmZkLmggKi8KLQotCi0MCi0vKgotU0VDVElPTgotCUVycm9yIHJlcG9ydGluZwotCi0JTW9zdCBCRkQgZnVuY3Rpb25zIHJldHVybiBub256ZXJvIG9uIHN1Y2Nlc3MgKGNoZWNrIHRoZWlyCi0JaW5kaXZpZHVhbCBkb2N1bWVudGF0aW9uIGZvciBwcmVjaXNlIHNlbWFudGljcykuICBPbiBhbiBlcnJvciwKLQl0aGV5IGNhbGwgPDxiZmRfc2V0X2Vycm9yPj4gdG8gc2V0IGFuIGVycm9yIGNvbmRpdGlvbiB0aGF0IGNhbGxlcnMKLQljYW4gY2hlY2sgYnkgY2FsbGluZyA8PGJmZF9nZXRfZXJyb3I+Pi4KLSAgICAgICAgSWYgdGhhdCByZXR1cm5zIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4sIHRoZW4gY2hlY2sKLQk8PGVycm5vPj4uCi0KLQlUaGUgZWFzaWVzdCB3YXkgdG8gcmVwb3J0IGEgQkZEIGVycm9yIHRvIHRoZSB1c2VyIGlzIHRvCi0JdXNlIDw8YmZkX3BlcnJvcj4+LgotCi1TVUJTRUNUSU9OCi0JVHlwZSA8PGJmZF9lcnJvcl90eXBlPj4KLQotCVRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgPDxiZmRfZ2V0X2Vycm9yPj4gYXJlIGRlZmluZWQgYnkgdGhlCi0JZW51bWVyYXRlZCB0eXBlIDw8YmZkX2Vycm9yX3R5cGU+Pi4KLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgZW51bSBiZmRfZXJyb3IKLS57Ci0uICBiZmRfZXJyb3Jfbm9fZXJyb3IgPSAwLAotLiAgYmZkX2Vycm9yX3N5c3RlbV9jYWxsLAotLiAgYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0LAotLiAgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCwKLS4gIGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbiwKLS4gIGJmZF9lcnJvcl9ub19tZW1vcnksCi0uICBiZmRfZXJyb3Jfbm9fc3ltYm9scywKLS4gIGJmZF9lcnJvcl9ub19hcm1hcCwKLS4gIGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzLAotLiAgYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlLAotLiAgYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQsCi0uICBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkLAotLiAgYmZkX2Vycm9yX25vX2NvbnRlbnRzLAotLiAgYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiwKLS4gIGJmZF9lcnJvcl9ub19kZWJ1Z19zZWN0aW9uLAotLiAgYmZkX2Vycm9yX2JhZF92YWx1ZSwKLS4gIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCwKLS4gIGJmZF9lcnJvcl9maWxlX3Rvb19iaWcsCi0uICBiZmRfZXJyb3JfaW52YWxpZF9lcnJvcl9jb2RlCi0ufSBiZmRfZXJyb3JfdHlwZTsKLS4KLSovCi0KLXN0YXRpYyBiZmRfZXJyb3JfdHlwZSBiZmRfZXJyb3IgPSBiZmRfZXJyb3Jfbm9fZXJyb3I7Ci0KLUNPTlNUIGNoYXIgKkNPTlNUIGJmZF9lcnJtc2dzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm8gZXJyb3IiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJTeXN0ZW0gY2FsbCBlcnJvciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkludmFsaWQgYmZkIHRhcmdldCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkZpbGUgaW4gd3JvbmcgZm9ybWF0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiSW52YWxpZCBvcGVyYXRpb24iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJNZW1vcnkgZXhoYXVzdGVkIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm8gc3ltYm9scyIpLAotCQkJTl8oIkFyY2hpdmUgaGFzIG5vIGluZGV4OyBydW4gcmFubGliIHRvIGFkZCBvbmUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJObyBtb3JlIGFyY2hpdmVkIGZpbGVzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTWFsZm9ybWVkIGFyY2hpdmUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkZpbGUgZm9ybWF0IGlzIGFtYmlndW91cyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIlNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm9ucmVwcmVzZW50YWJsZSBzZWN0aW9uIG9uIG91dHB1dCIpLAotCQkJTl8oIlN5bWJvbCBuZWVkcyBkZWJ1ZyBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGV4aXN0IiksCi0JCQlOXygiQmFkIHZhbHVlIiksCi0JCQlOXygiRmlsZSB0cnVuY2F0ZWQiKSwKLQkJCU5fKCJGaWxlIHRvbyBiaWciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCIjPEludmFsaWQgZXJyb3IgY29kZT4iKQotICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2Vycm9yCi0KLVNZTk9QU0lTCi0JYmZkX2Vycm9yX3R5cGUgYmZkX2dldF9lcnJvciAodm9pZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBjdXJyZW50IEJGRCBlcnJvciBjb25kaXRpb24uCi0qLwotCi1iZmRfZXJyb3JfdHlwZQotYmZkX2dldF9lcnJvciAoKQotewotICByZXR1cm4gYmZkX2Vycm9yOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2Vycm9yCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfdHlwZSBlcnJvcl90YWcpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgQkZEIGVycm9yIGNvbmRpdGlvbiB0byBiZSBAdmFye2Vycm9yX3RhZ30uCi0qLwotCi12b2lkCi1iZmRfc2V0X2Vycm9yIChlcnJvcl90YWcpCi0gICAgIGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZzsKLXsKLSAgYmZkX2Vycm9yID0gZXJyb3JfdGFnOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZXJybXNnCi0KLVNZTk9QU0lTCi0JQ09OU1QgY2hhciAqYmZkX2Vycm1zZyAoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IgQHZhcntlcnJvcl90YWd9LCBvcgotCXRoZSBzeXN0ZW0gZXJyb3IgaWYgQHZhcntlcnJvcl90YWd9IGlzIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4uCi0qLwotCi1DT05TVCBjaGFyICoKLWJmZF9lcnJtc2cgKGVycm9yX3RhZykKLSAgICAgYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnOwotewotI2lmbmRlZiBlcnJubwotICBleHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0gIGlmIChlcnJvcl90YWcgPT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotICAgIHJldHVybiB4c3RyZXJyb3IgKGVycm5vKTsKLQotICBpZiAoKCgoaW50KWVycm9yX3RhZyA8KGludCkgYmZkX2Vycm9yX25vX2Vycm9yKSB8fAotICAgICAgICgoaW50KWVycm9yX3RhZyA+IChpbnQpYmZkX2Vycm9yX2ludmFsaWRfZXJyb3JfY29kZSkpKQotICAgIGVycm9yX3RhZyA9IGJmZF9lcnJvcl9pbnZhbGlkX2Vycm9yX2NvZGU7Lyogc2FuaXR5IGNoZWNrICovCi0KLSAgcmV0dXJuIF8oYmZkX2Vycm1zZ3MgWyhpbnQpZXJyb3JfdGFnXSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wZXJyb3IKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9wZXJyb3IgKENPTlNUIGNoYXIgKm1lc3NhZ2UpOwotCi1ERVNDUklQVElPTgotCVByaW50IHRvIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUKLQlsYXN0IEJGRCBlcnJvciB0aGF0IG9jY3VycmVkLCBvciB0aGUgbGFzdCBzeXN0ZW0gZXJyb3IgaWYKLQl0aGUgbGFzdCBCRkQgZXJyb3Igd2FzIGEgc3lzdGVtIGNhbGwgZmFpbHVyZS4gIElmIEB2YXJ7bWVzc2FnZX0KLQlpcyBub24tTlVMTCBhbmQgbm9uLWVtcHR5LCB0aGUgZXJyb3Igc3RyaW5nIHByaW50ZWQgaXMgcHJlY2VkZWQKLQlieSBAdmFye21lc3NhZ2V9LCBhIGNvbG9uLCBhbmQgYSBzcGFjZS4gIEl0IGlzIGZvbGxvd2VkIGJ5IGEgbmV3bGluZS4KLSovCi0KLXZvaWQKLWJmZF9wZXJyb3IgKG1lc3NhZ2UpCi0gICAgIENPTlNUIGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICBwZXJyb3IoKGNoYXIgKiltZXNzYWdlKTsgICAgICAgICAgICAvKiBtdXN0IGJlIHN5c3RlbSBlcnJvciB0aGVuLi4uICovCi0gIGVsc2UgewotICAgIGlmIChtZXNzYWdlID09IE5VTEwgfHwgKm1lc3NhZ2UgPT0gJ1wwJykKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBtZXNzYWdlLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gIH0KLX0KLQotLyoKLVNVQlNFQ1RJT04KLQlCRkQgZXJyb3IgaGFuZGxlcgotCi0JU29tZSBCRkQgZnVuY3Rpb25zIHdhbnQgdG8gcHJpbnQgbWVzc2FnZXMgZGVzY3JpYmluZyB0aGUKLQlwcm9ibGVtLiAgVGhleSBjYWxsIGEgQkZEIGVycm9yIGhhbmRsZXIgZnVuY3Rpb24uICBUaGlzCi0JZnVuY3Rpb24gbWF5IGJlIG92ZXJyaWRlbiBieSB0aGUgcHJvZ3JhbS4KLQotCVRoZSBCRkQgZXJyb3IgaGFuZGxlciBhY3RzIGxpa2UgcHJpbnRmLgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiB2b2lkICgqYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSkgUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLS4KLSovCi0KLS8qIFRoZSBwcm9ncmFtIG5hbWUgdXNlZCB3aGVuIHByaW50aW5nIEJGRCBlcnJvciBtZXNzYWdlcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZTsKLQotLyogVGhpcyBpcyB0aGUgZGVmYXVsdCByb3V0aW5lIHRvIGhhbmRsZSBCRkQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0KLXN0YXRpYyB2b2lkIF9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnMsIC4uLikpOwotCi1zdGF0aWMgdm9pZAotX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIgKGNvbnN0IGNoYXIgKnMsIC4uLikKLXsKLSAgdmFfbGlzdCBwOwotCi0gIGlmIChfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSAhPSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICJCRkQ6ICIpOwotCi0gIHZhX3N0YXJ0IChwLCBzKTsKLQotICB2ZnByaW50ZiAoc3RkZXJyLCBzLCBwKTsKLQotICB2YV9lbmQgKHApOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLSNlbHNlIC8qICEgZGVmaW5lZCAoQU5TSV9QUk9UT1RZUEVTKSAqLwotCi1zdGF0aWMgdm9pZCBfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlciAoKTsKLQotc3RhdGljIHZvaWQKLV9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgcDsKLSAgY29uc3QgY2hhciAqczsKLQotICBpZiAoX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUpOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiQkZEOiAiKTsKLQotICB2YV9zdGFydCAocCk7Ci0KLSAgcyA9IHZhX2FyZyAocCwgY29uc3QgY2hhciAqKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgcywgcCk7Ci0KLSAgdmFfZW5kIChwKTsKLQotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi0jZW5kaWYgLyogISBkZWZpbmVkIChBTlNJX1BST1RPVFlQRVMpICovCi0KLS8qIFRoaXMgaXMgYSBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSByb3V0aW5lIHdoaWNoIHNob3VsZCBoYW5kbGUgQkZECi0gICBlcnJvciBtZXNzYWdlcy4gIEl0IGlzIGNhbGxlZCB3aGVuIGEgQkZEIHJvdXRpbmUgZW5jb3VudGVycyBhbgotICAgZXJyb3IgZm9yIHdoaWNoIGl0IHdhbnRzIHRvIHByaW50IGEgbWVzc2FnZS4gIEdvaW5nIHRocm91Z2ggYQotICAgZnVuY3Rpb24gcG9pbnRlciBwZXJtaXRzIGEgcHJvZ3JhbSBsaW5rZWQgYWdhaW5zdCBCRkQgdG8gaW50ZXJjZXB0Ci0gICB0aGUgbWVzc2FnZXMgYW5kIGRlYWwgd2l0aCB0aGVtIGl0c2VsZi4gICovCi0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgX2JmZF9lcnJvcl9oYW5kbGVyID0gX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXI7Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZXJyb3JfaGFuZGxlcgotCi1TWU5PUFNJUwotCWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgYmZkX3NldF9lcnJvcl9oYW5kbGVyIChiZmRfZXJyb3JfaGFuZGxlcl90eXBlKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIEJGRCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLiAgUmV0dXJucyB0aGUgcHJldmlvdXMKLQlmdW5jdGlvbi4KLSovCi0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUKLWJmZF9zZXRfZXJyb3JfaGFuZGxlciAocG5ldykKLSAgICAgYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBwbmV3OwotewotICBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIHBvbGQ7Ci0KLSAgcG9sZCA9IF9iZmRfZXJyb3JfaGFuZGxlcjsKLSAgX2JmZF9lcnJvcl9oYW5kbGVyID0gcG5ldzsKLSAgcmV0dXJuIHBvbGQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAoY29uc3QgY2hhciAqKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIHByb2dyYW0gbmFtZSB0byB1c2Ugd2hlbiBwcmludGluZyBhIEJGRCBlcnJvci4gIFRoaXMKLQlpcyBwcmludGVkIGJlZm9yZSB0aGUgZXJyb3IgbWVzc2FnZSBmb2xsb3dlZCBieSBhIGNvbG9uIGFuZAotCXNwYWNlLiAgVGhlIHN0cmluZyBtdXN0IG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGl0IGlzIHBhc3NlZCB0bwotCXRoaXMgZnVuY3Rpb24uCi0qLwotCi12b2lkCi1iZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUgPSBuYW1lOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfZXJyb3JfaGFuZGxlcgotCi1TWU5PUFNJUwotCWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgYmZkX2dldF9lcnJvcl9oYW5kbGVyICh2b2lkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIEJGRCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLgotKi8KLQotYmZkX2Vycm9yX2hhbmRsZXJfdHlwZQotYmZkX2dldF9lcnJvcl9oYW5kbGVyICgpCi17Ci0gIHJldHVybiBfYmZkX2Vycm9yX2hhbmRsZXI7Ci19Ci0MCi0vKgotU0VDVElPTgotCVN5bWJvbHMKLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlCi0JcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggc2VjdGlvbiBAdmFye3NlY3R9Ci0JYXR0YWNoZWQgdG8gYmZkIEB2YXJ7YWJmZH0uICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiAtMS4KLQotKi8KLQotCi1sb25nCi1iZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgX2dldF9yZWxvY191cHBlcl9ib3VuZCwgKGFiZmQsIGFzZWN0KSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9jYW5vbmljYWxpemVfcmVsb2MKLSAgICAgICAgCShiZmQgKmFiZmQsCi0JCWFzZWN0aW9uICpzZWMsCi0JCWFyZWxlbnQgKipsb2MsCi0JCWFzeW1ib2wJKipzeW1zKTsKLQotREVTQ1JJUFRJT04KLQlDYWxsIHRoZSBiYWNrIGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZW4gQkZECi0JQHZhcnthYmZkfSBhbmQgdHJhbnNsYXRlIHRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSByZWxvY2F0aW9uCi0JaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gQHZhcntzZWN9IGludG8gdGhlIGludGVybmFsIGNhbm9uaWNhbAotCWZvcm0uICBQbGFjZSB0aGUgdGFibGUgaW50byBtZW1vcnkgYXQgQHZhcntsb2N9LCB3aGljaCBoYXMKLQliZWVuIHByZWFsbG9jYXRlZCwgdXN1YWxseSBieSBhIGNhbGwgdG8KLQk8PGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQ+Pi4gIFJldHVybnMgdGhlIG51bWJlciBvZiByZWxvY3MsIG9yCi0JLTEgb24gZXJyb3IuCi0KLQlUaGUgQHZhcntzeW1zfSB0YWJsZSBpcyBhbHNvIG5lZWRlZCBmb3IgaG9ycmlibGUgaW50ZXJuYWwgbWFnaWMKLQlyZWFzb25zLgotCi0KLSovCi1sb25nCi1iZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBhc2VjdCwgbG9jYXRpb24sIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXJlbGVudCAqKmxvY2F0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYywKLQkJICAgKGFiZmQsIGFzZWN0LCBsb2NhdGlvbiwgc3ltYm9scykpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3JlbG9jCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc2V0X3JlbG9jCi0JICAoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBhcmVsZW50ICoqcmVsLCB1bnNpZ25lZCBpbnQgY291bnQpCi0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSByZWxvY2F0aW9uIHBvaW50ZXIgYW5kIGNvdW50IHdpdGhpbgotCXNlY3Rpb24gQHZhcntzZWN9IHRvIHRoZSB2YWx1ZXMgQHZhcntyZWx9IGFuZCBAdmFye2NvdW50fS4KLQlUaGUgYXJndW1lbnQgQHZhcnthYmZkfSBpcyBpZ25vcmVkLgotCi0qLwotLypBUkdTVVNFRCovCi12b2lkCi1iZmRfc2V0X3JlbG9jIChpZ25vcmVfYWJmZCwgYXNlY3QsIGxvY2F0aW9uLCBjb3VudCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhcmVsZW50ICoqbG9jYXRpb247Ci0gICAgIHVuc2lnbmVkIGludCBjb3VudDsKLXsKLSAgYXNlY3QtPm9yZWxvY2F0aW9uID0gbG9jYXRpb247Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2ZpbGVfZmxhZ3MKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfZmlsZV9mbGFncyhiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIGZsYWcgd29yZCBpbiB0aGUgQkZEIEB2YXJ7YWJmZH0gdG8gdGhlIHZhbHVlIEB2YXJ7ZmxhZ3N9LgotCi0JUG9zc2libGUgZXJyb3JzIGFyZToKLQlvIDw8YmZkX2Vycm9yX3dyb25nX2Zvcm1hdD4+IC0gVGhlIHRhcmdldCBiZmQgd2FzIG5vdCBvZiBvYmplY3QgZm9ybWF0LgotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtIFRoZSB0YXJnZXQgYmZkIHdhcyBvcGVuIGZvciByZWFkaW5nLgotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtCi0JVGhlIGZsYWcgd29yZCBjb250YWluZWQgYSBiaXQgd2hpY2ggd2FzIG5vdCBhcHBsaWNhYmxlIHRvIHRoZQotCXR5cGUgb2YgZmlsZS4gIEUuZy4sIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gc2V0IHRoZSA8PERfUEFHRUQ+PiBiaXQKLQlvbiBhIEJGRCBmb3JtYXQgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBkZW1hbmQgcGFnaW5nLgotCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X2ZpbGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoYmZkX3JlYWRfcCAoYWJmZCkpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgPSBmbGFnczsKLSAgaWYgKChmbGFncyAmIGJmZF9hcHBsaWNhYmxlX2ZpbGVfZmxhZ3MgKGFiZmQpKSAhPSBmbGFncykgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLXJldHVybiB0cnVlOwotfQotCi12b2lkCi1iZmRfYXNzZXJ0IChmaWxlLCBsaW5lKQotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICBpbnQgbGluZTsKLXsKLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJiZmQgYXNzZXJ0aW9uIGZhaWwgJXM6JWQiKSwgZmlsZSwgbGluZSk7Ci19Ci0KLS8qIEEgbW9yZSBvciBsZXNzIGZyaWVuZGx5IGFib3J0IG1lc3NhZ2UuICBJbiBsaWJiZmQuaCBhYm9ydCBpcwotICAgZGVmaW5lZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24uICAqLwotCi0jaWZuZGVmIEVYSVRfRkFJTFVSRQotI2RlZmluZSBFWElUX0ZBSUxVUkUgMQotI2VuZGlmCi0KLXZvaWQKLV9iZmRfYWJvcnQgKGZpbGUsIGxpbmUsIGZuKQotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICBpbnQgbGluZTsKLSAgICAgY29uc3QgY2hhciAqZm47Ci17Ci0gIGlmIChmbiAhPSBOVUxMKQotICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgKF8oIkJGRCBpbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZCBpbiAlc1xuIiksCi0gICAgICAgZmlsZSwgbGluZSwgZm4pOwotICBlbHNlCi0gICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAoXygiQkZEIGludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkXG4iKSwKLSAgICAgICBmaWxlLCBsaW5lKTsKLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIikpOwotICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9zdGFydF9hZGRyZXNzCi0KLVNZTk9QU0lTCi0gCWJvb2xlYW4gYmZkX3NldF9zdGFydF9hZGRyZXNzKGJmZCAqYWJmZCwgYmZkX3ZtYSB2bWEpOwotCi1ERVNDUklQVElPTgotCU1ha2UgQHZhcnt2bWF9IHRoZSBlbnRyeSBwb2ludCBvZiBvdXRwdXQgQkZEIEB2YXJ7YWJmZH0uCi0KLVJFVFVSTlMKLQlSZXR1cm5zIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvdGhlcndpc2UuCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X3N0YXJ0X2FkZHJlc3MoYWJmZCwgdm1hKQotYmZkICphYmZkOwotYmZkX3ZtYSB2bWE7Ci17Ci0gIGFiZmQtPnN0YXJ0X2FkZHJlc3MgPSB2bWE7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfbXRpbWUKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9nZXRfbXRpbWUoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUgKGFzIHJlYWQgZnJvbSB0aGUgZmlsZSBzeXN0ZW0sIG9yCi0JZnJvbSB0aGUgYXJjaGl2ZSBoZWFkZXIgZm9yIGFyY2hpdmUgbWVtYmVycykuCi0KLSovCi0KLWxvbmcKLWJmZF9nZXRfbXRpbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRklMRSAqZnA7Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLQotICBpZiAoYWJmZC0+bXRpbWVfc2V0KQotICAgIHJldHVybiBhYmZkLT5tdGltZTsKLQotICBmcCA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICBpZiAoMCAhPSBmc3RhdCAoZmlsZW5vIChmcCksICZidWYpKQotICAgIHJldHVybiAwOwotCi0gIGFiZmQtPm10aW1lID0gYnVmLnN0X210aW1lOwkJLyogU2F2ZSB2YWx1ZSBpbiBjYXNlIGFueW9uZSB3YW50cyBpdCAqLwotICByZXR1cm4gYnVmLnN0X210aW1lOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X3NpemUKLQotU1lOT1BTSVMKLQlsb25nIGJmZF9nZXRfc2l6ZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgZmlsZSBzaXplIChhcyByZWFkIGZyb20gZmlsZSBzeXN0ZW0pIGZvciB0aGUgZmlsZQotCWFzc29jaWF0ZWQgd2l0aCBCRkQgQHZhcnthYmZkfS4KLQotCVRoZSBpbml0aWFsIG1vdGl2YXRpb24gZm9yLCBhbmQgdXNlIG9mLCB0aGlzIHJvdXRpbmUgaXMgbm90Ci0Jc28gd2UgY2FuIGdldCB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgb2JqZWN0IHRoZSBCRkQgYXBwbGllcyB0bywgc2luY2UKLQl0aGF0IG1pZ2h0IG5vdCBiZSBnZW5lcmFsbHkgcG9zc2libGUgKGFyY2hpdmUgbWVtYmVycyBmb3IgZXhhbXBsZSkuCi0JSXQgd291bGQgYmUgaWRlYWwgaWYgc29tZW9uZSBjb3VsZCBldmVudHVhbGx5IG1vZGlmeQotCWl0IHNvIHRoYXQgc3VjaCByZXN1bHRzIHdlcmUgZ3VhcmFudGVlZC4KLQotCUluc3RlYWQsIHdlIHdhbnQgdG8gYXNrIHF1ZXN0aW9ucyBsaWtlICJpcyB0aGlzIE5OTiBieXRlIHNpemVkCi0Jb2JqZWN0IEknbSBhYm91dCB0byB0cnkgcmVhZCBmcm9tIGZpbGUgb2Zmc2V0IFlZWSByZWFzb25hYmxlPyIKLQlBcyBhcyBleGFtcGxlIG9mIHdoZXJlIHdlIG1pZ2h0IGRvIHRoaXMsIHNvbWUgb2JqZWN0IGZvcm1hdHMKLQl1c2Ugc3RyaW5nIHRhYmxlcyBmb3Igd2hpY2ggdGhlIGZpcnN0IDw8c2l6ZW9mKGxvbmcpPj4gYnl0ZXMgb2YgdGhlCi0JdGFibGUgY29udGFpbiB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgaXRzZWxmLCBpbmNsdWRpbmcgdGhlIHNpemUgYnl0ZXMuCi0JSWYgYW4gYXBwbGljYXRpb24gdHJpZXMgdG8gcmVhZCB3aGF0IGl0IHRoaW5rcyBpcyBvbmUgb2YgdGhlc2UKLQlzdHJpbmcgdGFibGVzLCB3aXRob3V0IHNvbWUgd2F5IHRvIHZhbGlkYXRlIHRoZSBzaXplLCBhbmQgZm9yCi0Jc29tZSByZWFzb24gdGhlIHNpemUgaXMgd3JvbmcgKGJ5dGUgc3dhcHBpbmcgZXJyb3IsIHdyb25nIGxvY2F0aW9uCi0JZm9yIHRoZSBzdHJpbmcgdGFibGUsIGV0Yy4pLCB0aGUgb25seSBjbHVlIGlzIGxpa2VseSB0byBiZSBhIHJlYWQKLQllcnJvciB3aGVuIGl0IHRyaWVzIHRvIHJlYWQgdGhlIHRhYmxlLCBvciBhICJ2aXJ0dWFsIG1lbW9yeQotCWV4aGF1c3RlZCIgZXJyb3Igd2hlbiBpdCB0cmllcyB0byBhbGxvY2F0ZSAxNSBiYXppbGxvbiBieXRlcwotCW9mIHNwYWNlIGZvciB0aGUgMTUgYmF6aWxsb24gYnl0ZSB0YWJsZSBpdCBpcyBhYm91dCB0byByZWFkLgotCVRoaXMgZnVuY3Rpb24gYXQgbGVhc3QgYWxsb3dzIHVzIHRvIGFuc3dlciB0aGUgcXVlc2lvbiwgImlzIHRoZQotCXNpemUgcmVhc29uYWJsZT8iLgotKi8KLQotbG9uZwotYmZkX2dldF9zaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEZJTEUgKmZwOwotICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuICgoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgYWJmZC0+aW9zdHJlYW0pLT5zaXplOwotCi0gIGZwID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gIGlmICgwICE9IGZzdGF0IChmaWxlbm8gKGZwKSwgJmJ1ZikpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIGJ1Zi5zdF9zaXplOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2dwX3NpemUKLQotU1lOT1BTSVMKLQlpbnQgYmZkX2dldF9ncF9zaXplKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBtYXhpbXVtIHNpemUgb2Ygb2JqZWN0cyB0byBiZSBvcHRpbWl6ZWQgdXNpbmcgdGhlIEdQCi0JcmVnaXN0ZXIgdW5kZXIgTUlQUyBFQ09GRi4gIFRoaXMgaXMgdHlwaWNhbGx5IHNldCBieSB0aGUgPDwtRz4+Ci0JYXJndW1lbnQgdG8gdGhlIGNvbXBpbGVyLCBhc3NlbWJsZXIgb3IgbGlua2VyLgotKi8KLQotaW50Ci1iZmRfZ2V0X2dwX3NpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCA9PSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLQlyZXR1cm4gZWNvZmZfZGF0YSAoYWJmZCktPmdwX3NpemU7Ci0gICAgICBlbHNlIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JcmV0dXJuIGVsZl9ncF9zaXplIChhYmZkKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2dwX3NpemUKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9zZXRfZ3Bfc2l6ZShiZmQgKmFiZmQsIGludCBpKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIGJlIG9wdGltaXplZCB1c2luZyB0aGUgR1AKLQlyZWdpc3RlciB1bmRlciBFQ09GRiBvciBNSVBTIEVMRi4gIFRoaXMgaXMgdHlwaWNhbGx5IHNldCBieQotCXRoZSA8PC1HPj4gYXJndW1lbnQgdG8gdGhlIGNvbXBpbGVyLCBhc3NlbWJsZXIgb3IgbGlua2VyLgotKi8KLQotdm9pZAotYmZkX3NldF9ncF9zaXplIChhYmZkLCBpKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBpOwotewotICAvKiBEb24ndCB0cnkgdG8gc2V0IEdQIHNpemUgb24gYW4gYXJjaGl2ZSBvciBjb3JlIGZpbGUhICovCi0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkKLSAgICByZXR1cm47Ci0gIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLSAgICBlY29mZl9kYXRhIChhYmZkKS0+Z3Bfc2l6ZSA9IGk7Ci0gIGVsc2UgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICBlbGZfZ3Bfc2l6ZSAoYWJmZCkgPSBpOwotfQotCi0vKiBHZXQgdGhlIEdQIHZhbHVlLiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGJ5IHNvbWUgb2YgdGhlCi0gICByZWxvY2F0aW9uIHNwZWNpYWxfZnVuY3Rpb24gcm91dGluZXMgb24gdGFyZ2V0cyB3aGljaCBzdXBwb3J0IGEgR1AKLSAgIHJlZ2lzdGVyLiAgKi8KLQotYmZkX3ZtYQotX2JmZF9nZXRfZ3BfdmFsdWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCA9PSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLQlyZXR1cm4gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotICAgICAgZWxzZSBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXJldHVybiBlbGZfZ3AgKGFiZmQpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNldCB0aGUgR1AgdmFsdWUuICAqLwotCi12b2lkCi1fYmZkX3NldF9ncF92YWx1ZSAoYWJmZCwgdikKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIHY7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkKLSAgICByZXR1cm47Ci0gIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLSAgICBlY29mZl9kYXRhIChhYmZkKS0+Z3AgPSB2OwotICBlbHNlIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgZWxmX2dwIChhYmZkKSA9IHY7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zY2FuX3ZtYQotCi1TWU5PUFNJUwotCWJmZF92bWEgYmZkX3NjYW5fdm1hKENPTlNUIGNoYXIgKnN0cmluZywgQ09OU1QgY2hhciAqKmVuZCwgaW50IGJhc2UpOwotCi1ERVNDUklQVElPTgotCUNvbnZlcnQsIGxpa2UgPDxzdHJ0b3VsPj4sIGEgbnVtZXJpY2FsIGV4cHJlc3Npb24KLQlAdmFye3N0cmluZ30gaW50byBhIDw8YmZkX3ZtYT4+IGludGVnZXIsIGFuZCByZXR1cm4gdGhhdCBpbnRlZ2VyLgotCShUaG91Z2ggd2l0aG91dCBhcyBtYW55IGJlbGxzIGFuZCB3aGlzdGxlcyBhcyA8PHN0cnRvdWw+Pi4pCi0JVGhlIGV4cHJlc3Npb24gaXMgYXNzdW1lZCB0byBiZSB1bnNpZ25lZCAoaS5lLiwgcG9zaXRpdmUpLgotCUlmIGdpdmVuIGEgQHZhcntiYXNlfSwgaXQgaXMgdXNlZCBhcyB0aGUgYmFzZSBmb3IgY29udmVyc2lvbi4KLQlBIGJhc2Ugb2YgMCBjYXVzZXMgdGhlIGZ1bmN0aW9uIHRvIGludGVycHJldCB0aGUgc3RyaW5nCi0JaW4gaGV4IGlmIGEgbGVhZGluZyAiMHgiIG9yICIwWCIgaXMgZm91bmQsIG90aGVyd2lzZQotCWluIG9jdGFsIGlmIGEgbGVhZGluZyB6ZXJvIGlzIGZvdW5kLCBvdGhlcndpc2UgaW4gZGVjaW1hbC4KLQotCU92ZXJmbG93IGlzIG5vdCBkZXRlY3RlZC4KLSovCi0KLWJmZF92bWEKLWJmZF9zY2FuX3ZtYSAoc3RyaW5nLCBlbmQsIGJhc2UpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLSAgICAgQ09OU1QgY2hhciAqKmVuZDsKLSAgICAgaW50IGJhc2U7Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGludCBkaWdpdDsKLQotICAvKiBMZXQgdGhlIGhvc3QgZG8gaXQgaWYgcG9zc2libGUuICAqLwotICBpZiAoc2l6ZW9mKGJmZF92bWEpIDw9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKLSAgICByZXR1cm4gKGJmZF92bWEpIHN0cnRvdWwgKHN0cmluZywgKGNoYXIgKiopIGVuZCwgYmFzZSk7Ci0KLSAgLyogQSBuZWdhdGl2ZSBiYXNlIG1ha2VzIG5vIHNlbnNlLCBhbmQgd2Ugb25seSBuZWVkIHRvIGdvIGFzIGhpZ2ggYXMgaGV4LiAgKi8KLSAgaWYgKChiYXNlIDwgMCkgfHwgKGJhc2UgPiAxNikpCi0gICAgcmV0dXJuIChiZmRfdm1hKSAwOwotCi0gIGlmIChiYXNlID09IDApCi0gICAgewotICAgICAgaWYgKHN0cmluZ1swXSA9PSAnMCcpCi0JewotCSAgaWYgKChzdHJpbmdbMV0gPT0gJ3gnKSB8fCAoc3RyaW5nWzFdID09ICdYJykpCi0JICAgIGJhc2UgPSAxNjsKLQkgIC8qIFhYWCBzaG91bGQgd2UgYWxzbyBhbGxvdyAiMGIiIG9yICIwQiIgdG8gc2V0IGJhc2UgdG8gMj8gKi8KLQkgIGVsc2UKLQkgICAgYmFzZSA9IDg7Ci0JfQotICAgICAgZWxzZQotCWJhc2UgPSAxMDsKLSAgICB9Ci0gIGlmICgoYmFzZSA9PSAxNikgJiYKLSAgICAgIChzdHJpbmdbMF0gPT0gJzAnKSAmJiAoKHN0cmluZ1sxXSA9PSAneCcpIHx8IChzdHJpbmdbMV0gPT0gJ1gnKSkpCi0gICAgc3RyaW5nICs9IDI7Ci0gIC8qIFhYWCBzaG91bGQgd2UgYWxzbyBza2lwIG92ZXIgIjBiIiBvciAiMEIiIGlmIGJhc2UgaXMgMj8gKi8KLSAgICAKLS8qIFNwZWVkIGNvdWxkIGJlIGltcHJvdmVkIHdpdGggYSB0YWJsZSBsaWtlIGhleF92YWx1ZVtdIGluIGdhcy4gICovCi0jZGVmaW5lIEhFWF9WQUxVRShjKSBcCi0gIChpc3hkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpCQkJCQlcCi0gICA/IChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYykJCQkJXAotICAgICAgPyAoYyAtICcwJykJCQkJCQlcCi0gICAgICA6ICgxMCArIGMgLSAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpIGMpID8gJ2EnIDogJ0EnKSkpCVwKLSAgIDogNDIpCi0KLSAgZm9yICh2YWx1ZSA9IDA7IChkaWdpdCA9IEhFWF9WQUxVRSgqc3RyaW5nKSkgPCBiYXNlOyBzdHJpbmcrKykKLSAgICB7Ci0gICAgICB2YWx1ZSA9IHZhbHVlICogYmFzZSArIGRpZ2l0OwotICAgIH0KLQotICBpZiAoZW5kKQotICAgICplbmQgPSBzdHJpbmc7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKGJmZCAqaWJmZCwgYmZkICpvYmZkKTsKLQotREVTQ1JJUFRJT04KLQlDb3B5IHByaXZhdGUgQkZEIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBAdmFye2liZmR9IHRvIHRoZSAKLQl0aGUgQkZEIEB2YXJ7b2JmZH0uICBSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLgotCVBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0JTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b2JmZH0uCi0KLS4jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEoaWJmZCwgb2JmZCkgXAotLiAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLCBcCi0uCQkoaWJmZCwgb2JmZCkpCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YShiZmQgKmliZmQsIGJmZCAqb2JmZCk7Ci0KLURFU0NSSVBUSU9OCi0JTWVyZ2UgcHJpdmF0ZSBCRkQgaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIEB2YXJ7aWJmZH0gdG8gdGhlIAotCXRoZSBvdXRwdXQgZmlsZSBCRkQgQHZhcntvYmZkfSB3aGVuIGxpbmtpbmcuICBSZXR1cm4gPDx0cnVlPj4KLQlvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvciByZXR1cm5zIGFyZToKLQotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LgotCi0uI2RlZmluZSBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YShpYmZkLCBvYmZkKSBcCi0uICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLCBcCi0uCQkoaWJmZCwgb2JmZCkpCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfcHJpdmF0ZV9mbGFncwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9wcml2YXRlX2ZsYWdzKGJmZCAqYWJmZCwgZmxhZ3dvcmQgZmxhZ3MpOwotCi1ERVNDUklQVElPTgotCVNldCBwcml2YXRlIEJGRCBmbGFnIGluZm9ybWF0aW9uIGluIHRoZSBCRkQgQHZhcnthYmZkfS4KLQlSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IKLQlyZXR1cm5zIGFyZToKLQotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LgotCi0uI2RlZmluZSBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MoYWJmZCwgZmxhZ3MpIFwKLS4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NldF9wcml2YXRlX2ZsYWdzLCBcCi0uCQkoYWJmZCwgZmxhZ3MpKQotCi0qLwotCi0vKgotRlVOQ1RJT04KLQlzdHVmZgotCi1ERVNDUklQVElPTgotCVN0dWZmIHdoaWNoIHNob3VsZCBiZSBkb2N1bWVudGVkOgotCi0uI2RlZmluZSBiZmRfc2l6ZW9mX2hlYWRlcnMoYWJmZCwgcmVsb2MpIFwKLS4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NpemVvZl9oZWFkZXJzLCAoYWJmZCwgcmVsb2MpKQotLgotLiNkZWZpbmUgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9maW5kX25lYXJlc3RfbGluZSwgIChhYmZkLCBzZWMsIHN5bXMsIG9mZiwgZmlsZSwgZnVuYywgbGluZSkpCi0uCi0uICAgICAgIHsqIERvIHRoZXNlIHRocmVlIGRvIGFueXRoaW5nIHVzZWZ1bCBhdCBhbGwsIGZvciBhbnkgYmFjayBlbmQ/ICAqfQotLiNkZWZpbmUgYmZkX2RlYnVnX2luZm9fc3RhcnQoYWJmZCkgXAotLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19zdGFydCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2RlYnVnX2luZm9fZW5kKGFiZmQpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fZW5kLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlKGFiZmQsIHNlY3Rpb24pIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZSwgKGFiZmQsIHNlY3Rpb24pKQotLgotLgotLiNkZWZpbmUgYmZkX3N0YXRfYXJjaF9lbHQoYWJmZCwgc3RhdCkgXAotLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc3RhdF9hcmNoX2VsdCwoYWJmZCwgc3RhdCkpCi0uCi0uI2RlZmluZSBiZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcChhYmZkKSBcCi0uICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoKVwKLS4gICAgICAgIEJGRF9TRU5EICggYWJmZCwgX2JmZF9zZXRfYXJjaF9tYWNoLCAoYWJmZCwgYXJjaCwgbWFjaCkpCi0uCi0uI2RlZmluZSBiZmRfcmVsYXhfc2VjdGlvbihhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKSBcCi0uICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3JlbGF4X3NlY3Rpb24sIChhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKSkKLS4KLS4jZGVmaW5lIGJmZF9nY19zZWN0aW9ucyhhYmZkLCBsaW5rX2luZm8pIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2Nfc2VjdGlvbnMsIChhYmZkLCBsaW5rX2luZm8pKQotLgotLiNkZWZpbmUgYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUoYWJmZCkgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfbGlua19hZGRfc3ltYm9scyhhYmZkLCBpbmZvKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2xpbmtfYWRkX3N5bWJvbHMsIChhYmZkLCBpbmZvKSkKLS4KLS4jZGVmaW5lIGJmZF9maW5hbF9saW5rKGFiZmQsIGluZm8pIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZmluYWxfbGluaywgKGFiZmQsIGluZm8pKQotLgotLiNkZWZpbmUgYmZkX2ZyZWVfY2FjaGVkX2luZm8oYWJmZCkgXAotLiAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9mcmVlX2NhY2hlZF9pbmZvLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKGFiZmQpIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YShhYmZkLCBmaWxlKVwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSwgKGFiZmQsIGZpbGUpKQotLgotLiNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYihhYmZkLCBhc3ltYm9scykgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIsIChhYmZkLCBhc3ltYm9scykpCi0uCi0uI2RlZmluZSBiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQoYWJmZCkgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCwgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKGFiZmQsIGFyZWxzLCBhc3ltcykgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYywgKGFiZmQsIGFyZWxzLCBhc3ltcykpCi0uCi0uZXh0ZXJuIGJmZF9ieXRlICpiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0uCVBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotLgkJICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYmZkX2J5dGUgKiwKLS4JCSAgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotLgotCi0qLwotCi1iZmRfYnl0ZSAqCi1iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJICAgIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGJmZCAqYWJmZDI7Ci0gIGJmZF9ieXRlICooKmZuKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBiZmRfYnl0ZSAqLCBib29sZWFuLAotCQkJICAgYXN5bWJvbCAqKikpOwotCi0gIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotICAgIHsKLSAgICAgIGFiZmQyID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLSAgICAgIGlmIChhYmZkMiA9PSAwKQotCWFiZmQyID0gYWJmZDsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYmZkMiA9IGFiZmQ7Ci0gIGZuID0gYWJmZDItPnh2ZWMtPl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzOwotCi0gIHJldHVybiAoKmZuKSAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpOwotfQotCi0vKiBSZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQgYW4gRUxGIHByb2dyYW0gaGVhZGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX3JlY29yZF9waGRyIChhYmZkLCB0eXBlLCBmbGFnc192YWxpZCwgZmxhZ3MsIGF0X3ZhbGlkLCBhdCwKLQkJIGluY2x1ZGVzX2ZpbGVoZHIsIGluY2x1ZGVzX3BoZHJzLCBjb3VudCwgc2VjcykKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci0gICAgIGJvb2xlYW4gZmxhZ3NfdmFsaWQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBib29sZWFuIGF0X3ZhbGlkOwotICAgICBiZmRfdm1hIGF0OwotICAgICBib29sZWFuIGluY2x1ZGVzX2ZpbGVoZHI7Ci0gICAgIGJvb2xlYW4gaW5jbHVkZXNfcGhkcnM7Ci0gICAgIHVuc2lnbmVkIGludCBjb3VudDsKLSAgICAgYXNlY3Rpb24gKipzZWNzOwotewotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptLCAqKnBtOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJICAoc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKQotCQkgICArICgoc2l6ZV90KSBjb3VudCAtIDEpICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKLSAgaWYgKG0gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbS0+bmV4dCA9IE5VTEw7Ci0gIG0tPnBfdHlwZSA9IHR5cGU7Ci0gIG0tPnBfZmxhZ3MgPSBmbGFnczsKLSAgbS0+cF9wYWRkciA9IGF0OwotICBtLT5wX2ZsYWdzX3ZhbGlkID0gZmxhZ3NfdmFsaWQ7Ci0gIG0tPnBfcGFkZHJfdmFsaWQgPSBhdF92YWxpZDsKLSAgbS0+aW5jbHVkZXNfZmlsZWhkciA9IGluY2x1ZGVzX2ZpbGVoZHI7Ci0gIG0tPmluY2x1ZGVzX3BoZHJzID0gaW5jbHVkZXNfcGhkcnM7Ci0gIG0tPmNvdW50ID0gY291bnQ7Ci0gIGlmIChjb3VudCA+IDApCi0gICAgbWVtY3B5IChtLT5zZWN0aW9ucywgc2VjcywgY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQotICBmb3IgKHBtID0gJmVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOyAqcG0gIT0gTlVMTDsgcG0gPSAmKCpwbSktPm5leHQpCi0gICAgOwotICAqcG0gPSBtOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2JpbmFyeS5jIGIvYmZkL2JpbmFyeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjk4MGIwLi4wMDAwMDAwCi0tLSBhL2JmZC9iaW5hcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGJpbmFyeSBvYmplY3RzLgotICAgQ29weXJpZ2h0IDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgPGlhbkBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgYSBCRkQgYmFja2VuZCB3aGljaCBtYXkgYmUgdXNlZCB0byB3cml0ZSBiaW5hcnkgb2JqZWN0cy4KLSAgIEl0IG1heSBvbmx5IGJlIHVzZWQgZm9yIG91dHB1dCwgbm90IGlucHV0LiAgVGhlIGludGVudGlvbiBpcyB0aGF0Ci0gICB0aGlzIG1heSBiZSB1c2VkIGFzIGFuIG91dHB1dCBmb3JtYXQgZm9yIG9iamNvcHkgaW4gb3JkZXIgdG8KLSAgIGdlbmVyYXRlIHJhdyBiaW5hcnkgZGF0YS4KLQotICAgVGhpcyBpcyB2ZXJ5IHNpbXBsZS4gIFRoZSBvbmx5IGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRoZSByZWFsIGRhdGEKLSAgIHdpbGwgc3RhcnQgYXQgc29tZSBhZGRyZXNzIFgsIGFuZCBpbiBzb21lIGNhc2VzIHdlIHdpbGwgbm90IHdhbnQgdG8KLSAgIGluY2x1ZGUgWCB6ZXJvZXMganVzdCB0byBnZXQgdG8gdGhhdCBwb2ludC4gIFNpbmNlIHRoZSBzdGFydAotICAgYWRkcmVzcyBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQsIHdlIHVzZSBpdAotICAgaW5zdGVhZCB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHplcm9lcyB0byBza2lwIGF0IHRoZSBzdGFydCBvZgotICAgdGhlIGZpbGUuICBvYmpjb3B5IGNvb3BlcmF0ZXMgYnkgc3BlY2lhbGx5IHNldHRpbmcgdGhlIHN0YXJ0Ci0gICBhZGRyZXNzIHRvIHplcm8gYnkgZGVmYXVsdC4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIEFueSBiZmQgd2UgY3JlYXRlIGJ5IHJlYWRpbmcgYSBiaW5hcnkgZmlsZSBoYXMgdGhyZWUgc3ltYm9sczoKLSAgIGEgc3RhcnQgc3ltYm9sLCBhbiBlbmQgc3ltYm9sLCBhbmQgYW4gYWJzb2x1dGUgbGVuZ3RoIHN5bWJvbC4gICovCi0jZGVmaW5lIEJJTl9TWU1TIDMKLQotc3RhdGljIGJvb2xlYW4gYmluYXJ5X21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqYmluYXJ5X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBiaW5hcnlfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBsb25nIGJpbmFyeV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqbWFuZ2xlX25hbWUgUEFSQU1TICgoYmZkICosIGNoYXIgKikpOwotc3RhdGljIGxvbmcgYmluYXJ5X2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBhc3ltYm9sICpiaW5hcnlfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIGJpbmFyeV9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgaW50IGJpbmFyeV9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotCi0vKiBDcmVhdGUgYSBiaW5hcnkgb2JqZWN0LiAgSW52b2tlZCB2aWEgYmZkX3NldF9mb3JtYXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYmluYXJ5X21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFueSBmaWxlIG1heSBiZSBjb25zaWRlcmVkIHRvIGJlIGEgYmluYXJ5IGZpbGUsIHByb3ZpZGVkIHRoZSB0YXJnZXQKLSAgIHdhcyBub3QgZGVmYXVsdGVkLiAgVGhhdCBpcywgaXQgbXVzdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCBhcwotICAgYmVpbmcgYmluYXJ5LiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYmluYXJ5X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgaWYgKGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYWJmZC0+c3ltY291bnQgPSBCSU5fU1lNUzsKLQotICAvKiBGaW5kIHRoZSBmaWxlIHNpemUuICAqLwotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPbmUgZGF0YSBzZWN0aW9uLiAgKi8KLSAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kYXRhIik7Ci0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc2VjLT5mbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWMtPnZtYSA9IDA7Ci0gIHNlYy0+X3Jhd19zaXplID0gc3RhdGJ1Zi5zdF9zaXplOwotICBzZWMtPmZpbGVwb3MgPSAwOwotCi0gIGFiZmQtPnRkYXRhLmFueSA9IChQVFIpIHNlYzsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotI2RlZmluZSBiaW5hcnlfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIGJpbmFyeV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgYmluYXJ5X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotLyogR2V0IGNvbnRlbnRzIG9mIHRoZSBvbmx5IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYmluYXJ5X2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1iaW5hcnlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAoQklOX1NZTVMgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKLX0KLQotLyogQ3JlYXRlIGEgc3ltYm9sIG5hbWUgYmFzZWQgb24gdGhlIGJmZCdzIGZpbGVuYW1lLiAgKi8KLQotc3RhdGljIGNoYXIgKgotbWFuZ2xlX25hbWUgKGFiZmQsIHN1ZmZpeCkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpzdWZmaXg7Ci17Ci0gIGludCBzaXplOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKnA7Ci0KLSAgc2l6ZSA9IChzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKQotCSAgKyBzdHJsZW4gKHN1ZmZpeCkKLQkgICsgc2l6ZW9mICJfYmluYXJ5X18iKTsKLQotICBidWYgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAoYnVmID09IE5VTEwpCi0gICAgcmV0dXJuICIiOwotCi0gIHNwcmludGYgKGJ1ZiwgIl9iaW5hcnlfJXNfJXMiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3VmZml4KTsKLQotICAvKiBDaGFuZ2UgYW55IG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyB0byB1bmRlcnNjb3Jlcy4gICovCi0gIGZvciAocCA9IGJ1ZjsgKnA7IHArKykKLSAgICBpZiAoISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnApKQotICAgICAgKnAgPSAnXyc7Ci0KLSAgcmV0dXJuIGJ1ZjsKLX0KLQotLyogUmV0dXJuIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotYmluYXJ5X2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICBhc2VjdGlvbiAqc2VjID0gKGFzZWN0aW9uICopIGFiZmQtPnRkYXRhLmFueTsKLSAgYXN5bWJvbCAqc3ltczsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgc3ltcyA9IChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgQklOX1NZTVMgKiBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU3RhcnQgc3ltYm9sLiAgKi8KLSAgc3ltc1swXS50aGVfYmZkID0gYWJmZDsKLSAgc3ltc1swXS5uYW1lID0gbWFuZ2xlX25hbWUgKGFiZmQsICJzdGFydCIpOwotICBzeW1zWzBdLnZhbHVlID0gMDsKLSAgc3ltc1swXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMF0uc2VjdGlvbiA9IHNlYzsKLSAgc3ltc1swXS51ZGF0YS5wID0gTlVMTDsKLQotICAvKiBFbmQgc3ltYm9sLiAgKi8KLSAgc3ltc1sxXS50aGVfYmZkID0gYWJmZDsKLSAgc3ltc1sxXS5uYW1lID0gbWFuZ2xlX25hbWUgKGFiZmQsICJlbmQiKTsKLSAgc3ltc1sxXS52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOwotICBzeW1zWzFdLmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgc3ltc1sxXS5zZWN0aW9uID0gc2VjOwotICBzeW1zWzFdLnVkYXRhLnAgPSBOVUxMOwotCi0gIC8qIFNpemUgc3ltYm9sLiAgKi8KLSAgc3ltc1syXS50aGVfYmZkID0gYWJmZDsKLSAgc3ltc1syXS5uYW1lID0gbWFuZ2xlX25hbWUgKGFiZmQsICJzaXplIik7Ci0gIHN5bXNbMl0udmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLSAgc3ltc1syXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMl0uc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIHN5bXNbMl0udWRhdGEucCA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IEJJTl9TWU1TOyBpKyspCi0gICAgKmFsb2NhdGlvbisrID0gc3ltcysrOwotICAqYWxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gQklOX1NZTVM7Ci19Ci0KLS8qIE1ha2UgYW4gZW1wdHkgc3ltYm9sLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotYmluYXJ5X21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotfQotCi0jZGVmaW5lIGJpbmFyeV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0KLS8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1iaW5hcnlfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotI2RlZmluZSBiaW5hcnlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiaW5hcnlfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGJpbmFyeV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiaW5hcnlfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBiaW5hcnlfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBiaW5hcnlfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgYmluYXJ5X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQotI2RlZmluZSBiaW5hcnlfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBiZmRfMGwpCi0jZGVmaW5lIGJpbmFyeV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUgb2YgYSBiaW5hcnkgZmlsZS4gICovCi0jZGVmaW5lIGJpbmFyeV9zZXRfYXJjaF9tYWNoIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoCi0KLS8qIFdyaXRlIHNlY3Rpb24gY29udGVudHMgb2YgYSBiaW5hcnkgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1iaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLXsKLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBib29sZWFuIGZvdW5kX2xvdzsKLSAgICAgIGJmZF92bWEgbG93OwotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIFRoZSBsb3dlc3Qgc2VjdGlvbiBMTUEgc2V0cyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdGFydAotICAgICAgICAgb2YgdGhlIGZpbGUuICBXZSB1c2UgdGhpcyB0byBzZXQgdGhlIGZpbGUgcG9zaXRpb24gb2YgYWxsIHRoZQotICAgICAgICAgc2VjdGlvbnMuICAqLwotICAgICAgZm91bmRfbG93ID0gZmFsc2U7Ci0gICAgICBsb3cgPSAwOwotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JaWYgKCgocy0+ZmxhZ3MKLQkgICAgICAmIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfTkVWRVJfTE9BRCkpCi0JICAgICA9PSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKLQkgICAgJiYgKCEgZm91bmRfbG93IHx8IHMtPmxtYSA8IGxvdykpCi0JICB7Ci0JICAgIGxvdyA9IHMtPmxtYTsKLQkgICAgZm91bmRfbG93ID0gdHJ1ZTsKLQkgIH0KLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgcy0+ZmlsZXBvcyA9IHMtPmxtYSAtIGxvdzsKLQotCSAgLyogU2tpcCBmb2xsb3dpbmcgd2FybmluZyBjaGVjayBmb3Igc2VjdGlvbnMgdGhhdCB3aWxsIG5vdAotCSAgICAgb2NjdXB5IGZpbGUgc3BhY2UuICAqLyAKLQkgIGlmICgocy0+ZmxhZ3MKLQkgICAgICAgJiAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19ORVZFUl9MT0FEKSkKLQkgICAgICAhPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQykpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIGEgYmluYXJ5IGZpbGUgZnJvbSBhIGJmZCB3aXRoCi0JICAgICBMTUEncyBhbGwgb3ZlciB0aGUgcGxhY2UsIGh1Z2UgKHNwYXJzZT8pIGJpbmFyeSBmaWxlcyBtYXkKLQkgICAgIHJlc3VsdC4gIFRoaXMgY29uZGl0aW9uIGF0dGVtcHRzIHRvIGRldGVjdCB0aGlzIHNpdHVhdGlvbgotCSAgICAgYW5kIHByaW50IGEgd2FybmluZy4gIEJldHRlciBoZXVyaXN0aWNzIHdvdWxkIGJlIG5pY2UgdG8KLQkgICAgIGhhdmUuICovCi0KLQkgIGlmIChzLT5maWxlcG9zIDwgMCkKLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgKF8oIldhcm5pbmc6IFdyaXRpbmcgc2VjdGlvbiBgJXMnIHRvIGh1Z2UgKGllIG5lZ2F0aXZlKSBmaWxlIG9mZnNldCAweCVseC4iKSwKLQkgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHMpLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgcy0+ZmlsZXBvcyk7Ci0JfQotCi0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogV2UgZG9uJ3Qgd2FudCB0byBvdXRwdXQgYW55dGhpbmcgZm9yIGEgc2VjdGlvbiB0aGF0IGlzIG5laXRoZXIKLSAgICAgbG9hZGVkIG5vciBhbGxvY2F0ZWQuICBUaGUgY29udGVudHMgb2Ygc3VjaCBhIHNlY3Rpb24gYXJlIG5vdAotICAgICBtZWFuaW5nZnVsIGluIHRoZSBiaW5hcnkgZm9ybWF0LiAgKi8KLSAgaWYgKChzZWMtPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX05FVkVSX0xPQUQpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIHNpemUpOwotfQotCi0vKiBObyBzcGFjZSBpcyByZXF1aXJlZCBmb3IgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGludAotYmluYXJ5X3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBleGVjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAwOwotfQotCi0jZGVmaW5lIGJpbmFyeV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJpbmFyeV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJpbmFyeV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgYmluYXJ5X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJpbmFyeV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBiaW5hcnlfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYmluYXJ5X2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBiaW5hcnlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi1jb25zdCBiZmRfdGFyZ2V0IGJpbmFyeV92ZWMgPQotewotICAiYmluYXJ5IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAkvKiBmbGF2b3VyICovCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIGJ5dGVvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiBoZWFkZXJfYnl0ZW9yZGVyICovCi0gIEVYRUNfUCwJCQkvKiBvYmplY3RfZmxhZ3MgKi8KLSAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZIHwgU0VDX0NPREUgfCBTRUNfREFUQQotICAgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUyksIC8qIHNlY3Rpb25fZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLSAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgYmluYXJ5X29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgYmZkX2ZhbHNlLAotICAgIGJpbmFyeV9ta29iamVjdCwKLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfdHJ1ZSwKLSAgICBiZmRfZmFsc2UsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGJpbmFyeSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGJpbmFyeSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiaW5hcnkpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIE5VTEwKLX07CmRpZmYgLS1naXQgYS9iZmQvYm91dC5jIGIvYmZkL2JvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxNzU0YS4uMDAwMDAwMAotLS0gYS9iZmQvYm91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU0MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDk2MCBiLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2VubGluay5oIgotI2luY2x1ZGUgImJvdXQuaCIKLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLQotc3RhdGljIGludCBhbGlnbmNvZGUgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGFyZWxlbnQgKnIsIHVuc2lnbmVkIGludCBzaHJpbmspKTsKLXN0YXRpYyB2b2lkIHBlcmZvcm1fc2xpcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCBzbGlwLAotCQkJCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sIGJmZF92bWEgdmFsdWUpKTsKLXN0YXRpYyBib29sZWFuIGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24pKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpiX291dF9jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjYWxsanhfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFyZWxlbnQgKiwgUFRSIHNyYywgUFRSIGRzdCwKLQkgICBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNhbGxqX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhcmVsZW50ICosIFBUUiBkYXRhLAotCSAgIHVuc2lnbmVkIGludCBzcmNpZHgsIHVuc2lnbmVkIGludCBkc3RpZHgsIGFzZWN0aW9uICosIGJvb2xlYW4pKTsKLXN0YXRpYyBiZmRfdm1hIGdldF92YWx1ZSBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgaW50IGFiczMyY29kZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqLAotCQkJICAgICAgdW5zaWduZWQgaW50LCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBiX291dF9iZmRfcmVsYXhfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJCXN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCQlib29sZWFuICopKTsKLXN0YXRpYyBiZmRfYnl0ZSAqYl9vdXRfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgdGFrZW4gZnJvbSBhIHJhdyBieXRlCi0gICBzdHJlYW0gbWVtb3J5IGltYWdlLCBpbnRvIHRoZSBpbnRlcm5hbCBleGVjX2hlYWRlciBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1ib3V0X3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+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+Y2FsbGoiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLGZhbHNlKTsKLQotc3RhdGljICByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX2FiczMyY29kZSA9Ci1IT1dUTyhBQlMzMkNPREUsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiY2FsbHgiLCB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19hbGlnbl90YWJsZVtdID0gewotICBIT1dUTyAoQUxJR05FUiwgMCwgMHgxLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduMTYiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05FUiwgMCwgMHgzLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduMzIiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05FUiwgMCwgMHg3LCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduNjQiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05FUiwgMCwgMHhmLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduMTI4IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX2RvbmVfYWxpZ25fdGFibGVbXSA9IHsKLSAgSE9XVE8gKEFMSUdORE9ORSwgMHgxLCAweDEsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiZG9uZWFsaWduMTYiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05ET05FLCAweDMsIDB4MywgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJkb25lYWxpZ24zMiIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi0gIEhPV1RPIChBTElHTkRPTkUsIDB4NywgMHg3LCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImRvbmVhbGlnbjY0IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLSAgSE9XVE8gKEFMSUdORE9ORSwgMHhmLCAweGYsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiZG9uZWFsaWduMTI4IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJfb3V0X2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIEJGRF9SRUxPQ19JOTYwX0NBTExKOgotICAgICAgcmV0dXJuICZob3d0b19yZWxvY19jYWxsajsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgcmV0dXJuICZob3d0b19yZWxvY19hYnMzMjsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNF9QQ1JFTDoKLSAgICAgIHJldHVybiAmaG93dG9fcmVsb2NfcGNyZWwyNDsKLSAgICB9Ci19Ci0KLS8qIEFsbG9jYXRlIGVub3VnaCByb29tIGZvciBhbGwgdGhlIHJlbG9jIGVudHJpZXMsIHBsdXMgcG9pbnRlcnMgdG8gdGhlbSBhbGwgKi8KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcnB0cjsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXIgOwotICBhcmVsZW50ICpjYWNoZV9wdHIgOwotICBpbnQgZXh0ZXJuX21hc2ssIHBjcmVsX21hc2ssIGNhbGxqX21hc2ssIGxlbmd0aF9zaGlmdDsKLSAgaW50IGluY29kZV9tYXNrOwotICBpbnQgc2l6ZV9tYXNrOwotICBiZmRfdm1hIHByZXZfYWRkciA9IDA7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc2l6ZV90ICByZWxvY19zaXplOwotICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbG9jX2NhY2hlOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKCFhb3V0XzMyX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpIHsKLSAgICByZWxvY19zaXplID0gZXhlY19oZHIoYWJmZCktPmFfZHJzaXplOwotICAgIGdvdG8gZG9pdDsKLSAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpIHsKLSAgICByZWxvY19zaXplID0gZXhlY19oZHIoYWJmZCktPmFfdHJzaXplOwotICAgIGdvdG8gZG9pdDsKLSAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkgewotICAgIHJlbG9jX3NpemUgPSAwOwotICAgIGdvdG8gZG9pdDsKLSAgfQotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLQotIGRvaXQ6Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShhc2VjdC0+cmVsX2ZpbGVwb3MpLCAgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb3VudCA9IHJlbG9jX3NpemUgLyBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pOwotCi0gIHJlbG9jcyA9IChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAoIXJlbG9jcyAmJiByZWxvY19zaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICByZWxvY19jYWNoZSA9IChhcmVsZW50ICopIGJmZF9tYWxsb2MgKChjb3VudCsxKSAqIHNpemVvZiAoYXJlbGVudCkpOwotICBpZiAoIXJlbG9jX2NhY2hlKSB7Ci0gICAgaWYgKHJlbG9jcyAhPSBOVUxMKQotICAgICAgZnJlZSAoKGNoYXIqKXJlbG9jcyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByZWxvY3MsIDEsIHJlbG9jX3NpemUsIGFiZmQpICE9IHJlbG9jX3NpemUpIHsKLSAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgaWYgKHJlbG9jcyAhPSBOVUxMKQotICAgICAgZnJlZSAocmVsb2NzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICAvKiBiaWctZW5kaWFuIGJpdCBmaWVsZCBhbGxvY2F0aW9uIG9yZGVyICovCi0gICAgcGNyZWxfbWFzayAgPSAweDgwOwotICAgIGV4dGVybl9tYXNrID0gMHgxMDsKLSAgICBpbmNvZGVfbWFzayA9IDB4MDg7Ci0gICAgY2FsbGpfbWFzayAgPSAweDAyOwotICAgIHNpemVfbWFzayA9ICAgMHgyMDsKLSAgICBsZW5ndGhfc2hpZnQgPSA1OwotICB9IGVsc2UgewotICAgIC8qIGxpdHRsZS1lbmRpYW4gYml0IGZpZWxkIGFsbG9jYXRpb24gb3JkZXIgKi8KLSAgICBwY3JlbF9tYXNrICA9IDB4MDE7Ci0gICAgZXh0ZXJuX21hc2sgPSAweDA4OwotICAgIGluY29kZV9tYXNrID0gMHgxMDsKLSAgICBjYWxsal9tYXNrICA9IDB4NDA7Ci0gICAgc2l6ZV9tYXNrICAgPSAweDAyOwotICAgIGxlbmd0aF9zaGlmdCA9IDE7Ci0gIH0KLQotICBmb3IgKHJwdHIgPSByZWxvY3MsIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlLCBjb3VudGVyID0gMDsKLSAgICAgICBjb3VudGVyIDwgY291bnQ7Ci0gICAgICAgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAqcmF3ID0gKHVuc2lnbmVkIGNoYXIgKilycHRyOwotICAgIHVuc2lnbmVkIGludCBzeW1udW07Ci0gICAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYXcgKyAwKTsKLSAgICBjYWNoZV9wdHItPmhvd3RvID0gMDsKLSAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBzeW1udW0gPSAocmF3WzRdIDw8IDE2KSB8IChyYXdbNV0gPDwgOCkgfCByYXdbNl07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzeW1udW0gPSAocmF3WzZdIDw8IDE2KSB8IChyYXdbNV0gPDwgOCkgfCByYXdbNF07Ci0gICAgfQotCi0gICAgaWYgKHJhd1s3XSAmIGV4dGVybl9tYXNrKQotICAgIHsKLSAgICAgIC8qIGlmIHRoaXMgaXMgc2V0IHRoZW4gdGhlIHJfaW5kZXggaXMgYSBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGU7Ci0gICAgICAgKiBpZiB0aGUgYml0IGlzIG5vdCBzZXQgdGhlbiByX2luZGV4IGNvbnRhaW5zIGEgc2VjdGlvbiBtYXAuCi0gICAgICAgKiB3ZSBlaXRoZXIgZmlsbCBpbiB0aGUgc3ltIGVudHJ5IHdpdGggYSBwb2ludGVyIHRvIHRoZSBzeW1ib2wsCi0gICAgICAgKiBvciBwb2ludCB0byB0aGUgY29ycmVjdCBzZWN0aW9uCi0gICAgICAgKi8KLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgc3ltbnVtOwotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgIC8qIGluIGEub3V0IHN5bWJvbHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICAgICAgKiBmaWxlIHJhdGhlciB0aGFuIHNlY3Rpb25zID8KLSAgICAgICAqIChsb29rIGluIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpCi0gICAgICAgKiB0aGUgcmVsb2MgZW50cnkgYWRkZW5kIGhhcyBhZGRlZCB0byBpdCB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgICAgKiBmaWxlIG9mIHRoZSBkYXRhLCBzbyBzdWJ0cmFjdCB0aGUgYmFzZSB0byBtYWtlIHRoZSByZWxvYwotICAgICAgICogc2VjdGlvbiByZWxhdGl2ZSAqLwotICAgICAgaW50IHM7Ci0gICAgICB7Ci0JLyogc2lnbi1leHRlbmQgc3ltbnVtIGZyb20gMjQgYml0cyB0byB3aGF0ZXZlciBob3N0IHVzZXMgKi8KLQlzID0gc3ltbnVtOwotCWlmIChzICYgKDEgPDwgMjMpKQotCSAgcyB8PSAofjApIDw8IDI0OwotICAgICAgfQotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKU5VTEw7Ci0gICAgICBzd2l0Y2ggKHMpCi0gICAgICB7Ci0gICAgICAgY2FzZSBOX1RFWFQ6Ci0gICAgICAgY2FzZSBOX1RFWFQgfCBOX0VYVDoKLQljYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gb2JqX3RleHRzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwotCWNhY2hlX3B0ci0+YWRkZW5kID0gLSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hOwotCWJyZWFrOwotICAgICAgIGNhc2UgTl9EQVRBOgotICAgICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0JY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial9kYXRhc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsKLQljYWNoZV9wdHItPmFkZGVuZCA9IC0gb2JqX2RhdGFzZWMoYWJmZCktPnZtYTsKLQlicmVhazsKLSAgICAgICBjYXNlIE5fQlNTOgotICAgICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoKLQljYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gb2JqX2Jzc3NlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7Ci0JY2FjaGVfcHRyLT5hZGRlbmQgPSAgLSBvYmpfYnNzc2VjKGFiZmQpLT52bWE7Ci0JYnJlYWs7Ci0gICAgICAgY2FzZSBOX0FCUzoKLSAgICAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial9ic3NzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwotCWNhY2hlX3B0ci0+YWRkZW5kID0gMDsKLQlicmVhazsKLSAgICAgIGNhc2UgLTI6IC8qIC5hbGlnbiAqLwotCWlmIChyYXdbN10gJiBwY3JlbF9tYXNrKQotCSAgewotCSAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX2FsaWduX3RhYmxlWyhyYXdbN10gPj4gbGVuZ3RoX3NoaWZ0KSAmIDNdOwotCSAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiAub3JnPyAqLwotCSAgICBhYm9ydCAoKTsKLQkgIH0KLQljYWNoZV9wdHItPmFkZGVuZCA9IDA7Ci0JYnJlYWs7Ci0gICAgICAgZGVmYXVsdDoKLQlCRkRfQVNTRVJUKDApOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgfQotCi0gICAgLyogdGhlIGk5NjAgb25seSBoYXMgYSBmZXcgcmVsb2NhdGlvbiB0eXBlczoKLSAgICAgICBhYnMgMzItYml0IGFuZCBwY3JlbCAyNGJpdC4gICBleGNlcHQgZm9yIGNhbGxqJ3MhICAqLwotICAgIGlmIChjYWNoZV9wdHItPmhvd3RvICE9IDApCi0gICAgICA7Ci0gICAgZWxzZSBpZiAocmF3WzddICYgY2FsbGpfbWFzaykKLSAgICB7Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3JlbG9jX2NhbGxqOwotICAgIH0KLSAgICBlbHNlIGlmICggcmF3WzddICYgcGNyZWxfbWFzaykKLSAgICB7Ci0gICAgICBpZiAocmF3WzddICYgc2l6ZV9tYXNrKQotICAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmaG93dG9fcmVsb2NfcGNyZWwxMzsKLSAgICAgIGVsc2UKLSAgICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3JlbG9jX3BjcmVsMjQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocmF3WzddICYgaW5jb2RlX21hc2spCi0gICAgICB7Ci0JY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMmNvZGU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGNhY2hlX3B0ci0+YWRkcmVzcyA8IHByZXZfYWRkcikKLSAgICB7Ci0gICAgICAvKiBPdWNoISB0aGlzIHJlbG9jIGlzIG91dCBvZiBvcmRlciwgaW5zZXJ0IGludG8gdGhlIHJpZ2h0IHBsYWNlCi0gICAgICAgKi8KLSAgICAgIGFyZWxlbnQgdG1wOwotICAgICAgYXJlbGVudCAqY3Vyc29yID0gY2FjaGVfcHRyLTE7Ci0gICAgICBiZmRfdm1hIHN0b3AgPSBjYWNoZV9wdHItPmFkZHJlc3M7Ci0gICAgICB0bXAgID0gKmNhY2hlX3B0cjsKLSAgICAgIHdoaWxlIChjdXJzb3ItPmFkZHJlc3MgPiBzdG9wICYmIGN1cnNvciA+PSByZWxvY19jYWNoZSkKLSAgICAgIHsKLQljdXJzb3JbMV0gPSBjdXJzb3JbMF07Ci0JY3Vyc29yLS07Ci0gICAgICB9Ci0gICAgICBjdXJzb3JbMV0gPSB0bXA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwcmV2X2FkZHIgPSBjYWNoZV9wdHItPmFkZHJlc3M7Ci0gICAgfQotICB9Ci0KLQotICBpZiAocmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NzKTsKLSAgYXNlY3QtPnJlbG9jYXRpb24gPSByZWxvY19jYWNoZTsKLSAgYXNlY3QtPnJlbG9jX2NvdW50ID0gY291bnQ7Ci0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGFyZWxlbnQgKipnZW5lcmljOwotICBpbnQgcl9leHRlcm4gPSAwOwotICBpbnQgcl9pZHg7Ci0gIGludCBpbmNvZGVfbWFzazsKLSAgaW50IGxlbl8xOwotICB1bnNpZ25lZCBpbnQgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqbmF0aXZlLCAqbmF0cHRyOwotICBzaXplX3QgbmF0c2l6ZSA9IGNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLSAgaW50IGV4dGVybl9tYXNrLCBwY3JlbF9tYXNrLCAgbGVuXzIsIGNhbGxqX21hc2s7Ci0gIGlmIChjb3VudCA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgZ2VuZXJpYyAgID0gc2VjdGlvbi0+b3JlbG9jYXRpb247Ci0gIG5hdGl2ZSA9ICgoc3RydWN0IHJlbG9jYXRpb25faW5mbyAqKSBiZmRfbWFsbG9jIChuYXRzaXplKSk7Ci0gIGlmICghbmF0aXZlICYmIG5hdHNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gIHsKLSAgICAvKiBCaWctZW5kaWFuIGJpdCBmaWVsZCBhbGxvY2F0aW9uIG9yZGVyICovCi0gICAgcGNyZWxfbWFzayAgPSAweDgwOwotICAgIGV4dGVybl9tYXNrID0gMHgxMDsKLSAgICBsZW5fMiAgICAgICA9IDB4NDA7Ci0gICAgbGVuXzEgICAgICAgPSAweDIwOwotICAgIGNhbGxqX21hc2sgID0gMHgwMjsKLSAgICBpbmNvZGVfbWFzayA9IDB4MDg7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgLyogTGl0dGxlLWVuZGlhbiBiaXQgZmllbGQgYWxsb2NhdGlvbiBvcmRlciAqLwotICAgIHBjcmVsX21hc2sgID0gMHgwMTsKLSAgICBleHRlcm5fbWFzayA9IDB4MDg7Ci0gICAgbGVuXzIgICAgICAgPSAweDA0OwotICAgIGxlbl8xICAgICAgID0gMHgwMjsKLSAgICBjYWxsal9tYXNrICA9IDB4NDA7Ci0gICAgaW5jb2RlX21hc2sgPSAweDEwOwotICB9Ci0KLSAgZm9yIChuYXRwdHIgPSBuYXRpdmU7IGNvdW50ID4gMDsgLS1jb3VudCwgKytuYXRwdHIsICsrZ2VuZXJpYykKLSAgewotICAgIGFyZWxlbnQgKmcgPSAqZ2VuZXJpYzsKLSAgICB1bnNpZ25lZCBjaGFyICpyYXcgPSAodW5zaWduZWQgY2hhciAqKW5hdHB0cjsKLSAgICBhc3ltYm9sICpzeW0gPSAqKGctPnN5bV9wdHJfcHRyKTsKLQotICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZy0+YWRkcmVzcywgcmF3KTsKLSAgICAvKiBGaW5kIGEgdHlwZSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB3aGljaCBtYXRjaGVzIHRoZSBpbnB1dCBob3d0byAtCi0gICAgICogYXQgdGhlIG1vbWVudCB3ZSBhc3N1bWUgaW5wdXQgZm9ybWF0ID09IG91dHB1dCBmb3JtYXQgRklYTUUhIQotICAgICAqLwotICAgIHJfaWR4ID0gMDsKLSAgICAvKiBGSVhNRTogIE5lZWQgY2FsbGogc3R1ZmYgaGVyZSwgYW5kIHRvIGNoZWNrIHRoZSBob3d0byBlbnRyaWVzIHRvCi0gICAgICAgYmUgc3VyZSB0aGV5IGFyZSByZWFsIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gICovCi0gICAgaWYgKGctPmhvd3RvPT0gJmhvd3RvX3JlbG9jX2NhbGxqKQotICAgIHsKLSAgICAgIHJhd1s3XSA9IGNhbGxqX21hc2sgKyBwY3JlbF9tYXNrICsgbGVuXzI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGctPmhvd3RvID09ICZob3d0b19yZWxvY19wY3JlbDI0KQotICAgIHsKLSAgICAgIHJhd1s3XSA9IHBjcmVsX21hc2sgKyBsZW5fMjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZy0+aG93dG8gPT0gJmhvd3RvX3JlbG9jX3BjcmVsMTMpCi0gICAgewotICAgICAgcmF3WzddID0gcGNyZWxfbWFzayArIGxlbl8xOwotICAgIH0KLSAgICBlbHNlIGlmIChnLT5ob3d0byA9PSAmaG93dG9fcmVsb2NfYWJzMzJjb2RlKQotICAgIHsKLSAgICAgIHJhd1s3XSA9IGxlbl8yICsgaW5jb2RlX21hc2s7Ci0gICAgfQotICAgIGVsc2UgaWYgKGctPmhvd3RvID49IGhvd3RvX2FsaWduX3RhYmxlCi0JICAgICAmJiBnLT5ob3d0byA8PSAoaG93dG9fYWxpZ25fdGFibGUKLQkJCSAgICArIHNpemVvZiAoaG93dG9fYWxpZ25fdGFibGUpIC8gc2l6ZW9mIChob3d0b19hbGlnbl90YWJsZVswXSkKLQkJCSAgICAtIDEpKQotICAgICAgewotCS8qIHN5bW51bSA9PSAtMjsgZXh0ZXJuX21hc2sgbm90IHNldCwgcGNyZWxfbWFzayBzZXQgKi8KLQlyX2lkeCA9IC0yOwotCXJfZXh0ZXJuID0gMDsKLQlyYXdbN10gPSAocGNyZWxfbWFzawotCQkgIHwgKChnLT5ob3d0byAtIGhvd3RvX2FsaWduX3RhYmxlKSA8PCAxKSk7Ci0gICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByYXdbN10gPSBsZW5fMjsKLSAgICB9Ci0KLSAgICBpZiAocl9pZHggIT0gMCkKLSAgICAgIC8qIGFscmVhZHkgbXVja2VkIHdpdGggcl9leHRlcm4sIHJfaWR4ICovOwotICAgIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0JICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotCSAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCi0gICAgewotCi0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sID09IHN5bSkKLSAgICAgIHsKLQkvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQlyX2lkeCA9IDA7Ci0Jcl9leHRlcm4gPSAwOwotICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLQkvKiBGaWxsIGluIHN5bWJvbCAqLwotCi0Jcl9leHRlcm4gPSAxOwotCXJfaWR4ID0gKCpnLT5zeW1fcHRyX3B0ciktPnVkYXRhLmk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaWR4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICAgIHJhd1s0XSA9ICh1bnNpZ25lZCBjaGFyKSAocl9pZHggPj4gMTYpOwotICAgICAgcmF3WzVdID0gKHVuc2lnbmVkIGNoYXIpIChyX2lkeCA+PiAgOCk7Ci0gICAgICByYXdbNl0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ICAgICApOwotICAgIH0gZWxzZSB7Ci0gICAgICByYXdbNl0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ID4+IDE2KTsKLSAgICAgIHJhd1s1XSA9ICh1bnNpZ25lZCBjaGFyKSAocl9pZHg+PiAgOCk7Ci0gICAgICByYXdbNF0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ICAgICApOwotICAgIH0KLSAgICBpZiAocl9leHRlcm4pCi0gICAgIHJhd1s3XSB8PSBleHRlcm5fbWFzazsKLSAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5hdGl2ZSwgMSwgbmF0c2l6ZSwgYWJmZCkgIT0gbmF0c2l6ZSkgewotICAgIGZyZWUoKFBUUiluYXRpdmUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBmcmVlICgoUFRSKW5hdGl2ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLwotc3RhdGljIGxvbmcKLWJfb3V0X2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0cjsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpICE9IDApCi0gICAgewotICAgICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotCSAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gPT0gTlVMTAotCSAgJiYgISBiX291dF9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpCi0JcmV0dXJuIC0xOwotCi0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCi0JKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgfQotCi0gICpyZWxwdHIgPSBOVUxMOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotc3RhdGljIGxvbmcKLWJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiBzaXplb2YgKGFyZWxlbnQgKikgKiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqCi0JICAgICgoZXhlY19oZHIoYWJmZCktPmFfZHJzaXplIC8gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSkKLQkgICAgICsxKSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial90ZXh0c2VjIChhYmZkKSkKLSAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqCi0JICAgICgoZXhlY19oZHIoYWJmZCktPmFfdHJzaXplIC8gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSkKLQkgICAgICsxKSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJldHVybiAwOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiAtMTsKLX0KLQwKLXN0YXRpYyBib29sZWFuCi1iX291dF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKSB7IC8qIHNldCBieSBiZmQuYyBoYW5kbGVyICovCi0gICAgaWYgKCEgYW91dF8zMl9tYWtlX3NlY3Rpb25zIChhYmZkKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IHNpemVvZihzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7Ci0gICAgb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MgPSBvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgfQotICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApIHsKLSAgICByZXR1cm4gKGJmZF93cml0ZSAoKFBUUilsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpID09IGNvdW50KSA/dHJ1ZTpmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLQotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQkvKiBVbmtub3duIG1hY2hpbmUgYXJjaCBpcyBPSyAqLwotICAgIHJldHVybiB0cnVlOwotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF9pOTYwKQkvKiBpOTYwIGRlZmF1bHQgaXMgT0sgKi8KLSAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY29yZToKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX21jOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF94YToKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY2E6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF9qeDoKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfaHg6Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50Ci1iX291dF9zaXplb2ZfaGVhZGVycyAoaWdub3JlX2FiZmQsIGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gc2l6ZW9mKHN0cnVjdCBpbnRlcm5hbF9leGVjKTsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYmZkX3ZtYQotZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKQotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGFzeW1ib2wgKnN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLQotICAvKiBBIHN5bWJvbCBob2xkcyBhIHBvaW50ZXIgdG8gYSBzZWN0aW9uLCBhbmQgYW4gb2Zmc2V0IGZyb20gdGhlCi0gICAgIGJhc2Ugb2YgdGhlIHNlY3Rpb24uICBUbyByZWxvY2F0ZSwgd2UgZmluZCB3aGVyZSB0aGUgc2VjdGlvbiB3aWxsCi0gICAgIGxpdmUgaW4gdGhlIG91dHB1dCBhbmQgYWRkIHRoYXQgaW4gKi8KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIEJGRC4gIExvb2sgaXQgdXAgaW4gdGhlCi0JIGdsb2JhbCBsaW5rZXIgaGFzaCB0YWJsZS4gIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4KLQkgd2UgY29udmVydCBiLm91dCB0byB1c2UgYSBzcGVjaWZpYyBmaW5hbF9saW5rIGZ1bmN0aW9uIGFuZAotCSBjaGFuZ2UgdGhlIGludGVyZmFjZSB0byBiZmRfcmVsYXhfc2VjdGlvbiB0byBub3QgcmVxdWlyZSB0aGUKLQkgZ2VuZXJpYyBzeW1ib2xzLiAgKi8KLSAgICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChpbnB1dF9zZWN0aW9uLT5vd25lciwgbGlua19pbmZvLAotCQkJCQliZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCQkJCQlmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl2YWx1ZSA9IGgtPnUuZGVmLnZhbHVlICsgb3V0cHV0X2FkZHIgKGgtPnUuZGVmLnNlY3Rpb24pOwotICAgICAgZWxzZSBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCXZhbHVlID0gaC0+dS5jLnNpemU7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCQkgIGlucHV0X3NlY3Rpb24tPm93bmVyLCBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQkgIHZhbHVlID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBzeW1ib2wtPnZhbHVlICsgb3V0cHV0X2FkZHIgKHN5bWJvbC0+c2VjdGlvbik7Ci0gICAgfQotCi0gIC8qIEFkZCB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSByZWxvY2F0aW9uICovCi0gIHZhbHVlICs9IHJlbG9jLT5hZGRlbmQ7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgdm9pZAotcGVyZm9ybV9zbGlwIChhYmZkLCBzbGlwLCBpbnB1dF9zZWN0aW9uLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2xpcDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGFzeW1ib2wgKipzOwotCi0gIHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpOwotCi0gIC8qIEZpbmQgYWxsIHN5bWJvbHMgcGFzdCB0aGlzIHBvaW50LCBhbmQgbWFrZSB0aGVtIGtub3cKLSAgICAgd2hhdCdzIGhhcHBlbmVkICovCi0gIHdoaWxlICgqcykKLSAgewotICAgIGFzeW1ib2wgKnAgPSAqczsKLSAgICBpZiAocC0+c2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIC8qIFRoaXMgd2FzIHBvaW50aW5nIGludG8gdGhpcyBzZWN0aW9uLCBzbyBtYW5nbGUgaXQgKi8KLSAgICAgIGlmIChwLT52YWx1ZSA+IHZhbHVlKQotICAgICAgewotCXAtPnZhbHVlIC09c2xpcDsKLQlpZiAocC0+dWRhdGEucCAhPSBOVUxMKQotCSAgewotCSAgICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgaCA9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgcC0+dWRhdGEucDsKLQkgICAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCk7Ci0JICAgIGgtPnJvb3QudS5kZWYudmFsdWUgLT0gc2xpcDsKLQkgICAgQkZEX0FTU0VSVCAoaC0+cm9vdC51LmRlZi52YWx1ZSA9PSBwLT52YWx1ZSk7Ci0JICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHMrKzsKLQotICB9Ci19Ci0KLS8qIFRoaXMgcm91dGluZSB3b3JrcyBvdXQgaWYgdGhlIHRoaW5nIHdlIHdhbnQgdG8gZ2V0IHRvIGNhbiBiZQotICAgcmVhY2hlZCB3aXRoIGEgMjRiaXQgb2Zmc2V0IGluc3RlYWQgb2YgYSAzMiBiaXQgb25lLgotICAgSWYgaXQgY2FuLCB0aGVuIGl0IGNoYW5nZXMgdGhlIGFtb2RlICovCi0KLXN0YXRpYyBpbnQKLWFiczMyY29kZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgciwgc2hyaW5rLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGFyZWxlbnQgKnI7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGJmZF92bWEgdmFsdWUgPSBnZXRfdmFsdWUgKHIsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0gIGJmZF92bWEgZG90ID0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pICsgci0+YWRkcmVzczsKLSAgYmZkX3ZtYSBnYXA7Ci0KLSAgLyogU2VlIGlmIHRoZSBhZGRyZXNzIHdlJ3JlIGxvb2tpbmcgYXQgd2l0aGluIDJeMjMgYnl0ZXMgb2Ygd2hlcmUKLSAgICAgd2UgYXJlLCBpZiBzbyB0aGVuIHdlIGNhbiB1c2UgYSBzbWFsbCBicmFuY2ggcmF0aGVyIHRoYW4gdGhlCi0gICAgIGp1bXAgd2Ugd2VyZSBnb2luZyB0byAqLwotCi0gIGdhcCA9IHZhbHVlIC0gKGRvdCAtIHNocmluayk7Ci0KLQotICBpZiAoLTE8PDIzIDwgKGxvbmcpZ2FwICYmIChsb25nKWdhcCA8IDE8PDIzICkKLSAgewotICAgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBmcm9tIDMyYml0Y29kZSBwb3NzaWJsZSAyNCwgdG8gMjRiaXQKLSAgICAgICBwb3NzaWJsZSAzMiAqLwotCi0gICAgci0+aG93dG8gPSAmaG93dG9fcmVsb2NfYWJzMzJjb2Rlc2hydW5rOwotICAgIC8qIFRoZSBwbGFjZSB0byByZWxjIG1vdmVzIGJhY2sgYnkgZm91ciBieXRlcyAqLwotICAgIHItPmFkZHJlc3MgLT00OwotCi0gICAgLyogVGhpcyB3aWxsIGJlIGZvdXIgYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4gKi8KLSAgICBzaHJpbmsgKz0gNCA7Ci0gICAgcGVyZm9ybV9zbGlwIChhYmZkLCA0LCBpbnB1dF9zZWN0aW9uLCByLT5hZGRyZXNzLXNocmluayArIDQpOwotICB9Ci0gIHJldHVybiBzaHJpbms7Ci19Ci0KLXN0YXRpYyBpbnQKLWFsaWduY29kZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgciwgc2hyaW5rKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBhcmVsZW50ICpyOwotICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rOwotewotICBiZmRfdm1hIGRvdCA9IG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKSArIHItPmFkZHJlc3M7Ci0gIGJmZF92bWEgZ2FwOwotICBiZmRfdm1hIG9sZF9lbmQ7Ci0gIGJmZF92bWEgbmV3X2VuZDsKLSAgaW50IHNocmlua19kZWx0YTsKLSAgaW50IHNpemUgPSByLT5ob3d0by0+c2l6ZTsKLQotICAvKiBSZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGFsaWdubWVudCBzbyB0aGF0IGl0J3Mgc3RpbGwgYWxpZ25lZCBidXQKLSAgICAgc21hbGxlciAgLSB0aGUgY3VycmVudCBzaXplIGlzIGFscmVhZHkgdGhlIHNhbWUgc2l6ZSBhcyBvciBiaWdnZXIKLSAgICAgdGhhbiB0aGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgKi8KLQotICAvKiBjYWxjdWxhdGUgdGhlIGZpcnN0IGJ5dGUgZm9sbG93aW5nIHRoZSBwYWRkaW5nIGJlZm9yZSB3ZSBvcHRpbWl6ZSAqLwotICBvbGRfZW5kID0gKChkb3QgKyBzaXplICkgJiB+c2l6ZSkgKyBzaXplKzE7Ci0gIC8qIHdvcmsgb3V0IHdoZXJlIHRoZSBuZXcgZW5kIHdpbGwgYmUgLSByZW1lbWJlciB0aGF0IHdlJ3JlIHNtYWxsZXIKLSAgICAgdGhhbiB3ZSB1c2VkIHRvIGJlICovCi0gIG5ld19lbmQgPSAoKGRvdCAtIHNocmluayArIHNpemUpICYgfnNpemUpOwotCi0gIC8qIFRoaXMgaXMgdGhlIG5ldyBlbmQgKi8KLSAgZ2FwID0gb2xkX2VuZCAtICgoZG90ICsgc2l6ZSkgJiB+c2l6ZSk7Ci0KLSAgc2hyaW5rX2RlbHRhID0gKG9sZF9lbmQgLSBuZXdfZW5kKSAtIHNocmluazsKLQotICBpZiAoc2hyaW5rX2RlbHRhKQotICB7Ci0gICAgLyogQ2hhbmdlIHRoZSByZWxvYyBzbyB0aGF0IGl0IGtub3dzIGhvdyBmYXIgdG8gYWxpZ24gdG8gKi8KLSAgICByLT5ob3d0byA9IGhvd3RvX2RvbmVfYWxpZ25fdGFibGUgKyAoci0+aG93dG8gLSBob3d0b19hbGlnbl90YWJsZSk7Ci0KLSAgICAvKiBFbmNvZGUgdGhlIHN0dWZmIGludG8gdGhlIGFkZGVuZCAtIGZvciBmdXR1cmUgdXNlIHdlIG5lZWQgdG8KLSAgICAgICBrbm93IGhvdyBiaWcgdGhlIHJlbG9jIHVzZWQgdG8gYmUgKi8KLSAgICByLT5hZGRlbmQgPSBvbGRfZW5kIC0gZG90ICsgci0+YWRkcmVzczsKLQotICAgIC8qIFRoaXMgd2lsbCBiZSBOIGJ5dGVzIHNtYWxsZXIgaW4gdGhlIGxvbmcgcnVuLCBhZGp1c3QgYWxsIHRoZSBzeW1ib2xzICovCi0gICAgcGVyZm9ybV9zbGlwIChhYmZkLCBzaHJpbmtfZGVsdGEsIGlucHV0X3NlY3Rpb24sIHItPmFkZHJlc3MgLSBzaHJpbmspOwotICAgIHNocmluayArPSBzaHJpbmtfZGVsdGE7Ci0gIH0KLSAgcmV0dXJuIHNocmluazsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X2JmZF9yZWxheF9zZWN0aW9uIChhYmZkLCBpLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBpLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBpOwotICBpbnQgc2hyaW5rID0gMCA7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKGlucHV0X2JmZCwKLQkJCQkJICAgICAgaW5wdXRfc2VjdGlvbik7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSBvbmx5IHJ1biB0aGlzIHJlbGF4YXRpb24gb25jZS4gIEl0IG1pZ2h0IHdvcmsgdG8gcnVuIGl0Ci0gICAgIG11bHRpcGxlIHRpbWVzLCBidXQgaXQgaGFzbid0IGJlZW4gdGVzdGVkLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgaWYgKHJlbG9jX3NpemUpCi0gICAgewotICAgICAgbG9uZyByZWxvY19jb3VudDsKLQotICAgICAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICAgICAgaWYgKHJlbG9jX3ZlY3RvciA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogR2V0IHRoZSByZWxvY3MgYW5kIHRoaW5rIGFib3V0IHRoZW0gKi8KLSAgICAgIHJlbG9jX2NvdW50ID0KLQliZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jX3ZlY3RvciwKLQkJCQlfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKSk7Ci0gICAgICBpZiAocmVsb2NfY291bnQgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLQl7Ci0JICBhcmVsZW50ICoqcGFyZW50OwotCSAgZm9yIChwYXJlbnQgPSByZWxvY192ZWN0b3I7ICpwYXJlbnQ7IHBhcmVudCsrKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqciA9ICpwYXJlbnQ7Ci0JICAgICAgc3dpdGNoIChyLT5ob3d0by0+dHlwZSkKLQkJewotCQljYXNlIEFMSUdORVI6Ci0JCSAgLyogQW4gYWxpZ25tZW50IHJlbG9jICovCi0JCSAgc2hyaW5rID0gYWxpZ25jb2RlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmspOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzMyQ09ERToKLQkJICAvKiBBIDMyYml0IHJlbG9jIGluIGFuIGFkZHJlc3NpbmcgbW9kZSAqLwotCQkgIHNocmluayA9IGFiczMyY29kZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmssCi0JCQkJICAgICAgbGlua19pbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSBBQlMzMkNPREVfU0hSVU5LOgotCQkgIHNocmluays9NDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplIC0gc2hyaW5rOwotCi0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1iX291dF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSAgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLAotCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX2NvdW50OwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBJZiBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgZG9uJ3QgYm90aGVyIHRvIHJlbGF4LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwKLQkJCQkJCSAgICAgICBkYXRhLCByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlucHV0X3NlY3Rpb24tPnJlbG9jX2RvbmUgPSAxOwotCi0gIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KLSAgQkZEX0FTU0VSVCAodHJ1ZSA9PSBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwKLQkJCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCQlkYXRhLAotCQkJCQkJMCwKLQkJCQkJCWlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpOwotCi0gIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQlyZWxvY192ZWN0b3IsCi0JCQkJCXN5bWJvbHMpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAocmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipwYXJlbnQgPSByZWxvY192ZWN0b3I7Ci0gICAgICBhcmVsZW50ICpyZWxvYyA7Ci0KLSAgICAgIHVuc2lnbmVkIGludCBkc3RfYWRkcmVzcyA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAwOwotICAgICAgdW5zaWduZWQgaW50IHJ1bjsKLSAgICAgIHVuc2lnbmVkIGludCBpZHg7Ci0KLSAgICAgIC8qIEZpbmQgaG93IGxvbmcgYSBydW4gd2UgY2FuIGRvICovCi0gICAgICB3aGlsZSAoZHN0X2FkZHJlc3MgPCBsaW5rX29yZGVyLT5zaXplKQotCXsKLQkgIHJlbG9jID0gKnBhcmVudDsKLQkgIGlmIChyZWxvYykKLQkgICAgewotCSAgICAgIC8qIE5vdGUgdGhhdCB0aGUgcmVsYXhpbmcgZGlkbid0IHRpZSB1cCB0aGUgYWRkcmVzc2VzIGluIHRoZQotCQkgcmVsb2NhdGlvbiwgc28gd2UgdXNlIHRoZSBvcmlnaW5hbCBhZGRyZXNzIHRvIHdvcmsgb3V0IHRoZQotCQkgcnVuIG9mIG5vbi1yZWxvY2F0ZWQgZGF0YSAqLwotCSAgICAgIEJGRF9BU1NFUlQgKHJlbG9jLT5hZGRyZXNzID49IHNyY19hZGRyZXNzKTsKLQkgICAgICBydW4gPSByZWxvYy0+YWRkcmVzcyAtIHNyY19hZGRyZXNzOwotCSAgICAgIHBhcmVudCsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBydW4gPSBsaW5rX29yZGVyLT5zaXplIC0gZHN0X2FkZHJlc3M7Ci0JICAgIH0KLQkgIC8qIENvcHkgdGhlIGJ5dGVzICovCi0JICBmb3IgKGlkeCA9IDA7IGlkeCA8IHJ1bjsgaWR4KyspCi0JICAgIHsKLQkgICAgICBkYXRhW2RzdF9hZGRyZXNzKytdID0gZGF0YVtzcmNfYWRkcmVzcysrXTsKLQkgICAgfQotCi0JICAvKiBOb3cgZG8gdGhlIHJlbG9jYXRpb24gKi8KLQotCSAgaWYgKHJlbG9jKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0JCXsKLQkJY2FzZSBBQlMzMkNPREU6Ci0JCSAgY2FsbGp4X2NhbGxiYWNrIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgcmVsb2MsCi0JCQkJICAgc3JjX2FkZHJlc3MgKyBkYXRhLCBkc3RfYWRkcmVzcyArIGRhdGEsCi0JCQkJICAgaW5wdXRfc2VjdGlvbik7Ci0JCSAgc3JjX2FkZHJlc3MrPTQ7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMzI6Ci0JCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCQkJICAgICAgKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgZGF0YSArIHNyY19hZGRyZXNzKQotCQkJICAgICAgICsgZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSksCi0JCQkgICAgICBkYXRhICsgZHN0X2FkZHJlc3MpOwotCQkgIHNyY19hZGRyZXNzKz00OwotCQkgIGRzdF9hZGRyZXNzKz00OwotCQkgIGJyZWFrOwotCQljYXNlIENBTExKOgotCQkgIGNhbGxqX2NhbGxiYWNrIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgcmVsb2MsIGRhdGEsCi0JCQkJICBzcmNfYWRkcmVzcywgZHN0X2FkZHJlc3MsIGlucHV0X3NlY3Rpb24sCi0JCQkJICBmYWxzZSk7Ci0JCSAgc3JjX2FkZHJlc3MrPTQ7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUxJR05ET05FOgotCQkgIEJGRF9BU1NFUlQgKHJlbG9jLT5hZGRlbmQgPj0gc3JjX2FkZHJlc3MpOwotCQkgIEJGRF9BU1NFUlQgKHJlbG9jLT5hZGRlbmQgPD0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICBzcmNfYWRkcmVzcyA9IHJlbG9jLT5hZGRlbmQ7Ci0JCSAgZHN0X2FkZHJlc3MgPSAoKGRzdF9hZGRyZXNzICsgcmVsb2MtPmhvd3RvLT5zaXplKQotCQkJCSAmIH5yZWxvYy0+aG93dG8tPnNpemUpOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzMyQ09ERV9TSFJVTks6Ci0JCSAgLyogVGhpcyB1c2VkIHRvIGJlIGEgY2FsbHgsIGJ1dCB3ZSd2ZSBmb3VuZCBvdXQgdGhhdCBhCi0JCSAgICAgY2FsbGogd2lsbCByZWFjaCwgc28gZG8gdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQkJICBjYWxsal9jYWxsYmFjayAoaW5wdXRfYmZkLCBsaW5rX2luZm8sIHJlbG9jLCBkYXRhLAotCQkJCSAgc3JjX2FkZHJlc3MgKyA0LCBkc3RfYWRkcmVzcywgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIHRydWUpOwotCQkgIGRzdF9hZGRyZXNzKz00OwotCQkgIHNyY19hZGRyZXNzKz04OwotCQkgIGJyZWFrOwotCQljYXNlIFBDUkVMMjQ6Ci0JCSAgewotCQkgICAgbG9uZyBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkJCWRhdGEgKyBzcmNfYWRkcmVzcyk7Ci0JCSAgICBiZmRfdm1hIHZhbHVlOwotCi0JCSAgICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JCSAgICB3b3JkID0gKCh3b3JkICYgfkJBTF9NQVNLKQotCQkJICAgIHwgKCgod29yZCAmIEJBTF9NQVNLKQotCQkJCSsgdmFsdWUKLQkJCQktIG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKQotCQkJCSsgcmVsb2MtPmFkZGVuZCkKLQkJCSAgICAgICAmIEJBTF9NQVNLKSk7Ci0KLQkJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgd29yZCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkJICAgIGRzdF9hZGRyZXNzKz00OwotCQkgICAgc3JjX2FkZHJlc3MrPTQ7Ci0KLQkJICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBQQ1JFTDEzOgotCQkgIHsKLQkJICAgIGxvbmcgaW50IHdvcmQgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJCQlkYXRhICsgc3JjX2FkZHJlc3MpOwotCQkgICAgYmZkX3ZtYSB2YWx1ZTsKLQotCQkgICAgdmFsdWUgPSBnZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCQkgICAgd29yZCA9ICgod29yZCAmIH5QQ1JFTDEzX01BU0spCi0JCQkgICAgfCAoKCh3b3JkICYgUENSRUwxM19NQVNLKQotCQkJCSsgdmFsdWUKLQkJCQkrIHJlbG9jLT5hZGRlbmQKLQkJCQktIG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKSkKLQkJCSAgICAgICAmIFBDUkVMMTNfTUFTSykpOwotCi0JCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHdvcmQsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JCSAgICBkc3RfYWRkcmVzcys9NDsKLQkJICAgIHNyY19hZGRyZXNzKz00OwotCi0JCSAgfQotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQoKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBkYXRhOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBOVUxMOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBCdWlsZCB0aGUgdHJhbnNmZXIgdmVjdG9ycyBmb3IgQmlnIGFuZCBMaXR0bGUtRW5kaWFuIEIuT1VUIGZpbGVzLiAgKi8KLQotI2RlZmluZSBhb3V0XzMyX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCBhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgYl9vdXRfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYl9vdXRfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgYl9vdXRfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYl9vdXRfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBiX291dF9iZmRfZ2Nfc2VjdGlvbnMgIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLSNkZWZpbmUgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJfb3V0X3ZlY19saXR0bGVfaG9zdDsKLQotY29uc3QgYmZkX3RhcmdldCBiX291dF92ZWNfYmlnX2hvc3QgPQotewotICAiYi5vdXQuYmlnIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZHIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUgKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAnXycsCQkJCS8qIHN5bWJvbCBsZWFkaW5nIGNoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLSB7X2JmZF9kdW1teV90YXJnZXQsIGJfb3V0X29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBiX291dF9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0ge2JmZF9mYWxzZSwgYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmIGJfb3V0X3ZlY19saXR0bGVfaG9zdCwKLSAgCi0gIChQVFIpIDAsCi19OwotCi0KLWNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2xpdHRsZV9ob3N0ID0KLXsKLSAgImIub3V0LmxpdHRsZSIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUgKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAnXycsCQkJCS8qIHN5bWJvbCBsZWFkaW5nIGNoYXIgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGJfb3V0X29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBiX291dF9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiX291dCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGJfb3V0KSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICYgYl9vdXRfdmVjX2JpZ19ob3N0LAotICAKLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jYWNoZS5jIGIvYmZkL2NhY2hlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOGRlNGIuLjAwMDAwMDAKLS0tIGEvYmZkL2NhY2hlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgLS0gY2FjaGluZyBvZiBmaWxlIGRlc2NyaXB0b3JzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCAoc3RldmVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlGaWxlIGNhY2hpbmcKLQotCVRoZSBmaWxlIGNhY2hpbmcgbWVjaGFuaXNtIGlzIGVtYmVkZGVkIHdpdGhpbiBCRkQgYW5kIGFsbG93cwotCXRoZSBhcHBsaWNhdGlvbiB0byBvcGVuIGFzIG1hbnkgQkZEcyBhcyBpdCB3YW50cyB3aXRob3V0Ci0JcmVnYXJkIHRvIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0ncyBmaWxlIGRlc2NyaXB0b3IKLQlsaW1pdCAob2Z0ZW4gYXMgbG93IGFzIDIwIG9wZW4gZmlsZXMpLiAgVGhlIG1vZHVsZSBpbgotCTw8Y2FjaGUuYz4+IG1haW50YWlucyBhIGxlYXN0IHJlY2VudGx5IHVzZWQgbGlzdCBvZgotCTw8QkZEX0NBQ0hFX01BWF9PUEVOPj4gZmlsZXMsIGFuZCBleHBvcnRzIHRoZSBuYW1lCi0JPDxiZmRfY2FjaGVfbG9va3VwPj4sIHdoaWNoIHJ1bnMgYXJvdW5kIGFuZCBtYWtlcyBzdXJlIHRoYXQKLQl0aGUgcmVxdWlyZWQgQkZEIGlzIG9wZW4uIElmIG5vdCwgdGhlbiBpdCBjaG9vc2VzIGEgZmlsZSB0bwotCWNsb3NlLCBjbG9zZXMgaXQgYW5kIG9wZW5zIHRoZSBvbmUgd2FudGVkLCByZXR1cm5pbmcgaXRzIGZpbGUKLQloYW5kbGUuIAotCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLXN0YXRpYyB2b2lkIGluc2VydCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgc25pcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY2xvc2Vfb25lIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGJmZF9jYWNoZV9kZWxldGUgUEFSQU1TICgoYmZkICopKTsKLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JQkZEX0NBQ0hFX01BWF9PUEVOIG1hY3JvCi0KLURFU0NSSVBUSU9OCi0JVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHdoaWNoIHRoZSBjYWNoZSB3aWxsIGtlZXAgb3BlbiBhdAotCW9uZSB0aW1lLgotCi0uI2RlZmluZSBCRkRfQ0FDSEVfTUFYX09QRU4gMTAKLQotKi8KLQotLyogVGhlIG51bWJlciBvZiBCRkQgZmlsZXMgd2UgaGF2ZSBvcGVuLiAgKi8KLQotc3RhdGljIGludCBvcGVuX2ZpbGVzOwotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfbGFzdF9jYWNoZQotCi1TWU5PUFNJUwotCWV4dGVybiBiZmQgKmJmZF9sYXN0X2NhY2hlOwotCi1ERVNDUklQVElPTgotCVplcm8sIG9yIGEgcG9pbnRlciB0byB0aGUgdG9wbW9zdCBCRkQgb24gdGhlIGNoYWluLiAgVGhpcyBpcwotCXVzZWQgYnkgdGhlIDw8YmZkX2NhY2hlX2xvb2t1cD4+IG1hY3JvIGluIEBmaWxle2xpYmJmZC5ofSB0bwotCWRldGVybWluZSB3aGVuIGl0IGNhbiBhdm9pZCBhIGZ1bmN0aW9uIGNhbGwuCi0qLwotCi1iZmQgKmJmZF9sYXN0X2NhY2hlOwotCi0vKgotICBJTlRFUk5BTF9GVU5DVElPTgotICAJYmZkX2NhY2hlX2xvb2t1cAotIAotICBERVNDUklQVElPTgotIAlDaGVjayB0byBzZWUgaWYgdGhlIHJlcXVpcmVkIEJGRCBpcyB0aGUgc2FtZSBhcyB0aGUgbGFzdCBvbmUKLSAJbG9va2VkIHVwLiBJZiBzbywgdGhlbiBpdCBjYW4gdXNlIHRoZSBzdHJlYW0gaW4gdGhlIEJGRCB3aXRoCi0gCWltcHVuaXR5LCBzaW5jZSBpdCBjYW4ndCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgbG9va3VwOwotIAlvdGhlcndpc2UsIGl0IGhhcyB0byBwZXJmb3JtIHRoZSBjb21wbGljYXRlZCBsb29rdXAgZnVuY3Rpb24uCi0gCi0gIC4jZGVmaW5lIGJmZF9jYWNoZV9sb29rdXAoeCkgXAotICAuICAgICgoeCk9PWJmZF9sYXN0X2NhY2hlPyBcCi0gIC4gICAgICAoRklMRSopKGJmZF9sYXN0X2NhY2hlLT5pb3N0cmVhbSk6IFwKLSAgLiAgICAgICBiZmRfY2FjaGVfbG9va3VwX3dvcmtlcih4KSkKLSAKLSAKLSAqLwotCi0vKiBJbnNlcnQgYSBCRkQgaW50byB0aGUgY2FjaGUuICAqLwotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWluc2VydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYmZkX2xhc3RfY2FjaGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhYmZkLT5scnVfbmV4dCA9IGFiZmQ7Ci0gICAgICBhYmZkLT5scnVfcHJldiA9IGFiZmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWJmZC0+bHJ1X25leHQgPSBiZmRfbGFzdF9jYWNoZTsKLSAgICAgIGFiZmQtPmxydV9wcmV2ID0gYmZkX2xhc3RfY2FjaGUtPmxydV9wcmV2OwotICAgICAgYWJmZC0+bHJ1X3ByZXYtPmxydV9uZXh0ID0gYWJmZDsKLSAgICAgIGFiZmQtPmxydV9uZXh0LT5scnVfcHJldiA9IGFiZmQ7Ci0gICAgfQotICBiZmRfbGFzdF9jYWNoZSA9IGFiZmQ7Ci19Ci0KLS8qIFJlbW92ZSBhIEJGRCBmcm9tIHRoZSBjYWNoZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgdm9pZAotc25pcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT5scnVfcHJldi0+bHJ1X25leHQgPSBhYmZkLT5scnVfbmV4dDsKLSAgYWJmZC0+bHJ1X25leHQtPmxydV9wcmV2ID0gYWJmZC0+bHJ1X3ByZXY7Ci0gIGlmIChhYmZkID09IGJmZF9sYXN0X2NhY2hlKQotICAgIHsKLSAgICAgIGJmZF9sYXN0X2NhY2hlID0gYWJmZC0+bHJ1X25leHQ7Ci0gICAgICBpZiAoYWJmZCA9PSBiZmRfbGFzdF9jYWNoZSkKLQliZmRfbGFzdF9jYWNoZSA9IE5VTEw7Ci0gICAgfQotfQotCi0vKiBXZSBuZWVkIHRvIG9wZW4gYSBuZXcgZmlsZSwgYW5kIHRoZSBjYWNoZSBpcyBmdWxsLiAgRmluZCB0aGUgbGVhc3QKLSAgIHJlY2VudGx5IHVzZWQgY2FjaGVhYmxlIEJGRCBhbmQgY2xvc2UgaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY2xvc2Vfb25lICgpCi17Ci0gIHJlZ2lzdGVyIGJmZCAqa2lsbDsKLQotICBpZiAoYmZkX2xhc3RfY2FjaGUgPT0gTlVMTCkKLSAgICBraWxsID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoa2lsbCA9IGJmZF9sYXN0X2NhY2hlLT5scnVfcHJldjsKLQkgICAhIGtpbGwtPmNhY2hlYWJsZTsKLQkgICBraWxsID0ga2lsbC0+bHJ1X3ByZXYpCi0JewotCSAgaWYgKGtpbGwgPT0gYmZkX2xhc3RfY2FjaGUpCi0JICAgIHsKLQkgICAgICBraWxsID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGtpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBhcmUgbm8gb3BlbiBjYWNoZWFibGUgQkZEJ3MuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGtpbGwtPndoZXJlID0gZnRlbGwgKChGSUxFICopIGtpbGwtPmlvc3RyZWFtKTsKLQotICByZXR1cm4gYmZkX2NhY2hlX2RlbGV0ZSAoa2lsbCk7Ci19Ci0KLS8qIENsb3NlIGEgQkZEIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgY2FjaGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYmZkX2NhY2hlX2RlbGV0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBib29sZWFuIHJldDsKLQotICBpZiAoZmNsb3NlICgoRklMRSAqKSBhYmZkLT5pb3N0cmVhbSkgPT0gMCkKLSAgICByZXQgPSB0cnVlOwotICBlbHNlCi0gICAgewotICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgIH0KLQotICBzbmlwIChhYmZkKTsKLQotICBhYmZkLT5pb3N0cmVhbSA9IE5VTEw7Ci0gIC0tb3Blbl9maWxlczsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfY2FjaGVfaW5pdAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NhY2hlX2luaXQgKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JQWRkIGEgbmV3bHkgb3BlbmVkIEJGRCB0byB0aGUgY2FjaGUuCi0qLwotCi1ib29sZWFuCi1iZmRfY2FjaGVfaW5pdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBCRkRfQVNTRVJUIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMKTsKLSAgaWYgKG9wZW5fZmlsZXMgPj0gQkZEX0NBQ0hFX01BWF9PUEVOKQotICAgIHsKLSAgICAgIGlmICghIGNsb3NlX29uZSAoKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpbnNlcnQgKGFiZmQpOwotICArK29wZW5fZmlsZXM7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfY2FjaGVfY2xvc2UKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jYWNoZV9jbG9zZSAoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZW1vdmUgdGhlIEJGRCBAdmFye2FiZmR9IGZyb20gdGhlIGNhY2hlLiBJZiB0aGUgYXR0YWNoZWQgZmlsZSBpcyBvcGVuLAotCXRoZW4gY2xvc2UgaXQgdG9vLgotCi1SRVRVUk5TCi0JPDxmYWxzZT4+IGlzIHJldHVybmVkIGlmIGNsb3NpbmcgdGhlIGZpbGUgZmFpbHMsIDw8dHJ1ZT4+IGlzCi0JcmV0dXJuZWQgaWYgYWxsIGlzIHdlbGwuCi0qLwotCi1ib29sZWFuCi1iZmRfY2FjaGVfY2xvc2UgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmlvc3RyZWFtID09IE5VTEwKLSAgICAgIHx8IChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGJmZF9jYWNoZV9kZWxldGUgKGFiZmQpOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfb3Blbl9maWxlCi0KLVNZTk9QU0lTCi0JRklMRSogYmZkX29wZW5fZmlsZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCUNhbGwgdGhlIE9TIHRvIG9wZW4gYSBmaWxlIGZvciBAdmFye2FiZmR9LiAgUmV0dXJuIHRoZSA8PEZJTEUgKj4+Ci0JKHBvc3NpYmx5IDw8TlVMTD4+KSB0aGF0IHJlc3VsdHMgZnJvbSB0aGlzIG9wZXJhdGlvbi4gIFNldCB1cCB0aGUKLQlCRkQgc28gdGhhdCBmdXR1cmUgYWNjZXNzZXMga25vdyB0aGUgZmlsZSBpcyBvcGVuLiBJZiB0aGUgPDxGSUxFICo+PgotCXJldHVybmVkIGlzIDw8TlVMTD4+LCB0aGVuIGl0IHdvbid0IGhhdmUgYmVlbiBwdXQgaW4gdGhlCi0JY2FjaGUsIHNvIGl0IHdvbid0IGhhdmUgdG8gYmUgcmVtb3ZlZCBmcm9tIGl0LgotKi8KLQotRklMRSAqCi1iZmRfb3Blbl9maWxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPmNhY2hlYWJsZSA9IHRydWU7CS8qIEFsbG93IGl0IHRvIGJlIGNsb3NlZCBsYXRlci4gKi8KLQotICBpZiAob3Blbl9maWxlcyA+PSBCRkRfQ0FDSEVfTUFYX09QRU4pCi0gICAgewotICAgICAgaWYgKCEgY2xvc2Vfb25lICgpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICBzd2l0Y2ggKGFiZmQtPmRpcmVjdGlvbikKLSAgICB7Ci0gICAgY2FzZSByZWFkX2RpcmVjdGlvbjoKLSAgICBjYXNlIG5vX2RpcmVjdGlvbjoKLSAgICAgIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGFiZmQtPmZpbGVuYW1lLCBGT1BFTl9SQik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJvdGhfZGlyZWN0aW9uOgotICAgIGNhc2Ugd3JpdGVfZGlyZWN0aW9uOgotICAgICAgaWYgKGFiZmQtPm9wZW5lZF9vbmNlID09IHRydWUpCi0JewotCSAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoYWJmZC0+ZmlsZW5hbWUsIEZPUEVOX1JVQik7Ci0JICBpZiAoYWJmZC0+aW9zdHJlYW0gPT0gTlVMTCkKLQkgICAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoYWJmZC0+ZmlsZW5hbWUsIEZPUEVOX1dVQik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIENyZWF0ZSB0aGUgZmlsZS4gIFVubGluayBpdCBmaXJzdCwgZm9yIHRoZSBjb252ZW5pZW5jZSBvZgotICAgICAgICAgICAgIG9wZXJhdGluZyBzeXN0ZW1zIHdoaWNoIHdvcnJ5IGFib3V0IG92ZXJ3cml0aW5nIHJ1bm5pbmcKLSAgICAgICAgICAgICBiaW5hcmllcy4gICovCi0JICB1bmxpbmsgKGFiZmQtPmZpbGVuYW1lKTsKLQkgIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGFiZmQtPmZpbGVuYW1lLCBGT1BFTl9XQik7Ci0JICBhYmZkLT5vcGVuZWRfb25jZSA9IHRydWU7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jYWNoZV9pbml0IChhYmZkKSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChGSUxFICopIGFiZmQtPmlvc3RyZWFtOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfY2FjaGVfbG9va3VwX3dvcmtlcgotCi1TWU5PUFNJUwotCUZJTEUgKmJmZF9jYWNoZV9sb29rdXBfd29ya2VyKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbGVkIHdoZW4gdGhlIG1hY3JvIDw8YmZkX2NhY2hlX2xvb2t1cD4+IGZhaWxzIHRvIGZpbmQgYQotCXF1aWNrIGFuc3dlci4gIEZpbmQgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIEB2YXJ7YWJmZH0uICBJZgotCW5lY2Vzc2FyeSwgaXQgb3BlbiBpdC4gIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vcmUgdGhhbgotCTw8QkZEX0NBQ0hFX01BWF9PUEVOPj4gZmlsZXMgb3BlbiwgaXQgdHJpZXMgdG8gY2xvc2Ugb25lIGZpcnN0LCB0bwotCWF2b2lkIHJ1bm5pbmcgb3V0IG9mIGZpbGUgZGVzY3JpcHRvcnMuICAKLSovCi0KLUZJTEUgKgotYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGFiZmQtPm15X2FyY2hpdmUpIAotICAgIGFiZmQgPSBhYmZkLT5teV9hcmNoaXZlOwotCi0gIGlmIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE1vdmUgdGhlIGZpbGUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjYWNoZS4gICovCi0gICAgICBpZiAoYWJmZCAhPSBiZmRfbGFzdF9jYWNoZSkKLQl7Ci0JICBzbmlwIChhYmZkKTsKLQkgIGluc2VydCAoYWJmZCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChiZmRfb3Blbl9maWxlIChhYmZkKSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgICAgaWYgKGZzZWVrICgoRklMRSAqKSBhYmZkLT5pb3N0cmVhbSwgYWJmZC0+d2hlcmUsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKEZJTEUgKikgYWJmZC0+aW9zdHJlYW07Ci19CmRpZmYgLS1naXQgYS9iZmQvY2YtaTM4Nmx5bnguYyBiL2JmZC9jZi1pMzg2bHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTE0YmRlLi4wMDAwMDAwCi0tLSBhL2JmZC9jZi1pMzg2bHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgQ09GRiBMeW54T1MgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jZGVmaW5lIFRBUkdFVF9TWU0JaTM4Nmx5bnhfY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtaTM4Ni1seW54IgotCi0jZGVmaW5lIExZTlhPUwotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgpkaWZmIC0tZ2l0IGEvYmZkL2NmLW02OGtseW54LmMgYi9iZmQvY2YtbTY4a2x5bnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3NGYxYi4uMDAwMDAwMAotLS0gYS9iZmQvY2YtbTY4a2x5bnguYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgTTY4SyBDT0ZGIEx5bnhPUyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JbTY4a2x5bnhfY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtbTY4ay1seW54IgotI2RlZmluZSBMWU5YT1MKLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotI2RlZmluZSBTVEFUSUNfUkVMT0NTCi0jZGVmaW5lIENPRkZfQ09NTU9OX0FEREVORAotCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCmRpZmYgLS1naXQgYS9iZmQvY2Ytc3BhcmNseW54LmMgYi9iZmQvY2Ytc3BhcmNseW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NGEwOTkuLjAwMDAwMDAKLS0tIGEvYmZkL2NmLXNwYXJjbHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBTcGFyYyBDT0ZGIEx5bnhPUyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0Jc3BhcmNseW54X2NvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLXNwYXJjLWx5bngiCi0KLSNkZWZpbmUgTFlOWE9TCi0KLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0jaW5jbHVkZSAiY29mZi1zcGFyYy5jIgpkaWZmIC0tZ2l0IGEvYmZkL2Npc2NvLWNvcmUuYyBiL2JmZC9jaXNjby1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTJlNzUuLjAwMDAwMDAKLS0tIGEvYmZkL2Npc2NvLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIENJU0NPIGNyYXNoIGR1bXBzLgotCi1Db3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0vKiBjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgcmV0dXJucyBhIGhvc3Qgc2lnbmFsICh0aGlzIHByb2JhYmx5IHNob3VsZAotICAgYmUgZml4ZWQpLiAgKi8KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogZm9yIE1TVkMgYnVpbGRzICovCi0jaWZuZGVmIFNJR1RSQVAKLSMgZGVmaW5lIFNJR1RSQVAgNQotI2VuZGlmCi0jaWZuZGVmIFNJR0VNVAotIyBkZWZpbmUgU0lHRU1UIDYKLSNlbmRpZgotI2lmbmRlZiBTSUdCVVMKLSMgZGVmaW5lIFNJR0JVUyAxMAotI2VuZGlmCi0MCi1pbnQgY3Jhc2hfaW5mb19sb2NzW10gPSB7Ci0gIDB4MDI1MCwJLyogbWlwcywgcHBjLCB4ODYsIGk5NjAgKi8KLSAgMHgwNDAwLAkvKiBtNjhrLCBtaXBzLCB4ODYsIGk5NjAgKi8KLSAgMHgwRkZDLAkvKiBtNjhrLCBtaXBzLCBwcGMsIHg4NiwgaTk2MCAqLwotICAweDMwMDAsCS8qIHBwYyAqLwotICAweDRGRkMsCS8qIG02OGsgKi8KLSAgLTEKLX07Ci0KLSNkZWZpbmUgQ1JBU0hfTUFHSUMJMHhkZWFkMTIzNAotI2RlZmluZSBNQVNLX0FERFIoeCkJKCh4KSAmIDB4MGZmZmZmZmYpCS8qIE1hc2sgY3Jhc2ggaW5mbyBhZGRyZXNzICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgQ1JBU0hfUkVBU09OX05PVENSQVNIRUQgPSAwLAotICAgIENSQVNIX1JFQVNPTl9FWENFUFRJT04gPSAxLAotICAgIENSQVNIX1JFQVNPTl9DT1JSVVBUID0gMiwKLX0gY3Jhc2hyZWFzb247Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciBtYWdpY1s0XTsJCS8qIE1hZ2ljIG51bWJlciAqLwotICBjaGFyIHZlcnNpb25bNF07CQkvKiBWZXJzaW9uIG51bWJlciAqLwotICBjaGFyIHJlYXNvbls0XTsJCS8qIENyYXNoIHJlYXNvbiAqLwotICBjaGFyIGNwdV92ZWN0b3JbNF07CQkvKiBDUFUgdmVjdG9yIGZvciBleGNlcHRpb25zICovCi0gIGNoYXIgcmVnaXN0ZXJzWzRdOwkJLyogUG9pbnRlciB0byBzYXZlZCByZWdpc3RlcnMgKi8KLSAgY2hhciByYW1iYXNlWzRdOwkJLyogQmFzZSBvZiBSQU0gKG5vdCBpbiBWMSBjcmFzaCBpbmZvKSAqLwotICBjaGFyIHRleHRiYXNlWzRdOwkJLyogQmFzZSBvZiAudGV4dCBzZWN0aW9uIChub3QgaW4gVjMgY3Jhc2ggaW5mbykgKi8KLSAgY2hhciBkYXRhYmFzZVs0XTsJCS8qIEJhc2Ugb2YgLmRhdGEgc2VjdGlvbiAobm90IGluIFYzIGNyYXNoIGluZm8pICovCi0gIGNoYXIgYnNzYmFzZVs0XTsJCS8qIEJhc2Ugb2YgLmJzcyBzZWN0aW9uIChub3QgaW4gVjMgY3Jhc2ggaW5mbykgKi8KLX0gY3Jhc2hpbmZvX2V4dGVybmFsOwotDAotc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0Ci17Ci0gIGludCBzaWc7Ci19OwotDAotLyogRXhhbWluZSB0aGUgZmlsZSBmb3IgYSBjcmFzaCBpbmZvIHN0cnVjdCBhdCB0aGUgb2Zmc2V0IGdpdmVuIGJ5Ci0gICBDUkFTSF9JTkZPX0xPQy4gKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotY2lzY29fY29yZV9maWxlX3ZhbGlkYXRlIChhYmZkLCBjcmFzaF9pbmZvX2xvYykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY3Jhc2hfaW5mb19sb2M7Ci17Ci0gIGNoYXIgYnVmWzRdOwotICB1bnNpZ25lZCBpbnQgY3Jhc2hpbmZvX29mZnNldDsKLSAgY3Jhc2hpbmZvX2V4dGVybmFsIGNyYXNoaW5mbzsKLSAgaW50IG5yZWFkOwotICB1bnNpZ25lZCBpbnQgbWFnaWM7Ci0gIHVuc2lnbmVkIGludCB2ZXJzaW9uOwotICB1bnNpZ25lZCBpbnQgcmFtYmFzZTsKLSAgc2VjX3B0ciBhc2VjdDsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGNyYXNoX2luZm9fbG9jLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBucmVhZCA9IGJmZF9yZWFkIChidWYsIDEsIDQsIGFiZmQpOwotICBpZiAobnJlYWQgIT0gNCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGNyYXNoaW5mb19vZmZzZXQgPSBNQVNLX0FERFIgKGJmZF9nZXRfMzIgKGFiZmQsIGJ1ZikpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY3Jhc2hpbmZvX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgewotICAgICAgLyogTW9zdCBsaWtlbHkgd2UgZmFpbGVkIGJlY2F1c2Ugb2YgYSBib2d1cyAoaHVnZSkgb2Zmc2V0ICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBucmVhZCA9IGJmZF9yZWFkICgmY3Jhc2hpbmZvLCAxLCBzaXplb2YgKGNyYXNoaW5mbyksIGFiZmQpOwotICBpZiAobnJlYWQgIT0gc2l6ZW9mIChjcmFzaGluZm8pKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBtYWdpYyA9IGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5tYWdpYyk7Ci0gIGlmIChtYWdpYyAhPSBDUkFTSF9NQUdJQykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICB2ZXJzaW9uID0gYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLnZlcnNpb24pOwotICBpZiAodmVyc2lvbiA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIGlmICh2ZXJzaW9uID09IDEpCi0gICAgewotICAgICAgLyogVjEgY29yZSBkdW1wcyBkb24ndCBzcGVjaWZ5IHRoZSBkdW1wIGJhc2UsIGFzc3VtZSAwICovCi0gICAgICByYW1iYXNlID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByYW1iYXNlID0gYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLnJhbWJhc2UpOwotICAgIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUuICAqLwotCi0gIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YSA9Ci0gICAgKChzdHJ1Y3QgY2lzY29fY29yZV9zdHJ1Y3QgKikKLSAgICAgYmZkX3ptYWxsb2MgKHNpemVvZiAoc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0KSkpOwotICBpZiAoYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3dpdGNoICgoY3Jhc2hyZWFzb24pIGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5yZWFzb24pKQotICAgIHsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9OT1RDUkFTSEVEOgotICAgICAgLyogQ3Jhc2ggZmlsZSBwcm9iYWJseSBjYW1lIGZyb20gd3JpdGUgY29yZS4gICovCi0gICAgICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9DT1JSVVBUOgotICAgICAgLyogVGhlIGNyYXNoIGNvbnRleHQgYXJlYSB3YXMgY29ycnVwdCAtLSBwcm9jZWVkIHdpdGggY2F1dGlvbi4KLQkgV2UgaGF2ZSBubyB3YXkgb2YgcGFzc2luZyB0aGlzIGluZm9ybWF0aW9uIGJhY2sgdG8gdGhlIGNhbGxlci4gICovCi0gICAgICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENSQVNIX1JFQVNPTl9FWENFUFRJT046Ci0gICAgICAvKiBDcmFzaCBvY2N1cmVkIGR1ZSB0byBDUFUgZXhjZXB0aW9uLiAgKi8KLQotICAgICAgLyogVGhpcyBpcyA2OGstc3BlY2lmaWM7IGZvciBNSVBTIHdlJ2xsIG5lZWQgdG8gaW50ZXJwcmV0Ci0JIGNwdV92ZWN0b3IgZGlmZmVyZW50bHkgYmFzZWQgb24gdGhlIHRhcmdldCBjb25maWd1cmF0aW9uCi0JIChzaW5jZSBDSVNDTyBjb3JlIGZpbGVzIGRvbid0IHNlZW0gdG8gaGF2ZSB0aGUgcHJvY2Vzc29yCi0JIGVuY29kZWQgaW4gdGhlbSkuICAqLwotCi0gICAgICBzd2l0Y2ggKGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5jcHVfdmVjdG9yKSkKLQl7Ci0JICAgLyogYnVzIGVycm9yICAgICAgICAgICAqLwotCWNhc2UgMiA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHQlVTOyBicmVhazsKLQkgICAvKiBhZGRyZXNzIGVycm9yICAgICAgICovCi0JY2FzZSAzIDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdCVVM7IGJyZWFrOwotCSAgIC8qIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKi8KLQljYXNlIDQgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0lMTDsgIGJyZWFrOwotCSAgIC8qIHplcm8gZGl2aWRlICAgICAgICAgKi8KLQljYXNlIDUgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgIC8qIGNoayBpbnN0cnVjdGlvbiAgICAgKi8KLQljYXNlIDYgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgYnJlYWs7Ci0JICAgLyogdHJhcHYgaW5zdHJ1Y3Rpb24gICAqLwotCWNhc2UgNyA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyBicmVhazsKLQkgICAvKiBwcml2aWxlZ2UgdmlvbGF0aW9uICovCi0JY2FzZSA4IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdTRUdWOyBicmVhazsKLQkgICAvKiB0cmFjZSB0cmFwICAgICAgICAgICovCi0JY2FzZSA5IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdUUkFQOyAgYnJlYWs7Ci0JICAgLyogbGluZSAxMDEwIGVtdWxhdG9yICAqLwotCWNhc2UgMTA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSUxMOyAgYnJlYWs7Ci0JICAgLyogbGluZSAxMTExIGVtdWxhdG9yICAqLwotCWNhc2UgMTE6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSUxMOyAgYnJlYWs7Ci0KLQkgIC8qIENvcHJvY2Vzc29yIHByb3RvY29sIHZpb2xhdGlvbi4gIFVzaW5nIGEgc3RhbmRhcmQgTU1VIG9yIEZQVQotCSAgICAgdGhpcyBjYW5ub3QgYmUgdHJpZ2dlcmVkIGJ5IHNvZnR3YXJlLiAgQ2FsbCBpdCBhIFNJR0JVUy4gICovCi0JY2FzZSAxMzogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdCVVM7ICBicmVhazsKLQotCSAgLyogaW50ZXJydXB0ICAgICAgICAgICAqLwotCWNhc2UgMzE6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHSU5UOyAgYnJlYWs7Ci0JICAvKiBicmVha3BvaW50ICAgICAgICAgICovCi0JY2FzZSAzMzogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdUUkFQOyAgYnJlYWs7Ci0KLQkgIC8qIGZsb2F0aW5nIHBvaW50IGVyciAgKi8KLQljYXNlIDQ4OiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgLyogZmxvYXRpbmcgcG9pbnQgZXJyICAqLwotCWNhc2UgNDk6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAvKiB6ZXJvIGRpdmlkZSAgICAgICAgICovCi0JY2FzZSA1MDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQkgIC8qIHVuZGVyZmxvdyAgICAgICAgICAgKi8KLQljYXNlIDUxOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgLyogb3BlcmFuZCBlcnJvciAgICAgICAqLwotCWNhc2UgNTI6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAgLyogb3ZlcmZsb3cgICAgICAgICAgICAqLwotCWNhc2UgNTM6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAvKiBOQU4gICAgICAgICAgICAgICAgICovCi0JY2FzZSA1NDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQlkZWZhdWx0OgotI2lmbmRlZiBTSUdFTVQKLSNkZWZpbmUgU0lHRU1UIFNJR1RSQVAKLSNlbmRpZgotCSAgLyogInNvZnR3YXJlIGdlbmVyYXRlZCIqLwotCSAgYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdFTVQ7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFVua25vd24gY3Jhc2ggcmVhc29uLiAgKi8KLSAgICAgIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBhYmZkLT5zZWN0aW9ucyA9IE5VTEw7Ci0gIGFiZmQtPnNlY3Rpb25fY291bnQgPSAwOwotCi0gIC8qIENyZWF0ZSBhICIucmVnIiBzZWN0aW9uIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgc2F2ZWQKLSAgICAgcmVnaXN0ZXJzLiAqLwotCi0gIGFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96bWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChhc2VjdCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBhc2VjdC0+bmFtZSA9ICIucmVnIjsKLSAgYXNlY3QtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgYXNlY3QtPnZtYSA9IDA7Ci0gIGFzZWN0LT5maWxlcG9zID0gYmZkX2dldF8zMiAoYWJmZCwgY3Jhc2hpbmZvLnJlZ2lzdGVycykgLSByYW1iYXNlOwotICAvKiBTaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBleGFjdCBzaXplIG9mIHRoZSBzYXZlZCByZWdpc3RlciBpbmZvLAotICAgICBjaG9vc2UgYSByZWdpc3RlciBzZWN0aW9uIHNpemUgdGhhdCBpcyBlaXRoZXIgdGhlIHJlbWFpbmluZyBwYXJ0Ci0gICAgIG9mIHRoZSBmaWxlLCBvciAxMDI0LCB3aGljaGV2ZXIgaXMgc21hbGxlci4gKi8KLSAgbnJlYWQgPSBzdGF0YnVmLnN0X3NpemUgLSBhc2VjdC0+ZmlsZXBvczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IChucmVhZCA8IDEwMjQpID8gbnJlYWQgOiAxMDI0OwotICBhc2VjdC0+bmV4dCA9IGFiZmQtPnNlY3Rpb25zOwotICBhYmZkLT5zZWN0aW9ucyA9IGFzZWN0OwotICArK2FiZmQtPnNlY3Rpb25fY291bnQ7Ci0KLSAgLyogQ3JlYXRlIGEgIi5jcmFzaCIgc2VjdGlvbiB0byBhbGxvdyBhY2Nlc3MgdG8gdGhlIHNhdmVkCi0gICAgIGNyYXNoIGluZm9ybWF0aW9uLiAqLwotCi0gIGFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96bWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChhc2VjdCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBhc2VjdC0+bmFtZSA9ICIuY3Jhc2giOwotICBhc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBhc2VjdC0+dm1hID0gMDsKLSAgYXNlY3QtPmZpbGVwb3MgPSBjcmFzaGluZm9fb2Zmc2V0OwotICBhc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChjcmFzaGluZm8pOwotICBhc2VjdC0+bmV4dCA9IGFiZmQtPnNlY3Rpb25zOwotICBhYmZkLT5zZWN0aW9ucyA9IGFzZWN0OwotICArK2FiZmQtPnNlY3Rpb25fY291bnQ7Ci0KLSAgLyogQ3JlYXRlIGEgIi5kYXRhIiBzZWN0aW9uIHRoYXQgbWFwcyB0aGUgZW50aXJlIGZpbGUsIHdoaWNoIGlzCi0gICAgIGVzc2VudGlhbGx5IGEgZHVtcCBvZiB0aGUgdGFyZ2V0IHN5c3RlbSdzIFJBTS4gKi8KLQotICBhc2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoYXNlY3QgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgYXNlY3QtPm5hbWUgPSAiLmRhdGEiOwotICBhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIC8qIFRoZSBzaXplIG9mIG1lbW9yeSBpcyB0aGUgc2l6ZSBvZiB0aGUgY29yZSBmaWxlIGl0c2VsZi4gICovCi0gIGFzZWN0LT5fcmF3X3NpemUgPSBzdGF0YnVmLnN0X3NpemU7Ci0gIGFzZWN0LT52bWEgPSByYW1iYXNlOwotICBhc2VjdC0+ZmlsZXBvcyA9IDA7Ci0gIGFzZWN0LT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7Ci0gIGFiZmQtPnNlY3Rpb25zID0gYXNlY3Q7Ci0gICsrYWJmZC0+c2VjdGlvbl9jb3VudDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotICAvKiBHZXQgaGVyZSBpZiB3ZSBoYXZlIGFscmVhZHkgc3RhcnRlZCBmaWxsaW5nIG91dCB0aGUgQkZECi0gICAgIGFuZCB0aGVyZSBpcyBhbiBlcnJvciBvZiBzb21lIGtpbmQuICovCi0KLSBlcnJvcl9yZXR1cm46Ci0gIHsKLSAgICBzZWNfcHRyIG5leHRzZWN0OwotICAgIGZvciAoYXNlY3QgPSBhYmZkLT5zZWN0aW9uczsgYXNlY3QgIT0gTlVMTDspCi0gICAgICB7Ci0JbmV4dHNlY3QgPSBhc2VjdC0+bmV4dDsKLQlmcmVlIChhc2VjdCk7Ci0JYXNlY3QgPSBuZXh0c2VjdDsKLSAgICAgIH0KLSAgICBmcmVlIChhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWNpc2NvX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCAqY3Jhc2hfaW5mb19sb2NwOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQgPSBOVUxMOwotCi0gIGZvciAoY3Jhc2hfaW5mb19sb2NwID0gY3Jhc2hfaW5mb19sb2NzOwotICAgICAgICpjcmFzaF9pbmZvX2xvY3AgIT0gLTEgICYmICB0YXJnZXQgPT0gTlVMTDsKLSAgICAgICBjcmFzaF9pbmZvX2xvY3ArKykKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBjaXNjb19jb3JlX2ZpbGVfdmFsaWRhdGUgKGFiZmQsICpjcmFzaF9pbmZvX2xvY3ApOwotICAgIH0KLSAgcmV0dXJuICh0YXJnZXQpOwotfQotCi1jaGFyICoKLWNpc2NvX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludAotY2lzY29fY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZzsKLX0KLQotYm9vbGVhbgotY2lzY29fY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQ7Ci0gICAgIGJmZCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotDAotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgY2lzY29fY29yZV9saXR0bGVfdmVjOwotCi1jb25zdCBiZmRfdGFyZ2V0IGNpc2NvX2NvcmVfYmlnX3ZlYyA9Ci0gIHsKLSAgICAiY2lzY28taW9zLWNvcmUtYmlnIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICAgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBjaXNjb19jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGNpc2NvKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgICYgY2lzY29fY29yZV9saXR0bGVfdmVjLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgY2lzY29fY29yZV9saXR0bGVfdmVjID0KLSAgewotICAgICJjaXNjby1pb3MtY29yZS1saXR0bGUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gICAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIGNpc2NvX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoY2lzY28pLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgJmNpc2NvX2NvcmVfYmlnX3ZlYywKLSAgICAKLSAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYTI5ay5jIGIvYmZkL2NvZmYtYTI5ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWI2ODQ0Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWEyOWsuYworKysgL2Rldi9udWxsCkBAIC0xLDYwNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFNRCAyOTAwMCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIFdvb2QgYXQgTmV3IFlvcmsgVW5pdmVyc2l0eSA3LzgvOTEuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBMjlLIDEKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvYTI5ay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyBsb25nIGdldF9zeW1ib2xfdmFsdWUgUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGEyOWtfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYTI5a19hZGp1c3Rfc3ltbmR4Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYm9vbGVhbiAqKSk7Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotCi0jZGVmaW5lIElOU0VSVF9IV09SRChXT1JELEhXT1JEKQlcCi0gICAgKCgoV09SRCkgJiAweGZmMDBmZjAwKSB8ICgoKEhXT1JEKSAmIDB4ZmYwMCkgPDwgOCkgfCAoKEhXT1JEKSYgMHhmZikpCi0jZGVmaW5lIEVYVFJBQ1RfSFdPUkQoV09SRCkgXAotICAgICgoKChXT1JEKSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKChXT1JEKSYgMHhmZikpCi0jZGVmaW5lIFNJR05fRVhURU5EX0hXT1JEKEhXT1JEKSBcCi0gICAgKChIV09SRCkgJiAweDgwMDAgPyAoSFdPUkQpfCh+MHhmZmZmTCkgOiAoSFdPUkQpKQotCi0vKiBQcm92aWRlZCB0aGUgc3ltYm9sLCByZXR1cm5zIHRoZSB2YWx1ZSByZWZmZWQgKi8KLXN0YXRpYyBsb25nCi1nZXRfc3ltYm9sX3ZhbHVlIChzeW1ib2wpICAgICAgIAotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgewotICAgIHJlbG9jYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0gIGVsc2UgCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlICsKLSAgICAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLSAgICAgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICByZXR1cm4ocmVsb2NhdGlvbik7Ci19Ci0KLS8qIHRoaXMgZnVuY3Rpb24gaXMgaW4gY2hhcmdlIG9mIHBlcmZvcm1pbmcgYWxsIHRoZSAyOWsgcmVsb2NhdGlvbnMgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYTI5a19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIHRoZSBjb25zdGggcmVsb2NhdGlvbiBjb21lcyBpbiB0d28gcGFydHMsIHdlIGhhdmUgdG8gcmVtZW1iZXIKLSAgICAgdGhlIHN0YXRlIGJldHdlZW4gY2FsbHMsIGluIHRoZXNlIHZhcmlhYmxlcyAqLwotICBzdGF0aWMgYm9vbGVhbiBwYXJ0MV9jb25zdGhfYWN0aXZlID0gZmFsc2U7Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhcnQxX2NvbnN0aF92YWx1ZTsKLQotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgc3ltX3ZhbHVlOwotICB1bnNpZ25lZCBsb25nIHVuc2lnbmVkX3ZhbHVlOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGU7Ci0gIGxvbmcgc2lnbmVkX3ZhbHVlOwotCi0gIHVuc2lnbmVkIGxvbmcgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzIDsgLyorIGlucHV0X3NlY3Rpb24tPnZtYSovCi0gIGJmZF9ieXRlICAqaGl0X2RhdGEgPWFkZHIgKyAoYmZkX2J5dGUgKikoZGF0YSk7Ci0JCi0gIHJfdHlwZSA9IHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZTsKLQotICBpZiAob3V0cHV0X2JmZCkgewotICAgIC8qIFBhcnRpYWwgbGlua2luZyAtIGRvIG5vdGhpbmcgKi8KLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgfQotCi0gIGlmIChzeW1ib2xfaW4gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICB7Ci0gICAgLyogS2VlcCB0aGUgc3RhdGUgbWFjaGluZSBoYXBweSBpbiBjYXNlIHdlJ3JlIGNhbGxlZCBhZ2FpbiAqLwotICAgIGlmIChyX3R5cGUgPT0gUl9JSElIQUxGKSAKLSAgICB7Ci0gICAgICBwYXJ0MV9jb25zdGhfYWN0aXZlID0gdHJ1ZTsKLSAgICAgIHBhcnQxX2NvbnN0aF92YWx1ZSAgPSAwOwotICAgIH0KLSAgICByZXR1cm4oYmZkX3JlbG9jX3VuZGVmaW5lZCk7Ci0gIH0KLQotICBpZiAoKHBhcnQxX2NvbnN0aF9hY3RpdmUpICYmIChyX3R5cGUgIT0gUl9JSENPTlNUKSkgCi0gIHsKLSAgICBwYXJ0MV9jb25zdGhfYWN0aXZlID0gZmFsc2U7Ci0gICAgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKSBfKCJNaXNzaW5nIElIQ09OU1QiKTsKLSAgICByZXR1cm4oYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gIH0KLQotCi0gIHN5bV92YWx1ZSA9IGdldF9zeW1ib2xfdmFsdWUoc3ltYm9sX2luKTsKLQotICBzd2l0Y2ggKHJfdHlwZSkgCi0gIHsKLSAgIGNhc2UgUl9JUkVMOiAJCi0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICAvKiBUYWtlIHRoZSB2YWx1ZSBpbiB0aGUgZmllbGQgYW5kIHNpZ24gZXh0ZW5kIGl0ICovCi0gICAgc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRChpbnNuKTsKLSAgICBzaWduZWRfdmFsdWUgPSBTSUdOX0VYVEVORF9IV09SRChzaWduZWRfdmFsdWUpOwotICAgIHNpZ25lZF92YWx1ZSA8PD0gMjsKLQotICAgIC8qIFNlZSB0aGUgbm90ZSBvbiB0aGUgUl9JUkVMIHJlbG9jIGluIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgICBpZiAoc2lnbmVkX3ZhbHVlID09IC0gKGxvbmcpIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQotICAgICAgc2lnbmVkX3ZhbHVlID0gMDsKLQotICAgIHNpZ25lZF92YWx1ZSArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIGlmICgoc2lnbmVkX3ZhbHVlICYgfjB4M2ZmZmYpID09IDApCi0gICAgewkJCQkvKiBBYnNvbHV0ZSBqbXAvY2FsbCAqLwotICAgICAgaW5zbiB8PSAoMTw8MjQpOwkJLyogTWFrZSBpdCBhYnNvbHV0ZSAqLwotICAgICAgLyogRklYTUU6IFNob3VsZCB3ZSBjaGFuZ2Ugcl90eXBlIHRvIFJfSUFCUyAqLwotICAgIH0gCi0gICAgZWxzZSAKLSAgICB7Ci0gICAgICAvKiBSZWxhdGl2ZSBqbXAvY2FsbCwgc28gc3VidHJhY3QgZnJvbSB0aGUgdmFsdWUgdGhlCi0JIGFkZHJlc3Mgb2YgdGhlIHBsYWNlIHdlJ3JlIGNvbWluZyBmcm9tICovCi0gICAgICBzaWduZWRfdmFsdWUgLT0gKHJlbG9jX2VudHJ5LT5hZGRyZXNzCi0JCSAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBpZiAoc2lnbmVkX3ZhbHVlPjB4MWZmZmYgfHwgc2lnbmVkX3ZhbHVlPC0weDIwMDAwKSAKLSAgICAgICByZXR1cm4oYmZkX3JlbG9jX292ZXJmbG93KTsKLSAgICB9Ci0gICAgc2lnbmVkX3ZhbHVlID4+PSAyOwotICAgIGluc24gPSBJTlNFUlRfSFdPUkQoaW5zbiwgc2lnbmVkX3ZhbHVlKTsKLSAgICBiZmRfcHV0XzMyKGFiZmQsIGluc24gLGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfSUxPSEFMRjogCi0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICB1bnNpZ25lZF92YWx1ZSA9IEVYVFJBQ1RfSFdPUkQoaW5zbik7Ci0gICAgdW5zaWduZWRfdmFsdWUgKz0gIHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgaW5zbiA9IElOU0VSVF9IV09SRChpbnNuLCB1bnNpZ25lZF92YWx1ZSk7Ci0gICAgYmZkX3B1dF8zMihhYmZkLCBpbnNuLCBoaXRfZGF0YSk7IAotICAgIGJyZWFrOwotICAgY2FzZSBSX0lISUhBTEY6Ci0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICAvKiBjb25zdGgsIHBhcnQgMSAKLSAgICAgICBKdXN0IGdldCB0aGUgc3ltYm9sIHZhbHVlIHRoYXQgaXMgcmVmZXJlbmNlZCAqLwotICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSB0cnVlOwotICAgIHBhcnQxX2NvbnN0aF92YWx1ZSA9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgLyogRG9uJ3QgbW9kaWZ5IGluc24gdW50aWwgUl9JSENPTlNUICovCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfSUhDT05TVDoJCi0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICAvKiBjb25zdGgsIHBhcnQgMiAKLSAgICAgICBOb3cgcmVsb2NhdGUgdGhlIHJlZmVyZW5jZSAqLwotICAgIGlmIChwYXJ0MV9jb25zdGhfYWN0aXZlID09IGZhbHNlKSB7Ci0gICAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIF8oIk1pc3NpbmcgSUhJSEFMRiIpOwotICAgICAgcmV0dXJuKGJmZF9yZWxvY19kYW5nZXJvdXMpOwotICAgIH0KLSAgICAvKiBzeW1fcHRyX3B0ciA9IHJfc3ltbmR4LCBpbiBjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKCkgKi8KLSAgICB1bnNpZ25lZF92YWx1ZSA9IDA7CQkvKkVYVFJBQ1RfSFdPUkQoaW5zbikgPDwgMTY7Ki8KLSAgICB1bnNpZ25lZF92YWx1ZSArPSByZWxvY19lbnRyeS0+YWRkZW5kOyAvKiByX3N5bW5keCAqLwotICAgIHVuc2lnbmVkX3ZhbHVlICs9IHBhcnQxX2NvbnN0aF92YWx1ZTsKLSAgICB1bnNpZ25lZF92YWx1ZSA9IHVuc2lnbmVkX3ZhbHVlID4+IDE2OwotICAgIGluc24gPSBJTlNFUlRfSFdPUkQoaW5zbiwgdW5zaWduZWRfdmFsdWUpOwotICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgICBiZmRfcHV0XzMyKGFiZmQsIGluc24sIGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfQllURToKLSAgICBpbnNuID0gYmZkX2dldF84KGFiZmQsIGhpdF9kYXRhKTsgCi0gICAgdW5zaWduZWRfdmFsdWUgPSBpbnNuICsgc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsJCi0gICAgaWYgKHVuc2lnbmVkX3ZhbHVlICYgMHhmZmZmZmYwMCkKLSAgICAgIHJldHVybihiZmRfcmVsb2Nfb3ZlcmZsb3cpOwotICAgIGJmZF9wdXRfOChhYmZkLCB1bnNpZ25lZF92YWx1ZSwgaGl0X2RhdGEpOyAKLSAgICBicmVhazsKLSAgIGNhc2UgUl9IV09SRDoKLSAgICBpbnNuID0gYmZkX2dldF8xNihhYmZkLCBoaXRfZGF0YSk7IAotICAgIHVuc2lnbmVkX3ZhbHVlID0gaW5zbiArIHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7CQotICAgIGlmICh1bnNpZ25lZF92YWx1ZSAmIDB4ZmZmZjAwMDApCi0gICAgICByZXR1cm4oYmZkX3JlbG9jX292ZXJmbG93KTsKLSAgICBiZmRfcHV0XzE2KGFiZmQsIGluc24sIGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfV09SRDoKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIGluc24gKz0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsgIAotICAgIGJmZF9wdXRfMzIoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOwotICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAqZXJyb3JfbWVzc2FnZSA9IF8oIlVucmVjb2duaXplZCByZWxvYyIpOwotICAgIHJldHVybiAoYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gIH0KLQotCi0gIHJldHVybihiZmRfcmVsb2Nfb2spOwkKLX0KLQotLyogICAgICB0eXBlCSAgIHJpZ2h0c2hpZnQKLQkJICAgICAgIHNpemUKLQkJCSAgYml0c2l6ZQotCQkJICAgICAgIHBjLXJlbGF0aXZlCi0JCQkJICAgICBiaXRwb3MKLQkJCQkJIGFic29sdXRlCi0JCQkJCSAgICAgY29tcGxhaW5fb25fb3ZlcmZsb3cKLQkJCQkJCSAgc3BlY2lhbF9mdW5jdGlvbgotCQkJCQkJICAgIHJlbG9jYXRpb24gbmFtZQotCQkJCQkJCSAgICAgICBwYXJ0aWFsX2lucGxhY2UgCi0JCQkJCQkJCSAgICAgIHNyY19tYXNrCi0qLwotCi0vKkZJWE1FOiBJJ20gbm90IHJlYWwgc3VyZSBhYm91dCB0aGlzIHRhYmxlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gCi17Ci0gIHtSX0FCUywgICAgIDAsIDMsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYTI5a19yZWxvYywiQUJTIiwgICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2V9LAotICBFTVBUWV9IT1dUTyAoMSksCi0gIEVNUFRZX0hPV1RPICgyKSwKLSAgRU1QVFlfSE9XVE8gKDMpLAotICBFTVBUWV9IT1dUTyAoNCksCi0gIEVNUFRZX0hPV1RPICg1KSwKLSAgRU1QVFlfSE9XVE8gKDYpLAotICBFTVBUWV9IT1dUTyAoNyksCi0gIEVNUFRZX0hPV1RPICg4KSwKLSAgRU1QVFlfSE9XVE8gKDkpLAotICBFTVBUWV9IT1dUTyAoMTApLAotICBFTVBUWV9IT1dUTyAoMTEpLAotICBFTVBUWV9IT1dUTyAoMTIpLAotICBFTVBUWV9IT1dUTyAoMTMpLAotICBFTVBUWV9IT1dUTyAoMTQpLAotICBFTVBUWV9IT1dUTyAoMTUpLAotICBFTVBUWV9IT1dUTyAoMTYpLAotICBFTVBUWV9IT1dUTyAoMTcpLAotICBFTVBUWV9IT1dUTyAoMTgpLAotICBFTVBUWV9IT1dUTyAoMTkpLAotICBFTVBUWV9IT1dUTyAoMjApLAotICBFTVBUWV9IT1dUTyAoMjEpLAotICBFTVBUWV9IT1dUTyAoMjIpLAotICBFTVBUWV9IT1dUTyAoMjMpLAotICB7Ul9JUkVMLCAgICAwLCAzLCAzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCxhMjlrX3JlbG9jLCJJUkVMIiwgICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZX0sCi0gIHtSX0lBQlMsICAgIDAsIDMsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGEyOWtfcmVsb2MsIklBQlMiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlfSwKLSAge1JfSUxPSEFMRiwgMCwgMywgMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGEyOWtfcmVsb2MsIklMT0hBTEYiLCB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge1JfSUhJSEFMRiwgMCwgMywgMTYsIHRydWUsICAxNiwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBhMjlrX3JlbG9jLCJJSElIQUxGIiwgdHJ1ZSwgMHhmZmZmMDAwMCwweGZmZmYwMDAwLCBmYWxzZX0sCi0gIHtSX0lIQ09OU1QsIDAsIDMsIDE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBhMjlrX3JlbG9jLCJJSENPTlNUIiwgdHJ1ZSwgMHhmZmZmMDAwMCwweGZmZmYwMDAwLCBmYWxzZX0sCi0gIHtSX0JZVEUsICAgIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYTI5a19yZWxvYywiQllURSIsICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2V9LAotICB7Ul9IV09SRCwgICAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBhMjlrX3JlbG9jLCJIV09SRCIsICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZX0sCi0gIHtSX1dPUkQsICAgIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGEyOWtfcmVsb2MsIldPUkQiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlfSwKLX07Ci0KLSNkZWZpbmUgQkFETUFHKHgpIEEyOUtCQURNQUcoeCkKLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQscmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gICAgc3RhdGljIGJmZF92bWEgaWhpaGFsZl92YWRkciA9IChiZmRfdm1hKSAtMTsKLQotICAgIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwkJCi0gICAgcmVsZW50LT5ob3d0byA9IGhvd3RvX3RhYmxlICsgcmVsb2MtPnJfdHlwZTsKLSAgICBpZiAocmVsb2MtPnJfdHlwZSA9PSBSX0lIQ09OU1QpIAotICAgIHsJCQotICAgICAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gUl9JSENPTlNUIHNob3VsZCBhbHdheXMgYmUgdGhlIGFkZHJlc3Mgb2YKLQkgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyBSX0lISUhBTEYuICByZWxvY3MgZ2VuZXJhdGVkIGJ5IGdhcwotCSBhcmUgY29ycmVjdCwgYnV0IHJlbG9jcyBnZW5lcmF0ZWQgYnkgSGlnaCBDIGFyZSBkaWZmZXJlbnQgKEkKLQkgY2FuJ3QgZmlndXJlIG91dCB3aGF0IHRoZSBhZGRyZXNzIG1lYW5zIGZvciBIaWdoIEMpLiAgV2UgY2FuCi0JIGhhbmRsZSBib3RoIGdhcyBhbmQgSGlnaCBDIGJ5IGlnbm9yaW5nIHRoZSBhZGRyZXNzIGhlcmUsIGFuZAotCSBzaW1wbHkgcmV1c2luZyB0aGUgYWRkcmVzcyBzYXZlZCBmb3IgUl9JSElIQUxGLiAgKi8KLSAgICAgICAgaWYgKGloaWhhbGZfdmFkZHIgPT0gKGJmZF92bWEpIC0xKQotCSAgYWJvcnQgKCk7Ci0JcmVsZW50LT5hZGRyZXNzID0gaWhpaGFsZl92YWRkcjsKLQlpaGloYWxmX3ZhZGRyID0gKGJmZF92bWEpIC0xOwotCXJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfc3ltbmR4OwkJCi0JcmVsZW50LT5zeW1fcHRyX3B0cj0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgYXN5bWJvbCAqcHRyOwotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotCi0gICAgICBwdHIgPSAqKHJlbGVudC0+c3ltX3B0cl9wdHIpOwotCi0gICAgICBpZiAocHRyIAotCSAgJiYgYmZkX2FzeW1ib2xfYmZkKHB0cikgPT0gYWJmZAkJCi0KLQkgICYmICgocHRyLT5mbGFncyAmIEJTRl9PTERfQ09NTU9OKT09IDApKQkKLSAgICAgIHsJCQkJCQkKLQkgIHJlbGVudC0+YWRkZW5kID0gMDsKLSAgICAgIH0JCQkJCQkKLSAgICAgIGVsc2UKLSAgICAgIHsJCQkJCQotCSAgcmVsZW50LT5hZGRlbmQgPSAwOwkJCQotICAgICAgfQkJCQotICAgICAgcmVsZW50LT5hZGRyZXNzLT0gc2VjdGlvbi0+dm1hOwotICAgICAgaWYgKHJlbG9jLT5yX3R5cGUgPT0gUl9JSElIQUxGKQotCWloaWhhbGZfdmFkZHIgPSByZWxlbnQtPmFkZHJlc3M7Ci0gICAgICBlbHNlIGlmIChpaGloYWxmX3ZhZGRyICE9IChiZmRfdm1hKSAtMSkKLQlhYm9ydCAoKTsKLSAgfQotfQotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0gIGJvb2xlYW4gaGloYWxmOwotICBiZmRfdm1hIGhpaGFsZl92YWw7Ci0KLSAgLyogSWYgd2UgYXJlIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhCi0gICAgIHRoaW5nLiAgVGhlIGNhbGxlciB3aWxsIHRha2UgY2FyZSBvZiBhZGp1c3RpbmcgdGhlIHJlbG9jCi0gICAgIGFkZHJlc3NlcyBhbmQgc3ltYm9sIGluZGljZXMuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGhpaGFsZiA9IGZhbHNlOwotICBoaWhhbGZfdmFsID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIGJmZF9ieXRlICpsb2M7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICBib29sZWFuIG92ZXJmbG93OwotICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICAgbG9uZyBzaWduZWRfdmFsdWU7Ci0gICAgICB1bnNpZ25lZCBsb25nIHVuc2lnbmVkX3ZhbHVlOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEgfHwgcmVsLT5yX3R5cGUgPT0gUl9JSENPTlNUKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0KLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgdmFsID0gMDsKLQotICAgICAgLyogQW4gUl9JSENPTlNUIHJlbG9jIGRvZXMgbm90IGhhdmUgYSBzeW1ib2wuICBJbnN0ZWFkLCB0aGUKLSAgICAgICAgIHN5bWJvbCBpbmRleCBpcyBhbiBhZGRlbmQuICBSX0lIQ09OU1QgaXMgYWx3YXlzIHVzZWQgaW4KLSAgICAgICAgIGNvbmp1bmN0aW9uIHdpdGggUl9JSEhBTEYuICAqLwotICAgICAgaWYgKHJlbC0+cl90eXBlICE9IFJfSUhDT05TVCkKLQl7Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkJc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCQkgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JCSAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgKyBzeW0tPm5fdmFsdWUKLQkJCSAtIHNlYy0+dm1hKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoaWhhbGYpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywgXygibWlzc2luZyBJSENPTlNUIHJlbG9jIiksIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBoaWhhbGYgPSBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLQotICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCi0JY2FzZSBSX0lSRUw6Ci0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCi0JICAvKiBFeHRyYWN0IHRoZSBhZGRlbmQuICAqLwotCSAgc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRCAoaW5zbik7Ci0JICBzaWduZWRfdmFsdWUgPSBTSUdOX0VYVEVORF9IV09SRCAoc2lnbmVkX3ZhbHVlKTsKLQkgIHNpZ25lZF92YWx1ZSA8PD0gMjsKLQotCSAgLyogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQ09GRgotCSAgICAgYTI5ay4gIEluIHRoZSBvcmlnaW5hbCBBTUQgdmVyc2lvbiwgdGhlIHZhbHVlIHN0b3JlZCBpbgotCSAgICAgdGhlIGZpZWxkIGZvciB0aGUgUl9JUkVMIHJlbG9jIGlzIGEgc2ltcGxlIGFkZGVuZC4gIEluCi0JICAgICB0aGUgR05VIHZlcnNpb24sIHRoZSB2YWx1ZSBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIGFkZHJlc3MKLQkgICAgIG9mIHRoZSByZWxvYyB3aXRoaW4gc2VjdGlvbi4gIFdlIHRyeSB0byBjb3BlIGhlcmUgYnkKLQkgICAgIGFzc3VtaW5nIHRoZSBBTUQgdmVyc2lvbiwgdW5sZXNzIHRoZSBhZGRlbmQgaXMgZXhhY3RseQotCSAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzOyBpbiB0aGUgbGF0dGVyIGNhc2Ugd2UgYXNzdW1lCi0JICAgICB0aGUgR05VIHZlcnNpb24uICBUaGlzIG1lYW5zIHRoYXQgc29tZXRoaW5nIGxpa2UKLQkgICAgICAgICAudGV4dAotCQkgbm9wCi0JCSBqbXAgaS00Ci0JICAgICB3aWxsIGZhaWwsIGJlY2F1c2UgdGhlIGFkZGVuZCBvZiAtNCB3aWxsIGhhcHBlbiB0byBlcXVhbAotCSAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFRoZQotCSAgICAgY29tcGlsZXIgd2lsbCBuZXZlciBnZW5lcmF0ZSBjb2RlIGxpa2UgdGhpcy4KLQotCSAgICAgQXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlIHdlIG1heSB3YW50IHRvIHRha2Ugb3V0IHRoaXMKLQkgICAgIGNoZWNrLiAgKi8KLQotCSAgaWYgKHNpZ25lZF92YWx1ZSA9PSAtIChsb25nKSAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkKLQkgICAgc2lnbmVkX3ZhbHVlID0gMDsKLQotCSAgLyogRGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUganVtcC4gICovCi0JICBzaWduZWRfdmFsdWUgKz0gdmFsOwotCi0JICBpZiAoKHNpZ25lZF92YWx1ZSAmIH4weDNmZmZmKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuIHVzZSBhbiBhYnNvbHV0ZSBqdW1wLiAgKi8KLQkgICAgICBpbnNuIHw9ICgxIDw8IDI0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTWFrZSB0aGUgZGVzdGluYXRpb24gUEMgcmVsYXRpdmUuICAqLwotCSAgICAgIHNpZ25lZF92YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCSAgICAgIGlmIChzaWduZWRfdmFsdWUgPiAweDFmZmZmIHx8IHNpZ25lZF92YWx1ZSA8IC0gMHgyMDAwMCkKLQkJewotCQkgIG92ZXJmbG93ID0gdHJ1ZTsKLQkJICBzaWduZWRfdmFsdWUgPSAwOwotCQl9Ci0JICAgIH0KLQotCSAgLyogUHV0IHRoZSBhZGp1c3RlZCB2YWx1ZSBiYWNrIGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgIHNpZ25lZF92YWx1ZSA+Pj0gMjsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHNpZ25lZF92YWx1ZSk7Ci0KLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sIGxvYyk7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lMT0hBTEY6Ci0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCSAgdW5zaWduZWRfdmFsdWUgPSBFWFRSQUNUX0hXT1JEIChpbnNuKTsKLQkgIHVuc2lnbmVkX3ZhbHVlICs9IHZhbDsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgbG9jKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lISUhBTEY6Ci0JICAvKiBTYXZlIHRoZSB2YWx1ZSBmb3IgdGhlIFJfSUhDT05TVCByZWxvYy4gICovCi0JICBoaWhhbGYgPSB0cnVlOwotCSAgaGloYWxmX3ZhbCA9IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0lIQ09OU1Q6Ci0JICBpZiAoISBoaWhhbGYpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywgXygibWlzc2luZyBJSElIQUxGIHJlbG9jIiksIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBoaWhhbGZfdmFsID0gMDsKLQkgICAgfQotCi0JICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOwotCSAgdW5zaWduZWRfdmFsdWUgPSByZWwtPnJfc3ltbmR4ICsgaGloYWxmX3ZhbDsKLQkgIHVuc2lnbmVkX3ZhbHVlID4+PSAxNjsKLQkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sIGxvYyk7Ci0KLQkgIGhpaGFsZiA9IGZhbHNlOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9CWVRFOgotCWNhc2UgUl9IV09SRDoKLQljYXNlIFJfV09SRDoKLQkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZSwKLQkJCQkJICBpbnB1dF9iZmQsIHZhbCwgbG9jKTsKLQkgIGlmIChyc3RhdCA9PSBiZmRfcmVsb2Nfb3ZlcmZsb3cpCi0JICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIGVsc2UgaWYgKHJzdGF0ICE9IGJmZF9yZWxvY19vaykKLQkgICAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChvdmVyZmxvdykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgZWxzZSBpZiAoc3ltID09IE5VTEwpCi0JICAgIG5hbWUgPSAiKnVua25vd24qIjsKLQkgIGVsc2UgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAmJiBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cm5jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7Ci0JICAgICAgYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JICAgICAgbmFtZSA9IGJ1ZjsKLQkgICAgfQotCi0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sIG5hbWUsIGhvd3RvX3RhYmxlW3JlbC0+cl90eXBlXS5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfSAgICAgCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uCi0KLS8qIFdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBzeW1uZHggb2YgYSBSX0lIQ09OU1QgcmVsb2MsIHNpbmNlIGl0Ci0gICBpcyBhY3R1YWxseSBhbiBhZGRlbmQsIG5vdCBhIHN5bWJvbCBpbmRleCBhdCBhbGwuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2EyOWtfYWRqdXN0X3N5bW5keCAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCBpcmVsLCBhZGp1c3RlZHApCi0gICAgIGJmZCAqb2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmliZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgIGJvb2xlYW4gKmFkanVzdGVkcDsKLXsKLSAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX0lIQ09OU1QpCi0gICAgKmFkanVzdGVkcCA9IHRydWU7Ci0gIGVsc2UKLSAgICAqYWRqdXN0ZWRwID0gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfYWRqdXN0X3N5bW5keCBjb2ZmX2EyOWtfYWRqdXN0X3N5bW5keAotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKGEyOWtjb2ZmX2JpZ192ZWMsICJjb2ZmLWEyOWstYmlnIiwgMCwgU0VDX1JFQURPTkxZLCAnXycsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZi1hbHBoYS5jIGIvYmZkL2NvZmYtYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyNTMxOS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1hbHBoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQwNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFMUEhBIEV4dGVuZGVkLUNvZmYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgTW9kaWZpZWQgZnJvbSBjb2ZmLW1pcHMuYyBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+IGFuZAotICAgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNpbmNsdWRlICJjb2ZmL2FscGhhLmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJlY29mZi5oIgotDAotLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICphbHBoYV9lY29mZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gYWxwaGFfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwgUFRSIGZpbGVoZHIpKTsKLXN0YXRpYyBQVFIgYWxwaGFfZWNvZmZfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVoZHIsIFBUUiBhb3V0aGRyKSk7Ci1zdGF0aWMgdm9pZCBhbHBoYV9lY29mZl9zd2FwX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgdm9pZCBhbHBoYV9lY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgICAgICAgUFRSKSk7Ci1zdGF0aWMgdm9pZCBhbHBoYV9hZGp1c3RfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgICBhcmVsZW50ICopKTsKLXN0YXRpYyB2b2lkIGFscGhhX2FkanVzdF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IGFyZWxlbnQgKiwKLQkJCQkJICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGJmZF9ieXRlICphbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqZGF0YSwgYm9vbGVhbiByZWxvY2F0ZWFibGUsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgYmZkX3ZtYSBhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgc3RydWN0IGV4dGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgICAgYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSAgICAgICBiZmRfYnl0ZSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGFscGhhX2FkanVzdF9oZWFkZXJzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqLCBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSk7Ci1zdGF0aWMgUFRSIGFscGhhX2Vjb2ZmX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkICphbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyKSk7Ci1zdGF0aWMgYmZkICphbHBoYV9lY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYmZkICphbHBoYV9lY29mZl9nZXRfZWx0X2F0X2luZGV4IFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpOwotDAotLyogRUNPRkYgaGFzIENPRkYgc2VjdGlvbnMsIGJ1dCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbgotICAgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBmb3JtYXQuICBFQ09GRiB0YXJnZXRzIHVzZSBzb21lIG9mIHRoZQotICAgc3dhcHBpbmcgcm91dGluZXMgZnJvbSBjb2Zmc3dhcC5oLCBhbmQgc29tZSBvZiB0aGUgZ2VuZXJpYyBDT0ZGCi0gICByb3V0aW5lcyBpbiBjb2ZmZ2VuLmMsIGJ1dCwgdW5saWtlIHRoZSByZWFsIENPRkYgdGFyZ2V0cywgZG8gbm90Ci0gICB1c2UgY29mZmNvZGUuaCBpdHNlbGYuCi0KLSAgIEdldCB0aGUgZ2VuZXJpYyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLCBleGNlcHQgZm9yIHRoZSByZWxvYywKLSAgIHN5bWJvbCwgYW5kIGxpbmVubyBvbmVzLiAgR2l2ZSB0aGVtIGVjb2ZmIG5hbWVzLiAgRGVmaW5lIHNvbWUKLSAgIGFjY2Vzc29yIG1hY3JvcyBmb3IgdGhlIGxhcmdlIHNpemVzIHVzZWQgZm9yIEFscGhhIEVDT0ZGLiAgKi8KLQotI2RlZmluZSBHRVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVFNJWkUgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX1RTSVpFIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9EU0laRSBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfRFNJWkUgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9BT1VUSERSX0JTSVpFIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9CU0laRSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfRU5UUlkgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX0VOVFJZIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1BBRERSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX1BBRERSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1ZBRERSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX1ZBRERSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1NJWkUgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfU0laRSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX1NDTkhEUl9TQ05QVFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfU0NOUFRSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX1JFTFBUUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9SRUxQVFIgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX3B1dF82NAotCi0jZGVmaW5lIEFMUEhBRUNPRkYKLQotI2RlZmluZSBOT19DT0ZGX1JFTE9DUwotI2RlZmluZSBOT19DT0ZGX1NZTUJPTFMKLSNkZWZpbmUgTk9fQ09GRl9MSU5FTk9TCi0jZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX2luIGFscGhhX2Vjb2ZmX3N3YXBfZmlsZWhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX291dAotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9pbiBhbHBoYV9lY29mZl9zd2FwX2FvdXRoZHJfaW4KLSNkZWZpbmUgY29mZl9zd2FwX2FvdXRoZHJfb3V0IGFscGhhX2Vjb2ZmX3N3YXBfYW91dGhkcl9vdXQKLSNkZWZpbmUgY29mZl9zd2FwX3Njbmhkcl9pbiBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfc2NuaGRyX291dCBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9vdXQKLSNpbmNsdWRlICJjb2Zmc3dhcC5oIgotCi0vKiBHZXQgdGhlIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLSNkZWZpbmUgRUNPRkZfNjQKLSNpbmNsdWRlICJlY29mZnN3YXAuaCIKLQwKLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmVsb2NfbmlsIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkgICBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yZWxvY19uaWwgKGFiZmQsIHJlbG9jLCBzeW0sIGRhdGEsIHNlYywgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFscGhhX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBSZWxvYyB0eXBlIDAgaXMgaWdub3JlZCBieSBpdHNlbGYuICBIb3dldmVyLCBpdCBhcHBlYXJzIGFmdGVyIGEKLSAgICAgR1BESVNQIHJlbG9jIHRvIGlkZW50aWZ5IHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgbG93IG9yZGVyIDE2IGJpdHMKLSAgICAgb2YgdGhlIGdwIHJlZ2lzdGVyIGFyZSBsb2FkZWQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9JR05PUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklHTk9SRSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLwotICBIT1dUTyAoQUxQSEFfUl9SRUZMT05HLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkxPTkciLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGUVVBRCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IEdQIHJlbGF0aXZlIG9mZnNldC4gIFRoaXMgaXMganVzdCBsaWtlIFJFRkxPTkcgZXhjZXB0Ci0gICAgIHRoYXQgd2hlbiB0aGUgdmFsdWUgaXMgdXNlZCB0aGUgdmFsdWUgb2YgdGhlIGdwIHJlZ2lzdGVyIHdpbGwgYmUKLSAgICAgYWRkZWQgaW4uICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgZm9yIGFuIGluc3RydWN0aW9uIHRoYXQgcmVmZXJzIHRvIG1lbW9yeSBvZmYgdGhlIEdQCi0gICAgIHJlZ2lzdGVyLiAgVGhlIG9mZnNldCBpcyAxNiBiaXRzIG9mIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICBUaGlzCi0gICAgIHJlbG9jIGFsd2F5cyBzZWVtcyB0byBiZSBhZ2FpbnN0IHRoZSAubGl0YSBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElURVJBTCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgcmVsb2Mgb25seSBhcHBlYXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIExJVEVSQUwgcmVsb2MuCi0gICAgIEl0IGlkZW50aWZpZXMgYSB1c2Ugb2YgdGhlIGxpdGVyYWwuICBJdCBzZWVtcyB0aGF0IHRoZSBsaW5rZXIgY2FuCi0gICAgIHVzZSB0aGlzIHRvIGVsaW1pbmF0ZSBhIHBvcnRpb24gb2YgdGhlIC5saXRhIHNlY3Rpb24uICBUaGUgc3ltYm9sCi0gICAgIGluZGV4IGlzIHNwZWNpYWw6IDEgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgYmFzZQotICAgICByZWdpc3RlciBvZiBhIG1lbW9yeSBmb3JtYXQgaW5zdHJ1Y3Rpb247IDIgbWVhbnMgdGhlIGxpdGVyYWwKLSAgICAgYWRkcmVzcyBpcyBpbiB0aGUgYnl0ZSBvZmZzZXQgcmVnaXN0ZXIgb2YgYSBieXRlLW1hbmlwdWxhdGlvbgotICAgICBpbnN0cnVjdGlvbjsgMyBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSB0YXJnZXQKLSAgICAgcmVnaXN0ZXIgb2YgYSBqc3IgaW5zdHJ1Y3Rpb24uICBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IGRvIGFueQotICAgICByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElUVVNFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVFVTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG9hZCB0aGUgZ3AgcmVnaXN0ZXIuICBUaGlzIGlzIGFsd2F5cyB1c2VkIGZvciBhIGxkYWggaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggbG9hZHMgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGdwIHJlZ2lzdGVyLiAgVGhlIG5leHQgcmVsb2MKLSAgICAgd2lsbCBiZSBhbiBJR05PUkUgcmVsb2Mgd2hpY2ggaWRlbnRpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIGxkYQotICAgICBpbnN0cnVjdGlvbiB3aGljaCBsb2FkcyB0aGUgbG93ZXIgMTYgYml0cy4gIFRoZSBzeW1ib2wgaW5kZXggb2YKLSAgICAgdGhlIEdQRElTUCBpbnN0cnVjdGlvbiBhcHBlYXJzIHRvIGFjdHVhbGx5IGJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgYmV0d2VlbiB0aGUgbGRhaCBhbmQgbGRhIGluc3RydWN0aW9ucy4gIFRoaXMgZ2l2ZXMgdHdvIGRpZmZlcmVudAotICAgICB3YXlzIHRvIGRldGVybWluZSB3aGVyZSB0aGUgbGRhIGluc3RydWN0aW9uIGlzOyBJIGRvbid0IGtub3cgd2h5Ci0gICAgIGJvdGggYXJlIHVzZWQuICBUaGUgdmFsdWUgdG8gdXNlIGZvciB0aGUgcmVsb2NhdGlvbiBpcyB0aGUKLSAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBHUCB2YWx1ZSBhbmQgdGhlIGN1cnJlbnQgbG9jYXRpb247IHRoZQotICAgICBsb2FkIHdpbGwgYWx3YXlzIGJlIGRvbmUgYWdhaW5zdCBhIHJlZ2lzdGVyIGhvbGRpbmcgdGhlIGN1cnJlbnQKLSAgICAgYWRkcmVzcy4gICovCi0gIEhPV1RPIChBTFBIQV9SX0dQRElTUCwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUERJU1AiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIxIGJpdCBicmFuY2guICBUaGUgbmF0aXZlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhlc2UgZm9yCi0gICAgIGJyYW5jaGVzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhbmQgYWxzbyBmaWxscyBpbiB0aGUgUEMKLSAgICAgcmVsYXRpdmUgb2Zmc2V0IGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJCUkFERFIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBoaW50IGZvciBhIGp1bXAgdG8gYSByZWdpc3Rlci4gICovCi0gIEhPV1RPIChBTFBIQV9SX0hJTlQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJISU5UIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDY0LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUw2NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFB1c2ggYSB2YWx1ZSBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BVU0gsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9TVE9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN1YnRyYWN0IHRoZSByZWxvYyBhZGRyZXNzIGZyb20gdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlCi0gICAgIHJlbG9jYXRpb24gc3RhY2suICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QU1VCLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QU1VCIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTaGlmdCB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgcmVsb2NhdGlvbiBzdGFjayByaWdodCBieSB0aGUKLSAgICAgZ2l2ZW4gdmFsdWUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QUlNISUZULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBZGp1c3QgdGhlIEdQIHZhbHVlIGZvciBhIG5ldyByYW5nZSBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUFZBTFVFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFZBTFVFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0MCi0vKiBSZWNvZ25pemUgYW4gQWxwaGEgRUNPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWFscGhhX2Vjb2ZmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpyZXQ7Ci0KLSAgcmV0ID0gY29mZl9vYmplY3RfcCAoYWJmZCk7Ci0KLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIC8qIEFscGhhIEVDT0ZGIGhhcyBhIC5wZGF0YSBzZWN0aW9uLiAgVGhlIGxubm9wdHIgZmllbGQgb2YgdGhlCi0JIC5wZGF0YSBzZWN0aW9uIGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpdCBjb250YWlucy4gIEVhY2gKLQkgZW50cnkgdGFrZXMgdXAgOCBieXRlcy4gIFRoZSBudW1iZXIgb2YgZW50cmllcyBpcyByZXF1aXJlZAotCSBzaW5jZSB0aGUgc2VjdGlvbiBpcyBhbGlnbmVkIHRvIGEgMTYgYnl0ZSBib3VuZGFyeS4gIFdoZW4gd2UKLQkgbGluayAucGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgdGhlCi0JIGFsaWdubWVudCBieXRlcy4gIFdlIGhhbmRsZSB0aGlzIG9uIGlucHV0IGJ5IGZha2luZyB0aGUgc2l6ZQotCSBvZiB0aGUgLnBkYXRhIHNlY3Rpb24gdG8gcmVtb3ZlIHRoZSB1bndhbnRlZCBhbGlnbm1lbnQgYnl0ZXMuCi0JIE9uIG91dHB1dCB3ZSB3aWxsIHNldCB0aGUgbG5ub3B0ciBmaWVsZCBhbmQgZm9yY2UgdGhlCi0JIGFsaWdubWVudC4gICovCi0gICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgX1BEQVRBKTsKLSAgICAgIGlmIChzZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0JICBzaXplID0gc2VjLT5saW5lX2ZpbGVwb3MgKiA4OwotCSAgQkZEX0FTU0VSVCAoc2l6ZSA9PSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpCi0JCSAgICAgIHx8IHNpemUgKyA4ID09IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykpOwotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYywgc2l6ZSkpCi0JICAgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogU2VlIHdoZXRoZXIgdGhlIG1hZ2ljIG51bWJlciBtYXRjaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFscGhhX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vayAoYWJmZCwgZmlsZWhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLQotICBpZiAoQUxQSEFfRUNPRkZfQkFETUFHICgqaW50ZXJuYWxfZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgaG9vayBjYWxsZWQgYnkgY29mZl9yZWFsX29iamVjdF9wIHRvIGNyZWF0ZSBhbnkgYmFja2VuZAotICAgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgUFRSCi1hbHBoYV9lY29mZl9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotICAgICBQVFIgYW91dGhkcjsKLXsKLSAgUFRSIGVjb2ZmOwotCi0gIGVjb2ZmID0gX2JmZF9lY29mZl9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKTsKLQotICBpZiAoZWNvZmYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotCi0gICAgICAvKiBTZXQgYWRkaXRpb25hbCBCRkQgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZSBvYmplY3QgdHlwZSBmcm9tIHRoZQotCSBtYWNoaW5lIHNwZWNpZmljIGZpbGUgaGVhZGVyIGZsYWdzLiAgKi8KLSAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfQUxQSEFfT0JKRUNUX1RZUEVfTUFTSykKLQl7Ci0JY2FzZSBGX0FMUEhBX1NIQVJBQkxFOgotCSAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLQkgIGJyZWFrOwotCWNhc2UgRl9BTFBIQV9DQUxMX1NIQVJFRDoKLQkgIC8qIEFsd2F5cyBleGVjdXRhYmxlIGlmIHVzaW5nIHNoYXJlZCBsaWJyYXJpZXMgYXMgdGhlIHJ1biB0aW1lCi0JICAgICBsb2FkZXIgbWlnaHQgcmVzb2x2ZSB1bmRlZmluZWQgcmVmZXJlbmNlcy4gICovCi0JICBhYmZkLT5mbGFncyB8PSAoRFlOQU1JQyB8IEVYRUNfUCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gZWNvZmY7Ci19Ci0MCi0vKiBSZWxvYyBoYW5kbGluZy4gICovCi0KLS8qIFN3YXAgYSByZWxvYyBpbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9lY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCBleHRfcHRyLCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotewotICBjb25zdCBSRUxPQyAqZXh0ID0gKFJFTE9DICopIGV4dF9wdHI7Ci0KLSAgaW50ZXJuLT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5yX3ZhZGRyKTsKLSAgaW50ZXJuLT5yX3N5bW5keCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+cl9zeW1uZHgpOwotCi0gIEJGRF9BU1NFUlQgKGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoYWJmZCkpOwotCi0gIGludGVybi0+cl90eXBlID0gKChleHQtPnJfYml0c1swXSAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKQotCQkgICAgPj4gUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpOwotICBpbnRlcm4tPnJfZXh0ZXJuID0gKGV4dC0+cl9iaXRzWzFdICYgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSkgIT0gMDsKLSAgaW50ZXJuLT5yX29mZnNldCA9ICgoZXh0LT5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFKQotCQkgICAgICA+PiBSRUxPQ19CSVRTMV9PRkZTRVRfU0hfTElUVExFKTsKLSAgLyogSWdub3JlZCB0aGUgcmVzZXJ2ZWQgYml0cy4gICovCi0gIGludGVybi0+cl9zaXplID0gKChleHQtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFKQotCQkgICAgPj4gUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUpOwotCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0xJVFVTRQotICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9HUERJU1ApCi0gICAgewotICAgICAgLyogSGFuZGxlIHRoZSBMSVRVU0UgYW5kIEdQRElTUCByZWxvY3Mgc3BlY2lhbGx5LiAgSXRzIHN5bW5keAotCSB2YWx1ZSBpcyBub3QgYWN0dWFsbHkgYSBzeW1ib2wgaW5kZXgsIGJ1dCBpcyBpbnN0ZWFkIGEKLQkgc3BlY2lhbCBjb2RlLiAgV2UgcHV0IHRoZSBjb2RlIGluIHRoZSByX3NpemUgZmllbGQsIGFuZAotCSBjbG9iYmVyIHRoZSBzeW1uZHguICAqLwotICAgICAgaWYgKGludGVybi0+cl9zaXplICE9IDApCi0JYWJvcnQgKCk7Ci0gICAgICBpbnRlcm4tPnJfc2l6ZSA9IGludGVybi0+cl9zeW1uZHg7Ci0gICAgICBpbnRlcm4tPnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9OT05FOwotICAgIH0KLSAgZWxzZSBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9JR05PUkUpCi0gICAgewotICAgICAgLyogVGhlIElHTk9SRSByZWxvYyBnZW5lcmFsbHkgZm9sbG93cyBhIEdQRElTUCByZWxvYywgYW5kIGlzCi0JIGFnYWluc3QgdGhlIC5saXRhIHNlY3Rpb24uICBUaGUgc2VjdGlvbiBpcyBpcnJlbGV2YW50LiAgKi8KLSAgICAgIGlmICghIGludGVybi0+cl9leHRlcm4gJiYKLQkgIGludGVybi0+cl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9BQlMpCi0JYWJvcnQgKCk7Ci0gICAgICBpZiAoISBpbnRlcm4tPnJfZXh0ZXJuICYmIGludGVybi0+cl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9MSVRBKQotCWludGVybi0+cl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKLSAgICB9Ci19Ci0KLS8qIFN3YXAgYSByZWxvYyBvdXQuICAqLwotCi1zdGF0aWMgdm9pZAotYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIGludGVybiwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBQVFIgZHN0OwotewotICBSRUxPQyAqZXh0ID0gKFJFTE9DICopIGRzdDsKLSAgbG9uZyBzeW1uZHg7Ci0gIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLQotICAvKiBVbmRvIHRoZSBoYWNrZXJ5IGRvbmUgaW4gc3dhcF9yZWxvY19pbi4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0xJVFVTRQotICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9HUERJU1ApCi0gICAgewotICAgICAgc3ltbmR4ID0gaW50ZXJuLT5yX3NpemU7Ci0gICAgICBzaXplID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGludGVybi0+cl90eXBlID09IEFMUEhBX1JfSUdOT1JFCi0JICAgJiYgISBpbnRlcm4tPnJfZXh0ZXJuCi0JICAgJiYgaW50ZXJuLT5yX3N5bW5keCA9PSBSRUxPQ19TRUNUSU9OX0FCUykKLSAgICB7Ci0gICAgICBzeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0gICAgICBzaXplID0gaW50ZXJuLT5yX3NpemU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltbmR4ID0gaW50ZXJuLT5yX3N5bW5keDsKLSAgICAgIHNpemUgPSBpbnRlcm4tPnJfc2l6ZTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoaW50ZXJuLT5yX2V4dGVybgotCSAgICAgIHx8IChpbnRlcm4tPnJfc3ltbmR4ID49IDAgJiYgaW50ZXJuLT5yX3N5bW5keCA8PSAxNCkpOwotCi0gIGJmZF9oX3B1dF82NCAoYWJmZCwgaW50ZXJuLT5yX3ZhZGRyLCAoYmZkX2J5dGUgKikgZXh0LT5yX3ZhZGRyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzeW1uZHgsIChiZmRfYnl0ZSAqKSBleHQtPnJfc3ltbmR4KTsKLQotICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsKLQotICBleHQtPnJfYml0c1swXSA9ICgoaW50ZXJuLT5yX3R5cGUgPDwgUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpCi0JCSAgICAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKTsKLSAgZXh0LT5yX2JpdHNbMV0gPSAoKGludGVybi0+cl9leHRlcm4gPyBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFIDogMCkKLQkJICAgIHwgKChpbnRlcm4tPnJfb2Zmc2V0IDw8IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpCi0JCSAgICAgICAmIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUpKTsKLSAgZXh0LT5yX2JpdHNbMl0gPSAwOwotICBleHQtPnJfYml0c1szXSA9ICgoc2l6ZSA8PCBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRSkKLQkJICAgICYgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUpOwotfQotCi0vKiBGaW5pc2ggY2Fub25pY2FsaXppbmcgYSByZWxvYy4gIFBhcnQgb2YgdGhpcyBpcyBnZW5lcmljIHRvIGFsbAotICAgRUNPRkYgdGFyZ2V0cywgYW5kIHRoYXQgcGFydCBpcyBpbiBlY29mZi5jLiAgVGhlIHJlc3QgaXMgZG9uZSBpbgotICAgdGhpcyBiYWNrZW5kIHJvdXRpbmUuICBJdCBtdXN0IGZpbGwgaW4gdGhlIGhvd3RvIGZpZWxkLiAgKi8KLQotc3RhdGljIHZvaWQKLWFscGhhX2FkanVzdF9yZWxvY19pbiAoYWJmZCwgaW50ZXJuLCBycHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBhcmVsZW50ICpycHRyOwotewotICBpZiAoaW50ZXJuLT5yX3R5cGUgPiBBTFBIQV9SX0dQVkFMVUUpCi0gICAgYWJvcnQgKCk7Ci0KLSAgc3dpdGNoIChpbnRlcm4tPnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBBTFBIQV9SX0JSQUREUjoKLSAgICBjYXNlIEFMUEhBX1JfU1JFTDE2OgotICAgIGNhc2UgQUxQSEFfUl9TUkVMMzI6Ci0gICAgY2FzZSBBTFBIQV9SX1NSRUw2NDoKLSAgICAgIC8qIFRoaXMgcmVsb2NzIGFwcGVhciB0byBiZSBmdWxseSByZXNvbHZlZCB3aGVuIHRoZXkgYXJlIGFnYWluc3QKLSAgICAgICAgIGludGVybmFsIHN5bWJvbHMuICBBZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMsIEJSQUREUiBhdCBsZWFzdAotICAgICAgICAgYXBwZWFycyB0byBiZSByZXNvbHZlZCBhZ2FpbnN0IHRoZSBuZXh0IGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGlmICghIGludGVybi0+cl9leHRlcm4pCi0JcnB0ci0+YWRkZW5kID0gMDsKLSAgICAgIGVsc2UKLQlycHRyLT5hZGRlbmQgPSAtIChpbnRlcm4tPnJfdmFkZHIgKyA0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0dQUkVMMzI6Ci0gICAgY2FzZSBBTFBIQV9SX0xJVEVSQUw6Ci0gICAgICAvKiBDb3B5IHRoZSBncCB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBhZGRlbmQsIHRvCi0JIGVuc3VyZSB0aGF0IHdlIGFyZSBub3QgY29uZnVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0gICAgICBpZiAoISBpbnRlcm4tPnJfZXh0ZXJuKQotCXJwdHItPmFkZGVuZCArPSBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9MSVRVU0U6Ci0gICAgY2FzZSBBTFBIQV9SX0dQRElTUDoKLSAgICAgIC8qIFRoZSBMSVRVU0UgYW5kIEdQRElTUCByZWxvY3MgZG8gbm90IHVzZSBhIHN5bWJvbCwgb3IgYW4KLQkgYWRkZW5kLCBidXQgdGhleSBkbyB1c2UgYSBzcGVjaWFsIGNvZGUuICBQdXQgdGhpcyBjb2RlIGluIHRoZQotCSBhZGRlbmQgZmllbGQuICAqLwotICAgICAgcnB0ci0+YWRkZW5kID0gaW50ZXJuLT5yX3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLSAgICAgIC8qIFRoZSBTVE9SRSByZWxvYyBuZWVkcyB0aGUgc2l6ZSBhbmQgb2Zmc2V0IGZpZWxkcy4gIFdlIHN0b3JlCi0JIHRoZW0gaW4gdGhlIGFkZGVuZC4gICovCi0gICAgICBCRkRfQVNTRVJUIChpbnRlcm4tPnJfb2Zmc2V0IDw9IDI1NiAmJiBpbnRlcm4tPnJfc2l6ZSA8PSAyNTYpOwotICAgICAgcnB0ci0+YWRkZW5kID0gKGludGVybi0+cl9vZmZzZXQgPDwgOCkgKyBpbnRlcm4tPnJfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BTVUI6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6Ci0gICAgICAvKiBUaGUgUFVTSCwgUFNVQiBhbmQgUFJTSElGVCByZWxvY3MgZG8gbm90IGFjdHVhbGx5IHVzZSBhbgotCSBhZGRyZXNzLiAgSSBiZWxpZXZlIHRoYXQgdGhlIGFkZHJlc3Mgc3VwcGxpZWQgaXMgcmVhbGx5IGFuCi0JIGFkZGVuZC4gICovCi0gICAgICBycHRyLT5hZGRlbmQgPSBpbnRlcm4tPnJfdmFkZHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9HUFZBTFVFOgotICAgICAgLyogU2V0IHRoZSBhZGRlbmQgZmllbGQgdG8gdGhlIG5ldyBHUCB2YWx1ZS4gICovCi0gICAgICBycHRyLT5hZGRlbmQgPSBpbnRlcm4tPnJfc3ltbmR4ICsgZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgotICAgICAgLyogSWYgdGhlIHR5cGUgaXMgQUxQSEFfUl9JR05PUkUsIG1ha2Ugc3VyZSB0aGlzIGlzIGEgcmVmZXJlbmNlCi0JIHRvIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHNvIHRoYXQgdGhlIHJlbG9jIGlzIGlnbm9yZWQuICBGb3IKLQkgc29tZSByZWFzb24gdGhlIGFkZHJlc3Mgb2YgdGhpcyByZWxvYyB0eXBlIGlzIG5vdCBhZGp1c3RlZCBieQotCSB0aGUgc2VjdGlvbiB2bWEuICBXZSByZWNvcmQgdGhlIGdwIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlCi0JIGhlcmUsIGZvciBjb252ZW5pZW5jZSB3aGVuIGRvaW5nIHRoZSBHUERJU1AgcmVsb2NhdGlvbi4gICovCi0gICAgICBycHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgICAgcnB0ci0+YWRkcmVzcyA9IGludGVybi0+cl92YWRkcjsKLSAgICAgIHJwdHItPmFkZGVuZCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBycHRyLT5ob3d0byA9ICZhbHBoYV9ob3d0b190YWJsZVtpbnRlcm4tPnJfdHlwZV07Ci19Ci0KLS8qIFdoZW4gd3JpdGluZyBvdXQgYSByZWxvYyB3ZSBuZWVkIHRvIHB1bGwgc29tZSB2YWx1ZXMgYmFjayBvdXQgb2YKLSAgIHRoZSBhZGRlbmQgZmllbGQgaW50byB0aGUgcmVsb2MuICBUaGlzIGlzIHJvdWdobHkgdGhlIHJldmVyc2Ugb2YKLSAgIGFscGhhX2FkanVzdF9yZWxvY19pbiwgZXhjZXB0IHRoYXQgdGhlcmUgYXJlIHNldmVyYWwgY2hhbmdlcyB3ZSBkbwotICAgbm90IG5lZWQgdG8gdW5kby4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9hZGp1c3RfcmVsb2Nfb3V0IChhYmZkLCByZWwsIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBhcmVsZW50ICpyZWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotewotICBzd2l0Y2ggKGludGVybi0+cl90eXBlKQotICAgIHsKLSAgICBjYXNlIEFMUEhBX1JfTElUVVNFOgotICAgIGNhc2UgQUxQSEFfUl9HUERJU1A6Ci0gICAgICBpbnRlcm4tPnJfc2l6ZSA9IHJlbC0+YWRkZW5kOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfT1BfU1RPUkU6Ci0gICAgICBpbnRlcm4tPnJfc2l6ZSA9IHJlbC0+YWRkZW5kICYgMHhmZjsKLSAgICAgIGludGVybi0+cl9vZmZzZXQgPSAocmVsLT5hZGRlbmQgPj4gOCkgJiAweGZmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfT1BfUFVTSDoKLSAgICBjYXNlIEFMUEhBX1JfT1BfUFNVQjoKLSAgICBjYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLSAgICAgIGludGVybi0+cl92YWRkciA9IHJlbC0+YWRkZW5kOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgotICAgICAgaW50ZXJuLT5yX3ZhZGRyID0gcmVsLT5hZGRyZXNzOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgc3RhY2sgZm9yIHRoZSByZWxvY2F0aW9uIGV2YWx1YXRvci4gICovCi0jZGVmaW5lIFJFTE9DX1NUQUNLU0laRSAoMTApCi0KLS8qIEFscGhhIEVDT0ZGIHJlbG9jcyBoYXZlIGEgYnVpbHQgaW4gZXhwcmVzc2lvbiBldmFsdWF0b3IgYXMgd2VsbCBhcwotICAgb3RoZXIgaW50ZXJkZXBlbmRlbmNpZXMuICBSYXRoZXIgdGhhbiB1c2UgYSBidW5jaCBvZiBzcGVjaWFsCi0gICBmdW5jdGlvbnMgYW5kIGdsb2JhbCB2YXJpYWJsZXMsIHdlIHVzZSBhIHNpbmdsZSByb3V0aW5lIHRvIGRvIGFsbAotICAgdGhlIHJlbG9jYXRpb24gZm9yIGEgc2VjdGlvbi4gIEkgaGF2ZW4ndCB5ZXQgd29ya2VkIG91dCBob3cgdGhlCi0gICBhc3NlbWJsZXIgaXMgZ29pbmcgdG8gaGFuZGxlIHRoaXMuICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSAgICBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yID0gTlVMTDsKLSAgbG9uZyByZWxvY19jb3VudDsKLSAgYmZkICpvdXRwdXRfYmZkID0gcmVsb2NhdGVhYmxlID8gYWJmZCA6IChiZmQgKikgTlVMTDsKLSAgYmZkX3ZtYSBncDsKLSAgYm9vbGVhbiBncF91bmRlZmluZWQ7Ci0gIGJmZF92bWEgc3RhY2tbUkVMT0NfU1RBQ0tTSVpFXTsKLSAgaW50IHRvcyA9IDA7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGRhdGEsCi0JCQkJICAoZmlsZV9wdHIpIDAsIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIHNlY3Rpb24gc2l6ZSBpcyBub3QgZ29pbmcgdG8gY2hhbmdlLiAgKi8KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplOwotICBpbnB1dF9zZWN0aW9uLT5yZWxvY19kb25lID0gdHJ1ZTsKLQotICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJcmVsb2NfdmVjdG9yLCBzeW1ib2xzKTsKLSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKHJlbG9jX2NvdW50ID09IDApCi0gICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKLQotICAvKiBHZXQgdGhlIEdQIHZhbHVlIGZvciB0aGUgb3V0cHV0IEJGRC4gICovCi0gIGdwX3VuZGVmaW5lZCA9IGZhbHNlOwotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKTsKLSAgaWYgKGdwID09IDApCi0gICAgewotICAgICAgaWYgKHJlbG9jYXRlYWJsZSAhPSBmYWxzZSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCSAgYmZkX3ZtYSBsbzsKLQotCSAgLyogTWFrZSB1cCBhIHZhbHVlLiAgKi8KLQkgIGxvID0gKGJmZF92bWEpIC0xOwotCSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzZWMtPnZtYSA8IGxvCi0JCSAgJiYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLnNic3MiKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoc2VjLT5uYW1lLCAiLnNkYXRhIikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKHNlYy0+bmFtZSwgIi5saXQ0IikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKHNlYy0+bmFtZSwgIi5saXQ4IikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKHNlYy0+bmFtZSwgIi5saXRhIikgPT0gMCkpCi0JCWxvID0gc2VjLT52bWE7Ci0JICAgIH0KLQkgIGdwID0gbG8gKyAweDgwMDA7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAoYWJmZCwgZ3ApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8tPmhhc2gsICJfZ3AiLCBmYWxzZSwgZmFsc2UsCi0JCQkJICAgIHRydWUpOwotCSAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgICAgZ3BfdW5kZWZpbmVkID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGdwID0gKGgtPnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKGFiZmQsIGdwKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZm9yICg7ICpyZWxvY192ZWN0b3IgIT0gKGFyZWxlbnQgKikgTlVMTDsgcmVsb2NfdmVjdG9yKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gICAgICBjaGFyICplcnI7Ci0KLSAgICAgIHJlbCA9ICpyZWxvY192ZWN0b3I7Ci0gICAgICByID0gYmZkX3JlbG9jX29rOwotICAgICAgc3dpdGNoIChyZWwtPmhvd3RvLT50eXBlKQotCXsKLQljYXNlIEFMUEhBX1JfSUdOT1JFOgotCSAgcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9SRUZMT05HOgotCWNhc2UgQUxQSEFfUl9SRUZRVUFEOgotCWNhc2UgQUxQSEFfUl9CUkFERFI6Ci0JY2FzZSBBTFBIQV9SX0hJTlQ6Ci0JY2FzZSBBTFBIQV9SX1NSRUwxNjoKLQljYXNlIEFMUEhBX1JfU1JFTDMyOgotCWNhc2UgQUxQSEFfUl9TUkVMNjQ6Ci0JICBpZiAocmVsb2NhdGVhYmxlCi0JICAgICAgJiYgKCgqcmVsLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotCSAgICB7Ci0JICAgICAgcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsIHJlbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBvdXRwdXRfYmZkLCAmZXJyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0dQUkVMMzI6Ci0JICAvKiBUaGlzIHJlbG9jYXRpb24gaXMgdXNlZCBpbiBhIHN3aXRjaCB0YWJsZS4gIEl0IGlzIGEgMzIKLQkgICAgIGJpdCBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCBHUCB2YWx1ZS4gIFdlIG11c3QgYWRqdXN0IGl0Ci0JICAgICBieSB0aGUgZGlmZmVyZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIEdQIHZhbHVlIGFuZCB0aGUKLQkgICAgIGN1cnJlbnQgR1AgdmFsdWUuICBUaGUgb3JpZ2luYWwgR1AgdmFsdWUgaXMgc3RvcmVkIGluIHRoZQotCSAgICAgYWRkZW5kLiAgV2UgYWRqdXN0IHRoZSBhZGRlbmQgYW5kIGxldAotCSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggdGhlIGpvYi4gICovCi0JICByZWwtPmFkZGVuZCAtPSBncDsKLQkgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsIHJlbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBvdXRwdXRfYmZkLCAmZXJyKTsKLQkgIGlmIChyID09IGJmZF9yZWxvY19vayAmJiBncF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICByID0gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQkgICAgICBlcnIgPSAoY2hhciAqKSBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHVzZWQgd2hlbiBHUCBub3QgZGVmaW5lZCIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9MSVRFUkFMOgotCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIGxpdGVyYWwgdmFsdWUsIGdlbmVyYWxseQotCSAgICAgKGFsd2F5cz8pIGluIHRoZSAubGl0YSBzZWN0aW9uLiAgVGhpcyBpcyBhIDE2IGJpdCBHUAotCSAgICAgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFNvbWV0aW1lcyB0aGUgc3Vic2VxdWVudCByZWxvYyBpcyBhCi0JICAgICBMSVRVU0UgcmVsb2MsIHdoaWNoIGluZGljYXRlcyBob3cgdGhpcyByZWxvYyBpcyB1c2VkLgotCSAgICAgVGhpcyBzb21ldGltZXMgcGVybWl0cyByZXdyaXRpbmcgdGhlIHR3byBpbnN0cnVjdGlvbnMKLQkgICAgIHJlZmVycmVkIHRvIGJ5IHRoZSBMSVRFUkFMIGFuZCB0aGUgTElUVVNFIGludG8gZGlmZmVyZW50Ci0JICAgICBpbnN0cnVjdGlvbnMgd2hpY2ggZG8gbm90IHJlZmVyIHRvIC5saXRhLiAgVGhpcyBjYW4gc2F2ZQotCSAgICAgYSBtZW1vcnkgcmVmZXJlbmNlLCBhbmQgcGVybWl0cyByZW1vdmluZyBhIHZhbHVlIGZyb20KLQkgICAgIC5saXRhIHRodXMgc2F2aW5nIEdQIHJlbGF0aXZlIHNwYWNlLgotCi0JICAgICBXZSBkbyBub3QgdGhlc2Ugb3B0aW1pemF0aW9ucy4gIFRvIGRvIHRoZW0gd2Ugd291bGQgbmVlZAotCSAgICAgdG8gYXJyYW5nZSB0byBsaW5rIHRoZSAubGl0YSBzZWN0aW9uIGZpcnN0LCBzbyB0aGF0IGJ5Ci0JICAgICB0aGUgdGltZSB3ZSBnb3QgaGVyZSB3ZSB3b3VsZCBrbm93IHRoZSBmaW5hbCB2YWx1ZXMgdG8KLQkgICAgIHVzZS4gIFRoaXMgd291bGQgbm90IGJlIHBhcnRpY3VsYXJseSBkaWZmaWN1bHQsIGJ1dCBpdCBpcwotCSAgICAgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4gICovCi0KLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0JICAgIC8qIEkgYmVsaWV2ZSB0aGF0IHRoZSBMSVRFUkFMIHJlbG9jIHdpbGwgb25seSBhcHBseSB0byBhCi0JICAgICAgIGxkcSBvciBsZGwgaW5zdHJ1Y3Rpb24sIHNvIGNoZWNrIG15IGFzc3VtcHRpb24uICAqLwotCSAgICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgQkZEX0FTU0VSVCAoKChpbnNuID4+IDI2KSAmIDB4M2YpID09IDB4MjkKLQkJCXx8ICgoaW5zbiA+PiAyNikgJiAweDNmKSA9PSAweDI4KTsKLQotCSAgICByZWwtPmFkZGVuZCAtPSBncDsKLQkgICAgciA9IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwgcmVsLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJCQlvdXRwdXRfYmZkLCAmZXJyKTsKLQkgICAgaWYgKHIgPT0gYmZkX3JlbG9jX29rICYmIGdwX3VuZGVmaW5lZCkKLQkgICAgICB7Ci0JCXIgPSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCQllcnIgPQotCQkgIChjaGFyICopIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gdXNlZCB3aGVuIEdQIG5vdCBkZWZpbmVkIik7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfTElUVVNFOgotCSAgLyogU2VlIEFMUEhBX1JfTElURVJBTCBhYm92ZSBmb3IgdGhlIHVzZXMgb2YgdGhpcyByZWxvYy4gIEl0Ci0JICAgICBkb2VzIG5vdCBjYXVzZSBhbnl0aGluZyB0byBoYXBwZW4sIGl0c2VsZi4gICovCi0JICByZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIGJyZWFrOwotCSAgICAKLQljYXNlIEFMUEhBX1JfR1BESVNQOgotCSAgLyogVGhpcyBtYXJrcyB0aGUgbGRhaCBvZiBhbiBsZGFoL2xkYSBwYWlyIHdoaWNoIGxvYWRzIHRoZQotCSAgICAgZ3AgcmVnaXN0ZXIgd2l0aCB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgZ3AgdmFsdWUgYW5kIHRoZQotCSAgICAgY3VycmVudCBsb2NhdGlvbi4gIFRoZSBzZWNvbmQgb2YgdGhlIHBhaXIgaXMgcl9zaXplIGJ5dGVzCi0JICAgICBhaGVhZDsgaXQgdXNlZCB0byBiZSBtYXJrZWQgd2l0aCBhbiBBTFBIQV9SX0lHTk9SRSByZWxvYywKLQkgICAgIGJ1dCB0aGF0IG5vIGxvbmdlciBoYXBwZW5zIGluIE9TRi8xIDMuMi4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOwotCSAgICBiZmRfdm1hIGFkZGVuZDsKLQotCSAgICAvKiBHZXQgdGhlIHR3byBpbnN0cnVjdGlvbnMuICAqLwotCSAgICBpbnNuMSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICAgIGluc24yID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgcmVsLT5hZGRyZXNzICsgcmVsLT5hZGRlbmQpOwotCi0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbjEgPj4gMjYpICYgMHgzZikgPT0gMHgwOSk7IC8qIGxkYWggKi8KLQkgICAgQkZEX0FTU0VSVCAoKChpbnNuMiA+PiAyNikgJiAweDNmKSA9PSAweDA4KTsgLyogbGRhICovCi0KLQkgICAgLyogR2V0IHRoZSBleGlzdGluZyBhZGRlbmQuICBXZSBtdXN0IGFjY291bnQgZm9yIHRoZSBzaWduCi0JICAgICAgIGV4dGVuc2lvbiBkb25lIGJ5IGxkYSBhbmQgbGRhaC4gICovCi0JICAgIGFkZGVuZCA9ICgoaW5zbjEgJiAweGZmZmYpIDw8IDE2KSArIChpbnNuMiAmIDB4ZmZmZik7Ci0JICAgIGlmIChpbnNuMSAmIDB4ODAwMCkKLQkgICAgICB7Ci0JCWFkZGVuZCAtPSAweDgwMDAwMDAwOwotCQlhZGRlbmQgLT0gMHg4MDAwMDAwMDsKLQkgICAgICB9Ci0JICAgIGlmIChpbnNuMiAmIDB4ODAwMCkKLQkgICAgICBhZGRlbmQgLT0gMHgxMDAwMDsKLQotCSAgICAvKiBUaGUgZXhpc3RpbmcgYWRkZW5kIGluY2x1ZGVzIHRoZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUKLQkgICAgICAgZ3Agb2YgdGhlIGlucHV0IEJGRCBhbmQgdGhlIGFkZHJlc3MgaW4gdGhlIGlucHV0IEJGRC4KLQkgICAgICAgU3VidHJhY3QgdGhpcyBvdXQuICAqLwotCSAgICBhZGRlbmQgLT0gKGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwCi0JCSAgICAgICAtIChpbnB1dF9zZWN0aW9uLT52bWEgKyByZWwtPmFkZHJlc3MpKTsKLQotCSAgICAvKiBOb3cgYWRkIGluIHRoZSBmaW5hbCBncCB2YWx1ZSwgYW5kIHN1YnRyYWN0IG91dCB0aGUKLQkgICAgICAgZmluYWwgYWRkcmVzcy4gICovCi0JICAgIGFkZGVuZCArPSAoZ3AKLQkJICAgICAgIC0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICsgcmVsLT5hZGRyZXNzKSk7Ci0KLQkgICAgLyogQ2hhbmdlIHRoZSBpbnN0cnVjdGlvbnMsIGFjY291bnRpbmcgZm9yIHRoZSBzaWduCi0JICAgICAgIGV4dGVuc2lvbiwgYW5kIHdyaXRlIHRoZW0gb3V0LiAgKi8KLQkgICAgaWYgKGFkZGVuZCAmIDB4ODAwMCkKLQkgICAgICBhZGRlbmQgKz0gMHgxMDAwMDsKLQkgICAgaW5zbjEgPSAoaW5zbjEgJiAweGZmZmYwMDAwKSB8ICgoYWRkZW5kID4+IDE2KSAmIDB4ZmZmZik7Ci0JICAgIGluc24yID0gKGluc24yICYgMHhmZmZmMDAwMCkgfCAoYWRkZW5kICYgMHhmZmZmKTsKLQotCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSBpbnNuMSwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24yLAotCQkJZGF0YSArIHJlbC0+YWRkcmVzcyArIHJlbC0+YWRkZW5kKTsKLQotCSAgICByZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0JICAvKiBQdXNoIGEgdmFsdWUgb24gdGhlIHJlbG9jIGV2YWx1YXRpb24gc3RhY2suICAqLwotCSAgewotCSAgICBhc3ltYm9sICpzeW1ib2w7Ci0JICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotCSAgICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICAgIHsKLQkJcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICAvKiBGaWd1cmUgb3V0IHRoZSByZWxvY2F0aW9uIG9mIHRoaXMgc3ltYm9sLiAgKi8KLQkgICAgc3ltYm9sID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLQkgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotCSAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICBlbHNlCi0JICAgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0JICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPmFkZGVuZDsKLQotCSAgICBpZiAodG9zID49IFJFTE9DX1NUQUNLU0laRSkKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBzdGFja1t0b3MrK10gPSByZWxvY2F0aW9uOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfT1BfU1RPUkU6Ci0JICAvKiBTdG9yZSBhIHZhbHVlIGZyb20gdGhlIHJlbG9jIHN0YWNrIGludG8gYSBiaXRmaWVsZC4gICovCi0JICB7Ci0JICAgIGJmZF92bWEgdmFsOwotCSAgICBpbnQgb2Zmc2V0LCBzaXplOwotCi0JICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JICAgICAgewotCQlyZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGlmICh0b3MgPT0gMCkKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICAvKiBUaGUgb2Zmc2V0IGFuZCBzaXplIGZvciB0aGlzIHJlbG9jIGFyZSBlbmNvZGVkIGludG8gdGhlCi0JICAgICAgIGFkZGVuZCBmaWVsZCBieSBhbHBoYV9hZGp1c3RfcmVsb2NfaW4uICAqLwotCSAgICBvZmZzZXQgPSAocmVsLT5hZGRlbmQgPj4gOCkgJiAweGZmOwotCSAgICBzaXplID0gcmVsLT5hZGRlbmQgJiAweGZmOwotCi0JICAgIHZhbCA9IGJmZF9nZXRfNjQgKGFiZmQsIGRhdGEgKyByZWwtPmFkZHJlc3MpOwotCSAgICB2YWwgJj1+ICgoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQpOwotCSAgICB2YWwgfD0gKHN0YWNrWy0tdG9zXSAmICgoMSA8PCBzaXplKSAtIDEpKSA8PCBvZmZzZXQ7Ci0JICAgIGJmZF9wdXRfNjQgKGFiZmQsIHZhbCwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9QU1VCOgotCSAgLyogU3VidHJhY3QgYSB2YWx1ZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQkgIHsKLQkgICAgYXN5bWJvbCAqc3ltYm9sOwotCSAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLQkgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgICB7Ci0JCXJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogRmlndXJlIG91dCB0aGUgcmVsb2NhdGlvbiBvZiB0aGlzIHN5bWJvbC4gICovCi0JICAgIHN5bWJvbCA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0JICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgICAgciA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLQkgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5hZGRlbmQ7Ci0KLQkgICAgaWYgKHRvcyA9PSAwKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIHN0YWNrW3RvcyAtIDFdIC09IHJlbG9jYXRpb247Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgotCSAgLyogU2hpZnQgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQkgIHsKLQkgICAgYXN5bWJvbCAqc3ltYm9sOwotCSAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLQkgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgICB7Ci0JCXJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogRmlndXJlIG91dCB0aGUgcmVsb2NhdGlvbiBvZiB0aGlzIHN5bWJvbC4gICovCi0JICAgIHN5bWJvbCA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0JICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgICAgciA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLQkgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5hZGRlbmQ7Ci0KLQkgICAgaWYgKHRvcyA9PSAwKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIHN0YWNrW3RvcyAtIDFdID4+PSByZWxvY2F0aW9uOwotCSAgfQotCSAgYnJlYWs7Ci0JICAgIAotCWNhc2UgQUxQSEFfUl9HUFZBTFVFOgotCSAgLyogSSByZWFsbHkgZG9uJ3Qga25vdyBpZiB0aGlzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQkgIGdwID0gcmVsLT5hZGRlbmQ7Ci0JICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQl7Ci0JICBhc2VjdGlvbiAqb3MgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgLyogQSBwYXJ0aWFsIGxpbmssIHNvIGtlZXAgdGhlIHJlbG9jcy4gICovCi0JICBvcy0+b3JlbG9jYXRpb25bb3MtPnJlbG9jX2NvdW50XSA9IHJlbDsKLQkgIG9zLT5yZWxvY19jb3VudCsrOwotCX0KLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKSAKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWwtPnN5bV9wdHJfcHRyKSwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPmFkZHJlc3MpKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czogCi0JICAgICAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAobGlua19pbmZvLCBlcnIsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5hZGRyZXNzKSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbC0+c3ltX3B0cl9wdHIpLAotCQkgICAgICByZWwtPmhvd3RvLT5uYW1lLCByZWwtPmFkZGVuZCwgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPmFkZHJlc3MpKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICh0b3MgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotIHN1Y2Nlc3NmdWxfcmV0dXJuOgotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2V0IHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIGEgZ2VuZXJpYyByZWxvYyB0eXBlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBpbnQgYWxwaGFfdHlwZTsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfUkVGTE9ORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzY0OgotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZRVUFEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0dQUkVMMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfTElURVJBTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0xJVFVTRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfR1BESVNQOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9JR05PUkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18yM19QQ1JFTF9TMjoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0JSQUREUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9ISU5UOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzY0X1BDUkVMOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfU1JFTDY0OwotICAgICAgYnJlYWs7Ci0jaWYgMAotICAgIGNhc2UgPz8/OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfT1BfUFVTSDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgPz8/OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfT1BfU1RPUkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX09QX1BTVUI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX09QX1BSU0hJRlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0dQVkFMVUU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZhbHBoYV9ob3d0b190YWJsZVthbHBoYV90eXBlXTsKLX0KLQwKLS8qIEEgaGVscGVyIHJvdXRpbmUgZm9yIGFscGhhX3JlbG9jYXRlX3NlY3Rpb24gd2hpY2ggY29udmVydHMgYW4KLSAgIGV4dGVybmFsIHJlbG9jIHdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgUmV0dXJucyB0aGUKLSAgIHJlbG9jYXRpb24gYW1vdW50LiAgKi8KLQotc3RhdGljIGJmZF92bWEKLWFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MgKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgZXh0X3JlbCwgaCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbDsKLSAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIEJGRF9BU1NFUlQgKGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBvdXRwdXQuICBDb252ZXJ0IHRoZSByZWxvYyBmcm9tCi0JIGJlaW5nIGFnYWluc3QgdGhlIHN5bWJvbCB0byBiZWluZyBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLQotICAgICAgLyogQ2xlYXIgdGhlIHJfZXh0ZXJuIGJpdC4gICovCi0gICAgICBleHRfcmVsLT5yX2JpdHNbMV0gJj1+IFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEU7Ci0KLSAgICAgIC8qIENvbXB1dGUgYSBuZXcgcl9zeW1uZHggdmFsdWUuICAqLwotICAgICAgaHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgaHNlYy0+b3V0cHV0X3NlY3Rpb24pOwotCi0gICAgICByX3N5bW5keCA9IC0xOwotICAgICAgc3dpdGNoIChuYW1lWzFdKQotCXsKLQljYXNlICdBJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIqQUJTKiIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9BQlM7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0RBVEE7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9GSU5JOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5saXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ4OwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUNDsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5wZGF0YSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9QREFUQTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SREFUQTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yY29uc3QiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkNPTlNUOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0JTUzsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIueGRhdGEiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fWERBVEE7Ci0JICBicmVhazsKLQl9Ci0JCSAgICAgIAotICAgICAgaWYgKHJfc3ltbmR4ID09IC0xKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBBZGQgdGhlIHNlY3Rpb24gVk1BIGFuZCB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGhzZWMtPm91dHB1dF9vZmZzZXQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIENoYW5nZSB0aGUgc3ltbmR4IHZhbHVlIHRvIHRoZSByaWdodCBvbmUgZm9yCi0JIHRoZSBvdXRwdXQgQkZELiAgKi8KLSAgICAgIHJfc3ltbmR4ID0gaC0+aW5keDsKLSAgICAgIGlmIChyX3N5bW5keCA9PSAtMSkKLQl7Ci0JICAvKiBDYWxsZXIgbXVzdCBnaXZlIGFuIGVycm9yLiAgKi8KLQkgIHJfc3ltbmR4ID0gMDsKLQl9Ci0gICAgICByZWxvY2F0aW9uID0gMDsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBuZXcgcl9zeW1uZHggdmFsdWUuICAqLwotICBiZmRfaF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIHJfc3ltbmR4LAotCQkoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl9zeW1uZHgpOwotCi0gIHJldHVybiByZWxvY2F0aW9uOwotfQotCi0vKiBSZWxvY2F0ZSBhIHNlY3Rpb24gd2hpbGUgbGlua2luZyBhbiBBbHBoYSBFQ09GRiBmaWxlLiAgVGhpcyBpcwotICAgcXVpdGUgc2ltaWxhciB0byBnZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuICBQZXJoYXBzIHRoZXkKLSAgIGNvdWxkIGJlIGNvbWJpbmVkIHNvbWVob3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYWxwaGFfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJY29udGVudHMsIGV4dGVybmFsX3JlbG9jcykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci17Ci0gIGFzZWN0aW9uICoqc3ltbmR4X3RvX3NlY3Rpb24sICpsaXRhX3NlYzsKLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgZ3A7Ci0gIGJvb2xlYW4gZ3BfdW5kZWZpbmVkOwotICBiZmRfdm1hIHN0YWNrW1JFTE9DX1NUQUNLU0laRV07Ci0gIGludCB0b3MgPSAwOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWw7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbF9lbmQ7Ci0KLSAgLyogV2Uga2VlcCBhIHRhYmxlIG1hcHBpbmcgdGhlIHN5bW5keCBmb3VuZCBpbiBhbiBpbnRlcm5hbCByZWxvYyB0bwotICAgICB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4gIFRoaXMgaXMgZmFzdGVyIHRoYW4gbG9va2luZyB1cCB0aGUKLSAgICAgc2VjdGlvbiBieSBuYW1lIGVhY2ggdGltZS4gICovCi0gIHN5bW5keF90b19zZWN0aW9uID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+c3ltbmR4X3RvX3NlY3Rpb247Ci0gIGlmIChzeW1uZHhfdG9fc2VjdGlvbiA9PSAoYXNlY3Rpb24gKiopIE5VTEwpCi0gICAgewotICAgICAgc3ltbmR4X3RvX3NlY3Rpb24gPSAoKGFzZWN0aW9uICoqKQotCQkJICAgYmZkX2FsbG9jIChpbnB1dF9iZmQsCi0JCQkJICAgICAgKE5VTV9SRUxPQ19TRUNUSU9OUwotCQkJCSAgICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0gICAgICBpZiAoIXN5bW5keF90b19zZWN0aW9uKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9OT05FXSA9IE5VTEw7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1RFWFRdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnRleHQiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUkRBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnJkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0RBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0RBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1NCU1NdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNic3MiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQlNTXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5ic3MiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fSU5JVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuaW5pdCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVQ4XSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5saXQ4Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDRdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDQiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fWERBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnhkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1BEQVRBXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5wZGF0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9GSU5JXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5maW5pIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQUJTXSA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1JDT05TVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIucmNvbnN0Iik7Ci0KLSAgICAgIGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnN5bW5keF90b19zZWN0aW9uID0gc3ltbmR4X3RvX3NlY3Rpb247Ci0gICAgfQotCi0gIHN5bV9oYXNoZXMgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1faGFzaGVzOwotCi0gIC8qIE9uIHRoZSBBbHBoYSwgdGhlIC5saXRhIHNlY3Rpb24gbXVzdCBiZSBhZGRyZXNzYWJsZSBieSB0aGUgZ2xvYmFsCi0gICAgIHBvaW50ZXIuICBUbyBzdXBwb3J0IGxhcmdlIHByb2dyYW1zLCB3ZSBuZWVkIHRvIGFsbG93IG11bHRpcGxlCi0gICAgIGdsb2JhbCBwb2ludGVycy4gIFRoaXMgd29ya3MgYXMgbG9uZyBhcyBlYWNoIGlucHV0IC5saXRhIHNlY3Rpb24KLSAgICAgaXMgPDY0S0IgYmlnLiAgVGhpcyBpbXBsaWVzIHRoYXQgd2hlbiBwcm9kdWNpbmcgcmVsb2NhdGFibGUKLSAgICAgb3V0cHV0LCB0aGUgLmxpdGEgc2VjdGlvbiBpcyBsaW1pdGVkIHRvIDY0S0IuIC4gKi8KLQotICBsaXRhX3NlYyA9IHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUQV07Ci0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUgJiYgbGl0YV9zZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqbGl0YV9zZWNfZGF0YTsKLQotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBzZWN0aW9uIGRhdGEgc3RydWN0dXJlIHRvIHdoaWNoIHdlIGNhbgotCSBoYW5nIG9uIHRvIHRoZSBncCB2YWx1ZSB3ZSBwaWNrIGZvciB0aGUgc2VjdGlvbi4gICovCi0gICAgICBsaXRhX3NlY19kYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGxpdGFfc2VjKTsKLSAgICAgIGlmIChsaXRhX3NlY19kYXRhID09IE5VTEwpCi0JewotCSAgbGl0YV9zZWNfZGF0YSA9ICgoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikKLQkJCSAgIGJmZF96YWxsb2MgKGlucHV0X2JmZCwKLQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLQkgIGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBsaXRhX3NlYykgPSBsaXRhX3NlY19kYXRhOwotCX0KLQotICAgICAgaWYgKGxpdGFfc2VjX2RhdGEtPmdwICE9IDApCi0JewotCSAgLyogSWYgd2UgYWxyZWFkeSBhc3NpZ25lZCBhIGdwIHRvIHRoaXMgc2VjdGlvbiwgd2UgYmV0dGVyCi0JICAgICBzdGljayB3aXRoIHRoYXQgdmFsdWUuICAqLwotCSAgZ3AgPSBsaXRhX3NlY19kYXRhLT5ncDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSBsaXRhX3ZtYTsKLQkgIGJmZF9zaXplX3R5cGUgbGl0YV9zaXplOwotCi0JICBsaXRhX3ZtYSA9IGxpdGFfc2VjLT5vdXRwdXRfb2Zmc2V0ICsgbGl0YV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICBsaXRhX3NpemUgPSBsaXRhX3NlYy0+X2Nvb2tlZF9zaXplOwotCSAgaWYgKGxpdGFfc2l6ZSA9PSAwKQotCSAgICBsaXRhX3NpemUgPSBsaXRhX3NlYy0+X3Jhd19zaXplOwotCi0JICBpZiAoZ3AgPT0gMAotCSAgICAgIHx8IGxpdGFfdm1hIDwgIGdwIC0gMHg4MDAwCi0JICAgICAgfHwgbGl0YV92bWEgKyBsaXRhX3NpemUgPj0gZ3AgKyAweDgwMDApCi0JICAgIHsKLQkgICAgICAvKiBFaXRoZXIgZ3AgaGFzbid0IGJlZW4gc2V0IGF0IGFsbCBvciB0aGUgY3VycmVudCBncAotCQkgY2Fubm90IGFkZHJlc3MgdGhpcyAubGl0YSBzZWN0aW9uLiAgSW4gYm90aCBjYXNlcyB3ZQotCQkgcmVzZXQgdGhlIGdwIHRvIHBvaW50IGludG8gdGhlICJtaWRkbGUiIG9mIHRoZQotCQkgY3VycmVudCBpbnB1dCAubGl0YSBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoZ3AgJiYgIWVjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5pc3N1ZWRfbXVsdGlwbGVfZ3Bfd2FybmluZykKLQkJewotCQkgICgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKSAoaW5mbywKLQkJCQkJICAgICAgIF8oInVzaW5nIG11bHRpcGxlIGdwIHZhbHVlcyIpLAotCQkJCQkgICAgICAgKGNoYXIgKikgTlVMTCwgb3V0cHV0X2JmZCwKLQkJCQkJICAgICAgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCk7Ci0JCSAgZWNvZmZfZGF0YSAob3V0cHV0X2JmZCktPmlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nID0gdHJ1ZTsKLQkJfQotCSAgICAgIGlmIChsaXRhX3ZtYSA8IGdwIC0gMHg4MDAwKQotCQlncCA9IGxpdGFfdm1hICsgbGl0YV9zaXplIC0gMHg4MDAwOwotCSAgICAgIGVsc2UKLQkJZ3AgPSBsaXRhX3ZtYSArIDB4ODAwMDsKLQotCSAgICB9Ci0KLQkgIGxpdGFfc2VjX2RhdGEtPmdwID0gZ3A7Ci0JfQotCi0gICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotICAgIH0KLQotICBncF91bmRlZmluZWQgPSAoZ3AgPT0gMCk7Ci0KLSAgQkZEX0FTU0VSVCAoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChvdXRwdXRfYmZkKSk7Ci0gIEJGRF9BU1NFUlQgKGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoaW5wdXRfYmZkKSk7Ci0KLSAgZXh0X3JlbCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgZXh0ZXJuYWxfcmVsb2NzOwotICBleHRfcmVsX2VuZCA9IGV4dF9yZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgcl92YWRkcjsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgaW50IHJfZXh0ZXJuOwotICAgICAgaW50IHJfb2Zmc2V0OwotICAgICAgaW50IHJfc2l6ZTsKLSAgICAgIGJvb2xlYW4gcmVsb2NhdGVwOwotICAgICAgYm9vbGVhbiBhZGp1c3RfYWRkcnA7Ci0gICAgICBib29sZWFuIGdwX3VzZWRwOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAgIHJfdmFkZHIgPSBiZmRfaF9nZXRfNjQgKGlucHV0X2JmZCwgKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfdmFkZHIpOwotICAgICAgcl9zeW1uZHggPSBiZmRfaF9nZXRfMzIgKGlucHV0X2JmZCwgKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfc3ltbmR4KTsKLQotICAgICAgcl90eXBlID0gKChleHRfcmVsLT5yX2JpdHNbMF0gJiBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRSkKLQkJPj4gUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpOwotICAgICAgcl9leHRlcm4gPSAoZXh0X3JlbC0+cl9iaXRzWzFdICYgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSkgIT0gMDsKLSAgICAgIHJfb2Zmc2V0ID0gKChleHRfcmVsLT5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFKQotCQkgID4+IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpOwotICAgICAgLyogSWdub3JlZCB0aGUgcmVzZXJ2ZWQgYml0cy4gICovCi0gICAgICByX3NpemUgPSAoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFKQotCQk+PiBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRSk7Ci0KLSAgICAgIHJlbG9jYXRlcCA9IGZhbHNlOwotICAgICAgYWRqdXN0X2FkZHJwID0gdHJ1ZTsKLSAgICAgIGdwX3VzZWRwID0gZmFsc2U7Ci0gICAgICBhZGRlbmQgPSAwOwotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBBTFBIQV9SX0lHTk9SRToKLQkgIC8qIFRoaXMgcmVsb2MgYXBwZWFycyBhZnRlciBhIEdQRElTUCByZWxvYy4gIE9uIGVhcmxpZXIKLQkgICAgIHZlcnNpb25zIG9mIE9TRi8xLCBJdCBtYXJrZWQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmQKLQkgICAgIGluc3RydWN0aW9uIHRvIGJlIGFsdGVyZWQgYnkgdGhlIEdQRElTUCByZWxvYywgYnV0IGl0IGlzCi0JICAgICBub3Qgb3RoZXJ3aXNlIHVzZWQgZm9yIGFueXRoaW5nLiAgRm9yIHNvbWUgcmVhc29uLCB0aGUKLQkgICAgIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gZG9lcyBub3QgYXBwZWFyIHRvIGluY2x1ZGUgdGhlCi0JICAgICBzZWN0aW9uIFZNQSwgdW5saWtlIHRoZSBvdGhlciByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLQkgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIGJmZF9oX3B1dF82NCAoaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgcl92YWRkciwKLQkJCSAgKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfdmFkZHIpOwotCSAgYWRqdXN0X2FkZHJwID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9SRUZMT05HOgotCWNhc2UgQUxQSEFfUl9SRUZRVUFEOgotCWNhc2UgQUxQSEFfUl9ISU5UOgotCSAgcmVsb2NhdGVwID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0JSQUREUjoKLQljYXNlIEFMUEhBX1JfU1JFTDE2OgotCWNhc2UgQUxQSEFfUl9TUkVMMzI6Ci0JY2FzZSBBTFBIQV9SX1NSRUw2NDoKLQkgIGlmIChyX2V4dGVybikKLQkgICAgYWRkZW5kICs9IC0gKHJfdmFkZHIgKyA0KTsKLQkgIHJlbG9jYXRlcCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9HUFJFTDMyOgotCSAgLyogVGhpcyByZWxvY2F0aW9uIGlzIHVzZWQgaW4gYSBzd2l0Y2ggdGFibGUuICBJdCBpcyBhIDMyCi0JICAgICBiaXQgb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnQgR1AgdmFsdWUuICBXZSBtdXN0IGFkanVzdCBpdAotCSAgICAgYnkgdGhlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBHUCB2YWx1ZSBhbmQgdGhlCi0JICAgICBjdXJyZW50IEdQIHZhbHVlLiAgKi8KLQkgIHJlbG9jYXRlcCA9IHRydWU7Ci0JICBhZGRlbmQgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncCAtIGdwOwotCSAgZ3BfdXNlZHAgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfTElURVJBTDoKLQkgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBsaXRlcmFsIHZhbHVlLCBnZW5lcmFsbHkKLQkgICAgIChhbHdheXM/KSBpbiB0aGUgLmxpdGEgc2VjdGlvbi4gIFRoaXMgaXMgYSAxNiBiaXQgR1AKLQkgICAgIHJlbGF0aXZlIHJlbG9jYXRpb24uICBTb21ldGltZXMgdGhlIHN1YnNlcXVlbnQgcmVsb2MgaXMgYQotCSAgICAgTElUVVNFIHJlbG9jLCB3aGljaCBpbmRpY2F0ZXMgaG93IHRoaXMgcmVsb2MgaXMgdXNlZC4KLQkgICAgIFRoaXMgc29tZXRpbWVzIHBlcm1pdHMgcmV3cml0aW5nIHRoZSB0d28gaW5zdHJ1Y3Rpb25zCi0JICAgICByZWZlcnJlZCB0byBieSB0aGUgTElURVJBTCBhbmQgdGhlIExJVFVTRSBpbnRvIGRpZmZlcmVudAotCSAgICAgaW5zdHJ1Y3Rpb25zIHdoaWNoIGRvIG5vdCByZWZlciB0byAubGl0YS4gIFRoaXMgY2FuIHNhdmUKLQkgICAgIGEgbWVtb3J5IHJlZmVyZW5jZSwgYW5kIHBlcm1pdHMgcmVtb3ZpbmcgYSB2YWx1ZSBmcm9tCi0JICAgICAubGl0YSB0aHVzIHNhdmluZyBHUCByZWxhdGl2ZSBzcGFjZS4KLQotCSAgICAgV2UgZG8gbm90IHRoZXNlIG9wdGltaXphdGlvbnMuICBUbyBkbyB0aGVtIHdlIHdvdWxkIG5lZWQKLQkgICAgIHRvIGFycmFuZ2UgdG8gbGluayB0aGUgLmxpdGEgc2VjdGlvbiBmaXJzdCwgc28gdGhhdCBieQotCSAgICAgdGhlIHRpbWUgd2UgZ290IGhlcmUgd2Ugd291bGQga25vdyB0aGUgZmluYWwgdmFsdWVzIHRvCi0JICAgICB1c2UuICBUaGlzIHdvdWxkIG5vdCBiZSBwYXJ0aWN1bGFybHkgZGlmZmljdWx0LCBidXQgaXQgaXMKLQkgICAgIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuICAqLwotCi0JICAvKiBJIGJlbGlldmUgdGhhdCB0aGUgTElURVJBTCByZWxvYyB3aWxsIG9ubHkgYXBwbHkgdG8gYSBsZHEKLQkgICAgIG9yIGxkbCBpbnN0cnVjdGlvbiwgc28gY2hlY2sgbXkgYXNzdW1wdGlvbi4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotCSAgICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJICAgICAgIGNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbiA+PiAyNikgJiAweDNmKSA9PSAweDI5Ci0JCQl8fCAoKGluc24gPj4gMjYpICYgMHgzZikgPT0gMHgyOCk7Ci0JICB9Ci0KLQkgIHJlbG9jYXRlcCA9IHRydWU7Ci0JICBhZGRlbmQgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncCAtIGdwOwotCSAgZ3BfdXNlZHAgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfTElUVVNFOgotCSAgLyogU2VlIEFMUEhBX1JfTElURVJBTCBhYm92ZSBmb3IgdGhlIHVzZXMgb2YgdGhpcyByZWxvYy4gIEl0Ci0JICAgICBkb2VzIG5vdCBjYXVzZSBhbnl0aGluZyB0byBoYXBwZW4sIGl0c2VsZi4gICovCi0JICBicmVhazsKLQkgICAgCi0JY2FzZSBBTFBIQV9SX0dQRElTUDoKLQkgIC8qIFRoaXMgbWFya3MgdGhlIGxkYWggb2YgYW4gbGRhaC9sZGEgcGFpciB3aGljaCBsb2FkcyB0aGUKLQkgICAgIGdwIHJlZ2lzdGVyIHdpdGggdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIGdwIHZhbHVlIGFuZCB0aGUKLQkgICAgIGN1cnJlbnQgbG9jYXRpb24uICBUaGUgc2Vjb25kIG9mIHRoZSBwYWlyIGlzIHJfc3ltbmR4Ci0JICAgICBieXRlcyBhaGVhZC4gIEl0IHVzZWQgdG8gYmUgbWFya2VkIHdpdGggYW4gQUxQSEFfUl9JR05PUkUKLQkgICAgIHJlbG9jLCBidXQgT1NGLzEgMy4yIG5vIGxvbmdlciBkb2VzIHRoYXQuICAqLwotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGluc24xLCBpbnNuMjsKLQotCSAgICAvKiBHZXQgdGhlIHR3byBpbnN0cnVjdGlvbnMuICAqLwotCSAgICBpbnNuMSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQljb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCSAgICBpbnNuMiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkoY29udGVudHMKLQkJCQkgKyByX3ZhZGRyCi0JCQkJIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCQkJICsgcl9zeW1uZHgpKTsKLQotCSAgICBCRkRfQVNTRVJUICgoKGluc24xID4+IDI2KSAmIDB4M2YpID09IDB4MDkpOyAvKiBsZGFoICovCi0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbjIgPj4gMjYpICYgMHgzZikgPT0gMHgwOCk7IC8qIGxkYSAqLwotCi0JICAgIC8qIEdldCB0aGUgZXhpc3RpbmcgYWRkZW5kLiAgV2UgbXVzdCBhY2NvdW50IGZvciB0aGUgc2lnbgotCSAgICAgICBleHRlbnNpb24gZG9uZSBieSBsZGEgYW5kIGxkYWguICAqLwotCSAgICBhZGRlbmQgPSAoKGluc24xICYgMHhmZmZmKSA8PCAxNikgKyAoaW5zbjIgJiAweGZmZmYpOwotCSAgICBpZiAoaW5zbjEgJiAweDgwMDApCi0JICAgICAgewotCQkvKiBUaGlzIGlzIGFkZGVuZCAtPSAweDEwMDAwMDAwMCB3aXRob3V0IGNhdXNpbmcgYW4KLQkJICAgaW50ZWdlciBvdmVyZmxvdyBvbiBhIDMyIGJpdCBob3N0LiAgKi8KLQkJYWRkZW5kIC09IDB4ODAwMDAwMDA7Ci0JCWFkZGVuZCAtPSAweDgwMDAwMDAwOwotCSAgICAgIH0KLQkgICAgaWYgKGluc24yICYgMHg4MDAwKQotCSAgICAgIGFkZGVuZCAtPSAweDEwMDAwOwotCi0JICAgIC8qIFRoZSBleGlzdGluZyBhZGRlbmQgaW5jbHVkZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLQkgICAgICAgZ3Agb2YgdGhlIGlucHV0IEJGRCBhbmQgdGhlIGFkZHJlc3MgaW4gdGhlIGlucHV0IEJGRC4KLQkgICAgICAgV2Ugd2FudCB0byBjaGFuZ2UgdGhpcyB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQotCSAgICAgICBmaW5hbCBHUCBhbmQgdGhlIGZpbmFsIGFkZHJlc3MuICAqLwotCSAgICBhZGRlbmQgKz0gKGdwCi0JCSAgICAgICAtIGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwCi0JCSAgICAgICArIGlucHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpKTsKLQotCSAgICAvKiBDaGFuZ2UgdGhlIGluc3RydWN0aW9ucywgYWNjb3VudGluZyBmb3IgdGhlIHNpZ24KLQkgICAgICAgZXh0ZW5zaW9uLCBhbmQgd3JpdGUgdGhlbSBvdXQuICAqLwotCSAgICBpZiAoYWRkZW5kICYgMHg4MDAwKQotCSAgICAgIGFkZGVuZCArPSAweDEwMDAwOwotCSAgICBpbnNuMSA9IChpbnNuMSAmIDB4ZmZmZjAwMDApIHwgKChhZGRlbmQgPj4gMTYpICYgMHhmZmZmKTsKLQkgICAgaW5zbjIgPSAoaW5zbjIgJiAweGZmZmYwMDAwKSB8IChhZGRlbmQgJiAweGZmZmYpOwotCi0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24xLAotCQkJY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAoYmZkX3ZtYSkgaW5zbjIsCi0JCQljb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEgKyByX3N5bW5keCk7Ci0KLQkgICAgZ3BfdXNlZHAgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlIEFMUEhBX1JfT1BfUFVTSDoKLQljYXNlIEFMUEhBX1JfT1BfUFNVQjoKLQljYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLQkgIC8qIE1hbmlwdWxhdGUgdmFsdWVzIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgVGhlCi0JICAgICByX3ZhZGRyIGZpZWxkIGlzIG5vdCBhbiBhZGRyZXNzIGluIGlucHV0X3NlY3Rpb24sIGl0IGlzCi0JICAgICB0aGUgY3VycmVudCB2YWx1ZSAoaW5jbHVkaW5nIGFueSBhZGRlbmQpIG9mIHRoZSBvYmplY3QKLQkgICAgIGJlaW5nIHVzZWQuICAqLwotCSAgaWYgKCEgcl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBzeW1uZHhfdG9fc2VjdGlvbltyX3N5bW5keF07Ci0JICAgICAgaWYgKHMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCWFib3J0ICgpOwotCSAgICAgIGFkZGVuZCA9IHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0IC0gcy0+dm1hOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHhdOwotCSAgICAgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCWFib3J0ICgpOwotCi0JICAgICAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCQl7Ci0JCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgIGFkZGVuZCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogTm90ZSB0aGF0IHdlIHBhc3MgdGhlIGFkZHJlc3MgYXMgMCwgc2luY2Ugd2UKLQkJCSBkbyBub3QgaGF2ZSBhIG1lYW5pbmdmdWwgbnVtYmVyIGZvciB0aGUKLQkJCSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24gdGhhdCBpcyBiZWluZwotCQkJIHJlbG9jYXRlZC4gICovCi0JCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIChiZmRfdm1hKSAwKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGFkZGVuZCA9IDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCSAgICAgICYmIGgtPmluZHggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gIFBhc3MKLQkJCSB0aGUgYWRkcmVzcyBhcyAwLCBhcyB3aXRoIHVuZGVmaW5lZF9zeW1ib2wsCi0JCQkgYWJvdmUuICAqLwotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLCAoYmZkX3ZtYSkgMCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgYWRkZW5kID0gYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyAob3V0cHV0X2JmZCwgaW5mbywKLQkJCQkJCQkgaW5wdXRfYmZkLAotCQkJCQkJCSBleHRfcmVsLCBoKTsKLQkJfQotCSAgICB9Ci0KLQkgIGFkZGVuZCArPSByX3ZhZGRyOwotCi0JICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgLyogQWRqdXN0IHJfdmFkZHIgYnkgdGhlIGFkZGVuZC4gICovCi0JICAgICAgYmZkX2hfcHV0XzY0IChpbnB1dF9iZmQsIGFkZGVuZCwKLQkJCSAgICAoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl92YWRkcik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN3aXRjaCAocl90eXBlKQotCQl7Ci0JCWNhc2UgQUxQSEFfUl9PUF9QVVNIOgotCQkgIGlmICh0b3MgPj0gUkVMT0NfU1RBQ0tTSVpFKQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgc3RhY2tbdG9zKytdID0gYWRkZW5kOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgQUxQSEFfUl9PUF9QU1VCOgotCQkgIGlmICh0b3MgPT0gMCkKLQkJICAgIGFib3J0ICgpOwotCQkgIHN0YWNrW3RvcyAtIDFdIC09IGFkZGVuZDsKLQkJICBicmVhazsKLQotCQljYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLQkJICBpZiAodG9zID09IDApCi0JCSAgICBhYm9ydCAoKTsKLQkJICBzdGFja1t0b3MgLSAxXSA+Pj0gYWRkZW5kOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgYWRqdXN0X2FkZHJwID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLQkgIC8qIFN0b3JlIGEgdmFsdWUgZnJvbSB0aGUgcmVsb2Mgc3RhY2sgaW50byBhIGJpdGZpZWxkLiAgSWYKLQkgICAgIHdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFsbCB3ZSBkbyBpcwotCSAgICAgYWRqdXN0IHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvYy4gICovCi0JICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG1hc2s7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICBpZiAodG9zID09IDApCi0JCWFib3J0ICgpOwotCi0JICAgICAgLyogR2V0IHRoZSByZWxvY2F0aW9uIG1hc2suICBUaGUgc2VwYXJhdGUgc3RlcHMgYW5kIHRoZQotCQkgY2FzdHMgdG8gYmZkX3ZtYSBhcmUgYXR0ZW1wdHMgdG8gYXZvaWQgYSBidWcgaW4gdGhlCi0JCSBBbHBoYSBPU0YgMS4zIEMgY29tcGlsZXIuICBTZWUgcmVsb2MuYyBmb3IgbW9yZQotCQkgZGV0YWlscy4gICovCi0JICAgICAgbWFzayA9IDE7Ci0JICAgICAgbWFzayA8PD0gKGJmZF92bWEpIHJfc2l6ZTsKLQkgICAgICBtYXNrIC09IDE7Ci0KLQkgICAgICAvKiBGSVhNRTogSSBkb24ndCBrbm93IHdoYXQga2luZCBvZiBvdmVyZmxvdyBjaGVja2luZywKLQkJIGlmIGFueSwgc2hvdWxkIGJlIGRvbmUgaGVyZS4gICovCi0JICAgICAgdmFsID0gYmZkX2dldF82NCAoaW5wdXRfYmZkLAotCQkJCWNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgdmFsICY9fiBtYXNrIDw8IChiZmRfdm1hKSByX29mZnNldDsKLQkgICAgICB2YWwgfD0gKHN0YWNrWy0tdG9zXSAmIG1hc2spIDw8IChiZmRfdm1hKSByX29mZnNldDsKLQkgICAgICBiZmRfcHV0XzY0IChpbnB1dF9iZmQsIHZhbCwKLQkJCSAgY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfR1BWQUxVRToKLQkgIC8qIEkgcmVhbGx5IGRvbid0IGtub3cgaWYgdGhpcyBkb2VzIHRoZSByaWdodCB0aGluZy4gICovCi0JICBncCA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwICsgcl9zeW1uZHg7Ci0JICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHJlbG9jYXRlcCkKLQl7Ci0JICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQkgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotCSAgYXNlY3Rpb24gKnMgPSBOVUxMOwotCSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLQkgIC8qIFBlcmZvcm0gYSByZWxvY2F0aW9uLiAgKi8KLQotCSAgaG93dG8gPSAmYWxwaGFfaG93dG9fdGFibGVbcl90eXBlXTsKLQotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHhdOwotCSAgICAgIC8qIElmIGggaXMgTlVMTCwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcmVsb2MKLQkJIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sIHdoaWNoIHdlIHRob3VnaHQgd2FzIGp1c3QKLQkJIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICAqLwotCSAgICAgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCWFib3J0ICgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocl9zeW1uZHggPj0gTlVNX1JFTE9DX1NFQ1RJT05TKQotCQlzID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCXMgPSBzeW1uZHhfdG9fc2VjdGlvbltyX3N5bW5keF07Ci0KLQkgICAgICBpZiAocyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFuZCBtdXN0Ci0JCSBjb252ZXJ0IHRoZSBleGlzdGluZyByZWxvYy4gICovCi0JICAgICAgaWYgKHJfZXh0ZXJuKQotCQl7Ci0JCSAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgICAgICAmJiBoLT5pbmR4ID09IC0xKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIHN5bWJvbCBpcyBub3QgYmVpbmcgd3JpdHRlbiBvdXQuICAqLwotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLCByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICByZWxvY2F0aW9uID0gYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyAob3V0cHV0X2JmZCwKLQkJCQkJCQkgICAgIGluZm8sCi0JCQkJCQkJICAgICBpbnB1dF9iZmQsCi0JCQkJCQkJICAgICBleHRfcmVsLAotCQkJCQkJCSAgICAgaCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIEFkanVzdAotCQkgICAgIHRoZSB2YWx1ZSBieSB0aGUgYW1vdW50IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KLQkJICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIHMtPm91dHB1dF9vZmZzZXQKLQkJCQktIHMtPnZtYSk7Ci0JCX0KLQotCSAgICAgIC8qIElmIHRoaXMgaXMgUEMgcmVsYXRpdmUsIHRoZSBleGlzdGluZyBvYmplY3QgZmlsZQotCQkgYXBwZWFycyB0byBhbHJlYWR5IGhhdmUgdGhlIHJlbG9jIHdvcmtlZCBvdXQuICBXZQotCQkgbXVzdCBzdWJ0cmFjdCBvdXQgdGhlIG9sZCB2YWx1ZSBhbmQgYWRkIGluIHRoZSBuZXcKLQkJIG9uZS4gICovCi0JICAgICAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLQkJcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCSAgICAgIC8qIFB1dCBpbiBhbnkgYWRkZW5kLiAgKi8KLQkgICAgICByZWxvY2F0aW9uICs9IGFkZGVuZDsKLQotCSAgICAgIC8qIEFkanVzdCB0aGUgY29udGVudHMuICAqLwotCSAgICAgIHIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCQkgIChjb250ZW50cwotCQkJCQkgICArIHJfdmFkZHIKLQkJCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlIHByb2R1Y2luZyBhIGZpbmFsIGV4ZWN1dGFibGUuICAqLwotCSAgICAgIGlmIChyX2V4dGVybikKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sLiAgKi8KLQkJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqaHNlYzsKLQotCQkgICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkgICAgKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICsgaHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbi4gICovCi0JCSAgcmVsb2NhdGlvbiA9IChzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJLSBzLT52bWEpOwotCi0JCSAgLyogQWRqdXN0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBieSByZW1vdmluZyB0aGUKLQkJICAgICByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBzZWN0aW9uLiAgKi8KLQkJICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCQkgICAgcmVsb2NhdGlvbiArPSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JCX0KLQotCSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLAotCQkJCQkgICAgaW5wdXRfYmZkLAotCQkJCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIGNvbnRlbnRzLAotCQkJCQkgICAgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJICAgIHJlbG9jYXRpb24sCi0JCQkJCSAgICBhZGRlbmQpOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQlkZWZhdWx0OgotCQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCQkgIGFib3J0ICgpOwotCQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkJICB7Ci0JCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgICBpZiAocl9leHRlcm4pCi0JCSAgICAgIG5hbWUgPSBzeW1faGFzaGVzW3Jfc3ltbmR4XS0+cm9vdC5yb290LnN0cmluZzsKLQkJICAgIGVsc2UKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKLQkJCQkJICAgICAgIHN5bW5keF90b19zZWN0aW9uW3Jfc3ltbmR4XSk7Ci0JCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkJICAgKGluZm8sIG5hbWUsIGFscGhhX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwKLQkJCSAgICAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlICYmIGFkanVzdF9hZGRycCkKLQl7Ci0JICAvKiBDaGFuZ2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotCSAgYmZkX2hfcHV0XzY0IChpbnB1dF9iZmQsCi0JCQkoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCQkgKyByX3ZhZGRyKSwKLQkJCShiZmRfYnl0ZSAqKSBleHRfcmVsLT5yX3ZhZGRyKTsKLQl9Ci0KLSAgICAgIGlmIChncF91c2VkcCAmJiBncF91bmRlZmluZWQpCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCSAoaW5mbywgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIEdQIG5vdCBkZWZpbmVkIiksCi0JCSAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIE9ubHkgZ2l2ZSB0aGUgZXJyb3Igb25jZSBwZXIgbGluay4gICovCi0JICBncCA9IDQ7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCSAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAodG9zICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBEbyBmaW5hbCBhZGp1c3RtZW50cyB0byB0aGUgZmlsZWhkciBhbmQgdGhlIGFvdXRoZHIuICBUaGlzIHJvdXRpbmUKLSAgIHNldHMgdGhlIGR5bmFtaWMgYml0cyBpbiB0aGUgZmlsZSBoZWFkZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1hbHBoYV9hZGp1c3RfaGVhZGVycyAoYWJmZCwgZmhkciwgYWhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmhkcjsKLSAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFoZHI7Ci17Ci0gIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRFlOQU1JQyB8IEVYRUNfUCkpID09IChEWU5BTUlDIHwgRVhFQ19QKSkKLSAgICBmaGRyLT5mX2ZsYWdzIHw9IEZfQUxQSEFfQ0FMTF9TSEFSRUQ7Ci0gIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgZmhkci0+Zl9mbGFncyB8PSBGX0FMUEhBX1NIQVJBQkxFOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEFyY2hpdmUgaGFuZGxpbmcuICBJbiBPU0YvMSAob3IgRGlnaXRhbCBVbml4KSB2My4yLCBEaWdpdGFsCi0gICBpbnRyb2R1Y2VkIGFyY2hpdmUgcGFja2luZywgaW4gd2hpY2ggdGhlIGVsZW1lbnRzIGluIGFuIGFyY2hpdmUgYXJlCi0gICBvcHRpb25hbGx5IGNvbXByZXNzZWQgdXNpbmcgYSBzaW1wbGUgZGljdGlvbmFyeSBzY2hlbWUuICBXZSBrbm93Ci0gICBob3cgdG8gcmVhZCBzdWNoIGFyY2hpdmVzLCBidXQgd2UgZG9uJ3Qgd3JpdGUgdGhlbS4gICovCi0KLSNkZWZpbmUgYWxwaGFfZWNvZmZfc2x1cnBfYXJtYXAgX2JmZF9lY29mZl9zbHVycF9hcm1hcAotI2RlZmluZSBhbHBoYV9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIGFscGhhX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9lY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBhbHBoYV9lY29mZl90cnVuY2F0ZV9hcm5hbWUgX2JmZF9lY29mZl90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgYWxwaGFfZWNvZmZfd3JpdGVfYXJtYXAgX2JmZF9lY29mZl93cml0ZV9hcm1hcAotI2RlZmluZSBhbHBoYV9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgX2JmZF9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgYWxwaGFfZWNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBfYmZkX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLQotLyogQSBjb21wcmVzc2VkIGZpbGUgdXNlcyB0aGlzIGluc3RlYWQgb2YgQVJGTUFHLiAgKi8KLQotI2RlZmluZSBBUkZaTUFHICJaXDAxMiIKLQotLyogUmVhZCBhbiBhcmNoaXZlIGhlYWRlci4gIFRoaXMgaXMgbGlrZSB0aGUgc3RhbmRhcmQgcm91dGluZSwgYnV0IGl0Ci0gICBhbHNvIGFjY2VwdHMgQVJGWk1BRy4gICovCi0KLXN0YXRpYyBQVFIKLWFscGhhX2Vjb2ZmX3JlYWRfYXJfaGRyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKnJldDsKLSAgc3RydWN0IGFyX2hkciAqaDsKLQotICByZXQgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnIChhYmZkLCBBUkZaTUFHKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGggPSAoc3RydWN0IGFyX2hkciAqKSByZXQtPmFyY2hfaGVhZGVyOwotICBpZiAoc3RybmNtcCAoaC0+YXJfZm1hZywgQVJGWk1BRywgMikgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBhYls4XTsKLQotICAgICAgLyogVGhpcyBpcyBhIGNvbXByZXNzZWQgZmlsZS4gIFdlIG11c3Qgc2V0IHRoZSBzaXplIGNvcnJlY3RseS4KLSAgICAgICAgIFRoZSBzaXplIGlzIHRoZSBlaWdodCBieXRlcyBhZnRlciB0aGUgZHVtbXkgZmlsZSBoZWFkZXIuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBGSUxIU1osIFNFRUtfQ1VSKSAhPSAwCi0JICB8fCBiZmRfcmVhZCAoYWIsIDEsIDgsIGFiZmQpICE9IDgKLQkgIHx8IGJmZF9zZWVrIChhYmZkLCAtIChGSUxIU1ogKyA4KSwgU0VFS19DVVIpICE9IDApCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIHJldC0+cGFyc2VkX3NpemUgPSBiZmRfaF9nZXRfNjQgKGFiZmQsIGFiKTsKLSAgICB9Ci0KLSAgcmV0dXJuIChQVFIpIHJldDsKLX0KLQotLyogR2V0IGFuIGFyY2hpdmUgZWxlbWVudCBhdCBhIHNwZWNpZmllZCBmaWxlIHBvc2l0aW9uLiAgVGhpcyBpcyB3aGVyZQotICAgd2UgdW5jb21wcmVzcyB0aGUgYXJjaGl2ZSBlbGVtZW50IGlmIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBiZmQgKgotYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlcG9zKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGJmZCAqbmJmZCA9IE5VTEw7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKnRkYXRhOwotICBzdHJ1Y3QgYXJfaGRyICpoZHI7Ci0gIGJmZF9ieXRlIGFiWzhdOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGJmZF9ieXRlICpidWYsICpwOwotICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltOwotCi0gIG5iZmQgPSBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXBvcyk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKChuYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IGV4cGFuZGVkIHRoaXMgQkZELiAgKi8KLSAgICAgIHJldHVybiBuYmZkOwotICAgIH0KLQotICB0ZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIG5iZmQtPmFyZWx0X2RhdGE7Ci0gIGhkciA9IChzdHJ1Y3QgYXJfaGRyICopIHRkYXRhLT5hcmNoX2hlYWRlcjsKLSAgaWYgKHN0cm5jbXAgKGhkci0+YXJfZm1hZywgQVJGWk1BRywgMikgIT0gMCkKLSAgICByZXR1cm4gbmJmZDsKLQotICAvKiBXZSBtdXN0IHVuY29tcHJlc3MgdGhpcyBlbGVtZW50LiAgV2UgZG8gdGhpcyBieSBjb3B5aW5nIGl0IGludG8gYQotICAgICBtZW1vcnkgYnVmZmVyLCBhbmQgbWFraW5nIGJmZF9yZWFkIGFuZCBiZmRfc2VlayB1c2UgdGhhdCBidWZmZXIuCi0gICAgIFRoaXMgY2FuIHVzZSBhIGxvdCBvZiBtZW1vcnksIGJ1dCBpdCdzIHNpbXBsZXIgdGhhbiBnZXR0aW5nIGEKLSAgICAgdGVtcG9yYXJ5IGZpbGUsIG1ha2luZyB0aGF0IHdvcmsgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGNhY2hpbmcKLSAgICAgY29kZSwgYW5kIG1ha2luZyBzdXJlIHRoYXQgaXQgaXMgZGVsZXRlZCBhdCBhbGwgYXBwcm9wcmlhdGUKLSAgICAgdGltZXMuICBJdCBjYW4gYmUgY2hhbmdlZCBpZiBpdCBldmVyIGJlY29tZXMgaW1wb3J0YW50LiAgKi8KLQotICAvKiBUaGUgY29tcHJlc3NlZCBmaWxlIHN0YXJ0cyB3aXRoIGEgZHVtbXkgRUNPRkYgZmlsZSBoZWFkZXIuICAqLwotICBpZiAoYmZkX3NlZWsgKG5iZmQsIEZJTEhTWiwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIG5leHQgZWlnaHQgYnl0ZXMgYXJlIHRoZSByZWFsIGZpbGUgc2l6ZS4gICovCi0gIGlmIChiZmRfcmVhZCAoYWIsIDEsIDgsIG5iZmQpICE9IDgpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIHNpemUgPSBiZmRfaF9nZXRfNjQgKG5iZmQsIGFiKTsKLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIGJ1ZiA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGxlZnQ7Ci0gICAgICBiZmRfYnl0ZSBkaWN0WzQwOTZdOwotICAgICAgdW5zaWduZWQgaW50IGg7Ci0gICAgICBiZmRfYnl0ZSBiOwotCi0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChuYmZkLCBzaXplKTsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHAgPSBidWY7Ci0KLSAgICAgIGxlZnQgPSBzaXplOwotCi0gICAgICAvKiBJIGRvbid0IGtub3cgd2hhdCB0aGUgbmV4dCBlaWdodCBieXRlcyBhcmUgZm9yLiAqLwotICAgICAgaWYgKGJmZF9yZWFkIChhYiwgMSwgOCwgbmJmZCkgIT0gOCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogVGhpcyBpcyB0aGUgdW5jb21wcmVzc2lvbiBhbGdvcml0aG0uICBJdCdzIGEgc2ltcGxlCi0JIGRpY3Rpb25hcnkgYmFzZWQgc2NoZW1lIGluIHdoaWNoIGVhY2ggY2hhcmFjdGVyIGlzIHByZWRpY3RlZAotCSBieSBhIGhhc2ggb2YgdGhlIHByZXZpb3VzIHRocmVlIGNoYXJhY3RlcnMuICBBIGNvbnRyb2wgYnl0ZQotCSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIHByZWRpY3RlZCBvciB3aGV0aGVyIGl0Ci0JIGFwcGVhcnMgaW4gdGhlIGlucHV0IHN0cmVhbTsgZWFjaCBjb250cm9sIGJ5dGUgbWFuYWdlcyB0aGUKLQkgbmV4dCBlaWdodCBieXRlcyBpbiB0aGUgb3V0cHV0IHN0cmVhbS4gICovCi0gICAgICBtZW1zZXQgKGRpY3QsIDAsIHNpemVvZiBkaWN0KTsKLSAgICAgIGggPSAwOwotICAgICAgd2hpbGUgKGJmZF9yZWFkICgmYiwgMSwgMSwgbmJmZCkgPT0gMSkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgZm9yIChpID0gMDsgaSA8IDg7IGkrKywgYiA+Pj0gMSkKLQkgICAgewotCSAgICAgIGJmZF9ieXRlIG47Ci0KLQkgICAgICBpZiAoKGIgJiAxKSA9PSAwKQotCQluID0gZGljdFtoXTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISBiZmRfcmVhZCAoJm4sIDEsIDEsIG5iZmQpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgZGljdFtoXSA9IG47Ci0JCX0KLQotCSAgICAgICpwKysgPSBuOwotCi0JICAgICAgLS1sZWZ0OwotCSAgICAgIGlmIChsZWZ0ID09IDApCi0JCWJyZWFrOwotCi0JICAgICAgaCA8PD0gNDsKLQkgICAgICBoIF49IG47Ci0JICAgICAgaCAmPSBzaXplb2YgZGljdCAtIDE7Ci0JICAgIH0KLQotCSAgaWYgKGxlZnQgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgdGhlIHVuY29tcHJlc3NlZCBmaWxlIGNvbnRlbnRzIGFyZSBpbiBidWYuICAqLwotICBiaW0gPSAoKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopCi0JIGJmZF9hbGxvYyAobmJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2luX21lbW9yeSkpKTsKLSAgaWYgKGJpbSA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBiaW0tPnNpemUgPSBzaXplOwotICBiaW0tPmJ1ZmZlciA9IGJ1ZjsKLQotICBuYmZkLT5tdGltZV9zZXQgPSB0cnVlOwotICBuYmZkLT5tdGltZSA9IHN0cnRvbCAoaGRyLT5hcl9kYXRlLCAoY2hhciAqKikgTlVMTCwgMTApOwotCi0gIG5iZmQtPmZsYWdzIHw9IEJGRF9JTl9NRU1PUlk7Ci0gIG5iZmQtPmlvc3RyZWFtID0gKFBUUikgYmltOwotICBCRkRfQVNTRVJUICghIG5iZmQtPmNhY2hlYWJsZSk7Ci0KLSAgcmV0dXJuIG5iZmQ7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChuYmZkICE9IE5VTEwpCi0gICAgYmZkX2Nsb3NlIChuYmZkKTsKLSAgcmV0dXJuIE5VTEw7ICAKLX0KLQotLyogT3BlbiB0aGUgbmV4dCBhcmNoaXZlZCBmaWxlLiAgKi8KLQotc3RhdGljIGJmZCAqCi1hbHBoYV9lY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2hpdmUsIGxhc3RfZmlsZSkKLSAgICAgYmZkICphcmNoaXZlOwotICAgICBiZmQgKmxhc3RfZmlsZTsKLXsKLSAgZmlsZV9wdHIgZmlsZXN0YXJ0OwotCi0gIGlmIChsYXN0X2ZpbGUgPT0gTlVMTCkKLSAgICBmaWxlc3RhcnQgPSBiZmRfYXJkYXRhIChhcmNoaXZlKS0+Zmlyc3RfZmlsZV9maWxlcG9zOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFyZWx0ZGF0YSAqdDsKLSAgICAgIHN0cnVjdCBhcl9oZHIgKmg7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgICAgIC8qIFdlIGNhbid0IHVzZSBhcmVsdF9zaXplIGhlcmUsIGJlY2F1c2UgdGhhdCB1c2VzIHBhcnNlZF9zaXplLAotICAgICAgICAgd2hpY2ggaXMgdGhlIHVuY29tcHJlc3NlZCBzaXplLiAgV2UgbmVlZCB0aGUgY29tcHJlc3NlZCBzaXplLiAgKi8KLSAgICAgIHQgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBsYXN0X2ZpbGUtPmFyZWx0X2RhdGE7Ci0gICAgICBoID0gKHN0cnVjdCBhcl9oZHIgKikgdC0+YXJjaF9oZWFkZXI7Ci0gICAgICBzaXplID0gc3RydG9sIChoLT5hcl9zaXplLCAoY2hhciAqKikgTlVMTCwgMTApOwotCi0gICAgICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeS4uLgotCSBOb3RlIHRoYXQgbGFzdF9maWxlLT5vcmlnaW4gY2FuIGJlIG9kZCBpbiB0aGUgY2FzZSBvZgotCSBCU0QtNC40LXN0eWxlIGVsZW1lbnQgd2l0aCBhIGxvbmcgb2RkIHNpemUuICovCi0gICAgICBmaWxlc3RhcnQgPSBsYXN0X2ZpbGUtPm9yaWdpbiArIHNpemU7Ci0gICAgICBmaWxlc3RhcnQgKz0gZmlsZXN0YXJ0ICUgMjsKLSAgICB9Ci0KLSAgcmV0dXJuIGFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXN0YXJ0KTsKLX0KLQotLyogT3BlbiB0aGUgYXJjaGl2ZSBmaWxlIGdpdmVuIGFuIGluZGV4IGludG8gdGhlIGFybWFwLiAgKi8KLQotc3RhdGljIGJmZCAqCi1hbHBoYV9lY29mZl9nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzeW1pbmRleCBpbmRleDsKLXsKLSAgY2Fyc3ltICplbnRyeTsKLQotICBlbnRyeSA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzICsgaW5kZXg7Ci0gIHJldHVybiBhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFiZmQsIGVudHJ5LT5maWxlX29mZnNldCk7Ci19Ci0MCi0vKiBUaGlzIGlzIHRoZSBFQ09GRiBiYWNrZW5kIHN0cnVjdHVyZS4gIFRoZSBiYWNrZW5kIGZpZWxkIG9mIHRoZQotICAgdGFyZ2V0IHZlY3RvciBwb2ludHMgdG8gdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhIGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSA9Ci17Ci0gIC8qIENPRkYgYmFja2VuZCBzdHJ1Y3R1cmUuICAqLwotICB7Ci0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpIGJmZF92b2lkLCAvKiBhdXhfaW4gKi8KLSAgICAodm9pZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogc3ltX2luICovCi0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19pbiAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLGludCxpbnQsaW50LGludCxQVFIpKSliZmRfdm9pZCwvKmF1eF9vdXQqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogc3ltX291dCAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogbGluZW5vX291dCAqLwotICAgICh1bnNpZ25lZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogcmVsb2Nfb3V0ICovCi0gICAgYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX291dCwgYWxwaGFfZWNvZmZfc3dhcF9hb3V0aGRyX291dCwKLSAgICBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9vdXQsCi0gICAgRklMSFNaLCBBT1VUU1osIFNDTkhTWiwgMCwgMCwgMCwgMCwgRklMTk1MRU4sIHRydWUsIGZhbHNlLCA0LAotICAgIGFscGhhX2Vjb2ZmX3N3YXBfZmlsZWhkcl9pbiwgYWxwaGFfZWNvZmZfc3dhcF9hb3V0aGRyX2luLAotICAgIGFscGhhX2Vjb2ZmX3N3YXBfc2NuaGRyX2luLCBOVUxMLAotICAgIGFscGhhX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vaywgX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssCi0gICAgYWxwaGFfZWNvZmZfbWtvYmplY3RfaG9vaywgX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncywKLSAgICBfYmZkX2Vjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaywgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMCi0gIH0sCi0gIC8qIFN1cHBvcnRlZCBhcmNoaXRlY3R1cmUuICAqLwotICBiZmRfYXJjaF9hbHBoYSwKLSAgLyogSW5pdGlhbCBwb3J0aW9uIG9mIGFybWFwIHN0cmluZy4gICovCi0gICJfX19fX19fXzY0IiwKLSAgLyogVGhlIHBhZ2UgYm91bmRhcnkgdXNlZCB0byBhbGlnbiBzZWN0aW9ucyBpbiBhIGRlbWFuZC1wYWdlZAotICAgICBleGVjdXRhYmxlIGZpbGUuICBFLmcuLCAweDEwMDAuICAqLwotICAweDIwMDAsCi0gIC8qIFRydWUgaWYgdGhlIC5yZGF0YSBzZWN0aW9uIGlzIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIEFscGhhLiAgRmFsc2UgaWYgLnJkYXRhIGlzIHBhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIE1JUFMuICAqLwotICB0cnVlLAotICAvKiBCaXRzaXplIG9mIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICA2NCwKLSAgLyogUmVsb2MgdG8gdXNlIGZvciBjb25zdHJ1Y3RvciBlbnRyaWVzLiAgKi8KLSAgJmFscGhhX2hvd3RvX3RhYmxlW0FMUEhBX1JfUkVGUVVBRF0sCi0gIHsKLSAgICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgICBtYWdpY1N5bTIsCi0gICAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICAgIDgsCi0gICAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICAgIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGRucl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHBkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IG9wdF9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGZkcl9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAotICAgIHNpemVvZiAoc3RydWN0IGV4dF9leHQpLAotICAgIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICAgIGVjb2ZmX3N3YXBfaGRyX2luLAotICAgIGVjb2ZmX3N3YXBfZG5yX2luLAotICAgIGVjb2ZmX3N3YXBfcGRyX2luLAotICAgIGVjb2ZmX3N3YXBfc3ltX2luLAotICAgIGVjb2ZmX3N3YXBfb3B0X2luLAotICAgIGVjb2ZmX3N3YXBfZmRyX2luLAotICAgIGVjb2ZmX3N3YXBfcmZkX2luLAotICAgIGVjb2ZmX3N3YXBfZXh0X2luLAotICAgIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4sCi0gICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCi0gICAgLyogRnVuY3Rpb25zIHRvIHN3YXAgb3V0IGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICAgIGVjb2ZmX3N3YXBfaGRyX291dCwKLSAgICBlY29mZl9zd2FwX2Rucl9vdXQsCi0gICAgZWNvZmZfc3dhcF9wZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfc3ltX291dCwKLSAgICBlY29mZl9zd2FwX29wdF9vdXQsCi0gICAgZWNvZmZfc3dhcF9mZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfcmZkX291dCwKLSAgICBlY29mZl9zd2FwX2V4dF9vdXQsCi0gICAgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQsCi0gICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0LAotICAgIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCi0gICAgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvCi0gIH0sCi0gIC8qIEV4dGVybmFsIHJlbG9jIHNpemUuICAqLwotICBSRUxTWiwKLSAgLyogUmVsb2Mgc3dhcHBpbmcgZnVuY3Rpb25zLiAgKi8KLSAgYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19pbiwKLSAgYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19vdXQsCi0gIC8qIEJhY2tlbmQgcmVsb2MgdHdlYWtpbmcuICAqLwotICBhbHBoYV9hZGp1c3RfcmVsb2NfaW4sCi0gIGFscGhhX2FkanVzdF9yZWxvY19vdXQsCi0gIC8qIFJlbG9jYXRlIHNlY3Rpb24gY29udGVudHMgd2hpbGUgbGlua2luZy4gICovCi0gIGFscGhhX3JlbG9jYXRlX3NlY3Rpb24sCi0gIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLwotICBhbHBoYV9hZGp1c3RfaGVhZGVycywKLSAgLyogUmVhZCBhbiBlbGVtZW50IGZyb20gYW4gYXJjaGl2ZSBhdCBhIGdpdmVuIGZpbGUgcG9zaXRpb24uICAqLwotICBhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MKLX07Ci0KLS8qIExvb2tpbmcgdXAgYSByZWxvYyB0eXBlIGlzIEFscGhhIHNwZWNpZmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLS8qIFNvIGlzIGdldHRpbmcgcmVsb2NhdGVkIHNlY3Rpb24gY29udGVudHMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQotLyogSGFuZGxpbmcgZmlsZSB3aW5kb3dzIGlzIGdlbmVyaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotLyogUmVsYXhpbmcgc2VjdGlvbnMgaXMgZ2VuZXJpYy4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyA9Ci17Ci0gICJlY29mZi1saXR0bGVhbHBoYSIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGFscGhhX2Vjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZWNvZmZfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfbWtvYmplY3QsICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoYWxwaGFfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAmYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYXBvbGxvLmMgYi9iZmQvY29mZi1hcG9sbG8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3NWQ1Mi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1hcG9sbG8uYworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFwb2xsbyA2ODAwMCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEJ5IFRyb3kgUm9sbG8gKHRyb3lAY2JtZS51bnN3LmVkdS5hdSkKLSAgIEJhc2VkIG9uIG02OGsgc3RhbmRhcmQgQ09GRiB2ZXJzaW9uIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvYXBvbGxvLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLSNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlW107Ci0jZWxzZQotcmVsb2NfaG93dG9fdHlwZSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlW10gPSAKLXsKLSAgSE9XVE8oUl9SRUxCWVRFLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JCWVRFLAkgICAgICAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1A4IiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSV09SRCwJICAgICAgIDAsICAxLCAJMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMTYiLCAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkxPTkcsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDMyIiwgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxMT05HX05FRywJICAgICAgIDAsICAtMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICItMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLX07Ci0jZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KLQotI2lmbmRlZiBCQURNQUcKLSNkZWZpbmUgQkFETUFHKHgpIE02OEtCQURNQUcoeCkKLSNlbmRpZgotI2RlZmluZSBBUE9MTE9fTTY4IDEJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLSNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi1leHRlcm4gdm9pZCBhcG9sbG9fcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqaW50ZXJuYWwsIGludCByZWxvY2VudHJ5KSk7Ci1leHRlcm4gaW50IGFwb2xsb19ob3d0bzJydHlwZSBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICopKTsKLSNlbHNlCi12b2lkCi1hcG9sbG9fcnR5cGUyaG93dG8oaW50ZXJuYWwsIHJlbG9jZW50cnkpCi0gICAgIGFyZWxlbnQgKmludGVybmFsOwotICAgICBpbnQgcmVsb2NlbnRyeTsKLXsKLSAgc3dpdGNoIChyZWxvY2VudHJ5KSAKLSAgewotICAgY2FzZSBSX1JFTEJZVEU6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyAwOyBicmVhazsKLSAgIGNhc2UgUl9SRUxXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgMTsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDI7IGJyZWFrOwotICAgY2FzZSBSX1BDUkJZVEU6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyAzOyBicmVhazsKLSAgIGNhc2UgUl9QQ1JXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgNDsgYnJlYWs7Ci0gICBjYXNlIFJfUENSTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDU7IGJyZWFrOwotICAgY2FzZSBSX1JFTExPTkdfTkVHOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgNjsgYnJlYWs7Ci0gIH0KLX0KLQotaW50IAotYXBvbGxvX2hvd3RvMnJ0eXBlIChpbnRlcm5hbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaW50ZXJuYWw7Ci17Ci0gIGlmIChpbnRlcm5hbC0+cGNfcmVsYXRpdmUpIAotICB7Ci0gICAgc3dpdGNoIChpbnRlcm5hbC0+Yml0c2l6ZSkgCi0gICAgewotICAgICBjYXNlIDMyOiByZXR1cm4gUl9QQ1JMT05HOwotICAgICBjYXNlIDE2OiByZXR1cm4gUl9QQ1JXT1JEOwotICAgICBjYXNlIDg6IHJldHVybiBSX1BDUkJZVEU7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgIHN3aXRjaCAoaW50ZXJuYWwtPmJpdHNpemUpCi0gICAgIHsKLSAgICAgIGNhc2UgMzI6IHJldHVybiBSX1JFTExPTkc7Ci0gICAgICBjYXNlIDE2OiByZXR1cm4gUl9SRUxXT1JEOwotICAgICAgY2FzZSA4OiByZXR1cm4gUl9SRUxCWVRFOwotICAgICB9Ci0gIH0KLSAgcmV0dXJuIFJfUkVMTE9ORzsgICAgCi19Ci0jZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgXAotICBhcG9sbG9fcnR5cGUyaG93dG8oaW50ZXJuYWwsIChyZWxvY2VudHJ5KS0+cl90eXBlKQotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyhleHRlcm5hbCwgaW50ZXJuYWwpIFwKLSAgZXh0ZXJuYWwucl90eXBlID0gYXBvbGxvX2hvd3RvMnJ0eXBlKGludGVybmFsKTsKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLSNpZm5kZWYgVEFSR0VUX1NZTQotI2RlZmluZSBUQVJHRVRfU1lNIGFwb2xsb2NvZmZfdmVjCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfTkFNRQotI2RlZmluZSBUQVJHRVRfTkFNRSAiYXBvbGxvLW02OGsiCi0jZW5kaWYKLQotI2lmZGVmIE5BTUVTX0hBVkVfVU5ERVJTQ09SRQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9TWU0sIFRBUkdFVF9OQU1FLCAwLCAwLCAnXycsIE5VTEwpCi0jZWxzZQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9TWU0sIFRBUkdFVF9OQU1FLCAwLCAwLCAwLCBOVUxMKQotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvY29mZi1hcm0uYyBiL2JmZC9jb2ZmLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzkzODI1Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFSTSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImNvZmYvYXJtLmgiCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogTWFjcm9zIGZvciBtYW5pcHVsYXRpb24gdGhlIGJpdHMgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIHRoZSBjb2ZmIGRhdGEKLSAgIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIEFQQ1NfMjZfRkxBRyggICAgICAgYWJmZCApCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIEZfQVBDU18yNikKLSNkZWZpbmUgQVBDU19GTE9BVF9GTEFHKCAgICBhYmZkICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9BUENTX0ZMT0FUKQotI2RlZmluZSBQSUNfRkxBRyggICAgICAgICAgIGFiZmQgKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX1BJQykKLSNkZWZpbmUgQVBDU19TRVQoICAgICAgICAgICBhYmZkICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9BUENTX1NFVCkKLSNkZWZpbmUgU0VUX0FQQ1NfRkxBR1MoICAgICBhYmZkLCBmbGdzKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgPSBcCi0JCQkJCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIH4gKEZfQVBDU18yNiB8IEZfQVBDU19GTE9BVCB8IEZfUElDKSkgXAotCQkJCQkgfCAoZmxncyB8IEZfQVBDU19TRVQpKQotI2RlZmluZSBJTlRFUldPUktfRkxBRyggICAgIGFiZmQgKSAJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9JTlRFUldPUkspCi0jZGVmaW5lIElOVEVSV09SS19TRVQoICAgICAgYWJmZCApIAkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX0lOVEVSV09SS19TRVQpCi0jZGVmaW5lIFNFVF9JTlRFUldPUktfRkxBRyggYWJmZCwgZmxnICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzID0gXAotCQkJCQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiB+IEZfSU5URVJXT1JLKSBcCi0JCQkJCSB8IChmbGcgfCBGX0lOVEVSV09SS19TRVQpKQotICAgICAKLXR5cGVkZWYgZW51bSB7YnVua25vd24sIGI5LCBiMTIsIGIyM30gdGh1bWJfcGNyZWxfYnJhbmNodHlwZTsKLS8qIHNvbWUgdHlwZWRlZnMgZm9yIGhvbGRpbmcgaW5zdHJ1Y3Rpb25zICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IGluc24zMjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGluc24xNjsKLQotCi0gICAgIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBzdHVwaWQgY29tcGlsZXJzLiAgKi8KLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotICAgICAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBhb3V0YXJtX2ZpeF9wY3JlbF8yNl9kb25lCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBhb3V0YXJtX2ZpeF9wY3JlbF8yNgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF8yMwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF8xMgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF85Ci0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX2FybV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX2FkanVzdF9zeW1uZHgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCSAgIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAlib29sZWFuICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogY29mZl9hcm1fcnR5cGVfdG9faG93dG8gCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl90aHVtYl9wY3JlbF9jb21tb24KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqLAotCSAgIHRodW1iX3BjcmVsX2JyYW5jaHR5cGUpKTsKLXN0YXRpYyBDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICogY29mZl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICogY29mZl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGluc24zMiBpbnNlcnRfdGh1bWJfYnJhbmNoCi0gIFBBUkFNUyAoKGluc24zMiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogZmluZF90aHVtYl9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBmaW5kX2FybV9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMgdm9pZCByZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyB2b2lkIHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotI2VuZGlmCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9saW5rX291dHB1dF9oYXNfYmVndW4KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFRoZSBsaW5rZXIgc2NyaXB0IGtub3dzIHRoZSBzZWN0aW9uIG5hbWVzIGZvciBwbGFjZW1lbnQuCi0gICBUaGUgZW50cnlfbmFtZXMgYXJlIHVzZWQgdG8gZG8gc2ltcGxlIG5hbWUgbWFuZ2xpbmcgb24gdGhlIHN0dWJzLgotICAgR2l2ZW4gYSBmdW5jdGlvbiBuYW1lLCBhbmQgaXRzIHR5cGUsIHRoZSBzdHViIGNhbiBiZSBmb3VuZC4gVGhlCi0gICBuYW1lIGNhbiBiZSBjaGFuZ2VkLiBUaGUgb25seSByZXF1aXJlbWVudCBpcyB0aGUgJXMgYmUgcHJlc2VudC4KLSAgICovCi0gICAKLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83dCIKLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fdGh1bWIiCi0KLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FICIuZ2x1ZV83IgotI2RlZmluZSBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FICAgIl9fJXNfZnJvbV9hcm0iCi0KLS8qIFVzZWQgYnkgdGhlIGFzc2VtYmxlci4gKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfYXJtX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN5bXZhbHVlIGRpZmY7Ci0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIGRpZmYpICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICAgIGlmIChkaWZmICE9IDApCi0gICAgICB7Ci0JcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0JdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotCXN3aXRjaCAoaG93dG8tPnNpemUpCi0JICB7Ci0JICBjYXNlIDA6Ci0JICAgIHsKLQkgICAgICBjaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMToKLQkgICAgewotCSAgICAgIHNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB7Ci0JICAgICAgbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotCi0gIC8qIE5vdyBsZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggZXZlcnl0aGluZyB1cC4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLS8qIElmIFVTRVJfTEFCRUxfUFJFRklYIGlzIGRlZmluZWQgYXMgIl8iIChzZWUgY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZSgpCi0gICBpbiB0aGlzIGZpbGUpLCB0aGVuIFRBUkdFVF9VTkRFUlNDT1JFIHNob3VsZCBiZSBkZWZpbmVkLCBvdGhlcndpc2UgaXQKLSAgIHNob3VsZCBub3QuICAqLwotI2lmbmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNlbmRpZgotCi0jaWZuZGVmIFBDUkVMT0ZGU0VUCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIHRydWUKLSNlbmRpZgotCi0vKiBUaGVzZSBtb3N0IGNlcnRhaW5seSBiZWxvbmcgc29tZXdoZXJlIGVsc2UuIEp1c3QgaGFkIHRvIGdldCByaWQgb2YKLSAgIHRoZSBtYW5pZmVzdCBjb25zdGFudHMgaW4gdGhlIGNvZGUuICovCi0KLSNkZWZpbmUgQVJNXzggICAgICAgIDAKLSNkZWZpbmUgQVJNXzE2ICAgICAgIDEKLSNkZWZpbmUgQVJNXzMyICAgICAgIDIKLSNkZWZpbmUgQVJNXzI2ICAgICAgIDMKLSNkZWZpbmUgQVJNX0RJU1A4ICAgIDQKLSNkZWZpbmUgQVJNX0RJU1AxNiAgIDUKLSNkZWZpbmUgQVJNX0RJU1AzMiAgIDYKLSNkZWZpbmUgQVJNXzI2RCAgICAgIDcKLS8qIDggaXMgdW51c2VkICovCi0jZGVmaW5lIEFSTV9ORUcxNiAgICA5Ci0jZGVmaW5lIEFSTV9ORUczMiAgIDEwCi0jZGVmaW5lIEFSTV9SVkEzMiAgIDExCi0jZGVmaW5lIEFSTV9USFVNQjkgIDEyCi0jZGVmaW5lIEFSTV9USFVNQjEyIDEzCi0jZGVmaW5lIEFSTV9USFVNQjIzIDE0Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvW10gPSAKLXsKLSAgLyogdHlwZSAgICAgICAgICAgICAgcnMgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgcGFydF9pbnBsIHJlYWRtYXNrICBzZXRtYXNrICAgIHBjZG9uZSAqLwotICBIT1dUTyhBUk1fOCwJCQkvKiB0eXBlICovCi0JMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JMCwJCQkvKiBzaXplICovCi0JOCwJCQkvKiBiaXRzaXplICovCi0JZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkwLAkJCS8qIGJpdHBvcyAqLwotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCWNvZmZfYXJtX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSJBUk1fOCIsCQkvKiBuYW1lICovCi0gICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JUENSRUxPRkZTRVQJCS8qIHBjcmVsX29mZnNldCAqLyksCi0gIEhPV1RPKEFSTV8xNiwgIAotCTAsIAotCTEsIAotCTE2LCAKLQlmYWxzZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fMTYiLCAKLQl0cnVlLAotCTB4MDAwMGZmZmYsCi0JMHgwMDAwZmZmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyhBUk1fMzIsIAotCTAsCi0JMiwgCi0JMzIsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNXzMyIiwKLSAgICAgICAgdHJ1ZSwKLQkweGZmZmZmZmZmLAotCTB4ZmZmZmZmZmYsCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyhBUk1fMjYsCi0JMiwKLQkyLAotCTI0LAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JYW91dGFybV9maXhfcGNyZWxfMjYgLAotCSJBUk1fMjYiLAotCWZhbHNlLAotCTB4MDBmZmZmZmYsCi0JMHgwMGZmZmZmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyhBUk1fRElTUDgsICAgICAgICAKLQkwLAotCTAsCi0JOCwgCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9ESVNQOCIsICAKLQl0cnVlLAotCTB4MDAwMDAwZmYsCi0JMHgwMDAwMDBmZiwKLQl0cnVlKSwKLSAgSE9XVE8oIEFSTV9ESVNQMTYsIAotCTAsCi0JMSwKLQkxNiwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNX0RJU1AxNiIsCi0JdHJ1ZSwKLQkweDAwMDBmZmZmLAotCTB4MDAwMGZmZmYsCi0JdHJ1ZSksCi0gIEhPV1RPKCBBUk1fRElTUDMyLAotCTAsCi0JMiwKLQkzMiwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAKLSAJY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9ESVNQMzIiLAotCXRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCXRydWUpLAotICBIT1dUTyggQVJNXzI2RCwgIAotCTIsIAotCTIsCi0JMjQsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19kb250LAotCWFvdXRhcm1fZml4X3BjcmVsXzI2X2RvbmUsIAotCSJBUk1fMjZEIiwKLQl0cnVlLAotCTB4MDBmZmZmZmYsCi0JMHgwLAotCWZhbHNlKSwKLSAgLyogOCBpcyB1bnVzZWQgKi8KLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgSE9XVE8oIEFSTV9ORUcxNiwKLQkwLAotCS0xLAotCTE2LAotCWZhbHNlLAotCTAsIAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fTkVHMTYiLAotICAgICAgICB0cnVlLCAKLQkweDAwMDBmZmZmLAotCTB4MDAwMGZmZmYsIAotCWZhbHNlKSwKLSAgSE9XVE8oIEFSTV9ORUczMiwgCi0JMCwgCi0JLTIsCi0JMzIsCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNX05FRzMyIiwKLSAgICAgICAgdHJ1ZSwKLQkweGZmZmZmZmZmLAotCTB4ZmZmZmZmZmYsCi0JZmFsc2UpLAotICBIT1dUTyggQVJNX1JWQTMyLCAKLQkwLAotCTIsIAotCTMyLAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9SVkEzMiIsCi0gICAgICAgIHRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oIEFSTV9USFVNQjksCi0JMSwKLQkxLAotCTgsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQljb2ZmX3RodW1iX3BjcmVsXzkgLAotCSJBUk1fVEhVTUI5IiwKLQlmYWxzZSwKLQkweDAwMDAwMGZmLAotCTB4MDAwMDAwZmYsIAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oIEFSTV9USFVNQjEyLAotCTEsCi0JMSwKLQkxMSwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCWNvZmZfdGh1bWJfcGNyZWxfMTIgLAotCSJBUk1fVEhVTUIxMiIsCi0JZmFsc2UsCi0JMHgwMDAwMDdmZiwKLQkweDAwMDAwN2ZmLCAKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPKCBBUk1fVEhVTUIyMywKLQkxLAotCTIsCi0JMjIsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQljb2ZmX3RodW1iX3BjcmVsXzIzICwKLQkiQVJNX1RIVU1CMjMiLAotCWZhbHNlLAotCTB4MDdmZjA3ZmYsCi0JMHgwN2ZmMDdmZiwgCi0JUENSRUxPRkZTRVQpLAotfTsKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZAotICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuCi1pbl9yZWxvY19wIChhYmZkLCBob3d0bykKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci17Ci0gIHJldHVybiAhaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT50eXBlICE9IEFSTV9SVkEzMjsKLX0gICAgIAotI2VuZGlmCi0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotCSAgICAoY2FjaGVfcHRyKS0+aG93dG8gPSBhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byArIChkc3QpLT5yX3R5cGU7Ci0KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBjb2ZmX2FybV9ydHlwZV90b19ob3d0bwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX2FybV9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIGhvd3RvID0gYW91dGFybV9zdGRfcmVsb2NfaG93dG8gKyByZWwtPnJfdHlwZTsKLQotICBpZiAocmVsLT5yX3R5cGUgPT0gQVJNX1JWQTMyKQotICAgIHsKLSAgICAgICphZGRlbmRwIC09IHBlX2RhdGEoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAgIH0KLQotICByZXR1cm4gaG93dG87Ci0KLX0KLS8qIFVzZWQgYnkgdGhlIGFzc2VtYmxlci4gKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYW91dGFybV9maXhfcGNyZWxfMjZfZG9uZSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogVGhpcyBpcyBkZWFkIHNpbXBsZSBhdCBwcmVzZW50LiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVXNlZCBieSB0aGUgYXNzZW1ibGVyLiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1hb3V0YXJtX2ZpeF9wY3JlbF8yNiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX2NvbnRpbnVlIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKLSAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJlbG9jYXRpb24gPSAodGFyZ2V0ICYgMHgwMGZmZmZmZikgPDwgMjsKLSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gMHgwMjAwMDAwMCkgLSAweDAyMDAwMDAwOyAvKiBTaWduIGV4dGVuZCAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiAtPSBhZGRyOwotICAKLSAgaWYgKHJlbG9jYXRpb24gJiAzKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gIGlmIChyZWxvY2F0aW9uICYgMHgwMjAwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHJlbG9jYXRpb24gJiB+IChiZmRfdm1hKSAweDAzZmZmZmZmKSAhPSB+IChiZmRfdm1hKSAweDAzZmZmZmZmKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlIGlmIChyZWxvY2F0aW9uICYgfjB4MDNmZmZmZmYpCi0gICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICB0YXJnZXQgJj0gfjB4MDBmZmZmZmY7Ci0gIHRhcmdldCB8PSAocmVsb2NhdGlvbiA+PiAyKSAmIDB4MDBmZmZmZmY7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHRhcmdldCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQotICAvKiBOb3cgdGhlIEFSTSBtYWdpYy4uLiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgc28gdGhhdCBpdCBpcyBtYXJrZWQgYXMgZG9uZS4KLSAgICAgU3RyaWN0bHkgdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uICAqLwotICByZWxvY19lbnRyeS0+aG93dG8gPSAmYW91dGFybV9zdGRfcmVsb2NfaG93dG9bQVJNXzI2RF07Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfdGh1bWJfcGNyZWxfY29tbW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsIGJ0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB0aHVtYl9wY3JlbF9icmFuY2h0eXBlIGJ0eXBlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb24gPSAwOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB0YXJnZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3ZtYSBkc3Rtc2s7Ci0gIGJmZF92bWEgb2ZmbXNrOwotICBiZmRfdm1hIHNpZ25iaXQ7Ci0KLSAgLyogTk9URTogVGhpcyByb3V0aW5lIGlzIGN1cnJlbnRseSB1c2VkIGJ5IEdBUywgYnV0IG5vdCBieSB0aGUgbGluawotICAgICBwaGFzZS4gICovCi0KLSAgc3dpdGNoIChidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBiOToKLSAgICAgIGRzdG1zayAgPSAweDAwMDAwMGZmOwotICAgICAgb2ZmbXNrICA9IDB4MDAwMDAxZmU7Ci0gICAgICBzaWduYml0ID0gMHgwMDAwMDEwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiMTI6Ci0gICAgICBkc3Rtc2sgID0gMHgwMDAwMDdmZjsKLSAgICAgIG9mZm1zayAgPSAweDAwMDAwZmZlOwotICAgICAgc2lnbmJpdCA9IDB4MDAwMDA4MDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYjIzOgotICAgICAgZHN0bXNrICA9IDB4MDdmZjA3ZmY7Ci0gICAgICBvZmZtc2sgID0gMHgwMDdmZmZmZjsKLSAgICAgIHNpZ25iaXQgPSAweDAwNDAwMDAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX2NvbnRpbnVlIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKLSAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHN3aXRjaCAoYnR5cGUpCi0gICAgewotICAgIGNhc2UgYjk6Ci0gICAgY2FzZSBiMTI6Ci0gICAgICByZWxvY2F0aW9uID0gKCh0YXJnZXQgJiBkc3Rtc2spIDw8IDEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGIyMzoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JcmVsb2NhdGlvbiA9ICgodGFyZ2V0ICYgMHg3ZmYpIDw8IDEpICB8ICgodGFyZ2V0ICYgMHgwN2ZmMDAwMCkgPj4gNCk7Ci0gICAgICBlbHNlCi0JcmVsb2NhdGlvbiA9ICgodGFyZ2V0ICYgMHg3ZmYpIDw8IDEyKSB8ICgodGFyZ2V0ICYgMHgwN2ZmMDAwMCkgPj4gMTUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiBeIHNpZ25iaXQpIC0gc2lnbmJpdDsgLyogU2lnbiBleHRlbmQgKi8KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnZhbHVlOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcjsKLQotICBpZiAocmVsb2NhdGlvbiAmIDEpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgaWYgKHJlbG9jYXRpb24gJiBzaWduYml0KQotICAgIHsKLSAgICAgIGlmICgocmVsb2NhdGlvbiAmIH5vZmZtc2spICE9IH5vZmZtc2spCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlbG9jYXRpb24gJiB+b2ZmbXNrKQotICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgdGFyZ2V0ICY9IH5kc3Rtc2s7Ci0gIHN3aXRjaCAoYnR5cGUpCi0gICB7Ci0gICBjYXNlIGI5OgotICAgY2FzZSBiMTI6Ci0gICAgIHRhcmdldCB8PSAocmVsb2NhdGlvbiA+PiAxKTsKLSAgICAgYnJlYWs7Ci0KLSAgIGNhc2UgYjIzOgotICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgICAgIHRhcmdldCB8PSAoKHJlbG9jYXRpb24gJiAweGZmZikgPj4gMSkgIHwgKChyZWxvY2F0aW9uIDw8IDQpICAmIDB4MDdmZjAwMDApOwotICAgICBlbHNlCi0gICAgICAgdGFyZ2V0IHw9ICgocmVsb2NhdGlvbiAmIDB4ZmZlKSA8PCAxNSkgfCAoKHJlbG9jYXRpb24gPj4gMTIpICYgMHg3ZmYpOwotICAgICBicmVhazsKLQotICAgZGVmYXVsdDoKLSAgICAgYWJvcnQgKCk7Ci0gICB9Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgdGFyZ2V0LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIC8qIE5vdyB0aGUgQVJNIG1hZ2ljLi4uIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBzbyB0aGF0IGl0IGlzIG1hcmtlZCBhcyBkb25lLgotICAgICBTdHJpY3RseSB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4gICovCi0gIHJlbG9jX2VudHJ5LT5ob3d0byA9ICYgYW91dGFybV9zdGRfcmVsb2NfaG93dG8gW0FSTV8yNkRdOwotICAKLSAgLyogVE9ETzogV2Ugc2hvdWxkIHBvc3NpYmx5IGhhdmUgRE9ORSBlbnRyaWVzIGZvciB0aGUgVEhVTUIgUENSRUwgcmVsb2NhdGlvbnMgKi8KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfdGh1bWJfcGNyZWxfMjMgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHJldHVybiBjb2ZmX3RodW1iX3BjcmVsX2NvbW1vbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlLCBiMjMpOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jb2ZmX3RodW1iX3BjcmVsXzEyIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gY29mZl90aHVtYl9wY3JlbF9jb21tb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgYjEyKTsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl90aHVtYl9wY3JlbF85IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gY29mZl90aHVtYl9wY3JlbF9jb21tb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgYjkpOwotfQotCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICoKLWNvZmZfYXJtX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICAgYmZkICogYWJmZDsKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotI2RlZmluZSBBU1REKGksaikgICAgICAgY2FzZSBpOiByZXR1cm4gJmFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvW2pdCi0gIGlmIChjb2RlID09IEJGRF9SRUxPQ19DVE9SKQotICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5iaXRzX3Blcl9hZGRyZXNzKQotICAgICAgewotICAgICAgY2FzZSAzMjoKLSAgICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiByZXR1cm4gKENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKikgMDsKLSAgICAgIH0KLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgICAgQVNURCAoQkZEX1JFTE9DXzgsICAgICAgICAgICAgICAgICAgICBBUk1fOCk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTYsICAgICAgICAgICAgICAgICAgIEFSTV8xNik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMzIsICAgICAgICAgICAgICAgICAgIEFSTV8zMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwgICAgIEFSTV8yNik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfOF9QQ1JFTCwgICAgICAgICAgICAgIEFSTV9ESVNQOCk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTZfUENSRUwsICAgICAgICAgICAgIEFSTV9ESVNQMTYpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyX1BDUkVMLCAgICAgICAgICAgICBBUk1fRElTUDMyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19SVkEsICAgICAgICAgICAgICAgICAgQVJNX1JWQTMyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5LCAgQVJNX1RIVU1COSk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTIsIEFSTV9USFVNQjEyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMywgQVJNX1RIVU1CMjMpOwotICAgIGRlZmF1bHQ6IHJldHVybiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSAwOwotICAgIH0KLX0KLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDIpCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIEFSTUJBRE1BRyh4KQotI2RlZmluZSBBUk0gMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLS8qIEV4dGVuZCB0aGUgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlIHdpdGggYSBmZXcgQVJNIHNwZWNpZmljIGZpZWxkcy4KLSAgIFRoaXMgYWxsb3dzIHVzIHRvIHN0b3JlIGdsb2JhbCBkYXRhIGhlcmUgd2l0aG91dCBhY3R1YWxseSBjcmVhdGluZyBhbnkKLSAgIGdsb2JhbCB2YXJpYWJsZXMsIHdoaWNoIGlzIGEgbm8tbm8gaW4gdGhlIEJGRCB3b3JsZC4gICovCi1zdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBvcmlnaW5hbCBjb2ZmX2xpbmtfaGFzaF90YWJsZSBzdHJ1Y3R1cmUuICBNVVNUIGJlIGZpcnN0IGZpZWxkLiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlCXJvb3Q7Ci0gIAotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc2VjdGlvbiBjb250YWluZyB0aGUgVGh1bWItdG8tQVJNIGdsdWUuICAqLwotICBsb25nIGludCAJCQl0aHVtYl9nbHVlX3NpemU7Ci0gIAotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc2VjdGlvbiBjb250YWluZyB0aGUgQVJNLXRvLVRodW1iIGdsdWUuICAqLwotICBsb25nIGludCAJCQlhcm1fZ2x1ZV9zaXplOwotCi0gIC8qIEFuIGFyYml0YXJ5IGlucHV0IEJGRCBjaG9zZW4gdG8gaG9sZCB0aGUgZ2x1ZSBzZWN0aW9ucy4gICovCi0gIGJmZCAqCQkJCWJmZF9vZl9nbHVlX293bmVyOwotCi0gIC8qIFN1cHBvcnQgaW50ZXJ3b3JraW5nIHdpdGggb2xkLCBub24taW50ZXJ3b3JraW5nIGF3YXJlIEFSTSBjb2RlLiAqLwotICBpbnQgCQkJCXN1cHBvcnRfb2xkX2NvZGU7Ci19OwotCi0vKiBHZXQgdGhlIEFSTSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgY29mZl9hcm1faGFzaF90YWJsZShpbmZvKSBcCi0gICgoc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqKSAoKGluZm8pLT5oYXNoKSkKLQotLyogQ3JlYXRlIGFuIEFSTSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiByZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gICAgICAoJiByZXQtPnJvb3QsIGFiZmQsIF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldC0+dGh1bWJfZ2x1ZV9zaXplICAgPSAwOwotICByZXQtPmFybV9nbHVlX3NpemUgICAgID0gMDsKLSAgcmV0LT5iZmRfb2ZfZ2x1ZV9vd25lciA9IE5VTEw7Ci0KLSAgcmV0dXJuICYgcmV0LT5yb290LnJvb3Q7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jX29mZnNldCkKLSAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgICBiZmRfdm1hIHJlbG9jX29mZnNldDsKLXsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2Nfb2Zmc2V0Ci0gICAgICAgICAgICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEKLSAgICAgICAgICAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICBpZiAoY29mZl9kYXRhKG91dHB1dF9iZmQpLT5wZSkKLSAgICAgYWRkciAtPSBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICBmd3JpdGUgKCZhZGRyLCAxLCBzaXplb2YgKGFkZHIpLCAoRklMRSAqKSBpbmZvLT5iYXNlX2ZpbGUpOwotCi19Ci0MCi0vKiBUaGUgdGh1bWIgZm9ybSBvZiBhIGxvbmcgYnJhbmNoIGlzIGEgYml0IGZpbmlja3ksIGJlY2F1c2UgdGhlIG9mZnNldAotICAgZW5jb2RpbmcgaXMgc3BsaXQgb3ZlciB0d28gZmllbGRzLCBlYWNoIGluIGl0J3Mgb3duIGluc3RydWN0aW9uLiBUaGV5Ci0gICBjYW4gb2NjdXIgaW4gYW55IG9yZGVyLiBTbyBnaXZlbiBhIHRodW1iIGZvcm0gb2YgbG9uZyBicmFuY2gsIGFuZCBhbiAKLSAgIG9mZnNldCwgaW5zZXJ0IHRoZSBvZmZzZXQgaW50byB0aGUgdGh1bWIgYnJhbmNoIGFuZCByZXR1cm4gZmluaXNoZWQKLSAgIGluc3RydWN0aW9uLiAKLQotICAgSXQgdGFrZXMgdHdvIHRodW1iIGluc3RydWN0aW9ucyB0byBlbmNvZGUgdGhlIHRhcmdldCBhZGRyZXNzLiBFYWNoIGhhcyAKLSAgIDExIGJpdHMgdG8gaW52ZXN0LiBUaGUgdXBwZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIG9uZSAoaWRlbnRpZmVkIGJ5Ci0gICBILTAuLiBzZWUgYmVsb3cpLCB0aGUgbG93ZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIHRoZSBvdGhlciAoaWRlbnRpZmllZCAKLSAgIGJ5IEgtMSkuIAotCi0gICBDb21iaW5lIHRvZ2V0aGVyIGFuZCBzaGlmdGVkIGxlZnQgYnkgMSAoaXQncyBhIGhhbGYgd29yZCBhZGRyZXNzKSBhbmQgCi0gICB0aGVyZSB5b3UgaGF2ZSBpdC4KLQotICAgICBPcDogMTExMSA9IEYsCi0gICAgIEgtMCwgdXBwZXIgYWRkcmVzcy0wID0gMDAwCi0gICAgIE9wOiAxMTExID0gRiwKLSAgICAgSC0xLCBsb3dlciBhZGRyZXNzLTAgPSA4MDAKLQotICAgVGhleSBjYW4gYmUgb3JkZXJlZCBlaXRoZXIgd2F5LCBidXQgdGhlIGFybSB0b29scyBJJ3ZlIHNlZW4gYWx3YXlzIHB1dCAKLSAgIHRoZSBsb3dlciBvbmUgZmlyc3QuIEl0IHByb2JhYmx5IGRvZXNuJ3QgbWF0dGVyLiBrcmtAY3lnbnVzLmNvbQotCi0gICBYWFg6ICBBY3R1YWxseSB0aGUgb3JkZXIgZG9lcyBtYXR0ZXIuICBUaGUgc2Vjb25kIGluc3RydWN0aW9uIChILTEpCi0gICBtb3ZlcyB0aGUgY29tcHV0ZWQgYWRkcmVzcyBpbnRvIHRoZSBQQywgc28gaXQgbXVzdCBiZSB0aGUgc2Vjb25kIG9uZQotICAgaW4gdGhlIHNlcXVlbmNlLiAgVGhlIHByb2JsZW0sIGhvd2V2ZXIgaXMgdGhhdCB3aGlsc3QgbGl0dGxlIGVuZGlhbiBjb2RlCi0gICBzdG9yZXMgdGhlIGluc3RydWN0aW9ucyBpbiBISSB0aGVuIExPVyBvcmRlciwgYmlnIGVuZGlhbiBjb2RlIGRvZXMgdGhlCi0gICByZXZlcnNlLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLQotI2RlZmluZSBMT1dfSElfT1JERVIgMHhGODAwRjAwMAotI2RlZmluZSBISV9MT1dfT1JERVIgMHhGMDAwRjgwMAotCi1zdGF0aWMgaW5zbjMyCi1pbnNlcnRfdGh1bWJfYnJhbmNoIChicl9pbnNuLCByZWxfb2ZmKQotICAgICBpbnNuMzIgYnJfaW5zbjsKLSAgICAgaW50IHJlbF9vZmY7Ci17Ci0gIHVuc2lnbmVkIGludCBsb3dfYml0czsKLSAgdW5zaWduZWQgaW50IGhpZ2hfYml0czsKLQotCi0gIEJGRF9BU1NFUlQoKHJlbF9vZmYgJiAxKSAhPSAxKTsKLQotICByZWxfb2ZmID4+PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbGYgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KLSAgbG93X2JpdHMgPSByZWxfb2ZmICYgMHgwMDAwMDdGRjsgICAgICAgICAgICAvKiB0aGUgYm90dG9tIDExIGJpdHMgKi8KLSAgaGlnaF9iaXRzID0gKHJlbF9vZmYgPj4gMTEpICYgMHgwMDAwMDdGRjsgICAvKiB0aGUgdG9wIDExIGJpdHMgKi8KLQotICBpZiAoKGJyX2luc24gJiBMT1dfSElfT1JERVIpID09IExPV19ISV9PUkRFUikKLSAgICBicl9pbnNuID0gTE9XX0hJX09SREVSIHwgKGxvd19iaXRzIDw8IDE2KSB8IGhpZ2hfYml0czsKLSAgZWxzZSBpZiAoKGJyX2luc24gJiBISV9MT1dfT1JERVIpID09IEhJX0xPV19PUkRFUikKLSAgICBicl9pbnNuID0gSElfTE9XX09SREVSIHwgKGhpZ2hfYml0cyA8PCAxNikgfCBsb3dfYml0czsKLSAgZWxzZQotICAgIGFib3J0KCk7IC8qIGVycm9yIC0gbm90IGEgdmFsaWQgYnJhbmNoIGluc3RydWN0aW9uIGZvcm0gKi8KLQotICAvKiBGSVhNRTogYWJvcnQgaXMgcHJvYmFibHkgbm90IHRoZSByaWdodCBjYWxsLiBrcmtAY3lnbnVzLmNvbSAqLwotCi0gIHJldHVybiBicl9pbnNuOwotfQotCi0MCi1zdGF0aWMgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoKLWZpbmRfdGh1bWJfZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIENPTlNUIGNoYXIgKiAgICAgICAgICAgbmFtZTsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci17Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9uYW1lOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBteWg7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLQkgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLSAgCi0gIG15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cAotICAgIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgCi0gIGlmIChteWggPT0gTlVMTCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IHVuYWJsZSB0byBmaW5kIFRIVU1CIGdsdWUgJyVzJyBmb3IgYCVzJyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgdG1wX25hbWUsIG5hbWUpOwotICAKLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIHJldHVybiBteWg7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKgotZmluZF9hcm1fZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIENPTlNUIGNoYXIgKiAgICAgICAgICAgbmFtZTsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci17Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9uYW1lOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBteWg7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLQkgICAgICBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotICAKLSAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChteWggPT0gTlVMTCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IHVuYWJsZSB0byBmaW5kIEFSTSBnbHVlICclcycgZm9yIGAlcyciKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHRtcF9uYW1lLCBuYW1lKTsKLSAgCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICByZXR1cm4gbXloOwotfQotCi0vKgotICBBUk0tPlRodW1iIGdsdWU6Ci0KLSAgICAgICAuYXJtCi0gICAgICAgX19mdW5jX2Zyb21fYXJtOgotCSAgICAgbGRyIHIxMiwgX19mdW5jX2FkZHIKLQkgICAgIGJ4ICByMTIKLSAgICAgICBfX2Z1bmNfYWRkcjoKLSAgICAgICAgICAgIC53b3JkIGZ1bmMgICAgQCBiZWhhdmUgYXMgaWYgeW91IHNhdyBhIEFSTV8zMiByZWxvYwotKi8KLQotI2RlZmluZSBBUk0yVEhVTUJfR0xVRV9TSVpFIDEyCi1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDFfbGRyX2luc24gICAgICAgPSAweGU1OWZjMDAwOwotc3RhdGljIGNvbnN0IGluc24zMiBhMnQyX2J4X3IxMl9pbnNuICAgID0gMHhlMTJmZmYxYzsKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0M19mdW5jX2FkZHJfaW5zbiA9IDB4MDAwMDAwMDE7Ci0KLS8qCi0gICBUaHVtYi0+QVJNOgkJCQlUaHVtYi0+KG5vbi1pbnRlcndvcmtpbmcgYXdhcmUpIEFSTQotCi0gICAudGh1bWIJCQkJLnRodW1iCi0gICAuYWxpZ24gMgkJCQkuYWxpZ24gMgotICAgICAgX19mdW5jX2Zyb21fdGh1bWI6CQkgICBfX2Z1bmNfZnJvbV90aHVtYjoKLQkgICBieCBwYwkJCQlwdXNoIHtyNiwgbHJ9Ci0JICAgbm9wCQkJCQlsZHIgIHI2LCBfX2Z1bmNfYWRkcgotICAgLmFybQkJCQkJCW1vdiAgbHIsIHBjCi0gICAgICBfX2Z1bmNfY2hhbmdlX3RvX2FybToJCQlieCAgIHI2Ci0JICAgYiBmdW5jICAgCQkJLmFybQotCQkJCQkgICBfX2Z1bmNfYmFja190b190aHVtYjoKLSAgIAkJICAJCQkJbGRtaWEgcjEzISB7cjYsIGxyfQotICAgCQkJCQkgICAgICAgIGJ4ICAgIGxyCi0gICAJCQkJCSAgIF9fZnVuY19hZGRyOgotCQkJCQkgICAgICAgIC53b3JkCWZ1bmMgCi0qLwotCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX1NJWkUgKGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPyAyMCA6IDgpCi1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTFfYnhfcGNfaW5zbiA9IDB4NDc3ODsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMl9ub29wX2luc24gID0gMHg0NmMwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmEzX2JfaW5zbiAgICAgPSAweGVhMDAwMDAwOwotCi1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTFfcHVzaF9pbnNuICA9IDB4YjU0MDsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMl9sZHJfaW5zbiAgID0gMHg0ZTAzOwotc3RhdGljIGNvbnN0IGluc24xNiB0MmEzX21vdl9pbnNuICAgPSAweDQ2ZmU7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTRfYnhfaW5zbiAgICA9IDB4NDczMDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhNV9wb3BfaW5zbiAgID0gMHhlOGJkNDA0MDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhNl9ieF9pbnNuICAgID0gMHhlMTJmZmYxZTsKLQotLyogVE9ETzoKLSAgICAgV2Ugc2hvdWxkIHJlYWxseSBjcmVhdGUgbmV3IGxvY2FsIChzdGF0aWMpIHN5bWJvbHMgaW4gZGVzdGluYXRpb24KLSAgICAgb2JqZWN0IGZvciBlYWNoIHN0dWIgd2UgY3JlYXRlLiAgV2Ugc2hvdWxkIGFsc28gY3JlYXRlIGxvY2FsCi0gICAgIChzdGF0aWMpIHN5bWJvbHMgd2l0aGluIHRoZSBzdHVicyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIEFSTSBhbmQKLSAgICAgVGh1bWIgY29kZS4gIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgZGVidWdnZXIgYW5kIGRpc2Fzc2VtYmxlcgotICAgICBjYW4gcHJlc2VudCBhIGJldHRlciB2aWV3IG9mIHN0dWJzLgotCi0gICAgIFdlIGNhbiB0cmVhdCBzdHVicyBsaWtlIGxpdGVyYWwgc2VjdGlvbnMsIGFuZCBmb3IgdGhlIFRIVU1COSBvbmVzCi0gICAgIChzaG9ydCBhZGRyZXNzaW5nIHJhbmdlKSB3ZSBzaG91bGQgYmUgYWJsZSB0byBpbnNlcnQgdGhlIHN0dWJzCi0gICAgIGJldHdlZW4gc2VjdGlvbnMuIGkuZS4gdGhlIHNpbXBsZXN0IGFwcHJvYWNoIChzaW5jZSByZWxvY2F0aW9ucwotICAgICBhcmUgZG9uZSBvbiBhIHNlY3Rpb24gYmFzaXMpIGlzIHRvIGR1bXAgdGhlIHN0dWJzIGF0IHRoZSBlbmQgb2YKLSAgICAgcHJvY2Vzc2luZyBhIHNlY3Rpb24uIFRoYXQgd2F5IHdlIGNhbiBhbHdheXMgdHJ5IGFuZCBtaW5pbWlzZSB0aGUKLSAgICAgb2Zmc2V0IHRvIGFuZCBmcm9tIGEgc3R1Yi4gSG93ZXZlciwgdGhpcyBkb2VzIG5vdCBtYXAgd2VsbCBvbnRvCi0gICAgIHRoZSB3YXkgdGhhdCB0aGUgbGlua2VyL0JGRCBkb2VzIGl0cyB3b3JrOiBtYXBwaW5nIGFsbCBpbnB1dAotICAgICBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMgdmlhIHRoZSBsaW5rZXIgc2NyaXB0IGJlZm9yZSBkb2luZwotICAgICBhbGwgdGhlIHByb2Nlc3NpbmcuCi0KLSAgICAgVW5mb3J0dW5hdGVseSBpdCBtYXkgYmUgZWFzaWVyIHRvIGp1c3QgdG8gZGlzYWxsb3cgc2hvcnQgcmFuZ2UKLSAgICAgVGh1bWItPkFSTSBzdHVicyAoaS5lLiBubyBjb25kaXRpb25hbCBpbnRlci13b3JraW5nIGJyYW5jaGVzLAotICAgICBvbmx5IGJyYW5jaC1hbmQtbGluayAoQkwpIGNhbGxzLiAgVGhpcyB3aWxsIHNpbXBsaWZ5IHRoZSBwcm9jZXNzaW5nCi0gICAgIHNpbmNlIHdlIGNhbiB0aGVuIHB1dCBhbGwgb2YgdGhlIHN0dWJzIGludG8gdGhlaXIgb3duIHNlY3Rpb24uCi0KLSAgVE9ETzoKLSAgICAgT24gYSBkaWZmZXJlbnQgc3ViamVjdCwgcmF0aGVyIHRoYW4gY29tcGxhaW5pbmcgd2hlbiBhCi0gICAgIGJyYW5jaCBjYW5ub3QgZml0IGluIHRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgZm9yIHRoZQotICAgICBpbnN0cnVjdGlvbiB3ZSBzaG91bGQgZ2VuZXJhdGUgYSB0cmFtcG9saW5lIHN0dWIgKG5lZWRlZCB0bwotICAgICBhZGRyZXNzIHRoZSBjb21wbGV0ZSAzMmJpdCBhZGRyZXNzIHNwYWNlKS4gICovCi0KLS8qIFRoZSBzdGFuZGFyZCBDT0ZGIGJhY2tlbmQgbGlua2VyIGRvZXMgbm90IGNvcGUgd2l0aCB0aGUgc3BlY2lhbCAKLSAgIFRodW1iIEJSQU5DSDIzIHJlbG9jYXRpb24uICBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gc3BsaXQgdGhlCi0gICBCUkFOQ0gyMyBpbnRvIHNlcGVyYXRlIEhJMjMgYW5kIExPMjMgcmVsb2NhdGlvbnMuIEhvd2V2ZXIsIGl0IGlzIGEKLSAgIGJpdCBzaW1wbGVyIHNpbXBseSBwcm92aWRpbmcgb3VyIG93biByZWxvY2F0aW9uIGRyaXZlci4gKi8KLQotLyogVGhlIHJlbG9jIHByb2Nlc3Npbmcgcm91dGluZSBmb3IgdGhlIEFSTS9UaHVtYiBDT0ZGIGxpbmtlci4gIE5PVEU6Ci0gICBUaGlzIGNvZGUgaXMgYSB2ZXJ5IHNsaWdodGx5IG1vZGlmaWVkIGNvcHkgb2YKLSAgIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24uICBJdCB3b3VsZCBiZSBhIG11Y2ggbW9yZQotICAgbWFpbnRhaW5hYmxlIHNvbHV0aW9uIHRvIGhhdmUgYSBNQUNSTyB0aGF0IGNvdWxkIGJlIGV4cGFuZGVkIHdpdGhpbgotICAgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbiB0aGF0IHdvdWxkIG9ubHkgYmUgcHJvdmlkZWQgZm9yCi0gICBBUk0vVGh1bWIgYnVpbGRzLiAgSXQgaXMgb25seSB0aGUgY29kZSBtYXJrZWQgVEhVTUJFWFRFTlNJT04gdGhhdAotICAgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICogcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSAwOwotICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICBoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqICAgICAgIHN5bTsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgICBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgdmFsOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICAgIGhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICAgIHJzdGF0OwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIGhfdmFsOwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JeyAgICAKLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgLyogQ09GRiB0cmVhdHMgY29tbW9uIHN5bWJvbHMgaW4gb25lIG9mIHR3byB3YXlzLiAgRWl0aGVyIHRoZQotICAgICAgICAgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIGluY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBvciBpdAotICAgICAgICAgaXMgbm90LiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNpemUgaXMgbm90IGluY2x1ZGVkLCBhbmQgZm9yY2UKLSAgICAgICAgIHRoZSBydHlwZV90b19ob3d0byBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIGFkZGVuZCBhcyBuZWVkZWQuICAqLwotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotCi0gICAgICBob3d0byA9IGNvZmZfcnR5cGVfdG9faG93dG8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLCBoLAotCQkJCSAgICAgICBzeW0sICZhZGRlbmQpOwotICAgICAgaWYgKGhvd3RvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgcmVsb2NhdGlvbl9zZWN0aW9uIGZ1bmN0aW9uIHdpbGwgc2tpcCBwY3JlbF9vZmZzZXQgcmVsb2NzCi0gICAgICAgICB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBIb3dldmVyLCB3ZSB3YW50IHRvIGNvbnZlcnQKLSAgICAgICAgIEFSTTI2IHRvIEFSTTI2RCByZWxvY3MgaWYgcG9zc2libGUuICBXZSByZXR1cm4gYSBmYWtlIGhvd3RvIGluCi0gICAgICAgICB0aGlzIGNhc2Ugd2l0aG91dCBwY3JlbF9vZmZzZXQgc2V0LCBhbmQgYWRqdXN0IHRoZSBhZGRlbmQgdG8KLSAgICAgICAgIGNvbXBlbnNhdGUuICAqLwotICAgICAgaWYgKHJlbC0+cl90eXBlID09IEFSTV8yNgotICAgICAgICAgICYmIGggIT0gTlVMTAotICAgICAgICAgICYmIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICAgICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZmFrZV9hcm0yNl9yZWxvYyA9IAotCSAgICBIT1dUTyAoQVJNXzI2LAotICAgIAkgICAgICAgMiwKLSAgICAJICAgICAgIDIsCi0gICAgCSAgICAgICAyNCwKLSAgICAJICAgICAgIHRydWUsCi0gICAgCSAgICAgICAwLAotICAgIAkgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotICAgIAkgICAgICAgYW91dGFybV9maXhfcGNyZWxfMjYgLAotICAgIAkgICAgICAgIkFSTV8yNiIsCi0gICAgCSAgICAgICBmYWxzZSwKLSAgICAJICAgICAgIDB4MDBmZmZmZmYsCi0gICAgCSAgICAgICAweDAwZmZmZmZmLCAKLSAgICAJICAgICAgIGZhbHNlKTsKLQotICAgICAgICAgIGFkZGVuZCAtPSByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICAgICAgaG93dG8gPSAmZmFrZV9hcm0yNl9yZWxvYzsKLSAgICAgICAgfQotCi0gICAgICAvKiBJZiB3ZSBhcmUgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdGhlbiB3ZSBjYW4ganVzdCBpZ25vcmUKLSAgICAgICAgIGEgUEMgcmVsYXRpdmUgcmVsb2MgdGhhdCBpcyBwY3JlbF9vZmZzZXQuICBJdCB3aWxsIGFscmVhZHkKLSAgICAgICAgIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWUuICBJZiB0aGlzIGlzIG5vdCBhIHJlbG9jYXRlYWJsZSBsaW5rLAotICAgICAgICAgdGhlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBzeW1ib2wgdmFsdWUuICAqLwotICAgICAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+cGNyZWxfb2Zmc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLSAgICAgICAgICAgIGFkZGVuZCArPSBzeW0tPm5fdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgdmFsID0gMDsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotICAgICAgICAgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIHN5bS0+bl92YWx1ZQotCQkgICAgIC0gc2VjLT52bWEpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLSNpZiAxIC8qIFRIVU1CRVhURU5TSU9OICovCi0gICAgICAgICAgLyogV2UgZG9uJ3Qgb3V0cHV0IHRoZSBzdHVicyBpZiB3ZSBhcmUgZ2VuZXJhdGluZyBhCi0gICAgICAgICAgICAgcmVsb2NhdGFibGUgb3V0cHV0IGZpbGUsIHNpbmNlIHdlIG1heSBhcyB3ZWxsIGxlYXZlIHRoZQotICAgICAgICAgICAgIHN0dWIgZ2VuZXJhdGlvbiB0byB0aGUgZmluYWwgbGlua2VyIHBhc3MuIElmIHdlIGZhaWwgdG8KLQkgICAgIHZlcmlmeSB0aGF0IHRoZSBuYW1lIGlzIGRlZmluZWQsIHdlJ2xsIHRyeSB0byBidWlsZCBzdHVicwotCSAgICAgZm9yIGFuIHVuZGVmaW5lZCBuYW1lLi4uICovCi0gICAgICAgICAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JICAgICAgJiYgKCAgIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICAgICAgICAgIHsKLQkgICAgICBhc2VjdGlvbiAqICAgaF9zZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgY29uc3QgY2hhciAqIG5hbWUgID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgICAKLQkgICAgICAvKiBoIGxvY2F0ZXMgdGhlIHN5bWJvbCByZWZlcmVuY2VkIGluIHRoZSByZWxvYy4gICovCi0JICAgICAgaF92YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBoX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBoX3NlYy0+b3V0cHV0X29mZnNldCk7Ci0KLSAgICAgICAgICAgICAgaWYgKGhvd3RvLT50eXBlID09IEFSTV8yNikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoICAgaC0+Y2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DCi0JCSAgICAgIHx8IGgtPmNsYXNzID09IENfVEhVTUJFWFRGVU5DKQotCQkgICAgewotCQkgICAgICAvKiBBcm0gY29kZSBjYWxsaW5nIGEgVGh1bWIgZnVuY3Rpb24gKi8KLQkJICAgICAgdW5zaWduZWQgbG9uZyBpbnQgICAgICAgICAgICAgICAgIHRtcDsKLQkJICAgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIG15X29mZnNldDsKLQkJICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgICAgIHM7Ci0JCSAgICAgIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICByZXRfb2Zmc2V0OwotCQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgICAgbXloOyAKLQkJICAgICAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0JCSAgICAgIAotCQkgICAgICBteWggPSBmaW5kX2FybV9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpOwotCQkgICAgICBpZiAobXloID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJICAgICAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0JCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCQkJCi0JCSAgICAgIG15X29mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJICAgICAgCi0JCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIAotCQkJCQkJICBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUIChzLT5jb250ZW50cyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCk7Ci0KLQkJICAgICAgaWYgKChteV9vZmZzZXQgJiAweDAxKSA9PSAweDAxKQotCQkJewotCQkJICBpZiAoaF9zZWMtPm93bmVyICE9IE5VTEwKLQkJCSAgICAgICYmIElOVEVSV09SS19TRVQgKGhfc2VjLT5vd25lcikKLQkJCSAgICAgICYmICEgSU5URVJXT1JLX0ZMQUcgKGhfc2VjLT5vd25lcikpCi0JCQkgICAgewotCQkJICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCQkoXygiJXMoJXMpOiB3YXJuaW5nOiBpbnRlcndvcmtpbmcgbm90IGVuYWJsZWQuIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGhfc2VjLT5vd25lciksIG5hbWUpOwotCQkJICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCQkoXygiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogYXJtIGNhbGwgdG8gdGh1bWIiKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JCQkgICAgfQotCi0JCQkgIC0tbXlfb2Zmc2V0OwotCQkJICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7Ci0KLQkJCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgYTJ0MV9sZHJfaW5zbiwKLQkJCQkgICAgICBzLT5jb250ZW50cyArIG15X29mZnNldCk7Ci0JCQkgIAotCQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhMnQyX2J4X3IxMl9pbnNuLAotCQkJCSAgICAgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0JCQkgIAotCQkJICAvKiBJdCdzIGEgdGh1bWIgYWRkcmVzcy4gIEFkZCB0aGUgbG93IG9yZGVyIGJpdC4gICovCi0JCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGhfdmFsIHwgYTJ0M19mdW5jX2FkZHJfaW5zbiwKLQkJCQkgICAgICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5IChpbmZvLCBvdXRwdXRfYmZkLCBzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X29mZnNldCArIDgpOwotCi0JCQl9Ci0KLQkJICAgICAgQkZEX0FTU0VSVCAobXlfb2Zmc2V0IDw9IGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotCi0JCSAgICAgIHRtcCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfdmFkZHIKLQkJCQkJLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCQkgICAgICAKLQkJICAgICAgdG1wID0gdG1wICYgMHhGRjAwMDAwMDsKLQotCQkgICAgICAvKiBTb21laG93IHRoZXNlIGFyZSBib3RoIDQgdG9vIGZhciwgc28gc3VidHJhY3QgOC4gKi8KLQkJICAgICAgcmV0X29mZnNldCA9Ci0JCQlzLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIG15X29mZnNldCAKLQkJCSsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hIAotCQkJICAgKyByZWwtPnJfdmFkZHIpCi0JCQktIDg7Ci0KLQkJICAgICAgdG1wID0gdG1wIHwgKChyZXRfb2Zmc2V0ID4+IDIpICYgMHgwMEZGRkZGRik7Ci0JCSAgICAgIAotCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB0bXAsIGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyCi0JCQkJICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JCSAgICAgIGRvbmUgPSAxOwotCQkgICAgfQotICAgICAgICAgICAgICAgIH0KLQkgICAgICAKLQkgICAgICAvKiBOb3RlOiBXZSB1c2VkIHRvIGNoZWNrIGZvciBBUk1fVEhVTUI5IGFuZCBBUk1fVEhVTUIxMiAqLwotICAgICAgICAgICAgICBlbHNlIGlmIChob3d0by0+dHlwZSA9PSBBUk1fVEhVTUIyMykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoICAgaC0+Y2xhc3MgPT0gQ19FWFQgCi0JCSAgICAgIHx8IGgtPmNsYXNzID09IENfU1RBVAotCQkgICAgICB8fCBoLT5jbGFzcyA9PSBDX0xBQkVMKQotCQkgICAgewotCQkgICAgICAvKiBUaHVtYiBjb2RlIGNhbGxpbmcgYW4gQVJNIGZ1bmN0aW9uICovCi0JCSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IDA7Ci0JCSAgICAgIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfb2Zmc2V0OwotCQkgICAgICB1bnNpZ25lZCBsb25nIGludCAgICAgICAgICAgICAgICAgIHRtcDsKLQkJICAgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRfb2Zmc2V0OwotCQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgICAgIG15aDsKLQkJICAgICAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqICBnbG9iYWxzOwotCi0JCSAgICAgIG15aCA9IGZpbmRfdGh1bWJfZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKTsKLQkJICAgICAgaWYgKG15aCA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCSAgICAgIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQkJICAgICAgCi0JCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCQkgICAgICAKLQkJICAgICAgbXlfb2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCQkgICAgICAKLQkJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgCi0JCQkJCQkgICBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCQkgICAgICAKLQkJICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAocy0+Y29udGVudHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpOwotCQkgICAgICAKLQkJICAgICAgaWYgKChteV9vZmZzZXQgJiAweDAxKSA9PSAweDAxKQotCQkJewotCQkJICBpZiAoaF9zZWMtPm93bmVyICE9IE5VTEwKLQkJCSAgICAgICYmIElOVEVSV09SS19TRVQgKGhfc2VjLT5vd25lcikKLQkJCSAgICAgICYmICEgSU5URVJXT1JLX0ZMQUcgKGhfc2VjLT5vd25lcikKLQkJCSAgICAgICYmICEgZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSkKLQkJCSAgICB7Ci0JCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCShfKCIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaF9zZWMtPm93bmVyKSwgbmFtZSk7Ci0JCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCShfKCIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiB0aHVtYiBjYWxsIHRvIGFybSIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkJCShfKCIgIGNvbnNpZGVyIHJlbGlua2luZyB3aXRoIC0tc3VwcG9ydC1vbGQtY29kZSBlbmFibGVkIikpOwotCQkJICAgIH0KLQkJCSAgCi0JCQkgIC0tIG15X29mZnNldDsKLQkJCSAgbXloLT5yb290LnUuZGVmLnZhbHVlID0gbXlfb2Zmc2V0OwotCi0JCQkgIGlmIChnbG9iYWxzLT5zdXBwb3J0X29sZF9jb2RlKQotCQkJICAgIHsKLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTFfcHVzaF9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKLQkJCSAgICAgIAotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMl9sZHJfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDIpOwotCi0JCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmEzX21vdl9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0KLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTRfYnhfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDYpOwotCQkJICAgICAgCi0JCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB0MmE1X3BvcF9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgOCk7Ci0JCQkgICAgICAKLQkJCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHQyYTZfYnhfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDEyKTsKLQkJCSAgICAgIAotCQkJICAgICAgLyogU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBsYXN0IHdvcmQgb2YgdGhlIHN0dWIuICAqLwotCQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaF92YWwsCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgcywgbXlfb2Zmc2V0ICsgMTYpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTFfYnhfcGNfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCk7Ci0JCSAgICAgIAotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMl9ub29wX2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyAyKTsKLQkJICAgICAgCi0JCQkgICAgICByZXRfb2Zmc2V0ID0KLQkJCQkoKGJmZF9zaWduZWRfdm1hKSBoX3ZhbCkJLyogQWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBvZiB0aGUgc3R1YiAqLwotCQkJCS0gKChiZmRfc2lnbmVkX3ZtYSkKLQkJCQkgICAocy0+b3V0cHV0X29mZnNldCAJCS8qIE9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBzZWN0aW9uIHRvIHRoZSBzdGFydCBvZiB0aGUgc3R1YnMuICAqLwotCQkJCSAgICArIG15X29mZnNldAkJCS8qIE9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhpcyBzdHViIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHVicy4gICovCi0JCQkJICAgICsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSkgCS8qIEFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uICAqLwotCQkJCSAgICsgNAkJCQkvKiBUaGUgYnJhbmNoIGluc3RydWN0aW9uIGlzIDQgYnl0ZXMgaW50byB0aGUgc3R1Yi4gICovCi0JCQkJICAgKyA4KTsJCQkvKiBBUk0gYnJhbmNoZXMgd29yayBmcm9tIHRoZSBwYyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKyA4LiAgKi8KLQkJCSAgICAgIAotCQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCQkJICB0MmEzX2JfaW5zbiB8ICgocmV0X29mZnNldCA+PiAyKSAmIDB4MDBGRkZGRkYpLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0KLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgQkZEX0FTU0VSVCAobXlfb2Zmc2V0IDw9IGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSk7Ci0KLQkJICAgICAgLyogTm93IGdvIGJhY2sgYW5kIGZpeCB1cCB0aGUgb3JpZ2luYWwgQkwgaW5zbiB0byBwb2ludAotCQkJIHRvIGhlcmUuICAqLwotCQkgICAgICByZXRfb2Zmc2V0ID0KLQkJCXMtPm91dHB1dF9vZmZzZXQKLQkJCSsgbXlfb2Zmc2V0Ci0JCQktIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICArIHJlbC0+cl92YWRkcikKLQkJCS00OwotCQkgICAgICAKLQkJICAgICAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl92YWRkcgotCQkJCQktIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCQkgIGluc2VydF90aHVtYl9icmFuY2ggKHRtcCwgcmV0X29mZnNldCksCi0JCQkJICBjb250ZW50cyArIHJlbC0+cl92YWRkcgotCQkJCSAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCQkgICAgICAKLQkJICAgICAgZG9uZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JICAKLSAgICAgICAgICAvKiBJZiB0aGUgcmVsb2NhdGlvbiB0eXBlIGFuZCBkZXN0aW5hdGlvbiBzeW1ib2wgZG9lcyBub3QKLSAgICAgICAgICAgICBmYWxsIGludG8gb25lIG9mIHRoZSBhYm92ZSBjYXRlZ29yaWVzLCB0aGVuIHdlIGNhbiBqdXN0Ci0gICAgICAgICAgICAgcGVyZm9ybSBhIGRpcmVjdCBsaW5rLiAqLwotCi0JICBpZiAoZG9uZSkKLQkgICAgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0JICBlbHNlIAotI2VuZGlmIC8qIFRIVU1CRVhURU5TSU9OICovCi0JICAgIGlmICggICBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCXx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgfQotCi0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+YmFzZV9maWxlKQotCXsKLQkgIC8qIEVtaXQgYSByZWxvYyBpZiB0aGUgYmFja2VuZCB0aGlua3MgaXQgbmVlZHMgaXQuICovCi0JICBpZiAoc3ltICYmIHBlX2RhdGEob3V0cHV0X2JmZCktPmluX3JlbG9jX3Aob3V0cHV0X2JmZCwgaG93dG8pKQotICAgICAgICAgICAgYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5IChpbmZvLCBvdXRwdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIpOwotCX0KLSAgCi0jaWYgMSAvKiBUSFVNQkVYVEVOU0lPTiAqLwotICAgICAgaWYgKGRvbmUpCi0JcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0gICAgICAvKiBPbmx5IHBlcmZvcm0gdGhpcyBmaXggZHVyaW5nIHRoZSBmaW5hbCBsaW5rLCBub3QgYSByZWxvY2F0YWJsZSBsaW5rLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLSAgICAgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JICAgICAgICYmIGhvd3RvLT50eXBlID09IEFSTV9USFVNQjIzKQotICAgICAgICB7Ci0gICAgICAgICAgLyogVGhpcyBpcyBwcmV0dHkgbXVjaCBhIGNvcHkgb2Ygd2hhdCB0aGUgZGVmYXVsdAotICAgICAgICAgICAgIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSBhbmQgX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotICAgICAgICAgICAgIHJvdXRpbmVzIGRvIHRvIHBlcmZvcm0gYSByZWxvY2F0aW9uLCB3aXRoIHNwZWNpYWwKLSAgICAgICAgICAgICBwcm9jZXNzaW5nIGZvciB0aGUgc3BsaXQgYWRkcmVzc2luZyBvZiB0aGUgVGh1bWIgQkwKLSAgICAgICAgICAgICBpbnN0cnVjdGlvbi4gIEFnYWluLCBpdCB3b3VsZCBwcm9iYWJseSBiZSBzaW1wbGVyIGFkZGluZyBhCi0gICAgICAgICAgICAgVGh1bWJCUkFOQ0gyMyBzcGVjaWZpYyBtYWNybyBleHBhbnNpb24gaW50byB0aGUgZGVmYXVsdAotICAgICAgICAgICAgIGNvZGUuICAqLwotCSAgCi0gICAgICAgICAgYmZkX3ZtYSBhZGRyZXNzID0gcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCSAgCi0gICAgICAgICAgaWYgKGFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JICAgIHJzdGF0ID0gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBiZmRfdm1hICAgICAgICAgcmVsb2NhdGlvbiAgICAgICA9IHZhbCArIGFkZGVuZDsKLQkgICAgICBpbnQgICAgICAgICAgICAgc2l6ZSAgICAgICAgICAgICA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotCSAgICAgIGJvb2xlYW4gICAgICAgICBvdmVyZmxvdyAgICAgICAgID0gZmFsc2U7Ci0JICAgICAgYmZkX2J5dGUgKiAgICAgIGxvY2F0aW9uICAgICAgICAgPSBjb250ZW50cyArIGFkZHJlc3M7Ci0JICAgICAgYmZkX3ZtYSAgICAgICAgIHggICAgICAgICAgICAgICAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLQkgICAgICBiZmRfdm1hICAgICAgICAgc3JjX21hc2sgICAgICAgICA9IDB4MDA3RkZGRkU7Ci0JICAgICAgYmZkX3NpZ25lZF92bWEgIHJlbG9jX3NpZ25lZF9tYXggPSAoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxOwotCSAgICAgIGJmZF9zaWduZWRfdm1hICByZWxvY19zaWduZWRfbWluID0gfnJlbG9jX3NpZ25lZF9tYXg7Ci0JICAgICAgYmZkX3ZtYSAgICAgICAgIGNoZWNrOwotCSAgICAgIGJmZF9zaWduZWRfdm1hICBzaWduZWRfY2hlY2s7Ci0JICAgICAgYmZkX3ZtYSAgICAgICAgIGFkZDsKLQkgICAgICBiZmRfc2lnbmVkX3ZtYSAgc2lnbmVkX2FkZDsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHNpemUgPT0gNCk7Ci0JICAgICAgCi0gICAgICAgICAgICAgIC8qIGhvd3RvLT5wY19yZWxhdGl2ZSBzaG91bGQgYmUgVFJVRSBmb3IgdHlwZSAxNCBCUkFOQ0gyMyAqLwotICAgICAgICAgICAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgCi0gICAgICAgICAgICAgIC8qIGhvd3RvLT5wY3JlbF9vZmZzZXQgc2hvdWxkIGJlIFRSVUUgZm9yIHR5cGUgMTQgQlJBTkNIMjMgKi8KLSAgICAgICAgICAgICAgcmVsb2NhdGlvbiAtPSBhZGRyZXNzOwotCSAgICAgIAotCSAgICAgIC8qIE5vIG5lZWQgdG8gbmVnYXRlIHRoZSByZWxvY2F0aW9uIHdpdGggQlJBTkNIMjMuICovCi0JICAgICAgLyogaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCBmb3IgQlJBTkNIMjMuICAqLwotCSAgICAgIC8qIGhvd3RvLT5yaWdodHNoaWZ0ID09IDEgKi8KLQkgICAgICAvKiBEcm9wIHVud2FudGVkIGJpdHMgZnJvbSB0aGUgdmFsdWUgd2UgYXJlIHJlbG9jYXRpbmcgdG8uICAqLwotCSAgICAgIAotCSAgICAgIGNoZWNrID0gcmVsb2NhdGlvbiA+PiBob3d0by0+cmlnaHRzaGlmdDsKLQkJCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIHNpZ25lZCB2YWx1ZSwgdGhlIHJpZ2h0c2hpZnQganVzdCBkcm9wcGVkCi0JCSBsZWFkaW5nIDEgYml0cyAoYXNzdW1pbmcgdHdvcyBjb21wbGVtZW50KS4gICovCi0JICAgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PSAwKQotCQlzaWduZWRfY2hlY2sgPSBjaGVjazsKLQkgICAgICBlbHNlCi0JCXNpZ25lZF9jaGVjayA9IChjaGVjawotCQkJCXwgKChiZmRfdm1hKSAtIDEKLQkJCQkgICAmIH4oKGJmZF92bWEpIC0gMSA+PiBob3d0by0+cmlnaHRzaGlmdCkpKTsKLQkgICAgICAKLQkgICAgICAvKiBHZXQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlLiAgKi8KLQkgICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JCXsKLQkJICBhZGQgPSAoKCh4KSAmIDB4MDdmZjAwMDApID4+IDQpIHwgKCgoeCkgJiAweDdmZikgPDwgMSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhZGQgPSAoKCgoeCkgJiAweDdmZikgPDwgMTIpIHwgKCgoeCkgJiAweDA3ZmYwMDAwKSA+PiAxNSkpOwotCQl9Ci0KLQkgICAgICAvKiBHZXQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlIHdpdGggYW4gYXBwcm9wcmlhdGUgc2lnbi4KLQkJIFRoZSBleHByZXNzaW9uIGludm9sdmluZyBob3d0by0+c3JjX21hc2sgaXNvbGF0ZXMgdGhlIHVwcGVyCi0JCSBiaXQgb2Ygc3JjX21hc2suICBJZiB0aGF0IGJpdCBpcyBzZXQgaW4gdGhlIHZhbHVlIHdlIGFyZQotCQkgYWRkaW5nLCBpdCBpcyBuZWdhdGl2ZSwgYW5kIHdlIHN1YnRyYWN0IG91dCB0aGF0IG51bWJlciB0aW1lcwotCQkgdHdvLiAgSWYgc3JjX21hc2sgaW5jbHVkZXMgdGhlIGhpZ2hlc3QgcG9zc2libGUgYml0LCB0aGVuIHdlCi0JCSBjYW4gbm90IGdldCB0aGUgdXBwZXIgYml0LCBidXQgdGhhdCBkb2VzIG5vdCBtYXR0ZXIgc2luY2UKLQkJIHNpZ25lZF9hZGQgbmVlZHMgbm8gYWRqdXN0bWVudCB0byBiZWNvbWUgbmVnYXRpdmUgaW4gdGhhdAotCQkgY2FzZS4gICovCi0JICAgICAgCi0JICAgICAgc2lnbmVkX2FkZCA9IGFkZDsKLQkgICAgICAKLQkgICAgICBpZiAoKGFkZCAmICgoKH4gc3JjX21hc2spID4+IDEpICYgc3JjX21hc2spKSAhPSAwKQotCQlzaWduZWRfYWRkIC09ICgoKH4gc3JjX21hc2spID4+IDEpICYgc3JjX21hc2spIDw8IDE7Ci0JICAgICAgCi0JICAgICAgLyogQWRkIHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZSwgc2hpZnRlZCBzbyB0aGF0IGl0IGlzIGEKLQkJIHN0cmFpZ2h0IG51bWJlci4gICovCi0JICAgICAgLyogaG93dG8tPmJpdHBvcyA9PSAwICovCi0JICAgICAgCi0JICAgICAgc2lnbmVkX2NoZWNrICs9IHNpZ25lZF9hZGQ7Ci0JICAgICAgcmVsb2NhdGlvbiArPSBzaWduZWRfYWRkOwotCi0JICAgICAgQkZEX0FTU0VSVCAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCk7Ci0KLQkgICAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICAqLwotCSAgICAgIGlmICggICBzaWduZWRfY2hlY2sgPiByZWxvY19zaWduZWRfbWF4Ci0JCSAgfHwgc2lnbmVkX2NoZWNrIDwgcmVsb2Nfc2lnbmVkX21pbikKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIAotCSAgICAgIC8qIFB1dCBSRUxPQ0FUSU9OIGludG8gdGhlIGNvcnJlY3QgYml0czogICovCi0JICAgICAgCi0JICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9ICgoKHJlbG9jYXRpb24gJiAweGZmZSkgPj4gMSkgIHwgKChyZWxvY2F0aW9uIDw8IDQpICYgMHgwN2ZmMDAwMCkpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9ICgoKHJlbG9jYXRpb24gJiAweGZmZSkgPDwgMTUpIHwgKChyZWxvY2F0aW9uID4+IDEyKSAmIDB4N2ZmKSk7Ci0JCX0KLQkgICAgICAKLQkgICAgICAvKiBBZGQgUkVMT0NBVElPTiB0byB0aGUgY29ycmVjdCBiaXRzIG9mIFg6ICAqLwotCSAgICAgIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8IHJlbG9jYXRpb24pOwotCi0JICAgICAgLyogUHV0IHRoZSByZWxvY2F0ZWQgdmFsdWUgYmFjayBpbiB0aGUgb2JqZWN0IGZpbGU6ICAqLwotCSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotCi0JICAgICAgcnN0YXQgPSBvdmVyZmxvdyA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgZWxzZQotI2VuZGlmIC8qIFRIVU1CRVhURU5TSU9OICovCi0gICAgICAgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsIGFkZGVuZCk7Ci0jaWYgMSAvKiBUSFVNQkVYVEVOU0lPTiAqLwotICAgICAgLyogRklYTUU6IAotCSBJcyB0aGlzIHRoZSBiZXN0IHdheSB0byBmaXggdXAgdGh1bWIgYWRkcmVzc2VzPyBrcmtAY3lnbnVzLmNvbQotCSBQcm9iYWJseSBub3QsIGJ1dCBpdCB3b3JrcywgYW5kIGlmIGl0IHdvcmtzIGl0IGRvbid0IG5lZWQgZml4aW5nISAgbmlja2NAY3lnbnVzLmNvbSAqLwotICAgICAgLyogT25seSBwZXJmb3JtIHRoaXMgZml4IGR1cmluZyB0aGUgZmluYWwgbGluaywgbm90IGEgcmVsb2NhdGFibGUgbGluay4gIG5pY2tjQGN5Z251cy5jb20gICovCi0gICAgICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkgICYmIChyZWwtPnJfdHlwZSA9PSBBUk1fMzIgfHwgcmVsLT5yX3R5cGUgPT0gQVJNX1JWQTMyKSkKLQl7Ci0JICAvKiBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBzZXQgdGhlIGJvdHRvbSBiaXQgb2YgYSByZWxvY2F0ZWQgYWRkcmVzcwotCSAgICAgYmVjYXVzZSB0aGUgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiBhIFRodW1iIGNvZGUgc3ltYm9sLiAgKi8KLQkgICAgIAotCSAgaW50IHBhdGNoaXQgPSBmYWxzZTsKLQkgIAotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmICggICBoLT5jbGFzcyA9PSBDX1RIVU1CU1RBVEZVTkMKLQkJICB8fCBoLT5jbGFzcyA9PSBDX1RIVU1CRVhURlVOQykpCi0JICAgIHsKLQkgICAgICBwYXRjaGl0ID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3ltICE9IE5VTEwKLQkJICAgJiYgc3ltLT5uX3NjbnVtID4gTl9VTkRFRikKLQkgICAgewotCSAgICAgIC8qIE5vIGhhc2ggZW50cnkgLSB1c2UgdGhlIHN5bWJvbCBpbnN0ZWFkLiAgKi8KLQotCSAgICAgIGlmICggICBzeW0tPm5fc2NsYXNzID09IENfVEhVTUJTVEFURlVOQwotCQkgIHx8IHN5bS0+bl9zY2xhc3MgPT0gQ19USFVNQkVYVEZVTkMpCi0JCXBhdGNoaXQgPSB0cnVlOwotCSAgICB9Ci0KLQkgIGlmIChwYXRjaGl0KQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgKiBsb2NhdGlvbiA9IGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCSAgICAgIGJmZF92bWEgICAgeCAgICAgICAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLQotCSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCB8IDEsIGxvY2F0aW9uKTsKLQkgICAgfQotCX0KLSNlbmRpZiAvKiBUSFVNQkVYVEVOU0lPTiAqLyAgICAgIAotICAgICAgCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogYmFkIHJlbG9jIGFkZHJlc3MgMHglbHggaW4gc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl92YWRkciwKLQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgc3ltLCBidWYpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLWJvb2xlYW4KLWJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIChpbmZvKSAKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICAgICAgczsKLSAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvbzsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0jaWYgMAotICBzdGF0aWMgY2hhciAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jaGFyID0gJzEnOwotI2VuZGlmCi0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQotICBpZiAoZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotICAgICAgCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICAKLSAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotI2lmIDAKLSAgICAgIG1lbXNldCAoZm9vLCB0ZXN0X2NoYXIsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotI2VuZGlmCi0gICAgICAKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IHMtPl9jb29rZWRfc2l6ZSA9IGdsb2JhbHMtPmFybV9nbHVlX3NpemU7Ci0gICAgICBzLT5jb250ZW50cyA9IGZvbzsKLSAgICB9Ci0KLSAgaWYgKGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotICAgICAgCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICAKLSAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSk7Ci0jaWYgMAotICAgICAgbWVtc2V0IChmb28sIHRlc3RfY2hhciwgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLSNlbmRpZgotICAgICAgCi0gICAgICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemU7Ci0gICAgICBzLT5jb250ZW50cyA9IGZvbzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgIGluZm87Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKiAgICAgICAgICAgICAgIHM7Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogICAgIG15aDsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotICAgIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0JICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLSAgCi0gIG15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cAotICAgIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgCi0gIGlmIChteWggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICh0bXBfbmFtZSk7Ci0gICAgICByZXR1cm47IC8qIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGd1eSAqLwotICAgIH0KLQotICAvKiBUaGUgb25seSB0cmljayBoZXJlIGlzIHVzaW5nIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgYXMgdGhlIHZhbHVlLiBFdmVuCi0gICAgIHRob3VnaCB0aGUgc2VjdGlvbiBpc24ndCBhbGxvY2F0ZWQgeWV0LCB0aGlzIGlzIHdoZXJlIHdlIHdpbGwgYmUgcHV0dGluZwotICAgICBpdC4gICovCi0KLSAgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJCUJTRl9HTE9CQUwsIAotCQkJCXMsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKyAxLAotCQkJCU5VTEwsIHRydWUsIGZhbHNlLCAKLQkJCQkoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICYgbXloKTsKLSAgCi0gIGZyZWUgKHRtcF9uYW1lKTsKLSAgCi0gIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKz0gQVJNMlRIVU1CX0dMVUVfU0laRTsKLQotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgIGluZm87Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICogICAgICAgICAgICAgICAgczsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogICAgICBteWg7Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiAgZ2xvYmFsczsKLQotICAKLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0gICAgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FKSArIDEpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0KLSAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAKLSAgaWYgKG15aCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHRtcF9uYW1lKTsKLSAgICAgIHJldHVybjsgLyogd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZ3V5ICovCi0gICAgfQotCi0gIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCQlCU0ZfR0xPQkFMLCBzLCBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUgKyAxLAotCQkJCU5VTEwsIHRydWUsIGZhbHNlLCAKLQkJCQkoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICYgbXloKTsKLSAgCi0gIC8qIElmIHdlIG1hcmsgaXQgJ3RodW1iJywgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGRvIGEgYmV0dGVyIGpvYi4gICovCi0gIG15aC0+Y2xhc3MgPSBDX1RIVU1CRVhURlVOQzsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgLyogQWxsb2NhdGUgYW5vdGhlciBzeW1ib2wgdG8gbWFyayB3aGVyZSB3ZSBzd2l0Y2ggdG8gYXJtIG1vZGUuICAqLwotICAgICAgCi0jZGVmaW5lIENIQU5HRV9UT19BUk0gIl9fJXNfY2hhbmdlX3RvX2FybSIKLSNkZWZpbmUgQkFDS19GUk9NX0FSTSAiX18lc19iYWNrX2Zyb21fYXJtIgotICAKLSAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChDSEFOR0VfVE9fQVJNKSArIDEpOwotICAKLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotICAKLSAgc3ByaW50ZiAodG1wX25hbWUsIGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPyBCQUNLX0ZST01fQVJNIDogQ0hBTkdFX1RPX0FSTSwgbmFtZSk7Ci0KLSAgbXloID0gTlVMTDsKLSAgCi0gIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCQlCU0ZfTE9DQUwsIHMsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZQotCQkJCSsgKGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPyA4IDogNCksCi0JCQkJTlVMTCwgdHJ1ZSwgZmFsc2UsIAotCQkJCShzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJiBteWgpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsgIAotICAKLSAgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplICs9IFRIVU1CMkFSTV9HTFVFX1NJWkU7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiBTZWxlY3QgYSBCRkQgdG8gYmUgdXNlZCB0byBob2xkIHRoZSBzZWN0aW9ucyB1c2VkIGJ5IHRoZSBnbHVlIGNvZGUuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0cyBpbiBsZC9lbXVsdGVtcGwvCi0gICB7YXJtY29mZi9wZX0uZW0gICovCi0KLWJvb2xlYW4KLWJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChhYmZkLCBpbmZvKQotICAgICBiZmQgKiAJCSAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotICBmbGFnd29yZCAgIAkJCSAgICBmbGFnczsKLSAgYXNlY3Rpb24gKiAJCQkgICAgc2VjOwotICAgIAotICAvKiBJZiB3ZSBhcmUgb25seSBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rIGRvIG5vdCBib3RoZXIKLSAgICAgZ2V0dGluZyBhIGJmZCB0byBob2xkIHRoZSBnbHVlLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLSAgCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0KLSAgaWYgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0gIAotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLSAgCi0gIGlmIChzZWMgPT0gTlVMTCkgCi0gICAgewotICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0NPREUgfCBTRUNfUkVBRE9OTFk7Ci0gICAgICAKLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0gICAgICAKLSAgICAgIGlmIChzZWMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBpZiAoc2VjID09IE5VTEwpIAotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZOwotICAgICAgCi0gICAgICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotICAgICAgCi0gICAgICBpZiAoc2VjID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIAotICAvKiBTYXZlIHRoZSBiZmQgZm9yIGxhdGVyIHVzZS4gICovCi0gIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyID0gYWJmZDsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1iZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGFiZmQsIGluZm8sIHN1cHBvcnRfb2xkX2NvZGUpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogIGluZm87Ci0gICAgIGludAkJICAgICBzdXBwb3J0X29sZF9jb2RlOwotewotICBhc2VjdGlvbiAqIHNlYzsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgLyogSWYgd2UgYXJlIG9ubHkgcGVyZm9ybWluZyBhIHBhcnRpYWwgbGluayBkbyBub3QgYm90aGVyCi0gICAgIHRvIGNvbnN0cnVjdCBhbnkgZ2x1ZS4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIAotICAvKiBIZXJlIHdlIGhhdmUgYSBiZmQgdGhhdCBpcyB0byBiZSBpbmNsdWRlZCBvbiB0aGUgbGluay4gIFdlIGhhdmUgYSBob29rCi0gICAgIHRvIGRvIHJlbG9jIHJ1bW1hZ2luZywgYmVmb3JlIHNlY3Rpb24gc2l6ZXMgYXJlIG5haWxlZCBkb3duLiAgKi8KLQotICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpOwotCi0gIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLSAgCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPSBzdXBwb3J0X29sZF9jb2RlOwotICAKLSAgLyogUnVtbWFnZSBhcm91bmQgYWxsIHRoZSByZWxvY3MgYW5kIG1hcCB0aGUgZ2x1ZSB2ZWN0b3JzLiAgKi8KLSAgc2VjID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAoOyBzZWMgIT0gTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIGk7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0KLSAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApIAotCWNvbnRpbnVlOwotCi0gICAgICAvKiBMb2FkIHRoZSByZWxvY3MuICAqLwotICAgICAgLyogRklYTUU6IHRoZXJlIG1heSBiZSBhIHN0b3JhZ2UgbGVhayBoZXJlLiAqLwotICAgICAgCi0gICAgICBpID0gX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBzZWMsIDEsIDAsIDAsIDApOwotICAgIAotICAgICAgQkZEX0FTU0VSVCAoaSAhPSAwKTsKLQotICAgICAgZm9yIChyZWwgPSBpOyByZWwgPCBpICsgc2VjLT5yZWxvY19jb3VudDsgKytyZWwpIAotCXsKLQkgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICByX3R5cGUgID0gcmVsLT5yX3R5cGU7Ci0JICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbmR4OwotCSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogIGg7Ci0KLQkgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLQkgIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIG5vdCBhZ2FpbnN0IGEgc3ltYm9sIGl0IGNhbm5vdCBjb25jZXJuIHVzLiAqLwotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgY29udGludWU7Ci0KLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKVtzeW1uZHhdOwotCi0JICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBhZ2FpbnN0IGEgc3RhdGljIHN5bWJvbCBpdCBtdXN0IGJlIHdpdGhpbgotCSAgICAgdGhlIGN1cnJlbnQgc2VjdGlvbiBhbmQgc28gY2Fubm90IGJlIGEgY3Jvc3MgQVJNL1RodW1iIHJlbG9jYXRpb24uICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIHN3aXRjaCAocl90eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgQVJNXzI2OgotCSAgICAgIC8qIFRoaXMgb25lIGlzIGEgY2FsbCBmcm9tIGFybSBjb2RlLiAgV2UgbmVlZCB0byBsb29rIHVwCi0JCSB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsLiBJZiBpdCBpcyBhIHRodW1iIHRhcmdldCwgd2UKLQkJIGluc2VydCBnbHVlLiAgKi8KLQkgICAgICAKLQkgICAgICBpZiAoaC0+Y2xhc3MgPT0gQ19USFVNQkVYVEZVTkMpCi0JCXJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZSAoaW5mbywgaCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgQVJNX1RIVU1CMjM6Ci0JICAgICAgLyogVGhpcyBvbmUgaXMgYSBjYWxsIGZyb20gdGh1bWIgY29kZS4gIFdlIHVzZWQgdG8gbG9vawotCQkgZm9yIEFSTV9USFVNQjkgYW5kIEFSTV9USFVNQjEyIGFzIHdlbGwuICBXZSBuZWVkIHRvIGxvb2sKLQkJIHVwIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwuIElmIGl0IGlzIGFuIGFybSB0YXJnZXQsIHdlCi0JCSBpbnNlcnQgZ2x1ZS4gIElmIHRoZSBzeW1ib2wgZG9lcyBub3QgZXhpc3QgaXQgd2lsbCBiZQotCQkgZ2l2ZW4gYSBjbGFzcyBvZiBDX0VYVCBhbmQgc28gd2Ugd2lsbCBnZW5lcmF0ZSBhIHN0dWIKLQkJIGZvciBpdC4gIFRoaXMgaXMgbm90IHJlYWxseSBhIHByb2JsZW0sIHNpbmNlIHRoZSBsaW5rCi0JCSBpcyBkb29tZWQgYW55d2F5LiAgKi8KLQotCSAgICAgIHN3aXRjaCAoaC0+Y2xhc3MpCi0JCXsKLQkJY2FzZSBDX0VYVDoKLQkJY2FzZSBDX1NUQVQ6Ci0JCWNhc2UgQ19MQUJFTDoKLQkJICByZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGluZm8sIGgpOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoQ09GRl9JTUFHRV9XSVRIX1BFKSAqLwotCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIAkJY29mZl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIAkJCWNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAJCWNvZmZfYXJtX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgY29mZl9hZGp1c3Rfc3ltbmR4CQkJY29mZl9hcm1fYWRqdXN0X3N5bW5keAotI2RlZmluZSBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biAJCWNvZmZfYXJtX2xpbmtfb3V0cHV0X2hhc19iZWd1bgotI2RlZmluZSBjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAkJY29mZl9hcm1fZmluYWxfbGlua19wb3N0c2NyaXB0Ci0jZGVmaW5lIGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEJCWNvZmZfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQkJY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyAgICAgICAgICAgICAgX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgICAgICAgICAgY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUJCWNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotCi0vKiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIHdhbnQgdG8gY29udmVydCBBUk0yNiByZWxvY3MKLSAgIGludG8gQVJNMjZEIHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9hZGp1c3Rfc3ltbmR4IChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIGlyZWwsIGFkanVzdGVkcCkKLSAgICAgYmZkICpvYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICBib29sZWFuICphZGp1c3RlZHA7Ci17Ci0gIGlmIChpcmVsLT5yX3R5cGUgPT0gMykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpYmZkKVtpcmVsLT5yX3N5bW5keF07Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IHNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JaXJlbC0+cl90eXBlID0gNzsKLSAgICB9Ci0gICphZGp1c3RlZHAgPSBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIG1lcmdpbmcgdGhlIHByaXZhdGUgZGF0YSBhcmVhcyBvZiB0d28gQkZEcy4KLSAgIFRoaXMgaXMgaW1wb3J0YW50IGFzIGl0IGFsbG93cyB1cyB0byBkZXRlY3QgaWYgd2UgYXJlCi0gICBhdHRlbXB0aW5nIHRvIG1lcmdlIGJpbmFyaWVzIGNvbXBpbGVkIGZvciBkaWZmZXJlbnQgQVJNCi0gICB0YXJnZXRzLCBlZyBkaWZmZXJlbnQgQ1BVcyBvciBkaWZmZXJlbnRzIEFQQ1Mncy4gICAgICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiAgIGliZmQ7Ci0gICAgIGJmZCAqICAgb2JmZDsKLXsKLSAgQkZEX0FTU0VSVCAoaWJmZCAhPSBOVUxMICYmIG9iZmQgIT0gTlVMTCk7Ci0KLSAgaWYgKGliZmQgPT0gb2JmZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGUgdHdvIGZvcm1hdHMgYXJlIGRpZmZlcmVudCB3ZSBjYW5ub3QgbWVyZ2UgYW55dGhpbmcuCi0gICAgIFRoaXMgaXMgbm90IGFuIGVycm9yLCBzaW5jZSBpdCBpcyBwZXJtaXNzYWJsZSB0byBjaGFuZ2UgdGhlCi0gICAgIGlucHV0IGFuZCBvdXRwdXQgZm9ybWF0cy4gICovCi0gIGlmICggICBpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFZlcmlmeSB0aGF0IHRoZSBBUENTIGlzIHRoZSBzYW1lIGZvciB0aGUgdHdvIEJGRHMgKi8KLSAgaWYgKEFQQ1NfU0VUIChpYmZkKSkKLSAgICB7Ci0gICAgICBpZiAoQVBDU19TRVQgKG9iZmQpKQotCXsKLQkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgQVBDUyBmbGFnIGJpdHMgc2V0LCBmYWlsLiAgKi8KLQkgIGlmIChBUENTXzI2X0ZMQUcgKG9iZmQpICE9IEFQQ1NfMjZfRkxBRyAoaWJmZCkpCi0JICAgIHsKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCShfKCIlczogRVJST1I6IGNvbXBpbGVkIGZvciBBUENTLSVkIHdoZXJlYXMgdGFyZ2V0ICVzIHVzZXMgQVBDUy0lZCIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksIEFQQ1NfMjZfRkxBRyAoaWJmZCkgPyAyNiA6IDMyLAotCQkgYmZkX2dldF9maWxlbmFtZSAob2JmZCksIEFQQ1NfMjZfRkxBRyAob2JmZCkgPyAyNiA6IDMyCi0JCSApOwotCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAKLQkgIGlmIChBUENTX0ZMT0FUX0ZMQUcgKG9iZmQpICE9IEFQQ1NfRkxPQVRfRkxBRyAoaWJmZCkpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICptc2c7Ci0KLQkgICAgICBpZiAoQVBDU19GTE9BVF9GTEFHIChpYmZkKSkKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIiVzOiBFUlJPUjogcGFzc2VzIGZsb2F0cyBpbiBmbG9hdCByZWdpc3RlcnMgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBpbnRlZ2VyIHJlZ2lzdGVycyIpOwotCSAgICAgIGVsc2UKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIiVzOiBFUlJPUjogcGFzc2VzIGZsb2F0cyBpbiBpbnRlZ2VyIHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGZsb2F0IHJlZ2lzdGVycyIpOwotCSAgICAgIAotCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlciAobXNnLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgCi0JICBpZiAoUElDX0ZMQUcgKG9iZmQpICE9IFBJQ19GTEFHIChpYmZkKSkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKiBtc2c7Ci0KLQkgICAgICBpZiAoUElDX0ZMQUcgKGliZmQpKQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiJXM6IEVSUk9SOiBjb21waWxlZCBhcyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCB3aGVyZWFzIHRhcmdldCAlcyBpcyBhYnNvbHV0ZSBwb3NpdGlvbiIpOwotCSAgICAgIGVsc2UKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIiVzOiBFUlJPUjogY29tcGlsZWQgYXMgYWJzb2x1dGUgcG9zaXRpb24gY29kZSwgd2hlcmVhcyB0YXJnZXQgJXMgaXMgcG9zaXRpb24gaW5kZXBlbmRlbnQiKTsKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKG1zZywgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgU0VUX0FQQ1NfRkxBR1MgKG9iZmQsIEFQQ1NfMjZfRkxBRyAoaWJmZCkgfCBBUENTX0ZMT0FUX0ZMQUcgKGliZmQpIHwgUElDX0ZMQUcgKGliZmQpKTsKLQkgIAotCSAgLyogU2V0IHVwIHRoZSBhcmNoIGFuZCBmaWVsZHMgYXMgd2VsbCBhcyB0aGVzZSBhcmUgcHJvYmFibHkgd3JvbmcuICAqLwotCSAgYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCX0KLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhlIGludGVyd29ya2luZyBzdXBwb3J0LiAgKi8KLSAgaWYgKElOVEVSV09SS19TRVQgKGliZmQpKQotICAgIHsKLSAgICAgIGlmIChJTlRFUldPUktfU0VUIChvYmZkKSkKLQl7Ci0JICAvKiBJZiB0aGUgc3JjIGFuZCBkZXN0IGRpZmZlciBpbiB0aGVpciBpbnRlcndvcmtpbmcgaXNzdWUgYSB3YXJuaW5nLiAgKi8KLQkgIGlmIChJTlRFUldPUktfRkxBRyAob2JmZCkgIT0gSU5URVJXT1JLX0ZMQUcgKGliZmQpKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqIG1zZzsKLQotCSAgICAgIGlmIChJTlRFUldPUktfRkxBRyAoaWJmZCkpCi0JCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCQltc2cgPSBfKCJXYXJuaW5nOiBpbnB1dCBmaWxlICVzIHN1cHBvcnRzIGludGVyd29ya2luZywgd2hlcmVhcyAlcyBkb2VzIG5vdC4iKTsKLQkgICAgICBlbHNlCi0JCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCQltc2cgPSBfKCJXYXJuaW5nOiBpbnB1dCBmaWxlICVzIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJ3b3JraW5nLCB3aGVyZWFzICVzIGRvZXMuIik7Ci0JICAgICAgCi0JICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCQkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIFNFVF9JTlRFUldPUktfRkxBRyAob2JmZCwgSU5URVJXT1JLX0ZMQUcgKGliZmQpKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIERpc3BsYXkgdGhlIGZsYWdzIGZpZWxkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBQVFIgICAgIHB0cjsKLXsKLSAgRklMRSAqIGZpbGUgPSAoRklMRSAqKSBwdHI7Ci0gIAotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOwotICAKLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXygicHJpdmF0ZSBmbGFncyA9ICV4OiIpLCBjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyk7Ci0gIAotICBpZiAoQVBDU19TRVQgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OiBBUENTIGlzIEFSTSBQcm9kZWN1cmUgQ2FsbCBTdGFuZGFyZCwgaXQgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkLiAgKi8KLSAgICAgIGZwcmludGYgKGZpbGUsICIgW0FQQ1MtJWRdIiwgQVBDU18yNl9GTEFHIChhYmZkKSA/IDI2IDogMzIpOwotCi0gICAgICBpZiAoQVBDU19GTE9BVF9GTEFHIChhYmZkKSkKLQlmcHJpbnRmIChmaWxlLCBfKCIgW2Zsb2F0cyBwYXNzZWQgaW4gZmxvYXQgcmVnaXN0ZXJzXSIpKTsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChmaWxlLCBfKCIgW2Zsb2F0cyBwYXNzZWQgaW4gaW50ZWdlciByZWdpc3RlcnNdIikpOwotCi0gICAgICBpZiAoUElDX0ZMQUcgKGFiZmQpKQotCWZwcmludGYgKGZpbGUsIF8oIiBbcG9zaXRpb24gaW5kZXBlbmRlbnRdIikpOwotICAgICAgZWxzZQotCWZwcmludGYgKGZpbGUsIF8oIiBbYWJzb2x1dGUgcG9zaXRpb25dIikpOwotICAgIH0KLSAgCi0gIGlmICghIElOVEVSV09SS19TRVQgKGFiZmQpKQotICAgIGZwcmludGYgKGZpbGUsIF8oIiBbaW50ZXJ3b3JraW5nIGZsYWcgbm90IGluaXRpYWxpc2VkXSIpKTsKLSAgZWxzZSBpZiAoSU5URVJXT1JLX0ZMQUcgKGFiZmQpKQotICAgIGZwcmludGYgKGZpbGUsIF8oIiBbaW50ZXJ3b3JraW5nIHN1cHBvcnRlZF0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfKCIgW2ludGVyd29ya2luZyBub3Qgc3VwcG9ydGVkXSIpKTsKLSAgCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENvcGllcyB0aGUgZ2l2ZW4gZmxhZ3MgaW50byB0aGUgY29mZl90ZGF0YS5mbGFncyBmaWVsZC4KLSAgIFR5cGljYWxseSB0aGVzZSBmbGFncyBjb21lIGZyb20gdGhlIGZfZmxhZ3NbXSBmaWVsZCBvZgotICAgdGhlIENPRkYgZmlsZWhkciBzdHJ1Y3R1cmUsIHdoaWNoIGNvbnRhaW5zIGltcG9ydGFudCwKLSAgIHRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KLSAgIE5vdGU6IEFsdGhvdWdoIHRoaXMgZnVuY3Rpb24gaXMgc3RhdGljLCBpdCBpcyBleHBsaWNpdGx5Ci0gICBjYWxsZWQgZnJvbSBib3RoIGNvZmZjb2RlLmggYW5kIHBlaWNvZGUuaC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1fYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLQliZmQgKgkgICBhYmZkOwotCWZsYWd3b3JkICAgZmxhZ3M7Ci17Ci0gIGZsYWd3b3JkIGZsYWc7Ci0KLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMKTsKLQotICBmbGFnID0gKGZsYWdzICYgRl9BUENTMjYpID8gRl9BUENTXzI2IDogMDsKLSAgCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBBUENTIGZpZWxkIGhhcyBub3QgYmVlbiBpbml0aWFsaXNlZCB0byB0aGUgb3Bwb3NpdGUKLSAgICAgdmFsdWUuICAqLwotICBpZiAoQVBDU19TRVQgKGFiZmQpCi0gICAgICAmJiAoICAgKEFQQ1NfMjZfRkxBRyAgICAoYWJmZCkgIT0gZmxhZykKLQkgIHx8IChBUENTX0ZMT0FUX0ZMQUcgKGFiZmQpICE9IChmbGFncyAmIEZfQVBDU19GTE9BVCkpCi0JICB8fCAoUElDX0ZMQUcgICAgICAgIChhYmZkKSAhPSAoZmxhZ3MgJiBGX1BJQykpCi0JICApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmbGFnIHw9IChmbGFncyAmIChGX0FQQ1NfRkxPQVQgfCBGX1BJQykpOwotICAKLSAgU0VUX0FQQ1NfRkxBR1MgKGFiZmQsIGZsYWcpOwotCi0gIGZsYWcgPSAoZmxhZ3MgJiBGX0lOVEVSV09SSyk7Ci0gIAotICAvKiBJZiB0aGUgQkZEIGhhcyBhbHJlYWR5IGhhZCBpdHMgaW50ZXJ3b3JraW5nIGZsYWcgc2V0LCBidXQgaXQKLSAgICAgaXMgZGlmZmVyZW50IGZyb20gdGhlIHZhbHVlIHRoYXQgd2UgaGF2ZSBiZWVuIGFza2VkIHRvIHNldCwKLSAgICAgdGhlbiBhc3N1bWUgdGhhdCB0aGF0IG1lcmdlZCBjb2RlIHdpbGwgbm90IHN1cHBvcnQgaW50ZXJ3b3JraW5nCi0gICAgIGFuZCBzZXQgdGhlIGZsYWcgYWNjb3JkaW5nbHkuICAqLwotICBpZiAoSU5URVJXT1JLX1NFVCAoYWJmZCkgJiYgKElOVEVSV09SS19GTEFHIChhYmZkKSAhPSBmbGFnKSkKLSAgICB7Ci0gICAgICBpZiAoZmxhZykKLQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQlfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIldhcm5pbmc6IE5vdCBzZXR0aW5nIGludGVyd29ya2luZyBmbGFnIG9mICVzLCBzaW5jZSBpdCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCBhcyBub24taW50ZXJ3b3JraW5nIiksCi0JCQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgZWxzZQotCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCV9iZmRfZXJyb3JfaGFuZGxlciAoXygiV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29ya2luZyBmbGFnIG9mICVzIGR1ZSB0byBvdXRzaWRlIHJlcXVlc3QiKSwKLQkJCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBmbGFnID0gMDsKLSAgICB9Ci0KLSAgU0VUX0lOVEVSV09SS19GTEFHIChhYmZkLCBmbGFnKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBDb3B5IHRoZSBpbXBvcnRhbnQgcGFydHMgb2YgdGhlIHRhcmdldCBzcGVjaWZpYyBkYXRhCi0gICBmcm9tIG9uZSBpbnN0YW5jZSBvZiBhIEJGRCB0byBhbm90aGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoc3JjLCBkZXN0KQotICAgICBiZmQgKiAgc3JjOwotICAgICBiZmQgKiAgZGVzdDsKLXsKLSAgQkZEX0FTU0VSVCAoc3JjICE9IE5VTEwgJiYgZGVzdCAhPSBOVUxMKTsKLSAKLSAgaWYgKHNyYyA9PSBkZXN0KQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBub3QgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBzb3VyY2UsIGRvIG5vdCBkbwotICAgICB0aGUgY29weS4gICovCi0gIGlmIChzcmMtPnh2ZWMgIT0gZGVzdC0+eHZlYykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBjb3B5IHRoZSBmbGFncyBmaWVsZCAqLwotICBpZiAoQVBDU19TRVQgKHNyYykpCi0gICAgewotICAgICAgaWYgKEFQQ1NfU0VUIChkZXN0KSkKLQl7Ci0JICAvKiBJZiB0aGUgc3JjIGFuZCBkZXN0IGhhdmUgZGlmZmVyZW50IEFQQ1MgZmxhZyBiaXRzIHNldCwgZmFpbC4gICovCi0JICBpZiAoQVBDU18yNl9GTEFHIChkZXN0KSAhPSBBUENTXzI2X0ZMQUcgKHNyYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIAotCSAgaWYgKEFQQ1NfRkxPQVRfRkxBRyAoZGVzdCkgIT0gQVBDU19GTE9BVF9GTEFHIChzcmMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAKLQkgIGlmIChQSUNfRkxBRyAoZGVzdCkgIT0gUElDX0ZMQUcgKHNyYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JU0VUX0FQQ1NfRkxBR1MgKGRlc3QsIEFQQ1NfMjZfRkxBRyAoc3JjKSB8IEFQQ1NfRkxPQVRfRkxBRyAoc3JjKQotCQkJfCBQSUNfRkxBRyAoc3JjKSk7Ci0gICAgfQotCi0gIGlmIChJTlRFUldPUktfU0VUIChzcmMpKQotICAgIHsKLSAgICAgIGlmIChJTlRFUldPUktfU0VUIChkZXN0KSkKLQl7Ci0JICAvKiBJZiB0aGUgc3JjIGFuZCBkZXN0IGhhdmUgZGlmZmVyZW50IGludGVyd29ya2luZyBmbGFncyB0aGVuIHR1cm4KLQkgICAgIG9mZiB0aGUgaW50ZXJ3b3JraW5nIGJpdC4gICovCi0JICBpZiAoSU5URVJXT1JLX0ZMQUcgKGRlc3QpICE9IElOVEVSV09SS19GTEFHIChzcmMpKQotCSAgICB7Ci0JICAgICAgaWYgKElOVEVSV09SS19GTEFHIChkZXN0KSkKLQkJewotCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgX2JmZF9lcnJvcl9oYW5kbGVyICgoIldhcm5pbmc6IENsZWFyaW5nIHRoZSBpbnRlcndvcmtpbmcgYml0IG9mICVzLCBiZWNhdXNlIHRoZSBub24taW50ZXJ3b3JraW5nIGNvZGUgaW4gJXMgaGFzIGJlZW4gY29waWVkIGludG8gaXQiKSwKLQkJCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChkZXN0KSwKLQkJCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChzcmMpKTsKLQkJfQotCSAgICAgIAotCSAgICAgIFNFVF9JTlRFUldPUktfRkxBRyAoZGVzdCwgMCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgU0VUX0lOVEVSV09SS19GTEFHIChkZXN0LCBJTlRFUldPUktfRkxBRyAoc3JjKSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTm90ZTogIHRoZSBkZWZpbml0aW9ucyBoZXJlIG9mIExPQ0FMX0xBQkVMX1BSRUZJWCBhbmQgVVNFUl9MQUJFTF9QUkVJRlgKLSAqbXVzdCogbWF0Y2ggdGhlIGRlZmluaXRpb25zIGluIGdjYy9jb25maWcvYXJtL2NvZmYuaCBhbmQgc2VtaS5oICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMX1BSRUZJWCAiLiIKLSNpZm5kZWYgVVNFUl9MQUJFTF9QUkVGSVgKLSNkZWZpbmUgVVNFUl9MQUJFTF9QUkVGSVggIl8iCi0jZW5kaWYKLQotLyogTGlrZSBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSwgYnV0Ci0gICBhKSB0ZXN0IGFnYWluc3QgVVNFUl9MQUJFTF9QUkVGSVgsIHRvIGF2b2lkIHN0cmlwcGluZyBsYWJlbHMga25vd24gdG8gYmUKLSAgICAgIG5vbi1sb2NhbC4KLSAgIGIpIEFsbG93IG90aGVyIHByZWZpeGVzIHRoYW4gIi4iLCBlLmcuIGFuIGVtcHR5IHByZWZpeCB3b3VsZCBjYXVzZSBhbGwKLSAgICAgIGxhYmVscyBvZiB0aGUgZm9ybSBMeHh4IHRvIGJlIHN0cmlwcGVkLiAgKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKiAgICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICogbmFtZTsKLXsKLSNpZmRlZiBVU0VSX0xBQkVMX1BSRUZJWAotICBpZiAoVVNFUl9MQUJFTF9QUkVGSVhbMF0gIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgVVNFUl9MQUJFTF9QUkVGSVgsIHN0cmxlbiAoVVNFUl9MQUJFTF9QUkVGSVgpKSA9PSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIExPQ0FMX0xBQkVMX1BSRUZJWAotICAvKiBJZiB0aGVyZSBpcyBhIHByZWZpeCBmb3IgbG9jYWwgbGFiZWxzIHRoZW4gbG9vayBmb3IgdGhpcy4KLSAgICAgSWYgdGhlIHByZWZpeCBleGlzdHMsIGJ1dCBpdCBpcyBlbXB0eSwgdGhlbiBpZ25vcmUgdGhlIHRlc3QuICovCi0gIAotICBpZiAoTE9DQUxfTEFCRUxfUFJFRklYWzBdICE9IDApCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoTE9DQUxfTEFCRUxfUFJFRklYKTsKLSAgICAgIAotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsIExPQ0FMX0xBQkVMX1BSRUZJWCwgbGVuKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgLyogUGVyZm9ybSB0aGUgY2hlY2tzIGJlbG93IGZvciB0aGUgcmVzdCBvZiB0aGUgbmFtZS4gICovCi0gICAgICBuYW1lICs9IGxlbjsKLSAgICB9Ci0jZW5kaWYKLSAgCi0gIHJldHVybiBuYW1lWzBdID09ICdMJzsKLX0KLQotLyogVGhpcyBwaWVjZSBvZiBtYWNoaW5lcnkgZXhpc3RzIG9ubHkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGJmZCB0aGF0IGhvbGRzCi0gICB0aGUgZ2x1ZSBzZWN0aW9uIGlzIHdyaXR0ZW4gbGFzdC4gCi0KLSAgIFRoaXMgZG9lcyBkZXBlbmQgb24gYmZkX21ha2Vfc2VjdGlvbiBhdHRhY2hpbmcgYSBuZXcgc2VjdGlvbiB0byB0aGUKLSAgIGVuZCBvZiB0aGUgc2VjdGlvbiBsaXN0IGZvciB0aGUgYmZkLiAKLQotICAga3JrQGN5Z251cy5jb20gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9saW5rX291dHB1dF9oYXNfYmVndW4gKHN1YiwgaW5mbykKLSAgICAgYmZkICogc3ViOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBpbmZvOwotewotICByZXR1cm4gKHN1Yi0+b3V0cHV0X2hhc19iZWd1bgotCSAgfHwgc3ViID09IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8tPmluZm8pLT5iZmRfb2ZfZ2x1ZV9vd25lcik7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQgKGFiZmQsIHBmaW5mbykKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm87Ci17Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChwZmluZm8tPmluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgCi0gIGlmIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCAocGZpbmZvLCBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lcikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lci0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgfQotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiAwCi0jZGVmaW5lIGNvZmZfU1dBUF9zeW1faW4gIGFybV9iZmRfY29mZl9zd2FwX3N5bV9pbgotCi1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfc3ltX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotCi0vKiBTZXBjaWFsIHZlcnNpb24gb2Ygc3ltYm9sIHN3YXBwZXIsIHVzZWQgdG8gZ3JhYiBhIGJmZAotICAgb250byB3aGljaCB0aGUgZ2x1ZSBzZWN0aW9ucyBjYW4gYmUgYXR0YWNoZWQuICAqLwotc3RhdGljIHZvaWQKLWFybV9iZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgKiBhYmZkOwotICAgICBQVFIgICBleHQxOwotICAgICBQVFIgICBpbjE7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqIHM7Ci0KLSAgLyogRG8gdGhlIG5vcm1hbCBzd2FwIGluLiAgKi8KLSAgY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgZXh0MSwgaW4xKTsKLQotICBpZiAoYmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCkgLyogd2UgYWxyZWFkeSBoYXZlIGEgdG9jLCBzbyBnbyBob21lICovCi0gICAgcmV0dXJuOwotCi0gIC8qIFNhdmUgdGhlIGJmZCBmb3IgbGF0ZXIgYWxsb2NhdGlvbi4gICovCi0gIGJmZF9vZl9nbHVlX293bmVyID0gYWJmZDsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGJmZF9vZl9nbHVlX293bmVyICwgCi0JCQkgICAgICAgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBpZiAocyA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgOwotICAgICAgCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYmZkX29mX2dsdWVfb3duZXIsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGJmZF9vZl9nbHVlX293bmVyLCBzLCBmbGFncykKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChiZmRfb2ZfZ2x1ZV9vd25lciwgcywgMikpCi0JewotCSAgLyogRklYTUU6IHNldCBhcHByb3ByaWF0ZSBiZmQgZXJyb3IgKi8KLQkgIGFib3J0KCk7Ci0JfQotICAgIH0KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIGlmIChzID09IE5VTEwpIAotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSA7Ci0gICAgICAKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChiZmRfb2ZfZ2x1ZV9vd25lciwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLSAgICAgIAotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYmZkX29mX2dsdWVfb3duZXIsIHMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGJmZF9vZl9nbHVlX293bmVyLCBzLCAyKSkKLQl7Ci0JICAvKiBGSVhNRTogc2V0IGFwcHJvcHJpYXRlIGJmZCBlcnJvciBrcmtAY3lnbnVzLmNvbSAqLwotCSAgYWJvcnQoKTsKLQl9Ci0gICAgfQotICAKLSAgcmV0dXJuOwotfQotI2VuZGlmCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0jaWZuZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNIGFybWNvZmZfbGl0dGxlX3ZlYwotI2VuZGlmCi0jaWZuZGVmIFRBUkdFVF9MSVRUTEVfTkFNRQotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgImNvZmYtYXJtLWxpdHRsZSIKLSNlbmRpZgotI2lmbmRlZiBUQVJHRVRfQklHX1NZTQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSBhcm1jb2ZmX2JpZ192ZWMKLSNlbmRpZgotI2lmbmRlZiBUQVJHRVRfQklHX05BTUUKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICJjb2ZmLWFybS1iaWciCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAwCi0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotI2RlZmluZSBFWFRSQV9TX0ZMQUdTIChTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUykKLSNlbHNlCi0jZGVmaW5lIEVYVFJBX1NfRkxBR1MgMAotI2VuZGlmCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHVzZSBpbml0aWFsaXNpbmcgYWx0ZXJuYXRpdmVfdGFyZ2V0IGZpZWxkLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9CSUdfU1lNIDsKLQotLyogVGFyZ2V0IHZlY3RvcnMuICAqLwotQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfTElUVExFX05BTUUsIERfUEFHRUQsIEVYVFJBX1NfRkxBR1MsIFRBUkdFVF9VTkRFUlNDT1JFLCAmIFRBUkdFVF9CSUdfU1lNKQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfQklHX05BTUUsIERfUEFHRUQsIEVYVFJBX1NfRkxBR1MsIFRBUkdFVF9VTkRFUlNDT1JFLCAmIFRBUkdFVF9MSVRUTEVfU1lNKQotCmRpZmYgLS1naXQgYS9iZmQvY29mZi1hdXguYyBiL2JmZC9jb2ZmLWF1eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTY2MzkyLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWF1eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQXBwbGUgTTY4SyBDT0ZGIEEvVVggMy54IGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQltNjhrYXV4X2NvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLW02OGstYXV4IgotCi0jaWZuZGVmIFRBUkdfQVVYCi0jZGVmaW5lIFRBUkdfQVVYCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0KLS8qIDRrIHBhZ2VzICovCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotCi0vKiBPbiBBVVgsIGEgU1RZUF9OT0xPQUR8U1RZUF9CU1Mgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgc2hhcmVkIGxpYnJhcnkuICovCi0jZGVmaW5lIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLQotI2RlZmluZSBTVEFUSUNfUkVMT0NTCi0KLSNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotc3RhdGljIGJvb2xlYW4gY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCAKLSAgICAgICAgICAgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLCAKLSAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLQotI2RlZmluZSBjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sCi0KLSNpbmNsdWRlICJjb2ZmL2F1eC1jb2ZmLmgiICAvKiBvdmVycmlkZSBjb2ZmL2ludGVybmFsLmggYW5kIGNvZmYvbTY4ay5oICovCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCi0KLS8qIFdlIG5lZWQgbm9uLWFic29sdXRlIHN5bWJvbHMgdG8gb3ZlcnJpZGUgYWJzb2x1dGUgc3ltYm9scy4gIFRoaXMKLSAgIG1pcnJvcnMgQXBwbGUncyAic29sdXRpb24iIHRvIGxldCBhIHN0YXRpYyBsaWJyYXJ5IHN5bWJvbCBvdmVycmlkZQotICAgYSBzaGFyZWQgbGlicmFyeSBzeW1ib2wuICBPbiB0aGUgd2hvbGUgbm90IGEgZ29vZCB0aGluZywgZ2l2ZW4gaG93Ci0gICBzaGFyZWQgbGlicmFyaWVzIHdvcmsgaGVyZSwgYnV0IGNhbiB3b3JrIGlmIHlvdSBhcmUgY2FyZWZ1bCB3aXRoCi0gICB3aGF0IHlvdSBpbmNsdWRlIGluIHRoZSBzaGFyZWQgb2JqZWN0LiAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCi0JCQkJICAgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoKGZsYWdzICYgKEJTRl9XQVJOSU5HIHwgQlNGX0NPTlNUUlVDVE9SIHwgQlNGX1dFQUspKSA9PSAwICYmCi0gICAgICAhYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSAmJgotICAgICAgIWJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgewotICAgICAgLyogVGhlIG5ldyBzeW1ib2wgaXMgYSBkZWZpbml0aW9uIG9yIGFuIGluZGlyZWN0IGRlZmluaXRpb24gKi8KLQotICAgICAgLyogVGhpcyBiaXQgY29waWVkIGZyb20gbGlua2VyLmMgKi8KLSAgICAgIGlmIChoYXNocCAhPSBOVUxMICYmICpoYXNocCAhPSBOVUxMKQotCXsKLQkgIGggPSAqaGFzaHA7Ci0JICBCRkRfQVNTRVJUIChzdHJjbXAgKGgtPnJvb3Quc3RyaW5nLCBuYW1lKSA9PSAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCB0cnVlLCBjb3B5LCBmYWxzZSk7Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGhhc2hwICE9IE5VTEwpCi0JCSpoYXNocCA9IE5VTEw7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+bm90aWNlX2hhc2ggIT0gKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSBOVUxMCi0JICAmJiAoYmZkX2hhc2hfbG9va3VwIChpbmZvLT5ub3RpY2VfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKQotCSAgICAgICE9IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkpCi0JewotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPm5vdGljZSkgKGluZm8sIG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGhhc2hwICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgTlVMTCkKLQkqaGFzaHAgPSBoOwotICAgICAgLyogZW5kIGR1cGxpY2F0aW9uIGZyb20gbGlua2VyLmMgKi8KLQotICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0JewotCSAgYXNlY3Rpb24gKm1zZWM7Ci0KLQkgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgICAgbXNlYyA9IGgtPnUuZGVmLnNlY3Rpb247Ci0JICBlbHNlCi0JICAgIG1zZWMgPSBiZmRfaW5kX3NlY3Rpb25fcHRyOwotCi0JICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChtc2VjKSAmJiAhYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uKSkKLQkgICAgewotCSAgICAgIGgtPnUuZGVmLnNlY3Rpb24gPSBzZWN0aW9uOwotCSAgICAgIGgtPnUuZGVmLnZhbHVlID0gdmFsdWU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikgJiYgIWJmZF9pc19hYnNfc2VjdGlvbiAobXNlYykpCi0JICAgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZGlkbid0IGV4aXQgZWFybHksIGZpbmlzaCBwcm9jZXNzaW5nIGluIHRoZSBnZW5lcmljIHJvdXRpbmUgKi8KLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKLQkJCQkJICAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKLQkJCQkJICAgaGFzaHApOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtZ28zMi5jIGIvYmZkL2NvZmYtZ28zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWI0ZTM2Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWdvMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IENPRkYgZmlsZXMgKGdvMzIgdmFyaWFudCkuCi0gICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgREogRGVsb3JpZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JCWdvMzJjb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkJImNvZmYtZ28zMiIKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUJJ18nCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0jZGVmaW5lIENPRkZfU1VQUE9SVF9HTlVfTElOS09OQ0UKLQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5kYXRhIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCA0IH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIudGV4dCIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgNCB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX1BBUlRJQUxfTUFUQ0ggKCIuZ251LmxpbmtvbmNlLmQiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDQgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLmdudS5saW5rb25jZS50IiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCA0IH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfUEFSVElBTF9NQVRDSCAoIi5nbnUubGlua29uY2UuciIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgNCB9Ci0KLSNpbmNsdWRlICJjb2ZmLWkzODYuYyIKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWg4MzAwLmMgYi9iZmQvY29mZi1oODMwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzExMjVjLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWg4MzAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQ5ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSGl0YWNoaSBIOC8zMDAgQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgPHNhY0BjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdlbmxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL2g4MzAwLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDEpCi0KLS8qIFdlIGRlcml2ZSBhIGhhc2ggdGFibGUgZnJvbSB0aGUgYmFzaWMgQkZEIGhhc2ggdGFibGUgdG8KLSAgIGhvbGQgZW50cmllcyBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yLiAgQXNpZGUgZnJvbSB0aGUgCi0gICBpbmZvIHN0b3JlZCBieSB0aGUgYmFzaWMgaGFzaCB0YWJsZSwgd2UgbmVlZCB0aGUgb2Zmc2V0Ci0gICBvZiBhIHBhcnRpY3VsYXIgZW50cnkgd2l0aGluIHRoZSBoYXNoIHRhYmxlIGFzIHdlbGwgYXMKLSAgIHRoZSBvZmZzZXQgd2hlcmUgd2UnbGwgYWRkIHRoZSBuZXh0IGVudHJ5LiAgKi8KLQotc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeQotewotICAvKiBUaGUgYmFzaWMgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIFRoZSBvZmZzZXQgd2l0aGluIHRoZSB2ZWN0b3JzIHNlY3Rpb24gd2hlcmUKLSAgICAgdGhpcyBlbnRyeSBsaXZlcy4gICovCi0gIGJmZF92bWEgb2Zmc2V0OwotfTsKLQotc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZQotewotICAvKiBUaGUgYmFzaWMgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotCi0gIGJmZCAqYWJmZDsKLQotICAvKiBPZmZzZXQgYXQgd2hpY2ggd2UnbGwgYWRkIHRoZSBuZXh0IGVudHJ5LiAgKi8KLSAgdW5zaWduZWQgaW50IG9mZnNldDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZnVuY3ZlY19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWZ1bmN2ZWNfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKiwgYmZkICosCi0gICAgICAgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKSkpKTsKLQotLyogVG8gbG9va3VwIGEgdmFsdWUgaW4gdGhlIGZ1bmN0aW9uIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KLSNkZWZpbmUgZnVuY3ZlY19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogVGhlIGRlcml2ZWQgaDgzMDAgQ09GRiBsaW5rZXIgdGFibGUuICBOb3RlIGl0J3MgZGVyaXZlZCBmcm9tCi0gICB0aGUgZ2VuZXJpYyBsaW5rZXIgaGFzaCB0YWJsZSwgbm90IHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyIGhhc2gKLSAgIHRhYmxlISAgV2UgdXNlIHRoaXMgdG8gYXR0YWNoIGFkZGl0aW9uYWwgZGF0YSBzdHJ1Y3R1cmVzIHdlCi0gICBuZWVkIHdoaWxlIGxpbmtpbmcgb24gdGhlIGg4MzAwLiAgKi8KLXN0cnVjdCBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgbWFpbiBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogU2VjdGlvbiBmb3IgdGhlIHZlY3RvcnMgdGFibGUuICBUaGlzIGdldHMgYXR0YWNoZWQgdG8gYQotICAgICByYW5kb20gaW5wdXQgYmZkLCB3ZSBrZWVwIGl0IGhlcmUgZm9yIGVhc3kgYWNjZXNzLiAgKi8KLSAgYXNlY3Rpb24gKnZlY3RvcnNfc2VjOwotCi0gIC8qIEhhc2ggdGFibGUgb2YgdGhlIGZ1bmN0aW9ucyB3ZSBuZWVkIHRvIGVudGVyIGludG8gdGhlIGZ1bmN0aW9uCi0gICAgIHZlY3Rvci4gICovCi0gIHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKmZ1bmN2ZWNfaGFzaF90YWJsZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEdldCB0aGUgSDgvMzAwIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGg4MzAwX2NvZmZfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlICopICgoY29mZl9oYXNoX3RhYmxlIChwKSkpKQotCi0vKiBJbml0aWFsaXplIGZpZWxkcyB3aXRoaW4gYSBmdW5jdmVjIGhhc2ggdGFibGUgZW50cnkuICBDYWxsZWQgd2hlbmV2ZXIKLSAgIGEgbmV3IGVudHJ5IGlzIGFkZGVkIHRvIHRoZSBmdW5jdmVjIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWZ1bmN2ZWNfaGFzaF9uZXdmdW5jIChlbnRyeSwgZ2VuX3RhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqZ2VuX3RhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKnJldDsKLSAgc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqdGFibGU7Ci0KLSAgcmV0ID0gKHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKikgZW50cnk7Ci0gIHRhYmxlID0gKHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKikgZ2VuX3RhYmxlOwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICopCi0gICAgICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlIChnZW5fdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqKQotICAgICAgICAgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIGdlbl90YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIE5vdGUgd2hlcmUgdGhpcyBlbnRyeSB3aWxsIHJlc2lkZSBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yIHRhYmxlLiAgKi8KLSAgcmV0LT5vZmZzZXQgPSB0YWJsZS0+b2Zmc2V0OwotCi0gIC8qIEJ1bXAgdGhlIG9mZnNldCBhdCB3aGljaCB3ZSBzdG9yZSBlbnRyaWVzIGluIHRoZSBmdW5jdGlvbgotICAgICB2ZWN0b3IuICBXZSdkIGxpa2UgdG8gYnVtcCB1cCB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9ycyBzZWN0aW9uLAotICAgICBidXQgaXQncyBub3QgZWFzaWx5IGF2YWlsYWJsZSBoZXJlLiAgKi8KLSAgaWYgKGJmZF9nZXRfbWFjaCAodGFibGUtPmFiZmQpID09IGJmZF9tYWNoX2g4MzAwKQotICAgIHRhYmxlLT5vZmZzZXQgKz0gMjsKLSAgZWxzZSBpZiAoYmZkX2dldF9tYWNoICh0YWJsZS0+YWJmZCkgPT0gYmZkX21hY2hfaDgzMDBoCi0JICAgfHwgYmZkX2dldF9tYWNoICh0YWJsZS0+YWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQotICAgIHRhYmxlLT5vZmZzZXQgKz0gNDsKLSAgZWxzZQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIEV2ZXJ5dGhpbmcgd2VudCBPSy4gICovCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogSW5pdGlhbGl6ZSB0aGUgZnVuY3Rpb24gdmVjdG9yIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZnVuY3ZlY19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKikpOwotewotICAvKiBJbml0aWFsaXplIG91ciBsb2NhbCBmaWVsZHMsIHRoZW4gY2FsbCB0aGUgZ2VuZXJpYyBpbml0aWFsaXphdGlvbgotICAgICByb3V0aW5lLiAgKi8KLSAgdGFibGUtPm9mZnNldCA9IDA7Ci0gIHRhYmxlLT5hYmZkID0gYWJmZDsKLSAgcmV0dXJuIChiZmRfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIG5ld2Z1bmMpKTsKLX0KLQotLyogQ3JlYXRlIHRoZSBkZXJpdmVkIGxpbmtlciBoYXNoIHRhYmxlLiAgV2UgdXNlIGEgZGVyaXZlZCBoYXNoIHRhYmxlCi0gICBiYXNpY2FsbHkgdG8gaG9sZCAic3RhdGljIiBpbmZvcm1hdGlvbiBkdXJpbmcgYW4gaDgvMzAwIGNvZmYgbGluawotICAgd2l0aG91dCB1c2luZyBzdGF0aWMgdmFyaWFibGVzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLSAgcmV0ID0gKChzdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUgKikKLSAgICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCFfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LnJvb3QsIGFiZmQsIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBvdXIgZGF0YS4gICovCi0gIHJldC0+dmVjdG9yc19zZWMgPSBOVUxMOwotICByZXQtPmZ1bmN2ZWNfaGFzaF90YWJsZSA9IE5VTEw7Ci0KLSAgLyogT0suICBFdmVyeXRoaW5nJ3MgaW50aWFsaXplZCwgcmV0dXJuIHRoZSBiYXNlIHBvaW50ZXIuICAqLwotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBzcGVjaWFsIGhhbmRsaW5nIGZvciBIOC8zMDAgcmVsb2NzLgotICAgV2Ugb25seSBjb21lIGhlcmUgZm9yIHBjcmVsIHN0dWZmIGFuZCByZXR1cm4gbm9ybWFsbHkgaWYgbm90IGFuIC1yIGxpbmsuCi0gICBXaGVuIGRvaW5nIC1yLCB3ZSBjYW4ndCBkbyBhbnkgYXJpdGhtZXRpYyBmb3IgdGhlIHBjcmVsIHN0dWZmLCBiZWNhdXNlCi0gICB0aGUgY29kZSBpbiByZWxvYy5jIGFzc3VtZXMgdGhhdCB3ZSBjYW4gbWFuaXB1bGF0ZSB0aGUgdGFyZ2V0cyBvZgotICAgdGhlIHBjcmVsIGJyYW5jaGVzLiAgVGhpcyBpc24ndCBzbywgc2luY2UgdGhlIEg4LzMwMCBjYW4gZG8gcmVsYXhpbmcsIAotICAgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZ2FwIGFmdGVyIHRoZSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGVub3VnaCB0bwotICAgY29udGFpbiB0aGUgb2Zmc2V0IHJlcXVpcmVkIGZvciB0aGUgYnJhbmNoLCBzbyB3ZSBoYXZlIHRvIHVzZSB0aGUgb25seQotICAgdGhlIGFkZGVuZCB1bnRpbCB0aGUgZmluYWwgbGluayAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGVjaWFsIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoUl9SRUxCWVRFLCAwLCAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICI4IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfUkVMV09SRCwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjE2IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfUkVMTE9ORywgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjMyIiwgZmFsc2UsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfUENSQllURSwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBzcGVjaWFsLCAiRElTUDgiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgdHJ1ZSksCi0gIEhPV1RPIChSX1BDUldPUkQsIDAsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJESVNQMTYiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgdHJ1ZSksCi0gIEhPV1RPIChSX1BDUkxPTkcsIDAsIDIsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJESVNQMzIiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgdHJ1ZSksCi0gIEhPV1RPIChSX01PVjE2QjEsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGFibGUgbW92LmI6MTYiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9NT1YxNkIyLCAwLCAxLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGVkIG1vdi5iOjE2IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfSk1QMSwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjE2L3BjcmVsIiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfSk1QMiwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicGNyZWNsLzE2IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfSk1QTDEsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIyNC9wY3JlbGwiLCBmYWxzZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9KTVBMMiwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicGM4LzI0IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfTU9WMjRCMSwgMCwgMSwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInJlbGF4YWJsZSBtb3YuYjoyNCIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX01PVjI0QjIsIDAsIDEsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInJlbGF4ZWQgbW92LmI6MjQiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotCi0gIC8qIEFuIGluZGlyZWN0IHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uLiAgVGhpcyBjYXVzZXMgdGhlIGZ1bmN0aW9uJ3MgYWRkcmVzcwotICAgICB0byBiZSBhZGRlZCB0byB0aGUgZnVuY3Rpb24gdmVjdG9yIGluIGxvLW1lbSBhbmQgcHV0cyB0aGUgYWRkcmVzcyBvZgotICAgICB0aGUgZnVuY3Rpb24gdmVjdG9yJ3MgZW50cnkgaW4gdGhlIGpzciBpbnN0cnVjdGlvbi4gICovCi0gIEhPV1RPIChSX01FTV9JTkRJUkVDVCwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiOC9pbmRpcmVjdCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0KLSAgLyogSW50ZXJuYWwgcmVsb2MgZm9yIHJlbGF4aW5nLiAgVGhpcyBpcyBjcmVhdGVkIHdoZW4gYSAxNmJpdCBwYy1yZWxhdGl2ZQotICAgICBicmFuY2ggaXMgdHVybmVkIGludG8gYW4gOGJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICAqLwotICBIT1dUTyAoUl9QQ1JXT1JEX0IsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicmVsYXhlZCBiQ0M6MTYiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotCi0gIEhPV1RPIChSX01PVkwxLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLHNwZWNpYWwsICIzMi8yNCByZWxheGFibGUgbW92ZSIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0KLSAgSE9XVE8gKFJfTU9WTDIsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIzMi8yNCByZWxheGVkIG1vdmUiLCBmYWxzZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotCi0gIEhPV1RPIChSX0JDQ19JTlYsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgc3BlY2lhbCwgIkRJU1A4IGludmVydGVkIiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIHRydWUpLAotCi0gIEhPV1RPIChSX0pNUF9ERUwsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgc3BlY2lhbCwgIkRlbGV0ZWQganVtcCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLX07Ci0KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgXAotICB7IHgucl90eXBlID0gc2VsZWN0X3JlbG9jKGhvd3RvKTsgfQotCi0jZGVmaW5lIEJBRE1BRyh4KSAoSDgzMDBCQURNQUcoeCkgJiYgSDgzMDBIQkFETUFHKHgpICYmIEg4MzAwU0JBRE1BRyh4KSkKLSNkZWZpbmUgSDgzMDAgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLQotc3RhdGljIGludAotc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZTsKLX0KLQotLyogQ29kZSB0byB0dXJuIGEgcl90eXBlIGludG8gYSBob3d0byBwdHIsIHVzZXMgdGhlIGFib3ZlIGhvd3RvIHRhYmxlCi0gICAqLwotCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8gKGludGVybmFsLCBkc3QpCi0gICAgIGFyZWxlbnQgKmludGVybmFsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgc3dpdGNoIChkc3QtPnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1JFTEJZVEU6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUkVMV09SRDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9SRUxMT05HOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1BDUkJZVEU6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUENSV09SRDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9QQ1JMT05HOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA1OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVjE2QjE6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WMTZCMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgNzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KTVAxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0pNUDI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSk1QTDE6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0pNUEwyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1YyNEIxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1YyNEIyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NRU1fSU5ESVJFQ1Q6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1BDUldPUkRfQjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WTDE6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVkwyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9CQ0NfSU5WOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KTVBfREVMOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxOTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICogcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLXsKLSAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7Ci0gIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKLQotICBpZiAoKChpbnQpIHJlbG9jLT5yX3N5bW5keCkgPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotCi0KLSAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7Ci0KLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLSAgLyogIHJlbGVudC0+c2VjdGlvbiA9IDA7Ki8KLX0KLQotc3RhdGljIGJvb2xlYW4KLWg4MzAwX3N5bWJvbF9hZGRyZXNzX3AgKGFiZmQsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgYXN5bWJvbCAqKnM7Ci0KLSAgcyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgQkZEX0FTU0VSVCAocyAhPSAoYXN5bWJvbCAqKikgTlVMTCk7Ci0KLSAgLyogU2VhcmNoIGFsbCB0aGUgc3ltYm9scyBmb3Igb25lIGluIElOUFVUX1NFQ1RJT04gd2l0aAotICAgICBhZGRyZXNzIEFERFJFU1MuICAqLwotICB3aGlsZSAoKnMpIAotICAgIHsKLSAgICAgIGFzeW1ib2wgKnAgPSAqczsKLSAgICAgIGlmIChwLT5zZWN0aW9uID09IGlucHV0X3NlY3Rpb24KLQkgICYmIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgKyBwLT52YWx1ZSkgPT0gYWRkcmVzcykKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIHMrKzsKLSAgICB9ICAgIAotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogSWYgUkVMT0MgcmVwcmVzZW50cyBhIHJlbGF4YWJsZSBpbnN0cnVjdGlvbi9yZWxvYywgY2hhbmdlIGl0IGludG8KLSAgIHRoZSByZWxheGVkIHJlbG9jLCBub3RpZnkgdGhlIGxpbmtlciB0aGF0IHN5bWJvbCBhZGRyZXNzZXMKLSAgIGhhdmUgY2hhbmdlZCAoYmZkX3BlcmZvcm1fc2xpcCkgYW5kIHJldHVybiBob3cgbXVjaCB0aGUgY3VycmVudAotICAgc2VjdGlvbiBoYXMgc2hydW5rIGJ5LgotCi0gICBGSVhNRTogTXVjaCBvZiB0aGlzIGNvZGUgaGFzIGtub3dsZWRnZSBvZiB0aGUgb3JkZXJpbmcgb2YgZW50cmllcwotICAgaW4gdGhlIGhvd3RvIHRhYmxlLiAgVGhpcyBuZWVkcyB0byBiZSBmaXhlZC4gICovCi0KLXN0YXRpYyBpbnQKLWg4MzAwX3JlbG9jMTZfZXN0aW1hdGUoYWJmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgdW5zaWduZWQgaW50IHNocmluazsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsgIAotICBiZmRfdm1hIGRvdDsKLSAgYmZkX3ZtYSBnYXA7Ci0gIHN0YXRpYyBhc2VjdGlvbiAqbGFzdF9pbnB1dF9zZWN0aW9uID0gTlVMTDsKLSAgc3RhdGljIGFyZWxlbnQgKmxhc3RfcmVsb2MgPSBOVUxMOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSB0aGluZyB0byBiZSByZWxvY2F0ZWQgd2lsbCBoYXZlIG1vdmVkIGJhY2sgYnkgCi0gICAgIHRoZSBzaXplIG9mIHRoZSBzaHJpbmsgLSBidXQgd2UgZG9uJ3QgY2hhbmdlIHJlbG9jLT5hZGRyZXNzIGhlcmUsCi0gICAgIHNpbmNlIHdlIG5lZWQgaXQgdG8ga25vdyB3aGVyZSB0aGUgcmVsb2NhdGlvbiBsaXZlcyBpbiB0aGUgc291cmNlCi0gICAgIHVuY29va2VkIHNlY3Rpb24uICAqLwotICBiZmRfdm1hIGFkZHJlc3MgPSByZWxvYy0+YWRkcmVzcyAtIHNocmluazsKLQotICBpZiAoaW5wdXRfc2VjdGlvbiAhPSBsYXN0X2lucHV0X3NlY3Rpb24pCi0gICAgbGFzdF9yZWxvYyA9IE5VTEw7Ci0KLSAgLyogT25seSBleGFtaW5lIHRoZSByZWxvY3Mgd2hpY2ggbWlnaHQgYmUgcmVsYXhhYmxlLiAgKi8KLSAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0gICAgeyAgICAgCi0KLSAgICAvKiBUaGlzIGlzIHRoZSAxNi8yNCBiaXQgYWJzb2x1dGUgYnJhbmNoIHdoaWNoIGNvdWxkIGJlY29tZSBhbiA4IGJpdAotICAgICAgIHBjLXJlbGF0aXZlIGJyYW5jaC4gICovCi0gICAgY2FzZSBSX0pNUDE6Ci0gICAgY2FzZSBSX0pNUEwxOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGluc3RydWN0aW9uIChub3QgdGhlIHJlbG9jKS4gICovCi0gICAgICBkb3QgPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgYWRkcmVzcyk7Ci0KLSAgICAgIC8qIEFkanVzdCBmb3IgUl9KTVAxIHZzIFJfSk1QTDEuICAqLwotICAgICAgZG90ICs9IChyZWxvYy0+aG93dG8tPnR5cGUgPT0gUl9KTVAxID8gMSA6IDIpOwotCi0gICAgICAvKiBDb21wdXRlIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgaW5zbiB0byB0aGUgYnJhbmNoIHRhcmdldC4gICovCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKLSAgCi0gICAgICAvKiBJZiB0aGUgZGlzdGFuY2UgaXMgd2l0aGluIC0xMjguLisxMjggaW5jbHVzaXZlLCB0aGVuIHdlIGNhbiByZWxheAotCSB0aGlzIGp1bXAuICArMTI4IGlzIHZhbGlkIHNpbmNlIHRoZSB0YXJnZXQgd2lsbCBtb3ZlIHR3byBieXRlcwotCSBjbG9zZXIgaWYgd2UgZG8gcmVsYXggdGhpcyBicmFuY2guICAqLwotICAgICAgaWYgKChpbnQpZ2FwID49IC0xMjggJiYgKGludClnYXAgPD0gMTI4ICkKLQl7IAotCi0JICAvKiBJdCdzIHBvc3NpYmxlIHdlIG1heSBiZSBhYmxlIHRvIGVsaW1pbmF0ZSB0aGlzIGJyYW5jaCBlbnRpcmVseTsKLQkgICAgIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIGJyYW5jaCBhcm91bmQgdGhpcyBpbnN0cnVjdGlvbiwKLQkgICAgIGFuZCB0aGVyZSdzIG5vIGxhYmVsIGF0IHRoaXMgaW5zdHJ1Y3Rpb24sIHRoZW4gd2UgY2FuIHJldmVyc2UKLQkgICAgIHRoZSBjb25kaXRpb24gb24gdGhlIHByZXZpb3VzIGJyYW5jaCBhbmQgZWxpbWluYXRlIHRoaXMganVtcC4KLQotCSAgICAgICBvcmlnaW5hbDoJCQluZXc6Ci0JCSBiQ0MgbGFiMQkJCWJDQycgbGFiMgotCQkgam1wIGxhYjIKLQkJbGFiMToJCQkJbGFiMToKLQkKLQkgICAgIFRoaXMgc2F2ZXMgNCBieXRlcyBpbnN0ZWFkIG9mIHR3bywgYW5kIHNob3VsZCBiZSByZWxhdGl2ZWx5Ci0JICAgICBjb21tb24uICAqLwotCi0JICBpZiAoZ2FwIDw9IDEyNgotCSAgICAgICYmIGxhc3RfcmVsb2MKLQkgICAgICAmJiBsYXN0X3JlbG9jLT5ob3d0by0+dHlwZSA9PSBSX1BDUkJZVEUpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIGxhc3RfdmFsdWU7Ci0JICAgICAgbGFzdF92YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChsYXN0X3JlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbikgKyAxOwotCi0JICAgICAgaWYgKGxhc3RfdmFsdWUgPT0gZG90ICsgMgotCQkgICYmIGxhc3RfcmVsb2MtPmFkZHJlc3MgKyAxID09IHJlbG9jLT5hZGRyZXNzCi0JCSAgJiYgISBoODMwMF9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBpbnB1dF9zZWN0aW9uLCBkb3QgLSAyKSkKLQkJewotCQkgIHJlbG9jLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTk7Ci0JCSAgbGFzdF9yZWxvYy0+aG93dG8gPSBob3d0b190YWJsZSArIDE4OwotCQkgIGxhc3RfcmVsb2MtPnN5bV9wdHJfcHRyID0gcmVsb2MtPnN5bV9wdHJfcHRyOwotCQkgIGxhc3RfcmVsb2MtPmFkZGVuZCA9IHJlbG9jLT5hZGRlbmQ7Ci0JCSAgc2hyaW5rICs9IDQ7Ci0JCSAgYmZkX3BlcmZvcm1fc2xpcCAoYWJmZCwgNCwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUuICAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsJICAKLQotCSAgLyogVGhpcyBzaHJpbmtzIHRoaXMgc2VjdGlvbiBieSB0d28gYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDI7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogVGhpcyBpcyB0aGUgMTYgYml0IHBjLXJlbGF0aXZlIGJyYW5jaCB3aGljaCBjb3VsZCBiZWNvbWUgYW4gOCBiaXQKLSAgICAgICBwYy1yZWxhdGl2ZSBicmFuY2guICAqLwotICAgIGNhc2UgUl9QQ1JXT1JEOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2gsIGFkZCBvbmUgdG8gdGhlIHZhbHVlCi0gICAgICAgICBiZWNhdXNlIHRoZSBhZGRlbmQgZmllbGQgaW4gUENyZWwganVtcHMgaXMgb2ZmIGJ5IC0xLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbikgKyAxOwotCQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGluc3RydWN0aW9uIGlmIHdlIHdlcmUgdG8gcmVsYXguICAqLwotICAgICAgZG90ID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIGFkZHJlc3M7Ci0gIAotICAgICAgLyogQ29tcHV0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIGluc24gdG8gdGhlIGJyYW5jaCB0YXJnZXQuICAqLwotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIElmIHRoZSBkaXN0YW5jZSBpcyB3aXRoaW4gLTEyOC4uKzEyOCBpbmNsdXNpdmUsIHRoZW4gd2UgY2FuIHJlbGF4Ci0JIHRoaXMganVtcC4gICsxMjggaXMgdmFsaWQgc2luY2UgdGhlIHRhcmdldCB3aWxsIG1vdmUgdHdvIGJ5dGVzCi0JIGNsb3NlciBpZiB3ZSBkbyByZWxheCB0aGlzIGJyYW5jaC4gICovCi0gICAgICBpZiAoKGludClnYXAgPj0gLTEyOCAmJiAoaW50KWdhcCA8PSAxMjggKQotCXsgCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUuICAqLwotCSAgcmVsb2MtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNTsKLQotCSAgLyogVGhpcyBzaHJpbmtzIHRoaXMgc2VjdGlvbiBieSB0d28gYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDI7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogVGhpcyBpcyBhIDE2IGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGluIGEgbW92LmIgaW5zbiwgd2hpY2ggY2FuCi0gICAgICAgYmVjb21lIGFuIDggYml0IGFic29sdXRlIGFkZHJlc3MgaWYgaXQncyBpbiB0aGUgcmlnaHQgcmFuZ2UuICAqLwotICAgIGNhc2UgUl9NT1YxNkIxOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgdGhpcyBtb3YuYiBpbnNuLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIFRoZSBhZGRyZXNzIGlzIGluIDB4ZmYwMC4uMHhmZmZmIGluY2x1c2l2ZSBvbiB0aGUgaDgzMDAgb3IKLQkgMHhmZmZmMDAuLjB4ZmZmZmZmIGluY2x1c2l2ZSBvbiB0aGUgaDgzMDBoLCB0aGVuIHdlIGNhbgotCSByZWxheCB0aGlzIG1vdi5iICAqLwotICAgICAgaWYgKChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwCi0JICAgJiYgdmFsdWUgPj0gMHhmZjAwCi0JICAgJiYgdmFsdWUgPD0gMHhmZmZmKQotCSAgfHwgKChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwaAotCSAgICAgICB8fCBiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLQkgICAgICAmJiB2YWx1ZSA+PSAweGZmZmYwMAotCSAgICAgICYmIHZhbHVlIDw9IDB4ZmZmZmZmKSkKLQl7Ci0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUuICAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsKLQotCSAgLyogVGhpcyBzaHJpbmtzIHRoaXMgc2VjdGlvbiBieSB0d28gYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDI7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogU2ltaWxhcmx5IGZvciBhIDI0IGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGluIGEgbW92LmIuICBOb3RlIHRoYXQKLSAgICAgICBpZiB3ZSBjYW4ndCByZWxheCB0aGlzIGludG8gYW4gOCBiaXQgYWJzb2x1dGUsIHdlJ2xsIGZhbGwgdGhyb3VnaAotICAgICAgIGFuZCB0cnkgdG8gcmVsYXggaXQgaW50byBhIDE2Yml0IGFic29sdXRlLiAgKi8KLSAgICBjYXNlIFJfTU9WMjRCMToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoaXMgbW92LmIgaW5zbi4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBpcyBpbiAweGZmZmYwMC4uMHhmZmZmZmYgaW5jbHVzaXZlIG9uIHRoZSBoODMwMGgsCi0JIHRoZW4gd2UgY2FuIHJlbGF4IHRoaXMgbW92LmIgICovCi0gICAgICBpZiAoKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBoCi0JICAgfHwgYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMHMpCi0JICAmJiB2YWx1ZSA+PSAweGZmZmYwMAotCSAgJiYgdmFsdWUgPD0gMHhmZmZmZmYpCi0JewotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7Ci0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgZm91ciBieXRlcy4gICovCi0JICBzaHJpbmsgKz0gNDsKLQkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgNCwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0KLQkgIC8qIERvbmUgd2l0aCB0aGlzIHJlbG9jLiAgKi8KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogRkFMTFRIUk9VR0ggYW5kIHRyeSB0byB0dXJuIHRoZSAzMi8yNCBiaXQgcmVsb2MgaW50byBhIDE2IGJpdAotCSByZWxvYy4gICovCi0KLSAgICAvKiBUaGlzIGlzIGEgMjQvMzIgYml0IGFic29sdXRlIGFkZHJlc3MgaW4gYSBtb3YgaW5zbiwgd2hpY2ggY2FuCi0gICAgICAgYmVjb21lIGFuIDE2IGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGlmIGl0J3MgaW4gdGhlIHJpZ2h0IHJhbmdlLiAgKi8KLSAgICBjYXNlIFJfTU9WTDE6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSB0aGlzIG1vdiBpbnNuLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIElmIHRoaXMgYWRkcmVzcyBpcyBpbiAweDAwMDAuLjB4N2ZmZiBpbmNsdXNpdmUgb3IKLSAgICAgICAgIDB4ZmY4MDAwLi4weGZmZmZmZiBpbmNsdXNpdmUsIHRoZW4gaXQgY2FuIGJlIHJlbGF4ZWQuICAqLwotICAgICAgaWYgKHZhbHVlIDw9IDB4N2ZmZiB8fCB2YWx1ZSA+PSAweGZmODAwMCkKLQl7Ci0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUuICAqLwotCSAgcmVsb2MtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNzsKLQotCSAgLyogVGhpcyBzaHJpbmtzIHRoaXMgc2VjdGlvbiBieSB0d28gYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDI7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBObyBvdGhlciByZWxvYyB0eXBlcyByZXByZXNlbnQgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgIH0KLQotICBsYXN0X3JlbG9jID0gcmVsb2M7Ci0gIGxhc3RfaW5wdXRfc2VjdGlvbiA9IGlucHV0X3NlY3Rpb247Ci0gIHJldHVybiBzaHJpbms7Ci19Ci0KLQotLyogSGFuZGxlIHJlbG9jYXRpb25zIGZvciB0aGUgSDgvMzAwLCBpbmNsdWRpbmcgcmVsb2NzIGZvciByZWxheGVkCi0gICBpbnN0cnVjdGlvbnMuCi0KLSAgIEZJWE1FOiBOb3QgYWxsIHJlbG9jYXRpb25zIGNoZWNrIGZvciBvdmVyZmxvdyEgICovCi0KLXN0YXRpYyB2b2lkCi1oODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLAotCQkJICAgZHN0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIHVuc2lnbmVkIGludCBzcmNfYWRkcmVzcyA9ICpzcmNfcHRyOwotICB1bnNpZ25lZCBpbnQgZHN0X2FkZHJlc3MgPSAqZHN0X3B0cjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGJmZF92bWEgZG90OwotICBpbnQgZ2FwLHRtcDsKLQotICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKLSAgICB7Ci0KLSAgICAvKiBHZW5lcmljIDhiaXQgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gICAgY2FzZSBSX1BDUkJZVEU6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICBkb3QgPSAobGlua19vcmRlci0+b2Zmc2V0IAotCSAgICAgKyBkc3RfYWRkcmVzcyAKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgT0suICBBcHBseSB0aGUgcmVsb2NhdGlvbiBhbmQgdXBkYXRlIHRoZQotCSBzcmMvZHN0IGFkZHJlc3MgYXBwcm9wcmlhdGVseS4gICovCi0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MrKzsKLSAgICAgIHNyY19hZGRyZXNzKys7Ci0KLSAgICAgIC8qIEFsbCBkb25lLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgLyogR2VuZXJpYyAxNmJpdCBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgICBjYXNlIFJfUENSV09SRDoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCB0aGUgcmVsb2MpLiAgKi8KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQgCi0JICAgICArIGRzdF9hZGRyZXNzIAotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyAxKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwID4gMzI3NjYgfHwgZ2FwIDwgLTMyNzY4KQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBFdmVyeXRoaW5nIGxvb2tzIE9LLiAgQXBwbHkgdGhlIHJlbG9jYXRpb24gYW5kIHVwZGF0ZSB0aGUKLQkgc3JjL2RzdCBhZGRyZXNzIGFwcHJvcHJpYXRlbHkuICAqLwotCi0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcyArPSAyOwotICAgICAgc3JjX2FkZHJlc3MgKz0gMjsKLQotICAgICAgLyogQWxsIGRvbmUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBHZW5lcmljIDhiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gICAgY2FzZSBSX1JFTEJZVEU6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG9iamVjdCByZWZlcmVuY2VkIGJ5IHRoaXMgaW5zbi4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmICh2YWx1ZSA8PSAweGZmCi0JICB8fCAodmFsdWUgPj0gMHgwMDAwZmYwMCAmJiB2YWx1ZSA8PSAweDAwMDBmZmZmKQotICAJICB8fCAodmFsdWUgPj0gMHgwMGZmZmYwMCAmJiB2YWx1ZSA8PSAweDAwZmZmZmZmKQotCSAgfHwgKHZhbHVlID49IDB4ZmZmZmZmMDAgJiYgdmFsdWUgPD0gMHhmZmZmZmZmZikpCi0JewotCSAgLyogRXZlcnl0aGluZyBsb29rcyBPSy4gIEFwcGx5IHRoZSByZWxvY2F0aW9uIGFuZCB1cGRhdGUgdGhlCi0JICAgICBzcmMvZHN0IGFkZHJlc3MgYXBwcm9wcmlhdGVseS4gICovCi0KLQkgIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCSAgZHN0X2FkZHJlc3MgKz0gMTsKLQkgIHNyY19hZGRyZXNzICs9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBBbGwgZG9uZS4gICovCi0gICAgICBicmVhazsKLQotICAgIC8qIFZhcmlvdXMgc2ltcGxlIDE2Yml0IGFic29sdXRlIHJlbG9jYXRpb25zLiAgKi8KLSAgICBjYXNlIFJfTU9WMTZCMToKLSAgICBjYXNlIFJfSk1QMToKLSAgICBjYXNlIFJfUkVMV09SRDoKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCB2YWx1ZSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLSAgICAgIGRzdF9hZGRyZXNzICs9IDI7Ci0gICAgICBzcmNfYWRkcmVzcyArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBWYXJpb3VzIHNpbXBsZSAyNC8zMmJpdCBhYnNvbHV0ZSByZWxvY2F0aW9ucy4gICovCi0gICAgY2FzZSBSX01PVjI0QjE6Ci0gICAgY2FzZSBSX01PVkwxOgotICAgIGNhc2UgUl9SRUxMT05HOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCB2YWx1ZSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLSAgICAgIGRzdF9hZGRyZXNzICs9IDQ7Ci0gICAgICBzcmNfYWRkcmVzcyArPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBbm90aGVyIDI0LzMyYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICAgIGNhc2UgUl9KTVBMMToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICB2YWx1ZSA9ICgodmFsdWUgJiAweDAwZmZmZmZmKQotCSAgICAgICB8IChiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgc3JjX2FkZHJlc3MpICYgMHhmZjAwMDAwMCkpOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcyArPSA0OwotICAgICAgc3JjX2FkZHJlc3MgKz0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBhYm9sdXRlIHJlbG9jYXRpb24gdGhhdCB3YXMgZm9ybWVybGx5IGEgMjQvMzJiaXQKLSAgICAgICBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgICBjYXNlIFJfTU9WTDI6Ci0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmICh2YWx1ZSA8IDB4ODAwMCB8fCB2YWx1ZSA+IDB4ZmY4MDAwKQotCXsKLQkgIC8qIEluc2VydCB0aGUgMTZiaXQgdmFsdWUgaW50byB0aGUgcHJvcGVyIGxvY2F0aW9uLiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCi0JICAvKiBGaXggdGhlIG9wY29kZS4gIEZvciBhbGwgdGhlIG1vdmUgaW5zbnMsIHdlIHNpbXBseQotCSAgICAgbmVlZCB0byB0dXJuIG9mZiBiaXQgMHgyMCBpbiB0aGUgcHJldmlvdXMgYnl0ZS4gICovCi0gICAgICAgICAgZGF0YVtkc3RfYWRkcmVzcyAtIDFdICY9IH4weDIwOwotCSAgZHN0X2FkZHJlc3MgKz0gMjsKLQkgIHNyY19hZGRyZXNzICs9IDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBhYnNvbHV0ZSBicmFuY2ggdGhhdCBpcyBub3cgYW4gOC1iaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgICBjYXNlIFJfSk1QMjoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldAotCSAgICAgKyBkc3RfYWRkcmVzcwotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyAxKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIE5vdyBmaXggdGhlIGluc3RydWN0aW9uIGl0c2VsZi4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbZHN0X2FkZHJlc3MgLSAxXSkKLQl7Ci0JY2FzZSAweDVlOgotCSAgLyoganNyIC0+IGJzciAqLwotCSAgYmZkX3B1dF84IChhYmZkLCAweDU1LCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHg1YToKLQkgIC8qIGptcCAtPmJyYSAqLwotCSAgYmZkX3B1dF84IChhYmZkLCAweDQwLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSA4Yml0IHZhbHVlLiAgKi8KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCi0gICAgICBkc3RfYWRkcmVzcyArPSAxOwotICAgICAgc3JjX2FkZHJlc3MgKz0gMzsKLQotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCB0aGF0IGlzIG5vdyBhbiA4LWJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICAqLwotICAgIGNhc2UgUl9QQ1JXT1JEX0I6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiAobm90IHRoZSByZWxvYykuICAqLwotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldAotCSAgICAgKyBkc3RfYWRkcmVzcwotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgLSAxKTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIE5vdyBmaXggdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIHN3aXRjaCAoZGF0YVtkc3RfYWRkcmVzcyAtIDJdKQotCXsKLQljYXNlIDB4NTg6Ci0JICAvKiBiQ0M6MTYgLT4gYkNDOjggKi8KLQkgIC8qIEdldCB0aGUgY29uZGl0aW9uIGNvZGUgZnJvbSB0aGUgb3JpZ2luYWwgaW5zbi4gICovCi0JICB0bXAgPSBkYXRhW2RzdF9hZGRyZXNzIC0gMV07Ci0JICB0bXAgJj0gMHhmMDsKLQkgIHRtcCA+Pj0gNDsKLQotCSAgLyogTm93IG9yIGluIHRoZSBoaWdoIG5pYmJsZSBvZiB0aGUgb3Bjb2RlLiAgKi8KLQkgIHRtcCB8PSAweDQwOwotCi0JICAvKiBXcml0ZSBpdC4gICovCi0JICBiZmRfcHV0XzggKGFiZmQsIHRtcCwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMik7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLQkvKiBPdXRwdXQgdGhlIHRhcmdldC4gICovCi0JYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDEpOwotCi0JLyogV2UgZG9uJ3QgYWR2YW5jZSBkc3RfYWRkcmVzcyAtLSB0aGUgOGJpdCByZWxvYyBpcyBhcHBsaWVkIGF0Ci0JICAgZHN0X2FkZHJlc3MgLSAxLCBzbyB0aGUgbmV4dCBpbnNuIHNob3VsZCBiZWdpbiBhdCBkc3RfYWRkcmVzcy4gICovCi0Jc3JjX2FkZHJlc3MgKz0gMjsKLQotCWJyZWFrOwotICAgICAgCi0gICAgLyogU2ltaWxhcmx5IGZvciBhIDI0Yml0IGFic29sdXRlIHRoYXQgaXMgbm93IDggYml0cy4gICovCi0gICAgY2FzZSBSX0pNUEwyOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCB0aGUgcmVsb2MpLiAgKi8KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKLQkgICAgICsgZHN0X2FkZHJlc3MKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMik7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBGaXggdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIHN3aXRjaCAoZGF0YVtzcmNfYWRkcmVzc10pCi0JewotCWNhc2UgMHg1ZToKLQkgIC8qIGpzciAtPiBic3IgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg1NSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkgIGJyZWFrOwotCWNhc2UgMHg1YToKLQkgIC8qIGptcCAtPmJyYSAqLwotCSAgYmZkX3B1dF84IChhYmZkLCAweDQwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyArIDEpOwotICAgICAgZHN0X2FkZHJlc3MgKz0gMjsKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBhYnNvbHV0ZSBtb3YuYiB0aGF0IGlzIG5vdyBhbiA4Yml0IGFic29sdXRlIG1vdi5iLiAgKi8KLSAgICBjYXNlIFJfTU9WMTZCMjoKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGRhdGFbZHN0X2FkZHJlc3MgLSAyXSAhPSAweDZhKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBGaXggdXAgdGhlIG9wY29kZS4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYwKQotCXsKLQljYXNlIDB4MDA6Ci0JICBkYXRhW2RzdF9hZGRyZXNzIC0gMl0gPSAoZGF0YVtzcmNfYWRkcmVzcy0xXSAmIDB4ZikgfCAweDIwOwotCSAgYnJlYWs7Ci0JY2FzZSAweDgwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgzMDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLSAgICAgIHNyY19hZGRyZXNzICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNpbWlsYXJseSBmb3IgYSAyNGJpdCBtb3YuYiAgKi8KLSAgICBjYXNlIFJfTU9WMjRCMjoKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGRhdGFbZHN0X2FkZHJlc3MgLSAyXSAhPSAweDZhKQotCWFib3J0ICgpOwotCi0gICAgICAvKiBGaXggdXAgdGhlIG9wY29kZS4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYwKQotCXsKLQljYXNlIDB4MjA6Ci0JICBkYXRhW2RzdF9hZGRyZXNzIC0gMl0gPSAoZGF0YVtzcmNfYWRkcmVzcy0xXSAmIDB4ZikgfCAweDIwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGEwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgzMDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9CQ0NfSU5WOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICAgICsgZHN0X2FkZHJlc3MgCi0JICAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSkgKyAxOwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmIChnYXAgPCAtMTI4IHx8IGdhcCA+IDEyNikKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogRXZlcnl0aGluZyBsb29rcyBPSy4gIEZpeCB0aGUgY29uZGl0aW9uIGluIHRoZSBpbnN0cnVjdGlvbiwgYXBwbHkKLQkgdGhlIHJlbG9jYXRpb24sIGFuZCB1cGRhdGUgdGhlIHNyYy9kc3QgYWRkcmVzcyBhcHByb3ByaWF0ZWx5LiAgKi8KLQotICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfZ2V0XzggKGFiZmQsIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDEpIF4gMSwKLQkJIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDEpOwotICAgICAgYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcysrOwotICAgICAgc3JjX2FkZHJlc3MrKzsKLQotICAgICAgLyogQWxsIGRvbmUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSk1QX0RFTDoKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIC8qIEFuIDhiaXQgbWVtb3J5IGluZGlyZWN0IGluc3RydWN0aW9uIChqbXAvanNyKS4KLQotICAgICAgIFRoZXJlJ3Mgc2V2ZXJhbCB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGRvbmUgdG8gaGFuZGxlCi0gICAgICAgdGhpcyByZWxvY2F0aW9uLgotCi0gICAgICAgSWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGFic29sdXRlIHN5bWJvbCwgdGhlbgotICAgICAgIHdlIHNob3VsZCBoYW5kbGUgaXQganVzdCBSX1JFTEJZVEUuICBMaWtld2lzZSBpZiBpdCdzCi0gICAgICAgZm9yIGEgc3ltYm9sIHdpdGggYSB2YWx1ZSBnZSAwIGFuZCBsZSAweGZmLgotCi0gICAgICAgT3RoZXJ3aXNlIGl0J3MgYSBqdW1wL2NhbGwgdGhyb3VnaCB0aGUgZnVuY3Rpb24gdmVjdG9yLAotICAgICAgIGFuZCB0aGUgbGlua2VyIGlzIGV4cGVjdGVkIHRvIHNldCB1cCB0aGUgZnVuY3Rpb24gdmVjdG9yCi0gICAgICAgYW5kIHB1dCB0aGUgcmlnaHQgdmFsdWUgaW50byB0aGUganVtcC9jYWxsIGluc3RydWN0aW9uLiAgKi8KLSAgICBjYXNlIFJfTUVNX0lORElSRUNUOgotICAgICAgewotCS8qIFdlIG5lZWQgdG8gZmluZCB0aGUgc3ltYm9sIHNvIHdlIGNhbiBkZXRlcm1pbmUgaXQncwotCSAgIGFkZHJlc3MgaW4gdGhlIGZ1bmN0aW9uIHZlY3RvciB0YWJsZS4gICovCi0JYXN5bWJvbCAqc3ltYm9sOwotCWJmZF92bWEgdmFsdWU7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICpoOwotCWFzZWN0aW9uICp2ZWN0b3JzX3NlYyA9IGg4MzAwX2NvZmZfaGFzaF90YWJsZSAobGlua19pbmZvKS0+dmVjdG9yc19zZWM7Ci0KLQkvKiBGaXJzdCBzZWUgaWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGFic29sdXRlIHN5bWJvbAotCSAgIG9yIGFnYWluc3QgYSBzeW1ib2wgd2l0aCBhIG5vbm5lZ2F0aXZlIHZhbHVlIDw9IDB4ZmYuICAqLwotCXN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLQl2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQlpZiAoc3ltYm9sID09IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbAotCSAgICB8fCB2YWx1ZSA8PSAweGZmKQotCSAgewotCSAgICAvKiBUaGlzIHNob3VsZCBiZSBoYW5kbGVkIGluIGEgbWFubmVyIHZlcnkgc2ltaWxhciB0bwotCSAgICAgICBSX1JFTEJZVEVTLiAgIElmIHRoZSB2YWx1ZSBpcyBpbiByYW5nZSwgdGhlbiBqdXN0IHNsYW0KLQkgICAgICAgdGhlIHZhbHVlIGludG8gdGhlIHJpZ2h0IGxvY2F0aW9uLiAgRWxzZSB0cmlnZ2VyIGEKLQkgICAgICAgcmVsb2Mgb3ZlcmZsb3cgY2FsbGJhY2suICAqLwotCSAgICBpZiAodmFsdWUgPD0gMHhmZikKLQkgICAgICB7Ci0JCWJmZF9wdXRfOCAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JCWRzdF9hZGRyZXNzICs9IDE7Ci0JCXNyY19hZGRyZXNzICs9IDE7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJCXJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCQlpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCQkgIGFib3J0ICgpOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQkvKiBUaGlzIGlzIGEganVtcC9jYWxsIHRocm91Z2ggYSBmdW5jdGlvbiB2ZWN0b3IsIGFuZCB3ZSdyZQotCSAgIGV4cGVjdGVkIHRvIGNyZWF0ZSB0aGUgZnVuY3Rpb24gdmVjdG9yIG91cnNlbHZlcy4gCi0KLQkgICBGaXJzdCBsb29rIHVwIHRoaXMgc3ltYm9sIGluIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSAtLSB3ZSBuZWVkCi0JICAgdGhlIGRlcml2ZWQgbGlua2VyIHN5bWJvbCB3aGljaCBob2xkcyB0aGlzIHN5bWJvbCdzIGluZGV4Ci0JICAgaW4gdGhlIGZ1bmN0aW9uIHZlY3Rvci4gICovCi0JbmFtZSA9IHN5bWJvbC0+bmFtZTsKLQlpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkKLQkgIHsKLQkgICAgY2hhciAqbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgOSk7Ci0JICAgIGlmIChuZXdfbmFtZSA9PSBOVUxMKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIHN0cmNweSAobmV3X25hbWUsIG5hbWUpOwotCSAgICBzcHJpbnRmIChuZXdfbmFtZSArIHN0cmxlbiAobmFtZSksICJfJTA4eCIsCi0JCSAgICAgKGludClzeW1ib2wtPnNlY3Rpb24pOwotCSAgICBuYW1lID0gbmV3X25hbWU7Ci0JICB9Ci0KLQloID0gZnVuY3ZlY19oYXNoX2xvb2t1cCAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChsaW5rX2luZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUsCi0JCQkJIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0KLQkvKiBUaGlzIHNob3VsZG4ndCBldmVyIGhhcHBlbi4gIElmIGl0IGRvZXMgdGhhdCBtZWFucyB3ZSd2ZSBnb3QKLQkgICBkYXRhIGNvcnJ1cHRpb24gb2Ygc29tZSBraW5kLiAgQWJvcnRpbmcgc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUKLQkgICB0aGluayB0byBkbyBoZXJlLiAgKi8KLQlpZiAoaCA9PSBOVUxMIHx8IHZlY3RvcnNfc2VjID09IE5VTEwpCi0JICBhYm9ydCAoKTsKLQotCS8qIFBsYWNlIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiB2ZWN0b3IgZW50cnkgaW50byB0aGUKLQkgICByZWxvYydzIGFkZHJlc3MuICAqLwotCWJmZF9wdXRfOCAoYWJmZCwKLQkJICAgdmVjdG9yc19zZWMtPm91dHB1dF9vZmZzZXQgKyBoLT5vZmZzZXQsCi0JCSAgIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0KLQlkc3RfYWRkcmVzcysrOwotCXNyY19hZGRyZXNzKys7Ci0KLQkvKiBOb3cgY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaXRzZWxmLiAgKi8KLQlpZiAoYmZkX2dldF9tYWNoIChpbnB1dF9zZWN0aW9uLT5vd25lcikgPT0gYmZkX21hY2hfaDgzMDApCi0JICBiZmRfcHV0XzE2IChhYmZkLAotCQkgICAgICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsCi0JCQkJCQkgIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbiksCi0JCSAgICAgIHZlY3RvcnNfc2VjLT5jb250ZW50cyArIGgtPm9mZnNldCk7Ci0JZWxzZSBpZiAoYmZkX2dldF9tYWNoIChpbnB1dF9zZWN0aW9uLT5vd25lcikgPT0gYmZkX21hY2hfaDgzMDBoCi0JCSB8fCBiZmRfZ2V0X21hY2ggKGlucHV0X3NlY3Rpb24tPm93bmVyKSA9PSBiZmRfbWFjaF9oODMwMHMpCi0JICBiZmRfcHV0XzMyIChhYmZkLAotCQkgICAgICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsCi0JCQkJCQkgIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbiksCi0JCSAgICAgIHZlY3RvcnNfc2VjLT5jb250ZW50cyArIGgtPm9mZnNldCk7Ci0JZWxzZQotCSAgYWJvcnQgKCk7Ci0KLQkvKiBHcm9zcy4gIFdlJ3ZlIGFscmVhZHkgd3JpdHRlbiB0aGUgY29udGVudHMgb2YgdGhlIHZlY3RvciBzZWN0aW9uCi0JICAgYmVmb3JlIHdlIGdldCBoZXJlLi4uICBTbyB3ZSB3cml0ZSBpdCBhZ2FpbiB3aXRoIHRoZSBuZXcgZGF0YS4gICovCi0JYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzICh2ZWN0b3JzX3NlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLAotCQkJCSAgdmVjdG9yc19zZWMtPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgdmVjdG9yc19zZWMtPmNvbnRlbnRzLAotCQkJCSAgdmVjdG9yc19zZWMtPm91dHB1dF9vZmZzZXQsCi0JCQkJICB2ZWN0b3JzX3NlYy0+X3Jhd19zaXplKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotCi0gICpzcmNfcHRyID0gc3JjX2FkZHJlc3M7Ci0gICpkc3RfcHRyID0gZHN0X2FkZHJlc3M7Ci19Ci0KLQotLyogUm91dGluZSBmb3IgdGhlIGg4MzAwIGxpbmtlci4KLQotICAgVGhpcyByb3V0aW5lIGlzIG5lY2Vzc2FyeSB0byBoYW5kbGUgdGhlIHNwZWNpYWwgUl9NRU1fSU5ESVJFQ1QKLSAgIHJlbG9jcyBvbiB0aGUgaDgzMDAuICBJdCdzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIGEgdmVjdG9ycwotICAgc2VjdGlvbiBhbmQgYXR0YWNoaW5nIGl0IHRvIGFuIGlucHV0IGJmZCBhcyB3ZWxsIGFzIHNpemluZwotICAgdGhlIHZlY3RvcnMgc2VjdGlvbi4gIEl0IGFsc28gY3JlYXRlcyBvdXIgdmVjdG9ycyBoYXNoIHRhYmxlLgotCi0gICBJdCB1c2VzIHRoZSBnZW5lcmljIGxpbmtlciByb3V0aW5lcyB0byBhY3R1YWxseSBhZGQgdGhlIHN5bWJvbHMuCi0gICBmcm9tIHRoaXMgQkZEIHRvIHRoZSBiZmQgbGlua2VyIGhhc2ggdGFibGUuICBJdCBtYXkgYWRkIGEgZmV3Ci0gICBzZWxlY3RlZCBzdGF0aWMgc3ltYm9scyB0byB0aGUgYmZkIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKmZ1bmN2ZWNfaGFzaF90YWJsZTsKLQotICAvKiBJZiB3ZSBoYXZlbid0IGNyZWF0ZWQgYSB2ZWN0b3JzIHNlY3Rpb24sIGRvIHNvIG5vdy4gICovCi0gIGlmICghaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMpCi0gICAgewotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgYXJlIHNldCwgaW5jbHVkaW5nIFNFQ19JTl9NRU1PUlkuICAqLwotICAgICAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19SRUFET05MWSk7Ci0gICAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsCi0JCQkJCQkJCSAgICAiLnZlY3RvcnMiKTsKLQotICAgICAgLyogSWYgdGhlIHNlY3Rpb24gd2Fzbid0IGNyZWF0ZWQsIG9yIHdlIGNvdWxkbid0IHNldCB0aGUgZmxhZ3MsCi0JIHF1aXQgcXVpY2tseSBub3csIHJhdGhlciB0aGFuIGRpZWluZyBhIHBhaW5mdWwgZGVhdGggbGF0ZXIuICAqLwotICAgICAgaWYgKCEgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLAotCQkJCSAgICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZShpbmZvKS0+dmVjdG9yc19zZWMsCi0JCQkJICAgICAgZmxhZ3MpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQWxzbyBjcmVhdGUgdGhlIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGZ1bmN2ZWNfaGFzaF90YWJsZSA9ICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqKQotCWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlKSkpOwotCi0gICAgICBpZiAoIWZ1bmN2ZWNfaGFzaF90YWJsZSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEFuZCBpbml0aWFsaXplIHRoZSBmdW5jdmVjIGhhc2ggdGFibGUuICAqLwotICAgICAgaWYgKCFmdW5jdmVjX2hhc2hfdGFibGVfaW5pdCAoZnVuY3ZlY19oYXNoX3RhYmxlLCBhYmZkLAotCQkJCSAgICBmdW5jdmVjX2hhc2hfbmV3ZnVuYykpCi0JewotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIGZ1bmN2ZWNfaGFzaF90YWJsZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTdG9yZSBhd2F5IGEgcG9pbnRlciB0byB0aGUgZnVuY3ZlYyBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZ1bmN2ZWNfaGFzaF90YWJsZSA9IGZ1bmN2ZWNfaGFzaF90YWJsZTsKLSAgICB9Ci0KLSAgLyogTG9hZCB1cCB0aGUgZnVuY3Rpb24gdmVjdG9yIGhhc2ggdGFibGUuICAqLwotICBmdW5jdmVjX2hhc2hfdGFibGUgPSBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGU7Ci0KLSAgLyogQWRkIHRoZSBzeW1ib2xzIHVzaW5nIHRoZSBnZW5lcmljIGNvZGUuICAqLwotICBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0KLSAgLyogTm93IHNjYW4gdGhlIHJlbG9jcyBmb3IgYWxsIHRoZSBzZWN0aW9ucyBpbiB0aGlzIGJmZDsgY3JlYXRlCi0gICAgIGFkZGl0aW9uYWwgc3BhY2UgaW4gdGhlIC52ZWN0b3JzIHNlY3Rpb24gYXMgbmVlZGVkLiAgKi8KLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgbG9uZyByZWxvY19zaXplLCByZWxvY19jb3VudCwgaTsKLSAgICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICAgYXJlbGVudCAqKnJlbG9jczsKLQotICAgICAgLyogU3VjayBpbiB0aGUgcmVsb2NzLCBzeW1ib2xzICYgY2Fub25pY2FsaXplIHRoZW0uICAqLwotICAgICAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYyk7Ci0gICAgICBpZiAocmVsb2Nfc2l6ZSA8PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICByZWxvY3MgPSAoYXJlbGVudCAqKiliZmRfbWFsbG9jICgoc2l6ZV90KXJlbG9jX3NpemUpOwotICAgICAgaWYgKCFyZWxvY3MpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgc3ltYm9scyBzaG91bGQgaGF2ZSBiZWVuIHJlYWQgaW4gYnkgX2JmZF9nZW5lcmljIGxpbmtfYWRkX3N5bWJvbHMKLQkgY2FsbCBhYm92ZWMsIHNvIHdlIGNhbiBjaGVhdCBhbmQgdXNlIHRoZSBwb2ludGVyIHRvIHRoZW0gdGhhdCB3YXMKLQkgc2F2ZWQgaW4gdGhlIGFib3ZlIGNhbGwuICAqLwotICAgICAgc3ltYm9scyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzKGFiZmQpOwotICAgICAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWMsIHJlbG9jcywgc3ltYm9scyk7Ci0gICAgICBpZiAocmVsb2NfY291bnQgPD0gMCkKLQl7Ci0JICBmcmVlIChyZWxvY3MpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBOb3cgd2FsayB0aHJvdWdoIGFsbCB0aGUgcmVsb2NhdGlvbnMgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCByZWxvY19jb3VudDsgaSsrKQotCXsKLQkgIGFyZWxlbnQgKnJlbG9jID0gcmVsb2NzW2ldOwotCSAgYXN5bWJvbCAqc3ltYm9sID0gKihyZWxvYy0+c3ltX3B0cl9wdHIpOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgLyogV2UndmUgZ290IGFuIGluZGlyZWN0IHJlbG9jLiAgU2VlIGlmIHdlIG5lZWQgdG8gYWRkIGl0Ci0JICAgICB0byB0aGUgZnVuY3Rpb24gdmVjdG9yIHRhYmxlLiAgIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUKLQkgICAgIHRvIGFkZCBhIG5ldyBlbnRyeSBmb3IgZWFjaCB1bmlxdWUgc3ltYm9sIHJlZmVyZW5jZWQKLQkgICAgIGJ5IGFuIFJfTUVNX0lORElSRUNUIHJlbG9jYXRpb24gZXhjZXB0IGZvciBhIHJlbG9jCi0JICAgICBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4gICovCi0JICBpZiAocmVsb2MtPmhvd3RvLT50eXBlID09IFJfTUVNX0lORElSRUNUCi0JICAgICAgJiYgc3ltYm9sICE9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCkKLQotCSAgICB7Ci0JICAgICAgc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIG5hbWUgPSBzeW1ib2wtPm5hbWU7Ci0JICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpCi0JCXsKLQkJICBjaGFyICpuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyA5KTsKLQotCQkgIGlmIChuZXdfbmFtZSA9PSBOVUxMKQotCQkgICAgYWJvcnQgKCk7Ci0KLQkJICBzdHJjcHkgKG5ld19uYW1lLCBuYW1lKTsKLQkJICBzcHJpbnRmIChuZXdfbmFtZSArIHN0cmxlbiAobmFtZSksICJfJTA4eCIsCi0JCQkgICAoaW50KXN5bWJvbC0+c2VjdGlvbik7Ci0JCSAgbmFtZSA9IG5ld19uYW1lOwotCQl9Ci0KLQkgICAgICAvKiBMb29rIHRoaXMgc3ltYm9sIHVwIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaGFzaCB0YWJsZS4gICovCi0JICAgICAgaCA9IGZ1bmN2ZWNfaGFzaF9sb29rdXAgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZ1bmN2ZWNfaGFzaF90YWJsZSwKLQkJCQkgICAgICAgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQotCi0JICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgaGFzaCB0YWJsZSwgYWRkCi0JCSBpdCBhbmQgYnVtcCB1cCB0aGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZS4gICovCi0JICAgICAgaWYgKGggPT0gTlVMTCkKLQkJewotCQkgIGggPSBmdW5jdmVjX2hhc2hfbG9va3VwIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUsCi0JCQkJCSAgIG5hbWUsIHRydWUsIHRydWUpOwotCQkgIGlmIChoID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZyZWUgKHJlbG9jcyk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIC8qIEJ1bXAgdGhlIHNpemUgb2YgdGhlIHZlY3RvcnMgc2VjdGlvbi4gIEVhY2ggdmVjdG9yCi0JCSAgICAgdGFrZXMgMiBieXRlcyBvbiB0aGUgaDgzMDAgYW5kIDQgYnl0ZXMgb24gdGhlIGg4MzAwaC4gICovCi0JCSAgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDApCi0JCSAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+X3Jhd19zaXplICs9IDI7Ci0JCSAgZWxzZSBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMGgKLQkJCSAgIHx8IGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQotCQkgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPl9yYXdfc2l6ZSArPSA0OwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgcmVsb2NhdGlvbnMsIHJlbGVhc2UgdGhlbS4gICovCi0gICAgICBmcmVlIChyZWxvY3MpOwotICAgIH0KLQotICAvKiBOb3cgYWN0dWFsbHkgYWxsb2NhdGUgc29tZSBzcGFjZSBmb3IgdGhlIGZ1bmN0aW9uIHZlY3Rvci4gIEl0J3MKLSAgICAgd2FzdGVmdWwgdG8gZG8gdGhpcyBtb3JlIHRoYW4gb25jZSwgYnV0IHRoaXMgaXMgZWFzaWVyLiAgKi8KLSAgaWYgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5fcmF3X3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBGcmVlIHRoZSBvbGQgY29udGVudHMuICAqLwotICAgICAgaWYgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5jb250ZW50cykKLQlmcmVlIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+Y29udGVudHMpOwotCi0gICAgICAvKiBBbGxvY2F0ZSBuZXcgY29udGVudHMuICAqLwotICAgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPmNvbnRlbnRzCi0JPSBiZmRfbWFsbG9jIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+X3Jhd19zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMKLSNkZWZpbmUgY29mZl9yZWxvYzE2X2VzdGltYXRlIGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUKLSNkZWZpbmUgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyBoODMwMF9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0KLSN1bmRlZiBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSN1bmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0KLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKGg4MzAwY29mZl92ZWMsICJjb2ZmLWg4MzAwIiwgQkZEX0lTX1JFTEFYQUJMRSwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaDg1MDAuYyBiL2JmZC9jb2ZmLWg4NTAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZWVhYTUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtaDg1MDAuYworKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgSDgvNTAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi9oODUwMC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTggPQotSE9XVE8gKFJfSDg1MDBfSU1NOCwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMTYgPQotSE9XVE8gKFJfSDg1MDBfSU1NMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMjQgPQotSE9XVE8gKFJfSDg1MDBfSU1NMjQsIDAsIDEsIDI0LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMjQiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMzIgPQotSE9XVE8gKFJfSDg1MDBfSU1NMzIsIDAsIDEsIDMyLCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9oaWdoOCA9Ci1IT1dUTyAoUl9IODUwMF9ISUdIOCwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgInJfaGlnaDgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfbG93MTYgPQotSE9XVE8gKFJfSDg1MDBfTE9XMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAicl9sb3cxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9wY3JlbDggPQotSE9XVE8gKFJfSDg1MDBfUENSRUw4LCAwLCAxLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJyX3BjcmVsOCIsIHRydWUsIDAsIDAsIHRydWUpOwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfcGNyZWwxNiA9Ci1IT1dUTyAoUl9IODUwMF9QQ1JFTDE2LCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAicl9wY3JlbDE2IiwgdHJ1ZSwgMCwgMCwgdHJ1ZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaGlnaDE2ID0KLUhPV1RPIChSX0g4NTAwX0hJR0gxNiwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgInJfaGlnaDE2IiwgdHJ1ZSwgMHgwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSk7Ci0KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotc3RhdGljIGludCAKLWNvZmZfaDg1MDBfc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZTsKLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeC5yX3R5cGUgPSBjb2ZmX2g4NTAwX3NlbGVjdF9yZWxvYyhob3d0bykKLQotCi0jZGVmaW5lIEJBRE1BRyh4KSBIODUwMEJBRE1BRyh4KQotI2RlZmluZSBIODUwMCAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvKGludGVybmFsLCBkc3QpCi0gICAgIGFyZWxlbnQgKiBpbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHN3aXRjaCAoZHN0LT5yX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU04OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0xNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0lNTTI0OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMzI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW0zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9QQ1JFTDg6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9wY3JlbDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfUENSRUwxNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX3BjcmVsMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSElHSDg6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9oaWdoODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9ISUdIMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9oaWdoMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfTE9XMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9sb3cxNjsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkIHJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKiByZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKiogc3ltYm9sczsKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmIChyZWxvYy0+cl9zeW1uZHggPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotfQotCi1zdGF0aWMgdm9pZAotZXh0cmFfY2FzZSAoaW5fYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikKLSAgICAgYmZkICppbl9hYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIGJmZF9ieXRlICpkID0gZGF0YSsqZHN0X3B0cjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSDg1MDBfSU1NODoKLSAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKLQkJIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJIGQpOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfSElHSDg6Ci0gICAgICBiZmRfcHV0XzggKGluX2FiZmQsCi0JCSAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0JCSAgPj4gMTYpLAotCQkgZCApOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfSU1NMTY6Ci0gICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkICApOwotICAgICAgKCpkc3RfcHRyKSArPSAyOwotICAgICAgKCpzcmNfcHRyKSArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfTE9XMTY6Ci0gICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkKTsKLQotICAgICAgKCpkc3RfcHRyKSArPSAyOwotICAgICAgKCpzcmNfcHRyKSArPSAyOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfSDg1MDBfSElHSDE2OgotICAgICAgYmZkX3B1dF8xNiAoaW5fYWJmZCwKLQkJICAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0JCSAgID4+MTYpLAotCQkgIGQpOwotCi0gICAgICAoKmRzdF9wdHIpICs9IDI7Ci0gICAgICAoKnNyY19wdHIpICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9IODUwMF9JTU0yNDoKLSAgICAgIHsKLQlpbnQgdiA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCWludCBvID0gYmZkX2dldF8zMihpbl9hYmZkLCBkYXRhKyAqZHN0X3B0ciAtMSk7Ci0JdiA9ICh2ICYgMHgwMGZmZmZmZikgfCAobyAmIDB4ZmYwMDAwMCk7Ci0JYmZkX3B1dF8zMiAoaW5fYWJmZCwgdiwgZGF0YSAgKyAqZHN0X3B0ciAtMSk7Ci0JKCpkc3RfcHRyKSArPTM7Ci0JKCpzcmNfcHRyKSs9Mzs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMzI6Ci0gICAgICB7Ci0JaW50IHYgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQliZmRfcHV0XzMyIChpbl9hYmZkLCB2LCBkYXRhICArICpkc3RfcHRyKTsKLQkoKmRzdF9wdHIpICs9NDsKLQkoKnNyY19wdHIpKz00OzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSDg1MDBfUENSRUw4OgotICAgICAgewotCWJmZF92bWEgZHN0ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pOwotCWJmZF92bWEgZG90ID0gbGlua19vcmRlci0+b2Zmc2V0Ci0JICArICpkc3RfcHRyCi0JICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCWludCBnYXAgPSBkc3QgLSBkb3QgLSAxOyAvKiAtMSBzaW5jZSB3ZXJlIGluIHRoZSBvZGQgYnl0ZSBvZiB0aGUKLQkJCQkgICAgd29yZCBhbmQgdGhlIHBjJ3MgYmVlbiBpbmNyZW1lbnRlZCAqLwotCi0JaWYgKGdhcCA+IDEyOCB8fCBnYXAgPCAtMTI4KQotCSAgewotCSAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgICAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgICAgYWJvcnQgKCk7Ci0JICB9Ci0JYmZkX3B1dF84IChpbl9hYmZkLCBnYXAsIGRhdGEgKyAqZHN0X3B0cik7Ci0JKCpkc3RfcHRyKSsrOwotCSgqc3JjX3B0cikrKzsKLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIFJfSDg1MDBfUENSRUwxNjoKLSAgICAgIHsKLQliZmRfdm1hIGRzdCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IGxpbmtfb3JkZXItPm9mZnNldAotCSAgKyAqZHN0X3B0cgotCSAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQlpbnQgZ2FwID0gZHN0IC0gZG90IC0gMTsgLyogLTEgc2luY2Ugd2VyZSBpbiB0aGUgb2RkIGJ5dGUgb2YgdGhlCi0JCQkJICAgIHdvcmQgYW5kIHRoZSBwYydzIGJlZW4gaW5jcmVtZW50ZWQgKi8KLQotCWlmIChnYXAgPiAzMjc2NyB8fCBnYXAgPCAtMzI3NjgpCi0JICB7Ci0JICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgICBhYm9ydCAoKTsKLQkgIH0KLQliZmRfcHV0XzE2IChpbl9hYmZkLCBnYXAsIGRhdGEgKyAqZHN0X3B0cik7Ci0JKCpkc3RfcHRyKSs9MjsKLQkoKnNyY19wdHIpKz0yOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgZXh0cmFfY2FzZQotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI3VuZGVmIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24KLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKGg4NTAwY29mZl92ZWMsICJjb2ZmLWg4NTAwIiwgMCwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaTM4Ni5jIGIvYmZkL2NvZmYtaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDYzZTU4Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDY2MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImNvZmYvaTM4Ni5oIgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0dPMzJfRVhFCi0jaW5jbHVkZSAiY29mZi9nbzMyZXhlLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX2kzODZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqaTNjb2ZmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotLyogVGhlIHBhZ2Ugc2l6ZSBpcyBhIGd1ZXNzIGJhc2VkIG9uIEVMRi4gICovCi0KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgxMDAwCi0KLS8qIEZvciBzb21lIHJlYXNvbiB3aGVuIHVzaW5nIGkzODYgQ09GRiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSAudGV4dAotICAgc2VjdGlvbiBmb3IgYSByZWZlcmVuY2UgdG8gYSBjb21tb24gc3ltYm9sIGlzIHRoZSB2YWx1ZSBpdHNlbGYgcGx1cwotICAgYW55IGRlc2lyZWQgb2Zmc2V0LiAgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0vKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIG5lZWQgdG8gZG8gc29tZQotICAgYWRqdXN0bWVudHMgdG8gdGhlIG9iamVjdCBmaWxlIHRoYXQgYXJlIG5vdCBkb25lIGJ5IHRoZQotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGV2ZXJ5Ci0gICByZWxvYyB0eXBlIHRvIG1ha2UgYW55IHJlcXVpcmVkIGFkanVzdG1lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl9pMzg2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzeW12YWx1ZSBkaWZmOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIC8qIFdlIGFyZSByZWxvY2F0aW5nIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBjdXJyZW50IHZhbHVlIGluIHRoZQotCSBvYmplY3QgZmlsZSBpcyBPUklHICsgT0ZGU0VULCB3aGVyZSBPUklHIGlzIHRoZSB2YWx1ZSBvZiB0aGUKLQkgY29tbW9uIHN5bWJvbCBhcyBzZWVuIGJ5IHRoZSBvYmplY3QgZmlsZSB3aGVuIGl0IHdhcyBjb21waWxlZAotCSAodGhpcyBtYXkgYmUgemVybyBpZiB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQpIGFuZCBPRkZTRVQgaXMKLQkgdGhlIG9mZnNldCBpbnRvIHRoZSBjb21tb24gc3ltYm9sIChub3JtYWxseSB6ZXJvLCBidXQgbWF5IGJlCi0JIG5vbi16ZXJvIHdoZW4gcmVmZXJyaW5nIHRvIGEgZmllbGQgaW4gYSBjb21tb24gc3RydWN0dXJlKS4KLQkgT1JJRyBpcyB0aGUgbmVnYXRpdmUgb2YgcmVsb2NfZW50cnktPmFkZGVuZCwgd2hpY2ggaXMgc2V0IGJ5Ci0JIHRoZSBDQUxDX0FEREVORCBtYWNybyBiZWxvdy4gIFdlIHdhbnQgdG8gcmVwbGFjZSB0aGUgdmFsdWUgaW4KLQkgdGhlIG9iamVjdCBmaWxlIHdpdGggTkVXICsgT0ZGU0VULCB3aGVyZSBORVcgaXMgdGhlIHZhbHVlIG9mCi0JIHRoZSBjb21tb24gc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwdXQgaW4gdGhlIGZpbmFsCi0JIG9iamVjdCBmaWxlLiAgTkVXIGlzIHN5bWJvbC0+dmFsdWUuICAqLwotICAgICAgZGlmZiA9IHN5bWJvbC0+dmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotI2Vsc2UKLSAgICAgIC8qIEluIFBFIG1vZGUsIHdlIGRvIG5vdCBvZmZzZXQgdGhlIGNvbW1vbiBzeW1ib2wuICAqLwotICAgICAgZGlmZiA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBhbHdheXMgZWZmZWN0aXZlbHkKLQkgaWdub3JlcyB0aGUgYWRkZW5kIGZvciBhIENPRkYgdGFyZ2V0IHdoZW4gcHJvZHVjaW5nCi0JIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGlzIHNlZW1zIHRvIGJlIGFsd2F5cyB3cm9uZyBmb3IgMzg2Ci0JIENPRkYsIHNvIHdlIGhhbmRsZSB0aGUgYWRkZW5kIGhlcmUgaW5zdGVhZC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgLyogRklYTUU6IEhvdyBzaG91bGQgdGhpcyBjYXNlIGJlIGhhbmRsZWQ/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmhvd3RvLT50eXBlID09IFJfSU1BR0VCQVNFKQotICAgIGRpZmYgLT0gcGVfZGF0YSAob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0jZW5kaWYKLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyBkaWZmKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgICBpZiAoZGlmZiAhPSAwKQotICAgICAgewotCXJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotCXVuc2lnbmVkIGNoYXIgKmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLQlzd2l0Y2ggKGhvd3RvLT5zaXplKQotCSAgewotCSAgY2FzZSAwOgotCSAgICB7Ci0JICAgICAgY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDE6Ci0JICAgIHsKLQkgICAgICBzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMjoKLQkgICAgewotCSAgICAgIGxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBkZWZhdWx0OgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLSAgICAgIH0KLQotICAvKiBOb3cgbGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZmluaXNoIGV2ZXJ5dGhpbmcgdXAuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0KLS8qIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBzaG91bGQgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jCi0gICBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gaW5fcmVsb2NfcCBQQVJBTVMgKChiZmQgKiwgcmVsb2NfaG93dG9fdHlwZSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AgKGFiZmQsIGhvd3RvKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiAhIGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBSX0lNQUdFQkFTRTsKLX0KLQotI2VuZGlmIC8qIENPRkZfV0lUSF9QRSAqLwotCi0jaWZuZGVmIFBDUkVMT0ZGU0VUCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIGZhbHNlCi0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9Ci17Ci0gIEVNUFRZX0hPV1RPICgwKSwKLSAgRU1QVFlfSE9XVE8gKDEpLAotICBFTVBUWV9IT1dUTyAoMiksCi0gIEVNUFRZX0hPV1RPICgzKSwKLSAgRU1QVFlfSE9XVE8gKDQpLAotICBFTVBUWV9IT1dUTyAoNSksCi0gIEhPV1RPIChSX0RJUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJkaXIzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIFBFIElNQUdFX1JFTF9JMzg2X0RJUjMyTkIgcmVsb2NhdGlvbiAoNykuCSovCi0gIEhPV1RPIChSX0lNQUdFQkFTRSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicnZhMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBFTVBUWV9IT1dUTyAoMDEwKSwKLSAgRU1QVFlfSE9XVE8gKDAxMSksCi0gIEVNUFRZX0hPV1RPICgwMTIpLAotICBFTVBUWV9IT1dUTyAoMDEzKSwKLSAgRU1QVFlfSE9XVE8gKDAxNCksCi0gIEVNUFRZX0hPV1RPICgwMTUpLAotICBFTVBUWV9IT1dUTyAoMDE2KSwKLSAgLyogQnl0ZSByZWxvY2F0aW9uICgwMTcpLiAgKi8KLSAgSE9XVE8gKFJfUkVMQllURSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICI4IiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIDE2LWJpdCB3b3JkIHJlbG9jYXRpb24gKDAyMCkuICAqLwotICBIT1dUTyAoUl9SRUxXT1JELAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICIxNiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiAzMi1iaXQgbG9uZ3dvcmQgcmVsb2NhdGlvbiAoMDIxKS4JKi8KLSAgSE9XVE8gKFJfUkVMTE9ORywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiMzIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogQnl0ZSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uICgwMjIpLgkgKi8KLSAgSE9XVE8gKFJfUENSQllURSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJESVNQOCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIDE2LWJpdCB3b3JkIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gKDAyMykuCSovCi0gIEhPV1RPIChSX1BDUldPUkQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkRJU1AxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIC8qIDMyLWJpdCBsb25nd29yZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uICgwMjQpLiAgKi8KLSAgSE9XVE8gKFJfUENSTE9ORywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiRElTUDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBQQ1JFTE9GRlNFVCkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIEkzODZCQURNQUcoeCkKLSNkZWZpbmUgSTM4NiAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkJCQkJCVwKLSAgKChjYWNoZV9wdHIpLT5ob3d0byA9CQkJCQkJCVwKLSAgICgoZHN0KS0+cl90eXBlIDwgc2l6ZW9mIChob3d0b190YWJsZSkgLyBzaXplb2YgKGhvd3RvX3RhYmxlWzBdKQlcCi0gICAgPyBob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGUJCQkJCVwKLSAgICA6IE5VTEwpKQotCi0vKiBGb3IgMzg2IENPRkYgYSBTVFlQX05PTE9BRCB8IFNUWVBfQlNTIHNlY3Rpb24gaXMgcGFydCBvZiBhIHNoYXJlZAotICAgbGlicmFyeS4gIE9uIHNvbWUgb3RoZXIgQ09GRiB0YXJnZXRzIFNUWVBfQlNTIGlzIG5vcm1hbGx5Ci0gICBTVFlQX05PTE9BRC4gICovCi0jZGVmaW5lIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLQotLyogQ29tcHV0ZSB0aGUgYWRkZW5kIG9mIGEgcmVsb2MuICBJZiB0aGUgcmVsb2MgaXMgdG8gYSBjb21tb24gc3ltYm9sLAotICAgdGhlIG9iamVjdCBmaWxlIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4gIEJ5IHRoZQotICAgdGltZSB0aGlzIGlzIGNhbGxlZCwgdGhlIGxpbmtlciBtYXkgYmUgdXNpbmcgYSBkaWZmZXJlbnQgc3ltYm9sCi0gICBmcm9tIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuICBUaGVyZWZvcmUsIHdlCi0gICBoYWNrIHdpbGRseSB0byBsb2NhdGUgdGhlIG9yaWdpbmFsIHN5bWJvbCBmcm9tIHRoaXMgZmlsZSBzbyB0aGF0IHdlCi0gICBjYW4gbWFrZSB0aGUgY29ycmVjdCBhZGp1c3RtZW50LiAgVGhpcyBtYWNybyBzZXRzIGNvZmZzeW0gdG8gdGhlCi0gICBzeW1ib2wgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSwgYW5kIHVzZXMgaXQgdG8gc2V0IHRoZSBhZGRlbmQgdmFsdWUKLSAgIGNvcnJlY3RseS4gIElmIHRoaXMgaXMgbm90IGEgY29tbW9uIHN5bWJvbCwgdGhlIHVzdWFsIGFkZGVuZAotICAgY2FsY3VsYXRpb24gaXMgZG9uZSwgZXhjZXB0IHRoYXQgYW4gYWRkaXRpb25hbCB0d2VhayBpcyBuZWVkZWQgZm9yCi0gICBQQyByZWxhdGl2ZSByZWxvY3MuCi0gICBGSVhNRTogVGhpcyBtYWNybyByZWZlcnMgdG8gc3ltYm9scyBhbmQgYXNlY3Q7IHRoZXNlIGFyZSBmcm9tIHRoZQotICAgY2FsbGluZyBmdW5jdGlvbiwgbm90IHRoZSBtYWNybyBhcmd1bWVudHMuICAqLwotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikJCVwKLSAgewkJCQkJCQkJXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwlcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkJCQlcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKQkJCQlcCi0JICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsJCVwKLSAgICBlbHNlIGlmIChwdHIpCQkJCQkJXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7CQkJXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwJCQlcCi0JJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlOwlcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkCQlcCi0JICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7CVwKLSAgICBlbHNlCQkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsJCQkJCVwKLSAgICBpZiAocHRyICYmIGhvd3RvX3RhYmxlW3JlbG9jLnJfdHlwZV0ucGNfcmVsYXRpdmUpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCArPSBhc2VjdC0+dm1hOwkJCQlcCi0gIH0KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIuICBGb3Igbm9ybWFsIGkzODYgQ09GRiwgd2UKLSAgIGNhbiB1c2UgdGhlIGdlbmVyaWMgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgRm9yIFBFLCB3ZSBuZWVkIG91cgotICAgb3duIHJvdXRpbmUuICAqLwotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCi0KLSNlbHNlIC8qIENPRkZfV0lUSF9QRSAqLwotCi0vKiBUaGUgUEUgcmVsb2NhdGUgc2VjdGlvbiByb3V0aW5lLiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMKLSAgIGFuZCB0aGUgcmVndWxhciByb3V0aW5lIGlzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyBmb3IgYQotICAgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BlX2kzODZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbG9jcywgc3ltcywKLQkJCSAgICAgICBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsCi0JCQkJCSAgICAgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucyk7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCi0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotLyogQ29udmVydCBhbiBydHlwZSB0byBob3d0byBmb3IgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX2kzODZfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIGlmIChyZWwtPnJfdHlwZSA+IHNpemVvZiAoaG93dG9fdGFibGUpIC8gc2l6ZW9mIChob3d0b190YWJsZVswXSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaG93dG8gPSBob3d0b190YWJsZSArIHJlbC0+cl90eXBlOwotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gIC8qIENhbmNlbCBvdXQgY29kZSBpbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgKmFkZGVuZHAgPSAwOwotI2VuZGlmCi0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICAqYWRkZW5kcCArPSBzZWMtPnZtYTsKLQotICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtID09IDAgJiYgc3ltLT5uX3ZhbHVlICE9IDApCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgc2VjdGlvbiBjb250ZW50cyBpbmNsdWRlIHRoZQotCSBzaXplIChzeW0tPm5fdmFsdWUpIGFzIGFuIGFkZGVuZC4gIFRoZSByZWxvY2F0ZV9zZWN0aW9uCi0JIGZ1bmN0aW9uIHdpbGwgYmUgYWRkaW5nIGluIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgV2UKLQkgbmVlZCB0byBzdWJ0cmFjdCBvdXQgdGhlIGN1cnJlbnQgc2l6ZSBpbiBvcmRlciB0byBnZXQgdGhlCi0JIGNvcnJlY3QgcmVzdWx0LiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIC8qIEkgdGhpbmsgd2UgKmRvKiB3YW50IHRvIGJ5cGFzcyB0aGlzLiAgSWYgd2UgZG9uJ3QsIEkgaGF2ZQotCSBzZWVuIHNvbWUgZGF0YSBwYXJhbWV0ZXJzIGdldCB0aGUgd3JvbmcgcmVsb2NhdGlvbiBhZGRyZXNzLgotCSBJZiBJIGxpbmsgdHdvIHZlcnNpb25zIHdpdGggYW5kIHdpdGhvdXQgdGhpcyBzZWN0aW9uIGJ5cGFzc2VkCi0JIGFuZCB0aGVuIGRvIGEgYmluYXJ5IGNvbXBhcmlzb24sIHRoZSBhZGRyZXNzZXMgd2hpY2ggYXJlCi0JIGRpZmZlcmVudCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBtYXAuICBUaGUgY2FzZSBpbiB3aGljaAotCSB0aGlzIHNlY3Rpb24gaGFzIGJlZW4gYnlwYXNzZWQgaGFzIGFkZHJlc3NlcyB3aGljaCBjb3JyZXNwb25kCi0JIHRvIHZhbHVlcyBJIGNhbiBmaW5kIGluIHRoZSBtYXAuICAqLwotICAgICAgKmFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotI2VuZGlmCi0gICAgfQotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAvKiBJZiB0aGUgb3V0cHV0IHN5bWJvbCBpcyBjb21tb24gKGluIHdoaWNoIGNhc2UgdGhpcyBtdXN0IGJlIGEKLSAgICAgcmVsb2NhdGVhYmxlIGxpbmspLCB3ZSBuZWVkIHRvIGFkZCBpbiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUKLSAgICAgY29tbW9uIHN5bWJvbC4gICovCi0gIGlmIChoICE9IE5VTEwgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgICphZGRlbmRwIC09IDQ7Ci0KLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZ2VuZXJpYyBjb2RlIGlzIGdvaW5nIHRvCi0gICAgICAgICBhZGQgYmFjayB0aGUgc3ltYm9sIHZhbHVlIGluIG9yZGVyIHRvIGNhbmNlbCBvdXQgYW4KLSAgICAgICAgIGFkanVzdG1lbnQgaXQgbWFkZSB0byB0aGUgYWRkZW5kLiAgSG93ZXZlciwgd2Ugc2V0IHRoZSBhZGRlbmQKLSAgICAgICAgIHRvIDAgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb24uICBXZSBuZWVkIHRvIGFkanVzdCBoZXJlLAotICAgICAgICAgdG8gYXZvaWQgdGhlIGFkanVzdG1lbnQgdGhlIGdlbmVyaWMgY29kZSB3aWxsIG1ha2UuICBGSVhNRToKLSAgICAgICAgIFRoaXMgaXMgZ2V0dGluZyBhIGJpdCBoYWNraXNoLiAgKi8KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQkqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0gICAgfQotCi0gIGlmIChyZWwtPnJfdHlwZSA9PSBSX0lNQUdFQkFTRSkKLSAgICB7Ci0gICAgICAqYWRkZW5kcCAtPSBwZV9kYXRhKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gaG93dG87Ci19Ci0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgY29mZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX1JWQToKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArIFJfSU1BR0VCQVNFOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgcmV0dXJuIGhvd3RvX3RhYmxlICsgUl9ESVIzMjsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArIFJfUENSTE9ORzsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArIFJfUkVMV09SRDsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArIFJfUENSV09SRDsKLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgICAgcmV0dXJuIGhvd3RvX3RhYmxlICsgUl9SRUxCWVRFOwotICAgIGNhc2UgQkZEX1JFTE9DXzhfUENSRUw6Ci0gICAgICByZXR1cm4gaG93dG9fdGFibGUgKyBSX1BDUkJZVEU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJGRF9GQUlMICgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvCi0KLSNpZmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotCi0vKiBJZiBpMzg2IGdjYyB1c2VzIHVuZGVyc2NvcmVzIGZvciBzeW1ib2wgbmFtZXMsIHRoZW4gaXQgZG9lcyBub3QgdXNlCi0gICBhIGxlYWRpbmcgZG90IGZvciBsb2NhbCBsYWJlbHMsIHNvIGlmIFRBUkdFVF9VTkRFUlNDT1JFIGlzIGRlZmluZWQKLSAgIHdlIHRyZWF0IGFsbCBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggTCBhcyBsb2NhbC4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICdMJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgY29mZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUKLQotI2VuZGlmIC8qIFRBUkdFVF9VTkRFUlNDT1JFICovCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1pM2NvZmZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgLyogV2UgbmVlZCB0byBoYWNrIGJhZGx5IHRvIGhhbmRsZSBhIFBFIGltYWdlIGNvcnJlY3RseS4gIEluIFBFCi0gICAgIGltYWdlcyBjcmVhdGVkIGJ5IHRoZSBHTlUgbGlua2VyLCB0aGUgb2Zmc2V0IHRvIHRoZSBDT0ZGIGhlYWRlcgotICAgICBpcyBhbHdheXMgdGhlIHNpemUuICBIb3dldmVyLCB0aGlzIGlzIG5vdCB0aGUgY2FzZSBpbiBpbWFnZXMKLSAgICAgZ2VuZXJhdGVkIGJ5IG90aGVyIFBFIGxpbmtlcnMuICBUaGUgUEUgZm9ybWF0IHN0b3JlcyBhIGZvdXIgYnl0ZQotICAgICBvZmZzZXQgdG8gdGhlIFBFIHNpZ25hdHVyZSBqdXN0IGJlZm9yZSB0aGUgQ09GRiBoZWFkZXIgYXQKLSAgICAgbG9jYXRpb24gMHgzYyBvZiB0aGUgZmlsZS4gIFdlIHBpY2sgdXAgdGhhdCBvZmZzZXQsIHZlcmlmeSB0aGF0Ci0gICAgIHRoZSBQRSBzaWduYXR1cmUgaXMgdGhlcmUsIGFuZCB0aGVuIHNldCBvdXJzZWx2ZXMgdXAgdG8gcmVhZCBpbgotICAgICB0aGUgQ09GRiBoZWFkZXIuICAqLwotICB7Ci0gICAgYmZkX2J5dGUgZXh0X29mZnNldFs0XTsKLSAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgYmZkX2J5dGUgZXh0X3NpZ25hdHVyZVs0XTsKLSAgICB1bnNpZ25lZCBsb25nIHNpZ25hdHVyZTsKLQotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgMHgzYywgU0VFS19TRVQpICE9IDAKLQl8fCBiZmRfcmVhZCAoZXh0X29mZnNldCwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICAgIHsKLQlpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICBvZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dF9vZmZzZXQpOwotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCXx8IGJmZF9yZWFkIChleHRfc2lnbmF0dXJlLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgICAgewotCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIHNpZ25hdHVyZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0X3NpZ25hdHVyZSk7Ci0KLSAgICBpZiAoc2lnbmF0dXJlICE9IDB4NDU1MCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLQotICAgIC8qIEhlcmUgaXMgdGhlIGhhY2suICBjb2ZmX29iamVjdF9wIHdhbnRzIHRvIHJlYWQgZmlsaHN6IGJ5dGVzIHRvCi0gICAgICAgcGljayB1cCB0aGUgQ09GRiBoZWFkZXIuICBXZSBhZGp1c3Qgc28gdGhhdCB0aGF0IHdpbGwgd29yay4gIDIwCi0gICAgICAgaXMgdGhlIHNpemUgb2YgdGhlIGkzODYgQ09GRiBmaWxlaGRyLiAgKi8KLQotICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAoYmZkX3RlbGwgKGFiZmQpCi0JCSAgIC0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKQotCQkgICArIDIwKSwKLQkJICBTRUVLX1NFVCkKLQkhPSAwKQotICAgICAgewotCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gY29mZl9vYmplY3RfcCAoYWJmZCk7Ci19Ci0KLWNvbnN0IGJmZF90YXJnZXQKLSNpZmRlZiBUQVJHRVRfU1lNCi0gIFRBUkdFVF9TWU0gPQotI2Vsc2UKLSAgaTM4NmNvZmZfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgImNvZmYtaTM4NiIsCQkJLyogbmFtZSAqLwotI2VuZGlmCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICB8IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTCi0jZW5kaWYKLSAgIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0KLSNpZmRlZiBUQVJHRVRfVU5ERVJTQ09SRQotICBUQVJHRVRfVU5ERVJTQ09SRSwJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotI2Vsc2UKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZW5kaWYKLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotLyogTm90ZSB0aGF0IHdlIGFsbG93IGFuIG9iamVjdCBmaWxlIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb3JlIGZpbGUgYXMgd2VsbC4gKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIGkzY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgaTNjb2ZmX29iamVjdF9wfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0KLSAgQ09GRl9TV0FQX1RBQkxFCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaTg2MC5jIGIvYmZkL2NvZmYtaTg2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjNiYjVmLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWk4NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDg2MCBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDcmVhdGVkIG1vc3RseSBieSBzdWJzdGl0dXRpbmcgIjg2MCIgZm9yICIzODYiIGluIGNvZmYtaTM4Ni5jCi0gICBIYXJyeSBEb2xhbiA8ZG9sYW5Ac3NkLmludGVsLmNvbT4sIE9jdG9iZXIgMTk5NQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImNvZmYvaTg2MC5oIgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfaTg2MF9yZWxvYyAKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9pODYwX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLS8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLwotCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotCi0vKiBGb3Igc29tZSByZWFzb24gd2hlbiB1c2luZyBpODYwIENPRkYgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgLnRleHQKLSAgIHNlY3Rpb24gZm9yIGEgcmVmZXJlbmNlIHRvIGEgY29tbW9uIHN5bWJvbCBpcyB0aGUgdmFsdWUgaXRzZWxmIHBsdXMKLSAgIGFueSBkZXNpcmVkIG9mZnNldC4gIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LiAgKi8KLQotLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBuZWVkIHRvIGRvIHNvbWUKLSAgIGFkanVzdG1lbnRzIHRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IGFyZSBub3QgZG9uZSBieSB0aGUKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBldmVyeQotICAgcmVsb2MgdHlwZSB0byBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50cy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfaTg2MF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ltdmFsdWUgZGlmZjsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgLyogV2UgYXJlIHJlbG9jYXRpbmcgYSBjb21tb24gc3ltYm9sLiAgVGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlCi0JIG9iamVjdCBmaWxlIGlzIE9SSUcgKyBPRkZTRVQsIHdoZXJlIE9SSUcgaXMgdGhlIHZhbHVlIG9mIHRoZQotCSBjb21tb24gc3ltYm9sIGFzIHNlZW4gYnkgdGhlIG9iamVjdCBmaWxlIHdoZW4gaXQgd2FzIGNvbXBpbGVkCi0JICh0aGlzIG1heSBiZSB6ZXJvIGlmIHRoZSBzeW1ib2wgd2FzIHVuZGVmaW5lZCkgYW5kIE9GRlNFVCBpcwotCSB0aGUgb2Zmc2V0IGludG8gdGhlIGNvbW1vbiBzeW1ib2wgKG5vcm1hbGx5IHplcm8sIGJ1dCBtYXkgYmUKLQkgbm9uLXplcm8gd2hlbiByZWZlcnJpbmcgdG8gYSBmaWVsZCBpbiBhIGNvbW1vbiBzdHJ1Y3R1cmUpLgotCSBPUklHIGlzIHRoZSBuZWdhdGl2ZSBvZiByZWxvY19lbnRyeS0+YWRkZW5kLCB3aGljaCBpcyBzZXQgYnkKLQkgdGhlIENBTENfQURERU5EIG1hY3JvIGJlbG93LiAgV2Ugd2FudCB0byByZXBsYWNlIHRoZSB2YWx1ZSBpbgotCSB0aGUgb2JqZWN0IGZpbGUgd2l0aCBORVcgKyBPRkZTRVQsIHdoZXJlIE5FVyBpcyB0aGUgdmFsdWUgb2YKLQkgdGhlIGNvbW1vbiBzeW1ib2wgd2hpY2ggd2UgYXJlIGdvaW5nIHRvIHB1dCBpbiB0aGUgZmluYWwKLQkgb2JqZWN0IGZpbGUuICBORVcgaXMgc3ltYm9sLT52YWx1ZS4gICovCi0gICAgICBkaWZmID0gc3ltYm9sLT52YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRm9yIHNvbWUgcmVhc29uIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gYWx3YXlzIGVmZmVjdGl2ZWx5Ci0JIGlnbm9yZXMgdGhlIGFkZGVuZCBmb3IgYSBDT0ZGIHRhcmdldCB3aGVuIHByb2R1Y2luZwotCSByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhpcyBzZWVtcyB0byBiZSBhbHdheXMgd3JvbmcgZm9yIDg2MAotCSBDT0ZGLCBzbyB3ZSBoYW5kbGUgdGhlIGFkZGVuZCBoZXJlIGluc3RlYWQuICAqLwotICAgICAgZGlmZiA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgfQotCi0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgZGlmZikgJiBob3d0by0+ZHN0X21hc2spKQotCi0gICAgaWYgKGRpZmYgIT0gMCkKLSAgICAgIHsKLQlyZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLQl1bnNpZ25lZCBjaGFyICphZGRyID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0Jc3dpdGNoIChob3d0by0+c2l6ZSkKLQkgIHsKLQkgIGNhc2UgMDoKLQkgICAgewotCSAgICAgIGNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAxOgotCSAgICB7Ci0JICAgICAgc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDI6Ci0JICAgIHsKLQkgICAgICBsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzMyIChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgZGVmYXVsdDoKLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0gICAgICB9Ci0KLSAgLyogTm93IGxldCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZpbmlzaCBldmVyeXRoaW5nIHVwLiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotI2lmbmRlZiBQQ1JFTE9GRlNFVAotI2RlZmluZSBQQ1JFTE9GRlNFVCBmYWxzZQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAgRU1QVFlfSE9XVE8gKDApLAotICBFTVBUWV9IT1dUTyAoMSksCi0gIEVNUFRZX0hPV1RPICgyKSwKLSAgRU1QVFlfSE9XVE8gKDMpLAotICBFTVBUWV9IT1dUTyAoNCksCi0gIEVNUFRZX0hPV1RPICg1KSwKLSAgSE9XVE8gKFJfRElSMzIsICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLCAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJkaXIzMiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogezd9LCAqLwotICBIT1dUTyAoUl9JTUFHRUJBU0UsICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLCAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJydmEzMiIsCSAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIEVNUFRZX0hPV1RPICgwMTApLAotICBFTVBUWV9IT1dUTyAoMDExKSwKLSAgRU1QVFlfSE9XVE8gKDAxMiksCi0gIEVNUFRZX0hPV1RPICgwMTMpLAotICBFTVBUWV9IT1dUTyAoMDE0KSwKLSAgRU1QVFlfSE9XVE8gKDAxNSksCi0gIEVNUFRZX0hPV1RPICgwMTYpLAotICBIT1dUTyAoUl9SRUxCWVRFLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDgsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiOCIsCQkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1JFTFdPUkQsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiMTYiLAkJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9SRUxMT05HLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIjMyIiwJCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUENSQllURSwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSA4LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkRJU1A4IiwJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9QQ1JXT1JELAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkRJU1AxNiIsCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUENSTE9ORywJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJESVNQMzIiLAkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgIG51bm1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeyB4LnJfdHlwZSA9IGhvd3RvLT50eXBlOyB9Ci0jZGVmaW5lIEJBRE1BRyh4KSBJODYwQkFETUFHKHgpCi0jZGVmaW5lIEk4NjAgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKLQkgICAgKGNhY2hlX3B0ciktPmhvd3RvID0gaG93dG9fdGFibGUgKyAoZHN0KS0+cl90eXBlOwotCi0vKiBGb3IgODYwIENPRkYgYSBTVFlQX05PTE9BRCB8IFNUWVBfQlNTIHNlY3Rpb24gaXMgcGFydCBvZiBhIHNoYXJlZAotICAgbGlicmFyeS4gIE9uIHNvbWUgb3RoZXIgQ09GRiB0YXJnZXRzIFNUWVBfQlNTIGlzIG5vcm1hbGx5Ci0gICBTVFlQX05PTE9BRC4gICovCi0jZGVmaW5lIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLQotLyogQ29tcHV0ZSB0aGUgYWRkZW5kIG9mIGEgcmVsb2MuICBJZiB0aGUgcmVsb2MgaXMgdG8gYSBjb21tb24gc3ltYm9sLAotICAgdGhlIG9iamVjdCBmaWxlIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4gIEJ5IHRoZQotICAgdGltZSB0aGlzIGlzIGNhbGxlZCwgdGhlIGxpbmtlciBtYXkgYmUgdXNpbmcgYSBkaWZmZXJlbnQgc3ltYm9sCi0gICBmcm9tIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuICBUaGVyZWZvcmUsIHdlCi0gICBoYWNrIHdpbGRseSB0byBsb2NhdGUgdGhlIG9yaWdpbmFsIHN5bWJvbCBmcm9tIHRoaXMgZmlsZSBzbyB0aGF0IHdlCi0gICBjYW4gbWFrZSB0aGUgY29ycmVjdCBhZGp1c3RtZW50LiAgVGhpcyBtYWNybyBzZXRzIGNvZmZzeW0gdG8gdGhlCi0gICBzeW1ib2wgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSwgYW5kIHVzZXMgaXQgdG8gc2V0IHRoZSBhZGRlbmQgdmFsdWUKLSAgIGNvcnJlY3RseS4gIElmIHRoaXMgaXMgbm90IGEgY29tbW9uIHN5bWJvbCwgdGhlIHVzdWFsIGFkZGVuZAotICAgY2FsY3VsYXRpb24gaXMgZG9uZSwgZXhjZXB0IHRoYXQgYW4gYWRkaXRpb25hbCB0d2VhayBpcyBuZWVkZWQgZm9yCi0gICBQQyByZWxhdGl2ZSByZWxvY3MuCi0gICBGSVhNRTogVGhpcyBtYWNybyByZWZlcnMgdG8gc3ltYm9scyBhbmQgYXNlY3Q7IHRoZXNlIGFyZSBmcm9tIHRoZQotICAgY2FsbGluZyBmdW5jdGlvbiwgbm90IHRoZSBtYWNybyBhcmd1bWVudHMuICAqLwotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikJCVwKLSAgewkJCQkJCQkJXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwlcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkJCQlcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKQkJCQlcCi0JICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsJCVwKLSAgICBlbHNlIGlmIChwdHIpCQkJCQkJXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7CQkJXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwJCQlcCi0JJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlOwlcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkCQlcCi0JICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7CVwKLSAgICBlbHNlCQkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsJCQkJCVwKLSAgICBpZiAocHRyICYmIGhvd3RvX3RhYmxlW3JlbG9jLnJfdHlwZV0ucGNfcmVsYXRpdmUpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCArPSBhc2VjdC0+dm1hOwkJCQlcCi0gIH0KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX2k4NjBfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0KLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgaG93dG8gPSBob3d0b190YWJsZSArIHJlbC0+cl90eXBlOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSA9PSAwICYmIHN5bS0+bl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgVGhlIHNlY3Rpb24gY29udGVudHMgaW5jbHVkZSB0aGUKLQkgc2l6ZSAoc3ltLT5uX3ZhbHVlKSBhcyBhbiBhZGRlbmQuICBUaGUgcmVsb2NhdGVfc2VjdGlvbgotCSBmdW5jdGlvbiB3aWxsIGJlIGFkZGluZyBpbiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdlCi0JIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBjdXJyZW50IHNpemUgaW4gb3JkZXIgdG8gZ2V0IHRoZQotCSBjb3JyZWN0IHJlc3VsdC4gICovCi0gCi0gICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCi0KLSAgICAgIC8qIEkgdGhpbmsgd2UgKmRvKiB3YW50IHRvIGJ5cGFzcyB0aGlzLiAgSWYgd2UgZG9uJ3QsIEkgaGF2ZSBzZWVuIHNvbWUgZGF0YQotCSBwYXJhbWV0ZXJzIGdldCB0aGUgd3JvbmcgcmVsY2F0aW9uIGFkZHJlc3MuICBJZiBJIGxpbmsgdHdvIHZlcnNpb25zCi0JIHdpdGggYW5kIHdpdGhvdXQgdGhpcyBzZWN0aW9uIGJ5cGFzc2VkIGFuZCB0aGVuIGRvIGEgYmluYXJ5IGNvbXBhcmlzb24sCi0JIHRoZSBhZGRyZXNzZXMgd2hpY2ggYXJlIGRpZmZlcmVudCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBtYXAuICBUaGUgCi0JIGNhc2UgaW4gd2hpY2ggdGhpcyBzZWN0aW9uIGhhcyBiZWVuIGJ5cGFzc2VkIGhhcyBhZGRyZXNzZXMgd2hpY2ggY29ycmVzcG9uZAotCSB0byB2YWx1ZXMgSSBjYW4gZmluZCBpbiB0aGUgbWFwICovCi0gICAgICAqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBvdXRwdXQgc3ltYm9sIGlzIGNvbW1vbiAoaW4gd2hpY2ggY2FzZSB0aGlzIG11c3QgYmUgYQotICAgICByZWxvY2F0ZWFibGUgbGluayksIHdlIG5lZWQgdG8gYWRkIGluIHRoZSBmaW5hbCBzaXplIG9mIHRoZQotICAgICBjb21tb24gc3ltYm9sLiAgKi8KLSAgaWYgKGggIT0gTlVMTCAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pIAotICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7Ci0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl9pODYwX3J0eXBlX3RvX2hvd3RvCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1pM2NvZmZfb2JqZWN0X3AoYSkKLSAgICAgYmZkICphOwotewotICByZXR1cm4gY29mZl9vYmplY3RfcChhKTsKLX0KLQotY29uc3QgYmZkX3RhcmdldAotI2lmZGVmIFRBUkdFVF9TWU0KLSAgVEFSR0VUX1NZTSA9Ci0jZWxzZQotICBpODYwY29mZl92ZWMgPQotI2VuZGlmCi17Ci0jaWZkZWYgVEFSR0VUX05BTUUKLSAgVEFSR0VUX05BTUUsCi0jZWxzZQotICAiY29mZi1pODYwIiwJCQkvKiBuYW1lICovCi0jZW5kaWYKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgaTNjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBpM2NvZmZfb2JqZWN0X3B9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIENPRkZfU1dBUF9UQUJMRQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWk5NjAuYyBiL2JmZC9jb2ZmLWk5NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3ZWJmYi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1pOTYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCA5NjAgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEk5NjAgMQotI2RlZmluZSBCQURNQUcoeCkgSTk2MEJBRE1BRyh4KQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pOTYwLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIJCS8qIHRvIGFsbG93IGVhc2llciBhYnN0cmFjdGlvbi1icmVha2luZyAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG9wdGNhbGxfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfaTk2MF9yZWxvY2F0ZQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9pOTYwX3N0YXJ0X2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9pOTYwX2FkanVzdF9zeW1uZHgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBib29sZWFuICopKTsKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0jZGVmaW5lIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgMQotCi0jZGVmaW5lIEdFVF9TQ05IRFJfQUxJR04gYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFBVVF9TQ05IRFJfQUxJR04gYmZkX2hfcHV0XzMyCi0KLS8qIFRoZSBpOTYwIGRvZXMgbm90IHN1cHBvcnQgYW4gTU1VLCBzbyBDT0ZGX1BBR0VfU0laRSBjYW4gYmUKLSAgIGFyYml0cmFyaWx5IHNtYWxsLiAgKi8KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMQotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotLyogVGhpcyBzZXQgb2YgbG9jYWwgbGFiZWwgbmFtZXMgaXMgdGFrZW4gZnJvbSBnYXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9pOTYwX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gKG5hbWVbMF0gPT0gJ0wnCi0JICB8fCAobmFtZVswXSA9PSAnLicKLQkgICAgICAmJiAobmFtZVsxXSA9PSAnQycKLQkJICB8fCBuYW1lWzFdID09ICdJJwotCQkgIHx8IG5hbWVbMV0gPT0gJy4nKSkpOwotfQotCi0vKiBUaGlzIGlzIGp1c3QgbGlrZSB0aGUgdXN1YWwgQ0FMQ19BRERFTkQsIGJ1dCBpdCBpbmNsdWRlcyB0aGUKLSAgIHNlY3Rpb24gVk1BIGZvciBQQyByZWxhdGl2ZSByZWxvY3MuICAqLwotI2lmbmRlZiBDQUxDX0FEREVORAotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7ICAgICAgXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7ICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsgICBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAocHRyICYmIChyZWxvYy5yX3R5cGUgPT0gMjUgfHwgcmVsb2Mucl90eXBlID09IDI3KSkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgKz0gYXNlY3QtPnZtYTsJCQkJXAotICB9Ci0jZW5kaWYKLQotI2RlZmluZSBDQUxMUwkgMHg2NjAwMzgwMAkvKiBUZW1wbGF0ZSBmb3IgJ2NhbGxzJyBpbnN0cnVjdGlvbgkqLwotI2RlZmluZSBCQUwJIDB4MGIwMDAwMDAJLyogVGVtcGxhdGUgZm9yICdiYWwnIGluc3RydWN0aW9uCSovCi0jZGVmaW5lIEJBTF9NQVNLIDB4MDBmZmZmZmYKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLW9wdGNhbGxfY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogVGhpcyBpdGVtIGhhcyBhbHJlYWR5IGJlZW4gcmVsb2NhdGVkIGNvcnJlY3RseSwgYnV0IHdlIG1heSBiZQotICAgKiBhYmxlIHRvIHBhdGNoIGluIHlldCBiZXR0ZXIgY29kZSAtIGRvbmUgYnkgZGlnZ2luZyBvdXQgdGhlCi0gICAqIGNvcnJlY3QgaW5mbyBvbiB0aGlzIHN5bWJvbCAqLwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmVzdWx0OwotICBjb2ZmX3N5bWJvbF90eXBlICpjcyA9IGNvZmZzeW1ib2woc3ltYm9sX2luKTsKLQotICAvKiBEb24ndCBkbyBhbnl0aGluZyB3aXRoIHN5bWJvbHMgd2hpY2ggYXJlbid0IHRpZWQgdXAgeWV0LAotICAgICBleGNlcHQgbW92ZSB0aGUgcmVsb2MuICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGNzLT5zeW1ib2wuc2VjdGlvbikpIHsKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gIH0KLSAgICAKLSAgLyogU28gdGhlIHRhcmdldCBzeW1ib2wgaGFzIHRvIGJlIG9mIGNvZmYgdHlwZSwgYW5kIHRoZSBzeW1ib2wgCi0gICAgIGhhcyB0byBoYXZlIHRoZSBjb3JyZWN0IG5hdGl2ZSBpbmZvcm1hdGlvbiB3aXRoaW4gaXQgKi8KLSAgaWYgKChiZmRfYXN5bWJvbF9mbGF2b3VyKCZjcy0+c3ltYm9sKSAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICAgIHx8IChjcy0+bmF0aXZlID09IChjb21iaW5lZF9lbnRyeV90eXBlICopTlVMTCkpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBpbnRlcmVzdGluZywgY29uc2lkZXIgdGhlIGNhc2Ugd2hlcmUgd2UncmUgb3V0cHV0dGluZyBjb2ZmCi0JIGZyb20gYSBtaXggbiBtYXRjaCBpbnB1dCwgbGlua2luZyBmcm9tIGNvZmYgdG8gYSBzeW1ib2wgZGVmaW5lZCBpbiBhCi0JIGJvdXQgZmlsZSB3aWxsIGNhdXNlIHRoaXMgbWF0Y2ggdG8gYmUgdHJ1ZS4gU2hvdWxkIEkgY29tcGxhaW4/ICBUaGlzCi0JIHdpbGwgb25seSB3b3JrIGlmIHRoZSBib3V0IHN5bWJvbCBpcyBub24gbGVhZi4gICovCi0gICAgICAqZXJyb3JfbWVzc2FnZSA9Ci0JKGNoYXIgKikgXygidW5jZXJ0YWluIGNhbGxpbmcgY29udmVudGlvbiBmb3Igbm9uLUNPRkYgc3ltYm9sIik7Ci0gICAgICByZXN1bHQgPSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICBzd2l0Y2ggKGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzKSAKLSAgICAgIHsKLSAgICAgIGNhc2UgQ19MRUFGU1RBVDoKLSAgICAgIGNhc2UgQ19MRUFGRVhUOgotICAJLyogVGhpcyBpcyBhIGNhbGwgdG8gYSBsZWFmIHByb2NlZHVyZSwgcmVwbGFjZSBpbnN0cnVjdGlvbiB3aXRoIGEgYmFsCi0JICAgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb24uICAqLwotCXsKLQkgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4ID0gJigoY3MtPm5hdGl2ZSsyKS0+dS5hdXhlbnQpOwotCSAgaW50IHdvcmQgPSBiZmRfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKWRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0JICBpbnQgb2xmID0gKGF1eC0+eF9iYWwueF9iYWxudHJ5IC0gY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSk7Ci0JICBCRkRfQVNTRVJUKGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4PT0yKTsKLQotCSAgLyogV2UgcmVwbGFjZSB0aGUgb3JpZ2luYWwgY2FsbCBpbnN0cnVjdGlvbiB3aXRoIGEgYmFsIHRvCi0JICAgICB0aGUgYmFsIGVudHJ5IHBvaW50IC0gdGhlIG9mZnNldCBvZiB3aGljaCBpcyBkZXNjcmliZWQgaW4KLQkgICAgIHRoZSAybmQgYXV4ZW50IG9mIHRoZSBvcmlnaW5hbCBzeW1ib2wuIFdlIGtlZXAgdGhlIG5hdGl2ZQotCSAgICAgc3ltIGFuZCBhdXhlbnRzIHVudG91Y2hlZCwgc28gdGhlIGRlbHRhIGJldHdlZW4gdGhlIHR3bwotCSAgICAgaXMgdGhlIG9mZnNldCBvZiB0aGUgYmFsIGVudHJ5IHBvaW50LiAgKi8KLQkgIHdvcmQgPSAoKHdvcmQgKyAgb2xmKSAgJiBCQUxfTUFTSykgfCBCQUw7Ci0gIAkgIGJmZF9wdXRfMzIoYWJmZCwgd29yZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIAl9Ci0JcmVzdWx0ID0gYmZkX3JlbG9jX29rOwotCWJyZWFrOwotICAgICAgY2FzZSBDX1NDQUxMOgotCS8qIFRoaXMgaXMgYSBjYWxsIHRvIGEgc3lzdGVtIGNhbGwsIHJlcGxhY2Ugd2l0aCBhIGNhbGxzIHRvICMgKi8KLQlCRkRfQVNTRVJUKDApOwotCXJlc3VsdCA9IGJmZF9yZWxvY19vazsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JcmVzdWx0ID0gYmZkX3JlbG9jX29rOwotCWJyZWFrOwotICAgICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGk5NjAgQ09GRiBpcyB1c2VkIGJ5IFZ4V29ya3MgNS4xLiAgSG93ZXZlciwgVnhXb3JrcyA1LjEgZG9lcyBub3QKLSAgIGFwcGVhciB0byBjb3JyZWN0bHkgaGFuZGxlIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIHRoZQotICAgc2FtZSBvYmplY3QgZmlsZS4gIEl0IGFwcGVhcnMgdG8gc2ltcGx5IGRpc2NhcmQgc3VjaCByZWxvY3MsIHJhdGhlcgotICAgdGhhbiBhZGRpbmcgdGhlaXIgdmFsdWVzIGludG8gdGhlIG9iamVjdCBmaWxlLiAgV2UgaGFuZGxlIHRoaXMgaGVyZQotICAgYnkgY29udmVydGluZyBhbGwgcmVsb2NzIGFnYWluc3QgZGVmaW5lZCBzeW1ib2xzIGludG8gcmVsb2NzCi0gICBhZ2FpbnN0IHRoZSBzZWN0aW9uIHN5bWJvbCwgd2hlbiBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dAotICAgZmlsZS4KLQotICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgd2UgYXJlIG5vdCB1c2luZyB0aGUgQ09GRgotICAgc3BlY2lmaWMgYmFja2VuZCBsaW5rZXIuICBJdCBvbmx5IGRvZXMgc29tZXRoaW5nIHdoZW4gZG9pbmcgYQotICAgcmVsb2NhdGVhYmxlIGxpbmssIHdoaWNoIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBmYWlsIHdoZW4gbm90Ci0gICBnZW5lcmF0aW5nIENPRkYgaTk2MCBvdXRwdXQsIHNvIHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgbm8gbG9uZ2VyCi0gICB1c2VmdWwuICBJdCB3YXMgdXNlZCBiZWZvcmUgdGhpcyB0YXJnZXQgd2FzIGNvbnZlcnRlZCB0byB1c2UgdGhlCi0gICBDT0ZGIHNwZWNpZmljIGJhY2tlbmQgbGlua2VyLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWNvZmZfaTk2MF9yZWxvY2F0ZSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhc2VjdGlvbiAqb3NlYzsKLQotICBpZiAob3V0cHV0X2JmZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vdCBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZS4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bWJvbCkpKQotICAgIHsKLSAgICAgIC8qIFN5bWJvbCBpcyBub3QgZGVmaW5lZCwgc28gbm8gbmVlZCB0byB3b3JyeSBhYm91dCBpdC4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bWJvbCkpKQotICAgIHsKLSAgICAgIC8qIEkgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGUgcmlnaHQgYWN0aW9uIGlzIGZvciBhIGNvbW1vbgotICAgICAgICAgc3ltYm9sLiAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgfQotCi0gIC8qIENvbnZlcnQgdGhlIHJlbG9jIHRvIHVzZSB0aGUgc2VjdGlvbiBzeW1ib2wuICBGSVhNRTogVGhpcyBtZXRob2QKLSAgICAgaXMgcmlkaWN1bG91cy4gICovCi0gIG9zZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bWJvbCktPm91dHB1dF9zZWN0aW9uOwotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9iZmQsIG9zZWMpICE9IE5VTEwKLSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChvdXRwdXRfYmZkLCBvc2VjKS0+dGRhdGEgIT0gTlVMTCkKLSAgICByZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIgPQotICAgICAgKGFzeW1ib2wgKiopIGNvZmZfc2VjdGlvbl9kYXRhIChvdXRwdXRfYmZkLCBvc2VjKS0+dGRhdGE7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzZWNfbmFtZTsKLSAgICAgIGFzeW1ib2wgKipzeW1zLCAqKnN5bV9lbmQ7Ci0KLSAgICAgIHNlY19uYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIG9zZWMpOwotICAgICAgc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAob3V0cHV0X2JmZCk7Ci0gICAgICBzeW1fZW5kID0gc3ltcyArIGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOwotICAgICAgZm9yICg7IHN5bXMgPCBzeW1fZW5kOyBzeW1zKyspCi0JewotCSAgaWYgKGJmZF9hc3ltYm9sX25hbWUgKCpzeW1zKSAhPSBOVUxMCi0JICAgICAgJiYgKCpzeW1zKS0+dmFsdWUgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoKCpzeW1zKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsCi0JCQkgc2VjX25hbWUpID09IDApCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHN5bXMgPj0gc3ltX2VuZCkKLQlhYm9ydCAoKTsKLQotICAgICAgcmVsb2NfZW50cnktPnN5bV9wdHJfcHRyID0gc3ltczsKLQotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChvdXRwdXRfYmZkLCBvc2VjKSA9PSBOVUxMKQotCXsKLQkgIG9zZWMtPnVzZWRfYnlfYmZkID0KLQkgICAgKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSkpOwotCSAgaWYgKG9zZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JfQotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9iZmQsIG9zZWMpLT50ZGF0YSA9IChQVFIpIHN5bXM7Ci0gICAgfQotCi0gIC8qIExldCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGRvIGl0cyB0aGluZywgd2hpY2ggd2lsbCBpbmNsdWRlCi0gICAgIHN0dWZmaW5nIHRoZSBzeW1ib2wgYWRkZW5kIGludG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsbG9uZyA9Ci0gIEhPV1RPICgodW5zaWduZWQgaW50KSBSX1JFTExPTkcsIDAsIDIsIDMyLGZhbHNlLCAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgY29mZl9pOTYwX3JlbG9jYXRlLCJyZWxsb25nIiwgdHJ1ZSwKLQkgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMCk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19pcHJtZWQgPQotICBIT1dUTyAoUl9JUFJNRUQsIDAsIDIsIDI0LHRydWUsMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCSBjb2ZmX2k5NjBfcmVsb2NhdGUsICJpcHJtZWQgIiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgMCk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19vcHRjYWxsID0KLSAgSE9XVE8gKFJfT1BUQ0FMTCwgMCwyLDI0LHRydWUsMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCSBvcHRjYWxsX2NhbGxiYWNrLCAib3B0Y2FsbCIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIDApOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSTk2MF9DQUxMSjoKLSAgICAgIHJldHVybiAmaG93dG9fb3B0Y2FsbDsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgcmV0dXJuICZob3d0b19yZWxsb25nOwotICAgIGNhc2UgQkZEX1JFTE9DXzI0X1BDUkVMOgotICAgICAgcmV0dXJuICZob3d0b19pcHJtZWQ7Ci0gICAgfQotfQotCi0vKiBUaGUgcmVhbCBjb2RlIGlzIGluIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotewkJCQkJCQlcCi0gICByZWxvY19ob3d0b190eXBlICpob3d0b19wdHI7CQkJCVwKLSAgIHN3aXRjaCAoKGRzdCktPnJfdHlwZSkgewkJCQlcCi0gICAgIGNhc2UgMTc6IGhvd3RvX3B0ciA9ICZob3d0b19yZWxsb25nOyBicmVhazsJXAotICAgICBjYXNlIDI1OiBob3d0b19wdHIgPSAmaG93dG9faXBybWVkOyBicmVhazsJCVwKLSAgICAgY2FzZSAyNzogaG93dG9fcHRyID0gJmhvd3RvX29wdGNhbGw7IGJyZWFrOwlcCi0gICAgIGRlZmF1bHQ6IGhvd3RvX3B0ciA9IDA7IGJyZWFrOwkJCVwKLSAgICAgfQkJCQkJCQlcCi0gICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b19wdHI7CQkJXAotIH0KLQotLyogaTk2MCBDT0ZGIGlzIHVzZWQgYnkgVnhXb3JrcyA1LjEuICBIb3dldmVyLCBWeFdvcmtzIDUuMSBkb2VzIG5vdAotICAgYXBwZWFyIHRvIGNvcnJlY3RseSBoYW5kbGUgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlCi0gICBzYW1lIG9iamVjdCBmaWxlLiAgSXQgYXBwZWFycyB0byBzaW1wbHkgZGlzY2FyZCBzdWNoIHJlbG9jcywgcmF0aGVyCi0gICB0aGFuIGFkZGluZyB0aGVpciB2YWx1ZXMgaW50byB0aGUgb2JqZWN0IGZpbGUuICBXZSBoYW5kbGUgdGhpcyBieQotICAgY29udmVydGluZyBhbGwgcmVsb2NzIGFnYWluc3QgZ2xvYmFsIHN5bWJvbHMgaW50byByZWxvY3MgYWdhaW5zdAotICAgaW50ZXJuYWwgc3ltYm9scyBhdCB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24uICBUaGlzIHJvdXRpbmUgaXMKLSAgIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmtpbmcgcHJvY2VzcywgYW5kIGl0IGNyZWF0ZXMgdGhlCi0gICBuZWNlc3Nhcnkgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2k5NjBfc3RhcnRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBhc2VjdGlvbiAqbzsKLSAgYmZkX2J5dGUgKmVzeW07Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVzeW0gPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc3ltZXN6KTsKLSAgaWYgKGVzeW0gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotCi0gICAgICBzdHJuY3B5IChpc3ltLl9uLl9uX25hbWUsIG8tPm5hbWUsIFNZTU5NTEVOKTsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IDA7Ci0gICAgICBpc3ltLm5fc2NudW0gPSBvLT50YXJnZXRfaW5kZXg7Ci0gICAgICBpc3ltLm5fdHlwZSA9IFRfTlVMTDsKLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX1NUQVQ7Ci0gICAgICBpc3ltLm5fbnVtYXV4ID0gMDsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgZXN5bSk7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKGVzeW0sIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCXsKLQkgIGZyZWUgKGVzeW0pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICs9IDE7Ci0gICAgfQotCi0gIGZyZWUgKGVzeW0pOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0gICAgICBib29sZWFuIGRvbmU7Ci0KLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKLQl7Ci0JY2FzZSAxNzogaG93dG8gPSAmaG93dG9fcmVsbG9uZzsgYnJlYWs7Ci0JY2FzZSAyNTogaG93dG8gPSAmaG93dG9faXBybWVkOyBicmVhazsKLQljYXNlIDI3OiBob3d0byA9ICZob3d0b19vcHRjYWxsOyBicmVhazsKLQlkZWZhdWx0OgotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlCi0JCSAgICAgLSBzZWMtPnZtYSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBkb25lID0gZmFsc2U7Ci0KLSAgICAgIGlmIChob3d0by0+dHlwZSA9PSBSX09QVENBTEwgJiYgISBpbmZvLT5yZWxvY2F0ZWFibGUgJiYgc3ltbmR4ICE9IC0xKQotCXsKLQkgIGludCBjbGFzczsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgY2xhc3MgPSBoLT5jbGFzczsKLQkgIGVsc2UKLQkgICAgY2xhc3MgPSBzeW0tPm5fc2NsYXNzOwotCi0JICBzd2l0Y2ggKGNsYXNzKQotCSAgICB7Ci0JICAgIGNhc2UgQ19OVUxMOgotCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIGFwcGFyZW50bHkgbm90IGZyb20gYSBDT0ZGIGlucHV0IGZpbGUuCi0gICAgICAgICAgICAgICAgIFdlIHdhcm4sIGFuZCB0aGVuIGFzc3VtZSB0aGF0IGl0IGlzIG5vdCBhIGxlYWYKLSAgICAgICAgICAgICAgICAgZnVuY3Rpb24uICAqLwotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkgICAgIChpbmZvLAotCQkgICAgICBfKCJ1bmNlcnRhaW4gY2FsbGluZyBjb252ZW50aW9uIGZvciBub24tQ09GRiBzeW1ib2wiKSwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENfTEVBRlNUQVQ6Ci0JICAgIGNhc2UgQ19MRUFGRVhUOgotCSAgICAgIC8qIFRoaXMgaXMgYSBjYWxsIHRvIGEgbGVhZiBwcm9jZWR1cmU7IHVzZSB0aGUgYmFsCi0gICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICB7Ci0JCWxvbmcgb2xmOwotCQl1bnNpZ25lZCBsb25nIHdvcmQ7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICB7Ci0JCSAgICBCRkRfQVNTRVJUIChoLT5udW1hdXggPT0gMik7Ci0JCSAgICBvbGYgPSBoLT5hdXhbMV0ueF9iYWwueF9iYWxudHJ5OwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGJmZF9ieXRlICplc3ltczsKLQkJICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0KLQkJICAgIEJGRF9BU1NFUlQgKHN5bS0+bl9udW1hdXggPT0gMik7Ci0JCSAgICBlc3ltcyA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotCQkgICAgZXN5bXMgKz0gKHN5bW5keCArIDIpICogYmZkX2NvZmZfc3ltZXN6IChpbnB1dF9iZmQpOwotCQkgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bXMsIHN5bS0+bl90eXBlLAotCQkJCQkgIHN5bS0+bl9zY2xhc3MsIDEsIHN5bS0+bl9udW1hdXgsCi0JCQkJCSAgKFBUUikgJmF1eCk7Ci0JCSAgICBvbGYgPSBhdXgueF9iYWwueF9iYWxudHJ5OwotCQkgIH0KLQotCQl3b3JkID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJCSAgIChjb250ZW50cwotCQkJCSAgICArIChyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSk7Ci0JCXdvcmQgPSAoKHdvcmQgKyBvbGYgLSB2YWwpICYgQkFMX01BU0spIHwgQkFMOwotCQliZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JCQkgICAgd29yZCwKLQkJCSAgICAoY29udGVudHMKLQkJCSAgICAgKyAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpOwotCQlkb25lID0gdHJ1ZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ19TQ0FMTDoKLQkgICAgICBCRkRfQVNTRVJUICgwKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgZG9uZSkKLQl7Ci0JICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCSAgICBhZGRlbmQgKz0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCSAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cywKLQkJCQkJICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJICAgIHZhbCwgYWRkZW5kKTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IHRoZSBzeW1ib2wgaW5kZXggb2YgYW55IHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHRvCi0gICBpbnN0ZWFkIGJlIGEgcmVsb2MgYWdhaW5zdCB0aGUgaW50ZXJuYWwgc3ltYm9sIHdlIGNyZWF0ZWQgc3BlY2lhbGx5Ci0gICBmb3IgdGhlIHNlY3Rpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2k5NjBfYWRqdXN0X3N5bW5keCAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCBpcmVsLCBhZGp1c3RlZHApCi0gICAgIGJmZCAqb2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICBib29sZWFuICphZGp1c3RlZHA7Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAqYWRqdXN0ZWRwID0gZmFsc2U7Ci0KLSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGliZmQpW2lyZWwtPnJfc3ltbmR4XTsKLSAgaWYgKGggPT0gTlVMTAotICAgICAgfHwgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlyZWwtPnJfc3ltbmR4ID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4IC0gMTsKLSAgKmFkanVzdGVkcCA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBjb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZQotCi0jZGVmaW5lIGNvZmZfc3RhcnRfZmluYWxfbGluayBjb2ZmX2k5NjBfc3RhcnRfZmluYWxfbGluawotCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBjb2ZmX2k5NjBfcmVsb2NhdGVfc2VjdGlvbgotCi0jZGVmaW5lIGNvZmZfYWRqdXN0X3N5bW5keCBjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keAotCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cAotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWNvZmZfYmlnX3ZlYzsKLQotQ1JFQVRFX0xJVFRMRV9DT0ZGX1RBUkdFVF9WRUMgKGljb2ZmX2xpdHRsZV92ZWMsICJjb2ZmLUludGVsLWxpdHRsZSIsIDAsIDAsICdfJywgJiBpY29mZl9iaWdfdmVjKQotCi1jb25zdCBiZmRfdGFyZ2V0IGljb2ZmX2JpZ192ZWMgPQotewotICAiY29mZi1JbnRlbC1iaWciLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLQotYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmIGljb2ZmX2xpdHRsZV92ZWMsCi0gIAotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1tNjhrLmMgYi9iZmQvY29mZi1tNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTM4YzAuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtbTY4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgNjgwMDAgQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL202OGsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0vKiBUaGlzIHNvdXJjZSBmaWxlIGlzIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzIGZvciB2YXJpb3VzIG02OGsgQ09GRgotICAgdmFyaWFudHMuICBUaGUgZm9sbG93aW5nIG1hY3JvcyBjb250cm9sIGl0cyBiZWhhdmlvdXI6Ci0KLSAgIFRBUkdFVF9TWU0KLSAgICAgVGhlIEMgbmFtZSBvZiB0aGUgQkZEIHRhcmdldCB2ZWN0b3IuICBUaGUgZGVmYXVsdCBpcyBtNjhrY29mZl92ZWMuCi0gICBUQVJHRVRfTkFNRQotICAgICBUaGUgdXNlciB2aXNpYmxlIHRhcmdldCBuYW1lLiAgVGhlIGRlZmF1bHQgaXMgImNvZmYtbTY4ayIuCi0gICBOQU1FU19IQVZFX1VOREVSU0NPUkUKLSAgICAgV2hldGhlciBzeW1ib2wgbmFtZXMgaGF2ZSBhbiB1bmRlcnNjb3JlLgotICAgT05MWV9ERUNMQVJFX1JFTE9DUwotICAgICBPbmx5IGRlY2xhcmUgdGhlIHJlbG9jYXRpb24gaG93dG8gYXJyYXkuICBEb24ndCBhY3R1YWxseSBjb21waWxlCi0gICAgIGl0LiAgVGhlIGFjdHVhbCBhcnJheSB3aWxsIGJlIHBpY2tlZCB1cCBpbiBhbm90aGVyIHZlcnNpb24gb2YgdGhlCi0gICAgIGZpbGUuCi0gICBTVEFUSUNfUkVMT0NTCi0gICAgIE1ha2UgdGhlIHJlbG9jYXRpb24gaG93dG8gYXJyYXksIGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9ucywgc3RhdGljLgotICAgQ09GRl9DT01NT05fQURERU5ECi0gICAgIElmIHRoaXMgaXMgZGVmaW5lZCwgdGhlbiwgZm9yIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgY29tbW9uCi0gICAgIHN5bWJvbCwgdGhlIG9iamVjdCBmaWxlIGhvbGRzIHRoZSB2YWx1ZSAodGhlIHNpemUpIG9mIHRoZSBjb21tb24KLSAgICAgc3ltYm9sLiAgSWYgdGhpcyBpcyBub3QgZGVmaW5lZCwgdGhlbiwgZm9yIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEKLSAgICAgY29tbW9uIHN5bWJvbCwgdGhlIG9iamVjdCBmaWxlIGhvbGRzIHplcm8uICAqLwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLQotI2lmbmRlZiBDT0ZGX1BBR0VfU0laRQotLyogVGhlIHBhZ2Ugc2l6ZSBpcyBhIGd1ZXNzIGJhc2VkIG9uIEVMRi4gICovCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MjAwMAotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9DT01NT05fQURERU5ECi0jZGVmaW5lIFJFTE9DX1NQRUNJQUxfRk4gMAotI2Vsc2UKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9zcGVjaWFsX2ZuCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosCi0JICAgYmZkX3ZtYSAqKSk7Ci0jZGVmaW5lIFJFTE9DX1NQRUNJQUxfRk4gbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9zcGVjaWFsX2ZuCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gbTY4a19jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBPbiB0aGUgZGVsdGEsIGEgc3ltYm9sIHN0YXJ0aW5nIHdpdGggTCUgaXMgbG9jYWwuICBXZSB3b24ndCBzZWUKLSAgIHN1Y2ggYSBzeW1ib2wgb24gb3RoZXIgcGxhdGZvcm1zLCBzbyBpdCBzaG91bGQgYmUgc2FmZSB0byBhbHdheXMKLSAgIGNvbnNpZGVyIGl0IGxvY2FsIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTY4a19jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyUnKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSk7Ci19Ci0KLSNpZm5kZWYgU1RBVElDX1JFTE9DUwotLyogQ2xlYW4gdXAgbmFtZXNwYWNlLiAgKi8KLSNkZWZpbmUgbTY4a2NvZmZfaG93dG9fdGFibGUJX2JmZF9tNjhrY29mZl9ob3d0b190YWJsZQotI2RlZmluZSBtNjhrX3J0eXBlMmhvd3RvCV9iZmRfbTY4a2NvZmZfcnR5cGUyaG93dG8KLSNkZWZpbmUgbTY4a19ob3d0bzJydHlwZQlfYmZkX202OGtjb2ZmX2hvd3RvMnJ0eXBlCi0jZGVmaW5lIG02OGtfcmVsb2NfdHlwZV9sb29rdXAJX2JmZF9tNjhrY29mZl9yZWxvY190eXBlX2xvb2t1cAotI2VuZGlmCi0KLSNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSBtNjhrY29mZl9ob3d0b190YWJsZVtdOwotI2Vsc2UKLSNpZmRlZiBTVEFUSUNfUkVMT0NTCi1zdGF0aWMKLSNlbmRpZgotcmVsb2NfaG93dG9fdHlwZSBtNjhrY29mZl9ob3d0b190YWJsZVtdID0gCi17Ci0gIEhPV1RPKFJfUkVMQllURSwJICAgICAgIDAsICAwLCAgCTgsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIFJFTE9DX1NQRUNJQUxfRk4sICI4IiwJdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMV09SRCwJICAgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIjE2IiwJdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMTE9ORywJICAgICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIjMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSQllURSwJICAgICAgIDAsICAwLCAJOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIFJFTE9DX1NQRUNJQUxfRk4sICJESVNQOCIsICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUldPUkQsCSAgICAgICAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiRElTUDE2IiwgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIkRJU1AzMiIsICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMTE9OR19ORUcsCSAgICAgICAwLCAgLTIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiLTMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi19OwotI2VuZGlmIC8qIG5vdCBPTkxZX0RFQ0xBUkVfUkVMT0NTICovCi0KLSNpZm5kZWYgQkFETUFHCi0jZGVmaW5lIEJBRE1BRyh4KSBNNjhLQkFETUFHKHgpCi0jZW5kaWYKLSNkZWZpbmUgTTY4IDEJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLSNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi1leHRlcm4gdm9pZCBtNjhrX3J0eXBlMmhvd3RvIFBBUkFNUyAoKGFyZWxlbnQgKmludGVybmFsLCBpbnQgcmVsb2NlbnRyeSkpOwotZXh0ZXJuIGludCBtNjhrX2hvd3RvMnJ0eXBlIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKikpOwotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgKm02OGtfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotI2Vsc2UKLSNpZmRlZiBTVEFUSUNfUkVMT0NTCi1zdGF0aWMKLSNlbmRpZgotdm9pZAotbTY4a19ydHlwZTJob3d0byhpbnRlcm5hbCwgcmVsb2NlbnRyeSkKLSAgICAgYXJlbGVudCAqaW50ZXJuYWw7Ci0gICAgIGludCByZWxvY2VudHJ5OwotewotICBzd2l0Y2ggKHJlbG9jZW50cnkpIAotICB7Ci0gICBjYXNlIFJfUkVMQllURToJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAwOyBicmVhazsKLSAgIGNhc2UgUl9SRUxXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDE7IGJyZWFrOwotICAgY2FzZSBSX1JFTExPTkc6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMjsgYnJlYWs7Ci0gICBjYXNlIFJfUENSQllURToJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAzOyBicmVhazsKLSAgIGNhc2UgUl9QQ1JXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDQ7IGJyZWFrOwotICAgY2FzZSBSX1BDUkxPTkc6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgNTsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMTE9OR19ORUc6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgNjsgYnJlYWs7Ci0gIH0KLX0KLQotI2lmZGVmIFNUQVRJQ19SRUxPQ1MKLXN0YXRpYwotI2VuZGlmCi1pbnQgCi1tNjhrX2hvd3RvMnJ0eXBlIChpbnRlcm5hbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaW50ZXJuYWw7Ci17Ci0gIGlmIChpbnRlcm5hbC0+cGNfcmVsYXRpdmUpIAotICB7Ci0gICAgc3dpdGNoIChpbnRlcm5hbC0+Yml0c2l6ZSkgCi0gICAgewotICAgICBjYXNlIDMyOiByZXR1cm4gUl9QQ1JMT05HOwotICAgICBjYXNlIDE2OiByZXR1cm4gUl9QQ1JXT1JEOwotICAgICBjYXNlIDg6IHJldHVybiBSX1BDUkJZVEU7Ci0gICAgfQotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICBzd2l0Y2ggKGludGVybmFsLT5iaXRzaXplKSAKLSAgICAgewotICAgICAgY2FzZSAzMjogcmV0dXJuIFJfUkVMTE9ORzsKLSAgICAgIGNhc2UgMTY6IHJldHVybiBSX1JFTFdPUkQ7Ci0gICAgICBjYXNlIDg6IHJldHVybiBSX1JFTEJZVEU7Ci0gICAgIH0KLSAgfQotICByZXR1cm4gUl9SRUxMT05HOyAgICAKLX0KLQotI2lmZGVmIFNUQVRJQ19SRUxPQ1MKLXN0YXRpYwotI2VuZGlmCi1yZWxvY19ob3d0b190eXBlICoKLW02OGtfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgkJCXJldHVybiBOVUxMOwotICAgIGNhc2UgQkZEX1JFTE9DXzg6CQlyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAwOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgkJcmV0dXJuIG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMTsKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgkJcmV0dXJuIG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMjsKLSAgICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOglyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAzOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOglyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA0OwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOglyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA1OwotICAgICAgLyogRklYTUU6IFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGNvZGUgZm9yIFJfUkVMTE9OR19ORUcuICAqLwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotI2VuZGlmIC8qIG5vdCBPTkxZX0RFQ0xBUkVfUkVMT0NTICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIFwKLSAgbTY4a19ydHlwZTJob3d0byhpbnRlcm5hbCwgKHJlbG9jZW50cnkpLT5yX3R5cGUpCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKGV4dGVybmFsLCBpbnRlcm5hbCkgXAotICBleHRlcm5hbC5yX3R5cGUgPSBtNjhrX2hvd3RvMnJ0eXBlIChpbnRlcm5hbCkKLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBtNjhrX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNpZm5kZWYgQ09GRl9DT01NT05fQURERU5ECi0jaWZuZGVmIGNvZmZfcnR5cGVfdG9faG93dG8KLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIG02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICptNjhrY29mZl9ydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwKLQkgICBiZmRfdm1hICopKTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1tNjhrY29mZl9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0gIGFyZWxlbnQgcmVsZW50OwotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICBSVFlQRTJIT1dUTyAoJnJlbGVudCwgcmVsKTsKLQotICBob3d0byA9IHJlbGVudC5ob3d0bzsKLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgICphZGRlbmRwICs9IHNlYy0+dm1hOwotCi0gIHJldHVybiBob3d0bzsKLX0KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoY29mZl9ydHlwZV90b19ob3d0bykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKENPRkZfQ09NTU9OX0FEREVORCkgKi8KLQwKLSNpZmRlZiBDT0ZGX0NPTU1PTl9BRERFTkQKLQotLyogSWYgQ09GRl9DT01NT05fQURERU5EIGlzIGRlZmluZWQsIHRoZW4gd2hlbiB1c2luZyBtNjhrIENPRkYgdGhlCi0gICB2YWx1ZSBzdG9yZWQgaW4gdGhlIC50ZXh0IHNlY3Rpb24gZm9yIGEgcmVmZXJlbmNlIHRvIGEgY29tbW9uCi0gICBzeW1ib2wgaXMgdGhlIHZhbHVlIGl0c2VsZiBwbHVzIGFueSBkZXNpcmVkIG9mZnNldC4gICh0YWtlbiBmcm9tCi0gICB3b3JrIGRvbmUgYnkgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGZvciBJMzg2IENPRkYpLiAgKi8KLQotLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBuZWVkIHRvIGRvIHNvbWUKLSAgIGFkanVzdG1lbnRzIHRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IGFyZSBub3QgZG9uZSBieSB0aGUKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBldmVyeQotICAgcmVsb2MgdHlwZSB0byBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50cy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfc3BlY2lhbF9mbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQkgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN5bXZhbHVlIGRpZmY7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgcmVsb2NhdGluZyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgY3VycmVudCB2YWx1ZSBpbiB0aGUKLQkgb2JqZWN0IGZpbGUgaXMgT1JJRyArIE9GRlNFVCwgd2hlcmUgT1JJRyBpcyB0aGUgdmFsdWUgb2YgdGhlCi0JIGNvbW1vbiBzeW1ib2wgYXMgc2VlbiBieSB0aGUgb2JqZWN0IGZpbGUgd2hlbiBpdCB3YXMgY29tcGlsZWQKLQkgKHRoaXMgbWF5IGJlIHplcm8gaWYgdGhlIHN5bWJvbCB3YXMgdW5kZWZpbmVkKSBhbmQgT0ZGU0VUIGlzCi0JIHRoZSBvZmZzZXQgaW50byB0aGUgY29tbW9uIHN5bWJvbCAobm9ybWFsbHkgemVybywgYnV0IG1heSBiZQotCSBub24temVybyB3aGVuIHJlZmVycmluZyB0byBhIGZpZWxkIGluIGEgY29tbW9uIHN0cnVjdHVyZSkuCi0JIE9SSUcgaXMgdGhlIG5lZ2F0aXZlIG9mIHJlbG9jX2VudHJ5LT5hZGRlbmQsIHdoaWNoIGlzIHNldCBieQotCSB0aGUgQ0FMQ19BRERFTkQgbWFjcm8gYmVsb3cuICBXZSB3YW50IHRvIHJlcGxhY2UgdGhlIHZhbHVlIGluCi0JIHRoZSBvYmplY3QgZmlsZSB3aXRoIE5FVyArIE9GRlNFVCwgd2hlcmUgTkVXIGlzIHRoZSB2YWx1ZSBvZgotCSB0aGUgY29tbW9uIHN5bWJvbCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcHV0IGluIHRoZSBmaW5hbAotCSBvYmplY3QgZmlsZS4gIE5FVyBpcyBzeW1ib2wtPnZhbHVlLiAgKi8KLSAgICAgIGRpZmYgPSBzeW1ib2wtPnZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBhbHdheXMgZWZmZWN0aXZlbHkKLQkgaWdub3JlcyB0aGUgYWRkZW5kIGZvciBhIENPRkYgdGFyZ2V0IHdoZW4gcHJvZHVjaW5nCi0JIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGlzIHNlZW1zIHRvIGJlIGFsd2F5cyB3cm9uZyBmb3IgMzg2Ci0JIENPRkYsIHNvIHdlIGhhbmRsZSB0aGUgYWRkZW5kIGhlcmUgaW5zdGVhZC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgZGlmZikgJiBob3d0by0+ZHN0X21hc2spKQotCi0gIGlmIChkaWZmICE9IDApCi0gICAgewotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0gICAgICB1bnNpZ25lZCBjaGFyICphZGRyID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0gICAgICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotCXsKLQljYXNlIDA6Ci0JICB7Ci0JICAgIGNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgYWRkcik7Ci0JICAgIERPSVQgKHgpOwotCSAgICBiZmRfcHV0XzggKGFiZmQsIHgsIGFkZHIpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDE6Ci0JICB7Ci0JICAgIHNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyKTsKLQkgICAgRE9JVCAoeCk7Ci0JICAgIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGFkZHIpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDI6Ci0JICB7Ci0JICAgIGxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHIpOwotCSAgICBET0lUICh4KTsKLQkgICAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgYWRkcik7Ci0JICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBsZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggZXZlcnl0aGluZyB1cC4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLS8qIENvbXB1dGUgdGhlIGFkZGVuZCBvZiBhIHJlbG9jLiAgSWYgdGhlIHJlbG9jIGlzIHRvIGEgY29tbW9uIHN5bWJvbCwKLSAgIHRoZSBvYmplY3QgZmlsZSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGNvbW1vbiBzeW1ib2wuICBCeSB0aGUKLSAgIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHRoZSBsaW5rZXIgbWF5IGJlIHVzaW5nIGEgZGlmZmVyZW50IHN5bWJvbAotICAgZnJvbSBhIGRpZmZlcmVudCBvYmplY3QgZmlsZSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLiAgVGhlcmVmb3JlLCB3ZQotICAgaGFjayB3aWxkbHkgdG8gbG9jYXRlIHRoZSBvcmlnaW5hbCBzeW1ib2wgZnJvbSB0aGlzIGZpbGUgc28gdGhhdCB3ZQotICAgY2FuIG1ha2UgdGhlIGNvcnJlY3QgYWRqdXN0bWVudC4gIFRoaXMgbWFjcm8gc2V0cyBjb2Zmc3ltIHRvIHRoZQotICAgc3ltYm9sIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUsIGFuZCB1c2VzIGl0IHRvIHNldCB0aGUgYWRkZW5kIHZhbHVlCi0gICBjb3JyZWN0bHkuICBJZiB0aGlzIGlzIG5vdCBhIGNvbW1vbiBzeW1ib2wsIHRoZSB1c3VhbCBhZGRlbmQKLSAgIGNhbGN1bGF0aW9uIGlzIGRvbmUsIGV4Y2VwdCB0aGF0IGFuIGFkZGl0aW9uYWwgdHdlYWsgaXMgbmVlZGVkIGZvcgotICAgUEMgcmVsYXRpdmUgcmVsb2NzLgotICAgRklYTUU6IFRoaXMgbWFjcm8gcmVmZXJzIHRvIHN5bWJvbHMgYW5kIGFzZWN0OyB0aGVzZSBhcmUgZnJvbSB0aGUKLSAgIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCB0aGUgbWFjcm8gYXJndW1lbnRzLiAgKi8KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpCQlcCi0gIHsJCQkJCQkJCVwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsJXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpCQkJXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkJCQkJXAotCSAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7CQlcCi0gICAgZWxzZSBpZiAocHRyKQkJCQkJCVwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOwkJCVwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMCQkJXAotCSYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZTsJXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZAkJXAotCSAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOwlcCi0gICAgZWxzZQkJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7CQkJCQlcCi0gICAgaWYgKHB0ciAmJiAocmVsb2Mucl90eXBlID09IFJfUENSQllURQkJCVwKLQkJfHwgcmVsb2Mucl90eXBlID09IFJfUENSV09SRAkJCVwKLQkJfHwgcmVsb2Mucl90eXBlID09IFJfUENSTE9ORykpCQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgKz0gYXNlY3QtPnZtYTsJCQkJXAotICB9Ci0KLSNpZm5kZWYgY29mZl9ydHlwZV90b19ob3d0bwotCi0vKiBjb2ZmLW02OGsuYyB1c2VzIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIuICBXZSBuZWVkIHRvCi0gICBhZGp1c3QgY29tbW9uIHN5bWJvbHMuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0gIGFyZWxlbnQgcmVsZW50OwotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICBSVFlQRTJIT1dUTyAoJnJlbGVudCwgcmVsKTsKLQotICBob3d0byA9IHJlbGVudC5ob3d0bzsKLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgICphZGRlbmRwICs9IHNlYy0+dm1hOwotCi0gIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gPT0gMCAmJiBzeW0tPm5fdmFsdWUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBzZWN0aW9uIGNvbnRlbnRzIGluY2x1ZGUgdGhlCi0JIHNpemUgKHN5bS0+bl92YWx1ZSkgYXMgYW4gYWRkZW5kLiAgVGhlIHJlbG9jYXRlX3NlY3Rpb24KLQkgZnVuY3Rpb24gd2lsbCBiZSBhZGRpbmcgaW4gdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBXZQotCSBuZWVkIHRvIHN1YnRyYWN0IG91dCB0aGUgY3VycmVudCBzaXplIGluIG9yZGVyIHRvIGdldCB0aGUKLQkgY29ycmVjdCByZXN1bHQuICAqLwotICAgICAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLSAgICAgICphZGRlbmRwIC09IHN5bS0+bl92YWx1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIG91dHB1dCBzeW1ib2wgaXMgY29tbW9uIChpbiB3aGljaCBjYXNlIHRoaXMgbXVzdCBiZSBhCi0gICAgIHJlbG9jYXRlYWJsZSBsaW5rKSwgd2UgbmVlZCB0byBhZGQgaW4gdGhlIGZpbmFsIHNpemUgb2YgdGhlCi0gICAgIGNvbW1vbiBzeW1ib2wuICAqLwotICBpZiAoaCAhPSBOVUxMICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICAqYWRkZW5kcCArPSBoLT5yb290LnUuYy5zaXplOwotCi0gIHJldHVybiBob3d0bzsKLX0KLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIG02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfcnR5cGVfdG9faG93dG8KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoY29mZl9ydHlwZV90b19ob3d0bykgKi8KLQotI2VuZGlmIC8qIENPRkZfQ09NTU9OX0FEREVORCAqLwotDAotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIG02OGtfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLSNpZm5kZWYgVEFSR0VUX1NZTQotI2RlZmluZSBUQVJHRVRfU1lNIG02OGtjb2ZmX3ZlYwotI2VuZGlmCi0KLSNpZm5kZWYgVEFSR0VUX05BTUUKLSNkZWZpbmUgVEFSR0VUX05BTUUgImNvZmYtbTY4ayIKLSNlbmRpZgotCi0jaWZkZWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX1NZTSwgVEFSR0VUX05BTUUsIERfUEFHRUQsIDAsICdfJywgTlVMTCkKLSNlbHNlCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX1NZTSwgVEFSR0VUX05BTUUsIERfUEFHRUQsIDAsIDAsIE5VTEwpCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLW04OGsuYyBiL2JmZC9jb2ZmLW04OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4Mzc3YS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1tODhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSA4ODAwMCBDT0ZGICJCaW5hcnkgQ29tcGF0YWJpbGl0eSBTdGFuZGFyZCIgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIE04OCAxCQkvKiBDdXN0b21pemUgdmFyaW91cyBpbmNsdWRlIGZpbGVzICovCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9tODhrLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotc3RhdGljIGJvb2xlYW4gbTg4a19pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTg4a19zcGVjaWFsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotc3RhdGljIHZvaWQgcmVsb2NfcHJvY2Vzc2luZwotICBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBhc3ltYm9sICoqLCBiZmQgKiwgYXNlY3Rpb24gKikpOwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotI2RlZmluZSBHRVRfU0NOSERSX05SRUxPQyBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgR0VUX1NDTkhEUl9OTE5OTyBiZmRfaF9nZXRfMzIKLQotLyogT24gY29mZi1tODhrLCBsb2NhbCBsYWJlbHMgc3RhcnQgd2l0aCAnQCcuICAqLwotCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgbTg4a19pc19sb2NhbF9sYWJlbF9uYW1lCi0KLXN0YXRpYyBib29sZWFuCi1tODhrX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbmFtZVswXSA9PSAnQCc7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1tODhrX3NwZWNpYWxfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLQotICBzd2l0Y2ggKGhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSFZSVDE2OgotICAgIGNhc2UgUl9MVlJUMTY6Ci0gICAgICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0JewotCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlCi0JICAgICByZWxvY2F0aW9uIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuCi0JICAgICBNb2RpZnkgdGhlIHJlbG9jIGlucGxhY2UgdG8gcmVmbGVjdCB3aGF0IHdlIG5vdyBrbm93LiAgKi8KLQotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7Ci0JICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLQkgIGJmZF92bWEgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0JICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotCSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLQotCSAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotCSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0JICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0JICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLQkgIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLwotCSAgaWYgKG91dHB1dF9iZmQpCi0JICAgIG91dHB1dF9iYXNlID0gMDsKLQkgIGVsc2UKLQkgICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCSAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotCSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0JICByZWxvY2F0aW9uICs9ICgocmVsb2NfZW50cnktPmFkZGVuZCA8PCBob3d0by0+Yml0c2l6ZSkgKyB4KTsKLQotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0KLQkgIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLQotCSAgLyogU2hpZnQgZXZlcnl0aGluZyB1cCB0byB3aGVyZSBpdCdzIGdvaW5nIHRvIGJlIHVzZWQgKi8KLQotCSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0KLQkgIGlmIChyZWxvY2F0aW9uKQotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jYXRpb24sICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyBhZGRyKTsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHJldHVybiBhbiBlcnJvciBpZgotCSB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkLiAgKi8KLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0JcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZQotCSAgICAgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgcmF0aGVyIHRoYW4gdGhlIHJhdyBkYXRhLgotCSAgICAgTW9kaWZ5IHRoZSByZWxvYyBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCi0KLQkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICByZXR1cm4gYmZkX3JlbG9jX29rOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gCi17Ci0gIEhPV1RPIChSX1BDUjE2TCwJCQkvKiB0eXBlICovCi0JIDAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQQ1IxNkwiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BDUjI2TCwJCQkvKiB0eXBlICovCi0JIDAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQQ1IyNkwiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAzZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDNmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1ZSVDE2LAkJCS8qIHR5cGUgKi8KLQkgMDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlZSVDE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9IVlJUMTYsCQkJLyogdHlwZSAqLwotCSAxNiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJIVlJUMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0xWUlQxNiwJCQkvKiB0eXBlICovCi0JIDAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxWUlQxNiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfVlJUMzIsCQkJLyogdHlwZSAqLwotCSAwMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiVlJUMzIiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogQ29kZSB0byB0dXJuIGFuIGV4dGVybmFsIHJfdHlwZSBpbnRvIGEgcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUKLSAgIGFib3ZlIGhvd3RvIHRhYmxlLiAgKi8KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIGlmIChkc3QtPnJfdHlwZSA+PSBSX1BDUjE2TCAmJiBkc3QtPnJfdHlwZSA8PSBSX1ZSVDMyKQotICAgIHsKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSBob3d0b190YWJsZSArIGRzdC0+cl90eXBlIC0gUl9QQ1IxNkw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoMCk7Ci0gICAgfQotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyBvZmZzZXQgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgIGJmZF9oX2dldF8xNgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzE2Ci0KLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCxyZWxvYyxzeW1ib2xzLGFiZmQsc2VjdGlvbikJXAotICByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICpyZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmICgoKGludCkgcmVsb2MtPnJfc3ltbmR4KSA+IDApCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydCAoYWJmZClbcmVsb2MtPnJfc3ltbmR4XTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotfQotCi0jZGVmaW5lIEJBRE1BRyh4KSBNQzg4QkFETUFHKHgpCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotI3VuZGVmIGNvZmZfd3JpdGVfYXJtYXAKLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKG04OGtiY3NfdmVjLCAiY29mZi1tODhrYmNzIiwgMCwgMCwgJ18nLCBOVUxMKQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtbWNvcmUuYyBiL2JmZC9jb2ZmLW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDhiZjEuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDY1MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1vdG9yb2xsYSBNQ29yZSBDT0ZGL1BFCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL21jb3JlLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvcGUuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNpZmRlZiBCQURNQUcKLSN1bmRlZiBCQURNQUcKLSNlbmRpZgotI2RlZmluZSBCQURNQUcoeCkgTUNPUkVCQURNQUcoeCkKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShBKSAoc2l6ZW9mIChBKSAvIHNpemVvZiAoQSlbMF0pCi0jZW5kaWYKLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIG1vcmUgdGhhbiBvbmNlLCBidXQgd2Ugb25seSBjb21waWxlIHRoZQotICAgZmluYWxfbGluayByb3V0aW5lIG9uY2UuICAqLwotZXh0ZXJuIGJvb2xlYW4gbWNvcmVfYmZkX2NvZmZfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiBjb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgIG1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MgCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgbWNvcmVfY29mZl9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICogICAgICAgICAgIHBlX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLQotDAotLyogVGhlIE5UIGxvYWRlciBwb2ludHMgdGhlIHRvYyByZWdpc3RlciB0byAmdG9jICsgMzI3NjgsIGluIG9yZGVyIHRvCi0gICB1c2UgdGhlIGNvbXBsZXRlIHJhbmdlIG9mIGEgMTYtYml0IGRpc3BsYWNlbWVudC4gV2UgaGF2ZSB0byBhZGp1c3QKLSAgIGZvciB0aGlzIHdoZW4gd2UgZml4IHVwIGxvYWRzIGRpc3BsYWNlZCBvZmYgdGhlIHRvYyByZWcuICAqLwotI2RlZmluZSBUT0NfTE9BRF9BREpVU1RNRU5UICgtMzI3NjgpCi0jZGVmaW5lIFRPQ19TRUNUSU9OX05BTUUgIi5wcml2YXRlLnRvYyIKLQotLyogVGhlIG1haW4gYm9keSBvZiBjb2RlIGlzIGluIGNvZmZjb2RlLmguICAqLwotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUKLSAgIGZyb20gc21hbGxlciB2YWx1ZXMuICBTdGFydCB3aXRoIHplcm8sIHdpZGVuLCAqdGhlbiogZGVjcmVtZW50LiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FCSgoKGJmZF92bWEpMCkgLSAxKQotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfQUJTT0xVVEUsLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogZG9udCBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUJTT0xVVEUiLCAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMCwJIAkgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAsICAgICAgICAJCSAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9BRERSMzIsLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogOCBiaXRzICsgMiB6ZXJvIGJpdHM7IGptcGkvanNyaS9scncgaW5zdHJ1Y3Rpb25zLgotICAgICBTaG91bGQgbm90IGFwcGVhciBpbiBvYmplY3QgZmlsZXMuICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NOEJZNCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTThCWTQiLCAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogYnNyL2J0L2JmL2JyIGluc3RydWN0aW9uczsgMTEgYml0cyArIDEgemVybyBiaXQgCi0gICAgIFNwYW4gMmsgaW5zdHJ1Y3Rpb25zID09IDRrIGJ5dGVzLgotICAgICBPbmx5IHVzZWZ1bCBwaWVjZXMgYXQgdGhlIHJlbG9jYXRlZCBhZGRyZXNzIGFyZSB0aGUgb3Bjb2RlICg1IGJpdHMpICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTIsLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTTExQlkyIiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNCBiaXRzICsgMSB6ZXJvIGJpdDsgJ2xvb3B0JyBpbnN0cnVjdGlvbiBvbmx5OyB1bnN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU00QlkyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWNvcmVfY29mZl91bnN1cHBvcnRlZF9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NNEJZMiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IHBjLXJlbGF0aXZlLiBFdmVudHVhbGx5IHRoaXMgd2lsbCBoZWxwIHN1cHBvcnQgUElDIGNvZGUuICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIsLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUENSRUxfMzIiLAkgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBQQ1JFTF9JTU0xMUJZMiwgdGhpcyByZWxvY2F0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEKLSAgICAgJ2pzcmknIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gVGhlcmUgaXMgYSBzZXBhcmF0ZSByZWxvY2F0aW9uCi0gICAgIGVudHJ5IGZvciB0aGUgbGl0ZXJhbCBwb29sIGVudHJ5IHRoYXQgaXQgcmVmZXJlbmNlcywgYnV0IHdlIAotICAgICBtaWdodCBiZSBhYmxlIHRvIGNoYW5nZSB0aGUganNyaSB0byBhIGJzciBpZiB0aGUgdGFyZ2V0IHR1cm5zIG91dAotICAgICB0byBiZSBjbG9zZSBlbm91Z2ggW2V2ZW4gdGhvdWdoIHdlIHdvbid0IHJlY2xhaW0gdGhlIGxpdGVyYWwgcG9vbAotICAgICBlbnRyeSwgd2UnbGwgZ2V0IHNvbWUgcnVudGltZSBlZmZpY2llbmN5IGJhY2tdLiBOb3RlIHRoYXQgdGhpcwotICAgICBpcyBhIHJlbG9jYXRpb24gdGhhdCB3ZSBhcmUgYWxsb3dlZCB0byBzYWZlbHkgaWdub3JlLiAgKi8gCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyLC8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCSAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJKU1JfSU1NMTFCWTIiLCAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9SVkEsICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTUNPUkVfUlZBIiwgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQwKLS8qIEV4dGVuZCB0aGUgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlIHdpdGggYSBmZXcgTSpDb3JlIHNwZWNpZmljIGZpZWxkcy4KLSAgIFRoaXMgYWxsb3dzIHVzIHRvIHN0b3JlIGdsb2JhbCBkYXRhIGhlcmUgd2l0aG91dCBhY3R1YWxseSBjcmVhdGluZyBhbnkKLSAgIGdsb2JhbCB2YXJpYWJsZXMsIHdoaWNoIGlzIGEgbm8tbm8gaW4gdGhlIEJGRCB3b3JsZC4gICovCi10eXBlZGVmIHN0cnVjdCBjb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgb3JpZ2luYWwgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlLiAgTVVTVCBiZSBmaXJzdCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZQlyb290OwotCi0gIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9vZl90b2Nfb3duZXI7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90b2Nfc2l6ZTsKLSAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0X3RhYmxlX3NpemU7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3RodW5rX2FkZHJlc3M7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIHRodW5rX3NpemU7Ci19Ci1tY29yZV9oYXNoX3RhYmxlOwotCi0vKiBHZXQgdGhlIE1Db3JlIGNvZmYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBjb2ZmX21jb3JlX2hhc2hfdGFibGUoaW5mbykgXAotICAoKG1jb3JlX2hhc2hfdGFibGUgKikgKChpbmZvKS0+aGFzaCkpCi0KLS8qIENyZWF0ZSBhbiBNQ29yZSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1jb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIG1jb3JlX2hhc2hfdGFibGUgKiByZXQ7Ci0KLSAgcmV0ID0gKChtY29yZV9oYXNoX3RhYmxlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqIHJldCkpKTsKLSAgaWYgKHJldCA9PSAobWNvcmVfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICAgICAgKCYgcmV0LT5yb290LCBhYmZkLCBfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmJmZF9vZl90b2Nfb3duZXIgPSBOVUxMOwotICByZXQtPmdsb2JhbF90b2Nfc2l6ZSAgPSAwOwotICByZXQtPmltcG9ydF90YWJsZV9zaXplID0gMDsKLSAgcmV0LT5maXJzdF90aHVua19hZGRyZXNzID0gMDsKLSAgcmV0LT50aHVua19zaXplID0gMDsKLQotICByZXR1cm4gJiByZXQtPnJvb3Qucm9vdDsKLX0KLQwKLS8qIEFkZCBhbiBlbnRyeSB0byB0aGUgYmFzZSBmaWxlLiAgKi8KLXN0YXRpYyB2b2lkCi1tY29yZV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2Nfb2Zmc2V0KQotICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICAgYmZkICogICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOwotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICByZWxvY19vZmZzZXQ7Ci17Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX29mZnNldAotICAgICAgICAgICAgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYQotICAgICAgICAgICAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIGlmIChjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5wZSkKLSAgICAgYWRkciAtPSBwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgCi0gIGZ3cml0ZSAoJmFkZHIsIDEsIHNpemVvZiAoYWRkciksIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSk7Ci19Ci0MCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBhcmVsZW50ICogcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiBzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqIG91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKiBlcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIEJGRF9BU1NFUlQgKHJlbG9jX2VudHJ5LT5ob3d0byAhPSAocmVsb2NfaG93dG9fdHlwZSAqKTApOwotICAKLSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogUmVsb2NhdGlvbiAlcyAoJWQpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIiksCi0JCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkgICAgICByZWxvY19lbnRyeS0+aG93dG8tPm5hbWUsCi0JCSAgICAgIHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZSk7Ci0gIAotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotDAotLyogQSBjaGVlc3kgbGl0dGxlIG1hY3JvIHRvIG1ha2UgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSByZWFkYWJsZS4gKi8KLSNkZWZpbmUgSE9XMk1BUChiZmRfcnR5cGUsIG1jb3JlX3J0eXBlKSAgXAotIGNhc2UgYmZkX3J0eXBlOiByZXR1cm4gJiBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlIFttY29yZV9ydHlwZV0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbWNvcmVfY29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsgCi0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfMzIsICAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9SRUxfTUNPUkVfQUREUjMyKTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0LCAgICAgIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU04Qlk0KTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMiwgICAgIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU0xMUJZMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMiwgICAgICBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfMzJfUENSRUwsICAgICAgICAgICAgICAgICBJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIpOwotICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMiwgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfUlZBLCAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9SRUxfTUNPUkVfUlZBKTsKLSAgIGRlZmF1bHQ6IAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0jdW5kZWYgSE9XMk1BUAotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBcCi0gIChjYWNoZV9wdHIpLT5ob3d0byA9IG1jb3JlX2NvZmZfaG93dG9fdGFibGUgKyAoZHN0KS0+cl90eXBlOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICogc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqIHN5bTsKLSAgICAgYmZkX3ZtYSAqIGFkZGVuZHA7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0bzsKLQotCi0gIGlmIChyZWwtPnJfdHlwZSA+PSBOVU1fRUxFTSAobWNvcmVfY29mZl9ob3d0b190YWJsZSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICBob3d0byA9IG1jb3JlX2NvZmZfaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZTsKLQotICBpZiAocmVsLT5yX3R5cGUgPT0gSU1BR0VfUkVMX01DT1JFX1JWQSkKLSAgICAqIGFkZGVuZHAgLT0gcGVfZGF0YSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAKLSAgZWxzZSBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgICogYWRkZW5kcCA9IHNlYy0+dm1hIC0gMjsgLyogWFhYIGd1ZXNzIC0gaXMgdGhpcyByaWdodCA/ICovCi0gICAgICAKLSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZ2VuZXJpYyBjb2RlIGlzIGdvaW5nIHRvCi0gICAgICAgICBhZGQgYmFjayB0aGUgc3ltYm9sIHZhbHVlIGluIG9yZGVyIHRvIGNhbmNlbCBvdXQgYW4KLSAgICAgICAgIGFkanVzdG1lbnQgaXQgbWFkZSB0byB0aGUgYWRkZW5kLiAgSG93ZXZlciwgd2Ugc2V0IHRoZSBhZGRlbmQKLSAgICAgICAgIHRvIDAgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb24uICBXZSBuZWVkIHRvIGFkanVzdCBoZXJlLAotICAgICAgICAgdG8gYXZvaWQgdGhlIGFkanVzdG1lbnQgdGhlIGdlbmVyaWMgY29kZSB3aWxsIG1ha2UuICBGSVhNRToKLSAgICAgICAgIFRoaXMgaXMgZ2V0dGluZyBhIGJpdCBoYWNraXNoLiAgKi8KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQkqIGFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgICogYWRkZW5kcCA9IDA7Ci0gIAotICByZXR1cm4gaG93dG87Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBzaG91bGQgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQgaW4gcGVfbWtvYmplY3QgaW4gcGVpY29kZS5oLiAgKi8KLXN0YXRpYyBib29sZWFuCi1pbl9yZWxvY19wIChhYmZkLCBob3d0bykKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci17Ci0gIHJldHVybiAhIGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfTUNPUkVfUlZBOwotfSAgICAgCi0KLQwKLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYmZkICogaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqIHN5bXM7Ci0gICAgIGFzZWN0aW9uICoqIHNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbGVuZDsKLSAgYm9vbGVhbiBoaWhhbGY7Ci0gIGJmZF92bWEgaGloYWxmX3ZhbDsKLSAgCi0gIC8qIElmIHdlIGFyZSBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIGRvbid0IG5lZWQgdG8gZG8gYQotICAgICB0aGluZy4gIFRoZSBjYWxsZXIgd2lsbCB0YWtlIGNhcmUgb2YgYWRqdXN0aW5nIHRoZSByZWxvYwotICAgICBhZGRyZXNzZXMgYW5kIHN5bWJvbCBpbmRpY2VzLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpbnB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBvdXRwdXRfYmZkLT54dmVjLT5ieXRlb3JkZXIKLSAgICAgICYmIG91dHB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjb21waWxlZCBmb3IgYSAlcyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgJXMgZW5kaWFuLlxuIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkgPyAiYmlnIiA6ICJsaXR0bGUiKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGhpaGFsZiA9IGZhbHNlOwotICBoaWhhbGZfdmFsID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICAKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5keDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiAgICAgICBzeW07Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgdmFsOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgICByc3RhdDsKLSAgICAgIGJmZF9ieXRlICogICAgICAgICAgICAgICAgICAgICBsb2M7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgcl90eXBlID0gcmVsLT5yX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgICAgaG93dG8gPSBOVUxMOwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogIGg7Ci0gICAgICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgbXlfbmFtZTsKLSAgCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIGFkZGVuZCA9IDA7Ci0gICAgICAKLSAgICAgIC8qIEdldCB0aGUgaG93dG8gYW5kIGluaXRpYWxpc2UgdGhlIGFkZGVuZC4gICovCi0gICAgICBob3d0byA9IGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKLQkJCQkgICAgICAgc3ltLCAmIGFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHZhbCA9IDA7Ci0gICAgICAKLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgbXlfbmFtZSA9ICIqQUJTKiI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JICAgICAgCi0JICAgICAgdmFsID0gKHN5bS0+bl92YWx1ZSAKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQkJbXlfbmFtZSA9ICIqdW5rbm93bioiOwotCSAgICAgIGVsc2UgaWYgKCAgIHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCQlteV9uYW1lID0gb2JqX2NvZmZfc3RyaW5ncyAoaW5wdXRfYmZkKSArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgICAgZWxzZSAKLQkJewotCQkgIHN0YXRpYyBjaGFyIGJ1ZiBbU1lNTk1MRU4gKyAxXTsKLQkJICAKLQkJICBzdHJuY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotCQkgIGJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotCQkgIG15X25hbWUgPSBidWY7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoICAgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICAKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgCi0JICBteV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQl9CQotCi0gICAgICByc3RhdCA9IGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgICAgLyogRWFjaCBjYXNlIG11c3QgZG8gaXRzIG93biByZWxvY2F0aW9uLCBzZXR0aW5nIHJzdGF0IGFwcHJvcHJpYXRlbHkuICAqLwotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgMHglMDJ4IiksCi0JCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCByX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JICAKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9BQlNPTFVURToKLQkgIGZwcmludGYgKHN0ZGVyciwgCi0JCSAgIF8oIldhcm5pbmc6IHVuc3VwcG9ydGVkIHJlbG9jICVzIDxmaWxlICVzLCBzZWN0aW9uICVzPlxuIiksIAotCQkgICBob3d0by0+bmFtZSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJICAgaW5wdXRfc2VjdGlvbi0+bmFtZSk7Ci0JICAKLQkgIGZwcmludGYgKHN0ZGVyciwic3ltICVsZCAoJXMpLCByX3ZhZGRyICVsZCAoJWx4KVxuIiwgCi0JCSAgIHJlbC0+cl9zeW1uZHgsIG15X25hbWUsIChsb25nKSByZWwtPnJfdmFkZHIsCi0JCSAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIpOyAgCi0JICBicmVhazsKLQkgIAotCWNhc2UgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTThCWTQ6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTI6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF8zMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTI6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfQUREUjMyOgotCSAgLyogWFhYIGZpeG1lIC0gc2hvdWxkbid0IHRoaXMgYmUgbGlrZSB0aGUgY29kZSBmb3IgdGhlIFJWQSByZWxvYyA/ICovCi0JICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHZhbCwgbG9jKTsKLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUlZBOgotCSAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLQkgICAgKGhvd3RvLCBpbnB1dF9iZmQsCi0JICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCSAgICAgdmFsLCBhZGRlbmQpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICBpZiAoaW5mby0+YmFzZV9maWxlKQotCXsKLQkgIC8qIEVtaXQgYSByZWxvYyBpZiB0aGUgYmFja2VuZCB0aGlua3MgaXQgbmVlZHMgaXQuICAqLwotCSAgaWYgKHN5bSAmJiBwZV9kYXRhIChvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcCAob3V0cHV0X2JmZCwgaG93dG8pKQotICAgICAgICAgICAgbWNvcmVfZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkcik7Ci0JfQotICAKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIAotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JICAKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoaW5mbywgbXlfbmFtZSwgaG93dG8tPm5hbWUsIAotCQkgIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfSAgICAgCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFRhaWxvciBjb2ZmY29kZS5oIC0tIG1hY3JvIGhlYXZlbi4gKi8KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIsIHdpdGggb3VyIG93biBzcGVjaWFsIHRvdWNoLiAgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCAgIG1jb3JlX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICBjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byAgICAgICAgICBjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKGludGVybmFsLCBob3d0bykge2ludGVybmFsLnJfdHlwZSA9IGhvd3RvLT50eXBlO30KLQotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAgICAgICAgICAgICAgIDB4MTAwMAotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQwKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXBlX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAvKiBXZSBuZWVkIHRvIGhhY2sgYmFkbHkgdG8gaGFuZGxlIGEgUEUgaW1hZ2UgY29ycmVjdGx5LiAgSW4gUEUKLSAgICAgaW1hZ2VzIGNyZWF0ZWQgYnkgdGhlIEdOVSBsaW5rZXIsIHRoZSBvZmZzZXQgdG8gdGhlIENPRkYgaGVhZGVyCi0gICAgIGlzIGFsd2F5cyB0aGUgc2l6ZS4gIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHRoZSBjYXNlIGluIGltYWdlcwotICAgICBnZW5lcmF0ZWQgYnkgb3RoZXIgUEUgbGlua2Vycy4gIFRoZSBQRSBmb3JtYXQgc3RvcmVzIGEgZm91ciBieXRlCi0gICAgIG9mZnNldCB0byB0aGUgUEUgc2lnbmF0dXJlIGp1c3QgYmVmb3JlIHRoZSBDT0ZGIGhlYWRlciBhdAotICAgICBsb2NhdGlvbiAweDNjIG9mIHRoZSBmaWxlLiAgV2UgcGljayB1cCB0aGF0IG9mZnNldCwgdmVyaWZ5IHRoYXQKLSAgICAgdGhlIFBFIHNpZ25hdHVyZSBpcyB0aGVyZSwgYW5kIHRoZW4gc2V0IG91cnNlbHZlcyB1cCB0byByZWFkIGluCi0gICAgIHRoZSBDT0ZGIGhlYWRlci4gICovCi0gIHsKLSAgICBiZmRfYnl0ZSBleHRfb2Zmc2V0WzRdOwotICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICBiZmRfYnl0ZSBleHRfc2lnbmF0dXJlWzRdOwotICAgIHVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlOwotCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAweDNjLCBTRUVLX1NFVCkgIT0gMAotCXx8IGJmZF9yZWFkIChleHRfb2Zmc2V0LCAxLCA0LCBhYmZkKSAhPSA0KQotICAgICAgewotCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIAotICAgIG9mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0X29mZnNldCk7Ci0gICAgCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JfHwgYmZkX3JlYWQgKGV4dF9zaWduYXR1cmUsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgICB7Ci0JaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCi0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgCi0gICAgc2lnbmF0dXJlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHRfc2lnbmF0dXJlKTsKLQotICAgIGlmIChzaWduYXR1cmUgIT0gMHg0NTUwKQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotCi0gICAgLyogSGVyZSBpcyB0aGUgaGFjay4gIGNvZmZfb2JqZWN0X3Agd2FudHMgdG8gcmVhZCBmaWxoc3ogYnl0ZXMgdG8KLSAgICAgICBwaWNrIHVwIHRoZSBDT0ZGIGhlYWRlci4gIFdlIGFkanVzdCBzbyB0aGF0IHRoYXQgd2lsbCB3b3JrLiAgMjAKLSAgICAgICBpcyB0aGUgc2l6ZSBvZiB0aGUgbWlwcyBDT0ZGIGZpbGVoZHIuICAqLwotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGJmZF90ZWxsIChhYmZkKSAtIGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkgKyAyMCksCi0JCSAgU0VFS19TRVQpICE9IDApCi0gICAgICB7Ci0JaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCi0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIHJldHVybiBjb2ZmX29iamVjdF9wIChhYmZkKTsKLX0KLQwKLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gdG8gaW5pdGlhbGlzZSBhbHRlcmJhdGl2ZV90YXJnZXQgZmllbGQuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0xJVFRMRV9TWU07Ci0KLS8qIFRoZSB0cmFuc2ZlciB2ZWN0b3JzIHRoYXQgbGVhZCB0aGUgb3V0c2lkZSB3b3JsZCB0byBhbGwgb2YgdGhlIGFib3ZlLiAqLwotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfQklHX05BTUUsIERfUEFHRUQsIChTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksIDAsICYgVEFSR0VUX0xJVFRMRV9TWU0pCi1DUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9MSVRUTEVfTkFNRSwgRF9QQUdFRCwgKFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwgMCwgJiBUQVJHRVRfQklHX1NZTSkKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLW1pcHMuYyBiL2JmZC9jb2ZmLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2ODdmYi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTUlQUyBFeHRlbmRlZC1Db2ZmIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBPcmlnaW5hbCB2ZXJzaW9uIGJ5IFBlciBCb3RobmVyLgotICAgRnVsbCBzdXBwb3J0IGFkZGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIGlhbkBjeWdudXMuY29tLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNpbmNsdWRlICJjb2ZmL21pcHMuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0jaW5jbHVkZSAibGliZWNvZmYuaCIKLQwKLS8qIFByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBtaXBzX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vayBQQVJBTVMgKChiZmQgKmFiZmQsIFBUUiBmaWxlaGRyKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkJICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkJICAgICAgIFBUUikpOwotc3RhdGljIHZvaWQgbWlwc19hZGp1c3RfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosCi0JCQkJCSAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJCSAgYXJlbGVudCAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2FkanVzdF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IGFyZWxlbnQgKiwKLQkJCQkJICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwc19nZW5lcmljX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQkgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkJIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCQkgUFRSIGRhdGEsCi0JCQkJCQkJIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJCSBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkJIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3JlZmhpX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3JlZmxvX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX2dwcmVsX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3JlbGhpX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3JlbGxvX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX3N3aXRjaF9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkJYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkJYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJCVBUUiBkYXRhLAotCQkJCQkJCWFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJCWJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCQljaGFyICoqZXJyb3IpKTsKLXN0YXRpYyB2b2lkIG1pcHNfcmVsb2NhdGVfaGkgUEFSQU1TICgoc3RydWN0IGludGVybmFsX3JlbG9jICpyZWZoaSwKLQkJCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlZmxvLAotCQkJCSAgICAgIGJmZCAqaW5wdXRfYmZkLAotCQkJCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIGJmZF9ieXRlICpjb250ZW50cywKLQkJCQkgICAgICBzaXplX3QgYWRqdXN0LAotCQkJCSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbiwKLQkJCQkgICAgICBib29sZWFuIHBjcmVsKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICAgIGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgICAgICBiZmRfYnl0ZSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfcmVhZF9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfcmVsYXhfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX3JlbGF4X3BjcmVsMTYgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosCi0JCQkJCSAgIGFzZWN0aW9uICosCi0JCQkJCSAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotDAotLyogRUNPRkYgaGFzIENPRkYgc2VjdGlvbnMsIGJ1dCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbgotICAgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBmb3JtYXQuICBFQ09GRiB0YXJnZXRzIHVzZSBzb21lIG9mIHRoZQotICAgc3dhcHBpbmcgcm91dGluZXMgZnJvbSBjb2Zmc3dhcC5oLCBhbmQgc29tZSBvZiB0aGUgZ2VuZXJpYyBDT0ZGCi0gICByb3V0aW5lcyBpbiBjb2ZmZ2VuLmMsIGJ1dCwgdW5saWtlIHRoZSByZWFsIENPRkYgdGFyZ2V0cywgZG8gbm90Ci0gICB1c2UgY29mZmNvZGUuaCBpdHNlbGYuCi0KLSAgIEdldCB0aGUgZ2VuZXJpYyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLCBleGNlcHQgZm9yIHRoZSByZWxvYywKLSAgIHN5bWJvbCwgYW5kIGxpbmVubyBvbmVzLiAgR2l2ZSB0aGVtIEVDT0ZGIG5hbWVzLiAgKi8KLSNkZWZpbmUgTUlQU0VDT0ZGCi0jZGVmaW5lIE5PX0NPRkZfUkVMT0NTCi0jZGVmaW5lIE5PX0NPRkZfU1lNQk9MUwotI2RlZmluZSBOT19DT0ZGX0xJTkVOT1MKLSNkZWZpbmUgY29mZl9zd2FwX2ZpbGVoZHJfaW4gbWlwc19lY29mZl9zd2FwX2ZpbGVoZHJfaW4KLSNkZWZpbmUgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX291dAotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9pbiBtaXBzX2Vjb2ZmX3N3YXBfYW91dGhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9vdXQgbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfb3V0Ci0jZGVmaW5lIGNvZmZfc3dhcF9zY25oZHJfaW4gbWlwc19lY29mZl9zd2FwX3Njbmhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfc2NuaGRyX291dCBtaXBzX2Vjb2ZmX3N3YXBfc2NuaGRyX291dAotI2luY2x1ZGUgImNvZmZzd2FwLmgiCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICAqLwotI2RlZmluZSBFQ09GRl8zMgotI2luY2x1ZGUgImVjb2Zmc3dhcC5oIgotDAotLyogSG93IHRvIHByb2Nlc3MgdGhlIHZhcmlvdXMgcmVsb2NzIHR5cGVzLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbWlwc19ob3d0b190YWJsZVtdID0KLXsKLSAgLyogUmVsb2MgdHlwZSAwIGlzIGlnbm9yZWQuICBUaGUgcmVsb2MgcmVhZGluZyBjb2RlIGVuc3VyZXMgdGhhdAotICAgICB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSAuYWJzIHNlY3Rpb24sIHdoaWNoIHdpbGwgY2F1c2UKLSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiB0byBkbyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9JR05PUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklHTk9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLCBub3JtYWxseSBmcm9tIGEgZGF0YSBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUZIQUxGLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkhBTEYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wsIG5vcm1hbGx5IGZyb20gYSBkYXRhIHNlY3Rpb24uICAqLwotICBIT1dUTyAoTUlQU19SX1JFRldPUkQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGV09SRCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyNiBiaXQgYWJzb2x1dGUganVtcCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9KTVBBRERSLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIAkJCS8qIFRoaXMgbmVlZHMgY29tcGxleCBvdmVyZmxvdwotCQkJCSAgIGRldGVjdGlvbiwgYmVjYXVzZSB0aGUgdXBwZXIgZm91cgotCQkJCSAgIGJpdHMgbXVzdCBtYXRjaCB0aGUgUEMuICAqLwotCSBtaXBzX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkpNUEFERFIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCAxNiBiaXRzIG9mIGEgc3ltYm9sIHZhbHVlLiAgSGFuZGxlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgbWlwc19yZWZoaV9yZWxvYy4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVGSEksCQkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19yZWZoaV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGSEkiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgbG93IDE2IGJpdHMgb2YgYSBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoTUlQU19SX1JFRkxPLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX3JlZmxvX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZMTyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVmZXJlbmNlIHRvIGFuIG9mZnNldCBmcm9tIHRoZSBncCByZWdpc3Rlci4gIEhhbmRsZWQgYnkgdGhlCi0gICAgIGZ1bmN0aW9uIG1pcHNfZ3ByZWxfcmVsb2MuICAqLwotICBIT1dUTyAoTUlQU19SX0dQUkVMLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfZ3ByZWxfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWZlcmVuY2UgdG8gYSBsaXRlcmFsIHVzaW5nIGFuIG9mZnNldCBmcm9tIHRoZSBncCByZWdpc3Rlci4KLSAgICAgSGFuZGxlZCBieSB0aGUgZnVuY3Rpb24gbWlwc19ncHJlbF9yZWxvYy4gICovCi0gIEhPV1RPIChNSVBTX1JfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfZ3ByZWxfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVEVSQUwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBFTVBUWV9IT1dUTyAoOCksCi0gIEVNUFRZX0hPV1RPICg5KSwKLSAgRU1QVFlfSE9XVE8gKDEwKSwKLSAgRU1QVFlfSE9XVE8gKDExKSwKLQotICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyBhIDE2IGJpdCBQQwotICAgICByZWxhdGl2ZSByZWxvYyByaWdodHNoaWZ0ZWQgdHdpY2UgYXMgdXNlZCBpbiB0aGUgTUlQUyBicmFuY2gKLSAgICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9QQ1JFTDE2LAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBDUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyB0aGUgaGlnaCAxNgotICAgICBiaXRzIG9mIGEgUEMgcmVsYXRpdmUgcmVsb2MuICBUaGUgbmV4dCByZWxvYyBtdXN0IGJlCi0gICAgIE1JUFNfUl9SRUxMTywgYW5kIHRoZSBhZGRlbmQgaXMgZm9ybWVkIGZyb20gdGhlIGFkZGVuZHMgb2YgdGhlCi0gICAgIHR3byBpbnN0cnVjdGlvbnMsIGp1c3QgYXMgaW4gTUlQU19SX1JFRkhJIGFuZCBNSVBTX1JfUkVGTE8uICBUaGUKLSAgICAgZmluYWwgdmFsdWUgaXMgYWN0dWFsbHkgUEMgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZQotICAgICBNSVBTX1JfUkVMTE8gcmVsb2MsIG5vdCB0aGUgTUlQU19SX1JFTEhJIHJlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUxISSwJCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfcmVsaGlfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFTEhJIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhpcyByZWxvYyBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KLSAgICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IHJlcHJlc2VudHMgdGhlIGxvdyAxNgotICAgICBiaXRzIG9mIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoTUlQU19SX1JFTExPLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfcmVsbG9fcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFTExPIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDE1KSwKLSAgRU1QVFlfSE9XVE8gKDE2KSwKLSAgRU1QVFlfSE9XVE8gKDE3KSwKLSAgRU1QVFlfSE9XVE8gKDE4KSwKLSAgRU1QVFlfSE9XVE8gKDE5KSwKLSAgRU1QVFlfSE9XVE8gKDIwKSwKLSAgRU1QVFlfSE9XVE8gKDIxKSwKLQotICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyBhbiBlbnRyeSBpbgotICAgICBhIHN3aXRjaCB0YWJsZSwgd2hpY2ggaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc3ltYm9scyBpbgotICAgICB0aGUgLnRleHQgc2VjdGlvbi4gIFRoZSBzeW1uZHggaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBmcm9tIHRoZQotICAgICByZWxvYyBhZGRyZXNzIHRvIHRoZSBzdWJ0cmFoZW5kLiAgU2VlIGluY2x1ZGUvY29mZi9taXBzLmggZm9yCi0gICAgIG1vcmUgZGV0YWlscy4gICovCi0gIEhPV1RPIChNSVBTX1JfU1dJVENILAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfc3dpdGNoX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTV0lUQ0giLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0jZGVmaW5lIE1JUFNfSE9XVE9fQ09VTlQgXAotICAoc2l6ZW9mIG1pcHNfaG93dG9fdGFibGUgLyBzaXplb2YgbWlwc19ob3d0b190YWJsZVswXSkKLQotLyogV2hlbiB0aGUgbGlua2VyIGlzIGRvaW5nIHJlbGF4aW5nLCBpdCBtYXkgY2hhbmdlIGEgZXh0ZXJuYWwgUENSRUwxNgotICAgcmVsb2MuICBUaGlzIHR5cGljYWxseSByZXByZXNlbnRzIGFuIGluc3RydWN0aW9uIGxpa2UKLSAgICAgICBiYWwgZm9vCi0gICBXZSBjaGFuZ2UgaXQgdG8KLSAgICAgICAuc2V0ICBub3Jlb3JkZXIKLSAgICAgICBiYWwgICAkTDEKLSAgICAgICBsdWkgICAkYXQsJWhpKGZvbyAtICRMMSkKLSAgICAgJEwxOgotICAgICAgIGFkZGl1ICRhdCwlbG8oZm9vIC0gJEwxKQotICAgICAgIGFkZHUgICRhdCwkYXQsJDMxCi0gICAgICAgamFsciAgJGF0Ci0gICBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhpcyBjaGFuZ2VzIHRoZQotICAgaW5zdHJ1Y3Rpb24gYnkuICAqLwotCi0jZGVmaW5lIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQgKDQgKiA0KQotDAotLyogU2VlIHdoZXRoZXIgdGhlIG1hZ2ljIG51bWJlciBtYXRjaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIChhYmZkLCBmaWxlaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotCi0gIHN3aXRjaCAoaW50ZXJuYWxfZi0+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+aG93dG8gPSAmbWlwc19ob3d0b190YWJsZVtpbnRlcm4tPnJfdHlwZV07Ci19Ci0KLS8qIE1ha2UgYW55IGFkanVzdG1lbnRzIG5lZWRlZCB0byBhIHJlbG9jIGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIE5vbmUKLSAgIGFyZSBuZWVkZWQgZm9yIE1JUFMuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19hZGp1c3RfcmVsb2Nfb3V0IChhYmZkLCByZWwsIGludGVybikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGFyZWxlbnQgKnJlbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Ci17Ci0gIC8qIEZvciBhIE1JUFNfUl9TV0lUQ0ggcmVsb2MsIG9yIGFuIGludGVybmFsIE1JUFNfUl9SRUxISSBvcgotICAgICBNSVBTX1JfUkVMTE8gcmVsb2MsIHdlIG11c3QgY29weSByZWwtPmFkZGVuZCBpbnRvCi0gICAgIGludGVybi0+cl9vZmZzZXQuICBUaGlzIHdpbGwgdGhlbiBiZSB3cml0dGVuIG91dCBhcyB0aGUgc3ltYm9sCi0gICAgIGluZGV4IGJ5IG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQuICBUaGlzIG9wZXJhdGlvbiBwYXJhbGxlbHMgdGhlCi0gICAgIGFjdGlvbiBvZiBtaXBzX2FkanVzdF9yZWxvY19pbi4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfU1dJVENICi0gICAgICB8fCAoISBpbnRlcm4tPnJfZXh0ZXJuCi0JICAmJiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTEhJCi0JICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTExPKSkpCi0gICAgaW50ZXJuLT5yX29mZnNldCA9IHJlbC0+YWRkZW5kOwotfQotCi0vKiBFQ09GRiByZWxvY3MgYXJlIGVpdGhlciBhZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMsIG9yIGFnYWluc3QKLSAgIHNlY3Rpb25zLiAgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgdGhlIHJlbG9jCi0gICBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIG5vdGhpbmcgaGFzIGdpdmVuIHVzIGFueQotICAgYWRkaXRpb25hbCBhZGRlbmQsIHRoZSByZXN1bHRpbmcgcmVsb2Mgd2lsbCBhbHNvIGJlIGFnYWluc3QgdGhlCi0gICBzYW1lIHN5bWJvbC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZwotICAgYWJvdXQgdGhlIHdheSB0aGUgcmVsb2MgaXMgaGFuZGxlZCwgc2luY2UgaXQgd2lsbCBhbGwgYmUgZG9uZSBhdAotICAgZmluYWwgbGluayB0aW1lLiAgUmF0aGVyIHRoYW4gcHV0IHNwZWNpYWwgY2FzZSBjb2RlIGludG8KLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGFsbCB0aGUgcmVsb2MgdHlwZXMgdXNlIHRoaXMgaG93dG8KLSAgIGZ1bmN0aW9uLiAgSXQganVzdCBzaG9ydCBjaXJjdWl0cyB0aGUgcmVsb2MgaWYgcHJvZHVjaW5nCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19nZW5lcmljX3JlbG9jIChhYmZkLAotCQkgICAgcmVsb2NfZW50cnksCi0JCSAgICBzeW1ib2wsCi0JCSAgICBkYXRhLAotCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgIG91dHB1dF9iZmQsCi0JCSAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKiBEbyBhIFJFRkhJIHJlbG9jYXRpb24uICBUaGlzIGhhcyB0byBiZSBkb25lIGluIGNvbWJpbmF0aW9uIHdpdGggYQotICAgUkVGTE8gcmVsb2MsIGJlY2F1c2UgdGhlcmUgaXMgYSBjYXJyeSBmcm9tIHRoZSBSRUZMTyB0byB0aGUgUkVGSEkuCi0gICBIZXJlIHdlIGp1c3Qgc2F2ZSB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZDsgd2UgZG8gdGhlIGFjdHVhbAotICAgcmVsb2NhdGlvbiB3aGVuIHdlIHNlZSB0aGUgUkVGTE8uICBNSVBTIEVDT0ZGIHJlcXVpcmVzIHRoYXQgdGhlCi0gICBSRUZMTyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIFJFRkhJLiAgQXMgYSBHTlUgZXh0ZW5zaW9uLCB3ZSBwZXJtaXQKLSAgIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgSEkgcmVsb2NzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBMTwotICAgcmVsb2MuICBUaGlzIGV4dGVuc2lvbiBwZXJtaXRzIGdjYyB0byBvdXRwdXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLSAgIGl0c2VsZi4gICovCi0KLXN0cnVjdCBtaXBzX2hpCi17Ci0gIHN0cnVjdCBtaXBzX2hpICpuZXh0OwotICBiZmRfYnl0ZSAqYWRkcjsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci19OwotCi0vKiBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIGEgc3RhdGljIHZhcmlhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtaXBzX2hpICptaXBzX3JlZmhpX2xpc3Q7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfcmVmaGlfcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBzdHJ1Y3QgbWlwc19oaSAqbjsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgUkVGTE8gZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbWlwc19oaSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gIG4tPm5leHQgPSBtaXBzX3JlZmhpX2xpc3Q7Ci0gIG1pcHNfcmVmaGlfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRG8gYSBSRUZMTyByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQgaW5wbGFjZQotICAgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlIFJFRkhJCi0gICByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfcmVmbG9fcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAobWlwc19yZWZoaV9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG1pcHNfaGkgKmw7Ci0KLSAgICAgIGwgPSBtaXBzX3JlZmhpX2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtaXBzX2hpICpuZXh0OwotCi0JICAvKiBEbyB0aGUgUkVGSEkgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndAotCSAgICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBSRUZMTyBpdHNlbGYsIGV4Y2VwdAotCSAgICAgd2hlcmUgdG8gZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlCi0JICAgICBSRUZISS4gICovCi0JICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgbC0+YWRkcik7Ci0JICB2YWxsbyA9IChiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQotCQkgICAmIDB4ZmZmZik7Ci0JICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotCSAgdmFsICs9IGwtPmFkZGVuZDsKLQotCSAgLyogVGhlIGxvdyBvcmRlciAxNiBiaXRzIGFyZSBhbHdheXMgdHJlYXRlZCBhcyBhIHNpZ25lZAotCSAgICAgdmFsdWUuICBUaGVyZWZvcmUsIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIGxvdyBvcmRlciBiaXRzCi0JICAgICByZXF1aXJlcyBhbiBhZGp1c3RtZW50IGluIHRoZSBoaWdoIG9yZGVyIGJpdHMuICBXZSBuZWVkCi0JICAgICB0byBtYWtlIHRoaXMgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UKLQkgICAgIHRvb2sgZnJvbSB0aGUgZGF0YSwgYW5kIG9uY2UgZm9yIHRoZSBiaXRzIHdlIGFyZSBwdXR0aW5nCi0JICAgICBiYWNrIGluIHRvIHRoZSBkYXRhLiAgKi8KLQkgIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCi0JICAgIHZhbCAtPSAweDEwMDAwOwotCSAgaWYgKCh2YWwgJiAweDgwMDApICE9IDApCi0JICAgIHZhbCArPSAweDEwMDAwOwotCi0JICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7Ci0JICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBsLT5hZGRyKTsKLQotCSAgbmV4dCA9IGwtPm5leHQ7Ci0JICBmcmVlIChsKTsKLQkgIGwgPSBuZXh0OwotCX0KLQotICAgICAgbWlwc19yZWZoaV9saXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHRoZSBSRUZMTyByZWxvYyBpbiB0aGUgdXN1YWwgd2F5LiAgKi8KLSAgcmV0dXJuIG1pcHNfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotfQotCi0vKiBEbyBhIEdQUkVMIHJlbG9jYXRpb24uICBUaGlzIGlzIGEgMTYgYml0IHZhbHVlIHdoaWNoIG11c3QgYmVjb21lCi0gICB0aGUgb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19ncHJlbF9yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfdm1hIGdwOwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFQ09GRgotICAgICBmaWxlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotICAgIH0KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiByZWxvY2F0ZWFibGUgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBncCB2YWx1ZSwgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZQotICAgICBzeW1ib2wgdmFsdWUgY29ycmVjdGx5LiAgV2UgbG9vayB1cCB0aGUgc3ltYm9sIF9ncCBpbiB0aGUgb3V0cHV0Ci0gICAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVDT0ZGCi0gICAgIHRhcmdldCBkYXRhLiAgV2UgZG9uJ3QgbmVlZCB0byBhZGp1c3QgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgYW4KLSAgICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCi0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoZ3AgPT0gMAotICAgICAgJiYgKHJlbG9jYXRlYWJsZSA9PSBmYWxzZQotCSAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApKQotICAgIHsKLSAgICAgIGlmIChyZWxvY2F0ZWFibGUgIT0gZmFsc2UpCi0JewotCSAgLyogTWFrZSB1cCBhIHZhbHVlLiAgKi8KLQkgIGdwID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMHg0MDAwOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IGNvdW50OwotCSAgYXN5bWJvbCAqKnN5bTsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOwotCSAgc3ltID0gYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKTsKLQotCSAgaWYgKHN5bSA9PSAoYXN5bWJvbCAqKikgTlVMTCkKLQkgICAgaSA9IGNvdW50OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHN5bSsrKQotCQl7Ci0JCSAgcmVnaXN0ZXIgQ09OU1QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqc3ltKTsKLQkJICBpZiAoKm5hbWUgPT0gJ18nICYmIHN0cmNtcCAobmFtZSwgIl9ncCIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGdwID0gYmZkX2FzeW1ib2xfdmFsdWUgKCpzeW0pOwotCQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpID49IGNvdW50KQotCSAgICB7Ci0JICAgICAgLyogT25seSBnZXQgdGhlIGVycm9yIG9uY2UuICAqLwotCSAgICAgIGdwID0gNDsKLQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCSAgICAgICplcnJvcl9tZXNzYWdlID0KLQkJKGNoYXIgKikgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIF9ncCBub3QgZGVmaW5lZCIpOwotCSAgICAgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIC8qIFNldCB2YWwgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9yIHN5bWJvbC4gICovCi0gIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgKyByZWxvY19lbnRyeS0+YWRkZW5kKSAmIDB4ZmZmZjsKLSAgaWYgKHZhbCAmIDB4ODAwMCkKLSAgICB2YWwgLT0gMHgxMDAwMDsKLQotICAvKiBBZGp1c3QgdmFsIGZvciB0aGUgZmluYWwgc2VjdGlvbiBsb2NhdGlvbiBhbmQgR1AgdmFsdWUuICBJZiB3ZQotICAgICBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IKLSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZSA9PSBmYWxzZQotICAgICAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgdmFsICs9IHJlbG9jYXRpb24gLSBncDsKLQotICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICh2YWwgJiAweGZmZmYpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAocmVsb2NhdGVhYmxlICE9IGZhbHNlKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogTWFrZSBzdXJlIGl0IGZpdCBpbiAxNiBiaXRzLiAgKi8KLSAgaWYgKHZhbCA+PSAweDgwMDAgJiYgdmFsIDwgMHhmZmZmODAwMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIERvIGEgUkVMSEkgcmVsb2NhdGlvbi4gIFdlIGRvIHRoaXMgaW4gY29uanVuY3Rpb24gd2l0aCBhIFJFTExPCi0gICByZWxvYywganVzdCBhcyBSRUZISSBhbmQgUkVGTE8gYXJlIGRvbmUgdG9nZXRoZXIuICBSRUxISSBhbmQgUkVMTE8KLSAgIGFyZSBDeWdudXMgZXh0ZW5zaW9ucyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbiBpbmRlcGVuZGVudAotICAgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gICovCi0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG1pcHNfaGkgKm1pcHNfcmVsaGlfbGlzdDsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19yZWxoaV9yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHN0cnVjdCBtaXBzX2hpICpuOwotCi0gIC8qIElmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIHRoZW4gaXQgaXMgY29ycmVjdAotICAgICBpbiB0aGUgb2JqZWN0IGZpbGUuICBUaGUgb25seSB0aW1lIHdlIHdhbnQgdG8gY2hhbmdlIHRoaXMgY2FzZSBpcwotICAgICB3aGVuIHdlIGFyZSByZWxheGluZywgYW5kIHRoYXQgaXMgaGFuZGxlZCBlbnRpcmVseSBieQotICAgICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gYW5kIG5ldmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24uICAqLwotICBpZiAoKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgewotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotCXJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbC4gIElmIHdlJ3JlIHJlbG9jYXRpbmcsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgUkVMTE8gZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbWlwc19oaSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gIG4tPm5leHQgPSBtaXBzX3JlbGhpX2xpc3Q7Ci0gIG1pcHNfcmVsaGlfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRG8gYSBSRUxMTyByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQgUEMKLSAgIHJlbGF0aXZlIHJlbG9jYXRpb247IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGluIG9yZGVyIHRvIGRvIHRoZSBSRUxISQotICAgcmVsb2NhdGlvbiBkZXNjcmliZWQgYWJvdmUuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX3JlbGxvX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG1pcHNfcmVsaGlfbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBtaXBzX2hpICpsOwotCi0gICAgICBsID0gbWlwc19yZWxoaV9saXN0OwotICAgICAgd2hpbGUgKGwgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluc247Ci0JICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0JICBzdHJ1Y3QgbWlwc19oaSAqbmV4dDsKLQotCSAgLyogRG8gdGhlIFJFTEhJIHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QKLQkgICAgIG5lZWQgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgUkVMTE8gaXRzZWxmLCBleGNlcHQKLQkgICAgIHdoZXJlIHRvIGZpbmQgdGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbmVlZGVkIGJ5IHRoZQotCSAgICAgUkVMSEkuICAqLwotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOwotCSAgdmFsbG8gPSAoYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcykKLQkJICAgJiAweGZmZmYpOwotCSAgdmFsID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyB2YWxsbzsKLQkgIHZhbCArPSBsLT5hZGRlbmQ7Ci0KLQkgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgbWFrZSB2YWwgUEMgcmVsYXRpdmUuICBJZiB0aGUKLQkgICAgIHN5bWJvbCBpcyBub3QgZGVmaW5lZCB3ZSBkb24ndCB3YW50IHRvIGRvIHRoaXMsIGJlY2F1c2UKLQkgICAgIHdlIGRvbid0IHdhbnQgdGhlIHZhbHVlIGluIHRoZSBvYmplY3QgZmlsZSB0byBpbmNvcnBvcmF0ZQotCSAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jLiAgKi8KLQkgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpKQotCSAgICAgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bWJvbCkpKQotCSAgICB2YWwgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLQkgIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQKLQkgICAgIHZhbHVlLiAgVGhlcmVmb3JlLCBhIG5lZ2F0aXZlIHZhbHVlIGluIHRoZSBsb3cgb3JkZXIgYml0cwotCSAgICAgcmVxdWlyZXMgYW4gYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZAotCSAgICAgdG8gbWFrZSB0aGlzIGFkanVzdG1lbnQgaW4gdHdvIHdheXM6IG9uY2UgZm9yIHRoZSBiaXRzIHdlCi0JICAgICB0b29rIGZyb20gdGhlIGRhdGEsIGFuZCBvbmNlIGZvciB0aGUgYml0cyB3ZSBhcmUgcHV0dGluZwotCSAgICAgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCi0JICBpZiAoKHZhbGxvICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgLT0gMHgxMDAwMDsKLQkgIGlmICgodmFsICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgKz0gMHgxMDAwMDsKLQotCSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgbC0+YWRkcik7Ci0KLQkgIG5leHQgPSBsLT5uZXh0OwotCSAgZnJlZSAobCk7Ci0JICBsID0gbmV4dDsKLQl9Ci0KLSAgICAgIG1pcHNfcmVsaGlfbGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIHRoZW4gaXQgaXMgY29ycmVjdAotICAgICBpbiB0aGUgb2JqZWN0IGZpbGUuICBUaGUgb25seSB0aW1lIHdlIHdhbnQgdG8gY2hhbmdlIHRoaXMgY2FzZSBpcwotICAgICB3aGVuIHdlIGFyZSByZWxheGluZywgYW5kIHRoYXQgaXMgaGFuZGxlZCBlbnRpcmVseSBieQotICAgICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gYW5kIG5ldmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24uICAqLwotICBpZiAoKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgewotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotCXJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGRvZXMgbm90IGhhbmRsZSBwY3JlbF9vZmZzZXQgcmVsb2NhdGlvbnMKLSAgICAgY29ycmVjdGx5IHdoZW4gZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBmaWxlLCBzbyBoYW5kbGUgdGhlbQotICAgICBkaXJlY3RseSBoZXJlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBOb3cgZG8gdGhlIFJFTExPIHJlbG9jIGluIHRoZSB1c3VhbCB3YXkuICAqLwotICByZXR1cm4gbWlwc19nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIHNwZWNpYWwgZnVuY3Rpb24gZm9yIHRoZSBNSVBTX1JfU1dJVENIIHJlbG9jLiAgVGhpcwotICAgc3BlY2lhbCByZWxvYyBpcyBub3JtYWxseSBjb3JyZWN0IGluIHRoZSBvYmplY3QgZmlsZSwgYW5kIG9ubHkKLSAgIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgd2hlbiByZWxheGluZy4gIFdlIGRvbid0IHdhbnQKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gdG8gdGFtcGVyIHdpdGggaXQgYXQgYWxsLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX3N3aXRjaF9yZWxvYyAoYWJmZCwKLQkJICAgcmVsb2NfZW50cnksCi0JCSAgIHN5bWJvbCwKLQkJICAgZGF0YSwKLQkJICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgb3V0cHV0X2JmZCwKLQkJICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogR2V0IHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIGEgZ2VuZXJpYyByZWxvYyB0eXBlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaW50IG1pcHNfdHlwZTsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhBTEY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRldPUkQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0pNUDoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9KTVBBRERSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFRkhJOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZMTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR1BSRUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfR1BSRUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUw6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfTElURVJBTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1BDUkVMMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1M6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUkVMSEk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9MTzE2OgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFTExPOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9TV0lUQ0g7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmbWlwc19ob3d0b190YWJsZVttaXBzX3R5cGVdOwotfQotDAotLyogQSBoZWxwZXIgcm91dGluZSBmb3IgbWlwc19yZWxvY2F0ZV9zZWN0aW9uIHdoaWNoIGhhbmRsZXMgdGhlIFJFRkhJCi0gICBhbmQgUkVMSEkgcmVsb2NhdGlvbnMuICBUaGUgUkVGSEkgcmVsb2NhdGlvbiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEKLSAgIFJFRkxPIHJlbG9jYXRpb24gKGFuZCBSRUxISSBieSBhIFJFTExPKSwgYW5kIHRoZSBhZGRlbmQgdXNlZCBpcwotICAgZm9ybWVkIGZyb20gdGhlIGFkZGVuZHMgb2YgYm90aCBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19yZWxvY2F0ZV9oaSAocmVmaGksIHJlZmxvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBhZGp1c3QsCi0JCSAgcmVsb2NhdGlvbiwgcGNyZWwpCi0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmaGk7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmbG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzaXplX3QgYWRqdXN0OwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGJvb2xlYW4gcGNyZWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0KLSAgaWYgKHJlZmhpID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAKLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJICAgICBjb250ZW50cyArIGFkanVzdCArIHJlZmhpLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLSAgaWYgKHJlZmxvID09IE5VTEwpCi0gICAgdmFsbG8gPSAwOwotICBlbHNlCi0gICAgdmFsbG8gPSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJIGNvbnRlbnRzICsgYWRqdXN0ICsgcmVmbG8tPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpCi0JICAgICAmIDB4ZmZmZik7Ci0gCi0gIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgdmFsbG87Ci0gIHZhbCArPSByZWxvY2F0aW9uOwotCi0gIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQgdmFsdWUuCi0gICAgIFRoZXJlZm9yZSwgYSBuZWdhdGl2ZSB2YWx1ZSBpbiB0aGUgbG93IG9yZGVyIGJpdHMgcmVxdWlyZXMgYW4KLSAgICAgYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZCB0byBtYWtlIHRoaXMKLSAgICAgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UgdG9vayBmcm9tIHRoZSBkYXRhLAotICAgICBhbmQgb25jZSBmb3IgdGhlIGJpdHMgd2UgYXJlIHB1dHRpbmcgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCi0gIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCi0gICAgdmFsIC09IDB4MTAwMDA7Ci0KLSAgaWYgKHBjcmVsKQotICAgIHZhbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkgICAgKyAocmVmbG8tPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEgKyBhZGp1c3QpKTsKLQotICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLSAgICB2YWwgKz0gMHgxMDAwMDsKLQotICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sCi0JICAgICAgY29udGVudHMgKyBhZGp1c3QgKyByZWZoaS0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgc2VjdGlvbiB3aGlsZSBsaW5raW5nIGEgTUlQUyBFQ09GRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgY29udGVudHMsIGV4dGVybmFsX3JlbG9jcykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci17Ci0gIGFzZWN0aW9uICoqc3ltbmR4X3RvX3NlY3Rpb247Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hIGdwOwotICBib29sZWFuIGdwX3VuZGVmaW5lZDsKLSAgc2l6ZV90IGFkanVzdDsKLSAgbG9uZyAqb2Zmc2V0czsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYm9vbGVhbiBnb3RfbG87Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBsb19pbnRfcmVsOwotCi0gIEJGRF9BU1NFUlQgKGlucHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0JICAgICAgPT0gb3V0cHV0X2JmZC0+eHZlYy0+Ynl0ZW9yZGVyKTsKLQotICAvKiBXZSBrZWVwIGEgdGFibGUgbWFwcGluZyB0aGUgc3ltbmR4IGZvdW5kIGluIGFuIGludGVybmFsIHJlbG9jIHRvCi0gICAgIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uLiAgVGhpcyBpcyBmYXN0ZXIgdGhhbiBsb29raW5nIHVwIHRoZQotICAgICBzZWN0aW9uIGJ5IG5hbWUgZWFjaCB0aW1lLiAgKi8KLSAgc3ltbmR4X3RvX3NlY3Rpb24gPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1uZHhfdG9fc2VjdGlvbjsKLSAgaWYgKHN5bW5keF90b19zZWN0aW9uID09IChhc2VjdGlvbiAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbiA9ICgoYXNlY3Rpb24gKiopCi0JCQkgICBiZmRfYWxsb2MgKGlucHV0X2JmZCwKLQkJCQkgICAgICAoTlVNX1JFTE9DX1NFQ1RJT05TCi0JCQkJICAgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKLSAgICAgIGlmICghc3ltbmR4X3RvX3NlY3Rpb24pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX05PTkVdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fVEVYVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIudGV4dCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9SREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIucmRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuZGF0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9TREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2RhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0JTU10gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2JzcyIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9CU1NdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmJzcyIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9JTklUXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5pbml0Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDhdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDgiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUNF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIubGl0NCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9YREFUQV0gPSBOVUxMOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9QREFUQV0gPSBOVUxMOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9GSU5JXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5maW5pIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVEFdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQUJTXSA9IE5VTEw7Ci0KLSAgICAgIGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnN5bW5keF90b19zZWN0aW9uID0gc3ltbmR4X3RvX3NlY3Rpb247Ci0gICAgfQotCi0gIHN5bV9oYXNoZXMgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1faGFzaGVzOwotCi0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoZ3AgPT0gMCkKLSAgICBncF91bmRlZmluZWQgPSB0cnVlOwotICBlbHNlCi0gICAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0KLSAgZ290X2xvID0gZmFsc2U7Ci0KLSAgYWRqdXN0ID0gMDsKLQotICBpZiAoZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pID09IE5VTEwpCi0gICAgb2Zmc2V0cyA9IE5VTEw7Ci0gIGVsc2UKLSAgICBvZmZzZXRzID0gZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLT5vZmZzZXRzOwotCi0gIGV4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIGV4dGVybmFsX3JlbG9jczsKLSAgZXh0X3JlbF9lbmQgPSBleHRfcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaSA9IDA7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrLCBpKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGludF9yZWw7Ci0gICAgICBib29sZWFuIHVzZV9sbyA9IGZhbHNlOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotICAgICAgYXNlY3Rpb24gKnMgPSBOVUxMOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIGlmICghIGdvdF9sbykKLQltaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGlucHV0X2JmZCwgKFBUUikgZXh0X3JlbCwgJmludF9yZWwpOwotICAgICAgZWxzZQotCXsKLQkgIGludF9yZWwgPSBsb19pbnRfcmVsOwotCSAgZ290X2xvID0gZmFsc2U7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfdHlwZQotCQkgIDwgc2l6ZW9mIG1pcHNfaG93dG9fdGFibGUgLyBzaXplb2YgbWlwc19ob3d0b190YWJsZVswXSk7Ci0KLSAgICAgIC8qIFRoZSBSRUZISSBhbmQgUkVMSEkgcmVsb2NzIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcuICB0aGV5Ci0JIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBSRUZMTyBvciBSRUxMTyByZWxvYywgcmVzcGVjdGl2ZWx5LCBhbmQKLQkgdGhlIGFkZGVuZCBpcyBmb3JtZWQgZnJvbSBib3RoIHJlbG9jcy4gICovCi0gICAgICBpZiAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFRkhJCi0JICB8fCBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpCi0JewotCSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpsb19leHRfcmVsOwotCi0JICAvKiBBcyBhIEdOVSBleHRlbnNpb24sIHBlcm1pdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIFJFRkhJCi0gICAgICAgICAgICAgb3IgUkVMSEkgcmVsb2NzIGJlZm9yZSB0aGUgUkVGTE8gb3IgUkVMTE8gcmVsb2MuICBUaGlzCi0gICAgICAgICAgICAgcGVybWl0cyBnY2MgdG8gZW1pdCB0aGUgSEkgYW5kIExPIHJlbG9jcyBpdHNlbGYuICAqLwotCSAgZm9yIChsb19leHRfcmVsID0gZXh0X3JlbCArIDE7Ci0JICAgICAgIGxvX2V4dF9yZWwgPCBleHRfcmVsX2VuZDsKLQkgICAgICAgbG9fZXh0X3JlbCsrKQotCSAgICB7Ci0JICAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChpbnB1dF9iZmQsIChQVFIpIGxvX2V4dF9yZWwsCi0JCQkJCSZsb19pbnRfcmVsKTsKLQkgICAgICBpZiAobG9faW50X3JlbC5yX3R5cGUgIT0gaW50X3JlbC5yX3R5cGUpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChsb19leHRfcmVsIDwgZXh0X3JlbF9lbmQKLQkgICAgICAmJiAobG9faW50X3JlbC5yX3R5cGUKLQkJICA9PSAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFRkhJCi0JCSAgICAgID8gTUlQU19SX1JFRkxPCi0JCSAgICAgIDogTUlQU19SX1JFTExPKSkKLQkgICAgICAmJiBpbnRfcmVsLnJfZXh0ZXJuID09IGxvX2ludF9yZWwucl9leHRlcm4KLQkgICAgICAmJiBpbnRfcmVsLnJfc3ltbmR4ID09IGxvX2ludF9yZWwucl9zeW1uZHgpCi0JICAgIHsKLQkgICAgICB1c2VfbG8gPSB0cnVlOwotCSAgICAgIGlmIChsb19leHRfcmVsID09IGV4dF9yZWwgKyAxKQotCQlnb3RfbG8gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBob3d0byA9ICZtaXBzX2hvd3RvX3RhYmxlW2ludF9yZWwucl90eXBlXTsKLQotICAgICAgLyogVGhlIFNXSVRDSCByZWxvYyBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgVGhpcyByZWxvYyBpcwotCSBtYXJrcyB0aGUgbG9jYXRpb24gb2YgYSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHBvcnRpb25zIG9mIGFuCi0JIG9iamVjdCBmaWxlLiAgVGhlIHN5bWJvbCBpbmRleCBkb2VzIG5vdCByZWZlcmVuY2UgYSBzeW1ib2wsCi0JIGJ1dCBpcyBhY3R1YWxseSB0aGUgb2Zmc2V0IGZyb20gdGhlIHJlbG9jIHRvIHRoZSBzdWJ0cmFoZW5kCi0JIG9mIHRoZSBkaWZmZXJlbmNlLiAgVGhpcyByZWxvYyBpcyBjb3JyZWN0IGluIHRoZSBvYmplY3QgZmlsZSwKLQkgYW5kIG5lZWRzIG5vIGZ1cnRoZXIgYWRqdXN0bWVudCwgdW5sZXNzIHdlIGFyZSByZWxheGluZy4gIElmCi0JIHdlIGFyZSByZWxheGluZywgd2UgbWF5IGhhdmUgdG8gYWRkIGluIGFuIG9mZnNldC4gIFNpbmNlIG5vCi0JIHN5bWJvbHMgYXJlIGludm9sdmVkIGluIHRoaXMgcmVsb2MsIHdlIGhhbmRsZSBpdCBjb21wbGV0ZWx5Ci0JIGhlcmUuICAqLwotICAgICAgaWYgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9TV0lUQ0gpCi0JewotCSAgaWYgKG9mZnNldHMgIT0gTlVMTAotCSAgICAgICYmIG9mZnNldHNbaV0gIT0gMCkKLQkgICAgewotCSAgICAgIHIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLAotCQkJCQkgIChiZmRfdm1hKSBvZmZzZXRzW2ldLAotCQkJCQkgIChjb250ZW50cwotCQkJCQkgICArIGFkanVzdAotCQkJCQkgICArIGludF9yZWwucl92YWRkcgotCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCSAgICAgIEJGRF9BU1NFUlQgKHIgPT0gYmZkX3JlbG9jX29rKTsKLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChpbnRfcmVsLnJfZXh0ZXJuKQotCXsKLQkgIGggPSBzeW1faGFzaGVzW2ludF9yZWwucl9zeW1uZHhdOwotCSAgLyogSWYgaCBpcyBOVUxMLCB0aGF0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IGFuCi0JICAgICBleHRlcm5hbCBzeW1ib2wgd2hpY2ggd2UgdGhvdWdodCB3YXMganVzdCBhIGRlYnVnZ2luZwotCSAgICAgc3ltYm9sLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbi4gICovCi0JICBpZiAoaCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGludF9yZWwucl9zeW1uZHggPCAwIHx8IGludF9yZWwucl9zeW1uZHggPj0gTlVNX1JFTE9DX1NFQ1RJT05TKQotCSAgICBzID0gTlVMTDsKLQkgIGVsc2UKLQkgICAgcyA9IHN5bW5keF90b19zZWN0aW9uW2ludF9yZWwucl9zeW1uZHhdOwotCi0JICBpZiAocyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBUaGUgR1BSRUwgcmVsb2MgdXNlcyBhbiBhZGRlbmQ6IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBHUAotCSB2YWx1ZXMuICAqLwotICAgICAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9HUFJFTAotCSAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX0xJVEVSQUwpCi0JYWRkZW5kID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZ3BfdW5kZWZpbmVkKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCSAgICAgKGluZm8sIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gd2hlbiBHUCBub3QgZGVmaW5lZCIpLAotCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogT25seSBnaXZlIHRoZSBlcnJvciBvbmNlIHBlciBsaW5rLiAgKi8KLQkgICAgICBncCA9IDQ7Ci0JICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQkgICAgICBncF91bmRlZmluZWQgPSBmYWxzZTsKLQkgICAgfQotCSAgaWYgKCEgaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgVGhlIGN1cnJlbnQKLQkJIGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotCQkgSU5QVVRfU0VDVElPTi0+dm1hIGFuZCB0aGUgR1AgdmFsdWUgb2YgSU5QVVRfQkZELiAgV2UKLQkJIG11c3QgY2hhbmdlIHRoaXMgdG8gYmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLQkJIGZpbmFsIGRlZmluaXRpb24gKHdoaWNoIHdpbGwgZW5kIHVwIGluIFJFTE9DQVRJT04pCi0JCSBhbmQgdGhlIEdQIHZhbHVlIG9mIE9VVFBVVF9CRkQgKHdoaWNoIGlzIGluIEdQKS4gICovCi0JICAgICAgYWRkZW5kID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Z3AgLSBncDsKLQkgICAgfQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sLiAgVGhlCi0JCSBjdXJyZW50IGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgc2ltcGx5IHRoZQotCQkgZGVzaXJlZCBvZmZzZXQgaW50byB0aGUgc3ltYm9sIChub3JtYWxseSB6ZXJvKS4gIFdlCi0JCSBhcmUgZ29pbmcgdG8gY2hhbmdlIHRoaXMgaW50byBhIHJlbG9jYXRpb24gYWdhaW5zdCBhCi0JCSBkZWZpbmVkIHN5bWJvbCwgc28gd2Ugd2FudCB0aGUgaW5zdHJ1Y3Rpb24gdG8gaG9sZAotCQkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZmluYWwgZGVmaW5pdGlvbiBvZiB0aGUKLQkJIHN5bWJvbCAod2hpY2ggd2lsbCBlbmQgdXAgaW4gUkVMT0NBVElPTikgYW5kIHRoZSBHUAotCQkgdmFsdWUgb2YgT1VUUFVUX0JGRCAod2hpY2ggaXMgaW4gR1ApLiAgKi8KLQkgICAgICBhZGRlbmQgPSAtIGdwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuIHVuZGVmaW5lZCBvciBjb21tb24KLQkJIHN5bWJvbC4gIFRoZSBjdXJyZW50IGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMKLQkJIHNpbXBseSB0aGUgZGVzaXJlZCBvZmZzZXQgaW50byB0aGUgc3ltYm9sIChub3JtYWxseQotCQkgemVybykuICBXZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgd2UKLQkJIGFyZW4ndCBnb2luZyB0byBkZWZpbmUgdGhpcyBzeW1ib2wsIHNvIHdlIGp1c3QgbGVhdmUKLQkJIHRoZSBpbnN0cnVjdGlvbiBhbG9uZS4gICovCi0JICAgICAgYWRkZW5kID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHJlbGF4aW5nLCBtaXBzX3JlbGF4X3NlY3Rpb24gbWF5IGhhdmUgc2V0Ci0JIG9mZnNldHNbaV0gdG8gc29tZSB2YWx1ZS4gIEEgdmFsdWUgb2YgMSBtZWFucyB3ZSBtdXN0IGV4cGFuZAotCSBhIFBDIHJlbGF0aXZlIGJyYW5jaCBpbnRvIGEgbXVsdGktaW5zdHJ1Y3Rpb24gb2Ygc2VxdWVuY2UsCi0JIGFuZCBhbnkgb3RoZXIgdmFsdWUgaXMgYW4gYWRkZW5kLiAgKi8KLSAgICAgIGlmIChvZmZzZXRzICE9IE5VTEwKLQkgICYmIG9mZnNldHNbaV0gIT0gMCkKLQl7Ci0JICBCRkRfQVNTRVJUICghIGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0JICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUENSRUwxNgotCQkgICAgICB8fCBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkKLQkJICAgICAgfHwgaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTExPKTsKLQkgIGlmIChvZmZzZXRzW2ldICE9IDEpCi0JICAgIGFkZGVuZCArPSBvZmZzZXRzW2ldOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgKmhlcmU7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfZXh0ZXJuCi0JCQkgICYmIGludF9yZWwucl90eXBlID09IE1JUFNfUl9QQ1JFTDE2KTsKLQotCSAgICAgIC8qIE1vdmUgdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9ucyB1cC4gICovCi0JICAgICAgaGVyZSA9IChjb250ZW50cwotCQkgICAgICArIGFkanVzdAotCQkgICAgICArIGludF9yZWwucl92YWRkcgotCQkgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgbWVtbW92ZSAoaGVyZSArIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQsIGhlcmUsCi0JCSAgICAgICAoc2l6ZV90KSAoaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplCi0JCQkJIC0gKGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKTsKLQkJICAgICAgIAotCSAgICAgIC8qIEdlbmVyYXRlIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgICAgICBpZiAoISBtaXBzX3JlbGF4X3BjcmVsMTYgKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJaCwgaGVyZSwKLQkJCQkJKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJCQkgKyAoaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkKLQkJCQkJICsgYWRqdXN0KSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIFdlIG11c3QgYWRqdXN0IGV2ZXJ5dGhpbmcgZWxzZSB1cCBhIG5vdGNoLiAgKi8KLQkgICAgICBhZGp1c3QgKz0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQotCSAgICAgIC8qIG1pcHNfcmVsYXhfcGNyZWwxNiBoYW5kbGVzIGFsbCB0aGUgZGV0YWlscyBvZiB0aGlzCi0JCSByZWxvY2F0aW9uLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHJlbGF4aW5nLCBhbmQgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIC50ZXh0Ci0JIHNlZ21lbnQsIHdlIG1heSBuZWVkIHRvIGFkanVzdCBpdCBpZiBzb21lIGJyYW5jaGVzIGhhdmUgYmVlbgotCSBleHBhbmRlZC4gIFRoZSByZWxvYyB0eXBlcyB3aGljaCBhcmUgbGlrZWx5IHRvIG9jY3VyIGluIHRoZQotCSAudGV4dCBzZWN0aW9uIGFyZSBoYW5kbGVkIGVmZmljaWVudGx5IGJ5IG1pcHNfcmVsYXhfc2VjdGlvbiwKLQkgYW5kIHRodXMgZG8gbm90IG5lZWQgdG8gYmUgaGFuZGxlZCBoZXJlLiAgKi8KLSAgICAgIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvLmFkanVzdCAhPSBOVUxMCi0JICAmJiAhIGludF9yZWwucl9leHRlcm4KLQkgICYmIGludF9yZWwucl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9URVhUCi0JICAmJiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKLQkJICAgICAgIi50ZXh0IikgIT0gMAotCSAgICAgIHx8IChpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUENSRUwxNgotCQkgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9TV0lUQ0gKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMSEkKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMTE8pKSkKLQl7Ci0JICBiZmRfdm1hIGFkcjsKLQkgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmE7Ci0KLQkgIC8qIFdlIG5lZWQgdG8gZ2V0IHRoZSBhZGRlbmQgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgd2UgbmVlZAotCSAgICAgdG8gYWRqdXN0IHRoZSBhZGRyZXNzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUZXT1JEKTsKLQotCSAgYWRyID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJICAgIChjb250ZW50cwotCQkJICAgICArIGFkanVzdAotCQkJICAgICArIGludF9yZWwucl92YWRkcgotCQkJICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCi0JICBmb3IgKGEgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvLmFkanVzdDsKLQkgICAgICAgYSAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMOwotCSAgICAgICBhID0gYS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChhZHIgPj0gYS0+c3RhcnQgJiYgYWRyIDwgYS0+ZW5kKQotCQlhZGRlbmQgKz0gYS0+YWRqdXN0OwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFuZCBtdXN0IGNvbnZlcnQKLQkgICAgIHRoZSBleGlzdGluZyByZWxvYy4gICovCi0JICBpZiAoaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIG91dHB1dC4gIENvbnZlcnQKLQkJICAgICB0aGUgcmVsb2MgZnJvbSBiZWluZyBhZ2FpbnN0IHRoZSBzeW1ib2wgdG8gYmVpbmcKLQkJICAgICBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLQotCQkgIC8qIENsZWFyIHRoZSByX2V4dGVybiBiaXQuICAqLwotCQkgIGludF9yZWwucl9leHRlcm4gPSAwOwotCi0JCSAgLyogQ29tcHV0ZSBhIG5ldyByX3N5bW5keCB2YWx1ZS4gICovCi0JCSAgcyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0KLQkJICBpbnRfcmVsLnJfc3ltbmR4ID0gLTE7Ci0JCSAgc3dpdGNoIChuYW1lWzFdKQotCQkgICAgewotCQkgICAgY2FzZSAnYic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdkJzoKLQkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0RBVEE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnZic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9GSU5JOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2knOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdsJzoKLQkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDg7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncic6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkRBVEE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncyc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0RBVEE7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NCU1M7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9URVhUOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAgICAgCi0JCSAgaWYgKGludF9yZWwucl9zeW1uZHggPT0gLTEpCi0JCSAgICBhYm9ydCAoKTsKLQotCQkgIC8qIEFkZCB0aGUgc2VjdGlvbiBWTUEgYW5kIHRoZSBzeW1ib2wgdmFsdWUuICAqLwotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgcy0+b3V0cHV0X29mZnNldCk7Ci0KLQkJICAvKiBGb3IgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLCB0aGUgb2JqZWN0IGZpbGUKLQkJICAgICBjdXJyZW50bHkgaG9sZHMganVzdCB0aGUgYWRkZW5kLiAgV2UgbXVzdCBhZGp1c3QKLQkJICAgICBieSB0aGUgYWRkcmVzcyB0byBnZXQgdGhlIHJpZ2h0IHZhbHVlLiAgKi8KLQkJICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCQkgICAgewotCQkgICAgICByZWxvY2F0aW9uIC09IGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQotCQkgICAgICAvKiBJZiB3ZSBhcmUgY29udmVydGluZyBhIFJFTEhJIG9yIFJFTExPIHJlbG9jCi0JCQkgZnJvbSBiZWluZyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCB0bwotCQkJIGJlaW5nIGFnYWluc3QgYSBzZWN0aW9uLCB3ZSBtdXN0IHB1dCBhCi0JCQkgc3BlY2lhbCB2YWx1ZSBpbnRvIHRoZSByX29mZnNldCBmaWVsZC4gIFRoaXMKLQkJCSB2YWx1ZSBpcyB0aGUgb2xkIGFkZGVuZC4gIFRoZSByX29mZnNldCBmb3IKLQkJCSBib3RoIHRoZSBSRUxISSBhbmQgUkVMTE8gcmVsb2NzIGFyZSB0aGUgc2FtZSwKLQkJCSBhbmQgd2Ugc2V0IGJvdGggd2hlbiB3ZSBzZWUgUkVMSEkuICAqLwotCQkgICAgICBpZiAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCQkJewotCQkJICBsb25nIGFkZGhpLCBhZGRsbzsKLQotCQkJICBhZGRoaSA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkJICAgICAgKGNvbnRlbnRzCi0JCQkJCSAgICAgICArIGFkanVzdAotCQkJCQkgICAgICAgKyBpbnRfcmVsLnJfdmFkZHIKLQkJCQkJICAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSk7Ci0JCQkgIGFkZGhpICY9IDB4ZmZmZjsKLQkJCSAgaWYgKGFkZGhpICYgMHg4MDAwKQotCQkJICAgIGFkZGhpIC09IDB4MTAwMDA7Ci0JCQkgIGFkZGhpIDw8PSAxNjsKLQotCQkJICBpZiAoISB1c2VfbG8pCi0JCQkgICAgYWRkbG8gPSAwOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgYWRkbG8gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJCQkgIChjb250ZW50cwotCQkJCQkJICAgKyBhZGp1c3QKLQkJCQkJCSAgICsgbG9faW50X3JlbC5yX3ZhZGRyCi0JCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCQkJICAgICAgYWRkbG8gJj0gMHhmZmZmOwotCQkJICAgICAgaWYgKGFkZGxvICYgMHg4MDAwKQotCQkJCWFkZGxvIC09IDB4MTAwMDA7Ci0KLQkJCSAgICAgIGxvX2ludF9yZWwucl9vZmZzZXQgPSBhZGRoaSArIGFkZGxvOwotCQkJICAgIH0KLQotCQkJICBpbnRfcmVsLnJfb2Zmc2V0ID0gYWRkaGkgKyBhZGRsbzsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGggPSBOVUxMOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQ2hhbmdlIHRoZSBzeW1uZHggdmFsdWUgdG8gdGhlIHJpZ2h0IG9uZSBmb3IgdGhlCi0JCSAgICAgb3V0cHV0IEJGRC4gICovCi0JCSAgaW50X3JlbC5yX3N5bW5keCA9IGgtPmluZHg7Ci0JCSAgaWYgKGludF9yZWwucl9zeW1uZHggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gICovCi0JCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaW50X3JlbC5yX3N5bW5keCA9IDA7Ci0JCSAgICB9Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBBZGp1c3QgdGhlCi0JCSB2YWx1ZSBieSB0aGUgYW1vdW50IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KLQkgICAgICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHMtPnZtYSk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiArPSBhZGRlbmQ7Ci0JICBhZGRlbmQgPSAwOwotCi0JICAvKiBBZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2UKLQkgICAgIHRvIHRoZSBvcmlnaW5hbCBhZGRyZXNzIGluIHRoZSBzZWN0aW9uIGFuZCBpbmNsdWRpbmcgdGhlCi0JICAgICByZWZlcmVuY2UgdG8gdGhlIG5ldyBhZGRyZXNzLiAgSG93ZXZlciwgZXh0ZXJuYWwgUkVMSEkKLQkgICAgIGFuZCBSRUxMTyByZWxvY3MgYXJlIFBDIHJlbGF0aXZlLCBidXQgZG9uJ3QgaW5jbHVkZSBhbnkKLQkgICAgIHJlZmVyZW5jZSB0byB0aGUgYWRkcmVzcy4gIFRoZSBhZGRlbmQgaXMgbWVyZWx5IGFuCi0JICAgICBhZGRlbmQuICAqLwotCSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZQotCSAgICAgICYmICghIGludF9yZWwucl9leHRlcm4KLQkJICB8fCAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJCi0JCSAgICAgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxMTykpKQotCSAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCSAgLyogQWRqdXN0IHRoZSBjb250ZW50cy4gICovCi0JICBpZiAocmVsb2NhdGlvbiA9PSAwKQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUZISQotCQkgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISSkKLQkJciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJCSAgICAoY29udGVudHMKLQkJCQkJICAgICArIGFkanVzdAotCQkJCQkgICAgICsgaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBtaXBzX3JlbG9jYXRlX2hpICgmaW50X3JlbCwKLQkJCQkgICAgdXNlX2xvID8gJmxvX2ludF9yZWwgOiBOVUxMLAotCQkJCSAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCSAgICBhZGp1c3QsIHJlbG9jYXRpb24sCi0JCQkJICAgIGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSk7Ci0JCSAgciA9IGJmZF9yZWxvY19vazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIEFkanVzdCB0aGUgcmVsb2MgYWRkcmVzcy4gICovCi0JICBpbnRfcmVsLnJfdmFkZHIgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0JICAvKiBTYXZlIHRoZSBjaGFuZ2VkIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLQkgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQgKGlucHV0X2JmZCwgJmludF9yZWwsIChQVFIpIGV4dF9yZWwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBhcmUgcHJvZHVjaW5nIGEgZmluYWwgZXhlY3V0YWJsZS4gICovCi0JICBpZiAoaW50X3JlbC5yX2V4dGVybikKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBhc2VjdGlvbiAqaHNlYzsKLQotCQkgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24uICAqLwotCSAgICAgIHJlbG9jYXRpb24gPSAocy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgcy0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gcy0+dm1hKTsKLQotCSAgICAgIC8qIEEgUEMgcmVsYXRpdmUgcmVsb2MgaXMgYWxyZWFkeSBjb3JyZWN0IGluIHRoZSBvYmplY3QKLQkJIGZpbGUuICBNYWtlIGl0IGxvb2sgbGlrZSBhIHBjcmVsX29mZnNldCByZWxvY2F0aW9uIGJ5Ci0JCSBhZGRpbmcgaW4gdGhlIHN0YXJ0IGFkZHJlc3MuICAqLwotCSAgICAgIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0JCXsKLQkJICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJIHx8ICEgdXNlX2xvKQotCQkgICAgcmVsb2NhdGlvbiArPSBpbnRfcmVsLnJfdmFkZHIgKyBhZGp1c3Q7Ci0JCSAgZWxzZQotCQkgICAgcmVsb2NhdGlvbiArPSBsb19pbnRfcmVsLnJfdmFkZHIgKyBhZGp1c3Q7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFRkhJCi0JICAgICAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJKQotCSAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywKLQkJCQkJICBpbnB1dF9iZmQsCi0JCQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICBjb250ZW50cywKLQkJCQkJICAoaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSAgICsgYWRqdXN0KSwKLQkJCQkJICByZWxvY2F0aW9uLAotCQkJCQkgIGFkZGVuZCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtaXBzX3JlbG9jYXRlX2hpICgmaW50X3JlbCwKLQkJCQl1c2VfbG8gPyAmbG9faW50X3JlbCA6IE5VTEwsCi0JCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgYWRqdXN0LAotCQkJCXJlbG9jYXRpb24sCi0JCQkJaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKTsKLQkgICAgICByID0gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBNSVBTX1JfSk1QQUREUiByZXF1aXJlcyBwZWN1bGlhciBvdmVyZmxvdyBkZXRlY3Rpb24uICBUaGUKLQkgaW5zdHJ1Y3Rpb24gcHJvdmlkZXMgYSAyOCBiaXQgYWRkcmVzcyAodGhlIHR3byBsb3dlciBiaXRzIGFyZQotCSBpbXBsaWNpdCB6ZXJvZXMpIHdoaWNoIGlzIGNvbWJpbmVkIHdpdGggdGhlIHVwcGVyIGZvdXIgYml0cwotCSBvZiB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4gICovCi0gICAgICBpZiAociA9PSBiZmRfcmVsb2Nfb2sKLQkgICYmIGludF9yZWwucl90eXBlID09IE1JUFNfUl9KTVBBRERSCi0JICAmJiAoKChyZWxvY2F0aW9uCi0JCSsgYWRkZW5kCi0JCSsgKGludF9yZWwucl9leHRlcm4gPyAwIDogcy0+dm1hKSkKLQkgICAgICAgJiAweGYwMDAwMDAwKQotCSAgICAgICE9ICgoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgKyAoaW50X3JlbC5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKQotCQkgICArIGFkanVzdCkKLQkJICAmIDB4ZjAwMDAwMDApKSkKLQlyID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaW50X3JlbC5yX2V4dGVybikKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHMpOwotCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCWludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVhZCBpbiB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19yZWFkX3JlbG9jcyAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICpzZWN0aW9uX3RkYXRhOwotCi0gIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gIGlmIChzZWN0aW9uX3RkYXRhID09IChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHNlYy0+dXNlZF9ieV9iZmQgPQotCShQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gICAgICBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgICAgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMgPSBOVUxMOwotICAgICAgc2VjdGlvbl90ZGF0YS0+b2Zmc2V0cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jc19zaXplOwotCi0gICAgICBleHRlcm5hbF9yZWxvY3Nfc2l6ZSA9IChlY29mZl9iYWNrZW5kIChhYmZkKS0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZQotCQkJICAgICAgKiBzZWMtPnJlbG9jX2NvdW50KTsKLQotICAgICAgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID0KLQkoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIGV4dGVybmFsX3JlbG9jc19zaXplKTsKLSAgICAgIGlmIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBleHRlcm5hbF9yZWxvY3Nfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWMtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MsIDEsCi0JCQlleHRlcm5hbF9yZWxvY3Nfc2l6ZSwgYWJmZCkKLQkgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsYXggYSBzZWN0aW9uIHdoZW4gbGlua2luZyBhIE1JUFMgRUNPRkYgZmlsZS4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIGVtYmVkZGVkIFBJQyBjb2RlLCB3aGljaCBhbHdheXMgdXNlcyBQQyByZWxhdGl2ZSBicmFuY2hlcyB3aGljaAotICAgb25seSBoYXZlIGFuIDE4IGJpdCByYW5nZSBvbiBNSVBTLiAgSWYgYSBicmFuY2ggaXMgbm90IGluIHJhbmdlLCB3ZQotICAgZ2VuZXJhdGUgYSBsb25nIGluc3RydWN0aW9uIHNlcXVlbmNlIHRvIGNvbXBlbnNhdGUuICBFYWNoIHRpbWUgd2UKLSAgIGZpbmQgYSBicmFuY2ggdG8gZXhwYW5kLCB3ZSBoYXZlIHRvIGNoZWNrIGFsbCB0aGUgb3RoZXJzIGFnYWluIHRvCi0gICBtYWtlIHN1cmUgdGhleSBhcmUgc3RpbGwgaW4gcmFuZ2UuICBUaGlzIGlzIHNsb3csIGJ1dCBpdCBvbmx5IGhhcwotICAgdG8gYmUgZG9uZSB3aGVuIC1yZWxheCBpcyBwYXNzZWQgdG8gdGhlIGxpbmtlci4KLQotICAgVGhpcyByb3V0aW5lIGZpZ3VyZXMgb3V0IHdoaWNoIGJyYW5jaGVzIG5lZWQgdG8gZXhwYW5kOyB0aGUgYWN0dWFsCi0gICBleHBhbnNpb24gaXMgZG9uZSBpbiBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gd2hlbiB0aGUgc2VjdGlvbgotICAgY29udGVudHMgYXJlIHJlbG9jYXRlZC4gIFRoZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIG9mZnNldHMKLSAgIGZpZWxkIG9mIHRoZSBlY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gIEFuIG9mZnNldCBvZiAxIG1lYW5zCi0gICB0aGF0IHRoZSBicmFuY2ggbXVzdCBiZSBleHBhbmRlZCBpbnRvIGEgbXVsdGktaW5zdHJ1Y3Rpb24gUEMKLSAgIHJlbGF0aXZlIGJyYW5jaCAoc3VjaCBhbiBvZmZzZXQgd2lsbCBvbmx5IG9jY3VyIGZvciBhIFBDIHJlbGF0aXZlCi0gICBicmFuY2ggdG8gYW4gZXh0ZXJuYWwgc3ltYm9sKS4gIEFueSBvdGhlciBvZmZzZXQgbXVzdCBiZSBhIG11bHRpcGxlCi0gICBvZiBmb3VyLCBhbmQgaXMgdGhlIGFtb3VudCB0byBjaGFuZ2UgdGhlIGJyYW5jaCBieSAoc3VjaCBhbiBvZmZzZXQKLSAgIHdpbGwgb25seSBvY2N1ciBmb3IgYSBQQyByZWxhdGl2ZSBicmFuY2ggd2l0aGluIHRoZSBzYW1lIHNlY3Rpb24pLgotCi0gICBXZSBkbyBub3QgbW9kaWZ5IHRoZSBzZWN0aW9uIHJlbG9jcyBvciBjb250ZW50cyB0aGVtc2VsdmVzIHNvIHRoYXQKLSAgIGlmIG1lbW9yeSB1c2FnZSBiZWNvbWVzIGFuIGlzc3VlIHdlIGNhbiBkaXNjYXJkIHRoZW0gYW5kIHJlYWQgdGhlbQotICAgYWdhaW4uICBUaGUgb25seSBpbmZvcm1hdGlvbiB3ZSBtdXN0IHNhdmUgaW4gbWVtb3J5IGJldHdlZW4gdGhpcwotICAgcm91dGluZSBhbmQgdGhlIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lIGlzIHRoZSB0YWJsZSBvZgotICAgb2Zmc2V0cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgbG9uZyAqb2Zmc2V0czsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBBc3N1bWUgd2UgYXJlIG5vdCBnb2luZyB0byBuZWVkIGFub3RoZXIgcGFzcy4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIC8qIElmIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBhbiBFQ09GRiBmaWxlLCB0aGlzIGlzIG11Y2ggdG9vCi0gICAgIGNvbmZ1c2luZyB0byBkZWFsIHdpdGguICAqLwotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyByZWxvY3MsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICAqLwotICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gUEMgcmVsYXRpdmUgcmVsb2NzLCBhbmQgd2h5IHdvdWxkIHRoZXJlCi0gICAgIGV2ZXIgYmUgb25lIGZyb20gYW55dGhpbmcgYnV0IHRoZSAudGV4dCBzZWN0aW9uPyAgKi8KLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIudGV4dCIpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzLCBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZ290IHRoZW0uICAqLwotICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOwotICBpZiAoc2VjdGlvbl90ZGF0YSA9PSAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgTlVMTAotICAgICAgfHwgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbWlwc19yZWFkX3JlbG9jcyAoYWJmZCwgc2VjKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyk7Ci0gICAgfQotCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFdlIG11c3QgaW5pdGlhbGl6ZSBfY29va2VkX3NpemUgb25seSB0aGUgZmlyc3QgdGltZSB3ZSBhcmUKLQkgY2FsbGVkLiAgKi8KLSAgICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0gICAgfQotCi0gIGNvbnRlbnRzID0gc2VjdGlvbl90ZGF0YS0+Y29udGVudHM7Ci0gIG9mZnNldHMgPSBzZWN0aW9uX3RkYXRhLT5vZmZzZXRzOwotCi0gIC8qIExvb2sgZm9yIGFueSBleHRlcm5hbCBQQyByZWxhdGl2ZSByZWxvY3MuICBJbnRlcm5hbCBQQyByZWxhdGl2ZQotICAgICByZWxvY3MgYXJlIGFscmVhZHkgY29ycmVjdCBpbiB0aGUgb2JqZWN0IGZpbGUsIHNvIHRoZXkgY2VydGFpbmx5Ci0gICAgIGNhbiBub3Qgb3ZlcmZsb3cuICAqLwotICBleHRfcmVsID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3M7Ci0gIGV4dF9yZWxfZW5kID0gZXh0X3JlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaSA9IDA7IGV4dF9yZWwgPCBleHRfcmVsX2VuZDsgZXh0X3JlbCsrLCBpKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGludF9yZWw7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgc3RydWN0IGV4dGVybmFsX3JlbG9jICphZGpfZXh0X3JlbDsKLSAgICAgIHVuc2lnbmVkIGludCBhZGpfaTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZXh0X2NvdW50OwotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKmFkal9oX3B0cjsKLSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiphZGpfaF9wdHJfZW5kOwotICAgICAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqYWRqdXN0OwotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgZXhwYW5kZWQgdGhpcyByZWxvYywgd2UgY2VydGFpbmx5IGRvbid0Ci0JIG5lZWQgdG8gZG8gaXQgYWdhaW4uICAqLwotICAgICAgaWYgKG9mZnNldHMgIT0gKGxvbmcgKikgTlVMTCAmJiBvZmZzZXRzW2ldID09IDEpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFF1aWNrbHkgY2hlY2sgdGhhdCB0aGlzIHJlbG9jIGlzIGV4dGVybmFsIFBDUkVMMTYuICAqLwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JewotCSAgaWYgKChleHRfcmVsLT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19FWFRFUk5fQklHKSA9PSAwCi0JICAgICAgfHwgKCgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRV9CSUcpCi0JCSAgID4+IFJFTE9DX0JJVFMzX1RZUEVfU0hfQklHKQotCQkgICE9IE1JUFNfUl9QQ1JFTDE2KSkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfRVhURVJOX0xJVFRMRSkgPT0gMAotCSAgICAgIHx8ICgoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVfTElUVExFKQotCQkgICA+PiBSRUxPQ19CSVRTM19UWVBFX1NIX0xJVFRMRSkKLQkJICAhPSBNSVBTX1JfUENSRUwxNikpCi0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCAoUFRSKSBleHRfcmVsLCAmaW50X3JlbCk7Ci0KLSAgICAgIGggPSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlc1tpbnRfcmVsLnJfc3ltbmR4XTsKLSAgICAgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCXsKLQkgIC8qIEp1c3QgaWdub3JlIHVuZGVmaW5lZCBzeW1ib2xzLiAgVGhlc2Ugd2lsbCBwcmVzdW1hYmx5Ci0JICAgICBnZW5lcmF0ZSBhbiBlcnJvciBsYXRlciBpbiB0aGUgbGluay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gICovCi0gICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGhzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaHNlYy0+b3V0cHV0X29mZnNldCk7Ci0KLSAgICAgIC8qIFN1YnRyYWN0IG91dCB0aGUgY3VycmVudCBhZGRyZXNzLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyAoaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpKTsKLQotICAgICAgLyogVGhlIGFkZGVuZCBpcyBzdG9yZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgSW4gdGhlIG5vcm1hbCBjYXNlCi0JIG9mIGBgYmFsIHN5bWJvbCcnLCB0aGUgYWRkZW5kIHdpbGwgYmUgLTQuICBJdCB3aWxsIG9ubHkgYmUKLQkgZGlmZmVyZW50IGluIHRoZSBjYXNlIG9mIGBgYmFsIHN5bWJvbCtjb25zdGFudCcnLiAgVG8gYXZvaWQKLQkgYWx3YXlzIHJlYWRpbmcgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIHdlIGRvbid0IGNoZWNrIHRoZQotCSBhZGRlbmQgaW4gdGhlIG9iamVjdCBmaWxlICh3ZSBjb3VsZCBlYXNpbHkgY2hlY2sgdGhlIGNvbnRlbnRzCi0JIGlmIHdlIGhhcHBlbiB0byBoYXZlIGFscmVhZHkgcmVhZCB0aGVtIGluLCBidXQgSSBmZWFyIHRoYXQKLQkgdGhpcyBjb3VsZCBiZSBjb25mdXNpbmcpLiAgVGhpcyBtZWFucyB3ZSB3aWxsIHNjcmV3IHVwIGlmCi0JIHRoZXJlIGlzIGEgYnJhbmNoIHRvIGEgc3ltYm9sIHRoYXQgaXMgaW4gcmFuZ2UsIGJ1dCBhZGRlZCB0bwotCSBhIGNvbnN0YW50IHdoaWNoIHB1dHMgaXQgb3V0IG9mIHJhbmdlOyBpbiBzdWNoIGEgY2FzZSB0aGUKLQkgbGluayB3aWxsIGZhaWwgd2l0aCBhIHJlbG9jIG92ZXJmbG93IGVycm9yLiAgU2luY2UgdGhlCi0JIGNvbXBpbGVyIHdpbGwgbmV2ZXIgZ2VuZXJhdGUgc3VjaCBjb2RlLCBpdCBzaG91bGQgYmUgZWFzeQotCSBlbm91Z2ggdG8gd29yayBhcm91bmQgaXQgYnkgY2hhbmdpbmcgdGhlIGFzc2VtYmx5IGNvZGUgaW4gdGhlCi0JIHNvdXJjZSBmaWxlLiAgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gNDsKLQotICAgICAgLyogTm93IFJFTE9DQVRJT04gaXMgdGhlIG51bWJlciB3ZSB3YW50IHRvIHB1dCBpbiB0aGUgb2JqZWN0Ci0JIGZpbGUuICBTZWUgd2hldGhlciBpdCBmaXRzLiAgKi8KLSAgICAgIGlmIChyZWxvY2F0aW9uID49IC0weDIwMDAwICYmIHJlbG9jYXRpb24gPCAweDIwMDAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgcmVsb2MgbmVlZHMgd29yaywgd2hpY2ggd2lsbCByYXJlbHkKLQkgaGFwcGVuLCBnbyBhaGVhZCBhbmQgZ3JhYiB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JewotCSAgaWYgKGluZm8tPmtlZXBfbWVtb3J5KQotCSAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNlYy0+X3Jhd19zaXplKTsKLQkgIGVsc2UKLQkgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc2VjLT5fcmF3X3NpemUpOwotCSAgaWYgKGNvbnRlbnRzID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCAoUFRSKSBjb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoaW5mby0+a2VlcF9tZW1vcnkpCi0JICAgIHNlY3Rpb25fdGRhdGEtPmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotCi0gICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgY2hhbmdpbmcgdGhlIGJhbCBpbnN0cnVjdGlvbi4gIEl0IHdvdWxkIGJlCi0JIHBvc3NpYmxlIHRvIGhhbmRsZSBvdGhlciBQQyByZWxhdGl2ZSBicmFuY2hlcywgYnV0IHNvbWUgb2YKLQkgdGhlbSAodGhlIGNvbmRpdGlvbmFsIGJyYW5jaGVzKSB3b3VsZCByZXF1aXJlIGEgZGlmZmVyZW50Ci0JIGxlbmd0aCBpbnN0cnVjdGlvbiBzZXF1ZW5jZSB3aGljaCB3b3VsZCBjb21wbGljYXRlIGJvdGggdGhpcwotCSByb3V0aW5lIGFuZCBtaXBzX3JlbGF4X3BjcmVsMTYuICBJdCBjb3VsZCBiZSB3cml0dGVuIGlmCi0JIHNvbWVib2R5IGZlbHQgaXQgd2VyZSBpbXBvcnRhbnQuICBJZ25vcmluZyB0aGlzIHJlbG9jIHdpbGwKLQkgcHJlc3VtYWJseSBjYXVzZSBhIHJlbG9jIG92ZXJmbG93IGVycm9yIGxhdGVyIG9uLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIGludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKQotCSAgIT0gMHgwNDExZmZmZikgLyogYmdlemFsICQwLC4gPT0gYmFsIC4gKi8KLQljb250aW51ZTsKLQotICAgICAgLyogQm90aGVyLiAgV2UgbmVlZCB0byBleHBhbmQgdGhpcyByZWxvYywgYW5kIHdlIHdpbGwgbmVlZCB0bwotCSBtYWtlIGFub3RoZXIgcmVsYXhhdGlvbiBwYXNzIHNpbmNlIHRoaXMgY2hhbmdlIG1heSBwdXQgb3RoZXIKLQkgcmVsb2NzIG91dCBvZiByYW5nZS4gIFdlIG5lZWQgdG8gZXhhbWluZSB0aGUgbG9jYWwgYnJhbmNoZXMKLQkgYW5kIHdlIG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIG9mZnNldHMgd2UgbXVzdAotCSBhZGQgdG8gdGhlbS4gIFdlIGFsc28gbmVlZCB0byBhZGp1c3QgdGhlIHZhbHVlcyBvZiBhbGwKLQkgc3ltYm9scyBpbiB0aGUgb2JqZWN0IGZpbGUgZm9sbG93aW5nIHRoaXMgbG9jYXRpb24uICAqLwotCi0gICAgICBzZWMtPl9jb29rZWRfc2l6ZSArPSBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UOwotICAgICAgKmFnYWluID0gdHJ1ZTsKLQotICAgICAgaWYgKG9mZnNldHMgPT0gKGxvbmcgKikgTlVMTCkKLQl7Ci0JICBzaXplX3Qgc2l6ZTsKLQotCSAgc2l6ZSA9IHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGxvbmcpOwotCSAgb2Zmc2V0cyA9IChsb25nICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JICBpZiAob2Zmc2V0cyA9PSAobG9uZyAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIG1lbXNldCAob2Zmc2V0cywgMCwgc2l6ZSk7Ci0JICBzZWN0aW9uX3RkYXRhLT5vZmZzZXRzID0gb2Zmc2V0czsKLQl9Ci0KLSAgICAgIG9mZnNldHNbaV0gPSAxOwotCi0gICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIFBDIHJlbGF0aXZlIHJlZmVyZW5jZXMgdGhhdCBjcm9zcyB0aGlzIHJlbG9jCi0JIGFuZCBhZGp1c3QgdGhlaXIgb2Zmc2V0cy4gICovCi0gICAgICBhZGpfZXh0X3JlbCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzOwotICAgICAgZm9yIChhZGpfaSA9IDA7IGFkal9leHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGFkal9leHRfcmVsKyssIGFkal9pKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3JlbG9jIGFkal9pbnRfcmVsOwotCSAgYmZkX3ZtYSBzdGFydCwgc3RvcDsKLQkgIGludCBjaGFuZ2U7Ci0KLQkgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgYWRqX2V4dF9yZWwsICZhZGpfaW50X3JlbCk7Ci0KLQkgIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1BDUkVMMTYpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0KLQkgICAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgbG9jYWwgcmVmZXJlbmNlcy4gIEV4dGVybmFsIG9uZXMKLQkJIHdpbGwgYmUgcmVsb2NhdGVkIGNvcnJlY3RseSBhbnlob3cuICAqLwotCSAgICAgIGlmIChhZGpfaW50X3JlbC5yX2V4dGVybikKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGEgUEMgcmVsYXRpdmUgcmVsb2Mgd2l0aGluCi0JCSB0aGlzIHNlY3Rpb24uICBGSVhNRTogQ3Jvc3Mgc2VjdGlvbiBQQyByZWxhdGl2ZQotCQkgcmVsb2NzIG1heSBub3QgYmUgaGFuZGxlZCBjb3JyZWN0bHk7IGRvZXMgYW55Ym9keQotCQkgY2FyZT8gICovCi0JICAgICAgaWYgKGFkal9pbnRfcmVsLnJfc3ltbmR4ICE9IFJFTE9DX1NFQ1RJT05fVEVYVCkKLQkJY29udGludWU7Ci0KLQkgICAgICBzdGFydCA9IGFkal9pbnRfcmVsLnJfdmFkZHI7Ci0KLQkgICAgICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwKLQkJCQkgY29udGVudHMgKyBhZGpfaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCi0JICAgICAgc3RvcCA9IChpbnNuICYgMHhmZmZmKSA8PCAyOwotCSAgICAgIGlmICgoc3RvcCAmIDB4MjAwMDApICE9IDApCi0JCXN0b3AgLT0gMHg0MDAwMDsKLQkgICAgICBzdG9wICs9IGFkal9pbnRfcmVsLnJfdmFkZHIgKyA0OwotCSAgICB9Ci0JICBlbHNlIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIHJlbGxvOwotCSAgICAgIGxvbmcgYWRkaGksIGFkZGxvOwotCi0JICAgICAgLyogVGhlIG5leHQgcmVsb2MgbXVzdCBiZSBNSVBTX1JfUkVMTE8sIGFuZCB3ZSBoYW5kbGUKLQkJIHRoZW0gdG9nZXRoZXIuICAqLwotCSAgICAgIEJGRF9BU1NFUlQgKGFkal9leHRfcmVsICsgMSA8IGV4dF9yZWxfZW5kKTsKLQotCSAgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgKGFkal9leHRfcmVsICsgMSksICZyZWxsbyk7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChyZWxsby5yX3R5cGUgPT0gTUlQU19SX1JFTExPKTsKLQkgICAgICAKLQkgICAgICBhZGRoaSA9IGJmZF9nZXRfMzIgKGFiZmQsCi0JCQkJICAgY29udGVudHMgKyBhZGpfaW50X3JlbC5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCSAgICAgIGFkZGhpICY9IDB4ZmZmZjsKLQkgICAgICBpZiAoYWRkaGkgJiAweDgwMDApCi0JCWFkZGhpIC09IDB4MTAwMDA7Ci0JICAgICAgYWRkaGkgPDw9IDE2OwotCi0JICAgICAgYWRkbG8gPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIHJlbGxvLnJfdmFkZHIgLSBzZWMtPnZtYSk7Ci0JICAgICAgYWRkbG8gJj0gMHhmZmZmOwotCSAgICAgIGlmIChhZGRsbyAmIDB4ODAwMCkKLQkJYWRkbG8gLT0gMHgxMDAwMDsKLQotCSAgICAgIGlmIChhZGpfaW50X3JlbC5yX2V4dGVybikKLQkJewotCQkgIC8qIFRoZSB2YWx1ZSB3ZSB3YW50IGhlcmUgaXMKLQkJICAgICAgIHN5bSAtIFJFTExPYWRkciArIGFkZGVuZAotCQkgICAgIHdoaWNoIHdlIGNhbiBleHByZXNzIGFzCi0JCSAgICAgICBzeW0gLSAoUkVMTE9hZGRyIC0gYWRkZW5kKQotCQkgICAgIFRoZXJlZm9yZSBpZiB3ZSBhcmUgZXhwYW5kaW5nIHRoZSBhcmVhIGJldHdlZW4KLQkJICAgICBSRUxMT2FkZHIgYW5kIFJFTExPYWRkciAtIGFkZGVuZCB3ZSBtdXN0IGFkanVzdAotCQkgICAgIHRoZSBhZGRlbmQuICBUaGlzIGlzIGFkbWl0dGVkbHkgYW1iaWd1b3VzLCBzaW5jZQotCQkgICAgIHdlIG1pZ2h0IG1lYW4gKHN5bSArIGFkZGVuZCkgLSBSRUxMT2FkZHIsIGJ1dCBpbgotCQkgICAgIHByYWN0aWNlIHdlIGRvbid0LCBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZQotCQkgICAgIHRoYXQgY2FzZSBjb3JyZWN0bHkgc2luY2UgYXQgdGhpcyBwb2ludCB3ZSBoYXZlCi0JCSAgICAgbm8gaWRlYSB3aGV0aGVyIGFueSByZWxvYyBpcyBiZWluZyBleHBhbmRlZAotCQkgICAgIGJldHdlZW4gc3ltIGFuZCBzeW0gKyBhZGRlbmQuICAqLwotCQkgIHN0YXJ0ID0gcmVsbG8ucl92YWRkciAtIChhZGRoaSArIGFkZGxvKTsKLQkJICBzdG9wID0gcmVsbG8ucl92YWRkcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEFuIGludGVybmFsIFJFTEhJL1JFTExPIHBhaXIgcmVwcmVzZW50cyB0aGUKLQkJICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGFkZHJlc3NlcywgJExDMCAtIGZvby4KLQkJICAgICBUaGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IHRoZSBkaWZmZXJlbmNlCi0JCSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgJExDMC4gIFRoaXMgbGV0cyB1cwotCQkgICAgIGNvbXB1dGUgJExDMCwgYW5kLCBieSBjb25zaWRlcmluZyB0aGUgYWRkZW5kLAotCQkgICAgIGZvby4gIElmIHRoZSByZWxvYyB3ZSBhcmUgZXhwYW5kaW5nIGZhbGxzIGJldHdlZW4KLQkJICAgICB0aG9zZSB0d28gcmVsb2NzLCB3ZSBtdXN0IGFkanVzdCB0aGUgYWRkZW5kLiAgQXQKLQkJICAgICB0aGlzIHBvaW50LCB0aGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IGluIHRoZQotCQkgICAgIHJfb2Zmc2V0IGZpZWxkLCB3aGVyZSBpdCB3YXMgcHV0IGJ5Ci0JCSAgICAgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luLiAgKi8KLQkJICBzdGFydCA9IHJlbGxvLnJfdmFkZHIgLSBhZGpfaW50X3JlbC5yX29mZnNldDsKLQkJICBzdG9wID0gc3RhcnQgKyBhZGRoaSArIGFkZGxvOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGFkal9pbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfU1dJVENIKQotCSAgICB7Ci0JICAgICAgLyogQSBNSVBTX1JfU1dJVENIIHJlbG9jIHJlcHJlc2VudHMgYSB3b3JkIG9mIHRoZSBmb3JtCi0JCSAgIC53b3JkICRMMy0kTFMxMgotCQkgVGhlIHZhbHVlIGluIHRoZSBvYmplY3QgZmlsZSBpcyBjb3JyZWN0LCBhc3N1bWluZyB0aGUKLQkJIG9yaWdpbmFsIHZhbHVlIG9mICRMMy4gIFRoZSBzeW1uZHggdmFsdWUgaXMgYWN0dWFsbHkKLQkJIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kICRMUzEyLgotCQkgVGhpcyBsZXRzIHVzIGNvbXB1dGUgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMUzEyIGFzCi0JCSAgIHZhZGRyIC0gc3ltbmR4Ci0JCSBhbmQgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMMyBhcwotCQkgICB2YWRkciAtIHN5bW5keCArIGFkZGVuZAotCQkgd2hlcmUgYWRkZW5kIGlzIHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZS4gIEF0Ci0JCSB0aGlzIHBvaW50LCB0aGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5IGZvdW5kIGluIHRoZQotCQkgcl9vZmZzZXQgZmllbGQsIHNpbmNlIGl0IHdhcyBtb3ZlZCBieQotCQkgbWlwc19lY29mZl9zd2FwX3JlbG9jX2luLiAgKi8KLQkgICAgICBzdGFydCA9IGFkal9pbnRfcmVsLnJfdmFkZHIgLSBhZGpfaW50X3JlbC5yX29mZnNldDsKLQkgICAgICBzdG9wID0gc3RhcnQgKyBiZmRfZ2V0XzMyIChhYmZkLAotCQkJCQkgKGNvbnRlbnRzCi0JCQkJCSAgKyBhZGpfaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgLSBzZWMtPnZtYSkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGUgcmFuZ2UgZXhwcmVzc2VkIGJ5IHRoaXMgcmVsb2MsIHdoaWNoIGlzIHRoZQotCSAgICAgZGlzdGFuY2UgYmV0d2VlbiBTVEFSVCBhbmQgU1RPUCBjcm9zc2VzIHRoZSByZWxvYyB3ZSBhcmUKLQkgICAgIGV4cGFuZGluZywgd2UgbXVzdCBhZGp1c3QgdGhlIG9mZnNldC4gIFRoZSBzaWduIG9mIHRoZQotCSAgICAgYWRqdXN0bWVudCBkZXBlbmRzIHVwb24gdGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgcmFuZ2UKLQkgICAgIGNyb3NzZXMgdGhlIHJlbG9jIGJlaW5nIGV4cGFuZGVkLiAgKi8KLQkgIGlmIChzdGFydCA8PSBpbnRfcmVsLnJfdmFkZHIgJiYgc3RvcCA+IGludF9yZWwucl92YWRkcikKLQkgICAgY2hhbmdlID0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQkgIGVsc2UgaWYgKHN0YXJ0ID4gaW50X3JlbC5yX3ZhZGRyICYmIHN0b3AgPD0gaW50X3JlbC5yX3ZhZGRyKQotCSAgICBjaGFuZ2UgPSAtIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7Ci0JICBlbHNlCi0JICAgIGNoYW5nZSA9IDA7Ci0KLQkgIG9mZnNldHNbYWRqX2ldICs9IGNoYW5nZTsKLQotCSAgaWYgKGFkal9pbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpCi0JICAgIHsKLQkgICAgICBhZGpfZXh0X3JlbCsrOwotCSAgICAgIGFkal9pKys7Ci0JICAgICAgb2Zmc2V0c1thZGpfaV0gKz0gY2hhbmdlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaW5kIGFsbCBzeW1ib2xzIGluIHRoaXMgc2VjdGlvbiBkZWZpbmVkIGJ5IHRoaXMgb2JqZWN0IGZpbGUKLQkgYW5kIGFkanVzdCB0aGVpciB2YWx1ZXMuICBOb3RlIHRoYXQgd2UgZGVjaWRlIHdoZXRoZXIgdG8KLQkgYWRqdXN0IHRoZSB2YWx1ZSBiYXNlZCBvbiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBFQ09GRiBFWFRSCi0JIHN0cnVjdHVyZSwgYmVjYXVzZSB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlIG1heQotCSBoYXZlIGJlZW4gY2hhbmdlZCBieSBhbiBlYXJsaWVyIGV4cGFuZGVkIHJlbG9jIGFuZCB0aHVzIG1heQotCSBubyBsb25nZXIgY29ycmVjdGx5IGluZGljYXRlIHdoZXRoZXIgdGhlIHN5bWJvbCBpcyBiZWZvcmUgb3IKLQkgYWZ0ZXIgdGhlIGV4cGFuZGVkIHJlbG9jLiAgKi8KLSAgICAgIGV4dF9jb3VudCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4OwotICAgICAgYWRqX2hfcHRyID0gZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9oYXNoZXM7Ci0gICAgICBhZGpfaF9wdHJfZW5kID0gYWRqX2hfcHRyICsgZXh0X2NvdW50OwotICAgICAgZm9yICg7IGFkal9oX3B0ciA8IGFkal9oX3B0cl9lbmQ7IGFkal9oX3B0cisrKQotCXsKLQkgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmFkal9oOwotCi0JICBhZGpfaCA9ICphZGpfaF9wdHI7Ci0JICBpZiAoYWRqX2ggIT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICYmIChhZGpfaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGFkal9oLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgICYmIGFkal9oLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAgICAgJiYgYWRqX2gtPmVzeW0uYXN5bS52YWx1ZSA+IGludF9yZWwucl92YWRkcikKLQkgICAgYWRqX2gtPnJvb3QudS5kZWYudmFsdWUgKz0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQl9Ci0KLSAgICAgIC8qIEFkZCBhbiBlbnRyeSB0byB0aGUgc3ltYm9sIHZhbHVlIGFkanVzdCBsaXN0LiAgVGhpcyBpcyB1c2VkCi0JIGJ5IGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlIHRvIGFkanVzdCB0aGUgdmFsdWVzIG9mCi0JIGludGVybmFsIHN5bWJvbHMgYW5kIEZEUidzLiAgKi8KLSAgICAgIGFkanVzdCA9ICgoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCkpKTsKLSAgICAgIGlmIChhZGp1c3QgPT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgYWRqdXN0LT5zdGFydCA9IGludF9yZWwucl92YWRkcjsKLSAgICAgIGFkanVzdC0+ZW5kID0gc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIGFkanVzdC0+YWRqdXN0ID0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLQotICAgICAgYWRqdXN0LT5uZXh0ID0gZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uYWRqdXN0OwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uYWRqdXN0ID0gYWRqdXN0OwotICAgIH0KLQotICBpZiAoY29udGVudHMgIT0gKGJmZF9ieXRlICopIE5VTEwgJiYgISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChjb250ZW50cyAhPSAoYmZkX2J5dGUgKikgTlVMTCAmJiAhIGluZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gbWlwc19yZWxvY2F0ZV9zZWN0aW9uIHdoZW4gYSBQQwotICAgcmVsYXRpdmUgcmVsb2MgbXVzdCBiZSBleHBhbmRlZCBpbnRvIHRoZSBmaXZlIGluc3RydWN0aW9uIHNlcXVlbmNlLgotICAgSXQgaGFuZGxlcyBhbGwgdGhlIGRldGFpbHMgb2YgdGhlIGV4cGFuc2lvbiwgaW5jbHVkaW5nIHJlc29sdmluZwotICAgdGhlIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfcmVsYXhfcGNyZWwxNiAoaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBoLCBsb2NhdGlvbiwgYWRkcmVzcykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgLyogMHgwNDExZmZmZiBpcyBiZ2V6YWwgJDAsLiA9PSBiYWwgLiAgKi8KLSAgQkZEX0FTU0VSVCAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbikgPT0gMHgwNDExZmZmZik7Ci0KLSAgLyogV2UgbmVlZCB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgYW5kIHRoZQotICAgICBjdXJyZW50IGFkZHJlc3MgcGx1cyBlaWdodC4gICovCi0gIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcmVzcyArIDg7Ci0KLSAgLyogSWYgdGhlIGxvd2VyIGhhbGYgaXMgbmVnYXRpdmUsIGluY3JlbWVudCB0aGUgdXBwZXIgMTYgaGFsZi4gICovCi0gIGlmICgocmVsb2NhdGlvbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZWxvY2F0aW9uICs9IDB4MTAwMDA7Ci0KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDA0MTEwMDAxLCBsb2NhdGlvbik7IC8qIGJhbCAuKzggKi8KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCSAgICAgIDB4M2MwMTAwMDAgfCAoKHJlbG9jYXRpb24gPj4gMTYpICYgMHhmZmZmKSwgLyogbHVpICRhdCxYWCAqLwotCSAgICAgIGxvY2F0aW9uICsgNCk7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKLQkgICAgICAweDI0MjEwMDAwIHwgKHJlbG9jYXRpb24gJiAweGZmZmYpLCAvKiBhZGRpdSAkYXQsJGF0LFhYICovCi0JICAgICAgbG9jYXRpb24gKyA4KTsKLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDAwM2YwODIxLCBsb2NhdGlvbiArIDEyKTsgLyogYWRkdSAkYXQsJGF0LCRyYSAqLwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIDB4MDAyMGY4MDksIGxvY2F0aW9uICsgMTYpOyAvKiBqYWxyICRhdCAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHaXZlbiBhIC5zZGF0YSBzZWN0aW9uIGFuZCBhIC5yZWwuc2RhdGEgaW4tbWVtb3J5IHNlY3Rpb24sIHN0b3JlCi0gICByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGludG8gdGhlIC5yZWwuc2RhdGEgc2VjdGlvbiB3aGljaCBjYW4gYmUKLSAgIHVzZWQgYXQgcnVudGltZSB0byByZWxvY2F0ZSB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZQotICAgbGlua2VyIHdoZW4gdGhlIC0tZW1iZWRkZWQtcmVsb2NzIHN3aXRjaCBpcyB1c2VkLiAgVGhpcyBpcyBjYWxsZWQKLSAgIGFmdGVyIHRoZSBhZGRfc3ltYm9scyBlbnRyeSBwb2ludCBoYXMgYmVlbiBjYWxsZWQgZm9yIGFsbCB0aGUKLSAgIG9iamVjdHMsIGFuZCBiZWZvcmUgdGhlIGZpbmFsX2xpbmsgZW50cnkgcG9pbnQgaXMgY2FsbGVkLiAgVGhpcwotICAgZnVuY3Rpb24gcHJlc3VtZXMgdGhhdCB0aGUgb2JqZWN0IHdhcyBjb21waWxlZCB1c2luZwotICAgLW1lbWJlZGRlZC1waWMuICAqLwotCi1ib29sZWFuCi1iZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzIChhYmZkLCBpbmZvLCBkYXRhc2VjLCByZWxzZWMsIGVycm1zZykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0gICAgIGFzZWN0aW9uICpyZWxzZWM7Ci0gICAgIGNoYXIgKiplcnJtc2c7Ci17Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICBiZmRfYnl0ZSAqcDsKLQotICBCRkRfQVNTRVJUICghIGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0KLSAgKmVycm1zZyA9IE5VTEw7Ci0KLSAgaWYgKGRhdGFzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltX2hhc2hlcyA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1faGFzaGVzOwotCi0gIGlmICghIG1pcHNfcmVhZF9yZWxvY3MgKGFiZmQsIGRhdGFzZWMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZWxzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgZGF0YXNlYy0+cmVsb2NfY291bnQgKiA0KTsKLSAgaWYgKHJlbHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcCA9IHJlbHNlYy0+Y29udGVudHM7Ci0KLSAgc2VjdGlvbl90ZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZGF0YXNlYyk7Ci0gIGV4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jczsKLSAgZXh0X3JlbF9lbmQgPSBleHRfcmVsICsgZGF0YXNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKywgcCArPSA0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRfcmVsOwotICAgICAgYm9vbGVhbiB0ZXh0X3JlbGF0aXZlOwotCi0gICAgICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIGV4dF9yZWwsICZpbnRfcmVsKTsKLQotICAgICAgLyogV2UgYXJlIGdvaW5nIHRvIHdyaXRlIGEgZm91ciBieXRlIHdvcmQgaW50byB0aGUgcnVudGltZSByZWxvYwotCSBzZWN0aW9uLiAgVGhlIHdvcmQgd2lsbCBiZSB0aGUgYWRkcmVzcyBpbiB0aGUgZGF0YSBzZWN0aW9uCi0JIHdoaWNoIG11c3QgYmUgcmVsb2NhdGVkLiAgVGhpcyBtdXN0IGJlIG9uIGEgd29yZCBib3VuZGFyeSwKLQkgd2hpY2ggbWVhbnMgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4gIFdlIHVzZSB0aGUKLQkgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIGluZGljYXRlIGhvdyB0aGUgdmFsdWUgaW4gdGhlIGRhdGEKLQkgc2VjdGlvbiBtdXN0IGJlIHJlbG9jYXRlZC4gIEEgMCBtZWFucyB0aGF0IHRoZSB2YWx1ZSBpcwotCSByZWxhdGl2ZSB0byB0aGUgdGV4dCBzZWN0aW9uLCB3aGlsZSBhIDEgaW5kaWNhdGVzIHRoYXQgdGhlCi0JIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBkYXRhIHNlY3Rpb24uICBHaXZlbiB0aGF0IHdlIGFyZQotCSBhc3N1bWluZyB0aGUgY29kZSB3YXMgY29tcGlsZWQgdXNpbmcgLW1lbWJlZGRlZC1waWMsIHRoZXJlCi0JIHNob3VsZCBub3QgYmUgYW55IG90aGVyIHBvc3NpYmlsaXRpZXMuICAqLwotCi0gICAgICAvKiBXZSBjYW4gb25seSByZWxvY2F0ZSBSRUZXT1JEIHJlbG9jcyBhdCBydW4gdGltZS4gICovCi0gICAgICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFRldPUkQpCi0JewotCSAgKmVycm1zZyA9IF8oInVuc3VwcG9ydGVkIHJlbG9jIHR5cGUiKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGludF9yZWwucl9leHRlcm4pCi0JewotCSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IHN5bV9oYXNoZXNbaW50X3JlbC5yX3N5bW5keF07Ci0JICAvKiBJZiBoIGlzIE5VTEwsIHRoYXQgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgYW4KLQkgICAgIGV4dGVybmFsIHN5bWJvbCB3aGljaCB3ZSB0aG91Z2h0IHdhcyBqdXN0IGEgZGVidWdnaW5nCi0JICAgICBzeW1ib2wuICBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiAgKi8KLQkgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGFib3J0ICgpOwotCSAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQkgICAgdGV4dF9yZWxhdGl2ZSA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHRleHRfcmVsYXRpdmUgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChpbnRfcmVsLnJfc3ltbmR4KQotCSAgICB7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9URVhUOgotCSAgICAgIHRleHRfcmVsYXRpdmUgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0RBVEE6Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9TQlNTOgotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUODoKLQkgICAgICB0ZXh0X3JlbGF0aXZlID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogTm8gb3RoZXIgc2VjdGlvbnMgc2hvdWxkIGFwcGVhciBpbiAtbWVtYmVkZGVkLXBpYwotICAgICAgICAgICAgICAgICBjb2RlLiAgKi8KLQkgICAgICAqZXJybXNnID0gXygicmVsb2MgYWdhaW5zdCB1bnN1cHBvcnRlZCBzZWN0aW9uIik7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoKGludF9yZWwucl9vZmZzZXQgJiAzKSAhPSAwKQotCXsKLQkgICplcnJtc2cgPSBfKCJyZWxvYyBub3QgcHJvcGVybHkgYWxpZ25lZCIpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLAotCQkgIChpbnRfcmVsLnJfdmFkZHIgLSBkYXRhc2VjLT52bWEgKyBkYXRhc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgKHRleHRfcmVsYXRpdmUgPyAwIDogMSkpLAotCQkgIHApOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgdGhlIEVDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgVGhlIGJhY2tlbmQgZmllbGQgb2YgdGhlCi0gICB0YXJnZXQgdmVjdG9yIHBvaW50cyB0byB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgbWlwc19lY29mZl9iYWNrZW5kX2RhdGEgPQotewotICAvKiBDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgKi8KLSAgewotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsaW50LGludCxpbnQsaW50LFBUUikpKSBiZmRfdm9pZCwgLyogYXV4X2luICovCi0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9pbiAqLwotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBsaW5lbm9faW4gKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpYmZkX3ZvaWQsLyphdXhfb3V0Ki8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHJlbG9jX291dCAqLwotICAgIG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX291dCwgbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfb3V0LAotICAgIG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfb3V0LAotICAgIEZJTEhTWiwgQU9VVFNaLCBTQ05IU1osIDAsIDAsIDAsIDAsIEZJTE5NTEVOLCB0cnVlLCBmYWxzZSwgNCwKLSAgICBtaXBzX2Vjb2ZmX3N3YXBfZmlsZWhkcl9pbiwgbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfaW4sCi0gICAgbWlwc19lY29mZl9zd2FwX3Njbmhkcl9pbiwgTlVMTCwKLSAgICBtaXBzX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vaywgX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssCi0gICAgX2JmZF9lY29mZl9ta29iamVjdF9ob29rLCBfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzLAotICAgIF9iZmRfZWNvZmZfc2V0X2FsaWdubWVudF9ob29rLCBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwKLSAgfSwKLSAgLyogU3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4gICovCi0gIGJmZF9hcmNoX21pcHMsCi0gIC8qIEluaXRpYWwgcG9ydGlvbiBvZiBhcm1hcCBzdHJpbmcuICAqLwotICAiX19fX19fX19fXyIsCi0gIC8qIFRoZSBwYWdlIGJvdW5kYXJ5IHVzZWQgdG8gYWxpZ24gc2VjdGlvbnMgaW4gYSBkZW1hbmQtcGFnZWQKLSAgICAgZXhlY3V0YWJsZSBmaWxlLiAgRS5nLiwgMHgxMDAwLiAgKi8KLSAgMHgxMDAwLAotICAvKiBUcnVlIGlmIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBBbHBoYS4gIEZhbHNlIGlmIC5yZGF0YSBpcyBwYXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBNSVBTLiAgKi8KLSAgZmFsc2UsCi0gIC8qIEJpdHNpemUgb2YgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gIDMyLAotICAvKiBSZWxvYyB0byB1c2UgZm9yIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICAmbWlwc19ob3d0b190YWJsZVtNSVBTX1JfUkVGV09SRF0sCi0gIHsKLSAgICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgICBtYWdpY1N5bSwKLSAgICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gICAgNCwKLSAgICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gICAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gICAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gICAgZWNvZmZfc3dhcF9oZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gICAgZWNvZmZfc3dhcF9wZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9zeW1faW4sCi0gICAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gICAgZWNvZmZfc3dhcF9mZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9yZmRfaW4sCi0gICAgZWNvZmZfc3dhcF9leHRfaW4sCi0gICAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKLSAgICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gICAgZWNvZmZfc3dhcF9oZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfZG5yX291dCwKLSAgICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9zeW1fb3V0LAotICAgIGVjb2ZmX3N3YXBfb3B0X291dCwKLSAgICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9yZmRfb3V0LAotICAgIGVjb2ZmX3N3YXBfZXh0X291dCwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCi0gICAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgICBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8KLSAgfSwKLSAgLyogRXh0ZXJuYWwgcmVsb2Mgc2l6ZS4gICovCi0gIFJFTFNaLAotICAvKiBSZWxvYyBzd2FwcGluZyBmdW5jdGlvbnMuICAqLwotICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4sCi0gIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQsCi0gIC8qIEJhY2tlbmQgcmVsb2MgdHdlYWtpbmcuICAqLwotICBtaXBzX2FkanVzdF9yZWxvY19pbiwKLSAgbWlwc19hZGp1c3RfcmVsb2Nfb3V0LAotICAvKiBSZWxvY2F0ZSBzZWN0aW9uIGNvbnRlbnRzIHdoaWxlIGxpbmtpbmcuICAqLwotICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24sCi0gIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLwotICBOVUxMLAotICAvKiBSZWFkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcmNoaXZlIGF0IGEgZ2l2ZW4gZmlsZSBwb3NpdGlvbi4gICovCi0gIF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zCi19OwotCi0vKiBMb29raW5nIHVwIGEgcmVsb2MgdHlwZSBpcyBNSVBTIHNwZWNpZmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogR2V0dGluZyByZWxvY2F0ZWQgc2VjdGlvbiBjb250ZW50cyBpcyBnZW5lcmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0KLS8qIEhhbmRsaW5nIGZpbGUgd2luZG93cyBpcyBnZW5lcmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLS8qIFJlbGF4aW5nIHNlY3Rpb25zIGlzIE1JUFMgc3BlY2lmaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIG1pcHNfcmVsYXhfc2VjdGlvbgotCi0vKiBHQyBvZiBzZWN0aW9ucyBpcyBub3QgZG9uZS4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWM7Ci0KLWNvbnN0IGJmZF90YXJnZXQgZWNvZmZfbGl0dGxlX3ZlYyA9Ci17Ci0gICJlY29mZi1saXR0bGVtaXBzIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZWNvZmZfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfbWtvYmplY3QsICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgJiBlY29mZl9iaWdfdmVjLAotICAKLSAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWMgPQotewotICAiZWNvZmYtYmlnbWlwcyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9lY29mZl9hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0ge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgJiBlY29mZl9saXR0bGVfdmVjLAotICAKLSAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ2xpdHRsZV92ZWMgPQotewotICAiZWNvZmYtYmlnbGl0dGxlbWlwcyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2Vjb2ZmX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAmbWlwc19lY29mZl9iYWNrZW5kX2RhdGEKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1wbWFjLmMgYi9iZmQvY29mZi1wbWFjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMzMyZDkuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtcG1hYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBcHBsZSBldCBhbCBQb3dlclBDIE1hYyAiWENPRkYiIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCXBtYWNfeGNvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJ4Y29mZi1wb3dlcm1hYyIKLQotLyogVHdlYWsgY29mZmNvZGUuaCBiYXNlZCBvbiB0aGlzIGJlaW5nIGEgUG93ZXJNYWMgaW5zdGVhZCBvZiBSUy82MDAwLiAqLwotCi0jZGVmaW5lIFBPV0VSTUFDCi0KLSNpbmNsdWRlICJjb2ZmLXJzNjAwMC5jIgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtcHBjLmMgYi9iZmQvY29mZi1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJlOGNiOC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDI5NjkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBQb3dlclBDIE1pY3Jvc29mdCBQb3J0YWJsZSBFeGVjdXRhYmxlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE9yaWdpbmFsIHZlcnNpb24gcGllY2VkIHRvZ2V0aGVyIGJ5IEtpbSBLbnV0dGlsYSAoa3JrQGN5Z251cy5jb20pCi0KLSAgIFRoZXJlIGlzIG5vdGhpbmcgbmV3IHVuZGVyIHRoZSBzdW4uIFRoaXMgZmlsZSBkcmF3cyBhIGxvdCBvbiBvdGhlcgotICAgY29mZiBmaWxlcywgaW4gcGFydGljdWxhciwgdGhvc2UgZm9yIHRoZSBycy82MDAwLCBhbHBoYSwgbWlwcywgYW5kIAotICAgaW50ZWwgYmFja2VuZHMsIGFuZCB0aGUgUEUgd29yayBmb3IgdGhlIGFybS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQ3VycmVudCBTdGF0ZToKLSAgIC0gb2JqZHVtcCB3b3JrcwotICAgLSByZWxvY3MgZ2VuZXJhdGVkIGJ5IGdhcwotICAgLSBsZCB3aWxsIGxpbmsgZmlsZXMsIGJ1dCB0aGV5IGRvIG5vdCBydW4uCi0gICAtIGRsbHRvb2wgd2lsbCBub3QgcHJvZHVjZSBjb3JyZWN0IG91dHB1dCBpbiBzb21lIC5yZWxvYyBjYXNlcywgYW5kIHdpbGwgCi0gICAgIG5vdCBwcm9kdWNlIHRoZSByaWdodCBnbHVlIGNvZGUgZm9yIGRsbCBmdW5jdGlvbiBjYWxscy4KLSovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJjb2ZmL3Bvd2VycGMuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0KLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0KLSNpZmRlZiBCQURNQUcKLSN1bmRlZiBCQURNQUcKLSNlbmRpZgotCi0jZGVmaW5lIEJBRE1BRyh4KSBQUENCQURNQUcoeCkKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIG1vcmUgdGhhbiBvbmNlLCBidXQgd2Ugb25seSBjb21waWxlIHRoZQotICAgZmluYWxfbGluayByb3V0aW5lIG9uY2UuICAqLwotZXh0ZXJuIGJvb2xlYW4gcHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIGR1bXBfdG9jIFBBUkFNUyAoKFBUUikpOwotCi0vKiBUaGUgdG9jIGlzIGEgc2V0IG9mIGJmZF92bWEgZmllbGRzLiBXZSB1c2UgdGhlIGZhY3QgdGhhdCB2YWxpZCAgICAgICAgICovCi0vKiBhZGRyZXNzZXMgYXJlIGV2ZW4gKGkuZS4gdGhlIGJpdCByZXByZXNlbnRpbmcgIjEiIGlzIG9mZikgdG8gYWxsb3cgICAgICovCi0vKiB1cyB0byBlbmNvZGUgYSBsaXR0bGUgZXh0cmEgaW5mb3JtYXRpb24gaW4gdGhlIGZpZWxkICAgICAgICAgICAgICAgICAgICovCi0vKiAtIFVuYWxsb2NhdGVkIGFkZHJlc3NlcyBhcmUgaW50aWFsaXplZCB0byAxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtIEFsbG9jYXRlZCBhZGRyZXNzZXMgYXJlIGV2ZW4gbnVtYmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGUgZmlyc3QgdGltZSB3ZSBhY3R1YWxseSB3cml0ZSBhIHJlZmVyZW5jZSB0byB0aGUgdG9jIGluIHRoZSBiZmQsICAgICovCi0vKiB3ZSB3YW50IHRvIHJlY29yZCB0aGF0IGZhY3QgaW4gYSBmaXh1cCBmaWxlIChpZiBpdCBpcyBhc2tlZCBmb3IpLCBzbyAgICovCi0vKiB3ZSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IGFuIGFkZHJlc3MgaGFzIGJlZW4gd3JpdHRlbiBieSBtYXJraW5nICovCi0vKiB0aGUgbG93IG9yZGVyIGJpdCB3aXRoIGEgIjEiIHVwb24gd3JpdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgU0VUX1VOQUxMT0NBVEVEKHgpICAoKHgpID0gMSkKLSNkZWZpbmUgSVNfVU5BTExPQ0FURUQoeCkgICAoKHgpID09IDEpCi0KLSNkZWZpbmUgSVNfV1JJVFRFTih4KSAgICAgICAoKHgpICYgMSkKLSNkZWZpbmUgTUFSS19BU19XUklUVEVOKHgpICAoKHgpIHw9IDEpCi0jZGVmaW5lIE1BS0VfQUREUl9BR0FJTih4KSAgKCh4KSAmPSB+MSkKLQotCi0vKiBUdXJuIG9uIHRoaXMgY2hlY2sgaWYgeW91IHN1c3BlY3Qgc29tZXRoaW5nIGFtaXNzIGluIHRoZSBoYXNoIHRhYmxlcyAqLwotI2lmZGVmIERFQlVHX0hBU0gKLQotLyogTmVlZCBhIDcgY2hhciBzdHJpbmcgZm9yIGFuIGV5ZSBjYXRjaGVyICovCi0jZGVmaW5lIEVZRSAia3JranVuayIKLQotI2RlZmluZSBIQVNIX0NIRUNLX0RDTCBjaGFyIGV5ZV9jYXRjaGVyWzhdOwotI2RlZmluZSBIQVNIX0NIRUNLX0lOSVQocmV0KSAgICAgIHN0cmNweShyZXQtPmV5ZV9jYXRjaGVyLCBFWUUpCi0jZGVmaW5lIEhBU0hfQ0hFQ0soYWRkcikgXAotIGlmIChzdHJjbXAoYWRkci0+ZXllX2NhdGNoZXIsIEVZRSkgIT0gMCkgXAotICB7IFwKLSAgICBmcHJpbnRmKHN0ZGVycixcCi0gICAgXygiRmlsZSAlcywgbGluZSAlZCwgSGFzaCBjaGVjayBmYWlsdXJlLCBiYWQgZXllICU4c1xuIiksIFwKLSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGFkZHItPmV5ZV9jYXRjaGVyKTsgXAotICAgIGFib3J0KCk7IFwKLSB9Ci0KLQotI2Vsc2UKLQotI2RlZmluZSBIQVNIX0NIRUNLX0RDTAotI2RlZmluZSBIQVNIX0NIRUNLX0lOSVQocmV0KQotI2RlZmluZSBIQVNIX0NIRUNLKGFkZHIpCi0KLSNlbmRpZgotCi0vKiBJbiBvcmRlciBub3QgdG8gYWRkIGFuIGludCB0byBldmVyeSBoYXNoIHRhYmxlIGl0ZW0gZm9yIGV2ZXJ5IGNvZmYKLSAgIGxpbmtlciwgd2UgZGVmaW5lIG91ciBvd24gaGFzaCB0YWJsZSwgZGVyaXZlZCBmcm9tIHRoZSBjb2ZmIG9uZSAqLwotCi0vKiBQRSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAqLwotCi1zdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSByb290OyAvKiBGaXJzdCBlbnRyeSwgYXMgcmVxdWlyZWQgICovCi0KLSAgLyogQXMgd2Ugd29uZGVyIGFyb3VuZCB0aGUgcmVsb2NzLCB3ZSdsbCBrZWVwIHRoZSBhc3NpZ25lZCB0b2Nfb2Zmc2V0Ci0gICAgIGhlcmUgKi8KLSAgYmZkX3ZtYSB0b2Nfb2Zmc2V0OyAgICAgICAgICAgICAgIC8qIE91ciBhZGRpdGlvbiwgYXMgcmVxdWlyZWQgKi8KLSAgaW50IHN5bWJvbF9pc19nbHVlOwotICB1bnNpZ25lZCBsb25nIGludCBnbHVlX2luc247Ci0KLSAgSEFTSF9DSEVDS19EQ0wKLX07Ci0KLQotLyogUEUgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSByb290OyAvKiBGaXJzdCBlbnRyeSwgYXMgcmVxdWlyZWQgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnBwY19jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1wcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gCi0gICAgKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCAKLQkJCSBzaXplb2YgKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkpKTsKLQotICBpZiAocmV0ID09IChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgCi0JCQkJICAgICAgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIFNFVF9VTkFMTE9DQVRFRChyZXQtPnRvY19vZmZzZXQpOwotICAgICAgcmV0LT5zeW1ib2xfaXNfZ2x1ZSA9IDA7Ci0gICAgICByZXQtPmdsdWVfaW5zbiA9IDA7Ci0KLSAgICAgIEhBU0hfQ0hFQ0tfSU5JVChyZXQpOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBQRSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHJldHVybiBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhIFBFIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLXBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoISBwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAocmV0LCBhYmZkLAotCQkJCQlwcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBOb3csIHRhaWxvciBjb2ZmY29kZS5oIHRvIHVzZSBvdXIgaGFzaCBzdHVmZiAqLwotCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotCi0MCi0vKiBUaGUgbnQgbG9hZGVyIHBvaW50cyB0aGUgdG9jIHJlZ2lzdGVyIHRvICZ0b2MgKyAzMjc2OCwgaW4gb3JkZXIgdG8gKi8KLS8qIHVzZSB0aGUgY29tcGxldGUgcmFuZ2Ugb2YgYSAxNi1iaXQgZGlzcGxhY2VtZW50LiBXZSBoYXZlIHRvIGFkanVzdCAqLwotLyogZm9yIHRoaXMgd2hlbiB3ZSBmaXggdXAgbG9hZHMgZGlzcGxhY2VkIG9mZiB0aGUgdG9jIHJlZy4gICAgICAgICAgICovCi0jZGVmaW5lIFRPQ19MT0FEX0FESlVTVE1FTlQgKC0zMjc2OCkKLSNkZWZpbmUgVE9DX1NFQ1RJT05fTkFNRSAiLnByaXZhdGUudG9jIgotCi0vKiBUaGUgbWFpbiBib2R5IG9mIGNvZGUgaXMgaW4gY29mZmNvZGUuaC4gICovCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotLyogdGhlc2Ugc2hvdWxkIGRlZmluaXRlbHkgZ28gaW4gYSBoZWFkZXIgZmlsZSBzb21ld2hlcmUuLi4gKi8KLQotLyogTk9QICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUJTT0xVVEUgICAgICAgICAgMHgwMDAwCi0KLS8qIDY0LWJpdCBhZGRyZXNzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjY0ICAgICAgICAgICAgMHgwMDAxCi0KLS8qIDMyLWJpdCBhZGRyZXNzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjMyICAgICAgICAgICAgMHgwMDAyCi0KLS8qIDI2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAoYnJhbmNoIGFic29sdXRlKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIyNCAgICAgICAgICAgIDB4MDAwMwotCi0vKiAxNi1iaXQgYWRkcmVzcyAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIxNiAgICAgICAgICAgIDB4MDAwNAotCi0vKiAxNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGxvYWQgZG91Ymxld29yZCkgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMTQgICAgICAgICAgICAweDAwMDUKLQotLyogMjYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCByZWxhdGl2ZSkgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19SRUwyNCAgICAgICAgICAgICAweDAwMDYKLQotLyogMTYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyIGNvbmQgcmVsYXRpdmUpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVMMTQgICAgICAgICAgICAgMHgwMDA3Ci0KLS8qIDE2LWJpdCBvZmZzZXQgZnJvbSBUT0MgYmFzZSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2ICAgICAgICAgIDB4MDAwOAotCi0vKiAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTQgICAgICAgICAgMHgwMDA5Ci0KLS8qIDMyLWJpdCBhZGRyIHcvbyBpbWFnZSBiYXNlICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjMyTkIgICAgICAgICAgMHgwMDBBCi0KLS8qIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAoYXMgaW4gYW4gaW1hZ2Ugc2VjdGlvbmhkcikgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNSRUwgICAgICAgICAgICAweDAwMEIKLQotLyogc2VjdGlvbmhlYWRlciBudW1iZXIgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNUSU9OICAgICAgICAgICAweDAwMEMKLQotLyogc3Vic3RpdHV0ZSBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiBpZmYgc3ltYm9sIGlzIGdsdWUgY29kZSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0lGR0xVRSAgICAgICAgICAgIDB4MDAwRAotCi0vKiBzeW1ib2wgaXMgZ2x1ZSBjb2RlOyB2aXJ0dWFsIGFkZHJlc3MgaXMgVE9DIHJlc3RvcmUgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19JTUdMVUUgICAgICAgICAgICAweDAwMEUKLQotLyogdmEgb2YgY29udGFpbmluZyBzZWN0aW9uIChsaW1pdGVkIHRvIDE2IGJpdHMpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfU0VDUkVMMTYgICAgICAgICAgMHgwMDBGCi0KLS8qIHN0dWZmIHRvIGhhbmRsZSBpbW1lZGlhdGUgZGF0YSB3aGVuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgKi8KLS8qIGRhdGEgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaW1tZWRpYXRlIGZpZWxkICovCi0vKiBXZSBuZWVkIHRvIGRvICh1c3VhbGx5KSAzMiBiaXQgYXJpdGhtZXRpYyBvbiAxNiBiaXQgY2h1bmtzICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVGSEkgICAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVGTE8gICAgICAgICAgICAgMHgwMDExCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUEFJUiAgICAgICAgICAgICAgMHgwMDEyCi0KLS8qIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdG9jcmVsMTYsIHdpdGggVE9DREVGTiBhc3N1bWVkICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTiAgICAgMHgwMDEzCi0KLS8qICBGbGFnIGJpdHMgaW4gSU1BR0VfUkVMT0NBVElPTi5UWVBFICovCi0KLS8qIHN1YnRyYWN0IHJlbG9jIHZhbHVlIHJhdGhlciB0aGFuIGFkZGluZyBpdCAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX05FRyAgICAgICAgICAgICAgIDB4MDEwMAotCi0vKiBmaXggYnJhbmNoIHByZWRpY3Rpb24gYml0IHRvIHByZWRpY3QgYnJhbmNoIHRha2VuICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQlJUQUtFTiAgICAgICAgICAgMHgwMjAwCi0KLS8qIGZpeCBicmFuY2ggcHJlZGljdGlvbiBiaXQgdG8gcHJlZGljdCBicmFuY2ggbm90IHRha2VuICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gICAgICAgICAgMHgwNDAwCi0KLS8qIHRvYyBzbG90IGRlZmluZWQgaW4gZmlsZSAob3IsIGRhdGEgaW4gdG9jKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gICAgICAgICAgIDB4MDgwMAotCi0vKiBtYXNrcyB0byBpc29sYXRlIGFib3ZlIHZhbHVlcyBpbiBJTUFHRV9SRUxPQ0FUSU9OLlR5cGUgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UWVBFTUFTSyAgICAgICAgICAweDAwRkYKLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19GTEFHTUFTSyAgICAgICAgICAweDBGMDAKLQotI2RlZmluZSBFWFRSQUNUX1RZUEUoeCkgICAgICAgICAgICAgICAgICgoeCkgJiBJTUFHRV9SRUxfUFBDX1RZUEVNQVNLKQotI2RlZmluZSBFWFRSQUNUX0ZMQUdTKHgpICgoeCkgJiBJTUFHRV9SRUxfUFBDX0ZMQUdNQVNLKQotI2RlZmluZSBFWFRSQUNUX0pVTksoeCkgIFwKLSAgICAgICAgICAgKCh4KSAmIH4oSU1BR0VfUkVMX1BQQ19UWVBFTUFTSyB8IElNQUdFX1JFTF9QUENfRkxBR01BU0spKQotCi0MCi0vKiBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucyB0byBtYWtlIHJlbG9jYXRpb24gd29yayAqLwotLyogKFdvcmsgSW4gUHJvZ3Jlc3MpICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3JlZmhpX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgIGNoYXIgKiplcnJvcikpOwotI2lmIDAKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3JlZmxvX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgIGNoYXIgKiplcnJvcikpOwotI2VuZGlmCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19wYWlyX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgIGNoYXIgKiplcnJvcikpOwotCi0MCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY190b2MxNl9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICBjaGFyICoqZXJyb3IpKTsKLQotI2lmIDAKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX2FkZHIzMm5iX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQkgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkJIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCQkgUFRSIGRhdGEsCi0JCQkJCQkJIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJCSBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkJIGNoYXIgKiplcnJvcikpOwotI2VuZGlmCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19zZWN0aW9uX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQlhcmVsZW50ICpyZWxvYywKLQkJCQkJCQlhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkJUFRSIGRhdGEsCi0JCQkJCQkJYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkJYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJCWNoYXIgKiplcnJvcikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19zZWNyZWxfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX2ltZ2x1ZV9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJICAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKLQotCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AgUEFSQU1TKChiZmQgKmFiZmQsIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvKSk7Ci0KLQwKLS8qIEZJWE1FOiBJdCdsbCB0YWtlIGEgd2hpbGUgdG8gZ2V0IHRocm91Z2ggYWxsIG9mIHRoZXNlLiBJIG9ubHkgbmVlZCBhIGZldyB0bwotICAgZ2V0IHVzIHN0YXJ0ZWQsIHNvIHRob3NlIEknbGwgbWFrZSBzdXJlIHdvcmsuIFRob3NlIG1hcmtlZCBGSVhNRSBhcmUgZWl0aGVyCi0gICBjb21wbGV0ZWx5IHVudmVyaWZpZWQgb3IgaGF2ZSBhIHNwZWNpZmljIHVua25vd24gbWFya2VkIGluIHRoZSBjb21tZW50ICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJlbG9jYXRpb24gZW50cmllcyBmb3IgV2luZG93cy9OVCBvbiBQb3dlclBDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZyb20gdGhlIGRvY3VtZW50ICIiIHdlIGZpbmQgdGhlIGZvbGxvd2luZyBsaXN0ZWQgYXMgdXNlZCByZWxvY3M6ICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQUJTT0xVVEUgICAgICAgOiBUaGUgbm9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQUREUls2NHwzMnwxNl0gOiBmaWVsZHMgdGhhdCBob2xkIGFkZHJlc3NlcyBpbiBkYXRhIGZpZWxkcyBvciB0aGUgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkIG9uIGEgbG9hZC9zdG9yZS4gICAgICAgICAgICAgKi8KLS8qICAgQUREUlsyNHwxNF0gICAgOiBmaWVsZHMgdGhhdCBob2xkIGFkZHJlc3NlcyBpbiBicmFuY2ggYW5kIGNvbmQgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBicmFuY2hlcy4gVGhlc2UgcmVwcmVzZW50IFsyNnwxNl0gYml0IGFkZHJlc3Nlcy4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBUaGUgbG93IG9yZGVyIDIgYml0cyBhcmUgcHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgUkVMWzI0fDE0XSAgICAgOiBicmFuY2hlcyByZWxhdGl2ZSB0byB0aGUgSW5zdHJ1Y3Rpb24gQWRkcmVzcyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICByZWdpc3Rlci4gVGhlc2UgcmVwcmVzZW50IFsyNnwxNl0gYml0IGFkZHJlc3NlcywgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBhcyBiZWZvcmUuIFRoZSBpbnN0cnVjdGlvbiBmaWVsZCB3aWxsIGJlIHplcm8sIGFuZCAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgU1lNIHdpbGwgYmUgaW5zZXJ0ZWQgYXQgbGluayB0aW1lLiAgKi8KLS8qICAgVE9DUkVMMTYgICAgICAgOiAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkIHJlZmVycmluZyB0byBhIHNsb3QgaW4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICB0b2MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVE9DUkVMMTQgICAgICAgOiAxNiBiaXQgZGlzcGxhY2VtZW50IGZpZWxkLCBzaW1pbGFyIHRvIFJFTDE0IG9yIEFERFIxNC4gKi8KLS8qICAgQUREUjMyTkIgICAgICAgOiAzMiBiaXQgYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgdmlydHVhbCBvcmlnaW4uICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAoT24gdGhlIGFscGhhLCB0aGlzIGlzIGFsd2F5cyBhIGxpbmtlciBnZW5lcmF0ZWQgdGh1bmspKi8KLS8qICAgICAgICAgICAgICAgICAgICAoaS5lLiAzMmJpdCBhZGRyIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBiYXNlKSAgICAgICAgICAgKi8KLS8qICAgU0VDUkVMICAgICAgICAgOiBUaGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBzeW1ib2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgU0VDVElPTiAgICAgICAgOiBhY2Nlc3MgdG8gdGhlIGhlYWRlciBjb250YWluaW5nIHRoZSBpdGVtLiBTdXBwb3J0cyB0aGUgKi8KLS8qICAgICAgICAgICAgICAgICAgICBjb2RldmlldyBkZWJ1Z2dlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEluIHBhcnRpY3VsYXIsIG5vdGUgdGhhdCB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCB0aGUgICAgICAgICAgKi8KLS8qIHJlbG9jYXRpb25zIGxpc3RlZCBpbiB0aGUgaGVhZGVyIGZpbGUgYXJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcHBjX2NvZmZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIElNQUdFX1JFTF9QUENfQUJTT0xVVEUgMHgwMDAwICAgTk9QICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUJTT0xVVEUsIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGRvbnQgY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFCU09MVVRFIiwgICAgICAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAsCSAJICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwLCAgICAgICAgCQkgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfQUREUjY0IDB4MDAwMSAgNjQtYml0IGFkZHJlc3MgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyhJTUFHRV9SRUxfUFBDX0FERFI2NCwgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCTAsCSAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCTMsCSAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCTY0LAkgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCTAsCSAgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAJIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JMCwJCSAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkiQUREUjY0IiwgICAgICAgICAgICAgICAvKiBuYW1lICovCi0JdHJ1ZSwJICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JTUlOVVNfT05FLAkgCSAvKiBzcmNfbWFzayAqLwotCU1JTlVTX09ORSwgICAgICAgIAkgLyogZHN0X21hc2sgKi8KLQlmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIzMiAweDAwMDIgIDMyLWJpdCBhZGRyZXNzICovCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIzMiwJLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMjQgMHgwMDAzICAyNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCBhYnNvbHV0ZSkgKi8KLSAgLyogdGhlIExJIGZpZWxkIGlzIGluIGJpdCA2IHRocm91Z2ggYml0IDI5IGlzIDI0IGJpdHMsICsgMiBmb3IgdGhlIHNoaWZ0ICovCi0gIC8qIE9mIGNvdXJzZSwgVGhhdCdzIHRoZSBJQk0gYXBwcm92ZWQgYml0IG51bWJlcmluZywgd2hpY2ggaXMgbm90IHdoYXQgKi8KLSAgLyogYW55b25lIGVsc2UgdXNlcy4uLi4gVGhlIGxpIGZpZWxkIGlzIGluIGJpdCAyIHRocnUgMjUgKi8gCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIyNCwgIC8qIHR5cGUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjI0IiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwN2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDdmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMTYgMHgwMDA0ICAxNi1iaXQgYWRkcmVzcyAqLwotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMTYsICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFERFIxNiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIxNCAweDAwMDUgKi8KLSAgLyogIDE2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKSAqLwotICAvKiBGSVhNRTogdGhlIG1hc2sgaXMgbGlrZWx5IHdyb25nLCBhbmQgdGhlIGJpdCBwb3NpdGlvbiBtYXkgYmUgYXMgd2VsbCAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIxNCwgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjE2IiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfUkVMMjQgMHgwMDA2ICovCi0gIC8qICAgMjYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCByZWxhdGl2ZSkgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfUkVMMjQsICAgLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUkVMMjQiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfUkVMMTQgMHgwMDA3ICovCi0gIC8qICAgMTYtYml0IFBDLXJlbGF0aXZlIG9mZnNldCwgc2hpZnRlZCBsZWZ0IDIgKGJyIGNvbmQgcmVsYXRpdmUpICovCi0gIC8qIEZJWE1FOiB0aGUgbWFzayBpcyBsaWtlbHkgd3JvbmcsIGFuZCB0aGUgYml0IHBvc2l0aW9uIG1heSBiZSBhcyB3ZWxsICovCi0gIC8qIEZJWE1FOiBob3cgZG9lcyBpdCBrbm93IGhvdyBmYXIgdG8gc2hpZnQ/ICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUREUjE0LCAgLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJBRERSMTYiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiAweDAwMDggKi8KLSAgLyogICAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfVE9DUkVMMTYsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3RvYzE2X3JlbG9jLCAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJUT0NSRUwxNiIsICAgICAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfVE9DUkVMMTQgMHgwMDA5ICovCi0gIC8qICAgMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKSAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1RPQ1JFTDE0LC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiVE9DUkVMMTQiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX0FERFIzMk5CIDB4MDAwQSAqLwotICAvKiAgIDMyLWJpdCBhZGRyIHcvIGltYWdlIGJhc2UgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMzJOQiwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyTkIiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfU0VDUkVMIDB4MDAwQiAqLwotICAvKiAgIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAoYXMgaW4gYW4gaW1hZ2Ugc2VjdGlvbmhkcikgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNSRUwsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfc2VjcmVsX3JlbG9jLCAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlNFQ1JFTCIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX1NFQ1RJT04gMHgwMDBDICovCi0gIC8qICAgc2VjdGlvbmhlYWRlciBudW1iZXIgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNUSU9OLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3NlY3Rpb25fcmVsb2MsICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJTRUNUSU9OIiwgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19JRkdMVUUgMHgwMDBEICovCi0gIC8qICAgc3Vic3RpdHV0ZSBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiBpZmYgc3ltYm9sIGlzIGdsdWUgY29kZSAqLwotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19JRkdMVUUsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJJRkdMVUUiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19JTUdMVUUgMHgwMDBFICovCi0gIC8qICAgc3ltYm9sIGlzIGdsdWUgY29kZTsgdmlydHVhbCBhZGRyZXNzIGlzIFRPQyByZXN0b3JlIGluc3RydWN0aW9uICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfSU1HTFVFLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19pbWdsdWVfcmVsb2MsICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiSU1HTFVFIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19TRUNSRUwxNiAweDAwMEYgKi8KLSAgLyogICB2YSBvZiBjb250YWluaW5nIHNlY3Rpb24gKGxpbWl0ZWQgdG8gMTYgYml0cykgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19TRUNSRUwxNiwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlNFQ1JFTDE2IiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19SRUZISSAgICAgICAgICAgICAweDAwMTAgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19SRUZISSwgICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19yZWZoaV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUkVGSEkiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX1JFRkxPICAgICAgICAgICAgIDB4MDAxMSAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1JFRkxPLCAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3JlZmhpX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSRUZMTyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19QQUlSICAgICAgICAgICAgICAweDAwMTIgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19QQUlSLCAgICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19wYWlyX3JlbG9jLCAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUEFJUiIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTiAweDAwMTMgKi8KLSAgLyogICAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UsIHdpdGhvdXQgY2F1c2luZyBhIGRlZmluaXRpb24gKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKCAoSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiB8IElNQUdFX1JFTF9QUENfVE9DREVGTiksIC8qIHR5cGUgKi8gCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiVE9DUkVMMTYsIFRPQ0RFRk4iLCAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLQotDAotCi0vKiBTb21lIHJlYWxseSBjaGVlenkgbWFjcm9zIHRoYXQgY2FuIGJlIHR1cm5lZCBvbiB0byB0ZXN0IHN0ZGVyciA6LSkgKi8KLQotI2lmZGVmIERFQlVHX1JFTE9DCi0jZGVmaW5lIFVOX0lNUEwoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHN0YXRpYyBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBpZiAoaSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgZnByaW50ZihzdGRlcnIsXygiVW5pbXBsZW1lbnRlZCBSZWxvY2F0aW9uIC0tICVzXG4iKSx4KTsgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBEVU1QX1JFTE9DKG4scikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGZwcmludGYoc3RkZXJyLCIlcyBzeW0gJWQsIGFkZHIgJWQsIGFkZGVuZCAlZFxuIiwgXAotCSAgIG4sICgqKHItPnN5bV9wdHJfcHRyKSktPm5hbWUsICAgICAgICAgICAgIFwKLQkgICByLT5hZGRyZXNzLCByLT5hZGRlbmQpOyAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8qIEdpdmVuIGEgcmVsb2MgbmFtZSwgbiwgYW5kIGEgcG9pbnRlciB0byBhbiBpbnRlcm5hbF9yZWxvYywgCi0gICBkdW1wIG91dCBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiBvbiB0aGUgY29udGVudHMgCi0KLSNkZWZpbmUgbl9uYW1lCQlfbi5fbl9uYW1lCi0jZGVmaW5lIG5femVyb2VzCV9uLl9uX24uX25femVyb2VzCi0jZGVmaW5lIG5fb2Zmc2V0CV9uLl9uX24uX25fb2Zmc2V0Ci0KLSovCi0KLSNkZWZpbmUgRFVNUF9SRUxPQzIobixyKSAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGZwcmludGYoc3RkZXJyLCIlcyBzeW0gJWQsIHJfdmFkZHIgJWQgJXNcbiIsIFwKLQkgICBuLCByLT5yX3N5bW5keCwgci0+cl92YWRkcixcCi0JICAgKCgoci0+cl90eXBlKSAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgPT0gMCkgXAotCSAgID8iICI6IiBUT0NERUZOIiAgKTsgICAgICBcCi19Ci0KLSNlbHNlCi0jZGVmaW5lIFVOX0lNUEwoeCkKLSNkZWZpbmUgRFVNUF9SRUxPQyhuLHIpCi0jZGVmaW5lIERVTVBfUkVMT0MyKG4scikKLSNlbmRpZgotCi0KLQwKLS8qIHRvYyBjb25zdHJ1Y3Rpb24gYW5kIG1hbmFnZW1lbnQgcm91dGluZXMgKi8KLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIHR3aWNlLCBhbmQgdGhlc2UgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIG9uZQotICAgb2YgdGhlIGNvbXBpbGF0aW9ucy4gIEZJWE1FOiBUaGlzIGlzIGNvbmZ1c2luZyBhbmQgd2VpcmQuICBBbHNvLAotICAgQkZEIHNob3VsZCBub3QgdXNlIGdsb2JhbCB2YXJpYWJsZXMuICAqLwotZXh0ZXJuIGJmZCogYmZkX29mX3RvY19vd25lcjsKLWV4dGVybiBsb25nIGludCBnbG9iYWxfdG9jX3NpemU7Ci0KLWV4dGVybiBsb25nIGludCBpbXBvcnRfdGFibGVfc2l6ZTsKLWV4dGVybiBsb25nIGludCBmaXJzdF90aHVua19hZGRyZXNzOwotZXh0ZXJuIGxvbmcgaW50IHRodW5rX3NpemU7Ci0KLWVudW0gdG9jX3R5cGUKLXsKLSAgZGVmYXVsdF90b2MsCi0gIHRvY18zMiwKLSAgdG9jXzY0Ci19OwotCi1lbnVtIHJlZl9jYXRlZ29yeQotewotICBwcml2LAotICBwdWIsCi0gIGRhdGEKLX07Ci0KLXN0cnVjdCBsaXN0X2VsZQotewotICBzdHJ1Y3QgbGlzdF9lbGUgKm5leHQ7Ci0gIGJmZF92bWEgYWRkcjsKLSAgZW51bSByZWZfY2F0ZWdvcnkgY2F0OwotICBpbnQgb2Zmc2V0OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBsaXN0X2VsZSAqaGVhZDsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9lbGUgKnRhaWw7Ci0KLXN0YXRpYyB2b2lkIHJlY29yZF90b2MKLSAgUEFSQU1TICgoYXNlY3Rpb24gKiwgaW50LCBlbnVtIHJlZl9jYXRlZ29yeSwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfdG9jICh0b2Nfc2VjdGlvbiwgb3VyX3RvY19vZmZzZXQsIGNhdCwgbmFtZSkKLSAgICAgYXNlY3Rpb24gKnRvY19zZWN0aW9uOwotICAgICBpbnQgb3VyX3RvY19vZmZzZXQ7Ci0gICAgIGVudW0gcmVmX2NhdGVnb3J5IGNhdDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgLyogYWRkIHRoaXMgZW50cnkgdG8gb3VyIHRvYyBhZGRyLW9mZnNldC1uYW1lIGxpc3QgKi8KLSAgc3RydWN0IGxpc3RfZWxlICp0OwotICB0ID0gKHN0cnVjdCBsaXN0X2VsZSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsaXN0X2VsZSkpOwotICBpZiAodCA9PSBOVUxMKQotICAgIGFib3J0ICgpOwotICB0LT5uZXh0ID0gMDsKLSAgdC0+b2Zmc2V0ID0gb3VyX3RvY19vZmZzZXQ7Ci0gIHQtPm5hbWUgPSBuYW1lOwotICB0LT5jYXQgPSBjYXQ7Ci0gIHQtPmFkZHIgPSB0b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIG91cl90b2Nfb2Zmc2V0OwotCi0gIGlmIChoZWFkID09IDApCi0gICAgewotICAgICAgaGVhZCA9IHQ7Ci0gICAgICB0YWlsID0gdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0YWlsLT5uZXh0ID0gdDsKLSAgICAgIHRhaWwgPSB0OwotICAgIH0KLX0KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotCi1zdGF0aWMgYm9vbGVhbiBwcGNfcmVjb3JkX3RvY19lbnRyeQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgaW50LCBlbnVtIHRvY190eXBlKSk7Ci1zdGF0aWMgdm9pZCBwcGNfbWFya19zeW1ib2xfYXNfZ2x1ZQotICBQQVJBTVMgKChiZmQgKiwgaW50LCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotCi0vKiByZWNvcmQgYSB0b2Mgb2Zmc2V0IGFnYWluc3QgYSBzeW1ib2wgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNfcmVjb3JkX3RvY19lbnRyeShhYmZkLCBpbmZvLCBzZWMsIHN5bSwgdG9jX2tpbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc3ltOwotICAgICBlbnVtIHRvY190eXBlIHRvY19raW5kIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaW50ICpsb2NhbF9zeW1zOwotCi0gIGggPSAwOwotCi0gIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAob2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZClbc3ltXSk7Ci0gIGlmIChoICE9IDApCi0gICAgewotICAgICAgSEFTSF9DSEVDSyhoKTsKLSAgICB9Ci0KLSAgaWYgKGggPT0gMCkgCi0gICAgeyAKLSAgICAgIGxvY2FsX3N5bXMgPSBvYmpfY29mZl9sb2NhbF90b2NfdGFibGUoYWJmZCk7Ci0gICAgICBpZiAobG9jYWxfc3ltcyA9PSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgLyogYWxsb2NhdGUgYSB0YWJsZSAqLwotCSAgbG9jYWxfc3ltcyA9IAotCSAgICAoaW50ICopIGJmZF96YWxsb2MgKGFiZmQsIAotCQkJCW9ial9yYXdfc3ltZW50X2NvdW50KGFiZmQpICogc2l6ZW9mKGludCkpOwotCSAgaWYgKGxvY2FsX3N5bXMgPT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGFiZmQpID0gbG9jYWxfc3ltczsKLQkgIGZvciAoaSA9IDA7IGkgPCBvYmpfcmF3X3N5bWVudF9jb3VudChhYmZkKTsgKytpKQotCSAgICB7Ci0JICAgICAgU0VUX1VOQUxMT0NBVEVEKGxvY2FsX3N5bXNbaV0pOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoSVNfVU5BTExPQ0FURUQobG9jYWxfc3ltc1tzeW1dKSkgCi0JewotCSAgbG9jYWxfc3ltc1tzeW1dID0gZ2xvYmFsX3RvY19zaXplOwotCSAgZ2xvYmFsX3RvY19zaXplICs9IDQ7Ci0KLQkgIC8qIFRoZSBzaXplIG11c3QgZml0IGluIGEgMTZiaXQgZGlzcGxhY21lbnQgKi8KLQkgIGlmIChnbG9iYWxfdG9jX3NpemUgPiA2NTUzNSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVE9DIG92ZXJmbG93IikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3Rvb19iaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCi0gICAgICAvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUncyBhIHRvYyBzbG90IGFsbG9jYXRlZC4gSWYgbm90LCBkbyBpdAotCSBoZXJlLiBJdCB3aWxsIGJlIHVzZWQgaW4gcmVsb2NhdGVfc2VjdGlvbiAqLwotICAgICAgaWYgKElTX1VOQUxMT0NBVEVEKGgtPnRvY19vZmZzZXQpKQotCXsKLQkgIGgtPnRvY19vZmZzZXQgPSBnbG9iYWxfdG9jX3NpemU7Ci0JICBnbG9iYWxfdG9jX3NpemUgKz0gNDsKLQotCSAgLyogVGhlIHNpemUgbXVzdCBmaXQgaW4gYSAxNmJpdCBkaXNwbGFjbWVudCAqLwotCSAgaWYgKGdsb2JhbF90b2Nfc2l6ZSA+PSA2NTUzNSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVE9DIG92ZXJmbG93IikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3Rvb19iaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIHJlY29yZCBhIHRvYyBvZmZzZXQgYWdhaW5zdCBhIHN5bWJvbCAqLwotc3RhdGljIHZvaWQKLXBwY19tYXJrX3N5bWJvbF9hc19nbHVlKGFiZmQsIHN5bSwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBzeW07Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotewotICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAob2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZClbc3ltXSk7Ci0KLSAgSEFTSF9DSEVDSyhoKTsKLQotICBoLT5zeW1ib2xfaXNfZ2x1ZSA9IDE7Ci0gIGgtPmdsdWVfaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSAmcmVsLT5yX3ZhZGRyKTsKLQotICByZXR1cm47Ci19Ci0KLSNlbmRpZiAvKiBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLQwKLQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZAotICAgYXBwZWFyIGluIHRoZSBvdXRwdXQgLnJlbG9jIHNlY3Rpb24uICovCi0KLXN0YXRpYyBib29sZWFuIGluX3JlbG9jX3AoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiAKLSAgICAoISBob3d0by0+cGNfcmVsYXRpdmUpIAotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfQUREUjMyTkIpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19UT0NSRUwxNikKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX0lNR0xVRSkKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX0lGR0xVRSkgCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19TRUNSRUwpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19TRUNUSU9OKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfU0VDUkVMMTYpCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19SRUZISSkKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1JFRkxPKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfUEFJUikKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2X0RFRk4pIDsKLX0gICAgIAotCi0jaWYgMAotCi0vKiB0aGlzIGZ1bmN0aW9uIGlzIGluIGNoYXJnZSBvZiBwZXJmb3JtaW5nIGFsbCB0aGUgcHBjIFBFIHJlbG9jYXRpb25zICovCi0vKiBEb24ndCB5ZXQga25vdyBpZiB3ZSB3YW50IHRvIGRvIHRoaXMgdGhpcyBwYXJ0aWN1bGFyIHdheSAuLi4gKGtyaykgICovCi0vKiBGSVhNRTogKGl0IGlzIG5vdCB5ZXQgZW5hYmxlZCkgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcGVfcHBjX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiB0aGUgY29uc3RoIHJlbG9jYXRpb24gY29tZXMgaW4gdHdvIHBhcnRzLCB3ZSBoYXZlIHRvIHJlbWVtYmVyCi0gICAgIHRoZSBzdGF0ZSBiZXR3ZWVuIGNhbGxzLCBpbiB0aGVzZSB2YXJpYWJsZXMgKi8KLSAgc3RhdGljIGJvb2xlYW4gcGFydDFfY29uc3RoX2FjdGl2ZSA9IGZhbHNlOwotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJ0MV9jb25zdGhfdmFsdWU7Ci0KLSAgdW5zaWduZWQgbG9uZyBzeW1fdmFsdWU7Ci0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsKLSAgdW5zaWduZWQgbG9uZyBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3MgOyAvKisgaW5wdXRfc2VjdGlvbi0+dm1hKi8KLQkKLSAgcl90eXBlID0gcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkKSAKLSAgICB7Ci0gICAgICAvKiBQYXJ0aWFsIGxpbmtpbmcgLSBkbyBub3RoaW5nICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsgCi0gICAgfQotCi0gIGlmIChzeW1ib2xfaW4gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIEtlZXAgdGhlIHN0YXRlIG1hY2hpbmUgaGFwcHkgaW4gY2FzZSB3ZSdyZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgIGlmIChyX3R5cGUgPT0gSU1BR0VfUkVMX1BQQ19SRUZISSkgCi0JewotCSAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IHRydWU7Ci0JICBwYXJ0MV9jb25zdGhfdmFsdWUgID0gMDsKLQl9Ci0gICAgICByZXR1cm4oYmZkX3JlbG9jX3VuZGVmaW5lZCk7Ci0gICAgfQotICAKLSAgaWYgKChwYXJ0MV9jb25zdGhfYWN0aXZlKSAmJiAocl90eXBlICE9IElNQUdFX1JFTF9QUENfUEFJUikpIAotICAgIHsKLSAgICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgICAgICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikgXygiTWlzc2luZyBQQUlSIik7Ci0gICAgICByZXR1cm4oYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gICAgfQotCi0KLSAgc3ltX3ZhbHVlID0gZ2V0X3N5bWJvbF92YWx1ZShzeW1ib2xfaW4pOwotICAKLSAgcmV0dXJuKGJmZF9yZWxvY19vayk7CQotfQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLSAgYm9vbGVhbiBoaWhhbGY7Ci0gIGJmZF92bWEgaGloYWxmX3ZhbDsKLSAgYXNlY3Rpb24gKnRvY19zZWN0aW9uID0gMDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IDA7Ci0gIAotICAvKiBJZiB3ZSBhcmUgcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGEKLSAgICAgdGhpbmcuICBUaGUgY2FsbGVyIHdpbGwgdGFrZSBjYXJlIG9mIGFkanVzdGluZyB0aGUgcmVsb2MKLSAgICAgYWRkcmVzc2VzIGFuZCBzeW1ib2wgaW5kaWNlcy4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIAotICBoaWhhbGYgPSBmYWxzZTsKLSAgaGloYWxmX3ZhbCA9IDA7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0KLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0gICAgICBiZmRfYnl0ZSAqbG9jOwotCi0gICAgICB1bnNpZ25lZCBzaG9ydCByX3R5cGUgID0gRVhUUkFDVF9UWVBFIChyZWwtPnJfdHlwZSk7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCByX2ZsYWdzID0gRVhUUkFDVF9GTEFHUyhyZWwtPnJfdHlwZSk7Ci0gIAotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLSAgICAgIGxvYyA9IGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICAvKiBGSVhNRTogY2hlY2sgYm91bmRzIG9uIHJfdHlwZSAqLwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAKLQkgICAgKG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XSk7Ci0JICBpZiAoaCAhPSAwKSAKLQkgICAgewotCSAgICAgIEhBU0hfQ0hFQ0soaCk7Ci0JICAgIH0KLQotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gSU1BR0VfUkVMX1BQQ19JTUdMVUUgJiYgaCA9PSAwKQotCXsKLQkgIC8qIEFuIElNR0xVRSByZWxvYyBtdXN0IGhhdmUgYSBuYW1lLiBTb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4gKi8KLQkgIGFib3J0KCk7Ci0JfQotCi0gICAgICBzZWMgPSBOVUxMOwotICAgICAgdmFsID0gMDsKLQotICAgICAgLyogRklYTUU6IFBBSVIgdW5zdXBwb3J0ZWQgaW4gdGhlIGZvbGxvd2luZyBjb2RlICovCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotCSAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKG91dHB1dF9iZmQpKQotCQl2YWwgLT0gc2VjLT52bWE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgSEFTSF9DSEVDSyhoKTsKLQotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0gICAgICAKLSAgICAgIC8qIEVhY2ggY2FzZSBtdXN0IGRvIGl0cyBvd24gcmVsb2NhdGlvbiwgc2V0dGluZyByc3RhdCBhcHByb3ByaWF0ZWx5ICovCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAweCUwMngiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHJfdHlwZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIElNQUdFX1JFTF9QUENfVE9DUkVMMTY6Ci0JICB7Ci0JICAgIGJmZF92bWEgb3VyX3RvY19vZmZzZXQ7Ci0JICAgIGludCBmaXhpdDsKLQotCSAgICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQotCSAgICBpZiAodG9jX3NlY3Rpb24gPT0gMCkgCi0JICAgICAgewotCQl0b2Nfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChiZmRfb2ZfdG9jX293bmVyLCAKLQkJCQkJCSAgICAgICBUT0NfU0VDVElPTl9OQU1FKTsKLQotCQlpZiAoIHRvY19zZWN0aW9uID09IE5VTEwgKSAKLQkJICB7Ci0JCSAgICAvKiBUaGVyZSBpcyBubyB0b2Mgc2VjdGlvbi4gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0JCSAgICBhYm9ydCgpOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgLyogCi0JICAgICAqICBBbWF6aW5nIGJpdCB0cmlja3MgcHJlc2VudC4gQXMgd2UgbWF5IGhhdmUgc2VlbiBlYXJsaWVyLCB3ZQotCSAgICAgKiAgdXNlIHRoZSAxIGJpdCB0byB0ZWxsIHVzIHdoZXRoZXIgb3Igbm90IGEgdG9jIG9mZnNldCBoYXMgYmVlbgotCSAgICAgKiAgYWxsb2NhdGVkLiBOb3cgdGhhdCB0aGV5J3ZlIGFsbCBiZWVuIGFsbG9jYXRlZCwgd2Ugd2lsbCB1c2UKLQkgICAgICogIHRoZSAxIGJpdCB0byB0ZWxsIHVzIGlmIHdlJ3ZlIHdyaXR0ZW4gdGhpcyBwYXJ0aWN1bGFyIHRvYwotCSAgICAgKiAgZW50cnkgb3V0LgotCSAgICAgKi8KLQkgICAgZml4aXQgPSBmYWxzZTsKLQkgICAgaWYgKGggPT0gMCkKLQkgICAgICB7IC8qIGl0IGlzIGEgZmlsZSBsb2NhbCBzeW1ib2wgKi8KLQkJaW50ICpsb2NhbF90b2NfdGFibGU7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJc3ltID0gc3ltcyArIHN5bW5keDsKLQkJbmFtZSA9IHN5bS0+X24uX25fbmFtZTsKLQotCQlsb2NhbF90b2NfdGFibGUgPSBvYmpfY29mZl9sb2NhbF90b2NfdGFibGUoaW5wdXRfYmZkKTsKLQkJb3VyX3RvY19vZmZzZXQgPSBsb2NhbF90b2NfdGFibGVbc3ltbmR4XTsKLQotCQlpZiAoSVNfV1JJVFRFTihvdXJfdG9jX29mZnNldCkpCi0JCSAgewotCQkgICAgLyogaWYgaXQgaGFzIGJlZW4gd3JpdHRlbiBvdXQsIGl0IGlzIG1hcmtlZCB3aXRoIHRoZSAKLQkJICAgICAgIDEgYml0LiBGaXggdXAgb3VyIG9mZnNldCwgYnV0IGRvIG5vdCB3cml0ZSBpdCBvdXQKLQkJICAgICAgIGFnYWluLgotCQkgICAgICovCi0JCSAgICBNQUtFX0FERFJfQUdBSU4ob3VyX3RvY19vZmZzZXQpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIHdyaXRlIG91dCB0aGUgdG9jIGVudHJ5ICovCi0JCSAgICByZWNvcmRfdG9jKHRvY19zZWN0aW9uLCAKLQkJCSAgICAgICBvdXJfdG9jX29mZnNldCwgCi0JCQkgICAgICAgcHJpdiwgCi0JCQkgICAgICAgc3RyZHVwKG5hbWUpKTsKLQotCQkgICAgYmZkX3B1dF8zMihvdXRwdXRfYmZkLAotCQkJICAgICAgIHZhbCwKLQkJCSAgICAgICB0b2Nfc2VjdGlvbi0+Y29udGVudHMgKyBvdXJfdG9jX29mZnNldCk7Ci0KLQkJICAgIE1BUktfQVNfV1JJVFRFTihsb2NhbF90b2NfdGFibGVbc3ltbmR4XSk7Ci0JCSAgICBmaXhpdCA9IHRydWU7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkJb3VyX3RvY19vZmZzZXQgPSBoLT50b2Nfb2Zmc2V0OwotCi0JCWlmICgocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgCi0JCSAgICA9PSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gKQotCQkgIHsKLQkJICAgIC8qIFRoaXMgaXMgdW5iZWxpZXZhYmxlIGNoZWVzZS4gU29tZSBrbm93bGVkZ2FibGUgYXNtIAotCQkgICAgICAgaGFja2VyIGhhcyBkZWNpZGVkIHRvIHVzZSByMiBhcyBhIGJhc2UgZm9yIGxvYWRpbmcgCi0JCSAgICAgICBhIHZhbHVlLiBIZS9TaGUgZG9lcyB0aGlzIGJ5IHNldHRpbmcgdGhlIHRvY2RlZm4gYml0LCAKLQkJICAgICAgIGFuZCBub3Qgc3VwcGx5aW5nIGEgdG9jIGRlZmluaXRpb24uIFRoZSBiZWhhdmlvdXIgaXMgCi0JCSAgICAgICB0aGVuIHRvIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2YWx1ZSBvZiB0aGUgCi0JCSAgICAgICBzeW1ib2wgYW5kIHRoZSBhY3R1YWwgbG9jYXRpb24gb2YgdGhlIHRvYyBhcyB0aGUgdG9jIAotCQkgICAgICAgaW5kZXguIAotCi0JCSAgICAgICBJbiBmYWN0LCB3aGF0IGlzIHVzdWFsbHkgaGFwcGVuaW5nIGlzLCBiZWNhdXNlIHRoZQotCQkgICAgICAgSW1wb3J0IEFkZHJlc3MgVGFibGUgaXMgbWFwcGVkIGltbWVkaWF0ZWx5IGZvbGxvd2luZwotCQkgICAgICAgdGhlIHRvYywgc29tZSB0cmlwcHkgbGlicmFyeSBjb2RlIHRyeWluZyBmb3Igc3BlZWQgb24KLQkJICAgICAgIGRsbCBsaW5rYWdlLCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhhdCBhbmQgY29uc2lkZXJzIAotCQkgICAgICAgdGhlIElBVCB0byBiZSBwYXJ0IG9mIHRoZSB0b2MsIHRodXMgc2F2aW5nIGEgbG9hZC4KLQkJICAgICovCi0KLQkJICAgIG91cl90b2Nfb2Zmc2V0ID0gdmFsIC0gCi0JCSAgICAgICh0b2Nfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIAotCQkgICAgICAgdG9jX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JCSAgICAvKiBUaGUgc2l6ZSBtdXN0IHN0aWxsIGZpdCBpbiBhIDE2Yml0IGRpc3BsYWNtZW50ICovCi0JCSAgICBpZiAob3VyX3RvY19vZmZzZXQgPj0gNjU1MzUpCi0JCSAgICAgIHsKLQkJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJICAoXygiJXM6IFJlbG9jYXRpb24gZm9yICVzIG9mICV4IGV4Y2VlZHMgVG9jIHNpemUgbGltaXQiKSwgCi0JCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBuYW1lLCBvdXJfdG9jX29mZnNldCk7Ci0JCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgfQotCi0JCSAgICByZWNvcmRfdG9jKHRvY19zZWN0aW9uLCBvdXJfdG9jX29mZnNldCwgcHViLCBzdHJkdXAobmFtZSkpOwotCQkgIH0KLQkJZWxzZSBpZiAoSVNfV1JJVFRFTihvdXJfdG9jX29mZnNldCkpCi0JCSAgewotCQkgICAgLyogaWYgaXQgaGFzIGJlZW4gd3JpdHRlbiBvdXQsIGl0IGlzIG1hcmtlZCB3aXRoIHRoZSAKLQkJICAgICAgIDEgYml0LiBGaXggdXAgb3VyIG9mZnNldCwgYnV0IGRvIG5vdCB3cml0ZSBpdCBvdXQKLQkJICAgICAgIGFnYWluLgotCQkgICAgICovCi0JCSAgICBNQUtFX0FERFJfQUdBSU4ob3VyX3RvY19vZmZzZXQpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIHJlY29yZF90b2ModG9jX3NlY3Rpb24sIG91cl90b2Nfb2Zmc2V0LCBwdWIsIHN0cmR1cChuYW1lKSk7Ci0KLQkJICAgIC8qIHdyaXRlIG91dCB0aGUgdG9jIGVudHJ5ICovCi0JCSAgICBiZmRfcHV0XzMyKG91dHB1dF9iZmQsCi0JCQkgICAgICAgdmFsLAotCQkJICAgICAgIHRvY19zZWN0aW9uLT5jb250ZW50cyArIG91cl90b2Nfb2Zmc2V0KTsKLQotCQkgICAgTUFSS19BU19XUklUVEVOKGgtPnRvY19vZmZzZXQpOwotCQkgICAgLyogVGhlIHRyaWNreSBwYXJ0IGlzIHRoYXQgdGhpcyBpcyB0aGUgYWRkcmVzcyB0aGF0ICovCi0JCSAgICAvKiBuZWVkcyBhIC5yZWxvYyBlbnRyeSBmb3IgaXQgKi8KLQkJICAgIGZpeGl0ID0gdHJ1ZTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmIChmaXhpdCAmJiBpbmZvLT5iYXNlX2ZpbGUpIAotCSAgICAgIHsKLQkJLyogU28gaWYgdGhpcyBpcyBub24gcGNyZWxhdGl2ZSwgYW5kIGlzIHJlZmVyZW5jZWQKLQkJICAgdG8gYSBzZWN0aW9uIG9yIGEgY29tbW9uIHN5bWJvbCwgdGhlbiBpdCBuZWVkcyBhIHJlbG9jICovCi0KLQkJLyogcmVsb2NhdGlvbiB0byBhIHN5bWJvbCBpbiBhIHNlY3Rpb24gd2hpY2gKLQkJICAgaXNuJ3QgYWJzb2x1dGUgLSB3ZSBvdXRwdXQgdGhlIGFkZHJlc3MgaGVyZSAKLQkJICAgdG8gYSBmaWxlICovCi0KLQkJYmZkX3ZtYSBhZGRyID0gIHRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgKyB0b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIG91cl90b2Nfb2Zmc2V0OwotCQkgICAgCi0JCWlmIChjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKQotCQkgIGFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQotCQlmd3JpdGUgKCZhZGRyLCAxLDQsIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSk7Ci0JICAgICAgfQotCi0KLQkgICAgLyogRklYTUU6IHRoaXMgdGVzdCBpcyBjb25zZXJ2YXRpdmUgKi8KLQkgICAgaWYgKCAocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgIT0gSU1BR0VfUkVMX1BQQ19UT0NERUZOICYmCi0JCW91cl90b2Nfb2Zmc2V0ID4gdG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogUmVsb2NhdGlvbiBleGNlZWRzIGFsbG9jYXRlZCBUT0MgKCV4KSIpLCAKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJICAgdG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIC8qIE5vdyB3ZSBrbm93IHRoZSByZWxvY2F0aW9uIGZvciB0aGlzIHRvYyByZWZlcmVuY2UgKi8KLQkgICAgcmVsb2NhdGlvbiA9ICBvdXJfdG9jX29mZnNldCArIFRPQ19MT0FEX0FESlVTVE1FTlQ7Ci0JICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCi0JCQkJCSAgICBpbnB1dF9iZmQsIAotCQkJCQkgICAgcmVsb2NhdGlvbiwgCi0JCQkJCSAgICBsb2MpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX0lGR0xVRToKLQkgIHsKLQkgICAgLyogVG8gc29sdmUgdGhpcywgd2UgbmVlZCB0byBrbm93IHdoZXRoZXIgb3Igbm90IHRoZSBzeW1ib2wgKi8KLQkgICAgLyogYXBwZWFyaW5nIG9uIHRoZSBjYWxsIGluc3RydWN0aW9uIGlzIGEgZ2x1ZSBmdW5jdGlvbiBvciBub3QuICovCi0JICAgIC8qIEEgZ2x1ZSBmdW5jdGlvbiBtdXN0IGFubm91bmNlIGl0c2VsZiB2aWEgYSBJTUdMVUUgcmVsb2MsIGFuZCAqLwotCSAgICAvKiB0aGUgcmVsb2MgY29udGFpbnMgdGhlIHJlcXVpcmVkIHRvYyByZXN0b3JlIGluc3RydWN0aW9uICovCi0JICAKLQkgICAgYmZkX3ZtYSB4OwotCSAgICBjb25zdCBjaGFyICpteV9uYW1lOwotCSAgICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQotCSAgICBpZiAoaCAhPSAwKQotCSAgICAgIHsKLQkJbXlfbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkJaWYgKGgtPnN5bWJvbF9pc19nbHVlID09IDEpIAotCQkgIHsKLQkJICAgIHggPSBiZmRfZ2V0XzMyKGlucHV0X2JmZCwgbG9jKTsKLQkJICAgIGJmZF9wdXRfMzIoaW5wdXRfYmZkLCBoLT5nbHVlX2luc24sIGxvYyk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19TRUNSRUw6Ci0JICAvKiBVbmltcGxlbWVudGVkOiBjb2RldmlldyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKi8KLQkgIC8qIEZvciBmYXN0IGFjY2VzcyB0byB0aGUgaGVhZGVyIG9mIHRoZSBzZWN0aW9uIAotCSAgICAgY29udGFpbmluZyB0aGUgaXRlbS4gKi8KLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19TRUNUSU9OOgotCSAgLyogVW5pbXBsZW1lbnRlZDogY29kZXZpZXcgZGVidWdnaW5nIGluZm9ybWF0aW9uICovCi0JICAvKiBJcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIHNob3VsZCBiZSByZWxhdGl2ZQotCSAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQotCSAgICAgc3ltYm9sICovCi0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfQUJTT0xVVEU6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm15X25hbWU7Ci0JICAgIGlmIChoID09IDApCi0JCW15X25hbWUgPSAoc3ltcytzeW1uZHgpLT5fbi5fbl9uYW1lOwotCSAgICBlbHNlCi0JICAgICAgewotCQlteV9uYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIH0KLQotCSAgICBmcHJpbnRmKHN0ZGVyciwgCi0JCSAgICBfKCJXYXJuaW5nOiB1bnN1cHBvcnRlZCByZWxvYyAlcyA8ZmlsZSAlcywgc2VjdGlvbiAlcz5cbiIpLCAKLQkJICAgIGhvd3RvLT5uYW1lLAotCQkgICAgYmZkX2dldF9maWxlbmFtZShpbnB1dF9iZmQpLAotCQkgICAgaW5wdXRfc2VjdGlvbi0+bmFtZSk7Ci0KLQkgICAgZnByaW50ZihzdGRlcnIsInN5bSAlbGQgKCVzKSwgcl92YWRkciAlbGQgKCVseClcbiIsIAotCQkgICAgcmVsLT5yX3N5bW5keCwgbXlfbmFtZSwgKGxvbmcpIHJlbC0+cl92YWRkciwKLQkJICAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIpOyAgCi0JICB9Ci0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfSU1HTFVFOgotCSAgewotCSAgICAvKiBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIG5vdy4gVGhpcyByZWxvYyB3YXMgbm90ZWQgaW4gdGhlIGZpcnN0Ci0JICAgICAgIHBhc3Mgb3ZlciB0aGUgcmVsb2NzLCBhbmQgdGhlIGdsdWUgaW5zdHJ1Y3Rpb24gZXh0cmFjdGVkICovCi0JICAgIGNvbnN0IGNoYXIgKm15X25hbWU7Ci0JICAgIGlmIChoLT5zeW1ib2xfaXNfZ2x1ZSA9PSAxKSAKLQkgICAgICBicmVhazsKLQkgICAgbXlfbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQotCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAoXygiJXM6IE91dCBvZiBvcmRlciBJTUdMVUUgcmVsb2MgZm9yICVzIiksIAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBteV9uYW1lKTsKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCWNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzJOQjoKLQkgIHsKLQkgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpteWggPSAwOwotCSAgICBjb25zdCBjaGFyICpuYW1lID0gMDsKLQkgICAgRFVNUF9SRUxPQzIoaG93dG8tPm5hbWUsIHJlbCk7Ci0KLQkgICAgaWYgKHN0cm5jbXAoIi5pZGF0YSQyIixpbnB1dF9zZWN0aW9uLT5uYW1lLDgpID09IDAgJiYgZmlyc3RfdGh1bmtfYWRkcmVzcyA9PSAwKQotCSAgICAgIHsKLQkJLyogc2V0IG1hZ2ljIHZhbHVlcyAqLwotCQlpbnQgaWRhdGE1b2Zmc2V0OwotCQlzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKm15aCA9IDA7Ci0JCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJICAgICAiX19pZGF0YTVfbWFnaWNfXyIsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJZmlyc3RfdGh1bmtfYWRkcmVzcyA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSArIAotCQkgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIAotCQkgICAgc2VjLT5vdXRwdXRfb2Zmc2V0IC0gCi0JCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0JCQotCQlpZGF0YTVvZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJICAgICAiX19pZGF0YTZfbWFnaWNfXyIsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJCi0JCXRodW5rX3NpemUgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgLSBpZGF0YTVvZmZzZXQ7Ci0JCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJICAgICAiX19pZGF0YTRfbWFnaWNfXyIsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJaW1wb3J0X3RhYmxlX3NpemUgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JICAgICAgfQotCi0JICAgIGlmIChoID09IDApCi0JICAgICAgeyAvKiBpdCBpcyBhIGZpbGUgbG9jYWwgc3ltYm9sICovCi0JCXN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JCW5hbWUgPSBzeW0tPl9uLl9uX25hbWU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQljaGFyICp0YXJnZXQgPSAwOwotCi0JCW5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWlmIChzdHJjbXAoIi5pZGF0YSQyIiwgbmFtZSkgPT0gMCkKLQkJICB0YXJnZXQgPSAiX19pZGF0YTJfbWFnaWNfXyI7Ci0JCWVsc2UgaWYgKHN0cmNtcCgiLmlkYXRhJDQiLCBuYW1lKSA9PSAwKQotCQkgIHRhcmdldCA9ICJfX2lkYXRhNF9tYWdpY19fIjsKLQkJZWxzZSBpZiAoc3RyY21wKCIuaWRhdGEkNSIsIG5hbWUpID09IDApCi0JCSAgdGFyZ2V0ID0gIl9faWRhdGE1X21hZ2ljX18iOwotCi0JCWlmICh0YXJnZXQgIT0gMCkKLQkJICB7Ci0JCSAgICBteWggPSAwOwotCi0JCSAgICBteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgdGFyZ2V0LAotCQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCSAgICBpZiAobXloID09IDApIAotCQkgICAgICB7Ci0JCQkvKiBNaXNzaW5nIG1hZ2ljIGNvb2tpZXMuIFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLwotCQkJYWJvcnQoKTsKLQkJICAgICAgfQotCQkgICAgCi0JCSAgICB2YWwgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgKyAKLQkJICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotCQkgICAgaWYgKGZpcnN0X3RodW5rX2FkZHJlc3MgPT0gMCkKLQkJICAgICAgewotCQkJaW50IGlkYXRhNW9mZnNldDsKLQkJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICAgIl9faWRhdGE1X21hZ2ljX18iLAotCQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkJZmlyc3RfdGh1bmtfYWRkcmVzcyA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSArIAotCQkJICBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAKLQkJCSAgICBzZWMtPm91dHB1dF9vZmZzZXQgLSAKLQkJCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0JCQkKLQkJCWlkYXRhNW9mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICAgIl9faWRhdGE2X21hZ2ljX18iLAotCQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkJCi0JCQl0aHVua19zaXplID0gbXloLT5yb290LnUuZGVmLnZhbHVlIC0gaWRhdGE1b2Zmc2V0OwotCQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgICAiX19pZGF0YTRfbWFnaWNfXyIsCi0JCQkJCQkgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlpbXBvcnRfdGFibGVfc2l6ZSA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJICAgICAgCSAgICAgIGlucHV0X2JmZCwgCi0JCQkgICAgICB2YWwgLSAKLQkJCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2UsCi0JCQkgICAgICBsb2MpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIElNQUdFX1JFTF9QUENfUkVMMjQ6Ci0JICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQkgIHZhbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCi0JCQkJCSAgaW5wdXRfYmZkLCAKLQkJCQkJICB2YWwsIAotCQkJCQkgIGxvYyk7Ci0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfQUREUjE2OgotCWNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLQkgIERVTVBfUkVMT0MyKGhvd3RvLT5uYW1lLCByZWwpOwotCSAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJCQkJICBpbnB1dF9iZmQsIAotCQkJCQkgIHZhbCwgCi0JCQkJCSAgbG9jKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCBpbmZvLT5iYXNlX2ZpbGUgKQotCXsKLQkgIC8qIFNvIGlmIHRoaXMgaXMgbm9uIHBjcmVsYXRpdmUsIGFuZCBpcyByZWZlcmVuY2VkCi0JICAgICB0byBhIHNlY3Rpb24gb3IgYSBjb21tb24gc3ltYm9sLCB0aGVuIGl0IG5lZWRzIGEgcmVsb2MgKi8KLQkgIGlmIChzeW0gJiYgcGVfZGF0YShvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcChvdXRwdXRfYmZkLCBob3d0bykpCi0JICAgIHsKLQkgICAgICAvKiByZWxvY2F0aW9uIHRvIGEgc3ltYm9sIGluIGEgc2VjdGlvbiB3aGljaAotCQkgaXNuJ3QgYWJzb2x1dGUgLSB3ZSBvdXRwdXQgdGhlIGFkZHJlc3MgaGVyZSAKLQkJIHRvIGEgZmlsZSAqLwotCSAgICAgIGJmZF92bWEgYWRkciA9IHJlbC0+cl92YWRkciAKLQkJLSBpbnB1dF9zZWN0aW9uLT52bWEgCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCAKLQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQkgICAgICBpZiAoY29mZl9kYXRhKG91dHB1dF9iZmQpLT5wZSkKLQkJewotCQkgIGFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQkJfQotCSAgICAgIGZ3cml0ZSAoJmFkZHIsIDEsNCwgKEZJTEUgKikgaW5mby0+YmFzZV9maWxlKTsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UgaWYgKHN5bSA9PSBOVUxMKQotCSAgICAgIG5hbWUgPSAiKnVua25vd24qIjsKLQkgICAgZWxzZSBpZiAoc3ltLT5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCi0JCSAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCSAgICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RybmNweSAoYnVmLCBzeW0tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLQkJYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JCW5hbWUgPSBidWY7Ci0JICAgICAgfQotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgCi0JCSAgICAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgewotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgfQotCX0KLQotICAgIH0gICAgIAotCi0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLS8qIEZJWE1FOiBCRkQgc2hvdWxkIG5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcy4gIFRoaXMgZmlsZSBpcyBjb21waWxlZAotICAgdHdpY2UsIGFuZCB0aGVzZSB2YXJpYWJsZXMgYXJlIHNoYXJlZC4gIFRoaXMgaXMgY29uZnVzaW5nIGFuZAotICAgd2VpcmQuICAqLwotCi1sb25nIGludCBnbG9iYWxfdG9jX3NpemUgPSA0OwotCi1iZmQqIGJmZF9vZl90b2Nfb3duZXIgPSAwOwotCi1sb25nIGludCBpbXBvcnRfdGFibGVfc2l6ZTsKLWxvbmcgaW50IGZpcnN0X3RodW5rX2FkZHJlc3M7Ci1sb25nIGludCB0aHVua19zaXplOwotCi1zdHJ1Y3QgbGlzdF9lbGUgKmhlYWQ7Ci1zdHJ1Y3QgbGlzdF9lbGUgKnRhaWw7Ci0KLXN0YXRpYyBjaGFyICoKLWgxID0gTl8oIlxuXHRcdFx0VE9DIE1BUFBJTkdcblxuIik7Ci1zdGF0aWMgY2hhciAqCi1oMiA9IE5fKCIgVE9DICAgIGRpc2Fzc2VtYmx5ICBDb21tZW50cyAgICAgICBOYW1lXG4iKTsKLXN0YXRpYyBjaGFyICoKLWgzID0gTl8oIiBPZmZzZXQgIHNwZWxsaW5nICAgICAgICAgICAgICAgICAgIChpZiBwcmVzZW50KVxuIik7Ci0KLXZvaWQKLWR1bXBfdG9jICh2ZmlsZSkKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIHN0cnVjdCBsaXN0X2VsZSAqdDsKLQotICBmcHJpbnRmKGZpbGUsIF8oaDEpKTsKLSAgZnByaW50ZihmaWxlLCBfKGgyKSk7Ci0gIGZwcmludGYoZmlsZSwgXyhoMykpOwotCi0gIGZvcih0ID0gaGVhZDsgdCAhPSAwOyB0PXQtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqY2F0ID0gIiI7Ci0KLSAgICAgIGlmICh0LT5jYXQgPT0gcHJpdikKLQljYXQgPSBfKCJwcml2YXRlICAgICAgICIpOwotICAgICAgZWxzZSBpZiAodC0+Y2F0ID09IHB1YikKLQljYXQgPSBfKCJwdWJsaWMgICAgICAgICIpOwotICAgICAgZWxzZSBpZiAodC0+Y2F0ID09IGRhdGEpCi0JY2F0ID0gXygiZGF0YS1pbi10b2MgICAiKTsKLQotICAgICAgaWYgKHQtPm9mZnNldCA+IGdsb2JhbF90b2Nfc2l6ZSkKLQl7Ci0JICBpZiAodC0+b2Zmc2V0IDw9IGdsb2JhbF90b2Nfc2l6ZSArIHRodW5rX3NpemUpCi0JICAgIGNhdCA9IF8oIklBVCByZWZlcmVuY2UgIik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmKGZpbGUsCi0JCSAgICAgIF8oIioqKiogZ2xvYmFsX3RvY19zaXplICVsZCglbHgpLCB0aHVua19zaXplICVsZCglbHgpXG4iKSwKLQkJICAgICAgZ2xvYmFsX3RvY19zaXplLCBnbG9iYWxfdG9jX3NpemUsIHRodW5rX3NpemUsIHRodW5rX3NpemUpOwotCSAgICAgIGNhdCA9IF8oIk91dCBvZiBib3VuZHMhIik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZwcmludGYoZmlsZSwKLQkgICAgICAiICUwNGx4ICAgICglZCkiLCAodW5zaWduZWQgbG9uZykgdC0+b2Zmc2V0LCB0LT5vZmZzZXQgLSAzMjc2OCk7Ci0gICAgICBmcHJpbnRmKGZpbGUsCi0JICAgICAgIiAgICAlcyAlc1xuIiwKLQkgICAgICBjYXQsIHQtPm5hbWUpOwotCi0gICAgfQotCi0gIGZwcmludGYoZmlsZSwgIlxuIik7Ci19Ci0KLWJvb2xlYW4KLXBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiAoaW5mbykgCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBiZmRfYnl0ZSAqZm9vOwotICBzdGF0aWMgY2hhciB0ZXN0X2NoYXIgPSAnMSc7Ci0KLSAgaWYgKCBnbG9iYWxfdG9jX3NpemUgPT0gMCApIC8qIEZJWE1FOiBkb2VzIHRoaXMgZ2V0IG1lIGluIHRyb3VibGU/ICovCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9vZl90b2Nfb3duZXIgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBObyB0b2Mgb3duZXI/IFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLwotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lICggYmZkX29mX3RvY19vd25lciAsIFRPQ19TRUNUSU9OX05BTUUpOwotICBpZiAocyA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICAvKiBObyB0b2Mgc2VjdGlvbj8gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0gICAgICBhYm9ydCgpOwotICAgIH0KLQotICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jKGJmZF9vZl90b2Nfb3duZXIsIGdsb2JhbF90b2Nfc2l6ZSk7Ci0gIG1lbXNldChmb28sIHRlc3RfY2hhciwgZ2xvYmFsX3RvY19zaXplKTsKLQotICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxfdG9jX3NpemU7Ci0gIHMtPmNvbnRlbnRzID0gZm9vOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1wcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppLCAqcmVsOwotCi0gIC8qIGhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiBXZSBoYXZlIGEgaG9vawotICAgICB0byBkbyByZWxvYyBydW1tYWdpbmcsIGJlZm9yZSBzZWN0aW9uIHNpemVzIGFyZSBuYWlsZWQgZG93bi4gKi8KLQotICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMoYWJmZCk7Ci0KLSAgLyogcnVtbWFnZSBhcm91bmQgYWxsIHRoZSByZWxvY3MgYW5kIG1hcCB0aGUgdG9jICovCi0gIHNlYyA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChzZWMgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgZm9yICg7IHNlYyAhPSAwOyBzZWMgPSBzZWMtPm5leHQpCi0gIHsKLSAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKSAKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLyogbG9hZCB0aGUgcmVsb2NzICovCi0gICAgLyogRklYTUU6IHRoZXJlIG1heSBiZSBhIHN0b3JhZ2UgbGVhayBoZXJlICovCi0gICAgaT1fYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MoYWJmZCxzZWMsMSwwLDAsMCk7Ci0gICAgCi0gICAgaWYgKGkgPT0gMCkKLSAgICAgIGFib3J0KCk7Ci0KLSAgICBmb3IgKHJlbD1pO3JlbDxpK3NlYy0+cmVsb2NfY291bnQ7KytyZWwpIAotICAgICAgewotCXVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLQl1bnNpZ25lZCBzaG9ydCByX2ZsYWdzID0gRVhUUkFDVF9GTEFHUyhyZWwtPnJfdHlwZSk7Ci0JYm9vbGVhbiBvayA9IHRydWU7Ci0KLQlEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0KLQlzd2l0Y2gocl90eXBlKSAKLQkgIHsKLQkgIGNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLQkgICAgLyogaWYgVE9DREVGTiBpcyBvbiwgaWdub3JlIGFzIHNvbWVvbmUgZWxzZSBoYXMgYWxsb2NhdGVkIHRoZQotCSAgICAgICB0b2MgZW50cnkgKi8KLQkgICAgaWYgKCAocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgIT0gSU1BR0VfUkVMX1BQQ19UT0NERUZOICkKLQkgICAgICBvayA9IHBwY19yZWNvcmRfdG9jX2VudHJ5KGFiZmQsIGluZm8sIHNlYywgCi0JCQkJCXJlbC0+cl9zeW1uZHgsIGRlZmF1bHRfdG9jKTsKLQkgICAgaWYgKCFvaykKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLQkgICAgcHBjX21hcmtfc3ltYm9sX2FzX2dsdWUoYWJmZCwgcmVsLT5yX3N5bW5keCwgcmVsKTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYKLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfcmVmaGlfcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJSRUZISSIpOwotICBEVU1QX1JFTE9DKCJSRUZISSIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0jaWYgMAotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfcmVmbG9fcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJSRUZMTyIpOwotICBEVU1QX1JFTE9DKCJSRUZMTyIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0jZW5kaWYKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3BhaXJfcmVsb2MgKGFiZmQsCi0JCXJlbG9jX2VudHJ5LAotCQlzeW1ib2wsCi0JCWRhdGEsCi0JCWlucHV0X3NlY3Rpb24sCi0JCW91dHB1dF9iZmQsCi0JCWVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJQQUlSIik7Ci0gIERVTVBfUkVMT0MoIlBBSVIiLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLX0KLQotDAotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3RvYzE2X3JlbG9jIChhYmZkLAotCQkgcmVsb2NfZW50cnksCi0JCSBzeW1ib2wsCi0JCSBkYXRhLAotCQkgaW5wdXRfc2VjdGlvbiwKLQkJIG91dHB1dF9iZmQsCi0JCSBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgVU5fSU1QTCgiVE9DUkVMMTYiKTsKLSAgRFVNUF9SRUxPQygiVE9DUkVMMTYiLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotI2lmIDAKLQotLyogQUREUjMyTkIgOiAzMiBiaXQgYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgdmlydHVhbCBvcmlnaW4uICAgICAgICAgKi8KLS8qICAgICAgICAgICAgKE9uIHRoZSBhbHBoYSwgdGhpcyBpcyBhbHdheXMgYSBsaW5rZXIgZ2VuZXJhdGVkIHRodW5rKSovCi0vKiAgICAgICAgICAgIChpLmUuIDMyYml0IGFkZHIgcmVsYXRpdmUgdG8gdGhlIGltYWdlIGJhc2UpICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19hZGRyMzJuYl9yZWxvYyAoYWJmZCwKLQkJICAgIHJlbG9jX2VudHJ5LAotCQkgICAgc3ltYm9sLAotCQkgICAgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICBvdXRwdXRfYmZkLAotCQkgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIFVOX0lNUEwoIkFERFIzMk5CIik7Ci0gIERVTVBfUkVMT0MoIkFERFIzMk5CIixyZWxvY19lbnRyeSk7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19zZWNyZWxfcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJTRUNSRUwiKTsKLSAgRFVNUF9SRUxPQygiU0VDUkVMIixyZWxvY19lbnRyeSk7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3NlY3Rpb25fcmVsb2MgKGFiZmQsCi0JCSAgIHJlbG9jX2VudHJ5LAotCQkgICBzeW1ib2wsCi0JCSAgIGRhdGEsCi0JCSAgIGlucHV0X3NlY3Rpb24sCi0JCSAgIG91dHB1dF9iZmQsCi0JCSAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBVTl9JTVBMKCJTRUNUSU9OIik7Ci0gIERVTVBfUkVMT0MoIlNFQ1RJT04iLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfaW1nbHVlX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgVU5fSU1QTCgiSU1HTFVFIik7Ci0gIERVTVBfUkVMT0MoIklNR0xVRSIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLQotI2RlZmluZSBNQVhfUkVMT0NfSU5ERVggIFwKLSAgICAgIChzaXplb2YocHBjX2NvZmZfaG93dG9fdGFibGUpIC8gc2l6ZW9mKHBwY19jb2ZmX2hvd3RvX3RhYmxlWzBdKSAtIDEpCi0KLQotLyogRklYTUU6IFRoZXJlIGlzIGEgcG9zc2libGl0eSB0aGF0IHdoZW4gd2UgcmVhZCBpbiBhIHJlbG9jIGZyb20gYSBmaWxlLAotICAgICAgICAgIHRoYXQgdGhlcmUgYXJlIHNvbWUgYml0cyBlbmNvZGVkIGluIHRoZSB1cHBlciBwb3J0aW9uIG9mIHRoZSAKLQkgIHR5cGUgZmllbGQuIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0qLwotc3RhdGljIHZvaWQgcHBjX2NvZmZfcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqcmVsZW50LAotCQkJCQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWwpKTsKLQotc3RhdGljIHZvaWQKLXBwY19jb2ZmX3J0eXBlMmhvd3RvIChyZWxlbnQsIGludGVybmFsKQotICAgICBhcmVsZW50ICpyZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWw7Ci17ICAKLQotICAvKiBXZSBjYW4gZW5jb2RlIG9uZSBvZiB0aHJlZSB0aGluZ3MgaW4gdGhlIHR5cGUgZmllbGQsIGFzaWRlIGZyb20gdGhlCi0gICAgIHR5cGU6Ci0gICAgIDEuIElNQUdFX1JFTF9QUENfTkVHIC0gaW5kaWNhdGVzIHRoZSB2YWx1ZSBmaWVsZCBpcyBhIHN1YnRyYWN0aW9uCi0gICAgICAgIHZhbHVlLCByYXRoZXIgdGhhbiBhbiBhZGRpdGlvbiB2YWx1ZQotICAgICAyLiBJTUFHRV9SRUxfUFBDX0JSVEFLRU4sIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gLSBpbmRpY2F0ZXMgdGhhdAotICAgICAgICB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlIHRha2VuIG9yIG5vdC4KLSAgICAgMy4gSU1BR0VfUkVMX1BQQ19UT0NERUZOIC0gdG9jIHNsb3QgZGVmaW5pdGlvbiBpbiB0aGUgZmlsZQotICAgICBGb3Igbm93LCB3ZSBqdXN0IHN0cmlwIHRoaXMgc3R1ZmYgdG8gZmluZCB0aGUgdHlwZSwgYW5kIGlnbm9yZSBpdCBvdGhlcgotICAgICB0aGFuIHRoYXQuCi0gICovCi0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGUgID0gRVhUUkFDVF9UWVBFIChpbnRlcm5hbC0+cl90eXBlKTsKLSAgdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MoaW50ZXJuYWwtPnJfdHlwZSk7Ci0gIHVuc2lnbmVkIHNob3J0IGp1bmsgICAgPSBFWFRSQUNUX0pVTksgKGludGVybmFsLT5yX3R5cGUpOwotCi0gIC8qIHRoZSBtYXNraW5nIHByb2Nlc3Mgb25seSBzbGljZXMgb2ZmIHRoZSBib3R0b20gYnl0ZSBmb3Igcl90eXBlLiAqLwotICBpZiAoIHJfdHlwZSA+IE1BWF9SRUxPQ19JTkRFWCApIAotICAgIGFib3J0KCk7Ci0KLSAgLyogY2hlY2sgZm9yIGFic29sdXRlIGNyYXAgKi8KLSAgaWYgKCBqdW5rICE9IDAgKQotICAgIGFib3J0KCk7Ci0KLSAgc3dpdGNoKHJfdHlwZSkgCi0gICAgewotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1JFTDI0OgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzJOQjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDVElPTjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDUkVMOgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCBpbnRlcm5hbCk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgaW50ZXJuYWwpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgaW50ZXJuYWwpOwotICAgICAgaWYgKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pCi0JaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTjsKLSAgICAgIGVsc2UKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgCi0JICAgICAgXygiV2FybmluZzogVW5zdXBwb3J0ZWQgcmVsb2MgJXMgWyVkXSB1c2VkIC0tIGl0IG1heSBub3Qgd29yay5cbiIpLAotCSAgICAgIHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwKLQkgICAgICByX3R5cGUpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsgICAgICAKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIHJlbGVudC0+aG93dG8gPSBob3d0bzsKLSAgCi19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgLyogV2UgY2FuIGVuY29kZSBvbmUgb2YgdGhyZWUgdGhpbmdzIGluIHRoZSB0eXBlIGZpZWxkLCBhc2lkZSBmcm9tIHRoZQotICAgICB0eXBlOgotICAgICAxLiBJTUFHRV9SRUxfUFBDX05FRyAtIGluZGljYXRlcyB0aGUgdmFsdWUgZmllbGQgaXMgYSBzdWJ0cmFjdGlvbgotICAgICAgICB2YWx1ZSwgcmF0aGVyIHRoYW4gYW4gYWRkaXRpb24gdmFsdWUKLSAgICAgMi4gSU1BR0VfUkVMX1BQQ19CUlRBS0VOLCBJTUFHRV9SRUxfUFBDX0JSTlRBS0VOIC0gaW5kaWNhdGVzIHRoYXQKLSAgICAgICAgdGhlIGJyYW5jaCBpcyBleHBlY3RlZCB0byBiZSB0YWtlbiBvciBub3QuCi0gICAgIDMuIElNQUdFX1JFTF9QUENfVE9DREVGTiAtIHRvYyBzbG90IGRlZmluaXRpb24gaW4gdGhlIGZpbGUKLSAgICAgRm9yIG5vdywgd2UganVzdCBzdHJpcCB0aGlzIHN0dWZmIHRvIGZpbmQgdGhlIHR5cGUsIGFuZCBpZ25vcmUgaXQgb3RoZXIKLSAgICAgdGhhbiB0aGF0LgotICAqLwotCi0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLSAgdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MocmVsLT5yX3R5cGUpOwotICB1bnNpZ25lZCBzaG9ydCBqdW5rICAgID0gRVhUUkFDVF9KVU5LIChyZWwtPnJfdHlwZSk7Ci0KLSAgLyogdGhlIG1hc2tpbmcgcHJvY2VzcyBvbmx5IHNsaWNlcyBvZmYgdGhlIGJvdHRvbSBieXRlIGZvciByX3R5cGUuICovCi0gIGlmICggcl90eXBlID4gTUFYX1JFTE9DX0lOREVYICkgCi0gICAgYWJvcnQoKTsKLSAgCi0gIC8qIGNoZWNrIGZvciBhYnNvbHV0ZSBjcmFwICovCi0gIGlmICgganVuayAhPSAwICkKLSAgICBhYm9ydCgpOwotICAgIAotICBzd2l0Y2gocl90eXBlKSAKLSAgICB7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5COgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOwotICAgICAgKmFkZGVuZHAgLT0gcGVfZGF0YShzZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2OgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOwotICAgICAgaWYgKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pCi0JaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTjsKLSAgICAgIGVsc2UKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1JFTDI0OgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNUSU9OOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNSRUw6Ci0gICAgICBEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgcmVsKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsIAotCSAgICAgIF8oIldhcm5pbmc6IFVuc3VwcG9ydGVkIHJlbG9jICVzIFslZF0gdXNlZCAtLSBpdCBtYXkgbm90IHdvcmsuXG4iKSwKLQkgICAgICBwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsCi0JICAgICAgcl90eXBlKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gaG93dG87Ci19Ci0KLQotLyogYSBjaGVlc3kgbGl0dGxlIG1hY3JvIHRvIG1ha2UgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSByZWFkYWJsZSAqLwotI2RlZmluZSBIT1cyTUFQKGJmZF9ydHlwZSxwcGNfcnR5cGUpICBcCi0gY2FzZSBiZmRfcnR5cGU6IHJldHVybiAmcHBjX2NvZmZfaG93dG9fdGFibGVbcHBjX3J0eXBlXQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLVBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotcHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DXzMyX0dPVE9GRiwgICAgSU1BR0VfUkVMX1BQQ19JTUdMVUUpOwotICAgICAgSE9XMk1BUChCRkRfUkVMT0NfMTZfR09UX1BDUkVMLCBJTUFHRV9SRUxfUFBDX0lGR0xVRSk7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18xNiwgICAgICAgICAgIElNQUdFX1JFTF9QUENfQUREUjE2KTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1BQQ19CMjYsICAgICAgSU1BR0VfUkVMX1BQQ19SRUwyNCk7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ19QUENfQkEyNiwgICAgIElNQUdFX1JFTF9QUENfQUREUjI0KTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1BQQ19UT0MxNiwgICAgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18xNl9HT1RPRkYsICAgIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18zMiwgICAgICAgICAgIElNQUdFX1JFTF9QUENfQUREUjMyKTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1JWQSwgICAgICAgICAgSU1BR0VfUkVMX1BQQ19BRERSMzJOQik7Ci0gICAgZGVmYXVsdDogCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLSN1bmRlZiBIT1cyTUFQCi0KLQwKLS8qIFRhaWxvciBjb2ZmY29kZS5oIC0tIG1hY3JvIGhlYXZlbi4gKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgIHBwY19jb2ZmX3J0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYyB2b2lkIHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2sgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0jZW5kaWYKLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIsIHdpdGggb3VyIG93biBzcGVjaWFsIHRvdWNoLiAgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCAgIHBwY19jb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gICAgICAgICAgY29mZl9wcGNfcnR5cGVfdG9faG93dG8KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uICAgICAgICBjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2ZpbmFsX2xpbmsgICAgICAgICAgcHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmsgCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0vKiBGSVhNRTogVGhpcyBubyBsb25nZXIgd29ya3MuICAqLwotI2RlZmluZSBjb2ZmX3N3YXBfc3ltX2luX2hvb2sgICAgICAgIHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2sKLSNlbmRpZgotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyhpbnRlcm5hbCwgaG93dG8pIHtpbnRlcm5hbC5yX3R5cGU9aG93dG8tPnR5cGU7fQotCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKLQotLyogRklYTUU6IFRoaXMgY29udHJvbHMgc29tZSBjb2RlIHRoYXQgdXNlZCB0byBiZSBpbiBwZWljb2RlLmggYW5kIGlzCi0gICBub3cgaW4gcGVpZ2VuLmMuICBJdCB3aWxsIG5vdCBjb250cm9sIHRoZSBjb2RlIGluIHBlaWdlbi5jLiAgSWYKLSAgIGFueWJvZHkgd2FudHMgdG8gZ2V0IHRoaXMgd29ya2luZywgeW91IHdpbGwgbmVlZCB0byBmaXggdGhhdC4gICovCi0jZGVmaW5lIFBPV0VSUENfTEVfUEUKLQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fQUxJR05NRU5UX0VOVFJJRVMgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5pZGF0YSQyIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAwIH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuaWRhdGEkMyIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMCB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLmlkYXRhJDQiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5pZGF0YSQ1IiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAyIH0sIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuaWRhdGEkNiIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMSB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLnJlbG9jIiksIFwKLSAgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCAxIH0KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLQwKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLS8qIEZJWE1FOgotICAgV2hhdCB3ZSdyZSB0cnlpbmcgdG8gZG8gaGVyZSBpcyBhbGxvY2F0ZSBhIHRvYyBzZWN0aW9uIChlYXJseSksIGFuZCBhdHRhY2ggCi0gICBpdCB0byB0aGUgbGFzdCBiZmQgdG8gYmUgcHJvY2Vzc2VkLiBUaGlzIGF2b2lkcyB0aGUgcHJvYmxlbSBvZiBoYXZpbmcgYSB0b2MKLSAgIHdyaXR0ZW4gb3V0IGJlZm9yZSBhbGwgZmlsZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gVGhpcyBjb2RlIGFsbG9jYXRlcwotICAgYSB0b2Mgc2VjdGlvbiBmb3IgZXZlcnkgZmlsZSwgYW5kIHJlY29yZHMgdGhlIGxhc3Qgb25lIHNlZW4uIFRoZXJlIGFyZQotICAgYXQgbGVhc3QgdHdvIHByb2JsZW1zIHdpdGggdGhpcyBhcHByb2FjaDoKLSAgIDEuIFdlIGFsbG9jYXRlIHdob2xlIGJ1bmNoZXMgb2YgdG9jIHNlY3Rpb25zIHRoYXQgYXJlIGlnbm9yZWQsIGJ1dCBhdAotICAgICAgYXQgbGVhc3Qgd2Ugd2lsbCBub3QgYWxsb2NhdGUgYSB0b2MgaWYgbm8gLnRvYyBpcyBwcmVzZW50LgotICAgMi4gSXQncyBub3QgY2xlYXIgdG8gbWUgdGhhdCBiZWluZyB0aGUgbGFzdCBiZmQgcmVhZCBuZWNlc3NhcmlseSBtZWFucwotICAgICAgdGhhdCB5b3UgYXJlIHRoZSBsYXN0IGJmZCBjbG9zZWQuCi0gICAzLiBEb2luZyBpdCBvbiBhICJzd2FwIGluIiBob29rIGRlcGVuZHMgb24gd2hlbiB0aGUgInN3YXAgaW4iIGlzIGNhbGxlZCwKLSAgICAgIGFuZCBob3cgb2Z0ZW4sIGV0Yy4gSXQncyBub3QgY2xlYXIgdG8gbWUgdGhhdCB0aGVyZSBpc24ndCBhIGhvbGUgaGVyZS4KLSovCi0KLXN0YXRpYyB2b2lkCi1wcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgZXh0MSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW4xOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbjE7Ci0KLSAgaWYgKGJmZF9vZl90b2Nfb3duZXIgIT0gMCkgLyogd2UgYWxyZWFkeSBoYXZlIGEgdG9jLCBzbyBnbyBob21lICovCi0gICAgcmV0dXJuOwotCi0gIGlmIChzdHJjbXAoaW4tPl9uLl9uX25hbWUsICIudG9jIikgPT0gMCkKLSAgICB7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKCBhYmZkICwgVE9DX1NFQ1RJT05fTkFNRSk7Ci0gICAgICBpZiAocyAhPSBOVUxMKSAKLQl7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgOwotCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgVE9DX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXsKLQkgIC8qIEZJWE1FOiBzZXQgYXBwcm9wcmlhdGUgYmZkIGVycm9yICovCi0JICBhYm9ydCgpOwotCX0KLQotICAgICAgLyogc2F2ZSB0aGUgYmZkIGZvciBsYXRlciBhbGxvY2F0aW9uICovCi0gICAgICBiZmRfb2ZfdG9jX293bmVyID0gYWJmZDsKLSAgICB9Ci0KLSAgcmV0dXJuOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLXN0YXRpYyBib29sZWFuIHBwY19kb19sYXN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkICpwcGNfZ2V0X2xhc3QgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2RvX2xhc3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQgPT0gYmZkX29mX3RvY19vd25lcikKLSAgICByZXR1cm4gdHJ1ZTsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJmZCAqCi1wcGNfZ2V0X2xhc3QoKQotewotICByZXR1cm4gYmZkX29mX3RvY19vd25lcjsKLX0KLQotLyogdGhpcyBwaWVjZSBvZiBtYWNoaW5lcnkgZXhpc3RzIG9ubHkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGJmZCB0aGF0IGhvbGRzCi0gICB0aGUgdG9jIHNlY3Rpb24gaXMgd3JpdHRlbiBsYXN0LiAKLQotICAgVGhpcyBkb2VzIGRlcGVuZCBvbiBiZmRfbWFrZV9zZWN0aW9uIGF0dGFjaGluZyBhIG5ldyBzZWN0aW9uIHRvIHRoZQotICAgZW5kIG9mIHRoZSBzZWN0aW9uIGxpc3QgZm9yIHRoZSBiZmQuIAotCi0gICBUaGlzIGlzIG90aGVyd2lzZSBpbnRlbmRlZCB0byBiZSBmdW5jdGlvbmFsbHkgdGhlIHNhbWUgYXMgCi0gICBjb2ZmbGluay5jOl9iZmRfY29mZl9maW5hbF9saW5rKCkuIEl0IGlzIHNwZWNpZmljYWxseSBkaWZmZXJlbnQgb25seSAKLSAgIHdoZXJlIHRoZSBQT1dFUlBDX0xFX1BFIG1hY3JvIG1vZGlmaWVzIHRoZSBjb2RlLiBJdCBpcyBsZWZ0IGluIGFzIGEgCi0gICBwcmVjaXNlIGZvcm0gb2YgY29tbWVudC4ga3JrQGN5Z251cy5jb20KLSovCi0KLQotLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLWJvb2xlYW4KLXBwY19iZmRfY29mZl9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvIGZpbmZvOwotICBib29sZWFuIGRlYnVnX21lcmdlX2FsbG9jYXRlZDsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgc2l6ZV90IG1heF9zeW1fY291bnQ7Ci0gIHNpemVfdCBtYXhfbGluZW5vX2NvdW50OwotICBzaXplX3QgbWF4X3JlbG9jX2NvdW50OwotICBzaXplX3QgbWF4X291dHB1dF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLSAgdW5zaWduZWQgaW50IHJlbHN6OwotICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCBsaW5lc3o7Ci0gIGJmZCAqc3ViOwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgY2hhciBzdHJidWZbU1RSSU5HX1NJWkVfU0laRV07Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN0cnRhYiA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gIGZpbmZvLmxhc3RfZmlsZV9pbmRleCA9IC0xOwotICBmaW5mby5sYXN0X2JmX2luZGV4ID0gLTE7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5zZWNfcHRycyA9IE5VTEw7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgZmluZm8ub3V0c3ltcyA9IE5VTEw7Ci0gIGZpbmZvLmxpbmVub3MgPSBOVUxMOwotICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mbyA9IGluZm87Ci0KLSAgZmluZm8uc3RydGFiID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKGZpbmZvLnN0cnRhYiA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0ICgmZmluZm8uZGVidWdfbWVyZ2UpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSB0cnVlOwotCi0gIC8qIENvbXB1dGUgdGhlIGZpbGUgcG9zaXRpb25zIGZvciBhbGwgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ291bnQgdGhlIGxpbmUgbnVtYmVycyBhbmQgcmVsb2NhdGlvbiBlbnRyaWVzIHJlcXVpcmVkIGZvciB0aGUKLSAgICAgb3V0cHV0IGZpbGUuICBTZXQgdGhlIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgcmVsb2NzLiAgKi8KLSAgcmVsX2ZpbGVwb3MgPSBvYmpfcmVsb2NiYXNlIChhYmZkKTsKLSAgcmVsc3ogPSBiZmRfY29mZl9yZWxzeiAoYWJmZCk7Ci0gIG1heF9jb250ZW50c19zaXplID0gMDsKLSAgbWF4X2xpbmVub19jb3VudCA9IDA7Ci0gIG1heF9yZWxvY19jb3VudCA9IDA7Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0KLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0JCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkJby0+bGluZW5vX2NvdW50ICs9IHNlYy0+bGluZW5vX2NvdW50OwotCi0JICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJby0+cmVsb2NfY291bnQgKz0gc2VjLT5yZWxvY19jb3VudDsKLQotCSAgICAgIGlmIChzZWMtPl9yYXdfc2l6ZSA+IG1heF9jb250ZW50c19zaXplKQotCQltYXhfY29udGVudHNfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgICAgIGlmIChzZWMtPmxpbmVub19jb3VudCA+IG1heF9saW5lbm9fY291bnQpCi0JCW1heF9saW5lbm9fY291bnQgPSBzZWMtPmxpbmVub19jb3VudDsKLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9yZWxvY19jb3VudCkKLQkJbWF4X3JlbG9jX2NvdW50ID0gc2VjLT5yZWxvY19jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgICYmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKSkKLQkgICAgKytvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQlvLT5yZWxfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgby0+cmVsX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLQkgIHJlbF9maWxlcG9zICs9IG8tPnJlbG9jX2NvdW50ICogcmVsc3o7Ci0JfQotICAgIH0KLQotICAvKiBJZiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHBvaW50ZXJzIHdlCi0gICAgIG5lZWQgdG8ga2VlcC4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIC8qIFdlIHVzZSBzZWN0aW9uX2NvdW50ICsgMSwgcmF0aGVyIHRoYW4gc2VjdGlvbl9jb3VudCwgYmVjYXVzZQotICAgICAgICAgdGhlIHRhcmdldF9pbmRleCBmaWVsZHMgYXJlIDEgYmFzZWQuICAqLwotICAgICAgZmluZm8uc2VjdGlvbl9pbmZvID0KLQkoKHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICopCi0JIGJmZF9tYWxsb2MgKChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSkKLQkJICAgICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8pKSk7Ci0gICAgICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBmb3IgKGkgPSAwOyBpIDw9IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzID0gTlVMTDsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBzaXplIG9mIHRoZSByZWxvY3MsIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbGUKLSAgICAgcG9zaXRpb25zIG9mIHRoZSBsaW5lIG51bWJlcnMuICAqLwotICBsaW5lX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLSAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IDA7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMCkKLQlvLT5saW5lX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG8tPmxpbmVfZmlsZXBvcyA9IGxpbmVfZmlsZXBvczsKLQkgIGxpbmVfZmlsZXBvcyArPSBvLT5saW5lbm9fY291bnQgKiBsaW5lc3o7Ci0JfQotCi0gICAgICBpZiAoby0+cmVsb2NfY291bnQgIT0gMCkKLQl7Ci0JICAvKiBXZSBkb24ndCBrbm93IHRoZSBpbmRpY2VzIG9mIGdsb2JhbCBzeW1ib2xzIHVudGlsIHdlIGhhdmUKLSAgICAgICAgICAgICB3cml0dGVuIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGb3IgZWFjaCBzZWN0aW9uIGluCi0gICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlLCB3ZSBrZWVwIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhhc2gKLSAgICAgICAgICAgICB0YWJsZSBlbnRyaWVzLiAgRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYQotICAgICAgICAgICAgIHJlbG9jLiAgV2hlbiB3ZSBmaW5kIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIHdlCi0gICAgICAgICAgICAgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4KLSAgICAgICAgICAgICBmaXggdXAgdGhlIHN5bWJvbCBpbmRleCBhZnRlciB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUKLSAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLgotCi0JICAgICBCZWNhdXNlIG9mIHRoaXMgcHJvYmxlbSwgd2UgYWxzbyBrZWVwIHRoZSByZWxvY3MgaW4KLQkgICAgIG1lbW9yeSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5rLiAgVGhpcyB3YXN0ZXMgbWVtb3J5LAotCSAgICAgYnV0IG9ubHkgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGljaCBpcyBub3QgdGhlCi0JICAgICBjb21tb24gY2FzZS4gICovCi0JICBCRkRfQVNTRVJUIChpbmZvLT5yZWxvY2F0ZWFibGUpOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzID0KLQkgICAgKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzID0KLQkgICAgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudAotCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPT0gTlVMTAotCSAgICAgIHx8IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvLT5yZWxvY19jb3VudCA+IG1heF9vdXRwdXRfcmVsb2NfY291bnQpCi0JICAgIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSBvLT5yZWxvY19jb3VudDsKLQl9Ci0KLSAgICAgIC8qIFJlc2V0IHRoZSByZWxvYyBhbmQgbGluZW5vIGNvdW50cywgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gdG8KLQkgY291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIHdlIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCi0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotICAgIH0KLQotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gbGluZV9maWxlcG9zOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYW4gaW5wdXQgQkZELiAgVGFrZQotICAgICB0aGUgb3Bwb3J0dW5pdHkgdG8gY2xlYXIgdGhlIG91dHB1dF9oYXNfYmVndW4gZmllbGRzIG9mIGFsbCB0aGUKLSAgICAgaW5wdXQgQkZEJ3MuICAqLwotICBtYXhfc3ltX2NvdW50ID0gMDsKLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgc2l6ZV90IHN6OwotCi0gICAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLSAgICAgIHN6ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKHN1Yik7Ci0gICAgICBpZiAoc3ogPiBtYXhfc3ltX2NvdW50KQotCW1heF9zeW1fY291bnQgPSBzejsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc29tZSBidWZmZXJzIHVzZWQgd2hpbGUgbGlua2luZy4gICovCi0gIGZpbmZvLmludGVybmFsX3N5bXMgPSAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3N5bWVudCkpKTsKLSAgZmluZm8uc2VjX3B0cnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkJICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBmaW5mby5zeW1faW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKLSAgZmluZm8ub3V0c3ltcyA9ICgoYmZkX2J5dGUgKikKLQkJICAgYmZkX21hbGxvYyAoKHNpemVfdCkgKChtYXhfc3ltX2NvdW50ICsgMSkgKiBzeW1lc3opKSk7Ci0gIGZpbmZvLmxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2xpbmVub19jb3VudAotCQkJCSAgICAgICAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkpOwotICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQgKiByZWxzeik7Ci0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQotCQkJICAgICBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQKLQkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0gIGlmICgoZmluZm8uaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLnNlY19wdHJzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uc3ltX2luZGljZXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IGZpbmZvLm91dHN5bXMgPT0gTlVMTAotICAgICAgfHwgKGZpbmZvLmxpbmVub3MgPT0gTlVMTCAmJiBtYXhfbGluZW5vX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplID4gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfcmVsb2NfY291bnQgPiAwKQotICAgICAgfHwgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JICAmJiBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPT0gTlVMTAotCSAgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2Ugbm93IGtub3cgdGhlIHBvc2l0aW9uIG9mIGV2ZXJ5dGhpbmcgaW4gdGhlIGZpbGUsIGV4Y2VwdCB0aGF0Ci0gICAgIHdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlcmVmb3JlIHdlIGRvbid0Ci0gICAgIGtub3cgd2hlcmUgdGhlIHN0cmluZyB0YWJsZSBzdGFydHMuICBXZSBqdXN0IGJ1aWxkIHRoZSBzdHJpbmcKLSAgICAgdGFibGUgaW4gbWVtb3J5IGFzIHdlIGdvIGFsb25nLiAgV2UgcHJvY2VzcyBhbGwgdGhlIHJlbG9jYXRpb25zCi0gICAgIGZvciBhIHNpbmdsZSBpbnB1dCBmaWxlIGF0IG9uY2UuICAqLwotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPSAwOwotCi0gIGlmIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKSkKLQkgICAgewotCSAgICAgIHN1YiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0jaWZkZWYgUE9XRVJQQ19MRV9QRQotCSAgICAgIGlmICghIHN1Yi0+b3V0cHV0X2hhc19iZWd1biAmJiAhcHBjX2RvX2xhc3Qoc3ViKSkKLSNlbHNlCi0JICAgICAgaWYgKCEgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuKQotI2VuZGlmCi0JCXsKLQkJICBpZiAoISBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsICZmaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgewotICAgIGJmZCogbGFzdF9vbmUgPSBwcGNfZ2V0X2xhc3QoKTsKLSAgICBpZiAobGFzdF9vbmUpCi0gICAgICB7Ci0JaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkICgmZmluZm8sIGxhc3Rfb25lKSkKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgfQotICAgIGxhc3Rfb25lLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgfQotI2VuZGlmCi0KLSAgLyogRnJlZSB1cCB0aGUgYnVmZmVycyB1c2VkIGJ5IF9iZmRfY29mZl9saW5rX2lucHV0X2JmZC4gICovCi0KLSAgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUgKCZmaW5mby5kZWJ1Z19tZXJnZSk7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zZWNfcHRycyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnNlY19wdHJzKTsKLSAgICAgIGZpbmZvLnNlY19wdHJzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zeW1faW5kaWNlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnN5bV9pbmRpY2VzKTsKLSAgICAgIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gICAgICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgICAgIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHN5bWJvbAotICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sLiAgV3JpdGUgaXQgb3V0IGFnYWluIGlmCi0gICAgIG5lY2Vzc2FyeS4gICovCi0gIGlmIChmaW5mby5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLSAgICAgICYmICh1bnNpZ25lZCBpbnQpIGZpbmZvLmxhc3RfZmlsZS5uX3ZhbHVlICE9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmZpbmZvLmxhc3RfZmlsZSwKLQkJCSAgICAgKFBUUikgZmluZm8ub3V0c3ltcyk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgZmluZm8ubGFzdF9maWxlX2luZGV4ICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGZpbmZvLm91dHN5bXMsIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0gIGZpbmZvLmZhaWxlZCA9IGZhbHNlOwotICBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0sCi0JCQkgICAoUFRSKSAmZmluZm8pOwotICBpZiAoZmluZm8uZmFpbGVkKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBvdXRzeW1zIGJ1ZmZlciBpcyB1c2VkIGJ5IF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltLiAgKi8KLSAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKLSAgICAgIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scywgd2Uga25vdwotCSB0aGUgc3ltYm9sIGluZGljZXMgdG8gdXNlIGZvciByZWxvY3MgYWdhaW5zdCB0aGVtLCBhbmQgd2UgY2FuCi0JIGZpbmFsbHkgd3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gKChiZmRfYnl0ZSAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9vdXRwdXRfcmVsb2NfY291bnQgKiByZWxzeikpOwotICAgICAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLQkgIGJmZF9ieXRlICplcmVsOwotCi0JICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlyZWwgPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotCSAgcmVsX2hhc2ggPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzOwotCSAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKLQkgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQotCSAgICB7Ci0JICAgICAgaWYgKCpyZWxfaGFzaCAhPSBOVUxMKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoKCpyZWxfaGFzaCktPmluZHggPj0gMCk7Ci0JCSAgaXJlbC0+cl9zeW1uZHggPSAoKnJlbF9oYXNoKS0+aW5keDsKLQkJfQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAoUFRSKSBpcmVsLCAoUFRSKSBlcmVsKTsKLQkgICAgfQotCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgby0+cmVsb2NfY291bnQsCi0JCQkgICAgYWJmZCkgIT0gcmVsc3ogKiBvLT5yZWxvY19jb3VudCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogRnJlZSB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgb3B0aW1pemVkIHN0YWJzIHN0cmluZ3MsIG91dHB1dCB0aGVtLiAgKi8KLSAgaWYgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIChhYmZkLCAmY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaWYgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSAgICAgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3opLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsCi0JCSAgICBfYmZkX3N0cmluZ3RhYl9zaXplIChmaW5mby5zdHJ0YWIpICsgU1RSSU5HX1NJWkVfU0laRSwKLQkJICAgIChiZmRfYnl0ZSAqKSBzdHJidWYpOwotI2Vsc2UKLSAjZXJyb3IgQ2hhbmdlIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLSAgICAgIGlmIChiZmRfd3JpdGUgKHN0cmJ1ZiwgMSwgU1RSSU5HX1NJWkVfU0laRSwgYWJmZCkgIT0gU1RSSU5HX1NJWkVfU0laRSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGZpbmZvLnN0cnRhYikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zdHJ0YWIpOwotCi0gIC8qIFNldHRpbmcgYmZkX2dldF9zeW1jb3VudCB0byAwIHdpbGwgY2F1c2Ugd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHRvCi0gICAgIG5vdCB0cnkgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZGVidWdfbWVyZ2VfYWxsb2NhdGVkKQotICAgIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlICgmZmluZm8uZGVidWdfbWVyZ2UpOwotICBpZiAoZmluZm8uc3RydGFiICE9IE5VTEwpCi0gICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzKTsKLQl9Ci0gICAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm8pOwotICAgIH0KLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLnNlY19wdHJzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc2VjX3B0cnMpOwotICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7Ci0gIGlmIChmaW5mby5vdXRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ub3V0c3ltcyk7Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0MCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHVzZSBieSBhbHRlcm5hdGl2ZV90YXJnZXQgZmllbGQuICAqLwotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfQklHX1NZTTsKLSNlbmRpZgotCi0vKiBUaGUgdHJhbnNmZXIgdmVjdG9ycyB0aGF0IGxlYWQgdGhlIG91dHNpZGUgd29ybGQgdG8gYWxsIG9mIHRoZSBhYm92ZS4gKi8KLQotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi1jb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9MSVRUTEVfU1lNID0KLXsKLSAgVEFSR0VUX0xJVFRMRV9OQU1FLAkJLyogbmFtZSBvciBjb2ZmLWFybS1saXR0bGUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogRklYTUU6IG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIAotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNlbHNlCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotICAKLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIC8qIF9iZmRfZHVtbXlfdGFyZ2V0ICovIGNvZmZfb2JqZWN0X3AgfSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0gIAotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIC8qIEFsdGVybmF0aXZlX3RhcmdldC4gICovCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLSAgJiBUQVJHRVRfQklHX1NZTSwKLSNlbHNlCi0gIE5VTEwsCi0jZW5kaWYKLSAgCi0gIENPRkZfU1dBUF9UQUJMRQotfTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0JJR19TWU0gPQotewotICBUQVJHRVRfQklHX05BTUUsCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAkKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBGSVhNRTogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNlbHNlCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCAvKiBfYmZkX2R1bW15X3RhcmdldCAqLyBjb2ZmX29iamVjdF9wIH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLQotICAvKiBBbHRlcm5hdGl2ZV90YXJnZXQuICAqLwotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0gICYgVEFSR0VUX0xJVFRMRV9TWU0sCi0jZWxzZQotICBOVUxMLAotI2VuZGlmCi0gIAotICBDT0ZGX1NXQVBfVEFCTEUKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtcnM2MDAwLmMgYi9iZmQvY29mZi1yczYwMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyMzAwMC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1yczYwMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MjEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJQk0gUlMvNjAwMCAiWENPRkYiIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KLSAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCi0gICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKLSAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCi0gICBXcml0dGVuIGJ5IE1ldGluIEcuIE96aXNpaywgTWltaSBQaFwzNzNcMzY0bmctVGhcMzQ1byBWXDM2NSwgCi0gICAgIGFuZCBKb2huIEdpbG1vcmUuCi0gICBBcmNoaXZlIHN1cHBvcnQgZnJvbSBEYW1vbiBBLiBQZXJtZXplbC4KLSAgIENvbnRyaWJ1dGVkIGJ5IElCTSBDb3Jwb3JhdGlvbiBhbmQgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogSW50ZXJuYWxjb2ZmLmggYW5kIGNvZmZjb2RlLmggbW9kaWZ5IHRoZW1zZWx2ZXMgYmFzZWQgb24gdGhpcyBmbGFnLiAgKi8KLSNkZWZpbmUgUlM2MDAwQ09GRl9DIDEKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3JzNjAwMC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhlIG1haW4gYm9keSBvZiBjb2RlIGlzIGluIGNvZmZjb2RlLmguICAqLwotCi1zdGF0aWMgYm9vbGVhbiB4Y29mZl9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9ydHlwZTJob3d0bwotICBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqeGNvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp4Y29mZl9hcmNoaXZlX3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBQVFIgeGNvZmZfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmQgKnhjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBpbnQgeGNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqbm9ybWFsaXplX2ZpbGVuYW1lIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl93cml0ZV9hcm1hcAotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IF9iZmRfeGNvZmZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQwKLS8qIFdlIHVzZSBvdXIgb3duIHRkYXRhIHR5cGUuICBJdHMgZmlyc3QgZmllbGQgaXMgdGhlIENPRkYgdGRhdGEgdHlwZSwKLSAgIHNvIHRoZSBDT0ZGIHJvdXRpbmVzIGFyZSBjb21wYXRpYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvZmZfZGF0YV90eXBlICpjb2ZmOwotCi0gIGFiZmQtPnRkYXRhLnhjb2ZmX29ial9kYXRhID0KLSAgICAoKHN0cnVjdCB4Y29mZl90ZGF0YSAqKQotICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl90ZGF0YSkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLnhjb2ZmX29ial9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb2ZmID0gY29mZl9kYXRhIChhYmZkKTsKLSAgY29mZi0+c3ltYm9scyA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gIGNvZmYtPmNvbnZlcnNpb25fdGFibGUgPSAodW5zaWduZWQgaW50ICopIE5VTEw7Ci0gIGNvZmYtPnJhd19zeW1lbnRzID0gKHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKikgTlVMTDsKLSAgY29mZi0+cmVsb2NiYXNlID0gMDsKLQotICB4Y29mZl9kYXRhIChhYmZkKS0+bW9kdHlwZSA9ICgnMScgPDwgOCkgfCAnTCc7Ci0KLSAgLyogV2Ugc2V0IGNwdXR5cGUgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCBpdCBoYXMgbm90IGJlZW4KLSAgICAgaW5pdGlhbGl6ZWQuICAqLwotICB4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSA9IC0xOwotCi0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5jc2VjdHMgPSBOVUxMOwotICB4Y29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5kaWNlcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgWENPRkYgZGF0YSBmcm9tIG9uZSBCRkQgdG8gYW5vdGhlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKml4LCAqb3g7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgaWYgKGliZmQtPnh2ZWMgIT0gb2JmZC0+eHZlYykKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaXggPSB4Y29mZl9kYXRhIChpYmZkKTsKLSAgb3ggPSB4Y29mZl9kYXRhIChvYmZkKTsKLSAgb3gtPmZ1bGxfYW91dGhkciA9IGl4LT5mdWxsX2FvdXRoZHI7Ci0gIG94LT50b2MgPSBpeC0+dG9jOwotICBpZiAoaXgtPnNudG9jID09IDApCi0gICAgb3gtPnNudG9jID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoaWJmZCwgaXgtPnNudG9jKTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQlveC0+c250b2MgPSAwOwotICAgICAgZWxzZQotCW94LT5zbnRvYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0gIGlmIChpeC0+c25lbnRyeSA9PSAwKQotICAgIG94LT5zbmVudHJ5ID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoaWJmZCwgaXgtPnNuZW50cnkpOwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCW94LT5zbmVudHJ5ID0gMDsKLSAgICAgIGVsc2UKLQlveC0+c25lbnRyeSA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0gIG94LT50ZXh0X2FsaWduX3Bvd2VyID0gaXgtPnRleHRfYWxpZ25fcG93ZXI7Ci0gIG94LT5kYXRhX2FsaWduX3Bvd2VyID0gaXgtPmRhdGFfYWxpZ25fcG93ZXI7Ci0gIG94LT5tb2R0eXBlID0gaXgtPm1vZHR5cGU7Ci0gIG94LT5jcHV0eXBlID0gaXgtPmNwdXR5cGU7Ci0gIG94LT5tYXhkYXRhID0gaXgtPm1heGRhdGE7Ci0gIG94LT5tYXhzdGFjayA9IGl4LT5tYXhzdGFjazsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEkgZG9uJ3QgdGhpbmsgWENPRkYgcmVhbGx5IGhhcyBhIG5vdGlvbiBvZiBsb2NhbCBsYWJlbHMgYmFzZWQgb24KLSAgIG5hbWUuICBUaGlzIHdpbGwgbWVhbiB0aGF0IGxkIC1YIGRvZXNuJ3QgYWN0dWFsbHkgc3RyaXAgYW55dGhpbmcuCi0gICBUaGUgQUlYIG5hdGl2ZSBsaW5rZXIgZG9lcyBub3QgaGF2ZSBhIC1YIG9wdGlvbiwgYW5kIGl0IGlnbm9yZXMgdGhlCi0gICAteCBvcHRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogVGhlIFhDT0ZGIHJlbG9jIHRhYmxlLiAgQWN0dWFsbHksIFhDT0ZGIHJlbG9jYXRpb25zIHNwZWNpZnkgdGhlCi0gICBiaXRzaXplIGFuZCB3aGV0aGVyIHRoZXkgYXJlIHNpZ25lZCBvciBub3QsIGFsb25nIHdpdGggYQotICAgY29udmVudGlvbmFsIHR5cGUuICBUaGlzIHRhYmxlIGlzIGZvciB0aGUgdHlwZXMsIHdoaWNoIGFyZSB1c2VkIGZvcgotICAgZGlmZmVyZW50IGFsZ29yaXRobXMgZm9yIHB1dHRpbmcgaW4gdGhlIHJlbG9jLiAgTWFueSBvZiB0aGVzZQotICAgcmVsb2NzIG5lZWQgc3BlY2lhbF9mdW5jdGlvbiBlbnRyaWVzLCB3aGljaCBJIGhhdmUgbm90IHdyaXR0ZW4uICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSB4Y29mZl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbiwgYnV0IHN0b3JlIG5lZ2F0aXZlIHZhbHVlLiAgKi8KLSAgSE9XVE8gKDEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIC0yLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9ORUciLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiAxNiBiaXQgVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVE9DIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhpcyBpcy4gICovCi0gIEhPV1RPICg0LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SVEIiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogRXh0ZXJuYWwgVE9DIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gIEhPV1RPICg1LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9HTCIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIExvY2FsIFRPQyByZWxhdGl2ZSBzeW1ib2wuICAqLwotICBIT1dUTyAoNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVENMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBFTVBUWV9IT1dUTyAoNyksCi0gIAotICAvKiBOb24gbW9kaWZpYWJsZSBhYnNvbHV0ZSBicmFuY2guICAqLwotICBIT1dUTyAoOCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQkEiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBFTVBUWV9IT1dUTyAoOSksCi0KLSAgLyogTm9uIG1vZGlmaWFibGUgcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4YSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQlIiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBFTVBUWV9IT1dUTyAoMHhiKSwKLQotICAvKiBJbmRpcmVjdCBsb2FkLiAgKi8KLSAgSE9XVE8gKDB4YywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkwiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBMb2FkIGFkZHJlc3MuICAqLwotICBIT1dUTyAoMHhkLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9STEEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIEVNUFRZX0hPV1RPICgweGUpLAotICAKLSAgLyogTm9uLXJlbG9jYXRpbmcgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKDB4ZiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVGIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsICAgICAJICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIEVNUFRZX0hPV1RPICgweDEwKSwKLSAgRU1QVFlfSE9XVE8gKDB4MTEpLAotICAKLSAgLyogVE9DIHJlbGF0aXZlIGluZGlyZWN0IGxvYWQuICAqLwotICBIT1dUTyAoMHgxMiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVFJMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBUT0MgcmVsYXRpdmUgbG9hZCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKDB4MTMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RSTEEiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSByZWxhdGl2ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHgxNCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlJUQkkiLCAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYWJzb2x1dGUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4MTUsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JSVEJBIiwgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgYWJzb2x1dGUgaW5kaXJlY3QuICAqLwotICBIT1dUTyAoMHgxNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQ0FJIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxNywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQ1JFTCIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDE4LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SQkEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MTksCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCQUMiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxYSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCUiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxYiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJSQyIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi1zdGF0aWMgdm9pZAoteGNvZmZfcnR5cGUyaG93dG8gKHJlbGVudCwgaW50ZXJuYWwpCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbDsKLXsKLSAgcmVsZW50LT5ob3d0byA9IHhjb2ZmX2hvd3RvX3RhYmxlICsgaW50ZXJuYWwtPnJfdHlwZTsKLQotICAvKiBUaGUgcl9zaXplIGZpZWxkIG9mIGFuIFhDT0ZGIHJlbG9jIGVuY29kZXMgdGhlIGJpdHNpemUgb2YgdGhlCi0gICAgIHJlbG9jYXRpb24sIGFzIHdlbGwgYXMgaW5kaWNhdGluZyB3aGV0aGVyIGl0IGlzIHNpZ25lZCBvciBub3QuCi0gICAgIERvdWJsZWNoZWNrIHRoYXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUKLSAgICAgdHlwZSBtYXRjaGVzIHRoaXMgaW5mb3JtYXRpb24uICAqLwotICBpZiAocmVsZW50LT5ob3d0by0+Yml0c2l6ZSAhPSAoKHVuc2lnbmVkIGludCkgaW50ZXJuYWwtPnJfc2l6ZSAmIDB4MWYpICsgMSkKLSAgICBhYm9ydCAoKTsKLSNpZiAwCi0gIGlmICgoaW50ZXJuYWwtPnJfc2l6ZSAmIDB4ODApICE9IDAKLSAgICAgID8gKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLSAgICAgIDogKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkKSkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi14Y29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CMjY6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzB4YV07Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMjY6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzhdOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoKLSAgICAgIHJldHVybiAmeGNvZmZfaG93dG9fdGFibGVbM107Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIHJldHVybiAmeGNvZmZfaG93dG9fdGFibGVbMF07Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoaW50ZXJuYWwsIGhvd3RvKQkJCQkJXAotICB7CQkJCQkJCQkJXAotICAgIGludGVybmFsLnJfdHlwZSA9IGhvd3RvLT50eXBlOwkJCQkJXAotICAgIGludGVybmFsLnJfc2l6ZSA9CQkJCQkJCVwKLSAgICAgICgoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZAkJXAotCT8gMHg4MAkJCQkJCQkJXAotCTogMCkJCQkJCQkJCVwKLSAgICAgICB8IChob3d0by0+Yml0c2l6ZSAtIDEpKTsJCQkJCQlcCi0gIH0KLQwKLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgeGNvZmZfcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQotCi0jZGVmaW5lIGNvZmZfbWtvYmplY3QgeGNvZmZfbWtvYmplY3QKLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIHhjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgeGNvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0MCi0vKiBYQ09GRiBhcmNoaXZlIHN1cHBvcnQuICBUaGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIGNvZGUgd2FzIGJ5Ci0gICBEYW1vbiBBLiBQZXJtZXplbC4gIEl0IHdhcyBlbmhhbmNlZCB0byBwZXJtaXQgY3Jvc3Mgc3VwcG9ydCwgYW5kCi0gICB3cml0aW5nIGFyY2hpdmUgZmlsZXMsIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBYQ09GRiB1c2VzIGl0cyBvd24gYXJjaGl2ZSBmb3JtYXQuICBFdmVyeXRoaW5nIGlzIGhvb2tlZCB0b2dldGhlcgotICAgd2l0aCBmaWxlIG9mZnNldCBsaW5rcywgc28gaXQgaXMgcG9zc2libGUgdG8gcmFwaWRseSB1cGRhdGUgYW4KLSAgIGFyY2hpdmUgaW4gcGxhY2UuICBPZiBjb3Vyc2UsIHdlIGRvbid0IGRvIHRoYXQuICBBbiBYQ09GRiBhcmNoaXZlCi0gICBoYXMgYSByZWFsIGZpbGUgaGVhZGVyLCBub3QganVzdCBhbiBBUk1BRyBzdHJpbmcuICBUaGUgc3RydWN0dXJlIG9mCi0gICB0aGUgZmlsZSBoZWFkZXIgYW5kIG9mIGVhY2ggYXJjaGl2ZSBoZWFkZXIgYXBwZWFyIGJlbG93LgotCi0gICBBbiBYQ09GRiBhcmNoaXZlIGFsc28gaGFzIGEgbWVtYmVyIHRhYmxlLCB3aGljaCBpcyBhIGxpc3Qgb2YKLSAgIGVsZW1lbnRzIGluIHRoZSBhcmNoaXZlICh5b3UgY2FuIGdldCB0aGF0IGJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUKLSAgIGxpbmtlZCBsaXN0LCBidXQgeW91IGhhdmUgdG8gcmVhZCBhIGxvdCBtb3JlIG9mIHRoZSBmaWxlKS4gIFRoZQotICAgbWVtYmVyIHRhYmxlIGhhcyBhIG5vcm1hbCBhcmNoaXZlIGhlYWRlciB3aXRoIGFuIGVtcHR5IG5hbWUuICBJdCBpcwotICAgbm9ybWFsbHkgKGFuZCBwZXJoYXBzIG11c3QgYmUpIHRoZSBzZWNvbmQgdG8gbGFzdCBlbnRyeSBpbiB0aGUKLSAgIGFyY2hpdmUuICBUaGUgbWVtYmVyIHRhYmxlIGRhdGEgaXMgYWxtb3N0IHByaW50YWJsZSBBU0NJSS4gIEl0Ci0gICBzdGFydHMgd2l0aCBhIDEyIGNoYXJhY3RlciBkZWNpbWFsIHN0cmluZyB3aGljaCBpcyB0aGUgbnVtYmVyIG9mCi0gICBlbnRyaWVzIGluIHRoZSB0YWJsZS4gIEZvciBlYWNoIGVudHJ5IGl0IGhhcyBhIDEyIGNoYXJhY3RlciBkZWNpbWFsCi0gICBzdHJpbmcgd2hpY2ggaXMgdGhlIG9mZnNldCBpbiB0aGUgYXJjaGl2ZSBvZiB0aGF0IG1lbWJlci4gIFRoZXNlCi0gICBlbnRyaWVzIGFyZSBmb2xsb3dlZCBieSBhIHNlcmllcyBvZiBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncyB3aGljaAotICAgYXJlIHRoZSBtZW1iZXIgbmFtZXMgZm9yIGVhY2ggZW50cnkuCi0KLSAgIEZpbmFsbHksIGFuIFhDT0ZGIGFyY2hpdmUgaGFzIGEgZ2xvYmFsIHN5bWJvbCB0YWJsZSwgd2hpY2ggaXMgd2hhdAotICAgd2UgY2FsbCB0aGUgYXJtYXAuICBUaGUgZ2xvYmFsIHN5bWJvbCB0YWJsZSBoYXMgYSBub3JtYWwgYXJjaGl2ZQotICAgaGVhZGVyIHdpdGggYW4gZW1wdHkgbmFtZS4gIEl0IGlzIG5vcm1hbGx5IChhbmQgcGVyaGFwcyBtdXN0IGJlKQotICAgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGFyY2hpdmUuICBUaGUgY29udGVudHMgc3RhcnQgd2l0aCBhIGZvdXIgYnl0ZQotICAgYmluYXJ5IG51bWJlciB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMuICBUaGlzIGlzIGZvbGxvd2VkIGJ5Ci0gICBhIHRoYXQgbWFueSBmb3VyIGJ5dGUgYmluYXJ5IG51bWJlcnM7IGVhY2ggaXMgdGhlIGZpbGUgb2Zmc2V0IG9mIGFuCi0gICBlbnRyeSBpbiB0aGUgYXJjaGl2ZS4gIFRoZXNlIG51bWJlcnMgYXJlIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mCi0gICBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncywgd2hpY2ggYXJlIHN5bWJvbCBuYW1lcy4gICovCi0KLS8qIFhDT0ZGIGFyY2hpdmVzIHVzZSB0aGlzIGFzIGEgbWFnaWMgc3RyaW5nLiAgKi8KLQotI2RlZmluZSBYQ09GRkFSTUFHICI8YWlhZmY+XDAxMiIKLSNkZWZpbmUgU1hDT0ZGQVJNQUcgOAotCi0vKiBUaGlzIHRlcm1pbmF0ZXMgYW4gWENPRkYgYXJjaGl2ZSBtZW1iZXIgbmFtZS4gICovCi0KLSNkZWZpbmUgWENPRkZBUkZNQUcgImBcMDEyIgotI2RlZmluZSBTWENPRkZBUkZNQUcgMgotCi0vKiBYQ09GRiBhcmNoaXZlcyBzdGFydCB3aXRoIHRoaXMgKHByaW50YWJsZSkgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyCi17Ci0gIC8qIE1hZ2ljIHN0cmluZy4gICovCi0gIGNoYXIgbWFnaWNbU1hDT0ZGQVJNQUddOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgbWVtYmVyIHRhYmxlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG1lbW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBnbG9iYWwgc3ltYm9sIHRhYmxlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHN5bW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZmlyc3RtZW1vZmZbMTJdOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgbGFzdCBtZW1iZXIgaW4gdGhlIGFyY2hpdmUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbGFzdG1lbW9mZlsxMl07Ci0KLSAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZW1iZXIgb24gdGhlIGZyZWUgbGlzdCAoZGVjaW1hbCBBU0NJSQotICAgICBzdHJpbmcpLiAgKi8KLSAgY2hhciBmcmVlb2ZmWzEyXTsKLX07Ci0KLSNkZWZpbmUgU0laRU9GX0FSX0ZJTEVfSERSICg1ICogMTIgKyBTWENPRkZBUk1BRykKLQotLyogRWFjaCBYQ09GRiBhcmNoaXZlIG1lbWJlciBzdGFydHMgd2l0aCB0aGlzIChwcmludGFibGUpIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCB4Y29mZl9hcl9oZHIKLXsKLSAgLyogRmlsZSBzaXplIG5vdCBpbmNsdWRpbmcgdGhlIGhlYWRlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBzaXplWzEyXTsKLQotICAvKiBGaWxlIG9mZnNldCBvZiBuZXh0IGFyY2hpdmUgbWVtYmVyIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG5leHRvZmZbMTJdOwotCi0gIC8qIEZpbGUgb2Zmc2V0IG9mIHByZXZpb3VzIGFyY2hpdmUgbWVtYmVyIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHByZXZvZmZbMTJdOwotCi0gIC8qIEZpbGUgbXRpbWUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZGF0ZVsxMl07Ci0KLSAgLyogRmlsZSBVSUQgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgdWlkWzEyXTsKLQotICAvKiBGaWxlIEdJRCAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBnaWRbMTJdOwotCi0gIC8qIEZpbGUgbW9kZSAob2N0YWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbW9kZVsxMl07Ci0KLSAgLyogTGVuZ3RoIG9mIGZpbGUgbmFtZSAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBuYW1sZW5bNF07Ci0KLSAgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgZm9sbG93ZWQgYnkgdGhlIGZpbGUgbmFtZS4gIFRoZSBsZW5ndGggb2YgdGhlCi0gICAgIG5hbWUgaXMgZ2l2ZW4gaW4gdGhlIG5hbWxlbiBmaWVsZC4gIElmIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgaXMKLSAgICAgb2RkLCB0aGUgbmFtZSBpcyBmb2xsb3dlZCBieSBhIG51bGwgYnl0ZS4gIFRoZSBuYW1lIGFuZCBvcHRpb25hbAotICAgICBudWxsIGJ5dGUgYXJlIGZvbGxvd2VkIGJ5IFhDT0ZGQVJGTUFHLCB3aGljaCBpcyBub3QgaW5jbHVkZWQgaW4KLSAgICAgbmFtbGVuLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBhcmNoaXZlIG1lbWJlciBmb2xsb3c7IHRoZSBudW1iZXIgb2YKLSAgICAgYnl0ZXMgaXMgZ2l2ZW4gaW4gdGhlIHNpemUgZmllbGQuICAqLwotfTsKLQotI2RlZmluZSBTSVpFT0ZfQVJfSERSICg3ICogMTIgKyA0KQotCi0vKiBXZSBzdG9yZSBhIGNvcHkgb2YgdGhlIHhjb2ZmX2FyX2ZpbGVfaGRyIGluIHRoZSB0ZGF0YSBmaWVsZCBvZiB0aGUKLSAgIGFydGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgeGNvZmZfYXJkYXRhKGFiZmQpIFwKLSAgKChzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHIgKikgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhKQotCi0vKiBXZSBzdG9yZSBhIGNvcHkgb2YgdGhlIHhjb2ZmX2FyX2hkciBpbiB0aGUgYXJlbHRfZGF0YSBmaWVsZCBvZiBhbgotICAgYXJjaGl2ZSBlbGVtZW50LiAgKi8KLSNkZWZpbmUgYXJjaF9lbHRkYXRhKGJmZCkgKChzdHJ1Y3QgYXJlbHRkYXRhICopICgoYmZkKS0+YXJlbHRfZGF0YSkpCi0jZGVmaW5lIGFyY2hfeGhkcihiZmQpIFwKLSAgKChzdHJ1Y3QgeGNvZmZfYXJfaGRyICopIGFyY2hfZWx0ZGF0YSAoYmZkKS0+YXJjaF9oZWFkZXIpCi0KLS8qIFhDT0ZGIGFyY2hpdmVzIGRvIG5vdCBoYXZlIGFueXRoaW5nIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGFuCi0gICBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLQotI2RlZmluZSB4Y29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF9mYWxzZQotI2RlZmluZSB4Y29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIHhjb2ZmX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLQotLyogV2UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgZ2V0X2VsdF9hdF9pbmRleCByb3V0aW5lLiAgKi8KLQotI2RlZmluZSB4Y29mZl9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0KLS8qIFhDT0ZGIGFyY2hpdmVzIGRvIG5vdCBoYXZlIGEgdGltZXN0YW1wLiAgKi8KLQotI2RlZmluZSB4Y29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF90cnVlCi0KLS8qIFJlYWQgaW4gdGhlIGFybWFwIG9mIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfc2x1cnBfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgb2ZmOwotICBzdHJ1Y3QgeGNvZmZfYXJfaGRyIGhkcjsKLSAgc2l6ZV90IG5hbWxlbjsKLSAgYmZkX3NpemVfdHlwZSBzejsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzLCAqY2VuZDsKLSAgdW5zaWduZWQgaW50IGMsIGk7Ci0gIGNhcnN5bSAqYXJzeW07Ci0gIGJmZF9ieXRlICpwOwotCi0gIGlmICh4Y29mZl9hcmRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgb2ZmID0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFiZmQpLT5zeW1vZmYsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIGlmIChvZmYgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZiwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBzeW1ib2wgdGFibGUgc3RhcnRzIHdpdGggYSBub3JtYWwgYXJjaGl2ZSBoZWFkZXIuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9IRFIsIDEsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFNraXAgdGhlIG5hbWUgKG5vcm1hbGx5IGVtcHR5KS4gICovCi0gIG5hbWxlbiA9IHN0cnRvbCAoaGRyLm5hbWxlbiwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoKG5hbWxlbiArIDEpICYgfjEpICsgU1hDT0ZGQVJGTUFHLCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVhZCBpbiB0aGUgZW50aXJlIHN5bWJvbCB0YWJsZS4gICovCi0gIHN6ID0gc3RydG9sIChoZHIuc2l6ZSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzeik7Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBjb250ZW50cywgMSwgc3osIGFiZmQpICE9IHN6KQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgc3ltYm9sIHRhYmxlIHN0YXJ0cyB3aXRoIGEgZm91ciBieXRlIGNvdW50LiAgKi8KLSAgYyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgY29udGVudHMpOwotCi0gIGlmIChjICogNCA+PSBzeikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSAoKGNhcnN5bSAqKQotCQkJCWJmZF9hbGxvYyAoYWJmZCwgYyAqIHNpemVvZiAoY2Fyc3ltKSkpOwotICBpZiAoYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQWZ0ZXIgdGhlIGNvdW50IGNvbWVzIGEgbGlzdCBvZiBmb3VyIGJ5dGUgZmlsZSBvZmZzZXRzLiAgKi8KLSAgZm9yIChpID0gMCwgYXJzeW0gPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcywgcCA9IGNvbnRlbnRzICsgNDsKLSAgICAgICBpIDwgYzsKLSAgICAgICArK2ksICsrYXJzeW0sIHAgKz0gNCkKLSAgICBhcnN5bS0+ZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHApOwotCi0gIC8qIEFmdGVyIHRoZSBmaWxlIG9mZnNldHMgY29tZSBudWxsIHRlcm1pbmF0ZWQgc3ltYm9sIG5hbWVzLiAgKi8KLSAgY2VuZCA9IGNvbnRlbnRzICsgc3o7Ci0gIGZvciAoaSA9IDAsIGFyc3ltID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnM7Ci0gICAgICAgaSA8IGM7Ci0gICAgICAgKytpLCArK2Fyc3ltLCBwICs9IHN0cmxlbiAoKGNoYXIgKikgcCkgKyAxKQotICAgIHsKLSAgICAgIGlmIChwID49IGNlbmQpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYXJzeW0tPm5hbWUgPSAoY2hhciAqKSBwOwotICAgIH0KLQotICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmX2NvdW50ID0gYzsKLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIGlmIHRoaXMgaXMgYW4gWENPRkYgYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXhjb2ZmX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHIgaGRyOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmhkciwgU0laRU9GX0FSX0ZJTEVfSERSLCAxLCBhYmZkKQotICAgICAgIT0gU0laRU9GX0FSX0ZJTEVfSERSKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoc3RybmNtcCAoaGRyLm1hZ2ljLCBYQ09GRkFSTUFHLCBTWENPRkZBUk1BRykgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBhcmUgc2V0dGluZyBiZmRfYXJkYXRhKGFiZmQpIGhlcmUsIGJ1dCBzaW5jZSBiZmRfYXJkYXRhCi0gICAgIGludm9sdmVzIGEgY2FzdCwgd2UgY2FuJ3QgZG8gaXQgYXMgdGhlIGxlZnQgb3BlcmFuZCBvZgotICAgICBhc3NpZ25tZW50LiAgKi8KLSAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0KLSAgICAoc3RydWN0IGFydGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJ0ZGF0YSkpOwotCi0gIGlmIChiZmRfYXJkYXRhIChhYmZkKSA9PSAoc3RydWN0IGFydGRhdGEgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gc3RydG9sIChoZHIuZmlyc3RtZW1vZmYsCi0JCQkJCQkgIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5jYWNoZSA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5hcmNoaXZlX2hlYWQgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhID0gYmZkX3phbGxvYyAoYWJmZCwgU0laRU9GX0FSX0ZJTEVfSERSKTsKLSAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIG1lbWNweSAoYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhLCAmaGRyLCBTSVpFT0ZfQVJfRklMRV9IRFIpOwotCi0gIGlmICghIHhjb2ZmX3NsdXJwX2FybWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gKHN0cnVjdCBhcnRkYXRhICopIE5VTEw7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFJlYWQgdGhlIGFyY2hpdmUgaGVhZGVyIGluIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgUFRSCi14Y29mZl9yZWFkX2FyX2hkciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgeGNvZmZfYXJfaGRyIGhkcjsKLSAgc2l6ZV90IG5hbWxlbjsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkciAqaGRycDsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqcmV0OwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmhkciwgU0laRU9GX0FSX0hEUiwgMSwgYWJmZCkgIT0gU0laRU9GX0FSX0hEUikKLSAgICByZXR1cm4gTlVMTDsKLQotICBuYW1sZW4gPSBzdHJ0b2wgKGhkci5uYW1sZW4sIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIGhkcnAgPSAoc3RydWN0IHhjb2ZmX2FyX2hkciAqKSBiZmRfYWxsb2MgKGFiZmQsIFNJWkVPRl9BUl9IRFIgKyBuYW1sZW4gKyAxKTsKLSAgaWYgKGhkcnAgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgbWVtY3B5IChoZHJwLCAmaGRyLCBTSVpFT0ZfQVJfSERSKTsKLSAgaWYgKGJmZF9yZWFkICgoY2hhciAqKSBoZHJwICsgU0laRU9GX0FSX0hEUiwgMSwgbmFtbGVuLCBhYmZkKSAhPSBuYW1sZW4pCi0gICAgcmV0dXJuIE5VTEw7Ci0gICgoY2hhciAqKSBoZHJwKVtTSVpFT0ZfQVJfSERSICsgbmFtbGVuXSA9ICdcMCc7Ci0KLSAgcmV0ID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICByZXQtPmFyY2hfaGVhZGVyID0gKGNoYXIgKikgaGRycDsKLSAgcmV0LT5wYXJzZWRfc2l6ZSA9IHN0cnRvbCAoaGRyLnNpemUsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIHJldC0+ZmlsZW5hbWUgPSAoY2hhciAqKSBoZHJwICsgU0laRU9GX0FSX0hEUjsKLQotICAvKiBTa2lwIG92ZXIgdGhlIFhDT0ZGQVJGTUFHIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgbmFtZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKG5hbWxlbiAmIDEpICsgU1hDT0ZGQVJGTUFHLCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gKFBUUikgcmV0OwotfQotCi0vKiBPcGVuIHRoZSBuZXh0IGVsZW1lbnQgaW4gYW4gWENPRkYgYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBiZmQgKgoteGNvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoaXZlLCBsYXN0X2ZpbGUpCi0gICAgIGJmZCAqYXJjaGl2ZTsKLSAgICAgYmZkICpsYXN0X2ZpbGU7Ci17Ci0gIGZpbGVfcHRyIGZpbGVzdGFydDsKLQotICBpZiAoeGNvZmZfYXJkYXRhIChhcmNoaXZlKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGxhc3RfZmlsZSA9PSBOVUxMKQotICAgIGZpbGVzdGFydCA9IGJmZF9hcmRhdGEgKGFyY2hpdmUpLT5maXJzdF9maWxlX2ZpbGVwb3M7Ci0gIGVsc2UKLSAgICBmaWxlc3RhcnQgPSBzdHJ0b2wgKGFyY2hfeGhkciAobGFzdF9maWxlKS0+bmV4dG9mZiwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLQotICBpZiAoZmlsZXN0YXJ0ID09IDAKLSAgICAgIHx8IGZpbGVzdGFydCA9PSBzdHJ0b2wgKHhjb2ZmX2FyZGF0YSAoYXJjaGl2ZSktPm1lbW9mZiwKLQkJCSAgICAgIChjaGFyICoqKSBOVUxMLCAxMCkKLSAgICAgIHx8IGZpbGVzdGFydCA9PSBzdHJ0b2wgKHhjb2ZmX2FyZGF0YSAoYXJjaGl2ZSktPnN5bW9mZiwKLQkJCSAgICAgIChjaGFyICoqKSBOVUxMLCAxMCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXN0YXJ0KTsKLX0KLQotLyogU3RhdCBhbiBlbGVtZW50IGluIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgaW50Ci14Y29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKnM7Ci17Ci0gIHN0cnVjdCB4Y29mZl9hcl9oZHIgKmhkcnA7Ci0KLSAgaWYgKGFiZmQtPmFyZWx0X2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBoZHJwID0gYXJjaF94aGRyIChhYmZkKTsKLQotICBzLT5zdF9tdGltZSA9IHN0cnRvbCAoaGRycC0+ZGF0ZSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgcy0+c3RfdWlkID0gc3RydG9sIChoZHJwLT51aWQsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIHMtPnN0X2dpZCA9IHN0cnRvbCAoaGRycC0+Z2lkLCAoY2hhciAqKikgTlVMTCwgMTApOwotICBzLT5zdF9tb2RlID0gc3RydG9sIChoZHJwLT5tb2RlLCAoY2hhciAqKikgTlVMTCwgOCk7Ci0gIHMtPnN0X3NpemUgPSBhcmNoX2VsdGRhdGEgKGFiZmQpLT5wYXJzZWRfc2l6ZTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogTm9ybWFsaXplIGEgZmlsZSBuYW1lIGZvciBpbmNsdXNpb24gaW4gYW4gYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW5vcm1hbGl6ZV9maWxlbmFtZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBjaGFyICpmaWxlOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLQotICBmaWxlID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0gIGZpbGVuYW1lID0gc3RycmNociAoZmlsZSwgJy8nKTsKLSAgaWYgKGZpbGVuYW1lICE9IE5VTEwpCi0gICAgZmlsZW5hbWUrKzsKLSAgZWxzZQotICAgIGZpbGVuYW1lID0gZmlsZTsKLSAgcmV0dXJuIGZpbGVuYW1lOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gWENPRkYgYXJtYXAuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi14Y29mZl93cml0ZV9hcm1hcCAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIHN0cnVjdCB4Y29mZl9hcl9oZHIgaGRyOwotICBjaGFyICpwOwotICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKLSAgYmZkICpzdWI7Ci0gIGZpbGVfcHRyIGZpbGVvZmY7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIG1lbXNldCAoJmhkciwgMCwgc2l6ZW9mIGhkcik7Ci0gIHNwcmludGYgKGhkci5zaXplLCAiJWxkIiwgKGxvbmcpICg0ICsgb3JsX2NvdW50ICogNCArIHN0cmlkeCkpOwotICBzcHJpbnRmIChoZHIubmV4dG9mZiwgIiVkIiwgMCk7Ci0gIG1lbWNweSAoaGRyLnByZXZvZmYsIHhjb2ZmX2FyZGF0YSAoYWJmZCktPm1lbW9mZiwgMTIpOwotICBzcHJpbnRmIChoZHIuZGF0ZSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGhkci51aWQsICIlZCIsIDApOwotICBzcHJpbnRmIChoZHIuZ2lkLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoaGRyLm1vZGUsICIlZCIsIDApOwotICBzcHJpbnRmIChoZHIubmFtbGVuLCAiJWQiLCAwKTsKLQotICAvKiBXZSBuZWVkIHNwYWNlcywgbm90IG51bGwgYnl0ZXMsIGluIHRoZSBoZWFkZXIuICAqLwotICBmb3IgKHAgPSAoY2hhciAqKSAmaGRyOyBwIDwgKGNoYXIgKikgJmhkciArIFNJWkVPRl9BUl9IRFI7IHArKykKLSAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICpwID0gJyAnOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9IRFIsIDEsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIKLSAgICAgIHx8IGJmZF93cml0ZSAoWENPRkZBUkZNQUcsIDEsIFNYQ09GRkFSRk1BRywgYWJmZCkgIT0gU1hDT0ZGQVJGTUFHKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgb3JsX2NvdW50LCBidWYpOwotICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgZmlsZW9mZiA9IFNJWkVPRl9BUl9GSUxFX0hEUjsKLSAgaSA9IDA7Ci0gIHdoaWxlIChzdWIgIT0gTlVMTCAmJiBpIDwgb3JsX2NvdW50KQotICAgIHsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0KLSAgICAgIHdoaWxlICgoKGJmZCAqKSAobWFwW2ldKS5wb3MpID09IHN1YikKLQl7Ci0JICBiZmRfaF9wdXRfMzIgKGFiZmQsIGZpbGVvZmYsIGJ1Zik7Ci0JICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDQsIGFiZmQpICE9IDQpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICsraTsKLQl9Ci0gICAgICBuYW1sZW4gPSBzdHJsZW4gKG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKSk7Ci0gICAgICBuYW1sZW4gPSAobmFtbGVuICsgMSkgJn4gMTsKLSAgICAgIGZpbGVvZmYgKz0gKFNJWkVPRl9BUl9IRFIKLQkJICArIG5hbWxlbgotCQkgICsgU1hDT0ZGQVJGTUFHCi0JCSAgKyBhcmVsdF9zaXplIChzdWIpKTsKLSAgICAgIGZpbGVvZmYgPSAoZmlsZW9mZiArIDEpICZ+IDE7Ci0gICAgICBzdWIgPSBzdWItPm5leHQ7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBvcmxfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc2l6ZV90IG5hbWxlbjsKLQotICAgICAgbmFtZSA9ICptYXBbaV0ubmFtZTsKLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChuYW1lLCAxLCBuYW1sZW4gKyAxLCBhYmZkKSAhPSBuYW1sZW4gKyAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKChzdHJpZHggJiAxKSAhPSAwKQotICAgIHsKLSAgICAgIGNoYXIgYjsKLQotICAgICAgYiA9ICdcMCc7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gWENPRkYgYXJjaGl2ZS4gIFdlIGFsd2F5cyB3cml0ZSBhbiBlbnRpcmUgYXJjaGl2ZSwKLSAgIHJhdGhlciB0aGFuIGZ1c3Npbmcgd2l0aCB0aGUgZnJlZWxpc3QgYW5kIHNvIGZvcnRoLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyIGZoZHI7Ci0gIHNpemVfdCBjb3VudDsKLSAgc2l6ZV90IHRvdGFsX25hbWxlbjsKLSAgZmlsZV9wdHIgKm9mZnNldHM7Ci0gIGJvb2xlYW4gbWFrZW1hcDsKLSAgYm9vbGVhbiBoYXNvYmplY3RzOwotICBmaWxlX3B0ciBwcmV2b2ZmLCBuZXh0b2ZmOwotICBiZmQgKnN1YjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0cnVjdCB4Y29mZl9hcl9oZHIgYWhkcjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBjaGFyICpwOwotICBjaGFyIGRlY2J1ZlsxM107Ci0KLSAgbWVtc2V0ICgmZmhkciwgMCwgc2l6ZW9mIGZoZHIpOwotICBzdHJuY3B5IChmaGRyLm1hZ2ljLCBYQ09GRkFSTUFHLCBTWENPRkZBUk1BRyk7Ci0gIHNwcmludGYgKGZoZHIuZmlyc3RtZW1vZmYsICIlZCIsIFNJWkVPRl9BUl9GSUxFX0hEUik7Ci0gIHNwcmludGYgKGZoZHIuZnJlZW9mZiwgIiVkIiwgMCk7Ci0KLSAgY291bnQgPSAwOwotICB0b3RhbF9uYW1sZW4gPSAwOwotICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZDsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bmV4dCkKLSAgICB7Ci0gICAgICArK2NvdW50OwotICAgICAgdG90YWxfbmFtbGVuICs9IHN0cmxlbiAobm9ybWFsaXplX2ZpbGVuYW1lIChzdWIpKSArIDE7Ci0gICAgfQotICBvZmZzZXRzID0gKGZpbGVfcHRyICopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQgKiBzaXplb2YgKGZpbGVfcHRyKSk7Ci0gIGlmIChvZmZzZXRzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgU0laRU9GX0FSX0ZJTEVfSERSLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbWFrZW1hcCA9IGJmZF9oYXNfbWFwIChhYmZkKTsKLSAgaGFzb2JqZWN0cyA9IGZhbHNlOwotICBwcmV2b2ZmID0gMDsKLSAgbmV4dG9mZiA9IFNJWkVPRl9BUl9GSUxFX0hEUjsKLSAgZm9yIChzdWIgPSBhYmZkLT5hcmNoaXZlX2hlYWQsIGkgPSAwOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5uZXh0LCBpKyspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0gICAgICBzdHJ1Y3QgeGNvZmZfYXJfaGRyICphaGRycDsKLSAgICAgIGJmZF9zaXplX3R5cGUgcmVtYWluaW5nOwotCi0gICAgICBpZiAobWFrZW1hcCAmJiAhIGhhc29iamVjdHMpCi0JewotCSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKHN1YiwgYmZkX29iamVjdCkpCi0JICAgIGhhc29iamVjdHMgPSB0cnVlOwotCX0KLQotICAgICAgbmFtZSA9IG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKTsKLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0KLSAgICAgIGlmIChzdWItPmFyZWx0X2RhdGEgIT0gTlVMTCkKLQlhaGRycCA9IGFyY2hfeGhkciAoc3ViKTsKLSAgICAgIGVsc2UKLQlhaGRycCA9IE5VTEw7Ci0KLSAgICAgIGlmIChhaGRycCA9PSBOVUxMKQotCXsKLQkgIHN0cnVjdCBzdGF0IHM7Ci0KLQkgIG1lbXNldCAoJmFoZHIsIDAsIHNpemVvZiBhaGRyKTsKLQkgIGFoZHJwID0gJmFoZHI7Ci0JICBpZiAoc3RhdCAoYmZkX2dldF9maWxlbmFtZSAoc3ViKSwgJnMpICE9IDApCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBzcHJpbnRmIChhaGRycC0+c2l6ZSwgIiVsZCIsIChsb25nKSBzLnN0X3NpemUpOwotCSAgc3ByaW50ZiAoYWhkcnAtPmRhdGUsICIlbGQiLCAobG9uZykgcy5zdF9tdGltZSk7Ci0JICBzcHJpbnRmIChhaGRycC0+dWlkLCAiJWxkIiwgKGxvbmcpIHMuc3RfdWlkKTsKLQkgIHNwcmludGYgKGFoZHJwLT5naWQsICIlbGQiLCAobG9uZykgcy5zdF9naWQpOwotCSAgc3ByaW50ZiAoYWhkcnAtPm1vZGUsICIlbyIsICh1bnNpZ25lZCBpbnQpIHMuc3RfbW9kZSk7Ci0KLQkgIGlmIChzdWItPmFyZWx0X2RhdGEgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN1Yi0+YXJlbHRfZGF0YSA9IGJmZF9hbGxvYyAoc3ViLCBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKLQkgICAgICBpZiAoc3ViLT5hcmVsdF9kYXRhID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBhcmNoX2VsdGRhdGEgKHN1YiktPnBhcnNlZF9zaXplID0gcy5zdF9zaXplOwotCX0KLQotICAgICAgc3ByaW50ZiAoYWhkcnAtPnByZXZvZmYsICIlbGQiLCAobG9uZykgcHJldm9mZik7Ci0gICAgICBzcHJpbnRmIChhaGRycC0+bmFtbGVuLCAiJWxkIiwgKGxvbmcpIG5hbWxlbik7Ci0KLSAgICAgIC8qIElmIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgaXMgb2RkLCB3ZSB3cml0ZSBvdXQgdGhlIG51bGwgYnl0ZQotICAgICAgICAgYWZ0ZXIgdGhlIG5hbWUgYXMgd2VsbC4gICovCi0gICAgICBuYW1sZW4gPSAobmFtbGVuICsgMSkgJn4gMTsKLQotICAgICAgcmVtYWluaW5nID0gYXJlbHRfc2l6ZSAoc3ViKTsKLSAgICAgIHNpemUgPSAoU0laRU9GX0FSX0hEUgotCSAgICAgICsgbmFtbGVuCi0JICAgICAgKyBTWENPRkZBUkZNQUcKLQkgICAgICArIHJlbWFpbmluZyk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKG5leHRvZmYgPT0gYmZkX3RlbGwgKGFiZmQpKTsKLQotICAgICAgb2Zmc2V0c1tpXSA9IG5leHRvZmY7Ci0KLSAgICAgIHByZXZvZmYgPSBuZXh0b2ZmOwotICAgICAgbmV4dG9mZiArPSBzaXplICsgKHNpemUgJiAxKTsKLQotICAgICAgc3ByaW50ZiAoYWhkcnAtPm5leHRvZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0KLSAgICAgIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gICAgICBmb3IgKHAgPSAoY2hhciAqKSBhaGRycDsgcCA8IChjaGFyICopIGFoZHJwICsgU0laRU9GX0FSX0hEUjsgcCsrKQotCWlmICgqcCA9PSAnXDAnKQotCSAgKnAgPSAnICc7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGFoZHJwLCAxLCBTSVpFT0ZfQVJfSERSLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSCi0JICB8fCBiZmRfd3JpdGUgKChQVFIpIG5hbWUsIDEsIG5hbWxlbiwgYWJmZCkgIT0gbmFtbGVuCi0JICB8fCAoYmZkX3dyaXRlICgoUFRSKSBYQ09GRkFSRk1BRywgMSwgU1hDT0ZGQVJGTUFHLCBhYmZkKQotCSAgICAgICE9IFNYQ09GRkFSRk1BRykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKHN1YiwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB3aGlsZSAocmVtYWluaW5nICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBhbXQ7Ci0JICBiZmRfYnl0ZSBidWZmZXJbREVGQVVMVF9CVUZGRVJTSVpFXTsKLQotCSAgYW10ID0gc2l6ZW9mIGJ1ZmZlcjsKLQkgIGlmIChhbXQgPiByZW1haW5pbmcpCi0JICAgIGFtdCA9IHJlbWFpbmluZzsKLQkgIGlmIChiZmRfcmVhZCAoYnVmZmVyLCAxLCBhbXQsIHN1YikgIT0gYW10Ci0JICAgICAgfHwgYmZkX3dyaXRlIChidWZmZXIsIDEsIGFtdCwgYWJmZCkgIT0gYW10KQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICByZW1haW5pbmcgLT0gYW10OwotCX0KLQotICAgICAgaWYgKChzaXplICYgMSkgIT0gMCkKLQl7Ci0JICBiZmRfYnl0ZSBiOwotCi0JICBiID0gJ1wwJzsKLQkgIGlmIChiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBzcHJpbnRmIChmaGRyLmxhc3RtZW1vZmYsICIlbGQiLCAobG9uZykgcHJldm9mZik7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBtZW1iZXIgdGFibGUuICAqLwotCi0gIEJGRF9BU1NFUlQgKG5leHRvZmYgPT0gYmZkX3RlbGwgKGFiZmQpKTsKLSAgc3ByaW50ZiAoZmhkci5tZW1vZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0KLSAgbWVtc2V0ICgmYWhkciwgMCwgc2l6ZW9mIGFoZHIpOwotICBzcHJpbnRmIChhaGRyLnNpemUsICIlbGQiLCAobG9uZykgKDEyICsgY291bnQgKiAxMiArIHRvdGFsX25hbWxlbikpOwotICBzcHJpbnRmIChhaGRyLnByZXZvZmYsICIlbGQiLCAobG9uZykgcHJldm9mZik7Ci0gIHNwcmludGYgKGFoZHIuZGF0ZSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGFoZHIudWlkLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoYWhkci5naWQsICIlZCIsIDApOwotICBzcHJpbnRmIChhaGRyLm1vZGUsICIlZCIsIDApOwotICBzcHJpbnRmIChhaGRyLm5hbWxlbiwgIiVkIiwgMCk7Ci0KLSAgc2l6ZSA9IChTSVpFT0ZfQVJfSERSCi0JICArIDEyCi0JICArIGNvdW50ICogMTIKLQkgICsgdG90YWxfbmFtbGVuCi0JICArIFNYQ09GRkFSRk1BRyk7Ci0KLSAgcHJldm9mZiA9IG5leHRvZmY7Ci0gIG5leHRvZmYgKz0gc2l6ZSArIChzaXplICYgMSk7Ci0KLSAgaWYgKG1ha2VtYXAgJiYgaGFzb2JqZWN0cykKLSAgICBzcHJpbnRmIChhaGRyLm5leHRvZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChhaGRyLm5leHRvZmYsICIlZCIsIDApOwotCi0gIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gIGZvciAocCA9IChjaGFyICopICZhaGRyOyBwIDwgKGNoYXIgKikgJmFoZHIgKyBTSVpFT0ZfQVJfSERSOyBwKyspCi0gICAgaWYgKCpwID09ICdcMCcpCi0gICAgICAqcCA9ICcgJzsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmYWhkciwgMSwgU0laRU9GX0FSX0hEUiwgYWJmZCkgIT0gU0laRU9GX0FSX0hEUgotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgWENPRkZBUkZNQUcsIDEsIFNYQ09GRkFSRk1BRywgYWJmZCkKLQkgICE9IFNYQ09GRkFSRk1BRykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNwcmludGYgKGRlY2J1ZiwgIiUtMTJsZCIsIChsb25nKSBjb3VudCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGRlY2J1ZiwgMSwgMTIsIGFiZmQpICE9IDEyKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgc3ByaW50ZiAoZGVjYnVmLCAiJS0xMmxkIiwgKGxvbmcpIG9mZnNldHNbaV0pOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgZGVjYnVmLCAxLCAxMiwgYWJmZCkgIT0gMTIpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZm9yIChzdWIgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHNpemVfdCBuYW1sZW47Ci0KLSAgICAgIG5hbWUgPSBub3JtYWxpemVfZmlsZW5hbWUgKHN1Yik7Ci0gICAgICBuYW1sZW4gPSBzdHJsZW4gKG5hbWUpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmFtZSwgMSwgbmFtbGVuICsgMSwgYWJmZCkgIT0gbmFtbGVuICsgMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoKHNpemUgJiAxKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGI7Ci0KLSAgICAgIGIgPSAnXDAnOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGFybWFwLCBpZiBhcHByb3ByaWF0ZS4gICovCi0KLSAgaWYgKCEgbWFrZW1hcCB8fCAhIGhhc29iamVjdHMpCi0gICAgc3ByaW50ZiAoZmhkci5zeW1vZmYsICIlZCIsIDApOwotICBlbHNlCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAobmV4dG9mZiA9PSBiZmRfdGVsbCAoYWJmZCkpOwotICAgICAgc3ByaW50ZiAoZmhkci5zeW1vZmYsICIlbGQiLCAobG9uZykgbmV4dG9mZik7Ci0gICAgICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSAoUFRSKSAmZmhkcjsKLSAgICAgIGlmICghIF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAgKGFiZmQsIDApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBhcmNoaXZlIGZpbGUgaGVhZGVyLiAgKi8KLQotICAvKiBXZSBuZWVkIHNwYWNlcywgbm90IG51bGwgYnl0ZXMsIGluIHRoZSBoZWFkZXIuICAqLwotICBmb3IgKHAgPSAoY2hhciAqKSAmZmhkcjsgcCA8IChjaGFyICopICZmaGRyICsgU0laRU9GX0FSX0ZJTEVfSERSOyBwKyspCi0gICAgaWYgKCpwID09ICdcMCcpCi0gICAgICAqcCA9ICcgJzsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICZmaGRyLCBTSVpFT0ZfQVJfRklMRV9IRFIsIDEsIGFiZmQpICE9Ci0JICBTSVpFT0ZfQVJfRklMRV9IRFIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFdlIGNhbid0IHVzZSB0aGUgdXN1YWwgY29mZl9zaXplb2ZfaGVhZGVycyByb3V0aW5lLCBiZWNhdXNlIEFJWAotICAgYWx3YXlzIHVzZXMgYW4gYS5vdXQgaGVhZGVyLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaW50Ci1fYmZkX3hjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHJlbG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBzaXplOwotCi0gIHNpemUgPSBGSUxIU1o7Ci0gIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotICAgIHNpemUgKz0gQU9VVFNaOwotICBlbHNlCi0gICAgc2l6ZSArPSBTTUFMTF9BT1VUU1o7Ci0gIHNpemUgKz0gYWJmZC0+c2VjdGlvbl9jb3VudCAqIFNDTkhTWjsKLSAgcmV0dXJuIHNpemU7Ci19Ci0MCi0jZGVmaW5lIENPUkVfRklMRV9QIF9iZmRfZHVtbXlfdGFyZ2V0Ci0KLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFwKLSAgX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLSNpZmRlZiBBSVhfQ09SRQotI3VuZGVmIENPUkVfRklMRV9QCi0jZGVmaW5lIENPUkVfRklMRV9QIHJzNjAwMGNvZmZfY29yZV9wCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqIHJzNjAwMGNvZmZfY29yZV9wICgpOwotZXh0ZXJuIGJvb2xlYW4gcnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoKTsKLWV4dGVybiBib29sZWFuIHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOwotCi0jdW5kZWYJY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIFwKLQkJCQkgICAgIHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLWV4dGVybiBjaGFyICpyczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jdW5kZWYgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLQotZXh0ZXJuIGludCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotCi0jdW5kZWYJY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZQljb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCXJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZiAvKiBBSVhfQ09SRSAqLwotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLSN1bmRlZiBDT1JFX0ZJTEVfUAotI2RlZmluZSBDT1JFX0ZJTEVfUCBseW54X2NvcmVfZmlsZV9wCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICpjb3JlX2JmZCwKLQkJCQkJCQkgICAgYmZkICpleGVjX2JmZCkpOwotI3VuZGVmCWNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLWV4dGVybiBjaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jdW5kZWYgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLQotZXh0ZXJuIGludCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotCi0jZW5kaWYgLyogTFlOWF9DT1JFICovCi0KLSNkZWZpbmUgX2JmZF94Y29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIF9iZmRfeGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBfYmZkX3hjb2ZmX2JmZF9nY19zZWN0aW9ucyBjb2ZmX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBfYmZkX3hjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gY29mZl9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qIFRoZSB0cmFuc2ZlciB2ZWN0b3IgdGhhdCBsZWFkcyB0aGUgb3V0c2lkZSB3b3JsZCB0byBhbGwgb2YgdGhlIGFib3ZlLiAqLwotCi1jb25zdCBiZmRfdGFyZ2V0Ci0jaWZkZWYgVEFSR0VUX1NZTQotICBUQVJHRVRfU1lNID0KLSNlbHNlCi0gIHJzNjAwMGNvZmZfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgImFpeGNvZmYtcnM2MDAwIiwJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwJCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgRFlOQU1JQyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIHhjb2ZmX2FyY2hpdmVfcCwgQ09SRV9GSUxFX1B9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LAkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICB4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHhjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF94Y29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfeGNvZmYpLAotCi0gIE5VTEwsCi0gIAotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1zaC5jIGIvYmZkL2NvZmYtc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2M2Y4My4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg3MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgU3VwZXItSCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgPHNhY0BjeWdudXMuY29tPi4KLSAgIFJlbGF4aW5nIGNvZGUgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi9zaC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIEludGVybmFsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNoX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZ2V0X3N5bWJvbF92YWx1ZSBQQVJBTVMgKChhc3ltYm9sICopKTsKLXN0YXRpYyBib29sZWFuIHNoX3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc2hfcmVsYXhfZGVsZXRlX2J5dGVzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpzaF9pbnNuX2luZm8gUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9hbGlnbl9sb2FkcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosIGJmZF9ieXRlICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc2hfc3dhcF9pbnNucwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9ieXRlICpzaF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotCi0vKiBEZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IHRvIDIqKjQuICAqLwotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDQpCi0KLS8qIEdlbmVyYXRlIGxvbmcgZmlsZSBuYW1lcy4gICovCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotLyogVGhlIHN1cHBvcnRlZCByZWxvY2F0aW9ucy4gIFRoZXJlIGFyZSBhIGxvdCBvZiByZWxvY2F0aW9ucyBkZWZpbmVkCi0gICBpbiBjb2ZmL2ludGVybmFsLmggd2hpY2ggd2UgZG8gbm90IGV4cGVjdCB0byBldmVyIHNlZS4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBzaF9jb2ZmX2hvd3Rvc1tdID0KLXsKLSAgRU1QVFlfSE9XVE8gKDApLAotICBFTVBUWV9IT1dUTyAoMSksCi0gIEVNUFRZX0hPV1RPICgyKSwKLSAgRU1QVFlfSE9XVE8gKDMpLCAvKiBSX1NIX1BDUkVMOCAqLwotICBFTVBUWV9IT1dUTyAoNCksIC8qIFJfU0hfUENSRUwxNiAqLwotICBFTVBUWV9IT1dUTyAoNSksIC8qIFJfU0hfSElHSDggKi8KLSAgRU1QVFlfSE9XVE8gKDYpLCAvKiBSX1NIX0lNTTI0ICovCi0gIEVNUFRZX0hPV1RPICg3KSwgLyogUl9TSF9MT1cxNiAqLwotICBFTVBUWV9IT1dUTyAoOCksCi0gIEVNUFRZX0hPV1RPICg5KSwgLyogUl9TSF9QQ0RJU1A4Qlk0ICovCi0KLSAgSE9XVE8gKFJfU0hfUENESVNQOEJZMiwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfcGNkaXNwOGJ5MiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEVNUFRZX0hPV1RPICgxMSksIC8qIFJfU0hfUENESVNQOCAqLwotCi0gIEhPV1RPIChSX1NIX1BDRElTUCwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9wY2Rpc3AxMmJ5MiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDEzKSwKLQotICBIT1dUTyAoUl9TSF9JTU0zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9pbW0zMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDE1KSwKLSAgRU1QVFlfSE9XVE8gKDE2KSwgLyogUl9TSF9JTU04ICovCi0gIEVNUFRZX0hPV1RPICgxNyksIC8qIFJfU0hfSU1NOEJZMiAqLwotICBFTVBUWV9IT1dUTyAoMTgpLCAvKiBSX1NIX0lNTThCWTQgKi8KLSAgRU1QVFlfSE9XVE8gKDE5KSwgLyogUl9TSF9JTU00ICovCi0gIEVNUFRZX0hPV1RPICgyMCksIC8qIFJfU0hfSU1NNEJZMiAqLwotICBFTVBUWV9IT1dUTyAoMjEpLCAvKiBSX1NIX0lNTTRCWTQgKi8KLQotICBIT1dUTyAoUl9TSF9QQ1JFTElNTThCWTIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfcGNyZWxpbW04YnkyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfUENSRUxJTU04Qlk0LAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3BjcmVsaW1tOGJ5NCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0lNTTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2ltbTE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfU1dJVENIMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfc3dpdGNoMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9TV0lUQ0gzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9zd2l0Y2gzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfVVNFUywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl91c2VzIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfQ09VTlQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfY291bnQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0FMSUdOLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2FsaWduIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9DT0RFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2NvZGUiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0RBVEEsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfZGF0YSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfTEFCRUwsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfbGFiZWwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX1NXSVRDSDgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9zd2l0Y2g4IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotI2RlZmluZSBTSF9DT0ZGX0hPV1RPX0NPVU5UIChzaXplb2Ygc2hfY29mZl9ob3d0b3MgLyBzaXplb2Ygc2hfY29mZl9ob3d0b3NbMF0pCi0KLS8qIENoZWNrIGZvciBhIGJhZCBtYWdpYyBudW1iZXIuICAqLwotI2RlZmluZSBCQURNQUcoeCkgU0hCQURNQUcoeCkKLQotLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKHRoaXMgaXMgbm90IGN1cnJlbnRseSB1c2VkKS4gICovCi0jZGVmaW5lIFNIIDEKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBzZXQgaGVyZS4gICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0vKiBTd2FwIHRoZSByX29mZnNldCBmaWVsZCBpbiBhbmQgb3V0LiAgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0KLS8qIFN3YXAgb3V0IGV4dHJhIGluZm9ybWF0aW9uIGluIHRoZSByZWxvYyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkJXAotICBkbwkJCQkJCVwKLSAgICB7CQkJCQkJXAotICAgICAgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOwkJCVwKLSAgICAgIGRzdC0+cl9zdHVmZlsxXSA9ICdDJzsJCQlcCi0gICAgfQkJCQkJCVwKLSAgd2hpbGUgKDApCi0KLS8qIEdldCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wsIHdoZW4gcGVyZm9ybWluZyBhIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgbG9uZwotZ2V0X3N5bWJvbF92YWx1ZSAoc3ltYm9sKSAgICAgICAKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgZWxzZSAKLSAgICByZWxvY2F0aW9uID0gKHN5bWJvbC0+dmFsdWUgKwotCQkgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotICByZXR1cm4gcmVsb2NhdGlvbjsKLX0KLQotLyogVGhpcyBtYWNybyBpcyB1c2VkIGluIGNvZmZjb2RlLmggdG8gZ2V0IHRoZSBob3d0byBjb3JyZXNwb25kaW5nIHRvCi0gICBhbiBpbnRlcm5hbCByZWxvYy4gICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8ocmVsZW50LCBpbnRlcm5hbCkJCVwKLSAgKChyZWxlbnQpLT5ob3d0byA9CQkJCVwKLSAgICgoaW50ZXJuYWwpLT5yX3R5cGUgPCBTSF9DT0ZGX0hPV1RPX0NPVU5UCVwKLSAgICA/ICZzaF9jb2ZmX2hvd3Rvc1soaW50ZXJuYWwpLT5yX3R5cGVdCVwKLSAgICA6IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpKQotCi0vKiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBtYWNybyBpbiBjb2ZmY29kZS5oLCBleGNlcHQgdGhhdCBpdCBjb3BpZXMKLSAgIHJfb2Zmc2V0IGludG8gcmVsb2NfZW50cnktPmFkZGVuZCBmb3Igc29tZSByZWxvY3MuICAqLwotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7ICAgICAgXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7ICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsgICBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9TV0lUQ0g4CQkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX1NXSVRDSDE2CQkJXAotCXx8IChyZWxvYykucl90eXBlID09IFJfU0hfU1dJVENIMzIJCQlcCi0JfHwgKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9VU0VTCQkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX0NPVU5UCQkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX0FMSUdOKQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gKHJlbG9jKS5yX29mZnNldDsJCQlcCi0gIH0KLQotLyogVGhpcyBpcyB0aGUgaG93dG8gZnVuY3Rpb24gZm9yIHRoZSBTSCByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNoX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBiZmRfdm1hIHN5bV92YWx1ZTsKLSAgdW5zaWduZWQgc2hvcnQgcl90eXBlOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX2J5dGUgKmhpdF9kYXRhID0gYWRkciArIChiZmRfYnl0ZSAqKSBkYXRhOwotCi0gIHJfdHlwZSA9IHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZTsKLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFBhcnRpYWwgbGlua2luZy0tZG8gbm90aGluZy4gICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogQWxtb3N0IGFsbCByZWxvY3MgaGF2ZSB0byBkbyB3aXRoIHJlbGF4aW5nLiAgSWYgYW55IHdvcmsgbXVzdCBiZQotICAgICBkb25lIGZvciB0aGVtLCBpdCBoYXMgYmVlbiBkb25lIGluIHNoX3JlbGF4X3NlY3Rpb24uICAqLwotICBpZiAocl90eXBlICE9IFJfU0hfSU1NMzIKLSAgICAgICYmIChyX3R5cGUgIT0gUl9TSF9QQ0RJU1AKLQkgIHx8IChzeW1ib2xfaW4tPmZsYWdzICYgQlNGX0xPQ0FMKSAhPSAwKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIGlmIChzeW1ib2xfaW4gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIHN5bV92YWx1ZSA9IGdldF9zeW1ib2xfdmFsdWUgKHN5bWJvbF9pbik7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9TSF9JTU0zMjoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfU0hfUENESVNQOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGhpdF9kYXRhKTsKLSAgICAgIHN5bV92YWx1ZSArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgICAgc3ltX3ZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgICsgYWRkcgotCQkgICAgKyA0KTsKLSAgICAgIHN5bV92YWx1ZSArPSAoaW5zbiAmIDB4ZmZmKSA8PCAxOwotICAgICAgaWYgKGluc24gJiAweDgwMCkKLQlzeW1fdmFsdWUgLT0gMHgxMDAwOwotICAgICAgaW5zbiA9IChpbnNuICYgMHhmMDAwKSB8IChzeW1fdmFsdWUgJiAweGZmZik7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBpZiAoc3ltX3ZhbHVlIDwgKGJmZF92bWEpIC0weDEwMDAgfHwgc3ltX3ZhbHVlID49IDB4MTAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLSNkZWZpbmUgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfdmVyaWZ5X2VuZGlhbl9tYXRjaAotCi0vKiBXZSBjYW4gZG8gcmVsYXhpbmcuICAqLwotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIHNoX3JlbGF4X3NlY3Rpb24KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gc2hfcmVsb2NhdGVfc2VjdGlvbgotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIHVzZSBzcGVjaWFsIGNvZGUgdG8gZ2V0IHRoZSByZWxvY2F0ZWQKLSAgIHNlY3Rpb24gY29udGVudHMuICAqLwotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBzaF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQwKLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBvbiB0aGUgU0guCi0KLSAgIEZ1bmN0aW9uIGNhbGxzIG9uIHRoZSBTSCBsb29rIGxpa2UgdGhpczoKLQotICAgICAgIG1vdmwgIEwxLHIwCi0gICAgICAgLi4uCi0gICAgICAganNyICAgQHIwCi0gICAgICAgLi4uCi0gICAgIEwxOgotICAgICAgIC5sb25nIGZ1bmN0aW9uCi0KLSAgIFRoZSBjb21waWxlciBhbmQgYXNzZW1ibGVyIHdpbGwgY29vcGVyYXRlIHRvIGNyZWF0ZSBSX1NIX1VTRVMKLSAgIHJlbG9jcyBvbiB0aGUganNyIGluc3RydWN0aW9ucy4gIFRoZSByX29mZnNldCBmaWVsZCBvZiB0aGUKLSAgIFJfU0hfVVNFUyByZWxvYyBpcyB0aGUgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSBpbnN0cnVjdGlvbiB3aGljaAotICAgbG9hZHMgdGhlIHJlZ2lzdGVyICh0aGUgcl9vZmZzZXQgZmllbGQgaXMgY29tcHV0ZWQgYXMgdGhvdWdoIGl0Ci0gICB3ZXJlIGEganVtcCBpbnN0cnVjdGlvbiwgc28gdGhlIG9mZnNldCB2YWx1ZSBpcyBhY3R1YWxseSBmcm9tIGZvdXIKLSAgIGJ5dGVzIHBhc3QgdGhlIGluc3RydWN0aW9uKS4gIFRoZSBsaW5rZXIgY2FuIHVzZSB0aGlzIHJlbG9jIHRvCi0gICBkZXRlcm1pbmUganVzdCB3aGljaCBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQsIGFuZCB0aHVzIGRlY2lkZQotICAgd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byByZXBsYWNlIHRoZSBqc3Igd2l0aCBhIGJzci4KLQotICAgSWYgbXVsdGlwbGUgZnVuY3Rpb24gY2FsbHMgYXJlIGFsbCBiYXNlZCBvbiBhIHNpbmdsZSByZWdpc3RlciBsb2FkCi0gICAoaS5lLiwgdGhlIHNhbWUgZnVuY3Rpb24gaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzKSwgdGhlIGNvbXBpbGVyCi0gICBndWFyYW50ZWVzIHRoYXQgZWFjaCBmdW5jdGlvbiBjYWxsIHdpbGwgaGF2ZSBhbiBSX1NIX1VTRVMgcmVsb2MuCi0gICBUaGVyZWZvcmUsIGlmIHRoZSBsaW5rZXIgaXMgYWJsZSB0byBjb252ZXJ0IGVhY2ggUl9TSF9VU0VTIHJlbG9jCi0gICB3aGljaCByZWZlcnMgdG8gdGhhdCBhZGRyZXNzLCBpdCBjYW4gc2FmZWx5IGVsaW1pbmF0ZSB0aGUgcmVnaXN0ZXIKLSAgIGxvYWQuCi0KLSAgIFdoZW4gdGhlIGFzc2VtYmxlciBjcmVhdGVzIGFuIFJfU0hfVVNFUyByZWxvYywgaXQgZXhhbWluZXMgaXQgdG8KLSAgIGRldGVybWluZSB3aGljaCBhZGRyZXNzIGlzIGJlaW5nIGxvYWRlZCAoTDEgaW4gdGhlIGFib3ZlIGV4YW1wbGUpLgotICAgSXQgdGhlbiBjb3VudHMgdGhlIG51bWJlciBvZiByZWZlcmVuY2VzIHRvIHRoYXQgYWRkcmVzcywgYW5kCi0gICBjcmVhdGVzIGFuIFJfU0hfQ09VTlQgcmVsb2MgYXQgdGhhdCBhZGRyZXNzLiAgVGhlIHJfb2Zmc2V0IGZpZWxkIG9mCi0gICB0aGUgUl9TSF9DT1VOVCByZWxvYyB3aWxsIGJlIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcy4gIElmIHRoZQotICAgbGlua2VyIGlzIGFibGUgdG8gZWxpbWluYXRlIGEgcmVnaXN0ZXIgbG9hZCwgaXQgY2FuIHVzZSB0aGUKLSAgIFJfU0hfQ09VTlQgcmVsb2MgdG8gc2VlIHdoZXRoZXIgaXQgY2FuIGFsc28gZWxpbWluYXRlIHRoZSBmdW5jdGlvbgotICAgYWRkcmVzcy4KLQotICAgU0ggcmVsYXhpbmcgYWxzbyBoYW5kbGVzIGFub3RoZXIsIHVucmVsYXRlZCwgbWF0dGVyLiAgT24gdGhlIFNILCBpZgotICAgYSBsb2FkIG9yIHN0b3JlIGluc3RydWN0aW9uIGlzIG5vdCBhbGlnbmVkIG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LAotICAgdGhlIG1lbW9yeSBjeWNsZSBpbnRlcmZlcmVzIHdpdGggdGhlIDMyIGJpdCBpbnN0cnVjdGlvbiBmZXRjaCwKLSAgIGNhdXNpbmcgYSBvbmUgY3ljbGUgYnViYmxlIGluIHRoZSBwaXBlbGluZS4gIFRoZXJlZm9yZSwgd2UgdHJ5IHRvCi0gICBhbGlnbiBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgb24gZm91ciBieXRlIGJvdW5kYXJpZXMgaWYgd2UKLSAgIGNhbiwgYnkgc3dhcHBpbmcgdGhlbSB3aXRoIG9uZSBvZiB0aGUgYWRqYWNlbnQgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1zaF9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgYm9vbGVhbiBoYXZlX2NvZGU7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JCSAgICAgKGFiZmQsIHNlYywgbGlua19pbmZvLT5rZWVwX21lbW9yeSwKLQkJICAgICAgKGJmZF9ieXRlICopIE5VTEwsIGZhbHNlLAotCQkgICAgICAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIGhhdmVfY29kZSA9IGZhbHNlOwotCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBsYWRkciwgcGFkZHIsIHN5bXZhbDsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGluc247Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxmbiwgKmlyZWxzY2FuLCAqaXJlbGNvdW50OwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSBmb2ZmOwotCi0gICAgICBpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfQ09ERSkKLQloYXZlX2NvZGUgPSB0cnVlOwotCi0gICAgICBpZiAoaXJlbC0+cl90eXBlICE9IFJfU0hfVVNFUykKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMCi0JICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogVGhlIHJfb2Zmc2V0IGZpZWxkIG9mIHRoZSBSX1NIX1VTRVMgcmVsb2Mgd2lsbCBwb2ludCB1cyB0bwotICAgICAgICAgdGhlIHJlZ2lzdGVyIGxvYWQuICBUaGUgNCBpcyBiZWNhdXNlIHRoZSByX29mZnNldCBmaWVsZCBpcwotICAgICAgICAgY29tcHV0ZWQgYXMgdGhvdWdoIGl0IHdlcmUgYSBqdW1wIG9mZnNldCwgd2hpY2ggYXJlIGJhc2VkCi0gICAgICAgICBmcm9tIDQgYnl0ZXMgYWZ0ZXIgdGhlIGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgbGFkZHIgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgKyA0OwotICAgICAgLyogQ2FyZWZ1bCB0byBzaWduIGV4dGVuZCB0aGUgMzItYml0IG9mZnNldC4gICovCi0gICAgICBsYWRkciArPSAoKGlyZWwtPnJfb2Zmc2V0ICYgMHhmZmZmZmZmZikgXiAweDgwMDAwMDAwKSAtIDB4ODAwMDAwMDA7Ci0gICAgICBpZiAobGFkZHIgPj0gc2VjLT5fcmF3X3NpemUpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgUl9TSF9VU0VTIG9mZnNldCIsCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAodW5zaWduZWQgbG9uZykgaXJlbC0+cl92YWRkcik7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBsYWRkcik7Ci0KLSAgICAgIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QgbW92LmwgTk4sck4sIHdlIGRvbid0IGtub3cgd2hhdCB0byBkby4gICovCi0gICAgICBpZiAoKGluc24gJiAweGYwMDApICE9IDB4ZDAwMCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKCIlczogMHglbHg6IHdhcm5pbmc6IFJfU0hfVVNFUyBwb2ludHMgdG8gdW5yZWNvZ25pemVkIGluc24gMHgleCIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl92YWRkciwgaW5zbikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0aGUgcmVnaXN0ZXIgaXMgYmVpbmcgbG9hZGVkLiAgVGhlCi0gICAgICAJIGRpc3BsYWNlbWVudCBpbiB0aGUgbW92LmwgaW5zdHJ1Y3Rpb24gaXMgcXVhZHJ1cGxlZC4gIEl0IGlzIGEKLSAgICAgIAkgZGlzcGxhY2VtZW50IGZyb20gZm91ciBieXRlcyBhZnRlciB0aGUgbW92bCBpbnN0cnVjdGlvbiwgYnV0LAotICAgICAgCSBiZWZvcmUgYWRkaW5nIGluIHRoZSBQQyBhZGRyZXNzLCB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cwotICAgICAgCSBvZiB0aGUgUEMgYXJlIGNsZWFyZWQuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2VjdGlvbiBpcyBhbGlnbmVkCi0gICAgICAJIG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgICAgIHBhZGRyID0gaW5zbiAmIDB4ZmY7Ci0gICAgICBwYWRkciAqPSA0OwotICAgICAgcGFkZHIgKz0gKGxhZGRyICsgNCkgJn4gMzsKLSAgICAgIGlmIChwYWRkciA+PSBzZWMtPl9yYXdfc2l6ZSkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgbG9hZCBvZmZzZXQiLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSByZWxvYyBmb3IgdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0aGUgcmVnaXN0ZXIgaXMKLSAgICAgICAgIGJlaW5nIGxvYWRlZC4gIFRoaXMgcmVsb2Mgd2lsbCB0ZWxsIHVzIHdoaWNoIGZ1bmN0aW9uIGlzCi0gICAgICAgICBhY3R1YWxseSBiZWluZyBjYWxsZWQuICAqLwotICAgICAgcGFkZHIgKz0gc2VjLT52bWE7Ci0gICAgICBmb3IgKGlyZWxmbiA9IGludGVybmFsX3JlbG9jczsgaXJlbGZuIDwgaXJlbGVuZDsgaXJlbGZuKyspCi0JaWYgKGlyZWxmbi0+cl92YWRkciA9PSBwYWRkcgotCSAgICAmJiBpcmVsZm4tPnJfdHlwZSA9PSBSX1NIX0lNTTMyKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbGZuID49IGlyZWxlbmQpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCByZWxvYyIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsCi0JCQkgICAgKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKQotCQkJICAgICArIChpcmVsZm4tPnJfc3ltbmR4Ci0JCQkJKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSksCi0JCQkgICAgJnN5bSk7Ci0gICAgICBpZiAoc3ltLm5fc2NudW0gIT0gMCAmJiBzeW0ubl9zY251bSAhPSBzZWMtPnRhcmdldF9pbmRleCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKCIlczogMHglbHg6IHdhcm5pbmc6IHN5bWJvbCBpbiB1bmV4cGVjdGVkIHNlY3Rpb24iLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzeW0ubl9zY2xhc3MgIT0gQ19FWFQpCi0JewotCSAgc3ltdmFsID0gKHN5bS5uX3ZhbHVlCi0JCSAgICAtIHNlYy0+dm1hCi0JCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKVtpcmVsZm4tPnJfc3ltbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIHN5bXZhbCArPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIHBhZGRyIC0gc2VjLT52bWEpOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmdW5jdGlvbiBjYWxsIGNhbiBiZSBzaG9ydGVuZWQuICAqLwotICAgICAgZm9mZiA9IChzeW12YWwKLQkgICAgICAtIChpcmVsLT5yX3ZhZGRyCi0JCSAtIHNlYy0+dm1hCi0JCSArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICsgNCkpOwotICAgICAgaWYgKGZvZmYgPCAtMHgxMDAwIHx8IGZvZmYgPj0gMHgxMDAwKQotCXsKLQkgIC8qIEFmdGVyIGFsbCB0aGF0IHdvcmssIHdlIGNhbid0IHNob3J0ZW4gdGhpcyBmdW5jdGlvbiBjYWxsLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogU2hvcnRlbiB0aGUgZnVuY3Rpb24gY2FsbC4gICovCi0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCi0JewotCSAgc2VjLT51c2VkX2J5X2JmZCA9Ci0JICAgICgoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0JICBpZiAoc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+a2VlcF9yZWxvY3MgPSB0cnVlOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPSBjb250ZW50czsKLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5rZWVwX2NvbnRlbnRzID0gdHJ1ZTsKLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0gICAgICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0gdHJ1ZTsKLQotICAgICAgLyogUmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuICAqLwotCi0gICAgICAvKiBDaGFuZ2UgdGhlIFJfU0hfVVNFUyByZWxvYyBpbnRvIGFuIFJfU0hfUENESVNQIHJlbG9jLCBhbmQKLSAgICAgICAgIHJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLiAgKi8KLSAgICAgIGlyZWwtPnJfdHlwZSA9IFJfU0hfUENESVNQOwotICAgICAgaXJlbC0+cl9zeW1uZHggPSBpcmVsZm4tPnJfc3ltbmR4OwotICAgICAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVCkKLQl7Ci0JICAvKiBJZiB0aGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgYmVjYXVzZSBvZiBmdXR1cmUgcmVsYXhpbmcsCi0gICAgICAgICAgICAgaXQgd2lsbCBiZSBoYW5kbGVkIGhlcmUgbGlrZSBvdGhlciBpbnRlcm5hbCBQQ0RJU1AKLSAgICAgICAgICAgICByZWxvY3MuICAqLwotCSAgYmZkX3B1dF8xNiAoYWJmZCwKLQkJICAgICAgMHhiMDAwIHwgKChmb2ZmID4+IDEpICYgMHhmZmYpLAotCQkgICAgICBjb250ZW50cyArIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGNhbid0IGZ1bGx5IHJlc29sdmUgdGhpcyB5ZXQsIGJlY2F1c2UgdGhlIGV4dGVybmFsCi0gICAgICAgICAgICAgc3ltYm9sIHZhbHVlIG1heSBiZSBjaGFuZ2VkIGJ5IGZ1dHVyZSByZWxheGluZy4gIFdlIGxldAotICAgICAgICAgICAgIHRoZSBmaW5hbCBsaW5rIHBoYXNlIGhhbmRsZSBpdC4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLCAweGIwMDAsIGNvbnRlbnRzICsgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hKTsKLQl9Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGVyZSBpcyBhbm90aGVyIFJfU0hfVVNFUyByZWxvYyByZWZlcnJpbmcgdG8gdGhlIHNhbWUKLSAgICAgICAgIHJlZ2lzdGVyIGxvYWQuICAqLwotICAgICAgZm9yIChpcmVsc2NhbiA9IGludGVybmFsX3JlbG9jczsgaXJlbHNjYW4gPCBpcmVsZW5kOyBpcmVsc2NhbisrKQotCWlmIChpcmVsc2Nhbi0+cl90eXBlID09IFJfU0hfVVNFUwotCSAgICAmJiBsYWRkciA9PSBpcmVsc2Nhbi0+cl92YWRkciAtIHNlYy0+dm1hICsgNCArIGlyZWxzY2FuLT5yX29mZnNldCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWxzY2FuIDwgaXJlbGVuZCkKLQl7Ci0JICAvKiBTb21lIG90aGVyIGZ1bmN0aW9uIGNhbGwgZGVwZW5kcyB1cG9uIHRoaXMgcmVnaXN0ZXIgbG9hZCwKLQkgICAgIGFuZCB3ZSBoYXZlIG5vdCB5ZXQgY29udmVydGVkIHRoYXQgZnVuY3Rpb24gY2FsbC4KLQkgICAgIEluZGVlZCwgd2UgbWF5IG5ldmVyIGJlIGFibGUgdG8gY29udmVydCBpdC4gIFRoZXJlIGlzCi0JICAgICBub3RoaW5nIGVsc2Ugd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciBhIFJfU0hfQ09VTlQgcmVsb2Mgb24gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZQotICAgICAgICAgZnVuY3Rpb24gYWRkcmVzcyBpcyBzdG9yZWQuICBEbyB0aGlzIGJlZm9yZSBkZWxldGluZyBhbnkKLSAgICAgICAgIGJ5dGVzLCB0byBhdm9pZCBjb25mdXNpb24gYWJvdXQgdGhlIGFkZHJlc3MuICAqLwotICAgICAgZm9yIChpcmVsY291bnQgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxjb3VudCA8IGlyZWxlbmQ7IGlyZWxjb3VudCsrKQotCWlmIChpcmVsY291bnQtPnJfdmFkZHIgPT0gcGFkZHIKLQkgICAgJiYgaXJlbGNvdW50LT5yX3R5cGUgPT0gUl9TSF9DT1VOVCkKLQkgIGJyZWFrOwotCi0gICAgICAvKiBEZWxldGUgdGhlIHJlZ2lzdGVyIGxvYWQuICAqLwotICAgICAgaWYgKCEgc2hfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGxhZGRyLCAyKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCBqdXN0IGluIGNhc2UgaXQgcGVybWl0cyBzb21lCi0gICAgICAgICBvdGhlciBmdW5jdGlvbiBjYWxsIHRvIGNvbWUgd2l0aGluIHJhbmdlLCB3ZSBzaG91bGQgcmVsYXgKLSAgICAgICAgIGFnYWluLiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotICAgICAgKmFnYWluID0gdHJ1ZTsKLQotICAgICAgLyogTm93IGNoZWNrIHdoZXRoZXIgd2UgZ290IGEgQ09VTlQgcmVsb2MuICAqLwotICAgICAgaWYgKGlyZWxjb3VudCA+PSBpcmVsZW5kKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoIiVzOiAweCVseDogd2FybmluZzogY291bGQgbm90IGZpbmQgZXhwZWN0ZWQgQ09VTlQgcmVsb2MiLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBudW1iZXIgb2YgdXNlcyBpcyBzdG9yZWQgaW4gdGhlIHJfb2Zmc2V0IGZpZWxkLiAgV2UndmUKLSAgICAgICAgIGp1c3QgZGVsZXRlZCBvbmUuICAqLwotICAgICAgaWYgKGlyZWxjb3VudC0+cl9vZmZzZXQgPT0gMCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgY291bnQiLAotCQkJCSAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJICAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLS1pcmVsY291bnQtPnJfb2Zmc2V0OwotCi0gICAgICAvKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSB1c2VzLCB3ZSBjYW4gZGVsZXRlIHRoZSBhZGRyZXNzLiAgUmVsb2FkCi0gICAgICAgICB0aGUgYWRkcmVzcyBmcm9tIGlyZWxmbiwgaW4gY2FzZSBpdCB3YXMgY2hhbmdlZCBieSB0aGUKLSAgICAgICAgIHByZXZpb3VzIGNhbGwgdG8gc2hfcmVsYXhfZGVsZXRlX2J5dGVzLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQtPnJfb2Zmc2V0ID09IDApCi0JewotCSAgaWYgKCEgc2hfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJICAgICAgIGlyZWxmbi0+cl92YWRkciAtIHNlYy0+dm1hLCA0KSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBXZSd2ZSBkb25lIGFsbCB3ZSBjYW4gd2l0aCB0aGF0IGZ1bmN0aW9uIGNhbGwuICAqLwotICAgIH0KLQotICAvKiBMb29rIGZvciBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgdGhhdCB3ZSBjYW4gYWxpZ24gb24gZm91cgotICAgICBieXRlIGJvdW5kYXJpZXMuICAqLwotICBpZiAoaGF2ZV9jb2RlKQotICAgIHsKLSAgICAgIGJvb2xlYW4gc3dhcHBlZDsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMCi0JICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgc2hfYWxpZ25fbG9hZHMgKGFiZmQsIHNlYywgaW50ZXJuYWxfcmVsb2NzLCBjb250ZW50cywgJnN3YXBwZWQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc3dhcHBlZCkKLQl7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNlYy0+dXNlZF9ieV9iZmQgPQotCQkoKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSkpOwotCSAgICAgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+a2VlcF9yZWxvY3MgPSB0cnVlOwotCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPSBjb250ZW50czsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5rZWVwX2NvbnRlbnRzID0gdHJ1ZTsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBjb2ZmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2VjLT51c2VkX2J5X2JmZCA9Ci0JCSgoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0JICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyA9IE5VTEw7Ci0JICAgIH0KLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWRkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsLCAqaXJlbGVuZDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsYWxpZ247Ci0gIGJmZF92bWEgdG9hZGRyOwotICBiZmRfYnl0ZSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHM7Ci0KLSAgLyogVGhlIGRlbGV0aW9uIG11c3Qgc3RvcCBhdCB0aGUgbmV4dCBBTElHTiByZWxvYyBmb3IgYW4gYWxpZ21lbnQKLSAgICAgcG93ZXIgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgZGVsZXRpbmcuICAqLwotCi0gIGlyZWxhbGlnbiA9IE5VTEw7Ci0gIHRvYWRkciA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gIGlyZWwgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzOwotICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9BTElHTgotCSAgJiYgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID4gYWRkcgotCSAgJiYgY291bnQgPCAoMSA8PCBpcmVsLT5yX29mZnNldCkpCi0JewotCSAgaXJlbGFsaWduID0gaXJlbDsKLQkgIHRvYWRkciA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0gIG1lbW1vdmUgKGNvbnRlbnRzICsgYWRkciwgY29udGVudHMgKyBhZGRyICsgY291bnQsIHRvYWRkciAtIGFkZHIgLSBjb3VudCk7Ci0gIGlmIChpcmVsYWxpZ24gPT0gTlVMTCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSAtPSBjb3VudDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0jZGVmaW5lIE5PUF9PUENPREUgKDB4MDAwOSkKLQotICAgICAgQkZEX0FTU0VSVCAoKGNvdW50ICYgMSkgPT0gMCk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMikKLQliZmRfcHV0XzE2IChhYmZkLCBOT1BfT1BDT0RFLCBjb250ZW50cyArIHRvYWRkciAtIGNvdW50ICsgaSk7Ci0gICAgfQotCi0gIC8qIEFkanVzdCBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAoaXJlbCA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBucmFkZHIsIHN0b3A7Ci0gICAgICBiZmRfdm1hIHN0YXJ0ID0gMDsKLSAgICAgIGludCBpbnNuID0gMDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotICAgICAgaW50IG9mZiwgYWRqdXN0LCBvaW5zbjsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHZvZmYgPSAwOwotICAgICAgYm9vbGVhbiBvdmVyZmxvdzsKLQotICAgICAgLyogR2V0IHRoZSBuZXcgcmVsb2MgYWRkcmVzcy4gICovCi0gICAgICBucmFkZHIgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0gICAgICBpZiAoKGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA+IGFkZHIKLQkgICAmJiBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPCB0b2FkZHIpCi0JICB8fCAoaXJlbC0+cl90eXBlID09IFJfU0hfQUxJR04KLQkgICAgICAmJiBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPT0gdG9hZGRyKSkKLQlucmFkZHIgLT0gY291bnQ7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIHJlbG9jIHdhcyBmb3IgdGhlIGJ5dGVzIHdlIGhhdmUgZGVsZXRlZCwgaW4gd2hpY2gKLQkgY2FzZSB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCBpdC4gIERvbid0IGRlbGV0ZSByZWxvY3Mgd2hpY2gKLQkgcmVwcmVzZW50IGFkZHJlc3NlcywgdGhvdWdoLiAgKi8KLSAgICAgIGlmIChpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPj0gYWRkcgotCSAgJiYgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hIDwgYWRkciArIGNvdW50Ci0JICAmJiBpcmVsLT5yX3R5cGUgIT0gUl9TSF9BTElHTgotCSAgJiYgaXJlbC0+cl90eXBlICE9IFJfU0hfQ09ERQotCSAgJiYgaXJlbC0+cl90eXBlICE9IFJfU0hfREFUQQotCSAgJiYgaXJlbC0+cl90eXBlICE9IFJfU0hfTEFCRUwpCi0JaXJlbC0+cl90eXBlID0gUl9TSF9VTlVTRUQ7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgc2VlIGlmIHRoZSByYW5nZSBpdCBjb3ZlcnMKLSAgICAgICAgIGluY2x1ZGVzIHRoZSBieXRlcyB3ZSBoYXZlIGRlbGV0ZWQuICAqLwotICAgICAgc3dpdGNoIChpcmVsLT5yX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9QQ0RJU1A4QlkyOgotCWNhc2UgUl9TSF9QQ0RJU1A6Ci0JY2FzZSBSX1NIX1BDUkVMSU1NOEJZMjoKLQljYXNlIFJfU0hfUENSRUxJTU04Qlk0OgotCSAgc3RhcnQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0JICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGlyZWwtPnJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9JTU0zMjoKLQkgIC8qIElmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIHRoaXMKLSAgICAgICAgICAgICBzZWN0aW9uLCBhbmQgdGhlIHN5bWJvbCB3aWxsIG5vdCBiZSBhZGp1c3RlZCBiZWxvdywgd2UKLSAgICAgICAgICAgICBtdXN0IGNoZWNrIHRoZSBhZGRlbmQgdG8gc2VlIGl0IHdpbGwgcHV0IHRoZSB2YWx1ZSBpbgotICAgICAgICAgICAgIHJhbmdlIHRvIGJlIGFkanVzdGVkLCBhbmQgaGVuY2UgbXVzdCBiZSBjaGFuZ2VkLiAgKi8KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLAotCQkJCSgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKLQkJCQkgKyAoaXJlbC0+cl9zeW1uZHgKLQkJCQkgICAgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSksCi0JCQkJJnN5bSk7Ci0JICBpZiAoc3ltLm5fc2NsYXNzICE9IENfRVhUCi0JICAgICAgJiYgc3ltLm5fc2NudW0gPT0gc2VjLT50YXJnZXRfaW5kZXgKLQkgICAgICAmJiAoKGJmZF92bWEpIHN5bS5uX3ZhbHVlIDw9IGFkZHIKLQkJICB8fCAoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPj0gdG9hZGRyKSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIHZhbCArPSBzeW0ubl92YWx1ZTsKLQkgICAgICBpZiAodmFsID4gYWRkciAmJiB2YWwgPCB0b2FkZHIpCi0JCWJmZF9wdXRfMzIgKGFiZmQsIHZhbCAtIGNvdW50LCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgIH0KLQkgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9QQ0RJU1A4QlkyOgotCSAgb2ZmID0gaW5zbiAmIDB4ZmY7Ci0JICBpZiAob2ZmICYgMHg4MCkKLQkgICAgb2ZmIC09IDB4MTAwOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIDQgKyBvZmYgKiAyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1BDRElTUDoKLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLAotCQkJCSgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKLQkJCQkgKyAoaXJlbC0+cl9zeW1uZHgKLQkJCQkgICAgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSksCi0JCQkJJnN5bSk7Ci0JICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUKQotCSAgICBzdGFydCA9IHN0b3AgPSBhZGRyOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb2ZmID0gaW5zbiAmIDB4ZmZmOwotCSAgICAgIGlmIChvZmYgJiAweDgwMCkKLQkJb2ZmIC09IDB4MTAwMDsKLQkgICAgICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgNCArIG9mZiAqIDIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9QQ1JFTElNTThCWTI6Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIHN0b3AgPSBzdGFydCArIDQgKyBvZmYgKiAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfUENSRUxJTU04Qlk0OgotCSAgb2ZmID0gaW5zbiAmIDB4ZmY7Ci0JICBzdG9wID0gKHN0YXJ0ICZ+IChiZmRfdm1hKSAzKSArIDQgKyBvZmYgKiA0OwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfU1dJVENIODoKLQljYXNlIFJfU0hfU1dJVENIMTY6Ci0JY2FzZSBSX1NIX1NXSVRDSDMyOgotCSAgLyogVGhlc2UgcmVsb2NzIHR5cGVzIHJlcHJlc2VudAotCSAgICAgICAud29yZCBMMi1MMQotCSAgICAgVGhlIHJfb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jCi0JICAgICBhZGRyZXNzIGFuZCBMMS4gIFRoYXQgaXMgdGhlIHN0YXJ0IG9mIHRoZSByZWxvYywgYW5kCi0JICAgICBhZGRpbmcgaW4gdGhlIGNvbnRlbnRzIGdpdmVzIHVzIHRoZSB0b3AuICBXZSBtdXN0IGFkanVzdAotCSAgICAgYm90aCB0aGUgcl9vZmZzZXQgZmllbGQgYW5kIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLQotCSAgc3RhcnQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0IC0gKGxvbmcpIGlyZWwtPnJfb2Zmc2V0KTsKLQotCSAgaWYgKHN0YXJ0ID4gYWRkcgotCSAgICAgICYmIHN0YXJ0IDwgdG9hZGRyCi0JICAgICAgJiYgKHN0b3AgPD0gYWRkciB8fCBzdG9wID49IHRvYWRkcikpCi0JICAgIGlyZWwtPnJfb2Zmc2V0ICs9IGNvdW50OwotCSAgZWxzZSBpZiAoc3RvcCA+IGFkZHIKLQkJICAgJiYgc3RvcCA8IHRvYWRkcgotCQkgICAmJiAoc3RhcnQgPD0gYWRkciB8fCBzdGFydCA+PSB0b2FkZHIpKQotCSAgICBpcmVsLT5yX29mZnNldCAtPSBjb3VudDsKLQotCSAgc3RhcnQgPSBzdG9wOwotCi0JICBpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfU1dJVENIMTYpCi0JICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgZWxzZSBpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfU1dJVENIOCkKLQkgICAgdm9mZiA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgZWxzZQotCSAgICB2b2ZmID0gYmZkX2dldF9zaWduZWRfMzIgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyB2b2ZmKTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfVVNFUzoKLQkgIHN0YXJ0ID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydAotCQkJICAgICsgKGxvbmcpIGlyZWwtPnJfb2Zmc2V0Ci0JCQkgICAgKyA0KTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHN0YXJ0ID4gYWRkcgotCSAgJiYgc3RhcnQgPCB0b2FkZHIKLQkgICYmIChzdG9wIDw9IGFkZHIgfHwgc3RvcCA+PSB0b2FkZHIpKQotCWFkanVzdCA9IGNvdW50OwotICAgICAgZWxzZSBpZiAoc3RvcCA+IGFkZHIKLQkgICAgICAgJiYgc3RvcCA8IHRvYWRkcgotCSAgICAgICAmJiAoc3RhcnQgPD0gYWRkciB8fCBzdGFydCA+PSB0b2FkZHIpKQotCWFkanVzdCA9IC0gY291bnQ7Ci0gICAgICBlbHNlCi0JYWRqdXN0ID0gMDsKLQotICAgICAgaWYgKGFkanVzdCAhPSAwKQotCXsKLQkgIG9pbnNuID0gaW5zbjsKLQkgIG92ZXJmbG93ID0gZmFsc2U7Ci0JICBzd2l0Y2ggKGlyZWwtPnJfdHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ0RJU1A4QlkyOgotCSAgICBjYXNlIFJfU0hfUENSRUxJTU04QlkyOgotCSAgICAgIGluc24gKz0gYWRqdXN0IC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1BDRElTUDoKLQkgICAgICBpbnNuICs9IGFkanVzdCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZjAwMCkgIT0gKGluc24gJiAweGYwMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ1JFTElNTThCWTQ6Ci0JICAgICAgQkZEX0FTU0VSVCAoYWRqdXN0ID09IGNvdW50IHx8IGNvdW50ID49IDQpOwotCSAgICAgIGlmIChjb3VudCA+PSA0KQotCQlpbnNuICs9IGFkanVzdCAvIDQ7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKChpcmVsLT5yX3ZhZGRyICYgMykgPT0gMCkKLQkJICAgICsraW5zbjsKLQkJfQotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfU1dJVENIODoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBpZiAodm9mZiA8IDAgfHwgdm9mZiA+PSAweGZmKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCB2b2ZmLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1NXSVRDSDE2OgotCSAgICAgIHZvZmYgKz0gYWRqdXN0OwotCSAgICAgIGlmICh2b2ZmIDwgLSAweDgwMDAgfHwgdm9mZiA+PSAweDgwMDApCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0X3NpZ25lZF8xNiAoYWJmZCwgdm9mZiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9TV0lUQ0gzMjoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBiZmRfcHV0X3NpZ25lZF8zMiAoYWJmZCwgdm9mZiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9VU0VTOgotCSAgICAgIGlyZWwtPnJfb2Zmc2V0ICs9IGFkanVzdDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAob3ZlcmZsb3cpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgICgiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlyZWwtPnJfdmFkZHIgPSBucmFkZHIgKyBzZWMtPnZtYTsKLSAgICB9Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgb3RoZXIgc2VjdGlvbnMuICBJZiB0aGVyZSBjb250YWluIGFueSBJTU0zMgotICAgICByZWxvY3MgYWdhaW5zdCBpbnRlcm5hbCBzeW1ib2xzIHdoaWNoIHdlIGFyZSBub3QgZ29pbmcgdG8gYWRqdXN0Ci0gICAgIGJlbG93LCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlIGFkZGVuZHMuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbHNjYW4sICppcmVsc2NhbmVuZDsKLSAgICAgIGJmZF9ieXRlICpvY29udGVudHM7Ci0KLSAgICAgIGlmIChvID09IHNlYwotCSAgfHwgKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICB8fCBvLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHJlbG9jcy4gIFBlcmhhcHMsIGlmIGluZm8tPmtlZXBfbWVtb3J5IGlzCi0gICAgICAgICBmYWxzZSwgd2Ugc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywgd2hlbiB3ZQotICAgICAgICAgbGVhdmUgc2hfY29mZl9yZWxheF9zZWN0aW9uLiAgKi8KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLQkJCSAoYWJmZCwgbywgdHJ1ZSwgKGJmZF9ieXRlICopIE5VTEwsIGZhbHNlLAotCQkJICAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIG9jb250ZW50cyA9IE5VTEw7Ci0gICAgICBpcmVsc2NhbmVuZCA9IGludGVybmFsX3JlbG9jcyArIG8tPnJlbG9jX2NvdW50OwotICAgICAgZm9yIChpcmVsc2NhbiA9IGludGVybmFsX3JlbG9jczsgaXJlbHNjYW4gPCBpcmVsc2NhbmVuZDsgaXJlbHNjYW4rKykKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLQotCSAgaWYgKGlyZWxzY2FuLT5yX3R5cGUgIT0gUl9TSF9JTU0zMikKLQkgICAgY29udGludWU7Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLAotCQkJCSgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKLQkJCQkgKyAoaXJlbHNjYW4tPnJfc3ltbmR4Ci0JCQkJICAgICogYmZkX2NvZmZfc3ltZXN6IChhYmZkKSkpLAotCQkJCSZzeW0pOwotCSAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVAotCSAgICAgICYmIHN5bS5uX3NjbnVtID09IHNlYy0+dGFyZ2V0X2luZGV4Ci0JICAgICAgJiYgKChiZmRfdm1hKSBzeW0ubl92YWx1ZSA8PSBhZGRyCi0JCSAgfHwgKGJmZF92bWEpIHN5bS5uX3ZhbHVlID49IHRvYWRkcikpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHZhbDsKLQotCSAgICAgIGlmIChvY29udGVudHMgPT0gTlVMTCkKLQkJewotCQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmNvbnRlbnRzICE9IE5VTEwpCi0JCSAgICBvY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmNvbnRlbnRzOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogV2UgYWx3YXlzIGNhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmhhcHMsIGlmIGluZm8tPmtlZXBfbWVtb3J5IGlzIGZhbHNlLCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBmcmVlIHRoZW0sIGlmIHdlIGFyZSBwZXJtaXR0ZWQgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB3ZSBsZWF2ZSBzaF9jb2ZmX3JlbGF4X3NlY3Rpb24uICAqLwotCQkgICAgICBvY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoby0+X3Jhd19zaXplKTsKLQkJICAgICAgaWYgKG9jb250ZW50cyA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8sIG9jb250ZW50cywKLQkJCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkJCSAgICAgIG8tPl9yYXdfc2l6ZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+Y29udGVudHMgPSBvY29udGVudHM7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX3ZhZGRyIC0gby0+dm1hKTsKLQkgICAgICB2YWwgKz0gc3ltLm5fdmFsdWU7Ci0JICAgICAgaWYgKHZhbCA+IGFkZHIgJiYgdmFsIDwgdG9hZGRyKQotCQliZmRfcHV0XzMyIChhYmZkLCB2YWwgLSBjb3VudCwKLQkJCSAgICBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl92YWRkciAtIG8tPnZtYSk7Ci0KLQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmtlZXBfY29udGVudHMgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBBZGp1c3RpbmcgdGhlIGludGVybmFsIHN5bWJvbHMgd2lsbCBub3Qgd29yayBpZiBzb21ldGhpbmcgaGFzCi0gICAgIGFscmVhZHkgcmV0cmlldmVkIHRoZSBnZW5lcmljIHN5bWJvbHMuICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0bwotICAgICBtYWtlIHRoaXMgd29yayBieSBhZGp1c3RpbmcgdGhlIGdlbmVyaWMgc3ltYm9scyBhdCB0aGUgc2FtZSB0aW1lLgotICAgICBIb3dldmVyLCB0aGlzIGNhc2Ugc2hvdWxkIG5vdCBhcmlzZSBpbiBub3JtYWwgdXNhZ2UuICAqLwotICBpZiAob2JqX3N5bWJvbHMgKGFiZmQpICE9IE5VTEwKLSAgICAgIHx8IG9ial9yYXdfc3ltZW50cyAoYWJmZCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgKCIlczogZmF0YWw6IGdlbmVyaWMgc3ltYm9scyByZXRyaWV2ZWQgYmVmb3JlIHJlbGF4aW5nIiwKLQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgc3ltYm9scy4gICovCi0gIHN5bV9oYXNoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIGVzeW1lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6OwotICB3aGlsZSAoZXN5bSA8IGVzeW1lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5uX3NjbnVtID09IHNlYy0+dGFyZ2V0X2luZGV4Ci0JICAmJiAoYmZkX3ZtYSkgaXN5bS5uX3ZhbHVlID4gYWRkcgotCSAgJiYgKGJmZF92bWEpIGlzeW0ubl92YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICBpc3ltLm5fdmFsdWUgLT0gY291bnQ7Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmlzeW0sIChQVFIpIGVzeW0pOwotCi0JICBpZiAoKnN5bV9oYXNoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUICgoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICB8fCAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0JICAgICAgQkZEX0FTU0VSVCAoKCpzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPj0gYWRkcgotCQkJICAmJiAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA8IHRvYWRkcik7Ci0JICAgICAgKCpzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgLT0gY291bnQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVzeW0gKz0gKGlzeW0ubl9udW1hdXggKyAxKSAqIHN5bWVzejsKLSAgICAgIHN5bV9oYXNoICs9IGlzeW0ubl9udW1hdXggKyAxOwotICAgIH0KLQotICAvKiBTZWUgaWYgd2UgY2FuIG1vdmUgdGhlIEFMSUdOIHJlbG9jIGZvcndhcmQuICBXZSBoYXZlIGFkanVzdGVkCi0gICAgIHJfdmFkZHIgZm9yIGl0IGFscmVhZHkuICAqLwotICBpZiAoaXJlbGFsaWduICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3ZtYSBhbGlnbnRvLCBhbGlnbmFkZHI7Ci0KLSAgICAgIGFsaWdudG8gPSBCRkRfQUxJR04gKHRvYWRkciwgMSA8PCBpcmVsYWxpZ24tPnJfb2Zmc2V0KTsKLSAgICAgIGFsaWduYWRkciA9IEJGRF9BTElHTiAoaXJlbGFsaWduLT5yX3ZhZGRyIC0gc2VjLT52bWEsCi0JCQkgICAgIDEgPDwgaXJlbGFsaWduLT5yX29mZnNldCk7Ci0gICAgICBpZiAoYWxpZ250byAhPSBhbGlnbmFkZHIpCi0JewotCSAgLyogVGFpbCByZWN1cnNpb24uICAqLwotCSAgcmV0dXJuIHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhbGlnbmFkZHIsCi0JCQkJCWFsaWdudG8gLSBhbGlnbmFkZHIpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGlzIGlzIHlldCBhbm90aGVyIHZlcnNpb24gb2YgdGhlIFNIIG9wY29kZSB0YWJsZSwgdXNlZCB0byByYXBpZGx5Ci0gICBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIGluc3RydWN0aW9uLiAgKi8KLQotLyogVGhlIG9wY29kZSBtYXAgaXMgcmVwcmVzZW50ZWQgYnkgYW4gYXJyYXkgb2YgdGhlc2Ugc3RydWN0dXJlcy4gIFRoZQotICAgYXJyYXkgaXMgaW5kZXhlZCBieSB0aGUgaGlnaCBvcmRlciBmb3VyIGJpdHMgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLQotc3RydWN0IHNoX21ham9yX29wY29kZQotewotICAvKiBBIHBvaW50ZXIgdG8gdGhlIGluc3RydWN0aW9uIGxpc3QuICBUaGlzIGlzIGFuIGFycmF5IHdoaWNoCi0gICAgIGNvbnRhaW5zIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIHdpdGggdGhpcyBtYWpvciBvcGNvZGUuICAqLwotICBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlICptaW5vcl9vcGNvZGVzOwotICAvKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIG1pbm9yX29wY29kZXMuICAqLwotICB1bnNpZ25lZCBzaG9ydCBjb3VudDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhIHNldCBvZiBTSCBvcGNvZGVzLiAgVGhlCi0gICBpbnN0cnVjdGlvbiBjb2RlIGlzIGFuZGVkIHdpdGggdGhlIG1hc2sgdmFsdWUsIGFuZCB0aGUgcmVzdWx0aW5nCi0gICB2YWx1ZSBpcyB1c2VkIHRvIHNlYXJjaCB0aGUgb3JkZXIgb3Bjb2RlIGxpc3QuICAqLwotCi1zdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlCi17Ci0gIC8qIFRoZSBzb3J0ZWQgb3Bjb2RlIGxpc3QuICAqLwotICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcGNvZGVzOwotICAvKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIG9wY29kZXMuICAqLwotICB1bnNpZ25lZCBzaG9ydCBjb3VudDsKLSAgLyogVGhlIG1hc2sgdmFsdWUgdG8gdXNlIHdoZW4gc2VhcmNoaW5nIHRoZSBvcGNvZGUgbGlzdC4gICovCi0gIHVuc2lnbmVkIHNob3J0IG1hc2s7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYW4gU0ggaW5zdHJ1Y3Rpb24uICBBbiBhcnJheQotICAgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyBzb3J0ZWQgaW4gb3JkZXIgYnkgb3Bjb2RlLiAgKi8KLQotc3RydWN0IHNoX29wY29kZQotewotICAvKiBUaGUgY29kZSBmb3IgdGhpcyBpbnN0cnVjdGlvbiwgYWZ0ZXIgaXQgaGFzIGJlZW4gYW5kZWQgd2l0aCB0aGUKLSAgICAgbWFzayB2YWx1ZSBpbiB0aGUgc2hfbWFqb3Jfb3Bjb2RlIHN0cnVjdHVyZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IG9wY29kZTsKLSAgLyogRmxhZ3MgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotICB1bnNpZ25lZCBzaG9ydCBmbGFnczsKLX07Ci0KLS8qIEZsYWcgd2hpY2ggYXBwZWFyIGluIHRoZSBzaF9vcGNvZGUgc3RydWN0dXJlLiAgKi8KLQotLyogVGhpcyBpbnN0cnVjdGlvbiBsb2FkcyBhIHZhbHVlIGZyb20gbWVtb3J5LiAgKi8KLSNkZWZpbmUgTE9BRCAoMHgxKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHN0b3JlcyBhIHZhbHVlIHRvIG1lbW9yeS4gICovCi0jZGVmaW5lIFNUT1JFICgweDIpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2guICAqLwotI2RlZmluZSBCUkFOQ0ggKDB4NCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBoYXMgYSBkZWxheSBzbG90LiAgKi8KLSNkZWZpbmUgREVMQVkgKDB4OCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MGYwMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVU0VTMSAoMHgxMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MDBmMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVU0VTMiAoMHgyMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSB2YWx1ZSBpbiByZWdpc3RlciAwLiAgKi8KLSNkZWZpbmUgVVNFU1IwICgweDQwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgdGhlIHZhbHVlIGluIHRoZSByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwZjAwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNFVFMxICgweDgwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgdGhlIHZhbHVlIGluIHRoZSByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwMGYwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNFVFMyICgweDEwMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIHJlZ2lzdGVyIDAuICAqLwotI2RlZmluZSBTRVRTUjAgKDB4MjAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgYSBzcGVjaWFsIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgU0VUU1NQICgweDQwMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIGEgc3BlY2lhbCByZWdpc3Rlci4gICovCi0jZGVmaW5lIFVTRVNTUCAoMHg4MDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MGYwMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVU0VTRjEgKDB4MTAwMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwMGYwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFVTRVNGMiAoMHgyMDAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgMC4gICovCi0jZGVmaW5lIFVTRVNGMCAoMHg0MDAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDBmMDAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0VUU0YxICgweDgwMDApCi0KLXN0YXRpYyBib29sZWFuIHNoX2luc25fdXNlc19yZWcKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfaW5zbl91c2VzX2ZyZWcKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfaW5zbnNfY29uZmxpY3QKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCwKLQkgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2xvYWRfdXNlCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqLCB1bnNpZ25lZCBpbnQsCi0JICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqKSk7Ci0KLS8qIFRoZSBvcGNvZGUgbWFwcy4gICovCi0KLSNkZWZpbmUgTUFQKGEpIGEsIHNpemVvZiBhIC8gc2l6ZW9mIGFbMF0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMDBbXSA9Ci17Ci0gIHsgMHgwMDA4LCBTRVRTU1AgfSwJCQkvKiBjbHJ0ICovCi0gIHsgMHgwMDA5LCAwIH0sCQkJLyogbm9wICovCi0gIHsgMHgwMDBiLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVNTUCB9LAkvKiBydHMgKi8KLSAgeyAweDAwMTgsIFNFVFNTUCB9LAkJCS8qIHNldHQgKi8KLSAgeyAweDAwMTksIFNFVFNTUCB9LAkJCS8qIGRpdjB1ICovCi0gIHsgMHgwMDFiLCAwIH0sCQkJLyogc2xlZXAgKi8KLSAgeyAweDAwMjgsIFNFVFNTUCB9LAkJCS8qIGNscm1hYyAqLwotICB7IDB4MDAyYiwgQlJBTkNIIHwgREVMQVkgfCBTRVRTU1AgfSwJLyogcnRlICovCi0gIHsgMHgwMDM4LCBVU0VTU1AgfCBTRVRTU1AgfSwJCS8qIGxkdGxiICovCi0gIHsgMHgwMDQ4LCBTRVRTU1AgfSwJCQkvKiBjbHJzICovCi0gIHsgMHgwMDU4LCBTRVRTU1AgfQkJCS8qIHNldHMgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTAxW10gPQotewotICB7IDB4MDAwMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgc3Iscm4gKi8KLSAgeyAweDAwMDMsIEJSQU5DSCB8IERFTEFZIHwgVVNFUzEgfCBTRVRTU1AgfSwJLyogYnNyZiBybiAqLwotICB7IDB4MDAwYSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdHMgbWFjaCxybiAqLwotICB7IDB4MDAxMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgZ2JyLHJuICovCi0gIHsgMHgwMDFhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBtYWNsLHJuICovCi0gIHsgMHgwMDIyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyB2YnIscm4gKi8KLSAgeyAweDAwMjMsIEJSQU5DSCB8IERFTEFZIHwgVVNFUzEgfSwJCS8qIGJyYWYgcm4gKi8KLSAgeyAweDAwMjksIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogbW92dCBybiAqLwotICB7IDB4MDAyYSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdHMgcHIscm4gKi8KLSAgeyAweDAwMzIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHNzcixybiAqLwotICB7IDB4MDA0MiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgc3BjLHJuICovCi0gIHsgMHgwMDVhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBmcHVsLHJuICovCi0gIHsgMHgwMDZhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBmcHNjcixybiAqLwotICB7IDB4MDA4MiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjBfYmFuayxybiAqLwotICB7IDB4MDA4MywgTE9BRCB8IFVTRVMxIH0sCQkJLyogcHJlZiBAcm4gKi8KLSAgeyAweDAwOTIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHIxX2Jhbmsscm4gKi8KLSAgeyAweDAwYTIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHIyX2Jhbmsscm4gKi8KLSAgeyAweDAwYjIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHIzX2Jhbmsscm4gKi8KLSAgeyAweDAwYzIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHI0X2Jhbmsscm4gKi8KLSAgeyAweDAwZDIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHI1X2Jhbmsscm4gKi8KLSAgeyAweDAwZTIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHI2X2Jhbmsscm4gKi8KLSAgeyAweDAwZjIsIFNFVFMxIHwgVVNFU1NQIH0JCQkvKiBzdGMgcjdfYmFuayxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMDJbXSA9Ci17Ci0gIHsgMHgwMDA0LCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LmIgcm0sQChyMCxybikgKi8KLSAgeyAweDAwMDUsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YudyBybSxAKHIwLHJuKSAqLwotICB7IDB4MDAwNiwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5sIHJtLEAocjAscm4pICovCi0gIHsgMHgwMDA3LCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBtdWwubCBybSxybiAqLwotICB7IDB4MDAwYywgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LmIgQChyMCxybSkscm4gKi8KLSAgeyAweDAwMGQsIExPQUQgfCBTRVRTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi53IEAocjAscm0pLHJuICovCi0gIHsgMHgwMDBlLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YubCBAKHIwLHJtKSxybiAqLwotICB7IDB4MDAwZiwgTE9BRHxTRVRTMXxTRVRTMnxTRVRTU1B8VVNFUzF8VVNFUzJ8VVNFU1NQIH0sIC8qIG1hYy5sIEBybSssQHJuKyAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlMFtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTAwKSwgMHhmZmZmIH0sCi0gIHsgTUFQIChzaF9vcGNvZGUwMSksIDB4ZjBmZiB9LAotICB7IE1BUCAoc2hfb3Bjb2RlMDIpLCAweGYwMGYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMTBbXSA9Ci17Ci0gIHsgMHgxMDAwLCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfQkvKiBtb3YubCBybSxAKGRpc3Ascm4pICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGUxW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlMTApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMjBbXSA9Ci17Ci0gIHsgMHgyMDAwLCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG1vdi5iIHJtLEBybiAqLwotICB7IDB4MjAwMSwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBtb3YudyBybSxAcm4gKi8KLSAgeyAweDIwMDIsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogbW92Lmwgcm0sQHJuICovCi0gIHsgMHgyMDA0LCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkvKiBtb3YuYiBybSxALXJuICovCi0gIHsgMHgyMDA1LCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkvKiBtb3YudyBybSxALXJuICovCi0gIHsgMHgyMDA2LCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkvKiBtb3YubCBybSxALXJuICovCi0gIHsgMHgyMDA3LCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1NQIH0sCS8qIGRpdjBzICovCi0gIHsgMHgyMDA4LCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiB0c3Qgcm0scm4gKi8KLSAgeyAweDIwMDksIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogYW5kIHJtLHJuICovCi0gIHsgMHgyMDBhLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIHhvciBybSxybiAqLwotICB7IDB4MjAwYiwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBvciBybSxybiAqLwotICB7IDB4MjAwYywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL3N0ciBybSxybiAqLwotICB7IDB4MjAwZCwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiB4dHJjdCBybSxybiAqLwotICB7IDB4MjAwZSwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogbXVsdS53IHJtLHJuICovCi0gIHsgMHgyMDBmLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0JCS8qIG11bHMudyBybSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlMltdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTIwKSwgMHhmMDBmIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTMwW10gPQotewotICB7IDB4MzAwMCwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2VxIHJtLHJuICovCi0gIHsgMHgzMDAyLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvaHMgcm0scm4gKi8KLSAgeyAweDMwMDMsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9nZSBybSxybiAqLwotICB7IDB4MzAwNCwgU0VUU1NQIHwgVVNFU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkvKiBkaXYxIHJtLHJuICovCi0gIHsgMHgzMDA1LCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBkbXVsdS5sIHJtLHJuICovCi0gIHsgMHgzMDA2LCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvaGkgcm0scm4gKi8KLSAgeyAweDMwMDcsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9ndCBybSxybiAqLwotICB7IDB4MzAwOCwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBzdWIgcm0scm4gKi8KLSAgeyAweDMwMGEsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNTUCB9LCAvKiBzdWJjIHJtLHJuICovCi0gIHsgMHgzMDBiLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJLyogc3VidiBybSxybiAqLwotICB7IDB4MzAwYywgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBhZGQgcm0scm4gKi8KLSAgeyAweDMwMGQsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGRtdWxzLmwgcm0scm4gKi8KLSAgeyAweDMwMGUsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNTUCB9LCAvKiBhZGRjIHJtLHJuICovCi0gIHsgMHgzMDBmLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfQkvKiBhZGR2IHJtLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGUzW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlMzApLCAweGYwMGYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNDBbXSA9Ci17Ci0gIHsgMHg0MDAwLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiBzaGxsIHJuICovCi0gIHsgMHg0MDAxLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiBzaGxyIHJuICovCi0gIHsgMHg0MDAyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgbWFjaCxALXJuICovCi0gIHsgMHg0MDAzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgc3IsQC1ybiAqLwotICB7IDB4NDAwNCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogcm90bCBybiAqLwotICB7IDB4NDAwNSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogcm90ciBybiAqLwotICB7IDB4NDAwNiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxtYWNoICovCi0gIHsgMHg0MDA3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHNyICovCi0gIHsgMHg0MDA4LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hsbDIgcm4gKi8KLSAgeyAweDQwMDksIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxyMiBybiAqLwotICB7IDB4NDAwYSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMgcm0sbWFjaCAqLwotICB7IDB4NDAwYiwgQlJBTkNIIHwgREVMQVkgfCBVU0VTMSB9LAkJLyoganNyIEBybiAqLwotICB7IDB4NDAwZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sc3IgKi8KLSAgeyAweDQwMTAsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIGR0IHJuICovCi0gIHsgMHg0MDExLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGNtcC9weiBybiAqLwotICB7IDB4NDAxMiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIG1hY2wsQC1ybiAqLwotICB7IDB4NDAxMywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIGdicixALXJuICovCi0gIHsgMHg0MDE1LCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGNtcC9wbCBybiAqLwotICB7IDB4NDAxNiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxtYWNsICovCi0gIHsgMHg0MDE3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLGdiciAqLwotICB7IDB4NDAxOCwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobGw4IHJuICovCi0gIHsgMHg0MDE5LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hscjggcm4gKi8KLSAgeyAweDQwMWEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRzIHJtLG1hY2wgKi8KLSAgeyAweDQwMWIsIExPQUQgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogdGFzLmIgQHJuICovCi0gIHsgMHg0MDFlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSxnYnIgKi8KLSAgeyAweDQwMjAsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHNoYWwgcm4gKi8KLSAgeyAweDQwMjEsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHNoYXIgcm4gKi8KLSAgeyAweDQwMjIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBwcixALXJuICovCi0gIHsgMHg0MDIzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgdmJyLEAtcm4gKi8KLSAgeyAweDQwMjQsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogcm90Y2wgcm4gKi8KLSAgeyAweDQwMjUsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogcm90Y3Igcm4gKi8KLSAgeyAweDQwMjYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSsscHIgKi8KLSAgeyAweDQwMjcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssdmJyICovCi0gIHsgMHg0MDI4LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hsbDE2IHJuICovCi0gIHsgMHg0MDI5LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hscjE2IHJuICovCi0gIHsgMHg0MDJhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcyBybSxwciAqLwotICB7IDB4NDAyYiwgQlJBTkNIIHwgREVMQVkgfCBVU0VTMSB9LAkJLyogam1wIEBybiAqLwotICB7IDB4NDAyZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sdmJyICovCi0gIHsgMHg0MDMzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgc3NyLEAtcm4gKi8KLSAgeyAweDQwMzcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssc3NyICovCi0gIHsgMHg0MDNlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSxzc3IgKi8KLSAgeyAweDQwNDMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCBzcGMsQC1ybiAqLwotICB7IDB4NDA0NywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxzcGMgKi8KLSAgeyAweDQwNGUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLHNwYyAqLwotICB7IDB4NDA1MiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIGZwdWwsQC1ybiAqLwotICB7IDB4NDA1NiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxmcHVsICovCi0gIHsgMHg0MDVhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcy5sIHJtLGZwdWwgKi8KLSAgeyAweDQwNjIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBmcHNjcixALXJuICovCi0gIHsgMHg0MDY2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLGZwc2NyICovCi0gIHsgMHg0MDZhLCBTRVRTU1AgfCBVU0VTMSB9CQkJLyogbGRzIHJtLGZwc2NyICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU0MVtdID0KLXsKLSAgeyAweDQwODMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCByeF9iYW5rLEAtcm4gKi8KLSAgeyAweDQwODcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSsscnhfYmFuayAqLwotICB7IDB4NDA4ZSwgU0VUU1NQIHwgVVNFUzEgfQkJCS8qIGxkYyBybSxyeF9iYW5rICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU0MltdID0KLXsKLSAgeyAweDQwMGMsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJCS8qIHNoYWQgcm0scm4gKi8KLSAgeyAweDQwMGQsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJCS8qIHNobGQgcm0scm4gKi8KLSAgeyAweDQwMGYsIExPQUR8U0VUUzF8U0VUUzJ8U0VUU1NQfFVTRVMxfFVTRVMyfFVTRVNTUCB9LCAvKiBtYWMudyBAcm0rLEBybisgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTRbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU0MCksIDB4ZjBmZiB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNDEpLCAweGYwOGYgfSwKLSAgeyBNQVAgKHNoX29wY29kZTQyKSwgMHhmMDBmIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTUwW10gPQotewotICB7IDB4NTAwMCwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfQkvKiBtb3YubCBAKGRpc3Ascm0pLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU1W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlNTApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNjBbXSA9Ci17Ci0gIHsgMHg2MDAwLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB9LAkJLyogbW92LmIgQHJtLHJuICovCi0gIHsgMHg2MDAxLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB9LAkJLyogbW92LncgQHJtLHJuICovCi0gIHsgMHg2MDAyLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB9LAkJLyogbW92LmwgQHJtLHJuICovCi0gIHsgMHg2MDAzLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogbW92IHJtLHJuICovCi0gIHsgMHg2MDA0LCBMT0FEIHwgU0VUUzEgfCBTRVRTMiB8IFVTRVMyIH0sCS8qIG1vdi5iIEBybSsscm4gKi8KLSAgeyAweDYwMDUsIExPQUQgfCBTRVRTMSB8IFNFVFMyIHwgVVNFUzIgfSwJLyogbW92LncgQHJtKyxybiAqLwotICB7IDB4NjAwNiwgTE9BRCB8IFNFVFMxIHwgU0VUUzIgfCBVU0VTMiB9LAkvKiBtb3YubCBAcm0rLHJuICovCi0gIHsgMHg2MDA3LCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogbm90IHJtLHJuICovCi0gIHsgMHg2MDA4LCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogc3dhcC5iIHJtLHJuICovCi0gIHsgMHg2MDA5LCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogc3dhcC53IHJtLHJuICovCi0gIHsgMHg2MDBhLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMyIHwgVVNFU1NQIH0sCS8qIG5lZ2Mgcm0scm4gKi8KLSAgeyAweDYwMGIsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBuZWcgcm0scm4gKi8KLSAgeyAweDYwMGMsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBleHR1LmIgcm0scm4gKi8KLSAgeyAweDYwMGQsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBleHR1Lncgcm0scm4gKi8KLSAgeyAweDYwMGUsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBleHRzLmIgcm0scm4gKi8KLSAgeyAweDYwMGYsIFNFVFMxIHwgVVNFUzIgfQkJCS8qIGV4dHMudyBybSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlNltdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTYwKSwgMHhmMDBmIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTcwW10gPQotewotICB7IDB4NzAwMCwgU0VUUzEgfCBVU0VTMSB9CQkvKiBhZGQgI2ltbSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlN1tdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTcwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTgwW10gPQotewotICB7IDB4ODAwMCwgU1RPUkUgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YuYiByMCxAKGRpc3Ascm4pICovCi0gIHsgMHg4MTAwLCBTVE9SRSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi53IHIwLEAoZGlzcCxybikgKi8KLSAgeyAweDg0MDAsIExPQUQgfCBTRVRTUjAgfCBVU0VTMiB9LAkvKiBtb3YuYiBAKGRpc3Ascm0pLHIwICovCi0gIHsgMHg4NTAwLCBMT0FEIHwgU0VUU1IwIHwgVVNFUzIgfSwJLyogbW92LncgQChkaXNwLHJuKSxyMCAqLwotICB7IDB4ODgwMCwgU0VUU1NQIHwgVVNFU1IwIH0sCQkvKiBjbXAvZXEgI2ltbSxyMCAqLwotICB7IDB4ODkwMCwgQlJBTkNIIHwgVVNFU1NQIH0sCQkvKiBidCBsYWJlbCAqLwotICB7IDB4OGIwMCwgQlJBTkNIIHwgVVNFU1NQIH0sCQkvKiBiZiBsYWJlbCAqLwotICB7IDB4OGQwMCwgQlJBTkNIIHwgREVMQVkgfCBVU0VTU1AgfSwJLyogYnQvcyBsYWJlbCAqLwotICB7IDB4OGYwMCwgQlJBTkNIIHwgREVMQVkgfCBVU0VTU1AgfQkvKiBiZi9zIGxhYmVsICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU4W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlODApLCAweGZmMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlOTBbXSA9Ci17Ci0gIHsgMHg5MDAwLCBMT0FEIHwgU0VUUzEgfQkvKiBtb3YudyBAKGRpc3AscGMpLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU5W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlOTApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlYTBbXSA9Ci17Ci0gIHsgMHhhMDAwLCBCUkFOQ0ggfCBERUxBWSB9CS8qIGJyYSBsYWJlbCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlYVtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWEwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWIwW10gPQotewotICB7IDB4YjAwMCwgQlJBTkNIIHwgREVMQVkgfQkvKiBic3IgbGFiZWwgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWJbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGViMCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVjMFtdID0KLXsKLSAgeyAweGMwMDAsIFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YuYiByMCxAKGRpc3AsZ2JyKSAqLwotICB7IDB4YzEwMCwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi53IHIwLEAoZGlzcCxnYnIpICovCi0gIHsgMHhjMjAwLCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9LAkJLyogbW92LmwgcjAsQChkaXNwLGdicikgKi8KLSAgeyAweGMzMDAsIEJSQU5DSCB8IFVTRVNTUCB9LAkJCS8qIHRyYXBhICNpbW0gKi8KLSAgeyAweGM0MDAsIExPQUQgfCBTRVRTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi5iIEAoZGlzcCxnYnIpLHIwICovCi0gIHsgMHhjNTAwLCBMT0FEIHwgU0VUU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YudyBAKGRpc3AsZ2JyKSxyMCAqLwotICB7IDB4YzYwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVNTUCB9LAkJLyogbW92LmwgQChkaXNwLGdicikscjAgKi8KLSAgeyAweGM3MDAsIFNFVFNSMCB9LAkJCQkvKiBtb3ZhIEAoZGlzcCxwYykscjAgKi8KLSAgeyAweGM4MDAsIFNFVFNTUCB8IFVTRVNSMCB9LAkJCS8qIHRzdCAjaW1tLHIwICovCi0gIHsgMHhjOTAwLCBTRVRTUjAgfCBVU0VTUjAgfSwJCQkvKiBhbmQgI2ltbSxyMCAqLwotICB7IDB4Y2EwMCwgU0VUU1IwIHwgVVNFU1IwIH0sCQkJLyogeG9yICNpbW0scjAgKi8KLSAgeyAweGNiMDAsIFNFVFNSMCB8IFVTRVNSMCB9LAkJCS8qIG9yICNpbW0scjAgKi8KLSAgeyAweGNjMDAsIExPQUQgfCBTRVRTU1AgfCBVU0VTUjAgfCBVU0VTU1AgfSwJLyogdHN0LmIgI2ltbSxAKHIwLGdicikgKi8KLSAgeyAweGNkMDAsIExPQUQgfCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9LAkvKiBhbmQuYiAjaW1tLEAocjAsZ2JyKSAqLwotICB7IDB4Y2UwMCwgTE9BRCB8IFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCS8qIHhvci5iICNpbW0sQChyMCxnYnIpICovCi0gIHsgMHhjZjAwLCBMT0FEIHwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfQkvKiBvci5iICNpbW0sQChyMCxnYnIpICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVjW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlYzApLCAweGZmMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlZDBbXSA9Ci17Ci0gIHsgMHhkMDAwLCBMT0FEIHwgU0VUUzEgfQkJLyogbW92LmwgQChkaXNwLHBjKSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlZFtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWQwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWUwW10gPQotewotICB7IDB4ZTAwMCwgU0VUUzEgfQkJLyogbW92ICNpbW0scm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWVbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGVlMCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVmMFtdID0KLXsKLSAgeyAweGYwMDAsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZmFkZCBmbSxmbiAqLwotICB7IDB4ZjAwMSwgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmc3ViIGZtLGZuICovCi0gIHsgMHhmMDAyLCBTRVRTRjEgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZtdWwgZm0sZm4gKi8KLSAgeyAweGYwMDMsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZmRpdiBmbSxmbiAqLwotICB7IDB4ZjAwNCwgU0VUU1NQIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmY21wL2VxIGZtLGZuICovCi0gIHsgMHhmMDA1LCBTRVRTU1AgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZjbXAvZ3QgZm0sZm4gKi8KLSAgeyAweGYwMDYsIExPQUQgfCBTRVRTRjEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBmbW92LnMgQChyMCxybSksZm4gKi8KLSAgeyAweGYwMDcsIFNUT1JFIHwgVVNFUzEgfCBVU0VTRjIgfCBVU0VTUjAgfSwJLyogZm1vdi5zIGZtLEAocjAscm4pICovCi0gIHsgMHhmMDA4LCBMT0FEIHwgU0VUU0YxIHwgVVNFUzIgfSwJCS8qIGZtb3YucyBAcm0sZm4gKi8KLSAgeyAweGYwMDksIExPQUQgfCBTRVRTMiB8IFNFVFNGMSB8IFVTRVMyIH0sCS8qIGZtb3YucyBAcm0rLGZuICovCi0gIHsgMHhmMDBhLCBTVE9SRSB8IFVTRVMxIHwgVVNFU0YyIH0sCQkvKiBmbW92LnMgZm0sQHJuICovCi0gIHsgMHhmMDBiLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTRjIgfSwJLyogZm1vdi5zIGZtLEAtcm4gKi8KLSAgeyAweGYwMGMsIFNFVFNGMSB8IFVTRVNGMiB9LAkJCS8qIGZtb3YgZm0sZm4gKi8KLSAgeyAweGYwMGUsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB8IFVTRVNGMCB9CS8qIGZtYWMgZjAsZm0sZm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWYxW10gPQotewotICB7IDB4ZjAwZCwgU0VUU0YxIHwgVVNFU1NQIH0sCS8qIGZzdHMgZnB1bCxmbiAqLwotICB7IDB4ZjAxZCwgU0VUU1NQIHwgVVNFU0YxIH0sCS8qIGZsZHMgZm4sZnB1bCAqLwotICB7IDB4ZjAyZCwgU0VUU0YxIHwgVVNFU1NQIH0sCS8qIGZsb2F0IGZwdWwsZm4gKi8KLSAgeyAweGYwM2QsIFNFVFNTUCB8IFVTRVNGMSB9LAkvKiBmdHJjIGZuLGZwdWwgKi8KLSAgeyAweGYwNGQsIFNFVFNGMSB8IFVTRVNGMSB9LAkvKiBmbmVnIGZuICovCi0gIHsgMHhmMDVkLCBTRVRTRjEgfCBVU0VTRjEgfSwJLyogZmFicyBmbiAqLwotICB7IDB4ZjA2ZCwgU0VUU0YxIHwgVVNFU0YxIH0sCS8qIGZzcXJ0IGZuICovCi0gIHsgMHhmMDdkLCBTRVRTU1AgfCBVU0VTRjEgfSwJLyogZnRzdC9uYW4gZm4gKi8KLSAgeyAweGYwOGQsIFNFVFNGMSB9LAkJLyogZmxkaTAgZm4gKi8KLSAgeyAweGYwOWQsIFNFVFNGMSB9CQkvKiBmbGRpMSBmbiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlZltdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWYwKSwgMHhmMDBmIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVmMSksIDB4ZjBmZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21ham9yX29wY29kZSBzaF9vcGNvZGVzW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlMCkgfSwKLSAgeyBNQVAgKHNoX29wY29kZTEpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGUyKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlMykgfSwKLSAgeyBNQVAgKHNoX29wY29kZTQpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU1KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNikgfSwKLSAgeyBNQVAgKHNoX29wY29kZTcpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU4KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlOSkgfSwKLSAgeyBNQVAgKHNoX29wY29kZWEpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGViKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlYykgfSwKLSAgeyBNQVAgKHNoX29wY29kZWQpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVlKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlZikgfQotfTsKLQotLyogR2l2ZW4gYW4gaW5zdHJ1Y3Rpb24sIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcKLSAgIHNoX29wY29kZSBzdHJ1Y3R1cmUuICBSZXR1cm4gTlVMTCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90Ci0gICByZWNvZ25pemVkLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKgotc2hfaW5zbl9pbmZvIChpbnNuKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLXsKLSAgY29uc3Qgc3RydWN0IHNoX21ham9yX29wY29kZSAqbWFqOwotICBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlICptaW4sICptaW5lbmQ7Ci0KLSAgbWFqID0gJnNoX29wY29kZXNbKGluc24gJiAweGYwMDApID4+IDEyXTsKLSAgbWluID0gbWFqLT5taW5vcl9vcGNvZGVzOwotICBtaW5lbmQgPSBtaW4gKyBtYWotPmNvdW50OwotICBmb3IgKDsgbWluIDwgbWluZW5kOyBtaW4rKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbDsKLSAgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wLCAqb3BlbmQ7Ci0KLSAgICAgIGwgPSBpbnNuICYgbWluLT5tYXNrOwotICAgICAgb3AgPSBtaW4tPm9wY29kZXM7Ci0gICAgICBvcGVuZCA9IG9wICsgbWluLT5jb3VudDsKLQotICAgICAgLyogU2luY2UgdGhlIG9wY29kZXMgdGFibGVzIGFyZSBzb3J0ZWQsIHdlIGNvdWxkIHVzZSBhIGJpbmFyeQotICAgICAgICAgc2VhcmNoIGhlcmUgaWYgdGhlIGNvdW50IHdlcmUgYWJvdmUgc29tZSBjdXRvZmYgdmFsdWUuICAqLwotICAgICAgZm9yICg7IG9wIDwgb3BlbmQ7IG9wKyspCi0JaWYgKG9wLT5vcGNvZGUgPT0gbCkKLQkgIHJldHVybiBvcDsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7ICAKLX0KLQotLyogU2VlIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gdXNlcyBhIGdlbmVyYWwgcHVycG9zZSByZWdpc3Rlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9pbnNuX3VzZXNfcmVnIChpbnNuLCBvcCwgcmVnKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3A7Ci0gICAgIHVuc2lnbmVkIGludCByZWc7Ci17Ci0gIHVuc2lnbmVkIGludCBmOwotCi0gIGYgPSBvcC0+ZmxhZ3M7Ci0KLSAgaWYgKChmICYgVVNFUzEpICE9IDAKLSAgICAgICYmICgoaW5zbiAmIDB4MGYwMCkgPj4gOCkgPT0gcmVnKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYgJiBVU0VTMikgIT0gMAotICAgICAgJiYgKChpbnNuICYgMHgwMGYwKSA+PiA0KSA9PSByZWcpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVNSMCkgIT0gMAotICAgICAgJiYgcmVnID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTZWUgd2hldGhlciBhbiBpbnN0cnVjdGlvbiB1c2VzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfaW5zbl91c2VzX2ZyZWcgKGluc24sIG9wLCBmcmVnKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3A7Ci0gICAgIHVuc2lnbmVkIGludCBmcmVnOwotewotICB1bnNpZ25lZCBpbnQgZjsKLQotICBmID0gb3AtPmZsYWdzOwotCi0gIC8qIFdlIGNhbid0IHRlbGwgaWYgdGhpcyBpcyBhIGRvdWJsZS1wcmVjaXNpb24gaW5zbiwgc28ganVzdCBwbGF5IHNhZmUKLSAgICAgYW5kIGFzc3VtZSB0aGF0IGl0IG1pZ2h0IGJlLiAgU28gbm90IG9ubHkgaGF2ZSB3ZSB0ZXN0IEZSRUcgYWdhaW5zdAotICAgICBpdHNlbGYsIGJ1dCBhbHNvIGV2ZW4gRlJFRyBhZ2FpbnN0IEZSRUcrMSAtIGlmIHRoZSB1c2luZyBpbnNuIHVzZXMKLSAgICAganVzdCB0aGUgbG93IHBhcnQgb2YgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIC0gYnV0IGFsc28gYW4gb2RkCi0gICAgIEZSRUcgYWdhaW5zdCBGUkVHLTEgLSAgaWYgdGhlIHNldHRpbmcgaW5zbiBzZXRzIGp1c3QgdGhlIGxvdyBwYXJ0Ci0gICAgIG9mIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZS4KLSAgICAgU28gd2hhdCB0aGlzIGFsbCBib2lscyBkb3duIHRvIGlzIHRoYXQgd2UgaGF2ZSB0byBpZ25vcmUgdGhlIGxvd2VzdAotICAgICBiaXQgb2YgdGhlIHJlZ2lzdGVyIG51bWJlci4gICovCi0gICAgIAotICBpZiAoKGYgJiBVU0VTRjEpICE9IDAKLSAgICAgICYmICgoaW5zbiAmIDB4MGUwMCkgPj4gOCkgPT0gKGZyZWcgJiAweGUpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYgJiBVU0VTRjIpICE9IDAKLSAgICAgICYmICgoaW5zbiAmIDB4MDBlMCkgPj4gNCkgPT0gKGZyZWcgJiAweGUpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYgJiBVU0VTRjApICE9IDAKLSAgICAgICYmIGZyZWcgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGluc3RydWN0aW9ucyBJMSBhbmQgSTIgY29uZmxpY3QsIGFzc3VtaW5nIEkxIGNvbWVzCi0gICBiZWZvcmUgSTIuICBPUDEgYW5kIE9QMiBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgc2hfb3Bjb2RlIHN0cnVjdHVyZXMuCi0gICBUaGlzIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIGNvbmZsaWN0LCBvciBmYWxzZSBpZiB0aGUKLSAgIGluc3RydWN0aW9ucyBjYW4gYmUgc3dhcHBlZCBzYWZlbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfaW5zbnNfY29uZmxpY3QgKGkxLCBvcDEsIGkyLCBvcDIpCi0gICAgIHVuc2lnbmVkIGludCBpMTsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3AxOwotICAgICB1bnNpZ25lZCBpbnQgaTI7Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wMjsKLXsKLSAgdW5zaWduZWQgaW50IGYxLCBmMjsKLQotICBmMSA9IG9wMS0+ZmxhZ3M7Ci0gIGYyID0gb3AyLT5mbGFnczsKLQotICAvKiBMb2FkIG9mIGZwc2NyIGNvbmZsaWN0cyB3aXRoIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMuCi0gICAgIEZJWE1FOiBzaG91bGRuJ3QgdGVzdCByYXcgb3Bjb2RlcyBoZXJlLiAgKi8KLSAgaWYgKCgoaTEgJiAweGYwZmYpID09IDB4NDA2NiAmJiAoaTIgJiAweGYwMDApID09IDB4ZjAwMCkKLSAgICAgIHx8ICgoaTIgJiAweGYwZmYpID09IDB4NDA2NiAmJiAoaTEgJiAweGYwMDApID09IDB4ZjAwMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMSAmIChCUkFOQ0ggfCBERUxBWSkpICE9IDAKLSAgICAgIHx8IChmMiAmIChCUkFOQ0ggfCBERUxBWSkpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMSAmIFNFVFNTUCkgIT0gMCAmJiAoZjIgJiBVU0VTU1ApICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjIgJiBTRVRTU1ApICE9IDAgJiYgKGYxICYgVVNFU1NQKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICgoZjEgJiBTRVRTMSkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTIsIG9wMiwgKGkxICYgMHgwZjAwKSA+PiA4KSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMSAmIFNFVFMyKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMiwgb3AyLCAoaTEgJiAweDAwZjApID4+IDQpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYxICYgU0VUU1IwKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMiwgb3AyLCAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMSAmIFNFVFNGMSkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX2ZyZWcgKGkyLCBvcDIsIChpMSAmIDB4MGYwMCkgPj4gOCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMiAmIFNFVFMxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMSwgb3AxLCAoaTIgJiAweDBmMDApID4+IDgpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYyICYgU0VUUzIpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkxLCBvcDEsIChpMiAmIDB4MDBmMCkgPj4gNCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjIgJiBTRVRTUjApICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkxLCBvcDEsIDApKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYyICYgU0VUU0YxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfZnJlZyAoaTEsIG9wMSwgKGkyICYgMHgwZjAwKSA+PiA4KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCBjb25mbGljdC4gICovCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogSTEgaXMgYSBsb2FkIGluc3RydWN0aW9uLCBhbmQgSTIgaXMgc29tZSBvdGhlciBpbnN0cnVjdGlvbi4gIFJldHVybgotICAgdHJ1ZSBpZiBJMSBsb2FkcyBhIHJlZ2lzdGVyIHdoaWNoIEkyIHVzZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfbG9hZF91c2UgKGkxLCBvcDEsIGkyLCBvcDIpCi0gICAgIHVuc2lnbmVkIGludCBpMTsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3AxOwotICAgICB1bnNpZ25lZCBpbnQgaTI7Ci0gICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wMjsKLXsKLSAgdW5zaWduZWQgaW50IGYxOwotCi0gIGYxID0gb3AxLT5mbGFnczsKLQotICBpZiAoKGYxICYgTE9BRCkgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgYm90aCBTRVRTMSBhbmQgU0VUU1NQIGFyZSBzZXQsIHRoYXQgbWVhbnMgYSBsb2FkIHRvIGEgc3BlY2lhbAotICAgICByZWdpc3RlciB1c2luZyBwb3N0aW5jcmVtZW50IGFkZHJlc3NpbmcgbW9kZSwgd2hpY2ggd2UgZG9uJ3QgY2FyZQotICAgICBhYm91dCBoZXJlLiAgKi8KLSAgaWYgKChmMSAmIFNFVFMxKSAhPSAwCi0gICAgICAmJiAoZjEgJiBTRVRTU1ApID09IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkyLCBvcDIsIChpMSAmIDB4MGYwMCkgPj4gOCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMSAmIFNFVFNSMCkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTIsIG9wMiwgMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMSAmIFNFVFNGMSkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX2ZyZWcgKGkyLCBvcDIsIChpMSAmIDB4MGYwMCkgPj4gOCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUcnkgdG8gYWxpZ24gbG9hZHMgYW5kIHN0b3JlcyB3aXRoaW4gYSBzcGFuIG9mIG1lbW9yeS4gIFRoaXMgaXMKLSAgIGNhbGxlZCBieSBib3RoIHRoZSBFTEYgYW5kIHRoZSBDT0ZGIHNoIHRhcmdldHMuICBBQkZEIGFuZCBTRUMgYXJlCi0gICB0aGUgQkZEIGFuZCBzZWN0aW9uIHdlIGFyZSBleGFtaW5pbmcuICBDT05URU5UUyBpcyB0aGUgY29udGVudHMgb2YKLSAgIHRoZSBzZWN0aW9uLiAgU1dBUCBpcyB0aGUgcm91dGluZSB0byBjYWxsIHRvIHN3YXAgdHdvIGluc3RydWN0aW9ucy4KLSAgIFJFTE9DUyBpcyBhIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIHJlbG9jYXRpb24gaW5mb3JtYXRpb24sIHRvIGJlCi0gICBwYXNzZWQgdG8gU1dBUC4gIFBMQUJFTCBpcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbGFiZWwgaW4gYQotICAgc29ydGVkIGxpc3Qgb2YgbGFiZWxzOyBMQUJFTF9FTkQgaXMgdGhlIGVuZCBvZiB0aGUgbGlzdC4gIFNUQVJUIGFuZAotICAgU1RPUCBhcmUgdGhlIHJhbmdlIG9mIG1lbW9yeSB0byBleGFtaW5lLiAgSWYgYSBzd2FwIGlzIG1hZGUsCi0gICAqUFNXQVBQRUQgaXMgc2V0IHRvIHRydWUuICAqLwotCi1ib29sZWFuCi1fYmZkX3NoX2FsaWduX2xvYWRfc3BhbiAoYWJmZCwgc2VjLCBjb250ZW50cywgc3dhcCwgcmVsb2NzLAotCQkJIHBsYWJlbCwgbGFiZWxfZW5kLCBzdGFydCwgc3RvcCwgcHN3YXBwZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBib29sZWFuICgqc3dhcCkgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSkpOwotICAgICBQVFIgcmVsb2NzOwotICAgICBiZmRfdm1hICoqcGxhYmVsOwotICAgICBiZmRfdm1hICpsYWJlbF9lbmQ7Ci0gICAgIGJmZF92bWEgc3RhcnQ7Ci0gICAgIGJmZF92bWEgc3RvcDsKLSAgICAgYm9vbGVhbiAqcHN3YXBwZWQ7Ci17Ci0gIGJmZF92bWEgaTsKLQotICAvKiBJbnN0cnVjdGlvbnMgc2hvdWxkIGJlIGFsaWduZWQgb24gMiBieXRlIGJvdW5kYXJpZXMuICAqLwotICBpZiAoKHN0YXJ0ICYgMSkgPT0gMSkKLSAgICArK3N0YXJ0OwotCi0gIC8qIE5vdyBsb29rIHRocm91Z2ggdGhlIHVuYWxpZ25lZCBhZGRyZXNzZXMuICAqLwotICBpID0gc3RhcnQ7Ci0gIGlmICgoaSAmIDIpID09IDApCi0gICAgaSArPSAyOwotICBmb3IgKDsgaSA8IHN0b3A7IGkgKz0gNCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wOwotICAgICAgdW5zaWduZWQgaW50IHByZXZfaW5zbiA9IDA7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpwcmV2X29wID0gTlVMTDsKLQotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSk7Ci0gICAgICBvcCA9IHNoX2luc25faW5mbyAoaW5zbik7Ci0gICAgICBpZiAob3AgPT0gTlVMTAotCSAgfHwgKG9wLT5mbGFncyAmIChMT0FEIHwgU1RPUkUpKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBUaGlzIGlzIGEgbG9hZCBvciBzdG9yZSB3aGljaCBpcyBub3Qgb24gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotCi0gICAgICB3aGlsZSAoKnBsYWJlbCA8IGxhYmVsX2VuZCAmJiAqKnBsYWJlbCA8IGkpCi0JKysqcGxhYmVsOwotCi0gICAgICBpZiAoaSA+IHN0YXJ0KQotCXsKLQkgIHByZXZfaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSAtIDIpOwotCSAgcHJldl9vcCA9IHNoX2luc25faW5mbyAocHJldl9pbnNuKTsKLQotCSAgLyogSWYgdGhlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24gaXMgaW4gYSBkZWxheSBzbG90LCB3ZQotCSAgICAgY2FuJ3Qgc3dhcC4gICovCi0JICBpZiAocHJldl9vcCA9PSBOVUxMCi0JICAgICAgfHwgKHByZXZfb3AtPmZsYWdzICYgREVMQVkpICE9IDApCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChpID4gc3RhcnQKLQkgICYmICgqcGxhYmVsID49IGxhYmVsX2VuZCB8fCAqKnBsYWJlbCAhPSBpKQotCSAgJiYgcHJldl9vcCAhPSBOVUxMCi0JICAmJiAocHJldl9vcC0+ZmxhZ3MgJiAoTE9BRCB8IFNUT1JFKSkgPT0gMAotCSAgJiYgISBzaF9pbnNuc19jb25mbGljdCAocHJldl9pbnNuLCBwcmV2X29wLCBpbnNuLCBvcCkpCi0JewotCSAgYm9vbGVhbiBvazsKLQotCSAgLyogVGhlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgaGF2ZSBhIGxhYmVsLCBhbmQKLQkgICAgIHRoZXJlIGlzIGEgcHJldmlvdXMgaW5zdHJ1Y3Rpb247IFBSRVZfSU5TTiBpcyBub3QKLQkgICAgIGl0c2VsZiBhIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24sIGFuZCBQUkVWX0lOU04gYW5kCi0JICAgICBJTlNOIGRvIG5vdCBjb25mbGljdC4gICovCi0KLQkgIG9rID0gdHJ1ZTsKLQotCSAgaWYgKGkgPj0gc3RhcnQgKyA0KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHByZXYyX2luc247Ci0JICAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqcHJldjJfb3A7Ci0KLQkgICAgICBwcmV2Ml9pbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpIC0gNCk7Ci0JICAgICAgcHJldjJfb3AgPSBzaF9pbnNuX2luZm8gKHByZXYyX2luc24pOwotCi0JICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGJlZm9yZSBQUkVWX0lOU04gaGFzIGEgZGVsYXkKLQkJIHNsb3QtLXRoYXQgaXMsIFBSRVZfSU5TTiBpcyBpbiBhIGRlbGF5IHNsb3QtLXdlCi0JCSBjYW4gbm90IHN3YXAuICAqLwotCSAgICAgIGlmIChwcmV2Ml9vcCA9PSBOVUxMCi0JCSAgfHwgKHByZXYyX29wLT5mbGFncyAmIERFTEFZKSAhPSAwKQotCQlvayA9IGZhbHNlOwotCi0JICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGJlZm9yZSBQUkVWX0lOU04gaXMgYSBsb2FkLAotCQkgYW5kIGl0IHNldHMgYSByZWdpc3RlciB3aGljaCBJTlNOIHVzZXMsIHRoZW4KLQkJIHB1dHRpbmcgSU5TTiBpbW1lZGlhdGVseSBhZnRlciBQUkVWX0lOU04gd2lsbAotCQkgY2F1c2UgYSBwaXBlbGluZSBidWJibGUsIHNvIHRoZXJlIGlzIG5vIHBvaW50IHRvCi0JCSBtYWtpbmcgdGhlIHN3YXAuICAqLwotCSAgICAgIGlmIChvawotCQkgICYmIChwcmV2Ml9vcC0+ZmxhZ3MgJiBMT0FEKSAhPSAwCi0JCSAgJiYgc2hfbG9hZF91c2UgKHByZXYyX2luc24sIHByZXYyX29wLCBpbnNuLCBvcCkpCi0JCW9rID0gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKG9rKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCpzd2FwKSAoYWJmZCwgc2VjLCByZWxvY3MsIGNvbnRlbnRzLCBpIC0gMikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAqcHN3YXBwZWQgPSB0cnVlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICB3aGlsZSAoKnBsYWJlbCA8IGxhYmVsX2VuZCAmJiAqKnBsYWJlbCA8IGkgKyAyKQotCSsrKnBsYWJlbDsKLQotICAgICAgaWYgKGkgKyAyIDwgc3RvcAotCSAgJiYgKCpwbGFiZWwgPj0gbGFiZWxfZW5kIHx8ICoqcGxhYmVsICE9IGkgKyAyKSkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbmV4dF9pbnNuOwotCSAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqbmV4dF9vcDsKLQotCSAgLyogVGhlcmUgaXMgYW4gaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIGxvYWQvc3RvcmUKLQkgICAgIGluc3RydWN0aW9uLCBhbmQgaXQgZG9lcyBub3QgaGF2ZSBhIGxhYmVsLiAgKi8KLQkgIG5leHRfaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSArIDIpOwotCSAgbmV4dF9vcCA9IHNoX2luc25faW5mbyAobmV4dF9pbnNuKTsKLQkgIGlmIChuZXh0X29wICE9IE5VTEwKLQkgICAgICAmJiAobmV4dF9vcC0+ZmxhZ3MgJiAoTE9BRCB8IFNUT1JFKSkgPT0gMAotCSAgICAgICYmICEgc2hfaW5zbnNfY29uZmxpY3QgKGluc24sIG9wLCBuZXh0X2luc24sIG5leHRfb3ApKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBvazsKLQotCSAgICAgIC8qIE5FWFRfSU5TTiBpcyBub3QgaXRzZWxmIGEgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiwKLQkJIGFuZCBpdCBkb2VzIG5vdCBjb25mbGljdCB3aXRoIElOU04uICAqLwotCi0JICAgICAgb2sgPSB0cnVlOwotCi0JICAgICAgLyogSWYgUFJFVl9JTlNOIGlzIGEgbG9hZCwgYW5kIGl0IHNldHMgYSByZWdpc3RlcgotCQkgd2hpY2ggTkVYVF9JTlNOIHVzZXMsIHRoZW4gcHV0dGluZyBORVhUX0lOU04KLQkJIGltbWVkaWF0ZWx5IGFmdGVyIFBSRVZfSU5TTiB3aWxsIGNhdXNlIGEgcGlwZWxpbmUKLQkJIGJ1YmJsZSwgc28gdGhlcmUgaXMgbm8gcmVhc29uIHRvIG1ha2UgdGhpcyBzd2FwLiAgKi8KLQkgICAgICBpZiAocHJldl9vcCAhPSBOVUxMCi0JCSAgJiYgKHByZXZfb3AtPmZsYWdzICYgTE9BRCkgIT0gMAotCQkgICYmIHNoX2xvYWRfdXNlIChwcmV2X2luc24sIHByZXZfb3AsIG5leHRfaW5zbiwgbmV4dF9vcCkpCi0JCW9rID0gZmFsc2U7Ci0KLQkgICAgICAvKiBJZiBJTlNOIGlzIGEgbG9hZCwgYW5kIGl0IHNldHMgYSByZWdpc3RlciB3aGljaAotCQkgdGhlIGluc24gYWZ0ZXIgTkVYVF9JTlNOIHVzZXMsIHRoZW4gZG9pbmcgdGhlCi0JCSBzd2FwIHdpbGwgY2F1c2UgYSBwaXBlbGluZSBidWJibGUsIHNvIHRoZXJlIGlzIG5vCi0JCSByZWFzb24gdG8gbWFrZSB0aGUgc3dhcC4gIEhvd2V2ZXIsIGlmIHRoZSBpbnNuCi0JCSBhZnRlciBORVhUX0lOU04gaXMgaXRzZWxmIGEgbG9hZCBvciBzdG9yZQotCQkgaW5zdHJ1Y3Rpb24sIHRoZW4gaXQgaXMgbWlzYWxpZ25lZCwgc28KLQkJIG9wdGltaXN0aWNhbGx5IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHN3YXBwZWQKLQkJIGl0c2VsZiwgYW5kIGp1c3QgbGl2ZSB3aXRoIHRoZSBwaXBlbGluZSBidWJibGUgaWYKLQkJIGl0IGlzbid0LiAgKi8KLQkgICAgICBpZiAob2sKLQkJICAmJiBpICsgNCA8IHN0b3AKLQkJICAmJiAob3AtPmZsYWdzICYgTE9BRCkgIT0gMCkKLQkJewotCQkgIHVuc2lnbmVkIGludCBuZXh0Ml9pbnNuOwotCQkgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm5leHQyX29wOwotCi0JCSAgbmV4dDJfaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSArIDQpOwotCQkgIG5leHQyX29wID0gc2hfaW5zbl9pbmZvIChuZXh0Ml9pbnNuKTsKLQkJICBpZiAoKG5leHQyX29wLT5mbGFncyAmIChMT0FEIHwgU1RPUkUpKSA9PSAwCi0JCSAgICAgICYmIHNoX2xvYWRfdXNlIChpbnNuLCBvcCwgbmV4dDJfaW5zbiwgbmV4dDJfb3ApKQotCQkgICAgb2sgPSBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKG9rKQotCQl7Ci0JCSAgaWYgKCEgKCpzd2FwKSAoYWJmZCwgc2VjLCByZWxvY3MsIGNvbnRlbnRzLCBpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICAqcHN3YXBwZWQgPSB0cnVlOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIGZvciBsb2FkcyBhbmQgc3RvcmVzIHdoaWNoIHdlIGNhbiBhbGlnbiB0byBmb3VyIGJ5dGUKLSAgIGJvdW5kYXJpZXMuICBTZWUgdGhlIGxvbmdlciBjb21tZW50IGFib3ZlIHNoX3JlbGF4X3NlY3Rpb24gZm9yIHdoeQotICAgdGhpcyBpcyBkZXNpcmFibGUuICBUaGlzIHNldHMgKlBTV0FQUEVEIGlmIHNvbWUgaW5zdHJ1Y3Rpb24gd2FzCi0gICBzd2FwcGVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2FsaWduX2xvYWRzIChhYmZkLCBzZWMsIGludGVybmFsX3JlbG9jcywgY29udGVudHMsIHBzd2FwcGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJvb2xlYW4gKnBzd2FwcGVkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWwsICppcmVsZW5kOwotICBiZmRfdm1hICpsYWJlbHMgPSBOVUxMOwotICBiZmRfdm1hICpsYWJlbCwgKmxhYmVsX2VuZDsKLQotICAqcHN3YXBwZWQgPSBmYWxzZTsKLQotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLQotICAvKiBHZXQgYWxsIHRoZSBhZGRyZXNzZXMgd2l0aCBsYWJlbHMgb24gdGhlbS4gICovCi0gIGxhYmVscyA9IChiZmRfdm1hICopIGJmZF9tYWxsb2MgKHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGJmZF92bWEpKTsKLSAgaWYgKGxhYmVscyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBsYWJlbF9lbmQgPSBsYWJlbHM7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfTEFCRUwpCi0JewotCSAgKmxhYmVsX2VuZCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgICsrbGFiZWxfZW5kOwotCX0KLSAgICB9Ci0KLSAgLyogTm90ZSB0aGF0IHRoZSBhc3NlbWJsZXIgY3VycmVudGx5IGFsd2F5cyBvdXRwdXRzIHJlbG9jcyBpbgotICAgICBhZGRyZXNzIG9yZGVyLiAgSWYgdGhhdCBldmVyIGNoYW5nZXMsIHRoaXMgY29kZSB3aWxsIG5lZWQgdG8gc29ydAotICAgICB0aGUgbGFiZWwgdmFsdWVzIGFuZCB0aGUgcmVsb2NzLiAgKi8KLQotICBsYWJlbCA9IGxhYmVsczsKLQotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBzdGFydCwgc3RvcDsKLQotICAgICAgaWYgKGlyZWwtPnJfdHlwZSAhPSBSX1NIX0NPREUpCi0JY29udGludWU7Ci0KLSAgICAgIHN0YXJ0ID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCi0gICAgICBmb3IgKGlyZWwrKzsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLQlpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfREFUQSkKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWwgPCBpcmVsZW5kKQotCXN0b3AgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0gICAgICBlbHNlCi0Jc3RvcCA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gICAgICBpZiAoISBfYmZkX3NoX2FsaWduX2xvYWRfc3BhbiAoYWJmZCwgc2VjLCBjb250ZW50cywgc2hfc3dhcF9pbnNucywKLQkJCQkgICAgIChQVFIpIGludGVybmFsX3JlbG9jcywgJmxhYmVsLAotCQkJCSAgICAgbGFiZWxfZW5kLCBzdGFydCwgc3RvcCwgcHN3YXBwZWQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmcmVlIChsYWJlbHMpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAobGFiZWxzICE9IE5VTEwpCi0gICAgZnJlZSAobGFiZWxzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTd2FwIHR3byBTSCBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfc3dhcF9pbnNucyAoYWJmZCwgc2VjLCByZWxvY3MsIGNvbnRlbnRzLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiByZWxvY3M7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jcyA9IChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgcmVsb2NzOwotICB1bnNpZ25lZCBzaG9ydCBpMSwgaTI7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbCwgKmlyZWxlbmQ7Ci0KLSAgLyogU3dhcCB0aGUgaW5zdHJ1Y3Rpb25zIHRoZW1zZWx2ZXMuICAqLwotICBpMSA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgYWRkcik7Ci0gIGkyID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMik7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIGkyLCBjb250ZW50cyArIGFkZHIpOwotICBiZmRfcHV0XzE2IChhYmZkLCBpMSwgY29udGVudHMgKyBhZGRyICsgMik7Ci0KLSAgLyogQWRqdXN0IGFsbCByZWxvYyBhZGRyZXNzZXMuICAqLwotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGludCB0eXBlLCBhZGQ7Ci0KLSAgICAgIC8qIFRoZXJlIGFyZSBhIGZldyBzcGVjaWFsIHR5cGVzIG9mIHJlbG9jcyB0aGF0IHdlIGRvbid0IHdhbnQgdG8KLSAgICAgICAgIGFkanVzdC4gIFRoZXNlIHJlbG9jcyBkbyBub3QgYXBwbHkgdG8gdGhlIGluc3RydWN0aW9uIGl0c2VsZiwKLSAgICAgICAgIGJ1dCBhcmUgb25seSBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZHJlc3MuICAqLwotICAgICAgdHlwZSA9IGlyZWwtPnJfdHlwZTsKLSAgICAgIGlmICh0eXBlID09IFJfU0hfQUxJR04KLQkgIHx8IHR5cGUgPT0gUl9TSF9DT0RFCi0JICB8fCB0eXBlID09IFJfU0hfREFUQQotCSAgfHwgdHlwZSA9PSBSX1NIX0xBQkVMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiBhbiBSX1NIX1VTRVMgcmVsb2MgcG9pbnRzIHRvIG9uZSBvZiB0aGUgYWRkcmVzc2VzIGJlaW5nCi0gICAgICAgICBzd2FwcGVkLCB3ZSBtdXN0IGFkanVzdCBpdC4gIEl0IHdvdWxkIGJlIGluY29ycmVjdCB0byBkbyB0aGlzCi0gICAgICAgICBmb3IgYSBqdW1wLCB0aG91Z2gsIHNpbmNlIHdlIHdhbnQgdG8gZXhlY3V0ZSBib3RoCi0gICAgICAgICBpbnN0cnVjdGlvbnMgYWZ0ZXIgdGhlIGp1bXAuICAoV2UgaGF2ZSBhdm9pZGVkIHN3YXBwaW5nCi0gICAgICAgICBhcm91bmQgYSBsYWJlbCwgc28gdGhlIGp1bXAgd2lsbCBub3Qgd2luZCB1cCBleGVjdXRpbmcgYW4KLSAgICAgICAgIGluc3RydWN0aW9uIGl0IHNob3VsZG4ndCkuICAqLwotICAgICAgaWYgKHR5cGUgPT0gUl9TSF9VU0VTKQotCXsKLQkgIGJmZF92bWEgb2ZmOwotCi0JICBvZmYgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgKyA0ICsgaXJlbC0+cl9vZmZzZXQ7Ci0JICBpZiAob2ZmID09IGFkZHIpCi0JICAgIGlyZWwtPnJfb2Zmc2V0ICs9IDI7Ci0JICBlbHNlIGlmIChvZmYgPT0gYWRkciArIDIpCi0JICAgIGlyZWwtPnJfb2Zmc2V0IC09IDI7Ci0JfQotCi0gICAgICBpZiAoaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID09IGFkZHIpCi0JewotCSAgaXJlbC0+cl92YWRkciArPSAyOwotCSAgYWRkID0gLTI7Ci0JfQotICAgICAgZWxzZSBpZiAoaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID09IGFkZHIgKyAyKQotCXsKLQkgIGlyZWwtPnJfdmFkZHIgLT0gMjsKLQkgIGFkZCA9IDI7Ci0JfQotICAgICAgZWxzZQotCWFkZCA9IDA7Ci0KLSAgICAgIGlmIChhZGQgIT0gMCkKLQl7Ci0JICBiZmRfYnl0ZSAqbG9jOwotCSAgdW5zaWduZWQgc2hvcnQgaW5zbiwgb2luc247Ci0JICBib29sZWFuIG92ZXJmbG93OwotCi0JICBsb2MgPSBjb250ZW50cyArIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgIG92ZXJmbG93ID0gZmFsc2U7Ci0JICBzd2l0Y2ggKHR5cGUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENESVNQOEJZMjoKLQkgICAgY2FzZSBSX1NIX1BDUkVMSU1NOEJZMjoKLQkgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkgICAgICBvaW5zbiA9IGluc247Ci0JICAgICAgaW5zbiArPSBhZGQgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1BDRElTUDoKLQkgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkgICAgICBvaW5zbiA9IGluc247Ci0JICAgICAgaW5zbiArPSBhZGQgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGYwMDApICE9IChpbnNuICYgMHhmMDAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1BDUkVMSU1NOEJZNDoKLQkgICAgICAvKiBUaGlzIHJlbG9jIGlnbm9yZXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IDMgYml0cyBvZgotICAgICAgICAgICAgICAgICB0aGUgcHJvZ3JhbSBjb3VudGVyIGJlZm9yZSBhZGRpbmcgaW4gdGhlIG9mZnNldC4KLSAgICAgICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IGlmIEFERFIgaXMgYXQgYW4gZXZlbiBhZGRyZXNzLCB0aGUKLSAgICAgICAgICAgICAgICAgc3dhcCB3aWxsIG5vdCBhZmZlY3QgdGhlIG9mZnNldC4gIElmIEFERFIgaXMgYW4gYXQgYW4KLSAgICAgICAgICAgICAgICAgb2RkIGFkZHJlc3MsIHRoZW4gdGhlIGluc3RydWN0aW9uIHdpbGwgYmUgY3Jvc3NpbmcgYQotICAgICAgICAgICAgICAgICBmb3VyIGJ5dGUgYm91bmRhcnksIGFuZCBtdXN0IGJlIGFkanVzdGVkLiAgKi8KLQkgICAgICBpZiAoKGFkZHIgJiAzKSAhPSAwKQotCQl7Ci0JCSAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7Ci0JCSAgb2luc24gPSBpbnNuOwotCQkgIGluc24gKz0gYWRkIC8gMjsKLQkJICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCSAgICBvdmVyZmxvdyA9IHRydWU7Ci0JCSAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkJfQotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG92ZXJmbG93KQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIiwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX3ZhZGRyKSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgYSBtb2RpZmljYXRpb24gb2YgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbiwgd2hpY2gKLSAgIHdpbGwgaGFuZGxlIFNIIHJlbGF4aW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsCi0JCSAgICAgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLQotICAgICAgLyogQWxtb3N0IGFsbCByZWxvY3MgaGF2ZSB0byBkbyB3aXRoIHJlbGF4aW5nLiAgSWYgYW55IHdvcmsgbXVzdAotICAgICAgICAgYmUgZG9uZSBmb3IgdGhlbSwgaXQgaGFzIGJlZW4gZG9uZSBpbiBzaF9yZWxheF9zZWN0aW9uLiAgKi8KLSAgICAgIGlmIChyZWwtPnJfdHlwZSAhPSBSX1NIX0lNTTMyCi0JICAmJiByZWwtPnJfdHlwZSAhPSBSX1NIX1BDRElTUCkKLQljb250aW51ZTsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBpZiAoc3ltbmR4IDwgMAotCSAgICAgIHx8ICh1bnNpZ25lZCBsb25nKSBzeW1uZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKCIlczogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIHJlbG9jcyIsCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBzeW1uZHgpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotICAgICAgaWYgKHJlbC0+cl90eXBlID09IFJfU0hfUENESVNQKQotCWFkZGVuZCAtPSA0OwotCi0gICAgICBpZiAocmVsLT5yX3R5cGUgPj0gU0hfQ09GRl9IT1dUT19DT1VOVCkKLQlob3d0byA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaG93dG8gPSAmc2hfY29mZl9ob3d0b3NbcmVsLT5yX3R5cGVdOwotCi0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgLyogVGhlcmUgaXMgbm90aGluZyB0byBkbyBmb3IgYW4gaW50ZXJuYWwgUENESVNQIHJlbG9jLiAgKi8KLQkgIGlmIChyZWwtPnJfdHlwZSA9PSBSX1NIX1BDRElTUCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlCi0JCSAgICAgLSBzZWMtPnZtYSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsCi0JCQkJCXJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJdmFsLCBhZGRlbmQpOwotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAgICYmIHN5bS0+X24uX25fbi5fbl9vZmZzZXQgIT0gMCkKLQkgICAgICBuYW1lID0gb2JqX2NvZmZfc3RyaW5ncyAoaW5wdXRfYmZkKSArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0gCQlzdHJuY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotCQlidWZbU1lNTk1MRU5dID0gJ1wwJzsKLQkJbmFtZSA9IGJ1ZjsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBzaF9yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLXNoX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCWRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqKnNlY3Rpb25zID0gTlVMTDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSA9PSBOVUxMCi0gICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKS0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgbWVtY3B5IChkYXRhLCBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKS0+Y29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLSAgICAgIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzeW1wOwotICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLQotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChpbnB1dF9iZmQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgZmFsc2UsIChiZmRfYnl0ZSAqKSBOVUxMLAotCQkJICBmYWxzZSwgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpCi0JCQkJICAgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQpKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAob2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkKLQkJCQkJICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpc3ltcCA9IGludGVybmFsX3N5bXM7Ci0gICAgICBzZWNwcCA9IHNlY3Rpb25zOwotICAgICAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIHN5bWVzejsKLSAgICAgIHdoaWxlIChlc3ltIDwgZXN5bWVuZCkKLQl7Ci0JICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+bl9zY251bSAhPSAwKQotCSAgICAqc2VjcHAgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGlucHV0X2JmZCwgaXN5bXAtPm5fc2NudW0pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGlzeW1wLT5uX3ZhbHVlID09IDApCi0JCSpzZWNwcCA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICAgICAgZWxzZQotCQkqc2VjcHAgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgICB9Ci0KLQkgIGVzeW0gKz0gKGlzeW1wLT5uX251bWF1eCArIDEpICogc3ltZXN6OwotCSAgc2VjcHAgKz0gaXN5bXAtPm5fbnVtYXV4ICsgMTsKLQkgIGlzeW1wICs9IGlzeW1wLT5uX251bWF1eCArIDE7Ci0JfQotCi0gICAgICBpZiAoISBzaF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSBpbnRlcm5hbF9zeW1zLCBzZWN0aW9ucykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgICAgIHNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBUaGUgdGFyZ2V0IHZlY3RvcnMuICAqLwotCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAoc2hjb2ZmX3ZlYywgImNvZmYtc2giLCBCRkRfSVNfUkVMQVhBQkxFLCAwLCAnXycsIE5VTEwpCi0KLSNpZmRlZiBUQVJHRVRfU0hMX1NZTQotI2RlZmluZSBUQVJHRVRfU1lNIFRBUkdFVF9TSExfU1lNCi0jZWxzZQotI2RlZmluZSBUQVJHRVRfU1lNIHNobGNvZmZfdmVjCi0jZW5kaWYKLSAgICAgCi0jaWZuZGVmIFRBUkdFVF9TSExfTkFNRQotI2RlZmluZSBUQVJHRVRfU0hMX05BTUUgImNvZmYtc2hsIgotI2VuZGlmCi0KLUNSRUFURV9MSVRUTEVfQ09GRl9UQVJHRVRfVkVDIChUQVJHRVRfU1lNLCBUQVJHRVRfU0hMX05BTUUsIEJGRF9JU19SRUxBWEFCTEUsIDAsICdfJywgTlVMTCkKLSAgICAgCi0KLS8qIFNvbWUgcGVvcGxlIHdhbnQgdmVyc2lvbnMgb2YgdGhlIFNIIENPRkYgdGFyZ2V0IHdoaWNoIGRvIG5vdCBhbGlnbgotICAgdG8gMTYgYnl0ZSBib3VuZGFyaWVzLiAgV2UgaW1wbGVtZW50IHRoYXQgYnkgYWRkaW5nIGEgY291cGxlIG9mIG5ldwotICAgdGFyZ2V0IHZlY3RvcnMuICBUaGVzZSBhcmUganVzdCBsaWtlIHRoZSBvbmVzIGFib3ZlLCBidXQgdGhleQotICAgY2hhbmdlIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50LiAgVG8gZ2VuZXJhdGUgdGhlbSBpbiB0aGUKLSAgIGFzc2VtYmxlciwgdXNlIC1zbWFsbC4gIFRvIHVzZSB0aGVtIGluIHRoZSBsaW5rZXIsIHVzZSAtYgotICAgY29mZi1zaHtsfS1zbWFsbCBhbmQgLW9mb3JtYXQgY29mZi1zaHtsfS1zbWFsbC4KLQotICAgWWVzLCB0aGlzIGlzIGEgaG9ycmlibGUgaGFjay4gIEEgZ2VuZXJhbCBzb2x1dGlvbiBmb3Igc2V0dGluZwotICAgc2VjdGlvbiBhbGlnbm1lbnQgaW4gQ09GRiBpcyByYXRoZXIgY29tcGxleC4gIEVMRiBoYW5kbGVzIHRoaXMKLSAgIGNvcnJlY3RseS4gICovCi0KLS8qIE9ubHkgcmVjb2duaXplIHRoZSBzbWFsbCB2ZXJzaW9ucyBpZiB0aGUgdGFyZ2V0IHdhcyBub3QgZGVmYXVsdGVkLgotICAgT3RoZXJ3aXNlIHdlIHdvbid0IHJlY29nbml6ZSB0aGUgbm9uIGRlZmF1bHQgZW5kaWFubmVzcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWNvZmZfc21hbGxfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiBjb2ZmX29iamVjdF9wIChhYmZkKTsKLX0KLQotLyogU2V0IHRoZSBzZWN0aW9uIGFsaWdubWVudCBmb3IgdGhlIHNtYWxsIHZlcnNpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc21hbGxfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgaWYgKCEgY29mZl9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV2UgbXVzdCBhbGlnbiB0byBhdCBsZWFzdCBhIGZvdXIgYnl0ZSBib3VuZGFyeSwgYmVjYXVzZSBsb25nd29yZAotICAgICBhY2Nlc3NlcyBtdXN0IGJlIG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9PSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpCi0gICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjb3BpZWQgZnJvbSBiZmRfY29mZl9zdGRfc3dhcF90YWJsZSBzbyB0aGF0IHdlIGNhbiBjaGFuZ2UKLSAgIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSBiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlID0KLXsKLSAgY29mZl9zd2FwX2F1eF9pbiwgY29mZl9zd2FwX3N5bV9pbiwgY29mZl9zd2FwX2xpbmVub19pbiwKLSAgY29mZl9zd2FwX2F1eF9vdXQsIGNvZmZfc3dhcF9zeW1fb3V0LAotICBjb2ZmX3N3YXBfbGluZW5vX291dCwgY29mZl9zd2FwX3JlbG9jX291dCwKLSAgY29mZl9zd2FwX2ZpbGVoZHJfb3V0LCBjb2ZmX3N3YXBfYW91dGhkcl9vdXQsCi0gIGNvZmZfc3dhcF9zY25oZHJfb3V0LAotICBGSUxIU1osIEFPVVRTWiwgU0NOSFNaLCBTWU1FU1osIEFVWEVTWiwgUkVMU1osIExJTkVTWiwgRklMTk1MRU4sCi0jaWZkZWYgQ09GRl9MT05HX0ZJTEVOQU1FUwotICB0cnVlLAotI2Vsc2UKLSAgZmFsc2UsCi0jZW5kaWYKLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICB0cnVlLAotI2Vsc2UKLSAgZmFsc2UsCi0jZW5kaWYKLSAgMiwKLSAgY29mZl9zd2FwX2ZpbGVoZHJfaW4sIGNvZmZfc3dhcF9hb3V0aGRyX2luLCBjb2ZmX3N3YXBfc2NuaGRyX2luLAotICBjb2ZmX3N3YXBfcmVsb2NfaW4sIGNvZmZfYmFkX2Zvcm1hdF9ob29rLCBjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKLSAgY29mZl9ta29iamVjdF9ob29rLCBzdHlwX3RvX3NlY19mbGFncywgY29mZl9zZXRfYWxpZ25tZW50X2hvb2ssCi0gIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLCBzeW1uYW1lX2luX2RlYnVnX2hvb2ssIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaywKLSAgY29mZl9wcmludF9hdXgsIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcywgY29mZl9yZWxvYzE2X2VzdGltYXRlLAotICBjb2ZmX2NsYXNzaWZ5X3N5bWJvbCwgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCi0gIGNvZmZfc3RhcnRfZmluYWxfbGluaywgY29mZl9yZWxvY2F0ZV9zZWN0aW9uLCBjb2ZmX3J0eXBlX3RvX2hvd3RvLAotICBjb2ZmX2FkanVzdF9zeW1uZHgsIGNvZmZfbGlua19hZGRfb25lX3N5bWJvbCwKLSAgY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4sIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0Ci19OwotCi0jZGVmaW5lIGNvZmZfc21hbGxfY2xvc2VfYW5kX2NsZWFudXAgXAotICBjb2ZmX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIGNvZmZfc21hbGxfYmZkX2ZyZWVfY2FjaGVkX2luZm8gXAotICBjb2ZmX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIGNvZmZfc21hbGxfZ2V0X3NlY3Rpb25fY29udGVudHMgXAotICBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfc21hbGxfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWM7Ci0KLWNvbnN0IGJmZF90YXJnZXQgc2hjb2ZmX3NtYWxsX3ZlYyA9Ci17Ci0gICJjb2ZmLXNoLXNtYWxsIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwKLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9zbWFsbF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZl9zbWFsbCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmIHNobGNvZmZfc21hbGxfdmVjLAotICAKLSAgKFBUUikgJmJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWMgPQotewotICAiY29mZi1zaGwtc21hbGwiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIGVuZGlhbiB0b28qLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwKLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9zbWFsbF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwgICAKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZl9zbWFsbCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmIHNoY29mZl9zbWFsbF92ZWMsCi0gIAotICAoUFRSKSAmYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXNwYXJjLmMgYi9iZmQvY29mZi1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTkxOWRhLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBTcGFyYyBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL3NwYXJjLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLSNkZWZpbmUgQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBTUEFSQ01BR0lDICYmICh4KS5mX21hZ2ljICE9IExZTlhDT0ZGTUFHSUMpCi0KLS8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLwotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDEwMDAwCi0KLWVudW0gcmVsb2NfdHlwZQotICB7Ci0gICAgUl9TUEFSQ19OT05FID0gMCwKLSAgICBSX1NQQVJDXzgsCQlSX1NQQVJDXzE2LAkJUl9TUEFSQ18zMiwgCi0gICAgUl9TUEFSQ19ESVNQOCwJUl9TUEFSQ19ESVNQMTYsCQlSX1NQQVJDX0RJU1AzMiwgCi0gICAgUl9TUEFSQ19XRElTUDMwLAlSX1NQQVJDX1dESVNQMjIsCi0gICAgUl9TUEFSQ19ISTIyLAlSX1NQQVJDXzIyLAotICAgIFJfU1BBUkNfMTMsCQlSX1NQQVJDX0xPMTAsCi0gICAgUl9TUEFSQ19HT1QxMCwJUl9TUEFSQ19HT1QxMywJCVJfU1BBUkNfR09UMjIsCi0gICAgUl9TUEFSQ19QQzEwLAlSX1NQQVJDX1BDMjIsCi0gICAgUl9TUEFSQ19XUExUMzAsCi0gICAgUl9TUEFSQ19DT1BZLAotICAgIFJfU1BBUkNfR0xPQl9EQVQsCVJfU1BBUkNfSk1QX1NMT1QsCi0gICAgUl9TUEFSQ19SRUxBVElWRSwKLSAgICBSX1NQQVJDX1VBMzIsCi0gICAgUl9TUEFSQ19tYXgKLSAgfTsKLQotI2lmIDAKLXN0YXRpYyBDT05TVCBjaGFyICpDT05TVCByZWxvY190eXBlX25hbWVzW10gPQotewotICAiUl9TUEFSQ19OT05FIiwKLSAgIlJfU1BBUkNfOCIsCQkiUl9TUEFSQ18xNiIsCQkiUl9TUEFSQ18zMiIsCi0gICJSX1NQQVJDX0RJU1A4IiwJIlJfU1BBUkNfRElTUDE2IiwJIlJfU1BBUkNfRElTUDMyIiwKLSAgIlJfU1BBUkNfV0RJU1AzMCIsCSJSX1NQQVJDX1dESVNQMjIiLAotICAiUl9TUEFSQ19ISTIyIiwJIlJfU1BBUkNfMjIiLAotICAiUl9TUEFSQ18xMyIsCQkiUl9TUEFSQ19MTzEwIiwKLSAgIlJfU1BBUkNfR09UMTAiLAkiUl9TUEFSQ19HT1QxMyIsCSJSX1NQQVJDX0dPVDIyIiwKLSAgIlJfU1BBUkNfUEMxMCIsCSJSX1NQQVJDX1BDMjIiLAotICAiUl9TUEFSQ19XUExUMzAiLAotICAiUl9TUEFSQ19DT1BZIiwKLSAgIlJfU1BBUkNfR0xPQl9EQVQiLAkiUl9TUEFSQ19KTVBfU0xPVCIsCi0gICJSX1NQQVJDX1JFTEFUSVZFIiwKLSAgIlJfU1BBUkNfVUEzMiIsCi19OwotI2VuZGlmCi0KLS8qIFRoaXMgaXMgc3RvbGVuIHByZXR0eSBkaXJlY3RseSBmcm9tIGVsZi5jLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkJYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2NvZmZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCW91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlW10gPSAKLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgMCwwLCA4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgMCwwLCA4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgMiwyLDMwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsIDIsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgIDAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLX07Ci0KLXN0cnVjdCBjb2ZmX3JlbG9jX21hcCB7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGNvZmZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBjb2ZmX3JlbG9jX21hcCBzcGFyY19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU1BBUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfU1BBUkNfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU1BBUkNfOCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NQQVJDX0RJU1A4IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU1BBUkNfMzIgfSwgLyogQEAgQXNzdW1lcyAzMiBiaXRzLiAgKi8KLSAgeyBCRkRfUkVMT0NfMzIsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU1BBUkNfRElTUDMyIH0sCi0gIHsgQkZEX1JFTE9DX0hJMjIsIFJfU1BBUkNfSEkyMiB9LAotICB7IEJGRF9SRUxPQ19MTzEwLCBSX1NQQVJDX0xPMTAsIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCBSX1NQQVJDX1dESVNQMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMyMiwgUl9TUEFSQ18yMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzEzLCBSX1NQQVJDXzEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCBSX1NQQVJDX0dPVDEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCBSX1NQQVJDX0dPVDEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCBSX1NQQVJDX0dPVDIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMTAsIFJfU1BBUkNfUEMxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzIyLCBSX1NQQVJDX1BDMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCBSX1NQQVJDX1dQTFQzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19DT1BZLCBSX1NQQVJDX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsIFJfU1BBUkNfR0xPQl9EQVQgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsIFJfU1BBUkNfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsIFJfU1BBUkNfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgUl9TUEFSQ19XRElTUDIyIH0sCi0gIC8qICB7IEJGRF9SRUxPQ19TUEFSQ19VQTMyLCBSX1NQQVJDX1VBMzIgfSwgbm90IHVzZWQ/PyAqLwotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3BhcmNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGNvZmZfcmVsb2NfbWFwKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzcGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmY29mZl9zcGFyY19ob3d0b190YWJsZVsoaW50KSBzcGFyY19yZWxvY19tYXBbaV0uY29mZl9yZWxvY192YWxdOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWNvZmZfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXAKLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgQkZEX0FTU0VSVCAoZHN0LT5yX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX1NQQVJDX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmY29mZl9zcGFyY19ob3d0b190YWJsZVtkc3QtPnJfdHlwZV07Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQJYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX09GRlNFVAliZmRfaF9wdXRfMzIKLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKSBcCi0gIGNhY2hlX3B0ci0+YWRkZW5kID0gcmVsb2Mucl9vZmZzZXQ7Ci0KLS8qIENsZWFyIHRoZSByX3NwYXJlIGZpZWxkIGluIHJlbG9jcy4gICovCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsc3JjLGRzdCkgXAotICBkbyB7IFwKLSAgICAgICBkc3QtPnJfc3BhcmVbMF0gPSAwOyBcCi0gICAgICAgZHN0LT5yX3NwYXJlWzFdID0gMDsgXAotICAgICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0vKiBFbmFibGUgU3BhcmMtc3BlY2lmaWMgaGFja3MgaW4gY29mZmNvZGUuaC4gKi8KLQotI2RlZmluZSBDT0ZGX1NQQVJDCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0jaWZuZGVmIFRBUkdFVF9TWU0KLSNkZWZpbmUgVEFSR0VUX1NZTSBzcGFyY2NvZmZfdmVjCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfTkFNRQotI2RlZmluZSBUQVJHRVRfTkFNRSAiY29mZi1zcGFyYyIKLSNlbmRpZgotCi1DUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyAoVEFSR0VUX1NZTSwgVEFSR0VUX05BTUUsIERfUEFHRUQsIDAsICdfJywgTlVMTCkKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXN0Z28zMi5jIGIvYmZkL2NvZmYtc3RnbzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZGJhNDAuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtc3RnbzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgQ09GRiBmaWxlcyAoZ28zMiB2YXJpYW50IHdpdGggYSBzdHViKS4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBSb2JlcnQgSG9laG5lLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBoYW5kbGVzIG5vdyBhbHNvIHN0dWJiZWQgY29mZiBpbWFnZXMuIFRoZSBzdHViIGlzIGEgc21hbGwKLSAgIERPUyBleGVjdXRhYmxlIHByb2dyYW0gYmVmb3JlIHRoZSBjb2ZmIGltYWdlIHRvIGxvYWQgaXQgaW4gbWVtb3J5Ci0gICBhbmQgZXhlY3V0ZSBpdC4gVGhpcyBpcyBuZWVkZWQsIGJlY2F1c2UgRE9TIGNhbm5vdCBydW4gY29mZiBmaWxlcy4KLQotICAgQWxsIHRoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIGNhbGxlZCBieSB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbnMKLSAgIGZyb20gY29mZnN3YXAuaC4KLSAgIFRoZSBvbmx5IHRoaW5nIHdoYXQgdGhleSBkbyBpcyB0byBhZGp1c3QgdGhlIGluZm9ybWF0aW9uIHN0b3JlZCBpbgotICAgdGhlIENPRkYgZmlsZSB3aGljaCBhcmUgb2Zmc2V0IGludG8gdGhlIGZpbGUuCi0gICBUaGlzIGlzIG5lZWRlZCwgYmVjYXVzZSBESkdQUCB1c2VzIGEgdmVyeSBzcGVjaWFsIHdheSB0byBsb2FkIGFuZCBydW4KLSAgIHRoZSBjb2ZmIGltYWdlLiBJdCBsb2FkcyB0aGUgaW1hZ2UgaW4gbWVtb3J5IGFuZCBhc3N1bWVzIHRoZW4sIHRoYXQgdGhlCi0gICBpbWFnZSBoYWQgbm8gc3R1YiBieSB1c2luZyB0aGUgZmlsZXBvaW50ZXJzIGFzIHBvaW50ZXJzIGluIHRoZSBjb2ZmCi0gICBpbWFnZSBhbmQgTk9UIGluIHRoZSBmaWxlLgotCi0gICBUbyBiZSBjb21wYXRpYmxlIHdpdGggYW55IGV4aXN0aW5nIGV4ZWN1dGFibGVzIEkgaGF2ZSBmaXhlZCB0aGlzCi0gICBoZXJlIGFuZCBOT1QgaW4gdGhlIERKR1BQIHN0YXJ0dXAgY29kZS4KLSAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JCWdvMzJzdHViYmVkY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJCSJjb2ZmLWdvMzItZXhlIgotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRQknXycKLSNkZWZpbmUgQ09GRl9HTzMyX0VYRQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotI2RlZmluZSBDT0ZGX1NVUFBPUlRfR05VX0xJTktPTkNFCi0KLSNkZWZpbmUgQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTIFwKLXsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuZGF0YSIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgNCB9LCBcCi17IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLnRleHQiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDQgfQotCi0jaW5jbHVkZSAiYmZkLmgiCi0KLS8qIEF0IGZpcnN0IHRoZSBwcm90b3R5cGVzICovCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfZmlsZWhkcl9pbl9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBzcmMsIFBUUiBkc3QpKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3RfZmlsZWhkcl9vdXRfcHJlIFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbiwgUFRSIG91dCkpOwotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX291dF9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbiwgUFRSIG91dCkpOwotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9pbl9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBleHQsIFBUUiBpbikpOwotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfb3V0X3ByZSBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgaW4sIFBUUiBvdXQpKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX291dF9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbiwgUFRSIG91dCkpOwotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2F1eF9pbl9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBleHQxLCBpbnQgdHlwZSwgaW50IGNsYXNzLCBpbnQgaW5keCwKLQkJCSAgICBpbnQgbnVtYXV4LCBQVFIgaW4xKSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X2F1eF9vdXRfcHJlIFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbnAsIGludCB0eXBlLCBpbnQgY2xhc3MsIGludCBpbmR4LAotCQkJICAgIGludCBudW1hdXgsIFBUUiBleHRwKSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X2F1eF9vdXRfcG9zdCBQQVJBTVMgKChiZmQgKiBhYmZkLCBQVFIgaW5wLCBpbnQgdHlwZSwgaW50IGNsYXNzLCBpbnQgaW5keCwKLQkJCSAgICAgaW50IG51bWF1eCwgUFRSIGV4dHApKTsKLQotc3RhdGljIHZvaWQKLWNyZWF0ZV9nbzMyX3N0dWIgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi0vKgotICAgQWxsIHRoYXQgLi4uX1BSRSBhbmQgLi4uUE9TVCBmdW5jdGlvbnMgYXJlIGNhbGxlZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nCi0gICBjb2ZmX3N3YXAuLi4gZnVuY3Rpb25zLiBUaGUgLi4uUFJFIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcKLSAgIG9mIHRoZSBmdW5jdGlvbiBhbmQgdGhlIC4uLlBPU1QgZnVuY3Rpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHN3YXAgcm91dGluZXMuCi0gKi8KLQotI2RlZmluZSBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BPU1QgYWRqdXN0X2ZpbGVoZHJfaW5fcG9zdAotI2RlZmluZSBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QUkUgYWRqdXN0X2ZpbGVoZHJfb3V0X3ByZQotI2RlZmluZSBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QT1NUIGFkanVzdF9maWxlaGRyX291dF9wb3N0Ci0KLSNkZWZpbmUgQ09GRl9BREpVU1RfU0NOSERSX0lOX1BPU1QgYWRqdXN0X3Njbmhkcl9pbl9wb3N0Ci0jZGVmaW5lIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUFJFIGFkanVzdF9zY25oZHJfb3V0X3ByZQotI2RlZmluZSBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BPU1QgYWRqdXN0X3Njbmhkcl9vdXRfcG9zdAotCi0jZGVmaW5lIENPRkZfQURKVVNUX0FVWF9JTl9QT1NUIGFkanVzdF9hdXhfaW5fcG9zdAotI2RlZmluZSBDT0ZGX0FESlVTVF9BVVhfT1VUX1BSRSBhZGp1c3RfYXV4X291dF9wcmUKLSNkZWZpbmUgQ09GRl9BREpVU1RfQVVYX09VVF9QT1NUIGFkanVzdF9hdXhfb3V0X3Bvc3QKLQotc3RhdGljIGJvb2xlYW4KLSAgZ28zMl9zdHViYmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiBpYmZkLCBiZmQgKiBvYmZkKSk7Ci0KLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIGdvMzJfc3R1YmJlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLQotI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgotCi0vKiBJIGhvbGQgaW4gdGhlIHVzcmRhdGEgdGhlIHN0dWIgKi8KLSNkZWZpbmUgYmZkX2NvZmZfZ28zMnN0dWIgYmZkX3VzcmRhdGEKLQotLyogVGhpcyBtYWNybyBpcyB1c2VkLCBiZWNhdXNlIEkgY2Fubm90IGFzc3VtZSB0aGUgZW5kaWFuZXNzIG9mIHRoZQotICAgaG9zdCBzeXN0ZW0gKi8KLSNkZWZpbmUgX0goaW5kZXgpIChiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopKGhlYWRlcitpbmRleCoyKSkpCi0KLS8qIFRoZXNlIGJ5dGVzIGFyZSBhIDIwNDgtYnl0ZSBET1MgZXhlY3V0YWJsZSwgd2hpY2ggbG9hZHMgdGhlIENPRkYKLSAgIGltYWdlIGludG8gbWVtb3J5IGFuZCB0aGVuIHJ1bnMgaXQuIEl0IGlzIGNhbGxlZCAnc3R1YicgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgc3R1Yl9ieXRlc1tTVFVCU0laRV0gPQotewotI2luY2x1ZGUgImdvMzJzdHViLmgiCi19OwotCi0vKgotICAgSSBoYXZlIG5vdCBjb21tZW50ZWQgZWFjaCBzd2FwIGZ1bmN0aW9uIGJlbG93LCBiZWNhdXNlIHRoZQotICAgdGVjaG5pcXVlIGlzIGluIGFueSBmdW5jdGlvbiB0aGUgc2FtZS4gRm9yIHRoZSAuLi5pbiBmdW5jdGlvbiwKLSAgIGFsbCB0aGUgcG9pbnRlcnMgYXJlIGFkanVzdGVkIGJ5IGFkZGluZyBTVFVCU0laRSBhbmQgZm9yIHRoZQotICAgLi4ub3V0IGZ1bmN0aW9uLCBpdCBpcyBzdWJ0cmFjdGVkIGZpcnN0IGFuZCBhZnRlciBjYWxsaW5nIHRoZQotICAgc3RhbmRhcmQgc3dhcCBmdW5jdGlvbiBpdCBpcyByZXNldCB0byB0aGUgb2xkIHZhbHVlICovCi0KLS8qIFRoaXMgbWFjcm8gaXMgdXNlZCBmb3IgYWRqdXN0aW5nIHRoZSBmaWxlcG9pbnRlcnMsIHdoaWNoCi0gICBpcyBkb25lIG9ubHksIGlmIHRoZSBwb2ludGVyIGlzIG5vbnplcm8gKi8KLQotI2RlZmluZSBBREpVU1RfVkFMKHZhbCxkaWZmKSBcCi0gIGlmICh2YWwgIT0gMCkgdmFsICs9IGRpZmYKLQotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX2luX3Bvc3QgIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgc3JjOwotICAgICBQVFIgZHN0OwotewotICBGSUxIRFIgKmZpbGVoZHJfc3JjID0gKEZJTEhEUiAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2RzdCA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBkc3Q7Ci0KLSAgQURKVVNUX1ZBTCAoZmlsZWhkcl9kc3QtPmZfc3ltcHRyLCBTVFVCU0laRSk7Ci0KLSAgLyogU2F2ZSBub3cgdGhlIHN0dWIgdG8gYmUgdXNlZCBsYXRlciAqLwotICBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIFNUVUJTSVpFKTsKLQotICAvKiBTaW5jZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgbm8gc3RhdHVzLCBJIGRvIG5vdCBzZXQgaGVyZQotICAgICBhbnkgYmZkX2Vycm9yXy4uLgotICAgICBUaGF0IG1lYW5zLCBiZWZvcmUgdGhlIHVzZSBvZiBiZmRfY29mZl9nbzMyc3R1YiAoKSwgdGhpcyB2YWx1ZQotICAgICBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyAhPSBOVUxMICovCi0gIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIG1lbWNweSAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpLCBmaWxlaGRyX3NyYy0+c3R1YiwgU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfb3V0X3ByZSAgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGluOwotICAgICBQVFIgb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBpbjsKLSAgRklMSERSICpmaWxlaGRyX291dCA9IChGSUxIRFIgKikgb3V0OwotCi0gIC8qIEdlbmVyYXRlIHRoZSBzdHViICovCi0gIGNyZWF0ZV9nbzMyX3N0dWIgKGFiZmQpOwotCi0gIC8qIENvcHkgdGhlIHN0dWIgdG8gdGhlIGZpbGUgaGVhZGVyICovCi0gIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgIT0gTlVMTCkKLSAgICBtZW1jcHkgKGZpbGVoZHJfb3V0LT5zdHViLCBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIFNUVUJTSVpFKTsKLSAgZWxzZQotICAgIC8qIHVzZSB0aGUgZGVmYXVsdCAqLwotICAgIG1lbWNweSAoZmlsZWhkcl9vdXQtPnN0dWIsIHN0dWJfYnl0ZXMsIFNUVUJTSVpFKTsKLQotICBBREpVU1RfVkFMIChmaWxlaGRyX2luLT5mX3N5bXB0ciwgLVNUVUJTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX291dF9wb3N0ICAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBpbjsKLSAgICAgUFRSIG91dCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBpbjsKLSAgLyogdW5kbyB0aGUgYWJvdmUgY2hhbmdlICovCi0gIEFESlVTVF9WQUwgKGZpbGVoZHJfaW4tPmZfc3ltcHRyLCBTVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX2luX3Bvc3QgIChhYmZkLCBleHQsIGluKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGV4dCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW47Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBpbjsKLQotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3NjbnB0ciwgU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3JlbHB0ciwgU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX2xubm9wdHIsIFNUVUJTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfb3V0X3ByZSAgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW47Ci0gICAgIFBUUiBvdXQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOwotCi0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfc2NucHRyLCAtU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3JlbHB0ciwgLVNUVUJTSVpFKTsKLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19sbm5vcHRyLCAtU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9vdXRfcG9zdCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBpbjsKLSAgICAgUFRSIG91dCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47Ci0KLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19zY25wdHIsIFNUVUJTSVpFKTsKLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19yZWxwdHIsIFNUVUJTSVpFKTsKLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19sbm5vcHRyLCBTVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X2luX3Bvc3QgIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZXh0MSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGNsYXNzOwotICAgICBpbnQgaW5keCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgbnVtYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopIGluMTsKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBBREpVU1RfVkFMIChpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyLCBTVFVCU0laRSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2F1eF9vdXRfcHJlICAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGlucDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBjbGFzczsKLSAgICAgaW50IGluZHggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG51bWF1eCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZXh0cCBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKSBpbnA7Ci0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgQURKVVNUX1ZBTCAoaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgLVNUVUJTSVpFKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X291dF9wb3N0IChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgaW5wOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGNsYXNzOwotICAgICBpbnQgaW5keCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgbnVtYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBleHRwIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopIGlucDsKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBBREpVU1RfVkFMIChpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyLCBTVFVCU0laRSk7Ci0gICAgfQotfQotCi0vKgotICAgVGhhdCdzIHRoZSBmdW5jdGlvbiwgd2hpY2ggY3JlYXRlcyB0aGUgc3R1Yi4gVGhlcmUgYXJlCi0gICBkaWZmZXJlbnQgY2FzZXMgZnJvbSB3aGVyZSB0aGUgc3R1YiBpcyB0YWtlbi4KLSAgIEF0IGZpcnN0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkKEdPMzJTVFVCKSBpcyBjaGVja2VkIGFuZCB0aGVuCi0gICAkKFNUVUIpIGlmIGl0IHdhcyBub3Qgc2V0LgotICAgSWYgaXQgZXhpc3RzIGFuZCBwb2ludHMgdG8gYSB2YWxpZCBzdHViIHRoZSBzdHViIGlzIHRha2VuIGZyb20KLSAgIHRoYXQgZmlsZS4gVGhpcyBmaWxlIGNhbiBiZSBhbHNvIGEgd2hvbGUgZXhlY3V0YWJsZSBmaWxlLCBiZWNhdXNlCi0gICB0aGUgc3R1YiBpcyBjb21wdXRlZCBmcm9tIHRoZSBleGUgaW5mb3JtYXRpb24gYXQgdGhlIHN0YXJ0IG9mIHRoYXQKLSAgIGZpbGUuCi0KLSAgIElmIHRoZXJlIHdhcyBhbnkgZXJyb3IsIHRoZSBzdGFuZGFyZCBzdHViIChjb21waWxlZCBpbiB0aGlzIGZpbGUpCi0gICBpcyB0YWtlbi4KLSAqLwotCi1zdGF0aWMgdm9pZAotY3JlYXRlX2dvMzJfc3R1YiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAvKiBEbyBpdCBvbmx5IG9uY2UgKi8KLSAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKnN0dWI7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICAgIGludCBmOwotICAgICAgdW5zaWduZWQgY2hhciBoZWFkZXJbMTBdOwotICAgICAgY2hhciBtYWdpY1s4XTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgY29mZl9zdGFydCwgZXhlX3N0YXJ0OwotCi0gICAgICAvKiBDaGVjayBhdCBmaXJzdCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJChHTzMyU1RVQikgKi8KLSAgICAgIHN0dWIgPSBnZXRlbnYgKCJHTzMyU1RVQiIpOwotICAgICAgLyogTm93IGNoZWNrIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkKFNUVUIpICovCi0gICAgICBpZiAoc3R1YiA9PSBOVUxMKQotCXN0dWIgPSBnZXRlbnYgKCJTVFVCIik7Ci0gICAgICBpZiAoc3R1YiA9PSBOVUxMKQotCWdvdG8gc3R1Yl9lbmQ7Ci0gICAgICBpZiAoc3RhdCAoc3R1YiwgJnN0KSAhPSAwKQotCWdvdG8gc3R1Yl9lbmQ7Ci0jaWZkZWYgT19CSU5BUlkKLSAgICAgIGYgPSBvcGVuIChzdHViLCBPX1JET05MWSB8IE9fQklOQVJZKTsKLSNlbHNlCi0gICAgICBmID0gb3BlbiAoc3R1YiwgT19SRE9OTFkpOwotI2VuZGlmCi0gICAgICBpZiAoZiA8IDApCi0JZ290byBzdHViX2VuZDsKLSAgICAgIGlmIChyZWFkIChmLCAmaGVhZGVyLCBzaXplb2YgKGhlYWRlcikpIDwgMCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIGlmIChfSCAoMCkgIT0gMHg1YTRkKQkvKiBpdCBpcyBub3QgYW4gZXhlIGZpbGUgKi8KLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHN0dWIgKGl0IGlzIGV2ZXJ5IHRoaW5nIHVwCi0gICAgICAgICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb2ZmIGltYWdlKSAqLwotICAgICAgY29mZl9zdGFydCA9IChsb25nKSBfSCAoMikgKiA1MTJMOwotICAgICAgaWYgKF9IICgxKSkKLQljb2ZmX3N0YXJ0ICs9IChsb25nKSBfSCAoMSkgLSA1MTJMOwotCi0gICAgICAvKiBDdXJyZW50bHkgdGhlcmUgaXMgb25seSBhIGZpeGVkIHN0dWIgc2l6ZSBvZiAyMDQ4IGJ5dGVzCi0gICAgICAgICBzdXBwb3J0ZWQgKi8KLSAgICAgIGlmIChjb2ZmX3N0YXJ0ICE9IDIwNDgpCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICBleGVfc3RhcnQgPSBfSCAoNCkgKiAxNjsKLSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgbHNlZWsgKGYsIGV4ZV9zdGFydCwgU0VFS19TRVQpICE9IGV4ZV9zdGFydCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIGlmIChyZWFkIChmLCAmbWFnaWMsIDgpICE9IDgpCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICBpZiAobWVtY21wIChtYWdpYywgImdvMzJzdHViIiwgOCkgIT0gMCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICBnb3RvIHN0dWJfZW5kOwotCX0KLSAgICAgIC8qIE5vdyB3ZSBmb3VuZCBhIGNvcnJlY3Qgc3R1YiAoaG9wZWZ1bGx5KSAqLwotICAgICAgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBjb2ZmX3N0YXJ0KTsKLSAgICAgIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLQl7Ci0JICBjbG9zZSAoZik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbHNlZWsgKGYsIDBMLCBTRUVLX1NFVCk7Ci0gICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIHJlYWQgKGYsIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSwgY29mZl9zdGFydCkKLQkgICE9IGNvZmZfc3RhcnQpCi0JewotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSk7Ci0JICBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPSBOVUxMOwotCX0KLSAgICAgIGNsb3NlIChmKTsKLSAgICB9Ci1zdHViX2VuZDoKLSAgLyogVGhlcmUgd2FzIHNvbWV0aGluZyB3cm9uZyBhYm92ZSwgc28gdXNlIG5vdyB0aGUgc3RhbmRhcmQgYnVpbHRpbgotICAgICBzdHViICovCi0gIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIFNUVUJTSVpFKTsKLSAgICAgIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLQl7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBtZW1jcHkgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSwgc3R1Yl9ieXRlcywgU1RVQlNJWkUpOwotICAgIH0KLX0KLQotLyogSWYgaWJmZCB3YXMgYSBzdHViYmVkIGNvZmYgaW1hZ2UsIGNvcHkgdGhlIHN0dWIgZnJvbSB0aGF0IGJmZAotICAgdG8gdGhlIG5ldyBvYmZkLgotICovCi0KLXN0YXRpYyBib29sZWFuCi1nbzMyX3N0dWJiZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhICAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIC8qIGNoZWNrIGlmIGJvdGggYXJlIHRoZSBzYW1lIHRhcmdldHMgKi8KLSAgaWYgKGliZmQtPnh2ZWMgIT0gb2JmZC0+eHZlYykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBjaGVjayBpZiBib3RoIGhhdmUgYSB2YWxpZCBzdHViICovCi0gIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoaWJmZCkgPT0gTlVMTAotICAgICAgfHwgYmZkX2NvZmZfZ28zMnN0dWIgKG9iZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTm93IGNvcHkgdGhlIHN0dWIgKi8KLSAgbWVtY3B5IChiZmRfY29mZl9nbzMyc3R1YiAob2JmZCksIGJmZF9jb2ZmX2dvMzJzdHViIChpYmZkKSwgU1RVQlNJWkUpOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtc3ZtNjhrLmMgYi9iZmQvY29mZi1zdm02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyYTVhNy4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1zdm02OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgc3lzdjY4Ci0gICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JbTY4a3N5c3Zjb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1tNjhrLXN5c3YiCi0jZGVmaW5lIFNUQVRJQ19SRUxPQ1MKLSNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECi0KLSNpbmNsdWRlICJjb2ZmLW02OGsuYyIKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXRpYzMwLmMgYi9iZmQvY29mZi10aWMzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTcxZjc2Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXRpYzMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBUTVMzMjBDMzAgY29mZiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi90aWMzMC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotCi1yZWxvY19ob3d0b190eXBlIHRpYzMwX2NvZmZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChSX1RJQzMwX0FCUzE2LCAyLCAxLCAxNiwgZmFsc2UsIDAsIDAsIE5VTEwsCi0JICIxNiIsIGZhbHNlLCAweDAwMDBGRkZGLCAweDAwMDBGRkZGLCBmYWxzZSksCi0gIEhPV1RPIChSX1RJQzMwX0FCUzI0LCAyLCAyLCAyNCwgZmFsc2UsIDgsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiMjQiLCBmYWxzZSwgMHhGRkZGRkYwMCwgMHhGRkZGRkYwMCwgZmFsc2UpLAotICBIT1dUTyAoUl9USUMzMF9MRFAsIDE4LCAwLCAyNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiTERQIiwgZmFsc2UsIDB4MDBGRjAwMDAsIDB4MDAwMDAwRkYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVElDMzBfQUJTMzIsIDIsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIE5VTEwsCi0JICIzMiIsIGZhbHNlLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCBmYWxzZSksCi0gIEhPV1RPIChSX1RJQzMwX1BDMTYsIDIsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIE5VTEwsCi0JICJQQ1JFTCIsIGZhbHNlLCAweDAwMDBGRkZGLCAweDAwMDBGRkZGLCBmYWxzZSksCi0gIEVNUFRZX0hPV1RPICgtMSkKLX07Ci0KLSNpZm5kZWYgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgdGljMzBfY29mZl9yZWxvY190eXBlX2xvb2t1cAotCi0vKiBGb3IgdGhlIGNhc2Ugc3RhdGVtZW50IHVzZSB0aGUgY29kZSB2YWx1ZXMgdXNlZCBpbiB0Y19nZW5fcmVsb2MgdG8KLSAgIG1hcCB0byB0aGUgaG93dG8gdGFibGUgZW50cmllcyB0aGF0IG1hdGNoIHRob3NlIGluIGJvdGggdGhlIGFvdXQKLSAgIGFuZCBjb2ZmIGltcGxlbWVudGF0aW9ucy4gKi8KLXJlbG9jX2hvd3RvX3R5cGUgKgotdGljMzBfY29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVElDMzBfTERQOgotICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzJdOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzBdOwotICAgIGNhc2UgQkZEX1JFTE9DXzI0OgotICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzFdOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgotICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzRdOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzNdOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLwotCi1zdGF0aWMgaW50Ci1jb2ZmX3RpYzMwX3NlbGVjdF9yZWxvYyAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gaG93dG8tPnR5cGU7Ci19Ci0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHgucl90eXBlID0gY29mZl90aWMzMF9zZWxlY3RfcmVsb2MoaG93dG8pCi0KLQotI2RlZmluZSBCQURNQUcoeCkgVElDMzBCQURNQUcoeCkKLSNkZWZpbmUgVElDMzAgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0vKiBDb2RlIHRvIHN3YXAgaW4gdGhlIHJlbG9jICovCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOyBcCi1kc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZS4gKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQotICAgICBhcmVsZW50ICppbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHN3aXRjaCAoZHN0LT5yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9USUMzMF9BQlMxNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzBdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1RJQzMwX0FCUzI0OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVElDMzBfQUJTMzI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVszXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9USUMzMF9MRFA6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVsyXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9USUMzMF9QQzE2OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbNF07Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLS8qIFBlcmZvcm0gYW55IG5lY2Vzc2FyeSBtYWdpYyB0byB0aGUgYWRkZW5kIGluIGEgcmVsb2MgZW50cnkgKi8KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICpyZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmIChyZWxvYy0+cl9zeW1uZHggPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLSAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7Ci0gIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Ci19Ci0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1jb25zdCBiZmRfdGFyZ2V0IHRpYzMwX2NvZmZfdmVjID0KLXsKLSAgImNvZmYtdGljMzAiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIENPRkZfU1dBUF9UQUJMRQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXRpYzgwLmMgYi9iZmQvY29mZi10aWM4MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTMyZWE2Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXRpYzgwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDODAgTXVsdGltZWRpYSBWaWRlbyBQcm9jZXNzb3IgKE1WUCkuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggKGZuZkBjeWdudXMuY29tKQotCi0gICBUaGVyZSBpcyBub3RoaW5nIG5ldyB1bmRlciB0aGUgc3VuLiBUaGlzIGZpbGUgZHJhd3MgYSBsb3Qgb24gb3RoZXIKLSAgIGNvZmYgZmlsZXMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi90aWM4MC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotI2RlZmluZSBDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSIDEKLSNkZWZpbmUgQ09GRl9BTElHTl9JTl9TRkxBR1MgMQotCi0jZGVmaW5lIEdFVF9TQ05IRFJfRkxBR1MgYmZkX2hfZ2V0XzE2Ci0jZGVmaW5lIFBVVF9TQ05IRFJfRkxBR1MgYmZkX2hfcHV0XzE2Ci0KLXN0YXRpYyB2b2lkIHJ0eXBlMmhvd3RvCi0gIFBBUkFNUyAoKGFyZWxlbnQgKmNhY2hlX3B0ciwgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3QpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBiYXNlX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBnbG9iMTVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGdsb2IxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbG9jYWwxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgdGljODBfaG93dG9fdGFibGVbXSA9Ci17Ci0KLSAgSE9XVE8gKFJfUkVMTE9ORywJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFTExPTkciLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTVBQQ1IsCQkJLyogdHlwZSAqLwotCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJNUFBDUiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BQlMsCQkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiQUJTIiwJCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBCQVNFLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGJhc2VfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBCQVNFIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTEJBU0UsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwYmFzZV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUExCQVNFIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQMTUsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUDE1IiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFAxNVciLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFAxNUgsCQkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUDE1SCIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUDE2QiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQMTZCIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTDE1LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUEwxNSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUEwxNVciLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTDE1SCwJCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTVIIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUEwxNkIsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGxvY2FsMTZfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTZCIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUE4xNSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUE4xNSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUE4xNVcsCQkJLyogdHlwZSAqLwotCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBOMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTjE1SCwJCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNV9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUE4xNUgiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBOMTZCLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTjE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExOMTUsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUExOMTUiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTE4xNVcsCQkJLyogdHlwZSAqLwotCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUExOMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExOMTVILAkJCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE1SCIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMTjE2QiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGxvY2FsMTZfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotDAotLyogU3BlY2lhbCByZWxvY2F0aW9uIGZ1bmN0aW9ucywgdXNlZCB3aGVuIHRoZSBvdXRwdXQgZmlsZSBpcyBub3QKLSAgIGl0c2VsZiBhIENPRkYgVEljODAgZmlsZS4gICovCi0KLS8qIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgYmFzZSBhZGRyZXNzIHR5cGUKLSAgIHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBiYXNlX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2xfaW4gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgZ2xvYmFsIDE1IGJpdCByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWdsb2IxNV9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBGSVhNRS4gICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGdsb2JhbCAxNiBiaXQgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1nbG9iMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogRklYTUUuICAqLwotICBhYm9ydCAoKTsKLX0KLQotLyogVGhpcyBzcGVjaWFsIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRoZSBsb2NhbCAxNiBiaXQgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1sb2NhbDE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2xfaW4gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0MCi0vKiBDb2RlIHRvIHR1cm4gYW4gZXh0ZXJuYWwgcl90eXBlIGludG8gYSBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBob3d0b190YWJsZS4KLSAgIElmIHBhc3NlZCBhbiByX3R5cGUgd2UgZG9uJ3QgcmVjb2duaXplIHRoZSBhYm9ydCByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWlsaW5nCi0gICB0byBnZW5lcmF0ZSBhbiBvdXRwdXQgZmlsZS4gKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiB0aWM4MF9ob3d0b190YWJsZSAvIHNpemVvZiB0aWM4MF9ob3d0b190YWJsZVswXTsgaSsrKQotICAgIHsKLSAgICAgIGlmICh0aWM4MF9ob3d0b190YWJsZVtpXS50eXBlID09IGRzdC0+cl90eXBlKQotCXsKLQkgIGNhY2hlX3B0ci0+aG93dG8gPSB0aWM4MF9ob3d0b190YWJsZSArIGk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlVucmVjb2duaXplZCByZWxvYyB0eXBlIDB4JXgiKSwKLQkJCSAodW5zaWduZWQgaW50KSBkc3QtPnJfdHlwZSk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSB0aWM4MF9ob3d0b190YWJsZSArIDA7Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIHJ0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLSNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBjb2ZmX3RpYzgwX3J0eXBlX3RvX2hvd3RvCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfdGljODBfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hICphZGRlbmRwOwotewotICBhcmVsZW50IGdlbnJlbDsKLQotICBpZiAocmVsIC0+IHJfc3ltbmR4ID09IC0xICYmIGFkZGVuZHAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgVEkgImludGVybmFsIHJlbG9jYXRpb24iLCB3aGljaCBtZWFucyB0aGF0IHRoZSByZWxvY2F0aW9uCi0JIGFtb3VudCBpcyB0aGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBjdXJyZW50IHNlY3Rpb24gaXMgYmVpbmcgcmVsb2NhdGVkCi0JIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gKi8KLSAgICAgICphZGRlbmRwID0gKHNlYyAtPiBvdXRwdXRfc2VjdGlvbiAtPiB2bWEgKyBzZWMgLT4gb3V0cHV0X29mZnNldCkgLSBzZWMgLT4gdm1hOwotICAgIH0KLSAgUlRZUEUySE9XVE8gKCZnZW5yZWwsIHJlbCk7Ci0gIHJldHVybiBnZW5yZWwuaG93dG87Ci19Ci0KLSNpZm5kZWYgQkFETUFHCi0jZGVmaW5lIEJBRE1BRyh4KSBUSUM4MEJBRE1BRyh4KQotI2VuZGlmCi0MCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBjb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24KLQotLyogV2UgbmVlZCBhIHNwZWNpYWwgcmVsb2NhdGlvbiByb3V0aW5lIHRvIGhhbmRsZSB0aGUgUFAgcmVsb2NzLiAgTW9zdAotICAgb2YgdGhpcyBpcyBhIGNvcHkgb2YgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwKLQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbG9jcywgc3ltcywKLQkJCSAgICAgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGxvbmcgc3ltbmR4OwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYmZkX3ZtYSBhZGRyOwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JeyAgICAKLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgLyogQ09GRiB0cmVhdHMgY29tbW9uIHN5bWJvbHMgaW4gb25lIG9mIHR3byB3YXlzLiAgRWl0aGVyIHRoZQotICAgICAgICAgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIGluY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBvciBpdAotICAgICAgICAgaXMgbm90LiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNpemUgaXMgbm90IGluY2x1ZGVkLCBhbmQgZm9yY2UKLSAgICAgICAgIHRoZSBydHlwZV90b19ob3d0byBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIGFkZGVuZCBhcyBuZWVkZWQuICAqLwotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotICAgICAgaG93dG8gPSBiZmRfY29mZl9ydHlwZV90b19ob3d0byAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwsIGgsCi0JCQkJICAgICAgIHN5bSwgJmFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLSAgICAgICAgICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBzeW0tPm5fdmFsdWUpOwotCSAgICAgIGlmICghIG9ial9wZSAob3V0cHV0X2JmZCkpCi0JCXZhbCAtPSBzZWMtPnZtYTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgfQotCi0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBhZGRyID0gcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICAvKiBGSVhNRTogVGhpcyBjb2RlIGFzc3VtZXMgbGl0dGxlIGVuZGlhbiwgYnV0IHRoZSBQUCBjYW4KLSAgICAgICAgIGFwcGFyZW50bHkgYmUgYmktZW5kaWFuLiAgSSBkb24ndCBrbm93IGlmIHRoZSBiaS1lbmRpYW5uZXNzCi0gICAgICAgICBhcHBsaWVzIHRvIHRoZSBpbnN0cnVjdGlvbiBzZXQgb3IganVzdCB0byB0aGUgZGF0YS4gICovCi0gICAgICBzd2l0Y2ggKGhvd3RvLT50eXBlKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgUl9BQlM6Ci0JY2FzZSBSX1JFTExPTkdYOgotCWNhc2UgUl9QUEwxNToKLQljYXNlIFJfUFBMMTVXOgotCWNhc2UgUl9QUEwxNUg6Ci0JY2FzZSBSX1BQTE4xNToKLQljYXNlIFJfUFBMTjE1VzoKLQljYXNlIFJfUFBMTjE1SDoKLQkgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgY29udGVudHMsIGFkZHIsIHZhbCwgYWRkZW5kKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BQMTU6Ci0JY2FzZSBSX1BQMTVXOgotCWNhc2UgUl9QUDE1SDoKLQljYXNlIFJfUFBOMTU6Ci0JY2FzZSBSX1BQTjE1VzoKLQljYXNlIFJfUFBOMTVIOgotCSAgLyogT2Zmc2V0IHRoZSBhZGRyZXNzIHNvIHRoYXQgd2UgY2FuIHVzZSA0IGJ5dGUgcmVsb2NhdGlvbnMuICAqLwotCSAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cyArIDIsIGFkZHIsIHZhbCwgYWRkZW5kKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BQMTZCOgotCWNhc2UgUl9QUE4xNkI6Ci0JICB7Ci0JICAgIC8qIFRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyBzdG9yZWQgaW4gYml0IDYuICAqLwotCSAgICBiZmRfYnl0ZSBob2xkOwotCi0JICAgIGhvbGQgPSBjb250ZW50c1thZGRyICsgNF07Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyA0XSAmPX4gMHgyMDsKLQkgICAgY29udGVudHNbYWRkciArIDRdIHw9IChjb250ZW50c1thZGRyXSA+PiAxKSAmIDB4MjA7Ci0JICAgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgICBjb250ZW50cyArIDIsIGFkZHIsCi0JCQkJCSAgICAgIHZhbCwgYWRkZW5kKTsKLQkgICAgY29udGVudHNbYWRkcl0gJj1+IDB4NDA7Ci0JICAgIGNvbnRlbnRzW2FkZHJdIHw9IChjb250ZW50c1thZGRyICsgNF0gPDwgMSkgJiAweDQwOwotCSAgICBjb250ZW50c1thZGRyICsgNF0gJj1+IDB4MjA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyA0XSB8PSBob2xkICYgMHgyMDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlIFJfUFBMMTZCOgotCWNhc2UgUl9QUExOMTZCOgotCSAgewotCSAgICAvKiBUaGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgc3RvcmVkIGluIGJpdCAyOC4gICovCi0JICAgIGJmZF9ieXRlIGhvbGQ7Ci0KLQkgICAgaG9sZCA9IGNvbnRlbnRzW2FkZHIgKyAxXTsKLQkgICAgY29udGVudHNbYWRkciArIDFdICY9fiAweDgwOwotCSAgICBjb250ZW50c1thZGRyICsgMV0gfD0gKGNvbnRlbnRzW2FkZHIgKyAzXSA8PCAzKSAmIDB4ODA7Ci0JICAgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgICBjb250ZW50cywgYWRkciwKLQkJCQkJICAgICAgdmFsLCBhZGRlbmQpOwotCSAgICBjb250ZW50c1thZGRyICsgM10gJj0gfjB4MTA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAzXSB8PSAoY29udGVudHNbYWRkciArIDFdID4+IDMpICYgMHgxMDsKLQkgICAgY29udGVudHNbYWRkciArIDFdICY9fiAweDgwOwotCSAgICBjb250ZW50c1thZGRyICsgMV0gfD0gaG9sZCAmIDB4ODA7Ci0JICAgIGJyZWFrOwotCSAgfQotCQotCWNhc2UgUl9QUEJBU0U6Ci0JICAvKiBQYXJhbWV0ZXIgUkFNIGlzIGZyb20gMHgxMDAwMDAwIHRvIDB4MTAwMDgwMC4gICovCi0JICBjb250ZW50c1thZGRyXSAmPX4gMHgzOwotCSAgaWYgKHZhbCA+PSAweDEwMDAwMDAgJiYgdmFsIDwgMHgxMDAwODAwKQotCSAgICBjb250ZW50c1thZGRyXSB8PSAweDM7Ci0JICBlbHNlCi0JICAgIGNvbnRlbnRzW2FkZHJdIHw9IDB4MjsKLQkgIHJzdGF0ID0gYmZkX3JlbG9jX29rOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfUFBMQkFTRToKLQkgIC8qIFBhcmFtZXRlciBSQU0gaXMgZnJvbSAweDEwMDAwMDAgdG8gMHgxMDAwODAwLiAgKi8KLQkgIGNvbnRlbnRzW2FkZHIgKyAyXSAmPSB+MHhjMDsKLQkgIGlmICh2YWwgPj0gMHgxMDAwMDAwICYmIHZhbCA8IDB4MTAwMDgwMCkKLQkgICAgY29udGVudHNbYWRkciArIDJdIHw9IDB4YzA7Ci0JICBlbHNlCi0JICAgIGNvbnRlbnRzW2FkZHIgKyAyXSB8PSAweDgwOwotCSAgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBiYWQgcmVsb2MgYWRkcmVzcyAweCVseCBpbiBzZWN0aW9uIGAlcyciKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JICAgICAodW5zaWduZWQgbG9uZykgcmVsLT5yX3ZhZGRyLAotCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0jZGVmaW5lIFRJQzgwQ09GRiAxCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotI3VuZGVmIENfQVVUT0FSRwkJLyogQ2xhc2hlcyB3aXRoIFRJYzgwJ3MgQ19VRVhUICovCi0jdW5kZWYgQ19MQVNURU5UCQkvKiBDbGFzaGVzIHdpdGggVEljODAncyBDX1NUQVRMQUIgKi8KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1DUkVBVEVfTElUVExFX0NPRkZfVEFSR0VUX1ZFQyAodGljODBjb2ZmX3ZlYywgImNvZmYtdGljODAiLCBEX1BBR0VELCAwLCAnXycsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZi11NjhrLmMgYi9iZmQvY29mZi11NjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZWE3M2YuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtdTY4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSA2ODAwMCBDT0ZGIGJpbmFyaWVzIGhhdmluZyB1bmRlcnNjb3JlIHdpdGggbmFtZS4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JbTY4a2NvZmZ1bl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtbTY4ay11biIKLQotI2RlZmluZSBOQU1FU19IQVZFX1VOREVSU0NPUkUKLQotLyogZGVmaW5lIHRoaXMgdG8gbm90IGhhdmUgbXVsdGlwbGUgY29weSBvZiBtNjhrX3J0eXBlMmhvd3RvCi0gICBpbiB0aGUgZXhlY3V0YWJsZSBmaWxlICovCi0jZGVmaW5lIE9OTFlfREVDTEFSRV9SRUxPQ1MKLQotLyogVGhpcyBtYWdpYyBudW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG5hbWVzIGhhdmUgdW5kZXJzY29yZXMuCi0gICBPdGhlciA2OGsgbWFnaWMgbnVtYmVycyBpbmRpY2F0ZSB0aGF0IHRoZSBuYW1lcyBkbyBub3QgaGF2ZQotICAgdW5kZXJzY29yZXMuICAqLwotI2RlZmluZSBCQURNQUcoeCkgKCh4KS5mX21hZ2ljICE9IE1DNjhLQkNTTUFHSUMpCi0KLSNpbmNsdWRlICJjb2ZmLW02OGsuYyIKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXc2NS5jIGIvYmZkL2NvZmYtdzY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNzliZmIuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtdzY1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBXREMgNjU4MTYgQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL3c2NS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChSX1c2NV9BQlM4LCAgICAwLCAgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiYWJzOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X0FCUzE2LCAgIDEsICAwLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiYWJzMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1c2NV9BQlMyNCwgICAwLCAgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczI0IiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTOFM4LCAgMCwgIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIj5hYnM4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTOFMxNiwgMCwgIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIl5hYnM4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTMTZTOCwgMSwgIDAsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICI+YWJzMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1c2NV9BQlMxNlMxNiwxLCAgMCwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIl5hYnMxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X1BDUjgsICAgIDAsICAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJwY3JlbDgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLSAgSE9XVE8gKFJfVzY1X1BDUjE2LCAgIDEsICAwLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicGNyZWwxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIHRydWUpLAotICBIT1dUTyAoUl9XNjVfRFAsICAgIDAsICAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJkcCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLQotfTsKLQotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSBcCi0gIHsgeC5yX3R5cGUgPSBzZWxlY3RfcmVsb2MoaG93dG8pOyB9Ci0KLSNkZWZpbmUgQkFETUFHKHgpIChXNjVCQURNQUcoeCkpCi0jZGVmaW5lIFc2NSAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLQotc3RhdGljIGludAotc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZSA7Ci19Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQotICAgICBhcmVsZW50ICppbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIGRzdC0+cl90eXBlIC0gMTsKLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICogcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLXsKLSAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7Ci0gIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKLQotICBpZiAoKChpbnQpIHJlbG9jLT5yX3N5bW5keCkgPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSYoYmZkX2Fic19zeW1ib2wpOwotICAgIH0KLQotCi0KLSAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7Ci0KLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLSAgLyogIHJlbGVudC0+c2VjdGlvbiA9IDA7Ki8KLX0KLQotCi1zdGF0aWMgaW50Ci1oODMwMF9yZWxvYzE2X2VzdGltYXRlKGFiZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGJmZF92bWEgdmFsdWU7ICAKLSAgYmZkX3ZtYSBkb3Q7Ci0gIGJmZF92bWEgZ2FwOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSB0aGluZyB0byBiZSByZWxvY2F0ZWQgd2lsbCBoYXZlIG1vdmVkIGJhY2sgYnkgCi0gICB0aGUgc2l6ZSBvZiB0aGUgc2hyaW5rICAtIGJ1dCB3ZSBkb24ndCBjaGFuZ2UgcmVsb2MtPmFkZHJlc3MgaGVyZSwKLSAgIHNpbmNlIHdlIG5lZWQgaXQgdG8ga25vdyB3aGVyZSB0aGUgcmVsb2NhdGlvbiBsaXZlcyBpbiB0aGUgc291cmNlCi0gICB1bmNvb2tlZCBzZWN0aW9uICovCi0KLSAgLyogIHJlbG9jLT5hZGRyZXNzIC09IHNocmluazsgICBjb25jZXB0dWFsICovCi0KLSAgYmZkX3ZtYSBhZGRyZXNzID0gcmVsb2MtPmFkZHJlc3MgLSBzaHJpbms7Ci0gIAotCi0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsgICAgIAotICAgIGNhc2UgUl9NT1YxNkIyOgotICAgIGNhc2UgUl9KTVAyOgotICAgICAgc2hyaW5rKz0yOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFRoaW5nIGlzIGEgbW92ZSBvbmUgYnl0ZSAqLwotICAgIGNhc2UgUl9NT1YxNkIxOgotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgaWYgKHZhbHVlID49IDB4ZmYwMCkKLQl7IAotCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgZnJvbSAxNmJpdCwgcG9zc2libGUgOCB0byA4Yml0Ci0JICAgICBwb3NzaWJsZSAxNiAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsJICAKLQkgIC8qIFRoZSBwbGFjZSB0byByZWxjIG1vdmVzIGJhY2sgYnkgb25lICovCi0JICAvKiBUaGlzIHdpbGwgYmUgdHdvIGJ5dGVzIHNtYWxsZXIgaW4gdGhlIGxvbmcgcnVuICovCi0JICBzaHJpbmsgKz0yIDsKLQkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgMiwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0JfSAgICAgIAotCi0gICAgICBicmVhazsKLSAgICAgIC8qIFRoaXMgaXMgdGhlIDI0IGJpdCBicmFuY2ggd2hpY2ggY291bGQgYmVjb21lIGFuIDggYml0dGVyLCAKLSAgICAgICB0aGUgcmVsb2NhdGlvbiBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGluc24sIG5vdCB0aGUKLSAgICAgICBhY3R1YWwgZGF0YSAqLwotCi0gICAgY2FzZSBSX0pNUEwxOgotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQkKLSAgICAgIGRvdCA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBhZGRyZXNzOwotICAKLSAgICAgIC8qIFNlZSBpZiB0aGUgYWRkcmVzcyB3ZSdyZSBsb29raW5nIGF0IHdpdGhpbiAxMjcgYnl0ZXMgb2Ygd2hlcmUKLQkgd2UgYXJlLCBpZiBzbyB0aGVuIHdlIGNhbiB1c2UgYSBzbWFsbCBicmFuY2ggcmF0aGVyIHRoYW4gdGhlCi0JIGp1bXAgd2Ugd2VyZSBnb2luZyB0byAqLwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdCA7Ci0gIAotICAgICAgaWYgKC0xMjAgPCAobG9uZylnYXAgJiYgKGxvbmcpZ2FwIDwgMTIwICkKLQl7IAotCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgZnJvbSAyNGJpdCwgcG9zc2libGUgOCB0byA4Yml0Ci0JICAgICBwb3NzaWJsZSAzMiAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsJICAKLQkgIC8qIFRoaXMgd2lsbCBiZSB0d28gYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4gKi8KLQkgIHNocmluayArPTIgOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9KTVAxOgotCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCQotICAgICAgZG90ID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIGFkZHJlc3M7Ci0gIAotICAgICAgLyogU2VlIGlmIHRoZSBhZGRyZXNzIHdlJ3JlIGxvb2tpbmcgYXQgd2l0aGluIDEyNyBieXRlcyBvZiB3aGVyZQotCSB3ZSBhcmUsIGlmIHNvIHRoZW4gd2UgY2FuIHVzZSBhIHNtYWxsIGJyYW5jaCByYXRoZXIgdGhhbiB0aGUKLQkganVtcCB3ZSB3ZXJlIGdvaW5nIHRvICovCi0KLSAgICAgIGdhcCA9IHZhbHVlIC0gKGRvdCAtIHNocmluayk7Ci0gIAotCi0gICAgICBpZiAoLTEyMCA8IChsb25nKWdhcCAmJiAobG9uZylnYXAgPCAxMjAgKQotCXsgCi0KLQkgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBmcm9tIDE2Yml0LCBwb3NzaWJsZSA4IHRvIDhiaXQKLQkgICAgIHBvc3NpYmxlIDE2ICovCi0JICByZWxvYy0+aG93dG8gPSByZWxvYy0+aG93dG8gKyAxOwkgIAotCSAgLyogVGhlIHBsYWNlIHRvIHJlbGMgbW92ZXMgYmFjayBieSBvbmUgKi8KLQotCSAgLyogVGhpcyB3aWxsIGJlIHR3byBieXRlcyBzbWFsbGVyIGluIHRoZSBsb25nIHJ1biAqLwotCSAgc2hyaW5rICs9MiA7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAKLSAgcmV0dXJuIHNocmluazsKLX0KLQotCi0vKiBGaXJzdCBwaGFzZSBvZiBhIHJlbGF4aW5nIGxpbmsgKi8KLQotLyogUmVsb2MgdHlwZXMKLSAgIGxhcmdlCQlzbWFsbAotICAgUl9NT1YxNkIxCQlSX01PVjE2QjIJbW92LmIgd2l0aCAxNmJpdCBvciA4IGJpdCBhZGRyZXNzCi0gICBSX0pNUDEJCVJfSk1QMgkJam1wIG9yIHBjcmVsIGJyYW5jaAotICAgUl9KTVBMMQkJUl9KTVBMX0I4CTI0am1wIG9yIHBjcmVsIGJyYW5jaAotICAgUl9NT1YyNEIxCQlSX01PVjI0QjIJMjQgb3IgOCBiaXQgcmVsb2MgZm9yIG1vdi5iCi0KLSovCi0KLXN0YXRpYyB2b2lkCi1oODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLAotCQkJICAgZHN0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIHVuc2lnbmVkIGludCBzcmNfYWRkcmVzcyA9ICpzcmNfcHRyOwotICB1bnNpZ25lZCBpbnQgZHN0X2FkZHJlc3MgPSAqZHN0X3B0cjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLSAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0gICAgewotICAgIGNhc2UgUl9XNjVfQUJTODoKLSAgICBjYXNlIFJfVzY1X0RQOgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAxOwotCXNyY19hZGRyZXNzICs9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9XNjVfQUJTOFM4OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQlnYXAgPj49IDg7Ci0JYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMTsKLQlzcmNfYWRkcmVzcyArPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X0FCUzhTMTY6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOwotCWdhcCA+Pj0xNjsKLQliZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAxOwotCXNyY19hZGRyZXNzICs9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9XNjVfQUJTMTY6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOwotCi0JYmZkX3B1dF8xNiAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCWRzdF9hZGRyZXNzICs9IDI7Ci0Jc3JjX2FkZHJlc3MgKz0gMjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9XNjVfQUJTMTZTODoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JZ2FwID4+PSA4OwotCWJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAyOwotCXNyY19hZGRyZXNzICs9IDI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVzY1X0FCUzE2UzE2OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQlnYXAgPj49IDE2OwotCWJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAyOwotCXNyY19hZGRyZXNzICs9IDI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9XNjVfQUJTMjQ6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOwotCWJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQliZmRfcHV0XzggKGFiZmQsIGdhcD4+MTYsIGRhdGErZHN0X2FkZHJlc3MrMik7Ci0JZHN0X2FkZHJlc3MgKz0gMzsKLQlzcmNfYWRkcmVzcyArPSAzOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X1BDUjg6Ci0gICAgICB7Ci0JaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkgICAgICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICsgZHN0X2FkZHJlc3MgCi0JICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0JZ2FwIC09IGRvdCArIDE7Ci0JaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI3KSB7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0KCk7Ci0JfQotCWJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCWRzdF9hZGRyZXNzICs9IDE7Ci0Jc3JjX2FkZHJlc3MgKz0gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1c2NV9QQ1IxNjoKLSAgICAgIHsKLQliZmRfdm1hIGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICsgZHN0X2FkZHJlc3MgCi0JICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0KLQkvKiBUaGlzIHdyYXBzIHdpdGhpbiB0aGUgcGFnZSwgc28gaWdub3JlIHRoZSByZWxhdGl2ZW5lc3MsIGxvb2sgYXQgdGhlCi0JICAgaGlnaCBwYXJ0ICovCi0JaWYgKChnYXAgJiAweGYwMDAwKSAhPSAoZG90ICYgMHhmMDAwMCkpIHsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQoKTsKLQl9Ci0KLQlnYXAgLT0gZG90ICsgMjsKLQliZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMjsKLQlzcmNfYWRkcmVzcyArPSAyOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZihfKCJpZ25vcmluZyByZWxvYyAlc1xuIiksIHJlbG9jLT5ob3d0by0+bmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIH0KLSAgKnNyY19wdHIgPSBzcmNfYWRkcmVzczsKLSAgKmRzdF9wdHIgPSBkc3RfYWRkcmVzczsKLQotfQotCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyBoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSBoODMwMF9yZWxvYzE2X2VzdGltYXRlCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0KLSN1bmRlZiBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSN1bmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0KLUNSRUFURV9MSVRUTEVfQ09GRl9UQVJHRVRfVkVDICh3NjVfdmVjLCAiY29mZi13OTUiLCBCRkRfSVNfUkVMQVhBQkxFLCAwLCAnXycsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZi13ZTMyay5jIGIvYmZkL2NvZmYtd2UzMmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1OWFkNy4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi13ZTMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciB3ZTMyayBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEJyZW5kYW4gS2Vob2UgKGJyZW5kYW5AY3Mud2lkZW5lci5lZHUpLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL3dlMzJrLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAgICBFTVBUWV9IT1dUTyAoMCksCi0gICAgRU1QVFlfSE9XVE8gKDEpLAotICAgIEVNUFRZX0hPV1RPICgyKSwKLSAgICBFTVBUWV9IT1dUTyAoMyksCi0gICAgRU1QVFlfSE9XVE8gKDQpLAotICAgIEVNUFRZX0hPV1RPICg1KSwKLSAgSE9XVE8oUl9ESVIzMiwJICAgICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiZGlyMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgICBFTVBUWV9IT1dUTyAoNyksCi0gICAgRU1QVFlfSE9XVE8gKDAxMCksCi0gICAgRU1QVFlfSE9XVE8gKDAxMSksCi0gICAgRU1QVFlfSE9XVE8gKDAxMiksCi0gICAgRU1QVFlfSE9XVE8gKDAxMyksCi0gICAgRU1QVFlfSE9XVE8gKDAxNCksCi0gICAgRU1QVFlfSE9XVE8gKDAxNSksCi0gICAgRU1QVFlfSE9XVE8gKDAxNiksCi0gIEhPV1RPKFJfUkVMQllURSwJICAgICAgIDAsICAwLCAgCTgsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICI4IiwJdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMV09SRCwJICAgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjE2IiwJdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUkVMTE9ORywJICAgICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSQllURSwJICAgICAgIDAsICAwLCAJOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQOCIsICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUldPUkQsCSAgICAgICAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDE2IiwgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AzMiIsICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi19OwotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jICBudW5tYmVyICovCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHsgeC5yX3R5cGUgPSBob3d0by0+dHlwZTsgfQotI2RlZmluZSBCQURNQUcoeCkgV0UzMktCQURNQUcoeCkKLSNkZWZpbmUgV0UzMksJMQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBcCi0JICAgIChjYWNoZV9wdHIpLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgKGRzdCktPnJfdHlwZTsKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLSNkZWZpbmUgY29mZl93cml0ZV9hcm1hcCBic2Rfd3JpdGVfYXJtYXAKLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKHdlMzJrY29mZl92ZWMsICJjb2ZmLXdlMzJrIiwgMCwgMCwgMCwgTlVMTCkKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXo4ay5jIGIvYmZkL2NvZmYtejhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjI5YTguLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtejhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBaaWxvZyBaODAwbiBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL3o4ay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTMyID0KLUhPV1RPIChSX0lNTTMyLCAwLCAxLCAzMiwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwKLSAgICAgICAweGZmZmZmZmZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tNGwgPQotSE9XVE8gKFJfSU1NNEwsIDAsIDEsIDQsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW00bCIsIHRydWUsIDB4ZiwgMHhmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfZGEgPQotSE9XVE8gKFJfSU1NMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfZGEiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLAotICAgICAgIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW04ID0KLUhPV1RPIChSX0lNTTgsIDAsIDEsIDgsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW04IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwKLSAgICAgICBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfanIgPQotSE9XVE8gKFJfSlIsIDAsIDEsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLSAgICAgICAicl9qciIsIHRydWUsIDAsIDAsIHRydWUpOwotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLwotCi1zdGF0aWMgaW50IAotY29mZl96OGtfc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZTsKLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeC5yX3R5cGUgPSBjb2ZmX3o4a19zZWxlY3RfcmVsb2MoaG93dG8pCi0KLQotI2RlZmluZSBCQURNQUcoeCkgWjhLQkFETUFHKHgpCi0jZGVmaW5lIFo4SyAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0KLQotCi0vKiBDb2RlIHRvIHN3YXAgaW4gdGhlIHJlbG9jICovCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICAgYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX09GRlNFVCBiZmRfaF9wdXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCwgc3JjLCBkc3QpIFwKLSAgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOyBcCi0gIGRzdC0+cl9zdHVmZlsxXSA9ICdDJzsKLQotLyogQ29kZSB0byB0dXJuIGEgcl90eXBlIGludG8gYSBob3d0byBwdHIsIHVzZXMgdGhlIGFib3ZlIGhvd3RvIHRhYmxlCi0gICAqLwotCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8gKGludGVybmFsLCBkc3QpCi0gICAgIGFyZWxlbnQgKiBpbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHN3aXRjaCAoZHN0LT5yX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9JTU04OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tODsKLSAgICAgIGJyZWFrOwotICAgICBjYXNlIFJfSU1NMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9kYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KUjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2pyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0lNTTMyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSU1NNEw6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW00bDsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkIAotcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqIHJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOwotICAgICBiZmQgKiBhYmZkOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKHJlbG9jLT5yX3N5bW5keCA+IDApCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydCAoYWJmZClbcmVsb2MtPnJfc3ltbmR4XTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotCi0KLSAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7Ci0gIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1leHRyYV9jYXNlIChpbl9hYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLCBkc3RfcHRyKQotICAgICBiZmQgKmluX2FiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICB1bnNpZ25lZCBpbnQgKnNyY19wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cjsKLXsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLSAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0gICAgewotICAgIGNhc2UgUl9JTU04OgotICAgICAgYmZkX3B1dF84IChpbl9hYmZkLAotCQkgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAotCQkgZGF0YSArICpkc3RfcHRyKTsKLSAgICAgICgqZHN0X3B0cikgKz0gMTsKLSAgICAgICgqc3JjX3B0cikgKz0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0lNTTMyOgotICAgICAgYmZkX3B1dF8zMiAoaW5fYWJmZCwKLQkJICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCi0JCSAgZGF0YSArICpkc3RfcHRyKTsKLSAgICAgICgqZHN0X3B0cikgKz0gNDsKLSAgICAgICgqc3JjX3B0cikgKz0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0lNTTRMOgotICAgICAgYmZkX3B1dF84IChpbl9hYmZkLAotCQkgKChiZmRfZ2V0XzggKGluX2FiZmQsIGRhdGEgKyAqZHN0X3B0cikgJiAweGYwKSAKLQkJICB8ICgweDBmCi0JCSAgICAgJiBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgIGlucHV0X3NlY3Rpb24pKSksCi0JCSBkYXRhICsgKmRzdF9wdHIpOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSU1NMTY6Ci0gICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkYXRhICsgKmRzdF9wdHIpOwotICAgICAgKCpkc3RfcHRyKSArPSAyOwotICAgICAgKCpzcmNfcHRyKSArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSlI6Ci0gICAgICB7Ci0JYmZkX3ZtYSBkc3QgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3ZtYSBkb3QgPSAobGlua19vcmRlci0+b2Zmc2V0Ci0JCSAgICAgICArICpkc3RfcHRyCi0JCSAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCWludCBnYXAgPSBkc3QgLSBkb3QgLSAxOy8qIC0xIHNpbmNlIHdlcmUgaW4gdGhlIG9kZCBieXRlIG9mIHRoZQotCQkJCSAgICB3b3JkIGFuZCB0aGUgcGMncyBiZWVuIGluY3JlbWVudGVkICovCi0KLQlpZiAoZ2FwICYgMSkKLQkgIGFib3J0ICgpOwotCWdhcCAvPSAyOwotCWlmIChnYXAgPiAxMjggfHwgZ2FwIDwgLTEyOCkKLQkgIHsKLQkgICAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICAgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICAgIGFib3J0ICgpOwotCSAgfQotCWJmZF9wdXRfOCAoaW5fYWJmZCwgZ2FwLCBkYXRhICsgKmRzdF9wdHIpOwotCSgqZHN0X3B0cikrKzsKLQkoKnNyY19wdHIpKys7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgZXh0cmFfY2FzZQotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI3VuZGVmIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24KLQotQ1JFQVRFX0JJR19DT0ZGX1RBUkdFVF9WRUMgKHo4a2NvZmZfdmVjLCAiY29mZi16OGsiLCAwLCAwLCAnXycsIE5VTEwpCmRpZmYgLS1naXQgYS9iZmQvY29mZmNvZGUuaCBiL2JmZC9jb2ZmY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDIzNjk3Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDk4OSArMCwwIEBACi0vKiBTdXBwb3J0IGZvciB0aGUgZ2VuZXJpYyBwYXJ0cyBvZiBtb3N0IENPRkYgdmFyaWFudHMsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLU1vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLAotCQkJc2FjQGN5Z251cy5jb20KLSovCi0vKgotCi1TRUNUSU9OCi0JY29mZiBiYWNrZW5kcwotCi0JQkZEIHN1cHBvcnRzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBmbGF2b3VycyBvZiBjb2ZmIGZvcm1hdC4KLQlUaGUgbWFqb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiBmb3JtYXRzIGFyZSB0aGUgc2l6ZXMgYW5kCi0JYWxpZ25tZW50cyBvZiBmaWVsZHMgaW4gc3RydWN0dXJlcyBvbiBkaXNrLCBhbmQgdGhlIG9jY2FzaW9uYWwKLQlleHRyYSBmaWVsZC4KLQotCUNvZmYgaW4gYWxsIGl0cyB2YXJpZXRpZXMgaXMgaW1wbGVtZW50ZWQgd2l0aCBhIGZldyBjb21tb24KLQlmaWxlcyBhbmQgYSBudW1iZXIgb2YgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZmlsZXMuIEZvcgotCWV4YW1wbGUsIFRoZSA4OGsgYmNzIGNvZmYgZm9ybWF0IGlzIGltcGxlbWVudGVkIGluIHRoZSBmaWxlCi0JQGZpbGV7Y29mZi1tODhrLmN9LiBUaGlzIGZpbGUgQGNvZGV7I2luY2x1ZGV9cwotCUBmaWxle2NvZmYvbTg4ay5ofSB3aGljaCBkZWZpbmVzIHRoZSBleHRlcm5hbCBzdHJ1Y3R1cmUgb2YgdGhlCi0JY29mZiBmb3JtYXQgZm9yIHRoZSA4OGssIGFuZCBAZmlsZXtjb2ZmL2ludGVybmFsLmh9IHdoaWNoCi0JZGVmaW5lcyB0aGUgaW50ZXJuYWwgc3RydWN0dXJlLiBAZmlsZXtjb2ZmLW04OGsuY30gYWxzbwotCWRlZmluZXMgdGhlIHJlbG9jYXRpb25zIHVzZWQgYnkgdGhlIDg4ayBmb3JtYXQKLQlAeHJlZntSZWxvY2F0aW9uc30uCi0KLQlUaGUgSW50ZWwgaTk2MCBwcm9jZXNzb3IgdmVyc2lvbiBvZiBjb2ZmIGlzIGltcGxlbWVudGVkIGluCi0JQGZpbGV7Y29mZi1pOTYwLmN9LiBUaGlzIGZpbGUgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcwotCUBmaWxle2NvZmYtbTg4ay5jfSwgZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgQGZpbGV7Y29mZi9pOTYwLmh9Ci0JcmF0aGVyIHRoYW4gQGZpbGV7Y29mZi1tODhrLmh9LgotCi1TVUJTRUNUSU9OCi0JUG9ydGluZyB0byBhIG5ldyB2ZXJzaW9uIG9mIGNvZmYKLQotCVRoZSByZWNvbW1lbmRlZCBtZXRob2QgaXMgdG8gc2VsZWN0IGZyb20gdGhlIGV4aXN0aW5nCi0JaW1wbGVtZW50YXRpb25zIHRoZSB2ZXJzaW9uIG9mIGNvZmYgd2hpY2ggaXMgbW9zdCBsaWtlIHRoZSBvbmUKLQl5b3Ugd2FudCB0byB1c2UuICBGb3IgZXhhbXBsZSwgd2UnbGwgc2F5IHRoYXQgaTM4NiBjb2ZmIGlzCi0JdGhlIG9uZSB5b3Ugc2VsZWN0LCBhbmQgdGhhdCB5b3VyIGNvZmYgZmxhdm91ciBpcyBjYWxsZWQgZm9vLgotCUNvcHkgQGZpbGV7aTM4NmNvZmYuY30gdG8gQGZpbGV7Zm9vY29mZi5jfSwgY29weQotCUBmaWxley4uL2luY2x1ZGUvY29mZi9pMzg2Lmh9IHRvIEBmaWxley4uL2luY2x1ZGUvY29mZi9mb28uaH0sCi0JYW5kIGFkZCB0aGUgbGluZXMgdG8gQGZpbGV7dGFyZ2V0cy5jfSBhbmQgQGZpbGV7TWFrZWZpbGUuaW59Ci0Jc28gdGhhdCB5b3VyIG5ldyBiYWNrIGVuZCBpcyB1c2VkLiBBbHRlciB0aGUgc2hhcGVzIG9mIHRoZQotCXN0cnVjdHVyZXMgaW4gQGZpbGV7Li4vaW5jbHVkZS9jb2ZmL2Zvby5ofSBzbyB0aGF0IHRoZXkgbWF0Y2gKLQl3aGF0IHlvdSBuZWVkLiBZb3Ugd2lsbCBwcm9iYWJseSBhbHNvIGhhdmUgdG8gYWRkCi0JQGNvZGV7I2lmZGVmfXMgdG8gdGhlIGNvZGUgaW4gQGZpbGV7Y29mZi9pbnRlcm5hbC5ofSBhbmQKLQlAZmlsZXtjb2ZmY29kZS5ofSBpZiB5b3VyIHZlcnNpb24gb2YgY29mZiBpcyB0b28gd2lsZC4KLQotCVlvdSBjYW4gdmVyaWZ5IHRoYXQgeW91ciBuZXcgQkZEIGJhY2tlbmQgd29ya3MgcXVpdGUgc2ltcGx5IGJ5Ci0JYnVpbGRpbmcgQGZpbGV7b2JqZHVtcH0gZnJvbSB0aGUgQGZpbGV7YmludXRpbHN9IGRpcmVjdG9yeSwKLQlhbmQgbWFraW5nIHN1cmUgdGhhdCBpdHMgdmVyc2lvbiBvZiB3aGF0J3MgZ29pbmcgb24gYW5kIHlvdXIKLQlob3N0IHN5c3RlbSdzIGlkZWEgKGFzc3VtaW5nIGl0IGhhcyB0aGUgcHJldHR5IHN0YW5kYXJkIGNvZmYKLQlkdW1wIHV0aWxpdHksIHVzdWFsbHkgY2FsbGVkIEBjb2Rle2F0dC1kdW1wfSBvciBqdXN0Ci0JQGNvZGV7ZHVtcH0pIGFyZSB0aGUgc2FtZS4gIFRoZW4gY2xlYW4gdXAgeW91ciBjb2RlLCBhbmQgc2VuZAotCXdoYXQgeW91J3ZlIGRvbmUgdG8gQ3lnbnVzLiBUaGVuIHlvdXIgc3R1ZmYgd2lsbCBiZSBpbiB0aGUKLQluZXh0IHJlbGVhc2UsIGFuZCB5b3Ugd29uJ3QgaGF2ZSB0byBrZWVwIGludGVncmF0aW5nIGl0LgotCi1TVUJTRUNUSU9OCi0JSG93IHRoZSBjb2ZmIGJhY2tlbmQgd29ya3MKLQotU1VCU1VCU0VDVElPTgotCUZpbGUgbGF5b3V0Ci0KLQlUaGUgQ29mZiBiYWNrZW5kIGlzIHNwbGl0IGludG8gZ2VuZXJpYyByb3V0aW5lcyB0aGF0IGFyZQotCWFwcGxpY2FibGUgdG8gYW55IENvZmYgdGFyZ2V0IGFuZCByb3V0aW5lcyB0aGF0IGFyZSBzcGVjaWZpYwotCXRvIGEgcGFydGljdWxhciB0YXJnZXQuICBUaGUgdGFyZ2V0LXNwZWNpZmljIHJvdXRpbmVzIGFyZQotCWZ1cnRoZXIgc3BsaXQgaW50byBvbmVzIHdoaWNoIGFyZSBiYXNpY2FsbHkgdGhlIHNhbWUgZm9yIGFsbAotCUNvZmYgdGFyZ2V0cyBleGNlcHQgdGhhdCB0aGV5IHVzZSB0aGUgZXh0ZXJuYWwgc3ltYm9sIGZvcm1hdAotCW9yIHVzZSBkaWZmZXJlbnQgdmFsdWVzIGZvciBjZXJ0YWluIGNvbnN0YW50cy4KLQotCVRoZSBnZW5lcmljIHJvdXRpbmVzIGFyZSBpbiBAZmlsZXtjb2ZmZ2VuLmN9LiAgVGhlc2Ugcm91dGluZXMKLQl3b3JrIGZvciBhbnkgQ29mZiB0YXJnZXQuICBUaGV5IHVzZSBzb21lIGhvb2tzIGludG8gdGhlIHRhcmdldAotCXNwZWNpZmljIGNvZGU7IHRoZSBob29rcyBhcmUgaW4gYSBAY29kZXtiZmRfY29mZl9iYWNrZW5kX2RhdGF9Ci0Jc3RydWN0dXJlLCBvbmUgb2Ygd2hpY2ggZXhpc3RzIGZvciBlYWNoIHRhcmdldC4KLQotCVRoZSBlc3NlbnRpYWxseSBzaW1pbGFyIHRhcmdldC1zcGVjaWZpYyByb3V0aW5lcyBhcmUgaW4KLQlAZmlsZXtjb2ZmY29kZS5ofS4gIFRoaXMgaGVhZGVyIGZpbGUgaW5jbHVkZXMgZXhlY3V0YWJsZSBDIGNvZGUuCi0JVGhlIHZhcmlvdXMgQ29mZiB0YXJnZXRzIGZpcnN0IGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIENvZmYKLQloZWFkZXIgZmlsZSwgbWFrZSBhbnkgc3BlY2lhbCBkZWZpbmVzIHRoYXQgYXJlIG5lZWRlZCwgYW5kCi0JdGhlbiBpbmNsdWRlIEBmaWxle2NvZmZjb2RlLmh9LgotCi0JU29tZSBvZiB0aGUgQ29mZiB0YXJnZXRzIHRoZW4gYWxzbyBoYXZlIGFkZGl0aW9uYWwgcm91dGluZXMgaW4KLQl0aGUgdGFyZ2V0IHNvdXJjZSBmaWxlIGl0c2VsZi4KLQotCUZvciBleGFtcGxlLCBAZmlsZXtjb2ZmLWk5NjAuY30gaW5jbHVkZXMKLQlAZmlsZXtjb2ZmL2ludGVybmFsLmh9IGFuZCBAZmlsZXtjb2ZmL2k5NjAuaH0uICBJdCB0aGVuCi0JZGVmaW5lcyBhIGZldyBjb25zdGFudHMsIHN1Y2ggYXMgQGNvZGV7STk2MH0sIGFuZCBpbmNsdWRlcwotCUBmaWxle2NvZmZjb2RlLmh9LiAgU2luY2UgdGhlIGk5NjAgaGFzIGNvbXBsZXggcmVsb2NhdGlvbgotCXR5cGVzLCBAZmlsZXtjb2ZmLWk5NjAuY30gYWxzbyBpbmNsdWRlcyBzb21lIGNvZGUgdG8KLQltYW5pcHVsYXRlIHRoZSBpOTYwIHJlbG9jcy4gIFRoaXMgY29kZSBpcyBub3QgaW4KLQlAZmlsZXtjb2ZmY29kZS5ofSBiZWNhdXNlIGl0IHdvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlcgotCXRhcmdldC4KLQotU1VCU1VCU0VDVElPTgotCUJpdCB0d2lkZGxpbmcKLQotCUVhY2ggZmxhdm91ciBvZiBjb2ZmIHN1cHBvcnRlZCBpbiBCRkQgaGFzIGl0cyBvd24gaGVhZGVyIGZpbGUKLQlkZXNjcmliaW5nIHRoZSBleHRlcm5hbCBsYXlvdXQgb2YgdGhlIHN0cnVjdHVyZXMuIFRoZXJlIGlzIGFsc28KLQlhbiBpbnRlcm5hbCBkZXNjcmlwdGlvbiBvZiB0aGUgY29mZiBsYXlvdXQsIGluCi0JQGZpbGV7Y29mZi9pbnRlcm5hbC5ofS4gQSBtYWpvciBmdW5jdGlvbiBvZiB0aGUKLQljb2ZmIGJhY2tlbmQgaXMgc3dhcHBpbmcgdGhlIGJ5dGVzIGFuZCB0d2lkZGxpbmcgdGhlIGJpdHMgdG8KLQl0cmFuc2xhdGUgdGhlIGV4dGVybmFsIGZvcm0gb2YgdGhlIHN0cnVjdHVyZXMgaW50byB0aGUgbm9ybWFsCi0JaW50ZXJuYWwgZm9ybS4gVGhpcyBpcyBhbGwgcGVyZm9ybWVkIGluIHRoZQotCUBjb2Rle2JmZF9zd2FwfV9AaXt0aGluZ31fQGl7ZGlyZWN0aW9ufSByb3V0aW5lcy4gU29tZQotCWVsZW1lbnRzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YKLQljb2ZmOyBpdCBpcyB0aGUgZHV0eSBvZiB0aGUgY29mZiB2ZXJzaW9uIHNwZWNpZmljIGluY2x1ZGUgZmlsZQotCXRvIG92ZXJyaWRlIHRoZSBkZWZpbml0aW9ucyBvZiB2YXJpb3VzIHBhY2tpbmcgcm91dGluZXMgaW4KLQlAZmlsZXtjb2ZmY29kZS5ofS4gRS5nLiwgdGhlIHNpemUgb2YgbGluZSBudW1iZXIgZW50cnkgaW4gY29mZiBpcwotCXNvbWV0aW1lcyAxNiBiaXRzLCBhbmQgc29tZXRpbWVzIDMyIGJpdHMuIEBjb2RleyNkZWZpbmV9aW5nCi0JQGNvZGV7UFVUX0xOU1pfTE5OT30gYW5kIEBjb2Rle0dFVF9MTlNaX0xOTk99IHdpbGwgc2VsZWN0IHRoZQotCWNvcnJlY3Qgb25lLiBObyBkb3VidCwgc29tZSBkYXkgc29tZW9uZSB3aWxsIGZpbmQgYSB2ZXJzaW9uIG9mCi0JY29mZiB3aGljaCBoYXMgYSB2YXJ5aW5nIGZpZWxkIHNpemUgbm90IGNhdGVyZWQgdG8gYXQgdGhlCi0JbW9tZW50LiBUbyBwb3J0IEJGRCwgdGhhdCBwZXJzb24gd2lsbCBoYXZlIHRvIGFkZCBtb3JlIEBjb2RleyNkZWZpbmVzfS4KLQlUaHJlZSBvZiB0aGUgYml0IHR3aWRkbGluZyByb3V0aW5lcyBhcmUgZXhwb3J0ZWQgdG8KLQlAY29kZXtnZGJ9OyBAY29kZXtjb2ZmX3N3YXBfYXV4X2lufSwgQGNvZGV7Y29mZl9zd2FwX3N5bV9pbn0KLQlhbmQgQGNvZGV7Y29mZl9zd2FwX2xpbmVub19pbn0uIEBjb2Rle0dEQn0gcmVhZHMgdGhlIHN5bWJvbAotCXRhYmxlIG9uIGl0cyBvd24sIGJ1dCB1c2VzIEJGRCB0byBmaXggdGhpbmdzIHVwLiAgTW9yZSBvZiB0aGUKLQliaXQgdHdpZGRsZXJzIGFyZSBleHBvcnRlZCBmb3IgQGNvZGV7Z2FzfTsKLQlAY29kZXtjb2ZmX3N3YXBfYXV4X291dH0sIEBjb2Rle2NvZmZfc3dhcF9zeW1fb3V0fSwKLQlAY29kZXtjb2ZmX3N3YXBfbGluZW5vX291dH0sIEBjb2Rle2NvZmZfc3dhcF9yZWxvY19vdXR9LAotCUBjb2Rle2NvZmZfc3dhcF9maWxlaGRyX291dH0sIEBjb2Rle2NvZmZfc3dhcF9hb3V0aGRyX291dH0sCi0JQGNvZGV7Y29mZl9zd2FwX3Njbmhkcl9vdXR9LiBAY29kZXtHYXN9IGN1cnJlbnRseSBrZWVwcyB0cmFjawotCW9mIGFsbCB0aGUgc3ltYm9sIHRhYmxlIGFuZCByZWxvYyBkcnVkZ2VyeSBpdHNlbGYsIHRoZXJlYnkKLQlzYXZpbmcgdGhlIGludGVybmFsIEJGRCBvdmVyaGVhZCwgYnV0IHVzZXMgQkZEIHRvIHN3YXAgdGhpbmdzCi0Jb24gdGhlIHdheSBvdXQsIG1ha2luZyBjcm9zcyBwb3J0cyBtdWNoIHNhZmVyLiAgRG9pbmcgc28gYWxzbwotCWFsbG93cyBCRkQgKGFuZCB0aHVzIHRoZSBsaW5rZXIpIHRvIHVzZSB0aGUgc2FtZSBoZWFkZXIgZmlsZXMKLQlhcyBAY29kZXtnYXN9LCB3aGljaCBtYWtlcyBvbmUgYXZlbnVlIHRvIGRpc2FzdGVyIGRpc2FwcGVhci4KLQotU1VCU1VCU0VDVElPTgotCVN5bWJvbCByZWFkaW5nCi0KLQlUaGUgc2ltcGxlIGNhbm9uaWNhbCBmb3JtIGZvciBzeW1ib2xzIHVzZWQgYnkgQkZEIGlzIG5vdCByaWNoCi0JZW5vdWdoIHRvIGtlZXAgYWxsIHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgaW4gYSBjb2ZmIHN5bWJvbAotCXRhYmxlLiBUaGUgYmFjayBlbmQgZ2V0cyBhcm91bmQgdGhpcyBwcm9ibGVtIGJ5IGtlZXBpbmcgdGhlIG9yaWdpbmFsCi0Jc3ltYm9sIHRhYmxlIGFyb3VuZCwgImJlaGluZCB0aGUgc2NlbmVzIi4KLQotCVdoZW4gYSBzeW1ib2wgdGFibGUgaXMgcmVxdWVzdGVkICh0aHJvdWdoIGEgY2FsbCB0bwotCUBjb2Rle2JmZF9jYW5vbmljYWxpemVfc3ltdGFifSksIGEgcmVxdWVzdCBnZXRzIHRocm91Z2ggdG8KLQlAY29kZXtjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYn0uIFRoaXMgcmVhZHMgdGhlIHN5bWJvbCB0YWJsZSBmcm9tCi0JdGhlIGNvZmYgZmlsZSBhbmQgc3dhcHMgYWxsIHRoZSBzdHJ1Y3R1cmVzIGluc2lkZSBpbnRvIHRoZQotCWludGVybmFsIGZvcm0uIEl0IGFsc28gZml4ZXMgdXAgYWxsIHRoZSBwb2ludGVycyBpbiB0aGUgdGFibGUKLQkocmVwcmVzZW50ZWQgaW4gdGhlIGZpbGUgYnkgb2Zmc2V0cyBmcm9tIHRoZSBmaXJzdCBzeW1ib2wgaW4KLQl0aGUgdGFibGUpIGludG8gcGh5c2ljYWwgcG9pbnRlcnMgdG8gZWxlbWVudHMgaW4gdGhlIG5ldwotCWludGVybmFsIHRhYmxlLiBUaGlzIGludm9sdmVzIHNvbWUgd29yayBzaW5jZSB0aGUgbWVhbmluZ3Mgb2YKLQlmaWVsZHMgY2hhbmdlIGRlcGVuZGluZyB1cG9uIGNvbnRleHQ6IGEgZmllbGQgdGhhdCBpcyBhCi0JcG9pbnRlciB0byBhbm90aGVyIHN0cnVjdHVyZSBpbiB0aGUgc3ltYm9sIHRhYmxlIGF0IG9uZSBtb21lbnQKLQltYXkgYmUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgYSBzdHJ1Y3R1cmUgYXQgdGhlIG5leHQuICBBbm90aGVyCi0JcGFzcyBpcyBtYWRlIG92ZXIgdGhlIHRhYmxlLiBBbGwgc3ltYm9scyB3aGljaCBtYXJrIGZpbGUgbmFtZXMKLQkoPDxDX0ZJTEU+PiBzeW1ib2xzKSBhcmUgbW9kaWZpZWQgc28gdGhhdCB0aGUgaW50ZXJuYWwKLQlzdHJpbmcgcG9pbnRzIHRvIHRoZSB2YWx1ZSBpbiB0aGUgYXV4ZW50ICh0aGUgcmVhbCBmaWxlbmFtZSkKLQlyYXRoZXIgdGhhbiB0aGUgbm9ybWFsIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW1ib2wKLQkoQGNvZGV7Ii5maWxlIn0pLgotCi0JQXQgdGhpcyB0aW1lIHRoZSBzeW1ib2wgbmFtZXMgYXJlIG1vdmVkIGFyb3VuZC4gQ29mZiBzdG9yZXMKLQlhbGwgc3ltYm9scyBsZXNzIHRoYW4gbmluZSBjaGFyYWN0ZXJzIGxvbmcgcGh5c2ljYWxseQotCXdpdGhpbiB0aGUgc3ltYm9sIHRhYmxlOyBsb25nZXIgc3RyaW5ncyBhcmUga2VwdCBhdCB0aGUgZW5kIG9mCi0JdGhlIGZpbGUgaW4gdGhlIHN0cmluZyAJdGFibGUuIFRoaXMgcGFzcyBtb3ZlcyBhbGwgc3RyaW5ncwotCWludG8gbWVtb3J5IGFuZCByZXBsYWNlcyB0aGVtIHdpdGggcG9pbnRlcnMgdG8gdGhlIHN0cmluZ3MuCi0KLQotCVRoZSBzeW1ib2wgdGFibGUgaXMgbWFzc2FnZWQgb25jZSBhZ2FpbiwgdGhpcyB0aW1lIHRvIGNyZWF0ZQotCXRoZSBjYW5vbmljYWwgdGFibGUgdXNlZCBieSB0aGUgQkZEIGFwcGxpY2F0aW9uLiBFYWNoIHN5bWJvbAotCWlzIGluc3BlY3RlZCBpbiB0dXJuLCBhbmQgYSBkZWNpc2lvbiBtYWRlICh1c2luZyB0aGUKLQlAY29kZXtzY2xhc3N9IGZpZWxkKSBhYm91dCB0aGUgdmFyaW91cyBmbGFncyB0byBzZXQgaW4gdGhlCi0JQGNvZGV7YXN5bWJvbH0uICBAeHJlZntTeW1ib2xzfS4gVGhlIGdlbmVyYXRlZCBjYW5vbmljYWwgdGFibGUKLQlzaGFyZXMgc3RyaW5ncyB3aXRoIHRoZSBoaWRkZW4gaW50ZXJuYWwgc3ltYm9sIHRhYmxlLgotCi0JQW55IGxpbmVudW1iZXJzIGFyZSByZWFkIGZyb20gdGhlIGNvZmYgZmlsZSB0b28sIGFuZCBhdHRhY2hlZAotCXRvIHRoZSBzeW1ib2xzIHdoaWNoIG93biB0aGUgZnVuY3Rpb25zIHRoZSBsaW5lbnVtYmVycyBiZWxvbmcgdG8uCi0KLVNVQlNVQlNFQ1RJT04KLQlTeW1ib2wgd3JpdGluZwotCi0JV3JpdGluZyBhIHN5bWJvbCB0byBhIGNvZmYgZmlsZSB3aGljaCBkaWRuJ3QgY29tZSBmcm9tIGEgY29mZgotCWZpbGUgd2lsbCBsb3NlIGFueSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIFRoZSBAY29kZXthc3ltYm9sfQotCXN0cnVjdHVyZSByZW1lbWJlcnMgdGhlIEJGRCBmcm9tIHdoaWNoIHRoZSBzeW1ib2wgd2FzIHRha2VuLCBhbmQgb24KLQlvdXRwdXQgdGhlIGJhY2sgZW5kIG1ha2VzIHN1cmUgdGhhdCB0aGUgc2FtZSBkZXN0aW5hdGlvbiB0YXJnZXQgYXMKLQlzb3VyY2UgdGFyZ2V0IGlzIHByZXNlbnQuCi0KLQlXaGVuIHRoZSBzeW1ib2xzIGhhdmUgY29tZSBmcm9tIGEgY29mZiBmaWxlIHRoZW4gYWxsIHRoZQotCWRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBwcmVzZXJ2ZWQuCi0KLQlTeW1ib2wgdGFibGVzIGFyZSBwcm92aWRlZCBmb3Igd3JpdGluZyB0byB0aGUgYmFjayBlbmQgaW4gYQotCXZlY3RvciBvZiBwb2ludGVycyB0byBwb2ludGVycy4gVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zIGxpa2UKLQl0aGUgbGlua2VyIHRvIGFjY3VtdWxhdGUgYW5kIG91dHB1dCBsYXJnZSBzeW1ib2wgdGFibGVzCi0Jd2l0aG91dCBoYXZpbmcgdG8gZG8gdG9vIG11Y2ggYnl0ZSBjb3B5aW5nLgotCi0JVGhpcyBmdW5jdGlvbiBydW5zIHRocm91Z2ggdGhlIHByb3ZpZGVkIHN5bWJvbCB0YWJsZSBhbmQKLQlwYXRjaGVzIGVhY2ggc3ltYm9sIG1hcmtlZCBhcyBhIGZpbGUgcGxhY2UgaG9sZGVyCi0JKEBjb2Rle0NfRklMRX0pIHRvIHBvaW50IHRvIHRoZSBuZXh0IGZpbGUgcGxhY2UgaG9sZGVyIGluIHRoZQotCWxpc3QuIEl0IGFsc28gbWFya3MgZWFjaCBAY29kZXtvZmZzZXR9IGZpZWxkIGluIHRoZSBsaXN0IHdpdGgKLQl0aGUgb2Zmc2V0IGZyb20gdGhlIGZpcnN0IHN5bWJvbCBvZiB0aGUgY3VycmVudCBzeW1ib2wuCi0KLQlBbm90aGVyIGZ1bmN0aW9uIG9mIHRoaXMgcHJvY2VkdXJlIGlzIHRvIHR1cm4gdGhlIGNhbm9uaWNhbAotCXZhbHVlIGZvcm0gb2YgQkZEIGludG8gdGhlIGZvcm0gdXNlZCBieSBjb2ZmLiBJbnRlcm5hbGx5LCBCRkQKLQlleHBlY3RzIHN5bWJvbCB2YWx1ZXMgdG8gYmUgb2Zmc2V0cyBmcm9tIGEgc2VjdGlvbiBiYXNlOyBzbyBhCi0Jc3ltYm9sIHBoeXNpY2FsbHkgYXQgMHgxMjAsIGJ1dCBpbiBhIHNlY3Rpb24gc3RhcnRpbmcgYXQKLQkweDEwMCwgd291bGQgaGF2ZSB0aGUgdmFsdWUgMHgyMC4gQ29mZiBleHBlY3RzIHN5bWJvbHMgdG8KLQljb250YWluIHRoZWlyIGZpbmFsIHZhbHVlLCBzbyBzeW1ib2xzIGhhdmUgdGhlaXIgdmFsdWVzCi0JY2hhbmdlZCBhdCB0aGlzIHBvaW50IHRvIHJlZmxlY3QgdGhlaXIgc3VtIHdpdGggdGhlaXIgb3duaW5nCi0Jc2VjdGlvbi4gIFRoaXMgdHJhbnNmb3JtYXRpb24gdXNlcyB0aGUKLQk8PG91dHB1dF9zZWN0aW9uPj4gZmllbGQgb2YgdGhlIEBjb2Rle2FzeW1ib2x9J3MKLQlAY29kZXthc2VjdGlvbn0gQHhyZWZ7U2VjdGlvbnN9LgotCi0JbyA8PGNvZmZfbWFuZ2xlX3N5bWJvbHM+PgotCi0JVGhpcyByb3V0aW5lIHJ1bnMgdGhvdWdoIHRoZSBwcm92aWRlZCBzeW1ib2wgdGFibGUgYW5kIHVzZXMKLQl0aGUgb2Zmc2V0cyBnZW5lcmF0ZWQgYnkgdGhlIHByZXZpb3VzIHBhc3MgYW5kIHRoZSBwb2ludGVycwotCWdlbmVyYXRlZCB3aGVuIHRoZSBzeW1ib2wgdGFibGUgd2FzIHJlYWQgaW4gdG8gY3JlYXRlIHRoZQotCXN0cnVjdHVyZWQgaGllcmFjaHkgcmVxdWlyZWQgYnkgY29mZi4gSXQgY2hhbmdlcyBlYWNoIHBvaW50ZXIKLQl0byBhIHN5bWJvbCBpbnRvIHRoZSBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIGFzeW1ib2wuCi0KLQlvIDw8Y29mZl93cml0ZV9zeW1ib2xzPj4KLQotCVRoaXMgcm91dGluZSBydW5zIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBhbmQgcGF0Y2hlcyB1cCB0aGUKLQlzeW1ib2xzIGZyb20gdGhlaXIgaW50ZXJuYWwgZm9ybSBpbnRvIHRoZSBjb2ZmIHdheSwgY2FsbHMgdGhlCi0JYml0IHR3aWRkbGVycywgYW5kIHdyaXRlcyBvdXQgdGhlIHRhYmxlIHRvIHRoZSBmaWxlLgotCi0qLwotCi0vKgotSU5URVJOQUxfREVGSU5JVElPTgotCWNvZmZfc3ltYm9sX3R5cGUKLQotREVTQ1JJUFRJT04KLQlUaGUgaGlkZGVuIGluZm9ybWF0aW9uIGZvciBhbiA8PGFzeW1ib2w+PiBpcyBkZXNjcmliZWQgaW4gYQotCTw8Y29tYmluZWRfZW50cnlfdHlwZT4+OgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0Ci0uewotLgotLiAgICAgICB7KiBSZW1lbWJlcnMgdGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIGZpbGUgZm9yCi0uICAgICAgICAgIHRoaXMgc3ltYm9sLiBHZW5lcmF0ZWQgYnkgY29mZl9yZW51bWJlcl9zeW1ib2xzLiAqfQotLnVuc2lnbmVkIGludCBvZmZzZXQ7Ci0uCi0uICAgICAgIHsqIFNob3VsZCB0aGUgdmFsdWUgb2YgdGhpcyBzeW1ib2wgYmUgcmVudW1iZXJlZC4gIFVzZWQgZm9yCi0uICAgICAgICAgIFhDT0ZGIENfQlNUQVQgc3ltYm9scy4gIFNldCBieSBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICp9Ci0udW5zaWduZWQgaW50IGZpeF92YWx1ZSA6IDE7Ci0uCi0uICAgICAgIHsqIFNob3VsZCB0aGUgdGFnIGZpZWxkIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuCi0uICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKn0KLS51bnNpZ25lZCBpbnQgZml4X3RhZyA6IDE7Ci0uCi0uICAgICAgIHsqIFNob3VsZCB0aGUgZW5kaWR4IGZpZWxkIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuCi0uICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKn0KLS51bnNpZ25lZCBpbnQgZml4X2VuZCA6IDE7Ci0uCi0uICAgICAgIHsqIFNob3VsZCB0aGUgeF9jc2VjdC54X3NjbmxlbiBmaWVsZCBiZSByZW51bWJlcmVkLgotLiAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICp9Ci0udW5zaWduZWQgaW50IGZpeF9zY25sZW4gOiAxOwotLgotLiAgICAgICB7KiBGaXggdXAgYW4gWENPRkYgQ19CSU5DTC9DX0VJTkNMIHN5bWJvbC4gIFRoZSB2YWx1ZSBpcyB0aGUKLS4gICAgICAgICAgaW5kZXggaW50byB0aGUgbGluZSBudW1iZXIgZW50cmllcy4gIFNldCBieQotLiAgICAgICAgICBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICp9Ci0udW5zaWduZWQgaW50IGZpeF9saW5lIDogMTsKLS4KLS4gICAgICAgeyogVGhlIGNvbnRhaW5lciBmb3IgdGhlIHN5bWJvbCBzdHJ1Y3R1cmUgYXMgcmVhZCBhbmQgdHJhbnNsYXRlZAotLiAgICAgICAgICAgZnJvbSB0aGUgZmlsZS4gKn0KLS4KLS51bmlvbiB7Ci0uICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eGVudDsKLS4gICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLS4gfSB1OwotLn0gY29tYmluZWRfZW50cnlfdHlwZTsKLS4KLS4KLS57KiBFYWNoIGNhbm9uaWNhbCBhc3ltYm9sIHJlYWxseSBsb29rcyBsaWtlIHRoaXM6ICp9Ci0uCi0udHlwZWRlZiBzdHJ1Y3QgY29mZl9zeW1ib2xfc3RydWN0Ci0uewotLiAgIHsqIFRoZSBhY3R1YWwgc3ltYm9sIHdoaWNoIHRoZSByZXN0IG9mIEJGRCB3b3JrcyB3aXRoICp9Ci0uYXN5bWJvbCBzeW1ib2w7Ci0uCi0uICAgeyogQSBwb2ludGVyIHRvIHRoZSBoaWRkZW4gaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sICp9Ci0uY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotLgotLiAgIHsqIEEgcG9pbnRlciB0byB0aGUgbGluZW51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzeW1ib2wgKn0KLS5zdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5ICpsaW5lbm87Ci0uCi0uICAgeyogSGF2ZSB0aGUgbGluZSBudW1iZXJzIGJlZW4gcmVsb2NhdGVkIHlldCA/ICp9Ci0uYm9vbGVhbiBkb25lX2xpbmVubzsKLS59IGNvZmZfc3ltYm9sX3R5cGU7Ci0KLQotKi8KLQotI2lmZGVmIENPRkZfV0lUSF9QRQotI2luY2x1ZGUgInBlaWNvZGUuaCIKLSNlbHNlCi0jaW5jbHVkZSAiY29mZnN3YXAuaCIKLSNlbmRpZgotCi0jZGVmaW5lIFNUUklOR19TSVpFX1NJWkUgKDQpCi0KLXN0YXRpYyBsb25nIHNlY190b19zdHlwX2ZsYWdzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBmbGFnd29yZCBzdHlwX3RvX3NlY19mbGFncwotICBQQVJBTVMgKChiZmQgKiwgUFRSLCBjb25zdCBjaGFyICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYmFkX2Zvcm1hdF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc2V0X2N1c3RvbV9zZWN0aW9uX2FsaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgY29uc3Qgc3RydWN0IGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfZW50cnkgKiwKLQkgICBjb25zdCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfbmV3X3NlY3Rpb25faG9vayBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgUEFSQU1TICgoYmZkICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gY29mZl93cml0ZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zZXRfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBzaG9ydCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgUFRSIGJ1eV9hbmRfcmVhZCBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGludCwgc2l6ZV90KSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NsdXJwX2xpbmVfdGFibGUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgZW51bSBjb2ZmX3N5bWJvbF9jbGFzc2lmaWNhdGlvbiBjb2ZmX2NsYXNzaWZ5X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgbG9uZyBjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotI2lmbmRlZiBjb2ZmX21rb2JqZWN0X2hvb2sKLXN0YXRpYyBQVFIgY29mZl9ta29iamVjdF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIsICBQVFIpKTsKLSNlbmRpZgotDAotLyogdm9pZCB3YXJuaW5nKCk7ICovCi0KLS8qIFJldHVybiBhIHdvcmQgd2l0aCBTVFlQXyogKHNjbmhkci5zX2ZsYWdzKSBmbGFncyBzZXQgdG8gcmVwcmVzZW50Ci0gICB0aGUgaW5jb21pbmcgU0VDXyogZmxhZ3MuICBUaGUgaW52ZXJzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzCi0gICBzdHlwX3RvX3NlY19mbGFncygpLiAgTk9URTogSWYgeW91IGFkZCB0by9jaGFuZ2UgdGhpcyByb3V0aW5lLCB5b3UKLSAgIHNob3VsZCBwcm9iYWJseSBtaXJyb3IgdGhlIGNoYW5nZXMgaW4gc3R5cF90b19zZWNfZmxhZ3MoKS4gICovCi0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0KLXN0YXRpYyBsb25nCi1zZWNfdG9fc3R5cF9mbGFncyAoc2VjX25hbWUsIHNlY19mbGFncykKLSAgICAgQ09OU1QgY2hhciAqc2VjX25hbWU7Ci0gICAgIGZsYWd3b3JkIHNlY19mbGFnczsKLXsKLSAgbG9uZyBzdHlwX2ZsYWdzID0gMDsKLQotICBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9URVhUKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9URVhUOwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9EQVRBKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9EQVRBOwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9CU1MpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0JTUzsKLSNpZmRlZiBfQ09NTUVOVAotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9DT01NRU5UKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9JTkZPOwotI2VuZGlmIC8qIF9DT01NRU5UICovCi0jaWZkZWYgX0xJQgotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9MSUIpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0xJQjsKLSNlbmRpZiAvKiBfTElCICovCi0jaWZkZWYgX0xJVAotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9MSVQpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0xJVDsKLSNlbmRpZiAvKiBfTElUICovCi0gICAgfQotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgIi5kZWJ1ZyIpKQotICAgIHsKLSNpZmRlZiBTVFlQX0RFQlVHCi0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9ERUJVRzsKLSNlbHNlCi0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9JTkZPOwotI2VuZGlmCi0gICAgfQotICBlbHNlIGlmICghc3RybmNtcCAoc2VjX25hbWUsICIuc3RhYiIsIDUpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0lORk87Ci0gICAgfQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX1BBRCkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfUEFEOwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9MT0FERVIpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0xPQURFUjsKLSAgICB9Ci0jZW5kaWYKLSAgLyogVHJ5IGFuZCBmaWd1cmUgb3V0IHdoYXQgaXQgc2hvdWxkIGJlICovCi0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19DT0RFKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0gICAgfQotICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfREFUQSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9EQVRBOwotICAgIH0KLSAgZWxzZSBpZiAoc2VjX2ZsYWdzICYgU0VDX1JFQURPTkxZKQotICAgIHsKLSNpZmRlZiBTVFlQX0xJVAkJCS8qIDI5ayByZWFkb25seSB0ZXh0L2RhdGEgc2VjdGlvbiAqLwotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfTElUOwotI2Vsc2UKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0jZW5kaWYgLyogU1RZUF9MSVQgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19MT0FEKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0gICAgfQotICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfQUxMT0MpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfQlNTOwotICAgIH0KLQotI2lmZGVmIFNUWVBfTk9MT0FECi0gIGlmICgoc2VjX2ZsYWdzICYgKFNFQ19ORVZFUl9MT0FEIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkpKSAhPSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gU1RZUF9OT0xPQUQ7Ci0jZW5kaWYKLQotICByZXR1cm4gc3R5cF9mbGFnczsKLX0KLQotI2Vsc2UgLyogQ09GRl9XSVRIX1BFICovCi0KLS8qIFRoZSBQRSB2ZXJzaW9uOyBzZWUgYWJvdmUgZm9yIHRoZSBnZW5lcmFsIGNvbW1lbnRzLiAgVGhlIG5vbi1QRQotICAgY2FzZSBzZWVtcyB0byBiZSBtb3JlIGd1ZXNzaW5nLCBhbmQgYnJlYWtzIFBFIGZvcm1hdDsgc3BlY2lmaWNhbGx5LAotICAgLnJkYXRhIGlzIHJlYWRvbmx5LCBidXQgaXQgc3VyZSBhaW4ndCB0ZXh0LiAgUmVhbGx5LCBhbGwgdGhpcwotICAgc2hvdWxkIGJlIHNldCB1cCBwcm9wZXJseSBpbiBnYXMgKG9yIHdoYXRldmVyIGFzc2VtYmxlciBpcyBpbiB1c2UpLAotICAgYW5kIGhvbm9yIHdoYXRldmVyIG9iamNvcHkvc3RyaXAsIGV0Yy4gc2VudCB1cyBhcyBpbnB1dC4gICovCi0KLXN0YXRpYyBsb25nCi1zZWNfdG9fc3R5cF9mbGFncyAoc2VjX25hbWUsIHNlY19mbGFncykKLSAgICAgY29uc3QgY2hhciAqc2VjX25hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmxhZ3dvcmQgc2VjX2ZsYWdzOwotewotICBsb25nIHN0eXBfZmxhZ3MgPSAwOwotCi0gIC8qIGNhdXRpb246IHRoZXJlIGFyZSBhdCBsZWFzdCB0aHJlZSBncm91cHMgb2Ygc3ltYm9scyB0aGF0IGhhdmUKLSAgICAgdmVyeSBzaW1pbGFyIGJpdHMgYW5kIG1lYW5pbmdzOiBJTUFHRV9TQ04qLCBTRUNfKiwgYW5kIFNUWVBfKi4KLSAgICAgU0VDXyogYXJlIHRoZSBCRkQgaW50ZXJuYWwgZmxhZ3MsIHVzZWQgZm9yIGdlbmVyaWMgQkZECi0gICAgIGluZm9ybWF0aW9uLiAgU1RZUF8qIGFyZSB0aGUgQ09GRiBzZWN0aW9uIGZsYWdzIHdoaWNoIGFwcGVhciBpbgotICAgICBDT0ZGIGZpbGVzLiAgSU1BR0VfU0NOXyogYXJlIHRoZSBQRSBzZWN0aW9uIGZsYWdzIHdoaWNoIGFwcGVhciBpbgotICAgICBQRSBmaWxlcy4gIFRoZSBTVFlQXyogZmxhZ3MgYW5kIHRoZSBJTUFHRV9TQ05fKiBmbGFncyBvdmVybGFwLAotICAgICBidXQgdGhlcmUgYXJlIG1vcmUgSU1BR0VfU0NOXyogZmxhZ3MuICAqLwotCi0gIC8qIHNraXAgTE9BRCAqLwotICAvKiBSRUFET05MWSBsYXRlciAqLwotICAvKiBza2lwIFJFTE9DICovCi0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0NPREUpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fQ05UX0NPREU7Ci0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0RBVEEpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEE7Ci0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0FMTE9DKSAhPSAwICYmIChzZWNfZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBOyAgLyogPT1TVFlQX0JTUyAqLwotICAvKiBza2lwIFJPTSAqLwotICAvKiBza2lwIENPTlNUUlVDVE9SICovCi0gIC8qIHNraXAgQ09OVEVOVFMgKi8KLSNpZmRlZiBTVFlQX05PTE9BRAotICBpZiAoKHNlY19mbGFncyAmIChTRUNfTkVWRVJfTE9BRCB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZKSkgIT0gMCkKLSAgICBzdHlwX2ZsYWdzIHw9IFNUWVBfTk9MT0FEOwotI2VuZGlmCi0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX0lTX0NPTU1PTikgIT0gMCkKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9MTktfQ09NREFUOwotICBpZiAoKHNlY19mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFOwotICBpZiAoKHNlY19mbGFncyAmIFNFQ19FWENMVURFKSAhPSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX0xOS19SRU1PVkU7Ci0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpICE9IDApCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTE5LX1JFTU9WRTsKLSAgLyogc2tpcCBJTl9NRU1PUlkgKi8KLSAgLyogc2tpcCBTT1JUICovCi0gIGlmIChzZWNfZmxhZ3MgJiBTRUNfTElOS19PTkNFKSAKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9MTktfQ09NREFUOyAKLSAgLyogc2tpcCBMSU5LX0RVUExJQ0FURVMgKi8KLSAgLyogc2tpcCBMSU5LRVJfQ1JFQVRFRCAqLwotCi0gIC8qIEZvciBub3csIHRoZSByZWFkL3dyaXRlIGJpdHMgYXJlIG1hcHBlZCBvbnRvIFNFQ19SRUFET05MWSwgZXZlbgotICAgICB0aG91Z2ggdGhlIHNlbWFudGljcyBkb24ndCBxdWl0ZSBtYXRjaC4gIFRoZSBiaXRzIGZyb20gdGhlIGlucHV0Ci0gICAgIGFyZSByZXRhaW5lZCBpbiBwZWlfc2VjdGlvbl9kYXRhKGFiZmQsIHNlY3Rpb24pLT5wZV9mbGFncyAqLwotCi0gIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9SRUFEOyAgICAgICAvKiBhbHdheXMgcmVhZGFibGUuICovCi0gIGlmICgoc2VjX2ZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9XUklURTsgICAgLyogSW52ZXJ0IFJFQURPTkxZIGZvciB3cml0ZSAqLwotICBpZiAoc2VjX2ZsYWdzICYgU0VDX0NPREUpCi0gICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTUVNX0VYRUNVVEU7ICAvKiBDT0RFLT5FWEVDVVRFICovCi0gIGlmIChzZWNfZmxhZ3MgJiBTRUNfU0hBUkVEKQotICAgIHN0eXBfZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9TSEFSRUQ7ICAgLyogU2hhcmVkIHJlbWFpbnMgbWVhbmluZ2Z1bCAqLwotCi0gIHJldHVybiBzdHlwX2ZsYWdzOyAKLX0KLQotI2VuZGlmIC8qIENPRkZfV0lUSF9QRSAqLwotCi0vKiBSZXR1cm4gYSB3b3JkIHdpdGggU0VDXyogZmxhZ3Mgc2V0IHRvIHJlcHJlc2VudCB0aGUgaW5jb21pbmcgU1RZUF8qCi0gICBmbGFncyAoZnJvbSBzY25oZHIuc19mbGFncykuICBUaGUgaW52ZXJzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzCi0gICBzZWNfdG9fc3R5cF9mbGFncygpLiAgTk9URTogSWYgeW91IGFkZCB0by9jaGFuZ2UgdGhpcyByb3V0aW5lLCB5b3UKLSAgIHNob3VsZCBwcm9iYWJseSBtaXJyb3IgdGhlIGNoYW5nZXMgaW4gc2VjX3RvX3N0eXBfZmxhZ3MoKS4gICovCi0KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0KLXN0YXRpYyBmbGFnd29yZAotc3R5cF90b19zZWNfZmxhZ3MgKGFiZmQsIGhkciwgbmFtZSwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBoZHI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmludGVybmFsX3MgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBoZHI7Ci0gIGxvbmcgc3R5cF9mbGFncyA9IGludGVybmFsX3MtPnNfZmxhZ3M7Ci0gIGZsYWd3b3JkIHNlY19mbGFncyA9IDA7Ci0KLSNpZmRlZiBTVFlQX05PTE9BRAotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfTk9MT0FEKQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLSAgICB9Ci0jZW5kaWYgLyogU1RZUF9OT0xPQUQgKi8KLQotICAvKiBGb3IgMzg2IENPRkYsIGF0IGxlYXN0LCBhbiB1bmxvYWRhYmxlIHRleHQgb3IgZGF0YSBzZWN0aW9uIGlzCi0gICAgIGFjdHVhbGx5IGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gICovCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9URVhUKQotICAgIHsKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICAgIGVsc2UKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0RBVEEpCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfQlNTKQotICAgIHsKLSNpZmRlZiBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotI2VuZGlmCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0lORk8pCi0gICAgewotICAgICAgLyogV2UgbWFyayB0aGVzZSBhcyBTRUNfREVCVUdHSU5HLCBidXQgb25seSBpZiBDT0ZGX1BBR0VfU0laRSBpcwotCSBkZWZpbmVkLiAgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgdXNlcwotCSBDT0ZGX1BBR0VfU0laRSB0byBlbnN1cmUgdGhhdCB0aGUgbG93IG9yZGVyIGJpdHMgb2YgdGhlCi0JIHNlY3Rpb24gVk1BIGFuZCB0aGUgZmlsZSBvZmZzZXQgbWF0Y2guICBJZiB3ZSBkb24ndCBrbm93Ci0JIENPRkZfUEFHRV9TSVpFLCB3ZSBjYW4ndCBlbnN1cmUgdGhlIGNvcnJlY3QgY29ycmVzcG9uZGVuY2UsCi0JIGFuZCBkZW1hbmQgcGFnZSBsb2FkaW5nIG9mIHRoZSBmaWxlIHdpbGwgZmFpbC4gICovCi0jaWYgZGVmaW5lZCAoQ09GRl9QQUdFX1NJWkUpICYmICFkZWZpbmVkIChDT0ZGX0FMSUdOX0lOX1NfRkxBR1MpCi0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfUEFEKQotICAgIHsKLSAgICAgIHNlY19mbGFncyA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9URVhUKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICAgIGVsc2UKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RBVEEpID09IDApCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfQlNTKSA9PSAwKQotICAgIHsKLSNpZmRlZiBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotI2VuZGlmCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kZWJ1ZyIpID09IDAKLSNpZmRlZiBfQ09NTUVOVAotCSAgIHx8IHN0cmNtcCAobmFtZSwgX0NPTU1FTlQpID09IDAKLSNlbmRpZgotCSAgIHx8IHN0cm5jbXAgKG5hbWUsICIuc3RhYiIsIDUpID09IDApCi0gICAgewotI2lmZGVmIENPRkZfUEFHRV9TSVpFCi0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLSNlbmRpZgotICAgIH0KLSNpZmRlZiBfTElCCi0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJQikgPT0gMCkKLSAgICA7Ci0jZW5kaWYKLSNpZmRlZiBfTElUCi0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJVCkgPT0gMCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgPSBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWTsKLSAgICB9Ci0jZW5kaWYKLSAgZWxzZQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLSAgICB9Ci0KLSNpZmRlZiBTVFlQX0xJVAkJCS8qIEEyOWsgcmVhZG9ubHkgdGV4dC9kYXRhIHNlY3Rpb24gdHlwZSAqLwotICBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX0xJVCkgPT0gU1RZUF9MSVQpCi0gICAgewotICAgICAgc2VjX2ZsYWdzID0gKFNFQ19MT0FEIHwgU0VDX0FMTE9DIHwgU0VDX1JFQURPTkxZKTsKLSAgICB9Ci0jZW5kaWYgLyogU1RZUF9MSVQgKi8KLSNpZmRlZiBTVFlQX09USEVSX0xPQUQJCS8qIE90aGVyIGxvYWRlZCBzZWN0aW9ucyAqLwotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfT1RIRVJfTE9BRCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgPSAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpOwotICAgIH0KLSNlbmRpZiAvKiBTVFlQX1NEQVRBICovCi0KLSNpZiBkZWZpbmVkIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUykgJiYgZGVmaW5lZCAoQ09GRl9TVVBQT1JUX0dOVV9MSU5LT05DRSkKLSAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBpZiB0aGUgbmFtZSBiZWdpbnMgd2l0aCAuZ251LmxpbmtvbmNlLCB3ZQotICAgICBvbmx5IGxpbmsgYSBzaW5nbGUgY29weSBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0Ci0gICAgIGcrKy4gIGcrKyB3aWxsIGVtaXQgZWFjaCB0ZW1wbGF0ZSBleHBhbnNpb24gaW4gaXRzIG93biBzZWN0aW9uLgotICAgICBUaGUgc3ltYm9scyB3aWxsIGJlIGRlZmluZWQgYXMgd2Vhaywgc28gdGhhdCBtdWx0aXBsZSBkZWZpbml0aW9ucwotICAgICBhcmUgcGVybWl0dGVkLiAgVGhlIEdOVSBsaW5rZXIgZXh0ZW5zaW9uIGlzIHRvIGFjdHVhbGx5IGRpc2NhcmQKLSAgICAgYWxsIGJ1dCBvbmUgb2YgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ251LmxpbmtvbmNlIiwgc2l6ZW9mICIuZ251LmxpbmtvbmNlIiAtIDEpID09IDApCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0jZW5kaWYKLQotICByZXR1cm4gc2VjX2ZsYWdzOwotfQotCi0jZWxzZSAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotLyogVGhlIFBFIHZlcnNpb247IHNlZSBhYm92ZSBmb3IgdGhlIGdlbmVyYWwgY29tbWVudHMuCi0KLSAgIFNpbmNlIHRvIHNldCB0aGUgU0VDX0xJTktfT05DRSBhbmQgYXNzb2NpYXRlZCBmbGFncywgd2UgaGF2ZSB0bwotICAgbG9vayBhdCB0aGUgc3ltYm9sIHRhYmxlIGFueXdheSwgd2UgcmV0dXJuIHRoZSBzeW1ib2wgdGFibGUgaW5kZXgKLSAgIG9mIHRoZSBzeW1ib2wgYmVpbmcgdXNlZCBhcyB0aGUgQ09NREFUIHN5bWJvbC4gIFRoaXMgaXMgYWRtaXR0ZWRseQotICAgdWdseSwgYnV0IHRoZXJlJ3MgcmVhbGx5IG5vd2hlcmUgZWxzZSB0aGF0IHdlIGhhdmUgYWNjZXNzIHRvIHRoZQotICAgcmVxdWlyZWQgaW5mb3JtYXRpb24uICBGSVhNRTogSXMgdGhlIENPTURBVCBzeW1ib2wgaW5kZXggdXNlZCBmb3IKLSAgIGFueSBwdXJwb3NlIG90aGVyIHRoYW4gb2JqZHVtcD8gICovCi0KLXN0YXRpYyBmbGFnd29yZAotc3R5cF90b19zZWNfZmxhZ3MgKGFiZmQsIGhkciwgbmFtZSwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBoZHI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICppbnRlcm5hbF9zID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaGRyOwotICBsb25nIHN0eXBfZmxhZ3MgPSBpbnRlcm5hbF9zLT5zX2ZsYWdzOwotICBmbGFnd29yZCBzZWNfZmxhZ3MgPSAwOwotCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9EU0VDVCkKLSAgICBhYm9ydCAoKTsgIC8qIERvbid0IGtub3cgd2hhdCB0byBkbyAqLwotI2lmZGVmIFNFQ19ORVZFUl9MT0FECi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9OT0xPQUQpCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19ORVZFUl9MT0FEOwotI2VuZGlmCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9HUk9VUCkKLSAgICBhYm9ydCAoKTsgIC8qIERvbid0IGtub3cgd2hhdCB0byBkbyAqLwotICAvKiBza2lwIElNQUdFX1NDTl9UWVBFX05PX1BBRCAqLwotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfQ09QWSkKLSAgICBhYm9ydCAoKTsgIC8qIERvbid0IGtub3cgd2hhdCB0byBkbyAqLwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9DTlRfQ09ERSkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEpCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0gIGlmIChzdHlwX2ZsYWdzICYgSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEpCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19BTExPQzsKLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTE5LX09USEVSKQotICAgIGFib3J0ICgpOyAgLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvICovCi0gIGlmIChzdHlwX2ZsYWdzICYgSU1BR0VfU0NOX0xOS19JTkZPKQotICAgIHsKLSAgICAgIC8qIFdlIG1hcmsgdGhlc2UgYXMgU0VDX0RFQlVHR0lORywgYnV0IG9ubHkgaWYgQ09GRl9QQUdFX1NJWkUgaXMKLQkgZGVmaW5lZC4gIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIHVzZXMKLQkgQ09GRl9QQUdFX1NJWkUgdG8gZW5zdXJlIHRoYXQgdGhlIGxvdyBvcmRlciBiaXRzIG9mIHRoZQotCSBzZWN0aW9uIFZNQSBhbmQgdGhlIGZpbGUgb2Zmc2V0IG1hdGNoLiAgSWYgd2UgZG9uJ3Qga25vdwotCSBDT0ZGX1BBR0VfU0laRSwgd2UgY2FuJ3QgZW5zdXJlIHRoZSBjb3JyZWN0IGNvcnJlc3BvbmRlbmNlLAotCSBhbmQgZGVtYW5kIHBhZ2UgbG9hZGluZyBvZiB0aGUgZmlsZSB3aWxsIGZhaWwuICAqLwotI2lmZGVmIENPRkZfUEFHRV9TSVpFCi0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLSNlbmRpZgotICAgIH0KLSAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX09WRVIpCi0gICAgYWJvcnQgKCk7ICAvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gKi8KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTE5LX1JFTU9WRSkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTUVNX1NIQVJFRCkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX1NIQVJFRDsKLSAgLyogQ09NREFUOiBzZWUgYmVsb3cgKi8KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFKQotICAgIHNlY19mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotICBpZiAoc3R5cF9mbGFncyAmIElNQUdFX1NDTl9NRU1fTk9UX0NBQ0hFRCkKLSAgICBhYm9ydCAoKTsvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gKi8KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTUVNX05PVF9QQUdFRCkKLSAgICBhYm9ydCAoKTsgLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvICovCi0KLSAgLyogV2UgaW5mZXIgZnJvbSB0aGUgZGlzdGluY3QgcmVhZC93cml0ZS9leGVjdXRlIGJpdHMgdGhlIHNldHRpbmdzCi0gICAgIG9mIHNvbWUgb2YgdGhlIGJmZCBmbGFnczsgdGhlIGFjdHVhbCB2YWx1ZXMsIHNob3VsZCB3ZSBuZWVkIHRoZW0sCi0gICAgIGFyZSBhbHNvIGluIHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT5wZV9mbGFncy4gICovCi0KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTUVNX0VYRUNVVEUpCi0gICAgc2VjX2ZsYWdzIHw9IFNFQ19DT0RFOyAgIC8qIFByb2JhYmx5IHJlZHVuZGFudCAqLwotICAvKiBJTUFHRV9TQ05fTUVNX1JFQUQgaXMgc2ltcGx5IGlnbm9yZWQsIGFzc3VtaW5nIGl0IGFsd2F5cyB0byBiZSB0cnVlLiAqLwotICBpZiAoKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTUVNX1dSSVRFKSA9PSAwKQotICAgIHNlY19mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0KLSAgLyogQ09NREFUIGdldHMgdmVyeSBzcGVjaWFsIHRyZWF0bWVudC4gICovCi0gIGlmIChzdHlwX2ZsYWdzICYgSU1BR0VfU0NOX0xOS19DT01EQVQpCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX09OQ0U7Ci0KLSAgICAgIC8qIFVuZm9ydHVuYXRlbHksIHRoZSBQRSBmb3JtYXQgc3RvcmVzIGVzc2VudGlhbCBpbmZvcm1hdGlvbiBpbgotICAgICAgICAgdGhlIHN5bWJvbCB0YWJsZSwgb2YgYWxsIHBsYWNlcy4gIFdlIG5lZWQgdG8gZXh0cmFjdCB0aGF0Ci0gICAgICAgICBpbmZvcm1hdGlvbiBub3csIHNvIHRoYXQgb2JqZHVtcCBhbmQgdGhlIGxpbmtlciB3aWxsIGtub3cgaG93Ci0gICAgICAgICB0byBoYW5kbGUgdGhlIHNlY3Rpb24gd2l0aG91dCB3b3JyeWluZyBhYm91dCB0aGUgc3ltYm9scy4gIFdlCi0gICAgICAgICBjYW4ndCBjYWxsIHNsdXJwX3N5bXRhYiwgYmVjYXVzZSB0aGUgbGlua2VyIGRvZXNuJ3Qgd2FudCB0aGUKLSAgICAgICAgIHN3YXBwZWQgc3ltYm9scy4gICovCi0KLSAgICAgIC8qIENPTURBVCBzZWN0aW9ucyBhcmUgc3BlY2lhbC4gIFRoZSBmaXJzdCBzeW1ib2wgaXMgdGhlIHNlY3Rpb24KLQkgc3ltYm9sLCB3aGljaCB0ZWxscyB3aGF0IGtpbmQgb2YgQ09NREFUIHNlY3Rpb24gaXQgaXMuICBUaGUKLQkgc2Vjb25kIHN5bWJvbCBpcyB0aGUgImNvbWRhdCBzeW1ib2wiIC0gdGhlIG9uZSB3aXRoIHRoZQotCSB1bmlxdWUgbmFtZS4gIEdOVSB1c2VzIHRoZSBzZWN0aW9uIHN5bWJvbCBmb3IgdGhlIHVuaXF1ZQotCSBuYW1lOyBNUyB1c2VzICIudGV4dCIgZm9yIGV2ZXJ5IGNvbWRhdCBzZWN0aW9uLiAgU2lnaC4gIC0gREogKi8KLQotICAgICAgLyogVGhpcyBpcyBub3QgbWlycm9yZWQgaW4gc2VjX3RvX3N0eXBfZmxhZ3MoKSwgYnV0IHRoZXJlCi0JIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIG5lZWQgdG8sIGVpdGhlciwgYW5kIGl0IHdvdWxkIGF0IGJlc3QgYmUKLQkgcmF0aGVyIG1lc3N5LiAgKi8KLQotICAgICAgaWYgKF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0JewotCSAgYmZkX2J5dGUgKmVzeW1zdGFydCwgKmVzeW0sICplc3ltZW5kOwotCSAgaW50IHNlZW5fc3RhdGUgPSAwOwotCSAgY2hhciAqdGFyZ2V0X25hbWU7Ci0KLQkgIGVzeW1zdGFydCA9IGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0JICBlc3ltZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIFNZTUVTWjsKLQotCSAgd2hpbGUgKGVzeW0gPCBlc3ltZW5kKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotCSAgICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICAgICAgY29uc3QgY2hhciAqc3ltbmFtZTsKLQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmaXN5bSk7Ci0KLQkgICAgICBpZiAoc2l6ZW9mIChpbnRlcm5hbF9zLT5zX25hbWUpID4gU1lNTk1MRU4pCi0JCXsKLQkJICAvKiBUaGlzIGNhc2UgaW1wbGllcyB0aGF0IHRoZSBtYXRjaGluZyBzeW1ib2wgbmFtZQotICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaWYgKGlzeW0ubl9zY251bSA9PSBzZWN0aW9uLT50YXJnZXRfaW5kZXgpCi0JCXsKLQkJICAvKiBBY2NvcmRpbmcgdG8gdGhlIE1TVkMgZG9jdW1lbnRhdGlvbiwgdGhlIGZpcnN0Ci0JCSAgICAgVFdPIGVudHJpZXMgd2l0aCB0aGUgc2VjdGlvbiAjIGFyZSBib3RoIG9mCi0JCSAgICAgaW50ZXJlc3QgdG8gdXMuICBUaGUgZmlyc3Qgb25lIGlzIHRoZSAic2VjdGlvbgotCQkgICAgIHN5bWJvbCIgKHNlY3Rpb24gbmFtZSkuICBUaGUgc2Vjb25kIGlzIHRoZSBjb21kYXQKLQkJICAgICBzeW1ib2wgbmFtZS4gIEhlcmUsIHdlJ3ZlIGZvdW5kIHRoZSBmaXJzdAotCQkgICAgIHF1YWxpZnlpbmcgZW50cnk7IHdlIGRpc3Rpbmd1aXNoIGl0IGZyb20gdGhlCi0JCSAgICAgc2Vjb25kIHdpdGggYSBzdGF0ZSBmbGFnLgotCi0JCSAgICAgSW4gdGhlIGNhc2Ugb2YgZ2FzLWdlbmVyYXRlZCAoYXQgbGVhc3QgdW50aWwgdGhhdAotCQkgICAgIGlzIGZpeGVkKSAubyBmaWxlcywgaXQgaXNuJ3QgbmVjZXNzYXJpbHkgdGhlCi0JCSAgICAgc2Vjb25kIG9uZS4gIEl0IG1heSBiZSBzb21lIG90aGVyIGxhdGVyIHN5bWJvbC4KLQotCQkgICAgIFNpbmNlIGdhcyBhbHNvIGRvZXNuJ3QgZm9sbG93IE1TIGNvbnZlbnRpb25zIGFuZAotCQkgICAgIGVtaXRzIHRoZSBzZWN0aW9uIHNpbWlsYXIgdG8gLnRleHQkPG5hbWU+LCB3aGVyZQotCQkgICAgIDxzb21ldGhpbmc+IGlzIHRoZSBuYW1lIHdlJ3JlIGxvb2tpbmcgZm9yLCB3ZQotCQkgICAgIGRpc3Rpbmd1aXNoIHRoZSB0d28gYXMgZm9sbG93czoKLQotCQkgICAgIElmIHRoZSBzZWN0aW9uIG5hbWUgaXMgc2ltcGx5IGEgc2VjdGlvbiBuYW1lIChubwotCQkgICAgICQpIHdlIHByZXN1bWUgaXQncyBNUy1nZW5lcmF0ZWQsIGFuZCBsb29rIGF0Ci0JCSAgICAgcHJlY2lzZWx5IHRoZSBzZWNvbmQgc3ltYm9sIGZvciB0aGUgY29tZGF0IG5hbWUuCi0JCSAgICAgSWYgdGhlIHNlY3Rpb24gbmFtZSBoYXMgYSAkLCB3ZSBhc3N1bWUgaXQncwotCQkgICAgIGdhcy1nZW5lcmF0ZWQsIGFuZCBsb29rIGZvciA8c29tZXRoaW5nPiAod2hhdGV2ZXIKLQkJICAgICBmb2xsb3dzIHRoZSAkKSBhcyB0aGUgY29tZGF0IHN5bWJvbC4gICovCi0KLQkJICAvKiBBbGwgMyBicmFuY2hlcyB1c2UgdGhpcyAqLwotCQkgIHN5bW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZpc3ltLCBidWYpOwotCi0JCSAgaWYgKHN5bW5hbWUgPT0gTlVMTCkKLQkJICAgIGFib3J0ICgpOwotCi0JCSAgc3dpdGNoIChzZWVuX3N0YXRlKQotCQkgICAgewotCQkgICAgY2FzZSAwOgotCQkgICAgICB7Ci0JCQkvKiBUaGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoZSBzeW1ib2wuICAqLwotCQkJdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQotCQkJc2Vlbl9zdGF0ZSA9IDE7Ci0KLQkJCS8qIElmIGl0IGlzbid0IHRoZSBzdHVmZiB3ZSdyZSBleHBlY3RpbmcsIGRpZTsKLQkJCSAgIFRoZSBNUyBkb2N1bWVudGF0aW9uIGlzIHZhZ3VlLCBidXQgaXQKLQkJCSAgIGFwcGVhcnMgdGhhdCB0aGUgc2Vjb25kIGVudHJ5IHNlcnZlcyBCT1RICi0JCQkgICBhcyB0aGUgY29tZGF0IHN5bWJvbCBhbmQgdGhlIGRlZmluaW5nCi0JCQkgICBzeW1ib2wgcmVjb3JkIChlaXRoZXIgQ19TVEFUIG9yIENfRVhULAotCQkJICAgcG9zc2libHkgd2l0aCBhbiBhdXggZW50cnkgd2l0aCBkZWJ1ZwotCQkJICAgaW5mb3JtYXRpb24gaWYgaXQncyBhIGZ1bmN0aW9uLikgIEl0Ci0JCQkgICBhcHBlYXJzIHRoZSBvbmx5IHdheSB0byBmaW5kIHRoZSBzZWNvbmQgb25lCi0JCQkgICBpcyB0byBjb3VudC4gIChPbiBJbnRlbCwgdGhleSBhcHBlYXIgdG8gYmUKLQkJCSAgIGFkamFjZW50LCBidXQgb24gQWxwaGEsIHRoZXkgaGF2ZSBiZWVuCi0JCQkgICBmb3VuZCBzZXBhcmF0ZWQuKQotCi0JCQkgICBIZXJlLCB3ZSB0aGluayB3ZSd2ZSBmb3VuZCB0aGUgZmlyc3Qgb25lLAotCQkJICAgYnV0IHRoZXJlJ3Mgc29tZSBjaGVja2luZyB3ZSBjYW4gZG8gdG8gYmUKLQkJCSAgIHN1cmUuICAqLwotCi0JCQlpZiAoISAoaXN5bS5uX3NjbGFzcyA9PSBDX1NUQVQKLQkJCSAgICAgICAmJiBpc3ltLm5fdHlwZSA9PSBUX05VTEwKLQkJCSAgICAgICAmJiBpc3ltLm5fdmFsdWUgPT0gMCkpCi0JCQkgIGFib3J0ICgpOwotCi0JCQkvKiBGSVhNRSBMQVRFUjogTVNWQyBnZW5lcmF0ZXMgc2VjdGlvbiBuYW1lcwotCQkJICAgbGlrZSAudGV4dCBmb3IgY29tZGF0cy4gIEdhcyBnZW5lcmF0ZXMKLQkJCSAgIG5hbWVzIGxpa2UgLnRleHQkZm9vX19GdiAoaW4gdGhlIGNhc2Ugb2YgYQotCQkJICAgZnVuY3Rpb24pLiAgU2VlIGNvbW1lbnQgYWJvdmUgZm9yIG1vcmUuICAqLwotCi0JCQlpZiAoc3RyY21wIChuYW1lLCBzeW1uYW1lKSAhPSAwKQotCQkJICBhYm9ydCAoKTsKLSAgCi0JCQkvKiBUaGlzIGlzIHRoZSBzZWN0aW9uIHN5bWJvbC4gICovCi0KLQkJCWJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCAoUFRSKSAoZXN5bSArIFNZTUVTWiksCi0JCQkJCSAgICAgIGlzeW0ubl90eXBlLCBpc3ltLm5fc2NsYXNzLAotCQkJCQkgICAgICAwLCBpc3ltLm5fbnVtYXV4LCAoUFRSKSAmYXV4KTsKLQotCQkJdGFyZ2V0X25hbWUgPSBzdHJjaHIgKG5hbWUsICckJyk7Ci0JCQlpZiAodGFyZ2V0X25hbWUgIT0gTlVMTCkKLQkJCSAgewotCQkJICAgIC8qIEdhcyBtb2RlLiAgKi8KLQkJCSAgICBzZWVuX3N0YXRlID0gMjsKLQkJCSAgICAvKiBTa2lwIHRoZSBgJCcuICAqLwotCQkJICAgIHRhcmdldF9uYW1lICs9IDE7Ci0JCQkgIH0KLQotCQkJLyogRklYTUU6IE1pY3Jvc29mdCB1c2VzIE5PRFVQTElDQVRFUyBhbmQKLQkJCSAgIEFTU09DSUFUSVZFLCBidXQgZ251IHVzZXMgQU5ZIGFuZAotCQkJICAgU0FNRV9TSVpFLiAgVW5mb3J0dW5hdGVseSwgZ251IGRvZXNuJ3QgZG8KLQkJCSAgIHRoZSBjb21kYXQgc3ltYm9scyByaWdodC4gIFNvLCB1bnRpbCB3ZSBjYW4KLQkJCSAgIGZpeCBpdCB0byBkbyB0aGUgcmlnaHQgdGhpbmcsIHdlIGFyZQotCQkJICAgdGVtcG9yYXJpbHkgZGlzYWJsaW5nIGNvbWRhdHMgZm9yIHRoZSBNUwotCQkJICAgdHlwZXMgKHRoZXkncmUgdXNlZCBpbiBETExzIGFuZCBDKyssIGJ1dCB3ZQotCQkJICAgZG9uJ3Qgc3VwcG9ydCAqdGhlaXIqIEMrKyBsaWJyYXJpZXMgYW55d2F5Ci0JCQkgICAtIERKLiAgKi8KLQotCQkJLyogQ3lnd2luIGRvZXMgbm90IGZvbGxvdyB0aGUgTVMgc3R5bGUsIGFuZAotCQkJICAgdXNlcyBBTlkgYW5kIFNBTUVfU0laRSB3aGVyZSBOT0RVUExJQ0FURVMKLQkJCSAgIGFuZCBBU1NPQ0lBVElWRSBzaG91bGQgYmUgdXNlZC4gIEZvcgotCQkJICAgSW50ZXJpeCwgd2UganVzdCBkbyB0aGUgcmlnaHQgdGhpbmcgdXAKLQkJCSAgIGZyb250LiAgKi8KLQotCQkJc3dpdGNoIChhdXgueF9zY24ueF9jb21kYXQpCi0JCQkgIHsKLQkJCSAgY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUzoKLSNpZmRlZiBTVFJJQ1RfUEVfRk9STUFUIAotCQkJICAgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZOwotI2Vsc2UKLQkJCSAgICBzZWNfZmxhZ3MgJj0gflNFQ19MSU5LX09OQ0U7Ci0jZW5kaWYKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZOgotCQkJICAgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRToKLQkJCSAgICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU7Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENIOgotCQkJICAgIC8qIE5vdCB5ZXQgZnVsbHkgaW1wbGVtZW50ZWQgPz8/ICovCi0JCQkgICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzsKLQkJCSAgICBicmVhazsKLQotCQkJICAvKiBkZWJ1ZyRTIGdldHMgdGhpcyBjYXNlOyBvdGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNhdGlvbnMgPz8/ICovCi0KLQkJCSAgLyogVGhlcmUgbWF5IGJlIG5vIHN5bWJvbC4uLiB3ZSdsbCBzZWFyY2gKLQkJCSAgICAgdGhlIHdob2xlIHRhYmxlLi4uIElzIHRoaXMgdGhlIHJpZ2h0Ci0JCQkgICAgIHBsYWNlIHRvIHBsYXkgdGhpcyBnYW1lPyBPciBzaG91bGQgd2UgZG8KLQkJCSAgICAgaXQgd2hlbiByZWFkaW5nIGl0IGluLiAgKi8KLQkJCSAgY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FTU09DSUFUSVZFOgotI2lmZGVmIFNUUklDVF9QRV9GT1JNQVQKLQkJCSAgICAvKiBGSVhNRTogVGhpcyBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLiAgKi8KLQkJCSAgICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOwotI2Vsc2UKLQkJCSAgICBzZWNfZmxhZ3MgJj0gflNFQ19MSU5LX09OQ0U7Ci0jZW5kaWYKLQkJCSAgICBicmVhazsKLQotCQkJICBkZWZhdWx0OiAgLyogMCBtZWFucyAibm8gc3ltYm9sIiAqLwotCQkJICAgIC8qIGRlYnVnJEYgZ2V0cyB0aGlzIGNhc2U7IG90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGljYXRpb25zID8/PyAqLwotCQkJICAgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIH0KLQkgCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgMjoKLQkJICAgICAgLyogR2FzIG1vZGU6IHRoZSBmaXJzdCBtYXRjaGluZyBvbiBwYXJ0aWFsIG5hbWUuICAqLwotCi0jaWZuZGVmIFRBUkdFVF9VTkRFUlNDT1JFCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFIDAKLSNlbmRpZgotCQkgICAgICAvKiBJcyB0aGlzIHRoZSBuYW1lIHdlJ3JlIGxvb2tpbmcgZm9yPyAqLwotCQkgICAgICBpZiAoc3RyY21wICh0YXJnZXRfbmFtZSwgCi0JCQkJICBzeW1uYW1lICsgKFRBUkdFVF9VTkRFUlNDT1JFID8gMSA6IDApKSAhPSAwKQotCQkJewotCQkJICAgIC8qIE5vdCB0aGUgbmFtZSB3ZSdyZSBsb29raW5nIGZvciAqLwotCSAgICAgICAgICAgICAgICAgICAgZXN5bSArPSAoaXN5bS5uX251bWF1eCArIDEpICogU1lNRVNaOwotCQkJICAgIGNvbnRpbnVlOwotCQkJfQotCQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCQkgICAgY2FzZSAxOiAKLQkJICAgICAgLyogTVNWQyBtb2RlOiB0aGUgbGV4aWNhbGx5IHNlY29uZCBzeW1ib2wgKG9yCi0JCQkgZHJvcCB0aHJvdWdoIGZyb20gdGhlIGFib3ZlKS4gICovCi0JCSAgICAgIHsKLQkJICAgICAgICBjaGFyICpuZXduYW1lOwotCi0JCQkvKiBUaGlzIG11c3QgdGhlIHRoZSBzZWNvbmQgc3ltYm9sIHdpdGggdGhlCi0JCQkgICBzZWN0aW9uICMuICBJdCBpcyB0aGUgYWN0dWFsIHN5bWJvbCBuYW1lLgotCQkJICAgSW50ZWwgcHV0cyB0aGUgdHdvIGFkamFjZW50LCBidXQgQWxwaGEgKGF0Ci0JCQkgICBsZWFzdCkgc3ByZWFkcyB0aGVtIG91dC4gICovCi0KLQkJICAgICAgICBzZWN0aW9uLT5jb21kYXQgPSAKLQkJCSAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfY29tZGF0X2luZm8pKTsKLQkJICAgICAgICBpZiAoc2VjdGlvbi0+Y29tZGF0ID09IE5VTEwpCi0JCSAgICAgICAgICBhYm9ydCAoKTsKLQkJICAgICAgICBzZWN0aW9uLT5jb21kYXQtPnN5bWJvbCA9Ci0JCQkgIChlc3ltIC0gZXN5bXN0YXJ0KSAvIFNZTUVTWjsKLQotCQkgICAgICAgIG5ld25hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoc3ltbmFtZSkgKyAxKTsKLQkJICAgICAgICBpZiAobmV3bmFtZSA9PSBOVUxMKQotCQkgICAgICAgICAgYWJvcnQgKCk7Ci0KLQkJICAgICAgICBzdHJjcHkgKG5ld25hbWUsIHN5bW5hbWUpOwotCQkgICAgICAgIHNlY3Rpb24tPmNvbWRhdC0+bmFtZSA9IG5ld25hbWU7Ci0KLQkJICAgICAgfQotCi0JCSAgICAgIGdvdG8gYnJlYWtsb29wOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBlc3ltICs9IChpc3ltLm5fbnVtYXV4ICsgMSkgKiBTWU1FU1o7Ci0JICAgIH0KLQkgIGJyZWFrbG9vcDoKLQl9Ci0gICAgfQotCi0jaWYgZGVmaW5lZCAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpICYmIGRlZmluZWQgKENPRkZfU1VQUE9SVF9HTlVfTElOS09OQ0UpCi0gIC8qIEFzIGEgR05VIGV4dGVuc2lvbiwgaWYgdGhlIG5hbWUgYmVnaW5zIHdpdGggLmdudS5saW5rb25jZSwgd2UKLSAgICAgb25seSBsaW5rIGEgc2luZ2xlIGNvcHkgb2YgdGhlIHNlY3Rpb24uICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydAotICAgICBnKysuICBnKysgd2lsbCBlbWl0IGVhY2ggdGVtcGxhdGUgZXhwYW5zaW9uIGluIGl0cyBvd24gc2VjdGlvbi4KLSAgICAgVGhlIHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkIGFzIHdlYWssIHNvIHRoYXQgbXVsdGlwbGUgZGVmaW5pdGlvbnMKLSAgICAgYXJlIHBlcm1pdHRlZC4gIFRoZSBHTlUgbGlua2VyIGV4dGVuc2lvbiBpcyB0byBhY3R1YWxseSBkaXNjYXJkCi0gICAgIGFsbCBidXQgb25lIG9mIHRoZSBzZWN0aW9ucy4gICovCi0gIGlmIChzdHJuY21wIChuYW1lLCAiLmdudS5saW5rb25jZSIsIHNpemVvZiAiLmdudS5saW5rb25jZSIgLSAxKSA9PSAwKQotICAgIHNlY19mbGFncyB8PSBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOwotI2VuZGlmCi0KLSAgcmV0dXJuIHNlY19mbGFnczsKLX0KLQotI2VuZGlmIC8qIENPRkZfV0lUSF9QRSAqLwotCi0jZGVmaW5lCWdldF9pbmRleChzeW1ib2wpCSgoc3ltYm9sKS0+dWRhdGEuaSkKLQotLyoKLUlOVEVSTkFMX0RFRklOSVRJT04KLQliZmRfY29mZl9iYWNrZW5kX2RhdGEKLQotQ09ERV9GUkFHTUVOVAotCi0ueyogQ09GRiBzeW1ib2wgY2xhc3NpZmljYXRpb25zLiAgKn0KLS4KLS5lbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uCi0uewotLiAgeyogR2xvYmFsIHN5bWJvbC4gICp9Ci0uICBDT0ZGX1NZTUJPTF9HTE9CQUwsCi0uICB7KiBDb21tb24gc3ltYm9sLiAgKn0KLS4gIENPRkZfU1lNQk9MX0NPTU1PTiwKLS4gIHsqIFVuZGVmaW5lZCBzeW1ib2wuICAqfQotLiAgQ09GRl9TWU1CT0xfVU5ERUZJTkVELAotLiAgeyogTG9jYWwgc3ltYm9sLiAgKn0KLS4gIENPRkZfU1lNQk9MX0xPQ0FMLAotLiAgeyogUEUgc2VjdGlvbiBzeW1ib2wuICAqfQotLiAgQ09GRl9TWU1CT0xfUEVfU0VDVElPTgotLn07Ci0uCi1TcGVjaWFsIGVudHJ5IHBvaW50cyBmb3IgZ2RiIHRvIHN3YXAgaW4gY29mZiBzeW1ib2wgdGFibGUgcGFydHM6Ci0udHlwZWRlZiBzdHJ1Y3QKLS57Ci0uICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfYXV4X2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgICAgICAgICBleHQsCi0uICAgICAgIGludCAgICAgICAgICAgICB0eXBlLAotLiAgICAgICBpbnQgICAgICAgICAgICAgY2xhc3MsCi0uICAgICAgIGludCAgICAgICAgICAgICBpbmRhdXgsCi0uICAgICAgIGludCAgICAgICAgICAgICBudW1hdXgsCi0uICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOwotLgotLiAgdm9pZCAoKl9iZmRfY29mZl9zd2FwX3N5bV9pbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgICAgICAgICphYmZkICwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7Ci0uCi0uICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfbGluZW5vX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgICAgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7Ci0uCi0KLVNwZWNpYWwgZW50cnkgcG9pbnRzIGZvciBnYXMgdG8gc3dhcCBvdXQgY29mZiBwYXJ0czoKLQotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9hdXhfb3V0KSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgCSphYmZkLAotLiAgICAgICBQVFIJaW4sCi0uICAgICAgIGludCAgICAJdHlwZSwKLS4gICAgICAgaW50ICAgIAljbGFzcywKLS4gICAgICAgaW50ICAgICBpbmRhdXgsCi0uICAgICAgIGludCAgICAgbnVtYXV4LAotLiAgICAgICBQVFIgICAgCWV4dCkpOwotLgotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9zeW1fb3V0KSBQQVJBTVMgKCgKLS4gICAgICBiZmQgICAgICAqYWJmZCwKLS4gICAgICBQVFIJaW4sCi0uICAgICAgUFRSCWV4dCkpOwotLgotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KSBQQVJBTVMgKCgKLS4gICAgICAJYmZkICAgCSphYmZkLAotLiAgICAgIAlQVFIJaW4sCi0uCVBUUglleHQpKTsKLS4KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KSBQQVJBTVMgKCgKLS4gICAgICAJYmZkICAgICAqYWJmZCwKLS4gICAgIAlQVFIJc3JjLAotLglQVFIJZHN0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KSBQQVJBTVMgKCgKLS4gICAgICAJYmZkICAJKmFiZmQsCi0uCVBUUiAJaW4sCi0uCVBUUiAJb3V0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KSBQQVJBTVMgKCgKLS4gICAgICAJYmZkIAkqYWJmZCwKLS4JUFRSIAlpbiwKLS4JUFRSCW91dCkpOwotLgotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KSBQQVJBTVMgKCgKLS4gICAgICAJYmZkICAJKmFiZmQsCi0uICAgICAgCVBUUglpbiwKLS4JUFRSCW91dCkpOwotLgotCi1TcGVjaWFsIGVudHJ5IHBvaW50cyBmb3IgZ2VuZXJpYyBDT0ZGIHJvdXRpbmVzIHRvIGNhbGwgdGFyZ2V0Ci1kZXBlbmRlbnQgQ09GRiByb3V0aW5lczoKLQotLiB1bnNpZ25lZCBpbnQgX2JmZF9maWxoc3o7Ci0uIHVuc2lnbmVkIGludCBfYmZkX2FvdXRzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfc2NuaHN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9zeW1lc3o7Ci0uIHVuc2lnbmVkIGludCBfYmZkX2F1eGVzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfcmVsc3o7Ci0uIHVuc2lnbmVkIGludCBfYmZkX2xpbmVzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfZmlsbm1sZW47Ci0uIGJvb2xlYW4gX2JmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzOwotLiBib29sZWFuIF9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXM7Ci0uIHVuc2lnbmVkIGludCBfYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcjsKLS4gdm9pZCAoKl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICBpbikpOwotLiB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgZXh0LAotLiAgICAgICBQVFIgICAgIGluKSk7Ci0uIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICBpbikpOwotLiB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICBpbikpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkcikpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkcikpOwotLiBQVFIgKCpfYmZkX2NvZmZfbWtvYmplY3RfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfZmlsZWhkciwKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9hb3V0aGRyKSk7Ci0uIGZsYWd3b3JkICgqX2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBpbnRlcm5hbF9zY25oZHIsCi0uICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0uICAgICAgIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci0uIHZvaWQgKCpfYmZkX3NldF9hbGlnbm1lbnRfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIGFzZWN0aW9uICpzZWMsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfc2NuaGRyKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0pKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0uICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgsCi0uICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3ByaW50X2F1eCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgRklMRSAqZmlsZSwKLS4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSwKLS4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXgsCi0uICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgpKTsKLS4gdm9pZCAoKl9iZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyLAotLiAgICAgICBhcmVsZW50ICpyZWxvYywKLS4gICAgICAgYmZkX2J5dGUgKmRhdGEsCi0uICAgICAgIHVuc2lnbmVkIGludCAqc3JjX3B0ciwKLS4gICAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyKSk7Ci0uIGludCAoKl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLS4gICAgICAgYXJlbGVudCAqciwKLS4gICAgICAgdW5zaWduZWQgaW50IHNocmluaywKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotLiBlbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uICgqX2JmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICpvdXRwdXRfYmZkLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLS4gICAgICAgYmZkICppbnB1dF9iZmQsCi0uICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotLiAgICAgICBiZmRfYnl0ZSAqY29udGVudHMsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zLAotLiAgICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zKSk7Ci0uIHJlbG9jX2hvd3RvX3R5cGUgKigqX2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBhc2VjdGlvbiAqc2VjLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbCwKLS4gICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0sCi0uICAgICAgIGJmZF92bWEgKmFkZGVuZHApKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4KSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICpvYmZkLAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLS4gICAgICAgYmZkICppYmZkLAotLiAgICAgICBhc2VjdGlvbiAqc2VjLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jLAotLiAgICAgICBib29sZWFuICphZGp1c3RlZHApKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKCgKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgY29uc3QgY2hhciAqbmFtZSwKLS4gICAgICAgZmxhZ3dvcmQgZmxhZ3MsIAotLiAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLS4gICAgICAgYmZkX3ZtYSB2YWx1ZSwKLS4gICAgICAgY29uc3QgY2hhciAqc3RyaW5nLAotLiAgICAgICBib29sZWFuIGNvcHksCi0uICAgICAgIGJvb2xlYW4gY29sbGVjdCwgCi0uICAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHApKTsKLS4KLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pIFBBUkFNUyAoKAotLgliZmQgKiBhYmZkLAotLiAgICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm8pKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpIFBBUkFNUyAoKAotLgliZmQgKiBhYmZkLAotLglzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm8pKTsKLS4KLS59IGJmZF9jb2ZmX2JhY2tlbmRfZGF0YTsKLS4KLS4jZGVmaW5lIGNvZmZfYmFja2VuZF9pbmZvKGFiZmQpICgoYmZkX2NvZmZfYmFja2VuZF9kYXRhICopIChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hdXhfaW4oYSxlLHQsYyxpbmQsbnVtLGkpIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9hdXhfaW4pIChhLGUsdCxjLGluZCxudW0saSkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3N5bV9pbihhLGUsaSkgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX3N5bV9pbikgKGEsZSxpKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luKGEsZSxpKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvICggYSktPl9iZmRfY29mZl9zd2FwX2xpbmVub19pbikgKGEsZSxpKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KGFiZmQsIGksIG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dChhYmZkLCBpLCBvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfbGluZW5vX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hdXhfb3V0KGEsaSx0LGMsaW5kLG51bSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfYXV4X291dCkgKGEsaSx0LGMsaW5kLG51bSxvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc3ltX291dChhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zeW1fb3V0KSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQoYWJmZCwgaSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dChhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dChhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfZmlsaHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfZmlsaHN6KQotLiNkZWZpbmUgYmZkX2NvZmZfYW91dHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYW91dHN6KQotLiNkZWZpbmUgYmZkX2NvZmZfc2NuaHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc2NuaHN6KQotLiNkZWZpbmUgYmZkX2NvZmZfc3ltZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc3ltZXN6KQotLiNkZWZpbmUgYmZkX2NvZmZfYXV4ZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYXV4ZXN6KQotLiNkZWZpbmUgYmZkX2NvZmZfcmVsc3ooYWJmZCkgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfcmVsc3opCi0uI2RlZmluZSBiZmRfY29mZl9saW5lc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9saW5lc3opCi0uI2RlZmluZSBiZmRfY29mZl9maWxubWxlbihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2ZpbG5tbGVuKQotLiNkZWZpbmUgYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMoYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzKQotLiNkZWZpbmUgYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzKGFiZmQpIFwKLS4gICAgICAgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMpCi0uI2RlZmluZSBiZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKGFiZmQpIFwKLS4JIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKQotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbihhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3Njbmhkcl9pbihhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfcmVsb2NfaW4oYWJmZCwgaSwgbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3JlbG9jX2luKSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9iYWRfZm9ybWF0X2hvb2soYWJmZCwgZmlsZWhkcikgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9iYWRfZm9ybWF0X2hvb2spIChhYmZkLCBmaWxlaGRyKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vayhhYmZkLCBmaWxlaGRyKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSAoYWJmZCwgZmlsZWhkcikpCi0uI2RlZmluZSBiZmRfY29mZl9ta29iamVjdF9ob29rKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9ta29iamVjdF9ob29rKSAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zdHlwX3RvX3NlY19mbGFnc19ob29rKGFiZmQsIHNjbmhkciwgbmFtZSwgc2VjdGlvbilcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rKVwKLS4gICAgICAgICAoYWJmZCwgc2NuaGRyLCBuYW1lLCBzZWN0aW9uKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3NldF9hbGlnbm1lbnRfaG9vayhhYmZkLCBzZWMsIHNjbmhkcilcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zZXRfYWxpZ25tZW50X2hvb2spIChhYmZkLCBzZWMsIHNjbmhkcikpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUoYWJmZClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyhhYmZkLCBzeW0pXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKSAoYWJmZCwgc3ltKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3ByaW50X2F1eChhYmZkLCBmaWxlLCBiYXNlLCBzeW1ib2wsIGF1eCwgaW5kYXV4KVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcHJpbnRfYXV4KVwKLS4gICAgICAgICAoYWJmZCwgZmlsZSwgYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eCkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKVwKLS4gICAgICAgICAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKGFiZmQsIHNlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbylcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpXAotLiAgICAgICAgIChhYmZkLCBzZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfY2xhc3NpZnlfc3ltYm9sKGFiZmQsIHN5bSlcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbClcCi0uICAgICAgICAgKGFiZmQsIHN5bSkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMoYWJmZClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucylcCi0uICAgICAgICAgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluayhvYmZkLCBpbmZvKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKG9iZmQpLT5fYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaylcCi0uICAgICAgICAgKG9iZmQsIGluZm8pKQotLiNkZWZpbmUgYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbihvYmZkLGluZm8saWJmZCxvLGNvbixyZWwsaXN5bXMsc2VjcylcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChpYmZkKS0+X2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pXAotLiAgICAgICAgIChvYmZkLCBpbmZvLCBpYmZkLCBvLCBjb24sIHJlbCwgaXN5bXMsIHNlY3MpKQotLiNkZWZpbmUgYmZkX2NvZmZfcnR5cGVfdG9faG93dG8oYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKVwKLS4gICAgICAgICAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkpCi0uI2RlZmluZSBiZmRfY29mZl9hZGp1c3Rfc3ltbmR4KG9iZmQsIGluZm8sIGliZmQsIHNlYywgcmVsLCBhZGp1c3RlZHApXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4KVwKLS4gICAgICAgICAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCByZWwsIGFkanVzdGVkcCkpCi0uI2RlZmluZSBiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKGluZm8sYWJmZCxuYW1lLGZsYWdzLHNlY3Rpb24sdmFsdWUsc3RyaW5nLGNwLGNvbGwsaGFzaHApXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKVwKLS4gICAgICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsIGNwLCBjb2xsLCBoYXNocCkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4oYSxwKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bikgKGEscCkpCi0uI2RlZmluZSBiZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQoYSxwKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCkgKGEscCkpCi0uCi0qLwotCi0vKiBTZWUgd2hldGhlciB0aGUgbWFnaWMgbnVtYmVyIG1hdGNoZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9iYWRfZm9ybWF0X2hvb2sgKGFiZmQsIGZpbGVoZHIpCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGZpbGVoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0KLSAgaWYgKEJBRE1BRyAoKmludGVybmFsX2YpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBpZiB0aGUgb3B0aW9uYWwgaGVhZGVyIGlzIE5VTEwgb3Igbm90IHRoZSBjb3JyZWN0IHNpemUgdGhlbgotICAgICBxdWl0OyB0aGUgb25seSBkaWZmZXJlbmNlIEkgY2FuIHNlZSBiZXR3ZWVuIG04OGsgZGd1eCBoZWFkZXJzIChNQzg4RE1BR0lDKQotICAgICBhbmQgSW50ZWwgOTYwIHJlYWR3cml0ZSBoZWFkZXJzIChJOTYwV1JNQUdJQykgaXMgdGhhdCB0aGUKLSAgICAgb3B0aW9uYWwgaGVhZGVyIGlzIG9mIGEgZGlmZmVyZW50IHNpemUuCi0KLSAgICAgQnV0IHRoZSBtaXBzIGtlZXBzIGV4dHJhIHN0dWZmIGluIGl0J3Mgb3B0aGRyLCBzbyBkb250IGNoZWNrCi0gICAgIHdoZW4gZG9pbmcgdGhhdAotICAgICAqLwotCi0jaWYgZGVmaW5lZChNODgpIHx8IGRlZmluZWQoSTk2MCkKLSAgaWYgKGludGVybmFsX2YtPmZfb3B0aGRyICE9IDAgJiYgQU9VVFNaICE9IGludGVybmFsX2YtPmZfb3B0aGRyKQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDaGVjayB3aGV0aGVyIHRoaXMgc2VjdGlvbiB1c2VzIGFuIGFsaWdubWVudCBvdGhlciB0aGFuIHRoZQotICAgZGVmYXVsdC4gICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3NldF9jdXN0b21fc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlY3Rpb24sIGFsaWdubWVudF90YWJsZSwgdGFibGVfc2l6ZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBjb25zdCBzdHJ1Y3QgY29mZl9zZWN0aW9uX2FsaWdubWVudF9lbnRyeSAqYWxpZ25tZW50X3RhYmxlOwotICAgICBjb25zdCB1bnNpZ25lZCBpbnQgdGFibGVfc2l6ZTsKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IGRlZmF1bHRfYWxpZ25tZW50ID0gQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgdGFibGVfc2l6ZTsgKytpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICBpZiAoYWxpZ25tZW50X3RhYmxlW2ldLmNvbXBhcmlzb25fbGVuZ3RoID09ICh1bnNpZ25lZCBpbnQpIC0xCi0JICA/IHN0cmNtcCAoYWxpZ25tZW50X3RhYmxlW2ldLm5hbWUsIHNlY25hbWUpID09IDAKLQkgIDogc3RybmNtcCAoYWxpZ25tZW50X3RhYmxlW2ldLm5hbWUsIHNlY25hbWUsCi0JCSAgICAgYWxpZ25tZW50X3RhYmxlW2ldLmNvbXBhcmlzb25fbGVuZ3RoKSA9PSAwKQotCWJyZWFrOwotICAgIH0KLSAgaWYgKGkgPj0gdGFibGVfc2l6ZSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGFsaWdubWVudF90YWJsZVtpXS5kZWZhdWx0X2FsaWdubWVudF9taW4gIT0gQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFkKLSAgICAgICYmIGRlZmF1bHRfYWxpZ25tZW50IDwgYWxpZ25tZW50X3RhYmxlW2ldLmRlZmF1bHRfYWxpZ25tZW50X21pbikKLSAgICByZXR1cm47Ci0KLSAgaWYgKGFsaWdubWVudF90YWJsZVtpXS5kZWZhdWx0X2FsaWdubWVudF9tYXggIT0gQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFkKLSAgICAgICYmIGRlZmF1bHRfYWxpZ25tZW50ID4gYWxpZ25tZW50X3RhYmxlW2ldLmRlZmF1bHRfYWxpZ25tZW50X21heCkKLSAgICByZXR1cm47Ci0KLSAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gYWxpZ25tZW50X3RhYmxlW2ldLmFsaWdubWVudF9wb3dlcjsKLX0KLQotLyogQ3VzdG9tIHNlY3Rpb24gYWxpZ25tZW50IHJlY29yZHMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfZW50cnkKLWNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfdGFibGVbXSA9Ci17Ci0jaWZkZWYgQ09GRl9TRUNUSU9OX0FMSUdOTUVOVF9FTlRSSUVTCi0gIENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUywKLSNlbmRpZgotICAvKiBUaGVyZSBtdXN0IG5vdCBiZSBhbnkgZ2FwcyBiZXR3ZWVuIC5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLSAgeyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLnN0YWJzdHIiKSwKLSAgICAxLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMCB9LAotICAvKiBUaGUgLnN0YWIgc2VjdGlvbiBtdXN0IGJlIGFsaWduZWQgdG8gMioqMiBhdCBtb3N0LCB0byBhdm9pZCBnYXBzLiAgKi8KLSAgeyBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIICgiLnN0YWIiKSwKLSAgICAzLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMiB9LAotICAvKiBTaW1pbGFybHkgZm9yIHRoZSAuY3RvcnMgYW5kIC5kdG9ycyBzZWN0aW9ucy4gICovCi0gIHsgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0ggKCIuY3RvcnMiKSwKLSAgICAzLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMiB9LAotICB7IENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIICgiLmR0b3JzIiksCi0gICAgMywgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X3RhYmxlX3NpemUgPQotICBzaXplb2YgY29mZl9zZWN0aW9uX2FsaWdubWVudF90YWJsZSAvIHNpemVvZiBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X3RhYmxlWzBdOwotCi0vKiBJbml0aWFsaXplIGEgc2VjdGlvbiBzdHJ1Y3R1cmUgd2l0aCBpbmZvcm1hdGlvbiBwZWN1bGlhciB0byB0aGlzCi0gICBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIENPRkYuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7Ci0KLSAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+dGV4dF9hbGlnbl9wb3dlciAhPSAwCi0gICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWN0aW9uKSwgIi50ZXh0IikgPT0gMCkKLSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSB4Y29mZl9kYXRhIChhYmZkKS0+dGV4dF9hbGlnbl9wb3dlcjsKLSAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5kYXRhX2FsaWduX3Bvd2VyICE9IDAKLSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pLCAiLmRhdGEiKSA9PSAwKQotICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5kYXRhX2FsaWduX3Bvd2VyOwotI2VuZGlmCi0KLSAgLyogQWxsb2NhdGUgYXV4IHJlY29yZHMgZm9yIHNlY3Rpb24gc3ltYm9scywgdG8gc3RvcmUgc2l6ZSBhbmQKLSAgICAgcmVsYXRlZCBpbmZvLgotCi0gICAgIEBAIFRoZSAxMCBpcyBhIGd1ZXNzIGF0IGEgcGxhdXNpYmxlIG1heGltdW0gbnVtYmVyIG9mIGF1eCBlbnRyaWVzCi0gICAgIChidXQgc2hvdWxkbid0IGJlIGEgY29uc3RhbnQpLiAgKi8KLSAgbmF0aXZlID0gKChjb21iaW5lZF9lbnRyeV90eXBlICopCi0JICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoY29tYmluZWRfZW50cnlfdHlwZSkgKiAxMCkpOwotICBpZiAobmF0aXZlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIGRvbid0IG5lZWQgdG8gc2V0IHVwIG5fbmFtZSwgbl92YWx1ZSwgb3Igbl9zY251bSBpbiB0aGUgbmF0aXZlCi0gICAgIHN5bWJvbCBpbmZvcm1hdGlvbiwgc2luY2UgdGhleSdsbCBiZSBvdmVycmlkZW4gYnkgdGhlIEJGRCBzeW1ib2wKLSAgICAgYW55aG93LiAgSG93ZXZlciwgd2UgZG8gbmVlZCB0byBzZXQgdGhlIHR5cGUgYW5kIHN0b3JhZ2UgY2xhc3MsCi0gICAgIGluIGNhc2UgdGhpcyBzeW1ib2wgd2luZHMgdXAgZ2V0dGluZyB3cml0dGVuIG91dC4gIFRoZSB2YWx1ZSAwCi0gICAgIGZvciBuX251bWF1eCBpcyBhbHJlYWR5IGNvcnJlY3QuICAqLwotCi0gIG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlID0gVF9OVUxMOwotICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gQ19TVEFUOwotCi0gIGNvZmZzeW1ib2wgKHNlY3Rpb24tPnN5bWJvbCktPm5hdGl2ZSA9IG5hdGl2ZTsKLQotICBjb2ZmX3NldF9jdXN0b21fc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlY3Rpb24sCi0JCQkJICAgICBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X3RhYmxlLAotCQkJCSAgICAgY29mZl9zZWN0aW9uX2FsaWdubWVudF90YWJsZV9zaXplKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIKLQotLyogU2V0IHRoZSBhbGlnbm1lbnQgb2YgYSBCRkQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotc3RhdGljIHZvaWQKLWNvZmZfc2V0X2FsaWdubWVudF9ob29rIChhYmZkLCBzZWN0aW9uLCBzY25oZHIpCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotICAgICBQVFIgc2NuaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpoZHIgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBzY25oZHI7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0jaWZkZWYgSTk2MAotICAvKiBFeHRyYWN0IEFMSUdOIGZyb20gMioqQUxJR04gc3RvcmVkIGluIHNlY3Rpb24gaGVhZGVyICovCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotICAgIGlmICgoMSA8PCBpKSA+PSBoZHItPnNfYWxpZ24pCi0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIFRJQzgwQ09GRgotICAvKiBUSSB0b29scyBoaWphY2sgYml0cyA4LTExIGZvciB0aGUgYWxpZ25tZW50ICovCi0gIGkgPSAoaGRyLT5zX2ZsYWdzID4+IDgpICYgMHhGIDsKLSNlbmRpZgotICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBpOwotfQotCi0jZWxzZSAvKiAhIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgKi8KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLQotLyogYSBjb3VwbGUgb2YgbWFjcm9zIHRvIGhlbHAgc2V0dGluZyB0aGUgYWxpZ25tZW50IHBvd2VyIGZpZWxkICovCi0jZGVmaW5lIEFMSUdOX1NFVChmaWVsZCx4LHkpIFwKLSAgaWYgKCgoZmllbGQpICYgSU1BR0VfU0NOX0FMSUdOXzY0QllURVMpID09IHggKVwKLSAge1wKLSAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geTtcCi0gIH0KLQotI2RlZmluZSBFTElGQUxJR05fU0VUKGZpZWxkLHgseSkgXAotICBlbHNlIGlmICgoIChmaWVsZCkgJiBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUykgPT0geCApIFwKLSAge1wKLSAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geTtcCi0gIH0KLQotc3RhdGljIHZvaWQgY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgdm9pZAotY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgKGFiZmQsIHNlY3Rpb24sIHNjbmhkcikKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gICAgIFBUUiBzY25oZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmhkciA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIHNjbmhkcjsKLQotICBBTElHTl9TRVQgICAgIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl82NEJZVEVTLCA2KQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8zMkJZVEVTLCA1KQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8xNkJZVEVTLCA0KQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl84QllURVMsICAzKQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl80QllURVMsICAyKQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8yQllURVMsICAxKQotICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8xQllURVMsICAwKQotCi0gIC8qIEluIGEgUEUgaW1hZ2UgZmlsZSwgdGhlIHNfcGFkZHIgZmllbGQgaG9sZHMgdGhlIHZpcnR1YWwgc2l6ZSBvZiBhCi0gICAgIHNlY3Rpb24sIHdoaWxlIHRoZSBzX3NpemUgZmllbGQgaG9sZHMgdGhlIHJhdyBzaXplLiAgV2UgYWxzbyBrZWVwCi0gICAgIHRoZSBvcmlnaW5hbCBzZWN0aW9uIGZsYWcgdmFsdWUsIHNpbmNlIG5vdCBldmVyeSBiaXQgY2FuIGJlCi0gICAgIG1hcHBlZCBvbnRvIGEgZ2VuZXJpYyBCRkQgc2VjdGlvbiBiaXQuICAqLwotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pID09IE5VTEwpCi0gICAgewotICAgICAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPQotCShQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JewotCSAgLyogRklYTUU6IFJldHVybiBlcnJvci4gICovCi0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICBpZiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbiktPnRkYXRhID0KLQkoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKS0+dGRhdGEgPT0gTlVMTCkKLQl7Ci0JICAvKiBGSVhNRTogUmV0dXJuIGVycm9yLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT52aXJ0X3NpemUgPSBoZHItPnNfcGFkZHI7Ci0gIHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT5wZV9mbGFncyA9IGhkci0+c19mbGFnczsKLQotICBzZWN0aW9uLT5sbWEgPSBoZHItPnNfdmFkZHI7Ci19Ci0jdW5kZWYgQUxJR05fU0VUCi0jdW5kZWYgRUxJRkFMSUdOX1NFVAotCi0jZWxzZSAvKiAhIENPRkZfV0lUSF9QRSAqLwotI2lmZGVmIFJTNjAwMENPRkZfQwotCi0vKiBXZSBncm9zc2x5IGFidXNlIHRoaXMgZnVuY3Rpb24gdG8gaGFuZGxlIFhDT0ZGIG92ZXJmbG93IGhlYWRlcnMuCi0gICBXaGVuIHdlIHNlZSBvbmUsIHdlIGNvcnJlY3QgdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudHMgaW4gdGhlCi0gICByZWFsIGhlYWRlciwgYW5kIHJlbW92ZSB0aGUgc2VjdGlvbiB3ZSBqdXN0IGNyZWF0ZWQuICAqLwotCi1zdGF0aWMgdm9pZCBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLXN0YXRpYyB2b2lkCi1jb2ZmX3NldF9hbGlnbm1lbnRfaG9vayAoYWJmZCwgc2VjdGlvbiwgc2NuaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgc2NuaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpoZHIgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBzY25oZHI7Ci0gIGFzZWN0aW9uICpyZWFsX3NlYzsKLSAgYXNlY3Rpb24gKipwczsKLQotICBpZiAoKGhkci0+c19mbGFncyAmIFNUWVBfT1ZSRkxPKSA9PSAwKQotICAgIHJldHVybjsKLQotICByZWFsX3NlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgaGRyLT5zX25yZWxvYyk7Ci0gIGlmIChyZWFsX3NlYyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICByZWFsX3NlYy0+cmVsb2NfY291bnQgPSBoZHItPnNfcGFkZHI7Ci0gIHJlYWxfc2VjLT5saW5lbm9fY291bnQgPSBoZHItPnNfdmFkZHI7Ci0KLSAgZm9yIChwcyA9ICZhYmZkLT5zZWN0aW9uczsgKnBzICE9IE5VTEw7IHBzID0gJigqcHMpLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgqcHMgPT0gc2VjdGlvbikKLQl7Ci0JICAqcHMgPSAoKnBzKS0+bmV4dDsKLQkgIC0tYWJmZC0+c2VjdGlvbl9jb3VudDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLSNlbHNlIC8qICEgUlM2MDAwQ09GRl9DICovCi0KLSNkZWZpbmUgY29mZl9zZXRfYWxpZ25tZW50X2hvb2sgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKSkgYmZkX3ZvaWQpCi0KLSNlbmRpZiAvKiAhIFJTNjAwMENPRkZfQyAqLwotI2VuZGlmIC8qICEgQ09GRl9XSVRIX1BFICovCi0jZW5kaWYgLyogISBDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSICovCi0KLSNpZm5kZWYgY29mZl9ta29iamVjdAotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICBjb2ZmX2RhdGFfdHlwZSAqY29mZjsKLQotICBhYmZkLT50ZGF0YS5jb2ZmX29ial9kYXRhID0gKHN0cnVjdCBjb2ZmX3RkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoY29mZl9kYXRhX3R5cGUpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmNvZmZfb2JqX2RhdGEgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGNvZmYgPSBjb2ZmX2RhdGEgKGFiZmQpOwotICBjb2ZmLT5zeW1ib2xzID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgY29mZi0+Y29udmVyc2lvbl90YWJsZSA9ICh1bnNpZ25lZCBpbnQgKikgTlVMTDsKLSAgY29mZi0+cmF3X3N5bWVudHMgPSAoc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqKSBOVUxMOwotICBjb2ZmLT5yZWxvY2Jhc2UgPSAwOwotICBjb2ZmLT5sb2NhbF90b2Nfc3ltX21hcCA9IDA7Ci0KLS8qICBtYWtlX2Fic19zZWN0aW9uKGFiZmQpOyovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYKLQotLyogQ3JlYXRlIHRoZSBDT0ZGIGJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotI2lmbmRlZiBjb2ZmX21rb2JqZWN0X2hvb2sKLXN0YXRpYyBQVFIKLWNvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci0gICAgIFBUUiBhb3V0aGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIGNvZmZfZGF0YV90eXBlICpjb2ZmOwotCi0gIGlmIChjb2ZmX21rb2JqZWN0IChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb2ZmID0gY29mZl9kYXRhIChhYmZkKTsKLQotICBjb2ZmLT5zeW1fZmlsZXBvcyA9IGludGVybmFsX2YtPmZfc3ltcHRyOwotCi0gIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sCi0gICAgIHRhYmxlIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJwotICAgICB1bmZvcnR1bmF0ZWx5IHZhcnkgYW1vbmcgY29mZiBpbXBsZW1lbnRhdGlvbnMuLi4gICovCi0gIGNvZmYtPmxvY2FsX25fYnRtYXNrID0gTl9CVE1BU0s7Ci0gIGNvZmYtPmxvY2FsX25fYnRzaGZ0ID0gTl9CVFNIRlQ7Ci0gIGNvZmYtPmxvY2FsX25fdG1hc2sgPSBOX1RNQVNLOwotICBjb2ZmLT5sb2NhbF9uX3RzaGlmdCA9IE5fVFNISUZUOwotICBjb2ZmLT5sb2NhbF9zeW1lc3ogPSBTWU1FU1o7Ci0gIGNvZmYtPmxvY2FsX2F1eGVzeiA9IEFVWEVTWjsKLSAgY29mZi0+bG9jYWxfbGluZXN6ID0gTElORVNaOwotCi0gIGNvZmYtPnRpbWVzdGFtcCA9IGludGVybmFsX2YtPmZfdGltZGF0OwotCi0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9Ci0gICAgb2JqX2NvbnZfdGFibGVfc2l6ZSAoYWJmZCkgPQotICAgICAgaW50ZXJuYWxfZi0+Zl9uc3ltczsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBpZiAoKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX1NIUk9CSikgIT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotICBpZiAoYW91dGhkciAhPSBOVUxMICYmIGludGVybmFsX2YtPmZfb3B0aGRyID49IEFPVVRTWikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqaW50ZXJuYWxfYSA9Ci0JKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIGFvdXRoZHI7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKnhjb2ZmOwotCi0gICAgICB4Y29mZiA9IHhjb2ZmX2RhdGEgKGFiZmQpOwotICAgICAgeGNvZmYtPmZ1bGxfYW91dGhkciA9IHRydWU7Ci0gICAgICB4Y29mZi0+dG9jID0gaW50ZXJuYWxfYS0+b190b2M7Ci0gICAgICB4Y29mZi0+c250b2MgPSBpbnRlcm5hbF9hLT5vX3NudG9jOwotICAgICAgeGNvZmYtPnNuZW50cnkgPSBpbnRlcm5hbF9hLT5vX3NuZW50cnk7Ci0gICAgICB4Y29mZi0+dGV4dF9hbGlnbl9wb3dlciA9IGludGVybmFsX2EtPm9fYWxnbnRleHQ7Ci0gICAgICB4Y29mZi0+ZGF0YV9hbGlnbl9wb3dlciA9IGludGVybmFsX2EtPm9fYWxnbmRhdGE7Ci0gICAgICB4Y29mZi0+bW9kdHlwZSA9IGludGVybmFsX2EtPm9fbW9kdHlwZTsKLSAgICAgIHhjb2ZmLT5jcHV0eXBlID0gaW50ZXJuYWxfYS0+b19jcHV0eXBlOwotICAgICAgeGNvZmYtPm1heGRhdGEgPSBpbnRlcm5hbF9hLT5vX21heGRhdGE7Ci0gICAgICB4Y29mZi0+bWF4c3RhY2sgPSBpbnRlcm5hbF9hLT5vX21heHN0YWNrOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQVJNIAotICAvKiBTZXQgdGhlIGZsYWdzIGZpZWxkIGZyb20gdGhlIENPRkYgaGVhZGVyIHJlYWQgaW4gKi8KLSAgaWYgKCEgX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgaW50ZXJuYWxfZi0+Zl9mbGFncykpCi0gICAgY29mZi0+ZmxhZ3MgPSAwOwotI2VuZGlmCi0gIAotI2lmZGVmIENPRkZfV0lUSF9QRQotICAvKiBGSVhNRTogSSdtIG5vdCBzdXJlIHRoaXMgaXMgZXZlciBleGVjdXRlZCwgc2luY2UgcGVpY29kZS5oCi0gICAgIGRlZmluZXMgY29mZl9ta29iamVjdF9ob29rLiAgKi8KLSAgaWYgKChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCkgPT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfREVCVUc7Ci0jZW5kaWYKLQotICByZXR1cm4gKFBUUikgY29mZjsKLX0KLSNlbmRpZgotCi0vKiBEZXRlcm1pbmUgdGhlIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIGFuZCB0eXBlLiAgRklYTUU6IFRoaXMgaXMgdGFyZ2V0Ci0gICBkZXBlbmRlbnQgYmVjYXVzZSB0aGUgbWFnaWMgbnVtYmVycyBhcmUgZGVmaW5lZCBpbiB0aGUgdGFyZ2V0Ci0gICBkZXBlbmRlbnQgaGVhZGVyIGZpbGVzLiAgQnV0IHRoZXJlIGlzIG5vIHBhcnRpY3VsYXIgbmVlZCBmb3IgdGhpcy4KLSAgIElmIHRoZSBtYWdpYyBudW1iZXJzIHdlcmUgbW92ZWQgdG8gYSBzZXBhcmF0ZSBmaWxlLCB0aGlzIGZ1bmN0aW9uCi0gICB3b3VsZCBiZSB0YXJnZXQgaW5kZXBlbmRlbnQgYW5kIHdvdWxkIGFsc28gYmUgbXVjaCBtb3JlIHN1Y2Nlc3NmdWwKLSAgIGF0IGxpbmtpbmcgdG9nZXRoZXIgQ09GRiBmaWxlcyBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgKGFiZmQsIGZpbGVoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci17Ci0gIGxvbmcgbWFjaGluZTsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0KLSAgbWFjaGluZSA9IDA7Ci0gIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9tYWdpYykKLSAgICB7Ci0jaWZkZWYgUFBDTUFHSUMKLSAgICBjYXNlIFBQQ01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0gICAgICBtYWNoaW5lID0gMDsgLyogd2hhdCBkb2VzIHRoaXMgbWVhbj8gKGtyaykgKi8KLSAgICAgIGJyZWFrOyAKLSNlbmRpZgotI2lmZGVmIEkzODZNQUdJQwotICAgIGNhc2UgSTM4Nk1BR0lDOgotICAgIGNhc2UgSTM4NlBUWE1BR0lDOgotICAgIGNhc2UgSTM4NkFJWE1BR0lDOgkJLyogRGFuYnVyeSBQUy8yIEFJWCBDIENvbXBpbGVyICovCi0gICAgY2FzZSBMWU5YQ09GRk1BR0lDOgkvKiBzaGFkb3dzIHRoZSBtNjhrIEx5bnggbnVtYmVyIGJlbG93LCBzaWdoICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfaTM4NjsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBMjlLX01BR0lDX0JJRwotICAgIGNhc2UgQTI5S19NQUdJQ19CSUc6Ci0gICAgY2FzZSBBMjlLX01BR0lDX0xJVFRMRToKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9hMjlrOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSTU1BR0lDCi0gICAgY2FzZSBBUk1NQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9hcm07Ci0gICAgICBzd2l0Y2ggKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0FSTV9BUkNISVRFQ1RVUkVfTUFTSykKLQl7Ci0gICAgICAgIGNhc2UgRl9BUk1fMjogIG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fMjsgIGJyZWFrOwotICAgICAgICBjYXNlIEZfQVJNXzJhOiBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzJhOyBicmVhazsKLSAgICAgICAgY2FzZSBGX0FSTV8zOiAgbWFjaGluZSA9IGJmZF9tYWNoX2FybV8zOyAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNhc2UgRl9BUk1fM006IG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fM007IGJyZWFrOwotICAgICAgICBjYXNlIEZfQVJNXzQ6ICBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzQ7ICBicmVhazsKLSAgICAgICAgY2FzZSBGX0FSTV80VDogbWFjaGluZSA9IGJmZF9tYWNoX2FybV80VDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgRl9BUk1fNTogIG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fNTsgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTUM2OE1BR0lDCi0gICAgY2FzZSBNQzY4TUFHSUM6Ci0gICAgY2FzZSBNNjhNQUdJQzoKLSNpZmRlZiBNQzY4S0JDU01BR0lDCi0gICAgY2FzZSBNQzY4S0JDU01BR0lDOgotI2VuZGlmCi0jaWZkZWYgQVBPTExPTTY4S01BR0lDCi0gICAgY2FzZSBBUE9MTE9NNjhLTUFHSUM6Ci0jZW5kaWYKLSNpZmRlZiBMWU5YQ09GRk1BR0lDCi0gICAgY2FzZSBMWU5YQ09GRk1BR0lDOgotI2VuZGlmCi0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMjA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIE1DODhNQUdJQwotICAgIGNhc2UgTUM4OE1BR0lDOgotICAgIGNhc2UgTUM4OERNQUdJQzoKLSAgICBjYXNlIE1DODhPTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTg4azsKLSAgICAgIG1hY2hpbmUgPSA4ODEwMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgWjhLTUFHSUMKLSAgICBjYXNlIFo4S01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3o4azsKLSAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfTUFDSE1BU0spCi0JewotCWNhc2UgRl9aODAwMToKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF96ODAwMTsKLQkgIGJyZWFrOwotCWNhc2UgRl9aODAwMjoKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF96ODAwMjsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBJODYwCi0gICAgY2FzZSBJODYwTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaTg2MDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgSTk2MAotI2lmZGVmIEk5NjBST01BR0lDCi0gICAgY2FzZSBJOTYwUk9NQUdJQzoKLSAgICBjYXNlIEk5NjBSV01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2k5NjA7Ci0gICAgICBzd2l0Y2ggKEZfSTk2MFRZUEUgJiBpbnRlcm5hbF9mLT5mX2ZsYWdzKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgRl9JOTYwQ09SRToKLQkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NvcmU7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2MEtCOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Jfc2I7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2ME1DOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfbWM7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2MFhBOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfeGE7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2MENBOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY2E7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2MEtBOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Ffc2E7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2MEpYOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfang7Ci0JICBicmVhazsKLQljYXNlIEZfSTk2MEhYOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfaHg7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgICBjYXNlIFU4MDJST01BR0lDOgotICAgIGNhc2UgVTgwMldSTUFHSUM6Ci0gICAgY2FzZSBVODAyVE9DTUFHSUM6Ci0gICAgICB7Ci0JaW50IGNwdXR5cGU7Ci0KLQlpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmNwdXR5cGUgIT0gLTEpCi0JICBjcHV0eXBlID0geGNvZmZfZGF0YSAoYWJmZCktPmNwdXR5cGUgJiAweGZmOwotCWVsc2UKLQkgIHsKLQkgICAgLyogV2UgZGlkIG5vdCBnZXQgYSB2YWx1ZSBmcm9tIHRoZSBhLm91dCBoZWFkZXIuICBJZiB0aGUKLQkgICAgICAgZmlsZSBoYXMgbm90IGJlZW4gc3RyaXBwZWQsIHdlIG1heSBiZSBhYmxlIHRvIGdldCB0aGUKLQkgICAgICAgYXJjaGl0ZWN0dXJlIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpcnN0IHN5bWJvbCwgaWYgaXQKLQkgICAgICAgaXMgYSAuZmlsZSBzeW1ib2wuICAqLwotCSAgICBpZiAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID09IDApCi0JICAgICAgY3B1dHlwZSA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWJmZF9ieXRlIGJ1ZltTWU1FU1pdOwotCQlzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLQotCQlpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwCi0JCSAgICB8fCBiZmRfcmVhZCAoYnVmLCAxLCBTWU1FU1osIGFiZmQpICE9IFNZTUVTWikKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWNvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGJ1ZiwgKFBUUikgJnN5bSk7Ci0JCWlmIChzeW0ubl9zY2xhc3MgPT0gQ19GSUxFKQotCQkgIGNwdXR5cGUgPSBzeW0ubl90eXBlICYgMHhmZjsKLQkJZWxzZQotCQkgIGNwdXR5cGUgPSAwOwotCSAgICAgIH0KLQkgIH0KLQotCS8qIEZJWE1FOiBXZSBkb24ndCBoYW5kbGUgYWxsIGNhc2VzIGhlcmUuICAqLwotCXN3aXRjaCAoY3B1dHlwZSkKLQkgIHsKLQkgIGRlZmF1bHQ6Ci0JICBjYXNlIDA6Ci0jaWZkZWYgUE9XRVJNQUMKLQkgICAgLyogUG93ZXJQQyBNYWNzIHVzZSB0aGUgc2FtZSBtYWdpYyBudW1iZXJzIGFzIFJTLzYwMDAKLQkgICAgICAgKGJlY2F1c2UgdGhhdCdzIGhvdyB0aGV5IHdlcmUgYm9vdHN0cmFwcGVkIG9yaWdpbmFsbHkpLAotCSAgICAgICBidXQgdGhleSBhcmUgYWx3YXlzIFBvd2VyUEMgYXJjaGl0ZWN0dXJlLiAgKi8KLQkgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0JICAgIG1hY2hpbmUgPSAwOwotI2Vsc2UKLQkgICAgYXJjaCA9IGJmZF9hcmNoX3JzNjAwMDsKLQkgICAgbWFjaGluZSA9IDYwMDA7Ci0jZW5kaWYgLyogUE9XRVJNQUMgKi8KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMToKLQkgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0JICAgIG1hY2hpbmUgPSA2MDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOiAvKiA2NCBiaXQgUG93ZXJQQyAqLwotCSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQkgICAgbWFjaGluZSA9IDYyMDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDM6Ci0JICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOwotCSAgICBtYWNoaW5lID0gMDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIGFyY2ggPSBiZmRfYXJjaF9yczYwMDA7Ci0JICAgIG1hY2hpbmUgPSA2MDAwOwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBXRTMyS01BR0lDCi0gICAgY2FzZSBXRTMyS01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3dlMzJrOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgSDgzMDBNQUdJQwotICAgIGNhc2UgSDgzMDBNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9oODMwMDsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9oODMwMDsKLSAgICAgIC8qICEhIEZJWE1FIHRoaXMgcHJvYmFibHkgaXNuJ3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzICovCi0gICAgICBhYmZkLT5mbGFncyB8PSBCRkRfSVNfUkVMQVhBQkxFOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIEg4MzAwSE1BR0lDCi0gICAgY2FzZSBIODMwMEhNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9oODMwMDsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9oODMwMGg7Ci0gICAgICAvKiAhISBGSVhNRSB0aGlzIHByb2JhYmx5IGlzbid0IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyAqLwotICAgICAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lTX1JFTEFYQUJMRTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODMwMFNNQUdJQwotICAgIGNhc2UgSDgzMDBTTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaDgzMDA7Ci0gICAgICBtYWNoaW5lID0gYmZkX21hY2hfaDgzMDBzOwotICAgICAgLyogISEgRklYTUUgdGhpcyBwcm9iYWJseSBpc24ndCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgKi8KLSAgICAgIGFiZmQtPmZsYWdzIHw9IEJGRF9JU19SRUxBWEFCTEU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgU0hfQVJDSF9NQUdJQ19CSUcKLSAgICBjYXNlIFNIX0FSQ0hfTUFHSUNfQklHOgotICAgIGNhc2UgU0hfQVJDSF9NQUdJQ19MSVRUTEU6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfc2g7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODUwME1BR0lDCi0gICAgY2FzZSBIODUwME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4NTAwOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgU1BBUkNNQUdJQwotICAgIGNhc2UgU1BBUkNNQUdJQzoKLSNpZmRlZiBMWU5YQ09GRk1BR0lDCi0gICAgY2FzZSBMWU5YQ09GRk1BR0lDOgotI2VuZGlmCi0gICAgICBhcmNoID0gYmZkX2FyY2hfc3BhcmM7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBUSUMzME1BR0lDCi0gICAgY2FzZSBUSUMzME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3RpYzMwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFRJQzgwX0FSQ0hfTUFHSUMKLSAgICBjYXNlIFRJQzgwX0FSQ0hfTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfdGljODA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgTUNPUkVNQUdJQwotICAgIGNhc2UgTUNPUkVNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tY29yZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoJCQkvKiBVbnJlYWRhYmxlIGlucHV0IGZpbGUgdHlwZSAqLwotICAgICAgYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgU1lNTkFNRV9JTl9ERUJVRwotCi1zdGF0aWMgYm9vbGVhbiBzeW1uYW1lX2luX2RlYnVnX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotc3ltbmFtZV9pbl9kZWJ1Z19ob29rIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotewotICByZXR1cm4gU1lNTkFNRV9JTl9ERUJVRyAoc3ltKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotI2Vsc2UKLQotI2RlZmluZSBzeW1uYW1lX2luX2RlYnVnX2hvb2sgXAotICAoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpKSBiZmRfZmFsc2UKLQotI2VuZGlmCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQotLyogSGFuZGxlIHRoZSBjc2VjdCBhdXhlbnQgb2YgYSBDX0VYVCBvciBDX0hJREVYVCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sKLSAgUEFSQU1TICgoYmZkICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAotCSAgIHVuc2lnbmVkIGludCwgY29tYmluZWRfZW50cnlfdHlwZSAqKSk7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAoYWJmZCwgdGFibGVfYmFzZSwgc3ltYm9sLCBpbmRhdXgsIGF1eCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2U7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4OwotewotICBpbnQgY2xhc3MgPSBzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzOwotCi0gIGlmICgoY2xhc3MgPT0gQ19FWFQgfHwgY2xhc3MgPT0gQ19ISURFWFQpCi0gICAgICAmJiBpbmRhdXggKyAxID09IHN5bWJvbC0+dS5zeW1lbnQubl9udW1hdXgpCi0gICAgewotICAgICAgaWYgKFNNVFlQX1NNVFlQIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCkgPT0gWFRZX0xEKQotCXsKLQkgIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5wID0KLQkgICAgdGFibGVfYmFzZSArIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sOwotCSAgYXV4LT5maXhfc2NubGVuID0gMTsKLQl9Ci0KLSAgICAgIC8qIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGNhbGxlciBzaG91bGQgbm90IGRvIGFueQotICAgICAgICAgZnVydGhlciB3b3JrIG9uIHRoaXMgYXV4ZW50LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGF1eGVudCBzaG91bGQgYmUgaGFuZGxlZCBieQotICAgICB0aGUgY2FsbGVyLiAgKi8KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0jZWxzZQotI2lmZGVmIEk5NjAKLQotLyogV2UgZG9uJ3Qgd2FudCB0byBwb2ludGVyaXplIGJhbCBlbnRyaWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY29mZl9wb2ludGVyaXplX2F1eF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwKLQkgICB1bnNpZ25lZCBpbnQsIGNvbWJpbmVkX2VudHJ5X3R5cGUgKikpOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sgKGFiZmQsIHRhYmxlX2Jhc2UsIHN5bWJvbCwgaW5kYXV4LCBhdXgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIFJldHVybiB0cnVlIGlmIHdlIGRvbid0IHdhbnQgdG8gcG9pbnRlcml6ZSB0aGlzIGF1eCBlbnRyeSwgd2hpY2gKLSAgICAgaXMgdGhlIGNhc2UgZm9yIHRoZSBsYXN0Zmlyc3QgYXV4IGVudHJ5IGZvciBhIENfTEVBRlBST0Mgc3ltYm9sLiAgKi8KLSAgcmV0dXJuIChpbmRhdXggPT0gMQotCSAgJiYgKHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGUFJPQwotCSAgICAgIHx8IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGU1RBVAotCSAgICAgIHx8IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGRVhUKSk7Ci19Ci0KLSNlbHNlIC8qICEgSTk2MCAqLwotCi0jZGVmaW5lIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAwCi0KLSNlbmRpZiAvKiAhIEk5NjAgKi8KLSNlbmRpZiAvKiAhIFJTNjAwMENPRkZfQyAqLwotCi0vKiBQcmludCBhbiBhdXggZW50cnkuICBUaGlzIHJldHVybnMgdHJ1ZSBpZiBpdCBoYXMgcHJpbnRlZCBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfcHJpbnRfYXV4Ci0gIFBBUkFNUyAoKGJmZCAqLCBGSUxFICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAotCSAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgdW5zaWduZWQgaW50KSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3ByaW50X2F1eCAoYWJmZCwgZmlsZSwgdGFibGVfYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEZJTEUgKmZpbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRhdXggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKChzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRVhUCi0gICAgICAgfHwgc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0hJREVYVCkKLSAgICAgICYmIGluZGF1eCArIDEgPT0gc3ltYm9sLT51LnN5bWVudC5uX251bWF1eCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgY3NlY3QgZW50cnkuICAqLwotICAgICAgZnByaW50ZiAoZmlsZSwgIkFVWCAiKTsKLSAgICAgIGlmIChTTVRZUF9TTVRZUCAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc210eXApICE9IFhUWV9MRCkKLQl7Ci0JICBCRkRfQVNTRVJUICghIGF1eC0+Zml4X3Njbmxlbik7Ci0JICBmcHJpbnRmIChmaWxlLCAidmFsICU1bGQiLCBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ubCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKGZpbGUsICJpbmR4ICIpOwotCSAgaWYgKCEgYXV4LT5maXhfc2NubGVuKQotCSAgICBmcHJpbnRmIChmaWxlLCAiJTRsZCIsIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sKTsKLQkgIGVsc2UKLQkgICAgZnByaW50ZiAoZmlsZSwgIiU0bGQiLAotCQkgICAgIChsb25nKSAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLnAgLSB0YWJsZV9iYXNlKSk7Ci0JfQotICAgICAgZnByaW50ZiAoZmlsZSwKLQkgICAgICAgIiBwcm1oc2ggJWxkIHNuaHNoICV1IHR5cCAlZCBhbGduICVkIGNsc3MgJXUgc3RiICVsZCBzbnN0YiAldSIsCi0JICAgICAgIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Bhcm1oYXNoLAotCSAgICAgICAodW5zaWduZWQgaW50KSBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbmhhc2gsCi0JICAgICAgIFNNVFlQX1NNVFlQIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCksCi0JICAgICAgIFNNVFlQX0FMSUdOIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCksCi0JICAgICAgICh1bnNpZ25lZCBpbnQpIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3NtY2xhcywKLQkgICAgICAgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc3RhYiwKLQkgICAgICAgKHVuc2lnbmVkIGludCkgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc25zdGFiKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFJldHVybiBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IG5vIHNwZWNpYWwgYWN0aW9uIHdhcyB0YWtlbi4gICovCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoKLVNVQlNVQlNFQ1RJT04KLQlXcml0aW5nIHJlbG9jYXRpb25zCi0KLQlUbyB3cml0ZSByZWxvY2F0aW9ucywgdGhlIGJhY2sgZW5kIHN0ZXBzIHRob3VnaCB0aGUKLQljYW5vbmljYWwgcmVsb2NhdGlvbiB0YWJsZSBhbmQgY3JlYXRlIGFuCi0JQGNvZGV7aW50ZXJuYWxfcmVsb2N9LiBUaGUgc3ltYm9sIGluZGV4IHRvIHVzZSBpcyByZW1vdmVkIGZyb20KLQl0aGUgQGNvZGV7b2Zmc2V0fSBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlIHN1cHBsaWVkLiAgVGhlCi0JYWRkcmVzcyBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBzdW0gb2YgdGhlIHNlY3Rpb24gYmFzZQotCWFkZHJlc3MgYW5kIHRoZSByZWxvY2F0aW9uIG9mZnNldDsgdGhlIHR5cGUgaXMgZHVnIGRpcmVjdGx5Ci0JZnJvbSB0aGUgaG93dG8gZmllbGQuICBUaGVuIHRoZSBAY29kZXtpbnRlcm5hbF9yZWxvY30gaXMKLQlzd2FwcGVkIGludG8gdGhlIHNoYXBlIG9mIGFuIEBjb2Rle2V4dGVybmFsX3JlbG9jfSBhbmQgd3JpdHRlbgotCW91dCB0byBkaXNrLgotCi0qLwotCi0jaWZkZWYgVEFSR19BVVgKLQotc3RhdGljIGludCBjb21wYXJlX2FyZWxlbnRfcHRyIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLS8qIEFVWCdzIGxkIHdhbnRzIHJlbG9jYXRpb25zIHRvIGJlIHNvcnRlZCAqLwotc3RhdGljIGludAotY29tcGFyZV9hcmVsZW50X3B0ciAoeCwgeSkKLSAgICAgY29uc3QgUFRSIHg7Ci0gICAgIGNvbnN0IFBUUiB5OwotewotICBjb25zdCBhcmVsZW50ICoqYSA9IChjb25zdCBhcmVsZW50ICoqKSB4OwotICBjb25zdCBhcmVsZW50ICoqYiA9IChjb25zdCBhcmVsZW50ICoqKSB5OwotICBiZmRfc2l6ZV90eXBlIGFhZHIgPSAoKmEpLT5hZGRyZXNzOwotICBiZmRfc2l6ZV90eXBlIGJhZHIgPSAoKmIpLT5hZGRyZXNzOwotCi0gIHJldHVybiAoYWFkciA8IGJhZHIgPyAtMSA6IGJhZHIgPCBhYWRyID8gMSA6IDApOwotfQotCi0jZW5kaWYgLyogVEFSR19BVVggKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfd3JpdGVfcmVsb2NzIChhYmZkLCBmaXJzdF91bmRlZikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgaW50IGZpcnN0X3VuZGVmOwotewotICBhc2VjdGlvbiAqczsKLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgZHN0OwotICAgICAgYXJlbGVudCAqKnA7Ci0KLSNpZm5kZWYgVEFSR19BVVgKLSAgICAgIHAgPSBzLT5vcmVsb2NhdGlvbjsKLSNlbHNlCi0gICAgICAvKiBzb3J0IHJlbG9jYXRpb25zIGJlZm9yZSB3ZSB3cml0ZSB0aGVtIG91dCAqLwotICAgICAgcCA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChzLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gICAgICBpZiAocCA9PSBOVUxMICYmIHMtPnJlbG9jX2NvdW50ID4gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBtZW1jcHkgKHAsIHMtPm9yZWxvY2F0aW9uLCBzLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gICAgICBxc29ydCAocCwgcy0+cmVsb2NfY291bnQsIHNpemVvZiAoYXJlbGVudCAqKSwgY29tcGFyZV9hcmVsZW50X3B0cik7Ci0jZW5kaWYKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnJlbG9jX2NvdW50OyBpKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3JlbG9jIG47Ci0JICBhcmVsZW50ICpxID0gcFtpXTsKLQkgIG1lbXNldCAoKFBUUikgJiBuLCAwLCBzaXplb2YgKG4pKTsKLQotCSAgLyogTm93IHdlJ3ZlIHJlbnVtYmVyZWQgdGhlIHN5bWJvbHMgd2Uga25vdyB3aGVyZSB0aGUKLQkgICAgIHVuZGVmaW5lZCBzeW1ib2xzIGxpdmUgaW4gdGhlIHRhYmxlLiAgQ2hlY2sgdGhlIHJlbG9jCi0JICAgICBlbnRyaWVzIGZvciBzeW1ib2xzIHdobydzIG91dHB1dCBiZmQgaXNuJ3QgdGhlIHJpZ2h0IG9uZS4KLQkgICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQgKHdoaWNoIG1lYW5zCi0JICAgICB0aGF0IGFsbCB0aGUgcG9pbnRlcnMgYXJlIG5ldmVyIG1hZGUgdG8gcG9pbnQgdG8gdGhlIHNhbWUKLQkgICAgIHBsYWNlKS4gVGhpcyBpcyBhIGJhZCB0aGluZywnY2F1c2UgdGhlIHN5bWJvbHMgYXR0YWNoZWQKLQkgICAgIHRvIHRoZSBvdXRwdXQgYmZkIGFyZSBpbmRleGVkLCBzbyB0aGF0IHRoZSByZWxvY2F0aW9uCi0JICAgICBlbnRyaWVzIGtub3cgd2hpY2ggc3ltYm9sIGluZGV4IHRoZXkgcG9pbnQgdG8uICBTbyB3ZQotCSAgICAgaGF2ZSB0byBsb29rIHVwIHRoZSBvdXRwdXQgc3ltYm9sIGhlcmUuICovCi0KLQkgIGlmIChxLT5zeW1fcHRyX3B0clswXS0+dGhlX2JmZCAhPSBhYmZkKQotCSAgICB7Ci0JICAgICAgaW50IGk7Ci0JICAgICAgY29uc3QgY2hhciAqc25hbWUgPSBxLT5zeW1fcHRyX3B0clswXS0+bmFtZTsKLQkgICAgICBhc3ltYm9sICoqb3V0c3ltcyA9IGFiZmQtPm91dHN5bWJvbHM7Ci0JICAgICAgZm9yIChpID0gZmlyc3RfdW5kZWY7IG91dHN5bXNbaV07IGkrKykKLQkJewotCQkgIGNvbnN0IGNoYXIgKmludGFibGUgPSBvdXRzeW1zW2ldLT5uYW1lOwotCQkgIGlmIChzdHJjbXAgKGludGFibGUsIHNuYW1lKSA9PSAwKSB7Ci0JCSAgICAvKiBnb3QgYSBoaXQsIHNvIHJlcG9pbnQgdGhlIHJlbG9jICovCi0JCSAgICBxLT5zeW1fcHRyX3B0ciA9IG91dHN5bXMgKyBpOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQl9Ci0JICAgIH0KLQotCSAgbi5yX3ZhZGRyID0gcS0+YWRkcmVzcyArIHMtPnZtYTsKLQotI2lmZGVmIFJfSUhDT05TVAotCSAgLyogVGhlIDI5ayBjb25zdC9jb25zdGggcmVsb2MgcGFpciBpcyBhIHJlYWwga2x1ZGdlLiAgVGhlIGNvbnN0aAotCSAgICAgcGFydCBkb2Vzbid0IGhhdmUgYSBzeW1ib2w7IGl0IGhhcyBhbiBvZmZzZXQuICBTbyByZWJ1aWx0Ci0JICAgICB0aGF0IGhlcmUuICAqLwotCSAgaWYgKHEtPmhvd3RvLT50eXBlID09IFJfSUhDT05TVCkKLQkgICAgbi5yX3N5bW5keCA9IHEtPmFkZGVuZDsKLQkgIGVsc2UKLSNlbmRpZgotCSAgICBpZiAocS0+c3ltX3B0cl9wdHIpCi0JICAgICAgewotCQlpZiAocS0+c3ltX3B0cl9wdHIgPT0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHIpCi0JCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGFic29sdXRlIHN5bWJvbC4gICovCi0JCSAgbi5yX3N5bW5keCA9IC0xOwotCQllbHNlCi0JCSAgewotCQkgICAgbi5yX3N5bW5keCA9IGdldF9pbmRleCAoKCoocS0+c3ltX3B0cl9wdHIpKSk7Ci0JCSAgICAvKiBUYWtlIG5vdGljZSBpZiB0aGUgc3ltYm9sIHJlbG9jIHBvaW50cyB0byBhIHN5bWJvbAotCQkgICAgICAgd2UgZG9uJ3QgaGF2ZSBpbiBvdXIgc3ltYm9sIHRhYmxlLiAgV2hhdCBzaG91bGQgd2UKLQkJICAgICAgIGRvIGZvciB0aGlzPz8gICovCi0JCSAgICBpZiAobi5yX3N5bW5keCA+IG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpKQotCQkgICAgICBhYm9ydCAoKTsKLQkJICB9Ci0JICAgICAgfQotCi0jaWZkZWYgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUCi0JICBuLnJfb2Zmc2V0ID0gcS0+YWRkZW5kOwotI2VuZGlmCi0KLSNpZmRlZiBTRUxFQ1RfUkVMT0MKLQkgIC8qIFdvcmsgb3V0IHJlbG9jIHR5cGUgZnJvbSB3aGF0IGlzIHJlcXVpcmVkICovCi0JICBTRUxFQ1RfUkVMT0MgKG4sIHEtPmhvd3RvKTsKLSNlbHNlCi0JICBuLnJfdHlwZSA9IHEtPmhvd3RvLT50eXBlOwotI2VuZGlmCi0JICBjb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmbiwgJmRzdCk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIGRzdCwgMSwgUkVMU1osIGFiZmQpICE9IFJFTFNaKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0jaWZkZWYgVEFSR19BVVgKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JZnJlZSAocCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCBmbGFncyBhbmQgbWFnaWMgbnVtYmVyIG9mIGEgY29mZiBmaWxlIGZyb20gYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lCi0gICB0eXBlLiAgUmVzdWx0IGlzIHRydWUgaWYgd2UgY2FuIHJlcHJlc2VudCB0aGUgYXJjaCZ0eXBlLCBmYWxzZSBpZiBub3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zZXRfZmxhZ3MgKGFiZmQsIG1hZ2ljcCwgZmxhZ3NwKQotICAgICBiZmQgKiBhYmZkOwotICAgICB1bnNpZ25lZCBpbnQgKm1hZ2ljcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBzaG9ydCAqZmxhZ3NwIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0jaWZkZWYgWjhLTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3o4azoKLSAgICAgICptYWdpY3AgPSBaOEtNQUdJQzsKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF96ODAwMToKLQkgICpmbGFnc3AgPSBGX1o4MDAxOwotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF96ODAwMjoKLQkgICpmbGFnc3AgPSBGX1o4MDAyOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotI2lmZGVmIEk5NjBST01BR0lDCi0KLSAgICBjYXNlIGJmZF9hcmNoX2k5NjA6Ci0KLSAgICAgIHsKLQl1bnNpZ25lZCBmbGFnczsKLQkqbWFnaWNwID0gSTk2MFJPTUFHSUM7Ci0JLyoKLQkgICgoYmZkX2dldF9maWxlX2ZsYWdzKGFiZmQpICYgV1BfVEVYVCkgPyBJOTYwUk9NQUdJQyA6Ci0JICBJOTYwUldNQUdJQyk7ICAgRklYTUU/Pz8KLQkgICovCi0Jc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCSAgewotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2NvcmU6Ci0JICAgIGZsYWdzID0gRl9JOTYwQ09SRTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6Ci0JICAgIGZsYWdzID0gRl9JOTYwS0I7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX21jOgotCSAgICBmbGFncyA9IEZfSTk2ME1DOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF94YToKLQkgICAgZmxhZ3MgPSBGX0k5NjBYQTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfY2E6Ci0JICAgIGZsYWdzID0gRl9JOTYwQ0E7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgotCSAgICBmbGFncyA9IEZfSTk2MEtBOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF9qeDoKLQkgICAgZmxhZ3MgPSBGX0k5NjBKWDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfaHg6Ci0JICAgIGZsYWdzID0gRl9JOTYwSFg7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSpmbGFnc3AgPSBmbGFnczsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBUSUMzME1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF90aWMzMDoKLSAgICAgICptYWdpY3AgPSBUSUMzME1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBUSUM4MF9BUkNIX01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF90aWM4MDoKLSAgICAgICptYWdpY3AgPSBUSUM4MF9BUkNIX01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBBUk1NQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfYXJtOgotICAgICAgKiBtYWdpY3AgPSBBUk1NQUdJQzsKLSAgICAgICogZmxhZ3NwID0gMDsKLSAgICAgIGlmIChBUENTX1NFVCAoYWJmZCkpCi0JewotCSAgaWYgKEFQQ1NfMjZfRkxBRyAoYWJmZCkpCi0JICAgICogZmxhZ3NwIHw9IEZfQVBDUzI2OwotCSAgCi0JICBpZiAoQVBDU19GTE9BVF9GTEFHIChhYmZkKSkKLQkgICAgKiBmbGFnc3AgfD0gRl9BUENTX0ZMT0FUOwotCSAgCi0JICBpZiAoUElDX0ZMQUcgKGFiZmQpKQotCSAgICAqIGZsYWdzcCB8PSBGX1BJQzsKLQl9Ci0gICAgICBpZiAoSU5URVJXT1JLX1NFVCAoYWJmZCkgJiYgSU5URVJXT1JLX0ZMQUcgKGFiZmQpKQotCSogZmxhZ3NwIHw9IEZfSU5URVJXT1JLOwotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX2FybV8yOiAgKiBmbGFnc3AgfD0gRl9BUk1fMjsgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzJhOiAqIGZsYWdzcCB8PSBGX0FSTV8yYTsgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fMzogICogZmxhZ3NwIHw9IEZfQVJNXzM7ICBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV8zTTogKiBmbGFnc3AgfD0gRl9BUk1fM007IGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzQ6ICAqIGZsYWdzcCB8PSBGX0FSTV80OyAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fNFQ6ICogZmxhZ3NwIHw9IEZfQVJNXzRUOyBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV81OiAgKiBmbGFnc3AgfD0gRl9BUk1fNTsgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzVUOiAqIGZsYWdzcCB8PSBGX0FSTV81OyAgYnJlYWs7IC8qIFhYWCAtIHdlIGRvIG5vdCBoYXZlIGFuIEZfQVJNXzVUICovCi0JfQotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBQUENNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgICptYWdpY3AgPSBQUENNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBJMzg2TUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgICAqbWFnaWNwID0gSTM4Nk1BR0lDOwotI2lmZGVmIExZTlhPUwotICAgICAgLyogSnVzdCBvdmVyd3JpdGUgdGhlIHVzdWFsIHZhbHVlIGlmIHdlJ3JlIGRvaW5nIEx5bnguICovCi0gICAgICAqbWFnaWNwID0gTFlOWENPRkZNQUdJQzsKLSNlbmRpZgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEk4NjBNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfaTg2MDoKLSAgICAgICptYWdpY3AgPSBJODYwTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTUM2OE1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotI2lmZGVmIEFQT0xMT002OEtNQUdJQwotICAgICAgKm1hZ2ljcCA9IEFQT0xMT19DT0ZGX1ZFUlNJT05fTlVNQkVSOwotI2Vsc2UKLSAgICAgIC8qIE5BTUVTX0hBVkVfVU5ERVJTQ09SRSBtYXkgYmUgZGVmaW5lZCBieSBjb2ZmLXU2OGsuYy4gICovCi0jaWZkZWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi0gICAgICAqbWFnaWNwID0gTUM2OEtCQ1NNQUdJQzsKLSNlbHNlCi0gICAgICAqbWFnaWNwID0gTUM2OE1BR0lDOwotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBMWU5YT1MKLSAgICAgIC8qIEp1c3Qgb3ZlcndyaXRlIHRoZSB1c3VhbCB2YWx1ZSBpZiB3ZSdyZSBkb2luZyBMeW54LiAqLwotICAgICAgKm1hZ2ljcCA9IExZTlhDT0ZGTUFHSUM7Ci0jZW5kaWYKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE1DODhNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfbTg4azoKLSAgICAgICptYWdpY3AgPSBNQzg4T01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEg4MzAwTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX2g4MzAwOgotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX2g4MzAwOgotCSAgKm1hZ2ljcCA9IEg4MzAwTUFHSUM7Ci0JICByZXR1cm4gdHJ1ZTsKLQljYXNlIGJmZF9tYWNoX2g4MzAwaDoKLQkgICptYWdpY3AgPSBIODMwMEhNQUdJQzsKLQkgIHJldHVybiB0cnVlOwotCWNhc2UgYmZkX21hY2hfaDgzMDBzOgotCSAgKm1hZ2ljcCA9IEg4MzAwU01BR0lDOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFNIX0FSQ0hfTUFHSUNfQklHCi0gICAgY2FzZSBiZmRfYXJjaF9zaDoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JKm1hZ2ljcCA9IFNIX0FSQ0hfTUFHSUNfQklHOwotICAgICAgZWxzZQotCSptYWdpY3AgPSBTSF9BUkNIX01BR0lDX0xJVFRMRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFNQQVJDTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgKm1hZ2ljcCA9IFNQQVJDTUFHSUM7Ci0jaWZkZWYgTFlOWE9TCi0gICAgICAvKiBKdXN0IG92ZXJ3cml0ZSB0aGUgdXN1YWwgdmFsdWUgaWYgd2UncmUgZG9pbmcgTHlueC4gKi8KLSAgICAgICptYWdpY3AgPSBMWU5YQ09GRk1BR0lDOwotI2VuZGlmCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODUwME1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9oODUwMDoKLSAgICAgICptYWdpY3AgPSBIODUwME1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEEyOUtfTUFHSUNfQklHCi0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQkqbWFnaWNwID0gQTI5S19NQUdJQ19CSUc7Ci0gICAgICBlbHNlCi0JKm1hZ2ljcCA9IEEyOUtfTUFHSUNfTElUVExFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgV0UzMktNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfd2UzMms6Ci0gICAgICAqbWFnaWNwID0gV0UzMktNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFU4MDJUT0NNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfcnM2MDAwOgotI2lmbmRlZiBQUENNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSNlbmRpZgotICAgICAgKm1hZ2ljcCA9IFU4MDJUT0NNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIE1DT1JFTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX21jb3JlOgotICAgICAgKiBtYWdpY3AgPSBNQ09SRU1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSAgICAgIAotICAgIGRlZmF1bHQ6CQkJLyogVW5rbm93biBhcmNoaXRlY3R1cmUgKi8KLSAgICAgIC8qIHJldHVybiBmYWxzZTsgIC0tIGZhbGwgdGhyb3VnaCB0byAicmV0dXJuIGZhbHNlIiBiZWxvdywgdG8gYXZvaWQKLSAgICAgICAic3RhdGVtZW50IG5ldmVyIHJlYWNoZWQiIGVycm9ycyBvbiB0aGUgb25lIGJlbG93LiAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKiBhYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICB1bnNpZ25lZCBkdW1teTE7Ci0gIHVuc2lnbmVkIHNob3J0IGR1bW15MjsKLQotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93biAmJgotICAgICAgY29mZl9zZXRfZmxhZ3MgKGFiZmQsICZkdW1teTEsICZkdW1teTIpICE9IHRydWUpCi0gICAgcmV0dXJuIGZhbHNlOwkJLyogV2UgY2FuJ3QgcmVwcmVzZW50IHRoaXMgdHlwZSAqLwotCi0gIHJldHVybiB0cnVlOwkJCS8qIFdlJ3JlIGVhc3kgLi4uICovCi19Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotLyogVGhpcyBpcyB1c2VkIHRvIHNvcnQgc2VjdGlvbnMgYnkgVk1BLCBhcyByZXF1aXJlZCBieSBQRSBpbWFnZQotICAgZmlsZXMuICAqLwotCi1zdGF0aWMgaW50IHNvcnRfYnlfc2VjYWRkciBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1zb3J0X2J5X3NlY2FkZHIgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLXsKLSAgY29uc3QgYXNlY3Rpb24gKmEgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcxOwotICBjb25zdCBhc2VjdGlvbiAqYiA9ICooY29uc3QgYXNlY3Rpb24gKiopIGFyZzI7Ci0KLSAgaWYgKGEtPnZtYSA8IGItPnZtYSkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKGEtPnZtYSA+IGItPnZtYSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0jZW5kaWYgLyogQ09GRl9JTUFHRV9XSVRIX1BFICovCi0KLS8qIENhbGN1bGF0ZSB0aGUgZmlsZSBwb3NpdGlvbiBmb3IgZWFjaCBzZWN0aW9uLiAqLwotCi0jaWZuZGVmIEk5NjAKLSNkZWZpbmUgQUxJR05fU0VDVElPTlNfSU5fRklMRQotI2VuZGlmCi0jaWZkZWYgVElDODBDT0ZGCi0jdW5kZWYgQUxJR05fU0VDVElPTlNfSU5fRklMRQotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGFzZWN0aW9uICpwcmV2aW91cyA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBmaWxlX3B0ciBzb2ZhciA9IEZJTEhTWjsKLSAgYm9vbGVhbiBhbGlnbl9hZGp1c3Q7Ci0jaWZkZWYgQUxJR05fU0VDVElPTlNfSU5fRklMRQotICBmaWxlX3B0ciBvbGRfc29mYXI7Ci0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICAvKiBPbiBYQ09GRiwgaWYgd2UgaGF2ZSBzeW1ib2xzLCBzZXQgdXAgdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN6OwotICAgICAgYmZkX3NpemVfdHlwZSBpLCBzeW1jb3VudDsKLSAgICAgIGFzeW1ib2wgKipzeW1wOwotCi0gICAgICBzeiA9IDA7Ci0gICAgICBzeW1jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICAgICAgZm9yIChzeW1wID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7IGkgPCBzeW1jb3VudDsgc3ltcCsrLCBpKyspCi0JewotCSAgY29mZl9zeW1ib2xfdHlwZSAqY2Y7Ci0KLQkgIGNmID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgKnN5bXApOwotCSAgaWYgKGNmICE9IE5VTEwKLQkgICAgICAmJiBjZi0+bmF0aXZlICE9IE5VTEwKLQkgICAgICAmJiBTWU1OQU1FX0lOX0RFQlVHICgmY2YtPm5hdGl2ZS0+dS5zeW1lbnQpKQotCSAgICB7Ci0JICAgICAgc2l6ZV90IGxlbjsKLQotCSAgICAgIGxlbiA9IHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoKnN5bXApKTsKLQkgICAgICBpZiAobGVuID4gU1lNTk1MRU4pCi0JCXN6ICs9IGxlbiArIDM7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3ogPiAwKQotCXsKLQkgIGFzZWN0aW9uICpkc2VjOwotCi0JICBkc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmRlYnVnIik7Ci0JICBpZiAoZHNlYyA9PSBOVUxMKQotCSAgICBhYm9ydCAoKTsKLQkgIGRzZWMtPl9yYXdfc2l6ZSA9IHN6OwotCSAgZHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgaW50IHBhZ2Vfc2l6ZTsKLSAgaWYgKGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mbykgCi0gICAgewotICAgICAgcGFnZV9zaXplID0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5GaWxlQWxpZ25tZW50OwotICAgIH0KLSAgZWxzZQotICAgIHBhZ2Vfc2l6ZSA9IFBFX0RFRl9GSUxFX0FMSUdOTUVOVDsKLSNlbHNlCi0jaWZkZWYgQ09GRl9QQUdFX1NJWkUKLSAgaW50IHBhZ2Vfc2l6ZSA9IENPRkZfUEFHRV9TSVpFOwotI2VuZGlmCi0jZW5kaWYKLQotICBpZiAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiAgQSBzdGFydCBhZGRyZXNzIG1heSBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIG9yaWdpbmFsIGZpbGUuIEluIHRoaXMKLQkgIGNhc2UgaXQgd2lsbCBuZWVkIGFuIG9wdGlvbmFsIGhlYWRlciB0byByZWNvcmQgaXQuICAqLwotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICAgIH0KLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgc29mYXIgKz0gQU9VVFNaOwotI2lmZGVmIFJTNjAwMENPRkZfQwotICBlbHNlIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotICAgIHNvZmFyICs9IEFPVVRTWjsKLSAgZWxzZQotICAgIHNvZmFyICs9IFNNQUxMX0FPVVRTWjsKLSNlbmRpZgotCi0gIHNvZmFyICs9IGFiZmQtPnNlY3Rpb25fY291bnQgKiBTQ05IU1o7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogWENPRkYgaGFuZGxlcyBvdmVyZmxvd3MgaW4gdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudCBmaWVsZHMKLSAgICAgYnkgYWxsb2NhdGluZyBhIG5ldyBzZWN0aW9uIGhlYWRlciB0byBob2xkIHRoZSBjb3JyZWN0IGNvdW50cy4gICovCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgY3VycmVudC0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKLSAgICAgIHNvZmFyICs9IFNDTkhTWjsKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIHsKLSAgICAvKiBQRSByZXF1aXJlcyB0aGUgc2VjdGlvbnMgdG8gYmUgaW4gbWVtb3J5IG9yZGVyIHdoZW4gbGlzdGVkIGluCi0gICAgICAgdGhlIHNlY3Rpb24gaGVhZGVycy4gIEl0IGFsc28gZG9lcyBub3QgbGlrZSBlbXB0eSBsb2FkYWJsZQotICAgICAgIHNlY3Rpb25zLiAgVGhlIHNlY3Rpb25zIGFwcGFyZW50bHkgZG8gbm90IGhhdmUgdG8gYmUgaW4gdGhlCi0gICAgICAgcmlnaHQgb3JkZXIgaW4gdGhlIGltYWdlIGZpbGUgaXRzZWxmLCBidXQgd2UgZG8gbmVlZCB0byBnZXQgdGhlCi0gICAgICAgdGFyZ2V0X2luZGV4IHZhbHVlcyByaWdodC4gICovCi0KLSAgICBpbnQgY291bnQ7Ci0gICAgYXNlY3Rpb24gKipzZWN0aW9uX2xpc3Q7Ci0gICAgaW50IGk7Ci0gICAgaW50IHRhcmdldF9pbmRleDsKLQotICAgIGNvdW50ID0gMDsKLSAgICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICAgICsrY291bnQ7Ci0KLSAgICAvKiBXZSBhbGxvY2F0ZSBhbiBleHRyYSBjZWxsIHRvIHNpbXBsaWZ5IHRoZSBmaW5hbCBsb29wLiAgKi8KLSAgICBzZWN0aW9uX2xpc3QgPSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBhc2VjdGlvbiAqKSAqIChjb3VudCArIDEpKTsKLSAgICBpZiAoc2VjdGlvbl9saXN0ID09IE5VTEwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpID0gMDsKLSAgICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICAgIHsKLQlzZWN0aW9uX2xpc3RbaV0gPSBjdXJyZW50OwotCSsraTsKLSAgICAgIH0KLSAgICBzZWN0aW9uX2xpc3RbaV0gPSBOVUxMOwotCi0gICAgcXNvcnQgKHNlY3Rpb25fbGlzdCwgY291bnQsIHNpemVvZiAoYXNlY3Rpb24gKiksIHNvcnRfYnlfc2VjYWRkcik7Ci0KLSAgICAvKiBSZXRocmVhZCB0aGUgbGlua2VkIGxpc3QgaW50byBzb3J0ZWQgb3JkZXI7IGF0IHRoZSBzYW1lIHRpbWUsCi0gICAgICAgYXNzaWduIHRhcmdldF9pbmRleCB2YWx1ZXMuICAqLwotICAgIHRhcmdldF9pbmRleCA9IDE7Ci0gICAgYWJmZC0+c2VjdGlvbnMgPSBzZWN0aW9uX2xpc3RbMF07Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICB7Ci0JY3VycmVudCA9IHNlY3Rpb25fbGlzdFtpXTsKLQljdXJyZW50LT5uZXh0ID0gc2VjdGlvbl9saXN0W2kgKyAxXTsKLQotCS8qIExhdGVyLCBpZiB0aGUgc2VjdGlvbiBoYXMgemVybyBzaXplLCB3ZSdsbCBiZSB0aHJvd2luZyBpdAotCSAgIGF3YXksIHNvIHdlIGRvbid0IHdhbnQgdG8gbnVtYmVyIGl0IG5vdy4gIE5vdGUgdGhhdCBoYXZpbmcKLQkgICBhIHplcm8gc2l6ZSBhbmQgaGF2aW5nIHJlYWwgY29udGVudHMgYXJlIGRpZmZlcmVudAotCSAgIGNvbmNlcHRzOiAuYnNzIGhhcyBubyBjb250ZW50cywgYnV0ICh1c3VhbGx5KSBub24temVybwotCSAgIHNpemUuICAqLwotCWlmIChjdXJyZW50LT5fcmF3X3NpemUgPT0gMCkKLQkgIHsKLQkgICAgLyogRGlzY2FyZC4gIEhvd2V2ZXIsIGl0IHN0aWxsIG1pZ2h0IGhhdmUgKHZhbGlkKSBzeW1ib2xzCi0JICAgICAgIGluIGl0LCBzbyBhcmJpdHJhcmlseSBzZXQgaXQgdG8gc2VjdGlvbiAxIChpbmRleGluZyBpcwotCSAgICAgICAxLWJhc2VkIGhlcmU7IHVzdWFsbHkgLnRleHQpLiAgX19lbmRfXyBhbmQgb3RoZXIKLQkgICAgICAgY29udGVudHMgb2YgLmVuZHNlY3Rpb24gcmVhbGx5IGhhdmUgdGhpcyBoYXBwZW4uCi0JICAgICAgIEZJWE1FOiBUaGlzIHNlZW1zIHNvbWV3aGF0IGR1YmlvdXMuICAqLwotCSAgICBjdXJyZW50LT50YXJnZXRfaW5kZXggPSAxOwotCSAgfQotCWVsc2UKLQkgIGN1cnJlbnQtPnRhcmdldF9pbmRleCA9IHRhcmdldF9pbmRleCsrOwotICAgICAgfQotCi0gICAgZnJlZSAoc2VjdGlvbl9saXN0KTsKLSAgfQotI2Vsc2UgLyogISBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLSAgewotICAgIC8qIFNldCB0aGUgdGFyZ2V0X2luZGV4IGZpZWxkLiAgKi8KLSAgICBpbnQgdGFyZ2V0X2luZGV4OwotCi0gICAgdGFyZ2V0X2luZGV4ID0gMTsKLSAgICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICAgIGN1cnJlbnQtPnRhcmdldF9pbmRleCA9IHRhcmdldF9pbmRleCsrOwotICB9Ci0jZW5kaWYgLyogISBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLQotICBhbGlnbl9hZGp1c3QgPSBmYWxzZTsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gICAgICAvKiBXaXRoIFBFIHdlIGhhdmUgdG8gcGFkIGVhY2ggc2VjdGlvbiB0byBiZSBhIG11bHRpcGxlIG9mIGl0cwotCSBwYWdlIHNpemUgdG9vLCBhbmQgcmVtZW1iZXIgYm90aCBzaXplcy4gICovCi0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpID09IE5VTEwpCi0JewotCSAgY3VycmVudC0+dXNlZF9ieV9iZmQgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChjdXJyZW50LT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpID09IE5VTEwpCi0JewotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT50ZGF0YSA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT50ZGF0YSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT52aXJ0X3NpemUgPT0gMCkKLQlwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dmlydF9zaXplID0gY3VycmVudC0+X3Jhd19zaXplOwotI2VuZGlmCi0KLSAgICAgIC8qIE9ubHkgZGVhbCB3aXRoIHNlY3Rpb25zIHdoaWNoIGhhdmUgY29udGVudHMuICAqLwotICAgICAgaWYgKCEoY3VycmVudC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSkKLQljb250aW51ZTsKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogTWFrZSBzdXJlIHdlIHNraXAgZW1wdHkgc2VjdGlvbnMgaW4gYSBQRSBpbWFnZS4gICovCi0gICAgICBpZiAoY3VycmVudC0+X3Jhd19zaXplID09IDApCi0JY29udGludWU7Ci0jZW5kaWYKLQotICAgICAgLyogQWxpZ24gdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIHRvIHRoZSBzYW1lIGJvdW5kYXJ5IG9uCi0JIHdoaWNoIHRoZXkgYXJlIGFsaWduZWQgaW4gdmlydHVhbCBtZW1vcnkuICBJOTYwIGRvZXNuJ3QKLQkgZG8gdGhpcyAoRklYTUUpIHNvIHdlIGNhbiBzdGF5IGluIHN5bmMgd2l0aCBJbnRlbC4gIDk2MAotCSBkb2Vzbid0IHlldCBwYWdlIGZyb20gZmlsZXMuLi4gKi8KLSNpZmRlZiBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwKQotCXsKLQkgIC8qIG1ha2Ugc3VyZSB0aGlzIHNlY3Rpb24gaXMgYWxpZ25lZCBvbiB0aGUgcmlnaHQgYm91bmRhcnkgLSBieQotCSAgICAgcGFkZGluZyB0aGUgcHJldmlvdXMgc2VjdGlvbiB1cCBpZiBuZWNlc3NhcnkgKi8KLQotCSAgb2xkX3NvZmFyID0gc29mYXI7Ci0JICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgIGlmIChwcmV2aW91cyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgewotCSAgICAgIHByZXZpb3VzLT5fcmF3X3NpemUgKz0gc29mYXIgLSBvbGRfc29mYXI7Ci0JICAgIH0KLQl9Ci0KLSNlbmRpZgotCi0gICAgICAvKiBJbiBkZW1hbmQgcGFnZWQgZmlsZXMgdGhlIGxvdyBvcmRlciBiaXRzIG9mIHRoZSBmaWxlIG9mZnNldAotCSBtdXN0IG1hdGNoIHRoZSBsb3cgb3JkZXIgYml0cyBvZiB0aGUgdmlydHVhbCBhZGRyZXNzLiAgKi8KLSNpZmRlZiBDT0ZGX1BBR0VfU0laRQotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDAKLQkgICYmIChjdXJyZW50LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQlzb2ZhciArPSAoY3VycmVudC0+dm1hIC0gc29mYXIpICUgcGFnZV9zaXplOwotI2VuZGlmCi0gICAgICBjdXJyZW50LT5maWxlcG9zID0gc29mYXI7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFNldCB0aGUgcGFkZGVkIHNpemUuICAqLwotICAgICAgY3VycmVudC0+X3Jhd19zaXplID0gKGN1cnJlbnQtPl9yYXdfc2l6ZSArIHBhZ2Vfc2l6ZSAtMSkgJiAtcGFnZV9zaXplOwotI2VuZGlmCi0KLSAgICAgIHNvZmFyICs9IGN1cnJlbnQtPl9yYXdfc2l6ZTsKLQotI2lmZGVmIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKLSAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHRoaXMgc2VjdGlvbiBpcyBvZiB0aGUgcmlnaHQgc2l6ZSB0b28gKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApID09IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBvbGRfc2l6ZTsKLQotCSAgb2xkX3NpemUgPSBjdXJyZW50LT5fcmF3X3NpemU7Ci0JICBjdXJyZW50LT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKGN1cnJlbnQtPl9yYXdfc2l6ZSwKLQkJCQkJICAxIDw8IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcik7Ci0JICBhbGlnbl9hZGp1c3QgPSBjdXJyZW50LT5fcmF3X3NpemUgIT0gb2xkX3NpemU7Ci0JICBzb2ZhciArPSBjdXJyZW50LT5fcmF3X3NpemUgLSBvbGRfc2l6ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb2xkX3NvZmFyID0gc29mYXI7Ci0JICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgIGFsaWduX2FkanVzdCA9IHNvZmFyICE9IG9sZF9zb2ZhcjsKLQkgIGN1cnJlbnQtPl9yYXdfc2l6ZSArPSBzb2ZhciAtIG9sZF9zb2ZhcjsKLQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogRm9yIFBFIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIHBhZCBvdXQgdG8gdGhlIGFsaWduZWQKLSAgICAgICAgIF9yYXdfc2l6ZSwgaW4gY2FzZSB0aGUgY2FsbGVyIG9ubHkgd3JpdGVzIG91dCBkYXRhIHRvIHRoZQotICAgICAgICAgdW5hbGlnbmVkIF9yYXdfc2l6ZS4gICovCi0gICAgICBpZiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCktPnZpcnRfc2l6ZSA8IGN1cnJlbnQtPl9yYXdfc2l6ZSkKLQlhbGlnbl9hZGp1c3QgPSB0cnVlOwotI2VuZGlmCi0KLSNpZmRlZiBfTElCCi0gICAgICAvKiBGb3JjZSAubGliIHNlY3Rpb25zIHRvIHN0YXJ0IGF0IHplcm8uICBUaGUgdm1hIGlzIHRoZW4KLQkgaW5jcmVtZW50ZWQgaW4gY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cy4gIFRoaXMgaXMgcmlnaHQgZm9yCi0JIFNWUjMuMi4gICovCi0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQotCWJmZF9zZXRfc2VjdGlvbl92bWEgKGFiZmQsIGN1cnJlbnQsIDApOwotI2VuZGlmCi0KLSAgICAgIHByZXZpb3VzID0gY3VycmVudDsKLSAgICB9Ci0KLSAgLyogSXQgaXMgbm93IHNhZmUgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCBmaWxlLiAgSWYgd2UgbmVlZGVkIGFuCi0gICAgIGFsaWdubWVudCBhZGp1c3RtZW50IGZvciB0aGUgbGFzdCBzZWN0aW9uLCB0aGVuIG1ha2Ugc3VyZSB0aGF0Ci0gICAgIHRoZXJlIGlzIGEgYnl0ZSBhdCBvZmZzZXQgc29mYXIuICBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scyBhbmQgbm8KLSAgICAgcmVsb2NzLCB0aGVuIG5vdGhpbmcgZm9sbG93cyB0aGUgbGFzdCBzZWN0aW9uLiAgSWYgd2UgZG9uJ3QgZm9yY2UKLSAgICAgdGhlIGxhc3QgYnl0ZSBvdXQsIHRoZW4gdGhlIGZpbGUgbWF5IGFwcGVhciB0byBiZSB0cnVuY2F0ZWQuICAqLwotICBpZiAoYWxpZ25fYWRqdXN0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGI7Ci0KLSAgICAgIGIgPSAwOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzb2ZhciAtIDEsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSByZWxvY2F0aW9ucyBhcmUgYWxpZ25lZC4gIFdlIGRvbid0IG5lZWQgdG8gbWFrZQotICAgICBzdXJlIHRoYXQgdGhpcyBieXRlIGV4aXN0cywgYmVjYXVzZSBpdCB3aWxsIG9ubHkgbWF0dGVyIGlmIHRoZXJlCi0gICAgIHJlYWxseSBhcmUgcmVsb2NzLiAgKi8KLSAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUik7Ci0KLSAgb2JqX3JlbG9jYmFzZSAoYWJmZCkgPSBzb2ZhcjsKLSAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiAwCi0KLS8qIFRoaXMgY2FuIG5ldmVyIHdvcmssIGJlY2F1c2UgaXQgaXMgY2FsbGVkIHRvbyBsYXRlLS1hZnRlciB0aGUKLSAgIHNlY3Rpb24gcG9zaXRpb25zIGhhdmUgYmVlbiBzZXQuICBJIGNhbid0IGZpZ3VyZSBvdXQgd2hhdCBpdCBpcwotICAgZm9yLCBzbyBJIGFtIGdvaW5nIHRvIGRpc2FibGUgaXQtLUlhbiBUYXlsb3IgMjAgTWFyY2ggMTk5Ni4gICovCi0KLS8qIElmIC5maWxlLCAudGV4dCwgLmRhdGEsIC5ic3Mgc3ltYm9scyBhcmUgbWlzc2luZywgYWRkIHRoZW0uICAqLwotLyogQEAgU2hvdWxkIHdlIG9ubHkgYmUgYWRkaW5nIG1pc3Npbmcgc3ltYm9scywgb3Igb3ZlcnJpZGluZyB0aGUgYXV4Ci0gICB2YWx1ZXMgZm9yIGV4aXN0aW5nIHNlY3Rpb24gc3ltYm9scz8gICovCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBuc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBhc3ltYm9sICoqc3ltcHAgPSBhYmZkLT5vdXRzeW1ib2xzOwotICBhc3ltYm9sICoqc3ltcHAyOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IG5lZWRfdGV4dCA9IDEsIG5lZWRfZGF0YSA9IDEsIG5lZWRfYnNzID0gMSwgbmVlZF9maWxlID0gMTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnN5bXM7IGkrKykKLSAgICB7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXBlICpjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltcHBbaV0pOwotICAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgIGlmIChjc3ltKQotCXsKLQkgIC8qIG9ubHkgZG8gdGhpcyBpZiB0aGVyZSBpcyBhIGNvZmYgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0Ci0JICAgc3ltYm9sICovCi0JICBpZiAoY3N5bS0+bmF0aXZlICYmIGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotCSAgICB7Ci0JICAgICAgbmVlZF9maWxlID0gMDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgbmFtZSA9IGNzeW0tPnN5bWJvbC5uYW1lOwotCSAgaWYgKCFuYW1lKQotCSAgICBjb250aW51ZTsKLQkgIGlmICghc3RyY21wIChuYW1lLCBfVEVYVCkpCi0JICAgIG5lZWRfdGV4dCA9IDA7Ci0jaWZkZWYgQVBPTExPX002OAotCSAgZWxzZSBpZiAoIXN0cmNtcCAobmFtZSwgIi53dGV4dCIpKQotCSAgICBuZWVkX3RleHQgPSAwOwotI2VuZGlmCi0JICBlbHNlIGlmICghc3RyY21wIChuYW1lLCBfREFUQSkpCi0JICAgIG5lZWRfZGF0YSA9IDA7Ci0JICBlbHNlIGlmICghc3RyY21wIChuYW1lLCBfQlNTKSkKLQkgICAgbmVlZF9ic3MgPSAwOwotCX0KLSAgICB9Ci0gIC8qIE5vdyBpID09IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpLiAgKi8KLSAgLyogQEAgRm9yIG5vdywgZG9uJ3QgZGVhbCB3aXRoIC5maWxlIHN5bWJvbC4gICovCi0gIG5lZWRfZmlsZSA9IDA7Ci0KLSAgaWYgKCFuZWVkX3RleHQgJiYgIW5lZWRfZGF0YSAmJiAhbmVlZF9ic3MgJiYgIW5lZWRfZmlsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgbnN5bXMgKz0gbmVlZF90ZXh0ICsgbmVlZF9kYXRhICsgbmVlZF9ic3MgKyBuZWVkX2ZpbGU7Ci0gIHN5bXBwMiA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKGFiZmQsIG5zeW1zICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgaWYgKCFzeW1wcDIpCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1jcHkgKHN5bXBwMiwgc3ltcHAsIGkgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBpZiAobmVlZF9maWxlKQotICAgIHsKLSAgICAgIC8qIEBAIEdlbmVyYXRlIGZha2UgLmZpbGUgc3ltYm9sLCBpbiBzeW1wcDJbaV0sIGFuZCBpbmNyZW1lbnQgaS4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIGlmIChuZWVkX3RleHQpCi0gICAgc3ltcHAyW2krK10gPSBjb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBfVEVYVCk7Ci0gIGlmIChuZWVkX2RhdGEpCi0gICAgc3ltcHAyW2krK10gPSBjb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBfREFUQSk7Ci0gIGlmIChuZWVkX2JzcykKLSAgICBzeW1wcDJbaSsrXSA9IGNvZmZfc2VjdGlvbl9zeW1ib2wgKGFiZmQsIF9CU1MpOwotICBCRkRfQVNTRVJUIChpID09IG5zeW1zKTsKLSAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHN5bXBwMiwgbnN5bXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotLyogU1VQUFJFU1MgNTU4ICovCi0vKiBTVVBQUkVTUyA1MjkgKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGJvb2xlYW4gaGFzcmVsb2NzID0gZmFsc2U7Ci0gIGJvb2xlYW4gaGFzbGlubm8gPSBmYWxzZTsKLSAgYm9vbGVhbiBoYXNkZWJ1ZyA9IGZhbHNlOwotICBmaWxlX3B0ciBzY25fYmFzZTsKLSAgZmlsZV9wdHIgcmVsb2NfYmFzZTsKLSAgZmlsZV9wdHIgbGluZW5vX2Jhc2U7Ci0gIGZpbGVfcHRyIHN5bV9iYXNlOwotICB1bnNpZ25lZCBsb25nIHJlbG9jX3NpemUgPSAwOwotICB1bnNpZ25lZCBsb25nIGxubm9fc2l6ZSA9IDA7Ci0gIGJvb2xlYW4gbG9uZ19zZWN0aW9uX25hbWVzOwotICBhc2VjdGlvbiAqdGV4dF9zZWMgPSBOVUxMOwotICBhc2VjdGlvbiAqZGF0YV9zZWMgPSBOVUxMOwotICBhc2VjdGlvbiAqYnNzX3NlYyA9IE5VTEw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyIGludGVybmFsX2Y7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyIGludGVybmFsX2E7Ci0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgc2l6ZV90IHN0cmluZ19zaXplID0gU1RSSU5HX1NJWkVfU0laRTsKLSNlbmRpZgotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0KLSAgLyogTWFrZSBhIHBhc3MgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIHRvIGNvdW50IGxpbmUgbnVtYmVyIGVudHJpZXMgYW5kCi0gICAgIHB1dCB0aGVtIGludG8gdGhlIGNvcnJlY3QgYXNlY3Rpb25zICovCi0KLSAgbG5ub19zaXplID0gY29mZl9jb3VudF9saW5lbnVtYmVycyAoYWJmZCkgKiBMSU5FU1o7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKCEgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmVsb2NfYmFzZSA9IG9ial9yZWxvY2Jhc2UgKGFiZmQpOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBzaXplIG9mIHRoZSByZWxvYyBhbmQgbGlubm8gYXJlYXMgKi8KLQotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0KLSAgICAgICBjdXJyZW50LT5uZXh0KQotICAgIHJlbG9jX3NpemUgKz0gY3VycmVudC0+cmVsb2NfY291bnQgKiBSRUxTWjsKLQotICBsaW5lbm9fYmFzZSA9IHJlbG9jX2Jhc2UgKyByZWxvY19zaXplOwotICBzeW1fYmFzZSA9IGxpbmVub19iYXNlICsgbG5ub19zaXplOwotCi0gIC8qIEluZGljYXRlIGluIGVhY2ggc2VjdGlvbi0+bGluZV9maWxlcG9zIGl0cyBhY3R1YWwgZmlsZSBhZGRyZXNzICovCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPQotICAgICAgIGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKGN1cnJlbnQtPmxpbmVub19jb3VudCkKLQl7Ci0JICBjdXJyZW50LT5saW5lX2ZpbGVwb3MgPSBsaW5lbm9fYmFzZTsKLQkgIGN1cnJlbnQtPm1vdmluZ19saW5lX2ZpbGVwb3MgPSBsaW5lbm9fYmFzZTsKLQkgIGxpbmVub19iYXNlICs9IGN1cnJlbnQtPmxpbmVub19jb3VudCAqIExJTkVTWjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY3VycmVudC0+bGluZV9maWxlcG9zID0gMDsKLQl9Ci0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQpCi0JewotCSAgY3VycmVudC0+cmVsX2ZpbGVwb3MgPSByZWxvY19iYXNlOwotCSAgcmVsb2NfYmFzZSArPSBjdXJyZW50LT5yZWxvY19jb3VudCAqIFJFTFNaOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjdXJyZW50LT5yZWxfZmlsZXBvcyA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBXcml0ZSBzZWN0aW9uIGhlYWRlcnMgdG8gdGhlIGZpbGUuICAqLwotICBpbnRlcm5hbF9mLmZfbnNjbnMgPSAwOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDApCi0gICAgc2NuX2Jhc2UgPSBGSUxIU1ogKyBBT1VUU1o7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzY25fYmFzZSA9IEZJTEhTWjsKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotCXNjbl9iYXNlICs9IEFPVVRTWjsKLSAgICAgIGVsc2UKLQlzY25fYmFzZSArPSBTTUFMTF9BT1VUU1o7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzY25fYmFzZSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGxvbmdfc2VjdGlvbl9uYW1lcyA9IGZhbHNlOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3NjbmhkciBzZWN0aW9uOwotICAgICAgYm9vbGVhbiBpc19yZWxvY19zZWN0aW9uID0gZmFsc2U7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsICIucmVsb2MiKSA9PSAwKQotCXsKLQkgIGlzX3JlbG9jX3NlY3Rpb24gPSB0cnVlOwotCSAgaGFzcmVsb2NzID0gdHJ1ZTsKLQkgIHBlX2RhdGEgKGFiZmQpLT5oYXNfcmVsb2Nfc2VjdGlvbiA9IDE7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGludGVybmFsX2YuZl9uc2NucysrOwotCi0gICAgICBzdHJuY3B5IChzZWN0aW9uLnNfbmFtZSwgY3VycmVudC0+bmFtZSwgU0NOTk1MRU4pOwotCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgICAgIC8qIEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMgYXMgaW4gUEUuICBUaGlzIG11c3QgYmUgY29tcGF0aWJsZQotICAgICAgICAgd2l0aCB0aGUgY29kZSBpbiBjb2ZmX3dyaXRlX3N5bWJvbHMgYW5kIF9iZmRfY29mZl9maW5hbF9saW5rLiAgKi8KLSAgICAgIHsKLQlzaXplX3QgbGVuOwotCi0JbGVuID0gc3RybGVuIChjdXJyZW50LT5uYW1lKTsKLQlpZiAobGVuID4gU0NOTk1MRU4pCi0JICB7Ci0JICAgIG1lbXNldCAoc2VjdGlvbi5zX25hbWUsIDAsIFNDTk5NTEVOKTsKLQkgICAgc3ByaW50ZiAoc2VjdGlvbi5zX25hbWUsICIvJWx1IiwgKHVuc2lnbmVkIGxvbmcpIHN0cmluZ19zaXplKTsKLQkgICAgc3RyaW5nX3NpemUgKz0gbGVuICsgMTsKLQkgICAgbG9uZ19zZWN0aW9uX25hbWVzID0gdHJ1ZTsKLQkgIH0KLSAgICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgX0xJQgotICAgICAgLyogQWx3YXlzIHNldCBzX3ZhZGRyIG9mIC5saWIgdG8gMC4gIFRoaXMgaXMgcmlnaHQgZm9yIFNWUjMuMgotCSBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uICAqLwotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX0xJQikgPT0gMCkKLQlzZWN0aW9uLnNfdmFkZHIgPSAwOwotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICBzZWN0aW9uLnNfdmFkZHIgPSBjdXJyZW50LT52bWE7Ci0gICAgICBzZWN0aW9uLnNfcGFkZHIgPSBjdXJyZW50LT5sbWE7Ci0gICAgICBzZWN0aW9uLnNfc2l6ZSA9ICBjdXJyZW50LT5fcmF3X3NpemU7Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIHNlY3Rpb24uc19wYWRkciA9IDA7Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFJlbWluZGVyOiBzX3BhZGRyIGhvbGRzIHRoZSB2aXJ0dWFsIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSAhPSBOVUxMCi0JICAmJiBwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSAhPSBOVUxMKQotCXNlY3Rpb24uc19wYWRkciA9IHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpLT52aXJ0X3NpemU7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbi5zX3BhZGRyID0gMDsKLSNlbmRpZgotCi0gICAgICAvKgotCSBJZiB0aGlzIHNlY3Rpb24gaGFzIG5vIHNpemUgb3IgaXMgdW5sb2FkYWJsZSB0aGVuIHRoZSBzY25wdHIKLQkgd2lsbCBiZSAwIHRvbwotCSAqLwotICAgICAgaWYgKGN1cnJlbnQtPl9yYXdfc2l6ZSA9PSAwIHx8Ci0JICAoY3VycmVudC0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTKSkgPT0gMCkKLQl7Ci0JICBzZWN0aW9uLnNfc2NucHRyID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2VjdGlvbi5zX3NjbnB0ciA9IGN1cnJlbnQtPmZpbGVwb3M7Ci0JfQotICAgICAgc2VjdGlvbi5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotICAgICAgc2VjdGlvbi5zX2xubm9wdHIgPSBjdXJyZW50LT5saW5lX2ZpbGVwb3M7Ci0gICAgICBzZWN0aW9uLnNfbnJlbG9jID0gY3VycmVudC0+cmVsb2NfY291bnQ7Ci0gICAgICBzZWN0aW9uLnNfbmxubm8gPSBjdXJyZW50LT5saW5lbm9fY291bnQ7Ci0jaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogSW4gUEVJLCByZWxvY3MgY29tZSBpbiB0aGUgLnJlbG9jIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ICE9IDApCi0JaGFzcmVsb2NzID0gdHJ1ZTsKLSNlbmRpZgotICAgICAgaWYgKGN1cnJlbnQtPmxpbmVub19jb3VudCAhPSAwKQotCWhhc2xpbm5vID0gdHJ1ZTsKLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwCi0JICAmJiAhIGlzX3JlbG9jX3NlY3Rpb24pCi0JaGFzZGVidWcgPSB0cnVlOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gICAgICAvKiBJbmRpY2F0ZSB0aGUgdXNlIG9mIGFuIFhDT0ZGIG92ZXJmbG93IHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgY3VycmVudC0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKLQl7Ci0JICBzZWN0aW9uLnNfbnJlbG9jID0gMHhmZmZmOwotCSAgc2VjdGlvbi5zX25sbm5vID0gMHhmZmZmOwotCX0KLSNlbmRpZgotCi0gICAgICBzZWN0aW9uLnNfZmxhZ3MgPSBzZWNfdG9fc3R5cF9mbGFncyAoY3VycmVudC0+bmFtZSwgY3VycmVudC0+ZmxhZ3MpOwotCi0gICAgICBpZiAoIXN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1RFWFQpKQotCXsKLQkgIHRleHRfc2VjID0gY3VycmVudDsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChjdXJyZW50LT5uYW1lLCBfREFUQSkpCi0JewotCSAgZGF0YV9zZWMgPSBjdXJyZW50OwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9CU1MpKQotCXsKLQkgIGJzc19zZWMgPSBjdXJyZW50OwotCX0KLQotI2lmZGVmIEk5NjAKLSAgICAgIHNlY3Rpb24uc19hbGlnbiA9IChjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIKLQkJCSA/IDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyCi0JCQkgOiAwKTsKLSNlbHNlCi0jaWZkZWYgVElDODBDT0ZGCi0gICAgICBzZWN0aW9uLnNfZmxhZ3MgfD0gKGN1cnJlbnQtPmFsaWdubWVudF9wb3dlciAmIDB4RikgPDwgODsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFN1cHByZXNzIG91dHB1dCBvZiB0aGUgc2VjdGlvbnMgaWYgdGhleSBhcmUgbnVsbC4gIGxkCi0JIGluY2x1ZGVzIHRoZSBic3MgYW5kIGRhdGEgc2VjdGlvbnMgZXZlbiBpZiB0aGVyZSBpcyBubyBzaXplCi0JIGFzc2lnbmVkIHRvIHRoZW0uICBOVCBsb2FkZXIgZG9lc24ndCBsaWtlIGl0IGlmIHRoZXNlIHNlY3Rpb24KLQkgaGVhZGVycyBhcmUgaW5jbHVkZWQgaWYgdGhlIHNlY3Rpb25zIHRoZW1zZWx2ZXMgYXJlIG5vdAotCSBuZWVkZWQuICBTZWUgYWxzbyBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gICovCi0gICAgICBpZiAoc2VjdGlvbi5zX3NpemUgPT0gMCkKLQlpbnRlcm5hbF9mLmZfbnNjbnMtLTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCXsKLQkgIFNDTkhEUiBidWZmOwotCSAgaWYgKGNvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLCAmc2VjdGlvbiwgJmJ1ZmYpID09IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICgmYnVmZiksIDEsIFNDTkhTWiwgYWJmZCkgIT0gU0NOSFNaKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gICAgICAvKiBQRSBzdG9yZXMgQ09NREFUIHNlY3Rpb24gaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIElmCi0gICAgICAgICB0aGlzIHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8gaGF2ZSBzb21lIENPTURBVCBpbmZvLCB0cmFjayBkb3duCi0gICAgICAgICB0aGUgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUgYW5kIG1vZGlmeSBpdC4gICovCi0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0xJTktfT05DRSkgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaSwgY291bnQ7Ci0JICBhc3ltYm9sICoqcHN5bTsKLQkgIGNvZmZfc3ltYm9sX3R5cGUgKmNzeW0gPSBOVUxMOwotCSAgYXN5bWJvbCAqKnBzeW1zZWM7Ci0KLQkgIHBzeW1zZWMgPSBOVUxMOwotCSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQkgIGZvciAoaSA9IDAsIHBzeW0gPSBhYmZkLT5vdXRzeW1ib2xzOyBpIDwgY291bnQ7IGkrKywgcHN5bSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCgqcHN5bSktPnNlY3Rpb24gIT0gY3VycmVudCkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGlzCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChwc3ltc2VjID09IE5VTEwpCi0JCXBzeW1zZWMgPSBwc3ltOwotCi0JICAgICAgLyogU2VlIGlmIHRoaXMgaXMgdGhlIHNlY3Rpb24gc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoc3RyY21wICgoKnBzeW0pLT5uYW1lLCBjdXJyZW50LT5uYW1lKSA9PSAwKQotCQl7Ci0JCSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsICpwc3ltKTsKLQkJICBpZiAoY3N5bSA9PSBOVUxMCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZSA9PSBOVUxMCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPCAxCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgIT0gQ19TVEFUCi0JCSAgICAgIHx8IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl90eXBlICE9IFRfTlVMTCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgLyogSGVyZSAqUFNZTSBpcyB0aGUgc2VjdGlvbiBzeW1ib2wgZm9yIENVUlJFTlQuICAqLwotCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBEaWQgd2UgZmluZCBpdD8KLQkgICAgIE5vdGUgdGhhdCB3ZSBtaWdodCBub3QgaWYgd2UncmUgY29udmVydGluZyB0aGUgZmlsZSBmcm9tCi0JICAgICBzb21lIG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdC4gICovCi0JICBpZiAoaSA8IGNvdW50KQotCSAgICB7Ci0JICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4OwotCi0JICAgICAgLyogV2UgZG9uJ3QgdG91Y2ggdGhlIHhfY2hlY2tzdW0gZmllbGQuICBUaGUKLQkJIHhfYXNzb2NpYXRlZCBmaWVsZCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gICovCi0KLQkgICAgICBhdXggPSBjc3ltLT5uYXRpdmUgKyAxOwotCSAgICAgIHN3aXRjaCAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfTElOS19EVVBMSUNBVEVTKQotCQl7Ci0JCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOgotCQkgIGF1eC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQgPSBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWTsKLQkJICBicmVhazsKLQotCQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk6Ci0JCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9Ci0JCSAgICBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUzsKLQkJICBicmVhazsKLQotCQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOgotCQkgIGF1eC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQgPQotCQkgICAgSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFM6Ci0JCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9Ci0JCSAgICBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENIOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBUaGUgQ09NREFUIHN5bWJvbCBtdXN0IGJlIHRoZSBmaXJzdCBzeW1ib2wgZnJvbSB0aGlzCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEluIG9yZGVyIHRvIG1ha2UgdGhpcwotICAgICAgICAgICAgICAgICB3b3JrLCB3ZSBtb3ZlIHRoZSBDT01EQVQgc3ltYm9sIGJlZm9yZSB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgc3ltYm9sIHdlIGZvdW5kIGluIHRoZSBzZWFyY2ggYWJvdmUuICBJdCdzIE9LIHRvCi0gICAgICAgICAgICAgICAgIHJlYXJyYW5nZSB0aGUgc3ltYm9sIHRhYmxlIGF0IHRoaXMgcG9pbnQsIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgY29mZl9yZW51bWJlcl9zeW1ib2xzIGlzIGdvaW5nIHRvIHJlYXJyYW5nZSBpdAotICAgICAgICAgICAgICAgICBmdXJ0aGVyIGFuZCBmaXggdXAgYWxsIHRoZSBhdXggZW50cmllcy4gICovCi0JICAgICAgaWYgKHBzeW0gIT0gcHN5bXNlYykKLQkJewotCQkgIGFzeW1ib2wgKmhvbGQ7Ci0JCSAgYXN5bWJvbCAqKnBjb3B5OwotCi0JCSAgaG9sZCA9ICpwc3ltOwotCQkgIGZvciAocGNvcHkgPSBwc3ltOyBwY29weSA+IHBzeW1zZWM7IHBjb3B5LS0pCi0JCSAgICBwY29weVswXSA9IHBjb3B5Wy0xXTsKLQkJICAqcHN5bXNlYyA9IGhvbGQ7Ci0JCX0KLQkgICAgfQotCX0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLSAgICB9Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogWENPRkYgaGFuZGxlcyBvdmVyZmxvd3MgaW4gdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudCBmaWVsZHMKLSAgICAgYnkgY3JlYXRpbmcgYSBuZXcgc2VjdGlvbiBoZWFkZXIgdG8gaG9sZCB0aGUgY29ycmVjdCB2YWx1ZXMuICAqLwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQgPj0gMHhmZmZmIHx8IGN1cnJlbnQtPmxpbmVub19jb3VudCA+PSAweGZmZmYpCi0JewotCSAgc3RydWN0IGludGVybmFsX3NjbmhkciBzY25oZHI7Ci0JICBTQ05IRFIgYnVmZjsKLQotCSAgaW50ZXJuYWxfZi5mX25zY25zKys7Ci0JICBzdHJuY3B5ICgmKHNjbmhkci5zX25hbWVbMF0pLCBjdXJyZW50LT5uYW1lLCA4KTsKLQkgIHNjbmhkci5zX3BhZGRyID0gY3VycmVudC0+cmVsb2NfY291bnQ7Ci0JICBzY25oZHIuc192YWRkciA9IGN1cnJlbnQtPmxpbmVub19jb3VudDsKLQkgIHNjbmhkci5zX3NpemUgPSAwOwotCSAgc2NuaGRyLnNfc2NucHRyID0gMDsKLQkgIHNjbmhkci5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotCSAgc2NuaGRyLnNfbG5ub3B0ciA9IGN1cnJlbnQtPmxpbmVfZmlsZXBvczsKLQkgIHNjbmhkci5zX25yZWxvYyA9IGN1cnJlbnQtPnRhcmdldF9pbmRleDsKLQkgIHNjbmhkci5zX25sbm5vID0gY3VycmVudC0+dGFyZ2V0X2luZGV4OwotCSAgc2NuaGRyLnNfZmxhZ3MgPSBTVFlQX09WUkZMTzsKLQkgIGlmIChjb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgJnNjbmhkciwgJmJ1ZmYpID09IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICZidWZmLCAxLCBTQ05IU1osIGFiZmQpICE9IFNDTkhTWikKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICAvKiBPSywgbm93IHNldCB1cCB0aGUgZmlsZWhkci4uLiAqLwotCi0gIC8qIERvbid0IGluY2x1ZGUgdGhlIGludGVybmFsIGFicyBzZWN0aW9uIGluIHRoZSBzZWN0aW9uIGNvdW50ICovCi0KLSAgLyoKLSAgICAgV2Ugd2lsbCBOT1QgcHV0IGEgZnVja2luZyB0aW1lc3RhbXAgaW4gdGhlIGhlYWRlciBoZXJlLiBFdmVyeSB0aW1lIHlvdQotICAgICBwdXQgaXQgYmFjaywgSSB3aWxsIGNvbWUgaW4gYW5kIHRha2UgaXQgb3V0IGFnYWluLiAgSSdtIHNvcnJ5LiAgVGhpcwotICAgICBmaWVsZCBkb2VzIG5vdCBiZWxvbmcgaGVyZS4gIFdlIGZpbGwgaXQgd2l0aCBhIDAgc28gaXQgY29tcGFyZXMgdGhlCi0gICAgIHNhbWUgYnV0IGlzIG5vdCBhIHJlYXNvbmFibGUgdGltZS4gLS0gZ251QGN5Z251cy5jb20KLSAgICAgKi8KLSAgaW50ZXJuYWxfZi5mX3RpbWRhdCA9IDA7Ci0KLSAgaW50ZXJuYWxfZi5mX2ZsYWdzID0gMDsKLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgaW50ZXJuYWxfZi5mX29wdGhkciA9IEFPVVRTWjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludGVybmFsX2YuZl9vcHRoZHIgPSAwOwotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgICAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCi0JaW50ZXJuYWxfZi5mX29wdGhkciA9IEFPVVRTWjsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9mLmZfb3B0aGRyID0gU01BTExfQU9VVFNaOwotI2VuZGlmCi0gICAgfQotCi0gIGlmICghaGFzcmVsb2NzKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX1JFTEZMRzsKLSAgaWYgKCFoYXNsaW5ubykKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9MTk5POwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfRVhFQzsKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgaWYgKCEgaGFzZGVidWcpCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IElNQUdFX0ZJTEVfREVCVUdfU1RSSVBQRUQ7Ci0jZW5kaWYKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgaWYgKGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9BUjMyV1I7Ci0gIGVsc2UKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9BUjMyVzsKLSNlbmRpZgotCi0jaWZkZWYgVElDODBfVEFSR0VUX0lECi0gIGludGVybmFsX2YuZl90YXJnZXRfaWQgPSBUSUM4MF9UQVJHRVRfSUQ7Ci0jZW5kaWYKLQotICAvKgotICAgICBGSVhNRSwgc2hvdWxkIGRvIHNvbWV0aGluZyBhYm91dCB0aGUgb3RoZXIgYnl0ZSBvcmRlcnMgYW5kCi0gICAgIGFyY2hpdGVjdHVyZXMuCi0gICAgICovCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfU0hST0JKOwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIF9MT0FERVIpICE9IE5VTEwpCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfRFlOTE9BRDsKLSNlbmRpZgotCi0gIG1lbXNldCAoJmludGVybmFsX2EsIDAsIHNpemVvZiBpbnRlcm5hbF9hKTsKLQotICAvKiBTZXQgdXAgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBzdHVmZiAqLwotCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgbWFnaWMgPSAwOwotICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzID0gMDsKLSAgICBjb2ZmX3NldF9mbGFncyAoYWJmZCwgJm1hZ2ljLCAmZmxhZ3MpOwotICAgIGludGVybmFsX2YuZl9tYWdpYyA9IG1hZ2ljOwotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBmbGFnczsKLSAgICAvKiAuLi5hbmQgdGhlICJvcHQiaGRyLi4uICovCi0KLSNpZmRlZiBBMjlLCi0jaWZkZWYgVUxUUkEzCQkJLyogTllVJ3MgbWFjaGluZSAqLwotICAgIC8qIEZJWE1FOiBUaGlzIGlzIGEgYm9ndXMgY2hlY2suICBJIHJlYWxseSB3YW50IHRvIHNlZSBpZiB0aGVyZQotICAgICAqIGlzIGEgLnNoYnNzIG9yIGEgLnNoZGF0YSBzZWN0aW9uLCBpZiBzbyB0aGVuIHNldCB0aGUgbWFnaWMKLSAgICAgKiBudW1iZXIgdG8gaW5kaWNhdGUgYSBzaGFyZWQgZGF0YSBleGVjdXRhYmxlLgotICAgICAqLwotICAgIGlmIChpbnRlcm5hbF9mLmZfbnNjbnMgPj0gNykKLSAgICAgIGludGVybmFsX2EubWFnaWMgPSBTSE1BR0lDOyAvKiBTaGFyZWQgbWFnaWMgKi8KLSAgICBlbHNlCi0jZW5kaWYgLyogVUxUUkEzICovCi0gICAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTk1BR0lDOyAvKiBBc3N1bWUgc2VwYXJhdGUgaS9kICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmIC8qIEEyOUsgKi8KLSNpZmRlZiBUSUM4MENPRkYKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gVElDODBfQVJDSF9NQUdJQzsKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jZW5kaWYgLyogVElDODAgKi8KLSNpZmRlZiBJODYwCi0gICAgLyogRklYTUU6IFdoYXQgYXJlIHRoZSBhLm91dCBtYWdpYyBudW1iZXJzIGZvciB0aGUgaTg2MD8gICovCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IDA7Ci0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmIC8qIEk4NjAgKi8KLSNpZmRlZiBJOTYwCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IChtYWdpYyA9PSBJOTYwUk9NQUdJQyA/IE5NQUdJQyA6IE9NQUdJQyk7Ci0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmIC8qIEk5NjAgKi8KLSNpZiBNODgKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IFBBR0VNQUdJQ0JDUzsKLSNlbmRpZiAvKiBNODggKi8KLQotI2lmIEFQT0xMT19NNjgKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IEFQT0xMT19DT0ZGX1ZFUlNJT05fTlVNQkVSOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE02OCkgfHwgZGVmaW5lZChXRTMySykgfHwgZGVmaW5lZChNNjhLKQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNpZiBkZWZpbmVkKExZTlhPUykKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTFlOWENPRkZNQUdJQzsKLSNlbHNlCi0jaWYgZGVmaW5lZChUQVJHX0FVWCkKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gKGFiZmQtPmZsYWdzICYgRF9QQUdFRCA/IFBBR0VNQUdJQ1BFWEVDUEFHRUQgOgotCQkJYWJmZC0+ZmxhZ3MgJiBXUF9URVhUID8gUEFHRU1BR0lDUEVYRUNTV0FQUEVEIDoKLQkJCVBBR0VNQUdJQ0VYRUNTV0FQUEVEKTsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoUEFHRU1BR0lDUEVYRUNQQUdFRCkKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gUEFHRU1BR0lDUEVYRUNQQUdFRDsKLSNlbmRpZgotI2VuZGlmIC8qIFRBUkdfQVVYICovCi0jZW5kaWYgLyogTFlOWE9TICovCi0jZW5kaWYgLyogTTY4IHx8IFdFMzJLIHx8IE02OEsgKi8KLQotI2lmIGRlZmluZWQoQVJNKQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gWk1BR0lDOwotI2VuZGlmIAotCi0jaWYgZGVmaW5lZChQUENfUEUpCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSBJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUM7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgTUNPUkVfUEUKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQzsKLSNlbmRpZiAKLQotI2lmIGRlZmluZWQoSTM4NikKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jaWYgZGVmaW5lZChMWU5YT1MpCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IExZTlhDT0ZGTUFHSUM7Ci0jZWxzZSAgLyogTFlOWE9TICovCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IFpNQUdJQzsKLSNlbmRpZiAvKiBMWU5YT1MgKi8KLSNlbmRpZiAvKiBJMzg2ICovCi0KLSNpZiBkZWZpbmVkKFNQQVJDKQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNpZiBkZWZpbmVkKExZTlhPUykKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTFlOWENPRkZNQUdJQzsKLSNlbmRpZiAvKiBMWU5YT1MgKi8KLSNlbmRpZiAvKiBTUEFSQyAqLwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSA/IFJTNktfQU9VVEhEUl9aTUFHSUMgOgotICAgIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpID8gUlM2S19BT1VUSERSX05NQUdJQyA6Ci0gICAgUlM2S19BT1VUSERSX09NQUdJQzsKLSNlbmRpZgotCi0jaWZuZGVmIF9fQV9NQUdJQ19TRVRfXwotI2luY2x1ZGUgIllvdXIgYW91dGhkciBtYWdpYyBudW1iZXIgaXMgbm90IGJlaW5nIHNldCEiCi0jZWxzZQotI3VuZGVmIF9fQV9NQUdJQ19TRVRfXwotI2VuZGlmCi0gIH0KLQotICAvKiBGSVhNRTogRG9lcyBhbnlib2R5IGV2ZXIgc2V0IHRoaXMgdG8gYW5vdGhlciB2YWx1ZT8gICovCi0gIGludGVybmFsX2EudnN0YW1wID0gMDsKLQotICAvKiBOb3cgc2hvdWxkIHdyaXRlIHJlbG9jcywgc3RyaW5ncywgc3ltcyAqLwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gc3ltX2Jhc2U7Ci0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaW50IGZpcnN0dW5kZWY7Ci0jaWYgMAotICAgICAgaWYgKCFjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotICAgICAgaWYgKCFjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgKGFiZmQsICZmaXJzdHVuZGVmKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBjb2ZmX21hbmdsZV9zeW1ib2xzIChhYmZkKTsKLSAgICAgIGlmICghIGNvZmZfd3JpdGVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgY29mZl93cml0ZV9saW5lbnVtYmVycyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgY29mZl93cml0ZV9yZWxvY3MgKGFiZmQsIGZpcnN0dW5kZWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgZWxzZSBpZiAobG9uZ19zZWN0aW9uX25hbWVzKQotICAgIHsKLSAgICAgIC8qIElmIHdlIGhhdmUgbG9uZyBzZWN0aW9uIG5hbWVzIHdlIGhhdmUgdG8gd3JpdGUgb3V0IHRoZSBzdHJpbmcKLSAgICAgICAgIHRhYmxlIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCEgY29mZl93cml0ZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0jaWZkZWYgUFBDX1BFCi0gIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBiOwotCi0gICAgICAvKiBQb3dlclBDIFBFIGFwcGVhcnMgdG8gcmVxdWlyZSB0aGF0IGFsbCBleGVjdXRhYmxlIGZpbGVzIGJlCi0gICAgICAgICByb3VuZGVkIHVwIHRvIHRoZSBwYWdlIHNpemUuICAqLwotICAgICAgYiA9IDA7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICBCRkRfQUxJR04gKHN5bV9iYXNlLCBDT0ZGX1BBR0VfU0laRSkgLSAxLAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotI2VuZGlmCi0KLSAgLyogSWYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCwgdGhlbiB3ZSBhcmUgbm90IHVzaW5nIHRoZSBDT0ZGCi0gICAgIGJhY2tlbmQgbGlua2VyLCBhbmQgb2JqX3Jhd19zeW1lbnRfY291bnQgaXMgbm90IHZhbGlkIHVudGlsIGFmdGVyCi0gICAgIGNvZmZfd3JpdGVfc3ltYm9scyBpcyBjYWxsZWQuICAqLwotICBpZiAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaW50ZXJuYWxfZi5mX3N5bXB0ciA9IHN5bV9iYXNlOwotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgICAgLyogQUlYIGFwcGVhcnMgdG8gcmVxdWlyZSB0aGF0IEZfUkVMRkxHIG5vdCBiZSBzZXQgaWYgdGhlcmUgYXJlCi0gICAgICAgICBsb2NhbCBzeW1ib2xzIGJ1dCBubyByZWxvY2F0aW9ucy4gICovCi0gICAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgJj1+IEZfUkVMRkxHOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGxvbmdfc2VjdGlvbl9uYW1lcykKLQlpbnRlcm5hbF9mLmZfc3ltcHRyID0gc3ltX2Jhc2U7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfZi5mX3N5bXB0ciA9IDA7Ci0gICAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9MU1lNUzsKLSAgICB9Ci0KLSAgaWYgKHRleHRfc2VjKQotICAgIHsKLSAgICAgIGludGVybmFsX2EudHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHRleHRfc2VjKTsKLSAgICAgIGludGVybmFsX2EudGV4dF9zdGFydCA9IGludGVybmFsX2EudHNpemUgPyB0ZXh0X3NlYy0+dm1hIDogMDsKLSAgICB9Ci0gIGlmIChkYXRhX3NlYykKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9hLmRzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChkYXRhX3NlYyk7Ci0gICAgICBpbnRlcm5hbF9hLmRhdGFfc3RhcnQgPSBpbnRlcm5hbF9hLmRzaXplID8gZGF0YV9zZWMtPnZtYSA6IDA7Ci0gICAgfQotICBpZiAoYnNzX3NlYykKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9hLmJzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChic3Nfc2VjKTsKLSAgICAgIGlmIChpbnRlcm5hbF9hLmJzaXplICYmIGJzc19zZWMtPnZtYSA8IGludGVybmFsX2EuZGF0YV9zdGFydCkKLQlpbnRlcm5hbF9hLmRhdGFfc3RhcnQgPSBic3Nfc2VjLT52bWE7Ci0gICAgfQotCi0gIGludGVybmFsX2EuZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBpbnRlcm5hbF9mLmZfbnN5bXMgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCi0gICAgewotICAgICAgYmZkX3ZtYSB0b2M7Ci0gICAgICBhc2VjdGlvbiAqbG9hZGVyX3NlYzsKLQotICAgICAgaW50ZXJuYWxfYS52c3RhbXAgPSAxOwotCi0gICAgICBpbnRlcm5hbF9hLm9fc25lbnRyeSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5zbmVudHJ5OwotICAgICAgaWYgKGludGVybmFsX2Eub19zbmVudHJ5ID09IDApCi0JaW50ZXJuYWxfYS5lbnRyeSA9IChiZmRfdm1hKSAtMTsKLQotICAgICAgaWYgKHRleHRfc2VjICE9IE5VTEwpCi0JewotCSAgaW50ZXJuYWxfYS5vX3NudGV4dCA9IHRleHRfc2VjLT50YXJnZXRfaW5kZXg7Ci0JICBpbnRlcm5hbF9hLm9fYWxnbnRleHQgPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCB0ZXh0X3NlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludGVybmFsX2Eub19zbnRleHQgPSAwOwotCSAgaW50ZXJuYWxfYS5vX2FsZ250ZXh0ID0gMDsKLQl9Ci0gICAgICBpZiAoZGF0YV9zZWMgIT0gTlVMTCkKLQl7Ci0JICBpbnRlcm5hbF9hLm9fc25kYXRhID0gZGF0YV9zZWMtPnRhcmdldF9pbmRleDsKLQkgIGludGVybmFsX2Eub19hbGduZGF0YSA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIGRhdGFfc2VjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50ZXJuYWxfYS5vX3NuZGF0YSA9IDA7Ci0JICBpbnRlcm5hbF9hLm9fYWxnbmRhdGEgPSAwOwotCX0KLSAgICAgIGxvYWRlcl9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgICAgIGlmIChsb2FkZXJfc2VjICE9IE5VTEwpCi0JaW50ZXJuYWxfYS5vX3NubG9hZGVyID0gbG9hZGVyX3NlYy0+dGFyZ2V0X2luZGV4OwotICAgICAgZWxzZQotCWludGVybmFsX2Eub19zbmxvYWRlciA9IDA7Ci0gICAgICBpZiAoYnNzX3NlYyAhPSBOVUxMKQotCWludGVybmFsX2Eub19zbmJzcyA9IGJzc19zZWMtPnRhcmdldF9pbmRleDsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9hLm9fc25ic3MgPSAwOwotCi0gICAgICB0b2MgPSB4Y29mZl9kYXRhIChhYmZkKS0+dG9jOwotICAgICAgaW50ZXJuYWxfYS5vX3RvYyA9IHRvYzsKLSAgICAgIGludGVybmFsX2Eub19zbnRvYyA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5zbnRvYzsKLQotICAgICAgaW50ZXJuYWxfYS5vX21vZHR5cGUgPSB4Y29mZl9kYXRhIChhYmZkKS0+bW9kdHlwZTsKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSAhPSAtMSkKLQlpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5jcHV0eXBlOwotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKLQkgICAgICBpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLQkgICAgICBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSAwKQotCQlpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IDM7Ci0JICAgICAgZWxzZQotCQlpbnRlcm5hbF9hLm9fY3B1dHlwZSA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQl9Ci0gICAgICBpbnRlcm5hbF9hLm9fbWF4c3RhY2sgPSB4Y29mZl9kYXRhIChhYmZkKS0+bWF4c3RhY2s7Ci0gICAgICBpbnRlcm5hbF9hLm9fbWF4ZGF0YSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5tYXhkYXRhOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIG5vdyB3cml0ZSB0aGVtICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHsKLSAgICBjaGFyIGJ1ZmZbRklMSFNaXTsKLSAgICBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIChQVFIpICYgaW50ZXJuYWxfZiwgKFBUUikgYnVmZik7Ci0gICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZiwgMSwgRklMSFNaLCBhYmZkKSAhPSBGSUxIU1opCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIHsKLSAgICAgIC8qIE5vdGUgdGhhdCBwZWljb2RlLmggZmlsbHMgaW4gYSBQRUFPVVRIRFIsIG5vdCBhbiBBT1VUSERSLiAKLQkgaW5jbHVkZS9jb2ZmL3BlLmggc2V0cyBBT1VUU1ogPT0gc2l6ZW9mKFBFQU9VVEhEUikpICovCi0gICAgICBjaGFyIGJ1ZmZbQU9VVFNaXTsKLSAgICAgIGNvZmZfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgKFBUUikgJiBpbnRlcm5hbF9hLCAoUFRSKSBidWZmKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmYsIDEsIEFPVVRTWiwgYWJmZCkgIT0gQU9VVFNaKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGVsc2UKLSAgICB7Ci0gICAgICBBT1VUSERSIGJ1ZmY7Ci0gICAgICBzaXplX3Qgc2l6ZTsKLQotICAgICAgLyogWENPRkYgc2VlbXMgdG8gYWx3YXlzIHdyaXRlIGF0IGxlYXN0IGEgc21hbGwgYS5vdXQgaGVhZGVyLiAgKi8KLSAgICAgIGNvZmZfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgKFBUUikgJmludGVybmFsX2EsIChQVFIpICZidWZmKTsKLSAgICAgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotCXNpemUgPSBBT1VUU1o7Ci0gICAgICBlbHNlCi0Jc2l6ZSA9IFNNQUxMX0FPVVRTWjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICZidWZmLCAxLCBzaXplLCBhYmZkKSAhPSBzaXplKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkJLyogc2V0IGJ5IGJmZC5jIGhhbmRsZXIgKi8KLSAgICB7Ci0gICAgICBpZiAoISBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmIGRlZmluZWQoX0xJQikgJiYgIWRlZmluZWQoVEFSR19BVVgpCi0KLSAgIC8qIFRoZSBwaHlzaWNhbCBhZGRyZXNzIGZpZWxkIG9mIGEgLmxpYiBzZWN0aW9uIGlzIHVzZWQgdG8gaG9sZCB0aGUKLSAgICAgIG51bWJlciBvZiBzaGFyZWQgbGlicmFyaWVzIGluIHRoZSBzZWN0aW9uLiAgVGhpcyBjb2RlIGNvdW50cyB0aGUKLSAgICAgIG51bWJlciBvZiBzZWN0aW9ucyBiZWluZyB3cml0dGVuLCBhbmQgaW5jcmVtZW50cyB0aGUgbG1hIGZpZWxkCi0gICAgICB3aXRoIHRoZSBudW1iZXIuCi0KLSAgICAgIEkgaGF2ZSBmb3VuZCBubyBkb2N1bWVudGF0aW9uIG9uIHRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24uCi0gICAgICBFeHBlcmltZW50YXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlIHNlY3Rpb24gY29udGFpbnMgemVybyBvciBtb3JlCi0gICAgICByZWNvcmRzLCBlYWNoIG9mIHdoaWNoIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLQotICAgICAgLSBhIChmb3VyIGJ5dGUpIHdvcmQgaG9sZGluZyB0aGUgbGVuZ3RoIG9mIHRoaXMgcmVjb3JkLCBpbiB3b3JkcywKLSAgICAgIC0gYSB3b3JkIHRoYXQgYWx3YXlzIHNlZW1zIHRvIGJlIHNldCB0byAiMiIsCi0gICAgICAtIHRoZSBwYXRoIHRvIGEgc2hhcmVkIGxpYnJhcnksIG51bGwtdGVybWluYXRlZCBhbmQgdGhlbiBwYWRkZWQKLSAgICAgICAgdG8gYSB3aG9sZSB3b3JkIGJvdW5kYXJ5LgotCi0gICAgICBiZmRfYXNzZXJ0IGNhbGxzIGhhdmUgYmVlbiBhZGRlZCB0byBhbGVydCBpZiBhbiBhdHRlbXB0IGlzIG1hZGUKLSAgICAgIHRvIHdyaXRlIGEgc2VjdGlvbiB3aGljaCBkb2Vzbid0IGZvbGxvdyB0aGVzZSBhc3N1bXB0aW9ucy4gIFRoZQotICAgICAgY29kZSBoYXMgYmVlbiB0ZXN0ZWQgb24gSVNDIDQuMSBieSBtZSwgYW5kIG9uIFNDTyBieSBSb2JlcnQgTGlwZQotICAgICAgPHJvYmVydGxAYXJuZXQuY29tPiAoVGhhbmtzISkuCi0gIAotICAgICAgR3ZyYW4gVWRkZWJvcmcgPGd2cmFuQHVkZGVib3JnLnBwLnNlPiAqLwotCi0gICAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJQikgPT0gMCkKLSAgICAgIHsKLQliZmRfYnl0ZSAqcmVjLCAqcmVjZW5kOwotCi0JcmVjID0gKGJmZF9ieXRlICopIGxvY2F0aW9uOwotCXJlY2VuZCA9IHJlYyArIGNvdW50OwotCXdoaWxlIChyZWMgPCByZWNlbmQpCi0JICB7Ci0JICAgICsrc2VjdGlvbi0+bG1hOwotCSAgICByZWMgKz0gYmZkX2dldF8zMiAoYWJmZCwgcmVjKSAqIDQ7Ci0JICB9Ci0KLQlCRkRfQVNTRVJUIChyZWMgPT0gcmVjZW5kKTsKLSAgICAgIH0KLQotI2VuZGlmCi0KLSAgLyogRG9uJ3Qgd3JpdGUgb3V0IGJzcyBzZWN0aW9ucyAtIG9uZSB3YXkgdG8gZG8gdGhpcyBpcyB0bwotICAgICAgIHNlZSBpZiB0aGUgZmlsZXBvcyBoYXMgbm90IGJlZW4gc2V0LiAqLwotICBpZiAoc2VjdGlvbi0+ZmlsZXBvcyA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCksIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSA9PSBjb3VudCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLSNpZiAwCi1zdGF0aWMgYm9vbGVhbgotY29mZl9jbG9zZV9hbmRfY2xlYW51cCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIWJmZF9yZWFkX3AgKGFiZmQpKQotICAgIHN3aXRjaCAoYWJmZC0+Zm9ybWF0KQotICAgICAgewotICAgICAgY2FzZSBiZmRfYXJjaGl2ZToKLQlpZiAoIV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyAoYWJmZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9vYmplY3Q6Ci0JaWYgKCFjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gIC8qIFdlIGRlcGVuZCBvbiBiZmRfY2xvc2UgdG8gZnJlZSBhbGwgdGhlIG1lbW9yeSBvbiB0aGUgb2JqYWxsb2MuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBQVFIKLWJ1eV9hbmRfcmVhZCAoYWJmZCwgd2hlcmUsIHNlZWtfZGlyZWN0aW9uLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyIHdoZXJlOwotICAgICBpbnQgc2Vla19kaXJlY3Rpb247Ci0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgYXJlYSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gIGlmICghYXJlYSkKLSAgICByZXR1cm4gKE5VTEwpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHdoZXJlLCBzZWVrX2RpcmVjdGlvbikgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGFyZWEsIDEsIHNpemUsIGFiZmQpICE9IHNpemUpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgcmV0dXJuIChhcmVhKTsKLX0JCQkJLyogYnV5X2FuZF9yZWFkKCkgKi8KLQotLyoKLVNVQlNVQlNFQ1RJT04KLQlSZWFkaW5nIGxpbmVudW1iZXJzCi0KLQlDcmVhdGluZyB0aGUgbGluZW51bWJlciB0YWJsZSBpcyBkb25lIGJ5IHJlYWRpbmcgaW4gdGhlIGVudGlyZQotCWNvZmYgbGluZW51bWJlciB0YWJsZSwgYW5kIGNyZWF0aW5nIGFub3RoZXIgdGFibGUgZm9yIGludGVybmFsIHVzZS4KLQotCUEgY29mZiBsaW5lbnVtYmVyIHRhYmxlIGlzIHN0cnVjdHVyZWQgc28gdGhhdCBlYWNoIGZ1bmN0aW9uCi0JaXMgbWFya2VkIGFzIGhhdmluZyBhIGxpbmUgbnVtYmVyIG9mIDAuIEVhY2ggbGluZSB3aXRoaW4gdGhlCi0JZnVuY3Rpb24gaXMgYW4gb2Zmc2V0IGZyb20gdGhlIGZpcnN0IGxpbmUgaW4gdGhlIGZ1bmN0aW9uLiBUaGUKLQliYXNlIG9mIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIHRhYmxlIGlzIHN0b3JlZCBpbgotCXRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbi4KLQotCU5vdGU6IFRoZSBQRSBmb3JtYXQgdXNlcyBsaW5lIG51bWJlciAwIGZvciBhIGZsYWcgaW5kaWNhdGluZyBhCi0JbmV3IHNvdXJjZSBmaWxlLgotCi0JVGhlIGluZm9ybWF0aW9uIGlzIGNvcGllZCBmcm9tIHRoZSBleHRlcm5hbCB0byB0aGUgaW50ZXJuYWwKLQl0YWJsZSwgYW5kIGVhY2ggc3ltYm9sIHdoaWNoIG1hcmtzIGEgZnVuY3Rpb24gaXMgbWFya2VkIGJ5Ci0JcG9pbnRpbmcgaXRzLi4uCi0KLQlIb3cgZG9lcyB0aGlzIHdvcmsgPwotCi0qLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zbHVycF9saW5lX3RhYmxlIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci17Ci0gIExJTkVOTyAqbmF0aXZlX2xpbmVubzsKLSAgYWxlbnQgKmxpbmVub19jYWNoZTsKLQotICBCRkRfQVNTRVJUIChhc2VjdC0+bGluZW5vID09IChhbGVudCAqKSBOVUxMKTsKLQotICBuYXRpdmVfbGluZW5vID0gKExJTkVOTyAqKSBidXlfYW5kX3JlYWQgKGFiZmQsCi0JCQkJCSAgIGFzZWN0LT5saW5lX2ZpbGVwb3MsCi0JCQkJCSAgIFNFRUtfU0VULAotCQkJCQkgICAoc2l6ZV90KSAoTElORVNaICoKLQkJCQkJCSAgICAgYXNlY3QtPmxpbmVub19jb3VudCkpOwotICBsaW5lbm9fY2FjaGUgPQotICAgIChhbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIChzaXplX3QpICgoYXNlY3QtPmxpbmVub19jb3VudCArIDEpICogc2l6ZW9mIChhbGVudCkpKTsKLSAgaWYgKGxpbmVub19jYWNoZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLSAgICAgIGFsZW50ICpjYWNoZV9wdHIgPSBsaW5lbm9fY2FjaGU7Ci0gICAgICBMSU5FTk8gKnNyYyA9IG5hdGl2ZV9saW5lbm87Ci0KLSAgICAgIHdoaWxlIChjb3VudGVyIDwgYXNlY3QtPmxpbmVub19jb3VudCkKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vIGRzdDsKLQkgIGNvZmZfc3dhcF9saW5lbm9faW4gKGFiZmQsIHNyYywgJmRzdCk7Ci0JICBjYWNoZV9wdHItPmxpbmVfbnVtYmVyID0gZHN0LmxfbG5ubzsKLQotCSAgaWYgKGNhY2hlX3B0ci0+bGluZV9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gd2FybmVkOwotCSAgICAgIGxvbmcgc3ltbmR4OwotCSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKnN5bTsKLQotCSAgICAgIHdhcm5lZCA9IGZhbHNlOwotCSAgICAgIHN5bW5keCA9IGRzdC5sX2FkZHIubF9zeW1uZHg7Ci0JICAgICAgaWYgKHN5bW5keCA8IDAKLQkJICB8fCAodW5zaWduZWQgbG9uZykgc3ltbmR4ID49IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gbGluZSBudW1iZXJzIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGRzdC5sX2FkZHIubF9zeW1uZHgpOwotCQkgIHN5bW5keCA9IDA7Ci0JCSAgd2FybmVkID0gdHJ1ZTsKLQkJfQotCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgbm90IGJlIGNhc3RpbmcgYmV0d2VlbiBpbnRzIGFuZAotICAgICAgICAgICAgICAgICBwb2ludGVycyBsaWtlIHRoaXMuICAqLwotCSAgICAgIHN5bSA9ICgoY29mZl9zeW1ib2xfdHlwZSAqKQotCQkgICAgICgoc3ltbmR4ICsgb2JqX3Jhd19zeW1lbnRzIChhYmZkKSkKLQkJICAgICAgLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcykpOwotCSAgICAgIGNhY2hlX3B0ci0+dS5zeW0gPSAoYXN5bWJvbCAqKSBzeW07Ci0JICAgICAgaWYgKHN5bS0+bGluZW5vICE9IE5VTEwgJiYgISB3YXJuZWQpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogd2FybmluZzogZHVwbGljYXRlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBgJXMnIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCSAgICAgYmZkX2FzeW1ib2xfbmFtZSAoJnN5bS0+c3ltYm9sKSk7Ci0JCX0KLQkgICAgICBzeW0tPmxpbmVubyA9IGNhY2hlX3B0cjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2FjaGVfcHRyLT51Lm9mZnNldCA9IGRzdC5sX2FkZHIubF9wYWRkcgotCQktIGJmZF9zZWN0aW9uX3ZtYSAoYWJmZCwgYXNlY3QpOwotCSAgICB9CQkJLyogSWYgbm8gbGluZW51bWJlciBleHBlY3QgYSBzeW1ib2wgaW5kZXggKi8KLQotCSAgY2FjaGVfcHRyKys7Ci0JICBzcmMrKzsKLQkgIGNvdW50ZXIrKzsKLQl9Ci0gICAgICBjYWNoZV9wdHItPmxpbmVfbnVtYmVyID0gMDsKLQotICAgIH0KLSAgYXNlY3QtPmxpbmVubyA9IGxpbmVub19jYWNoZTsKLSAgLyogRklYTUUsIGZyZWUgbmF0aXZlX2xpbmVubyBoZXJlLCBvciB1c2UgYWxsb2NhIG9yIHNvbWV0aGluZy4gKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNsdXJwIGluIHRoZSBzeW1ib2wgdGFibGUsIGNvbnZlcnRpbmcgaXQgdG8gZ2VuZXJpYyBmb3JtLiAgTm90ZQotICAgdGhhdCBpZiBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gaXMgZGVmaW5lZCwgdGhlIGxpbmtlciB3aWxsIHJlYWQKLSAgIHN5bWJvbHMgdmlhIGNvZmZfbGlua19hZGRfc3ltYm9scywgcmF0aGVyIHRoYW4gdmlhIHRoaXMgcm91dGluZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlX3N5bWJvbHM7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKmNhY2hlZF9hcmVhOwotICB1bnNpZ25lZCBpbnQgKnRhYmxlX3B0cjsKLQotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX3N5bWJvbHMgPSAwOwotCi0gIGlmIChvYmpfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlICovCi0gIGlmICgobmF0aXZlX3N5bWJvbHMgPSBjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiAoYWJmZCkpID09IE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgfQkJCQkvKiBvbiBlcnJvciAqLwotCi0gIC8qIEFsbG9jYXRlIGVub3VnaCByb29tIGZvciBhbGwgdGhlIHN5bWJvbHMgaW4gY2FjaGVkIGZvcm0gKi8KLSAgY2FjaGVkX2FyZWEgPSAoKGNvZmZfc3ltYm9sX3R5cGUgKikKLQkJIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgICAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpCi0JCQkgICAgICogc2l6ZW9mIChjb2ZmX3N5bWJvbF90eXBlKSkpKTsKLQotICBpZiAoY2FjaGVkX2FyZWEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHRhYmxlX3B0ciA9ICgodW5zaWduZWQgaW50ICopCi0JICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKQotCQkJICAgKiBzaXplb2YgKHVuc2lnbmVkIGludCkpKSk7Ci0KLSAgaWYgKHRhYmxlX3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmRzdCA9IGNhY2hlZF9hcmVhOwotICAgICAgdW5zaWduZWQgaW50IGxhc3RfbmF0aXZlX2luZGV4ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOwotICAgICAgdW5zaWduZWQgaW50IHRoaXNfaW5kZXggPSAwOwotICAgICAgd2hpbGUgKHRoaXNfaW5kZXggPCBsYXN0X25hdGl2ZV9pbmRleCkKLQl7Ci0JICBjb21iaW5lZF9lbnRyeV90eXBlICpzcmMgPSBuYXRpdmVfc3ltYm9scyArIHRoaXNfaW5kZXg7Ci0JICB0YWJsZV9wdHJbdGhpc19pbmRleF0gPSBudW1iZXJfb2Zfc3ltYm9sczsKLQkgIGRzdC0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCi0JICBkc3QtPnN5bWJvbC5uYW1lID0gKGNoYXIgKikgKHNyYy0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQpOwotCSAgLyogV2UgdXNlIHRoZSBuYXRpdmUgbmFtZSBmaWVsZCB0byBwb2ludCB0byB0aGUgY2FjaGVkIGZpZWxkLiAgKi8KLQkgIHNyYy0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAobG9uZykgZHN0OwotCSAgZHN0LT5zeW1ib2wuc2VjdGlvbiA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwKLQkJCQkJCSAgICAgc3JjLT51LnN5bWVudC5uX3NjbnVtKTsKLQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gMDsKLQkgIGRzdC0+ZG9uZV9saW5lbm8gPSBmYWxzZTsKLQotCSAgc3dpdGNoIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzKQotCSAgICB7Ci0jaWZkZWYgSTk2MAotCSAgICBjYXNlIENfTEVBRkVYVDoKLSNpZiAwCi0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWUgLSBkc3QtPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTDsKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfTk9UX0FUX0VORCB8IEJTRl9GVU5DVElPTjsKLSNlbmRpZgotCSAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byBuZXh0IGNhc2UgKi8KLQotI2VuZGlmCi0KLQkgICAgY2FzZSBDX0VYVDoKLQkgICAgY2FzZSBDX1dFQUtFWFQ6Ci0jaWYgZGVmaW5lZCBBUk0KLSAgICAgICAgICAgIGNhc2UgQ19USFVNQkVYVDoKLSAgICAgICAgICAgIGNhc2UgQ19USFVNQkVYVEZVTkM6Ci0jZW5kaWYKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQkgICAgY2FzZSBDX0hJREVYVDoKLSNlbmRpZgotI2lmZGVmIENfU1lTVEVNCi0JICAgIGNhc2UgQ19TWVNURU06CS8qIFN5c3RlbSBXaWRlIHZhcmlhYmxlICovCi0jZW5kaWYKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgICAgICAgIC8qIEluIFBFLCAweDY4ICgxMDQpIGRlbm90ZXMgYSBzZWN0aW9uIHN5bWJvbCAqLwotICAgICAgICAgICAgY2FzZSBDX1NFQ1RJT046Ci0JICAgIC8qIEluIFBFLCAweDY5ICgxMDUpIGRlbm90ZXMgYSB3ZWFrIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0JICAgICAgc3dpdGNoIChjb2ZmX2NsYXNzaWZ5X3N5bWJvbCAoYWJmZCwgJnNyYy0+dS5zeW1lbnQpKQotCQl7Ci0JCWNhc2UgQ09GRl9TWU1CT0xfR0xPQkFMOgotCQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUw7Ci0jaWYgZGVmaW5lZCBDT0ZGX1dJVEhfUEUKLQkJICAvKiBQRSBzZXRzIHRoZSBzeW1ib2wgdG8gYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgKi8KLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLSNlbHNlCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCQkJICAgICAgIC0gZHN0LT5zeW1ib2wuc2VjdGlvbi0+dm1hKTsKLSNlbmRpZgotCQkgIGlmIChJU0ZDTiAoKHNyYy0+dS5zeW1lbnQubl90eXBlKSkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEEgZnVuY3Rpb24gZXh0IGRvZXMgbm90IGdvIGF0IHRoZSBlbmQgb2YgYQotCQkJIGZpbGUuICAqLwotCQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfTk9UX0FUX0VORCB8IEJTRl9GVU5DVElPTjsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlIENPRkZfU1lNQk9MX0NPTU1PTjoKLQkJICBkc3QtPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLQkJICBicmVhazsKLQotCQljYXNlIENPRkZfU1lNQk9MX1VOREVGSU5FRDoKLQkJICBkc3QtPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IDA7Ci0JCSAgYnJlYWs7IAotCi0JCWNhc2UgQ09GRl9TWU1CT0xfUEVfU0VDVElPTjoKLQkJICBkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfRVhQT1JUIHwgQlNGX1NFQ1RJT05fU1lNOwotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gMDsKLQkJICBicmVhazsKLQotCQljYXNlIENPRkZfU1lNQk9MX0xPQ0FMOgotCQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCi0JCSAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgc2VjdGlvbi4gICovCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0jZWxzZQotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZQotCQkJCSAgICAgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7Ci0jZW5kaWYKLQkJICBpZiAoSVNGQ04gKChzcmMtPnUuc3ltZW50Lm5fdHlwZSkpKQotCQkgICAgZHN0LT5zeW1ib2wuZmxhZ3MgfD0gQlNGX05PVF9BVF9FTkQgfCBCU0ZfRlVOQ1RJT047Ci0JCSAgYnJlYWs7Ci0JCX0KLQotI2lmZGVmIFJTNjAwMENPRkZfQwotCSAgICAgIC8qIEEgc3ltYm9sIHdpdGggYSBjc2VjdCBlbnRyeSBzaG91bGQgbm90IGdvIGF0IHRoZSBlbmQuICAqLwotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgfD0gQlNGX05PVF9BVF9FTkQ7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfTlRfV0VBSykKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1NFQ1RJT04KLQkJICAmJiBzcmMtPnUuc3ltZW50Lm5fc2NudW0gPiAwKQotCQl7Ci0JCSAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JCX0KLSNlbmRpZgotCi0JICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19XRUFLRVhUKQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX1NUQVQ6CS8qIHN0YXRpYwkJCSAqLwotI2lmZGVmIEk5NjAKLQkgICAgY2FzZSBDX0xFQUZTVEFUOgkvKiBzdGF0aWMgbGVhZiBwcm9jZWR1cmUgICAgICAgICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkIEFSTSAKLSAgICAgICAgICAgIGNhc2UgQ19USFVNQlNUQVQ6ICAgLyogVGh1bWIgc3RhdGljICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNhc2UgQ19USFVNQkxBQkVMOiAgLyogVGh1bWIgbGFiZWwgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNhc2UgQ19USFVNQlNUQVRGVU5DOi8qIFRodW1iIHN0YXRpYyBmdW5jdGlvbiAgICAgICAgKi8KLSNlbmRpZgotCSAgICBjYXNlIENfTEFCRUw6CS8qIGxhYmVsCQkJICovCi0JICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY251bSA9PSBOX0RFQlVHKQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZWxzZQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLQotCSAgICAgIC8qIEJhc2UgdGhlIHZhbHVlIGFzIGFuIGluZGV4IGZyb20gdGhlIGJhc2Ugb2YgdGhlCi0JCSBzZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUuICAqLwotCSAgICAgIGlmIChkc3QtPnN5bWJvbC5zZWN0aW9uKQotCQl7Ci0jaWYgZGVmaW5lZCBDT0ZGX1dJVEhfUEUKLQkJICAvKiBQRSBzZXRzIHRoZSBzeW1ib2wgdG8gYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgKi8KLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLSNlbHNlCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCQkJICAgICAgIC0gZHN0LT5zeW1ib2wuc2VjdGlvbi0+dm1hKTsKLSNlbmRpZgotCQl9Ci0JICAgICAgZWxzZQotCQlkc3QtPnN5bWJvbC52YWx1ZSA9IHNyYy0+dS5zeW1lbnQubl92YWx1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfTU9TOgkvKiBtZW1iZXIgb2Ygc3RydWN0dXJlCSAqLwotCSAgICBjYXNlIENfRU9TOgkvKiBlbmQgb2Ygc3RydWN0dXJlCQkgKi8KLSNpZmRlZiBOT1RERUYJCQkvKiBDX0FVVE9BUkcgaGFzIHRoZSBzYW1lIHZhbHVlICovCi0jaWZkZWYgQ19HTEJMUkVHCi0JICAgIGNhc2UgQ19HTEJMUkVHOgkvKiBBMjlrLXNwZWNpZmljIHN0b3JhZ2UgY2xhc3MgKi8KLSNlbmRpZgotI2VuZGlmCi0JICAgIGNhc2UgQ19SRUdQQVJNOgkvKiByZWdpc3RlciBwYXJhbWV0ZXIJCSAqLwotCSAgICBjYXNlIENfUkVHOgkvKiByZWdpc3RlciB2YXJpYWJsZQkJICovCi0jaWZuZGVmIFRJQzgwQ09GRgotI2lmZGVmIENfQVVUT0FSRwotCSAgICBjYXNlIENfQVVUT0FSRzoJLyogOTYwLXNwZWNpZmljIHN0b3JhZ2UgY2xhc3MgKi8KLSNlbmRpZgotI2VuZGlmCi0JICAgIGNhc2UgQ19UUERFRjoJLyogdHlwZSBkZWZpbml0aW9uCQkgKi8KLQkgICAgY2FzZSBDX0FSRzoKLQkgICAgY2FzZSBDX0FVVE86CS8qIGF1dG9tYXRpYyB2YXJpYWJsZSAqLwotCSAgICBjYXNlIENfRklFTEQ6CS8qIGJpdCBmaWVsZCAqLwotCSAgICBjYXNlIENfRU5UQUc6CS8qIGVudW1lcmF0aW9uIHRhZwkJICovCi0JICAgIGNhc2UgQ19NT0U6CS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbgkgKi8KLQkgICAgY2FzZSBDX01PVToJLyogbWVtYmVyIG9mIHVuaW9uCQkgKi8KLQkgICAgY2FzZSBDX1VOVEFHOgkvKiB1bmlvbiB0YWcJCQkgKi8KLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfRklMRToJLyogZmlsZSBuYW1lCQkJICovCi0JICAgIGNhc2UgQ19TVFJUQUc6CS8qIHN0cnVjdHVyZSB0YWcJCSAqLwotI2lmZGVmIFJTNjAwMENPRkZfQwotCSAgICBjYXNlIENfR1NZTToKLQkgICAgY2FzZSBDX0xTWU06Ci0JICAgIGNhc2UgQ19QU1lNOgotCSAgICBjYXNlIENfUlNZTToKLQkgICAgY2FzZSBDX1JQU1lNOgotCSAgICBjYXNlIENfU1RTWU06Ci0JICAgIGNhc2UgQ19CQ09NTToKLQkgICAgY2FzZSBDX0VDT01NOgotCSAgICBjYXNlIENfREVDTDoKLQkgICAgY2FzZSBDX0VOVFJZOgotCSAgICBjYXNlIENfRlVOOgotCSAgICBjYXNlIENfRVNUQVQ6Ci0jZW5kaWYKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBicmVhazsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotCSAgICBjYXNlIENfQklOQ0w6CS8qIGJlZ2lubmluZyBvZiBpbmNsdWRlIGZpbGUgICAgICovCi0JICAgIGNhc2UgQ19FSU5DTDoJLyogZW5kaW5nIG9mIGluY2x1ZGUgZmlsZSAgICAgICAgKi8KLQkgICAgICAvKiBUaGUgdmFsdWUgaXMgYWN0dWFsbHkgYSBwb2ludGVyIGludG8gdGhlIGxpbmUgbnVtYmVycwotICAgICAgICAgICAgICAgICBvZiB0aGUgZmlsZS4gIFdlIGxvY2F0ZSB0aGUgbGluZSBudW1iZXIgZW50cnksIGFuZAotICAgICAgICAgICAgICAgICBzZXQgdGhlIHNlY3Rpb24gdG8gdGhlIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgaXQsIGFuZAotICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGhlIGluZGV4IGluIHRoYXQgc2VjdGlvbi4gICovCi0JICAgICAgewotCQlhc2VjdGlvbiAqc2VjOwotCi0JCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQkJZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLQkJICBpZiAoc2VjLT5saW5lX2ZpbGVwb3MgPD0gKGZpbGVfcHRyKSBzcmMtPnUuc3ltZW50Lm5fdmFsdWUKLQkJICAgICAgJiYgKChmaWxlX3B0cikgKHNlYy0+bGluZV9maWxlcG9zCi0JCQkJICAgICAgKyBzZWMtPmxpbmVub19jb3VudCAqIExJTkVTWikKLQkJCSAgPiAoZmlsZV9wdHIpIHNyYy0+dS5zeW1lbnQubl92YWx1ZSkpCi0JCSAgICBicmVhazsKLQkJaWYgKHNlYyA9PSBOVUxMKQotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gMDsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGRzdC0+c3ltYm9sLnNlY3Rpb24gPSBzZWM7Ci0JCSAgICBkc3QtPnN5bWJvbC52YWx1ZSA9ICgoc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCQkJCSAgLSBzZWMtPmxpbmVfZmlsZXBvcykKLQkJCQkJIC8gTElORVNaKTsKLQkJICAgIHNyYy0+Zml4X2xpbmUgPSAxOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX0JTVEFUOgotCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQotCSAgICAgIC8qIFRoZSB2YWx1ZSBpcyBhY3R1YWxseSBhIHN5bWJvbCBpbmRleC4gIFNhdmUgYSBwb2ludGVyCi0JCSB0byB0aGUgc3ltYm9sIGluc3RlYWQgb2YgdGhlIGluZGV4LiAgRklYTUU6IFRoaXMKLQkJIHNob3VsZCB1c2UgYSB1bmlvbi4gICovCi0JICAgICAgc3JjLT51LnN5bWVudC5uX3ZhbHVlID0KLQkJKGxvbmcpIChuYXRpdmVfc3ltYm9scyArIHNyYy0+dS5zeW1lbnQubl92YWx1ZSk7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICAgICAgc3JjLT5maXhfdmFsdWUgPSAxOwotCSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLQkgICAgY2FzZSBDX0JMT0NLOgkvKiAiLmJiIiBvciAiLmViIgkJICovCi0JICAgIGNhc2UgQ19GQ046CQkvKiAiLmJmIiBvciAiLmVmIiAob3IgUEUgIi5sZiIpCSAqLwotCSAgICBjYXNlIENfRUZDTjoJLyogcGh5c2ljYWwgZW5kIG9mIGZ1bmN0aW9uCSAqLwotI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCi0JICAgICAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0Ci0JCSBvZiB0aGUgc2VjdGlvbi4gICovCi0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICAgICAgaWYgKHN0cmNtcCAoZHN0LT5zeW1ib2wubmFtZSwgIi5iZiIpICE9IDApCi0JCXsKLQkJICAvKiBQRSB1c2VzIGZ1bm55IHZhbHVlcyBmb3IgLmVmIGFuZCAubGY7IGRvbid0Ci0gICAgICAgICAgICAgICAgICAgICByZWxvY2F0ZSB0aGVtLiAgKi8KLQkJICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORyB8IEJTRl9ERUJVR0dJTkdfUkVMT0M7Ci0jZWxzZQotCSAgICAgIC8qIEJhc2UgdGhlIHZhbHVlIGFzIGFuIGluZGV4IGZyb20gdGhlIGJhc2Ugb2YgdGhlCi0JCSBzZWN0aW9uLiAgKi8KLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKLQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IChzcmMtPnUuc3ltZW50Lm5fdmFsdWUKLQkJCQkgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7Ci0jZW5kaWYKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfTlVMTDoKLQkgICAgICAvKiBQRSBETExzIHNvbWV0aW1lcyBoYXZlIHplcm9lZCBvdXQgc3ltYm9scyBmb3Igc29tZQotICAgICAgICAgICAgICAgICByZWFzb24uICBKdXN0IGlnbm9yZSB0aGVtIHdpdGhvdXQgYSB3YXJuaW5nLiAgKi8KLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX3R5cGUgPT0gMAotCQkgICYmIHNyYy0+dS5zeW1lbnQubl92YWx1ZSA9PSAwCi0JCSAgJiYgc3JjLT51LnN5bWVudC5uX3NjbnVtID09IDApCi0JCWJyZWFrOwotCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgIGNhc2UgQ19FWFRERUY6CS8qIGV4dGVybmFsIGRlZmluaXRpb24JCSAqLwotCSAgICBjYXNlIENfVUxBQkVMOgkvKiB1bmRlZmluZWQgbGFiZWwJCSAqLwotCSAgICBjYXNlIENfVVNUQVRJQzoJLyogdW5kZWZpbmVkIHN0YXRpYwkJICovCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAgICAgICAgICAgLyogQ19MSU5FIGluIHJlZ3VsYXIgY29mZiBpcyAweDY4LiAgTlQgaGFzIHRha2VuIG92ZXIgdGhpcyBzdG9yYWdlCi0gICAgICAgICAgICAgICBjbGFzcyB0byByZXByZXNlbnQgYSBzZWN0aW9uIHN5bWJvbCAqLwotCSAgICBjYXNlIENfTElORToJLyogbGluZSAjIHJlZm9ybWF0dGVkIGFzIHN5bWJvbCB0YWJsZSBlbnRyeSAqLwotCSAgICAgIC8qIE5UIHVzZXMgMHg2NyBmb3IgYSB3ZWFrIHN5bWJvbCwgbm90IENfQUxJQVMuICAqLwotCSAgICBjYXNlIENfQUxJQVM6CS8qIGR1cGxpY2F0ZSB0YWcJCSAqLwotI2VuZGlmCi0JICAgICAgLyogTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgVEljODAgKi8KLSNpZmRlZiBUSUM4MENPRkYKLQkgICAgY2FzZSBDX1VFWFQ6CS8qIFRlbnRhdGl2ZSBleHRlcm5hbCBkZWZpbml0aW9uICovCi0jZW5kaWYKLQkgICAgY2FzZSBDX1NUQVRMQUI6CS8qIFN0YXRpYyBsb2FkIHRpbWUgbGFiZWwgKi8KLQkgICAgY2FzZSBDX0VYVExBQjoJLyogRXh0ZXJuYWwgbG9hZCB0aW1lIGxhYmVsICovCi0JICAgIGNhc2UgQ19ISURERU46CS8qIGV4dCBzeW1ib2wgaW4gZG1lcnQgcHVibGljIGxpYiAqLwotCSAgICBkZWZhdWx0OgotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IFVucmVjb2duaXplZCBzdG9yYWdlIGNsYXNzICVkIGZvciAlcyBzeW1ib2wgYCVzJyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHNyYy0+dS5zeW1lbnQubl9zY2xhc3MsCi0JCSBkc3QtPnN5bWJvbC5zZWN0aW9uLT5uYW1lLCBkc3QtPnN5bWJvbC5uYW1lKTsKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0vKiAgICAgIEJGRF9BU1NFUlQoZHN0LT5zeW1ib2wuZmxhZ3MgIT0gMCk7Ki8KLQotCSAgZHN0LT5uYXRpdmUgPSBzcmM7Ci0KLQkgIGRzdC0+c3ltYm9sLnVkYXRhLmkgPSAwOwotCSAgZHN0LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKLQkgIHRoaXNfaW5kZXggKz0gKHNyYy0+dS5zeW1lbnQubl9udW1hdXgpICsgMTsKLQkgIGRzdCsrOwotCSAgbnVtYmVyX29mX3N5bWJvbHMrKzsKLQl9CQkJLyogd2FsayB0aGUgbmF0aXZlIHN5bXRhYiAqLwotICAgIH0JCQkJLyogYmZkaXplIHRoZSBuYXRpdmUgc3ltdGFiICovCi0KLSAgb2JqX3N5bWJvbHMgKGFiZmQpID0gY2FjaGVkX2FyZWE7Ci0gIG9ial9yYXdfc3ltZW50cyAoYWJmZCkgPSBuYXRpdmVfc3ltYm9sczsKLQotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IG51bWJlcl9vZl9zeW1ib2xzOwotICBvYmpfY29udmVydCAoYWJmZCkgPSB0YWJsZV9wdHI7Ci0gIC8qIFNsdXJwIHRoZSBsaW5lIHRhYmxlcyBmb3IgZWFjaCBzZWN0aW9uIHRvbyAqLwotICB7Ci0gICAgYXNlY3Rpb24gKnA7Ci0gICAgcCA9IGFiZmQtPnNlY3Rpb25zOwotICAgIHdoaWxlIChwKQotICAgICAgewotCWNvZmZfc2x1cnBfbGluZV90YWJsZSAoYWJmZCwgcCk7Ci0JcCA9IHAtPm5leHQ7Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19CQkJCS8qIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKCkgKi8KLQotLyogQ2xhc3NpZnkgYSBDT0ZGIHN5bWJvbC4gIEEgY291cGxlIG9mIHRhcmdldHMgaGF2ZSBnbG9iYWxseSB2aXNpYmxlCi0gICBzeW1ib2xzIHdoaWNoIGFyZSBub3QgY2xhc3MgQ19FWFQsIGFuZCB0aGlzIGhhbmRsZXMgdGhvc2UuICBJdCBhbHNvCi0gICByZWNvZ25pemVzIHNvbWUgc3BlY2lhbCBQRSBjYXNlcy4gICovCi0KLXN0YXRpYyBlbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uCi1jb2ZmX2NsYXNzaWZ5X3N5bWJvbCAoYWJmZCwgc3ltZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bWVudDsKLXsKLSAgLyogRklYTUU6IFRoaXMgcGFydGlhbGx5IGR1cGxpY2F0ZXMgdGhlIHN3aXRjaCBpbgotICAgICBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICovCi0gIHN3aXRjaCAoc3ltZW50LT5uX3NjbGFzcykKLSAgICB7Ci0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfV0VBS0VYVDoKLSNpZmRlZiBJOTYwCi0gICAgY2FzZSBDX0xFQUZFWFQ6Ci0jZW5kaWYKLSNpZmRlZiBBUk0KLSAgICBjYXNlIENfVEhVTUJFWFQ6Ci0gICAgY2FzZSBDX1RIVU1CRVhURlVOQzoKLSNlbmRpZgotI2lmZGVmIENfU1lTVEVNCi0gICAgY2FzZSBDX1NZU1RFTToKLSNlbmRpZgotI2lmZGVmIENPRkZfV0lUSF9QRQotICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0gICAgICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0JewotCSAgaWYgKHN5bWVudC0+bl92YWx1ZSA9PSAwKQotCSAgICByZXR1cm4gQ09GRl9TWU1CT0xfVU5ERUZJTkVEOwotCSAgZWxzZQotCSAgICByZXR1cm4gQ09GRl9TWU1CT0xfQ09NTU9OOwotCX0KLSAgICAgIHJldHVybiBDT0ZGX1NZTUJPTF9HTE9CQUw7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0gIGlmIChzeW1lbnQtPm5fc2NsYXNzID09IENfU1RBVCkKLSAgICB7Ci0gICAgICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0JewotCSAgLyogVGhlIE1pY3Jvc29mdCBjb21waWxlciBzb21ldGltZXMgZ2VuZXJhdGVzIHRoZXNlIGlmIGEKLSAgICAgICAgICAgICBzbWFsbCBzdGF0aWMgZnVuY3Rpb24gaXMgaW5saW5lZCBldmVyeSB0aW1lIGl0IGlzIHVzZWQuCi0gICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIGRpc2NhcmRlZCwgYnV0IHRoZSBzeW1ib2wgdGFibGUgZW50cnkKLSAgICAgICAgICAgICByZW1haW5zLiAgKi8KLQkgIHJldHVybiBDT0ZGX1NZTUJPTF9MT0NBTDsKLQl9Ci0KLSNpZmRlZiBTVFJJQ1RfUEVfRk9STUFUCi0gICAgICAvKiBUaGlzIGlzIGNvcnJlY3QgZm9yIE1pY3Jvc29mdCBnZW5lcmF0ZWQgb2JqZWN0cywgYnV0IGl0Ci0gICAgICAgICBicmVha3MgZ2FzIGdlbmVyYXRlZCBvYmplY3RzLiAgKi8KLQotICAgICAgaWYgKHN5bWVudC0+bl92YWx1ZSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICBzZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bWVudC0+bl9zY251bSk7Ci0JICBpZiAoc2VjICE9IE5VTEwKLQkgICAgICAmJiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCSAgX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCBzeW1lbnQsIGJ1ZikpCi0JCSAgPT0gMCkpCi0JICAgIHJldHVybiBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OOwotCX0KLSNlbmRpZgotCi0gICAgICByZXR1cm4gQ09GRl9TWU1CT0xfTE9DQUw7Ci0gICAgfQotCi0gIGlmIChzeW1lbnQtPm5fc2NsYXNzID09IENfU0VDVElPTikKLSAgICB7Ci0gICAgICAvKiBJbiBzb21lIGNhc2VzIGluIGEgRExMIGdlbmVyYXRlZCBieSB0aGUgTWljcm9zb2Z0IGxpbmtlciwgdGhlCi0gICAgICAgICBuX3ZhbHVlIGZpZWxkIHdpbGwgY29udGFpbiBnYXJiYWdlLiAgRklYTUU6IFRoaXMgc2hvdWxkCi0gICAgICAgICBwcm9iYWJseSBiZSBoYW5kbGVkIGJ5IHRoZSBzd2FwcGluZyBmdW5jdGlvbiBpbnN0ZWFkLiAgKi8KLSAgICAgIHN5bWVudC0+bl92YWx1ZSA9IDA7Ci0gICAgICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0JcmV0dXJuIENPRkZfU1lNQk9MX1VOREVGSU5FRDsKLSAgICAgIHJldHVybiBDT0ZGX1NZTUJPTF9QRV9TRUNUSU9OOwotICAgIH0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotICAvKiBJZiBpdCBpcyBub3QgYSBnbG9iYWwgc3ltYm9sLCB3ZSBwcmVzdW1lIGl0IGlzIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQotICBpZiAoc3ltZW50LT5uX3NjbnVtID09IDApCi0gICAgewotICAgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIndhcm5pbmc6ICVzOiBsb2NhbCBzeW1ib2wgYCVzJyBoYXMgbm8gc2VjdGlvbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkgX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCBzeW1lbnQsIGJ1ZikpOwotICAgIH0KLQotICByZXR1cm4gQ09GRl9TWU1CT0xfTE9DQUw7Ci19Ci0KLS8qCi1TVUJTVUJTRUNUSU9OCi0JUmVhZGluZyByZWxvY2F0aW9ucwotCi0JQ29mZiByZWxvY2F0aW9ucyBhcmUgZWFzaWx5IHRyYW5zZm9ybWVkIGludG8gdGhlIGludGVybmFsIEJGRCBmb3JtCi0JKEBjb2Rle2FyZWxlbnR9KS4KLQotCVJlYWRpbmcgYSBjb2ZmIHJlbG9jYXRpb24gdGFibGUgaXMgZG9uZSBpbiB0aGUgZm9sbG93aW5nIHN0YWdlczoKLQotCW8gUmVhZCB0aGUgZW50aXJlIGNvZmYgcmVsb2NhdGlvbiB0YWJsZSBpbnRvIG1lbW9yeS4KLQotCW8gUHJvY2VzcyBlYWNoIHJlbG9jYXRpb24gaW4gdHVybjsgZmlyc3Qgc3dhcCBpdCBmcm9tIHRoZQotCWV4dGVybmFsIHRvIHRoZSBpbnRlcm5hbCBmb3JtLgotCi0JbyBUdXJuIHRoZSBzeW1ib2wgcmVmZXJlbmNlZCBpbiB0aGUgcmVsb2NhdGlvbidzIHN5bWJvbCBpbmRleAotCWludG8gYSBwb2ludGVyIGludG8gdGhlIGNhbm9uaWNhbCBzeW1ib2wgdGFibGUuCi0JVGhpcyB0YWJsZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHJldHVybmVkIGJ5IGEgY2FsbCB0bwotCUBjb2Rle2JmZF9jYW5vbmljYWxpemVfc3ltdGFifS4gVGhlIGJhY2sgZW5kIHdpbGwgY2FsbCB0aGF0Ci0Jcm91dGluZSBhbmQgc2F2ZSB0aGUgcmVzdWx0IGlmIGEgY2Fub25pY2FsaXphdGlvbiBoYXNuJ3QgYmVlbiBkb25lLgotCi0JbyBUaGUgcmVsb2MgaW5kZXggaXMgdHVybmVkIGludG8gYSBwb2ludGVyIHRvIGEgaG93dG8KLQlzdHJ1Y3R1cmUsIGluIGEgYmFjayBlbmQgc3BlY2lmaWMgd2F5LiBGb3IgaW5zdGFuY2UsIHRoZSAzODYKLQlhbmQgOTYwIHVzZSB0aGUgQGNvZGV7cl90eXBlfSB0byBkaXJlY3RseSBwcm9kdWNlIGFuIGluZGV4Ci0JaW50byBhIGhvd3RvIHRhYmxlIHZlY3RvcjsgdGhlIDg4ayBzdWJ0cmFjdHMgYSBudW1iZXIgZnJvbSB0aGUKLQlAY29kZXtyX3R5cGV9IGZpZWxkIGFuZCBjcmVhdGVzIGFuIGFkZGVuZCBmaWVsZC4KLQotCi0qLwotCi0jaWZuZGVmIENBTENfQURERU5ECi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsgICAgICBcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKSAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOyAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci17Ci0gIFJFTE9DICpuYXRpdmVfcmVsb2NzOwotICBhcmVsZW50ICpyZWxvY19jYWNoZTsKLSAgYXJlbGVudCAqY2FjaGVfcHRyOwotCi0gIHVuc2lnbmVkIGludCBpZHg7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoYXNlY3QtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICghY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmF0aXZlX3JlbG9jcyA9Ci0gICAgKFJFTE9DICopIGJ1eV9hbmRfcmVhZCAoYWJmZCwKLQkJCSAgICBhc2VjdC0+cmVsX2ZpbGVwb3MsCi0JCQkgICAgU0VFS19TRVQsCi0JCQkgICAgKHNpemVfdCkgKFJFTFNaICoKLQkJCQkgICAgICBhc2VjdC0+cmVsb2NfY291bnQpKTsKLSAgcmVsb2NfY2FjaGUgPSAoYXJlbGVudCAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgKHNpemVfdCkgKGFzZWN0LT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCkpKTsKLQotICBpZiAocmVsb2NfY2FjaGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLQotICBmb3IgKGlkeCA9IDA7IGlkeCA8IGFzZWN0LT5yZWxvY19jb3VudDsgaWR4KyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jIGRzdDsKLSAgICAgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqc3JjOwotI2lmbmRlZiBSRUxPQ19QUk9DRVNTSU5HCi0gICAgICBhc3ltYm9sICpwdHI7Ci0jZW5kaWYKLQotICAgICAgY2FjaGVfcHRyID0gcmVsb2NfY2FjaGUgKyBpZHg7Ci0gICAgICBzcmMgPSBuYXRpdmVfcmVsb2NzICsgaWR4OwotCi0gICAgICBjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgJmRzdCk7Ci0KLSNpZmRlZiBSRUxPQ19QUk9DRVNTSU5HCi0gICAgICBSRUxPQ19QUk9DRVNTSU5HIChjYWNoZV9wdHIsICZkc3QsIHN5bWJvbHMsIGFiZmQsIGFzZWN0KTsKLSNlbHNlCi0gICAgICBjYWNoZV9wdHItPmFkZHJlc3MgPSBkc3Qucl92YWRkcjsKLQotICAgICAgaWYgKGRzdC5yX3N5bW5keCAhPSAtMSkKLQl7Ci0JICBpZiAoZHN0LnJfc3ltbmR4IDwgMCB8fCBkc3Qucl9zeW1uZHggPj0gb2JqX2NvbnZfdGFibGVfc2l6ZSAoYWJmZCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gcmVsb2NzIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgZHN0LnJfc3ltbmR4KTsKLQkgICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JICAgICAgcHRyID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IChzeW1ib2xzCi0JCQkJCSsgb2JqX2NvbnZlcnQgKGFiZmQpW2RzdC5yX3N5bW5keF0pOwotCSAgICAgIHB0ciA9ICooY2FjaGVfcHRyLT5zeW1fcHRyX3B0cik7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgcHRyID0gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIFRoZSBzeW1ib2xzIGRlZmluaXRpb25zIHRoYXQgd2UgaGF2ZSByZWFkIGluIGhhdmUgYmVlbgotCSByZWxvY2F0ZWQgYXMgaWYgdGhlaXIgc2VjdGlvbnMgc3RhcnRlZCBhdCAwLiBCdXQgdGhlIG9mZnNldHMKLQkgcmVmZXJpbmcgdG8gdGhlIHN5bWJvbHMgaW4gdGhlIHJhdyBkYXRhIGhhdmUgbm90IGJlZW4KLQkgbW9kaWZpZWQsIHNvIHdlIGhhdmUgdG8gaGF2ZSBhIG5lZ2F0aXZlIGFkZGVuZCB0byBjb21wZW5zYXRlLgotCi0JIE5vdGUgdGhhdCBzeW1ib2xzIHdoaWNoIHVzZWQgdG8gYmUgY29tbW9uIG11c3QgYmUgbGVmdCBhbG9uZSAqLwotCi0gICAgICAvKiBDYWxjdWxhdGUgYW55IHJlbG9jIGFkZGVuZCBieSBsb29raW5nIGF0IHRoZSBzeW1ib2wgKi8KLSAgICAgIENBTENfQURERU5EIChhYmZkLCBwdHIsIGRzdCwgY2FjaGVfcHRyKTsKLQotICAgICAgY2FjaGVfcHRyLT5hZGRyZXNzIC09IGFzZWN0LT52bWE7Ci0vKiAhISAgICAgY2FjaGVfcHRyLT5zZWN0aW9uID0gKGFzZWN0aW9uICopIE5VTEw7Ki8KLQotICAgICAgLyogRmlsbCBpbiB0aGUgY2FjaGVfcHRyLT5ob3d0byBmaWVsZCBmcm9tIGRzdC5yX3R5cGUgKi8KLSAgICAgIFJUWVBFMkhPV1RPIChjYWNoZV9wdHIsICZkc3QpOwotI2VuZGlmCS8qIFJFTE9DX1BST0NFU1NJTkcgKi8KLQotICAgICAgaWYgKGNhY2hlX3B0ci0+aG93dG8gPT0gTlVMTCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBpbGxlZ2FsIHJlbG9jYXRpb24gdHlwZSAlZCBhdCBhZGRyZXNzIDB4JWx4IiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgZHN0LnJfdHlwZSwgKGxvbmcpIGRzdC5yX3ZhZGRyKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgYXNlY3QtPnJlbG9jYXRpb24gPSByZWxvY19jYWNoZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZm5kZWYgY29mZl9ydHlwZV90b19ob3d0bwotI2lmZGVmIFJUWVBFMkhPV1RPCi0KLS8qIEdldCB0aGUgaG93dG8gc3RydWN0dXJlIGZvciBhIHJlbG9jLiAgVGhpcyBpcyBvbmx5IHVzZWQgaWYgdGhlIGZpbGUKLSAgIGluY2x1ZGluZyB0aGlzIG9uZSBkZWZpbmVzIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiB0byBiZQotICAgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbiwgc28gaXQgaXMgT0sgaWYgaXQgZG9lcyBub3QKLSAgIGFsd2F5cyB3b3JrLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBpbmNsdWRpbmcgZmlsZSB0bwotICAgbWFrZSBzdXJlIGl0IGlzIHJlYXNvbmFibGUgaWYgaXQgaXMgbmVlZGVkLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosCi0JICAgYmZkX3ZtYSAqKSk7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhcmVsZW50IGdlbnJlbDsKLQotICBSVFlQRTJIT1dUTyAoJmdlbnJlbCwgcmVsKTsKLSAgcmV0dXJuIGdlbnJlbC5ob3d0bzsKLX0KLQotI2Vsc2UgLyogISBkZWZpbmVkIChSVFlQRTJIT1dUTykgKi8KLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIE5VTEwKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoUlRZUEUySE9XVE8pICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3J0eXBlX3RvX2hvd3RvKSAqLwotCi0vKiBUaGlzIGlzIHN0dXBpZC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGEgYm9vbGVhbiBwcmVkaWNhdGUuICAqLwotc3RhdGljIGxvbmcKLWNvZmZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKiByZWxwdHI7Ci0gICAgIGFzeW1ib2wgKiogc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLQotCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICB7Ci0gICAgICAvKiB0aGlzIHNlY3Rpb24gaGFzIHJlbG9jcyBtYWRlIHVwIGJ5IHVzLCB0aGV5IGFyZSBub3QgaW4gdGhlCi0gICAgICAgZmlsZSwgc28gdGFrZSB0aGVtIG91dCBvZiB0aGVpciBjaGFpbiBhbmQgcGxhY2UgdGhlbSBpbnRvCi0gICAgICAgdGhlIGRhdGEgYXJlYSBwcm92aWRlZCAqLwotICAgICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotCSAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLQl9Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICAgIGZvciAoOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotCSpyZWxwdHIrKyA9IHRibHB0cisrOwotCi0KLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLSNpZmRlZiBHTlU5NjAKLWZpbGVfcHRyCi1jb2ZmX3N5bV9maWxlcG9zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9yZWxvYzE2X2VzdGltYXRlCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSBkdW1teV9yZWxvYzE2X2VzdGltYXRlCi0KLXN0YXRpYyBpbnQgZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqLCB1bnNpZ25lZCBpbnQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgaW50Ci1kdW1teV9yZWxvYzE2X2VzdGltYXRlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMKLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcwotCi0vKiBUaGlzIHdvcmtzIGV2ZW4gaWYgYWJvcnQgaXMgbm90IGRlY2xhcmVkIGluIGFueSBoZWFkZXIgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkIGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBhcmVsZW50ICosCi0JICAgYmZkX2J5dGUgKiwgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGludCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLAotCQkJICAgZHN0X3B0cikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9ieXRlICpkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCAqc3JjX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0jZW5kaWYKLQotLyogSWYgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGlzIGRlZmluZWQsIHdlIGNhbiB1c2UgdGhlIG9wdGltaXplZCBDT0ZGCi0gICBiYWNrZW5kIGxpbmtlci4gIE90aGVyd2lzZSB3ZSBtdXN0IGNvbnRpbnVlIHRvIHVzZSB0aGUgb2xkIGxpbmtlci4gICovCi0jaWZkZWYgY29mZl9yZWxvY2F0ZV9zZWN0aW9uCi0jaWZuZGVmIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2VuZGlmCi0jaWZuZGVmIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scwotI2VuZGlmCi0jaWZuZGVmIGNvZmZfYmZkX2ZpbmFsX2xpbmsKLSNkZWZpbmUgY29mZl9iZmRfZmluYWxfbGluayBfYmZkX2NvZmZfZmluYWxfbGluawotI2VuZGlmCi0jZWxzZSAvKiAhIGRlZmluZWQgKGNvZmZfcmVsb2NhdGVfc2VjdGlvbikgKi8KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIE5VTEwKLSNpZm5kZWYgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZW5kaWYKLSNkZWZpbmUgY29mZl9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2VuZGlmIC8qICEgZGVmaW5lZCAoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKSAqLwotCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi0jaWZuZGVmIGNvZmZfc3RhcnRfZmluYWxfbGluawotI2RlZmluZSBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgTlVMTAotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9hZGp1c3Rfc3ltbmR4Ci0jZGVmaW5lIGNvZmZfYWRqdXN0X3N5bW5keCBOVUxMCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bgotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIChhYmZkLCBpbmZvKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLQotc3RhdGljIGJvb2xlYW4gY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCAoYWJmZCwgcGZpbmZvKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfU1dBUF9hdXhfaW4KLSNkZWZpbmUgY29mZl9TV0FQX2F1eF9pbiBjb2ZmX3N3YXBfYXV4X2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3N5bV9pbgotI2RlZmluZSBjb2ZmX1NXQVBfc3ltX2luIGNvZmZfc3dhcF9zeW1faW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfbGluZW5vX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9saW5lbm9faW4gY29mZl9zd2FwX2xpbmVub19pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9hdXhfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9hdXhfb3V0IGNvZmZfc3dhcF9hdXhfb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3N5bV9vdXQKLSNkZWZpbmUgY29mZl9TV0FQX3N5bV9vdXQgY29mZl9zd2FwX3N5bV9vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfbGluZW5vX291dAotI2RlZmluZSBjb2ZmX1NXQVBfbGluZW5vX291dCBjb2ZmX3N3YXBfbGluZW5vX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9yZWxvY19vdXQKLSNkZWZpbmUgY29mZl9TV0FQX3JlbG9jX291dCBjb2ZmX3N3YXBfcmVsb2Nfb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2ZpbGVoZHJfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9maWxlaGRyX291dCBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfYW91dGhkcl9vdXQKLSNkZWZpbmUgY29mZl9TV0FQX2FvdXRoZHJfb3V0IGNvZmZfc3dhcF9hb3V0aGRyX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9zY25oZHJfb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9zY25oZHJfb3V0IGNvZmZfc3dhcF9zY25oZHJfb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3JlbG9jX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9yZWxvY19pbiBjb2ZmX3N3YXBfcmVsb2NfaW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfZmlsZWhkcl9pbgotI2RlZmluZSBjb2ZmX1NXQVBfZmlsZWhkcl9pbiBjb2ZmX3N3YXBfZmlsZWhkcl9pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9hb3V0aGRyX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9hb3V0aGRyX2luIGNvZmZfc3dhcF9hb3V0aGRyX2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3Njbmhkcl9pbgotI2RlZmluZSBjb2ZmX1NXQVBfc2NuaGRyX2luIGNvZmZfc3dhcF9zY25oZHJfaW4KLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgYmZkX2NvZmZfYmFja2VuZF9kYXRhIGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlID0KLXsKLSAgY29mZl9TV0FQX2F1eF9pbiwgY29mZl9TV0FQX3N5bV9pbiwgY29mZl9TV0FQX2xpbmVub19pbiwKLSAgY29mZl9TV0FQX2F1eF9vdXQsIGNvZmZfU1dBUF9zeW1fb3V0LAotICBjb2ZmX1NXQVBfbGluZW5vX291dCwgY29mZl9TV0FQX3JlbG9jX291dCwKLSAgY29mZl9TV0FQX2ZpbGVoZHJfb3V0LCBjb2ZmX1NXQVBfYW91dGhkcl9vdXQsCi0gIGNvZmZfU1dBUF9zY25oZHJfb3V0LAotICBGSUxIU1osIEFPVVRTWiwgU0NOSFNaLCBTWU1FU1osIEFVWEVTWiwgUkVMU1osIExJTkVTWiwgRklMTk1MRU4sCi0jaWZkZWYgQ09GRl9MT05HX0ZJTEVOQU1FUwotICB0cnVlLAotI2Vsc2UKLSAgZmFsc2UsCi0jZW5kaWYKLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICB0cnVlLAotI2Vsc2UKLSAgZmFsc2UsCi0jZW5kaWYKLSAgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSLAotICBjb2ZmX1NXQVBfZmlsZWhkcl9pbiwgY29mZl9TV0FQX2FvdXRoZHJfaW4sIGNvZmZfU1dBUF9zY25oZHJfaW4sCi0gIGNvZmZfU1dBUF9yZWxvY19pbiwgY29mZl9iYWRfZm9ybWF0X2hvb2ssIGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLAotICBjb2ZmX21rb2JqZWN0X2hvb2ssIHN0eXBfdG9fc2VjX2ZsYWdzLCBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaywKLSAgY29mZl9zbHVycF9zeW1ib2xfdGFibGUsIHN5bW5hbWVfaW5fZGVidWdfaG9vaywgY29mZl9wb2ludGVyaXplX2F1eF9ob29rLAotICBjb2ZmX3ByaW50X2F1eCwgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzLCBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUsCi0gIGNvZmZfY2xhc3NpZnlfc3ltYm9sLCBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLSAgY29mZl9zdGFydF9maW5hbF9saW5rLCBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24sIGNvZmZfcnR5cGVfdG9faG93dG8sCi0gIGNvZmZfYWRqdXN0X3N5bW5keCwgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sLAotICBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biwgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLX07Ci0KLSNpZm5kZWYgY29mZl9jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZQljb2ZmX2Nsb3NlX2FuZF9jbGVhbnVwICAgICAgICAgICAgICBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgY29mZl9iZmRfZnJlZV9jYWNoZWRfaW5mbyAgICAgICAgICAgX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lCWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgICAgICAgICAgIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAgIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgICAgICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhICAgICBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGNvZmZfYmZkX3NldF9wcml2YXRlX2ZsYWdzICAgICAgICAgIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgCi0jZGVmaW5lIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgICAgIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCSAgICBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGNvZmZfcmVhZF9taW5pc3ltYm9scwkJICAgIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0jZGVmaW5lIGNvZmZfbWluaXN5bWJvbF90b19zeW1ib2wJICAgIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotI2VuZGlmCi0KLS8qIFRoZSByZWxvYyBsb29rdXAgcm91dGluZSBtdXN0IGJlIHN1cHBsaWVkIGJ5IGVhY2ggaW5kaXZpZHVhbCBDT0ZGCi0gICBiYWNrZW5kLiAgKi8KLSNpZm5kZWYgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJICAgIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24JCSAgICBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBjb2ZmX2JmZF9nY19zZWN0aW9ucwkJICAgIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZW5kaWYKLQotI2RlZmluZSBDUkVBVEVfQklHX0NPRkZfVEFSR0VUX1ZFQyhWQVIsIE5BTUUsIEVYVFJBX09fRkxBR1MsIEVYVFJBX1NfRkxBR1MsIFVOREVSLCBBTFRFUk5BVElWRSkJXAotY29uc3QgYmZkX3RhcmdldCBWQVIgPQkJCQkJCQlcCi17CQkJCQkJCQkJXAotICBOQU1FICwJCQkJCQkJCVwKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCQkJCQkJXAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8JCVwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8JCVwKLSAgLyogb2JqZWN0IGZsYWdzICovCQkJCQkJCVwKLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAkJCVwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBFWFRSQV9PX0ZMQUdTKSwJCQlcCi0gIC8qIHNlY3Rpb24gZmxhZ3MgKi8JCQkJCQkJXAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgRVhUUkFfU19GTEFHUyksXAotICBVTkRFUiwJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCQlcCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8JCQlcCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwkJCVwKLSAgCQkJCQkJCQkJXAotICAvKiBEYXRhIGNvbnZlcnNpb24gZnVuY3Rpb25zLiAgKi8JCQkJCVwKLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAkJCQlcCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwJCQkJXAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCQkJCVwKLSAgCQkJCQkJCQkJXAotICAvKiBIZWFkZXIgY29udmVyc2lvbiBmdW5jdGlvbnMuICAqLwkJCQkJXAotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCQkJCVwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAkJCQlcCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJCQkJXAotCQkJCQkJCQkJXAotCS8qIGJmZF9jaGVja19mb3JtYXQgKi8JCQkJCQlcCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwJCVwKLSAgICBfYmZkX2R1bW15X3RhcmdldCB9LAkJCQkJCVwKLQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwkJCQkJCVwKLSAgeyBiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZSB9LAlcCi0JLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCQkJCQlcCi0gIHsgYmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAlcCi0gICAgYmZkX2ZhbHNlIH0sCQkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwJCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwJCQkJXAotICAJCQkJCQkJCQlcCi0gIEFMVEVSTkFUSVZFLAkJCQkJCQkJXAotICAJCQkJCQkJCQlcCi0gIENPRkZfU1dBUF9UQUJMRQkJCQkJCQlcCi19OwotCi0jZGVmaW5lIENSRUFURV9MSVRUTEVfQ09GRl9UQVJHRVRfVkVDKFZBUiwgTkFNRSwgRVhUUkFfT19GTEFHUywgRVhUUkFfU19GTEFHUywgVU5ERVIsIEFMVEVSTkFUSVZFKQlcCi1jb25zdCBiZmRfdGFyZ2V0IFZBUiA9CQkJCQkJCVwKLXsJCQkJCQkJCQlcCi0gIE5BTUUgLAkJCQkJCQkJXAotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwJCQkJCQlcCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwkJXAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwlcCi0JLyogb2JqZWN0IGZsYWdzICovCQkJCQkJXAotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8CQkJXAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEVYVFJBX09fRkxBR1MpLAkJCVwKLQkvKiBzZWN0aW9uIGZsYWdzICovCQkJCQkJXAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgRVhUUkFfU19GTEFHUyksXAotICBVTkRFUiwJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCQlcCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8JCQlcCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwkJCVwKLQkJCQkJCQkJCVwKLSAgLyogRGF0YSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gICovCQkJCQlcCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwJCQkJXAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCQkJCVwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkJCQlcCi0gIC8qIEhlYWRlciBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gICovCQkJCQlcCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwJCQkJXAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCQkJCVwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkJCQlcCi0JLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwkJCQkJCVwKLSAgeyBfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLAkJXAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0IH0sCQkJCQkJXAotICAgICAgIC8qIGJmZF9zZXRfZm9ybWF0ICovCQkJCQkJXAotICB7IGJmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlIH0sCVwKLQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8JCQkJCVwKLSAgeyBiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCVwKLSAgICBiZmRfZmFsc2UgfSwJCQkJCQkJXAotCQkJCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCQkJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwJCQkJXAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwJCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwJCQkJCQlcCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAkJCQkJCVwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAkJCQlcCi0JCQkJCQkJCQlcCi0gIEFMVEVSTkFUSVZFLAkJCQkJCQkJXAotICAJCQkJCQkJCQlcCi0gIENPRkZfU1dBUF9UQUJMRQkJCQkJCQlcCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmZnZW4uYyBiL2JmZC9jb2ZmZ2VuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2ExNWYuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmZnZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDI0MzIgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgdGhlIGdlbmVyaWMgcGFydHMgb2YgQ09GRiwgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBNb3N0IG9mIHRoaXMgaGFja2VkIGJ5ICBTdGV2ZSBDaGFtYmVybGFpbiwgc2FjQGN5Z251cy5jb20uCi0gICBTcGxpdCBvdXQgb2YgY29mZmNvZGUuaCBieSBJYW4gVGF5bG9yLCBpYW5AY3lnbnVzLmNvbS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBDT0ZGIGNvZGUgdGhhdCBpcyBub3QgZGVwZW5kZW50IG9uIGFueQotICAgcGFydGljdWxhciBDT0ZGIHRhcmdldC4gIFRoZXJlIGlzIG9ubHkgb25lIHZlcnNpb24gb2YgdGhpcyBmaWxlIGluCi0gICBsaWJiZmQuYSwgc28gbm8gdGFyZ2V0IHNwZWNpZmljIGNvZGUgbWF5IGJlIHB1dCBpbiBoZXJlLiAgT3IsIHRvCi0gICBwdXQgaXQgYW5vdGhlciB3YXksCi0KLSAgICoqKioqKioqKiogRE8gTk9UIFBVVCBUQVJHRVQgU1BFQ0lGSUMgQ09ERSBJTiBUSElTIEZJTEUgKioqKioqKioqKgotCi0gICBJZiB5b3UgbmVlZCB0byBhZGQgc29tZSB0YXJnZXQgc3BlY2lmaWMgYmVoYXZpb3VyLCBhZGQgYSBuZXcgaG9vawotICAgZnVuY3Rpb24gdG8gYmZkX2NvZmZfYmFja2VuZF9kYXRhLgotCi0gICBTb21lIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgYWxzbyBjYWxsZWQgYnkgdGhlIEVDT0ZGIHJvdXRpbmVzLgotICAgVGhvc2UgZnVuY3Rpb25zIG1heSBub3QgdXNlIGFueSBDT0ZGIHNwZWNpZmljIGluZm9ybWF0aW9uLCBzdWNoIGFzCi0gICBjb2ZmX2RhdGEgKGFiZmQpLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyB2b2lkIGNvZmZfZml4X3N5bWJvbF9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgYmZkX3NpemVfdHlwZSAqLAotCSAgIGFzZWN0aW9uICoqLCBiZmRfc2l6ZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgdW5zaWduZWQgaW50ICosCi0JICAgYmZkX3NpemVfdHlwZSAqLCBhc2VjdGlvbiAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCB1bnNpZ25lZCBpbnQgKiwgYmZkX3NpemVfdHlwZSAqLAotCSAgIGFzZWN0aW9uICoqLCBiZmRfc2l6ZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgY29mZl9zeW1ib2xfdHlwZSAqLCB1bnNpZ25lZCBpbnQgKiwgYmZkX3NpemVfdHlwZSAqLAotCSAgIGFzZWN0aW9uICoqLCBiZmRfc2l6ZV90eXBlICopKTsKLXN0YXRpYyB2b2lkIGNvZmZfcG9pbnRlcml6ZV9hdXgKLSAgUEFSQU1TICgoYmZkICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAotCSAgIHVuc2lnbmVkIGludCwgY29tYmluZWRfZW50cnlfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqY29mZl9yZWFsX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCwgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKiwgCi0JICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikpOwotc3RhdGljIHZvaWQgZml4dXBfc3ltYm9sX3ZhbHVlCi0gIFBBUkFNUyAoKGJmZCAqLCBjb2ZmX3N5bWJvbF90eXBlICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotc3RhdGljIGNoYXIgKmJ1aWxkX2RlYnVnX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjaGFyICpjb3B5X25hbWUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgaW50KSk7Ci0KLSNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKLQotLyogVGFrZSBhIHNlY3Rpb24gaGVhZGVyIHJlYWQgZnJvbSBhIGNvZmYgZmlsZSAoaW4gSE9TVCBieXRlIG9yZGVyKSwKLSAgIGFuZCBtYWtlIGEgQkZEICJzZWN0aW9uIiBvdXQgb2YgaXQuICBUaGlzIGlzIHVzZWQgYnkgRUNPRkYuICAqLwotc3RhdGljIGJvb2xlYW4KLW1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSAoYWJmZCwgaGRyLCB0YXJnZXRfaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX3NjbmhkciAqaGRyOwotICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2luZGV4OwotewotICBhc2VjdGlvbiAqcmV0dXJuX3NlY3Rpb247Ci0gIGNoYXIgKm5hbWU7Ci0KLSAgbmFtZSA9IE5VTEw7Ci0KLSAgLyogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBpbiBQRS4gICovCi0gIGlmIChiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMgKGFiZmQpCi0gICAgICAmJiBoZHItPnNfbmFtZVswXSA9PSAnLycpCi0gICAgewotICAgICAgY2hhciBidWZbU0NOTk1MRU5dOwotICAgICAgbG9uZyBzdHJpbmRleDsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBjb25zdCBjaGFyICpzdHJpbmdzOwotCi0gICAgICBtZW1jcHkgKGJ1ZiwgaGRyLT5zX25hbWUgKyAxLCBTQ05OTUxFTiAtIDEpOwotICAgICAgYnVmW1NDTk5NTEVOIC0gMV0gPSAnXDAnOwotICAgICAgc3RyaW5kZXggPSBzdHJ0b2wgKGJ1ZiwgJnAsIDEwKTsKLSAgICAgIGlmICgqcCA9PSAnXDAnICYmIHN0cmluZGV4ID49IDApCi0JewotCSAgc3RyaW5ncyA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoYWJmZCk7Ci0JICBpZiAoc3RyaW5ncyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGSVhNRTogRm9yIGV4dHJhIHNhZmV0eSwgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0Ci0gICAgICAgICAgICAgc3RyaW5kZXggZG9lcyBub3QgcnVuIHVzIHBhc3QgdGhlIGVuZCwgYnV0IHJpZ2h0IG5vdyB3ZQotICAgICAgICAgICAgIGRvbid0IGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgIHN0cmluZ3MgKz0gc3RyaW5kZXg7Ci0JICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHN0cmluZ3MpICsgMSk7Ci0JICBpZiAobmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzdHJjcHkgKG5hbWUsIHN0cmluZ3MpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBBc3NvcnRlZCB3YXN0YWdlIHRvIG51bGwtdGVybWluYXRlIHRoZSBuYW1lLCB0aGFua3MgQVQmVCEgKi8KLSAgICAgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaGRyLT5zX25hbWUpICsgMSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN0cm5jcHkgKG5hbWUsIChjaGFyICopICZoZHItPnNfbmFtZVswXSwgc2l6ZW9mIChoZHItPnNfbmFtZSkpOwotICAgICAgbmFtZVtzaXplb2YgKGhkci0+c19uYW1lKV0gPSAwOwotICAgIH0KLQotICByZXR1cm5fc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKHJldHVybl9zZWN0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybl9zZWN0aW9uLT52bWEgPSBoZHItPnNfdmFkZHI7Ci0gIHJldHVybl9zZWN0aW9uLT5sbWEgPSBoZHItPnNfcGFkZHI7Ci0gIHJldHVybl9zZWN0aW9uLT5fcmF3X3NpemUgPSBoZHItPnNfc2l6ZTsKLSAgcmV0dXJuX3NlY3Rpb24tPmZpbGVwb3MgPSBoZHItPnNfc2NucHRyOwotICByZXR1cm5fc2VjdGlvbi0+cmVsX2ZpbGVwb3MgPSBoZHItPnNfcmVscHRyOwotICByZXR1cm5fc2VjdGlvbi0+cmVsb2NfY291bnQgPSBoZHItPnNfbnJlbG9jOwotCi0gIGJmZF9jb2ZmX3NldF9hbGlnbm1lbnRfaG9vayAoYWJmZCwgcmV0dXJuX3NlY3Rpb24sIGhkcik7Ci0KLSAgcmV0dXJuX3NlY3Rpb24tPmxpbmVfZmlsZXBvcyA9IGhkci0+c19sbm5vcHRyOwotCi0gIHJldHVybl9zZWN0aW9uLT5saW5lbm9fY291bnQgPSBoZHItPnNfbmxubm87Ci0gIHJldHVybl9zZWN0aW9uLT51c2VyZGF0YSA9IE5VTEw7Ci0gIHJldHVybl9zZWN0aW9uLT5uZXh0ID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIHJldHVybl9zZWN0aW9uLT50YXJnZXRfaW5kZXggPSB0YXJnZXRfaW5kZXg7Ci0gIHJldHVybl9zZWN0aW9uLT5mbGFncyA9IGJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2sgKGFiZmQsIGhkciwgbmFtZSwKLQkJCQkJCQkgICByZXR1cm5fc2VjdGlvbik7Ci0KLSAgLyogQXQgbGVhc3Qgb24gaTM4Ni1jb2ZmLCB0aGUgbGluZSBudW1iZXIgY291bnQgZm9yIGEgc2hhcmVkIGxpYnJhcnkKLSAgICAgc2VjdGlvbiBtdXN0IGJlIGlnbm9yZWQuICAqLwotICBpZiAoKHJldHVybl9zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZKSAhPSAwKQotICAgIHJldHVybl9zZWN0aW9uLT5saW5lbm9fY291bnQgPSAwOwotCi0gIGlmIChoZHItPnNfbnJlbG9jICE9IDApCi0gICAgcmV0dXJuX3NlY3Rpb24tPmZsYWdzIHw9IFNFQ19SRUxPQzsKLSAgLyogRklYTUU6IHNob3VsZCB0aGlzIGNoZWNrICdoZHItPnNfc2l6ZSA+IDAnICovCi0gIGlmIChoZHItPnNfc2NucHRyICE9IDApCi0gICAgcmV0dXJuX3NlY3Rpb24tPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGluIGEgQ09GRiBvYmplY3QgYW5kIG1ha2UgaXQgaW50byBhIEJGRC4gIFRoaXMgaXMgdXNlZCBieQotICAgRUNPRkYgYXMgd2VsbC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWNvZmZfcmVhbF9vYmplY3RfcCAoYWJmZCwgbnNjbnMsIGludGVybmFsX2YsIGludGVybmFsX2EpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbnNjbnM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqaW50ZXJuYWxfYTsKLXsKLSAgZmxhZ3dvcmQgb2ZsYWdzID0gYWJmZC0+ZmxhZ3M7Ci0gIGJmZF92bWEgb3N0YXJ0ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgUFRSIHRkYXRhOwotICBzaXplX3QgcmVhZHNpemU7CQkvKiBsZW5ndGggb2YgZmlsZV9pbmZvICovCi0gIHVuc2lnbmVkIGludCBzY25oc3o7Ci0gIGNoYXIgKmV4dGVybmFsX3NlY3Rpb25zOwotCi0gIGlmICghKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX1JFTEZMRykpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotICBpZiAoKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0VYRUMpKQotICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgaWYgKCEoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfTE5OTykpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0xJTkVOTzsKLSAgaWYgKCEoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfTFNZTVMpKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MT0NBTFM7Ci0KLSAgLyogRklYTUU6IEhvdyBjYW4gd2Ugc2V0IERfUEFHRUQgY29ycmVjdGx5PyAgKi8KLSAgaWYgKChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9FWEVDKSAhPSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IERfUEFHRUQ7Ci0KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBpbnRlcm5hbF9mLT5mX25zeW1zOwotICBpZiAoaW50ZXJuYWxfZi0+Zl9uc3ltcykKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICBpZiAoaW50ZXJuYWxfYSAhPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikgTlVMTCkKLSAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gaW50ZXJuYWxfYS0+ZW50cnk7Ci0gIGVsc2UKLSAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gMDsKLQotICAvKiBTZXQgdXAgdGhlIHRkYXRhIGFyZWEuICBFQ09GRiB1c2VzIGl0cyBvd24gcm91dGluZSwgYW5kIG92ZXJyaWRlcwotICAgICBhYmZkLT5mbGFncy4gICovCi0gIHRkYXRhID0gYmZkX2NvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgKFBUUikgaW50ZXJuYWxfZiwgKFBUUikgaW50ZXJuYWxfYSk7Ci0gIGlmICh0ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIHNjbmhzeiA9IGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7Ci0gIHJlYWRzaXplID0gbnNjbnMgKiBzY25oc3o7Ci0gIGV4dGVybmFsX3NlY3Rpb25zID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCByZWFkc2l6ZSk7Ci0gIGlmICghZXh0ZXJuYWxfc2VjdGlvbnMpCi0gICAgZ290byBmYWlsOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgZXh0ZXJuYWxfc2VjdGlvbnMsIDEsIHJlYWRzaXplLCBhYmZkKSAhPSByZWFkc2l6ZSkKLSAgICBnb3RvIGZhaWw7Ci0KLSAgLyogTm93IGNvcHkgZGF0YSBhcyByZXF1aXJlZDsgY29uc3RydWN0IGFsbCBhc2VjdGlvbnMgZXRjICovCi0gIGlmIChuc2NucyAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5zY25zOyBpKyspCi0JewotCSAgc3RydWN0IGludGVybmFsX3NjbmhkciB0bXA7Ci0JICBiZmRfY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwKLQkJCQkgICAoUFRSKSAoZXh0ZXJuYWxfc2VjdGlvbnMgKyBpICogc2NuaHN6KSwKLQkJCQkgICAoUFRSKSAmIHRtcCk7Ci0JICBpZiAoISBtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUgKGFiZmQsICZ0bXAsIGkgKyAxKSkKLQkgICAgZ290byBmYWlsOwotCX0KLSAgICB9Ci0KLSAgLyogIG1ha2VfYWJzX3NlY3Rpb24gKGFiZmQpOyAqLwotCi0gIGlmIChiZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgKGFiZmQsIChQVFIpIGludGVybmFsX2YpID09IGZhbHNlKQotICAgIGdvdG8gZmFpbDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotIGZhaWw6Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCB0ZGF0YSk7Ci0gIGFiZmQtPmZsYWdzID0gb2ZsYWdzOwotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gb3N0YXJ0OwotICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLX0KLQotLyogVHVybiBhIENPRkYgZmlsZSBpbnRvIGEgQkZELCBidXQgZmFpbCB3aXRoIGJmZF9lcnJvcl93cm9uZ19mb3JtYXQgaWYgaXQgaXMKLSAgIG5vdCBhIENPRkYgZmlsZS4gIFRoaXMgaXMgYWxzbyB1c2VkIGJ5IEVDT0ZGLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1jb2ZmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBmaWxoc3o7Ci0gIHVuc2lnbmVkIGludCBhb3V0c3o7Ci0gIGludCBuc2NuczsKLSAgUFRSIGZpbGVoZHI7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyIGludGVybmFsX2Y7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyIGludGVybmFsX2E7Ci0KLSAgLyogZmlndXJlIG91dCBob3cgbXVjaCB0byByZWFkICovCi0gIGZpbGhzeiA9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCk7Ci0gIGFvdXRzeiA9IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCk7Ci0KLSAgZmlsZWhkciA9IGJmZF9hbGxvYyAoYWJmZCwgZmlsaHN6KTsKLSAgaWYgKGZpbGVoZHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGJmZF9yZWFkIChmaWxlaGRyLCAxLCBmaWxoc3osIGFiZmQpICE9IGZpbGhzeikKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbiAoYWJmZCwgZmlsZWhkciwgJmludGVybmFsX2YpOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgZmlsZWhkcik7Ci0KLSAgaWYgKGJmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vayAoYWJmZCwgJmludGVybmFsX2YpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBuc2NucyA9IGludGVybmFsX2YuZl9uc2NuczsKLQotICBpZiAoaW50ZXJuYWxfZi5mX29wdGhkcikKLSAgICB7Ci0gICAgICBQVFIgb3B0aGRyOwotCi0gICAgICBvcHRoZHIgPSBiZmRfYWxsb2MgKGFiZmQsIGFvdXRzeik7Ci0gICAgICBpZiAob3B0aGRyID09IE5VTEwpCi0JcmV0dXJuIDA7OwotICAgICAgaWYgKGJmZF9yZWFkIChvcHRoZHIsIDEsIGludGVybmFsX2YuZl9vcHRoZHIsIGFiZmQpCi0JICAhPSBpbnRlcm5hbF9mLmZfb3B0aGRyKQotCXsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbiAoYWJmZCwgb3B0aGRyLCAoUFRSKSAmaW50ZXJuYWxfYSk7Ci0gICAgfQotCi0gIHJldHVybiBjb2ZmX3JlYWxfb2JqZWN0X3AgKGFiZmQsIG5zY25zLCAmaW50ZXJuYWxfZiwKLQkJCSAgICAgKGludGVybmFsX2YuZl9vcHRoZHIgIT0gMAotCQkJICAgICAgPyAmaW50ZXJuYWxfYQotCQkJICAgICAgOiAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikgTlVMTCkpOwotfQotCi0vKiBHZXQgdGhlIEJGRCBzZWN0aW9uIGZyb20gYSBDT0ZGIHN5bWJvbCBzZWN0aW9uIG51bWJlci4gICovCi0KLWFzZWN0aW9uICoKLWNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGluZGV4OwotewotICBzdHJ1Y3Qgc2VjICphbnN3ZXIgPSBhYmZkLT5zZWN0aW9uczsKLQotICBpZiAoaW5kZXggPT0gTl9BQlMpCi0gICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIGlmIChpbmRleCA9PSBOX1VOREVGKQotICAgIHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICBpZiAoaW5kZXggPT0gTl9ERUJVRykKLSAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotICB3aGlsZSAoYW5zd2VyKQotICAgIHsKLSAgICAgIGlmIChhbnN3ZXItPnRhcmdldF9pbmRleCA9PSBpbmRleCkKLQlyZXR1cm4gYW5zd2VyOwotICAgICAgYW5zd2VyID0gYW5zd2VyLT5uZXh0OwotICAgIH0KLQotICAvKiBXZSBzaG91bGQgbm90IHJlYWNoIHRoaXMgcG9pbnQsIGJ1dCB0aGUgU0NPIDMuMnY0IC9saWIvbGliY19zLmEKLSAgICAgaGFzIGEgYmFkIHN5bWJvbCB0YWJsZSBpbiBiaWdsaXRwb3cuby4gICovCi0gIHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyOwotfQotCi0vKiBHZXQgdGhlIHVwcGVyIGJvdW5kIG9mIGEgQ09GRiBzeW1ib2wgdGFibGUuICAqLwotCi1sb25nCi1jb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCFiZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChjb2ZmX3N5bWJvbF90eXBlICopKTsKLX0KLQotCi0vKiBDYW5vbmljYWxpemUgYSBDT0ZGIHN5bWJvbCB0YWJsZS4gICovCi0KLWxvbmcKLWNvZmZfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyOwotICBjb2ZmX3N5bWJvbF90eXBlICpzeW1iYXNlOwotICBjb2ZmX3N5bWJvbF90eXBlICoqbG9jYXRpb24gPSAoY29mZl9zeW1ib2xfdHlwZSAqKikgYWxvY2F0aW9uOwotCi0gIGlmICghYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgc3ltYmFzZSA9IG9ial9zeW1ib2xzIChhYmZkKTsKLSAgY291bnRlciA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICB3aGlsZSAoY291bnRlci0tID4gMCkKLSAgICAqbG9jYXRpb24rKyA9IHN5bWJhc2UrKzsKLQotICAqbG9jYXRpb24gPSBOVUxMOwotCi0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgc3ltYm9sLiAgVGhlIGNhbGxlciBtdXN0IHBhc3MgaW4gYSBidWZmZXIgb2Ygc2l6ZQotICAgPj0gU1lNTk1MRU4gKyAxLiAgKi8KLQotY29uc3QgY2hhciAqCi1fYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsIHN5bSwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgY2hhciAqYnVmOwotewotICAvKiBGSVhNRTogSXQncyBub3QgY2xlYXIgdGhpcyB3aWxsIHdvcmsgY29ycmVjdGx5IGlmIHNpemVvZgotICAgICAoX25femVyb2VzKSAhPSA0LiAgKi8KLSAgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgIT0gMAotICAgICAgfHwgc3ltLT5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQotICAgIHsKLSAgICAgIG1lbWNweSAoYnVmLCBzeW0tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLSAgICAgIGJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotICAgICAgcmV0dXJuIGJ1ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzdHJpbmdzOwotCi0gICAgICBCRkRfQVNTRVJUIChzeW0tPl9uLl9uX24uX25fb2Zmc2V0ID49IFNUUklOR19TSVpFX1NJWkUpOwotICAgICAgc3RyaW5ncyA9IG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpOwotICAgICAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQl7Ci0JICBzdHJpbmdzID0gX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIChhYmZkKTsKLQkgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIHJldHVybiBzdHJpbmdzICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKLSAgICB9Ci19Ci0KLS8qIFJlYWQgaW4gYW5kIHN3YXAgdGhlIHJlbG9jcy4gIFRoaXMgcmV0dXJucyBhIGJ1ZmZlciBob2xkaW5nIHRoZQotICAgcmVsb2NzIGZvciBzZWN0aW9uIFNFQyBpbiBmaWxlIEFCRkQuICBJZiBDQUNIRSBpcyB0cnVlIGFuZAotICAgSU5URVJOQUxfUkVMT0NTIGlzIE5VTEwsIHRoZSByZWxvY3MgcmVhZCBpbiB3aWxsIGJlIHNhdmVkIGluIGNhc2UKLSAgIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYWdhaW4uICBJZiBFWFRFUk5BTF9SRUxPQ1MgaXMgbm90IE5VTEwsIGl0Ci0gICBpcyBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgdW5zd2FwcGVkIHJlbG9jcy4gIElmCi0gICBJTlRFUk5BTF9SRUxPQ1MgaXMgbm90IE5VTEwsIGl0IGlzIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkCi0gICB0aGUgc3dhcHBlZCByZWxvY3MuICBJZiBSRVFVSVJFX0lOVEVSTkFMIGlzIHRydWUsIHRoZW4gdGhlIHJldHVybgotICAgdmFsdWUgbXVzdCBiZSBJTlRFUk5BTF9SRUxPQ1MuICBUaGUgZnVuY3Rpb24gcmV0dXJucyBOVUxMIG9uIGVycm9yLiAgKi8KLQotc3RydWN0IGludGVybmFsX3JlbG9jICoKLV9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoYWJmZCwgc2VjLCBjYWNoZSwgZXh0ZXJuYWxfcmVsb2NzLAotCQkJCXJlcXVpcmVfaW50ZXJuYWwsIGludGVybmFsX3JlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBib29sZWFuIGNhY2hlOwotICAgICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzOwotICAgICBib29sZWFuIHJlcXVpcmVfaW50ZXJuYWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotewotICBiZmRfc2l6ZV90eXBlIHJlbHN6OwotICBiZmRfYnl0ZSAqZnJlZV9leHRlcm5hbCA9IE5VTEw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZnJlZV9pbnRlcm5hbCA9IE5VTEw7Ci0gIGJmZF9ieXRlICplcmVsOwotICBiZmRfYnl0ZSAqZXJlbF9lbmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLQotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgIT0gTlVMTAotICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIHJlcXVpcmVfaW50ZXJuYWwpCi0JcmV0dXJuIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3M7Ci0gICAgICBtZW1jcHkgKGludGVybmFsX3JlbG9jcywgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcywKLQkgICAgICBzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKTsKLSAgICAgIHJldHVybiBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgfQotCi0gIHJlbHN6ID0gYmZkX2NvZmZfcmVsc3ogKGFiZmQpOwotCi0gIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlX2V4dGVybmFsID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+cmVsb2NfY291bnQgKiByZWxzeik7Ci0gICAgICBpZiAoZnJlZV9leHRlcm5hbCA9PSBOVUxMICYmIHNlYy0+cmVsb2NfY291bnQgPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gZnJlZV9leHRlcm5hbDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWMtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIHJlbHN6LCBzZWMtPnJlbG9jX2NvdW50LCBhYmZkKQotCSAgIT0gcmVsc3ogKiBzZWMtPnJlbG9jX2NvdW50KSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgZnJlZV9pbnRlcm5hbCA9ICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCi0JCSAgICAgICBiZmRfbWFsbG9jIChzZWMtPnJlbG9jX2NvdW50Ci0JCQkJICAgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpKTsKLSAgICAgIGlmIChmcmVlX2ludGVybmFsID09IE5VTEwgJiYgc2VjLT5yZWxvY19jb3VudCA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBmcmVlX2ludGVybmFsOwotICAgIH0KLQotICAvKiBTd2FwIGluIHRoZSByZWxvY3MuICAqLwotICBlcmVsID0gZXh0ZXJuYWxfcmVsb2NzOwotICBlcmVsX2VuZCA9IGVyZWwgKyByZWxzeiAqIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gIGZvciAoOyBlcmVsIDwgZXJlbF9lbmQ7IGVyZWwgKz0gcmVsc3osIGlyZWwrKykKLSAgICBiZmRfY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCAoUFRSKSBlcmVsLCAoUFRSKSBpcmVsKTsKLQotICBpZiAoZnJlZV9leHRlcm5hbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfZXh0ZXJuYWwpOwotICAgICAgZnJlZV9leHRlcm5hbCA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChjYWNoZSAmJiBmcmVlX2ludGVybmFsICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCi0JewotCSAgc2VjLT51c2VkX2J5X2JmZCA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID0gTlVMTDsKLQl9Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzID0gZnJlZV9pbnRlcm5hbDsKLSAgICB9Ci0KLSAgcmV0dXJuIGludGVybmFsX3JlbG9jczsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfZXh0ZXJuYWwgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dGVybmFsKTsKLSAgaWYgKGZyZWVfaW50ZXJuYWwgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2ludGVybmFsKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCBsaW5lbm9fY291bnQgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMgb2YgYSBDT0ZGIGZpbGUuICAqLwotCi1pbnQKLWNvZmZfY291bnRfbGluZW51bWJlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgaW50IGxpbWl0ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgdG90YWwgPSAwOwotICBhc3ltYm9sICoqcDsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKGxpbWl0ID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBtYXkgYmUgZnJvbSB0aGUgYmFja2VuZCBsaW5rZXIsIGluIHdoaWNoIGNhc2UgdGhlCi0gICAgICAgICBsaW5lbm9fY291bnQgaW4gdGhlIHNlY3Rpb25zIGlzIGNvcnJlY3QuICAqLwotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JdG90YWwgKz0gcy0+bGluZW5vX2NvdW50OwotICAgICAgcmV0dXJuIHRvdGFsOwotICAgIH0KLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICBCRkRfQVNTRVJUIChzLT5saW5lbm9fY291bnQgPT0gMCk7Ci0KLSAgZm9yIChwID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBwKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqcV9tYXliZSA9ICpwOwotCi0gICAgICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAocV9tYXliZSkgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0JewotCSAgY29mZl9zeW1ib2xfdHlwZSAqcSA9IGNvZmZzeW1ib2wgKHFfbWF5YmUpOwotCi0JICAvKiBUaGUgQUlYIDQuMSBjb21waWxlciBjYW4gc29tZXRpbWVzIGdlbmVyYXRlIGxpbmUgbnVtYmVycwotICAgICAgICAgICAgIGF0dGFjaGVkIHRvIGRlYnVnZ2luZyBzeW1ib2xzLiAgV2UgdHJ5IHRvIHNpbXBseSBpZ25vcmUKLSAgICAgICAgICAgICB0aG9zZSBoZXJlLiAgKi8KLQkgIGlmIChxLT5saW5lbm8gIT0gTlVMTAotCSAgICAgICYmIHEtPnN5bWJvbC5zZWN0aW9uLT5vd25lciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGxpbmUgbnVtYmVycy4gIEluY3JlbWVudCB0aGUgb3duaW5nCi0JICAgICAgICAgc2VjdGlvbidzIGxpbmVudW1iZXIgY291bnQuICAqLwotCSAgICAgIGFsZW50ICpsID0gcS0+bGluZW5vOwotCi0JICAgICAgKytxLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudDsKLQkgICAgICArK3RvdGFsOwotCSAgICAgICsrbDsKLQkgICAgICB3aGlsZSAobC0+bGluZV9udW1iZXIgIT0gMCkKLQkJewotCQkgICsrdG90YWw7Ci0JCSAgKytxLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudDsKLQkJICArK2w7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRvdGFsOwotfQotCi0vKiBUYWtlcyBhIGJmZCBhbmQgYSBzeW1ib2wsIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjb2ZmIHNwZWNpZmljCi0gICBhcmVhIG9mIHRoZSBzeW1ib2wgaWYgdGhlcmUgaXMgb25lLiAgKi8KLQotLypBUkdTVVNFRCovCi1jb2ZmX3N5bWJvbF90eXBlICoKLWNvZmZfc3ltYm9sX2Zyb20gKGlnbm9yZV9hYmZkLCBzeW1ib2wpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoc3ltYm9sKSAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICByZXR1cm4gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQotICBpZiAoYmZkX2FzeW1ib2xfYmZkIChzeW1ib2wpLT50ZGF0YS5jb2ZmX29ial9kYXRhID09IChjb2ZmX2RhdGFfdHlwZSAqKSBOVUxMKQotICAgIHJldHVybiAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwotCi0gIHJldHVybiAoY29mZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2w7Ci19Ci0KLXN0YXRpYyB2b2lkCi1maXh1cF9zeW1ib2xfdmFsdWUgKGFiZmQsIGNvZmZfc3ltYm9sX3B0ciwgc3ltZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZfc3ltYm9sX3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltZW50OwotewotCi0gIC8qIE5vcm1hbGl6ZSB0aGUgc3ltYm9sIGZsYWdzICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIGEgY29tbW9uIHN5bWJvbCBpcyB1bmRlZmluZWQgd2l0aCBhIHZhbHVlICovCi0gICAgICBzeW1lbnQtPm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgc3ltZW50LT5uX3ZhbHVlID0gY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wudmFsdWU7Ci0gICAgfQotICBlbHNlIGlmICgoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwCi0JICAgJiYgKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLmZsYWdzICYgQlNGX0RFQlVHR0lOR19SRUxPQykgPT0gMCkKLSAgICB7Ci0gICAgICBzeW1lbnQtPm5fdmFsdWUgPSBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC52YWx1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbikpCi0gICAgewotICAgICAgc3ltZW50LT5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIHN5bWVudC0+bl92YWx1ZSA9IDA7Ci0gICAgfQotICAvKiBGSVhNRTogRG8gd2UgbmVlZCB0byBoYW5kbGUgdGhlIGFic29sdXRlIHNlY3Rpb24gaGVyZT8gICovCi0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbikKLQl7Ci0JICBzeW1lbnQtPm5fc2NudW0gPQotCSAgICBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCi0JICBzeW1lbnQtPm5fdmFsdWUgPSAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wudmFsdWUKLQkJCSAgICAgKyBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIGlmICghIG9ial9wZSAoYWJmZCkpCi0JICAgIHN5bWVudC0+bl92YWx1ZSArPQotCSAgICAgIGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEJGRF9BU1NFUlQgKDApOwotCSAgLyogVGhpcyBjYW4gaGFwcGVuLCBidXQgSSBkb24ndCBrbm93IHdoeSB5ZXQgKHN0ZXZlQGN5Z251cy5jb20pICovCi0JICBzeW1lbnQtPm5fc2NudW0gPSBOX0FCUzsKLQkgIHN5bWVudC0+bl92YWx1ZSA9IGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnZhbHVlOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlIGFuZCB3b3JrIG91dCB3aGF0Ci0gICB0aGVpciBpbmRleGVzIGludG8gdGhlIHN5bWJvbCB0YWJsZSB3aWxsIGJlIHdoZW4gb3V0cHV0LgotCi0gICBDb2ZmIHJlcXVpcmVzIHRoYXQgZWFjaCBDX0ZJTEUgc3ltYm9sIHBvaW50cyB0byB0aGUgbmV4dCBvbmUgaW4gdGhlCi0gICBjaGFpbiwgYW5kIHRoYXQgdGhlIGxhc3Qgb25lIHBvaW50cyB0byB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sLiBXZQotICAgZG8gdGhhdCBoZXJlIHRvby4gICovCi0KLWJvb2xlYW4KLWNvZmZfcmVudW1iZXJfc3ltYm9scyAoYmZkX3B0ciwgZmlyc3RfdW5kZWYpCi0gICAgIGJmZCAqYmZkX3B0cjsKLSAgICAgaW50ICpmaXJzdF91bmRlZjsKLXsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGJmZF9wdHIpOwotICBhc3ltYm9sICoqc3ltYm9sX3B0cl9wdHIgPSBiZmRfcHRyLT5vdXRzeW1ib2xzOwotICB1bnNpZ25lZCBpbnQgbmF0aXZlX2luZGV4ID0gMDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqbGFzdF9maWxlID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikgTlVMTDsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9pbmRleDsKLQotICAvKiBDT0ZGIGRlbWFuZHMgdGhhdCB1bmRlZmluZWQgc3ltYm9scyBjb21lIGFmdGVyIGFsbCBvdGhlciBzeW1ib2xzLgotICAgICBTaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGltcG9zZSB0aGlzIGV4dHJhIGtub3dsZWRnZSBvbiBhbGwgb3VyCi0gICAgIGNsaWVudCBwcm9ncmFtcywgZGVhbCB3aXRoIHRoYXQgaGVyZS4gIFNvcnQgdGhlIHN5bWJvbCB0YWJsZTsKLSAgICAganVzdCBtb3ZlIHRoZSB1bmRlZmluZWQgc3ltYm9scyB0byB0aGUgZW5kLCBsZWF2aW5nIHRoZSByZXN0Ci0gICAgIGFsb25lLiAgVGhlIE8nUmVpbGx5IGJvb2sgc2F5cyB0aGF0IGRlZmluZWQgZ2xvYmFsIHN5bWJvbHMgY29tZQotICAgICBhdCB0aGUgZW5kIGJlZm9yZSB0aGUgdW5kZWZpbmVkIHN5bWJvbHMsIHNvIHdlIGRvIHRoYXQgaGVyZSBhcwotICAgICB3ZWxsLiAgKi8KLSAgLyogQEAgRG8gd2UgaGF2ZSBzb21lIGNvbmRpdGlvbiB3ZSBjb3VsZCB0ZXN0IGZvciwgc28gd2UgZG9uJ3QgYWx3YXlzCi0gICAgIGhhdmUgdG8gZG8gdGhpcz8gIEkgZG9uJ3QgdGhpbmsgcmVsb2NhdGFiaWxpdHkgaXMgcXVpdGUgcmlnaHQsIGJ1dAotICAgICBJJ20gbm90IGNlcnRhaW4uICBbcmFlYnVybjoxOTkyMDUwOC4xNzExRVNUXSAgKi8KLSAgewotICAgIGFzeW1ib2wgKipuZXdzeW1zOwotICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgbmV3c3ltcyA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKGJmZF9wdHIsCi0JCQkJICAgICAgc2l6ZW9mIChhc3ltYm9sICopICogKHN5bWJvbF9jb3VudCArIDEpKTsKLSAgICBpZiAoIW5ld3N5bXMpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgYmZkX3B0ci0+b3V0c3ltYm9scyA9IG5ld3N5bXM7Ci0gICAgZm9yIChpID0gMDsgaSA8IHN5bWJvbF9jb3VudDsgaSsrKQotICAgICAgaWYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkgIT0gMAotCSAgfHwgKCFiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgICAgICYmICFiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgICAgICYmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwCi0JCSAgfHwgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkKLQkJICAgICAgPT0gMCkpKSkKLQkqbmV3c3ltcysrID0gc3ltYm9sX3B0cl9wdHJbaV07Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc3ltYm9sX2NvdW50OyBpKyspCi0gICAgICBpZiAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIEJTRl9OT1RfQVRfRU5EKSA9PSAwCi0JICAmJiAhYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfcHRyX3B0cltpXS0+c2VjdGlvbikKLQkgICYmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgICAgIHx8ICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSA9PSAwCi0JCSAgJiYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkKLQkJICAgICAgIT0gMCkpKSkKLQkqbmV3c3ltcysrID0gc3ltYm9sX3B0cl9wdHJbaV07Ci0KLSAgICAqZmlyc3RfdW5kZWYgPSBuZXdzeW1zIC0gYmZkX3B0ci0+b3V0c3ltYm9sczsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzeW1ib2xfY291bnQ7IGkrKykKLSAgICAgIGlmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX05PVF9BVF9FTkQpID09IDAKLQkgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX3B0cl9wdHJbaV0tPnNlY3Rpb24pKQotCSpuZXdzeW1zKysgPSBzeW1ib2xfcHRyX3B0cltpXTsKLSAgICAqbmV3c3ltcyA9IChhc3ltYm9sICopIE5VTEw7Ci0gICAgc3ltYm9sX3B0cl9wdHIgPSBiZmRfcHRyLT5vdXRzeW1ib2xzOwotICB9Ci0KLSAgZm9yIChzeW1ib2xfaW5kZXggPSAwOyBzeW1ib2xfaW5kZXggPCBzeW1ib2xfY291bnQ7IHN5bWJvbF9pbmRleCsrKQotICAgIHsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZfc3ltYm9sX3B0ciA9IGNvZmZfc3ltYm9sX2Zyb20gKGJmZF9wdHIsIHN5bWJvbF9wdHJfcHRyW3N5bWJvbF9pbmRleF0pOwotICAgICAgc3ltYm9sX3B0cl9wdHJbc3ltYm9sX2luZGV4XS0+dWRhdGEuaSA9IHN5bWJvbF9pbmRleDsgCi0gICAgICBpZiAoY29mZl9zeW1ib2xfcHRyICYmIGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlKQotCXsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnMgPSBjb2ZmX3N5bWJvbF9wdHItPm5hdGl2ZTsKLQkgIGludCBpOwotCi0JICBpZiAocy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotCSAgICB7Ci0JICAgICAgaWYgKGxhc3RfZmlsZSAhPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKSBOVUxMKQotCQlsYXN0X2ZpbGUtPm5fdmFsdWUgPSBuYXRpdmVfaW5kZXg7Ci0JICAgICAgbGFzdF9maWxlID0gJihzLT51LnN5bWVudCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCi0JICAgICAgLyogTW9kaWZ5IHRoZSBzeW1ib2wgdmFsdWVzIGFjY29yZGluZyB0byB0aGVpciBzZWN0aW9uIGFuZAotCSAgICAgICAgIHR5cGUgKi8KLQotCSAgICAgIGZpeHVwX3N5bWJvbF92YWx1ZSAoYmZkX3B0ciwgY29mZl9zeW1ib2xfcHRyLCAmKHMtPnUuc3ltZW50KSk7Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCBzLT51LnN5bWVudC5uX251bWF1eCArIDE7IGkrKykKLQkgICAgc1tpXS5vZmZzZXQgPSBuYXRpdmVfaW5kZXgrKzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbmF0aXZlX2luZGV4Kys7Ci0JfQotICAgIH0KLSAgb2JqX2NvbnZfdGFibGVfc2l6ZSAoYmZkX3B0cikgPSBuYXRpdmVfaW5kZXg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJ1biB0aG9yb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGFnYWluLCBhbmQgZml4IGl0IHNvIHRoYXQgYWxsCi0gICBwb2ludGVycyB0byBlbnRyaWVzIGFyZSBjaGFuZ2VkIHRvIHRoZSBlbnRyaWVzJyBpbmRleCBpbiB0aGUgb3V0cHV0Ci0gICBzeW1ib2wgdGFibGUuICAqLwotCi12b2lkCi1jb2ZmX21hbmdsZV9zeW1ib2xzIChiZmRfcHRyKQotICAgICBiZmQgKmJmZF9wdHI7Ci17Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChiZmRfcHRyKTsKLSAgYXN5bWJvbCAqKnN5bWJvbF9wdHJfcHRyID0gYmZkX3B0ci0+b3V0c3ltYm9sczsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9pbmRleDsKLQotICBmb3IgKHN5bWJvbF9pbmRleCA9IDA7IHN5bWJvbF9pbmRleCA8IHN5bWJvbF9jb3VudDsgc3ltYm9sX2luZGV4KyspCi0gICAgewotICAgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZl9zeW1ib2xfcHRyID0KLSAgICAgIGNvZmZfc3ltYm9sX2Zyb20gKGJmZF9wdHIsIHN5bWJvbF9wdHJfcHRyW3N5bWJvbF9pbmRleF0pOwotCi0gICAgICBpZiAoY29mZl9zeW1ib2xfcHRyICYmIGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlKQotCXsKLQkgIGludCBpOwotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcyA9IGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlOwotCi0JICBpZiAocy0+Zml4X3ZhbHVlKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFdlIHNob3VsZCB1c2UgYSB1bmlvbiBoZXJlLiAgKi8KLQkgICAgICBzLT51LnN5bWVudC5uX3ZhbHVlID0KLQkJKChjb21iaW5lZF9lbnRyeV90eXBlICopIHMtPnUuc3ltZW50Lm5fdmFsdWUpLT5vZmZzZXQ7Ci0JICAgICAgcy0+Zml4X3ZhbHVlID0gMDsKLQkgICAgfQotCSAgaWYgKHMtPmZpeF9saW5lKQotCSAgICB7Ci0JICAgICAgLyogVGhlIHZhbHVlIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgbGluZSBudW1iZXIgZW50cmllcwotICAgICAgICAgICAgICAgICBmb3IgdGhlIHN5bWJvbCdzIHNlY3Rpb24uICBPbiBvdXRwdXQsIHRoZSBzeW1ib2wncwotICAgICAgICAgICAgICAgICBzZWN0aW9uIHNob3VsZCBiZSBOX0RFQlVHLiAgKi8KLQkgICAgICBzLT51LnN5bWVudC5uX3ZhbHVlID0KLQkJKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5saW5lX2ZpbGVwb3MKLQkJICsgcy0+dS5zeW1lbnQubl92YWx1ZSAqIGJmZF9jb2ZmX2xpbmVzeiAoYmZkX3B0cikpOwotCSAgICAgIGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24gPQotCQljb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGJmZF9wdHIsIE5fREVCVUcpOwotCSAgICAgIEJGRF9BU1NFUlQgKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLmZsYWdzICYgQlNGX0RFQlVHR0lORyk7Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCBzLT51LnN5bWVudC5uX251bWF1eDsgaSsrKQotCSAgICB7Ci0JICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYSA9IHMgKyBpICsgMTsKLQkgICAgICBpZiAoYS0+Zml4X3RhZykKLQkJewotCQkgIGEtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LmwgPQotCQkgICAgYS0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgucC0+b2Zmc2V0OwotCQkgIGEtPmZpeF90YWcgPSAwOwotCQl9Ci0JICAgICAgaWYgKGEtPmZpeF9lbmQpCi0JCXsKLQkJICBhLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0KLQkJICAgIGEtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAtPm9mZnNldDsKLQkJICBhLT5maXhfZW5kID0gMDsKLQkJfQotCSAgICAgIGlmIChhLT5maXhfc2NubGVuKQotCQl7Ci0JCSAgYS0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sID0KLQkJICAgIGEtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ucC0+b2Zmc2V0OwotCQkgIGEtPmZpeF9zY25sZW4gPSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotY29mZl9maXhfc3ltYm9sX25hbWUgKGFiZmQsIHN5bWJvbCwgbmF0aXZlLCBzdHJpbmdfc2l6ZV9wLAotCQkgICAgICBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotICAgICBiZmRfc2l6ZV90eXBlICpzdHJpbmdfc2l6ZV9wOwotICAgICBhc2VjdGlvbiAqKmRlYnVnX3N0cmluZ19zZWN0aW9uX3A7Ci0gICAgIGJmZF9zaXplX3R5cGUgKmRlYnVnX3N0cmluZ19zaXplX3A7Ci17Ci0gIHVuc2lnbmVkIGludCBuYW1lX2xlbmd0aDsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXhlbnQ7Ci0gIGNoYXIgKm5hbWUgPSAoY2hhciAqKSAoc3ltYm9sLT5uYW1lKTsKLQotICBpZiAobmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIGNvZmYgc3ltYm9scyBhbHdheXMgaGF2ZSBuYW1lcywgc28gd2UnbGwgbWFrZSBvbmUgdXAgKi8KLSAgICAgIHN5bWJvbC0+bmFtZSA9ICJzdHJhbmdlIjsKLSAgICAgIG5hbWUgPSAoY2hhciAqKSBzeW1ib2wtPm5hbWU7Ci0gICAgfQotICBuYW1lX2xlbmd0aCA9IHN0cmxlbiAobmFtZSk7Ci0KLSAgaWYgKG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFCi0gICAgICAmJiBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgZmlsbm1sZW47Ci0KLSAgICAgIHN0cm5jcHkgKG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbmFtZSwgIi5maWxlIiwgU1lNTk1MRU4pOwotICAgICAgYXV4ZW50ID0gJihuYXRpdmUgKyAxKS0+dS5hdXhlbnQ7Ci0KLSAgICAgIGZpbG5tbGVuID0gYmZkX2NvZmZfZmlsbm1sZW4gKGFiZmQpOwotCi0gICAgICBpZiAoYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMgKGFiZmQpKQotCXsKLQkgIGlmIChuYW1lX2xlbmd0aCA8PSBmaWxubWxlbikKLQkgICAgewotCSAgICAgIHN0cm5jcHkgKGF1eGVudC0+eF9maWxlLnhfZm5hbWUsIG5hbWUsIGZpbG5tbGVuKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXV4ZW50LT54X2ZpbGUueF9uLnhfb2Zmc2V0ID0gKnN0cmluZ19zaXplX3AgKyBTVFJJTkdfU0laRV9TSVpFOwotCSAgICAgIGF1eGVudC0+eF9maWxlLnhfbi54X3plcm9lcyA9IDA7Ci0JICAgICAgKnN0cmluZ19zaXplX3AgKz0gbmFtZV9sZW5ndGggKyAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cm5jcHkgKGF1eGVudC0+eF9maWxlLnhfZm5hbWUsIG5hbWUsIGZpbG5tbGVuKTsKLQkgIGlmIChuYW1lX2xlbmd0aCA+IGZpbG5tbGVuKQotCSAgICBuYW1lW2ZpbG5tbGVuXSA9ICdcMCc7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChuYW1lX2xlbmd0aCA8PSBTWU1OTUxFTikKLQl7Ci0JICAvKiBUaGlzIG5hbWUgd2lsbCBmaXQgaW50byB0aGUgc3ltYm9sIG5lYXRseSAqLwotCSAgc3RybmNweSAobmF0aXZlLT51LnN5bWVudC5fbi5fbl9uYW1lLCBzeW1ib2wtPm5hbWUsIFNZTU5NTEVOKTsKLQl9Ci0gICAgICBlbHNlIGlmICghYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyAoYWJmZCwgJm5hdGl2ZS0+dS5zeW1lbnQpKQotCXsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAoKnN0cmluZ19zaXplX3AKLQkJCQkJCSsgU1RSSU5HX1NJWkVfU0laRSk7Ci0JICBuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX24uX25femVyb2VzID0gMDsKLQkgICpzdHJpbmdfc2l6ZV9wICs9IG5hbWVfbGVuZ3RoICsgMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBmaWxlcG9zOwotCSAgYmZkX2J5dGUgYnVmWzJdOwotCi0JICAvKiBUaGlzIG5hbWUgc2hvdWxkIGJlIHdyaXR0ZW4gaW50byB0aGUgLmRlYnVnIHNlY3Rpb24uICBGb3IKLQkgICAgIHNvbWUgcmVhc29uIGVhY2ggbmFtZSBpcyBwcmVjZWRlZCBieSBhIHR3byBieXRlIGxlbmd0aAotCSAgICAgYW5kIGFsc28gZm9sbG93ZWQgYnkgYSBudWxsIGJ5dGUuICBGSVhNRTogV2UgYXNzdW1lIHRoYXQKLQkgICAgIHRoZSAuZGVidWcgc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGFuZCB0aGF0IGl0Ci0JICAgICBpcyBsYXJnZSBlbm91Z2guICAqLwotCSAgaWYgKCpkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wID09IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICAqZGVidWdfc3RyaW5nX3NlY3Rpb25fcCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0JICBmaWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgbmFtZV9sZW5ndGggKyAxLCBidWYpOwotCSAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsCi0JCQkJCSAqZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwKLQkJCQkJIChQVFIpIGJ1ZiwKLQkJCQkJIChmaWxlX3B0cikgKmRlYnVnX3N0cmluZ19zaXplX3AsCi0JCQkJCSAoYmZkX3NpemVfdHlwZSkgMikKLQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLAotCQkJCQkgICAgKmRlYnVnX3N0cmluZ19zZWN0aW9uX3AsCi0JCQkJCSAgICAoUFRSKSBzeW1ib2wtPm5hbWUsCi0JCQkJCSAgICAoKGZpbGVfcHRyKSAqZGVidWdfc3RyaW5nX3NpemVfcAotCQkJCQkgICAgICsgMiksCi0JCQkJCSAgICAoYmZkX3NpemVfdHlwZSkgbmFtZV9sZW5ndGggKyAxKSkKLQkgICAgYWJvcnQgKCk7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotCSAgICBhYm9ydCAoKTsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAqZGVidWdfc3RyaW5nX3NpemVfcCArIDI7Ci0JICBuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX24uX25femVyb2VzID0gMDsKLQkgICpkZWJ1Z19zdHJpbmdfc2l6ZV9wICs9IG5hbWVfbGVuZ3RoICsgMzsKLQl9Ci0gICAgfQotfQotCi0vKiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHN5bWJvbCBpbmRleCBzbyB0aGF0IHdoZW4gd2Ugd3JpdGUgb3V0Ci0gICB0aGUgcmVsb2NzIHdlIGNhbiBnZXQgdGhlIGluZGV4IGZvciBhIHN5bWJvbC4gIFRoaXMgbWV0aG9kIGlzIGEKLSAgIGhhY2suICBGSVhNRS4gICovCi0KLSNkZWZpbmUgc2V0X2luZGV4KHN5bWJvbCwgaWR4KQkoKHN5bWJvbCktPnVkYXRhLmkgPSAoaWR4KSkKLQotLyogV3JpdGUgYSBzeW1ib2wgb3V0IHRvIGEgQ09GRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfd3JpdGVfc3ltYm9sIChhYmZkLCBzeW1ib2wsIG5hdGl2ZSwgd3JpdHRlbiwgc3RyaW5nX3NpemVfcCwKLQkJICAgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKLSAgICAgdW5zaWduZWQgaW50ICp3cml0dGVuOwotICAgICBiZmRfc2l6ZV90eXBlICpzdHJpbmdfc2l6ZV9wOwotICAgICBhc2VjdGlvbiAqKmRlYnVnX3N0cmluZ19zZWN0aW9uX3A7Ci0gICAgIGJmZF9zaXplX3R5cGUgKmRlYnVnX3N0cmluZ19zaXplX3A7Ci17Ci0gIHVuc2lnbmVkIGludCBudW1hdXggPSBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4OwotICBpbnQgdHlwZSA9IG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlOwotICBpbnQgY2xhc3MgPSBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzOwotICBQVFIgYnVmOwotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLQotICBpZiAobmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0gICAgc3ltYm9sLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotCi0gIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0RFQlVHR0lORwotICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fREVCVUc7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9BQlM7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPQotCXN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLSAgY29mZl9maXhfc3ltYm9sX25hbWUgKGFiZmQsIHN5bWJvbCwgbmF0aXZlLCBzdHJpbmdfc2l6ZV9wLAotCQkJZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCk7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgYnVmID0gYmZkX2FsbG9jIChhYmZkLCBzeW1lc3opOwotICBpZiAoIWJ1ZikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgJm5hdGl2ZS0+dS5zeW1lbnQsIGJ1Zik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgc3ltZXN6LCBhYmZkKSAhPSBzeW1lc3opCi0gICAgcmV0dXJuIGZhbHNlOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgYnVmKTsKLQotICBpZiAobmF0aXZlLT51LnN5bWVudC5uX251bWF1eCA+IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBhdXhlc3o7Ci0gICAgICB1bnNpZ25lZCBpbnQgajsKLQotICAgICAgYXV4ZXN6ID0gYmZkX2NvZmZfYXV4ZXN6IChhYmZkKTsKLSAgICAgIGJ1ZiA9IGJmZF9hbGxvYyAoYWJmZCwgYXV4ZXN6KTsKLSAgICAgIGlmICghYnVmKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4OyBqKyspCi0JewotCSAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChhYmZkLAotCQkJCSAmKChuYXRpdmUgKyBqICsgMSktPnUuYXV4ZW50KSwKLQkJCQkgdHlwZSwKLQkJCQkgY2xhc3MsCi0JCQkJIGosCi0JCQkJIG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXgsCi0JCQkJIGJ1Zik7Ci0JICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIGF1eGVzeiwgYWJmZCkgIT0gYXV4ZXN6KQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJ1Zik7Ci0gICAgfQotCi0gIC8qIFN0b3JlIHRoZSBpbmRleCBmb3IgdXNlIHdoZW4gd2Ugd3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotICBzZXRfaW5kZXggKHN5bWJvbCwgKndyaXR0ZW4pOwotCi0gICp3cml0dGVuICs9IG51bWF1eCArIDE7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSBzeW1ib2wgdG8gYSBDT0ZGIGZpbGUgdGhhdCBkb2VzIG5vdCBjb21lIGZyb20gYSBDT0ZGCi0gICBmaWxlIG9yaWdpbmFsbHkuICBUaGlzIHN5bWJvbCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlIGxpbmtlciwKLSAgIG9yIHdlIG1heSBiZSBsaW5raW5nIGEgbm9uIENPRkYgZmlsZSB0byBhIENPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCB3cml0dGVuLCBzdHJpbmdfc2l6ZV9wLAotCQkJIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgKndyaXR0ZW47Ci0gICAgIGJmZF9zaXplX3R5cGUgKnN0cmluZ19zaXplX3A7Ci0gICAgIGFzZWN0aW9uICoqZGVidWdfc3RyaW5nX3NlY3Rpb25fcDsKLSAgICAgYmZkX3NpemVfdHlwZSAqZGVidWdfc3RyaW5nX3NpemVfcDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotICBjb21iaW5lZF9lbnRyeV90eXBlIGR1bW15OwotCi0gIG5hdGl2ZSA9ICZkdW1teTsKLSAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgPSBUX05VTEw7Ci0gIG5hdGl2ZS0+dS5zeW1lbnQubl9mbGFncyA9IDA7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IHN5bWJvbC0+dmFsdWU7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IHN5bWJvbC0+dmFsdWU7Ci0gICAgfQotICBlbHNlIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0RFQlVHR0lORykKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBpc24ndCBtdWNoIHBvaW50IHRvIHdyaXRpbmcgb3V0IGEgZGVidWdnaW5nIHN5bWJvbAotICAgICAgICAgdW5sZXNzIHdlIGFyZSBwcmVwYXJlZCB0byBjb252ZXJ0IGl0IGludG8gQ09GRiBkZWJ1Z2dpbmcKLSAgICAgICAgIGZvcm1hdC4gIFNvLCB3ZSBqdXN0IGlnbm9yZSB0aGVtLiAgV2UgbXVzdCBjbG9iYmVyIHRoZSBzeW1ib2wKLSAgICAgICAgIG5hbWUgdG8ga2VlcCBpdCBmcm9tIGJlaW5nIHB1dCBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgICAgIHN5bWJvbC0+bmFtZSA9ICIiOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0KLQlzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgPSAoc3ltYm9sLT52YWx1ZQotCQkJCSAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKCEgb2JqX3BlIChhYmZkKSkKLQluYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICAvKiBDb3B5IHRoZSBhbnkgZmxhZ3MgZnJvbSB0aGUgdGhlIGZpbGUgaGVhZGVyIGludG8gdGhlIHN5bWJvbC4KLSAgICAgICAgIEZJWE1FOiBXaHk/ICAqLwotICAgICAgewotCWNvZmZfc3ltYm9sX3R5cGUgKmMgPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1ib2wpOwotCWlmIChjICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwpCi0JICBuYXRpdmUtPnUuc3ltZW50Lm5fZmxhZ3MgPSBiZmRfYXN5bWJvbF9iZmQgKCZjLT5zeW1ib2wpLT5mbGFnczsKLSAgICAgIH0KLSAgICB9Ci0KLSAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgPSAwOwotICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkKLSAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gQ19TVEFUOwotICBlbHNlIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspCi0gICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9IG9ial9wZSAoYWJmZCkgPyBDX05UX1dFQUsgOiBDX1dFQUtFWFQ7Ci0gIGVsc2UKLSAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gQ19FWFQ7Ci0gIG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPSAwOwotCi0gIHJldHVybiBjb2ZmX3dyaXRlX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCBuYXRpdmUsIHdyaXR0ZW4sIHN0cmluZ19zaXplX3AsCi0JCQkgICAgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCk7Ci19Ci0KLS8qIFdyaXRlIGEgbmF0aXZlIHN5bWJvbCB0byBhIENPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wgKGFiZmQsIHN5bWJvbCwgd3JpdHRlbiwgc3RyaW5nX3NpemVfcCwKLQkJCSAgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb2ZmX3N5bWJvbF90eXBlICpzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCAqd3JpdHRlbjsKLSAgICAgYmZkX3NpemVfdHlwZSAqc3RyaW5nX3NpemVfcDsKLSAgICAgYXNlY3Rpb24gKipkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wOwotICAgICBiZmRfc2l6ZV90eXBlICpkZWJ1Z19zdHJpbmdfc2l6ZV9wOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmUgPSBzeW1ib2wtPm5hdGl2ZTsKLSAgYWxlbnQgKmxpbmVubyA9IHN5bWJvbC0+bGluZW5vOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhbiBhc3NvY2lhdGVkIGxpbmUgbnVtYmVyLCB3ZSBtdXN0IHN0b3JlIHRoZQotICAgICBzeW1ib2wgaW5kZXggaW4gdGhlIGxpbmUgbnVtYmVyIGZpZWxkLiAgV2UgYWxzbyB0YWcgdGhlIGF1eGVudCB0bwotICAgICBwb2ludCB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIGxpbmVubyB0YWJsZS4gICovCi0gIGlmIChsaW5lbm8gJiYgIXN5bWJvbC0+ZG9uZV9saW5lbm8gJiYgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbi0+b3duZXIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotICAgICAgbGluZW5vW2NvdW50XS51Lm9mZnNldCA9ICp3cml0dGVuOwotICAgICAgaWYgKG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXgpCi0JewotCSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphID0gJigobmF0aXZlICsgMSktPnUuYXV4ZW50KTsKLQotCSAgYS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0KLQkgICAgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm1vdmluZ19saW5lX2ZpbGVwb3M7Ci0JfQotCi0gICAgICAvKiBDb3VudCBhbmQgcmVsb2NhdGUgYWxsIG90aGVyIGxpbmVudW1iZXJzLiAgKi8KLSAgICAgIGNvdW50Kys7Ci0gICAgICB3aGlsZSAobGluZW5vW2NvdW50XS5saW5lX251bWJlciAhPSAwKQotCXsKLSNpZiAwCi0JICAvKiAxMyBhcHJpbCA5Mi4gc2FjIAotCSAgICAgSSd2ZSBiZWVuIHRvbGQgdGhpcywgYnV0IHN0aWxsIG5lZWQgcHJvb2Y6Ci0JICAgICA+IFRoZSBzZWNvbmQgYnVnIGlzIGFsc28gaW4gYGJmZC9jb2ZmY29kZS5oJy4gIFRoaXMgYnVnCi0JICAgICA+IGNhdXNlcyB0aGUgbGlua2VyIHRvIHNjcmV3IHVwIHRoZSBwYy1yZWxvY2F0aW9ucyBmb3IKLQkgICAgID4gYWxsIHRoZSBsaW5lIG51bWJlcnMgaW4gQ09GRiBjb2RlLiAgVGhpcyBidWcgaXNuJ3Qgb25seQotCSAgICAgPiBzcGVjaWZpYyB0byBBMjlLIGltcGxlbWVudGF0aW9ucywgYnV0IGFmZmVjdHMgYWxsCi0JICAgICA+IHN5c3RlbXMgdXNpbmcgQ09GRiBmb3JtYXQgYmluYXJpZXMuICBOb3RlIHRoYXQgaW4gQ09GRgotCSAgICAgPiBvYmplY3QgZmlsZXMsIHRoZSBsaW5lIG51bWJlciBjb3JlIG9mZnNldHMgb3V0cHV0IGJ5Ci0JICAgICA+IHRoZSBhc3NlbWJsZXIgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiBlYWNoCi0JICAgICA+IHByb2NlZHVyZSwgbm90IHRvIHRoZSBzdGFydCBvZiB0aGUgLnRleHQgc2VjdGlvbi4gIFRoaXMKLQkgICAgID4gcGF0Y2ggcmVsb2NhdGVzIHRoZSBsaW5lIG51bWJlcnMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICA+IGBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUnIGluc3RlYWQgb2YgdGhlIHNlY3Rpb24KLQkgICAgID4gdmlydHVhbCBhZGRyZXNzLgotCSAgICAgPiBtb2R1bGFyIW9sc29uQGNzLmFyaXpvbmEuZWR1IChKb24gT2xzb24pCi0JICAgKi8KLQkgIGxpbmVub1tjb3VudF0udS5vZmZzZXQgKz0gbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlOwotI2Vsc2UKLQkgIGxpbmVub1tjb3VudF0udS5vZmZzZXQgKz0KLQkgICAgKHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICsgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0jZW5kaWYKLQkgIGNvdW50Kys7Ci0JfQotICAgICAgc3ltYm9sLT5kb25lX2xpbmVubyA9IHRydWU7Ci0KLSAgICAgIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5tb3ZpbmdfbGluZV9maWxlcG9zICs9Ci0JY291bnQgKiBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotICAgIH0KLQotICByZXR1cm4gY29mZl93cml0ZV9zeW1ib2wgKGFiZmQsICYoc3ltYm9sLT5zeW1ib2wpLCBuYXRpdmUsIHdyaXR0ZW4sCi0JCQkgICAgc3RyaW5nX3NpemVfcCwgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwKLQkJCSAgICBkZWJ1Z19zdHJpbmdfc2l6ZV9wKTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBDT0ZGIHN5bWJvbHMuICAqLwotCi1ib29sZWFuCi1jb2ZmX3dyaXRlX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzdHJpbmdfc2l6ZTsKLSAgYXNlY3Rpb24gKmRlYnVnX3N0cmluZ19zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIGRlYnVnX3N0cmluZ19zaXplOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IGxpbWl0ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCB3cml0dGVuID0gMDsKLSAgYXN5bWJvbCAqKnA7Ci0KLSAgc3RyaW5nX3NpemUgPSAwOwotICBkZWJ1Z19zdHJpbmdfc2VjdGlvbiA9IE5VTEw7Ci0gIGRlYnVnX3N0cmluZ19zaXplID0gMDsKLQotICAvKiBJZiB0aGlzIHRhcmdldCBzdXBwb3J0cyBsb25nIHNlY3Rpb24gbmFtZXMsIHRoZXkgbXVzdCBiZSBwdXQgaW50bwotICAgICB0aGUgc3RyaW5nIHRhYmxlLiAgVGhpcyBpcyBzdXBwb3J0ZWQgYnkgUEUuICBUaGlzIGNvZGUgbXVzdAotICAgICBoYW5kbGUgc2VjdGlvbiBuYW1lcyBqdXN0IGFzIHRoZXkgYXJlIGhhbmRsZWQgaW4KLSAgICAgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMuICAqLwotICBpZiAoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIChhYmZkKSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLQotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgc2l6ZV90IGxlbjsKLQotCSAgbGVuID0gc3RybGVuIChvLT5uYW1lKTsKLQkgIGlmIChsZW4gPiBTQ05OTUxFTikKLQkgICAgc3RyaW5nX3NpemUgKz0gbGVuICsgMTsKLQl9Ci0gICAgfQotCi0gIC8qIFNlZWsgdG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE91dHB1dCBhbGwgdGhlIHN5bWJvbHMgd2UgaGF2ZSAqLwotCi0gIHdyaXR0ZW4gPSAwOwotICBmb3IgKHAgPSBhYmZkLT5vdXRzeW1ib2xzLCBpID0gMDsgaSA8IGxpbWl0OyBpKyssIHArKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW1ib2wgPSAqcDsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNfc3ltYm9sID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKLQotICAgICAgaWYgKGNfc3ltYm9sID09IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwKLQkgIHx8IGNfc3ltYm9sLT5uYXRpdmUgPT0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgTlVMTCkKLQl7Ci0JICBpZiAoIWNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sIChhYmZkLCBzeW1ib2wsICZ3cml0dGVuLCAmc3RyaW5nX3NpemUsCi0JCQkJCSZkZWJ1Z19zdHJpbmdfc2VjdGlvbiwKLQkJCQkJJmRlYnVnX3N0cmluZ19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoIWNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCAoYWJmZCwgY19zeW1ib2wsICZ3cml0dGVuLAotCQkJCQkgJnN0cmluZ19zaXplLCAmZGVidWdfc3RyaW5nX3NlY3Rpb24sCi0JCQkJCSAmZGVidWdfc3RyaW5nX3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPSB3cml0dGVuOwotCi0gIC8qIE5vdyB3cml0ZSBvdXQgc3RyaW5ncyAqLwotCi0gIGlmIChzdHJpbmdfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzaXplID0gc3RyaW5nX3NpemUgKyBTVFJJTkdfU0laRV9TSVpFOwotICAgICAgYmZkX2J5dGUgYnVmZmVyW1NUUklOR19TSVpFX1NJWkVdOwotCi0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNpemUsIGJ1ZmZlcik7Ci0jZWxzZQotICNlcnJvciBDaGFuZ2UgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmZlciwgMSwgc2l6ZW9mIChidWZmZXIpLCBhYmZkKSAhPSBzaXplb2YgKGJ1ZmZlcikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLiAgVGhpcyBjb2RlIG11c3QgaGFuZGxlIHNlY3Rpb24KLQkgbmFtZXMganVzdCBhcyB0aGV5IGFyZSBoYW5kbGVkIGluIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMgKGFiZmQpKQotCXsKLQkgIGFzZWN0aW9uICpvOwotCi0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIHNpemVfdCBsZW47Ci0KLQkgICAgICBsZW4gPSBzdHJsZW4gKG8tPm5hbWUpOwotCSAgICAgIGlmIChsZW4gPiBTQ05OTUxFTikKLQkJewotCQkgIGlmIChiZmRfd3JpdGUgKG8tPm5hbWUsIDEsIGxlbiArIDEsIGFiZmQpICE9IGxlbiArIDEpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgZm9yIChwID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7Ci0JICAgaSA8IGxpbWl0OwotCSAgIGkrKywgcCsrKQotCXsKLQkgIGFzeW1ib2wgKnEgPSAqcDsKLQkgIHNpemVfdCBuYW1lX2xlbmd0aCA9IHN0cmxlbiAocS0+bmFtZSk7Ci0JICBjb2ZmX3N5bWJvbF90eXBlICpjX3N5bWJvbCA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHEpOwotCSAgc2l6ZV90IG1heGxlbjsKLQotCSAgLyogRmlndXJlIG91dCB3aGV0aGVyIHRoZSBzeW1ib2wgbmFtZSBzaG91bGQgZ28gaW4gdGhlIHN0cmluZwotCSAgICAgdGFibGUuICBTeW1ib2wgbmFtZXMgdGhhdCBhcmUgc2hvcnQgZW5vdWdoIGFyZSBzdG9yZWQKLQkgICAgIGRpcmVjdGx5IGluIHRoZSBzeW1lbnQgc3RydWN0dXJlLiAgRmlsZSBuYW1lcyBwZXJtaXQgYQotCSAgICAgZGlmZmVyZW50LCBsb25nZXIsIGxlbmd0aCBpbiB0aGUgc3ltZW50IHN0cnVjdHVyZS4gIE9uCi0JICAgICBYQ09GRiwgc29tZSBzeW1ib2wgbmFtZXMgYXJlIHN0b3JlZCBpbiB0aGUgLmRlYnVnIHNlY3Rpb24KLQkgICAgIHJhdGhlciB0aGFuIGluIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCi0JICBpZiAoY19zeW1ib2wgPT0gTlVMTAotCSAgICAgIHx8IGNfc3ltYm9sLT5uYXRpdmUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgbm90IGEgQ09GRiBzeW1ib2wsIHNvIGl0IGNlcnRhaW5seSBpcyBub3QgYQotCSAgICAgICAgIGZpbGUgbmFtZSwgbm9yIGRvZXMgaXQgZ28gaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLQkgICAgICBtYXhsZW4gPSBTWU1OTUxFTjsKLQkgICAgfQotCSAgZWxzZSBpZiAoYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyAoYWJmZCwKLQkJCQkJICAgICAgJmNfc3ltYm9sLT5uYXRpdmUtPnUuc3ltZW50KSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc3ltYm9sIG5hbWUgaXMgaW4gdGhlIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uLgotCSAgICAgICAgIERvbid0IHdyaXRlIGl0IGludG8gdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICAgICAgbWF4bGVuID0gbmFtZV9sZW5ndGg7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGNfc3ltYm9sLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRQotCQkgICAmJiBjX3N5bWJvbC0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eCA+IDApCi0JICAgIG1heGxlbiA9IGJmZF9jb2ZmX2ZpbG5tbGVuIChhYmZkKTsKLQkgIGVsc2UKLQkgICAgbWF4bGVuID0gU1lNTk1MRU47Ci0KLQkgIGlmIChuYW1lX2xlbmd0aCA+IG1heGxlbikKLQkgICAgewotCSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIChxLT5uYW1lKSwgMSwgbmFtZV9sZW5ndGggKyAxLCBhYmZkKQotCQkgICE9IG5hbWVfbGVuZ3RoICsgMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIHdvdWxkIG5vcm1hbGx5IG5vdCB3cml0ZSBhbnl0aGluZyBoZXJlLCBidXQgd2UnbGwgd3JpdGUKLSAgICAgICAgIG91dCA0IHNvIHRoYXQgYW55IHN0dXBpZCBjb2ZmIHJlYWRlciB3aGljaCB0cmllcyB0byByZWFkIHRoZQotICAgICAgICAgc3RyaW5nIHRhYmxlIGV2ZW4gd2hlbiB0aGVyZSBpc24ndCBvbmUgd29uJ3QgY3JvYWsuICAqLwotICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBTVFJJTkdfU0laRV9TSVpFOwotICAgICAgYmZkX2J5dGUgYnVmZmVyW1NUUklOR19TSVpFX1NJWkVdOwotCi0jaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNpemUsIGJ1ZmZlcik7Ci0jZWxzZQotICNlcnJvciBDaGFuZ2UgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmZlciwgMSwgU1RSSU5HX1NJWkVfU0laRSwgYWJmZCkKLQkgICE9IFNUUklOR19TSVpFX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhlIC5kZWJ1ZyBzZWN0aW9uIHdhcyBjcmVhdGVkIHRvIGJlIHRoZSBjb3JyZWN0IHNpemUuCi0gICAgIFdlIHNob3VsZCBjcmVhdGUgaXQgb3Vyc2VsdmVzIG9uIHRoZSBmbHksIGJ1dCB3ZSBkb24ndCBiZWNhdXNlCi0gICAgIEJGRCB3b24ndCBsZXQgdXMgd3JpdGUgdG8gYW55IHNlY3Rpb24gdW50aWwgd2Uga25vdyBob3cgbGFyZ2UgYWxsCi0gICAgIHRoZSBzZWN0aW9ucyBhcmUuICBXZSBjb3VsZCBzdGlsbCBkbyBpdCBieSBtYWtpbmcgYW5vdGhlciBwYXNzCi0gICAgIG92ZXIgdGhlIHN5bWJvbHMuICBGSVhNRS4gICovCi0gIEJGRF9BU1NFUlQgKGRlYnVnX3N0cmluZ19zaXplID09IDAKLQkgICAgICB8fCAoZGVidWdfc3RyaW5nX3NlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwKLQkJICAmJiAoQkZEX0FMSUdOIChkZWJ1Z19zdHJpbmdfc2l6ZSwKLQkJCQkgMSA8PCBkZWJ1Z19zdHJpbmdfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKQotCQkgICAgICA9PSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBkZWJ1Z19zdHJpbmdfc2VjdGlvbikpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLWNvZmZfd3JpdGVfbGluZW51bWJlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJmZF9zaXplX3R5cGUgbGluZXN6OwotICBQVFIgYnVmZjsKLQotICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotICBidWZmID0gYmZkX2FsbG9jIChhYmZkLCBsaW5lc3opOwotICBpZiAoIWJ1ZmYpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKHMtPmxpbmVub19jb3VudCkKLQl7Ci0JICBhc3ltYm9sICoqcSA9IGFiZmQtPm91dHN5bWJvbHM7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIHMtPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZpbmQgYWxsIHRoZSBsaW5lbnVtYmVycyBpbiB0aGlzIHNlY3Rpb24gKi8KLQkgIHdoaWxlICgqcSkKLQkgICAgewotCSAgICAgIGFzeW1ib2wgKnAgPSAqcTsKLQkgICAgICBpZiAocC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gcykKLQkJewotCQkgIGFsZW50ICpsID0KLQkJICBCRkRfU0VORCAoYmZkX2FzeW1ib2xfYmZkIChwKSwgX2dldF9saW5lbm8sCi0JCQkgICAgKGJmZF9hc3ltYm9sX2JmZCAocCksIHApKTsKLQkJICBpZiAobCkKLQkJICAgIHsKLQkJICAgICAgLyogRm91bmQgYSBsaW5lbnVtYmVyIGVudHJ5LCBvdXRwdXQgKi8KLQkJICAgICAgc3RydWN0IGludGVybmFsX2xpbmVubyBvdXQ7Ci0JCSAgICAgIG1lbXNldCAoKFBUUikgJiBvdXQsIDAsIHNpemVvZiAob3V0KSk7Ci0JCSAgICAgIG91dC5sX2xubm8gPSAwOwotCQkgICAgICBvdXQubF9hZGRyLmxfc3ltbmR4ID0gbC0+dS5vZmZzZXQ7Ci0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJm91dCwgYnVmZik7Ci0JCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGxpbmVzeiwgYWJmZCkgIT0gbGluZXN6KQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBsKys7Ci0JCSAgICAgIHdoaWxlIChsLT5saW5lX251bWJlcikKLQkJCXsKLQkJCSAgb3V0LmxfbG5ubyA9IGwtPmxpbmVfbnVtYmVyOwotCQkJICBvdXQubF9hZGRyLmxfc3ltbmR4ID0gbC0+dS5vZmZzZXQ7Ci0JCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJm91dCwgYnVmZik7Ci0JCQkgIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGxpbmVzeiwgYWJmZCkgIT0gbGluZXN6KQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgbCsrOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgcSsrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIGJ1ZmYpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLypBUkdTVVNFRCAqLwotYWxlbnQgKgotY29mZl9nZXRfbGluZW5vIChpZ25vcmVfYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsKLSAgcmV0dXJuIGNvZmZzeW1ib2wgKHN5bWJvbCktPmxpbmVubzsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scywgd2hpY2ggaGFzIGJlZW4KLSAgIGRpc2FibGVkLiAgKi8KLQotYXN5bWJvbCAqCi1jb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsIG5hbWUpOwotICBhc3ltYm9sICpzeW07Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmNzeW07Ci0KLSAgc3ltID0gc2VjLT5zeW1ib2w7Ci0gIGNzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW0pLT5uYXRpdmU7Ci0gIC8qIE1ha2Ugc3VyZSBiYWNrLWVuZCBDT0ZGIHN0dWZmIGlzIHRoZXJlLiAgKi8KLSAgaWYgKGNzeW0gPT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZm9vCi0JewotCSAgY29mZl9zeW1ib2xfdHlwZSBzeW07Ci0JICAvKiBAQEZJWE1FIFRoaXMgc2hvdWxkbid0IHVzZSBhIGZpeGVkIHNpemUhISAgKi8KLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgZVsxMF07Ci0JfTsKLSAgICAgIHN0cnVjdCBmb28gKmY7Ci0gICAgICBmID0gKHN0cnVjdCBmb28gKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCpmKSk7Ci0gICAgICBpZiAoIWYpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIG1lbXNldCAoKGNoYXIgKikgZiwgMCwgc2l6ZW9mICgqZikpOwotICAgICAgY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltKS0+bmF0aXZlID0gY3N5bSA9IGYtPmU7Ci0gICAgfQotICBjc3ltWzBdLnUuc3ltZW50Lm5fc2NsYXNzID0gQ19TVEFUOwotICBjc3ltWzBdLnUuc3ltZW50Lm5fbnVtYXV4ID0gMTsKLS8qICBTRl9TRVRfU1RBVElDUyAoc3ltKTsgICAgICAgQEAgPz8/ICovCi0gIGNzeW1bMV0udS5hdXhlbnQueF9zY24ueF9zY25sZW4gPSBzZWMtPl9yYXdfc2l6ZTsKLSAgY3N5bVsxXS51LmF1eGVudC54X3Njbi54X25yZWxvYyA9IHNlYy0+cmVsb2NfY291bnQ7Ci0gIGNzeW1bMV0udS5hdXhlbnQueF9zY24ueF9ubGlubm8gPSBzZWMtPmxpbmVub19jb3VudDsKLQotICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzZWM7Ci0gICAgICBzZWMtPm91dHB1dF9vZmZzZXQgPSAwOwotICAgIH0KLQotICByZXR1cm4gc3ltOwotfQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIG9mZnNldHMgaW50byB0aGUgc3ltYm9sIHRhYmxlIGludG8KLSAgIHBvaW50ZXJzIHRvIHN5bWVudHMuICAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9wb2ludGVyaXplX2F1eCAoYWJmZCwgdGFibGVfYmFzZSwgc3ltYm9sLCBpbmRhdXgsIGF1eGVudCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRhdXg7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eGVudDsKLXsKLSAgdW5zaWduZWQgaW50IHR5cGUgPSBzeW1ib2wtPnUuc3ltZW50Lm5fdHlwZTsKLSAgdW5zaWduZWQgaW50IGNsYXNzID0gc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzczsKLQotICBpZiAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaykKLSAgICB7Ci0gICAgICBpZiAoKCpjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKQotCSAgKGFiZmQsIHRhYmxlX2Jhc2UsIHN5bWJvbCwgaW5kYXV4LCBhdXhlbnQpKQotCXJldHVybjsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgYm90aGVyIGlmIHRoaXMgaXMgYSBmaWxlIG9yIGEgc2VjdGlvbiAqLwotICBpZiAoY2xhc3MgPT0gQ19TVEFUICYmIHR5cGUgPT0gVF9OVUxMKQotICAgIHJldHVybjsKLSAgaWYgKGNsYXNzID09IENfRklMRSkKLSAgICByZXR1cm47Ci0KLSAgLyogT3RoZXJ3aXNlIHBhdGNoIHVwICovCi0jZGVmaW5lIE5fVE1BU0sgY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0c2hmdAotICBpZiAoKElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpIHx8IGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04pCi0gICAgICAmJiBhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPiAwKQotICAgIHsKLSAgICAgIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgucCA9Ci0JdGFibGVfYmFzZSArIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubDsKLSAgICAgIGF1eGVudC0+Zml4X2VuZCA9IDE7Ci0gICAgfQotICAvKiBBIG5lZ2F0aXZlIHRhZ25keCBpcyBtZWFuaW5nbGVzcywgYnV0IHRoZSBTQ08gMy4ydjQgY2MgY2FuCi0gICAgIGdlbmVyYXRlIG9uZSwgc28gd2UgbXVzdCBiZSBjYXJlZnVsIHRvIGlnbm9yZSBpdC4gICovCi0gIGlmIChhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LmwgPiAwKQotICAgIHsKLSAgICAgIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgucCA9Ci0JdGFibGVfYmFzZSArIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgubDsKLSAgICAgIGF1eGVudC0+Zml4X3RhZyA9IDE7Ci0gICAgfQotfQotCi0vKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlICIuZGVidWciIHNlY3Rpb24sIGFuZCByZWFkIGl0LgotICAgV2UgZGlkIG5vdCByZWFkIHRoZSBkZWJ1ZyBzZWN0aW9uIHVudGlsIG5vdywgYmVjYXVzZQotICAgd2UgZGlkbid0IHdhbnQgdG8gZ28gdG8gdGhlIHRyb3VibGUgdW50aWwgc29tZW9uZSBuZWVkZWQgaXQuICovCi0KLXN0YXRpYyBjaGFyICoKLWJ1aWxkX2RlYnVnX3NlY3Rpb24gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqZGVidWdfc2VjdGlvbjsKLSAgbG9uZyBwb3NpdGlvbjsKLQotICBhc2VjdGlvbiAqc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0KLSAgaWYgKCFzZWN0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19kZWJ1Z19zZWN0aW9uKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBkZWJ1Z19zZWN0aW9uID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdCkpOwotICBpZiAoZGVidWdfc2VjdGlvbiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYC5kZWJ1Zycgc2VjdGlvbiBhbmQgcmVhZCBpdC4gCi0gICAgIFNhdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gZmlyc3Q7IGl0IGlzIG5lZWRlZCBieSBvdXIgY2FsbGVyLgotICAgICBUaGVuIHJlYWQgZGVidWcgc2VjdGlvbiBhbmQgcmVzZXQgdGhlIGZpbGUgcG9pbnRlci4gICovCi0KLSAgcG9zaXRpb24gPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdC0+ZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoZGVidWdfc2VjdGlvbiwKLQkJICAgIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdCksIDEsIGFiZmQpCi0JICAhPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3QpKQotICAgICAgfHwgYmZkX3NlZWsgKGFiZmQsIHBvc2l0aW9uLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGRlYnVnX3NlY3Rpb247Ci19Ci0KLQotLyogUmV0dXJuIGEgcG9pbnRlciB0byBhIG1hbGxvYydkIGNvcHkgb2YgJ25hbWUnLiAgJ25hbWUnIG1heSBub3QgYmUKLSAgIFwwLXRlcm1pbmF0ZWQsIGJ1dCB3aWxsIG5vdCBleGNlZWQgJ21heGxlbicgY2hhcmFjdGVycy4gIFRoZSBjb3B5ICp3aWxsKgotICAgYmUgXDAtdGVybWluYXRlZC4gICovCi1zdGF0aWMgY2hhciAqCi1jb3B5X25hbWUgKGFiZmQsIG5hbWUsIG1heGxlbikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgbWF4bGVuOwotewotICBpbnQgbGVuOwotICBjaGFyICpuZXduYW1lOwotCi0gIGZvciAobGVuID0gMDsgbGVuIDwgbWF4bGVuOyArK2xlbikKLSAgICB7Ci0gICAgICBpZiAobmFtZVtsZW5dID09ICdcMCcpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoKG5ld25hbWUgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIGxlbiArIDEpKSA9PSBOVUxMKQotICAgIHJldHVybiAoTlVMTCk7Ci0gIHN0cm5jcHkgKG5ld25hbWUsIG5hbWUsIGxlbik7Ci0gIG5ld25hbWVbbGVuXSA9ICdcMCc7Ci0gIHJldHVybiBuZXduYW1lOwotfQotCi0vKiBSZWFkIGluIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBzaXplX3Qgc2l6ZTsKLSAgUFRSIHN5bXM7Ci0KLSAgaWYgKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBzaXplID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6OwotCi0gIHN5bXMgPSAoUFRSKSBiZmRfbWFsbG9jIChzaXplKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCAmJiBzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChzeW1zLCBzaXplLCAxLCBhYmZkKSAhPSBzaXplKQotICAgIHsKLSAgICAgIGlmIChzeW1zICE9IE5VTEwpCi0JZnJlZSAoc3ltcyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpID0gc3ltczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgc3RyaW5ncy4gIFRoZSBzdHJpbmdzIGFyZSBub3QgbG9hZGVkIHVudGlsCi0gICB0aGV5IGFyZSBuZWVkZWQuICBUaGlzIGlzIGJlY2F1c2Ugd2UgaGF2ZSBubyBzaW1wbGUgd2F5IG9mCi0gICBkZXRlY3RpbmcgYSBtaXNzaW5nIHN0cmluZyB0YWJsZSBpbiBhbiBhcmNoaXZlLiAgKi8KLQotY29uc3QgY2hhciAqCi1fYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBleHRzdHJzaXplW1NUUklOR19TSVpFX1NJWkVdOwotICBzaXplX3Qgc3Ryc2l6ZTsKLSAgY2hhciAqc3RyaW5nczsKLQotICBpZiAob2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCk7Ci0KLSAgaWYgKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0gICAgCi0gIGlmIChiZmRfcmVhZCAoZXh0c3Ryc2l6ZSwgc2l6ZW9mIGV4dHN0cnNpemUsIDEsIGFiZmQpICE9IHNpemVvZiBleHRzdHJzaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgLyogVGhlcmUgaXMgbm8gc3RyaW5nIHRhYmxlLiAgKi8KLSAgICAgIHN0cnNpemUgPSBTVFJJTkdfU0laRV9TSVpFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZiBTVFJJTkdfU0laRV9TSVpFID09IDQKLSAgICAgIHN0cnNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHRzdHJzaXplKTsKLSNlbHNlCi0gI2Vycm9yIENoYW5nZSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotICAgIH0KLQotICBpZiAoc3Ryc2l6ZSA8IFNUUklOR19TSVpFX1NJWkUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBiYWQgc3RyaW5nIHRhYmxlIHNpemUgJWx1IiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAodW5zaWduZWQgbG9uZykgc3Ryc2l6ZSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBzdHJpbmdzID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3Ryc2l6ZSk7Ci0gIGlmIChzdHJpbmdzID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJmZF9yZWFkIChzdHJpbmdzICsgU1RSSU5HX1NJWkVfU0laRSwKLQkJc3Ryc2l6ZSAtIFNUUklOR19TSVpFX1NJWkUsIDEsIGFiZmQpCi0gICAgICAhPSBzdHJzaXplIC0gU1RSSU5HX1NJWkVfU0laRSkKLSAgICB7Ci0gICAgICBmcmVlIChzdHJpbmdzKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBvYmpfY29mZl9zdHJpbmdzIChhYmZkKSA9IHN0cmluZ3M7Ci0KLSAgcmV0dXJuIHN0cmluZ3M7Ci19Ci0KLS8qIEZyZWUgdXAgdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIHN0cmluZ3MgcmVhZCBmcm9tIGEgQ09GRiBmaWxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAob2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgIT0gTlVMTAotICAgICAgJiYgISBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpKQotICAgIHsKLSAgICAgIGZyZWUgKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKTsKLSAgICAgIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpID0gTlVMTDsKLSAgICB9Ci0gIGlmIChvYmpfY29mZl9zdHJpbmdzIChhYmZkKSAhPSBOVUxMCi0gICAgICAmJiAhIG9ial9jb2ZmX2tlZXBfc3RyaW5ncyAoYWJmZCkpCi0gICAgewotICAgICAgZnJlZSAob2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkpOwotICAgICAgb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBzeW1ib2wgdGFibGUgaW50byBmcmVzaGx5IGJmZF9hbGxvY2F0ZWQgbWVtb3J5LCBzd2FwIGl0LCBhbmQKLSAgIGtuaXQgdGhlIHN5bWJvbCBuYW1lcyBpbnRvIGEgbm9ybWFsaXplZCBmb3JtLiAgQnkgbm9ybWFsaXplZCBoZXJlIEkKLSAgIG1lYW4gdGhhdCBhbGwgc3ltYm9scyBoYXZlIGFuIG5fb2Zmc2V0IHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gYSBudWxsLQotICAgdGVybWluYXRlZCBzdHJpbmcuICAqLwotCi1jb21iaW5lZF9lbnRyeV90eXBlICoKLWNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmludGVybmFsOwotICBjb21iaW5lZF9lbnRyeV90eXBlICppbnRlcm5hbF9wdHI7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbF9wdHI7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmludGVybmFsX2VuZDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIGNoYXIgKnJhd19zcmM7Ci0gIGNoYXIgKnJhd19lbmQ7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ190YWJsZSA9IE5VTEw7Ci0gIGNoYXIgKmRlYnVnX3NlY3Rpb24gPSBOVUxMOwotICB1bnNpZ25lZCBsb25nIHNpemU7Ci0KLSAgaWYgKG9ial9yYXdfc3ltZW50cyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gb2JqX3Jhd19zeW1lbnRzIChhYmZkKTsKLQotICBzaXplID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc2l6ZW9mIChjb21iaW5lZF9lbnRyeV90eXBlKTsKLSAgaW50ZXJuYWwgPSAoY29tYmluZWRfZW50cnlfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKGludGVybmFsID09IE5VTEwgJiYgc2l6ZSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotICBpbnRlcm5hbF9lbmQgPSBpbnRlcm5hbCArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLQotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJhd19zcmMgPSAoY2hhciAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLQotICAvKiBtYXJrIHRoZSBlbmQgb2YgdGhlIHN5bWJvbHMgKi8KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgcmF3X2VuZCA9IChjaGFyICopIHJhd19zcmMgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0KLSAgLyogRklYTUUgU09NRURBWS4gIEEgc3RyaW5nIHRhYmxlIHNpemUgb2YgemVybyBpcyB2ZXJ5IHdlaXJkLCBidXQKLSAgICAgcHJvYmFibHkgcG9zc2libGUuICBJZiBvbmUgc2hvd3MgdXAsIGl0IHdpbGwgcHJvYmFibHkga2lsbCB1cy4gICovCi0KLSAgLyogU3dhcCBhbGwgdGhlIHJhdyBlbnRyaWVzICovCi0gIGZvciAoaW50ZXJuYWxfcHRyID0gaW50ZXJuYWw7Ci0gICAgICAgcmF3X3NyYyA8IHJhd19lbmQ7Ci0gICAgICAgcmF3X3NyYyArPSBzeW1lc3osIGludGVybmFsX3B0cisrKQotICAgIHsKLQotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgcmF3X3NyYywKLQkJCSAgICAoUFRSKSAmIGludGVybmFsX3B0ci0+dS5zeW1lbnQpOwotICAgICAgc3ltYm9sX3B0ciA9IGludGVybmFsX3B0cjsKLQotICAgICAgZm9yIChpID0gMDsKLQkgICBpIDwgc3ltYm9sX3B0ci0+dS5zeW1lbnQubl9udW1hdXg7Ci0JICAgaSsrKQotCXsKLQkgIGludGVybmFsX3B0cisrOwotCSAgcmF3X3NyYyArPSBzeW1lc3o7Ci0JICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgKFBUUikgcmF3X3NyYywKLQkJCQlzeW1ib2xfcHRyLT51LnN5bWVudC5uX3R5cGUsCi0JCQkJc3ltYm9sX3B0ci0+dS5zeW1lbnQubl9zY2xhc3MsCi0JCQkJaSwgc3ltYm9sX3B0ci0+dS5zeW1lbnQubl9udW1hdXgsCi0JCQkJJihpbnRlcm5hbF9wdHItPnUuYXV4ZW50KSk7Ci0JICBjb2ZmX3BvaW50ZXJpemVfYXV4IChhYmZkLCBpbnRlcm5hbCwgc3ltYm9sX3B0ciwgaSwKLQkJCSAgICAgICBpbnRlcm5hbF9wdHIpOwotCX0KLSAgICB9Ci0KLSAgLyogRnJlZSB0aGUgcmF3IHN5bWJvbHMsIGJ1dCBub3QgdGhlIHN0cmluZ3MgKGlmIHdlIGhhdmUgdGhlbSkuICAqLwotICBvYmpfY29mZl9rZWVwX3N0cmluZ3MgKGFiZmQpID0gdHJ1ZTsKLSAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChpbnRlcm5hbF9wdHIgPSBpbnRlcm5hbDsgaW50ZXJuYWxfcHRyIDwgaW50ZXJuYWxfZW5kOwotICAgICAgIGludGVybmFsX3B0cisrKQotICAgIHsKLSAgICAgIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRQotCSAgJiYgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5uX251bWF1eCA+IDApCi0JewotCSAgLyogbWFrZSBhIGZpbGUgc3ltYm9sIHBvaW50IHRvIHRoZSBuYW1lIGluIHRoZSBhdXhlbnQsIHNpbmNlCi0JICAgICB0aGUgdGV4dCAiLmZpbGUiIGlzIHJlZHVuZGFudCAqLwotCSAgaWYgKChpbnRlcm5hbF9wdHIgKyAxKS0+dS5hdXhlbnQueF9maWxlLnhfbi54X3plcm9lcyA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogdGhlIGZpbGVuYW1lIGlzIGEgbG9uZyBvbmUsIHBvaW50IGludG8gdGhlIHN0cmluZyB0YWJsZSAqLwotCSAgICAgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJewotCQkgIHN0cmluZ190YWJsZSA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoYWJmZCk7Ci0JCSAgaWYgKHN0cmluZ190YWJsZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIE5VTEw7Ci0JCX0KLQotCSAgICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPQotCQkoKGxvbmcpCi0JCSAoc3RyaW5nX3RhYmxlCi0JCSAgKyAoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X24ueF9vZmZzZXQpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogT3JkaW5hcnkgc2hvcnQgZmlsZW5hbWUsIHB1dCBpbnRvIG1lbW9yeSBhbnl3YXkuICBUaGUKLSAgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFBFIHRvb2xzIHNvbWV0aW1lcyBzdG9yZSBhIGZpbGVuYW1lIGluCi0gICAgICAgICAgICAgICAgIG11bHRpcGxlIEFVWCBlbnRyaWVzLiAgKi8KLQkgICAgICBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5uX251bWF1eCA+IDEKLQkJICAmJiBjb2ZmX2RhdGEgKGFiZmQpLT5wZSkKLQkJewotCQkgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPQotCQkgICAgKChsb25nKQotCQkgICAgIGNvcHlfbmFtZSAoYWJmZCwKLQkJCQkoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X2ZuYW1lLAotCQkJCWludGVybmFsX3B0ci0+dS5zeW1lbnQubl9udW1hdXggKiBzeW1lc3opKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPQotCQkgICAgKChsb25nKQotCQkgICAgIGNvcHlfbmFtZSAoYWJmZCwKLQkJCQkoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X2ZuYW1lLAotCQkJCWJmZF9jb2ZmX2ZpbG5tbGVuIChhYmZkKSkpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSAic2hvcnQiIG5hbWUuICBNYWtlIGl0IGxvbmcuICAqLwotCSAgICAgIHVuc2lnbmVkIGxvbmcgaSA9IDA7Ci0JICAgICAgY2hhciAqbmV3c3RyaW5nID0gTlVMTDsKLQotCSAgICAgIC8qIGZpbmQgdGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZyB3aXRob3V0IHdhbGtpbmcgaW50byBtZW1vcnkKLQkgICAgICAgICB0aGF0IGlzbid0IG91cnMuICAqLwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCi0JCXsKLQkJICBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uYW1lW2ldID09ICdcMCcpCi0JCSAgICB7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQkJLyogaWYgZW5kIG9mIHN0cmluZyAqLwotCQl9CQkvKiBwb3NzaWJsZSBsZW5ndGhzIG9mIHRoaXMgc3RyaW5nLiAqLwotCi0JICAgICAgaWYgKChuZXdzdHJpbmcgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsICsraSkpID09IE5VTEwpCi0JCXJldHVybiAoTlVMTCk7Ci0JICAgICAgbWVtc2V0IChuZXdzdHJpbmcsIDAsIGkpOwotCSAgICAgIHN0cm5jcHkgKG5ld3N0cmluZywgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uYW1lLCBpIC0gMSk7Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nIGludCkgbmV3c3RyaW5nOwotCSAgICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID09IDApCi0JICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAobG9uZyBpbnQpICIiOwotCSAgZWxzZSBpZiAoIWJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgKGFiZmQsICZpbnRlcm5hbF9wdHItPnUuc3ltZW50KSkKLQkgICAgewotCSAgICAgIC8qIExvbmcgbmFtZSBhbHJlYWR5LiAgUG9pbnQgc3ltYm9sIGF0IHRoZSBzdHJpbmcgaW4gdGhlCi0gICAgICAgICAgICAgICAgIHRhYmxlLiAgKi8KLQkgICAgICBpZiAoc3RyaW5nX3RhYmxlID09IE5VTEwpCi0JCXsKLQkJICBzdHJpbmdfdGFibGUgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpOwotCQkgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBOVUxMOwotCQl9Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9Ci0JCSgobG9uZyBpbnQpCi0JCSAoc3RyaW5nX3RhYmxlCi0JCSAgKyBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0KSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIExvbmcgbmFtZSBpbiBkZWJ1ZyBzZWN0aW9uLiAgVmVyeSBzaW1pbGFyLiAgKi8KLQkgICAgICBpZiAoZGVidWdfc2VjdGlvbiA9PSBOVUxMKQotCQlkZWJ1Z19zZWN0aW9uID0gYnVpbGRfZGVidWdfc2VjdGlvbiAoYWJmZCk7Ci0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nIGludCkKLQkJKGRlYnVnX3NlY3Rpb24gKyBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0KTsKLQkgICAgfQotCX0KLSAgICAgIGludGVybmFsX3B0ciArPSBpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4OwotICAgIH0KLQotICBvYmpfcmF3X3N5bWVudHMgKGFiZmQpID0gaW50ZXJuYWw7Ci0gIEJGRF9BU1NFUlQgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKQotCSAgICAgID09ICh1bnNpZ25lZCBpbnQpIChpbnRlcm5hbF9wdHIgLSBpbnRlcm5hbCkpOwotCi0gIHJldHVybiAoaW50ZXJuYWwpOwotfQkJCQkvKiBjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYigpICovCi0KLWxvbmcKLWNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLWFzeW1ib2wgKgotY29mZl9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb2ZmX3N5bWJvbF90eXBlICpuZXcgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3ID09IE5VTEwpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgbWVtc2V0IChuZXcsIDAsIHNpemVvZiAqbmV3KTsKLSAgbmV3LT5zeW1ib2wuc2VjdGlvbiA9IDA7Ci0gIG5ldy0+bmF0aXZlID0gMDsKLSAgbmV3LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKLSAgbmV3LT5kb25lX2xpbmVubyA9IGZhbHNlOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotLyogTWFrZSBhIGRlYnVnZ2luZyBzeW1ib2wuICAqLwotCi1hc3ltYm9sICoKLWNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIChhYmZkLCBwdHIsIHN6KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBwdHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgbG9uZyBzeiBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjb2ZmX3N5bWJvbF90eXBlICpuZXcgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3ID09IE5VTEwpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgLyogQEAgVGhlIDEwIGlzIGEgZ3Vlc3MgYXQgYSBwbGF1c2libGUgbWF4aW11bSBudW1iZXIgb2YgYXV4IGVudHJpZXMKLSAgICAgKGJ1dCBzaG91bGRuJ3QgYmUgYSBjb25zdGFudCkuICAqLwotICBuZXctPm5hdGl2ZSA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoY29tYmluZWRfZW50cnlfdHlwZSkgKiAxMCk7Ci0gIGlmICghbmV3LT5uYXRpdmUpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgbmV3LT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIG5ldy0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgbmV3LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKLSAgbmV3LT5kb25lX2xpbmVubyA9IGZhbHNlOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotLypBUkdTVVNFRCAqLwotdm9pZAotY29mZl9nZXRfc3ltYm9sX2luZm8gKGFiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci0gIGlmIChjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUgIT0gTlVMTAotICAgICAgJiYgY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLT5maXhfdmFsdWUpCi0gICAgewotICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqcHN5bTsKLQotICAgICAgcHN5bSA9ICgoY29tYmluZWRfZW50cnlfdHlwZSAqKQotCSAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSk7Ci0gICAgICByZXQtPnZhbHVlID0gKGJmZF92bWEpIChwc3ltIC0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdGhlIENPRkYgc3ltZW50IGZvciBhIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWJmZF9jb2ZmX2dldF9zeW1lbnQgKGFiZmQsIHN5bWJvbCwgcHN5bWVudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnBzeW1lbnQ7Ci17Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKmNzeW07Ci0KLSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bWJvbCk7Ci0gIGlmIChjc3ltID09IE5VTEwgfHwgY3N5bS0+bmF0aXZlID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgKnBzeW1lbnQgPSBjc3ltLT5uYXRpdmUtPnUuc3ltZW50OwotCi0gIGlmIChjc3ltLT5uYXRpdmUtPmZpeF92YWx1ZSkKLSAgICBwc3ltZW50LT5uX3ZhbHVlID0gKChjb21iaW5lZF9lbnRyeV90eXBlICopIHBzeW1lbnQtPm5fdmFsdWUKLQkJCS0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0KLSAgLyogRklYTUU6IFdlIHNob3VsZCBoYW5kbGUgZml4X2xpbmUgaGVyZS4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgQ09GRiBhdXhlbnQgZm9yIGEgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX2NvZmZfZ2V0X2F1eGVudCAoYWJmZCwgc3ltYm9sLCBpbmR4LCBwYXV4ZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgaW50IGluZHg7Ci0gICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcGF1eGVudDsKLXsKLSAgY29mZl9zeW1ib2xfdHlwZSAqY3N5bTsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqZW50OwotCi0gIGNzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1ib2wpOwotCi0gIGlmIChjc3ltID09IE5VTEwKLSAgICAgIHx8IGNzeW0tPm5hdGl2ZSA9PSBOVUxMCi0gICAgICB8fCBpbmR4ID49IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXgpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZW50ID0gY3N5bS0+bmF0aXZlICsgaW5keCArIDE7Ci0KLSAgKnBhdXhlbnQgPSBlbnQtPnUuYXV4ZW50OwotCi0gIGlmIChlbnQtPmZpeF90YWcpCi0gICAgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA9Ci0gICAgICAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcGF1eGVudC0+eF9zeW0ueF90YWduZHgucAotICAgICAgIC0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0KLSAgaWYgKGVudC0+Zml4X2VuZCkKLSAgICBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0KLSAgICAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wCi0gICAgICAgLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLQotICBpZiAoZW50LT5maXhfc2NubGVuKQotICAgIHBhdXhlbnQtPnhfY3NlY3QueF9zY25sZW4ubCA9Ci0gICAgICAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcGF1eGVudC0+eF9jc2VjdC54X3Njbmxlbi5wCi0gICAgICAgLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IENPRkYgc3ltYm9sLiAgKi8KLQotdm9pZAotY29mZl9wcmludF9zeW1ib2wgKGFiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGZpbGVwOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgImNvZmYgJXMgJXMiLAotCSAgICAgICBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUgPyAibiIgOiAiZyIsCi0JICAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPmxpbmVubyA/ICJsIiA6ICIgIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICBpZiAoY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgaW50IGF1eDsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmNvbWJpbmVkID0gY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlOwotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcm9vdCA9IG9ial9yYXdfc3ltZW50cyAoYWJmZCk7Ci0JICBzdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5ICpsID0gY29mZnN5bWJvbCAoc3ltYm9sKS0+bGluZW5vOwotCi0JICBmcHJpbnRmIChmaWxlLCAiWyUzbGRdIiwgKGxvbmcpIChjb21iaW5lZCAtIHJvb3QpKTsKLQotCSAgaWYgKCEgY29tYmluZWQtPmZpeF92YWx1ZSkKLQkgICAgdmFsID0gKHVuc2lnbmVkIGxvbmcpIGNvbWJpbmVkLT51LnN5bWVudC5uX3ZhbHVlOwotCSAgZWxzZQotCSAgICB2YWwgPSAoKHVuc2lnbmVkIGxvbmcpCi0JCSAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBjb21iaW5lZC0+dS5zeW1lbnQubl92YWx1ZQotCQkgICAgLSByb290KSk7Ci0KLQkgIGZwcmludGYgKGZpbGUsCi0JCSAgICIoc2VjICUyZCkoZmwgMHglMDJ4KSh0eSAlM3gpKHNjbCAlM2QpIChueCAlZCkgMHglMDhseCAlcyIsCi0JCSAgIGNvbWJpbmVkLT51LnN5bWVudC5uX3NjbnVtLAotCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl9mbGFncywKLQkJICAgY29tYmluZWQtPnUuc3ltZW50Lm5fdHlwZSwKLQkJICAgY29tYmluZWQtPnUuc3ltZW50Lm5fc2NsYXNzLAotCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl9udW1hdXgsCi0JCSAgIHZhbCwKLQkJICAgc3ltYm9sLT5uYW1lKTsKLQotCSAgZm9yIChhdXggPSAwOyBhdXggPCBjb21iaW5lZC0+dS5zeW1lbnQubl9udW1hdXg7IGF1eCsrKQotCSAgICB7Ci0JICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4cCA9IGNvbWJpbmVkICsgYXV4ICsgMTsKLQkgICAgICBsb25nIHRhZ25keDsKLQotCSAgICAgIGlmIChhdXhwLT5maXhfdGFnKQotCQl0YWduZHggPSBhdXhwLT51LmF1eGVudC54X3N5bS54X3RhZ25keC5wIC0gcm9vdDsKLQkgICAgICBlbHNlCi0JCXRhZ25keCA9IGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4Lmw7Ci0KLQkgICAgICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotCSAgICAgIGlmIChiZmRfY29mZl9wcmludF9hdXggKGFiZmQsIGZpbGUsIHJvb3QsIGNvbWJpbmVkLCBhdXhwLCBhdXgpKQotCQljb250aW51ZTsKLQotCSAgICAgIHN3aXRjaCAoY29tYmluZWQtPnUuc3ltZW50Lm5fc2NsYXNzKQotCQl7Ci0JCWNhc2UgQ19GSUxFOgotCQkgIGZwcmludGYgKGZpbGUsICJGaWxlICIpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgQ19TVEFUOgotCQkgIGlmIChjb21iaW5lZC0+dS5zeW1lbnQubl90eXBlID09IFRfTlVMTCkKLQkJICAgIC8qIHByb2JhYmx5IGEgc2VjdGlvbiBzeW1ib2w/ICovCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYgKGZpbGUsICJBVVggc2NubGVuIDB4JWx4IG5yZWxvYyAlZCBubG5ubyAlZCIsCi0JCQkgICAgICAgKGxvbmcpIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfc2NubGVuLAotCQkJICAgICAgIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfbnJlbG9jLAotCQkJICAgICAgIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfbmxpbm5vKTsKLQkJICAgICAgaWYgKGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY2hlY2tzdW0gIT0gMAotCQkJICB8fCBhdXhwLT51LmF1eGVudC54X3Njbi54X2Fzc29jaWF0ZWQgIT0gMAotCQkJICB8fCBhdXhwLT51LmF1eGVudC54X3Njbi54X2NvbWRhdCAhPSAwKQotCQkJZnByaW50ZiAoZmlsZSwgIiBjaGVja3N1bSAweCVseCBhc3NvYyAlZCBjb21kYXQgJWQiLAotCQkJCSBhdXhwLT51LmF1eGVudC54X3Njbi54X2NoZWNrc3VtLAotCQkJCSBhdXhwLT51LmF1eGVudC54X3Njbi54X2Fzc29jaWF0ZWQsCi0JCQkJIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY29tZGF0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICAvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwotCQljYXNlIENfRVhUOgotCQkgIGlmIChJU0ZDTiAoY29tYmluZWQtPnUuc3ltZW50Lm5fdHlwZSkpCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYgKGZpbGUsCi0JCQkgICAgICAgXygiQVVYIHRhZ25keCAlbGQgdHRsc2l6IDB4JWx4IGxubm9zICVsZCBuZXh0ICVsZCIpLAotCQkJICAgICAgIHRhZ25keCwKLQkJCSAgICAgICBhdXhwLT51LmF1eGVudC54X3N5bS54X21pc2MueF9mc2l6ZSwKLQkJCSAgICAgICBhdXhwLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsCi0JCQkgICAgICAgKGF1eHAtPmZpeF9lbmQKLQkJCQk/ICgobG9uZykKLQkJCQkgICAoYXV4cC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgucAotCQkJCSAgICAtIHJvb3QpKQotCQkJCTogYXV4cC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCkpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwotCQlkZWZhdWx0OgotCQkgIGZwcmludGYgKGZpbGUsICJBVVggbG5ubyAlZCBzaXplIDB4JXggdGFnbmR4ICVsZCIsCi0JCQkgICBhdXhwLT51LmF1eGVudC54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubywKLQkJCSAgIGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLAotCQkJICAgdGFnbmR4KTsKLQkJICBpZiAoYXV4cC0+Zml4X2VuZCkKLQkJICAgIGZwcmludGYgKGZpbGUsICIgZW5kbmR4ICVsZCIsCi0JCQkgICAgICgobG9uZykKLQkJCSAgICAgIChhdXhwLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wCi0JCQkgICAgICAgLSByb290KSkpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGwpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiXG4lcyA6IiwgbC0+dS5zeW0tPm5hbWUpOwotCSAgICAgIGwrKzsKLQkgICAgICB3aGlsZSAobC0+bGluZV9udW1iZXIpCi0JCXsKLQkJICBmcHJpbnRmIChmaWxlLCAiXG4lNGQgOiAweCVseCIsCi0JCQkgICBsLT5saW5lX251bWJlciwKLQkJCSAgICgodW5zaWduZWQgbG9uZykKLQkJCSAgICAobC0+dS5vZmZzZXQgKyBzeW1ib2wtPnNlY3Rpb24tPnZtYSkpKTsKLQkJICBsKys7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCSAgZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzICVzICVzIiwKLQkJICAgc3ltYm9sLT5zZWN0aW9uLT5uYW1lLAotCQkgICBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUgPyAibiIgOiAiZyIsCi0JCSAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPmxpbmVubyA/ICJsIiA6ICIgIiwKLQkJICAgc3ltYm9sLT5uYW1lKTsKLQl9Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBuYW1lIGltcGxpZXMgYSBsb2NhbCBzeW1ib2wuICBJbiBDT0ZGLAotICAgbG9jYWwgc3ltYm9scyBnZW5lcmFsbHkgc3RhcnQgd2l0aCBgYC5MJycuICBNb3N0IHRhcmdldHMgdXNlIHRoaXMKLSAgIGZ1bmN0aW9uIGZvciB0aGUgaXNfbG9jYWxfbGFiZWxfbmFtZSBlbnRyeSBwb2ludCwgYnV0IHNvbWUgbWF5Ci0gICBvdmVycmlkZSBpdC4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ0wnOwotfQotCi0vKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlCi0gICBhbmQgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUKLSAgIHdhbnRlZCBsb2NhdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotY29mZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsCi0JCQlmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgYm9vbGVhbiBmb3VuZDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBsaW5lX2Jhc2U7Ci0gIGNvZmZfZGF0YV90eXBlICpjb2YgPSBjb2ZmX2RhdGEgKGFiZmQpOwotICAvKiBSdW4gdGhyb3VnaCB0aGUgcmF3IHN5bWVudHMgaWYgYXZhaWxhYmxlICovCi0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnA7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnBlbmQ7Ci0gIGFsZW50ICpsOwotICBzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICpzZWNfZGF0YTsKLQotICAvKiBCZWZvcmUgbG9va2luZyB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUsIHRyeSB0byB1c2UgYSAuc3RhYgotICAgICBzZWN0aW9uIHRvIGZpbmQgdGhlIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKCEgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHN5bWJvbHMsIHNlY3Rpb24sIG9mZnNldCwKLQkJCQkJICAgICAmZm91bmQsIGZpbGVuYW1lX3B0ciwKLQkJCQkJICAgICBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0ciwKLQkJCQkJICAgICAmY29mZl9kYXRhIChhYmZkKS0+bGluZV9pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChmb3VuZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAqZmlsZW5hbWVfcHRyID0gMDsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSAwOwotICAqbGluZV9wdHIgPSAwOwotCi0gIC8qIERvbid0IHRyeSBhbmQgZmluZCBsaW5lIG51bWJlcnMgaW4gYSBub24gY29mZiBmaWxlICovCi0gIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY29mID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEZpbmQgdGhlIGZpcnN0IENfRklMRSBzeW1ib2wuICAqLwotICBwID0gY29mLT5yYXdfc3ltZW50czsKLSAgaWYgKCFwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwZW5kID0gcCArIGNvZi0+cmF3X3N5bWVudF9jb3VudDsKLSAgd2hpbGUgKHAgPCBwZW5kKQotICAgIHsKLSAgICAgIGlmIChwLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JYnJlYWs7Ci0gICAgICBwICs9IDEgKyBwLT51LnN5bWVudC5uX251bWF1eDsKLSAgICB9Ci0KLSAgaWYgKHAgPCBwZW5kKQotICAgIHsKLSAgICAgIGJmZF92bWEgc2VjX3ZtYTsKLSAgICAgIGJmZF92bWEgbWF4ZGlmZjsKLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBDX0ZJTEUgc3ltYm9scyB0byBmaW5kIHRoZSBiZXN0IG9uZS4gICovCi0gICAgICBzZWNfdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICAqZmlsZW5hbWVfcHRyID0gKGNoYXIgKikgcC0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQ7Ci0gICAgICBtYXhkaWZmID0gKGJmZF92bWEpIDAgLSAoYmZkX3ZtYSkgMTsKLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnAyOwotCi0JICBmb3IgKHAyID0gcCArIDEgKyBwLT51LnN5bWVudC5uX251bWF1eDsKLQkgICAgICAgcDIgPCBwZW5kOwotCSAgICAgICBwMiArPSAxICsgcDItPnUuc3ltZW50Lm5fbnVtYXV4KQotCSAgICB7Ci0JICAgICAgaWYgKHAyLT51LnN5bWVudC5uX3NjbnVtID4gMAotCQkgICYmIChzZWN0aW9uCi0JCSAgICAgID09IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwKLQkJCQkJCSAgICAgIHAyLT51LnN5bWVudC5uX3NjbnVtKSkpCi0JCWJyZWFrOwotCSAgICAgIGlmIChwMi0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotCQl7Ci0JCSAgcDIgPSBwZW5kOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgLyogV2UgdXNlIDw9IE1BWERJRkYgaGVyZSBzbyB0aGF0IGlmIHdlIGdldCBhIHplcm8gbGVuZ3RoCi0gICAgICAgICAgICAgZmlsZSwgd2UgYWN0dWFsbHkgdXNlIHRoZSBuZXh0IGZpbGUgZW50cnkuICAqLwotCSAgaWYgKHAyIDwgcGVuZAotCSAgICAgICYmIG9mZnNldCArIHNlY192bWEgPj0gKGJmZF92bWEpIHAyLT51LnN5bWVudC5uX3ZhbHVlCi0JICAgICAgJiYgb2Zmc2V0ICsgc2VjX3ZtYSAtIChiZmRfdm1hKSBwMi0+dS5zeW1lbnQubl92YWx1ZSA8PSBtYXhkaWZmKQotCSAgICB7Ci0JICAgICAgKmZpbGVuYW1lX3B0ciA9IChjaGFyICopIHAtPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0OwotCSAgICAgIG1heGRpZmYgPSBvZmZzZXQgKyBzZWNfdm1hIC0gcDItPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICAgIH0KLQotCSAgLyogQXZvaWQgZW5kbGVzcyBsb29wcyBvbiBlcnJvbmVvdXMgZmlsZXMgYnkgZW5zdXJpbmcgdGhhdAotCSAgICAgd2UgYWx3YXlzIG1vdmUgZm9yd2FyZCBpbiB0aGUgZmlsZS4gICovCi0JICBpZiAocCAtIGNvZi0+cmF3X3N5bWVudHMgPj0gcC0+dS5zeW1lbnQubl92YWx1ZSkKLQkgICAgYnJlYWs7Ci0KLQkgIHAgPSBjb2YtPnJhd19zeW1lbnRzICsgcC0+dS5zeW1lbnQubl92YWx1ZTsKLQkgIGlmIChwID4gcGVuZCB8fCBwLT51LnN5bWVudC5uX3NjbGFzcyAhPSBDX0ZJTEUpCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHdhbmRlciB0aG91Z2ggdGhlIHJhdyBsaW5lbnVtYmVycyBvZiB0aGUgc2VjdGlvbiAqLwotICAvKiBJZiB3ZSBoYXZlIGJlZW4gY2FsbGVkIG9uIHRoaXMgc2VjdGlvbiBiZWZvcmUsIGFuZCB0aGUgb2Zmc2V0IHdlCi0gICAgIHdhbnQgaXMgZnVydGhlciBkb3duIHRoZW4gd2UgY2FuIHByaW1lIHRoZSBsb29rdXAgbG9vcC4gICovCi0gIHNlY19kYXRhID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoc2VjX2RhdGEgIT0gTlVMTAotICAgICAgJiYgc2VjX2RhdGEtPmkgPiAwCi0gICAgICAmJiBvZmZzZXQgPj0gc2VjX2RhdGEtPm9mZnNldCkKLSAgICB7Ci0gICAgICBpID0gc2VjX2RhdGEtPmk7Ci0gICAgICAqZnVuY3Rpb25uYW1lX3B0ciA9IHNlY19kYXRhLT5mdW5jdGlvbjsKLSAgICAgIGxpbmVfYmFzZSA9IHNlY19kYXRhLT5saW5lX2Jhc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaSA9IDA7Ci0gICAgICBsaW5lX2Jhc2UgPSAwOwotICAgIH0KLQotICBpZiAoc2VjdGlvbi0+bGluZW5vICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3ZtYSBsYXN0X3ZhbHVlID0gMDsKLQotICAgICAgbCA9ICZzZWN0aW9uLT5saW5lbm9baV07Ci0KLSAgICAgIGZvciAoOyBpIDwgc2VjdGlvbi0+bGluZW5vX2NvdW50OyBpKyspCi0JewotCSAgaWYgKGwtPmxpbmVfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICAvKiBHZXQgdGhlIHN5bWJvbCB0aGlzIGxpbmUgbnVtYmVyIHBvaW50cyBhdCAqLwotCSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmYgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSAobC0+dS5zeW0pOwotCSAgICAgIGlmIChjb2ZmLT5zeW1ib2wudmFsdWUgPiBvZmZzZXQpCi0JCWJyZWFrOwotCSAgICAgICpmdW5jdGlvbm5hbWVfcHRyID0gY29mZi0+c3ltYm9sLm5hbWU7Ci0JICAgICAgbGFzdF92YWx1ZSA9IGNvZmYtPnN5bWJvbC52YWx1ZTsKLQkgICAgICBpZiAoY29mZi0+bmF0aXZlKQotCQl7Ci0JCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcyA9IGNvZmYtPm5hdGl2ZTsKLQkJICBzID0gcyArIDEgKyBzLT51LnN5bWVudC5uX251bWF1eDsKLQotCQkgIC8qIEluIFhDT0ZGIGEgZGVidWdnaW5nIHN5bWJvbCBjYW4gZm9sbG93IHRoZQotCQkgICAgIGZ1bmN0aW9uIHN5bWJvbC4gICovCi0JCSAgaWYgKHMtPnUuc3ltZW50Lm5fc2NudW0gPT0gTl9ERUJVRykKLQkJICAgIHMgPSBzICsgMSArIHMtPnUuc3ltZW50Lm5fbnVtYXV4OwotCi0JCSAgLyogUyBzaG91bGQgbm93IHBvaW50IHRvIHRoZSAuYmYgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkJICBpZiAocy0+dS5zeW1lbnQubl9udW1hdXgpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBsaW5lbnVtYmVyIGlzIHN0b3JlZCBpbiB0aGUgYXV4ZW50LiAgKi8KLQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphID0gJigocyArIDEpLT51LmF1eGVudCk7Ci0JCSAgICAgIGxpbmVfYmFzZSA9IGEtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vOwotCQkgICAgICAqbGluZV9wdHIgPSBsaW5lX2Jhc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGwtPnUub2Zmc2V0ID4gb2Zmc2V0KQotCQlicmVhazsKLQkgICAgICAqbGluZV9wdHIgPSBsLT5saW5lX251bWJlciArIGxpbmVfYmFzZSAtIDE7Ci0JICAgIH0KLQkgIGwrKzsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGZlbGwgb2ZmIHRoZSBlbmQgb2YgdGhlIGxvb3AsIHRoZW4gYXNzdW1lIHRoYXQgdGhpcwotCSBzeW1ib2wgaGFzIG5vIGxpbmUgbnVtYmVyIGluZm8uICBPdGhlcndpc2UsIHN5bWJvbHMgd2l0aCBubwotCSBsaW5lIG51bWJlciBpbmZvIGdldCByZXBvcnRlZCB3aXRoIHRoZSBsaW5lIG51bWJlciBvZiB0aGUKLQkgbGFzdCBsaW5lIG9mIHRoZSBsYXN0IHN5bWJvbCB3aGljaCBkb2VzIGhhdmUgbGluZSBudW1iZXIKLQkgaW5mby4gIFdlIHVzZSAweDEwMCBhcyBhIHNsb3AgdG8gYWNjb3VudCBmb3IgY2FzZXMgd2hlcmUgdGhlCi0JIGxhc3QgbGluZSBoYXMgZXhlY3V0YWJsZSBjb2RlLiAgKi8KLSAgICAgIGlmIChpID49IHNlY3Rpb24tPmxpbmVub19jb3VudAotCSAgJiYgbGFzdF92YWx1ZSAhPSAwCi0JICAmJiBvZmZzZXQgLSBsYXN0X3ZhbHVlID4gMHgxMDApCi0JewotCSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBOVUxMOwotCSAgKmxpbmVfcHRyID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIENhY2hlIHRoZSByZXN1bHRzIGZvciB0aGUgbmV4dCBjYWxsLiAgKi8KLSAgaWYgKHNlY19kYXRhID09IE5VTEwgJiYgc2VjdGlvbi0+b3duZXIgPT0gYWJmZCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT51c2VkX2J5X2JmZCA9Ci0JKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0gICAgICBzZWNfZGF0YSA9IChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkOwotICAgIH0KLSAgaWYgKHNlY19kYXRhICE9IE5VTEwpCi0gICAgewotICAgICAgc2VjX2RhdGEtPm9mZnNldCA9IG9mZnNldDsKLSAgICAgIHNlY19kYXRhLT5pID0gaTsKLSAgICAgIHNlY19kYXRhLT5mdW5jdGlvbiA9ICpmdW5jdGlvbm5hbWVfcHRyOwotICAgICAgc2VjX2RhdGEtPmxpbmVfYmFzZSA9IGxpbmVfYmFzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludAotY29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYzsKLXsKLSAgc2l6ZV90IHNpemU7Ci0KLSAgaWYgKHJlbG9jID09IGZhbHNlKQotICAgIHsKLSAgICAgIHNpemUgPSBiZmRfY29mZl9maWxoc3ogKGFiZmQpICsgYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLSAgICB9Ci0KLSAgc2l6ZSArPSBhYmZkLT5zZWN0aW9uX2NvdW50ICogYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIENoYW5nZSB0aGUgY2xhc3Mgb2YgYSBjb2ZmIHN5bWJvbCBoZWxkIGJ5IEJGRC4gICovCi1ib29sZWFuCi1iZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzIChhYmZkLCBzeW1ib2wsIGNsYXNzKQotICAgICBiZmQgKiAgICAgICAgIGFiZmQ7Ci0gICAgIGFzeW1ib2wgKiAgICAgc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgIGNsYXNzOwotewotICBjb2ZmX3N5bWJvbF90eXBlICogY3N5bTsKLQotICBjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKLSAgaWYgKGNzeW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAoY3N5bS0+bmF0aXZlID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhbiBhbGllbiBzeW1ib2wgd2hpY2ggbm8gbmF0aXZlIGNvZmYgYmFja2VuZCBkYXRhLgotCSBXZSBjaGVhdCBoZXJlIGJ5IGNyZWF0aW5nIGEgZmFrZSBuYXRpdmUgZW50cnkgZm9yIGl0IGFuZAotCSB0aGVuIGZpbGxpbmcgaW4gdGhlIGNsYXNzLiAgVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoYXQgaW4KLQkgY29mZl93cml0ZV9hbGllbl9zeW1ib2woKS4gICovCi0gICAgICAKLSAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiBuYXRpdmU7Ci0KLSAgICAgIG5hdGl2ZSA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqIG5hdGl2ZSkpOwotICAgICAgaWYgKG5hdGl2ZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbWVtc2V0IChuYXRpdmUsIDAsIHNpemVvZiAoKiBuYXRpdmUpKTsKLSAgICAgIAotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgICA9IFRfTlVMTDsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBjbGFzczsKLSAgICAgIAotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQl7Ci0JICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX1VOREVGOwotCSAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gc3ltYm9sLT52YWx1ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JewotCSAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IHN5bWJvbC0+dmFsdWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9Ci0JICAgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IChzeW1ib2wtPnZhbHVlCi0JCQkJICAgICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgaWYgKCEgb2JqX3BlIChhYmZkKSkKLQkgICAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIAotCSAgLyogQ29weSB0aGUgYW55IGZsYWdzIGZyb20gdGhlIHRoZSBmaWxlIGhlYWRlciBpbnRvIHRoZSBzeW1ib2wuCi0JICAgICBGSVhNRTogV2h5PyAgKi8KLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl9mbGFncyA9IGJmZF9hc3ltYm9sX2JmZCAoJiBjc3ltLT5zeW1ib2wpLT5mbGFnczsKLQl9Ci0gICAgICAKLSAgICAgIGNzeW0tPm5hdGl2ZSA9IG5hdGl2ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gY2xhc3M7Ci0gICAgfQotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmbGluay5jIGIvYmZkL2NvZmZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjQxNmQuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmZsaW5rLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDA1ICswLDAgQEAKLS8qIENPRkYgc3BlY2lmaWMgbGlua2VyIGNvZGUuCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyIGNvZGUuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2FkZF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgY2hhciAqZG9yZXNfY29tIFBBUkFNUyAoKGNoYXIgKiwgYmZkICosIGludCkpOwotc3RhdGljIGNoYXIgKmdldF9uYW1lIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKikpOwotc3RhdGljIGludCBwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgbWFya19yZWxvY3MgUEFSQU1TICgoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGJmZCAqKSk7Ci0KLS8qIERlZmluZSBtYWNyb3Mgc28gdGhhdCB0aGUgSVNGQ04sIGV0LiBhbC4sIG1hY3JvcyB3b3JrIGNvcnJlY3RseS4KLSAgIFRoZXNlIG1hY3JvcyBhcmUgZGVmaW5lZCBpbiBpbmNsdWRlL2NvZmYvaW50ZXJuYWwuaCBpbiB0ZXJtcyBvZgotICAgTl9UTUFTSywgZXRjLiAgVGhlc2UgZGVmaW5pdGlvbnMgcmVxdWlyZSBhIHVzZXIgdG8gZGVmaW5lIGxvY2FsCi0gICB2YXJpYWJsZXMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbmFtZXMsIGFuZCB3aXRoIHZhbHVlcyBmcm9tIHRoZQotICAgY29mZl9kYXRhIChhYmZkKSBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIE5fVE1BU0sgbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBuX2J0c2hmdAotI2RlZmluZSBOX0JUTUFTSyBuX2J0bWFzawotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5pbmR4ID0gLTE7Ci0gICAgICByZXQtPnR5cGUgPSBUX05VTEw7Ci0gICAgICByZXQtPmNsYXNzID0gQ19OVUxMOwotICAgICAgcmV0LT5udW1hdXggPSAwOwotICAgICAgcmV0LT5hdXhiZmQgPSBOVUxMOwotICAgICAgcmV0LT5hdXggPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgYWJmZCwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICB0YWJsZS0+c3RhYl9pbmZvID0gTlVMTDsKLSAgcmV0dXJuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAocmV0LCBhYmZkLAotCQkJCQlfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyZXQtPnJvb3Q7Ci19Ci0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIENPRkYgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2NvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+dHlwZXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEdpdmVuIGEgQ09GRiBCRkQsIGFkZCBzeW1ib2xzIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBhcwotICAgYXBwcm9wcmlhdGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIHJldHVybiBjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgcmV0dXJuIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0JICAgICAgKGFiZmQsIGluZm8sIGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpKTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGEgQ09GRiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoZWNrIGEgc2luZ2xlIGFyY2hpdmUgZWxlbWVudCB0byBzZWUgaWYgd2UgbmVlZCB0byBpbmNsdWRlIGl0IGluCi0gICB0aGUgbGluay4gICpQTkVFREVEIGlzIHNldCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGlzIGVsZW1lbnQgaXMKLSAgIG5lZWRlZCBpbiB0aGUgbGluayBvciBub3QuICBUaGlzIGlzIGNhbGxlZCB2aWEKLSAgIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8ICEgKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIHRvIHNlZSBpZiB0aGlzIG9iamVjdCBmaWxlIHNob3VsZCBiZQotICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBiZmRfYnl0ZSAqZXN5bTsKLSAgYmZkX2J5dGUgKmVzeW1fZW5kOwotCi0gICpwbmVlZGVkID0gZmFsc2U7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLSAgZXN5bV9lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6OwotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotICAgICAgZW51bSBjb2ZmX3N5bWJvbF9jbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbjsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0gICAgICBjbGFzc2lmaWNhdGlvbiA9IGJmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbCAoYWJmZCwgJnN5bSk7Ci0gICAgICBpZiAoY2xhc3NpZmljYXRpb24gPT0gQ09GRl9TWU1CT0xfR0xPQkFMCi0JICB8fCBjbGFzc2lmaWNhdGlvbiA9PSBDT0ZGX1NZTUJPTF9DT01NT04pCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogVGhpcyBzeW1ib2wgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLCBhbmQgaXMgZGVmaW5lZCBieSB0aGlzCi0gICAgICAgICAgICAgb2JqZWN0IGZpbGUuICAqLwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0JICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgdGhhdCBhcmUgY3VycmVudGx5Ci0JICAgICB1bmRlZmluZWQuICBJZiBhIHN5bWJvbCBpcyBjdXJyZW50bHkga25vd24gdG8gYmUgY29tbW9uLAotCSAgICAgQ09GRiBsaW5rZXJzIGRvIG5vdCBicmluZyBpbiBhbiBvYmplY3QgZmlsZSB3aGljaCBkZWZpbmVzCi0JICAgICBpdC4gICovCi0JICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsIG5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgKnBuZWVkZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBlc3ltICs9IChzeW0ubl9udW1hdXggKyAxKSAqIHN5bWVzejsKLSAgICB9Ci0KLSAgLyogV2UgZG8gbm90IG5lZWQgdGhpcyBvYmplY3QgZmlsZS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYWxsIHRoZSBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBpbnQgbl90bWFzayA9IGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fdG1hc2s7Ci0gIHVuc2lnbmVkIGludCBuX2J0c2hmdCA9IGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fYnRzaGZ0OwotICB1bnNpZ25lZCBpbnQgbl9idG1hc2sgPSBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0bWFzazsKLSAgYm9vbGVhbiBrZWVwX3N5bXM7Ci0gIGJvb2xlYW4gZGVmYXVsdF9jb3B5OwotICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0KLSAgLyogS2VlcCB0aGUgc3ltYm9scyBkdXJpbmcgdGhpcyBmdW5jdGlvbiwgaW4gY2FzZSB0aGUgbGlua2VyIG5lZWRzCi0gICAgIHRvIHJlYWQgdGhlIGdlbmVyaWMgc3ltYm9scyBpbiBvcmRlciB0byByZXBvcnQgYW4gZXJyb3IgbWVzc2FnZS4gICovCi0gIGtlZXBfc3ltcyA9IG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCk7Ci0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotCi0gIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBkZWZhdWx0X2NvcHkgPSBmYWxzZTsKLSAgZWxzZQotICAgIGRlZmF1bHRfY29weSA9IHRydWU7Ci0KLSAgc3ltY291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0KLSAgLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kCi0gICAgIHRvIHBhcnRpY3VsYXIgc3ltYm9scy4gICovCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJICgoc2l6ZV90KSBzeW1jb3VudAotCQkJICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKSkpOwotICBpZiAoc3ltX2hhc2ggPT0gTlVMTCAmJiBzeW1jb3VudCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKSA9IHN5bV9oYXNoOwotICBtZW1zZXQgKHN5bV9oYXNoLCAwLAotCSAgKHNpemVfdCkgc3ltY291bnQgKiBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgQkZEX0FTU0VSVCAoc3ltZXN6ID09IGJmZF9jb2ZmX2F1eGVzeiAoYWJmZCkpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBzeW1jb3VudCAqIHN5bWVzejsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLSAgICAgIGVudW0gY29mZl9zeW1ib2xfY2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb247Ci0gICAgICBib29sZWFuIGNvcHk7Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmc3ltKTsKLQotICAgICAgY2xhc3NpZmljYXRpb24gPSBiZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wgKGFiZmQsICZzeW0pOwotICAgICAgaWYgKGNsYXNzaWZpY2F0aW9uICE9IENPRkZfU1lNQk9MX0xPQ0FMKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgZmxhZ3dvcmQgZmxhZ3M7Ci0JICBhc2VjdGlvbiAqc2VjdGlvbjsKLQkgIGJmZF92bWEgdmFsdWU7Ci0JICBib29sZWFuIGFkZGl0OwotCi0JICAvKiBUaGlzIHN5bWJvbCBpcyBleHRlcm5hbGx5IHZpc2libGUuICAqLwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFdlIG11c3QgY29weSB0aGUgbmFtZSBpbnRvIG1lbW9yeSBpZiB3ZSBnb3QgaXQgZnJvbSB0aGUKLSAgICAgICAgICAgICBzeW1lbnQgaXRzZWxmLCByYXRoZXIgdGhhbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgIGNvcHkgPSBkZWZhdWx0X2NvcHk7Ci0JICBpZiAoc3ltLl9uLl9uX24uX25femVyb2VzICE9IDAKLQkgICAgICB8fCBzeW0uX24uX25fbi5fbl9vZmZzZXQgPT0gMCkKLQkgICAgY29weSA9IHRydWU7Ci0KLQkgIHZhbHVlID0gc3ltLm5fdmFsdWU7Ci0KLQkgIHN3aXRjaCAoY2xhc3NpZmljYXRpb24pCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBjYXNlIENPRkZfU1lNQk9MX0dMT0JBTDoKLQkgICAgICBmbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOwotCSAgICAgIHNlY3Rpb24gPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKLQkgICAgICBpZiAoISBvYmpfcGUgKGFiZmQpKQotCQl2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9VTkRFRklORUQ6Ci0JICAgICAgZmxhZ3MgPSAwOwotCSAgICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ09GRl9TWU1CT0xfQ09NTU9OOgotCSAgICAgIGZsYWdzID0gQlNGX0dMT0JBTDsKLQkgICAgICBzZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENPRkZfU1lNQk9MX1BFX1NFQ1RJT046Ci0JICAgICAgZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU0gfCBCU0ZfR0xPQkFMOwotCSAgICAgIHNlY3Rpb24gPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoc3ltLm5fc2NsYXNzID09IENfV0VBS0VYVAotCSAgICAgIHx8IChvYmpfcGUgKGFiZmQpICYmIHN5bS5uX3NjbGFzcyA9PSBDX05UX1dFQUspKQotCSAgICBmbGFncyA9IEJTRl9XRUFLOwotCi0JICBhZGRpdCA9IHRydWU7Ci0KLQkgIC8qIEluIHRoZSBQRSBmb3JtYXQsIHNlY3Rpb24gc3ltYm9scyBhY3R1YWxseSByZWZlciB0byB0aGUKLSAgICAgICAgICAgICBzdGFydCBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICBXZSBoYW5kbGUgdGhlbSBzcGVjaWFsbHkKLSAgICAgICAgICAgICBoZXJlLiAgKi8KLQkgIGlmIChvYmpfcGUgKGFiZmQpICYmIChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLQkgICAgewotCSAgICAgICpzeW1faGFzaCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSBuYW1lLCBmYWxzZSwgY29weSwgZmFsc2UpOwotCSAgICAgIGlmICgqc3ltX2hhc2ggIT0gTlVMTCkKLQkJewotCQkgIGlmICgoKCpzeW1faGFzaCktPmNvZmZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIENPRkZfTElOS19IQVNIX1BFX1NFQ1RJT05fU1lNQk9MKSA9PSAwCi0JCSAgICAgICYmICgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkJICAgICAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgICAoIldhcm5pbmc6IHN5bWJvbCBgJXMnIGlzIGJvdGggc2VjdGlvbiBhbmQgbm9uLXNlY3Rpb24iLAotCQkgICAgICAgbmFtZSk7Ci0KLQkJICBhZGRpdCA9IGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgLyogVGhlIE1pY3Jvc29mdCBWaXN1YWwgQyBjb21waWxlciBkb2VzIHN0cmluZyBwb29saW5nIGJ5Ci0JICAgICBoYXNoaW5nIHRoZSBjb25zdGFudHMgdG8gYW4gaW50ZXJuYWwgc3ltYm9sIG5hbWUsIGFuZAotCSAgICAgcmVseWluZyBvbiB0aGUgdGhlIGxpbmtlciBjb21kYXQgc3VwcG9ydCB0byBkaXNjYXJkCi0JICAgICBkdXBsaWNhdGUgbmFtZXMuICBIb3dldmVyLCBpZiBvbmUgc3RyaW5nIGlzIGEgbGl0ZXJhbCBhbmQKLQkgICAgIG9uZSBpcyBhIGRhdGEgaW5pdGlhbGl6ZXIsIG9uZSB3aWxsIGVuZCB1cCBpbiB0aGUgLmRhdGEKLQkgICAgIHNlY3Rpb24gYW5kIG9uZSB3aWxsIGVuZCB1cCBpbiB0aGUgLnJkYXRhIHNlY3Rpb24uICBUaGUKLQkgICAgIE1pY3Jvc29mdCBsaW5rZXIgd2lsbCBjb21iaW5lIHRoZW0gaW50byB0aGUgLmRhdGEKLQkgICAgIHNlY3Rpb24sIHdoaWNoIHNlZW1zIHRvIGJlIHdyb25nIHNpbmNlIGl0IG1pZ2h0IGNhdXNlIHRoZQotCSAgICAgbGl0ZXJhbCB0byBjaGFuZ2UuCi0KLQkgICAgIEFzIGxvbmcgYXMgdGhlcmUgYXJlIG5vIGV4dGVybmFsIHJlZmVyZW5jZXMgdG8gdGhlCi0JICAgICBzeW1ib2xzLCB3aGljaCB0aGVyZSBzaG91bGRuJ3QgYmUsIHdlIGNhbiB0cmVhdCB0aGUgLmRhdGEKLQkgICAgIGFuZCAucmRhdGEgaW5zdGFuY2VzIGFzIHNlcGFyYXRlIHN5bWJvbHMuICBUaGUgY29tZGF0Ci0JICAgICBjb2RlIGluIHRoZSBsaW5rZXIgd2lsbCBkbyB0aGUgYXBwcm9wcmlhdGUgbWVyZ2luZy4gIEhlcmUKLQkgICAgIHdlIGF2b2lkIGdldHRpbmcgYSBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yIGZvciBvbmUgb2YKLQkgICAgIHRoZXNlIHNwZWNpYWwgc3ltYm9scy4KLQotCSAgICAgRklYTUU6IEkgZG9uJ3QgdGhpbmsgdGhpcyB3aWxsIHdvcmsgaW4gdGhlIGNhc2Ugd2hlcmUKLQkgICAgIHRoZXJlIGFyZSB0d28gb2JqZWN0IGZpbGVzIHdoaWNoIHVzZSB0aGUgY29uc3RhbnRzIGFzIGEKLQkgICAgIGxpdGVyYWwgYW5kIHR3byBvYmplY3QgZmlsZXMgd2hpY2ggdXNlIGl0IGFzIGEgZGF0YQotCSAgICAgaW5pdGlhbGl6ZXIuICBPbmUgb3IgdGhlIG90aGVyIG9mIHRoZSBzZWNvbmQgb2JqZWN0IGZpbGVzCi0JICAgICBpcyBnb2luZyB0byB3aW5kIHVwIHdpdGggYW4gaW5hcHByb3ByaWF0ZSByZWZlcmVuY2UuICAqLwotCSAgaWYgKG9ial9wZSAoYWJmZCkKLQkgICAgICAmJiAoY2xhc3NpZmljYXRpb24gPT0gQ09GRl9TWU1CT0xfR0xPQkFMCi0JCSAgfHwgY2xhc3NpZmljYXRpb24gPT0gQ09GRl9TWU1CT0xfUEVfU0VDVElPTikKLQkgICAgICAmJiBzZWN0aW9uLT5jb21kYXQgIT0gTlVMTAotCSAgICAgICYmIHN0cm5jbXAgKG5hbWUsICI/P18iLCAzKSA9PSAwCi0JICAgICAgJiYgc3RyY21wIChuYW1lLCBzZWN0aW9uLT5jb21kYXQtPm5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoKnN5bV9oYXNoID09IE5VTEwpCi0JCSpzeW1faGFzaCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgIG5hbWUsIGZhbHNlLCBjb3B5LCBmYWxzZSk7Ci0JICAgICAgaWYgKCpzeW1faGFzaCAhPSBOVUxMCi0JCSAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAmJiAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5jb21kYXQgIT0gTlVMTAotCQkgICYmIHN0cmNtcCAoKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbi0+Y29tZGF0LT5uYW1lLAotCQkJICAgICBzZWN0aW9uLT5jb21kYXQtPm5hbWUpID09IDApCi0JCWFkZGl0ID0gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKGFkZGl0KQotCSAgICB7Ci0JICAgICAgaWYgKCEgKGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLAotCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMLCBjb3B5LCBmYWxzZSwKLQkJICAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaCkpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICBpZiAob2JqX3BlIChhYmZkKSAmJiAoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0JICAgICgqc3ltX2hhc2gpLT5jb2ZmX2xpbmtfaGFzaF9mbGFncyB8PQotCSAgICAgIENPRkZfTElOS19IQVNIX1BFX1NFQ1RJT05fU1lNQk9MOwotCi0JICAvKiBMaW1pdCB0aGUgYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbCB0byB0aGUgcG9zc2libGUKLSAgICAgICAgICAgICBhbGlnbm1lbnQgb2YgYSBzZWN0aW9uLiAgVGhlcmUgaXMgbm8gcG9pbnQgdG8gcGVybWl0dGluZwotICAgICAgICAgICAgIGEgaGlnaGVyIGFsaWdubWVudCBmb3IgYSBjb21tb24gc3ltYm9sOiB3ZSBjYW4gbm90Ci0gICAgICAgICAgICAgZ3VhcmFudGVlIGl0LCBhbmQgaXQgbWF5IGNhdXNlIHVzIHRvIGFsbG9jYXRlIGV4dHJhIHNwYWNlCi0gICAgICAgICAgICAgaW4gdGhlIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIGlmIChzZWN0aW9uID09IGJmZF9jb21fc2VjdGlvbl9wdHIKLQkgICAgICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgJiYgKCgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIKLQkJICA+IGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIgKGFiZmQpKSkKLQkgICAgKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcgotCSAgICAgID0gYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlciAoYWJmZCk7Ci0KLQkgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF9nZXRfZmxhdm91ciAoYWJmZCkpCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFueSBzeW1ib2wgaW5mb3JtYXRpb24gY3VycmVudGx5IGluCi0gICAgICAgICAgICAgICAgIHRoZSBoYXNoIHRhYmxlLCBvciBpZiB3ZSBhcmUgbG9va2luZyBhdCBhIHN5bWJvbAotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCB0aGVuIHVwZGF0ZSB0aGUgc3ltYm9sIGNsYXNzIGFuZCB0eXBlIGluCi0gICAgICAgICAgICAgICAgIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgCSAgICAgIGlmICgoKCpzeW1faGFzaCktPmNsYXNzID09IENfTlVMTAotICAJCSAgICYmICgqc3ltX2hhc2gpLT50eXBlID09IFRfTlVMTCkKLSAgCQkgIHx8IHN5bS5uX3NjbnVtICE9IDAKLSAgCQkgIHx8IChzeW0ubl92YWx1ZSAhPSAwCi0gIAkJICAgICAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgCQkgICAgICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gIAkJewotICAJCSAgKCpzeW1faGFzaCktPmNsYXNzID0gc3ltLm5fc2NsYXNzOwotICAJCSAgaWYgKHN5bS5uX3R5cGUgIT0gVF9OVUxMKQotICAJCSAgICB7Ci0gIAkJICAgICAgLyogV2Ugd2FudCB0byB3YXJuIGlmIHRoZSB0eXBlIGNoYW5nZWQsIGJ1dCBub3QKLSAgCQkJIGlmIGl0IGNoYW5nZWQgZnJvbSBhbiB1bnNwZWNpZmllZCB0eXBlLgotICAJCQkgVGVzdGluZyB0aGUgd2hvbGUgdHlwZSBieXRlIG1heSB3b3JrLCBidXQgdGhlCi0gIAkJCSBjaGFuZ2UgZnJvbSAoZS5nLikgYSBmdW5jdGlvbiBvZiB1bnNwZWNpZmllZAotICAJCQkgdHlwZSB0byBmdW5jdGlvbiBvZiBrbm93biB0eXBlIGFsc28gd2FudHMgdG8KLSAgCQkJIHNraXAgdGhlIHdhcm5pbmcuICAqLwotICAJCSAgICAgIGlmICgoKnN5bV9oYXNoKS0+dHlwZSAhPSBUX05VTEwKLSAgCQkJICAmJiAoKnN5bV9oYXNoKS0+dHlwZSAhPSBzeW0ubl90eXBlCi0gIAkJICAgICAgICAgICYmICEoRFRZUEUgKCgqc3ltX2hhc2gpLT50eXBlKSA9PSBEVFlQRSAoc3ltLm5fdHlwZSkKLSAgCQkgICAgICAgICAgICAgICAmJiAoQlRZUEUgKCgqc3ltX2hhc2gpLT50eXBlKSA9PSBUX05VTEwKLSAgCQkgICAgICAgICAgICAgICAgICAgfHwgQlRZUEUgKHN5bS5uX3R5cGUpID09IFRfTlVMTCkpKQotICAJCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgCQkJICAoXygiV2FybmluZzogdHlwZSBvZiBzeW1ib2wgYCVzJyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQgaW4gJXMiKSwKLSAgCQkJICAgbmFtZSwgKCpzeW1faGFzaCktPnR5cGUsIHN5bS5uX3R5cGUsCi0gIAkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAJCSAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGZyb20gYSBtZWFuaW5nZnVsCi0gIAkJCSBiYXNlIHR5cGUgdG8gYSBudWxsIG9uZSwgYnV0IGlmIHdlIGtub3cKLSAgCQkJIG5vdGhpbmcsIHRha2Ugd2hhdCBsaXR0bGUgd2UgbWlnaHQgbm93IGtub3cuICAqLwotICAJCSAgICAgIGlmIChCVFlQRSAoc3ltLm5fdHlwZSkgIT0gVF9OVUxMCi0gIAkJCSAgfHwgKCpzeW1faGFzaCktPnR5cGUgPT0gVF9OVUxMKQotCQkJKCpzeW1faGFzaCktPnR5cGUgPSBzeW0ubl90eXBlOwotICAJCSAgICB9Ci0gIAkJICAoKnN5bV9oYXNoKS0+YXV4YmZkID0gYWJmZDsKLQkJICBpZiAoc3ltLm5fbnVtYXV4ICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYWxsb2M7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBpOwotCQkgICAgICBiZmRfYnl0ZSAqZWF1eDsKLQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppYXV4OwotCi0JCSAgICAgICgqc3ltX2hhc2gpLT5udW1hdXggPSBzeW0ubl9udW1hdXg7Ci0JCSAgICAgIGFsbG9jID0gKCh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikKLQkJCSAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkJICAoc3ltLm5fbnVtYXV4Ci0JCQkJCQkgICAqIHNpemVvZiAoKmFsbG9jKSkpKTsKLQkJICAgICAgaWYgKGFsbG9jID09IE5VTEwpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQkJICAgICAgZm9yIChpID0gMCwgZWF1eCA9IGVzeW0gKyBzeW1lc3osIGlhdXggPSBhbGxvYzsKLQkJCSAgIGkgPCBzeW0ubl9udW1hdXg7Ci0JCQkgICBpKyssIGVhdXggKz0gc3ltZXN6LCBpYXV4KyspCi0JCQliZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgKFBUUikgZWF1eCwgc3ltLm5fdHlwZSwKLQkJCQkJICAgICAgc3ltLm5fc2NsYXNzLCBpLCBzeW0ubl9udW1hdXgsCi0JCQkJCSAgICAgIChQVFIpIGlhdXgpOwotCQkgICAgICAoKnN5bV9oYXNoKS0+YXV4ID0gYWxsb2M7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoY2xhc3NpZmljYXRpb24gPT0gQ09GRl9TWU1CT0xfUEVfU0VDVElPTgotCSAgICAgICYmICgqc3ltX2hhc2gpLT5udW1hdXggIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFNvbWUgUEUgc2VjdGlvbnMgKHN1Y2ggYXMgLmJzcykgaGF2ZSBhIHplcm8gc2l6ZSBpbgotICAgICAgICAgICAgICAgICB0aGUgc2VjdGlvbiBoZWFkZXIsIGJ1dCBhIG5vbi16ZXJvIHNpemUgaW4gdGhlIEFVWAotICAgICAgICAgICAgICAgICByZWNvcmQuICBDb3JyZWN0IHRoYXQgaGVyZS4KLQotCQkgRklYTUU6IFRoaXMgaXMgbm90IGF0IGFsbCB0aGUgcmlnaHQgcGxhY2UgdG8gZG8gdGhpcy4KLQkJIEZvciBleGFtcGxlLCBpdCB3b24ndCBoZWxwIG9iamR1bXAuICBUaGlzIG5lZWRzIHRvIGJlCi0JCSBkb25lIHdoZW4gd2Ugc3dhcCBpbiB0aGUgc2VjdGlvbiBoZWFkZXIuICAqLwotCi0JICAgICAgQkZEX0FTU0VSVCAoKCpzeW1faGFzaCktPm51bWF1eCA9PSAxKTsKLQkgICAgICBpZiAoc2VjdGlvbi0+X3Jhd19zaXplID09IDApCi0JCXNlY3Rpb24tPl9yYXdfc2l6ZSA9ICgqc3ltX2hhc2gpLT5hdXhbMF0ueF9zY24ueF9zY25sZW47Ci0KLQkgICAgICAvKiBGSVhNRTogV2UgY291bGQgdGVzdCB3aGV0aGVyIHRoZSBzZWN0aW9uIHNpemVzCi0gICAgICAgICAgICAgICAgIG1hdGNoZXMgdGhlIHNpemUgaW4gdGhlIGF1eCBlbnRyeSwgYnV0IGFwcGFyZW50bHkKLSAgICAgICAgICAgICAgICAgdGhhdCBzb21ldGltZXMgZmFpbHMgdW5leHBlY3RlZGx5LiAgKi8KLQkgICAgfQotCX0KLQotICAgICAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0gICAgICBzeW1faGFzaCArPSBzeW0ubl9udW1hdXggKyAxOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbm9uLXRyYWRpdGlvbmFsLCBub24tcmVsb2NhdGVhYmxlIGxpbmssIHRyeSB0bwotICAgICBvcHRpbWl6ZSB0aGUgaGFuZGxpbmcgb2YgYW55IC5zdGFiLy5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgaW5mby0+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+cGVfb3B0aGRyLlNpemVPZlN0YWNrQ29tbWl0ID12YWw7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotc3RhdGljIGNoYXIgKmdldF9uYW1lKHB0ciwgZHN0KQotY2hhciAqcHRyOwotY2hhciAqKmRzdDsKLXsKLSAgd2hpbGUgKCpwdHIgPT0gJyAnKQotICAgIHB0cisrOwotICAqZHN0ID0gcHRyOwotICB3aGlsZSAoKnB0ciAmJiAqcHRyICE9ICcgJykKLSAgICBwdHIrKzsKLSAgKnB0ciA9IDA7Ci0gIHJldHVybiBwdHIrMTsKLX0KLQotLyogUHJvY2VzcyBhbnkgbWFnaWMgZW1iZWRkZWQgY29tbWFuZHMgaW4gYSBzZWN0aW9uIGNhbGxlZCAuZHJlY3R2ZSAqLwotCQkJCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzIChvdXRwdXRfYmZkLCBpbmZvLCAgYWJmZCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kcmVjdHZlIik7Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgKmU7Ci0gIGNoYXIgKmNvcHk7Ci0gIGlmICghc2VjKSAKLSAgICByZXR1cm4gMTsKLSAgCi0gIGNvcHkgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzZWMtPl9yYXdfc2l6ZSk7Ci0gIGlmICghY29weSkgCi0gICAgcmV0dXJuIDA7Ci0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyhhYmZkLCBzZWMsIGNvcHksIDAsIHNlYy0+X3Jhd19zaXplKSkgCi0gICAgewotICAgICAgZnJlZSAoY29weSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGUgPSBjb3B5ICsgc2VjLT5fcmF3X3NpemU7Ci0gIGZvciAocyA9IGNvcHk7ICBzIDwgZSA7ICkgCi0gICAgewotICAgICAgaWYgKHNbMF0hPSAnLScpIHsKLQlzKys7Ci0JY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoc3RybmNtcCAocywiLWF0dHIiLCA1KSA9PSAwKQotCXsKLQkgIGNoYXIgKm5hbWU7Ci0JICBjaGFyICphdHRyaWJzOwotCSAgYXNlY3Rpb24gKmFzZWM7Ci0KLQkgIGludCBsb29wID0gMTsKLQkgIGludCBoYWRfd3JpdGUgPSAwOwotCSAgaW50IGhhZF9yZWFkID0gMDsKLQkgIGludCBoYWRfZXhlYz0gMDsKLQkgIGludCBoYWRfc2hhcmVkPSAwOwotCSAgcyArPSA1OwotCSAgcyA9IGdldF9uYW1lKHMsICZuYW1lKTsKLQkgIHMgPSBnZXRfbmFtZShzLCAmYXR0cmlicyk7Ci0JICB3aGlsZSAobG9vcCkgewotCSAgICBzd2l0Y2ggKCphdHRyaWJzKyspIAotCSAgICAgIHsKLQkgICAgICBjYXNlICdXJzoKLQkJaGFkX3dyaXRlID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnUic6Ci0JCWhhZF9yZWFkID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnUyc6Ci0JCWhhZF9zaGFyZWQgPSAxOwotCQlicmVhazsKLQkgICAgICBjYXNlICdYJzoKLQkJaGFkX2V4ZWMgPSAxOwotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQlsb29wID0gMDsKLQkgICAgICB9Ci0JICB9Ci0JICBhc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGFzZWMpIHsKLQkgICAgaWYgKGhhZF9leGVjKQotCSAgICAgIGFzZWMtPmZsYWdzIHw9IFNFQ19DT0RFOwotCSAgICBpZiAoIWhhZF93cml0ZSkKLQkgICAgICBhc2VjLT5mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0JICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywiLWhlYXAiLCA1KSA9PSAwKQotCXsKLQkgIHMgPSBkb3Jlc19jb20gKHMrNSwgb3V0cHV0X2JmZCwgMSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywiLXN0YWNrIiwgNikgPT0gMCkKLQl7Ci0JICBzID0gZG9yZXNfY29tIChzKzYsIG91dHB1dF9iZmQsIDApOwotCX0KLSAgICAgIGVsc2UgCi0JcysrOwotICAgIH0KLSAgZnJlZSAoY29weSk7Ci0gIHJldHVybiAxOwotfQotCi0vKiBQbGFjZSBhIG1hcmtlciBhZ2FpbnN0IGFsbCBzeW1ib2xzIHdoaWNoIGFyZSB1c2VkIGJ5IHJlbG9jYXRpb25zLgotICAgVGhpcyBtYXJrZXIgY2FuIGJlIHBpY2tlZCB1cCBieSB0aGUgJ2RvIHdlIHNraXAgdGhpcyBzeW1ib2wgPycKLSAgIGxvb3AgaW4gX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKCkgYW5kIHVzZWQgdG8gcHJldmVudCBza2lwcGluZwotICAgdGhhdCBzeW1ib2wuIAotICAgKi8KLQotc3RhdGljIHZvaWQKLW1hcmtfcmVsb2NzIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKglmaW5mbzsKLSAgICAgYmZkICogCQkJCWlucHV0X2JmZDsKLXsKLSAgYXNlY3Rpb24gKiBhOwotCi0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChpbnB1dF9iZmQpICYgSEFTX1NZTVMpID09IDApCi0gICAgcmV0dXJuOwotICAKLSAgZm9yIChhID0gaW5wdXRfYmZkLT5zZWN0aW9uczsgYSAhPSAoYXNlY3Rpb24gKikgTlVMTDsgYSA9IGEtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICoJaW50ZXJuYWxfcmVsb2NzOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICoJaXJlbDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqCWlyZWxlbmQ7Ci0KLSAgICAgIAotICAgICAgaWYgKChhLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCB8fCBhLT5yZWxvY19jb3VudCAgPCAxKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBSZWFkIGluIHRoZSByZWxvY3MuICAqLwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JKGlucHV0X2JmZCwgYSwgZmFsc2UsCi0JIGZpbmZvLT5leHRlcm5hbF9yZWxvY3MsCi0JIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUsCi0JIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCi0JICA/IChmaW5mby0+c2VjdGlvbl9pbmZvWyBhLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4IF0ucmVsb2NzICsgYS0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KQotCSAgOiBmaW5mby0+aW50ZXJuYWxfcmVsb2NzKQotCSk7Ci0gICAgICAKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgaXJlbCAgICAgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBpcmVsZW5kICA9IGlyZWwgKyBhLT5yZWxvY19jb3VudDsKLQotICAgICAgLyogUGxhY2UgYSBtYXJrIGluIHRoZSBzeW1faW5kaWNlcyBhcnJheSAod2hvc2UgZW50cmllcyBoYXZlCi0JIGJlZW4gaW5pdGlhbGlzZWQgdG8gMCkgZm9yIGFsbCBvZiB0aGUgc3ltYm9scyB0aGF0IGFyZSB1c2VkCi0JIGluIHRoZSByZWxvY2F0aW9uIHRhYmxlLiAgVGhpcyB3aWxsIHRoZW4gYmUgcGlja2VkIHVwIGluIHRoZQotCSBza2lwL2Rvbid0IHBhc3MgKi8KLSAgICAgIAotICAgICAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0JewotCSAgZmluZm8tPnN5bV9pbmRpY2VzWyBpcmVsLT5yX3N5bW5keCBdID0gLTE7Ci0JfQotICAgIH0KLX0KLQotLyogTGluayBhbiBpbnB1dCBmaWxlIGludG8gdGhlIGxpbmtlciBvdXRwdXQgZmlsZS4gIFRoaXMgZnVuY3Rpb24KLSAgIGhhbmRsZXMgYWxsIHRoZSBzZWN0aW9ucyBhbmQgcmVsb2NhdGlvbnMgb2YgdGhlIGlucHV0IGZpbGUgYXQgb25jZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9saW5rX2lucHV0X2JmZCAoZmluZm8sIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBuX3RtYXNrID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX3RtYXNrOwotICB1bnNpZ25lZCBpbnQgbl9idHNoZnQgPSBjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmxvY2FsX25fYnRzaGZ0OwotI2lmIDAKLSAgdW5zaWduZWQgaW50IG5fYnRtYXNrID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX2J0bWFzazsKLSNlbmRpZgotICBib29sZWFuICgqYWRqdXN0X3N5bW5keCkgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCQkJCSAgICBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkgICAgYm9vbGVhbiAqKSk7Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgY29uc3QgY2hhciAqc3RyaW5nczsKLSAgYmZkX3NpemVfdHlwZSBzeW1lbnRfYmFzZTsKLSAgYm9vbGVhbiBjb3B5LCBoYXNoOwotICBiZmRfc2l6ZV90eXBlIGlzeW1lc3o7Ci0gIGJmZF9zaXplX3R5cGUgb3N5bWVzejsKLSAgYmZkX3NpemVfdHlwZSBsaW5lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzeW1wOwotICBhc2VjdGlvbiAqKnNlY3BwOwotICBsb25nICppbmRleHA7Ci0gIHVuc2lnbmVkIGxvbmcgb3V0cHV0X2luZGV4OwotICBiZmRfYnl0ZSAqb3V0c3ltOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgLyogTW92ZSBhbGwgdGhlIHN5bWJvbHMgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIHN0cmluZ3MgPSBOVUxMOwotICBzeW1lbnRfYmFzZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLSAgaXN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLSAgb3N5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoaW5wdXRfYmZkKTsKLSAgQkZEX0FTU0VSVCAobGluZXN6ID09IGJmZF9jb2ZmX2xpbmVzeiAob3V0cHV0X2JmZCkpOwotCi0gIGNvcHkgPSBmYWxzZTsKLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIGNvcHkgPSB0cnVlOwotICBoYXNoID0gdHJ1ZTsKLSAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0gICAgaGFzaCA9IGZhbHNlOwotCi0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoaW5wdXRfYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIGlzeW1lc3o7Ci0gIGlzeW1wID0gZmluZm8tPmludGVybmFsX3N5bXM7Ci0gIHNlY3BwID0gZmluZm8tPnNlY19wdHJzOwotICBpbmRleHAgPSBmaW5mby0+c3ltX2luZGljZXM7Ci0gIG91dHB1dF9pbmRleCA9IHN5bWVudF9iYXNlOwotICBvdXRzeW0gPSBmaW5mby0+b3V0c3ltczsKLQotICBpZiAoY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+cGUpCi0gICAgewotICAgICAgaWYgKCEgcHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sIGlucHV0X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gcGVyZm9ybSByZWxvY2F0aW9ucyBhbmQgYWxzbyBzdHJpcC9kaXNjYXJkIHNvbWUgc3ltYm9scwotICAgICB0aGVuIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IHN0cmlwL2Rpc2NhcmQgdGhvc2Ugc3ltYm9scyB0aGF0IGFyZQotICAgICBnb2luZyB0byBiZSBpbnZvbHZlZCBpbiB0aGUgcmVsb2NhdGlvbnMgKi8KLSAgaWYgKCggICBmaW5mby0+aW5mby0+c3RyaXAgICAhPSBzdHJpcF9ub25lCi0gICAgICAgfHwgZmluZm8tPmluZm8tPmRpc2NhcmQgIT0gZGlzY2FyZF9ub25lKQotICAgICAgJiYgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBtYXJrIHRoZSBzeW1ib2wgYXJyYXkgYXMgJ25vdC11c2VkJyAqLwotICAgICAgbWVtc2V0IChpbmRleHAsIDAsIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogc2l6ZW9mICogaW5kZXhwKTsgCi0gICAgICAgCi0gICAgICBtYXJrX3JlbG9jcyAoZmluZm8sIGlucHV0X2JmZCk7Ci0gICAgfQotCi0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotICAgICAgZW51bSBjb2ZmX3N5bWJvbF9jbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbjsKLSAgICAgIGJvb2xlYW4gc2tpcDsKLSAgICAgIGJvb2xlYW4gZ2xvYmFsOwotICAgICAgYm9vbGVhbiBkb250X3NraXBfc3ltYm9sOwotICAgICAgaW50IGFkZDsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bSwgKFBUUikgaXN5bXApOwotCi0gICAgICAvKiBNYWtlIGEgY29weSBvZiAqaXN5bXAgc28gdGhhdCB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbgotCSBhbHdheXMgc2VlcyB0aGUgb3JpZ2luYWwgdmFsdWVzLiAgVGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4KLQkgYWx3YXlzIHJlY29tcHV0aW5nIHRoZSBzeW1ib2wgdmFsdWUgZXZlbiBpZiB3ZSBhcmUgc3RyaXBwaW5nCi0JIHRoZSBzeW1ib2wuICAqLwotICAgICAgaXN5bSA9ICppc3ltcDsKLQotICAgICAgY2xhc3NpZmljYXRpb24gPSBiZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wgKGlucHV0X2JmZCwgJmlzeW0pOwotICAgICAgc3dpdGNoIChjbGFzc2lmaWNhdGlvbikKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgQ09GRl9TWU1CT0xfR0xPQkFMOgotCWNhc2UgQ09GRl9TWU1CT0xfUEVfU0VDVElPTjoKLQljYXNlIENPRkZfU1lNQk9MX0xPQ0FMOgotCSAgKnNlY3BwID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChpbnB1dF9iZmQsIGlzeW0ubl9zY251bSk7Ci0JICBicmVhazsKLQljYXNlIENPRkZfU1lNQk9MX0NPTU1PTjoKLQkgICpzZWNwcCA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIENPRkZfU1lNQk9MX1VOREVGSU5FRDoKLQkgICpzZWNwcCA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEV4dHJhY3QgdGhlIGZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIHN5bWJvbCBpcyB1c2VkIGJ5IGEKLSAgICAgICAgIHJlbG9jYXRpb24uICAqLwotICAgICAgaWYgKChmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfbm9uZQotCSAgIHx8IGZpbmZvLT5pbmZvLT5kaXNjYXJkICE9IGRpc2NhcmRfbm9uZSkKLQkgICYmIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0JZG9udF9za2lwX3N5bWJvbCA9ICppbmRleHA7Ci0gICAgICBlbHNlCi0JZG9udF9za2lwX3N5bWJvbCA9IGZhbHNlOwotICAgICAgCi0gICAgICAqaW5kZXhwID0gLTE7Ci0KLSAgICAgIHNraXAgPSBmYWxzZTsKLSAgICAgIGdsb2JhbCA9IGZhbHNlOwotICAgICAgYWRkID0gMSArIGlzeW0ubl9udW1hdXg7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBzdHJpcHBpbmcgYWxsIHN5bWJvbHMsIHdlIHdhbnQgdG8gc2tpcCB0aGlzIG9uZS4gICovCi0gICAgICBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbCAmJiAhIGRvbnRfc2tpcF9zeW1ib2wpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIGlmICghIHNraXApCi0JewotCSAgc3dpdGNoIChjbGFzc2lmaWNhdGlvbikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIENPRkZfU1lNQk9MX0dMT0JBTDoKLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9DT01NT046Ci0JICAgIGNhc2UgQ09GRl9TWU1CT0xfUEVfU0VDVElPTjoKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIHN5bWJvbC4gIEdsb2JhbCBzeW1ib2xzIGNvbWUgYXQgdGhlCi0JCSBlbmQgb2YgdGhlIHN5bWJvbCB0YWJsZSwgc28gc2tpcCB0aGVtIGZvciBub3cuCi0JCSBMb2NhbGx5IGRlZmluZWQgZnVuY3Rpb24gc3ltYm9scywgaG93ZXZlciwgYXJlIGFuCi0JCSBleGNlcHRpb24sIGFuZCBhcmUgbm90IG1vdmVkIHRvIHRoZSBlbmQuICAqLwotCSAgICAgIGdsb2JhbCA9IHRydWU7Ci0JICAgICAgaWYgKCEgSVNGQ04gKGlzeW0ubl90eXBlKSkKLQkJc2tpcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9VTkRFRklORUQ6Ci0JICAgICAgLyogVW5kZWZpbmVkIHN5bWJvbHMgYXJlIGxlZnQgZm9yIHRoZSBlbmQuICAqLwotCSAgICAgIGdsb2JhbCA9IHRydWU7Ci0JICAgICAgc2tpcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDT0ZGX1NZTUJPTF9MT0NBTDoKLQkgICAgICAvKiBUaGlzIGlzIGEgbG9jYWwgc3ltYm9sLiAgU2tpcCBpdCBpZiB3ZSBhcmUgZGlzY2FyZGluZwotICAgICAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLiAgKi8KLQkgICAgICBpZiAoZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwgJiYgISBkb250X3NraXBfc3ltYm9sKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2Ugc3RyaXBwaW5nIGRlYnVnZ2luZyBzeW1ib2xzLCBhbmQgdGhpcyBpcyBhIGRlYnVnZ2luZwotICAgICAgICAgc3ltYm9sLCB0aGVuIHNraXAgaXQuICBGSVhNRTogZ2FzIHNldHMgdGhlIHNlY3Rpb24gdG8gTl9BQlMKLSAgICAgICAgIGZvciBzb21lIHR5cGVzIG9mIGRlYnVnZ2luZyBzeW1ib2xzOyBJIGRvbid0IGtub3cgaWYgdGhpcyBpcwotICAgICAgICAgYSBidWcgb3Igbm90LiAgSW4gYW55IGNhc2UsIHdlIGhhbmRsZSBpdCBoZXJlLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9kZWJ1Z2dlcgotCSAgJiYgISBkb250X3NraXBfc3ltYm9sCi0JICAmJiAoaXN5bS5uX3NjbnVtID09IE5fREVCVUcKLQkgICAgICB8fCAoaXN5bS5uX3NjbnVtID09IE5fQUJTCi0JCSAgJiYgKGlzeW0ubl9zY2xhc3MgPT0gQ19BVVRPCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19SRUcKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX01PUwotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfTU9FCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19NT1UKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX0FSRwotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfUkVHUEFSTQotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfRklFTEQKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX0VPUykpKSkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogSWYgc29tZSBzeW1ib2xzIGFyZSBzdHJpcHBlZCBiYXNlZCBvbiB0aGUgbmFtZSwgd29yayBvdXQgdGhlCi0JIG5hbWUgYW5kIGRlY2lkZSB3aGV0aGVyIHRvIHNraXAgdGhpcyBzeW1ib2wuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgfHwgZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9sKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwgYnVmKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKCEgZG9udF9za2lwX3N5bWJvbAotCSAgICAgICYmICgoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkJICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwgbmFtZSwgZmFsc2UsCi0JCQkJICAgIGZhbHNlKSA9PSBOVUxMKSkKLQkJICAgfHwgKCEgZ2xvYmFsCi0JCSAgICAgICAmJiBmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wKLQkJICAgICAgICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChpbnB1dF9iZmQsIG5hbWUpKSkpCi0JICAgIHNraXAgPSB0cnVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiBlbnVtLCBzdHJ1Y3QsIG9yIHVuaW9uIHRhZywgc2VlIGlmIHdlIGhhdmUKLSAgICAgICAgIGFscmVhZHkgb3V0cHV0IGFuIGlkZW50aWNhbCB0eXBlLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIChmaW5mby0+b3V0cHV0X2JmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSA9PSAwCi0JICAmJiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VOVEFHCi0JICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1NUUlRBRwotCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19VTlRBRykKLQkgICYmIGlzeW0ubl9udW1hdXggPT0gMSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQkgIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKm1oOwotCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqbXQ7Ci0JICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqKmVwcDsKLQkgIGJmZF9ieXRlICplc2wsICplc2xlbmQ7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppc2xwOwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBJZ25vcmUgZmFrZSBuYW1lcyBpbnZlbnRlZCBieSBjb21waWxlcjsgdHJlYXQgdGhlbSBhbGwgYXMKLSAgICAgICAgICAgICB0aGUgc2FtZSBuYW1lLiAgKi8KLQkgIGlmICgqbmFtZSA9PSAnficgfHwgKm5hbWUgPT0gJy4nIHx8ICpuYW1lID09ICckJwotCSAgICAgIHx8ICgqbmFtZSA9PSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGlucHV0X2JmZCkKLQkJICAmJiAobmFtZVsxXSA9PSAnficgfHwgbmFtZVsxXSA9PSAnLicgfHwgbmFtZVsxXSA9PSAnJCcpKSkKLQkgICAgbmFtZSA9ICIiOwotCi0JICBtaCA9IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAgKCZmaW5mby0+ZGVidWdfbWVyZ2UsIG5hbWUsCi0JCQkJCSAgICAgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAobWggPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCB0eXBlIGluZm9ybWF0aW9uLiAgSWYgdGhpcyB0dXJucwotICAgICAgICAgICAgIG91dCB0byBiZSBhIGR1cGxpY2F0ZSwgd2UgcGFzcyB0aGlzIGFkZHJlc3MgdG8KLSAgICAgICAgICAgICBiZmRfcmVsZWFzZS4gICovCi0JICBtdCA9ICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqKQotCQliZmRfYWxsb2MgKGlucHV0X2JmZCwKLQkJCSAgIHNpemVvZiAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSkpKTsKLQkgIGlmIChtdCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBtdC0+Y2xhc3MgPSBpc3ltLm5fc2NsYXNzOwotCi0JICAvKiBQaWNrIHVwIHRoZSBhdXggZW50cnksIHdoaWNoIHBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSB0YWcKLSAgICAgICAgICAgICBlbnRyaWVzLiAgKi8KLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIChlc3ltICsgaXN5bWVzeiksCi0JCQkJaXN5bS5uX3R5cGUsIGlzeW0ubl9zY2xhc3MsIDAsIGlzeW0ubl9udW1hdXgsCi0JCQkJKFBUUikgJmF1eCk7Ci0KLQkgIC8qIEdhdGhlciB0aGUgZWxlbWVudHMuICAqLwotCSAgZXBwID0gJm10LT5lbGVtZW50czsKLQkgIG10LT5lbGVtZW50cyA9IE5VTEw7Ci0JICBpc2xwID0gaXN5bXAgKyAyOwotCSAgZXNsID0gZXN5bSArIDIgKiBpc3ltZXN6OwotCSAgZXNsZW5kID0gKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpCi0JCSAgICArIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sICogaXN5bWVzeik7Ci0JICB3aGlsZSAoZXNsIDwgZXNsZW5kKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqZWxlbmFtZTsKLQkgICAgICBjaGFyIGVsZWJ1ZltTWU1OTUxFTiArIDFdOwotCSAgICAgIGNoYXIgKm5hbWVfY29weTsKLQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChpbnB1dF9iZmQsIChQVFIpIGVzbCwgKFBUUikgaXNscCk7Ci0KLQkgICAgICAqZXBwID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICopCi0JCSAgICAgIGJmZF9hbGxvYyAoaW5wdXRfYmZkLAotCQkJCSBzaXplb2YgKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQpKSk7Ci0JICAgICAgaWYgKCplcHAgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgZWxlbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBpc2xwLAotCQkJCQkJCWVsZWJ1Zik7Ci0JICAgICAgaWYgKGVsZW5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgbmFtZV9jb3B5ID0gKGNoYXIgKikgYmZkX2FsbG9jIChpbnB1dF9iZmQsCi0JCQkJCSAgICAgIHN0cmxlbiAoZWxlbmFtZSkgKyAxKTsKLQkgICAgICBpZiAobmFtZV9jb3B5ID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBzdHJjcHkgKG5hbWVfY29weSwgZWxlbmFtZSk7Ci0KLQkgICAgICAoKmVwcCktPm5hbWUgPSBuYW1lX2NvcHk7Ci0JICAgICAgKCplcHApLT50eXBlID0gaXNscC0+bl90eXBlOwotCSAgICAgICgqZXBwKS0+dGFnbmR4ID0gMDsKLQkgICAgICBpZiAoaXNscC0+bl9udW1hdXggPj0gMQotCQkgICYmIGlzbHAtPm5fdHlwZSAhPSBUX05VTEwKLQkJICAmJiBpc2xwLT5uX3NjbGFzcyAhPSBDX0VPUykKLQkJewotCQkgIHVuaW9uIGludGVybmFsX2F1eGVudCBlbGVhdXg7Ci0JCSAgbG9uZyBpbmR4OwotCi0JCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgKGVzbCArIGlzeW1lc3opLAotCQkJCQlpc2xwLT5uX3R5cGUsIGlzbHAtPm5fc2NsYXNzLCAwLAotCQkJCQlpc2xwLT5uX251bWF1eCwgKFBUUikgJmVsZWF1eCk7Ci0JCSAgaW5keCA9IGVsZWF1eC54X3N5bS54X3RhZ25keC5sOwotCi0JCSAgLyogRklYTUU6IElmIHRoaXMgdGFnbmR4IGVudHJ5IHJlZmVycyB0byBhIHN5bWJvbAotCQkgICAgIGRlZmluZWQgbGF0ZXIgaW4gdGhpcyBmaWxlLCB3ZSBqdXN0IGlnbm9yZSBpdC4KLQkJICAgICBIYW5kbGluZyB0aGlzIGNvcnJlY3RseSB3b3VsZCBiZSB0ZWRpb3VzLCBhbmQgbWF5Ci0JCSAgICAgbm90IGJlIHJlcXVpcmVkLiAgKi8KLQotCQkgIGlmIChpbmR4ID4gMAotCQkgICAgICAmJiAoaW5keAotCQkJICA8ICgoZXN5bSAtCi0JCQkgICAgICAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkKLQkJCSAgICAgLyAobG9uZykgaXN5bWVzeikpKQotCQkgICAgewotCQkgICAgICAoKmVwcCktPnRhZ25keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJICAgICAgaWYgKCgqZXBwKS0+dGFnbmR4IDwgMCkKLQkJCSgqZXBwKS0+dGFnbmR4ID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVwcCA9ICYoKmVwcCktPm5leHQ7Ci0JICAgICAgKmVwcCA9IE5VTEw7Ci0KLQkgICAgICBlc2wgKz0gKGlzbHAtPm5fbnVtYXV4ICsgMSkgKiBpc3ltZXN6OwotCSAgICAgIGlzbHAgKz0gaXNscC0+bl9udW1hdXggKyAxOwotCSAgICB9Ci0KLQkgIC8qIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBkZWZpbml0aW9uIHdoaWNoIG1hdGNoZXMgdGhpcwotICAgICAgICAgICAgIHR5cGUuICBXZSBhbHdheXMgb3V0cHV0IHRoZSB0eXBlIGlmIGl0IGhhcyBubyBlbGVtZW50cywKLSAgICAgICAgICAgICBmb3Igc2ltcGxpY2l0eS4gICovCi0JICBpZiAobXQtPmVsZW1lbnRzID09IE5VTEwpCi0JICAgIGJmZF9yZWxlYXNlIChpbnB1dF9iZmQsIChQVFIpIG10KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUgKm10bDsKLQotCSAgICAgIGZvciAobXRsID0gbWgtPnR5cGVzOyBtdGwgIT0gTlVMTDsgbXRsID0gbXRsLT5uZXh0KQotCQl7Ci0JCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqbWUsICptZWw7Ci0KLQkJICBpZiAobXRsLT5jbGFzcyAhPSBtdC0+Y2xhc3MpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGZvciAobWUgPSBtdC0+ZWxlbWVudHMsIG1lbCA9IG10bC0+ZWxlbWVudHM7Ci0JCSAgICAgICBtZSAhPSBOVUxMICYmIG1lbCAhPSBOVUxMOwotCQkgICAgICAgbWUgPSBtZS0+bmV4dCwgbWVsID0gbWVsLT5uZXh0KQotCQkgICAgewotCQkgICAgICBpZiAoc3RyY21wIChtZS0+bmFtZSwgbWVsLT5uYW1lKSAhPSAwCi0JCQkgIHx8IG1lLT50eXBlICE9IG1lbC0+dHlwZQotCQkJICB8fCBtZS0+dGFnbmR4ICE9IG1lbC0+dGFnbmR4KQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBpZiAobWUgPT0gTlVMTCAmJiBtZWwgPT0gTlVMTCkKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBpZiAobXRsID09IE5VTEwgfHwgKGJmZF9zaXplX3R5cGUpIG10bC0+aW5keCA+PSBzeW1lbnRfYmFzZSkKLQkJewotCQkgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IGRlZmluaXRpb24gb2YgdGhpcyB0eXBlLiAgKi8KLQkJICBtdC0+aW5keCA9IG91dHB1dF9pbmRleDsKLQkJICBtdC0+bmV4dCA9IG1oLT50eXBlczsKLQkJICBtaC0+dHlwZXMgPSBtdDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWRlZmluaXRpb24gd2hpY2ggY2FuIGJlIG1lcmdlZC4gICovCi0JCSAgYmZkX3JlbGVhc2UgKGlucHV0X2JmZCwgKFBUUikgbXQpOwotCQkgICppbmRleHAgPSBtdGwtPmluZHg7Ci0JCSAgYWRkID0gKGVzbGVuZCAtIGVzeW0pIC8gaXN5bWVzejsKLQkJICBza2lwID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSBub3cga25vdyB3aGV0aGVyIHdlIGFyZSB0byBza2lwIHRoaXMgc3ltYm9sIG9yIG5vdC4gICovCi0gICAgICBpZiAoISBza2lwKQotCXsKLQkgIC8qIEFkanVzdCB0aGUgc3ltYm9sIGluIG9yZGVyIHRvIG91dHB1dCBpdC4gICovCi0KLQkgIGlmIChpc3ltLl9uLl9uX24uX25femVyb2VzID09IDAKLQkgICAgICAmJiBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhIGxvbmcgbmFtZS4gIEVudGVyIGl0IGluIHRoZSBzdHJpbmcKLQkJIHRhYmxlIHdlIGFyZSBidWlsZGluZy4gIE5vdGUgdGhhdCB3ZSBkbyBub3QgY2hlY2sKLQkJIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcuICBUaGF0IGlzIG9ubHkgdHJ1ZSBmb3IKLQkJIFhDT0ZGLCBhbmQgWENPRkYgcmVxdWlyZXMgZGlmZmVyZW50IGxpbmtpbmcgY29kZQotCQkgYW55aG93LiAgKi8KLQkgICAgICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLAotCQkJCQkJICAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgbmFtZSwgaGFzaCwgY29weSk7Ci0JICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoaXN5bS5uX3NjbGFzcykKLQkgICAgewotCSAgICBjYXNlIENfQVVUTzoKLQkgICAgY2FzZSBDX01PUzoKLQkgICAgY2FzZSBDX0VPUzoKLQkgICAgY2FzZSBDX01PRToKLQkgICAgY2FzZSBDX01PVToKLQkgICAgY2FzZSBDX1VOVEFHOgotCSAgICBjYXNlIENfU1RSVEFHOgotCSAgICBjYXNlIENfRU5UQUc6Ci0JICAgIGNhc2UgQ19UUERFRjoKLQkgICAgY2FzZSBDX0FSRzoKLQkgICAgY2FzZSBDX1VTVEFUSUM6Ci0JICAgIGNhc2UgQ19SRUc6Ci0JICAgIGNhc2UgQ19SRUdQQVJNOgotCSAgICBjYXNlIENfRklFTEQ6Ci0JICAgICAgLyogVGhlIHN5bWJvbCB2YWx1ZSBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiAgKi8KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfRkNOOgotCSAgICAgIGlmIChvYmpfcGUgKGlucHV0X2JmZCkKLQkJICAmJiBzdHJjbXAgKGlzeW0ubl9uYW1lLCAiLmJmIikgIT0gMAotCQkgICYmIGlzeW0ubl9zY251bSA+IDApCi0JCXsKLQkJICAvKiBGb3IgUEUsIC5sZiBhbmQgLmVmIGdldCB0aGVpciB2YWx1ZSBsZWZ0IGFsb25lLAotCQkgICAgIHdoaWxlIC5iZiBnZXRzIHJlbG9jYXRlZC4gIEhvd2V2ZXIsIHRoZXkgYWxsIGhhdmUKLQkJICAgICAicmVhbCIgc2VjdGlvbiBudW1iZXJzLCBhbmQgbmVlZCB0byBiZSBtb3ZlZCBpbnRvCi0JCSAgICAgdGhlIG5ldyBzZWN0aW9uLiAgKi8KLQkJICBpc3ltLm5fc2NudW0gPSAoKnNlY3BwKS0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgQ19MQUJFTDogIC8qIE5vdCBjb21wbGV0ZWx5IHN1cmUgYWJvdXQgdGhlc2UgMiAqLwotCSAgICBjYXNlIENfRVhUREVGOgotCSAgICBjYXNlIENfQkxPQ0s6Ci0JICAgIGNhc2UgQ19FRkNOOgotCSAgICBjYXNlIENfTlVMTDoKLQkgICAgY2FzZSBDX0VYVDoKLQkgICAgY2FzZSBDX1NUQVQ6Ci0JICAgIGNhc2UgQ19TRUNUSU9OOgotCSAgICBjYXNlIENfTlRfV0VBSzoKLQkgICAgICAvKiBDb21wdXRlIG5ldyBzeW1ib2wgbG9jYXRpb24uICAqLwotCSAgICBpZiAoaXN5bS5uX3NjbnVtID4gMCkKLQkgICAgICB7Ci0JCWlzeW0ubl9zY251bSA9ICgqc2VjcHApLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCQlpc3ltLm5fdmFsdWUgKz0gKCpzZWNwcCktPm91dHB1dF9vZmZzZXQ7Ci0JCWlmICghIG9ial9wZSAoaW5wdXRfYmZkKSkKLQkJICBpc3ltLm5fdmFsdWUgLT0gKCpzZWNwcCktPnZtYTsKLQkJaWYgKCEgb2JqX3BlIChmaW5mby0+b3V0cHV0X2JmZCkpCi0JCSAgaXN5bS5uX3ZhbHVlICs9ICgqc2VjcHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX0ZJTEU6Ci0JICAgICAgLyogVGhlIHZhbHVlIG9mIGEgQ19GSUxFIHN5bWJvbCBpcyB0aGUgc3ltYm9sIGluZGV4IG9mCi0JCSB0aGUgbmV4dCBDX0ZJTEUgc3ltYm9sLiAgVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRQotCQkgc3ltYm9sIGlzIHRoZSBzeW1ib2wgaW5kZXggdG8gdGhlIGZpcnN0IGV4dGVybmFsCi0JCSBzeW1ib2wgKGFjdHVhbGx5LCBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgZG9lcyBub3QgZ2V0Ci0JCSB0aGlzIHJpZ2h0LS1pdCBqdXN0IHNldHMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRQotCQkgc3ltYm9sIHRvIHplcm8tLWFuZCBub2JvZHkgaGFzIGV2ZXIgY29tcGxhaW5lZCBhYm91dAotCQkgaXQpLiAgV2UgdHJ5IHRvIGdldCB0aGlzIHJpZ2h0LCBiZWxvdywganVzdCBiZWZvcmUgd2UKLQkJIHdyaXRlIHRoZSBzeW1ib2xzIG91dCwgYnV0IGluIHRoZSBnZW5lcmFsIGNhc2Ugd2UgbWF5Ci0JCSBoYXZlIHRvIHdyaXRlIHRoZSBzeW1ib2wgb3V0IHR3aWNlLiAgKi8KLQotCSAgICAgIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCi0JCSAgJiYgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlICE9IChsb25nKSBvdXRwdXRfaW5kZXgpCi0JCXsKLQkJICAvKiBXZSBtdXN0IGNvcnJlY3QgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRQotICAgICAgICAgICAgICAgICAgICAgZW50cnkuICAqLwotCQkgIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSA9IG91dHB1dF9pbmRleDsKLQkJICBpZiAoKGJmZF9zaXplX3R5cGUpIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggPj0gc3ltZW50X2Jhc2UpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgaW4gdGhpcyBpbnB1dCBmaWxlLiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIChmaW5mby0+b3V0c3ltcwotCQkJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4Ci0JCQkJCQkJLSBzeW1lbnRfYmFzZSkKLQkJCQkJCSAgICAgICAqIG9zeW1lc3opKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgdGhlIGxhc3QgQ19GSUxFCi0JCQkgc3ltYm9sLiAgV2UgbmVlZCB0byB3cml0ZSBpdCBvdXQgYWdhaW4uICBXZQotCQkJIGJvcnJvdyAqb3V0c3ltIHRlbXBvcmFyaWx5LiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIG91dHN5bSk7Ci0JCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCQkgICAgKG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkKLQkJCQkgICAgICsgZmluZm8tPmxhc3RfZmlsZV9pbmRleCAqIG9zeW1lc3opLAotCQkJCSAgICBTRUVLX1NFVCkgIT0gMAotCQkJICB8fCAoYmZkX3dyaXRlIChvdXRzeW0sIG9zeW1lc3osIDEsIG91dHB1dF9iZmQpCi0JCQkgICAgICAhPSBvc3ltZXN6KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA9IG91dHB1dF9pbmRleDsKLQkgICAgICBmaW5mby0+bGFzdF9maWxlID0gaXN5bTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBJZiBkb2luZyB0YXNrIGxpbmtpbmcsIGNvbnZlcnQgbm9ybWFsIGdsb2JhbCBmdW5jdGlvbiBzeW1ib2xzIHRvCi0JICAgICBzdGF0aWMgZnVuY3Rpb25zLiAqLwotCi0JICBpZiAoZmluZm8tPmluZm8tPnRhc2tfbGluawotCSAgICAgICYmIChpc3ltLm5fc2NsYXNzID09IENfRVhUCi0JCSAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQKLQkJICB8fCAob2JqX3BlIChpbnB1dF9iZmQpICYmIGlzeW0ubl9zY2xhc3MgPT0gQ19OVF9XRUFLKSkpCi0JICAgIGlzeW0ubl9zY2xhc3MgPSBDX1NUQVQ7Ci0KLQkgIC8qIE91dHB1dCB0aGUgc3ltYm9sLiAgKi8KLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgb3V0c3ltKTsKLQotCSAgKmluZGV4cCA9IG91dHB1dF9pbmRleDsKLQotCSAgaWYgKGdsb2JhbCkKLQkgICAgewotCSAgICAgIGxvbmcgaW5keDsKLQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBpbmR4ID0gKChlc3ltIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkpCi0JCSAgICAgIC8gaXN5bWVzeik7Ci0JICAgICAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JICAgICAgaWYgKGggPT0gTlVMTCkKLQkJewotCQkgIC8qIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGVyZSB3ZXJlIGVycm9ycyBlYXJsaWVyIGluCi0gICAgICAgICAgICAgICAgICAgICB0aGUgbGluay4gICovCi0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgaC0+aW5keCA9IG91dHB1dF9pbmRleDsKLQkgICAgfQotCi0JICBvdXRwdXRfaW5kZXggKz0gYWRkOwotCSAgb3V0c3ltICs9IGFkZCAqIG9zeW1lc3o7Ci0JfQotCi0gICAgICBlc3ltICs9IGFkZCAqIGlzeW1lc3o7Ci0gICAgICBpc3ltcCArPSBhZGQ7Ci0gICAgICArK3NlY3BwOwotICAgICAgKytpbmRleHA7Ci0gICAgICBmb3IgKC0tYWRkOyBhZGQgPiAwOyAtLWFkZCkKLQl7Ci0JICAqc2VjcHArKyA9IE5VTEw7Ci0JICAqaW5kZXhwKysgPSAtMTsKLQl9Ci0gICAgfQotCi0gIC8qIEZpeCB1cCB0aGUgYXV4IGVudHJpZXMuICBUaGlzIG11c3QgYmUgZG9uZSBpbiBhIHNlcGFyYXRlIHBhc3MsCi0gICAgIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29ycmVjdCBzeW1ib2wgaW5kaWNlcyB1bnRpbCB3ZSBoYXZlCi0gICAgIGFscmVhZHkgZGVjaWRlZCB3aGljaCBzeW1ib2xzIHdlIGFyZSBnb2luZyB0byBrZWVwLiAgKi8KLQotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogaXN5bWVzejsKLSAgaXN5bXAgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLSAgaW5kZXhwID0gZmluZm8tPnN5bV9pbmRpY2VzOwotICBzeW1faGFzaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIG91dHN5bSA9IGZpbmZvLT5vdXRzeW1zOwotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIGludCBhZGQ7Ci0KLSAgICAgIGFkZCA9IDEgKyBpc3ltcC0+bl9udW1hdXg7Ci0KLSAgICAgIGlmICgoKmluZGV4cCA8IDAKLQkgICB8fCAoYmZkX3NpemVfdHlwZSkgKmluZGV4cCA8IHN5bWVudF9iYXNlKQotCSAgJiYgKCpzeW1faGFzaCA9PSBOVUxMCi0JICAgICAgfHwgKCpzeW1faGFzaCktPmF1eGJmZCAhPSBpbnB1dF9iZmQpKQotCWVzeW0gKz0gYWRkICogaXN5bWVzejsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0JICBpbnQgaTsKLQotCSAgaCA9IE5VTEw7Ci0JICBpZiAoKmluZGV4cCA8IDApCi0JICAgIHsKLQkgICAgICBoID0gKnN5bV9oYXNoOwotCi0JICAgICAgLyogVGhlIG02OGstbW90b3JvbGEtc3lzdiBhc3NlbWJsZXIgd2lsbCBzb21ldGltZXMKLSAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgdHdvIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lLCBidXQgb25seSBvbmUKLSAgICAgICAgICAgICAgICAgd2lsbCBoYXZlIGF1eCBlbnRyaWVzLiAgKi8KLQkgICAgICBCRkRfQVNTRVJUIChpc3ltcC0+bl9udW1hdXggPT0gMAotCQkJICB8fCBoLT5udW1hdXggPT0gaXN5bXAtPm5fbnVtYXV4KTsKLQkgICAgfQotCi0JICBlc3ltICs9IGlzeW1lc3o7Ci0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIG91dHN5bSArPSBvc3ltZXN6OwotCi0JICAvKiBIYW5kbGUgdGhlIGF1eCBlbnRyaWVzLiAgVGhpcyBoYW5kbGluZyBpcyBiYXNlZCBvbgotCSAgICAgY29mZl9wb2ludGVyaXplX2F1eC4gIEkgZG9uJ3Qga25vdyBpZiBpdCBhbHdheXMgY29ycmVjdC4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgaXN5bXAtPm5fbnVtYXV4ICYmIGVzeW0gPCBlc3ltX2VuZDsgaSsrKQotCSAgICB7Ci0JICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eHA7Ci0KLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQlhdXhwID0gaC0+YXV4ICsgaTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCBpc3ltcC0+bl90eXBlLAotCQkJCQlpc3ltcC0+bl9zY2xhc3MsIGksIGlzeW1wLT5uX251bWF1eCwKLQkJCQkJKFBUUikgJmF1eCk7Ci0JCSAgYXV4cCA9ICZhdXg7Ci0JCX0KLQotCSAgICAgIGlmIChpc3ltcC0+bl9zY2xhc3MgPT0gQ19GSUxFKQotCQl7Ci0JCSAgLyogSWYgdGhpcyBpcyBhIGxvbmcgZmlsZW5hbWUsIHdlIG11c3QgcHV0IGl0IGluIHRoZQotCQkgICAgIHN0cmluZyB0YWJsZS4gICovCi0JCSAgaWYgKGF1eHAtPnhfZmlsZS54X24ueF96ZXJvZXMgPT0gMAotCQkgICAgICAmJiBhdXhwLT54X2ZpbGUueF9uLnhfb2Zmc2V0ICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkJICAgICAgQkZEX0FTU0VSVCAoYXV4cC0+eF9maWxlLnhfbi54X29mZnNldAotCQkJCSAgPj0gU1RSSU5HX1NJWkVfU0laRSk7Ci0JCSAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JCQl7Ci0JCQkgIHN0cmluZ3MgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGlucHV0X2JmZCk7Ci0JCQkgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBmaWxlbmFtZSA9IHN0cmluZ3MgKyBhdXhwLT54X2ZpbGUueF9uLnhfb2Zmc2V0OwotCQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBmaWxlbmFtZSwKLQkJCQkJCSBoYXNoLCBjb3B5KTsKLQkJICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBhdXhwLT54X2ZpbGUueF9uLnhfb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpc3ltcC0+bl9zY2xhc3MgIT0gQ19TVEFUIHx8IGlzeW1wLT5uX3R5cGUgIT0gVF9OVUxMKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCi0JCSAgaWYgKElTRkNOIChpc3ltcC0+bl90eXBlKQotCQkgICAgICB8fCBJU1RBRyAoaXN5bXAtPm5fc2NsYXNzKQotCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19CTE9DSwotCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19GQ04pCi0JCSAgICB7Ci0JCSAgICAgIGluZHggPSBhdXhwLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotCQkgICAgICBpZiAoaW5keCA+IDAKLQkJCSAgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJewotCQkJICAvKiBXZSBsb29rIGZvcndhcmQgdGhyb3VnaCB0aGUgc3ltYm9sIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIG5leHQgc3ltYm9sIHdlIGFyZSBnb2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmNsdWRlLiAgSSBkb24ndCBrbm93IGlmIHRoaXMgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXJlbHkgcmlnaHQuICAqLwotCQkJICB3aGlsZSAoKGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XSA8IDAKLQkJCQkgIHx8ICgoYmZkX3NpemVfdHlwZSkgZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdCi0JCQkJICAgICAgPCBzeW1lbnRfYmFzZSkpCi0JCQkJICYmIGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCSAgICArK2luZHg7Ci0JCQkgIGlmIChpbmR4ID49IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJICAgIGluZHggPSBvdXRwdXRfaW5kZXg7Ci0JCQkgIGVsc2UKLQkJCSAgICBpbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkJICBhdXhwLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0gaW5keDsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGluZHggPSBhdXhwLT54X3N5bS54X3RhZ25keC5sOwotCQkgIGlmIChpbmR4ID4gMCAmJiBpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgc3ltaW5keDsKLQotCQkgICAgICBzeW1pbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkgICAgICBpZiAoc3ltaW5keCA8IDApCi0JCQlhdXhwLT54X3N5bS54X3RhZ25keC5sID0gMDsKLQkJICAgICAgZWxzZQotCQkJYXV4cC0+eF9zeW0ueF90YWduZHgubCA9IHN5bWluZHg7Ci0JCSAgICB9Ci0KLQkJICAvKiBUaGUgLmJmIHN5bWJvbHMgYXJlIHN1cHBvc2VkIHRvIGJlIGxpbmtlZCB0aHJvdWdoCi0JCSAgICAgdGhlIGVuZG5keCBmaWVsZC4gIFdlIG5lZWQgdG8gY2FycnkgdGhpcyBsaXN0Ci0JCSAgICAgYWNyb3NzIG9iamVjdCBmaWxlcy4gICovCi0JCSAgaWYgKGkgPT0gMAotCQkgICAgICAmJiBoID09IE5VTEwKLQkJICAgICAgJiYgaXN5bXAtPm5fc2NsYXNzID09IENfRkNOCi0JCSAgICAgICYmIChpc3ltcC0+X24uX25fbi5fbl96ZXJvZXMgIT0gMAotCQkJICB8fCBpc3ltcC0+X24uX25fbi5fbl9vZmZzZXQgPT0gMCkKLQkJICAgICAgJiYgaXN5bXAtPl9uLl9uX25hbWVbMF0gPT0gJy4nCi0JCSAgICAgICYmIGlzeW1wLT5fbi5fbl9uYW1lWzFdID09ICdiJwotCQkgICAgICAmJiBpc3ltcC0+X24uX25fbmFtZVsyXSA9PSAnZicKLQkJICAgICAgJiYgaXN5bXAtPl9uLl9uX25hbWVbM10gPT0gJ1wwJykKLQkJICAgIHsKLQkJICAgICAgaWYgKGZpbmZvLT5sYXN0X2JmX2luZGV4ICE9IC0xKQotCQkJewotCQkJICBmaW5mby0+bGFzdF9iZi54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0KLQkJCSAgICAqaW5kZXhwOwotCi0JCQkgIGlmICgoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfYmZfaW5kZXgKLQkJCSAgICAgID49IHN5bWVudF9iYXNlKQotCQkJICAgIHsKLQkJCSAgICAgIFBUUiBhdXhvdXQ7Ci0KLQkJCSAgICAgIC8qIFRoZSBsYXN0IC5iZiBzeW1ib2wgaXMgaW4gdGhpcyBpbnB1dAotCQkJCSBmaWxlLiAgVGhpcyB3aWxsIG9ubHkgaGFwcGVuIGlmIHRoZQotCQkJCSBhc3NlbWJsZXIgZGlkIG5vdCBzZXQgdXAgdGhlIC5iZgotCQkJCSBlbmRuZHggc3ltYm9scyBjb3JyZWN0bHkuICAqLwotCQkJICAgICAgYXV4b3V0ID0gKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0JCQkJCSAgICAgICsgKChmaW5mby0+bGFzdF9iZl9pbmRleAotCQkJCQkJICAtIHN5bWVudF9iYXNlKQotCQkJCQkJICogb3N5bWVzeikpOwotCQkJICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLAotCQkJCQkJICAgICAoUFRSKSAmZmluZm8tPmxhc3RfYmYsCi0JCQkJCQkgICAgIGlzeW1wLT5uX3R5cGUsCi0JCQkJCQkgICAgIGlzeW1wLT5uX3NjbGFzcywKLQkJCQkJCSAgICAgMCwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCQkJICAgICBhdXhvdXQpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSB3cml0dGVuIG91dCB0aGUgbGFzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJmIGF1eCBlbnRyeS4gIFdlIG5lZWQgdG8gd3JpdGUgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBhZ2Fpbi4gIFdlIGJvcnJvdyAqb3V0c3ltCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcmlseS4gIEZJWE1FOiBUaGlzIGNhc2Ugc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBtYWRlIGZhc3Rlci4gICovCi0JCQkgICAgICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9iZiwKLQkJCQkJCSAgICAgaXN5bXAtPm5fdHlwZSwKLQkJCQkJCSAgICAgaXN5bXAtPm5fc2NsYXNzLAotCQkJCQkJICAgICAwLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJCQkgICAgIChQVFIpIG91dHN5bSk7Ci0JCQkgICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQotCQkJCQkgICAgICsgZmluZm8tPmxhc3RfYmZfaW5kZXggKiBvc3ltZXN6KSwKLQkJCQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JCQkJICB8fCBiZmRfd3JpdGUgKG91dHN5bSwgb3N5bWVzeiwgMSwKLQkJCQkJCW91dHB1dF9iZmQpICE9IG9zeW1lc3opCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBpZiAoYXV4cC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCAhPSAwKQotCQkJZmluZm8tPmxhc3RfYmZfaW5kZXggPSAtMTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiBUaGUgZW5kbmR4IGZpZWxkIG9mIHRoaXMgYXV4IGVudHJ5IG11c3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXBkYXRlZCB3aXRoIHRoZSBzeW1ib2wgbnVtYmVyIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC5iZiBzeW1ib2wuICAqLwotCQkJICBmaW5mby0+bGFzdF9iZiA9ICphdXhwOwotCQkJICBmaW5mby0+bGFzdF9iZl9pbmRleCA9ICgoKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKQotCQkJCQkJICAgLyBvc3ltZXN6KQotCQkJCQkJICArIHN5bWVudF9iYXNlKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGggPT0gTlVMTCkKLQkJewotCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgYXV4cCwgaXN5bXAtPm5fdHlwZSwKLQkJCQkJIGlzeW1wLT5uX3NjbGFzcywgaSwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCQkgKFBUUikgb3V0c3ltKTsKLQkJICBvdXRzeW0gKz0gb3N5bWVzejsKLQkJfQotCi0JICAgICAgZXN5bSArPSBpc3ltZXN6OwotCSAgICB9Ci0JfQotCi0gICAgICBpbmRleHAgKz0gYWRkOwotICAgICAgaXN5bXAgKz0gYWRkOwotICAgICAgc3ltX2hhc2ggKz0gYWRkOwotICAgIH0KLQotICAvKiBSZWxvY2F0ZSB0aGUgbGluZSBudW1iZXJzLCB1bmxlc3Mgd2UgYXJlIHN0cmlwcGluZyB0aGVtLiAgKi8KLSAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0gICAgICB8fCBmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLSAgICB7Ci0gICAgICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGJmZF92bWEgb2Zmc2V0OwotCSAgYmZkX2J5dGUgKmVsaW5lOwotCSAgYmZkX2J5dGUgKmVsaW5lZW5kOwotCSAgYmZkX2J5dGUgKm9lbGluZTsKLQkgIGJvb2xlYW4gc2tpcHBpbmc7Ci0KLQkgIC8qIEZJWE1FOiBJZiBTRUNfSEFTX0NPTlRFTlRTIGlzIG5vdCBmb3IgdGhlIHNlY3Rpb24sIHRoZW4KLQkgICAgIGJ1aWxkX2xpbmtfb3JkZXIgaW4gbGR3cml0ZS5jIHdpbGwgbm90IGhhdmUgY3JlYXRlZCBhCi0JICAgICBsaW5rIG9yZGVyLCB3aGljaCBtZWFucyB0aGF0IHdlIHdpbGwgbm90IGhhdmUgc2VlbiB0aGlzCi0JICAgICBpbnB1dCBzZWN0aW9uIGluIF9iZmRfY29mZl9maW5hbF9saW5rLCB3aGljaCBtZWFucyB0aGF0Ci0JICAgICB3ZSB3aWxsIG5vdCBoYXZlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlIGxpbmUgbnVtYmVycyBvZgotCSAgICAgdGhpcyBzZWN0aW9uLiAgSSBkb24ndCB0aGluayBsaW5lIG51bWJlcnMgY2FuIGJlCi0JICAgICBtZWFuaW5nZnVsIGZvciBhIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgaGF2ZQotCSAgICAgU0VDX0hBU19DT05URU5UUyBzZXQsIGJ1dCwgaWYgdGhleSBkbywgdGhpcyBtdXN0IGJlCi0JICAgICBjaGFuZ2VkLiAgKi8KLQkgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMAotCSAgICAgIHx8IChvLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIG8tPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfcmVhZCAoZmluZm8tPmxpbmVub3MsIGxpbmVzeiwgby0+bGluZW5vX2NvdW50LAotCQkJICAgaW5wdXRfYmZkKSAhPSBsaW5lc3ogKiBvLT5saW5lbm9fY291bnQpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgb2Zmc2V0ID0gby0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIG8tPm91dHB1dF9vZmZzZXQgLSBvLT52bWE7Ci0JICBlbGluZSA9IGZpbmZvLT5saW5lbm9zOwotCSAgb2VsaW5lID0gZmluZm8tPmxpbmVub3M7Ci0JICBlbGluZWVuZCA9IGVsaW5lICsgbGluZXN6ICogby0+bGluZW5vX2NvdW50OwotCSAgc2tpcHBpbmcgPSBmYWxzZTsKLQkgIGZvciAoOyBlbGluZSA8IGVsaW5lZW5kOyBlbGluZSArPSBsaW5lc3opCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vIGlsaW5lOwotCi0JICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGlucHV0X2JmZCwgKFBUUikgZWxpbmUsIChQVFIpICZpbGluZSk7Ci0KLQkgICAgICBpZiAoaWxpbmUubF9sbm5vICE9IDApCi0JCWlsaW5lLmxfYWRkci5sX3BhZGRyICs9IG9mZnNldDsKLQkgICAgICBlbHNlIGlmIChpbGluZS5sX2FkZHIubF9zeW1uZHggPj0gMAotCQkgICAgICAgJiYgKCh1bnNpZ25lZCBsb25nKSBpbGluZS5sX2FkZHIubF9zeW1uZHgKLQkJCSAgIDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpKQotCQl7Ci0JCSAgbG9uZyBpbmR4OwotCi0JCSAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbGluZS5sX2FkZHIubF9zeW1uZHhdOwotCi0JCSAgaWYgKGluZHggPCAwKQotCQkgICAgewotCQkgICAgICAvKiBUaGVzZSBsaW5lIG51bWJlcnMgYXJlIGF0dGFjaGVkIHRvIGEgc3ltYm9sCi0JCQkgd2hpY2ggd2UgYXJlIHN0cmlwcGluZy4gIFdlIG11c3QgZGlzY2FyZCB0aGUKLQkJCSBsaW5lIG51bWJlcnMgYmVjYXVzZSByZWFkaW5nIHRoZW0gYmFjayB3aXRoCi0JCQkgbm8gYXNzb2NpYXRlZCBzeW1ib2wgKG9yIGFzc29jaWF0aW5nIHRoZW0gYWxsCi0JCQkgd2l0aCBzeW1ib2wgIzApIHdpbGwgZmFpbC4gIFdlIGNhbid0IHJlZ2FpbgotCQkJIHRoZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGZpbGUsIGJ1dCBhdCBsZWFzdAotCQkJIHRoZXkncmUgZGVuc2UuICAqLwotCQkgICAgICBza2lwcGluZyA9IHRydWU7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzOwotCQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgaWE7Ci0KLQkJICAgICAgLyogRml4IHVwIHRoZSBsbm5vcHRyIGZpZWxkIGluIHRoZSBhdXggZW50cnkgb2YKLQkJCSB0aGUgc3ltYm9sLiAgSXQgdHVybnMgb3V0IHRoYXQgd2UgY2FuJ3QgZG8KLQkJCSB0aGlzIHdoZW4gd2UgbW9kaWZ5IHRoZSBzeW1ib2wgYXV4IGVudHJpZXMsCi0JCQkgYmVjYXVzZSBnYXMgc29tZXRpbWVzIHNjcmV3cyB1cCB0aGUgbG5ub3B0cgotCQkJIGZpZWxkIGFuZCBtYWtlcyBpdCBhbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQKLQkJCSBvZiB0aGUgbGluZSBudW1iZXJzIHJhdGhlciB0aGFuIGFuIGFic29sdXRlCi0JCQkgZmlsZSBpbmRleC4gICovCi0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChvdXRwdXRfYmZkLAotCQkJCQkgICAgKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0JCQkJCQkgICArICgoaW5keCAtIHN5bWVudF9iYXNlKQotCQkJCQkJICAgICAgKiBvc3ltZXN6KSksCi0JCQkJCSAgICAoUFRSKSAmaXMpOwotCQkgICAgICBpZiAoKElTRkNOIChpcy5uX3R5cGUpCi0JCQkgICB8fCBpcy5uX3NjbGFzcyA9PSBDX0JMT0NLKQotCQkJICAmJiBpcy5uX251bWF1eCA+PSAxKQotCQkJewotCQkJICBQVFIgYXV4cHRyOwotCi0JCQkgIGF1eHB0ciA9IChQVFIpIChmaW5mby0+b3V0c3ltcwotCQkJCQkgICsgKChpbmR4IC0gc3ltZW50X2Jhc2UgKyAxKQotCQkJCQkgICAgICogb3N5bWVzeikpOwotCQkJICBiZmRfY29mZl9zd2FwX2F1eF9pbiAob3V0cHV0X2JmZCwgYXV4cHRyLAotCQkJCQkJaXMubl90eXBlLCBpcy5uX3NjbGFzcywKLQkJCQkJCTAsIGlzLm5fbnVtYXV4LCAoUFRSKSAmaWEpOwotCQkJICBpYS54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPQotCQkJICAgIChvLT5vdXRwdXRfc2VjdGlvbi0+bGluZV9maWxlcG9zCi0JCQkgICAgICsgby0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudCAqIGxpbmVzegotCQkJICAgICArIGVsaW5lIC0gZmluZm8tPmxpbmVub3MpOwotCQkJICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpYSwKLQkJCQkJCSBpcy5uX3R5cGUsIGlzLm5fc2NsYXNzLCAwLAotCQkJCQkJIGlzLm5fbnVtYXV4LCBhdXhwdHIpOwotCQkJfQotCi0JCQlza2lwcGluZyA9IGZhbHNlOwotCQkgICAgfQotCi0JCSAgaWxpbmUubF9hZGRyLmxfc3ltbmR4ID0gaW5keDsKLQkJfQotCi0JICAgICAgaWYgKCFza2lwcGluZykKLQkgICAgICAgIHsKLQkJICBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpbGluZSwKLQkJCQkJICAgIChQVFIpIG9lbGluZSk7Ci0JCSAgb2VsaW5lICs9IGxpbmVzejsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCShvLT5vdXRwdXRfc2VjdGlvbi0+bGluZV9maWxlcG9zCi0JCQkgKyBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICogbGluZXN6KSwKLQkJCVNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF93cml0ZSAoZmluZm8tPmxpbmVub3MsIDEsIG9lbGluZSAtIGZpbmZvLT5saW5lbm9zLAotCQkJICAgICBvdXRwdXRfYmZkKQotCQkgICE9IChiZmRfc2l6ZV90eXBlKSAob2VsaW5lIC0gZmluZm8tPmxpbmVub3MpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICs9Ci0JICAgIChvZWxpbmUgLSBmaW5mby0+bGluZW5vcykgLyBsaW5lc3o7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBzd2FwcGVkIG91dCBhIENfRklMRSBzeW1ib2wsIGd1ZXNzIHRoYXQgdGhlIG5leHQgQ19GSUxFCi0gICAgIHN5bWJvbCB3aWxsIGJlIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIG5leHQgaW5wdXQgZmlsZS4gIEluIHRoZQotICAgICBub3JtYWwgY2FzZSwgdGhpcyB3aWxsIHNhdmUgdXMgZnJvbSB3cml0aW5nIG91dCB0aGUgQ19GSUxFIHN5bWJvbAotICAgICBhZ2Fpbi4gICovCi0gIGlmIChmaW5mby0+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+aW5keCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQotICArK29ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgYW55IGFzc29jaWF0ZWQgYXV4IGVudHJpZXMuICBNb3N0IG9mIHRoZSBhdXggZW50cmllcwotICAgICB3aWxsIGhhdmUgYmVlbiBtb2RpZmllZCBpbiBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQuICBXZSBoYXZlIHRvCi0gICAgIGhhbmRsZSBzZWN0aW9uIGF1eCBlbnRyaWVzIGhlcmUsIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGZpbmFsCi0gICAgIHJlbG9jYXRpb24gYW5kIGxpbmUgbnVtYmVyIGNvdW50cy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBpc3ltLm5fbnVtYXV4OyBpKyspCi0gICAgewotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXhwOwotCi0gICAgICBhdXhwID0gaC0+YXV4ICsgaTsKLQotICAgICAgLyogTG9vayBmb3IgYSBzZWN0aW9uIGF1eCBlbnRyeSBoZXJlIHVzaW5nIHRoZSBzYW1lIHRlc3RzIHRoYXQKLSAgICAgICAgIGNvZmZfc3dhcF9hdXhfb3V0IHVzZXMuICAqLwotICAgICAgaWYgKGkgPT0gMAotCSAgJiYgKGlzeW0ubl9zY2xhc3MgPT0gQ19TVEFUCi0JICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX0hJRERFTikKLQkgICYmIGlzeW0ubl90eXBlID09IFRfTlVMTAotCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCSAgaWYgKHNlYyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXV4cC0+eF9zY24ueF9zY25sZW4gPSAoc2VjLT5fY29va2VkX3NpemUgIT0gMAotCQkJCSAgICAgID8gc2VjLT5fY29va2VkX3NpemUKLQkJCQkgICAgICA6IHNlYy0+X3Jhd19zaXplKTsKLQotCSAgICAgIC8qIEZvciBQRSwgYW4gb3ZlcmZsb3cgb24gdGhlIGZpbmFsIGxpbmsgcmVwb3J0ZWRseSBkb2VzCi0gICAgICAgICAgICAgICAgIG5vdCBtYXR0ZXIuICBGSVhNRTogV2h5IG5vdD8gICovCi0KLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IDB4ZmZmZgotCQkgICYmICghIG9ial9wZSAob3V0cHV0X2JmZCkKLQkJICAgICAgfHwgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkpCi0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogJXM6IHJlbG9jIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIpLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChvdXRwdXRfYmZkKSwKLQkJICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHNlYyksCi0JCSAgIHNlYy0+cmVsb2NfY291bnQpOwotCi0JICAgICAgaWYgKHNlYy0+bGluZW5vX2NvdW50ID4gMHhmZmZmCi0JCSAgJiYgKCEgb2JqX3BlIChvdXRwdXRfYmZkKQotCQkgICAgICB8fCBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKSkKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIiVzOiB3YXJuaW5nOiAlczogbGluZSBudW1iZXIgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JCSAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLAotCQkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgc2VjKSwKLQkJICAgc2VjLT5saW5lbm9fY291bnQpOwotCi0JICAgICAgYXV4cC0+eF9zY24ueF9ucmVsb2MgPSBzZWMtPnJlbG9jX2NvdW50OwotCSAgICAgIGF1eHAtPnhfc2NuLnhfbmxpbm5vID0gc2VjLT5saW5lbm9fY291bnQ7Ci0JICAgICAgYXV4cC0+eF9zY24ueF9jaGVja3N1bSA9IDA7Ci0JICAgICAgYXV4cC0+eF9zY24ueF9hc3NvY2lhdGVkID0gMDsKLQkgICAgICBhdXhwLT54X3Njbi54X2NvbWRhdCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgYXV4cCwgaXN5bS5uX3R5cGUsCi0JCQkgICAgIGlzeW0ubl9zY2xhc3MsIGksIGlzeW0ubl9udW1hdXgsCi0JCQkgICAgIChQVFIpIGZpbmZvLT5vdXRzeW1zKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBzeW1lc3osIDEsIG91dHB1dF9iZmQpICE9IHN5bWVzeikKLQl7Ci0JICBmaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICArK29ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0YXNrIGdsb2JhbCBzeW1ib2xzLCBjb252ZXJ0aW5nIHRoZW0gdG8gc3RhdGljcy4gIENhbGxlZAotICAgdmlhIGNvZmZfbGlua19oYXNoX3RyYXZlcnNlLiAgQ2FsbHMgYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSB0byBkbwotICAgdGhlIGRpcnR5IHdvcmssIGlmIHRoZSBzeW1ib2wgd2UgYXJlIHByb2Nlc3NpbmcgbmVlZHMgY29udmVyc2lvbi4gKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikgZGF0YTsKLSAgYm9vbGVhbiBydG52YWwgPSB0cnVlOwotICBib29sZWFuIHNhdmVfZ2xvYmFsX3RvX3N0YXRpYzsKLQotICBpZiAoaC0+aW5keCA8IDApCi0gICAgewotICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JewotCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgc2F2ZV9nbG9iYWxfdG9fc3RhdGljID0gZmluZm8tPmdsb2JhbF90b19zdGF0aWM7Ci0JICBmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYyA9IHRydWU7Ci0JICBydG52YWwgPSBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSAoaCwgZGF0YSk7Ci0JICBmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYyA9IHNhdmVfZ2xvYmFsX3RvX3N0YXRpYzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gKHJ0bnZhbCk7Ci19Ci0KLS8qIEhhbmRsZSBhIGxpbmsgb3JkZXIgd2hpY2ggaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgYSByZWxvYy4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBmaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoX3B0cjsKLQotICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7Ci0gIGlmIChob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAobGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgICBiZmRfYnl0ZSAqYnVmOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYm9vbGVhbiBvazsKLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIG91dHB1dF9iZmQsCi0JCQkJICAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsIGJ1Zik7Ci0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoZmluZm8tPmluZm8sCi0JCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJICAgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uKQotCQkgICA6IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lKSwKLQkJICBob3d0by0+bmFtZSwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsCi0JCSAgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sIChQVFIpIGJ1ZiwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBpZiAoISBvaykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFN0b3JlIHRoZSByZWxvYyBpbmZvcm1hdGlvbiBpbiB0aGUgcmlnaHQgcGxhY2UuICBJdCB3aWxsIGdldAotICAgICBzd2FwcGVkIGFuZCB3cml0dGVuIG91dCBhdCB0aGUgZW5kIG9mIHRoZSBmaW5hbF9saW5rIHJvdXRpbmUuICAqLwotCi0gIGlyZWwgPSAoZmluZm8tPnNlY3Rpb25faW5mb1tvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4XS5yZWxvY3MKLQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLSAgcmVsX2hhc2hfcHRyID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcwotCQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQotICBtZW1zZXQgKGlyZWwsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSk7Ci0gICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotCi0gIGlyZWwtPnJfdmFkZHIgPSBvdXRwdXRfc2VjdGlvbi0+dm1hICsgbGlua19vcmRlci0+b2Zmc2V0OwotCi0gIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byBzb21laG93IGxvY2F0ZSBhIHN5bWJvbCBpbiB0aGUgcmlnaHQgc2VjdGlvbi4gIFRoZQotICAgICAgICAgc3ltYm9sIG11c3QgZWl0aGVyIGhhdmUgYSB2YWx1ZSBvZiB6ZXJvLCBvciB3ZSBtdXN0IGFkanVzdAotICAgICAgICAgdGhlIGFkZGVuZCBieSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIEZJWE1FOiBXcml0ZSB0aGlzCi0gICAgICAgICB3aGVuIHdlIG5lZWQgaXQuICBUaGUgb2xkIGxpbmtlciBjb3VsZG4ndCBoYW5kbGUgdGhpcyBhbnlob3cuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgICAqcmVsX2hhc2hfcHRyID0gTlVMTDsKLSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAotCQkJCQkgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCi0JCQkJCSBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLSAgICAgIGlmIChoICE9IE5VTEwpCi0JewotCSAgaWYgKGgtPmluZHggPj0gMCkKLQkgICAgaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU2V0IHRoZSBpbmRleCB0byAtMiB0byBmb3JjZSB0aGlzIHN5bWJvbCB0byBnZXQKLQkJIHdyaXR0ZW4gb3V0LiAgKi8KLQkgICAgICBoLT5pbmR4ID0gLTI7Ci0JICAgICAgKnJlbF9oYXNoX3B0ciA9IGg7Ci0JICAgICAgaXJlbC0+cl9zeW1uZHggPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCSAoZmluZm8tPmluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlyZWwtPnJfc3ltbmR4ID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBJcyB0aGlzIGFsd2F5cyByaWdodD8gICovCi0gIGlyZWwtPnJfdHlwZSA9IGhvd3RvLT50eXBlOwotCi0gIC8qIHJfc2l6ZSBpcyBvbmx5IHVzZWQgb24gdGhlIFJTLzYwMDAsIHdoaWNoIG5lZWRzIGl0cyBvd24gbGlua2VyCi0gICAgIHJvdXRpbmVzIGFueWhvdy4gIHJfZXh0ZXJuIGlzIG9ubHkgdXNlZCBmb3IgRUNPRkYuICAqLwotCi0gIC8qIEZJWE1FOiBXaGF0IGlzIHRoZSByaWdodCB2YWx1ZSBmb3Igcl9vZmZzZXQ/ICBJcyB6ZXJvIE9LPyAgKi8KLQotICArK291dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQSBiYXNpYyByZWxvYyBoYW5kbGluZyByb3V0aW5lIHdoaWNoIG1heSBiZSB1c2VkIGJ5IHByb2Nlc3NvcnMgd2l0aAotICAgc2ltcGxlIHJlbG9jcy4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbG9jcywgc3ltcywKLQkJCQkgICAgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGxvbmcgc3ltbmR4OwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlIGlmIChzeW1uZHggPCAwCi0JICAgICAgIHx8ICh1bnNpZ25lZCBsb25nKSBzeW1uZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICgiJXM6IGlsbGVnYWwgc3ltYm9sIGluZGV4ICVsZCBpbiByZWxvY3MiLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgc3ltbmR4KTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JeyAgICAKLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgLyogQ09GRiB0cmVhdHMgY29tbW9uIHN5bWJvbHMgaW4gb25lIG9mIHR3byB3YXlzLiAgRWl0aGVyIHRoZQotICAgICAgICAgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIGluY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBvciBpdAotICAgICAgICAgaXMgbm90LiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNpemUgaXMgbm90IGluY2x1ZGVkLCBhbmQgZm9yY2UKLSAgICAgICAgIHRoZSBydHlwZV90b19ob3d0byBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIGFkZGVuZCBhcyBuZWVkZWQuICAqLwotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotCi0gICAgICBob3d0byA9IGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKLQkJCQkgICAgICAgc3ltLCAmYWRkZW5kKTsKLSAgICAgIGlmIChob3d0byA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSWYgd2UgYXJlIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZW4gd2UgY2FuIGp1c3QgaWdub3JlCi0gICAgICAgICBhIFBDIHJlbGF0aXZlIHJlbG9jIHRoYXQgaXMgcGNyZWxfb2Zmc2V0LiAgSXQgd2lsbCBhbHJlYWR5Ci0gICAgICAgICBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlLiAgSWYgdGhpcyBpcyBub3QgYSByZWxvY2F0ZWFibGUgbGluaywKLSAgICAgICAgIHRoZW4gd2Ugc2hvdWxkIGlnbm9yZSB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KLSAgICAgIGlmIChob3d0by0+cGNfcmVsYXRpdmUgJiYgaG93dG8tPnBjcmVsX29mZnNldCkKLQl7Ci0JICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICBjb250aW51ZTsKLQkgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQkgICAgYWRkZW5kICs9IHN5bS0+bl92YWx1ZTsKLQl9Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLSAgICAgICAgICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBzeW0tPm5fdmFsdWUpOwotCSAgICAgIGlmICghIG9ial9wZSAoaW5wdXRfYmZkKSkKLQkJdmFsIC09IHNlYy0+dm1hOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB9Ci0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCi0JewotCSAgLyogRW1pdCBhIHJlbG9jIGlmIHRoZSBiYWNrZW5kIHRoaW5rcyBpdCBuZWVkcyBpdC4gKi8KLQkgIGlmIChzeW0gJiYgcGVfZGF0YSAob3V0cHV0X2JmZCktPmluX3JlbG9jX3AgKG91dHB1dF9iZmQsIGhvd3RvKSkKLQkgICAgewotCSAgICAgIC8qIFJlbG9jYXRpb24gdG8gYSBzeW1ib2wgaW4gYSBzZWN0aW9uIHdoaWNoIGlzbid0Ci0JCSBhYnNvbHV0ZS4gIFdlIG91dHB1dCB0aGUgYWRkcmVzcyBoZXJlIHRvIGEgZmlsZS4KLQkJIFRoaXMgZmlsZSBpcyB0aGVuIHJlYWQgYnkgZGxsdG9vbCB3aGVuIGdlbmVyYXRpbmcgdGhlCi0JCSByZWxvYyBzZWN0aW9uLiAgTm90ZSB0aGF0IHRoZSBiYXNlIGZpbGUgaXMgbm90Ci0JCSBwb3J0YWJsZSBiZXR3ZWVuIHN5c3RlbXMuICBXZSB3cml0ZSBvdXQgYSBsb25nIGhlcmUsCi0JCSBhbmQgZGxsdG9vbCByZWFkcyBpbiBhIGxvbmcuICAqLwotCSAgICAgIGxvbmcgYWRkciA9IChyZWwtPnJfdmFkZHIgCi0JCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSAKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCAKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgaWYgKGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnBlKQotCQlhZGRyIC09IHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0JICAgICAgaWYgKGZ3cml0ZSAoJmFkZHIsIDEsIHNpemVvZiAobG9uZyksIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSkKLQkJICAhPSBzaXplb2YgKGxvbmcpKQotCQl7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCX0KLSAgCi0gICAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsCi0JCQkJCXJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJdmFsLCBhZGRlbmQpOwotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogYmFkIHJlbG9jIGFkZHJlc3MgMHglbHggaW4gc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl92YWRkciwKLQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgc3ltLCBidWYpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCmRpZmYgLS1naXQgYS9iZmQvY29mZnN3YXAuaCBiL2JmZC9jb2Zmc3dhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGE1ZjY2Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2Zmc3dhcC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTE0ICswLDAgQEAKLS8qIEdlbmVyaWMgQ09GRiBzd2FwcGluZyByb3V0aW5lcywgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdXNlZCB0byBzd2FwIENPRkYgZGF0YS4gIEl0IGlzIGEgaGVhZGVyCi0gICBmaWxlIGJlY2F1c2UgdGhlIGRldGFpbHMgb2Ygc3dhcHBpbmcgZGVwZW5kIG9uIHRoZSBkZXRhaWxzIG9mIHRoZQotICAgc3RydWN0dXJlcyB1c2VkIGJ5IGVhY2ggQ09GRiBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaXMgaW5jbHVkZWQgYnkKLSAgIGNvZmZjb2RlLmgsIGFzIHdlbGwgYXMgYnkgdGhlIEVDT0ZGIGJhY2tlbmQuCi0KLSAgIEFueSBmaWxlIHdoaWNoIHVzZXMgdGhpcyBtdXN0IGZpcnN0IGluY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIgYW5kCi0gICAiY29mZi9DUFUuaCIuICBUaGUgZnVuY3Rpb25zIHdpbGwgdGhlbiBiZSBjb3JyZWN0IGZvciB0aGF0IENQVS4gICovCi0KLSNkZWZpbmUgUFVUV09SRCBiZmRfaF9wdXRfMzIKLSNkZWZpbmUgUFVUSEFMRiBiZmRfaF9wdXRfMTYKLSNkZWZpbmUJUFVUQllURSBiZmRfaF9wdXRfOAotCi0jaWZuZGVmIEdFVF9GQ05fTE5OT1BUUgotI2RlZmluZSBHRVRfRkNOX0xOTk9QVFIoYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNlbmRpZgotCi0jaWZuZGVmIEdFVF9GQ05fRU5ETkRYCi0jZGVmaW5lIEdFVF9GQ05fRU5ETkRYKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNlbmRpZgotCi0jaWZuZGVmIFBVVF9GQ05fTE5OT1BUUgotI2RlZmluZSBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgaW4sIGV4dCkgIFBVVFdPUkQoYWJmZCwgIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0ZDTl9FTkRORFgKLSNkZWZpbmUgUFVUX0ZDTl9FTkRORFgoYWJmZCwgaW4sIGV4dCkgUFVUV09SRChhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+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+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSk7Ci0gICAgfQotCi0gIGlmIChJU0ZDTih0eXBlKSkgewotICAgIGluLT54X3N5bS54X21pc2MueF9mc2l6ZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9mc2l6ZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vID0gR0VUX0xOU1pfTE5OTyhhYmZkLCBleHQpOwotICAgIGluLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSA9IEdFVF9MTlNaX1NJWkUoYWJmZCwgZXh0KTsKLSAgfQotCi1lbmQ6IDsKLSAgLyogdGhlIHNlbWljb2xvbiBpcyBiZWNhdXNlIE1TVkMgZG9lc24ndCBsaWtlIGxhYmVscyBhdAotICAgICBlbmQgb2YgYmxvY2suICovCi0KLSNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfSU5fUE9TVAotICBDT0ZGX0FESlVTVF9BVVhfSU5fUE9TVCAoYWJmZCwgZXh0MSwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgaW4xKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfYXV4X291dCAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKQotICAgICBiZmQgICAqYWJmZDsKLSAgICAgUFRSIAlpbnA7Ci0gICAgIGludCAgIHR5cGU7Ci0gICAgIGludCAgIGNsYXNzOwotICAgICBpbnQgICBpbmR4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCAgIG51bWF1eCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIJZXh0cDsKLXsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKilpbnA7Ci0gIEFVWEVOVCAqZXh0ID0gKEFVWEVOVCAqKWV4dHA7Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfT1VUX1BSRQotICBDT0ZGX0FESlVTVF9BVVhfT1VUX1BSRSAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKTsKLSNlbmRpZgotICBtZW1zZXQoKFBUUilleHQsIDAsIEFVWEVTWik7Ci0gIHN3aXRjaCAoY2xhc3MpIHsKLSAgY2FzZSBDX0ZJTEU6Ci0gICAgaWYgKGluLT54X2ZpbGUueF9mbmFtZVswXSA9PSAwKSB7Ci0gICAgICBQVVRXT1JEKGFiZmQsIDAsIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF96ZXJvZXMpOwotICAgICAgUFVUV09SRChhYmZkLAotCSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0LAotCSAgICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0KLSAgICBlbHNlIHsKLSNpZiBGSUxOTUxFTiAhPSBFX0ZJTE5NTEVOCi0gICAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgRklMTk1MRU4hOwotI2Vsc2UKLSAgICAgIG1lbWNweSAoZXh0LT54X2ZpbGUueF9mbmFtZSwgaW4tPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZ290byBlbmQ7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogUlMvNjAwMCAiY3NlY3QiIGF1eGVudHMgKi8KLSAgY2FzZSBDX0VYVDoKLSAgY2FzZSBDX0hJREVYVDoKLSAgICBpZiAoaW5keCArIDEgPT0gbnVtYXV4KQotICAgICAgewotCVBVVFdPUkQgKGFiZmQsIGluLT54X2NzZWN0Lnhfc2NubGVuLmwsCWV4dC0+eF9jc2VjdC54X3Njbmxlbik7Ci0JUFVUV09SRCAoYWJmZCwgaW4tPnhfY3NlY3QueF9wYXJtaGFzaCwJZXh0LT54X2NzZWN0LnhfcGFybWhhc2gpOwotCVBVVEhBTEYgKGFiZmQsIGluLT54X2NzZWN0Lnhfc25oYXNoLAlleHQtPnhfY3NlY3QueF9zbmhhc2gpOwotCS8qIFdlIGRvbid0IGhhdmUgdG8gaGFjayBiaXRmaWVsZHMgaW4geF9zbXR5cCBiZWNhdXNlIGl0J3MKLQkgICBkZWZpbmVkIGJ5IHNoaWZ0cy1hbmQtYW5kcywgd2hpY2ggYXJlIGVxdWl2YWxlbnQgb24gYWxsCi0JICAgYnl0ZSBvcmRlcnMuICAqLwotCVBVVEJZVEUgKGFiZmQsIGluLT54X2NzZWN0Lnhfc210eXAsCWV4dC0+eF9jc2VjdC54X3NtdHlwKTsKLQlQVVRCWVRFIChhYmZkLCBpbi0+eF9jc2VjdC54X3NtY2xhcywJZXh0LT54X2NzZWN0Lnhfc21jbGFzKTsKLQlQVVRXT1JEIChhYmZkLCBpbi0+eF9jc2VjdC54X3N0YWIsCWV4dC0+eF9jc2VjdC54X3N0YWIpOwotCVBVVEhBTEYgKGFiZmQsIGluLT54X2NzZWN0Lnhfc25zdGFiLAlleHQtPnhfY3NlY3QueF9zbnN0YWIpOwotCWdvdG8gZW5kOwotICAgICAgfQotICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgY2FzZSBDX1NUQVQ6Ci0jaWZkZWYgQ19MRUFGU1RBVAotICBjYXNlIENfTEVBRlNUQVQ6Ci0jZW5kaWYKLSAgY2FzZSBDX0hJRERFTjoKLSAgICBpZiAodHlwZSA9PSBUX05VTEwpIHsKLSAgICAgIFBVVF9TQ05fU0NOTEVOKGFiZmQsIGluLT54X3Njbi54X3NjbmxlbiwgZXh0KTsKLSAgICAgIFBVVF9TQ05fTlJFTE9DKGFiZmQsIGluLT54X3Njbi54X25yZWxvYywgZXh0KTsKLSAgICAgIFBVVF9TQ05fTkxJTk5PKGFiZmQsIGluLT54X3Njbi54X25saW5ubywgZXh0KTsKLSAgICAgIGdvdG8gZW5kOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIFBVVFdPUkQoYWJmZCwgaW4tPnhfc3ltLnhfdGFnbmR4LmwsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSNpZm5kZWYgTk9fVFZORFgKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGluLT54X3N5bS54X3R2bmR4ICwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0jZW5kaWYKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIGV4dCk7Ci0gICAgICBQVVRfRkNOX0VORE5EWChhYmZkLCAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwsIGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmIERJTU5VTSAhPSBFX0RJTU5VTQotICNlcnJvciB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBESU1OVU0KLSNlbmRpZgotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10pOwotICAgIH0KLQotICBpZiAoSVNGQ04gKHR5cGUpKQotICAgIFBVVFdPUkQgKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9mc2l6ZSwKLQkgICAgIChiZmRfYnl0ZSAqKSAgZXh0LT54X3N5bS54X21pc2MueF9mc2l6ZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQVVRfTE5TWl9MTk5PIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8sIGV4dCk7Ci0gICAgICBQVVRfTE5TWl9TSVpFIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUsIGV4dCk7Ci0gICAgfQotCi1lbmQ6Ci0jaWZkZWYgQ09GRl9BREpVU1RfQVVYX09VVF9QT1NUCi0gIENPRkZfQURKVVNUX0FVWF9PVVRfUE9TVCAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKTsKLSNlbmRpZgotICByZXR1cm4gQVVYRVNaOwotfQotCi0jZW5kaWYgLyogTk9fQ09GRl9TWU1CT0xTICovCi0KLSNpZm5kZWYgTk9fQ09GRl9MSU5FTk9TCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgZXh0MTsKLSAgICAgUFRSIGluMTsKLXsKLSAgTElORU5PICpleHQgPSAoTElORU5PICopZXh0MTsKLSAgc3RydWN0IGludGVybmFsX2xpbmVubyAgICAgICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICopaW4xOwotCi0gIGluLT5sX2FkZHIubF9zeW1uZHggPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+bF9hZGRyLmxfc3ltbmR4KTsKLSAgaW4tPmxfbG5ubyA9IEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgaW5wLCBvdXRwKQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbnA7Ci0gICAgIFBUUglvdXRwOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICopaW5wOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICpleHQgPSAoc3RydWN0IGV4dGVybmFsX2xpbmVubyAqKW91dHA7Ci0gIFBVVFdPUkQoYWJmZCwgaW4tPmxfYWRkci5sX3N5bW5keCwgKGJmZF9ieXRlICopCi0JICBleHQtPmxfYWRkci5sX3N5bW5keCk7Ci0KLSAgUFVUX0xJTkVOT19MTk5PIChhYmZkLCBpbi0+bF9sbm5vLCBleHQpOwotICByZXR1cm4gTElORVNaOwotfQotCi0jZW5kaWYgLyogTk9fQ09GRl9MSU5FTk9TICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfYW91dGhkcl9pbiAoYWJmZCwgYW91dGhkcl9leHQxLCBhb3V0aGRyX2ludDEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgYW91dGhkcl9leHQxOwotICAgICBQVFIgYW91dGhkcl9pbnQxOwotewotICBBT1VUSERSICAgICAgICAqYW91dGhkcl9leHQgPSAoQU9VVEhEUiAqKSBhb3V0aGRyX2V4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICphb3V0aGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWFvdXRoZHJfaW50MTsKLQotICBhb3V0aGRyX2ludC0+bWFnaWMgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5tYWdpYyk7Ci0gIGFvdXRoZHJfaW50LT52c3RhbXAgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT52c3RhbXApOwotICBhb3V0aGRyX2ludC0+dHNpemUgPQotICAgIEdFVF9BT1VUSERSX1RTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRzaXplKTsKLSAgYW91dGhkcl9pbnQtPmRzaXplID0KLSAgICBHRVRfQU9VVEhEUl9EU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5kc2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5ic2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfQlNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+YnNpemUpOwotICBhb3V0aGRyX2ludC0+ZW50cnkgPQotICAgIEdFVF9BT1VUSERSX0VOVFJZIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmVudHJ5KTsKLSAgYW91dGhkcl9pbnQtPnRleHRfc3RhcnQgPQotICAgIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dGV4dF9zdGFydCk7Ci0gIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ID0KLSAgICBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmRhdGFfc3RhcnQpOwotCi0jaWZkZWYgSTk2MAotICBhb3V0aGRyX2ludC0+dGFnZW50cmllcyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRhZ2VudHJpZXMpOwotI2VuZGlmCi0KLSNpZmRlZiBBUE9MTE9fTTY4Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+b19pbmxpYiwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5vX2lubGliKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW50LT5vX3NyaSwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5vX3NyaSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+dmlkWzBdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnZpZCk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+dmlkWzFdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnZpZCArIDQpOwotI2VuZGlmCi0KLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBhb3V0aGRyX2ludC0+b190b2MgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPm9fdG9jKTsKLSAgYW91dGhkcl9pbnQtPm9fc25lbnRyeSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbmVudHJ5KTsKLSAgYW91dGhkcl9pbnQtPm9fc250ZXh0ID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NudGV4dCk7Ci0gIGFvdXRoZHJfaW50LT5vX3NuZGF0YSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbmRhdGEpOwotICBhb3V0aGRyX2ludC0+b19zbnRvYyA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbnRvYyk7Ci0gIGFvdXRoZHJfaW50LT5vX3NubG9hZGVyID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NubG9hZGVyKTsKLSAgYW91dGhkcl9pbnQtPm9fc25ic3MgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc25ic3MpOwotICBhb3V0aGRyX2ludC0+b19hbGdudGV4dCA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19hbGdudGV4dCk7Ci0gIGFvdXRoZHJfaW50LT5vX2FsZ25kYXRhID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX2FsZ25kYXRhKTsKLSAgYW91dGhkcl9pbnQtPm9fbW9kdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19tb2R0eXBlKTsKLSAgYW91dGhkcl9pbnQtPm9fY3B1dHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19jcHV0eXBlKTsKLSAgYW91dGhkcl9pbnQtPm9fbWF4c3RhY2sgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPm9fbWF4c3RhY2spOwotICBhb3V0aGRyX2ludC0+b19tYXhkYXRhID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5vX21heGRhdGEpOwotI2VuZGlmCi0KLSNpZmRlZiBNSVBTRUNPRkYKLSAgYW91dGhkcl9pbnQtPmJzc19zdGFydCA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+YnNzX3N0YXJ0KTsKLSAgYW91dGhkcl9pbnQtPmdwX3ZhbHVlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5ncF92YWx1ZSk7Ci0gIGFvdXRoZHJfaW50LT5ncHJtYXNrID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5ncHJtYXNrKTsKLSAgYW91dGhkcl9pbnQtPmNwcm1hc2tbMF0gPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmNwcm1hc2tbMF0pOwotICBhb3V0aGRyX2ludC0+Y3BybWFza1sxXSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Y3BybWFza1sxXSk7Ci0gIGFvdXRoZHJfaW50LT5jcHJtYXNrWzJdID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5jcHJtYXNrWzJdKTsKLSAgYW91dGhkcl9pbnQtPmNwcm1hc2tbM10gPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmNwcm1hc2tbM10pOwotI2VuZGlmCi0KLSNpZmRlZiBBTFBIQUVDT0ZGCi0gIGFvdXRoZHJfaW50LT5ic3Nfc3RhcnQgPSBiZmRfaF9nZXRfNjQoYWJmZCwgYW91dGhkcl9leHQtPmJzc19zdGFydCk7Ci0gIGFvdXRoZHJfaW50LT5ncF92YWx1ZSA9IGJmZF9oX2dldF82NChhYmZkLCBhb3V0aGRyX2V4dC0+Z3BfdmFsdWUpOwotICBhb3V0aGRyX2ludC0+Z3BybWFzayA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Z3BybWFzayk7Ci0gIGFvdXRoZHJfaW50LT5mcHJtYXNrID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5mcHJtYXNrKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfYW91dGhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWluOwotICBBT1VUSERSICphb3V0aGRyX291dCA9IChBT1VUSERSICopb3V0OwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBhb3V0aGRyX2luLT5tYWdpYywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5tYWdpYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBhb3V0aGRyX2luLT52c3RhbXAsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+dnN0YW1wKTsKLSAgUFVUX0FPVVRIRFJfVFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPnRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnRzaXplKTsKLSAgUFVUX0FPVVRIRFJfRFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmRzaXplKTsKLSAgUFVUX0FPVVRIRFJfQlNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmJzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJzaXplKTsKLSAgUFVUX0FPVVRIRFJfRU5UUlkgKGFiZmQsIGFvdXRoZHJfaW4tPmVudHJ5LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmVudHJ5KTsKLSAgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVCAoYWJmZCwgYW91dGhkcl9pbi0+dGV4dF9zdGFydCwKLQkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT50ZXh0X3N0YXJ0KTsKLSAgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCAoYWJmZCwgYW91dGhkcl9pbi0+ZGF0YV9zdGFydCwKLQkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5kYXRhX3N0YXJ0KTsKLQotI2lmZGVmIEk5NjAKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPnRhZ2VudHJpZXMsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+dGFnZW50cmllcyk7Ci0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFvdXRoZHJfaW4tPm9fdG9jLCBhb3V0aGRyX291dC0+b190b2MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc25lbnRyeSwgYW91dGhkcl9vdXQtPm9fc25lbnRyeSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbnRleHQsIGFvdXRoZHJfb3V0LT5vX3NudGV4dCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbmRhdGEsIGFvdXRoZHJfb3V0LT5vX3NuZGF0YSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbnRvYywgYW91dGhkcl9vdXQtPm9fc250b2MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc25sb2FkZXIsIGFvdXRoZHJfb3V0LT5vX3NubG9hZGVyKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NuYnNzLCBhb3V0aGRyX291dC0+b19zbmJzcyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19hbGdudGV4dCwgYW91dGhkcl9vdXQtPm9fYWxnbnRleHQpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fYWxnbmRhdGEsIGFvdXRoZHJfb3V0LT5vX2FsZ25kYXRhKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX21vZHR5cGUsIGFvdXRoZHJfb3V0LT5vX21vZHR5cGUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fY3B1dHlwZSwgYW91dGhkcl9vdXQtPm9fY3B1dHlwZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgYW91dGhkcl9pbi0+b19tYXhzdGFjaywgYW91dGhkcl9vdXQtPm9fbWF4c3RhY2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFvdXRoZHJfaW4tPm9fbWF4ZGF0YSwgYW91dGhkcl9vdXQtPm9fbWF4ZGF0YSk7Ci0gIG1lbXNldCAoYW91dGhkcl9vdXQtPm9fcmVzdjIsIDAsIHNpemVvZiBhb3V0aGRyX291dC0+b19yZXN2Mik7Ci0jZW5kaWYKLQotI2lmZGVmIE1JUFNFQ09GRgotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+YnNzX3N0YXJ0LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJzc19zdGFydCk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5ncF92YWx1ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ncF92YWx1ZSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5ncHJtYXNrLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmdwcm1hc2spOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Y3BybWFza1swXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5jcHJtYXNrWzBdKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmNwcm1hc2tbMV0sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Y3BybWFza1sxXSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5jcHJtYXNrWzJdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmNwcm1hc2tbMl0pOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Y3BybWFza1szXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5jcHJtYXNrWzNdKTsKLSNlbmRpZgotCi0jaWZkZWYgQUxQSEFFQ09GRgotICAvKiBGSVhNRTogV2hhdCBkb2VzIGJsZHJldiBtZWFuPyAgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIChiZmRfdm1hKSAyLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJsZHJldik7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCAoYmZkX3ZtYSkgMCwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5wYWRkaW5nKTsKLSAgYmZkX2hfcHV0XzY0KGFiZmQsIGFvdXRoZHJfaW4tPmJzc19zdGFydCwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ic3Nfc3RhcnQpOwotICBiZmRfaF9wdXRfNjQoYWJmZCwgYW91dGhkcl9pbi0+Z3BfdmFsdWUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Z3BfdmFsdWUpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Z3BybWFzaywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ncHJtYXNrKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmZwcm1hc2ssIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+ZnBybWFzayk7Ci0jZW5kaWYKLQotICByZXR1cm4gQU9VVFNaOwotfQotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwgZXh0LCBpbikKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIGV4dDsKLSAgICAgUFRSCSAgICAgaW47Ci17Ci0gIFNDTkhEUiAqc2NuaGRyX2V4dCA9IChTQ05IRFIgKikgZXh0OwotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUFJFCi0gIENPRkZfQURKVVNUX1NDTkhEUl9JTl9QUkUgKGFiZmQsIGV4dCwgaW4pOwotI2VuZGlmCi0gIG1lbWNweShzY25oZHJfaW50LT5zX25hbWUsIHNjbmhkcl9leHQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICBzY25oZHJfaW50LT5zX3ZhZGRyID0KLSAgICBHRVRfU0NOSERSX1ZBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c192YWRkcik7Ci0gIHNjbmhkcl9pbnQtPnNfcGFkZHIgPQotICAgIEdFVF9TQ05IRFJfUEFERFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLSAgc2NuaGRyX2ludC0+c19zaXplID0KLSAgICBHRVRfU0NOSERSX1NJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotCi0gIHNjbmhkcl9pbnQtPnNfc2NucHRyID0KLSAgICBHRVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgc2NuaGRyX2ludC0+c19yZWxwdHIgPQotICAgIEdFVF9TQ05IRFJfUkVMUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19yZWxwdHIpOwotICBzY25oZHJfaW50LT5zX2xubm9wdHIgPQotICAgIEdFVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbG5ub3B0cik7Ci0gIHNjbmhkcl9pbnQtPnNfZmxhZ3MgPQotICAgIEdFVF9TQ05IRFJfRkxBR1MgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLSAgc2NuaGRyX2ludC0+c19ucmVsb2MgPQotICAgIEdFVF9TQ05IRFJfTlJFTE9DIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICBzY25oZHJfaW50LT5zX25sbm5vID0KLSAgICBHRVRfU0NOSERSX05MTk5PIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0jaWZkZWYgSTk2MAotICBzY25oZHJfaW50LT5zX2FsaWduID0KLSAgICBHRVRfU0NOSERSX0FMSUdOIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19hbGlnbik7Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVAotICBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVCAoYWJmZCwgZXh0LCBpbik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3Njbmhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKilpbjsKLSAgU0NOSERSICpzY25oZHJfZXh0ID0gKFNDTkhEUiAqKW91dDsKLSAgdW5zaWduZWQgaW50IHJldCA9IFNDTkhTWjsKLQotI2lmZGVmIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUFJFCi0gIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUFJFIChhYmZkLCBpbiwgb3V0KTsKLSNlbmRpZgotICBtZW1jcHkoc2NuaGRyX2V4dC0+c19uYW1lLCBzY25oZHJfaW50LT5zX25hbWUsIHNpemVvZihzY25oZHJfaW50LT5zX25hbWUpKTsKLQotICBQVVRfU0NOSERSX1ZBRERSIChhYmZkLCBzY25oZHJfaW50LT5zX3ZhZGRyLAotCQkgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfdmFkZHIpOwotCi0KLSAgUFVUX1NDTkhEUl9QQUREUiAoYWJmZCwgc2NuaGRyX2ludC0+c19wYWRkciwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLSAgUFVUX1NDTkhEUl9TSVpFIChhYmZkLCBzY25oZHJfaW50LT5zX3NpemUsCi0JCSAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotCi0gIFBVVF9TQ05IRFJfU0NOUFRSIChhYmZkLCBzY25oZHJfaW50LT5zX3NjbnB0ciwKLQkJICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zY25wdHIpOwotICBQVVRfU0NOSERSX1JFTFBUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19yZWxwdHIsCi0JCSAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcmVscHRyKTsKLSAgUFVUX1NDTkhEUl9MTk5PUFRSIChhYmZkLCBzY25oZHJfaW50LT5zX2xubm9wdHIsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2xubm9wdHIpOwotICBQVVRfU0NOSERSX0ZMQUdTIChhYmZkLCBzY25oZHJfaW50LT5zX2ZsYWdzLAotCQkgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfZmxhZ3MpOwotI2lmIGRlZmluZWQoTTg4KQotICBQVVRXT1JEKGFiZmQsIHNjbmhkcl9pbnQtPnNfbmxubm8sIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSAgUFVUV09SRChhYmZkLCBzY25oZHJfaW50LT5zX25yZWxvYywgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLSNlbHNlCi0gIGlmIChzY25oZHJfaW50LT5zX25sbm5vIDw9IDB4ZmZmZikKLSAgICBQVVRIQUxGKGFiZmQsIHNjbmhkcl9pbnQtPnNfbmxubm8sIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmW3NpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKSArIDFdOwotCi0gICAgICBtZW1jcHkgKGJ1Ziwgc2NuaGRyX2ludC0+c19uYW1lLCBzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICAgICAgYnVmW3NpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKV0gPSAnXDAnOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiB3YXJuaW5nOiAlczogbGluZSBudW1iZXIgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSBidWYsIHNjbmhkcl9pbnQtPnNfbmxubm8pOwotICAgICAgUFVUSEFMRiAoYWJmZCwgMHhmZmZmLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0gICAgfQotICBpZiAoc2NuaGRyX2ludC0+c19ucmVsb2MgPD0gMHhmZmZmKQotICAgIFBVVEhBTEYoYWJmZCwgc2NuaGRyX2ludC0+c19ucmVsb2MsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSkgKyAxXTsKLQotICAgICAgbWVtY3B5IChidWYsIHNjbmhkcl9pbnQtPnNfbmFtZSwgc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpKTsKLSAgICAgIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSldID0gJ1wwJzsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6ICVzOiByZWxvYyBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkgICAgIGJ1Ziwgc2NuaGRyX2ludC0+c19ucmVsb2MpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIFBVVEhBTEYgKGFiZmQsIDB4ZmZmZiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLSAgICAgIHJldCA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBJOTYwCi0gIFBVVF9TQ05IRFJfQUxJR04gKGFiZmQsIHNjbmhkcl9pbnQtPnNfYWxpZ24sIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2FsaWduKTsKLSNlbmRpZgotI2lmZGVmIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUE9TVAotICBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BPU1QgKGFiZmQsIGluLCBvdXQpOwotI2VuZGlmCi0gIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9iZmQvY29uZmlnLmJmZCBiL2JmZC9jb25maWcuYmZkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTU0ODNjLi4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWcuYmZkCisrKyAvZGV2L251bGwKQEAgLTEsNzY2ICswLDAgQEAKLSMgY29uZmlnLmJmZAotIyBDb252ZXJ0IGEgY2Fub25pY2FsIGhvc3QgdHlwZSBpbnRvIGEgQkZEIGhvc3QgdHlwZS4KLSMgU2V0IHNoZWxsIHZhcmlhYmxlIHRhcmcgdG8gY2Fub25pY2FsIHRhcmdldCBuYW1lLCBhbmQgcnVuCi0jIHVzaW5nIGBgLiBjb25maWcuYmZkJycuCi0jIFNldHMgdGhlIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXM6Ci0jICB0YXJnX2RlZnZlYwkJRGVmYXVsdCB2ZWN0b3IgZm9yIHRoaXMgdGFyZ2V0Ci0jICB0YXJnX3NlbHZlY3MJCVZlY3RvcnMgdG8gYnVpbGQgZm9yIHRoaXMgdGFyZ2V0Ci0jICB0YXJnX2FyY2hzCQlBcmNoaXRlY3R1cmVzIGZvciB0aGlzIHRhcmdldAotIyAgdGFyZ19jZmxhZ3MJCSQoQ0ZMQUdTKSBmb3IgdGhpcyB0YXJnZXQgKEZJWE1FOiBwcmV0dHkgYm9ndXMpCi0jICB0YXJnX3VuZGVyc2NvcmUJV2hldGhlciB1bmRlcnNjb3JlcyBhcmUgdXNlZDogeWVzIG9yIG5vCi0KLSMgUGFydCBvZiB0aGlzIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRhcmdtYXRjaC5zZWQgdG8gZ2VuZXJhdGUgdGhlCi0jIHRhcmdtYXRjaC5oIGZpbGUuICBUaGUgI2lmZGVmIGFuZCAjZW5kaWYgbGluZXMgdGhhdCBhcHBlYXIgYmVsb3cgYXJlCi0jIGNvcGllZCBkaXJlY3RseSBpbnRvIHRhcmdtYXRjaC5oLgotCi0jIFRoZSBiaW51dGlscyBjKytmaWx0IHByb2dyYW0gd2FudHMgdG8ga25vdyB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZQotIyBzdHJpcHBlZCBvciBub3QuICBUaGF0IGlzIHdoeSB3ZSBzZXQgdGFyZ191bmRlcnNjb3JlLiAgYysrZmlsdCB1c2VzCi0jIHRoaXMgaW5mb3JtYXRpb24gdG8gY2hvb3NlIGEgZGVmYXVsdC4gIFRoaXMgaW5mb3JtYXRpb24gaXMKLSMgZHVwbGljYXRlZCBpbiB0aGUgc3ltYm9sX2xlYWRpbmdfY2hhciBmaWVsZCBvZiB0aGUgQkZEIHRhcmdldAotIyB2ZWN0b3IsIGJ1dCBjKytmaWx0IGRvZXMgbm90IGRlYWwgd2l0aCBvYmplY3QgZmlsZXMgYW5kIGlzIG5vdAotIyBsaW5rZWQgYWdhaW5zdCBsaWJiZmQuYS4gIEl0IGlzIG5vdCB0ZXJyaWJseSBpbXBvcnRhbnQgdGhhdCBjKytmaWx0Ci0jIGdldCB0aGlzIHJpZ2h0OyBpdCBpcyBqdXN0IGNvbnZlbmllbnQuCi0KLXRhcmdfZGVmdmVjPQotdGFyZ19zZWx2ZWNzPQotdGFyZ19jZmxhZ3M9Ci10YXJnX3VuZGVyc2NvcmU9bm8KLQotdGFyZ19jcHU9YGVjaG8gJHRhcmcgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotY2FzZSAiJHt0YXJnX2NwdX0iIGluCi1hbHBoYSopIHRhcmdfYXJjaHM9YmZkX2FscGhhX2FyY2ggOzsKLWFybSopCXRhcmdfYXJjaHM9YmZkX2FybV9hcmNoIDs7Ci1zdHJvbmdhcm0qKSB0YXJnX2FyY2hzPWJmZF9hcm1fYXJjaCA7OwotdGh1bWIqKQl0YXJnX2FyY2hzPWJmZF9hcm1fYXJjaCA7OwotYzMwKikJdGFyZ19hcmNocz1iZmRfdGljMzBfYXJjaCA7OwotaHBwYSopCXRhcmdfYXJjaHM9YmZkX2hwcGFfYXJjaCA7OwotaVszNDU2XTg2KSB0YXJnX2FyY2hzPWJmZF9pMzg2X2FyY2ggOzsKLW02OCopCXRhcmdfYXJjaHM9YmZkX202OGtfYXJjaCA7OwotbTg4KikJdGFyZ19hcmNocz1iZmRfbTg4a19hcmNoIDs7Ci1taXBzKikJdGFyZ19hcmNocz1iZmRfbWlwc19hcmNoIDs7Ci1waiopCXRhcmdfYXJjaHM9ImJmZF9wal9hcmNoIGJmZF9pMzg2X2FyY2giOzsKLXBvd2VycGMqKSB0YXJnX2FyY2hzPSJiZmRfcnM2MDAwX2FyY2ggYmZkX3Bvd2VycGNfYXJjaCIgOzsKLXJzNjAwMCkJdGFyZ19hcmNocz0iYmZkX3JzNjAwMF9hcmNoIGJmZF9wb3dlcnBjX2FyY2giIDs7Ci1zcGFyYyopIHRhcmdfYXJjaHM9YmZkX3NwYXJjX2FyY2ggOzsKLXY4NTAqKQl0YXJnX2FyY2hzPWJmZF92ODUwX2FyY2ggOzsKLXo4ayopCXRhcmdfYXJjaHM9YmZkX3o4a19hcmNoIDs7Ci0qKQl0YXJnX2FyY2hzPWJmZF8ke3RhcmdfY3B1fV9hcmNoIDs7Ci1lc2FjCi0KLQotIyBXSEVOIEFERElORyBFTlRSSUVTIFRPIFRISVMgTUFUUklYOgotIyAgTWFrZSBzdXJlIHRoYXQgdGhlIGxlZnQgc2lkZSBhbHdheXMgaGFzIHR3byBkYXNoZXMuICBPdGhlcndpc2UgeW91Ci0jICBjYW4gZ2V0IHNwdXJpb3VzIG1hdGNoZXMuICBFdmVuIGZvciB1bmFtYmlndW91cyBjYXNlcywgZG8gdGhpcyBhcyBhCi0jICBjb252ZW50aW9uLCBlbHNlIHRoZSB0YWJsZSBiZWNvbWVzIGEgcmVhbCBtZXNzIHRvIHVuZGVyc3RhbmQgYW5kIG1haW50YWluLgotCi1jYXNlICIke3Rhcmd9IiBpbgotIyBTVEFSVCBPRiB0YXJnbWF0Y2guaAotI2lmZGVmIEJGRDY0Ci0gIGFscGhhKi0qLW5ldGJzZCogfCBhbHBoYSotKi1mcmVlYnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmNjRfYWxwaGFfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLW5ldHdhcmUqKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1ubG0zMl9hbHBoYV92ZWMKLSAgICA7OwotICBhbHBoYSotKi1saW51eGVjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZmFscGhhX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjY0X2FscGhhX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLWxpbnV4LWdudSogfCBhbHBoYSotKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9hbHBoYV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCi0gICAgOzsKLSAgYWxwaGEqLSotKnZtcyopCi0gICAgdGFyZ19kZWZ2ZWM9dm1zX2FscGhhX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCi0gICAgOzsKLSNlbmRpZiAvKiBCRkQ2NCAqLwotCi0gIGFyYy0qLWVsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FyY192ZWMKLSAgICA7OwotCi0gIGFybS0qLW5ldGJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YXJtbmV0YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBhcm0tKi1yaXNjaXgqKQotICAgIHRhcmdfZGVmdmVjPXJpc2NpeF92ZWMKLSAgICA7OwotICBhcm0tZXBvYy1wZSopCi0gICAgdGFyZ19kZWZ2ZWM9YXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYyBhcm1fZXBvY19wZV9iaWdfdmVjIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjIGFybV9lcG9jX3BlaV9iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT1ubwotICAgIDs7Ci0gIGFybS0qLXBlKikKLSAgICB0YXJnX2RlZnZlYz1hcm1wZV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJhcm1wZV9saXR0bGVfdmVjIGFybXBlX2JpZ192ZWMgYXJtcGVpX2xpdHRsZV92ZWMgYXJtcGVpX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGFybS0qLWFvdXQgfCBhcm1lbC0qLWFvdXQpCQotICAgIHRhcmdfZGVmdmVjPWFvdXRfYXJtX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YW91dF9hcm1fYmlnX3ZlYwotICAgIDs7Ci0gIGFybWViLSotYW91dCkKLSAgICB0YXJnX2RlZnZlYz1hb3V0X2FybV9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWFvdXRfYXJtX2xpdHRsZV92ZWMKLSAgICA7OwotICBhcm0tKi1jb2ZmKQotICAgIHRhcmdfZGVmdmVjPWFybWNvZmZfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1hcm1jb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgYXJtLSotZWxmIHwgYXJtKi0qLWxpbnV4LWdudSkKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX3ZlYwotICAgIDs7Ci0gIGFybS0qLW9hYmkpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjCi0gICAgOzsKLQotICB0aHVtYi0qLWNvZmYpCi0gICAgdGFyZ19kZWZ2ZWM9YXJtY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWFybWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICB0aHVtYi0qLW9hYmkpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjCi0gICAgOzsKLSAgdGh1bWItKi1lbGYpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FybV92ZWMKLSAgICA7OwotICB0aHVtYi1lcG9jLXBlKikKLSAgICB0YXJnX2RlZnZlYz1hcm1fZXBvY19wZV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJhcm1fZXBvY19wZV9saXR0bGVfdmVjIGFybV9lcG9jX3BlX2JpZ192ZWMgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMgYXJtX2Vwb2NfcGVpX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPW5vCi0gICAgOzsKLSAgdGh1bWItKi1wZSopCi0gICAgdGFyZ19kZWZ2ZWM9YXJtcGVfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYXJtcGVfbGl0dGxlX3ZlYyBhcm1wZV9iaWdfdmVjIGFybXBlaV9saXR0bGVfdmVjIGFybXBlaV9iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzdHJvbmdhcm0tKi1lbGYpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FybV92ZWMKLSAgICA7OwotICBzdHJvbmdhcm0tKi1jb2ZmKQotICAgIHRhcmdfZGVmdmVjPWFybWNvZmZfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1hcm1jb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBhMjlrLSotZWJtb24qIHwgYTI5ay0qLXVkaSogfCBhMjlrLSotY29mZiogfCBhMjlrLSotc3ltMSogfCBcCi0gIGEyOWstKi12eHdvcmtzKiB8IGEyOWstKi1zeXN2KikKLSAgICB0YXJnX2RlZnZlYz1hMjlrY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgYTI5ay0qLWFvdXQqIHwgYTI5ay0qLWJzZCogfCBhMjlrLSotdnN0YSopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIGMzMC0qLSphb3V0KiB8IHRpYzMwLSotKmFvdXQqKQotICAgIHRhcmdfZGVmdmVjPXRpYzMwX2FvdXRfdmVjCi0gICAgOzsKLSAgYzMwLSotKmNvZmYqIHwgdGljMzAtKi0qY29mZiopCi0gICAgdGFyZ19kZWZ2ZWM9dGljMzBfY29mZl92ZWMKLSAgICA7OwotCi0gIGQxMHYtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9kMTB2X3ZlYwotICAgIDs7Ci0KLSAgZDMwdi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2QzMHZfdmVjCi0gICAgOzsKLQotICBmcjMwLSotZWxmKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9mcjMwX3ZlYwotICAgIDs7Ci0KLQotICBoODMwMCotKi0qKQotICAgIHRhcmdfZGVmdmVjPWg4MzAwY29mZl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBoODUwMC0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9aDg1MDBjb2ZmX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIGhwcGEqLSotKmVsZiogfCBocHBhKi0qLWxpbnV4LWdudSogfCBocHBhKi0qLWxpdGVzKiB8IGhwcGEqLSotc3lzdjQqIHwgaHBwYSotKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2hwcGFfdmVjCi0gICAgOzsKLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFCU0QpIHx8IGRlZmluZWQgKEhPU1RfSFBQQU9TRikgfHwgZGVmaW5lZCAoSE9TVF9IUFBBTVBFSVgpCi0gIGhwcGEqLSotYnNkKikKLSAgICB0YXJnX2RlZnZlYz1zb21fdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9ocHBhX3ZlYwotICAgIDs7Ci0gIGhwcGEqLSotaHB1eCogfCBocHBhKi0qLWhpdXgqIHwgaHBwYSotKi1tcGVpeCopCi0gICAgdGFyZ19kZWZ2ZWM9c29tX3ZlYwotICAgIDs7Ci0gIGhwcGEqLSotb3NmKikKLSAgICB0YXJnX2RlZnZlYz1zb21fdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9ocHBhX3ZlYwotICAgIDs7Ci0jZW5kaWYgLyogZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpICovCi0KLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqY29mZikKLSAgICB0YXJnX2RlZnZlYz1pMzg2Y29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc3lzdjQqIHwgaVszNDU2XTg2LSotdW5peHdhcmUqIHwgaVszNDU2XTg2LSotc29sYXJpczIqIHwgXAotICBpWzM0NTZdODYtKi1lbGYgfCBpWzM0NTZdODYtKi1zY28zLjJ2NSogfCBcCi0gIGlbMzQ1Nl04Ni0qLWRndXgqIHwgaVszNDU2XTg2LSotc3lzdjUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1ydGVtc2VsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpMzg2Y29mZl92ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqIHwgaVszNDU2XSotKi1nbzMyKiB8IGlbMzQ1Nl04Ni1nbzMyLXJ0ZW1zKiApCi0gICAgdGFyZ19kZWZ2ZWM9Z28zMmNvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJnbzMyc3R1YmJlZGNvZmZfdmVjIGkzODZhb3V0X3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zeXN2KiB8IGlbMzQ1Nl04Ni0qLWlzYyogfCBpWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotY29mZiB8IFwKLSAgaVszNDU2XTg2LSotYWl4KikKLSAgICB0YXJnX2RlZnZlYz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYqLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPWkzODZjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2kzODZfdmVjIGkzODZhb3V0X3ZlYyIKLSAgICA7OwotIGlbMzQ1Nl04Ni1zZXF1ZW50LWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmR5bml4X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1ic2QqKQotICAgIHRhcmdfZGVmdmVjPWkzODZic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWZyZWVic2Rhb3V0KiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2RbMTJdLiogfCBcCi0gIGlbMzQ1Nl04Ni0qLWZyZWVic2RbMTJdKQotICAgIHRhcmdfZGVmdmVjPWkzODZmcmVlYnNkX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1mcmVlYnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aTM4NmNvZmZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbmV0YnNkKiB8IGlbMzQ1Nl04Ni0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPWkzODZuZXRic2RfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW5ldHdhcmUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibmxtMzJfaTM4Nl92ZWMgaTM4NmNvZmZfdmVjIGkzODZhb3V0X3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1saW51eCphb3V0KikKLSAgICB0YXJnX2RlZnZlYz1pMzg2bGludXhfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1saW51eC1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2bGludXhfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbHlueG9zKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2bHlueF9jb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2bHlueF9hb3V0X3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbWFjaCogfCBpWzM0NTZdODYtKi1vc2YxbWsqKQotICAgIHRhcmdfZGVmdmVjPWkzODZtYWNoM192ZWMKLSAgICB0YXJnX2NmbGFncz0tRFNUQVRfRk9SX0VYRUMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaVszNDU2XTg2LSotb3M5aykKLSAgICB0YXJnX2RlZnZlYz1pMzg2b3M5a192ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1tc2RvcyopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmFvdXRfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZtc2Rvc192ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1tb3NzKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImkzODZtc2Rvc192ZWMgaTM4NmFvdXRfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWJlb3NwZSopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NnBlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NnBlX3ZlYyBpMzg2cGVpX3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1iZW9zZWxmKiB8IGlbMzQ1Nl04Ni0qLWJlb3MqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NnBlX3ZlYyBpMzg2cGVpX3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1pbnRlcml4KikKLSAgICB0YXJnX2RlZnZlYz1pMzg2cGVpX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NnBlX3ZlYyIKLSAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBldmVudHVhbGx5IGJlIGNoZWNrZWQgYXQgcnVudGltZS4KLSAgICB0YXJnX2NmbGFncz0tRFNUUklDVF9QRV9GT1JNQVQKLSAgICA7OwotICBpWzM0NTZdODYtKi1taW5ndzMyKiB8IGlbMzQ1Nl04Ni0qLWN5Z3dpbiogfCBpWzM0NTZdODYtKi13aW5udCB8IGlbMzQ1Nl04Ni0qLXBlKQotICAgIHRhcmdfZGVmdmVjPWkzODZwZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImkzODZwZV92ZWMgaTM4NnBlaV92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LW5vbmUtKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2Y29mZl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1hb3V0KiB8IGlbMzQ1Nl04NiotKi12c3RhKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2YW91dF92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi12eHdvcmtzKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2YW91dF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBpODYwLSotbWFjaDMqIHwgaTg2MC0qLW9zZjEqIHwgaTg2MC0qLWNvZmYqKQotICAgIHRhcmdfZGVmdmVjPWk4NjBjb2ZmX3ZlYwotICAgIDs7Ci0gIGk4NjAtKi1zeXN2NCogfCBpODYwLSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTg2MF92ZWMKLSAgICA7OwotCi0gIGk5NjAtKi12eHdvcmtzNCogfCBpOTYwLSotdnh3b3JrczUuMCkKLSAgICB0YXJnX2RlZnZlYz1iX291dF92ZWNfbGl0dGxlX2hvc3QKLSAgICB0YXJnX3NlbHZlY3M9ImJfb3V0X3ZlY19iaWdfaG9zdCBpY29mZl9saXR0bGVfdmVjIGljb2ZmX2JpZ192ZWMgaWVlZV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGk5NjAtKi12eHdvcmtzNS4qIHwgaTk2MC0qLWNvZmYqIHwgaTk2MC0qLXN5c3YqIHwgaTk2MC0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1pY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpY29mZl9iaWdfdmVjIGJfb3V0X3ZlY19saXR0bGVfaG9zdCBiX291dF92ZWNfYmlnX2hvc3QgaWVlZV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGk5NjAtKi12eHdvcmtzKiB8IGk5NjAtKi1hb3V0KiB8IGk5NjAtKi1ib3V0KiB8IGk5NjAtKi1uaW5keSopCi0gICAgdGFyZ19kZWZ2ZWM9Yl9vdXRfdmVjX2xpdHRsZV9ob3N0Ci0gICAgdGFyZ19zZWx2ZWNzPSJiX291dF92ZWNfYmlnX2hvc3QgaWNvZmZfbGl0dGxlX3ZlYyBpY29mZl9iaWdfdmVjIGllZWVfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpOTYwLSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTk2MF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Imljb2ZmX2xpdHRsZV92ZWMgaWNvZmZfYmlnX3ZlYyIKLSAgICA7OwotCi0gIG0zMnItKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tMzJyX3ZlYwotICAgIDs7Ci0KLSAgbTY4Ki1hcG9sbG8tKikKLSAgICB0YXJnX2RlZnZlYz1hcG9sbG9jb2ZmX3ZlYwotICAgIDs7Ci0gIG02OCotYnVsbC1zeXN2KikKLSAgICB0YXJnX2RlZnZlYz1tNjhrY29mZnVuX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLW1vdG9yb2xhLXN5c3YqKQotICAgIHRhcmdfZGVmdmVjPW02OGtzeXN2Y29mZl92ZWMKLSAgICA7OwotICBtNjgqLWhwLWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9aHAzMDBic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1hb3V0KikKLSAgICB0YXJnX2RlZnZlYz1hb3V0MF9iaWdfdmVjCi0gICAgIyBXZSBpbmNsdWRlIGNpc2NvX2NvcmVfYmlnX3ZlYyBoZXJlLCByYXRoZXIgdGhhbiBtYWtpbmcgYSBzZXBhcmF0ZSBjaXNjbwotICAgICMgY29uZmlndXJhdGlvbiwgc28gdGhhdCBjaXNjby1jb3JlLmMgZ2V0cyByb3V0aW5lbHkgdGVzdGVkIGF0Ci0gICAgIyBsZWFzdCBmb3IgY29tcGlsYXRpb24uCi0gICAgdGFyZ19zZWx2ZWNzPSJjaXNjb19jb3JlX2JpZ192ZWMgaWVlZV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1lbGYqIHwgbTY4Ki0qLXN5c3Y0KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtjb2ZmX3ZlYyBpZWVlX3ZlYyIKLSAgICA7OwotICBtNjgqLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPW02OGtjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4a2NvZmZfdmVjIHZlcnNhZG9zX3ZlYyBpZWVlX3ZlYyBhb3V0MF9iaWdfdmVjIgotICAgIDs7Ci0gIG02OCotKi1jb2ZmKiB8IG02OCotKi1zeXN2KikKLSAgICB0YXJnX2RlZnZlYz1tNjhrY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtjb2ZmX3ZlYyB2ZXJzYWRvc192ZWMgaWVlZV92ZWMiCi0gICAgOzsKLSAgbTY4Ki0qLWhwdXgqKQotICAgIHRhcmdfZGVmdmVjPWhwMzAwaHB1eF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki0qLWxpbnV4KmFvdXQqKQotICAgIHRhcmdfZGVmdmVjPW02OGtsaW51eF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1saW51eC1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1tNjhrbGludXhfdmVjCi0gICAgOzsKLSAgbTY4Ki0qLWdudSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgIyB0YXJnX3NlbHZlY3M9bTY4a21hY2gzX3ZlYwotICAgICMgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCi0gICAgOzsKLSAgbTY4Ki0qLWx5bnhvcyopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2x5bnhfY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9bTY4a2x5bnhfYW91dF92ZWMKLSAgICA7OwotICBtNjgqLWhwKi1uZXRic2QqKQotICAgIHRhcmdfZGVmdmVjPW02OGs0a25ldGJzZF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtuZXRic2RfdmVjIGhwMzAwYnNkX3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLSotbmV0YnNkKiB8IG02OCotKi1vcGVuYnNkKikKLSAgICB0YXJnX2RlZnZlYz1tNjhrbmV0YnNkX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4azRrbmV0YnNkX3ZlYyBocDMwMGJzZF92ZWMgc3Vub3NfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki0qLXN1bm9zKiB8IG02OCotKi1vczY4ayogfCBtNjgqLSotdnh3b3JrcyogfCBtNjgqLW5ldHgtKiB8IFwKLSAgbTY4Ki0qLWJzZCogfCBtNjgqLSotdnN0YSopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLWVyaWNzc29uLSopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibTY4a2NvZmZfdmVjIHZlcnNhZG9zX3ZlYyB0ZWtoZXhfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLWNibS0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1tNjhrY29mZl92ZWMKLSAgICA7OwotICBtNjgqLWFwcGxlLWF1eCopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2F1eF9jb2ZmX3ZlYwotICAgIDs7Ci0gIG02OCotKi1wc29zKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICB0YXJnX3NlbHZlY3M9aWVlZV92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBtODgqLWhhcnJpcy1jeHV4KiB8IG04OCotKi1kZ3V4KiB8IG04OCotKi1zeXN2NCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX204OGtfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPW04OGtiY3NfdmVjCi0gICAgOzsKLSAgbTg4Ki0qLW1hY2gzKikKLSAgICB0YXJnX2RlZnZlYz1tODhrbWFjaDNfdmVjCi0gICAgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCi0gICAgOzsKLSAgbTg4Ki0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9bTg4a2Jjc192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBtY29yZS0qLWVsZikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWNvcmUtKi1wZSkKLSAgICB0YXJnX2RlZnZlYz1tY29yZV9wZV9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJtY29yZV9wZV9iaWdfdmVjIG1jb3JlX3BlX2xpdHRsZV92ZWMgbWNvcmVfcGVpX2JpZ192ZWMgbWNvcmVfcGVpX2xpdHRsZV92ZWMiCi0gICAgOzsKLQotICBtaXBzKi1iaWctKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzLWRlYy1uZXRic2QqIHwgbWlwcyplbCotKi1uZXRic2QqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2JpZ21pcHNfdmVjIGVjb2ZmX2xpdHRsZV92ZWMgZWNvZmZfYmlnX3ZlYyIKLSAgICA7OwotIG1pcHMqLSotbmV0YnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWlwcyotZGVjLWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9taXBzX2xpdHRsZV92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbWlwcyotZGVjLW1hY2gzKikKLSAgICB0YXJnX2RlZnZlYz1hb3V0X21pcHNfbGl0dGxlX3ZlYwotICAgIHRhcmdfY2ZsYWdzPS1EU1RBVF9GT1JfRVhFQwotICAgIDs7Ci0gIG1pcHMqLWRlYy0qIHwgbWlwcyplbC0qLWVjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2JpZ192ZWMKLSAgICA7OwotICBtaXBzKi0qLWVjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzKi0qLWlyaXg2KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotaXJpeDUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9iaWdtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjIGVjb2ZmX2JpZ192ZWMgZWNvZmZfbGl0dGxlX3ZlYyIKLSAgICA7OwotICBtaXBzKi1zZ2ktKiB8IG1pcHMqLSotYnNkKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzKi0qLWxuZXdzKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdsaXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJlY29mZl9saXR0bGVfdmVjIGVjb2ZmX2JpZ192ZWMiCi0gICAgOzsKLSAgbWlwcyotKi1tYWNoMyopCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9taXBzX2xpdHRsZV92ZWMKLSAgICB0YXJnX2NmbGFncz0tRFNUQVRfRk9SX0VYRUMKLSAgICA7OwotICBtaXBzKi0qLXN5c3Y0KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWlwcyotKi1zeXN2KiB8IG1pcHMqLSotcmlzY29zKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKLSAgICA7OwotICBtaXBzKmVsLSotZWxmKiB8IG1pcHMqZWwtKi1ydGVtcyogfCBtaXBzKmVsLSotdnh3b3JrcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLWVsZiogfCBtaXBzKi0qLXJ0ZW1zKiB8IG1pcHMqLSotdnh3b3JrcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLW5vbmUpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKmVsKi0qLWxpbnV4LWdudSogfCBtaXBzKmVsKi0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMgZWNvZmZfbGl0dGxlX3ZlYyBlY29mZl9iaWdfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotbGludXgtZ251KiB8IG1pcHMqLSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLQotICBtbjEwMjAwLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbW4xMDIwMF92ZWMKLSAgICA7OwotCi0gIG1uMTAzMDAtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tbjEwMzAwX3ZlYwotICAgIDs7Ci0KLSAgbnMzMmstcGM1MzItbWFjaCogfCBuczMyay1wYzUzMi11eCopCi0gICAgdGFyZ19kZWZ2ZWM9cGM1MzJtYWNoYW91dF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbnMzMmstKi1uZXRic2QqIHwgbnMzMmstKi1saXRlcyogfCBuczMyay0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPXBjNTMybmV0YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIHBqLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcGpfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfcGpfdmVjIGJmZF9lbGYzMl9wamxfdmVjIgotICAgIDs7Ci0KLSAgcGpsLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcGpsX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX3BqbF92ZWMgYmZkX2VsZjMyX3BqX3ZlYyBiZmRfZWxmMzJfaTM4Nl92ZWMiCi0gICAgOzsKLQotICBwb3dlcnBjLSotYWl4KiB8IHBvd2VycGMtKi1iZW9zKikKLSAgICB0YXJnX2RlZnZlYz1yczYwMDBjb2ZmX3ZlYwotICAgIDs7Ci0gIHBvd2VycGMtKi0qYnNkKiB8IHBvd2VycGMtKi1lbGYqIHwgcG93ZXJwYy0qLXN5c3Y0KiB8IHBvd2VycGMtKi1lYWJpKiB8IFwKLSAgcG93ZXJwYy0qLXNvbGFyaXMyKiB8IHBvd2VycGMtKi1saW51eC1nbnUqIHwgcG93ZXJwYy0qLXJ0ZW1zKiB8IFwKLSAgcG93ZXJwYy0qLXZ4d29ya3MqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9wb3dlcnBjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0icnM2MDAwY29mZl92ZWMgYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMgcHBjYm9vdF92ZWMiCi0gICAgOzsKLSAgcG93ZXJwYy0qLW1hY29zKiB8IHBvd2VycGMtKi1tcHcqKQotICAgIHRhcmdfZGVmdmVjPXBtYWNfeGNvZmZfdmVjCi0gICAgOzsKLSAgcG93ZXJwYy0qLW5ldHdhcmUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9wb3dlcnBjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibmxtMzJfcG93ZXJwY192ZWMgcnM2MDAwY29mZl92ZWMiCi0gICAgOzsKLSAgcG93ZXJwY2xlLSotZWxmKiB8IHBvd2VycGNsZS0qLXN5c3Y0KiB8IHBvd2VycGNsZS0qLWVhYmkqIHwgXAotICBwb3dlcnBjbGUtKi1zb2xhcmlzMiogfCBwb3dlcnBjbGUtKi1saW51eC1nbnUqIHwgcG93ZXJwY2xlLSotdnh3b3JrcyogfFwKLSAgcG93ZXJwY2xlLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJyczYwMDBjb2ZmX3ZlYyBiZmRfZWxmMzJfcG93ZXJwY192ZWMgcHBjYm9vdF92ZWMiCi0gICAgOzsKLQotICBwb3dlcnBjbGUtKi1wZSB8IHBvd2VycGNsZS0qLXdpbm50KiB8IHBvd2VycGNsZS0qLWN5Z3dpbiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX3Bvd2VycGNsZV9wZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9wb3dlcnBjbGVfcGVpX3ZlYyBiZmRfcG93ZXJwY19wZWlfdmVjIGJmZF9wb3dlcnBjbGVfcGVfdmVjIGJmZF9wb3dlcnBjX3BlX3ZlYyIKLSAgICA7OwotCi0gIHJzNjAwMC0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9cnM2MDAwY29mZl92ZWMKLSAgICA7OwotCi0gIHNoLSotZWxmKiB8IHNoLSotcnRlbXNlbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zaF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9zaGxfdmVjIHNoY29mZl92ZWMgc2hsY29mZl92ZWMgc2hjb2ZmX3NtYWxsX3ZlYyBzaGxjb2ZmX3NtYWxsX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc2gtKi0qIHwgc2gtKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9c2hjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ic2hjb2ZmX3ZlYyBzaGxjb2ZmX3ZlYyBzaGNvZmZfc21hbGxfdmVjIHNobGNvZmZfc21hbGxfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIHNwYXJjbGV0LSotYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1zcGFyY2xlX2FvdXRfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjODZ4LSotYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyY2xpdGUtKi1lbGYqIHwgc3BhcmM4NngtKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICA7OwotICBzcGFyYy0qLWxpbnV4KmFvdXQqKQotICAgIHRhcmdfZGVmdmVjPXNwYXJjbGludXhfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfc3BhcmNfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjLSotbGludXgtZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJzcGFyY2xpbnV4X3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIDs7Ci0gIHNwYXJjLSotbHlueG9zKikKLSAgICB0YXJnX2RlZnZlYz1zcGFyY2x5bnhfY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9c3BhcmNseW54X2FvdXRfdmVjCi0gICAgOzsKLSAgc3BhcmMtKi1uZXRic2QqIHwgc3BhcmMtKi1vcGVuYnNkKikKLSAgICB0YXJnX2RlZnZlYz1zcGFyY25ldGJzZF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc3BhcmMtKi1lbGYqIHwgc3BhcmMtKi1zb2xhcmlzMiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1zdW5vc19iaWdfdmVjCi0gICAgOzsKLSAgc3BhcmMtKi1zeXN2NCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIDs7Ci0gIHNwYXJjLSotbmV0d2FyZSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibmxtMzJfc3BhcmNfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgOzsKLSNpZmRlZiBCRkQ2NAotICBzcGFyYzY0LSotYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyYzY0LSotbGludXgtZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmNjRfc3BhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfc3BhcmNfdmVjIHNwYXJjbGludXhfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgOzsKLSAgc3BhcmM2NC0qLWVsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjY0X3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgOzsgICAgCi0jZW5kaWYgLyogQkZENjQgKi8KLSAgc3BhcmMqLSotY29mZiopCi0gICAgdGFyZ19kZWZ2ZWM9c3BhcmNjb2ZmX3ZlYwotICAgIDs7Ci0gIHNwYXJjKi0qLSogfCBzcGFyYyotKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0jaWYgSEFWRV9ob3N0X2FvdXRfdmVjCi0gIHRhaG9lLSotKikKLSAgICB0YXJnX2RlZnZlYz1ob3N0X2FvdXRfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0jZW5kaWYKLQotICB0aWM4MCotKi0qKQotICAgIHRhcmdfZGVmdmVjPXRpYzgwY29mZl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotCi0gIHY4NTAtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl92ODUwX3ZlYwotICAgIDs7Ci0gIHY4NTBlLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfdjg1MF92ZWMKLSAgICA7OwotICB2ODUwZWEtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl92ODUwX3ZlYwotICAgIDs7Ci0jaWYgSEFWRV9ob3N0X2FvdXRfdmVjCi0gIHZheC0qLWJzZCogfCB2YXgtKi11bHRyaXgqKQotICAgIHRhcmdfZGVmdmVjPWhvc3RfYW91dF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSNlbmRpZgotCi0gIHZheCotKi0qdm1zKikKLSAgICB0YXJnX2RlZnZlYz12bXNfdmF4X3ZlYwotICAgIDs7Ci0KLSAgd2UzMmstKi0qKQotICAgIHRhcmdfZGVmdmVjPXdlMzJrY29mZl92ZWMKLSAgICA7OwotCi0gIHc2NS0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9dzY1X3ZlYwotICAgIDs7Ci0KLSAgejhrKi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9ejhrY29mZl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICAqLSotaWVlZSopCi0gICAgdGFyZ19kZWZ2ZWM9aWVlZV92ZWMKLSAgICA7OwotCi0gICotYWRvYmUtKikKLSAgICB0YXJnX2RlZnZlYz1hX291dF9hZG9iZV92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICAqLXNvbnktKikKLSAgICB0YXJnX2RlZnZlYz1uZXdzb3MzX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gICotdGFuZGVtLSopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2NvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWllZWVfdmVjCi0gICAgOzsKLSMgRU5EIE9GIHRhcmdtYXRjaC5oCi0gICopCi0gICAgZWNobyAxPiYyICIqKiogQkZEIGRvZXMgbm90IHN1cHBvcnQgdGFyZ2V0ICR7dGFyZ30uIgotICAgIGVjaG8gMT4mMiAiKioqIExvb2sgaW4gYmZkL2NvbmZpZy5iZmQgZm9yIHN1cHBvcnRlZCB0YXJnZXRzLiIKLSAgICBleGl0IDEKLSAgICA7OwotZXNhYwotCi0jIElmIHdlIHN1cHBvcnQgYW55IEVMRiB0YXJnZXQsIHRoZW4gYXV0b21hdGljYWxseSBhZGQgc3VwcG9ydCBmb3IgdGhlCi0jIGdlbmVyaWMgRUxGIHRhcmdldHMuICBUaGlzIHBlcm1pdHMgYW4gb2JqZHVtcCB3aXRoIHNvbWUgRUxGIHN1cHBvcnQKLSMgdG8gYmUgdXNlZCBvbiBhbiBhcmJpdHJhcnkgRUxGIGZpbGUgZm9yIGFueXRoaW5nIG90aGVyIHRoYW4KLSMgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLWNhc2UgIiR7dGFyZ19kZWZ2ZWN9ICR7dGFyZ19zZWx2ZWNzfSIgaW4KLSAgKmJmZF9lbGY2NCopCi0gICAgdGFyZ19zZWx2ZWNzPSIke3Rhcmdfc2VsdmVjc30gYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYyBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjIGJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMgYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYyIKLSAgICA7OwotICAqYmZkX2VsZjMyKikKLSAgICB0YXJnX3NlbHZlY3M9IiR7dGFyZ19zZWx2ZWNzfSBiZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMiCi0gICAgOzsKLWVzYWMKZGlmZiAtLWdpdCBhL2JmZC9jb25maWcuaW4gYi9iZmQvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmIyYzc4Li4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvdGltZS5oPiBhbmQgPHRpbWUuaD4uICAqLwotI3VuZGVmIFRJTUVfV0lUSF9TWVNfVElNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmY250bCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9GQ05UTAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZkb3BlbiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9GRE9QRU4KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Z2lkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVEdJRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0dWlkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFVJRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1hZHZpc2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUFEVklTRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1wcm90ZWN0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01QUk9URUNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0aXRpbWVyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVElUSU1FUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c2NvbmYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1lTQ09ORgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxkaXJlbnQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRElSRU5UX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRkNOVExfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxuZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGRlZi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERERUZfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0RJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19GSUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL25kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX05ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Byb2Nmcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUFJPQ0ZTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIFVzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICovCi0jdW5kZWYgVVNFX0JJTkFSWV9GT1BFTgotCi0vKiBEZWZpbmUgaWYgc3Ryc3RyIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi0KLS8qIERlZmluZSBpZiBtYWxsb2MgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLQotLyogRGVmaW5lIGlmIHJlYWxsb2MgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DCi0KLS8qIERlZmluZSBpZiBmcmVlIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotCi0vKiBEZWZpbmUgaWYgZ2V0ZW52IGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fR0VURU5WCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHJzdGF0dXNfdC4gKi8KLSN1bmRlZiBIQVZFX1BSU1RBVFVTX1QKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwcnN0YXR1c190LnByX3doby4gKi8KLSN1bmRlZiBIQVZFX1BSU1RBVFVTX1RfUFJfV0hPCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHN0YXR1c190LiAqLwotI3VuZGVmIEhBVkVfUFNUQVRVU19UCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHJwc2luZm9fdC4gKi8KLSN1bmRlZiBIQVZFX1BSUFNJTkZPX1QKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwc2luZm9fdC4gKi8KLSN1bmRlZiBIQVZFX1BTSU5GT19UCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgbHdwc3RhdHVzX3QuICovCi0jdW5kZWYgSEFWRV9MV1BTVEFUVVNfVAotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIGx3cHN0YXR1c190LnByX2NvbnRleHQuICovCi0jdW5kZWYgSEFWRV9MV1BTVEFUVVNfVF9QUl9DT05URVhUCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgbHdwc3RhdHVzX3QucHJfcmVnLiAqLwotI3VuZGVmIEhBVkVfTFdQU1RBVFVTX1RfUFJfUkVHCi0KLS8qIE5hbWUgb2YgaG9zdCBzcGVjaWZpYyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIHRyYWQtY29yZS5jLiAqLwotI3VuZGVmIFRSQURfSEVBREVSCi0KLS8qIFVzZSBtbWFwIGlmIGl0J3MgYXZhaWxhYmxlPyAqLwotI3VuZGVmIFVTRV9NTUFQCi0KZGlmZiAtLWdpdCBhL2JmZC9jb25maWd1cmUgYi9iZmQvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZGMzMTZkLi4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw2MzU3ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLTY0LWJpdC1iZmQgICAgIDY0LWJpdCBzdXBwb3J0IChvbiBob3N0cyB3aXRoIG5hcnJvd2VyIHdvcmQgc2l6ZXMpIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLW1tYXAgICAgICAgICAgICAgdHJ5IHVzaW5nIG1tYXAgZm9yIEJGRCBpbnB1dCBmaWxlcyBpZiBhdmFpbGFibGUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPWxpYmJmZC5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYwOTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MzA6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0ODogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjczOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc4NjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgNzk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgzMzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODQyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg2MTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg5MzogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTI2OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk3OTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDM2OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1iZmQKLQotVkVSU0lPTj0yLjkuNQotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0IiAxPiYyOyBleGl0IDE7IH0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLUVPRgotCi0KLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwODI6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA5NTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTA4OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b21ha2UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPTUFLRT1hdXRvbWFrZQotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPTUFLRT0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b21ha2UiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEyMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTM0OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiICYmIGFjX2N2X3Byb2dfQVI9ImFyIgotZmkKLWZpCi1BUj0iJGFjX2N2X3Byb2dfQVIiCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE4OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIyMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgUkFOTElCPSI6IgotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPW5vCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMyNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzY2OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzOTA6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM5MzogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0Mjk6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0NDU6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDgzOiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTQ2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTUwOiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NDg6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY2MDogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotcm0gLXJmIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjg2OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTcyMiAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTcyMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQ0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTc0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3Nzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODExOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4NDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSJhcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIEFTPSJmYWxzZSIKLWZpCi1maQotCi0KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotICBuZWVkX2xvY2tzPSRlbmFibGV2YWwKLWVsc2UKLSAgbmVlZF9sb2Nrcz15ZXMKLWZpCi0KLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTY0LWJpdC1iZmQgb3IgLS1kaXNhYmxlLTY0LWJpdC1iZmQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfNjRfYml0X2JmZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfNjRfYml0X2JmZCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpICB3YW50NjQ9dHJ1ZSAgOzsKLSAgbm8pICAgd2FudDY0PWZhbHNlIDs7Ci0gICopICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgNjQtYml0LWJmZCBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZWxzZQotICB3YW50NjQ9ZmFsc2UKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tbW9uYmZkbGliIG9yIC0tZGlzYWJsZS1jb21tb25iZmRsaWIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY29tbW9uYmZkbGliK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21tb25iZmRsaWIiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbW1hcCBvciAtLXdpdGhvdXQtbW1hcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbW1hcCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9tbWFwIgotICBjYXNlICIke3dpdGh2YWx9IiBpbgotICB5ZXMpICB3YW50X21tYXA9dHJ1ZSA7OwotICBubykgICB3YW50X21tYXA9ZmFsc2UgOzsKLSAgKikgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgQkZEIHdpdGgtbW1hcCBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZWxzZQotICB3YW50X21tYXA9ZmFsc2UKLWZpCi0KLQotCi0KLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDc5OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKLSAgCi0KLWlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEwMjogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjEwNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjExODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEzNTogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE0NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTY2OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi1ob3N0NjQ9ZmFsc2UKLXRhcmdldDY0PWZhbHNlCi0KLSMgaG9zdCBzdHVmZjoKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjA1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjM1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI4NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMxODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMjMyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM2MDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNjU6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM5MzogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDI3OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0NDg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0NjU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0ODI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1MDc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI1MjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTU1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU4NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjExOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY2NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjg2OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzAwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcyNjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjczMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzU5OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3OTQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4MDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODI3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4MzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4OTI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjkyMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjkyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5Nzc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAyOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwMzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA2ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTIxOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI5NzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMzMDc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzM3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzOTQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzOTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQyMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDU2OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0NjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ4OTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTA5OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1Mjg6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUzODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1NTU6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU2MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU2NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTgzOiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2MDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MTg6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzYyMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2MzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjU4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjkyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3MjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NDc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzgzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4MTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4MjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODU1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg4OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5MjU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMTU6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwNDM6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwNDggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA1MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLSMgUGVybWl0IGhvc3Qgc3BlY2lmaWMgc2V0dGluZ3MuCi0uICR7c3JjZGlyfS9jb25maWd1cmUuaG9zdAotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDEzMTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi1CRkRfSE9TVF82NEJJVF9MT05HPTAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEPTAKLUJGRF9IT1NUXzY0X0JJVD0KLUJGRF9IT1NUX1VfNjRfQklUPQotaWYgdGVzdCAieCR7SE9TVF82NEJJVF9UWVBFfSIgPSAieGxvbmciOyB0aGVuCi0gIEJGRF9IT1NUXzY0QklUX0xPTkc9MQotZWxpZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiAhPSAieCI7IHRoZW4KLSAgQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MQotICBCRkRfSE9TVF82NF9CSVQ9JHtIT1NUXzY0QklUX1RZUEV9Ci0gIEJGRF9IT1NUX1VfNjRfQklUPSR7SE9TVF9VXzY0QklUX1RZUEV9Ci1maQotCi0KLQotCi0KLSMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgLXogIiRDQ19GT1JfQlVJTEQiOyB0aGVuCi0gIGlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gICAgQ0NfRk9SX0JVSUxEPSckKENDKScKLSAgZWxzZQotICAgIENDX0ZPUl9CVUlMRD1nY2MKLSAgZmkKLWZpCi0KLSMgQWxzbyBzZXQgRVhFRVhUX0ZPUl9CVUlMRC4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIEVYRUVYVF9GT1JfQlVJTEQ9JyQoRVhFRVhUKScKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDIxNDogY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2J1aWxkX2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICAgICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LmMKLSAgICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD0KLSAgICAgJHtDQ19GT1JfQlVJTER9IC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgMT4mNSAyPiY1Ci0gICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICAqKSBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgICBlc2FjCi0gICAgIGRvbmUKLSAgICAgcm0gLWYgY29uZnRlc3QqCi0gICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ubwotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfYnVpbGRfZXhlZXh0IiAxPiY2Ci0gIEVYRUVYVF9GT1JfQlVJTEQ9IiIKLSAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KLWZpCi0KLQotZm9yIGFjX2hkciBpbiBzdGRkZWYuaCBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdGltZS5oIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI0MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyNDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQyNTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfaGRyIGluIGZjbnRsLmggc3lzL2ZpbGUuaCBzeXMvdGltZS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI4MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyODcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQyOTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDMxOTogY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl90aW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDMyNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci1pbnQgbWFpbigpIHsKLXN0cnVjdCB0bSAqdHA7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDMzMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl90aW1lPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfdGltZT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfdGltZSIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3RpbWUgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCi1FT0YKLQotZmkKLQotYWNfaGVhZGVyX2RpcmVudD1ubwotZm9yIGFjX2hkciBpbiBkaXJlbnQuaCBzeXMvbmRpci5oIHN5cy9kaXIuaCBuZGlyLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzNTg6IGNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzYzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDwkYWNfaGRyPgotaW50IG1haW4oKSB7Ci1ESVIgKmRpcnAgPSAwOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzNzE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfZGlyZW50XyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSBhY19oZWFkZXJfZGlyZW50PSRhY19oZHI7IGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLSMgVHdvIHZlcnNpb25zIG9mIG9wZW5kaXIgZXQgYWwuIGFyZSBpbiAtbGRpciBhbmQgLWx4IG9uIFNDTyBYZW5peC4KLWlmIHRlc3QgJGFjX2hlYWRlcl9kaXJlbnQgPSBkaXJlbnQuaDsgdGhlbgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWxkaXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzOTY6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGlyJ18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkaXIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQwNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbGRpciIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0Mzc6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHgnXydvcGVuZGlyIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbHggICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQ0NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDU2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbHgiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZmkKLQotZm9yIGFjX2Z1bmMgaW4gZmNudGwgZ2V0cGFnZXNpemUgc2V0aXRpbWVyIHN5c2NvbmYgZmRvcGVuIGdldHVpZCBnZXRnaWQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0ODE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0ODYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDUwOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotbXNkb3MqIHwgKi0qLWdvMzIqIHwgKi0qLW1pbmd3MzIqIHwgKi0qLWN5Z3dpbiogfCAqLSotd2luZG93cyopCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOIDEKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1NDQ6IGNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTQ5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHN0cnN0cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1NzA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU1RSU1RSIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTkxOiBjaGVja2luZyB3aGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDU5NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBtYWxsb2MKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjE3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX01BTExPQyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciByZWFsbG9jIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2Mzg6IGNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ2NDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgcmVhbGxvYwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NjQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2MiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0Njg1OiBjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjkwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGZyZWUKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzExOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWU9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUkVFIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzMyOiBjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDczNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBnZXRlbnYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzU4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52IiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52ID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOViAxCi1FT0YKLQotZmkKLQotCi0jIElmIHdlIGFyZSBjb25maWd1cmVkIG5hdGl2ZSwgcGljayBhIGNvcmUgZmlsZSBzdXBwb3J0IGZpbGUuCi1DT1JFRklMRT0KLUNPUkVGTEFHPQotVFJBRF9IRUFERVI9Ci1pZiB0ZXN0ICIke3RhcmdldH0iID0gIiR7aG9zdH0iOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0gIGFscGhhKi0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9hbHBoYWxpbnV4LmgiJwotCTs7Ci0gIGFscGhhKi0qLW5ldGJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIGFscGhhKi0qLSopCQlDT1JFRklMRT1vc2YtY29yZS5sbyA7OwotICBhcm0tKi1yaXNjaXgpCQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaHBwYSotKi1ocHV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotaGl1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLW1wZWl4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotYnNkKikJCUNPUkVGSUxFPSJocHV4LWNvcmUubG8gaHBwYWJzZC1jb3JlLmxvIgotCQkJQ09SRUZMQUc9Ii1ESFBVWF9DT1JFIC1ESFBQQUJTRF9DT1JFIiA7OwotICBpWzM0NTZdODYtc2VxdWVudC1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbzsKLQlUUkFEX0hFQURFUj0nImhvc3RzL3N5bW1ldHJ5LmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3Y0KikgOzsKLSAgaVszNDU2XTg2LXNlcXVlbnQtc3lzdiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKLQk7OwotICBpWzM0NTZdODYtKi1ic2QqIHwgaVszNDU2XTg2LSotZnJlZWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2YnNkLmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLW5ldGJzZCogfCBpWzM0NTZdODYtKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIGlbMzQ1Nl04Ni1lc2l4LXN5c3YzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2VzaXguaCInCi0JOzsKLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqKQotCUNPUkVGSUxFPXNjbzUtY29yZS5sbwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLXNjbyogfCBpWzM0NTZdODYtKi1pc2MqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NnNjby5oIicKLQk7OwotICBpWzM0NTZdODYtKi1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bWFjaDMuaCInCi0JOzsKLSAgaVszNDU2XTg2LSotbGludXgtZ251KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZsaW51eC5oIicKLQk7OwotICBpWzM0NTZdODYtKi1pc2MqKQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaVszNDU2XTg2LSotYWl4KikJQ09SRUZJTEU9YWl4Mzg2LWNvcmUubG8gOzsKLSAgaTg2MC0qLW1hY2gzKiB8IGk4NjAtKi1vc2YxKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2k4NjBtYWNoMy5oIicKLQk7OwotICBtaXBzLWRlYy1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc2JzZC5oIicKLQk7OwotICBtaXBzLWRlYy1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzbWFjaDMuaCInCi0JOzsKLSAgbWlwcy0qLW5ldGJzZCogfCBtaXBzKi0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgbWlwcy1kZWMtKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RlY3N0YXRpb24uaCInCi0JOzsKLSAgbWlwcy1zZ2ktaXJpeDQqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy1zZ2ktaXJpeDUqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy1zZ2ktaXJpeDYqKQlDT1JFRklMRT1pcml4LWNvcmUubG8gOzsKLSAgbWlwcy0qLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNtYWNoMy5oIicKLQk7OwotICBtaXBzLSotc3lzdjQqKQk7OwotICBtaXBzLSotc3lzdiogfCBtaXBzLSotcmlzY29zKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3Jpc2Nvcy5oIicKLQk7OwotICBtaXBzLXNvbnktYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL25ld3MtbWlwcy5oIicKLQk7OwotICBtNjgqLWJ1bGwqLXN5c3YqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZHB4Mi5oIicKLQk7OwotICBtNjgqLWhwLWhwdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgbTY4Ki1ocC1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaHAzMDBic2QuaCInCi0JOzsKLSAgbTY4Ki0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tNjhrbGludXguaCInCi0JOzsKLSAgbTY4Ki1tb3Rvcm9sYS1zeXN2KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RlbHRhNjguaCInCi0JOzsKLSAgbTY4Ki1zb255LSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9uZXdzLmgiJwotCTs7Ci0gIG02OCotKi1uZXRic2QqIHwgbTY4Ki0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgbTY4Ki1hcHBsZS1hdXgqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTY4a2F1eC5oIicKLQk7OwotICBtODgqLSotc3lzdjQqKQk7OwotICBtODgqLW1vdG9yb2xhLXN5c3YqKQlDT1JFRklMRT1wdHJhY2UtY29yZS5sbyA7OwotICBtODgqLSotbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTg4a21hY2gzLmgiJwotCTs7Ci0gIG5zMzJrLXBjNTMyLW1hY2gpCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9wYzUzMm1hY2guaCInCi0JOzsKLSAgbnMzMmstKi1uZXRic2QqIHwgbnMzMmstKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIHJzNjAwMC0qLWx5bngqKQlDT1JFRklMRT1seW54LWNvcmUubG8gOzsKLSAgcnM2MDAwLSotYWl4NCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHJzNjAwMC0qLSopCQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotKmJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1haXg0KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLWFpeCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1iZW9zKikJOzsKLSAgcG93ZXJwYy0qLW5ldGJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIHNwYXJjLSotbmV0YnNkKiB8IHNwYXJjLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICB0YWhvZS0qLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy90YWhvZS5oIicKLQk7OwotICB2YXgtKi11bHRyaXgyKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheHVsdDIuaCInCi0JOzsKLSAgdmF4LSotdWx0cml4KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheHVsdDIuaCInCi0JOzsKLSAgdmF4LSotKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3ZheGJzZC5oIicKLQk7OwotICBlc2FjCi0KLSAgY2FzZSAiJENPUkVGSUxFIiBpbgotICBhaXgzODYtY29yZS5sbykJQ09SRUZMQUc9LURBSVgzODZfQ09SRSA7OwotICBocHBhYnNkLWNvcmUubG8pCUNPUkVGTEFHPS1ESFBQQUJTRF9DT1JFIDs7Ci0gIGhwdXgtY29yZS5sbykJCUNPUkVGTEFHPS1ESFBVWF9DT1JFIDs7Ci0gIGlyaXgtY29yZS5sbykJCUNPUkVGTEFHPS1ESVJJWF9DT1JFIDs7Ci0gIGx5bngtY29yZS5sbykJCUNPUkVGTEFHPS1ETFlOWF9DT1JFIDs7Ci0gIG5ldGJzZC1jb3JlLmxvKQlDT1JFRkxBRz0tRE5FVEJTRF9DT1JFIDs7Ci0gIG9zZi1jb3JlLmxvKQkJQ09SRUZMQUc9LURPU0ZfQ09SRSA7OwotICBwdHJhY2UtY29yZS5sbykJQ09SRUZMQUc9LURQVFJBQ0VfQ09SRSA7OwotICByczYwMDAtY29yZS5sbykJQ09SRUZMQUc9IiRDT1JFRkxBRyAtREFJWF9DT1JFIiA7OwotICBzY281LWNvcmUubG8pCQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EU0NPNV9DT1JFIiA7OwotICB0cmFkLWNvcmUubG8pCQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EVFJBRF9DT1JFIiA7OwotICBlc2FjCi0KLSAgIyBFTEYgY29yZWZpbGUgc3VwcG9ydCBoYXMgc2V2ZXJhbCBmbGF2b3JzLCBidXQgYWxsIG9mCi0gICMgdGhlbSB1c2Ugc29tZXRoaW5nIGNhbGxlZCA8c3lzL3Byb2Nmcy5oPgotICBmb3IgYWNfaGRyIGluIHN5cy9wcm9jZnMuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5NTk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0OTY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTY5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5OTc6IGNoZWNraW5nIGZvciBwcnN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTAwMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1wcnN0YXR1c190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDA5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3RhdHVzX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUFJTVEFUVVNfVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByc3RhdHVzX3QucHJfd2hvIGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTAzMTogY2hlY2tpbmcgZm9yIHByc3RhdHVzX3QucHJfd2hvIGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDM2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXByc3RhdHVzX3QgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIucHJfd2hvCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA0MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG89eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG89bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8gPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BSU1RBVFVTX1RfUFJfV0hPIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfcHJzdGF0dXNfdF9wcl93aG8iIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDY1OiBjaGVja2luZyBmb3IgcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDcwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXBzdGF0dXNfdCBhdmFyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA3NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc3RhdHVzX3QgPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BTVEFUVVNfVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJwc2luZm9fdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwOTk6IGNoZWNraW5nIGZvciBwcnBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTEwNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1wcnBzaW5mb190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTExOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycHNpbmZvX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUFJQU0lORk9fVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTEzMzogY2hlY2tpbmcgZm9yIHBzaW5mb190IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUxMzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotcHNpbmZvX3QgYXZhcgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxNDU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzaW5mb190ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9QU0lORk9fVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3QiIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsd3BzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUxNjc6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MTcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLWx3cHN0YXR1c190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTc5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BzdGF0dXNfdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTFdQU1RBVFVTX1QgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QucHJfY29udGV4dCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUyMDE6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdC5wcl9jb250ZXh0IGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUyMDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotbHdwc3RhdHVzX3QgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIucHJfY29udGV4dAotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyMTM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX2NvbnRleHQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9jb250ZXh0ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MV1BTVEFUVVNfVF9QUl9DT05URVhUIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGx3cHN0YXR1c190LnByX3JlZyBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUyMzU6IGNoZWNraW5nIGZvciBsd3BzdGF0dXNfdC5wcl9yZWcgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MjQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLWx3cHN0YXR1c190IGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLnByX3JlZwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyNDc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX3JlZz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWc9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfcmVnID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MV1BTVEFUVVNfVF9QUl9SRUcgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWciIDE+JjYKLQotICBmaQotZmkKLQotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUUkFEX0hFQURFUiAkVFJBRF9IRUFERVIKLUVPRgotCi0KLSMgSG9ycmlibGUgaGFja3MgdG8gYnVpbGQgRExMcyBvbiBXaW5kb3dzLgotV0lOMzJMREZMQUdTPQotV0lOMzJMSUJBREQ9Ci1jYXNlICIke2hvc3R9IiBpbgotKi0qLWN5Z3dpbiopCi0gIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCi0gICAgV0lOMzJMREZMQUdTPSItbm8tdW5kZWZpbmVkIgotICAgIFdJTjMyTElCQUREPSItTGBwd2RgLy4uL2xpYmliZXJ0eSAtbGliZXJ0eSAtTGBwd2RgLy4uL2ludGwgLWxpbnRsIC1sY3lnd2luIC1sa2VybmVsMzIiCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLQotCi0jIHRhcmdldCBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotZGVmdmVjPQotc2VsdmVjcz0KLXNlbGFyY2hzPQotVERFRklORVM9Ci1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCI7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvY29uZmlnLmJmZAotCWlmIHRlc3QgIngkdGFyZyIgPSAieCR0YXJnZXQiOyB0aGVuCi0JICAgIGRlZnZlYz0kdGFyZ19kZWZ2ZWMKLQlmaQotCXNlbHZlY3M9IiRzZWx2ZWNzICR0YXJnX2RlZnZlYyAkdGFyZ19zZWx2ZWNzIgotCXNlbGFyY2hzPSIkc2VsYXJjaHMgJHRhcmdfYXJjaHMiCi0JVERFRklORVM9IiRUREVGSU5FUyAkdGFyZ19jZmxhZ3MiCi0gICAgZmkKLWRvbmUKLQotCi0jIFRoaXMgcHJvY2Vzc2luZyBzdGlsbCBuZWVkcyB0byBiZSBkb25lIGlmIHdlJ3JlIHRvIGRlY2lkZSBwcm9wZXJseSB3aGV0aGVyCi0jIDY0LWJpdCBzdXBwb3J0IG5lZWRzIHRvIGJlIGNvbXBpbGVkIGluLiAgQ3VycmVudGx5LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGlmCi0jIHRoZSBkZWZhdWx0IG9yIGFueSBvdGhlciBleHBsaWNpdGx5IHJlcXVlc3RlZCB0YXJnZXQgcmVxdWlyZXMgaXQ7IGl0Ci0jIHdpbGwgbm90IGJlIGluY2x1ZGVkIG9uIGEgMzItYml0IGhvc3QgaWYgbm8gNjQtYml0IHRhcmdldCBpcyByZXF1ZXN0ZWQsIGFuZAotIyBubyAiLS13aXRoLTY0LWJpdC1iZmQiIG9wdGlvbiBpcyBnaXZlbiwgZXZlbiBpZiAiLS1lbmFibGUtdGFyZ2V0cz1hbGwiIGlzCi0jIHVzZWQuCi0KLSMgdW5pcSB0aGUgZGVmYXVsdCBhbmQgc2VsZWN0ZWQgdmVjdG9ycyBpbiBhbGwgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cy4KLWY9IiIKLWZvciBpIGluICRzZWx2ZWNzIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXNlbHZlY3M9IiRmIgotCi0KLSMgdW5pcSB0aGUgYXJjaGl0ZWN0dXJlcyBpbiBhbGwgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cy4KLWY9IiIKLWZvciBpIGluICRzZWxhcmNocyA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi1zZWxhcmNocz0iJGYiCi0KLSMgVGFyZ2V0IGJhY2tlbmQgLm8gZmlsZXMuCi10Yj0KLQotZWxmPSJlbGYubG8gZWxmbGluay5sbyBkd2FyZjIubG8gZHdhcmYxLmxvIgotCi1mb3IgdmVjIGluICRzZWx2ZWNzCi1kbwotICAgIGNhc2UgIiR2ZWMiIGluCi0gICAgIyBUaGlzIGxpc3QgaXMgYWxwaGFiZXRpemVkIHRvIG1ha2UgaXQgZWFzeSB0byBjb21wYXJlCi0gICAgIyB3aXRoIHRoZSB0d28gdmVjdG9yIGxpc3RzIGluIHRhcmdldHMuYy4KLSAgICBhMjlrY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWEyOWsubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgYV9vdXRfYWRvYmVfdmVjKQkJdGI9IiR0YiBhb3V0LWFkb2JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhcm1jb2ZmX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIGNvZmYtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1jb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1uZXRic2RfdmVjKQkJdGI9IiR0YiBhcm1uZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFybXBlX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIHBlLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlX2JpZ192ZWMpCQl0Yj0iJHRiIHBlLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlaV9saXR0bGVfdmVjKQkJdGI9IiR0YiBwZWktYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVpX2JpZ192ZWMpCQl0Yj0iJHRiIHBlaS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVwb2MtcGUtYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVwb2MtcGVpLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlaV9iaWdfdmVjKQl0Yj0iJHRiIGVwb2MtcGVpLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFvdXQwX2JpZ192ZWMpCQl0Yj0iJHRiIGFvdXQwLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X2FybV9iaWdfdmVjKQkJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9hcm1fbGl0dGxlX3ZlYykJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9taXBzX2JpZ192ZWMpCQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfbWlwc19saXR0bGVfdmVjKQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFwb2xsb2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWFwb2xsby5sbyIgOzsKLSAgICBiX291dF92ZWNfYmlnX2hvc3QpCQl0Yj0iJHRiIGJvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGJfb3V0X3ZlY19saXR0bGVfaG9zdCkJdGI9IiR0YiBib3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYWxwaGFfdmVjKQl0Yj0iJHRiIGVsZjY0LWFscGhhLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYykgdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYykJdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjMyLWdlbi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdtaXBzX3ZlYykgCXRiPSIkdGIgZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYmlnbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX2QxMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMTB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2QzMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMzB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2ZyMzBfdmVjKQkJdGI9IiR0YiBlbGYzMi1mcjMwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2hwcGFfdmVjKQkJdGI9IiR0YiBlbGYzMi1ocHBhLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2kzODZfdmVjKQkJdGI9IiR0YiBlbGYzMi1pMzg2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k4NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pODYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k5NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pOTYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGYzMi1nZW4ubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjKSAJdGI9IiR0YiBlbGY2NC1taXBzLmxvIGVsZjY0LmxvIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9tMzJyX3ZlYykJCXRiPSIkdGIgZWxmMzItbTMyci5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tNjhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTY4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tODhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTg4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjKQl0Yj0iJHRiIGVsZjMyLW1jb3JlLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZWxmMzItbWNvcmUubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbW4xMDIwMF92ZWMpCXRiPSIkdGIgZWxmLW0xMDIwMC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tbjEwMzAwX3ZlYykJdGI9IiR0YiBlbGYtbTEwMzAwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3BqX3ZlYykgICAgICAgICAgIHRiPSIkdGIgZWxmMzItcGoubG8gZWxmMzIubG8gJGVsZiI7OwotICAgIGJmZF9lbGYzMl9wamxfdmVjKSAgICAgICAgICB0Yj0iJHRiIGVsZjMyLXBqLmxvIGVsZjMyLmxvICRlbGYiOzsKLSAgICBiZmRfZWxmMzJfcG93ZXJwY192ZWMpCXRiPSIkdGIgZWxmMzItcHBjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMpCXRiPSIkdGIgZWxmMzItcHBjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3NoX3ZlYykJCXRiPSIkdGIgZWxmMzItc2gubG8gZWxmMzIubG8gJGVsZiBjb2ZmLXNoLmxvIiA7OwotICAgIGJmZF9lbGYzMl9zaGxfdmVjKQkJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8iIDs7Ci0gICAgYmZkX2VsZjMyX3NwYXJjX3ZlYykJdGI9IiR0YiBlbGYzMi1zcGFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl92ODUwX3ZlYykJCXRiPSIkdGIgZWxmMzItdjg1MC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGY2NF9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjY0LWdlbi5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmNjRfbGl0dGxlX2dlbmVyaWNfdmVjKSB0Yj0iJHRiIGVsZjY0LWdlbi5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmNjRfc3BhcmNfdmVjKQl0Yj0iJHRiIGVsZjY0LXNwYXJjLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGNpc2NvX2NvcmVfYmlnX3ZlYykJCXRiPSIkdGIgY2lzY28tY29yZS5sbyIgOzsKLSAgICBjaXNjb19jb3JlX2xpdHRsZV92ZWMpCXRiPSIkdGIgY2lzY28tY29yZS5sbyIgOzsKLSAgICBkZW1vXzY0X3ZlYykJCXRiPSIkdGIgZGVtbzY0LmxvIGFvdXQ2NC5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgZWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmX2JpZ2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZmFscGhhX2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1hbHBoYS5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGdvMzJjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1nbzMyLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGdvMzJzdHViYmVkY29mZl92ZWMpCXRiPSIkdGIgY29mZi1zdGdvMzIubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaDgzMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1oODMwMC5sbyByZWxvYzE2LmxvIiA7OwotICAgIGg4NTAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaDg1MDAubG8gcmVsb2MxNi5sbyIgOzsKLSAgICBob3N0X2FvdXRfdmVjKQkJdGI9IiR0YiBob3N0LWFvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwYnNkX3ZlYykJCXRiPSIkdGIgaHAzMDBic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwaHB1eF92ZWMpCQl0Yj0iJHRiIGhwMzAwaHB1eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmFvdXRfdmVjKQkJdGI9IiR0YiBpMzg2YW91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmJzZF92ZWMpCQl0Yj0iJHRiIGkzODZic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pMzg2LmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZkeW5peF92ZWMpCQl0Yj0iJHRiIGkzODZkeW5peC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmZyZWVic2RfdmVjKQkJdGI9IiR0YiBpMzg2ZnJlZWJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm1zZG9zX3ZlYykJCXRiPSIkdGIgaTM4Nm1zZG9zLmxvIiA7OwotICAgIGkzODZwZV92ZWMpCQkJdGI9IiR0YiBwZS1pMzg2LmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpMzg2cGVpX3ZlYykJCXRiPSIkdGIgcGVpLWkzODYubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZsaW51eF92ZWMpCQl0Yj0iJHRiIGkzODZsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nmx5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIGkzODZseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nmx5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLWkzODZseW54LmxvIGNvZmZsaW5rLmxvIGx5bngtY29yZS5sbyIgOzsKLSAgICBpMzg2bWFjaDNfdmVjKQkJdGI9IiR0YiBpMzg2bWFjaDMubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZuZXRic2RfdmVjKQkJdGI9IiR0YiBpMzg2bmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2b3M5a192ZWMpCQl0Yj0iJHRiIGkzODZvczlrLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpODYwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaTg2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1pOTYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGllZWVfdmVjKQkJCXRiPSIkdGIgaWVlZS5sbyIgOzsKLSAgICBtNjhrY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrY29mZnVuX3ZlYykJCXRiPSIkdGIgY29mZi11NjhrLmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrbGludXhfdmVjKQkJdGI9IiR0YiBtNjhrbGludXgubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGtseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBtNjhrbHlueC5sbyBseW54LWNvcmUubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGtseW54X2NvZmZfdmVjKQkJdGI9IiR0YiBjZi1tNjhrbHlueC5sbyBjb2ZmLW02OGsubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIG02OGtuZXRic2RfdmVjKQkJdGI9IiR0YiBtNjhrbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBtNjhrNGtuZXRic2RfdmVjKQkJdGI9IiR0YiBtNjhrNGtuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGthdXhfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtYXV4LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrc3lzdmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXN2bTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtODhrYmNzX3ZlYykJCXRiPSIkdGIgY29mZi1tODhrLmxvIiA7OwotICAgIG1jb3JlX3BlX2JpZ192ZWMpCQl0Yj0iJHRiIHBlLW1jb3JlLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZV9saXR0bGVfdmVjKQl0Yj0iJHRiIHBlLW1jb3JlLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLW1jb3JlLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZWlfbGl0dGxlX3ZlYykJdGI9IiR0YiBwZWktbWNvcmUubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG5ld3NvczNfdmVjKQkJdGI9IiR0YiBuZXdzb3MzLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBubG0zMl9pMzg2X3ZlYykJCXRiPSIkdGIgbmxtMzItaTM4Ni5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgbmxtMzJfc3BhcmNfdmVjKQkJdGI9IiR0YiBubG0zMi1zcGFyYy5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgbmxtMzJfYWxwaGFfdmVjKQkJdGI9IiR0YiBubG0zMi1hbHBoYS5sbyBubG0zMi5sbyBubG0ubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIHJpc2NpeF92ZWMpCQkJdGI9IiR0YiBhb3V0MzIubG8gcmlzY2l4LmxvIiA7OwotICAgIG5sbTMyX3Bvd2VycGNfdmVjKQkJdGI9IiR0YiBubG0zMi1wcGMubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIHBjNTMybmV0YnNkX3ZlYykJCXRiPSIkdGIgbnMzMmtuZXRic2QubG8gYW91dC1uczMyay5sbyIgOzsKLSAgICBwYzUzMm1hY2hhb3V0X3ZlYykJCXRiPSIkdGIgcGM1MzItbWFjaC5sbyBhb3V0LW5zMzJrLmxvIiA7OwotICAgIHBtYWNfeGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXBtYWMubG8geGNvZmZsaW5rLmxvIiA7OwotICAgIHJzNjAwMGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXJzNjAwMC5sbyB4Y29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX3Bvd2VycGNfcGVfdmVjKSAgICAgICAgIHRiPSIkdGIgcGUtcHBjLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjbGVfcGVfdmVjKSAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7ICAKLSAgICBiZmRfcG93ZXJwY19wZWlfdmVjKSAgICAgICAgdGI9IiR0YiBwZWktcHBjLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfcG93ZXJwY2xlX3BlaV92ZWMpICAgICAgdGI9IiR0YiBwZWktcHBjLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBwcGNib290X3ZlYykJCXRiPSIkdGIgcHBjYm9vdC5sbyIgOzsKLSAgICBzaGNvZmZfdmVjKQkJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGxjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNvbV92ZWMpCQkJdGI9IiR0YiBzb20ubG8iIDs7Ci0gICAgc3BhcmNsZV9hb3V0X3ZlYykJCXRiPSIkdGIgYW91dC1zcGFyY2xlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2xpbnV4X3ZlYykJCXRiPSIkdGIgc3BhcmNsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBzcGFyY2x5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLXNwYXJjbHlueC5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgc3BhcmNuZXRic2RfdmVjKQkJdGI9IiR0YiBzcGFyY25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zcGFyYy5sbyIgOzsKLSAgICBzcmVjX3ZlYykJCQl0Yj0iJHRiIHNyZWMubG8iIDs7Ci0gICAgc3Vub3NfYmlnX3ZlYykJCXRiPSIkdGIgc3Vub3MubG8gYW91dDMyLmxvIiA7OwotICAgIHN5bWJvbHNyZWNfdmVjKQkJdGI9IiR0YiBzcmVjLmxvIiA7OwotICAgIHRla2hleF92ZWMpCQkJdGI9IiR0YiB0ZWtoZXgubG8iIDs7Ci0gICAgdGljMzBfYW91dF92ZWMpCQl0Yj0iJHRiIGFvdXQtdGljMzAubG8iIDs7Ci0gICAgdGljMzBfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljMzAubG8iIDs7Ci0gICAgdGljODBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi10aWM4MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICB2ZXJzYWRvc192ZWMpCQl0Yj0iJHRiIHZlcnNhZG9zLmxvIiA7OwotICAgIHZtc19hbHBoYV92ZWMpCQl0Yj0iJHRiIHZtcy5sbyB2bXMtaGRyLmxvIHZtcy1nc2QubG8gdm1zLXRpci5sbyB2bXMtbWlzYy5sbyIKLSAJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIHZtc192YXhfdmVjKQkJdGI9IiR0YiB2bXMubG8gdm1zLWhkci5sbyB2bXMtZ3NkLmxvIHZtcy10aXIubG8gdm1zLW1pc2MubG8iIDs7Ci0gICAgdzY1X3ZlYykJCQl0Yj0iJHRiIGNvZmYtdzY1LmxvIHJlbG9jMTYubG8iIDs7Ci0gICAgd2UzMmtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi13ZTMyay5sbyIgOzsKLSAgICB6OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi16OGsubG8gcmVsb2MxNi5sbyIgOzsKLQotICAgICIiKQkJCTs7Ci0gICAgKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAqKiogdW5rbm93biB0YXJnZXQgdmVjdG9yICR2ZWMiIDE+JjI7IGV4aXQgMTsgfSA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotIyBBIGNvdXBsZSBvZiBDUFVzIHVzZSBzaG9ydGVyIGZpbGUgbmFtZXMgdG8gYXZvaWQgcHJvYmxlbXMgb24gRE9TCi0jIGZpbGVzeXN0ZW1zLgotdGE9YGVjaG8gJHNlbGFyY2hzIHwgc2VkIC1lIHMvYmZkXy9jcHUtL2cgLWUgcy9fYXJjaC8ubG8vZyAtZSBzL21uMTAyMDAvbTEwMjAwLyAtZSBzL21uMTAzMDAvbTEwMzAwL2AKLQotIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi1mPSIiCi1mb3IgaSBpbiAkdGIgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGI9IiRmIgotCi1mPSIiCi1mb3IgaSBpbiAkdGEgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGE9IiRmIgotCi1iZmRfYmFja2VuZHM9IiR0YiIKLWJmZF9tYWNoaW5lcz0iJHRhIgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHh0cnVlIDsgdGhlbgotICBiZmRfYmFja2VuZHM9IiR7YmZkX2JhY2tlbmRzfSInICQoQUxMX0JBQ0tFTkRTKScKLSAgYmZkX21hY2hpbmVzPSIke2JmZF9tYWNoaW5lc30iJyAkKEFMTF9NQUNISU5FUyknCi0gIHNlbHZlY3M9Ci0gIGhhdmV2ZWNzPQotICBzZWxhcmNocz0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICMgT25seSBzZXQgdGhlc2UgaWYgdGhleSB3aWxsIGJlIG5vbmVtcHR5LCBmb3IgdGhlIGNsZXZlciBlY2hvLgotICBoYXZldmVjcz0KLSAgdGVzdCAtbiAiJHNlbHZlY3MiICYmCi0gICAgaGF2ZXZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi8tREhBVkVfLycgLWUgJ3MvIFwoLlwpLyAtREhBVkVfXDEvZydgCi0gIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgotICAgIHNlbHZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKLSAgdGVzdCAtbiAiJHNlbGFyY2hzIiAmJgotICAgIHNlbGFyY2hzPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSAncy9eL1wmLycgLWUgJ3MvIFwoLlwpLyxcJlwxL2cnYAotZmkJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0KLWNhc2UgJHtob3N0NjR9LSR7dGFyZ2V0NjR9LSR7d2FudDY0fSBpbgotICAqdHJ1ZSopCi0gICAgd29yZHNpemU9NjQKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZENjRfQkFDS0VORFMpICQoQkZEMzJfQkFDS0VORFMpJwotICAgIGlmIHRlc3QgLXogIiRHQ0MiICYmIHRlc3QgIiRCRkRfSE9TVF82NEJJVF9MT05HIiA9ICIwIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRfQklUX0RFRklORUQiID0gIjAiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IFlvdSBoYXZlIHJlcXVlc3RlZCBhIDY0IGJpdCBCRkQgY29uZmlndXJhdGlvbiwgYnV0IiAxPiYyCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IHlvdXIgY29tcGlsZXIgbWF5IG5vdCBoYXZlIGEgNjQgYml0IGludGVncmFsIHR5cGUiIDE+JjIKLSAgICBmaQotICAgIDs7Ci0gIGZhbHNlLWZhbHNlLWZhbHNlKQotICAgIHdvcmRzaXplPTMyCi0gICAgYWxsX2JhY2tlbmRzPSckKEJGRDMyX0JBQ0tFTkRTKScKLSAgICA7OwotZXNhYwotCi0KLQotCi0KLQotdGRlZmF1bHRzPSIiCi10ZXN0IC1uICIke2RlZnZlY30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EREVGQVVMVF9WRUNUT1I9JHtkZWZ2ZWN9IgotdGVzdCAtbiAiJHtzZWx2ZWNzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfVkVDUz0nJHtzZWx2ZWNzfSciCi10ZXN0IC1uICIke3NlbGFyY2hzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfQVJDSElURUNUVVJFUz0nJHtzZWxhcmNoc30nIgotdGVzdCAtbiAiJHtoYXZldmVjc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9ICR7aGF2ZXZlY3N9IgotCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NjAwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTYwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NTYxMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NjM5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NjQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2Njc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2OTI6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU3MDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4NDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi1mb3IgYWNfZnVuYyBpbiBtYWR2aXNlIG1wcm90ZWN0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1ODY1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1ODcwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU4OTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWNhc2UgJHt3YW50X21tYXB9KyR7YWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZH0gaW4KLSAgdHJ1ZSt5ZXMgKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFVTRV9NTUFQIDEKLUVPRgotIDs7Ci1lc2FjCi0KLXJtIC1mIGRvYy9jb25maWcuc3RhdHVzCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgZG9jL01ha2VmaWxlIGJmZC1pbjMuaDpiZmQtaW4yLmggcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQENDQCUkQ0MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAQVJAJSRBUiVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVATERAJSRMRCVnCi1zJUBOTUAlJE5NJWcKLXMlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBETExUT09MQCUkRExMVE9PTCVnCi1zJUBBU0AlJEFTJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEJGRF9IT1NUXzY0QklUX0xPTkdAJSRCRkRfSE9TVF82NEJJVF9MT05HJWcKLXMlQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCUkQkZEX0hPU1RfNjRfQklUX0RFRklORUQlZwotcyVAQkZEX0hPU1RfNjRfQklUQCUkQkZEX0hPU1RfNjRfQklUJWcKLXMlQEJGRF9IT1NUX1VfNjRfQklUQCUkQkZEX0hPU1RfVV82NF9CSVQlZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEVYRUVYVF9GT1JfQlVJTERAJSRFWEVFWFRfRk9SX0JVSUxEJWcKLXMlQENPUkVGSUxFQCUkQ09SRUZJTEUlZwotcyVAQ09SRUZMQUdAJSRDT1JFRkxBRyVnCi1zJUBXSU4zMkxERkxBR1NAJSRXSU4zMkxERkxBR1MlZwotcyVAV0lOMzJMSUJBRERAJSRXSU4zMkxJQkFERCVnCi1zJUBUREVGSU5FU0AlJFRERUZJTkVTJWcKLXMlQHdvcmRzaXplQCUkd29yZHNpemUlZwotcyVAYWxsX2JhY2tlbmRzQCUkYWxsX2JhY2tlbmRzJWcKLXMlQGJmZF9iYWNrZW5kc0AlJGJmZF9iYWNrZW5kcyVnCi1zJUBiZmRfbWFjaGluZXNAJSRiZmRfbWFjaGluZXMlZwotcyVAdGRlZmF1bHRzQCUkdGRlZmF1bHRzJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSBiZmQtaW4zLmg6YmZkLWluMi5oIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZS5jb20gYi9iZmQvY29uZmlndXJlLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5OTc3Yy4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlndXJlLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0kIQotJCEgVGhpcyBmaWxlIGNvbmZpZ3VyZXMgdGhlIGJmZCBsaWJyYXJ5IGZvciB1c2Ugd2l0aCBvcGVuVk1TIChBbHBoYSBhbmQgVmF4KQotJCEKLSQhIFdlIGRvIG5vdCB1c2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIHNpbmNlIHdlIGRvIG5vdCBoYXZlIC9iaW4vc2gKLSQhIHRvIGV4ZWN1dGUgaXQuCi0kIQotJCEgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotJCEKLSRhcmNoX2luZHggPSAxICsgKChmJGdldHN5aSgiQ1BVIikuZ2UuMTI4KS5hbmQuMSkgICAgICAhIHZheD09MSwgYWxwaGE9PTIKLSRhcmNoID0gZiRlbGVtZW50KGFyY2hfaW5keCwifCIsInxWQVh8QWxwaGF8IikKLSQhCi0kaWYgYXJjaCAuZXFzLiAiQWxwaGEiCi0kdGhlbgotJCB3cml0ZSBzeXMkb3V0cHV0ICJDb25maWd1cmluZyBmb3IgQWxwaGEgdGFyZ2V0IgotJCB0YXJnZXQgPSAiYWxwaGEiCi0kIQotJCEgY29weSBiZmQtaW4yLmggdG8gYmZkLmgsIHJlcGxhY2luZyBAIG1hY3JvcwotJCEKLSQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zeXMkaW5wdXQgLQotICAgICAgICBbXWJmZC1pbjIuaCAvb3V0cHV0PVtdYmZkLmgKLSRERUNLCi0hCi0hICBDb3B5IGZpbGUsIGNoYW5naW5nIGxpbmVzIHdpdGggbWFjcm9zIChAQCkKLSEKLSEKLSAgIHZmaWxlIDo9IENSRUFURV9CVUZGRVIoInZmaWxlIiwgIkNPTkZJR1VSRS5JTiIpOwotICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKHZmaWxlKSwgRU5EX09GKHZmaWxlKSk7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0FNX0lOSVRfQVVUT01BS0UoYmZkLCAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgIHZlcnMgOj0gQ1VSUkVOVF9MSU5FLSIpIjsKLSAgIEVMU0U7Ci0gICAgIHZlcnMgOj0gInVua25vd24iOwotICAgRU5ESUY7Ci0KLSAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgRU5EX09GKGZpbGUpKTsKLQotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAVkVSU0lPTkAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCh2ZXJzKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAd29yZHNpemVAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJzY0Jyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0QklUX0xPTkdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJzAnKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUX0RFRklORURAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ19fREVDQycpOwotICAgICAgU1BMSVRfTElORTsKLSAgICAgIENPUFlfVEVYVCgnI2luY2x1ZGUgPGludHMuaD4nKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCdpbnQ2NCcpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF9VXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgndWludDY0Jyk7Ci0gICBFTkRJRjsKLSAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7Ci0gICBRVUlUCi0kICBFT0QKLSQKLSRlbHNlCi0kCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkNvbmZpZ3VyaW5nIGZvciBWYXggdGFyZ2V0IgotJCB0YXJnZXQgPSAidmF4IgotJCEKLSQhIGNvcHkgYmZkLWluMi5oIHRvIGJmZC5oLCByZXBsYWNpbmcgQCBtYWNyb3MKLSQhCi0kIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3lzJGlucHV0IC0KLSAgICAgICAgW11iZmQtaW4yLmggL291dHB1dD1bXWJmZC5oCi0kREVDSwotIQotISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCi0hCi0hCi0gICB2ZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJ2ZmlsZSIsICJDT05GSUdVUkUuSU4iKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRih2ZmlsZSksIEVORF9PRih2ZmlsZSkpOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBTV9JTklUX0FVVE9NQUtFKGJmZCwgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7Ci0gICBFTFNFOwotICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKLSAgIEVORElGOwotCi0gICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7Ci0KLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQFZFUlNJT05AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQodmVycyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQHdvcmRzaXplQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCczMicpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NEJJVF9MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCcwJyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCdfX0RFQ0MnKTsKLSAgICAgIFNQTElUX0xJTkU7Ci0gICAgICBDT1BZX1RFWFQoJyNpbmNsdWRlIDxpbnRzLmg+Jyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnaW50NjQnKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfVV82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ3VpbnQ2NCcpOwotICAgRU5ESUY7Ci0gICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwotICAgUVVJVAotJCAgRU9ECi0kZW5kaWYKLSQKLSQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGVkIGBiZmQuaCcgZnJvbSBgYmZkLWluMi5oJy4iCi0kIQotJCEKLSQhIGNyZWF0ZSB0YXJnbWF0Y2guaAotJCEKLSQgb3Blbi93cml0ZSB0ZmlsZSBbXXRhcmdtYXRjaC5oCi0kIHdyaXRlIHRmaWxlICJ7ICIiIiArIHRhcmdldCArICItKi0qdm1zKiIiIiArICIsIgotJCB3cml0ZSB0ZmlsZSAiI2lmIGRlZmluZWQgKFNFTEVDVF9WRUNTKSIKLSQgd3JpdGUgdGZpbGUgIlNFTEVDVF9WRUNTIgotJCB3cml0ZSB0ZmlsZSAiI2Vsc2UiCi0kIHdyaXRlIHRmaWxlICJVTlNVUFBPUlRFRF9UQVJHRVQiCi0kIHdyaXRlIHRmaWxlICIjZW5kaWYiCi0kIHdyaXRlIHRmaWxlICJ9LCIKLSQgY2xvc2UgdGZpbGUKLSQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGVkIGB0YXJnbWF0Y2guaCciCi0kIQotJCEKLSQhIGNyZWF0ZSBjb25maWcuaAotJCEKLSQgY3JlYXRlIFtdY29uZmlnLmgKLS8qIGNvbmZpZy5oLXZtcy4gIEdlbmVyYXRlZCBieSBoYW5kIGJ5IEtsYXVzIEvkbXBmLCBra2FlbXBmQGRpZHltdXMucm1pLmRlLiAgKi8KLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotLyogV2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLwotLyogI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DICovCi0vKiBXaGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLwotLyogI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRSAqLwotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotLyogI2RlZmluZSBIQVZFX01NQVAgMSAqLwotLyogRG8gd2UgbmVlZCB0byB1c2UgdGhlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gICovCi0vKiAjdW5kZWYgVVNFX0JJTkFSWV9GT1BFTiAqLwotLyogTmFtZSBvZiBob3N0IHNwZWNpZmljIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gdHJhZC1jb3JlLmMuICAqLwotLyogI3VuZGVmIFRSQURfSEVBREVSICovCi0vKiBEZWZpbmUgb25seSBpZiA8c3lzL3Byb2Nmcy5oPiBpcyBhdmFpbGFibGUgKmFuZCogaXQgZGVmaW5lcyBwcnN0YXR1c190LiAgKi8KLS8qICN1bmRlZiBIQVZFX1NZU19QUk9DRlNfSCAqLwotLyogRG8gd2UgcmVhbGx5IHdhbnQgdG8gdXNlIG1tYXAgaWYgaXQncyBhdmFpbGFibGU/ICAqLwotLyogI3VuZGVmIFVTRV9NTUFQICovCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZjbnRsIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgSEFWRV9GQ05UTCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgSEFWRV9HRVRQQUdFU0laRSAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1hZHZpc2UgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX01BRFZJU0UgMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtcHJvdGVjdCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfTVBST1RFQ1QgMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkZGVmLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERERUZfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TWVNfRklMRV9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1RJTUVfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKLSQhCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgY29uZmlnLmgnIgotCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlLmhvc3QgYi9iZmQvY29uZmlndXJlLmhvc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNGNkNjAuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZ3VyZS5ob3N0CisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBvdmVycmlkZXMgc29tZSBvZiB0aGUgdG9vbHMgYW5kCi0jIGZsYWdzIHVzZWQgb24gYSBob3N0IHNwZWNpZmljIGJhc2lzLgotCi0jIFNpbmNlIHRoZSAiYmZkL2hvc3RzIiBkaXJlY3RvcnkgaXMgc2hhcmVkIGJ5IHRoZSBiZmQsIG9wY29kZXMsIGFuZAotIyBiaW51dGlscyBkaXJlY3RvcmllcyAoYXQgbGVhc3QpLCB0aGUgaW5kZXggdG8gaXQgaXMgYWxzbyBzaGFyZWQuCi0jIFRoaXMgaXMgdGhhdCBpbmRleC4gIEVhY2ggY29uZmlndXJlLmluIGZpbGUgc2hvdWxkIHNvdXJjZSB0aGlzIGZpbGUKLSMgaW4gaXRzIHBlci1ob3N0IHBhcnQuCi0KLSMgVGhpcyBzZXRzIHRoZSBmb2xsb3dpbmcgc2hlbGwgdmFyaWFibGVzOgotIyAgSERFRklORVMJCWhvc3Qgc3BlY2lmaWMgY29tcGlsZXIgb3B0aW9ucwotIyAgaG9zdDY0CQlzZXQgdG8gdHJ1ZSBpZiA2NCBiaXQgdHlwZXMgYXJlIGFzIGZhc3QgYXMgMzIgYml0Ci0jICBIT1NUXzY0QklUX1RZUEUJaG9zdCA2NCBiaXQgdHlwZQotIyAgSE9TVF9VXzY0QklUX1RZUEUJdW5zaWduZWQgNjQgYml0IHR5cGUgKG5vdCBuZWVkZWQgaWYgNjRCSVRfVFlQRSBpcyBsb25nKQotCi1IREVGSU5FUz0KLWhvc3Q2ND1mYWxzZQotSE9TVF82NEJJVF9UWVBFPQotSE9TVF9VXzY0QklUX1RZUEU9Ci0KLWNhc2UgIiR7aG9zdH0iIGluCi0KLWFscGhhKi0qLSopCQlob3N0NjQ9dHJ1ZTsgSE9TVF82NEJJVF9UWVBFPWxvbmcgOzsKLQotaHBwYSotKi1ocHV4KikJCUhERUZJTkVTPS1ESE9TVF9IUFBBSFBVWCA7OwotaHBwYSotKi1oaXV4KikJCUhERUZJTkVTPS1ESE9TVF9IUFBBSFBVWCA7OwotaHBwYSotKi1tcGVpeCopCQlIREVGSU5FUz0tREhPU1RfSFBQQU1QRUlYIDs7Ci1ocHBhKi0qLWJzZCopCQlIREVGSU5FUz0tREhPU1RfSFBQQUJTRCA7OwotaHBwYSotKi1vc2YqKQkJSERFRklORVM9LURIT1NUX0hQUEFPU0YgOzsKLQotaVszNDU2XTg2LXNlcXVlbnQtYnNkKikJSERFRklORVM9LURzaGFyZWQ9Z2Vuc2hhcmVkIDs7Ci1pWzM0NTZdODYtc2VxdWVudC1zeXN2NCopIDs7Ci1pWzM0NTZdODYtc2VxdWVudC1zeXN2KikJSERFRklORVM9LURzaGFyZWQ9Z2Vuc2hhcmVkIDs7Ci0KLW1pcHMqLWRlYy1uZXRic2QqKQk7OwotbWlwcyotKi1vcGVuYnNkKikJOzsKLW1pcHMqLWRlYy0qKQkJSERFRklORVM9Ii1HIDQiCTs7Ci1taXBzKi1zZ2ktaXJpeDMqKQlIREVGSU5FUz0iLUcgNCIgOzsKLW1pcHMqLXNnaS1pcml4NCopCUhERUZJTkVTPSItRyA0IiA7OwotbWlwcyotc2dpLWlyaXg2KikJaG9zdDY0PXRydWUKLQkJCUhPU1RfNjRCSVRfVFlQRT0ibG9uZyBsb25nIjsKLQkJCUhPU1RfVV82NEJJVF9UWVBFPSJ1bnNpZ25lZCBsb25nIGxvbmciOwotCQkJOzsKLW1pcHMqLSotc3lzdjQqKQkJOzsKLW1pcHMqLSotc3lzdiopCQlIREVGSU5FUz0iLUcgNCIgOzsKLW1pcHMqLSotcmlzY29zKikJSERFRklORVM9Ii1HIDQiIDs7Ci0KLW02OCotaHAtaHB1eCopCQlIREVGSU5FUz0tREhPU1RfSFAzMDBIUFVYIDs7Ci0KLSotKi1zb2xhcmlzKikJCUhPU1RfNjRCSVRfVFlQRT0ibG9uZyBsb25nIgotCQkJSE9TVF9VXzY0QklUX1RZUEU9InVuc2lnbmVkIGxvbmcgbG9uZyIKLQkJCTs7Ci0KLSotKi13aW5kb3dzKikKLQkJCUhPU1RfNjRCSVRfVFlQRT1fX2ludDY0Ci0JCQlIT1NUX1VfNjRCSVRfVFlQRT0idW5zaWduZWQgX19pbnQ2NCIKLSMgVGhlIGZvbGxvd2luZyBrcm9jayBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBjYW4ndCBydW4gdGhlIGJ1aWxkIGNvbXBpbGVyCi0jIChNU1ZDKSBvbiB0aGUgY29uZmlndXJlIGhvc3QsIHNvIHdlIGhhdmUgdG8gZXhwbGljaXRseSBzZXQgdGhlIHZhbHVlcyBoZXJlLgotIyBOb3RlIHRoYXQgdGhpcyBmaWxlIGlzIG5ldmVyIHJ1biB0aHJvdWdoIGF1dG9jb25mLCBzbyB3ZSBjYW4ndCB1c2UgYW55Ci0jIGF1dG9jb25mIG1hY3JvcyBoZXJlLiAgQmVjYXVzZSBvZiB0aGlzLCB3ZSBoYXZlIHRvIG11Y2sgd2l0aCBhdXRvY29uZgotIyB2YXJpYWJsZXMgZXhwbGljaXRseS4KLQkJCWFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLQkJCWFjX2N2X2hlYWRlcl90aW1lPW5vCi0JCQlhY19jdl9mdW5jX2dldHBhZ2VzaXplPW5vCi0JCQlhY19jdl9mdW5jX21hZHZpc2U9bm8KLQkJCWFjX2N2X2Z1bmNfbXByb3RlY3Q9bm8KLQkJCWFjX2N2X2Z1bmNfZ2V0dWlkPW5vCi0JCQlhY19jdl9mdW5jX2dldGdpZD1ubwotCQkJYWNfY3ZfaGVhZGVyX3N5c19maWxlX2g9bm8KLQkJCWFjX2N2X2hlYWRlcl9zeXNfdGltZV9oPW5vCi0JCQlhY19jdl9oZWFkZXJfdW5pc3RkX2g9bm8KLQkJCTs7Ci1lc2FjCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlLmluIGIvYmZkL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3NmMzYS4uMDAwMDAwMAotLS0gYS9iZmQvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjUzICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi0KLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChsaWJiZmQuYykKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotQUNfSVNDX1BPU0lYCi0KLUFNX0lOSVRfQVVUT01BS0UoYmZkLCAyLjkuNSkKLQotZG5sIFRoZXNlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wsIGJlY2F1c2UgaXQgbWF5IHdhbnQKLWRubCB0byBjYWxsIEFDX0NIRUNLX1BST0cuCi1BQ19DSEVDS19UT09MKEFSLCBhcikKLUFDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCi0KLWRubCBEZWZhdWx0IHRvIGEgbm9uIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUKLWRubCBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLXNoYXJlZC4KLUFNX0RJU0FCTEVfU0hBUkVECi0KLUFNX1BST0dfTElCVE9PTAotCi1BQ19BUkdfRU5BQkxFKDY0LWJpdC1iZmQsCi1bICAtLWVuYWJsZS02NC1iaXQtYmZkICAgICA2NC1iaXQgc3VwcG9ydCAob24gaG9zdHMgd2l0aCBuYXJyb3dlciB3b3JkIHNpemVzKV0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpICB3YW50NjQ9dHJ1ZSAgOzsKLSAgbm8pICAgd2FudDY0PWZhbHNlIDs7Ci0gICopICAgIEFDX01TR19FUlJPUihiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciA2NC1iaXQtYmZkIG9wdGlvbikgOzsKLWVzYWNdLFt3YW50NjQ9ZmFsc2VdKWRubAotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCi1bICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OwotZXNhY10pZG5sCi1BQ19BUkdfV0lUSChtbWFwLAotWyAgLS13aXRoLW1tYXAgICAgICAgICAgICAgdHJ5IHVzaW5nIG1tYXAgZm9yIEJGRCBpbnB1dCBmaWxlcyBpZiBhdmFpbGFibGVdLAotW2Nhc2UgIiR7d2l0aHZhbH0iIGluCi0gIHllcykgIHdhbnRfbW1hcD10cnVlIDs7Ci0gIG5vKSAgIHdhbnRfbW1hcD1mYWxzZSA7OwotICAqKSAgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIEJGRCB3aXRoLW1tYXAgb3B0aW9uKSA7OwotZXNhY10sW3dhbnRfbW1hcD1mYWxzZV0pZG5sCi0KLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLUFDX0FSR19QUk9HUkFNCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi0KLWhvc3Q2ND1mYWxzZQotdGFyZ2V0NjQ9ZmFsc2UKLQotIyBob3N0IHN0dWZmOgotCi1BQ19QUk9HX0NDCi0KLUFMTF9MSU5HVUFTPQotQ1lfR05VX0dFVFRFWFQKLQotIyBQZXJtaXQgaG9zdCBzcGVjaWZpYyBzZXR0aW5ncy4KLS4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS5ob3N0Ci0KLUFDX1NVQlNUKEhERUZJTkVTKQotQUNfUFJPR19JTlNUQUxMCi0KLUJGRF9IT1NUXzY0QklUX0xPTkc9MAotQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MAotQkZEX0hPU1RfNjRfQklUPQotQkZEX0hPU1RfVV82NF9CSVQ9Ci1pZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiA9ICJ4bG9uZyI7IHRoZW4KLSAgQkZEX0hPU1RfNjRCSVRfTE9ORz0xCi1lbGlmIHRlc3QgIngke0hPU1RfNjRCSVRfVFlQRX0iICE9ICJ4IjsgdGhlbgotICBCRkRfSE9TVF82NF9CSVRfREVGSU5FRD0xCi0gIEJGRF9IT1NUXzY0X0JJVD0ke0hPU1RfNjRCSVRfVFlQRX0KLSAgQkZEX0hPU1RfVV82NF9CSVQ9JHtIT1NUX1VfNjRCSVRfVFlQRX0KLWZpCi1BQ19TVUJTVChCRkRfSE9TVF82NEJJVF9MT05HKQotQUNfU1VCU1QoQkZEX0hPU1RfNjRfQklUX0RFRklORUQpCi1BQ19TVUJTVChCRkRfSE9TVF82NF9CSVQpCi1BQ19TVUJTVChCRkRfSE9TVF9VXzY0X0JJVCkKLQotQkZEX0NDX0ZPUl9CVUlMRAotCi1BQ19DSEVDS19IRUFERVJTKHN0ZGRlZi5oIHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB0aW1lLmggdW5pc3RkLmgpCi1BQ19DSEVDS19IRUFERVJTKGZjbnRsLmggc3lzL2ZpbGUuaCBzeXMvdGltZS5oKQotQUNfSEVBREVSX1RJTUUKLUFDX0hFQURFUl9ESVJFTlQKLUFDX0NIRUNLX0ZVTkNTKGZjbnRsIGdldHBhZ2VzaXplIHNldGl0aW1lciBzeXNjb25mIGZkb3BlbiBnZXR1aWQgZ2V0Z2lkKQotCi1CRkRfQklOQVJZX0ZPUEVOCi0KLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHN0cnN0cikKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKG1hbGxvYykKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHJlYWxsb2MpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihmcmVlKQotQkZEX05FRURfREVDTEFSQVRJT04oZ2V0ZW52KQotCi0jIElmIHdlIGFyZSBjb25maWd1cmVkIG5hdGl2ZSwgcGljayBhIGNvcmUgZmlsZSBzdXBwb3J0IGZpbGUuCi1DT1JFRklMRT0KLUNPUkVGTEFHPQotVFJBRF9IRUFERVI9Ci1pZiB0ZXN0ICIke3RhcmdldH0iID0gIiR7aG9zdH0iOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0gIGFscGhhKi0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9hbHBoYWxpbnV4LmgiJwotCTs7Ci0gIGFscGhhKi0qLW5ldGJzZCopCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvIDs7Ci0gIGFscGhhKi0qLSopCQlDT1JFRklMRT1vc2YtY29yZS5sbyA7OwotICBhcm0tKi1yaXNjaXgpCQlDT1JFRklMRT10cmFkLWNvcmUubG8gOzsKLSAgaHBwYSotKi1ocHV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotaGl1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLW1wZWl4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotYnNkKikJCUNPUkVGSUxFPSJocHV4LWNvcmUubG8gaHBwYWJzZC1jb3JlLmxvIgotCQkJQ09SRUZMQUc9Ii1ESFBVWF9DT1JFIC1ESFBQQUJTRF9DT1JFIiA7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LXNlcXVlbnQtYnNkKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG87Ci0JVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LXNlcXVlbnQtc3lzdjQqKSA7OwotICBpWzM0NTZdODYtc2VxdWVudC1zeXN2KikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3N5bW1ldHJ5LmgiJwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1ic2QqIHwgaVszNDU2XTg2LSotZnJlZWJzZCopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2YnNkLmgiJwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1uZXRic2QqIHwgaVszNDU2XTg2LSotb3BlbmJzZCopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LWVzaXgtc3lzdjMqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZXNpeC5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXNjbzUtY29yZS5sbwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotaXNjKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZzY28uaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLW1hY2gzKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZtYWNoMy5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotbGludXgtZ251KikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZsaW51eC5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotaXNjKikJQ09SRUZJTEU9dHJhZC1jb3JlLmxvIDs7Ci0gIGlbMzQ1Nl04Ni0qLWFpeCopCUNPUkVGSUxFPWFpeDM4Ni1jb3JlLmxvIDs7Ci1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gIGk4NjAtKi1tYWNoMyogfCBpODYwLSotb3NmMSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pODYwbWFjaDMuaCInCi0JOzsKLSAgbWlwcy1kZWMtYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNic2QuaCInCi0JOzsKLSAgbWlwcy1kZWMtbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc21hY2gzLmgiJwotCTs7Ci0gIG1pcHMtKi1uZXRic2QqIHwgbWlwcyotKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIG1pcHMtZGVjLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9kZWNzdGF0aW9uLmgiJwotCTs7Ci0gIG1pcHMtc2dpLWlyaXg0KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7Ci0gIG1pcHMtc2dpLWlyaXg1KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7Ci0gIG1pcHMtc2dpLWlyaXg2KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7Ci0gIG1pcHMtKi1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzbWFjaDMuaCInCi0JOzsKLSAgbWlwcy0qLXN5c3Y0KikJOzsKLSAgbWlwcy0qLXN5c3YqIHwgbWlwcy0qLXJpc2NvcyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9yaXNjb3MuaCInCi0JOzsKLSAgbWlwcy1zb255LWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9uZXdzLW1pcHMuaCInCi0JOzsKLSAgbTY4Ki1idWxsKi1zeXN2KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RweDIuaCInCi0JOzsKLSAgbTY4Ki1ocC1ocHV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIG02OCotaHAtYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2hwMzAwYnNkLmgiJwotCTs7Ci0gIG02OCotKi1saW51eC1nbnUqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTY4a2xpbnV4LmgiJwotCTs7Ci0gIG02OCotbW90b3JvbGEtc3lzdiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9kZWx0YTY4LmgiJwotCTs7Ci0gIG02OCotc29ueS0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbmV3cy5oIicKLQk7OwotICBtNjgqLSotbmV0YnNkKiB8IG02OCotKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIG02OCotYXBwbGUtYXV4KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL202OGthdXguaCInCi0JOzsKLSAgbTg4Ki0qLXN5c3Y0KikJOzsKLSAgbTg4Ki1tb3Rvcm9sYS1zeXN2KikJQ09SRUZJTEU9cHRyYWNlLWNvcmUubG8gOzsKLSAgbTg4Ki0qLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL204OGttYWNoMy5oIicKLQk7OwotICBuczMyay1wYzUzMi1tYWNoKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvcGM1MzJtYWNoLmgiJwotCTs7Ci0gIG5zMzJrLSotbmV0YnNkKiB8IG5zMzJrLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICByczYwMDAtKi1seW54KikJQ09SRUZJTEU9bHlueC1jb3JlLmxvIDs7Ci0gIHJzNjAwMC0qLWFpeDQqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICByczYwMDAtKi0qKQkJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLSpic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYWl4NCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1haXgqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYmVvcyopCTs7Ci0gIHBvd2VycGMtKi1uZXRic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBzcGFyYy0qLW5ldGJzZCogfCBzcGFyYy0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgdGFob2UtKi0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdGFob2UuaCInCi0JOzsKLSAgdmF4LSotdWx0cml4MiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXh1bHQyLmgiJwotCTs7Ci0gIHZheC0qLXVsdHJpeCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXh1bHQyLmgiJwotCTs7Ci0gIHZheC0qLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXhic2QuaCInCi0JOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRDT1JFRklMRSIgaW4KLSAgYWl4Mzg2LWNvcmUubG8pCUNPUkVGTEFHPS1EQUlYMzg2X0NPUkUgOzsKLSAgaHBwYWJzZC1jb3JlLmxvKQlDT1JFRkxBRz0tREhQUEFCU0RfQ09SRSA7OwotICBocHV4LWNvcmUubG8pCQlDT1JFRkxBRz0tREhQVVhfQ09SRSA7OwotICBpcml4LWNvcmUubG8pCQlDT1JFRkxBRz0tRElSSVhfQ09SRSA7OwotICBseW54LWNvcmUubG8pCQlDT1JFRkxBRz0tRExZTlhfQ09SRSA7OwotICBuZXRic2QtY29yZS5sbykJQ09SRUZMQUc9LURORVRCU0RfQ09SRSA7OwotICBvc2YtY29yZS5sbykJCUNPUkVGTEFHPS1ET1NGX0NPUkUgOzsKLSAgcHRyYWNlLWNvcmUubG8pCUNPUkVGTEFHPS1EUFRSQUNFX0NPUkUgOzsKLSAgcnM2MDAwLWNvcmUubG8pCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURBSVhfQ09SRSIgOzsKLSAgc2NvNS1jb3JlLmxvKQkJQ09SRUZMQUc9IiRDT1JFRkxBRyAtRFNDTzVfQ09SRSIgOzsKLSAgdHJhZC1jb3JlLmxvKQkJQ09SRUZMQUc9IiRDT1JFRkxBRyAtRFRSQURfQ09SRSIgOzsKLSAgZXNhYwotCi0gICMgRUxGIGNvcmVmaWxlIHN1cHBvcnQgaGFzIHNldmVyYWwgZmxhdm9ycywgYnV0IGFsbCBvZgotICAjIHRoZW0gdXNlIHNvbWV0aGluZyBjYWxsZWQgPHN5cy9wcm9jZnMuaD4KLSAgQUNfQ0hFQ0tfSEVBREVSUyhzeXMvcHJvY2ZzLmgpCi0gIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3Byb2Nmc19oIiA9IHllczsgdGhlbgotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwcnN0YXR1c190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIocHJzdGF0dXNfdCwgcHJfd2hvKQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwc3RhdHVzX3QpCi0gICAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFKHBycHNpbmZvX3QpCi0gICAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFKHBzaW5mb190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShsd3BzdGF0dXNfdCkKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKGx3cHN0YXR1c190LCBwcl9jb250ZXh0KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIobHdwc3RhdHVzX3QsIHByX3JlZykKLSAgZmkKLWZpCi1BQ19TVUJTVChDT1JFRklMRSkKLUFDX1NVQlNUKENPUkVGTEFHKQotQUNfREVGSU5FX1VOUVVPVEVEKFRSQURfSEVBREVSLCAkVFJBRF9IRUFERVIsCi0gIFtOYW1lIG9mIGhvc3Qgc3BlY2lmaWMgaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiB0cmFkLWNvcmUuYy5dKQotCi0jIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KLVdJTjMyTERGTEFHUz0KLVdJTjMyTElCQUREPQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1jeWd3aW4qKQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKLSAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiAtbGtlcm5lbDMyIgotICBmaQotICA7OwotZXNhYwotQUNfU1VCU1QoV0lOMzJMREZMQUdTKQotQUNfU1VCU1QoV0lOMzJMSUJBREQpCi0KLSMgdGFyZ2V0IHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gICAgZm9yIHRhcmcgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLSAgICBkbwotCXJlc3VsdD1gJGFjX2NvbmZpZ19zdWIgJHRhcmcgMj4vZGV2L251bGxgCi0JaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1kZWZ2ZWM9Ci1zZWx2ZWNzPQotc2VsYXJjaHM9Ci1UREVGSU5FUz0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIjsgdGhlbgotICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCi0gICAgZWxzZQotCS4gJHNyY2Rpci9jb25maWcuYmZkCi0JaWYgdGVzdCAieCR0YXJnIiA9ICJ4JHRhcmdldCI7IHRoZW4KLQkgICAgZGVmdmVjPSR0YXJnX2RlZnZlYwotCWZpCi0Jc2VsdmVjcz0iJHNlbHZlY3MgJHRhcmdfZGVmdmVjICR0YXJnX3NlbHZlY3MiCi0Jc2VsYXJjaHM9IiRzZWxhcmNocyAkdGFyZ19hcmNocyIKLQlUREVGSU5FUz0iJFRERUZJTkVTICR0YXJnX2NmbGFncyIKLSAgICBmaQotZG9uZQotQUNfU1VCU1QoVERFRklORVMpCi0KLSMgVGhpcyBwcm9jZXNzaW5nIHN0aWxsIG5lZWRzIHRvIGJlIGRvbmUgaWYgd2UncmUgdG8gZGVjaWRlIHByb3Blcmx5IHdoZXRoZXIKLSMgNjQtYml0IHN1cHBvcnQgbmVlZHMgdG8gYmUgY29tcGlsZWQgaW4uICBDdXJyZW50bHksIGl0IHdpbGwgYmUgaW5jbHVkZWQgaWYKLSMgdGhlIGRlZmF1bHQgb3IgYW55IG90aGVyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHRhcmdldCByZXF1aXJlcyBpdDsgaXQKLSMgd2lsbCBub3QgYmUgaW5jbHVkZWQgb24gYSAzMi1iaXQgaG9zdCBpZiBubyA2NC1iaXQgdGFyZ2V0IGlzIHJlcXVlc3RlZCwgYW5kCi0jIG5vICItLXdpdGgtNjQtYml0LWJmZCIgb3B0aW9uIGlzIGdpdmVuLCBldmVuIGlmICItLWVuYWJsZS10YXJnZXRzPWFsbCIgaXMKLSMgdXNlZC4KLQotIyB1bmlxIHRoZSBkZWZhdWx0IGFuZCBzZWxlY3RlZCB2ZWN0b3JzIGluIGFsbCB0aGUgY29uZmlndXJlZCB0YXJnZXRzLgotZj0iIgotZm9yIGkgaW4gJHNlbHZlY3MgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotc2VsdmVjcz0iJGYiCi0KLQotIyB1bmlxIHRoZSBhcmNoaXRlY3R1cmVzIGluIGFsbCB0aGUgY29uZmlndXJlZCB0YXJnZXRzLgotZj0iIgotZm9yIGkgaW4gJHNlbGFyY2hzIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXNlbGFyY2hzPSIkZiIKLQotIyBUYXJnZXQgYmFja2VuZCAubyBmaWxlcy4KLXRiPQotCi1lbGY9ImVsZi5sbyBlbGZsaW5rLmxvIGR3YXJmMi5sbyBkd2FyZjEubG8iCi0KLWZvciB2ZWMgaW4gJHNlbHZlY3MKLWRvCi0gICAgY2FzZSAiJHZlYyIgaW4KLSAgICAjIFRoaXMgbGlzdCBpcyBhbHBoYWJldGl6ZWQgdG8gbWFrZSBpdCBlYXN5IHRvIGNvbXBhcmUKLSAgICAjIHdpdGggdGhlIHR3byB2ZWN0b3IgbGlzdHMgaW4gdGFyZ2V0cy5jLgotICAgIGEyOWtjb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtYTI5ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBhX291dF9hZG9iZV92ZWMpCQl0Yj0iJHRiIGFvdXQtYWRvYmUubG8gYW91dDMyLmxvIiA7OwotICAgIGFybWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybW5ldGJzZF92ZWMpCQl0Yj0iJHRiIGFybW5ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYXJtcGVfbGl0dGxlX3ZlYykJCXRiPSIkdGIgcGUtYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVfYmlnX3ZlYykJCXRiPSIkdGIgcGUtYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVpX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIHBlaS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLWFybS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZXBvYy1wZS1hcm0ubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZV9iaWdfdmVjKQl0Yj0iJHRiIGVwb2MtcGUtYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMpCXRiPSIkdGIgZXBvYy1wZWktYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVpX2JpZ192ZWMpCXRiPSIkdGIgZXBvYy1wZWktYXJtLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYW91dDBfYmlnX3ZlYykJCXRiPSIkdGIgYW91dDAubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfYXJtX2JpZ192ZWMpCQl0Yj0iJHRiIGFvdXQtYXJtLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X2FybV9saXR0bGVfdmVjKQl0Yj0iJHRiIGFvdXQtYXJtLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X21pcHNfYmlnX3ZlYykJCXRiPSIkdGIgbWlwc2JzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9taXBzX2xpdHRsZV92ZWMpCXRiPSIkdGIgbWlwc2JzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYXBvbGxvY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtYXBvbGxvLmxvIiA7OwotICAgIGJfb3V0X3ZlY19iaWdfaG9zdCkJCXRiPSIkdGIgYm91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYl9vdXRfdmVjX2xpdHRsZV9ob3N0KQl0Yj0iJHRiIGJvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGJmZF9lbGY2NF9hbHBoYV92ZWMpCXRiPSIkdGIgZWxmNjQtYWxwaGEubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFyY192ZWMpCXRiPSIkdGIgZWxmMzItYXJjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMpCXRiPSIkdGIgZWxmYXJtLW5hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjKSB0Yj0iJHRiIGVsZmFybS1vYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FyY192ZWMpCXRiPSIkdGIgZWxmMzItYXJjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FybV92ZWMpCXRiPSIkdGIgZWxmYXJtLW5hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjKQl0Yj0iJHRiIGVsZmFybS1vYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYykgCXRiPSIkdGIgZWxmMzItZ2VuLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ21pcHNfdmVjKSAJdGI9IiR0YiBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYykgCXRiPSIkdGIgZWxmNjQtbWlwcy5sbyBlbGY2NC5sbyBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmMzJfZDEwdl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWQxMHYubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfZDMwdl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWQzMHYubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfZnIzMF92ZWMpCQl0Yj0iJHRiIGVsZjMyLWZyMzAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaHBwYV92ZWMpCQl0Yj0iJHRiIGVsZjMyLWhwcGEubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaTM4Nl92ZWMpCQl0Yj0iJHRiIGVsZjMyLWkzODYubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaTg2MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLWk4NjAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfaTk2MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLWk5NjAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjKSB0Yj0iJHRiIGVsZjMyLWdlbi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYykgCXRiPSIkdGIgZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX20zMnJfdmVjKQkJdGI9IiR0YiBlbGYzMi1tMzJyLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX202OGtfdmVjKQkJdGI9IiR0YiBlbGYzMi1tNjhrLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX204OGtfdmVjKQkJdGI9IiR0YiBlbGYzMi1tODhrLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMpCXRiPSIkdGIgZWxmMzItbWNvcmUubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbWNvcmVfbGl0dGxlX3ZlYykJdGI9IiR0YiBlbGYzMi1tY29yZS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tbjEwMjAwX3ZlYykJdGI9IiR0YiBlbGYtbTEwMjAwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21uMTAzMDBfdmVjKQl0Yj0iJHRiIGVsZi1tMTAzMDAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfcGpfdmVjKSAgICAgICAgICAgdGI9IiR0YiBlbGYzMi1wai5sbyBlbGYzMi5sbyAkZWxmIjs7Ci0gICAgYmZkX2VsZjMyX3BqbF92ZWMpICAgICAgICAgIHRiPSIkdGIgZWxmMzItcGoubG8gZWxmMzIubG8gJGVsZiI7OwotICAgIGJmZF9lbGYzMl9wb3dlcnBjX3ZlYykJdGI9IiR0YiBlbGYzMi1wcGMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYykJdGI9IiR0YiBlbGYzMi1wcGMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfc2hfdmVjKQkJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8iIDs7Ci0gICAgYmZkX2VsZjMyX3NobF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXNoLmxvIGVsZjMyLmxvICRlbGYgY29mZi1zaC5sbyIgOzsKLSAgICBiZmRfZWxmMzJfc3BhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLXNwYXJjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3Y4NTBfdmVjKQkJdGI9IiR0YiBlbGYzMi12ODUwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYykgCXRiPSIkdGIgZWxmNjQtZ2VuLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWMpIHRiPSIkdGIgZWxmNjQtZ2VuLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGY2NF9zcGFyY192ZWMpCXRiPSIkdGIgZWxmNjQtc3BhcmMubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgY2lzY29fY29yZV9iaWdfdmVjKQkJdGI9IiR0YiBjaXNjby1jb3JlLmxvIiA7OwotICAgIGNpc2NvX2NvcmVfbGl0dGxlX3ZlYykJdGI9IiR0YiBjaXNjby1jb3JlLmxvIiA7OwotICAgIGRlbW9fNjRfdmVjKQkJdGI9IiR0YiBkZW1vNjQubG8gYW91dDY0LmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBlY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIGNvZmYtbWlwcy5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iIDs7Ci0gICAgZWNvZmZfYmlnbGl0dGxlX3ZlYykJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYykJdGI9IiR0YiBjb2ZmLWFscGhhLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgZ28zMmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWdvMzIubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgZ28zMnN0dWJiZWRjb2ZmX3ZlYykJdGI9IiR0YiBjb2ZmLXN0Z28zMi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBoODMwMGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWg4MzAwLmxvIHJlbG9jMTYubG8iIDs7Ci0gICAgaDg1MDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1oODUwMC5sbyByZWxvYzE2LmxvIiA7OwotICAgIGhvc3RfYW91dF92ZWMpCQl0Yj0iJHRiIGhvc3QtYW91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaHAzMDBic2RfdmVjKQkJdGI9IiR0YiBocDMwMGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaHAzMDBocHV4X3ZlYykJCXRiPSIkdGIgaHAzMDBocHV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2YW91dF92ZWMpCQl0Yj0iJHRiIGkzODZhb3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2YnNkX3ZlYykJCXRiPSIkdGIgaTM4NmJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWkzODYubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaTM4NmR5bml4X3ZlYykJCXRiPSIkdGIgaTM4NmR5bml4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2ZnJlZWJzZF92ZWMpCQl0Yj0iJHRiIGkzODZmcmVlYnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bXNkb3NfdmVjKQkJdGI9IiR0YiBpMzg2bXNkb3MubG8iIDs7Ci0gICAgaTM4NnBlX3ZlYykJCQl0Yj0iJHRiIHBlLWkzODYubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZwZWlfdmVjKQkJdGI9IiR0YiBwZWktaTM4Ni5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaTM4NmxpbnV4X3ZlYykJCXRiPSIkdGIgaTM4NmxpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9hb3V0X3ZlYykJCXRiPSIkdGIgaTM4Nmx5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2YtaTM4Nmx5bngubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIGkzODZtYWNoM192ZWMpCQl0Yj0iJHRiIGkzODZtYWNoMy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm5ldGJzZF92ZWMpCQl0Yj0iJHRiIGkzODZuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZvczlrX3ZlYykJCXRiPSIkdGIgaTM4Nm9zOWsubG8gYW91dDMyLmxvIiA7OwotICAgIGk4NjBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pODYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGljb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtaTk2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWVlZV92ZWMpCQkJdGI9IiR0YiBpZWVlLmxvIiA7OwotICAgIG02OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtjb2ZmdW5fdmVjKQkJdGI9IiR0YiBjb2ZmLXU2OGsubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtsaW51eF92ZWMpCQl0Yj0iJHRiIG02OGtsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIG02OGtseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLW02OGtseW54LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgbTY4a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGtuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGs0a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGs0a25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2F1eF9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1hdXgubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtzeXN2Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc3ZtNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG04OGtiY3NfdmVjKQkJdGI9IiR0YiBjb2ZmLW04OGsubG8iIDs7Ci0gICAgbWNvcmVfcGVfYmlnX3ZlYykJCXRiPSIkdGIgcGUtbWNvcmUubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlX2xpdHRsZV92ZWMpCXRiPSIkdGIgcGUtbWNvcmUubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlaV9iaWdfdmVjKQkJdGI9IiR0YiBwZWktbWNvcmUubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIHBlaS1tY29yZS5sbyBwZWlnZW4ubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbmV3c29zM192ZWMpCQl0Yj0iJHRiIG5ld3NvczMubG8gYW91dDMyLmxvIiA7OwotICAgIG5sbTMyX2kzODZfdmVjKQkJdGI9IiR0YiBubG0zMi1pMzg2LmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBubG0zMl9zcGFyY192ZWMpCQl0Yj0iJHRiIG5sbTMyLXNwYXJjLmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBubG0zMl9hbHBoYV92ZWMpCQl0Yj0iJHRiIG5sbTMyLWFscGhhLmxvIG5sbTMyLmxvIG5sbS5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgcmlzY2l4X3ZlYykJCQl0Yj0iJHRiIGFvdXQzMi5sbyByaXNjaXgubG8iIDs7Ci0gICAgbmxtMzJfcG93ZXJwY192ZWMpCQl0Yj0iJHRiIG5sbTMyLXBwYy5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgcGM1MzJuZXRic2RfdmVjKQkJdGI9IiR0YiBuczMya25ldGJzZC5sbyBhb3V0LW5zMzJrLmxvIiA7OwotICAgIHBjNTMybWFjaGFvdXRfdmVjKQkJdGI9IiR0YiBwYzUzMi1tYWNoLmxvIGFvdXQtbnMzMmsubG8iIDs7Ci0gICAgcG1hY194Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtcG1hYy5sbyB4Y29mZmxpbmsubG8iIDs7Ci0gICAgcnM2MDAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtcnM2MDAwLmxvIHhjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfcG93ZXJwY19wZV92ZWMpICAgICAgICAgdGI9IiR0YiBwZS1wcGMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OyAgCi0gICAgYmZkX3Bvd2VycGNsZV9wZV92ZWMpICAgICAgIHRiPSIkdGIgcGUtcHBjLmxvIHBlaWdlbi5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjX3BlaV92ZWMpICAgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9wb3dlcnBjbGVfcGVpX3ZlYykgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gcGVpZ2VuLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHBwY2Jvb3RfdmVjKQkJdGI9IiR0YiBwcGNib290LmxvIiA7OwotICAgIHNoY29mZl92ZWMpCQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNoY29mZl9zbWFsbF92ZWMpCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc2hsY29mZl9zbWFsbF92ZWMpCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc29tX3ZlYykJCQl0Yj0iJHRiIHNvbS5sbyIgOzsKLSAgICBzcGFyY2xlX2FvdXRfdmVjKQkJdGI9IiR0YiBhb3V0LXNwYXJjbGUubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjbGludXhfdmVjKQkJdGI9IiR0YiBzcGFyY2xpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2x5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIHNwYXJjbHlueC5sbyBseW54LWNvcmUubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjbHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2Ytc3BhcmNseW54LmxvIGx5bngtY29yZS5sbyIgOzsKLSAgICBzcGFyY25ldGJzZF92ZWMpCQl0Yj0iJHRiIHNwYXJjbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXNwYXJjLmxvIiA7OwotICAgIHNyZWNfdmVjKQkJCXRiPSIkdGIgc3JlYy5sbyIgOzsKLSAgICBzdW5vc19iaWdfdmVjKQkJdGI9IiR0YiBzdW5vcy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3ltYm9sc3JlY192ZWMpCQl0Yj0iJHRiIHNyZWMubG8iIDs7Ci0gICAgdGVraGV4X3ZlYykJCQl0Yj0iJHRiIHRla2hleC5sbyIgOzsKLSAgICB0aWMzMF9hb3V0X3ZlYykJCXRiPSIkdGIgYW91dC10aWMzMC5sbyIgOzsKLSAgICB0aWMzMF9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi10aWMzMC5sbyIgOzsKLSAgICB0aWM4MGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXRpYzgwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHZlcnNhZG9zX3ZlYykJCXRiPSIkdGIgdmVyc2Fkb3MubG8iIDs7Ci0gICAgdm1zX2FscGhhX3ZlYykJCXRiPSIkdGIgdm1zLmxvIHZtcy1oZHIubG8gdm1zLWdzZC5sbyB2bXMtdGlyLmxvIHZtcy1taXNjLmxvIgotIAkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgdm1zX3ZheF92ZWMpCQl0Yj0iJHRiIHZtcy5sbyB2bXMtaGRyLmxvIHZtcy1nc2QubG8gdm1zLXRpci5sbyB2bXMtbWlzYy5sbyIgOzsKLSAgICB3NjVfdmVjKQkJCXRiPSIkdGIgY29mZi13NjUubG8gcmVsb2MxNi5sbyIgOzsKLSAgICB3ZTMya2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXdlMzJrLmxvIiA7OwotICAgIHo4a2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXo4ay5sbyByZWxvYzE2LmxvIiA7OwotCi0gICAgIiIpCQkJOzsKLSAgICAqKSBBQ19NU0dfRVJST1IoKioqIHVua25vd24gdGFyZ2V0IHZlY3RvciAkdmVjKSA7OwotICAgIGVzYWMKLWRvbmUKLQotIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotIyBBIGNvdXBsZSBvZiBDUFVzIHVzZSBzaG9ydGVyIGZpbGUgbmFtZXMgdG8gYXZvaWQgcHJvYmxlbXMgb24gRE9TCi0jIGZpbGVzeXN0ZW1zLgotdGE9YGVjaG8gJHNlbGFyY2hzIHwgc2VkIC1lIHMvYmZkXy9jcHUtL2cgLWUgcy9fYXJjaC8ubG8vZyAtZSBzL21uMTAyMDAvbTEwMjAwLyAtZSBzL21uMTAzMDAvbTEwMzAwL2AKLQotIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi1mPSIiCi1mb3IgaSBpbiAkdGIgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGI9IiRmIgotCi1mPSIiCi1mb3IgaSBpbiAkdGEgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotdGE9IiRmIgotCi1iZmRfYmFja2VuZHM9IiR0YiIKLWJmZF9tYWNoaW5lcz0iJHRhIgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHh0cnVlIDsgdGhlbgotICBiZmRfYmFja2VuZHM9IiR7YmZkX2JhY2tlbmRzfSInICQoQUxMX0JBQ0tFTkRTKScKLSAgYmZkX21hY2hpbmVzPSIke2JmZF9tYWNoaW5lc30iJyAkKEFMTF9NQUNISU5FUyknCi0gIHNlbHZlY3M9Ci0gIGhhdmV2ZWNzPQotICBzZWxhcmNocz0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICMgT25seSBzZXQgdGhlc2UgaWYgdGhleSB3aWxsIGJlIG5vbmVtcHR5LCBmb3IgdGhlIGNsZXZlciBlY2hvLgotICBoYXZldmVjcz0KLSAgdGVzdCAtbiAiJHNlbHZlY3MiICYmCi0gICAgaGF2ZXZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi8tREhBVkVfLycgLWUgJ3MvIFwoLlwpLyAtREhBVkVfXDEvZydgCi0gIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgotICAgIHNlbHZlY3M9YGVjaG8gJHNlbHZlY3MgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKLSAgdGVzdCAtbiAiJHNlbGFyY2hzIiAmJgotICAgIHNlbGFyY2hzPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSAncy9eL1wmLycgLWUgJ3MvIFwoLlwpLyxcJlwxL2cnYAotZmkJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0KLWNhc2UgJHtob3N0NjR9LSR7dGFyZ2V0NjR9LSR7d2FudDY0fSBpbgotICAqdHJ1ZSopCi0gICAgd29yZHNpemU9NjQKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZENjRfQkFDS0VORFMpICQoQkZEMzJfQkFDS0VORFMpJwotICAgIGlmIHRlc3QgLXogIiRHQ0MiICYmIHRlc3QgIiRCRkRfSE9TVF82NEJJVF9MT05HIiA9ICIwIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRfQklUX0RFRklORUQiID0gIjAiOyB0aGVuCi0gICAgICBBQ19NU0dfV0FSTihbWW91IGhhdmUgcmVxdWVzdGVkIGEgNjQgYml0IEJGRCBjb25maWd1cmF0aW9uLCBidXRdKQotICAgICAgQUNfTVNHX1dBUk4oW3lvdXIgY29tcGlsZXIgbWF5IG5vdCBoYXZlIGEgNjQgYml0IGludGVncmFsIHR5cGVdKQotICAgIGZpCi0gICAgOzsKLSAgZmFsc2UtZmFsc2UtZmFsc2UpCi0gICAgd29yZHNpemU9MzIKLSAgICBhbGxfYmFja2VuZHM9JyQoQkZEMzJfQkFDS0VORFMpJwotICAgIDs7Ci1lc2FjCi0KLUFDX1NVQlNUKHdvcmRzaXplKQotQUNfU1VCU1QoYWxsX2JhY2tlbmRzKQotQUNfU1VCU1QoYmZkX2JhY2tlbmRzKQotQUNfU1VCU1QoYmZkX21hY2hpbmVzKQotCi10ZGVmYXVsdHM9IiIKLXRlc3QgLW4gIiR7ZGVmdmVjfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURERUZBVUxUX1ZFQ1RPUj0ke2RlZnZlY30iCi10ZXN0IC1uICIke3NlbHZlY3N9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAtRFNFTEVDVF9WRUNTPScke3NlbHZlY3N9JyIKLXRlc3QgLW4gIiR7c2VsYXJjaHN9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAtRFNFTEVDVF9BUkNISVRFQ1RVUkVTPScke3NlbGFyY2hzfSciCi10ZXN0IC1uICIke2hhdmV2ZWNzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gJHtoYXZldmVjc30iCi1BQ19TVUJTVCh0ZGVmYXVsdHMpCi0KLWRubCBBQ19DSEVDS19IRUFERVJTKHN5cy9tbWFuLmgpCi1BQ19GVU5DX01NQVAKLUFDX0NIRUNLX0ZVTkNTKG1hZHZpc2UgbXByb3RlY3QpCi1jYXNlICR7d2FudF9tbWFwfSske2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWR9IGluCi0gIHRydWUreWVzICkgIEFDX0RFRklORShVU0VfTU1BUCwgMSwgW1VzZSBtbWFwIGlmIGl0J3MgYXZhaWxhYmxlP10pIDs7Ci1lc2FjCi0KLXJtIC1mIGRvYy9jb25maWcuc3RhdHVzCi1BQ19PVVRQVVQoTWFrZWZpbGUgZG9jL01ha2VmaWxlIGJmZC1pbjMuaDpiZmQtaW4yLmggcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKLVtzZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGVdKQpkaWZmIC0tZ2l0IGEvYmZkL2NvcmVmaWxlLmMgYi9iZmQvY29yZWZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyZjUxOS4uMDAwMDAwMAotLS0gYS9iZmQvY29yZWZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiBDb3JlIGZpbGUgZ2VuZXJpYyBpbnRlcmZhY2Ugcm91dGluZXMgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JQ29yZSBmaWxlcwotCi1ERVNDUklQVElPTgotCVRoZXNlIGFyZSBmdW5jdGlvbnMgcGVydGFpbmluZyB0byBjb3JlIGZpbGVzLgotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0KLVNZTk9QU0lTCi0JQ09OU1QgY2hhciAqYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSByZWFkLW9ubHkgc3RyaW5nIGV4cGxhaW5pbmcgd2hpY2ggcHJvZ3JhbSB3YXMgcnVubmluZwotCXdoZW4gaXQgZmFpbGVkIGFuZCBwcm9kdWNlZCB0aGUgY29yZSBmaWxlIEB2YXJ7YWJmZH0uCi0KLSovCi0KLUNPTlNUIGNoYXIgKgotYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfY29yZSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCwgKGFiZmQpKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotCi1TWU5PUFNJUwotCWludCBiZmRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJucyB0aGUgc2lnbmFsIG51bWJlciB3aGljaCBjYXVzZWQgdGhlIGNvcmUgZHVtcCB3aGljaAotCWdlbmVyYXRlZCB0aGUgZmlsZSB0aGUgQkZEIEB2YXJ7YWJmZH0gaXMgYXR0YWNoZWQgdG8uCi0qLwotCi1pbnQKLWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfY29yZSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsLCAoYWJmZCkpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCi1TWU5PUFNJUwotCWJvb2xlYW4gY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0JCShiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gPDx0cnVlPj4gaWYgdGhlIGNvcmUgZmlsZSBhdHRhY2hlZCB0byBAdmFye2NvcmVfYmZkfQotCXdhcyBnZW5lcmF0ZWQgYnkgYSBydW4gb2YgdGhlIGV4ZWN1dGFibGUgZmlsZSBhdHRhY2hlZCB0bwotCUB2YXJ7ZXhlY19iZmR9LCA8PGZhbHNlPj4gb3RoZXJ3aXNlLgotKi8KLWJvb2xlYW4KLWNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gICAgaWYgKChjb3JlX2JmZC0+Zm9ybWF0ICE9IGJmZF9jb3JlKSB8fCAoZXhlY19iZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSkgewotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgIHJldHVybiBCRkRfU0VORCAoY29yZV9iZmQsIF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AsCi0JCSAgICAgKGNvcmVfYmZkLCBleGVjX2JmZCkpOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hMjlrLmMgYi9iZmQvY3B1LWEyOWsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkMjVhNC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWEyOWsuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgQU1EIDI5MDAwIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hMjlrX2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9hMjlrLAotICAgIDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgImEyOWsiLAotICAgICJhMjlrIiwKLSAgICA0LAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hbHBoYS5jIGIvYmZkL2NwdS1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODk5MDBiLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgQWxwaGEgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIE4oQklUU19XT1JELCBCSVRTX0FERFIsIE5VTUJFUiwgUFJJTlQsIERFRkFVTFQsIE5FWFQpIFwKLSAgewkJCQkJCQlcCi0gICAgQklUU19XT1JELCAvKiBiaXRzIGluIGEgd29yZCAqLwkJCVwKLSAgICBCSVRTX0FERFIsIC8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwkJCVwKLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkJCVwKLSAgICBiZmRfYXJjaF9hbHBoYSwJCQkJCVwKLSAgICBOVU1CRVIsCQkJCQkJXAotICAgICJhbHBoYSIsCQkJCQkJXAotICAgIFBSSU5ULAkJCQkJCVwKLSAgICAzLAkJCQkJCQlcCi0gICAgREVGQVVMVCwJCQkJCQlcCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQkJCVwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAkJCQkJXAotICAgIE5FWFQsCQkJCQkJXAotICB9Ci0KLSNkZWZpbmUgTk4oaW5kZXgpICgmYXJjaF9pbmZvX3N0cnVjdFtpbmRleF0pCi0KLS8qIFRoZXNlIGV4aXN0IG9ubHkgc28gdGhhdCB3ZSBjYW4gcmVzb25hYmx5IGRpc2Fzc2VtYmxlIFBBTGNvZGUuICAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9hbHBoYV9ldjQsICJhbHBoYTpldjQiLCBmYWxzZSwgTk4oMSkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX2FscGhhX2V2NSwgImFscGhhOmV2NSIsIGZhbHNlLCBOTigyKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfYWxwaGFfZXY2LCAiYWxwaGE6ZXY2IiwgZmFsc2UsIDApLAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hbHBoYV9hcmNoID0KLSAgTiAoNjQsIDY0LCAwLCAiYWxwaGEiLCB0cnVlLCBOTigwKSk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LWFyYy5jIGIvYmZkL2NwdS1hcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlNTlkNC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBBUkMgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgQVJDKG1hY2gsIHByaW50X25hbWUsIGRlZmF1bHRfcCwgbmV4dCkgXAotewkJCQkJXAotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwkJXAotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JXAotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCVwKLSAgICBiZmRfYXJjaF9hcmMsCQkJXAotICAgIG1hY2gsCQkJCVwKLSAgICAiYXJjIiwJCQkJXAotICAgIHByaW50X25hbWUsCQkJCVwKLSAgICA0LCAvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwlcCi0gICAgZGVmYXVsdF9wLAkJCQlcCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQlcCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwJCQlcCi0gICAgbmV4dCwJCQkJXAotICB9Ci0KLSNpZiAwIC8qID8/PyBOb3QgY3VycmVudGx5IG5lZWRlZCwgYnV0IGtlZXAgaW4gZm9yIGZ1dHVyZSByZWZlcmVuY2UuICAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQotewotICBBUkMgKGJmZF9tYWNoX2FyY19mb28sICJhcmMtZm9vIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgQVJDIChiZmRfbWFjaF9hcmNfYmFyLCAiYXJjLWJhciIsIGZhbHNlLCAwKSwKLX07Ci0jZW5kaWYKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hcmNfYXJjaCA9Ci0gIEFSQyAoYmZkX21hY2hfYXJjX2Jhc2UsICJhcmMtYmFzZSIsIHRydWUsIDAgLyomYXJjaF9pbmZvX3N0cnVjdFswXSovKTsKLQwKLS8qIFV0aWxpdHkgcm91dGluZXMuICAqLwotCi0vKiBHaXZlbiBjcHUgdHlwZSBOQU1FLCByZXR1cm4gaXRzIGJmZF9tYWNoX2FyY194eHggdmFsdWUuCi0gICBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZC4gICovCi0KLWludAotYXJjX2dldF9tYWNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnA7Ci0KLSAgZm9yIChwID0gJmJmZF9hcmNfYXJjaDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICAvKiArNDogc2tpcCBvdmVyICJhcmMtIiAqLwotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgcC0+cHJpbnRhYmxlX25hbWUgKyA0KSA9PSAwKQotCXJldHVybiBwLT5tYWNoOwotICAgIH0KLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hcm0uYyBiL2JmZC9jcHUtYXJtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTljNDQuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEFSTSBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHNjYW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgd29ya3Mgb3V0IHdoaWNoIEFSTQotICAgbWFjaGluZSB3aGljaCB3b3VsZCBiZSBjb21wYXRpYmxlIHdpdGggYm90aCBhbmQgcmV0dXJucyBhIHBvaW50ZXIKLSAgIHRvIGl0cyBpbmZvIHN0cnVjdHVyZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYjsKLXsKLSAgLyogSWYgYSAmIGIgYXJlIGZvciBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlIHdlIGNhbiBkbyBub3RoaW5nICovCi0gIGlmIChhLT5hcmNoICE9IGItPmFyY2gpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAvKiBJZiBhICYgYiBhcmUgZm9yIHRoZSBzYW1lIG1hY2hpbmUgdGhlbiBhbGwgaXMgd2VsbCAqLwotICBpZiAoYS0+bWFjaCA9PSBiLT5tYWNoKQotICAgIHJldHVybiBhOwotCi0gIC8qIE90aGVyd2lzZSBpZiBlaXRoZXIgYSBvciBiIGlzIHRoZSAnZGVmYXVsdCcgbWFjaGluZSB0aGVuCi0gICAgIGl0IGNhbiBiZSBwb2x5bW9ycGhlZCBpbnRvIHRoZSBvdGhlciAqLwotICBpZiAoYS0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIGI7Ci0gIAotICBpZiAoYi0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIGE7Ci0KLSAgLyogU28gZmFyIGFsbCBuZXdlciBBUk0gYXJjaGl0ZWN0dXJlIGNvcmVzIGFyZSBzdXBlcnNldHMgb2YgcHJldmlvdXMgY29yZXMgKi8KLSAgaWYgKGEtPm1hY2ggPCBiLT5tYWNoKQotICAgIHJldHVybiBiOwotICBlbHNlIGlmIChhLT5tYWNoID4gYi0+bWFjaCkKLSAgICByZXR1cm4gYTsKLQotICAvKiBOZXZlciByZWFjaGVkISAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdAotewotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgY2hhciAqICAgICAgICAgICAgICAgIG5hbWU7Ci19Ci1wcm9jZXNzb3JzW10gPQotewotICB7IGJmZF9tYWNoX2FybV8yLCAgImFybTIiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8yYSwgImFybTI1MCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8yYSwgImFybTMiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYwIiAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYwMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTciICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTcxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTc1MDAiICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTdkIiAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTdkaSIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zTSwgImFybTdkbSIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zTSwgImFybTdkbWkiICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTd0ZG1pIiB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTgiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTgxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTkiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTkyMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTkyMHQiICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTl0ZG1pIiB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInNhMSIgICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInN0cm9uZ2FybSJ9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInN0cm9uZ2FybTExMCIgfSwKLSAgeyBiZmRfbWFjaF9hcm1fNCwgICJzdHJvbmdhcm0xMTAwIiB9LAotfTsKLQotc3RhdGljIGJvb2xlYW4gCi1zY2FuIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogaW5mbzsKLSAgICAgY29uc3QgY2hhciAqIHN0cmluZzsKLXsKLSAgaW50ICBpOwotCi0gIC8qIEZpcnN0IHRlc3QgZm9yIGFuIGV4YWN0IG1hdGNoICovCi0gIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIGluZm8tPnByaW50YWJsZV9uYW1lKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE5leHQgY2hlY2sgZm9yIGEgcHJvY2Vzc29yIG5hbWUgaW5zdGVhZCBvZiBhbiBBcmNoaXRlY3R1cmUgbmFtZSAqLwotICBmb3IgKGkgPSBzaXplb2YgKHByb2Nlc3NvcnMpIC8gc2l6ZW9mIChwcm9jZXNzb3JzWzBdKTsgaS0tOykKLSAgICB7Ci0gICAgICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBwcm9jZXNzb3JzWyBpIF0ubmFtZSkgPT0gMCkKLQlicmVhazsKLSAgICB9Ci0KLSAgaWYgKGkgIT0gLTEgJiYgaW5mby0+YXJjaCA9PSBwcm9jZXNzb3JzWyBpIF0uYXJjaCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaW5hbGx5IGNoZWNrIGZvciB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgKi8KLSAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZywgImFybSIpID09IDApCi0gICAgcmV0dXJuIGluZm8tPnRoZV9kZWZhdWx0OwotICAKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLSNkZWZpbmUgTihudW1iZXIsIHByaW50LCBkZWZhdWx0LCBuZXh0KSAgXAoteyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9hcm0sIG51bWJlciwgImFybSIsIHByaW50LCA0LCBkZWZhdWx0LCBjb21wYXRpYmxlLCBzY2FuLCBuZXh0IH0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQoteyAKLSAgTiggYmZkX21hY2hfYXJtXzIsICAiYXJtdjIiLCAgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFsxXSApLAotICBOKCBiZmRfbWFjaF9hcm1fMmEsICJhcm12MmEiLCBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzJdICksCi0gIE4oIGJmZF9tYWNoX2FybV8zLCAgImFybXYzIiwgIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbM10gKSwKLSAgTiggYmZkX21hY2hfYXJtXzNNLCAiYXJtdjNtIiwgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFs0XSApLAotICBOKCBiZmRfbWFjaF9hcm1fNCwgICJhcm12NCIsICBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzVdICksCi0gIE4oIGJmZF9tYWNoX2FybV80VCwgImFybXY0dCIsIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbNl0gKSwKLSAgTiggYmZkX21hY2hfYXJtXzUsICAiYXJtdjUiLCAgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFs3XSApLAotICBOKCBiZmRfbWFjaF9hcm1fNVQsICJhcm12NXQiLCBmYWxzZSwgTlVMTCApCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FybV9hcmNoID0KLSAgTiggMCwgImFybSIsIHRydWUsICYgYXJjaF9pbmZvX3N0cnVjdFswXSApOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1kMTB2LmMgYi9iZmQvY3B1LWQxMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2YzNiNy4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWQxMHYuYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgRDEwViBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGQxMHZfdHMzX2luZm8gPSAKLXsJCQkJCQotICAxNiwJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8JCQotICAxNiwJLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCQotICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkKLSAgYmZkX2FyY2hfZDEwdiwKLSAgYmZkX21hY2hfZDEwdl90czMsCQkKLSAgImQxMHYiLAkJCQkKLSAgImQxMHY6dHMzIiwJCQkJCi0gIDQsIC8qIHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyICovCQotICBmYWxzZSwJCQkJCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJCi0gIGJmZF9kZWZhdWx0X3NjYW4sCQkJCi0gIDAsCQkJCQotfTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBkMTB2X3RzMl9pbmZvID0gCi17Ci0gIDE2LAkvKiAxNiBiaXRzIGluIGEgd29yZCAqLwkJCi0gIDE2LAkvKiAxNiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCQotICBiZmRfYXJjaF9kMTB2LAotICBiZmRfbWFjaF9kMTB2X3RzMiwJCQotICAiZDEwdiIsCQkJCQotICAiZDEwdjp0czIiLAkJCQkKLSAgNCwgLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8JCi0gIGZhbHNlLAkJCQkKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQkKLSAgYmZkX2RlZmF1bHRfc2NhbiwJCQkKLSAgJmQxMHZfdHMzX2luZm8sCQkJCQotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMTB2X2FyY2ggPSAKLXsJCQkJCQotICAxNiwJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8JCQotICAxNiwJLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCQotICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkKLSAgYmZkX2FyY2hfZDEwdiwKLSAgYmZkX21hY2hfZDEwdiwJCQotICAiZDEwdiIsCQkJCQotICAiZDEwdiIsCQkJCQotICA0LCAvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwkKLSAgdHJ1ZSwJCQkJCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJCi0gIGJmZF9kZWZhdWx0X3NjYW4sCQkJCi0gICZkMTB2X3RzMl9pbmZvLAkJCQkKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWQzMHYuYyBiL2JmZC9jcHUtZDMwdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWFkZmVlLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtZDMwdi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNaXRzdWJpc2hpIEQzMFYgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMzB2X2FyY2ggPQotewotICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX2QzMHYsCi0gICAgMCwKLSAgICAiZDMwdiIsCi0gICAgImQzMHYiLAotICAgIDQsIC8qIHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyICovCi0gICAgdHJ1ZSwKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWZyMzAuYyBiL2JmZC9jcHUtZnIzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzIwOGY4Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtZnIzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBGUjMwIHByb2Nlc3Nvci4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZnIzMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIGJpdHMgcGVyIHdvcmQgKi8KLSAgMzIsCQkJCS8qIGJpdHMgcGVyIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogYml0cyBwZXIgYnl0ZSAqLwotICBiZmRfYXJjaF9mcjMwLAkJLyogYXJjaGl0ZWN0dXJlICovCi0gIGJmZF9tYWNoX2ZyMzAsCQkvKiBtYWNoaW5lICovCi0gICJmcjMwIiwJCQkvKiBhcmNoaXRlY3R1cmUgbmFtZSAqLwotICAiZnIzMCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgNCwJCQkJLyogc2VjdGlvbiBhbGlnbiBwb3dlciAqLwotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCA/ICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCS8qIGFyY2hpdGVjdHVyZSBjb21wYXJpc29uIGZuICovCi0gIGJmZF9kZWZhdWx0X3NjYW4sCQkvKiBzdHJpbmcgdG8gYXJjaGl0ZWN0dXJlIGNvbnZlcnQgZm4gKi8KLSAgTlVMTAkJCQkvKiBuZXh0IGluIGxpc3QgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWg4MzAwLmMgYi9iZmQvY3B1LWg4MzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2I3ZGYuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1oODMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBIaXRhY2hpIEg4LzMwMCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotaW50IGJmZF9kZWZhdWx0X3NjYW5fbnVtX21hY2ggKCk7Ci0KLXN0YXRpYyBib29sZWFuCi1oODMwMF9zY2FuIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmICgqc3RyaW5nICE9ICdoJyAmJiAqc3RyaW5nICE9ICdIJykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nICE9ICc4JykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nID09ICcvJykKLSAgICBzdHJpbmcrKzsKLQotICBpZiAoKnN0cmluZyAhPSAnMycpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJpbmcrKzsKLSAgaWYgKCpzdHJpbmcgIT0gJzAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nICE9ICcwJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmluZysrOwotICBpZiAoKnN0cmluZyA9PSAnLScpCi0gICAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nID09ICdoJyB8fCAqc3RyaW5nID09ICdIJykKLSAgICB7Ci0gICAgICByZXR1cm4gKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaDgzMDBoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCpzdHJpbmcgPT0gJ3MnIHx8ICpzdHJpbmcgPT0gJ1MnKQotICAgIHsKLSAgICAgIHJldHVybiAoaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9oODMwMHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBpbmZvLT5tYWNoID09IGJmZF9tYWNoX2g4MzAwOwotICAgIH0KLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgdHdvIGFyY2hfaW5mb3MgYW5kIHdvcmtzIG91dCB0aGUgCi0gICBtYWNoaW5lIHdoaWNoIHdvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBib3RoIGFuZCByZXR1cm5zIGEgcG9pbnRlcgotICAgdG8gaXRzIGluZm8gc3RydWN0dXJlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoaW4sIG91dCkKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogaW47Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIG91dDsKLXsKLSAgLyogSXQncyByZWFsbHkgbm90IGEgZ29vZCBpZGVhIHRvIG1peCBhbmQgbWF0Y2ggbW9kZXMuICAqLwotICBpZiAoaW4tPm1hY2ggIT0gb3V0LT5tYWNoKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuIGluOwotfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGg4MzAwX2luZm9fc3RydWN0ID0KLXsKLSAgMTYsCQkJCS8qIDE2IGJpdHMgaW4gYSB3b3JkICovCi0gIDE2LAkJCQkvKiAxNiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODMwMCwKLSAgYmZkX21hY2hfaDgzMDAsCi0gICJoODMwMCIsCQkJLyogYXJjaF9uYW1lICAqLwotICAiaDgzMDAiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgY29tcGF0aWJsZSwKLSAgaDgzMDBfc2NhbiwKLS8qICAgIGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgKi8KLSAgMCwKLX07Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgaDgzMDBoX2luZm9fc3RydWN0ID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODMwMCwKLSAgYmZkX21hY2hfaDgzMDBoLAotICAiaDgzMDBoIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICJoODMwMGgiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIGZhbHNlLAkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgY29tcGF0aWJsZSwKLSAgaDgzMDBfc2NhbiwKLS8qICAgIGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgKi8KLSAgJmg4MzAwX2luZm9fc3RydWN0LAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODMwMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODMwMCwKLSAgYmZkX21hY2hfaDgzMDBzLAotICAiaDgzMDBzIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICJoODMwMHMiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIGZhbHNlLAkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgY29tcGF0aWJsZSwKLSAgaDgzMDBfc2NhbiwKLS8qICAgIGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCwgKi8KLSAgJmg4MzAwaF9pbmZvX3N0cnVjdCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWg4NTAwLmMgYi9iZmQvY3B1LWg4NTAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTQyZTMuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1oODUwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBIOC81MDAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmIDAKLQotLyogCi1SZWxvY2F0aW9ucyBmb3IgdGhlIFo4SwotCi0qLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvMTZfY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCSAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0KLSAgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOwotCi0gIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKLQotICBiZmRfcHV0XzE2KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIAotaG93dG84X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF84KGFiZmQsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLQotICBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOChhYmZkLCB4LCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvOF9GRm5uX2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgICAgICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0gIGxvbmcgeCA9IGJmZF9nZXRfOChhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIGFib3J0KCk7Ci0gIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF84KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvOF9wY3JlbF9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgeCA9IGJmZF9nZXRfOChhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIGFib3J0KCk7Ci0gIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF84KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzE2Ci0gID0gTkVXSE9XVE8oaG93dG8xNl9jYWxsYmFjaywiYWJzMTYiLDEsZmFsc2UsZmFsc2UpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOAotICA9IE5FV0hPV1RPKGhvd3RvOF9jYWxsYmFjaywiYWJzOCIsMCxmYWxzZSxmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzhfRkZubgotICA9IE5FV0hPV1RPKGhvd3RvOF9GRm5uX2NhbGxiYWNrLCJmZjAwK2FiczgiLDAsZmFsc2UsZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184X3BjcmVsCi0gID0gTkVXSE9XVE8oaG93dG84X3BjcmVsX2NhbGxiYWNrLCJwY3JlbDgiLDAsZmFsc2UsdHJ1ZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhcmNoLCBjb2RlKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkgewotICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICByZXR1cm4gJmhvd3RvXzE2OwotICBjYXNlIEJGRF9SRUxPQ184X0ZGbm46Ci0gICAgcmV0dXJuICZob3d0b184X0ZGbm47Ci0gIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgcmV0dXJuICZob3d0b184OwotICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOgotICAgIHJldHVybiAmaG93dG9fOF9wY3JlbDsKLSAgfQotICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKilOVUxMOwotfQotI2VuZGlmCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7Ci0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmNtcChzdHJpbmcsImg4LzUwMCIpID09IDApIHJldHVybiB0cnVlOwotICBpZiAoc3RyY21wKHN0cmluZywiSDgvNTAwIikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIGlmIChzdHJjbXAoc3RyaW5nLCJoODUwMCIpID09IDApIHJldHVybiB0cnVlOwotICBpZiAoc3RyY21wKHN0cmluZywiSDg1MDAiKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLSNpZiAwIC8qIG5vdCB1c2VkIGN1cnJlbnRseSAqLwotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCByZXR1cm5zIHdoZXRoZXIKLSAgIHRoZXknZCBiZSBjb21wYXRpYmxlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCB8fCBhLT5tYWNoICE9IGItPm1hY2gpCi0gICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGE7Ci19Ci0jZW5kaWYKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODUwMF9hcmNoID0KLXsKLSAgMTYsCQkJCS8qIDE2IGJpdHMgaW4gYSB3b3JkICovCi0gIDI0LAkJCQkvKiAyNCBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9oODUwMCwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgImg4NTAwIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICJoODUwMCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgMSwKLSAgdHJ1ZSwJCQkJLyogdGhlIGRlZmF1bHQgbWFjaGluZSAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICBzY2FuX21hY2gsCi0gIDAsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1ocHBhLmMgYi9iZmQvY3B1LWhwcGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxNzc0My4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWhwcGEuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgSFAgUHJlY2lzaW9uIEFyY2hpdGVjdHVyZSBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGExMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9ocHBhLAotICAxMCwJCQkJLyogQnkgY29udmVudGlvbiBQQTEuMCA9IDEwICovCi0gICJocHBhIiwKLSAgImhwcGExLjAiLAotICAzLAotICB0cnVlLAkJCQkvKiBVbmxlc3Mgd2UgdXNlIDEuMSBzcGVjaWZpYyBmZWF0dXJlcyAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gIDAsCi19OwotCi0vKiBQQTIuMCBpbiBuYXJyb3cgbW9kZSAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaHBwYTIwX2FyY2ggPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2hwcGEsCi0gIDIwLAkJCQkvKiBCeSBjb252ZW50aW9uIFBBMS4wID0gMTAgKi8KLSAgImhwcGEiLAotICAiaHBwYTIuMCIsCi0gIDMsCi0gIGZhbHNlLAkJCS8qIFVubGVzcyB3ZSB1c2UgMS4xIHNwZWNpZmljIGZlYXR1cmVzICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgJmJmZF9ocHBhMTBfYXJjaCwKLX07Ci0KLS8qIFBBMi4wIGluIHdpZGUgbW9kZSAqLwotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaHBwYTIwd19hcmNoID0KLXsKLSAgNjQsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDY0LAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9ocHBhLAotICAyNSwJCQkJLyogPz8/IEhvdyBiZXN0IHRvIGRlc2NyaWJlIHdpZGUgbW9kZSBoZXJlPyAgKi8KLSAgImhwcGEiLAotICAiaHBwYTIuMHciLAotICAzLAotICBmYWxzZSwJCQkvKiBVbmxlc3Mgd2UgdXNlIDEuMSBzcGVjaWZpYyBmZWF0dXJlcyAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICZiZmRfaHBwYTIwX2FyY2gsCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGFfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaHBwYSwKLSAgMTEsCQkJCS8qIEJ5IGNvbnZlbnRpb24gUEExLjEgPSAxMSAqLwotICAiaHBwYSIsCi0gICJocHBhMS4xIiwKLSAgMywKLSAgZmFsc2UsCQkJLyogMS4xIHNwZWNpZmljIGZlYXR1cmVzIHVzZWQgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmYmZkX2hwcGEyMHdfYXJjaCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWkzODYuYyBiL2JmZC9jcHUtaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWI5YjE4Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBJbnRlbCAzODYgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTIsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTM4Nl9hcmNoX2ludGVsX3N5bnRheCA9Ci17Ci0gIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaTM4NiwKLSAgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCwKLSAgImkzODY6aW50ZWwiLAotICAiaTM4NjppbnRlbCIsCi0gIDMsCi0gIHRydWUsCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgMCwKLX07Ci1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGk4MDg2X2FyY2ggPQotewotICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAod2VsbCwgbm90IHJlYWxseSkgKi8KLSAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9pMzg2LAotICBiZmRfbWFjaF9pMzg2X2k4MDg2LAotICAiaTgwODYiLAotICAiaTgwODYiLAotICAzLAotICBmYWxzZSwKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmYmZkX2kzODZfYXJjaF9pbnRlbF9zeW50YXgsCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzODZfYXJjaCA9Ci17Ci0gIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaTM4NiwKLSAgYmZkX21hY2hfaTM4Nl9pMzg2LAotICAiaTM4NiIsCi0gICJpMzg2IiwKLSAgMywKLSAgdHJ1ZSwKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmaTgwODZfYXJjaCwKLX07Ci0KZGlmZiAtLWdpdCBhL2JmZC9jcHUtaTg2MC5jIGIvYmZkL2NwdS1pODYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Yzg2N2MuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1pODYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEludGVsIDg2MCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5MiwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENyZWF0ZWQgbW9zdGx5IGJ5IHN1YnN0aXR1dGluZyAiODYwIiBmb3IgIjM4NiIgaW4gY3B1LWkzODYuYwotICAgSGFycnkgRG9sYW4gPGRvbGFuQHNzZC5pbnRlbC5jb20+LCBPY3RvYmVyIDE5OTUKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTg2MF9hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfaTg2MCwKLSAgICAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJpODYwIiwKLSAgICAiaTg2MCIsCi0gICAgMywKLSAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgMCwKLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaTk2MC5jIGIvYmZkL2NwdS1pOTYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjJjN2UuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1pOTYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGk5NjAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIGEgc3RyaW5nLCBhbmQgdHJpZXMgdG8gd29yayBvdXQgaWYgaXQKLSAgIGNvdWxkIHBvc3NpYmx5IHJlZmVyIHRvIHRoZSBpOTYwIG1hY2hpbmUgcG9pbnRlZCBhdCBpbiB0aGUKLSAgIGluZm9fc3RydWN0IHBvaW50ZXIgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNjYW5fOTYwX21hY2ggKGFwLCBzdHJpbmcpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXA7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotCi0gIC8qIExvb2sgZm9yIHRoZSBzdHJpbmcgaTk2MCwgb3Igc29tZXN1Y2ggYXQgdGhlIGZyb250IG9mIHRoZSBzdHJpbmcgICovCi0KLSAgaWYgKHN0cm5jbXAoImk5NjAiLHN0cmluZyw0KSA9PSAwKSB7Ci0gICAgc3RyaW5nKz00OwotICB9Ci0gIGVsc2UgewotICAgIC8qIG5vIG1hdGNoLCBjYW4gYmUgdXMgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHN0cmluZ1swXSA9PSAwKSB7Ci0gICAgLyogaTk2MCBvbiBpdCdzIG93biBtZWFucyBjb3JlIHRvIHVzKi8KLSAgICBpZiAoYXAtPm1hY2ggPT0gYmZkX21hY2hfaTk2MF9jb3JlKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoc3RyaW5nWzBdICE9ICc6JykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzdHJpbmcrKzsKLSAgaWYgKHN0cmluZ1swXSA9PSAnXDAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHN0cmluZ1swXSA9PSAnYycgJiYgc3RyaW5nWzFdID09ICdvJyAmJiBzdHJpbmdbMl0gPT0gJ3InICYmCi0gICAgICBzdHJpbmdbM10gPT0gJ2UnICYmIHN0cmluZ1s0XSA9PSAnXDAnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NvcmU7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc3RyaW5nLCAia2Ffc2EiKSA9PSAwKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOwotICBlbHNlIGlmIChzdHJjbXAgKHN0cmluZywgImtiX3NiIikgPT0gMCkKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYl9zYjsKLSAgZWxzZSBpZiAoc3RyaW5nWzFdID09ICdcMCcgfHwgc3RyaW5nWzJdICE9ICdcMCcpIC8qIHJlc3QgYXJlIDItY2hhciAqLwotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdrJyAmJiBzdHJpbmdbMV0gPT0gJ2InKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2tiX3NiOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ3MnICYmIHN0cmluZ1sxXSA9PSAnYicpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Jfc2I7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnbScgJiYgc3RyaW5nWzFdID09ICdjJykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9tYzsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICd4JyAmJiBzdHJpbmdbMV0gPT0gJ2EnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX3hhOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2MnICYmIHN0cmluZ1sxXSA9PSAnYScpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY2E7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnaycgJiYgc3RyaW5nWzFdID09ICdhJykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYV9zYTsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdzJyAmJiBzdHJpbmdbMV0gPT0gJ2EnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2onICYmIHN0cmluZ1sxXSA9PSAneCcpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfang7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnaCcgJiYgc3RyaW5nWzFdID09ICd4JykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9oeDsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG1hY2hpbmUgPT0gYXAtPm1hY2gpICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgd29ya3Mgb3V0IHRoZSBpOTYwCi0gICBtYWNoaW5lIHdoaWNoIHdvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBib3RoIGFuZCByZXR1cm5zIGEgcG9pbnRlcgotICAgdG8gaXRzIGluZm8gc3RydWN0dXJlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLQotICAvKiBUaGUgaTk2MCBoYXMgZGlzdGluY3Qgc3Vic3BlY2llcyB3aGljaCBtYXkgbm90IGludGVyYnJlZWQ6Ci0JQ09SRSBDQSAgICAgICAgICAKLQlDT1JFIEtBIEtCIE1DIFhBCi0JQ09SRSBIWCBKWAotICAgICBBbnkgYXJjaGl0ZWN0dXJlIG9uIHRoZSBzYW1lIGxpbmUgaXMgY29tcGF0aWJsZSwgdGhlIG9uZSBvbgotICAgICB0aGUgcmlnaHQgaXMgdGhlIGxlYXN0IHJlc3RyaWN0aXZlLiAgCi0gICAgIAotICAgICBXZSByZXByZXNlbnQgdGhpcyBpbmZvcm1hdGlvbiBpbiBhbiBhcnJheSwgZWFjaCBtYWNoaW5lIHRvIGEgc2lkZSAqLwotCi0jZGVmaW5lIEVSUk9SCTAKLSNkZWZpbmUgQ09SRQliZmRfbWFjaF9pOTYwX2NvcmUgIC8qMSovICAKLSNkZWZpbmUgS0EgCWJmZF9tYWNoX2k5NjBfa2Ffc2EgLyoyKi8gCi0jZGVmaW5lIEtCIAliZmRfbWFjaF9pOTYwX2tiX3NiIC8qMyovCi0jZGVmaW5lIE1DIAliZmRfbWFjaF9pOTYwX21jICAgIC8qNCovCi0jZGVmaW5lIFhBIAliZmRfbWFjaF9pOTYwX3hhICAgIC8qNSovCi0jZGVmaW5lIENBIAliZmRfbWFjaF9pOTYwX2NhICAgIC8qNiovCi0jZGVmaW5lIEpYCWJmZF9tYWNoX2k5NjBfanggICAgLyo3Ki8KLSNkZWZpbmUgSFgJYmZkX21hY2hfaTk2MF9oeCAgICAvKjgqLwotI2RlZmluZSBNQVhfQVJDSCAoKGludClIWCkKLQotICBzdGF0aWMgQ09OU1QgdW5zaWduZWQgbG9uZyBtYXRyaXhbTUFYX0FSQ0grMV1bTUFYX0FSQ0grMV0gPSAKLSAgICB7Ci0gICAgICB7IEVSUk9SLAlDT1JFLAlLQSwJS0IsCU1DLAlYQSwJQ0EsCUpYLAlIWCB9LAotICAgICAgeyBDT1JFLAlDT1JFLAlLQSwJS0IsCU1DLAlYQSwJQ0EsCUpYLAlIWCB9LAotICAgICAgeyBLQSwJS0EsCUtBLAlLQiwJTUMsCVhBLAlFUlJPUiwJRVJST1IsCUVSUk9SfSwKLSAgICAgIHsgS0IsCUtCLAlLQiwJS0IsCU1DLAlYQSwJRVJST1IsIAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBNQywJTUMsCU1DLAlNQywJTUMsCVhBLAlFUlJPUiwJRVJST1IsCUVSUk9SfSwKLSAgICAgIHsgWEEsCVhBLAlYQSwJWEEsCVhBLAlYQSwJRVJST1IsCUVSUk9SLAlFUlJPUn0sCi0gICAgICB7IENBLAlDQSwJRVJST1IsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUNBLAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBKWCwJSlgsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwgIEpYLAlIWCB9LAotICAgICAgeyBIWCwJSFgsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwJSFgsCUhYIH0sCi0gICAgfTsKLQotCi0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgbWF0cml4W2EtPm1hY2hdW2ItPm1hY2hdID09IEVSUk9SKSAKLSAgICB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICByZXR1cm4gKGEtPm1hY2ggID09ICBtYXRyaXhbYS0+bWFjaF1bYi0+bWFjaF0pID8gIGEgOiBiOwotICAgIH0KLX0KLQotCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7Ci0jZGVmaW5lIE4oYSxiLGQsbikgXAoteyAzMiwgMzIsIDgsYmZkX2FyY2hfaTk2MCxhLCJpOTYwIixiLDMsZCxjb21wYXRpYmxlLHNjYW5fOTYwX21hY2gsbix9Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17IAotICBOKGJmZF9tYWNoX2k5NjBfa2Ffc2EsImk5NjA6a2Ffc2EiLGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsxXSksCi0gIE4oYmZkX21hY2hfaTk2MF9rYl9zYiwiaTk2MDprYl9zYiIsZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzJdKSwKLSAgTihiZmRfbWFjaF9pOTYwX21jLCAgICJpOTYwOm1jIiwgICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbM10pLAotICBOKGJmZF9tYWNoX2k5NjBfeGEsICAgImk5NjA6eGEiLCAgIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs0XSksCi0gIE4oYmZkX21hY2hfaTk2MF9jYSwgICAiaTk2MDpjYSIsICAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzVdKSwKLSAgTihiZmRfbWFjaF9pOTYwX2p4LCAgICJpOTYwOmp4IiwgICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbNl0pLAotICBOKGJmZF9tYWNoX2k5NjBfaHgsCSJpOTYwOmh4IiwgICBmYWxzZSwgMCksCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k5NjBfYXJjaCA9Ci0gIE4oYmZkX21hY2hfaTk2MF9jb3JlLCAiaTk2MDpjb3JlIiwgdHJ1ZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tMTAyMDAuYyBiL2JmZC9jcHUtbTEwMjAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGE2NzguLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tMTAyMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgTWF0c3VzaGl0YSAxMDIwMCBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tbjEwMjAwX2FyY2ggPQotICB7Ci0gICAgMTYsIC8qIDE2IGJpdHMgaW4gYSB3b3JkICovCi0gICAgMjQsIC8qIDE2IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsICAvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfbW4xMDIwMCwKLSAgICAyMDAsCi0gICAgIm1uMTAyMDAiLAotICAgICJtbjEwMjAwIiwKLSAgICAyLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW0xMDMwMC5jIGIvYmZkL2NwdS1tMTAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1ZDA5Ny4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW0xMDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMzAwIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FtMzNfYXJjaCA9Ci0gIHsKLSAgICAzMiwgLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwgLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwgIC8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9tbjEwMzAwLAotICAgIDMzMCwKLSAgICAiYW0zMyIsCi0gICAgImFtMzMiLAotICAgIDIsCi0gICAgZmFsc2UsCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAzMDBfYXJjaCA9Ci0gIHsKLSAgICAzMiwgLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwgLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwgIC8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9tbjEwMzAwLAotICAgIDMwMCwKLSAgICAibW4xMDMwMCIsCi0gICAgIm1uMTAzMDAiLAotICAgIDIsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgJmJmZF9hbTMzX2FyY2gsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW0zMnIuYyBiL2JmZC9jcHUtbTMyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVhZDQxLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbTMyci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNMzJSIHByb2Nlc3Nvci4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgTihudW1iZXIsIHByaW50LCBkZWZhdWx0LCBuZXh0KSAgXAoteyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9tMzJyLCBudW1iZXIsICJtMzJyIiwgcHJpbnQsIDQsIGRlZmF1bHQsIFwKLSAgICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgYmZkX2RlZmF1bHRfc2NhbiwgbmV4dCB9Ci0KLSNkZWZpbmUgTkVYVCBOVUxMCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17Ci0gIE4gKGJmZF9tYWNoX20zMnJ4LCAibTMycngiLCBmYWxzZSwgTlVMTCkKLX07Ci0KLSN1bmRlZiBORVhUCi0jZGVmaW5lIE5FWFQgJmFyY2hfaW5mb19zdHJ1Y3RbMF0KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tMzJyX2FyY2ggPQotICBOIChiZmRfbWFjaF9tMzJyLCAibTMyciIsIHRydWUsIE5FWFQpOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tNjhrLmMgYi9iZmQvY3B1LW02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0MTgyZC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW02OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIGFyY2hpdGVjdHVyZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBOKG5hbWUsIHByaW50LGQsbmV4dCkgIFwKLXsgIDMyLCAzMiwgOCwgYmZkX2FyY2hfbTY4aywgbmFtZSwgIm02OGsiLHByaW50LDIsZCxiZmRfZGVmYXVsdF9jb21wYXRpYmxlLGJmZF9kZWZhdWx0X3NjYW4sIG5leHQsIH0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQoteyAKLSAgTihiZmRfbWFjaF9tNjgwMDAsICJtNjhrOjY4MDAwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgTihiZmRfbWFjaF9tNjgwMDgsICJtNjhrOjY4MDA4IiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzJdKSwKLSAgTihiZmRfbWFjaF9tNjgwMTAsICJtNjhrOjY4MDEwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzNdKSwKLSAgTihiZmRfbWFjaF9tNjgwMjAsICJtNjhrOjY4MDIwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzRdKSwKLSAgTihiZmRfbWFjaF9tNjgwMzAsICJtNjhrOjY4MDMwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzVdKSwKLSAgTihiZmRfbWFjaF9tNjgwNDAsICJtNjhrOjY4MDQwIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzZdKSwKLSAgTihiZmRfbWFjaF9jcHUzMiwgICJtNjhrOmNwdTMyIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzddKSwKLSAgTihiZmRfbWFjaF9tNjgwNjAsICJtNjhrOjY4MDYwIiwgZmFsc2UsIDApLAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tNjhrX2FyY2ggPQotICBOKDAsICJtNjhrIiwgdHJ1ZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tODhrLmMgYi9iZmQvY3B1LW04OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3MTZjNS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW04OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGJmZCBiYWNrLWVuZCBmb3IgbTg4ayBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTg4a19hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfbTg4aywKLSAgICA4ODEwMCwJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgICAibTg4ayIsCi0gICAgIm04OGs6ODgxMDAiLAotICAgIDMsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW1jb3JlLmMgYi9iZmQvY3B1LW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlM2FmMWYuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgTW90b3JvbGxhJ3MgTUNvcmUgYXJjaGl0ZWN0dXJlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21jb3JlX2FyY2ggPQotewotICAzMiwJCSAgCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCSAgCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCSAgCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX21jb3JlLCAJCS8qIEFyY2hpdGVjdHVyZSAqLwotICAwLAkJICAJCS8qIE1hY2hpbmUgbnVtYmVyIC0gMCBmb3Igbm93ICovCi0gICJNQ29yZSIsCSAgCQkvKiBBcmNoaXRlY3R1cmUgbmFtZSAqLwotICAiTUNvcmUiLAkgIAkJLyogUHJpbnRhYmxlIG5hbWUgKi8KLSAgMywJCSAgCQkvKiBTZWN0aW9uIGFsaWduIHBvd2VyICovCi0gIHRydWUsCQkgIAkJLyogSXMgdGhpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgPyAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAkvKiBBcmNoaXRlY3R1cmUgY29tcGFyaXNvbiBmdW5jdGlvbiAqLwotICBiZmRfZGVmYXVsdF9zY2FuLAkgICAJLyogU3RyaW5nIHRvIGFyY2hpdGVjdHVyZSBjb252ZXJzaW9uICovCi0gIE5VTEwJCQkgICAJLyogTmV4dCBpbiBsaXN0ICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1taXBzLmMgYi9iZmQvY3B1LW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzM2I4Yy4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qIGJmZCBiYWNrLWVuZCBmb3IgbWlwcyBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgTihCSVRTX1dPUkQsIEJJVFNfQUREUiwgTlVNQkVSLCBQUklOVCwgREVGQVVMVCwgTkVYVCkJCVwKLSAgewkJCQkJCQlcCi0gICAgQklUU19XT1JELCAvKiAgYml0cyBpbiBhIHdvcmQgKi8JCQlcCi0gICAgQklUU19BRERSLCAvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JCQlcCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwkJCQlcCi0gICAgYmZkX2FyY2hfbWlwcywJCQkJCVwKLSAgICBOVU1CRVIsCQkJCQkJXAotICAgICJtaXBzIiwJCQkJCQlcCi0gICAgUFJJTlQsCQkJCQkJXAotICAgIDMsCQkJCQkJCVwKLSAgICBERUZBVUxULAkJCQkJCVwKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAJCQkJXAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCQkJCQlcCi0gICAgTkVYVCwJCQkJCQlcCi0gIH0KLQotZW51bSB7Ci1JX21pcHMzMDAwLCAKLUlfbWlwczM5MDAsIAotSV9taXBzNDAwMCwgCi1JX21pcHM0MDEwLCAKLUlfbWlwczQxMDAsIAotSV9taXBzNDExMSwKLUlfbWlwczQzMDAsIAotSV9taXBzNDQwMCwgCi1JX21pcHM0NjAwLCAKLUlfbWlwczQ2NTAsIAotSV9taXBzNTAwMCwgCi1JX21pcHM2MDAwLCAKLUlfbWlwczgwMDAsIAotSV9taXBzMTAwMDAsCi1JX21pcHMxNgotfTsKLQotCi0jZGVmaW5lIE5OKGluZGV4KSAoJmFyY2hfaW5mb19zdHJ1Y3RbKGluZGV4KSsxXSkKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgTiAoMzIsIDMyLCBiZmRfbWFjaF9taXBzMzAwMCwgIm1pcHM6MzAwMCIsIGZhbHNlLCBOTihJX21pcHMzMDAwKSksCi0gIE4gKDMyLCAzMiwgYmZkX21hY2hfbWlwczM5MDAsICJtaXBzOjM5MDAiLCBmYWxzZSwgTk4oSV9taXBzMzkwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MDAwLCAibWlwczo0MDAwIiwgZmFsc2UsIE5OKElfbWlwczQwMDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDAxMCwgIm1pcHM6NDAxMCIsIGZhbHNlLCBOTihJX21pcHM0MDEwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQxMDAsICJtaXBzOjQxMDAiLCBmYWxzZSwgTk4oSV9taXBzNDEwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MTExLCAibWlwczo0MTExIiwgZmFsc2UsIE5OKElfbWlwczQxMTEpKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDMwMCwgIm1pcHM6NDMwMCIsIGZhbHNlLCBOTihJX21pcHM0MzAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQ0MDAsICJtaXBzOjQ0MDAiLCBmYWxzZSwgTk4oSV9taXBzNDQwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0NjAwLCAibWlwczo0NjAwIiwgZmFsc2UsIE5OKElfbWlwczQ2MDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDY1MCwgIm1pcHM6NDY1MCIsIGZhbHNlLCBOTihJX21pcHM0NjUwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczUwMDAsICJtaXBzOjUwMDAiLCBmYWxzZSwgTk4oSV9taXBzNTAwMCkpLAotICBOICgzMiwgMzIsIGJmZF9tYWNoX21pcHM2MDAwLCAibWlwczo2MDAwIiwgZmFsc2UsIE5OKElfbWlwczYwMDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzODAwMCwgIm1pcHM6ODAwMCIsIGZhbHNlLCBOTihJX21pcHM4MDAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczEwMDAwLCAibWlwczoxMDAwMCIsIGZhbHNlLCBOTihJX21pcHMxMDAwMCkpLAotCi0KLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzMTYsICAgIm1pcHM6MTYiLCAgIGZhbHNlLCAwKSwKLX07Ci0KLS8qIFRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSBpcyBtaXBzOjMwMDAsIGJ1dCB3aXRoIGEgbWFjaGluZSBudW1iZXIgb2YKLSAgIHplcm8uICBUaGlzIGxldHMgdGhlIGxpbmtlciBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgZGVmYXVsdCBzZXR0aW5nCi0gICBvZiBtaXBzLCBhbmQgYW4gZXhwbGljaXQgc2V0dGluZyBvZiBtaXBzOjMwMDAuICAqLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21pcHNfYXJjaCA9Ci1OICgzMiwgMzIsIDAsICJtaXBzIiwgdHJ1ZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1uczMyay5jIGIvYmZkL2NwdS1uczMyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzRlMjViLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbnMzMmsuYworKysgL2Rldi9udWxsCkBAIC0xLDg0NiArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIG5zMzJrIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDk0LCA5NSwgOTYsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQWxtb3N0IHRvdGFsbHkgcmV3cml0dGVuIGJ5IElhbiBEYWxsIGZyb20gaW5pdGlhbCB3b3JrCi0gICBieSBBbmRyZXcgQ2FnbmV5LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJuczMyay5oIgotCi0jZGVmaW5lIE4obWFjaGluZSwgcHJpbnRhYmxlLCBkLCBuZXh0KSAgXAoteyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9uczMyaywgbWFjaGluZSwgIm5zMzJrIixwcmludGFibGUsMyxkLGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsYmZkX2RlZmF1bHRfc2NhbiwgbmV4dCwgfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17IAotICBOKDMyNTMyLCJuczMyazozMjUzMiIsdHJ1ZSwgMCksIC8qIHRoZSB3b3JkIG5zMzJrIHdpbGwgbWF0Y2ggdGhpcyB0b28gKi8KLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbnMzMmtfYXJjaCA9Ci0gIE4oMzIwMzIsIm5zMzJrOjMyMDMyIixmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwotCi1zdGF0aWMgbG9uZwotbnMzMmtfc2lnbl9leHRlbmQodmFsdWUsIGJpdHMpCi0gICAgIGludCB2YWx1ZTsKLSAgICAgaW50IGJpdHM7Ci17Ci0gIHZhbHVlID0gdmFsdWUgJiAoKDEgPDwgYml0cykgLSAxKTsKLSAgcmV0dXJuICh2YWx1ZSAmICgxIDw8IChiaXRzLTEpKQotCSAgPyB2YWx1ZSB8ICh+KCgxIDw8IGJpdHMpIC0gMSkpCi0JICA6IHZhbHVlKTsKLX0KLQotbG9uZwotX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50KGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgbG9uZyBzaXplOwotewotICBsb25nIHZhbHVlOwotICBidWZmZXIgKz0gb2Zmc2V0OwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIHZhbHVlID0gbnMzMmtfc2lnbl9leHRlbmQgKCpidWZmZXIsIDcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgdmFsdWUgPSBuczMya19zaWduX2V4dGVuZCgqYnVmZmVyKyssIDYpOwotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoMHhmZiAmICpidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgdmFsdWUgPSBuczMya19zaWduX2V4dGVuZCgqYnVmZmVyKyssIDYpOwotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoMHhmZiAmICpidWZmZXIrKyk7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgweGZmICYgKmJ1ZmZlcisrKTsKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKDB4ZmYgJiAqYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbnQKLV9iZmRfbnMzMmtfcHV0X2Rpc3BsYWNlbWVudCh2YWx1ZSwgYnVmZmVyLCBvZmZzZXQsIHNpemUpCi0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICBsb25nIHNpemU7Ci17Ci0gIGJ1ZmZlciArPSBvZmZzZXQ7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgKHZhbHVlIDwgLTY0IHx8IHZhbHVlID4gNjMpCi0JcmV0dXJuIC0xOwotICAgICAgdmFsdWUmPTB4N2Y7Ci0gICAgICAqYnVmZmVyKys9dmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpZiAodmFsdWUgPCAtODE5MiB8fCB2YWx1ZSA+IDgxOTEpCi0JcmV0dXJuIC0xOwotICAgICAgdmFsdWUmPTB4M2ZmZjsKLSAgICAgIHZhbHVlfD0weDgwMDA7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj44KTsKLSAgICAgICpidWZmZXIrKz12YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGlmICh2YWx1ZSA8IC0weDFmMDAwMDAwIHx8IHZhbHVlID49IDB4MjAwMDAwMDApCi0JcmV0dXJuIC0xOwotICAgICAgdmFsdWV8PTB4YzAwMDAwMDA7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj4yNCk7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj4xNik7Ci0gICAgICAqYnVmZmVyKys9KHZhbHVlPj44KTsKLSAgICAgICpidWZmZXIrKz12YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWxvbmcKLV9iZmRfbnMzMmtfZ2V0X2ltbWVkaWF0ZSAoYnVmZmVyLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICBsb25nIHNpemU7Ci17Ci0gIGxvbmcgdmFsdWUgPSAwOwotICBidWZmZXIgKz0gb2Zmc2V0OwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIGNhc2UgMzoKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIGNhc2UgMjoKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIGNhc2UgMToKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbnQKLV9iZmRfbnMzMmtfcHV0X2ltbWVkaWF0ZSAodmFsdWUsIGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQotICAgICBsb25nIHZhbHVlOwotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgbG9uZyBzaXplOwotewotICBidWZmZXIgKz0gb2Zmc2V0ICsgc2l6ZSAtIDE7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgKmJ1ZmZlci0tID0gKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OwotICAgIGNhc2UgMzoKLSAgICAgICpidWZmZXItLSA9ICh2YWx1ZSAmIDB4ZmYpOyB2YWx1ZSA+Pj0gODsKLSAgICBjYXNlIDI6Ci0gICAgICAqYnVmZmVyLS0gPSAodmFsdWUgJiAweGZmKTsgdmFsdWUgPj49IDg7Ci0gICAgY2FzZSAxOgotICAgICAgKmJ1ZmZlci0tID0gKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgaXMganVzdCBsaWtlIHRoZSBzdGFuZGFyZCBwZXJmb3JtX3JlbG9jYXRpb24gZXhjZXB0IHdlCi0gKiB1c2UgZ2V0X2RhdGEgYW5kIHB1dF9kYXRhIHdoaWNoIGtub3cgYWJvdXQgdGhlIG5zMzJrCi0gKiBzdG9yYWdlIG1ldGhvZHMuCi0gKiBUaGlzIGlzIHByb2JhYmx5IGEgbG90IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBpdCBuZWVkcyB0byBiZSEKLSAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZG9fbnMzMmtfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JCWVycm9yX21lc3NhZ2UsIGdldF9kYXRhLCBwdXRfZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgbG9uZyAoKmdldF9kYXRhKSgpOwotICAgICBpbnQgKCpwdXRfZGF0YSkoKTsKLXsKLSAgaW50IG92ZXJmbG93ID0gMDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLQotICBpZiAoKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uKQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHJldHVybiBhbiBlcnJvciBpZgotICAgICB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkLiAgQW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sIGlzCi0gICAgIGNvbnNpZGVyZWQgdG8gaGF2ZSBhIHZhbHVlIG9mIHplcm8gKFNWUjQgQUJJLCBwLiA0LTI3KS4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbgotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMAotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZmxhZyA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotCi0gIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICYmIGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0gICAgb3V0cHV0X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKLSAgICAgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCi0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgV2Ugd2FudCB0byBzZXQgUkVMT0NBVElPTgotCSB0byB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGFuZCB0aGUKLQkgbG9jYXRpb24uICBSRUxPQ0FUSU9OIGlzIGFscmVhZHkgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4KLQotCSBXZSBzdGFydCBieSBzdWJ0cmFjdGluZyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nCi0JIHRoZSBsb2NhdGlvbi4KLQotCSBJZiBwY3JlbF9vZmZzZXQgaXMgc2V0LCB3ZSBtdXN0IGZ1cnRoZXIgc3VidHJhY3QgdGhlIHBvc2l0aW9uCi0JIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBTb21lIHRhcmdldHMgYXJyYW5nZSBmb3IKLQkgdGhlIGFkZGVuZCB0byBiZSB0aGUgbmVnYXRpdmUgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbgotCSB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBleGFtcGxlLCBpMzg2LWFvdXQgZG9lcyB0aGlzLiAgRm9yCi0JIGkzODYtYW91dCwgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgU29tZSBvdGhlciB0YXJnZXRzIGRvIG5vdAotCSBpbmNsdWRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb247IGZvciBleGFtcGxlLCBtODhrYmNzLAotCSBvciBFTEYuICBGb3IgdGhvc2UgdGFyZ2V0cywgcGNyZWxfb2Zmc2V0IGlzIHRydWUuCi0KLQkgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGVuIHdlIG11c3QgZW5zdXJlCi0JIHRoYXQgdGhpcyByZWxvYyB3aWxsIGJlIGNvcnJlY3RseSBjb21wdXRlZCB3aGVuIHRoZSBmaW5hbAotCSByZWxvY2F0aW9uIGlzIGRvbmUuICBJZiBwY3JlbF9vZmZzZXQgaXMgZmFsc2Ugd2Ugd2FudCB0byB3aW5kCi0JIHVwIHdpdGggdGhlIG5lZ2F0aXZlIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24sCi0JIHdoaWNoIG1lYW5zIHdlIG11c3QgYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYnkgdGhlIGNoYW5nZQotCSBpbiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIHRydWUKLQkgd2UgZG8gbm90IHdhbnQgdG8gYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYXQgYWxsLgotCi0JIEZJWE1FOiBUaGlzIHNlZW1zIGxvZ2ljYWwgdG8gbWUsIGJ1dCBmb3IgdGhlIGNhc2Ugb2YKLQkgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQgaXQgaXMgbm90IHdoYXQgdGhlIGNvZGUKLQkgYWN0dWFsbHkgZG9lcy4gIEkgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgaXQsIGJlY2F1c2UgaXQgc2VlbXMKLQkgZmFyIHRvbyBsaWtlbHkgdGhhdCBzb21ldGhpbmcgd2lsbCBicmVhay4gICovCi0KLSAgICAgIHJlbG9jYXRpb24gLT0KLQlpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQgPT0gdHJ1ZSkKLQlyZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0JewotCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24KLQkgICAgIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgICAgIGlucGxhY2UgdG8gcmVmbGVjdCB3aGF0IHdlIG5vdyBrbm93LiAgKi8KLQkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIHJldHVybiBmbGFnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBidXQgaW5wbGFjZSwgc28gbW9kaWZ5IHRoZQotCSAgICAgcmVsb2MgcmVjb3JkIGEgYml0LgotCi0JICAgICBJZiB3ZSd2ZSByZWxvY2F0ZWQgd2l0aCBhIHN5bWJvbCB3aXRoIGEgc2VjdGlvbiwgY2hhbmdlCi0JICAgICBpbnRvIGEgcmVmIHRvIHRoZSBzZWN0aW9uIGJlbG9uZ2luZyB0byB0aGUgc3ltYm9sLiAgKi8KLQotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotCSAgLyogV1RGPz8gKi8KLQkgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0JICAgICAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSAhPSAwKQotCSAgICB7Ci0jaWYgMQotCSAgICAgIC8qIEZvciBtNjhrLWNvZmYsIHRoZSBhZGRlbmQgd2FzIGJlaW5nIHN1YnRyYWN0ZWQgdHdpY2UgZHVyaW5nCi0JCSByZWxvY2F0aW9uIHdpdGggLXIuICBSZW1vdmluZyB0aGUgbGluZSBiZWxvdyB0aGlzIGNvbW1lbnQKLQkJIGZpeGVzIHRoYXQgcHJvYmxlbTsgc2VlIFBSIDI5NTMuCi0KLUhvd2V2ZXIsIElhbiB3cm90ZSB0aGUgZm9sbG93aW5nLCByZWdhcmRpbmcgcmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3csCi13aGljaCBleHBsYWlucyB3aHkgaXQgaXMgc3RpbGwgZW5hYmxlZDogIC0tZGptCi0KLUlmIHlvdSBwdXQgYSBwYXRjaCBsaWtlIHRoYXQgaW50byBCRkQgeW91IG5lZWQgdG8gY2hlY2sgYWxsIHRoZSBDT0ZGCi1saW5rZXJzLiAgSSBhbSBmYWlybHkgY2VydGFpbiB0aGF0IHBhdGNoIHdpbGwgYnJlYWsgY29mZi1pMzg2IChlLmcuLAotU0NPKTsgc2VlIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYyB3aGVyZSBJIHdvcmtlZCBhcm91bmQgdGhlCi1wcm9ibGVtIGluIGEgZGlmZmVyZW50IHdheS4gIFRoZXJlIG1heSB2ZXJ5IHdlbGwgYmUgYSByZWFzb24gdGhhdCB0aGUKLWNvZGUgd29ya3MgYXMgaXQgZG9lcy4KLQotSG1tbS4gIFRoZSBmaXJzdCBvYnZpb3VzIHBvaW50IGlzIHRoYXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBzaG91bGQKLW5vdCBoYXZlIGFueSB0ZXN0cyB0aGF0IGRlcGVuZCB1cG9uIHRoZSBmbGF2b3VyLiAgSXQncyBzZWVtIGxpa2UKLWVudGlyZWx5IHRoZSB3cm9uZyBwbGFjZSBmb3Igc3VjaCBhIHRoaW5nLiAgVGhlIHNlY29uZCBvYnZpb3VzIHBvaW50Ci1pcyB0aGF0IHRoZSBjdXJyZW50IGNvZGUgaWdub3JlcyB0aGUgcmVsb2MgYWRkZW5kIHdoZW4gcHJvZHVjaW5nCi1yZWxvY2F0ZWFibGUgb3V0cHV0IGZvciBDT0ZGLiAgVGhhdCdzIHBlY3VsaWFyLiAgSW4gZmFjdCwgSSByZWFsbHkKLWhhdmUgbm8gaWRlYSB3aGF0IHRoZSBwb2ludCBvZiB0aGUgbGluZSB5b3Ugd2FudCB0byByZW1vdmUgaXMuCi0KLUEgdHlwaWNhbCBDT0ZGIHJlbG9jIHN1YnRyYWN0cyB0aGUgb2xkIHZhbHVlIG9mIHRoZSBzeW1ib2wgYW5kIGFkZHMgaW4KLXRoZSBuZXcgdmFsdWUgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBvYmplY3QgZmlsZSAoaWYgaXQncyBhIHBjCi1yZWxhdGl2ZSByZWxvYyBpdCBhZGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN5bWJvbCB2YWx1ZSBhbmQgdGhlCi1sb2NhdGlvbikuICBXaGVuIHJlbG9jYXRpbmcgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGF0IHByb3BlcnR5LgotCi1CRkQgaGFuZGxlcyB0aGlzIGJ5IHNldHRpbmcgdGhlIGFkZGVuZCB0byB0aGUgbmVnYXRpdmUgb2YgdGhlIG9sZAotdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFVuZm9ydHVuYXRlbHkgaXQgaGFuZGxlcyBjb21tb24gc3ltYm9scyBpbiBhCi1ub24tc3RhbmRhcmQgd2F5IChpdCBkb2Vzbid0IHN1YnRyYWN0IHRoZSBvbGQgdmFsdWUpIGJ1dCB0aGF0J3MgYQotZGlmZmVyZW50IHN0b3J5ICh3ZSBjYW4ndCBjaGFuZ2UgaXQgd2l0aG91dCBsb3NpbmcgYmFja3dhcmQKLWNvbXBhdGliaWxpdHkgd2l0aCBvbGQgb2JqZWN0IGZpbGVzKSAoY29mZi1pMzg2IGRvZXMgc3VidHJhY3QgdGhlIG9sZAotdmFsdWUsIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBleGlzdGluZyBjb2ZmLWkzODYgdGFyZ2V0cywgbGlrZSBTQ08pLgotCi1TbyBldmVyeXRoaW5nIHdvcmtzIGZpbmUgd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBXaGVuCi13ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGxvZ2ljYWxseSB3ZSBzaG91bGQgZG8gZXhhY3RseQotd2hhdCB3ZSBkbyB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoZXJlZm9yZSwgeW91cgotcGF0Y2ggaXMgY29ycmVjdC4gIEluIGZhY3QsIGl0IHNob3VsZCBwcm9iYWJseSBhbHdheXMganVzdCBzZXQKLXJlbG9jX2VudHJ5LT5hZGRlbmQgdG8gMCBmb3IgYWxsIGNhc2VzLCBzaW5jZSBpdCBpcywgaW4gZmFjdCwgZ29pbmcgdG8KLWFkZCB0aGUgdmFsdWUgaW50byB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIHdvbid0IGh1cnQgdGhlIENPRkYgY29kZSwKLXdoaWNoIGRvZXNuJ3QgdXNlIHRoZSBhZGRlbmQ7IEknbSBub3Qgc3VyZSB3aGF0IGl0IHdpbGwgZG8gdG8gb3RoZXIKLWZvcm1hdHMgKHRoZSB0aGluZyB0byBjaGVjayBmb3Igd291bGQgYmUgd2hldGhlciBhbnkgZm9ybWF0cyBib3RoIHVzZQotdGhlIGFkZGVuZCBhbmQgc2V0IHBhcnRpYWxfaW5wbGFjZSkuCi0KLVdoZW4gSSB3YW50ZWQgdG8gbWFrZSBjb2ZmLWkzODYgcHJvZHVjZSByZWxvY2F0ZWFibGUgb3V0cHV0LCBJIHJhbgotaW50byB0aGUgcHJvYmxlbSB0aGF0IHlvdSBhcmUgcnVubmluZyBpbnRvOiBJIHdhbnRlZCB0byByZW1vdmUgdGhhdAotbGluZS4gIFJhdGhlciB0aGFuIHJpc2sgaXQsIEkgbWFkZSB0aGUgY29mZi1pMzg2IHJlbG9jcyB1c2UgYSBzcGVjaWFsCi1mdW5jdGlvbjsgaXQncyBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMuICBUaGUgZnVuY3Rpb24KLXNwZWNpZmljYWxseSBhZGRzIHRoZSBhZGRlbmQgZmllbGQgaW50byB0aGUgb2JqZWN0IGZpbGUsIGtub3dpbmcgdGhhdAotYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBpcyBub3QgZ29pbmcgdG8uICBJZiB5b3UgcmVtb3ZlIHRoYXQgbGluZSwgdGhlbgotY29mZi1pMzg2LmMgd2lsbCB3aW5kIHVwIGFkZGluZyB0aGUgYWRkZW5kIGZpZWxkIGluIHR3aWNlLiAgSXQncwotdHJpdmlhbCB0byBmaXg7IGl0IGp1c3QgbmVlZHMgdG8gYmUgZG9uZS4KLQotVGhlIHByb2JsZW0gd2l0aCByZW1vdmluZyB0aGUgbGluZSBpcyBqdXN0IHRoYXQgaXQgbWF5IGJyZWFrIHNvbWUKLXdvcmtpbmcgY29kZS4gIFdpdGggQkZEIGl0J3MgaGFyZCB0byBiZSBzdXJlIG9mIGFueXRoaW5nLiAgVGhlIHJpZ2h0Ci13YXkgdG8gZGVhbCB3aXRoIHRoaXMgaXMgc2ltcGx5IHRvIGJ1aWxkIGFuZCB0ZXN0IGF0IGxlYXN0IGFsbCB0aGUKLXN1cHBvcnRlZCBDT0ZGIHRhcmdldHMuICBJdCBzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkIGlmIHRpbWUgYW5kIGRpc2sKLXNwYWNlIGNvbnN1bWluZy4gIEZvciBlYWNoIHRhcmdldDoKLSAgICAxKSBidWlsZCB0aGUgbGlua2VyCi0gICAgMikgZ2VuZXJhdGUgc29tZSBleGVjdXRhYmxlLCBhbmQgbGluayBpdCB1c2luZyAtciAoSSB3b3VsZAotICAgICAgIHByb2JhYmx5IHVzZSBwYXJhbm9pYS5vIGFuZCBsaW5rIGFnYWluc3QgbmV3bGliL2xpYmMuYSwgd2hpY2gKLSAgICAgICBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgdGFyZ2V0cyB3b3VsZCBiZSBhdmFpbGFibGUgaW4KLSAgICAgICAvdXNyL2N5Z251cy9wcm9ncmVzc2l2ZS9ILWhvc3QvdGFyZ2V0L2xpYi9saWJjLmEpLgotICAgIDMpIG1ha2UgdGhlIGNoYW5nZSB0byByZWxvYy5jCi0gICAgNCkgcmVidWlsZCB0aGUgbGlua2VyCi0gICAgNSkgcmVwZWF0IHN0ZXAgMgotICAgIDYpIGlmIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGVzIGFyZSB0aGUgc2FtZSwgeW91IGhhdmUgYXQgbGVhc3QKLSAgICAgICBtYWRlIGl0IG5vIHdvcnNlCi0gICAgNykgaWYgdGhleSBhcmUgZGlmZmVyZW50IHlvdSBoYXZlIHRvIGZpZ3VyZSBvdXQgd2hpY2ggdmVyc2lvbiBpcwotICAgICAgIHJpZ2h0Ci0qLwotCSAgICAgIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSNlbmRpZgotCSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLSAgICB9Ci0KLSAgLyogRklYTUU6IFRoaXMgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aGUgdmFsdWUKLSAgICAgbWlnaHQgaGF2ZSBvdmVyZmxvd2VkIGJlZm9yZSB3ZSBnZXQgaGVyZS4gIEZvciBhIGNvcnJlY3QgY2hlY2sgd2UKLSAgICAgbmVlZCB0byBjb21wdXRlIHRoZSB2YWx1ZSBpbiBhIHNpemUgbGFyZ2VyIHRoYW4gYml0c2l6ZSwgYnV0IHdlCi0gICAgIGNhbid0IHJlYXNvbmFibHkgZG8gdGhhdCBmb3IgYSByZWxvYyB0aGUgc2FtZSBzaXplIGFzIGEgaG9zdAotICAgICBtYWNoaW5lIHdvcmQuCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYWxzbyBkbyBvdmVyZmxvdyBjaGVja2luZyBvbiB0aGUgcmVzdWx0IGFmdGVyCi0gICAgIGFkZGluZyBpbiB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGNoZWNrOwotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgcmVsb2NhdGlvbiwgYnV0Ci0JIHN0YXJ0aW5nIGF0IGJpdCBwb3NpdGlvbiB6ZXJvLiAgKi8KLSAgICAgIGlmIChob3d0by0+cmlnaHRzaGlmdCA+IGhvd3RvLT5iaXRwb3MpCi0JY2hlY2sgPSByZWxvY2F0aW9uID4+IChob3d0by0+cmlnaHRzaGlmdCAtIGhvd3RvLT5iaXRwb3MpOwotICAgICAgZWxzZQotCWNoZWNrID0gcmVsb2NhdGlvbiA8PCAoaG93dG8tPmJpdHBvcyAtIGhvd3RvLT5yaWdodHNoaWZ0KTsKLSAgICAgIHN3aXRjaCAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93KQotCXsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDoKLQkgIHsKLQkgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgKi8KLQkgICAgYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7Ci0JICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9taW4gPSB+cmVsb2Nfc2lnbmVkX21heDsKLQotCSAgICAvKiBUaGUgYWJvdmUgcmlnaHQgc2hpZnQgaXMgaW5jb3JyZWN0IGZvciBhIHNpZ25lZCB2YWx1ZS4KLQkgICAgICAgRml4IGl0IHVwIGJ5IGZvcmNpbmcgb24gdGhlIHVwcGVyIGJpdHMuICAqLwotCSAgICBpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPiBob3d0by0+Yml0cG9zCi0JCSYmIChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IDApCi0JICAgICAgY2hlY2sgfD0gKChiZmRfdm1hKSAtIDEKLQkJCSYgfigoYmZkX3ZtYSkgLSAxCi0JCQkgICAgPj4gKGhvd3RvLT5yaWdodHNoaWZ0IC0gaG93dG8tPmJpdHBvcykpKTsKLQkgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgY2hlY2sgPiByZWxvY19zaWduZWRfbWF4Ci0JCXx8IChiZmRfc2lnbmVkX3ZtYSkgY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQotCSAgICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICBUaGlzIGV4cHJlc3Npb24gYXZvaWRzCi0JICAgICAgIG92ZXJmbG93IGlmIGhvd3RvLT5iaXRzaXplIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbgotCSAgICAgICBiZmRfdm1hLiAgKi8KLQkgICAgYmZkX3ZtYSByZWxvY191bnNpZ25lZF9tYXggPQotCSAgICAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotCSAgICBpZiAoKGJmZF92bWEpIGNoZWNrID4gcmVsb2NfdW5zaWduZWRfbWF4KQotCSAgICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICBUaGlzIGV4cHJlc3Npb24gYXZvaWRzCi0JICAgICAgIG92ZXJmbG93IGlmIGhvd3RvLT5iaXRzaXplIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbgotCSAgICAgICBiZmRfdm1hLiAgKi8KLQkgICAgYmZkX3ZtYSByZWxvY19iaXRzID0gKCgoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLQkgICAgaWYgKCgoYmZkX3ZtYSkgY2hlY2sgJiB+cmVsb2NfYml0cykgIT0gMAotCQkmJiAoKGJmZF92bWEpIGNoZWNrICYgfnJlbG9jX2JpdHMpICE9ICgtMSAmIH5yZWxvY19iaXRzKSkKLQkgICAgICB7Ci0JCS8qIFRoZSBhYm92ZSByaWdodCBzaGlmdCBpcyBpbmNvcnJlY3QgZm9yIGEgc2lnbmVkCi0JCSAgIHZhbHVlLiAgU2VlIGlmIHR1cm5pbmcgb24gdGhlIHVwcGVyIGJpdHMgZml4ZXMgdGhlCi0JCSAgIG92ZXJmbG93LiAgKi8KLQkJaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID4gaG93dG8tPmJpdHBvcwotCQkgICAgJiYgKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uIDwgMCkKLQkJICB7Ci0JCSAgICBjaGVjayB8PSAoKGJmZF92bWEpIC0gMQotCQkJICAgICAgJiB+KChiZmRfdm1hKSAtIDEKLQkJCQkgID4+IChob3d0by0+cmlnaHRzaGlmdCAtIGhvd3RvLT5iaXRwb3MpKSk7Ci0JCSAgICBpZiAoKChiZmRfdm1hKSBjaGVjayAmIH5yZWxvY19iaXRzKSAhPSAoLTEgJiB+cmVsb2NfYml0cykpCi0JCSAgICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JCSAgfQotCQllbHNlCi0JCSAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICAvKgotICAgIEVpdGhlciB3ZSBhcmUgcmVsb2NhdGluZyBhbGwgdGhlIHdheSwgb3Igd2UgZG9uJ3Qgd2FudCB0byBhcHBseQotICAgIHRoZSByZWxvY2F0aW9uIHRvIHRoZSByZWxvYyBlbnRyeSAocHJvYmFibHkgYmVjYXVzZSB0aGVyZSBpc24ndAotICAgIGFueSByb29tIGluIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGRlc2NyaWJlIGFkZGVuZHMgdG8gcmVsb2NzKQotICAgICovCi0KLSAgLyogVGhlIGNhc3QgdG8gYmZkX3ZtYSBhdm9pZHMgYSBidWcgaW4gdGhlIEFscGhhIE9TRi8xIEMgY29tcGlsZXIKLSAgICAgKE9TRiB2ZXJzaW9uIDEuMywgY29tcGlsZXIgdmVyc2lvbiAzLjExKS4gIEl0IG1pc2NvbXBpbGVzIHRoZQotICAgICBmb2xsb3dpbmcgcHJvZ3JhbToKLQotICAgICBzdHJ1Y3Qgc3RyCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBpbnQgaTA7Ci0gICAgIH0gcyA9IHsgMCB9OwotCi0gICAgIGludAotICAgICBtYWluICgpCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBsb25nIHg7Ci0KLSAgICAgICB4ID0gMHgxMDAwMDAwMDA7Ci0gICAgICAgeCA8PD0gKHVuc2lnbmVkIGxvbmcpIHMuaTA7Ci0gICAgICAgaWYgKHggPT0gMCkKLQkgcHJpbnRmICgiZmFpbGVkXG4iKTsKLSAgICAgICBlbHNlCi0JIHByaW50ZiAoInN1Y2NlZWRlZCAoJWx4KVxuIiwgeCk7Ci0gICAgIH0KLSAgICAgKi8KLQotICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLSAgLyogU2hpZnQgZXZlcnl0aGluZyB1cCB0byB3aGVyZSBpdCdzIGdvaW5nIHRvIGJlIHVzZWQgKi8KLQotICByZWxvY2F0aW9uIDw8PSAoYmZkX3ZtYSkgaG93dG8tPmJpdHBvczsKLQotICAvKiBXYWl0IGZvciB0aGUgZGF5IHdoZW4gYWxsIGhhdmUgdGhlIG1hc2sgaW4gdGhlbSAqLwotCi0gIC8qIFdoYXQgd2UgZG86Ci0gICAgIGkgaW5zdHJ1Y3Rpb24gdG8gYmUgbGVmdCBhbG9uZQotICAgICBvIG9mZnNldCB3aXRoaW4gaW5zdHJ1Y3Rpb24KLSAgICAgciByZWxvY2F0aW9uIG9mZnNldCB0byBhcHBseQotICAgICBTIHNyYyBtYXNrCi0gICAgIEQgZHN0IG1hc2sKLSAgICAgTiB+ZHN0IG1hc2sKLSAgICAgQSBwYXJ0IDEKLSAgICAgQiBwYXJ0IDIKLSAgICAgUiByZXN1bHQKLQotICAgICBEbyB0aGlzOgotICAgICBpIGkgaSBpIGkgbyBvIG8gbyBvICAgICAgICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kICAgICAgICAgICBTIFMgUyBTIFMgICAgdG8gZ2V0IHRoZSBzaXplIG9mZnNldCB3ZSB3YW50Ci0gICAgICsgICByIHIgciByIHIgciByIHIgciByICB0byBnZXQgdGhlIGZpbmFsIHZhbHVlIHRvIHBsYWNlCi0gICAgIGFuZCAgICAgICAgICAgRCBEIEQgRCBEICB0byBjaG9wIHRvIHJpZ2h0IHNpemUKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgQSBBIEEgQSBBCi0gICAgIEFuZCB0aGlzOgotICAgICAuLi4gICBpIGkgaSBpIGkgbyBvIG8gbyBvICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kICAgTiBOIE4gTiBOICAgICAgICAgICAgZ2V0IGluc3RydWN0aW9uCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIC4uLiAgIEIgQiBCIEIgQgotCi0gICAgIEFuZCB0aGVuOgotICAgICBCIEIgQiBCIEIKLSAgICAgb3IgICAgICAgICAgICAgIEEgQSBBIEEgQQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBSIFIgUiBSIFIgUiBSIFIgUiBSICAgICAgICBwdXQgaW50byBiZmRfcHV0PHNpemU+Ci0gICAgICovCi0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoICh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArICByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgewotCWNoYXIgeCA9IGdldF9kYXRhIChkYXRhLCBhZGRyLCAxKTsKLQlET0lUICh4KTsKLQlvdmVyZmxvdyA9IHB1dF9kYXRhKHgsIGRhdGEsIGFkZHIsIDEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICBpZiAocmVsb2NhdGlvbikKLQl7Ci0JICBzaG9ydCB4ID0gZ2V0X2RhdGEgKGRhdGEsIGFkZHIsIDIpOwotCSAgRE9JVCAoeCk7Ci0JICBvdmVyZmxvdyA9IHB1dF9kYXRhKHgsICh1bnNpZ25lZCBjaGFyICopIGRhdGEsIGFkZHIsIDIpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGlmIChyZWxvY2F0aW9uKQotCXsKLQkgIGxvbmcgeCA9IGdldF9kYXRhIChkYXRhLCBhZGRyLCA0KTsKLQkgIERPSVQgKHgpOwotCSAgb3ZlcmZsb3cgPSBwdXRfZGF0YSh4LCBkYXRhLCBhZGRyLCA0KTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIC0yOgotICAgICAgewotCWxvbmcgIHggPSBnZXRfZGF0YShkYXRhLCBhZGRyLCA0KTsKLQlyZWxvY2F0aW9uID0gLXJlbG9jYXRpb247Ci0JRE9JVCh4KTsKLQlvdmVyZmxvdyA9IHB1dF9kYXRhKHgsIGRhdGEgLCBhZGRyLCA0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgLyogRG8gbm90aGluZyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0jaWZkZWYgQkZENjQKLSAgICAgIGlmIChyZWxvY2F0aW9uKQotCXsKLQkgIGJmZF92bWEgeCA9IGdldF9kYXRhIChkYXRhLCBhZGRyLCA4KTsKLQkgIERPSVQgKHgpOwotCSAgb3ZlcmZsb3cgPSBwdXRfZGF0YSh4LCBkYXRhLCBhZGRyLCA4KTsKLQl9Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX290aGVyOwotICAgIH0KLSAgaWYgKChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkgJiYgb3ZlcmZsb3cpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICByZXR1cm4gZmxhZzsKLX0KLQotLyogUmVsb2NhdGUgYSBnaXZlbiBsb2NhdGlvbiB1c2luZyBhIGdpdmVuIHZhbHVlIGFuZCBob3d0by4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9kb19uczMya19yZWxvY19jb250ZW50cyAoIGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sIGxvY2F0aW9uLAotCQkJICAgICAgZ2V0X2RhdGEsIHB1dF9kYXRhKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Ci0gICAgIGxvbmcgKCpnZXRfZGF0YSkoKTsKLSAgICAgaW50ICgqcHV0X2RhdGEpKCk7Ci17Ci0gIGludCBzaXplOwotICBiZmRfdm1hIHg7Ci0gIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLSAgLyogSWYgdGhlIHNpemUgaXMgbmVnYXRpdmUsIG5lZ2F0ZSBSRUxPQ0FUSU9OLiAgVGhpcyBpc24ndCB2ZXJ5Ci0gICAgIGdlbmVyYWwuICAqLwotICBpZiAoaG93dG8tPnNpemUgPCAwKQotICAgIHJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQotICAvKiBHZXQgdGhlIHZhbHVlIHdlIGFyZSBnb2luZyB0byByZWxvY2F0ZS4gICovCi0gIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSA0OgotI2lmZGVmIEJGRDY0Ci0gICAgY2FzZSA4OgotI2VuZGlmCi0gICAgICB4ID0gZ2V0X2RhdGEgKGxvY2F0aW9uLCAwLCBzaXplKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICBGSVhNRTogV2UgbWF5IGRyb3AgYml0cyBkdXJpbmcgdGhlIGFkZGl0aW9uCi0gICAgIHdoaWNoIHdlIGRvbid0IGNoZWNrIGZvci4gIFdlIG11c3QgZWl0aGVyIGNoZWNrIGF0IGV2ZXJ5IHNpbmdsZQotICAgICBvcGVyYXRpb24sIHdoaWNoIHdvdWxkIGJlIHRlZGlvdXMsIG9yIHdlIG11c3QgZG8gdGhlIGNvbXB1dGF0aW9ucwotICAgICBpbiBhIHR5cGUgbGFyZ2VyIHRoYW4gYmZkX3ZtYSwgd2hpY2ggd291bGQgYmUgaW5lZmZpY2llbnQuICAqLwotICBvdmVyZmxvdyA9IGZhbHNlOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgewotICAgICAgYmZkX3ZtYSBjaGVjazsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHNpZ25lZF9jaGVjazsKLSAgICAgIGJmZF92bWEgYWRkOwotICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbmVkX2FkZDsKLQotICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID09IDApCi0JewotCSAgY2hlY2sgPSByZWxvY2F0aW9uOwotCSAgc2lnbmVkX2NoZWNrID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEcm9wIHVud2FudGVkIGJpdHMgZnJvbSB0aGUgdmFsdWUgd2UgYXJlIHJlbG9jYXRpbmcgdG8uICAqLwotCSAgY2hlY2sgPSByZWxvY2F0aW9uID4+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+cGNyZWxfb2Zmc2V0KQotCXJlbG9jYXRpb24gLT0gYWRkcmVzczsKLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgICAgIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci19CmRpZmYgLS1naXQgYS9iZmQvY3B1LXBqLmMgYi9iZmQvY3B1LXBqLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZGRkMzMuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1wai5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIFBpY28gSmF2YSBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgVHJhbnNtZXRhLiBzYWNAcG9ib3guY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzdHJjYXNlY21wIChpbmZvLT5wcmludGFibGVfbmFtZSwgc3RyaW5nKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotI2lmIDAKLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgcmV0dXJucyB3aGV0aGVyCi0gICB0aGV5J2QgYmUgY29tcGF0aWJsZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQotICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBhOwotfQotI2VuZGlmCi0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcGosCi0gICAgMCwKLSAgICAicGoiLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgICAicGoiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gICAgMSwKLSAgICBmYWxzZSwJCQkvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIHNjYW5fbWFjaCwKLSAgICAwLAotICB9LAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9wal9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9waiwKLSAgMCwKLSAgInBqIiwJCQkJLyogYXJjaF9uYW1lICAqLwotICAicGoiLAkJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIHNjYW5fbWFjaCwKLSAgJmFyY2hfaW5mb19zdHJ1Y3QgWzBdCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1wb3dlcnBjLmMgYi9iZmQvY3B1LXBvd2VycGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmMGY4MC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXBvd2VycGMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKiBCRkQgUG93ZXJQQyBDUFUgZGVmaW5pdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBUaGUgY29tbW9uIFBvd2VyUEMgYXJjaGl0ZWN0dXJlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgUlMvNjAwMC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnBvd2VycGNfY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1wb3dlcnBjX2NvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIEJGRF9BU1NFUlQgKGEtPmFyY2ggPT0gYmZkX2FyY2hfcG93ZXJwYyk7Ci0gIHN3aXRjaCAoYi0+YXJjaCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIHJldHVybiBiZmRfZGVmYXVsdF9jb21wYXRpYmxlIChhLCBiKTsKLSAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKLSAgICAgIGlmIChhLT5tYWNoID09IDApCi0JcmV0dXJuIGE7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KLXsKLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcG93ZXJwYywKLSAgICA2MDMsIC8qIGZvciB0aGUgbXBjNjAzICovCi0gICAgInBvd2VycGMiLAotICAgICJwb3dlcnBjOjYwMyIsCi0gICAgMywKLSAgICBmYWxzZSwgLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzFdCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3Bvd2VycGMsCi0gICAgNjA0LCAvKiBmb3IgdGhlIG1wYzYwNCAqLwotICAgICJwb3dlcnBjIiwKLSAgICAicG93ZXJwYzo2MDQiLAotICAgIDMsCi0gICAgZmFsc2UsIC8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIHBvd2VycGNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFsyXQotICB9LAotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9wb3dlcnBjLAotICAgIDQwMywgLyogZm9yIHRoZSA0MDMgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6NDAzIiwKLSAgICAzLAotICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBwb3dlcnBjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbM10KLSAgfSwKLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcG93ZXJwYywKLSAgICA2MDEsIC8qIGZvciB0aGUgbXBjNjAxICovCi0gICAgInBvd2VycGMiLAotICAgICJwb3dlcnBjOjYwMSIsCi0gICAgMywKLSAgICBmYWxzZSwgLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgIDAKLSAgfQotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9wb3dlcnBjX2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9wb3dlcnBjLAotICAgIDAsIC8qIGZvciB0aGUgUE9XRVIvUG93ZXJQQyBjb21tb24gYXJjaGl0ZWN0dXJlICovCi0gICAgInBvd2VycGMiLAotICAgICJwb3dlcnBjOmNvbW1vbiIsCi0gICAgMywKLSAgICB0cnVlLCAvKiB0aGUgZGVmYXVsdCAqLwotICAgIHBvd2VycGNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFswXQotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1yczYwMDAuYyBiL2JmZC9jcHUtcnM2MDAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NTJhZTkuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1yczYwMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgcnM2MDAwIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEZJWE1FOiBDYW4gc29tZW9uZSBwcm92aWRlIGEgdHJhbnNsaXRlcmF0aW9uIG9mIHRoaXMgbmFtZSBpbnRvIEFTQ0lJPwotICAgVXNpbmcgdGhlIGZvbGxvd2luZyBjaGFycyBjYXVzZWQgYSBjb21waWxlciB3YXJuaW5nIG9uIEhJVVggKHNvIEkgcmVwbGFjZWQKLSAgIHRoZW0gd2l0aCBvY3RhbCBlc2NhcGVzKSwgYW5kIGlzbid0IHVzZWZ1bCB3aXRob3V0IGFuIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdAotICAgY2hhcmFjdGVyIHNldCBpdCBpcy4KLSAgIFdyaXR0ZW4gYnkgTWltaSBQaFwzNzNcMzY0bmctVGhcMzQ1byBWXDM2NSBvZiBJQk0KLSAgIGFuZCBKb2huIEdpbG1vcmUgb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBUaGUgUlMvNjAwMCBhcmNoaXRlY3R1cmUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBQb3dlclBDIGNvbW1vbgotICAgYXJjaGl0ZWN0dXJlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqcnM2MDAwX2NvbXBhdGlibGUKLSAgUEFSQU1TICgoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICosIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqKSk7Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotcnM2MDAwX2NvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIEJGRF9BU1NFUlQgKGEtPmFyY2ggPT0gYmZkX2FyY2hfcnM2MDAwKTsKLSAgc3dpdGNoIChiLT5hcmNoKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBiZmRfYXJjaF9yczYwMDA6Ci0gICAgICByZXR1cm4gYmZkX2RlZmF1bHRfY29tcGF0aWJsZSAoYSwgYik7Ci0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgaWYgKGItPm1hY2ggPT0gMCkKLQlyZXR1cm4gYjsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9yczYwMDBfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3JzNjAwMCwKLSAgICA2MDAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJyczYwMDAiLAotICAgICJyczYwMDA6NjAwMCIsCi0gICAgMywKLSAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCi0gICAgcnM2MDAwX2NvbXBhdGlibGUsCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1zaC5jIGIvYmZkL2NwdS1zaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGFkZjkyLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtc2guYworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgSGl0YWNoaS1TSCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzdHJjYXNlY21wIChpbmZvLT5wcmludGFibGVfbmFtZSwgc3RyaW5nKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotI2lmIDAKLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgcmV0dXJucyB3aGV0aGVyCi0gICB0aGV5J2QgYmUgY29tcGF0aWJsZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQotICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBhOwotfQotI2VuZGlmCi0KLSNkZWZpbmUgU0hfTkVYVCAmYXJjaF9pbmZvX3N0cnVjdFswXQotI2RlZmluZSBTSDNfTkVYVCAmYXJjaF9pbmZvX3N0cnVjdFsxXQotI2RlZmluZSBTSDNFX05FWFQgTlVMTAotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9IAotewotICB7Ci0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zaCwKLSAgICBiZmRfbWFjaF9zaDMsCi0gICAgInNoIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICAgInNoMyIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgICAxLAotICAgIGZhbHNlLAkJCS8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgc2Nhbl9tYWNoLAotICAgIFNIM19ORVhUCi0gIH0sCi0gIHsKLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NoLAotICAgIGJmZF9tYWNoX3NoM2UsCi0gICAgInNoIiwJCQkvKiBhcmNoX25hbWUgICovCi0gICAgInNoM2UiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gICAgMSwKLSAgICBmYWxzZSwJCQkvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIHNjYW5fbWFjaCwKLSAgICBTSDNFX05FWFQKLSAgfSwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfc2hfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfc2gsCi0gIGJmZF9tYWNoX3NoLAotICAic2giLAkJCQkvKiBhcmNoX25hbWUgICovCi0gICJzaCIsCQkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDEsCi0gIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgc2Nhbl9tYWNoLAotICBTSF9ORVhUCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1zcGFyYy5jIGIvYmZkL2NwdS1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzRiZDkyLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIFNQQVJDIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIERvbid0IG1peCAzMiBiaXQgYW5kIDY0IGJpdCBmaWxlcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnNwYXJjX2NvbXBhdGlibGUKLSAgUEFSQU1TICgoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICosIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqKSk7Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotc3BhcmNfY29tcGF0aWJsZSAoYSwgYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5iaXRzX3Blcl93b3JkICE9IGItPmJpdHNfcGVyX3dvcmQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUgKGEsIGIpOwotfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17Ci0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzpzcGFyY2xldCIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzFdLAotICB9LAotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnNwYXJjbGl0ZSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzJdLAotICB9LAotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfdjhwbHVzLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnY4cGx1cyIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzNdLAotICB9LAotICB7Ci0gICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzp2OHBsdXNhIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbNF0sCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUsCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmM6c3BhcmNsaXRlX2xlIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbNV0sCi0gIH0sCi0gIHsKLSAgICA2NCwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICA2NCwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY192OSwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzp2OSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzZdLAotICB9LAotICB7Ci0gICAgNjQsCS8qIGJpdHMgaW4gYSB3b3JkICovCi0gICAgNjQsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc3BhcmMsCi0gICAgYmZkX21hY2hfc3BhcmNfdjlhLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnY5YSIsCi0gICAgMywKLSAgICBmYWxzZSwKLSAgICBzcGFyY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgIDAsCi0gIH0KLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfc3BhcmNfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyYywKLSAgICAic3BhcmMiLAotICAgICJzcGFyYyIsCi0gICAgMywKLSAgICB0cnVlLCAvKiB0aGUgZGVmYXVsdCAqLwotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMF0sCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXRpYzMwLmMgYi9iZmQvY3B1LXRpYzMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNzIzZjcuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF90aWMzMF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF90aWMzMCwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgInRpYzMwIiwKLSAgInRtczMyMGMzMCIsCi0gIDIsCi0gIHRydWUsCQkJCS8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXRpYzgwLmMgYi9iZmQvY3B1LXRpYzgwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMjg2NmUuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS10aWM4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciBUSSBUTVMzMjBDODAgKE1WUCkgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggYXQgQ3lnbnVzIHN1cHBvcnQgKGZuZkBjeWdudXMuY29tKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF90aWM4MF9hcmNoID0KLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfdGljODAsCQkvKiBiZmRfYXJjaGl0ZWN0dXJlIGVudW0gKi8KLSAgICAwLAkJCQkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJ0aWM4MCIsCQkJLyogYXJjaGl0ZWN0dXJlIG5hbWUgKi8KLSAgICAidGljODAiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gICAgMiwJCQkJLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8KLSAgICB0cnVlLAkJCS8qIGRlZmF1bHQgbWFjaGluZSBmb3IgYXJjaGl0ZWN0dXJlICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICBOVUxMLAkJCQkvKiBQb2ludGVyIHRvIG5leHQgaW4gY2hhaW4gKi8KLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdjg1MC5jIGIvYmZkL2NwdS12ODUwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOTQxM2QuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS12ODUwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBORUMgVjg1MCBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLXN0YXRpYyBib29sZWFuIAotc2NhbiAoaW5mbywgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqIGluZm87Ci0gICAgIGNvbnN0IGNoYXIgKiBzdHJpbmc7Ci17Ci0gIGNvbnN0IGNoYXIgKnB0cl9zcmM7Ci0gIGNvbnN0IGNoYXIgKnB0cl90c3Q7Ci0gIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiBGaXJzdCB0ZXN0IGZvciBhbiBleGFjdCBtYXRjaCAqLwotICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTZWUgaG93IG11Y2ggb2YgdGhlIHN1cHBsaWVkIHN0cmluZyBtYXRjaGVzIHdpdGggdGhlCi0gICAgIGFyY2hpdGVjdHVyZSwgZWcgdGhlIHN0cmluZyBtNjhrOjY4MDIwIHdvdWxkIG1hdGNoIHRoZSBtNjhrIGVudHJ5Ci0gICAgIHVwIHRvIHRoZSA6LCB0aGVuIHdlIGdldCBsZWZ0IHdpdGggdGhlIG1hY2hpbmUgbnVtYmVyICovCi0KLSAgZm9yIChwdHJfc3JjID0gc3RyaW5nLCBwdHJfdHN0ID0gaW5mby0+YXJjaF9uYW1lOyAKLSAgICAgICAqcHRyX3NyYyAmJiAqcHRyX3RzdDsKLSAgICAgICBwdHJfc3JjKyssIHB0cl90c3QrKykgCi0gICAgewotICAgICAgaWYgKCpwdHJfc3JjICE9ICpwdHJfdHN0KSBicmVhazsKLSAgICB9Ci0KLSAgLyogQ2hld2VkIHVwIGFzIG11Y2ggb2YgdGhlIGFyY2hpdGVjdHVyZSBhcyB3aWxsIG1hdGNoLCBza2lwIGFueQotICAgICBjb2xvbnMgKi8KLSAgaWYgKCpwdHJfc3JjID09ICc6JykKLSAgICBwdHJfc3JjKys7Ci0gIAotICBpZiAoKnB0cl9zcmMgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBub3RoaW5nIG1vcmUsIHRoZW4gb25seSBrZWVwIHRoaXMgb25lIGlmIGl0IGlzIHRoZSBkZWZhdWx0Ci0JIG1hY2hpbmUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCi0gICAgICByZXR1cm4gaW5mby0+dGhlX2RlZmF1bHQ7Ci0gICAgfQotCi0gIG51bWJlciA9IDA7Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnB0cl9zcmMpKQotICAgIHsKLSAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgKiBwdHJfc3JjICAtICcwJzsKLSAgICAgIHB0cl9zcmMrKzsKLSAgICB9Ci0KLSAgc3dpdGNoIChudW1iZXIpIAotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOiAgYXJjaCA9IGJmZF9hcmNoX3Y4NTA7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfdjg1MGVhOiBhcmNoID0gYmZkX2FyY2hfdjg1MDsgYnJlYWs7Ci0gICAgZGVmYXVsdDogIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYXJjaCAhPSBpbmZvLT5hcmNoKSAKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG51bWJlciAhPSBpbmZvLT5tYWNoKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBOKG51bWJlciwgcHJpbnQsIGRlZmF1bHQsIG5leHQpICBcCi17ICAzMiwgMzIsIDgsIGJmZF9hcmNoX3Y4NTAsIG51bWJlciwgInY4NTAiLCBwcmludCwgMiwgZGVmYXVsdCwgXAotICAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCBzY2FuLCBuZXh0IH0KLQotI2RlZmluZSBORVhUIE5VTEwKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKLXsKLSAgTiAoYmZkX21hY2hfdjg1MGUsICAidjg1MGUiLCAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKLSAgTiAoYmZkX21hY2hfdjg1MGVhLCAidjg1MGVhIiwgZmFsc2UsIE5VTEwpCi19OwotCi0jdW5kZWYgTkVYVAotI2RlZmluZSBORVhUICZhcmNoX2luZm9fc3RydWN0WzBdCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdjg1MF9hcmNoID0KLSAgTiAoYmZkX21hY2hfdjg1MCwgInY4NTAiLCB0cnVlLCBORVhUKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdmF4LmMgYi9iZmQvY3B1LXZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGM2ZDM5Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtdmF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBiZmQgYmFjay1lbmQgZm9yIHZheCBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdmF4X2FyY2ggPQotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF92YXgsCi0gICAgMCwJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgICAidmF4IiwKLSAgICAidmF4IiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS13NjUuYyBiL2JmZC9jcHUtdzY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZjY4YjMuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS13NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBXREMgNjU4MTYgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1YmxpdzY1ZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3UgdzY1b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7Ci0KLXN0YXRpYyBib29sZWFuIAotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmNtcChzdHJpbmcsInc2NSIpID09IDApIHJldHVybiB0cnVlOwotICBpZiAoc3RyY21wKHN0cmluZywidzY1ODE2IikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdzY1X2FyY2ggPQotewotICAxNiwJCQkJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgMjQsCQkJCS8qIDI0IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX3c2NSwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgInc2NSIsCQkJLyogYXJjaF9uYW1lICAqLwotICAidzY1IiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIHNjYW5fbWFjaCwKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXdlMzJrLmMgYi9iZmQvY3B1LXdlMzJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGNiYzEuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS13ZTMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciB3ZTMyayBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBCcmVuZGFuIEtlaG9lIChicmVuZGFuQGNzLndpZGVuZXIuZWR1KS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfd2UzMmtfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3dlMzJrLAotICAgIDMyMDAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJ3ZTMyayIsCi0gICAgIndlMzJrOjMyMDAwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS16OGsuYyBiL2JmZC9jcHUtejhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjY2U4ZWIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS16OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgWjgwMG4gYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotCi0jaWYgMAkJCQkvKiBub3QgdXNlZCBjdXJyZW50bHkgKi8KLS8qCi1SZWxvY2F0aW9ucyBmb3IgdGhlIFo4SwotCi0qLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaG93dG8xNl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfMTYgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaG93dG84X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+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/PyBiZmQuaCBsaWJiZmQuaCBsaWJjb2ZmLmggdGV4cHV0LmxvZwotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9ICQoRE9DRklMRVMpCmRpZmYgLS1naXQgYS9iZmQvZG9jL01ha2VmaWxlLmluIGIvYmZkL2RvYy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxMzliMi4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLi4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQkZEX0hPU1RfNjRCSVRfTE9ORyA9IEBCRkRfSE9TVF82NEJJVF9MT05HQAotQkZEX0hPU1RfNjRfQklUID0gQEJGRF9IT1NUXzY0X0JJVEAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEID0gQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQAotQkZEX0hPU1RfVV82NF9CSVQgPSBAQkZEX0hPU1RfVV82NF9CSVRACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1DT1JFRklMRSA9IEBDT1JFRklMRUAKLUNPUkVGTEFHID0gQENPUkVGTEFHQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxEID0gQExEQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OTSA9IEBOTUAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVRERUZJTkVTID0gQFRERUZJTkVTQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV0lOMzJMREZMQUdTID0gQFdJTjMyTERGTEFHU0AKLVdJTjMyTElCQUREID0gQFdJTjMyTElCQUREQAotYWxsX2JhY2tlbmRzID0gQGFsbF9iYWNrZW5kc0AKLWJmZF9iYWNrZW5kcyA9IEBiZmRfYmFja2VuZHNACi1iZmRfbWFjaGluZXMgPSBAYmZkX21hY2hpbmVzQAotbCA9IEBsQAotdGRlZmF1bHRzID0gQHRkZWZhdWx0c0AKLXdvcmRzaXplID0gQHdvcmRzaXplQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLURPQ0ZJTEVTID0gYW91dHgudGV4aSAgYXJjaGl2ZS50ZXhpIGFyY2h1cmVzLnRleGkgXAotCWJmZHQudGV4aSAgY2FjaGUudGV4aSBjb2ZmY29kZS50ZXhpIFwKLQljb3JlLnRleGkgZWxmLnRleGkgZWxmY29kZS50ZXhpICBmb3JtYXQudGV4aSAgbGliYmZkLnRleGkgIFwKLQlvcG5jbHMudGV4aSAgcmVsb2MudGV4aSAgc2VjdGlvbi50ZXhpICBcCi0Jc3ltcy50ZXhpICB0YXJnZXRzLnRleGkgaW5pdC50ZXhpIGhhc2gudGV4aSBsaW5rZXIudGV4aQotCi0KLVBST1RPUyA9IGFyY2hpdmUucCBhcmNodXJlcy5wIGJmZC5wIFwKLQkgY29yZS5wIGZvcm1hdC5wIFwKLQlsaWJiZmQucCBvcG5jbHMucCByZWxvYy5wIFwKLQlzZWN0aW9uLnAgc3ltcy5wIHRhcmdldHMucCAgXAotCWZvcm1hdC5wICBjb3JlLnAgaW5pdC5wCi0KLQotSVBST1RPUyA9IGNhY2hlLmlwIGxpYmJmZC5pcCByZWxvYy5pcCBpbml0LmlwIGFyY2h1cmVzLmlwIGNvZmZjb2RlLmlwCi0KLSMgU1JDRE9DLCBTUkNQUk9ULCBTUkNJUFJPVCBvbmx5IHVzZWQgdG8gc2lkZXN0ZXAgU3VuIE1ha2UgYnVnIGluIGludGVyYWN0aW9uIAotIyBiZXR3ZWVuIFZQQVRIIGFuZCBzdWZmaXggcnVsZXMuICBJZiB5b3UgdXNlIEdOVSBNYWtlLCBwZXJoYXBzIG90aGVyIE1ha2VzLAotIyB5b3UgZG9uJ3QgbmVlZCB0aGVzZSB0aHJlZToKLVNSQ0RPQyA9ICQoc3JjZGlyKS8uLi9hb3V0eC5oICAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jIFwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyAkKHNyY2RpcikvLi4vYmZkLmMgXAotCSQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oIFwKLQkkKHNyY2RpcikvLi4vY29yZWZpbGUuYyAkKHNyY2RpcikvLi4vZWxmLmMgXAotCSQoc3JjZGlyKS8uLi9lbGZjb2RlLmggICQoc3JjZGlyKS8uLi9mb3JtYXQuYyBcCi0JJChzcmNkaXIpLy4uL2xpYmJmZC5jICQoc3JjZGlyKS8uLi9vcG5jbHMuYyBcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMgICQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgXAotCSQoc3JjZGlyKS8uLi9zeW1zLmMgICQoc3JjZGlyKS8uLi90YXJnZXRzLmMgXAotCSQoc3JjZGlyKS8uLi9oYXNoLmMgJChzcmNkaXIpLy4uL2xpbmtlci5jCi0KLQotU1JDUFJPVCA9ICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgXAotCSQoc3JjZGlyKS8uLi9iZmQuYyAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCAkKHNyY2RpcikvLi4vY29yZWZpbGUuYyBcCi0JJChzcmNkaXIpLy4uL2Zvcm1hdC5jICQoc3JjZGlyKS8uLi9saWJiZmQuYyBcCi0JJChzcmNkaXIpLy4uL29wbmNscy5jICQoc3JjZGlyKS8uLi9yZWxvYy5jIFwKLQkkKHNyY2RpcikvLi4vc2VjdGlvbi5jICQoc3JjZGlyKS8uLi9zeW1zLmMgXAotCSQoc3JjZGlyKS8uLi90YXJnZXRzLmMgJChzcmNkaXIpLy4uL2luaXQuYwotCi0KLVNSQ0lQUk9UID0gJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpLy4uL2xpYmJmZC5jIFwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYyAkKHNyY2RpcikvLi4vY3B1LWg4MzAwLmMgXAotCSQoc3JjZGlyKS8uLi9jcHUtaTk2MC5jICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jIFwKLQkkKHNyY2RpcikvLi4vaW5pdC5jCi0KLQotVEVYSURJUiA9ICQoc3JjZGlyKS8uLi8uLi90ZXhpbmZvL2ZzZgotCi1pbmZvX1RFWElORk9TID0gYmZkLnRleGluZm8KLQotTUtET0MgPSBjaGV3JChFWEVFWFRfRk9SX0JVSUxEKQotCi1ub2luc3RfVEVYSU5GT1MgPSBiZmRpbnQudGV4aQotCi1NT1NUTFlDTEVBTkZJTEVTID0gJChNS0RPQykgKi5vCi0KLUNMRUFORklMRVMgPSBzLSogKi5wICouaXAKLQotRElTVENMRUFORklMRVMgPSBiZmQuPz8gYmZkLj8/PyBiZmQuaCBsaWJiZmQuaCBsaWJjb2ZmLmggdGV4cHV0LmxvZwotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9ICQoRE9DRklMRVMpCi1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzCi1DT05GSUdfSEVBREVSID0gLi4vY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGJmZC5pbmZvCi1EVklTID0gYmZkLmR2aQotVEVYSU5GT1MgPSBiZmQudGV4aW5mbwotRElTVF9DT01NT04gPSAgQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5kdmkgLmluZm8gLnBzIC50ZXhpIC50ZXhpbmZvIC50eGkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgZG9jL01ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0KLWJmZC5pbmZvOiBiZmQudGV4aW5mbwotYmZkLmR2aTogYmZkLnRleGluZm8KLQotCi1EVklQUyA9IGR2aXBzCi0KLS50ZXhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnRleGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnR4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0uZHZpLnBzOgotCSQoRFZJUFMpICQ8IC1vICRACi0KLWluc3RhbGwtaW5mby1hbTogJChJTkZPX0RFUFMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmZvZGlyKQotCUBsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgaWZpbGUgaW4gYGNkICQkZCAmJiBlY2hvICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV1gOyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgJCRkLyQkaWZpbGU7IHRoZW4gXAotCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZSI7IFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZTsgXAotCSAgICBlbHNlIDogOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQlAJChQT1NUX0lOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUiO1wKLQkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIHx8IDo7XAotCSAgZG9uZTsgXAotCWVsc2UgOiA7IGZpCi0KLXVuaW5zdGFsbC1pbmZvOgotCSQoUFJFX1VOSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpaT15ZXM7IFwKLQllbHNlIGlpPTsgZmk7IFwKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0IC16ICIkaWkiIFwKLQkgICAgfHwgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgLS1yZW1vdmUgJCRmaWxlOyBcCi0JZG9uZQotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgKGNkICQoREVTVERJUikkKGluZm9kaXIpICYmIHJtIC1mICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV0pOyBcCi0JZG9uZQotCi1kaXN0LWluZm86ICQoSU5GT19ERVBTKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBmaWxlIGluIGBjZCAkJGQgJiYgZXZhbCBlY2hvICQkYmFzZSpgOyBkbyBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLW1vc3RseWNsZWFuLWFtaW5mbzoKLQktcm0gLWYgYmZkLmF1eCBiZmQuY3AgYmZkLmNwcyBiZmQuZHZpIGJmZC5mbiBiZmQuZm5zIGJmZC5reSBiZmQua3lzIFwKLQkgIGJmZC5wcyBiZmQubG9nIGJmZC5wZyBiZmQudG9jIGJmZC50cCBiZmQudHBzIGJmZC52ciBiZmQudnJzIFwKLQkgIGJmZC5vcCBiZmQudHIgYmZkLmN2IGJmZC5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLXRhZ3M6IFRBR1MKLVRBR1M6Ci0KLQotZGlzdGRpciA9ICQodG9wX2J1aWxkZGlyKS8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi0KLXN1YmRpciA9IGRvYwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KLWluZm8tYW06ICQoSU5GT19ERVBTKQotaW5mbzogaW5mby1hbQotZHZpLWFtOiAkKERWSVMpCi1kdmk6IGR2aS1hbQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stYW0KLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KLWluc3RhbGwtZXhlYy1hbToKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCi0KLWluc3RhbGwtZGF0YS1hbToKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLWFtCi11bmluc3RhbGwtYW06Ci11bmluc3RhbGw6IHVuaW5zdGFsbC1hbQotYWxsLWFtOiBNYWtlZmlsZQotYWxsLXJlZGlyZWN0OiBhbGwtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOgotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoTU9TVExZQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTU9TVExZQ0xFQU5GSUxFUykKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKLW1vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuLWFtOiAgY2xlYW4tYW1pbmZvIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLWFtCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1hbWluZm8gZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0KLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIFwKLQkJZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQotLlBIT05ZOiBpbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWluZm8gbW9zdGx5Y2xlYW4tYW1pbmZvIFwKLWRpc3RjbGVhbi1hbWluZm8gY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tYW1pbmZvIHRhZ3MgZGlzdGRpciBcCi1pbmZvLWFtIGluZm8gZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIFwKLWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBcCi1pbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIFwKLWFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgXAotZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gXAotbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotCi0kKE1LRE9DKTogY2hldy5vCi0JJChDQ19GT1JfQlVJTEQpIC1vICQoTUtET0MpIGNoZXcubyAkKExPQURMSUJFUykgJChMREZMQUdTKQotCi1jaGV3Lm86IGNoZXcuYwotCSQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4uIC1JJChzcmNkaXIpLy4uIC1JJChzcmNkaXIpLy4uLy4uL2luY2x1ZGUgLUkkKHNyY2RpcikvLi4vLi4vaW50bCAtSS4uLy4uL2ludGwgJChIX0NGTEFHUykgJChDRkxBR1MpICQoc3JjZGlyKS9jaGV3LmMKLQotcHJvdG9zOiBsaWJiZmQuaCBsaWJjb2ZmLmggYmZkLmgKLQotYmZkLmluZm8gYmZkLmR2aTogJChET0NGSUxFUykgYmZkc3VtbS50ZXhpIGJmZC50ZXhpbmZvCi0KLSMgV2UgY2FuJ3QgcmVwbGFjZSB0aGVzZSBydWxlcyB3aXRoIGFuIGltcGxpY2l0IHJ1bGUsIGJlY2F1c2UKLSMgbWFrZXMgd2l0aG91dCBWUEFUSCBzdXBwb3J0IGNvdWxkbid0IGZpbmQgdGhlIC5oIGZpbGVzIGluIGAuLicuCi0KLSMgV2UgdXNlIHMtWFhYIHRhcmdldHMgc28gdGhhdCB3ZSBjYW4gZGlzdHJpYnV0ZSB0aGUgaW5mbyBmaWxlcywKLSMgYW5kIHBlcm1pdCBwZW9wbGUgdG8gcmVidWlsZCB0aGVtLCB3aXRob3V0IHJlcXVpcmluZyB0aGUgbWFrZWluZm8KLSMgcHJvZ3JhbS4gIElmIHNvbWVib2R5IHRyaWVzIHRvIHJlYnVpbGQgaW5mbywgYnV0IG5vbmUgb2YgdGhlIC50ZXhpCi0jIGZpbGVzIGhhdmUgY2hhbmdlZCwgdGhlbiB0aGlzIE1ha2VmaWxlIHdpbGwgYnVpbGQgY2hldywgYW5kIHdpbGwKLSMgYnVpbGQgYWxsIG9mIHRoZSBzdGFtcCBmaWxlcywgYnV0IHdpbGwgbm90IGFjdHVhbGx5IGhhdmUgdG8gcmVidWlsZAotIyBiZmQuaW5mby4KLQotcy1hb3V0eDogJChNS0RPQykgJChzcmNkaXIpLy4uL2FvdXR4LmggJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vYW91dHguaCA+YW91dHgudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGFvdXR4LnRtcCBhb3V0eC50ZXhpCi0JdG91Y2ggcy1hb3V0eAotYW91dHgudGV4aTogcy1hb3V0eAotCi1zLWFyY2hpdmU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vYXJjaGl2ZS5jID5hcmNoaXZlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhcmNoaXZlLnRtcCBhcmNoaXZlLnRleGkKLQl0b3VjaCBzLWFyY2hpdmUKLWFyY2hpdmUudGV4aTogcy1hcmNoaXZlCi0KLXMtYXJjaHVyZXM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID5hcmNodXJlcy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYXJjaHVyZXMudG1wIGFyY2h1cmVzLnRleGkKLQl0b3VjaCBzLWFyY2h1cmVzCi1hcmNodXJlcy50ZXhpOiBzLWFyY2h1cmVzCi0KLSMgV2UgdXNlIGJmZHQudGV4aSwgcmF0aGVyIHRoYW4gYmZkLnRleGksIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGgKLSMgYmZkLnRleGluZm8gb24gYW4gOC4zIGZpbGVzeXN0ZW0uCi1zLWJmZDogJChNS0RPQykgJChzcmNkaXIpLy4uL2JmZC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9iZmQuYyA+YmZkLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQudG1wIGJmZHQudGV4aQotCXRvdWNoIHMtYmZkCi1iZmR0LnRleGk6IHMtYmZkCi0KLXMtY2FjaGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9jYWNoZS5jID5jYWNoZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgY2FjaGUudG1wIGNhY2hlLnRleGkKLQl0b3VjaCBzLWNhY2hlCi1jYWNoZS50ZXhpOiBzLWNhY2hlCi0KLXMtY29mZmNvZGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2NvZmZjb2RlLmggPmNvZmZjb2RlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjb2ZmY29kZS50bXAgY29mZmNvZGUudGV4aQotCXRvdWNoIHMtY29mZmNvZGUKLWNvZmZjb2RlLnRleGk6IHMtY29mZmNvZGUKLQotcy1jb3JlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vY29yZWZpbGUuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jID5jb3JlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjb3JlLnRtcCBjb3JlLnRleGkKLQl0b3VjaCBzLWNvcmUKLWNvcmUudGV4aTogcy1jb3JlCi0KLXMtZWxmOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZWxmLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vZWxmLmMgPmVsZi50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZWxmLnRtcCBlbGYudGV4aQotCXRvdWNoIHMtZWxmCi1lbGYudGV4aTogcy1lbGYKLQotcy1lbGZjb2RlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZWxmY29kZS5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2VsZmNvZGUuaCA+ZWxmY29kZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZWxmY29kZS50bXAgZWxmY29kZS50ZXhpCi0JdG91Y2ggcy1lbGZjb2RlCi1lbGZjb2RlLnRleGk6IHMtZWxmY29kZQotCi1zLWZvcm1hdDogJChNS0RPQykgJChzcmNkaXIpLy4uL2Zvcm1hdC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2Zvcm1hdC5jID5mb3JtYXQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGZvcm1hdC50bXAgZm9ybWF0LnRleGkKLQl0b3VjaCBzLWZvcm1hdAotZm9ybWF0LnRleGk6IHMtZm9ybWF0Ci0KLXMtbGliYmZkOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vbGliYmZkLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2xpYmJmZC5jID5saWJiZmQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC50bXAgbGliYmZkLnRleGkKLQl0b3VjaCBzLWxpYmJmZAotbGliYmZkLnRleGk6IHMtbGliYmZkCi0KLXMtb3BuY2xzOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vb3BuY2xzLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyICA8JChzcmNkaXIpLy4uL29wbmNscy5jID5vcG5jbHMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIG9wbmNscy50bXAgb3BuY2xzLnRleGkKLQl0b3VjaCBzLW9wbmNscwotb3BuY2xzLnRleGk6IHMtb3BuY2xzCi0KLXMtcmVsb2M6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9yZWxvYy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3JlbG9jLmMgPnJlbG9jLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSByZWxvYy50bXAgcmVsb2MudGV4aQotCXRvdWNoIHMtcmVsb2MKLXJlbG9jLnRleGk6IHMtcmVsb2MKLQotcy1zZWN0aW9uOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vc2VjdGlvbi5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3NlY3Rpb24uYyA+c2VjdGlvbi50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2Ugc2VjdGlvbi50bXAgc2VjdGlvbi50ZXhpCi0JdG91Y2ggcy1zZWN0aW9uCi1zZWN0aW9uLnRleGk6IHMtc2VjdGlvbgotCi1zLXN5bXM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9zeW1zLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vc3ltcy5jID5zeW1zLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBzeW1zLnRtcCBzeW1zLnRleGkKLQl0b3VjaCBzLXN5bXMKLXN5bXMudGV4aTogcy1zeW1zCi0KLXMtdGFyZ2V0czogJChNS0RPQykgJChzcmNkaXIpLy4uL3RhcmdldHMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi90YXJnZXRzLmMgPnRhcmdldHMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRhcmdldHMudG1wIHRhcmdldHMudGV4aQotCXRvdWNoIHMtdGFyZ2V0cwotdGFyZ2V0cy50ZXhpOiBzLXRhcmdldHMKLQotcy1pbml0OiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vaW5pdC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2luaXQuYyA+aW5pdC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgaW5pdC50bXAgaW5pdC50ZXhpCi0JdG91Y2ggcy1pbml0Ci1pbml0LnRleGk6IHMtaW5pdAotCi1zLWhhc2g6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9oYXNoLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vaGFzaC5jID5oYXNoLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBoYXNoLnRtcCBoYXNoLnRleGkKLQl0b3VjaCBzLWhhc2gKLWhhc2gudGV4aTogcy1oYXNoCi0KLXMtbGlua2VyOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vbGlua2VyLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vbGlua2VyLmMgPmxpbmtlci50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgbGlua2VyLnRtcCBsaW5rZXIudGV4aQotCXRvdWNoIHMtbGlua2VyCi1saW5rZXIudGV4aTogcy1saW5rZXIKLQotbGliYmZkLmg6ICQoc3JjZGlyKS8uLi9saWJiZmQtaW4uaAlcCi0JJChzcmNkaXIpLy4uL2luaXQuYwkJXAotCSQoc3JjZGlyKS8uLi9saWJiZmQuYwkJXAotCSQoc3JjZGlyKS8uLi9jYWNoZS5jCQlcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMJCVwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYwkJXAotCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKLQkkKE1LRE9DKQotCWNhdCAkKHNyY2RpcikvLi4vbGliYmZkLWluLmggPmxpYmJmZC5oIAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vaW5pdC5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2xpYmJmZC5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2NhY2hlLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vcmVsb2MuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2VsZi5jID4+bGliYmZkLmgKLQotbGliY29mZi5oOiAkKHNyY2RpcikvLi4vbGliY29mZi1pbi5oCVwKLQkkKHNyY2RpcikvLi4vY29mZmNvZGUuaAkJXAotCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKLQkkKE1LRE9DKQotCWNhdCAkKHNyY2RpcikvLi4vbGliY29mZi1pbi5oID5saWJjb2ZmLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggPj5saWJjb2ZmLmgKLQotYmZkLmg6ICQoc3JjZGlyKS8uLi9iZmQtaW4uaCAJCVwKLQkkKHNyY2RpcikvLi4vaW5pdC5jIAkJXAotCSQoc3JjZGlyKS8uLi9vcG5jbHMuYyAJCVwKLQkkKHNyY2RpcikvLi4vbGliYmZkLmMgCQlcCi0JJChzcmNkaXIpLy4uL3NlY3Rpb24uYyAJCVwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYwkJXAotCSQoc3JjZGlyKS8uLi9yZWxvYy5jCQlcCi0JJChzcmNkaXIpLy4uL3N5bXMuYwkJXAotCSQoc3JjZGlyKS8uLi9iZmQuYwkJXAotCSQoc3JjZGlyKS8uLi9hcmNoaXZlLmMJCVwKLQkkKHNyY2RpcikvLi4vY29yZWZpbGUuYwkJXAotCSQoc3JjZGlyKS8uLi90YXJnZXRzLmMJCVwKLQkkKHNyY2RpcikvLi4vZm9ybWF0LmMJCVwKLQkkKHNyY2RpcikvcHJvdG8uc3RyCQlcCi0JJChNS0RPQykKLQljYXQgJChzcmNkaXIpLy4uL2JmZC1pbi5oID5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vaW5pdC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL29wbmNscy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2xpYmJmZC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3NlY3Rpb24uYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9hcmNodXJlcy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3JlbG9jLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vc3ltcy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2JmZC5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2FyY2hpdmUuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3RhcmdldHMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9mb3JtYXQuYyA+PmJmZC5oCQotCWVjaG8gIiNpZmRlZiBfX2NwbHVzcGx1cyIgPj5iZmQuaAotCWVjaG8gIn0iID4+YmZkLmgKLQllY2hvICIjZW5kaWYiID4+YmZkLmgKLQllY2hvICIjZW5kaWYiID4+YmZkLmgKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9iZmQudGV4aW5mbyBiL2JmZC9kb2MvYmZkLnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZGY4N2MuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9iZmQudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi1caW5wdXQgdGV4aW5mby50ZXgKLUBzZXRmaWxlbmFtZSBiZmQuaW5mbwotQGMgJElkJAotQHRleAotJSBOT1RFIExPQ0FMIEtMVUdFIFRPIEFWT0lEIFRPTyBNVUNIIFdISVRFU1BBQ0UKLVxnbG9iYWxcbG9uZ1xkZWZcZXhhbXBsZXslCi1cYmVnaW5ncm91cAotXGxldFxhYm92ZWVudmJyZWFrPVxwYXIKLVxsZXRcYWZ0ZXJlbnZicmVhaz1ccGFyCi1ccGFyc2tpcD0wcHQKLVxsaXNwfQotXGdsb2JhbFxsb25nXGRlZlxFZXhhbXBsZXslCi1cRWxpc3AKLVxlbmRncm91cAotXHZza2lwIC1ccGFyc2tpcCUgdG8gY2FuY2VsIG91dCBlZmZlY3Qgb2YgZm9sbG93aW5nIFxwYXIKLX0KLUBlbmQgdGV4Ci1Ac3luaW5kZXggZm4gY3AKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogQmZkOiAoYmZkKS4gICAgICAgICAgICAgICAgICAgVGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEJGRCBsaWJyYXJ5LgotCi1Db3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgc3ViamVjdCB0byB0aGUgdGVybXMKLW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggaW5jbHVkZXMgdGhlIHByb3Zpc2lvbiB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi1AaWZ0ZXgKLUBjQGZpbmFsb3V0Ci1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb24KLUBjQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldHRpdGxlIExJQiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIExpYnJhcnkKLUB0aXRsZXBhZ2UKLUB0aXRsZXtsaWJiZmR9Ci1Ac3VidGl0bGV7VGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgTGlicmFyeX0KLUBzcCAxCi1Ac3VidGl0bGUgRmlyc3QgRWRpdGlvbi0tLUJGRCB2ZXJzaW9uIDwgMy4wCi1Ac3VidGl0bGUgQXByaWwgMTk5MQotQGF1dGhvciB7U3RldmUgQ2hhbWJlcmxhaW59Ci1AYXV0aG9yIHtDeWdudXMgU3VwcG9ydH0KLUBwYWdlCi0KLUB0ZXgKLVxkZWZcJCMxJHt7IzF9fSAgJSBLbHVnZTogY29sbGVjdCBSQ1MgcmV2aXNpb24gaW5mbyB3aXRob3V0ICQuLi4kCi1ceGRlZlxtYW52ZXJze1wkUmV2aXNpb24kfSAgJSBGb3IgdXNlIGluIGhlYWRlcnMsIGZvb3RlcnMgdG9vCi17XHBhcnNraXA9MHB0Ci1caGZpbGwgQ3lnbnVzIFN1cHBvcnRccGFyCi1caGZpbGwgc2FjXEBjeWdudXMuY29tXHBhcgotXGhmaWxsIHtcaXQgQkZEfSwgXG1hbnZlcnNccGFyCi1caGZpbGwgXFRlWHt9aW5mbyBcdGV4aW5mb3ZlcnNpb25ccGFyCi19Ci1cZ2xvYmFsXHBhcmluZGVudD0wcHQgJSBTdGV2ZSBsaWtlcyBpdCB0aGlzIHdheQotQGVuZCB0ZXgKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgc3ViamVjdCB0byB0aGUgdGVybXMKLW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggaW5jbHVkZXMgdGhlIHByb3Zpc2lvbiB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgdGl0bGVwYWdlCi1AZW5kIGlmdGV4Ci0KLUBub2RlIFRvcCwgT3ZlcnZpZXcsIChkaXIpLCAoZGlyKQotQGlmaW5mbwotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgYmluYXJ5IGZpbGUgZGVzY3JpcHRvciBsaWJyYXJ5IGxpYmJmZC4KLUBlbmQgaWZpbmZvCi0KLUBtZW51Ci0qIE92ZXJ2aWV3OjoJCQlPdmVydmlldyBvZiBCRkQKLSogQkZEIGZyb250IGVuZDo6CQlCRkQgZnJvbnQgZW5kCi0qIEJGRCBiYWNrIGVuZHM6OgkJQkZEIGJhY2sgZW5kcwotKiBJbmRleDo6CQkJSW5kZXgKLUBlbmQgbWVudQotCi1Abm9kZSBPdmVydmlldywgQkZEIGZyb250IGVuZCwgVG9wLCBUb3AKLUBjaGFwdGVyIEludHJvZHVjdGlvbgotQGNpbmRleCBCRkQKLUBjaW5kZXggd2hhdCBpcyBpdD8KLUJGRCBpcyBhIHBhY2thZ2Ugd2hpY2ggYWxsb3dzIGFwcGxpY2F0aW9ucyB0byB1c2UgdGhlCi1zYW1lIHJvdXRpbmVzIHRvIG9wZXJhdGUgb24gb2JqZWN0IGZpbGVzIHdoYXRldmVyIHRoZSBvYmplY3QgZmlsZQotZm9ybWF0LiAgQSBuZXcgb2JqZWN0IGZpbGUgZm9ybWF0IGNhbiBiZSBzdXBwb3J0ZWQgc2ltcGx5IGJ5Ci1jcmVhdGluZyBhIG5ldyBCRkQgYmFjayBlbmQgYW5kIGFkZGluZyBpdCB0byB0aGUgbGlicmFyeS4KLQotQkZEIGlzIHNwbGl0IGludG8gdHdvIHBhcnRzOiB0aGUgZnJvbnQgZW5kLCBhbmQgdGhlIGJhY2sgZW5kcyAob25lIGZvcgotZWFjaCBvYmplY3QgZmlsZSBmb3JtYXQpLgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0gVGhlIGZyb250IGVuZCBvZiBCRkQgcHJvdmlkZXMgdGhlIGludGVyZmFjZSB0byB0aGUgdXNlci4gSXQgbWFuYWdlcwotbWVtb3J5IGFuZCB2YXJpb3VzIGNhbm9uaWNhbCBkYXRhIHN0cnVjdHVyZXMuIFRoZSBmcm9udCBlbmQgYWxzbwotZGVjaWRlcyB3aGljaCBiYWNrIGVuZCB0byB1c2UgYW5kIHdoZW4gdG8gY2FsbCBiYWNrIGVuZCByb3V0aW5lcy4KLUBpdGVtIFRoZSBiYWNrIGVuZHMgcHJvdmlkZSBCRkQgaXRzIHZpZXcgb2YgdGhlIHJlYWwgd29ybGQuIEVhY2ggYmFjawotZW5kIHByb3ZpZGVzIGEgc2V0IG9mIGNhbGxzIHdoaWNoIHRoZSBCRkQgZnJvbnQgZW5kIGNhbiB1c2UgdG8gbWFpbnRhaW4KLWl0cyBjYW5vbmljYWwgZm9ybS4gVGhlIGJhY2sgZW5kcyBhbHNvIG1heSBrZWVwIGFyb3VuZCBpbmZvcm1hdGlvbiBmb3IKLXRoZWlyIG93biB1c2UsIGZvciBncmVhdGVyIGVmZmljaWVuY3kuCi1AZW5kIGl0ZW1pemUKLUBtZW51Ci0qIEhpc3Rvcnk6OgkJCUhpc3RvcnkKLSogSG93IEl0IFdvcmtzOjoJCUhvdyBJdCBXb3JrcwotKiBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvOjoJV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbwotQGVuZCBtZW51Ci0KLUBub2RlIEhpc3RvcnksIEhvdyBJdCBXb3JrcywgT3ZlcnZpZXcsIE92ZXJ2aWV3Ci1Ac2VjdGlvbiBIaXN0b3J5Ci0KLU9uZSBzcHVyIGJlaGluZCBCRkQgd2FzIHRoZSBkZXNpcmUsIG9uIHRoZSBwYXJ0IG9mIHRoZSBHTlUgOTYwIHRlYW0gYXQKLUludGVsIE9yZWdvbiwgZm9yIGludGVyb3BlcmFiaWxpdHkgb2YgYXBwbGljYXRpb25zIG9uIHRoZWlyIENPRkYgYW5kCi1iLm91dCBmaWxlIGZvcm1hdHMuICBDeWdudXMgd2FzIHByb3ZpZGluZyBHTlUgc3VwcG9ydCBmb3IgdGhlIHRlYW0sIGFuZAotd2FzIGNvbnRyYWN0ZWQgdG8gcHJvdmlkZSB0aGUgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eS4KLQotVGhlIG5hbWUgY2FtZSBmcm9tIGEgY29udmVyc2F0aW9uIERhdmlkIFdhbGxhY2Ugd2FzIGhhdmluZyB3aXRoIFJpY2hhcmQKLVN0YWxsbWFuIGFib3V0IHRoZSBsaWJyYXJ5OiBSTVMgc2FpZCB0aGF0IGl0IHdvdWxkIGJlIHF1aXRlIGhhcmQtLS1EYXZpZAotc2FpZCBgYEJGRCcnLiAgU3RhbGxtYW4gd2FzIHJpZ2h0LCBidXQgdGhlIG5hbWUgc3R1Y2suCi0KLUF0IHRoZSBzYW1lIHRpbWUsIFJlYWR5IFN5c3RlbXMgd2FudGVkIG11Y2ggdGhlIHNhbWUgdGhpbmcsIGJ1dCBmb3IKLWRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzOiBJRUVFLTY5NSwgT2FzeXMsIFNyZWNvcmRzLCBhLm91dCBhbmQgNjhrCi1jb2ZmLgotCi1CRkQgd2FzIGZpcnN0IGltcGxlbWVudGVkIGJ5IG1lbWJlcnMgb2YgQ3lnbnVzIFN1cHBvcnQ7IFN0ZXZlCi1DaGFtYmVybGFpbiAoQGNvZGV7c2FjQEBjeWdudXMuY29tfSksIEpvaG4gR2lsbW9yZQotKEBjb2Rle2dudUBAY3lnbnVzLmNvbX0pLCBLLiAgUmljaGFyZCBQaXhsZXkgKEBjb2Rle3JpY2hAQGN5Z251cy5jb219KQotYW5kIERhdmlkIEhlbmtlbC1XYWxsYWNlIChAY29kZXtndW1ieUBAY3lnbnVzLmNvbX0pLgotCi0KLQotQG5vZGUgSG93IEl0IFdvcmtzLCBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvLCBIaXN0b3J5LCBPdmVydmlldwotQHNlY3Rpb24gSG93IFRvIFVzZSBCRkQKLQotVG8gdXNlIHRoZSBsaWJyYXJ5LCBpbmNsdWRlIEBmaWxle2JmZC5ofSBhbmQgbGluayB3aXRoIEBmaWxle2xpYmJmZC5hfS4JCi0KLUJGRCBwcm92aWRlcyBhIGNvbW1vbiBpbnRlcmZhY2UgdG8gdGhlIHBhcnRzIG9mIGFuIG9iamVjdCBmaWxlCi1mb3IgYSBjYWxsaW5nIGFwcGxpY2F0aW9uLiAKLQotV2hlbiBhbiBhcHBsaWNhdGlvbiBzdWNlc3NmdWxseSBvcGVucyBhIHRhcmdldCBmaWxlIChvYmplY3QsIGFyY2hpdmUsIG9yCi13aGF0ZXZlciksIGEgcG9pbnRlciB0byBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQuIFRoaXMgcG9pbnRlcgotcG9pbnRzIHRvIGEgc3RydWN0dXJlIGNhbGxlZCBAY29kZXtiZmR9LCBkZXNjcmliZWQgaW4KLUBmaWxle2JmZC5ofS4gIE91ciBjb252ZW50aW9uIGlzIHRvIGNhbGwgdGhpcyBwb2ludGVyIGEgQkZELCBhbmQKLWluc3RhbmNlcyBvZiBpdCB3aXRoaW4gY29kZSBAY29kZXthYmZkfS4gIEFsbCBvcGVyYXRpb25zIG9uCi10aGUgdGFyZ2V0IG9iamVjdCBmaWxlIGFyZSBhcHBsaWVkIGFzIG1ldGhvZHMgdG8gdGhlIEJGRC4gIFRoZSBtYXBwaW5nIGlzCi1kZWZpbmVkIHdpdGhpbiBAY29kZXtiZmQuaH0gaW4gYSBzZXQgb2YgbWFjcm9zLCBhbGwgYmVnaW5uaW5nCi13aXRoIEBzYW1we2JmZF99IHRvIHJlZHVjZSBuYW1lc3BhY2UgcG9sbHV0aW9uLgotCi1Gb3IgZXhhbXBsZSwgdGhpcyBzZXF1ZW5jZSBkb2VzIHdoYXQgeW91IHdvdWxkIHByb2JhYmx5IGV4cGVjdDoKLXJldHVybiB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zIGluIGFuIG9iamVjdCBmaWxlIGF0dGFjaGVkIHRvIGEgQkZECi1AY29kZXthYmZkfS4gCi0KLUBsaXNwCi1AYyBAY2FydG91Y2hlCi0jaW5jbHVkZSAiYmZkLmgiCi0KLXVuc2lnbmVkIGludCBudW1iZXJfb2Zfc2VjdGlvbnMoYWJmZCkKLWJmZCAqYWJmZDsKLUB7Ci0gIHJldHVybiBiZmRfY291bnRfc2VjdGlvbnMoYWJmZCk7Ci1AfQotQGMgQGVuZCBjYXJ0b3VjaGUKLUBlbmQgbGlzcAotCi1UaGUgYWJzdHJhY3Rpb24gdXNlZCB3aXRoaW4gQkZEIGlzIHRoYXQgYW4gb2JqZWN0IGZpbGUgaGFzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotYSBoZWFkZXIsCi1AaXRlbQotYSBudW1iZXIgb2Ygc2VjdGlvbnMgY29udGFpbmluZyByYXcgZGF0YSAoQHB4cmVme1NlY3Rpb25zfSksCi1AaXRlbQotYSBzZXQgb2YgcmVsb2NhdGlvbnMgKEBweHJlZntSZWxvY2F0aW9uc30pLCBhbmQKLUBpdGVtCi1zb21lIHN5bWJvbCBpbmZvcm1hdGlvbiAoQHB4cmVme1N5bWJvbHN9KS4KLUBlbmQgaXRlbWl6ZQotQG5vaW5kZW50Ci1BbHNvLCBCRkRzIG9wZW5lZCBmb3IgYXJjaGl2ZXMgaGF2ZSB0aGUgYWRkaXRpb25hbCBhdHRyaWJ1dGUgb2YgYW4gaW5kZXgKLWFuZCBjb250YWluIHN1Ym9yZGluYXRlIEJGRHMuIFRoaXMgYXBwcm9hY2ggaXMgZmluZSBmb3IgYS5vdXQgYW5kIGNvZmYsCi1idXQgbG9zZXMgZWZmaWNpZW5jeSB3aGVuIGFwcGxpZWQgdG8gZm9ybWF0cyBzdWNoIGFzIFMtcmVjb3JkcyBhbmQKLUlFRUUtNjk1LgotCi1Abm9kZSBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvLCAgLCBIb3cgSXQgV29ya3MsIE92ZXJ2aWV3Ci1Ac2VjdGlvbiBXaGF0IEJGRCBWZXJzaW9uIDIgQ2FuIERvCi1AaW5jbHVkZSBiZmRzdW1tLnRleGkKLQotQG5vZGUgQkZEIGZyb250IGVuZCwgQkZEIGJhY2sgZW5kcywgT3ZlcnZpZXcsIFRvcAotQGNoYXB0ZXIgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgYmZkdC50ZXhpCi0KLUBtZW51Ci0qIE1lbW9yeSBVc2FnZTo6Ci0qIEluaXRpYWxpemF0aW9uOjoKLSogU2VjdGlvbnM6OgotKiBTeW1ib2xzOjoKLSogQXJjaGl2ZXM6OgotKiBGb3JtYXRzOjoKLSogUmVsb2NhdGlvbnM6OgotKiBDb3JlIEZpbGVzOjoKLSogVGFyZ2V0czo6Ci0qIEFyY2hpdGVjdHVyZXM6OgotKiBPcGVuaW5nIGFuZCBDbG9zaW5nOjoKLSogSW50ZXJuYWw6OgotKiBGaWxlIENhY2hpbmc6OgotKiBMaW5rZXIgRnVuY3Rpb25zOjoKLSogSGFzaCBUYWJsZXM6OgotQGVuZCBtZW51Ci0KLUBub2RlIE1lbW9yeSBVc2FnZSwgSW5pdGlhbGl6YXRpb24sIEJGRCBmcm9udCBlbmQsIEJGRCBmcm9udCBlbmQKLUBzZWN0aW9uIE1lbW9yeSB1c2FnZQotQkZEIGtlZXBzIGFsbCBvZiBpdHMgaW50ZXJuYWwgc3RydWN0dXJlcyBpbiBvYnN0YWNrcy4gVGhlcmUgaXMgb25lIG9ic3RhY2sKLXBlciBvcGVuIEJGRCBmaWxlLCBpbnRvIHdoaWNoIHRoZSBjdXJyZW50IHN0YXRlIGlzIHN0b3JlZC4gV2hlbiBhIEJGRCBpcwotY2xvc2VkLCB0aGUgb2JzdGFjayBpcyBkZWxldGVkLCBhbmQgc28gZXZlcnl0aGluZyB3aGljaCBoYXMgYmVlbgotYWxsb2NhdGVkIGJ5IEJGRCBmb3IgdGhlIGNsb3NpbmcgZmlsZSBpcyB0aHJvd24gYXdheS4KLQotQkZEIGRvZXMgbm90IGZyZWUgYW55dGhpbmcgY3JlYXRlZCBieSBhbiBhcHBsaWNhdGlvbiwgYnV0IHBvaW50ZXJzIGludG8KLUBjb2Rle2JmZH0gc3RydWN0dXJlcyBiZWNvbWUgaW52YWxpZCBvbiBhIEBjb2Rle2JmZF9jbG9zZX07IGZvciBleGFtcGxlLAotYWZ0ZXIgYSBAY29kZXtiZmRfY2xvc2V9IHRoZSB2ZWN0b3IgcGFzc2VkIHRvCi1AY29kZXtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0gaXMgc3RpbGwgYXJvdW5kLCBzaW5jZSBpdCBoYXMgYmVlbgotYWxsb2NhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgYnV0IHRoZSBkYXRhIHRoYXQgaXQgcG9pbnRlZCB0byBhcmUKLWxvc3QuCi0KLVRoZSBnZW5lcmFsIHJ1bGUgaXMgdG8gbm90IGNsb3NlIGEgQkZEIHVudGlsIGFsbCBvcGVyYXRpb25zIGRlcGVuZGVudAotdXBvbiBkYXRhIGZyb20gdGhlIEJGRCBoYXZlIGJlZW4gY29tcGxldGVkLCBvciBhbGwgdGhlIGRhdGEgZnJvbSB3aXRoaW4KLXRoZSBmaWxlIGhhcyBiZWVuIGNvcGllZC4gVG8gaGVscCB3aXRoIHRoZSBtYW5hZ2VtZW50IG9mIG1lbW9yeSwgdGhlcmUKLWlzIGEgZnVuY3Rpb24gKEBjb2Rle2JmZF9hbGxvY19zaXplfSkgd2hpY2ggcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCi1pbiBvYnN0YWNrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN1cHBsaWVkIEJGRC4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvCi1zZWxlY3QgdGhlIGdyZWVkaWVzdCBvcGVuIEJGRCwgY2xvc2UgaXQgdG8gcmVjbGFpbSB0aGUgbWVtb3J5LCBwZXJmb3JtCi1zb21lIG9wZXJhdGlvbiBhbmQgcmVvcGVuIHRoZSBCRkQgYWdhaW4sIHRvIGdldCBhIGZyZXNoIGNvcHkgb2YgdGhlIGRhdGEKLXN0cnVjdHVyZXMuCi0KLUBub2RlIEluaXRpYWxpemF0aW9uLCBTZWN0aW9ucywgTWVtb3J5IFVzYWdlLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgaW5pdC50ZXhpCi0KLUBub2RlIFNlY3Rpb25zLCBTeW1ib2xzLCBJbml0aWFsaXphdGlvbiwgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIHNlY3Rpb24udGV4aQotCi1Abm9kZSBTeW1ib2xzLCBBcmNoaXZlcywgU2VjdGlvbnMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBzeW1zLnRleGkKLQotQG5vZGUgQXJjaGl2ZXMsIEZvcm1hdHMsIFN5bWJvbHMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBhcmNoaXZlLnRleGkKLQotQG5vZGUgRm9ybWF0cywgUmVsb2NhdGlvbnMsIEFyY2hpdmVzLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgZm9ybWF0LnRleGkKLQotQG5vZGUgUmVsb2NhdGlvbnMsIENvcmUgRmlsZXMsIEZvcm1hdHMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICByZWxvYy50ZXhpCi0KLUBub2RlIENvcmUgRmlsZXMsIFRhcmdldHMsIFJlbG9jYXRpb25zLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgY29yZS50ZXhpCi0KLUBub2RlIFRhcmdldHMsIEFyY2hpdGVjdHVyZXMsIENvcmUgRmlsZXMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICB0YXJnZXRzLnRleGkKLQotQG5vZGUgQXJjaGl0ZWN0dXJlcywgT3BlbmluZyBhbmQgQ2xvc2luZywgVGFyZ2V0cywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGFyY2h1cmVzLnRleGkKLQotQG5vZGUgT3BlbmluZyBhbmQgQ2xvc2luZywgSW50ZXJuYWwsIEFyY2hpdGVjdHVyZXMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBvcG5jbHMudGV4aQotCi1Abm9kZSBJbnRlcm5hbCwgRmlsZSBDYWNoaW5nLCBPcGVuaW5nIGFuZCBDbG9zaW5nLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgbGliYmZkLnRleGkKLQotQG5vZGUgRmlsZSBDYWNoaW5nLCBMaW5rZXIgRnVuY3Rpb25zLCBJbnRlcm5hbCwgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGNhY2hlLnRleGkKLQotQG5vZGUgTGlua2VyIEZ1bmN0aW9ucywgSGFzaCBUYWJsZXMsIEZpbGUgQ2FjaGluZywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGxpbmtlci50ZXhpCi0KLUBub2RlIEhhc2ggVGFibGVzLCAsIExpbmtlciBGdW5jdGlvbnMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBoYXNoLnRleGkKLQotQG5vZGUgQkZEIGJhY2sgZW5kcywgSW5kZXgsIEJGRCBmcm9udCBlbmQsIFRvcAotQGNoYXB0ZXIgQkZEIGJhY2sgZW5kcwotQG1lbnUKLSogV2hhdCB0byBQdXQgV2hlcmU6OgotKiBhb3V0IDo6CWEub3V0IGJhY2tlbmRzCi0qIGNvZmYgOjoJY29mZiBiYWNrZW5kcwotKiBlbGYgIDo6CWVsZiBiYWNrZW5kcwotQGlnbm9yZQotKiBvYXN5cyA6OglvYXN5cyBiYWNrZW5kcwotKiBpZWVlIDo6CWllZWUgYmFja2VuZAotKiBzcmVjb3JkIDo6CXMtcmVjb3JkIGJhY2tlbmQKLUBlbmQgaWdub3JlCi1AZW5kIG1lbnUKLUBub2RlIFdoYXQgdG8gUHV0IFdoZXJlLCBhb3V0LCBCRkQgYmFjayBlbmRzLCBCRkQgYmFjayBlbmRzCi1BbGwgb2YgQkZEIGxpdmVzIGluIG9uZSBkaXJlY3RvcnkuCi0KLUBub2RlIGFvdXQsIGNvZmYsIFdoYXQgdG8gUHV0IFdoZXJlLCBCRkQgYmFjayBlbmRzCi1AaW5jbHVkZSAgYW91dHgudGV4aQotCi1Abm9kZSBjb2ZmLCBlbGYsIGFvdXQsIEJGRCBiYWNrIGVuZHMKLUBpbmNsdWRlICBjb2ZmY29kZS50ZXhpCi0KLUBub2RlIGVsZiwgICwgY29mZiwgQkZEIGJhY2sgZW5kcwotQGluY2x1ZGUgIGVsZi50ZXhpCi1AYyBMZWF2ZSB0aGlzIG91dCB1bnRpbCB0aGUgZmlsZSBoYXMgc29tZSBhY3R1YWwgY29udGVudHMuLi4KLUBjIEBpbmNsdWRlICBlbGZjb2RlLnRleGkKLQotQG5vZGUgSW5kZXgsICAsIEJGRCBiYWNrIGVuZHMgLCBUb3AKLUB1bm51bWJlcmVkIEluZGV4Ci1AcHJpbnRpbmRleCBjcAotCi1AdGV4Ci0lIEkgdGhpbmsgc29tZXRoaW5nIGxpa2UgQGNvbG9waG9uIHNob3VsZCBiZSBpbiB0ZXhpbmZvLiAgSW4gdGhlCi0lIG1lYW50aW1lOgotXGxvbmdcZGVmXGNvbG9waG9ue1xoYm94IHRvMHB0e31cdmZpbGwKLVxjZW50ZXJsaW5le1RoZSBib2R5IG9mIHRoaXMgbWFudWFsIGlzIHNldCBpbn0KLVxjZW50ZXJsaW5le1xmb250bmFtZVx0ZW5ybSx9Ci1cY2VudGVybGluZXt3aXRoIGhlYWRpbmdzIGluIHtcYmZcZm9udG5hbWVcdGVuYmZ9fQotXGNlbnRlcmxpbmV7YW5kIGV4YW1wbGVzIGluIHtcdHRcZm9udG5hbWVcdGVudHR9Ln0KLVxjZW50ZXJsaW5le3tcaXRcZm9udG5hbWVcdGVuaXRcL30gYW5kfQotXGNlbnRlcmxpbmV7e1xzbFxmb250bmFtZVx0ZW5zbFwvfX0KLVxjZW50ZXJsaW5le2FyZSB1c2VkIGZvciBlbXBoYXNpcy59XHZmaWxsfQotXHBhZ2VcY29sb3Bob24KLSUgQmxhbWU6IGRvY0BjeWdudXMuY29tLCAyOG1hcjkxLgotQGVuZCB0ZXgKLQotQGNvbnRlbnRzCi1AYnllCmRpZmYgLS1naXQgYS9iZmQvZG9jL2JmZGludC50ZXhpIGIvYmZkL2RvYy9iZmRpbnQudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwOWIzNC4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL2JmZGludC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTg4NSArMCwwIEBACi1caW5wdXQgdGV4aW5mbwotQHNldGZpbGVuYW1lIGJmZGludC5pbmZvCi0KLUBzZXR0aXRsZSBCRkQgSW50ZXJuYWxzCi1AaWZ0ZXgKLUB0aXRsZXBhZ2UKLUB0aXRsZXtCRkQgSW50ZXJuYWxzfQotQGF1dGhvcntJYW4gTGFuY2UgVGF5bG9yfQotQGF1dGhvcntDeWdudXMgU29sdXRpb25zfQotQHBhZ2UKLUBlbmQgaWZ0ZXgKLQotQG5vZGUgVG9wCi1AdG9wIEJGRCBJbnRlcm5hbHMKLUByYWlzZXNlY3Rpb25zCi1AY2luZGV4IGJmZCBpbnRlcm5hbHMKLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgc29tZSBCRkQgaW50ZXJuYWwgaW5mb3JtYXRpb24gd2hpY2ggbWF5IGJlCi1oZWxwZnVsIHdoZW4gd29ya2luZyBvbiBCRkQuICBJdCBpcyB2ZXJ5IGluY29tcGxldGUuCi0KLVRoaXMgZG9jdW1lbnQgaXMgbm90IHVwZGF0ZWQgcmVndWxhcmx5LCBhbmQgbWF5IGJlIG91dCBvZiBkYXRlLiAgSXQgd2FzCi1sYXN0IG1vZGlmaWVkIG9uICREYXRlJC4KLQotVGhlIGluaXRpYWwgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IHdhcyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IKLUBlbWFpbHtpYW5AQGN5Z251cy5jb219LgotCi1AbWVudQotKiBCRkQgb3ZlcnZpZXc6OgkJQkZEIG92ZXJ2aWV3Ci0qIEJGRCBndWlkZWxpbmVzOjoJCUJGRCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCi0qIEJGRCB0YXJnZXQgdmVjdG9yOjoJCUJGRCB0YXJnZXQgdmVjdG9yCi0qIEJGRCBnZW5lcmF0ZWQgZmlsZXM6OgkJQkZEIGdlbmVyYXRlZCBmaWxlcwotKiBCRkQgbXVsdGlwbGUgY29tcGlsYXRpb25zOjoJRmlsZXMgY29tcGlsZWQgbXVsdGlwbGUgdGltZXMgaW4gQkZECi0qIEJGRCByZWxvY2F0aW9uIGhhbmRsaW5nOjoJQkZEIHJlbG9jYXRpb24gaGFuZGxpbmcKLSogQkZEIEVMRiBzdXBwb3J0OjoJCUJGRCBFTEYgc3VwcG9ydAotKiBCRkQgZ2xvc3Nhcnk6OgkJR2xvc3NhcnkKLSogSW5kZXg6OgkJCUluZGV4Ci1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIG92ZXJ2aWV3Ci1Ac2VjdGlvbiBCRkQgb3ZlcnZpZXcKLQotQkZEIGlzIGEgbGlicmFyeSB3aGljaCBwcm92aWRlcyBhIHNpbmdsZSBpbnRlcmZhY2UgdG8gcmVhZCBhbmQgd3JpdGUKLW9iamVjdCBmaWxlcywgZXhlY3V0YWJsZXMsIGFyY2hpdmUgZmlsZXMsIGFuZCBjb3JlIGZpbGVzIGluIGFueSBmb3JtYXQuCi0KLUBtZW51Ci0qIEJGRCBsaWJyYXJ5IGludGVyZmFjZXM6OglCRkQgbGlicmFyeSBpbnRlcmZhY2VzCi0qIEJGRCBsaWJyYXJ5IHVzZXJzOjoJCUJGRCBsaWJyYXJ5IHVzZXJzCi0qIEJGRCB2aWV3OjoJCQlUaGUgQkZEIHZpZXcgb2YgYSBmaWxlCi0qIEJGRCBibGluZG5lc3M6OgkJQkZEIGxvc2VzIGluZm9ybWF0aW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIGxpYnJhcnkgaW50ZXJmYWNlcwotQHN1YnNlY3Rpb24gQkZEIGxpYnJhcnkgaW50ZXJmYWNlcwotCi1PbmUgd2F5IHRvIGxvb2sgYXQgdGhlIEJGRCBsaWJyYXJ5IGlzIHRvIGRpdmlkZSBpdCBpbnRvIGZvdXIgcGFydHMgYnkKLXR5cGUgb2YgaW50ZXJmYWNlLgotCi1UaGUgZmlyc3QgaW50ZXJmYWNlIGlzIHRoZSBzZXQgb2YgZ2VuZXJpYyBmdW5jdGlvbnMgd2hpY2ggcHJvZ3JhbXMgdXNpbmcKLXRoZSBCRkQgbGlicmFyeSB3aWxsIGNhbGwuICBUaGVzZSBnZW5lcmljIGZ1bmN0aW9uIG5vcm1hbGx5IHRyYW5zbGF0ZQotZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnRvIGNhbGxzIHRvIHJvdXRpbmVzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBhCi1wYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIE1hbnkgb2YgdGhlc2UgZ2VuZXJpYyBmdW5jdGlvbnMgYXJlCi1hY3R1YWxseSBkZWZpbmVkIGFzIG1hY3JvcyBpbiBAZmlsZXtiZmQuaH0uICBUaGVzZSBmdW5jdGlvbnMgY29tcHJpc2UKLXRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlLgotCi1UaGUgc2Vjb25kIGludGVyZmFjZSBpcyB0aGUgc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBhcHBlYXIgaW4gdGhlIHRhcmdldAotdmVjdG9ycy4gIFRoaXMgaXMgdGhlIGJ1bGsgb2YgdGhlIGNvZGUgaW4gQkZELiAgQSB0YXJnZXQgdmVjdG9yIGlzIGEgc2V0Ci1vZiBmdW5jdGlvbiBwb2ludGVycyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlCi10YXJnZXQgdmVjdG9yIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBnZW5lcmljIEJGRCBmdW5jdGlvbnMuICBUaGVzZQotZnVuY3Rpb25zIGFyZSBhbHdheXMgY2FsbGVkIHRocm91Z2ggdGhlIHRhcmdldCB2ZWN0b3IsIGFuZCBhcmUgbmV2ZXIKLWNhbGxlZCBkaXJlY3RseS4gIFRoZSB0YXJnZXQgdmVjdG9yIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gQHJlZntCRkQKLXRhcmdldCB2ZWN0b3J9LiAgVGhlIHNldCBvZiBmdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGluIGEgcGFydGljdWxhcgotdGFyZ2V0IHZlY3RvciBpcyBvZnRlbiByZWZlcnJlZCB0byBhcyBhIEJGRCBiYWNrZW5kLgotCi1UaGUgdGhpcmQgaW50ZXJmYWNlIGlzIGEgc2V0IG9mIG9kZGJhbGwgZnVuY3Rpb25zIHdoaWNoIGFyZSB0eXBpY2FsbHkKLXNwZWNpZmljIHRvIGEgcGFydGljdWxhciBvYmplY3QgZmlsZSBmb3JtYXQsIGFyZSBub3QgZ2VuZXJpYyBmdW5jdGlvbnMsCi1hbmQgYXJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIEJGRCBsaWJyYXJ5LiAgVGhlc2UgYXJlIHVzZWQgYXMgaG9va3MKLWJ5IHRoZSBsaW5rZXIgYW5kIHRoZSBhc3NlbWJsZXIgd2hlbiBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0Ci1yZXF1aXJlcyBzb21lIGFjdGlvbiB3aGljaCB0aGUgQkZEIGdlbmVyaWMgaW50ZXJmYWNlIGRvZXMgbm90IHByb3ZpZGUuCi1UaGVzZSBmdW5jdGlvbnMgYXJlIHR5cGljYWxseSBkZWNsYXJlZCBpbiBAZmlsZXtiZmQuaH0sIGJ1dCBpbiBtYW55Ci1jYXNlcyB0aGV5IGFyZSBvbmx5IHByb3ZpZGVkIHdoZW4gQkZEIGlzIGNvbmZpZ3VyZWQgd2l0aCBzdXBwb3J0IGZvciBhCi1wYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZXNlIGZ1bmN0aW9ucyBsaXZlIGluIGEgZ3JleSBhcmVhLCBhbmQKLWFyZSBub3QgcmVhbGx5IHBhcnQgb2YgdGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UuCi0KLVRoZSBmb3VydGggaW50ZXJmYWNlIGlzIHRoZSBzZXQgb2YgQkZEIHN1cHBvcnQgZnVuY3Rpb25zIHdoaWNoIGFyZQotY2FsbGVkIGJ5IHRoZSBvdGhlciBCRkQgZnVuY3Rpb25zLiAgVGhlc2UgbWFuYWdlIGlzc3VlcyBsaWtlIG1lbW9yeQotYWxsb2NhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGZpbGUgYWNjZXNzLCBoYXNoIHRhYmxlcywgc3dhcHBpbmcsIGFuZCB0aGUKLWxpa2UuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5ldmVyIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIEJGRCBsaWJyYXJ5LgotCi1Abm9kZSBCRkQgbGlicmFyeSB1c2VycwotQHN1YnNlY3Rpb24gQkZEIGxpYnJhcnkgdXNlcnMKLQotQW5vdGhlciB3YXkgdG8gbG9vayBhdCB0aGUgQkZEIGxpYnJhcnkgaXMgdG8gZGl2aWRlIGl0IGludG8gdGhyZWUgcGFydHMKLWJ5IHRoZSBtYW5uZXIgaW4gd2hpY2ggaXQgaXMgdXNlZC4KLQotVGhlIGZpcnN0IHVzZSBpcyB0byByZWFkIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9iamVjdCBmaWxlIHJlYWRlcnMgYXJlCi1wcm9ncmFtcyBsaWtlIEBzYW1we2dkYn0sIEBzYW1we25tfSwgQHNhbXB7b2JqZHVtcH0sIGFuZCBAc2FtcHtvYmpjb3B5fS4KLVRoZXNlIHByb2dyYW1zIHVzZSBCRkQgdG8gdmlldyBhbiBvYmplY3QgZmlsZSBpbiBhIGdlbmVyaWMgZm9ybS4gIFRoZQotb2ZmaWNpYWwgQkZEIGludGVyZmFjZSBpcyBub3JtYWxseSBmdWxseSBhZGVxdWF0ZSBmb3IgdGhlc2UgcHJvZ3JhbXMuCi0KLVRoZSBzZWNvbmQgdXNlIGlzIHRvIHdyaXRlIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9iamVjdCBmaWxlIHdyaXRlcnMgYXJlCi1wcm9ncmFtcyBsaWtlIEBzYW1we2dhc30gYW5kIEBzYW1we29iamNvcHl9LiAgVGhlc2UgcHJvZ3JhbXMgdXNlIEJGRCB0bwotY3JlYXRlIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UgaXMgbm9ybWFsbHkgYWRlcXVhdGUKLWZvciB0aGVzZSBwcm9ncmFtcywgYnV0IGZvciBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgdGhlIGFzc2VtYmxlciBuZWVkcwotc29tZSBhZGRpdGlvbmFsIGhvb2tzIGluIG9yZGVyIHRvIHNldCBwYXJ0aWN1bGFyIGZsYWdzIG9yIG90aGVyCi1pbmZvcm1hdGlvbi4gIFRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlIGluY2x1ZGVzIGZ1bmN0aW9ucyB0byBjb3B5Ci1wcml2YXRlIGluZm9ybWF0aW9uIGZyb20gb25lIG9iamVjdCBmaWxlIHRvIGFub3RoZXIsIGFuZCB0aGVzZSBmdW5jdGlvbnMKLWFyZSB1c2VkIGJ5IEBzYW1we29iamNvcHl9IHRvIGF2b2lkIGluZm9ybWF0aW9uIGxvc3MuCi0KLVRoZSB0aGlyZCB1c2UgaXMgdG8gbGluayBvYmplY3QgZmlsZXMuICBUaGVyZSBpcyBvbmx5IG9uZSBvYmplY3QgZmlsZQotbGlua2VyLCBAc2FtcHtsZH0uICBPcmlnaW5hbGx5LCBAc2FtcHtsZH0gd2FzIGFuIG9iamVjdCBmaWxlIHJlYWRlciBhbmQKLWFuIG9iamVjdCBmaWxlIHdyaXRlciwgYW5kIGl0IGRpZCB0aGUgbGluayBvcGVyYXRpb24gdXNpbmcgdGhlIGdlbmVyaWMKLUJGRCBzdHJ1Y3R1cmVzLiAgSG93ZXZlciwgdGhpcyB0dXJuZWQgb3V0IHRvIGJlIHRvbyBzbG93IGFuZCB0b28gbWVtb3J5Ci1pbnRlbnNpdmUuCi0KLVRoZSBvZmZpY2lhbCBCRkQgbGlua2VyIGZ1bmN0aW9ucyB3ZXJlIHdyaXR0ZW4gdG8gcGVybWl0IHNwZWNpZmljIEJGRAotYmFja2VuZHMgdG8gcGVyZm9ybSB0aGUgbGluayB3aXRob3V0IHRyYW5zbGF0aW5nIHRocm91Z2ggdGhlIGdlbmVyaWMKLXN0cnVjdHVyZXMsIGluIHRoZSBub3JtYWwgY2FzZSB3aGVyZSBhbGwgdGhlIGlucHV0IGZpbGVzIGFuZCBvdXRwdXQgZmlsZQotaGF2ZSB0aGUgc2FtZSBvYmplY3QgZmlsZSBmb3JtYXQuICBOb3QgYWxsIG9mIHRoZSBiYWNrZW5kcyBjdXJyZW50bHkKLWltcGxlbWVudCB0aGUgbmV3IGludGVyZmFjZSwgYW5kIHRoZXJlIGFyZSBkZWZhdWx0IGxpbmtpbmcgZnVuY3Rpb25zCi13aXRoaW4gQkZEIHdoaWNoIHVzZSB0aGUgZ2VuZXJpYyBzdHJ1Y3R1cmVzIGFuZCB3aGljaCB3b3JrIHdpdGggYWxsCi1iYWNrZW5kcy4KLQotRm9yIHNldmVyYWwgb2JqZWN0IGZpbGUgZm9ybWF0cyB0aGUgbGlua2VyIG5lZWRzIGFkZGl0aW9uYWwgaG9va3Mgd2hpY2gKLWFyZSBub3QgcHJvdmlkZWQgYnkgdGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UsIHBhcnRpY3VsYXJseSBmb3IgZHluYW1pYwotbGlua2luZyBzdXBwb3J0LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSB0eXBpY2FsbHkgY2FsbGVkIGZyb20gdGhlIGxpbmtlcgotZW11bGF0aW9uIHRlbXBsYXRlLgotCi1Abm9kZSBCRkQgdmlldwotQHN1YnNlY3Rpb24gVGhlIEJGRCB2aWV3IG9mIGEgZmlsZQotCi1CRkQgdXNlcyBnZW5lcmljIHN0cnVjdHVyZXMgdG8gbWFuYWdlIGluZm9ybWF0aW9uLiAgSXQgdHJhbnNsYXRlcyBkYXRhCi1pbnRvIHRoZSBnZW5lcmljIGZvcm0gd2hlbiByZWFkaW5nIGZpbGVzLCBhbmQgb3V0IG9mIHRoZSBnZW5lcmljIGZvcm0KLXdoZW4gd3JpdGluZyBmaWxlcy4KLQotQkZEIGRlc2NyaWJlcyBhIGZpbGUgYXMgYSBwb2ludGVyIHRvIHRoZSBAc2FtcHtiZmR9IHR5cGUuICBBIEBzYW1we2JmZH0KLWlzIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHMuICBUaGUgQkZEIGluZm9ybWF0aW9uIGNhbiBiZQotZGlzcGxheWVkIHVzaW5nIHRoZSBAc2FtcHtvYmpkdW1wfSBwcm9ncmFtIHdpdGggdmFyaW91cyBvcHRpb25zLgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIGdlbmVyYWwgaW5mb3JtYXRpb24KLVRoZSBvYmplY3QgZmlsZSBmb3JtYXQsIGEgZmV3IGdlbmVyYWwgZmxhZ3MsIHRoZSBzdGFydCBhZGRyZXNzLgotQGl0ZW0gYXJjaGl0ZWN0dXJlCi1UaGUgYXJjaGl0ZWN0dXJlLCBpbmNsdWRpbmcgYm90aCBhIGdlbmVyYWwgcHJvY2Vzc29yIHR5cGUgKG02OGssIE1JUFMKLWV0Yy4pIGFuZCBhIHNwZWNpZmljIG1hY2hpbmUgbnVtYmVyIChtNjgwMDAsIFI0MDAwLCBldGMuKS4KLUBpdGVtIHNlY3Rpb25zCi1BIGxpc3Qgb2Ygc2VjdGlvbnMuCi1AaXRlbSBzeW1ib2xzCi1BIHN5bWJvbCB0YWJsZS4KLUBlbmQgdGFibGUKLQotQkZEIHJlcHJlc2VudHMgYSBzZWN0aW9uIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YXNlY3Rpb259IHR5cGUuICBFYWNoCi1zZWN0aW9uIGhhcyBhIG5hbWUgYW5kIGEgc2l6ZS4gIE1vc3Qgc2VjdGlvbnMgYWxzbyBoYXZlIGFuIGFzc29jaWF0ZWQKLWJsb2NrIG9mIGRhdGEsIGtub3duIGFzIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgU2VjdGlvbnMgYWxzbyBoYXZlCi1hc3NvY2lhdGVkIGZsYWdzLCBhIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MsIGEgbG9hZCBtZW1vcnkgYWRkcmVzcywgYQotcmVxdWlyZWQgYWxpZ25tZW50LCBhIGxpc3Qgb2YgcmVsb2NhdGlvbnMsIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzCi1pbmZvcm1hdGlvbi4KLQotQkZEIHJlcHJlc2VudHMgYSByZWxvY2F0aW9uIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YXJlbGVudH0gdHlwZS4gIEEKLXJlbG9jYXRpb24gZGVzY3JpYmVzIGFuIGFjdGlvbiB3aGljaCB0aGUgbGlua2VyIG11c3QgdGFrZSB0byBtb2RpZnkgdGhlCi1zZWN0aW9uIGNvbnRlbnRzLiAgUmVsb2NhdGlvbnMgaGF2ZSBhIHN5bWJvbCwgYW4gYWRkcmVzcywgYW4gYWRkZW5kLCBhbmQKLWEgcG9pbnRlciB0byBhIGhvd3RvIHN0cnVjdHVyZSB3aGljaCBkZXNjcmliZXMgaG93IHRvIHBlcmZvcm0gdGhlCi1yZWxvY2F0aW9uLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBAcmVme0JGRCByZWxvY2F0aW9uIGhhbmRsaW5nfS4KLQotQkZEIHJlcHJlc2VudHMgYSBzeW1ib2wgYXMgYSBwb2ludGVyIHRvIHRoZSBAc2FtcHthc3ltYm9sfSB0eXBlLiAgQQotc3ltYm9sIGhhcyBhIG5hbWUsIGEgcG9pbnRlciB0byBhIHNlY3Rpb24sIGFuIG9mZnNldCB3aXRoaW4gdGhhdAotc2VjdGlvbiwgYW5kIHNvbWUgZmxhZ3MuCi0KLUFyY2hpdmUgZmlsZXMgZG8gbm90IGhhdmUgYW55IHNlY3Rpb25zIG9yIHN5bWJvbHMuICBJbnN0ZWFkLCBCRkQKLXJlcHJlc2VudHMgYW4gYXJjaGl2ZSBmaWxlIGFzIGEgZmlsZSB3aGljaCBjb250YWlucyBhIGxpc3Qgb2YKLUBzYW1we2JmZH1zLiAgQkZEIGFsc28gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBhcmNoaXZlIHN5bWJvbCBtYXAsIGFzIGEKLWxpc3Qgb2Ygc3ltYm9sIG5hbWVzLiAgQkZEIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBAc2FtcHtiZmR9Ci13aXRoaW4gdGhlIGFyY2hpdmUgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGVudHJ5IGluIHRoZQotYXJjaGl2ZSBzeW1ib2wgbWFwLgotCi1Abm9kZSBCRkQgYmxpbmRuZXNzCi1Ac3Vic2VjdGlvbiBCRkQgbG9zZXMgaW5mb3JtYXRpb24KLQotTW9zdCBvYmplY3QgZmlsZSBmb3JtYXRzIGhhdmUgaW5mb3JtYXRpb24gd2hpY2ggQkZEIGNhbiBub3QgcmVwcmVzZW50IGluCi1pdHMgZ2VuZXJpYyBmb3JtLCBhdCBsZWFzdCBhcyBjdXJyZW50bHkgZGVmaW5lZC4KLQotVGhlcmUgaXMgb2Z0ZW4gZXhwbGljaXQgaW5mb3JtYXRpb24gd2hpY2ggQkZEIGNhbiBub3QgcmVwcmVzZW50LiAgRm9yCi1leGFtcGxlLCB0aGUgQ09GRiB2ZXJzaW9uIHN0YW1wLCBvciB0aGUgRUxGIHByb2dyYW0gc2VnbWVudHMuICBCRkQKLXByb3ZpZGVzIHNwZWNpYWwgaG9va3MgdG8gaGFuZGxlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBjb3B5aW5nLAotcHJpbnRpbmcsIG9yIGxpbmtpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGUgQkZEIHN1cHBvcnQgZm9yIGEgcGFydGljdWxhcgotb2JqZWN0IGZpbGUgZm9ybWF0IHdpbGwgbm9ybWFsbHkgc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiBpbiBwcml2YXRlIGRhdGEKLWFuZCBoYW5kbGUgaXQgdXNpbmcgdGhlIHNwZWNpYWwgaG9va3MuCi0KLUluIHNvbWUgY2FzZXMgdGhlcmUgaXMgYWxzbyBpbXBsaWNpdCBpbmZvcm1hdGlvbiB3aGljaCBCRkQgY2FuIG5vdAotcmVwcmVzZW50LiAgRm9yIGV4YW1wbGUsIHRoZSBNSVBTIHByb2Nlc3NvciBkaXN0aW5ndWlzaGVzIHNtYWxsIGFuZAotbGFyZ2Ugc3ltYm9scywgYW5kIHJlcXVpcmVzIHRoYXQgYWxsIHNtYWxsIHN5bWJscyBiZSB3aXRoaW4gMzJLIG9mIHRoZQotR1AgcmVnaXN0ZXIuICBUaGlzIG1lYW5zIHRoYXQgdGhlIE1JUFMgYXNzZW1ibGVyIG11c3QgYmUgYWJsZSB0byBtYXJrCi12YXJpYWJsZXMgYXMgZWl0aGVyIHNtYWxsIG9yIGxhcmdlLCBhbmQgdGhlIE1JUFMgbGlua2VyIG11c3Qga25vdyB0byBwdXQKLXNtYWxsIHN5bWJvbHMgd2l0aGluIHJhbmdlIG9mIHRoZSBHUCByZWdpc3Rlci4gIFNpbmNlIEJGRCBjYW4gbm90Ci1yZXByZXNlbnQgdGhpcyBpbmZvcm1hdGlvbiwgdGhpcyBtZWFucyB0aGF0IHRoZSBhc3NlbWJsZXIgYW5kIGxpbmtlcgotbXVzdCBoYXZlIGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlCi1mb3JtYXQgd2hpY2ggaXMgb3V0c2lkZSBvZiB0aGUgQkZEIGxpYnJhcnkuCi0KLVRoaXMgbG9zcyBvZiBpbmZvcm1hdGlvbiBpbmRpY2F0ZXMgYXJlYXMgd2hlcmUgdGhlIEJGRCBwYXJhZGlnbSBicmVha3MKLWRvd24uICBJdCBpcyBub3QgYWN0dWFsbHkgcG9zc2libGUgdG8gcmVwcmVzZW50IHRoZSBteXJpYWQgZGlmZmVyZW5jZXMKLWFtb25nIG9iamVjdCBmaWxlIGZvcm1hdHMgdXNpbmcgYSBzaW5nbGUgZ2VuZXJpYyBpbnRlcmZhY2UsIGF0IGxlYXN0IG5vdAotaW4gdGhlIG1hbm5lciB3aGljaCBCRkQgZG9lcyBpdCB0b2RheS4KLQotTmV2ZXJ0aGVsZXNzLCB0aGUgQkZEIGxpYnJhcnkgZG9lcyBncmVhdGx5IHNpbXBsaWZ5IHRoZSB0YXNrIG9mIGRlYWxpbmcKLXdpdGggb2JqZWN0IGZpbGVzLCBhbmQgcGFydGljdWxhciBwcm9ibGVtcyBjYXVzZWQgYnkgaW5mb3JtYXRpb24gbG9zcwotY2FuIG5vcm1hbGx5IGJlIHNvbHZlZCB1c2luZyBzb21lIHNvcnQgb2YgcmVsYXRpdmVseSBjb25zdHJhaW5lZCBob29rCi1pbnRvIHRoZSBsaWJyYXJ5LgotCi0KLQotQG5vZGUgQkZEIGd1aWRlbGluZXMKLUBzZWN0aW9uIEJGRCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCi1AY2luZGV4IGJmZCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCi1AY2luZGV4IHByb2dyYW1taW5nIGd1aWRlbGluZXMgZm9yIGJmZAotQGNpbmRleCBndWlkZWxpbmVzLCBiZmQgcHJvZ3JhbW1pbmcKLQotVGhlcmUgaXMgYSBsb3Qgb2YgcG9vcmx5IHdyaXR0ZW4gYW5kIGNvbmZ1c2luZyBjb2RlIGluIEJGRC4gIE5ldyBCRkQKLWNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYSBoaWdoZXIgc3RhbmRhcmQuICBNZXJlbHkgYmVjYXVzZSBzb21lIEJGRAotY29kZSBpcyB3cml0dGVuIGluIGEgcGFydGljdWxhciBtYW5uZXIgZG9lcyBub3QgbWVhbiB0aGF0IHlvdSBzaG91bGQKLWVtdWxhdGUgaXQuCi0KLUhlcmUgYXJlIHNvbWUgZ2VuZXJhbCBCRkQgcHJvZ3JhbW1pbmcgZ3VpZGVsaW5lczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUZvbGxvdyB0aGUgR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLUBpdGVtCi1Bdm9pZCBnbG9iYWwgdmFyaWFibGVzLiAgV2UgaWRlYWxseSB3YW50IEJGRCB0byBiZSBmdWxseSByZWVudHJhbnQsIHNvCi10aGF0IGl0IGNhbiBiZSB1c2VkIGluIG11bHRpcGxlIHRocmVhZHMuICBBbGwgdXNlcyBvZiBnbG9iYWwgb3Igc3RhdGljCi12YXJpYWJsZXMgaW50ZXJmZXJlIHdpdGggdGhhdC4gIEluaXRpYWxpemVkIGNvbnN0YW50IHZhcmlhYmxlcyBhcmUgT0ssCi1hbmQgdGhleSBzaG91bGQgYmUgZXhwbGljaXRseSBtYXJrZWQgd2l0aCBjb25zdC4gIEluc3RlYWQgb2YgZ2xvYmFsCi12YXJpYWJsZXMsIHVzZSBkYXRhIGF0dGFjaGVkIHRvIGEgQkZEIG9yIHRvIGEgbGlua2VyIGhhc2ggdGFibGUuCi0KLUBpdGVtCi1BbGwgZXh0ZXJuYWxseSB2aXNpYmxlIGZ1bmN0aW9ucyBzaG91bGQgaGF2ZSBuYW1lcyB3aGljaCBzdGFydCB3aXRoCi1Ac2FtcHtiZmRffS4gIEFsbCBzdWNoIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgaW4gc29tZSBoZWFkZXIgZmlsZSwKLXR5cGljYWxseSBAZmlsZXtiZmQuaH0uICBTZWUsIGZvciBleGFtcGxlLCB0aGUgdmFyaW91cyBkZWNsYXJhdGlvbnMgbmVhcgotdGhlIGVuZCBvZiBAZmlsZXtiZmQtaW4uaH0sIHdoaWNoIG1vc3RseSBkZWNsYXJlIGZ1bmN0aW9ucyByZXF1aXJlZCBieQotc3BlY2lmaWMgbGlua2VyIGVtdWxhdGlvbnMuCi0KLUBpdGVtCi1BbGwgZnVuY3Rpb25zIHdoaWNoIG5lZWQgdG8gYmUgdmlzaWJsZSBmcm9tIG9uZSBmaWxlIHRvIGFub3RoZXIgd2l0aGluCi1CRkQsIGJ1dCBzaG91bGQgbm90IGJlIHZpc2libGUgb3V0c2lkZSBvZiBCRkQsIHNob3VsZCBzdGFydCB3aXRoCi1Ac2FtcHtfYmZkX30uICBBbHRob3VnaCBleHRlcm5hbCBuYW1lcyBiZWdpbm5pbmcgd2l0aCBAc2FtcHtffSBhcmUKLXByb2hpYml0ZWQgYnkgdGhlIEFOU0kgc3RhbmRhcmQsIGluIHByYWN0aWNlIHRoaXMgdXNhZ2Ugd2lsbCBhbHdheXMKLXdvcmssIGFuZCBpdCBpcyByZXF1aXJlZCBieSB0aGUgR05VIGNvZGluZyBzdGFuZGFyZHMuCi0KLUBpdGVtCi1BbHdheXMgcmVtZW1iZXIgdGhhdCBwZW9wbGUgY2FuIGNvbXBpbGUgdXNpbmcgQHNhbXB7LS1lbmFibGUtdGFyZ2V0c30gdG8KLWJ1aWxkIHNldmVyYWwsIG9yIGFsbCwgdGFyZ2V0cyBhdCBvbmNlLiAgSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBsaW5rCi10b2dldGhlciB0aGUgZmlsZXMgZm9yIGFsbCB0YXJnZXRzLgotCi1AaXRlbQotQkZEIGNvZGUgc2hvdWxkIGNvbXBpbGUgd2l0aCBmZXcgb3Igbm8gd2FybmluZ3MgdXNpbmcgQHNhbXB7Z2NjIC1XYWxsfS4KLVNvbWUgd2FybmluZ3MgYXJlIE9LLCBsaWtlIHRoZSBhYnNlbmNlIG9mIGNlcnRhaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zCi13aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAgV2FybmluZ3MgYWJvdXQKLWFtYmlndW91cyBleHByZXNzaW9ucyBhbmQgdGhlIGxpa2Ugc2hvdWxkIGFsd2F5cyBiZSBmaXhlZC4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvcgotQHNlY3Rpb24gQkZEIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggYmZkIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggdGFyZ2V0IHZlY3RvciBpbiBiZmQKLQotQkZEIHN1cHBvcnRzIG11bHRpcGxlIG9iamVjdCBmaWxlIGZvcm1hdHMgYnkgdXNpbmcgdGhlIEBkZm57dGFyZ2V0Ci12ZWN0b3J9LiAgVGhpcyBpcyBzaW1wbHkgYSBzZXQgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggaW1wbGVtZW50Ci1iZWhhdmlvdXIgdGhhdCBpcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi1JbiB0aGlzIHNlY3Rpb24gSSBsaXN0IGFsbCBvZiB0aGUgZW50cmllcyBpbiB0aGUgdGFyZ2V0IHZlY3RvciBhbmQKLWRlc2NyaWJlIHdoYXQgdGhleSBkby4KLQotQG1lbnUKLSogQkZEIHRhcmdldCB2ZWN0b3IgbWlzY2VsbGFuZW91czo6CU1pc2NlbGxhbmVvdXMgY29uc3RhbnRzCi0qIEJGRCB0YXJnZXQgdmVjdG9yIHN3YXA6OgkJU3dhcHBpbmcgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGZvcm1hdDo6CQlGb3JtYXQgdHlwZSBkZXBlbmRlbnQgZnVuY3Rpb25zCi0qIEJGRF9KVU1QX1RBQkxFIG1hY3Jvczo6CQlCRkRfSlVNUF9UQUJMRSBtYWNyb3MKLSogQkZEIHRhcmdldCB2ZWN0b3IgZ2VuZXJpYzo6CQlHZW5lcmljIGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBjb3B5OjoJCUNvcHkgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGNvcmU6OgkJQ29yZSBmaWxlIHN1cHBvcnQgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGFyY2hpdmU6OgkJQXJjaGl2ZSBmdW5jdGlvbnMKLSogQkZEIHRhcmdldCB2ZWN0b3Igc3ltYm9sczo6CQlTeW1ib2wgdGFibGUgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIHJlbG9jczo6CQlSZWxvY2F0aW9uIHN1cHBvcnQKLSogQkZEIHRhcmdldCB2ZWN0b3Igd3JpdGU6OgkJT3V0cHV0IGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBsaW5rOjoJCUxpbmtlciBmdW5jdGlvbnMKLSogQkZEIHRhcmdldCB2ZWN0b3IgZHluYW1pYzo6CQlEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gZnVuY3Rpb25zCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgbWlzY2VsbGFuZW91cwotQHN1YnNlY3Rpb24gTWlzY2VsbGFuZW91cyBjb25zdGFudHMKLQotVGhlIHRhcmdldCB2ZWN0b3Igc3RhcnRzIHdpdGggYSBzZXQgb2YgY29uc3RhbnRzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIG5hbWUKLVRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgdmVjdG9yLiAgVGhpcyBpcyBhbiBhcmJpdHJhcnkgc3RyaW5nLiAgVGhpcyBpcwotaG93IHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIGluIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciB0b29scyB3aGljaAotdXNlIEJGRCwgc3VjaCBhcyB0aGUgQHNhbXB7LW9mb3JtYXR9IGxpbmtlciBvcHRpb24uCi0KLUBpdGVtIGZsYXZvdXIKLUEgZ2VuZXJhbCBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiB0YXJnZXQuICBUaGUgZm9sbG93aW5nIGZsYXZvdXJzIGFyZQotY3VycmVudGx5IGRlZmluZWQ6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIKLVVuZGVmaW5lZCBvciB1bmtub3duLgotQGl0ZW0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKLWEub3V0LgotQGl0ZW0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLUNPRkYuCi1AaXRlbSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLUVDT0ZGLgotQGl0ZW0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotRUxGLgotQGl0ZW0gYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIKLUlFRUUtNjk1LgotQGl0ZW0gYmZkX3RhcmdldF9ubG1fZmxhdm91cgotTkxNLgotQGl0ZW0gYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyCi1PQVNZUy4KLUBpdGVtIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIKLVRla3Ryb25peCBoZXggZm9ybWF0LgotQGl0ZW0gYmZkX3RhcmdldF9zcmVjX2ZsYXZvdXIKLU1vdG9yb2xhIFMtcmVjb3JkIGZvcm1hdC4KLUBpdGVtIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyCi1JbnRlbCBoZXggZm9ybWF0LgotQGl0ZW0gYmZkX3RhcmdldF9zb21fZmxhdm91cgotU09NICh1c2VkIG9uIEhQL1VYKS4KLUBpdGVtIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyCi1vczkwMDAuCi1AaXRlbSBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIKLVZFUlNBZG9zLgotQGl0ZW0gYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyCi1NUy1ET1MuCi1AaXRlbSBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgotb3BlblZNUy4KLUBlbmQgdGFibGUKLQotQGl0ZW0gYnl0ZW9yZGVyCi1UaGUgYnl0ZSBvcmRlciBvZiBkYXRhIGluIHRoZSBvYmplY3QgZmlsZS4gIE9uZSBvZgotQHNhbXB7QkZEX0VORElBTl9CSUd9LCBAc2FtcHtCRkRfRU5ESUFOX0xJVFRMRX0sIG9yCi1Ac2FtcHtCRkRfRU5ESUFOX1VOS05PV059LiAgVGhlIGxhdHRlciB3b3VsZCBiZSB1c2VkIGZvciBhIGZvcm1hdCBzdWNoCi1hcyBTLXJlY29yZHMgd2hpY2ggZG8gbm90IHJlY29yZCB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBkYXRhLgotCi1AaXRlbSBoZWFkZXJfYnl0ZW9yZGVyCi1UaGUgYnl0ZSBvcmRlciBvZiBoZWFkZXIgaW5mb3JtYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlLiAgTm9ybWFsbHkgdGhlCi1zYW1lIGFzIHRoZSBAc2FtcHtieXRlb3JkZXJ9IGZpZWxkLCBidXQgdGhlcmUgYXJlIGNlcnRhaW4gY2FzZXMgd2hlcmUgaXQKLW1heSBiZSBkaWZmZXJlbnQuCi0KLUBpdGVtIG9iamVjdF9mbGFncwotRmxhZ3Mgd2hpY2ggbWF5IGFwcGVhciBpbiB0aGUgQHNhbXB7ZmxhZ3N9IGZpZWxkIG9mIGEgQkZEIHdpdGggdGhpcwotZm9ybWF0LgotCi1AaXRlbSBzZWN0aW9uX2ZsYWdzCi1GbGFncyB3aGljaCBtYXkgYXBwZWFyIGluIHRoZSBAc2FtcHtmbGFnc30gZmllbGQgb2YgYSBzZWN0aW9uIHdpdGhpbiBhCi1CRkQgd2l0aCB0aGlzIGZvcm1hdC4KLQotQGl0ZW0gc3ltYm9sX2xlYWRpbmdfY2hhcgotQSBjaGFyYWN0ZXIgd2hpY2ggdGhlIEMgY29tcGlsZXIgbm9ybWFsbHkgcHV0cyBiZWZvcmUgYSBzeW1ib2wuICBGb3IKLWV4YW1wbGUsIGFuIGEub3V0IGNvbXBpbGVyIHdpbGwgdHlwaWNhbGx5IGdlbmVyYXRlIHRoZSBzeW1ib2wKLUBzYW1we19mb299IGZvciBhIGZ1bmN0aW9uIG5hbWVkIEBzYW1we2Zvb30gaW4gdGhlIEMgc291cmNlLCBpbiB3aGljaAotY2FzZSB0aGlzIGZpZWxkIHdvdWxkIGJlIEBzYW1we199LiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBjaGFyYWN0ZXIsIHRoaXMKLWZpZWxkIHdpbGwgYmUgQHNhbXB7MH0uCi0KLUBpdGVtIGFyX3BhZF9jaGFyCi1UaGUgcGFkZGluZyBjaGFyYWN0ZXIgdG8gdXNlIGF0IHRoZSBlbmQgb2YgYW4gYXJjaGl2ZSBuYW1lLiAgTm9ybWFsbHkKLUBzYW1wey99LgotCi1AaXRlbSBhcl9tYXhfbmFtZWxlbgotVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc2hvcnQgbmFtZSBpbiBhbiBhcmNoaXZlLiAgTm9ybWFsbHkgQHNhbXB7MTR9LgotCi1AaXRlbSBiYWNrZW5kX2RhdGEKLUEgcG9pbnRlciB0byBjb25zdGFudCBiYWNrZW5kIGRhdGEuICBUaGlzIGlzIHVzZWQgYnkgYmFja2VuZHMgdG8gc3RvcmUKLXdoYXRldmVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhleSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHNpbWlsYXIgdGFyZ2V0Ci12ZWN0b3JzIHdoaWNoIHVzZSB0aGUgc2FtZSBzZXRzIG9mIGZ1bmN0aW9ucy4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3Igc3dhcAotQHN1YnNlY3Rpb24gU3dhcHBpbmcgZnVuY3Rpb25zCi0KLUV2ZXJ5IHRhcmdldCB2ZWN0b3IgaGFzIGZ1Y3Rpb24gcG9pbnRlcnMgdXNlZCBmb3Igc3dhcHBpbmcgaW5mb3JtYXRpb24KLWluIGFuZCBvdXQgb2YgdGhlIHRhcmdldCByZXByZXNlbnRhdGlvbi4gIFRoZXJlIGFyZSB0d28gc2V0cyBvZgotZnVuY3Rpb25zOiBvbmUgZm9yIGRhdGEgaW5mb3JtYXRpb24sIGFuZCBvbmUgZm9yIGhlYWRlciBpbmZvcm1hdGlvbi4KLUVhY2ggc2V0IGhhcyB0aHJlZSBzaXplczogNjQtYml0LCAzMi1iaXQsIGFuZCAxNi1iaXQuICBFYWNoIHNpemUgaGFzCi10aHJlZSBhY3R1YWwgZnVuY3Rpb25zOiBwdXQsIGdldCB1bnNpZ25lZCwgYW5kIGdldCBzaWduZWQuCi0KLVRoZXNlIDE4IGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjb252ZXJ0IGRhdGEgYmV0d2VlbiB0aGUgaG9zdCBhbmQgdGFyZ2V0Ci1yZXByZXNlbnRhdGlvbnMuCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGZvcm1hdAotQHN1YnNlY3Rpb24gRm9ybWF0IHR5cGUgZGVwZW5kZW50IGZ1bmN0aW9ucwotCi1FdmVyeSB0YXJnZXQgdmVjdG9yIGhhcyB0aHJlZSBhcnJheXMgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlCi1pbmRleGVkIGJ5IHRoZSBCRkQgZm9ybWF0IHR5cGUuICBUaGUgQkZEIGZvcm1hdCB0eXBlcyBhcmUgYXMgZm9sbG93czoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBiZmRfdW5rbm93bgotVW5rbm93biBmb3JtYXQuICBOb3QgdXNlZCBmb3IgYW55dGhpbmcgdXNlZnVsLgotQGl0ZW0gYmZkX29iamVjdAotT2JqZWN0IGZpbGUuCi1AaXRlbSBiZmRfYXJjaGl2ZQotQXJjaGl2ZSBmaWxlLgotQGl0ZW0gYmZkX2NvcmUKLUNvcmUgZmlsZS4KLUBlbmQgdGFibGUKLQotVGhlIHRocmVlIGFycmF5cyBvZiBmdW5jdGlvbiBwb2ludGVycyBhcmUgYXMgZm9sbG93czoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBiZmRfY2hlY2tfZm9ybWF0Ci1DaGVjayB3aGV0aGVyIHRoZSBCRkQgaXMgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCAob2JqZWN0IGZpbGUsIGFyY2hpdmUKLWZpbGUsIG9yIGNvcmUgZmlsZSkgY29ycmVzcG9uZGluZyB0byB0aGlzIHRhcmdldCB2ZWN0b3IuICBUaGlzIGlzIGNhbGxlZAotYnkgdGhlIEBzYW1we2JmZF9jaGVja19mb3JtYXR9IGZ1bmN0aW9uIHdoZW4gZXhhbWluaW5nIGFuIGV4aXN0aW5nIEJGRC4KLUlmIHRoZSBCRkQgbWF0Y2hlcyB0aGUgZGVzaXJlZCBmb3JtYXQsIHRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIGFueQotZm9ybWF0IHNwZWNpZmljIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIEBzYW1we3RkYXRhfSBmaWVsZCBvZiB0aGUgQkZELgotVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIEJGRCB0YXJnZXQgdmVjdG9yIGZ1bmN0aW9uCi1vbiBhIGZpbGUgb3BlbmVkIGZvciByZWFkaW5nLgotCi1AaXRlbSBiZmRfc2V0X2Zvcm1hdAotU2V0IHRoZSBmb3JtYXQgb2YgYSBCRkQgd2hpY2ggd2FzIGNyZWF0ZWQgZm9yIG91dHB1dC4gIFRoaXMgaXMgY2FsbGVkIGJ5Ci10aGUgQHNhbXB7YmZkX3NldF9mb3JtYXR9IGZ1bmN0aW9uIGFmdGVyIGNyZWF0aW5nIHRoZSBCRkQgd2l0aCBhCi1mdW5jdGlvbiBzdWNoIGFzIEBzYW1we2JmZF9vcGVud30uICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSBmb3JtYXQKLXNwZWNpZmljIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHdyaXRlIG91dCBhbiBvYmplY3QgZmlsZSBvciB3aGF0ZXZlciBvZgotdGhlIGdpdmVuIGZvcm1hdC4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBCRkQKLXRhcmdldCB2ZWN0b3IgZnVuY3Rpb24gb24gYSBmaWxlIG9wZW5lZCBmb3Igd3JpdGluZy4KLQotQGl0ZW0gYmZkX3dyaXRlX2NvbnRlbnRzCi1Xcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBCRkQgaW4gdGhlIGdpdmVuIGZvcm1hdC4gIFRoaXMgaXMgY2FsbGVkCi1ieSBAc2FtcHtiZmRfY2xvc2V9IGZ1bmN0aW9uIGZvciBhIEJGRCBvcGVuZWQgZm9yIHdyaXRpbmcuICBUaGlzIHJlYWxseQotc2hvdWxkIG5vdCBiZSBhbiBhcnJheSBzZWxlY3RlZCBieSBmb3JtYXQgdHlwZSwgYXMgdGhlCi1Ac2FtcHtiZmRfc2V0X2Zvcm1hdH0gZnVuY3Rpb24gcHJvdmlkZXMgYWxsIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbi4KLUluIGZhY3QsIEJGRCB3aWxsIGZhaWwgaWYgYSBkaWZmZXJlbnQgZm9ybWF0IGlzIHVzZWQgd2hlbiBjYWxsaW5nCi10aHJvdWdoIHRoZSBAc2FtcHtiZmRfc2V0X2Zvcm1hdH0gYW5kIHRoZSBAc2FtcHtiZmRfd3JpdGVfY29udGVudHN9Ci1hcnJheXM7IGZvcnR1bmF0ZWx5LCBzaW5jZSBAc2FtcHtiZmRfY2xvc2V9IGdldHMgaXQgcmlnaHQsIHRoaXMgaXMgYQotZGlmZmljdWx0IGVycm9yIHRvIG1ha2UuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRF9KVU1QX1RBQkxFIG1hY3JvcwotQHN1YnNlY3Rpb24gQHNhbXB7QkZEX0pVTVBfVEFCTEV9IG1hY3JvcwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRX0KLQotTW9zdCB0YXJnZXQgdmVjdG9ycyBhcmUgZGVmaW5lZCB1c2luZyBAc2FtcHtCRkRfSlVNUF9UQUJMRX0gbWFjcm9zLgotVGhlc2UgbWFjcm9zIHRha2UgYSBzaW5nbGUgYXJndW1lbnQsIHdoaWNoIGlzIGEgcHJlZml4IGFwcGxpZWQgdG8gYSBzZXQKLW9mIGZ1bmN0aW9ucy4gIFRoZSBtYWNyb3MgYXJlIHRoZW4gdXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMgaW4gdGhlCi10YXJnZXQgdmVjdG9yLgotCi1Gb3IgZXhhbXBsZSwgdGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gZGVmaW5lcyB0aHJlZQotZnVuY3Rpb25zOiBAc2FtcHtfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kfSwgQHNhbXB7X2Nhbm9uaWNhbGl6ZV9yZWxvY30sCi1hbmQgQHNhbXB7X2JmZF9yZWxvY190eXBlX2xvb2t1cH0uICBBIHJlZmVyZW5jZSBsaWtlCi1Ac2FtcHtCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGZvbyl9IHdpbGwgZXhwYW5kIGludG8gdGhyZWUgZnVuY3Rpb25zCi1wcmVmaXhlZCB3aXRoIEBzYW1we2Zvb306IEBzYW1we2Zvb19nZXRfcmVsb2NfdXBwZXJfZm91bmR9LCBldGMuICBUaGUKLUBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gd2lsbCBiZSBwbGFjZWQgc3VjaCB0aGF0IHRob3NlIHRocmVlCi1mdW5jdGlvbnMgaW5pdGlhbGl6ZSB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGluIHRoZSBCRkQgdGFyZ2V0IHZlY3Rvci4KLQotVGhpcyBpcyBkb25lIGJlY2F1c2UgaXQgdHVybnMgb3V0IHRoYXQgbWFueSBkaWZmZXJlbnQgdGFyZ2V0IHZlY3RvcnMgY2FuCi1zaGFyZSBjZXJ0YWluIGNsYXNzZXMgb2YgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGFyY2hpdmVzIGFyZSBzaW1pbGFyCi1vbiBtb3N0IHBsYXRmb3Jtcywgc28gbW9zdCB0YXJnZXQgdmVjdG9ycyBjYW4gdXNlIHRoZSBzYW1lIGFyY2hpdmUKLWZ1bmN0aW9ucy4gIFRob3NlIHRhcmdldCB2ZWN0b3JzIGFsbCB1c2UgQHNhbXB7QkZEX0pVTVBfVEFCTEVfQVJDSElWRX0KLXdpdGggdGhlIHNhbWUgYXJndW1lbnQsIGNhbGxpbmcgYSBzZXQgb2YgZnVuY3Rpb25zIHdoaWNoIGlzIGRlZmluZWQgaW4KLUBmaWxle2FyY2hpdmUuY30uCi0KLUVhY2ggb2YgdGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFfSBtYWNyb3MgaXMgbWVudGlvbmVkIGJlbG93IGFsb25nIHdpdGgKLXRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggaXQgZGVmaW5lcy4gIFRoZSBmdW5jdGlvbgotcG9pbnRlcnMgd2lsbCBiZSBkZXNjcmliZWQgdXNpbmcgdGhlIG5hbWUgd2l0aG91dCB0aGUgcHJlZml4IHdoaWNoIHRoZQotQHNhbXB7QkZEX0pVTVBfVEFCTEV9IG1hY3JvIGRlZmluZXMuICBUaGlzIG5hbWUgaXMgbm9ybWFsbHkgdGhlIHNhbWUgYXMKLXRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBzdHJ1Y3R1cmUuICBBbnkgZGlmZmVyZW5jZXMKLXdpbGwgYmUgbm90ZWQuCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGdlbmVyaWMKLUBzdWJzZWN0aW9uIEdlbmVyaWMgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0dFTkVSSUN9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9HRU5FUklDfSBtYWNybyBpcyB1c2VkIGZvciBzb21lIGNhdGNoIGFsbAotZnVuY3Rpb25zIHdoaWNoIGRvbid0IGVhc2lseSBmaXQgaW50byBvdGhlciBjYXRlZ29yaWVzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9jbG9zZV9hbmRfY2xlYW51cAotRnJlZSBhbnkgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkZELiAgVGhpcyBpcwotY2FsbGVkIHdoZW4gYW55IEJGRCBpcyBjbG9zZWQgKHRoZSBAc2FtcHtiZmRfd3JpdGVfY29udGVudHN9IGZ1bmN0aW9uCi1tZW50aW9uZWQgZWFybGllciBpcyBvbmx5IGNhbGxlZCBmb3IgYSBCRkQgb3BlbmVkIGZvciB3cml0aW5nKS4gIE1vc3QKLXRhcmdldHMgdXNlIEBzYW1we2JmZF9hbGxvY30gdG8gYWxsb2NhdGUgYWxsIHRhcmdldCBzcGVjaWZpYwotaW5mb3JtYXRpb24sIGFuZCB0aGVyZWZvcmUgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotVGhpcyBmdW5jdGlvbiBwb2ludGVyIGlzIHR5cGljYWxseSBzZXQgdG8KLUBzYW1we19iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cH0sIHdoaWNoIHNpbXBseSByZXR1cm5zIHRydWUuCi0KLUBpdGVtIF9iZmRfZnJlZV9jYWNoZWRfaW5mbwotRnJlZSBhbnkgY2FjaGVkIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkZEIHdoaWNoIGNhbiBiZQotcmVjcmVhdGVkIGxhdGVyIGlmIG5lY2Vzc2FyeS4gIFRoaXMgaXMgdXNlZCB0byByZWR1Y2UgdGhlIG1lbW9yeQotY29uc3VtcHRpb24gcmVxdWlyZWQgYnkgcHJvZ3JhbXMgdXNpbmcgQkZELiAgVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgdmlhCi10aGUgQHNhbXB7YmZkX2ZyZWVfY2FjaGVkX2luZm99IG1hY3JvLiAgSXQgaXMgdXNlZCBieSB0aGUgZGVmYXVsdAotYXJjaGl2ZSByb3V0aW5lcyB3aGVuIGNvbXB1dGluZyB0aGUgYXJjaGl2ZSBtYXAuICBNb3N0IHRhcmdldHMgZG8gbm90Ci1kbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGlzIGVudHJ5IHBvaW50LCBhbmQganVzdCBzZXQgaXQgdG8KLUBzYW1we19iZmRfZ2VuZXJpY19mcmVlX2NhY2hlZF9pbmZvfSwgd2hpY2ggc2ltcGx5IHJldHVybnMgdHJ1ZS4KLQotQGl0ZW0gX25ld19zZWN0aW9uX2hvb2sKLVRoaXMgaXMgY2FsbGVkIGZyb20gQHNhbXB7YmZkX21ha2Vfc2VjdGlvbl9hbnl3YXl9IHdoZW5ldmVyIGEgbmV3Ci1zZWN0aW9uIGlzIGNyZWF0ZWQuICBNb3N0IHRhcmdldHMgdXNlIGl0IHRvIGluaXRpYWxpemUgc2VjdGlvbiBzcGVjaWZpYwotaW5mb3JtYXRpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGV0aGVyIG9yIG5vdCB0aGUgc2VjdGlvbgotY29ycmVzcG9uZHMgdG8gYW4gYWN0dWFsIHNlY3Rpb24gaW4gYW4gYWN0dWFsIEJGRC4KLQotQGl0ZW0gX2dldF9zZWN0aW9uX2NvbnRlbnRzCi1HZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGZyb20KLUBzYW1we2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c30uICBNb3N0IHRhcmdldHMgc2V0IHRoaXMgdG8KLUBzYW1we19iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c30sIHdoaWNoIGRvZXMgYSBAc2FtcHtiZmRfc2Vla30KLWJhc2VkIG9uIHRoZSBzZWN0aW9uJ3MgQHNhbXB7ZmlsZXBvc30gZmllbGQgYW5kIGEgQHNhbXB7YmZkX3JlYWR9LiAgVGhlCi1jb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzfS4KLQotQGl0ZW0gX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotU2V0IGEgQHNhbXB7YmZkX3dpbmRvd30gdG8gaG9sZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgVGhpcyBpcwotY2FsbGVkIGZyb20gQHNhbXB7YmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvd30uICBUaGUKLUBzYW1we2JmZF93aW5kb3d9IGlkZWEgbmV2ZXIgcmVhbGx5IGNhdWdodCBvbiwgYW5kIEkgZG9uJ3QgdGhpbmsgdGhpcyBpcwotZXZlciBjYWxsZWQuICBQcmV0dHkgbXVjaCBhbGwgdGFyZ2V0cyBpbXBsZW1lbnQgdGhpcyBhcwotQHNhbXB7YmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93fSwgd2hpY2ggdXNlcwotQHNhbXB7YmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzfSB0byBkbyB0aGUgcmlnaHQgdGhpbmcuICBUaGUKLWNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQKLUBzYW1we19iZmRfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93fS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgY29weQotQHN1YnNlY3Rpb24gQ29weSBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfQ09QWX0KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0NPUFl9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBhcmUKLWNhbGxlZCB3aGVuIGNvcHlpbmcgQkZEcywgYW5kIGZvciBhIGNvdXBsZSBvZiBmdW5jdGlvbnMgd2hpY2ggZGVhbCB3aXRoCi1pbnRlcm5hbCBCRkQgaW5mb3JtYXRpb24uCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLVRoaXMgaXMgY2FsbGVkIHdoZW4gY29weWluZyBhIEJGRCwgdmlhIEBzYW1we2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGF9LgotSWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgQkZEcyBoYXZlIHRoZSBzYW1lIGZvcm1hdCwgdGhpcyB3aWxsIGNvcHkgYW55Ci1wcml2YXRlIGluZm9ybWF0aW9uIG92ZXIuICBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIHNlY3Rpb24gY29udGVudHMKLWhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZS4gIE9ubHkgYSBmZXcgdGFyZ2V0cyBkbyBhbnl0aGluZyBpbgotdGhpcyBmdW5jdGlvbi4KLQotQGl0ZW0gX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi1UaGlzIGlzIGNhbGxlZCB3aGVuIGxpbmtpbmcsIHZpYSBAc2FtcHtiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YX0uICBJdAotZ2l2ZXMgdGhlIGJhY2tlbmQgbGlua2VyIGNvZGUgYSBjaGFuY2UgdG8gc2V0IGFueSBzcGVjaWFsIGZsYWdzIGluIHRoZQotb3V0cHV0IGZpbGUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBmaWxlLiAgT25seSBhIGZldyB0YXJnZXRzCi1kbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLVRoaXMgaXMgc2ltaWxhciB0byBAc2FtcHtfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YX0sIGJ1dCBpdCBpcyBjYWxsZWQKLWZvciBlYWNoIHNlY3Rpb24sIHZpYSBAc2FtcHtiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YX0uICBUaGlzCi1mdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGFueSBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiB3cml0dGVuLiAgT25seQotYSBmZXcgdGFyZ2V0cyBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGF9LCBidXQgSSBkb24ndAotdGhpbmsgYW55dGhpbmcgYWN0dWFsbHkgY2FsbHMgaXQuICBJZiBpdCB3ZXJlIGRlZmluZWQsIGl0IGNvdWxkIGJlIHVzZWQKLXRvIGNvcHkgcHJpdmF0ZSBzeW1ib2wgZGF0YSBmcm9tIG9uZSBCRkQgdG8gYW5vdGhlci4gIEhvd2V2ZXIsIG1vc3QgQkZEcwotc3RvcmUgZXh0cmEgc3ltYm9sIGluZm9ybWF0aW9uIGJ5IGFsbG9jYXRpbmcgc3BhY2Ugd2hpY2ggaXMgbGFyZ2VyIHRoYW4KLXRoZSBAc2FtcHthc3ltYm9sfSBzdHJ1Y3R1cmUgYW5kIHN0b3JpbmcgcHJpdmF0ZSBpbmZvcm1hdGlvbiBpbiB0aGUKLWV4dHJhIHNwYWNlLiAgU2luY2UgQHNhbXB7b2JqY29weX0gYW5kIG90aGVyIHByb2dyYW1zIGNvcHkgc3ltYm9sCi1pbmZvcm1hdGlvbiBieSBjb3B5aW5nIHBvaW50ZXJzIHRvIEBzYW1we2FzeW1ib2x9IHN0cnVjdHVyZXMsIHRoZQotcHJpdmF0ZSBzeW1ib2wgaW5mb3JtYXRpb24gaXMgYXV0b21hdGljYWxseSBjb3BpZWQgYXMgd2VsbC4gIE1vc3QKLXRhcmdldHMgZG8gbm90IGRvIGFueXRoaW5nIGluIHRoaXMgZnVuY3Rpb24uCi0KLUBpdGVtIF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLVRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfc2V0X3ByaXZhdGVfZmxhZ3N9LiAgSXQgaXMgYmFzaWNhbGx5IGEgaG9vawotZm9yIHRoZSBhc3NlbWJsZXIgdG8gc2V0IG1hZ2ljIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBQb3dlclBDCi1FTEYgYXNzZW1ibGVyIHVzZXMgaXQgdG8gc2V0IGZsYWdzIHdoaWNoIGFwcGVhciBpbiB0aGUgZV9mbGFncyBmaWVsZCBvZgotdGhlIEVMRiBoZWFkZXIuICBNb3N0IHRhcmdldHMgZG8gbm90IGRvIGFueXRoaW5nIGluIHRoaXMgZnVuY3Rpb24uCi0KLUBpdGVtIF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotVGhpcyBpcyBjYWxsZWQgYnkgQHNhbXB7b2JqZHVtcH0gd2hlbiB0aGUgQHNhbXB7LXB9IG9wdGlvbiBpcyB1c2VkLiAgSXQKLWlzIGNhbGxlZCB2aWEgQHNhbXB7YmZkX3ByaW50X3ByaXZhdGVfZGF0YX0uICBJdCBwcmludHMgYW55IGludGVyZXN0aW5nCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgQkZEIHdoaWNoIGNhbiBub3QgYmUgb3RoZXJ3aXNlIHJlcHJlc2VudGVkIGJ5IEJGRAotYW5kIHRodXMgY2FuIG5vdCBiZSBwcmludGVkIGJ5IEBzYW1we29iamR1bXB9LiAgTW9zdCB0YXJnZXRzIGRvIG5vdCBkbwotYW55dGhpbmcgaW4gdGhpcyBmdW5jdGlvbi4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgY29yZQotQHN1YnNlY3Rpb24gQ29yZSBmaWxlIHN1cHBvcnQgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0NPUkV9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9DT1JFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCBjb3JlIGZpbGVzLiAgT2J2aW91c2x5LCB0aGVzZSBmdW5jdGlvbnMgb25seSBkbyBzb21ldGhpbmcKLWludGVyZXN0aW5nIGZvciB0YXJnZXRzIHdoaWNoIGhhdmUgY29yZSBmaWxlIHN1cHBvcnQuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLUdpdmVuIGEgY29yZSBmaWxlLCB0aGlzIHJldHVybnMgdGhlIGNvbW1hbmQgd2hpY2ggd2FzIHJ1biB0byBwcm9kdWNlIHRoZQotY29yZSBmaWxlLgotCi1AaXRlbSBfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi1HaXZlbiBhIGNvcmUgZmlsZSwgdGhpcyByZXR1cm5zIHRoZSBzaWduYWwgbnVtYmVyIHdoaWNoIHByb2R1Y2VkIHRoZQotY29yZSBmaWxlLgotCi1AaXRlbSBfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi1HaXZlbiBhIGNvcmUgZmlsZSBhbmQgYSBCRkQgZm9yIGFuIGV4ZWN1dGFibGUsIHRoaXMgcmV0dXJucyB3aGV0aGVyIHRoZQotY29yZSBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIGV4ZWN1dGFibGUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGFyY2hpdmUKLUBzdWJzZWN0aW9uIEFyY2hpdmUgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0FSQ0hJVkV9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9BUkNISVZFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCBhcmNoaXZlIGZpbGVzLiAgTW9zdCB0YXJnZXRzIHVzZSBDT0ZGIHN0eWxlIGFyY2hpdmUgZmlsZXMKLShpbmNsdWRpbmcgRUxGIHRhcmdldHMpLCBhbmQgdGhlc2UgdXNlIEBzYW1we19iZmRfYXJjaGl2ZV9jb2ZmfSBhcyB0aGUKLWFyZ3VtZW50IHRvIEBzYW1we0JGRF9KVU1QX1RBQkxFX0FSQ0hJVkV9LiAgU29tZSB0YXJnZXRzIHVzZSBCU0QvYS5vdXQKLXN0eWxlIGFyY2hpdmVzLCBhbmQgdGhlc2UgdXNlIEBzYW1we19iZmRfYXJjaGl2ZV9ic2R9LiAgKFRoZSBtYWluCi1kaWZmZXJlbmNlIGJldHdlZW4gQlNEIGFuZCBDT0ZGIGFyY2hpdmVzIGlzIHRoZSBmb3JtYXQgb2YgdGhlIGFyY2hpdmUKLXN5bWJvbCB0YWJsZSkuICBUYXJnZXRzIHdpdGggbm8gYXJjaGl2ZSBzdXBwb3J0IHVzZQotQHNhbXB7X2JmZF9ub2FyY2hpdmV9LiAgRmluYWxseSwgYSBmZXcgdGFyZ2V0cyBoYXZlIHVudXN1YWwgYXJjaGl2ZQotaGFuZGxpbmcuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX3NsdXJwX2FybWFwCi1SZWFkIGluIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSwgc3RvcmluZyBpdCBpbiBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcwotaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlIGFyY2hpdmUgQHNhbXB7Y2hlY2tfZm9ybWF0fSByb3V0aW5lLiAgVGhlCi1jb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX3NsdXJwX2FybWFwfS4KLQotQGl0ZW0gX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLVJlYWQgaW4gdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUgZnJvbSB0aGUgYXJjaGl2ZSwgaWYgdGhlcmUgaXMgb25lLAotc3RvcmluZyBpdCBpbiBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSB0aGUKLWFyY2hpdmUgQHNhbXB7Y2hlY2tfZm9ybWF0fSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZX0uCi0KLUBpdGVtIGNvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi1CdWlsZCBhbmQgcmV0dXJuIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUgaWYgb25lIGlzIG5lZWRlZCB0byB3cml0ZSBvdXQKLXRoZSBhcmNoaXZlLiAgVGhpcyBhbHNvIGFkanVzdHMgdGhlIGFyY2hpdmUgaGVhZGVycyB0byByZWZlciB0byB0aGUKLWV4dGVuZGVkIG5hbWUgdGFibGUgYXBwcm9wcmlhdGVseS4gIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlCi1hcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGV9LgotCi1AaXRlbSBfdHJ1bmNhdGVfYXJuYW1lCi1UaGlzIGNvcGllcyBhIGZpbGUgbmFtZSBpbnRvIGFuIGFyY2hpdmUgaGVhZGVyLCB0cnVuY2F0aW5nIGl0IGFzCi1yZXF1aXJlZC4gIEl0IGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfQotcm91dGluZS4gIFRoaXMgZnVuY3Rpb24gaXMgbW9yZSBpbnRlcmVzdGluZyBpbiB0YXJnZXRzIHdoaWNoIGRvIG5vdAotc3VwcG9ydCBleHRlbmRlZCBuYW1lIHRhYmxlcywgYnV0IEkgdGhpbmsgdGhlIEdOVSBAc2FtcHthcn0gcHJvZ3JhbQotYWx3YXlzIHVzZXMgZXh0ZW5kZWQgbmFtZSB0YWJsZXMgYW55aG93LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfdHJ1bmNhdGVfYXJuYW1lfS4KLQotQGl0ZW0gX3dyaXRlX2FybWFwCi1Xcml0ZSBvdXQgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIHVzaW5nIGNhbGxzIHRvIEBzYW1we2JmZF93cml0ZX0uCi1UaGlzIGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLgotVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7d3JpdGVfYXJtYXB9Ci0obm8gbGVhZGluZyB1bmRlcnNjb3JlKS4KLQotQGl0ZW0gX3JlYWRfYXJfaGRyCi1SZWFkIGFuZCBwYXJzZSBhbiBhcmNoaXZlIGhlYWRlci4gIFRoaXMgaGFuZGxlcyBleHBhbmRpbmcgdGhlIGFyY2hpdmUKLWhlYWRlciBuYW1lIGludG8gdGhlIHJlYWwgZmlsZSBuYW1lIHVzaW5nIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgVGhpcwotaXMgY2FsbGVkIGJ5IHJvdXRpbmVzIHdoaWNoIHJlYWQgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIG9yIHRoZSBhcmNoaXZlCi1pdHNlbGYuICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZAotQHNhbXB7X2JmZF9yZWFkX2FyX2hkcl9mbn0uCi0KLUBpdGVtIF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLUdpdmVuIGFuIGFyY2hpdmUgYW5kIGEgQkZEIHJlcHJlc2VudGluZyBhIGZpbGUgc3RvcmVkIHdpdGhpbiB0aGUKLWFyY2hpdmUsIHJldHVybiBhIEJGRCBmb3IgdGhlIG5leHQgZmlsZSBpbiB0aGUgYXJjaGl2ZS4gIFRoaXMgaXMgY2FsbGVkCi12aWEgQHNhbXB7YmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZX0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7b3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlfSAobm8gbGVhZGluZwotdW5kZXJzY29yZSkuCi0KLUBpdGVtIF9nZXRfZWx0X2F0X2luZGV4Ci1HaXZlbiBhbiBhcmNoaXZlIGFuZCBhbiBpbmRleCwgcmV0dXJuIGEgQkZEIGZvciB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZQotY29ycmVzcG9uZGluZyB0byB0aGF0IGVudHJ5IGluIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkCi12aWEgQHNhbXB7YmZkX2dldF9lbHRfYXRfaW5kZXh9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2VsdF9hdF9pbmRleH0uCi0KLUBpdGVtIF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLURvIGEgc3RhdCBvbiBhbiBlbGVtZW50IG9mIGFuIGFyY2hpdmUsIHJldHVybmluZyBpbmZvcm1hdGlvbiByZWFkIGZyb20KLXRoZSBhcmNoaXZlIGhlYWRlciAobW9kaWZpY2F0aW9uIHRpbWUsIHVpZCwgZ2lkLCBmaWxlIG1vZGUsIHNpemUpLiAgVGhpcwotaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfc3RhdF9hcmNoX2VsdH0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9zdGF0X2FyY2hfZWx0fS4KLQotQGl0ZW0gX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLUFmdGVyIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBoYXZlIGJlZW4gd3JpdHRlbiBvdXQsIHVwZGF0ZQotdGhlIHRpbWVzdGFtcCBvZiB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgdG8gYmUgbmV3ZXIgdGhhbiB0aGF0IG9mIHRoZQotZmlsZS4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGEub3V0IHN0eWxlIGFyY2hpdmVzLiAgVGhpcyBpcyBub3JtYWxseQotY2FsbGVkIGJ5IHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcKLWZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIHN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCB0YWJsZSBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfU1lNQk9MU30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1NZTUJPTFN9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBkZWFsCi13aXRoIHN5bWJvbHMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLVJldHVybiBhIHNlbnNpYmxlIHVwcGVyIGJvdW5kIG9uIHRoZSBhbW91bnQgb2YgbWVtb3J5IHdoaWNoIHdpbGwgYmUKLXJlcXVpcmVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gIEluIHByYWN0aWNlIG1vc3QgdGFyZ2V0cyByZXR1cm4gdGhlCi1hbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXN5bWJvbH0gcG9pbnRlcnMgZm9yIGFsbCB0aGUKLXN5bWJvbHMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlIGFjdHVhbCBzeW1ib2wKLWluZm9ybWF0aW9uIGluIEJGRCBwcml2YXRlIGRhdGEuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmR9LgotCi1AaXRlbSBfZ2V0X3N5bXRhYgotUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9jYW5vbmljYWxpemVfc3ltdGFifS4KLQotQGl0ZW0gX21ha2VfZW1wdHlfc3ltYm9sCi1DcmVhdGUgYW4gZW1wdHkgc3ltYm9sIGZvciB0aGUgQkZELiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBtb3N0IHRhcmdldHMKLXN0b3JlIGV4dHJhIGluZm9ybWF0aW9uIHdpdGggZWFjaCBzeW1ib2wgYnkgYWxsb2NhdGluZyBhIHN0cnVjdHVyZQotbGFyZ2VyIHRoYW4gYW4gQHNhbXB7YXN5bWJvbH0gYW5kIHN0b3JpbmcgdGhlIGV4dHJhIGluZm9ybWF0aW9uIGF0IHRoZQotZW5kLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIHRoZSByaWdodCBhbW91bnQgb2YgbWVtb3J5LCBhbmQgcmV0dXJuCi13aGF0IGxvb2tzIGxpa2UgYSBwb2ludGVyIHRvIGFuIGVtcHR5IEBzYW1we2FzeW1ib2x9LiAgVGhpcyBpcyBjYWxsZWQKLXZpYSBAc2FtcHtiZmRfbWFrZV9lbXB0eV9zeW1ib2x9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfbWFrZV9lbXB0eV9zeW1ib2x9LgotCi1AaXRlbSBfcHJpbnRfc3ltYm9sCi1QcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfcHJpbnRfc3ltYm9sfS4gIE9uZSBvZiB0aGUgYXJndW1lbnRzIGluZGljYXRlcyB3aGF0IHNvcnQgb2YKLWluZm9ybWF0aW9uIHNob3VsZCBiZSBwcmludGVkOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGJmZF9wcmludF9zeW1ib2xfbmFtZQotSnVzdCBwcmludCB0aGUgc3ltYm9sIG5hbWUuCi1AaXRlbSBiZmRfcHJpbnRfc3ltYm9sX21vcmUKLVByaW50IHRoZSBzeW1ib2wgbmFtZSBhbmQgc29tZSBpbnRlcmVzdGluZyBmbGFncy4gIEkgZG9uJ3QgdGhpbmsKLWFueXRoaW5nIGFjdHVhbGx5IHVzZXMgdGhpcy4KLUBpdGVtIGJmZF9wcmludF9zeW1ib2xfYWxsCi1QcmludCBhbGwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bWJvbC4gIFRoaXMgaXMgdXNlZCBieSBAc2FtcHtvYmpkdW1wfQotd2hlbiBydW4gd2l0aCB0aGUgQHNhbXB7LXR9IG9wdGlvbi4KLUBlbmQgdGFibGUKLVRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX3ByaW50X3N5bWJvbH0uCi0KLUBpdGVtIF9nZXRfc3ltYm9sX2luZm8KLVJldHVybiBhIHN0YW5kYXJkIHNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQKLXZpYSBAc2FtcHtiZmRfc3ltYm9sX2luZm99LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X3N5bWJvbF9pbmZvfS4KLQotQGl0ZW0gX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi1SZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gc3RyaW5nIHdvdWxkIG5vcm1hbGx5IHJlcHJlc2VudCB0aGUgbmFtZSBvZiBhCi1sb2NhbCBsYWJlbC4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfaXNfbG9jYWxfbGFiZWx9IGFuZAotQHNhbXB7YmZkX2lzX2xvY2FsX2xhYmVsX25hbWV9LiAgTG9jYWwgbGFiZWxzIGFyZSBub3JtYWxseSBkaXNjYXJkZWQgYnkKLXRoZSBhc3NlbWJsZXIuICBJbiB0aGUgbGlua2VyLCB0aGlzIGRlZmluZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLUBzYW1wey14fSBhbmQgQHNhbXB7LVh9IG9wdGlvbnMuCi0KLUBpdGVtIF9nZXRfbGluZW5vCi1SZXR1cm4gbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwKLWZvciBhIENPRkYgdGFyZ2V0LiAgVGhpcyBpcyBjYWxsZWQgd2hlbiB3cml0aW5nIG91dCBDT0ZGIGxpbmUgbnVtYmVycy4KLQotQGl0ZW0gX2ZpbmRfbmVhcmVzdF9saW5lCi1HaXZlbiBhbiBhZGRyZXNzIHdpdGhpbiBhIHNlY3Rpb24sIHVzZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGZpbmQKLXRoZSBtYXRjaGluZyBmaWxlIG5hbWUsIGZ1bmN0aW9uIG5hbWUsIGFuZCBsaW5lIG51bWJlciwgaWYgYW55LiAgVGhpcyBpcwotY2FsbGVkIHZpYSBAc2FtcHtiZmRfZmluZF9uZWFyZXN0X2xpbmV9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZmluZF9uZWFyZXN0X2xpbmV9LgotCi1AaXRlbSBfYmZkX21ha2VfZGVidWdfc3ltYm9sCi1NYWtlIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBhIENPRkYgdGFyZ2V0LAotd2hlcmUgaXQgc2ltcGx5IHJldHVybnMgYSBzeW1ib2wgd2hpY2ggd2lsbCBiZSBwbGFjZWQgaW4gdGhlCi1Ac2FtcHtOX0RFQlVHfSBzZWN0aW9uIHdoZW4gaXQgaXMgd3JpdHRlbiBvdXQuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9tYWtlX2RlYnVnX3N5bWJvbH0uCi0KLUBpdGVtIF9yZWFkX21pbmlzeW1ib2xzCi1NaW5pc3ltYm9scyBhcmUgdXNlZCB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgb2YgcHJvZ3JhbXMgbGlrZQotQHNhbXB7bm19LiAgQSBtaW5pc3ltYm9sIGlzIGEgY29va2llIHBvaW50aW5nIHRvIGludGVybmFsIHN5bWJvbAotaW5mb3JtYXRpb24gd2hpY2ggdGhlIGNhbGxlciBjYW4gdXNlIHRvIGV4dHJhY3QgY29tcGxldGUgc3ltYm9sCi1pbmZvcm1hdGlvbi4gIFRoaXMgcGVybWl0cyBCRkQgdG8gbm90IGNvbnZlcnQgYWxsIHRoZSBzeW1ib2xzIGludG8KLWdlbmVyaWMgZm9ybSwgYnV0IHRvIGluc3RlYWQgY29udmVydCB0aGVtIG9uZSBhdCBhIHRpbWUuICBUaGlzIGlzIGNhbGxlZAotdmlhIEBzYW1we2JmZF9yZWFkX21pbmlzeW1ib2xzfS4gIE1vc3QgdGFyZ2V0cyBkbyBub3QgaW1wbGVtZW50IHRoaXMsCi1hbmQganVzdCB1c2UgZ2VuZXJpYyBzdXBwb3J0IHdoaWNoIGlzIGJhc2VkIG9uIHVzaW5nIHN0YW5kYXJkCi1Ac2FtcHthc3ltYm9sfSBzdHJ1Y3R1cmVzLgotCi1AaXRlbSBfbWluaXN5bWJvbF90b19zeW1ib2wKLUNvbnZlcnQgYSBtaW5pc3ltYm9sIHRvIGEgc3RhbmRhcmQgQHNhbXB7YXN5bWJvbH0uICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9taW5pc3ltYm9sX3RvX3N5bWJvbH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIHJlbG9jcwotQHN1YnNlY3Rpb24gUmVsb2NhdGlvbiBzdXBwb3J0Ci1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlYWwKLXdpdGggcmVsb2NhdGlvbnMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2dldF9yZWxvY191cHBlcl9ib3VuZAotUmV0dXJuIGEgc2Vuc2libGUgdXBwZXIgYm91bmQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgd2hpY2ggd2lsbCBiZQotcmVxdWlyZWQgdG8gcmVhZCB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4gIEluIHByYWN0aWNlIG1vc3QKLXRhcmdldHMgcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXJlbGVudH0KLXBvaW50ZXJzIGZvciBhbGwgdGhlIHJlbG9jYXRpb25zIHBsdXMgYSB0cmFpbGluZyBAc2FtcHtOVUxMfSBlbnRyeSwgYW5kCi1zdG9yZSB0aGUgYWN0dWFsIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gQkZEIHByaXZhdGUgZGF0YS4gIFRoaXMgaXMKLWNhbGxlZCB2aWEgQHNhbXB7YmZkX2dldF9yZWxvY191cHBlcl9ib3VuZH0uCi0KLUBpdGVtIF9jYW5vbmljYWxpemVfcmVsb2MKLVJldHVybiB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfY2Fub25pY2FsaXplX3JlbG9jfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQKLXZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvY30uCi0KLUBpdGVtIF9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLUdpdmVuIGEgcmVsb2NhdGlvbiBjb2RlLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgaG93dG8gc3RydWN0dXJlCi0oQHB4cmVme0JGRCByZWxvY2F0aW9uIGNvZGVzfSkuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7cmVsb2NfdHlwZV9sb29rdXB9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciB3cml0ZQotQHN1YnNlY3Rpb24gT3V0cHV0IGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9XUklURX0KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1dSSVRFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCB3cml0aW5nIG91dCBhIEJGRC4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBfc2V0X2FyY2hfbWFjaAotU2V0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgbnVtYmVyIGZvciBhIEJGRC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX3NldF9hcmNoX21hY2h9LiAgTW9zdCB0YXJnZXRzIGltcGxlbWVudCB0aGlzIGJ5IGNhbGxpbmcKLUBzYW1we2JmZF9kZWZhdWx0X3NldF9hcmNoX21hY2h9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc2V0X2FyY2hfbWFjaH0uCi0KLUBpdGVtIF9zZXRfc2VjdGlvbl9jb250ZW50cwotV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9zZXRfc2VjdGlvbl9jb250ZW50c30uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9zZXRfc2VjdGlvbl9jb250ZW50c30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGxpbmsKLUBzdWJzZWN0aW9uIExpbmtlciBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfTElOS30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0xJTkt9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlCi1saW5rZXIuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX3NpemVvZl9oZWFkZXJzCi1SZXR1cm4gdGhlIHNpemUgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgYSBCRkQuICBUaGlzIGlzCi11c2VkIHRvIGltcGxlbWVudCB0aGUgQHNhbXB7U0laRU9GX0hFQURFUlN9IGxpbmtlciBzY3JpcHQgZnVuY3Rpb24uICBJdAotaXMgbm9ybWFsbHkgdXNlZCB0byBhbGlnbiB0aGUgZmlyc3Qgc2VjdGlvbiBhdCBhbiBlZmZpY2llbnQgcG9zaXRpb24gb24KLXRoZSBwYWdlLiAgVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9zaXplb2ZfaGVhZGVyc30uICBUaGUKLWNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQKLUBzYW1we19iZmRfc2l6ZW9mX2hlYWRlcnN9LgotCi1AaXRlbSBfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGFuZCBhcHBseSB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLVRoaXMgaGFuZGxlcyBib3RoIGEgZmluYWwgbGluayBhbmQgYSByZWxvY2F0ZWFibGUgbGluazsgaW4gdGhlIGxhdHRlcgotY2FzZSwgaXQgYWRqdXN0IHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGFzIHdlbGwuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9LiAgTW9zdCB0YXJnZXRzIGltcGxlbWVudCBpdCBieQotY2FsbGluZyBAc2FtcHtiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9LgotCi1AaXRlbSBfYmZkX3JlbGF4X3NlY3Rpb24KLVRyeSB0byB1c2UgcmVsYXhhdGlvbiB0byBzaHJpbmsgdGhlIHNpemUgb2YgYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQKLWJ5IHRoZSBsaW5rZXIgd2hlbiB0aGUgQHNhbXB7LXJlbGF4fSBvcHRpb24gaXMgdXNlZC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX3JlbGF4X3NlY3Rpb259LiAgTW9zdCB0YXJnZXRzIGRvIG5vdCBzdXBwb3J0IGFueSBzb3J0IG9mCi1yZWxheGF0aW9uLgotCi1AaXRlbSBfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLUNyZWF0ZSB0aGUgc3ltYm9sIGhhc2ggdGFibGUgdG8gdXNlIGZvciB0aGUgbGlua2VyLiAgVGhpcyBsaW5rZXIgaG9vawotcGVybWl0cyB0aGUgYmFja2VuZCB0byBjb250cm9sIHRoZSBzaXplIGFuZCBpbmZvcm1hdGlvbiBvZiB0aGUgZWxlbWVudHMKLWluIHRoZSBsaW5rZXIgc3ltYm9sIGhhc2ggdGFibGUuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlfS4KLQotQGl0ZW0gX2JmZF9saW5rX2FkZF9zeW1ib2xzCi1HaXZlbiBhbiBvYmplY3QgZmlsZSBvciBhbiBhcmNoaXZlLCBhZGQgYWxsIHN5bWJvbHMgaW50byB0aGUgbGlua2VyCi1zeW1ib2wgaGFzaCB0YWJsZS4gIFVzZSBjYWxsYmFja3MgdG8gdGhlIGxpbmtlciB0byBpbmNsdWRlIGFyY2hpdmUKLWVsZW1lbnRzIGluIHRoZSBsaW5rLiAgVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9saW5rX2FkZF9zeW1ib2xzfS4KLQotQGl0ZW0gX2JmZF9maW5hbF9saW5rCi1GaW5pc2ggdGhlIGxpbmtpbmcgcHJvY2Vzcy4gIFRoZSBsaW5rZXIgY2FsbHMgdGhpcyBob29rIGFmdGVyIGFsbCBvZiB0aGUKLWlucHV0IGZpbGVzIGhhdmUgYmVlbiByZWFkLCB3aGVuIGl0IGlzIHJlYWR5IHRvIGZpbmlzaCB0aGUgbGluayBhbmQKLWdlbmVyYXRlIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfZmluYWxfbGlua30uCi0KLUBpdGVtIF9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi1JIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzIGZvci4gIE5vdGhpbmcgc2VlbXMgdG8gY2FsbCBpdC4gIFRoZSBvbmx5Ci1ub24tdHJpdmlhbCBkZWZpbml0aW9uIGlzIGluIEBmaWxle3NvbS5jfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgZHluYW1pYwotQHN1YnNlY3Rpb24gRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uIGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9EWU5BTUlDfQotCi1UaGUgQHNhbXB7QkZEX0pVTVBfVEFCTEVfRFlOQU1JQ30gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIHJlYWQKLWR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi1SZXR1cm4gYSBzZW5zaWJsZSB1cHBlciBib3VuZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB3aGljaCB3aWxsIGJlCi1yZXF1aXJlZCB0byByZWFkIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEluIHByYWN0aWNlIG1vc3QgdGFyZ2V0cwotcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXN5bWJvbH0gcG9pbnRlcnMgZm9yCi1hbGwgdGhlIHN5bWJvbHMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlIGFjdHVhbAotc3ltYm9sIGluZm9ybWF0aW9uIGluIEJGRCBwcml2YXRlIGRhdGEuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmR9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4KLXRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kfS4KLQotQGl0ZW0gX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotUmVhZCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWJ9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFifS4KLQotQGl0ZW0gX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi1SZXR1cm4gYSBzZW5zaWJsZSB1cHBlciBib3VuZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB3aGljaCB3aWxsIGJlCi1yZXF1aXJlZCB0byByZWFkIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zLiAgSW4gcHJhY3RpY2UgbW9zdCB0YXJnZXRzCi1yZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCBAc2FtcHthcmVsZW50fSBwb2ludGVycyBmb3IKLWFsbCB0aGUgcmVsb2NhdGlvbnMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlCi1hY3R1YWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBpbiBCRkQgcHJpdmF0ZSBkYXRhLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmR9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4KLXRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmR9LgotCi1AaXRlbSBfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLVJlYWQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvY30uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvY30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCBnZW5lcmF0ZWQgZmlsZXMKLUBzZWN0aW9uIEJGRCBnZW5lcmF0ZWQgZmlsZXMKLUBjaW5kZXggZ2VuZXJhdGVkIGZpbGVzIGluIGJmZAotQGNpbmRleCBiZmQgZ2VuZXJhdGVkIGZpbGVzCi0KLUJGRCBjb250YWlucyBzZXZlcmFsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGVzLiAgVGhpcyBzZWN0aW9uCi1kZXNjcmliZXMgdGhlbS4gIFNvbWUgZmlsZXMgYXJlIGNyZWF0ZWQgYXQgY29uZmlndXJlIHRpbWUsIHdoZW4geW91Ci1jb25maWd1cmUgQkZELiAgU29tZSBmaWxlcyBhcmUgY3JlYXRlZCBhdCBtYWtlIHRpbWUsIHdoZW4geW91IGJ1aWxkCi10aW1lLiAgU29tZSBmaWxlcyBhcmUgYXV0b21hdGljYWxseSByZWJ1aWx0IGF0IG1ha2UgdGltZSwgYnV0IG9ubHkgaWYKLXlvdSBjb25maWd1cmUgd2l0aCB0aGUgQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24uICBTb21lCi1maWxlcyBsaXZlIGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LS0tdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHlvdSBydW4KLWNvbmZpZ3VyZS0tLWFuZCBzb21lIGxpdmUgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBBbGwgZmlsZXMgdGhhdCBsaXZlCi1pbiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgY2hlY2tlZCBpbnRvIHRoZSBDVlMgcmVwb3NpdG9yeS4KLQotQHRhYmxlIEBmaWxlCi1AaXRlbSBiZmQuaAotQGNpbmRleCBAZmlsZXtiZmQuaH0KLUBjaW5kZXggQGZpbGV7YmZkLWluMy5ofQotTGl2ZXMgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnkuICBDcmVhdGVkIGF0IG1ha2UgdGltZSBmcm9tCi1AZmlsZXtiZmQtaW4yLmh9IHZpYSBAZmlsZXtiZmQtaW4zLmh9LiAgQGZpbGV7YmZkLWluMy5ofSBpcyBjcmVhdGVkIGF0Ci1jb25maWd1cmUgdGltZSBmcm9tIEBmaWxle2JmZC1pbjIuaH0uICBUaGVyZSBhcmUgYXV0b21hdGljIGRlcGVuZGVuY2llcwotdG8gcmVidWlsZCBAZmlsZXtiZmQtaW4zLmh9IGFuZCBoZW5jZSBAZmlsZXtiZmQuaH0gaWYgQGZpbGV7YmZkLWluMi5ofQotY2hhbmdlcywgc28geW91IGNhbiBub3JtYWxseSBpZ25vcmUgQGZpbGV7YmZkLWluMy5ofSwgYW5kIGp1c3QgdGhpbmsKLWFib3V0IEBmaWxle2JmZC1pbjIuaH0gYW5kIEBmaWxle2JmZC5ofS4KLQotQGZpbGV7YmZkLmh9IGlzIGJ1aWx0IGJ5IHJlcGxhY2luZyBhIGZldyBzdHJpbmdzIGluIEBmaWxle2JmZC1pbjIuaH0uCi1UbyBzZWUgdGhlbSwgc2VhcmNoIGZvciBAc2FtcHtAQH0gaW4gQGZpbGV7YmZkLWluMi5ofS4gIFRoZXkgbWFpbmx5Ci1jb250cm9sIHdoZXRoZXIgQkZEIGlzIGJ1aWx0IGZvciBhIDMyIGJpdCB0YXJnZXQgb3IgYSA2NCBiaXQgdGFyZ2V0LgotCi1AaXRlbSBiZmQtaW4yLmgKLUBjaW5kZXggQGZpbGV7YmZkLWluMi5ofQotTGl2ZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBDcmVhdGVkIGZyb20gQGZpbGV7YmZkLWluLmh9IGFuZCBzZXZlcmFsCi1vdGhlciBCRkQgc291cmNlIGZpbGVzLiAgSWYgeW91IGNvbmZpZ3VyZSB3aXRoIHRoZQotQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIEBmaWxle2JmZC1pbjIuaH0gaXMgcmVidWlsdAotYXV0b21hdGljYWxseSB3aGVuIGEgc291cmNlIGZpbGUgY2hhbmdlcy4KLQotQGl0ZW0gZWxmMzItdGFyZ2V0LmgKLUBpdGVteCBlbGY2NC10YXJnZXQuaAotQGNpbmRleCBAZmlsZXtlbGYzMi10YXJnZXQuaH0KLUBjaW5kZXggQGZpbGV7ZWxmNjQtdGFyZ2V0Lmh9Ci1MaXZlIGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LiAgQ3JlYXRlZCBmcm9tIEBmaWxle2VsZnh4LXRhcmdldC5ofS4KLVRoZXNlIGZpbGVzIGFyZSB2ZXJzaW9ucyBvZiBAZmlsZXtlbGZ4eC10YXJnZXQuaH0gY3VzdG9taXplZCBmb3IgZWl0aGVyCi1hIDMyIGJpdCBFTEYgdGFyZ2V0IG9yIGEgNjQgYml0IEVMRiB0YXJnZXQuCi0KLUBpdGVtIGxpYmJmZC5oCi1AY2luZGV4IEBmaWxle2xpYmJmZC5ofQotTGl2ZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBDcmVhdGVkIGZyb20gQGZpbGV7bGliYmZkLWluLmh9IGFuZAotc2V2ZXJhbCBvdGhlciBCRkQgc291cmNlIGZpbGVzLiAgSWYgeW91IGNvbmZpZ3VyZSB3aXRoIHRoZQotQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIEBmaWxle2xpYmJmZC5ofSBpcyByZWJ1aWx0Ci1hdXRvbWF0aWNhbGx5IHdoZW4gYSBzb3VyY2UgZmlsZSBjaGFuZ2VzLgotCi1AaXRlbSBsaWJjb2ZmLmgKLUBjaW5kZXggQGZpbGV7bGliY29mZi5ofQotTGl2ZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBDcmVhdGVkIGZyb20gQGZpbGV7bGliY29mZi1pbi5ofSBhbmQKLUBmaWxle2NvZmZjb2RlLmh9LiAgSWYgeW91IGNvbmZpZ3VyZSB3aXRoIHRoZQotQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIEBmaWxle2xpYmNvZmYuaH0gaXMgcmVidWlsdAotYXV0b21hdGljYWxseSB3aGVuIGEgc291cmNlIGZpbGUgY2hhbmdlcy4KLQotQGl0ZW0gdGFyZ21hdGNoLmgKLUBjaW5kZXggQGZpbGV7dGFyZ21hdGNoLmh9Ci1MaXZlcyBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeS4gIENyZWF0ZWQgYXQgbWFrZSB0aW1lIGZyb20KLUBmaWxle2NvbmZpZy5iZmR9LiAgVGhpcyBmaWxlIGlzIHVzZWQgdG8gbWFwIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgaW50bwotQkZEIHRhcmdldCB2ZWN0b3IgdmFyaWFibGUgbmFtZXMgYXQgcnVuIHRpbWUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCBtdWx0aXBsZSBjb21waWxhdGlvbnMKLUBzZWN0aW9uIEZpbGVzIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzIGluIEJGRAotU2V2ZXJhbCBmaWxlcyBpbiBCRkQgYXJlIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzLiAgQnkgdGhpcyBJIG1lYW4gdGhhdAotdGhlcmUgYXJlIGhlYWRlciBmaWxlcyB3aGljaCBjb250YWluIGZ1bmN0aW9uIGRlZmluaXRpb25zLiAgVGhlc2UgaGVhZGVyCi1maWxlcyBhcmUgaW5jbHVkZWQgYnkgb3RoZXIgZmlsZXMsIGFuZCB0aHVzIHRoZSBmdW5jdGlvbnMgYXJlIGNvbXBpbGVkCi1vbmNlIHBlciBmaWxlIHdoaWNoIGluY2x1ZGVzIHRoZW0uCi0KLVByZXByb2Nlc3NvciBtYWNyb3MgYXJlIHVzZWQgdG8gY29udHJvbCB0aGUgY29tcGlsYXRpb24sIHNvIHRoYXQgZWFjaAotdGltZSB0aGUgZmlsZXMgYXJlIGNvbXBpbGVkIHRoZSByZXN1bHRpbmcgZnVuY3Rpb25zIGFyZSBzbGlnaHRseQotZGlmZmVyZW50LiAgTmF0dXJhbGx5LCBpZiB0aGV5IHdlcmVuJ3QgZGlmZmVyZW50LCB0aGVyZSB3b3VsZCBiZSBubwotcmVhc29uIHRvIGNvbXBpbGUgdGhlbSBtdWx0aXBsZSB0aW1lcy4KLQotVGhpcyBpcyBhIG5vdCBhIHBhcnRpY3VsYXJseSBnb29kIHByb2dyYW1taW5nIHRlY2huaXF1ZSwgYW5kIGZ1dHVyZSBCRkQKLXdvcmsgc2hvdWxkIGF2b2lkIGl0LgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotU2luY2UgdGhpcyB0ZWNobmlxdWUgaXMgcmFyZWx5IHVzZWQsIGV2ZW4gZXhwZXJpZW5jZWQgQyBwcm9ncmFtbWVycyBmaW5kCi1pdCBjb25mdXNpbmcuCi0KLUBpdGVtCi1JdCBpcyBkaWZmaWN1bHQgdG8gZGVidWcgcHJvZ3JhbXMgd2hpY2ggdXNlIEJGRCwgc2luY2UgdGhlcmUgaXMgbm8gd2F5Ci10byBkZXNjcmliZSB3aGljaCB2ZXJzaW9uIG9mIGEgcGFydGljdWxhciBmdW5jdGlvbiB5b3UgYXJlIGxvb2tpbmcgYXQuCi0KLUBpdGVtCi1Qcm9ncmFtcyB3aGljaCB1c2UgQkZEIHdpbmQgdXAgaW5jb3Jwb3JhdGluZyB0d28gb3IgbW9yZSBzbGlnaHRseQotZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIGZ1bmN0aW9uLCB3aGljaCB3YXN0ZXMgc3BhY2UgaW4gdGhlCi1leGVjdXRhYmxlLgotCi1AaXRlbQotVGhpcyB0ZWNobmlxdWUgaXMgbmV2ZXIgcmVxdWlyZWQgbm9yIGlzIGl0IGVzcGVjaWFsbHkgZWZmaWNpZW50LiAgSXQgaXMKLWFsd2F5cyBwb3NzaWJsZSB0byB1c2Ugc3RhdGljYWxseSBpbml0aWFsaXplZCBzdHJ1Y3R1cmVzIGhvbGRpbmcKLWZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBtYWdpYyBjb25zdGFudHMgaW5zdGVhZC4KLUBlbmQgaXRlbWl6ZQotCi1UaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiB0aGUgZmlsZXMgd2hpY2ggYXJlIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzLgotCi1AdGFibGUgQGZpbGUKLUBpdGVtIGFvdXQtdGFyZ2V0LmgKLUBjaW5kZXggQGZpbGV7YW91dC10YXJnZXQuaH0KLURlc2NyaWJlcyBhIGZldyBmdW5jdGlvbnMgYW5kIHRoZSB0YXJnZXQgdmVjdG9yIGZvciBhLm91dCB0YXJnZXRzLiAgVGhpcwotaXMgdXNlZCBieSBpbmRpdmlkdWFsIGEub3V0IHRhcmdldHMgd2l0aCBkaWZmZXJlbnQgZGVmaW5pdGlvbnMgb2YKLUBzYW1we05fVFhUQUREUn0gYW5kIHNpbWlsYXIgYS5vdXQgbWFjcm9zLgotCi1AaXRlbSBhb3V0ZjEuaAotQGNpbmRleCBAZmlsZXthb3V0ZjEuaH0KLUltcGxlbWVudHMgc3RhbmRhcmQgU3VuT1MgYS5vdXQgZmlsZXMuICBJbiBwcmluY2lwbGUgaXQgc3VwcG9ydHMgNjQgYml0Ci1hLm91dCB0YXJnZXRzIGJhc2VkIG9uIHRoZSBwcmVwcm9jZXNzb3IgbWFjcm8gQHNhbXB7QVJDSF9TSVpFfSwgYnV0Ci1zaW5jZSBhbGwga25vd24gYS5vdXQgdGFyZ2V0cyBhcmUgMzIgYml0cywgdGhpcyBjb2RlIG1heSBvciBtYXkgbm90Ci13b3JrLiAgVGhpcyBmaWxlIGlzIG9ubHkgaW5jbHVkZWQgYnkgYSBmZXcgb3RoZXIgZmlsZXMsIGFuZCBpdCBpcwotZGlmZmljdWx0IHRvIGp1c3RpZnkgaXRzIGV4aXN0ZW5jZS4KLQotQGl0ZW0gYW91dHguaAotQGNpbmRleCBAZmlsZXthb3V0eC5ofQotSW1wbGVtZW50cyBiYXNpYyBhLm91dCBzdXBwb3J0IHJvdXRpbmVzLiAgVGhpcyBmaWxlIGNhbiBiZSBjb21waWxlZCBmb3IKLWVpdGhlciAzMiBvciA2NCBiaXQgc3VwcG9ydC4gIFNpbmNlIGFsbCBrbm93biBhLm91dCB0YXJnZXRzIGFyZSAzMiBiaXRzLAotdGhlIDY0IGJpdCBzdXBwb3J0IG1heSBvciBtYXkgbm90IHdvcmsuICBJIGJlbGlldmUgdGhlIG9yaWdpbmFsCi1pbnRlbnRpb24gd2FzIHRoYXQgdGhpcyBmaWxlIHdvdWxkIG9ubHkgYmUgaW5jbHVkZWQgYnkgQHNhbXB7YW91dDMyLmN9Ci1hbmQgQHNhbXB7YW91dDY0LmN9LCBhbmQgdGhhdCBvdGhlciBhLm91dCB0YXJnZXRzIHdvdWxkIHNpbXBseSByZWZlciB0bwotdGhlIGZ1bmN0aW9ucyBpdCBkZWZpbmVkLiAgVW5mb3J0dW5hdGVseSwgc29tZSBvdGhlciBhLm91dCB0YXJnZXRzCi1zdGFydGVkIGluY2x1ZGluZyBpdCBkaXJlY3RseSwgbGVhZGluZyB0byBhIHNvbWV3aGF0IGNvbmZ1c2VkIHN0YXRlIG9mCi1hZmZhaXJzLgotCi1AaXRlbSBjb2ZmY29kZS5oCi1AY2luZGV4IEBmaWxle2NvZmZjb2RlLmh9Ci1JbXBsZW1lbnRzIGJhc2ljIENPRkYgc3VwcG9ydCByb3V0aW5lcy4gIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBldmVyeQotQ09GRiB0YXJnZXQuICBJdCBpbXBsZW1lbnRzIGNvZGUgd2hpY2ggaGFuZGxlcyBDT0ZGIG1hZ2ljIG51bWJlcnMgYXMKLXdlbGwgYXMgdmFyaW91cyBob29rIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlIGdlbmVyaWMgQ09GRiBmdW5jdGlvbnMgaW4KLUBmaWxle2NvZmZnZW4uY30uICBUaGlzIGZpbGUgaXMgY29udHJvbGxlZCBieSBhIG51bWJlciBvZiBkaWZmZXJlbnQKLW1hY3JvcywgYW5kIG1vcmUgYXJlIGFkZGVkIHJlZ3VsYXJseS4KLQotQGl0ZW0gY29mZnN3YXAuaAotQGNpbmRleCBAZmlsZXtjb2Zmc3dhcC5ofQotSW1wbGVtZW50cyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5Ci1AZmlsZXtjb2ZmY29kZS5ofSwgYW5kIHRodXMgYnkgZXZlcnkgQ09GRiB0YXJnZXQuICBJdCBpbXBsZW1lbnRzIHRoZQotcm91dGluZXMgd2hpY2ggc3dhcCBDT0ZGIHN0cnVjdHVyZXMgYmV0d2VlbiBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwKLWZvcm1hdC4gIFRoZSBtYWluIGNvbnRyb2wgZm9yIHRoaXMgZmlsZSBpcyB0aGUgZXh0ZXJuYWwgc3RydWN0dXJlCi1kZWZpbml0aW9ucyBpbiB0aGUgZmlsZXMgaW4gdGhlIEBmaWxle2luY2x1ZGUvY29mZn0gZGlyZWN0b3J5LiAgQSBDT0ZGCi10YXJnZXQgZmlsZSB3aWxsIGluY2x1ZGUgb25lIG9mIHRob3NlIGZpbGVzIGJlZm9yZSBpbmNsdWRpbmcKLUBmaWxle2NvZmZjb2RlLmh9IGFuZCB0aHVzIEBmaWxle2NvZmZzd2FwLmh9LiAgVGhlcmUgYXJlIGEgZmV3IG90aGVyCi1tYWNyb3Mgd2hpY2ggYWZmZWN0IEBmaWxle2NvZmZzd2FwLmh9IGFzIHdlbGwsIG1vc3RseSBkZXNjcmliaW5nIHdoZXRoZXIKLWNlcnRhaW4gZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBleHRlcm5hbCBzdHJ1Y3R1cmVzLgotCi1AaXRlbSBlY29mZnN3YXAuaAotQGNpbmRleCBAZmlsZXtlY29mZnN3YXAuaH0KLUltcGxlbWVudHMgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGlzIGlzIGxpa2UgQGZpbGV7Y29mZnN3YXAuaH0sIGJ1dAotZm9yIEVDT0ZGLiAgSXQgaXMgaW5jbHVkZWQgYnkgdGhlIEVDT0ZGIHRhcmdldCBmaWxlcyAob2Ygd2hpY2ggdGhlcmUgYXJlCi1vbmx5IHR3bykuICBUaGUgY29udHJvbCBpcyB0aGUgcHJlcHJvY2Vzc29yIG1hY3JvIEBzYW1we0VDT0ZGXzMyfSBvcgotQHNhbXB7RUNPRkZfNjR9LgotCi1AaXRlbSBlbGZjb2RlLmgKLUBjaW5kZXggQGZpbGV7ZWxmY29kZS5ofQotSW1wbGVtZW50cyBFTEYgZnVuY3Rpb25zIHRoYXQgdXNlIGV4dGVybmFsIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4gIFRoaXMKLWZpbGUgaXMgaW5jbHVkZWQgYnkgdHdvIG90aGVyIGZpbGVzOiBAZmlsZXtlbGYzMi5jfSBhbmQgQGZpbGV7ZWxmNjQuY30uCi1JdCBpcyBjb250cm9sbGVkIGJ5IHRoZSBAc2FtcHtBUkNIX1NJWkV9IG1hY3JvIHdoaWNoIGlzIGRlZmluZWQgdG8gYmUKLUBzYW1wezMyfSBvciBAc2FtcHs2NH0gYmVmb3JlIGluY2x1ZGluZyBpdC4gIFRoZSBAc2FtcHtOQU1FfSBtYWNybyBpcwotdXNlZCBpbnRlcm5hbGx5IHRvIGdpdmUgdGhlIGZ1bmN0aW9ucyBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSB0d28gdGFyZ2V0Ci1zaXplcy4KLQotQGl0ZW0gZWxmY29yZS5oCi1AY2luZGV4IEBmaWxle2VsZmNvcmUuaH0KLUxpa2UgQGZpbGV7ZWxmY29kZS5ofSwgYnV0IGZvciBmdW5jdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gRUxGIGNvcmUKLWZpbGVzLiAgVGhpcyBpcyBpbmNsdWRlZCBvbmx5IGJ5IEBmaWxle2VsZmNvZGUuaH0uCi0KLUBpdGVtIGVsZmxpbmsuaAotQGNpbmRleCBAZmlsZXtlbGZsaW5rLmh9Ci1MaWtlIEBmaWxle2VsZmNvZGUuaH0sIGJ1dCBmb3IgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIEVMRiBsaW5rZXIuICBUaGlzCi1pcyBpbmNsdWRlZCBvbmx5IGJ5IEBmaWxle2VsZmNvZGUuaH0uCi0KLUBpdGVtIGVsZnh4LXRhcmdldC5oCi1AY2luZGV4IEBmaWxle2VsZnh4LXRhcmdldC5ofQotVGhpcyBmaWxlIGlzIHRoZSBzb3VyY2UgZm9yIHRoZSBnZW5lcmF0ZWQgZmlsZXMgQGZpbGV7ZWxmMzItdGFyZ2V0Lmh9Ci1hbmQgQGZpbGV7ZWxmNjQtdGFyZ2V0Lmh9LCBvbmUgb2Ygd2hpY2ggaXMgaW5jbHVkZWQgYnkgZXZlcnkgRUxGIHRhcmdldC4KLUl0IGRlZmluZXMgdGhlIEVMRiB0YXJnZXQgdmVjdG9yLgotCi1AaXRlbSBmcmVlYnNkLmgKLUBjaW5kZXggQGZpbGV7ZnJlZWJzZC5ofQotUHJlc3VtYWJseSBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBieSBhbGwgRnJlZUJTRCB0YXJnZXRzLCBidXQgaW4gZmFjdAotdGhlcmUgaXMgb25seSBvbmUgc3VjaCB0YXJnZXQsIEBzYW1we2kzODYtZnJlZWJzZH0uICBUaGlzIGRlZmluZXMgYQotZnVuY3Rpb24gdXNlZCB0byBzZXQgdGhlIHJpZ2h0IG1hZ2ljIG51bWJlciBmb3IgRnJlZUJTRCwgYXMgd2VsbCBhcwotdmFyaW91cyBtYWNyb3MsIGFuZCBpbmNsdWRlcyBAZmlsZXthb3V0LXRhcmdldC5ofS4KLQotQGl0ZW0gbmV0YnNkLmgKLUBjaW5kZXggQGZpbGV7bmV0YnNkLmh9Ci1MaWtlIEBmaWxle2ZyZWVic2QuaH0sIGV4Y2VwdCB0aGF0IHRoZXJlIGFyZSBzZXZlcmFsIGZpbGVzIHdoaWNoIGluY2x1ZGUKLWl0LgotCi1AaXRlbSBubG0tdGFyZ2V0LmgKLUBjaW5kZXggQGZpbGV7bmxtLXRhcmdldC5ofQotRGVmaW5lcyB0aGUgdGFyZ2V0IHZlY3RvciBmb3IgYSBzdGFuZGFyZCBOTE0gdGFyZ2V0LgotCi1AaXRlbSBubG1jb2RlLmgKLUBjaW5kZXggQGZpbGV7bmxtY29kZS5ofQotTGlrZSBAZmlsZXtlbGZjb2RlLmh9LCBidXQgZm9yIE5MTSB0YXJnZXRzLiAgVGhpcyBpcyBvbmx5IGluY2x1ZGVkIGJ5Ci1AZmlsZXtubG0zMi5jfSBhbmQgQGZpbGV7bmxtNjQuY30sIGJvdGggb2Ygd2hpY2ggZGVmaW5lIHRoZSBtYWNybwotQHNhbXB7QVJDSF9TSVpFfSB0byBhbiBhcHByb3ByaWF0ZSB2YWx1ZS4gIFRoZXJlIGFyZSBubyA2NCBiaXQgTkxNCi10YXJnZXRzIGFueWhvdywgc28gdGhpcyBpcyBzb3J0IG9mIHVzZWxlc3MuCi0KLUBpdGVtIG5sbXN3YXAuaAotQGNpbmRleCBAZmlsZXtubG1zd2FwLmh9Ci1MaWtlIEBmaWxle2NvZmZzd2FwLmh9LCBidXQgZm9yIE5MTSB0YXJnZXRzLiAgVGhpcyBpcyBpbmNsdWRlZCBieSBlYWNoCi1OTE0gdGFyZ2V0LCBidXQgSSB0aGluayBpdCB3aW5kcyB1cCBjb21waWxpbmcgdG8gdGhlIGV4YWN0IHNhbWUgY29kZSBmb3IKLWV2ZXJ5IHRhcmdldCwgYW5kIGFzIHN1Y2ggaXMgZmFpcmx5IHVzZWxlc3MuCi0KLUBpdGVtIHBlaWNvZGUuaAotQGNpbmRleCBAZmlsZXtwZWljb2RlLmh9Ci1Qcm92aWRlcyBzd2FwcGluZyByb3V0aW5lcyBhbmQgb3RoZXIgaG9va3MgZm9yIFBFIHRhcmdldHMuCi1AZmlsZXtjb2ZmY29kZS5ofSB3aWxsIGluY2x1ZGUgdGhpcyByYXRoZXIgdGhhbiBAZmlsZXtjb2Zmc3dhcC5ofSBmb3IgYQotUEUgdGFyZ2V0LiAgVGhpcyBkZWZpbmVzIFBFIHNwZWNpZmljIHZlcnNpb25zIG9mIHRoZSBDT0ZGIHN3YXBwaW5nCi1yb3V0aW5lcywgYW5kIGFsc28gZGVmaW5lcyBzb21lIG1hY3JvcyB3aGljaCBjb250cm9sIEBmaWxle2NvZmZjb2RlLmh9Ci1pdHNlbGYuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCByZWxvY2F0aW9uIGhhbmRsaW5nCi1Ac2VjdGlvbiBCRkQgcmVsb2NhdGlvbiBoYW5kbGluZwotQGNpbmRleCBiZmQgcmVsb2NhdGlvbiBoYW5kbGluZwotQGNpbmRleCByZWxvY2F0aW9ucyBpbiBiZmQKLQotVGhlIGhhbmRsaW5nIG9mIHJlbG9jYXRpb25zIGlzIG9uZSBvZiB0aGUgbW9yZSBjb25mdXNpbmcgYXNwZWN0cyBvZiBCRkQuCi1SZWxvY2F0aW9uIGhhbmRsaW5nIGhhcyBiZWVuIGltcGxlbWVudGVkIGluIHZhcmlvdXMgZGlmZmVyZW50IHdheXMsIGFsbAotc29tZXdoYXQgaW5jb21wYXRpYmxlLCBub25lIHBlcmZlY3QuCi0KLUBtZW51Ci0qIEJGRCByZWxvY2F0aW9uIGNvbmNlcHRzOjoJQkZEIHJlbG9jYXRpb24gY29uY2VwdHMKLSogQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zOjoJQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zCi0qIEJGRCByZWxvY2F0aW9uIGNvZGVzOjoJQkZEIHJlbG9jYXRpb24gY29kZXMKLSogQkZEIHJlbG9jYXRpb24gZnV0dXJlOjoJQkZEIHJlbG9jYXRpb24gZnV0dXJlCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIHJlbG9jYXRpb24gY29uY2VwdHMKLUBzdWJzZWN0aW9uIEJGRCByZWxvY2F0aW9uIGNvbmNlcHRzCi0KLUEgcmVsb2NhdGlvbiBpcyBhbiBhY3Rpb24gd2hpY2ggdGhlIGxpbmtlciBtdXN0IHRha2Ugd2hlbiBsaW5raW5nLiAgSXQKLWRlc2NyaWJlcyBhIGNoYW5nZSB0byB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgVGhlIGNoYW5nZSBpcyBub3JtYWxseQotYmFzZWQgb24gdGhlIGZpbmFsIHZhbHVlIG9mIG9uZSBvciBtb3JlIHN5bWJvbHMuICBSZWxvY2F0aW9ucyBhcmUKLWNyZWF0ZWQgYnkgdGhlIGFzc2VtYmxlciB3aGVuIGl0IGNyZWF0ZXMgYW4gb2JqZWN0IGZpbGUuCi0KLU1vc3QgcmVsb2NhdGlvbnMgYXJlIHNpbXBsZS4gIEEgdHlwaWNhbCBzaW1wbGUgcmVsb2NhdGlvbiBpcyB0byBzZXQgMzIKLWJpdHMgYXQgYSBnaXZlbiBvZmZzZXQgaW4gYSBzZWN0aW9uIHRvIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gIFRoaXMgdHlwZQotb2YgcmVsb2NhdGlvbiB3b3VsZCBiZSBnZW5lcmF0ZWQgZm9yIGNvZGUgbGlrZSBAY29kZXtpbnQgKnAgPSAmaTt9IHdoZXJlCi1Ac2FtcHtwfSBhbmQgQHNhbXB7aX0gYXJlIGdsb2JhbCB2YXJpYWJsZXMuICBBIHJlbG9jYXRpb24gZm9yIHRoZSBzeW1ib2wKLUBzYW1we2l9IHdvdWxkIGJlIGdlbmVyYXRlZCBzdWNoIHRoYXQgdGhlIGxpbmtlciB3b3VsZCBpbml0aWFsaXplIHRoZQotYXJlYSBvZiBtZW1vcnkgd2hpY2ggaG9sZHMgdGhlIHZhbHVlIG9mIEBzYW1we3B9IHRvIHRoZSB2YWx1ZSBvZiB0aGUKLXN5bWJvbCBAc2FtcHtpfS4KLQotU2xpZ2h0bHkgbW9yZSBjb21wbGV4IHJlbG9jYXRpb25zIG1heSBpbmNsdWRlIGFuIGFkZGVuZCwgd2hpY2ggaXMgYQotY29uc3RhbnQgdG8gYWRkIHRvIHRoZSBzeW1ib2wgdmFsdWUgYmVmb3JlIHVzaW5nIGl0LiAgSW4gc29tZSBjYXNlcyBhCi1yZWxvY2F0aW9uIHdpbGwgcmVxdWlyZSBhZGRpbmcgdGhlIHN5bWJvbCB2YWx1ZSB0byB0aGUgZXhpc3RpbmcgY29udGVudHMKLW9mIHRoZSBzZWN0aW9uIGluIHRoZSBvYmplY3QgZmlsZS4gIEluIG90aGVycyB0aGUgcmVsb2NhdGlvbiB3aWxsIHNpbXBseQotcmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gd2l0aCB0aGUgc3ltYm9sIHZhbHVlLiAgU29tZQotcmVsb2NhdGlvbnMgYXJlIFBDIHJlbGF0aXZlLCBzbyB0aGF0IHRoZSB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gdGhlCi1zZWN0aW9uIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGFuZCB0aGUgZmluYWwKLWFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gY29udGVudHMuCi0KLUluIGdlbmVyYWwsIHJlbG9jYXRpb25zIGNhbiBiZSBhcmJpdHJhcmlseSBjb21wbGV4LiAgRm9yIGV4YW1wbGUsCi1yZWxvY2F0aW9ucyB1c2VkIGluIGR5bmFtaWMgbGlua2luZyBzeXN0ZW1zIG9mdGVuIHJlcXVpcmUgdGhlIGxpbmtlciB0bwotYWxsb2NhdGUgc3BhY2UgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiBhbmQgdXNlIHRoZSBvZmZzZXQgd2l0aGluIHRoYXQKLXNlY3Rpb24gYXMgdGhlIHZhbHVlIHRvIHN0b3JlLiAgSW4gdGhlIElFRUUgb2JqZWN0IGZpbGUgZm9ybWF0LAotcmVsb2NhdGlvbnMgbWF5IGludm9sdmUgYXJiaXRyYXJ5IGV4cHJlc3Npb25zLgotCi1XaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZSBsaW5rZXIgbWF5IG9yIG1heSBub3QgaGF2ZSB0byBkbwotYW55dGhpbmcgd2l0aCBhIHJlbG9jYXRpb24sIGRlcGVuZGluZyB1cG9uIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotcmVsb2NhdGlvbi4gIFNpbXBsZSByZWxvY2F0aW9ucyBnZW5lcmFsbHkgZG8gbm90IHJlcXVpcmUgYW55IHNwZWNpYWwKLWFjdGlvbi4KLQotQG5vZGUgQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zCi1Ac3Vic2VjdGlvbiBCRkQgcmVsb2NhdGlvbiBmdW5jdGlvbnMKLQotSW4gQkZELCBlYWNoIHNlY3Rpb24gaGFzIGFuIGFycmF5IG9mIEBzYW1we2FyZWxlbnR9IHN0cnVjdHVyZXMuICBFYWNoCi1zdHJ1Y3R1cmUgaGFzIGEgcG9pbnRlciB0byBhIHN5bWJvbCwgYW4gYWRkcmVzcyB3aXRoaW4gdGhlIHNlY3Rpb24sIGFuCi1hZGRlbmQsIGFuZCBhIHBvaW50ZXIgdG8gYSBAc2FtcHtyZWxvY19ob3d0b19zdHJ1Y3R9IHN0cnVjdHVyZS4gIFRoZQotaG93dG8gc3RydWN0dXJlIGhhcyBhIGJ1bmNoIG9mIGZpZWxkcyBkZXNjcmliaW5nIHRoZSByZWxvYywgaW5jbHVkaW5nIGEKLXR5cGUgZmllbGQuICBUaGUgdHlwZSBmaWVsZCBpcyBzcGVjaWZpYyB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0Ci1iYWNrZW5kOyBub25lIG9mIHRoZSBnZW5lcmljIGNvZGUgaW4gQkZEIGV4YW1pbmVzIGl0LgotCi1PcmlnaW5hbGx5LCB0aGUgZnVuY3Rpb24gQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gd2FzIHN1cHBvc2VkIHRvCi1oYW5kbGUgYWxsIHJlbG9jYXRpb25zLiAgSW4gdGhlb3J5LCBtYW55IHJlbG9jYXRpb25zIHdvdWxkIGJlIHNpbXBsZQotZW5vdWdoIHRvIGJlIGRlc2NyaWJlZCBieSB0aGUgZmllbGRzIGluIHRoZSBob3d0byBzdHJ1Y3R1cmUuICBGb3IgdGhvc2UKLXRoYXQgd2VyZW4ndCwgdGhlIGhvd3RvIHN0cnVjdHVyZSBpbmNsdWRlZCBhIEBzYW1we3NwZWNpYWxfZnVuY3Rpb259Ci1maWVsZCB0byB1c2UgYXMgYW4gZXNjYXBlLgotCi1XaGlsZSB0aGlzIHNlZW1zIHBsYXVzaWJsZSwgYSBsb29rIGF0IEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259Ci1zaG93cyB0aGF0IGl0IGZhaWxlZC4gIFRoZSBmdW5jdGlvbiBoYXMgb2RkIHNwZWNpYWwgY2FzZXMuICBTb21lIG9mIHRoZQotZmllbGRzIGluIHRoZSBob3d0byBzdHJ1Y3R1cmUsIHN1Y2ggYXMgQHNhbXB7cGNyZWxfb2Zmc2V0fSwgd2VyZSBub3QKLWFkZXF1YXRlbHkgZG9jdW1lbnRlZC4KLQotVGhlIGxpbmtlciB1c2VzIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IHRvIGRvIGFsbCByZWxvY2F0aW9ucyB3aGVuCi10aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlIGhhdmUgZGlmZmVyZW50IGZvcm1hdHMgKGUuZy4sIHdoZW4gZ2VuZXJhdGluZwotUy1yZWNvcmRzKS4gIFRoZSBnZW5lcmljIGxpbmtlciBjb2RlLCB3aGljaCBpcyB1c2VkIGJ5IGFsbCB0YXJnZXRzIHdoaWNoCi1kbyBub3QgZGVmaW5lIHRoZWlyIG93biBzcGVjaWFsIHB1cnBvc2UgbGlua2VyLCB1c2VzCi1Ac2FtcHtiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfSwgd2hpY2ggZm9yIG1vc3QgdGFyZ2V0cyB0dXJucwotaW50byBhIGNhbGwgdG8gQHNhbXB7YmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfSwgd2hpY2gKLWNhbGxzIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259LiAgU28gQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0KLWlzIHN0aWxsIHdpZGVseSB1c2VkLCB3aGljaCBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gY2hhbmdlLCBzaW5jZSBpdCBpcwotZGlmZmljdWx0IHRvIHRlc3QgYWxsIHBvc3NpYmxlIGNhc2VzLgotCi1UaGUgYXNzZW1ibGVyIHVzZWQgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gZm9yIGEgd2hpbGUuICBUaGlzCi10dXJuZWQgb3V0IHRvIGJlIHRoZSB3cm9uZyB0aGluZyB0byBkbywgc2luY2UKLUBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IHdhcyB3cml0dGVuIHRvIGhhbmRsZSByZWxvY2F0aW9ucyBvbiBhbgotZXhpc3Rpbmcgb2JqZWN0IGZpbGUsIHdoaWxlIHRoZSBhc3NlbWJsZXIgbmVlZGVkIHRvIGNyZWF0ZSByZWxvY2F0aW9ucwotaW4gYSBuZXcgb2JqZWN0IGZpbGUuICBUaGUgYXNzZW1ibGVyIHdhcyBjaGFuZ2VkIHRvIHVzZSB0aGUgbmV3IGZ1bmN0aW9uCi1Ac2FtcHtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufSBpbnN0ZWFkLCBhbmQgQHNhbXB7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0KLXdhcyBjcmVhdGVkIGFzIGEgY29weSBvZiBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufS4KLQotVW5mb3J0dW5hdGVseSwgdGhlIHdvcmsgZGlkIG5vdCBwcm9ncmVzcyBhbnkgZmFydGhlciwgc28KLUBzYW1we2JmZF9pbnN0YWxsX3JlbG9jYXRpb259IHJlbWFpbnMgYSBzaW1wbGUgY29weSBvZgotQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0sIHdpdGggYWxsIHRoZSBvZGQgc3BlY2lhbCBjYXNlcyBhbmQKLWNvbmZ1c2luZyBjb2RlLiAgVGhpcyBhZ2FpbiBpcyBkaWZmaWN1bHQgdG8gY2hhbmdlLCBiZWNhdXNlIGFnYWluIGFueQotY2hhbmdlIGNhbiBhZmZlY3QgYW55IGFzc2VtYmxlciB0YXJnZXQsIGFuZCBzbyBpcyBkaWZmaWN1bHQgdG8gdGVzdC4KLQotVGhlIG5ldyBsaW5rZXIsIHdoZW4gdXNpbmcgdGhlIHNhbWUgb2JqZWN0IGZpbGUgZm9ybWF0IGZvciBhbGwgaW5wdXQKLWZpbGVzIGFuZCB0aGUgb3V0cHV0IGZpbGUsIGRvZXMgbm90IGNvbnZlcnQgcmVsb2NhdGlvbnMgaW50bwotQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlcywgc28gaXQgY2FuIG5vdCB1c2UKLUBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IGF0IGFsbC4gIEluc3RlYWQsIHVzZXJzIG9mIHRoZSBuZXcgbGlua2VyCi1hcmUgZXhwZWN0ZWQgdG8gd3JpdGUgYSBAc2FtcHtyZWxvY2F0ZV9zZWN0aW9ufSBmdW5jdGlvbiB3aGljaCB3aWxsCi1oYW5kbGUgcmVsb2NhdGlvbnMgaW4gYSB0YXJnZXQgc3BlY2lmaWMgZmFzaGlvbi4KLQotVGhlcmUgYXJlIHR3byBoZWxwZXIgZnVuY3Rpb25zIGZvciB0YXJnZXQgc3BlY2lmaWMgcmVsb2NhdGlvbjoKLUBzYW1we19iZmRfZmluYWxfbGlua19yZWxvY2F0ZX0gYW5kIEBzYW1we19iZmRfcmVsb2NhdGVfY29udGVudHN9LgotVGhlc2UgZnVuY3Rpb25zIHVzZSBhIGhvd3RvIHN0cnVjdHVyZSwgYnV0IHRoZXkgQGVtcGh7ZG8gbm90fSB1c2UgdGhlCi1Ac2FtcHtzcGVjaWFsX2Z1bmN0aW9ufSBmaWVsZC4gIFNpbmNlIHRoZSBmdW5jdGlvbnMgYXJlIG5vcm1hbGx5IGNhbGxlZAotZnJvbSB0YXJnZXQgc3BlY2lmaWMgY29kZSwgdGhlIEBzYW1we3NwZWNpYWxfZnVuY3Rpb259IGZpZWxkIGFkZHMKLWxpdHRsZTsgYW55IHJlbG9jYXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyBjYW4gYmUgaGFuZGxlZAotd2l0aG91dCBjYWxsaW5nIHRob3NlIGZ1bmN0aW9ucy4KLQotU28sIGlmIHlvdSB3YW50IHRvIGFkZCBhIG5ldyB0YXJnZXQsIG9yIGFkZCBhIG5ldyByZWxvY2F0aW9uIHRvIGFuCi1leGlzdGluZyB0YXJnZXQsIHlvdSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1NYWtlIHN1cmUgeW91IGNsZWFybHkgdW5kZXJzdGFuZCB3aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBzaG91bGQKLWxvb2sgbGlrZSBhZnRlciBhc3NlbWJseSwgYWZ0ZXIgYSByZWxvY2F0ZWFibGUgbGluaywgYW5kIGFmdGVyIGEgZmluYWwKLWxpbmsuICBNYWtlIHN1cmUgeW91IGNsZWFybHkgdW5kZXJzdGFuZCB0aGUgb3BlcmF0aW9ucyB0aGUgbGlua2VyIG11c3QKLXBlcmZvcm0gZHVyaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsgYW5kIGR1cmluZyBhIGZpbmFsIGxpbmsuCi0KLUBpdGVtCi1Xcml0ZSBhIGhvd3RvIHN0cnVjdHVyZSBmb3IgdGhlIHJlbG9jYXRpb24uICBUaGUgaG93dG8gc3RydWN0dXJlIGlzCi1mbGV4aWJsZSBlbm91Z2ggdG8gcmVwcmVzZW50IGFueSByZWxvY2F0aW9uIHdoaWNoIHNob3VsZCBiZSBoYW5kbGVkIGJ5Ci1zZXR0aW5nIGEgY29udGlndW91cyBiaXRmaWVsZCBpbiB0aGUgZGVzdGluYXRpb24gdG8gdGhlIHZhbHVlIG9mIGEKLXN5bWJvbCwgcG9zc2libHkgd2l0aCBhbiBhZGRlbmQsIHBvc3NpYmx5IGFkZGluZyB0aGUgc3ltYm9sIHZhbHVlIHRvIHRoZQotdmFsdWUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBkZXN0aW5hdGlvbi4KLQotQGl0ZW0KLUNoYW5nZSB0aGUgYXNzZW1ibGVyIHRvIGdlbmVyYXRlIHlvdXIgcmVsb2NhdGlvbi4gIFRoZSBhc3NlbWJsZXIgd2lsbAotY2FsbCBAc2FtcHtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufSwgc28geW91ciBob3d0byBzdHJ1Y3R1cmUgaGFzIHRvIGJlCi1hYmxlIHRvIGhhbmRsZSB0aGF0LiAgWW91IG1heSBuZWVkIHRvIHNldCB0aGUgQHNhbXB7c3BlY2lhbF9mdW5jdGlvbn0KLWZpZWxkIHRvIGhhbmRsZSBhc3NlbWJseSBjb3JyZWN0bHkuICBCZSBjYXJlZnVsIHRvIGVuc3VyZSB0aGF0IGFueSBjb2RlCi15b3Ugd3JpdGUgdG8gaGFuZGxlIHRoZSBhc3NlbWJsZXIgd2lsbCBhbHNvIHdvcmsgY29ycmVjdGx5IHdoZW4gZG9pbmcgYQotcmVsb2NhdGVhYmxlIGxpbmsuICBGb3IgZXhhbXBsZSwgc2VlIEBzYW1we2JmZF9lbGZfZ2VuZXJpY19yZWxvY30uCi0KLUBpdGVtCi1UZXN0IHRoZSBhc3NlbWJsZXIuICBDb25zaWRlciB0aGUgY2FzZXMgb2YgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuCi11bmRlZmluZWQgc3ltYm9sLCBhIGNvbW1vbiBzeW1ib2wsIGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlIG9iamVjdCBmaWxlCi1pbiB0aGUgc2FtZSBzZWN0aW9uLCBhbmQgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgb2JqZWN0IGZpbGUgaW4gYQotZGlmZmVyZW50IHNlY3Rpb24uICBUaGVzZSBjYXNlcyBtYXkgbm90IGFsbCBiZSBhcHBsaWNhYmxlIGZvciB5b3VyCi1yZWxvYy4KLQotQGl0ZW0KLUlmIHlvdXIgdGFyZ2V0IHVzZXMgdGhlIG5ldyBsaW5rZXIsIHdoaWNoIGlzIHJlY29tbWVuZGVkLCBhZGQgYW55Ci1yZXF1aXJlZCBoYW5kbGluZyB0byB0aGUgdGFyZ2V0IHNwZWNpZmljIHJlbG9jYXRpb24gZnVuY3Rpb24uICBJbiBzaW1wbGUKLWNhc2VzIHRoaXMgd2lsbCBqdXN0IGludm9sdmUgYSBjYWxsIHRvIEBzYW1we19iZmRfZmluYWxfbGlua19yZWxvY2F0ZX0KLW9yIEBzYW1we19iZmRfcmVsb2NhdGVfY29udGVudHN9LCBkZXBlbmRpbmcgdXBvbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLXJlbG9jYXRpb24gYW5kIHdoZXRoZXIgdGhlIGxpbmsgaXMgcmVsb2NhdGVhYmxlIG9yIG5vdC4KLQotQGl0ZW0KLVRlc3QgdGhlIGxpbmtlci4gIFRlc3QgdGhlIGNhc2Ugb2YgYSBmaW5hbCBsaW5rLiAgSWYgdGhlIHJlbG9jYXRpb24gY2FuCi1vdmVyZmxvdywgdXNlIGEgbGlua2VyIHNjcmlwdCB0byBmb3JjZSBhbiBvdmVyZmxvdyBhbmQgbWFrZSBzdXJlIHRoZQotZXJyb3IgaXMgcmVwb3J0ZWQgY29ycmVjdGx5LiAgVGVzdCBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGV0aGVyIHRoZQotc3ltYm9sIGlzIGRlZmluZWQgb3IgdW5kZWZpbmVkIGluIHRoZSByZWxvY2F0ZWFibGUgb3V0cHV0LiAgRm9yIGJvdGggdGhlCi1maW5hbCBhbmQgcmVsb2NhdGVhYmxlIGxpbmssIHRlc3QgdGhlIGNhc2Ugd2hlbiB0aGUgc3ltYm9sIGlzIGEgY29tbW9uCi1zeW1ib2wsIHdoZW4gdGhlIHN5bWJvbCBsb29rZWQgbGlrZSBhIGNvbW1vbiBzeW1ib2wgYnV0IGJlY2FtZSBhIGRlZmluZWQKLXN5bWJvbCwgd2hlbiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUsIGFuZCB3aGVuCi10aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIHNhbWUgb2JqZWN0IGZpbGUuCi0KLUBpdGVtCi1JbiBvcmRlciBmb3IgbGlua2luZyB0byBhbm90aGVyIG9iamVjdCBmaWxlIGZvcm1hdCwgc3VjaCBhcyBTLXJlY29yZHMsCi10byB3b3JrIGNvcnJlY3RseSwgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gaGFzIHRvIGRvIHRoZSByaWdodAotdGhpbmcgZm9yIHRoZSByZWxvY2F0aW9uLiAgWW91IG1heSBuZWVkIHRvIHNldCB0aGUKLUBzYW1we3NwZWNpYWxfZnVuY3Rpb259IGZpZWxkIHRvIGhhbmRsZSB0aGlzIGNvcnJlY3RseS4gIFRlc3QgdGhpcyBieQotZG9pbmcgYSBsaW5rIGluIHdoaWNoIHRoZSBvdXRwdXQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzIFMtcmVjb3Jkcy4KLQotQGl0ZW0KLVVzaW5nIHRoZSBsaW5rZXIgdG8gZ2VuZXJhdGUgcmVsb2NhdGVhYmxlIG91dHB1dCBpbiBhIGRpZmZlcmVudCBvYmplY3QKLWZpbGUgZm9ybWF0IGlzIGltcG9zc2libGUgaW4gdGhlIGdlbmVyYWwgY2FzZSwgc28geW91IGdlbmVyYWxseSBkb24ndAotaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0LiAgTGlua2luZyBpbnB1dCBmaWxlcyBvZiBkaWZmZXJlbnQgb2JqZWN0IGZpbGUKLWZvcm1hdHMgdG9nZXRoZXIgaXMgcXVpdGUgdW51c3VhbCwgYnV0IGlmIHlvdSdyZSByZWFsbHkgZGVkaWNhdGVkIHlvdQotbWF5IHdhbnQgdG8gY29uc2lkZXIgdGVzdGluZyB0aGlzIGNhc2UsIGJvdGggd2hlbiB0aGUgb3V0cHV0IG9iamVjdCBmaWxlCi1mb3JtYXQgaXMgdGhlIHNhbWUgYXMgeW91ciBmb3JtYXQsIGFuZCB3aGVuIGl0IGlzIGRpZmZlcmVudC4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCRkQgcmVsb2NhdGlvbiBjb2RlcwotQHN1YnNlY3Rpb24gQkZEIHJlbG9jYXRpb24gY29kZXMKLQotQkZEIGhhcyBhbm90aGVyIHdheSBvZiBkZXNjcmliaW5nIHJlbG9jYXRpb25zIGJlc2lkZXMgdGhlIGhvd3RvCi1zdHJ1Y3R1cmVzIGRlc2NyaWJlZCBhYm92ZTogdGhlIGVudW0gQHNhbXB7YmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlfS4KLQotRXZlcnkga25vd24gcmVsb2NhdGlvbiB0eXBlIGNhbiBiZSBkZXNjcmliZWQgYXMgYSB2YWx1ZSBpbiB0aGlzCi1lbnVtZXJhdGlvbi4gIFRoZSBlbnVtZXJhdGlvbiBjb250YWlucyBtYW55IHRhcmdldCBzcGVjaWZpYyByZWxvY2F0aW9ucywKLWJ1dCB3aGVyZSB0d28gb3IgbW9yZSB0YXJnZXRzIGhhdmUgdGhlIHNhbWUgcmVsb2NhdGlvbiwgYSBzaW5nbGUgY29kZSBpcwotdXNlZC4gIEZvciBleGFtcGxlLCB0aGUgc2luZ2xlIHZhbHVlIEBzYW1we0JGRF9SRUxPQ18zMn0gaXMgdXNlZCBmb3IgYWxsCi1zaW1wbGUgMzIgYml0IHJlbG9jYXRpb24gdHlwZXMuCi0KLVRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyByZWxvY2F0aW9uIGNvZGUgaXMgdG8gZ2l2ZSB0aGUgYXNzZW1ibGVyIHNvbWUKLW1lY2hhbmlzbSB0byBjcmVhdGUgQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlcy4gIEluIG9yZGVyIGZvciB0aGUKLWFzc2VtYmxlciB0byBjcmVhdGUgYW4gQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlLCBpdCBoYXMgdG8gYmUgYWJsZSB0bwotb2J0YWluIGEgaG93dG8gc3RydWN0dXJlLiAgVGhlIGZ1bmN0aW9uIEBzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0sCi13aGljaCBzaW1wbHkgY2FsbHMgdGhlIHRhcmdldCB2ZWN0b3IgZW50cnkgcG9pbnQKLUBzYW1we3JlbG9jX3R5cGVfbG9va3VwfSwgdGFrZXMgYSByZWxvY2F0aW9uIGNvZGUgYW5kIHJldHVybnMgYSBob3d0bwotc3RydWN0dXJlLgotCi1UaGUgZnVuY3Rpb24gQHNhbXB7YmZkX2dldF9yZWxvY19jb2RlX25hbWV9IHJldHVybnMgdGhlIG5hbWUgb2YgYQotcmVsb2NhdGlvbiBjb2RlLiAgVGhpcyBpcyBtYWlubHkgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy4KLQotVXNpbmcgYm90aCBob3d0byBzdHJ1Y3R1cmVzIGFuZCByZWxvY2F0aW9uIGNvZGVzIGNhbiBiZSBzb21ld2hhdAotY29uZnVzaW5nLiAgVGhlcmUgYXJlIG1hbnkgcHJvY2Vzc29yIHNwZWNpZmljIHJlbG9jYXRpb24gY29kZXMuCi1Ib3dldmVyLCB0aGUgcmVsb2NhdGlvbiBpcyBvbmx5IGZ1bGx5IGRlZmluZWQgYnkgdGhlIGhvd3RvIHN0cnVjdHVyZS4KLVRoZSBzYW1lIHJlbG9jYXRpb24gY29kZSB3aWxsIG1hcCB0byBkaWZmZXJlbnQgaG93dG8gc3RydWN0dXJlcyBpbgotZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMuICBGb3IgZXhhbXBsZSwgdGhlIGFkZGVuZCBoYW5kbGluZyBtYXkgYmUKLWRpZmZlcmVudC4KLQotTW9zdCBvZiB0aGUgcmVsb2NhdGlvbiBjb2RlcyBhcmUgbm90IHJlYWxseSBnZW5lcmFsLiAgVGhlIGFzc2VtYmxlciBjYW4KLW5vdCB1c2UgdGhlbSB3aXRob3V0IGFscmVhZHkgdW5kZXJzdGFuZGluZyB3aGF0IHNvcnRzIG9mIHJlbG9jYXRpb25zIGNhbgotYmUgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldC4gIEl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlCi1yZWxvY2F0aW9uIGNvZGVzIHdpdGggc29tZXRoaW5nIHNpbXBsZXIuCi0KLUBub2RlIEJGRCByZWxvY2F0aW9uIGZ1dHVyZQotQHN1YnNlY3Rpb24gQkZEIHJlbG9jYXRpb24gZnV0dXJlCi0KLUNsZWFybHkgdGhlIGN1cnJlbnQgQkZEIHJlbG9jYXRpb24gc3VwcG9ydCBpcyBpbiBiYWQgc2hhcGUuICBBCi13aG9sZXNjYWxlIHJld3JpdGUgd291bGQgYmUgdmVyeSBkaWZmaWN1bHQsIGJlY2F1c2UgaXQgd291bGQgcmVxdWlyZQotdGhvcm91Z2ggdGVzdGluZyBvZiBldmVyeSBCRkQgdGFyZ2V0LiAgU28gc29tZSBzb3J0IG9mIGluY3JlbWVudGFsCi1jaGFuZ2UgaXMgcmVxdWlyZWQuCi0KLU15IHZhZ3VlIHRob3VnaHRzIG9uIHRoaXMgd291bGQgaW52b2x2ZSBkZWZpbmluZyBhIG5ldywgY2xlYXJseSBkZWZpbmVkLAotaG93dG8gc3RydWN0dXJlLiAgU29tZSBtZWNoYW5pc20gd291bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdHlwZQotb2YgaG93dG8gc3RydWN0dXJlIHdhcyBiZWluZyB1c2VkIGJ5IGEgcGFydGljdWxhciBmb3JtYXQuCi0KLVRoZSBuZXcgaG93dG8gc3RydWN0dXJlIHdvdWxkIGNsZWFybHkgZGVmaW5lIHRoZSByZWxvY2F0aW9uIGJlaGF2aW91ciBpbgotdGhlIGNhc2Ugb2YgYW4gYXNzZW1ibHksIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuZCBhIGZpbmFsIGxpbmsuICBBdAotbGVhc3Qgb25lIHNwZWNpYWwgZnVuY3Rpb24gd291bGQgYmUgZGVmaW5lZCBhcyBhbiBlc2NhcGUsIGFuZCBpdCBtaWdodAotbWFrZSBzZW5zZSB0byBkZWZpbmUgbW9yZS4KLQotT25lIG9yIG1vcmUgZ2VuZXJpYyBmdW5jdGlvbnMgc2ltaWxhciB0byBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufQotd291bGQgYmUgd3JpdHRlbiB0byBoYW5kbGUgdGhlIG5ldyBob3d0byBzdHJ1Y3R1cmUuCi0KLVRoaXMgc2hvdWxkIG1ha2UgaXQgcG9zc2libGUgdG8gd3JpdGUgYSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIHJlbG9jYXRlCi1zZWN0aW9uIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBuZXcgbGlua2VyLiAgVGhlIHRhcmdldCBzcGVjaWZpYyBjb2RlCi13b3VsZCBwcm92aWRlIHNvbWUgbWVjaGFuaXNtIChhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYW4gaW5pdGlhbAotY29udmVyc2lvbikgdG8gY29udmVydCB0YXJnZXQgc3BlY2lmaWMgcmVsb2NhdGlvbnMgaW50byBob3d0bwotc3RydWN0dXJlcy4KLQotSWRlYWxseSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgdGhpcyBnZW5lcmljIHJlbG9jYXRlIHNlY3Rpb24KLWZ1bmN0aW9uIGZvciB0aGUgZ2VuZXJpYyBsaW5rZXIgYXMgd2VsbC4gIFRoYXQgaXMsIGl0IHdvdWxkIHJlcGxhY2UgdGhlCi1Ac2FtcHtiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9IGZ1bmN0aW9uIHdoaWNoIGlzCi1jdXJyZW50bHkgbm9ybWFsbHkgdXNlZC4KLQotRm9yIHRoZSBzcGVjaWFsIGNhc2Ugb2YgRUxGIGR5bmFtaWMgbGlua2luZywgbW9yZSBjb25zaWRlcmF0aW9uIG5lZWRzIHRvCi1iZSBnaXZlbiB0byB3cml0aW5nIEVMRiBzcGVjaWZpYyBidXQgRUxGIHRhcmdldCBnZW5lcmljIGNvZGUgdG8gaGFuZGxlCi1zcGVjaWFsIHJlbG9jYXRpb24gdHlwZXMgc3VjaCBhcyBHT1QgYW5kIFBMVC4KLQotQG5vZGUgQkZEIEVMRiBzdXBwb3J0Ci1Ac2VjdGlvbiBCRkQgRUxGIHN1cHBvcnQKLUBjaW5kZXggZWxmIHN1cHBvcnQgaW4gYmZkCi1AY2luZGV4IGJmZCBlbGYgc3VwcG9ydAotCi1UaGUgRUxGIG9iamVjdCBmaWxlIGZvcm1hdCBpcyBkZWZpbmVkIGluIHR3byBwYXJ0czogYSBnZW5lcmljIEFCSSBhbmQgYQotcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBsZW1lbnQuICBUaGUgRUxGIHN1cHBvcnQgaW4gQkZEIGlzIHNwbGl0IGluIGEKLXNpbWlsYXIgZmFzaGlvbi4gIFRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydCBpcyBsYXJnZWx5IGtlcHQgd2l0aGluCi1hIHNpbmdsZSBmaWxlLiAgVGhlIGdlbmVyaWMgc3VwcG9ydCBpcyBwcm92aWRlZCBieSBzZXZlcmFsIG90aGVyIGZpbGVzLgotVGhlIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0IHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZAotY29uc3RhbnRzIHVzZWQgYnkgdGhlIGdlbmVyaWMgc3VwcG9ydC4KLQotQG1lbnUKLSogQkZEIEVMRiBzZWN0aW9ucyBhbmQgc2VnbWVudHM6OglFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzCi0qIEJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0OjoJCUJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0Ci0qIEJGRCBFTEYgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQ6OglCRkQgRUxGIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0Ci0qIEJGRCBFTEYgY29yZSBmaWxlczo6CQkJQkZEIEVMRiBjb3JlIGZpbGVzCi0qIEJGRCBFTEYgZnV0dXJlOjoJCQlCRkQgRUxGIGZ1dHVyZQotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzCi1Ac3Vic2VjdGlvbiBFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzCi0KLVRoZSBFTEYgQUJJIHBlcm1pdHMgYSBmaWxlIHRvIGhhdmUgZWl0aGVyIHNlY3Rpb25zIG9yIHNlZ21lbnRzIG9yIGJvdGguCi1SZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGVzIGNvbnZlbnRpb25hbGx5IGhhdmUgb25seSBzZWN0aW9ucy4KLUV4ZWN1dGFibGVzIGNvbnZlbnRpb25hbGx5IGhhdmUgYm90aC4gIENvcmUgZmlsZXMgY29udmVudGlvbmFsbHkgaGF2ZQotb25seSBwcm9ncmFtIHNlZ21lbnRzLgotCi1FTEYgc2VjdGlvbnMgYXJlIHNpbWlsYXIgdG8gc2VjdGlvbnMgaW4gb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0czogdGhleQotaGF2ZSBhIG5hbWUsIGEgVk1BLCBmaWxlIGNvbnRlbnRzLCBmbGFncywgYW5kIG90aGVyIG1pc2NlbGxhbmVvdXMKLWluZm9ybWF0aW9uLiAgRUxGIHJlbG9jYXRpb25zIGFyZSBzdG9yZWQgaW4gc2VjdGlvbnMgb2YgYSBwYXJ0aWN1bGFyCi10eXBlOyBCRkQgYXV0b21hdGljYWxseSBjb252ZXJ0cyB0aGVzZSBzZWN0aW9ucyBpbnRvIGludGVybmFsIHJlbG9jYXRpb24KLWluZm9ybWF0aW9uLgotCi1FTEYgcHJvZ3JhbSBzZWdtZW50cyBhcmUgaW50ZW5kZWQgZm9yIGZhc3QgaW50ZXJwcmV0YXRpb24gYnkgYSBzeXN0ZW0KLWxvYWRlci4gIFRoZXkgaGF2ZSBhIHR5cGUsIGEgVk1BLCBhbiBMTUEsIGZpbGUgY29udGVudHMsIGFuZCBhIGNvdXBsZSBvZgotb3RoZXIgZmllbGRzLiAgV2hlbiBhbiBFTEYgZXhlY3V0YWJsZSBpcyBydW4gb24gYSBVbml4IHN5c3RlbSwgdGhlCi1zeXN0ZW0gbG9hZGVyIHdpbGwgZXhhbWluZSB0aGUgcHJvZ3JhbSBzZWdtZW50cyB0byBkZWNpZGUgaG93IHRvIGxvYWQKLWl0LiAgVGhlIGxvYWRlciB3aWxsIGlnbm9yZSB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gIExvYWRhYmxlIHByb2dyYW0KLXNlZ21lbnRzICh0eXBlIEBzYW1we1BUX0xPQUR9KSBhcmUgZGlyZWN0bHkgbG9hZGVkIGludG8gbWVtb3J5LiAgT3RoZXIKLXByb2dyYW0gc2VnbWVudHMgYXJlIGludGVycHJldGVkIGJ5IHRoZSBsb2FkZXIsIGFuZCBnZW5lcmFsbHkgcHJvdmlkZQotZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLgotCi1XaGVuIGFuIEVMRiBmaWxlIGhhcyBib3RoIHByb2dyYW0gc2VnbWVudHMgYW5kIHNlY3Rpb25zLCBhbiBFTEYgcHJvZ3JhbQotc2VnbWVudCBtYXkgZW5jb21wYXNzIG9uZSBvciBtb3JlIEVMRiBzZWN0aW9ucywgaW4gdGhlIHNlbnNlIHRoYXQgdGhlCi1wb3J0aW9uIG9mIHRoZSBmaWxlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBwcm9ncmFtIHNlZ21lbnQgbWF5IGluY2x1ZGUKLXRoZSBwb3J0aW9ucyBvZiB0aGUgZmlsZSBjb3JyZXNwb25kaW5nIHRvIG9uZSBvciBtb3JlIHNlY3Rpb25zLiAgV2hlbgotdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGluIGEgbG9hZGFibGUgcHJvZ3JhbSBzZWdtZW50LCB0aGUKLXJlbGF0aXZlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbiBjb250ZW50cyBpbiB0aGUgZmlsZSBtdXN0IGNvcnJlc3BvbmQKLXRvIHRoZSByZWxhdGl2ZSBwb3NpdGlvbnMgdGhleSBzaG91bGQgaG9sZCB3aGVuIHRoZSBwcm9ncmFtIHNlZ21lbnQgaXMKLWxvYWRlZC4gIFRoaXMgcmVxdWlyZW1lbnQgc2hvdWxkIGJlIG9idmlvdXMgaWYgeW91IGNvbnNpZGVyIHRoYXQgdGhlCi1zeXN0ZW0gbG9hZGVyIHdpbGwgbG9hZCBhbiBlbnRpcmUgcHJvZ3JhbSBzZWdtZW50IGF0IGEgdGltZS4KLQotT24gYSBzeXN0ZW0gd2hpY2ggc3VwcG9ydHMgZHluYW1pYyBwYWdpbmcsIHN1Y2ggYXMgYW55IG5hdGl2ZSBVbml4Ci1zeXN0ZW0sIHRoZSBjb250ZW50cyBvZiBhIGxvYWRhYmxlIHByb2dyYW0gc2VnbWVudCBtdXN0IGJlIGF0IHRoZSBzYW1lCi1vZmZzZXQgaW4gdGhlIGZpbGUgYXMgaW4gbWVtb3J5LCBtb2R1bG8gdGhlIG1lbW9yeSBwYWdlIHNpemUgdXNlZCBvbiB0aGUKLXN5c3RlbS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3lzdGVtIGxvYWRlciB3aWxsIG1hcCB0aGUgZmlsZSBpbnRvIG1lbW9yeQotc3RhcnRpbmcgYXQgdGhlIHN0YXJ0IG9mIGEgcGFnZS4gIFRoZSBzeXN0ZW0gbG9hZGVyIGNhbiBlYXNpbHkgcmVtYXAKLWVudGlyZSBwYWdlcyB0byB0aGUgY29ycmVjdCBsb2FkIGFkZHJlc3MuICBIb3dldmVyLCBpZiB0aGUgY29udGVudHMgb2YKLXRoZSBmaWxlIHdlcmUgbm90IGNvcnJlY3RseSBhbGlnbmVkIHdpdGhpbiB0aGUgcGFnZSwgdGhlIHN5c3RlbSBsb2FkZXIKLXdvdWxkIGhhdmUgdG8gc2hpZnQgdGhlIGNvbnRlbnRzIGFyb3VuZCB3aXRoaW4gdGhlIHBhZ2UsIHdoaWNoIGlzIHRvbwotZXhwZW5zaXZlLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBMTUEgb2YgYSBsb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQgaXMKLUBzYW1wezB4NDAwODB9IGFuZCB0aGUgcGFnZSBzaXplIGlzIEBzYW1wezB4MTAwMH0sIHRoZW4gdGhlIHBvc2l0aW9uIG9mCi10aGUgc2VnbWVudCBjb250ZW50cyB3aXRoaW4gdGhlIGZpbGUgbXVzdCBlcXVhbCBAc2FtcHsweDgwfSBtb2R1bG8KLUBzYW1wezB4MTAwMH0uCi0KLUJGRCBoYXMgb25seSBhIHNpbmdsZSBzZXQgb2Ygc2VjdGlvbnMuICBJdCBkb2VzIG5vdCBwcm92aWRlIGFueSBnZW5lcmljCi13YXkgdG8gZXhhbWluZSBib3RoIHNlY3Rpb25zIGFuZCBzZWdtZW50cy4gIFdoZW4gQkZEIGlzIHVzZWQgdG8gb3BlbiBhbgotb2JqZWN0IGZpbGUgb3IgZXhlY3V0YWJsZSwgdGhlIEJGRCBzZWN0aW9ucyB3aWxsIHJlcHJlc2VudCBFTEYgc2VjdGlvbnMuCi1XaGVuIEJGRCBpcyB1c2VkIHRvIG9wZW4gYSBjb3JlIGZpbGUsIHRoZSBCRkQgc2VjdGlvbnMgd2lsbCByZXByZXNlbnQKLUVMRiBwcm9ncmFtIHNlZ21lbnRzLgotCi1XaGVuIEJGRCBpcyB1c2VkIHRvIGV4YW1pbmUgYW4gb2JqZWN0IGZpbGUgb3IgZXhlY3V0YWJsZSwgYW55IHByb2dyYW0KLXNlZ21lbnRzIHdpbGwgYmUgcmVhZCB0byBzZXQgdGhlIExNQSBvZiB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIGJlY2F1c2UKLUVMRiBzZWN0aW9ucyBvbmx5IGhhdmUgYSBWTUEsIHdoaWxlIEVMRiBwcm9ncmFtIHNlZ21lbnRzIGhhdmUgYm90aCBhIFZNQQotYW5kIGFuIExNQS4gIEFueSBwcm9ncmFtIHNlZ21lbnRzIHdpbGwgYmUgY29waWVkIGJ5IHRoZQotQHNhbXB7Y29weV9wcml2YXRlfSBlbnRyeSBwb2ludHMuICBUaGV5IHdpbGwgYmUgcHJpbnRlZCBieSB0aGUKLUBzYW1we3ByaW50X3ByaXZhdGV9IGVudHJ5IHBvaW50LiAgT3RoZXJ3aXNlLCB0aGUgcHJvZ3JhbSBzZWdtZW50cyBhcmUKLWlnbm9yZWQuICBJbiBwYXJ0aWN1bGFyLCBwcm9ncmFtcyB3aGljaCB1c2UgQkZEIGN1cnJlbnRseSBoYXZlIG5vIGRpcmVjdAotYWNjZXNzIHRvIHRoZSBwcm9ncmFtIHNlZ21lbnRzLgotCi1XaGVuIEJGRCBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlLCB0aGUgcHJvZ3JhbSBzZWdtZW50cyB3aWxsIGJlCi1jcmVhdGVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICBUaGlzIGlzIGRvbmUgaW4KLXRoZSBmdW5jdGlvbiBAc2FtcHthc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzfSBpbiBAZmlsZXtlbGYuY30uCi1UaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHR3ZWFrZWQgbWFueSB0aW1lcywgYW5kIHByb2JhYmx5IHN0aWxsIGhhcwotcHJvYmxlbXMgdGhhdCBhcmlzZSBpbiBwYXJ0aWN1bGFyIGNhc2VzLgotCi1UaGVyZSBpcyBhIGhvb2sgd2hpY2ggbWF5IGJlIHVzZWQgdG8gZXhwbGljaXRseSBkZWZpbmUgdGhlIHByb2dyYW0KLXNlZ21lbnRzIHdoZW4gY3JlYXRpbmcgYW4gZXhlY3V0YWJsZTogdGhlIEBzYW1we2JmZF9yZWNvcmRfcGhkcn0KLWZ1bmN0aW9uIGluIEBmaWxle2JmZC5jfS4gIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBCRkQgd2lsbCBub3QKLWNyZWF0ZSBwcm9ncmFtIHNlZ21lbnRzIGl0c2VsZiwgYnV0IHdpbGwgb25seSBjcmVhdGUgdGhlIHByb2dyYW0KLXNlZ21lbnRzIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyLiAgVGhlIGxpbmtlciB1c2VzIHRoaXMgZnVuY3Rpb24gdG8KLWltcGxlbWVudCB0aGUgQHNhbXB7UEhEUlN9IGxpbmtlciBzY3JpcHQgY29tbWFuZC4KLQotQG5vZGUgQkZEIEVMRiBnZW5lcmljIHN1cHBvcnQKLUBzdWJzZWN0aW9uIEJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0Ci0KLUluIGdlbmVyYWwsIGZ1bmN0aW9ucyB3aGljaCBkbyBub3QgcmVhZCBleHRlcm5hbCBkYXRhIGZyb20gdGhlIEVMRiBmaWxlCi1hcmUgZm91bmQgaW4gQGZpbGV7ZWxmLmN9LiAgVGhleSBvcGVyYXRlIG9uIHRoZSBpbnRlcm5hbCBmb3JtcyBvZiB0aGUKLUVMRiBzdHJ1Y3R1cmVzLCB3aGljaCBhcmUgZGVmaW5lZCBpbiBAZmlsZXtpbmNsdWRlL2VsZi9pbnRlcm5hbC5ofS4gIFRoZQotaW50ZXJuYWwgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiBAc2FtcHtiZmRfdm1hfSwgYW5kIHNvIG1heQotYmUgdXNlZCBmb3IgYm90aCAzMiBiaXQgYW5kIDY0IGJpdCBFTEYgdGFyZ2V0cy4KLQotVGhlIGZpbGUgQGZpbGV7ZWxmY29kZS5ofSBjb250YWlucyBmdW5jdGlvbnMgd2hpY2ggb3BlcmF0ZSBvbiB0aGUKLWV4dGVybmFsIGRhdGEuICBAZmlsZXtlbGZjb2RlLmh9IGlzIGNvbXBpbGVkIHR3aWNlLCBvbmNlIHZpYQotQGZpbGV7ZWxmMzIuY30gd2l0aCBAc2FtcHtBUkNIX1NJWkV9IGRlZmluZWQgYXMgQHNhbXB7MzJ9LCBhbmQgb25jZSB2aWEKLUBmaWxle2VsZjY0LmN9IHdpdGggQHNhbXB7QVJDSF9TSVpFfSBkZWZpbmVkIGFzIEBzYW1wezY0fS4KLUBmaWxle2VsZmNvZGUuaH0gaW5jbHVkZXMgZnVuY3Rpb25zIHRvIHN3YXAgdGhlIEVMRiBzdHJ1Y3R1cmVzIGluIGFuZAotb3V0IG9mIGV4dGVybmFsIGZvcm0sIGFzIHdlbGwgYXMgYSBmZXcgbW9yZSBjb21wbGV4IGZ1bmN0aW9ucy4KLQotTGlua2VyIHN1cHBvcnQgaXMgZm91bmQgaW4gQGZpbGV7ZWxmbGluay5jfSBhbmQgQGZpbGV7ZWxmbGluay5ofS4gIFRoZQotbGF0dGVyIGZpbGUgaXMgY29tcGlsZWQgdHdpY2UsIGZvciBib3RoIDMyIGFuZCA2NCBiaXQgc3VwcG9ydC4gIFRoZQotbGlua2VyIHN1cHBvcnQgaXMgb25seSB1c2VkIGlmIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgZmlsZSBkZWZpbmVzCi1Ac2FtcHtlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9ufSwgd2hpY2ggaXMgcmVxdWlyZWQgdG8gcmVsb2NhdGUgdGhlCi1zZWN0aW9uIGNvbnRlbnRzLiAgSWYgdGhhdCBtYWNybyBpcyBub3QgZGVmaW5lZCwgdGhlIGdlbmVyaWMgbGlua2VyIGNvZGUKLWlzIHVzZWQsIGFuZCByZWxvY2F0aW9ucyBhcmUgaGFuZGxlZCB2aWEgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0uCi0KLVRoZSBjb3JlIGZpbGUgc3VwcG9ydCBpcyBpbiBAZmlsZXtlbGZjb3JlLmh9LCB3aGljaCBpcyBjb21waWxlZCB0d2ljZSwKLWZvciBib3RoIDMyIGFuZCA2NCBiaXQgc3VwcG9ydC4gIFRoZSBtb3JlIGludGVyZXN0aW5nIGNhc2VzIG9mIGNvcmUgZmlsZQotc3VwcG9ydCBvbmx5IHdvcmsgb24gYSBuYXRpdmUgc3lzdGVtIHdoaWNoIGhhcyB0aGUgQGZpbGV7c3lzL3Byb2Nmcy5ofQotaGVhZGVyIGZpbGUuICBXaXRob3V0IHRoYXQgZmlsZSwgdGhlIGNvcmUgZmlsZSBzdXBwb3J0IGRvZXMgbGl0dGxlIG1vcmUKLXRoYW4gcmVhZCB0aGUgRUxGIHByb2dyYW0gc2VnbWVudHMgYXMgQkZEIHNlY3Rpb25zLgotCi1UaGUgQkZEIGludGVybmFsIGhlYWRlciBmaWxlIEBmaWxle2VsZi1iZmQuaH0gaXMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbgotYW1vbmcgdGhlc2UgZmlsZXMgYW5kIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgZmlsZXMuCi0KLVRoZSBkZWZhdWx0IGVudHJpZXMgZm9yIHRoZSBCRkQgRUxGIHRhcmdldCB2ZWN0b3IgYXJlIGZvdW5kIG1haW5seSBpbgotQGZpbGV7ZWxmLmN9LiAgU29tZSBmdW5jdGlvbnMgYXJlIGZvdW5kIGluIEBmaWxle2VsZmNvZGUuaH0uCi0KLVRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgZmlsZXMgbWF5IG92ZXJyaWRlIHBhcnRpY3VsYXIgZW50cmllcyBpbiB0aGUKLXRhcmdldCB2ZWN0b3IsIGJ1dCBtb3N0IGRvIG5vdCwgd2l0aCBvbmUgZXhjZXB0aW9uOiB0aGUKLUBzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0gZW50cnkgcG9pbnQgaXMgYWx3YXlzIHByb2Nlc3NvciBzcGVjaWZpYy4KLQotQG5vZGUgQkZEIEVMRiBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAotQHN1YnNlY3Rpb24gQkZEIEVMRiBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAotCi1CeSBjb252ZW50aW9uLCB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQgZm9yIGEgcGFydGljdWxhciBwcm9jZXNzb3IKLXdpbGwgYmUgZm91bmQgaW4gQGZpbGV7ZWxmQHZhcntubn0tQHZhcntjcHV9LmN9LCB3aGVyZSBAdmFye25ufSBpcwotZWl0aGVyIDMyIG9yIDY0LCBhbmQgQHZhcntjcHV9IGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzb3IuCi0KLUBtZW51Ci0qIEJGRCBFTEYgcHJvY2Vzc29yIHJlcXVpcmVkOjoJUmVxdWlyZWQgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQKLSogQkZEIEVMRiBwcm9jZXNzb3IgbGlua2VyOjoJUHJvY2Vzc29yIHNwZWNpZmljIGxpbmtlciBzdXBwb3J0Ci0qIEJGRCBFTEYgcHJvY2Vzc29yIG90aGVyOjoJT3RoZXIgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQgb3B0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBFTEYgcHJvY2Vzc29yIHJlcXVpcmVkCi1Ac3Vic3Vic2VjdGlvbiBSZXF1aXJlZCBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAotCi1XaGVuIHdyaXRpbmcgYSBAZmlsZXtlbGZAdmFye25ufS1AdmFye2NwdX0uY30gZmlsZSwgeW91IG11c3QgZG8gdGhlCi1mb2xsb3dpbmc6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1EZWZpbmUgZWl0aGVyIEBzYW1we1RBUkdFVF9CSUdfU1lNfSBvciBAc2FtcHtUQVJHRVRfTElUVExFX1NZTX0sIG9yCi1ib3RoLCB0byBhIHVuaXF1ZSBDIG5hbWUgdG8gdXNlIGZvciB0aGUgdGFyZ2V0IHZlY3Rvci4gIFRoaXMgbmFtZSBzaG91bGQKLWFwcGVhciBpbiB0aGUgbGlzdCBvZiB0YXJnZXQgdmVjdG9ycyBpbiBAZmlsZXt0YXJnZXRzLmN9LCBhbmQgd2lsbCBhbHNvCi1oYXZlIHRvIGFwcGVhciBpbiBAZmlsZXtjb25maWcuYmZkfSBhbmQgQGZpbGV7Y29uZmlndXJlLmlufS4gIERlZmluZQotQHNhbXB7VEFSR0VUX0JJR19TWU19IGZvciBhIGJpZy1lbmRpYW4gcHJvY2Vzc29yLAotQHNhbXB7VEFSR0VUX0xJVFRMRV9TWU19IGZvciBhIGxpdHRsZS1lbmRpYW4gcHJvY2Vzc29yLCBhbmQgZGVmaW5lIGJvdGgKLWZvciBhIGJpLWVuZGlhbiBwcm9jZXNzb3IuCi1AaXRlbQotRGVmaW5lIGVpdGhlciBAc2FtcHtUQVJHRVRfQklHX05BTUV9IG9yIEBzYW1we1RBUkdFVF9MSVRUTEVfTkFNRX0sIG9yCi1ib3RoLCB0byBhIHN0cmluZyB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgdmVjdG9yLiAgVGhpcyBpcyB0aGUKLW5hbWUgd2hpY2ggYSB1c2VyIG9mIHRoZSBCRkQgdG9vbCB3b3VsZCB1c2UgdG8gc3BlY2lmeSB0aGUgb2JqZWN0IGZpbGUKLWZvcm1hdC4gIEl0IHdvdWxkIG5vcm1hbGx5IGFwcGVhciBpbiBhIGxpbmtlciBlbXVsYXRpb24gcGFyYW1ldGVycwotZmlsZS4KLUBpdGVtCi1EZWZpbmUgQHNhbXB7RUxGX0FSQ0h9IHRvIHRoZSBCRkQgYXJjaGl0ZWN0dXJlIChhbiBlbGVtZW50IG9mIHRoZQotQHNhbXB7YmZkX2FyY2hpdGVjdHVyZX0gZW51bSwgdHlwaWNhbGx5IEBzYW1we2JmZF9hcmNoX0B2YXJ7Y3B1fX0pLgotQGl0ZW0KLURlZmluZSBAc2FtcHtFTEZfTUFDSElORV9DT0RFfSB0byB0aGUgbWFnaWMgbnVtYmVyIHdoaWNoIHNob3VsZCBhcHBlYXIKLWluIHRoZSBAc2FtcHtlX21hY2hpbmV9IGZpZWxkIG9mIHRoZSBFTEYgaGVhZGVyLiAgQXMgb2YgdGhpcyB3cml0aW5nLAotdGhlc2UgbWFnaWMgbnVtYmVycyBhcmUgYXNzaWduZWQgYnkgU0NPOyBpZiB5b3Ugd2FudCB0byBnZXQgYSBtYWdpYwotbnVtYmVyIGZvciBhIHBhcnRpY3VsYXIgcHJvY2Vzc29yLCB0cnkgc2VuZGluZyBhIG5vdGUgdG8KLUBlbWFpbHtyZWdpc3RyeUBAc2NvLmNvbX0uICBJbiB0aGUgQkZEIHNvdXJjZXMsIHRoZSBtYWdpYyBudW1iZXJzIGFyZQotZm91bmQgaW4gQGZpbGV7aW5jbHVkZS9lbGYvY29tbW9uLmh9OyB0aGV5IGhhdmUgbmFtZXMgYmVnaW5uaW5nIHdpdGgKLUBzYW1we0VNX30uCi1AaXRlbQotRGVmaW5lIEBzYW1we0VMRl9NQVhQQUdFU0laRX0gdG8gdGhlIG1heGltdW0gc2l6ZSBvZiBhIHZpcnR1YWwgcGFnZSBpbgotbWVtb3J5LiAgVGhpcyBjYW4gbm9ybWFsbHkgYmUgZm91bmQgYXQgdGhlIHN0YXJ0IG9mIGNoYXB0ZXIgNSBpbiB0aGUKLXByb2Nlc3NvciBzcGVjaWZpYyBzdXBwbGVtZW50LiAgRm9yIGEgcHJvY2Vzc29yIHdoaWNoIHdpbGwgb25seSBiZSB1c2VkCi1pbiBhbiBlbWJlZGRlZCBzeXN0ZW0sIG9yIHdoaWNoIGhhcyBubyBtZW1vcnkgbWFuYWdlbWVudCBoYXJkd2FyZSwgdGhpcwotY2FuIHNpbXBseSBiZSBAc2FtcHsxfS4KLUBpdGVtCi1JZiB0aGUgZm9ybWF0IHNob3VsZCB1c2UgQHNhbXB7UmVsfSByYXRoZXIgdGhhbiBAc2FtcHtSZWxhfSByZWxvY2F0aW9ucywKLWRlZmluZSBAc2FtcHtVU0VfUkVMfS4gIFRoaXMgaXMgbm9ybWFsbHkgZGVmaW5lZCBpbiBjaGFwdGVyIDQgb2YgdGhlCi1wcm9jZXNzb3Igc3BlY2lmaWMgc3VwcGxlbWVudC4KLQotSW4gdGhlIGFic2VuY2Ugb2YgYSBzdXBwbGVtZW50LCBpdCdzIGVhc2llciB0byB3b3JrIHdpdGggQHNhbXB7UmVsYX0KLXJlbG9jYXRpb25zLiAgQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMgd2lsbCByZXF1aXJlIG1vcmUgc3BhY2UgaW4gb2JqZWN0Ci1maWxlcyAoYnV0IG5vdCBpbiBleGVjdXRhYmxlcywgZXhjZXB0IHdoZW4gdXNpbmcgZHluYW1pYyBsaW5raW5nKS4KLUhvd2V2ZXIsIHRoaXMgaXMgb3V0d2VpZ2hlZCBieSB0aGUgc2ltcGxpY2l0eSBvZiBhZGRlbmQgaGFuZGxpbmcgd2hlbgotdXNpbmcgQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMuICBXaXRoIEBzYW1we1JlbH0gcmVsb2NhdGlvbnMsIHRoZSBhZGRlbmQKLW11c3QgYmUgc3RvcmVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCB3aGljaCBtYWtlcyByZWxvY2F0ZWFibGUgbGlua3MKLW1vcmUgY29tcGxleC4KLQotRm9yIGV4YW1wbGUsIGNvbnNpZGVyIEMgY29kZSBsaWtlIEBjb2Rle2kgPSBhWzEwMDBdO30gd2hlcmUgQHNhbXB7YX0gaXMKLWEgZ2xvYmFsIGFycmF5LiAgVGhlIGluc3RydWN0aW9ucyB3aGljaCBsb2FkIHRoZSB2YWx1ZSBvZiBAc2FtcHthWzEwMDBdfQotd2lsbCBtb3N0IGxpa2VseSB1c2UgYSByZWxvY2F0aW9uIHdoaWNoIHJlZmVycyB0byB0aGUgc3ltYm9sCi1yZXByZXNlbnRpbmcgQHNhbXB7YX0sIHdpdGggYW4gYWRkZW5kIHRoYXQgZ2l2ZXMgdGhlIG9mZnNldCBmcm9tIHRoZQotc3RhcnQgb2YgQHNhbXB7YX0gdG8gZWxlbWVudCBAc2FtcHsxMDAwfS4gIFdoZW4gdXNpbmcgQHNhbXB7UmVsfQotcmVsb2NhdGlvbnMsIHRoYXQgYWRkZW5kIG11c3QgYmUgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcy4KLUlmIHlvdSBhcmUgYWRkaW5nIHN1cHBvcnQgZm9yIGEgUklTQyBjaGlwIHdoaWNoIHVzZXMgdHdvIG9yIG1vcmUKLWluc3RydWN0aW9ucyB0byBsb2FkIGFuIGFkZHJlc3MsIHRoZW4gdGhlIGFkZGVuZCBtYXkgbm90IGZpdCBpbiBhIHNpbmdsZQotaW5zdHJ1Y3Rpb24sIGFuZCB3aWxsIGhhdmUgdG8gYmUgc29tZWhvdyBzcGxpdCBhbW9uZyB0aGUgaW5zdHJ1Y3Rpb25zLgotVGhpcyBtYWtlcyBsaW5raW5nIGF3a3dhcmQsIHBhcnRpY3VsYXJseSB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsKLWluIHdoaWNoIHRoZSBhZGRlbmQgbWF5IGhhdmUgdG8gYmUgdXBkYXRlZC4gIEl0IGNhbiBiZSBkb25lLS0tdGhlIE1JUFMKLUVMRiBzdXBwb3J0IGRvZXMgaXQtLS1idXQgaXQgc2hvdWxkIGJlIGF2b2lkZWQgd2hlbiBwb3NzaWJsZS4KLQotSXQgaXMgcG9zc2libGUsIHRob3VnaCBzb21ld2hhdCBhd2t3YXJkLCB0byBzdXBwb3J0IGJvdGggQHNhbXB7UmVsfSBhbmQKLUBzYW1we1JlbGF9IHJlbG9jYXRpb25zIGZvciBhIHNpbmdsZSB0YXJnZXQ7IEBmaWxle2VsZjY0LW1pcHMuY30gZG9lcyBpdAotYnkgb3ZlcnJpZGluZyB0aGUgcmVsb2NhdGlvbiByZWFkaW5nIGFuZCB3cml0aW5nIHJvdXRpbmVzLgotQGl0ZW0KLURlZmluZSBob3d0byBzdHJ1Y3R1cmVzIGZvciBhbGwgdGhlIHJlbG9jYXRpb24gdHlwZXMuCi1AaXRlbQotRGVmaW5lIGEgQHNhbXB7YmZkX3JlbG9jX3R5cGVfbG9va3VwfSByb3V0aW5lLiAgVGhpcyBtdXN0IGJlIG5hbWVkCi1Ac2FtcHtiZmRfZWxmQHZhcntubn1fYmZkX3JlbG9jX3R5cGVfbG9va3VwfSwgYW5kIG1heSBiZSBlaXRoZXIgYQotZnVuY3Rpb24gb3IgYSBtYWNyby4gIEl0IG11c3QgdHJhbnNsYXRlIGEgQkZEIHJlbG9jYXRpb24gY29kZSBpbnRvIGEKLWhvd3RvIHN0cnVjdHVyZS4gIFRoaXMgaXMgbm9ybWFsbHkgYSB0YWJsZSBsb29rdXAgb3IgYSBzaW1wbGUgc3dpdGNoLgotQGl0ZW0KLUlmIHVzaW5nIEBzYW1we1JlbH0gcmVsb2NhdGlvbnMsIGRlZmluZSBAc2FtcHtlbGZfaW5mb190b19ob3d0b19yZWx9LgotSWYgdXNpbmcgQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMsIGRlZmluZSBAc2FtcHtlbGZfaW5mb190b19ob3d0b30uCi1FaXRoZXIgd2F5LCB0aGlzIGlzIGEgbWFjcm8gZGVmaW5lZCBhcyB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHdoaWNoCi10YWtlcyBhbiBAc2FtcHthcmVsZW50fSBhbmQgYSBAc2FtcHtSZWx9IG9yIEBzYW1we1JlbGF9IHN0cnVjdHVyZSwgYW5kCi1zZXRzIHRoZSBAc2FtcHtob3d0b30gZmllbGQgb2YgdGhlIEBzYW1we2FyZWxlbnR9IGJhc2VkIG9uIHRoZQotQHNhbXB7UmVsfSBvciBAc2FtcHtSZWxhfSBzdHJ1Y3R1cmUuICBUaGlzIGlzIG5vcm1hbGx5IHVzZXMKLUBzYW1we0VMRkB2YXJ7bm59X1JfVFlQRX0gdG8gZ2V0IHRoZSBFTEYgcmVsb2NhdGlvbiB0eXBlIGFuZCB1c2VzIGl0IGFzCi1hbiBpbmRleCBpbnRvIGEgdGFibGUgb2YgaG93dG8gc3RydWN0dXJlcy4KLUBlbmQgaXRlbWl6ZQotCi1Zb3UgbXVzdCBhbHNvIGFkZCB0aGUgbWFnaWMgbnVtYmVyIGZvciB0aGlzIHByb2Nlc3NvciB0byB0aGUKLUBzYW1we3ByZXBfaGVhZGVyc30gZnVuY3Rpb24gaW4gQGZpbGV7ZWxmLmN9LgotCi1Zb3UgbXVzdCBhbHNvIGNyZWF0ZSBhIGhlYWRlciBmaWxlIGluIHRoZSBAZmlsZXtpbmNsdWRlL2VsZn0gZGlyZWN0b3J5Ci1jYWxsZWQgQGZpbGV7QHZhcntjcHV9Lmh9LiAgVGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgYW55IHRhcmdldCBzcGVjaWZpYyAKLWluZm9ybWF0aW9uIHdoaWNoIG1heSBiZSBuZWVkZWQgb3V0c2lkZSBvZiB0aGUgQkZEIGNvZGUuICBJbiBwYXJ0aWN1bGFyCi1pdCBzaG91bGQgdXNlIHRoZSBAc2FtcHtTVEFSVF9SRUxPQ19OVU1CRVJTfSwgQHNhbXB7UkVMT0NfTlVNQkVSfSwKLUBzYW1we0ZBS0VfUkVMT0N9LCBAc2FtcHtFTVBUWV9SRUxPQ30gYW5kIEBzYW1we0VORF9SRUxPQ19OVU1CRVJTfQotbWFjcm9zIHRvIGNyZWF0ZSBhIHRhYmxlIG1hcHBpbmcgdGhlIG51bWJlciB1c2VkIHRvIGluZGVudGlmeSBhCi1yZWxvY2F0aW9uIHRvIGEgbmFtZSBkZXNjcmliaW5nIHRoYXQgcmVsb2NhdGlvbi4KLQotQG5vZGUgQkZEIEVMRiBwcm9jZXNzb3IgbGlua2VyCi1Ac3Vic3Vic2VjdGlvbiBQcm9jZXNzb3Igc3BlY2lmaWMgbGlua2VyIHN1cHBvcnQKLQotVGhlIGxpbmtlciB3aWxsIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQgaWYgeW91IGRlZmluZSBhIHJlbG9jYXRlIHNlY3Rpb24KLWZ1bmN0aW9uLiAgVGhpcyB3aWxsIHBlcm1pdCBCRkQgdG8gdXNlIHRoZSBFTEYgc3BlY2lmaWMgbGlua2VyIHN1cHBvcnQuCi0KLUlmIHlvdSBkbyBub3QgZGVmaW5lIGEgcmVsb2NhdGUgc2VjdGlvbiBmdW5jdGlvbiwgQkZEIG11c3QgdXNlIHRoZQotZ2VuZXJpYyBsaW5rZXIgc3VwcG9ydCwgd2hpY2ggcmVxdWlyZXMgY29udmVydGluZyBhbGwgc3ltYm9scyBhbmQKLXJlbG9jYXRpb25zIGludG8gQkZEIEBzYW1we2FzeW1ib2x9IGFuZCBAc2FtcHthcmVsZW50fSBzdHJ1Y3R1cmVzLiAgSW4KLXRoaXMgY2FzZSwgcmVsb2NhdGlvbnMgd2lsbCBiZSBoYW5kbGVkIGJ5IGNhbGxpbmcKLUBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259LCB3aGljaCB3aWxsIHVzZSB0aGUgaG93dG8gc3RydWN0dXJlcyB5b3UKLWhhdmUgZGVmaW5lZC4gIEB4cmVme0JGRCByZWxvY2F0aW9uIGhhbmRsaW5nfS4KLQotSW4gb3JkZXIgdG8gc3VwcG9ydCBsaW5raW5nIGludG8gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0LCBzdWNoIGFzCi1TLXJlY29yZHMsIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IG11c3Qgd29yayBjb3JyZWN0bHkgd2l0aCB5b3VyCi1ob3d0byBzdHJ1Y3R1cmVzLCBzbyB5b3UgY2FuJ3Qgc2tpcCB0aGF0IHN0ZXAuICBIb3dldmVyLCBpZiB5b3UgZGVmaW5lCi10aGUgcmVsb2NhdGUgc2VjdGlvbiBmdW5jdGlvbiwgdGhlbiBpbiB0aGUgbm9ybWFsIGNhc2Ugb2YgbGlua2luZyBpbnRvCi1hbiBFTEYgZmlsZSB0aGUgbGlua2VyIHdpbGwgbm90IG5lZWQgdG8gY29udmVydCBzeW1ib2xzIGFuZCByZWxvY2F0aW9ucywKLWFuZCB3aWxsIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQuCi0KLVRvIHVzZSBhIHJlbG9jYXRpb24gc2VjdGlvbiBmdW5jdGlvbiwgZGVmaW5lIHRoZSBtYWNybwotQHNhbXB7ZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbn0gYXMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB3aGljaCB3aWxsCi10YWtlIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24sIGFzIHdlbGwgYXMgcmVsb2NhdGlvbiwgc3ltYm9sLCBhbmQgb3RoZXIKLWluZm9ybWF0aW9uLCBhbmQgbW9kaWZ5IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFjY29yZGluZyB0byB0aGUgcmVsb2NhdGlvbgotaW5mb3JtYXRpb24uICBJbiBzaW1wbGUgY2FzZXMsIHRoaXMgaXMgbGl0dGxlIG1vcmUgdGhhbiBhIGxvb3Agb3ZlciB0aGUKLXJlbG9jYXRpb25zIHdoaWNoIGNvbXB1dGVzIHRoZSB2YWx1ZSBvZiBlYWNoIHJlbG9jYXRpb24gYW5kIGNhbGxzCi1Ac2FtcHtfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGV9LiAgVGhlIGZ1bmN0aW9uIG11c3QgY2hlY2sgZm9yIGEKLXJlbG9jYXRlYWJsZSBsaW5rLCBhbmQgaW4gdGhhdCBjYXNlIG5vcm1hbGx5IG5lZWRzIHRvIGRvIG5vdGhpbmcgb3RoZXIKLXRoYW4gYWRqdXN0IHRoZSBhZGRlbmQgZm9yIHJlbG9jYXRpb25zIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbC4KLQotVGhlIGNvbXBsZXggY2FzZXMgZ2VuZXJhbGx5IGhhdmUgdG8gZG8gd2l0aCBkeW5hbWljIGxpbmtlciBzdXBwb3J0LiAgR09UCi1hbmQgUExUIHJlbG9jYXRpb25zIG11c3QgYmUgaGFuZGxlZCBzcGVjaWFsbHksIGFuZCB0aGUgbGlua2VyIG5vcm1hbGx5Ci1hcnJhbmdlcyB0byBzZXQgdXAgdGhlIEdPVCBhbmQgUExUIHNlY3Rpb25zIHdoaWxlIGhhbmRsaW5nIHJlbG9jYXRpb25zLgotV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHJhbmRvbSByZWxvY2F0aW9ucyBtdXN0IG5vcm1hbGx5IGJlCi1jb3BpZWQgaW50byB0aGUgc2hhcmVkIGxpYnJhcnksIG9yIGNvbnZlcnRlZCB0byBSRUxBVElWRSByZWxvY2F0aW9ucwotd2hlbiBwb3NzaWJsZS4KLQotQG5vZGUgQkZEIEVMRiBwcm9jZXNzb3Igb3RoZXIKLUBzdWJzdWJzZWN0aW9uIE90aGVyIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0IG9wdGlvbnMKLQotVGhlcmUgYXJlIG1hbnkgb3RoZXIgbWFjcm9zIHdoaWNoIG1heSBiZSBkZWZpbmVkIGluCi1AZmlsZXtlbGZAdmFye25ufS1AdmFye2NwdX0uY30uICBUaGVzZSBtYWNyb3MgbWF5IGJlIGZvdW5kIGluCi1AZmlsZXtlbGZ4eC10YXJnZXQuaH0uCi0KLU1hY3JvcyBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSBzb21lIG9mIHRoZSBnZW5lcmljIEVMRiB0YXJnZXQgdmVjdG9yCi1mdW5jdGlvbnMuCi0KLVNldmVyYWwgcHJvY2Vzc29yIHNwZWNpZmljIGhvb2sgZnVuY3Rpb25zIHdoaWNoIG1heSBiZSBkZWZpbmVkIGFzCi1tYWNyb3MuICBUaGVzZSBmdW5jdGlvbnMgYXJlIGZvdW5kIGFzIGZ1bmN0aW9uIHBvaW50ZXJzIGluIHRoZQotQHNhbXB7ZWxmX2JhY2tlbmRfZGF0YX0gc3RydWN0dXJlIGRlZmluZWQgaW4gQGZpbGV7ZWxmLWJmZC5ofS4gIEluCi1nZW5lcmFsLCBhIGhvb2sgZnVuY3Rpb24gaXMgc2V0IGJ5IGRlZmluaW5nIGEgbWFjcm8KLUBzYW1we2VsZl9iYWNrZW5kX0B2YXJ7bmFtZX19LgotCi1UaGVyZSBhcmUgYSBmZXcgcHJvY2Vzc29yIHNwZWNpZmljIGNvbnN0YW50cyB3aGljaCBtYXkgYWxzbyBiZSBkZWZpbmVkLgotVGhlc2UgYXJlIGFnYWluIGZvdW5kIGluIHRoZSBAc2FtcHtlbGZfYmFja2VuZF9kYXRhfSBzdHJ1Y3R1cmUuCi0KLUkgd2lsbCBub3QgZGVmaW5lIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzIGhlcmU7IHNlZSB0aGUKLWNvbW1lbnRzIGluIEBmaWxle2VsZi1iZmQuaH0uCi0KLU5vcm1hbGx5IGFueSBvZGQgY2hhcmFjdGVyaXN0aWMgb2YgYSBwYXJ0aWN1bGFyIEVMRiBwcm9jZXNzb3IgaXMgaGFuZGxlZAotdmlhIGEgaG9vayBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCB0aGUgc3BlY2lhbCBAc2FtcHtTSE5fTUlQU19TQ09NTU9OfQotc2VjdGlvbiBudW1iZXIgZm91bmQgaW4gTUlQUyBFTEYgaXMgaGFuZGxlZCB2aWEgdGhlIGhvb2tzCi1Ac2FtcHtzZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb259LCBAc2FtcHtzeW1ib2xfcHJvY2Vzc2luZ30sCi1Ac2FtcHthZGRfc3ltYm9sX2hvb2t9LCBhbmQgQHNhbXB7b3V0cHV0X3N5bWJvbF9ob29rfS4KLQotRHluYW1pYyBsaW5raW5nIHN1cHBvcnQsIHdoaWNoIGludm9sdmVzIHByb2Nlc3NvciBzcGVjaWZpYyByZWxvY2F0aW9ucwotcmVxdWlyaW5nIHNwZWNpYWwgaGFuZGxpbmcsIGlzIGFsc28gaW1wbGVtZW50ZWQgdmlhIGhvb2sgZnVuY3Rpb25zLgotCi1Abm9kZSBCRkQgRUxGIGNvcmUgZmlsZXMKLUBzdWJzZWN0aW9uIEJGRCBFTEYgY29yZSBmaWxlcwotQGNpbmRleCBlbGYgY29yZSBmaWxlcwotCi1PbiBuYXRpdmUgRUxGIFVuaXggc3lzdGVtcywgY29yZSBmaWxlcyBhcmUgZ2VuZXJhdGVkIHdpdGhvdXQgYW55Ci1zZWN0aW9ucy4gIEluc3RlYWQsIHRoZXkgb25seSBoYXZlIHByb2dyYW0gc2VnbWVudHMuCi0KLVdoZW4gQkZEIGlzIHVzZWQgdG8gcmVhZCBhbiBFTEYgY29yZSBmaWxlLCB0aGUgQkZEIHNlY3Rpb25zIHdpbGwKLWFjdHVhbGx5IHJlcHJlc2VudCBwcm9ncmFtIHNlZ21lbnRzLiAgU2luY2UgRUxGIHByb2dyYW0gc2VnbWVudHMgZG8gbm90Ci1oYXZlIG5hbWVzLCBCRkQgd2lsbCBpbnZlbnQgbmFtZXMgbGlrZSBAc2FtcHtzZWdtZW50QHZhcntufX0gd2hlcmUKLUB2YXJ7bn0gaXMgYSBudW1iZXIuCi0KLUEgc2luZ2xlIEVMRiBwcm9ncmFtIHNlZ21lbnQgbWF5IGluY2x1ZGUgYm90aCBhbiBpbml0aWFsaXplZCBwYXJ0IGFuZCBhbgotdW5pbml0aWFsaXplZCBwYXJ0LiAgVGhlIHNpemUgb2YgdGhlIGluaXRpYWxpemVkIHBhcnQgaXMgZ2l2ZW4gYnkgdGhlCi1Ac2FtcHtwX2ZpbGVzen0gZmllbGQuICBUaGUgdG90YWwgc2l6ZSBvZiB0aGUgc2VnbWVudCBpcyBnaXZlbiBieSB0aGUKLUBzYW1we3BfbWVtc3p9IGZpZWxkLiAgSWYgQHNhbXB7cF9tZW1zen0gaXMgbGFyZ2VyIHRoYW4gQHNhbXB7cF9maWxlc3p9LAotdGhlbiB0aGUgZXh0cmEgc3BhY2UgaXMgdW5pbml0aWFsaXplZCwgb3IsIG1vcmUgcHJlY2lzZWx5LCBpbml0aWFsaXplZAotdG8gemVyby4KLQotQkZEIHdpbGwgcmVwcmVzZW50IHN1Y2ggYSBwcm9ncmFtIHNlZ21lbnQgYXMgdHdvIGRpZmZlcmVudCBzZWN0aW9ucy4KLVRoZSBmaXJzdCwgbmFtZWQgQHNhbXB7c2VnbWVudEB2YXJ7bn1hfSwgd2lsbCByZXByZXNlbnQgdGhlIGluaXRpYWxpemVkCi1wYXJ0IG9mIHRoZSBwcm9ncmFtIHNlZ21lbnQuICBUaGUgc2Vjb25kLCBuYW1lZCBAc2FtcHtzZWdtZW50QHZhcntufWJ9LAotd2lsbCByZXByZXNlbnQgdGhlIHVuaW5pdGlhbGl6ZWQgcGFydC4KLQotRUxGIGNvcmUgZmlsZXMgc3RvcmUgc3BlY2lhbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlZ2lzdGVyIHZhbHVlcyBpbgotcHJvZ3JhbSBzZWdtZW50cyB3aXRoIHRoZSB0eXBlIEBzYW1we1BUX05PVEV9LiAgQkZEIHdpbGwgYXR0ZW1wdCB0bwotaW50ZXJwcmV0IHRoZSBpbmZvcm1hdGlvbiBpbiB0aGVzZSBzZWdtZW50cywgYW5kIHdpbGwgY3JlYXRlIGFkZGl0aW9uYWwKLXNlY3Rpb25zIGhvbGRpbmcgdGhlIGluZm9ybWF0aW9uLiAgU29tZSBvZiB0aGlzIGludGVycHJldGF0aW9uIHJlcXVpcmVzCi1pbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUgaG9zdCBoZWFkZXIgZmlsZSBAZmlsZXtzeXMvcHJvY2ZzLmh9LCBhbmQgc28KLXdpbGwgb25seSB3b3JrIHdoZW4gQkZEIGlzIGJ1aWx0IG9uIGEgbmF0aXZlIHN5c3RlbS4KLQotQkZEIGRvZXMgbm90IGN1cnJlbnRseSBwcm92aWRlIGFueSB3YXkgdG8gY3JlYXRlIGFuIEVMRiBjb3JlIGZpbGUuICBJbgotZ2VuZXJhbCwgQkZEIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gY3JlYXRlIGNvcmUgZmlsZXMuICBUaGUgd2F5IHRvCi1pbXBsZW1lbnQgdGhpcyB3b3VsZCBiZSB0byB3cml0ZSBAc2FtcHtiZmRfc2V0X2Zvcm1hdH0gYW5kCi1Ac2FtcHtiZmRfd3JpdGVfY29udGVudHN9IHJvdXRpbmVzIGZvciB0aGUgQHNhbXB7YmZkX2NvcmV9IHR5cGU7IHNlZQotQHJlZntCRkQgdGFyZ2V0IHZlY3RvciBmb3JtYXR9LgotCi1Abm9kZSBCRkQgRUxGIGZ1dHVyZQotQHN1YnNlY3Rpb24gQkZEIEVMRiBmdXR1cmUKLQotVGhlIGN1cnJlbnQgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQgaGFzIHRvbyBtdWNoIGNvZGUgZHVwbGljYXRpb24uCi1XaGlsZSBlYWNoIHByb2Nlc3NvciBoYXMgcGFydGljdWxhciBkaWZmZXJlbmNlcywgbXVjaCBvZiB0aGUgZHluYW1pYwotbGlua2luZyBzdXBwb3J0IGlzIHF1aXRlIHNpbWlsYXIgZm9yIGVhY2ggcHJvY2Vzc29yLiAgVGhlIEdPVCBhbmQgUExUCi1hcmUgaGFuZGxlZCBpbiBmYWlybHkgc2ltaWxhciB3YXlzLCB0aGUgZGV0YWlscyBvZiAtQnN5bWJvbGljIGxpbmtpbmcKLWFyZSBnZW5lcmFsbHkgc2ltaWxhciwgZXRjLiAgVGhpcyBjb2RlIHNob3VsZCBiZSByZXdvcmtlZCB0byB1c2UgbW9yZQotZ2VuZXJpYyBmdW5jdGlvbnMsIGVsaW1pbmF0aW5nIHRoZSBkdXBsaWNhdGlvbi4KLQotU2ltaWxhcmx5LCB0aGUgcmVsb2NhdGlvbiBoYW5kbGluZyBoYXMgdG9vIG11Y2ggZHVwbGljYXRpb24uICBNYW55IG9mCi10aGUgQHNhbXB7cmVsb2NfdHlwZV9sb29rdXB9IGFuZCBAc2FtcHtpbmZvX3RvX2hvd3RvfSBmdW5jdGlvbnMgYXJlCi1xdWl0ZSBzaW1pbGFyLiAgVGhlIHJlbG9jYXRlIHNlY3Rpb24gZnVuY3Rpb25zIGFyZSBhbHNvIG9mdGVuIHF1aXRlCi1zaW1pbGFyLCBib3RoIGluIHRoZSBzdGFuZGFyZCBsaW5rZXIgaGFuZGxpbmcgYW5kIHRoZSBkeW5hbWljIGxpbmtlcgotaGFuZGxpbmcuICBNYW55IG9mIHRoZSBDT0ZGIHByb2Nlc3NvciBzcGVjaWZpYyBiYWNrZW5kcyBzaGFyZSBhIHNpbmdsZQotcmVsb2NhdGUgc2VjdGlvbiBmdW5jdGlvbiAoQHNhbXB7X2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbn0pLAotYW5kIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzIGZvciB0aGUgRUxGIHRhcmdldHMKLWFzIHdlbGwuCi0KLVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgbWFnaWMgbnVtYmVyIGluCi1Ac2FtcHtwcmVwX2hlYWRlcnN9IGluIEBmaWxle2VsZi5jfSBpcyBzb21ld2hhdCBib2d1cy4gIEl0IHNob3VsZCBiZQotcG9zc2libGUgdG8gYWRkIHN1cHBvcnQgZm9yIGEgbmV3IHByb2Nlc3NvciB3aXRob3V0IGNoYW5naW5nIHRoZSBnZW5lcmljCi1zdXBwb3J0LgotCi1UaGUgcHJvY2Vzc29yIGZ1bmN0aW9uIGhvb2tzIGFuZCBjb25zdGFudHMgYXJlIGFkIGhvYyBhbmQgbmVlZCBiZXR0ZXIKLWRvY3VtZW50YXRpb24uCi0KLVdoZW4gYSBsaW5rZXIgc2NyaXB0IHVzZXMgQHNhbXB7U0laRU9GX0hFQURFUlN9LCB0aGUgRUxGIGJhY2tlbmQgbXVzdAotZ3Vlc3MgYXQgdGhlIG51bWJlciBvZiBwcm9ncmFtIHNlZ21lbnRzIHdoaWNoIHdpbGwgYmUgcmVxdWlyZWQsIGluCi1Ac2FtcHtnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZX0uICBUaGlzIGlzIGJlY2F1c2UgdGhlIGxpbmtlciBjYWxscwotQHNhbXB7YmZkX3NpemVvZl9oZWFkZXJzfSBiZWZvcmUgaXQga25vd3MgYWxsIHRoZSBzZWN0aW9uIGFkZHJlc3NlcyBhbmQKLXNpemVzLiAgVGhlIEVMRiBiYWNrZW5kIG1heSBsYXRlciBkaXNjb3Zlciwgd2hlbiBjcmVhdGluZyBwcm9ncmFtCi1zZWdtZW50cywgdGhhdCBtb3JlIHByb2dyYW0gc2VnbWVudHMgYXJlIHJlcXVpcmVkLiAgVGhpcyBpcyBjdXJyZW50bHkKLXJlcG9ydGVkIGFzIGFuIGVycm9yIGluIEBzYW1we2Fzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHN9LgotCi1JbiBwcmFjdGljZSB0aGlzIG1ha2VzIGl0IGRpZmZpY3VsdCB0byB1c2UgQHNhbXB7U0laRU9GX0hFQURFUlN9IGV4Y2VwdAotd2l0aCBhIGNhcmVmdWxseSBkZWZpbmVkIGxpbmtlciBzY3JpcHQuICBVbmZvcnR1bmF0ZWx5LAotQHNhbXB7U0laRU9GX0hFQURFUlN9IGlzIHJlcXVpcmVkIGZvciBmYXN0IHByb2dyYW0gbG9hZGluZyBvbiBhIG5hdGl2ZQotc3lzdGVtLCBzaW5jZSBpdCBwZXJtaXRzIHRoZSBpbml0aWFsIGNvZGUgc2VjdGlvbiB0byBhcHBlYXIgb24gdGhlIHNhbWUKLXBhZ2UgYXMgdGhlIHByb2dyYW0gc2VnbWVudHMsIHNhdmluZyBhIHBhZ2UgcmVhZCB3aGVuIHRoZSBwcm9ncmFtIHN0YXJ0cwotcnVubmluZy4gIEZvcnR1bmF0ZWx5LCBuYXRpdmUgc3lzdGVtcyBwZXJtaXQgY2FyZWZ1bCBkZWZpbml0aW9uIG9mIHRoZQotbGlua2VyIHNjcmlwdC4gIFN0aWxsLCBpZGVhbGx5IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSByZWxheGF0aW9uIHRvCi1jb21wdXRlIHRoZSBudW1iZXIgb2YgcHJvZ3JhbSBzZWdtZW50cy4KLQotQG5vZGUgQkZEIGdsb3NzYXJ5Ci1Ac2VjdGlvbiBCRkQgZ2xvc3NhcnkKLUBjaW5kZXggZ2xvc3NhcnkgZm9yIGJmZAotQGNpbmRleCBiZmQgZ2xvc3NhcnkKLQotVGhpcyBpcyBhIHNob3J0IGdsb3NzYXJ5IG9mIHNvbWUgQkZEIHRlcm1zLgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIGEub3V0Ci1UaGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlIG9yaWdpbmFsIFVuaXggb2JqZWN0IGZpbGUgZm9ybWF0LgotU3RpbGwgdXNlZCBvbiBTdW5PUywgdGhvdWdoIG5vdCBTb2xhcmlzLiAgU3VwcG9ydHMgb25seSB0aHJlZSBzZWN0aW9ucy4KLQotQGl0ZW0gYXJjaGl2ZQotQSBjb2xsZWN0aW9uIG9mIG9iamVjdCBmaWxlcyBwcm9kdWNlZCBhbmQgbWFuaXB1bGF0ZWQgYnkgdGhlIEBzYW1we2FyfQotcHJvZ3JhbS4KLQotQGl0ZW0gYmFja2VuZAotVGhlIGltcGxlbWVudGF0aW9uIHdpdGhpbiBCRkQgb2YgYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZQotc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBhcHBlYXIgaW4gYSBwYXJ0aWN1bGFyIHRhcmdldCB2ZWN0b3IuCi0KLUBpdGVtIEJGRAotVGhlIEJGRCBsaWJyYXJ5IGl0c2VsZi4gIEFsc28sIGVhY2ggb2JqZWN0IGZpbGUsIGFyY2hpdmUsIG9yIGV4ZWN0YWJsZQotb3BlbmVkIGJ5IHRoZSBCRkQgbGlicmFyeSBoYXMgdGhlIHR5cGUgQHNhbXB7YmZkICp9LCBhbmQgaXMgc29tZXRpbWVzCi1yZWZlcnJlZCB0byBhcyBhIGJmZC4KLQotQGl0ZW0gQ09GRgotVGhlIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQuICBVc2VkIG9uIFVuaXggU1ZSMy4gIFVzZWQgYnkgc29tZQotZW1iZWRkZWQgdGFyZ2V0cywgYWx0aG91Z2ggRUxGIGlzIG5vcm1hbGx5IGJldHRlci4KLQotQGl0ZW0gRExMCi1BIHNoYXJlZCBsaWJyYXJ5IG9uIFdpbmRvd3MuCi0KLUBpdGVtIGR5bmFtaWMgbGlua2VyCi1XaGVuIGEgcHJvZ3JhbSBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IGlzIHJ1biwgdGhlIGR5bmFtaWMKLWxpbmtlciB3aWxsIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgc2hhcmVkIGxpYnJhcnkgYW5kIGFycmFuZ2UgdG8gc29tZWhvdwotaW5jbHVkZSBpdCBpbiB0aGUgcnVubmluZyBpbWFnZS4KLQotQGl0ZW0gZHluYW1pYyBvYmplY3QKLUFub3RoZXIgbmFtZSBmb3IgYW4gRUxGIHNoYXJlZCBsaWJyYXJ5LgotCi1AaXRlbSBFQ09GRgotVGhlIEV4dGVuZGVkIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQuICBVc2VkIG9uIEFscGhhIERpZ2l0YWwgVW5peAotKGZvcm1lcmx5IE9TRi8xKSwgYXMgd2VsbCBhcyBVbHRyaXggYW5kIElyaXggNC4gIEEgdmFyaWFudCBvZiBDT0ZGLgotCi1AaXRlbSBFTEYKLVRoZSBFeGVjdXRhYmxlIGFuZCBMaW5raW5nIEZvcm1hdC4gIFRoZSBvYmplY3QgZmlsZSBmb3JtYXQgdXNlZCBvbiBtb3N0Ci1tb2Rlcm4gVW5peCBzeXN0ZW1zLCBpbmNsdWRpbmcgR05VL0xpbnV4LCBTb2xhcmlzLCBJcml4LCBhbmQgU1ZSNC4gIEFsc28KLXVzZWQgb24gbWFueSBlbWJlZGRlZCBzeXN0ZW1zLgotCi1AaXRlbSBleGVjdXRhYmxlCi1BIHByb2dyYW0sIHdpdGggaW5zdHJ1Y3Rpb25zIGFuZCBzeW1ib2xzLCBhbmQgcGVyaGFwcyBkeW5hbWljIGxpbmtpbmcKLWluZm9ybWF0aW9uLiAgTm9ybWFsbHkgcHJvZHVjZWQgYnkgYSBsaW5rZXIuCi0KLUBpdGVtIExNQQotTG9hZCBNZW1vcnkgQWRkcmVzcy4gIFRoaXMgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggYSBzZWN0aW9uIHdpbGwgYmUKLWxvYWRlZC4gIENvbXBhcmUgd2l0aCBWTUEsIGJlbG93LgotCi1AaXRlbSBOTE0KLU5ldFdhcmUgTG9hZGFibGUgTW9kdWxlLiAgVXNlZCB0byBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIGFuIG9iamVjdCB3aGljaAotYmUgbG9hZGVkIGludG8gTmV0V2FyZSwgd2hpY2ggaXMgc29tZSBraW5kIG9mIFBDIGJhc2VkIG5ldHdvcmsgc2VydmVyCi1wcm9ncmFtLgotCi1AaXRlbSBvYmplY3QgZmlsZQotQSBiaW5hcnkgZmlsZSBpbmNsdWRpbmcgbWFjaGluZSBpbnN0cnVjdGlvbnMsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uCi1pbmZvcm1hdGlvbi4gIE5vcm1hbGx5IHByb2R1Y2VkIGJ5IGFuIGFzc2VtYmxlci4KLQotQGl0ZW0gb2JqZWN0IGZpbGUgZm9ybWF0Ci1UaGUgZm9ybWF0IG9mIGFuIG9iamVjdCBmaWxlLiAgVHlwaWNhbGx5IG9iamVjdCBmaWxlcyBhbmQgZXhlY3V0YWJsZXMKLWZvciBhIHBhcnRpY3VsYXIgc3lzdGVtIGFyZSBpbiB0aGUgc2FtZSBmb3JtYXQsIGFsdGhvdWdoIGV4ZWN1dGFibGVzCi13aWxsIG5vdCBjb250YWluIGFueSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotCi1AaXRlbSBQRQotVGhlIFBvcnRhYmxlIEV4ZWN1dGFibGUgZm9ybWF0LiAgVGhpcyBpcyB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IHVzZWQgZm9yCi1XaW5kb3dzIChzcGVjaWZpY2FsbHksIFdpbjMyKSBvYmplY3QgZmlsZXMuICBJdCBpcyBiYXNlZCBjbG9zZWx5IG9uCi1DT0ZGLCBidXQgaGFzIGEgZmV3IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzLgotCi1AaXRlbSBQRUkKLVRoZSBQb3J0YWJsZSBFeGVjdXRhYmxlIEltYWdlIGZvcm1hdC4gIFRoaXMgaXMgdGhlIG9iamVjdCBmaWxlIGZvcm1hdAotdXNlZCBmb3IgV2luZG93cyAoc3BlY2lmaWNhbGx5LCBXaW4zMikgZXhlY3V0YWJsZXMuICBJdCBpcyB2ZXJ5IHNpbWlsYXIKLXRvIFBFLCBidXQgaW5jbHVkZXMgc29tZSBhZGRpdGlvbmFsIGhlYWRlciBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gcmVsb2NhdGlvbnMKLUluZm9ybWF0aW9uIHVzZWQgYnkgdGhlIGxpbmtlciB0byBhZGp1c3Qgc2VjdGlvbiBjb250ZW50cy4gIEFsc28gY2FsbGVkCi1yZWxvY3MuCi0KLUBpdGVtIHNlY3Rpb24KLU9iamVjdCBmaWxlcyBhbmQgZXhlY3V0YWJsZSBhcmUgY29tcG9zZWQgb2Ygc2VjdGlvbnMuICBTZWN0aW9ucyBoYXZlCi1vcHRpb25hbCBkYXRhIGFuZCBvcHRpb25hbCByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotCi1AaXRlbSBzaGFyZWQgbGlicmFyeQotQSBsaWJyYXJ5IG9mIGZ1bmN0aW9ucyB3aGljaCBtYXkgYmUgdXNlZCBieSBtYW55IGV4ZWN1dGFibGVzIHdpdGhvdXQKLWFjdHVhbGx5IGJlaW5nIGxpbmtlZCBpbnRvIGVhY2ggZXhlY3V0YWJsZS4gIFRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudAotaW1wbGVtZW50YXRpb25zIG9mIHNoYXJlZCBsaWJyYXJpZXMsIGVhY2ggaGF2aW5nIHNsaWdodGx5IGRpZmZlcmVudAotZmVhdHVyZXMuCi0KLUBpdGVtIHN5bWJvbAotRWFjaCBvYmplY3QgZmlsZSBhbmQgZXhlY3V0YWJsZSBtYXkgaGF2ZSBhIGxpc3Qgb2Ygc3ltYm9scywgb2Z0ZW4KLXJlZmVycmVkIHRvIGFzIHRoZSBzeW1ib2wgdGFibGUuICBBIHN5bWJvbCBpcyBiYXNpY2FsbHkgYSBuYW1lIGFuZCBhbgotYWRkcmVzcy4gIFRoZXJlIG1heSBhbHNvIGJlIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBsaWtlIHRoZSB0eXBlIG9mCi1zeW1ib2wsIGFsdGhvdWdoIHRoZSB0eXBlIG9mIGEgc3ltYm9sIGlzIG5vcm1hbGx5IHNvbWV0aGluZyBzaW1wbGUgbGlrZQotZnVuY3Rpb24gb3Igb2JqZWN0LCBhbmQgc2hvdWxkIGJlIGNvbmZ1c2VkIHdpdGggdGhlIG1vcmUgY29tcGxleCBDCi1ub3Rpb24gb2YgdHlwZS4gIFR5cGljYWxseSBldmVyeSBnbG9iYWwgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGluIGEgQwotcHJvZ3JhbSB3aWxsIGhhdmUgYW4gYXNzb2NpYXRlZCBzeW1ib2wuCi0KLUBpdGVtIHRhcmdldCB2ZWN0b3IKLUEgc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlCi1mb3JtYXQuICBUaGUgQHNhbXB7YmZkX3RhcmdldH0gc3RydWN0dXJlLgotCi1AaXRlbSBXaW4zMgotVGhlIGN1cnJlbnQgV2luZG93cyBBUEksIGltcGxlbWVudGVkIGJ5IFdpbmRvd3MgOTUgYW5kIGxhdGVyIGFuZCBXaW5kb3dzCi1OVCAzLjUxIGFuZCBsYXRlciwgYnV0IG5vdCBieSBXaW5kb3dzIDMuMS4KLQotQGl0ZW0gWENPRkYKLVRoZSBlWHRlbmRlZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0LiAgVXNlZCBvbiBBSVguICBBIHZhcmlhbnQgb2YKLUNPRkYsIHdpdGggYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzeW1ib2wgdGFibGUgaW1wbGVtZW50YXRpb24uCi0KLUBpdGVtIFZNQQotVmlydHVhbCBNZW1vcnkgQWRkcmVzcy4gIFRoaXMgaXMgdGhlIGFkZHJlc3MgYSBzZWN0aW9uIHdpbGwgaGF2ZSB3aGVuCi1hbiBleGVjdXRhYmxlIGlzIHJ1bi4gIENvbXBhcmUgd2l0aCBMTUEsIGFib3ZlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmRleAotQHVubnVtYmVyZWRzZWMgSW5kZXgKLUBwcmludGluZGV4IGNwCi0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9iZmRzdW1tLnRleGkgYi9iZmQvZG9jL2JmZHN1bW0udGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0NTMxYS4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL2JmZHN1bW0udGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi1AYyBUaGlzIHN1bW1hcnkgb2YgQkZEIGlzIHNoYXJlZCBieSB0aGUgQkZEIGFuZCBMRCBkb2NzLgotV2hlbiBhbiBvYmplY3QgZmlsZSBpcyBvcGVuZWQsIEJGRCBzdWJyb3V0aW5lcyBhdXRvbWF0aWNhbGx5IGRldGVybWluZQotdGhlIGZvcm1hdCBvZiB0aGUgaW5wdXQgb2JqZWN0IGZpbGUuICBUaGV5IHRoZW4gYnVpbGQgYSBkZXNjcmlwdG9yIGluCi1tZW1vcnkgd2l0aCBwb2ludGVycyB0byByb3V0aW5lcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBhY2Nlc3MgZWxlbWVudHMgb2YKLXRoZSBvYmplY3QgZmlsZSdzIGRhdGEgc3RydWN0dXJlcy4KLQotQXMgZGlmZmVyZW50IGluZm9ybWF0aW9uIGZyb20gdGhlIHRoZSBvYmplY3QgZmlsZXMgaXMgcmVxdWlyZWQsCi1CRkQgcmVhZHMgZnJvbSBkaWZmZXJlbnQgc2VjdGlvbnMgb2YgdGhlIGZpbGUgYW5kIHByb2Nlc3NlcyB0aGVtLgotRm9yIGV4YW1wbGUsIGEgdmVyeSBjb21tb24gb3BlcmF0aW9uIGZvciB0aGUgbGlua2VyIGlzIHByb2Nlc3Npbmcgc3ltYm9sCi10YWJsZXMuICBFYWNoIEJGRCBiYWNrIGVuZCBwcm92aWRlcyBhIHJvdXRpbmUgZm9yIGNvbnZlcnRpbmcKLWJldHdlZW4gdGhlIG9iamVjdCBmaWxlJ3MgcmVwcmVzZW50YXRpb24gb2Ygc3ltYm9scyBhbmQgYW4gaW50ZXJuYWwKLWNhbm9uaWNhbCBmb3JtYXQuIFdoZW4gdGhlIGxpbmtlciBhc2tzIGZvciB0aGUgc3ltYm9sIHRhYmxlIG9mIGFuIG9iamVjdAotZmlsZSwgaXQgY2FsbHMgdGhyb3VnaCBhIG1lbW9yeSBwb2ludGVyIHRvIHRoZSByb3V0aW5lIGZyb20gdGhlCi1yZWxldmFudCBCRkQgYmFjayBlbmQgd2hpY2ggcmVhZHMgYW5kIGNvbnZlcnRzIHRoZSB0YWJsZSBpbnRvIGEgY2Fub25pY2FsCi1mb3JtLiAgVGhlIGxpbmtlciB0aGVuIG9wZXJhdGVzIHVwb24gdGhlIGNhbm9uaWNhbCBmb3JtLiBXaGVuIHRoZSBsaW5rIGlzCi1maW5pc2hlZCBhbmQgdGhlIGxpbmtlciB3cml0ZXMgdGhlIG91dHB1dCBmaWxlJ3Mgc3ltYm9sIHRhYmxlLAotYW5vdGhlciBCRkQgYmFjayBlbmQgcm91dGluZSBpcyBjYWxsZWQgdG8gdGFrZSB0aGUgbmV3bHkKLWNyZWF0ZWQgc3ltYm9sIHRhYmxlIGFuZCBjb252ZXJ0IGl0IGludG8gdGhlIGNob3NlbiBvdXRwdXQgZm9ybWF0LgotCi1AbWVudQotKiBCRkQgaW5mb3JtYXRpb24gbG9zczo6CUluZm9ybWF0aW9uIExvc3MKLSogQ2Fub25pY2FsIGZvcm1hdDo6CQlUaGUgQkZECWNhbm9uaWNhbCBvYmplY3QtZmlsZSBmb3JtYXQgCi1AZW5kIG1lbnUKLQotQG5vZGUgQkZEIGluZm9ybWF0aW9uIGxvc3MKLUBzdWJzZWN0aW9uIEluZm9ybWF0aW9uIExvc3MKLQotQGVtcGh7SW5mb3JtYXRpb24gY2FuIGJlIGxvc3QgZHVyaW5nIG91dHB1dC59IFRoZSBvdXRwdXQgZm9ybWF0cwotc3VwcG9ydGVkIGJ5IEJGRCBkbyBub3QgcHJvdmlkZSBpZGVudGljYWwgZmFjaWxpdGllcywgYW5kCi1pbmZvcm1hdGlvbiB3aGljaCBjYW4gYmUgZGVzY3JpYmVkIGluIG9uZSBmb3JtIGhhcyBub3doZXJlIHRvIGdvIGluCi1hbm90aGVyIGZvcm1hdC4gT25lIGV4YW1wbGUgb2YgdGhpcyBpcyBhbGlnbm1lbnQgaW5mb3JtYXRpb24gaW4KLUBjb2Rle2Iub3V0fS4gVGhlcmUgaXMgbm93aGVyZSBpbiBhbiBAY29kZXthLm91dH0gZm9ybWF0IGZpbGUgdG8gc3RvcmUKLWFsaWdubWVudCBpbmZvcm1hdGlvbiBvbiB0aGUgY29udGFpbmVkIGRhdGEsIHNvIHdoZW4gYSBmaWxlIGlzIGxpbmtlZAotZnJvbSBAY29kZXtiLm91dH0gYW5kIGFuIEBjb2Rle2Eub3V0fSBpbWFnZSBpcyBwcm9kdWNlZCwgYWxpZ25tZW50Ci1pbmZvcm1hdGlvbiB3aWxsIG5vdCBwcm9wYWdhdGUgdG8gdGhlIG91dHB1dCBmaWxlLiAoVGhlIGxpbmtlciB3aWxsCi1zdGlsbCB1c2UgdGhlIGFsaWdubWVudCBpbmZvcm1hdGlvbiBpbnRlcm5hbGx5LCBzbyB0aGUgbGluayBpcyBwZXJmb3JtZWQKLWNvcnJlY3RseSkuCi0KLUFub3RoZXIgZXhhbXBsZSBpcyBDT0ZGIHNlY3Rpb24gbmFtZXMuIENPRkYgZmlsZXMgbWF5IGNvbnRhaW4gYW4KLXVubGltaXRlZCBudW1iZXIgb2Ygc2VjdGlvbnMsIGVhY2ggb25lIHdpdGggYSB0ZXh0dWFsIHNlY3Rpb24gbmFtZS4gSWYKLXRoZSB0YXJnZXQgb2YgdGhlIGxpbmsgaXMgYSBmb3JtYXQgd2hpY2ggZG9lcyBub3QgaGF2ZSBtYW55IHNlY3Rpb25zIChlLmcuLAotQGNvZGV7YS5vdXR9KSBvciBoYXMgc2VjdGlvbnMgd2l0aG91dCBuYW1lcyAoZS5nLiwgdGhlIE9hc3lzIGZvcm1hdCksIHRoZQotbGluayBjYW5ub3QgYmUgZG9uZSBzaW1wbHkuIFlvdSBjYW4gY2lyY3VtdmVudCB0aGlzIHByb2JsZW0gYnkKLWRlc2NyaWJpbmcgdGhlIGRlc2lyZWQgaW5wdXQtdG8tb3V0cHV0IHNlY3Rpb24gbWFwcGluZyB3aXRoIHRoZSBsaW5rZXIgY29tbWFuZAotbGFuZ3VhZ2UuCi0KLUBlbXBoe0luZm9ybWF0aW9uIGNhbiBiZSBsb3N0IGR1cmluZyBjYW5vbmljYWxpemF0aW9uLn0gVGhlIEJGRAotaW50ZXJuYWwgY2Fub25pY2FsIGZvcm0gb2YgdGhlIGV4dGVybmFsIGZvcm1hdHMgaXMgbm90IGV4aGF1c3RpdmU7IHRoZXJlCi1hcmUgc3RydWN0dXJlcyBpbiBpbnB1dCBmb3JtYXRzIGZvciB3aGljaCB0aGVyZSBpcyBubyBkaXJlY3QKLXJlcHJlc2VudGF0aW9uIGludGVybmFsbHkuICBUaGlzIG1lYW5zIHRoYXQgdGhlIEJGRCBiYWNrIGVuZHMKLWNhbm5vdCBtYWludGFpbiBhbGwgcG9zc2libGUgZGF0YSByaWNobmVzcyB0aHJvdWdoIHRoZSB0cmFuc2Zvcm1hdGlvbgotYmV0d2VlbiBleHRlcm5hbCB0byBpbnRlcm5hbCBhbmQgYmFjayB0byBleHRlcm5hbCBmb3JtYXRzLgotCi1UaGlzIGxpbWl0YXRpb24gaXMgb25seSBhIHByb2JsZW0gd2hlbiBhbiBhcHBsaWNhdGlvbiByZWFkcyBvbmUKLWZvcm1hdCBhbmQgd3JpdGVzIGFub3RoZXIuICBFYWNoIEJGRCBiYWNrIGVuZCBpcyByZXNwb25zaWJsZSBmb3IKLW1haW50YWluaW5nIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHRoZSBpbnRlcm5hbCBCRkQKLWNhbm9uaWNhbCBmb3JtIGhhcyBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSBvcGFxdWUgdG8gdGhlIEJGRCBjb3JlLAotYW5kIGV4cG9ydGVkIG9ubHkgdG8gdGhlIGJhY2sgZW5kcy4gV2hlbiBhIGZpbGUgaXMgcmVhZCBpbiBvbmUgZm9ybWF0LAotdGhlIGNhbm9uaWNhbCBmb3JtIGlzIGdlbmVyYXRlZCBmb3IgQkZEIGFuZCB0aGUgYXBwbGljYXRpb24uIEF0IHRoZQotc2FtZSB0aW1lLCB0aGUgYmFjayBlbmQgc2F2ZXMgYXdheSBhbnkgaW5mb3JtYXRpb24gd2hpY2ggbWF5IG90aGVyd2lzZQotYmUgbG9zdC4gSWYgdGhlIGRhdGEgaXMgdGhlbiB3cml0dGVuIGJhY2sgaW4gdGhlIHNhbWUgZm9ybWF0LCB0aGUgYmFjawotZW5kIHJvdXRpbmUgd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgY2Fub25pY2FsIGZvcm0gcHJvdmlkZWQgYnkgdGhlCi1CRkQgY29yZSBhcyB3ZWxsIGFzIHRoZSBpbmZvcm1hdGlvbiBpdCBwcmVwYXJlZCBlYXJsaWVyLiAgU2luY2UKLXRoZXJlIGlzIGEgZ3JlYXQgZGVhbCBvZiBjb21tb25hbGl0eSBiZXR3ZWVuIGJhY2sgZW5kcywKLXRoZXJlIGlzIG5vIGluZm9ybWF0aW9uIGxvc3Qgd2hlbgotbGlua2luZyBvciBjb3B5aW5nIGJpZyBlbmRpYW4gQ09GRiB0byBsaXR0bGUgZW5kaWFuIENPRkYsIG9yIEBjb2Rle2Eub3V0fSB0bwotQGNvZGV7Yi5vdXR9LiAgV2hlbiBhIG1peHR1cmUgb2YgZm9ybWF0cyBpcyBsaW5rZWQsIHRoZSBpbmZvcm1hdGlvbiBpcwotb25seSBsb3N0IGZyb20gdGhlIGZpbGVzIHdob3NlIGZvcm1hdCBkaWZmZXJzIGZyb20gdGhlIGRlc3RpbmF0aW9uLgotCi1Abm9kZSBDYW5vbmljYWwgZm9ybWF0Ci1Ac3Vic2VjdGlvbiBUaGUgQkZEIGNhbm9uaWNhbCBvYmplY3QtZmlsZSBmb3JtYXQKLQotVGhlIGdyZWF0ZXN0IHBvdGVudGlhbCBmb3IgbG9zcyBvZiBpbmZvcm1hdGlvbiBvY2N1cnMgd2hlbiB0aGVyZSBpcyB0aGUgbGVhc3QKLW92ZXJsYXAgYmV0d2VlbiB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSBmb3JtYXQsIHRoYXQKLXN0b3JlZCBieSB0aGUgY2Fub25pY2FsIGZvcm1hdCwgYW5kIHRoYXQgbmVlZGVkIGJ5IHRoZQotZGVzdGluYXRpb24gZm9ybWF0LiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBjYW5vbmljYWwgZm9ybSBtYXkgaGVscAoteW91IHVuZGVyc3RhbmQgd2hpY2gga2luZHMgb2YgZGF0YSB5b3UgY2FuIGNvdW50IG9uIHByZXNlcnZpbmcgYWNyb3NzCi1jb252ZXJzaW9ucy4KLUBjaW5kZXggQkZEIGNhbm9uaWNhbCBmb3JtYXQKLUBjaW5kZXggaW50ZXJuYWwgb2JqZWN0LWZpbGUgZm9ybWF0Ci0KLUB0YWJsZSBAZW1waAotQGl0ZW0gZmlsZXMKLUluZm9ybWF0aW9uIHN0b3JlZCBvbiBhIHBlci1maWxlIGJhc2lzIGluY2x1ZGVzIHRhcmdldCBtYWNoaW5lCi1hcmNoaXRlY3R1cmUsIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gZm9ybWF0IHR5cGUsIGEgZGVtYW5kIHBhZ2VhYmxlCi1iaXQsIGFuZCBhIHdyaXRlIHByb3RlY3RlZCBiaXQuICBJbmZvcm1hdGlvbiBsaWtlIFVuaXggbWFnaWMgbnVtYmVycyBpcwotbm90IHN0b3JlZCBoZXJlLS0tb25seSB0aGUgbWFnaWMgbnVtYmVycycgbWVhbmluZywgc28gYSBAY29kZXtaTUFHSUN9Ci1maWxlIHdvdWxkIGhhdmUgYm90aCB0aGUgZGVtYW5kIHBhZ2VhYmxlIGJpdCBhbmQgdGhlIHdyaXRlIHByb3RlY3RlZAotdGV4dCBiaXQgc2V0LiAgVGhlIGJ5dGUgb3JkZXIgb2YgdGhlIHRhcmdldCBpcyBzdG9yZWQgb24gYSBwZXItZmlsZQotYmFzaXMsIHNvIHRoYXQgYmlnLSBhbmQgbGl0dGxlLWVuZGlhbiBvYmplY3QgZmlsZXMgbWF5IGJlIHVzZWQgd2l0aCBvbmUKLWFub3RoZXIuCi0KLUBpdGVtIHNlY3Rpb25zCi1FYWNoIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24sIHRoZQotc2VjdGlvbidzIG9yaWdpbmFsIGFkZHJlc3MgaW4gdGhlIG9iamVjdCBmaWxlLCBzaXplIGFuZCBhbGlnbm1lbnQKLWluZm9ybWF0aW9uLCB2YXJpb3VzIGZsYWdzLCBhbmQgcG9pbnRlcnMgaW50byBvdGhlciBCRkQgZGF0YQotc3RydWN0dXJlcy4KLQotQGl0ZW0gc3ltYm9scwotRWFjaCBzeW1ib2wgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG9iamVjdCBmaWxlCi13aGljaCBvcmlnaW5hbGx5IGRlZmluZWQgaXQsIGl0cyBuYW1lLCBpdHMgdmFsdWUsIGFuZCB2YXJpb3VzIGZsYWcKLWJpdHMuICBXaGVuIGEgQkZEIGJhY2sgZW5kIHJlYWRzIGluIGEgc3ltYm9sIHRhYmxlLCBpdCByZWxvY2F0ZXMgYWxsCi1zeW1ib2xzIHRvIG1ha2UgdGhlbSByZWxhdGl2ZSB0byB0aGUgYmFzZSBvZiB0aGUgc2VjdGlvbiB3aGVyZSB0aGV5IHdlcmUKLWRlZmluZWQuICBEb2luZyB0aGlzIGVuc3VyZXMgdGhhdCBlYWNoIHN5bWJvbCBwb2ludHMgdG8gaXRzIGNvbnRhaW5pbmcKLXNlY3Rpb24uICBFYWNoIHN5bWJvbCBhbHNvIGhhcyBhIHZhcnlpbmcgYW1vdW50IG9mIGhpZGRlbiBwcml2YXRlIGRhdGEKLWZvciB0aGUgQkZEIGJhY2sgZW5kLiAgU2luY2UgdGhlIHN5bWJvbCBwb2ludHMgdG8gdGhlIG9yaWdpbmFsIGZpbGUsIHRoZQotcHJpdmF0ZSBkYXRhIGZvcm1hdCBmb3IgdGhhdCBzeW1ib2wgaXMgYWNjZXNzaWJsZS4gIEBjb2Rle2xkfSBjYW4KLW9wZXJhdGUgb24gYSBjb2xsZWN0aW9uIG9mIHN5bWJvbHMgb2Ygd2lsZGx5IGRpZmZlcmVudCBmb3JtYXRzIHdpdGhvdXQKLXByb2JsZW1zLgotCi1Ob3JtYWwgZ2xvYmFsIGFuZCBzaW1wbGUgbG9jYWwgc3ltYm9scyBhcmUgbWFpbnRhaW5lZCBvbiBvdXRwdXQsIHNvIGFuCi1vdXRwdXQgZmlsZSAobm8gbWF0dGVyIGl0cyBmb3JtYXQpIHdpbGwgcmV0YWluIHN5bWJvbHMgcG9pbnRpbmcgdG8KLWZ1bmN0aW9ucyBhbmQgdG8gZ2xvYmFsLCBzdGF0aWMsIGFuZCBjb21tb24gdmFyaWFibGVzLiAgU29tZSBzeW1ib2wKLWluZm9ybWF0aW9uIGlzIG5vdCB3b3J0aCByZXRhaW5pbmc7IGluIEBjb2Rle2Eub3V0fSwgdHlwZSBpbmZvcm1hdGlvbiBpcwotc3RvcmVkIGluIHRoZSBzeW1ib2wgdGFibGUgYXMgbG9uZyBzeW1ib2wgbmFtZXMuICBUaGlzIGluZm9ybWF0aW9uIHdvdWxkCi1iZSB1c2VsZXNzIHRvIG1vc3QgQ09GRiBkZWJ1Z2dlcnM7IHRoZSBsaW5rZXIgaGFzIGNvbW1hbmQgbGluZSBzd2l0Y2hlcwotdG8gYWxsb3cgdXNlcnMgdG8gdGhyb3cgaXQgYXdheS4KLQotVGhlcmUgaXMgb25lIHdvcmQgb2YgdHlwZSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIHN5bWJvbCwgc28gaWYgdGhlCi1mb3JtYXQgc3VwcG9ydHMgc3ltYm9sIHR5cGUgaW5mb3JtYXRpb24gd2l0aGluIHN5bWJvbHMgKGZvciBleGFtcGxlLCBDT0ZGLAotSUVFRSwgT2FzeXMpIGFuZCB0aGUgdHlwZSBpcyBzaW1wbGUgZW5vdWdoIHRvIGZpdCB3aXRoaW4gb25lIHdvcmQKLShuZWFybHkgZXZlcnl0aGluZyBidXQgYWdncmVnYXRlcyksIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHByZXNlcnZlZC4KLQotQGl0ZW0gcmVsb2NhdGlvbiBsZXZlbAotRWFjaCBjYW5vbmljYWwgQkZEIHJlbG9jYXRpb24gcmVjb3JkIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sIHRvCi1yZWxvY2F0ZSB0bywgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWxvY2F0ZSwgdGhlIHNlY3Rpb24gdGhlIGRhdGEKLWlzIGluLCBhbmQgYSBwb2ludGVyIHRvIGEgcmVsb2NhdGlvbiB0eXBlIGRlc2NyaXB0b3IuIFJlbG9jYXRpb24gaXMKLXBlcmZvcm1lZCBieSBwYXNzaW5nIG1lc3NhZ2VzIHRocm91Z2ggdGhlIHJlbG9jYXRpb24gdHlwZQotZGVzY3JpcHRvciBhbmQgdGhlIHN5bWJvbCBwb2ludGVyLiBUaGVyZWZvcmUsIHJlbG9jYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQKLW9uIG91dHB1dCBkYXRhIHVzaW5nIGEgcmVsb2NhdGlvbiBtZXRob2QgdGhhdCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBvbmUgb2YgdGhlCi1pbnB1dCBmb3JtYXRzLiBGb3IgaW5zdGFuY2UsIE9hc3lzIHByb3ZpZGVzIGEgYnl0ZSByZWxvY2F0aW9uIGZvcm1hdC4KLUEgcmVsb2NhdGlvbiByZWNvcmQgcmVxdWVzdGluZyB0aGlzIHJlbG9jYXRpb24gdHlwZSB3b3VsZCBwb2ludAotaW5kaXJlY3RseSB0byBhIHJvdXRpbmUgdG8gcGVyZm9ybSB0aGlzLCBzbyB0aGUgcmVsb2NhdGlvbiBtYXkgYmUKLXBlcmZvcm1lZCBvbiBhIGJ5dGUgYmVpbmcgd3JpdHRlbiB0byBhIDY4ayBDT0ZGIGZpbGUsIGV2ZW4gdGhvdWdoIDY4ayBDT0ZGCi1oYXMgbm8gc3VjaCByZWxvY2F0aW9uIHR5cGUuCi0KLUBpdGVtIGxpbmUgbnVtYmVycwotT2JqZWN0IGZvcm1hdHMgY2FuIGNvbnRhaW4sIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHNvbWUgZm9ybSBvZiBtYXBwaW5nCi1iZXR3ZWVuIHN5bWJvbHMsIHNvdXJjZSBsaW5lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMgaW4gdGhlIG91dHB1dCBmaWxlLgotVGhlc2UgYWRkcmVzc2VzIGhhdmUgdG8gYmUgcmVsb2NhdGVkIGFsb25nIHdpdGggdGhlIHN5bWJvbCBpbmZvcm1hdGlvbi4KLUVhY2ggc3ltYm9sIHdpdGggYW4gYXNzb2NpYXRlZCBsaXN0IG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgcG9pbnRzIHRvIHRoZQotZmlyc3QgcmVjb3JkIG9mIHRoZSBsaXN0LiAgVGhlIGhlYWQgb2YgYSBsaW5lIG51bWJlciBsaXN0IGNvbnNpc3RzIG9mIGEKLXBvaW50ZXIgdG8gdGhlIHN5bWJvbCwgd2hpY2ggYWxsb3dzIGZpbmRpbmcgb3V0IHRoZSBhZGRyZXNzIG9mIHRoZQotZnVuY3Rpb24gd2hvc2UgbGluZSBudW1iZXIgaXMgYmVpbmcgZGVzY3JpYmVkLiBUaGUgcmVzdCBvZiB0aGUgbGlzdCBpcwotbWFkZSB1cCBvZiBwYWlyczogb2Zmc2V0cyBpbnRvIHRoZSBzZWN0aW9uIGFuZCBsaW5lIG51bWJlcnMuIEFueSBmb3JtYXQKLXdoaWNoIGNhbiBzaW1wbHkgZGVyaXZlIHRoaXMgaW5mb3JtYXRpb24gY2FuIHBhc3MgaXQgc3VjY2Vzc2Z1bGx5Ci1iZXR3ZWVuIGZvcm1hdHMgKENPRkYsIElFRUUgYW5kIE9hc3lzKS4KLUBlbmQgdGFibGUKZGlmZiAtLWdpdCBhL2JmZC9kb2MvY2hldy5jIGIvYmZkL2RvYy9jaGV3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYTY5YzIuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9jaGV3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTc5ICswLDAgQEAKLS8qIGNoZXcKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBzdGV2ZSBjaGFtYmVybGFpbiBAY3lnbnVzCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogWWV0IGFub3RoZXIgd2F5IG9mIGV4dHJhY3RpbmcgZG9jdW1lbnRhdGlvbiBmcm9tIHNvdXJjZS4KLSAgIE5vLCBJIGhhdmVuJ3QgZmluaXNoZWQgaXQgeWV0LCBidXQgSSBob3BlIHlvdSBwZW9wbGUgbGlrZSBpdCBiZXR0ZXIKLSAgIHRoYW4gdGhlIG9sZCB3YXkKLSAgCi0gICBzYWMKLQotICAgQmFzaWNhbGx5LCB0aGlzIGlzIGEgc29ydCBvZiBzdHJpbmcgZm9ydGgsIG1heWJlIHdlIHNob3VsZCBjYWxsIGl0Ci0gICBzdHJ1dGg/Ci0KLSAgIFlvdSBkZWZpbmUgbmV3IHdvcmRzIHRodXM6Ci0gICA6IDxuZXd3b3JkPiA8b2xkd29yZHM+IDsKLQotKi8KLQotLyogUHJpbWl0aXZlcyBwcm92aWRlZCBieSB0aGUgcHJvZ3JhbToKLQotICAgVHdvIHN0YWNrcyBhcmUgcHJvdmlkZWQsIGEgc3RyaW5nIHN0YWNrIGFuZCBhbiBpbnRlZ2VyIHN0YWNrLgotCi0gICBJbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXM6Ci0JaW50ZXJuYWxfd2FudGVkIC0gaW5kaWNhdGVzIHdoZXRoZXIgYC1pJyB3YXMgcGFzc2VkCi0JaW50ZXJuYWxfbW9kZSAtIHVzZXItc2V0dGFibGUKLQotICAgQ29tbWFuZHM6Ci0JcHVzaF90ZXh0Ci0JISAtIHBvcCB0b3Agb2YgaW50ZWdlciBzdGFjayBmb3IgYWRkcmVzcywgcG9wIG5leHQgZm9yIHZhbHVlOyBzdG9yZQotCUAgLSB0cmVhdCB2YWx1ZSBvbiBpbnRlZ2VyIHN0YWNrIGFzIHRoZSBhZGRyZXNzIG9mIGFuIGludGVnZXI7IHB1c2gKLQkJdGhhdCBpbnRlZ2VyIG9uIHRoZSBpbnRlZ2VyIHN0YWNrIGFmdGVyIHBvcHBpbmcgdGhlICJhZGRyZXNzIgotCWhlbGxvIC0gcHJpbnQgImhlbGxvXG4iIHRvIHN0ZG91dAotCXN0ZG91dCAtIHB1dCBzdGRvdXQgbWFya2VyIG9uIFRPUwotCXN0ZGVyciAtIHB1dCBzdGRlcnIgbWFya2VyIG9uIFRPUwotCXByaW50IC0gcHJpbnQgVE9TLTEgb24gVE9TIChlZzogImhlbGxvXG4iIHN0ZG91dCBwcmludCkKLQlza2lwX3Bhc3RfbmV3bGluZQotCWNhdHN0ciAtIGZuIGljYXRzdHIKLQljb3B5X3Bhc3RfbmV3bGluZSAtIGFwcGVuZCBpbnB1dCwgdXAgdG8gYW5kIGluY2x1ZGluZyBuZXdsaW5lIGludG8gVE9TCi0JZHVwIC0gZm4gb3RoZXJfZHVwCi0JZHJvcCAtIGRpc2NhcmQgVE9TCi0JaWRyb3AgLSBkaXR0bwotCXJlbWNoYXIgLSBkZWxldGUgbGFzdCBjaGFyYWN0ZXIgZnJvbSBUT1MKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCWRvX2ZhbmN5X3N0dWZmIC0gdHJhbnNsYXRlIDw8Zm9vPj4gdG8gQGNvZGV7Zm9vfSBpbiBUT1MKLQlidWxsZXRpemUgLSBpZiAibyIgbGluZXMgZm91bmQsIHByZXBlbmQgQGl0ZW1pemUgQGJ1bGxldCB0byBUT1MKLQkJYW5kIEBpdGVtIHRvIGVhY2ggIm8iIGxpbmU7IGFwcGVuZCBAZW5kIGl0ZW1pemUKLQljb3VyaWVyaXplIC0gcHV0IEBleGFtcGxlIGFyb3VuZCAuIGFuZCB8IGxpbmVzLCB0cmFuc2xhdGUgeyogKn0geyB9Ci0JZXhpdCAtIGZuIGNoZXdfZXhpdAotCXN3YXAKLQlvdXRwdXRkb3RzIC0gc3RyaXAgb3V0IGxpbmVzIHdpdGhvdXQgbGVhZGluZyBkb3RzCi0JcGFyYW1zdHVmZiAtIGNvbnZlcnQgZnVsbCBkZWNsYXJhdGlvbiBpbnRvICJQQVJBTVMiIGZvcm0gaWYgbm90IGFscmVhZHkKLQltYXliZWNhdHN0ciAtIGRvIGNhdHN0ciBpZiBpbnRlcm5hbF9tb2RlID09IGludGVybmFsX3dhbnRlZCwgZGlzY2FyZAotCQl2YWx1ZSBpbiBhbnkgY2FzZQotCXRyYW5zbGF0ZWNvbW1lbnRzIC0gdHVybiB7KiBhbmQgKn0gaW50byBjb21tZW50IGRlbGltaXRlcnMKLQlraWxsX2JvZ3VzX2xpbmVzIC0gZ2V0IHJpZCBvZiBleHRyYSBuZXdsaW5lcwotCWluZGVudAotCWludGVybmFsbW9kZSAtIHBvcCBmcm9tIGludGVnZXIgc3RhY2ssIHNldCBgaW50ZXJuYWxtb2RlJyB0byB0aGF0IHZhbHVlCi0JcHJpbnRfc3RhY2tfbGV2ZWwgLSBwcmludCBjdXJyZW50IHN0YWNrIGRlcHRoIHRvIHN0ZGVycgotCXN0cmlwX3RyYWlsaW5nX25ld2xpbmVzIC0gZ28gYWhlYWQsIGd1ZXNzLi4uCi0JW3F1b3RlZCBzdHJpbmddIC0gcHVzaCBzdHJpbmcgb250byBzdHJpbmcgc3RhY2sKLQlbd29yZCBzdGFydGluZyB3aXRoIGRpZ2l0XSAtIHB1c2ggYXRvbChzdHIpIG9udG8gaW50ZWdlciBzdGFjawotCi0gICBBIGNvbW1hbmQgbXVzdCBiZSBhbGwgdXBwZXItY2FzZSwgYW5kIGFsb25lIG9uIGEgbGluZS4KLQotICAgRm9vLiAgKi8KLQotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNkZWZpbmUgREVGX1NJWkUgNTAwMAotI2RlZmluZSBTVEFDSyA1MAotCi1pbnQgaW50ZXJuYWxfd2FudGVkOwotaW50IGludGVybmFsX21vZGU7Ci0KLWludCB3YXJuaW5nOwotCi0vKiBIZXJlIGlzIGEgc3RyaW5nIHR5cGUgLi4uICovCi0KLXR5cGVkZWYgc3RydWN0IGJ1ZmZlciAKLXsKLSAgY2hhciAqcHRyOwotICB1bnNpZ25lZCBsb25nIHdyaXRlX2lkeDsKLSAgdW5zaWduZWQgbG9uZyBzaXplOwotfSBzdHJpbmdfdHlwZTsKLQotCi0jaWZkZWYgX19TVERDX18KLXN0YXRpYyB2b2lkIGluaXRfc3RyaW5nX3dpdGhfc2l6ZSAoc3RyaW5nX3R5cGUgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGluaXRfc3RyaW5nIChzdHJpbmdfdHlwZSAqKTsKLXN0YXRpYyBpbnQgZmluZCAoc3RyaW5nX3R5cGUgKiwgY2hhciAqKTsKLXN0YXRpYyB2b2lkIHdyaXRlX2J1ZmZlciAoc3RyaW5nX3R5cGUgKiwgRklMRSAqKTsKLXN0YXRpYyB2b2lkIGRlbGV0ZV9zdHJpbmcgKHN0cmluZ190eXBlICopOwotc3RhdGljIGNoYXIgKmFkZHIgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgY2hhciBhdCAoc3RyaW5nX3R5cGUgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGNhdGNoYXIgKHN0cmluZ190eXBlICosIGludCk7Ci1zdGF0aWMgdm9pZCBvdmVyd3JpdGVfc3RyaW5nIChzdHJpbmdfdHlwZSAqLCBzdHJpbmdfdHlwZSAqKTsKLXN0YXRpYyB2b2lkIGNhdGJ1ZiAoc3RyaW5nX3R5cGUgKiwgY2hhciAqLCB1bnNpZ25lZCBpbnQpOwotc3RhdGljIHZvaWQgY2F0dGV4dCAoc3RyaW5nX3R5cGUgKiwgY2hhciAqKTsKLXN0YXRpYyB2b2lkIGNhdHN0ciAoc3RyaW5nX3R5cGUgKiwgc3RyaW5nX3R5cGUgKik7Ci0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZCBERUZVTihpbml0X3N0cmluZ193aXRoX3NpemUsKGJ1ZmZlciwgc2l6ZSksCi0JICAgc3RyaW5nX3R5cGUgKmJ1ZmZlciBBTkQKLQkgICB1bnNpZ25lZCBpbnQgc2l6ZSApCi17Ci0gICAgYnVmZmVyLT53cml0ZV9pZHggPSAwOwotICAgIGJ1ZmZlci0+c2l6ZSA9IHNpemU7Ci0gICAgYnVmZmVyLT5wdHIgPSBtYWxsb2Moc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGluaXRfc3RyaW5nLChidWZmZXIpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIpCi17Ci0gICAgaW5pdF9zdHJpbmdfd2l0aF9zaXplKGJ1ZmZlciwgREVGX1NJWkUpOwotCi19Ci0KLXN0YXRpYyBpbnQgREVGVU4oZmluZCwgKHN0ciwgd2hhdCksCi0JICBzdHJpbmdfdHlwZSAqc3RyIEFORAotCSAgY2hhciAqd2hhdCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICBjaGFyICpwOwotICAgIHAgPSB3aGF0OwotICAgIGZvciAoaSA9IDA7IGkgPCBzdHItPndyaXRlX2lkeCAmJiAqcDsgaSsrKSAKLSAgICB7Ci0JaWYgKCpwID09IHN0ci0+cHRyW2ldKQotCSBwKys7Ci0JZWxzZQotCSBwID0gd2hhdDsKLSAgICB9Ci0gICAgcmV0dXJuICgqcCA9PSAwKTsKLSAgICAKLX0KLQotc3RhdGljIHZvaWQgREVGVU4od3JpdGVfYnVmZmVyLChidWZmZXIsIGYpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgRklMRSAqZikKLXsKLSAgICBmd3JpdGUoYnVmZmVyLT5wdHIsIGJ1ZmZlci0+d3JpdGVfaWR4LCAxLCBmKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBERUZVTihkZWxldGVfc3RyaW5nLChidWZmZXIpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIpCi17Ci0gICAgZnJlZShidWZmZXItPnB0cik7Ci19Ci0KLQotc3RhdGljIGNoYXIgKkRFRlVOKGFkZHIsIChidWZmZXIsIGlkeCksCi0JICAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gICAgcmV0dXJuIGJ1ZmZlci0+cHRyICsgaWR4OwotfQotCi1zdGF0aWMgY2hhciBERUZVTihhdCwoYnVmZmVyLCBwb3MpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgdW5zaWduZWQgaW50IHBvcykgCi17Ci0gIGlmIChwb3MgPj0gYnVmZmVyLT53cml0ZV9pZHgpIAotICAgIHJldHVybiAwOwotICByZXR1cm4gYnVmZmVyLT5wdHJbcG9zXTsKLX0KLQotc3RhdGljIHZvaWQgREVGVU4oY2F0Y2hhciwoYnVmZmVyLCBjaCksIAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgaW50IGNoKQotewotICBpZiAoYnVmZmVyLT53cml0ZV9pZHggPT0gYnVmZmVyLT5zaXplKSAKLSAgICB7Ci0gICAgICBidWZmZXItPnNpemUgKj0yOwotICAgICAgYnVmZmVyLT5wdHIgPSByZWFsbG9jKGJ1ZmZlci0+cHRyLCBidWZmZXItPnNpemUpOwotICAgIH0KLQotICBidWZmZXItPnB0cltidWZmZXItPndyaXRlX2lkeCArKyBdID0gY2g7Ci19Ci0KLQotc3RhdGljIHZvaWQgREVGVU4ob3ZlcndyaXRlX3N0cmluZywoZHN0LCAgIHNyYyksCi0JICAgc3RyaW5nX3R5cGUgKmRzdCBBTkQKLQkgICBzdHJpbmdfdHlwZSAqc3JjKQotewotICAgIGZyZWUoZHN0LT5wdHIpOwotICAgIGRzdC0+c2l6ZSA9IHNyYy0+c2l6ZTsKLSAgICBkc3QtPndyaXRlX2lkeCA9IHNyYy0+d3JpdGVfaWR4OwotICAgIGRzdC0+cHRyID0gc3JjLT5wdHI7Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGNhdGJ1ZiwoYnVmZmVyLCBidWYsIGxlbiksCi0JICAgc3RyaW5nX3R5cGUgKmJ1ZmZlciBBTkQKLQkgICBjaGFyICpidWYgQU5ECi0JICAgdW5zaWduZWQgaW50IGxlbikKLXsKLSAgaWYgKGJ1ZmZlci0+d3JpdGVfaWR4ICsgbGVuID49IGJ1ZmZlci0+c2l6ZSkKLSAgICB7Ci0gICAgICB3aGlsZSAoYnVmZmVyLT53cml0ZV9pZHggKyBsZW4gPj0gYnVmZmVyLT5zaXplKQotCWJ1ZmZlci0+c2l6ZSAqPSAyOwotICAgICAgYnVmZmVyLT5wdHIgPSByZWFsbG9jIChidWZmZXItPnB0ciwgYnVmZmVyLT5zaXplKTsKLSAgICB9Ci0gIG1lbWNweSAoYnVmZmVyLT5wdHIgKyBidWZmZXItPndyaXRlX2lkeCwgYnVmLCBsZW4pOwotICBidWZmZXItPndyaXRlX2lkeCArPSBsZW47Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGNhdHRleHQsKGJ1ZmZlciwgc3RyaW5nKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgIGNoYXIgKnN0cmluZykKLXsKLSAgY2F0YnVmIChidWZmZXIsIHN0cmluZywgKHVuc2lnbmVkIGludCkgc3RybGVuIChzdHJpbmcpKTsKLX0KLQotc3RhdGljIHZvaWQgREVGVU4oY2F0c3RyLChkc3QsIHNyYyksCi0JICAgc3RyaW5nX3R5cGUgKmRzdCBBTkQKLQkgICBzdHJpbmdfdHlwZSAqc3JjKQotewotICBjYXRidWYgKGRzdCwgc3JjLT5wdHIsIHNyYy0+d3JpdGVfaWR4KTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50IAotREVGVU4oc2tpcF93aGl0ZV9hbmRfc3RhcnMsKHNyYywgaWR4KSwKLSAgICAgIHN0cmluZ190eXBlICpzcmMgQU5ECi0gICAgICB1bnNpZ25lZCBpbnQgaWR4KQotewotICBjaGFyIGM7Ci0gIHdoaWxlICgoYyA9IGF0KHNyYyxpZHgpKSwKLQkgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGMpCi0JIHx8IChjID09ICcqJwotCSAgICAgLyogRG9uJ3Qgc2tpcCBwYXN0IGVuZC1vZi1jb21tZW50IG9yIHN0YXIgYXMgZmlyc3QKLQkJY2hhcmFjdGVyIG9uIGl0cyBsaW5lLiAgKi8KLQkgICAgICYmIGF0KHNyYyxpZHggKzEpICE9ICcvJwotCSAgICAgJiYgYXQoc3JjLGlkeCAtMSkgIT0gJ1xuJykpIAotICAgIGlkeCsrOwotICByZXR1cm4gaWR4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RyaW5nX3R5cGUgc3RhY2tbU1RBQ0tdOwotc3RyaW5nX3R5cGUgKnRvczsKLQotdW5zaWduZWQgaW50IGlkeCA9IDA7IC8qIFBvcyBpbiBpbnB1dCBidWZmZXIgKi8KLXN0cmluZ190eXBlICpwdHI7IC8qIGFuZCB0aGUgYnVmZmVyICovCi10eXBlZGVmIHZvaWQgKCpzdGluc3RfdHlwZSkoKTsKLXN0aW5zdF90eXBlICpwYzsKLXN0aW5zdF90eXBlIHNzdGFja1tTVEFDS107Ci1zdGluc3RfdHlwZSAqc3NwID0gJnNzdGFja1swXTsKLWxvbmcgaXN0YWNrW1NUQUNLXTsKLWxvbmcgKmlzcCA9ICZpc3RhY2tbMF07Ci0KLXR5cGVkZWYgaW50ICp3b3JkX3R5cGU7Ci0KLQotCi1zdHJ1Y3QgZGljdF9zdHJ1Y3QKLXsKLSAgICBjaGFyICp3b3JkOwotICAgIHN0cnVjdCBkaWN0X3N0cnVjdCAqbmV4dDsKLSAgICBzdGluc3RfdHlwZSAqY29kZTsKLSAgICBpbnQgY29kZV9sZW5ndGg7Ci0gICAgaW50IGNvZGVfZW5kOwotICAgIGludCB2YXI7Ci0gICAgCi19OwotdHlwZWRlZiBzdHJ1Y3QgZGljdF9zdHJ1Y3QgZGljdF90eXBlOwotI2RlZmluZSBXT1JEKHgpIHN0YXRpYyB2b2lkIHgoKQotCi1zdGF0aWMgdm9pZAotZGllIChtc2cpCi0gICAgIGNoYXIgKm1zZzsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXNcbiIsIG1zZyk7Ci0gIGV4aXQgKDEpOwotfQotCi1zdGF0aWMgdm9pZAotY2hlY2tfcmFuZ2UgKCkKLXsKLSAgaWYgKHRvcyA8IHN0YWNrKQotICAgIGRpZSAoInVuZGVyZmxvdyBpbiBzdHJpbmcgc3RhY2siKTsKLSAgaWYgKHRvcyA+PSBzdGFjayArIFNUQUNLKQotICAgIGRpZSAoIm92ZXJmbG93IGluIHN0cmluZyBzdGFjayIpOwotfQotCi1zdGF0aWMgdm9pZAotaWNoZWNrX3JhbmdlICgpCi17Ci0gIGlmIChpc3AgPCBpc3RhY2spCi0gICAgZGllICgidW5kZXJmbG93IGluIGludGVnZXIgc3RhY2siKTsKLSAgaWYgKGlzcCA+PSBpc3RhY2sgKyBTVEFDSykKLSAgICBkaWUgKCJvdmVyZmxvdyBpbiBpbnRlZ2VyIHN0YWNrIik7Ci19Ci0KLSNpZmRlZiBfX1NURENfXwotc3RhdGljIHZvaWQgZXhlYyAoZGljdF90eXBlICopOwotc3RhdGljIHZvaWQgY2FsbCAodm9pZCk7Ci1zdGF0aWMgdm9pZCByZW1jaGFyICh2b2lkKSwgc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMgKHZvaWQpLCBwdXNoX251bWJlciAodm9pZCk7Ci1zdGF0aWMgdm9pZCBwdXNoX3RleHQgKHZvaWQpOwotc3RhdGljIHZvaWQgcmVtb3ZlX25vbmNvbW1lbnRzIChzdHJpbmdfdHlwZSAqLCBzdHJpbmdfdHlwZSAqKTsKLXN0YXRpYyB2b2lkIHByaW50X3N0YWNrX2xldmVsICh2b2lkKTsKLXN0YXRpYyB2b2lkIHBhcmFtc3R1ZmYgKHZvaWQpLCB0cmFuc2xhdGVjb21tZW50cyAodm9pZCk7Ci1zdGF0aWMgdm9pZCBvdXRwdXRkb3RzICh2b2lkKSwgY291cmllcml6ZSAodm9pZCksIGJ1bGxldGl6ZSAodm9pZCk7Ci1zdGF0aWMgdm9pZCBkb19mYW5jeV9zdHVmZiAodm9pZCk7Ci1zdGF0aWMgaW50IGlzY29tbWFuZCAoc3RyaW5nX3R5cGUgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyBpbnQgY29weV9wYXN0X25ld2xpbmUgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCwgc3RyaW5nX3R5cGUgKik7Ci1zdGF0aWMgdm9pZCBpY29weV9wYXN0X25ld2xpbmUgKHZvaWQpLCBraWxsX2JvZ3VzX2xpbmVzICh2b2lkKSwgaW5kZW50ICh2b2lkKTsKLXN0YXRpYyB2b2lkIGdldF9zdHVmZl9pbl9jb21tYW5kICh2b2lkKSwgc3dhcCAodm9pZCksIG90aGVyX2R1cCAodm9pZCk7Ci1zdGF0aWMgdm9pZCBkcm9wICh2b2lkKSwgaWRyb3AgKHZvaWQpOwotc3RhdGljIHZvaWQgaWNhdHN0ciAodm9pZCksIHNraXBfcGFzdF9uZXdsaW5lICh2b2lkKSwgaW50ZXJuYWxtb2RlICh2b2lkKTsKLXN0YXRpYyB2b2lkIG1heWJlY2F0c3RyICh2b2lkKTsKLXN0YXRpYyBjaGFyICpuZXh0d29yZCAoY2hhciAqLCBjaGFyICoqKTsKLWRpY3RfdHlwZSAqbG9va3VwX3dvcmQgKGNoYXIgKik7Ci1zdGF0aWMgdm9pZCBwZXJmb3JtICh2b2lkKTsKLWRpY3RfdHlwZSAqbmV3ZW50cnkgKGNoYXIgKik7Ci11bnNpZ25lZCBpbnQgYWRkX3RvX2RlZmluaXRpb24gKGRpY3RfdHlwZSAqLCBzdGluc3RfdHlwZSk7Ci12b2lkIGFkZF9pbnRyaW5zaWMgKGNoYXIgKiwgdm9pZCAoKikoKSk7Ci12b2lkIGFkZF92YXIgKGNoYXIgKik7Ci12b2lkIGNvbXBpbGUgKGNoYXIgKik7Ci1zdGF0aWMgdm9pZCBiYW5nICh2b2lkKTsKLXN0YXRpYyB2b2lkIGF0c2lnbiAodm9pZCk7Ci1zdGF0aWMgdm9pZCBoZWxsbyAodm9pZCk7Ci1zdGF0aWMgdm9pZCBzdGRvdXRfICh2b2lkKTsKLXN0YXRpYyB2b2lkIHN0ZGVycl8gKHZvaWQpOwotc3RhdGljIHZvaWQgcHJpbnQgKHZvaWQpOwotc3RhdGljIHZvaWQgcmVhZF9pbiAoc3RyaW5nX3R5cGUgKiwgRklMRSAqKTsKLXN0YXRpYyB2b2lkIHVzYWdlICh2b2lkKTsKLXN0YXRpYyB2b2lkIGNoZXdfZXhpdCAodm9pZCk7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgREVGVU4oZXhlYywod29yZCksCi0JCSAgZGljdF90eXBlICp3b3JkKQotewotICBwYyA9IHdvcmQtPmNvZGU7Ci0gIHdoaWxlICgqcGMpIAotICAgICgqcGMpKCk7Ci19Ci1XT1JEKGNhbGwpCi17Ci0gICAgc3RpbnN0X3R5cGUgKm9sZHBjID0gcGM7Ci0gICAgZGljdF90eXBlICplOwotICAgIGUgPSAgKGRpY3RfdHlwZSAqKShwYyBbMV0pOwotICAgIGV4ZWMoZSk7Ci0gICAgcGMgPSBvbGRwYyArIDI7Ci0gICAgCi19Ci0KLVdPUkQocmVtY2hhcikKLXsKLSAgaWYgKHRvcy0+d3JpdGVfaWR4KQotICAgIHRvcy0+d3JpdGVfaWR4LS07ICAgIAotICBwYysrOwotfQotCi1zdGF0aWMgdm9pZAotc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMgKCkKLXsKLSAgd2hpbGUgKChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgYXQgKHRvcywgdG9zLT53cml0ZV9pZHggLSAxKSkKLQkgIHx8IGF0ICh0b3MsIHRvcy0+d3JpdGVfaWR4IC0gMSkgPT0gJ1xuJykKLQkgJiYgdG9zLT53cml0ZV9pZHggPiAwKQotICAgIHRvcy0+d3JpdGVfaWR4LS07Ci0gIHBjKys7Ci19Ci0KLVdPUkQocHVzaF9udW1iZXIpCi17Ci0gICAgaXNwKys7Ci0gICAgaWNoZWNrX3JhbmdlICgpOwotICAgIHBjKys7Ci0gICAgKmlzcCA9IChsb25nKSgqcGMpOwotICAgIHBjKys7Ci19Ci0KLVdPUkQocHVzaF90ZXh0KQotewotICAgIHRvcysrOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIGluaXRfc3RyaW5nKHRvcyk7Ci0gICAgcGMrKzsKLSAgICBjYXR0ZXh0KHRvcywqKChjaGFyICoqKXBjKSk7Ci0gICAgcGMrKzsKLSAgICAKLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZXZlcnl0aGluZyBub3QgaW5zaWRlIGNvbW1lbnRzIHN0YXJ0aW5nIG9uCi0gICB0aGUgZmlyc3QgY2hhciBvZiB0aGUgbGluZSBmcm9tIHRoZSAgc3RyaW5nLCBhbHNvIHdoZW4gY29weWluZwotICAgY29tbWVudHMsIHJlbW92ZXMgYmxhbmsgc3BhY2UgYW5kIGxlYWRpbmcgKidzLgotICAgQmxhbmsgbGluZXMgYXJlIHR1cm5lZCBpbnRvIG9uZSBibGFuayBsaW5lLiAgKi8KLQotc3RhdGljIHZvaWQgCi1ERUZVTihyZW1vdmVfbm9uY29tbWVudHMsKHNyYyxkc3QpLAotCSAgIHN0cmluZ190eXBlICpzcmMgQU5ECi0JICAgc3RyaW5nX3R5cGUgKmRzdCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICAKLSAgICB3aGlsZSAoYXQoc3JjLGlkeCkpIAotICAgIHsKLQkvKiBOb3cgc2VlIGlmIHdlIGhhdmUgYSBjb21tZW50IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSAqLwotCWlmIChhdChzcmMsaWR4KSA9PSAnXG4nIAotCSAgICAmJiBhdChzcmMsaWR4KzEpID09ICAnLycgCi0JICAgICYmIGF0KHNyYyxpZHgrMikgPT0gJyonKSAKLQl7Ci0JICAgIGlkeCs9MzsKLQkgICAgCi0JICAgIGlkeCA9IHNraXBfd2hpdGVfYW5kX3N0YXJzKHNyYyxpZHgpOwotCi0JICAgIC8qIFJlbW92ZSBsZWFkaW5nIGRvdCAqLwotCSAgICBpZiAoYXQoc3JjLCBpZHgpID09ICcuJykKLQkgICAgIGlkeCsrOwotCSAgICAKLQkgICAgLyogQ29weSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLCBvciB0aWxsIHRoZSBlbmQgb2YgdGhlCi0JICAgICAgIGNvbW1lbnQgKi8KLQkgICAgd2hpbGUgKGF0KHNyYywgaWR4KSkKLQkgICAgewotCQlpZiAoYXQoc3JjLCBpZHgpID09ICdcbicpIAotCQl7Ci0JCSAgICAvKiBlbmQgb2YgbGluZSwgZWNobyBhbmQgc2NyYXBlIG9mIGxlYWRpbmcgYmxhbmtzICAqLwotCQkgICAgaWYgKGF0KHNyYyxpZHggKzEpID09ICdcbicpCi0JCSAgICAgY2F0Y2hhcihkc3QsJ1xuJyk7Ci0JCSAgICBjYXRjaGFyKGRzdCwnXG4nKTsKLQkJICAgIGlkeCsrOwotCQkgICAgaWR4ID0gICBza2lwX3doaXRlX2FuZF9zdGFycyhzcmMsIGlkeCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXQoc3JjLCBpZHgpID09ICcqJyAmJiBhdChzcmMsaWR4KzEpID09ICcvJykgCi0JCXsKLQkJICAgIGlkeCArPTIgOwotCQkgICAgY2F0dGV4dChkc3QsIlxuRU5ERERcbiIpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJZWxzZSAKLQkJewotCQkgICAgY2F0Y2hhcihkc3QsIGF0KHNyYywgaWR4KSk7Ci0JCSAgICBpZHgrKzsKLQkJfQotCSAgICB9Ci0JfQotCWVsc2UgaWR4Kys7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3RhY2tfbGV2ZWwgKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiY3VycmVudCBzdHJpbmcgc3RhY2sgZGVwdGggPSAlZCwgIiwgdG9zIC0gc3RhY2spOwotICBmcHJpbnRmIChzdGRlcnIsICJjdXJyZW50IGludGVnZXIgc3RhY2sgZGVwdGggPSAlZFxuIiwgaXNwIC0gaXN0YWNrKTsKLSAgcGMrKzsKLX0KLQotLyogdHVybjoKLSAgICAgZm9vYmFyIG5hbWUoc3R1ZmYpOwotICAgaW50bzoKLSAgICAgZm9vYmFyCi0gICAgIG5hbWUgUEFSQU1TICgoc3R1ZmYpKTsKLSAgIGFuZCBhIGJsYW5rIGxpbmUuCi0gKi8KLQotc3RhdGljIHZvaWQKLURFRlVOX1ZPSUQocGFyYW1zdHVmZikKLXsKLSAgICB1bnNpZ25lZCBpbnQgb3BlbnA7Ci0gICAgdW5zaWduZWQgaW50IGZuYW1lOwotICAgIHVuc2lnbmVkIGludCBpZHg7Ci0gICAgc3RyaW5nX3R5cGUgb3V0OwotICAgIGluaXRfc3RyaW5nKCZvdXQpOwotICAgIAotCi0gICAgLyogbWFrZSBzdXJlIHRoYXQgaXQncyBub3QgYWxyZWFkeSBwYXJhbSdkIG9yIHByb3RvJ2QgKi8KLSAgICBpZihmaW5kKHRvcywiUEFSQU1TIikgfHwgZmluZCh0b3MsIlBST1RPIikgfHwgIWZpbmQodG9zLCIoIikpIHsKLQkgICAgY2F0c3RyKCZvdXQsdG9zKTsKLQl9Ci0gICAgZWxzZSAKLSAgICB7Ci0JLyogRmluZCB0aGUgb3BlbiBwYXJlbiAqLwotCWZvciAob3BlbnAgPSAwOyBhdCh0b3MsIG9wZW5wKSAhPSAnKCcgICYmIGF0KHRvcyxvcGVucCk7IG9wZW5wKyspCi0JIDsKLQotCWZuYW1lID0gb3BlbnA7Ci0JLyogU3RlcCBiYWNrIHRvIHRoZSBmbmFtZSAqLwotCWZuYW1lLS07Ci0Jd2hpbGUgKGZuYW1lICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcywgZm5hbWUpKSkKLQkgZm5hbWUgLS07Ci0Jd2hpbGUgKGZuYW1lCi0JICAgICAgICYmICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsZm5hbWUpKQotCSAgICAgICAmJiBhdCh0b3MsZm5hbWUpICE9ICcqJykKLQkgZm5hbWUtLTsKLQotCWZuYW1lKys7Ci0JCi0JZm9yIChpZHggPSAwOyBpZHggPCBmbmFtZTsgaWR4KyspIAkvKiBPdXRwdXQgdHlwZSAqLwotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsaWR4KSk7Ci0JfQotICAgIAotICAgICAgICBjYXR0ZXh0KCZvdXQsICJcbiIpOwkvKiBJbnNlcnQgYSBuZXdsaW5lIGJldHdlZW4gdHlwZSBhbmQgZm5uYW1lICovCi0KLQlmb3IgKGlkeCA9IGZuYW1lOyBpZHggPCBvcGVucDsgaWR4KyspIAkJLyogT3V0cHV0IGZubmFtZSAqLwotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsaWR4KSk7Ci0JfQotCi0JY2F0dGV4dCgmb3V0LCIgUEFSQU1TICgiKTsKLQotCXdoaWxlIChhdCh0b3MsaWR4KSAmJiBhdCh0b3MsaWR4KSAhPSc7JykgCi0JewotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLQljYXR0ZXh0KCZvdXQsIik7XG5cbiIpOwotICAgIH0KLSAgICBvdmVyd3JpdGVfc3RyaW5nKHRvcywgJm91dCk7ICAgIAotICAgIHBjKys7Ci0gICAgCi19Ci0KLQotCi0vKiB0dXJuIHsqCi0gICBhbmQgKn0gaW50byBjb21tZW50cyAqLwotCi1XT1JEKHRyYW5zbGF0ZWNvbW1lbnRzKQotewotICAgIHVuc2lnbmVkIGludCBpZHggPSAwOwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSAKLSAgICB7Ci0JaWYgKGF0KHRvcyxpZHgpID09ICd7JyAmJiBhdCh0b3MsaWR4KzEpID09JyonKSAKLQl7Ci0JICAgIGNhdHRleHQoJm91dCwiLyoiKTsKLQkgICAgaWR4Kz0yOwotCX0KLQllbHNlIGlmIChhdCh0b3MsaWR4KSA9PSAnKicgJiYgYXQodG9zLGlkeCsxKSA9PSd9JykgCi0JewotCSAgICBjYXR0ZXh0KCZvdXQsIiovIik7Ci0JICAgIGlkeCs9MjsKLQl9Ci0JZWxzZSAgCi0JewotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9Ci0KLQotICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKLSAgICAKLSAgICBwYysrOwotICAgIAotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLS8qIHR1cm4gZXZlcnl0aGluZyBub3Qgc3RhcnRpbmcgd2l0aCBhIC4gaW50byBhIGNvbW1lbnQgKi8KLQotV09SRChtYW5nbGVjb21tZW50cykKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCi0gICAgewotCWlmIChhdCh0b3MsaWR4KSA9PSAnXG4nICYmIGF0KHRvcyxpZHgrMSkgPT0nKicpIAotCXsKLQkgICAgY2F0dGV4dCgmb3V0LCIJLyoiKTsKLQkgICAgaWR4Kz0yOwotCX0KLQllbHNlIGlmIChhdCh0b3MsaWR4KSA9PSAnKicgJiYgYXQodG9zLGlkeCsxKSA9PSd9JykgCi0JewotCSAgICBjYXR0ZXh0KCZvdXQsIiovIik7Ci0JICAgIGlkeCs9MjsKLQl9Ci0JZWxzZSAgCi0JewotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9Ci0KLQotICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKLSAgICAKLSAgICBwYysrOwotICAgIAotfQotCi0jZW5kaWYKLQotLyogTW9kIHRvcyBzbyB0aGF0IG9ubHkgbGluZXMgd2l0aCBsZWFkaW5nIGRvdHMgcmVtYWluICovCi1zdGF0aWMgdm9pZAotREVGVU5fVk9JRChvdXRwdXRkb3RzKQotewotICAgIHVuc2lnbmVkIGludCBpZHggPSAwOwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSAKLSAgICB7Ci0JaWYgKGF0KHRvcywgaWR4KSA9PSAnXG4nICYmIGF0KHRvcywgaWR4KzEpID09ICcuJykgCi0JewotCSAgY2hhciBjOwotCSAgaWR4ICs9IDI7Ci0JICAgIAotCSAgICB3aGlsZSAoKGMgPSBhdCh0b3MsIGlkeCkpICYmIGMgIT0gJ1xuJykKLQkgICAgewotCSAgICAgIGlmIChjID09ICd7JyAmJiBhdCh0b3MsaWR4KzEpID09JyonKSAKLQkJewotCQkgICAgY2F0dGV4dCgmb3V0LCIgLyoiKTsKLQkJICAgIGlkeCs9MjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGMgPT0gJyonICYmIGF0KHRvcyxpZHgrMSkgPT0nfScpIAotCQl7Ci0JCSAgICBjYXR0ZXh0KCZvdXQsIiovIik7Ci0JCSAgICBpZHgrPTI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAgIGNhdGNoYXIoJm91dCwgYyk7Ci0JCSAgICBpZHgrKzsKLQkJfQotCSAgICB9Ci0JICAgIGNhdGNoYXIoJm91dCwnXG4nKTsKLQl9Ci0JZWxzZSAKLQl7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9CQotCi0gICAgb3ZlcndyaXRlX3N0cmluZyh0b3MsICZvdXQpOwotICAgIHBjKys7Ci0gICAgCi19Ci0KLS8qIEZpbmQgbGluZXMgc3RhcnRpbmcgd2l0aCAuIGFuZCB8IGFuZCBwdXQgZXhhbXBsZSBhcm91bmQgdGhlbSBvbiB0b3MgKi8KLVdPUkQoY291cmllcml6ZSkKLXsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgdW5zaWduZWQgaW50IGlkeCA9IDA7Ci0gICAgaW50IGNvbW1hbmQgPSAwOwotICAgIAotICAgIGluaXRfc3RyaW5nKCZvdXQpOwotICAgIAotICAgIHdoaWxlIChhdCh0b3MsIGlkeCkpIAotICAgIHsKLQlpZiAoYXQodG9zLCBpZHgpID09ICdcbicgCi0JICAgICYmIChhdCh0b3MsIGlkeCArMSApID09ICcuJwotCQl8fCBhdCh0b3MsaWR4KzEpID09ICd8JykpIAotCXsKLQkgICAgY2F0dGV4dCgmb3V0LCJcbkBleGFtcGxlXG4iKTsKLQkgICAgZG8gCi0JICAgIHsKLQkJaWR4ICs9IDI7Ci0JCQotCQl3aGlsZSAoYXQodG9zLCBpZHgpICYmIGF0KHRvcywgaWR4KSE9J1xuJykKLQkJewotCQkgICAgaWYgKGF0KHRvcyxpZHgpPT0neycgJiYgYXQodG9zLGlkeCsxKSA9PScqJykgCi0JCSAgICB7Ci0JCQljYXR0ZXh0KCZvdXQsIiAvKiIpOwotCQkJaWR4Kz0yOwotCQkgICAgfQotCQkgICAgZWxzZSBpZiAoYXQodG9zLGlkeCk9PScqJyAmJiBhdCh0b3MsaWR4KzEpID09J30nKSAKLQkJICAgIHsKLQkJCWNhdHRleHQoJm91dCwiKi8iKTsKLQkJCWlkeCs9MjsKLQkJICAgIH0KLQkgICAgICAgICAgICBlbHNlIGlmIChhdCh0b3MsaWR4KSA9PSAneycgJiYgIWNvbW1hbmQpCi0JCSAgICB7Ci0JCQljYXR0ZXh0KCZvdXQsIkB7Iik7Ci0JCQlpZHgrKzsKLQkJICAgIH0KLQkgICAgICAgICAgICBlbHNlIGlmIChhdCh0b3MsaWR4KSA9PSAnfScgJiYgIWNvbW1hbmQpCi0JCSAgICB7Ci0JCQljYXR0ZXh0KCZvdXQsIkB9Iik7Ci0JCQlpZHgrKzsKLQkJICAgIH0KLQkJICAgIGVsc2UgCi0JCSAgICB7Ci0JCQlpZiAoYXQodG9zLGlkeCkgPT0gJ0AnKQotCQkJICAgIGNvbW1hbmQgPSAxOwotCQkJZWxzZSBpZiAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGlkeCkpCi0JCQkJIHx8IGF0KHRvcyxpZHgpID09ICd9JykKLQkJCSAgICBjb21tYW5kID0gMDsKLQkJCWNhdGNoYXIoJm91dCwgYXQodG9zLCBpZHgpKTsKLQkJCWlkeCsrOwotCQkgICAgfQotCQkgICAgCi0JCX0KLQkJY2F0Y2hhcigmb3V0LCdcbicpOwotCSAgICB9ICAKLQkgICAgd2hpbGUgKGF0KHRvcywgaWR4KSA9PSAnXG4nIAotCQkgICAmJiAoKGF0KHRvcywgaWR4KzEpID09ICcuJykKLQkJICAgICAgIHx8IChhdCh0b3MsaWR4KzEpID09ICd8JykpKQotCSAgICAgIDsKLQkgICAgY2F0dGV4dCgmb3V0LCJAZW5kIGV4YW1wbGUiKTsKLQl9Ci0JZWxzZSAKLQl7ICAgIAotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9ICAgIAotCi0gICAgb3ZlcndyaXRlX3N0cmluZyh0b3MsICZvdXQpOwotICAgIHBjKys7Ci0KLSAgICAKLX0KLQotLyogRmluZHMgYW55IGxpbmVzIHN0YXJ0aW5nIHdpdGggIm8gIiwgaWYgdGhlcmUgYXJlIGFueSwgdGhlbiB0dXJucwotICAgb24gQGl0ZW1pemUgQGJ1bGxldCwgYW5kIEBpdGVtcyBlYWNoIG9mIHRoZW0uIFRoZW4gZW5kcyB3aXRoIEBlbmQKLSAgIGl0ZW1pemUsIGlucGxhY2UgYXQgVE9TKi8KLQotCi1XT1JEKGJ1bGxldGl6ZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBpbnQgb24gPSAwOwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSB7Ci0JaWYgKGF0KHRvcywgaWR4KSA9PSAnQCcgJiYKLQkgICAgYXQodG9zLCBpZHgrMSkgPT0gJyonKSAKLQl7Ci0JICBjYXR0ZXh0KCZvdXQsIioiKTsKLQkgIGlkeCs9MjsKLQl9Ci0JCi0JZWxzZQotCSAgICBpZiAoYXQodG9zLCBpZHgpID09ICdcbicgJiYKLQkJYXQodG9zLCBpZHgrMSkgPT0gJ28nICYmCi0JCWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcywgaWR4ICsyKSkpCi0JICAgIHsKLQkJaWYgKCFvbikgCi0JCXsKLQkJICAgIGNhdHRleHQoJm91dCwiXG5AaXRlbWl6ZSBAYnVsbGV0XG4iKTsKLQkJICAgIG9uID0gMTsKLQkJICAgIAotCQl9Ci0JCWNhdHRleHQoJm91dCwiXG5AaXRlbVxuIik7Ci0JCWlkeCs9MzsKLQkgICAgfQotCSAgICBlbHNlIAotCSAgICB7Ci0JCWNhdGNoYXIoJm91dCwgYXQodG9zLCBpZHgpKTsKLQkJaWYgKG9uICYmIGF0KHRvcywgaWR4KSA9PSAnXG4nICYmCi0JCSAgICBhdCh0b3MsIGlkeCsxKSA9PSAnXG4nICYmCi0JCSAgICBhdCh0b3MsIGlkeCsyKSAhPSAnbycpCi0JCXsKLQkJICAgIGNhdHRleHQoJm91dCwgIkBlbmQgaXRlbWl6ZSIpOwotCQkgICAgb24gPSAwOwotCQl9Ci0JCWlkeCsrOwotCQkKLQkgICAgfQotCX0KLSAgICBpZiAob24pIAotICAgIHsKLQljYXR0ZXh0KCZvdXQsIkBlbmQgaXRlbWl6ZVxuIik7Ci0gICAgfQkKLQotICAgIGRlbGV0ZV9zdHJpbmcodG9zKTsKLSAgICAqdG9zID0gb3V0OwotICAgIHBjKys7Ci0gICAgCi19Ci0KLS8qIFR1cm4gPDxmb28+PiBpbnRvIEBjb2Rle2Zvb30gaW4gcGxhY2UgYXQgVE9TKi8KLSAgIAotCi1XT1JEKGRvX2ZhbmN5X3N0dWZmKQotewotICAgIHVuc2lnbmVkIGludCBpZHggPSAwOwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSAKLSAgICB7Ci0JaWYgKGF0KHRvcywgaWR4KSA9PSAnPCcgCi0JICAgICYmIGF0KHRvcywgaWR4KzEpID09ICc8JwotCSAgICAmJiAhaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGlkeCArIDIpKSkgCi0JewotCSAgICAvKiBUaGlzIHF1YWxpZmllcyBhcyBhIDw8IHN0YXJ0dXAgKi8KLQkgICAgaWR4ICs9MjsKLQkgICAgY2F0dGV4dCgmb3V0LCJAY29kZXsiKTsKLQkgICAgd2hpbGUoYXQodG9zLGlkeCkgJiYKLQkJICBhdCh0b3MsaWR4KSAhPSAnPicgKQotCSAgICB7Ci0JCWNhdGNoYXIoJm91dCwgYXQodG9zLCBpZHgpKTsKLQkJaWR4Kys7Ci0JCQotCSAgICB9Ci0JICAgIGNhdHRleHQoJm91dCwifSIpOwotCSAgICBpZHgrPTI7Ci0JfQotCWVsc2UgCi0JewotCSAgICBjYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JICAgIGlkeCsrOwotCX0KLSAgICB9Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MpOwotICAgICp0b3MgPSBvdXQ7Ci0gICAgcGMrKzsKLSAgICAKLX0KLS8qIEEgY29tbWFuZCBpcyBhbGwgdXBwZXIgY2FzZSxhbmQgYWxvbmUgb24gYSBsaW5lICovCi1zdGF0aWMgaW50IAotREVGVU4oIGlzY29tbWFuZCwocHRyLCBpZHgpLAotICAgICAgc3RyaW5nX3R5cGUgKnB0ciBBTkQKLSAgICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gICAgdW5zaWduZWQgaW50IGxlbiA9IDA7Ci0gICAgd2hpbGUgKGF0KHB0cixpZHgpKSB7Ci0JICAgIGlmIChpc3VwcGVyKCh1bnNpZ25lZCBjaGFyKSBhdChwdHIsaWR4KSkgfHwgYXQocHRyLGlkeCkgPT0gJyAnIHx8Ci0JCWF0KHB0cixpZHgpID09ICdfJykgCi0JICAgIHsKLQkgICAgIGxlbisrOwotCSAgICAgaWR4Kys7Ci0JIH0KLQkgICAgZWxzZSBpZihhdChwdHIsaWR4KSA9PSAnXG4nKQotCSAgICB7Ci0JCWlmIChsZW4gPiAzKSByZXR1cm4gMTsKLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQkgICAgZWxzZSByZXR1cm4gMDsKLQl9Ci0gICAgcmV0dXJuIDA7Ci0KLX0KLQotCi1zdGF0aWMgaW50Ci1ERUZVTihjb3B5X3Bhc3RfbmV3bGluZSwocHRyLCBpZHgsIGRzdCksCi0gICAgICBzdHJpbmdfdHlwZSAqcHRyIEFORAotICAgICAgdW5zaWduZWQgaW50IGlkeCBBTkQKLSAgICAgIHN0cmluZ190eXBlICpkc3QpCi17Ci0gICAgaW50IGNvbHVtbiA9IDA7Ci0KLSAgICB3aGlsZSAoYXQocHRyLCBpZHgpICYmIGF0KHB0ciwgaWR4KSAhPSAnXG4nKSAKLSAgICB7Ci0JaWYgKGF0IChwdHIsIGlkeCkgPT0gJ1x0JykKLQkgIHsKLQkgICAgLyogRXhwYW5kIHRhYnMuICBOZWl0aGVyIG1ha2VpbmZvIG5vciBUZVggY2FuIGNvcGUgd2VsbCB3aXRoCi0JICAgICAgIHRoZW0uICAqLwotCSAgICBkbwotCSAgICAgIGNhdGNoYXIgKGRzdCwgJyAnKTsKLQkgICAgd2hpbGUgKCsrY29sdW1uICYgNyk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBjYXRjaGFyKGRzdCwgYXQocHRyLCBpZHgpKTsKLQkgICAgY29sdW1uKys7Ci0JICB9Ci0JaWR4Kys7Ci0JCi0gICAgfSAgICAKLSAgICBjYXRjaGFyKGRzdCwgYXQocHRyLCBpZHgpKTsKLSAgICBpZHgrKzsKLSAgICByZXR1cm4gaWR4OwotCi19Ci0KLVdPUkQoaWNvcHlfcGFzdF9uZXdsaW5lKQotewotICAgIHRvcysrOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIGluaXRfc3RyaW5nKHRvcyk7Ci0gICAgaWR4ID0gY29weV9wYXN0X25ld2xpbmUocHRyLCBpZHgsIHRvcyk7Ci0gICAgcGMrKzsJCi19Ci0KLS8qIGluZGVudAotICAgVGFrZSB0aGUgc3RyaW5nIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBkbyBzb21lIHByZXR0eWluZyAqLwotCi0KLVdPUkQoa2lsbF9ib2d1c19saW5lcykKLXsKLSAgICBpbnQgc2wgOwotICAgIAotICAgIGludCBpZHggPSAwOwotICAgIGludCBjOwotICAgIGludCBkb3QgPSAwICAgIDsKLSAgICAKLSAgICBzdHJpbmdfdHlwZSBvdXQ7ICAgIAotICAgIGluaXRfc3RyaW5nKCZvdXQpOwotICAgIC8qIERyb3AgbGVhZGluZyBubCAqLwotICAgIHdoaWxlIChhdCh0b3MsaWR4KSA9PSAnXG4nKQotICAgIHsKLQlpZHgrKzsKLSAgICB9Ci0gICAgYyA9IGlkeDsKLSAgICAKLSAgICAvKiBJZiB0aGUgZmlyc3QgY2hhciBpcyBhICcuJyBwcmVwZW5kIGEgbmV3bGluZSBzbyB0aGF0IGl0IGlzCi0gICAgICAgcmVjb2duaXplZCBwcm9wZXJseSBsYXRlci4gICovCi0gICAgaWYgKGF0ICh0b3MsIGlkeCkgPT0gJy4nKQotICAgICAgY2F0Y2hhciAoJm91dCwgJ1xuJyk7Ci0KLSAgICAvKiBGaW5kIHRoZSBsYXN0IGNoYXIgKi8KLSAgICB3aGlsZSAoYXQodG9zLGlkeCkpCi0gICAgewotCWlkeCsrOwotICAgIH0KLSAgICAKLSAgICAvKiBmaW5kIHRoZSBsYXN0IG5vbiB3aGl0ZSBiZWZvcmUgdGhlIG5sICovCi0gICAgaWR4LS07Ci0gICAgCi0gICAgd2hpbGUgKGlkeCAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsaWR4KSkpCi0gICAgIGlkeC0tOwotICAgIGlkeCsrOwotICAgIAotICAgIC8qIENvcHkgYnVmZmVyIHVwdG8gbGFzdCBjaGFyLCBidXQgYmxhbmsgbGluZXMgYmVmb3JlIGFuZCBhZnRlcgotICAgICAgIGRvdHMgZG9uJ3QgY291bnQgKi8KLSAgICBzbCA9IDE7Ci0KLSAgICB3aGlsZSAoYyA8IGlkeCkKLSAgICB7Ci0JaWYgKGF0KHRvcyxjKSA9PSAnXG4nIAotCSAgICAmJiBhdCh0b3MsYysxKSA9PSAnXG4nCi0JICAgICYmIGF0KHRvcyxjKzIpID09ICcuJykgCi0JewotCSAgICAvKiBJZ25vcmUgdHdvIG5ld2xpbmVzIGJlZm9yZSBhIGRvdCovCi0JICAgIGMrKzsKLQl9Ci0JZWxzZSBpZiAoYXQodG9zLGMpID09ICcuJyAmJiBzbCkKLQl7Ci0JICAgIC8qIHJlbWVtYmVyIHRoYXQgdGhpcyBsaW5lIHN0YXJ0ZWQgd2l0aCBhIGRvdCAqLwotCSAgICBkb3Q9MjsKLQl9Ci0JZWxzZSBpZiAoYXQodG9zLGMpID09ICdcbicgCi0JCSAmJiBhdCh0b3MsYysxKSA9PSAnXG4nCi0JCSAmJiBkb3QpCi0JewotCSAgICBjKys7Ci0JICAgIC8qIElnbm9yZSB0d28gbmV3bGluZXMgd2hlbiBsYXN0IGxpbmUgd2FzIGRvdCAqLwotCX0KLQotCWNhdGNoYXIoJm91dCwgYXQodG9zLGMpKTsKLQlpZiAoYXQodG9zLGMpID09ICdcbicpCi0JewotCSAgICBzbCA9IDE7Ci0JICAgIAotCSAgICBpZiAoZG90ID09IDIpZG90PTE7ZWxzZSBkb3QgPSAwOwotCX0KLQllbHNlCi0JICBzbCA9IDA7Ci0JCi0JYysrOwkKLQotICAgIH0KLSAgICAKLSAgICAvKiBBcHBlbmQgbmwqLwotICAgIGNhdGNoYXIoJm91dCwgJ1xuJyk7Ci0gICAgcGMrKzsKLSAgICBkZWxldGVfc3RyaW5nKHRvcyk7Ci0gICAgKnRvcyA9IG91dDsKLSAgICAKLSAgICAKLX0KLQotV09SRChpbmRlbnQpCi17Ci0gICAgc3RyaW5nX3R5cGUgb3V0OwotICAgIGludCB0YWIgPSAwOwotICAgIGludCBpZHggPSAwOwotICAgIGludCBvbCA9MDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICB3aGlsZSAoYXQodG9zLGlkeCkpIHsKLQkgICAgc3dpdGNoIChhdCh0b3MsaWR4KSkgCi0JICAgIHsKLQkgICAgICBjYXNlICdcbic6Ci0JCWNhdHRleHQoJm91dCwiXG4iKTsKLQkJaWR4Kys7Ci0JCWlmICh0YWIgJiYgYXQodG9zLGlkeCkpCi0JCXsKLQkJICAgIGNhdHRleHQoJm91dCwiICAgICIpOwotCQl9Ci0JCW9sID0gMDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnKCc6Ci0JCXRhYisrOwotCQlpZiAob2wgPT0gMCkKLQkJICAgIGNhdHRleHQoJm91dCwiICAgIik7Ci0JCWlkeCsrOwotCQljYXR0ZXh0KCZvdXQsIigiKTsKLQkJb2wgPSAxOwotCQlicmVhazsKLQkgICAgICBjYXNlICcpJzoKLQkJdGFiLS07Ci0JCWNhdHRleHQoJm91dCwiKSIpOwotCQlpZHgrKzsKLQkJb2w9MTsKLQkJCi0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCWNhdGNoYXIoJm91dCxhdCh0b3MsaWR4KSk7Ci0JCW9sPTE7Ci0JCQotCQlpZHgrKzsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9CQotCi0gICAgcGMrKzsKLSAgICBkZWxldGVfc3RyaW5nKHRvcyk7Ci0gICAgKnRvcyA9IG91dDsKLQotfQotCi0KLVdPUkQoZ2V0X3N0dWZmX2luX2NvbW1hbmQpCi17Ci0gICAgdG9zKys7Ci0gICAgY2hlY2tfcmFuZ2UgKCk7Ci0gICAgaW5pdF9zdHJpbmcodG9zKTsKLQotICAgIHdoaWxlIChhdChwdHIsIGlkeCkpIHsKLQkgICAgaWYgKGlzY29tbWFuZChwdHIsIGlkeCkpICBicmVhazsKLQkgICAgaWR4ID0gICBjb3B5X3Bhc3RfbmV3bGluZShwdHIsIGlkeCwgdG9zKTsKLQl9Ci0gICAgcGMrKzsgICAgCi19Ci0KLVdPUkQoc3dhcCkKLXsKLSAgICBzdHJpbmdfdHlwZSB0OwotICAgIAotICAgIHQgPSB0b3NbMF07Ci0gICAgdG9zWzBdID0gdG9zWy0xXTsKLSAgICB0b3NbLTFdID10OyAKLSAgICBwYysrOwotICAgIAotfQotCi1XT1JEKG90aGVyX2R1cCkKLXsKLSAgICB0b3MrKzsKLSAgICBjaGVja19yYW5nZSAoKTsKLSAgICBpbml0X3N0cmluZyh0b3MpOwotICAgIGNhdHN0cih0b3MsIHRvcy0xKTsKLSAgICBwYysrOwotfQotCi1XT1JEKGRyb3ApCi17Ci0gIHRvcy0tOwotICBjaGVja19yYW5nZSAoKTsKLSAgcGMrKzsKLX0KLQotV09SRChpZHJvcCkKLXsKLSAgaXNwLS07Ci0gIGljaGVja19yYW5nZSAoKTsKLSAgcGMrKzsKLX0KLQotV09SRChpY2F0c3RyKQotewotICAgIHRvcy0tOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIGNhdHN0cih0b3MsIHRvcysxKTsKLSAgICBkZWxldGVfc3RyaW5nKHRvcysxKTsKLSAgICBwYysrOwotfQotCi1XT1JEKHNraXBfcGFzdF9uZXdsaW5lKQotewotICAgIHdoaWxlIChhdChwdHIsaWR4KSAKLQkgICAmJiBhdChwdHIsaWR4KSAhPSAnXG4nKQotICAgICBpZHgrKzsKLSAgICBpZHgrKzsKLSAgICBwYysrOwotfQotCi0KLVdPUkQoaW50ZXJuYWxtb2RlKQotewotICAgIGludGVybmFsX21vZGUgPSAqKGlzcCk7Ci0gICAgaXNwLS07Ci0gICAgaWNoZWNrX3JhbmdlICgpOwotICAgIHBjKys7Ci19Ci0KLVdPUkQobWF5YmVjYXRzdHIpCi17Ci0gICAgaWYgKGludGVybmFsX3dhbnRlZCA9PSBpbnRlcm5hbF9tb2RlKSAKLSAgICB7Ci0JY2F0c3RyKHRvcy0xLCB0b3MpOwotICAgIH0KLSAgICBkZWxldGVfc3RyaW5nKHRvcyk7Ci0gICAgdG9zLS07Ci0gICAgY2hlY2tfcmFuZ2UgKCk7Ci0gICAgcGMrKzsKLX0KLQotY2hhciAqCi1ERUZVTihuZXh0d29yZCwoc3RyaW5nLCB3b3JkKSwKLSAgICAgIGNoYXIgKnN0cmluZyBBTkQKLSAgICAgIGNoYXIgKip3b3JkKQotewotICAgIGNoYXIgKndvcmRfc3RhcnQ7Ci0gICAgaW50IGlkeDsKLSAgICBjaGFyICpkc3Q7Ci0gICAgY2hhciAqc3JjOwotICAgIAotICAgIGludCBsZW5ndGggPSAwOwotICAgIAotICAgIHdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqc3RyaW5nKSB8fCAqc3RyaW5nID09ICctJykgewotCSAgICBpZiAoKnN0cmluZyA9PSAnLScpIAotCSAgICB7Ci0JCXdoaWxlICgqc3RyaW5nICYmICpzdHJpbmcgIT0gJ1xuJykgCi0JCSBzdHJpbmcrKzsKLQkJCi0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCSAgICBzdHJpbmcrKzsKLQkJfQotCX0KLSAgICBpZiAoISpzdHJpbmcpIHJldHVybiAwOwotICAgIAotICAgIHdvcmRfc3RhcnQgPSBzdHJpbmc7Ci0gICAgaWYgKCpzdHJpbmcgPT0gJyInKSAKLSAgICAgIHsKLQlkbwotCSAgewotCSAgICBzdHJpbmcrKzsKLQkgICAgbGVuZ3RoKys7Ci0JICAgIGlmICgqc3RyaW5nID09ICdcXCcpCi0JICAgICAgewotCQlzdHJpbmcgKz0gMjsKLQkJbGVuZ3RoICs9IDI7Ci0JICAgICAgfQotCSAgfQotCXdoaWxlICgqc3RyaW5nICE9ICciJyk7Ci0gICAgICB9Ci0gICAgZWxzZSAgICAgCi0gICAgICB7Ci0Jd2hpbGUgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqc3RyaW5nKSkgCi0JewotCSAgICBzdHJpbmcrKzsKLQkgICAgbGVuZ3RoKys7Ci0JCi0JfQotICAgIH0KLSAgICAKLSAgICAqd29yZCA9IG1hbGxvYyhsZW5ndGggKyAxKTsKLQotICAgIGRzdCA9ICp3b3JkOwotICAgIHNyYyA9IHdvcmRfc3RhcnQ7Ci0KLQotICAgIGZvciAoaWR4PSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSAKLSAgICAgIHsKLQlpZiAoc3JjW2lkeF0gPT0gJ1xcJykKLQkgIHN3aXRjaCAoc3JjW2lkeCsxXSkKLQkgICAgewotCSAgICBjYXNlICduJzoKLQkgICAgICAqZHN0KysgPSAnXG4nOwotCSAgICAgIGlkeCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICciJzoKLQkgICAgY2FzZSAnXFwnOgotCSAgICAgICpkc3QrKyA9IHNyY1tpZHgrMV07Ci0JICAgICAgaWR4Kys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgKmRzdCsrID0gJ1xcJzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCWVsc2UKLQkgICpkc3QrKyA9IHNyY1tpZHhdOwotICAgIH0KLSAgICAqZHN0KysgPSAwOwotCi0KLQotCi0KLSAgICBpZigqc3RyaW5nKSAgICAKLSAgICAgcmV0dXJuIHN0cmluZyArIDE7Ci0gICAgZWxzZSAKLSAgICAgcmV0dXJuIDA7Ci0gICAgCi19Ci1kaWN0X3R5cGUgKnJvb3Q7Ci1kaWN0X3R5cGUgKgotREVGVU4obG9va3VwX3dvcmQsKHdvcmQpLAotICAgICAgY2hhciAqd29yZCkKLXsKLSAgZGljdF90eXBlICpwdHIgPSByb290OwotICB3aGlsZSAocHRyKSB7Ci0gICAgICBpZiAoc3RyY21wKHB0ci0+d29yZCwgd29yZCkgPT0gMCkgcmV0dXJuIHB0cjsKLSAgICAgIHB0ciA9IHB0ci0+bmV4dDsKLQkgICAgCi0gICAgfQotICBpZiAod2FybmluZykKLSAgIGZwcmludGYoc3RkZXJyLCJDYW4ndCBmaW5kICVzXG4iLHdvcmQpOwotICByZXR1cm4gMDsKLSAgICAKLSAgICAKLX0KLQotc3RhdGljIHZvaWQgREVGVU5fVk9JRChwZXJmb3JtKQotewotICB0b3MgPSBzdGFjazsKLSAgICAKLSAgd2hpbGUgKGF0KHB0ciwgaWR4KSkgewotICAgICAgLyogSXQncyB3b3J0aCBsb29raW5nIHRocm91Z2ggdGhlIGNvbW1hbmQgbGlzdCAqLwotICAgICAgaWYgKGlzY29tbWFuZChwdHIsIGlkeCkpCi0gICAgICB7Ci0JY2hhciAqbmV4dDsKLQlkaWN0X3R5cGUgKndvcmQgOwotCQkKLQkodm9pZCkJCW5leHR3b3JkKGFkZHIocHRyLCBpZHgpLCAmbmV4dCk7Ci0KLQotCXdvcmQgPSBsb29rdXBfd29yZChuZXh0KTsKLQotCi0JCQotCi0JaWYgKHdvcmQpIAotCXsKLQkgIGV4ZWMod29yZCk7Ci0JfQotCWVsc2UKLQl7Ci0JICBpZiAod2FybmluZykKLQkgICBmcHJpbnRmKHN0ZGVyciwid2FybmluZywgJXMgaXMgbm90IHJlY29nbmlzZWRcbiIsICBuZXh0KTsKLQkgIHNraXBfcGFzdF9uZXdsaW5lKCk7Ci0JfQotCQkKLSAgICAgIH0KLSAgICAgIGVsc2Ugc2tpcF9wYXN0X25ld2xpbmUoKTsKLQotICAgIH0KLX0KLQotZGljdF90eXBlICoKLURFRlVOKG5ld2VudHJ5LCh3b3JkKSwKLSAgICAgIGNoYXIgKndvcmQpCi17Ci0gICAgZGljdF90eXBlICpuZXcgPSAoZGljdF90eXBlICopbWFsbG9jKHNpemVvZihkaWN0X3R5cGUpKTsKLSAgICBuZXctPndvcmQgPSB3b3JkOwotICAgIG5ldy0+bmV4dCA9IHJvb3Q7Ci0gICAgcm9vdCA9IG5ldzsKLSAgICBuZXctPmNvZGUgPSAoc3RpbnN0X3R5cGUgKiltYWxsb2Moc2l6ZW9mKHN0aW5zdF90eXBlICkpOwotICAgIG5ldy0+Y29kZV9sZW5ndGggPSAxOwotICAgIG5ldy0+Y29kZV9lbmQgPSAwOwotICAgIHJldHVybiBuZXc7Ci0gICAgCi19Ci0KLQotdW5zaWduZWQgaW50Ci1ERUZVTihhZGRfdG9fZGVmaW5pdGlvbiwoZW50cnksIHdvcmQpLCAKLSAgICAgIGRpY3RfdHlwZSAqZW50cnkgQU5ECi0gICAgICBzdGluc3RfdHlwZSB3b3JkKQotewotICAgIGlmIChlbnRyeS0+Y29kZV9lbmQgPT0gZW50cnktPmNvZGVfbGVuZ3RoKSAKLSAgICB7Ci0JZW50cnktPmNvZGVfbGVuZ3RoICs9IDI7Ci0JZW50cnktPmNvZGUgPQotCSAoc3RpbnN0X3R5cGUgKikgcmVhbGxvYygoY2hhciAqKShlbnRyeS0+Y29kZSksCi0JCQkgICAgICAgZW50cnktPmNvZGVfbGVuZ3RoICpzaXplb2Yod29yZF90eXBlKSk7Ci0gICAgfQotICAgIGVudHJ5LT5jb2RlW2VudHJ5LT5jb2RlX2VuZF0gPSB3b3JkOwotICAgIAotcmV0dXJuICAgICBlbnRyeS0+Y29kZV9lbmQrKzsgIAotfQotCi0KLQotCi0KLQotCi12b2lkCi1ERUZVTihhZGRfaW50cmluc2ljLChuYW1lLCBmdW5jKSwKLSAgICAgIGNoYXIgKm5hbWUgQU5ECi0gICAgICB2b2lkICgqZnVuYykoKSkKLXsKLSAgICBkaWN0X3R5cGUgKm5ldyA9IG5ld2VudHJ5KG5hbWUpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgZnVuYyk7Ci0gICAgYWRkX3RvX2RlZmluaXRpb24obmV3LCAwKTsKLX0KLQotdm9pZAotREVGVU4oYWRkX3ZhciwobmFtZSksCi0gICAgICBjaGFyICpuYW1lKQotewotICAgIGRpY3RfdHlwZSAqbmV3ID0gbmV3ZW50cnkobmFtZSk7Ci0gICAgYWRkX3RvX2RlZmluaXRpb24obmV3LCBwdXNoX251bWJlcik7Ci0gICAgYWRkX3RvX2RlZmluaXRpb24obmV3LCAoc3RpbnN0X3R5cGUpKCYobmV3LT52YXIpKSk7Ci0gICAgYWRkX3RvX2RlZmluaXRpb24obmV3LDApOwotfQotCi0KLXZvaWQgCi1ERUZVTihjb21waWxlLCAoc3RyaW5nKSwgCi0gICAgICBjaGFyICpzdHJpbmcpCi17Ci0gICAgLyogYWRkIHdvcmRzIHRvIHRoZSBkaWN0aW9uYXJ5ICovCi0gICAgY2hhciAqd29yZDsKLSAgICBzdHJpbmcgPSBuZXh0d29yZChzdHJpbmcsICZ3b3JkKTsKLSAgICB3aGlsZSAoc3RyaW5nICYmICpzdHJpbmcgJiYgd29yZFswXSkgCi0gICAgewotCWlmIChzdHJjbXAod29yZCwidmFyIik9PTApIAotCXsKLSBzdHJpbmc9bmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0JICAKLQkgIGFkZF92YXIod29yZCk7Ci0gc3RyaW5nPW5leHR3b3JkKHN0cmluZywgJndvcmQpOwotCX0KLWVsc2UJCi0JICAgIAotCWlmICh3b3JkWzBdID09ICc6JykKLQl7Ci0JICAgIGRpY3RfdHlwZSAqcHRyOwotCSAgICAvKiBDb21waWxlIGEgd29yZCBhbmQgYWRkIHRvIGRpY3Rpb25hcnkgKi8KLQkgICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0JICAgIAotCSAgICBwdHIgPSBuZXdlbnRyeSh3b3JkKTsKLQkgICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0JICAgIHdoaWxlICh3b3JkWzBdICE9ICc7JyApIAotCSAgICB7Ci0JCSBzd2l0Y2ggKHdvcmRbMF0pIAotCQkgewotCQkgICBjYXNlICciJzoKLQkJICAgICAvKiBnb3QgYSBzdHJpbmcsIGVtYmVkIG1hZ2ljIHB1c2ggc3RyaW5nCi0JCQlmdW5jdGlvbiAqLwotCQkgICAgIGFkZF90b19kZWZpbml0aW9uKHB0ciwgcHVzaF90ZXh0KTsKLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIChzdGluc3RfdHlwZSkod29yZCsxKSk7Ci0JCSAgICAgYnJlYWs7Ci0JCSAgIGNhc2UgJzAnOgotCQkgICBjYXNlICcxJzoKLQkJICAgY2FzZSAnMic6Ci0JCSAgIGNhc2UgJzMnOgotCQkgICBjYXNlICc0JzoKLQkJICAgY2FzZSAnNSc6Ci0JCSAgIGNhc2UgJzYnOgotCQkgICBjYXNlICc3JzoKLQkJICAgY2FzZSAnOCc6Ci0JCSAgIGNhc2UgJzknOgotCQkgICAgIC8qIEdvdCBhIG51bWJlciwgZW1iZWRkIHRoZSBtYWdpYyBwdXNoIG51bWJlcgotCQkJZnVuY3Rpb24gKi8KLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIHB1c2hfbnVtYmVyKTsKLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIChzdGluc3RfdHlwZSlhdG9sKHdvcmQpKTsKLQkJICAgICBicmVhazsKLQkJICAgZGVmYXVsdDoKLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIGNhbGwpOwotCQkgICAgIGFkZF90b19kZWZpbml0aW9uKHB0ciwgKHN0aW5zdF90eXBlKWxvb2t1cF93b3JkKHdvcmQpKTsKLQkJIH0KLQotCQlzdHJpbmcgPSBuZXh0d29yZChzdHJpbmcsICZ3b3JkKTsJCSAgICAgCi0JICAgIH0KLQkgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLDApOwotCSAgICBzdHJpbmcgPSBuZXh0d29yZChzdHJpbmcsICZ3b3JkKTsKLQl9Ci0JZWxzZSAKLQl7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJzeW50YXggZXJyb3IgYXQgJXNcbiIsc3RyaW5nLTEpOwotCX0JICAgIAotICAgIH0KLQotfQotCi0gCi1zdGF0aWMgdm9pZCBERUZVTl9WT0lEKGJhbmcpCi17Ci0gICoobG9uZyAqKSgoaXNwWzBdKSkgPSBpc3BbLTFdOwotICBpc3AtPTI7Ci0gIGljaGVja19yYW5nZSAoKTsKLSAgcGMrKzsKLX0KLQotV09SRChhdHNpZ24pCi17Ci0gICAgaXNwWzBdID0gKihsb25nICopKGlzcFswXSk7Ci0gICAgcGMrKzsKLX0KLQotV09SRChoZWxsbykKLXsKLSAgcHJpbnRmKCJoZWxsb1xuIik7Ci0gIHBjKys7ICAgIAotfQotCi1XT1JEKHN0ZG91dF8pCi17Ci0gIGlzcCsrOwotICBpY2hlY2tfcmFuZ2UgKCk7Ci0gICppc3AgPSAxOwotICBwYysrOwotfQotCi1XT1JEKHN0ZGVycl8pCi17Ci0gIGlzcCsrOwotICBpY2hlY2tfcmFuZ2UgKCk7Ci0gICppc3AgPSAyOwotICBwYysrOwotfQotCi1XT1JEKHByaW50KQotewotICBpZiAoKmlzcCA9PSAxKQotICAgIHdyaXRlX2J1ZmZlciAodG9zLCBzdGRvdXQpOwotICBlbHNlIGlmICgqaXNwID09IDIpCi0gICAgd3JpdGVfYnVmZmVyICh0b3MsIHN0ZGVycik7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICJwcmludDogaWxsZWdhbCBwcmludCBkZXN0aW5hdGlvbiBgJWxkJ1xuIiwgKmlzcCk7Ci0gIGlzcC0tOwotICB0b3MtLTsKLSAgaWNoZWNrX3JhbmdlICgpOwotICBjaGVja19yYW5nZSAoKTsKLSAgcGMrKzsKLX0KLQotCi1zdGF0aWMgdm9pZCBERUZVTihyZWFkX2luLCAoc3RyLCBmaWxlKSwgCi0JICAgc3RyaW5nX3R5cGUgKnN0ciBBTkQKLQkJICBGSUxFICpmaWxlKQotewotICAgIGNoYXIgYnVmZlsxMDAwMF07ICAgIAotICAgIHVuc2lnbmVkIGludCByOwotICAgIGRvIAotICAgIHsKLQlyID0gZnJlYWQoYnVmZiwgMSwgc2l6ZW9mKGJ1ZmYpLCBmaWxlKTsKLQljYXRidWYoc3RyLCBidWZmLCByKTsKLSAgICB9Ci0gICAgd2hpbGUgKHIpOwotICAgIGJ1ZmZbMF0gPSAwOwotICAgIAotICAgIGNhdGJ1ZihzdHIsIGJ1ZmYsMSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgREVGVU5fVk9JRCh1c2FnZSkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwidXNhZ2U6IC1bZHxpfGddIDxmaWxlID5maWxlXG4iKTsKLSAgICBleGl0KDMzKTsgICAgCi19Ci0KLS8qIFRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBkZWNsYXJlIGV4aXQuICBTb21ldGltZXMgaXQgcmV0dXJucwotICAgaW50LCBhbmQgc29tZXRpbWVzIGl0IHJldHVybnMgdm9pZC4gIFNvbWV0aW1lcyBpdCBjaGFuZ2VzIGJldHdlZW4KLSAgIE9TIHJlbGVhc2VzLiAgVHJ5aW5nIHRvIGdldCBpdCBkZWNsYXJlZCBjb3JyZWN0bHkgaW4gdGhlIGhvc3RzIGZpbGUKLSAgIGlzIGEgcG9pbnRsZXNzIHdhc3RlIG9mIHRpbWUuICAqLwotCi1zdGF0aWMgdm9pZAotY2hld19leGl0ICgpCi17Ci0gIGV4aXQgKDApOwotfQotCi1pbnQgREVGVU4obWFpbiwoYWMsYXYpLAotaW50IGFjIEFORAotY2hhciAqYXZbXSkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0cmluZ190eXBlIGJ1ZmZlcjsKLSAgc3RyaW5nX3R5cGUgcHB0cjsKLQotICBpbml0X3N0cmluZygmYnVmZmVyKTsKLSAgaW5pdF9zdHJpbmcoJnBwdHIpOwotICBpbml0X3N0cmluZyhzdGFjayswKTsKLSAgdG9zPXN0YWNrKzE7Ci0gIHB0ciA9ICZwcHRyOwotICAgIAotICBhZGRfaW50cmluc2ljKCJwdXNoX3RleHQiLCBwdXNoX3RleHQpOwotICBhZGRfaW50cmluc2ljKCIhIiwgYmFuZyk7Ci0gIGFkZF9pbnRyaW5zaWMoIkAiLCBhdHNpZ24pOwotICBhZGRfaW50cmluc2ljKCJoZWxsbyIsaGVsbG8pOyAgICAKLSAgYWRkX2ludHJpbnNpYygic3Rkb3V0IixzdGRvdXRfKTsgICAgCi0gIGFkZF9pbnRyaW5zaWMoInN0ZGVyciIsc3RkZXJyXyk7ICAgIAotICBhZGRfaW50cmluc2ljKCJwcmludCIscHJpbnQpOyAgICAKLSAgYWRkX2ludHJpbnNpYygic2tpcF9wYXN0X25ld2xpbmUiLCBza2lwX3Bhc3RfbmV3bGluZSApOwotICBhZGRfaW50cmluc2ljKCJjYXRzdHIiLCBpY2F0c3RyICk7Ci0gIGFkZF9pbnRyaW5zaWMoImNvcHlfcGFzdF9uZXdsaW5lIiwgaWNvcHlfcGFzdF9uZXdsaW5lICk7Ci0gIGFkZF9pbnRyaW5zaWMoImR1cCIsIG90aGVyX2R1cCApOwotICBhZGRfaW50cmluc2ljKCJkcm9wIiwgZHJvcCk7Ci0gIGFkZF9pbnRyaW5zaWMoImlkcm9wIiwgaWRyb3ApOwotICBhZGRfaW50cmluc2ljKCJyZW1jaGFyIiwgcmVtY2hhciApOwotICBhZGRfaW50cmluc2ljKCJnZXRfc3R1ZmZfaW5fY29tbWFuZCIsIGdldF9zdHVmZl9pbl9jb21tYW5kICk7Ci0gIGFkZF9pbnRyaW5zaWMoImRvX2ZhbmN5X3N0dWZmIiwgZG9fZmFuY3lfc3R1ZmYgKTsKLSAgYWRkX2ludHJpbnNpYygiYnVsbGV0aXplIiwgYnVsbGV0aXplICk7Ci0gIGFkZF9pbnRyaW5zaWMoImNvdXJpZXJpemUiLCBjb3VyaWVyaXplICk7Ci0gIC8qIElmIHRoZSBmb2xsb3dpbmcgbGluZSBnaXZlcyBhbiBlcnJvciwgZXhpdCgpIGlzIG5vdCBkZWNsYXJlZCBpbiB0aGUKLSAgICAgLi4vaG9zdHMvZm9vLmggZmlsZSBmb3IgdGhpcyBob3N0LiAgRml4IGl0IHRoZXJlLCBub3QgaGVyZSEgICovCi0gIC8qIE5vLCBkb24ndCBmaXggaXQgYW55d2hlcmU7IHNlZSBjb21tZW50IG9uIGNoZXdfZXhpdC0tSWFuIFRheWxvci4gICovCi0gIGFkZF9pbnRyaW5zaWMoImV4aXQiLCBjaGV3X2V4aXQgKTsKLSAgYWRkX2ludHJpbnNpYygic3dhcCIsIHN3YXAgKTsKLSAgYWRkX2ludHJpbnNpYygib3V0cHV0ZG90cyIsIG91dHB1dGRvdHMgKTsKLSAgYWRkX2ludHJpbnNpYygicGFyYW1zdHVmZiIsIHBhcmFtc3R1ZmYgKTsKLSAgYWRkX2ludHJpbnNpYygibWF5YmVjYXRzdHIiLCBtYXliZWNhdHN0ciApOwotICBhZGRfaW50cmluc2ljKCJ0cmFuc2xhdGVjb21tZW50cyIsIHRyYW5zbGF0ZWNvbW1lbnRzICk7Ci0gIGFkZF9pbnRyaW5zaWMoImtpbGxfYm9ndXNfbGluZXMiLCBraWxsX2JvZ3VzX2xpbmVzKTsKLSAgYWRkX2ludHJpbnNpYygiaW5kZW50IiwgaW5kZW50KTsKLSAgYWRkX2ludHJpbnNpYygiaW50ZXJuYWxtb2RlIiwgaW50ZXJuYWxtb2RlKTsKLSAgYWRkX2ludHJpbnNpYygicHJpbnRfc3RhY2tfbGV2ZWwiLCBwcmludF9zdGFja19sZXZlbCk7Ci0gIGFkZF9pbnRyaW5zaWMoInN0cmlwX3RyYWlsaW5nX25ld2xpbmVzIiwgc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMpOwotICAgIAotICAvKiBQdXQgYSBubCBhdCB0aGUgc3RhcnQgKi8KLSAgY2F0Y2hhcigmYnVmZmVyLCdcbicpOwotCi0gIHJlYWRfaW4oJmJ1ZmZlciwgc3RkaW4pOyAKLSAgcmVtb3ZlX25vbmNvbW1lbnRzKCZidWZmZXIsIHB0cik7Ci0gIGZvciAoaT0gMTsgaSA8ICh1bnNpZ25lZCBpbnQpIGFjOyBpKyspIAotICB7Ci0gICAgaWYgKGF2W2ldWzBdID09ICctJykKLSAgICB7Ci0gICAgICBpZiAoYXZbaV1bMV0gPT0gJ2YnKQotICAgICAgewotCXN0cmluZ190eXBlIGI7Ci0JRklMRSAqZjsKLQlpbml0X3N0cmluZygmYik7Ci0KLQlmICA9IGZvcGVuKGF2W2krMV0sInIiKTsKLQlpZiAoIWYpIAotCXsKLQkgIGZwcmludGYoc3RkZXJyLCJDYW4ndCBvcGVuIHRoZSBpbnB1dCBmaWxlICVzXG4iLGF2W2krMV0pOwotCSAgcmV0dXJuIDMzOwotCX0KLQotCXJlYWRfaW4oJmIsIGYpOwotCWNvbXBpbGUoYi5wdHIpOwotCXBlcmZvcm0oKTsJCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhdltpXVsxXSA9PSAnaScpIAotICAgICAgewotCWludGVybmFsX3dhbnRlZCA9IDE7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhdltpXVsxXSA9PSAndycpIAotICAgICAgewotCXdhcm5pbmcgPSAxOwotICAgICAgfQotICAgICAgZWxzZQotCXVzYWdlICgpOwotICAgIH0KLSAgfSAgICAgIAotICB3cml0ZV9idWZmZXIoc3RhY2srMCwgc3Rkb3V0KTsKLSAgaWYgKHRvcyAhPSBzdGFjaykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJmaW5pc2hpbmcgd2l0aCBjdXJyZW50IHN0YWNrIGxldmVsICVkXG4iLCB0b3MgLSBzdGFjayk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9kb2Muc3RyIGIvYmZkL2RvYy9kb2Muc3RyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTI3NmZlLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvZG9jLnN0cgorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi06IERPQ0RECi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCBraWxsX2JvZ3VzX2xpbmVzIGNhdHN0cgotCTsKLQotOiBFTkRERAotCXNraXBfcGFzdF9uZXdsaW5lCi0JOwotCi06IEVYQU1QTEUKLQlza2lwX3Bhc3RfbmV3bGluZQkKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCBraWxsX2JvZ3VzX2xpbmVzIGRvX2ZhbmN5X3N0dWZmIHRyYW5zbGF0ZWNvbW1lbnRzIAotCWNvdXJpZXJpemUgY2F0c3RyCi0KLQk7Ci0KLTogSU5PREUgCi0JIkBub2RlICIgY2F0c3RyIHNraXBfcGFzdF9uZXdsaW5lIGNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0ciAKLQk7Ci0KLTogQ09ERV9GUkFHTUVOVAotCUVYQU1QTEUgCi0JOwotCi06IENPTU1FTlQKLQlza2lwX3Bhc3RfbmV3bGluZQotCWdldF9zdHVmZl9pbl9jb21tYW5kCi0JZHJvcAotCTsKLQotOiBTWU5PUFNJUwotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkBzdHJvbmd7U3lub3BzaXN9XG4iIGNhdHN0cgotCSJAZXhhbXBsZVxuIiBjYXRzdHIKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCAgCi0Ja2lsbF9ib2d1c19saW5lcwotCWluZGVudAotCWNhdHN0cgotCSJAZW5kIGV4YW1wbGVcbiIgY2F0c3RyCi0KLQk7Ci0KLTogZnVuYwotCSJAZmluZGV4ICIJLSBhCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZQotCWR1cAkJLSBhIHggeCAKLQkiQHN1YnN1YnNlY3Rpb24gQGNvZGV7IiAtIGEgeCB4IGIgCi0Jc3dhcAotCXJlbWNoYXIKLQkifVxuIiAtIGEgeCBiIHggYwotCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAotCTsKLQotOiBGVU5DVElPTgotCSJAZmluZGV4ICIJLSBhCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZQotCWR1cAkJLSBhIHggeCAKLQkiQHN1YnN1YnNlY3Rpb24gQGNvZGV7IiAtIGEgeCB4IGIgCi0Jc3dhcAotCXJlbWNoYXIKLQkifVxuIiAtIGEgeCBiIHggYwotCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAotCTsKLQotOiBib2R5dGV4dAotCWdldF9zdHVmZl9pbl9jb21tYW5kIAotCWJ1bGxldGl6ZQotCWtpbGxfYm9ndXNfbGluZXMKLQlkb19mYW5jeV9zdHVmZgotCWNvdXJpZXJpemUKLQljYXRzdHIKLQkiXG4iIGNhdHN0cgotCTsKLQotOiBhc2VjdGlvbgotCXNraXBfcGFzdF9uZXdsaW5lCi0JY2F0c3RyCi0JY29weV9wYXN0X25ld2xpbmUgCQotCWRvX2ZhbmN5X3N0dWZmIGNhdHN0ciAJCi0JYm9keXRleHQJCi0JOwotCi06IFNFQ1RJT04gCi0JIkBzZWN0aW9uICIgYXNlY3Rpb24gIDsKLQotOiBTVUJTRUNUSU9OCi0JIkBzdWJzZWN0aW9uICIgYXNlY3Rpb24gIDsKLQotOiBTVUJTVUJTRUNUSU9OCi0JIkBzdWJzdWJzZWN0aW9uICIgYXNlY3Rpb24gIDsKLQotOiBzdWJoZWFkCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlib2R5dGV4dAotCTsKLQotCi0KLQkKLTogREVTQ1JJUFRJT04gCi0JIkBzdHJvbmd7RGVzY3JpcHRpb259QCpcbiIgY2F0c3RyIHN1YmhlYWQgOwotCi06IFJFVFVSTlMKLQkiQHN0cm9uZ3tSZXR1cm5zfUAqXG4iIGNhdHN0ciBzdWJoZWFkIDsKLQotOiBJTlRFUk5BTF9GVU5DVElPTgotCWZ1bmMgOwotCi0KLTogSU5URVJOQUxfREVGSU5JVElPTiAKLQlmdW5jIDsKLQotCi06IElOVEVSTkFMCi0JZnVuYyA7Ci0KLTogVFlQRURFRgotCUZVTkNUSU9OIDsKLQotOiBTRU5VTQotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkhlcmUgYXJlIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIEBjb2Rle2VudW0gIgotCWNvcHlfcGFzdF9uZXdsaW5lIHJlbWNoYXIgY2F0c3RyCi0JIn06XG5cbiIgY2F0c3RyIGNhdHN0cgotCTsKLTogRU5VTQotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkBkZWZmbiB7fSAiCi0JY29weV9wYXN0X25ld2xpbmUgY2F0c3RyIGNhdHN0cgotCTsKLTogRU5VTVgKLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAZGVmZm54IHt9ICIKLQljb3B5X3Bhc3RfbmV3bGluZSBjYXRzdHIKLQljYXRzdHIKLQk7Ci06IEVOVU1FUQotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkBkZWZmbiB7fSAiCi0JY29weV9wYXN0X25ld2xpbmUgY2F0c3RyIGNhdHN0cgotCXNraXBfcGFzdF9uZXdsaW5lCi0JOwotOiBFTlVNRVFYCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQkiQGRlZmZueCB7fSAiCi0JY29weV9wYXN0X25ld2xpbmUgY2F0c3RyCi0JY2F0c3RyCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQk7Ci06IEVOVU1ET0MKLQlza2lwX3Bhc3RfbmV3bGluZQotCWdldF9zdHVmZl9pbl9jb21tYW5kCi0Jc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMKLQljYXRzdHIKLQkiXG5AZW5kIGRlZmZuXG4iIGNhdHN0cgotCTsKZGlmZiAtLWdpdCBhL2JmZC9kb2MvbWFrZWZpbGUudm1zIGIvYmZkL2RvYy9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODU3YzAuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUNGTEFHUyA9IC9ub29wdC9pbmNsdWRlPShbXSxbLV0sWy0uLS5pbmNsdWRlXSkKLUxERkxBR1MgPSAvbm9tYXAKLUxETElCUyA9ICxzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCi0KLWFsbDogY2hldy5leGUKZGlmZiAtLWdpdCBhL2JmZC9kb2MvcHJvdG8uc3RyIGIvYmZkL2RvYy9wcm90by5zdHIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MzFjMTYuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9wcm90by5zdHIKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotCi06IFNZTk9QU0lTCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAkKLQlwYXJhbXN0dWZmCi0JaW5kZW50Ci0JbWF5YmVjYXRzdHIKLTsKLQotOiBpZ25vcmUKLQlza2lwX3Bhc3RfbmV3bGluZSAKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCW91dHB1dGRvdHMKLQltYXliZWNhdHN0cgotCTsKLQotOiBDT0RFX0ZSQUdNRU5UCi0JaWdub3JlIDsKLQotOiBleHRlcm5hbAotCTAgaW50ZXJuYWxtb2RlIGlnbm9yZSA7Ci0KLTogaW50ZXJuYWwgCi0JMSBpbnRlcm5hbG1vZGUgaWdub3JlIDsKLQotLSBpbnB1dCBzdGFjayB7IGEgYiB9IG91dHB1dCBiIGlmIGludGVybmFsLCBhIGlmIGV4dGVybmFsCi06IGlmaW50ZXJuYWwKLQkiIiBzd2FwIDEgaW50ZXJuYWxtb2RlIG1heWJlY2F0c3RyCi0Jc3dhcAotCSIiIHN3YXAgMCBpbnRlcm5hbG1vZGUgbWF5YmVjYXRzdHIKLQljYXRzdHIKLQk7Ci0KLS0gUHV0IG5vdGUgaW4gb3V0cHV0IHN0cmluZywgcmVnYXJkbGVzcyBvZiBpbnRlcm5hbCBtb2RlLgotOiBDT01NRU5UCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCXRyYW5zbGF0ZWNvbW1lbnRzCi0JY2F0c3RyCi0JOwotCi0tIFNFTlVNICAgIGVudW0tdHlwZS1uYW1lCi0tIEVOVU0gICAgIGVudW0tbmFtZQotLSBFTlVNWCAgICBhZGRsLWVudW0tbmFtZQotLSBFTlVNRE9DICBkb2MgZm9yIHByZWNlZGluZyBlbnVtcwotLSBFTkRTRU5VTSBtYXgtZW51bS1uYW1lCi0KLTogbWFrZV9lbnVtX2hlYWRlcgotCWR1cAotCSJlbnVtICIgc3dhcCBjYXRzdHIKLQkiIHtcbiIgY2F0c3RyCi0Jc3dhcCAiICBfZHVtbXlfZmlyc3RfIiBzd2FwIGNhdHN0ciBjYXRzdHIKLQkiLFxuIiBjYXRzdHIKLQk7Ci06IG1ha2Vfc3RyaW5nX3RhYmxlX2hlYWRlcgotCWR1cAotCSIjaWZkZWYgX0JGRF9NQUtFX1RBQkxFXyIgc3dhcCBjYXRzdHIgc3dhcAotCSJcblxuc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0ICIgc3dhcCBjYXRzdHIgY2F0c3RyCi0JIl9uYW1lc1tdID0geyBcIkBAdW5pbml0aWFsaXplZEBAXCIsXG4iIGNhdHN0cgotCTsKLTogU0VOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCWNvcHlfcGFzdF9uZXdsaW5lCi0JcmVtY2hhcgotCWR1cAotCW1ha2VfZW51bV9oZWFkZXIKLQlzd2FwCi0JbWFrZV9zdHJpbmdfdGFibGVfaGVhZGVyCi0JaWZpbnRlcm5hbAotCWNhdHN0cgotCWdldF9zdHVmZl9pbl9jb21tYW5kIGNhdHN0cgotCXRyYW5zbGF0ZWNvbW1lbnRzIDsKLTogRU5EU0VOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCWNvcHlfcGFzdF9uZXdsaW5lIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzCi0JZHVwCi0JIiAgIiBzd2FwIGNhdHN0ciAiIH07XG4iIGNhdHN0cglzd2FwCi0JIiBcIkBAb3ZlcmZsb3c6ICIgc3dhcCBjYXRzdHIgIkBAXCIsXG59O1xuI2VuZGlmXG5cbiIgY2F0c3RyCi0JaWZpbnRlcm5hbAotCWNhdHN0cgotCTsKLTogbWFrZV9lbnVtZXJhdG9yCi0JIiAgIiBzd2FwIGNhdHN0cgotCSIsXG4iIGNhdHN0cgotCTsKLTogbWFrZV9lbnVtZXJhdG9yX3N0cmluZwotCSIgIFwiIiBzd2FwIGNhdHN0cgotCSJcIixcbiIgY2F0c3RyCi0JOwotOiBFTlVNCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZQotCXJlbWNoYXIKLQlkdXAKLQltYWtlX2VudW1lcmF0b3IKLQlzd2FwCi0JbWFrZV9lbnVtZXJhdG9yX3N0cmluZwotCWlmaW50ZXJuYWwKLQk7Ci06IEVOVU1YIEVOVU0gY2F0c3RyIDsKLTogRU5VTUVRCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQkiI2RlZmluZSAiCi0JY29weV9wYXN0X25ld2xpbmUgcmVtY2hhcgotCWNhdHN0cgotCSIgIgotCWNhdHN0cgotCWNvcHlfcGFzdF9uZXdsaW5lCi0JY2F0c3RyCi0JIiIgc3dhcCAwIGludGVybmFsbW9kZSBtYXliZWNhdHN0cgotCTsKLTogRU5VTUVRWCBFTlVNRVEgY2F0c3RyIDsKLTogRU5VTURPQwotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQlzdHJpcF90cmFpbGluZ19uZXdsaW5lcwotCSJcbnsqICIgc3dhcCBjYXRzdHIgIiAqfVxuIiBjYXRzdHIKLQl0cmFuc2xhdGVjb21tZW50cwotCS0gZGlzY2FyZCBpdCBpZiB3ZSdyZSBkb2luZyBpbnRlcm5hbCBtb2RlCi0JIiIgc3dhcCAwIGludGVybmFsbW9kZSBtYXliZWNhdHN0cgotCXN3YXAKLQljYXRzdHIgY2F0c3RyCi0JOwotOiBFTkRERCBleHRlcm5hbCA7Ci06IFNFQ1RJT04gaWdub3JlIDsKLTogU1VCU0VDVElPTiBpZ25vcmUgOwotOiBTVUJTVUJTRUNUSU9OIGlnbm9yZSA7Ci06IElOVEVSTkFMX0RFRklOSVRJT04gaW50ZXJuYWwgOwotOiBERVNDUklQVElPTiBpZ25vcmUgOwotOiBGVU5DVElPTiBleHRlcm5hbCA7Ci06IFJFVFVSTlMgaWdub3JlIDsKLTogVFlQRURFRiBleHRlcm5hbCA7Ci06IElOVEVSTkFMX0ZVTkNUSU9OIGludGVybmFsIDsKLTogSU5URVJOQUwgaW50ZXJuYWwgOwotOiBJTk9ERSBpZ25vcmUgOwpkaWZmIC0tZ2l0IGEvYmZkL2R3YXJmMS5jIGIvYmZkL2R3YXJmMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTE4NGNjLi4wMDAwMDAwCi0tLSBhL2JmZC9kd2FyZjEuYworKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi0vKiBEV0FSRiAxIGZpbmQgbmVhcmVzdCBsaW5lIChfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSkuCi0gICBDb3B5cmlnaHQgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotV3JpdHRlbiBieSBHYXZpbiBSb21pZy1Lb2NoIG9mIEN5Z251cyBTb2x1dGlvbnMgKGdhdmluQGN5Z251cy5jb20pLiAgCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvZHdhcmYuaCIKLQotLyogZHdhcmYxX2RlYnVnIGlzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgYWxsIGR3YXJmMSBpbmZvLiAqLwotCi1zdHJ1Y3QgZHdhcmYxX2RlYnVnIHsKLQotICAvKiBUaGUgYmZkIHdlIGFyZSB3b3JraW5nIHdpdGguICovCi0gIGJmZCogYWJmZDsKLQotICAvKiBMaXN0IG9mIGFscmVhZHkgcGFyc2VkIGNvbXBpbGF0aW9uIHVuaXRzLiAqLwotICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGxhc3RVbml0OwotCi0gIC8qIFRoZSBidWZmZXIgZm9yIHRoZSAuZGVidWcgc2VjdGlvbi4gCi0gICAgIFplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIC5kZWJ1ZyBzZWN0aW9uIGZhaWxlZCB0byBsb2FkLiAqLwotICBjaGFyKiBkZWJ1Z19zZWN0aW9uOwotCi0gIC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBtZW1vcnkgYnVmZmVyLiAqLwotICBjaGFyKiBkZWJ1Z19zZWN0aW9uX2VuZDsKLQotICAvKiBUaGUgYnVmZmVyIGZvciB0aGUgLmxpbmUgc2VjdGlvbi4gKi8KLSAgY2hhciogbGluZV9zZWN0aW9uOwotCi0gIC8qIEVuZCBvZiB0aGF0IGJ1ZmZlci4gKi8KLSAgY2hhciogbGluZV9zZWN0aW9uX2VuZDsKLQotICAvKiBUaGUgY3VycmVudCBvciBuZXh0IHVucmVhZCBkaWUgd2l0aGluIHRoZSAuZGVidWcgc2VjdGlvbi4gKi8KLSAgY2hhciogY3VycmVudERpZTsKLX07Ci0KLS8qIE9uZSBkd2FyZjFfdW5pdCBmb3IgZWFjaCBwYXJzZWQgY29tcGlsYXRpb24gdW5pdCBkaWUuICovCi0KLXN0cnVjdCBkd2FyZjFfdW5pdCB7Ci0gIC8qIExpbmtlZCBzdGFydGluZyBmcm9tIHN0YXNoLT5sYXN0VW5pdC4gKi8KLSAgc3RydWN0IGR3YXJmMV91bml0KiBwcmV2OwotCi0gIC8qIE5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCi0gIGNoYXIqIG5hbWU7Ci0KLSAgLyogVGhlIGhpZ2hlc3QgYW5kIGxvd2VzdCBhZGRyZXNzIHVzZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCi0gIHVuc2lnbmVkIGxvbmcgbG93X3BjOwotICB1bnNpZ25lZCBsb25nIGhpZ2hfcGM7Ci0KLSAgLyogRG9lcyB0aGlzIHVuaXQgaGF2ZSBhIHN0YXRlbWVudCBsaXN0PyAqLwotICBpbnQgaGFzX3N0bXRfbGlzdDsKLQotICAvKiBJZiBhbnksIHRoZSBvZmZzZXQgb2YgdGhlIGxpbmUgbnVtYmVyIHRhYmxlIGluIHRoZSAubGluZSBzZWN0aW9uLiAqLwotICB1bnNpZ25lZCBsb25nIHN0bXRfbGlzdF9vZmZzZXQ7Ci0KLSAgLyogSWYgbm9uLXplcm8sIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hpbGQgb2YgdGhpcyB1bml0LiAqLwotICBjaGFyKiBmaXJzdF9jaGlsZDsKLQotICAvKiBIb3cgbWFueSBsaW5lIGVudHJpZXM/ICovCi0gIHVuc2lnbmVkIGxvbmcgbGluZV9jb3VudDsKLQotICAvKiBUaGUgZGVjb2RlZCBsaW5lIG51bWJlciB0YWJsZSAobGluZV9jb3VudCBlbnRyaWVzKS4gKi8KLSAgc3RydWN0IGxpbmVudW1iZXIqIGxpbmVudW1iZXJfdGFibGU7Ci0KLSAgLyogVGhlIGxpc3Qgb2YgZnVuY3Rpb25zIGluIHRoaXMgdW5pdC4gKi8KLSAgc3RydWN0IGR3YXJmMV9mdW5jKiBmdW5jX2xpc3Q7Ci19OwotCi0KLQotLyogT25lIGR3YXJmMV9mdW5jIGZvciBlYWNoIHBhcnNlZCBmdW5jdGlvbiBkaWUuICAqLwotCi1zdHJ1Y3QgZHdhcmYxX2Z1bmMgewotICAvKiBMaW5rZWQgc3RhcnRpbmcgZnJvbSBhVW5pdC0+ZnVuY19saXN0LiAqLwotICBzdHJ1Y3QgZHdhcmYxX2Z1bmMqIHByZXY7Ci0gIAotICAvKiBOYW1lIG9mIGZ1bmN0aW9uLiAqLwotICBjaGFyKiBuYW1lOwotICAKLSAgLyogVGhlIGhpZ2hlc3QgYW5kIGxvd2VzdCBhZGRyZXNzIHVzZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCi0gIHVuc2lnbmVkIGxvbmcgbG93X3BjOwotICB1bnNpZ25lZCBsb25nIGhpZ2hfcGM7Ci19OwotCi0KLS8qIFVzZWQgdG8gcmV0dXJuIGluZm8gYWJvdXQgYSBwYXJzZWQgZGllLiAqLwotc3RydWN0IGRpZV9pbmZvIHsKLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIHVuc2lnbmVkIGxvbmcgc2libGluZzsKLSAgdW5zaWduZWQgbG9uZyBsb3dfcGM7Ci0gIHVuc2lnbmVkIGxvbmcgaGlnaF9wYzsKLSAgdW5zaWduZWQgbG9uZyBzdG10X2xpc3Rfb2Zmc2V0OwotICAKLSAgY2hhciogbmFtZTsgCi0gIAotICBpbnQgaGFzX3N0bXRfbGlzdDsKLQotICB1bnNpZ25lZCBzaG9ydCB0YWc7Ci19OwotCi0KLS8qIFBhcnNlZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gKi8KLXN0cnVjdCBsaW5lbnVtYmVyIHsKLSAgLyogRmlyc3QgYWRkcmVzcyBpbiB0aGUgbGluZS4gKi8KLSAgdW5zaWduZWQgbG9uZyBhZGRyOwotCi0gIC8qIFRoZSBsaW5lIG51bWJlci4gKi8KLSAgdW5zaWduZWQgbG9uZyBsaW5lbnVtYmVyOwotfTsKLQotCi0vKiBGaW5kIHRoZSBmb3JtIG9mIGFuIGF0dHIsIGZyb20gdGhlIGF0dHIgZmllbGQuICovCi0jZGVmaW5lIEZPUk1fRlJPTV9BVFRSKGF0dHIpCSgoYXR0cikgJiAweEYpCS8qIEltcGxpY2l0bHkgc3BlY2lmaWVkICovCi0KLQotLyogUmV0dXJuIGEgbmV3bHkgYWxsb2NhdGVkIGR3YXJmMV91bml0LiAgSXQgc2hvdWxkIGJlIGNsZWFyZWQgYW5kCi0gICB0aGVuIGF0dGFjaGVkIGludG8gdGhlICdzdGFzaCcgYXQgJ3N0YXNoLT5sYXN0VW5pdCcuICovCi0KLXN0YXRpYyBzdHJ1Y3QgZHdhcmYxX3VuaXQqCi1hbGxvY19kd2FyZjFfdW5pdCAoc3Rhc2gpCi0gIHN0cnVjdCBkd2FyZjFfZGVidWcqIHN0YXNoOwotewotICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIHggPSAKLSAgICAoc3RydWN0IGR3YXJmMV91bml0KikgYmZkX3phbGxvYyAoc3Rhc2gtPmFiZmQsIAotCQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGR3YXJmMV91bml0KSk7Ci0gIHgtPnByZXYgPSBzdGFzaC0+bGFzdFVuaXQ7Ci0gIHN0YXNoLT5sYXN0VW5pdCA9IHg7Ci0KLSAgcmV0dXJuIHg7Ci19Ci0KLS8qIFJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBkd2FyZjFfZnVuYy4gIEl0IG11c3QgYmUgY2xlYXJlZCBhbmQKLSAgIGF0dGFjaGVkIGludG8gJ2FVbml0JyBhdCAnYVVuaXQtPmZ1bmNfbGlzdCcuICovCi0KLXN0YXRpYyBzdHJ1Y3QgZHdhcmYxX2Z1bmMqCi1hbGxvY19kd2FyZjFfZnVuYyAoc3Rhc2gsIGFVbml0KQotICAgICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLSAgICAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdDsKLXsKLSAgc3RydWN0IGR3YXJmMV9mdW5jKiB4ID0gCi0gICAgKHN0cnVjdCBkd2FyZjFfZnVuYyopIGJmZF96YWxsb2MgKHN0YXNoLT5hYmZkLCAKLQkJCQkgICAgICBzaXplb2YgKHN0cnVjdCBkd2FyZjFfZnVuYykpOwotICB4LT5wcmV2ID0gYVVuaXQtPmZ1bmNfbGlzdDsKLSAgYVVuaXQtPmZ1bmNfbGlzdCA9IHg7Ci0gIAotICByZXR1cm4geDsKLX0KLQotLyogcGFyc2VfZGllIC0gcGFyc2UgYSBEd2FyZjEgZGllLgotICAgUGFyc2UgdGhlIGRpZSBzdGFydGluZyBhdCAnYURpZVB0cicgaW50byAnYURpZUluZm8nLgotICAgJ2FiZmQnIG11c3QgYmUgdGhlIGJmZCBmcm9tIHdoaWNoIHRoZSBzZWN0aW9uIHRoYXQgJ2FEaWVQdHInCi0gICBwb2ludHMgdG8gd2FzIHB1bGxlZCBmcm9tLiAKLQotICAgUmV0dXJuIGZhbHNlIGlmIHRoZSBkaWUgaXMgaW52YWxpZGx5IGZvcm1hdHRlZDsgdHJ1ZSBvdGhlcndpc2UuICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9kaWUgKGFiZmQsIGFEaWVJbmZvLCBhRGllUHRyKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIHN0cnVjdCBkaWVfaW5mbyogYURpZUluZm87Ci0gICAgIGNoYXIqICAgICAgICAgICAgYURpZVB0cjsKLXsKLSAgY2hhciogdGhpc19kaWUgPSBhRGllUHRyOwotICBjaGFyKiB4cHRyID0gdGhpc19kaWU7Ci0KLSAgbWVtc2V0IChhRGllSW5mbywwLHNpemVvZigqYURpZUluZm8pKTsKLQotICAvKiBGaXJzdCBjb21lcyB0aGUgbGVuZ3RoLiAqLwotICBhRGllSW5mby0+bGVuZ3RoID0gYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7Ci0gIHhwdHIgKz0gNDsKLSAgaWYgKGFEaWVJbmZvLT5sZW5ndGggPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChhRGllSW5mby0+bGVuZ3RoIDwgNikKLSAgICB7Ci0gICAgICAvKiBKdXN0IHBhZGRpbmcgYnl0ZXMuICovCi0gICAgICBhRGllSW5mby0+dGFnID0gVEFHX3BhZGRpbmc7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhlbiB0aGUgdGFnLiAqLwotICBhRGllSW5mby0+dGFnID0gYmZkX2dldF8xNiAoYWJmZCwgeHB0cik7Ci0gIHhwdHIgKz0gMjsKLSAgICAgIAotICAvKiBUaGVuIHRoZSBhdHRyaWJ1dGVzLiAqLwotICB3aGlsZSAoeHB0ciA8ICh0aGlzX2RpZSArIGFEaWVJbmZvLT5sZW5ndGgpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGF0dHI7Ci0gICAgICAKLSAgICAgIC8qIFBhcnNlIHRoZSBhdHRyaWJ1dGUgYmFzZWQgb24gaXRzIGZvcm0uICBUaGlzIHNlY3Rpb24gCi0gICAgICAgICBtdXN0IGhhbmRsZSBhbGwgZHdhcmYxIGZvcm1zLCBidXQgbmVlZCBvbmx5IGhhbmRsZSB0aGUKLQkgYWN0dWFsIGF0dHJpYnV0ZXMgdGhhdCB3ZSBjYXJlIGFib3V0LiAqLwotCi0gICAgICBhdHRyID0gYmZkX2dldF8xNiAoYWJmZCwgeHB0cik7Ci0gICAgICB4cHRyICs9IDI7Ci0gICAgICAKLSAgICAgIHN3aXRjaCAoRk9STV9GUk9NX0FUVFIgKGF0dHIpKQotCXsKLQljYXNlIEZPUk1fREFUQTI6Ci0JICB4cHRyICs9IDI7Ci0JICBicmVhazsKLQljYXNlIEZPUk1fREFUQTQ6Ci0JY2FzZSBGT1JNX1JFRjoKLQkgIGlmIChhdHRyID09IEFUX3NpYmxpbmcpCi0JICAgIGFEaWVJbmZvLT5zaWJsaW5nID0gYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7Ci0JICBlbHNlIGlmIChhdHRyID09IEFUX3N0bXRfbGlzdCkKLQkgICAgewotCSAgICAgIGFEaWVJbmZvLT5zdG10X2xpc3Rfb2Zmc2V0ID0gYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7Ci0JICAgICAgYURpZUluZm8tPmhhc19zdG10X2xpc3QgPSAxOwotCSAgICB9Ci0JICB4cHRyICs9IDQ7Ci0JICBicmVhazsKLQljYXNlIEZPUk1fREFUQTg6Ci0JICB4cHRyICs9IDg7Ci0JICBicmVhazsKLQljYXNlIEZPUk1fQUREUjoKLQkgIGlmIChhdHRyID09IEFUX2xvd19wYykKLQkgICAgYURpZUluZm8tPmxvd19wYyA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgZWxzZSBpZiAoYXR0ciA9PSBBVF9oaWdoX3BjKQotCSAgICBhRGllSW5mby0+aGlnaF9wYyA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgeHB0ciArPSA0OwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0JMT0NLMjoKLQkgIHhwdHIgKz0gMiArIGJmZF9nZXRfMTYgKGFiZmQsIHhwdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0JMT0NLNDoKLQkgIHhwdHIgKz0gNCArIGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX1NUUklORzoKLQkgIGlmIChhdHRyID09IEFUX25hbWUpCi0JICAgIGFEaWVJbmZvLT5uYW1lID0geHB0cjsKLQkgIHhwdHIgKz0gc3RybGVuICh4cHRyKSArIDE7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIGR3YXJmMSBsaW5lIG51bWJlciB0YWJsZSBmb3IgJ2FVbml0LT5zdG10X2xpc3Rfb2Zmc2V0JwotICAgaW50byAnYVVuaXQtPmxpbmVudW1iZXJfdGFibGUnLiAgUmV0dXJuIGZhbHNlIGlmIGFuIGVycm9yIAotICAgb2NjdXJzOyB0cnVlIG90aGVyd2lzZS4gKi8KLSAgCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfbGluZV90YWJsZSAoc3Rhc2gsIGFVbml0KQotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLSAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdDsKLXsKLSAgY2hhciogeHB0cjsKLQotICAvKiBMb2FkIHRoZSAiLmxpbmUiIHNlY3Rpb24gZnJvbSB0aGUgYmZkIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS4gKi8gCi0gIGlmIChzdGFzaC0+bGluZV9zZWN0aW9uID09IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKm1zZWM7Ci0gICAgICB1bnNpZ25lZCBsb25nIHNpemU7Ci0gICAgICAKLSAgICAgIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rhc2gtPmFiZmQsICIubGluZSIpOwotICAgICAgaWYgKCEgbXNlYykKLQlyZXR1cm4gZmFsc2U7Ci0JICAKLSAgICAgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOwotICAgICAgc3Rhc2gtPmxpbmVfc2VjdGlvbiA9ICh1bnNpZ25lZCBjaGFyKikgYmZkX2FsbG9jIChzdGFzaC0+YWJmZCwgc2l6ZSk7Ci0gICAgICAKLSAgICAgIGlmICghIHN0YXNoLT5saW5lX3NlY3Rpb24pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHN0YXNoLT5hYmZkLCBtc2VjLCBzdGFzaC0+bGluZV9zZWN0aW9uLCAwLCBzaXplKSkKLQl7Ci0JICBzdGFzaC0+bGluZV9zZWN0aW9uID0gMDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN0YXNoLT5saW5lX3NlY3Rpb25fZW5kID0gc3Rhc2gtPmxpbmVfc2VjdGlvbiArIHNpemU7Ci0gICAgfQotCi0gIHhwdHIgPSBzdGFzaC0+bGluZV9zZWN0aW9uICsgYVVuaXQtPnN0bXRfbGlzdF9vZmZzZXQ7Ci0gIGlmICh4cHRyIDwgc3Rhc2gtPmxpbmVfc2VjdGlvbl9lbmQpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBlYWNoTGluZTsKLQotICAgICAgY2hhciogdGJsZW5kOwotICAgICAgdW5zaWduZWQgbG9uZyBiYXNlOwotCi0gICAgICAvKiBGaXJzdCBjb21lcyB0aGUgbGVuZ3RoLiAqLwotICAgICAgdGJsZW5kID0gYmZkX2dldF8zMiAoc3Rhc2gtPmFiZmQsIHhwdHIpICsgeHB0cjsKLSAgICAgIHhwdHIgKz0gNDsKLQotICAgICAgLyogVGhlbiB0aGUgYmFzZSBhZGRyZXNzIGZvciBlYWNoIGFkZHJlc3MgaW4gdGhlIHRhYmxlLiAqLwotICAgICAgYmFzZSA9IGJmZF9nZXRfMzIgKHN0YXNoLT5hYmZkLCB4cHRyKTsKLSAgICAgIHhwdHIgKz0gNDsKLQotICAgICAgLyogSG93IG1hbnkgbGluZSBlbnRyeXM/Ci0JIDEwID0gNCAobGluZSBudW1iZXIpICsgMiAocG9zIGluIGxpbmUpICsgNCAoYWRkcmVzcyBpbiBsaW5lKSAqLwotICAgICAgYVVuaXQtPmxpbmVfY291bnQgPSAodGJsZW5kIC0geHB0cikgLyAxMDsKLQotICAgICAgLyogQWxsb2NhdGUgYW4gYXJyYXkgZm9yIHRoZSBlbnRyaWVzLiAqLwotICAgICAgYVVuaXQtPmxpbmVudW1iZXJfdGFibGUgPSAoc3RydWN0IGxpbmVudW1iZXIqKQotCWJmZF9hbGxvYyAoc3Rhc2gtPmFiZmQsIAotCQkgICBzaXplb2YgKHN0cnVjdCBsaW5lbnVtYmVyKSAqIGFVbml0LT5saW5lX2NvdW50KTsKLQkKLSAgICAgIGZvciAoZWFjaExpbmUgPSAwOyBlYWNoTGluZSA8IGFVbml0LT5saW5lX2NvdW50OyBlYWNoTGluZSsrKQotCXsKLQkgIC8qIEEgbGluZSBudW1iZXIuICovCi0JICBhVW5pdC0+bGluZW51bWJlcl90YWJsZVtlYWNoTGluZV0ubGluZW51bWJlcgotCSAgICA9IGJmZF9nZXRfMzIgKHN0YXNoLT5hYmZkLCB4cHRyKTsKLQkgIHhwdHIgKz0gNDsKLQotCSAgLyogU2tpcCB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBsaW5lLiAqLwotCSAgeHB0ciArPSAyOwotCi0JICAvKiBBbmQgZmluYWxseSB0aGUgYWRkcmVzcy4gKi8KLQkgIGFVbml0LT5saW5lbnVtYmVyX3RhYmxlW2VhY2hMaW5lXS5hZGRyIAotCSAgICA9IGJhc2UgKyBiZmRfZ2V0XzMyIChzdGFzaC0+YWJmZCwgeHB0cik7Ci0JICB4cHRyICs9IDQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgZWFjaCBmdW5jdGlvbiBkaWUgaW4gYSBjb21waWxhdGlvbiB1bml0ICdhVW5pdCcuCi0gICBUaGUgZmlyc3QgY2hpbGQgZGllIG9mICdhVW5pdCcgc2hvdWxkIGJlIGluICdhVW5pdC0+Zmlyc3RfY2hpbGQnLAotICAgdGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gJ2FVbml0LT5mdW5jX2xpc3QnLgotICAgUmV0dXJuIGZhbHNlIGlmIGVycm9yOyB0cnVlIG90aGVyd2lzZS4gKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2Z1bmN0aW9uc19pbl91bml0IChzdGFzaCwgYVVuaXQpCi0gICAgIHN0cnVjdCBkd2FyZjFfZGVidWcqIHN0YXNoOwotICAgICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGFVbml0OwotewotICBjaGFyKiBlYWNoRGllOwotCi0gIGlmIChhVW5pdC0+Zmlyc3RfY2hpbGQpCi0gICAgZm9yIChlYWNoRGllID0gYVVuaXQtPmZpcnN0X2NoaWxkOwotCSBlYWNoRGllIDwgc3Rhc2gtPmRlYnVnX3NlY3Rpb25fZW5kOwotCSApCi0gICAgICB7Ci0Jc3RydWN0IGRpZV9pbmZvIGVhY2hEaWVJbmZvOwotCQotCWlmICghIHBhcnNlX2RpZSAoc3Rhc2gtPmFiZmQsICZlYWNoRGllSW5mbywgZWFjaERpZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JCi0JaWYgKGVhY2hEaWVJbmZvLnRhZyA9PSBUQUdfZ2xvYmFsX3N1YnJvdXRpbmUKLQkgICAgfHwgZWFjaERpZUluZm8udGFnID09IFRBR19zdWJyb3V0aW5lCi0JICAgIHx8IGVhY2hEaWVJbmZvLnRhZyA9PSBUQUdfaW5saW5lZF9zdWJyb3V0aW5lCi0JICAgIHx8IGVhY2hEaWVJbmZvLnRhZyA9PSBUQUdfZW50cnlfcG9pbnQpCi0JICB7Ci0JICAgIHN0cnVjdCBkd2FyZjFfZnVuYyogYUZ1bmMgPSBhbGxvY19kd2FyZjFfZnVuYyAoc3Rhc2gsYVVuaXQpOwotCSAgICAKLQkgICAgYUZ1bmMtPm5hbWUgPSBlYWNoRGllSW5mby5uYW1lOwotCSAgICBhRnVuYy0+bG93X3BjID0gZWFjaERpZUluZm8ubG93X3BjOwotCSAgICBhRnVuYy0+aGlnaF9wYyA9IGVhY2hEaWVJbmZvLmhpZ2hfcGM7Ci0JICB9Ci0JCi0JLyogTW92ZSB0byBuZXh0IHNpYmxpbmcsIGlmIG5vbmUsIGVuZCBsb29wICovCi0JaWYgKGVhY2hEaWVJbmZvLnNpYmxpbmcpCi0JICBlYWNoRGllID0gc3Rhc2gtPmRlYnVnX3NlY3Rpb24gKyBlYWNoRGllSW5mby5zaWJsaW5nOwotCWVsc2UKLQkgIGJyZWFrOwotICAgICAgfQotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB0byAnYWRkcicgaW4gJ2FVbml0Jy4KLSAgIFJldHVybiB3aGV0aGVyIHdlIGZvdW5kIHRoZSBsaW5lIChvciBhIGZ1bmN0aW9uKSB3aXRob3V0IGVycm9yLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotZHdhcmYxX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKHN0YXNoLCBhVW5pdCwgYWRkciwgCi0JCSAgICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCSAgICAgICBsaW5lbnVtYmVyX3B0cikKLSAgc3RydWN0IGR3YXJmMV9kZWJ1Zyogc3Rhc2g7Ci0gIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQ7Ci0gIHVuc2lnbmVkIGxvbmcgYWRkcjsKLSAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci17Ci0gIGludCBsaW5lX3AgPSBmYWxzZTsKLSAgaW50IGZ1bmNfcCA9IGZhbHNlOwotCi0gIGlmIChhVW5pdC0+bG93X3BjIDw9IGFkZHIgJiYgYWRkciA8IGFVbml0LT5oaWdoX3BjKQotICAgIHsKLSAgICAgIGlmIChhVW5pdC0+aGFzX3N0bXRfbGlzdCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGk7Ci0JICBzdHJ1Y3QgZHdhcmYxX2Z1bmMqIGVhY2hGdW5jOwotCi0JICBpZiAoISBhVW5pdC0+bGluZW51bWJlcl90YWJsZSkKLQkgICAgewotCSAgICAgIGlmICghIHBhcnNlX2xpbmVfdGFibGUgKHN0YXNoLCBhVW5pdCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoISBhVW5pdC0+ZnVuY19saXN0KQotCSAgICB7Ci0JICAgICAgaWYgKCEgcGFyc2VfZnVuY3Rpb25zX2luX3VuaXQgKHN0YXNoLCBhVW5pdCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgYVVuaXQtPmxpbmVfY291bnQ7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChhVW5pdC0+bGluZW51bWJlcl90YWJsZVtpXS5hZGRyIDw9IGFkZHIKLQkJICAmJiBhZGRyIDwgYVVuaXQtPmxpbmVudW1iZXJfdGFibGVbaSsxXS5hZGRyKQotCQl7Ci0JCSAgKmZpbGVuYW1lX3B0ciA9IGFVbml0LT5uYW1lOwotCQkgICpsaW5lbnVtYmVyX3B0ciA9IGFVbml0LT5saW5lbnVtYmVyX3RhYmxlW2ldLmxpbmVudW1iZXI7Ci0JCSAgbGluZV9wID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGZvciAoZWFjaEZ1bmMgPSBhVW5pdC0+ZnVuY19saXN0OyAKLQkgICAgICAgZWFjaEZ1bmM7IAotCSAgICAgICBlYWNoRnVuYyA9IGVhY2hGdW5jLT5wcmV2KQotCSAgICB7Ci0JICAgICAgaWYgKGVhY2hGdW5jLT5sb3dfcGMgPD0gYWRkcgotCQkgICYmIGFkZHIgPCBlYWNoRnVuYy0+aGlnaF9wYykKLQkJewotCQkgICpmdW5jdGlvbm5hbWVfcHRyID0gZWFjaEZ1bmMtPm5hbWU7Ci0JCSAgZnVuY19wID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gbGluZV9wIHx8IGZ1bmNfcDsKLX0KLQotCi0KLQotLyogVGhlIERXQVJGIDEgdmVyc2lvbiBvZiBmaW5kX25lYXJlc3QgbGluZS4KLSAgIFJldHVybiB0cnVlIGlmIHRoZSBsaW5lIGlzIGZvdW5kIHdpdGhvdXQgZXJyb3IuICovCi0KLWJvb2xlYW4KLV9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVudW1iZXJfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci17Ci0gIHN0cnVjdCBkd2FyZjFfZGVidWcgKnN0YXNoID0gZWxmX3RkYXRhIChhYmZkKS0+ZHdhcmYxX2ZpbmRfbGluZV9pbmZvOwotCi0gIHN0cnVjdCBkd2FyZjFfdW5pdCogZWFjaFVuaXQ7Ci0KLSAgLyogV2hhdCBhZGRyZXNzIGFyZSB3ZSBsb29raW5nIGZvcj8gKi8KLSAgYmZkX3ZtYSBhZGRyID0gb2Zmc2V0ICsgc2VjdGlvbi0+dm1hOwotCi0gICpmaWxlbmFtZV9wdHIgPSBOVUxMOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IE5VTEw7Ci0gICpsaW5lbnVtYmVyX3B0ciA9IDA7Ci0gIAotCi0gIGlmICghIHN0YXNoKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgICAgCi0gICAgICBzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMV9maW5kX2xpbmVfaW5mbyA9Ci0JKHN0cnVjdCBkd2FyZjFfZGVidWcqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZjFfZGVidWcpKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWciKTsKLSAgICAgIGlmICghIG1zZWMpCi0JewotCSAgLyogTm8gZHdhcmYxIGluZm8uICBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCB0aGUgc3Rhc2gKLQkgICAgIGhhcyBiZWVuIGFsbG9jYXRlZCwgYnV0IGNvbnRhaW5zIHplcm9zLCB0aGlzIGxldHMKLQkgICAgIGZ1dHVyZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGZhaWwgcXVpY2tlci4gKi8KLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOwotICAgICAgc3Rhc2gtPmRlYnVnX3NlY3Rpb24gPSAodW5zaWduZWQgY2hhciopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gICAgICAKLSAgICAgIGlmICghIHN0YXNoLT5kZWJ1Z19zZWN0aW9uKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCBzdGFzaC0+ZGVidWdfc2VjdGlvbiwgMCwgc2l6ZSkpCi0JewotCSAgc3Rhc2gtPmRlYnVnX3NlY3Rpb24gPSAwOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgc3Rhc2gtPmRlYnVnX3NlY3Rpb25fZW5kID0gc3Rhc2gtPmRlYnVnX3NlY3Rpb24gKyBzaXplOwotICAgICAgc3Rhc2gtPmN1cnJlbnREaWUgPSBzdGFzaC0+ZGVidWdfc2VjdGlvbjsKLSAgICAgIHN0YXNoLT5hYmZkID0gYWJmZDsKLSAgICB9Ci0KLSAgLyogQSBudWxsIGRlYnVnX3NlY3Rpb24gaW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIG5vIGR3YXJmMSBpbmZvCi0gICAgIG9yIHRoYXQgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBzdGFzaC4gKi8KLQotICBpZiAoISBzdGFzaC0+ZGVidWdfc2VjdGlvbikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotCi0gIC8qIExvb2sgYXQgdGhlIHByZXZpb3VzbHkgcGFyc2VkIHVuaXRzIHRvIHNlZSBpZiBhbnkgY29udGFpbgotICAgICB0aGUgYWRkci4gKi8KLSAgZm9yIChlYWNoVW5pdCA9IHN0YXNoLT5sYXN0VW5pdDsgZWFjaFVuaXQ7IGVhY2hVbml0ID0gZWFjaFVuaXQtPnByZXYpCi0gICAgewotICAgICAgaWYgKGVhY2hVbml0LT5sb3dfcGMgPD0gYWRkciAmJiBhZGRyIDwgZWFjaFVuaXQtPmhpZ2hfcGMpCi0JcmV0dXJuIGR3YXJmMV91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChzdGFzaCwgZWFjaFVuaXQsIGFkZHIsCi0JCQkJCSAgICAgIGZpbGVuYW1lX3B0ciwgCi0JCQkJCSAgICAgIGZ1bmN0aW9ubmFtZV9wdHIsIAotCQkJCQkgICAgICBsaW5lbnVtYmVyX3B0cik7Ci0gICAgfQotCi0gIHdoaWxlIChzdGFzaC0+Y3VycmVudERpZSA8IHN0YXNoLT5kZWJ1Z19zZWN0aW9uX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGllX2luZm8gYURpZUluZm87Ci0KLSAgICAgIGlmICghIHBhcnNlX2RpZSAoc3Rhc2gtPmFiZmQsICZhRGllSW5mbywgc3Rhc2gtPmN1cnJlbnREaWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgaWYgKGFEaWVJbmZvLnRhZyA9PSBUQUdfY29tcGlsZV91bml0KQotCXsKLQkgIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQKLQkgICAgPSBhbGxvY19kd2FyZjFfdW5pdCAoc3Rhc2gpOwotCSAgCi0JICBhVW5pdC0+bmFtZSA9IGFEaWVJbmZvLm5hbWU7Ci0JICBhVW5pdC0+bG93X3BjID0gYURpZUluZm8ubG93X3BjOwotCSAgYVVuaXQtPmhpZ2hfcGMgPSBhRGllSW5mby5oaWdoX3BjOwotCSAgYVVuaXQtPmhhc19zdG10X2xpc3QgPSBhRGllSW5mby5oYXNfc3RtdF9saXN0OwotCSAgYVVuaXQtPnN0bXRfbGlzdF9vZmZzZXQgPSBhRGllSW5mby5zdG10X2xpc3Rfb2Zmc2V0OwotCSAgCi0JICAvKiBBIGRpZSBoYXMgYSBjaGlsZCBpZiBpdCdzIGZvbGxvd2VkIGJ5IGEgZGllIHRoYXQgaXMKLQkgICAgIG5vdCBpdCdzIHNpYmxpbmcuICovCi0JICBpZiAoYURpZUluZm8uc2libGluZyAKLQkgICAgICAmJiBzdGFzaC0+Y3VycmVudERpZSArIGFEaWVJbmZvLmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgPCBzdGFzaC0+ZGVidWdfc2VjdGlvbl9lbmQKLQkgICAgICAmJiBzdGFzaC0+Y3VycmVudERpZSArIGFEaWVJbmZvLmxlbmd0aCAKLQkgICAgICAgICAgICAhPSBzdGFzaC0+ZGVidWdfc2VjdGlvbiArIGFEaWVJbmZvLnNpYmxpbmcpCi0JICAgIGFVbml0LT5maXJzdF9jaGlsZCA9IHN0YXNoLT5jdXJyZW50RGllICsgYURpZUluZm8ubGVuZ3RoOwotCSAgZWxzZQotCSAgICBhVW5pdC0+Zmlyc3RfY2hpbGQgPSAwOwotCi0JICBpZiAoYVVuaXQtPmxvd19wYyA8PSBhZGRyICYmIGFkZHIgPCBhVW5pdC0+aGlnaF9wYykKLQkgICAgcmV0dXJuIGR3YXJmMV91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChzdGFzaCwgYVVuaXQsIGFkZHIsIAotCQkJCQkJICBmaWxlbmFtZV9wdHIsIAotCQkJCQkJICBmdW5jdGlvbm5hbWVfcHRyLCAKLQkJCQkJCSAgbGluZW51bWJlcl9wdHIpOwotCX0KLSAgICAgIAotICAgICAgaWYgKGFEaWVJbmZvLnNpYmxpbmcgIT0gMCkKLQlzdGFzaC0+Y3VycmVudERpZSA9IHN0YXNoLT5kZWJ1Z19zZWN0aW9uICsgYURpZUluZm8uc2libGluZzsKLSAgICAgIGVsc2UKLQlzdGFzaC0+Y3VycmVudERpZSArPSBhRGllSW5mby5sZW5ndGg7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBFT0YgKi8KZGlmZiAtLWdpdCBhL2JmZC9kd2FyZjIuYyBiL2JmZC9kd2FyZjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4NzU3ZS4uMDAwMDAwMAotLS0gYS9iZmQvZHdhcmYyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjE5ICswLDAgQEAKLS8qIERXQVJGIDIgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQWRhcHRlZCBmcm9tIGdkYi9kd2FyZjJyZWFkLmMgYnkgR2F2aW4gS29jaCBvZiBDeWdudXMgU29sdXRpb25zCi0gICAoZ2F2aW5AY3lnbnVzLmNvbSkuCi0KLSAgIEZyb20gdGhlIGR3YXJmMnJlYWQuYyBoZWFkZXI6Ci0gICBBZGFwdGVkIGJ5IEdhcnkgRnVuY2sgKGdhcnlAaW50cmVwaWQuY29tKSwgSW50cmVwaWQgVGVjaG5vbG9neSwKLSAgIEluYy4gIHdpdGggc3VwcG9ydCBmcm9tIEZsb3JpZGEgU3RhdGUgVW5pdmVyc2l0eSAodW5kZXIgY29udHJhY3QKLSAgIHdpdGggdGhlIEFkYSBKb2ludCBQcm9ncmFtIE9mZmljZSksIGFuZCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gICBJbml0aWFsIGNvbnRyaWJ1dGlvbiBieSBCcmVudCBCZW5zb24sIEhhcnJpcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuLAotICAgYmFzZWQgb24gRnJlZCBGaXNoJ3MgKEN5Z251cyBTdXBwb3J0KSBpbXBsZW1lbnRhdGlvbiBvZiBEV0FSRiAxCi0gICBzdXBwb3J0IGluIGR3YXJmcmVhZC5jCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRC4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLXlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvZHdhcmYyLmgiCi0KLS8qIFRoZSBkYXRhIGluIHRoZSAuZGVidWdfbGluZSBzdGF0ZW1lbnQgcHJvbG9ndWUgbG9va3MgbGlrZSB0aGlzLiAgKi8KLXN0cnVjdCBsaW5lX2hlYWQKLSAgewotICAgIHVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGg7Ci0gICAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKLSAgICB1bnNpZ25lZCBpbnQgcHJvbG9ndWVfbGVuZ3RoOwotICAgIHVuc2lnbmVkIGNoYXIgbWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGg7Ci0gICAgdW5zaWduZWQgY2hhciBkZWZhdWx0X2lzX3N0bXQ7Ci0gICAgaW50IGxpbmVfYmFzZTsKLSAgICB1bnNpZ25lZCBjaGFyIGxpbmVfcmFuZ2U7Ci0gICAgdW5zaWduZWQgY2hhciBvcGNvZGVfYmFzZTsKLSAgICB1bnNpZ25lZCBjaGFyICpzdGFuZGFyZF9vcGNvZGVfbGVuZ3RoczsKLSAgfTsKLQotLyogQXR0cmlidXRlcyBoYXZlIGEgbmFtZSBhbmQgYSB2YWx1ZSAqLwotc3RydWN0IGF0dHJpYnV0ZQotICB7Ci0gICAgZW51bSBkd2FyZl9hdHRyaWJ1dGUgbmFtZTsKLSAgICBlbnVtIGR3YXJmX2Zvcm0gZm9ybTsKLSAgICB1bmlvbgotICAgICAgewotCWNoYXIgKnN0cjsKLQlzdHJ1Y3QgZHdhcmZfYmxvY2sgKmJsazsKLQl1bnNpZ25lZCBpbnQgdW5zbmQ7Ci0JaW50IHNuZDsKLQliZmRfdm1hIGFkZHI7Ci0gICAgICB9Ci0gICAgdTsKLSAgfTsKLQotLyogR2V0IGF0IHBhcnRzIG9mIGFuIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUgKi8KLQotI2RlZmluZSBEV19TVFJJTkcoYXR0cikgICAgKChhdHRyKS0+dS5zdHIpCi0jZGVmaW5lIERXX1VOU05EKGF0dHIpICAgICAoKGF0dHIpLT51LnVuc25kKQotI2RlZmluZSBEV19CTE9DSyhhdHRyKSAgICAgKChhdHRyKS0+dS5ibGspCi0jZGVmaW5lIERXX1NORChhdHRyKSAgICAgICAoKGF0dHIpLT51LnNuZCkKLSNkZWZpbmUgRFdfQUREUihhdHRyKQkgICAoKGF0dHIpLT51LmFkZHIpCi0KLS8qIEJsb2NrcyBhcmUgYSBidW5jaCBvZiB1bnR5cGVkIGJ5dGVzLiAqLwotc3RydWN0IGR3YXJmX2Jsb2NrCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICBjaGFyICpkYXRhOwotICB9OwotCi0KLXN0cnVjdCBkd2FyZjJfZGVidWcgewotCi0gIC8qIEEgbGlzdCBvZiBhbGwgcHJldmlvdXNseSByZWFkIGNvbXBfdW5pdHMuICovCi0gIHN0cnVjdCBjb21wX3VuaXQqIGFsbF9jb21wX3VuaXRzOwotCi0gIC8qIFRoZSBuZXh0IHVucmVhZCBjb21waWxhdGlvbiB1bml0IHdpdGhpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4KLSAgICAgWmVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBoYXMgbm90IGJlZW4gbG9hZGVkCi0gICAgIGludG8gYSBidWZmZXIgeWV0LiovCi0gIGNoYXIqIGluZm9fcHRyOwotCi0gIC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBtZW1vcnkgYnVmZmVyLiAqLwotICBjaGFyKiBpbmZvX3B0cl9lbmQ7Ci0KLSAgLyogUG9pbnRlciB0byB0aGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uIGxvYWRlZCBpbnRvIG1lbW9yeS4gKi8KLSAgY2hhciogZHdhcmZfYWJicmV2X2J1ZmZlcjsKLQotICAvKiBMZW5ndGggb2YgdGhlIGxvYWRlZCAuZGVidWdfYWJicmV2IHNlY3Rpb24uICovCi0gIHVuc2lnbmVkIGxvbmcgZHdhcmZfYWJicmV2X3NpemU7Ci0KLSAgLyogQnVmZmVyIGZvciBkZWNvZGVfbGluZV9pbmZvLiAgKi8KLSAgY2hhciAqZHdhcmZfbGluZV9idWZmZXI7Ci19OwotCi1zdHJ1Y3QgYXJhbmdlIHsKLSAgc3RydWN0IGFyYW5nZSAqbmV4dDsKLSAgYmZkX3ZtYSBsb3c7Ci0gIGJmZF92bWEgaGlnaDsKLX07Ci0KLQotLyogQSBtaW5pbWFsIGRlY29kaW5nIG9mIERXQVJGMiBjb21waWxhdGlvbiB1bml0cy4gIFdlIG9ubHkgZGVjb2RlCi0gICB3aGF0J3MgbmVlZGVkIHRvIGdldCB0byB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICovCi0KLXN0cnVjdCBjb21wX3VuaXQgewotCi0gIC8qIENoYWluIHRoZSBwcmV2aW91c2x5IHJlYWQgY29tcGlsYXRpb24gdW5pdHMuICovCi0gIHN0cnVjdCBjb21wX3VuaXQqIG5leHRfdW5pdDsKLQotICAvKiBLZWVwIHRoZSBiZGYgY29udmVuaWVudCAoZm9yIG1lbW9yeSBhbGxvY2F0aW9uKS4gKi8KLSAgYmZkKiBhYmZkOwotCi0gIC8qIFRoZSBsb3dlc3QgYW5kIGhpZ2VzdCBhZGRyZXNzZXMgY29udGFpbmVkIGluIHRoaXMgY29tcGlsYXRpb24KLSAgICAgdW5pdCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyLiAqLwotICBzdHJ1Y3QgYXJhbmdlIGFyYW5nZTsKLQotICAvKiBUaGUgRFdfQVRfbmFtZSBhdHRyaWJ1dGUgKGZvciBlcnJvciBtZXNzYWdlcykuICovCi0gIGNoYXIqIG5hbWU7Ci0KLSAgLyogVGhlIGFiYnJldiBoYXNoIHRhYmxlLiAqLwotICBzdHJ1Y3QgYWJicmV2X2luZm8qKiBhYmJyZXZzOwotCi0gIC8qIE5vdGUgdGhhdCBhbiBlcnJvciB3YXMgZm91bmQgYnkgY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lLiAqLwotICBpbnQgZXJyb3I7Ci0KLSAgLyogVGhlIERXX0FUX2NvbXBfZGlyIGF0dHJpYnV0ZSAqLwotICBjaGFyKiBjb21wX2RpcjsKLQotICAvKiBUcnVlIGlmIHRoZXJlIGlzIGEgbGluZSBudW1iZXIgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcC4gdW5pdC4gKi8KLSAgaW50IHN0bXRsaXN0OwotICAKLSAgLyogVGhlIG9mZnNldCBpbnRvIC5kZWJ1Z19saW5lIG9mIHRoZSBsaW5lIG51bWJlciB0YWJsZS4gKi8KLSAgdW5zaWduZWQgbG9uZyBsaW5lX29mZnNldDsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBmaXJzdCBjaGlsZCBkaWUgZm9yIHRoZSBjb21wIHVuaXQuICovCi0gIGNoYXIgKmZpcnN0X2NoaWxkX2RpZV9wdHI7Ci0KLSAgLyogVGhlIGVuZCBvZiB0aGUgY29tcCB1bml0LiAqLwotICBjaGFyICplbmRfcHRyOwotCi0gIC8qIFRoZSBkZWNvZGVkIGxpbmUgbnVtYmVyLCBOVUxMIGlmIG5vdCB5ZXQgZGVjb2RlZC4gKi8KLSAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogbGluZV90YWJsZTsKLQotICAvKiBBIGxpc3Qgb2YgdGhlIGZ1bmN0aW9ucyBmb3VuZCBpbiB0aGlzIGNvbXAuIHVuaXQuICovCi0gIHN0cnVjdCBmdW5jaW5mbyogZnVuY3Rpb25fdGFibGU7IAotCi0gIC8qIEFkZHJlc3Mgc2l6ZSBmb3IgdGhpcyB1bml0IC0gZnJvbSB1bml0IGhlYWRlciAqLwotICB1bnNpZ25lZCBjaGFyIGFkZHJfc2l6ZTsKLX07Ci0KLQotCi0vKiBWRVJCQVRJTSAKLSAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdXAgdG8gdGhlIEVORCBWRVJCQVRJTSBtYXJrIGFyZSAKLSAgIGNvcGllZCBkaXJlY3RseSBmcm9tIGR3YXJmMnJlYWQuYy4gKi8KLQotLyogcmVhZCBkd2FyZiBpbmZvcm1hdGlvbiBmcm9tIGEgYnVmZmVyICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfMV9ieXRlIChhYmZkLCBidWYpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi1zdGF0aWMgaW50Ci1yZWFkXzFfc2lnbmVkX2J5dGUgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzJfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgdXNlZC4gICovCi0KLXN0YXRpYyBpbnQKLXJlYWRfMl9zaWduZWRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgdXNlZC4gICovCi0KLXN0YXRpYyBpbnQKLXJlYWRfNF9zaWduZWRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzhfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotc3RhdGljIGNoYXIgKgotcmVhZF9uX2J5dGVzIChhYmZkLCBidWYsIHNpemUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIElmIHRoZSBzaXplIG9mIGEgaG9zdCBjaGFyIGlzIDggYml0cywgd2UgY2FuIHJldHVybiBhIHBvaW50ZXIKLSAgICAgdG8gdGhlIGJ1ZmZlciwgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29weSB0aGUgZGF0YSB0byBhIGJ1ZmZlcgotICAgICBhbGxvY2F0ZWQgb24gdGhlIHRlbXBvcmFyeSBvYnN0YWNrLiAgKi8KLSAgcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKgotcmVhZF9zdHJpbmcgKGFiZmQsIGJ1ZiwgYnl0ZXNfcmVhZF9wdHIpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCAqYnl0ZXNfcmVhZF9wdHI7Ci17Ci0gIC8qIElmIHRoZSBzaXplIG9mIGEgaG9zdCBjaGFyIGlzIDggYml0cywgd2UgY2FuIHJldHVybiBhIHBvaW50ZXIKLSAgICAgdG8gdGhlIHN0cmluZywgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29weSB0aGUgc3RyaW5nIHRvIGEgYnVmZmVyCi0gICAgIGFsbG9jYXRlZCBvbiB0aGUgdGVtcG9yYXJ5IG9ic3RhY2suICAqLwotICBpZiAoKmJ1ZiA9PSAnXDAnKQotICAgIHsKLSAgICAgICpieXRlc19yZWFkX3B0ciA9IDE7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICpieXRlc19yZWFkX3B0ciA9IHN0cmxlbiAoYnVmKSArIDE7Ci0gIHJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBidWYsIGJ5dGVzX3JlYWRfcHRyKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqYnVmOwotICAgICB1bnNpZ25lZCBpbnQgKmJ5dGVzX3JlYWRfcHRyOwotewotICB1bnNpZ25lZCBpbnQgIHJlc3VsdDsKLSAgdW5zaWduZWQgaW50ICBudW1fcmVhZDsKLSAgaW50ICAgICAgICAgICBzaGlmdDsKLSAgdW5zaWduZWQgY2hhciBieXRlOwotCi0gIHJlc3VsdCAgID0gMDsKLSAgc2hpZnQgICAgPSAwOwotICBudW1fcmVhZCA9IDA7Ci0gIAotICBkbwotICAgIHsKLSAgICAgIGJ5dGUgPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotICAgICAgYnVmICsrOwotICAgICAgbnVtX3JlYWQgKys7Ci0gICAgICByZXN1bHQgfD0gKChieXRlICYgMHg3ZikgPDwgc2hpZnQpOwotICAgICAgc2hpZnQgKz0gNzsKLSAgICB9Ci0gIHdoaWxlIChieXRlICYgMHg4MCk7Ci0gIAotICAqIGJ5dGVzX3JlYWRfcHRyID0gbnVtX3JlYWQ7Ci0gIAotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50Ci1yZWFkX3NpZ25lZF9sZWIxMjggKGFiZmQsIGJ1ZiwgYnl0ZXNfcmVhZF9wdHIpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCAqIGJ5dGVzX3JlYWRfcHRyOwotewotICBpbnQgICAgICAgICAgIHJlc3VsdDsKLSAgaW50ICAgICAgICAgICBzaGlmdDsKLSAgaW50ICAgICAgICAgICBudW1fcmVhZDsKLSAgdW5zaWduZWQgY2hhciBieXRlOwotCi0gIHJlc3VsdCA9IDA7Ci0gIHNoaWZ0ID0gMDsKLSAgbnVtX3JlYWQgPSAwOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci0gICAgICBidWYgKys7Ci0gICAgICBudW1fcmVhZCArKzsKLSAgICAgIHJlc3VsdCB8PSAoKGJ5dGUgJiAweDdmKSA8PCBzaGlmdCk7Ci0gICAgICBzaGlmdCArPSA3OwotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLSAgCi0gIGlmICgoc2hpZnQgPCAzMikgJiYgKGJ5dGUgJiAweDQwKSkKLSAgICByZXN1bHQgfD0gLSgxIDw8IHNoaWZ0KTsKLQotICAqIGJ5dGVzX3JlYWRfcHRyID0gbnVtX3JlYWQ7Ci0gIAotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBFTkQgVkVSQkFUSU0gKi8KLQotc3RhdGljIGJmZF92bWEKLXJlYWRfYWRkcmVzcyAodW5pdCwgYnVmKQotICAgICBzdHJ1Y3QgY29tcF91bml0KiB1bml0OwotICAgICBjaGFyICpidWY7Ci17Ci0gIGJmZF92bWEgcmV0dmFsID0gMDsKLQotICBpZiAodW5pdC0+YWRkcl9zaXplID09IDQpCi0gICAgewotICAgICAgcmV0dmFsID0gYmZkX2dldF8zMiAodW5pdC0+YWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHZhbCA9IGJmZF9nZXRfNjQgKHVuaXQtPmFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi0KLQotCi0vKiBUaGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiBhbiBhYmJyZXYuICovCi1zdHJ1Y3QgYWJicmV2X2luZm8KLSAgewotICAgIHVuc2lnbmVkIGludCBudW1iZXI7CS8qIG51bWJlciBpZGVudGlmeWluZyBhYmJyZXYgKi8KLSAgICBlbnVtIGR3YXJmX3RhZyB0YWc7CQkvKiBkd2FyZiB0YWcgKi8KLSAgICBpbnQgaGFzX2NoaWxkcmVuOwkJLyogYm9vbGVhbiAqLwotICAgIHVuc2lnbmVkIGludCBudW1fYXR0cnM7CS8qIG51bWJlciBvZiBhdHRyaWJ1dGVzICovCi0gICAgc3RydWN0IGF0dHJfYWJicmV2ICphdHRyczsJLyogYW4gYXJyYXkgb2YgYXR0cmlidXRlIGRlc2NyaXB0aW9ucyAqLwotICAgIHN0cnVjdCBhYmJyZXZfaW5mbyAqbmV4dDsJLyogbmV4dCBpbiBjaGFpbiAqLwotICB9OwotCi1zdHJ1Y3QgYXR0cl9hYmJyZXYKLSAgewotICAgIGVudW0gZHdhcmZfYXR0cmlidXRlIG5hbWU7Ci0gICAgZW51bSBkd2FyZl9mb3JtIGZvcm07Ci0gIH07Ci0KLSNpZm5kZWYgQUJCUkVWX0hBU0hfU0laRQotI2RlZmluZSBBQkJSRVZfSEFTSF9TSVpFIDEyMQotI2VuZGlmCi0jaWZuZGVmIEFUVFJfQUxMT0NfQ0hVTksKLSNkZWZpbmUgQVRUUl9BTExPQ19DSFVOSyA0Ci0jZW5kaWYKLQotLyogTG9va3VwIGFuIGFiYnJldl9pbmZvIHN0cnVjdHVyZSBpbiB0aGUgYWJicmV2IGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGFiYnJldl9pbmZvICoKLWxvb2t1cF9hYmJyZXYgKG51bWJlcixhYmJyZXZzKQotICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyOwotICAgICBzdHJ1Y3QgYWJicmV2X2luZm8gKiphYmJyZXZzOwotewotICB1bnNpZ25lZCBpbnQgaGFzaF9udW1iZXI7Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2OwotCi0gIGhhc2hfbnVtYmVyID0gbnVtYmVyICUgQUJCUkVWX0hBU0hfU0laRTsKLSAgYWJicmV2ID0gYWJicmV2c1toYXNoX251bWJlcl07Ci0KLSAgd2hpbGUgKGFiYnJldikKLSAgICB7Ci0gICAgICBpZiAoYWJicmV2LT5udW1iZXIgPT0gbnVtYmVyKQotCXJldHVybiBhYmJyZXY7Ci0gICAgICBlbHNlCi0JYWJicmV2ID0gYWJicmV2LT5uZXh0OwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEluIERXQVJGIHZlcnNpb24gMiwgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMKLSAgIHN0b3JlZCBpbiBhIHNlcGFyYXRlIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4gIEJlZm9yZSB3ZSByZWFkIGFueQotICAgZGllcyBmcm9tIGEgc2VjdGlvbiB3ZSByZWFkIGluIGFsbCBhYmJyZXZpYXRpb25zIGFuZCBpbnN0YWxsIHRoZW0KLSAgIGluIGEgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYWJicmV2X2luZm8qKgotcmVhZF9hYmJyZXZzIChhYmZkLCBvZmZzZXQpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci17Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyAqKmFiYnJldnM7Ci0gIGNoYXIgKmFiYnJldl9wdHI7Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyAqY3VyX2FiYnJldjsKLSAgdW5zaWduZWQgaW50IGFiYnJldl9udW1iZXIsIGJ5dGVzX3JlYWQsIGFiYnJldl9uYW1lOwotICB1bnNpZ25lZCBpbnQgYWJicmV2X2Zvcm0sIGhhc2hfbnVtYmVyOwotICBzdHJ1Y3QgZHdhcmYyX2RlYnVnICpzdGFzaDsKLQotICBzdGFzaCA9IGVsZl90ZGF0YShhYmZkKS0+ZHdhcmYyX2ZpbmRfbGluZV9pbmZvOwotCi0gIGlmICghIHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWdfYWJicmV2Iik7Ci0gICAgICBpZiAoISBtc2VjKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IENhbid0IGZpbmQgLmRlYnVnX2FiYnJldiBzZWN0aW9uLiIpKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgCi0gICAgICBzdGFzaC0+ZHdhcmZfYWJicmV2X3NpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOwotICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIgPSAoY2hhciopIGJmZF9hbGxvYyAoYWJmZCwgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKTsKLSAgICAgIGlmICghIHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyKQotCSAgcmV0dXJuIDA7Ci0gICAgICAKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbXNlYywgCi0JCQkJICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIsIDAsCi0JCQkJICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKG9mZnNldCA+IHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBBYmJyZXYgb2Zmc2V0ICgldSkgYmlnZ2VyIHRoYW4gYWJicmV2IHNpemUgKCV1KS4iKSwgCi0JCQkgICAgIG9mZnNldCwgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplICk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBhYmJyZXZzID0gKHN0cnVjdCBhYmJyZXZfaW5mbyoqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2Yoc3RydWN0IGFiYnJldl9pbmZvKikgKiBBQkJSRVZfSEFTSF9TSVpFKTsKLQotICBhYmJyZXZfcHRyID0gc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIgKyBvZmZzZXQ7Ci0gIGFiYnJldl9udW1iZXIgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgLyogbG9vcCB1bnRpbCB3ZSByZWFjaCBhbiBhYmJyZXYgbnVtYmVyIG9mIDAgKi8KLSAgd2hpbGUgKGFiYnJldl9udW1iZXIpCi0gICAgewotICAgICAgY3VyX2FiYnJldiA9IChzdHJ1Y3QgYWJicmV2X2luZm8qKWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFiYnJldl9pbmZvKSk7Ci0KLSAgICAgIC8qIHJlYWQgaW4gYWJicmV2IGhlYWRlciAqLwotICAgICAgY3VyX2FiYnJldi0+bnVtYmVyID0gYWJicmV2X251bWJlcjsKLSAgICAgIGN1cl9hYmJyZXYtPnRhZyA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBjdXJfYWJicmV2LT5oYXNfY2hpbGRyZW4gPSByZWFkXzFfYnl0ZSAoYWJmZCwgYWJicmV2X3B0cik7Ci0gICAgICBhYmJyZXZfcHRyICs9IDE7Ci0KLSAgICAgIC8qIG5vdyByZWFkIGluIGRlY2xhcmF0aW9ucyAqLwotICAgICAgYWJicmV2X25hbWUgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYWJicmV2X2Zvcm0gPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOwotICAgICAgd2hpbGUgKGFiYnJldl9uYW1lKQotCXsKLQkgIGlmICgoY3VyX2FiYnJldi0+bnVtX2F0dHJzICUgQVRUUl9BTExPQ19DSFVOSykgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cl9hYmJyZXYtPmF0dHJzID0gKHN0cnVjdCBhdHRyX2FiYnJldiAqKQotCQliZmRfcmVhbGxvYyAoY3VyX2FiYnJldi0+YXR0cnMsCi0JCQkgICAgIChjdXJfYWJicmV2LT5udW1fYXR0cnMgKyBBVFRSX0FMTE9DX0NIVU5LKQotCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGF0dHJfYWJicmV2KSk7Ci0JICAgICAgaWYgKCEgY3VyX2FiYnJldi0+YXR0cnMpCi0JCXJldHVybiAwOwotCSAgICB9Ci0JICBjdXJfYWJicmV2LT5hdHRyc1tjdXJfYWJicmV2LT5udW1fYXR0cnNdLm5hbWUgPSBhYmJyZXZfbmFtZTsKLQkgIGN1cl9hYmJyZXYtPmF0dHJzW2N1cl9hYmJyZXYtPm51bV9hdHRycysrXS5mb3JtID0gYWJicmV2X2Zvcm07Ci0JICBhYmJyZXZfbmFtZSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JICBhYmJyZXZfZm9ybSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JfQotCi0gICAgICBoYXNoX251bWJlciA9IGFiYnJldl9udW1iZXIgJSBBQkJSRVZfSEFTSF9TSVpFOwotICAgICAgY3VyX2FiYnJldi0+bmV4dCA9IGFiYnJldnNbaGFzaF9udW1iZXJdOwotICAgICAgYWJicmV2c1toYXNoX251bWJlcl0gPSBjdXJfYWJicmV2OwotCi0gICAgICAvKiBHZXQgbmV4dCBhYmJyZXZpYXRpb24uCi0gICAgICAgICBVbmRlciBJcml4NiB0aGUgYWJicmV2aWF0aW9ucyBmb3IgYSBjb21waWxhdGlvbiB1bml0IGFyZSBub3QKLQkgYWx3YXlzIHByb3Blcmx5IHRlcm1pbmF0ZWQgd2l0aCBhbiBhYmJyZXYgbnVtYmVyIG9mIDAuCi0JIEV4aXQgbG9vcCBpZiB3ZSBlbmNvdW50ZXIgYW4gYWJicmV2aWF0aW9uIHdoaWNoIHdlIGhhdmUKLQkgYWxyZWFkeSByZWFkICh3aGljaCBtZWFucyB3ZSBhcmUgYWJvdXQgdG8gcmVhZCB0aGUgYWJicmV2aWF0aW9ucwotCSBmb3IgdGhlIG5leHQgY29tcGlsZSB1bml0KSBvciBpZiB0aGUgZW5kIG9mIHRoZSBhYmJyZXZpYXRpb24KLQkgdGFibGUgaXMgcmVhY2hlZC4gICovCi0gICAgICBpZiAoKHVuc2lnbmVkIGludCkgKGFiYnJldl9wdHIgLSBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlcikKLQkgICAgPj0gc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKQotCWJyZWFrOwotICAgICAgYWJicmV2X251bWJlciA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBpZiAobG9va3VwX2FiYnJldiAoYWJicmV2X251bWJlcixhYmJyZXZzKSAhPSBOVUxMKQotCWJyZWFrOwotICAgIH0KLQotICByZXR1cm4gYWJicmV2czsKLX0KLQotLyogUmVhZCBhbiBhdHRyaWJ1dGUgZGVzY3JpYmVkIGJ5IGFuIGFiYnJldmlhdGVkIGF0dHJpYnV0ZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLXJlYWRfYXR0cmlidXRlIChhdHRyLCBhYmJyZXYsIHVuaXQsIGluZm9fcHRyKQotICAgICBzdHJ1Y3QgYXR0cmlidXRlICAgKmF0dHI7Ci0gICAgIHN0cnVjdCBhdHRyX2FiYnJldiAqYWJicmV2OwotICAgICBzdHJ1Y3QgY29tcF91bml0ICAgKnVuaXQ7Ci0gICAgIGNoYXIgICAgICAgICAgICAgICAqaW5mb19wdHI7Ci17Ci0gIGJmZCAqYWJmZCA9IHVuaXQtPmFiZmQ7Ci0gIHVuc2lnbmVkIGludCBieXRlc19yZWFkOwotICBzdHJ1Y3QgZHdhcmZfYmxvY2sgKmJsazsKLQotICBhdHRyLT5uYW1lID0gYWJicmV2LT5uYW1lOwotICBhdHRyLT5mb3JtID0gYWJicmV2LT5mb3JtOwotICBzd2l0Y2ggKGFiYnJldi0+Zm9ybSkKLSAgICB7Ci0gICAgY2FzZSBEV19GT1JNX2FkZHI6Ci0gICAgY2FzZSBEV19GT1JNX3JlZl9hZGRyOgotICAgICAgRFdfQUREUiAoYXR0cikgPSByZWFkX2FkZHJlc3MgKHVuaXQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IHVuaXQtPmFkZHJfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazI6Ci0gICAgICBibGsgPSAoc3RydWN0IGR3YXJmX2Jsb2NrICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmZfYmxvY2spKTsKLSAgICAgIGJsay0+c2l6ZSA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMjsKLSAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7Ci0gICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7Ci0gICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s0OgotICAgICAgYmxrID0gKHN0cnVjdCBkd2FyZl9ibG9jayAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmX2Jsb2NrKSk7Ci0gICAgICBibGstPnNpemUgPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDQ7Ci0gICAgICBibGstPmRhdGEgPSByZWFkX25fYnl0ZXMgKGFiZmQsIGluZm9fcHRyLCBibGstPnNpemUpOwotICAgICAgaW5mb19wdHIgKz0gYmxrLT5zaXplOwotICAgICAgRFdfQkxPQ0sgKGF0dHIpID0gYmxrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGEyOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8yX2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE0OgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE4OgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF84X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3N0cmluZzoKLSAgICAgIERXX1NUUklORyAoYXR0cikgPSByZWFkX3N0cmluZyAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s6Ci0gICAgICBibGsgPSAoc3RydWN0IGR3YXJmX2Jsb2NrICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmZfYmxvY2spKTsKLSAgICAgIGJsay0+c2l6ZSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7Ci0gICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7Ci0gICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOgotICAgICAgYmxrID0gKHN0cnVjdCBkd2FyZl9ibG9jayAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmX2Jsb2NrKSk7Ci0gICAgICBibGstPnNpemUgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMTsKLSAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7Ci0gICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7Ci0gICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTE6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9mbGFnOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fc2RhdGE6Ci0gICAgICBEV19TTkQgKGF0dHIpID0gcmVhZF9zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV91ZGF0YToKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9yZWYxOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fcmVmMjoKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9yZWY0OgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjg6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzhfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fcmVmX3VkYXRhOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3N0cnA6Ci0gICAgY2FzZSBEV19GT1JNX2luZGlyZWN0OgotICAgIGRlZmF1bHQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBJbnZhbGlkIG9yIHVuaGFuZGxlZCBGT1JNIHZhbHVlOiAlZC4iKSwKLQkJCSAgICAgYWJicmV2LT5mb3JtKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIH0KLSAgcmV0dXJuIGluZm9fcHRyOwotfQotCi0KLS8qIFNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIHRhYmxlIHJvdXRpbmVzLiAqLwotCi0jZGVmaW5lIEZJTEVfQUxMT0NfQ0hVTksgNQotI2RlZmluZSBESVJfQUxMT0NfQ0hVTksgNQotCi1zdHJ1Y3QgbGluZV9pbmZvIHsKLSAgc3RydWN0IGxpbmVfaW5mbyogcHJldl9saW5lOwotCi0gIGJmZF92bWEgYWRkcmVzczsKLSAgY2hhciogZmlsZW5hbWU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICB1bnNpZ25lZCBpbnQgY29sdW1uOwotICBpbnQgZW5kX3NlcXVlbmNlOwkJLyogZW5kIG9mIChzZXF1ZW50aWFsKSBjb2RlIHNlcXVlbmNlICovCi19OwotCi1zdHJ1Y3QgZmlsZWluZm8gewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgZGlyOwotICB1bnNpZ25lZCBpbnQgdGltZTsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci19OwotCi1zdHJ1Y3QgbGluZV9pbmZvX3RhYmxlIHsKLSAgYmZkKiBhYmZkOwotCi0gIHVuc2lnbmVkIGludCBudW1fZmlsZXM7Ci0gIHVuc2lnbmVkIGludCBudW1fZGlyczsKLQotICBjaGFyKiBjb21wX2RpcjsKLSAgY2hhcioqIGRpcnM7Ci0gIHN0cnVjdCBmaWxlaW5mbyogZmlsZXM7Ci0gIHN0cnVjdCBsaW5lX2luZm8qIGxhc3RfbGluZTsKLX07Ci0KLXN0YXRpYyB2b2lkIAotYWRkX2xpbmVfaW5mbyAodGFibGUsIGFkZHJlc3MsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIGVuZF9zZXF1ZW5jZSkKLSAgICAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogdGFibGU7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgY2hhciogZmlsZW5hbWU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICB1bnNpZ25lZCBpbnQgY29sdW1uOwotICAgICBpbnQgZW5kX3NlcXVlbmNlOwotewotICBzdHJ1Y3QgbGluZV9pbmZvKiBpbmZvID0gKHN0cnVjdCBsaW5lX2luZm8qKQotICAgIGJmZF9hbGxvYyAodGFibGUtPmFiZmQsIHNpemVvZiAoc3RydWN0IGxpbmVfaW5mbykpOwotCi0gIGluZm8tPnByZXZfbGluZSA9IHRhYmxlLT5sYXN0X2xpbmU7Ci0gIHRhYmxlLT5sYXN0X2xpbmUgPSBpbmZvOwotCi0gIGluZm8tPmFkZHJlc3MgPSBhZGRyZXNzOwotICBpbmZvLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBpbmZvLT5saW5lID0gbGluZTsKLSAgaW5mby0+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+aGFzX2NoaWxkcmVuKQotCW5lc3RpbmdfbGV2ZWwrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0KLQotCi0vKiBQYXJzZSBhIERXQVJGMiBjb21waWxhdGlvbiB1bml0IHN0YXJ0aW5nIGF0IElORk9fUFRSLiAgVGhpcwotICAgaW5jbHVkZXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyIHRoYXQgcHJvY2VlZHMgdGhlIERJRSdzLCBidXQKLSAgIGRvZXMgbm90IGluY2x1ZGUgdGhlIGxlbmd0aCBmaWVsZCB0aGF0IHByZWNlZWRzIGVhY2ggY29tcGlsYXRpb24KLSAgIHVuaXQgaGVhZGVyLiAgRU5EX1BUUiBwb2ludHMgb25lIHBhc3QgdGhlIGVuZCBvZiB0aGlzIGNvbXAgdW5pdC4KLSAgIElmIEFCQlJFVl9MRU5HVEggaXMgMCwgdGhlbiB0aGUgbGVuZ3RoIG9mIHRoZSBhYmJyZXZpYXRpb24gb2Zmc2V0Ci0gICBpcyBhc3N1bWVkIHRvIGJlIGZvdXIgYnl0ZXMuICBPdGhlcndpc2UsIGl0IGl0IGlzIHRoZSBzaXplIGdpdmVuLgotCi0gICBUaGlzIHJvdXRpbmUgZG9lcyBub3QgcmVhZCB0aGUgd2hvbGUgY29tcGlsYXRpb24gdW5pdDsgb25seSBlbm91Z2gKLSAgIHRvIGdldCB0byB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBjb21wX3VuaXQgKgotcGFyc2VfY29tcF91bml0IChhYmZkLCBpbmZvX3B0ciwgZW5kX3B0ciwgYWJicmV2X2xlbmd0aCkKLSAgICAgYmZkKiBhYmZkOwotICAgICBjaGFyKiBpbmZvX3B0cjsKLSAgICAgY2hhciogZW5kX3B0cjsKLSAgICAgdW5zaWduZWQgaW50IGFiYnJldl9sZW5ndGg7Ci17Ci0gIHN0cnVjdCBjb21wX3VuaXQqIHVuaXQ7Ci0KLSAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKLSAgdW5zaWduZWQgaW50IGFiYnJldl9vZmZzZXQgPSAwOwotICB1bnNpZ25lZCBjaGFyIGFkZHJfc2l6ZTsKLSAgc3RydWN0IGFiYnJldl9pbmZvKiogYWJicmV2czsKLQotICB1bnNpZ25lZCBpbnQgYWJicmV2X251bWJlciwgYnl0ZXNfcmVhZCwgaTsKLSAgc3RydWN0IGFiYnJldl9pbmZvICphYmJyZXY7Ci0gIHN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQotICB2ZXJzaW9uID0gcmVhZF8yX2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gIGluZm9fcHRyICs9IDI7Ci0gIEJGRF9BU1NFUlQgKGFiYnJldl9sZW5ndGggPT0gMAotCSAgICAgIHx8IGFiYnJldl9sZW5ndGggPT0gNAotCSAgICAgIHx8IGFiYnJldl9sZW5ndGggPT0gOCk7Ci0gIGlmIChhYmJyZXZfbGVuZ3RoID09IDAgfHwgYWJicmV2X2xlbmd0aCA9PSA0KQotICAgIGFiYnJldl9vZmZzZXQgPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgZWxzZSBpZiAoYWJicmV2X2xlbmd0aCA9PSA4KQotICAgIGFiYnJldl9vZmZzZXQgPSByZWFkXzhfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgaW5mb19wdHIgKz0gYWJicmV2X2xlbmd0aDsKLSAgYWRkcl9zaXplID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKLSAgaW5mb19wdHIgKz0gMTsKLQotICBpZiAodmVyc2lvbiAhPSAyKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IGZvdW5kIGR3YXJmIHZlcnNpb24gJyVodScsIHRoaXMgcmVhZGVyIG9ubHkgaGFuZGxlcyB2ZXJzaW9uIDIgaW5mb3JtYXRpb24uIiksIHZlcnNpb24gKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChhZGRyX3NpemUgPiBzaXplb2YgKGJmZF92bWEpKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IGZvdW5kIGFkZHJlc3Mgc2l6ZSAnJXUnLCB0aGlzIHJlYWRlciBjYW4gbm90IGhhbmRsZSBzaXplcyBncmVhdGVyIHRoYW4gJyV1Jy4iKSwKLQkJCSBhZGRyX3NpemUsCi0JCQkgc2l6ZW9mIChiZmRfdm1hKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoYWRkcl9zaXplICE9IDQgJiYgYWRkcl9zaXplICE9IDgpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiRHdhcmYgRXJyb3I6IGZvdW5kIGFkZHJlc3Mgc2l6ZSAnJXUnLCB0aGlzIHJlYWRlciBjYW4gb25seSBoYW5kbGUgYWRkcmVzcyBzaXplcyAnNCcgYW5kICc4Jy4iLCBhZGRyX3NpemUgKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIGFiYnJldnMgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdCBpbnRvIGEgdGFibGUgKi8KLSAgYWJicmV2cyA9IHJlYWRfYWJicmV2cyAoYWJmZCwgYWJicmV2X29mZnNldCk7Ci0gIGlmICghIGFiYnJldnMpCi0gICAgICByZXR1cm4gMDsKLQotICBhYmJyZXZfbnVtYmVyID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gIGlmICghIGFiYnJldl9udW1iZXIpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQmFkIGFiYnJldiBudW1iZXI6ICVkLiIpLAotCQkJIGFiYnJldl9udW1iZXIpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgYWJicmV2ID0gbG9va3VwX2FiYnJldiAoYWJicmV2X251bWJlciwgYWJicmV2cyk7Ci0gIGlmICghIGFiYnJldikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBDb3VsZCBub3QgZmluZCBhYmJyZXYgbnVtYmVyICVkLiIpLAotCQkJIGFiYnJldl9udW1iZXIpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIAotICB1bml0ID0gKHN0cnVjdCBjb21wX3VuaXQqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb21wX3VuaXQpKTsKLSAgdW5pdC0+YWJmZCA9IGFiZmQ7Ci0gIHVuaXQtPmFkZHJfc2l6ZSA9IGFkZHJfc2l6ZTsgCi0gIHVuaXQtPmFiYnJldnMgPSBhYmJyZXZzOwotICB1bml0LT5lbmRfcHRyID0gZW5kX3B0cjsKLQotICBmb3IgKGkgPSAwOyBpIDwgYWJicmV2LT5udW1fYXR0cnM7ICsraSkKLSAgICB7Ci0gICAgICBpbmZvX3B0ciA9IHJlYWRfYXR0cmlidXRlICgmYXR0ciwgJmFiYnJldi0+YXR0cnNbaV0sIHVuaXQsIGluZm9fcHRyKTsKLQotICAgICAgLyogU3RvcmUgdGhlIGRhdGEgaWYgaXQgaXMgb2YgYW4gYXR0cmlidXRlIHdlIHdhbnQgdG8ga2VlcCBpbiBhCi0JIHBhcnRpYWwgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICAgIHN3aXRjaCAoYXR0ci5uYW1lKQotCXsKLQljYXNlIERXX0FUX3N0bXRfbGlzdDoKLQkgIHVuaXQtPnN0bXRsaXN0ID0gMTsKLQkgIHVuaXQtPmxpbmVfb2Zmc2V0ID0gRFdfVU5TTkQgKCZhdHRyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19BVF9uYW1lOgotCSAgdW5pdC0+bmFtZSA9IERXX1NUUklORyAoJmF0dHIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX0FUX2xvd19wYzoKLQkgIHVuaXQtPmFyYW5nZS5sb3cgPSBEV19BRERSICgmYXR0cik7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfQVRfaGlnaF9wYzoKLQkgIHVuaXQtPmFyYW5nZS5oaWdoID0gRFdfQUREUiAoJmF0dHIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX0FUX2NvbXBfZGlyOgotCSAgewotCSAgICBjaGFyKiBjb21wX2RpciA9IERXX1NUUklORyAoJmF0dHIpOwotCSAgICBpZiAoY29tcF9kaXIpCi0JICAgICAgewotCQkvKiBJcml4IDYuMiBuYXRpdmUgY2MgcHJlcGVuZHMgPG1hY2hpbmU+LjogdG8gdGhlIGNvbXBpbGF0aW9uCi0JCSAgIGRpcmVjdG9yeSwgZ2V0IHJpZCBvZiBpdC4gICovCi0JCWNoYXIgKmNwID0gKGNoYXIqKSBzdHJjaHIgKGNvbXBfZGlyLCAnOicpOwotCi0JCWlmIChjcCAmJiBjcCAhPSBjb21wX2RpciAmJiBjcFstMV0gPT0gJy4nICYmIGNwWzFdID09ICcvJykKLQkJICBjb21wX2RpciA9IGNwICsgMTsKLQkgICAgICB9Ci0JICAgIHVuaXQtPmNvbXBfZGlyID0gY29tcF9kaXI7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgdW5pdC0+Zmlyc3RfY2hpbGRfZGllX3B0ciA9IGluZm9fcHRyOwotICByZXR1cm4gdW5pdDsKLX0KLQotCi0KLQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiBVTklUIGNvbnRhaW5zIHRoZSBhZGRyZXNzIGdpdmVuIGJ5IEFERFIuICovCi0KLXN0YXRpYyBib29sZWFuCi1jb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyAodW5pdCwgYWRkcikKLSAgICAgc3RydWN0IGNvbXBfdW5pdCogdW5pdDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgYXJhbmdlICphcmFuZ2U7Ci0KLSAgaWYgKHVuaXQtPmVycm9yKQotICAgIHJldHVybiAwOwotCi0gIGFyYW5nZSA9ICZ1bml0LT5hcmFuZ2U7Ci0gIGRvCi0gICAgewotICAgICAgaWYgKGFkZHIgPj0gYXJhbmdlLT5sb3cgJiYgYWRkciA8IGFyYW5nZS0+aGlnaCkKLQlyZXR1cm4gMTsKLSAgICAgIGFyYW5nZSA9IGFyYW5nZS0+bmV4dDsKLSAgICB9Ci0gIHdoaWxlIChhcmFuZ2UpOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBJZiBVTklUIGNvbnRhaW5zIEFERFIsIHNldCB0aGUgb3V0cHV0IHBhcmFtZXRlcnMgdG8gdGhlIHZhbHVlcyBmb3IKLSAgIHRoZSBsaW5lIGNvbnRhaW5pbmcgQUREUi4gIFRoZSBvdXRwdXQgcGFyYW1ldGVycywgRklMRU5BTUVfUFRSLAotICAgRlVOQ1RJT05OQU1FX1BUUiwgYW5kIExJTkVOVU1CRVJfUFRSLCBhcmUgcG9pbnRlcnMgdG8gdGhlIG9iamVjdHMKLSAgIHRvIGJlIGZpbGxlZCBpbi4gIAotCi0gICBSZXR1cm4gdHJ1ZSBvZiBVTklUIGNvbnRhaW5zIEFERFIsIGFuZCBubyBlcnJvcnMgd2VyZSBlbmNvdW50ZXJlZDsKLSAgIGZhbHNlIG90aGVyd2lzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKHVuaXQsIGFkZHIsCi0JCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgbGluZW51bWJlcl9wdHIpCi0gICAgIHN0cnVjdCBjb21wX3VuaXQqIHVuaXQ7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci17Ci0gIGJvb2xlYW4gbGluZV9wOwotICBib29sZWFuIGZ1bmNfcDsKLSAgCi0gIGlmICh1bml0LT5lcnJvcikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgdW5pdC0+bGluZV90YWJsZSkKLSAgICB7Ci0gICAgICBpZiAoISB1bml0LT5zdG10bGlzdCkKLQl7Ci0JICB1bml0LT5lcnJvciA9IDE7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAKLSAgICAgIHVuaXQtPmxpbmVfdGFibGUgPSBkZWNvZGVfbGluZV9pbmZvICh1bml0KTsKLQotICAgICAgaWYgKCEgdW5pdC0+bGluZV90YWJsZSkKLQl7Ci0JICB1bml0LT5lcnJvciA9IDE7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgCi0gICAgICBpZiAoISBzY2FuX3VuaXRfZm9yX2Z1bmN0aW9ucyAodW5pdCkpCi0JewotCSAgdW5pdC0+ZXJyb3IgPSAxOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgbGluZV9wID0gbG9va3VwX2FkZHJlc3NfaW5fbGluZV9pbmZvX3RhYmxlICh1bml0LT5saW5lX3RhYmxlLAotCQkJCQkgICAgICBhZGRyLAotCQkJCQkgICAgICBmaWxlbmFtZV9wdHIsIAotCQkJCQkgICAgICBsaW5lbnVtYmVyX3B0cik7Ci0gIGZ1bmNfcCA9IGxvb2t1cF9hZGRyZXNzX2luX2Z1bmN0aW9uX3RhYmxlICh1bml0LT5mdW5jdGlvbl90YWJsZSwgCi0JCQkJCSAgICAgYWRkciwKLQkJCQkJICAgICBmdW5jdGlvbm5hbWVfcHRyKTsKLSAgcmV0dXJuIGxpbmVfcCB8fCBmdW5jX3A7Ci19Ci0KLS8qIFRoZSBEV0FSRjIgdmVyc2lvbiBvZiBmaW5kX25lYXJlc3QgbGluZS4gIFJldHVybiB0cnVlIGlmIHRoZSBsaW5lCi0gICBpcyBmb3VuZCB3aXRob3V0IGVycm9yLiAgQUREUl9TSVpFIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCi0gICBpbml0aWFsIC5kZWJ1Z19pbmZvIGxlbmd0aCBmaWVsZCBhbmQgaW4gdGhlIGFiYnJldmlhdGlvbiBvZmZzZXQuCi0gICBZb3UgbWF5IHVzZSB6ZXJvIHRvIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlCi0gICB1c2VkLiAgKi8KLQotYm9vbGVhbgotX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCSAgICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkgICAgICAgbGluZW51bWJlcl9wdHIsCi0JCQkgICAgICAgYWRkcl9zaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCBhZGRyX3NpemU7Ci17Ci0gIC8qIFJlYWQgZWFjaCBjb21waWxhdGlvbiB1bml0IGZyb20gdGhlIHNlY3Rpb24gLmRlYnVnX2luZm8sIGFuZCBjaGVjawotICAgICB0byBzZWUgaWYgaXQgY29udGFpbnMgdGhlIGFkZHJlc3Mgd2UgYXJlIHNlYXJjaGluZyBmb3IuICBJZiB5ZXMsCi0gICAgIGxvb2t1cCB0aGUgYWRkcmVzcywgYW5kIHJldHVybiB0aGUgbGluZSBudW1iZXIgaW5mby4gIElmIG5vLCBnbwotICAgICBvbiB0byB0aGUgbmV4dCBjb21waWxhdGlvbiB1bml0LiAgCi0KLSAgICAgV2Uga2VlcCBhIGxpc3Qgb2YgYWxsIHRoZSBwcmV2aW91c2x5IHJlYWQgY29tcGlsYXRpb24gdW5pdHMsIGFuZAotICAgICBhIHBvaW50ZXIgdG8gdGhlIG5leHQgdW4tcmVhZCBjb21waWxhdGlvbiB1bml0LiAgQ2hlY2sgdGhlIAotICAgICBwcmV2aW91c2x5IHJlYWQgdW5pdHMgYmVmb3JlIHJlYWRpbmcgbW9yZS4KLSAgICAgKi8KLQotICBzdHJ1Y3QgZHdhcmYyX2RlYnVnICpzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMl9maW5kX2xpbmVfaW5mbzsKLQotICAvKiBXaGF0IGFkZHJlc3MgYXJlIHdlIGxvb2tpbmcgZm9yPyAqLwotICBiZmRfdm1hIGFkZHIgPSBvZmZzZXQgKyBzZWN0aW9uLT52bWE7Ci0KLSAgc3RydWN0IGNvbXBfdW5pdCogZWFjaDsKLSAgCi0gICpmaWxlbmFtZV9wdHIgPSBOVUxMOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IE5VTEw7Ci0gICpsaW5lbnVtYmVyX3B0ciA9IDA7Ci0KLSAgLyogVGhlIERXQVJGMiBzcGVjIHNheXMgdGhhdCB0aGUgaW5pdGlhbCBsZW5ndGggZmllbGQsIGFuZCB0aGUKLSAgICAgb2Zmc2V0IG9mIHRoZSBhYmJyZXZpYXRpb24gdGFibGUsIHNob3VsZCBib3RoIGJlIDQtYnl0ZSB2YWx1ZXMuCi0gICAgIEhvd2V2ZXIsIHNvbWUgY29tcGlsZXJzIGRvIHRoaW5ncyBkaWZmZXJlbnRseS4gICovCi0gIGlmIChhZGRyX3NpemUgPT0gMCkKLSAgICBhZGRyX3NpemUgPSA0OwotICBCRkRfQVNTRVJUIChhZGRyX3NpemUgPT0gNCB8fCBhZGRyX3NpemUgPT0gOCk7Ci0gICAgCi0gIGlmICghIHN0YXNoKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgICAgCi0gICAgICBzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMl9maW5kX2xpbmVfaW5mbyA9Ci0JKHN0cnVjdCBkd2FyZjJfZGVidWcqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZjJfZGVidWcpKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWdfaW5mbyIpOwotICAgICAgaWYgKCEgbXNlYykKLQl7Ci0JICAvKiBObyBkd2FyZjIgaW5mby4gIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBzdGFzaAotCSAgICAgaGFzIGJlZW4gYWxsb2NhdGVkLCBidXQgY29udGFpbnMgemVyb3MsIHRoaXMgbGV0cwotCSAgICAgZnV0dXJlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gZmFpbCBxdWlja2VyLiAqLwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAobXNlYyk7Ci0gICAgICBpZiAoc2l6ZSA9PSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgc3Rhc2gtPmluZm9fcHRyID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gtPmluZm9fcHRyKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCBzdGFzaC0+aW5mb19wdHIsIDAsIHNpemUpKQotCXsKLQkgIHN0YXNoLT5pbmZvX3B0ciA9IDA7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzdGFzaC0+aW5mb19wdHJfZW5kID0gc3Rhc2gtPmluZm9fcHRyICsgc2l6ZTsKLQotICAgICAgLyogRklYTUU6IFRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUKLQkgLmRlYnVnX2luZm8gc2VjdGlvbi4gIFRoZSAnbG93JyBhbmQgJ2hpZ2gnIGFkZHJlc3NlcyBvZiB0aGUKLQkgY29tcF91bml0cyBhcmUgY29tcHV0ZWQgYnkgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBpbiB0aGUKLQkgLnRleHQgc2VnbWVudC4gIFdlIG5lZWQgdGhlc2UgYWRkcmVzc2VzIGluIG9yZGVyIHRvIGRldGVybWluZQotCSB0aGUgbmVhcmVzdCBsaW5lIG51bWJlciwgYW5kIHNvIHdlIGhhdmUgdG8gcmVzb2x2ZSB0aGUKLQkgcmVsb2NzLiAgVGhlcmUgaXMgYSBzaW1pbGFyIHByb2JsZW0gd2hlbiB0aGUgLmRlYnVnX2xpbmUKLQkgc2VjdGlvbiBpcyBwcm9jZXNzZWQgYXMgd2VsbCAoZS5nLiwgdGhlcmUgbWF5IGJlIHJlbG9jcwotCSBhZ2FpbnN0IHRoZSBvcGVyYW5kIG9mIHRoZSBEV19MTkVfc2V0X2FkZHJlc3Mgb3BlcmF0b3IpLgotCSAKLQkgVW5mb3J0dW5hdGVseSBnZXR0aW5nIGhvbGQgb2YgdGhlIHJlbG9jIGluZm9ybWF0aW9uIGlzIGhhcmQuLi4KLQotCSBGb3Igbm93LCB0aGlzIG1lYW5zIHRoYXQgZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMgKGFzCi0JIG9wcG9zZWQgdG8gZnVsbHkgZXhlY3V0YWJsZXMpIGRvZXMgbm90IGFsd2F5cyB3b3JrIGFzIHdlbGwgYXMKLQkgd2Ugd291bGQgbGlrZS4gICovCi0gICAgfQotICAKLSAgLyogQSBudWxsIGluZm9fcHRyIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vIGR3YXJmMiBpbmZvIAotICAgICAob3IgdGhhdCBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHNldHRpbmcgdXAgdGhlIHN0YXNoKS4gKi8KLQotICBpZiAoISBzdGFzaC0+aW5mb19wdHIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENoZWNrIHRoZSBwcmV2aW91c2x5IHJlYWQgY29tcC4gdW5pdHMgZmlyc3QuICovCi0KLSAgZm9yIChlYWNoID0gc3Rhc2gtPmFsbF9jb21wX3VuaXRzOyBlYWNoOyBlYWNoID0gZWFjaC0+bmV4dF91bml0KQotICAgIGlmIChjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyAoZWFjaCwgYWRkcikpCi0gICAgICByZXR1cm4gY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChlYWNoLCBhZGRyLCBmaWxlbmFtZV9wdHIsIAotCQkJCQkgIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVudW1iZXJfcHRyKTsKLQotICAvKiBSZWFkIGVhY2ggcmVtYWluaW5nIGNvbXAuIHVuaXRzIGNoZWNraW5nIGVhY2ggYXMgdGhleSBhcmUgcmVhZC4gKi8KLSAgd2hpbGUgKHN0YXNoLT5pbmZvX3B0ciA8IHN0YXNoLT5pbmZvX3B0cl9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGNvbXBfdW5pdCogZWFjaDsKLSAgICAgIGJmZF92bWEgbGVuZ3RoOwotICAgICAgYm9vbGVhbiBmb3VuZDsKLQotICAgICAgaWYgKGFkZHJfc2l6ZSA9PSA0KQotCWxlbmd0aCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgc3Rhc2gtPmluZm9fcHRyKTsKLSAgICAgIGVsc2UKLQlsZW5ndGggPSByZWFkXzhfYnl0ZXMgKGFiZmQsIHN0YXNoLT5pbmZvX3B0cik7Ci0gICAgICBzdGFzaC0+aW5mb19wdHIgKz0gYWRkcl9zaXplOwotCi0gICAgICBpZiAobGVuZ3RoID4gMCkKLSAgICAgICAgewotCSAgZWFjaCA9IHBhcnNlX2NvbXBfdW5pdCAoYWJmZCwgc3Rhc2gtPmluZm9fcHRyLCAKLQkJCQkgIHN0YXNoLT5pbmZvX3B0ciArIGxlbmd0aCwKLQkJCQkgIGFkZHJfc2l6ZSk7Ci0JICBzdGFzaC0+aW5mb19wdHIgKz0gbGVuZ3RoOwotCi0JICBpZiAoZWFjaCkKLQkgICAgewotCSAgICAgIGVhY2gtPm5leHRfdW5pdCA9IHN0YXNoLT5hbGxfY29tcF91bml0czsKLQkgICAgICBzdGFzaC0+YWxsX2NvbXBfdW5pdHMgPSBlYWNoOwotCi0JICAgICAgLyogRFdfQVRfbG93X3BjIGFuZCBEV19BVF9oaWdoX3BjIGFyZSBvcHRpb25hbCBmb3IKLQkJIGNvbXBpbGF0aW9uIHVuaXRzLiAgSWYgd2UgZG9uJ3QgaGF2ZSB0aGVtIChpLmUuLAotCQkgdW5pdC0+aGlnaCA9PSAwKSwgd2UgbmVlZCB0byBjb25zdWx0IHRoZSBsaW5lIGluZm8KLQkJIHRhYmxlIHRvIHNlZSBpZiBhIGNvbXBpbGF0aW9uIHVuaXQgY29udGFpbnMgdGhlIGdpdmVuCi0JCSBhZGRyZXNzLiAqLwotCSAgICAgIGlmIChlYWNoLT5hcmFuZ2UuaGlnaCA+IDApCi0JCXsKLQkJICBpZiAoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MgKGVhY2gsIGFkZHIpKQotCQkgICAgcmV0dXJuIGNvbXBfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoZWFjaCwgYWRkciwKLQkJCQkJCSAgICAgICBmaWxlbmFtZV9wdHIsCi0JCQkJCQkgICAgICAgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkJCSAgICAgICBsaW5lbnVtYmVyX3B0cik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmb3VuZCA9IGNvbXBfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoZWFjaCwgYWRkciwKLQkJCQkJCSAgICAgICBmaWxlbmFtZV9wdHIsCi0JCQkJCQkgICAgICAgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkJCSAgICAgICBsaW5lbnVtYmVyX3B0cik7Ci0JCSAgaWYgKGZvdW5kKQotCQkgICAgcmV0dXJuIHRydWU7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBlbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvYmZkL2Vjb2ZmLmMgYi9iZmQvZWNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxMzZlZS4uMDAwMDAwMAotLS0gYS9iZmQvZWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4NDkgKzAsMCBAQAotLyogR2VuZXJpYyBFQ09GRiAoRXh0ZW5kZWQtQ09GRikgcm91dGluZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIE9yaWdpbmFsIHZlcnNpb24gYnkgUGVyIEJvdGhuZXIuCi0gICBGdWxsIHN1cHBvcnQgYWRkZWQgYnkgSWFuIExhbmNlIFRheWxvciwgaWFuQGN5Z251cy5jb20uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAiYW91dC9yYW5saWIuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLS8qIEZJWE1FOiBXZSBuZWVkIHRoZSBkZWZpbml0aW9ucyBvZiBOX1NFVFtBRFRCXSwgYnV0IGFvdXQ2NC5oIGRlZmluZXMKLSAgIHNvbWUgb3RoZXIgc3R1ZmYgd2hpY2ggd2UgZG9uJ3Qgd2FudCBhbmQgd2hpY2ggY29uZmxpY3RzIHdpdGggc3R1ZmYKLSAgIHdlIGRvIHdhbnQuICAqLwotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI3VuZGVmIE5fQUJTCi0jdW5kZWYgZXhlY19oZHIKLSN1bmRlZiBvYmpfc3ltX2ZpbGVwb3MKLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0MCi0vKiBQcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIGludCBlY29mZl9nZXRfbWFnaWMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgbG9uZyBlY29mZl9zZWNfdG9fc3R5cF9mbGFncyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICAgIGZsYWd3b3JkIGZsYWdzKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9zZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICphYmZkLCBTWU1SICplY29mZl9zeW0sCi0JCQkJCSAgIGFzeW1ib2wgKmFzeW0sIGludCBleHQsIGludCB3ZWFrKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSBQQVJBTVMgKChiZmQgKmFiZmQsIEZEUiAqZmRyLAotCQkJCQkgIGNoYXIgKnN0cmluZywKLQkJCQkJICBSTkRYUiAqcm5keCwgbG9uZyBpc3ltLAotCQkJCQkgIGNvbnN0IGNoYXIgKndoaWNoKSk7Ci1zdGF0aWMgY2hhciAqZWNvZmZfdHlwZV90b19zdHJpbmcgUEFSQU1TICgoYmZkICphYmZkLCBGRFIgKmZkciwKLQkJCQkJICAgdW5zaWduZWQgaW50IGluZHgpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQlhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGludCBlY29mZl9zb3J0X2hkcnMgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9nZXRfZXh0ciBQQVJBTVMgKChhc3ltYm9sICosIEVYVFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc2V0X2luZGV4IFBBUkFNUyAoKGFzeW1ib2wgKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIHVuc2lnbmVkIGludCBlY29mZl9hcm1hcF9oYXNoIFBBUkFNUyAoKENPTlNUIGNoYXIgKnMsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCAqcmVoYXNoLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50IGhsb2cpKTsKLQwKLS8qIFRoaXMgc3R1ZmYgaXMgc29tZXdoYXQgY29waWVkIGZyb20gY29mZmNvZGUuaC4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiBiZmRfZGVidWdfc2VjdGlvbiA9Ci17Ci0gIC8qIG5hbWUsICAgaW5kZXgsIG5leHQsIGZsYWdzLCBzZXRfdm1hLCByZWxvY19kb25lLCBsaW5rZXJfbWFyaywgZ2NfbWFyayAqLwotICAiKkRFQlVHKiIsIDAsICAgICAwLCAgICAwLCAgICAgMCwgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgIDAsCi0gIC8qIHZtYSwgbG1hLCBfY29va2VkX3NpemUsIF9yYXdfc2l6ZSwgb3V0cHV0X29mZnNldCwgb3V0cHV0X3NlY3Rpb24sICovCi0gIDAsICAgICAgMCwgICAwLCAgICAgICAgICAgIDAsICAgICAgICAgMCwgICAgICAgICAgICAgTlVMTCwKLSAgLyogYWxpZywgcmVsb2MuLi4sIG9yZWwuLi4sIHJlbG9jX2NvdW50LCBmaWxlcG9zLCByZWxfLi4uLCBsaW5lXy4uLiAqLwotICAwLCAgICAgICAwLCAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgIDAsICAgICAgIDAsIAkgICAwLAotICAvKiB1c2VyZGF0YSwgY29udGVudHMsIGxpbmVubywgbGluZW5vX2NvdW50ICovCi0gIDAsICAgICAgICAgICAwLCAgICAgICAgMCwgICAgICAwLAotICAvKiBjb21kYXRfaW5mbywgbW92aW5nX2xpbmVfZmlsZXBvcywgdGFyZ2V0X2luZGV4LCB1c2VkX2J5X2JmZCwgICovCi0gIE5VTEwsICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgIDAsCi0gIC8qIGNvbnMsIG93bmVyLCBzeW1ib2wgKi8KLSAgMCwgICAgICAgMCwgICAgIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICopIE5VTEwsCi0gIC8qIHN5bWJvbF9wdHJfcHRyLCAgICAgICAgICAgICAgICAgICBsaW5rX29yZGVyX2hlYWQsIC4uLl90YWlsICovCi0gIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSBOVUxMLCBOVUxMLCAgICAgICAgICAgIE5VTEwKLX07Ci0KLS8qIENyZWF0ZSBhbiBFQ09GRiBvYmplY3QuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPnRkYXRhLmVjb2ZmX29ial9kYXRhID0gKChzdHJ1Y3QgZWNvZmZfdGRhdGEgKikKLQkJCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGVjb2ZmX2RhdGFfdHlwZSkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmVjb2ZmX29ial9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgaG9vayBjYWxsZWQgYnkgY29mZl9yZWFsX29iamVjdF9wIHRvIGNyZWF0ZSBhbnkgYmFja2VuZAotICAgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotCi1QVFIKLV9iZmRfZWNvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLSAgICAgUFRSIGFvdXRoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICppbnRlcm5hbF9hID0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIGFvdXRoZHI7Ci0gIGVjb2ZmX2RhdGFfdHlwZSAqZWNvZmY7Ci0KLSAgaWYgKF9iZmRfZWNvZmZfbWtvYmplY3QgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBOVUxMOwotCi0gIGVjb2ZmID0gZWNvZmZfZGF0YSAoYWJmZCk7Ci0gIGVjb2ZmLT5ncF9zaXplID0gODsKLSAgZWNvZmYtPnN5bV9maWxlcG9zID0gaW50ZXJuYWxfZi0+Zl9zeW1wdHI7Ci0KLSAgaWYgKGludGVybmFsX2EgIT0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIE5VTEwpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGVjb2ZmLT50ZXh0X3N0YXJ0ID0gaW50ZXJuYWxfYS0+dGV4dF9zdGFydDsKLSAgICAgIGVjb2ZmLT50ZXh0X2VuZCA9IGludGVybmFsX2EtPnRleHRfc3RhcnQgKyBpbnRlcm5hbF9hLT50c2l6ZTsKLSAgICAgIGVjb2ZmLT5ncCA9IGludGVybmFsX2EtPmdwX3ZhbHVlOwotICAgICAgZWNvZmYtPmdwcm1hc2sgPSBpbnRlcm5hbF9hLT5ncHJtYXNrOwotICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQllY29mZi0+Y3BybWFza1tpXSA9IGludGVybmFsX2EtPmNwcm1hc2tbaV07Ci0gICAgICBlY29mZi0+ZnBybWFzayA9IGludGVybmFsX2EtPmZwcm1hc2s7Ci0gICAgICBpZiAoaW50ZXJuYWxfYS0+bWFnaWMgPT0gRUNPRkZfQU9VVF9aTUFHSUMpCi0JYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRDsKLSAgICAgIGVsc2UKLQlhYmZkLT5mbGFncyAmPX4gRF9QQUdFRDsKLSAgICB9Ci0KLSAgLyogSXQgdHVybnMgb3V0IHRoYXQgbm8gc3BlY2lhbCBhY3Rpb24gaXMgcmVxdWlyZWQgYnkgdGhlIE1JUFMgb3IKLSAgICAgQWxwaGEgRUNPRkYgYmFja2VuZHMuICBUaGV5IGhhdmUgZGlmZmVyZW50IGluZm9ybWF0aW9uIGluIHRoZQotICAgICBhLm91dCBoZWFkZXIsIGJ1dCB3ZSBqdXN0IGNvcHkgaXQgYWxsIChlLmcuLCBncHJtYXNrLCBjcHJtYXNrIGFuZAotICAgICBmcHJtYXNrKSBhbmQgbGV0IHRoZSBzd2FwcGluZyByb3V0aW5lcyBlbnN1cmUgdGhhdCBvbmx5IHJlbGV2YW50Ci0gICAgIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gb3V0LiAgKi8KLQotICByZXR1cm4gKFBUUikgZWNvZmY7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBuZXcgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSA0OwotCi0gIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9URVhUKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9JTklUKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9GSU5JKSA9PSAwKQotICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0RBVEEpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9TREFUQSkgPT0gMCkKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9SREFUQSkgPT0gMAotCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJVDgpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9MSVQ0KSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfUkNPTlNUKSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfUERBVEEpID09IDApCi0gICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWTsKLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfQlNTKSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfU0JTUykgPT0gMCkKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJQikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBBbiBJcml4IDQgc2hhcmVkIGxpYmFyeS4gICovCi0gICAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICB9Ci0KLSAgLyogUHJvYmFibHkgYW55IG90aGVyIHNlY3Rpb24gbmFtZSBpcyBTRUNfTkVWRVJfTE9BRCwgYnV0IEknbQotICAgICB1bmNlcnRhaW4gYWJvdXQgLmluaXQgb24gc29tZSBzeXN0ZW1zIGFuZCBJIGRvbid0IGtub3cgaG93IHNoYXJlZAotICAgICBsaWJyYXJpZXMgd29yay4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERldGVybWluZSB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIHR5cGUuICBUaGlzIGlzIGNhbGxlZCBmcm9tCi0gICB0aGUgZ2VuZXJpYyBDT0ZGIHJvdXRpbmVzLiAgSXQgaXMgdGhlIGludmVyc2Ugb2YgZWNvZmZfZ2V0X21hZ2ljLAotICAgYmVsb3cuICBUaGlzIGNvdWxkIGJlIGFuIEVDT0ZGIGJhY2tlbmQgcm91dGluZSwgd2l0aCBvbmUgdmVyc2lvbgotICAgZm9yIGVhY2ggdGFyZ2V0LCBidXQgdGhlcmUgYXJlbid0IGFsbCB0aGF0IG1hbnkgRUNPRkYgdGFyZ2V0cy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rIChhYmZkLCBmaWxlaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgdW5zaWduZWQgbG9uZyBtYWNoOwotCi0gIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9tYWdpYykKLSAgICB7Ci0gICAgY2FzZSBNSVBTX01BR0lDXzE6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRToKLSAgICBjYXNlIE1JUFNfTUFHSUNfQklHOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBtYWNoID0gMzAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRTI6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzI6Ci0gICAgICAvKiBNSVBTIElTQSBsZXZlbCAyOiB0aGUgcjYwMDAgKi8KLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgICAgbWFjaCA9IDYwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTUlQU19NQUdJQ19MSVRUTEUzOgotICAgIGNhc2UgTUlQU19NQUdJQ19CSUczOgotICAgICAgLyogTUlQUyBJU0EgbGV2ZWwgMzogdGhlIHI0MDAwICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKLSAgICAgIG1hY2ggPSA0MDAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2FscGhhOwotICAgICAgbWFjaCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICAgIG1hY2ggPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKTsKLX0KLQotLyogR2V0IHRoZSBtYWdpYyBudW1iZXIgdG8gdXNlIGJhc2VkIG9uIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUuCi0gICBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIF9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLCBhYm92ZS4gICovCi0KLXN0YXRpYyBpbnQKLWVjb2ZmX2dldF9tYWdpYyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgYmlnLCBsaXR0bGU7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSAwOgotCWNhc2UgMzAwMDoKLQkgIGJpZyA9IE1JUFNfTUFHSUNfQklHOwotCSAgbGl0dGxlID0gTUlQU19NQUdJQ19MSVRUTEU7Ci0JICBicmVhazsKLQotCWNhc2UgNjAwMDoKLQkgIGJpZyA9IE1JUFNfTUFHSUNfQklHMjsKLQkgIGxpdHRsZSA9IE1JUFNfTUFHSUNfTElUVExFMjsKLQkgIGJyZWFrOwotCi0JY2FzZSA0MDAwOgotCSAgYmlnID0gTUlQU19NQUdJQ19CSUczOwotCSAgbGl0dGxlID0gTUlQU19NQUdJQ19MSVRUTEUzOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICByZXR1cm4gYmZkX2JpZ19lbmRpYW4gKGFiZmQpID8gYmlnIDogbGl0dGxlOwotCi0gICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKLSAgICAgIHJldHVybiBBTFBIQV9NQUdJQzsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogR2V0IHRoZSBzZWN0aW9uIHNfZmxhZ3MgdG8gdXNlIGZvciBhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgbG9uZwotZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MgKG5hbWUsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgbG9uZyBzdHlwOwotCi0gIHN0eXAgPSAwOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsIF9URVhUKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1RFWFQ7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RBVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfREFUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0RBVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfU0RBVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JEQVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1JEQVRBOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0xJVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJVDgpID09IDApCi0gICAgc3R5cCA9IFNUWVBfTElUODsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElUNCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9MSVQ0OwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9CU1MpID09IDApCi0gICAgc3R5cCA9IFNUWVBfQlNTOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9TQlNTKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1NCU1M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0lOSVQpID09IDApCi0gICAgc3R5cCA9IFNUWVBfRUNPRkZfSU5JVDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRklOSSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9FQ09GRl9GSU5JOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9QREFUQSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9QREFUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfWERBVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfWERBVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJQikgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9FQ09GRl9MSUI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0dPVCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9HT1Q7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0hBU0gpID09IDApCi0gICAgc3R5cCA9IFNUWVBfSEFTSDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRFlOQU1JQykgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9EWU5BTUlDOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSUJMSVNUKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0xJQkxJU1Q7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JFTERZTikgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9SRUxEWU47Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0NPTkZMSUMpID09IDApCi0gICAgc3R5cCA9IFNUWVBfQ09ORkxJQzsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRFlOU1RSKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0RZTlNUUjsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRFlOU1lNKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0RZTlNZTTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfQ09NTUVOVCkgPT0gMCkKLSAgICB7Ci0gICAgICBzdHlwID0gU1RZUF9DT01NRU5UOwotICAgICAgZmxhZ3MgJj1+IFNFQ19ORVZFUl9MT0FEOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkNPTlNUKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1JDT05TVDsKLSAgZWxzZSBpZiAoZmxhZ3MgJiBTRUNfQ09ERSkgCi0gICAgc3R5cCA9IFNUWVBfVEVYVDsKLSAgZWxzZSBpZiAoZmxhZ3MgJiBTRUNfREFUQSkgCi0gICAgc3R5cCA9IFNUWVBfREFUQTsKLSAgZWxzZSBpZiAoZmxhZ3MgJiBTRUNfUkVBRE9OTFkpCi0gICAgc3R5cCA9IFNUWVBfUkRBVEE7Ci0gIGVsc2UgaWYgKGZsYWdzICYgU0VDX0xPQUQpCi0gICAgc3R5cCA9IFNUWVBfUkVHOwotICBlbHNlCi0gICAgc3R5cCA9IFNUWVBfQlNTOwotCi0gIGlmIChmbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotICAgIHN0eXAgfD0gU1RZUF9OT0xPQUQ7Ci0KLSAgcmV0dXJuIHN0eXA7Ci19Ci0KLS8qIEdldCB0aGUgQkZEIGZsYWdzIHRvIHVzZSBmb3IgYSBzZWN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1mbGFnd29yZAotX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyAoYWJmZCwgaGRyLCBuYW1lLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGhkcjsKLSAgICAgY29uc3QgY2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICppbnRlcm5hbF9zID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaGRyOwotICBsb25nIHN0eXBfZmxhZ3MgPSBpbnRlcm5hbF9zLT5zX2ZsYWdzOwotICBmbGFnd29yZCBzZWNfZmxhZ3M9MDsKLQotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfTk9MT0FEKQotICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLQotICAvKiBGb3IgMzg2IENPRkYsIGF0IGxlYXN0LCBhbiB1bmxvYWRhYmxlIHRleHQgb3IgZGF0YSBzZWN0aW9uIGlzCi0gICAgIGFjdHVhbGx5IGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gICovCi0gIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfVEVYVCkKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9FQ09GRl9JTklUKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0VDT0ZGX0ZJTkkpCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRFlOQU1JQykKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSUJMSVNUKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1JFTERZTikKLSAgICAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9DT05GTElDCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRFlOU1RSKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0RZTlNZTSkKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9IQVNIKSkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgfQotICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfREFUQSkKLQkgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfUkRBVEEpCi0JICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1NEQVRBKQotCSAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9QREFUQQotCSAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9YREFUQQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9HT1QpCi0JICAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1JDT05TVCkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgICBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX1JEQVRBKQotCSAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1BEQVRBCi0JICB8fCBzdHlwX2ZsYWdzID09IFNUWVBfUkNPTlNUKQotCXNlY19mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0gICAgfQotICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfQlNTKQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9TQlNTKSkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX0lORk8pIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9DT01NRU5UKQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzdHlwX2ZsYWdzICYgU1RZUF9MSVRBKQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSVQ4KQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSVQ0KSkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0VDT0ZGX0xJQikKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotICAgIH0KLQotICByZXR1cm4gc2VjX2ZsYWdzOwotfQotDAotLyogUmVhZCBpbiB0aGUgc3ltYm9saWMgaGVhZGVyIGZvciBhbiBFQ09GRiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9oZHJfc2l6ZTsKLSAgUFRSIHJhdyA9IE5VTEw7Ci0gIEhEUlIgKmludGVybmFsX3N5bWhkcjsKLQotICAvKiBTZWUgaWYgd2UndmUgYWxyZWFkeSByZWFkIGl0IGluLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5tYWdpYyA9PSAKLSAgICAgIGJhY2tlbmQtPmRlYnVnX3N3YXAuc3ltX21hZ2ljKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlZSB3aGV0aGVyIHRoZXJlIGlzIGEgc3ltYm9saWMgaGVhZGVyLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBBdCB0aGlzIHBvaW50IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpIGhvbGRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scwotICAgICBhcyByZWFkIGZyb20gdGhlIGZpbGUgaGVhZGVyLCBidXQgb24gRUNPRkYgdGhpcyBpcyBhbHdheXMgdGhlCi0gICAgIHNpemUgb2YgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGhlYWRlci4gIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8KLSAgICAgaGFuZGxlIHRoaXMgd2hlbiB3ZSBmaXJzdCByZWFkIHRoZSBmaWxlIGluIGNvZmZnZW4uYy4gICovCi0gIGV4dGVybmFsX2hkcl9zaXplID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9oZHJfc2l6ZTsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IGV4dGVybmFsX2hkcl9zaXplKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBoZWFkZXIuICAqLwotICByYXcgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBleHRlcm5hbF9oZHJfc2l6ZSk7Ci0gIGlmIChyYXcgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcywgU0VFS19TRVQpID09IC0xCi0gICAgICB8fCAoYmZkX3JlYWQgKHJhdywgZXh0ZXJuYWxfaGRyX3NpemUsIDEsIGFiZmQpCi0JICAhPSBleHRlcm5hbF9oZHJfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGludGVybmFsX3N5bWhkciA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXI7Ci0gICgqYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2hkcl9pbikgKGFiZmQsIHJhdywgaW50ZXJuYWxfc3ltaGRyKTsKLQotICBpZiAoaW50ZXJuYWxfc3ltaGRyLT5tYWdpYyAhPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN5bV9tYWdpYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBOb3cgd2UgY2FuIGdldCB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc3ltYm9scy4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gKGludGVybmFsX3N5bWhkci0+aXN5bU1heAotCQkJICAgICArIGludGVybmFsX3N5bWhkci0+aWV4dE1heCk7Ci0KLSAgaWYgKHJhdyAhPSBOVUxMKQotICAgIGZyZWUgKHJhdyk7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJhdyAhPSBOVUxMKQotICAgIGZyZWUgKHJhdyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCBpbiBhbmQgc3dhcCB0aGUgaW1wb3J0YW50IHN5bWJvbGljIGluZm9ybWF0aW9uIGZvciBhbiBFQ09GRgotICAgb2JqZWN0IGZpbGUuICBUaGlzIGlzIGNhbGxlZCBieSBnZGIgdmlhIHRoZSByZWFkX2RlYnVnX2luZm8gZW50cnkKLSAgIHBvaW50IGluIHRoZSBiYWNrZW5kIHN0cnVjdHVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCBpZ25vcmUsIGRlYnVnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBIRFJSICppbnRlcm5hbF9zeW1oZHI7Ci0gIGJmZF9zaXplX3R5cGUgcmF3X2Jhc2U7Ci0gIGJmZF9zaXplX3R5cGUgcmF3X3NpemU7Ci0gIFBUUiByYXc7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIGNoYXIgKmZyYXdfc3JjOwotICBjaGFyICpmcmF3X2VuZDsKLSAgc3RydWN0IGZkciAqZmRyX3B0cjsKLSAgYmZkX3NpemVfdHlwZSByYXdfZW5kOwotICBiZmRfc2l6ZV90eXBlIGNiX2VuZDsKLQotICBCRkRfQVNTRVJUIChkZWJ1ZyA9PSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8pOwotCi0gIC8qIENoZWNrIHdoZXRoZXIgd2UndmUgYWxyZWFkeSBnb3R0ZW4gaXQsIGFuZCB3aGV0aGVyIHRoZXJlJ3MgYW55IHRvCi0gICAgIGdldC4gICovCi0gIGlmIChlY29mZl9kYXRhIChhYmZkKS0+cmF3X3N5bWVudHMgIT0gKFBUUikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoISBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbnRlcm5hbF9zeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLQotICAvKiBSZWFkIGFsbCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gYXQgb25jZS4gICovCi0gIHJhd19iYXNlID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcwotCSAgICAgICsgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9oZHJfc2l6ZSk7Ci0KLSAgLyogQWxwaGEgZWNvZmYgbWFrZXMgdGhlIGRldGVybWluYXRpb24gb2YgcmF3X3NpemUgZGlmZmljdWx0LiBJdCBoYXMKLSAgICAgYW4gdW5kb2N1bWVudGVkIGRlYnVnIGRhdGEgc2VjdGlvbiBiZXR3ZWVuIHRoZSBzeW1oZHIgYW5kIHRoZSBmaXJzdAotICAgICBkb2N1bWVudGVkIHNlY3Rpb24uIEFuZCB0aGUgb3JkZXJpbmcgb2YgdGhlIHNlY3Rpb25zIHZhcmllcyBiZXR3ZWVuCi0gICAgIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcy4KLSAgICAgSWYgYmZkIHN1cHBvcnRzIFNFRUtfRU5EIHNvbWVkYXksIHRoaXMgY29kZSBjb3VsZCBiZSBzaW1wbGlmaWVkLiAgKi8KLQotICByYXdfZW5kID0gMDsKLQotI2RlZmluZSBVUERBVEVfUkFXX0VORChzdGFydCwgY291bnQsIHNpemUpIFwKLSAgY2JfZW5kID0gaW50ZXJuYWxfc3ltaGRyLT5zdGFydCArIGludGVybmFsX3N5bWhkci0+Y291bnQgKiAoc2l6ZSk7IFwKLSAgaWYgKGNiX2VuZCA+IHJhd19lbmQpIFwKLSAgICByYXdfZW5kID0gY2JfZW5kCi0KLSAgVVBEQVRFX1JBV19FTkQgKGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiRG5PZmZzZXQsIGlkbk1heCwgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9kbnJfc2l6ZSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYlBkT2Zmc2V0LCBpcGRNYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfcGRyX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JTeW1PZmZzZXQsIGlzeW1NYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfc3ltX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JPcHRPZmZzZXQsIGlvcHRNYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfb3B0X3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICBVUERBVEVfUkFXX0VORCAoY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiU3NFeHRPZmZzZXQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYkZkT2Zmc2V0LCBpZmRNYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZmRyX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JSZmRPZmZzZXQsIGNyZmQsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfcmZkX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JFeHRPZmZzZXQsIGlleHRNYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZXh0X3NpemUpOwotCi0jdW5kZWYgVVBEQVRFX1JBV19FTkQKLQotICByYXdfc2l6ZSA9IHJhd19lbmQgLSByYXdfYmFzZTsKLSAgaWYgKHJhd19zaXplID09IDApCi0gICAgewotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zID0gMDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgcmF3ID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByYXdfc2l6ZSk7Ci0gIGlmIChyYXcgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcwotCQkgKyBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2hkcl9zaXplKSwKLQkJU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChyYXcsIHJhd19zaXplLCAxLCBhYmZkKSAhPSByYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmF3KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPnJhd19zeW1lbnRzID0gcmF3OwotCi0gIC8qIEdldCBwb2ludGVycyBmb3IgdGhlIG51bWVyaWMgb2Zmc2V0cyBpbiB0aGUgSERSUiBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBGSVgob2ZmMSwgb2ZmMiwgdHlwZSkgXAotICBpZiAoaW50ZXJuYWxfc3ltaGRyLT5vZmYxID09IDApIFwKLSAgICBkZWJ1Zy0+b2ZmMiA9ICh0eXBlKSBOVUxMOyBcCi0gIGVsc2UgXAotICAgIGRlYnVnLT5vZmYyID0gKHR5cGUpICgoY2hhciAqKSByYXcgXAotCQkJICArIChpbnRlcm5hbF9zeW1oZHItPm9mZjEgXAotCQkJICAgICAtIHJhd19iYXNlKSkKLSAgRklYIChjYkxpbmVPZmZzZXQsIGxpbmUsIHVuc2lnbmVkIGNoYXIgKik7Ci0gIEZJWCAoY2JEbk9mZnNldCwgZXh0ZXJuYWxfZG5yLCBQVFIpOwotICBGSVggKGNiUGRPZmZzZXQsIGV4dGVybmFsX3BkciwgUFRSKTsKLSAgRklYIChjYlN5bU9mZnNldCwgZXh0ZXJuYWxfc3ltLCBQVFIpOwotICBGSVggKGNiT3B0T2Zmc2V0LCBleHRlcm5hbF9vcHQsIFBUUik7Ci0gIEZJWCAoY2JBdXhPZmZzZXQsIGV4dGVybmFsX2F1eCwgdW5pb24gYXV4X2V4dCAqKTsKLSAgRklYIChjYlNzT2Zmc2V0LCBzcywgY2hhciAqKTsKLSAgRklYIChjYlNzRXh0T2Zmc2V0LCBzc2V4dCwgY2hhciAqKTsKLSAgRklYIChjYkZkT2Zmc2V0LCBleHRlcm5hbF9mZHIsIFBUUik7Ci0gIEZJWCAoY2JSZmRPZmZzZXQsIGV4dGVybmFsX3JmZCwgUFRSKTsKLSAgRklYIChjYkV4dE9mZnNldCwgZXh0ZXJuYWxfZXh0LCBQVFIpOwotI3VuZGVmIEZJWAotCi0gIC8qIEkgZG9uJ3Qgd2FudCB0byBhbHdheXMgc3dhcCBhbGwgdGhlIGRhdGEsIGJlY2F1c2UgaXQgd2lsbCBqdXN0Ci0gICAgIHdhc3RlIHRpbWUgYW5kIG1vc3QgcHJvZ3JhbXMgd2lsbCBuZXZlciBsb29rIGF0IGl0LiAgVGhlIG9ubHkKLSAgICAgdGltZSB0aGUgbGlua2VyIG5lZWRzIG1vc3Qgb2YgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBzd2FwcGVkCi0gICAgIGlzIHdoZW4gbGlua2luZyBiaWctZW5kaWFuIGFuZCBsaXR0bGUtZW5kaWFuIE1JUFMgb2JqZWN0IGZpbGVzCi0gICAgIHRvZ2V0aGVyLCB3aGljaCBpcyBub3QgYSBjb21tb24gb2NjdXJyZW5jZS4KLQotICAgICBXZSBuZWVkIHRvIGxvb2sgYXQgdGhlIGZkciB0byBkZWFsIHdpdGggYSBsb3Qgb2YgaW5mb3JtYXRpb24gaW4KLSAgICAgdGhlIHN5bWJvbHMsIHNvIHdlIHN3YXAgdGhlbSBoZXJlLiAgKi8KLSAgZGVidWctPmZkciA9IChzdHJ1Y3QgZmRyICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJIChpbnRlcm5hbF9zeW1oZHItPmlmZE1heCAqCi0JCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgZmRyKSkpOwotICBpZiAoZGVidWctPmZkciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZXh0ZXJuYWxfZmRyX3NpemUgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2Zkcl9zaXplOwotICBmZHJfcHRyID0gZGVidWctPmZkcjsKLSAgZnJhd19zcmMgPSAoY2hhciAqKSBkZWJ1Zy0+ZXh0ZXJuYWxfZmRyOwotICBmcmF3X2VuZCA9IGZyYXdfc3JjICsgaW50ZXJuYWxfc3ltaGRyLT5pZmRNYXggKiBleHRlcm5hbF9mZHJfc2l6ZTsKLSAgZm9yICg7IGZyYXdfc3JjIDwgZnJhd19lbmQ7IGZyYXdfc3JjICs9IGV4dGVybmFsX2Zkcl9zaXplLCBmZHJfcHRyKyspCi0gICAgKCpiYWNrZW5kLT5kZWJ1Z19zd2FwLnN3YXBfZmRyX2luKSAoYWJmZCwgKFBUUikgZnJhd19zcmMsIGZkcl9wdHIpOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRUNPRkYgc3ltYm9sIHRhYmxlIHJvdXRpbmVzLiAgVGhlIEVDT0ZGIHN5bWJvbCB0YWJsZSBpcyBkZXNjcmliZWQKLSAgIGluIGdjYy9taXBzLXRmaWxlLmMuICAqLwotCi0vKiBFQ09GRiB1c2VzIHR3byBjb21tb24gc2VjdGlvbnMuICBPbmUgaXMgdGhlIHVzdWFsIG9uZSwgYW5kIHRoZQotICAgb3RoZXIgaXMgZm9yIHNtYWxsIG9iamVjdHMuICBBbGwgdGhlIHNtYWxsIG9iamVjdHMgYXJlIGtlcHQKLSAgIHRvZ2V0aGVyLCBhbmQgdGhlbiByZWZlcmVuY2VkIHZpYSB0aGUgZ3AgcG9pbnRlciwgd2hpY2ggeWllbGRzCi0gICBmYXN0ZXIgYXNzZW1ibGVyIGNvZGUuICBUaGlzIGlzIHdoYXQgd2UgdXNlIGZvciB0aGUgc21hbGwgY29tbW9uCi0gICBzZWN0aW9uLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiBlY29mZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCBlY29mZl9zY29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICplY29mZl9zY29tX3N5bWJvbF9wdHI7Ci0KLS8qIENyZWF0ZSBhbiBlbXB0eSBzeW1ib2wuICAqLwotCi1hc3ltYm9sICoKLV9iZmRfZWNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKm5ldzsKLQotICBuZXcgPSAoZWNvZmZfc3ltYm9sX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGVjb2ZmX3N5bWJvbF90eXBlKSk7Ci0gIGlmIChuZXcgPT0gKGVjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwpCi0gICAgcmV0dXJuIChhc3ltYm9sICopIE5VTEw7Ci0gIG1lbXNldCAoKFBUUikgbmV3LCAwLCBzaXplb2YgKm5ldyk7Ci0gIG5ldy0+c3ltYm9sLnNlY3Rpb24gPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgbmV3LT5mZHIgPSAoRkRSICopIE5VTEw7Ci0gIG5ldy0+bG9jYWwgPSBmYWxzZTsKLSAgbmV3LT5uYXRpdmUgPSBOVUxMOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotLyogU2V0IHRoZSBCRkQgZmxhZ3MgYW5kIHNlY3Rpb24gZm9yIGFuIEVDT0ZGIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9zZXRfc3ltYm9sX2luZm8gKGFiZmQsIGVjb2ZmX3N5bSwgYXN5bSwgZXh0LCB3ZWFrKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFNZTVIgKmVjb2ZmX3N5bTsKLSAgICAgYXN5bWJvbCAqYXN5bTsKLSAgICAgaW50IGV4dDsKLSAgICAgaW50IHdlYWs7Ci17Ci0gIGFzeW0tPnRoZV9iZmQgPSBhYmZkOwotICBhc3ltLT52YWx1ZSA9IGVjb2ZmX3N5bS0+dmFsdWU7Ci0gIGFzeW0tPnNlY3Rpb24gPSAmYmZkX2RlYnVnX3NlY3Rpb247Ci0gIGFzeW0tPnVkYXRhLmkgPSAwOwotCi0gIC8qIE1vc3Qgc3ltYm9sIHR5cGVzIGFyZSBqdXN0IGZvciBkZWJ1Z2dpbmcuICAqLwotICBzd2l0Y2ggKGVjb2ZmX3N5bS0+c3QpCi0gICAgewotICAgIGNhc2Ugc3RHbG9iYWw6Ci0gICAgY2FzZSBzdFN0YXRpYzoKLSAgICBjYXNlIHN0TGFiZWw6Ci0gICAgY2FzZSBzdFByb2M6Ci0gICAgY2FzZSBzdFN0YXRpY1Byb2M6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHN0TmlsOgotICAgICAgaWYgKEVDT0ZGX0lTX1NUQUIgKGVjb2ZmX3N5bSkpCi0JewotCSAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAod2VhaykKLSAgICBhc3ltLT5mbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfV0VBSzsKLSAgZWxzZSBpZiAoZXh0KQotICAgIGFzeW0tPmZsYWdzID0gQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9MT0NBTDsKLSAgICAgIC8qIE5vcm1hbGx5LCBhIGxvY2FsIHN0UHJvYyBzeW1ib2wgd2lsbCBoYXZlIGEgY29ycmVzcG9uZGluZwotICAgICAgICAgZXh0ZXJuYWwgc3ltYm9sLiAgV2UgbWFyayB0aGUgbG9jYWwgc3ltYm9sIGFzIGEgZGVidWdnaW5nCi0gICAgICAgICBzeW1ib2wsIGluIG9yZGVyIHRvIHByZXZlbnQgbm0gZnJvbSBwcmludGluZyBib3RoIG91dC4KLSAgICAgICAgIFNpbWlsYXJseSwgd2UgbWFyayBzdExhYmVsIGFuZCBzdGFicyBzeW1ib2xzIGFzIGRlYnVnZ2luZwotICAgICAgICAgc3ltYm9scy4gIEluIGJvdGggY2FzZXMsIHdlIGRvIHdhbnQgdG8gc2V0IHRoZSB2YWx1ZQotICAgICAgICAgY29ycmVjdGx5IGJhc2VkIG9uIHRoZSBzeW1ib2wgY2xhc3MuICAqLwotICAgICAgaWYgKGVjb2ZmX3N5bS0+c3QgPT0gc3RQcm9jCi0JICB8fCBlY29mZl9zeW0tPnN0ID09IHN0TGFiZWwKLQkgIHx8IEVDT0ZGX0lTX1NUQUIgKGVjb2ZmX3N5bSkpCi0JYXN5bS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLSAgICB9Ci0gIHN3aXRjaCAoZWNvZmZfc3ltLT5zYykKLSAgICB7Ci0gICAgY2FzZSBzY05pbDoKLSAgICAgIC8qIFVzZWQgZm9yIGNvbXBpbGVyIGdlbmVyYXRlZCBsYWJlbHMuICBMZWF2ZSB0aGVtIGluIHRoZQotCSBkZWJ1Z2dpbmcgc2VjdGlvbiwgYW5kIG1hcmsgdGhlbSBhcyBsb2NhbC4gIElmIEJTRl9ERUJVR0dJTkcKLQkgaXMgc2V0LCB0aGVuIG5tIGRvZXMgbm90IGRpc3BsYXkgdGhlbSBmb3Igc29tZSByZWFzb24uICBJZiBubwotCSBmbGFncyBhcmUgc2V0IHRoZW4gdGhlIGxpbmtlciB3aGluZXMgYWJvdXQgdGhlbS4gICovCi0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9MT0NBTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NUZXh0OgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi50ZXh0Iik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjRGF0YToKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZGF0YSIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0JzczoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuYnNzIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjUmVnaXN0ZXI6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjQWJzOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjVW5kZWZpbmVkOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBhc3ltLT5mbGFncyA9IDA7Ci0gICAgICBhc3ltLT52YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjQ2RiTG9jYWw6Ci0gICAgY2FzZSBzY0JpdHM6Ci0gICAgY2FzZSBzY0NkYlN5c3RlbToKLSAgICBjYXNlIHNjUmVnSW1hZ2U6Ci0gICAgY2FzZSBzY0luZm86Ci0gICAgY2FzZSBzY1VzZXJTdHJ1Y3Q6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjU0RhdGE6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNkYXRhIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjU0JzczoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2JzcyIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1JEYXRhOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5yZGF0YSIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1ZhcjoKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NDb21tb246Ci0gICAgICBpZiAoYXN5bS0+dmFsdWUgPiBlY29mZl9kYXRhIChhYmZkKS0+Z3Bfc2l6ZSkKLQl7Ci0JICBhc3ltLT5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGFzeW0tPmZsYWdzID0gMDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBzY1NDb21tb246Ci0gICAgICBpZiAoZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICBlY29mZl9zY29tX3NlY3Rpb24ubmFtZSA9IFNDT01NT047Ci0JICBlY29mZl9zY29tX3NlY3Rpb24uZmxhZ3MgPSBTRUNfSVNfQ09NTU9OOwotCSAgZWNvZmZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgIGVjb2ZmX3Njb21fc2VjdGlvbi5zeW1ib2wgPSAmZWNvZmZfc2NvbV9zeW1ib2w7Ci0JICBlY29mZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmZWNvZmZfc2NvbV9zeW1ib2xfcHRyOwotCSAgZWNvZmZfc2NvbV9zeW1ib2wubmFtZSA9IFNDT01NT047Ci0JICBlY29mZl9zY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIGVjb2ZmX3Njb21fc3ltYm9sLnNlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotCSAgZWNvZmZfc2NvbV9zeW1ib2xfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+ZmxhZ3MgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1ZhclJlZ2lzdGVyOgotICAgIGNhc2Ugc2NWYXJpYW50OgotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1NVbmRlZmluZWQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGFzeW0tPmZsYWdzID0gMDsKLSAgICAgIGFzeW0tPnZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NJbml0OgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5pbml0Iik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjQmFzZWRWYXI6Ci0gICAgY2FzZSBzY1hEYXRhOgotICAgIGNhc2Ugc2NQRGF0YToKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NGaW5pOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5maW5pIik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjUkNvbnN0OgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5yY29uc3QiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogTG9vayBmb3Igc3BlY2lhbCBjb25zdHJ1Y3RvcnMgc3ltYm9scyBhbmQgbWFrZSByZWxvY2F0aW9uIGVudHJpZXMKLSAgICAgaW4gYSBzcGVjaWFsIGNvbnN0cnVjdGlvbiBzZWN0aW9uLiAgVGhlc2UgYXJlIHByb2R1Y2VkIGJ5IHRoZQotICAgICAtZmdudS1saW5rZXIgYXJndW1lbnQgdG8gZysrLiAgKi8KLSAgaWYgKEVDT0ZGX0lTX1NUQUIgKGVjb2ZmX3N5bSkpCi0gICAgewotICAgICAgc3dpdGNoIChFQ09GRl9VTk1BUktfU1RBQiAoZWNvZmZfc3ltLT5pbmRleCkpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQotCWNhc2UgTl9TRVRBOgotCWNhc2UgTl9TRVRUOgotCWNhc2UgTl9TRVREOgotCWNhc2UgTl9TRVRCOgotCSAgewotCSAgICAvKiBUaGlzIGNvZGUgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIEl0IHVzZWQgdG8gYmUgdXNlZCB0bwotCSAgICAgICBtYWtlIHRoZSBsaW5rZXIgaGFuZGxlIHNldCBzeW1ib2xzLCBidXQgdGhleSBhcmUgbm93Ci0JICAgICAgIGhhbmRsZWQgaW4gdGhlIGFkZF9zeW1ib2xzIHJvdXRpbmUgaW5zdGVhZC4gICovCi0jaWYgMAotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLQkgICAgYXJlbGVudF9jaGFpbiAqcmVsb2NfY2hhaW47Ci0JICAgIHVuc2lnbmVkIGludCBiaXRzaXplOwotCi0JICAgIC8qIEdldCBhIHNlY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBzeW1ib2wgKHVzdWFsbHkKLQkgICAgICAgX19DVE9SX0xJU1RfXyBvciBfX0RUT1JfTElTVF9fKS4gIEZJWE1FOiBnY2MgdXNlcyB0aGUKLQkgICAgICAgbmFtZSBfX19DVE9SX0xJU1QgKHRocmVlIHVuZGVyc2NvcmVzKS4gIFdlIG5lZWQKLQkgICAgICAgX19DVE9SX0xJU1QgKHR3byB1bmRlcnNjb3JlcyksIHNpbmNlIEVDT0ZGIGRvZXNuJ3QgdXNlCi0JICAgICAgIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgVGhpcyBzaG91bGQgYmUgaGFuZGxlZCBieSBnY2MsCi0JICAgICAgIGJ1dCBpbnN0ZWFkIHdlIGRvIGl0IGhlcmUuICBBY3R1YWxseSwgdGhpcyBzaG91bGQgYWxsCi0JICAgICAgIGJlIGRvbmUgZGlmZmVyZW50bHkgYW55aG93LiAgKi8KLQkgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKGFzeW0pOwotCSAgICBpZiAobmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSA9PSAnXycgJiYgbmFtZVsyXSA9PSAnXycpCi0JICAgICAgewotCQkrK25hbWU7Ci0JCWFzeW0tPm5hbWUgPSBuYW1lOwotCSAgICAgIH0KLQkgICAgc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQkgICAgaWYgKHNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgICAgewotCQljaGFyICpjb3B5OwotCi0JCWNvcHkgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAobmFtZSkgKyAxKTsKLQkJaWYgKCFjb3B5KQotCQkgIHJldHVybiBmYWxzZTsKLQkJc3RyY3B5IChjb3B5LCBuYW1lKTsKLQkJc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIGNvcHkpOwotCSAgICAgIH0KLQotCSAgICAvKiBCdWlsZCBhIHJlbG9jIHBvaW50aW5nIHRvIHRoaXMgY29uc3RydWN0b3IuICAqLwotCSAgICByZWxvY19jaGFpbiA9Ci0JICAgICAgKGFyZWxlbnRfY2hhaW4gKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFyZWxlbnRfY2hhaW4pKTsKLQkgICAgaWYgKCFyZWxvY19jaGFpbikKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIHJlbG9jX2NoYWluLT5yZWxlbnQuc3ltX3B0cl9wdHIgPQotCSAgICAgIGJmZF9nZXRfc2VjdGlvbiAoYXN5bSktPnN5bWJvbF9wdHJfcHRyOwotCSAgICByZWxvY19jaGFpbi0+cmVsZW50LmFkZHJlc3MgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0JICAgIHJlbG9jX2NoYWluLT5yZWxlbnQuYWRkZW5kID0gYXN5bS0+dmFsdWU7Ci0JICAgIHJlbG9jX2NoYWluLT5yZWxlbnQuaG93dG8gPQotCSAgICAgIGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5jb25zdHJ1Y3Rvcl9yZWxvYzsKLQotCSAgICAvKiBTZXQgdXAgdGhlIGNvbnN0cnVjdG9yIHNlY3Rpb24gdG8gaG9sZCB0aGUgcmVsb2MuICAqLwotCSAgICBzZWN0aW9uLT5mbGFncyA9IFNFQ19DT05TVFJVQ1RPUjsKLQkgICAgKytzZWN0aW9uLT5yZWxvY19jb3VudDsKLQotCSAgICAvKiBDb25zdHJ1Y3RvciBzZWN0aW9ucyBtdXN0IGJlIHJvdW5kZWQgdG8gYSBib3VuZGFyeQotCSAgICAgICBiYXNlZCBvbiB0aGUgYml0c2l6ZS4gIFRoZXNlIGFyZSBub3QgcmVhbCBzZWN0aW9ucy0tCi0JICAgICAgIHRoZXkgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IHRoZSBsaW5rZXItLXNvIHRoZSBFQ09GRgotCSAgICAgICAxNiBieXRlIGFsaWdubWVudCByZXN0cmljdGlvbiBkb2VzIG5vdCBhcHBseS4gICovCi0JICAgIGJpdHNpemUgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+Y29uc3RydWN0b3JfYml0c2l6ZTsKLQkgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMTsKLQkgICAgd2hpbGUgKCgxIDw8IHNlY3Rpb24tPmFsaWdubWVudF9wb3dlcikgPCBiaXRzaXplIC8gOCkKLQkgICAgICArK3NlY3Rpb24tPmFsaWdubWVudF9wb3dlcjsKLQotCSAgICByZWxvY19jaGFpbi0+bmV4dCA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotCSAgICBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbiA9IHJlbG9jX2NoYWluOwotCSAgICBzZWN0aW9uLT5fcmF3X3NpemUgKz0gYml0c2l6ZSAvIDg7Ci0KLSNlbmRpZiAvKiAwICovCi0KLQkgICAgLyogTWFyayB0aGUgc3ltYm9sIGFzIGEgY29uc3RydWN0b3IuICAqLwotCSAgICBhc3ltLT5mbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhbiBFQ09GRiBzeW1ib2wgdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX3N5bV9zaXplOwotICB2b2lkICgqIGNvbnN0IHN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbjsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3N5bV9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgU1lNUiAqKSkKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9zeW1faW47Ci0gIGJmZF9zaXplX3R5cGUgaW50ZXJuYWxfc2l6ZTsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKmludGVybmFsOwotICBlY29mZl9zeW1ib2xfdHlwZSAqaW50ZXJuYWxfcHRyOwotICBjaGFyICplcmF3X3NyYzsKLSAgY2hhciAqZXJhd19lbmQ7Ci0gIEZEUiAqZmRyX3B0cjsKLSAgRkRSICpmZHJfZW5kOwotCi0gIC8qIElmIHdlJ3ZlIGFscmVhZHkgcmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlLCBkbyBub3RoaW5nLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5jYW5vbmljYWxfc3ltYm9scyAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEdldCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBpZiAoISBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8gKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW50ZXJuYWxfc2l6ZSA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogc2l6ZW9mIChlY29mZl9zeW1ib2xfdHlwZSk7Ci0gIGludGVybmFsID0gKGVjb2ZmX3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgaW50ZXJuYWxfc2l6ZSk7Ci0gIGlmIChpbnRlcm5hbCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbnRlcm5hbF9wdHIgPSBpbnRlcm5hbDsKLSAgZXJhd19zcmMgPSAoY2hhciAqKSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9leHQ7Ci0gIGVyYXdfZW5kID0gKGVyYXdfc3JjCi0JICAgICAgKyAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXgKLQkJICogZXh0ZXJuYWxfZXh0X3NpemUpKTsKLSAgZm9yICg7IGVyYXdfc3JjIDwgZXJhd19lbmQ7IGVyYXdfc3JjICs9IGV4dGVybmFsX2V4dF9zaXplLCBpbnRlcm5hbF9wdHIrKykKLSAgICB7Ci0gICAgICBFWFRSIGludGVybmFsX2VzeW07Ci0KLSAgICAgICgqc3dhcF9leHRfaW4pIChhYmZkLCAoUFRSKSBlcmF3X3NyYywgJmludGVybmFsX2VzeW0pOwotICAgICAgaW50ZXJuYWxfcHRyLT5zeW1ib2wubmFtZSA9IChlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zc2V4dAotCQkJCSAgICsgaW50ZXJuYWxfZXN5bS5hc3ltLmlzcyk7Ci0gICAgICBpZiAoIWVjb2ZmX3NldF9zeW1ib2xfaW5mbyAoYWJmZCwgJmludGVybmFsX2VzeW0uYXN5bSwKLQkJCQkgICZpbnRlcm5hbF9wdHItPnN5bWJvbCwgMSwKLQkJCQkgIGludGVybmFsX2VzeW0ud2Vha2V4dCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLyogVGhlIGFscGhhIHVzZXMgYSBuZWdhdGl2ZSBpZmQgZmllbGQgZm9yIHNlY3Rpb24gc3ltYm9scy4gICovCi0gICAgICBpZiAoaW50ZXJuYWxfZXN5bS5pZmQgPj0gMCkKLQlpbnRlcm5hbF9wdHItPmZkciA9IChlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5mZHIKLQkJCSAgICAgKyBpbnRlcm5hbF9lc3ltLmlmZCk7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfcHRyLT5mZHIgPSBOVUxMOwotICAgICAgaW50ZXJuYWxfcHRyLT5sb2NhbCA9IGZhbHNlOwotICAgICAgaW50ZXJuYWxfcHRyLT5uYXRpdmUgPSAoUFRSKSBlcmF3X3NyYzsKLSAgICB9Ci0KLSAgLyogVGhlIGxvY2FsIHN5bWJvbHMgbXVzdCBiZSBhY2Nlc3NlZCB2aWEgdGhlIGZkcidzLCBiZWNhdXNlIHRoZQotICAgICBzdHJpbmcgYW5kIGF1eCBpbmRpY2VzIGFyZSByZWxhdGl2ZSB0byB0aGUgZmRyIGluZm9ybWF0aW9uLiAgKi8KLSAgZmRyX3B0ciA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmZkcjsKLSAgZmRyX2VuZCA9IGZkcl9wdHIgKyBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWZkTWF4OwotICBmb3IgKDsgZmRyX3B0ciA8IGZkcl9lbmQ7IGZkcl9wdHIrKykKLSAgICB7Ci0gICAgICBjaGFyICpscmF3X3NyYzsKLSAgICAgIGNoYXIgKmxyYXdfZW5kOwotCi0gICAgICBscmF3X3NyYyA9ICgoY2hhciAqKSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9zeW0KLQkJICArIGZkcl9wdHItPmlzeW1CYXNlICogZXh0ZXJuYWxfc3ltX3NpemUpOwotICAgICAgbHJhd19lbmQgPSBscmF3X3NyYyArIGZkcl9wdHItPmNzeW0gKiBleHRlcm5hbF9zeW1fc2l6ZTsKLSAgICAgIGZvciAoOwotCSAgIGxyYXdfc3JjIDwgbHJhd19lbmQ7Ci0JICAgbHJhd19zcmMgKz0gZXh0ZXJuYWxfc3ltX3NpemUsIGludGVybmFsX3B0cisrKQotCXsKLQkgIFNZTVIgaW50ZXJuYWxfc3ltOwotCi0JICAoKnN3YXBfc3ltX2luKSAoYWJmZCwgKFBUUikgbHJhd19zcmMsICZpbnRlcm5hbF9zeW0pOwotCSAgaW50ZXJuYWxfcHRyLT5zeW1ib2wubmFtZSA9IChlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zcwotCQkJCSAgICAgICArIGZkcl9wdHItPmlzc0Jhc2UKLQkJCQkgICAgICAgKyBpbnRlcm5hbF9zeW0uaXNzKTsKLQkgIGlmICghZWNvZmZfc2V0X3N5bWJvbF9pbmZvIChhYmZkLCAmaW50ZXJuYWxfc3ltLAotCQkJCSAgICAgICZpbnRlcm5hbF9wdHItPnN5bWJvbCwgMCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGludGVybmFsX3B0ci0+ZmRyID0gZmRyX3B0cjsKLQkgIGludGVybmFsX3B0ci0+bG9jYWwgPSB0cnVlOwotCSAgaW50ZXJuYWxfcHRyLT5uYXRpdmUgPSAoUFRSKSBscmF3X3NyYzsKLQl9Ci0gICAgfQotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5jYW5vbmljYWxfc3ltYm9scyA9IGludGVybmFsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgZm9yIHRoZSBjYW5vbmljYWwgc3ltYm9scy4gICovCi0KLWxvbmcKLV9iZmRfZWNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoISBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8gKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8pKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChlY29mZl9zeW1ib2xfdHlwZSAqKSk7Ci19Ci0KLS8qIEdldCB0aGUgY2Fub25pY2FsIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX2Vjb2ZmX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICpzeW1iYXNlOwotICBlY29mZl9zeW1ib2xfdHlwZSAqKmxvY2F0aW9uID0gKGVjb2ZmX3N5bWJvbF90eXBlICoqKSBhbG9jYXRpb247Ci0KLSAgaWYgKF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIHN5bWJhc2UgPSBlY29mZl9kYXRhIChhYmZkKS0+Y2Fub25pY2FsX3N5bWJvbHM7Ci0gIHdoaWxlIChjb3VudGVyIDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpCi0gICAgewotICAgICAgKihsb2NhdGlvbisrKSA9IHN5bWJhc2UrKzsKLSAgICAgIGNvdW50ZXIrKzsKLSAgICB9Ci0gICpsb2NhdGlvbisrID0gKGVjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotLyogVHVybiBFQ09GRiB0eXBlIGluZm9ybWF0aW9uIGludG8gYSBwcmludGFibGUgc3RyaW5nLgotICAgZWNvZmZfZW1pdF9hZ2dyZWdhdGUgYW5kIGVjb2ZmX3R5cGVfdG9fc3RyaW5nIGFyZSBmcm9tCi0gICBnY2MvbWlwcy10ZHVtcC5jLCB3aXRoIHN3YXBwaW5nIGFkZGVkIGFuZCB1c2VkX3B0ciByZW1vdmVkLiAgKi8KLQotLyogV3JpdGUgYWdncmVnYXRlIGluZm9ybWF0aW9uIHRvIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX2VtaXRfYWdncmVnYXRlIChhYmZkLCBmZHIsIHN0cmluZywgcm5keCwgaXN5bSwgd2hpY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRkRSICpmZHI7Ci0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgUk5EWFIgKnJuZHg7Ci0gICAgIGxvbmcgaXN5bTsKLSAgICAgY29uc3QgY2hhciAqd2hpY2g7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcCA9Ci0gICAgJmVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5kZWJ1Z19zd2FwOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm8gPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm87Ci0gIHVuc2lnbmVkIGludCBpZmQgPSBybmR4LT5yZmQ7Ci0gIHVuc2lnbmVkIGludCBpbmR4ID0gcm5keC0+aW5kZXg7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIAotICBpZiAoaWZkID09IDB4ZmZmKQotICAgIGlmZCA9IGlzeW07Ci0KLSAgLyogQW4gaWZkIG9mIC0xIGlzIGFuIG9wYXF1ZSB0eXBlLiAgQW4gZXNjYXBlZCBpbmRleCBvZiAwIGlzIGEKLSAgICAgc3RydWN0IHJldHVybiB0eXBlIG9mIGEgcHJvY2VkdXJlIGNvbXBpbGVkIHdpdGhvdXQgLWcuICAqLwotICBpZiAoaWZkID09IDB4ZmZmZmZmZmYKLSAgICAgIHx8IChybmR4LT5yZmQgPT0gMHhmZmYgJiYgaW5keCA9PSAwKSkKLSAgICBuYW1lID0gIjx1bmRlZmluZWQ+IjsKLSAgZWxzZSBpZiAoaW5keCA9PSBpbmRleE5pbCkKLSAgICBuYW1lID0gIjxubyBuYW1lPiI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTWU1SIHN5bTsKLQotICAgICAgaWYgKGRlYnVnX2luZm8tPmV4dGVybmFsX3JmZCA9PSBOVUxMKQotCWZkciA9IGRlYnVnX2luZm8tPmZkciArIGlmZDsKLSAgICAgIGVsc2UKLQl7Ci0JICBSRkRUIHJmZDsKLQotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3JmZF9pbikgKGFiZmQsCi0JCQkJICAgICAgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3JmZAotCQkJCSAgICAgICArICgoZmRyLT5yZmRCYXNlICsgaWZkKQotCQkJCQkgICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpKSwKLQkJCQkgICAgICAmcmZkKTsKLQkgIGZkciA9IGRlYnVnX2luZm8tPmZkciArIHJmZDsKLQl9Ci0KLSAgICAgIGluZHggKz0gZmRyLT5pc3ltQmFzZTsKLQotICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsCi0JCQkJICAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCi0JCQkJICAgKyBpbmR4ICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpLAotCQkJCSAgJnN5bSk7Ci0KLSAgICAgIG5hbWUgPSBkZWJ1Z19pbmZvLT5zcyArIGZkci0+aXNzQmFzZSArIHN5bS5pc3M7Ci0gICAgfQotCi0gIHNwcmludGYgKHN0cmluZywKLQkgICAiJXMgJXMgeyBpZmQgPSAldSwgaW5kZXggPSAlbHUgfSIsCi0JICAgd2hpY2gsIG5hbWUsIGlmZCwKLQkgICAoKGxvbmcpIGluZHgKLQkgICAgKyBkZWJ1Z19pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCkpOwotfQotCi0vKiBDb252ZXJ0IHRoZSB0eXBlIGluZm9ybWF0aW9uIHRvIHN0cmluZyBmb3JtYXQuICAqLwotCi1zdGF0aWMgY2hhciAqCi1lY29mZl90eXBlX3RvX3N0cmluZyAoYWJmZCwgZmRyLCBpbmR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEZEUiAqZmRyOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLXsKLSAgdW5pb24gYXV4X2V4dCAqYXV4X3B0cjsKLSAgaW50IGJpZ2VuZGlhbjsKLSAgQVVYVSB1OwotICBzdHJ1Y3QgcXVhbCB7Ci0gICAgdW5zaWduZWQgaW50ICB0eXBlOwotICAgIGludCAgbG93X2JvdW5kOwotICAgIGludCAgaGlnaF9ib3VuZDsKLSAgICBpbnQgIHN0cmlkZTsKLSAgfSBxdWFsaWZpZXJzWzddOwotICB1bnNpZ25lZCBpbnQgYmFzaWNfdHlwZTsKLSAgaW50IGk7Ci0gIGNoYXIgYnVmZmVyMVsxMDI0XTsKLSAgc3RhdGljIGNoYXIgYnVmZmVyMlsxMDI0XTsKLSAgY2hhciAqcDEgPSBidWZmZXIxOwotICBjaGFyICpwMiA9IGJ1ZmZlcjI7Ci0gIFJORFhSIHJuZHg7Ci0KLSAgYXV4X3B0ciA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX2F1eCArIGZkci0+aWF1eEJhc2U7Ci0gIGJpZ2VuZGlhbiA9IGZkci0+ZkJpZ2VuZGlhbjsKLQotICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQotICAgIHsKLSAgICAgIHF1YWxpZmllcnNbaV0ubG93X2JvdW5kID0gMDsKLSAgICAgIHF1YWxpZmllcnNbaV0uaGlnaF9ib3VuZCA9IDA7Ci0gICAgICBxdWFsaWZpZXJzW2ldLnN0cmlkZSA9IDA7Ci0gICAgfQotCi0gIGlmIChBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keF0pID09IChiZmRfdm1hKSAtMSkKLSAgICByZXR1cm4gIi0xIChubyB0eXBlKSI7Ci0gIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsrXS5hX3RpLCAmdS50aSk7Ci0KLSAgYmFzaWNfdHlwZSA9IHUudGkuYnQ7Ci0gIHF1YWxpZmllcnNbMF0udHlwZSA9IHUudGkudHEwOwotICBxdWFsaWZpZXJzWzFdLnR5cGUgPSB1LnRpLnRxMTsKLSAgcXVhbGlmaWVyc1syXS50eXBlID0gdS50aS50cTI7Ci0gIHF1YWxpZmllcnNbM10udHlwZSA9IHUudGkudHEzOwotICBxdWFsaWZpZXJzWzRdLnR5cGUgPSB1LnRpLnRxNDsKLSAgcXVhbGlmaWVyc1s1XS50eXBlID0gdS50aS50cTU7Ci0gIHF1YWxpZmllcnNbNl0udHlwZSA9IHRxTmlsOwotCi0gIC8qCi0gICAqIEdvIGdldCB0aGUgYmFzaWMgdHlwZS4KLSAgICovCi0gIHN3aXRjaCAoYmFzaWNfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBidE5pbDoJCQkvKiB1bmRlZmluZWQgKi8KLSAgICAgIHN0cmNweSAocDEsICJuaWwiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEFkcjoJCQkvKiBhZGRyZXNzIC0gaW50ZWdlciBzYW1lIHNpemUgYXMgcG9pbnRlciAqLwotICAgICAgc3RyY3B5IChwMSwgImFkZHJlc3MiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidENoYXI6CQkvKiBjaGFyYWN0ZXIgKi8KLSAgICAgIHN0cmNweSAocDEsICJjaGFyIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRVQ2hhcjoJCS8qIHVuc2lnbmVkIGNoYXJhY3RlciAqLwotICAgICAgc3RyY3B5IChwMSwgInVuc2lnbmVkIGNoYXIiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFNob3J0OgkJLyogc2hvcnQgKi8KLSAgICAgIHN0cmNweSAocDEsICJzaG9ydCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0VVNob3J0OgkJLyogdW5zaWduZWQgc2hvcnQgKi8KLSAgICAgIHN0cmNweSAocDEsICJ1bnNpZ25lZCBzaG9ydCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0SW50OgkJCS8qIGludCAqLwotICAgICAgc3RyY3B5IChwMSwgImludCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0VUludDoJCS8qIHVuc2lnbmVkIGludCAqLwotICAgICAgc3RyY3B5IChwMSwgInVuc2lnbmVkIGludCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0TG9uZzoJCS8qIGxvbmcgKi8KLSAgICAgIHN0cmNweSAocDEsICJsb25nIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRVTG9uZzoJCS8qIHVuc2lnbmVkIGxvbmcgKi8KLSAgICAgIHN0cmNweSAocDEsICJ1bnNpZ25lZCBsb25nIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRGbG9hdDoJCS8qIGZsb2F0IChyZWFsKSAqLwotICAgICAgc3RyY3B5IChwMSwgImZsb2F0Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnREb3VibGU6CQkvKiBEb3VibGUgKHJlYWwpICovCi0gICAgICBzdHJjcHkgKHAxLCAiZG91YmxlIik7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogU3RydWN0dXJlcyBhZGQgMS0yIGF1eCB3b3JkczoKLQkgMXN0IHdvcmQgaXMgW1NUX1JGREVTQ0FQRSwgb2Zmc2V0XSBwb2ludGVyIHRvIHN0cnVjdCBkZWY7Ci0JIDJuZCB3b3JkIGlzIGZpbGUgaW5kZXggaWYgMXN0IHdvcmQgcmZkIGlzIFNUX1JGREVTQ0FQRS4gICovCi0KLSAgICBjYXNlIGJ0U3RydWN0OgkJLyogU3RydWN0dXJlIChSZWNvcmQpICovCi0gICAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4XS5hX3JuZHgsICZybmR4KTsKLSAgICAgIGVjb2ZmX2VtaXRfYWdncmVnYXRlIChhYmZkLCBmZHIsIHAxLCAmcm5keCwKLQkJCSAgICAobG9uZykgQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrMV0pLAotCQkJICAgICJzdHJ1Y3QiKTsKLSAgICAgIGluZHgrKzsJCQkvKiBza2lwIGF1eCB3b3JkcyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFVuaW9ucyBhZGQgMS0yIGF1eCB3b3JkczoKLQkgMXN0IHdvcmQgaXMgW1NUX1JGREVTQ0FQRSwgb2Zmc2V0XSBwb2ludGVyIHRvIHVuaW9uIGRlZjsKLQkgMm5kIHdvcmQgaXMgZmlsZSBpbmRleCBpZiAxc3Qgd29yZCByZmQgaXMgU1RfUkZERVNDQVBFLiAgKi8KLQotICAgIGNhc2UgYnRVbmlvbjoJCS8qIFVuaW9uICovCi0gICAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4XS5hX3JuZHgsICZybmR4KTsKLSAgICAgIGVjb2ZmX2VtaXRfYWdncmVnYXRlIChhYmZkLCBmZHIsIHAxLCAmcm5keCwKLQkJCSAgICAobG9uZykgQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrMV0pLAotCQkJICAgICJ1bmlvbiIpOwotICAgICAgaW5keCsrOwkJCS8qIHNraXAgYXV4IHdvcmRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogRW51bWVyYXRpb25zIGFkZCAxLTIgYXV4IHdvcmRzOgotCSAxc3Qgd29yZCBpcyBbU1RfUkZERVNDQVBFLCBvZmZzZXRdIHBvaW50ZXIgdG8gZW51bSBkZWY7Ci0JIDJuZCB3b3JkIGlzIGZpbGUgaW5kZXggaWYgMXN0IHdvcmQgcmZkIGlzIFNUX1JGREVTQ0FQRS4gICovCi0KLSAgICBjYXNlIGJ0RW51bToJCS8qIEVudW1lcmF0aW9uICovCi0gICAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4XS5hX3JuZHgsICZybmR4KTsKLSAgICAgIGVjb2ZmX2VtaXRfYWdncmVnYXRlIChhYmZkLCBmZHIsIHAxLCAmcm5keCwKLQkJCSAgICAobG9uZykgQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrMV0pLAotCQkJICAgICJlbnVtIik7Ci0gICAgICBpbmR4Kys7CQkJLyogc2tpcCBhdXggd29yZHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFR5cGVkZWY6CQkvKiBkZWZpbmVkIHZpYSBhIHR5cGVkZWYsIGlzeW1SZWYgcG9pbnRzICovCi0gICAgICBzdHJjcHkgKHAxLCAidHlwZWRlZiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0UmFuZ2U6CQkvKiBzdWJyYW5nZSBvZiBpbnQgKi8KLSAgICAgIHN0cmNweSAocDEsICJzdWJyYW5nZSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0U2V0OgkJCS8qIHBhc2NhbCBzZXRzICovCi0gICAgICBzdHJjcHkgKHAxLCAic2V0Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRDb21wbGV4OgkJLyogZm9ydHJhbiBjb21wbGV4ICovCi0gICAgICBzdHJjcHkgKHAxLCAiY29tcGxleCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0RENvbXBsZXg6CQkvKiBmb3J0cmFuIGRvdWJsZSBjb21wbGV4ICovCi0gICAgICBzdHJjcHkgKHAxLCAiZG91YmxlIGNvbXBsZXgiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEluZGlyZWN0OgkJLyogZm9yd2FyZCBvciB1bm5hbWVkIHR5cGVkZWYgKi8KLSAgICAgIHN0cmNweSAocDEsICJmb3J3YXJkL3VuYW1lZCB0eXBlZGVmIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRGaXhlZERlYzoJCS8qIEZpeGVkIERlY2ltYWwgKi8KLSAgICAgIHN0cmNweSAocDEsICJmaXhlZCBkZWNpbWFsIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRGbG9hdERlYzoJCS8qIEZsb2F0IERlY2ltYWwgKi8KLSAgICAgIHN0cmNweSAocDEsICJmbG9hdCBkZWNpbWFsIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRTdHJpbmc6CQkvKiBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nICovCi0gICAgICBzdHJjcHkgKHAxLCAic3RyaW5nIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRCaXQ6CQkJLyogQWxpZ25lZCBCaXQgU3RyaW5nICovCi0gICAgICBzdHJjcHkgKHAxLCAiYml0Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRQaWN0dXJlOgkJLyogUGljdHVyZSAqLwotICAgICAgc3RyY3B5IChwMSwgInBpY3R1cmUiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFZvaWQ6CQkvKiBWb2lkICovCi0gICAgICBzdHJjcHkgKHAxLCAidm9pZCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3ByaW50ZiAocDEsIF8oIlVua25vd24gYmFzaWMgdHlwZSAlZCIpLCAoaW50KSBiYXNpY190eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBwMSArPSBzdHJsZW4gKGJ1ZmZlcjEpOwotCi0gIC8qCi0gICAqIElmIHRoaXMgaXMgYSBiaXRmaWVsZCwgZ2V0IHRoZSBiaXRzaXplLgotICAgKi8KLSAgaWYgKHUudGkuZkJpdGZpZWxkKQotICAgIHsKLSAgICAgIGludCBiaXRzaXplOwotCi0gICAgICBiaXRzaXplID0gQVVYX0dFVF9XSURUSCAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KytdKTsKLSAgICAgIHNwcmludGYgKHAxLCAiIDogJWQiLCBiaXRzaXplKTsKLSAgICAgIHAxICs9IHN0cmxlbiAoYnVmZmVyMSk7Ci0gICAgfQotCi0KLSAgLyoKLSAgICogRGVhbCB3aXRoIGFueSBxdWFsaWZpZXJzLgotICAgKi8KLSAgaWYgKHF1YWxpZmllcnNbMF0udHlwZSAhPSB0cU5pbCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogU25hcmYgdXAgYW55IGFycmF5IGJvdW5kcyBpbiB0aGUgY29ycmVjdCBvcmRlci4gIEFycmF5cwotICAgICAgICogc3RvcmUgNSBzdWNjZXNzaXZlIHdvcmRzIGluIHRoZSBhdXguIHRhYmxlOgotICAgICAgICoJd29yZCAwCVJORFhSIHRvIHR5cGUgb2YgdGhlIGJvdW5kcyAoaWUsIGludCkKLSAgICAgICAqCXdvcmQgMQlDdXJyZW50IGZpbGUgZGVzY3JpcHRvciBpbmRleAotICAgICAgICoJd29yZCAyCWxvdyBib3VuZAotICAgICAgICoJd29yZCAzCWhpZ2ggYm91bmQgKG9yIC0xIGlmIFtdKQotICAgICAgICoJd29yZCA0CXN0cmlkZSBzaXplIGluIGJpdHMKLSAgICAgICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKLQl7Ci0JICBpZiAocXVhbGlmaWVyc1tpXS50eXBlID09IHRxQXJyYXkpCi0JICAgIHsKLQkgICAgICBxdWFsaWZpZXJzW2ldLmxvd19ib3VuZCA9Ci0JCUFVWF9HRVRfRE5MT1cgKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsyXSk7Ci0JICAgICAgcXVhbGlmaWVyc1tpXS5oaWdoX2JvdW5kID0KLQkJQVVYX0dFVF9ETkhJR0ggKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCszXSk7Ci0JICAgICAgcXVhbGlmaWVyc1tpXS5zdHJpZGUgPQotCQlBVVhfR0VUX1dJRFRIIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrNF0pOwotCSAgICAgIGluZHggKz0gNTsKLQkgICAgfQotCX0KLQotICAgICAgLyoKLSAgICAgICAqIE5vdyBwcmludCBvdXQgdGhlIHF1YWxpZmllcnMuCi0gICAgICAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JewotCSAgc3dpdGNoIChxdWFsaWZpZXJzW2ldLnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSB0cU5pbDoKLQkgICAgY2FzZSB0cU1heDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRxUHRyOgotCSAgICAgIHN0cmNweSAocDIsICJwdHIgdG8gIik7Ci0JICAgICAgcDIgKz0gc2l6ZW9mICgicHRyIHRvICIpLTE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSB0cVZvbDoKLQkgICAgICBzdHJjcHkgKHAyLCAidm9sYXRpbGUgIik7Ci0JICAgICAgcDIgKz0gc2l6ZW9mICgidm9sYXRpbGUgIiktMTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRxRmFyOgotCSAgICAgIHN0cmNweSAocDIsICJmYXIgIik7Ci0JICAgICAgcDIgKz0gc2l6ZW9mICgiZmFyICIpLTE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSB0cVByb2M6Ci0JICAgICAgc3RyY3B5IChwMiwgImZ1bmMuIHJldC4gIik7Ci0JICAgICAgcDIgKz0gc2l6ZW9mICgiZnVuYy4gcmV0LiAiKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIHRxQXJyYXk6Ci0JICAgICAgewotCQlpbnQgZmlyc3RfYXJyYXkgPSBpOwotCQlpbnQgajsKLQotCQkvKiBQcmludCBhcnJheSBib3VuZHMgcmV2ZXJzZWQgKGllLCBpbiB0aGUgb3JkZXIgdGhlIEMKLQkJICAgcHJvZ3JhbW1lciB3cml0ZXMgdGhlbSkuICBDIGlzIHN1Y2ggYSBmdW4gbGFuZ3VhZ2UuLi4uICovCi0KLQkJd2hpbGUgKGkgPCA1ICYmIHF1YWxpZmllcnNbaSsxXS50eXBlID09IHRxQXJyYXkpCi0JCSAgaSsrOwotCi0JCWZvciAoaiA9IGk7IGogPj0gZmlyc3RfYXJyYXk7IGotLSkKLQkJICB7Ci0JCSAgICBzdHJjcHkgKHAyLCAiYXJyYXkgWyIpOwotCQkgICAgcDIgKz0gc2l6ZW9mICgiYXJyYXkgWyIpLTE7Ci0JCSAgICBpZiAocXVhbGlmaWVyc1tqXS5sb3dfYm91bmQgIT0gMCkKLQkJICAgICAgc3ByaW50ZiAocDIsCi0JCQkgICAgICAgIiVsZDolbGQgeyVsZCBiaXRzfSIsCi0JCQkgICAgICAgKGxvbmcpIHF1YWxpZmllcnNbal0ubG93X2JvdW5kLAotCQkJICAgICAgIChsb25nKSBxdWFsaWZpZXJzW2pdLmhpZ2hfYm91bmQsCi0JCQkgICAgICAgKGxvbmcpIHF1YWxpZmllcnNbal0uc3RyaWRlKTsKLQotCQkgICAgZWxzZSBpZiAocXVhbGlmaWVyc1tqXS5oaWdoX2JvdW5kICE9IC0xKQotCQkgICAgICBzcHJpbnRmIChwMiwKLQkJCSAgICAgICAiJWxkIHslbGQgYml0c30iLAotCQkJICAgICAgIChsb25nKSAocXVhbGlmaWVyc1tqXS5oaWdoX2JvdW5kICsgMSksCi0JCQkgICAgICAgKGxvbmcpIChxdWFsaWZpZXJzW2pdLnN0cmlkZSkpOwotCi0JCSAgICBlbHNlCi0JCSAgICAgIHNwcmludGYgKHAyLCAiIHslbGQgYml0c30iLCAobG9uZykgKHF1YWxpZmllcnNbal0uc3RyaWRlKSk7Ci0KLQkJICAgIHAyICs9IHN0cmxlbiAocDIpOwotCQkgICAgc3RyY3B5IChwMiwgIl0gb2YgIik7Ci0JCSAgICBwMiArPSBzaXplb2YgKCJdIG9mICIpLTE7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc3RyY3B5IChwMiwgYnVmZmVyMSk7Ci0gIHJldHVybiBidWZmZXIyOwotfQotCi0vKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgRUNPRkYgc3ltYm9sIFNZTUJPTCBpbiBSRVQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLV9iZmRfZWNvZmZfZ2V0X3N5bWJvbF9pbmZvIChhYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBsb2NhbCBsYWJlbC4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBuYW1lWzBdID09ICckJzsKLX0KLQotLyogUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gRUNPRkYgc3ltYm9sLiAgKi8KLQotdm9pZAotX2JmZF9lY29mZl9wcmludF9zeW1ib2wgKGFiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCi0gICAgPSAmZWNvZmZfYmFja2VuZCAoYWJmZCktPmRlYnVnX3N3YXA7Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKWZpbGVwOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCi0JewotCSAgU1lNUiBlY29mZl9zeW07Ci0JCi0JICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgZWNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSwKLQkJCQkgICAgICAmZWNvZmZfc3ltKTsKLQkgIGZwcmludGYgKGZpbGUsICJlY29mZiBsb2NhbCAiKTsKLQkgIGZwcmludGZfdm1hIChmaWxlLCAoYmZkX3ZtYSkgZWNvZmZfc3ltLnZhbHVlKTsKLQkgIGZwcmludGYgKGZpbGUsICIgJXggJXgiLCAodW5zaWduZWQpIGVjb2ZmX3N5bS5zdCwKLQkJICAgKHVuc2lnbmVkKSBlY29mZl9zeW0uc2MpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFWFRSIGVjb2ZmX2V4dDsKLQotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCi0JCQkJICAgICAgJmVjb2ZmX2V4dCk7Ci0JICBmcHJpbnRmIChmaWxlLCAiZWNvZmYgZXh0ZXJuICIpOwotCSAgZnByaW50Zl92bWEgKGZpbGUsIChiZmRfdm1hKSBlY29mZl9leHQuYXN5bS52YWx1ZSk7Ci0JICBmcHJpbnRmIChmaWxlLCAiICV4ICV4IiwgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zdCwKLQkJICAgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zYyk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIC8qIFByaW50IG91dCB0aGUgc3ltYm9scyBpbiBhIHJlYXNvbmFibGUgd2F5ICovCi0gICAgICB7Ci0JY2hhciB0eXBlOwotCWludCBwb3M7Ci0JRVhUUiBlY29mZl9leHQ7Ci0JY2hhciBqbXB0Ymw7Ci0JY2hhciBjb2JvbF9tYWluOwotCWNoYXIgd2Vha2V4dDsKLQotCWlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCi0JICB7Ci0JICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLAotCQkJCQkmZWNvZmZfZXh0LmFzeW0pOwotCSAgICB0eXBlID0gJ2wnOwotCSAgICBwb3MgPSAoKCgoY2hhciAqKSBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlCi0JCSAgICAgLSAoY2hhciAqKSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9zeW0pCi0JCSAgICAvIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKQotCQkgICArIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4KTsKLQkgICAgam1wdGJsID0gJyAnOwotCSAgICBjb2JvbF9tYWluID0gJyAnOwotCSAgICB3ZWFrZXh0ID0gJyAnOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCi0JCQkJCSZlY29mZl9leHQpOwotCSAgICB0eXBlID0gJ2UnOwotCSAgICBwb3MgPSAoKChjaGFyICopIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUKLQkJICAgIC0gKGNoYXIgKikgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfZXh0KQotCQkgICAvIGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLQkgICAgam1wdGJsID0gZWNvZmZfZXh0LmptcHRibCA/ICdqJyA6ICcgJzsKLQkgICAgY29ib2xfbWFpbiA9IGVjb2ZmX2V4dC5jb2JvbF9tYWluID8gJ2MnIDogJyAnOwotCSAgICB3ZWFrZXh0ID0gZWNvZmZfZXh0LndlYWtleHQgPyAndycgOiAnICc7Ci0JICB9Ci0KLQlmcHJpbnRmIChmaWxlLCAiWyUzZF0gJWMgIiwKLQkJIHBvcywgdHlwZSk7Ci0JZnByaW50Zl92bWEgKGZpbGUsIChiZmRfdm1hKSBlY29mZl9leHQuYXN5bS52YWx1ZSk7Ci0JZnByaW50ZiAoZmlsZSwgIiBzdCAleCBzYyAleCBpbmR4ICV4ICVjJWMlYyAlcyIsCi0JCSAodW5zaWduZWQpIGVjb2ZmX2V4dC5hc3ltLnN0LAotCQkgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zYywKLQkJICh1bnNpZ25lZCkgZWNvZmZfZXh0LmFzeW0uaW5kZXgsCi0JCSBqbXB0YmwsIGNvYm9sX21haW4sIHdlYWtleHQsCi0JCSBzeW1ib2wtPm5hbWUpOwotCi0JaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5mZHIgIT0gTlVMTAotCSAgICAmJiBlY29mZl9leHQuYXN5bS5pbmRleCAhPSBpbmRleE5pbCkKLQkgIHsKLQkgICAgRkRSICpmZHI7Ci0JICAgIHVuc2lnbmVkIGludCBpbmR4OwotCSAgICBpbnQgYmlnZW5kaWFuOwotCSAgICBiZmRfc2l6ZV90eXBlIHN5bV9iYXNlOwotCSAgICB1bmlvbiBhdXhfZXh0ICphdXhfYmFzZTsKLQotCSAgICBmZHIgPSBlY29mZnN5bWJvbCAoc3ltYm9sKS0+ZmRyOwotCSAgICBpbmR4ID0gZWNvZmZfZXh0LmFzeW0uaW5kZXg7Ci0KLQkgICAgLyogc3ltX2Jhc2UgaXMgdXNlZCB0byBtYXAgdGhlIGZkciByZWxhdGl2ZSBpbmRpY2VzIHdoaWNoCi0JICAgICAgIGFwcGVhciBpbiB0aGUgZmlsZSB0byB0aGUgcG9zaXRpb24gbnVtYmVyIHdoaWNoIHdlIGFyZQotCSAgICAgICB1c2luZy4gICovCi0JICAgIHN5bV9iYXNlID0gZmRyLT5pc3ltQmFzZTsKLQkgICAgaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5sb2NhbCkKLQkgICAgICBzeW1fYmFzZSArPQotCQllY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heDsKLQotCSAgICAvKiBhdXhfYmFzZSBpcyB0aGUgc3RhcnQgb2YgdGhlIGF1eCBlbnRyaWVzIGZvciB0aGlzIGZpbGU7Ci0JICAgICAgIGFzeW0uaW5kZXggaXMgYW4gb2Zmc2V0IGZyb20gdGhpcy4gICovCi0JICAgIGF1eF9iYXNlID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX2F1eAotCQkJKyBmZHItPmlhdXhCYXNlKTsKLQotCSAgICAvKiBUaGUgYXV4IGVudHJpZXMgYXJlIHN0b3JlZCBpbiBob3N0IGJ5dGUgb3JkZXI7IHRoZQotCSAgICAgICBvcmRlciBpcyBpbmRpY2F0ZWQgYnkgYSBiaXQgaW4gdGhlIGZkci4gICovCi0JICAgIGJpZ2VuZGlhbiA9IGZkci0+ZkJpZ2VuZGlhbjsKLQotCSAgICAvKiBUaGlzIHN3aXRjaCBpcyBiYXNpY2FsbHkgZnJvbSBnY2MvbWlwcy10ZHVtcC5jICAqLwotCSAgICBzd2l0Y2ggKGVjb2ZmX2V4dC5hc3ltLnN0KQotCSAgICAgIHsKLQkgICAgICBjYXNlIHN0TmlsOgotCSAgICAgIGNhc2Ugc3RMYWJlbDoKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0RmlsZToKLQkgICAgICBjYXNlIHN0QmxvY2s6Ci0JCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRW5kKzEgc3ltYm9sOiAlbGQiKSwKLQkJCSAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOwotCQlicmVhazsKLQotCSAgICAgIGNhc2Ugc3RFbmQ6Ci0JCWlmIChlY29mZl9leHQuYXN5bS5zYyA9PSBzY1RleHQKLQkJICAgIHx8IGVjb2ZmX2V4dC5hc3ltLnNjID09IHNjSW5mbykKLQkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIEZpcnN0IHN5bWJvbDogJWxkIiksCi0JCQkgICAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBGaXJzdCBzeW1ib2w6ICVsZCIpLCAKLQkJCSAgICgobG9uZykKLQkJCSAgICAoQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sCi0JCQkJCSAgICZhdXhfYmFzZVtlY29mZl9leHQuYXN5bS5pbmRleF0pCi0JCQkgICAgICsgc3ltX2Jhc2UpKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdFByb2M6Ci0JICAgICAgY2FzZSBzdFN0YXRpY1Byb2M6Ci0JCWlmIChFQ09GRl9JU19TVEFCICgmZWNvZmZfZXh0LmFzeW0pKQotCQkgIDsKLQkJZWxzZSBpZiAoZWNvZmZzeW1ib2wgKHN5bWJvbCktPmxvY2FsKQotCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRW5kKzEgc3ltYm9sOiAlLTdsZCAgIFR5cGU6ICAlcyIpLAotCQkJICAgKChsb25nKQotCQkJICAgIChBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwKLQkJCQkJICAgJmF1eF9iYXNlW2Vjb2ZmX2V4dC5hc3ltLmluZGV4XSkKLQkJCSAgICAgKyBzeW1fYmFzZSkpLAotCQkJICAgZWNvZmZfdHlwZV90b19zdHJpbmcgKGFiZmQsIGZkciwgaW5keCArIDEpKTsKLQkJZWxzZQotCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgTG9jYWwgc3ltYm9sOiAlbGQiKSwKLQkJCSAgICgobG9uZykgaW5keAotCQkJICAgICsgKGxvbmcpIHN5bV9iYXNlCi0JCQkgICAgKyAoZWNvZmZfZGF0YSAoYWJmZCkKLQkJCSAgICAgICAtPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXgpKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdFN0cnVjdDoKLQkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBzdHJ1Y3Q7IEVuZCsxIHN5bWJvbDogJWxkIiksCi0JCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0VW5pb246Ci0JCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgdW5pb247IEVuZCsxIHN5bWJvbDogJWxkIiksCi0JCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0RW51bToKLQkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBlbnVtOyBFbmQrMSBzeW1ib2w6ICVsZCIpLAotCQkJIChsb25nKSAoaW5keCArIHN5bV9iYXNlKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgZGVmYXVsdDoKLQkJaWYgKCEgRUNPRkZfSVNfU1RBQiAoJmVjb2ZmX2V4dC5hc3ltKSkKLQkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIFR5cGU6ICVzIiksCi0JCQkgICBlY29mZl90eXBlX3RvX3N0cmluZyAoYWJmZCwgZmRyLCBpbmR4KSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLS8qIFJlYWQgaW4gdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgYXJlbGVudCAqaW50ZXJuYWxfcmVsb2NzOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2NzX3NpemU7Ci0gIGNoYXIgKmV4dGVybmFsX3JlbG9jczsKLSAgYXJlbGVudCAqcnB0cjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gIT0gKGFyZWxlbnQgKikgTlVMTAotICAgICAgfHwgc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gMAotICAgICAgfHwgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaW50ZXJuYWxfcmVsb2NzID0gKGFyZWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoc2l6ZW9mIChhcmVsZW50KQotCQkJCQkgICAgKiBzZWN0aW9uLT5yZWxvY19jb3VudCkpOwotICBleHRlcm5hbF9yZWxvY19zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgZXh0ZXJuYWxfcmVsb2NzX3NpemUgPSBleHRlcm5hbF9yZWxvY19zaXplICogc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGV4dGVybmFsX3JlbG9jcyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgZXh0ZXJuYWxfcmVsb2NzX3NpemUpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IChhcmVsZW50ICopIE5VTEwKLSAgICAgIHx8IGV4dGVybmFsX3JlbG9jcyA9PSAoY2hhciAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgZXh0ZXJuYWxfcmVsb2NzX3NpemUsIGFiZmQpCi0gICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMCwgcnB0ciA9IGludGVybmFsX3JlbG9jczsgaSA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBpKyssIHJwdHIrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW50ZXJuOwotCi0gICAgICAoKmJhY2tlbmQtPnN3YXBfcmVsb2NfaW4pIChhYmZkLAotCQkJCSBleHRlcm5hbF9yZWxvY3MgKyBpICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwKLQkJCQkgJmludGVybik7Ci0KLSAgICAgIGlmIChpbnRlcm4ucl9leHRlcm4pCi0JewotCSAgLyogcl9zeW1uZHggaXMgYW4gaW5kZXggaW50byB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0JICBCRkRfQVNTRVJUIChpbnRlcm4ucl9zeW1uZHggPj0gMAotCQkgICAgICAmJiAoaW50ZXJuLnJfc3ltbmR4Ci0JCQkgIDwgKGVjb2ZmX2RhdGEgKGFiZmQpCi0JCQkgICAgIC0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCkpKTsKLQkgIHJwdHItPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIGludGVybi5yX3N5bW5keDsKLQkgIHJwdHItPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoaW50ZXJuLnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fTk9ORQotCSAgICAgICB8fCBpbnRlcm4ucl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9BQlMpCi0JewotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHJwdHItPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIENPTlNUIGNoYXIgKnNlY19uYW1lOwotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgLyogcl9zeW1uZHggaXMgYSBzZWN0aW9uIGtleS4gICovCi0JICBzd2l0Y2ggKGludGVybi5yX3N5bW5keCkKLQkgICAgewotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fVEVYVDogIHNlY19uYW1lID0gIi50ZXh0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fUkRBVEE6IHNlY19uYW1lID0gIi5yZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fREFUQTogIHNlY19uYW1lID0gIi5kYXRhIjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0RBVEE6IHNlY19uYW1lID0gIi5zZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0JTUzogIHNlY19uYW1lID0gIi5zYnNzIjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fQlNTOiAgIHNlY19uYW1lID0gIi5ic3MiOyAgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fSU5JVDogIHNlY19uYW1lID0gIi5pbml0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUODogIHNlY19uYW1lID0gIi5saXQ4IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUNDogIHNlY19uYW1lID0gIi5saXQ0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fWERBVEE6IHNlY19uYW1lID0gIi54ZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fUERBVEE6IHNlY19uYW1lID0gIi5wZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fRklOSTogIHNlY19uYW1lID0gIi5maW5pIjsgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9MSVRBOiAgc2VjX25hbWUgPSAiLmxpdGEiOyAgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9SQ09OU1Q6IHNlY19uYW1lID0gIi5yY29uc3QiOyBicmVhazsKLQkgICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHNlY19uYW1lKTsKLQkgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIGFib3J0ICgpOwotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOwotCi0JICBycHRyLT5hZGRlbmQgPSAtIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0JfQotCi0gICAgICBycHRyLT5hZGRyZXNzID0gaW50ZXJuLnJfdmFkZHIgLSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQotICAgICAgLyogTGV0IHRoZSBiYWNrZW5kIHNlbGVjdCB0aGUgaG93dG8gZmllbGQgYW5kIGRvIGFueSBvdGhlcgotCSByZXF1aXJlZCBwcm9jZXNzaW5nLiAgKi8KLSAgICAgICgqYmFja2VuZC0+YWRqdXN0X3JlbG9jX2luKSAoYWJmZCwgJmludGVybiwgcnB0cik7Ci0gICAgfQotCi0gIGJmZF9yZWxlYXNlIChhYmZkLCBleHRlcm5hbF9yZWxvY3MpOwotCi0gIHNlY3Rpb24tPnJlbG9jYXRpb24gPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCBhIGNhbm9uaWNhbCBsaXN0IG9mIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAKLSAgICB7Ci0gICAgICBhcmVsZW50X2NoYWluICpjaGFpbjsKLQotICAgICAgLyogVGhpcyBzZWN0aW9uIGhhcyByZWxvY3MgbWFkZSB1cCBieSB1cywgbm90IHRoZSBmaWxlLCBzbyB0YWtlCi0JIHRoZW0gb3V0IG9mIHRoZWlyIGNoYWluIGFuZCBwbGFjZSB0aGVtIGludG8gdGhlIGRhdGEgYXJlYQotCSBwcm92aWRlZC4gICovCi0gICAgICBmb3IgKGNvdW50ID0gMCwgY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLQkgICBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgIGNvdW50KyssIGNoYWluID0gY2hhaW4tPm5leHQpCi0JKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0gICAgfQotICBlbHNlCi0gICAgeyAKLSAgICAgIGFyZWxlbnQgKnRibHB0cjsKLQotICAgICAgaWYgKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSA9PSBmYWxzZSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCSpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgIH0KLQotICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0MCi0vKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlCi0gICBhbmQgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUKLSAgIHdhbnRlZCBsb2NhdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgaWdub3JlX3N5bWJvbHMsIG9mZnNldCwKLQkJCSAgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgcmV0bGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKippZ25vcmVfc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqcmV0bGluZV9wdHI7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcAotICAgID0gJmVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5kZWJ1Z19zd2FwOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm8gPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm87Ci0gIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgRkRSJ3MuICAqLwotICBpZiAoISBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8gKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLCBkZWJ1Z19pbmZvKQotICAgICAgfHwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbyA9Ci0JKChzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICopCi0JIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSkpKTsKLSAgICAgIGlmIChlY29mZl9kYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBsaW5lX2luZm8gPSBlY29mZl9kYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm87Ci0KLSAgcmV0dXJuIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZnNldCwgZGVidWdfaW5mbywKLQkJCQkgZGVidWdfc3dhcCwgbGluZV9pbmZvLCBmaWxlbmFtZV9wdHIsCi0JCQkJIGZ1bmN0aW9ubmFtZV9wdHIsIHJldGxpbmVfcHRyKTsKLX0KLQwKLS8qIENvcHkgcHJpdmF0ZSBCRkQgZGF0YS4gIFRoaXMgaXMgY2FsbGVkIGJ5IG9iamNvcHkgYW5kIHN0cmlwLiAgV2UKLSAgIHVzZSBpdCB0byBjb3B5IHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBvbmUgQkZEIHRvIHRoZQotICAgb3RoZXIuICBJdCB3b3VsZCBiZSB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRvIHJlcHJlc2VudCB0aGUgRUNPRkYKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSG93ZXZlciwgaXQgd291bGQgYmUgYQotICAgbG90IG9mIHdvcmssIGFuZCB0aGVyZSB3b3VsZCBiZSBsaXR0bGUgZ2FpbiAoZ2FzLCBnZGIsIGFuZCBsZAotICAgYWxyZWFkeSBhY2Nlc3MgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB2aWEgdGhlCi0gICBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZSwgYW5kIHRoYXQgc3RydWN0dXJlIHdvdWxkIGhhdmUgdG8gYmUKLSAgIHJldGFpbmVkIGluIG9yZGVyIHRvIHN1cHBvcnQgRUNPRkYgZGVidWdnaW5nIGluIE1JUFMgRUxGKS4KLQotICAgVGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIEVDT0ZGIGV4dGVybmFsIHN5bWJvbHMgY29tZXMgZnJvbQotICAgdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhpcyBmdW5jdGlvbiBvbmx5IGhhbmRsZXMgdGhlIG90aGVyIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqaWluZm8gPSAmZWNvZmZfZGF0YSAoaWJmZCktPmRlYnVnX2luZm87Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvaW5mbyA9ICZlY29mZl9kYXRhIChvYmZkKS0+ZGVidWdfaW5mbzsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGFzeW1ib2wgKipzeW1fcHRyX3B0cjsKLSAgc2l6ZV90IGM7Ci0gIGJvb2xlYW4gbG9jYWw7Ci0KLSAgLyogV2Ugb25seSB3YW50IHRvIGNvcHkgaW5mb3JtYXRpb24gb3ZlciBpZiBib3RoIEJGRCdzIHVzZSBFQ09GRgotICAgICBmb3JtYXQuICAqLwotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIENvcHkgdGhlIEdQIHZhbHVlIGFuZCB0aGUgcmVnaXN0ZXIgbWFza3MuICAqLwotICBlY29mZl9kYXRhIChvYmZkKS0+Z3AgPSBlY29mZl9kYXRhIChpYmZkKS0+Z3A7Ci0gIGVjb2ZmX2RhdGEgKG9iZmQpLT5ncHJtYXNrID0gZWNvZmZfZGF0YSAoaWJmZCktPmdwcm1hc2s7Ci0gIGVjb2ZmX2RhdGEgKG9iZmQpLT5mcHJtYXNrID0gZWNvZmZfZGF0YSAoaWJmZCktPmZwcm1hc2s7Ci0gIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgZWNvZmZfZGF0YSAob2JmZCktPmNwcm1hc2tbaV0gPSBlY29mZl9kYXRhIChpYmZkKS0+Y3BybWFza1tpXTsKLQotICAvKiBDb3B5IHRoZSB2ZXJzaW9uIHN0YW1wLiAgKi8KLSAgb2luZm8tPnN5bWJvbGljX2hlYWRlci52c3RhbXAgPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLnZzdGFtcDsKLQotICAvKiBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scywgZG9uJ3QgY29weSBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgYyA9IGJmZF9nZXRfc3ltY291bnQgKG9iZmQpOwotICBzeW1fcHRyX3B0ciA9IGJmZF9nZXRfb3V0c3ltYm9scyAob2JmZCk7Ci0gIGlmIChjID09IDAgfHwgc3ltX3B0cl9wdHIgPT0gKGFzeW1ib2wgKiopIE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogU2VlIGlmIHRoZXJlIGFyZSBhbnkgbG9jYWwgc3ltYm9scy4gICovCi0gIGxvY2FsID0gZmFsc2U7Ci0gIGZvciAoOyBjID4gMDsgYy0tLCBzeW1fcHRyX3B0cisrKQotICAgIHsKLSAgICAgIGlmIChlY29mZnN5bWJvbCAoKnN5bV9wdHJfcHRyKS0+bG9jYWwpCi0JewotCSAgbG9jYWwgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAobG9jYWwpCi0gICAgewotICAgICAgLyogVGhlcmUgYXJlIHNvbWUgbG9jYWwgc3ltYm9scy4gIFdlIGp1c3QgYnJpbmcgb3ZlciBhbGwgdGhlCi0JIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEZJWE1FOiBUaGlzIGlzIG5vdCBxdWl0ZSB0aGUgcmlnaHQKLQkgdGhpbmcgdG8gZG8uICBJZiB0aGUgdXNlciBoYXMgYXNrZWQgdXMgdG8gZGlzY2FyZCBhbGwKLQkgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB0aGVuIHdlIGFyZSBwcm9iYWJseSBnb2luZyB0byB3aW5kIHVwCi0JIGtlZXBpbmcgaXQgYmVjYXVzZSB0aGVyZSB3aWxsIHByb2JhYmx5IGJlIHNvbWUgbG9jYWwgc3ltYm9sCi0JIHdoaWNoIG9iamNvcHkgZGlkIG5vdCBkaXNjYXJkLiAgV2Ugc2hvdWxkIGFjdHVhbGx5IGJyZWFrCi0JIGFwYXJ0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYW5kIG9ubHkga2VlcCB0aGF0IHdoaWNoCi0JIGFwcGxpZXMgdG8gdGhlIHN5bWJvbHMgd2Ugd2FudCB0byBrZWVwLiAgKi8KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWxpbmVNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlsaW5lTWF4OwotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5jYkxpbmUgPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmNiTGluZTsKLSAgICAgIG9pbmZvLT5saW5lID0gaWluZm8tPmxpbmU7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWRuTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pZG5NYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfZG5yID0gaWluZm8tPmV4dGVybmFsX2RucjsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pcGRNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlwZE1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9wZHIgPSBpaW5mby0+ZXh0ZXJuYWxfcGRyOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlzeW1NYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlzeW1NYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfc3ltID0gaWluZm8tPmV4dGVybmFsX3N5bTsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pb3B0TWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pb3B0TWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX29wdCA9IGlpbmZvLT5leHRlcm5hbF9vcHQ7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWF1eE1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaWF1eE1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9hdXggPSBpaW5mby0+ZXh0ZXJuYWxfYXV4OwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlzc01heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaXNzTWF4OwotICAgICAgb2luZm8tPnNzID0gaWluZm8tPnNzOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlmZE1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX2ZkciA9IGlpbmZvLT5leHRlcm5hbF9mZHI7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuY3JmZCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuY3JmZDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9yZmQgPSBpaW5mby0+ZXh0ZXJuYWxfcmZkOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGFyZSBkaXNjYXJkaW5nIGFsbCB0aGUgbG9jYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgTG9vawotCSB0aHJvdWdoIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gRkRSCi0JIG9yIGF1eCBpbmZvcm1hdGlvbi4gICovCi0gICAgICBjID0gYmZkX2dldF9zeW1jb3VudCAob2JmZCk7Ci0gICAgICBzeW1fcHRyX3B0ciA9IGJmZF9nZXRfb3V0c3ltYm9scyAob2JmZCk7Ci0gICAgICBmb3IgKDsgYyA+IDA7IGMtLSwgc3ltX3B0cl9wdHIrKykKLQl7Ci0JICBFWFRSIGVzeW07Ci0KLQkgICgqKGVjb2ZmX2JhY2tlbmQgKG9iZmQpLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X2luKSkKLQkgICAgKG9iZmQsIGVjb2Zmc3ltYm9sICgqc3ltX3B0cl9wdHIpLT5uYXRpdmUsICZlc3ltKTsKLQkgIGVzeW0uaWZkID0gaWZkTmlsOwotCSAgZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0JICAoKihlY29mZl9iYWNrZW5kIChvYmZkKS0+ZGVidWdfc3dhcC5zd2FwX2V4dF9vdXQpKQotCSAgICAob2JmZCwgJmVzeW0sIGVjb2Zmc3ltYm9sICgqc3ltX3B0cl9wdHIpLT5uYXRpdmUpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZS4gIFRoZSBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIGlzIHN0b3JlZCBpbiB0aGUKLSAgIGJhY2tlbmQgcG9pbnRlci4gIFdlIGFsd2F5cyBzZXQgdGhlIGFyY2hpdGVjdHVyZSBhbnlob3csIHNpbmNlIG1hbnkKLSAgIGNhbGxlcnMgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci0gIHJldHVybiBhcmNoID09IGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5hcmNoOwotfQotCi0vKiBHZXQgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCi0KLS8qQVJHU1VTRUQqLwotaW50Ci1fYmZkX2Vjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHJlbG9jIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFzZWN0aW9uICpjdXJyZW50OwotICBpbnQgYzsKLSAgaW50IHJldDsKLQotICBjID0gMDsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKilOVUxMOyAKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgCi0gICAgKytjOwotCi0gIHJldCA9IChiZmRfY29mZl9maWxoc3ogKGFiZmQpCi0JICsgYmZkX2NvZmZfYW91dHN6IChhYmZkKQotCSArIGMgKiBiZmRfY29mZl9zY25oc3ogKGFiZmQpKTsKLSAgcmV0dXJuIEJGRF9BTElHTiAocmV0LCAxNik7Ci19Ci0KLS8qIEdldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICByZXR1cm4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwKLQkJCQkJICAgIG9mZnNldCwgY291bnQpOwotfQotCi0vKiBTb3J0IHNlY3Rpb25zIGJ5IFZNQSwgYnV0IHB1dCBTRUNfQUxMT0Mgc2VjdGlvbnMgZmlyc3QuICBUaGlzIGlzCi0gICBjYWxsZWQgdmlhIHFzb3J0LiAgKi8KLQotc3RhdGljIGludAotZWNvZmZfc29ydF9oZHJzIChhcmcxLCBhcmcyKQotICAgICBjb25zdCBQVFIgYXJnMTsKLSAgICAgY29uc3QgUFRSIGFyZzI7Ci17Ci0gIGNvbnN0IGFzZWN0aW9uICpoZHIxID0gKihjb25zdCBhc2VjdGlvbiAqKikgYXJnMTsKLSAgY29uc3QgYXNlY3Rpb24gKmhkcjIgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcyOwotCi0gIGlmICgoaGRyMS0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgaWYgKChoZHIyLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChoZHIyLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChoZHIxLT52bWEgPCBoZHIyLT52bWEpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmIChoZHIxLT52bWEgPiBoZHIyLT52bWEpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBmaWxlIHBvc2l0aW9uIGZvciBlYWNoIHNlY3Rpb24sIGFuZCBzZXQKLSAgIHJlbG9jX2ZpbGVwb3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGZpbGVfcHRyIHNvZmFyLCBmaWxlX3NvZmFyOwotICBhc2VjdGlvbiAqKnNvcnRlZF9oZHJzOwotICBhc2VjdGlvbiAqY3VycmVudDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZpbGVfcHRyIG9sZF9zb2ZhcjsKLSAgYm9vbGVhbiByZGF0YV9pbl90ZXh0OwotICBib29sZWFuIGZpcnN0X2RhdGEsIGZpcnN0X25vbmFsbG9jOwotICBjb25zdCBiZmRfdm1hIHJvdW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCktPnJvdW5kOwotCi0gIHNvZmFyID0gX2JmZF9lY29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgZmFsc2UpOwotICBmaWxlX3NvZmFyID0gc29mYXI7Ci0KLSAgLyogU29ydCB0aGUgc2VjdGlvbnMgYnkgVk1BLiAgKi8KLSAgc29ydGVkX2hkcnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKGFiZmQtPnNlY3Rpb25fY291bnQKLQkJCQkJICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBpZiAoc29ydGVkX2hkcnMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zLCBpID0gMDsKLSAgICAgICBjdXJyZW50ICE9IE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQsIGkrKykKLSAgICBzb3J0ZWRfaGRyc1tpXSA9IGN1cnJlbnQ7Ci0gIEJGRF9BU1NFUlQgKGkgPT0gYWJmZC0+c2VjdGlvbl9jb3VudCk7Ci0KLSAgcXNvcnQgKHNvcnRlZF9oZHJzLCBhYmZkLT5zZWN0aW9uX2NvdW50LCBzaXplb2YgKGFzZWN0aW9uICopLAotCSBlY29mZl9zb3J0X2hkcnMpOwotCi0gIC8qIFNvbWUgdmVyc2lvbnMgb2YgdGhlIE9TRiBsaW5rZXIgcHV0IHRoZSAucmRhdGEgc2VjdGlvbiBpbiB0aGUKLSAgICAgdGV4dCBzZWdtZW50LCBhbmQgc29tZSBkbyBub3QuICAqLwotICByZGF0YV9pbl90ZXh0ID0gZWNvZmZfYmFja2VuZCAoYWJmZCktPnJkYXRhX2luX3RleHQ7Ci0gIGlmIChyZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgY3VycmVudCA9IHNvcnRlZF9oZHJzW2ldOwotCSAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1JEQVRBKSA9PSAwKQotCSAgICBicmVhazsKLQkgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1BEQVRBKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkNPTlNUKSAhPSAwKQotCSAgICB7Ci0JICAgICAgcmRhdGFfaW5fdGV4dCA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPnJkYXRhX2luX3RleHQgPSByZGF0YV9pbl90ZXh0OwotCi0gIGZpcnN0X2RhdGEgPSB0cnVlOwotICBmaXJzdF9ub25hbGxvYyA9IHRydWU7Ci0gIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLQotICAgICAgY3VycmVudCA9IHNvcnRlZF9oZHJzW2ldOwotCi0gICAgICAvKiBGb3IgdGhlIEFscGhhIEVDT0ZGIC5wZGF0YSBzZWN0aW9uIHRoZSBsbm5vcHRyIGZpZWxkIGlzCi0JIHN1cHBvc2VkIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgLnBkYXRhIGVudHJpZXMgdGhhdCBhcmUKLQkgcmVhbGx5IGluIHRoZSBzZWN0aW9uLiAgRWFjaCBlbnRyeSBpcyA4IGJ5dGVzLiAgV2Ugc3RvcmUgdGhpcwotCSBhd2F5IGluIGxpbmVfZmlsZXBvcyBiZWZvcmUgaW5jcmVhc2luZyB0aGUgc2VjdGlvbiBzaXplLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9QREFUQSkgPT0gMCkKLQljdXJyZW50LT5saW5lX2ZpbGVwb3MgPSBjdXJyZW50LT5fcmF3X3NpemUgLyA4OwotCi0gICAgICBhbGlnbm1lbnRfcG93ZXIgPSBjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXI7Ci0KLSAgICAgIC8qIE9uIFVsdHJpeCwgdGhlIGRhdGEgc2VjdGlvbnMgaW4gYW4gZXhlY3V0YWJsZSBmaWxlIG11c3QgYmUKLQkgYWxpZ25lZCB0byBhIHBhZ2UgYm91bmRhcnkgd2l0aGluIHRoZSBmaWxlLiAgVGhpcyBkb2VzIG5vdAotCSBhZmZlY3QgdGhlIHNlY3Rpb24gc2l6ZSwgdGhvdWdoLiAgRklYTUU6IERvZXMgdGhpcyB3b3JrIGZvcgotCSBvdGhlciBwbGF0Zm9ybXM/ICBJdCByZXF1aXJlcyBzb21lIG1vZGlmaWNhdGlvbiBmb3IgdGhlCi0JIEFscGhhLCBiZWNhdXNlIC5yZGF0YSBvbiB0aGUgQWxwaGEgZ29lcyB3aXRoIHRoZSB0ZXh0LCBub3QKLQkgdGhlIGRhdGEuICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMAotCSAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMAotCSAgJiYgISBmaXJzdF9kYXRhCi0JICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgJiYgKCEgcmRhdGFfaW5fdGV4dAotCSAgICAgIHx8IHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1JEQVRBKSAhPSAwKQotCSAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUERBVEEpICE9IDAKLQkgICYmIHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1JDT05TVCkgIT0gMCkKLQl7Ci0JICBzb2ZhciA9IChzb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JICBmaWxlX3NvZmFyID0gKGZpbGVfc29mYXIgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotCSAgZmlyc3RfZGF0YSA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX0xJQikgPT0gMCkKLQl7Ci0JICAvKiBPbiBJcml4IDQsIHRoZSBsb2NhdGlvbiBvZiBjb250ZW50cyBvZiB0aGUgLmxpYiBzZWN0aW9uCi0JICAgICBmcm9tIGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbiBpcyBhbHNvIHJvdW5kZWQgdXAgdG8gYQotCSAgICAgcGFnZSBib3VuZGFyeS4gICovCi0KLQkgIHNvZmFyID0gKHNvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLQkgIGZpbGVfc29mYXIgPSAoZmlsZV9zb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JfQotICAgICAgZWxzZSBpZiAoZmlyc3Rfbm9uYWxsb2MKLQkgICAgICAgJiYgKGN1cnJlbnQtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwCi0JICAgICAgICYmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0JewotCSAgLyogU2tpcCB1cCB0byB0aGUgbmV4dCBwYWdlIGZvciBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLCBzdWNoCi0gICAgICAgICAgICAgYXMgdGhlIC5jb21tZW50IHNlY3Rpb24gb24gdGhlIEFscGhhLiAgVGhpcyBsZWF2ZXMgcm9vbQotICAgICAgICAgICAgIGZvciB0aGUgLmJzcyBzZWN0aW9uLiAgKi8KLQkgIGZpcnN0X25vbmFsbG9jID0gZmFsc2U7Ci0JICBzb2ZhciA9IChzb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JICBmaWxlX3NvZmFyID0gKGZpbGVfc29mYXIgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotCX0KLQotICAgICAgLyogQWxpZ24gdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIHRvIHRoZSBzYW1lIGJvdW5kYXJ5IG9uCi0JIHdoaWNoIHRoZXkgYXJlIGFsaWduZWQgaW4gdmlydHVhbCBtZW1vcnkuICAqLwotICAgICAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQlmaWxlX3NvZmFyID0gQkZEX0FMSUdOIChmaWxlX3NvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwCi0JICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JewotCSAgc29mYXIgKz0gKGN1cnJlbnQtPnZtYSAtIHNvZmFyKSAlIHJvdW5kOwotCSAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JICAgIGZpbGVfc29mYXIgKz0gKGN1cnJlbnQtPnZtYSAtIGZpbGVfc29mYXIpICUgcm91bmQ7Ci0JfQotCi0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRCkpICE9IDApCi0JY3VycmVudC0+ZmlsZXBvcyA9IGZpbGVfc29mYXI7Ci0KLSAgICAgIHNvZmFyICs9IGN1cnJlbnQtPl9yYXdfc2l6ZTsKLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCWZpbGVfc29mYXIgKz0gY3VycmVudC0+X3Jhd19zaXplOwotCi0gICAgICAvKiBtYWtlIHN1cmUgdGhhdCB0aGlzIHNlY3Rpb24gaXMgb2YgdGhlIHJpZ2h0IHNpemUgdG9vICovCi0gICAgICBvbGRfc29mYXIgPSBzb2ZhcjsKLSAgICAgIHNvZmFyID0gQkZEX0FMSUdOIChzb2ZhciwgMSA8PCBhbGlnbm1lbnRfcG93ZXIpOwotICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JZmlsZV9zb2ZhciA9IEJGRF9BTElHTiAoZmlsZV9zb2ZhciwgMSA8PCBhbGlnbm1lbnRfcG93ZXIpOwotICAgICAgY3VycmVudC0+X3Jhd19zaXplICs9IHNvZmFyIC0gb2xkX3NvZmFyOwotICAgIH0KLQotICBmcmVlIChzb3J0ZWRfaGRycyk7Ci0gIHNvcnRlZF9oZHJzID0gTlVMTDsKLQotICBlY29mZl9kYXRhIChhYmZkKS0+cmVsb2NfZmlsZXBvcyA9IGZpbGVfc29mYXI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlIHJlbG9jcyBmb3IgYWxsIHRoZSBzZWN0aW9ucyBpbiB0aGUKLSAgIG91dHB1dCBmaWxlLCBhcyB3ZWxsIGFzIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9saWMgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfc2l6ZV90eXBlCi1lY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9Ci0gICAgZWNvZmZfYmFja2VuZCAoYWJmZCktPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGZpbGVfcHRyIHJlbG9jX2Jhc2U7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGZpbGVfcHRyIHN5bV9iYXNlOwotCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgaWYgKCEgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKLQlhYm9ydCAoKTsKLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgIH0KLSAgCi0gIHJlbG9jX2Jhc2UgPSBlY29mZl9kYXRhIChhYmZkKS0+cmVsb2NfZmlsZXBvczsKLQotICByZWxvY19zaXplID0gMDsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKilOVUxMOyAKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgCi0gICAgewotICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ID09IDApCi0JY3VycmVudC0+cmVsX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zaXplX3R5cGUgcmVsc2l6ZTsKLQotCSAgY3VycmVudC0+cmVsX2ZpbGVwb3MgPSByZWxvY19iYXNlOwotCSAgcmVsc2l6ZSA9IGN1cnJlbnQtPnJlbG9jX2NvdW50ICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLQkgIHJlbG9jX3NpemUgKz0gcmVsc2l6ZTsKLQkgIHJlbG9jX2Jhc2UgKz0gcmVsc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHN5bV9iYXNlID0gZWNvZmZfZGF0YSAoYWJmZCktPnJlbG9jX2ZpbGVwb3MgKyByZWxvY19zaXplOwotCi0gIC8qIEF0IGxlYXN0IG9uIFVsdHJpeCwgdGhlIHN5bWJvbCB0YWJsZSBvZiBhbiBleGVjdXRhYmxlIGZpbGUgbXVzdAotICAgICBiZSBhbGlnbmVkIHRvIGEgcGFnZSBib3VuZGFyeS4gIEZJWE1FOiBJcyB0aGlzIHRydWUgb24gb3RoZXIKLSAgICAgcGxhdGZvcm1zPyAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMAotICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLSAgICBzeW1fYmFzZSA9ICgoc3ltX2Jhc2UgKyBlY29mZl9iYWNrZW5kIChhYmZkKS0+cm91bmQgLSAxKQotCQkmfiAoZWNvZmZfYmFja2VuZCAoYWJmZCktPnJvdW5kIC0gMSkpOwotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9IHN5bV9iYXNlOwotCi0gIHJldHVybiByZWxvY19zaXplOwotfQotCi0vKiBTZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgLyogVGhpcyBtdXN0IGJlIGRvbmUgZmlyc3QsIGJlY2F1c2UgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIGlzCi0gICAgIGdvaW5nIHRvIHNldCBvdXRwdXRfaGFzX2JlZ3VuIHRvIHRydWUuICAqLwotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAoISBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSAubGliIHNlY3Rpb24gc3BlY2lhbGx5IHNvIHRoYXQgSXJpeCA0IHNoYXJlZCBsaWJyYXJpZXMKLSAgICAgd29yayBvdXQuICBTZWUgY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyBpbiBjb2ZmY29kZS5oLiAgKi8KLSAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0xJQikgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqcmVjLCAqcmVjZW5kOwotCi0gICAgICByZWMgPSAoYmZkX2J5dGUgKikgbG9jYXRpb247Ci0gICAgICByZWNlbmQgPSByZWMgKyBjb3VudDsKLSAgICAgIHdoaWxlIChyZWMgPCByZWNlbmQpCi0JewotCSAgKytzZWN0aW9uLT5sbWE7Ci0JICByZWMgKz0gYmZkX2dldF8zMiAoYWJmZCwgcmVjKSAqIDQ7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChyZWMgPT0gcmVjZW5kKTsKLSAgICB9Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgR1AgdmFsdWUgZm9yIGFuIEVDT0ZGIGZpbGUuICBUaGlzIGlzIGEgaG9vayB1c2VkIGJ5Ci0gICBubG1jb252LiAgKi8KLQotYmZkX3ZtYQotYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIAotICByZXR1cm4gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotfQotCi0vKiBTZXQgdGhlIEdQIHZhbHVlIGZvciBhbiBFQ09GRiBmaWxlLiAgVGhpcyBpcyBhIGhvb2sgdXNlZCBieSB0aGUKLSAgIGFzc2VtYmxlci4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgKGFiZmQsIGdwX3ZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgZ3BfdmFsdWU7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPmdwID0gZ3BfdmFsdWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgcmVnaXN0ZXIgbWFza3MgZm9yIGFuIEVDT0ZGIGZpbGUuICBUaGlzIGlzIGEgaG9vayB1c2VkIGJ5Ci0gICB0aGUgYXNzZW1ibGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyAoYWJmZCwgZ3BybWFzaywgZnBybWFzaywgY3BybWFzaykKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIGdwcm1hc2s7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZnBybWFzazsKLSAgICAgdW5zaWduZWQgbG9uZyAqY3BybWFzazsKLXsKLSAgZWNvZmZfZGF0YV90eXBlICp0ZGF0YTsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHRkYXRhID0gZWNvZmZfZGF0YSAoYWJmZCk7Ci0gIHRkYXRhLT5ncHJtYXNrID0gZ3BybWFzazsKLSAgdGRhdGEtPmZwcm1hc2sgPSBmcHJtYXNrOwotICBpZiAoY3BybWFzayAhPSAodW5zaWduZWQgbG9uZyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotCXRkYXRhLT5jcHJtYXNrW2ldID0gY3BybWFza1tpXTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCBFQ09GRiBFWFRSIGluZm9ybWF0aW9uIGZvciBhbiBleHRlcm5hbCBzeW1ib2wuICBUaGlzIGZ1bmN0aW9uCi0gICBpcyBwYXNzZWQgdG8gYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9nZXRfZXh0ciAoc3ltLCBlc3ltKQotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIEVYVFIgKmVzeW07Ci17Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICplY29mZl9zeW1fcHRyOwotICBiZmQgKmlucHV0X2JmZDsKLQotICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoc3ltKSAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGVjb2Zmc3ltYm9sIChzeW0pLT5uYXRpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBEb24ndCBpbmNsdWRlIGRlYnVnZ2luZywgbG9jYWwsIG9yIHNlY3Rpb24gc3ltYm9scy4gICovCi0gICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwCi0JICB8fCAoc3ltLT5mbGFncyAmIEJTRl9MT0NBTCkgIT0gMAotCSAgfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBlc3ltLT5qbXB0YmwgPSAwOwotICAgICAgZXN5bS0+Y29ib2xfbWFpbiA9IDA7Ci0gICAgICBlc3ltLT53ZWFrZXh0ID0gKHN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMDsKLSAgICAgIGVzeW0tPnJlc2VydmVkID0gMDsKLSAgICAgIGVzeW0tPmlmZCA9IGlmZE5pbDsKLSAgICAgIC8qIEZJWE1FOiB3ZSBjYW4gZG8gYmV0dGVyIHRoYW4gdGhpcyBmb3Igc3QgYW5kIHNjLiAgKi8KLSAgICAgIGVzeW0tPmFzeW0uc3QgPSBzdEdsb2JhbDsKLSAgICAgIGVzeW0tPmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVzeW0tPmFzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgZXN5bS0+YXN5bS5pbmRleCA9IGluZGV4TmlsOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGVjb2ZmX3N5bV9wdHIgPSBlY29mZnN5bWJvbCAoc3ltKTsKLQotICBpZiAoZWNvZmZfc3ltX3B0ci0+bG9jYWwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlucHV0X2JmZCA9IGJmZF9hc3ltYm9sX2JmZCAoc3ltKTsKLSAgKCooZWNvZmZfYmFja2VuZCAoaW5wdXRfYmZkKS0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbikpCi0gICAgKGlucHV0X2JmZCwgZWNvZmZfc3ltX3B0ci0+bmF0aXZlLCBlc3ltKTsKLQotICAvKiBJZiB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIsIHRoZW4gZXN5bSB3aWxsIGJlCi0gICAgIHVuZGVmaW5lZCBidXQgc3ltIHdpbGwgbm90IGJlLiAgR2V0IGEgYmV0dGVyIGNsYXNzIGZvciBzdWNoIGEKLSAgICAgc3ltYm9sLiAgKi8KLSAgaWYgKChlc3ltLT5hc3ltLnNjID09IHNjVW5kZWZpbmVkCi0gICAgICAgfHwgZXN5bS0+YXN5bS5zYyA9PSBzY1NVbmRlZmluZWQpCi0gICAgICAmJiAhIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLSAgICBlc3ltLT5hc3ltLnNjID0gc2NBYnM7Ci0KLSAgLyogQWRqdXN0IHRoZSBGRFIgaW5kZXggZm9yIHRoZSBzeW1ib2wgYnkgdGhhdCB1c2VkIGZvciB0aGUgaW5wdXQKLSAgICAgQkZELiAgKi8KLSAgaWYgKGVzeW0tPmlmZCAhPSAtMSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqaW5wdXRfZGVidWc7Ci0KLSAgICAgIGlucHV0X2RlYnVnID0gJmVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmRlYnVnX2luZm87Ci0gICAgICBCRkRfQVNTRVJUIChlc3ltLT5pZmQgPCBpbnB1dF9kZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlmZE1heCk7Ci0gICAgICBpZiAoaW5wdXRfZGVidWctPmlmZG1hcCAhPSAoUkZEVCAqKSBOVUxMKQotCWVzeW0tPmlmZCA9IGlucHV0X2RlYnVnLT5pZmRtYXBbZXN5bS0+aWZkXTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZGV4LiAgVGhpcyByb3V0aW5lIGlzIHBhc3NlZCB0bwotICAgYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscy4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zZXRfaW5kZXggKHN5bSwgaW5keCkKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci17Ci0gIGVjb2ZmX3NldF9zeW1faW5kZXggKHN5bSwgaW5keCk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBFQ09GRiBmaWxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgY29uc3QgYmZkX3ZtYSByb3VuZCA9IGJhY2tlbmQtPnJvdW5kOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGZpbGhzeiA9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCk7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgYW91dHN6ID0gYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBzY25oc3ogPSBiZmRfY29mZl9zY25oc3ogKGFiZmQpOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2hkcl9zaXplCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2hkcl9zaXplOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9yZWxvY19zaXplOwotICB2b2lkICgqIGNvbnN0IGFkanVzdF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICBjb25zdCBhcmVsZW50ICosCi0JCQkJCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSkKLSAgICA9IGJhY2tlbmQtPmFkanVzdF9yZWxvY19vdXQ7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JCQkJCSBQVFIpKQotICAgID0gYmFja2VuZC0+c3dhcF9yZWxvY19vdXQ7Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWcgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm87Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19zaXplOwotICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsKLSAgYmZkX3ZtYSB0ZXh0X3N0YXJ0OwotICBib29sZWFuIHNldF90ZXh0X3N0YXJ0OwotICBiZmRfc2l6ZV90eXBlIGRhdGFfc2l6ZTsKLSAgYmZkX3ZtYSBkYXRhX3N0YXJ0OwotICBib29sZWFuIHNldF9kYXRhX3N0YXJ0OwotICBiZmRfc2l6ZV90eXBlIGJzc19zaXplOwotICBQVFIgYnVmZiA9IE5VTEw7Ci0gIFBUUiByZWxvY19idWZmID0gTlVMTDsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgaW50ZXJuYWxfZjsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgaW50ZXJuYWxfYTsKLSAgaW50IGk7Ci0KLSAgLyogRGV0ZXJtaW5lIHdoZXJlIHRoZSBzZWN0aW9ucyBhbmQgcmVsb2NzIHdpbGwgZ28gaW4gdGhlIG91dHB1dAotICAgICBmaWxlLiAgKi8KLSAgcmVsb2Nfc2l6ZSA9IGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgKGFiZmQpOwotCi0gIGNvdW50ID0gMTsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSAoYXNlY3Rpb24gKilOVUxMOyAKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgCi0gICAgewotICAgICAgY3VycmVudC0+dGFyZ2V0X2luZGV4ID0gY291bnQ7Ci0gICAgICArK2NvdW50OwotICAgIH0KLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLSAgICB0ZXh0X3NpemUgPSBfYmZkX2Vjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCBmYWxzZSk7Ci0gIGVsc2UKLSAgICB0ZXh0X3NpemUgPSAwOwotICB0ZXh0X3N0YXJ0ID0gMDsKLSAgc2V0X3RleHRfc3RhcnQgPSBmYWxzZTsKLSAgZGF0YV9zaXplID0gMDsKLSAgZGF0YV9zdGFydCA9IDA7Ci0gIHNldF9kYXRhX3N0YXJ0ID0gZmFsc2U7Ci0gIGJzc19zaXplID0gMDsKLQotICAvKiBXcml0ZSBzZWN0aW9uIGhlYWRlcnMgdG8gdGhlIGZpbGUuICAqLwotCi0gIC8qIEFsbG9jYXRlIGJ1ZmYgYmlnIGVub3VnaCB0byBob2xkIGEgc2VjdGlvbiBoZWFkZXIsCi0gICAgIGZpbGUgaGVhZGVyLCBvciBhLm91dCBoZWFkZXIuICAqLwotICB7Ci0gICAgYmZkX3NpemVfdHlwZSBzaXo7Ci0gICAgc2l6ID0gc2NuaHN6OwotICAgIGlmIChzaXogPCBmaWxoc3opCi0gICAgICBzaXogPSBmaWxoc3o7Ci0gICAgaWYgKHNpeiA8IGFvdXRzeikKLSAgICAgIHNpeiA9IGFvdXRzejsKLSAgICBidWZmID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgc2l6KTsKLSAgICBpZiAoYnVmZiA9PSBOVUxMKQotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIH0KLQotICBpbnRlcm5hbF9mLmZfbnNjbnMgPSAwOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKGZpbGhzeiArIGFvdXRzeiksIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKSBOVUxMOwotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgc2VjdGlvbjsKLSAgICAgIGJmZF92bWEgdm1hOwotCi0gICAgICArK2ludGVybmFsX2YuZl9uc2NuczsKLQotICAgICAgc3RybmNweSAoc2VjdGlvbi5zX25hbWUsIGN1cnJlbnQtPm5hbWUsIHNpemVvZiBzZWN0aW9uLnNfbmFtZSk7Ci0KLSAgICAgIC8qIFRoaXMgc2VlbXMgdG8gYmUgY29ycmVjdCBmb3IgSXJpeCA0IHNoYXJlZCBsaWJyYXJpZXMuICAqLwotICAgICAgdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgY3VycmVudCk7Ci0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQotCXNlY3Rpb24uc192YWRkciA9IDA7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbi5zX3ZhZGRyID0gdm1hOwotCi0gICAgICBzZWN0aW9uLnNfcGFkZHIgPSBjdXJyZW50LT5sbWE7Ci0gICAgICBzZWN0aW9uLnNfc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoY3VycmVudCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgc2VjdGlvbiBpcyB1bmxvYWRhYmxlIHRoZW4gdGhlIHNjbnB0ciB3aWxsIGJlIDAuICAqLwotICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpKSA9PSAwKQotCXNlY3Rpb24uc19zY25wdHIgPSAwOwotICAgICAgZWxzZQotCXNlY3Rpb24uc19zY25wdHIgPSBjdXJyZW50LT5maWxlcG9zOwotICAgICAgc2VjdGlvbi5zX3JlbHB0ciA9IGN1cnJlbnQtPnJlbF9maWxlcG9zOwotCi0gICAgICAvKiBGSVhNRTogdGhlIGxubm9wdHIgb2YgdGhlIC5zYnNzIG9yIC5zZGF0YSBzZWN0aW9uIG9mIGFuCi0JIG9iamVjdCBmaWxlIHByb2R1Y2VkIGJ5IHRoZSBhc3NlbWJsZXIgaXMgc3VwcG9zZWQgdG8gcG9pbnQgdG8KLQkgaW5mb3JtYXRpb24gYWJvdXQgaG93IG11Y2ggcm9vbSBpcyByZXF1aXJlZCBieSBvYmplY3RzIG9mCi0JIHZhcmlvdXMgZGlmZmVyZW50IHNpemVzLiAgSSB0aGluayB0aGlzIG9ubHkgbWF0dGVycyBpZiB3ZQotCSB3YW50IHRoZSBsaW5rZXIgdG8gY29tcHV0ZSB0aGUgYmVzdCBzaXplIHRvIHVzZSwgb3IKLQkgc29tZXRoaW5nLiAgSSBkb24ndCBrbm93IHdoYXQgaGFwcGVucyBpZiB0aGUgaW5mb3JtYXRpb24gaXMKLQkgbm90IHByZXNlbnQuICAqLwotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1BEQVRBKSAhPSAwKQotCXNlY3Rpb24uc19sbm5vcHRyID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGUgQWxwaGEgRUNPRkYgLnBkYXRhIHNlY3Rpb24gdXNlcyB0aGUgbG5ub3B0ciBmaWVsZCB0bwotCSAgICAgaG9sZCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHNlY3Rpb24gKGVhY2ggZW50cnkgaXMKLQkgICAgIDggYnl0ZXMpLiAgV2Ugc3RvcmVkIHRoaXMgaW4gdGhlIGxpbmVfZmlsZXBvcyBmaWVsZCBpbgotCSAgICAgZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLiAgKi8KLQkgIHNlY3Rpb24uc19sbm5vcHRyID0gY3VycmVudC0+bGluZV9maWxlcG9zOwotCX0KLQotICAgICAgc2VjdGlvbi5zX25yZWxvYyA9IGN1cnJlbnQtPnJlbG9jX2NvdW50OwotICAgICAgc2VjdGlvbi5zX25sbm5vID0gMDsKLSAgICAgIHNlY3Rpb24uc19mbGFncyA9IGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzIChjdXJyZW50LT5uYW1lLAotCQkJCQkJIGN1cnJlbnQtPmZsYWdzKTsKLQotICAgICAgaWYgKGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgKFBUUikgJnNlY3Rpb24sIGJ1ZmYpID09IDAKLQkgIHx8IGJmZF93cml0ZSAoYnVmZiwgMSwgc2NuaHN6LCBhYmZkKSAhPSBzY25oc3opCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmICgoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9URVhUKSAhPSAwCi0JICB8fCAoKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfUkRBVEEpICE9IDAKLQkgICAgICAmJiBlY29mZl9kYXRhIChhYmZkKS0+cmRhdGFfaW5fdGV4dCkKLQkgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX1BEQVRBCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9EWU5BTUlDKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9MSUJMSVNUKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9SRUxEWU4pICE9IDAKLQkgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX0NPTkZMSUMKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0RZTlNUUikgIT0gMAotCSAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfRFlOU1lNKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9IQVNIKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9FQ09GRl9JTklUKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9FQ09GRl9GSU5JKSAhPSAwCi0JICB8fCBzZWN0aW9uLnNfZmxhZ3MgPT0gU1RZUF9SQ09OU1QpCi0JewotCSAgdGV4dF9zaXplICs9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoY3VycmVudCk7Ci0JICBpZiAoISBzZXRfdGV4dF9zdGFydCB8fCB0ZXh0X3N0YXJ0ID4gdm1hKQotCSAgICB7Ci0JICAgICAgdGV4dF9zdGFydCA9IHZtYTsKLQkgICAgICBzZXRfdGV4dF9zdGFydCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9SREFUQSkgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9EQVRBKSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0xJVEEpICE9IDAKLQkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfTElUOCkgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9MSVQ0KSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1NEQVRBKSAhPSAwCi0JICAgICAgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX1hEQVRBCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0dPVCkgIT0gMCkKLQl7Ci0JICBkYXRhX3NpemUgKz0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKLQkgIGlmICghIHNldF9kYXRhX3N0YXJ0IHx8IGRhdGFfc3RhcnQgPiB2bWEpCi0JICAgIHsKLQkgICAgICBkYXRhX3N0YXJ0ID0gdm1hOwotCSAgICAgIHNldF9kYXRhX3N0YXJ0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0JTUykgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9TQlNTKSAhPSAwKQotCWJzc19zaXplICs9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoY3VycmVudCk7Ci0gICAgICBlbHNlIGlmIChzZWN0aW9uLnNfZmxhZ3MgPT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9FQ09GRl9MSUIpICE9IDAKLQkgICAgICAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfQ09NTUVOVCkKLQkvKiBEbyBub3RoaW5nICovIDsKLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9CQotCi0gIC8qIFNldCB1cCB0aGUgZmlsZSBoZWFkZXIuICAqLwotCi0gIGludGVybmFsX2YuZl9tYWdpYyA9IGVjb2ZmX2dldF9tYWdpYyAoYWJmZCk7Ci0KLSAgLyogV2Ugd2lsbCBOT1QgcHV0IGEgZnVja2luZyB0aW1lc3RhbXAgaW4gdGhlIGhlYWRlciBoZXJlLiBFdmVyeQotICAgICB0aW1lIHlvdSBwdXQgaXQgYmFjaywgSSB3aWxsIGNvbWUgaW4gYW5kIHRha2UgaXQgb3V0IGFnYWluLiAgSSdtCi0gICAgIHNvcnJ5LiAgVGhpcyBmaWVsZCBkb2VzIG5vdCBiZWxvbmcgaGVyZS4gIFdlIGZpbGwgaXQgd2l0aCBhIDAgc28KLSAgICAgaXQgY29tcGFyZXMgdGhlIHNhbWUgYnV0IGlzIG5vdCBhIHJlYXNvbmFibGUgdGltZS4gLS0KLSAgICAgZ251QGN5Z251cy5jb20uICAqLwotICBpbnRlcm5hbF9mLmZfdGltZGF0ID0gMDsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGUgRUNPRkYgZl9uc3ltcyBmaWVsZCBpcyBub3QgYWN0dWFsbHkgdGhlIG51bWJlciBvZgotCSBzeW1ib2xzLCBpdCdzIHRoZSBzaXplIG9mIHN5bWJvbGljIGluZm9ybWF0aW9uIGhlYWRlci4gICovCi0gICAgICBpbnRlcm5hbF9mLmZfbnN5bXMgPSBleHRlcm5hbF9oZHJfc2l6ZTsKLSAgICAgIGludGVybmFsX2YuZl9zeW1wdHIgPSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3M7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuYWxfZi5mX25zeW1zID0gMDsKLSAgICAgIGludGVybmFsX2YuZl9zeW1wdHIgPSAwOwotICAgIH0KLQotICBpbnRlcm5hbF9mLmZfb3B0aGRyID0gYW91dHN6OwotCi0gIGludGVybmFsX2YuZl9mbGFncyA9IEZfTE5OTzsKLSAgaWYgKHJlbG9jX3NpemUgPT0gMCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9SRUxGTEc7Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0xTWU1TOwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfRVhFQzsKLQotICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXUjsKLSAgZWxzZQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0FSMzJXOwotCi0gIC8qIFNldCB1cCB0aGUgYGBvcHRpb25hbCcnIGhlYWRlci4gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIGludGVybmFsX2EubWFnaWMgPSBFQ09GRl9BT1VUX1pNQUdJQzsKLSAgZWxzZQotICAgIGludGVybmFsX2EubWFnaWMgPSBFQ09GRl9BT1VUX09NQUdJQzsKLQotICAvKiBGSVhNRTogSXMgdGhpcyByZWFsbHkgY29ycmVjdD8gICovCi0gIGludGVybmFsX2EudnN0YW1wID0gc3ltaGRyLT52c3RhbXA7Ci0KLSAgLyogQXQgbGVhc3Qgb24gVWx0cml4LCB0aGVzZSBoYXZlIHRvIGJlIHJvdW5kZWQgdG8gcGFnZSBib3VuZGFyaWVzLgotICAgICBGSVhNRTogSXMgdGhpcyB0cnVlIG9uIG90aGVyIHBsYXRmb3Jtcz8gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIHsKLSAgICAgIGludGVybmFsX2EudHNpemUgPSAodGV4dF9zaXplICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLSAgICAgIGludGVybmFsX2EudGV4dF9zdGFydCA9IHRleHRfc3RhcnQgJn4gKHJvdW5kIC0gMSk7Ci0gICAgICBpbnRlcm5hbF9hLmRzaXplID0gKGRhdGFfc2l6ZSArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0gICAgICBpbnRlcm5hbF9hLmRhdGFfc3RhcnQgPSBkYXRhX3N0YXJ0ICZ+IChyb3VuZCAtIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludGVybmFsX2EudHNpemUgPSB0ZXh0X3NpemU7Ci0gICAgICBpbnRlcm5hbF9hLnRleHRfc3RhcnQgPSB0ZXh0X3N0YXJ0OwotICAgICAgaW50ZXJuYWxfYS5kc2l6ZSA9IGRhdGFfc2l6ZTsKLSAgICAgIGludGVybmFsX2EuZGF0YV9zdGFydCA9IGRhdGFfc3RhcnQ7Ci0gICAgfQotCi0gIC8qIE9uIFVsdHJpeCwgdGhlIGluaXRpYWwgcG9ydGlvbnMgb2YgdGhlIC5zYnNzIGFuZCAuYnNzIHNlZ21lbnRzCi0gICAgIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhIHNlY3Rpb24uICBUaGUgYnNpemUgZmllbGQgaW4gdGhlCi0gICAgIG9wdGlvbmFsIGhlYWRlciByZWNvcmRzIGhvdyBtYW55IGJzcyBieXRlcyBhcmUgcmVxdWlyZWQgYmV5b25kCi0gICAgIHRob3NlIGluIHRoZSBkYXRhIHNlY3Rpb24uICBUaGUgdmFsdWUgaXMgbm90IHJvdW5kZWQgdG8gYSBwYWdlCi0gICAgIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGJzc19zaXplIDwgaW50ZXJuYWxfYS5kc2l6ZSAtIGRhdGFfc2l6ZSkKLSAgICBic3Nfc2l6ZSA9IDA7Ci0gIGVsc2UKLSAgICBic3Nfc2l6ZSAtPSBpbnRlcm5hbF9hLmRzaXplIC0gZGF0YV9zaXplOwotICBpbnRlcm5hbF9hLmJzaXplID0gYnNzX3NpemU7Ci0gIGludGVybmFsX2EuYnNzX3N0YXJ0ID0gaW50ZXJuYWxfYS5kYXRhX3N0YXJ0ICsgaW50ZXJuYWxfYS5kc2l6ZTsKLQotICBpbnRlcm5hbF9hLmVudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLQotICBpbnRlcm5hbF9hLmdwX3ZhbHVlID0gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotCi0gIGludGVybmFsX2EuZ3BybWFzayA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncHJtYXNrOwotICBpbnRlcm5hbF9hLmZwcm1hc2sgPSBlY29mZl9kYXRhIChhYmZkKS0+ZnBybWFzazsKLSAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICBpbnRlcm5hbF9hLmNwcm1hc2tbaV0gPSBlY29mZl9kYXRhIChhYmZkKS0+Y3BybWFza1tpXTsKLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgYWRqdXN0IHRoZSBoZWFkZXJzIGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChiYWNrZW5kLT5hZGp1c3RfaGVhZGVycykKLSAgICB7Ci0gICAgICBpZiAoISAoKmJhY2tlbmQtPmFkanVzdF9oZWFkZXJzKSAoYWJmZCwgJmludGVybmFsX2YsICZpbnRlcm5hbF9hKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBmaWxlIGhlYWRlciBhbmQgdGhlIG9wdGlvbmFsIGhlYWRlci4gICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIChQVFIpICZpbnRlcm5hbF9mLCBidWZmKTsKLSAgaWYgKGJmZF93cml0ZSAoYnVmZiwgMSwgZmlsaHN6LCBhYmZkKSAhPSBmaWxoc3opCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgKFBUUikgJmludGVybmFsX2EsIGJ1ZmYpOwotICBpZiAoYmZkX3dyaXRlIChidWZmLCAxLCBhb3V0c3osIGFiZmQpICE9IGFvdXRzeikKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBCdWlsZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlCi0gICAgIHdyaXRpbmcgb3V0IHRoZSByZWxvY3Mgc28gdGhhdCB3ZSBrbm93IHRoZSBzeW1ib2wgaW5kaWNlcy4gIFdlCi0gICAgIGRvbid0IGRvIHRoaXMgaWYgdGhpcyBCRkQgd2FzIGNyZWF0ZWQgYnkgdGhlIGJhY2tlbmQgbGlua2VyLAotICAgICBzaW5jZSBpdCB3aWxsIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBzeW1ib2xzIGFuZCByZWxvY3MuICAqLwotICBpZiAoISBlY29mZl9kYXRhIChhYmZkKS0+bGlua2VyKQotICAgIHsKLSAgICAgIHN5bWhkci0+aWV4dE1heCA9IDA7Ci0gICAgICBzeW1oZHItPmlzc0V4dE1heCA9IDA7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0ID0gZGVidWctPmV4dGVybmFsX2V4dF9lbmQgPSBOVUxMOwotICAgICAgZGVidWctPnNzZXh0ID0gZGVidWctPnNzZXh0X2VuZCA9IE5VTEw7Ci0gICAgICBpZiAoYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyAoYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLAotCQkJCSAgICAgKCgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApID09IDApCi0JCQkJICAgICAgPyB0cnVlIDogZmFsc2UpLAotCQkJCSAgICAgZWNvZmZfZ2V0X2V4dHIsIGVjb2ZmX3NldF9pbmRleCkKLQkgID09IGZhbHNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIHJlbG9jcy4gICovCi0gICAgICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLQkgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotCXsKLQkgIGFyZWxlbnQgKipyZWxvY19wdHJfcHRyOwotCSAgYXJlbGVudCAqKnJlbG9jX2VuZDsKLQkgIGNoYXIgKm91dF9wdHI7Ci0KLQkgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgcmVsb2NfYnVmZiA9Ci0JICAgIGJmZF9hbGxvYyAoYWJmZCwgY3VycmVudC0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplKTsKLQkgIGlmIChyZWxvY19idWZmID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICByZWxvY19wdHJfcHRyID0gY3VycmVudC0+b3JlbG9jYXRpb247Ci0JICByZWxvY19lbmQgPSByZWxvY19wdHJfcHRyICsgY3VycmVudC0+cmVsb2NfY291bnQ7Ci0JICBvdXRfcHRyID0gKGNoYXIgKikgcmVsb2NfYnVmZjsKLQkgIGZvciAoOwotCSAgICAgICByZWxvY19wdHJfcHRyIDwgcmVsb2NfZW5kOwotCSAgICAgICByZWxvY19wdHJfcHRyKyssIG91dF9wdHIgKz0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSkKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKnJlbG9jOwotCSAgICAgIGFzeW1ib2wgKnN5bTsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW47Ci0JICAKLQkgICAgICBtZW1zZXQgKChQVFIpICZpbiwgMCwgc2l6ZW9mIGluKTsKLQotCSAgICAgIHJlbG9jID0gKnJlbG9jX3B0cl9wdHI7Ci0JICAgICAgc3ltID0gKnJlbG9jLT5zeW1fcHRyX3B0cjsKLQotCSAgICAgIGluLnJfdmFkZHIgPSAocmVsb2MtPmFkZHJlc3MKLQkJCSAgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIGN1cnJlbnQpKTsKLQkgICAgICBpbi5yX3R5cGUgPSByZWxvYy0+aG93dG8tPnR5cGU7Ci0KLQkgICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JCXsKLQkJICBpbi5yX3N5bW5keCA9IGVjb2ZmX2dldF9zeW1faW5kZXggKCpyZWxvYy0+c3ltX3B0cl9wdHIpOwotCQkgIGluLnJfZXh0ZXJuID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIENPTlNUIGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSk7Ci0JCSAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9URVhUOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkRBVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0RBVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0JTUzsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9CU1M7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0lOSVQ7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDg7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDQ7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnhkYXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9YREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucGRhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1BEQVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9GSU5JOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIipBQlMqIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9BQlM7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJjb25zdCIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkNPTlNUOwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQkgIGluLnJfZXh0ZXJuID0gMDsKLQkJfQotCi0JICAgICAgKCphZGp1c3RfcmVsb2Nfb3V0KSAoYWJmZCwgcmVsb2MsICZpbik7Ci0KLQkgICAgICAoKnN3YXBfcmVsb2Nfb3V0KSAoYWJmZCwgJmluLCAoUFRSKSBvdXRfcHRyKTsKLQkgICAgfQotCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnQtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoYmZkX3dyaXRlIChyZWxvY19idWZmLAotCQkJIGV4dGVybmFsX3JlbG9jX3NpemUsIGN1cnJlbnQtPnJlbG9jX2NvdW50LCBhYmZkKQotCSAgICAgICE9IGV4dGVybmFsX3JlbG9jX3NpemUgKiBjdXJyZW50LT5yZWxvY19jb3VudCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfYnVmZik7Ci0JICByZWxvY19idWZmID0gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0JewotCSAgLyogV3JpdGUgb3V0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCSAgaWYgKGJmZF9lY29mZl93cml0ZV9kZWJ1ZyAoYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLAotCQkJCSAgICAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zKQotCSAgICAgID09IGZhbHNlKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSAuYnNzIHNlY3Rpb24gb2YgYSBkZW1hbmQgcGFnZWQgZXhlY3V0YWJsZSBtdXN0IHJlY2VpdmUgYW4KLSAgICAgZW50aXJlIHBhZ2UuICBJZiB0aGVyZSBhcmUgc3ltYm9scywgdGhlIHN5bWJvbHMgd2lsbCBzdGFydCBvbiB0aGUKLSAgICAgbmV4dCBwYWdlLiAgSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsIHdlIG11c3QgZmlsbCBvdXQgdGhlIHBhZ2UgYnkKLSAgICAgaGFuZC4gICovCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwCi0gICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDAKLSAgICAgICYmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0gICAgewotICAgICAgY2hhciBjOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zIC0gMSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9yZWFkICgmYywgMSwgMSwgYWJmZCkgPT0gMCkKLQljID0gMDsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgLSAxLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3dyaXRlICgmYywgMSwgMSwgYWJmZCkgIT0gMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJlbG9jX2J1ZmYgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfYnVmZik7Ci0gIGlmIChidWZmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmZik7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX2J1ZmYgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmVsb2NfYnVmZik7Ci0gIGlmIChidWZmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmZik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIEFyY2hpdmUgaGFuZGxpbmcuICBFQ09GRiB1c2VzIHdoYXQgYXBwZWFycyB0byBiZSBhIHVuaXF1ZSB0eXBlIG9mCi0gICBhcmNoaXZlIGhlYWRlciAoYXJtYXApLiAgVGhlIGJ5dGUgb3JkZXJpbmcgb2YgdGhlIGFybWFwIGFuZCB0aGUKLSAgIGNvbnRlbnRzIGFyZSBlbmNvZGVkIGluIHRoZSBuYW1lIG9mIHRoZSBhcm1hcCBpdHNlbGYuICBBdCBsZWFzdCBmb3IKLSAgIG5vdywgd2Ugb25seSBzdXBwb3J0IGFyY2hpdmVzIHdpdGggdGhlIHNhbWUgYnl0ZSBvcmRlcmluZyBpbiB0aGUKLSAgIGFybWFwIGFuZCB0aGUgY29udGVudHMuCi0KLSAgIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIGluIHRoZSBhcm1hcCBhcmUgdGhlIG51bWJlciBvZiBzeW1ib2wKLSAgIGRlZmluaXRpb25zLiAgVGhpcyBpcyBhbHdheXMgYSBwb3dlciBvZiB0d28uCi0KLSAgIFRoaXMgaXMgZm9sbG93ZWQgYnkgdGhlIHN5bWJvbCBkZWZpbml0aW9ucy4gIEVhY2ggc3ltYm9sIGRlZmluaXRpb24KLSAgIG9jY3VwaWVzIDggYnl0ZXMuICBUaGUgZmlyc3QgZm91ciBieXRlcyBhcmUgdGhlIG9mZnNldCBmcm9tIHRoZQotICAgc3RhcnQgb2YgdGhlIGFybWFwIHN0cmluZ3MgdG8gdGhlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgbmFtaW5nCi0gICB0aGlzIHN5bWJvbC4gIFRoZSBzZWNvbmQgZm91ciBieXRlcyBhcmUgdGhlIGZpbGUgb2Zmc2V0IHRvIHRoZQotICAgYXJjaGl2ZSBtZW1iZXIgd2hpY2ggZGVmaW5lcyB0aGlzIHN5bWJvbC4gIElmIHRoZSBzZWNvbmQgZm91ciBieXRlcwotICAgYXJlIDAsIHRoZW4gdGhpcyBpcyBub3QgYWN0dWFsbHkgYSBzeW1ib2wgZGVmaW5pdGlvbiwgYW5kIGl0IHNob3VsZAotICAgYmUgaWdub3JlZC4KLQotICAgVGhlIHN5bWJvbHMgYXJlIGhhc2hlZCBpbnRvIHRoZSBhcm1hcCB3aXRoIGEgY2xvc2VkIGhhc2hpbmcgc2NoZW1lLgotICAgU2VlIHRoZSBmdW5jdGlvbnMgYmVsb3cgZm9yIHRoZSBkZXRhaWxzIG9mIHRoZSBhbGdvcml0aG0uCi0KLSAgIEFmdGVyIHRoZSBzeW1ib2wgZGVmaW5pdGlvbnMgY29tZXMgZm91ciBieXRlcyBob2xkaW5nIHRoZSBzaXplIG9mCi0gICB0aGUgc3RyaW5nIHRhYmxlLCBmb2xsb3dlZCBieSB0aGUgc3RyaW5nIHRhYmxlIGl0c2VsZi4gICovCi0KLS8qIFRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgaGVhZGVycyBsb29rcyBsaWtlIHRoaXM6Ci0gICBfX19fX19fX19fRVtCTF1FW0JMXV8gKHdpdGggYSB0cmFpbGluZyBzcGFjZSkuCi0gICBUaGUgdHJhaWxpbmcgc3BhY2UgaXMgY2hhbmdlZCB0byBhbiBYIGlmIHRoZSBhcmNoaXZlIGlzIGNoYW5nZWQgdG8KLSAgIGluZGljYXRlIHRoYXQgdGhlIGFybWFwIGlzIG91dCBvZiBkYXRlLgotCi0gICBUaGUgQWxwaGEgc2VlbXMgdG8gdXNlIF9fX19fX19fNjRFW0JMXUVbQkxdXy4gICovCi0KLSNkZWZpbmUgQVJNQVBfQklHX0VORElBTiAnQicKLSNkZWZpbmUgQVJNQVBfTElUVExFX0VORElBTiAnTCcKLSNkZWZpbmUgQVJNQVBfTUFSS0VSICdFJwotI2RlZmluZSBBUk1BUF9TVEFSVF9MRU5HVEggMTAKLSNkZWZpbmUgQVJNQVBfSEVBREVSX01BUktFUl9JTkRFWCAxMAotI2RlZmluZSBBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYIDExCi0jZGVmaW5lIEFSTUFQX09CSkVDVF9NQVJLRVJfSU5ERVggMTIKLSNkZWZpbmUgQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWCAxMwotI2RlZmluZSBBUk1BUF9FTkRfSU5ERVggMTQKLSNkZWZpbmUgQVJNQVBfRU5EICJfICIKLQotLyogVGhpcyBpcyBhIG1hZ2ljIG51bWJlciB1c2VkIGluIHRoZSBoYXNoaW5nIGFsZ29yaXRobS4gICovCi0jZGVmaW5lIEFSTUFQX0hBU0hfTUFHSUMgMHg5ZGQ2OGFiNQotCi0vKiBUaGlzIHJldHVybnMgdGhlIGhhc2ggdmFsdWUgdG8gdXNlIGZvciBhIHN0cmluZy4gIEl0IGFsc28gc2V0cwotICAgKlJFSEFTSCB0byB0aGUgcmVoYXNoIGFkanVzdG1lbnQgaWYgdGhlIGZpcnN0IHNsb3QgaXMgdGFrZW4uICBTSVpFCi0gICBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUsIGFuZCBITE9HIGlzIHRoZSBsb2cKLSAgIGJhc2UgMiBvZiBTSVpFLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotZWNvZmZfYXJtYXBfaGFzaCAocywgcmVoYXNoLCBzaXplLCBobG9nKQotICAgICBDT05TVCBjaGFyICpzOwotICAgICB1bnNpZ25lZCBpbnQgKnJlaGFzaDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIHVuc2lnbmVkIGludCBobG9nOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoaGxvZyA9PSAwKQotICAgIHJldHVybiAwOwotICBoYXNoID0gKnMrKzsKLSAgd2hpbGUgKCpzICE9ICdcMCcpCi0gICAgaGFzaCA9ICgoaGFzaCA+PiAyNykgfCAoaGFzaCA8PCA1KSkgKyAqcysrOwotICBoYXNoICo9IEFSTUFQX0hBU0hfTUFHSUM7Ci0gICpyZWhhc2ggPSAoaGFzaCAmIChzaXplIC0gMSkpIHwgMTsKLSAgcmV0dXJuIGhhc2ggPj4gKDMyIC0gaGxvZyk7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGFybWFwLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9zbHVycF9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgcGFyc2VkX3NpemU7Ci0gIGNoYXIgKnJhd19hcm1hcDsKLSAgc3RydWN0IGFydGRhdGEgKmFyZGF0YTsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBjaGFyICpyYXdfcHRyOwotICBzdHJ1Y3Qgc3ltZGVmICpzeW1kZWZfcHRyOwotICBjaGFyICpzdHJpbmdiYXNlOwotICAKLSAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBlbGVtZW50LiAgKi8KLSAgaSA9IGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpOwotICBpZiAoaSA9PSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAtMTYsIFNFRUtfQ1VSKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJcml4IDQuMC41RiBhcHBhcmVudGx5IGNhbiB1c2UgZWl0aGVyIGFuIEVDT0ZGIGFybWFwIG9yIGEKLSAgICAgc3RhbmRhcmQgQ09GRiBhcm1hcC4gIFdlIGNvdWxkIG1vdmUgdGhlIEVDT0ZGIGFybWFwIHN0dWZmIGludG8KLSAgICAgYmZkX3NsdXJwX2FybWFwLCBidXQgdGhhdCBzZWVtcyBpbmFwcHJvcHJpYXRlIHNpbmNlIG5vIG90aGVyCi0gICAgIHRhcmdldCB1c2VzIHRoaXMgZm9ybWF0LiAgSW5zdGVhZCwgd2UgY2hlY2sgZGlyZWN0bHkgZm9yIGEgQ09GRgotICAgICBhcm1hcC4gICovCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikgPT0gMCkKLSAgICByZXR1cm4gYmZkX3NsdXJwX2FybWFwIChhYmZkKTsKLQotICAvKiBTZWUgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYW4gYXJtYXAuICAqLwotICBpZiAoc3RybmNtcCAobmV4dG5hbWUsIGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5hcm1hcF9zdGFydCwKLQkgICAgICAgQVJNQVBfU1RBUlRfTEVOR1RIKSAhPSAwCi0gICAgICB8fCBuZXh0bmFtZVtBUk1BUF9IRUFERVJfTUFSS0VSX0lOREVYXSAhPSBBUk1BUF9NQVJLRVIKLSAgICAgIHx8IChuZXh0bmFtZVtBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9CSUdfRU5ESUFOCi0JICAmJiBuZXh0bmFtZVtBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9MSVRUTEVfRU5ESUFOKQotICAgICAgfHwgbmV4dG5hbWVbQVJNQVBfT0JKRUNUX01BUktFUl9JTkRFWF0gIT0gQVJNQVBfTUFSS0VSCi0gICAgICB8fCAobmV4dG5hbWVbQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWF0gIT0gQVJNQVBfQklHX0VORElBTgotCSAgJiYgbmV4dG5hbWVbQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWF0gIT0gQVJNQVBfTElUVExFX0VORElBTikKLSAgICAgIHx8IHN0cm5jbXAgKG5leHRuYW1lICsgQVJNQVBfRU5EX0lOREVYLAotCQkgIEFSTUFQX0VORCwgc2l6ZW9mIEFSTUFQX0VORCAtIDEpICE9IDApCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGJ5dGUgb3JkZXJpbmcuICAqLwotICBpZiAoKChuZXh0bmFtZVtBUk1BUF9IRUFERVJfRU5ESUFOX0lOREVYXSA9PSBBUk1BUF9CSUdfRU5ESUFOKQotICAgICAgIF4gKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpKQotICAgICAgfHwgKChuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYXSA9PSBBUk1BUF9CSUdfRU5ESUFOKQotCSAgXiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIGFybWFwLiAgKi8KLSAgYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7Ci0gIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgaWYgKG1hcGRhdGEgPT0gKHN0cnVjdCBhcmVsdGRhdGEgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHBhcnNlZF9zaXplID0gbWFwZGF0YS0+cGFyc2VkX3NpemU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsKLSAgICAKLSAgcmF3X2FybWFwID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBwYXJzZWRfc2l6ZSk7Ci0gIGlmIChyYXdfYXJtYXAgPT0gKGNoYXIgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgcmF3X2FybWFwLCAxLCBwYXJzZWRfc2l6ZSwgYWJmZCkgIT0gcGFyc2VkX3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gIGFyZGF0YS0+dGRhdGEgPSAoUFRSKSByYXdfYXJtYXA7Ci0KLSAgY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIHJhd19hcm1hcCk7Ci0KLSAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSAwOwotICBhcmRhdGEtPmNhY2hlID0gKHN0cnVjdCBhcl9jYWNoZSAqKSBOVUxMOwotCi0gIC8qIFRoaXMgY29kZSB1c2VkIHRvIG92ZXJsYXkgdGhlIHN5bWRlZnMgb3ZlciB0aGUgcmF3IGFyY2hpdmUgZGF0YSwKLSAgICAgYnV0IHRoYXQgZG9lc24ndCB3b3JrIG9uIGEgNjQgYml0IGhvc3QuICAqLwotCi0gIHN0cmluZ2Jhc2UgPSByYXdfYXJtYXAgKyBjb3VudCAqIDggKyA4OwotCi0jaWZkZWYgQ0hFQ0tfQVJNQVBfSEFTSAotICB7Ci0gICAgdW5zaWduZWQgaW50IGhsb2c7Ci0KLSAgICAvKiBEb3VibGUgY2hlY2sgdGhhdCBJIGhhdmUgdGhlIGhhc2hpbmcgYWxnb3JpdGhtIHJpZ2h0IGJ5IG1ha2luZwotICAgICAgIHN1cmUgdGhhdCBldmVyeSBzeW1ib2wgY2FuIGJlIGxvb2tlZCB1cCBzdWNjZXNzZnVsbHkuICAqLwotICAgIGhsb2cgPSAwOwotICAgIGZvciAoaSA9IDE7IGkgPCBjb3VudDsgaSA8PD0gMSkKLSAgICAgIGhsb2crKzsKLSAgICBCRkRfQVNTRVJUIChpID09IGNvdW50KTsKLQotICAgIHJhd19wdHIgPSByYXdfYXJtYXAgKyA0OwotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByYXdfcHRyICs9IDgpCi0gICAgICB7Ci0JdW5zaWduZWQgaW50IG5hbWVfb2Zmc2V0LCBmaWxlX29mZnNldDsKLQl1bnNpZ25lZCBpbnQgaGFzaCwgcmVoYXNoLCBzcmNoOwotICAgICAgCi0JbmFtZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIHJhd19wdHIpOwotCWZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAocmF3X3B0ciArIDQpKTsKLQlpZiAoZmlsZV9vZmZzZXQgPT0gMCkKLQkgIGNvbnRpbnVlOwotCWhhc2ggPSBlY29mZl9hcm1hcF9oYXNoIChzdHJpbmdiYXNlICsgbmFtZV9vZmZzZXQsICZyZWhhc2gsIGNvdW50LAotCQkJCSBobG9nKTsKLQlpZiAoaGFzaCA9PSBpKQotCSAgY29udGludWU7Ci0KLQkvKiBTZWUgaWYgd2UgY2FuIHJlaGFzaCB0byB0aGlzIGxvY2F0aW9uLiAgKi8KLQlmb3IgKHNyY2ggPSAoaGFzaCArIHJlaGFzaCkgJiAoY291bnQgLSAxKTsKLQkgICAgIHNyY2ggIT0gaGFzaCAmJiBzcmNoICE9IGk7Ci0JICAgICBzcmNoID0gKHNyY2ggKyByZWhhc2gpICYgKGNvdW50IC0gMSkpCi0JICBCRkRfQVNTRVJUIChiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChyYXdfYXJtYXAgKyA4ICsgc3JjaCAqIDgpKQotCQkgICAgICAhPSAwKTsKLQlCRkRfQVNTRVJUIChzcmNoID09IGkpOwotICAgICAgfQotICB9Ci0KLSNlbmRpZiAvKiBDSEVDS19BUk1BUF9IQVNIICovCi0KLSAgcmF3X3B0ciA9IHJhd19hcm1hcCArIDQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByYXdfcHRyICs9IDgpCi0gICAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgKHJhd19wdHIgKyA0KSkgIT0gMCkKLSAgICAgICsrYXJkYXRhLT5zeW1kZWZfY291bnQ7Ci0KLSAgc3ltZGVmX3B0ciA9ICgoc3RydWN0IHN5bWRlZiAqKQotCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkgICBhcmRhdGEtPnN5bWRlZl9jb3VudCAqIHNpemVvZiAoc3RydWN0IHN5bWRlZikpKTsKLSAgaWYgKCFzeW1kZWZfcHRyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIHN5bWRlZl9wdHI7Ci0KLSAgcmF3X3B0ciA9IHJhd19hcm1hcCArIDQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByYXdfcHRyICs9IDgpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG5hbWVfb2Zmc2V0LCBmaWxlX29mZnNldDsKLQotICAgICAgZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChyYXdfcHRyICsgNCkpOwotICAgICAgaWYgKGZpbGVfb2Zmc2V0ID09IDApCi0JY29udGludWU7Ci0gICAgICBuYW1lX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgcmF3X3B0cik7Ci0gICAgICBzeW1kZWZfcHRyLT5zLm5hbWUgPSBzdHJpbmdiYXNlICsgbmFtZV9vZmZzZXQ7Ci0gICAgICBzeW1kZWZfcHRyLT5maWxlX29mZnNldCA9IGZpbGVfb2Zmc2V0OwotICAgICAgKytzeW1kZWZfcHRyOwotICAgIH0KLQotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkuICAqLwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPSBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyAlIDI7Ci0KLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIGFybWFwLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl93cml0ZV9hcm1hcCAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICB1bnNpZ25lZCBpbnQgaGFzaHNpemUsIGhhc2hsb2c7Ci0gIHVuc2lnbmVkIGludCBzeW1kZWZzaXplOwotICBpbnQgcGFkaXQ7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplOwotICB1bnNpZ25lZCBpbnQgbWFwc2l6ZTsKLSAgZmlsZV9wdHIgZmlyc3RyZWFsOwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF9ieXRlIHRlbXBbNF07Ci0gIGJmZF9ieXRlICpoYXNodGFibGU7Ci0gIGJmZCAqY3VycmVudDsKLSAgYmZkICpsYXN0X2VsdDsKLQotICAvKiBVbHRyaXggYXBwZWFycyB0byB1c2UgYXMgYSBoYXNoIHRhYmxlIHNpemUgdGhlIGxlYXN0IHBvd2VyIG9mIHR3bwotICAgICBncmVhdGVyIHRoYW4gdHdpY2UgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgKi8KLSAgZm9yIChoYXNobG9nID0gMDsgKCh1bnNpZ25lZCBpbnQpIDEgPDwgaGFzaGxvZykgPD0gMiAqIG9ybF9jb3VudDsgaGFzaGxvZysrKQotICAgIDsKLSAgaGFzaHNpemUgPSAxIDw8IGhhc2hsb2c7Ci0KLSAgc3ltZGVmc2l6ZSA9IGhhc2hzaXplICogODsKLSAgcGFkaXQgPSBzdHJpZHggJSAyOwotICBzdHJpbmdzaXplID0gc3RyaWR4ICsgcGFkaXQ7Ci0KLSAgLyogSW5jbHVkZSA4IGJ5dGVzIHRvIHN0b3JlIHN5bWRlZnNpemUgYW5kIHN0cmluZ3NpemUgaW4gb3V0cHV0LiAqLwotICBtYXBzaXplID0gc3ltZGVmc2l6ZSArIHN0cmluZ3NpemUgKyA4OwotCi0gIGZpcnN0cmVhbCA9IFNBUk1BRyArIHNpemVvZiAoc3RydWN0IGFyX2hkcikgKyBtYXBzaXplICsgZWxlbmd0aDsKLQotICBtZW1zZXQgKChQVFIpICZoZHIsIDAsIHNpemVvZiBoZHIpOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBFQ09GRiBhcm1hcCBuYW1lLiAgKi8KLSAgc3RyY3B5IChoZHIuYXJfbmFtZSwgZWNvZmZfYmFja2VuZCAoYWJmZCktPmFybWFwX3N0YXJ0KTsKLSAgaGRyLmFyX25hbWVbQVJNQVBfSEVBREVSX01BUktFUl9JTkRFWF0gPSBBUk1BUF9NQVJLRVI7Ci0gIGhkci5hcl9uYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdID0KLSAgICAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKQotICAgICA/IEFSTUFQX0JJR19FTkRJQU4KLSAgICAgOiBBUk1BUF9MSVRUTEVfRU5ESUFOKTsKLSAgaGRyLmFyX25hbWVbQVJNQVBfT0JKRUNUX01BUktFUl9JTkRFWF0gPSBBUk1BUF9NQVJLRVI7Ci0gIGhkci5hcl9uYW1lW0FSTUFQX09CSkVDVF9FTkRJQU5fSU5ERVhdID0KLSAgICBiZmRfYmlnX2VuZGlhbiAoYWJmZCkgPyBBUk1BUF9CSUdfRU5ESUFOIDogQVJNQVBfTElUVExFX0VORElBTjsKLSAgbWVtY3B5IChoZHIuYXJfbmFtZSArIEFSTUFQX0VORF9JTkRFWCwgQVJNQVBfRU5ELCBzaXplb2YgQVJNQVBfRU5EIC0gMSk7Ci0KLSAgLyogV3JpdGUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIgdG8gYmUganVzdCBhIGxpdHRsZSBiaXQKLSAgICAgbGF0ZXIgdGhhbiB0aGUgdGltZXN0YW1wIG9mIHRoZSBmaWxlLCBvdGhlcndpc2UgdGhlIGxpbmtlciB3aWxsCi0gICAgIGNvbXBsYWluIHRoYXQgdGhlIGluZGV4IGlzIG91dCBvZiBkYXRlLiAgQWN0dWFsbHksIHRoZSBVbHRyaXgKLSAgICAgbGlua2VyIGp1c3QgY2hlY2tzIHRoZSBhcmNoaXZlIG5hbWU7IHRoZSBHTlUgbGlua2VyIG1heSBjaGVjayB0aGUKLSAgICAgZGF0ZS4gICovCi0gIHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmc3RhdGJ1Zik7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgKGxvbmcpIChzdGF0YnVmLnN0X210aW1lICsgNjApKTsKLQotICAvKiBUaGUgREVDc3RhdGlvbiB1c2VzIHplcm9lcyBmb3IgdGhlIHVpZCwgZ2lkIGFuZCBtb2RlIG9mIHRoZQotICAgICBhcm1hcC4gICovCi0gIGhkci5hcl91aWRbMF0gPSAnMCc7Ci0gIGhkci5hcl9naWRbMF0gPSAnMCc7Ci0jaWYgMAotICBoZHIuYXJfbW9kZVswXSA9ICcwJzsKLSNlbHNlCi0gIC8qIEJ1aWxkaW5nIGdjYyBlbmRzIHVwIGV4dHJhY3RpbmcgdGhlIGFybWFwIGFzIGEgZmlsZSAtIHR3aWNlLiAqLwotICBoZHIuYXJfbW9kZVswXSA9ICc2JzsKLSAgaGRyLmFyX21vZGVbMV0gPSAnNCc7Ci0gIGhkci5hcl9tb2RlWzJdID0gJzQnOwotI2VuZGlmCi0KLSAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIG1hcHNpemUpOwotCi0gIGhkci5hcl9mbWFnWzBdID0gJ2AnOwotICBoZHIuYXJfZm1hZ1sxXSA9ICdcMDEyJzsKLQotICAvKiBUdXJuIGFsbCBudWxsIGJ5dGVzIGluIHRoZSBoZWFkZXIgaW50byBzcGFjZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgaWYgKCgoY2hhciAqKSgmaGRyKSlbaV0gPT0gJ1wwJykKLSAgICAgKCgoY2hhciAqKSgmaGRyKSlbaV0pID0gJyAnOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBoYXNoc2l6ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHRlbXAsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaGFzaHRhYmxlID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIHN5bWRlZnNpemUpOwotICBpZiAoIWhhc2h0YWJsZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY3VycmVudCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgbGFzdF9lbHQgPSBjdXJyZW50OwotICBmb3IgKGkgPSAwOyBpIDwgb3JsX2NvdW50OyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2gsIHJlaGFzaDsKLQotICAgICAgLyogQWR2YW5jZSBmaXJzdHJlYWwgdG8gdGhlIGZpbGUgcG9zaXRpb24gb2YgdGhpcyBhcmNoaXZlCi0JIGVsZW1lbnQuICAqLwotICAgICAgaWYgKCgoYmZkICopIG1hcFtpXS5wb3MpICE9IGxhc3RfZWx0KQotCXsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBmaXJzdHJlYWwgKz0gYXJlbHRfc2l6ZSAoY3VycmVudCkgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotCSAgICAgIGZpcnN0cmVhbCArPSBmaXJzdHJlYWwgJSAyOwotCSAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotCSAgICB9Ci0JICB3aGlsZSAoY3VycmVudCAhPSAoYmZkICopIG1hcFtpXS5wb3MpOwotCX0KLQotICAgICAgbGFzdF9lbHQgPSBjdXJyZW50OwotCi0gICAgICBoYXNoID0gZWNvZmZfYXJtYXBfaGFzaCAoKm1hcFtpXS5uYW1lLCAmcmVoYXNoLCBoYXNoc2l6ZSwgaGFzaGxvZyk7Ci0gICAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAoaGFzaHRhYmxlICsgKGhhc2ggKiA4KSArIDQpKSAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBzcmNoOwotCi0JICAvKiBUaGUgZGVzaXJlZCBzbG90IGlzIGFscmVhZHkgdGFrZW4uICAqLwotCSAgZm9yIChzcmNoID0gKGhhc2ggKyByZWhhc2gpICYgKGhhc2hzaXplIC0gMSk7Ci0JICAgICAgIHNyY2ggIT0gaGFzaDsKLQkgICAgICAgc3JjaCA9IChzcmNoICsgcmVoYXNoKSAmIChoYXNoc2l6ZSAtIDEpKQotCSAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAoaGFzaHRhYmxlICsgKHNyY2ggKiA4KSArIDQpKSA9PSAwKQotCSAgICAgIGJyZWFrOwotCi0JICBCRkRfQVNTRVJUIChzcmNoICE9IGhhc2gpOwotCi0JICBoYXNoID0gc3JjaDsKLQl9Ci0JCi0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBtYXBbaV0ubmFtaWR4LAotCQkgICAgKFBUUikgKGhhc2h0YWJsZSArIGhhc2ggKiA4KSk7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBmaXJzdHJlYWwsCi0JCSAgICAoUFRSKSAoaGFzaHRhYmxlICsgaGFzaCAqIDggKyA0KSk7Ci0gICAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGhhc2h0YWJsZSwgMSwgc3ltZGVmc2l6ZSwgYWJmZCkgIT0gc3ltZGVmc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIGhhc2h0YWJsZSk7Ci0KLSAgLyogTm93IHdyaXRlIHRoZSBzdHJpbmdzLiAgKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3RyaW5nc2l6ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHRlbXAsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKGkgPSAwOyBpIDwgb3JsX2NvdW50OyBpKyspCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBsZW47Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoKm1hcFtpXS5uYW1lKSArIDE7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAoKm1hcFtpXS5uYW1lKSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3BlYyBzZXogdGhpcyBzaG91bGQgYmUgYSBuZXdsaW5lLiAgQnV0IGluIG9yZGVyIHRvIGJlCi0gICAgIGJ1Zy1jb21wYXRpYmxlIGZvciBERUNzdGF0aW9uIGFyIHdlIHVzZSBhIG51bGwuICAqLwotICBpZiAocGFkaXQpCi0gICAgewotICAgICAgaWYgKGJmZF93cml0ZSAoIiIsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIHdoZXRoZXIgdGhpcyBCRkQgaXMgYW4gYXJjaGl2ZS4gIElmIGl0IGlzLCByZWFkIGluIHRoZSBhcm1hcAotICAgYW5kIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1fYmZkX2Vjb2ZmX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJ0ZGF0YSAqdGRhdGFfaG9sZDsKLSAgY2hhciBhcm1hZ1tTQVJNQUcgKyAxXTsKLQotICB0ZGF0YV9ob2xkID0gYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgYXJtYWcsIDEsIFNBUk1BRywgYWJmZCkgIT0gU0FSTUFHKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotICAgIH0KLQotICBpZiAoc3RybmNtcCAoYXJtYWcsIEFSTUFHLCBTQVJNQUcpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgYXJlIHNldHRpbmcgYmZkX2FyZGF0YShhYmZkKSBoZXJlLCBidXQgc2luY2UgYmZkX2FyZGF0YQotICAgICBpbnZvbHZlcyBhIGNhc3QsIHdlIGNhbid0IGRvIGl0IGFzIHRoZSBsZWZ0IG9wZXJhbmQgb2YKLSAgICAgYXNzaWdubWVudC4gICovCi0gIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9Ci0gICAgKHN0cnVjdCBhcnRkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKTsKLQotICBpZiAoYmZkX2FyZGF0YSAoYWJmZCkgPT0gKHN0cnVjdCBhcnRkYXRhICopIE5VTEwpCi0gICAgewotICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLSAgICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotICAgIH0KLQotICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gU0FSTUFHOwotICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSBOVUxMOwotICAKLSAgaWYgKF9iZmRfZWNvZmZfc2x1cnBfYXJtYXAgKGFiZmQpID09IGZhbHNlCi0gICAgICB8fCBfYmZkX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOwotICAgICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0gICAgfQotICAKLSAgaWYgKGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICBiZmQgKmZpcnN0OwotCi0gICAgICAvKiBUaGlzIGFyY2hpdmUgaGFzIGEgbWFwLCBzbyB3ZSBtYXkgcHJlc3VtZSB0aGF0IHRoZSBjb250ZW50cwotCSBhcmUgb2JqZWN0IGZpbGVzLiAgTWFrZSBzdXJlIHRoYXQgaWYgdGhlIGZpcnN0IGZpbGUgaW4gdGhlCi0JIGFyY2hpdmUgY2FuIGJlIHJlY29nbml6ZWQgYXMgYW4gb2JqZWN0IGZpbGUsIGl0IGlzIGZvciB0aGlzCi0JIHRhcmdldC4gIElmIG5vdCwgYXNzdW1lIHRoYXQgdGhpcyBpcyB0aGUgd3JvbmcgZm9ybWF0LiAgSWYKLQkgdGhlIGZpcnN0IGZpbGUgaXMgbm90IGFuIG9iamVjdCBmaWxlLCBzb21lYm9keSBpcyBkb2luZwotCSBzb21ldGhpbmcgd2VpcmQsIGFuZCB3ZSBwZXJtaXQgaXQgc28gdGhhdCBhciAtdCB3aWxsIHdvcmsuICAqLwotCi0gICAgICBmaXJzdCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCk7Ci0gICAgICBpZiAoZmlyc3QgIT0gTlVMTCkKLQl7Ci0JICBib29sZWFuIGZhaWw7Ci0KLQkgIGZpcnN0LT50YXJnZXRfZGVmYXVsdGVkID0gZmFsc2U7Ci0JICBmYWlsID0gZmFsc2U7Ci0JICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlyc3QsIGJmZF9vYmplY3QpCi0JICAgICAgJiYgZmlyc3QtPnh2ZWMgIT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGZpcnN0KTsKLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotCSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IHRkYXRhX2hvbGQ7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQotCSAgLyogV2Ugb3VnaHQgdG8gY2xvc2UgZmlyc3QgaGVyZSwgYnV0IHdlIGNhbid0LCBiZWNhdXNlIHdlCi0gICAgICAgICAgICAgaGF2ZSBubyB3YXkgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGFyY2hpdmUgY2FjaGUuICBGSVhNRS4gICovCi0JfQotICAgIH0KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQwKLS8qIEVDT0ZGIGxpbmtlciBjb2RlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZWNvZmZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlLAotCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCkpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgUFRSLCBjaGFyICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgICAgcmV0LT5hYmZkID0gTlVMTDsKLSAgICAgIHJldC0+d3JpdHRlbiA9IDA7Ci0gICAgICByZXQtPnNtYWxsID0gMDsKLSAgICB9Ci0gIG1lbXNldCAoKFBUUikgJnJldC0+ZXN5bSwgMCwgc2l6ZW9mIHJldC0+ZXN5bSk7Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9lY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVjb2ZmX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlY29mZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBFQ09GRiBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCi0gICBqdXN0IGEgY2FzdC4gICovCi0KLSNkZWZpbmUgZWNvZmZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIEdpdmVuIGFuIEVDT0ZGIEJGRCwgYWRkIHN5bWJvbHMgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGFzCi0gICBhcHByb3ByaWF0ZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICByZXR1cm4gZWNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICByZXR1cm4gZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgdGhlIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlIGZpbGUgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLgotICAgVGhpcyBsb29rcyB0aHJvdWdoIHRoZSB1bmRlZmluZWQgc3ltYm9scywgbG9va3MgZWFjaCBvbmUgdXAgaW4gdGhlCi0gICBhcmNoaXZlIGhhc2ggdGFibGUsIGFuZCBhZGRzIGFueSBhc3NvY2lhdGVkIG9iamVjdCBmaWxlLiAgV2UgZG8gbm90Ci0gICB1c2UgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyBiZWNhdXNlIEVDT0ZGIGFyY2hpdmVzCi0gICBhbHJlYWR5IGhhdmUgYSBoYXNoIHRhYmxlLCBzbyB0aGVyZSBpcyBubyByZWFzb24gdG8gY29uc3RydWN0Ci0gICBhbm90aGVyIG9uZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIGNvbnN0IGJmZF9ieXRlICpyYXdfYXJtYXA7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqcHVuZGVmOwotICB1bnNpZ25lZCBpbnQgYXJtYXBfY291bnQ7Ci0gIHVuc2lnbmVkIGludCBhcm1hcF9sb2c7Ci0gIHVuc2lnbmVkIGludCBpOwotICBjb25zdCBiZmRfYnl0ZSAqaGFzaHRhYmxlOwotICBjb25zdCBjaGFyICpzdHJpbmdiYXNlOwotCi0gIGlmICghIGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBBbiBlbXB0eSBhcmNoaXZlIGlzIGEgc3BlY2lhbCBjYXNlLiAgKi8KLSAgICAgIGlmIChiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fYXJtYXApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFueSByYXcgZGF0YSBmb3IgdGhpcyBhcmNoaXZlLCBhcyBjYW4gaGFwcGVuIG9uCi0gICAgIElyaXggNC4wLjVGLCB3ZSBjYWxsIHRoZSBnZW5lcmljIHJvdXRpbmUuCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYmUgbW9yZSBjbGV2ZXIgYWJvdXQgdGhpcywgc2luY2Ugc29tZWRheSB0ZGF0YQotICAgICBtYXkgZ2V0IHRvIHNvbWV0aGluZyBmb3IgYSBnZW5lcmljIGFyY2hpdmUuICAqLwotICByYXdfYXJtYXAgPSAoY29uc3QgYmZkX2J5dGUgKikgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhOwotICBpZiAocmF3X2FybWFwID09IChiZmRfYnl0ZSAqKSBOVUxMKQotICAgIHJldHVybiAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCSAgICAoYWJmZCwgaW5mbywgZWNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpKTsKLQotICBhcm1hcF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmF3X2FybWFwKTsKLQotICBhcm1hcF9sb2cgPSAwOwotICBmb3IgKGkgPSAxOyBpIDwgYXJtYXBfY291bnQ7IGkgPDw9IDEpCi0gICAgYXJtYXBfbG9nKys7Ci0gIEJGRF9BU1NFUlQgKGkgPT0gYXJtYXBfY291bnQpOwotCi0gIGhhc2h0YWJsZSA9IHJhd19hcm1hcCArIDQ7Ci0gIHN0cmluZ2Jhc2UgPSAoY29uc3QgY2hhciAqKSByYXdfYXJtYXAgKyBhcm1hcF9jb3VudCAqIDggKyA4OwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgbGlzdCBvZiB1bmRlZmluZWQgc3ltYm9scy4gICovCi0gIHB1bmRlZiA9ICZpbmZvLT5oYXNoLT51bmRlZnM7Ci0gIHdoaWxlICgqcHVuZGVmICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgaW50IGhhc2gsIHJlaGFzaDsKLSAgICAgIHVuc2lnbmVkIGludCBmaWxlX29mZnNldDsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBiZmQgKmVsZW1lbnQ7Ci0KLSAgICAgIGggPSAqcHVuZGVmOwotCi0gICAgICAvKiBXaGVuIGEgc3ltYm9sIGlzIGRlZmluZWQsIGl0IGlzIG5vdCBuZWNlc3NhcmlseSByZW1vdmVkIGZyb20KLQkgdGhlIGxpc3QuICAqLwotICAgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JewotCSAgLyogUmVtb3ZlIHRoaXMgZW50cnkgZnJvbSB0aGUgbGlzdCwgZm9yIGdlbmVyYWwgY2xlYW5saW5lc3MKLQkgICAgIGFuZCBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBsb29rIHRocm91Z2ggdGhlIGxpc3QgYWdhaW4KLQkgICAgIGlmIHdlIHNlYXJjaCBhbnkgbW9yZSBsaWJyYXJpZXMuICBXZSBjYW4ndCByZW1vdmUgdGhlCi0JICAgICBlbnRyeSBpZiBpdCBpcyB0aGUgdGFpbCwgYmVjYXVzZSB0aGF0IHdvdWxkIGxvc2UgYW55Ci0JICAgICBlbnRyaWVzIHdlIGFkZCB0byB0aGUgbGlzdCBsYXRlciBvbi4gICovCi0JICBpZiAoKnB1bmRlZiAhPSBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCkKLQkgICAgKnB1bmRlZiA9ICgqcHVuZGVmKS0+bmV4dDsKLQkgIGVsc2UKLQkgICAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTmF0aXZlIEVDT0ZGIGxpbmtlcnMgZG8gbm90IHB1bGwgaW4gYXJjaGl2ZSBlbGVtZW50cyBtZXJlbHkKLQkgdG8gc2F0aXNmeSBjb21tb24gZGVmaW5pdGlvbnMsIHNvIG5laXRoZXIgZG8gd2UuICBXZSBsZWF2ZQotCSB0aGVtIG9uIHRoZSBsaXN0LCB0aG91Z2gsIGluIGNhc2Ugd2UgYXJlIGxpbmtpbmcgYWdhaW5zdCBzb21lCi0JIG90aGVyIG9iamVjdCBmb3JtYXQuICAqLwotICAgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JewotCSAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0gICAgICBoYXNoID0gZWNvZmZfYXJtYXBfaGFzaCAoaC0+cm9vdC5zdHJpbmcsICZyZWhhc2gsIGFybWFwX2NvdW50LAotCQkJICAgICAgIGFybWFwX2xvZyk7Ci0KLSAgICAgIGZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoaGFzaCAqIDgpICsgNCk7Ci0gICAgICBpZiAoZmlsZV9vZmZzZXQgPT0gMCkKLQl7Ci0JICAvKiBOb3RoaW5nIGluIHRoaXMgc2xvdC4gICovCi0JICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBuYW1lID0gc3RyaW5nYmFzZSArIGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKGhhc2ggKiA4KSk7Ci0gICAgICBpZiAobmFtZVswXSAhPSBoLT5yb290LnN0cmluZ1swXQotCSAgfHwgc3RyY21wIChuYW1lLCBoLT5yb290LnN0cmluZykgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgc3JjaDsKLQkgIGJvb2xlYW4gZm91bmQ7Ci0KLQkgIC8qIFRoYXQgd2FzIHRoZSB3cm9uZyBzeW1ib2wuICBUcnkgcmVoYXNoaW5nLiAgKi8KLQkgIGZvdW5kID0gZmFsc2U7Ci0JICBmb3IgKHNyY2ggPSAoaGFzaCArIHJlaGFzaCkgJiAoYXJtYXBfY291bnQgLSAxKTsKLQkgICAgICAgc3JjaCAhPSBoYXNoOwotCSAgICAgICBzcmNoID0gKHNyY2ggKyByZWhhc2gpICYgKGFybWFwX2NvdW50IC0gMSkpCi0JICAgIHsKLQkgICAgICBmaWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKHNyY2ggKiA4KSArIDQpOwotCSAgICAgIGlmIChmaWxlX29mZnNldCA9PSAwKQotCQlicmVhazsKLQkgICAgICBuYW1lID0gc3RyaW5nYmFzZSArIGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKHNyY2ggKiA4KSk7Ci0JICAgICAgaWYgKG5hbWVbMF0gPT0gaC0+cm9vdC5zdHJpbmdbMF0KLQkJICAmJiBzdHJjbXAgKG5hbWUsIGgtPnJvb3Quc3RyaW5nKSA9PSAwKQotCQl7Ci0JCSAgZm91bmQgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgZm91bmQpCi0JICAgIHsKLQkgICAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGhhc2ggPSBzcmNoOwotCX0KLQotICAgICAgZWxlbWVudCA9ICgqYmFja2VuZC0+Z2V0X2VsdF9hdF9maWxlcG9zKSAoYWJmZCwgZmlsZV9vZmZzZXQpOwotICAgICAgaWYgKGVsZW1lbnQgPT0gKGJmZCAqKSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoZWxlbWVudCwgYmZkX29iamVjdCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBVbmxpa2UgdGhlIGdlbmVyaWMgbGlua2VyLCB3ZSBrbm93IHRoYXQgdGhpcyBlbGVtZW50IHByb3ZpZGVzCi0JIGEgZGVmaW5pdGlvbiBmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbCBhbmQgd2Uga25vdyB0aGF0IHdlIHdhbnQKLQkgdG8gaW5jbHVkZSBpdC4gIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYW55dGhpbmcuICAqLwotICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBlbGVtZW50LCBuYW1lKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBlY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoZWxlbWVudCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgaWYgd2UgdXNlZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gICBiZWNhdXNlIHdlIHdlcmUgbm90IGRlYWxpbmcgd2l0aCBhbiBFQ09GRiBhcmNoaXZlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICB2b2lkICgqIGNvbnN0IHN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbjsKLSAgSERSUiAqc3ltaGRyOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplOwotICBQVFIgZXh0ZXJuYWxfZXh0ID0gTlVMTDsKLSAgc2l6ZV90IGVzaXplOwotICBjaGFyICpzc2V4dCA9IE5VTEw7Ci0gIGNoYXIgKmV4dF9wdHI7Ci0gIGNoYXIgKmV4dF9lbmQ7Ci0KLSAgKnBuZWVkZWQgPSBmYWxzZTsKLQotICBpZiAoISBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IGl0LiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKLQotICBzeW1oZHIgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyOwotCi0gIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIGV4dGVybmFsIHN0cmluZ3MuICAqLwotICBleHRlcm5hbF9leHRfc2l6ZSA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGVzaXplID0gc3ltaGRyLT5pZXh0TWF4ICogZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGV4dGVybmFsX2V4dCA9IChQVFIpIGJmZF9tYWxsb2MgKGVzaXplKTsKLSAgaWYgKGV4dGVybmFsX2V4dCA9PSBOVUxMICYmIGVzaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1oZHItPmNiRXh0T2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGV4dGVybmFsX2V4dCwgMSwgZXNpemUsIGFiZmQpICE9IGVzaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHNzZXh0ID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3ltaGRyLT5pc3NFeHRNYXgpOwotICBpZiAoc3NleHQgPT0gTlVMTCAmJiBzeW1oZHItPmlzc0V4dE1heCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltaGRyLT5jYlNzRXh0T2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChzc2V4dCwgMSwgc3ltaGRyLT5pc3NFeHRNYXgsIGFiZmQpICE9Ci0JICAoYmZkX3NpemVfdHlwZSkgc3ltaGRyLT5pc3NFeHRNYXgpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scyB0byBzZWUgaWYgdGhleSBkZWZpbmUgc29tZQotICAgICBzeW1ib2wgdGhhdCBpcyBjdXJyZW50bHkgdW5kZWZpbmVkLiAgKi8KLSAgZXh0X3B0ciA9IChjaGFyICopIGV4dGVybmFsX2V4dDsKLSAgZXh0X2VuZCA9IGV4dF9wdHIgKyBlc2l6ZTsKLSAgZm9yICg7IGV4dF9wdHIgPCBleHRfZW5kOyBleHRfcHRyICs9IGV4dGVybmFsX2V4dF9zaXplKQotICAgIHsKLSAgICAgIEVYVFIgZXN5bTsKLSAgICAgIGJvb2xlYW4gZGVmOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAoKnN3YXBfZXh0X2luKSAoYWJmZCwgKFBUUikgZXh0X3B0ciwgJmVzeW0pOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBzeW1ib2wgZGVmaW5lcyBzb21ldGhpbmcuICAqLwotICAgICAgaWYgKGVzeW0uYXN5bS5zdCAhPSBzdEdsb2JhbAotCSAgJiYgZXN5bS5hc3ltLnN0ICE9IHN0TGFiZWwKLQkgICYmIGVzeW0uYXN5bS5zdCAhPSBzdFByb2MpCi0JY29udGludWU7Ci0KLSAgICAgIHN3aXRjaCAoZXN5bS5hc3ltLnNjKQotCXsKLQljYXNlIHNjVGV4dDoKLQljYXNlIHNjRGF0YToKLQljYXNlIHNjQnNzOgotCWNhc2Ugc2NBYnM6Ci0JY2FzZSBzY1NEYXRhOgotCWNhc2Ugc2NTQnNzOgotCWNhc2Ugc2NSRGF0YToKLQljYXNlIHNjQ29tbW9uOgotCWNhc2Ugc2NTQ29tbW9uOgotCWNhc2Ugc2NJbml0OgotCWNhc2Ugc2NGaW5pOgotCWNhc2Ugc2NSQ29uc3Q6Ci0JICBkZWYgPSB0cnVlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGRlZiA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoISBkZWYpCi0JY29udGludWU7Ci0KLSAgICAgIG5hbWUgPSBzc2V4dCArIGVzeW0uYXN5bS5pc3M7Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgIC8qIFVubGlrZSB0aGUgZ2VuZXJpYyBsaW5rZXIsIHdlIGRvIG5vdCBwdWxsIGluIGVsZW1lbnRzIGJlY2F1c2UKLQkgb2YgY29tbW9uIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEluY2x1ZGUgdGhpcyBlbGVtZW50LiAgKi8KLSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoISBlY29mZl9saW5rX2FkZF9leHRlcm5hbHMgKGFiZmQsIGluZm8sIGV4dGVybmFsX2V4dCwgc3NleHQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAqcG5lZWRlZCA9IHRydWU7Ci0gICAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotICAgIH0KLQotIHN1Y2Nlc3NmdWxfcmV0dXJuOgotICBpZiAoZXh0ZXJuYWxfZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfZXh0KTsKLSAgaWYgKHNzZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoc3NleHQpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBFQ09GRiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgSERSUiAqc3ltaGRyOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplOwotICBQVFIgZXh0ZXJuYWxfZXh0ID0gTlVMTDsKLSAgc2l6ZV90IGVzaXplOwotICBjaGFyICpzc2V4dCA9IE5VTEw7Ci0gIGJvb2xlYW4gcmVzdWx0OwotCi0gIGlmICghIGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlciAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IGl0LiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltaGRyID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlcjsKLQotICAvKiBSZWFkIGluIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCBleHRlcm5hbCBzdHJpbmdzLiAgKi8KLSAgZXh0ZXJuYWxfZXh0X3NpemUgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcC5leHRlcm5hbF9leHRfc2l6ZTsKLSAgZXNpemUgPSBzeW1oZHItPmlleHRNYXggKiBleHRlcm5hbF9leHRfc2l6ZTsKLSAgZXh0ZXJuYWxfZXh0ID0gKFBUUikgYmZkX21hbGxvYyAoZXNpemUpOwotICBpZiAoZXh0ZXJuYWxfZXh0ID09IE5VTEwgJiYgZXNpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bWhkci0+Y2JFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoZXh0ZXJuYWxfZXh0LCAxLCBlc2l6ZSwgYWJmZCkgIT0gZXNpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3NleHQgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzeW1oZHItPmlzc0V4dE1heCk7Ci0gIGlmIChzc2V4dCA9PSBOVUxMICYmIHN5bWhkci0+aXNzRXh0TWF4ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1oZHItPmNiU3NFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKHNzZXh0LCAxLCBzeW1oZHItPmlzc0V4dE1heCwgYWJmZCkKLQkgICE9IChiZmRfc2l6ZV90eXBlKSBzeW1oZHItPmlzc0V4dE1heCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgcmVzdWx0ID0gZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzIChhYmZkLCBpbmZvLCBleHRlcm5hbF9leHQsIHNzZXh0KTsKLQotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICByZXR1cm4gcmVzdWx0OwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFkZCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBvZiBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGxpbmtlcgotICAgaGFzaCB0YWJsZS4gIFRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCBzdHJpbmdzIHdlIGFyZSBwYXNzZWQgYXJlCi0gICBqdXN0IGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGFuZCB3aWxsIGJlIGRpc2NhcmRlZC4gIFdlIG11c3QKLSAgIGV4cGxpY2l0bHkgc2F2ZSBhbnkgaW5mb3JtYXRpb24gd2UgbWF5IG5lZWQgbGF0ZXIgb24gaW4gdGhlIGxpbmsuCi0gICBXZSBkbyBub3Qgd2FudCB0byByZWFkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gYWdhaW4uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzIChhYmZkLCBpbmZvLCBleHRlcm5hbF9leHQsIHNzZXh0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBQVFIgZXh0ZXJuYWxfZXh0OwotICAgICBjaGFyICpzc2V4dDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX2V4dF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRVhUUiAqKSkKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9leHRfaW47Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemUgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplOwotICB1bnNpZ25lZCBsb25nIGV4dF9jb3VudDsKLSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBjaGFyICpleHRfcHRyOwotICBjaGFyICpleHRfZW5kOwotCi0gIGV4dF9jb3VudCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4OwotCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSBleHRfY291bnQgKiBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopKSk7Ci0gIGlmICghc3ltX2hhc2gpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlcyA9IHN5bV9oYXNoOwotCi0gIGV4dF9wdHIgPSAoY2hhciAqKSBleHRlcm5hbF9leHQ7Ci0gIGV4dF9lbmQgPSBleHRfcHRyICsgZXh0X2NvdW50ICogZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIGZvciAoOyBleHRfcHRyIDwgZXh0X2VuZDsgZXh0X3B0ciArPSBleHRlcm5hbF9leHRfc2l6ZSwgc3ltX2hhc2grKykKLSAgICB7Ci0gICAgICBFWFRSIGVzeW07Ci0gICAgICBib29sZWFuIHNraXA7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgKnN5bV9oYXNoID0gTlVMTDsKLQotICAgICAgKCpzd2FwX2V4dF9pbikgKGFiZmQsIChQVFIpIGV4dF9wdHIsICZlc3ltKTsKLQotICAgICAgLyogU2tpcCBkZWJ1Z2dpbmcgc3ltYm9scy4gICovCi0gICAgICBza2lwID0gZmFsc2U7Ci0gICAgICBzd2l0Y2ggKGVzeW0uYXN5bS5zdCkKLQl7Ci0JY2FzZSBzdEdsb2JhbDoKLQljYXNlIHN0U3RhdGljOgotCWNhc2Ugc3RMYWJlbDoKLQljYXNlIHN0UHJvYzoKLQljYXNlIHN0U3RhdGljUHJvYzoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBza2lwID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHNraXApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIHZhbHVlID0gZXN5bS5hc3ltLnZhbHVlOwotICAgICAgc3dpdGNoIChlc3ltLmFzeW0uc2MpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBzY05pbDoKLQljYXNlIHNjUmVnaXN0ZXI6Ci0JY2FzZSBzY0NkYkxvY2FsOgotCWNhc2Ugc2NCaXRzOgotCWNhc2Ugc2NDZGJTeXN0ZW06Ci0JY2FzZSBzY1JlZ0ltYWdlOgotCWNhc2Ugc2NJbmZvOgotCWNhc2Ugc2NVc2VyU3RydWN0OgotCWNhc2Ugc2NWYXI6Ci0JY2FzZSBzY1ZhclJlZ2lzdGVyOgotCWNhc2Ugc2NWYXJpYW50OgotCWNhc2Ugc2NCYXNlZFZhcjoKLQljYXNlIHNjWERhdGE6Ci0JY2FzZSBzY1BEYXRhOgotCSAgc2VjdGlvbiA9IE5VTEw7Ci0JICBicmVhazsKLQljYXNlIHNjVGV4dDoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIudGV4dCIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0RhdGE6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmRhdGEiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NCc3M6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmJzcyIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0FiczoKLQkgIHNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1VuZGVmaW5lZDoKLQkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1NEYXRhOgotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zZGF0YSIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1NCc3M6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNic3MiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NSRGF0YToKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmRhdGEiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NDb21tb246Ci0JICBpZiAodmFsdWUgPiBlY29mZl9kYXRhIChhYmZkKS0+Z3Bfc2l6ZSkKLQkgICAgewotCSAgICAgIHNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2Ugc2NTQ29tbW9uOgotCSAgaWYgKGVjb2ZmX3Njb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPSBTQ09NTU9OOwotCSAgICAgIGVjb2ZmX3Njb21fc2VjdGlvbi5mbGFncyA9IFNFQ19JU19DT01NT047Ci0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgICAgICBlY29mZl9zY29tX3NlY3Rpb24uc3ltYm9sID0gJmVjb2ZmX3Njb21fc3ltYm9sOwotCSAgICAgIGVjb2ZmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZlY29mZl9zY29tX3N5bWJvbF9wdHI7Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2wubmFtZSA9IFNDT01NT047Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZlY29mZl9zY29tX3NlY3Rpb247Ci0JICAgICAgZWNvZmZfc2NvbV9zeW1ib2xfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sOwotCSAgICB9Ci0JICBzZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgIGJyZWFrOwotCWNhc2Ugc2NTVW5kZWZpbmVkOgotCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIHNjSW5pdDoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuaW5pdCIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0Zpbmk6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmZpbmkiKTsKLQkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCWNhc2Ugc2NSQ29uc3Q6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnJjb25zdCIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgbmFtZSA9IHNzZXh0ICsgZXN5bS5hc3ltLmlzczsKLQotICAgICAgaCA9IE5VTEw7Ci0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBhYmZkLCBuYW1lLAotCSAgICAgIGVzeW0ud2Vha2V4dCA/IEJTRl9XRUFLIDogQlNGX0dMT0JBTCwKLQkgICAgICBzZWN0aW9uLCB2YWx1ZSwgKGNvbnN0IGNoYXIgKikgTlVMTCwgdHJ1ZSwgdHJ1ZSwKLQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAqc3ltX2hhc2ggPSBoOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgYnVpbGRpbmcgYW4gRUNPRkYgaGFzaCB0YWJsZSwgc2F2ZSB0aGUgZXh0ZXJuYWwKLQkgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF9nZXRfZmxhdm91ciAoYWJmZCkpCi0JewotCSAgaWYgKGgtPmFiZmQgPT0gKGJmZCAqKSBOVUxMCi0JICAgICAgfHwgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKQotCQkgICYmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikKLQkJICAgICAgfHwgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpKSkKLQkgICAgewotCSAgICAgIGgtPmFiZmQgPSBhYmZkOwotCSAgICAgIGgtPmVzeW0gPSBlc3ltOwotCSAgICB9Ci0KLQkgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhpcyBzeW1ib2wgd2FzIHNtYWxsIHVuZGVmaW5lZC4gICovCi0JICBpZiAoZXN5bS5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLQkgICAgaC0+c21hbGwgPSAxOwotCi0JICAvKiBJZiB0aGlzIHN5bWJvbCB3YXMgZXZlciBzbWFsbCB1bmRlZmluZWQsIGl0IG5lZWRzIHRvIHdpbmQKLQkgICAgIHVwIGluIGEgR1AgcmVsYXRpdmUgc2VjdGlvbi4gIFdlIGNhbid0IGNvbnRyb2wgdGhlCi0JICAgICBzZWN0aW9uIG9mIGEgZGVmaW5lZCBzeW1ib2wsIGJ1dCB3ZSBjYW4gY29udHJvbCB0aGUKLQkgICAgIHNlY3Rpb24gb2YgYSBjb21tb24gc3ltYm9sLiAgVGhpcyBjYXNlIGlzIGFjdHVhbGx5IG5lZWRlZAotCSAgICAgb24gVWx0cml4IDQuMiB0byBoYW5kbGUgdGhlIHN5bWJvbCBjcmVkIGluIC1sY2tyYi4gICovCi0JICBpZiAoaC0+c21hbGwKLQkgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm5hbWUsIFNDT01NT04pICE9IDApCi0JICAgIHsKLQkgICAgICBoLT5yb290LnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLAotCQkJCQkJCQkgU0NPTU1PTik7Ci0JICAgICAgaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NTQ29tbW9uOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVDT0ZGIGZpbmFsIGxpbmsgcm91dGluZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUKLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBQVFIgaGFuZGxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gZWNvZmZfbGlua193cml0ZV9leHRlcm5hbC4gICovCi0KLXN0cnVjdCBleHRzeW1faW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotfTsKLQotLyogRUNPRkYgZmluYWwgbGluayByb3V0aW5lLiAgVGhpcyBsb29rcyB0aHJvdWdoIGFsbCB0aGUgaW5wdXQgQkZEcwotICAgYW5kIGdhdGhlcnMgdG9nZXRoZXIgYWxsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGFuZCB0aGVuCi0gICBwcm9jZXNzZXMgYWxsIHRoZSBsaW5rIG9yZGVyIGluZm9ybWF0aW9uLiAgVGhpcyBtYXkgY2F1c2UgaXQgdG8KLSAgIGNsb3NlIGFuZCByZW9wZW4gc29tZSBpbnB1dCBCRkRzOyBJJ2xsIHNlZSBob3cgYmFkIHRoaXMgaXMuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvOwotICBIRFJSICpzeW1oZHI7Ci0gIFBUUiBoYW5kbGU7Ci0gIHJlZ2lzdGVyIGJmZCAqaW5wdXRfYmZkOwotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBzdHJ1Y3QgZXh0c3ltX2luZm8gZWluZm87Ci0KLSAgLyogV2UgYWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGNvdW50cyBpbiB0aGUgc3ltYm9saWMKLSAgICAgaGVhZGVyLiAgKi8KLSAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIHN5bWhkci0+dnN0YW1wID0gMDsKLSAgc3ltaGRyLT5pbGluZU1heCA9IDA7Ci0gIHN5bWhkci0+Y2JMaW5lID0gMDsKLSAgc3ltaGRyLT5pZG5NYXggPSAwOwotICBzeW1oZHItPmlwZE1heCA9IDA7Ci0gIHN5bWhkci0+aXN5bU1heCA9IDA7Ci0gIHN5bWhkci0+aW9wdE1heCA9IDA7Ci0gIHN5bWhkci0+aWF1eE1heCA9IDA7Ci0gIHN5bWhkci0+aXNzTWF4ID0gMDsKLSAgc3ltaGRyLT5pc3NFeHRNYXggPSAwOwotICBzeW1oZHItPmlmZE1heCA9IDA7Ci0gIHN5bWhkci0+Y3JmZCA9IDA7Ci0gIHN5bWhkci0+aWV4dE1heCA9IDA7Ci0KLSAgLyogV2UgYWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGl0c2VsZiBpbiB0aGUgZGVidWdfaW5mbwotICAgICBzdHJ1Y3R1cmUuICAqLwotICBkZWJ1Zy0+bGluZSA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9kbnIgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfcGRyID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX3N5bSA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9vcHQgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLSAgZGVidWctPnNzID0gTlVMTDsKLSAgZGVidWctPnNzZXh0ID0gZGVidWctPnNzZXh0X2VuZCA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9mZHIgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfcmZkID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX2V4dCA9IGRlYnVnLT5leHRlcm5hbF9leHRfZW5kID0gTlVMTDsKLQotICBoYW5kbGUgPSBiZmRfZWNvZmZfZGVidWdfaW5pdCAoYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLCBpbmZvKTsKLSAgaWYgKGhhbmRsZSA9PSAoUFRSKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgc3ltYm9scyBmcm9tIGVhY2ggaW5wdXQgQkZELiAgKi8KLSAgZm9yIChpbnB1dF9iZmQgPSBpbmZvLT5pbnB1dF9iZmRzOwotICAgICAgIGlucHV0X2JmZCAhPSAoYmZkICopIE5VTEw7Ci0gICAgICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCi0gICAgewotICAgICAgYm9vbGVhbiByZXQ7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGlucHV0X2JmZCkgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQotCXsKLQkgIC8qIEFiaXRyYXJpbHkgc2V0IHRoZSBzeW1ib2xpYyBoZWFkZXIgdnN0YW1wIHRvIHRoZSB2c3RhbXAKLQkgICAgIG9mIHRoZSBmaXJzdCBvYmplY3QgZmlsZSBpbiB0aGUgbGluay4gICovCi0JICBpZiAoc3ltaGRyLT52c3RhbXAgPT0gMCkKLQkgICAgc3ltaGRyLT52c3RhbXAKLQkgICAgICA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLnZzdGFtcDsKLQkgIHJldCA9IGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSAoYWJmZCwgaW5wdXRfYmZkLCBpbmZvLAotCQkJCQkJICAgaGFuZGxlKTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0ID0gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIgKGhhbmRsZSwgYWJmZCwKLQkJCQkJCWRlYnVnLCAmYmFja2VuZC0+ZGVidWdfc3dhcCwKLQkJCQkJCWlucHV0X2JmZCwgaW5mbyk7Ci0gICAgICBpZiAoISByZXQpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBDb21iaW5lIHRoZSByZWdpc3RlciBtYXNrcy4gICovCi0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+Z3BybWFzayB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncHJtYXNrOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmZwcm1hc2sgfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZnBybWFzazsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrWzBdIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNwcm1hc2tbMF07Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+Y3BybWFza1sxXSB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5jcHJtYXNrWzFdOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmNwcm1hc2tbMl0gfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3BybWFza1syXTsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrWzNdIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNwcm1hc2tbM107Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gIGVpbmZvLmFiZmQgPSBhYmZkOwotICBlaW5mby5pbmZvID0gaW5mbzsKLSAgZWNvZmZfbGlua19oYXNoX3RyYXZlcnNlIChlY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsLAotCQkJICAgIChQVFIpICZlaW5mbyk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIG1ha2UgYSBwYXNzIG92ZXIgdGhlIGxpbmtfb3JkZXJzIHRvIGNvdW50IHVwIHRoZQotCSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgd2Ugd2lsbCBuZWVkIHRvIG91dHB1dCwgc28gdGhhdCB3ZSBrbm93Ci0JIGhvdyBtdWNoIHNwYWNlIHRoZXkgd2lsbCB0YWtlIHVwLiAgKi8KLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBvLT5yZWxvY19jb3VudCA9IDA7Ci0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JICAgICAgby0+cmVsb2NfY291bnQgKz0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5yZWxvY19jb3VudDsKLQkgICAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgICAgKytvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgfQotCi0gIC8qIENvbXB1dGUgdGhlIHJlbG9jIGFuZCBzeW1ib2wgZmlsZSBwb3NpdGlvbnMuICAqLwotICBlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zIChhYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAoaGFuZGxlLCBhYmZkLCBkZWJ1ZywKLQkJCQkJICAgJmJhY2tlbmQtPmRlYnVnX3N3YXAsIGluZm8sCi0JCQkJCSAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9lY29mZl9kZWJ1Z19mcmVlIChoYW5kbGUsIGFiZmQsIGRlYnVnLCAmYmFja2VuZC0+ZGVidWdfc3dhcCwgaW5mbyk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBOb3cgcmVzZXQgdGhlIHJlbG9jX2NvdW50IGZpZWxkIG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0Ci0JIEJGRCB0byAwLCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55Ci0JIHJlbG9jcyB3ZSBoYXZlIG91dHB1dCB0aHVzIGZhci4gICovCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0Jby0+cmVsb2NfY291bnQgPSAwOwotICAgIH0KLQotICAvKiBHZXQgYSB2YWx1ZSBmb3IgdGhlIEdQIHJlZ2lzdGVyLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfZ3AiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCWVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9IChoLT51LmRlZi52YWx1ZQotCQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICBiZmRfdm1hIGxvOwotCi0JICAvKiBNYWtlIHVwIGEgdmFsdWUuICAqLwotCSAgbG8gPSAoYmZkX3ZtYSkgLTE7Ci0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoby0+dm1hIDwgbG8KLQkJICAmJiAoc3RyY21wIChvLT5uYW1lLCBfU0JTUykgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsIF9TREFUQSkgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsIF9MSVQ0KSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoby0+bmFtZSwgX0xJVDgpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChvLT5uYW1lLCBfTElUQSkgPT0gMCkpCi0JCWxvID0gby0+dm1hOwotCSAgICB9Ci0JICBlY29mZl9kYXRhIChhYmZkKS0+Z3AgPSBsbyArIDB4ODAwMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSWYgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24gbmVlZHMgdG8gZG8gYSByZWxvYwotCSAgICAgaW52b2x2aW5nIHRoZSBHUCB2YWx1ZSwgaXQgc2hvdWxkIG1ha2UgYSByZWxvY19kYW5nZXJvdXMKLQkgICAgIGNhbGxiYWNrIHRvIHdhcm4gdGhhdCBHUCBpcyBub3QgZGVmaW5lZC4gICovCi0JfQotICAgIH0KLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgIHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAocC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcikKLQkJICA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZWNvZmZfaW5kaXJlY3RfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZWNvZmZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gc3ltaGRyLT5pZXh0TWF4ICsgc3ltaGRyLT5pc3ltTWF4OwotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5saW5rZXIgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGFuIGlucHV0IEJGRCBpbnRvIHRoZQotICAgb3V0cHV0IEJGRC4gIFRoaXMgbXVzdCByZWFkIGluIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBvZiB0aGUKLSAgIGlucHV0IEJGRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUgKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgaW5mbywgaGFuZGxlKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgUFRSIGhhbmRsZTsKLXsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1ZyA9ICZlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IHN3YXAgPQotICAgICZlY29mZl9iYWNrZW5kIChpbnB1dF9iZmQpLT5kZWJ1Z19zd2FwOwotICBIRFJSICpzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgYm9vbGVhbiByZXQ7Ci0KLSNkZWZpbmUgUkVBRChwdHIsIG9mZnNldCwgY291bnQsIHNpemUsIHR5cGUpCQkJCVwKLSAgaWYgKHN5bWhkci0+Y291bnQgPT0gMCkJCQkJCQlcCi0gICAgZGVidWctPnB0ciA9IE5VTEw7CQkJCQkJCVwKLSAgZWxzZQkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZGVidWctPnB0ciA9ICh0eXBlKSBiZmRfbWFsbG9jICgoc2l6ZV90KSAoc2l6ZSAqIHN5bWhkci0+Y291bnQpKTsJXAotICAgICAgaWYgKGRlYnVnLT5wdHIgPT0gTlVMTCkJCQkJCQlcCi0JewkJCQkJCQkJXAotICAgICAgICAgIHJldCA9IGZhbHNlOwkJCQkJCQlcCi0gICAgICAgICAgZ290byByZXR1cm5fc29tZXRoaW5nOwkJCQkJXAotCX0JCQkJCQkJCVwKLSAgICAgIGlmICgoYmZkX3NlZWsgKGlucHV0X2JmZCwgKGZpbGVfcHRyKSBzeW1oZHItPm9mZnNldCwgU0VFS19TRVQpCVwKLQkgICAhPSAwKQkJCQkJCQlcCi0JICB8fCAoYmZkX3JlYWQgKGRlYnVnLT5wdHIsIHNpemUsIHN5bWhkci0+Y291bnQsCQlcCi0JCQlpbnB1dF9iZmQpICE9IHNpemUgKiBzeW1oZHItPmNvdW50KSkJCVwKLQl7CQkJCQkJCQlcCi0gICAgICAgICAgcmV0ID0gZmFsc2U7CQkJCQkJCVwKLSAgICAgICAgICBnb3RvIHJldHVybl9zb21ldGhpbmc7CQkJCQlcCi0JfQkJCQkJCQkJXAotICAgIH0KLQotICAvKiBJZiByYXdfc3ltZW50cyBpcyBub3QgTlVMTCwgdGhlbiB0aGUgZGF0YSB3YXMgYWxyZWFkeSBieSByZWFkIGJ5Ci0gICAgIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mby4gICovCi0gIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5yYXdfc3ltZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgIFJFQUQgKGxpbmUsIGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpLAotCSAgICB1bnNpZ25lZCBjaGFyICopOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfZG5yLCBjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfcGRyLCBjYlBkT2Zmc2V0LCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfc3ltLCBjYlN5bU9mZnNldCwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUsIFBUUik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgUFRSKTsKLSAgICAgIFJFQUQgKGV4dGVybmFsX2F1eCwgY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCksCi0JICAgIHVuaW9uIGF1eF9leHQgKik7Ci0gICAgICBSRUFEIChzcywgY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfZmRyLCBjYkZkT2Zmc2V0LCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfcmZkLCBjYlJmZE9mZnNldCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUsIFBUUik7Ci0gICAgfQotI3VuZGVmIFJFQUQKLQotICAvKiBXZSBkbyBub3QgcmVhZCB0aGUgZXh0ZXJuYWwgc3RyaW5ncyBvciB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0KLSAgcmV0ID0gKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCi0JIChoYW5kbGUsIG91dHB1dF9iZmQsICZlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+ZGVidWdfaW5mbywKLQkgICZlY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+ZGVidWdfc3dhcCwKLQkgIGlucHV0X2JmZCwgZGVidWcsIHN3YXAsIGluZm8pKTsKLQotIHJldHVybl9zb21ldGhpbmc6Ci0gIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5yYXdfc3ltZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+bGluZSAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5saW5lKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX2Rucik7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX3BkciAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9wZHIpOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9zeW0gIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0ICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX29wdCk7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX2F1eCAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9hdXgpOwotICAgICAgaWYgKGRlYnVnLT5zcyAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5zcyk7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX2ZkciAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9mZHIpOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkKTsKLQotICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGFjY2lkZW50YWxseSBmb2xsb3cgb25lIG9mIHRoZXNlIHBvaW50ZXJzCi0JIGludG8gZnJlZWQgbWVtb3J5LiAgKi8KLSAgICAgIGRlYnVnLT5saW5lID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9kbnIgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX3BkciA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfc3ltID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9vcHQgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX2F1eCA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+c3MgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfcmZkID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUHV0IG91dCBpbmZvcm1hdGlvbiBmb3IgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgVGhlc2UgY29tZSBvbmx5IGZyb20KLSAgIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZXh0c3ltX2luZm8gKmVpbmZvID0gKHN0cnVjdCBleHRzeW1faW5mbyAqKSBkYXRhOwotICBiZmQgKm91dHB1dF9iZmQgPSBlaW5mby0+YWJmZDsKLSAgYm9vbGVhbiBzdHJpcDsKLQotICAvKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgc3ltYm9sIGlzIGJlaW5nIHN0cmlwcGVkLiAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0gICAgc3RyaXAgPSBmYWxzZTsKLSAgZWxzZSBpZiAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgIHx8IChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGVpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0JCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZQotICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgaWYgKHN0cmlwIHx8IGgtPndyaXR0ZW4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGgtPmFiZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGgtPmVzeW0uam1wdGJsID0gMDsKLSAgICAgIGgtPmVzeW0uY29ib2xfbWFpbiA9IDA7Ci0gICAgICBoLT5lc3ltLndlYWtleHQgPSAwOwotICAgICAgaC0+ZXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmlmZCA9IGlmZE5pbDsKLSAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdEdsb2JhbDsKLQotICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0gICAgICBlbHNlCi0JewotCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgb3V0cHV0X3NlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCSAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9zZWN0aW9uLT5vd25lciwgb3V0cHV0X3NlY3Rpb24pOwotCQotCSAgaWYgKHN0cmNtcCAobmFtZSwgX1RFWFQpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVGV4dDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1NEQVRBKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NEYXRhOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkRBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjUkRhdGE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9CU1MpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0JTUykgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfSU5JVCkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NJbml0OwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRklOSSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NGaW5pOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUERBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjUERhdGE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9YREFUQSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NYRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JDT05TVCkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NSQ29uc3Q7Ci0JICBlbHNlCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotCX0KLQotICAgICAgaC0+ZXN5bS5hc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotICAgIH0KLSAgZWxzZSBpZiAoaC0+ZXN5bS5pZmQgIT0gLTEpCi0gICAgewotICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIEZEUiBpbmRleCBmb3IgdGhlIHN5bWJvbCBieSB0aGF0IHVzZWQgZm9yIHRoZQotCSBpbnB1dCBCRkQuICAqLwotICAgICAgZGVidWcgPSAmZWNvZmZfZGF0YSAoaC0+YWJmZCktPmRlYnVnX2luZm87Ci0gICAgICBCRkRfQVNTRVJUIChoLT5lc3ltLmlmZCA+PSAwCi0JCSAgJiYgaC0+ZXN5bS5pZmQgPCBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlmZE1heCk7Ci0gICAgICBoLT5lc3ltLmlmZCA9IGRlYnVnLT5pZmRtYXBbaC0+ZXN5bS5pZmRdOwotICAgIH0KLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyAhPSBzY1VuZGVmaW5lZAotCSAgJiYgaC0+ZXN5bS5hc3ltLnNjICE9IHNjU1VuZGVmaW5lZCkKLQloLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY1VuZGVmaW5lZAotCSAgfHwgaC0+ZXN5bS5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVsc2UgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0JzczsKLSAgICAgIGVsc2UgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY1NDb21tb24pCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjICE9IHNjQ29tbW9uCi0JICAmJiBoLT5lc3ltLmFzeW0uc2MgIT0gc2NTQ29tbW9uKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjQ29tbW9uOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEZJWE1FOiBJZ25vcmUgdGhlc2UgZm9yIG5vdy4gIFRoZSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoCi0JIHRoZXkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0IGFyZSBub3QgY2xlYXIgdG8gbWUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgdXNlcyBpZXh0TWF4IHRvIGtlZXAgdHJhY2sgb2YgdGhlCi0gICAgIHN5bWJvbCBudW1iZXIuICAqLwotICBoLT5pbmR4ID0gZWNvZmZfZGF0YSAob3V0cHV0X2JmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXg7Ci0gIGgtPndyaXR0ZW4gPSAxOwotCi0gIHJldHVybiAoYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbAotCSAgKG91dHB1dF9iZmQsICZlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+ZGVidWdfaW5mbywKLQkgICAmZWNvZmZfYmFja2VuZCAob3V0cHV0X2JmZCktPmRlYnVnX3N3YXAsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JICAgJmgtPmVzeW0pKTsKLX0KLQotLyogUmVsb2NhdGUgYW5kIHdyaXRlIGFuIEVDT0ZGIHNlY3Rpb24gaW50byBhbiBFQ09GRiBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9pbmRpcmVjdF9saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZDsKLSAgc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY3Rpb25fdGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgcmF3X3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgY29va2VkX3NpemU7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY3Nfc2l6ZTsKLSAgUFRSIGV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0KLSAgQkZEX0FTU0VSVCAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApOwotCi0gIGlmIChsaW5rX29yZGVyLT5zaXplID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0gIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0KLSAgcmF3X3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0gIGNvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotICBpZiAoY29va2VkX3NpemUgPT0gMCkKLSAgICBjb29rZWRfc2l6ZSA9IHJhd19zaXplOwotCi0gIEJGRF9BU1NFUlQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IG91dHB1dF9zZWN0aW9uKTsKLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9PSBsaW5rX29yZGVyLT5vZmZzZXQpOwotICBCRkRfQVNTRVJUIChjb29rZWRfc2l6ZSA9PSBsaW5rX29yZGVyLT5zaXplKTsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICBXZSBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBsYXJnZXIgb2YKLSAgICAgdGhlIHNpemUgYmVmb3JlIHJlbG9jYXRpbmcgYW5kIHRoZSBzaXplIGFmdGVyIHJlbG9jYXRpbmcuICAqLwotICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChyYXdfc2l6ZSA+PSBjb29rZWRfc2l6ZQotCQkJCSAgICAgID8gKHNpemVfdCkgcmF3X3NpemUKLQkJCQkgICAgICA6IChzaXplX3QpIGNvb2tlZF9zaXplKTsKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwgJiYgcmF3X3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBJZiB3ZSBhcmUgcmVsYXhpbmcsIHRoZSBjb250ZW50cyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBpbnRvCi0gICAgIG1lbW9yeSwgaW4gd2hpY2ggY2FzZSB3ZSBjb3B5IHRoZW0gaW50byBvdXIgbmV3IGJ1ZmZlci4gIFdlIGRvbid0Ci0gICAgIHNpbXBseSByZXVzZSB0aGUgb2xkIGJ1ZmZlciBpbiBjYXNlIGNvb2tlZF9zaXplID4gcmF3X3NpemUuICAqLwotICBpZiAoc2VjdGlvbl90ZGF0YSAhPSAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgTlVMTAotICAgICAgJiYgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMgIT0gKGJmZF9ieXRlICopIE5VTEwpCi0gICAgbWVtY3B5IChjb250ZW50cywgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMsIChzaXplX3QpIHJhd19zaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIChQVFIpIGNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgcmF3X3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBHZXQgdGhlIHJlbG9jcy4gIElmIHdlIGFyZSByZWxheGluZyBNSVBTIGNvZGUsIHRoZXkgd2lsbCBhbHJlYWR5Ci0gICAgIGhhdmUgYmVlbiByZWFkIGluLiAgT3RoZXJ3aXNlLCB3ZSByZWFkIHRoZW0gaW4gbm93LiAgKi8KLSAgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKGlucHV0X2JmZCktPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGV4dGVybmFsX3JlbG9jc19zaXplID0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSAqIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIGlmIChzZWN0aW9uX3RkYXRhICE9IChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSBOVUxMCi0gICAgICAmJiBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBleHRlcm5hbF9yZWxvY3MgPSBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3M7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHRlcm5hbF9yZWxvY3MgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSk7Ci0gICAgICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgZXh0ZXJuYWxfcmVsb2NzX3NpemUgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIDEsIGV4dGVybmFsX3JlbG9jc19zaXplLCBpbnB1dF9iZmQpCi0JICAgICAgIT0gZXh0ZXJuYWxfcmVsb2NzX3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBSZWxvY2F0ZSB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmICghICgoKmVjb2ZmX2JhY2tlbmQgKGlucHV0X2JmZCktPnJlbG9jYXRlX3NlY3Rpb24pCi0JIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCSAgZXh0ZXJuYWxfcmVsb2NzKSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSByZWxvY2F0ZWQgc2VjdGlvbi4gICovCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwKLQkJCQkgIG91dHB1dF9zZWN0aW9uLAotCQkJCSAgKFBUUikgY29udGVudHMsCi0JCQkJICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgY29va2VkX3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlIHJlbG9jcyB3ZXJlCi0gICAgIG1vZGlmaWVkLCBhbmQgd2Ugd3JpdGUgdGhlbSBvdXQgbm93LiAgV2UgdXNlIHRoZSByZWxvY19jb3VudAotICAgICBmaWVsZCBvZiBvdXRwdXRfc2VjdGlvbiB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHdlCi0gICAgIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkgICAgKG91dHB1dF9zZWN0aW9uLT5yZWxfZmlsZXBvcyArCi0JCSAgICAgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZSksCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF93cml0ZSAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBleHRlcm5hbF9yZWxvY3Nfc2l6ZSwgb3V0cHV0X2JmZCkKLQkgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKz0gaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmIChjb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyAhPSBOVUxMICYmIHNlY3Rpb25fdGRhdGEgPT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoY29udGVudHMpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwgJiYgc2VjdGlvbl90ZGF0YSA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogR2VuZXJhdGUgYSByZWxvYyB3aGVuIGxpbmtpbmcgYW4gRUNPRkYgZmlsZS4gIFRoaXMgaXMgYSByZWxvYwotICAgcmVxdWVzdGVkIGJ5IHRoZSBsaW5rZXIsIGFuZCBkb2VzIGNvbWUgZnJvbSBhbnkgaW5wdXQgZmlsZS4gIFRoaXMKLSAgIGlzIHVzZWQgdG8gYnVpbGQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdGFibGVzIHdoZW4gbGlua2luZwotICAgd2l0aCAtVXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfcmVsb2NfbGlua19vcmRlciAob3V0cHV0X2JmZCwgaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICBlbnVtIGJmZF9saW5rX29yZGVyX3R5cGUgdHlwZTsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGJmZF92bWEgYWRkZW5kOwotICBhcmVsZW50IHJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jIGluOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGJmZF9ieXRlICpyYnVmOwotICBib29sZWFuIG9rOwotCi0gIHR5cGUgPSBsaW5rX29yZGVyLT50eXBlOwotICBzZWN0aW9uID0gTlVMTDsKLSAgYWRkZW5kID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQ7Ci0KLSAgLyogV2Ugc2V0IHVwIGFuIGFyZWxlbnQgdG8gcGFzcyB0byB0aGUgYmFja2VuZCBhZGp1c3RfcmVsb2Nfb3V0Ci0gICAgIHJvdXRpbmUuICAqLwotICByZWwuYWRkcmVzcyA9IGxpbmtfb3JkZXItPm9mZnNldDsKLQotICByZWwuaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKG91dHB1dF9iZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MpOwotICBpZiAocmVsLmhvd3RvID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICh0eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uOwotICAgICAgcmVsLnN5bV9wdHJfcHRyID0gc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIFRyZWF0IGEgcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sIGFzIHRob3VnaCBpdCB3ZXJlCi0gICAgICAgICBhY3R1YWxseSBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLSAgICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAotCQkJCQlsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgdHlwZSA9IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXI7Ci0JICBzZWN0aW9uID0gaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JICAvKiBJdCBzZWVtcyB0aGF0IHdlIG91Z2h0IHRvIGFkZCB0aGUgc3ltYm9sIHZhbHVlIHRvIHRoZQotICAgICAgICAgICAgIGFkZGVuZCBoZXJlLCBidXQgaW4gcHJhY3RpY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZAotICAgICAgICAgICAgIGJlY2F1c2UgaXQgd2FzIHBhc3NlZCB0byBjb25zdHJ1Y3Rvcl9jYWxsYmFjay4gICovCi0JICBhZGRlbmQgKz0gc2VjdGlvbi0+dm1hICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgY2FuJ3Qgc2V0IHVwIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBjb3JyZWN0bHksCi0JICAgICBiZWNhdXNlIHdlIGhhdmUgbm8gYXN5bWJvbCBzdHJ1Y3R1cmUuICBDdXJyZW50bHkgbm8KLQkgICAgIGFkanVzdF9yZWxvY19vdXQgcm91dGluZSBjYXJlcy4gICovCi0JICByZWwuc3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIEFsbCBFQ09GRiByZWxvY3MgYXJlIGluLXBsYWNlLiAgUHV0IHRoZSBhZGRlbmQgaW50byB0aGUgb2JqZWN0Ci0gICAgIGZpbGUuICAqLwotCi0gIEJGRF9BU1NFUlQgKHJlbC5ob3d0by0+cGFydGlhbF9pbnBsYWNlKTsKLSAgaWYgKGFkZGVuZCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBib29sZWFuIG9rOwotCi0gICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWwuaG93dG8pOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChidWYgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChyZWwuaG93dG8sIG91dHB1dF9iZmQsIGFkZGVuZCwgYnVmKTsKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sCi0JCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHNlY3Rpb24pCi0JCSAgIDogbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUpLAotCQkgIHJlbC5ob3d0by0+bmFtZSwgYWRkZW5kLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLCAoUFRSKSBidWYsCi0JCQkJICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwgc2l6ZSk7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgaWYgKCEgb2spCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZWwuYWRkZW5kID0gMDsKLQotICAvKiBNb3ZlIHRoZSBpbmZvcm1hdGlvbiBpbnRvIGEgaW50ZXJuYWxfcmVsb2Mgc3RydWN0dXJlLiAgKi8KLSAgaW4ucl92YWRkciA9IChyZWwuYWRkcmVzcwotCQkrIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKSk7Ci0gIGluLnJfdHlwZSA9IHJlbC5ob3d0by0+dHlwZTsKLQotICBpZiAodHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9ICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgaC0+aW5keCAhPSAtMSkKLQlpbi5yX3N5bW5keCA9IGgtPmluZHg7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgKGluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGluLnJfc3ltbmR4ID0gMDsKLQl9Ci0gICAgICBpbi5yX2V4dGVybiA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQ09OU1QgY2hhciAqbmFtZTsKLQotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLCBzZWN0aW9uKTsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SREFUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fREFUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUODsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUNDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi54ZGF0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1hEQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBkYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUERBVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0ZJTkk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqQUJTKiIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yY29uc3QiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SQ09OU1Q7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0gICAgICBpbi5yX2V4dGVybiA9IDA7Ci0gICAgfQotCi0gIC8qIExldCB0aGUgQkZEIGJhY2tlbmQgYWRqdXN0IHRoZSByZWxvYy4gICovCi0gICgqZWNvZmZfYmFja2VuZCAob3V0cHV0X2JmZCktPmFkanVzdF9yZWxvY19vdXQpIChvdXRwdXRfYmZkLCAmcmVsLCAmaW4pOwotCi0gIC8qIEdldCBzb21lIG1lbW9yeSBhbmQgc3dhcCBvdXQgdGhlIHJlbG9jLiAgKi8KLSAgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKG91dHB1dF9iZmQpLT5leHRlcm5hbF9yZWxvY19zaXplOwotICByYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIGV4dGVybmFsX3JlbG9jX3NpemUpOwotICBpZiAocmJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKCplY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+c3dhcF9yZWxvY19vdXQpIChvdXRwdXRfYmZkLCAmaW4sIChQVFIpIHJidWYpOwotCi0gIG9rID0gKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkgIChvdXRwdXRfc2VjdGlvbi0+cmVsX2ZpbGVwb3MgKwotCQkgICBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplKSwKLQkJICBTRUVLX1NFVCkgPT0gMAotCSYmIChiZmRfd3JpdGUgKChQVFIpIHJidWYsIDEsIGV4dGVybmFsX3JlbG9jX3NpemUsIG91dHB1dF9iZmQpCi0JICAgID09IGV4dGVybmFsX3JlbG9jX3NpemUpKTsKLQotICBpZiAob2spCi0gICAgKytvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgZnJlZSAocmJ1Zik7Ci0KLSAgcmV0dXJuIG9rOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2Vjb2ZmbGluay5jIGIvYmZkL2Vjb2ZmbGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWZjOTY2Li4wMDAwMDAwCi0tLSBhL2JmZC9lY29mZmxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OTkgKzAsMCBAQAotLyogUm91dGluZXMgdG8gbGluayBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAib2JqYWxsb2MuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0jaW5jbHVkZSAibGliZWNvZmYuaCIKLQwKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2FkZF9ieXRlcyBQQVJBTVMgKChjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCQkJCQlzaXplX3QgbmVlZCkpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3RyaW5nX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9hbGlnbl9kZWJ1ZyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJICAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXApKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX3dyaXRlX3N5bWhkciBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiwKLQkJCQkJICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiwKLQkJCQkJICAgZmlsZV9wdHIgd2hlcmUpKTsKLXN0YXRpYyBpbnQgY21wX2ZkcnRhYl9lbnRyeSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIGJvb2xlYW4gbWtfZmRydGFiIFBBUkFNUyAoKGJmZCAqLAotCQkJCSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCwKLQkJCQkgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QsCi0JCQkJICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICopKTsKLXN0YXRpYyBsb25nIGZkcnRhYl9sb29rdXAgUEFSQU1TICgoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBsb29rdXBfbGluZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCwKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0LCBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICopKTsKLQwKLS8qIFJvdXRpbmVzIHRvIHN3YXAgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGluIGFuZCBvdXQuICBJIGFtIGFzc3VtaW5nCi0gICB0aGF0IHRoZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24gZm9ybWF0IGlzIGFsd2F5cyBnb2luZyB0byBiZSB0YXJnZXQKLSAgIGluZGVwZW5kZW50LiAgKi8KLQotLyogU3dhcCBpbiBhIHR5cGUgaW5mb3JtYXRpb24gcmVjb3JkLgotICAgQklHRU5EIHNheXMgd2hldGhlciBBVVggc3ltYm9scyBhcmUgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuOyB0aGlzCi0gICBpbmZvIGNvbWVzIGZyb20gdGhlIGZpbGUgaGVhZGVyIHJlY29yZCAoZmgtZkJpZ2VuZGlhbikuICAqLwotCi12b2lkCi1fYmZkX2Vjb2ZmX3N3YXBfdGlyX2luIChiaWdlbmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGludCBiaWdlbmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCB0aXJfZXh0ICpleHRfY29weTsKLSAgICAgVElSICppbnRlcm47Ci17Ci0gIHN0cnVjdCB0aXJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKmV4dF9jb3B5OwkJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiaWdlbmQpIHsKLSAgICBpbnRlcm4tPmZCaXRmaWVsZCAgID0gMCAhPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0ZCSVRGSUVMRF9CSUcpOwotICAgIGludGVybi0+Y29udGludWVkICAgPSAwICE9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfQ09OVElOVUVEX0JJRyk7Ci0gICAgaW50ZXJuLT5idCAgICAgICAgICA9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfQlRfQklHKQotCQkJPj4JCSAgICBUSVJfQklUUzFfQlRfU0hfQklHOwotICAgIGludGVybi0+dHE0ICAgICAgICAgPSAoZXh0LT50X3RxNDVbMF0gJiBUSVJfQklUU19UUTRfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTRfU0hfQklHOwotICAgIGludGVybi0+dHE1ICAgICAgICAgPSAoZXh0LT50X3RxNDVbMF0gJiBUSVJfQklUU19UUTVfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTVfU0hfQklHOwotICAgIGludGVybi0+dHEwICAgICAgICAgPSAoZXh0LT50X3RxMDFbMF0gJiBUSVJfQklUU19UUTBfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTBfU0hfQklHOwotICAgIGludGVybi0+dHExICAgICAgICAgPSAoZXh0LT50X3RxMDFbMF0gJiBUSVJfQklUU19UUTFfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTFfU0hfQklHOwotICAgIGludGVybi0+dHEyICAgICAgICAgPSAoZXh0LT50X3RxMjNbMF0gJiBUSVJfQklUU19UUTJfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTJfU0hfQklHOwotICAgIGludGVybi0+dHEzICAgICAgICAgPSAoZXh0LT50X3RxMjNbMF0gJiBUSVJfQklUU19UUTNfQklHKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTNfU0hfQklHOwotICB9IGVsc2UgewotICAgIGludGVybi0+ZkJpdGZpZWxkICAgPSAwICE9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfRkJJVEZJRUxEX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5jb250aW51ZWQgICA9IDAgIT0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9DT05USU5VRURfTElUVExFKTsKLSAgICBpbnRlcm4tPmJ0ICAgICAgICAgID0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9CVF9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTMV9CVF9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTQgICAgICAgICA9IChleHQtPnRfdHE0NVswXSAmIFRJUl9CSVRTX1RRNF9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRNF9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTUgICAgICAgICA9IChleHQtPnRfdHE0NVswXSAmIFRJUl9CSVRTX1RRNV9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRNV9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTAgICAgICAgICA9IChleHQtPnRfdHEwMVswXSAmIFRJUl9CSVRTX1RRMF9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMF9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTEgICAgICAgICA9IChleHQtPnRfdHEwMVswXSAmIFRJUl9CSVRTX1RRMV9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMV9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTIgICAgICAgICA9IChleHQtPnRfdHEyM1swXSAmIFRJUl9CSVRTX1RRMl9MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRMl9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT50cTMgICAgICAgICA9IChleHQtPnRfdHEyM1swXSAmIFRJUl9CSVRTX1RRM19MSVRUTEUpCi0JCQk+PgkJICAgIFRJUl9CSVRTX1RRM19TSF9MSVRUTEU7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYSB0eXBlIGluZm9ybWF0aW9uIHJlY29yZC4KLSAgIEJJR0VORCBzYXlzIHdoZXRoZXIgQVVYIHN5bWJvbHMgYXJlIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbjsgdGhpcwotICAgaW5mbyBjb21lcyBmcm9tIHRoZSBmaWxlIGhlYWRlciByZWNvcmQgKGZoLWZCaWdlbmRpYW4pLiAgKi8KLQotdm9pZAotX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQgKGJpZ2VuZCwgaW50ZXJuX2NvcHksIGV4dCkKLSAgICAgaW50IGJpZ2VuZDsKLSAgICAgY29uc3QgVElSICppbnRlcm5fY29weTsKLSAgICAgc3RydWN0IHRpcl9leHQgKmV4dDsKLXsKLSAgVElSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJpZ2VuZCkgewotICAgIGV4dC0+dF9iaXRzMVswXSA9ICgoaW50ZXJuLT5mQml0ZmllbGQgPyBUSVJfQklUUzFfRkJJVEZJRUxEX0JJRyA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmNvbnRpbnVlZCA/IFRJUl9CSVRTMV9DT05USU5VRURfQklHIDogMCkKLQkJICAgICAgIHwgKChpbnRlcm4tPmJ0IDw8IFRJUl9CSVRTMV9CVF9TSF9CSUcpCi0JCQkgICYgVElSX0JJVFMxX0JUX0JJRykpOwotICAgIGV4dC0+dF90cTQ1WzBdID0gKCgoaW50ZXJuLT50cTQgPDwgVElSX0JJVFNfVFE0X1NIX0JJRykKLQkJICAgICAgICYgVElSX0JJVFNfVFE0X0JJRykKLQkJICAgICAgfCAoKGludGVybi0+dHE1IDw8IFRJUl9CSVRTX1RRNV9TSF9CSUcpCi0JCQkgJiBUSVJfQklUU19UUTVfQklHKSk7Ci0gICAgZXh0LT50X3RxMDFbMF0gPSAoKChpbnRlcm4tPnRxMCA8PCBUSVJfQklUU19UUTBfU0hfQklHKQotCQkgICAgICAgJiBUSVJfQklUU19UUTBfQklHKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTEgPDwgVElSX0JJVFNfVFExX1NIX0JJRykKLQkJCSAmIFRJUl9CSVRTX1RRMV9CSUcpKTsKLSAgICBleHQtPnRfdHEyM1swXSA9ICgoKGludGVybi0+dHEyIDw8IFRJUl9CSVRTX1RRMl9TSF9CSUcpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRMl9CSUcpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxMyA8PCBUSVJfQklUU19UUTNfU0hfQklHKQotCQkJICYgVElSX0JJVFNfVFEzX0JJRykpOwotICB9IGVsc2UgewotICAgIGV4dC0+dF9iaXRzMVswXSA9ICgoaW50ZXJuLT5mQml0ZmllbGQgPyBUSVJfQklUUzFfRkJJVEZJRUxEX0xJVFRMRSA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmNvbnRpbnVlZCA/IFRJUl9CSVRTMV9DT05USU5VRURfTElUVExFIDogMCkKLQkJICAgICAgIHwgKChpbnRlcm4tPmJ0IDw8IFRJUl9CSVRTMV9CVF9TSF9MSVRUTEUpCi0JCQkgICYgVElSX0JJVFMxX0JUX0xJVFRMRSkpOwotICAgIGV4dC0+dF90cTQ1WzBdID0gKCgoaW50ZXJuLT50cTQgPDwgVElSX0JJVFNfVFE0X1NIX0xJVFRMRSkKLQkJICAgICAgICYgVElSX0JJVFNfVFE0X0xJVFRMRSkKLQkJICAgICAgfCAoKGludGVybi0+dHE1IDw8IFRJUl9CSVRTX1RRNV9TSF9MSVRUTEUpCi0JCQkgJiBUSVJfQklUU19UUTVfTElUVExFKSk7Ci0gICAgZXh0LT50X3RxMDFbMF0gPSAoKChpbnRlcm4tPnRxMCA8PCBUSVJfQklUU19UUTBfU0hfTElUVExFKQotCQkgICAgICAgJiBUSVJfQklUU19UUTBfTElUVExFKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTEgPDwgVElSX0JJVFNfVFExX1NIX0xJVFRMRSkKLQkJCSAmIFRJUl9CSVRTX1RRMV9MSVRUTEUpKTsKLSAgICBleHQtPnRfdHEyM1swXSA9ICgoKGludGVybi0+dHEyIDw8IFRJUl9CSVRTX1RRMl9TSF9MSVRUTEUpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRMl9MSVRUTEUpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxMyA8PCBUSVJfQklUU19UUTNfU0hfTElUVExFKQotCQkJICYgVElSX0JJVFNfVFEzX0xJVFRMRSkpOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgaW4gYSByZWxhdGl2ZSBzeW1ib2wgcmVjb3JkLiAgQklHRU5EIHNheXMgd2hldGhlciBpdCBpcyBpbgotICAgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuIGZvcm1hdC4qLwotCi12b2lkCi1fYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmlnZW5kLCBleHRfY29weSwgaW50ZXJuKQotICAgICBpbnQgYmlnZW5kOwotICAgICBjb25zdCBzdHJ1Y3Qgcm5keF9leHQgKmV4dF9jb3B5OwotICAgICBSTkRYUiAqaW50ZXJuOwotewotICBzdHJ1Y3Qgcm5keF9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqZXh0X2NvcHk7CQkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJpZ2VuZCkgewotICAgIGludGVybi0+cmZkICAgPSAoZXh0LT5yX2JpdHNbMF0gPDwgUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9CSUcpCi0JCSAgfCAoKGV4dC0+cl9iaXRzWzFdICYgUk5EWF9CSVRTMV9SRkRfQklHKQotCQkgICAgCQkgICAgPj4gUk5EWF9CSVRTMV9SRkRfU0hfQklHKTsKLSAgICBpbnRlcm4tPmluZGV4ID0gKChleHQtPnJfYml0c1sxXSAmIFJORFhfQklUUzFfSU5ERVhfQklHKQotCQkgICAgCQkgICAgPDwgUk5EWF9CSVRTMV9JTkRFWF9TSF9MRUZUX0JJRykKLQkJICB8IChleHQtPnJfYml0c1syXSA8PCBSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHKQotCQkgIHwgKGV4dC0+cl9iaXRzWzNdIDw8IFJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9CSUcpOwotICB9IGVsc2UgewotICAgIGludGVybi0+cmZkICAgPSAoZXh0LT5yX2JpdHNbMF0gPDwgUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9MSVRUTEUpCi0JCSAgfCAoKGV4dC0+cl9iaXRzWzFdICYgUk5EWF9CSVRTMV9SRkRfTElUVExFKQotCQkgICAgCQkgICAgPDwgUk5EWF9CSVRTMV9SRkRfU0hfTEVGVF9MSVRUTEUpOwotICAgIGludGVybi0+aW5kZXggPSAoKGV4dC0+cl9iaXRzWzFdICYgUk5EWF9CSVRTMV9JTkRFWF9MSVRUTEUpCi0JCSAgICAJCSAgICA+PiBSTkRYX0JJVFMxX0lOREVYX1NIX0xJVFRMRSkKLQkJICB8IChleHQtPnJfYml0c1syXSA8PCBSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfTElUVExFKQotCQkgIHwgKCh1bnNpZ25lZCBpbnQpIGV4dC0+cl9iaXRzWzNdCi0JCSAgICAgPDwgUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRSk7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYSByZWxhdGl2ZSBzeW1ib2wgcmVjb3JkLiAgQklHRU5EIHNheXMgd2hldGhlciBpdCBpcyBpbgotICAgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuIGZvcm1hdC4qLwotCi12b2lkCi1fYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQgKGJpZ2VuZCwgaW50ZXJuX2NvcHksIGV4dCkKLSAgICAgaW50IGJpZ2VuZDsKLSAgICAgY29uc3QgUk5EWFIgKmludGVybl9jb3B5OwotICAgICBzdHJ1Y3Qgcm5keF9leHQgKmV4dDsKLXsKLSAgUk5EWFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmlnZW5kKSB7Ci0gICAgZXh0LT5yX2JpdHNbMF0gPSBpbnRlcm4tPnJmZCA+PiBSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0JJRzsKLSAgICBleHQtPnJfYml0c1sxXSA9ICgoKGludGVybi0+cmZkIDw8IFJORFhfQklUUzFfUkZEX1NIX0JJRykKLQkJICAgICAgICYgUk5EWF9CSVRTMV9SRkRfQklHKQotCQkgICAgICB8ICgoaW50ZXJuLT5pbmRleCA+PiBSTkRYX0JJVFMxX0lOREVYX1NIX0xFRlRfQklHKQotCQkJICYgUk5EWF9CSVRTMV9JTkRFWF9CSUcpKTsKLSAgICBleHQtPnJfYml0c1syXSA9IGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRzsKLSAgICBleHQtPnJfYml0c1szXSA9IGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRzsKLSAgfSBlbHNlIHsKLSAgICBleHQtPnJfYml0c1swXSA9IGludGVybi0+cmZkID4+IFJORFhfQklUUzBfUkZEX1NIX0xFRlRfTElUVExFOwotICAgIGV4dC0+cl9iaXRzWzFdID0gKCgoaW50ZXJuLT5yZmQgPj4gUk5EWF9CSVRTMV9SRkRfU0hfTEVGVF9MSVRUTEUpCi0JCSAgICAgICAmIFJORFhfQklUUzFfUkZEX0xJVFRMRSkKLQkJICAgICAgfCAoKGludGVybi0+aW5kZXggPDwgUk5EWF9CSVRTMV9JTkRFWF9TSF9MSVRUTEUpCi0JCQkgJiBSTkRYX0JJVFMxX0lOREVYX0xJVFRMRSkpOwotICAgIGV4dC0+cl9iaXRzWzJdID0gaW50ZXJuLT5pbmRleCA+PiBSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfTElUVExFOwotICAgIGV4dC0+cl9iaXRzWzNdID0gaW50ZXJuLT5pbmRleCA+PiBSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0MCi0vKiBUaGUgbWluaW11bSBhbW91bnQgb2YgZGF0YSB0byBhbGxvY2F0ZS4gICovCi0jZGVmaW5lIEFMTE9DX1NJWkUgKDQwNjQpCi0KLS8qIEFkZCBieXRlcyB0byBhIGJ1ZmZlci4gIFJldHVybiBzdWNjZXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIG5lZWQpCi0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHNpemVfdCBuZWVkOwotewotICBzaXplX3QgaGF2ZTsKLSAgc2l6ZV90IHdhbnQ7Ci0gIGNoYXIgKm5ld2J1ZjsKLQotICBoYXZlID0gKmJ1ZmVuZCAtICpidWY7Ci0gIGlmIChoYXZlID4gbmVlZCkKLSAgICB3YW50ID0gQUxMT0NfU0laRTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHdhbnQgPSBuZWVkIC0gaGF2ZTsKLSAgICAgIGlmICh3YW50IDwgQUxMT0NfU0laRSkKLQl3YW50ID0gQUxMT0NfU0laRTsKLSAgICB9Ci0gIG5ld2J1ZiA9IChjaGFyICopIGJmZF9yZWFsbG9jICgqYnVmLCBoYXZlICsgd2FudCk7Ci0gIGlmIChuZXdidWYgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpidWYgPSBuZXdidWY7Ci0gICpidWZlbmQgPSAqYnVmICsgaGF2ZSArIHdhbnQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBrZWVwIGEgaGFzaCB0YWJsZSB3aGljaCBtYXBzIHN0cmluZ3MgdG8gbnVtYmVycy4gIFdlIHVzZSBpdCB0bwotICAgbWFwIEZEUiBuYW1lcyB0byBpbmRpY2VzIGluIHRoZSBvdXRwdXQgZmlsZSwgYW5kIHRvIG1hcCBsb2NhbAotICAgc3RyaW5ncyB3aGVuIGNvbWJpbmluZyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIEZEUiBpbmRleCBvciBzdHJpbmcgdGFibGUgb2Zmc2V0LiAgKi8KLSAgbG9uZyB2YWw7Ci0gIC8qIE5leHQgZW50cnkgaW4gc3RyaW5nIHRhYmxlLiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpuZXh0OwotfTsKLQotc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSB0YWJsZTsKLX07Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGEgc3RyaW5nIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXN0cmluZ19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT52YWwgPSAtMTsKLSAgICAgIHJldC0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgc3RyaW5nX2hhc2hfbG9va3VwKHQsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0KS0+dGFibGUsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogV2UgY2FuJ3QgYWZmb3JkIHRvIHJlYWQgaW4gYWxsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2hlbiB3ZSBkbwotICAgYSBsaW5rLiAgSW5zdGVhZCwgd2UgYnVpbGQgYSBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgdG8gc2hvdyBob3cKLSAgIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgaW5wdXQgZmlsZSBtYXAgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RydWN0IHNodWZmbGUKLXsKLSAgLyogVGhlIG5leHQgZW50cnkgaW4gdGhpcyBsaW5rZWQgbGlzdC4gICovCi0gIHN0cnVjdCBzaHVmZmxlICpuZXh0OwotICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSBpbmZvcm1hdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLSAgLyogV2hldGhlciB0aGlzIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gYSBmaWxlIG9yIG5vdC4gICovCi0gIGJvb2xlYW4gZmlsZXA7Ci0gIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0Ci0JewotCSAgLyogVGhlIEJGRCB0aGUgZGF0YSBjb21lcyBmcm9tLiAgKi8KLQkgIGJmZCAqaW5wdXRfYmZkOwotCSAgLyogVGhlIG9mZnNldCB3aXRoaW4gaW5wdXRfYmZkLiAgKi8KLQkgIGZpbGVfcHRyIG9mZnNldDsKLQl9IGZpbGU7Ci0gICAgICAvKiBUaGUgZGF0YSB0byBiZSB3cml0dGVuIG91dC4gICovCi0gICAgICBQVFIgbWVtb3J5OwotICAgIH0gdTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGFjcm9zcyBjYWxscyB0bwotICAgYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUuICAqLwotCi1zdHJ1Y3QgYWNjdW11bGF0ZQotewotICAvKiBUaGUgRkRSIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUgZmRyX2hhc2g7Ci0gIC8qIFRoZSBzdHJpbmdzIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUgc3RyX2hhc2g7Ci0gIC8qIExpbmtlZCBsaXN0cyBkZXNjcmliaW5nIGhvdyB0byBzaHVmZmxlIHRoZSBpbnB1dCBkZWJ1ZwotICAgICBpbmZvcm1hdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGtlZXAgYSBwb2ludGVyIHRvIGJvdGggdGhlCi0gICAgIGhlYWQgYW5kIHRoZSB0YWlsLiAgKi8KLSAgc3RydWN0IHNodWZmbGUgKmxpbmU7Ci0gIHN0cnVjdCBzaHVmZmxlICpsaW5lX2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKnBkcjsKLSAgc3RydWN0IHNodWZmbGUgKnBkcl9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpzeW07Ci0gIHN0cnVjdCBzaHVmZmxlICpzeW1fZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqb3B0OwotICBzdHJ1Y3Qgc2h1ZmZsZSAqb3B0X2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKmF1eDsKLSAgc3RydWN0IHNodWZmbGUgKmF1eF9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpzczsKLSAgc3RydWN0IHNodWZmbGUgKnNzX2VuZDsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzc19oYXNoOwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNzX2hhc2hfZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqZmRyOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqZmRyX2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKnJmZDsKLSAgc3RydWN0IHNodWZmbGUgKnJmZF9lbmQ7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGZpbGUgc2h1ZmZsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGFyZ2VzdF9maWxlX3NodWZmbGU7Ci0gIC8qIEFuIG9iamFsbG9jIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3Qgb2JqYWxsb2MgKm1lbW9yeTsKLX07Ci0KLS8qIEFkZCBhIGZpbGUgZW50cnkgdG8gYSBzaHVmZmxlIGxpc3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBhZGRfZmlsZV9zaHVmZmxlIFBBUkFNUyAoKHN0cnVjdCBhY2N1bXVsYXRlICosCi0JCQkJICAgICAgc3RydWN0IHNodWZmbGUgKiosCi0JCQkJICAgICAgc3RydWN0IHNodWZmbGUgKiosIGJmZCAqLCBmaWxlX3B0ciwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1hZGRfZmlsZV9zaHVmZmxlIChhaW5mbywgaGVhZCwgdGFpbCwgaW5wdXRfYmZkLCBvZmZzZXQsIHNpemUpCi0gICAgIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbzsKLSAgICAgc3RydWN0IHNodWZmbGUgKipoZWFkOwotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKnRhaWw7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLXsKLSAgc3RydWN0IHNodWZmbGUgKm47Ci0KLSAgaWYgKCp0YWlsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMCi0gICAgICAmJiAoKnRhaWwpLT5maWxlcAotICAgICAgJiYgKCp0YWlsKS0+dS5maWxlLmlucHV0X2JmZCA9PSBpbnB1dF9iZmQKLSAgICAgICYmICgqdGFpbCktPnUuZmlsZS5vZmZzZXQgKyAoKnRhaWwpLT5zaXplID09ICh1bnNpZ25lZCBsb25nKSBvZmZzZXQpCi0gICAgewotICAgICAgLyogSnVzdCBtZXJnZSB0aGlzIGVudHJ5IG9udG8gdGhlIGV4aXN0aW5nIG9uZS4gICovCi0gICAgICAoKnRhaWwpLT5zaXplICs9IHNpemU7Ci0gICAgICBpZiAoKCp0YWlsKS0+c2l6ZSA+IGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSkKLQlhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgPSAoKnRhaWwpLT5zaXplOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIG4gPSAoc3RydWN0IHNodWZmbGUgKikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksCi0JCQkJCSBzaXplb2YgKHN0cnVjdCBzaHVmZmxlKSk7Ci0gIGlmICghbikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG4tPm5leHQgPSBOVUxMOwotICBuLT5zaXplID0gc2l6ZTsKLSAgbi0+ZmlsZXAgPSB0cnVlOwotICBuLT51LmZpbGUuaW5wdXRfYmZkID0gaW5wdXRfYmZkOwotICBuLT51LmZpbGUub2Zmc2V0ID0gb2Zmc2V0OwotICBpZiAoKmhlYWQgPT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpCi0gICAgKmhlYWQgPSBuOwotICBpZiAoKnRhaWwgIT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpCi0gICAgKCp0YWlsKS0+bmV4dCA9IG47Ci0gICp0YWlsID0gbjsKLSAgaWYgKHNpemUgPiBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUpCi0gICAgYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlID0gc2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIG1lbW9yeSBlbnRyeSB0byBhIHNodWZmbGUgbGlzdC4gICovCi0KLXN0YXRpYyBib29sZWFuIGFkZF9tZW1vcnlfc2h1ZmZsZSBQQVJBTVMgKChzdHJ1Y3QgYWNjdW11bGF0ZSAqLAotCQkJCQkgICBzdHJ1Y3Qgc2h1ZmZsZSAqKmhlYWQsCi0JCQkJCSAgIHN0cnVjdCBzaHVmZmxlICoqdGFpbCwKLQkJCQkJICAgYmZkX2J5dGUgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkpOwotCi1zdGF0aWMgYm9vbGVhbgotYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgaGVhZCwgdGFpbCwgZGF0YSwgc2l6ZSkKLSAgICAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvOwotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKmhlYWQ7Ci0gICAgIHN0cnVjdCBzaHVmZmxlICoqdGFpbDsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLXsKLSAgc3RydWN0IHNodWZmbGUgKm47Ci0gICAgIAotICBuID0gKHN0cnVjdCBzaHVmZmxlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LAotCQkJCQkgc2l6ZW9mIChzdHJ1Y3Qgc2h1ZmZsZSkpOwotICBpZiAoIW4pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBuLT5uZXh0ID0gTlVMTDsKLSAgbi0+c2l6ZSA9IHNpemU7Ci0gIG4tPmZpbGVwID0gZmFsc2U7Ci0gIG4tPnUubWVtb3J5ID0gKFBUUikgZGF0YTsKLSAgaWYgKCpoZWFkID09IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKQotICAgICpoZWFkID0gbjsKLSAgaWYgKCp0YWlsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKQotICAgICgqdGFpbCktPm5leHQgPSBuOwotICAqdGFpbCA9IG47Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbml0aWFsaXplIHRoZSBGRFIgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBhIGhhbmRsZSB3aGljaCBpcyB0aGVuCi0gICBwYXNzZWQgaW4gdG8gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUsIGV0LiBhbC4gICovCi0KLS8qQVJHU1VTRUQqLwotUFRSCi1iZmRfZWNvZmZfZGVidWdfaW5pdCAob3V0cHV0X2JmZCwgb3V0cHV0X2RlYnVnLCBvdXRwdXRfc3dhcCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvOwotCi0gIGFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGFjY3VtdWxhdGUpKTsKLSAgaWYgKCFhaW5mbykKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uICgmYWluZm8tPmZkcl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jLAotCQkJICAgICAgIDEwMjEpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGFpbmZvLT5saW5lID0gTlVMTDsKLSAgYWluZm8tPmxpbmVfZW5kID0gTlVMTDsKLSAgYWluZm8tPnBkciA9IE5VTEw7Ci0gIGFpbmZvLT5wZHJfZW5kID0gTlVMTDsKLSAgYWluZm8tPnN5bSA9IE5VTEw7Ci0gIGFpbmZvLT5zeW1fZW5kID0gTlVMTDsKLSAgYWluZm8tPm9wdCA9IE5VTEw7Ci0gIGFpbmZvLT5vcHRfZW5kID0gTlVMTDsKLSAgYWluZm8tPmF1eCA9IE5VTEw7Ci0gIGFpbmZvLT5hdXhfZW5kID0gTlVMTDsKLSAgYWluZm8tPnNzID0gTlVMTDsKLSAgYWluZm8tPnNzX2VuZCA9IE5VTEw7Ci0gIGFpbmZvLT5zc19oYXNoID0gTlVMTDsKLSAgYWluZm8tPnNzX2hhc2hfZW5kID0gTlVMTDsKLSAgYWluZm8tPmZkciA9IE5VTEw7Ci0gIGFpbmZvLT5mZHJfZW5kID0gTlVMTDsKLSAgYWluZm8tPnJmZCA9IE5VTEw7Ci0gIGFpbmZvLT5yZmRfZW5kID0gTlVMTDsKLQotICBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgPSAwOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmYWluZm8tPnN0cl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgLyogVGhlIGZpcnN0IGVudHJ5IGluIHRoZSBzdHJpbmcgdGFibGUgaXMgdGhlIGVtcHR5IHN0cmluZy4gICovCi0gICAgICBvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NNYXggPSAxOwotICAgIH0KLQotICBhaW5mby0+bWVtb3J5ID0gb2JqYWxsb2NfY3JlYXRlICgpOwotICBpZiAoYWluZm8tPm1lbW9yeSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoUFRSKSBhaW5mbzsKLX0KLQotLyogRnJlZSB0aGUgYWNjdW11bGF0ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi12b2lkCi1iZmRfZWNvZmZfZGVidWdfZnJlZSAoaGFuZGxlLCBvdXRwdXRfYmZkLCBvdXRwdXRfZGVidWcsIG91dHB1dF9zd2FwLCBpbmZvKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0gIAotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYWluZm8tPmZkcl9oYXNoLnRhYmxlKTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmFpbmZvLT5zdHJfaGFzaC50YWJsZSk7Ci0KLSAgb2JqYWxsb2NfZnJlZSAoYWluZm8tPm1lbW9yeSk7Ci0KLSAgZnJlZSAoYWluZm8pOwotfQotCi0vKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBJTlBVVF9CRkQgaW50bwotICAgT1VUUFVUX0JGRC4gIFRoZSBJTlBVVF9ERUJVRyBhcmd1bWVudCBwb2ludHMgdG8gc29tZSBFQ09GRgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWNoIHdlIHdhbnQgdG8gbGluayBpbnRvIHRoZSBpbmZvcm1hdGlvbgotICAgcG9pbnRlZCB0byBieSB0aGUgT1VUUFVUX0RFQlVHIGFyZ3VtZW50LiAgT1VUUFVUX1NXQVAgYW5kCi0gICBJTlBVVF9TV0FQIHBvaW50IHRvIHRoZSBzd2FwcGluZyBpbmZvcm1hdGlvbiBuZWVkZWQuICBJTkZPIGlzIHRoZQotICAgbGlua2VyIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gIEhBTkRMRSBpcyByZXR1cm5lZCBieQotICAgYmZkX2Vjb2ZmX2RlYnVnX2luaXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlIChoYW5kbGUsIG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1Zywgb3V0cHV0X3N3YXAsCi0JCQkgICAgaW5wdXRfYmZkLCBpbnB1dF9kZWJ1ZywgaW5wdXRfc3dhcCwKLQkJCSAgICBpbmZvKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXA7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotICB2b2lkICgqIGNvbnN0IHN3YXBfc3ltX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKQotICAgID0gaW5wdXRfc3dhcC0+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+aWV4dE1heCArIDEpICogZXh0ZXJuYWxfZXh0X3NpemUpCi0JICA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVzeW0tPmFzeW0uaXNzID0gc3ltaGRyLT5pc3NFeHRNYXg7Ci0KLSAgKCpzd2FwX2V4dF9vdXQpIChhYmZkLCBlc3ltLAotCQkgICAoKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2V4dAotCQkgICAgKyBzeW1oZHItPmlleHRNYXggKiBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkpOwotCi0gICsrc3ltaGRyLT5pZXh0TWF4OwotCi0gIHN0cmNweSAoZGVidWctPnNzZXh0ICsgc3ltaGRyLT5pc3NFeHRNYXgsIG5hbWUpOwotICBzeW1oZHItPmlzc0V4dE1heCArPSBuYW1lbGVuICsgMTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWxpZ24gdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWVjb2ZmX2FsaWduX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci17Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgYmZkX3NpemVfdHlwZSBkZWJ1Z19hbGlnbiwgYXV4X2FsaWduLCByZmRfYWxpZ247Ci0gIHNpemVfdCBhZGQ7Ci0KLSAgLyogQWRqdXN0IHRoZSBjb3VudHMgc28gdGhhdCBzdHJ1Y3R1cmVzIGFyZSBhbGlnbmVkLiAgKi8KLSAgZGVidWdfYWxpZ24gPSBzd2FwLT5kZWJ1Z19hbGlnbjsKLSAgYXV4X2FsaWduID0gZGVidWdfYWxpZ24gLyBzaXplb2YgKHVuaW9uIGF1eF9leHQpOwotICByZmRfYWxpZ24gPSBkZWJ1Z19hbGlnbiAvIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplOwotCi0gIGFkZCA9IGRlYnVnX2FsaWduIC0gKHN5bWhkci0+Y2JMaW5lICYgKGRlYnVnX2FsaWduIC0gMSkpOwotICBpZiAoYWRkICE9IGRlYnVnX2FsaWduKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+bGluZSAhPSAodW5zaWduZWQgY2hhciAqKSBOVUxMKQotCW1lbXNldCAoKFBUUikgKGRlYnVnLT5saW5lICsgc3ltaGRyLT5jYkxpbmUpLCAwLCBhZGQpOwotICAgICAgc3ltaGRyLT5jYkxpbmUgKz0gYWRkOwotICAgIH0KLQotICBhZGQgPSBkZWJ1Z19hbGlnbiAtIChzeW1oZHItPmlzc01heCAmIChkZWJ1Z19hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSBkZWJ1Z19hbGlnbikKLSAgICB7Ci0gICAgICBpZiAoZGVidWctPnNzICE9IChjaGFyICopIE5VTEwpCi0JbWVtc2V0ICgoUFRSKSAoZGVidWctPnNzICsgc3ltaGRyLT5pc3NNYXgpLCAwLCBhZGQpOwotICAgICAgc3ltaGRyLT5pc3NNYXggKz0gYWRkOwotICAgIH0KLQotICBhZGQgPSBkZWJ1Z19hbGlnbiAtIChzeW1oZHItPmlzc0V4dE1heCAmIChkZWJ1Z19hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSBkZWJ1Z19hbGlnbikKLSAgICB7Ci0gICAgICBpZiAoZGVidWctPnNzZXh0ICE9IChjaGFyICopIE5VTEwpCi0JbWVtc2V0ICgoUFRSKSAoZGVidWctPnNzZXh0ICsgc3ltaGRyLT5pc3NFeHRNYXgpLCAwLCBhZGQpOwotICAgICAgc3ltaGRyLT5pc3NFeHRNYXggKz0gYWRkOwotICAgIH0KLQotICBhZGQgPSBhdXhfYWxpZ24gLSAoc3ltaGRyLT5pYXV4TWF4ICYgKGF1eF9hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSBhdXhfYWxpZ24pCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9hdXggIT0gKHVuaW9uIGF1eF9leHQgKikgTlVMTCkKLQltZW1zZXQgKChQVFIpIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICsgc3ltaGRyLT5pYXV4TWF4KSwgMCwKLQkJYWRkICogc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSk7Ci0gICAgICBzeW1oZHItPmlhdXhNYXggKz0gYWRkOwotICAgIH0KLQotICBhZGQgPSByZmRfYWxpZ24gLSAoc3ltaGRyLT5jcmZkICYgKHJmZF9hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSByZmRfYWxpZ24pCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gKFBUUikgTlVMTCkKLQltZW1zZXQgKChQVFIpICgoY2hhciAqKSBkZWJ1Zy0+ZXh0ZXJuYWxfcmZkCi0JCSAgICAgICArIHN5bWhkci0+Y3JmZCAqIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplKSwKLQkJMCwgKHNpemVfdCkgKGFkZCAqIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplKSk7Ci0gICAgICBzeW1oZHItPmNyZmQgKz0gYWRkOwotICAgIH0KLX0KLQotLyogUmV0dXJuIHRoZSBzaXplIHJlcXVpcmVkIGJ5IHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1iZmRfc2l6ZV90eXBlCi1iZmRfZWNvZmZfZGVidWdfc2l6ZSAoYWJmZCwgZGVidWcsIHN3YXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLXsKLSAgYmZkX3NpemVfdHlwZSB0b3Q7Ci0KLSAgZWNvZmZfYWxpZ25fZGVidWcgKGFiZmQsIGRlYnVnLCBzd2FwKTsKLSAgdG90ID0gc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemU7Ci0KLSNkZWZpbmUgQUREKGNvdW50LCBzaXplKSBcCi0gIHRvdCArPSBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmNvdW50ICogc2l6ZQotCi0gIEFERCAoY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKLSAgQUREIChpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplKTsKLSAgQUREIChpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplKTsKLSAgQUREIChpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gIEFERCAoaW9wdE1heCwgc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUpOwotICBBREQgKGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICBBREQgKGlzc01heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIEFERCAoaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgQUREIChpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplKTsKLSAgQUREIChjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSk7Ci0gIEFERCAoaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpOwotCi0jdW5kZWYgQURECi0KLSAgcmV0dXJuIHRvdDsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBFQ09GRiBzeW1ib2xpYyBoZWFkZXIsIGdpdmVuIHRoZSBmaWxlIHBvc2l0aW9uIGl0IGlzCi0gICBnb2luZyB0byBiZSBwbGFjZWQgYXQuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgY291bnRzIGFyZSBzZXQKLSAgIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl93cml0ZV9zeW1oZHIgKGFiZmQsIGRlYnVnLCBzd2FwLCB3aGVyZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICAgICBmaWxlX3B0ciB3aGVyZTsKLXsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBjaGFyICpidWZmID0gTlVMTDsKLQotICBlY29mZl9hbGlnbl9kZWJ1ZyAoYWJmZCwgZGVidWcsIHN3YXApOwotCi0gIC8qIEdvIHRvIHRoZSByaWdodCBsb2NhdGlvbiBpbiB0aGUgZmlsZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgd2hlcmUsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICB3aGVyZSArPSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZTsKLQotICBzeW1oZHItPm1hZ2ljID0gc3dhcC0+c3ltX21hZ2ljOwotCi0gIC8qIEZpbGwgaW4gdGhlIGZpbGUgb2Zmc2V0cy4gICovCi0jZGVmaW5lIFNFVChvZmZzZXQsIGNvdW50LCBzaXplKSBcCi0gIGlmIChzeW1oZHItPmNvdW50ID09IDApIFwKLSAgICBzeW1oZHItPm9mZnNldCA9IDA7IFwKLSAgZWxzZSBcCi0gICAgeyBcCi0gICAgICBzeW1oZHItPm9mZnNldCA9IHdoZXJlOyBcCi0gICAgICB3aGVyZSArPSBzeW1oZHItPmNvdW50ICogc2l6ZTsgXAotICAgIH0KLQotICBTRVQgKGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKLSAgU0VUIChjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplKTsKLSAgU0VUIChjYlBkT2Zmc2V0LCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplKTsKLSAgU0VUIChjYlN5bU9mZnNldCwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICBTRVQgKGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSk7Ci0gIFNFVCAoY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICBTRVQgKGNiU3NPZmZzZXQsIGlzc01heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIFNFVCAoY2JTc0V4dE9mZnNldCwgaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpKTsKLSAgU0VUIChjYkZkT2Zmc2V0LCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplKTsKLSAgU0VUIChjYlJmZE9mZnNldCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpOwotICBTRVQgKGNiRXh0T2Zmc2V0LCBpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSk7Ci0jdW5kZWYgU0VUCi0KLSAgYnVmZiA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplKTsKLSAgaWYgKGJ1ZmYgPT0gTlVMTCAmJiBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICgqc3dhcC0+c3dhcF9oZHJfb3V0KSAoYWJmZCwgc3ltaGRyLCBidWZmKTsKLSAgaWYgKGJmZF93cml0ZSAoYnVmZiwgMSwgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUsIGFiZmQpCi0gICAgICAhPSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYnVmZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1ZmYpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWZmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmZik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMKLSAgIHRoYXQgdGhlIGluZm9ybWF0aW9uICh0aGUgcG9pbnRlcnMgYW5kIGNvdW50cykgaW4gKkRFQlVHIGhhdmUgYmVlbgotICAgc2V0IGNvcnJlY3RseS4gIFdIRVJFIGlzIHRoZSBwb3NpdGlvbiBpbiB0aGUgZmlsZSB0byB3cml0ZSB0aGUKLSAgIGluZm9ybWF0aW9uIHRvLiAgVGhpcyBmdW5jdGlvbiBmaWxscyBpbiB0aGUgZmlsZSBvZmZzZXRzIGluIHRoZQotICAgc3ltYm9saWMgaGVhZGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCwgd2hlcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgICAgZmlsZV9wdHIgd2hlcmU7Ci17Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLQotICBpZiAoISBlY29mZl93cml0ZV9zeW1oZHIgKGFiZmQsIGRlYnVnLCBzd2FwLCB3aGVyZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0jZGVmaW5lIFdSSVRFKHB0ciwgY291bnQsIHNpemUsIG9mZnNldCkgXAotICBCRkRfQVNTRVJUIChzeW1oZHItPm9mZnNldCA9PSAwIFwKLQkgICAgICB8fCAoYmZkX3ZtYSkgYmZkX3RlbGwgKGFiZmQpID09IHN5bWhkci0+b2Zmc2V0KTsgXAotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBkZWJ1Zy0+cHRyLCBzaXplLCBzeW1oZHItPmNvdW50LCBhYmZkKSBcCi0gICAgICAhPSBzaXplICogc3ltaGRyLT5jb3VudCkgXAotICAgIHJldHVybiBmYWxzZTsKLQotICBXUklURSAobGluZSwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpLCBjYkxpbmVPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfZG5yLCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBjYkRuT2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX3BkciwgaXBkTWF4LCBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSwgY2JQZE9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9zeW0sIGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplLCBjYlN5bU9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9vcHQsIGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplLCBjYk9wdE9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9hdXgsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCksIGNiQXV4T2Zmc2V0KTsKLSAgV1JJVEUgKHNzLCBpc3NNYXgsIHNpemVvZiAoY2hhciksIGNiU3NPZmZzZXQpOwotICBXUklURSAoc3NleHQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSwgY2JTc0V4dE9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9mZHIsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUsIGNiRmRPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfcmZkLCBjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSwgY2JSZmRPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfZXh0LCBpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSwgY2JFeHRPZmZzZXQpOwotI3VuZGVmIFdSSVRFCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHNodWZmbGUgbGlzdC4gICovCi0KLXN0YXRpYyBib29sZWFuIGVjb2ZmX3dyaXRlX3NodWZmbGUgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqLAotCQkJCQkgICAgc3RydWN0IHNodWZmbGUgKiwgUFRSIHNwYWNlKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBzaHVmZmxlLCBzcGFjZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgICAgc3RydWN0IHNodWZmbGUgKnNodWZmbGU7Ci0gICAgIFBUUiBzcGFjZTsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHNodWZmbGUgKmw7Ci0gIHVuc2lnbmVkIGxvbmcgdG90YWw7Ci0KLSAgdG90YWwgPSAwOwotICBmb3IgKGwgPSBzaHVmZmxlOyBsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBsLT5maWxlcCkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlIChsLT51Lm1lbW9yeSwgMSwgbC0+c2l6ZSwgYWJmZCkgIT0gbC0+c2l6ZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYmZkX3NlZWsgKGwtPnUuZmlsZS5pbnB1dF9iZmQsIGwtPnUuZmlsZS5vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgYmZkX3JlYWQgKHNwYWNlLCAxLCBsLT5zaXplLCBsLT51LmZpbGUuaW5wdXRfYmZkKSAhPSBsLT5zaXplCi0JICAgICAgfHwgYmZkX3dyaXRlIChzcGFjZSwgMSwgbC0+c2l6ZSwgYWJmZCkgIT0gbC0+c2l6ZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHRvdGFsICs9IGwtPnNpemU7Ci0gICAgfQotCi0gIGlmICgodG90YWwgJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSkgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGJmZF9ieXRlICpzOwotCi0gICAgICBpID0gc3dhcC0+ZGVidWdfYWxpZ24gLSAodG90YWwgJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSk7Ci0gICAgICBzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGkpOwotICAgICAgaWYgKHMgPT0gTlVMTCAmJiBpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBtZW1zZXQgKChQVFIpIHMsIDAsIGkpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgcywgMSwgaSwgYWJmZCkgIT0gaSkKLQl7Ci0JICBmcmVlIChzKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBmcmVlIChzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdXNpbmcgYWNjdW11bGF0ZWQgbGlua2VyCi0gICBpbmZvcm1hdGlvbi4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAoaGFuZGxlLCBhYmZkLCBkZWJ1Zywgc3dhcCwgaW5mbywgd2hlcmUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGZpbGVfcHRyIHdoZXJlOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotICBQVFIgc3BhY2UgPSBOVUxMOwotCi0gIGlmICghIGVjb2ZmX3dyaXRlX3N5bWhkciAoYWJmZCwgZGVidWcsIHN3YXAsIHdoZXJlKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzcGFjZSA9IChQVFIpIGJmZF9tYWxsb2MgKGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSk7Ci0gIGlmIChzcGFjZSA9PSBOVUxMICYmIGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5saW5lLCBzcGFjZSkKLSAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPnBkciwgc3BhY2UpCi0gICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5zeW0sIHNwYWNlKQotICAgICAgfHwgISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+b3B0LCBzcGFjZSkKLSAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPmF1eCwgc3BhY2UpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBzdHJpbmcgdGFibGUgaXMgd3JpdHRlbiBvdXQgZnJvbSB0aGUgaGFzaCB0YWJsZSBpZiB0aGlzIGlzIGEKLSAgICAgZmluYWwgbGluay4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoYWluZm8tPnNzX2hhc2ggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKTsKLSAgICAgIGlmICghIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5zcywgc3BhY2UpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdG90YWw7Ci0gICAgICBiZmRfYnl0ZSBudWxsOwotICAgICAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzaDsKLQotICAgICAgQkZEX0FTU0VSVCAoYWluZm8tPnNzID09IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKTsKLSAgICAgIG51bGwgPSAwOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJm51bGwsIDEsIDEsIGFiZmQpICE9IDEpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICB0b3RhbCA9IDE7Ci0gICAgICBCRkRfQVNTRVJUIChhaW5mby0+c3NfaGFzaCA9PSBOVUxMIHx8IGFpbmZvLT5zc19oYXNoLT52YWwgPT0gMSk7Ci0gICAgICBmb3IgKHNoID0gYWluZm8tPnNzX2hhc2g7Ci0JICAgc2ggIT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMOwotCSAgIHNoID0gc2gtPm5leHQpCi0JewotCSAgc2l6ZV90IGxlbjsKLQotCSAgbGVuID0gc3RybGVuIChzaC0+cm9vdC5zdHJpbmcpOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc2gtPnJvb3Quc3RyaW5nLCAxLCBsZW4gKyAxLCBhYmZkKSAhPSBsZW4gKyAxKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHRvdGFsICs9IGxlbiArIDE7Ci0JfQotCi0gICAgICBpZiAoKHRvdGFsICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpICE9IDApCi0JewotCSAgdW5zaWduZWQgaW50IGk7Ci0JICBiZmRfYnl0ZSAqczsKLQotCSAgaSA9IHN3YXAtPmRlYnVnX2FsaWduIC0gKHRvdGFsICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpOwotCSAgcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChpKTsKLQkgIGlmIChzID09IE5VTEwgJiYgaSAhPSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIG1lbXNldCAoKFBUUikgcywgMCwgaSk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLCAxLCBpLCBhYmZkKSAhPSBpKQotCSAgICB7Ci0JICAgICAgZnJlZSAocyk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGZyZWUgKHMpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGV4dGVybmFsIHN0cmluZ3MgYW5kIHN5bWJvbCBhcmUgbm90IGNvbnZlcnRlZCBvdmVyIHRvIHVzaW5nCi0gICAgIHNodWZmbGVzLiAgRklYTUU6IFRoZXkgcHJvYmFibHkgc2hvdWxkIGJlLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoZGVidWctPnNzZXh0LCAxLCBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlzc0V4dE1heCwgYWJmZCkKLSAgICAgICE9IChiZmRfc2l6ZV90eXBlKSBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlzc0V4dE1heCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKChkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlzc0V4dE1heCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKSAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgYmZkX2J5dGUgKnM7Ci0KLSAgICAgIGkgPSAoc3dhcC0+ZGVidWdfYWxpZ24KLQkgICAtIChkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlzc0V4dE1heCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKSk7Ci0gICAgICBzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGkpOwotICAgICAgaWYgKHMgPT0gTlVMTCAmJiBpICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBtZW1zZXQgKChQVFIpIHMsIDAsIGkpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgcywgMSwgaSwgYWJmZCkgIT0gaSkKLQl7Ci0JICBmcmVlIChzKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICAgIGZyZWUgKHMpOwotICAgIH0KLQotICBpZiAoISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+ZmRyLCBzcGFjZSkKLSAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPnJmZCwgc3BhY2UpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIEJGRF9BU1NFUlQgKGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuY2JFeHRPZmZzZXQgPT0gMAotCSAgICAgIHx8IChkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmNiRXh0T2Zmc2V0Ci0JCSAgPT0gKGJmZF92bWEpIGJmZF90ZWxsIChhYmZkKSkpOwotCi0gIGlmIChiZmRfd3JpdGUgKGRlYnVnLT5leHRlcm5hbF9leHQsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplLAotCQkgZGVidWctPnN5bWJvbGljX2hlYWRlci5pZXh0TWF4LCBhYmZkKQotICAgICAgIT0gZGVidWctPnN5bWJvbGljX2hlYWRlci5pZXh0TWF4ICogc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKHNwYWNlICE9IE5VTEwpCi0gICAgZnJlZSAoc3BhY2UpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHNwYWNlICE9IE5VTEwpCi0gICAgZnJlZSAoc3BhY2UpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBIYW5kbGUgdGhlIGZpbmRfbmVhcmVzdF9saW5lIGZ1bmN0aW9uIGZvciBib3RoIEVDT0ZGIGFuZCBNSVBTIEVMRgotICAgZmlsZXMuICAqLwotCi0vKiBDb21wYXJlIEZEUiBlbnRyaWVzLiAgVGhpcyBpcyBjYWxsZWQgdmlhIHFzb3J0LiAgKi8KLQotc3RhdGljIGludAotY21wX2ZkcnRhYl9lbnRyeSAobGVmdHAsIHJpZ2h0cCkKLSAgICAgY29uc3QgUFRSIGxlZnRwOwotICAgICBjb25zdCBQVFIgcmlnaHRwOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICpscCA9Ci0gICAgKGNvbnN0IHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKikgbGVmdHA7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKnJwID0KLSAgICAoY29uc3Qgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqKSByaWdodHA7Ci0KLSAgaWYgKGxwLT5iYXNlX2FkZHIgPCBycC0+YmFzZV9hZGRyKQotICAgIHJldHVybiAtMTsKLSAgaWYgKGxwLT5iYXNlX2FkZHIgPiBycC0+YmFzZV9hZGRyKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotLyogRWFjaCBmaWxlIGRlc2NyaXB0b3IgKEZEUikgaGFzIGEgbWVtb3J5IGFkZHJlc3MsIHRvIHNpbXBsaWZ5Ci0gICBsb29raW5nIHVwIGFuIEZEUiBieSBhZGRyZXNzLCB3ZSBidWlsZCBhIHRhYmxlIGNvdmVyaW5nIGFsbCBGRFJzCi0gICB0aGF0IGhhdmUgYSBsZWFzdCBvbmUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgaW4gdGhlbS4gIFRoZSBmaW5hbAotICAgdGFibGUgd2lsbCBiZSBzb3J0ZWQgYnkgYWRkcmVzcyBzbyB3ZSBjYW4gbG9vayBpdCB1cCB2aWEgYmluYXJ5Ci0gICBzZWFyY2guICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWtfZmRydGFiIChhYmZkLCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLCBsaW5lX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXA7Ci0gICAgIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKLXsKLSAgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqdGFiOwotICBGRFIgKmZkcl9wdHI7Ci0gIEZEUiAqZmRyX3N0YXJ0OwotICBGRFIgKmZkcl9lbmQ7Ci0gIGJvb2xlYW4gc3RhYnM7Ci0gIGxvbmcgbGVuOwotCi0gIGZkcl9zdGFydCA9IGRlYnVnX2luZm8tPmZkcjsKLSAgZmRyX2VuZCA9IGZkcl9zdGFydCArIGRlYnVnX2luZm8tPnN5bWJvbGljX2hlYWRlci5pZmRNYXg7Ci0KLSAgLyogRmlyc3QsIGxldCdzIHNlZSBob3cgbG9uZyB0aGUgdGFibGUgbmVlZHMgdG8gYmU6ICovCi0gIGZvciAobGVuID0gMCwgZmRyX3B0ciA9IGZkcl9zdGFydDsgZmRyX3B0ciA8IGZkcl9lbmQ7IGZkcl9wdHIrKykKLSAgICB7Ci0gICAgICBpZiAoZmRyX3B0ci0+Y3BkID09IDApCS8qIHNraXAgRkRScyB0aGF0IGhhdmUgbm8gUERScyAqLwotCWNvbnRpbnVlOwotICAgICAgKytsZW47Ci0gICAgfQotCi0gIC8qIE5vdywgY3JlYXRlIGFuZCBmaWxsIGluIHRoZSB0YWJsZTogKi8KLQotICBsaW5lX2luZm8tPmZkcnRhYiA9ICgoc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSopCi0JCSAgICAgICBiZmRfemFsbG9jIChhYmZkLAotCQkJCSAgIGxlbiAqIHNpemVvZiAoc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSkpKTsKLSAgaWYgKGxpbmVfaW5mby0+ZmRydGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBsaW5lX2luZm8tPmZkcnRhYl9sZW4gPSBsZW47Ci0KLSAgdGFiID0gbGluZV9pbmZvLT5mZHJ0YWI7Ci0gIGZvciAoZmRyX3B0ciA9IGZkcl9zdGFydDsgZmRyX3B0ciA8IGZkcl9lbmQ7IGZkcl9wdHIrKykKLSAgICB7Ci0gICAgICBpZiAoZmRyX3B0ci0+Y3BkID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBmaWxlIGhhcyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBJbgotCSBhIGZpbGUgd2l0aCBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHRoZSBzZWNvbmQgbG9jYWwKLQkgc3ltYm9sIGlzIG5hbWVkIEBzdGFicy4gICovCi0gICAgICBzdGFicyA9IGZhbHNlOwotICAgICAgaWYgKGZkcl9wdHItPmNzeW0gPj0gMikKLQl7Ci0JICBjaGFyICpzeW1fcHRyOwotCSAgU1lNUiBzeW07Ci0KLQkgIHN5bV9wdHIgPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCi0JCSAgICAgKyAoZmRyX3B0ci0+aXN5bUJhc2UgKyAxKSpkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0JICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgc3ltX3B0ciwgJnN5bSk7Ci0JICBpZiAoc3RyY21wIChkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBzeW0uaXNzLAotCQkgICAgICBTVEFCU19TWU1CT0wpID09IDApCi0JICAgIHN0YWJzID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIGlmICghc3RhYnMpCi0JewotCSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZTsKLQkgIGNoYXIgKnBkcl9wdHI7Ci0JICBQRFIgcGRyOwotCi0JICBleHRlcm5hbF9wZHJfc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplOwotCi0JICBwZHJfcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3BkcgotCQkgICAgICsgZmRyX3B0ci0+aXBkRmlyc3QgKiBleHRlcm5hbF9wZHJfc2l6ZSk7Ci0JICAoKmRlYnVnX3N3YXAtPnN3YXBfcGRyX2luKSAoYWJmZCwgKFBUUikgcGRyX3B0ciwgJnBkcik7Ci0JICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgUERSIGlzIHRoZSBvZmZzZXQgb2YgdGhhdAotCSAgICAgcHJvY2VkdXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgZmlsZSBGRFIuICAqLwotCSAgdGFiLT5iYXNlX2FkZHIgPSBmZHJfcHRyLT5hZHIgLSBwZHIuYWRyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBYWFggSSBkb24ndCBrbm93IGFib3V0IHN0YWJzLCBzbyB0aGlzIGlzIGEgZ3Vlc3MKLQkgICAgIChkYXZpZG1AY3MuYXJpem9uYS5lZHUpOiAqLwotCSAgdGFiLT5iYXNlX2FkZHIgPSBmZHJfcHRyLT5hZHI7Ci0JfQotICAgICAgdGFiLT5mZHIgPSBmZHJfcHRyOwotICAgICAgKyt0YWI7Ci0gICAgfQotCi0gIC8qIEZpbmFsbHksIHRoZSB0YWJsZSBpcyBzb3J0ZWQgaW4gaW5jcmVhc2luZyBtZW1vcnktYWRkcmVzcyBvcmRlci4KLSAgICAgVGhlIHRhYmxlIGlzIG1vc3RseSBzb3J0ZWQgYWxyZWFkeSwgYnV0IHRoZXJlIGFyZSBjYXNlcyAoZS5nLiwKLSAgICAgc3RhdGljIGZ1bmN0aW9ucyBpbiBpbmNsdWRlIGZpbGVzKSwgd2hlcmUgdGhpcyBkb2VzIG5vdCBob2xkLgotICAgICBVc2UgIm9kdW1wIC1QRnYiIHRvIHZlcmlmeS4uLiAgKi8KLSAgcXNvcnQgKChQVFIpIGxpbmVfaW5mby0+ZmRydGFiLCBsZW4sCi0JIHNpemVvZiAoc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSksIGNtcF9mZHJ0YWJfZW50cnkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gaW5kZXggb2YgZmlyc3QgRkRSIHRoYXQgY292ZXJzIHRvIE9GRlNFVC4gICovCi0KLXN0YXRpYyBsb25nCi1mZHJ0YWJfbG9va3VwIChsaW5lX2luZm8sIG9mZnNldCkKLSAgICAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqbGluZV9pbmZvOwotICAgICBiZmRfdm1hIG9mZnNldDsKLXsKLSAgbG9uZyBsb3csIGhpZ2gsIGxlbjsKLSAgbG9uZyBtaWQgPSAtMTsKLSAgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqdGFiOwotCi0gIGxlbiA9IGxpbmVfaW5mby0+ZmRydGFiX2xlbjsKLSAgaWYgKGxlbiA9PSAwKQotICAgIHJldHVybiAtMTsKLQotICB0YWIgPSBsaW5lX2luZm8tPmZkcnRhYjsKLSAgZm9yIChsb3cgPSAwLCBoaWdoID0gbGVuIC0gMSA7IGxvdyAhPSBoaWdoIDspCi0gICAgewotICAgICAgbWlkID0gKGhpZ2ggKyBsb3cpIC8gMjsKLSAgICAgIGlmIChvZmZzZXQgPj0gdGFiW21pZF0uYmFzZV9hZGRyICYmIG9mZnNldCA8IHRhYlttaWQgKyAxXS5iYXNlX2FkZHIpCi0JZ290byBmaW5kX21pbjsKLQotICAgICAgaWYgKHRhYlttaWRdLmJhc2VfYWRkciA+IG9mZnNldCkKLQloaWdoID0gbWlkOwotICAgICAgZWxzZQotCWxvdyA9IG1pZCArIDE7Ci0gICAgfQotICArK21pZDsKLQotICAvKiBsYXN0IGVudHJ5IGlzIGNhdGNoLWFsbCBmb3IgYWxsIGhpZ2hlciBhZGRyZXNzZXM6ICovCi0gIGlmIChvZmZzZXQgPCB0YWJbbWlkXS5iYXNlX2FkZHIpCi0gICAgcmV0dXJuIC0xOwotCi0gZmluZF9taW46Ci0KLSAgd2hpbGUgKG1pZCA+IDAgJiYgdGFiW21pZCAtIDFdLmJhc2VfYWRkciA9PSB0YWJbbWlkXS5iYXNlX2FkZHIpCi0gICAgLS1taWQ7Ci0KLSAgcmV0dXJuIG1pZDsKLX0KLQotLyogTG9vayB1cCBhIGxpbmUgZ2l2ZW4gYW4gYWRkcmVzcywgc3RvcmluZyB0aGUgaW5mb3JtYXRpb24gaW4KLSAgIExJTkVfSU5GTy0+Y2FjaGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbG9va3VwX2xpbmUgKGFiZmQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsIGxpbmVfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcDsKLSAgICAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqbGluZV9pbmZvOwotewotICBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICp0YWI7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBib29sZWFuIHN0YWJzOwotICBGRFIgKmZkcl9wdHI7Ci0gIGludCBpOwotICAKLSAgb2Zmc2V0ID0gbGluZV9pbmZvLT5jYWNoZS5zdGFydDsKLSAgICAgCi0gIC8qIEJ1aWxkIEZEUiB0YWJsZSAoc29ydGVkIGJ5IG9iamVjdCBmaWxlJ3MgYmFzZS1hZGRyZXNzKSBpZiB3ZQotICAgICBkb24ndCBoYXZlIGl0IGFscmVhZHkuICAqLwotICBpZiAobGluZV9pbmZvLT5mZHJ0YWIgPT0gTlVMTAotICAgICAgJiYgIW1rX2ZkcnRhYiAoYWJmZCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwgbGluZV9pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdGFiID0gbGluZV9pbmZvLT5mZHJ0YWI7Ci0KLSAgLyogZmluZCBmaXJzdCBGRFIgZm9yIGFkZHJlc3MgT0ZGU0VUICovCi0gIGkgPSBmZHJ0YWJfbG9va3VwIChsaW5lX2luZm8sIG9mZnNldCk7Ci0gIGlmIChpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7CQkvKiBubyBGRFIsIG5vIGZ1bi4uLiAqLwotICBmZHJfcHRyID0gdGFiW2ldLmZkcjsKLQotICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgZmlsZSBoYXMgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgSW4gYQotICAgICBmaWxlIHdpdGggc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB0aGUgc2Vjb25kIGxvY2FsIHN5bWJvbCBpcwotICAgICBuYW1lZCBAc3RhYnMuICAqLwotICBzdGFicyA9IGZhbHNlOwotICBpZiAoZmRyX3B0ci0+Y3N5bSA+PSAyKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bV9wdHI7Ci0gICAgICBTWU1SIHN5bTsKLQotICAgICAgc3ltX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KLQkJICsgKGZkcl9wdHItPmlzeW1CYXNlICsgMSkgKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgc3ltX3B0ciwgJnN5bSk7Ci0gICAgICBpZiAoc3RyY21wIChkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBzeW0uaXNzLAotCQkgIFNUQUJTX1NZTUJPTCkgPT0gMCkKLQlzdGFicyA9IHRydWU7Ci0gICAgfQotCi0gIGlmICghc3RhYnMpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZTsKLSAgICAgIGNoYXIgKnBkcl9wdHI7Ci0gICAgICBjaGFyICpiZXN0X3BkciA9IE5VTEw7Ci0gICAgICBGRFIgKmJlc3RfZmRyOwotICAgICAgYmZkX3ZtYSBiZXN0X2Rpc3QgPSB+MDsKLSAgICAgIFBEUiBwZHI7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpsaW5lX3B0cjsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmxpbmVfZW5kOwotICAgICAgaW50IGxpbmVubzsKLSAgICAgIC8qIFRoaXMgZmlsZSB1c2VzIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEVhY2ggRkRSIGhhcyBhCi0gICAgICAgICBsaXN0IG9mIHByb2NlZHVyZSBkZXNjcmlwdG9ycyAoUERSKS4gIFRoZSBhZGRyZXNzIGluIHRoZSBGRFIKLSAgICAgICAgIGlzIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBwcm9jZWR1cmUuICBUaGUgYWRkcmVzcwotICAgICAgICAgaW4gdGhlIGZpcnN0IFBEUiBnaXZlcyB0aGUgb2Zmc2V0IG9mIHRoYXQgcHJvY2VkdXJlIHJlbGF0aXZlCi0gICAgICAgICB0byB0aGUgb2JqZWN0IGZpbGUncyBiYXNlLWFkZHJlc3MuICBUaGUgYWRkcmVzc2VzIGluCi0gICAgICAgICBzdWJzZXF1ZW50IFBEUnMgc3BlY2lmeSBlYWNoIHByb2NlZHVyZSdzIGFkZHJlc3MgcmVsYXRpdmUgdG8KLSAgICAgICAgIHRoZSBvYmplY3QgZmlsZSdzIGJhc2UtYWRkcmVzcy4gIFRvIG1ha2UgdGhpbmdzIG1vcmUganVpY3ksCi0gICAgICAgICB3aGVuZXZlciB0aGUgUFJPRiBiaXQgaW4gdGhlIFBEUiBpcyBzZXQsIHRoZSByZWFsIGVudHJ5IHBvaW50Ci0gICAgICAgICBvZiB0aGUgcHJvY2VkdXJlIG1heSBiZSAxNiBieXRlcyBiZWxvdyB3aGF0IHdvdWxkIG5vcm1hbGx5IGJlCi0gICAgICAgICB0aGUgcHJvY2VkdXJlJ3MgZW50cnkgcG9pbnQuICBJbnN0ZWFkLCBERUMgY2FtZSB1cCB3aXRoIGEKLSAgICAgICAgIHdpY2tlZCBzY2hlbWUgdG8gY3JlYXRlIHByb2ZpbGVkIGxpYnJhcmllcyAib24gdGhlIGZseSI6Ci0gICAgICAgICBpbnN0ZWFkIG9mIHNoaXBwaW5nIGEgcmVndWxhciBhbmQgYSBwcm9maWxlZCB2ZXJzaW9uIG9mIGVhY2gKLSAgICAgICAgIGxpYnJhcnksIHRoZXkgaW5zZXJ0IDE2IGJ5dGVzIG9mIHVudXNlZCBzcGFjZSBpbiBmcm9udCBvZgotICAgICAgICAgZWFjaCBwcm9jZWR1cmUgYW5kIHNldCB0aGUgInByb2YiIGJpdCBpbiB0aGUgUERSIHRvIGluZGljYXRlCi0gICAgICAgICB0aGF0IHRoZXJlIGlzIGEgZ2FwIHRoZXJlICh0aGlzIGlzIGRvbmUgYXV0b21hZ2ljYWxseSBieSAiYXMiCi0gICAgICAgICB3aGVuIG9wdGlvbiAiLXBnIiBpcyBzcGVjaWZpZWQpLiAgVGh1cywgbm9ybWFsbHksIHlvdSBsaW5rCi0gICAgICAgICBhZ2FpbnN0IHN1Y2ggYSBsaWJyYXJ5IGFuZCwgZXhjZXB0IGZvciBsb3RzIG9mIDE2IGJ5dGUgZ2FwcwotICAgICAgICAgYmV0d2VlbiBmdW5jdGlvbnMsIHRoaW5ncyB3aWxsIGJlaGF2ZSBhcyB1c3VhbC4gIEhvd2V2ZXIsCi0gICAgICAgICB3aGVuIGludm9raW5nICJsZCIgd2l0aCBvcHRpb24gIi1wZyIsIGl0IHdpbGwgZmlsbCB0aG9zZSBnYXBzCi0gICAgICAgICB3aXRoIGNvZGUgdGhhdCBjYWxscyBtY291bnQoKS4gIEl0IHRoZW4gbW92ZXMgdGhlIGZ1bmN0aW9uJ3MKLSAgICAgICAgIGVudHJ5IHBvaW50IGRvd24gYnkgMTYgYnl0ZXMsIGFuZCBvdXQgcG9wcyBhIGJpbmFyeSB0aGF0IGhhcwotICAgICAgICAgYWxsIGZ1bmN0aW9ucyBwcm9maWxlZC4KLQotICAgICAgICAgTk9URTogTmVpdGhlciBGRFJzIG5vciBQRFJzIGFyZSBzdHJpY3RseSBzb3J0ZWQgaW4gbWVtb3J5Ci0gICAgICAgICAgICAgICBvcmRlci4gIEZvciBleGFtcGxlLCB3aGVuIGluY2x1ZGluZyBoZWFkZXItZmlsZXMgdGhhdAotICAgICAgICAgICAgICAgZGVmaW5lIGZ1bmN0aW9ucywgdGhlIEZEUnMgZm9sbG93IGJlaGluZCB0aGUgaW5jbHVkaW5nCi0gICAgICAgICAgICAgICBmaWxlLCBldmVuIHRob3VnaCB0aGVpciBjb2RlIG1heSBoYXZlIGJlZW4gZ2VuZXJhdGVkIGF0Ci0gICAgICAgICAgICAgICBhIGxvd2VyIGFkZHJlc3MuICBGaWxlIGNvZmYtYWxwaGEuYyBmcm9tIGxpYmJmZAotICAgICAgICAgICAgICAgaWxsdXN0cmF0ZXMgdGhpcyAodXNlICJvZHVtcCAtUEZ2IiB0byBsb29rIGF0IGEgZmlsZSdzCi0gICAgICAgICAgICAgICBGRFIvUERSKS4gIFNpbWlsYXJseSwgUERScyBhcmUgc29tZXRpbWVzIG91dCBvZiBvcmRlcgotICAgICAgICAgICAgICAgYXMgd2VsbC4gIEFuIGV4YW1wbGUgb2YgdGhpcyBpcyBPU0YvMSB2My4wIGxpYmMncwotICAgICAgICAgICAgICAgbWFsbG9jLmMuICBJJ20gbm90IHN1cmUgd2h5IHRoaXMgaGFwcGVucywgYnV0IGl0IGNvdWxkCi0gICAgICAgICAgICAgICBiZSBkdWUgdG8gb3B0aW1pemF0aW9ucyB0aGF0IHJlb3JkZXIgYSBmdW5jdGlvbidzCi0gICAgICAgICAgICAgICBwb3NpdGlvbiB3aXRoaW4gYW4gb2JqZWN0LWZpbGUuCi0gICAgICAgIAotICAgICAgICAgU3RyYXRlZ3k6Ci0gICAgICAgICAKLSAgICAgICAgIE9uIHRoZSBmaXJzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIHdlIGJ1aWxkIGEgdGFibGUgb2YgRkRScwotICAgICAgICAgdGhhdCBpcyBzb3J0ZWQgYnkgdGhlIGJhc2UtYWRkcmVzcyBvZiB0aGUgb2JqZWN0LWZpbGUgdGhlIEZEUgotICAgICAgICAgaXMgcmVmZXJyaW5nIHRvLiAgTm90aWNlIHRoYXQgZWFjaCBvYmplY3QtZmlsZSBtYXkgY29udGFpbgotICAgICAgICAgY29kZSBmcm9tIG11bHRpcGxlIHNvdXJjZSBmaWxlcyAoZS5nLiwgZHVlIHRvIGNvZGUgZGVmaW5lZCBpbgotICAgICAgICAgaW5jbHVkZSBmaWxlcykuICBUaHVzLCBmb3IgYW55IGdpdmVuIGJhc2UtYWRkcmVzcywgdGhlcmUgbWF5Ci0gICAgICAgICBiZSBtdWx0aXBsZSBGRFJzIChidXQgdGhpcyBjYXNlIGlzLCBmb3J0dW5hdGVseSwgdW5jb21tb24pLgotICAgICAgICAgbG9va3VwKGFkZHIpIGd1YXJhbnRlZXMgdG8gcmV0dXJuIHRoZSBmaXJzdCBGRFIgdGhhdCBhcHBsaWVzCi0gICAgICAgICB0byBhZGRyZXNzIEFERFIuICBUaHVzLCBhZnRlciBpbnZva2luZyBsb29rdXAoKSwgd2UgaGF2ZSBhCi0gICAgICAgICBsaXN0IG9mIEZEUnMgdGhhdCBtYXkgY29udGFpbiB0aGUgUERSIGZvciBBRERSLiAgTmV4dCwgd2UKLSAgICAgICAgIHdhbGsgdGhyb3VnaCB0aGUgUERScyBvZiB0aGVzZSBGRFJzIGFuZCBsb2NhdGUgdGhlIG9uZSB0aGF0Ci0gICAgICAgICBpcyBjbG9zZXN0IHRvIEFERFIgKGkuZS4sIGZvciB3aGljaCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0gICAgICAgICBBRERSIGFuZCB0aGUgUERSJ3MgZW50cnkgcG9pbnQgaXMgcG9zaXRpdmUgYW5kIG1pbmltYWwpLgotICAgICAgICAgT25jZSwgdGhlIHJpZ2h0IEZEUiBhbmQgUERSIGFyZSBsb2NhdGVkLCB3ZSBzaW1wbHkgd2FsawotICAgICAgICAgdGhyb3VnaCB0aGUgbGluZS1udW1iZXIgdGFibGUgdG8gbG9va3VwIHRoZSBsaW5lLW51bWJlciB0aGF0Ci0gICAgICAgICBiZXN0IG1hdGNoZXMgQUREUi4gIE9idmlvdXNseSwgdGhpbmdzIGNvdWxkIGJlIHNwZWQgdXAgYnkKLSAgICAgICAgIGtlZXBpbmcgYSBzb3J0ZWQgbGlzdCBvZiBQRFJzIGluc3RlYWQgb2YgYSBzb3J0ZWQgbGlzdCBvZgotICAgICAgICAgRkRScy4gIEhvd2V2ZXIsIHRoaXMgd291bGQgaW5jcmVhc2Ugc3BhY2UgcmVxdWlyZW1lbnRzCi0gICAgICAgICBjb25zaWRlcmFibHksIHdoaWNoIGlzIHVuZGVzaXJhYmxlLiAgKi8KLSAgICAgIGV4dGVybmFsX3Bkcl9zaXplID0gZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0KLSAgICAgIC8qIE1ha2Ugb2Zmc2V0IHJlbGF0aXZlIHRvIG9iamVjdCBmaWxlJ3Mgc3RhcnQtYWRkcmVzczogKi8KLSAgICAgIG9mZnNldCAtPSB0YWJbaV0uYmFzZV9hZGRyOwotICAgICAgLyogU2VhcmNoIEZEUiBsaXN0IHN0YXJ0aW5nIGF0IHRhYltpXSBmb3IgdGhlIFBEUiB0aGF0IGJlc3QgbWF0Y2hlcwotICAgICAgICAgT0ZGU0VULiAgTm9ybWFsbHksIHRoZSBGRFIgbGlzdCBpcyBvbmx5IG9uZSBlbnRyeSBsb25nLiAgKi8KLSAgICAgIGJlc3RfZmRyID0gTlVMTDsKLSAgICAgIGRvCi0JewotCSAgYmZkX3ZtYSBkaXN0LCBtaW5fZGlzdCA9IDA7Ci0JICBjaGFyICpwZHJfaG9sZDsKLQkgIGNoYXIgKnBkcl9lbmQ7Ci0JICAKLQkgIGZkcl9wdHIgPSB0YWJbaV0uZmRyOwotCSAgCi0JICBwZHJfcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3BkcgotCQkgICAgICsgZmRyX3B0ci0+aXBkRmlyc3QgKiBleHRlcm5hbF9wZHJfc2l6ZSk7Ci0JICBwZHJfZW5kID0gcGRyX3B0ciArIGZkcl9wdHItPmNwZCAqIGV4dGVybmFsX3Bkcl9zaXplOwotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3Bkcl9pbikgKGFiZmQsIChQVFIpIHBkcl9wdHIsICZwZHIpOwotCSAgLyogRmluZCBQRFIgdGhhdCBpcyBjbG9zZXN0IHRvIE9GRlNFVC4gIElmIHBkci5wcm9mIGlzIHNldCwKLQkgICAgIHRoZSBwcm9jZWR1cmUgZW50cnktcG9pbnQgKm1heSogYmUgMHgxMCBiZWxvdyBwZHIuYWRyLiAgV2UKLQkgICAgIHNpbXBseSBwcmV0ZW5kIHRoYXQgcGRyLnByb2YgKmltcGxpZXMqIGEgbG93ZXIgZW50cnktcG9pbnQuCi0JICAgICBUaGlzIGlzIHNhZmUgYmVjYXVzZSBpdCBqdXN0IG1lYW5zIHRoYXQgbWF5IGlkZW50aWZ5IDQgTk9QcwotCSAgICAgaW4gZnJvbnQgb2YgdGhlIGZ1bmN0aW9uIGFzIGJlbG9uZ2luZyB0byB0aGUgZnVuY3Rpb24uICAqLwotCSAgZm9yIChwZHJfaG9sZCA9IE5VTEw7Ci0JICAgICAgIHBkcl9wdHIgPCBwZHJfZW5kOwotCSAgICAgICAocGRyX3B0ciArPSBleHRlcm5hbF9wZHJfc2l6ZSwKLQkJKCpkZWJ1Z19zd2FwLT5zd2FwX3Bkcl9pbikgKGFiZmQsIChQVFIpIHBkcl9wdHIsICZwZHIpKSkKLQkgICAgewotCSAgICAgIGlmIChvZmZzZXQgPj0gKHBkci5hZHIgLSAweDEwICogcGRyLnByb2YpKQotCQl7Ci0JCSAgZGlzdCA9IG9mZnNldCAtIChwZHIuYWRyIC0gMHgxMCAqIHBkci5wcm9mKTsKLQkJICBpZiAoIXBkcl9ob2xkIHx8IGRpc3QgPCBtaW5fZGlzdCkKLQkJICAgIHsKLQkJICAgICAgbWluX2Rpc3QgPSBkaXN0OwotCQkgICAgICBwZHJfaG9sZCA9IHBkcl9wdHI7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgCi0JICBpZiAoIWJlc3RfcGRyIHx8IG1pbl9kaXN0IDwgYmVzdF9kaXN0KQotCSAgICB7Ci0JICAgICAgYmVzdF9kaXN0ID0gbWluX2Rpc3Q7Ci0JICAgICAgYmVzdF9mZHIgPSBmZHJfcHRyOwotCSAgICAgIGJlc3RfcGRyID0gcGRyX2hvbGQ7Ci0JICAgIH0KLQkgIC8qIGNvbnRpbnVlIGxvb3BpbmcgdW50aWwgYmFzZV9hZGRyIG9mIG5leHQgZW50cnkgaXMgZGlmZmVyZW50OiAqLwotCX0KLSAgICAgIHdoaWxlICgrK2kgPCBsaW5lX2luZm8tPmZkcnRhYl9sZW4KLQkgICAgICYmIHRhYltpXS5iYXNlX2FkZHIgPT0gdGFiW2kgLSAxXS5iYXNlX2FkZHIpOwotCi0gICAgICBpZiAoIWJlc3RfZmRyIHx8ICFiZXN0X3BkcikKLQlyZXR1cm4gZmFsc2U7CQkJLyogc2hvdWxkbid0IGhhcHBlbi4uLiAqLwotCi0gICAgICAvKiBwaGV3LCBmaW5hbGx5IHdlIGdvdCBzb21ldGhpbmcgdGhhdCB3ZSBjYW4gaG9sZCBvbnRvOiAqLwotICAgICAgZmRyX3B0ciA9IGJlc3RfZmRyOwotICAgICAgcGRyX3B0ciA9IGJlc3RfcGRyOwotICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX3Bkcl9pbikgKGFiZmQsIChQVFIpIHBkcl9wdHIsICZwZHIpOwotICAgICAgLyogTm93IHdlIGNhbiBsb29rIGZvciB0aGUgYWN0dWFsIGxpbmUgbnVtYmVyLiAgVGhlIGxpbmUgbnVtYmVycwotICAgICAgICAgYXJlIHN0b3JlZCBpbiBhIHZlcnkgZnVua3kgZm9ybWF0LCB3aGljaCBJIHdvbid0IHRyeSB0bwotICAgICAgICAgZGVzY3JpYmUuICBUaGUgc2VhcmNoIGlzIGJvdW5kZWQgYnkgdGhlIGVuZCBvZiB0aGUgRkRScyBsaW5lCi0gICAgICAgICBudW1iZXIgZW50cmllcy4gICovCi0gICAgICBsaW5lX2VuZCA9IGRlYnVnX2luZm8tPmxpbmUgKyBmZHJfcHRyLT5jYkxpbmVPZmZzZXQgKyBmZHJfcHRyLT5jYkxpbmU7Ci0KLSAgICAgIC8qIE1ha2Ugb2Zmc2V0IHJlbGF0aXZlIHRvIHByb2NlZHVyZSBlbnRyeTogKi8KLSAgICAgIG9mZnNldCAtPSBwZHIuYWRyIC0gMHgxMCAqIHBkci5wcm9mOwotICAgICAgbGluZW5vID0gcGRyLmxuTG93OwotICAgICAgbGluZV9wdHIgPSBkZWJ1Z19pbmZvLT5saW5lICsgZmRyX3B0ci0+Y2JMaW5lT2Zmc2V0ICsgcGRyLmNiTGluZU9mZnNldDsKLSAgICAgIHdoaWxlIChsaW5lX3B0ciA8IGxpbmVfZW5kKQotCXsKLQkgIGludCBkZWx0YTsKLQkgIHVuc2lnbmVkIGludCBjb3VudDsKLQotCSAgZGVsdGEgPSAqbGluZV9wdHIgPj4gNDsKLQkgIGlmIChkZWx0YSA+PSAweDgpCi0JICAgIGRlbHRhIC09IDB4MTA7Ci0JICBjb3VudCA9ICgqbGluZV9wdHIgJiAweGYpICsgMTsKLQkgICsrbGluZV9wdHI7Ci0JICBpZiAoZGVsdGEgPT0gLTgpCi0JICAgIHsKLQkgICAgICBkZWx0YSA9ICgoKGxpbmVfcHRyWzBdKSAmIDB4ZmYpIDw8IDgpICsgKChsaW5lX3B0clsxXSkgJiAweGZmKTsKLQkgICAgICBpZiAoZGVsdGEgPj0gMHg4MDAwKQotCQlkZWx0YSAtPSAweDEwMDAwOwotCSAgICAgIGxpbmVfcHRyICs9IDI7Ci0JICAgIH0KLQkgIGxpbmVubyArPSBkZWx0YTsKLQkgIGlmIChvZmZzZXQgPCBjb3VudCAqIDQpCi0JICAgIHsKLQkgICAgICBsaW5lX2luZm8tPmNhY2hlLnN0b3AgKz0gY291bnQgKiA0IC0gb2Zmc2V0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBvZmZzZXQgLT0gY291bnQgKiA0OwotCX0KLQotICAgICAgLyogSWYgZmRyX3B0ci0+cnNzIGlzIC0xLCB0aGVuIHRoaXMgZmlsZSBkb2VzIG5vdCBoYXZlIGZ1bGwKLSAgICAgICAgIHN5bWJvbHMsIGF0IGxlYXN0IGFjY29yZGluZyB0byBnZGIvbWlwc3JlYWQuYy4gICovCi0gICAgICBpZiAoZmRyX3B0ci0+cnNzID09IC0xKQotCXsKLQkgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSBOVUxMOwotCSAgaWYgKHBkci5pc3ltID09IC0xKQotCSAgICBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZSA9IE5VTEw7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBFWFRSIHByb2NfZXh0OwotCi0JICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikKLQkJKGFiZmQsCi0JCSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfZXh0Ci0JCSAgKyBwZHIuaXN5bSAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKSwKLQkJICZwcm9jX2V4dCk7Ci0JICAgICAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSAoZGVidWdfaW5mby0+c3NleHQKLQkJCQkJICAgICAgICsgcHJvY19leHQuYXN5bS5pc3MpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIFNZTVIgcHJvY19zeW07Ci0KLQkgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSAoZGVidWdfaW5mby0+c3MKLQkJCQkgICAgICAgKyBmZHJfcHRyLT5pc3NCYXNlCi0JCQkJICAgICAgICsgZmRyX3B0ci0+cnNzKTsKLQkgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pCi0JICAgIChhYmZkLAotCSAgICAgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQotCSAgICAgICsgKChmZHJfcHRyLT5pc3ltQmFzZSArIHBkci5pc3ltKQotCQkgKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSkpLAotCSAgICAgJnByb2Nfc3ltKTsKLQkgIGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lID0gKGRlYnVnX2luZm8tPnNzCi0JCQkJCSAgICsgZmRyX3B0ci0+aXNzQmFzZQotCQkJCQkgICArIHByb2Nfc3ltLmlzcyk7Ci0JfQotICAgICAgaWYgKGxpbmVubyA9PSBpbGluZU5pbCkKLQlsaW5lbm8gPSAwOwotICAgICAgbGluZV9pbmZvLT5jYWNoZS5saW5lX251bSA9IGxpbmVubzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplOwotICAgICAgY29uc3QgY2hhciAqZGlyZWN0b3J5X25hbWU7Ci0gICAgICBjb25zdCBjaGFyICptYWluX2ZpbGVfbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKmN1cnJlbnRfZmlsZV9uYW1lOwotICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKmxpbmVfZmlsZV9uYW1lOwotICAgICAgYmZkX3ZtYSBsb3dfZnVuY192bWE7Ci0gICAgICBiZmRfdm1hIGxvd19saW5lX3ZtYTsKLSAgICAgIGJvb2xlYW4gcGFzdF9saW5lOwotICAgICAgYm9vbGVhbiBwYXN0X2ZuOwotICAgICAgY2hhciAqc3ltX3B0ciwgKnN5bV9wdHJfZW5kOwotICAgICAgc2l6ZV90IGxlbiwgZnVuY2xlbjsKLSAgICAgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgIC8qIFRoaXMgZmlsZSB1c2VzIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFdoZW4gZ2NjIGlzIG5vdAotCSBvcHRpbWl6aW5nLCBpdCB3aWxsIHB1dCB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gYmVmb3JlCi0JIHRoZSBmdW5jdGlvbiBuYW1lIHN0YWJzIGVudHJ5LiAgV2hlbiBnY2MgaXMgb3B0aW1pemluZywgaXQKLQkgd2lsbCBwdXQgdGhlIHN0YWJzIGVudHJ5IGZvciBhbGwgdGhlIGZ1bmN0aW9uIGZpcnN0LCBmb2xsb3dlZAotCSBieSB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICAoVGhpcyBhcHBlYXJzIHRvIGhhcHBlbgotCSBiZWNhdXNlIG9mIHRoZSB0d28gb3V0cHV0IGZpbGVzIHVzZWQgYnkgdGhlIC1tZ3BvcHQgc3dpdGNoLAotCSB3aGljaCBpcyBpbXBsaWVkIGJ5IC1PKS4gIFRoaXMgbWVhbnMgdGhhdCB3ZSBtdXN0IGtlZXAKLQkgbG9va2luZyB0aHJvdWdoIHRoZSBzeW1ib2xzIHVudGlsIHdlIGZpbmQgYm90aCBhIGxpbmUgbnVtYmVyCi0JIGFuZCBhIGZ1bmN0aW9uIG5hbWUgd2hpY2ggYXJlIGJleW9uZCB0aGUgYWRkcmVzcyB3ZSB3YW50LiAgKi8KLQotICAgICAgbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZSA9IE5VTEw7Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZSA9IE5VTEw7Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtID0gMDsKLQotICAgICAgZGlyZWN0b3J5X25hbWUgPSBOVUxMOwotICAgICAgbWFpbl9maWxlX25hbWUgPSBOVUxMOwotICAgICAgY3VycmVudF9maWxlX25hbWUgPSBOVUxMOwotICAgICAgZnVuY3Rpb25fbmFtZSA9IE5VTEw7Ci0gICAgICBsaW5lX2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBsb3dfZnVuY192bWEgPSAwOwotICAgICAgbG93X2xpbmVfdm1hID0gMDsKLSAgICAgIHBhc3RfbGluZSA9IGZhbHNlOwotICAgICAgcGFzdF9mbiA9IGZhbHNlOwotCi0gICAgICBleHRlcm5hbF9zeW1fc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplOwotCi0gICAgICBzeW1fcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQotCQkgKyAoZmRyX3B0ci0+aXN5bUJhc2UgKyAyKSAqIGV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgIHN5bV9wdHJfZW5kID0gc3ltX3B0ciArIChmZHJfcHRyLT5jc3ltIC0gMikgKiBleHRlcm5hbF9zeW1fc2l6ZTsKLSAgICAgIGZvciAoOwotCSAgIHN5bV9wdHIgPCBzeW1fcHRyX2VuZCAmJiAoISBwYXN0X2xpbmUgfHwgISBwYXN0X2ZuKTsKLQkgICBzeW1fcHRyICs9IGV4dGVybmFsX3N5bV9zaXplKQotCXsKLQkgIFNZTVIgc3ltOwotCi0JICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgc3ltX3B0ciwgJnN5bSk7Ci0KLQkgIGlmIChFQ09GRl9JU19TVEFCICgmc3ltKSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoRUNPRkZfVU5NQVJLX1NUQUIgKHN5bS5pbmRleCkpCi0JCXsKLQkJY2FzZSBOX1NPOgotCQkgIG1haW5fZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWUgPQotCQkgICAgZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzczsKLQotCQkgIC8qIENoZWNrIHRoZSBuZXh0IHN5bWJvbCB0byBzZWUgaWYgaXQgaXMgYWxzbyBhbgotICAgICAgICAgICAgICAgICAgICAgTl9TTyBzeW1ib2wuICAqLwotCQkgIGlmIChzeW1fcHRyICsgZXh0ZXJuYWxfc3ltX3NpemUgPCBzeW1fcHRyX2VuZCkKLQkJICAgIHsKLQkJICAgICAgU1lNUiBuZXh0c3ltOwotCi0JCSAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLAotCQkJCQkJICBzeW1fcHRyICsgZXh0ZXJuYWxfc3ltX3NpemUsCi0JCQkJCQkgICZuZXh0c3ltKTsKLQkJICAgICAgaWYgKEVDT0ZGX0lTX1NUQUIgKCZuZXh0c3ltKQotCQkJICAmJiBFQ09GRl9VTk1BUktfU1RBQiAobmV4dHN5bS5pbmRleCkgPT0gTl9TTykKLQkJCXsKLSAJCQkgIGRpcmVjdG9yeV9uYW1lID0gY3VycmVudF9maWxlX25hbWU7Ci0JCQkgIG1haW5fZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWUgPQotCQkJICAgIGRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIG5leHRzeW0uaXNzOwotCQkJICBzeW1fcHRyICs9IGV4dGVybmFsX3N5bV9zaXplOwotCQkJfQotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgTl9TT0w6Ci0JCSAgY3VycmVudF9maWxlX25hbWUgPQotCQkgICAgZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzczsKLQkJICBicmVhazsKLQotCQljYXNlIE5fRlVOOgotCQkgIGlmIChzeW0udmFsdWUgPiBvZmZzZXQpCi0JCSAgICBwYXN0X2ZuID0gdHJ1ZTsKLQkJICBlbHNlIGlmIChzeW0udmFsdWUgPj0gbG93X2Z1bmNfdm1hKQotCQkgICAgewotCQkgICAgICBsb3dfZnVuY192bWEgPSBzeW0udmFsdWU7Ci0JCSAgICAgIGZ1bmN0aW9uX25hbWUgPQotCQkJZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzczsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChzeW0uc3QgPT0gc3RMYWJlbCAmJiBzeW0uaW5kZXggIT0gaW5kZXhOaWwpCi0JICAgIHsKLQkgICAgICBpZiAoc3ltLnZhbHVlID4gb2Zmc2V0KQotCQlwYXN0X2xpbmUgPSB0cnVlOwotCSAgICAgIGVsc2UgaWYgKHN5bS52YWx1ZSA+PSBsb3dfbGluZV92bWEpCi0JCXsKLQkJICBsb3dfbGluZV92bWEgPSBzeW0udmFsdWU7Ci0JCSAgbGluZV9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZTsKLQkJICBsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtID0gc3ltLmluZGV4OwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtICE9IDApCi0JbWFpbl9maWxlX25hbWUgPSBsaW5lX2ZpbGVfbmFtZTsKLQotICAgICAgLyogV2UgbmVlZCB0byByZW1vdmUgdGhlIHN0dWZmIGFmdGVyIHRoZSBjb2xvbiBpbiB0aGUgZnVuY3Rpb24KLSAgICAgICAgIG5hbWUuICBXZSBhbHNvIG5lZWQgdG8gcHV0IHRoZSBkaXJlY3RvcnkgbmFtZSBhbmQgdGhlIGZpbGUKLSAgICAgICAgIG5hbWUgdG9nZXRoZXIuICAqLwotICAgICAgaWYgKGZ1bmN0aW9uX25hbWUgPT0gTlVMTCkKLQlsZW4gPSBmdW5jbGVuID0gMDsKLSAgICAgIGVsc2UKLQlsZW4gPSBmdW5jbGVuID0gc3RybGVuIChmdW5jdGlvbl9uYW1lKSArIDE7Ci0KLSAgICAgIGlmIChtYWluX2ZpbGVfbmFtZSAhPSBOVUxMCi0JICAmJiBkaXJlY3RvcnlfbmFtZSAhPSBOVUxMCi0JICAmJiBtYWluX2ZpbGVfbmFtZVswXSAhPSAnLycpCi0JbGVuICs9IHN0cmxlbiAoZGlyZWN0b3J5X25hbWUpICsgc3RybGVuIChtYWluX2ZpbGVfbmFtZSkgKyAxOwotCi0gICAgICBpZiAobGVuICE9IDApCi0JewotCSAgaWYgKGxpbmVfaW5mby0+ZmluZF9idWZmZXIgIT0gTlVMTCkKLQkgICAgZnJlZSAobGluZV9pbmZvLT5maW5kX2J1ZmZlcik7Ci0JICBidWZmZXIgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChsZW4pOwotCSAgaWYgKGJ1ZmZlciA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBsaW5lX2luZm8tPmZpbmRfYnVmZmVyID0gYnVmZmVyOwotCX0KLQotICAgICAgaWYgKGZ1bmN0aW9uX25hbWUgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpjb2xvbjsKLQotCSAgc3RyY3B5IChidWZmZXIsIGZ1bmN0aW9uX25hbWUpOwotCSAgY29sb24gPSBzdHJjaHIgKGJ1ZmZlciwgJzonKTsKLQkgIGlmIChjb2xvbiAhPSBOVUxMKQotCSAgICAqY29sb24gPSAnXDAnOwotCSAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSBidWZmZXI7Ci0JfQotCi0gICAgICBpZiAobWFpbl9maWxlX25hbWUgIT0gTlVMTCkKLQl7Ci0JICBpZiAoZGlyZWN0b3J5X25hbWUgPT0gTlVMTCB8fCBtYWluX2ZpbGVfbmFtZVswXSA9PSAnLycpCi0JICAgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSBtYWluX2ZpbGVfbmFtZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNwcmludGYgKGJ1ZmZlciArIGZ1bmNsZW4sICIlcyVzIiwgZGlyZWN0b3J5X25hbWUsCi0JCSAgICAgICBtYWluX2ZpbGVfbmFtZSk7Ci0JICAgICAgbGluZV9pbmZvLT5jYWNoZS5maWxlbmFtZSA9IGJ1ZmZlciArIGZ1bmNsZW47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEbyB0aGUgd29yayBvZiBmaW5kX25lYXJlc3RfbGluZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfbG9jYXRlX2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZnNldCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwKLQkJCWxpbmVfaW5mbywgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCByZXRsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWdfaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwOwotICAgICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpsaW5lX2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKnJldGxpbmVfcHRyOwotewotICBvZmZzZXQgKz0gc2VjdGlvbi0+dm1hOwotCi0gIGlmIChsaW5lX2luZm8tPmNhY2hlLnNlY3QgPT0gTlVMTAotICAgICAgfHwgbGluZV9pbmZvLT5jYWNoZS5zZWN0ICE9IHNlY3Rpb24KLSAgICAgIHx8IG9mZnNldCA8IGxpbmVfaW5mby0+Y2FjaGUuc3RhcnQKLSAgICAgIHx8IG9mZnNldCA+PSBsaW5lX2luZm8tPmNhY2hlLnN0b3ApCi0gICAgewotICAgICAgbGluZV9pbmZvLT5jYWNoZS5zZWN0ID0gc2VjdGlvbjsKLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuc3RhcnQgPSBvZmZzZXQ7Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLnN0b3AgPSBvZmZzZXQ7Ci0gICAgICBpZiAoISBsb29rdXBfbGluZSAoYWJmZCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwgbGluZV9pbmZvKSkKLQl7Ci0JICBsaW5lX2luZm8tPmNhY2hlLnNlY3QgPSBOVUxMOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgKmZpbGVuYW1lX3B0ciA9IGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWU7Ci0gICpmdW5jdGlvbm5hbWVfcHRyID0gbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWU7Ci0gICpyZXRsaW5lX3B0ciA9IGxpbmVfaW5mby0+Y2FjaGUubGluZV9udW07Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGVzZSByb3V0aW5lcyBjb3B5IHN5bWJvbGljIGluZm9ybWF0aW9uIGludG8gYSBtZW1vcnkgYnVmZmVyLgotCi0gICBGSVhNRTogVGhlIHdob2xlIHBvaW50IG9mIHRoZSBzaHVmZmxlIGNvZGUgaXMgdG8gYXZvaWQgc3RvcmluZwotICAgZXZlcnl0aGluZyBpbiBtZW1vcnksIHNpbmNlIHRoZSBsaW5rZXIgaXMgc3VjaCBhIG1lbW9yeSBob2cuICBUaGlzCi0gICBjb2RlIG1ha2VzIHRoYXQgZWZmb3J0IHVzZWxlc3MuICBJdCBpcyBvbmx5IGNhbGxlZCBieSB0aGUgTUlQUyBFTEYKLSAgIGNvZGUgd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHNvIGl0IGlzIG5vdCB0aGF0IGJpZyBhCi0gICBkZWFsLCBidXQgaXQgc2hvdWxkIGJlIGZpeGVkIGV2ZW50dWFsbHkuICAqLwotCi0vKiBDb2xsZWN0IGEgc2h1ZmZsZSBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4gICovCi0KLXN0YXRpYyBib29sZWFuIGVjb2ZmX2NvbGxlY3Rfc2h1ZmZsZSBQQVJBTVMgKChzdHJ1Y3Qgc2h1ZmZsZSAqLCBiZmRfYnl0ZSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9jb2xsZWN0X3NodWZmbGUgKGwsIGJ1ZmYpCi0gICAgIHN0cnVjdCBzaHVmZmxlICpsOwotICAgICBiZmRfYnl0ZSAqYnVmZjsKLXsKLSAgdW5zaWduZWQgbG9uZyB0b3RhbDsKLQotICB0b3RhbCA9IDA7Ci0gIGZvciAoOyBsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBsLT5maWxlcCkKLQltZW1jcHkgKGJ1ZmYsIGwtPnUubWVtb3J5LCBsLT5zaXplKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYmZkX3NlZWsgKGwtPnUuZmlsZS5pbnB1dF9iZmQsIGwtPnUuZmlsZS5vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgYmZkX3JlYWQgKGJ1ZmYsIDEsIGwtPnNpemUsIGwtPnUuZmlsZS5pbnB1dF9iZmQpICE9IGwtPnNpemUpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICB0b3RhbCArPSBsLT5zaXplOwotICAgICAgYnVmZiArPSBsLT5zaXplOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBQRFIgaW5mb3JtYXRpb24gaW50byBhIG1lbW9yeSBidWZmZXIuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIgKGhhbmRsZSwgYnVmZikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkX2J5dGUgKmJ1ZmY7Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0KLSAgcmV0dXJuIGVjb2ZmX2NvbGxlY3Rfc2h1ZmZsZSAoYWluZm8tPnBkciwgYnVmZik7Ci19Ci0KLS8qIENvcHkgc3ltYm9sIGluZm9ybWF0aW9uIGludG8gYSBtZW1vcnkgYnVmZmVyLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIChoYW5kbGUsIGJ1ZmYpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZF9ieXRlICpidWZmOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotCi0gIHJldHVybiBlY29mZl9jb2xsZWN0X3NodWZmbGUgKGFpbmZvLT5zeW0sIGJ1ZmYpOwotfQotCi0vKiBDb3B5IHRoZSBzdHJpbmcgdGFibGUgaW50byBhIG1lbW9yeSBidWZmZXIuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyAoaGFuZGxlLCBidWZmKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmRfYnl0ZSAqYnVmZjsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzaDsKLSAgdW5zaWduZWQgbG9uZyB0b3RhbDsKLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlIGlzIHdyaXR0ZW4gb3V0IGZyb20gdGhlIGhhc2ggdGFibGUgaWYgdGhpcyBpcyBhCi0gICAgIGZpbmFsIGxpbmsuICAqLwotICBCRkRfQVNTRVJUIChhaW5mby0+c3MgPT0gKHN0cnVjdCBzaHVmZmxlICopIE5VTEwpOwotICAqYnVmZisrID0gJ1wwJzsKLSAgdG90YWwgPSAxOwotICBCRkRfQVNTRVJUIChhaW5mby0+c3NfaGFzaCA9PSBOVUxMIHx8IGFpbmZvLT5zc19oYXNoLT52YWwgPT0gMSk7Ci0gIGZvciAoc2ggPSBhaW5mby0+c3NfaGFzaDsKLSAgICAgICBzaCAhPSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEw7Ci0gICAgICAgc2ggPSBzaC0+bmV4dCkKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKHNoLT5yb290LnN0cmluZyk7Ci0gICAgICBtZW1jcHkgKGJ1ZmYsIChQVFIpIHNoLT5yb290LnN0cmluZywgbGVuICsgMSk7Ci0gICAgICB0b3RhbCArPSBsZW4gKyAxOwotICAgICAgYnVmZiArPSBsZW4gKyAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9lY29mZnN3YXAuaCBiL2JmZC9lY29mZnN3YXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyOGQxNi4uMDAwMDAwMAotLS0gYS9iZmQvZWNvZmZzd2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NTMgKzAsMCBAQAotLyogR2VuZXJpYyBFQ09GRiBzd2FwcGluZyByb3V0aW5lcywgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBOT1RFOiBUaGlzIGlzIGEgaGVhZGVyIGZpbGUsIGJ1dCBpdCBjb250YWlucyBleGVjdXRhYmxlIHJvdXRpbmVzLgotICAgVGhpcyBpcyBkb25lIHRoaXMgd2F5IGJlY2F1c2UgdGhlc2Ugcm91dGluZXMgYXJlIHN1YnN0YW50aWFsbHkKLSAgIHNpbWlsYXIsIGJ1dCBhcmUgbm90IGlkZW50aWNhbCwgZm9yIGFsbCBFQ09GRiB0YXJnZXRzLgotCi0gICBUaGVzZSBhcmUgcm91dGluZXMgdG8gc3dhcCB0aGUgRUNPRkYgc3ltYm9saWMgaW5mb3JtYXRpb24gaW4gYW5kCi0gICBvdXQuICBUaGUgcm91dGluZXMgYXJlIGRlZmluZWQgc3RhdGljYWxseS4gIFlvdSBjYW4gc2V0IGJyZWFrcG9pbnRzCi0gICBvbiB0aGVtIGluIGdkYiBieSBuYW1pbmcgdGhlIGluY2x1ZGluZyBzb3VyY2UgZmlsZTsgZS5nLiwKLSAgICdjb2ZmLW1pcHMuYyc6ZWNvZmZfc3dhcF9oZHJfaW4uCi0KLSAgIEJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgZmlsZSwgb25lIG9mIEVDT0ZGXzMyIG9yIEVDT0ZGXzY0IG11c3QKLSAgIGJlIGRlZmluZWQuICBUaGVzZSBhcmUgY2hlY2tlZCB3aGVuIHN3YXBwaW5nIGluZm9ybWF0aW9uIHRoYXQKLSAgIGRlcGVuZHMgdXBvbiB0aGUgdGFyZ2V0IHNpemUuICBUaGlzIGNvZGUgd29ya3MgZm9yIDMyIGJpdCBhbmQgNjQKLSAgIGJpdCBFQ09GRiwgYnV0IG1heSBuZWVkIHRvIGJlIGdlbmVyYWxpemVkIGluIHRoZSBmdXR1cmUuCi0KLSAgIFNvbWUgaGVhZGVyIGZpbGUgd2hpY2ggZGVmaW5lcyB0aGUgZXh0ZXJuYWwgZm9ybXMgb2YgdGhlc2UKLSAgIHN0cnVjdHVyZXMgbXVzdCBhbHNvIGJlIGluY2x1ZGVkIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgZmlsZS4KLSAgIEN1cnJlbnRseSB0aGlzIGlzIGVpdGhlciBjb2ZmL21pcHMuaCBvciBjb2ZmL2FscGhhLmguCi0KLSAgIElmIHRoZSBzeW1ib2wgVEVTVCBpcyBkZWZpbmVkIHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkLCBhCi0gICBjb21wYXJpc29uIGlzIG1hZGUgdG8gZW5zdXJlIHRoYXQsIGluIGZhY3QsIHRoZSBvdXRwdXQgaXMKLSAgIGJpdC1mb3ItYml0IHRoZSBzYW1lIGFzIHRoZSBpbnB1dC4gIE9mIGNvdXJzZSwgdGhpcyBzeW1ib2wgc2hvdWxkCi0gICBvbmx5IGJlIGRlZmluZWQgd2hlbiBkZWxpYmVyYXRlbHkgdGVzdGluZyB0aGUgY29kZSBvbiBhIG1hY2hpbmUKLSAgIHdpdGggdGhlIHByb3BlciBieXRlIHNleCBhbmQgc3VjaC4gICovCi0KLSNpZmRlZiBFQ09GRl8zMgotI2RlZmluZSBlY29mZl9nZXRfb2ZmIGJmZF9oX2dldF8zMgotI2RlZmluZSBlY29mZl9wdXRfb2ZmIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZkZWYgRUNPRkZfNjQKLSNkZWZpbmUgZWNvZmZfZ2V0X29mZiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgZWNvZmZfcHV0X29mZiBiZmRfaF9wdXRfNjQKLSNlbmRpZgotCi0vKiBFQ09GRiBhdXhpbGlhcnkgaW5mb3JtYXRpb24gc3dhcHBpbmcgcm91dGluZXMuICBUaGVzZSBhcmUgdGhlIHNhbWUKLSAgIGZvciBhbGwgRUNPRkYgdGFyZ2V0cywgc28gdGhleSBhcmUgZGVmaW5lZCBpbiBlY29mZmxpbmsuYy4gICovCi0KLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4KLSAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgdGlyX2V4dCAqLCBUSVIgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQKLSAgUEFSQU1TICgoaW50LCBjb25zdCBUSVIgKiwgc3RydWN0IHRpcl9leHQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4KLSAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3Qgcm5keF9leHQgKiwgUk5EWFIgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0Ci0gIFBBUkFNUyAoKGludCwgY29uc3QgUk5EWFIgKiwgc3RydWN0IHJuZHhfZXh0ICopKTsKLQotLyogUHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9oZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgSERSUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2hkcl9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IEhEUlIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2Zkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBGRFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9mZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBGRFIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3Bkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQRFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9wZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQRFIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3N5bV9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfc3ltX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZXh0X2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEVYVFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9leHRfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFWFRSICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9yZmRfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUkZEVCAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3JmZF9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IFJGRFQgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX29wdF9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBPUFRSICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfb3B0X291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgT1BUUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZG5yX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEROUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2Rucl9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IEROUiAqLCBQVFIpKTsKLQotLyogU3dhcCBpbiB0aGUgc3ltYm9saWMgaGVhZGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfaGRyX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgSERSUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgaGRyX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IGhkcl9leHQgKikgZXh0X2NvcHk7Ci0KLSAgaW50ZXJuLT5tYWdpYyAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX21hZ2ljKTsKLSAgaW50ZXJuLT52c3RhbXAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX3ZzdGFtcCk7Ci0gIGludGVybi0+aWxpbmVNYXggICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lsaW5lTWF4KTsKLSAgaW50ZXJuLT5jYkxpbmUgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiTGluZSk7Ci0gIGludGVybi0+Y2JMaW5lT2Zmc2V0ICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkxpbmVPZmZzZXQpOwotICBpbnRlcm4tPmlkbk1heCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZG5NYXgpOwotICBpbnRlcm4tPmNiRG5PZmZzZXQgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JEbk9mZnNldCk7Ci0gIGludGVybi0+aXBkTWF4ICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lwZE1heCk7Ci0gIGludGVybi0+Y2JQZE9mZnNldCAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlBkT2Zmc2V0KTsKLSAgaW50ZXJuLT5pc3ltTWF4ICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaXN5bU1heCk7Ci0gIGludGVybi0+Y2JTeW1PZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlN5bU9mZnNldCk7Ci0gIGludGVybi0+aW9wdE1heCAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lvcHRNYXgpOwotICBpbnRlcm4tPmNiT3B0T2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JPcHRPZmZzZXQpOwotICBpbnRlcm4tPmlhdXhNYXggICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pYXV4TWF4KTsKLSAgaW50ZXJuLT5jYkF1eE9mZnNldCAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiQXV4T2Zmc2V0KTsKLSAgaW50ZXJuLT5pc3NNYXggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaXNzTWF4KTsKLSAgaW50ZXJuLT5jYlNzT2Zmc2V0ICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3NPZmZzZXQpOwotICBpbnRlcm4tPmlzc0V4dE1heCAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3NFeHRNYXgpOwotICBpbnRlcm4tPmNiU3NFeHRPZmZzZXQgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JTc0V4dE9mZnNldCk7Ci0gIGludGVybi0+aWZkTWF4ICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lmZE1heCk7Ci0gIGludGVybi0+Y2JGZE9mZnNldCAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkZkT2Zmc2V0KTsKLSAgaW50ZXJuLT5jcmZkICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY3JmZCk7Ci0gIGludGVybi0+Y2JSZmRPZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlJmZE9mZnNldCk7Ci0gIGludGVybi0+aWV4dE1heCAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lleHRNYXgpOwotICBpbnRlcm4tPmNiRXh0T2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JFeHRPZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCB0aGUgc3ltYm9saWMgaGVhZGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfaGRyX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgSERSUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgaGRyX2V4dCAqZXh0ID0gKHN0cnVjdCBoZHJfZXh0ICopIGV4dF9wdHI7Ci0gIEhEUlIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7Ci0KLSAgYmZkX2hfcHV0X3NpZ25lZF8xNiAoYWJmZCwgaW50ZXJuLT5tYWdpYywgKGJmZF9ieXRlICopZXh0LT5oX21hZ2ljKTsKLSAgYmZkX2hfcHV0X3NpZ25lZF8xNiAoYWJmZCwgaW50ZXJuLT52c3RhbXAsIChiZmRfYnl0ZSAqKWV4dC0+aF92c3RhbXApOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWxpbmVNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pbGluZU1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lLCAoYmZkX2J5dGUgKilleHQtPmhfY2JMaW5lKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkxpbmVPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWRuTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaWRuTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkRuT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JEbk9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pcGRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pcGRNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiUGRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlBkT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzeW1NYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3ltTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlN5bU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3ltT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pb3B0TWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYk9wdE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiT3B0T2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlhdXhNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pYXV4TWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkF1eE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiQXV4T2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzc01heCwgKGJmZF9ieXRlICopZXh0LT5oX2lzc01heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JTc09mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3NPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXNzRXh0TWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaXNzRXh0TWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlNzRXh0T2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JTc0V4dE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pZmRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZmRNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiRmRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkZkT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNyZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jcmZkKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlJmZE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiUmZkT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlleHRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZXh0TWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkV4dE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRXh0T2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiB0aGUgZmlsZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2Zkcl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIEZEUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgZmRyX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IGZkcl9leHQgKikgZXh0X2NvcHk7Ci0gIAotICBpbnRlcm4tPmFkciAgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfYWRyKTsKLSAgaW50ZXJuLT5yc3MgICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfcnNzKTsKLSNpZmRlZiBFQ09GRl82NAotICBpZiAoaW50ZXJuLT5yc3MgPT0gMHhmZmZmZmZmZikKLSAgICBpbnRlcm4tPnJzcyA9IC0xOwotI2VuZGlmCi0gIGludGVybi0+aXNzQmFzZSAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lzc0Jhc2UpOwotICBpbnRlcm4tPmNiU3MgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2JTcyk7Ci0gIGludGVybi0+aXN5bUJhc2UgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lzeW1CYXNlKTsKLSAgaW50ZXJuLT5jc3ltICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY3N5bSk7Ci0gIGludGVybi0+aWxpbmVCYXNlICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lsaW5lQmFzZSk7Ci0gIGludGVybi0+Y2xpbmUgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NsaW5lKTsKLSAgaW50ZXJuLT5pb3B0QmFzZSAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaW9wdEJhc2UpOwotICBpbnRlcm4tPmNvcHQgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jb3B0KTsKLSNpZmRlZiBFQ09GRl8zMgotICBpbnRlcm4tPmlwZEZpcnN0ICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7Ci0gIGludGVybi0+Y3BkICAgICAgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7Ci0jZW5kaWYKLSNpZmRlZiBFQ09GRl82NAotICBpbnRlcm4tPmlwZEZpcnN0ICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7Ci0gIGludGVybi0+Y3BkICAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7Ci0jZW5kaWYKLSAgaW50ZXJuLT5pYXV4QmFzZSAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaWF1eEJhc2UpOwotICBpbnRlcm4tPmNhdXggICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYXV4KTsKLSAgaW50ZXJuLT5yZmRCYXNlICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfcmZkQmFzZSk7Ci0gIGludGVybi0+Y3JmZCAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NyZmQpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgaW50ZXJuLT5sYW5nICAgICAgICA9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfTEFOR19CSUcpCi0JCQkJCT4+IEZEUl9CSVRTMV9MQU5HX1NIX0JJRzsKLSAgICBpbnRlcm4tPmZNZXJnZSAgICAgID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZNRVJHRV9CSUcpOwotICAgIGludGVybi0+ZlJlYWRpbiAgICAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRlJFQURJTl9CSUcpOwotICAgIGludGVybi0+ZkJpZ2VuZGlhbiAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRkJJR0VORElBTl9CSUcpOwotICAgIGludGVybi0+Z2xldmVsICAgICAgPSAoZXh0LT5mX2JpdHMyWzBdICYgRkRSX0JJVFMyX0dMRVZFTF9CSUcpCi0JCQkJCT4+IEZEUl9CSVRTMl9HTEVWRUxfU0hfQklHOwotICB9IGVsc2UgewotICAgIGludGVybi0+bGFuZyAgICAgICAgPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0xBTkdfTElUVExFKQotCQkJCQk+PiBGRFJfQklUUzFfTEFOR19TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT5mTWVyZ2UgICAgICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GTUVSR0VfTElUVExFKTsKLSAgICBpbnRlcm4tPmZSZWFkaW4gICAgID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFKTsKLSAgICBpbnRlcm4tPmZCaWdlbmRpYW4gID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZCSUdFTkRJQU5fTElUVExFKTsKLSAgICBpbnRlcm4tPmdsZXZlbCAgICAgID0gKGV4dC0+Zl9iaXRzMlswXSAmIEZEUl9CSVRTMl9HTEVWRUxfTElUVExFKQotCQkJCQk+PiBGRFJfQklUUzJfR0xFVkVMX1NIX0xJVFRMRTsKLSAgfQotICBpbnRlcm4tPnJlc2VydmVkID0gMDsKLQotICBpbnRlcm4tPmNiTGluZU9mZnNldCAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2JMaW5lT2Zmc2V0KTsKLSAgaW50ZXJuLT5jYkxpbmUgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NiTGluZSk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IHRoZSBmaWxlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZmRyX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRkRSICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBmZHJfZXh0ICpleHQgPSAoc3RydWN0IGZkcl9leHQgKikgZXh0X3B0cjsKLSAgRkRSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5hZHIsIChiZmRfYnl0ZSAqKWV4dC0+Zl9hZHIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cnNzLCAoYmZkX2J5dGUgKilleHQtPmZfcnNzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzc0Jhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pc3NCYXNlKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlNzLCAoYmZkX2J5dGUgKilleHQtPmZfY2JTcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3ltQmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lzeW1CYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNzeW0sIChiZmRfYnl0ZSAqKWV4dC0+Zl9jc3ltKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlsaW5lQmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lsaW5lQmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jbGluZSwgKGJmZF9ieXRlICopZXh0LT5mX2NsaW5lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHRCYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfaW9wdEJhc2UpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y29wdCwgKGJmZF9ieXRlICopZXh0LT5mX2NvcHQpOwotI2lmZGVmIEVDT0ZGXzMyCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5pcGRGaXJzdCwgKGJmZF9ieXRlICopZXh0LT5mX2lwZEZpcnN0KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPmNwZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7Ci0jZW5kaWYKLSNpZmRlZiBFQ09GRl82NAotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXBkRmlyc3QsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jcGQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcGQpOwotI2VuZGlmCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pYXV4QmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lhdXhCYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNhdXgsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYXV4KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJmZEJhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9yZmRCYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNyZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcmZkKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGV4dC0+Zl9iaXRzMVswXSA9ICgoKGludGVybi0+bGFuZyA8PCBGRFJfQklUUzFfTEFOR19TSF9CSUcpCi0JCQkmIEZEUl9CSVRTMV9MQU5HX0JJRykKLQkJICAgICAgIHwgKGludGVybi0+Zk1lcmdlID8gRkRSX0JJVFMxX0ZNRVJHRV9CSUcgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5mUmVhZGluID8gRkRSX0JJVFMxX0ZSRUFESU5fQklHIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+ZkJpZ2VuZGlhbiA/IEZEUl9CSVRTMV9GQklHRU5ESUFOX0JJRyA6IDApKTsKLSAgICBleHQtPmZfYml0czJbMF0gPSAoKGludGVybi0+Z2xldmVsIDw8IEZEUl9CSVRTMl9HTEVWRUxfU0hfQklHKQotCQkgICAgICAgJiBGRFJfQklUUzJfR0xFVkVMX0JJRyk7Ci0gICAgZXh0LT5mX2JpdHMyWzFdID0gMDsKLSAgICBleHQtPmZfYml0czJbMl0gPSAwOwotICB9IGVsc2UgewotICAgIGV4dC0+Zl9iaXRzMVswXSA9ICgoKGludGVybi0+bGFuZyA8PCBGRFJfQklUUzFfTEFOR19TSF9MSVRUTEUpCi0JCQkmIEZEUl9CSVRTMV9MQU5HX0xJVFRMRSkKLQkJICAgICAgIHwgKGludGVybi0+Zk1lcmdlID8gRkRSX0JJVFMxX0ZNRVJHRV9MSVRUTEUgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5mUmVhZGluID8gRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+ZkJpZ2VuZGlhbiA/IEZEUl9CSVRTMV9GQklHRU5ESUFOX0xJVFRMRSA6IDApKTsKLSAgICBleHQtPmZfYml0czJbMF0gPSAoKGludGVybi0+Z2xldmVsIDw8IEZEUl9CSVRTMl9HTEVWRUxfU0hfTElUVExFKQotCQkgICAgICAgJiBGRFJfQklUUzJfR0xFVkVMX0xJVFRMRSk7Ci0gICAgZXh0LT5mX2JpdHMyWzFdID0gMDsKLSAgICBleHQtPmZfYml0czJbMl0gPSAwOwotICB9Ci0KLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYkxpbmVPZmZzZXQpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZSwgKGJmZF9ieXRlICopZXh0LT5mX2NiTGluZSk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLSNpZm5kZWYgTVBXX0MKLQotLyogU3dhcCBpbiB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcGRyX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgUERSICppbnRlcm47Ci17Ci0gIHN0cnVjdCBwZHJfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3QgcGRyX2V4dCAqKSBleHRfY29weTsKLQotICBtZW1zZXQgKChQVFIpIGludGVybiwgMCwgc2l6ZW9mICgqaW50ZXJuKSk7Ci0KLSAgaW50ZXJuLT5hZHIgICAgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2Fkcik7Ci0gIGludGVybi0+aXN5bSAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lzeW0pOwotICBpbnRlcm4tPmlsaW5lICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pbGluZSk7Ci0gIGludGVybi0+cmVnbWFzayAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX3JlZ21hc2spOwotICBpbnRlcm4tPnJlZ29mZnNldCAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX3JlZ29mZnNldCk7Ci0gIGludGVybi0+aW9wdCAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pb3B0KTsKLSAgaW50ZXJuLT5mcmVnbWFzayAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ21hc2spOwotICBpbnRlcm4tPmZyZWdvZmZzZXQgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdvZmZzZXQpOwotICBpbnRlcm4tPmZyYW1lb2Zmc2V0ICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lb2Zmc2V0KTsKLSAgaW50ZXJuLT5mcmFtZXJlZyAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVyZWcpOwotICBpbnRlcm4tPnBjcmVnICAgICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9wY3JlZyk7Ci0gIGludGVybi0+bG5Mb3cgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2xuTG93KTsKLSAgaW50ZXJuLT5sbkhpZ2ggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfbG5IaWdoKTsKLSAgaW50ZXJuLT5jYkxpbmVPZmZzZXQgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2NiTGluZU9mZnNldCk7Ci0KLSNpZmRlZiBFQ09GRl82NAotICBpbnRlcm4tPmdwX3Byb2xvZ3VlID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnBfZ3BfcHJvbG9ndWUpOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBpbnRlcm4tPmdwX3VzZWQgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfR1BfVVNFRF9CSUcpOwotICAgICAgaW50ZXJuLT5yZWdfZnJhbWUgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUkVHX0ZSQU1FX0JJRyk7Ci0gICAgICBpbnRlcm4tPnByb2YgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUFJPRl9CSUcpOwotICAgICAgaW50ZXJuLT5yZXNlcnZlZCA9ICgoKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9SRVNFUlZFRF9CSUcpCi0JCQkgICA8PCBQRFJfQklUUzFfUkVTRVJWRURfU0hfTEVGVF9CSUcpCi0JCQkgIHwgKChleHQtPnBfYml0czJbMF0gJiBQRFJfQklUUzJfUkVTRVJWRURfQklHKQotCQkJICAgICA+PiBQRFJfQklUUzJfUkVTRVJWRURfU0hfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuLT5ncF91c2VkID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX0dQX1VTRURfTElUVExFKTsKLSAgICAgIGludGVybi0+cmVnX2ZyYW1lID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1JFR19GUkFNRV9MSVRUTEUpOwotICAgICAgaW50ZXJuLT5wcm9mID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1BST0ZfTElUVExFKTsKLSAgICAgIGludGVybi0+cmVzZXJ2ZWQgPSAoKChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUkVTRVJWRURfTElUVExFKQotCQkJICAgPj4gUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xJVFRMRSkKLQkJCSAgfCAoKGV4dC0+cF9iaXRzMlswXSAmIFBEUl9CSVRTMl9SRVNFUlZFRF9MSVRUTEUpCi0JCQkgICAgIDw8IFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRSkpOwotICAgIH0KLSAgaW50ZXJuLT5sb2NhbG9mZiA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5wX2xvY2Fsb2ZmKTsKLSNlbmRpZiAgCi0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IHRoZSBwcm9jZWR1cmUgZGVzY3JpcHRvciByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9wZHJfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBQRFIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IHBkcl9leHQgKmV4dCA9IChzdHJ1Y3QgcGRyX2V4dCAqKSBleHRfcHRyOwotICBQRFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmFkciwgKGJmZF9ieXRlICopZXh0LT5wX2Fkcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3ltLCAoYmZkX2J5dGUgKilleHQtPnBfaXN5bSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pbGluZSwgKGJmZF9ieXRlICopZXh0LT5wX2lsaW5lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJlZ21hc2ssIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJlZ29mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX3JlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pb3B0LCAoYmZkX2J5dGUgKilleHQtPnBfaW9wdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmVnbWFzaywgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyZWdvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyYW1lb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVvZmZzZXQpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+ZnJhbWVyZWcsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZXJlZyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5wY3JlZywgKGJmZF9ieXRlICopZXh0LT5wX3BjcmVnKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmxuTG93LCAoYmZkX2J5dGUgKilleHQtPnBfbG5Mb3cpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+bG5IaWdoLCAoYmZkX2J5dGUgKilleHQtPnBfbG5IaWdoKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9jYkxpbmVPZmZzZXQpOwotCi0jaWZkZWYgRUNPRkZfNjQKLSAgYmZkX2hfcHV0XzggKGFiZmQsIGludGVybi0+Z3BfcHJvbG9ndWUsIChiZmRfYnl0ZSAqKSBleHQtPnBfZ3BfcHJvbG9ndWUpOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBleHQtPnBfYml0czFbMF0gPSAoKGludGVybi0+Z3BfdXNlZCA/IFBEUl9CSVRTMV9HUF9VU0VEX0JJRyA6IDApCi0JCQkgfCAoaW50ZXJuLT5yZWdfZnJhbWUgPyBQRFJfQklUUzFfUkVHX0ZSQU1FX0JJRyA6IDApCi0JCQkgfCAoaW50ZXJuLT5wcm9mID8gUERSX0JJVFMxX1BST0ZfQklHIDogMCkKLQkJCSB8ICgoaW50ZXJuLT5yZXNlcnZlZAotCQkJICAgICA+PiBQRFJfQklUUzFfUkVTRVJWRURfU0hfTEVGVF9CSUcpCi0JCQkgICAgJiBQRFJfQklUUzFfUkVTRVJWRURfQklHKSk7Ci0gICAgICBleHQtPnBfYml0czJbMF0gPSAoKGludGVybi0+cmVzZXJ2ZWQgPDwgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0JJRykKLQkJCSAmIFBEUl9CSVRTMl9SRVNFUlZFRF9CSUcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dC0+cF9iaXRzMVswXSA9ICgoaW50ZXJuLT5ncF91c2VkID8gUERSX0JJVFMxX0dQX1VTRURfTElUVExFIDogMCkKLQkJCSB8IChpbnRlcm4tPnJlZ19mcmFtZSA/IFBEUl9CSVRTMV9SRUdfRlJBTUVfTElUVExFIDogMCkKLQkJCSB8IChpbnRlcm4tPnByb2YgPyBQRFJfQklUUzFfUFJPRl9MSVRUTEUgOiAwKQotCQkJIHwgKChpbnRlcm4tPnJlc2VydmVkIDw8IFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MSVRUTEUpCi0JCQkgICAgJiBQRFJfQklUUzFfUkVTRVJWRURfTElUVExFKSk7Ci0gICAgICBleHQtPnBfYml0czJbMF0gPSAoKGludGVybi0+cmVzZXJ2ZWQgPj4KLQkJCSAgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFKQotCQkJICYgUERSX0JJVFMyX1JFU0VSVkVEX0xJVFRMRSk7Ci0gICAgfQotICBiZmRfaF9wdXRfOCAoYWJmZCwgaW50ZXJuLT5sb2NhbG9mZiwgKGJmZF9ieXRlICopIGV4dC0+cF9sb2NhbG9mZik7Ci0jZW5kaWYgIAotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0jZWxzZSAvKiBNUFdfQyAqLwotLyogU2FtZSByb3V0aW5lcywgYnV0IHdpdGggRUNPRkZfNjQgY29kZSByZW1vdmVkLCBzbyBeJiUkIyYhIE1QVyBDIGRvZXNuJ3QKLSAgIGNvcnJ1cHQgaXRzZWxmIGFuZCB0aGVuIGZyZWFrIG91dC4gKi8KLS8qIFN3YXAgaW4gdGhlIHByb2NlZHVyZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3Bkcl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIFBEUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgcGRyX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IHBkcl9leHQgKikgZXh0X2NvcHk7Ci0gIAotICBpbnRlcm4tPmFkciAgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfYWRyKTsKLSAgaW50ZXJuLT5pc3ltICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaXN5bSk7Ci0gIGludGVybi0+aWxpbmUgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lsaW5lKTsKLSAgaW50ZXJuLT5yZWdtYXNrICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfcmVnbWFzayk7Ci0gIGludGVybi0+cmVnb2Zmc2V0ICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfcmVnb2Zmc2V0KTsKLSAgaW50ZXJuLT5pb3B0ICAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lvcHQpOwotICBpbnRlcm4tPmZyZWdtYXNrICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnbWFzayk7Ci0gIGludGVybi0+ZnJlZ29mZnNldCAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ29mZnNldCk7Ci0gIGludGVybi0+ZnJhbWVvZmZzZXQgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVvZmZzZXQpOwotICBpbnRlcm4tPmZyYW1lcmVnICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZXJlZyk7Ci0gIGludGVybi0+cGNyZWcgICAgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX3BjcmVnKTsKLSAgaW50ZXJuLT5sbkxvdyAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfbG5Mb3cpOwotICBpbnRlcm4tPmxuSGlnaCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkhpZ2gpOwotICBpbnRlcm4tPmNiTGluZU9mZnNldCAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfY2JMaW5lT2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgdGhlIHByb2NlZHVyZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3Bkcl9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFBEUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgcGRyX2V4dCAqZXh0ID0gKHN0cnVjdCBwZHJfZXh0ICopIGV4dF9wdHI7Ci0gIFBEUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+YWRyLCAoYmZkX2J5dGUgKilleHQtPnBfYWRyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzeW0sIChiZmRfYnl0ZSAqKWV4dC0+cF9pc3ltKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlsaW5lLCAoYmZkX2J5dGUgKilleHQtPnBfaWxpbmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmVnbWFzaywgKGJmZF9ieXRlICopZXh0LT5wX3JlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmVnb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pb3B0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyZWdtYXNrLCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJlZ29mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdvZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJhbWVvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZW9mZnNldCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5mcmFtZXJlZywgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lcmVnKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPnBjcmVnLCAoYmZkX2J5dGUgKilleHQtPnBfcGNyZWcpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+bG5Mb3csIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkxvdyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5sbkhpZ2gsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkhpZ2gpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2NiTGluZU9mZnNldCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0jZW5kaWYgLyogTVBXX0MgKi8KLQotLyogU3dhcCBpbiBhIHN5bWJvbCByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9zeW1faW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBTWU1SICppbnRlcm47Ci17Ci0gIHN0cnVjdCBzeW1fZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKihzdHJ1Y3Qgc3ltX2V4dCAqKSBleHRfY29weTsKLSAgCi0gIGludGVybi0+aXNzICAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5zX2lzcyk7Ci0gIGludGVybi0+dmFsdWUgICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+c192YWx1ZSk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBpbnRlcm4tPnN0ICAgICAgICAgID0gIChleHQtPnNfYml0czFbMF0gJiBTWU1fQklUUzFfU1RfQklHKQotCQkJCQkgICA+PiBTWU1fQklUUzFfU1RfU0hfQklHOwotICAgIGludGVybi0+c2MgICAgICAgICAgPSAoKGV4dC0+c19iaXRzMVswXSAmIFNZTV9CSVRTMV9TQ19CSUcpCi0JCQkJCSAgIDw8IFNZTV9CSVRTMV9TQ19TSF9MRUZUX0JJRykKLQkJCXwgKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfU0NfQklHKQotCQkJCQkgICA+PiBTWU1fQklUUzJfU0NfU0hfQklHKTsKLSAgICBpbnRlcm4tPnJlc2VydmVkICAgID0gMCAhPSAoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX1JFU0VSVkVEX0JJRyk7Ci0gICAgaW50ZXJuLT5pbmRleCAgICAgICA9ICgoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX0lOREVYX0JJRykKLQkJCQkJICAgPDwgU1lNX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHKQotCQkJfCAoZXh0LT5zX2JpdHMzWzBdIDw8IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRykKLQkJCXwgKGV4dC0+c19iaXRzNFswXSA8PCBTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9CSUcpOwotICB9IGVsc2UgewotICAgIGludGVybi0+c3QgICAgICAgICAgPSAgKGV4dC0+c19iaXRzMVswXSAmIFNZTV9CSVRTMV9TVF9MSVRUTEUpCi0JCQkJCSAgID4+IFNZTV9CSVRTMV9TVF9TSF9MSVRUTEU7Ci0gICAgaW50ZXJuLT5zYyAgICAgICAgICA9ICgoZXh0LT5zX2JpdHMxWzBdICYgU1lNX0JJVFMxX1NDX0xJVFRMRSkKLQkJCQkJICAgPj4gU1lNX0JJVFMxX1NDX1NIX0xJVFRMRSkKLQkJCXwgKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfU0NfTElUVExFKQotCQkJCQkgICA8PCBTWU1fQklUUzJfU0NfU0hfTEVGVF9MSVRUTEUpOwotICAgIGludGVybi0+cmVzZXJ2ZWQgICAgPSAwICE9IChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfUkVTRVJWRURfTElUVExFKTsKLSAgICBpbnRlcm4tPmluZGV4ICAgICAgID0gKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfSU5ERVhfTElUVExFKQotCQkJCQkgICA+PiBTWU1fQklUUzJfSU5ERVhfU0hfTElUVExFKQotCQkJfCAoZXh0LT5zX2JpdHMzWzBdIDw8IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRSkKLQkJCXwgKCh1bnNpZ25lZCBpbnQpIGV4dC0+c19iaXRzNFswXQotCQkJICAgPDwgU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFKTsKLSAgfQotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhIHN5bWJvbCByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBTWU1SICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBzeW1fZXh0ICpleHQgPSAoc3RydWN0IHN5bV9leHQgKikgZXh0X3B0cjsKLSAgU1lNUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3MsIChiZmRfYnl0ZSAqKWV4dC0+c19pc3MpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPnZhbHVlLCAoYmZkX2J5dGUgKilleHQtPnNfdmFsdWUpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgZXh0LT5zX2JpdHMxWzBdID0gKCgoaW50ZXJuLT5zdCA8PCBTWU1fQklUUzFfU1RfU0hfQklHKQotCQkJJiBTWU1fQklUUzFfU1RfQklHKQotCQkgICAgICAgfCAoKGludGVybi0+c2MgPj4gU1lNX0JJVFMxX1NDX1NIX0xFRlRfQklHKQotCQkJICAmIFNZTV9CSVRTMV9TQ19CSUcpKTsKLSAgICBleHQtPnNfYml0czJbMF0gPSAoKChpbnRlcm4tPnNjIDw8IFNZTV9CSVRTMl9TQ19TSF9CSUcpCi0JCQkmIFNZTV9CSVRTMl9TQ19CSUcpCi0JCSAgICAgICB8IChpbnRlcm4tPnJlc2VydmVkID8gU1lNX0JJVFMyX1JFU0VSVkVEX0JJRyA6IDApCi0JCSAgICAgICB8ICgoaW50ZXJuLT5pbmRleCA+PiBTWU1fQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcpCi0JCQkgICYgU1lNX0JJVFMyX0lOREVYX0JJRykpOwotICAgIGV4dC0+c19iaXRzM1swXSA9IChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRykgJiAweGZmOwotICAgIGV4dC0+c19iaXRzNFswXSA9IChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0JJRykgJiAweGZmOwotICB9IGVsc2UgewotICAgIGV4dC0+c19iaXRzMVswXSA9ICgoKGludGVybi0+c3QgPDwgU1lNX0JJVFMxX1NUX1NIX0xJVFRMRSkKLQkJCSYgU1lNX0JJVFMxX1NUX0xJVFRMRSkKLQkJICAgICAgIHwgKChpbnRlcm4tPnNjIDw8IFNZTV9CSVRTMV9TQ19TSF9MSVRUTEUpCi0JCQkgICYgU1lNX0JJVFMxX1NDX0xJVFRMRSkpOwotICAgIGV4dC0+c19iaXRzMlswXSA9ICgoKGludGVybi0+c2MgPj4gU1lNX0JJVFMyX1NDX1NIX0xFRlRfTElUVExFKQotCQkJJiBTWU1fQklUUzJfU0NfTElUVExFKQotCQkgICAgICAgfCAoaW50ZXJuLT5yZXNlcnZlZCA/IFNZTV9CSVRTMl9SRVNFUlZFRF9MSVRUTEUgOiAwKQotCQkgICAgICAgfCAoKGludGVybi0+aW5kZXggPDwgU1lNX0JJVFMyX0lOREVYX1NIX0xJVFRMRSkKLQkJCSAgJiBTWU1fQklUUzJfSU5ERVhfTElUVExFKSk7Ci0gICAgZXh0LT5zX2JpdHMzWzBdID0gKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFKSAmIDB4ZmY7Ci0gICAgZXh0LT5zX2JpdHM0WzBdID0gKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFKSAmIDB4ZmY7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhbiBleHRlcm5hbCBzeW1ib2wgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZXh0X2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgRVhUUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgZXh0X2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IGV4dF9leHQgKikgZXh0X2NvcHk7Ci0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGludGVybi0+am1wdGJsICAgICAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX0pNUFRCTF9CSUcpOwotICAgIGludGVybi0+Y29ib2xfbWFpbiAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX0NPQk9MX01BSU5fQklHKTsKLSAgICBpbnRlcm4tPndlYWtleHQgICAgID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9XRUFLRVhUX0JJRyk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50ZXJuLT5qbXB0YmwgICAgICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfSk1QVEJMX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5jb2JvbF9tYWluICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfQ09CT0xfTUFJTl9MSVRUTEUpOwotICAgIGludGVybi0+d2Vha2V4dCAgICAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX1dFQUtFWFRfTElUVExFKTsKLSAgfQotICBpbnRlcm4tPnJlc2VydmVkID0gMDsKLQotI2lmZGVmIEVDT0ZGXzMyCi0gIGludGVybi0+aWZkICAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+ZXNfaWZkKTsKLSNlbmRpZgotI2lmZGVmIEVDT0ZGXzY0Ci0gIGludGVybi0+aWZkICAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+ZXNfaWZkKTsKLSNlbmRpZgotCi0gIGVjb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAmZXh0LT5lc19hc3ltLCAmaW50ZXJuLT5hc3ltKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYW4gZXh0ZXJuYWwgc3ltYm9sIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2V4dF9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVYVFIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IGV4dF9leHQgKmV4dCA9IChzdHJ1Y3QgZXh0X2V4dCAqKSBleHRfcHRyOwotICBFWFRSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBleHQtPmVzX2JpdHMxWzBdID0gKChpbnRlcm4tPmptcHRibCA/IEVYVF9CSVRTMV9KTVBUQkxfQklHIDogMCkKLQkJCXwgKGludGVybi0+Y29ib2xfbWFpbiA/IEVYVF9CSVRTMV9DT0JPTF9NQUlOX0JJRyA6IDApCi0JCQl8IChpbnRlcm4tPndlYWtleHQgPyBFWFRfQklUUzFfV0VBS0VYVF9CSUcgOiAwKSk7Ci0gICAgZXh0LT5lc19iaXRzMlswXSA9IDA7Ci0jaWZkZWYgRUNPRkZfNjQKLSAgICBleHQtPmVzX2JpdHMyWzFdID0gMDsKLSAgICBleHQtPmVzX2JpdHMyWzJdID0gMDsKLSNlbmRpZgotICB9IGVsc2UgewotICAgIGV4dC0+ZXNfYml0czFbMF0gPSAoKGludGVybi0+am1wdGJsID8gRVhUX0JJVFMxX0pNUFRCTF9MSVRUTEUgOiAwKQotCQkJfCAoaW50ZXJuLT5jb2JvbF9tYWluID8gRVhUX0JJVFMxX0NPQk9MX01BSU5fTElUVExFIDogMCkKLQkJCXwgKGludGVybi0+d2Vha2V4dCA/IEVYVF9CSVRTMV9XRUFLRVhUX0xJVFRMRSA6IDApKTsKLSAgICBleHQtPmVzX2JpdHMyWzBdID0gMDsKLSNpZmRlZiBFQ09GRl82NAotICAgIGV4dC0+ZXNfYml0czJbMV0gPSAwOwotICAgIGV4dC0+ZXNfYml0czJbMl0gPSAwOwotI2VuZGlmCi0gIH0KLQotI2lmZGVmIEVDT0ZGXzMyCi0gIGJmZF9oX3B1dF9zaWduZWRfMTYgKGFiZmQsIGludGVybi0+aWZkLCAoYmZkX2J5dGUgKilleHQtPmVzX2lmZCk7Ci0jZW5kaWYKLSNpZmRlZiBFQ09GRl82NAotICBiZmRfaF9wdXRfc2lnbmVkXzMyIChhYmZkLCBpbnRlcm4tPmlmZCwgKGJmZF9ieXRlICopZXh0LT5lc19pZmQpOwotI2VuZGlmCi0KLSAgZWNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAmaW50ZXJuLT5hc3ltLCAmZXh0LT5lc19hc3ltKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3JmZF9pbiAoYWJmZCwgZXh0X3B0ciwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfcHRyOwotICAgICBSRkRUICppbnRlcm47Ci17Ci0gIHN0cnVjdCByZmRfZXh0ICpleHQgPSAoc3RydWN0IHJmZF9leHQgKikgZXh0X3B0cjsKLQotICAqaW50ZXJuID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnJmZCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGEgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcmZkX291dCAoYWJmZCwgaW50ZXJuLCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFJGRFQgKmludGVybjsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCByZmRfZXh0ICpleHQgPSAoc3RydWN0IHJmZF9leHQgKikgZXh0X3B0cjsKLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsICppbnRlcm4sIChiZmRfYnl0ZSAqKWV4dC0+cmZkKTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhbiBvcHRpbWl6YXRpb24gc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfb3B0X2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgT1BUUiAqaW50ZXJuOwotewotICBzdHJ1Y3Qgb3B0X2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IG9wdF9leHQgKikgZXh0X2NvcHk7Ci0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgaW50ZXJuLT5vdCA9IGV4dC0+b19iaXRzMVswXTsKLSAgICAgIGludGVybi0+dmFsdWUgPSAoKCh1bnNpZ25lZCBpbnQpIGV4dC0+b19iaXRzMlswXQotCQkJPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHKQotCQkgICAgICAgfCAoKHVuc2lnbmVkIGludCkgZXh0LT5vX2JpdHMzWzBdCi0JCQkgIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRykKLQkJICAgICAgIHwgKCh1bnNpZ25lZCBpbnQpIGV4dC0+b19iaXRzNFswXQotCQkJICA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUcpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm4tPm90ID0gZXh0LT5vX2JpdHMxWzBdOwotICAgICAgaW50ZXJuLT52YWx1ZSA9ICgoZXh0LT5vX2JpdHMyWzBdIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRSkKLQkJICAgICAgIHwgKGV4dC0+b19iaXRzM1swXSA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUpCi0JCSAgICAgICB8IChleHQtPm9fYml0czRbMF0gPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFKSk7Ci0gICAgfQotCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpLAotCQkJICAgJmV4dC0+b19ybmR4LCAmaW50ZXJuLT5ybmR4KTsKLQotICBpbnRlcm4tPm9mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+b19vZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhbiBvcHRpbWl6YXRpb24gc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfb3B0X291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgT1BUUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3Qgb3B0X2V4dCAqZXh0ID0gKHN0cnVjdCBvcHRfZXh0ICopIGV4dF9wdHI7Ci0gIE9QVFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgZXh0LT5vX2JpdHMxWzBdID0gaW50ZXJuLT5vdDsKLSAgICAgIGV4dC0+b19iaXRzMlswXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHOwotICAgICAgZXh0LT5vX2JpdHMzWzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9CSUc7Ci0gICAgICBleHQtPm9fYml0czRbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0JJRzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHQtPm9fYml0czFbMF0gPSBpbnRlcm4tPm90OwotICAgICAgZXh0LT5vX2JpdHMyWzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEU7Ci0gICAgICBleHQtPm9fYml0czNbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0xJVFRMRTsKLSAgICAgIGV4dC0+b19iaXRzNFswXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfTElUVExFOwotICAgIH0KLQotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCksCi0JCQkgICAgJmludGVybi0+cm5keCwgJmV4dC0+b19ybmR4KTsKLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+dmFsdWUsIChiZmRfYnl0ZSAqKSBleHQtPm9fb2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBpbiBhIGRlbnNlIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2Rucl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIEROUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgZG5yX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IGRucl9leHQgKikgZXh0X2NvcHk7Ci0KLSAgaW50ZXJuLT5yZmQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmRfcmZkKTsKLSAgaW50ZXJuLT5pbmRleCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZF9pbmRleCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGEgZGVuc2UgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfZG5yX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRE5SICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBkbnJfZXh0ICpleHQgPSAoc3RydWN0IGRucl9leHQgKikgZXh0X3B0cjsKLSAgRE5SIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZmQsIChiZmRfYnl0ZSAqKSBleHQtPmRfcmZkKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmluZGV4LCAoYmZkX2J5dGUgKikgZXh0LT5kX2luZGV4KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2JmZC9lbGYtYmZkLmggYi9iZmQvZWxmLWJmZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmU3NGMxLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYtYmZkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBkYXRhIHN0cnVjdHVyZXMgZm9yIEVMRiBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0xJQkVMRl9IXwotI2RlZmluZSBfTElCRUxGX0hfIDEKLQotI2luY2x1ZGUgImVsZi9jb21tb24uaCIKLSNpbmNsdWRlICJlbGYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJlbGYvZXh0ZXJuYWwuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qIElmIHNpemUgaXNuJ3Qgc3BlY2lmaWVkIGFzIDY0IG9yIDMyLCBOQU1FIG1hY3JvIHNob3VsZCBmYWlsLiAgKi8KLSNpZm5kZWYgTkFNRQotI2lmIEFSQ0hfU0laRT09NjQKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDQoeCw2NCxfLHkpCi0jZW5kaWYKLSNpZiBBUkNIX1NJWkU9PTMyCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQ0KHgsMzIsXyx5KQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBOQU1FCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQ0KHgsTk9TSVpFLF8seSkKLSNlbmRpZgotCi0jZGVmaW5lIEVsZk5BTUUoWCkJTkFNRShFbGYsWCkKLSNkZWZpbmUgZWxmTkFNRShYKQlOQU1FKGVsZixYKQotCi0vKiBJbmZvcm1hdGlvbiBoZWxkIGZvciBhbiBFTEYgc3ltYm9sLiAgVGhlIGZpcnN0IGZpZWxkIGlzIHRoZQotICAgY29ycmVzcG9uZGluZyBhc3ltYm9sLiAgRXZlcnkgc3ltYm9sIGlzIGFuIEVMRiBmaWxlIGlzIGFjdHVhbGx5IGEKLSAgIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFsdGhvdWdoIGl0IGlzIG9mdGVuIGhhbmRsZWQgYXMgYQotICAgcG9pbnRlciB0byBhbiBhc3ltYm9sLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVGhlIEJGRCBzeW1ib2wuICAqLwotICBhc3ltYm9sIHN5bWJvbDsKLSAgLyogRUxGIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIEVsZl9JbnRlcm5hbF9TeW0gaW50ZXJuYWxfZWxmX3N5bTsKLSAgLyogQmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhwcGFfYXJnX3JlbG9jOwotICAgICAgUFRSIG1pcHNfZXh0cjsKLSAgICAgIFBUUiBhbnk7Ci0gICAgfQotICB0Y19kYXRhOwotCi0gIC8qIFZlcnNpb24gaW5mb3JtYXRpb24uICBUaGlzIGlzIGZyb20gYW4gRWxmX0ludGVybmFsX1ZlcnN5bQotICAgICBzdHJ1Y3R1cmUgaW4gYSBTSFRfR05VX3ZlcnN5bSBzZWN0aW9uLiAgSXQgaXMgemVybyBpZiB0aGVyZSBpcyBubwotICAgICB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKLQotfSBlbGZfc3ltYm9sX3R5cGU7Ci0MCi0vKiBFTEYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBpbml0aWFsaXplZCB0byAtMS4gIEl0IGlzCi0gICAgIHNldCB0byAtMiBpZiB0aGUgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvYy4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBTeW1ib2wgc2l6ZS4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICAvKiBTeW1ib2wgaW5kZXggYXMgYSBkeW5hbWljIHN5bWJvbC4gIEluaXRpYWxpemVkIHRvIC0xLCBhbmQgcmVtYWlucwotICAgICAtMSBpZiB0aGlzIGlzIG5vdCBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgLyogPz8/IE5vdGUgdGhhdCB0aGlzIGlzIGNvbnNpc3RlbnRseSB1c2VkIGFzIGEgc3lub255bSBmb3IgdGVzdHMKLSAgICAgYWdhaW5zdCB3aGV0aGVyIHdlIGNhbiBwZXJmb3JtIHZhcmlvdXMgc2ltcGxpZnlpbmcgdHJhbnNmb3JtYXRpb25zCi0gICAgIHRvIHRoZSBjb2RlLiAgKEUuZy4gY2hhbmdpbmcgYSBwYy1yZWxhdGl2ZSBqdW1wIHRvIGEgUExUIGVudHJ5Ci0gICAgIGludG8gYSBwYy1yZWxhdGl2ZSBqdW1wIHRvIHRoZSB0YXJnZXQgZnVuY3Rpb24uKSAgVGhhdCB0ZXN0LCB3aGljaAotICAgICBpcyBvZnRlbiByZWxhdGl2ZWx5IGNvbXBsZXgsIGFuZCBzb21lcGxhY2VzIHdyb25nIG9yIGluY29tcGxldGUsCi0gICAgIHNob3VsZCByZWFsbHkgYmUgcmVwbGFjZWQgYnkgYSBwcmVkaWNhdGUgaW4gZWxmbGluay5jLgotCi0gICAgIEVuZCByZXN1bHQ6IHRoaXMgZmllbGQgLTEgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCB0aGUgc3ltYm9sIGlzCi0gICAgIG5vdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGJ1dCByYXRoZXIgdGhhdCB0aGUgc3ltYm9sIGlzCi0gICAgIG5vdCB2aXNpYmxlIG91dHNpZGUgdGhpcyBEU08uICAqLwotICBsb25nIGR5bmluZHg7Ci0KLSAgLyogU3RyaW5nIHRhYmxlIGluZGV4IGluIC5keW5zdHIgaWYgdGhpcyBpcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkeW5zdHJfaW5kZXg7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCB0aGlzCi0gICAgIGZpZWxkIHBvaW50cyB0byBhIGRlZmluZWQgc3ltYm9sIHdpdGggdGhlIHNhbWUgdmFsdWUsIGlmIHRoZXJlIGlzCi0gICAgIG9uZS4gIE90aGVyd2lzZSBpdCBpcyBOVUxMLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKndlYWtkZWY7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgcmVxdWlyZXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHRoZQotICAgICBwcm9jZXNzb3Igc3BlY2lmaWMgYmFja2VuZCB1c2VzIHRoaXMgZmllbGQgdG8gdHJhY2sgdXNhZ2UgYW5kCi0gICAgIGZpbmFsIG9mZnNldC4gIFdlIHVzZSBhIHVuaW9uIGFuZCB0d28gbmFtZXMgcHJpbWFyaWx5IHRvIGRvY3VtZW50Ci0gICAgIHRoZSBpbnRlbnQgb2YgYW55IHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZS4gIFRoZSBmaWVsZCBzaG91bGQgYmUKLSAgICAgdXNlZCBhcyBhIGNvdW50IHVudGlsIHNpemVfZHluYW1pY19zZWN0aW9ucywgYXQgd2hpY2ggcG9pbnQgdGhlCi0gICAgIGNvbnRlbnRzIG9mIHRoZSAuZ290IGlzIGZpeGVkLiAgQWZ0ZXJ3YXJkLCBpZiB0aGlzIGZpZWxkIGlzIC0xLAotICAgICB0aGVuIHRoZSBzeW1ib2wgZG9lcyBub3QgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHJlZmNvdW50OwotICAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgfSBnb3Q7Ci0KLSAgLyogU2FtZSwgYnV0IHRyYWNrcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSByZWZjb3VudDsKLSAgICAgIGJmZF92bWEgb2Zmc2V0OwotICAgIH0gcGx0OwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIHVzZWQgaW4gdGhlIGxpbmtlciBjcmVhdGVkIHNlY3Rpb25zLCB0aGUgcHJvY2Vzc29yCi0gICAgIHNwZWNpZmljIGJhY2tlbmQgdXNlcyB0aGlzIGZpZWxkIHRvIG1hcCB0aGUgZmllbGQgaW50byB0aGUgb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMgKmxpbmtlcl9zZWN0aW9uX3BvaW50ZXI7Ci0KLSAgLyogVmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0gIHVuaW9uCi0gIHsKLSAgICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGluIGEKLSAgICAgICByZWd1bGFyIG9iamVjdC4gIEl0IHBvaW50cyB0byB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiByZWFkIGluCi0gICAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QuICAqLwotICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKnZlcmRlZjsKLSAgICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYSByZWd1bGFyCi0gICAgICAgb2JqZWN0LiAgSXQgaXMgc2V0IHVwIGluIHNpemVfZHluYW1pY19zZWN0aW9ucy4gIEl0IHBvaW50cyB0bwotICAgICAgIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHdlIHNob3VsZCB3cml0ZSBvdXQgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcnRyZWU7Ci0gIH0gdmVyaW5mbzsKLQotICAvKiBWaXJ0dWFsIHRhYmxlIGVudHJ5IHVzZSBpbmZvcm1hdGlvbi4gIFRoaXMgYXJyYXkgaXMgbm9taW5hbGx5IG9mIHNpemUKLSAgICAgc2l6ZS9zaXplb2YodGFyZ2V0X3ZvaWRfcG9pbnRlciksIHRob3VnaCB3ZSBoYXZlIHRvIGJlIGFibGUgdG8gYXNzdW1lCi0gICAgIGFuZCB0cmFjayBhIHNpemUgd2hpbGUgdGhlIHN5bWJvbCBpcyBzdGlsbCB1bmRlZmluZWQuICBJdCBpcyBpbmRleGVkCi0gICAgIHZpYSBvZmZzZXQvc2l6ZW9mKHRhcmdldF92b2lkX3BvaW50ZXIpLiAgKi8KLSAgc2l6ZV90IHZ0YWJsZV9lbnRyaWVzX3NpemU7Ci0gIGJvb2xlYW4gKnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0KLSAgLyogVmlydHVhbCB0YWJsZSBkZXJpdmF0aW9uIGluZm8uICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqdnRhYmxlX3BhcmVudDsKLQotICAvKiBTeW1ib2wgdHlwZSAoU1RUX05PVFlQRSwgU1RUX09CSkVDVCwgZXRjLikuICAqLwotICBjaGFyIHR5cGU7Ci0KLSAgLyogU3ltYm9sIHN0X290aGVyIHZhbHVlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvdGhlcjsKLQotICAvKiBIYXNoIHZhbHVlIG9mIHRoZSBuYW1lIGNvbXB1dGVkIHVzaW5nIHRoZSBFTEYgaGFzaCBmdW5jdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgZWxmX2hhc2hfdmFsdWU7Ci0KLSAgLyogU29tZSBmbGFnczsgbGVnYWwgdmFsdWVzIGZvbGxvdy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGVsZl9saW5rX2hhc2hfZmxhZ3M7Ci0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgbm9uLXNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSIDAxCi0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgbm9uLXNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSIDAyCi0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgc2hhcmVkIG9iamVjdC4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMgMDQKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQyAwMTAKLSAgLyogU3ltYm9sIGhhcyBhIG5vbi13ZWFrIHJlZmVyZW5jZSBmcm9tIGEgbm9uLXNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUsgMDIwCi0gIC8qIER5bmFtaWMgc3ltYm9sIGhhcyBiZWVuIGFkanVzdGQuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX0RZTkFNSUNfQURKVVNURUQgMDQwCi0gIC8qIFN5bWJvbCBuZWVkcyBhIGNvcHkgcmVsb2MuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX05FRURTX0NPUFkgMDEwMAotICAvKiBTeW1ib2wgbmVlZHMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIDAyMDAKLSAgLyogU3ltYm9sIGFwcGVhcnMgaW4gYSBub24tRUxGIGlucHV0IGZpbGUuICAqLwotI2RlZmluZSBFTEZfTElOS19OT05fRUxGIDA0MDAKLSAgLyogU3ltYm9sIHNob3VsZCBiZSBtYXJrZWQgYXMgaGlkZGVuIGluIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSElEREVOIDAxMDAwCi0gIC8qIFN5bWJvbCB3YXMgZm9yY2VkIHRvIGxvY2FsIHNjb3BlIGR1ZSB0byBhIHZlcnNpb24gc2NyaXB0IGZpbGUuICAqLwotI2RlZmluZSBFTEZfTElOS19GT1JDRURfTE9DQUwgMDIwMDAKLSAgLyogU3ltYm9sIHdhcyBtYXJrZWQgZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfTUFSSyAwNDAwMAotICAvKiBTeW1ib2wgaXMgcmVmZXJlbmNlZCBieSBhIG5vbi1HT1Qvbm9uLVBMVCByZWxvY2F0aW9uLiAgVGhpcyBpcwotICAgICBub3QgY3VycmVudGx5IHNldCBieSBhbGwgdGhlIGJhY2tlbmRzLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfTk9OX0dPVF9SRUYgMDEwMDAwCi19OwotCi0vKiBSZWNvcmRzIGxvY2FsIHN5bWJvbHMgdG8gYmUgZW1pdHRlZCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLwotCi1zdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqbmV4dDsKLQotICAvKiBUaGUgaW5wdXQgYmZkIHRoaXMgc3ltYm9sIGNhbWUgZnJvbS4gICovCi0gIGJmZCAqaW5wdXRfYmZkOwotCi0gIC8qIFRoZSBpbmRleCBvZiB0aGUgbG9jYWwgc3ltYm9sIGJlaW5nIGNvcGllZC4gICovCi0gIGxvbmcgaW5wdXRfaW5keDsKLQotICAvKiBUaGUgaW5kZXggaW4gdGhlIG91dGdvaW5nIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLSAgbG9uZyBkeW5pbmR4OwotICAKLSAgLyogQSBjb3B5IG9mIHRoZSBpbnB1dCBzeW1ib2wuICAqLwotICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci19OwotCi0vKiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OwotICAvKiBXaGV0aGVyIHdlIGhhdmUgY3JlYXRlZCB0aGUgc3BlY2lhbCBkeW5hbWljIHNlY3Rpb25zIHJlcXVpcmVkCi0gICAgIHdoZW4gbGlua2luZyBhZ2FpbnN0IG9yIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiBkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQ7Ci0gIC8qIFRoZSBCRkQgdXNlZCB0byBob2xkIHNwZWNpYWwgc2VjdGlvbnMgY3JlYXRlZCBieSB0aGUgbGlua2VyLgotICAgICBUaGlzIHdpbGwgYmUgdGhlIGZpcnN0IEJGRCBmb3VuZCB3aGljaCByZXF1aXJlcyB0aGVzZSBzZWN0aW9ucyB0bwotICAgICBiZSBjcmVhdGVkLiAgKi8KLSAgYmZkICpkeW5vYmo7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scyBmb3VuZCBpbiB0aGUgbGluayB3aGljaCBtdXN0IGJlIHB1dCBpbnRvCi0gICAgIHRoZSAuZHluc3ltIHNlY3Rpb24uICAqLwotICBiZmRfc2l6ZV90eXBlIGR5bnN5bWNvdW50OwotICAvKiBUaGUgc3RyaW5nIHRhYmxlIG9mIGR5bmFtaWMgc3ltYm9scywgd2hpY2ggYmVjb21lcyB0aGUgLmR5bnN0cgotICAgICBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZHluc3RyOwotICAvKiBUaGUgbnVtYmVyIG9mIGJ1Y2tldHMgaW4gdGhlIGhhc2ggdGFibGUgaW4gdGhlIC5oYXNoIHNlY3Rpb24uCi0gICAgIFRoaXMgaXMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMuICAqLwotICBiZmRfc2l6ZV90eXBlIGJ1Y2tldGNvdW50OwotICAvKiBBIGxpbmtlZCBsaXN0IG9mIERUX05FRURFRCBuYW1lcyBmb3VuZCBpbiBkeW5hbWljIG9iamVjdHMKLSAgICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZDsKLSAgLyogVGhlIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaGdvdDsKLSAgLyogQSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHVzZWQgdG8gbGluayBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci0gIC8qIEEgbGlua2VkIGxpc3Qgb2YgbG9jYWwgc3ltYm9scyB0byBiZSBhZGRlZCB0byAuZHluc3ltLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKmR5bmxvY2FsOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLAkJXAotCQkJIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGVsZl9oYXNoX3RhYmxlKHApICgoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0MCi0vKiBDb25zdGFudCBpbmZvcm1hdGlvbiBoZWxkIGZvciBhbiBFTEYgYmFja2VuZC4gICovCi0KLXN0cnVjdCBlbGZfc2l6ZV9pbmZvIHsKLSAgdW5zaWduZWQgY2hhciBzaXplb2ZfZWhkciwgc2l6ZW9mX3BoZHIsIHNpemVvZl9zaGRyOwotICB1bnNpZ25lZCBjaGFyIHNpemVvZl9yZWwsIHNpemVvZl9yZWxhLCBzaXplb2Zfc3ltLCBzaXplb2ZfZHluLCBzaXplb2Zfbm90ZTsKLQotICAvKiBUaGUgc2l6ZSBvZiBlbnRyaWVzIGluIHRoZSAuaGFzaCBzZWN0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzaXplb2ZfaGFzaF9lbnRyeTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIGludGVybmFsIHJlbG9jYXRpb25zIHRvIGFsbG9jYXRlIHBlciBleHRlcm5hbAotICAgICByZWxvY2F0aW9uIGVudHJ5LiAgKi8KLSAgdW5zaWduZWQgY2hhciBpbnRfcmVsc19wZXJfZXh0X3JlbDsKLQotICB1bnNpZ25lZCBjaGFyIGFyY2hfc2l6ZSwgZmlsZV9hbGlnbjsKLSAgdW5zaWduZWQgY2hhciBlbGZjbGFzcywgZXZfY3VycmVudDsKLSAgaW50ICgqd3JpdGVfb3V0X3BoZHJzKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgaW50KSk7Ci0gIGJvb2xlYW4gKCp3cml0ZV9zaGRyc19hbmRfZWhkcikgUEFSQU1TICgoYmZkICopKTsKLSAgdm9pZCAoKndyaXRlX3JlbG9jcykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotICB2b2lkICgqc3dhcF9zeW1ib2xfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLCBQVFIpKTsKLSAgYm9vbGVhbiAoKnNsdXJwX3JlbG9jX3RhYmxlKQotICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0gIGxvbmcgKCpzbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0gIHZvaWQgKCpzd2FwX2R5bl9pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci0gIHZvaWQgKCpzd2FwX2R5bl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfRHluICosIFBUUikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIGlzIGNhbGxlZCB0byBzd2FwIGluIGEgUkVMCi0gICAgIHJlbG9jYXRpb24uICBJZiBhbiBleHRlcm5hbCByZWxvY2F0aW9uIGNvcnJlc3BvbmRzIHRvIG1vcmUgdGhhbgotICAgICBvbmUgaW50ZXJuYWwgcmVsb2NhdGlvbiwgdGhlbiBhbGwgcmVsb2NhdGlvbnMgYXJlIHN3YXBwZWQgaW4gYXQKLSAgICAgb25jZS4gICovCi0gIHZvaWQgKCpzd2FwX3JlbG9jX2luKQotICAgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsICopKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgdG8gc3dhcCBvdXQgYSBSRUwKLSAgICAgcmVsb2NhdGlvbi4gICovCi0gIHZvaWQgKCpzd2FwX3JlbG9jX291dCkKLSAgICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbCAqLCBiZmRfYnl0ZSAqKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiwgaWYgZGVmaW5lZCwgaXMgY2FsbGVkIHRvIHN3YXAgaW4gYSBSRUxBCi0gICAgIHJlbG9jYXRpb24uICBJZiBhbiBleHRlcm5hbCByZWxvY2F0aW9uIGNvcnJlc3BvbmRzIHRvIG1vcmUgdGhhbgotICAgICBvbmUgaW50ZXJuYWwgcmVsb2NhdGlvbiwgdGhlbiBhbGwgcmVsb2NhdGlvbnMgYXJlIHN3YXBwZWQgaW4gYXQKLSAgICAgb25jZS4gICovCi0gIHZvaWQgKCpzd2FwX3JlbG9jYV9pbikKLSAgICBQQVJBTVMgKChiZmQgKiwgY29uc3QgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIGlzIGNhbGxlZCB0byBzd2FwIG91dCBhIFJFTEEKLSAgICAgcmVsb2NhdGlvbi4gICovCi0gIHZvaWQgKCpzd2FwX3JlbG9jYV9vdXQpCi0gICAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF9ieXRlICopKTsKLQotfTsKLQotI2RlZmluZSBlbGZfc3ltYm9sX2Zyb20oQUJGRCxTKSBcCi0JKCgoUyktPnRoZV9iZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91ciBcCi0JICAmJiAoUyktPnRoZV9iZmQtPnRkYXRhLmVsZl9vYmpfZGF0YSAhPSAwKSBcCi0JID8gKGVsZl9zeW1ib2xfdHlwZSAqKSAoUykgXAotCSA6IDApCi0KLXN0cnVjdCBlbGZfYmFja2VuZF9kYXRhCi17Ci0gIC8qIFRoZSBhcmNoaXRlY3R1cmUgZm9yIHRoaXMgYmFja2VuZC4gICovCi0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qIFRoZSBFTEYgbWFjaGluZSBjb2RlIChFTV94eHh4KSBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KLSAgaW50IGVsZl9tYWNoaW5lX2NvZGU7Ci0KLSAgLyogVGhlIG1heGltdW0gcGFnZSBzaXplIGZvciB0aGlzIGJhY2tlbmQuICAqLwotICBiZmRfdm1hIG1heHBhZ2VzaXplOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gdHJhbnNsYXRlIGFuIEVMRiBSRUxBIHJlbG9jYXRpb24gdG8gYSBCRkQgYXJlbGVudAotICAgICBzdHJ1Y3R1cmUuICAqLwotICB2b2lkICgqZWxmX2luZm9fdG9faG93dG8pIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosCi0JCQkJICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byB0cmFuc2xhdGUgYW4gRUxGIFJFTCByZWxvY2F0aW9uIHRvIGEgQkZEIGFyZWxlbnQKLSAgICAgc3RydWN0dXJlLiAgKi8KLSAgdm9pZCAoKmVsZl9pbmZvX3RvX2hvd3RvX3JlbCkgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwKLQkJCQkJIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzeW1ib2wgaXMgZ2xvYmFsIHdoZW4KLSAgICAgcGFydGl0aW9uaW5nIHRoZSBzeW1ib2wgdGFibGUgaW50byBsb2NhbCBhbmQgZ2xvYmFsIHN5bWJvbHMuCi0gICAgIFRoaXMgc2hvdWxkIGJlIE5VTEwgZm9yIG1vc3QgdGFyZ2V0cywgaW4gd2hpY2ggY2FzZSB0aGUgY29ycmVjdAotICAgICB0aGluZyB3aWxsIGJlIGRvbmUuICBNSVBTIEVMRiwgYXQgbGVhc3Qgb24gdGhlIElyaXggNSwgaGFzCi0gICAgIHNwZWNpYWwgcmVxdWlyZW1lbnRzLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLQotICAvKiBUaGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBhcmUgaG9va3Mgd2hpY2ggYXJlIGNhbGxlZCBvbmx5IGlmIHRoZXkKLSAgICAgYXJlIG5vdCBOVUxMLiAgKi8KLQotICAvKiBBIGZ1bmN0aW9uIHRvIHBlcm1pdCBhIGJhY2tlbmQgc3BlY2lmaWMgY2hlY2sgb24gd2hldGhlciBhCi0gICAgIHBhcnRpY3VsYXIgQkZEIGZvcm1hdCBpcyByZWxldmFudCBmb3IgYW4gb2JqZWN0IGZpbGUsIGFuZCB0bwotICAgICBwZXJtaXQgdGhlIGJhY2tlbmQgdG8gc2V0IGFueSBnbG9iYWwgaW5mb3JtYXRpb24gaXQgd2lzaGVzLiAgV2hlbgotICAgICB0aGlzIGlzIGNhbGxlZCBlbGZfZWxmaGVhZGVyIGlzIHNldCwgYnV0IGFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlCi0gICAgIHVzZWQgd2l0aCBjYXV0aW9uLiAgSWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgY2hlY2tfZm9ybWF0Ci0gICAgIHJvdXRpbmUgd2lsbCByZXR1cm4gYSBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0IGVycm9yLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gZG8gYWRkaXRpb25hbCBzeW1ib2wgcHJvY2Vzc2luZyB3aGVuIHJlYWRpbmcgdGhlCi0gICAgIEVMRiBzeW1ib2wgdGFibGUuICBUaGlzIGlzIHdoZXJlIGFueSBwcm9jZXNzb3Itc3BlY2lmaWMgc3BlY2lhbAotICAgICBzZWN0aW9uIGluZGljZXMgYXJlIGhhbmRsZWQuICAqLwotICB2b2lkICgqZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFkZGl0aW9uYWwgc3ltYm9sIHByb2Nlc3NpbmcgYWZ0ZXIgcmVhZGluZyB0aGUKLSAgICAgZW50aXJlIEVMRiBzeW1ib2wgdGFibGUuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJCSAgZWxmX3N5bWJvbF90eXBlICosCi0JCQkJCQkJICB1bnNpZ25lZCBpbnQpKTsKLQotICAgLyogQSBmdW5jdGlvbiB0byBzZXQgdGhlIHR5cGUgb2YgdGhlIGluZm8gZmllbGQuICBQcm9jZXNzb3Itc3BlY2lmaWMKLSAgICAgdHlwZXMgc2hvdWxkIGJlIGhhbmRsZWQgaGVyZS4gKi8KLSAgaW50ICgqZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlKSBQQVJBTVMgKCggRWxmX0ludGVybmFsX1N5bSAqLCBpbnQpKTsgCi0gCi0gIC8qIEEgZnVuY3Rpb24gdG8gZG8gYWRkaXRpb25hbCBwcm9jZXNzaW5nIG9uIHRoZSBFTEYgc2VjdGlvbiBoZWFkZXIKLSAgICAganVzdCBiZWZvcmUgd3JpdGluZyBpdCBvdXQuICBUaGlzIGlzIHVzZWQgdG8gc2V0IHRoZSBmbGFncyBhbmQKLSAgICAgdHlwZSBmaWVsZHMgZm9yIHNvbWUgc2VjdGlvbnMsIG9yIHRvIGFjdHVhbGx5IHdyaXRlIG91dCBkYXRhIGZvcgotICAgICB1bnVzdWFsIHNlY3Rpb25zLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZykgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gaGFuZGxlIHVudXN1YWwgc2VjdGlvbiB0eXBlcyB3aGVuIGNyZWF0aW5nIEJGRAotICAgICBzZWN0aW9ucyBmcm9tIEVMRiBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcikgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqLAotCQkJCQkJICAgIGNoYXIgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gaGFuZGxlIHVudXN1YWwgcHJvZ3JhbSBzZWdtZW50IHR5cGVzIHdoZW4gY3JlYXRpbmcgQkZECi0gICAgIHNlY3Rpb25zIGZyb20gRUxGIHByb2dyYW0gc2VnbWVudHMuICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkcikgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgRWxmMzJfSW50ZXJuYWxfUGhkciAqLAotCQkJCQkJICAgIGludCkpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gc2V0IHVwIHRoZSBFTEYgc2VjdGlvbiBoZWFkZXIgZm9yIGEgQkZEIHNlY3Rpb24gaW4KLSAgICAgcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcgaXQgb3V0LiAgVGhpcyBpcyB3aGVyZSB0aGUgZmxhZ3MgYW5kIHR5cGUKLSAgICAgZmllbGRzIGFyZSBzZXQgZm9yIHVudXN1YWwgc2VjdGlvbnMuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucykgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwKLQkJCQkJCWFzZWN0aW9uICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGdldCB0aGUgRUxGIHNlY3Rpb24gaW5kZXggZm9yIGEgQkZEIHNlY3Rpb24uICBJZgotICAgICB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlIHNlY3Rpb24gd2FzIGZvdW5kLiAgSWYgaXQgaXMgYSBub3JtYWwgRUxGCi0gICAgIHNlY3Rpb24sICpSRVRWQUwgc2hvdWxkIGJlIGxlZnQgdW5jaGFuZ2VkLiAgSWYgaXQgaXMgbm90IGEgbm9ybWFsCi0gICAgIEVMRiBzZWN0aW9uICpSRVRWQUwgc2hvdWxkIGJlIHNldCB0byB0aGUgU0hOX3h4eHggaW5kZXguICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKQotICAgIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICosIGludCAqcmV0dmFsKSk7Ci0KLSAgLyogSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgaXQgaXMgY2FsbGVkIGJ5IHRoZSBhZGRfc3ltYm9scyBwaGFzZQotICAgICBvZiBhIGxpbmsganVzdCBiZWZvcmUgYWRkaW5nIGEgc3ltYm9sIHRvIHRoZSBnbG9iYWwgbGlua2VyIGhhc2gKLSAgICAgdGFibGUuICBJdCBtYXkgbW9kaWZ5IGFueSBvZiB0aGUgZmllbGRzIGFzIGl0IHdpc2hlcy4gIElmICpOQU1FCi0gICAgIGlzIHNldCB0byBOVUxMLCB0aGUgc3ltYm9sIHdpbGwgYmUgc2tpcHBlZCByYXRoZXIgdGhhbiBiZWluZwotICAgICBhZGRlZCB0byB0aGUgaGFzaCB0YWJsZS4gIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yCi0gICAgIGhhbmRsaW5nIGFsbCBwcm9jZXNzb3IgZGVwZW5kZW50IHN5bWJvbCBiaW5kaW5ncyBhbmQgc2VjdGlvbgotICAgICBpbmRpY2VzLCBhbmQgbXVzdCBzZXQgYXQgbGVhc3QgKkZMQUdTIGFuZCAqU0VDIGZvciBlYWNoIHByb2Nlc3NvcgotICAgICBkZXBlbmRlbnQgY2FzZTsgZmFpbHVyZSB0byBkbyBzbyB3aWxsIGNhdXNlIGEgbGluayBlcnJvci4gICovCi0gIGJvb2xlYW4gKCplbGZfYWRkX3N5bWJvbF9ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosIGNvbnN0IGNoYXIgKipuYW1lLAotCSAgICAgZmxhZ3dvcmQgKmZsYWdzLCBhc2VjdGlvbiAqKnNlYywgYmZkX3ZtYSAqdmFsdWUpKTsKLQotICAvKiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCBpdCBpcyBjYWxsZWQgYnkgdGhlIGVsZl9saW5rX291dHB1dF9zeW0KLSAgICAgcGhhc2Ugb2YgYSBsaW5rIGZvciBlYWNoIHN5bWJvbCB3aGljaCB3aWxsIGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBjb25zdCBjaGFyICosCi0JICAgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICopKTsKLQotICAvKiBUaGUgQ1JFQVRFX0RZTkFNSUNfU0VDVElPTlMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZAotICAgICBsaW5rZXIgdGhlIGZpcnN0IHRpbWUgaXQgZW5jb3VudGVycyBhIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBsaW5rLgotICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgY3JlYXRlIGFueSBzZWN0aW9ucyByZXF1aXJlZCBmb3IgZHluYW1pYwotICAgICBsaW5raW5nLiAgVGhlIEFCRkQgYXJndW1lbnQgaXMgYSBkeW5hbWljIG9iamVjdC4gIFRoZSAuaW50ZXJwLAotICAgICAuZHluYW1pYywgLmR5bnN5bSwgLmR5bnN0ciwgYW5kIC5oYXNoIGZ1bmN0aW9ucyBoYXZlIGFscmVhZHkgYmVlbgotICAgICBjcmVhdGVkLCBhbmQgdGhpcyBmdW5jdGlvbiBtYXkgbW9kaWZ5IHRoZSBzZWN0aW9uIGZsYWdzIGlmCi0gICAgIGRlc2lyZWQuICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm9ybWFsbHkgY3JlYXRlIHRoZSAuZ290IGFuZCAucGx0Ci0gICAgIHNlY3Rpb25zLCBidXQgZGlmZmVyZW50IGJhY2tlbmRzIGhhdmUgZGlmZmVyZW50IHJlcXVpcmVtZW50cy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0KLSAgLyogVGhlIENIRUNLX1JFTE9DUyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGFkZF9zeW1ib2xzIHBoYXNlIG9mCi0gICAgIHRoZSBFTEYgYmFja2VuZCBsaW5rZXIuICBJdCBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzZWN0aW9uIHdpdGgKLSAgICAgcmVsb2NzIG9mIGFuIG9iamVjdCBmaWxlLCBqdXN0IGFmdGVyIHRoZSBzeW1ib2xzIGZvciB0aGUgb2JqZWN0Ci0gICAgIGZpbGUgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBnbG9iYWwgbGlua2VyIGhhc2ggdGFibGUuICBUaGUKLSAgICAgZnVuY3Rpb24gbXVzdCBsb29rIHRocm91Z2ggdGhlIHJlbG9jcyBhbmQgZG8gYW55IHNwZWNpYWwgaGFuZGxpbmcKLSAgICAgcmVxdWlyZWQuICBUaGlzIGdlbmVyYWxseSBtZWFucyBhbGxvY2F0aW5nIHNwYWNlIGluIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLCBhbmQgcGVyaGFwcyBhbGxvY2F0aW5nIHNwYWNlIGZvciBhIHJlbG9jLiAgVGhlCi0gICAgIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgICB6ZXJvLiAgKi8KLSAgYm9vbGVhbiAoKmNoZWNrX3JlbG9jcykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKTsKLQotICAvKiBUaGUgQURKVVNUX0RZTkFNSUNfU1lNQk9MIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKLSAgICAgbGlua2VyIGZvciBldmVyeSBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZAotICAgICByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBvYmplY3QuICBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlCi0gICAgIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBzZWVuLCBidXQgYmVmb3JlIHRoZSBTSVpFX0RZTkFNSUNfU0VDVElPTlMKLSAgICAgZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkLiAgVGhlIGhhc2ggdGFibGUgZW50cnkgc2hvdWxkIGJlCi0gICAgIGJmZF9saW5rX2hhc2hfZGVmaW5lZCBvcmUgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLCBhbmQgaXQgc2hvdWxkIGJlCi0gICAgIGRlZmluZWQgaW4gYSBzZWN0aW9uIGZyb20gYSBkeW5hbWljIG9iamVjdC4gIER5bmFtaWMgb2JqZWN0Ci0gICAgIHNlY3Rpb25zIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIGxpbmssIGFuZCB0aGlzIGZ1bmN0aW9uIGlzCi0gICAgIHJlc3BvbnNpYmxlIGZvciBjaGFuZ2luZyB0aGUgdmFsdWUgdG8gc29tZXRoaW5nIHdoaWNoIHRoZSByZXN0IG9mCi0gICAgIHRoZSBsaW5rIGNhbiBkZWFsIHdpdGguICBUaGlzIHdpbGwgbm9ybWFsbHkgaW52b2x2ZSBhZGRpbmcgYW4KLSAgICAgZW50cnkgdG8gdGhlIC5wbHQgb3IgLmdvdCBvciBzb21lIHN1Y2ggc2VjdGlvbiwgYW5kIHNldHRpbmcgdGhlCi0gICAgIHN5bWJvbCB0byBwb2ludCB0byB0aGF0LiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCkKLSAgICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgpKTsKLQotICAvKiBUaGUgQUxXQVlTX1NJWkVfU0VDVElPTlMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBiYWNrZW5kIGxpbmtlcgotICAgICBhZnRlciBhbGwgdGhlIGxpbmtlciBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc2VlbiBidXQgYmVmb3JlIHRoZQotICAgICBzZWN0aW9uIHNpemVzIGhhdmUgYmVlbiBzZXQuICBUaGlzIGlzIGNhbGxlZCBhZnRlcgotICAgICBBREpVU1RfRFlOQU1JQ19TWU1CT0wsIGJ1dCBiZWZvcmUgU0laRV9EWU5BTUlDX1NFQ1RJT05TLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLQotICAvKiBUaGUgU0laRV9EWU5BTUlDX1NFQ1RJT05TIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKLSAgICAgbGlua2VyIGFmdGVyIGFsbCB0aGUgbGlua2VyIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBzZWVuIGJ1dCBiZWZvcmUKLSAgICAgdGhlIHNlY3Rpb25zIHNpemVzIGhhdmUgYmVlbiBzZXQuICBUaGlzIGlzIGNhbGxlZCBhZnRlcgotICAgICBBREpVU1RfRFlOQU1JQ19TWU1CT0wgaGFzIGJlZW4gY2FsbGVkIG9uIGFsbCBhcHByb3ByaWF0ZSBzeW1ib2xzLgotICAgICBJdCBpcyBvbmx5IGNhbGxlZCB3aGVuIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LiAgSXQgbXVzdAotICAgICBzZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLCBhbmQgbWF5IGZpbGwgaW4gdGhlaXIKLSAgICAgY29udGVudHMgYXMgd2VsbC4gIFRoZSBnZW5lcmljIEVMRiBsaW5rZXIgY2FuIGhhbmRsZSB0aGUgLmR5bnN5bSwKLSAgICAgLmR5bnN0ciBhbmQgLmhhc2ggc2VjdGlvbnMuICBUaGlzIGZ1bmN0aW9uIG11c3QgaGFuZGxlIHRoZQotICAgICAuaW50ZXJwIHNlY3Rpb24gYW5kIGFueSBzZWN0aW9ucyBjcmVhdGVkIGJ5IHRoZQotICAgICBDUkVBVEVfRFlOQU1JQ19TRUNUSU9OUyBlbnRyeSBwb2ludC4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpCi0gICAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotCi0gIC8qIFRoZSBSRUxPQ0FURV9TRUNUSU9OIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyCi0gICAgIHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4KLQotICAgICBUaGUgcmVsb2NzIGFyZSBhbHdheXMgcGFzc2VkIGFzIFJlbGEgc3RydWN0dXJlczsgaWYgdGhlIHNlY3Rpb24KLSAgICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICAgIHplcm8uCi0KLSAgICAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFzCi0gICAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCi0gICAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZSByZWxvYyBhZGRlbmQgYXMKLSAgICAgbmVjZXNzYXJ5LgotCi0gICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYwotICAgICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgICAgTE9DQUxfU1lNUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgaW4gbG9jYWwgc3ltYm9scy4KLQotICAgICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKLSAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgICAgVGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGUgZ2xvYmFsIHN5bWJvbHMgY2FuIGJlIGZvdW5kCi0gICAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotICAgICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgICBTVEJfTE9DQUwvU1RUX1NFQ1RJT04gc3ltYm9scyBzcGVjaWFsbHkuICBUaGUgb3V0cHV0IHN5bWJvbCBpcwotICAgICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0Ci0gICAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICAgIGFjY29yZGluZ2x5LiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pCi0gICAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICAgIGJmZCAqaW5wdXRfYmZkLCBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgYmZkX2J5dGUgKmNvbnRlbnRzLAotCSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcywgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltcywKLQkgICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnMpKTsKLQotICAvKiBUaGUgRklOSVNIX0RZTkFNSUNfU1lNQk9MIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKLSAgICAgbGlua2VyIGp1c3QgYmVmb3JlIGl0IHdyaXRlcyBhIHN5bWJvbCBvdXQgdG8gdGhlIC5keW5zeW0gc2VjdGlvbi4KLSAgICAgVGhlIHByb2Nlc3NvciBiYWNrZW5kIG1heSBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50IHRvIHRoZQotICAgICBzeW1ib2wuICBJdCBtYXkgYWxzbyB0YWtlIHRoZSBvcHBvcnR1bml0eSB0byBzZXQgY29udGVudHMgb2YgdGhlCi0gICAgIGR5bmFtaWMgc2VjdGlvbnMuICBOb3RlIHRoYXQgRklOSVNIX0RZTkFNSUNfU1lNQk9MIGlzIGNhbGxlZCBvbgotICAgICBhbGwgLmR5bnN5bSBzeW1ib2xzLCB3aGlsZSBBREpVU1RfRFlOQU1JQ19TWU1CT0wgaXMgb25seSBjYWxsZWQKLSAgICAgb24gdGhvc2Ugc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCkKLSAgICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIEVsZl9JbnRlcm5hbF9TeW0gKnN5bSkpOwotCi0gIC8qIFRoZSBGSU5JU0hfRFlOQU1JQ19TRUNUSU9OUyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBqdXN0IGJlZm9yZSBpdCB3cml0ZXMgYWxsIHRoZSBkeW5hbWljIHNlY3Rpb25zIG91dCB0byB0aGUKLSAgICAgb3V0cHV0IGZpbGUuICBUaGUgRklOSVNIX0RZTkFNSUNfU1lNQk9MIHdpbGwgaGF2ZSBiZWVuIGNhbGxlZCBvbgotICAgICBhbGwgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFueSBiZWdpbm5pbmcgcHJvY2Vzc2luZyBuZWVkZWQgZm9yIHRoZSBFTEYgZmlsZQotICAgICBiZWZvcmUgYnVpbGRpbmcgdGhlIEVMRiBoZWFkZXJzIGFuZCBjb21wdXRpbmcgZmlsZSBwb3NpdGlvbnMuICAqLwotICB2b2lkICgqZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZykKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gZG8gYW55IGZpbmFsIHByb2Nlc3NpbmcgbmVlZGVkIGZvciB0aGUgRUxGIGZpbGUKLSAgICAgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgVGhlIExJTktFUiBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMgQkZECi0gICAgIHdhcyBjcmVhdGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIuICAqLwotICB2b2lkICgqZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZykKLSAgICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiBsaW5rZXIpKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZS4gIEl0IHNob3VsZAotICAgICByZXR1cm4gdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHByb2dyYW0gc2VnbWVudHMgd2hpY2ggdGhpcyBCRkQKLSAgICAgd2lsbCBuZWVkLiAgSXQgc2hvdWxkIHJldHVybiAtMSBvbiBlcnJvci4gICovCi0gIGludCAoKmVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIG1vZGlmeSBhbiBleGlzdGluZyBzZWdtZW50IG1hcCBpbiBhCi0gICAgIGJhY2tlbmQgc3BlY2lmaWMgZmFzaGlvbi4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIHNlY3Rpb24gZ2MgdG8gZGlzY292ZXIgdGhlIHNlY3Rpb24gYQotICAgICBwYXJ0aWN1bGFyIHJlbG9jYXRpb24gcmVmZXJzIHRvLiAgSXQgbmVlZCBub3QgYmUgZGVmaW5lZCBmb3IgaG9zdHMKLSAgICAgdGhhdCBoYXZlIG5vIHF1ZWVyIHJlbG9jYXRpb24gdHlwZXMuICAqLwotICBhc2VjdGlvbiAqICgqZ2NfbWFya19ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBzd2VlcCBwaGFzZSBvZiBnYwotICAgICBpbiBvcmRlciB0aGF0IGEgYmFja2VuZCBtaWdodCB1cGRhdGUgYW55IGRhdGEgc3RydWN0dXJlcyBpdCBtaWdodAotICAgICBiZSBtYWludGFpbmluZy4gICovCi0gIGJvb2xlYW4gKCpnY19zd2VlcF9ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpvLAotCSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcykpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIGlzIGNhbGxlZCBhZnRlciB0aGUgRUxGIGhlYWRlcnMgaGF2ZQotICAgICBiZWVuIGNyZWF0ZWQuICBUaGlzIGFsbG93cyBmb3IgdGhpbmdzIGxpa2UgdGhlIE9TIGFuZCBBQkkgdmVyc2lvbnMKLSAgICAgdG8gYmUgY2hhbmdlZC4gICovCi0gIHZvaWQgKCplbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycykKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIHByaW50cyBhIHN5bWJvbCB0byBmaWxlIGFuZCByZXR1cm5zIHRoZQotICAgICBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gYmUgcHJpbnRlZC4gIEl0IHNob3VsZCByZXR1cm4gTlVMTCB0byBmYWxsCi0gICAgIGJhY2sgdG8gZGVmYXVsdCBzeW1ib2wgcHJpbnRpbmcuICAqLwotICBjb25zdCBjaGFyICooKmVsZl9iYWNrZW5kX3ByaW50X3N5bWJvbF9hbGwpCi0gICAgUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiwgaWYgZGVmaW5lZCwgaXMgY2FsbGVkIGFmdGVyIGFsbCBsb2NhbCBzeW1ib2xzIGFuZAotICAgICBnbG9iYWwgc3ltYm9scyBjb252ZXJ0ZWQgdG8gbG9jYWxzIGFyZSBlbWl0ZWQgaW50byB0aGUgc3ltdGFiCi0gICAgIHNlY3Rpb24uICBJdCBhbGxvd3MgdGhlIGJhY2tlbmQgdG8gZW1pdCBzcGVjaWFsIGdsb2JhbCBzeW1ib2xzCi0gICAgIG5vdCBoYW5kbGVkIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX291dHB1dF9hcmNoX3N5bXMpCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIFBUUiwKLQkgICAgYm9vbGVhbiAoKikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosCi0gICAgICAgICAgICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSkpKTsKLQotICAvKiBUaGUgc3dhcHBpbmcgdGFibGUgdG8gdXNlIHdoZW4gZGVhbGluZyB3aXRoIEVDT0ZGIGluZm9ybWF0aW9uLgotICAgICBVc2VkIGZvciB0aGUgTUlQUyBFTEYgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0KLSAgLyogQWx0ZXJuYXRlIEVNX3h4eHggbWFjaGluZSBjb2RlcyBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KLSAgaW50IGVsZl9tYWNoaW5lX2FsdDE7Ci0gIGludCBlbGZfbWFjaGluZV9hbHQyOwotCi0gIGNvbnN0IHN0cnVjdCBlbGZfc2l6ZV9pbmZvICpzOwotCi0gIC8qIG9mZnNldCBvZiB0aGUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbCBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgLmdvdCBzZWN0aW9uICovCi0gIGJmZF92bWEgZ290X3N5bWJvbF9vZmZzZXQ7Ci0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGhlYWRlcnMgZm9yIHRoZSBHT1QgYW5kIFBMVC4gIFRoaXMgaW5jbHVkZXMKLSAgICAgdGhlIHNvLWNhbGxlZCByZXNlcnZlZCBlbnRyaWVzIG9uIHNvbWUgc3lzdGVtcy4gICovCi0gIGJmZF92bWEgZ290X2hlYWRlcl9zaXplOwotICBiZmRfdm1hIHBsdF9oZWFkZXJfc2l6ZTsKLQotICAvKiBUaGlzIGlzIHRydWUgaWYgdGhlIGxpbmtlciBzaG91bGQgYWN0IGxpa2UgY29sbGVjdCBhbmQgZ2F0aGVyCi0gICAgIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGJ5IG5hbWUuICBUaGlzIGlzIHRydWUgZm9yCi0gICAgIE1JUFMgRUxGIGJlY2F1c2UgdGhlIElyaXggNSB0b29scyBjYW4gbm90IGhhbmRsZSB0aGUgLmluaXQKLSAgICAgc2VjdGlvbi4gICovCi0gIHVuc2lnbmVkIGNvbGxlY3QgOiAxOwotCi0gIC8qIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgbGlua2VyIHNob3VsZCBpZ25vcmUgY2hhbmdlcyB0byB0aGUgdHlwZSBvZiBhCi0gICAgIHN5bWJvbC4gIFRoaXMgaXMgdHJ1ZSBmb3IgTUlQUyBFTEYgYmVjYXVzZSBzb21lIElyaXggNSBvYmplY3RzCi0gICAgIHJlY29yZCB1bmRlZmluZWQgZnVuY3Rpb25zIGFzIFNUVF9PQkpFQ1QgYWx0aG91Z2ggdGhlIGRlZmluaXRpb25zCi0gICAgIGFyZSBTVFRfRlVOQy4gICovCi0gIHVuc2lnbmVkIHR5cGVfY2hhbmdlX29rIDogMTsKLQotICAvKiBXaGV0aGVyIHRoZSBiYWNrZW5kIG1heSB1c2UgUkVMIHJlbG9jYXRpb25zLiAgKFNvbWUgYmFja2VuZHMgdXNlCi0gICAgIGJvdGggUkVMIGFuZCBSRUxBIHJlbG9jYXRpb25zLCBhbmQgdGhpcyBmbGFnIGlzIHNldCBmb3IgdGhvc2UKLSAgICAgYmFja2VuZHMuKSAgKi8KLSAgdW5zaWduZWQgbWF5X3VzZV9yZWxfcCA6IDE7Ci0gICAgCi0gIC8qIFdoZXRoZXIgdGhlIGJhY2tlbmQgbWF5IHVzZSBSRUxBIHJlbG9jYXRpb25zLiAgKFNvbWUgYmFja2VuZHMgdXNlCi0gICAgIGJvdGggUkVMIGFuZCBSRUxBIHJlbG9jYXRpb25zLCBhbmQgdGhpcyBmbGFnIGlzIHNldCBmb3IgdGhvc2UKLSAgICAgYmFja2VuZHMuKSAgKi8KLSAgdW5zaWduZWQgbWF5X3VzZV9yZWxhX3AgOiAxOwotCi0gIC8qIFdoZXRoZXIgdGhlIGRlZmF1bHQgcmVsb2NhdGlvbiB0eXBlIGlzIFJFTEEuICBJZiBhIGJhY2tlbmQgd2l0aAotICAgICB0aGlzIGZsYWcgc2V0IHdhbnRzIFJFTCByZWxvY2F0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIHNlY3Rpb24sCi0gICAgIGl0IG11c3Qgbm90ZSB0aGF0IGV4cGxpY2l0bHkuICBTaW1pbGFybHksIGlmIHRoaXMgZmxhZyBpcyBjbGVhciwKLSAgICAgYW5kIHRoZSBiYWNrZW5kIHdhbnRzIFJFTEEgcmVsb2NhdGlvbnMgZm9yIGEgcGFydGljdWxhciAKLSAgICAgc2VjdGlvbi4gICovICAgCi0gIHVuc2lnbmVkIGRlZmF1bHRfdXNlX3JlbGFfcCA6IDE7Ci0KLSAgLyogVHJ1ZSBpZiBhZGRyZXNzZXMgIm5hdHVyYWxseSIgc2lnbiBleHRlbmQuICBUaGlzIGlzIHVzZWQgd2hlbgotICAgICBzd2FwcGluZyBpbiBmcm9tIEVsZjMyIHdoZW4gQkZENjQuICAqLwotICB1bnNpZ25lZCBzaWduX2V4dGVuZF92bWEgOiAxOwotCi0gIHVuc2lnbmVkIHdhbnRfZ290X3BsdCA6IDE7Ci0gIHVuc2lnbmVkIHBsdF9yZWFkb25seSA6IDE7Ci0gIHVuc2lnbmVkIHdhbnRfcGx0X3N5bSA6IDE7Ci0gIHVuc2lnbmVkIHBsdF9ub3RfbG9hZGVkIDogMTsKLSAgdW5zaWduZWQgcGx0X2FsaWdubWVudCA6IDQ7Ci0gIHVuc2lnbmVkIGNhbl9nY19zZWN0aW9ucyA6IDE7Ci0gIHVuc2lnbmVkIHdhbnRfZHluYnNzIDogMTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHN0b3JlZCBmb3IgZWFjaCBCRkQgc2VjdGlvbiBpbiBhbiBFTEYgZmlsZS4gIFRoaXMKLSAgIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgZWxmX25ld19zZWN0aW9uX2hvb2suICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEKLXsKLSAgLyogVGhlIEVMRiBoZWFkZXIgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyIHRoaXNfaGRyOwotICAvKiBUaGUgRUxGIGhlYWRlciBmb3IgdGhlIHJlbG9jIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgc2VjdGlvbiwgaWYgYW55LiAgKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgcmVsX2hkcjsKLSAgLyogSWYgdGhlcmUgaXMgYSBzZWNvbmQgcmVsb2Mgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZWN0aW9uLAotICAgICBhcyBjYW4gaGFwcGVuIG9uIElyaXggNiwgdGhpcyBmaWVsZCBwb2ludHMgdG8gdGhlIGhlYWRlci4gICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyMjsKLSAgLyogVGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyBjdXJyZW50bHkgYXNzaWduZWQgdG8gUkVMX0hEUi4gICovCi0gIHVuc2lnbmVkIGludCByZWxfY291bnQ7Ci0gIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgY3VycmVudGx5IGFzc2lnbmVkIHRvIFJFTF9IRFIyLiAgKi8KLSAgdW5zaWduZWQgaW50IHJlbF9jb3VudDI7Ci0gIC8qIFRoZSBFTEYgc2VjdGlvbiBudW1iZXIgb2YgdGhpcyBzZWN0aW9uLiAgT25seSB1c2VkIGZvciBhbiBvdXRwdXQKLSAgICAgZmlsZS4gICovCi0gIGludCB0aGlzX2lkeDsKLSAgLyogVGhlIEVMRiBzZWN0aW9uIG51bWJlciBvZiB0aGUgcmVsb2Mgc2VjdGlvbiBpbmRpY2F0ZWQgYnkKLSAgICAgUkVMX0hEUiBpZiBhbnkuICBPbmx5IHVzZWQgZm9yIGFuIG91dHB1dCBmaWxlLiAgKi8KLSAgaW50IHJlbF9pZHg7Ci0gIC8qIFRoZSBFTEYgc2VjdGlvbiBudW1iZXIgb2YgdGhlIHJlbG9jIHNlY3Rpb24gaW5kaWNhdGVkIGJ5Ci0gICAgIFJFTF9IRFIyIGlmIGFueS4gIE9ubHkgdXNlZCBmb3IgYW4gb3V0cHV0IGZpbGUuICAqLwotICBpbnQgcmVsX2lkeDI7Ci0gIC8qIFVzZWQgYnkgdGhlIGJhY2tlbmQgbGlua2VyIHRvIHN0b3JlIHRoZSBzeW1ib2wgaGFzaCB0YWJsZSBlbnRyaWVzCi0gICAgIGFzc29jaWF0ZWQgd2l0aCByZWxvY3MgYWdhaW5zdCBnbG9iYWwgc3ltYm9scy4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hlczsKLSAgLyogQSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIHJlbG9jcy4gIElmIHRoZSBzZWN0aW9uIHVzZXMgUkVMIHJlbG9jcywKLSAgICAgcmF0aGVyIHRoYW4gUkVMQSwgYWxsIHRoZSByX2FkZGVuZCBmaWVsZHMgd2lsbCBiZSB6ZXJvLiAgVGhpcwotICAgICBwb2ludGVyIG1heSBiZSBOVUxMLiAgSXQgaXMgdXNlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIuICAqLwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAvKiBVc2VkIGJ5IHRoZSBiYWNrZW5kIGxpbmtlciB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSB0bwotICAgICByZWNvcmQgdGhlIGR5bmFtaWMgc3ltYm9sIGluZGV4IGZvciBhIHNlY3Rpb24gc3ltYm9sCi0gICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzZWN0aW9uLiAgQSB2YWx1ZSBvZiAwIG1lYW5zIHRoYXQgdGhlcmUgaXMKLSAgICAgbm8gZHluYW1pYyBzeW1ib2wgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIGxvbmcgZHluaW5keDsKLSAgLyogQSBwb2ludGVyIHVzZWQgZm9yIC5zdGFiIGxpbmtpbmcgb3B0aW1pemF0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci0gIC8qIEEgcG9pbnRlciBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgRUxGIGJhY2tlbmQuICAqLwotICBQVFIgdGRhdGE7Ci0gIC8qIE5vbnplcm8gaWYgdGhpcyBzZWN0aW9uIHVzZXMgUkVMQSByZWxvY2F0aW9ucywgcmF0aGVyIHRoYW4gUkVMLiAgKi8KLSAgdW5zaWduZWQgaW50IHVzZV9yZWxhX3A6MTsKLX07Ci0KLSNkZWZpbmUgZWxmX3NlY3Rpb25fZGF0YShzZWMpICAoKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSopc2VjLT51c2VkX2J5X2JmZCkKLQotI2RlZmluZSBnZXRfZWxmX2JhY2tlbmRfZGF0YShhYmZkKSBcCi0gICgoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKikgKGFiZmQpLT54dmVjLT5iYWNrZW5kX2RhdGEpCi0KLS8qIEVudW1lcmF0aW9uIHRvIHNwZWNpZnkgdGhlIHNwZWNpYWwgc2VjdGlvbi4gICovCi10eXBlZGVmIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0KLXsKLSAgTElOS0VSX1NFQ1RJT05fVU5LTk9XTiwJCS8qIG5vdCB1c2VkICovCi0gIExJTktFUl9TRUNUSU9OX0dPVCwJCQkvKiAuZ290IHNlY3Rpb24gZm9yIGdsb2JhbCBvZmZzZXQgcG9pbnRlcnMgKi8KLSAgTElOS0VSX1NFQ1RJT05fUExULAkJCS8qIC5wbHQgc2VjdGlvbiBmb3IgZ2VuZXJhdGVkIHByb2NlZHVyZSBzdHVicyAqLwotICBMSU5LRVJfU0VDVElPTl9TREFUQSwJCQkvKiAuc2RhdGEvLnNic3Mgc2VjdGlvbiBmb3IgUG93ZXJQQyAqLwotICBMSU5LRVJfU0VDVElPTl9TREFUQTIsCQkvKiAuc2RhdGEyLy5zYnNzMiBzZWN0aW9uIGZvciBQb3dlclBDICovCi0gIExJTktFUl9TRUNUSU9OX01BWAkJCS8qICMgb2YgbGlua2VyIHNlY3Rpb25zICovCi19IGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Q7Ci0KLS8qIFNlY3Rpb25zIGNyZWF0ZWQgYnkgdGhlIGxpbmtlci4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9saW5rZXJfc2VjdGlvbgotewotICBjaGFyICpuYW1lOwkJCQkvKiBuYW1lIG9mIHRoZSBzZWN0aW9uICovCi0gIGNoYXIgKnJlbF9uYW1lOwkJCS8qIG5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgLnJlbHssYX0uIHNlY3Rpb24gKi8KLSAgY2hhciAqYnNzX25hbWU7CQkJLyogbmFtZSBvZiBhIHJlbGF0ZWQgLmJzcyBzZWN0aW9uICovCi0gIGNoYXIgKnN5bV9uYW1lOwkJCS8qIG5hbWUgb2Ygc3ltYm9sIHRvIHJlZmVyZW5jZSB0aGlzIHNlY3Rpb24gKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247CQkJLyogcG9pbnRlciB0byB0aGUgc2VjdGlvbiAqLwotICBhc2VjdGlvbiAqYnNzX3NlY3Rpb247CQkvKiBwb2ludGVyIHRvIHRoZSBic3Mgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyAqLwotICBhc2VjdGlvbiAqcmVsX3NlY3Rpb247CQkvKiBwb2ludGVyIHRvIHRoZSByZWxvY2F0aW9ucyBuZWVkZWQgZm9yIHRoaXMgc2VjdGlvbiAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7CS8qIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgc3ltYm9sIGhhc2ggdmFsdWUgKi8KLSAgYmZkX3ZtYSBpbml0aWFsX3NpemU7CQkJLyogaW5pdGlhbCBzaXplIGJlZm9yZSBhbnkgbGlua2VyIGdlbmVyYXRlZCBhbGxvY2F0aW9ucyAqLwotICBiZmRfdm1hIHN5bV9vZmZzZXQ7CQkJLyogb2Zmc2V0IG9mIHN5bWJvbCBmcm9tIGJlZ2lubmluZyBvZiBzZWN0aW9uICovCi0gIGJmZF92bWEgaG9sZV9zaXplOwkJCS8qIHNpemUgb2YgcmVzZXJ2ZWQgYWRkcmVzcyBob2xlIGluIGFsbG9jYXRpb24gKi8KLSAgYmZkX3ZtYSBob2xlX29mZnNldDsJCQkvKiBjdXJyZW50IG9mZnNldCBmb3IgdGhlIGhvbGUgKi8KLSAgYmZkX3ZtYSBtYXhfaG9sZV9vZmZzZXQ7CQkvKiBtYXhpbXVtIG9mZnNldCBmb3IgdGhlIGhvbGUgKi8KLSAgZWxmX2xpbmtlcl9zZWN0aW9uX2VudW1fdCB3aGljaDsJLyogd2hpY2ggc2VjdGlvbiB0aGlzIGlzICovCi0gIGJvb2xlYW4gaG9sZV93cml0dGVuX3A7CQkvKiB3aGV0aGVyIHRoZSBob2xlIGhhcyBiZWVuIGluaXRpYWxpemVkICovCi0gIHVuc2lnbmVkIGludCBhbGlnbm1lbnQ7CQkvKiBhbGlnbm1lbnQgZm9yIHRoZSBzZWN0aW9uICovCi0gIGZsYWd3b3JkIGZsYWdzOwkJCS8qIGZsYWdzIHRvIHVzZSB0byBjcmVhdGUgdGhlIHNlY3Rpb24gKi8KLX0gZWxmX2xpbmtlcl9zZWN0aW9uX3Q7Ci0KLS8qIExpbmtlZCBsaXN0IG9mIGFsbG9jYXRlZCBwb2ludGVyIGVudHJpZXMuICBUaGlzIGhhbmdzIG9mZiBvZiB0aGUgc3ltYm9sIGxpc3RzLCBhbmQKLSAgIHByb3ZpZGVzIGFsbG93cyB1cyB0byByZXR1cm4gZGlmZmVyZW50IHBvaW50ZXJzLCBiYXNlZCBvbiBkaWZmZXJlbnQgYWRkZW5kJ3MuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMKLXsKLSAgc3RydWN0IGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVycyAqbmV4dDsJLyogbmV4dCBhbGxvY2F0ZWQgcG9pbnRlciBmb3IgdGhpcyBzeW1ib2wgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7CQkJCS8qIG9mZnNldCBvZiBwb2ludGVyIGZyb20gYmVnaW5uaW5nIG9mIHNlY3Rpb24gKi8KLSAgYmZkX3NpZ25lZF92bWEgYWRkZW5kOwkJCS8qIGFkZGVuZCB1c2VkICovCi0gIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2g7CQkvKiB3aGljaCBsaW5rZXIgc2VjdGlvbiB0aGlzIGlzICovCi0gIGJvb2xlYW4gd3JpdHRlbl9hZGRyZXNzX3A7CQkJLyogd2hldGhlciBhZGRyZXNzIHdhcyB3cml0dGVuIHlldCAqLwotfSBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdDsKLQotLyogU29tZSBwcml2YXRlIGRhdGEgaXMgc3Rhc2hlZCBhd2F5IGZvciBmdXR1cmUgdXNlIHVzaW5nIHRoZSB0ZGF0YSBwb2ludGVyCi0gICBpbiB0aGUgYmZkIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBlbGZfb2JqX3RkYXRhCi17Ci0gIEVsZl9JbnRlcm5hbF9FaGRyIGVsZl9oZWFkZXJbMV07CS8qIEFjdHVhbCBkYXRhLCBidXQgcmVmIGxpa2UgcHRyICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyICoqZWxmX3NlY3RfcHRyOwotICBFbGZfSW50ZXJuYWxfUGhkciAqcGhkcjsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqc2VnbWVudF9tYXA7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYl9wdHI7Ci0gIGludCBudW1fbG9jYWxzOwotICBpbnQgbnVtX2dsb2JhbHM7Ci0gIGFzeW1ib2wgKipzZWN0aW9uX3N5bXM7CQkvKiBTVFRfU0VDVElPTiBzeW1ib2xzIGZvciBlYWNoIHNlY3Rpb24gKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgc2hzdHJ0YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBzdHJ0YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW5zeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW5zdHJ0YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW52ZXJzeW1faGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW52ZXJyZWZfaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciBkeW52ZXJkZWZfaGRyOwotICB1bnNpZ25lZCBpbnQgc3ltdGFiX3NlY3Rpb24sIHNoc3RydGFiX3NlY3Rpb247Ci0gIHVuc2lnbmVkIGludCBzdHJ0YWJfc2VjdGlvbiwgZHluc3ltdGFiX3NlY3Rpb247Ci0gIHVuc2lnbmVkIGludCBkeW52ZXJzeW1fc2VjdGlvbiwgZHludmVyZGVmX3NlY3Rpb24sIGR5bnZlcnJlZl9zZWN0aW9uOwotICBmaWxlX3B0ciBuZXh0X2ZpbGVfcG9zOwotI2lmIDAKLSAgLyogd2UgZG9uJ3QgbmVlZCB0aGVzZSBpbnNpZGUgYmZkIGFueW1vcmUsIGFuZCBJIHRoaW5rCi0gICAgIHRoZXNlIHdlcmVuJ3QgdXNlZCBvdXRzaWRlIGJmZC4gKi8KLSAgdm9pZCAqcHJzdGF0dXM7CQkJLyogVGhlIHJhdyAvcHJvYyBwcnN0YXR1cyBzdHJ1Y3R1cmUgKi8KLSAgdm9pZCAqcHJwc2luZm87CQkJLyogVGhlIHJhdyAvcHJvYyBwcnBzaW5mbyBzdHJ1Y3R1cmUgKi8KLSNlbmRpZgotICBiZmRfdm1hIGdwOwkJCQkvKiBUaGUgZ3AgdmFsdWUgKE1JUFMgb25seSwgZm9yIG5vdykgKi8KLSAgdW5zaWduZWQgaW50IGdwX3NpemU7CQkJLyogVGhlIGdwIHNpemUgKE1JUFMgb25seSwgZm9yIG5vdykgKi8KLQotICAvKiBJbmZvcm1hdGlvbiBncmFiYmVkIGZyb20gYW4gZWxmIGNvcmUgZmlsZS4gKi8KLSAgaW50IGNvcmVfc2lnbmFsOwotICBpbnQgY29yZV9waWQ7Ci0gIGludCBjb3JlX2x3cGlkOwotICBjaGFyKiBjb3JlX3Byb2dyYW07Ci0gIGNoYXIqIGNvcmVfY29tbWFuZDsKLQotICAvKiBUaGlzIGlzIHNldCB0byB0cnVlIGlmIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgYnkgdGhlIGJhY2tlbmQKLSAgICAgbGlua2VyLiAgKi8KLSAgYm9vbGVhbiBsaW5rZXI7Ci0KLSAgLyogQSBtYXBwaW5nIGZyb20gZXh0ZXJuYWwgc3ltYm9scyB0byBlbnRyaWVzIGluIHRoZSBsaW5rZXIgaGFzaAotICAgICB0YWJsZSwgdXNlZCB3aGVuIGxpbmtpbmcuICBUaGlzIGlzIGluZGV4ZWQgYnkgdGhlIHN5bWJvbCBpbmRleAotICAgICBtaW51cyB0aGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgc3ltYm9sIHRhYmxlIGhlYWRlci4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSBsb2NhbCBzeW1ib2xzIHRvIG9mZnNldHMgaW50byB0aGUgZ2xvYmFsIG9mZnNldAotICAgICB0YWJsZSwgdXNlZCB3aGVuIGxpbmtpbmcuICBUaGlzIGlzIGluZGV4ZWQgYnkgdGhlIHN5bWJvbCBpbmRleC4KLSAgICAgTGlrZSBmb3IgdGhlIGdsb2JhbHMsIHdlIHVzZSBhIHVuaW9uIGFuZCB0d28gbmFtZXMgcHJpbWFyaWx5IHRvCi0gICAgIGRvY3VtZW50IHRoZSBpbnRlbnQgb2YgYW55IHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZS4gIFRoZSBmaWVsZAotICAgICBzaG91bGQgYmUgdXNlZCBhcyBhIGNvdW50IHVudGlsIHNpemVfZHluYW1pY19zZWN0aW9ucywgYXQgd2hpY2gKLSAgICAgcG9pbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuZ290IGlzIGZpeGVkLiAgQWZ0ZXJ3YXJkLCBpZiBhbiBlbnRyeQotICAgICBpcyAtMSwgdGhlbiB0aGUgc3ltYm9sIGRvZXMgbm90IHJlcXVpcmUgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hICpyZWZjb3VudHM7Ci0gICAgICBiZmRfdm1hICpvZmZzZXRzOwotICAgIH0gbG9jYWxfZ290OwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gb2Zmc2V0cyBpbnRvIHRoZSB2YXJpb3VzIGxpbmtlcgotICAgICBzZWN0aW9ucyBhZGRlZC4gIFRoaXMgaXMgaW5kZXggYnkgdGhlIHN5bWJvbCBpbmRleC4gICovCi0gIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoqbGlua2VyX3NlY3Rpb25fcG9pbnRlcnM7Ci0KLSAgLyogVGhlIGxpbmtlciBFTEYgZW11bGF0aW9uIGNvZGUgbmVlZHMgdG8gbGV0IHRoZSBiYWNrZW5kIEVMRiBsaW5rZXIKLSAgICAga25vdyB3aGF0IGZpbGVuYW1lIHNob3VsZCBiZSB1c2VkIGZvciBhIGR5bmFtaWMgb2JqZWN0IGlmIHRoZQotICAgICBkeW5hbWljIG9iamVjdCBpcyBmb3VuZCB1c2luZyBhIHNlYXJjaC4gIFRoZSBlbXVsYXRpb24gY29kZSB0aGVuCi0gICAgIHNvbWV0aW1lcyBuZWVkcyB0byBrbm93IHdoYXQgbmFtZSB3YXMgYWN0dWFsbHkgdXNlZC4gIFVudGlsIHRoZQotICAgICBmaWxlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBsaW5rZXIgc3ltYm9sIHRhYmxlLCB0aGlzIGZpZWxkIGhvbGRzCi0gICAgIHRoZSBuYW1lIHRoZSBsaW5rZXIgd2FudHMuICBBZnRlciBpdCBoYXMgYmVlbiBhZGRlZCwgaXQgaG9sZHMgdGhlCi0gICAgIG5hbWUgYWN0dWFsbHkgdXNlZCwgd2hpY2ggd2lsbCBiZSB0aGUgRFRfU09OQU1FIGVudHJ5IGlmIHRoZXJlIGlzCi0gICAgIG9uZS4gICovCi0gIGNvbnN0IGNoYXIgKmR0X25hbWU7Ci0KLSAgLyogSXJpeCA1IG9mdGVuIHNjcmV3cyB1cCB0aGUgc3ltYm9sIHRhYmxlLCBzb3J0aW5nIGxvY2FsIHN5bWJvbHMKLSAgICAgYWZ0ZXIgZ2xvYmFsIHN5bWJvbHMuICBUaGlzIGZsYWcgaXMgc2V0IGlmIHRoZSBzeW1ib2wgdGFibGUgaW4KLSAgICAgdGhpcyBCRkQgYXBwZWFycyB0byBiZSBzY3Jld2VkIHVwLiAgSWYgaXQgaXMsIHdlIGlnbm9yZSB0aGUKLSAgICAgc2hfaW5mbyBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlIGhlYWRlciwgYW5kIGFsd2F5cyByZWFkIGFsbCB0aGUKLSAgICAgc3ltYm9scy4gICovCi0gIGJvb2xlYW4gYmFkX3N5bXRhYjsKLQotICAvKiBSZWNvcmRzIHRoZSByZXN1bHQgb2YgYGdldF9wcm9ncmFtX2hlYWRlcl9zaXplJy4gICovCi0gIGJmZF9zaXplX3R5cGUgcHJvZ3JhbV9oZWFkZXJfc2l6ZTsKLQotICAvKiBVc2VkIGJ5IGZpbmRfbmVhcmVzdF9saW5lIGVudHJ5IHBvaW50LiAgKi8KLSAgUFRSIGxpbmVfaW5mbzsKLQotICAvKiBVc2VkIGJ5IE1JUFMgRUxGIGZpbmRfbmVhcmVzdF9saW5lIGVudHJ5IHBvaW50LiAgVGhlIHN0cnVjdHVyZQotICAgICBjb3VsZCBiZSBpbmNsdWRlZCBkaXJlY3RseSBpbiB0aGlzIG9uZSwgYnV0IHRoZXJlJ3Mgbm8gcG9pbnQgdG8KLSAgICAgd2FzdGluZyB0aGUgbWVtb3J5IGp1c3QgZm9yIHRoZSBpbmZyZXF1ZW50bHkgY2FsbGVkCi0gICAgIGZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSAqZmluZF9saW5lX2luZm87Ci0KLSAgLyogQSBwbGFjZSB0byBzdGFzaCBkd2FyZjEgaW5mbyBmb3IgdGhpcyBiZmQuICovCi0gIHN0cnVjdCBkd2FyZjFfZGVidWcgKmR3YXJmMV9maW5kX2xpbmVfaW5mbzsKLQotICAvKiBBIHBsYWNlIHRvIHN0YXNoIGR3YXJmMiBpbmZvIGZvciB0aGlzIGJmZC4gKi8KLSAgc3RydWN0IGR3YXJmMl9kZWJ1ZyAqZHdhcmYyX2ZpbmRfbGluZV9pbmZvOwotCi0gIC8qIEFuIGFycmF5IG9mIHN0dWIgc2VjdGlvbnMgaW5kZXhlZCBieSBzeW1ib2wgbnVtYmVyLCB1c2VkIGJ5IHRoZQotICAgICBNSVBTIEVMRiBsaW5rZXIuICBGSVhNRTogV2Ugc2hvdWxkIGZpZ3VyZSBvdXQgc29tZSB3YXkgdG8gb25seQotICAgICBpbmNsdWRlIHRoaXMgZmllbGQgZm9yIGEgTUlQUyBFTEYgdGFyZ2V0LiAgKi8KLSAgYXNlY3Rpb24gKipsb2NhbF9zdHViczsKLQotICAvKiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgZV9mbGFncyBmaWVsZCBoYXMgYmVlbiBpbml0aWFsaXplZCAqLwotICBib29sZWFuIGZsYWdzX2luaXQ7Ci0KLSAgLyogTnVtYmVyIG9mIHN5bWJvbCB2ZXJzaW9uIGRlZmluaXRpb25zIHdlIGFyZSBhYm91dCB0byBlbWl0LiAgKi8KLSAgdW5zaWduZWQgaW50IGN2ZXJkZWZzOwotCi0gIC8qIE51bWJlciBvZiBzeW1ib2wgdmVyc2lvbiByZWZlcmVuY2VzIHdlIGFyZSBhYm91dCB0byBlbWl0LiAgKi8KLSAgdW5zaWduZWQgaW50IGN2ZXJyZWZzOwotCi0gIC8qIFN5bWJvbCB2ZXJzaW9uIGRlZmluaXRpb25zIGluIGV4dGVybmFsIG9iamVjdHMuICAqLwotICBFbGZfSW50ZXJuYWxfVmVyZGVmICp2ZXJkZWY7Ci0KLSAgLyogU3ltYm9sIHZlcnNpb24gcmVmZXJlbmNlcyB0byBleHRlcm5hbCBvYmplY3RzLiAgKi8KLSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnZlcnJlZjsKLQotICAvKiBMaW5rZXIgc2VjdGlvbnMgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4gICovCi0gIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb24gKmxpbmtlcl9zZWN0aW9uWyAoaW50KUxJTktFUl9TRUNUSU9OX01BWCBdOwotfTsKLQotI2RlZmluZSBlbGZfdGRhdGEoYmZkKQkJKChiZmQpIC0+IHRkYXRhLmVsZl9vYmpfZGF0YSkKLSNkZWZpbmUgZWxmX2VsZmhlYWRlcihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBlbGZfaGVhZGVyKQotI2RlZmluZSBlbGZfZWxmc2VjdGlvbnMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZWxmX3NlY3RfcHRyKQotI2RlZmluZSBlbGZfc2hzdHJ0YWIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gc3RydGFiX3B0cikKLSNkZWZpbmUgZWxmX29uZXN5bXRhYihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBzeW10YWJfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2R5bnN5bXRhYihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkeW5zeW10YWJfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2R5bnZlcnN5bShiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkeW52ZXJzeW1fc2VjdGlvbikKLSNkZWZpbmUgZWxmX2R5bnZlcmRlZihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkeW52ZXJkZWZfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2R5bnZlcnJlZihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkeW52ZXJyZWZfc2VjdGlvbikKLSNkZWZpbmUgZWxmX251bV9sb2NhbHMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gbnVtX2xvY2FscykKLSNkZWZpbmUgZWxmX251bV9nbG9iYWxzKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IG51bV9nbG9iYWxzKQotI2RlZmluZSBlbGZfc2VjdGlvbl9zeW1zKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHNlY3Rpb25fc3ltcykKLSNkZWZpbmUgY29yZV9wcnBzaW5mbyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBwcnBzaW5mbykKLSNkZWZpbmUgY29yZV9wcnN0YXR1cyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBwcnN0YXR1cykKLSNkZWZpbmUgZWxmX2dwKGJmZCkJCShlbGZfdGRhdGEoYmZkKSAtPiBncCkKLSNkZWZpbmUgZWxmX2dwX3NpemUoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZ3Bfc2l6ZSkKLSNkZWZpbmUgZWxmX3N5bV9oYXNoZXMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gc3ltX2hhc2hlcykKLSNkZWZpbmUgZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMoYmZkKSAoZWxmX3RkYXRhKGJmZCkgLT4gbG9jYWxfZ290LnJlZmNvdW50cykKLSNkZWZpbmUgZWxmX2xvY2FsX2dvdF9vZmZzZXRzKGJmZCkgKGVsZl90ZGF0YShiZmQpIC0+IGxvY2FsX2dvdC5vZmZzZXRzKQotI2RlZmluZSBlbGZfbG9jYWxfcHRyX29mZnNldHMoYmZkKSAoZWxmX3RkYXRhKGJmZCkgLT4gbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMpCi0jZGVmaW5lIGVsZl9kdF9uYW1lKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGR0X25hbWUpCi0jZGVmaW5lIGVsZl9iYWRfc3ltdGFiKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGJhZF9zeW10YWIpCi0jZGVmaW5lIGVsZl9mbGFnc19pbml0KGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGZsYWdzX2luaXQpCi0jZGVmaW5lIGVsZl9saW5rZXJfc2VjdGlvbihiZmQsbikgKGVsZl90ZGF0YShiZmQpIC0+IGxpbmtlcl9zZWN0aW9uWyhpbnQpbl0pCi0MCi1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1ZlcmRlZiAqLCBFbGZfSW50ZXJuYWxfVmVyZGVmICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1ZlcmRlZiAqLCBFbGZfRXh0ZXJuYWxfVmVyZGVmICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1ZlcmRhdXggKiwgRWxmX0ludGVybmFsX1ZlcmRhdXggKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1ZlcmRhdXggKiwgRWxmX0V4dGVybmFsX1ZlcmRhdXggKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqLCBFbGZfSW50ZXJuYWxfVmVybmVlZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfVmVybmVlZCAqLCBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJuYXV4ICosIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJuYXV4ICosIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyc3ltX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfVmVyc3ltICosIEVsZl9JbnRlcm5hbF9WZXJzeW0gKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJzeW1fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfVmVyc3ltICosIEVsZl9FeHRlcm5hbF9WZXJzeW0gKikpOwotCi1leHRlcm4gaW50IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGNoYXIgKmJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkLCB1bnNpZ25lZCkpOwotZXh0ZXJuIGNoYXIgKmJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCkpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLWV4dGVybiB2b2lkIGJmZF9lbGZfcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwKLQkJCQkJICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLSNkZWZpbmUgZWxmX3N0cmluZ19mcm9tX2VsZl9zdHJ0YWIoYWJmZCxzdHJpbmRleCkgXAotICAgICBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uKGFiZmQsZWxmX2VsZmhlYWRlcihhYmZkKS0+ZV9zaHN0cm5keCxzdHJpbmRleCkKLQotI2RlZmluZSBiZmRfZWxmMzJfcHJpbnRfc3ltYm9sCWJmZF9lbGZfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGJmZF9lbGY2NF9wcmludF9zeW1ib2wJYmZkX2VsZl9wcmludF9zeW1ib2wKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYmZkX2VsZl9oYXNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCQkgICAgYXJlbGVudCAqLAotCQkJCQkJCSAgICBhc3ltYm9sICosCi0JCQkJCQkJICAgIFBUUiwKLQkJCQkJCQkgICAgYXNlY3Rpb24gKiwKLQkJCQkJCQkgICAgYmZkICosCi0JCQkJCQkJICAgIGNoYXIgKiopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGZfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGZfbWtjb3JlZmlsZSBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIEVsZl9JbnRlcm5hbF9TaGRyICpiZmRfZWxmX2ZpbmRfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgRWxmX0ludGVybmFsX1NoZHIgKmhkciwgY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkcgotICBQQVJBTVMgKChiZmQgKmFiZmQsIEVsZl9JbnRlcm5hbF9QaGRyICpoZHIsIGludCBpbmRleCwgY29uc3QgY2hhciAqdHlwZW5hbWUpKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmQgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwKLQkJCQkJCSAgICAgICBmaWxlX3B0ciwKLQkJCQkJCSAgICAgICBiZmRfc2l6ZV90eXBlKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGxvbmcgX2JmZF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9jYW5vbmljYWxpemVfcmVsb2MgUEFSQU1TICgoYmZkICosIHNlY19wdHIsCi0JCQkJCQkgIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwKLQkJCQkJCQkgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGFzeW1ib2wgKl9iZmRfZWxmX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICAgICAgIHN5bWJvbF9pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGFsZW50ICpfYmZkX2VsZl9nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLQkJCQkJCXVuc2lnbmVkIGxvbmcpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJICAgIGFzeW1ib2wgKiosCi0JCQkJCQkgICAgYmZkX3ZtYSwgQ09OU1QgY2hhciAqKiwKLQkJCQkJCSAgICBDT05TVCBjaGFyICoqLAotCQkJCQkJICAgIHVuc2lnbmVkIGludCAqKSk7Ci0jZGVmaW5lIF9iZmRfZWxmX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgX2JmZF9lbGZfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi1leHRlcm4gaW50IF9iZmRfZWxmX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9pbml0X3JlbG9jX3NoZHIgCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqLCBib29sZWFuKSk7Ci0KLS8qIElmIHRoZSB0YXJnZXQgZG9lc24ndCBoYXZlIHJlbG9jIGhhbmRsaW5nIHdyaXR0ZW4geWV0OiAgKi8KLWV4dGVybiB2b2lkIF9iZmRfZWxmX25vX2luZm9fdG9faG93dG8gUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwKLQkJCQkJICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX3NlY3Rpb25fZnJvbV9zaGRyIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQgc2hpbmRleCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3NlY3Rpb25fZnJvbV9waGRyIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLQotZXh0ZXJuIGludCBfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci0KLWFzZWN0aW9uICpiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50KSk7Ci1ib29sZWFuIF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1ib29sZWFuCi1fYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLWxvbmcKLV9iZmRfZWxmX2xpbmtfbG9va3VwX2xvY2FsX2R5bmluZHggUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgIGJmZCAqLCBsb25nKSk7Ci1ib29sZWFuCi1fYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotdm9pZCBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyBQQVJBTVMgKChiZmQgKikpOwotZmlsZV9wdHIgX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gUEFSQU1TICgoRWxmX0ludGVybmFsX1NoZHIgKiwKLQkJCQkJCQkgICAgZmlsZV9wdHIsCi0JCQkJCQkJICAgIGJvb2xlYW4pKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKikpOwotCi1ib29sZWFuIF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1ib29sZWFuIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci11bnNpZ25lZCBsb25nIF9iZmRfZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcyBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZWxmX2xpbmtlcl9zZWN0aW9uX3QgKl9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKmFiZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bSwKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqZGVmYXVsdHMpKTsKLQotZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKl9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbgotICBQQVJBTVMgKChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqbGlua2VyX3BvaW50ZXJzLAotCSAgIGJmZF9zaWduZWRfdm1hIGFkZGVuZCwKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fZW51bV90IHdoaWNoKSk7Ci0KLWJvb2xlYW4gYmZkX2VsZjMyX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgY29uc3QgRWxmMzJfSW50ZXJuYWxfUmVsYSAqcmVsKSk7Ci0KLWJmZF92bWEgYmZkX2VsZjMyX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2FiZmQsCi0JICAgYmZkICppbnB1dF9iZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0LAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAotCSAgIGJmZF92bWEgcmVsb2NhdGlvbiwKLQkgICBjb25zdCBFbGYzMl9JbnRlcm5hbF9SZWxhICpyZWwsCi0JICAgaW50IHJlbGF0aXZlX3JlbG9jKSk7Ci0KLWJvb2xlYW4gYmZkX2VsZjY0X2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgY29uc3QgRWxmNjRfSW50ZXJuYWxfUmVsYSAqcmVsKSk7Ci0KLWJmZF92bWEgYmZkX2VsZjY0X2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2FiZmQsCi0JICAgYmZkICppbnB1dF9iZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0LAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAotCSAgIGJmZF92bWEgcmVsb2NhdGlvbiwKLQkgICBjb25zdCBFbGY2NF9JbnRlcm5hbF9SZWxhICpyZWwsCi0JICAgaW50IHJlbGF0aXZlX3JlbG9jKSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhCi0gIFBBUkFNUyAoKGJmZCAqZHlub2JqLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdCwKLQkgICBpbnQgYWxpZ25tZW50KSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGZjb3JlX3NlY3Rpb25fZnJvbV9waGRyCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGYzMl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGYzMl9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNoYXIgKmJmZF9lbGYzMl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IGJmZF9lbGYzMl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICosCi0JCQkJCQkJCSBiZmQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1N5bSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY19pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfUmVsICosIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICosIEVsZjMyX0V4dGVybmFsX1JlbCAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9waGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9QaGRyICosIEVsZl9JbnRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3BoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBFbGYzMl9FeHRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX2R5bl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgUFRSLCBFbGZfSW50ZXJuYWxfRHluICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9EeW4gKiwgUFRSKSk7Ci1leHRlcm4gbG9uZyBiZmRfZWxmMzJfc2x1cnBfc3ltYm9sX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfd3JpdGVfc2hkcnNfYW5kX2VoZHIgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgYmZkX2VsZjMyX3dyaXRlX291dF9waGRycwotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgaW50KSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBFbGZfSW50ZXJuYWxfUmVsYSAqX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIEVsZl9JbnRlcm5hbF9SZWxhICosIGJvb2xlYW4pKTsKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGY2NF9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGY2NF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNoYXIgKmJmZF9lbGY2NF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IGJmZF9lbGY2NF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICosCi0JCQkJCQkJCSBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X2JmZF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9TeW0gKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosIFBUUikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2NfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0V4dGVybmFsX1JlbCAqLCBFbGZfSW50ZXJuYWxfUmVsICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3JlbG9jX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbCAqLCBFbGY2NF9FeHRlcm5hbF9SZWwgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZjY0X0V4dGVybmFsX1JlbGEgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcGhkcl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUGhkciAqLCBFbGZfSW50ZXJuYWxfUGhkciAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9waGRyX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgRWxmNjRfRXh0ZXJuYWxfUGhkciAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9keW5faW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9keW5fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfRHluICosIFBUUikpOwotZXh0ZXJuIGxvbmcgYmZkX2VsZjY0X3NsdXJwX3N5bWJvbF90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X3dyaXRlX3NoZHJzX2FuZF9laGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IGJmZF9lbGY2NF93cml0ZV9vdXRfcGhkcnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZF92bWEsIGJmZF92bWEpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gRWxmX0ludGVybmFsX1JlbGEgKl9iZmRfZWxmNjRfbGlua19yZWFkX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBib29sZWFuKSk7Ci0KLSNkZWZpbmUgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIFwKLSAgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgYmZkX2VsZjY0X2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIFwKLSAgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wKLQotYm9vbGVhbiBfYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBsb25nKSk7Ci1ib29sZWFuIF9iZmRfZWxmNjRfbGlua19yZWNvcmRfbG9jYWxfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGxvbmcpKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIFBUUiwKLSAgICAgICAgICAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotYm9vbGVhbiBfYmZkX2VsZjMyX2djX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLWJvb2xlYW4gX2JmZF9lbGYzMl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotYm9vbGVhbiBfYmZkX2VsZjMyX2djX2NvbW1vbl9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1ib29sZWFuIF9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgYmZkX3ZtYSkpOwotYm9vbGVhbiBfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBiZmRfdm1hKSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci1ib29sZWFuIF9iZmRfZWxmNjRfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19jb21tb25fZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotYm9vbGVhbiBfYmZkX2VsZjY0X2djX3JlY29yZF92dGluaGVyaXQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIGJmZF92bWEpKTsKLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19yZWNvcmRfdnRlbnRyeQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgYmZkX3ZtYSkpOwotCi0vKiBNSVBTIEVMRiBzcGVjaWZpYyByb3V0aW5lcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBhc2VjdGlvbiAqIF9iZmRfbWlwc19lbGZfZ2NfbWFya19ob29rIAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfZ2Nfc3dlZXBfaG9vayAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosIAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfbWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIAotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBpbnQgX2JmZF9taXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotCi0jZW5kaWYgLyogX0xJQkVMRl9IXyAqLwpkaWZmIC0tZ2l0IGEvYmZkL2VsZi1ocHBhLmggYi9iZmQvZWxmLWhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljYzE3ZS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLWhwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NzkgKzAsMCBAQAotLyogQ29tbW9uIGNvZGUgZm9yIFBBIEVMRiBpbXBsZW1lbnRhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBFTEZfSE9XVE9fVEFCTEVfU0laRSAgICAgICBSX1BBUklTQ19VTklNUExFTUVOVEVEICsgMQotCi0vKiBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgbXVsdGlwbGUgUEEgRUxGIEJGRCBiYWNrZW5kcyB3aXRoIGRpZmZlcmVudAotICAgc2l6ZXMuCi0KLSAgIE1vc3Qgb2YgdGhlIHJvdXRpbmVzIGFyZSB3cml0dGVuIHRvIGJlIHNpemUgaW5kZXBlbmRlbnQsIGJ1dCBzb21ldGltZXMKLSAgIGV4dGVybmFsIGNvbnN0cmFpbnRzIHJlcXVpcmUgMzIgb3IgNjQgYml0IHNwZWNpZmljIGNvZGUuICBXZSByZW1hcAotICAgdGhlIGRlZmluaXRpb25zL2Z1bmN0aW9ucyBhcyBuZWNlc3NhcnkgaGVyZS4gICovCi0jaWYgQVJDSF9TSVpFID09IDY0Ci0jZGVmaW5lIEVMRl9SX1RZUEUoWCkgICBFTEY2NF9SX1RZUEUoWCkKLSNkZWZpbmUgRUxGX1JfU1lNKFgpICAgRUxGNjRfUl9TWU0oWCkKLSNkZWZpbmUgX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSBfYmZkX2VsZjY0X2hwcGFfZ2VuX3JlbG9jX3R5cGUKLSNkZWZpbmUgZWxmX2hwcGFfcmVsb2NhdGVfc2VjdGlvbiBlbGY2NF9ocHBhX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZl9iZmRfZmluYWxfbGluayBiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsKLSNkZWZpbmUgZWxmX2hwcGFfZmluYWxfbGluayBlbGY2NF9ocHBhX2ZpbmFsX2xpbmsKLSNlbmRpZgotI2lmIEFSQ0hfU0laRSA9PSAzMgotI2RlZmluZSBFTEZfUl9UWVBFKFgpICAgRUxGMzJfUl9UWVBFKFgpCi0jZGVmaW5lIEVMRl9SX1NZTShYKSAgIEVMRjMyX1JfU1lNKFgpCi0jZGVmaW5lIF9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUgX2JmZF9lbGYzMl9ocHBhX2dlbl9yZWxvY190eXBlCi0jZGVmaW5lIGVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24gZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGZfYmZkX2ZpbmFsX2xpbmsgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCi0jZGVmaW5lIGVsZl9ocHBhX2ZpbmFsX2xpbmsgZWxmMzJfaHBwYV9maW5hbF9saW5rCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotICAgICAgICAgICBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmX2hwcGFfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmQgKiwgYmZkICosIGFzZWN0aW9uICosCi0gICAgICAgICAgIGJmZF9ieXRlICosIGJmZF92bWEsIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0gICAgICAgICAgIGFzZWN0aW9uICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgc3RydWN0IGVsZjY0X2hwcGFfZHluX2hhc2hfZW50cnkgKikpOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2hwcGFfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfaHBwYV9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9ocHBhX3VubWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2hwcGFfcmVtYXJrX3VzZWxlc3NfZHluYW1pY19zeW1ib2xzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgdm9pZCBlbGZfaHBwYV9yZWNvcmRfc2VnbWVudF9hZGRycwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLS8qIEVMRi9QQSByZWxvY2F0aW9uIGhvd3RvIGVudHJpZXMuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfaHBwYV9ob3d0b190YWJsZVtFTEZfSE9XVE9fVEFCTEVfU0laRV0gPQotewotICB7Ul9QQVJJU0NfTk9ORSwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19OT05FIn0sCi0KLSAgLyogVGhlIHZhbHVlcyBpbiBESVIzMiBhcmUgdG8gcGxhY2F0ZSB0aGUgY2hlY2sgaW4KLSAgICAgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICB7Ul9QQVJJU0NfRElSMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjMyIiwgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsIGZhbHNlfSwKLSAge1JfUEFSSVNDX0RJUjIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMjFMIn0sCi0gIHtSX1BBUklTQ19ESVIxN1IsIDAsIDAsIDE3LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE3UiJ9LAotICB7Ul9QQVJJU0NfRElSMTdGLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxN0YifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRElSMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxNFIifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDMyLCAwLCAwLCAzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMzIifSwKLQotICB7Ul9QQVJJU0NfUENSRUwyMUwsIDAsIDAsIDIxLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwyMUwifSwKLSAge1JfUEFSSVNDX1BDUkVMMTdSLCAwLCAwLCAxNywgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTdSIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE3RiwgMCwgMCwgMTcsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE3RiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxN0MsIDAsIDAsIDE3LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxN0MifSwKLSAge1JfUEFSSVNDX1BDUkVMMTRSLCAwLCAwLCAxNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTRSIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE0RiwgMCwgMCwgMTQsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE0RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RQUkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19EUFJFTDIxTCJ9LAotICB7Ul9QQVJJU0NfRFBSRUwxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RQUkVMMTRXUiJ9LAotCi0gIHtSX1BBUklTQ19EUFJFTDE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRFBSRUwxNERSIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RQUkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19EUFJFTDE0UiJ9LAotICB7Ul9QQVJJU0NfRFBSRUwxNEYsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RQUkVMMTRGIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRExUUkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRSRUwyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfRExUUkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRSRUwxNFIifSwKLSAge1JfUEFSSVNDX0RMVFJFTDE0RiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUUkVMMTRGIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRExUSU5EMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRJTkQyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RMVElORDE0UiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUSU5EMTRSIn0sCi0gIHtSX1BBUklTQ19ETFRJTkQxNEYsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RMVElORDE0RiJ9LAotCi0gIHtSX1BBUklTQ19TRVRCQVNFLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1NFVEJBU0UifSwKLSAge1JfUEFSSVNDX1NFQ1JFTDMyLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1NFQ1JFTDMyIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMjFMIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMTdSLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMTdSIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMTdGLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMTdGIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxNFIifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxNEYsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxNEYifSwKLSAge1JfUEFSSVNDX1NFR0JBU0UsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfU0VHQkFTRSJ9LAotICB7Ul9QQVJJU0NfU0VHUkVMMzIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfU0VHUkVMMzIifSwKLQotICB7Ul9QQVJJU0NfUExUT0ZGMjFMLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjIxTCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfUExUT0ZGMTRSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE0UiJ9LAotICB7Ul9QQVJJU0NfUExUT0ZGMTRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE0RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9GUFRSMzIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjMyIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9GUFRSMjFMLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjE0UiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9GUFRSMTRSIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0ZQVFI2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19GUFRSNjQifSwKLSAge1JfUEFSSVNDX1BMQUJFTDMyLCAwLCAwLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTEFCRUwzMiJ9LAotICB7Ul9QQVJJU0NfUExBQkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTEFCRUwyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfUExBQkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTEFCRUwxNFIifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfUENSRUw2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDY0In0sCi0gIHtSX1BBUklTQ19QQ1JFTDIyQywgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDIyQyJ9LAotICB7Ul9QQVJJU0NfUENSRUwyMkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwyMkYifSwKLSAge1JfUEFSSVNDX1BDUkVMMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE0V1IifSwKLSAge1JfUEFSSVNDX1BDUkVMMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QQ1JFTDE0RFIifSwKLSAge1JfUEFSSVNDX1BDUkVMMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BDUkVMMTZGIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxNldGIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE2REYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxNkRGIn0sCi0KLSAge1JfUEFSSVNDX0RJUjY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjY0In0sCi0gIHtSX1BBUklTQ19OT05FLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX05PTkUifSwKLSAge1JfUEFSSVNDX05PTkUsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTk9ORSJ9LAotICB7Ul9QQVJJU0NfRElSMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxNFdSIn0sCi0gIHtSX1BBUklTQ19ESVIxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0RJUjE0RFIifSwKLSAge1JfUEFSSVNDX0RJUjE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxNkYifSwKLSAge1JfUEFSSVNDX0RJUjE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRElSMTZXRiJ9LAotICB7Ul9QQVJJU0NfRElSMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ESVIxNkRGIn0sCi0gIHtSX1BBUklTQ19HUFJFTDY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0dQUkVMNjQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RMVFJFTDE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUUkVMMTRXUiJ9LAotICB7Ul9QQVJJU0NfRExUUkVMMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRSRUwxNERSIn0sCi0gIHtSX1BBUklTQ19HUFJFTDE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19HUFJFTDE2RiJ9LAotICB7Ul9QQVJJU0NfR1BSRUwxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0dQUkVMMTZXRiJ9LAotICB7Ul9QQVJJU0NfR1BSRUwxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0dQUkVMMTZERiJ9LAotICB7Ul9QQVJJU0NfTFRPRkY2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRjY0In0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRExUSU5EMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19ETFRJTkQxNFdSIn0sCi0KLSAge1JfUEFSSVNDX0RMVElORDE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfRExUSU5EMTREUiJ9LAotICB7Ul9QQVJJU0NfTFRPRkYxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkYxNkYifSwKLSAge1JfUEFSSVNDX0xUT0ZGMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRjE2REYifSwKLSAge1JfUEFSSVNDX0xUT0ZGMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRjE2REYifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19CU0VSRUwxNFdSIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMTREUiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1NFR1JFTDY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1NFR1JFTDY0In0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfUExUT0ZGMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTFRPRkYxNFdSIn0sCi0gIHtSX1BBUklTQ19QTFRPRkYxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1BMVE9GRjE0RFIifSwKLSAge1JfUEFSSVNDX1BMVE9GRjE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTFRPRkYxNkYifSwKLSAge1JfUEFSSVNDX1BMVE9GRjE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfUExUT0ZGMTZXRiJ9LAotICB7Ul9QQVJJU0NfUExUT0ZGMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19QTFRPRkYxNkRGIn0sCi0KLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFI2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjE0V1IifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9GUFRSMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIxNkYifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIxNldGIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9GUFRSMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19DT1BZLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0NPUFkifSwKLSAge1JfUEFSSVNDX0lQTFQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfSVBMVCJ9LAotCi0gIHtSX1BBUklTQ19FUExULCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0VQTFQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1RQUkVMMzIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVFBSRUwzMiJ9LAotICB7Ul9QQVJJU0NfVFBSRUwyMUwsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVFBSRUwyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1RQUkVMMTRSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1RQUkVMMTRSIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMjFMLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX0xUT0ZGX1RQMjFMIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9UUDE0UiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9UUDE0RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9UUDE0RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1RQUkVMNjQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVFBSRUw2NCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1RQUkVMMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19UUFJFTDE0V1IifSwKLQotICB7Ul9QQVJJU0NfVFBSRUwxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1RQUkVMMTREUiJ9LAotICB7Ul9QQVJJU0NfVFBSRUwxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfVFBSRUwxNkYifSwKLSAge1JfUEFSSVNDX1RQUkVMMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19UUFJFTDE2V0YifSwKLSAge1JfUEFSSVNDX1RQUkVMMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19UUFJFTDE2REYifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQNjQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl9QQVJJU0NfTFRPRkZfVFA2NCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTRXUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9UUDE0V1IifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9UUDE0RFIifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX0xUT0ZGX1RQMTZGIn0sCi0KLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9UUDE2V0YifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSX1BBUklTQ19MVE9GRl9UUDE2REYifSwKLX07Ci0KLSNkZWZpbmUgT0ZGU0VUXzE0Ul9GUk9NXzIxTCA0Ci0jZGVmaW5lIE9GRlNFVF8xNEZfRlJPTV8yMUwgNQotCi0vKiBSZXR1cm4gb25lIChvciBtb3JlKSBCRkQgcmVsb2NhdGlvbnMgd2hpY2ggaW1wbGVtZW50IHRoZSBiYXNlCi0gICByZWxvY2F0aW9uIHdpdGggbW9kaWZpY2F0aW9ucyBiYXNlZCBvbiBmb3JtYXQgYW5kIGZpZWxkLiAgKi8KLQotZWxmX2hwcGFfcmVsb2NfdHlwZSAqKgotX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSAoYWJmZCwgYmFzZV90eXBlLCBmb3JtYXQsIGZpZWxkLCBpZ25vcmUsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbGZfaHBwYV9yZWxvY190eXBlIGJhc2VfdHlwZTsKLSAgICAgaW50IGZvcm1hdDsKLSAgICAgaW50IGZpZWxkOwotICAgICBpbnQgaWdub3JlOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGVsZl9ocHBhX3JlbG9jX3R5cGUgKmZpbmFsdHlwZTsKLSAgZWxmX2hwcGFfcmVsb2NfdHlwZSAqKmZpbmFsX3R5cGVzOwotCi0gIC8qIEFsbG9jYXRlIHNsb3RzIGZvciB0aGUgQkZEIHJlbG9jYXRpb24uICAqLwotICBmaW5hbF90eXBlcyA9ICgoZWxmX2hwcGFfcmVsb2NfdHlwZSAqKikKLQkJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChlbGZfaHBwYV9yZWxvY190eXBlICopICogMikpOwotICBpZiAoZmluYWxfdHlwZXMgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHJlbG9jYXRpb24gaXRzZWxmLiAgKi8KLSAgZmluYWx0eXBlID0gKChlbGZfaHBwYV9yZWxvY190eXBlICopCi0JICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChlbGZfaHBwYV9yZWxvY190eXBlKSkpOwotICBpZiAoZmluYWx0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU29tZSByZWFzb25hYmxlIGRlZmF1bHRzLiAgKi8KLSAgZmluYWxfdHlwZXNbMF0gPSBmaW5hbHR5cGU7Ci0gIGZpbmFsX3R5cGVzWzFdID0gTlVMTDsKLQotI2RlZmluZSBmaW5hbF90eXBlIGZpbmFsdHlwZVswXQotCi0gIGZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0KLSAgLyogSnVzdCBhIHRhbmdsZSBvZiBuZXN0ZWQgc3dpdGNoIHN0YXRlbWVudHMgdG8gZGVhbCB3aXRoIHRoZSBicmFpbmRhbWFnZQotICAgICB0aGF0IGEgZGlmZmVyZW50IGZpZWxkIHNlbGVjdG9yIG1lYW5zIGEgY29tcGxldGVseSBkaWZmZXJlbnQgcmVsb2NhdGlvbgotICAgICBmb3IgUEEgRUxGLiAgKi8KLSAgc3dpdGNoIChiYXNlX3R5cGUpCi0gICAgewotICAgIC8qIFdlIGhhdmUgYmVlbiB1c2luZyBnZW5lcmljIHJlbG9jYXRpb24gdHlwZXMuICBIb3dldmVyLCB0aGF0IG1heSBub3QKLSAgICAgICByZWFsbHkgbWFrZSBzZW5zZS4gIEFueXdheSwgd2UgbmVlZCB0byBzdXBwb3J0IGJvdGggUl9QQVJJU0NfRElSNjQKLSAgICAgICBhbmQgUl9QQVJJU0NfRElSMzIgaGVyZS4gICovCi0gICAgY2FzZSBSX1BBUklTQ19ESVIzMjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjY0OgotICAgIGNhc2UgUl9IUFBBX0FCU19DQUxMOgotICAgICAgc3dpdGNoIChmb3JtYXQpCi0JewotCWNhc2UgMTQ6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9yc2VsOgotCSAgICBjYXNlIGVfcnJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RJUjE0UjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX3J0c2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ETFRJTkQxNFI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9ydHBzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfdHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRExUSU5EMTRGOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfcnBzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BMQUJFTDE0UjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDE3OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMTdGOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfcnNlbDoKLQkgICAgY2FzZSBlX3Jyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ESVIxN1I7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyMToKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2xzZWw6Ci0JICAgIGNhc2UgZV9scnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMjFMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfbHRzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RMVElORDIxTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2x0cHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfTFRPRkZfRlBUUjIxTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2xwc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QTEFCRUwyMUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAzMjoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RJUjMyOwotCSAgICAgIC8qIFdoZW4gaW4gNjRiaXQgbW9kZSwgYSAzMmJpdCByZWxvY2F0aW9uIGlzIHN1cHBvc2VkIHRvCi0JCSBiZSBhIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gIER3YXJmMiAoZm9yIGV4YW1wbGUpCi0JCSB1c2VzIDMyYml0IHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotCSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MgIT0gMzIpCi0JICAgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfU0VDUkVMMzI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9wc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QTEFCRUwzMjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDY0OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSNjQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9wc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19GUFRSNjQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSFBQQV9HT1RPRkY6Ci0gICAgICBzd2l0Y2ggKGZvcm1hdCkKLQl7Ci0JY2FzZSAxNDoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX3JzZWw6Ci0JICAgIGNhc2UgZV9ycnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gYmFzZV90eXBlICsgT0ZGU0VUXzE0Ul9GUk9NXzIxTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IGJhc2VfdHlwZSArIE9GRlNFVF8xNEZfRlJPTV8yMUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyMToKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2xyc2VsOgotCSAgICBjYXNlIGVfbHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBSX0hQUEFfUENSRUxfQ0FMTDoKLSAgICAgIHN3aXRjaCAoZm9ybWF0KQotCXsKLQljYXNlIDE0OgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfcnNlbDoKLQkgICAgY2FzZSBlX3Jyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QQ1JFTDE0UjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMTRGOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgMTc6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9yc2VsOgotCSAgICBjYXNlIGVfcnJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMTdSOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUENSRUwxN0Y7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyMjoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMjJGOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgMjE6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9sc2VsOgotCSAgICBjYXNlIGVfbHJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMjFMOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9QQVJJU0NfU0VHUkVMMzI6Ci0gICAgY2FzZSBSX1BBUklTQ19TRUdCQVNFOgotICAgICAgLyogVGhlIGRlZmF1bHRzIGFyZSBmaW5lIGZvciB0aGVzZSBjYXNlcy4gICovCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpbmFsX3R5cGVzOwotfQotCi0vKiBUcmFuc2xhdGUgZnJvbSBhbiBlbGYgaW50byBmaWVsZCBpbnRvIGEgaG93dG8gcmVsb2NhdGlvbiBwb2ludGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZl9ocHBhX2luZm9fdG9faG93dG8gKGFiZmQsIGJmZF9yZWxvYywgZWxmX3JlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmJmZF9yZWxvYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmVsZl9yZWxvYzsKLXsKLSAgQkZEX0FTU0VSVCAoRUxGX1JfVFlQRShlbGZfcmVsb2MtPnJfaW5mbykKLQkgICAgICA8ICh1bnNpZ25lZCBpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpOwotICBiZmRfcmVsb2MtPmhvd3RvID0gJmVsZl9ocHBhX2hvd3RvX3RhYmxlW0VMRl9SX1RZUEUgKGVsZl9yZWxvYy0+cl9pbmZvKV07Ci19Ci0KLS8qIFRyYW5zbGF0ZSBmcm9tIGFuIGVsZiBpbnRvIGZpZWxkIGludG8gYSBob3d0byByZWxvY2F0aW9uIHBvaW50ZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmX2hwcGFfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGJmZF9yZWxvYywgZWxmX3JlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmJmZF9yZWxvYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbCAqZWxmX3JlbG9jOwotewotICBCRkRfQVNTRVJUIChFTEZfUl9UWVBFKGVsZl9yZWxvYy0+cl9pbmZvKQotCSAgICAgIDwgKHVuc2lnbmVkIGludCkgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCk7Ci0gIGJmZF9yZWxvYy0+aG93dG8gPSAmZWxmX2hwcGFfaG93dG9fdGFibGVbRUxGX1JfVFlQRSAoZWxmX3JlbG9jLT5yX2luZm8pXTsKLX0KLQotLyogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBob3d0byB0YWJsZSBlbnRyeSB0byBwZXJmb3JtIHRoZSBDT0RFCi0gICByZWxvY2F0aW9uIGZvciBhbiBBUkNIIG1hY2hpbmUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaWYgKChpbnQpIGNvZGUgPCAoaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKChpbnQpIGVsZl9ocHBhX2hvd3RvX3RhYmxlWyhpbnQpIGNvZGVdLnR5cGUgPT0gKGludCkgY29kZSk7Ci0gICAgICByZXR1cm4gJmVsZl9ocHBhX2hvd3RvX3RhYmxlWyhpbnQpIGNvZGVdOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfaHBwYV9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXI7Ci17Ci0gIGludCBtYWNoID0gYmZkX2dldF9tYWNoIChhYmZkKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPSB+KEVGX1BBUklTQ19BUkNIIHwgRUZfUEFSSVNDX1RSQVBOSUwKLQkJCQkgICAgIHwgRUZfUEFSSVNDX0VYVCB8IEVGX1BBUklTQ19MU0IKLQkJCQkgICAgIHwgRUZfUEFSSVNDX1dJREUgfCBFRl9QQVJJU0NfTk9fS0FCUAotCQkJCSAgICAgfCBFRl9QQVJJU0NfTEFaWVNXQVApOwotCi0gIGlmIChtYWNoID09IDEwKQotICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGQV9QQVJJU0NfMV8wOwotICBlbHNlIGlmIChtYWNoID09IDExKQotICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGQV9QQVJJU0NfMV8xOwotICBlbHNlIGlmIChtYWNoID09IDIwKQotICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGQV9QQVJJU0NfMl8wOwotICBlbHNlIGlmIChtYWNoID09IDI1KQotICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IChFRl9QQVJJU0NfV0lERQotCQkJCSAgICAgIHwgRUZBX1BBUklTQ18yXzAKLQkJCQkgICAgICAvKiBUaGUgR05VIHRvb2xzIGhhdmUgdHJhcHBlZCB3aXRob3V0Ci0JCQkJCSBvcHRpb24gc2luY2UgMTk5Mywgc28gbmVlZCB0byB0YWtlCi0JCQkJCSBhIHN0ZXAgYmFja3dhcmRzIHdpdGggdGhlIEVMRgotCQkJCQkgYmFzZWQgdG9vbGNoYWlucy4gICovCi0JCQkJICAgICAgfCBFRl9QQVJJU0NfVFJBUE5JTCk7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIFNZTSByZXByZXNlbnRzIGEgbG9jYWwgbGFiZWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyQnKTsKLX0KLQotLyogU2V0IHRoZSBjb3JyZWN0IHR5cGUgZm9yIGFuIEVMRiBzZWN0aW9uLiAgV2UgZG8gdGhpcyBieSB0aGUKLSAgIHNlY3Rpb24gbmFtZSwgd2hpY2ggaXMgYSBoYWNrLCBidXQgb3VnaHQgdG8gd29yay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaHBwYV9mYWtlX3NlY3Rpb25zIChhYmZkLCBoZHIsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBFbGY2NF9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICIuUEFSSVNDLnVud2luZCIpID09IDApCi0gICAgewotICAgICAgaW50IGluZHg7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX0xPUFJPQyArIDE7Ci0gICAgICAvKiA/IT8gSG93IGFyZSB1bndpbmRzIHN1cHBvc2VkIHRvIHdvcmsgZm9yIHN5bWJvbHMgaW4gYXJiaXRyYXJ5Ci0JIHNlY3Rpb25zPyAgT3Igd2hhdCBpZiB3ZSBoYXZlIG11bHRpcGxlIC50ZXh0IHNlY3Rpb25zIGluIGEgc2luZ2xlCi0JIC5vIGZpbGU/ICBIUCByZWFsbHkgbWVzc2VkIHVwIG9uIHRoaXMgb25lLgotCi0JIFVnaC4gIFdlIGNhbiBub3QgdXNlIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4IGF0IHRoaXMKLQkgcG9pbnQgYmVjYXVzZSBpdCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LgotCi0JIFNvIHdlIChnYXNwKSByZWNvbXB1dGUgaXQgaGVyZS4gIEhvcGVmdWxseSBub2JvZHkgZXZlciBjaGFuZ2VzIHRoZQotCSB3YXkgc2VjdGlvbnMgYXJlIG51bWJlcmVkIGluIGVsZi5jISAgKi8KLSAgICAgIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnMsIGluZHggPSAxOyBzZWM7IHNlYyA9IHNlYy0+bmV4dCwgaW5keCsrKQotCXsKLQkgIGlmIChzZWMtPm5hbWUgJiYgc3RyY21wIChzZWMtPm5hbWUsICIudGV4dCIpID09IDApCi0JICAgIHsKLQkgICAgICBoZHItPnNoX2luZm8gPSBpbmR4OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJIGhhdmUgbm8gaWRlYSBpZiB0aGlzIGlzIHJlYWxseSBuZWNlc3Nhcnkgb3Igd2hhdCBpdCBtZWFucy4gICovCi0gICAgICBoZHItPnNoX2VudHNpemUgPSA0OwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBIUCdzIGxpYnJhcmllcyBkZWZpbmUgc3ltYm9scyB3aXRoIEhQIHNwZWNpZmljIHNlY3Rpb24KLSAgIGluZGljZXMsIHdoaWNoIHdlIGhhdmUgdG8gaGFuZGxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3AgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICBpbnQgaW5kZXggPSBzeW0tPnN0X3NobmR4OwotCi0gIHN3aXRjaCAoaW5kZXgpCi0gICAgewotICAgIGNhc2UgU0hOX1BBUklTQ19BTlNJX0NPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLlBBUklTQy5hbnNpLmNvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9QQVJJU0NfSFVHRV9DT01NT046Ci0gICAgICAqc2VjcCA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5QQVJJU0MuaHVnZS5jb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX3VubWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKWRhdGE7Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhpcyBzeW1ib2wgaXMKLSAgICAgcmVmZXJlbmNlZCBieSBhIHNoYXJlZCBsaWJyYXJ5IGJ1dCBpcyBub3QgZGVmaW5lZCBhbnl3aGVyZSwgdGhlbgotICAgICB0aGUgZ2VuZXJpYyBjb2RlIHdpbGwgd2FybiB0aGF0IGl0IGlzIHVuZGVmaW5lZC4KLQotICAgICBUaGlzIGJlaGF2aW9yIGlzIHVuZGVzaXJhYmxlIG9uIEhQcyBzaW5jZSB0aGUgc3RhbmRhcmQgc2hhcmVkCi0gICAgIGxpYnJhcmllcyBjb250YWluIHJlZXJlbmNlcyB0byB1bmRlZmluZWQgc3ltYm9scy4KLQotICAgICBTbyB3ZSB0d2lkZGxlIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggc3VjaCBzeW1ib2xzIHNvIHRoYXQgdGhleQotICAgICB3aWxsIG5vdCB0cmlnZ2VyIHRoZSB3YXJuaW5nLiAgPyE/IEZJWE1FLiAgVGhpcyBpcyBob3JyaWJseSBmcmFnbGllLgotCi0gICAgIFVsdGltYXRlbHkgd2Ugc2hvdWxkIGhhdmUgYmV0dGVyIGNvbnRyb2xzIG92ZXIgdGhlIGdlbmVyaWMgRUxGIEJGRAotICAgICBsaW5rZXIgY29kZS4gICovCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgISAoaW5mby0+c2hhcmVkCi0JICAgICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwKQotICAgIHsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUM7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IDB4ODAwMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9ocHBhX3JlbWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKWRhdGE7Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhpcyBzeW1ib2wgaXMKLSAgICAgcmVmZXJlbmNlZCBieSBhIHNoYXJlZCBsaWJyYXJ5IGJ1dCBpcyBub3QgZGVmaW5lZCBhbnl3aGVyZSwgdGhlbgotICAgICB0aGUgZ2VuZXJpYyBjb2RlIHdpbGwgd2FybiB0aGF0IGl0IGlzIHVuZGVmaW5lZC4KLQotICAgICBUaGlzIGJlaGF2aW9yIGlzIHVuZGVzaXJhYmxlIG9uIEhQcyBzaW5jZSB0aGUgc3RhbmRhcmQgc2hhcmVkCi0gICAgIGxpYnJhcmllcyBjb250YWluIHJlZXJlbmNlcyB0byB1bmRlZmluZWQgc3ltYm9scy4KLQotICAgICBTbyB3ZSB0d2lkZGxlIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggc3VjaCBzeW1ib2xzIHNvIHRoYXQgdGhleQotICAgICB3aWxsIG5vdCB0cmlnZ2VyIHRoZSB3YXJuaW5nLiAgPyE/IEZJWE1FLiAgVGhpcyBpcyBob3JyaWJseSBmcmFnaWxlLgotCi0gICAgIFVsdGltYXRlbHkgd2Ugc2hvdWxkIGhhdmUgYmV0dGVyIGNvbnRyb2xzIG92ZXIgdGhlIGdlbmVyaWMgRUxGIEJGRAotICAgICBsaW5rZXIgY29kZS4gICovCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgISAoaW5mby0+c2hhcmVkCi0JICAgICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgPT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIDB4ODAwMCkgIT0gMCkKLSAgICB7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUM7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH4weDgwMDA7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgdGhlIGxvd2VzdCBhZGRyZXNzIGZvciB0aGUgZGF0YSBhbmQgdGV4dCBzZWdtZW50cy4gICovCi1zdGF0aWMgdm9pZAotZWxmX2hwcGFfcmVjb3JkX3NlZ21lbnRfYWRkcnMgKGFiZmQsIHNlY3Rpb24sIGRhdGEpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvOwotICBiZmRfdm1hIHZhbHVlOwotIAotICBocHBhX2luZm8gPSAoc3RydWN0IGVsZjY0X2hwcGFfbGlua19oYXNoX3RhYmxlICopZGF0YTsKLQotICB2YWx1ZSA9IHNlY3Rpb24tPnZtYSAtIHNlY3Rpb24tPmZpbGVwb3M7Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWSkKLSAgICAgICA9PSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkpKQotICAgICAgJiYgdmFsdWUgPCBocHBhX2luZm8tPnRleHRfc2VnbWVudF9iYXNlKQotICAgIGhwcGFfaW5mby0+dGV4dF9zZWdtZW50X2Jhc2UgPSB2YWx1ZTsKLSAgZWxzZSBpZiAoKHNlY3Rpb24tPmZsYWdzICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZKQotICAgICAgID09IChTRUNfQUxMT0MgfCBTRUNfTE9BRCkpCi0gICAgICAmJiB2YWx1ZSA8IGhwcGFfaW5mby0+ZGF0YV9zZWdtZW50X2Jhc2UpCi0gICAgaHBwYV9pbmZvLT5kYXRhX3NlZ21lbnRfYmFzZSA9IHZhbHVlOwotfQotCi0vKiBDYWxsZWQgYWZ0ZXIgd2UgaGF2ZSBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMvc2VjdGlvbnMsIGJ1dCBiZWZvcmUKLSAgIGZpbmFsIHN5bWJvbCByZXNvbHV0aW9uIGFuZCBzZWN0aW9uIHBsYWNlbWVudCBoYXMgYmVlbiBkZXRlcm1pbmVkLgotCi0gICBXZSB1c2UgdGhpcyBob29rIHRvIChwb3NzaWJseSkgcHJvdmlkZSBhIHZhbHVlIGZvciBfX2dwLCB0aGVuIHdlCi0gICBmYWxsIGJhY2sgdG8gdGhlIGdlbmVyaWMgRUxGIGZpbmFsIGxpbmsgcm91dGluZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaHBwYV9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBib29sZWFuIHJldHZhbDsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmdwOwotICAgICAgYmZkX3ZtYSBncF92YWw7Ci0gICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKmhwcGFfaW5mbzsKLQotICAgICAgaHBwYV9pbmZvID0gZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICAgICAgLyogVGhlIGxpbmtlciBzY3JpcHQgZGVmaW5lcyBhIHZhbHVlIGZvciBfX2dwIGlmZiBpdCB3YXMgcmVmZXJlbmNlZAotCSBieSBvbmUgb2YgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkLiAgRmlyc3QgdHJ5IHRvIGZpbmQgdGhlIHN5bWJvbAotCSBpbiB0aGUgaGFzaCB0YWJsZS4gIElmIHRoYXQgZmFpbHMsIGp1c3QgY29tcHV0ZSB0aGUgdmFsdWUgX19ncAotCSBzaG91bGQgaGF2ZSBoYWQuICAqLwotICAgICAgZ3AgPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAiX19ncCIsIGZhbHNlLAotCQkJCSBmYWxzZSwgZmFsc2UpOwotCi0gICAgICBpZiAoZ3ApCi0JewotCi0JICAvKiBBZGp1c3QgdGhlIHZhbHVlIG9mIF9fZ3AgYXMgd2UgbWF5IHdhbnQgdG8gc2xpZGUgaXQgaW50byB0aGUKLQkgICAgIC5wbHQgc2VjdGlvbiBzbyB0aGF0IHRoZSBzdHVicyBjYW4gYWNjZXNzIFBMVCBlbnRyaWVzIHdpdGhvdXQKLQkgICAgIHVzaW5nIGFuIGFkZGlsIHNlcXVlbmNlLiAgKi8KLQkgIGdwLT5yb290LnUuZGVmLnZhbHVlICs9IGVsZjY0X2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdwX29mZnNldDsKLQotCSAgZ3BfdmFsID0gKGdwLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgZ3AtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgKyBncC0+cm9vdC51LmRlZi52YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0gIAotCi0JICAvKiBGaXJzdCBsb29rIGZvciBhIC5wbHQgc2VjdGlvbi4gIElmIGZvdW5kLCB0aGVuIF9fZ3AgaXMgdGhlCi0JICAgICBhZGRyZXNzIG9mIHRoZSAucGx0ICsgZ3Bfb2Zmc2V0LgotCi0JICAgICBJZiBubyAucGx0IGlzIGZvdW5kLCB0aGVuIGxvb2sgZm9yIC5kbHQsIC5vcGQgYW5kIC5kYXRhIChpbgotCSAgICAgdGhhdCBvcmRlcikgYW5kIHNldCBfX2dwIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2Ygd2hpY2hldmVyIHNlY3Rpb24KLQkgICAgaXMgZm91bmQgZmlyc3QuICAqLwotCi0JICBzZWMgPSBocHBhX2luZm8tPnBsdF9zZWM7Ci0JICBpZiAoc2VjKQotCSAgICBncF92YWwgPSAoc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgaHBwYV9pbmZvLT5ncF9vZmZzZXQpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gaHBwYV9pbmZvLT5kbHRfc2VjOwotCSAgICAgIGlmICghc2VjKQotCQlzZWMgPSBocHBhX2luZm8tPm9wZF9zZWM7Ci0JICAgICAgaWYgKCFzZWMpCi0JCXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRhdGEiKTsKLQkgICAgICBpZiAoIXNlYykKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgZ3BfdmFsID0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJbnN0YWxsIHdoYXRldmVyIHZhbHVlIHdlIGZvdW5kL2NvbXB1dGVkIGZvciBfX2dwLiAgKi8KLSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChhYmZkLCBncF92YWwpOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGtub3cgdGhlIGJhc2Ugb2YgdGhlIHRleHQgYW5kIGRhdGEgc2VnbWVudHMgc28gdGhhdCB3ZQotICAgICBjYW4gcGVyZm9ybSBTRUdSRUwgcmVsb2NhdGlvbnMuICBXZSB3aWxsIHJlY29yZSB0aGUgYmFzZSBhZGRyZXNzZXMKLSAgICAgd2hlbiB3ZSBlbmNvdW50ZXIgdGhlIGZpcnN0IFNFR1JFTCByZWxvY2F0aW9uLiAgKi8KLSAgZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+dGV4dF9zZWdtZW50X2Jhc2UgPSAoYmZkX3ZtYSktMTsKLSAgZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+ZGF0YV9zZWdtZW50X2Jhc2UgPSAoYmZkX3ZtYSktMTsKLQotICAvKiBIUCdzIHNoYXJlZCBsaWJyYXJpZXMgaGF2ZSByZWZlcmVuY2VzIHRvIHN5bWJvbHMgdGhhdCBhcmUgbm90Ci0gICAgIGRlZmluZWQgYW55d2hlcmUuICBUaGUgZ2VuZXJpYyBFTEYgQkZEIGxpbmtlciBjb2RlIHdpbGwgY29tcGxhaW0KLSAgICAgYWJvdXQgc3VjaCBzeW1ib2xzLgotCi0gICAgIFNvIHdlIGRldGVjdCB0aGUgbG9zaW5nIGNhc2UgYW5kIGFycmFuZ2UgZm9yIHRoZSBmbGFncyBvbiB0aGUgc3ltYm9sCi0gICAgIHRvIGluZGljYXRlIHRoYXQgaXQgd2FzIG5ldmVyIHJlZmVyZW5jZWQuICBUaGlzIGtlZXBzIHRoZSBnZW5lcmljCi0gICAgIEVMRiBCRkQgbGluayBjb2RlIGhhcHB5IGFuZCBhcHBlYXJzIHRvIG5vdCBjcmVhdGUgYW55IHNlY29uZGFyeQotICAgICBwcm9ibGVtcy4gIFVsdGltYXRlbHkgd2UgbmVlZCBhIHdheSB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiB0aGUKLSAgICAgZ2VuZXJpYyBFTEYgQkZEIGxpbmsgY29kZSBiZXR0ZXIuICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9ocHBhX3VubWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scywKLQkJCSAgaW5mbyk7Ci0KLSAgLyogSW52b2tlIHRoZSByZWd1bGFyIEVMRiBiYWNrZW5kIGxpbmtlciB0byBkbyBhbGwgdGhlIHdvcmsuICAqLwotICByZXR2YWwgPSBiZmRfZWxmX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKTsKLQotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9ocHBhX3JlbWFya191c2VsZXNzX2R5bmFtaWNfc3ltYm9scywKLQkJCSAgaW5mbyk7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyogUmVsb2NhdGUgYW4gSFBQQSBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotICBzdHJ1Y3QgZWxmNjRfaHBwYV9saW5rX2hhc2hfdGFibGUgKmhwcGFfaW5mbyA9IGVsZjY0X2hwcGFfaGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gZWxmX2hwcGFfaG93dG9fdGFibGUgKyBFTEZfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0gICAgICBjaGFyICpkeW5fbmFtZTsKLSAgICAgIGNoYXIgKmR5bmhfYnVmID0gTlVMTDsKLSAgICAgIHNpemVfdCBkeW5oX2J1ZmxlbiA9IDA7Ci0gICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqZHluX2ggPSBOVUxMOwotCi0gICAgICByX3R5cGUgPSBFTEZfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc3ltX3NlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHN5bV9zZWMtPm91dHB1dF9vZmZzZXQ7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHN5bV9zZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICAvKiBUaGlzIGlzIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHN5bV9zZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTgotCQkJICAgPyAwIDogc3ltLT5zdF92YWx1ZSkKLQkJCSArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCSArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIFBBNjQgZHluYW1pYyBoYXNoCi0JICAgICB0YWJsZSwgdGhlbiBnZXQgaXQuICAqLwotCSAgZHluX25hbWUgPSBnZXRfZHluX25hbWUgKGlucHV0X2JmZCwgaCwgcmVsLAotCQkJCSAgICZkeW5oX2J1ZiwgJmR5bmhfYnVmbGVuKTsKLQkgIGR5bl9oID0gZWxmNjRfaHBwYV9keW5faGFzaF9sb29rdXAgKCZocHBhX2luZm8tPmR5bl9oYXNoX3RhYmxlLAotCQkJCQkgICAgICBkeW5fbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGlzIG5vdCBhIGxvY2FsIHN5bWJvbC4gICovCi0JICBsb25nIGluZHg7Ci0KLQkgIGluZHggPSByX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHN5bV9zZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIFBBNjQgZHluYW1pYyBoYXNoCi0JCSB0YWJsZSwgdGhlbiBnZXQgaXQuICAqLwotCSAgICAgIGR5bl9uYW1lID0gZ2V0X2R5bl9uYW1lIChpbnB1dF9iZmQsIGgsIHJlbCwKLQkJCQkgICAgICAgJmR5bmhfYnVmLCAmZHluaF9idWZsZW4pOwotCSAgICAgIGR5bl9oID0gZWxmNjRfaHBwYV9keW5faGFzaF9sb29rdXAgKCZocHBhX2luZm8tPmR5bl9oYXNoX3RhYmxlLAotCQkJCQkJICBkeW5fbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQotCSAgICAgIC8qIElmIHdlIGhhdmUgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiBhCi0JCSBzaGFyZWQgbGlicmFyeSBhbmQgd2UgaGF2ZSBub3QgY3JlYXRlZCBhbiBlbnRyeSBpbiB0aGUKLQkJIFBBNjQgZHluYW1pYyBzeW1ib2wgaGFzaCB0YWJsZSBmb3IgaXQsIHRoZW4gd2UgbG9zZS4gICovCi0JICAgICAgaWYgKHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwgJiYgZHluX2ggPT0gTlVMTCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiB3YXJuaW5nOiB1bnJlc29sdmFibGUgcmVsb2NhdGlvbiBhZ2FpbnN0IHN5bWJvbCBgJXMnIGZyb20gJXMgc2VjdGlvbiIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24pCi0JCXJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCSAgICAgIC8qIFZhbHVlIHdpbGwgYmUgcHJvdmlkZWQgdmlhIG9uZSBvZiB0aGUgb2Zmc2V0cyBpbiB0aGUKLQkJIGR5bl9oIGhhc2ggdGFibGUgZW50cnkuICAqLwotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQkgIC8qIEFsbG93IHVuZGVmaW5lZCBzeW1ib2xzIGluIHNoYXJlZCBsaWJyYXJpZXMuICAqLwotICAgICAgICAgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLQkgICAgewotCSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgUEE2NCBkeW5hbWljIGhhc2gKLQkJIHRhYmxlLCB0aGVuIGdldCBpdC4gICovCi0JICAgICAgZHluX25hbWUgPSBnZXRfZHluX25hbWUgKGlucHV0X2JmZCwgaCwgcmVsLAotCQkJCSAgICAgICAmZHluaF9idWYsICZkeW5oX2J1Zmxlbik7Ci0JICAgICAgZHluX2ggPSBlbGY2NF9ocHBhX2R5bl9oYXNoX2xvb2t1cCAoJmhwcGFfaW5mby0+ZHluX2hhc2hfdGFibGUsCi0JCQkJCQkgIGR5bl9uYW1lLCBmYWxzZSwgZmFsc2UpOwotCi0JICAgICAgaWYgKGR5bl9oID09IE5VTEwpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaCAhPSBOVUxMKQotCXN5bV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkgICAgICBzeW0tPnN0X25hbWUpOwotCSAgaWYgKHN5bV9uYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICgqc3ltX25hbWUgPT0gJ1wwJykKLQkgICAgc3ltX25hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHN5bV9zZWMpOwotCX0KLQotICAgICAgciA9IGVsZl9ocHBhX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKHJlbCwgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkJcmVsb2NhdGlvbiwgaW5mbywgc3ltX3NlYywKLQkJCQkJaCwgZHluX2gpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAoaW5mbywgc3ltX25hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBDb21wdXRlIHRoZSB2YWx1ZSBmb3IgYSByZWxvY2F0aW9uIChSRUwpIGR1cmluZyBhIGZpbmFsIGxpbmsgc3RhZ2UsCi0gICB0aGVuIGluc2VydCB0aGUgdmFsdWUgaW50byB0aGUgcHJvcGVyIGxvY2F0aW9uIGluIENPTlRFTlRTLiAKLQotICAgVkFMVUUgaXMgYSB0ZW50YXRpdmUgdmFsdWUgZm9yIHRoZSByZWxvY2F0aW9uIGFuZCBtYXkgYmUgb3ZlcnJpZGRlbgotICAgYW5kIG1vZGlmaWVkIGhlcmUgYmFzZWQgb24gdGhlIHNwZWNpZmljIHJlbG9jYXRpb24gdG8gYmUgcGVyZm9ybWVkLgotCi0gICBGb3IgZXhhbXBsZSB3ZSBkbyBjb252ZXJzaW9ucyBmb3IgUEMtcmVsYXRpdmUgYnJhbmNoZXMgaW4gdGhpcyByb3V0aW5lCi0gICBvciByZWRpcmVjdGlvbiBvZiBjYWxscyB0byBleHRlcm5hbCByb3V0aW5lcyB0byBzdHVicy4gCi0KLSAgIFRoZSB3b3JrIG9mIGFjdHVhbGx5IGFwcGx5aW5nIHRoZSByZWxvY2F0aW9uIGlzIGxlZnQgdG8gYSBoZWxwZXIKLSAgIHJvdXRpbmUgaW4gYW4gYXR0ZW1wdCB0byByZWR1Y2UgdGhlIGNvbXBsZXhpdHkgYW5kIHNpemUgb2YgdGhpcwotICAgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGZfaHBwYV9maW5hbF9saW5rX3JlbG9jYXRlIChyZWwsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCB2YWx1ZSwKLQkJCSAgICAgIGluZm8sIHN5bV9zZWMsIGgsIGR5bl9oKQotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgZWxmNjRfaHBwYV9keW5faGFzaF9lbnRyeSAqZHluX2g7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgYmZkX3ZtYSBvZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotICBiZmRfdm1hIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gZWxmX2hwcGFfaG93dG9fdGFibGUgKyBFTEZfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gIHVuc2lnbmVkIGxvbmcgcl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIHVuc2lnbmVkIGxvbmcgcl9maWVsZCA9IGVfZnNlbDsKLSAgYmZkX2J5dGUgKmhpdF9kYXRhID0gY29udGVudHMgKyBvZmZzZXQ7Ci0gIHN0cnVjdCBlbGY2NF9ocHBhX2xpbmtfaGFzaF90YWJsZSAqaHBwYV9pbmZvID0gZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSk7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9QQVJJU0NfTk9ORToKLSAgICAgIGJyZWFrOwotCi0gICAgLyogUmFuZG9tIFBDIHJlbGF0aXZlIHJlbG9jcy4gICovCi0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZERjoKLSAgICAgIHsKLQlpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMjFMKQotCSAgcl9maWVsZCA9IGVfbHNlbDsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUENSRUwxNEYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19QQ1JFTDE2RgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTZXRgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTZERikKLQkgIHJfZmllbGQgPSBlX2ZzZWw7Ci0JZWxzZQotCSAgcl9maWVsZCA9IGVfcnNlbDsKLQotCS8qIElmIHRoaXMgaXMgYSBjYWxsIHRvIGEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhbm90aGVyIGR5bmFtaWMKLQkgICBsaWJyYXJ5LCB0aGVuIHJlZGlyZWN0IHRoZSBjYWxsIHRvIHRoZSBsb2NhbCBzdHViIGZvciB0aGlzCi0JICAgZnVuY3Rpb24uICAqLwotCWlmIChzeW1fc2VjID09IE5VTEwgfHwgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgIHZhbHVlID0gKGR5bl9oLT5zdHViX29mZnNldCArIGhwcGFfaW5mby0+c3R1Yl9zZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBocHBhX2luZm8tPnN0dWJfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgCi0JLyogVHVybiBWQUxVRSBpbnRvIGEgcHJvcGVyIFBDIHJlbGF0aXZlIGFkZHJlc3MuICAqLwotCXZhbHVlIC09IChvZmZzZXQgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotCS8qIEFkanVzdCBmb3IgYW55IGZpZWxkIHNlbGVjdG9ycy4gICovCi0JdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIC04ICsgYWRkZW5kLCByX2ZpZWxkKTsKLQotCS8qIEFwcGx5IHRoZSByZWxvY2F0aW9uIHRvIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gICovCi0JaW5zbiA9IGVsZl9ocHBhX3JlbG9jYXRlX2luc24gKGluc24sIHZhbHVlLCByX3R5cGUpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgLyogQmFzaWMgZnVuY3Rpb24gY2FsbCBzdXBwb3J0LiAgSSdtIG5vdCBlbnRpcmVseSBzdXJlIGlmIFBDUkVMMTRGIGlzCi0gICAgICAgYWN0dWFsbHkgbmVlZGVkIG9yIGV2ZW4gaGFuZGxlZCBjb3JyZWN0bHkuCi0KLSAgICAgICBOb3RlIGZvciBhIGNhbGwgdG8gYSBmdW5jdGlvbiBkZWZpbmVkIGluIGFub3RoZXIgZHluYW1pYyBsaWJyYXJ5Ci0gICAgICAgd2Ugd2FudCB0byByZWRpcmVjdCB0aGUgY2FsbCB0byBhIHN0dWIuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwyMkY6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMjJDOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN0M6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3UjoKLSAgICAgIHsKLQlpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTdSKQotCSAgcl9maWVsZCA9IGVfcnNlbDsKLQllbHNlCi0JICByX2ZpZWxkID0gZV9mc2VsOwotCi0JLyogSWYgdGhpcyBpcyBhIGNhbGwgdG8gYSBmdW5jdGlvbiBkZWZpbmVkIGluIGFub3RoZXIgZHluYW1pYwotCSAgIGxpYnJhcnksIHRoZW4gcmVkaXJlY3QgdGhlIGNhbGwgdG8gdGhlIGxvY2FsIHN0dWIgZm9yIHRoaXMKLQkgICBmdW5jdGlvbi4gICovCi0JaWYgKHN5bV9zZWMgPT0gTlVMTCB8fCBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCSAgdmFsdWUgPSAoZHluX2gtPnN0dWJfb2Zmc2V0ICsgaHBwYV9pbmZvLT5zdHViX3NlYy0+b3V0cHV0X29mZnNldAotCQkgICArIGhwcGFfaW5mby0+c3R1Yl9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotICAKLQkvKiBUdXJuIFZBTFVFIGludG8gYSBwcm9wZXIgUEMgcmVsYXRpdmUgYWRkcmVzcy4gICovCi0JdmFsdWUgLT0gKG9mZnNldCArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JLyogQWRqdXN0IGZvciBhbnkgZmllbGQgc2VsZWN0b3JzLiAgKi8KLQl2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgLTggKyBhZGRlbmQsIGVfZnNlbCk7Ci0KLQkvKiBBbGwgYnJhbmNoZXMgYXJlIGltcGxpY2l0bHkgc2hpZnRlZCBieSAyIHBsYWNlcy4gICovCi0JdmFsdWUgPj49IDI7Ci0KLQkvKiBBcHBseSB0aGUgcmVsb2NhdGlvbiB0byB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICAqLwotCWluc24gPSBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuIChpbnNuLCB2YWx1ZSwgcl90eXBlKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIC8qIEluZGlyZWN0IHJlZmVyZW5jZXMgdG8gZGF0YSB0aHJvdWdoIHRoZSBETFQuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMTRGOgotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RMVElORDE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX0ZQVFIyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0Y6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNkRGOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkYxNkY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2V0Y6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2REY6Ci0gICAgICB7Ci0JLyogSWYgdGhpcyByZWxvY2F0aW9uIHdhcyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCB0aGVuIHdlIHN0aWxsCi0JICAgaGF2ZSBub3Qgc2V0IHVwIHRoZSBETFQgZW50cnkgKGl0J3Mgbm90IGNvbnZpZW5lbnQgdG8gZG8gc28KLQkgICBpbiB0aGUgImZpbmFsaXplX2RsdCIgcm91dGluZSBiZWNhdXNlIGl0IGlzIGRpZmZpY3VsdCB0byBnZXQKLQkgICB0byB0aGUgbG9jYWwgc3ltYm9sJ3MgdmFsdWUpLgotCi0JICAgU28sIGlmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wgKGggPT0gTlVMTCksIHRoZW4gd2UgbmVlZCB0bwotCSAgIGZpbGwgaW4gaXRzIERMVCBlbnRyeS4gCi0KLQkgICBTaW1pbGFybHkgd2UgbWF5IHN0aWxsIG5lZWQgdG8gc2V0IHVwIGFuIGVudHJ5IGluIC5vcGQgZm9yCi0JICAgYSBsb2NhbCBmdW5jdGlvbiB3aGljaCBoYWQgaXRzIGFkZHJlc3MgdGFrZW4uICAqLwotCWlmIChkeW5faC0+aCA9PSBOVUxMKQotCSAgewotCSAgICBiZmRfcHV0XzY0IChocHBhX2luZm8tPmRsdF9zZWMtPm93bmVyLAotCQkJdmFsdWUsCi0JCQlocHBhX2luZm8tPmRsdF9zZWMtPmNvbnRlbnRzICsgZHluX2gtPmRsdF9vZmZzZXQpOwotCi0JICAgIC8qIE5vdyBoYW5kbGUgLm9wZCBjcmVhdGlvbiBpZiBuZWVkZWQuICAqLwotCSAgICBpZiAocl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIKLQkJfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSCi0JCXx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9GUFRSMTRXUgotCQl8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjIxTAotCQl8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjE2RgotCQl8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YKLQkJfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNkRGKQotCSAgICAgIHsKLQkJLyogVGhlIGZpcnN0IHR3byB3b3JkcyBvZiBhbiAub3BkIGVudHJ5IGFyZSB6ZXJvLiAgKi8KLQkJbWVtc2V0IChocHBhX2luZm8tPm9wZF9zZWMtPmNvbnRlbnRzICsgZHluX2gtPm9wZF9vZmZzZXQsCi0JCQkwLCAxNik7Ci0KLQkJLyogVGhlIG5leHQgd29yZCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24uICAqLwotCQliZmRfcHV0XzY0IChocHBhX2luZm8tPm9wZF9zZWMtPm93bmVyLCB2YWx1ZSwKLQkJCSAgICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICAgICArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMTYpKTsKLQotCQkvKiBUaGUgbGFzdCB3b3JkIGlzIG91ciBsb2NhbCBfX2dwIHZhbHVlLiAgKi8KLQkJdmFsdWUgPSBfYmZkX2dldF9ncF92YWx1ZQotCQkJICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpOwotCQliZmRfcHV0XzY0IChocHBhX2luZm8tPm9wZF9zZWMtPm93bmVyLCB2YWx1ZSwKLQkJCSAgICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICAgICArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMjQpKTsKLQkgICAgICB9Ci0JICB9Ci0KLQkvKiBXZSB3YW50IHRoZSB2YWx1ZSBvZiB0aGUgRExUIG9mZnNldCBmb3IgdGhpcyBzeW1ib2wsIG5vdAotCSAgIHRoZSBzeW1ib2wncyBhY3R1YWwgYWRkcmVzcy4gIE5vdGUgdGhhdCBfX2dwIG1heSBub3QgcG9pbnQKLQkgICB0byB0aGUgc3RhcnQgb2YgdGhlIERMVCwgc28gd2UgaGF2ZSB0byBjb21wdXRlIHRoZSBhYnNvbHV0ZQotCSAgIGFkZHJlc3MsIHRoZW4gc3VidHJhY3Qgb3V0IHRoZSB2YWx1ZSBvZiBfX2dwLiAgKi8KLQl2YWx1ZSA9IChkeW5faC0+ZGx0X29mZnNldAotCQkgKyBocHBhX2luZm8tPmRsdF9zZWMtPm91dHB1dF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQl2YWx1ZSAtPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0KLQotCS8qIEFsbCBETFRJTkQgcmVsb2NhdGlvbnMgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhdCB0aGlzIHBvaW50LAotCSAgIGV4Y2VwdCB0aGF0IHdlIG5lZWQgZGlmZmVyZW50IGZpZWxkIHNlbGVjdG9ycyBmb3IgdGhlIDIxYml0Ci0JICAgdmVyc2lvbiB2cyB0aGUgMTRiaXQgdmVyc2lvbnMuICAqLwotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfRExUSU5EMjFMCi0JICAgIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9GUFRSMjFMCi0JICAgIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9UUDIxTCkKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfbHJzZWwpOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19ETFRJTkQxNEYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9GUFRSMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0xUT0ZGMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkYxNkRGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkYxNldGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfVFAxNkYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9UUDE2V0YKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19MVE9GRl9UUDE2REYpCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX2ZzZWwpOwotCWVsc2UKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfcnJzZWwpOwotCi0JaW5zbiA9IGVsZl9ocHBhX3JlbG9jYXRlX2luc24gKGluc24sIHZhbHVlLCByX3R5cGUpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfRExUUkVMMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RMVFJFTDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNFdSOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX0dQUkVMMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfR1BSRUwxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfR1BSRUwxNkRGOgotICAgICAgewotCS8qIFN1YnRyYWN0IG91dCB0aGUgZ2xvYmFsIHBvaW50ZXIgdmFsdWUgdG8gbWFrZSB2YWx1ZSBhIERMVAotCSAgIHJlbGF0aXZlIGFkZHJlc3MuICAqLwotCXZhbHVlIC09IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLQotCS8qIEFsbCBETFRSRUwgcmVsb2NhdGlvbnMgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhdCB0aGlzIHBvaW50LAotCSAgIGV4Y2VwdCB0aGF0IHdlIG5lZWQgZGlmZmVyZW50IGZpZWxkIHNlbGVjdG9ycyBmb3IgdGhlIDIxYml0Ci0JICAgdmVyc2lvbiB2cyB0aGUgMTRiaXQgdmVyc2lvbnMuICAqLwotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfRExUUkVMMjFMCi0JICAgIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19EUFJFTDIxTCkKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfbHJzZWwpOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19ETFRSRUwxNEYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19EUFJFTDE0RgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX0dQUkVMMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfR1BSRUwxNldGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfR1BSRUwxNkRGKQotCSAgdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIGFkZGVuZCwgZV9mc2VsKTsKLQllbHNlCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX3Jyc2VsKTsKLQotCWluc24gPSBlbGZfaHBwYV9yZWxvY2F0ZV9pbnNuIChpbnNuLCB2YWx1ZSwgcl90eXBlKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgUl9QQVJJU0NfRElSMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTdSOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTdGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxNkY6Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTZERjoKLSAgICAgIHsKLQkvKiBBbGwgRElSIHJlbG9jYXRpb25zIGFyZSBiYXNpY2FsbHkgdGhlIHNhbWUgYXQgdGhpcyBwb2ludCwKLQkgICBleGNlcHQgdGhhdCB3ZSBuZWVkIGRpZmZlcmVudCBmaWVsZCBzZWxlY3RvcnMgZm9yIHRoZSAyMWJpdAotCSAgIHZlcnNpb24gdnMgdGhlIDE0Yml0IHZlcnNpb25zLiAgKi8KLQlpZiAocl90eXBlID09IFJfUEFSSVNDX0RJUjIxTCkKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfbHJzZWwpOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19ESVIxN0YKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19ESVIxNkYKLQkJIHx8IHJfdHlwZSA9PSBSX1BBUklTQ19ESVIxNldGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfRElSMTZERikKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfZnNlbCk7Ci0JZWxzZQotCSAgdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAodmFsdWUsIGFkZGVuZCwgZV9ycnNlbCk7Ci0KLQlpbnNuID0gZWxmX2hwcGFfcmVsb2NhdGVfaW5zbiAoaW5zbiwgdmFsdWUsIHJfdHlwZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QTFRPRkYxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfUExUT0ZGMTZGOgotICAgIGNhc2UgUl9QQVJJU0NfUExUT0ZGMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE2REY6Ci0gICAgICB7Ci0JLyogV2Ugd2FudCB0aGUgdmFsdWUgb2YgdGhlIFBMVCBvZmZzZXQgZm9yIHRoaXMgc3ltYm9sLCBub3QKLQkgICB0aGUgc3ltYm9sJ3MgYWN0dWFsIGFkZHJlc3MuICBOb3RlIHRoYXQgX19ncCBtYXkgbm90IHBvaW50Ci0JICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBETFQsIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgYWJzb2x1dGUKLQkgICBhZGRyZXNzLCB0aGVuIHN1YnRyYWN0IG91dCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JdmFsdWUgPSAoZHluX2gtPnBsdF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5wbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+cGx0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JdmFsdWUgLT0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotCi0JLyogQWxsIFBMVE9GRiByZWxvY2F0aW9ucyBhcmUgYmFzaWNhbGx5IHRoZSBzYW1lIGF0IHRoaXMgcG9pbnQsCi0JICAgZXhjZXB0IHRoYXQgd2UgbmVlZCBkaWZmZXJlbnQgZmllbGQgc2VsZWN0b3JzIGZvciB0aGUgMjFiaXQKLQkgICB2ZXJzaW9uIHZzIHRoZSAxNGJpdCB2ZXJzaW9ucy4gICovCi0JaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QTFRPRkYyMUwpCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX2xyc2VsKTsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExUT0ZGMTRGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfUExUT0ZGMTZGCi0JCSB8fCByX3R5cGUgPT0gUl9QQVJJU0NfUExUT0ZGMTZXRgotCQkgfHwgcl90eXBlID09IFJfUEFSSVNDX1BMVE9GRjE2REYpCi0JICB2YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0ICh2YWx1ZSwgYWRkZW5kLCBlX2ZzZWwpOwotCWVsc2UKLQkgIHZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBhZGRlbmQsIGVfcnJzZWwpOwotCi0JaW5zbiA9IGVsZl9ocHBhX3JlbG9jYXRlX2luc24gKGluc24sIHZhbHVlLCByX3R5cGUpOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMzI6Ci0gICAgICB7Ci0JLyogV2UgbWF5IHN0aWxsIG5lZWQgdG8gY3JlYXRlIHRoZSBGUFRSIGl0c2VsZiBpZiBpdCB3YXMgZm9yCi0JICAgYSBsb2NhbCBzeW1ib2wuICAqLwotCWlmIChkeW5faC0+aCA9PSBOVUxMKQotCSAgewotCSAgICAvKiBUaGUgZmlyc3QgdHdvIHdvcmRzIG9mIGFuIC5vcGQgZW50cnkgYXJlIHplcm8uICAqLwotCSAgICBtZW1zZXQgKGhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMgKyBkeW5faC0+b3BkX29mZnNldCwgMCwgMTYpOwotCi0JICAgIC8qIFRoZSBuZXh0IHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgICAgYmZkX3B1dF82NCAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vd25lciwgdmFsdWUsCi0JCQkoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICsgZHluX2gtPm9wZF9vZmZzZXQgKyAxNikpOwotCi0JICAgIC8qIFRoZSBsYXN0IHdvcmQgaXMgb3VyIGxvY2FsIF9fZ3AgdmFsdWUuICAqLwotCSAgICB2YWx1ZSA9IF9iZmRfZ2V0X2dwX3ZhbHVlCi0JCSAgICAgIChocHBhX2luZm8tPm9wZF9zZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lcik7Ci0JICAgIGJmZF9wdXRfNjQgKGhwcGFfaW5mby0+b3BkX3NlYy0+b3duZXIsIHZhbHVlLAotCQkJaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cyArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMjQpOwotCSAgfQotCi0JLyogV2Ugd2FudCB0aGUgdmFsdWUgb2YgdGhlIERMVCBvZmZzZXQgZm9yIHRoaXMgc3ltYm9sLCBub3QKLQkgICB0aGUgc3ltYm9sJ3MgYWN0dWFsIGFkZHJlc3MuICBOb3RlIHRoYXQgX19ncCBtYXkgbm90IHBvaW50Ci0JICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBETFQsIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgYWJzb2x1dGUKLQkgICBhZGRyZXNzLCB0aGVuIHN1YnRyYWN0IG91dCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JdmFsdWUgPSAoZHluX2gtPmRsdF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+ZGx0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JdmFsdWUgLT0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLQlyZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSNjQ6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDY0OgotICAgICAgewotCS8qIFdlIG1heSBzdGlsbCBuZWVkIHRvIGNyZWF0ZSB0aGUgRlBUUiBpdHNlbGYgaWYgaXQgd2FzIGZvcgotCSAgIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQlpZiAoZHluX2gtPmggPT0gTlVMTCAmJiByX3R5cGUgPT0gUl9QQVJJU0NfTFRPRkZfRlBUUjY0KQotCSAgewotCSAgICAvKiBUaGUgZmlyc3QgdHdvIHdvcmRzIG9mIGFuIC5vcGQgZW50cnkgYXJlIHplcm8uICAqLwotCSAgICBtZW1zZXQgKGhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMgKyBkeW5faC0+b3BkX29mZnNldCwgMCwgMTYpOwotCi0JICAgIC8qIFRoZSBuZXh0IHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgICAgYmZkX3B1dF82NCAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vd25lciwgdmFsdWUsCi0JCQkoaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cwotCQkJICsgZHluX2gtPm9wZF9vZmZzZXQgKyAxNikpOwotCi0JICAgIC8qIFRoZSBsYXN0IHdvcmQgaXMgb3VyIGxvY2FsIF9fZ3AgdmFsdWUuICAqLwotCSAgICB2YWx1ZSA9IF9iZmRfZ2V0X2dwX3ZhbHVlCi0JCSAgICAgIChocHBhX2luZm8tPm9wZF9zZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lcik7Ci0JICAgIGJmZF9wdXRfNjQgKGhwcGFfaW5mby0+b3BkX3NlYy0+b3duZXIsIHZhbHVlLAotCQkJaHBwYV9pbmZvLT5vcGRfc2VjLT5jb250ZW50cyArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMjQpOwotCSAgfQotCi0JLyogV2Ugd2FudCB0aGUgdmFsdWUgb2YgdGhlIERMVCBvZmZzZXQgZm9yIHRoaXMgc3ltYm9sLCBub3QKLQkgICB0aGUgc3ltYm9sJ3MgYWN0dWFsIGFkZHJlc3MuICBOb3RlIHRoYXQgX19ncCBtYXkgbm90IHBvaW50Ci0JICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBETFQsIHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgYWJzb2x1dGUKLQkgICBhZGRyZXNzLCB0aGVuIHN1YnRyYWN0IG91dCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JdmFsdWUgPSAoZHluX2gtPmRsdF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+ZGx0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JdmFsdWUgLT0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotCWJmZF9wdXRfNjQgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLQlyZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19ESVIzMjoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUgKyBhZGRlbmQsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfUEFSSVNDX0RJUjY0OgotICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9QQVJJU0NfR1BSRUw2NDoKLSAgICAgIC8qIFN1YnRyYWN0IG91dCB0aGUgZ2xvYmFsIHBvaW50ZXIgdmFsdWUgdG8gbWFrZSB2YWx1ZSBhIERMVAotCSByZWxhdGl2ZSBhZGRyZXNzLiAgKi8KLSAgICAgIHZhbHVlIC09IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkY2NDoKLQkvKiBXZSB3YW50IHRoZSB2YWx1ZSBvZiB0aGUgRExUIG9mZnNldCBmb3IgdGhpcyBzeW1ib2wsIG5vdAotCSAgIHRoZSBzeW1ib2wncyBhY3R1YWwgYWRkcmVzcy4gIE5vdGUgdGhhdCBfX2dwIG1heSBub3QgcG9pbnQKLQkgICB0byB0aGUgc3RhcnQgb2YgdGhlIERMVCwgc28gd2UgaGF2ZSB0byBjb21wdXRlIHRoZSBhYnNvbHV0ZQotCSAgIGFkZHJlc3MsIHRoZW4gc3VidHJhY3Qgb3V0IHRoZSB2YWx1ZSBvZiBfX2dwLiAgKi8KLSAgICAgIHZhbHVlID0gKGR5bl9oLT5kbHRfb2Zmc2V0Ci0JICAgICAgICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgICsgaHBwYV9pbmZvLT5kbHRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIHZhbHVlIC09IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLQotICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwzMjoKLSAgICAgIHsKLQkvKiBJZiB0aGlzIGlzIGEgY2FsbCB0byBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYW5vdGhlciBkeW5hbWljCi0JICAgbGlicmFyeSwgdGhlbiByZWRpcmVjdCB0aGUgY2FsbCB0byB0aGUgbG9jYWwgc3R1YiBmb3IgdGhpcwotCSAgIGZ1bmN0aW9uLiAgKi8KLQlpZiAoc3ltX3NlYyA9PSBOVUxMIHx8IHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JICB2YWx1ZSA9IChkeW5faC0+c3R1Yl9vZmZzZXQgKyBocHBhX2luZm8tPnN0dWJfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaHBwYV9pbmZvLT5zdHViX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gIAotCS8qIFR1cm4gVkFMVUUgaW50byBhIHByb3BlciBQQyByZWxhdGl2ZSBhZGRyZXNzLiAgKi8KLQl2YWx1ZSAtPSAob2Zmc2V0ICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQl2YWx1ZSArPSBhZGRlbmQ7Ci0JdmFsdWUgLT0gODsKLQliZmRfcHV0XzY0IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0JcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICAgIH0KLQotICAgIGNhc2UgUl9QQVJJU0NfUENSRUw2NDoKLSAgICAgIHsKLQkvKiBJZiB0aGlzIGlzIGEgY2FsbCB0byBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYW5vdGhlciBkeW5hbWljCi0JICAgbGlicmFyeSwgdGhlbiByZWRpcmVjdCB0aGUgY2FsbCB0byB0aGUgbG9jYWwgc3R1YiBmb3IgdGhpcwotCSAgIGZ1bmN0aW9uLiAgKi8KLQlpZiAoc3ltX3NlYyA9PSBOVUxMIHx8IHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JICB2YWx1ZSA9IChkeW5faC0+c3R1Yl9vZmZzZXQgKyBocHBhX2luZm8tPnN0dWJfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaHBwYV9pbmZvLT5zdHViX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gIAotICAKLQkvKiBUdXJuIFZBTFVFIGludG8gYSBwcm9wZXIgUEMgcmVsYXRpdmUgYWRkcmVzcy4gICovCi0JdmFsdWUgLT0gKG9mZnNldCArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0JdmFsdWUgKz0gYWRkZW5kOwotCXZhbHVlIC09IDg7Ci0JYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotCXJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgICB9Ci0KLQotICAgIGNhc2UgUl9QQVJJU0NfRlBUUjY0OgotICAgICAgewotCS8qIFdlIG1heSBzdGlsbCBuZWVkIHRvIGNyZWF0ZSB0aGUgRlBUUiBpdHNlbGYgaWYgaXQgd2FzIGZvcgotCSAgIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQlpZiAoZHluX2gtPmggPT0gTlVMTCkKLQkgIHsKLQkgICAgLyogVGhlIGZpcnN0IHR3byB3b3JkcyBvZiBhbiAub3BkIGVudHJ5IGFyZSB6ZXJvLiAgKi8KLQkgICAgbWVtc2V0IChocHBhX2luZm8tPm9wZF9zZWMtPmNvbnRlbnRzICsgZHluX2gtPm9wZF9vZmZzZXQsIDAsIDE2KTsKLQotCSAgICAvKiBUaGUgbmV4dCB3b3JkIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbi4gICovCi0JICAgIGJmZF9wdXRfNjQgKGhwcGFfaW5mby0+b3BkX3NlYy0+b3duZXIsIHZhbHVlLAotCQkJKGhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMKLQkJCSArIGR5bl9oLT5vcGRfb2Zmc2V0ICsgMTYpKTsKLQotCSAgICAvKiBUaGUgbGFzdCB3b3JkIGlzIG91ciBsb2NhbCBfX2dwIHZhbHVlLiAgKi8KLQkgICAgdmFsdWUgPSBfYmZkX2dldF9ncF92YWx1ZQotCQkgICAgICAoaHBwYV9pbmZvLT5vcGRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpOwotCSAgICBiZmRfcHV0XzY0IChocHBhX2luZm8tPm9wZF9zZWMtPm93bmVyLCB2YWx1ZSwKLQkJCWhwcGFfaW5mby0+b3BkX3NlYy0+Y29udGVudHMgKyBkeW5faC0+b3BkX29mZnNldCArIDI0KTsKLQkgIH0KLQotCS8qIFdlIHdhbnQgdGhlIHZhbHVlIG9mIHRoZSBPUEQgb2Zmc2V0IGZvciB0aGlzIHN5bWJvbCwgbm90Ci0gICAgICAgICAgIHRoZSBzeW1ib2wncyBhY3R1YWwgYWRkcmVzcy4gICovCi0JdmFsdWUgPSAoZHluX2gtPm9wZF9vZmZzZXQKLQkJICsgaHBwYV9pbmZvLT5vcGRfc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIGhwcGFfaW5mby0+b3BkX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgICAgIAotCWJmZF9wdXRfNjQgKGlucHV0X2JmZCwgdmFsdWUgKyBhZGRlbmQsIGhpdF9kYXRhKTsKLQlyZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotCi0gICAgY2FzZSBSX1BBUklTQ19TRUNSRUwzMjoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKLQkJICAodmFsdWUgKyBhZGRlbmQKLQkJICAgLSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKSwKLQkJICBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX1BBUklTQ19TRUdSRUwzMjoKLSAgICBjYXNlIFJfUEFSSVNDX1NFR1JFTDY0OgotICAgICAgewotCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IFNFR1JFTCByZWxvY2F0aW9uLCB0aGVuIGluaXRpYWxpemUKLQkgICB0aGUgc2VnbWVudCBiYXNlIHZhbHVlcy4gICovCi0JaWYgKGhwcGFfaW5mby0+dGV4dF9zZWdtZW50X2Jhc2UgPT0gKGJmZF92bWEpIC0xKQotCSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBlbGZfaHBwYV9yZWNvcmRfc2VnbWVudF9hZGRycywKLQkJCQkgZWxmNjRfaHBwYV9oYXNoX3RhYmxlIChpbmZvKSk7Ci0KLQkvKiBWQUxVRSBob2xkcyB0aGUgYWJzb2x1dGUgYWRkcmVzcy4gIFdlIHdhbnQgdG8gaW5jbHVkZSB0aGUKLQkgICBhZGRlbmQsIHRoZW4gdHVybiBpdCBpbnRvIGEgc2VnbWVudCByZWxhdGl2ZSBhZGRyZXNzLgotCi0JICAgVGhlIHNlZ21lbnQgaXMgZGVyaXZlZCBmcm9tIFNZTV9TRUMuICBXZSBhc3N1bWUgdGhhdCB0aGVyZSBhcmUKLQkgICBvbmx5IHR3byBzZWdtZW50cyBvZiBub3RlIGluIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZS9zaGxpYi4KLQkgICBBIHJlYWRvbmx5IHNlZ21lbnQgKC50ZXh0KSBhbmQgYSByZWFkd3JpdGUgc2VnbWVudCAoLmRhdGEpLiAgKi8KLQl2YWx1ZSArPSBhZGRlbmQ7Ci0KLQlpZiAoc3ltX3NlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgIHZhbHVlIC09IGhwcGFfaW5mby0+dGV4dF9zZWdtZW50X2Jhc2U7Ci0JZWxzZQotCSAgdmFsdWUgLT0gaHBwYV9pbmZvLT5kYXRhX3NlZ21lbnRfYmFzZTsKLQotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfU0VHUkVMMzIpCi0JICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0JZWxzZQotCSAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgfQotICAgICAgCi0KLSAgICAvKiBTb21ldGhpbmcgd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLiAgKi8KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gd29yZC4gICovCi0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgaGl0X2RhdGEpOwotICByZXR1cm4gKGJmZF9yZWxvY19vayk7Ci19Ci0KLS8qIFJlbG9jYXRlIHRoZSBnaXZlbiBJTlNOLiAgVkFMVUUgc2hvdWxkIGJlIHRoZSBhY3R1YWwgdmFsdWUgd2Ugd2FudAotICAgdG8gaW5zZXJ0IGludG8gdGhlIGluc3RydWN0aW9uLCBpZSBieSB0aGlzIHBvaW50IHdlIHNob3VsZCBub3QgYmUKLSAgIGNvbmNlcm5lZCB3aXRoIGNvbXB1dGluZyBhbiBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIERMVCwgUEMsIGV0Yy4KLSAgIEluc3RlYWQgdGhpcyByb3V0aW5lIGlzIG1lYW50IHRvIGhhbmRsZSB0aGUgYml0IG1hbmlwdWxhdGlvbnMgbmVlZGVkCi0gICB0byBpbnNlcnQgdGhlIHJlbG9jYXRpb24gaW50byB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWxmX2hwcGFfcmVsb2NhdGVfaW5zbiAoaW5zbiwgc3ltX3ZhbHVlLCByX3R5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyBzeW1fdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl90eXBlOwotewotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgLyogVGhpcyBpcyBhbnkgMjJiaXQgYnJhbmNoLiAgSW4gUEEyLjAgc3ludGF4IGl0IGNvcnJlc3BvbmRzIHRvCi0gICAgICAgdGhlICJCIiBpbnN0cnVjdGlvbi4gICovCi0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDIyRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMjJDOgotICAgICAgewotCXVuc2lnbmVkIGludCB3MywgdzIsIHcxLCB3OwotCi0JLyogVGhlc2UgYXJlIDIyIGJpdCBicmFuY2hlcy4gIE1hc2sgb2ZmIGJpdHMgd2UgZG8gbm90IGNhcmUKLQkgICBhYm91dC4gICovCi0Jc3ltX3ZhbHVlICY9IDB4M2ZmZmZmOwotCi0JLyogTm93IGV4dHJhY3QgdGhlIFcxLCBXMiwgVzMgYW5kIFcgZmllbGRzIGZyb20gdGhlIHZhbHVlLiAgKi8KLQlkaXNfYXNzZW1ibGVfMjIgKHN5bV92YWx1ZSwgJnczLCAmdzEsICZ3MiwgJncpOwotCi0JLyogTWFzayBvdXQgYml0cyBmb3IgdGhlIHZhbHVlIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JaW5zbiAmPSAweGZjMDBlMDAyOwotCi0JLyogSW5zZXJ0IHRoZSBiaXRzIGZvciB0aGUgVzEsIFcyIGFuZCBXIGZpZWxkcyBpbnRvIHRoZQotCSAgIGluc3RydWN0aW9uLiAgKi8KLQlpbnNuIHw9ICh3MyA8PCAyMSkgfCAodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdzsKLQlyZXR1cm4gaW5zbjsKLSAgICAgICB9Ci0KLSAgICAvKiBUaGlzIGlzIGFueSAxN2JpdCBicmFuY2guICBJbiBQQTIuMCBzeW50YXggaXQgYWxzbyBjb3JyZXNwb25kcyB0bwotICAgICAgIHRoZSAiQiIgaW5zdHJ1Y3Rpb24gYXMgd2VsbCBhcyBCRS4gICovCi0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE3RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE3UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdDOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN1I6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IHcyLCB3MSwgdzsKLQotCS8qIFRoZXNlIGFyZSAxNyBiaXQgYnJhbmNoZXMuICBNYXNrIG9mZiBiaXRzIHdlIGRvIG5vdCBjYXJlCi0JICAgYWJvdXQuICAqLwotCXN5bV92YWx1ZSAmPSAweDFmZmZmOwotCi0JLyogTm93IGV4dHJhY3QgdGhlIFcxLCBXMiBhbmQgVyBmaWVsZHMgZnJvbSB0aGUgdmFsdWUuICAqLwotCWRpc19hc3NlbWJsZV8xNyAoc3ltX3ZhbHVlLCAmdzEsICZ3MiwgJncpOwotCi0JLyogTWFzayBvdXQgYml0cyBmb3IgdGhlIHZhbHVlIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JaW5zbiAmPSAweGZmZTBlMDAyOwotCi0JLyogSW5zZXJ0IHRoZSBiaXRzIGZvciB0aGUgVzEsIFcyIGFuZCBXIGZpZWxkcyBpbnRvIHRoZQotCSAgIGluc3RydWN0aW9uLiAgKi8KLQlpbnNuIHw9ICh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3OwotCXJldHVybiBpbnNuOwotICAgICAgfQotCi0gICAgLyogQURESUwgb3IgTERJTCBpbnN0cnVjdGlvbnMuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfRExUUkVMMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfRExUSU5EMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMjFMOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjIxTDoKLSAgICAgIHsKLSAgICAgICAgaW50IHc7Ci0KLQkvKiBNYXNrIG9mZiBiaXRzIGluIElOU04gd2UgZG8gbm90IHdhbnQuICAqLwotCWluc24gJj0gMHhmZmUwMDAwMDsKLQotCS8qIFR1cm4gdGhlIDIxYml0IHZhbHVlIGludG8gdGhlIHByb3BlciBmb3JtYXQuICAqLwotCWRpc19hc3NlbWJsZV8yMSAoc3ltX3ZhbHVlLCAmdyk7Ci0KLQkvKiBBbmQgaW5zZXJ0IHRoZSBwcm9wZXIgYml0cyBpbnRvIElOU04uICAqLwotICAgICAgICByZXR1cm4gaW5zbiB8IHc7Ci0gICAgICB9Ci0KLSAgICAvKiBMRE8gYW5kIGludGVnZXIgbG9hZHMvc3RvcmVzIHdpdGggMTRiaXQgZGlzcGxhY2VtZW50cy4gICovCi0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfVFAxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9UUDE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNEY6Ci0gICAgY2FzZSBSX1BBUklTQ19HUFJFTDE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0RjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE2RjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGMTZGOgotICAgICAgewotICAgICAgICBpbnQgdzsKLQotCS8qIE1hc2sgb2ZmIGJpdHMgaW4gSU5TTiB3ZSBkbyBub3Qgd2FudC4gICovCi0JaW5zbiAmPSAweGZmZmZjMDAwOwotCi0JLyogVHVybiB0aGUgMTRiaXQgdmFsdWUgaW50byB0aGUgcHJvcGVyIGZvcm1hdC4gICovCi0JbG93X3NpZ25fdW5leHQgKHN5bV92YWx1ZSwgMTQsICZ3KTsKLQotCS8qIEFuZCBpbnNlcnQgdGhlIHByb3BlciBiaXRzIGludG8gSU5TTi4gICovCi0gICAgICAgIHJldHVybiBpbnNuIHwgdzsKLSAgICAgIH0KLQotICAgIC8qIERvdWJsZXdvcmQgbG9hZHMgYW5kIHN0b3JlcyB3aXRoIGEgMTRiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSAgICBjYXNlIFJfUEFSSVNDX0RMVFJFTDE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQxNERSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0dQUkVMMTZERjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0RFI6Ci0gICAgY2FzZSBSX1BBUklTQ19QTFRPRkYxNkRGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTREUjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE2REY6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2REY6Ci0gICAgICB7Ci0JLyogTWFzayBvZmYgYml0cyBpbiBJTlNOIHdlIGRvIG5vdCB3YW50LiAgKi8KLQlpbnNuICY9IDB4ZmZmZmMwMGU7Ci0KLQkvKiBUaGUgc2lnbiBiaXQgYXQgMTQgbW92ZXMgaW50byBiaXQgemVybyBpbiB0aGUgZGVzdGluYXRpb24uICAqLwotICAgICAgICBpbnNuIHw9ICgoc3ltX3ZhbHVlICYgMHgyMDAwKSA+PiAxMyk7Ci0KLQkvKiBUdXJuIG9mZiB0aGUgYml0cyBpbiBzeW1fdmFsdWUgd2UgZG8gbm90IGNhcmUgYWJvdXQuICAqLwotCXN5bV92YWx1ZSAmPSAweDFmZjg7Ci0KLQkvKiBOb3cgc2hpZnQgaXQgb25lIGJpdCBwb3NpdGlvbiBsZWZ0IHNvIHRoYXQgaXQgbGluZXMgdXAgd2l0aCB0aGUKLQkgICBkZXN0aW5hdGlvbiBmaWVsZCBpbiBJTlNOLiAgKi8KLQlzeW1fdmFsdWUgPDw9IDE7Ci0KLQlyZXR1cm4gaW5zbiB8IHN5bV92YWx1ZTsKLSAgICAgIH0KLQotICAgIC8qIEZsb2F0aW5nIHBvaW50IHNpbmdsZSB3b3JkIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICBjYXNlIFJfUEFSSVNDX0RMVFJFTDE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19ETFRJTkQxNFdSOgotICAgIGNhc2UgUl9QQVJJU0NfTFRPRkZfRlBUUjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0xUT0ZGX1RQMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRXUjoKLSAgICBjYXNlIFJfUEFSSVNDX0dQUkVMMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMVE9GRjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QTFRPRkYxNldGOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTZXRjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0V1I6Ci0gICAgY2FzZSBSX1BBUklTQ19MVE9GRjE2V0Y6Ci0gICAgICB7Ci0JLyogTWFzayBvZmYgYml0cyBpbiBJTlNOIHdlIGRvIG5vdCB3YW50LiAgKi8KLQlpbnNuICY9IDB4ZmZmZmMwMDY7Ci0KLQkvKiBUaGUgc2lnbiBiaXQgYXQgMTQgbW92ZXMgaW50byBiaXQgemVybyBpbiB0aGUgZGVzdGluYXRpb24uICAqLwotICAgICAgICBpbnNuIHw9ICgoc3ltX3ZhbHVlICYgMHgyMDAwKSA+PiAxMyk7Ci0KLQkvKiBUdXJuIG9mZiB0aGUgYml0cyBpbiBzeW1fdmFsdWUgd2UgZG8gbm90IGNhcmUgYWJvdXQuICAqLwotCXN5bV92YWx1ZSAmPSAweDFmZmM7Ci0KLQkvKiBOb3cgc2hpZnQgaXQgb25lIGJpdCBwb3NpdGlvbiBsZWZ0IHNvIHRoYXQgaXQgbGluZXMgdXAgd2l0aCB0aGUKLQkgICBkZXN0aW5hdGlvbiBmaWVsZCBpbiBJTlNOLiAgKi8KLQlzeW1fdmFsdWUgPDw9IDE7Ci0KLQlyZXR1cm4gaW5zbiB8IHN5bV92YWx1ZTsKLSAgICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gaW5zbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iZmQvZWxmLW0xMDIwMC5jIGIvYmZkL2VsZi1tMTAyMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg1NTZmYi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLW0xMDIwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUyNSArMCwwIEBACi0vKiBNYXRzdXNoaXRhIDEwMjAwIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBtbjEwMjAwX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbW4xMDIwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmMzJfRXh0ZXJuYWxfU3ltICosIGJmZF92bWEpKTsKLQotLyogV2UgaGF2ZSB0byB1c2UgUkVMQSBpbnN0cnVjdGlvbnMgc2luY2UgbWRfYXBwbHlfZml4MyBpbiB0aGUgYXNzZW1ibGVyCi0gICBkb2VzIGFic29sdXRlbHkgbm90aGluZy4gICovCi0jZGVmaW5lIFVTRV9SRUxBCi0KLWVudW0gcmVsb2NfdHlwZQotewotICBSX01OMTAyMDBfTk9ORSA9IDAsCi0gIFJfTU4xMDIwMF8zMiwKLSAgUl9NTjEwMjAwXzE2LAotICBSX01OMTAyMDBfOCwKLSAgUl9NTjEwMjAwXzI0LAotICBSX01OMTAyMDBfUENSRUw4LAotICBSX01OMTAyMDBfUENSRUwxNiwKLSAgUl9NTjEwMjAwX1BDUkVMMjQsCi0gIFJfTU4xMDIwMF9NQVgKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBEdW1teSByZWxvY2F0aW9uLiAgRG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDIwMF9OT05FLAotCSAwLAotCSAyLAotCSAxNiwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfTk9ORSIsCi0JIGZhbHNlLAotCSAwLAotCSAwLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDMyIGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMzIsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8zMiIsCi0JIGZhbHNlLAotCSAweGZmZmZmZmZmLAotCSAweGZmZmZmZmZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDE2IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMTYsCi0JIDAsCi0JIDEsCi0JIDE2LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8xNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgZmFsc2UpLAotICAvKiBTdGFuZGFyZCA4IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfOCIsCi0JIGZhbHNlLAotCSAweGZmLAotCSAweGZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDI0IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMjQsCi0JIDAsCi0JIDIsCi0JIDI0LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8yNCIsCi0JIGZhbHNlLAotCSAweGZmZmZmZiwKLQkgMHhmZmZmZmYsCi0JIGZhbHNlKSwKLSAgLyogU2ltcGxlIDggcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwX1BDUkVMOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF9QQ1JFTDgiLAotCSBmYWxzZSwKLQkgMHhmZiwKLQkgMHhmZiwKLQkgdHJ1ZSksCi0gIC8qIFNpbXBsZSAxNiBwYy1yZWxhdGl2ZSByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfUENSRUwxNiwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfUENSRUwxNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgdHJ1ZSksCi0gIC8qIFNpbXBsZSAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIGEgMSBieXRlIGFkanVzdG1lbnQKLSAgICAgdG8gZ2V0IHRoZSBwYy1yZWxhdGl2ZSBvZmZzZXQgY29ycmVjdC4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfUENSRUwyNCwKLQkgMCwKLQkgMiwKLQkgMjQsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfUENSRUwyNCIsCi0JIGZhbHNlLAotCSAweGZmZmZmZiwKLQkgMHhmZmZmZmYsCi0JIHRydWUpLAotfTsKLQotc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwIG1uMTAyMDBfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX01OMTAyMDBfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfTU4xMDIwMF8zMiwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfTU4xMDIwMF8xNiwgfSwKLSAgeyBCRkRfUkVMT0NfOCwgUl9NTjEwMjAwXzgsIH0sCi0gIHsgQkZEX1JFTE9DXzI0LCBSX01OMTAyMDBfMjQsIH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfTU4xMDIwMF9QQ1JFTDgsIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSX01OMTAyMDBfUENSRUwxNiwgfSwKLSAgeyBCRkRfUkVMT0NfMjRfUENSRUwsIFJfTU4xMDIwMF9QQ1JFTDI0LCB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKG1uMTAyMDBfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKG1uMTAyMDBfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlW21uMTAyMDBfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBNTjEwMjAwIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1tbjEwMjAwX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfTU4xMDIwMF9NQVgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLS8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBvZmZzZXQsIHZhbHVlLAotCQkJCSBhZGRlbmQsIGluZm8sIHN5bV9zZWMsIGlzX2xvY2FsKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBpc19sb2NhbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIHJfdHlwZSA9IGhvd3RvLT50eXBlOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF9OT05FOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwXzMyOgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwXzE2OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF84OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmIHx8IChsb25nKXZhbHVlIDwgLTB4ODApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfMjQ6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+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+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCSAgICBpc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bXAtPnN0X3NobmR4KTsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICBpc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgICBpc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdobyBrbm93cz8gICovCi0JICAgICAgaXNlYyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnNlY3BwID0gaXNlYzsKLQl9Ci0KLSAgICAgIGlmICghIG1uMTAyMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLQlmcmVlIChzZWN0aW9ucyk7Ci0gICAgICBzZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotCWZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0JZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAotICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0gICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX21uMTAyMDBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItbW4xMDIwMCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX21uMTAyMDAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfTU4xMDIwMAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCW1uMTAyMDBfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJMAotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIG1uMTAyMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uCW1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCW1uMTAyMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyICdfJwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmLW0xMDMwMC5jIGIvYmZkL2VsZi1tMTAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiZDJkNi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLW0xMDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk3NyArMCwwIEBACi0vKiBNYXRzdXNoaXRhIDEwMzAwIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tbjEwMzAwLmgiCi0KLXN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeQotewotICAvKiBUaGUgYmFzaWMgZWxmIGxpbmsgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBpcwotICAgICBjYWxsZWQgZGlyZWN0bHkgKGllIGJ5IG5hbWUpLiAgKi8KLSAgdW5zaWduZWQgaW50IGRpcmVjdF9jYWxsczsKLQotICAvKiBGb3IgZnVuY3Rpb24gc3ltYm9scywgdGhlIHNpemUgb2YgdGhpcyBmdW5jdGlvbidzIHN0YWNrCi0gICAgIChpZiA8PSAyNTUgYnl0ZXMpLiAgV2Ugc3R1ZmYgdGhpcyBpbnRvICJjYWxsIiBpbnN0cnVjdGlvbnMKLSAgICAgdG8gdGhpcyB0YXJnZXQgd2hlbiBpdCdzIHZhbGlkIGFuZCBwcm9maXRhYmxlIHRvIGRvIHNvLgotCi0gICAgIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBzdGFjayBhbGxvY2F0ZWQgYnkgbW92bSEgICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhY2tfc2l6ZTsKLQotICAvKiBGb3IgZnVuY3Rpb24gc3ltYm9scywgYXJndW1lbnRzIChpZiBhbnkpIGZvciBtb3ZtIGluc3RydWN0aW9uCi0gICAgIGluIHRoZSBwcm9sb2d1ZS4gIFdlIHN0dWZmIHRoaXMgdmFsdWUgaW50byAiY2FsbCIgaW5zdHJ1Y3Rpb25zCi0gICAgIHRvIHRoZSB0YXJnZXQgd2hlbiBpdCdzIHZhbGlkIGFuZCBwcm9maXRhYmxlIHRvIGRvIHNvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtb3ZtX2FyZ3M7Ci0KLSAgLyogRm9yIGZ1bnRpb24gc3ltYm9scywgdGhlIGFtb3VudCBvZiBzdGFjayBzcGFjZSB0aGF0IHdvdWxkIGJlIGFsbG9jYXRlZAotICAgICBieSB0aGUgbW92bSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgcmVkdW5kYW50IHdpdGggbW92bV9hcmdzLCBidXQgd2UKLSAgICAgYWRkIGl0IHRvIHRoZSBoYXNoIHRhYmxlIHRvIGF2b2lkIGNvbXB1dGluZyBpdCBvdmVyIGFuZCBvdmVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtb3ZtX3N0YWNrX3NpemU7Ci0KLS8qIFdoZW4gc2V0LCBjb252ZXJ0IGFsbCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHRvIHRoaXMgdGFyZ2V0IGludG8gImNhbGxzIgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMgMHgxCi0KLS8qIFVzZWQgdG8gbWFyayBmdW5jdGlvbnMgd2hpY2ggaGF2ZSBoYWQgcmVkdW5kYW50IHBhcnRzIG9mIHRoZWlyCi0gICBwcm9sb2d1ZSBkZWxldGVkLiAgKi8KLSNkZWZpbmUgTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTIDB4MgotICB1bnNpZ25lZCBjaGFyIGZsYWdzOwotfTsKLQotLyogV2UgZGVyaXZlIGEgaGFzaCB0YWJsZSBmcm9tIHRoZSBtYWluIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSBzbwotICAgd2UgY2FuIHN0b3JlIHN0YXRlIHZhcmlhYmxlcyBhbmQgYSBzZWNvbmRhcnkgaGFzaCB0YWJsZSB3aXRob3V0Ci0gICByZXNvcnRpbmcgdG8gZ2xvYmFsIHZhcmlhYmxlcy4gICovCi1zdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogQSBoYXNoIHRhYmxlIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgV2UgY291bGQgZGVyaXZlIGEgbmV3IGhhc2ggdGFibGUKLSAgICAgaW5zdGVhZCBvZiB1c2luZyB0aGUgZnVsbCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSBpZiB3ZSB3YW50ZWQKLSAgICAgdG8gc2F2ZSBzb21lIG1lbW9yeS4gICovCi0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqc3RhdGljX2hhc2hfdGFibGU7Ci0KLSAgLyogUmFuZG9tIGxpbmtlciBzdGF0ZSBmbGFncy4gICovCi0jZGVmaW5lIE1OMTAzMDBfSEFTSF9FTlRSSUVTX0lOSVRJQUxJWkVEIDB4MQotICBjaGFyIGZsYWdzOwotfTsKLQotLyogRm9yIE1OMTAzMDAgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0vKiBHZXQgdGhlIE1OMTAzMDAgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotI2RlZmluZSBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIG1uMTAzMDBfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIG1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKm1uMTAzMDBfZWxmX2djX21hcmtfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbW4xMDMwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmMzJfRXh0ZXJuYWxfU3ltICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIHZvaWQgY29tcHV0ZV9mdW5jdGlvbl9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLQotLyogV2UgaGF2ZSB0byB1c2UgUkVMQSBpbnN0cnVjdGlvbnMgc2luY2UgbWRfYXBwbHlfZml4MyBpbiB0aGUgYXNzZW1ibGVyCi0gICBkb2VzIGFic29sdXRlbHkgbm90aGluZy4gICovCi0jZGVmaW5lIFVTRV9SRUxBCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21uMTAzMDBfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIER1bW15IHJlbG9jYXRpb24uICBEb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwX05PTkUsCi0JIDAsCi0JIDIsCi0JIDE2LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9OT05FIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF8zMiwKLQkgMCwKLQkgMiwKLQkgMzIsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwXzMyIiwKLQkgZmFsc2UsCi0JIDB4ZmZmZmZmZmYsCi0JIDB4ZmZmZmZmZmYsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMTYgYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF8xNiwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwXzE2IiwKLQkgZmFsc2UsCi0JIDB4ZmZmZiwKLQkgMHhmZmZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDggYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF84LAotCSAwLAotCSAwLAotCSA4LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF84IiwKLQkgZmFsc2UsCi0JIDB4ZmYsCi0JIDB4ZmYsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMzJiaXQgcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwX1BDUkVMMzIsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwX1BDUkVMMzIiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmZmZiwKLQkgMHhmZmZmZmZmZiwKLQkgdHJ1ZSksCi0gIC8qIFN0YW5kYXJkIDE2Yml0IHBjLXJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF9QQ1JFTDE2LAotCSAwLAotCSAxLAotCSAxNiwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9QQ1JFTDE2IiwKLQkgZmFsc2UsCi0JIDB4ZmZmZiwKLQkgMHhmZmZmLAotCSB0cnVlKSwKLSAgLyogU3RhbmRhcmQgOCBwYy1yZWxhdGl2ZSByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAzMDBfUENSRUw4LAotCSAwLAotCSAwLAotCSA4LAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwX1BDUkVMOCIsCi0JIGZhbHNlLAotCSAweGZmLAotCSAweGZmLAotCSB0cnVlKSwKLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTU4xMDMwMF9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX01OMTAzMDBfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTU4xMDMwMF9HTlVfVlRFTlRSWSIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdGFuZGFyZCAyNCBiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwXzI0LAotCSAwLAotCSAyLAotCSAyNCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAzMDBfMjQiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmYsCi0JIDB4ZmZmZmZmLAotCSBmYWxzZSksCi0KLX07Ci0KLXN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcCBtbjEwMzAwX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NTjEwMzAwX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX01OMTAzMDBfMzIsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01OMTAzMDBfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfTU4xMDMwMF84LCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMMzIsIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSX01OMTAzMDBfUENSRUwxNiwgfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMOCwgfSwKLSAgeyBCRkRfUkVMT0NfMjQsIFJfTU4xMDMwMF8yNCwgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9NTjEwMzAwX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7Ci0gICAgICAgaSA8IHNpemVvZiAobW4xMDMwMF9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgbW4xMDMwMF9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAobW4xMDMwMF9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmX21uMTAzMDBfaG93dG9fdGFibGVbbW4xMDMwMF9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIE1OMTAzMDAgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1uMTAzMDBfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NTjEwMzAwX01BWCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX21uMTAzMDBfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tbjEwMzAwX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQkvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0JICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLQkgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfTU4xMDMwMF9HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1uMTAzMDBfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9NTjEwMzAwX0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1uMTAzMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBvZmZzZXQsIHZhbHVlLAotCQkJCSBhZGRlbmQsIGluZm8sIHN5bV9zZWMsIGlzX2xvY2FsKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBpc19sb2NhbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICB1bnNpZ25lZCBsb25nIHJfdHlwZSA9IGhvd3RvLT50eXBlOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX01OMTAzMDBfTk9ORToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF8zMjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF8yNDoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZmZmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MDAwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlICYgMHhmZiwgaGl0X2RhdGEpOwotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsICh2YWx1ZSA+PiA4KSAmIDB4ZmYsIGhpdF9kYXRhICsgMSk7Ci0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgKHZhbHVlID4+IDE2KSAmIDB4ZmYsIGhpdF9kYXRhICsgMik7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfMTY6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4N2ZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwXzg6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4N2YgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF9QQ1JFTDg6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gb2Zmc2V0OwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmIHx8IChsb25nKXZhbHVlIDwgLTB4MTAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwX1BDUkVMMTY6Ci0gICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgdmFsdWUgLT0gb2Zmc2V0OwotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHgxMDAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfUENSRUwzMjoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSBvZmZzZXQ7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9NTjEwMzAwX0dOVV9WVEVOVFJZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci19Ci0KLQwKLS8qIFJlbG9jYXRlIGFuIE1OMTAzMDAgRUxGIHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLW1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICoqKQotCQkgKGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGhvd3RvID0gZWxmX21uMTAzMDBfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIC8qIEp1c3Qgc2tpcCB0aGUgdnRhYmxlIGdjIHJlbG9jcy4gICovCi0gICAgICBpZiAocl90eXBlID09IFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUCi0JICB8fCByX3R5cGUgPT0gUl9NTjEwMzAwX0dOVV9WVEVOVFJZKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICByID0gbW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkJICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJCSAgIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQsCi0JCQkJCSAgIGluZm8sIHNlYywgaCA9PSBOVUxMKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjb25zdCBjaGFyICptc2cgPSAoY29uc3QgY2hhciAqKTA7Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggaW5pdGlhbGl6aW5nIG9uZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5IChnZW5fZW50cnksIGluX2FyZ3MpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZ2VuX2VudHJ5OwotICAgICBQVFIgaW5fYXJncyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmVudHJ5OwotICB1bnNpZ25lZCBpbnQgYnl0ZV9jb3VudCA9IDA7Ci0KLSAgZW50cnkgPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopZ2VuX2VudHJ5OwotCi0gIC8qIElmIHdlIGFscmVhZHkga25vdyB3ZSB3YW50IHRvIGNvbnZlcnQgImNhbGwiIHRvICJjYWxscyIgZm9yIGNhbGxzCi0gICAgIHRvIHRoaXMgc3ltYm9sLCB0aGVuIHJldHVybiBub3cuICAqLwotICBpZiAoZW50cnktPmZsYWdzID09IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBuYW1lZCBjYWxscyB0byB0aGlzIHN5bWJvbCwgb3IgdGhlcmUncyBub3RoaW5nIHdlCi0gICAgIGNhbiBtb3ZlIGZyb20gdGhlIGZ1bmN0aW9uIGl0c2VsZiBpbnRvIHRoZSAiY2FsbCIgaW5zdHJ1Y3Rpb24sIHRoZW4KLSAgICAgbm90ZSB0aGF0IGFsbCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byAiY2FsbHMiCi0gICAgIGluc3RydWN0aW9ucyBhbmQgcmV0dXJuLiAgKi8KLSAgaWYgKGVudHJ5LT5kaXJlY3RfY2FsbHMgPT0gMAotICAgICAgfHwgKGVudHJ5LT5zdGFja19zaXplID09IDAgJiYgZW50cnktPm1vdm1fYXJncyA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBNYWtlIGEgbm90ZSB0aGF0IHdlIHNob3VsZCBjb252ZXJ0ICJjYWxsIiBpbnN0cnVjdGlvbnMgdG8gImNhbGxzIgotCSBpbnN0cnVjdGlvbnMgZm9yIGNhbGxzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGVudHJ5LT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBXZSBtYXkgYmUgYWJsZSB0byBtb3ZlIHNvbWUgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGZ1bmN0aW9uIGl0c2VsZiBpbnRvCi0gICAgIHRoZSAiY2FsbCIgaW5zdHJ1Y3Rpb24uICBDb3VudCBob3cgbWFueSBieXRlcyB3ZSBtaWdodCBiZSBhYmxlIHRvCi0gICAgIGVsaW1pbmF0ZSBpbiB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgKi8KLQotICAvKiBBIG1vdm0gaW5zdHJ1Y3Rpb24gaXMgdHdvIGJ5dGVzLiAgKi8KLSAgaWYgKGVudHJ5LT5tb3ZtX2FyZ3MpCi0gICAgYnl0ZV9jb3VudCArPSAyOwotCi0gIC8qIENvdW50IHRoZSBpbnNuIHRvIGFsbG9jYXRlIHN0YWNrIHNwYWNlIHRvby4gICovCi0gIGlmIChlbnRyeS0+c3RhY2tfc2l6ZSA+IDAgJiYgZW50cnktPnN0YWNrX3NpemUgPD0gMTI4KQotICAgIGJ5dGVfY291bnQgKz0gMzsKLSAgZWxzZSBpZiAoZW50cnktPnN0YWNrX3NpemUgPiAwICYmIGVudHJ5LT5zdGFja19zaXplIDwgMjU2KQotICAgIGJ5dGVfY291bnQgKz0gNDsKLQotICAvKiBJZiB1c2luZyAiY2FsbCIgd2lsbCByZXN1bHQgaW4gbGFyZ2VyIGNvZGUsIHRoZW4gdHVybiBhbGwKLSAgICAgdGhlIGFzc29jaWF0ZWQgImNhbGwiIGluc3RydWN0aW9ucyBpbnRvICJjYWxscyIgaW5zdHJ1dGlvbnMuICAqLwotICBpZiAoYnl0ZV9jb3VudCA8IGVudHJ5LT5kaXJlY3RfY2FsbHMpCi0gICAgZW50cnktPmZsYWdzIHw9IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTOwotCi0gIC8qIFRoaXMgcm91dGluZSBuZXZlciBmYWlscy4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIHRoZSBtbjEwMzAwLgotCi0gICBUaGVyZSdzIHF1aXRlIGEgZmV3IHJlbGF4aW5nIG9wcG9ydHVuaXRlcyBhdmFpbGFibGUgb24gdGhlIG1uMTAzMDA6Ci0KLQkqIGNhbGxzOjMyIC0+IGNhbGxzOjE2IAkJCQkJICAgMiBieXRlcwotCSogY2FsbDozMiAgLT4gY2FsbDoxNgkJCQkJICAgMiBieXRlcwotCi0JKiBjYWxsOjMyIC0+IGNhbGxzOjMyCQkJCQkgICAxIGJ5dGUKLQkqIGNhbGw6MTYgLT4gY2FsbHM6MTYJCQkJCSAgIDEgYnl0ZQotCQkqIFRoZXNlIGFyZSBkb25lIGFueXRpbWUgdXNpbmcgImNhbGxzIiB3b3VsZCByZXN1bHQKLQkJaW4gc21hbGxlciBjb2RlLCBvciB3aGVuIG5lY2Vzc2FyeSB0byBwcmVzZXJ2ZSB0aGUKLQkJbWVhbmluZyBvZiB0aGUgcHJvZ3JhbS4KLQotCSogY2FsbDozMgkJCQkJCSAgIHZhcmllcwotCSogY2FsbDoxNgotCQkqIEluIHNvbWUgY2lyY3Vtc3RhbmNlcyB3ZSBjYW4gbW92ZSBpbnN0cnVjdGlvbnMKLQkJZnJvbSBhIGZ1bmN0aW9uIHByb2xvZ3VlIGludG8gYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uCi0JCVRoaXMgaXMgb25seSBkb25lIGlmIHRoZSByZXN1bHRpbmcgY29kZSBpcyBubyBsYXJnZXIKLQkJdGhhbiB0aGUgb3JpZ2luYWwgY29kZS4KLQotCi0JKiBqbXA6MzIgLT4gam1wOjE2CQkJCQkgICAyIGJ5dGVzCi0JKiBqbXA6MTYgLT4gYnJhOjgJCQkJCSAgIDEgYnl0ZQotCi0JCSogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoCi0JCWFyb3VuZCB0aGUganVtcC9icmEsIHdlIG1heSBiZSBhYmxlIHRvIHJldmVyc2UgaXRzIGNvbmRpdGlvbgotCQlhbmQgY2hhbmdlIGl0cyB0YXJnZXQgdG8gdGhlIGp1bXAncyB0YXJnZXQuICBUaGUganVtcC9icmEKLQkJY2FuIHRoZW4gYmUgZGVsZXRlZC4JCQkJICAgMiBieXRlcwotCi0JKiBtb3YgYWJzMzIgLT4gbW92IGFiczE2CQkJCSAgIDEgb3IgMiBieXRlcwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMzIgY2FuIHJlbGF4IHRvIGltbTE2ICAxIG9yIDIgYnl0ZXMKLQktIE1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VwdCBpbW0xNiBjYW4gcmVsYXggdG8gaW1tOCAgIDEgb3IgMiBieXRlcwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDMyIGNhbiByZWxheCB0byBkMTYJICAgMSBvciAyIGJ5dGVzCi0JLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDE2IGNhbiByZWxheCB0byBkOAkgICAxIG9yIDIgYnl0ZXMKLQotCVdlIGRvbid0IGhhbmRsZSBpbW0xNi0+aW1tOCBvciBkMTYtPmQ4IGFzIHRoZXkncmUgdmVyeSByYXJlCi0JYW5kIHNvbWV3aGF0IG1vcmUgZGlmZmljdWx0IHRvIHN1cHBvcnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKLQotICAvKiBBc3N1bWUgbm90aGluZyBjaGFuZ2VzLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgLyogV2UgbmVlZCBhIHBvaW50ZXIgdG8gdGhlIG1uMTAzMDAgc3BlY2lmaWMgaGFzaCB0YWJsZS4gICovCi0gIGhhc2hfdGFibGUgPSBlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBmaWVsZHMgaW4gZWFjaCBoYXNoIHRhYmxlIGVudHJ5IHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICAqLwotICBpZiAoKGhhc2hfdGFibGUtPmZsYWdzICYgTU4xMDMwMF9IQVNIX0VOVFJJRVNfSU5JVElBTElaRUQpID09IDApCi0gICAgewotICAgICAgYmZkICppbnB1dF9iZmQ7Ci0KLSAgICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGlucHV0IGJmZHMuICAqLwotICAgICAgZm9yIChpbnB1dF9iZmQgPSBsaW5rX2luZm8tPmlucHV0X2JmZHM7Ci0JICAgaW5wdXRfYmZkICE9IE5VTEw7Ci0JICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCi0JewotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgIC8qIFdlJ3JlIGdvaW5nIHRvIG5lZWQgYWxsIHRoZSBzeW1ib2xzIGZvciBlYWNoIGJmZC4gICovCi0JICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICAgICAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotICAgICAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotICAgICAgICAgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0gICAgICAgICAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLSAgICAgICAgICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLSAgICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgICAgICAgICAgICAgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgaW5wdXRfYmZkKQotICAgICAgICAgICAgICAgICAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgICAgICAgfQotCi0JICAvKiBJdGVyYXRlIG92ZXIgZWFjaCBzZWN0aW9uIGluIHRoaXMgYmZkLiAgKi8KLQkgIGZvciAoc2VjdGlvbiA9IGlucHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgICAgIHNlY3Rpb24gIT0gTlVMTDsKLQkgICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmhhc2g7Ci0JICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotCSAgICAgIGFzZWN0aW9uICpzeW1fc2VjOwotCSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCSAgICAgIGNoYXIgKm5ld19uYW1lOwotCi0JICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IG9mIHNlY3Rpb24gY29udGVudHMgaWYgaXQgZXhpc3RzLiAgKi8KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCWNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgICAgIGVsc2UgaWYgKHNlY3Rpb24tPl9yYXdfc2l6ZSAhPSAwKQotCQl7Ci0JCSAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCQkgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIHNlY3Rpb24sCi0JCQkJCQkgY29udGVudHMsIChmaWxlX3B0cikgMCwKLQkJCQkJCSBzZWN0aW9uLT5fcmF3X3NpemUpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjb250ZW50cyA9IE5VTEw7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0JCX0KLQotCSAgICAgIC8qIElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NzLCB0aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gICovCi0JICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotCQkgICYmIHNlY3Rpb24tPnJlbG9jX2NvdW50ICE9IDApCi0JCXsKLQotCQkgIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0JCSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJCSAgICAgKGlucHV0X2JmZCwgc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCQkgICAgICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0JCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0JCSAgLyogTm93IGV4YW1pbmUgZWFjaCByZWxvY2F0aW9uLiAgKi8KLQkJICBpcmVsID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGlyZWxlbmQgPSBpcmVsICsgc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JCSAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgcl90eXBlOwotCQkgICAgICB1bnNpZ25lZCBsb25nIHJfaW5kZXg7Ci0JCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCQkgICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbyk7Ci0JCSAgICAgIHJfaW5kZXggPSBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKTsKLQotCQkgICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludClSX01OMTAzMDBfTUFYKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogV2UgbmVlZCB0aGUgbmFtZSBhbmQgaGFzaCB0YWJsZSBlbnRyeSBvZiB0aGUgdGFyZ2V0Ci0JCQkgc3ltYm9sISAgKi8KLQkJICAgICAgaGFzaCA9IE5VTEw7Ci0JCSAgICAgIHN5bSA9IE5VTEw7Ci0JCSAgICAgIHN5bV9zZWMgPSBOVUxMOwotCi0JCSAgICAgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkJCXsKLQkJCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLwotCQkJICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLQkJCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgZXh0c3ltcyArIHJfaW5kZXgsICZpc3ltKTsKLQotCQkJICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JCQkgICAgc3ltX3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPiAwCi0JCQkJICAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JCQkgICAgc3ltX3NlYwotCQkJICAgICAgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICBpc3ltLnN0X3NobmR4KTsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JCQkgICAgc3ltX3NlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0KLQkJCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICBpc3ltLnN0X25hbWUpOwotCi0JCQkgIC8qIElmIGl0IGlzbid0IGEgZnVuY3Rpb24sIHRoZW4gd2UgZG9uJ3QgY2FyZQotCQkJICAgICBhYm91dCBpdC4gICovCi0JCQkgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJICAgICAgJiYgRUxGX1NUX1RZUEUgKGlzeW0uc3RfaW5mbykgIT0gU1RUX0ZVTkMpCi0JCQkgICAgY29udGludWU7Ci0KLQkJCSAgLyogVGFjayBvbiBhbiBJRCBzbyB3ZSBjYW4gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcwotCQkJICAgICBsb2NhbCBzeW1ib2wgaW4gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQkJCSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKHN5bV9uYW1lKSArIDEwKTsKLQkJCSAgaWYgKG5ld19uYW1lID09IDApCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgc3ByaW50ZiAobmV3X25hbWUsICIlc18lMDh4Iiwgc3ltX25hbWUsIChpbnQpc3ltX3NlYyk7Ci0JCQkgIHN5bV9uYW1lID0gbmV3X25hbWU7Ci0KLQkJCSAgaGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJCQkgICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJmhhc2hfdGFibGUtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LAotCQkJCQkJICAgICAgICAgc3ltX25hbWUsIHRydWUsCi0JCQkJCQkgICAgICAgICB0cnVlLCBmYWxzZSk7Ci0JCQkgIGZyZWUgKG5ld19uYW1lKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICByX2luZGV4IC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCQkgIGhhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkJICAgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbcl9pbmRleF07Ci0JCQl9Ci0KLQkJICAgICAgLyogSWYgdGhpcyBpcyBub3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24sIHRoZW4gd2UKLQkJCSBzaG91bGQgY29udmVydCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHRvICJjYWxscyIKLQkJCSBpbnN0cnVjdGlvbnMuICAqLwotCQkgICAgICBjb2RlID0gYmZkX2dldF84IChpbnB1dF9iZmQsCi0JCQkJCWNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQkJICAgICAgaWYgKGNvZGUgIT0gMHhkZCAmJiBjb2RlICE9IDB4Y2QpCi0JCQloYXNoLT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKLQotCQkgICAgICAvKiBJZiB0aGlzIGlzIGEganVtcC9jYWxsLCB0aGVuIGJ1bXAgdGhlIGRpcmVjdF9jYWxscwotCQkJIGNvdW50ZXIuICBFbHNlIGZvcmNlICJjYWxsIiB0byAiY2FsbHMiIGNvbnZlcnNpb25zLiAgKi8KLQkJICAgICAgaWYgKHJfdHlwZSA9PSBSX01OMTAzMDBfUENSRUwzMgotCQkJICB8fCByX3R5cGUgPT0gUl9NTjEwMzAwX1BDUkVMMTYpCi0JCQloYXNoLT5kaXJlY3RfY2FsbHMrKzsKLQkJICAgICAgZWxzZQotCQkJaGFzaC0+ZmxhZ3MgfD0gTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFM7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIE5vdyBsb29rIGF0IHRoZSBhY3R1YWwgY29udGVudHMgdG8gZ2V0IHRoZSBzdGFjayBzaXplLAotCQkgYW5kIGEgbGlzdCBvZiB3aGF0IHJlZ2lzdGVycyB3ZXJlIHNhdmVkIGluIHRoZSBwcm9sb2d1ZQotCQkgKGllIG1vdm1fYXJncykuICAqLwotCSAgICAgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQkJewotCi0JCSAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLQkJICBpbnQgaWR4LCBzaG5keDsKLQotCQkgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICBzZWN0aW9uKTsKLQotCi0JCSAgLyogTG9vayBhdCBlYWNoIGZ1bmN0aW9uIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uIGFuZAotCQkgICAgIHVwZGF0ZSBpbmZvIGZvciB0aGF0IGZ1bmN0aW9uLiAgKi8KLQkJICBlc3ltID0gZXh0c3ltczsKLQkJICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0JCSAgICB7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgJmlzeW0pOwotCQkgICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCQkJICAmJiBFTEZfU1RfVFlQRSAoaXN5bS5zdF9pbmZvKSA9PSBTVFRfRlVOQykKLQkJCXsKLQkJCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID4gMAotCQkJCSAgICYmIGlzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCQkJICAgIHN5bV9zZWMKLQkJCSAgICAgID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgaXN5bS5zdF9zaG5keCk7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKLQkJCSAgICBzeW1fc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCi0JCQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCXN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJaXN5bS5zdF9uYW1lKTsKLQotCQkJICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzCi0JCQkgICAgIGxvY2FsIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCQkJICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOwotCQkJICBpZiAobmV3X25hbWUgPT0gMCkKLQkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkJICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKLQkJCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKLQotCQkJICBoYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJCSAgICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJmhhc2hfdGFibGUtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LAotCQkJCQkJICAgICAgICAgIHN5bV9uYW1lLCB0cnVlLAotCQkJCQkJICAgICAgICAgIHRydWUsIGZhbHNlKTsKLQkJCSAgZnJlZSAobmV3X25hbWUpOwotCQkJICBjb21wdXRlX2Z1bmN0aW9uX2luZm8gKGlucHV0X2JmZCwgaGFzaCwKLQkJCQkJICAgICAgICAgaXN5bS5zdF92YWx1ZSwgY29udGVudHMpOwotCQkJfQotCQkgICAgfQotCi0JCSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotCQkgIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUKLQkJCQkgICAgICAgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotCQkgIGZvciAoaWR4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaWR4KyspCi0JCSAgICB7Ci0JCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgJmlzeW0pOwotCQkgICAgICBoYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgICAgIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2lkeF07Ci0JCSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JCQkgICYmIEVMRl9TVF9UWVBFIChpc3ltLnN0X2luZm8pID09IFNUVF9GVU5DCi0JCQkgICYmIChoYXNoKS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjdGlvbgotCQkJICAmJiAoKGhhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgIHx8IChoYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJCWNvbXB1dGVfZnVuY3Rpb25faW5mbyAoaW5wdXRfYmZkLCBoYXNoLAotCQkJCQkgICAgICAgKGhhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUsCi0JCQkJCSAgICAgICBjb250ZW50cyk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSByZWxvY3MuICAqLwotCSAgICAgIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotCQl7Ci0JCSAgZnJlZSAoZnJlZV9yZWxvY3MpOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIGNvbnRlbnRzLiAgKi8KLQkgICAgICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgfQotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIHN5bWJvbHMuICAqLwotCSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQkJZnJlZSAoZnJlZV9leHRzeW1zKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JCX0KLQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBOb3cgaXRlcmF0ZSBvbiBlYWNoIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZSBhbmQgcGVyZm9ybQotCSB0aGUgZmluYWwgaW5pdGlhbGl6YXRpb24gc3RlcHMgb24gZWFjaC4gICovCi0gICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSAoaGFzaF90YWJsZSwKLQkJCQkJZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSwKLQkJCQkJTlVMTCk7Ci0gICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSAoaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUsCi0JCQkJCWVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnksCi0JCQkJCU5VTEwpOwotCi0gICAgICAvKiBBbGwgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuICAqLwotICAgICAgaGFzaF90YWJsZS0+ZmxhZ3MgfD0gTU4xMDMwMF9IQVNIX0VOVFJJRVNfSU5JVElBTElaRUQ7Ci0KLSAgICAgIC8qIE5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGdvIHRocm91Z2ggZWFjaAotCSBjb2RlIHNlY3Rpb24gYW5kIGRlbGV0ZSBhbnkgcHJvbG9ndWUgaW5zbnMgd2hpY2ggd2lsbCBiZQotCSByZWR1bmRhbnQgYmVjYXVzZSB0aGVpciBvcGVyYXRpb25zIHdpbGwgYmUgcGVyZm9ybWVkIGJ5Ci0JIGEgImNhbGwiIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGZvciAoaW5wdXRfYmZkID0gbGlua19pbmZvLT5pbnB1dF9iZmRzOwotCSAgIGlucHV0X2JmZCAhPSBOVUxMOwotCSAgIGlucHV0X2JmZCA9IGlucHV0X2JmZC0+bGlua19uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0JICAvKiBXZSdyZSBnb2luZyB0byBuZWVkIGFsbCB0aGUgc3ltYm9scyBmb3IgZWFjaCBiZmQuICAqLwotCSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgICAgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLSAgICAgICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLSAgICAgICAgICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotICAgICAgICAgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0gICAgICAgICAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0gICAgICAgICAgICAgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICAgICAgICAgICAgICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGlucHV0X2JmZCkKLSAgICAgICAgICAgICAgICAgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgIH0KLQotCSAgLyogV2FsayBvdmVyIGVhY2ggc2VjdGlvbiBpbiB0aGlzIGJmZC4gICovCi0JICBmb3IgKHNlY3Rpb24gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOwotCSAgICAgICBzZWN0aW9uICE9IE5VTEw7Ci0JICAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaW50IHNobmR4OwotCSAgICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0JICAgICAgaW50IGlkeDsKLQotCSAgICAgIC8qIFNraXAgbm9uLWNvZGUgc2VjdGlvbnMgYW5kIGVtcHR5IHNlY3Rpb25zLiAgKi8KLQkgICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpID09IDAgfHwgc2VjdGlvbi0+X3Jhd19zaXplID09IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgaWYgKHNlY3Rpb24tPnJlbG9jX2NvdW50ICE9IDApCi0JCXsKLSAgICAgICAgICAgICAgICAgIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gICAgICAgICAgICAgICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0X2JmZCwgc2VjdGlvbiwgKFBUUikgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgICAgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgICAgICAgICAgICAgICAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJfQotCi0JICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IG9mIHNlY3Rpb24gY29udGVudHMgaWYgaXQgZXhpc3RzLiAgKi8KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCWNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkJICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKWJmZF9tYWxsb2MgKHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkJICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBzZWN0aW9uLAotCQkJCQkJIGNvbnRlbnRzLCAoZmlsZV9wdHIpIDAsCi0JCQkJCQkgc2VjdGlvbi0+X3Jhd19zaXplKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQotCSAgICAgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChpbnB1dF9iZmQsIHNlY3Rpb24pOwotCi0JICAgICAgLyogTm93IGxvb2sgZm9yIGFueSBmdW5jdGlvbiBpbiB0aGlzIHNlY3Rpb24gd2hpY2ggbmVlZHMKLQkJIGluc25zIGRlbGV0ZWQgZnJvbSBpdHMgcHJvbG9ndWUuICAqLwotCSAgICAgIGVzeW0gPSBleHRzeW1zOwotCSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgICAgICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLQkJewotCQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkJICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwotCQkgIGFzZWN0aW9uICpzeW1fc2VjOwotCQkgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCQkgIGNoYXIgKm5ld19uYW1lOwotCi0JCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sICZpc3ltKTsKLQotCQkgIGlmIChpc3ltLnN0X3NobmR4ICE9IHNobmR4KQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JCSAgICBzeW1fc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID4gMCAmJiBpc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkJICAgIHN5bV9zZWMKLQkJICAgICAgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltLnN0X3NobmR4KTsKLQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JCSAgICBzeW1fc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JCSAgICBzeW1fc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQotCQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCXN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJaXN5bS5zdF9uYW1lKTsKLQotCQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMKLQkJICAgICBsb2NhbCBzeW1ib2wgaW4gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQkJICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOwotCQkgIGlmIChuZXdfbmFtZSA9PSAwKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3ByaW50ZiAobmV3X25hbWUsICIlc18lMDh4Iiwgc3ltX25hbWUsIChpbnQpc3ltX3NlYyk7Ci0JCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKLQotCQkgIHN5bV9oYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUtPnJvb3QsCi0JCQkJCSAgICAgICAgICBzeW1fbmFtZSwgZmFsc2UsCi0JCQkJCSAgICAgICAgICBmYWxzZSwgZmFsc2UpOwotCi0JCSAgZnJlZSAobmV3X25hbWUpOwotCQkgIGlmIChzeW1faGFzaCA9PSBOVUxMKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAoISAoKHN5bV9oYXNoKS0+ZmxhZ3MgJiBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUykKLQkJICAgICAgJiYgISAoKHN5bV9oYXNoKS0+ZmxhZ3MgJiBNTjEwMzAwX0RFTEVURURfUFJPTE9HVUVfQllURVMpKQotCQkgICAgewotCQkgICAgICBpbnQgYnl0ZXMgPSAwOwotCi0JCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoaW5ncy4gICovCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKilleHRzeW1zOwotCQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgICAgIC8qIENvdW50IGhvdyBtYW55IGJ5dGVzIHdlJ3JlIGdvaW5nIHRvIGRlbGV0ZS4gICovCi0JCSAgICAgIGlmIChzeW1faGFzaC0+bW92bV9hcmdzKQotCQkJYnl0ZXMgKz0gMjsKLQotCQkgICAgICBpZiAoc3ltX2hhc2gtPnN0YWNrX3NpemUgJiYgc3ltX2hhc2gtPnN0YWNrX3NpemUgPD0gMTI4KQotCQkJYnl0ZXMgKz0gMzsKLQkJICAgICAgZWxzZSBpZiAoc3ltX2hhc2gtPnN0YWNrX3NpemUKLQkJCSAgICAgICAmJiBzeW1faGFzaC0+c3RhY2tfc2l6ZSA8IDI1NikKLQkJCWJ5dGVzICs9IDQ7Ci0KLQkJICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGRlbGV0ZWQgcHJvbG9ndWUgYnl0ZXMgZm9yIHRoaXMKLQkJCSBmdW5jdGlvbi4gICovCi0JCSAgICAgIHN5bV9oYXNoLT5mbGFncyB8PSBNTjEwMzAwX0RFTEVURURfUFJPTE9HVUVfQllURVM7Ci0KLQkJICAgICAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0JCSAgICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgc2VjdGlvbiwKLQkJCQkJCQkgICBpc3ltLnN0X3ZhbHVlLAotCQkJCQkJCSAgIGJ5dGVzKSkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAgIC8qIFNvbWV0aGluZyBjaGFuZ2VkLiAgTm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0Ci0JCQkgbWF5IGxlYWQgdG8gbW9yZSByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KLQkJICAgICAgKmFnYWluID0gdHJ1ZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogTG9vayBmb3IgYW55IGdsb2JhbCBmdW5jdGlvbnMgaW4gdGhpcyBzZWN0aW9uIHdoaWNoCi0JCSBuZWVkIGluc25zIGRlbGV0ZWQgZnJvbSB0aGVpciBwcm9sb2d1ZXMuICAqLwotCSAgICAgIGVzeW0gPSBleHRzeW1zICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgICAgICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplCi0JCQkJICAgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotCSAgICAgIGZvciAoaWR4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaWR4KyspCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0JCSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKLQotCQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCAmaXN5bSk7Ci0JCSAgc3ltX2hhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkgICAgICAgKGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2lkeF0pOwotCQkgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JCSAgICAgICYmIChzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID09IHNlY3Rpb24KLQkJICAgICAgJiYgISAoKHN5bV9oYXNoKS0+ZmxhZ3MgJiBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUykKLQkJICAgICAgJiYgISAoKHN5bV9oYXNoKS0+ZmxhZ3MgJiBNTjEwMzAwX0RFTEVURURfUFJPTE9HVUVfQllURVMpKQotCQkgICAgewotCQkgICAgICBpbnQgYnl0ZXMgPSAwOwotCi0JCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoaW5ncy4gICovCi0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKilleHRzeW1zOwotCQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgICAgIC8qIENvdW50IGhvdyBtYW55IGJ5dGVzIHdlJ3JlIGdvaW5nIHRvIGRlbGV0ZS4gICovCi0JCSAgICAgIGlmIChzeW1faGFzaC0+bW92bV9hcmdzKQotCQkJYnl0ZXMgKz0gMjsKLQotCQkgICAgICBpZiAoc3ltX2hhc2gtPnN0YWNrX3NpemUgJiYgc3ltX2hhc2gtPnN0YWNrX3NpemUgPD0gMTI4KQotCQkJYnl0ZXMgKz0gMzsKLQkJICAgICAgZWxzZSBpZiAoc3ltX2hhc2gtPnN0YWNrX3NpemUKLQkJCSAgICAgICAmJiBzeW1faGFzaC0+c3RhY2tfc2l6ZSA8IDI1NikKLQkJCWJ5dGVzICs9IDQ7Ci0KLQkJICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGRlbGV0ZWQgcHJvbG9ndWUgYnl0ZXMgZm9yIHRoaXMKLQkJCSBmdW5jdGlvbi4gICovCi0JCSAgICAgIHN5bV9oYXNoLT5mbGFncyB8PSBNTjEwMzAwX0RFTEVURURfUFJPTE9HVUVfQllURVM7Ci0KLQkJICAgICAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0JCSAgICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgc2VjdGlvbiwKLQkJCQkJCQkgICAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUsCi0JCQkJCQkJICAgYnl0ZXMpKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogU29tZXRoaW5nIGNoYW5nZWQuICBOb3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQKLQkJCSBtYXkgbGVhZCB0byBtb3JlIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotCQkgICAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgcmVsb2NzLiAgKi8KLQkgICAgICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLQkJewotCQkgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0JCX0KLQotCSAgICAgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSBjb250ZW50cy4gICovCi0JICAgICAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLQkJewotCQkgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JCSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIH0KLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIENhY2hlIG9yIGZyZWUgYW55IG1lbW9yeSB3ZSBhbGxvY2F0ZWQgZm9yIHRoZSBzeW1ib2xzLiAgKi8KLQkgIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JCWZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCQl9Ci0JICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLQotICAvKiAoUmUpaW5pdGlhbGl6ZSBmb3IgdGhlIGJhc2ljIGluc3RydWN0aW9uIHNob3J0ZW5pbmcvcmVsYXhpbmcgcGFzcy4gICovCi0gIGNvbnRlbnRzID0gTlVMTDsKLSAgZXh0c3ltcyA9IE5VTEw7Ci0gIGludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLSAgLyogV2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBmb3IgYSByZWxvY2F0ZWFibGUgbGluaywgaWYKLSAgICAgdGhpcyBzZWN0aW9uIGRvZXMgbm90IGhhdmUgcmVsb2NzLCBvciBpZiB0aGlzIGlzIG5vdCBhCi0gICAgIGNvZGUgc2VjdGlvbi4gICovCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLSAgICAgIHx8IHNlYy0+cmVsb2NfY291bnQgPT0gMAotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc2VjdGlvbiwKLSAgICAgaW5pdGlhbGl6ZSB0aGUgY29va2VkIHNpemUuICAqLwotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLQotICAvKiBHZXQgYSBjb3B5IG9mIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCSAgICAgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIC8qIFdhbGsgdGhyb3VnaCB0aGVtIGxvb2tpbmcgZm9yIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgc3ltdmFsOwotICAgICAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLQotICAgICAgLyogSWYgdGhpcyBpc24ndCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmVsYXhlZCwgdGhlbiBpZ25vcmUKLQkgdGhpcyByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF9OT05FCi0JICB8fCBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwXzgKLQkgIHx8IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfTUFYKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBSZWFkIHRoaXMgQkZEJ3Mgc3ltYm9scyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCSAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLQkgICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBleHRzeW1zOwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCQkgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkJICAgICAgIT0gc3ltdGFiX2hkci0+c2hfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhlIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCSAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0JICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQkgIGNoYXIgKm5ld19uYW1lOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCi0JICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIHN5bV9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIHN5bV9zZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaXN5bS5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIHN5bV9zZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgICBzeW1fc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQotCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKLQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwKLQkJCQkJCSAgICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkgICAgICBpc3ltLnN0X25hbWUpOwotCi0JICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzCi0JICAgICBsb2NhbCBzeW1ib2wgaW4gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQkgIG5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzeW1fbmFtZSkgKyAxMCk7Ci0JICBpZiAobmV3X25hbWUgPT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKLQkgIHN5bV9uYW1lID0gbmV3X25hbWU7Ci0KLQkgIGggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCWVsZl9saW5rX2hhc2hfbG9va3VwICgmaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUtPnJvb3QsCi0JCQkJICAgICAgc3ltX25hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCSAgZnJlZSAobmV3X25hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluZHg7Ci0KLQkgIC8qIEFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJKGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XSk7Ci0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQKLSAJCXN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAJCXJlZ3VsYXIgcmVsb2MgcHJvY2Vzc2luZy4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3ltdmFsID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JfQotCi0gICAgICAvKiBGb3Igc2ltcGxpY2l0eSBvZiBjb2RpbmcsIHdlIGFyZSBnb2luZyB0byBtb2RpZnkgdGhlIHNlY3Rpb24KLQkgY29udGVudHMsIHRoZSBzZWN0aW9uIHJlbG9jcywgYW5kIHRoZSBCRkQgc3ltYm9sIHRhYmxlLiAgV2UKLQkgbXVzdCB0ZWxsIHRoZSByZXN0IG9mIHRoZSBjb2RlIG5vdCB0byBmcmVlIHVwIHRoaXMKLQkgaW5mb3JtYXRpb24uICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBpbnN0ZWFkIGNyZWF0ZSBhIHRhYmxlCi0JIG9mIGNoYW5nZXMgd2hpY2ggaGF2ZSB0byBiZSBtYWRlLCBhcyBpcyBkb25lIGluIGNvZmYtbWlwcy5jOwotCSB0aGF0IHdvdWxkIGJlIG1vcmUgd29yaywgYnV0IHdvdWxkIHJlcXVpcmUgbGVzcyBtZW1vcnkgd2hlbgotCSB0aGUgbGlua2VyIGlzIHJ1bi4gICovCi0KLSAgICAgIC8qIFRyeSB0byB0dXJuIGEgMzJiaXQgcGMtcmVsYXRpdmUgYnJhbmNoL2NhbGwgaW50byBhIDE2Yml0IHBjLXJlbGF0aXZlCi0JIGJyYW5jaC9jYWxsLCBhbHNvIGRlYWwgd2l0aCAiY2FsbCIgLT4gImNhbGxzIiBjb252ZXJzaW9ucyBhbmQKLQkgaW5zZXJ0aW9uIG9mIHByb2xvZ3VlIGRhdGEgaW50byAiY2FsbCIgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwX1BDUkVMMzIpCi0JewotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQotCSAgLyogSWYgd2UndmUgZ290IGEgImNhbGwiIGluc3RydWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgdHVybmVkCi0JICAgICBpbnRvIGEgImNhbGxzIiBpbnN0cnVjdGlvbiwgZG8gc28gbm93LiAgSXQgc2F2ZXMgYSBieXRlLiAgKi8KLQkgIGlmIChoICYmIChoLT5mbGFncyAmIE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICAvKiBNYWtlIHN1cmUgd2UncmUgd29ya2luZyB3aXRoIGEgImNhbGwiIGluc3RydWN0aW9uISAgKi8KLQkgICAgICBpZiAoY29kZSA9PSAweGRkKQotCQl7Ci0JCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywKLQkJICAgICBldGMuICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmYywgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZiwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0KLQkJICAvKiBGaXggaXJlbC0+cl9vZmZzZXQgYW5kIGlyZWwtPnJfYWRkZW5kLiAgKi8KLQkJICBpcmVsLT5yX29mZnNldCArPSAxOwotCQkgIGlyZWwtPnJfYWRkZW5kICs9IDE7Ci0KLQkJICAvKiBEZWxldGUgb25lIGJ5dGUgb2YgZGF0YS4gICovCi0JCSAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDMsIDEpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgKmFnYWluID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChoKQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgZ290IGEgImNhbGwiIGluc3RydWN0aW9uIHdoaWNoIG5lZWRzIHNvbWUgZGF0YQotCQkgZnJvbSB0YXJnZXQgZnVuY3Rpb24gZmlsbGVkIGluLiAgKi8KLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgLyogSW5zZXJ0IGRhdGEgZnJvbSB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGludG8gdGhlICJjYWxsIgotCQkgaW5zdHJ1Y3Rpb24gaWYgbmVlZGVkLiAgKi8KLQkgICAgICBpZiAoY29kZSA9PSAweGRkKQotCQl7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBoLT5tb3ZtX2FyZ3MsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyA0KTsKLQkJICBiZmRfcHV0XzggKGFiZmQsIGgtPnN0YWNrX3NpemUgKyBoLT5tb3ZtX3N0YWNrX3NpemUsCi0JCQkgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyA1KTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gaXJlbC0+cl9vZmZzZXQ7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLCBub3RlIHRoZSBoaWdoIHZhbHVlIGlzCi0JICAgICAweDdmZmYgKyAyIGFzIHRoZSB0YXJnZXQgd2lsbCBiZSB0d28gYnl0ZXMgY2xvc2VyIGlmIHdlIGFyZQotCSAgICAgYWJsZSB0byByZWxheC4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDgwMDEgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIGlmIChjb2RlICE9IDB4ZGMgJiYgY29kZSAhPSAweGRkICYmIGNvZGUgIT0gMHhmZikKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4ZGMpCi0JCWJmZF9wdXRfOCAoYWJmZCwgMHhjYywgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCSAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMHhkZCkKLQkJYmZkX3B1dF84IChhYmZkLCAweGNkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICAgICAgZWxzZSBpZiAoY29kZSA9PSAweGZmKQotCQliZmRfcHV0XzggKGFiZmQsIDB4ZmEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCSAgICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTU4xMDMwMF9QQ1JFTDE2KTsKLQotCSAgICAgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JICAgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JICAgICAgKmFnYWluID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogVHJ5IHRvIHR1cm4gYSAxNmJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggaW50byBhIDhiaXQgcGMtcmVsYXRpdmUKLQkgYnJhbmNoLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwX1BDUkVMMTYpCi0JewotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQotCSAgLyogSWYgd2UndmUgZ290IGEgImNhbGwiIGluc3RydWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgdHVybmVkCi0JICAgICBpbnRvIGEgImNhbGxzIiBpbnN0cnVjdGlvbiwgZG8gc28gbm93LiAgSXQgc2F2ZXMgYSBieXRlLiAgKi8KLQkgIGlmIChoICYmIChoLT5mbGFncyAmIE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICAvKiBNYWtlIHN1cmUgd2UncmUgd29ya2luZyB3aXRoIGEgImNhbGwiIGluc3RydWN0aW9uISAgKi8KLQkgICAgICBpZiAoY29kZSA9PSAweGNkKQotCQl7Ci0JCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywKLQkJICAgICBldGMuICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZiwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0KLQkJICAvKiBGaXggaXJlbC0+cl9vZmZzZXQgYW5kIGlyZWwtPnJfYWRkZW5kLiAgKi8KLQkJICBpcmVsLT5yX29mZnNldCArPSAxOwotCQkgIGlyZWwtPnJfYWRkZW5kICs9IDE7Ci0KLQkJICAvKiBEZWxldGUgb25lIGJ5dGUgb2YgZGF0YS4gICovCi0JCSAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDEsIDEpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgKmFnYWluID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChoKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIEluc2VydCBkYXRhIGZyb20gdGhlIHRhcmdldCBmdW5jdGlvbiBpbnRvIHRoZSAiY2FsbCIKLQkJIGluc3RydWN0aW9uIGlmIG5lZWRlZC4gICovCi0JICAgICAgaWYgKGNvZGUgPT0gMHhjZCkKLQkJewotCQkgIGJmZF9wdXRfOCAoYWJmZCwgaC0+bW92bV9hcmdzLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMik7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBoLT5zdGFja19zaXplICsgaC0+bW92bV9zdGFja19zaXplLAotCQkJICAgICBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMyk7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCi0JICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHZhbHVlIC09IGlyZWwtPnJfb2Zmc2V0OwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gOCBiaXRzLCBub3RlIHRoZSBoaWdoIHZhbHVlIGlzCi0JICAgICAweDdmICsgMSBhcyB0aGUgdGFyZ2V0IHdpbGwgYmUgb25lIGJ5dGVzIGNsb3NlciBpZiB3ZSBhcmUKLQkgICAgIGFibGUgdG8gcmVsYXguICAqLwotCSAgaWYgKChsb25nKXZhbHVlIDwgMHg4MCAmJiAobG9uZyl2YWx1ZSA+IC0weDgwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIGlmIChjb2RlICE9IDB4Y2MpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCSAgICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIDB4Y2EsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTU4xMDMwMF9QQ1JFTDgpOwotCi0JICAgICAgLyogRGVsZXRlIG9uZSBieXRlIG9mIGRhdGEuICAqLwotCSAgICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICBpcmVsLT5yX29mZnNldCArIDEsIDEpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgICAgICphZ2FpbiA9IHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRyeSB0byBlbGltaW5hdGUgYW4gdW5jb25kaXRpb25hbCA4IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2gKLQkgd2hpY2ggaW1tZWRpYXRlbHkgZm9sbG93cyBhIGNvbmRpdGlvbmFsIDggYml0IHBjLXJlbGF0aXZlCi0JIGJyYW5jaCBhcm91bmQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLgotCi0JICAgIG9yaWdpbmFsOgkJbmV3OgotCSAgICBiQ0MgbGFiMQkJYkNDJyBsYWIyCi0JICAgIGJyYSBsYWIyCi0JICAgbGFiMToJICAgICAgIGxhYjE6Ci0KLQotCSBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgYkNDIGNhbid0IHJlYWNoIGxhYjIgYXQgYXNzZW1ibHkgdGltZSwKLQkgYnV0IGR1ZSB0byBvdGhlciByZWxheGF0aW9ucyBpdCBjYW4gcmVhY2ggYXQgbGluayB0aW1lLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwX1BDUkVMOCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqbnJlbDsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0JICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gaXJlbC0+cl9vZmZzZXQ7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogRG8gbm90aGluZyBpZiB0aGlzIHJlbG9jIGlzIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIHNlY3Rpb24uICAqLwotCSAgaWYgKGlyZWwtPnJfb2Zmc2V0ID09IHNlYy0+X2Nvb2tlZF9zaXplKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogU2VlIGlmIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGFuIHVuY29uZGl0aW9uYWwgcGMtcmVsYXRpdmUKLQkgICAgIGJyYW5jaCwgbW9yZSBvZnRlbiB0aGFuIG5vdCB0aGlzIHRlc3Qgd2lsbCBmYWlsLCBzbyB3ZQotCSAgICAgdGVzdCBpdCBmaXJzdCB0byBzcGVlZCB0aGluZ3MgdXAuICAqLwotCSAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDEpOwotCSAgaWYgKGNvZGUgIT0gMHhjYSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEFsc28gbWFrZSBzdXJlIHRoZSBuZXh0IHJlbG9jYXRpb24gYXBwbGllcyB0byB0aGUgbmV4dAotCSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoYXQgaXQncyBhIHBjLXJlbGF0aXZlIDggYml0IGJyYW5jaC4gICovCi0JICBucmVsID0gaXJlbCArIDE7Ci0JICBpZiAobnJlbCA9PSBpcmVsZW5kCi0JICAgICAgfHwgaXJlbC0+cl9vZmZzZXQgKyAyICE9IG5yZWwtPnJfb2Zmc2V0Ci0JICAgICAgfHwgRUxGMzJfUl9UWVBFIChucmVsLT5yX2luZm8pICE9IChpbnQpIFJfTU4xMDMwMF9QQ1JFTDgpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBNYWtlIHN1cmUgb3VyIGRlc3RpbmF0aW9uIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlCi0JICAgICB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0JICBpZiAoc3ltdmFsICE9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSArIGlyZWwtPnJfb2Zmc2V0ICsgMykpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBOb3cgbWFrZSBzdXJlIHdlIGFyZSBhIGNvbmRpdGlvbmFsIGJyYW5jaC4gIFRoaXMgbWF5IG5vdAotCSAgICAgYmUgbmVjZXNzYXJ5LCBidXQgd2h5IHRha2UgdGhlIGNoYW5jZS4KLQotCSAgICAgTm90ZSB0aGVzZSBjaGVja3MgYXNzdW1lIHRoYXQgUl9NTjEwMzAwX1BDUkVMOCByZWxvY3MKLQkgICAgIG9ubHkgb2NjdXIgb24gYkNDIGFuZCBiQ0N4IGluc25zLiAgSWYgdGhleSBvY2N1cmVkCi0JICAgICBlbHNld2hlcmUsIHdlJ2QgbmVlZCB0byBrbm93IHRoZSBzdGFydCBvZiB0aGlzIGluc24KLQkgICAgIGZvciB0aGlzIGNoZWNrIHRvIGJlIGFjY3VyYXRlLiAgKi8KLQkgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQkgIGlmIChjb2RlICE9IDB4YzAgJiYgY29kZSAhPSAweGMxICYmIGNvZGUgIT0gMHhjMgotCSAgICAgICYmIGNvZGUgIT0gMHhjMyAmJiBjb2RlICE9IDB4YzQgJiYgY29kZSAhPSAweGM1Ci0JICAgICAgJiYgY29kZSAhPSAweGM2ICYmIGNvZGUgIT0gMHhjNyAmJiBjb2RlICE9IDB4YzgKLQkgICAgICAmJiBjb2RlICE9IDB4YzkgJiYgY29kZSAhPSAweGU4ICYmIGNvZGUgIT0gMHhlOQotCSAgICAgICYmIGNvZGUgIT0gMHhlYSAmJiBjb2RlICE9IDB4ZWIpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBXZSBhbHNvIGhhdmUgdG8gYmUgc3VyZSB0aGVyZSBpcyBubyBzeW1ib2wvbGFiZWwKLQkgICAgIGF0IHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0JICBpZiAobW4xMDMwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcCAoYWJmZCwgc2VjLCBleHRzeW1zLAotCQkJCQkgICAgaXJlbC0+cl9vZmZzZXQgKyAxKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLQkgIHN3aXRjaCAoY29kZSkKLQkgICAgewotCSAgICAgIGNhc2UgMHhjODoKLQkJY29kZSA9IDB4Yzk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjOToKLQkJY29kZSA9IDB4Yzg7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjMDoKLQkJY29kZSA9IDB4YzI7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjMjoKLQkJY29kZSA9IDB4YzA7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjMzoKLQkJY29kZSA9IDB4YzE7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjMToKLQkJY29kZSA9IDB4YzM7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjNDoKLQkJY29kZSA9IDB4YzY7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjNjoKLQkJY29kZSA9IDB4YzQ7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjNzoKLQkJY29kZSA9IDB4YzU7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhjNToKLQkJY29kZSA9IDB4Yzc7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhlODoKLQkJY29kZSA9IDB4ZTk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHg5ZDoKLQkJY29kZSA9IDB4ZTg7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhlYToKLQkJY29kZSA9IDB4ZWI7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMHhlYjoKLQkJY29kZSA9IDB4ZWE7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgLyogU2V0IHRoZSByZWxvYyB0eXBlIGFuZCBzeW1ib2wgZm9yIHRoZSBmaXJzdCBicmFuY2gKLQkgICAgIGZyb20gdGhlIHNlY29uZCBicmFuY2guICAqLwotCSAgaXJlbC0+cl9pbmZvID0gbnJlbC0+cl9pbmZvOwotCi0JICAvKiBNYWtlIHRoZSByZWxvYyBmb3IgdGhlIHNlY29uZCBicmFuY2ggYSBudWxsIHJlbG9jLiAgKi8KLQkgIG5yZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKG5yZWwtPnJfaW5mbyksCi0JCQkJICAgICAgIFJfTU4xMDMwMF9OT05FKTsKLQotCSAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDEsIDIpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JICAqYWdhaW4gPSB0cnVlOwotCX0KLQotICAgICAgLyogVHJ5IHRvIHR1cm4gYSAyNCBpbW1lZGlhdGUsIGRpc3BsYWNlbWVudCBvciBhYnNvbHV0ZSBhZGRyZXNzCi0JIGludG8gYSA4IGltbWVkaWF0ZSwgZGlzcGxhY2VtZW50IG9yIGFic29sdXRlIGFkZHJlc3MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfMjQpCi0JewotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDggYml0cy4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDdmICYmIChsb25nKXZhbHVlID4gLTB4ODApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBBTTMzIGluc25zIHdoaWNoIGhhdmUgMjQgb3BlcmFuZHMgYXJlIDYgYnl0ZXMgbG9uZyBhbmQKLQkJIHdpbGwgaGF2ZSAweGZkIGFzIHRoZSBmaXJzdCBieXRlLiAgKi8KLQotCSAgICAgIC8qIEdldCB0aGUgZmlyc3Qgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMyk7Ci0KLQkgICAgICBpZiAoY29kZSA9PSAweGZkKQotCQl7Ci0JICAgICAgICAgIC8qIEdldCB0aGUgc2Vjb25kIG9wY29kZS4gICovCi0JICAgICAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgIC8qIFdlIGNhbiBub3QgcmVsYXggMHg2YiwgMHg3YiwgMHg4YiwgMHg5YiBhcyBubyAyNGJpdAotCQkgICAgIGVxdWl2YWxlbnQgaW5zdHJ1Y3Rpb25zIGV4aXN0cy4gICovCi0JICAgICAgICAgIGlmIChjb2RlICE9IDB4NmIgJiYgY29kZSAhPSAweDdiCi0JCSAgICAgICYmIGNvZGUgIT0gMHg4YiAmJiBjb2RlICE9IDB4OWIKLQkJICAgICAgJiYgKChjb2RlICYgMHgwZikgPT0gMHgwOSB8fCAoY29kZSAmIDB4MGYpID09IDB4MDgKLQkJCSAgfHwgKGNvZGUgJiAweDBmKSA9PSAweDBhIHx8IChjb2RlICYgMHgwZikgPT0gMHgwYgotCQkJICB8fCAoY29kZSAmIDB4MGYpID09IDB4MGUpKQotCQkgICAgewotCQkgICAgICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgICAgIG1vdmUgdGhlIHZhbHVlIG91dCBvZiBoaWdoIG1lbSBhbmQgdGh1cyBub3QgZml0Ci0JCSAgICAgICAgIGluIGEgc2lnbmVkIDhiaXQgdmFsdWUuICBUaGlzIGlzIGN1cnJlbnRseSBvdmVyCi0JCSAgICAgICAgIGNvbnNlcnZhdGl2ZS4gICovCi0JCSAgICAgIGlmICgodmFsdWUgJiAweDgwKSA9PSAwKQotCQkJewotCQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywKLQkJCSAgICAgZXRjLiAgKi8KLQkJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmYiwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDMpOwotCQkJICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJCSAgaXJlbC0+cl9pbmZvCi0JCQkgICAgPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJICAgICAgICAgUl9NTjEwMzAwXzgpOwotCi0JCQkgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JCQkgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXgKLQkJCSAgICAgYWdhaW4uICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdAotCQkJICAgICAgbWF5IGJlIHNsb3cuICAqLwotCQkJICAqYWdhaW4gPSB0cnVlOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRyeSB0byB0dXJuIGEgMzJiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcwotCSBpbnRvIGEgMTZiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF8zMikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gMjQgYml0cy4KLQkgICAgIFdlIGFsbG93IGFueSAxNmJpdCBtYXRjaCBoZXJlLiAgV2UgcHJ1bmUgdGhvc2Ugd2UgY2FuJ3QKLQkgICAgIGhhbmRsZSBiZWxvdy4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDdmZmZmZiAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDAwMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEFNMzMgaW5zbnMgd2hpY2ggaGF2ZSAzMmJpdCBvcGVyYW5kcyBhcmUgNyBieXRlcyBsb25nIGFuZAotCQkgd2lsbCBoYXZlIDB4ZmUgYXMgdGhlIGZpcnN0IGJ5dGUuICAqLwotCi0JICAgICAgLyogR2V0IHRoZSBmaXJzdCBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAzKTsKLQotCSAgICAgIGlmIChjb2RlID09IDB4ZmUpCi0JCXsKLQkgICAgICAgICAgLyogR2V0IHRoZSBzZWNvbmQgb3Bjb2RlLiAgKi8KLQkgICAgICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgLyogQWxsIHRoZSBhbTMzIDMyIC0+IDI0IHJlbGF4aW5nIHBvc3NpYmlsaXRpZXMuICAqLwotCQkgIC8qIFdlIGNhbiBub3QgcmVsYXggMHg2YiwgMHg3YiwgMHg4YiwgMHg5YiBhcyBubyAyNGJpdAotCQkgICAgIGVxdWl2YWxlbnQgaW5zdHJ1Y3Rpb25zIGV4aXN0cy4gICovCi0JICAgICAgICAgIGlmIChjb2RlICE9IDB4NmIgJiYgY29kZSAhPSAweDdiCi0JCSAgICAgICYmIGNvZGUgIT0gMHg4YiAmJiBjb2RlICE9IDB4OWIKLQkJICAgICAgJiYgKChjb2RlICYgMHgwZikgPT0gMHgwOSB8fCAoY29kZSAmIDB4MGYpID09IDB4MDgKLQkJCSAgfHwgKGNvZGUgJiAweDBmKSA9PSAweDBhIHx8IChjb2RlICYgMHgwZikgPT0gMHgwYgotCQkJICB8fCAoY29kZSAmIDB4MGYpID09IDB4MGUpKQotCQkgICAgewotCQkgICAgICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgICAgIG1vdmUgdGhlIHZhbHVlIG91dCBvZiBoaWdoIG1lbSBhbmQgdGh1cyBub3QgZml0Ci0JCSAgICAgICAgIGluIGEgc2lnbmVkIDE2Yml0IHZhbHVlLiAgVGhpcyBpcyBjdXJyZW50bHkgb3ZlcgotCQkgICAgICAgICBjb25zZXJ2YXRpdmUuICAqLwotCQkgICAgICBpZiAoKHZhbHVlICYgMHg4MDAwKSA9PSAwKQotCQkJewotCQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywKLQkJCSAgICAgZXRjLiAgKi8KLQkJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDMpOwotCQkJICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJCSAgaXJlbC0+cl9pbmZvCi0JCQkgICAgPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJICAgICAgICAgUl9NTjEwMzAwXzI0KTsKLQotCQkJICAvKiBEZWxldGUgb25lIGJ5dGUgb2YgZGF0YS4gICovCi0JCQkgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMywgMSkpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXgKLQkJCSAgICAgYWdhaW4uICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdAotCQkJICAgICAgbWF5IGJlIHNsb3cuICAqLwotCQkJICAqYWdhaW4gPSB0cnVlOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQotCQl9Ci0JICAgIH0KLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLgotCSAgICAgV2UgYWxsb3cgYW55IDE2Yml0IG1hdGNoIGhlcmUuICBXZSBwcnVuZSB0aG9zZSB3ZSBjYW4ndAotCSAgICAgaGFuZGxlIGJlbG93LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4N2ZmZiAmJiAobG9uZyl2YWx1ZSA+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+bW92bV9hcmdzICYgMHgwOCkKLQloYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gOCAqIDQ7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2FtMzMpCi0JewotCSAgLyogImV4b3RoZXIiIHNwYWNlLiAgZTAsIGUxLCBtZHJxLCBtY3JoLCBtY3JsLCBtY3ZmICovCi0JICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHgxKQotCSAgICBoYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gNiAqIDQ7Ci0KLQkgIC8qIGV4cmVnMSBzcGFjZS4gIGU0LCBlNSwgZTYsIGU3ICovCi0JICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHgyKQotCSAgICBoYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gNCAqIDQ7Ci0KLQkgIC8qIGV4cmVnMCBzcGFjZS4gIGUyLCBlMyAgKi8KLQkgIGlmIChoYXNoLT5tb3ZtX2FyZ3MgJiAweDQpCi0JICAgIGhhc2gtPm1vdm1fc3RhY2tfc2l6ZSArPSAyICogNDsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBsb29rIGZvciB0aGUgdHdvIHN0YWNrIGFkanVzdG1lbnQgdmFyaWFudHMuICAqLwotICBpZiAoYnl0ZTEgPT0gMHhmOCAmJiBieXRlMiA9PSAweGZlKQotICAgIHsKLSAgICAgIGludCB0ZW1wID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLSAgICAgIHRlbXAgPSAoKHRlbXAgJiAweGZmKSBeICh+MHg3ZikpICsgMHg4MDsKLQotICAgICAgaGFzaC0+c3RhY2tfc2l6ZSA9IC10ZW1wOwotICAgIH0KLSAgZWxzZSBpZiAoYnl0ZTEgPT0gMHhmYSAmJiBieXRlMiA9PSAweGZlKQotICAgIHsKLSAgICAgIGludCB0ZW1wID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMik7Ci0gICAgICB0ZW1wID0gKCh0ZW1wICYgMHhmZmZmKSBeICh+MHg3ZmZmKSkgKyAweDgwMDA7Ci0gICAgICB0ZW1wID0gLXRlbXA7Ci0KLSAgICAgIGlmICh0ZW1wIDwgMjU1KQotCWhhc2gtPnN0YWNrX3NpemUgPSB0ZW1wOwotICAgIH0KLQotICAvKiBJZiB0aGUgdG90YWwgc3RhY2sgdG8gYmUgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsIGluc3RydWN0aW9uIGlzIG1vcmUKLSAgICAgdGhhbiAyNTUgYnl0ZXMsIHRoZW4gd2UgY2FuJ3QgcmVtb3ZlIHRoZSBzdGFjayBhZGp1c3RtZW50IGJ5IHVzaW5nCi0gICAgICJjYWxsIiAod2UgbWlnaHQgc3RpbGwgYmUgYWJsZSB0byByZW1vdmUgdGhlICJtb3ZtIiBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChoYXNoLT5zdGFja19zaXplICsgaGFzaC0+bW92bV9zdGFja19zaXplID4gMjU1KQotICAgIGhhc2gtPnN0YWNrX3NpemUgPSAwOwotCi0gIHJldHVybjsKLX0KLQotLyogRGVsZXRlIHNvbWUgYnl0ZXMgZnJvbSBhIHNlY3Rpb24gd2hpbGUgcmVsYXhpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFkZHIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgaW50IGNvdW50OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICBpbnQgc2huZHgsIGluZGV4OwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhbGlnbjsKLSAgYmZkX3ZtYSB0b2FkZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQotICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCi0gIC8qIFRoZSBkZWxldGlvbiBtdXN0IHN0b3AgYXQgdGhlIG5leHQgQUxJR04gcmVsb2MgZm9yIGFuIGFsaWdtZW50Ci0gICAgIHBvd2VyIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGRlbGV0aW5nLiAgKi8KLQotICBpcmVsYWxpZ24gPSBOVUxMOwotICB0b2FkZHIgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICBpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOwotICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0gIG1lbW1vdmUgKGNvbnRlbnRzICsgYWRkciwgY29udGVudHMgKyBhZGRyICsgY291bnQsIHRvYWRkciAtIGFkZHIgLSBjb3VudCk7Ci0gIHNlYy0+X2Nvb2tlZF9zaXplIC09IGNvdW50OwotCi0gIC8qIEFkanVzdCBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAoaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIG5ldyByZWxvYyBhZGRyZXNzLiAgKi8KLSAgICAgIGlmICgoaXJlbC0+cl9vZmZzZXQgPiBhZGRyCi0JICAgJiYgaXJlbC0+cl9vZmZzZXQgPCB0b2FkZHIpKQotCWlyZWwtPnJfb2Zmc2V0IC09IGNvdW50OwotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIGxvY2FsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA+IGFkZHIKLQkgICYmIGlzeW0uc3RfdmFsdWUgPCB0b2FkZHIpCi0JewotCSAgaXN5bS5zdF92YWx1ZSAtPSBjb3VudDsKLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZpc3ltLCBlc3ltKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhZGp1c3QgdGhlIGdsb2JhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKLSAgZm9yIChpbmRleCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGluZGV4KyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLSAgICAgIHN5bV9oYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkgICAoZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZGV4XSk7Ci0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgKChzeW1faGFzaCktPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IChzeW1faGFzaCktPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnZhbHVlID4gYWRkcgotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIChzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi52YWx1ZSAtPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiBhIHN5bWJvbCBleGlzdHMgYXQgdGhlIGdpdmVuIGFkZHJlc3MsIGVsc2UgcmV0dXJuCi0gICBmYWxzZS4gICovCi1zdGF0aWMgYm9vbGVhbgotbW4xMDMwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcCAoYWJmZCwgc2VjLCBleHRzeW1zLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgaW50IHNobmR4OwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaCwgKipzeW1faGFzaF9lbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotICAvKiBFeGFtaW5lIGFsbCB0aGUgc3ltYm9scy4gICovCi0gIGVzeW0gPSBleHRzeW1zOwotICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0KLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiBpc3ltLnN0X3ZhbHVlID09IGFkZHIpCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHN5bV9oYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKikoZWxmX3N5bV9oYXNoZXMgKGFiZmQpKTsKLSAgc3ltX2hhc2hfZW5kID0gKHN5bV9oYXNoCi0JCSAgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKQotCQkgICAgIC0gc3ltdGFiX2hkci0+c2hfaW5mbykpOwotICBmb3IgKDsgc3ltX2hhc2ggPCBzeW1faGFzaF9lbmQ7IHN5bV9oYXNoKyspCi0gICAgewotICAgICAgaWYgKCgoKnN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgKCpzeW1faGFzaCktPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmICgqc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmICgqc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUgPT0gYWRkcikKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVGhpcyBpcyBhIHZlcnNpb24gb2YgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gICB3aGljaCB1c2VzIG1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotbW4xMDMwMF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSAgICBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1N5bSAqaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0KLSAgLyogV2Ugb25seSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiByZWxheGluZywgb3Igb2YgaGF2aW5nIGEKLSAgICAgcGFydGljdWxhciBzZXQgb2Ygc2VjdGlvbiBjb250ZW50cywgc3BlY2lhbGx5LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZQotICAgICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCQkgICAgICAgcmVsb2NhdGVhYmxlLAotCQkJCQkJICAgICAgIHN5bWJvbHMpOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotCi0gIG1lbWNweSAoZGF0YSwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzLAotCSAgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0gICAgICAmJiBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSAqaXN5bXA7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3BwOwotICAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLQotICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JZXh0ZXJuYWxfc3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICBlbHNlCi0JewotCSAgZXh0ZXJuYWxfc3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgICAgICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSk7Ci0JICBpZiAoZXh0ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9zeW1zLCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSksCi0JCQkgICAgc3ltdGFiX2hkci0+c2hfaW5mbywgaW5wdXRfYmZkKQotCQkgICE9IChzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpIE5VTEwsCi0JCQkgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCBmYWxzZSkpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpbnRlcm5hbF9zeW1zID0gKChFbGZfSW50ZXJuYWxfU3ltICopCi0JCSAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCQkgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlzeW1wID0gaW50ZXJuYWxfc3ltczsKLSAgICAgIHNlY3BwID0gc2VjdGlvbnM7Ci0gICAgICBlc3ltID0gZXh0ZXJuYWxfc3ltczsKLSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgKytlc3ltLCArK2lzeW1wLCArK3NlY3BwKQotCXsKLQkgIGFzZWN0aW9uICppc2VjOwotCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgaXN5bXApOwotCi0JICBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgaXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPiAwICYmIGlzeW1wLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIGlzZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltcC0+c3Rfc2huZHgpOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIGlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIGlzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2hvIGtub3dzPyAgKi8KLQkgICAgICBpc2VjID0gTlVMTDsKLQkgICAgfQotCi0JICAqc2VjcHAgPSBpc2VjOwotCX0KLQotICAgICAgaWYgKCEgbW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICBpbnB1dF9zZWN0aW9uLCBkYXRhLCBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJICAgICBpbnRlcm5hbF9zeW1zLCBzZWN0aW9ucykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotCWZyZWUgKHNlY3Rpb25zKTsKLSAgICAgIHNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0JZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBpbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLQlmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgICAgIGV4dGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotCWZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gZGF0YTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBOVUxMCi0gICAgICAmJiBpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFzc29ydGVkIGhhc2ggdGFibGUgZnVuY3Rpb25zLiAgKi8KLQotLyogSW5pdGlhbGl6ZSBhbiBlbnRyeSBpbiB0aGUgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIE1OMTAzMDAgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZXQtPmRpcmVjdF9jYWxscyA9IDA7Ci0gICAgICByZXQtPnN0YWNrX3NpemUgPSAwOwotICAgICAgcmV0LT5tb3ZtX3N0YWNrX3NpemUgPSAwOwotICAgICAgcmV0LT5mbGFncyA9IDA7Ci0gICAgICByZXQtPm1vdm1fYXJncyA9IDA7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGFuIG1uMTAzMDAgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5mbGFncyA9IDA7Ci0gIHJldC0+c3RhdGljX2hhc2hfdGFibGUKLSAgICA9ICgoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlICopCi0gICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0LT5zdGF0aWNfaGFzaF90YWJsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5zdGF0aWNfaGFzaF90YWJsZS0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldC0+c3RhdGljX2hhc2hfdGFibGUpOwotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLXN0YXRpYyBpbnQKLWVsZl9tbjEwMzAwX21hY2ggKGZsYWdzKQotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgc3dpdGNoIChmbGFncyAmIEVGX01OMTAzMDBfTUFDSCkKLSAgICB7Ci0gICAgICBjYXNlIEVfTU4xMDMwMF9NQUNIX01OMTAzMDA6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gYmZkX21hY2hfbW4xMDMwMDsKLQotICAgICAgY2FzZSBFX01OMTAzMDBfTUFDSF9BTTMzOgotICAgICAgICByZXR1cm4gYmZkX21hY2hfYW0zMzsKLSAgICB9Ci19Ci0KLS8qIFRoZSBmaW5hbCBwcm9jZXNzaW5nIGRvbmUganVzdCBiZWZvcmUgd3JpdGluZyBvdXQgYSBNTjEwMzAwIEVMRiBvYmplY3QKLSAgIGZpbGUuICBUaGlzIGdldHMgdGhlIE1OMTAzMDAgYXJjaGl0ZWN0dXJlIHJpZ2h0IGJhc2VkIG9uIHRoZSBtYWNoaW5lCi0gICBudW1iZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLV9iZmRfbW4xMDMwMF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgICBkZWZhdWx0OgotICAgICAgY2FzZSBiZmRfbWFjaF9tbjEwMzAwOgotCXZhbCA9IEVfTU4xMDMwMF9NQUNIX01OMTAzMDA7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgYmZkX21hY2hfYW0zMzoKLQl2YWwgPSBFX01OMTAzMDBfTUFDSF9BTTMzOwotCWJyZWFrOwotICAgIH0KLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPSB+IChFRl9NTjEwMzAwX01BQ0gpOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSB2YWw7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfbW4xMDMwMF9lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbW4xMDMwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxmX21uMTAzMDBfbWFjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi0KLWJvb2xlYW4KLV9iZmRfbW4xMDMwMF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0gICAgICAmJiBiZmRfZ2V0X21hY2ggKG9iZmQpIDwgYmZkX2dldF9tYWNoIChpYmZkKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfZ2V0X21hY2ggKGliZmQpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9tbjEwMzAwX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLW1uMTAzMDAiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tbjEwMzAwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX01OMTAzMDAKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJbW4xMDMwMF9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJMAotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJMQotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJbW4xMDMwMF9lbGZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawltbjEwMzAwX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgltbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbgltbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLQkJCQltbjEwMzAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLQkJCQllbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLQotLyogU28gd2UgY2FuIHNldCBiaXRzIGluIGVfZmxhZ3MuICAqLwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYmZkX21uMTAzMDBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AgICAgICAgICAgICBfYmZkX21uMTAzMDBfZWxmX29iamVjdF9wCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYmZkX21uMTAzMDBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLQotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmLmMgYi9iZmQvZWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OGJkMjMuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ0NiArMCwwIEBACi0vKiBFTEYgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0KLVNFQ1RJT04KLQlFTEYgYmFja2VuZHMKLQotCUJGRCBzdXBwb3J0IGZvciBFTEYgZm9ybWF0cyBpcyBiZWluZyB3b3JrZWQgb24uCi0JQ3VycmVudGx5LCB0aGUgYmVzdCBzdXBwb3J0ZWQgYmFjayBlbmRzIGFyZSBmb3Igc3BhcmMgYW5kIGkzODYKLQkocnVubmluZyBzdnI0IG9yIFNvbGFyaXMgMikuCi0KLQlEb2N1bWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbHMgb2YgdGhlIHN1cHBvcnQgY29kZSBzdGlsbCBuZWVkcwotCXRvIGJlIHdyaXR0ZW4uICBUaGUgY29kZSBpcyBjaGFuZ2luZyBxdWlja2x5IGVub3VnaCB0aGF0IHdlCi0JaGF2ZW4ndCBib3RoZXJlZCB5ZXQuCi0gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNkZWZpbmUgQVJDSF9TSVpFIDAKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLXN0YXRpYyBJTkxJTkUgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbWFrZV9tYXBwaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIG1hcF9zZWN0aW9uc190b19zZWdtZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBlbGZfc29ydF9zZWN0aW9ucyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIGJvb2xlYW4gYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHByZXBfaGVhZGVycyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3dhcF9vdXRfc3ltcyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBjb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqZWxmX3JlYWQgUEFSQU1TICgoYmZkICosIGxvbmcsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgZWxmX2Zha2Vfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gYXNzaWduX3NlY3Rpb25fbnVtYmVycyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIElOTElORSBpbnQgc3ltX2lzX2dsb2JhbCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbWFwX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIGdldF9wcm9ncmFtX2hlYWRlcl9zaXplIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZjb3JlX3JlYWRfbm90ZXMgUEFSQU1TICgoYmZkICosIGJmZF92bWEsIGJmZF92bWEpKTsKLQotLyogU3dhcCB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIGFuZCBvdXQuICBUaGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcwotICAgY3VycmVudGx5IHNpemUgaW5kZXBlbmRlbnQuICBJZiB0aGF0IGV2ZXIgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwKLSAgIG5lZWQgdG8gbW92ZSBpbnRvIGVsZmNvZGUuaC4gICovCi0KLS8qIFN3YXAgaW4gYSBWZXJkZWYgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJkZWZfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkZWYgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiAqZHN0OwotewotICBkc3QtPnZkX3ZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dmRfdmVyc2lvbik7Ci0gIGRzdC0+dmRfZmxhZ3MgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF9mbGFncyk7Ci0gIGRzdC0+dmRfbmR4ICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF9uZHgpOwotICBkc3QtPnZkX2NudCAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dmRfY250KTsKLSAgZHN0LT52ZF9oYXNoICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkX2hhc2gpOwotICBkc3QtPnZkX2F1eCAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRfYXV4KTsKLSAgZHN0LT52ZF9uZXh0ICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcmRlZiBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkZWYgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1ZlcmRlZiAqZHN0OwotewotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfdmVyc2lvbiwgZHN0LT52ZF92ZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZkX2ZsYWdzLCBkc3QtPnZkX2ZsYWdzKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZkX25keCwgZHN0LT52ZF9uZHgpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfY250LCBkc3QtPnZkX2NudCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZF9oYXNoLCBkc3QtPnZkX2hhc2gpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dmRfYXV4LCBkc3QtPnZkX2F1eCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZF9uZXh0LCBkc3QtPnZkX25leHQpOwotfQotCi0vKiBTd2FwIGluIGEgVmVyZGF1eCBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkYXV4ICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICpkc3Q7Ci17Ci0gIGRzdC0+dmRhX25hbWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRhX25hbWUpOwotICBkc3QtPnZkYV9uZXh0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkYV9uZXh0KTsKLX0KLQotLyogU3dhcCBvdXQgYSBWZXJkYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkYXV4ICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZGFfbmFtZSwgZHN0LT52ZGFfbmFtZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZGFfbmV4dCwgZHN0LT52ZGFfbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJuZWVkIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKmRzdDsKLXsKLSAgZHN0LT52bl92ZXJzaW9uID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZuX3ZlcnNpb24pOwotICBkc3QtPnZuX2NudCAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dm5fY250KTsKLSAgZHN0LT52bl9maWxlICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuX2ZpbGUpOwotICBkc3QtPnZuX2F1eCAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5fYXV4KTsKLSAgZHN0LT52bl9uZXh0ICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcm5lZWQgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKmRzdDsKLXsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuX3ZlcnNpb24sIGRzdC0+dm5fdmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52bl9jbnQsIGRzdC0+dm5fY250KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuX2ZpbGUsIGRzdC0+dm5fZmlsZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bl9hdXgsIGRzdC0+dm5fYXV4KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuX25leHQsIGRzdC0+dm5fbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJuYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVybmF1eF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1Zlcm5hdXggKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmRzdDsKLXsKLSAgZHN0LT52bmFfaGFzaCAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5hX2hhc2gpOwotICBkc3QtPnZuYV9mbGFncyA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52bmFfZmxhZ3MpOwotICBkc3QtPnZuYV9vdGhlciA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52bmFfb3RoZXIpOwotICBkc3QtPnZuYV9uYW1lICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52bmFfbmFtZSk7Ci0gIGRzdC0+dm5hX25leHQgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuYV9uZXh0KTsKLX0KLQotLyogU3dhcCBvdXQgYSBWZXJuYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJuYXV4ICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bmFfaGFzaCwgZHN0LT52bmFfaGFzaCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52bmFfZmxhZ3MsIGRzdC0+dm5hX2ZsYWdzKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuYV9vdGhlciwgZHN0LT52bmFfb3RoZXIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5hX25hbWUsIGRzdC0+dm5hX25hbWUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5hX25leHQsIGRzdC0+dm5hX25leHQpOwotfQotCi0vKiBTd2FwIGluIGEgVmVyc3ltIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyc3ltX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfVmVyc3ltICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9WZXJzeW0gKmRzdDsKLXsKLSAgZHN0LT52c192ZXJzID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZzX3ZlcnMpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcnN5bSBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcnN5bV9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJzeW0gKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1ZlcnN5bSAqZHN0OwotewotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dnNfdmVycywgZHN0LT52c192ZXJzKTsKLX0KLQotLyogU3RhbmRhcmQgRUxGIGhhc2ggZnVuY3Rpb24uICBEbyBub3QgY2hhbmdlIHRoaXMgZnVuY3Rpb247IHlvdSB3aWxsCi0gICBjYXVzZSBpbnZhbGlkIGhhc2ggdGFibGVzIHRvIGJlIGdlbmVyYXRlZC4gICovCi0KLXVuc2lnbmVkIGxvbmcKLWJmZF9lbGZfaGFzaCAobmFtZWFyZykKLSAgICAgY29uc3QgY2hhciAqbmFtZWFyZzsKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG5hbWVhcmc7Ci0gIHVuc2lnbmVkIGxvbmcgaCA9IDA7Ci0gIHVuc2lnbmVkIGxvbmcgZzsKLSAgaW50IGNoOwotCi0gIHdoaWxlICgoY2ggPSAqbmFtZSsrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGggPSAoaCA8PCA0KSArIGNoOwotICAgICAgaWYgKChnID0gKGggJiAweGYwMDAwMDAwKSkgIT0gMCkKLQl7Ci0JICBoIF49IGcgPj4gMjQ7Ci0JICAvKiBUaGUgRUxGIEFCSSBzYXlzIGBoICY9IH5nJywgYnV0IHRoaXMgaXMgZXF1aXZhbGVudCBpbgotCSAgICAgdGhpcyBjYXNlIGFuZCBvbiBzb21lIG1hY2hpbmVzIG9uZSBpbnNuIGluc3RlYWQgb2YgdHdvLiAgKi8KLQkgIGggXj0gZzsKLQl9Ci0gICAgfQotICByZXR1cm4gaDsKLX0KLQotLyogUmVhZCBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgYXQgYSBzcGVjaWZpZWQgb2Zmc2V0IGluIGFuIEVMRgotICAgZmlsZSwgaW50byBhIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZQotICAgYnVmZmVyLiAqLwotCi1zdGF0aWMgY2hhciAqCi1lbGZfcmVhZCAoYWJmZCwgb2Zmc2V0LCBzaXplKQotICAgICBiZmQgKiBhYmZkOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIGNoYXIgKmJ1ZjsKLQotICBpZiAoKGJ1ZiA9IGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSkpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgYnVmLCBzaXplLCAxLCBhYmZkKSAhPSBzaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXR1cm4gYnVmOwotfQotCi1ib29sZWFuCi1iZmRfZWxmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKiBhYmZkOwotewotICAvKiB0aGlzIGp1c3QgZG9lcyBpbml0aWFsaXphdGlvbiAqLwotICAvKiBjb2ZmX21rb2JqZWN0IHphbGxvYydzIHNwYWNlIGZvciB0ZGF0YS5jb2ZmX29ial9kYXRhIC4uLiAqLwotICBlbGZfdGRhdGEgKGFiZmQpID0gKHN0cnVjdCBlbGZfb2JqX3RkYXRhICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX29ial90ZGF0YSkpOwotICBpZiAoZWxmX3RkYXRhIChhYmZkKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgLyogc2luY2UgZXZlcnl0aGluZyBpcyBkb25lIGF0IGNsb3NlIHRpbWUsIGRvIHdlIG5lZWQgYW55Ci0gICAgIGluaXRpYWxpemF0aW9uPyAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1iZmRfZWxmX21rY29yZWZpbGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIC8qIEkgdGhpbmsgdGhpcyBjYW4gYmUgZG9uZSBqdXN0IGxpa2UgYW4gb2JqZWN0IGZpbGUuICovCi0gIHJldHVybiBiZmRfZWxmX21rb2JqZWN0IChhYmZkKTsKLX0KLQotY2hhciAqCi1iZmRfZWxmX2dldF9zdHJfc2VjdGlvbiAoYWJmZCwgc2hpbmRleCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNoaW5kZXg7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLSAgY2hhciAqc2hzdHJ0YWIgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgc2hzdHJ0YWJzaXplOwotCi0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpZiAoaV9zaGRycCA9PSAwIHx8IGlfc2hkcnBbc2hpbmRleF0gPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBzaHN0cnRhYiA9IChjaGFyICopIGlfc2hkcnBbc2hpbmRleF0tPmNvbnRlbnRzOwotICBpZiAoc2hzdHJ0YWIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBObyBjYWNoZWQgb25lLCBhdHRlbXB0IHRvIHJlYWQsIGFuZCBjYWNoZSB3aGF0IHdlIHJlYWQuICovCi0gICAgICBvZmZzZXQgPSBpX3NoZHJwW3NoaW5kZXhdLT5zaF9vZmZzZXQ7Ci0gICAgICBzaHN0cnRhYnNpemUgPSBpX3NoZHJwW3NoaW5kZXhdLT5zaF9zaXplOwotICAgICAgc2hzdHJ0YWIgPSBlbGZfcmVhZCAoYWJmZCwgb2Zmc2V0LCBzaHN0cnRhYnNpemUpOwotICAgICAgaV9zaGRycFtzaGluZGV4XS0+Y29udGVudHMgPSAoUFRSKSBzaHN0cnRhYjsKLSAgICB9Ci0gIHJldHVybiBzaHN0cnRhYjsKLX0KLQotY2hhciAqCi1iZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBzaGluZGV4LCBzdHJpbmRleCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNoaW5kZXg7Ci0gICAgIHVuc2lnbmVkIGludCBzdHJpbmRleDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotICBpZiAoc3RyaW5kZXggPT0gMCkKLSAgICByZXR1cm4gIiI7Ci0KLSAgaGRyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XTsKLQotICBpZiAoaGRyLT5jb250ZW50cyA9PSBOVUxMCi0gICAgICAmJiBiZmRfZWxmX2dldF9zdHJfc2VjdGlvbiAoYWJmZCwgc2hpbmRleCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoc3RyaW5kZXggPj0gaGRyLT5zaF9zaXplKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogaW52YWxpZCBzdHJpbmcgb2Zmc2V0ICV1ID49ICVsdSBmb3Igc2VjdGlvbiBgJXMnIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdHJpbmRleCwgKHVuc2lnbmVkIGxvbmcpIGhkci0+c2hfc2l6ZSwKLQkgKChzaGluZGV4ID09IGVsZl9lbGZoZWFkZXIoYWJmZCktPmVfc2hzdHJuZHgKLQkgICAmJiBzdHJpbmRleCA9PSBoZHItPnNoX25hbWUpCi0JICA/ICIuc2hzdHJ0YWIiCi0JICA6IGVsZl9zdHJpbmdfZnJvbV9lbGZfc3RydGFiIChhYmZkLCBoZHItPnNoX25hbWUpKSk7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gIHJldHVybiAoKGNoYXIgKikgaGRyLT5jb250ZW50cykgKyBzdHJpbmRleDsKLX0KLQotLyogTWFrZSBhIEJGRCBzZWN0aW9uIGZyb20gYW4gRUxGIHNlY3Rpb24uICBXZSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlCi0gICBCRkQgc2VjdGlvbiBpbiB0aGUgYmZkX3NlY3Rpb24gZmllbGQgb2YgdGhlIGhlYWRlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChzdHJjbXAgKG5hbWUsCi0JCQkgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uKSkgPT0gMCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbmV3c2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmV3c2VjdC0+ZmlsZXBvcyA9IGhkci0+c2hfb2Zmc2V0OwotCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl92bWEgKGFiZmQsIG5ld3NlY3QsIGhkci0+c2hfYWRkcikKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIG5ld3NlY3QsIGhkci0+c2hfc2l6ZSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgbmV3c2VjdCwKLQkJCQkgICAgICBiZmRfbG9nMiAoaGRyLT5zaF9hZGRyYWxpZ24pKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0gIGlmIChoZHItPnNoX3R5cGUgIT0gU0hUX05PQklUUykKLSAgICBmbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotICBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgICAgaWYgKGhkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotCWZsYWdzIHw9IFNFQ19MT0FEOwotICAgIH0KLSAgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX1dSSVRFKSA9PSAwKQotICAgIGZsYWdzIHw9IFNFQ19SRUFET05MWTsKLSAgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUikgIT0gMCkKLSAgICBmbGFncyB8PSBTRUNfQ09ERTsKLSAgZWxzZSBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgZmxhZ3MgfD0gU0VDX0RBVEE7Ci0KLSAgLyogVGhlIGRlYnVnZ2luZyBzZWN0aW9ucyBhcHBlYXIgdG8gYmUgcmVjb2duaXplZCBvbmx5IGJ5IG5hbWUsIG5vdAotICAgICBhbnkgc29ydCBvZiBmbGFnLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZGVidWciLCBzaXplb2YgIi5kZWJ1ZyIgLSAxKSA9PSAwCi0gICAgICB8fCBzdHJuY21wIChuYW1lLCAiLmxpbmUiLCBzaXplb2YgIi5saW5lIiAtIDEpID09IDAKLSAgICAgIHx8IHN0cm5jbXAgKG5hbWUsICIuc3RhYiIsIHNpemVvZiAiLnN0YWIiIC0gMSkgPT0gMCkKLSAgICBmbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCi0gIC8qIEFzIGEgR05VIGV4dGVuc2lvbiwgaWYgdGhlIG5hbWUgYmVnaW5zIHdpdGggLmdudS5saW5rb25jZSwgd2UKLSAgICAgb25seSBsaW5rIGEgc2luZ2xlIGNvcHkgb2YgdGhlIHNlY3Rpb24uICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydAotICAgICBnKysuICBnKysgd2lsbCBlbWl0IGVhY2ggdGVtcGxhdGUgZXhwYW5zaW9uIGluIGl0cyBvd24gc2VjdGlvbi4KLSAgICAgVGhlIHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkIGFzIHdlYWssIHNvIHRoYXQgbXVsdGlwbGUgZGVmaW5pdGlvbnMKLSAgICAgYXJlIHBlcm1pdHRlZC4gIFRoZSBHTlUgbGlua2VyIGV4dGVuc2lvbiBpcyB0byBhY3R1YWxseSBkaXNjYXJkCi0gICAgIGFsbCBidXQgb25lIG9mIHRoZSBzZWN0aW9ucy4gICovCi0gIGlmIChzdHJuY21wIChuYW1lLCAiLmdudS5saW5rb25jZSIsIHNpemVvZiAiLmdudS5saW5rb25jZSIgLSAxKSA9PSAwKQotICAgIGZsYWdzIHw9IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBuZXdzZWN0LCBmbGFncykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgoZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1BoZHIgKnBoZHI7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBwaGRycyB0byBzZWUgaWYgd2UgbmVlZCB0byBhZGp1c3QgdGhlIGxtYS4KLSAgICAgICAgIElmIGFsbCB0aGUgcF9wYWRkciBmaWVsZHMgYXJlIHplcm8sIHdlIGlnbm9yZSB0aGVtLCBzaW5jZQotICAgICAgICAgc29tZSBFTEYgbGlua2VycyBwcm9kdWNlIHN1Y2ggb3V0cHV0LiAgKi8KLSAgICAgIHBoZHIgPSBlbGZfdGRhdGEgKGFiZmQpLT5waGRyOwotICAgICAgZm9yIChpID0gMDsgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtOyBpKyssIHBoZHIrKykKLQl7Ci0JICBpZiAocGhkci0+cF9wYWRkciAhPSAwKQotCSAgICBicmVhazsKLQl9Ci0gICAgICBpZiAoaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtKQotCXsKLQkgIHBoZHIgPSBlbGZfdGRhdGEgKGFiZmQpLT5waGRyOwotCSAgZm9yIChpID0gMDsgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtOyBpKyssIHBoZHIrKykKLQkgICAgewotCSAgICAgIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfTE9BRAotCQkgICYmIHBoZHItPnBfdmFkZHIgIT0gcGhkci0+cF9wYWRkcgotCQkgICYmIHBoZHItPnBfdmFkZHIgPD0gaGRyLT5zaF9hZGRyCi0JCSAgJiYgKHBoZHItPnBfdmFkZHIgKyBwaGRyLT5wX21lbXN6Ci0JCSAgICAgID49IGhkci0+c2hfYWRkciArIGhkci0+c2hfc2l6ZSkKLQkJICAmJiAoKGZsYWdzICYgU0VDX0xPQUQpID09IDAKLQkJICAgICAgfHwgKHBoZHItPnBfb2Zmc2V0IDw9IChiZmRfdm1hKSBoZHItPnNoX29mZnNldAotCQkJICAmJiAocGhkci0+cF9vZmZzZXQgKyBwaGRyLT5wX2ZpbGVzegotCQkJICAgICAgPj0gaGRyLT5zaF9vZmZzZXQgKyBoZHItPnNoX3NpemUpKSkpCi0JCXsKLQkJICBuZXdzZWN0LT5sbWEgKz0gcGhkci0+cF9wYWRkciAtIHBoZHItPnBfdmFkZHI7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaGRyLT5iZmRfc2VjdGlvbiA9IG5ld3NlY3Q7Ci0gIGVsZl9zZWN0aW9uX2RhdGEgKG5ld3NlY3QpLT50aGlzX2hkciA9ICpoZHI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9lbGZfZmluZF9zZWN0aW9uCi0KLVNZTk9QU0lTCi0Jc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyICpiZmRfZWxmX2ZpbmRfc2VjdGlvbiAoYmZkICphYmZkLCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlIZWxwZXIgZnVuY3Rpb25zIGZvciBHREIgdG8gbG9jYXRlIHRoZSBzdHJpbmcgdGFibGVzLgotCVNpbmNlIEJGRCBoaWRlcyBzdHJpbmcgdGFibGVzIGZyb20gY2FsbGVycywgR0RCIG5lZWRzIHRvIHVzZSBhbgotCWludGVybmFsIGhvb2sgdG8gZmluZCB0aGVtLiAgU3VuJ3MgLnN0YWJzdHIsIGluIHBhcnRpY3VsYXIsCi0JaXNuJ3QgZXZlbiBwb2ludGVkIHRvIGJ5IHRoZSAuc3RhYiBzZWN0aW9uLCBzbyBvcmRpbmFyeQotCW1lY2hhbmlzbXMgd291bGRuJ3Qgd29yayB0byBmaW5kIGl0LCBldmVuIGlmIHdlIGhhZCBzb21lLgotKi8KLQotc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyICoKLWJmZF9lbGZfZmluZF9zZWN0aW9uIChhYmZkLCBuYW1lKQotICAgICBiZmQgKiBhYmZkOwotICAgICBjaGFyICpuYW1lOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnA7Ci0gIGNoYXIgKnNoc3RydGFiOwotICB1bnNpZ25lZCBpbnQgbWF4OwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpX3NoZHJwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKTsKLSAgaWYgKGlfc2hkcnAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaHN0cnRhYiA9IGJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uCi0JKGFiZmQsIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4KTsKLSAgICAgIGlmIChzaHN0cnRhYiAhPSBOVUxMKQotCXsKLQkgIG1heCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOwotCSAgZm9yIChpID0gMTsgaSA8IG1heDsgaSsrKQotCSAgICBpZiAoIXN0cmNtcCAoJnNoc3RydGFiW2lfc2hkcnBbaV0tPnNoX25hbWVdLCBuYW1lKSkKLQkgICAgICByZXR1cm4gaV9zaGRycFtpXTsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotY29uc3QgY2hhciAqY29uc3QgYmZkX2VsZl9zZWN0aW9uX3R5cGVfbmFtZXNbXSA9IHsKLSAgIlNIVF9OVUxMIiwgIlNIVF9QUk9HQklUUyIsICJTSFRfU1lNVEFCIiwgIlNIVF9TVFJUQUIiLAotICAiU0hUX1JFTEEiLCAiU0hUX0hBU0giLCAiU0hUX0RZTkFNSUMiLCAiU0hUX05PVEUiLAotICAiU0hUX05PQklUUyIsICJTSFRfUkVMIiwgIlNIVF9TSExJQiIsICJTSFRfRFlOU1lNIiwKLX07Ci0KLS8qIEVMRiByZWxvY3MgYXJlIGFnYWluc3Qgc3ltYm9scy4gIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlCi0gICBvdXRwdXQsIGFuZCB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCBub3RoaW5nCi0gICBoYXMgZ2l2ZW4gdXMgYW55IGFkZGl0aW9uYWwgYWRkZW5kLCB0aGUgcmVzdWx0aW5nIHJlbG9jIHdpbGwgYWxzbwotICAgYmUgYWdhaW5zdCB0aGUgc2FtZSBzeW1ib2wuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0bwotICAgY2hhbmdlIGFueXRoaW5nIGFib3V0IHRoZSB3YXkgdGhlIHJlbG9jIGlzIGhhbmRsZWQsIHNpbmNlIGl0IHdpbGwKLSAgIGFsbCBiZSBkb25lIGF0IGZpbmFsIGxpbmsgdGltZS4gIFJhdGhlciB0aGFuIHB1dCBzcGVjaWFsIGNhc2UgY29kZQotICAgaW50byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBhbGwgdGhlIHJlbG9jIHR5cGVzIHVzZSB0aGlzIGhvd3RvCi0gICBmdW5jdGlvbi4gIEl0IGp1c3Qgc2hvcnQgY2lyY3VpdHMgdGhlIHJlbG9jIGlmIHByb2R1Y2luZwotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLS8qQVJHU1VTRUQqLwotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsCi0JCSAgICAgICByZWxvY19lbnRyeSwKLQkJICAgICAgIHN5bWJvbCwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQwKLS8qIFByaW50IG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgZmFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmFyZzsKLXsKLSAgRklMRSAqZiA9IChGSUxFICopIGZhcmc7Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICpwOwotICBhc2VjdGlvbiAqczsKLSAgYmZkX2J5dGUgKmR5bmJ1ZiA9IE5VTEw7Ci0KLSAgcCA9IGVsZl90ZGF0YSAoYWJmZCktPnBoZHI7Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGksIGM7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlxuUHJvZ3JhbSBIZWFkZXI6XG4iKSk7Ci0gICAgICBjID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW07Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrLCBwKyspCi0JewotCSAgY29uc3QgY2hhciAqczsKLQkgIGNoYXIgYnVmWzIwXTsKLQotCSAgc3dpdGNoIChwLT5wX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBQVF9OVUxMOiBzID0gIk5VTEwiOyBicmVhazsKLQkgICAgY2FzZSBQVF9MT0FEOiBzID0gIkxPQUQiOyBicmVhazsKLQkgICAgY2FzZSBQVF9EWU5BTUlDOiBzID0gIkRZTkFNSUMiOyBicmVhazsKLQkgICAgY2FzZSBQVF9JTlRFUlA6IHMgPSAiSU5URVJQIjsgYnJlYWs7Ci0JICAgIGNhc2UgUFRfTk9URTogcyA9ICJOT1RFIjsgYnJlYWs7Ci0JICAgIGNhc2UgUFRfU0hMSUI6IHMgPSAiU0hMSUIiOyBicmVhazsKLQkgICAgY2FzZSBQVF9QSERSOiBzID0gIlBIRFIiOyBicmVhazsKLQkgICAgZGVmYXVsdDogc3ByaW50ZiAoYnVmLCAiMHglbHgiLCBwLT5wX3R5cGUpOyBzID0gYnVmOyBicmVhazsKLQkgICAgfQotCSAgZnByaW50ZiAoZiwgIiU4cyBvZmYgICAgMHgiLCBzKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX29mZnNldCk7Ci0JICBmcHJpbnRmIChmLCAiIHZhZGRyIDB4Iik7Ci0JICBmcHJpbnRmX3ZtYSAoZiwgcC0+cF92YWRkcik7Ci0JICBmcHJpbnRmIChmLCAiIHBhZGRyIDB4Iik7Ci0JICBmcHJpbnRmX3ZtYSAoZiwgcC0+cF9wYWRkcik7Ci0JICBmcHJpbnRmIChmLCAiIGFsaWduIDIqKiV1XG4iLCBiZmRfbG9nMiAocC0+cF9hbGlnbikpOwotCSAgZnByaW50ZiAoZiwgIiAgICAgICAgIGZpbGVzeiAweCIpOwotCSAgZnByaW50Zl92bWEgKGYsIHAtPnBfZmlsZXN6KTsKLQkgIGZwcmludGYgKGYsICIgbWVtc3ogMHgiKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX21lbXN6KTsKLQkgIGZwcmludGYgKGYsICIgZmxhZ3MgJWMlYyVjIiwKLQkJICAgKHAtPnBfZmxhZ3MgJiBQRl9SKSAhPSAwID8gJ3InIDogJy0nLAotCQkgICAocC0+cF9mbGFncyAmIFBGX1cpICE9IDAgPyAndycgOiAnLScsCi0JCSAgIChwLT5wX2ZsYWdzICYgUEZfWCkgIT0gMCA/ICd4JyA6ICctJyk7Ci0JICBpZiAoKHAtPnBfZmxhZ3MgJn4gKFBGX1IgfCBQRl9XIHwgUEZfWCkpICE9IDApCi0JICAgIGZwcmludGYgKGYsICIgJWx4IiwgcC0+cF9mbGFncyAmfiAoUEZfUiB8IFBGX1cgfCBQRl9YKSk7Ci0JICBmcHJpbnRmIChmLCAiXG4iKTsKLQl9Ci0gICAgfQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGVsZnNlYzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGluazsKLSAgICAgIGJmZF9ieXRlICpleHRkeW4sICpleHRkeW5lbmQ7Ci0gICAgICBzaXplX3QgZXh0ZHluc2l6ZTsKLSAgICAgIHZvaWQgKCpzd2FwX2R5bl9pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlxuRHluYW1pYyBTZWN0aW9uOlxuIikpOwotCi0gICAgICBkeW5idWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAocy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChkeW5idWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgKFBUUikgZHluYnVmLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgcy0+X3Jhd19zaXplKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZWxmc2VjID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzKTsKLSAgICAgIGlmIChlbGZzZWMgPT0gLTEpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBsaW5rID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtlbGZzZWNdLT5zaF9saW5rOwotCi0gICAgICBleHRkeW5zaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2ZfZHluOwotICAgICAgc3dhcF9keW5faW4gPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnN3YXBfZHluX2luOwotCi0gICAgICBleHRkeW4gPSBkeW5idWY7Ci0gICAgICBleHRkeW5lbmQgPSBleHRkeW4gKyBzLT5fcmF3X3NpemU7Ci0gICAgICBmb3IgKDsgZXh0ZHluIDwgZXh0ZHluZW5kOyBleHRkeW4gKz0gZXh0ZHluc2l6ZSkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGFiWzIwXTsKLQkgIGJvb2xlYW4gc3RyaW5ncDsKLQotCSAgKCpzd2FwX2R5bl9pbikgKGFiZmQsIChQVFIpIGV4dGR5biwgJmR5bik7Ci0KLQkgIGlmIChkeW4uZF90YWcgPT0gRFRfTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIHN0cmluZ3AgPSBmYWxzZTsKLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgc3ByaW50ZiAoYWIsICIweCVseCIsICh1bnNpZ25lZCBsb25nKSBkeW4uZF90YWcpOwotCSAgICAgIG5hbWUgPSBhYjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX05FRURFRDogbmFtZSA9ICJORUVERUQiOyBzdHJpbmdwID0gdHJ1ZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6IG5hbWUgPSAiUExUUkVMU1oiOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6IG5hbWUgPSAiUExUR09UIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSEFTSDogbmFtZSA9ICJIQVNIIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU1RSVEFCOiBuYW1lID0gIlNUUlRBQiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1NZTVRBQjogbmFtZSA9ICJTWU1UQUIiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxBOiBuYW1lID0gIlJFTEEiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxBU1o6IG5hbWUgPSAiUkVMQVNaIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUkVMQUVOVDogbmFtZSA9ICJSRUxBRU5UIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU1RSU1o6IG5hbWUgPSAiU1RSU1oiOyBicmVhazsKLQkgICAgY2FzZSBEVF9TWU1FTlQ6IG5hbWUgPSAiU1lNRU5UIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSU5JVDogbmFtZSA9ICJJTklUIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfRklOSTogbmFtZSA9ICJGSU5JIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU09OQU1FOiBuYW1lID0gIlNPTkFNRSI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9SUEFUSDogbmFtZSA9ICJSUEFUSCI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9TWU1CT0xJQzogbmFtZSA9ICJTWU1CT0xJQyI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTDogbmFtZSA9ICJSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxTWjogbmFtZSA9ICJSRUxTWiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTEVOVDogbmFtZSA9ICJSRUxFTlQiOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUw6IG5hbWUgPSAiUExUUkVMIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfREVCVUc6IG5hbWUgPSAiREVCVUciOyBicmVhazsKLQkgICAgY2FzZSBEVF9URVhUUkVMOiBuYW1lID0gIlRFWFRSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9KTVBSRUw6IG5hbWUgPSAiSk1QUkVMIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfQVVYSUxJQVJZOiBuYW1lID0gIkFVWElMSUFSWSI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9GSUxURVI6IG5hbWUgPSAiRklMVEVSIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUlNZTTogbmFtZSA9ICJWRVJTWU0iOyBicmVhazsKLQkgICAgY2FzZSBEVF9WRVJERUY6IG5hbWUgPSAiVkVSREVGIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfVkVSREVGTlVNOiBuYW1lID0gIlZFUkRFRk5VTSI7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUk5FRUQ6IG5hbWUgPSAiVkVSTkVFRCI7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUk5FRUROVU06IG5hbWUgPSAiVkVSTkVFRE5VTSI7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGZwcmludGYgKGYsICIgICUtMTFzICIsIG5hbWUpOwotCSAgaWYgKCEgc3RyaW5ncCkKLQkgICAgZnByaW50ZiAoZiwgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpIGR5bi5kX3VuLmRfdmFsKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLQotCSAgICAgIHN0cmluZyA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGxpbmssCi0JCQkJCQkJZHluLmRfdW4uZF92YWwpOwotCSAgICAgIGlmIChzdHJpbmcgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnByaW50ZiAoZiwgIiVzIiwgc3RyaW5nKTsKLQkgICAgfQotCSAgZnByaW50ZiAoZiwgIlxuIik7Ci0JfQotCi0gICAgICBmcmVlIChkeW5idWYpOwotICAgICAgZHluYnVmID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKChlbGZfZHludmVyZGVmIChhYmZkKSAhPSAwICYmIGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZiA9PSBOVUxMKQotICAgICAgfHwgKGVsZl9keW52ZXJyZWYgKGFiZmQpICE9IDAgJiYgZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmID09IE5VTEwpKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfZHludmVyZGVmIChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKnQ7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlxuVmVyc2lvbiBkZWZpbml0aW9uczpcbiIpKTsKLSAgICAgIGZvciAodCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZjsgdCAhPSBOVUxMOyB0ID0gdC0+dmRfbmV4dGRlZikKLQl7Ci0JICBmcHJpbnRmIChmLCAiJWQgMHglMi4yeCAweCU4LjhseCAlc1xuIiwgdC0+dmRfbmR4LAotCQkgICB0LT52ZF9mbGFncywgdC0+dmRfaGFzaCwgdC0+dmRfbm9kZW5hbWUpOwotCSAgaWYgKHQtPnZkX2F1eHB0ci0+dmRhX25leHRwdHIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICphOwotCi0JICAgICAgZnByaW50ZiAoZiwgIlx0Iik7Ci0JICAgICAgZm9yIChhID0gdC0+dmRfYXV4cHRyLT52ZGFfbmV4dHB0cjsKLQkJICAgYSAhPSBOVUxMOwotCQkgICBhID0gYS0+dmRhX25leHRwdHIpCi0JCWZwcmludGYgKGYsICIlcyAiLCBhLT52ZGFfbm9kZW5hbWUpOwotCSAgICAgIGZwcmludGYgKGYsICJcbiIpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZWxmX2R5bnZlcnJlZiAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5WZXJzaW9uIFJlZmVyZW5jZXM6XG4iKSk7Ci0gICAgICBmb3IgKHQgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWY7IHQgIT0gTlVMTDsgdCA9IHQtPnZuX25leHRyZWYpCi0JewotCSAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7Ci0KLQkgIGZwcmludGYgKGYsIF8oIiAgcmVxdWlyZWQgZnJvbSAlczpcbiIpLCB0LT52bl9maWxlbmFtZSk7Ci0JICBmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCSAgICBmcHJpbnRmIChmLCAiICAgIDB4JTguOGx4IDB4JTIuMnggJTIuMmQgJXNcbiIsIGEtPnZuYV9oYXNoLAotCQkgICAgIGEtPnZuYV9mbGFncywgYS0+dm5hX290aGVyLCBhLT52bmFfbm9kZW5hbWUpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChkeW5idWYgIT0gTlVMTCkKLSAgICBmcmVlIChkeW5idWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERpc3BsYXkgRUxGLXNwZWNpZmljIGZpZWxkcyBvZiBhIHN5bWJvbC4gICovCi0KLXZvaWQKLWJmZF9lbGZfcHJpbnRfc3ltYm9sIChhYmZkLCBmaWxlcCwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVwOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBmaWxlcDsKLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgImVsZiAiKTsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJWx4IiwgKGxvbmcpIHN5bWJvbC0+ZmxhZ3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIHsKLQlDT05TVCBjaGFyICpzZWN0aW9uX25hbWU7Ci0JQ09OU1QgY2hhciAqbmFtZSA9IE5VTEw7Ci0Jc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQkKLQlzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24gPyBzeW1ib2wtPnNlY3Rpb24tPm5hbWUgOiAiKCpub25lKikiOwotCi0JYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCWlmIChiZWQtPmVsZl9iYWNrZW5kX3ByaW50X3N5bWJvbF9hbGwpCi0JICAgIG5hbWUgPSAoKmJlZC0+ZWxmX2JhY2tlbmRfcHJpbnRfc3ltYm9sX2FsbCkgKGFiZmQsIGZpbGVwLCBzeW1ib2wpOwotCi0JaWYgKG5hbWUgPT0gTlVMTCkKLQkgIHsKLQkgICAgbmFtZSA9IHN5bWJvbC0+bmFtZTsgIAotCSAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCSAgfQotCi0JZnByaW50ZiAoZmlsZSwgIiAlc1x0Iiwgc2VjdGlvbl9uYW1lKTsKLQkvKiBQcmludCB0aGUgIm90aGVyIiB2YWx1ZSBmb3IgYSBzeW1ib2wuICBGb3IgY29tbW9uIHN5bWJvbHMsCi0JICAgd2UndmUgYWxyZWFkeSBwcmludGVkIHRoZSBzaXplOyBub3cgcHJpbnQgdGhlIGFsaWdubWVudC4KLQkgICBGb3Igb3RoZXIgc3ltYm9scywgd2UgaGF2ZSBubyBzcGVjaWZpZWQgYWxpZ25tZW50LCBhbmQKLQkgICB3ZSd2ZSBwcmludGVkIHRoZSBhZGRyZXNzOyBub3cgcHJpbnQgdGhlIHNpemUuICAqLwotCWZwcmludGZfdm1hIChmaWxlLAotCQkgICAgIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLQkJICAgICAgPyAoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlCi0JCSAgICAgIDogKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplKSk7Ci0KLQkvKiBJZiB3ZSBoYXZlIHZlcnNpb24gaW5mb3JtYXRpb24sIHByaW50IGl0LiAgKi8KLQlpZiAoZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyc3ltX3NlY3Rpb24gIT0gMAotCSAgICAmJiAoZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX3NlY3Rpb24gIT0gMAotCQl8fCBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJyZWZfc2VjdGlvbiAhPSAwKSkKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHZlcm51bTsKLQkgICAgY29uc3QgY2hhciAqdmVyc2lvbl9zdHJpbmc7Ci0KLQkgICAgdmVybnVtID0gKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+dmVyc2lvbiAmIFZFUlNZTV9WRVJTSU9OOwotCi0JICAgIGlmICh2ZXJudW0gPT0gMCkKLQkgICAgICB2ZXJzaW9uX3N0cmluZyA9ICIiOwotCSAgICBlbHNlIGlmICh2ZXJudW0gPT0gMSkKLQkgICAgICB2ZXJzaW9uX3N0cmluZyA9ICJCYXNlIjsKLQkgICAgZWxzZSBpZiAodmVybnVtIDw9IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJkZWZzKQotCSAgICAgIHZlcnNpb25fc3RyaW5nID0KLQkJZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmW3Zlcm51bSAtIDFdLnZkX25vZGVuYW1lOwotCSAgICBlbHNlCi0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQotCQl2ZXJzaW9uX3N0cmluZyA9ICIiOwotCQlmb3IgKHQgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWY7Ci0JCSAgICAgdCAhPSBOVUxMOwotCQkgICAgIHQgPSB0LT52bl9uZXh0cmVmKQotCQkgIHsKLQkJICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOwotCi0JCSAgICBmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkgICAgICB7Ci0JCQlpZiAoYS0+dm5hX290aGVyID09IHZlcm51bSkKLQkJCSAgewotCQkJICAgIHZlcnNpb25fc3RyaW5nID0gYS0+dm5hX25vZGVuYW1lOwotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmICgoKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+dmVyc2lvbiAmIFZFUlNZTV9ISURERU4pID09IDApCi0JICAgICAgZnByaW50ZiAoZmlsZSwgIiAgJS0xMXMiLCB2ZXJzaW9uX3N0cmluZyk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWludCBpOwotCi0JCWZwcmludGYgKGZpbGUsICIgKCVzKSIsIHZlcnNpb25fc3RyaW5nKTsKLQkJZm9yIChpID0gMTAgLSBzdHJsZW4gKHZlcnNpb25fc3RyaW5nKTsgaSA+IDA7IC0taSkKLQkJICBwdXRjICgnICcsIGZpbGUpOwotCSAgICAgIH0KLQkgIH0KLQotCS8qIElmIHRoZSBzdF9vdGhlciBmaWVsZCBpcyBub3QgemVybywgcHJpbnQgaXQuICAqLwotCWlmICgoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyICE9IDApCi0JICBmcHJpbnRmIChmaWxlLCAiIDB4JTAyeCIsCi0JCSAgICgodW5zaWduZWQgaW50KQotCQkgICAgKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcikpOwotCi0JZnByaW50ZiAoZmlsZSwgIiAlcyIsIG5hbWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgICAgcmV0LT5zaXplID0gMDsKLSAgICAgIHJldC0+ZHluaW5keCA9IC0xOwotICAgICAgcmV0LT5keW5zdHJfaW5kZXggPSAwOwotICAgICAgcmV0LT53ZWFrZGVmID0gTlVMTDsKLSAgICAgIHJldC0+Z290Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLSAgICAgIHJldC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLSAgICAgIHJldC0+bGlua2VyX3NlY3Rpb25fcG9pbnRlciA9IChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKTA7Ci0gICAgICByZXQtPnZlcmluZm8udmVyZGVmID0gTlVMTDsKLSAgICAgIHJldC0+dnRhYmxlX2VudHJpZXNfdXNlZCA9IE5VTEw7Ci0gICAgICByZXQtPnZ0YWJsZV9lbnRyaWVzX3NpemUgPSAwOwotICAgICAgcmV0LT52dGFibGVfcGFyZW50ID0gTlVMTDsKLSAgICAgIHJldC0+dHlwZSA9IFNUVF9OT1RZUEU7Ci0gICAgICByZXQtPm90aGVyID0gMDsKLSAgICAgIC8qIEFzc3VtZSB0aGF0IHdlIGhhdmUgYmVlbiBjYWxsZWQgYnkgYSBub24tRUxGIHN5bWJvbCByZWFkZXIuCi0gICAgICAgICBUaGlzIGZsYWcgaXMgdGhlbiByZXNldCBieSB0aGUgY29kZSB3aGljaCByZWFkcyBhbiBFTEYgaW5wdXQKLSAgICAgICAgIGZpbGUuICBUaGlzIGVuc3VyZXMgdGhhdCBhIHN5bWJvbCBjcmVhdGVkIGJ5IGEgbm9uLUVMRiBzeW1ib2wKLSAgICAgICAgIHJlYWRlciB3aWxsIGhhdmUgdGhlIGZsYWcgc2V0IGNvcnJlY3RseS4gICovCi0gICAgICByZXQtPmVsZl9saW5rX2hhc2hfZmxhZ3MgPSBFTEZfTElOS19OT05fRUxGOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgdGFibGUtPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCA9IGZhbHNlOwotICB0YWJsZS0+ZHlub2JqID0gTlVMTDsKLSAgLyogVGhlIGZpcnN0IGR5bmFtaWMgc3ltYm9sIGlzIGEgZHVtbXkuICAqLwotICB0YWJsZS0+ZHluc3ltY291bnQgPSAxOwotICB0YWJsZS0+ZHluc3RyID0gTlVMTDsKLSAgdGFibGUtPmJ1Y2tldGNvdW50ID0gMDsKLSAgdGFibGUtPm5lZWRlZCA9IE5VTEw7Ci0gIHRhYmxlLT5oZ290ID0gTlVMTDsKLSAgdGFibGUtPnN0YWJfaW5mbyA9IE5VTEw7Ci0gIHJldHVybiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIGFiZmQsIG5ld2Z1bmMpOwotfQotCi0vKiBDcmVhdGUgYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0IChyZXQsIGFiZmQsIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogVGhpcyBpcyBhIGhvb2sgZm9yIHRoZSBFTEYgZW11bGF0aW9uIGNvZGUgaW4gdGhlIGdlbmVyaWMgbGlua2VyIHRvCi0gICB0ZWxsIHRoZSBiYWNrZW5kIGxpbmtlciB3aGF0IGZpbGUgbmFtZSB0byB1c2UgZm9yIHRoZSBEVF9ORUVERUQKLSAgIGVudHJ5IGZvciBhIGR5bmFtaWMgb2JqZWN0LiAgVGhlIGdlbmVyaWMgbGlua2VyIHBhc3NlcyBuYW1lIGFzIGFuCi0gICBlbXB0eSBzdHJpbmcgdG8gaW5kaWNhdGUgdGhhdCBubyBEVF9ORUVERUQgZW50cnkgc2hvdWxkIGJlIG1hZGUuICAqLwotCi12b2lkCi1iZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX29iamVjdCkKLSAgICBlbGZfZHRfbmFtZSAoYWJmZCkgPSBuYW1lOwotfQotCi0vKiBHZXQgdGhlIGxpc3Qgb2YgRFRfTkVFREVEIGVudHJpZXMgZm9yIGEgbGluay4gIFRoaXMgaXMgYSBob29rIGZvcgotICAgdGhlIGxpbmtlciBFTEYgZW11bGF0aW9uIGNvZGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKgotYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+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+ZV9zaG51bSkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaW5kZXhdLT5iZmRfc2VjdGlvbjsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqc2RhdGE7Ci0KLSAgc2RhdGEgPSAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoKnNkYXRhKSk7Ci0gIGlmICghc2RhdGEpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzZWMtPnVzZWRfYnlfYmZkID0gKFBUUikgc2RhdGE7Ci0KLSAgLyogSW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzZWN0aW9uIHNob3VsZCB1c2UgUkVMQSByZWxvY2F0aW9ucy4gICovCi0gIHNkYXRhLT51c2VfcmVsYV9wIAotICAgID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5kZWZhdWx0X3VzZV9yZWxhX3A7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhIG5ldyBiZmQgc2VjdGlvbiBmcm9tIGFuIEVMRiBwcm9ncmFtIGhlYWRlci4KLQotICAgU2luY2UgcHJvZ3JhbSBzZWdtZW50cyBoYXZlIG5vIG5hbWVzLCB3ZSBnZW5lcmF0ZSBhIHN5bnRoZXRpYyBuYW1lCi0gICBvZiB0aGUgZm9ybSBzZWdtZW50PE5VTT4sIHdoZXJlIE5VTSBpcyBnZW5lcmFsbHkgdGhlIGluZGV4IGluIHRoZQotICAgcHJvZ3JhbSBoZWFkZXIgdGFibGUuICBGb3Igc2VnbWVudHMgdGhhdCBhcmUgc3BsaXQgKHNlZSBiZWxvdykgd2UKLSAgIGdlbmVyYXRlIHRoZSBuYW1lcyBzZWdtZW50PE5VTT5hIGFuZCBzZWdtZW50PE5VTT5iLgotCi0gICBOb3RlIHRoYXQgc29tZSBwcm9ncmFtIHNlZ21lbnRzIG1heSBoYXZlIGEgZmlsZSBzaXplIHRoYXQgaXMgZGlmZmVyZW50IHRoYW4KLSAgIChsZXNzIHRoYW4pIHRoZSBtZW1vcnkgc2l6ZS4gIEFsbCB0aGlzIG1lYW5zIGlzIHRoYXQgYXQgZXhlY3V0aW9uIHRoZQotICAgc3lzdGVtIG11c3QgYWxsb2NhdGUgdGhlIGFtb3VudCBvZiBtZW1vcnkgc3BlY2lmaWVkIGJ5IHRoZSBtZW1vcnkgc2l6ZSwKLSAgIGJ1dCBvbmx5IGluaXRpYWxpemUgaXQgd2l0aCB0aGUgZmlyc3QgImZpbGUgc2l6ZSIgYnl0ZXMgcmVhZCBmcm9tIHRoZQotICAgZmlsZS4gIFRoaXMgd291bGQgb2NjdXIgZm9yIGV4YW1wbGUsIHdpdGggcHJvZ3JhbSBzZWdtZW50cyBjb25zaXN0aW5nCi0gICBvZiBjb21iaW5lZCBkYXRhK2Jzcy4KLQotICAgVG8gaGFuZGxlIHRoZSBhYm92ZSBzaXR1YXRpb24sIHRoaXMgcm91dGluZSBnZW5lcmF0ZXMgVFdPIGJmZCBzZWN0aW9ucwotICAgZm9yIHRoZSBzaW5nbGUgcHJvZ3JhbSBzZWdtZW50LiAgVGhlIGZpcnN0IGhhcyB0aGUgbGVuZ3RoIHNwZWNpZmllZCBieQotICAgdGhlIGZpbGUgc2l6ZSBvZiB0aGUgc2VnbWVudCwgYW5kIHRoZSBzZWNvbmQgaGFzIHRoZSBsZW5ndGggc3BlY2lmaWVkCi0gICBieSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gc2l6ZXMuICBJbiBlZmZlY3QsIHRoZSBzZWdtZW50IGlzIHNwbGl0Ci0gICBpbnRvIGl0J3MgaW5pdGlhbGl6ZWQgYW5kIHVuaW5pdGlhbGl6ZWQgcGFydHMuCi0KLSAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCB0eXBlbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfUGhkciAqaGRyOwotICAgICBpbnQgaW5kZXg7Ci0gICAgIGNvbnN0IGNoYXIgKnR5cGVuYW1lOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lYnVmWzY0XTsKLSAgaW50IHNwbGl0OwotCi0gIHNwbGl0ID0gKChoZHItPnBfbWVtc3ogPiAwKQotCSAgICAmJiAoaGRyLT5wX2ZpbGVzeiA+IDApCi0JICAgICYmIChoZHItPnBfbWVtc3ogPiBoZHItPnBfZmlsZXN6KSk7Ci0gIHNwcmludGYgKG5hbWVidWYsICIlcyVkJXMiLCB0eXBlbmFtZSwgaW5kZXgsIHNwbGl0ID8gImEiIDogIiIpOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWVidWYpICsgMSk7Ci0gIGlmICghbmFtZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmNweSAobmFtZSwgbmFtZWJ1Zik7Ci0gIG5ld3NlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5ld3NlY3QtPnZtYSA9IGhkci0+cF92YWRkcjsKLSAgbmV3c2VjdC0+bG1hID0gaGRyLT5wX3BhZGRyOwotICBuZXdzZWN0LT5fcmF3X3NpemUgPSBoZHItPnBfZmlsZXN6OwotICBuZXdzZWN0LT5maWxlcG9zID0gaGRyLT5wX29mZnNldDsKLSAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLSAgaWYgKGhkci0+cF90eXBlID09IFBUX0xPQUQpCi0gICAgewotICAgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0xPQUQ7Ci0gICAgICBpZiAoaGRyLT5wX2ZsYWdzICYgUEZfWCkKLQl7Ci0JICAvKiBGSVhNRTogYWxsIHdlIGtub3duIGlzIHRoYXQgaXQgaGFzIGV4ZWN1dGUgUEVSTUlTU0lPTiwKLQkgICAgIG1heSBiZSBkYXRhLiAqLwotCSAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0JfQotICAgIH0KLSAgaWYgKCEoaGRyLT5wX2ZsYWdzICYgUEZfVykpCi0gICAgewotICAgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotICAgIH0KLQotICBpZiAoc3BsaXQpCi0gICAgewotICAgICAgc3ByaW50ZiAobmFtZWJ1ZiwgIiVzJWRiIiwgdHlwZW5hbWUsIGluZGV4KTsKLSAgICAgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAobmFtZWJ1ZikgKyAxKTsKLSAgICAgIGlmICghbmFtZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzdHJjcHkgKG5hbWUsIG5hbWVidWYpOwotICAgICAgbmV3c2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICAgICAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBuZXdzZWN0LT52bWEgPSBoZHItPnBfdmFkZHIgKyBoZHItPnBfZmlsZXN6OwotICAgICAgbmV3c2VjdC0+bG1hID0gaGRyLT5wX3BhZGRyICsgaGRyLT5wX2ZpbGVzejsKLSAgICAgIG5ld3NlY3QtPl9yYXdfc2l6ZSA9IGhkci0+cF9tZW1zeiAtIGhkci0+cF9maWxlc3o7Ci0gICAgICBpZiAoaGRyLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQl7Ci0JICBuZXdzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0JICBpZiAoaGRyLT5wX2ZsYWdzICYgUEZfWCkKLQkgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0JfQotICAgICAgaWYgKCEoaGRyLT5wX2ZsYWdzICYgUEZfVykpCi0JbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotYmZkX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9QaGRyICpoZHI7Ci0gICAgIGludCBpbmRleDsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICBzd2l0Y2ggKGhkci0+cF90eXBlKQotICAgIHsKLSAgICBjYXNlIFBUX05VTEw6Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaGRyLCBpbmRleCwgIm51bGwiKTsKLQotICAgIGNhc2UgUFRfTE9BRDoKLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCAibG9hZCIpOwotCi0gICAgY2FzZSBQVF9EWU5BTUlDOgotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgsICJkeW5hbWljIik7Ci0KLSAgICBjYXNlIFBUX0lOVEVSUDoKLSAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCAiaW50ZXJwIik7Ci0KLSAgICBjYXNlIFBUX05PVEU6Ci0gICAgICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCAibm90ZSIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGVsZmNvcmVfcmVhZF9ub3RlcyAoYWJmZCwgaGRyLT5wX29mZnNldCwgaGRyLT5wX2ZpbGVzeikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIFBUX1NITElCOgotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgsICJzaGxpYiIpOwotCi0gICAgY2FzZSBQVF9QSERSOgotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGhkciwgaW5kZXgsICJwaGRyIik7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogQ2hlY2sgZm9yIGFueSBwcm9jZXNzb3Itc3BlY2lmaWMgcHJvZ3JhbSBzZWdtZW50IHR5cGVzLgotICAgICAgICAgSWYgbm8gaGFuZGxlciBmb3IgdGhlbSwgZGVmYXVsdCB0byBtYWtpbmcgInNlZ21lbnQiIHNlY3Rpb25zLiAqLwotICAgICAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICAgICAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIpCi0JcmV0dXJuICgqYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fcGhkcikgKGFiZmQsIGhkciwgaW5kZXgpOwotICAgICAgZWxzZQotCXJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBoZHIsIGluZGV4LCAic2VnbWVudCIpOwotICAgIH0KLX0KLQotLyogSW5pdGlhbGl6ZSBSRUxfSERSLCB0aGUgc2VjdGlvbi1oZWFkZXIgZm9yIG5ldyBzZWN0aW9uLCBjb250YWluaW5nCi0gICByZWxvY2F0aW9ucyBhZ2FpbnN0IEFTRUNULiAgSWYgVVNFX1JFTEFfUCBpcyB0cnVlLCB3ZSB1c2UgUkVMQQotICAgcmVsb2NhdGlvbnM7IG90aGVyd2lzZSwgd2UgdXNlIFJFTCByZWxvY2F0aW9ucy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2luaXRfcmVsb2Nfc2hkciAoYWJmZCwgcmVsX2hkciwgYXNlY3QsIHVzZV9yZWxhX3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgYm9vbGVhbiB1c2VfcmVsYV9wOwotewotICBjaGFyICpuYW1lOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICIucmVsYSIgKyBzdHJsZW4gKGFzZWN0LT5uYW1lKSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzcHJpbnRmIChuYW1lLCAiJXMlcyIsIHVzZV9yZWxhX3AgPyAiLnJlbGEiIDogIi5yZWwiLCBhc2VjdC0+bmFtZSk7Ci0gIHJlbF9oZHItPnNoX25hbWUgPQotICAgICh1bnNpZ25lZCBpbnQpIF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX3Noc3RydGFiIChhYmZkKSwgbmFtZSwKLQkJCQkgICAgICAgdHJ1ZSwgZmFsc2UpOwotICBpZiAocmVsX2hkci0+c2hfbmFtZSA9PSAodW5zaWduZWQgaW50KSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJlbF9oZHItPnNoX3R5cGUgPSB1c2VfcmVsYV9wID8gU0hUX1JFTEEgOiBTSFRfUkVMOwotICByZWxfaGRyLT5zaF9lbnRzaXplID0gKHVzZV9yZWxhX3AKLQkJCSA/IGJlZC0+cy0+c2l6ZW9mX3JlbGEKLQkJCSA6IGJlZC0+cy0+c2l6ZW9mX3JlbCk7Ci0gIHJlbF9oZHItPnNoX2FkZHJhbGlnbiA9IGJlZC0+cy0+ZmlsZV9hbGlnbjsKLSAgcmVsX2hkci0+c2hfZmxhZ3MgPSAwOwotICByZWxfaGRyLT5zaF9hZGRyID0gMDsKLSAgcmVsX2hkci0+c2hfc2l6ZSA9IDA7Ci0gIHJlbF9oZHItPnNoX29mZnNldCA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB1cCBhbiBFTEYgaW50ZXJuYWwgc2VjdGlvbiBoZWFkZXIgZm9yIGEgc2VjdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWVsZl9mYWtlX3NlY3Rpb25zIChhYmZkLCBhc2VjdCwgZmFpbGVkcHRyYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgUFRSIGZhaWxlZHB0cmFyZzsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgYm9vbGVhbiAqZmFpbGVkcHRyID0gKGJvb2xlYW4gKikgZmFpbGVkcHRyYXJnOwotICBFbGZfSW50ZXJuYWxfU2hkciAqdGhpc19oZHI7Ci0KLSAgaWYgKCpmYWlsZWRwdHIpCi0gICAgewotICAgICAgLyogV2UgYWxyZWFkeSBmYWlsZWQ7IGp1c3QgZ2V0IG91dCBvZiB0aGUgYmZkX21hcF9vdmVyX3NlY3Rpb25zCi0gICAgICAgICBsb29wLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdGhpc19oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpLT50aGlzX2hkcjsKLQotICB0aGlzX2hkci0+c2hfbmFtZSA9ICh1bnNpZ25lZCBsb25nKSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9zaHN0cnRhYiAoYWJmZCksCi0JCQkJCQkJICBhc2VjdC0+bmFtZSwKLQkJCQkJCQkgIHRydWUsIGZhbHNlKTsKLSAgaWYgKHRoaXNfaGRyLT5zaF9uYW1lID09ICh1bnNpZ25lZCBsb25nKSAtMSkKLSAgICB7Ci0gICAgICAqZmFpbGVkcHRyID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdGhpc19oZHItPnNoX2ZsYWdzID0gMDsKLQotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotICAgICAgfHwgYXNlY3QtPnVzZXJfc2V0X3ZtYSkKLSAgICB0aGlzX2hkci0+c2hfYWRkciA9IGFzZWN0LT52bWE7Ci0gIGVsc2UKLSAgICB0aGlzX2hkci0+c2hfYWRkciA9IDA7Ci0KLSAgdGhpc19oZHItPnNoX29mZnNldCA9IDA7Ci0gIHRoaXNfaGRyLT5zaF9zaXplID0gYXNlY3QtPl9yYXdfc2l6ZTsKLSAgdGhpc19oZHItPnNoX2xpbmsgPSAwOwotICB0aGlzX2hkci0+c2hfYWRkcmFsaWduID0gMSA8PCBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyOwotICAvKiBUaGUgc2hfZW50c2l6ZSBhbmQgc2hfaW5mbyBmaWVsZHMgbWF5IGhhdmUgYmVlbiBzZXQgYWxyZWFkeSBieQotICAgICBjb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLiAgKi8KLQotICB0aGlzX2hkci0+YmZkX3NlY3Rpb24gPSBhc2VjdDsKLSAgdGhpc19oZHItPmNvbnRlbnRzID0gTlVMTDsKLQotICAvKiBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIGJhc2VkIG9uIHNlY3Rpb24gbmFtZXMuICAqLwotICBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5keW5zdHIiKSA9PSAwKQotICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5oYXNoIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9IQVNIOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9oYXNoX2VudHJ5OwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5keW5zeW0iKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0RZTlNZTTsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2Zfc3ltOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5keW5hbWljIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9EWU5BTUlDOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9keW47Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChhc2VjdC0+bmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCSAgICYmIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+bWF5X3VzZV9yZWxhX3ApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfUkVMQTsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfcmVsYTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGFzZWN0LT5uYW1lLCAiLnJlbCIsIDQpID09IDAKLQkgICAmJiBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPm1heV91c2VfcmVsX3ApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfUkVMOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9yZWw7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChhc2VjdC0+bmFtZSwgIi5ub3RlIiwgNSkgPT0gMCkKLSAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9OT1RFOwotICBlbHNlIGlmIChzdHJuY21wIChhc2VjdC0+bmFtZSwgIi5zdGFiIiwgNSkgPT0gMAotCSAgICYmIHN0cmNtcCAoYXNlY3QtPm5hbWUgKyBzdHJsZW4gKGFzZWN0LT5uYW1lKSAtIDMsICJzdHIiKSA9PSAwKQotICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5nbnUudmVyc2lvbiIpID09IDApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfR05VX3ZlcnN5bTsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyc3ltKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZ251LnZlcnNpb25fZCIpID09IDApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfR05VX3ZlcmRlZjsKLSAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgICAgIC8qIG9iamNvcHkgb3Igc3RyaXAgd2lsbCBjb3B5IG92ZXIgc2hfaW5mbywgYnV0IG1heSBub3Qgc2V0Ci0gICAgICAgICBjdmVyZGVmcy4gIFRoZSBsaW5rZXIgd2lsbCBzZXQgY3ZlcmRlZnMsIGJ1dCBzaF9pbmZvIHdpbGwgYmUKLSAgICAgICAgIHplcm8uICAqLwotICAgICAgaWYgKHRoaXNfaGRyLT5zaF9pbmZvID09IDApCi0JdGhpc19oZHItPnNoX2luZm8gPSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVyZGVmczsKLSAgICAgIGVsc2UKLQlCRkRfQVNTRVJUIChlbGZfdGRhdGEgKGFiZmQpLT5jdmVyZGVmcyA9PSAwCi0JCSAgICB8fCB0aGlzX2hkci0+c2hfaW5mbyA9PSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVyZGVmcyk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmdudS52ZXJzaW9uX3IiKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0dOVV92ZXJuZWVkOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSAwOwotICAgICAgLyogb2JqY29weSBvciBzdHJpcCB3aWxsIGNvcHkgb3ZlciBzaF9pbmZvLCBidXQgbWF5IG5vdCBzZXQKLSAgICAgICAgIGN2ZXJyZWZzLiAgVGhlIGxpbmtlciB3aWxsIHNldCBjdmVycmVmcywgYnV0IHNoX2luZm8gd2lsbCBiZQotICAgICAgICAgemVyby4gICovCi0gICAgICBpZiAodGhpc19oZHItPnNoX2luZm8gPT0gMCkKLQl0aGlzX2hkci0+c2hfaW5mbyA9IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJyZWZzOwotICAgICAgZWxzZQotCUJGRF9BU1NFUlQgKGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJyZWZzID09IDAKLQkJICAgIHx8IHRoaXNfaGRyLT5zaF9pbmZvID09IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJyZWZzKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkgICAmJiAoYXNlY3QtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0gIGVsc2UgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkgICAmJiAoKGFzZWN0LT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKSkKLSAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9OT0JJVFM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXaG8ga25vd3M/ICAqLwotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0gICAgfQotCi0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHRoaXNfaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0M7Ci0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotICAgIHRoaXNfaGRyLT5zaF9mbGFncyB8PSBTSEZfV1JJVEU7Ci0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0NPREUpICE9IDApCi0gICAgdGhpc19oZHItPnNoX2ZsYWdzIHw9IFNIRl9FWEVDSU5TVFI7Ci0KLSAgLyogQ2hlY2sgZm9yIHByb2Nlc3Nvci1zcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgKi8KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucykKLSAgICAoKmJlZC0+ZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucykgKGFiZmQsIHRoaXNfaGRyLCBhc2VjdCk7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb24gaGFzIHJlbG9jcywgc2V0IHVwIGEgc2VjdGlvbiBoZWFkZXIgZm9yIHRoZQotICAgICBTSFRfUkVMW0FdIHNlY3Rpb24uICBJZiB0d28gcmVsb2NhdGlvbiBzZWN0aW9ucyBhcmUgcmVxdWlyZWQgZm9yCi0gICAgIHRoaXMgc2VjdGlvbiwgaXQgaXMgdXAgdG8gdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBiYWNrLWVuZCB0bwotICAgICBjcmVhdGUgdGhlIG90aGVyLiAgKi8gCi0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0gICAgICAmJiAhX2JmZF9lbGZfaW5pdF9yZWxvY19zaGRyIChhYmZkLCAKLQkJCQkgICAgJmVsZl9zZWN0aW9uX2RhdGEgKGFzZWN0KS0+cmVsX2hkciwKLQkJCQkgICAgYXNlY3QsIAotCQkJCSAgICBlbGZfc2VjdGlvbl9kYXRhIChhc2VjdCktPnVzZV9yZWxhX3ApKQotICAgICpmYWlsZWRwdHIgPSB0cnVlOwotfQotCi0vKiBBc3NpZ24gYWxsIEVMRiBzZWN0aW9uIG51bWJlcnMuICBUaGUgZHVtbXkgZmlyc3Qgc2VjdGlvbiBpcyBoYW5kbGVkIGhlcmUKLSAgIHRvby4gIFRoZSBsaW5rL2luZm8gcG9pbnRlcnMgZm9yIHRoZSBzdGFuZGFyZCBzZWN0aW9uIHR5cGVzIGFyZSBmaWxsZWQKLSAgIGluIGhlcmUgdG9vLCB3aGlsZSB3ZSdyZSBhdCBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hc3NpZ25fc2VjdGlvbl9udW1iZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhICp0ID0gZWxmX3RkYXRhIChhYmZkKTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fbnVtYmVyOwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnA7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgc2VjdGlvbl9udW1iZXIgPSAxOwotCi0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYzsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqZCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyk7Ci0KLSAgICAgIGQtPnRoaXNfaWR4ID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLQlkLT5yZWxfaWR4ID0gMDsKLSAgICAgIGVsc2UKLQlkLT5yZWxfaWR4ID0gc2VjdGlvbl9udW1iZXIrKzsKLQotICAgICAgaWYgKGQtPnJlbF9oZHIyKQotCWQtPnJlbF9pZHgyID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgICAgIGVsc2UKLQlkLT5yZWxfaWR4MiA9IDA7Ci0gICAgfQotCi0gIHQtPnNoc3RydGFiX3NlY3Rpb24gPSBzZWN0aW9uX251bWJlcisrOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCA9IHQtPnNoc3RydGFiX3NlY3Rpb247Ci0gIHQtPnNoc3RydGFiX2hkci5zaF9zaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX3Noc3RydGFiIChhYmZkKSk7Ci0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICB0LT5zeW10YWJfc2VjdGlvbiA9IHNlY3Rpb25fbnVtYmVyKys7Ci0gICAgICB0LT5zdHJ0YWJfc2VjdGlvbiA9IHNlY3Rpb25fbnVtYmVyKys7Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtID0gc2VjdGlvbl9udW1iZXI7Ci0KLSAgLyogU2V0IHVwIHRoZSBsaXN0IG9mIHNlY3Rpb24gaGVhZGVyIHBvaW50ZXJzLCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUKLSAgICAgaW5kaWNlcy4gICovCi0gIGlfc2hkcnAgPSAoKEVsZl9JbnRlcm5hbF9TaGRyICoqKQotCSAgICAgYmZkX2FsbG9jIChhYmZkLCBzZWN0aW9uX251bWJlciAqIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIgKikpKTsKLSAgaWYgKGlfc2hkcnAgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaV9zaGRycFswXSA9ICgoRWxmX0ludGVybmFsX1NoZHIgKikKLQkJYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyKSkpOwotICBpZiAoaV9zaGRycFswXSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpX3NoZHJwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG1lbXNldCAoaV9zaGRycFswXSwgMCwgc2l6ZW9mIChFbGZfSW50ZXJuYWxfU2hkcikpOwotCi0gIGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgPSBpX3NoZHJwOwotCi0gIGlfc2hkcnBbdC0+c2hzdHJ0YWJfc2VjdGlvbl0gPSAmdC0+c2hzdHJ0YWJfaGRyOwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIGlfc2hkcnBbdC0+c3ltdGFiX3NlY3Rpb25dID0gJnQtPnN5bXRhYl9oZHI7Ci0gICAgICBpX3NoZHJwW3QtPnN0cnRhYl9zZWN0aW9uXSA9ICZ0LT5zdHJ0YWJfaGRyOwotICAgICAgdC0+c3ltdGFiX2hkci5zaF9saW5rID0gdC0+c3RydGFiX3NlY3Rpb247Ci0gICAgfQotICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKmQgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICBpX3NoZHJwW2QtPnRoaXNfaWR4XSA9ICZkLT50aGlzX2hkcjsKLSAgICAgIGlmIChkLT5yZWxfaWR4ICE9IDApCi0JaV9zaGRycFtkLT5yZWxfaWR4XSA9ICZkLT5yZWxfaGRyOwotICAgICAgaWYgKGQtPnJlbF9pZHgyICE9IDApCi0JaV9zaGRycFtkLT5yZWxfaWR4Ml0gPSBkLT5yZWxfaGRyMjsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgc2hfbGluayBhbmQgc2hfaW5mbyBmaWVsZHMgd2hpbGUgd2UncmUgYXQgaXQuICAqLwotCi0gICAgICAvKiBzaF9saW5rIG9mIGEgcmVsb2Mgc2VjdGlvbiBpcyB0aGUgc2VjdGlvbiBpbmRleCBvZiB0aGUgc3ltYm9sCi0JIHRhYmxlLiAgc2hfaW5mbyBpcyB0aGUgc2VjdGlvbiBpbmRleCBvZiB0aGUgc2VjdGlvbiB0byB3aGljaAotCSB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIGFwcGx5LiAgKi8KLSAgICAgIGlmIChkLT5yZWxfaWR4ICE9IDApCi0JewotCSAgZC0+cmVsX2hkci5zaF9saW5rID0gdC0+c3ltdGFiX3NlY3Rpb247Ci0JICBkLT5yZWxfaGRyLnNoX2luZm8gPSBkLT50aGlzX2lkeDsKLQl9Ci0gICAgICBpZiAoZC0+cmVsX2lkeDIgIT0gMCkKLQl7Ci0JICBkLT5yZWxfaGRyMi0+c2hfbGluayA9IHQtPnN5bXRhYl9zZWN0aW9uOwotCSAgZC0+cmVsX2hkcjItPnNoX2luZm8gPSBkLT50aGlzX2lkeDsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoZC0+dGhpc19oZHIuc2hfdHlwZSkKLQl7Ci0JY2FzZSBTSFRfUkVMOgotCWNhc2UgU0hUX1JFTEE6Ci0JICAvKiBBIHJlbG9jIHNlY3Rpb24gd2hpY2ggd2UgYXJlIHRyZWF0aW5nIGFzIGEgbm9ybWFsIEJGRAotCSAgICAgc2VjdGlvbi4gIHNoX2xpbmsgaXMgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlIHN5bWJvbAotCSAgICAgdGFibGUuICBzaF9pbmZvIGlzIHRoZSBzZWN0aW9uIGluZGV4IG9mIHRoZSBzZWN0aW9uIHRvCi0JICAgICB3aGljaCB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIGFwcGx5LiAgV2UgYXNzdW1lIHRoYXQgYW4KLQkgICAgIGFsbG9jYXRlZCByZWxvYyBzZWN0aW9uIHVzZXMgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotCSAgICAgRklYTUU6IEhvdyBjYW4gd2UgYmUgc3VyZT8gICovCi0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3ltIik7Ci0JICBpZiAocyAhPSBOVUxMKQotCSAgICBkLT50aGlzX2hkci5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCi0JICAvKiBXZSBsb29rIHVwIHRoZSBzZWN0aW9uIHRoZSByZWxvY3MgYXBwbHkgdG8gYnkgbmFtZS4gICovCi0JICBuYW1lID0gc2VjLT5uYW1lOwotCSAgaWYgKGQtPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTCkKLQkgICAgbmFtZSArPSA0OwotCSAgZWxzZQotCSAgICBuYW1lICs9IDU7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCSAgaWYgKHMgIT0gTlVMTCkKLQkgICAgZC0+dGhpc19oZHIuc2hfaW5mbyA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfU1RSVEFCOgotCSAgLyogV2UgYXNzdW1lIHRoYXQgYSBzZWN0aW9uIG5hbWVkIC5zdGFiKnN0ciBpcyBhIHN0YWJzCi0JICAgICBzdHJpbmcgc2VjdGlvbi4gIFdlIGxvb2sgZm9yIGEgc2VjdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUKLQkgICAgIGJ1dCB3aXRob3V0IHRoZSB0cmFpbGluZyBgYHN0cicnLCBhbmQgc2V0IGl0cyBzaF9saW5rCi0JICAgICBmaWVsZCB0byBwb2ludCB0byB0aGlzIHNlY3Rpb24uICAqLwotCSAgaWYgKHN0cm5jbXAgKHNlYy0+bmFtZSwgIi5zdGFiIiwgc2l6ZW9mICIuc3RhYiIgLSAxKSA9PSAwCi0JICAgICAgJiYgc3RyY21wIChzZWMtPm5hbWUgKyBzdHJsZW4gKHNlYy0+bmFtZSkgLSAzLCAic3RyIikgPT0gMCkKLQkgICAgewotCSAgICAgIHNpemVfdCBsZW47Ci0JICAgICAgY2hhciAqYWxjOwotCi0JICAgICAgbGVuID0gc3RybGVuIChzZWMtPm5hbWUpOwotCSAgICAgIGFsYyA9IChjaGFyICopIGJmZF9tYWxsb2MgKGxlbiAtIDIpOwotCSAgICAgIGlmIChhbGMgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHN0cm5jcHkgKGFsYywgc2VjLT5uYW1lLCBsZW4gLSAzKTsKLQkgICAgICBhbGNbbGVuIC0gM10gPSAnXDAnOwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgYWxjKTsKLQkgICAgICBmcmVlIChhbGMpOwotCSAgICAgIGlmIChzICE9IE5VTEwpCi0JCXsKLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfbGluayA9IGQtPnRoaXNfaWR4OwotCi0JCSAgLyogVGhpcyBpcyBhIC5zdGFiIHNlY3Rpb24uICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplID0KLQkJICAgIDQgKyAyICogKGJlZC0+cy0+YXJjaF9zaXplIC8gOCk7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9EWU5BTUlDOgotCWNhc2UgU0hUX0RZTlNZTToKLQljYXNlIFNIVF9HTlVfdmVybmVlZDoKLQljYXNlIFNIVF9HTlVfdmVyZGVmOgotCSAgLyogc2hfbGluayBpcyB0aGUgc2VjdGlvbiBoZWFkZXIgaW5kZXggb2YgdGhlIHN0cmluZyB0YWJsZQotCSAgICAgdXNlZCBmb3IgdGhlIGR5bmFtaWMgZW50cmllcywgb3IgdGhlIHN5bWJvbCB0YWJsZSwgb3IgdGhlCi0JICAgICB2ZXJzaW9uIHN0cmluZ3MuICAqLwotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN0ciIpOwotCSAgaWYgKHMgIT0gTlVMTCkKLQkgICAgZC0+dGhpc19oZHIuc2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfSEFTSDoKLQljYXNlIFNIVF9HTlVfdmVyc3ltOgotCSAgLyogc2hfbGluayBpcyB0aGUgc2VjdGlvbiBoZWFkZXIgaW5kZXggb2YgdGhlIHN5bWJvbCB0YWJsZQotCSAgICAgdGhpcyBoYXNoIHRhYmxlIG9yIHZlcnNpb24gdGFibGUgaXMgZm9yLiAgKi8KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zeW0iKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIGQtPnRoaXNfaGRyLnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYXAgc3ltYm9sIGZyb20gaXQncyBpbnRlcm5hbCBudW1iZXIgdG8gdGhlIGV4dGVybmFsIG51bWJlciwgbW92aW5nCi0gICBhbGwgbG9jYWwgc3ltYm9scyB0byBiZSBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1zeW1faXNfZ2xvYmFsIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICAvKiBJZiB0aGUgYmFja2VuZCBoYXMgYSBzcGVjaWFsIG1hcHBpbmcsIHVzZSBpdC4gICovCi0gIGlmIChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwpCi0gICAgcmV0dXJuICgoKmdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCkKLQkgICAgKGFiZmQsIHN5bSkpOwotCi0gIHJldHVybiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkgIT0gMAotCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmX21hcF9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBzeW1jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBhc3ltYm9sICoqc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIGFzeW1ib2wgKipzZWN0X3N5bXM7Ci0gIGludCBudW1fbG9jYWxzID0gMDsKLSAgaW50IG51bV9nbG9iYWxzID0gMDsKLSAgaW50IG51bV9sb2NhbHMyID0gMDsKLSAgaW50IG51bV9nbG9iYWxzMiA9IDA7Ci0gIGludCBtYXhfaW5kZXggPSAwOwotICBpbnQgbnVtX3NlY3Rpb25zID0gMDsKLSAgaW50IGlkeDsKLSAgYXNlY3Rpb24gKmFzZWN0OwotICBhc3ltYm9sICoqbmV3X3N5bXM7Ci0gIGFzeW1ib2wgKnN5bTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgImVsZl9tYXBfc3ltYm9sc1xuIik7Ci0gIGZmbHVzaCAoc3RkZXJyKTsKLSNlbmRpZgotCi0gIC8qIEFkZCBhIHNlY3Rpb24gc3ltYm9sIGZvciBlYWNoIEJGRCBzZWN0aW9uLiAgRklYTUU6IElzIHRoaXMgcmVhbGx5Ci0gICAgIG5lY2Vzc2FyeT8gICovCi0gIGZvciAoYXNlY3QgPSBhYmZkLT5zZWN0aW9uczsgYXNlY3Q7IGFzZWN0ID0gYXNlY3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKG1heF9pbmRleCA8IGFzZWN0LT5pbmRleCkKLQltYXhfaW5kZXggPSBhc2VjdC0+aW5kZXg7Ci0gICAgfQotCi0gIG1heF9pbmRleCsrOwotICBzZWN0X3N5bXMgPSAoYXN5bWJvbCAqKikgYmZkX3phbGxvYyAoYWJmZCwgbWF4X2luZGV4ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgaWYgKHNlY3Rfc3ltcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxmX3NlY3Rpb25fc3ltcyAoYWJmZCkgPSBzZWN0X3N5bXM7Ci0KLSAgZm9yIChpZHggPSAwOyBpZHggPCBzeW1jb3VudDsgaWR4KyspCi0gICAgewotICAgICAgc3ltID0gc3ltc1tpZHhdOwotICAgICAgCi0gICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDAKLQkgICYmIHN5bS0+dmFsdWUgPT0gMCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBzZWMgPSBzeW0tPnNlY3Rpb247Ci0KLQkgIGlmIChzZWMtPm93bmVyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoc2VjLT5vd25lciAhPSBhYmZkKQotCQl7Ci0JCSAgaWYgKHNlYy0+b3V0cHV0X29mZnNldCAhPSAwKQotCQkgICAgY29udGludWU7Ci0JCSAgCi0JCSAgc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQotCQkgIC8qIEVtcHR5IHNlY3Rpb25zIGluIHRoZSBpbnB1dCBmaWxlcyBtYXkgaGF2ZSBoYWQgYSBzZWN0aW9uCi0JCSAgICAgc3ltYm9sIGNyZWF0ZWQgZm9yIHRoZW0uICAoU2VlIHRoZSBjb21tZW50IG5lYXIgdGhlIGVuZCBvZgotCQkgICAgIF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzIGluIGxpbmtlci5jKS4gIElmIHRoZSBsaW5rZXIKLQkJICAgICBzY3JpcHQgZGlzY2FyZHMgc3VjaCBzZWN0aW9ucyB0aGVuIHdlIHdpbGwgcmVhY2ggdGhpcyBwb2ludC4KLQkJICAgICBTaW5jZSB3ZSBrbm93IHRoYXQgd2UgY2Fubm90IGF2b2lkIHRoaXMgY2FzZSwgd2UgZGV0ZWN0IGl0Ci0JCSAgICAgYW5kIHNraXAgdGhlIGFib3J0IGFuZCB0aGUgYXNzaWdubWVudCB0byB0aGUgc2VjdF9zeW1zIGFycmF5LgotCQkgICAgIFRvIHJlcHJvZHVjZSB0aGlzIHBhcnRpY3VsYXIgY2FzZSB0cnkgcnVubmluZyB0aGUgbGlua2VyCi0JCSAgICAgdGVzdHN1aXRlIHRlc3QgbGQtc2NyaXB0cy93ZWFrLmV4cCBmb3IgYW4gRUxGIHBvcnQgdGhhdCB1c2VzCi0JCSAgICAgdGhlIGdlbmVyaWMgbGlua2VyLiAgKi8KLQkJICBpZiAoc2VjLT5vd25lciA9PSBOVUxMKQotCQkgICAgY29udGludWU7Ci0KLQkJICBCRkRfQVNTRVJUIChzZWMtPm93bmVyID09IGFiZmQpOwotCQl9Ci0JICAgICAgc2VjdF9zeW1zW3NlYy0+aW5kZXhdID0gc3ltc1tpZHhdOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0OyBhc2VjdCA9IGFzZWN0LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZWN0X3N5bXNbYXNlY3QtPmluZGV4XSAhPSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN5bS0+dGhlX2JmZCA9IGFiZmQ7Ci0gICAgICBzeW0tPm5hbWUgPSBhc2VjdC0+bmFtZTsKLSAgICAgIHN5bS0+dmFsdWUgPSAwOwotICAgICAgLyogU2V0IHRoZSBmbGFncyB0byAwIHRvIGluZGljYXRlIHRoYXQgdGhpcyBvbmUgd2FzIG5ld2x5IGFkZGVkLiAgKi8KLSAgICAgIHN5bS0+ZmxhZ3MgPSAwOwotICAgICAgc3ltLT5zZWN0aW9uID0gYXNlY3Q7Ci0gICAgICBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XSA9IHN5bTsKLSAgICAgIG51bV9zZWN0aW9ucysrOwotI2lmZGVmIERFQlVHCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gXygiY3JlYXRpbmcgc2VjdGlvbiBzeW1ib2wsIG5hbWUgPSAlcywgdmFsdWUgPSAweCUuOGx4LCBpbmRleCA9ICVkLCBzZWN0aW9uID0gMHglLjhseFxuIiksCi0JICAgICAgIGFzZWN0LT5uYW1lLCAobG9uZykgYXNlY3QtPnZtYSwgYXNlY3QtPmluZGV4LCAobG9uZykgYXNlY3QpOwotI2VuZGlmCi0gICAgfQotCi0gIC8qIENsYXNzaWZ5IGFsbCBvZiB0aGUgc3ltYm9scy4gICovCi0gIGZvciAoaWR4ID0gMDsgaWR4IDwgc3ltY291bnQ7IGlkeCsrKQotICAgIHsKLSAgICAgIGlmICghc3ltX2lzX2dsb2JhbCAoYWJmZCwgc3ltc1tpZHhdKSkKLQludW1fbG9jYWxzKys7Ci0gICAgICBlbHNlCi0JbnVtX2dsb2JhbHMrKzsKLSAgICB9Ci0gIGZvciAoYXNlY3QgPSBhYmZkLT5zZWN0aW9uczsgYXNlY3Q7IGFzZWN0ID0gYXNlY3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdICE9IE5VTEwKLQkgICYmIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdLT5mbGFncyA9PSAwKQotCXsKLQkgIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdLT5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIGlmICghc3ltX2lzX2dsb2JhbCAoYWJmZCwgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0pKQotCSAgICBudW1fbG9jYWxzKys7Ci0JICBlbHNlCi0JICAgIG51bV9nbG9iYWxzKys7Ci0JICBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XS0+ZmxhZ3MgPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHNvcnQgdGhlIHN5bWJvbHMgc28gdGhlIGxvY2FsIHN5bWJvbHMgYXJlIGZpcnN0LiAgKi8KLSAgbmV3X3N5bXMgPSAoKGFzeW1ib2wgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJIChudW1fbG9jYWxzICsgbnVtX2dsb2JhbHMpICogc2l6ZW9mIChhc3ltYm9sICopKSk7Ci0gIGlmIChuZXdfc3ltcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGlkeCA9IDA7IGlkeCA8IHN5bWNvdW50OyBpZHgrKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW0gPSBzeW1zW2lkeF07Ci0gICAgICBpbnQgaTsKLQotICAgICAgaWYgKCFzeW1faXNfZ2xvYmFsIChhYmZkLCBzeW0pKQotCWkgPSBudW1fbG9jYWxzMisrOwotICAgICAgZWxzZQotCWkgPSBudW1fbG9jYWxzICsgbnVtX2dsb2JhbHMyKys7Ci0gICAgICBuZXdfc3ltc1tpXSA9IHN5bTsKLSAgICAgIHN5bS0+dWRhdGEuaSA9IGkgKyAxOwotICAgIH0KLSAgZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdDsgYXNlY3QgPSBhc2VjdC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0gIT0gTlVMTAotCSAgJiYgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0tPmZsYWdzID09IDApCi0JewotCSAgYXN5bWJvbCAqc3ltID0gc2VjdF9zeW1zW2FzZWN0LT5pbmRleF07Ci0JICBpbnQgaTsKLQotCSAgc3ltLT5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIGlmICghc3ltX2lzX2dsb2JhbCAoYWJmZCwgc3ltKSkKLQkgICAgaSA9IG51bV9sb2NhbHMyKys7Ci0JICBlbHNlCi0JICAgIGkgPSBudW1fbG9jYWxzICsgbnVtX2dsb2JhbHMyKys7Ci0JICBuZXdfc3ltc1tpXSA9IHN5bTsKLQkgIHN5bS0+dWRhdGEuaSA9IGkgKyAxOwotCX0KLSAgICB9Ci0KLSAgYmZkX3NldF9zeW10YWIgKGFiZmQsIG5ld19zeW1zLCBudW1fbG9jYWxzICsgbnVtX2dsb2JhbHMpOwotCi0gIGVsZl9udW1fbG9jYWxzIChhYmZkKSA9IG51bV9sb2NhbHM7Ci0gIGVsZl9udW1fZ2xvYmFscyAoYWJmZCkgPSBudW1fZ2xvYmFsczsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFsaWduIHRvIHRoZSBtYXhpbXVtIGZpbGUgYWxpZ25tZW50IHRoYXQgY291bGQgYmUgcmVxdWlyZWQgZm9yIGFueQotICAgRUxGIGRhdGEgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIElOTElORSBmaWxlX3B0ciBhbGlnbl9maWxlX3Bvc2l0aW9uIFBBUkFNUyAoKGZpbGVfcHRyLCBpbnQpKTsKLXN0YXRpYyBJTkxJTkUgZmlsZV9wdHIKLWFsaWduX2ZpbGVfcG9zaXRpb24gKG9mZiwgYWxpZ24pCi0gICAgIGZpbGVfcHRyIG9mZjsKLSAgICAgaW50IGFsaWduOwotewotICByZXR1cm4gKG9mZiArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSk7Ci19Ci0KLS8qIEFzc2lnbiBhIGZpbGUgcG9zaXRpb24gdG8gYSBzZWN0aW9uLCBvcHRpb25hbGx5IGFsaWduaW5nIHRvIHRoZQotICAgcmVxdWlyZWQgc2VjdGlvbiBhbGlnbm1lbnQuICAqLwotCi1JTkxJTkUgZmlsZV9wdHIKLV9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChpX3NoZHJwLCBvZmZzZXQsIGFsaWduKQotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaV9zaGRycDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBib29sZWFuIGFsaWduOwotewotICBpZiAoYWxpZ24pCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGFsOwotCi0gICAgICBhbCA9IGlfc2hkcnAtPnNoX2FkZHJhbGlnbjsKLSAgICAgIGlmIChhbCA+IDEpCi0Jb2Zmc2V0ID0gQkZEX0FMSUdOIChvZmZzZXQsIGFsKTsKLSAgICB9Ci0gIGlfc2hkcnAtPnNoX29mZnNldCA9IG9mZnNldDsKLSAgaWYgKGlfc2hkcnAtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgaV9zaGRycC0+YmZkX3NlY3Rpb24tPmZpbGVwb3MgPSBvZmZzZXQ7Ci0gIGlmIChpX3NoZHJwLT5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0gICAgb2Zmc2V0ICs9IGlfc2hkcnAtPnNoX3NpemU7Ci0gIHJldHVybiBvZmZzZXQ7Ci19Ci0KLS8qIENvbXB1dGUgdGhlIGZpbGUgcG9zaXRpb25zIHdlIGFyZSBnb2luZyB0byBwdXQgdGhlIHNlY3Rpb25zIGF0LCBhbmQKLSAgIG90aGVyd2lzZSBwcmVwYXJlIHRvIGJlZ2luIHdyaXRpbmcgb3V0IHRoZSBFTEYgZmlsZS4gIElmIExJTktfSU5GTwotICAgaXMgbm90IE5VTEwsIHRoaXMgaXMgYmVpbmcgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBib29sZWFuIGZhaWxlZDsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc2hzdHJ0YWJfaGRyOwotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIERvIGFueSBlbGYgYmFja2VuZCBzcGVjaWZpYyBwcm9jZXNzaW5nIGZpcnN0LiAgKi8KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZykKLSAgICAoKmJlZC0+ZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZykgKGFiZmQsIGxpbmtfaW5mbyk7Ci0KLSAgaWYgKCEgcHJlcF9oZWFkZXJzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUG9zdCBwcm9jZXNzIHRoZSBoZWFkZXJzIGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzKQotICAgICgqYmVkLT5lbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycykgKGFiZmQsIGxpbmtfaW5mbyk7Ci0KLSAgZmFpbGVkID0gZmFsc2U7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZWxmX2Zha2Vfc2VjdGlvbnMsICZmYWlsZWQpOwotICBpZiAoZmFpbGVkKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIWFzc2lnbl9zZWN0aW9uX251bWJlcnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgYmFja2VuZCBsaW5rZXIgYnVpbGRzIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiBpdHNlbGYuICAqLwotICBpZiAobGlua19pbmZvID09IE5VTEwgJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIC8qIE5vbi16ZXJvIGlmIGRvaW5nIGEgcmVsb2NhdGFibGUgbGluay4gICovCi0gICAgICBpbnQgcmVsb2NhdGFibGVfcCA9ICEgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKTsKLQotICAgICAgaWYgKCEgc3dhcF9vdXRfc3ltcyAoYWJmZCwgJnN0cnRhYiwgcmVsb2NhdGFibGVfcCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzaHN0cnRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c2hzdHJ0YWJfaGRyOwotICAvKiBzaF9uYW1lIHdhcyBzZXQgaW4gcHJlcF9oZWFkZXJzLiAgKi8KLSAgc2hzdHJ0YWJfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLSAgc2hzdHJ0YWJfaGRyLT5zaF9mbGFncyA9IDA7Ci0gIHNoc3RydGFiX2hkci0+c2hfYWRkciA9IDA7Ci0gIHNoc3RydGFiX2hkci0+c2hfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9zaHN0cnRhYiAoYWJmZCkpOwotICBzaHN0cnRhYl9oZHItPnNoX2VudHNpemUgPSAwOwotICBzaHN0cnRhYl9oZHItPnNoX2xpbmsgPSAwOwotICBzaHN0cnRhYl9oZHItPnNoX2luZm8gPSAwOwotICAvKiBzaF9vZmZzZXQgaXMgc2V0IGluIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzLiAgKi8KLSAgc2hzdHJ0YWJfaGRyLT5zaF9hZGRyYWxpZ24gPSAxOwotCi0gIGlmICghYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobGlua19pbmZvID09IE5VTEwgJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIGZpbGVfcHRyIG9mZjsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLSAgICAgIG9mZiA9IGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3M7Ci0KLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICAgICAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGhkciwgb2ZmLCB0cnVlKTsKLQotICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9oZHI7Ci0gICAgICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoaGRyLCBvZmYsIHRydWUpOwotCi0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zID0gb2ZmOwotCi0gICAgICAvKiBOb3cgdGhhdCB3ZSBrbm93IHdoZXJlIHRoZSAuc3RydGFiIHNlY3Rpb24gZ29lcywgd3JpdGUgaXQKLSAgICAgICAgIG91dC4gICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBzdHJ0YWIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKHN0cnRhYik7Ci0gICAgfQotCi0gIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgYSBtYXBwaW5nIGZyb20gYSBzZXQgb2Ygc2VjdGlvbnMgdG8gYSBwcm9ncmFtIHNlZ21lbnQuICAqLwotCi1zdGF0aWMgSU5MSU5FIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKgotbWFrZV9tYXBwaW5nIChhYmZkLCBzZWN0aW9ucywgZnJvbSwgdG8sIHBoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLSAgICAgdW5zaWduZWQgaW50IGZyb207Ci0gICAgIHVuc2lnbmVkIGludCB0bzsKLSAgICAgYm9vbGVhbiBwaGRyOwotewotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYXNlY3Rpb24gKipoZHJwcDsKLQotICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0gICAgICAgYmZkX3phbGxvYyAoYWJmZCwKLQkJICAgKHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkKLQkJICAgICsgKHRvIC0gZnJvbSAtIDEpICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKLSAgaWYgKG0gPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgbS0+bmV4dCA9IE5VTEw7Ci0gIG0tPnBfdHlwZSA9IFBUX0xPQUQ7Ci0gIGZvciAoaSA9IGZyb20sIGhkcnBwID0gc2VjdGlvbnMgKyBmcm9tOyBpIDwgdG87IGkrKywgaGRycHArKykKLSAgICBtLT5zZWN0aW9uc1tpIC0gZnJvbV0gPSAqaGRycHA7Ci0gIG0tPmNvdW50ID0gdG8gLSBmcm9tOwotCi0gIGlmIChmcm9tID09IDAgJiYgcGhkcikKLSAgICB7Ci0gICAgICAvKiBJbmNsdWRlIHRoZSBoZWFkZXJzIGluIHRoZSBmaXJzdCBQVF9MT0FEIHNlZ21lbnQuICAqLwotICAgICAgbS0+aW5jbHVkZXNfZmlsZWhkciA9IDE7Ci0gICAgICBtLT5pbmNsdWRlc19waGRycyA9IDE7Ci0gICAgfQotCi0gIHJldHVybiBtOwotfQotCi0vKiBTZXQgdXAgYSBtYXBwaW5nIGZyb20gQkZEIHNlY3Rpb25zIHRvIHByb2dyYW0gc2VnbWVudHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbWZpcnN0OwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICoqcG07Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07Ci0gIGFzZWN0aW9uICpsYXN0X2hkcjsKLSAgdW5zaWduZWQgaW50IHBoZHJfaW5kZXg7Ci0gIGJmZF92bWEgbWF4cGFnZXNpemU7Ci0gIGFzZWN0aW9uICoqaGRycHA7Ci0gIGJvb2xlYW4gcGhkcl9pbl9zZWdtZW50ID0gdHJ1ZTsKLSAgYm9vbGVhbiB3cml0YWJsZTsKLSAgYXNlY3Rpb24gKmR5bnNlYzsKLQotICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXAgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX2NvdW50X3NlY3Rpb25zIChhYmZkKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlbGVjdCB0aGUgYWxsb2NhdGVkIHNlY3Rpb25zLCBhbmQgc29ydCB0aGVtLiAgKi8KLQotICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoYmZkX2NvdW50X3NlY3Rpb25zIChhYmZkKQotCQkJCSAgICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBpZiAoc2VjdGlvbnMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpID0gMDsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQl7Ci0JICBzZWN0aW9uc1tpXSA9IHM7Ci0JICArK2k7Ci0JfQotICAgIH0KLSAgQkZEX0FTU0VSVCAoaSA8PSBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpKTsKLSAgY291bnQgPSBpOwotCi0gIHFzb3J0IChzZWN0aW9ucywgKHNpemVfdCkgY291bnQsIHNpemVvZiAoYXNlY3Rpb24gKiksIGVsZl9zb3J0X3NlY3Rpb25zKTsKLQotICAvKiBCdWlsZCB0aGUgbWFwcGluZy4gICovCi0KLSAgbWZpcnN0ID0gTlVMTDsKLSAgcG0gPSAmbWZpcnN0OwotCi0gIC8qIElmIHdlIGhhdmUgYSAuaW50ZXJwIHNlY3Rpb24sIHRoZW4gY3JlYXRlIGEgUFRfUEhEUiBzZWdtZW50IGZvcgotICAgICB0aGUgcHJvZ3JhbSBoZWFkZXJzIGFuZCBhIFBUX0lOVEVSUCBzZWdtZW50IGZvciB0aGUgLmludGVycAotICAgICBzZWN0aW9uLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmludGVycCIpOwotICBpZiAocyAhPSBOVUxMICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwKQotICAgIHsKLSAgICAgIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLQkgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApKSk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgbS0+bmV4dCA9IE5VTEw7Ci0gICAgICBtLT5wX3R5cGUgPSBQVF9QSERSOwotICAgICAgLyogRklYTUU6IFVuaXhXYXJlIGFuZCBTb2xhcmlzIHNldCBQRl9YLCBJcml4IDUgZG9lcyBub3QuICAqLwotICAgICAgbS0+cF9mbGFncyA9IFBGX1IgfCBQRl9YOwotICAgICAgbS0+cF9mbGFnc192YWxpZCA9IDE7Ci0gICAgICBtLT5pbmNsdWRlc19waGRycyA9IDE7Ci0KLSAgICAgICpwbSA9IG07Ci0gICAgICBwbSA9ICZtLT5uZXh0OwotCi0gICAgICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKSkpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIG0tPm5leHQgPSBOVUxMOwotICAgICAgbS0+cF90eXBlID0gUFRfSU5URVJQOwotICAgICAgbS0+Y291bnQgPSAxOwotICAgICAgbS0+c2VjdGlvbnNbMF0gPSBzOwotCi0gICAgICAqcG0gPSBtOwotICAgICAgcG0gPSAmbS0+bmV4dDsKLSAgICB9Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzZWN0aW9ucy4gIFdlIHB1dCBzZWN0aW9ucyBpbiB0aGUgc2FtZSBwcm9ncmFtCi0gICAgIHNlZ21lbnQgd2hlbiB0aGUgc3RhcnQgb2YgdGhlIHNlY29uZCBzZWN0aW9uIGNhbiBiZSBwbGFjZWQgd2l0aGluCi0gICAgIGEgZmV3IGJ5dGVzIG9mIHRoZSBlbmQgb2YgdGhlIGZpcnN0IHNlY3Rpb24uICAqLwotICBsYXN0X2hkciA9IE5VTEw7Ci0gIHBoZHJfaW5kZXggPSAwOwotICBtYXhwYWdlc2l6ZSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+bWF4cGFnZXNpemU7Ci0gIHdyaXRhYmxlID0gZmFsc2U7Ci0gIGR5bnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgaWYgKGR5bnNlYyAhPSBOVUxMCi0gICAgICAmJiAoZHluc2VjLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKQotICAgIGR5bnNlYyA9IE5VTEw7Ci0KLSAgLyogRGVhbCB3aXRoIC1UdGV4dCBvciBzb21ldGhpbmcgc2ltaWxhciBzdWNoIHRoYXQgdGhlIGZpcnN0IHNlY3Rpb24KLSAgICAgaXMgbm90IGFkamFjZW50IHRvIHRoZSBwcm9ncmFtIGhlYWRlcnMuICBUaGlzIGlzIGFuCi0gICAgIGFwcHJveGltYXRpb24sIHNpbmNlIGF0IHRoaXMgcG9pbnQgd2UgZG9uJ3Qga25vdyBleGFjdGx5IGhvdyBtYW55Ci0gICAgIHByb2dyYW0gaGVhZGVycyB3ZSB3aWxsIG5lZWQuICAqLwotICBpZiAoY291bnQgPiAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgcGhkcl9zaXplOwotCi0gICAgICBwaGRyX3NpemUgPSBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplOwotICAgICAgaWYgKHBoZHJfc2l6ZSA9PSAwKQotCXBoZHJfc2l6ZSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX3BoZHI7Ci0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgPT0gMAotCSAgfHwgc2VjdGlvbnNbMF0tPmxtYSA8IHBoZHJfc2l6ZQotCSAgfHwgc2VjdGlvbnNbMF0tPmxtYSAlIG1heHBhZ2VzaXplIDwgcGhkcl9zaXplICUgbWF4cGFnZXNpemUpCi0JcGhkcl9pbl9zZWdtZW50ID0gZmFsc2U7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIGhkcnBwID0gc2VjdGlvbnM7IGkgPCBjb3VudDsgaSsrLCBoZHJwcCsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpoZHI7Ci0gICAgICBib29sZWFuIG5ld19zZWdtZW50OwotCi0gICAgICBoZHIgPSAqaGRycHA7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIHNlY3Rpb24gYW5kIHRoZSBsYXN0IG9uZSB3aWxsIGZpdCBpbiB0aGUgc2FtZQotICAgICAgICAgc2VnbWVudC4gICovCi0KLSAgICAgIGlmIChsYXN0X2hkciA9PSBOVUxMKQotCXsKLQkgIC8qIElmIHdlIGRvbid0IGhhdmUgYSBzZWdtZW50IHlldCwgdGhlbiB3ZSBkb24ndCBuZWVkIGEgbmV3Ci0JICAgICBvbmUgKHdlIGJ1aWxkIHRoZSBsYXN0IG9uZSBhZnRlciB0aGlzIGxvb3ApLiAgKi8KLQkgIG5ld19zZWdtZW50ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZSBpZiAobGFzdF9oZHItPmxtYSAtIGxhc3RfaGRyLT52bWEgIT0gaGRyLT5sbWEgLSBoZHItPnZtYSkKLQl7Ci0JICAvKiBJZiB0aGlzIHNlY3Rpb24gaGFzIGEgZGlmZmVyZW50IHJlbGF0aW9uIGJldHdlZW4gdGhlCi0gICAgICAgICAgICAgdmlydHVhbCBhZGRyZXNzIGFuZCB0aGUgbG9hZCBhZGRyZXNzLCB0aGVuIHdlIG5lZWQgYSBuZXcKLSAgICAgICAgICAgICBzZWdtZW50LiAgKi8KLQkgIG5ld19zZWdtZW50ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChCRkRfQUxJR04gKGxhc3RfaGRyLT5sbWEgKyBsYXN0X2hkci0+X3Jhd19zaXplLCBtYXhwYWdlc2l6ZSkKLQkgICAgICAgPCBCRkRfQUxJR04gKGhkci0+bG1hLCBtYXhwYWdlc2l6ZSkpCi0JewotCSAgLyogSWYgcHV0dGluZyB0aGlzIHNlY3Rpb24gaW4gdGhpcyBzZWdtZW50IHdvdWxkIGZvcmNlIHVzIHRvCi0gICAgICAgICAgICAgc2tpcCBhIHBhZ2UgaW4gdGhlIHNlZ21lbnQsIHRoZW4gd2UgbmVlZCBhIG5ldyBzZWdtZW50LiAgKi8KLQkgIG5ld19zZWdtZW50ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlIGlmICgobGFzdF9oZHItPmZsYWdzICYgU0VDX0xPQUQpID09IDAKLQkgICAgICAgJiYgKGhkci0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQl7Ci0JICAvKiBXZSBkb24ndCB3YW50IHRvIHB1dCBhIGxvYWRhYmxlIHNlY3Rpb24gYWZ0ZXIgYQotICAgICAgICAgICAgIG5vbmxvYWRhYmxlIHNlY3Rpb24gaW4gdGhlIHNhbWUgc2VnbWVudC4gICovCi0JICBuZXdfc2VnbWVudCA9IHRydWU7Ci0JfQotICAgICAgZWxzZSBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgPT0gMCkKLQl7Ci0JICAvKiBJZiB0aGUgZmlsZSBpcyBub3QgZGVtYW5kIHBhZ2VkLCB3aGljaCBtZWFucyB0aGF0IHdlCi0gICAgICAgICAgICAgZG9uJ3QgcmVxdWlyZSB0aGUgc2VjdGlvbnMgdG8gYmUgY29ycmVjdGx5IGFsaWduZWQgaW4gdGhlCi0gICAgICAgICAgICAgZmlsZSwgdGhlbiB0aGVyZSBpcyBubyBvdGhlciByZWFzb24gZm9yIGEgbmV3IHNlZ21lbnQuICAqLwotCSAgbmV3X3NlZ21lbnQgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlIGlmICghIHdyaXRhYmxlCi0JICAgICAgICYmIChoZHItPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwCi0JICAgICAgICYmIChCRkRfQUxJR04gKGxhc3RfaGRyLT5sbWEgKyBsYXN0X2hkci0+X3Jhd19zaXplLCBtYXhwYWdlc2l6ZSkKLQkJICAgPT0gaGRyLT5sbWEpKQotCXsKLQkgIC8qIFdlIGRvbid0IHdhbnQgdG8gcHV0IGEgd3JpdGFibGUgc2VjdGlvbiBpbiBhIHJlYWQgb25seQotICAgICAgICAgICAgIHNlZ21lbnQsIHVubGVzcyB0aGV5IGFyZSBvbiB0aGUgc2FtZSBwYWdlIGluIG1lbW9yeQotICAgICAgICAgICAgIGFueWhvdy4gIFdlIGFscmVhZHkga25vdyB0aGF0IHRoZSBsYXN0IHNlY3Rpb24gZG9lcyBub3QKLSAgICAgICAgICAgICBicmluZyB1cyBwYXN0IHRoZSBjdXJyZW50IHNlY3Rpb24gb24gdGhlIHBhZ2UsIHNvIHRoZQotICAgICAgICAgICAgIG9ubHkgY2FzZSBpbiB3aGljaCB0aGUgbmV3IHNlY3Rpb24gaXMgbm90IG9uIHRoZSBzYW1lCi0gICAgICAgICAgICAgcGFnZSBhcyB0aGUgcHJldmlvdXMgc2VjdGlvbiBpcyB3aGVuIHRoZSBwcmV2aW91cyBzZWN0aW9uCi0gICAgICAgICAgICAgZW5kcyBwcmVjaXNlbHkgb24gYSBwYWdlIGJvdW5kYXJ5LiAgKi8KLQkgIG5ld19zZWdtZW50ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogT3RoZXJ3aXNlLCB3ZSBjYW4gdXNlIHRoZSBzYW1lIHNlZ21lbnQuICAqLwotCSAgbmV3X3NlZ21lbnQgPSBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIG5ld19zZWdtZW50KQotCXsKLQkgIGlmICgoaGRyLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLQkgICAgd3JpdGFibGUgPSB0cnVlOwotCSAgbGFzdF9oZHIgPSBoZHI7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIG5lZWQgYSBuZXcgcHJvZ3JhbSBzZWdtZW50LiAgV2UgbXVzdCBjcmVhdGUgYSBuZXcgcHJvZ3JhbQotICAgICAgICAgaGVhZGVyIGhvbGRpbmcgYWxsIHRoZSBzZWN0aW9ucyBmcm9tIHBoZHJfaW5kZXggdW50aWwgaGRyLiAgKi8KLQotICAgICAgbSA9IG1ha2VfbWFwcGluZyAoYWJmZCwgc2VjdGlvbnMsIHBoZHJfaW5kZXgsIGksIHBoZHJfaW5fc2VnbWVudCk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAqcG0gPSBtOwotICAgICAgcG0gPSAmbS0+bmV4dDsKLQotICAgICAgaWYgKChoZHItPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQotCXdyaXRhYmxlID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQl3cml0YWJsZSA9IGZhbHNlOwotCi0gICAgICBsYXN0X2hkciA9IGhkcjsKLSAgICAgIHBoZHJfaW5kZXggPSBpOwotICAgICAgcGhkcl9pbl9zZWdtZW50ID0gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhIGZpbmFsIFBUX0xPQUQgcHJvZ3JhbSBzZWdtZW50LiAgKi8KLSAgaWYgKGxhc3RfaGRyICE9IE5VTEwpCi0gICAgewotICAgICAgbSA9IG1ha2VfbWFwcGluZyAoYWJmZCwgc2VjdGlvbnMsIHBoZHJfaW5kZXgsIGksIHBoZHJfaW5fc2VnbWVudCk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAqcG0gPSBtOwotICAgICAgcG0gPSAmbS0+bmV4dDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSAuZHluYW1pYyBzZWN0aW9uLCB0aHJvdyBpbiBhIFBUX0RZTkFNSUMgc2VnbWVudC4gICovCi0gIGlmIChkeW5zZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKSkpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIG0tPm5leHQgPSBOVUxMOwotICAgICAgbS0+cF90eXBlID0gUFRfRFlOQU1JQzsKLSAgICAgIG0tPmNvdW50ID0gMTsKLSAgICAgIG0tPnNlY3Rpb25zWzBdID0gZHluc2VjOwotCi0gICAgICAqcG0gPSBtOwotICAgICAgcG0gPSAmbS0+bmV4dDsKLSAgICB9Ci0KLSAgLyogRm9yIGVhY2ggbG9hZGFibGUgLm5vdGUgc2VjdGlvbiwgYWRkIGEgUFRfTk9URSBzZWdtZW50LiAgV2UgZG9uJ3QKLSAgICAgdXNlIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lLCBiZWNhdXNlIGlmIHdlIGxpbmsgdG9nZXRoZXIKLSAgICAgbm9ubG9hZGFibGUgLm5vdGUgc2VjdGlvbnMgYW5kIGxvYWRhYmxlIC5ub3RlIHNlY3Rpb25zLCB3ZSB3aWxsCi0gICAgIGdlbmVyYXRlIHR3byAubm90ZSBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IGZpbGUuICBGSVhNRTogVXNpbmcKLSAgICAgbmFtZXMgZm9yIHNlY3Rpb24gdHlwZXMgaXMgYm9ndXMgYW55aG93LiAgKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwCi0JICAmJiBzdHJuY21wIChzLT5uYW1lLCAiLm5vdGUiLCA1KSA9PSAwKQotCXsKLQkgIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLQkgICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKSkpOwotCSAgaWYgKG0gPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBtLT5uZXh0ID0gTlVMTDsKLQkgIG0tPnBfdHlwZSA9IFBUX05PVEU7Ci0JICBtLT5jb3VudCA9IDE7Ci0JICBtLT5zZWN0aW9uc1swXSA9IHM7Ci0KLQkgICpwbSA9IG07Ci0JICBwbSA9ICZtLT5uZXh0OwotCX0KLSAgICB9Ci0KLSAgZnJlZSAoc2VjdGlvbnMpOwotICBzZWN0aW9ucyA9IE5VTEw7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXAgPSBtZmlyc3Q7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU29ydCBzZWN0aW9ucyBieSBhZGRyZXNzLiAgKi8KLQotc3RhdGljIGludAotZWxmX3NvcnRfc2VjdGlvbnMgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLXsKLSAgY29uc3QgYXNlY3Rpb24gKnNlYzEgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcxOwotICBjb25zdCBhc2VjdGlvbiAqc2VjMiA9ICooY29uc3QgYXNlY3Rpb24gKiopIGFyZzI7Ci0KLSAgLyogU29ydCBieSBMTUEgZmlyc3QsIHNpbmNlIHRoaXMgaXMgdGhlIGFkZHJlc3MgdXNlZCB0bwotICAgICBwbGFjZSB0aGUgc2VjdGlvbiBpbnRvIGEgc2VnbWVudC4gICovCi0gIGlmIChzZWMxLT5sbWEgPCBzZWMyLT5sbWEpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmIChzZWMxLT5sbWEgPiBzZWMyLT5sbWEpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogVGhlbiBzb3J0IGJ5IFZNQS4gIE5vcm1hbGx5IHRoZSBMTUEgYW5kIHRoZSBWTUEgd2lsbCBiZQotICAgICB0aGUgc2FtZSwgYW5kIHRoaXMgd2lsbCBkbyBub3RoaW5nLiAgKi8KLSAgaWYgKHNlYzEtPnZtYSA8IHNlYzItPnZtYSkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKHNlYzEtPnZtYSA+IHNlYzItPnZtYSkKLSAgICByZXR1cm4gMTsKLQotICAvKiBQdXQgIVNFQ19MT0FEIHNlY3Rpb25zIGFmdGVyIFNFQ19MT0FEIG9uZXMuICAqLwotCi0jZGVmaW5lIFRPRU5EKHgpICgoKHgpLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKQotCi0gIGlmIChUT0VORCAoc2VjMSkpCi0gICAgewotICAgICAgaWYgKFRPRU5EIChzZWMyKSkKLQlyZXR1cm4gc2VjMS0+dGFyZ2V0X2luZGV4IC0gc2VjMi0+dGFyZ2V0X2luZGV4OwotICAgICAgZWxzZQotCXJldHVybiAxOwotICAgIH0KLQotICBpZiAoVE9FTkQgKHNlYzIpKQotICAgIHJldHVybiAtMTsKLQotI3VuZGVmIFRPRU5ECi0KLSAgLyogU29ydCBieSBzaXplLCB0byBwdXQgemVybyBzaXplZCBzZWN0aW9ucyBiZWZvcmUgb3RoZXJzIGF0IHRoZQotICAgICBzYW1lIGFkZHJlc3MuICAqLwotCi0gIGlmIChzZWMxLT5fcmF3X3NpemUgPCBzZWMyLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoc2VjMS0+X3Jhd19zaXplID4gc2VjMi0+X3Jhd19zaXplKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiBzZWMxLT50YXJnZXRfaW5kZXggLSBzZWMyLT50YXJnZXRfaW5kZXg7Ci19Ci0KLS8qIEFzc2lnbiBmaWxlIHBvc2l0aW9ucyB0byB0aGUgc2VjdGlvbnMgYmFzZWQgb24gdGhlIG1hcHBpbmcgZnJvbQotICAgc2VjdGlvbnMgdG8gc2VnbWVudHMuICBUaGlzIGZ1bmN0aW9uIGFsc28gc2V0cyB1cCBzb21lIGZpZWxkcyBpbgotICAgdGhlIGZpbGUgaGVhZGVyLCBhbmQgd3JpdGVzIG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3Qgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptOwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICpwaGRyczsKLSAgZmlsZV9wdHIgb2ZmLCB2b2ZmOwotICBiZmRfdm1hIGZpbGVoZHJfdmFkZHIsIGZpbGVoZHJfcGFkZHI7Ci0gIGJmZF92bWEgcGhkcnNfdmFkZHIsIHBoZHJzX3BhZGRyOwotICBFbGZfSW50ZXJuYWxfUGhkciAqcDsKLQotICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXAgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwKQotICAgIHsKLSAgICAgIGlmICghICgqYmVkLT5lbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXApIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGNvdW50ID0gMDsKLSAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0gICAgKytjb3VudDsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG9mZiA9IGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BoZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtID0gY291bnQ7Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgd2UgYWxyZWFkeSBjb3VudGVkIHRoZSBudW1iZXIgb2YgcHJvZ3JhbSBzZWdtZW50cywgbWFrZSBzdXJlCi0gICAgIHRoYXQgd2UgYWxsb2NhdGVkIGVub3VnaCBzcGFjZS4gIFRoaXMgaGFwcGVucyB3aGVuIFNJWkVPRl9IRUFERVJTCi0gICAgIGlzIHVzZWQgaW4gYSBsaW5rZXIgc2NyaXB0LiAgKi8KLSAgYWxsb2MgPSBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplIC8gYmVkLT5zLT5zaXplb2ZfcGhkcjsKLSAgaWYgKGFsbG9jICE9IDAgJiYgY291bnQgPiBhbGxvYykKLSAgICB7Ci0gICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgKF8oIiVzOiBOb3QgZW5vdWdoIHJvb20gZm9yIHByb2dyYW0gaGVhZGVycyAoYWxsb2NhdGVkICV1LCBuZWVkICV1KSIpLAotCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBhbGxvYywgY291bnQpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYWxsb2MgPT0gMCkKLSAgICBhbGxvYyA9IGNvdW50OwotCi0gIHBoZHJzID0gKChFbGZfSW50ZXJuYWxfUGhkciAqKQotCSAgIGJmZF9hbGxvYyAoYWJmZCwgYWxsb2MgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSkpOwotICBpZiAocGhkcnMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgb2ZmID0gYmVkLT5zLT5zaXplb2ZfZWhkcjsKLSAgb2ZmICs9IGFsbG9jICogYmVkLT5zLT5zaXplb2ZfcGhkcjsKLQotICBmaWxlaGRyX3ZhZGRyID0gMDsKLSAgZmlsZWhkcl9wYWRkciA9IDA7Ci0gIHBoZHJzX3ZhZGRyID0gMDsKLSAgcGhkcnNfcGFkZHIgPSAwOwotCi0gIGZvciAobSA9IGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwLCBwID0gcGhkcnM7Ci0gICAgICAgbSAhPSBOVUxMOwotICAgICAgIG0gPSBtLT5uZXh0LCBwKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3BwOwotCi0gICAgICAvKiBJZiBlbGZfc2VnbWVudF9tYXAgaXMgbm90IGZyb20gbWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzLCB0aGUKLSAgICAgICAgIHNlY3Rpb25zIG1heSBub3QgYmUgY29ycmVjdGx5IG9yZGVyZWQuICAqLwotICAgICAgaWYgKG0tPmNvdW50ID4gMCkKLQlxc29ydCAobS0+c2VjdGlvbnMsIChzaXplX3QpIG0tPmNvdW50LCBzaXplb2YgKGFzZWN0aW9uICopLAotCSAgICAgICBlbGZfc29ydF9zZWN0aW9ucyk7Ci0KLSAgICAgIHAtPnBfdHlwZSA9IG0tPnBfdHlwZTsKLSAgICAgIHAtPnBfZmxhZ3MgPSBtLT5wX2ZsYWdzOwotCi0gICAgICBpZiAocC0+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+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX01OMTAyMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX21uMTAzMDA6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfTU4xMDMwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfcGo6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9QSjsKLSAgICAgIGJyZWFrOwotICAgICAgLyogYWxzbyBub3RlIHRoYXQgRU1fTTMyLCBBVCZUIFdFMzIxMDAgaXMgdW5rbm93biB0byBiZmQgKi8KLSAgICBkZWZhdWx0OgotICAgICAgaV9laGRycC0+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+c2hfYWRkcmFsaWduID0gMTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBob2xkIHRoZSBzeW10YWIgdmVjdG9yLgotCi0gICBOb3RlIHRoYXQgd2UgYmFzZSBpdCBvbiB0aGUgY291bnQgcGx1cyAxLCBzaW5jZSB3ZSB3aWxsIG51bGwgdGVybWluYXRlCi0gICB0aGUgdmVjdG9yIGFsbG9jYXRlZCBiYXNlZCBvbiB0aGlzIHNpemUuICBIb3dldmVyLCB0aGUgRUxGIHN5bWJvbCB0YWJsZQotICAgYWx3YXlzIGhhcyBhIGR1bW15IGVudHJ5IGFzIHN5bWJvbCAjMCwgc28gaXQgZW5kcyB1cCBldmVuLiAgKi8KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHN5bWNvdW50OwotICBsb25nIHN5bXRhYl9zaXplOwotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9zeW07Ci0gIHN5bXRhYl9zaXplID0gKHN5bWNvdW50IC0gMSArIDEpICogKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0KLSAgcmV0dXJuIHN5bXRhYl9zaXplOwotfQotCi1sb25nCi1fYmZkX2VsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBzeW1jb3VudDsKLSAgbG9uZyBzeW10YWJfc2l6ZTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zeW10YWJfaGRyOwotCi0gIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gaGRyLT5zaF9zaXplIC8gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2Zfc3ltOwotICBzeW10YWJfc2l6ZSA9IChzeW1jb3VudCAtIDEgKyAxKSAqIChzaXplb2YgKGFzeW1ib2wgKikpOwotCi0gIHJldHVybiBzeW10YWJfc2l6ZTsKLX0KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIENhbm9uaWNhbGl6ZSB0aGUgcmVsb2NzLiAgKi8KLQotbG9uZwotX2JmZF9lbGZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpZiAoISBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3JlbG9jX3RhYmxlIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24sCi0JCQkJCQkJICAgc3ltYm9scywKLQkJCQkJCQkgICBmYWxzZSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIGZvciAoaSA9IDA7IGkgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgaSsrKQotICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotCi0gICpyZWxwdHIgPSBOVUxMOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIGxvbmcgc3ltY291bnQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3N5bWJvbF90YWJsZQotICAgIChhYmZkLCBhbG9jYXRpb24sIGZhbHNlKTsKLQotICBpZiAoc3ltY291bnQgPj0gMCkKLSAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IHN5bWNvdW50OwotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0KLWxvbmcKLV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIHJldHVybiBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3N5bWJvbF90YWJsZQotICAgIChhYmZkLCBhbG9jYXRpb24sIHRydWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIHNpemUgcmVxdWlyZWQgZm9yIHRoZSBkeW5hbWljIHJlbG9jIGVudHJpZXMuICBBbnkKLSAgIHNlY3Rpb24gdGhhdCB3YXMgYWN0dWFsbHkgaW5zdGFsbGVkIGluIHRoZSBCRkQsIGFuZCBoYXMgdHlwZQotICAgU0hUX1JFTCBvciBTSFRfUkVMQSwgYW5kIHVzZXMgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBpcwotICAgY29uc2lkZXJlZCB0byBiZSBhIGR5bmFtaWMgcmVsb2Mgc2VjdGlvbi4gICovCi0KLWxvbmcKLV9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgcmV0OwotICBhc2VjdGlvbiAqczsKLQotICBpZiAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXQgPSBzaXplb2YgKGFyZWxlbnQgKik7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfbGluayA9PSBlbGZfZHluc3ltdGFiIChhYmZkKQotCSYmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMCi0JICAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUxBKSkKLSAgICAgIHJldCArPSAoKHMtPl9yYXdfc2l6ZSAvIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplKQotCSAgICAgICogc2l6ZW9mIChhcmVsZW50ICopKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBDYW5vbmljYWxpemUgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgTm90ZSB0aGF0IHdlIHJldHVybgotICAgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMgYXMgYSBzaW5nbGUgYmxvY2ssIGFsdGhvdWdoIHRoZXkgYXJlCi0gICBhY3R1YWxseSBhc3NvY2lhdGVkIHdpdGggcGFydGljdWxhciBzZWN0aW9uczsgdGhlIGludGVyZmFjZSwgd2hpY2gKLSAgIHdhcyBkZXNpZ25lZCBmb3IgU3VuT1Mgc3R5bGUgc2hhcmVkIGxpYnJhcmllcywgZXhwZWN0cyB0aGF0IHRoZXJlCi0gICBpcyBvbmx5IG9uZSBzZXQgb2YgZHluYW1pYyByZWxvY3MuICBBbnkgc2VjdGlvbiB0aGF0IHdhcyBhY3R1YWxseQotICAgaW5zdGFsbGVkIGluIHRoZSBCRkQsIGFuZCBoYXMgdHlwZSBTSFRfUkVMIG9yIFNIVF9SRUxBLCBhbmQgdXNlcwotICAgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgZHluYW1pYyByZWxvYwotICAgc2VjdGlvbi4gICovCi0KLWxvbmcKLV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBzdG9yYWdlLCBzeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKipzdG9yYWdlOwotICAgICBhc3ltYm9sICoqc3ltczsKLXsKLSAgYm9vbGVhbiAoKnNsdXJwX3JlbG9jcykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLSAgYXNlY3Rpb24gKnM7Ci0gIGxvbmcgcmV0OwotCi0gIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHNsdXJwX3JlbG9jcyA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2x1cnBfcmVsb2NfdGFibGU7Ci0gIHJldCA9IDA7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfbGluayA9PSBlbGZfZHluc3ltdGFiIChhYmZkKQotCSAgJiYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUwKLQkgICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMQSkpCi0JewotCSAgYXJlbGVudCAqcDsKLQkgIGxvbmcgY291bnQsIGk7Ci0KLQkgIGlmICghICgqc2x1cnBfcmVsb2NzKSAoYWJmZCwgcywgc3ltcywgdHJ1ZSkpCi0JICAgIHJldHVybiAtMTsKLQkgIGNvdW50ID0gcy0+X3Jhd19zaXplIC8gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2VudHNpemU7Ci0JICBwID0gcy0+cmVsb2NhdGlvbjsKLQkgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCSAgICAqc3RvcmFnZSsrID0gcCsrOwotCSAgcmV0ICs9IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgKnN0b3JhZ2UgPSBOVUxMOwotCi0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBSZWFkIGluIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLQotICBpZiAoZWxmX2R5bnZlcmRlZiAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICAgRWxmX0V4dGVybmFsX1ZlcmRlZiAqZXZlcmRlZjsKLSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKml2ZXJkZWY7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcmRlZl9oZHI7Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZiA9Ci0JKChFbGZfSW50ZXJuYWxfVmVyZGVmICopCi0JIGJmZF96YWxsb2MgKGFiZmQsIGhkci0+c2hfaW5mbyAqIHNpemVvZiAoRWxmX0ludGVybmFsX1ZlcmRlZikpKTsKLSAgICAgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnMgPSBoZHItPnNoX2luZm87Ci0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGhkci0+c2hfc2l6ZSk7Ci0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfcmVhZCAoKFBUUikgY29udGVudHMsIDEsIGhkci0+c2hfc2l6ZSwgYWJmZCkgIT0gaGRyLT5zaF9zaXplKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBldmVyZGVmID0gKEVsZl9FeHRlcm5hbF9WZXJkZWYgKikgY29udGVudHM7Ci0gICAgICBpdmVyZGVmID0gZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmOwotICAgICAgZm9yIChpID0gMDsgaSA8IGhkci0+c2hfaW5mbzsgaSsrLCBpdmVyZGVmKyspCi0JewotCSAgRWxmX0V4dGVybmFsX1ZlcmRhdXggKmV2ZXJkYXV4OwotCSAgRWxmX0ludGVybmFsX1ZlcmRhdXggKml2ZXJkYXV4OwotCSAgdW5zaWduZWQgaW50IGo7Ci0KLQkgIF9iZmRfZWxmX3N3YXBfdmVyZGVmX2luIChhYmZkLCBldmVyZGVmLCBpdmVyZGVmKTsKLQotCSAgaXZlcmRlZi0+dmRfYmZkID0gYWJmZDsKLQotCSAgaXZlcmRlZi0+dmRfYXV4cHRyID0gKChFbGZfSW50ZXJuYWxfVmVyZGF1eCAqKQotCQkJCWJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgKGl2ZXJkZWYtPnZkX2NudAotCQkJCQkgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9WZXJkYXV4KSkpKTsKLQkgIGlmIChpdmVyZGVmLT52ZF9hdXhwdHIgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGV2ZXJkYXV4ID0gKChFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKQotCQkgICAgICAoKGJmZF9ieXRlICopIGV2ZXJkZWYgKyBpdmVyZGVmLT52ZF9hdXgpKTsKLQkgIGl2ZXJkYXV4ID0gaXZlcmRlZi0+dmRfYXV4cHRyOwotCSAgZm9yIChqID0gMDsgaiA8IGl2ZXJkZWYtPnZkX2NudDsgaisrLCBpdmVyZGF1eCsrKQotCSAgICB7Ci0JICAgICAgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X2luIChhYmZkLCBldmVyZGF1eCwgaXZlcmRhdXgpOwotCi0JICAgICAgaXZlcmRhdXgtPnZkYV9ub2RlbmFtZSA9Ci0JCWJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGhkci0+c2hfbGluaywKLQkJCQkJCSBpdmVyZGF1eC0+dmRhX25hbWUpOwotCSAgICAgIGlmIChpdmVyZGF1eC0+dmRhX25vZGVuYW1lID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgaWYgKGogKyAxIDwgaXZlcmRlZi0+dmRfY250KQotCQlpdmVyZGF1eC0+dmRhX25leHRwdHIgPSBpdmVyZGF1eCArIDE7Ci0JICAgICAgZWxzZQotCQlpdmVyZGF1eC0+dmRhX25leHRwdHIgPSBOVUxMOwotCi0JICAgICAgZXZlcmRhdXggPSAoKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopCi0JCQkgICgoYmZkX2J5dGUgKikgZXZlcmRhdXggKyBpdmVyZGF1eC0+dmRhX25leHQpKTsKLQkgICAgfQotCi0JICBpdmVyZGVmLT52ZF9ub2RlbmFtZSA9IGl2ZXJkZWYtPnZkX2F1eHB0ci0+dmRhX25vZGVuYW1lOwotCi0JICBpZiAoaSArIDEgPCBoZHItPnNoX2luZm8pCi0JICAgIGl2ZXJkZWYtPnZkX25leHRkZWYgPSBpdmVyZGVmICsgMTsKLQkgIGVsc2UKLQkgICAgaXZlcmRlZi0+dmRfbmV4dGRlZiA9IE5VTEw7Ci0KLQkgIGV2ZXJkZWYgPSAoKEVsZl9FeHRlcm5hbF9WZXJkZWYgKikKLQkJICAgICAoKGJmZF9ieXRlICopIGV2ZXJkZWYgKyBpdmVyZGVmLT52ZF9uZXh0KSk7Ci0JfQotCi0gICAgICBmcmVlIChjb250ZW50cyk7Ci0gICAgICBjb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChlbGZfZHludmVycmVmIChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqZXZlcm5lZWQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqaXZlcm5lZWQ7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnJlZl9oZHI7Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZiA9Ci0JKChFbGZfSW50ZXJuYWxfVmVybmVlZCAqKQotCSBiZmRfemFsbG9jIChhYmZkLCBoZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9WZXJuZWVkKSkpOwotICAgICAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZiA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5jdmVycmVmcyA9IGhkci0+c2hfaW5mbzsKLQotICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaGRyLT5zaF9zaXplKTsKLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF9yZWFkICgoUFRSKSBjb250ZW50cywgMSwgaGRyLT5zaF9zaXplLCBhYmZkKSAhPSBoZHItPnNoX3NpemUpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGV2ZXJuZWVkID0gKEVsZl9FeHRlcm5hbF9WZXJuZWVkICopIGNvbnRlbnRzOwotICAgICAgaXZlcm5lZWQgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWY7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaGRyLT5zaF9pbmZvOyBpKyssIGl2ZXJuZWVkKyspCi0JewotCSAgRWxmX0V4dGVybmFsX1Zlcm5hdXggKmV2ZXJuYXV4OwotCSAgRWxmX0ludGVybmFsX1Zlcm5hdXggKml2ZXJuYXV4OwotCSAgdW5zaWduZWQgaW50IGo7Ci0KLQkgIF9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbiAoYWJmZCwgZXZlcm5lZWQsIGl2ZXJuZWVkKTsKLQotCSAgaXZlcm5lZWQtPnZuX2JmZCA9IGFiZmQ7Ci0KLQkgIGl2ZXJuZWVkLT52bl9maWxlbmFtZSA9Ci0JICAgIGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGhkci0+c2hfbGluaywKLQkJCQkJICAgICBpdmVybmVlZC0+dm5fZmlsZSk7Ci0JICBpZiAoaXZlcm5lZWQtPnZuX2ZpbGVuYW1lID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpdmVybmVlZC0+dm5fYXV4cHRyID0KLQkgICAgKChFbGZfSW50ZXJuYWxfVmVybmF1eCAqKQotCSAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJaXZlcm5lZWQtPnZuX2NudCAqIHNpemVvZiAoRWxmX0ludGVybmFsX1Zlcm5hdXgpKSk7Ci0KLQkgIGV2ZXJuYXV4ID0gKChFbGZfRXh0ZXJuYWxfVmVybmF1eCAqKQotCQkgICAgICAoKGJmZF9ieXRlICopIGV2ZXJuZWVkICsgaXZlcm5lZWQtPnZuX2F1eCkpOwotCSAgaXZlcm5hdXggPSBpdmVybmVlZC0+dm5fYXV4cHRyOwotCSAgZm9yIChqID0gMDsgaiA8IGl2ZXJuZWVkLT52bl9jbnQ7IGorKywgaXZlcm5hdXgrKykKLQkgICAgewotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVybmF1eF9pbiAoYWJmZCwgZXZlcm5hdXgsIGl2ZXJuYXV4KTsKLQotCSAgICAgIGl2ZXJuYXV4LT52bmFfbm9kZW5hbWUgPQotCQliZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBoZHItPnNoX2xpbmssCi0JCQkJCQkgaXZlcm5hdXgtPnZuYV9uYW1lKTsKLQkgICAgICBpZiAoaXZlcm5hdXgtPnZuYV9ub2RlbmFtZSA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIGlmIChqICsgMSA8IGl2ZXJuZWVkLT52bl9jbnQpCi0JCWl2ZXJuYXV4LT52bmFfbmV4dHB0ciA9IGl2ZXJuYXV4ICsgMTsKLQkgICAgICBlbHNlCi0JCWl2ZXJuYXV4LT52bmFfbmV4dHB0ciA9IE5VTEw7Ci0KLQkgICAgICBldmVybmF1eCA9ICgoRWxmX0V4dGVybmFsX1Zlcm5hdXggKikKLQkJCSAgKChiZmRfYnl0ZSAqKSBldmVybmF1eCArIGl2ZXJuYXV4LT52bmFfbmV4dCkpOwotCSAgICB9Ci0KLQkgIGlmIChpICsgMSA8IGhkci0+c2hfaW5mbykKLQkgICAgaXZlcm5lZWQtPnZuX25leHRyZWYgPSBpdmVybmVlZCArIDE7Ci0JICBlbHNlCi0JICAgIGl2ZXJuZWVkLT52bl9uZXh0cmVmID0gTlVMTDsKLQotCSAgZXZlcm5lZWQgPSAoKEVsZl9FeHRlcm5hbF9WZXJuZWVkICopCi0JCSAgICAgICgoYmZkX2J5dGUgKikgZXZlcm5lZWQgKyBpdmVybmVlZC0+dm5fbmV4dCkpOwotCX0KLQotICAgICAgZnJlZSAoY29udGVudHMpOwotICAgICAgY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0gICAgZnJlZSAoY29udGVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi1hc3ltYm9sICoKLV9iZmRfZWxmX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGVsZl9zeW1ib2xfdHlwZSAqbmV3c3ltOwotCi0gIG5ld3N5bSA9IChlbGZfc3ltYm9sX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChlbGZfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKCFuZXdzeW0pCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXdzeW0tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgICAgIHJldHVybiAmbmV3c3ltLT5zeW1ib2w7Ci0gICAgfQotfQotCi12b2lkCi1fYmZkX2VsZl9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBuYW1lIGltcGxpZXMgYSBsb2NhbCBzeW1ib2wuICBNb3N0IHRhcmdldHMKLSAgIHVzZSB0aGlzIGZ1bmN0aW9uIGZvciB0aGUgaXNfbG9jYWxfbGFiZWxfbmFtZSBlbnRyeSBwb2ludCwgYnV0IHNvbWUKLSAgIG92ZXJyaWRlIGl0LiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIE5vcm1hbCBsb2NhbCBzeW1ib2xzIHN0YXJ0IHdpdGggYGAuTCcnLiAgKi8KLSAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ0wnKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEF0IGxlYXN0IHNvbWUgU1ZSNCBjb21waWxlcnMgKGUuZy4sIFVuaXhXYXJlIDIuMSBjYykgZ2VuZXJhdGUKLSAgICAgRFdBUkYgZGVidWdnaW5nIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCBgYC4uJycuICAqLwotICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnLicpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogZ2NjIHdpbGwgc29tZXRpbWVzIGdlbmVyYXRlIHN5bWJvbHMgYmVnaW5uaW5nIHdpdGggYGBfLkxfJycgd2hlbgotICAgICBlbWl0dGluZyBEV0FSRiBkZWJ1Z2dpbmcgb3V0cHV0LiAgSSBzdXNwZWN0IHRoaXMgaXMgYWN0dWFsbHkgYQotICAgICBzbWFsbCBidWcgaW4gZ2NjIChpdCBjYWxscyBBU01fT1VUUFVUX0xBQkVMIHdoZW4gaXQgc2hvdWxkIGNhbGwKLSAgICAgQVNNX0dFTkVSQVRFX0lOVEVSTkFMX0xBQkVMLCBhbmQgdGhpcyBjYXVzZXMgdGhlIGxlYWRpbmcKLSAgICAgdW5kZXJzY29yZSB0byBiZSBlbWl0dGVkIG9uIHNvbWUgRUxGIHRhcmdldHMpLiAgRm9yIGVhc2Ugb2YgdXNlLAotICAgICB3ZSB0cmVhdCBzdWNoIHN5bWJvbHMgYXMgbG9jYWwuICAqLwotICBpZiAobmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAnTCcgJiYgbmFtZVszXSA9PSAnXycpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1hbGVudCAqCi1fYmZkX2VsZl9nZXRfbGluZW5vIChpZ25vcmVfYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZWxmX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgLyogSWYgdGhpcyBpc24ndCB0aGUgcmlnaHQgYXJjaGl0ZWN0dXJlIGZvciB0aGlzIGJhY2tlbmQsIGFuZCB0aGlzCi0gICAgIGlzbid0IHRoZSBnZW5lcmljIGJhY2tlbmQsIGZhaWwuICAqLwotICBpZiAoYXJjaCAhPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmFyY2gKLSAgICAgICYmIGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bgotICAgICAgJiYgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5hcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLX0KLQotLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHRvIGEgcGFydGljdWxhciBzZWN0aW9uIGFuZCBvZmZzZXQsIGZvciBlcnJvcgotICAgcmVwb3J0aW5nLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsCi0JCQkgICAgc2VjdGlvbiwKLQkJCSAgICBzeW1ib2xzLAotCQkJICAgIG9mZnNldCwKLQkJCSAgICBmaWxlbmFtZV9wdHIsCi0JCQkgICAgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCSAgICBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgYm9vbGVhbiBmb3VuZDsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGFzeW1ib2wgKmZ1bmM7Ci0gIGJmZF92bWEgbG93X2Z1bmM7Ci0gIGFzeW1ib2wgKipwOwotCi0gIGlmIChfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCAKLQkJCQkgICAgIGxpbmVfcHRyKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgICAgIGxpbmVfcHRyLCAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoISBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc3ltYm9scywgc2VjdGlvbiwgb2Zmc2V0LAotCQkJCQkgICAgICZmb3VuZCwgZmlsZW5hbWVfcHRyLAotCQkJCQkgICAgIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyLAotCQkJCQkgICAgICZlbGZfdGRhdGEgKGFiZmQpLT5saW5lX2luZm8pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGZvdW5kKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChzeW1ib2xzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGVuYW1lID0gTlVMTDsKLSAgZnVuYyA9IE5VTEw7Ci0gIGxvd19mdW5jID0gMDsKLQotICBmb3IgKHAgPSBzeW1ib2xzOyAqcCAhPSBOVUxMOyBwKyspCi0gICAgewotICAgICAgZWxmX3N5bWJvbF90eXBlICpxOwotCi0gICAgICBxID0gKGVsZl9zeW1ib2xfdHlwZSAqKSAqcDsKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoJnEtPnN5bWJvbCkgIT0gc2VjdGlvbikKLQljb250aW51ZTsKLQotICAgICAgc3dpdGNoIChFTEZfU1RfVFlQRSAocS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCWNhc2UgU1RUX0ZJTEU6Ci0JICBmaWxlbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCZxLT5zeW1ib2wpOwotCSAgYnJlYWs7Ci0JY2FzZSBTVFRfTk9UWVBFOgotCWNhc2UgU1RUX0ZVTkM6Ci0JICBpZiAocS0+c3ltYm9sLnNlY3Rpb24gPT0gc2VjdGlvbgotCSAgICAgICYmIHEtPnN5bWJvbC52YWx1ZSA+PSBsb3dfZnVuYwotCSAgICAgICYmIHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQpCi0JICAgIHsKLQkgICAgICBmdW5jID0gKGFzeW1ib2wgKikgcTsKLQkgICAgICBsb3dfZnVuYyA9IHEtPnN5bWJvbC52YWx1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZnVuYyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqZmlsZW5hbWVfcHRyID0gZmlsZW5hbWU7Ci0gICpmdW5jdGlvbm5hbWVfcHRyID0gYmZkX2FzeW1ib2xfbmFtZSAoZnVuYyk7Ci0gICpsaW5lX3B0ciA9IDA7Ci0gIHJldHVybiB0cnVlOwotfQotCi1pbnQKLV9iZmRfZWxmX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHJlbG9jOwotewotICBpbnQgcmV0OwotCi0gIHJldCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX2VoZHI7Ci0gIGlmICghIHJlbG9jKQotICAgIHJldCArPSBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSAoYWJmZCk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4KLSAgICAgICYmICEgX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zCi0gICAgICAoYWJmZCwgKHN0cnVjdCBiZmRfbGlua19pbmZvICopIE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBoZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQgKyBvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkCi1fYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFib3J0ICgpOwotfQotCi0jaWYgMAotdm9pZAotX2JmZF9lbGZfbm9faW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbCAqZHN0OwotewotICBhYm9ydCAoKTsKLX0KLSNlbmRpZgotCi0vKiBUcnkgdG8gY29udmVydCBhIG5vbi1FTEYgcmVsb2MgaW50byBhbiBFTEYgb25lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgKGFiZmQsIGFyZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICphcmVsb2M7Ci17Ci0gIC8qIENoZWNrIHdoZXRoZXIgd2UgcmVhbGx5IGhhdmUgYW4gRUxGIGhvd3RvLiAqLwotCi0gIGlmICgoKmFyZWxvYy0+c3ltX3B0cl9wdHIpLT50aGVfYmZkLT54dmVjICE9IGFiZmQtPnh2ZWMpCi0gICAgewotICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICAgICAgLyogQWxpZW4gcmVsb2M6IFRyeSB0byBkZXRlcm1pbmUgaXRzIHR5cGUgdG8gcmVwbGFjZSBpdCB3aXRoIGFuCi0JIGVxdWl2YWxlbnQgRUxGIHJlbG9jLiAqLwotCi0gICAgICBpZiAoYXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpCi0JewotCSAgc3dpdGNoIChhcmVsb2MtPmhvd3RvLT5iaXRzaXplKQotCSAgICB7Ci0JICAgIGNhc2UgODoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTI6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18xMl9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxNjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzE2X1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDI0OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMjRfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzI6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSA2NDoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzY0X1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgfQotCi0JICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSk7Ci0KLQkgIGlmIChhcmVsb2MtPmhvd3RvLT5wY3JlbF9vZmZzZXQgIT0gaG93dG8tPnBjcmVsX29mZnNldCkKLQkgICAgewotCSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0KQotCQlhcmVsb2MtPmFkZGVuZCArPSBhcmVsb2MtPmFkZHJlc3M7Ci0JICAgICAgZWxzZQotCQlhcmVsb2MtPmFkZGVuZCAtPSBhcmVsb2MtPmFkZHJlc3M7IC8qIGFkZGVuZCBpcyB1bnNpZ25lZCEhICovCi0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChhcmVsb2MtPmhvd3RvLT5iaXRzaXplKQotCSAgICB7Ci0JICAgIGNhc2UgODoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzg7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTQ6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18xNDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxNjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzE2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDI2OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMjY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzI6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSA2NDoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzY0OwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgfQotCi0JICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSk7Ci0JfQotCi0gICAgICBpZiAoaG93dG8pCi0JYXJlbG9jLT5ob3d0byA9IGhvd3RvOwotICAgICAgZWxzZQotCWdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBmYWlsOgotICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAoXygiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAlcyIpLAotICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYXJlbG9jLT5ob3d0by0+bmFtZSk7Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBpZiAoZWxmX3Noc3RydGFiIChhYmZkKSAhPSBOVUxMKQotCV9iZmRfc3RyaW5ndGFiX2ZyZWUgKGVsZl9zaHN0cnRhYiAoYWJmZCkpOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwIChhYmZkKTsKLX0KLQotLyogRm9yIFJlbCB0YXJnZXRzLCB3ZSBlbmNvZGUgbWVhbmluZ2Z1bCBkYXRhIGZvciBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCi0gICBpbiB0aGUgcmVsb2NhdGlvbidzIG9mZnNldC4gIFRodXMgd2UgY2Fubm90IGFsbG93IGFueSBzb3J0IG9mIHNhbml0eQotICAgcmFuZ2UtY2hlY2tpbmcgdG8gaW50ZXJmZXJlLiAgVGhlcmUgaXMgbm90aGluZyBlbHNlIHRvIGRvIGluIHByb2Nlc3NpbmcKLSAgIHRoaXMgcmVsb2MuICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4gKGFiZmQsIHJlLCBzeW1ib2wsIGRhdGEsIGlzLCBvYmZkLCBlcnJtc2cpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlzIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqb2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLS8qIEVsZiBjb3JlIGZpbGUgc3VwcG9ydC4gIE11Y2ggb2YgdGhpcyBvbmx5IHdvcmtzIG9uIG5hdGl2ZQotICAgdG9vbGNoYWlucywgc2luY2Ugd2UgcmVseSBvbiBrbm93aW5nIHRoZQotICAgbWFjaGluZS1kZXBlbmRlbnQgcHJvY2ZzIHN0cnVjdHVyZSBpbiBvcmRlciB0byBwaWNrCi0gICBvdXQgZGV0YWlscyBhYm91dCB0aGUgY29yZWZpbGUuICovCi0KLSNpZmRlZiBIQVZFX1NZU19QUk9DRlNfSAotIyBpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci0jZW5kaWYKLQotCi0vKiBEZWZpbmUgb2Zmc2V0b2YgZm9yIHRob3NlIHN5c3RlbXMgd2hpY2ggbGFjayBpdC4gKi8KLQotI2lmbmRlZiBvZmZzZXRvZgotIyBkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHVuc2lnbmVkIGxvbmcpICYoKFRZUEUgKikwKS0+TUVNQkVSKQotI2VuZGlmCi0KLQotLyogRklYTUU6IHRoaXMgaXMga2luZGEgd3JvbmcsIGJ1dCBpdCdzIHdoYXQgZ2RiIHdhbnRzLiAqLwotCi1zdGF0aWMgaW50Ci1lbGZjb3JlX21ha2VfcGlkIChhYmZkKQotICAgICBiZmQqIGFiZmQ7Ci17Ci0gIHJldHVybiAoKGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfbHdwaWQgPDwgMTYpCi0JICArIChlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3BpZCkpOwotfQotCi0KLS8qIElmIHRoZXJlIGlzbid0IGEgc2VjdGlvbiBjYWxsZWQgTkFNRSwgbWFrZSBvbmUsIHVzaW5nCi0gICBkYXRhIGZyb20gU0VDVC4gIE5vdGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSBhCi0gICByZWZlcmVuY2UgdG8gTkFNRSwgc28geW91IHNob3VsZG4ndCBkZWFsbG9jYXRlIG9yCi0gICBvdmVyd3JpdGUgaXQuICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgbmFtZSwgc2VjdCkKLSAgICAgYmZkKiBhYmZkOwotICAgICBjaGFyKiBuYW1lOwotICAgICBhc2VjdGlvbiogc2VjdDsKLXsKLSAgYXNlY3Rpb24qIHNlY3QyOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSkgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWN0MiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdDIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc2VjdDItPl9yYXdfc2l6ZSA9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgc2VjdDItPmZpbGVwb3MgPSBzZWN0LT5maWxlcG9zOwotICBzZWN0Mi0+ZmxhZ3MgPSBzZWN0LT5mbGFnczsKLSAgc2VjdDItPmFsaWdubWVudF9wb3dlciA9IHNlY3QtPmFsaWdubWVudF9wb3dlcjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogcHJzdGF0dXNfdCBleGlzdHMgb246Ci0gICAgIHNvbGFyaXMgMi5bNTY3XQotICAgICBsaW51eCAyLlswMV0gKyBnbGliYwotICAgICB1bml4d2FyZSA0LjIKLSovCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1QpCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX3Byc3RhdHVzIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBwcnN0YXR1c190IHByc3RhdDsKLSAgY2hhciBidWZbMTAwXTsKLSAgY2hhciogbmFtZTsKLSAgYXNlY3Rpb24qIHNlY3Q7Ci0KLSAgaWYgKG5vdGUtPmRlc2NzeiAhPSBzaXplb2YgKHByc3RhdCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWVtY3B5ICgmcHJzdGF0LCBub3RlLT5kZXNjZGF0YSwgc2l6ZW9mIChwcnN0YXQpKTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3NpZ25hbCA9IHByc3RhdC5wcl9jdXJzaWc7Ci0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcGlkID0gcHJzdGF0LnByX3BpZDsKLQotICAvKiBwcl93aG8gZXhpc3RzIG9uOgotICAgICAgIHNvbGFyaXMgMi5bNTY3XQotICAgICAgIHVuaXh3YXJlIDQuMgotICAgICBwcl93aG8gZG9lc24ndCBleGlzdCBvbjoKLSAgICAgICBsaW51eCAyLlswMV0KLSAgKi8KLSNpZiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1RfUFJfV0hPKQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2x3cGlkID0gcHJzdGF0LnByX3dobzsKLSNlbmRpZgotCi0gIC8qIE1ha2UgYSAiLnJlZy85OTkiIHNlY3Rpb24uICovCi0KLSAgc3ByaW50ZiAoYnVmLCAiLnJlZy8lZCIsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChwcnN0YXQucHJfcmVnKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MgKyBvZmZzZXRvZiAocHJzdGF0dXNfdCwgcHJfcmVnKTsKLSAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGlmICghIGVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCAiLnJlZyIsIHNlY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1QpICovCi0KLQotLyogQ3JlYXRlIGEgcHNldWRvc2VjdGlvbiBjb250YWluaW5nIHRoZSBleGFjdCBjb250ZW50cyBvZiBOT1RFLiAgVGhpcwotICAgYWN0dWFsbHkgY3JlYXRlcyB1cCB0byB0d28gcHNldWRvc2VjdGlvbnM6Ci0gICAtIEZvciB0aGUgc2luZ2xlLXRocmVhZGVkIGNhc2UsIGEgc2VjdGlvbiBuYW1lZCBOQU1FLCB1bmxlc3MKLSAgICAgc3VjaCBhIHNlY3Rpb24gYWxyZWFkeSBleGlzdHMuCi0gICAtIEZvciB0aGUgbXVsdGktdGhyZWFkZWQgY2FzZSwgYSBzZWN0aW9uIG5hbWVkICJOQU1FL1BJRCIsIHdoZXJlCi0gICAgIFBJRCBpcyBlbGZjb3JlX21ha2VfcGlkIChhYmZkKS4KLSAgIEJvdGggcHNldWRvc2VjdGlvbnMgaGF2ZSBpZGVudGljYWwgY29udGVudHM6IHRoZSBjb250ZW50cyBvZiBOT1RFLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfbWFrZV9ub3RlX3BzZXVkb3NlY3Rpb24gKGFiZmQsIG5hbWUsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIGNoYXIgYnVmWzEwMF07Ci0gIGNoYXIgKnRocmVhZGVkX25hbWU7Ci0gIGFzZWN0aW9uKiBzZWN0OwotCi0gIC8qIEJ1aWxkIHRoZSBzZWN0aW9uIG5hbWUuICAqLwotCi0gIHNwcmludGYgKGJ1ZiwgIiVzLyVkIiwgbmFtZSwgZWxmY29yZV9tYWtlX3BpZCAoYWJmZCkpOwotICB0aHJlYWRlZF9uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGJ1ZikgKyAxKTsKLSAgaWYgKHRocmVhZGVkX25hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmNweSAodGhyZWFkZWRfbmFtZSwgYnVmKTsKLQotICBzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgdGhyZWFkZWRfbmFtZSk7Ci0gIGlmIChzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzZWN0LT5fcmF3X3NpemUgPSBub3RlLT5kZXNjc3o7Ci0gIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zOwotICBzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgaWYgKCEgZWxmY29yZV9tYXliZV9tYWtlX3NlY3QgKGFiZmQsIG5hbWUsIHNlY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBUaGVyZSBpc24ndCBhIGNvbnNpc3RlbnQgcHJmcHJlZ3NldF90IGFjcm9zcyBwbGF0Zm9ybXMsCi0gICBidXQgaXQgZG9lc24ndCBtYXR0ZXIsIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0byBwaWNrIHRoaXMKLSAgIGRhdGEgc3RydWN0dXJlIGFwYXJ0LiAqLwotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19wcmZwcmVnIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICByZXR1cm4gZWxmY29yZV9tYWtlX25vdGVfcHNldWRvc2VjdGlvbiAoYWJmZCwgIi5yZWcyIiwgbm90ZSk7Ci19Ci0KLQotLyogTGludXggZHVtcHMgdGhlIEludGVsIFNTRSByZWdzIGluIGEgbm90ZSBuYW1lZCAiTElOVVgiIHdpdGggYSBub3RlCi0gICB0eXBlIG9mIDUgKE5UX1BSWEZQUkVHKS4gIEp1c3QgaW5jbHVkZSB0aGUgd2hvbGUgbm90ZSdzIGNvbnRlbnRzCi0gICBsaXRlcmFsbHkuICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19wcnhmcHJlZyAoYWJmZCwgbm90ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKLXsKLSAgcmV0dXJuIGVsZmNvcmVfbWFrZV9ub3RlX3BzZXVkb3NlY3Rpb24gKGFiZmQsICIucmVnLXhmcCIsIG5vdGUpOwotfQotCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpCi0jIGRlZmluZSBlbGZjb3JlX3BzaW5mb190IHBycHNpbmZvX3QKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9QU0lORk9fVCkKLSMgZGVmaW5lIGVsZmNvcmVfcHNpbmZvX3QgcHNpbmZvX3QKLSNlbmRpZgotCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpIHx8IGRlZmluZWQgKEhBVkVfUFNJTkZPX1QpCi0KLS8qIHJldHVybiBhIG1hbGxvYydlZCBjb3B5IG9mIGEgc3RyaW5nIGF0IFNUQVJUIHdoaWNoIGlzIGF0Ci0gICBtb3N0IE1BWCBieXRlcyBsb25nLCBwb3NzaWJseSB3aXRob3V0IGEgdGVybWluYXRpbmcgJ1wwJy4KLSAgIHRoZSBjb3B5IHdpbGwgYWx3YXlzIGhhdmUgYSB0ZXJtaW5hdGluZyAnXDAnLiAqLwotCi1zdGF0aWMgY2hhcioKLWVsZmNvcmVfc3RybmR1cCAoYWJmZCwgc3RhcnQsIG1heCkKLSAgICAgYmZkKiBhYmZkOwotICAgICBjaGFyKiBzdGFydDsKLSAgICAgaW50IG1heDsKLXsKLSAgY2hhciogZHVwOwotICBjaGFyKiBlbmQgPSBtZW1jaHIgKHN0YXJ0LCAnXDAnLCBtYXgpOwotICBpbnQgbGVuOwotCi0gIGlmIChlbmQgPT0gTlVMTCkKLSAgICBsZW4gPSBtYXg7Ci0gIGVsc2UKLSAgICBsZW4gPSBlbmQgLSBzdGFydDsKLQotICBkdXAgPSBiZmRfYWxsb2MgKGFiZmQsIGxlbiArIDEpOwotICBpZiAoZHVwID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbWVtY3B5IChkdXAsIHN0YXJ0LCBsZW4pOwotICBkdXBbbGVuXSA9ICdcMCc7Ci0KLSAgcmV0dXJuIGR1cDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19wc2luZm8gKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIGVsZmNvcmVfcHNpbmZvX3QgcHNpbmZvOwotCi0gIGlmIChub3RlLT5kZXNjc3ogIT0gc2l6ZW9mIChlbGZjb3JlX3BzaW5mb190KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtZW1jcHkgKCZwc2luZm8sIG5vdGUtPmRlc2NkYXRhLCBub3RlLT5kZXNjc3opOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcHJvZ3JhbQotICAgID0gZWxmY29yZV9zdHJuZHVwIChhYmZkLCBwc2luZm8ucHJfZm5hbWUsIHNpemVvZiAocHNpbmZvLnByX2ZuYW1lKSk7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9jb21tYW5kCi0gICAgPSBlbGZjb3JlX3N0cm5kdXAgKGFiZmQsIHBzaW5mby5wcl9wc2FyZ3MsIHNpemVvZiAocHNpbmZvLnByX3BzYXJncykpOwotCi0gIC8qIE5vdGUgdGhhdCBmb3Igc29tZSByZWFzb24sIGEgc3B1cmlvdXMgc3BhY2UgaXMgdGFja2VkCi0gICAgIG9udG8gdGhlIGVuZCBvZiB0aGUgYXJncyBpbiBzb21lIChhdCBsZWFzdCBvbmUgYW55d2F5KQotICAgICBpbXBsZW1lbnRhdGlvbnMsIHNvIHN0cmlwIGl0IG9mZiBpZiBpdCBleGlzdHMuICovCi0KLSAgewotICAgIGNoYXIqIGNvbW1hbmQgPSBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2NvbW1hbmQ7Ci0gICAgaW50IG4gPSBzdHJsZW4gKGNvbW1hbmQpOwotCi0gICAgaWYgKDAgPCBuICYmIGNvbW1hbmRbbiAtIDFdID09ICcgJykKLSAgICAgIGNvbW1hbmRbbiAtIDFdID0gJ1wwJzsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmIC8qIGRlZmluZWQgKEhBVkVfUFJQU0lORk9fVCkgfHwgZGVmaW5lZCAoSEFWRV9QU0lORk9fVCkgKi8KLQotCi0jaWYgZGVmaW5lZCAoSEFWRV9QU1RBVFVTX1QpCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX3BzdGF0dXMgKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIHBzdGF0dXNfdCBwc3RhdDsKLQotICBpZiAobm90ZS0+ZGVzY3N6ICE9IHNpemVvZiAocHN0YXQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1lbWNweSAoJnBzdGF0LCBub3RlLT5kZXNjZGF0YSwgc2l6ZW9mIChwc3RhdCkpOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcGlkID0gcHN0YXQucHJfcGlkOwotCi0gIC8qIENvdWxkIGdyYWIgc29tZSBtb3JlIGRldGFpbHMgZnJvbSB0aGUgInJlcHJlc2VudGF0aXZlIgotICAgICBsd3BzdGF0dXNfdCBpbiBwc3RhdC5wcl9sd3AsIGJ1dCB3ZSdsbCBjYXRjaCBpdCBhbGwgaW4gYW4KLSAgICAgTlRfTFdQU1RBVFVTIG5vdGUsIHByZXN1bWFibHkuICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZCAoSEFWRV9QU1RBVFVTX1QpICovCi0KLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1QpCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX2x3cHN0YXR1cyAoYWJmZCwgbm90ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKLXsKLSAgbHdwc3RhdHVzX3QgbHdwc3RhdDsKLSAgY2hhciBidWZbMTAwXTsKLSAgY2hhciogbmFtZTsKLSAgYXNlY3Rpb24qIHNlY3Q7Ci0KLSAgaWYgKG5vdGUtPmRlc2NzeiAhPSBzaXplb2YgKGx3cHN0YXQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1lbWNweSAoJmx3cHN0YXQsIG5vdGUtPmRlc2NkYXRhLCBzaXplb2YgKGx3cHN0YXQpKTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2x3cGlkID0gbHdwc3RhdC5wcl9sd3BpZDsKLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9zaWduYWwgPSBsd3BzdGF0LnByX2N1cnNpZzsKLQotICAvKiBNYWtlIGEgIi5yZWcvOTk5IiBzZWN0aW9uLiAqLwotCi0gIHNwcmludGYgKGJ1ZiwgIi5yZWcvJWQiLCBlbGZjb3JlX21ha2VfcGlkIChhYmZkKSk7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoYnVmKSArIDEpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyY3B5IChuYW1lLCBidWYpOwotCi0gIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKHNlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UX1BSX0NPTlRFWFQpCi0gIHNlY3QtPl9yYXdfc2l6ZSA9IHNpemVvZiAobHdwc3RhdC5wcl9jb250ZXh0LnVjX21jb250ZXh0LmdyZWdzKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MKLSAgICArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfY29udGV4dC51Y19tY29udGV4dC5ncmVncyk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1RfUFJfUkVHKQotICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKGx3cHN0YXQucHJfcmVnKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MgKyBvZmZzZXRvZiAobHdwc3RhdHVzX3QsIHByX3JlZyk7Ci0jZW5kaWYKLQotICBzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgaWYgKCFlbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgIi5yZWciLCBzZWN0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTWFrZSBhICIucmVnMi85OTkiIHNlY3Rpb24gKi8KLQotICBzcHJpbnRmIChidWYsICIucmVnMi8lZCIsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1RfUFJfQ09OVEVYVCkKLSAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChsd3BzdGF0LnByX2NvbnRleHQudWNfbWNvbnRleHQuZnByZWdzKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MKLSAgICArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfY29udGV4dC51Y19tY29udGV4dC5mcHJlZ3MpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UX1BSX0ZQUkVHKQotICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKGx3cHN0YXQucHJfZnByZWcpOwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvcyArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfZnByZWcpOwotI2VuZGlmCi0KLSAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGlmICghZWxmY29yZV9tYXliZV9tYWtlX3NlY3QgKGFiZmQsICIucmVnMiIsIHNlY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UKSAqLwotCi0KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19ub3RlIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBzd2l0Y2ggKG5vdGUtPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfUFJTVEFUVVNfVCkKLSAgICBjYXNlIE5UX1BSU1RBVFVTOgotICAgICAgcmV0dXJuIGVsZmNvcmVfZ3Jva19wcnN0YXR1cyAoYWJmZCwgbm90ZSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfUFNUQVRVU19UKQotICAgIGNhc2UgTlRfUFNUQVRVUzoKLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHN0YXR1cyAoYWJmZCwgbm90ZSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1QpCi0gICAgY2FzZSBOVF9MV1BTVEFUVVM6Ci0gICAgICByZXR1cm4gZWxmY29yZV9ncm9rX2x3cHN0YXR1cyAoYWJmZCwgbm90ZSk7Ci0jZW5kaWYKLQotICAgIGNhc2UgTlRfRlBSRUdTRVQ6CQkvKiBGSVhNRTogcmVuYW1lIHRvIE5UX1BSRlBSRUcgKi8KLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHJmcHJlZyAoYWJmZCwgbm90ZSk7Ci0KLSAgICBjYXNlIE5UX1BSWEZQUkVHOgkJLyogTGludXggU1NFIGV4dGVuc2lvbiAqLwotICAgICAgaWYgKG5vdGUtPm5hbWVzeiA9PSA1Ci0JICAmJiAhIHN0cmNtcCAobm90ZS0+bmFtZWRhdGEsICJMSU5VWCIpKQotCXJldHVybiBlbGZjb3JlX2dyb2tfcHJ4ZnByZWcgKGFiZmQsIG5vdGUpOwotICAgICAgZWxzZQotCXJldHVybiB0cnVlOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9QUlBTSU5GT19UKSB8fCBkZWZpbmVkIChIQVZFX1BTSU5GT19UKQotICAgIGNhc2UgTlRfUFJQU0lORk86Ci0gICAgY2FzZSBOVF9QU0lORk86Ci0gICAgICByZXR1cm4gZWxmY29yZV9ncm9rX3BzaW5mbyAoYWJmZCwgbm90ZSk7Ci0jZW5kaWYKLSAgICB9Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfcmVhZF9ub3RlcyAoYWJmZCwgb2Zmc2V0LCBzaXplKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBiZmRfdm1hIHNpemU7Ci17Ci0gIGNoYXIqIGJ1ZjsKLSAgY2hhciogcDsKLQotICBpZiAoc2l6ZSA8PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJ1ZiA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHNpemUpOwotICBpZiAoYnVmID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfcmVhZCAoYnVmLCBzaXplLCAxLCBhYmZkKSAhPSBzaXplKQotICAgIHsKLSAgICBlcnJvcjoKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHAgPSBidWY7Ci0gIHdoaWxlIChwIDwgYnVmICsgc2l6ZSkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogYmFkIGFsaWdubWVudCBhc3N1bXB0aW9uLiAqLwotICAgICAgRWxmX0V4dGVybmFsX05vdGUqIHhucCA9IChFbGZfRXh0ZXJuYWxfTm90ZSopIHA7Ci0gICAgICBFbGZfSW50ZXJuYWxfTm90ZSBpbjsKLQotICAgICAgaW4udHlwZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHhucC0+dHlwZSk7Ci0KLSAgICAgIGluLm5hbWVzeiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHhucC0+bmFtZXN6KTsKLSAgICAgIGluLm5hbWVkYXRhID0geG5wLT5uYW1lOwotCi0gICAgICBpbi5kZXNjc3ogPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSB4bnAtPmRlc2Nzeik7Ci0gICAgICBpbi5kZXNjZGF0YSA9IGluLm5hbWVkYXRhICsgQkZEX0FMSUdOIChpbi5uYW1lc3osIDQpOwotICAgICAgaW4uZGVzY3BvcyA9IG9mZnNldCArIChpbi5kZXNjZGF0YSAtIGJ1Zik7Ci0KLSAgICAgIGlmICghIGVsZmNvcmVfZ3Jva19ub3RlIChhYmZkLCAmaW4pKQotCWdvdG8gZXJyb3I7Ci0KLSAgICAgIHAgPSBpbi5kZXNjZGF0YSArIEJGRF9BTElHTiAoaW4uZGVzY3N6LCA0KTsKLSAgICB9Ci0KLSAgZnJlZSAoYnVmKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgbm93IHVubmVjZXNzYXJ5LiAgQ2FsbGVycyBjYW4ganVzdCBjYWxsCi0gICBiZmRfc2VjdGlvbl9mcm9tX3BoZHIgZGlyZWN0bHkuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZmNvcmVfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIHBoZHIsIHNlY19udW0pCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIqIHBoZHI7Ci0gICAgIGludCBzZWNfbnVtOwotewotICBpZiAoISBiZmRfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIHBoZHIsIHNlY19udW0pKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0MCi0vKiBQcm92aWRpbmcgZXh0ZXJuYWwgYWNjZXNzIHRvIHRoZSBFTEYgcHJvZ3JhbSBoZWFkZXIgdGFibGUuICAqLwotCi0vKiBSZXR1cm4gYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSBhCi0gICBjb3B5IG9mIEFCRkQncyBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzLiAgUmV0dXJuIC0xIGlmIGFuIGVycm9yCi0gICBvY2N1cnM7IGJmZF9nZXRfZXJyb3Igd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgY29kZS4gICovCi1sb25nCi1iZmRfZ2V0X2VsZl9waGRyX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW0KLQkgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUGhkcikpOwotfQotCi0KLS8qIENvcHkgQUJGRCdzIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJpZXMgdG8gKlBIRFJTLiAgVGhlIGVudHJpZXMKLSAgIHdpbGwgYmUgc3RvcmVkIGFzIGFuIGFycmF5IG9mIEVsZl9JbnRlcm5hbF9QaGRyIHN0cnVjdHVyZXMsIGFzCi0gICBkZWZpbmVkIGluIGluY2x1ZGUvZWxmL2ludGVybmFsLmguICBUbyBmaW5kIG91dCBob3cgbGFyZ2UgdGhlCi0gICBidWZmZXIgbmVlZHMgdG8gYmUsIGNhbGwgYmZkX2dldF9lbGZfcGhkcl91cHBlcl9ib3VuZC4KLQotICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cmllcyByZWFkLCBvciAtMSBpZiBhbgotICAgZXJyb3Igb2NjdXJzOyBiZmRfZ2V0X2Vycm9yIHdpbGwgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGNvZGUuICAqLwotaW50Ci1iZmRfZ2V0X2VsZl9waGRycyAoYWJmZCwgcGhkcnMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdm9pZCAqcGhkcnM7Ci17Ci0gIGludCBudW1fcGhkcnM7Ci0KLSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgbnVtX3BoZHJzID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW07Ci0gIG1lbWNweSAocGhkcnMsIGVsZl90ZGF0YSAoYWJmZCktPnBoZHIsIAotCSAgbnVtX3BoZHJzICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUGhkcikpOwotCi0gIHJldHVybiBudW1fcGhkcnM7Ci19CmRpZmYgLS1naXQgYS9iZmQvZWxmMzItYXJjLmMgYi9iZmQvZWxmMzItYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOGRjNzAuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qIEFSQy1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvYXJjLmgiCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgYXJjX2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhcmNfZWxmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBhcmNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQotLyogVHJ5IHRvIG1pbmltaXplIHRoZSBhbW91bnQgb2Ygc3BhY2Ugb2NjdXBpZWQgYnkgcmVsb2NhdGlvbiB0YWJsZXMKLSAgIG9uIHRoZSBST00gKG5vdCB0aGF0IHRoZSBST00gd29uJ3QgYmUgc3dhbXBlZCBieSBvdGhlciBFTEYgb3ZlcmhlYWQpLiAgKi8KLSNkZWZpbmUgVVNFX1JFTAotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfYXJjX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX0FSQ19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSQ19OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfQVJDXzMyLAkJLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUkNfMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsICAgCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjYgYml0IGFic29sdXRlIGJyYW5jaCwgcmlnaHQgc2hpZnRlZCBieSAyLiAgKi8KLSAgSE9XVE8gKFJfQVJDX0IyNiwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUkNfQjI2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAyMiBiaXQgYnJhbmNoOyBiaXRzIDIxLTIgYXJlIHN0b3JlZCBpbiBiaXRzIDI2LTcuICAqLwotICBIT1dUTyAoUl9BUkNfQjIyX1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNywJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJDX0IyMl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmZmZmODAsCQkvKiBzcmNfbWFzayAqLwotCSAweDA3ZmZmZjgwLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gQVJDIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBhcmNfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFyY19yZWxvY19tYXAgYXJjX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9BUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DX0FSQ19CMjYsIFJfQVJDX0IyNiB9LAotICB7IEJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMLCBSX0FSQ19CMjJfUENSRUwgfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChhcmNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGFyY19yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAoYXJjX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGZfYXJjX2hvd3RvX3RhYmxlW2FyY19yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEFSQyBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotYXJjX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfQVJDX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2FyY19ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyIGZvciBhbiBBUkMgRUxGIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYXJjX2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbWFjaDsKLSAgdW5zaWduZWQgbG9uZyBhcmNoID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9BUkNfTUFDSDsKLQotICBzd2l0Y2ggKGFyY2gpCi0gICAgewotICAgIGNhc2UgRV9BUkNfTUFDSF9CQVNFOgotICAgICAgbWFjaCA9IGJmZF9tYWNoX2FyY19iYXNlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFVua25vd24gY3B1IHR5cGUuICA/Pz8gV2hhdCB0byBkbz8gICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9hcmMsIG1hY2gpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIGZpbmFsIHByb2Nlc3NpbmcgZG9uZSBqdXN0IGJlZm9yZSB3cml0aW5nIG91dCBhbiBBUkMgRUxGIG9iamVjdCBmaWxlLgotICAgVGhpcyBnZXRzIHRoZSBBUkMgYXJjaGl0ZWN0dXJlIHJpZ2h0IGJhc2VkIG9uIHRoZSBtYWNoaW5lIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi1hcmNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGxpbmtlciBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgbWFjaDsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0KLSAgc3dpdGNoIChtYWNoID0gYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfbWFjaF9hcmNfYmFzZToKLSAgICAgIHZhbCA9IEVfQVJDX01BQ0hfQkFTRTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9BUkNfTUFDSDsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOwotfQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9saXR0bGVhcmNfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItbGl0dGxlYXJjIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX2JpZ2FyY192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItYmlnYXJjIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfYXJjCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX0FSQwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCTAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCWFyY19pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAlhcmNfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotCQkJCWFyY19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItYXJtLmggYi9iZmQvZWxmMzItYXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NWUwY2QuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWFybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIyNSArMCwwIEBACi0vKiAzMi1iaXQgRUxGIHN1cHBvcnQgZm9yIEFSTQotICAgQ29weXJpZ2h0IDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IGluc24zMjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGluc24xNjsKLQotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotc3RhdGljIGludCBlbGYzMl9hcm1fZ2V0X3N5bWJvbF90eXBlCi0gIFBBUkFNUyAoKCBFbGZfSW50ZXJuYWxfU3ltICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICplbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfdm1hLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgY2hhciwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotCi1zdGF0aWMgaW5zbjMyIGluc2VydF90aHVtYl9icmFuY2gKLSAgUEFSQU1TICgoaW5zbjMyLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqZmluZF90aHVtYl9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqZmluZF9hcm1fZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBDT05TVCBjaGFyICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCByZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIHZvaWQgcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyB2b2lkIGVsZjMyX2FybV9wb3N0X3Byb2Nlc3NfaGVhZGVycwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGludCBlbGYzMl9hcm1fdG9fdGh1bWJfc3R1YgotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBiZmRfYnl0ZSAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3ZtYSkpOwotc3RhdGljIGludCBlbGYzMl90aHVtYl90b19hcm1fc3R1YgotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBiZmRfYnl0ZSAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3ZtYSkpOwotCi0vKiBUaGUgbGlua2VyIHNjcmlwdCBrbm93cyB0aGUgc2VjdGlvbiBuYW1lcyBmb3IgcGxhY2VtZW50LgotICAgVGhlIGVudHJ5X25hbWVzIGFyZSB1c2VkIHRvIGRvIHNpbXBsZSBuYW1lIG1hbmdsaW5nIG9uIHRoZSBzdHVicy4KLSAgIEdpdmVuIGEgZnVuY3Rpb24gbmFtZSwgYW5kIGl0cyB0eXBlLCB0aGUgc3R1YiBjYW4gYmUgZm91bmQuIFRoZQotICAgbmFtZSBjYW4gYmUgY2hhbmdlZC4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhlICVzIGJlIHByZXNlbnQuCi0gKi8KLQotI2RlZmluZSBJTlRFUldPUktfRkxBRyggYWJmZCApICAgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfSU5URVJXT1JLKQotCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfN3QiCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUgICAiX18lc19mcm9tX3RodW1iIgotCi0jZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfNyIKLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fYXJtIgotCi0vKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCi0gICBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgICAgICIvdXNyL2xpYi9sZC5zby4xIgotCi0vKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDE2Ci0KLS8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2tzIGxpa2UKLSAgIHRoaXMuICBJdCBpcyBzZXQgdXAgc28gdGhhdCBhbnkgc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb24gdGhhdCBpcwotICAgY2FsbGVkIGJlZm9yZSB0aGUgcmVsb2NhdGlvbiBoYXMgYmVlbiBzZXQgdXAgY2FsbHMgdGhlIGR5bmFtaWMKLSAgIGxpbmtlciBmaXJzdCAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmMzJfYXJtX3BsdDBfZW50cnkgW1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MDQsIDB4ZTAsIDB4MmQsIDB4ZTUsCS8qIHN0ciAgIGxyLCBbc3AsICMtNF0hICAgICAqLwotICAweDEwLCAweGUwLCAweDlmLCAweGU1LAkvKiBsZHIgICBsciwgW3BjLCAjMTZdICAgICAgKi8KLSAgMHgwZSwgMHhlMCwgMHg4ZiwgMHhlMCwJLyogYWRyICAgbHIsIHBjLCBsciAgICAgICAgICovCi0gIDB4MDgsIDB4ZjAsIDB4YmUsIDB4ZTUJLyogbGRyICAgcGMsIFtsciwgIzhdISAgICAgICovCi19OwotCi0vKiBTdWJzZXF1ZW50IGVudHJpZXMgaW4gYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rIGxpa2UKLSAgIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmMzJfYXJtX3BsdF9lbnRyeSBbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHgwNCwgMHhjMCwgMHg5ZiwgMHhlNSwJLyogbGRyICAgaXAsIFtwYywgIzRdICAgICAgICovCi0gIDB4MGMsIDB4YzAsIDB4OGYsIDB4ZTAsCS8qIGFkZCAgIGlwLCBwYywgaXAgICAgICAgICAqLwotICAweDAwLCAweGYwLCAweDljLCAweGU1LAkvKiBsZHIgICBwYywgW2lwXSAgICAgICAgICAgKi8KLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCAgICAgICAgLyogb2Zmc2V0IHRvIHN5bWJvbCBpbiBnb3QgICovCi19OwotCi0KLS8qIFRoZSBBUk0gbGlua2VyIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWxvY3MgdGhhdCBpdAotICAgZGVjaWRlcyB0byBjb3B5IGluIGNoZWNrX3JlbG9jcyBmb3IgZWFjaCBzeW1ib2wuICBUaGlzIGlzIHNvIHRoYXQKLSAgIGl0IGNhbiBkaXNjYXJkIFBDIHJlbGF0aXZlIHJlbG9jcyBpZiBpdCBkb2Vzbid0IG5lZWQgdGhlbSB3aGVuCi0gICBsaW5raW5nIHdpdGggLUJzeW1ib2xpYy4gIFdlIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGZpZWxkCi0gICBleHRlbmRpbmcgdGhlIHJlZ3VsYXIgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3Mgd2UKLSAgIGhhdmUgY29waWVkIGZvciBhIGdpdmVuIHN5bWJvbC4gICovCi0KLXN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZAotewotICAvKiBOZXh0IHNlY3Rpb24uICAqLwotICBzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKiBuZXh0OwotICAvKiBBIHNlY3Rpb24gaW4gZHlub2JqLiAgKi8KLSAgYXNlY3Rpb24gKiBzZWN0aW9uOwotICAvKiBOdW1iZXIgb2YgcmVsb2NzIGNvcGllZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBiZmRfc2l6ZV90eXBlIGNvdW50OwotfTsKLQotLyogQXJtIEVMRiBsaW5rZXIgaGFzaCBlbnRyeS4gICovCi0KLXN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogTnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyBjb3BpZWQgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkICogcGNyZWxfcmVsb2NzX2NvcGllZDsKLX07Ci0KLS8qIERlY2xhcmUgdGhpcyBub3cgdGhhdCB0aGUgYWJvdmUgc3RydWN0dXJlcyBhcmUgZGVmaW5lZC4gICovCi0KLXN0YXRpYyBib29sZWFuIGVsZjMyX2FybV9kaXNjYXJkX2NvcGllcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogVHJhdmVyc2UgYW4gYXJtIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgZWxmMzJfYXJtX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIEFSTSBlbGYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBlbGYzMl9hcm1faGFzaF90YWJsZShpbmZvKSBcCi0gICgoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKikgKChpbmZvKS0+aGFzaCkpCi0KLS8qIEFSTSBFTEYgbGlua2VyIGhhc2ggdGFibGUgKi8KLXN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlCi0gIHsKLSAgICAvKiBUaGUgbWFpbiBoYXNoIHRhYmxlLiAgKi8KLSAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gICAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNlY3Rpb24gY29udGFpbmcgdGhlIFRodW1iLXRvLUFSTSBnbHVlLiAgKi8KLSAgICBsb25nIGludCB0aHVtYl9nbHVlX3NpemU7Ci0KLSAgICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc2VjdGlvbiBjb250YWluZyB0aGUgQVJNLXRvLVRodW1iIGdsdWUuICAqLwotICAgIGxvbmcgaW50IGFybV9nbHVlX3NpemU7Ci0KLSAgICAvKiBBbiBhcmJpdGFyeSBpbnB1dCBCRkQgY2hvc2VuIHRvIGhvbGQgdGhlIGdsdWUgc2VjdGlvbnMuICAqLwotICAgIGJmZCAqIGJmZF9vZl9nbHVlX293bmVyOwotCi0gICAgLyogQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBrbm93bGVkZ2Ugb2YgdGhlIEFSTSdzIHBpcGVsaW5lCi0gICAgICAgbGVuZ3RoIHNob3VsZCBiZSBhcHBsaWVkIGJ5IHRoZSBsaW5rZXIuICAqLwotICAgIGludCBub19waXBlbGluZV9rbm93bGVkZ2U7Ci0gIH07Ci0KLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIEFSTSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjMyX2FybV9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqIGVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiB0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqIHN0cmluZzsKLXsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiByZXQgPQotICAgIChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBOVUxMOwotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGFuIEFSTSBlbGYgbGlua2VyIGhhc2ggdGFibGUgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWVsZjMyX2FybV9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCFfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICBlbGYzMl9hcm1fbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldC0+dGh1bWJfZ2x1ZV9zaXplID0gMDsKLSAgcmV0LT5hcm1fZ2x1ZV9zaXplID0gMDsKLSAgcmV0LT5iZmRfb2ZfZ2x1ZV9vd25lciA9IE5VTEw7Ci0gIHJldC0+bm9fcGlwZWxpbmVfa25vd2xlZGdlID0gMDsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi1zdGF0aWMgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKgotZmluZF90aHVtYl9nbHVlIChsaW5rX2luZm8sIG5hbWUsIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGNoYXIgKnRtcF9uYW1lOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaGFzaDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmhhc2hfdGFibGU7Ci0KLSAgLyogV2UgbmVlZCBhIHBvaW50ZXIgdG8gdGhlIGFybWVsZiBzcGVjaWZpYyBoYXNoIHRhYmxlLiAgKi8KLSAgaGFzaF90YWJsZSA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChsaW5rX2luZm8pOwotCi0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLSAgICAgICBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotCi0gIGhhc2ggPSBlbGZfbGlua19oYXNoX2xvb2t1cAotICAgICgmKGhhc2hfdGFibGUpLT5yb290LCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICBpZiAoaGFzaCA9PSBOVUxMKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiJXM6IHVuYWJsZSB0byBmaW5kIFRIVU1CIGdsdWUgJyVzJyBmb3IgYCVzJyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgdG1wX25hbWUsIG5hbWUpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICByZXR1cm4gaGFzaDsKLX0KLQotc3RhdGljIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoKLWZpbmRfYXJtX2dsdWUgKGxpbmtfaW5mbywgbmFtZSwgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgY2hhciAqdG1wX25hbWU7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpteWg7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpoYXNoX3RhYmxlOwotCi0gIC8qIFdlIG5lZWQgYSBwb2ludGVyIHRvIHRoZSBlbGZhcm0gc3BlY2lmaWMgaGFzaCB0YWJsZS4gICovCi0gIGhhc2hfdGFibGUgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKLQotICB0bXBfbmFtZSA9ICgoY2hhciAqKQotICAgICAgIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUpICsgMSkpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0KLSAgbXloID0gZWxmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoJihoYXNoX3RhYmxlKS0+cm9vdCwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKG15aCA9PSBOVUxMKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiJXM6IHVuYWJsZSB0byBmaW5kIEFSTSBnbHVlICclcycgZm9yIGAlcyciKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHRtcF9uYW1lLCBuYW1lKTsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgcmV0dXJuIG15aDsKLX0KLQotLyoKLSAgIEFSTS0+VGh1bWIgZ2x1ZToKLQotICAgLmFybQotICAgX19mdW5jX2Zyb21fYXJtOgotICAgbGRyIHIxMiwgX19mdW5jX2FkZHIKLSAgIGJ4ICByMTIKLSAgIF9fZnVuY19hZGRyOgotICAgLndvcmQgZnVuYyAgICBAIGJlaGF2ZSBhcyBpZiB5b3Ugc2F3IGEgQVJNXzMyIHJlbG9jCi0gKi8KLQotI2RlZmluZSBBUk0yVEhVTUJfR0xVRV9TSVpFIDEyCi1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDFfbGRyX2luc24gPSAweGU1OWZjMDAwOwotc3RhdGljIGNvbnN0IGluc24zMiBhMnQyX2J4X3IxMl9pbnNuID0gMHhlMTJmZmYxYzsKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0M19mdW5jX2FkZHJfaW5zbiA9IDB4MDAwMDAwMDE7Ci0KLS8qCi0gICBUaHVtYi0+QVJNOiAgICAgICAgICAgICAgICAgICAgICAgICAgVGh1bWItPihub24taW50ZXJ3b3JraW5nIGF3YXJlKSBBUk0KLQotICAgLnRodW1iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aHVtYgotICAgLmFsaWduIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAyCi0gICBfX2Z1bmNfZnJvbV90aHVtYjogICAgICAgICAgICAgIF9fZnVuY19mcm9tX3RodW1iOgotICAgYnggcGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2gge3I2LCBscn0KLSAgIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZHIgIHI2LCBfX2Z1bmNfYWRkcgotICAgLmFybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ICBsciwgcGMKLSAgIF9fZnVuY19jaGFuZ2VfdG9fYXJtOiAgICAgICAgICAgICAgICAgICAgICAgIGJ4ICAgcjYKLSAgIGIgZnVuYyAgICAgICAgICAgICAgICAgICAgICAgLmFybQotICAgX19mdW5jX2JhY2tfdG9fdGh1bWI6Ci0gICBsZG1pYSByMTMhIHtyNiwgbHJ9Ci0gICBieCAgICBscgotICAgX19mdW5jX2FkZHI6Ci0gICAud29yZCAgICAgICAgZnVuYwotICovCi0KLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0laRSA4Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTFfYnhfcGNfaW5zbiA9IDB4NDc3ODsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMl9ub29wX2luc24gPSAweDQ2YzA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIHQyYTNfYl9pbnNuID0gMHhlYTAwMDAwMDsKLQotc3RhdGljIGNvbnN0IGluc24xNiB0MmExX3B1c2hfaW5zbiA9IDB4YjU0MDsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMl9sZHJfaW5zbiA9IDB4NGUwMzsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhM19tb3ZfaW5zbiA9IDB4NDZmZTsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhNF9ieF9pbnNuID0gMHg0NzMwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmE1X3BvcF9pbnNuID0gMHhlOGJkNDA0MDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhNl9ieF9pbnNuID0gMHhlMTJmZmYxZTsKLQotYm9vbGVhbgotYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLXsKLSAgYXNlY3Rpb24gKiBzOwotICBiZmRfYnl0ZSAqIGZvbzsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQotICBpZiAoZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotCi0gICAgICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplOwotICAgICAgcy0+Y29udGVudHMgPSBmb287Ci0gICAgfQotCi0gIGlmIChnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUpOwotCi0gICAgICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemU7Ci0gICAgICBzLT5jb250ZW50cyA9IGZvbzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUgKGxpbmtfaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLXsKLSAgY29uc3QgY2hhciAqIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICByZWdpc3RlciBhc2VjdGlvbiAqIHM7Ci0gIGNoYXIgKiB0bXBfbmFtZTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBteWg7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0gICAgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0KLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICB0bXBfbmFtZSA9ICgoY2hhciAqKQotICAgICAgIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUpICsgMSkpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0KLSAgbXloID0gZWxmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoJihnbG9iYWxzKS0+cm9vdCwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKG15aCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHRtcF9uYW1lKTsKLSAgICAgIHJldHVybjsJCQkvKiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBndXkgKi8KLSAgICB9Ci0KLSAgLyogVGhlIG9ubHkgdHJpY2sgaGVyZSBpcyB1c2luZyBoYXNoX3RhYmxlLT5hcm1fZ2x1ZV9zaXplIGFzIHRoZSB2YWx1ZS4gRXZlbgotICAgICB0aG91Z2ggdGhlIHNlY3Rpb24gaXNuJ3QgYWxsb2NhdGVkIHlldCwgdGhpcyBpcyB3aGVyZSB3ZSB3aWxsIGJlIHB1dHRpbmcKLSAgICAgaXQuICAqLwotCi0gIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChsaW5rX2luZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCQkgICAgQlNGX0dMT0JBTCwKLQkJCQkgICAgcywgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSArIDEsCi0JCQkJICAgIE5VTEwsIHRydWUsIGZhbHNlLAotCQkJCSAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZteWgpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplICs9IEFSTTJUSFVNQl9HTFVFX1NJWkU7Ci0KLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlIChsaW5rX2luZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBjb25zdCBjaGFyICpuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIGNoYXIgKnRtcF9uYW1lOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKLSAgY2hhciBiaW5kOwotCi0gIGhhc2hfdGFibGUgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKLQotICBCRkRfQVNTRVJUIChoYXNoX3RhYmxlICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChoYXNoX3RhYmxlLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLSAgICAoaGFzaF90YWJsZS0+YmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICB0bXBfbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUpICsgMSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLQotICBteWggPSBlbGZfbGlua19oYXNoX2xvb2t1cAotICAgICgmKGhhc2hfdGFibGUpLT5yb290LCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICBpZiAobXloICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAodG1wX25hbWUpOwotICAgICAgcmV0dXJuOwkJCS8qIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGd1eSAqLwotICAgIH0KLQotICBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAobGlua19pbmZvLCBoYXNoX3RhYmxlLT5iZmRfb2ZfZ2x1ZV9vd25lciwgdG1wX25hbWUsCi0JCQkgICAgIEJTRl9HTE9CQUwsIHMsIGhhc2hfdGFibGUtPnRodW1iX2dsdWVfc2l6ZSArIDEsCi0JCQkJICAgIE5VTEwsIHRydWUsIGZhbHNlLAotCQkJCSAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZteWgpOwotCi0gIC8qIElmIHdlIG1hcmsgaXQgJ3RodW1iJywgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGRvIGEgYmV0dGVyIGpvYi4gICovCi0gIGJpbmQgPSBFTEZfU1RfQklORCAobXloLT50eXBlKTsKLSAgbXloLT50eXBlID0gRUxGX1NUX0lORk8gKGJpbmQsIFNUVF9BUk1fVEZVTkMpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICAvKiBBbGxvY2F0ZSBhbm90aGVyIHN5bWJvbCB0byBtYXJrIHdoZXJlIHdlIHN3aXRjaCB0byBhcm0gbW9kZS4gICovCi0KLSNkZWZpbmUgQ0hBTkdFX1RPX0FSTSAiX18lc19jaGFuZ2VfdG9fYXJtIgotI2RlZmluZSBCQUNLX0ZST01fQVJNICJfXyVzX2JhY2tfZnJvbV9hcm0iCi0KLSAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChDSEFOR0VfVE9fQVJNKSArIDEpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgQ0hBTkdFX1RPX0FSTSwgbmFtZSk7Ci0KLSAgbXloID0gTlVMTDsKLQotICBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAobGlua19pbmZvLCBoYXNoX3RhYmxlLT5iZmRfb2ZfZ2x1ZV9vd25lciwgdG1wX25hbWUsCi0JCQkgICAgICBCU0ZfTE9DQUwsIHMsIGhhc2hfdGFibGUtPnRodW1iX2dsdWVfc2l6ZSArIDQsCi0JCQkJICAgIE5VTEwsIHRydWUsIGZhbHNlLAotCQkJCSAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZteWgpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsKLQotICBoYXNoX3RhYmxlLT50aHVtYl9nbHVlX3NpemUgKz0gVEhVTUIyQVJNX0dMVUVfU0laRTsKLQotICByZXR1cm47Ci19Ci0KLS8qIFNlbGVjdCBhIEJGRCB0byBiZSB1c2VkIHRvIGhvbGQgdGhlIHNlY3Rpb25zIHVzZWQgYnkgdGhlIGdsdWUgY29kZS4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGxpbmtlciBzY3JpcHRzIGluIGxkL2VtdWx0ZW1wbC8KLSAgIHthcm1lbGYvcGV9LmVtICAqLwotYm9vbGVhbgotYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpnbG9iYWxzOwotICBmbGFnd29yZCBmbGFnczsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICAvKiBJZiB3ZSBhcmUgb25seSBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rIGRvIG5vdCBib3RoZXIKLSAgICAgZ2V0dGluZyBhIGJmZCB0byBob2xkIHRoZSBnbHVlLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0KLSAgaWYgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vdGU6IHdlIGRvIG5vdCBpbmNsdWRlIHRoZSBmbGFnIFNFQ19MSU5LRVJfQ1JFQVRFRCwgYXMgdGhpcwotCSB3aWxsIHByZXZlbnQgZWxmX2xpbmtfaW5wdXRfYmZkKCkgZnJvbSBwcm9jZXNzaW5nIHRoZSBjb250ZW50cwotCSBvZiB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0NPREUgfCBTRUNfUkVBRE9OTFk7Ci0KLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIGlmIChzZWMgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncykKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgLyogU2V0IHRoZSBnYyBtYXJrIHRvIHByZXZlbnQgdGhlIHNlY3Rpb24gZnJvbSBiZWluZyByZW1vdmVkIGJ5IGdhcmJhZ2UKLQkgY29sbGVjdGlvbiwgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IG5vIHJlbG9jcyByZWZlciB0byB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgc2VjLT5nY19tYXJrID0gMTsKLSAgICB9Ci0KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZOwotCi0gICAgICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gICAgICBpZiAoc2VjID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIHNlYy0+Z2NfbWFyayA9IDE7Ci0gICAgfQotCi0gIC8qIFNhdmUgdGhlIGJmZCBmb3IgbGF0ZXIgdXNlLiAgKi8KLSAgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgPSBhYmZkOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1iZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGFiZmQsIGxpbmtfaW5mbywgbm9fcGlwZWxpbmVfa25vd2xlZGdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGludCBub19waXBlbGluZV9rbm93bGVkZ2U7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0gIGFzZWN0aW9uICpzZWM7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpnbG9iYWxzOwotCi0gIC8qIElmIHdlIGFyZSBvbmx5IHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmsgZG8gbm90IGJvdGhlcgotICAgICB0byBjb25zdHJ1Y3QgYW55IGdsdWUuICAqLwotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSGVyZSB3ZSBoYXZlIGEgYmZkIHRoYXQgaXMgdG8gYmUgaW5jbHVkZWQgb24gdGhlIGxpbmsuICBXZSBoYXZlIGEgaG9vawotICAgICB0byBkbyByZWxvYyBydW1tYWdpbmcsIGJlZm9yZSBzZWN0aW9uIHNpemVzIGFyZSBuYWlsZWQgZG93bi4gICovCi0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChsaW5rX2luZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIGdsb2JhbHMtPm5vX3BpcGVsaW5lX2tub3dsZWRnZSA9IG5vX3BpcGVsaW5lX2tub3dsZWRnZTsKLQotICAvKiBSdW1tYWdlIGFyb3VuZCBhbGwgdGhlIHJlbG9jcyBhbmQgbWFwIHRoZSBnbHVlIHZlY3RvcnMuICAqLwotICBzZWMgPSBhYmZkLT5zZWN0aW9uczsKLQotICBpZiAoc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yICg7IHNlYyAhPSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICAgICAgLyogTG9hZCB0aGUgcmVsb2NzLiAgKi8KLQotICAgICAgaXJlbCA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwKLQkJCQkJKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGlyZWwgIT0gMCk7Ci0KLSAgICAgIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLSAgICAgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotCXsKLQkgIGxvbmcgcl90eXBlOwotCSAgdW5zaWduZWQgbG9uZyByX2luZGV4OwotCi0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pOwotCSAgcl9pbmRleCA9IEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pOwotCi0JICAvKiBUaGVzZSBhcmUgdGhlIG9ubHkgcmVsb2NhdGlvbiB0eXBlcyB3ZSBjYXJlIGFib3V0ICovCi0JICBpZiAoICAgcl90eXBlICE9IFJfQVJNX1BDMjQKLQkgICAgICAmJiByX3R5cGUgIT0gUl9BUk1fVEhNX1BDMjIpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkJY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JCSAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JCSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCi0JICAvKiBSZWFkIHRoaXMgQkZEJ3Mgc3ltYm9scyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0JICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JCWV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkJICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSAgICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOwotCQkgIGlmIChleHRzeW1zID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBmcmVlX2V4dHN5bXMgPSBleHRzeW1zOwotCQkgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCQkgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCi0JICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBub3QgYWdhaW5zdCBhIHN5bWJvbCBpdCBjYW5ub3QgY29uY2VybiB1cy4gKi8KLQotCSAgaCA9IE5VTEw7Ci0KLQkgIC8qIFdlIGRvbid0IGNhcmUgYWJvdXQgbG9jYWwgc3ltYm9scyAqLwotCSAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogVGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wgKi8KLQkgIHJfaW5kZXggLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICAgZWxmX3N5bV9oYXNoZXMgKGFiZmQpW3JfaW5kZXhdOwotCi0JICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBhZ2FpbnN0IGEgc3RhdGljIHN5bWJvbCBpdCBtdXN0IGJlIHdpdGhpbgotCSAgICAgdGhlIGN1cnJlbnQgc2VjdGlvbiBhbmQgc28gY2Fubm90IGJlIGEgY3Jvc3MgQVJNL1RodW1iIHJlbG9jYXRpb24uICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIHN3aXRjaCAocl90eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgUl9BUk1fUEMyNDoKLQkgICAgICAvKiBUaGlzIG9uZSBpcyBhIGNhbGwgZnJvbSBhcm0gY29kZS4gIFdlIG5lZWQgdG8gbG9vayB1cAotCSAgICAgICAgIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwuIElmIGl0IGlzIGEgdGh1bWIgdGFyZ2V0LCB3ZQotCSAgICAgICAgIGluc2VydCBnbHVlLiAgKi8KLQotCSAgICAgIGlmIChFTEZfU1RfVFlQRShoLT50eXBlKSA9PSBTVFRfQVJNX1RGVU5DKQotCQlyZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUgKGxpbmtfaW5mbywgaCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX0FSTV9USE1fUEMyMjoKLQkgICAgICAvKiBUaGlzIG9uZSBpcyBhIGNhbGwgZnJvbSB0aHVtYiBjb2RlLiAgV2UgbG9vawotCSAgICAgICAgIHVwIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwuIElmIGl0IGlzIG5vdCBhIHRodW1iCi0gICAgICAgICAgICAgICAgIHRhcmdldCwgd2UgaW5zZXJ0IGdsdWUuICAqLwotCi0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChoLT50eXBlKSAhPSBTVFRfQVJNX1RGVU5DKQotCQlyZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGxpbmtfaW5mbywgaCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci1lcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gIHJldHVybiBmYWxzZTsKLQotfQotCi0vKiBUaGUgdGh1bWIgZm9ybSBvZiBhIGxvbmcgYnJhbmNoIGlzIGEgYml0IGZpbmlja3ksIGJlY2F1c2UgdGhlIG9mZnNldAotICAgZW5jb2RpbmcgaXMgc3BsaXQgb3ZlciB0d28gZmllbGRzLCBlYWNoIGluIGl0J3Mgb3duIGluc3RydWN0aW9uLiBUaGV5Ci0gICBjYW4gb2NjdXIgaW4gYW55IG9yZGVyLiBTbyBnaXZlbiBhIHRodW1iIGZvcm0gb2YgbG9uZyBicmFuY2gsIGFuZCBhbgotICAgb2Zmc2V0LCBpbnNlcnQgdGhlIG9mZnNldCBpbnRvIHRoZSB0aHVtYiBicmFuY2ggYW5kIHJldHVybiBmaW5pc2hlZAotICAgaW5zdHJ1Y3Rpb24uCi0KLSAgIEl0IHRha2VzIHR3byB0aHVtYiBpbnN0cnVjdGlvbnMgdG8gZW5jb2RlIHRoZSB0YXJnZXQgYWRkcmVzcy4gRWFjaCBoYXMKLSAgIDExIGJpdHMgdG8gaW52ZXN0LiBUaGUgdXBwZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIG9uZSAoaWRlbnRpZmVkIGJ5Ci0gICBILTAuLiBzZWUgYmVsb3cpLCB0aGUgbG93ZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIHRoZSBvdGhlciAoaWRlbnRpZmllZAotICAgYnkgSC0xKS4KLQotICAgQ29tYmluZSB0b2dldGhlciBhbmQgc2hpZnRlZCBsZWZ0IGJ5IDEgKGl0J3MgYSBoYWxmIHdvcmQgYWRkcmVzcykgYW5kCi0gICB0aGVyZSB5b3UgaGF2ZSBpdC4KLQotICAgT3A6IDExMTEgPSBGLAotICAgSC0wLCB1cHBlciBhZGRyZXNzLTAgPSAwMDAKLSAgIE9wOiAxMTExID0gRiwKLSAgIEgtMSwgbG93ZXIgYWRkcmVzcy0wID0gODAwCi0KLSAgIFRoZXkgY2FuIGJlIG9yZGVyZWQgZWl0aGVyIHdheSwgYnV0IHRoZSBhcm0gdG9vbHMgSSd2ZSBzZWVuIGFsd2F5cyBwdXQKLSAgIHRoZSBsb3dlciBvbmUgZmlyc3QuIEl0IHByb2JhYmx5IGRvZXNuJ3QgbWF0dGVyLiBrcmtAY3lnbnVzLmNvbQotCi0gICBYWFg6ICBBY3R1YWxseSB0aGUgb3JkZXIgZG9lcyBtYXR0ZXIuICBUaGUgc2Vjb25kIGluc3RydWN0aW9uIChILTEpCi0gICBtb3ZlcyB0aGUgY29tcHV0ZWQgYWRkcmVzcyBpbnRvIHRoZSBQQywgc28gaXQgbXVzdCBiZSB0aGUgc2Vjb25kIG9uZQotICAgaW4gdGhlIHNlcXVlbmNlLiAgVGhlIHByb2JsZW0sIGhvd2V2ZXIgaXMgdGhhdCB3aGlsc3QgbGl0dGxlIGVuZGlhbiBjb2RlCi0gICBzdG9yZXMgdGhlIGluc3RydWN0aW9ucyBpbiBISSB0aGVuIExPVyBvcmRlciwgYmlnIGVuZGlhbiBjb2RlIGRvZXMgdGhlCi0gICByZXZlcnNlLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLQotI2RlZmluZSBMT1dfSElfT1JERVIgMHhGODAwRjAwMAotI2RlZmluZSBISV9MT1dfT1JERVIgMHhGMDAwRjgwMAotCi1zdGF0aWMgaW5zbjMyCi1pbnNlcnRfdGh1bWJfYnJhbmNoIChicl9pbnNuLCByZWxfb2ZmKQotICAgICBpbnNuMzIgYnJfaW5zbjsKLSAgICAgaW50IHJlbF9vZmY7Ci17Ci0gIHVuc2lnbmVkIGludCBsb3dfYml0czsKLSAgdW5zaWduZWQgaW50IGhpZ2hfYml0czsKLQotCi0gIEJGRF9BU1NFUlQgKChyZWxfb2ZmICYgMSkgIT0gMSk7Ci0KLSAgcmVsX29mZiA+Pj0gMTsJCS8qIGhhbGYgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KLSAgbG93X2JpdHMgPSByZWxfb2ZmICYgMHgwMDAwMDdGRjsJLyogdGhlIGJvdHRvbSAxMSBiaXRzICovCi0gIGhpZ2hfYml0cyA9IChyZWxfb2ZmID4+IDExKSAmIDB4MDAwMDA3RkY7CS8qIHRoZSB0b3AgMTEgYml0cyAqLwotCi0gIGlmICgoYnJfaW5zbiAmIExPV19ISV9PUkRFUikgPT0gTE9XX0hJX09SREVSKQotICAgIGJyX2luc24gPSBMT1dfSElfT1JERVIgfCAobG93X2JpdHMgPDwgMTYpIHwgaGlnaF9iaXRzOwotICBlbHNlIGlmICgoYnJfaW5zbiAmIEhJX0xPV19PUkRFUikgPT0gSElfTE9XX09SREVSKQotICAgIGJyX2luc24gPSBISV9MT1dfT1JERVIgfCAoaGlnaF9iaXRzIDw8IDE2KSB8IGxvd19iaXRzOwotICBlbHNlCi0gICAgYWJvcnQgKCk7CQkJLyogZXJyb3IgLSBub3QgYSB2YWxpZCBicmFuY2ggaW5zdHJ1Y3Rpb24gZm9ybSAqLwotCi0gIC8qIEZJWE1FOiBhYm9ydCBpcyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IGNhbGwuIGtya0BjeWdudXMuY29tICovCi0KLSAgcmV0dXJuIGJyX2luc247Ci19Ci0KLS8qIFRodW1iIGNvZGUgY2FsbGluZyBhbiBBUk0gZnVuY3Rpb24gKi8KLXN0YXRpYyBpbnQKLWVsZjMyX3RodW1iX3RvX2FybV9zdHViIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgaGl0X2RhdGEsIHN5bV9zZWMsIG9mZnNldCwgYWRkZW5kLCB2YWwpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgY29uc3QgY2hhciAqICAgICAgICAgICBuYW1lOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgaGl0X2RhdGE7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgc3ltX3NlYzsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICBvZmZzZXQ7Ci0gICAgIGJmZF9zaWduZWRfdm1hICAgICAgICAgYWRkZW5kOwotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgIHZhbDsKLXsKLSAgYXNlY3Rpb24gKiBzID0gMDsKLSAgbG9uZyBpbnQgbXlfb2Zmc2V0OwotICB1bnNpZ25lZCBsb25nIGludCB0bXA7Ci0gIGxvbmcgaW50IHJldF9vZmZzZXQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgbXloID0gZmluZF90aHVtYl9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpOwotICBpZiAobXloID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgbXlfb2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsCi0JCQkgICAgICAgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChzLT5jb250ZW50cyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCk7Ci0KLSAgaWYgKChteV9vZmZzZXQgJiAweDAxKSA9PSAweDAxKQotICAgIHsKLSAgICAgIGlmIChzeW1fc2VjICE9IE5VTEwKLQkgICYmIHN5bV9zZWMtPm93bmVyICE9IE5VTEwKLQkgICYmICFJTlRFUldPUktfRkxBRyAoc3ltX3NlYy0+b3duZXIpKQotCXsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlcgotCSAgICAoXyAoIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoc3ltX3NlYy0+b3duZXIpLCBuYW1lKTsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlcgotCSAgICAoXyAoIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IHRodW1iIGNhbGwgdG8gYXJtIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLS1teV9vZmZzZXQ7Ci0gICAgICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTFfYnhfcGNfaW5zbiwKLQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCk7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTJfbm9vcF9pbnNuLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgMik7Ci0KLSAgICAgIHJldF9vZmZzZXQgPQotCSgoYmZkX3NpZ25lZF92bWEpIHZhbCkJLyogQWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBvZiB0aGUgc3R1YiAqLwotCS0gKChiZmRfc2lnbmVkX3ZtYSkKLQkgICAocy0+b3V0cHV0X29mZnNldAkvKiBPZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbiB0byB0aGUgc3RhcnQgb2YgdGhlIHN0dWJzLiAgKi8KLQkgICAgKyBteV9vZmZzZXQJCS8qIE9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhpcyBzdHViIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHVicy4gICovCi0JICAgICsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSkJLyogQWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi0JICAgKyA0CQkJLyogVGhlIGJyYW5jaCBpbnN0cnVjdGlvbiBpcyA0IGJ5dGVzIGludG8gdGhlIHN0dWIuICAqLwotCSAgICsgOCk7CQkvKiBBUk0gYnJhbmNoZXMgd29yayBmcm9tIHRoZSBwYyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKyA4LiAgKi8KLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICB0MmEzX2JfaW5zbiB8ICgocmV0X29mZnNldCA+PiAyKSAmIDB4MDBGRkZGRkYpLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKG15X29mZnNldCA8PSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUpOwotCi0gIC8qIE5vdyBnbyBiYWNrIGFuZCBmaXggdXAgdGhlIG9yaWdpbmFsIEJMIGluc24gdG8gcG9pbnQKLSAgICAgdG8gaGVyZS4gICovCi0gIHJldF9vZmZzZXQgPQotICAgIHMtPm91dHB1dF9vZmZzZXQKLSAgICArIG15X29mZnNldAotICAgIC0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICAgICArIG9mZnNldCArIGFkZGVuZCkKLSAgICAtIDQ7Ci0KLSAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YQotCQkgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0gIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JICAgICAgaW5zZXJ0X3RodW1iX2JyYW5jaCAodG1wLCByZXRfb2Zmc2V0KSwKLQkgICAgICBoaXRfZGF0YSAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFybSBjb2RlIGNhbGxpbmcgYSBUaHVtYiBmdW5jdGlvbiAqLwotc3RhdGljIGludAotZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSBoaXRfZGF0YSwgc3ltX3NlYywgb2Zmc2V0LCBhZGRlbmQsIHZhbCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBjb25zdCBjaGFyICogICAgICAgICAgIG5hbWU7Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICBoaXRfZGF0YTsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBzeW1fc2VjOwotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgIG9mZnNldDsKLSAgICAgYmZkX3NpZ25lZF92bWEgICAgICAgICBhZGRlbmQ7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgdmFsOwotewotICB1bnNpZ25lZCBsb25nIGludCB0bXA7Ci0gIGxvbmcgaW50IG15X29mZnNldDsKLSAgYXNlY3Rpb24gKiBzOwotICBsb25nIGludCByZXRfb2Zmc2V0OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIG15aDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOwotCi0gIG15aCA9IGZpbmRfYXJtX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCk7Ci0gIGlmIChteWggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBteV9vZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsCi0JCQkgICAgICAgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAocy0+Y29udGVudHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpOwotCi0gIGlmICgobXlfb2Zmc2V0ICYgMHgwMSkgPT0gMHgwMSkKLSAgICB7Ci0gICAgICBpZiAoc3ltX3NlYyAhPSBOVUxMCi0JICAmJiBzeW1fc2VjLT5vd25lciAhPSBOVUxMCi0JICAmJiAhSU5URVJXT1JLX0ZMQUcgKHN5bV9zZWMtPm93bmVyKSkKLQl7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkgICAgKF8gKCIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHN5bV9zZWMtPm93bmVyKSwgbmFtZSk7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkgICAgKF8gKCIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiBhcm0gY2FsbCB0byB0aHVtYiIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JfQotICAgICAgLS1teV9vZmZzZXQ7Ci0gICAgICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGEydDFfbGRyX2luc24sCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQpOwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhMnQyX2J4X3IxMl9pbnNuLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7Ci0KLSAgICAgIC8qIEl0J3MgYSB0aHVtYiBhZGRyZXNzLiAgQWRkIHRoZSBsb3cgb3JkZXIgYml0LiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbCB8IGEydDNfZnVuY19hZGRyX2luc24sCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA4KTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAobXlfb2Zmc2V0IDw9IGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotCi0gIHRtcCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpOwotICB0bXAgPSB0bXAgJiAweEZGMDAwMDAwOwotCi0gIC8qIFNvbWVob3cgdGhlc2UgYXJlIGJvdGggNCB0b28gZmFyLCBzbyBzdWJ0cmFjdCA4LiAqLwotICByZXRfb2Zmc2V0ID0gcy0+b3V0cHV0X29mZnNldAotICAgICsgbXlfb2Zmc2V0Ci0gICAgKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotICAgICAgICsgb2Zmc2V0ICsgYWRkZW5kKQotICAgIC0gODsKLSAgCi0gIHRtcCA9IHRtcCB8ICgocmV0X29mZnNldCA+PiAyKSAmIDB4MDBGRkZGRkYpOwotCi0gIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHRtcCwgaGl0X2RhdGEKLQkgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJICAgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWwsIHZhbHVlLAotCQkJICAgICAgIGluZm8sIHN5bV9zZWMsIHN5bV9uYW1lLCBzeW1fZmxhZ3MsIGgpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgaG93dG87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiAgICByZWw7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgdmFsdWU7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBzeW1fc2VjOwotICAgICBjb25zdCBjaGFyICogICAgICAgICAgIHN5bV9uYW1lOwotICAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgIHN5bV9mbGFnczsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotewotICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICByX3R5cGUgPSBob3d0by0+dHlwZTsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgcl9zeW1uZHg7Ci0gIGJmZF9ieXRlICogICAgICAgICAgICAgICAgICAgIGhpdF9kYXRhID0gY29udGVudHMgKyByZWwtPnJfb2Zmc2V0OwotICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICAgICBkeW5vYmogPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBiZmRfdm1hICogICAgICAgICAgICAgICAgICAgICBsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgc2dvdCA9IE5VTEw7Ci0gIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgIHNwbHQgPSBOVUxMOwotICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICBzcmVsb2MgPSBOVUxMOwotICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICBhZGRlbmQ7Ci0gIGJmZF9zaWduZWRfdm1hICAgICAgICAgICAgICAgIHNpZ25lZF9hZGRlbmQ7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBpZiAoZHlub2JqKQotICAgIHsKLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgfQotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0gIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotI2lmZGVmIFVTRV9SRUwKLSAgYWRkZW5kID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiBob3d0by0+c3JjX21hc2s7Ci0KLSAgaWYgKGFkZGVuZCAmICgoaG93dG8tPnNyY19tYXNrICsgMSkgPj4gMSkpCi0gICAgewotICAgICAgc2lnbmVkX2FkZGVuZCA9IC0xOwotICAgICAgc2lnbmVkX2FkZGVuZCAmPSB+IGhvd3RvLT5zcmNfbWFzazsKLSAgICAgIHNpZ25lZF9hZGRlbmQgfD0gYWRkZW5kOwotICAgIH0KLSAgZWxzZQotICAgIHNpZ25lZF9hZGRlbmQgPSBhZGRlbmQ7Ci0jZWxzZQotICBhZGRlbmQgPSBzaWduZWRfYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLSNlbmRpZgotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfQVJNX05PTkU6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9QQzI0OgotICAgIGNhc2UgUl9BUk1fQUJTMzI6Ci0gICAgY2FzZSBSX0FSTV9SRUwzMjoKLSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlIHJlbG9jYXRpb25zIGFyZSBjb3BpZWQKLQkgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuIHRpbWUuICovCi0KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChyX3R5cGUgIT0gUl9BUk1fUEMyNAotIAkgICAgICB8fCAoaCAhPSBOVUxMCi0JICAgICAgICAgICYmIGgtPmR5bmluZHggIT0gLTEKLQkJICAmJiAoISBpbmZvLT5zeW1ib2xpYwotCQkgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkpCi0JewotCSAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7Ci0JICBib29sZWFuIHNraXAsIHJlbG9jYXRlOwotCi0JICBpZiAoc3JlbG9jID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICogbmFtZTsKLQotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLAotCQkgICAgICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAotCQkJICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgaW5wdXRfc2VjdGlvbiksCi0JCQkJICAgICBuYW1lICsgNCkgPT0gMCk7Ci0KLQkgICAgICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgc2tpcCA9IGZhbHNlOwotCi0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCSAgICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCSAgICAgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgJiBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkgICAgICByZWwtPnJfb2Zmc2V0KSk7Ci0JICAgICAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCXNraXAgPSB0cnVlOwotCSAgICAgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkgICAgfQotCi0JICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgIGlmIChza2lwKQotCSAgICB7Ci0JICAgICAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkgICAgICByZWxvY2F0ZSA9IGZhbHNlOwotCSAgICB9Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9BUk1fUEMyNCkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCAmJiBoLT5keW5pbmR4ICE9IC0xKTsKLQkgICAgICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQlyZWxvY2F0ZSA9IGZhbHNlOwotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGUgPSB0cnVlOwotCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfQVJNX1BDMjQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaCA9PSBOVUxMCi0JCSAgfHwgKChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCQl7Ci0JCSAgcmVsb2NhdGUgPSB0cnVlOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfQVJNX1JFTEFUSVZFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgIGVsc2UKLQkJICAgIHJlbG9jYXRlID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9BQlMzMik7Ci0JCX0KLQkgICAgfQotCi0JICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJICAgICgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCSAgICAgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJICAgICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQkgIAotCSAgLyogSWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG8gbm90IHdhbnQgdG8KLQkgICAgIGZpZGRsZSB3aXRoIHRoZSBhZGRlbmQuICBPdGhlcndpc2UsIHdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgc3ltYm9sCi0JICAgICB2YWx1ZSBzbyB0aGF0IGl0IGJlY29tZXMgYW4gYWRkZW5kIGZvciB0aGUgZHluYW1pYyByZWxvYy4gKi8KLQkgIGlmICghIHJlbG9jYXRlKQotCSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0JICAKLQkgIHJldHVybiBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKLQkJCQkJICAgKGJmZF92bWEpIDApOwotCX0KLSAgICAgIGVsc2Ugc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9BUk1fUEMyNDoKLQkgIC8qIEFybSBCL0JMIGluc3RydWN0aW9uICovCi0KLQkgIC8qIENoZWNrIGZvciBhcm0gY2FsbGluZyB0aHVtYiBmdW5jdGlvbi4gICovCi0JICBpZiAoc3ltX2ZsYWdzID09IFNUVF9BUk1fVEZVTkMpCi0JICAgIHsKLQkgICAgICBlbGYzMl9hcm1fdG9fdGh1bWJfc3R1YiAoaW5mbywgc3ltX25hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgaGl0X2RhdGEsIHN5bV9zZWMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJICAgICAgIHNpZ25lZF9hZGRlbmQsIHZhbHVlKTsKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0KLQkgIGlmICggICBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCAiZWxmMzItbGl0dGxlYXJtLW9hYmkiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChiZmRfZ2V0X3RhcmdldCAoaW5wdXRfYmZkKSwgImVsZjMyLWJpZ2FybS1vYWJpIikgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBvbGQgd2F5IG9mIGRvaW5nIHRoaW5ncy4gIFRyZWFyaW5nIHRoZSBhZGRlbmQgYXMgYQotCQkgYnl0ZSBzaXplZCBmaWVsZCBhbmQgYWRkaW5nIGluIHRoZSBwaXBlbGluZSBvZmZzZXQuICAqLwotCi0JICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgdmFsdWUgLT0gcmVsLT5yX29mZnNldDsKLQkgICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLQkgICAgICBpZiAoISBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UpCi0JCXZhbHVlIC09IDg7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoZSBBUk0gRUxGIEFCSSBzYXlzIHRoYXQgdGhpcyByZWxvYyBpcyBjb21wdXRlZCBhczogUyAtIFAgKyBBCi0JCSB3aGVyZToKLQkJICBTIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgaW4gdGhlIHJlbG9jYXRpb24uCi0JCSAgUCBpcyBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiBiZWluZyByZWxvY2F0ZWQuCi0JCSAgQSBpcyB0aGUgYWRkZW5kIChleHRyYWN0ZWQgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24pIGluIGJ5dGVzLgotCi0JCSBTIGlzIGhlbGQgaW4gJ3ZhbHVlJy4KLQkJIFAgaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBpbnN0cnVjdGlvbgotCQkgICBwbHVzIHRoZSBvZmZzZXQgb2YgdGhlIHJlbG9jIGludG8gdGhhdCBzZWN0aW9uLCBpZToKLQkJICAgICAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKwotCQkgICAgICByZWwtPnJfb2Zmc2V0KS4KLQkJIEEgaXMgdGhlIGFkZGVuZCwgY29udmVydGVkIGludG8gYnl0ZXMsIGllOgotCQkgICAgIChzaWduZWRfYWRkZW5kICogNCkKLQotCQkgTm90ZTogTm9uZSBvZiB0aGVzZSBvcGVyYXRpb25zIGhhdmUga25vd2xlZGdlIG9mIHRoZSBwaXBlbGluZQotCQkgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yLCB0aHVzIGl0IGlzIHVwIHRvIHRoZSBhc3NlbWJsZXIgdG8gZW5jb2RlCi0JCSB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGFkZGVuZC4gICovCi0KLQkgICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB2YWx1ZSAtPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIHZhbHVlICs9IChzaWduZWRfYWRkZW5kIDw8IGhvd3RvLT5zaXplKTsKLQotCSAgICAgIC8qIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgY29kZSBhbHNvIHVzZWQgdG8gYWRkIGluIHRoZSBwaXBlbGluZQotCQkgb2Zmc2V0IGhlcmUuICBUaGlzIGlzIHdyb25nIGJlY2F1c2UgdGhlIGxpbmtlciBpcyBub3Qgc3VwcG9zZWQKLQkJIHRvIGtub3cgYWJvdXQgc3VjaCB0aGluZ3MsIGFuZCBvbmUgZGF5IGl0IG1pZ2h0IGNoYW5nZS4gIEluIG9yZGVyCi0JCSB0byBzdXBwb3J0IG9sZCBiaW5hcmllcyB0aGF0IG5lZWQgdGhlIG9sZCBiZWhhdmlvdXIgaG93ZXZlciwgc28KLQkJIHdlIGF0dGVtcHQgdG8gZGV0ZWN0IHdoaWNoIEFCSSB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoISBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UpCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfRWhkciAqIGlfZWhkcnA7IC8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotCi0JCSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCk7Ci0KLQkJICBpZiAoaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gPT0gMCkKLQkJICAgIHZhbHVlIC09IDg7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBJdCBpcyBub3QgYW4gZXJyb3IgZm9yIGFuIHVuZGVmaW5lZCB3ZWFrIHJlZmVyZW5jZSB0byBiZQotCSAgICAgb3V0IG9mIHJhbmdlLiAgQW55IHByb2dyYW0gdGhhdCBicmFuY2hlcyB0byBzdWNoIGEgc3ltYm9sCi0JICAgICBpcyBnb2luZyB0byBjcmFzaCBhbnl3YXksIHNvIHRoZXJlIGlzIG5vIHBvaW50IHdvcnJ5aW5nIAotCSAgICAgYWJvdXQgZ2V0dGluZyB0aGUgZGVzdGluYXRpb24gZXhhY3RseSByaWdodC4gICovCSAgICAgCi0JICBpZiAoISBoIHx8IGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFBlcmZvcm0gYSBzaWduZWQgcmFuZ2UgY2hlY2suICAqLwotCSAgICAgIHNpZ25lZF9hZGRlbmQgPSB2YWx1ZTsKLQkgICAgICBzaWduZWRfYWRkZW5kID4+PSBob3d0by0+cmlnaHRzaGlmdDsKLQkgICAgICBpZiAoc2lnbmVkX2FkZGVuZCA+ICgoYmZkX3NpZ25lZF92bWEpKGhvd3RvLT5kc3RfbWFzayA+PiAxKSkKLQkJICB8fCBzaWduZWRfYWRkZW5kIDwgLSAoKGJmZF9zaWduZWRfdm1hKSAoKGhvd3RvLT5kc3RfbWFzayArIDEpID4+IDEpKSkKLQkJcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgICAgfQotCSAgICAgIAotCSAgdmFsdWUgPSAoc2lnbmVkX2FkZGVuZCAmIGhvd3RvLT5kc3RfbWFzaykKLQkgICAgfCAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAofiBob3d0by0+ZHN0X21hc2spKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0FSTV9BQlMzMjoKLQkgIHZhbHVlICs9IGFkZGVuZDsKLQkgIGlmIChzeW1fZmxhZ3MgPT0gU1RUX0FSTV9URlVOQykKLQkgICAgdmFsdWUgfD0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0FSTV9SRUwzMjoKLQkgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgKz0gYWRkZW5kOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9BQlM4OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2YgfHwgKGxvbmcpIHZhbHVlIDwgLTB4ODApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9BQlMxNjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2ZmZiB8fCAobG9uZykgdmFsdWUgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX0FCUzEyOgotICAgICAgLyogU3VwcG9ydCBsZHIgYW5kIHN0ciBpbnN0cnVjdGlvbiBmb3IgdGhlIGFybSAqLwotICAgICAgLyogQWxzbyB0aHVtYiBiICh1bmNvbmRpdGlvbmFsIGJyYW5jaCkuICA/Pz8gUmVhbGx5PyAgKi8KLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2ZmIHx8IChsb25nKSB2YWx1ZSA8IC0weDgwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICB2YWx1ZSB8PSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAweGZmZmZmMDAwKTsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX1RITV9BQlM1OgotICAgICAgLyogU3VwcG9ydCBsZHIgYW5kIHN0ciBpbnN0cnVjdGlvbnMgZm9yIHRoZSB0aHVtYi4gKi8KLSNpZmRlZiBVU0VfUkVMCi0gICAgICAvKiBOZWVkIHRvIHJlZmV0Y2ggYWRkZW5kLiAgKi8KLSAgICAgIGFkZGVuZCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgaG93dG8tPnNyY19tYXNrOwotICAgICAgLyogPz8/IE5lZWQgdG8gZGV0ZXJtaW5lIHNoaWZ0IGFtb3VudCBmcm9tIG9wZXJhbmQgc2l6ZS4gICovCi0gICAgICBhZGRlbmQgPj49IGhvd3RvLT5yaWdodHNoaWZ0OwotI2VuZGlmCi0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIC8qID8/PyBJc24ndCB2YWx1ZSB1bnNpZ25lZD8gICovCi0gICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHgxZiB8fCAobG9uZykgdmFsdWUgPCAtMHgxMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICAvKiA/Pz8gVmFsdWUgbmVlZHMgdG8gYmUgcHJvcGVybHkgc2hpZnRlZCBpbnRvIHBsYWNlIGZpcnN0LiAgKi8KLSAgICAgIHZhbHVlIHw9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHhmODNmOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9BUk1fVEhNX1BDMjI6Ci0gICAgICAvKiBUaHVtYiBCTCAoYnJhbmNoIGxvbmcgaW5zdHJ1Y3Rpb24pLiAqLwotICAgICAgewotCWJmZF92bWEgICAgICAgIHJlbG9jYXRpb247Ci0JYm9vbGVhbiAgICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLQliZmRfdm1hICAgICAgICB1cHBlcl9pbnNuID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSk7Ci0JYmZkX3ZtYSAgICAgICAgbG93ZXJfaW5zbiA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEgKyAyKTsKLQliZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWF4ID0gKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMTsKLQliZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWluID0gfiByZWxvY19zaWduZWRfbWF4OwotCWJmZF92bWEgICAgICAgIGNoZWNrOwotCWJmZF9zaWduZWRfdm1hIHNpZ25lZF9jaGVjazsKLQotI2lmZGVmIFVTRV9SRUwKLQkvKiBOZWVkIHRvIHJlZmV0Y2ggdGhlIGFkZGVuZCBhbmQgc3F1aXNoIHRoZSB0d28gMTEgYml0IHBpZWNlcwotCSAgIHRvZ2V0aGVyLiAgKi8KLQl7Ci0JICBiZmRfdm1hIHVwcGVyID0gdXBwZXJfaW5zbiAmIDB4N2ZmOwotCSAgYmZkX3ZtYSBsb3dlciA9IGxvd2VyX2luc24gJiAweDdmZjsKLQkgIHVwcGVyID0gKHVwcGVyIF4gMHg0MDApIC0gMHg0MDA7IC8qIHNpZ24gZXh0ZW5kICovCi0JICBhZGRlbmQgPSAodXBwZXIgPDwgMTIpIHwgKGxvd2VyIDw8IDEpOwotCSAgc2lnbmVkX2FkZGVuZCA9IGFkZGVuZDsKLQl9Ci0jZW5kaWYKLQotICAgICAgICAvKiBJZiBpdCBpcyBub3QgYSBjYWxsIHRvIHRodW1iLCBhc3N1bWUgY2FsbCB0byBhcm0uCi0JICAgSWYgaXQgaXMgYSBjYWxsIHJlbGF0aXZlIHRvIGEgc2VjdGlvbiBuYW1lLCB0aGVuIGl0IGlzIG5vdCBhCi0JICAgZnVuY3Rpb24gY2FsbCBhdCBhbGwsIGJ1dCByYXRoZXIgYSBsb25nIGp1bXAuICAqLwotCWlmIChzeW1fZmxhZ3MgIT0gU1RUX0FSTV9URlVOQyAmJiBzeW1fZmxhZ3MgIT0gU1RUX1NFQ1RJT04pCi0JICB7Ci0JICAgIGlmIChlbGYzMl90aHVtYl90b19hcm1fc3R1YgotCQkoaW5mbywgc3ltX25hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJIGhpdF9kYXRhLCBzeW1fc2VjLCByZWwtPnJfb2Zmc2V0LCBzaWduZWRfYWRkZW5kLCB2YWx1ZSkpCi0JICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQkgICAgZWxzZQotCSAgICAgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCSAgfQotCi0JcmVsb2NhdGlvbiA9IHZhbHVlICsgc2lnbmVkX2FkZGVuZDsKLQotCXJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyByZWwtPnJfb2Zmc2V0KTsKLQkKLQlpZiAoISBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UpCi0JICB7Ci0JICAgIEVsZl9JbnRlcm5hbF9FaGRyICogaV9laGRycDsgLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0JICAgIAotCSAgICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKTsKLQotCSAgICAvKiBQcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGNvZGUgYWxzbyB1c2VkIHRvIGFkZCBpbiB0aGUgcGlwbGluZQotCSAgICAgICBvZmZzZXQgaGVyZS4gIFRoaXMgaXMgd3JvbmcgYmVjYXVzZSB0aGUgbGlua2VyIGlzIG5vdCBzdXBwb3NlZAotCSAgICAgICB0byBrbm93IGFib3V0IHN1Y2ggdGhpbmdzLCBhbmQgb25lIGRheSBpdCBtaWdodCBjaGFuZ2UuICBJbiBvcmRlcgotCSAgICAgICB0byBzdXBwb3J0IG9sZCBiaW5hcmllcyB0aGF0IG5lZWQgdGhlIG9sZCBiZWhhdmlvdXIgaG93ZXZlciwgc28KLQkgICAgICAgd2UgYXR0ZW1wdCB0byBkZXRlY3Qgd2hpY2ggQUJJIHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcmVsb2MuICAqLwotCSAgICBpZiAoICAgc3RyY21wIChiZmRfZ2V0X3RhcmdldCAoaW5wdXRfYmZkKSwgImVsZjMyLWxpdHRsZWFybS1vYWJpIikgPT0gMAotCQl8fCBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCAiZWxmMzItYmlnYXJtLW9hYmkiKSA9PSAwCi0JCXx8IGlfZWhkcnAtPmVfaWRlbnRbRUlfT1NBQkldID09IDApCi0JICAgICAgcmVsb2NhdGlvbiArPSA0OwotCSAgfQotCi0JY2hlY2sgPSByZWxvY2F0aW9uID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotCi0JLyogSWYgdGhpcyBpcyBhIHNpZ25lZCB2YWx1ZSwgdGhlIHJpZ2h0c2hpZnQganVzdCBkcm9wcGVkCi0JICAgbGVhZGluZyAxIGJpdHMgKGFzc3VtaW5nIHR3b3MgY29tcGxlbWVudCkuICAqLwotCWlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPj0gMCkKLQkgIHNpZ25lZF9jaGVjayA9IGNoZWNrOwotCWVsc2UKLQkgIHNpZ25lZF9jaGVjayA9IGNoZWNrIHwgfigoYmZkX3ZtYSkgLTEgPj4gaG93dG8tPnJpZ2h0c2hpZnQpOwotCi0JLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgKi8KLQlpZiAoc2lnbmVkX2NoZWNrID4gcmVsb2Nfc2lnbmVkX21heCB8fCBzaWduZWRfY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQotCSAgb3ZlcmZsb3cgPSB0cnVlOwotCi0JLyogUHV0IFJFTE9DQVRJT04gYmFjayBpbnRvIHRoZSBpbnNuLiAgKi8KLQl1cHBlcl9pbnNuID0gKHVwcGVyX2luc24gJiB+KGJmZF92bWEpIDB4N2ZmKSB8ICgocmVsb2NhdGlvbiA+PiAxMikgJiAweDdmZik7Ci0JbG93ZXJfaW5zbiA9IChsb3dlcl9pbnNuICYgfihiZmRfdm1hKSAweDdmZikgfCAoKHJlbG9jYXRpb24gPj4gMSkgJiAweDdmZik7Ci0KLQkvKiBQdXQgdGhlIHJlbG9jYXRlZCB2YWx1ZSBiYWNrIGluIHRoZSBvYmplY3QgZmlsZTogICovCi0JYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB1cHBlcl9pbnNuLCBoaXRfZGF0YSk7Ci0JYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCBsb3dlcl9pbnNuLCBoaXRfZGF0YSArIDIpOwotCi0JcmV0dXJuIChvdmVyZmxvdyA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vayk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9BUk1fR05VX1ZUSU5IRVJJVDoKLSAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9BUk1fQ09QWToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9HTE9CX0RBVDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9KVU1QX1NMT1Q6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fUkVMQVRJVkU6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fR09UT0ZGOgotICAgICAgLyogUmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlCi0gICAgICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgICAgIGlmIChzZ290ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgICAgCi0gICAgICAvKiBOb3RlIHRoYXQgc2dvdC0+b3V0cHV0X29mZnNldCBpcyBub3QgaW52b2x2ZWQgaW4gdGhpcwotICAgICAgICAgY2FsY3VsYXRpb24uICBXZSBhbHdheXMgd2FudCB0aGUgc3RhcnQgb2YgLmdvdC4gIElmIHdlCi0gICAgICAgICBkZWZpbmUgX0dMT0JBTF9PRkZTRVRfVEFCTEUgaW4gYSBkaWZmZXJlbnQgd2F5LCBhcyBpcwotICAgICAgICAgcGVybWl0dGVkIGJ5IHRoZSBBQkksIHdlIG1pZ2h0IGhhdmUgdG8gY2hhbmdlIHRoaXMKLSAgICAgICAgIGNhbGN1bGF0aW9uLiAqLwotCi0gICAgICB2YWx1ZSAtPSBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgIAkJCQkgICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotICAgICAgCQkJCSAgICAgICAoYmZkX3ZtYSkgMCk7Ci0KLSAgICBjYXNlIFJfQVJNX0dPVFBDOgotICAgICAgLyogVXNlIGdsb2JhbCBvZmZzZXQgdGFibGUgYXMgc3ltYm9sIHZhbHVlLiAqLwotCi0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCi0gICAgICBpZiAoc2dvdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgICAgdmFsdWUgPSBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgIAkJCQkgICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotICAgICAgCQkJCSAgICAgICAoYmZkX3ZtYSkgMCk7Ci0KLSAgICBjYXNlIFJfQVJNX0dPVDMyOgotICAgICAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQotICAgICAgICAgZ2xvYmFsIG9mZnNldCB0YWJsZS4gKi8KLSAgICAgIGlmIChzZ290ID09IE5VTEwpCi0JcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICAgIGlmIChoICE9IE5VTEwpCi0JewotCSAgYmZkX3ZtYSBvZmY7Ci0KLQkgIG9mZiA9IGgtPmdvdC5vZmZzZXQ7Ci0JICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgaWYgKCFlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCB8fAotCSAgICAgIChpbmZvLT5zaGFyZWQgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhIC1Cc3ltYm9saWMgbGluawotCQkgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBsb2NhbGx5LiAgV2UgbXVzdCBpbml0aWFsaXplIHRoaXMKLQkJIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UgdGhlIG9mZnNldCBtdXN0Ci0JCSBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LCB3ZSB1c2UgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdAotCQkgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZSBpbml0aWFsaXplZCBpdCBhbHJlYWR5LgotCi0JCSBXaGVuIGRvaW5nIGEgZHluYW1pYyBsaW5rLCB3ZSBjcmVhdGUgYSAucmVsLmdvdCByZWxvY2F0aW9uCi0JCSBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMgaXMgZG9uZSBpbiB0aGUKLQkJIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAqLwotCi0JICAgICAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQlvZmYgJj0gfjE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdmFsdWUsIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICBoLT5nb3Qub2Zmc2V0IHw9IDE7Ci0JCX0KLQkgICAgfQotCi0JICB2YWx1ZSA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF92bWEgb2ZmOwotCi0JICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMICYmCi0JCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICBvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0KLQkgIC8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LiAgV2UgdXNlIHRoZQotCSAgICAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeQotCSAgICAgZ2VuZXJhdGVkIHRoZSBuZWNlc3NhcnkgcmVsb2MuICovCi0JICBpZiAoKG9mZiAmIDEpICE9IDApCi0JICAgIG9mZiAmPSB+MTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbHVlLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0KLQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQl7Ci0JCSAgYXNlY3Rpb24gKiBzcmVsZ290OwotCQkgIEVsZl9JbnRlcm5hbF9SZWwgb3V0cmVsOwotCi0JCSAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICArIG9mZik7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9BUk1fUkVMQVRJVkUpOwotCQkgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICAgICgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCQkgICAgICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJICAgICArIHNyZWxnb3QtPnJlbG9jX2NvdW50KSk7Ci0JCSAgKytzcmVsZ290LT5yZWxvY19jb3VudDsKLQkJfQotCi0JICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0JICAgIH0KLQotCSAgdmFsdWUgPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOwotCX0KLSAgICAgIAotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgIAkJCQkgICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotICAgICAgCQkJCSAgICAgICAoYmZkX3ZtYSkgMCk7Ci0KLSAgICBjYXNlIFJfQVJNX1BMVDMyOgotICAgICAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQotICAgICAgICAgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0gICAgICAvKiBSZXNvbHZlIGEgUExUMzIgcmVsb2MgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCBkaXJlY3RseSwKLSAgICAgICAgIHdpdGhvdXQgdXNpbmcgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAqLwotICAgICAgaWYgKGggPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgCQkJCSBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAgIAkJCQkgKGJmZF92bWEpIDApOwotCi0gICAgICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0gICAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKLSAgICAgICAgICAgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotICAgICAgICAgICB1c2luZyAtQnN5bWJvbGljLiAgKi8KLQlyZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAotCQkJCQkgKGJmZF92bWEpIDApOwotCi0gICAgICBCRkRfQVNTRVJUKHNwbHQgIT0gTlVMTCk7Ci0gICAgICBpZiAoc3BsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgICAgdmFsdWUgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkgICAgICAgKyBoLT5wbHQub2Zmc2V0KTsKLSAgICAgIHJldHVybiBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0gICAgICAgIAkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAgIAkJCSAgICAgICAoYmZkX3ZtYSkgMCk7Ci0KLSAgICBjYXNlIFJfQVJNX1NCUkVMMzI6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fQU1QX1ZDQUxMOToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SU0JSRUwzMjoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9USE1fUlBDMjI6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fUlJFTDMyOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JBQlMzMjoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SUEMyNDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SQkFTRToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLX0KLQotI2lmZGVmIFVTRV9SRUwKLS8qIEFkZCBJTkNSRU1FTlQgdG8gdGhlIHJlbG9jIChvZiB0eXBlIEhPV1RPKSBhdCBBRERSRVNTLiAgKi8KLXN0YXRpYyB2b2lkCi1hcm1fYWRkX3RvX3JlbCAoYWJmZCwgYWRkcmVzcywgaG93dG8sIGluY3JlbWVudCkKLSAgICAgYmZkICogICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIGJmZF9ieXRlICogICAgICAgICBhZGRyZXNzOwotICAgICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci0gICAgIGJmZF9zaWduZWRfdm1hICAgICBpbmNyZW1lbnQ7Ci17Ci0gIGJmZF92bWEgICAgICAgIGNvbnRlbnRzOwotICBiZmRfc2lnbmVkX3ZtYSBhZGRlbmQ7Ci0KLSAgY29udGVudHMgPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyZXNzKTsKLQotICAvKiBHZXQgdGhlIChzaWduZWQpIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgYWRkZW5kID0gY29udGVudHMgJiBob3d0by0+c3JjX21hc2s7Ci0gIGlmIChhZGRlbmQgJiAoKGhvd3RvLT5zcmNfbWFzayArIDEpID4+IDEpKQotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hIG1hc2s7Ci0gICAgICAKLSAgICAgIG1hc2sgPSAtMTsKLSAgICAgIG1hc2sgJj0gfiBob3d0by0+c3JjX21hc2s7Ci0gICAgICBhZGRlbmQgfD0gbWFzazsKLSAgICB9Ci0KLSAgLyogQWRkIGluIHRoZSBpbmNyZW1lbnQsICh3aGljaCBpcyBhIGJ5dGUgdmFsdWUpLiAgKi8KLSAgc3dpdGNoIChob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0FSTV9USE1fUEMyMjoKLSAgICBkZWZhdWx0OgotICAgICAgYWRkZW5kICs9IGluY3JlbWVudDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX0FSTV9QQzI0OgotICAgICAgYWRkZW5kIDw8PSBob3d0by0+c2l6ZTsKLSAgICAgIGFkZGVuZCArPSAgaW5jcmVtZW50OwotICAgICAgCi0gICAgICAvKiBTaG91bGQgd2UgY2hlY2sgZm9yIG92ZXJmbG93IGhlcmUgPyAgKi8KLQotICAgICAgLyogRHJvcCBhbnkgdW5kZXNpcmVkIGJpdHMuICAqLwotICAgICAgYWRkZW5kID4+PSBob3d0by0+cmlnaHRzaGlmdDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIGNvbnRlbnRzID0gKGNvbnRlbnRzICYgfiBob3d0by0+ZHN0X21hc2spIHwgKGFkZGVuZCAmIGhvd3RvLT5kc3RfbWFzayk7Ci0gIAotICBiZmRfcHV0XzMyIChhYmZkLCBjb250ZW50cywgYWRkcmVzcyk7Ci19Ci0jZW5kaWYgLyogVVNFX1JFTCAqLwotCi0vKiBSZWxvY2F0ZSBhbiBBUk0gRUxGIHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgIHJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICBsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKiAgICAgICAgICAgIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbGVuZDsKLSAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgbmFtZTsKLQotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgICAgICBzeW07Ci0gICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgIHNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgcjsKLSAgICAgIGFyZWxlbnQgICAgICAgICAgICAgICAgICAgICAgYmZkX3JlbG9jOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgICA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoICAgcl90eXBlID09IFJfQVJNX0dOVV9WVEVOVFJZCi0gICAgICAgICAgfHwgcl90eXBlID09IFJfQVJNX0dOVV9WVElOSEVSSVQpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBlbGYzMl9hcm1faW5mb190b19ob3d0byAoaW5wdXRfYmZkLCAmIGJmZF9yZWxvYywgcmVsKTsKLSAgICAgIGhvd3RvID0gYmZkX3JlbG9jLmhvd3RvOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLSNpZmRlZiBVU0VfUkVMCi0JCSAgYXJtX2FkZF90b19yZWwgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0LAotCQkJCSAgaG93dG8sIHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWUpOwotI2Vsc2UKLQkJICByZWwtPnJfYWRkZW5kICs9IChzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlKQotCQkgICAgPj4gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0jZW5kaWYKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBpbnQgcmVsb2NhdGlvbl9uZWVkZWQgPSAxOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgICAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24gdmFsdWUuCi0JICAgICAgICAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZSBvYnNjdXJlIGNhc2VzCi0JICAgICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbiB3aWxsIGJlIE5VTEwuICovCi0JICAgICAgc3dpdGNoIChyX3R5cGUpCi0JCXsKLQkgICAgICAgIGNhc2UgUl9BUk1fUEMyNDoKLQkgICAgICAgIGNhc2UgUl9BUk1fQUJTMzI6Ci0JICAgICAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAgICAgICAgICYmICgKLQkgICAgICAgICAgICAgIAkgICghaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkgICAgICAgICAgICAgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkJCSAgKQotCSAgICAgICAgICAgICAgJiYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICAgICAgKQotCSAgICAgICAgICAgIHJlbG9jYXRpb25fbmVlZGVkID0gMDsKLQkJICBicmVhazsKLQotCSAgICAgICAgY2FzZSBSX0FSTV9HT1RQQzoKLQkgICAgICAgICAgcmVsb2NhdGlvbl9uZWVkZWQgPSAwOwotCQkgIGJyZWFrOwotCi0JICAgICAgICBjYXNlIFJfQVJNX0dPVDMyOgotCSAgICAgICAgICBpZiAoZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgICAgICAgICAgICAgJiYgKCFpbmZvLT5zaGFyZWQKLQkgICAgICAgICAgICAgICAgICB8fCAoIWluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JICAgICAgICAgICAgICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCi0JCQkgICkKLQkJICAgICAgKQotCSAgICAgICAgICAgIHJlbG9jYXRpb25fbmVlZGVkID0gMDsKLQkJICBicmVhazsKLQotCSAgICAgICAgY2FzZSBSX0FSTV9QTFQzMjoKLQkgICAgICAgICAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpLTEpCi0JICAgICAgICAgICAgcmVsb2NhdGlvbl9uZWVkZWQgPSAwOwotCQkgIGJyZWFrOwotCi0JICAgICAgICBkZWZhdWx0OgotCQkgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJKF8oIiVzOiB3YXJuaW5nOiB1bnJlc29sdmFibGUgcmVsb2NhdGlvbiBhZ2FpbnN0IHN5bWJvbCBgJXMnIGZyb20gJXMgc2VjdGlvbiIpLAotCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCQkgICAgICByZWxvY2F0aW9uX25lZWRlZCA9IDA7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChyZWxvY2F0aW9uX25lZWRlZCkKLQkJcmVsb2NhdGlvbiA9IGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaCAhPSBOVUxMKQotCW5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCSAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCX0KLQotICAgICAgciA9IGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQkgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbCwKLQkJCQkJIHJlbG9jYXRpb24sIGluZm8sIHNlYywgbmFtZSwKLQkJCQkJIChoID8gRUxGX1NUX1RZUEUgKGgtPnR5cGUpIDoKLQkJCQkJICBFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSksIGgpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqIG1zZyA9IChjb25zdCBjaGFyICopIDA7Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgY29tbW9uX2Vycm9yOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQotCQkgICAgKGluZm8sIG1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8ga2VlcCBBUk0gc3BlY2lmaWMgZmxhZ3MgaW4gdGhlIEVMRiBoZWFkZXIuICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgaWYgKGVsZl9mbGFnc19pbml0IChhYmZkKQotICAgICAgJiYgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgIT0gZmxhZ3MpCi0gICAgewotICAgICAgaWYgKGZsYWdzICYgRUZfSU5URVJXT1JLKQotCV9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLVdhcm5pbmc6IE5vdCBzZXR0aW5nIGludGVyd29yayBmbGFnIG9mICVzIHNpbmNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIGFzIG5vbi1pbnRlcndvcmtpbmciKSwKLQkJCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBlbHNlCi0JX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29yayBmbGFnIG9mICVzIGR1ZSB0byBvdXRzaWRlIHJlcXVlc3QiKSwKLQkJCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgICAgIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIG9uZSBvYmplY3QgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0gIGZsYWd3b3JkIG91dF9mbGFnczsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5fZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb3V0X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKGVsZl9mbGFnc19pbml0IChvYmZkKSAmJiBpbl9mbGFncyAhPSBvdXRfZmxhZ3MpCi0gICAgewotICAgICAgLyogQ2Fubm90IG1peCBQSUMgYW5kIG5vbi1QSUMgY29kZS4gICovCi0gICAgICBpZiAoKGluX2ZsYWdzICYgRUZfUElDKSAhPSAob3V0X2ZsYWdzICYgRUZfUElDKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIENhbm5vdCBtaXggQVBDUzI2IGFuZCBBUENTMzIgY29kZS4gICovCi0gICAgICBpZiAoKGluX2ZsYWdzICYgRUZfQVBDU18yNikgIT0gKG91dF9mbGFncyAmIEVGX0FQQ1NfMjYpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQ2Fubm90IG1peCBmbG9hdCBBUENTIGFuZCBub24tZmxvYXQgQVBDUyBjb2RlLiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSAhPSAob3V0X2ZsYWdzICYgRUZfQVBDU19GTE9BVCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB0aGUgc3JjIGFuZCBkZXN0IGhhdmUgZGlmZmVyZW50IGludGVyd29ya2luZyBmbGFncwotICAgICAgICAgdGhlbiB0dXJuIG9mZiB0aGUgaW50ZXJ3b3JraW5nIGJpdC4gICovCi0gICAgICBpZiAoKGluX2ZsYWdzICYgRUZfSU5URVJXT1JLKSAhPSAob3V0X2ZsYWdzICYgRUZfSU5URVJXT1JLKSkKLQl7Ci0JICBpZiAob3V0X2ZsYWdzICYgRUZfSU5URVJXT1JLKQotCSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1XYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JrIGZsYWcgaW4gJXMgYmVjYXVzZSBub24taW50ZXJ3b3JraW5nIGNvZGUgaW4gJXMgaGFzIGJlZW4gbGlua2VkIHdpdGggaXQiKSwKLQkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotCSAgaW5fZmxhZ3MgJj0gfkVGX0lOVEVSV09SSzsKLQl9Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gaW5fZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBmbGFnd29yZCBvdXRfZmxhZ3M7Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBDaGVjayBpZiB3ZSBoYXZlIHRoZSBzYW1lIGVuZGlhbmVzcyAqLwotICBpZiAoICAgaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTgotICAgICAgJiYgaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGNvbXBpbGVkIGZvciBhICVzIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyAlcyBlbmRpYW4iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JIGJmZF9iaWdfZW5kaWFuIChpYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0JIGJmZF9iaWdfZW5kaWFuIChvYmZkKSA/ICJiaWciIDogImxpdHRsZSIpOwotCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIGlucHV0IEJGRCBtdXN0IGhhdmUgaGFkIGl0cyBmbGFncyBpbml0aWFsaXNlZC4gICovCi0gIC8qIFRoZSBmb2xsb3dpbmcgc2VlbXMgYm9ndXMgdG8gbWUgLS0gVGhlIGZsYWdzIGFyZSBpbml0aWFsaXplZCBpbgotICAgICB0aGUgYXNzZW1ibGVyIGJ1dCBJIGRvbid0IHRoaW5rIGFuIGVsZl9mbGFnc19pbml0IGZpZWxkIGlzCi0gICAgIHdyaXR0ZW4gaW50byB0aGUgb2JqZWN0ICovCi0gIC8qIEJGRF9BU1NFUlQgKGVsZl9mbGFnc19pbml0IChpYmZkKSk7ICovCi0KLSAgaW5fZmxhZ3MgID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG91dF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBpbnB1dCBpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgdGhlbiBkbyBub3QKLSAgICAgICAgIGJvdGhlciBzZXR0aW5nIHRoZSBmbGFncyBmb3IgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUsCi0gICAgICAgICBpbnN0ZWFkIGFsbG93IGZ1dHVyZSBtZXJnZXMgdG8gZG8gdGhpcy4gIElmIG5vIGZ1dHVyZQotICAgICAgICAgbWVyZ2VzIGV2ZXIgc2V0IHRoZXNlIGZsYWdzIHRoZW4gdGhleSB3aWxsIHJldGFpbiB0aGVpcgotICAgICAgICAgdW5pdGlhbGlzZWQgdmFsdWVzLCB3aGljaCBzdXJwcmlzZSBzdXJwcmlzZSwgY29ycmVzcG9uZAotICAgICAgICAgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoaWJmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiB0cnVlOwotCi0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLQotICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKLQlyZXR1cm4gYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZmxhZyBjb21wYXRpYmlsaXR5LiAgKi8KLSAgaWYgKGluX2ZsYWdzID09IG91dF9mbGFncykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBDb21wbGFpbiBhYm91dCB2YXJpb3VzIGZsYWcgbWlzbWF0Y2hlcy4gICovCi0KLSAgaWYgKChpbl9mbGFncyAmIEVGX0FQQ1NfMjYpICE9IChvdXRfZmxhZ3MgJiBFRl9BUENTXzI2KSkKLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1FcnJvcjogJXMgY29tcGlsZWQgZm9yIEFQQ1MtJWQsIHdoZXJlYXMgJXMgaXMgY29tcGlsZWQgZm9yIEFQQ1MtJWQiKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCQkJaW5fZmxhZ3MgJiBFRl9BUENTXzI2ID8gMjYgOiAzMiwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLAotCQkJb3V0X2ZsYWdzICYgRUZfQVBDU18yNiA/IDI2IDogMzIpOwotCi0gIGlmICgoaW5fZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSAhPSAob3V0X2ZsYWdzICYgRUZfQVBDU19GTE9BVCkpCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotRXJyb3I6ICVzIHBhc3NlcyBmbG9hdHMgaW4gJXMgcmVnaXN0ZXJzLCB3aGVyZWFzICVzIHBhc3NlcyB0aGVtIGluICVzIHJlZ2lzdGVycyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCSAgICAgaW5fZmxhZ3MgJiBFRl9BUENTX0ZMT0FUID8gXyAoImZsb2F0IikgOiBfICgiaW50ZWdlciIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSAgICAgIG91dF9mbGFncyAmIEVGX0FQQ1NfMjYgPyBfICgiZmxvYXQiKSA6IF8gKCJpbnRlZ2VyIikpOwotCi0gIGlmICgoaW5fZmxhZ3MgJiBFRl9QSUMpICE9IChvdXRfZmxhZ3MgJiBFRl9QSUMpKQotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLUVycm9yOiAlcyBpcyBjb21waWxlZCBhcyBwb3NpdGlvbiAlcyBjb2RlLCB3aGVyZWFzICVzIGlzIG5vdCIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCSAgICBpbl9mbGFncyAmIEVGX1BJQyA/IF8gKCJpbmRlcGVuZGVudCIpIDogXyAoImRlcGVuZGVudCIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gIC8qIEludGVyd29ya2luZyBtaXNtYXRjaCBpcyBvbmx5IGEgd2FybmluZy4gKi8KLSAgaWYgKChpbl9mbGFncyAmIEVGX0lOVEVSV09SSykgIT0gKG91dF9mbGFncyAmIEVGX0lOVEVSV09SSykpCi0gICAgewotICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotV2FybmluZzogJXMgJXMgaW50ZXJ3b3JraW5nLCB3aGVyZWFzICVzICVzIiksCi0JCQkgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCSAgaW5fZmxhZ3MgJiBFRl9JTlRFUldPUksgPyBfICgic3VwcG9ydHMiKSA6IF8gKCJkb2VzIG5vdCBzdXBwb3J0IiksCi0JCQkgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLAotCQkgICAgb3V0X2ZsYWdzICYgRUZfSU5URVJXT1JLID8gXyAoImRvZXMgbm90IikgOiBfICgiZG9lcyIpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERpc3BsYXkgdGhlIGZsYWdzIGZpZWxkICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgcHRyOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgcHRyOwotCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCk7Ci0KLSAgLyogUHJpbnQgbm9ybWFsIEVMRiBwcml2YXRlIGRhdGEuICAqLwotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotCi0gIC8qIElnbm9yZSBpbml0IGZsYWcgLSBpdCBtYXkgbm90IGJlIHNldCwgZGVzcGl0ZSB0aGUgZmxhZ3MgZmllbGQgY29udGFpbmluZyB2YWxpZCBkYXRhLiAgKi8KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfICgicHJpdmF0ZSBmbGFncyA9ICVseDoiKSwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0lOVEVSV09SSykKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtpbnRlcndvcmtpbmcgZW5hYmxlZF0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtpbnRlcndvcmtpbmcgbm90IGVuYWJsZWRdIikpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0FQQ1NfMjYpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbQVBDUy0yNl0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtBUENTLTMyXSIpKTsKLQotICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2Zsb2F0cyBwYXNzZWQgaW4gZmxvYXQgcmVnaXN0ZXJzXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2Zsb2F0cyBwYXNzZWQgaW4gaW50ZWdlciByZWdpc3RlcnNdIikpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1BJQykKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtwb3NpdGlvbiBpbmRlcGVuZGVudF0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYnNvbHV0ZSBwb3NpdGlvbl0iKSk7Ci0KLSAgZnB1dGMgKCdcbicsIGZpbGUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1lbGYzMl9hcm1fZ2V0X3N5bWJvbF90eXBlIChlbGZfc3ltLCB0eXBlKQotICAgICBFbGZfSW50ZXJuYWxfU3ltICogZWxmX3N5bTsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGlmIChFTEZfU1RfVFlQRSAoZWxmX3N5bS0+c3RfaW5mbykgPT0gU1RUX0FSTV9URlVOQykKLSAgICByZXR1cm4gRUxGX1NUX1RZUEUgKGVsZl9zeW0tPnN0X2luZm8pOwotICBlbHNlCi0gICAgcmV0dXJuIHR5cGU7Ci19Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1lbGYzMl9hcm1fZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX0FSTV9HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX0FSTV9HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgR09UIGFuZCBQTFQgcmVsb2NzIHlldC4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgIGluZm87Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgIHNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWxfZW5kOwotICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICAgICBkeW5vYmo7Ci0gIGFzZWN0aW9uICogc2dvdCwgKnNyZWxnb3QsICpzcmVsb2M7Ci0gIGJmZF92bWEgKiBsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIAotICBzZ290ID0gc3JlbGdvdCA9IHNyZWxvYyA9IE5VTEw7Ci0gIAotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAgICAgIAotICAgICAgLyogU29tZSByZWxvY3MgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCXsKLQkgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JICAgIHsKLQkgICAgY2FzZSBSX0FSTV9HT1QzMjoKLQkgICAgY2FzZSBSX0FSTV9HT1RPRkY6Ci0JICAgIGNhc2UgUl9BUk1fR09UUEM6Ci0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLQkgIGNhc2UgUl9BUk1fR09UMzI6Ci0JICAgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0JICAgIGlmIChzZ290ID09IE5VTEwpCi0JICAgICAgewotCSAgICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICAgIH0KLQotCSAgICAvKiBHZXQgdGhlIGdvdCByZWxvY2F0aW9uIHNlY3Rpb24gaWYgbmVjZXNzYXJ5LiAgKi8KLQkgICAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCSAgICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICAgIHsKLQkgICAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLQkJCi0JICAgICAgICAvKiBJZiBubyBnb3QgcmVsb2NhdGlvbiBzZWN0aW9uLCBtYWtlIG9uZSBhbmQgaW5pdGlhbGl6ZS4gICovCi0JICAgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQkgIHsKLQkJICAgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsLmdvdCIpOwotCQkgICAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCSAgCQkJCSAgICAoU0VDX0FMTE9DCi0JCQkJCQkgICAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAoaCAhPSBOVUxMKQotCSAgICAgIHsKLQkgICAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQotCSAgICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotICAgICAJICAgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbAotICAgICAgICAgICAgICAgICAgIHN5bWJvbC4gICovCi0JICAgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBzaXplX3Qgc2l6ZTsKLQkJICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JCSAgICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3ZtYSk7Ci0JCSAgICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IChiZmRfdm1hICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JCSAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKSA9IGxvY2FsX2dvdF9vZmZzZXRzOwotCQkgICAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKLQkJICAgICAgbG9jYWxfZ290X29mZnNldHNbaV0gPSAoYmZkX3ZtYSkgLTE7Ci0JCSAgfQotCi0JICAgICAgICBpZiAobG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSkKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQotCSAgICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQkgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotCQkgICAgIG91dHB1dCBhIFJfQVJNX1JFTEFUSVZFIHJlbG9jIHNvIHRoYXQgdGhlIGR5bmFtaWMKLQkJICAgICBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQkgICAgICB9Ci0KLQkgICAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0JICAgIGJyZWFrOwotCi0gIAkgIGNhc2UgUl9BUk1fUExUMzI6Ci0JICAgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotICAgICAgICAgICAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aGljaCBpcwotICAgICAgICAgICAgICAgbmV2ZXIgcmVmZXJlbmNlZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBpbiB3aGljaCBjYXNlIHdlCi0gICAgICAgICAgICAgICBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkKLSAgICAgICAgICAgICAgIGFmdGVyIGFsbC4gICovCi0KLQkgICAgLyogSWYgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCwgd2UgcmVzb2x2ZSBpdCBkaXJlY3RseSB3aXRob3V0Ci0gICAgICAgICAgICAgICBjcmVhdGluZyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgKi8KLQkgICAgaWYgKGggPT0gTlVMTCkKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgICBicmVhazsKLQotCSAgY2FzZSBSX0FSTV9BQlMzMjoKLQkgIGNhc2UgUl9BUk1fUkVMMzI6Ci0JICBjYXNlIFJfQVJNX1BDMjQ6Ci0JICAgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhpcyBpcyBhIHJlbG9jCi0gICAgICAgICAgICAgICBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCwgb3IgYSBub24gUEMgcmVsYXRpdmUgcmVsb2MKLSAgICAgICAgICAgICAgIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIHRoZW4gd2UgbmVlZCB0byBjb3B5IHRoZSByZWxvYwotICAgICAgICAgICAgICAgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkuICBIb3dldmVyLCBpZiB3ZSBhcmUgbGlua2luZyB3aXRoCi0gICAgICAgICAgICAgICAtQnN5bWJvbGljLCB3ZSBkbyBub3QgbmVlZCB0byBjb3B5IGEgcmVsb2MgYWdhaW5zdCBhCi0gICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYW4gb2JqZWN0IHdlIGFyZQotICAgICAgICAgICAgICAgaW5jbHVkaW5nIGluIHRoZSBsaW5rIChpLmUuLCBERUZfUkVHVUxBUiBpcyBzZXQpLiAgQXQKLSAgICAgICAgICAgICAgIHRoaXMgcG9pbnQgd2UgaGF2ZSBub3Qgc2VlbiBhbGwgdGhlIGlucHV0IGZpbGVzLCBzbyBpdCBpcwotICAgICAgICAgICAgICAgcG9zc2libGUgdGhhdCBERUZfUkVHVUxBUiBpcyBub3Qgc2V0IG5vdyBidXQgd2lsbCBiZSBzZXQKLSAgICAgICAgICAgICAgIGxhdGVyIChpdCBpcyBuZXZlciBjbGVhcmVkKS4gIFdlIGFjY291bnQgZm9yIHRoYXQKLSAgICAgICAgICAgICAgIHBvc3NpYmlsaXR5IGJlbG93IGJ5IHN0b3JpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi0gICAgICAgICAgICAgICBwY3JlbF9yZWxvY3NfY29waWVkIGZpZWxkIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQkgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSAhPSBSX0FSTV9QQzI0Ci0JICAgICAgICB8fCAoaCAhPSBOVUxMCi0JCSAgJiYgKCEgaW5mby0+c3ltYm9saWMKLQkJICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKSkKLQkgICAgICB7Ci0JICAgICAgICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCi0gICAgICAgICAgICAgICAgICAgcmVsb2MgdHlwZXMgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gZHlub2JqIGFuZCBtYWtlIHJvb20gZm9yIHRoaXMgcmVsb2MuICAqLwotCSAgICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotCi0JCSAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgICAoYWJmZCwKLQkJCSAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkJIAkgICAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSAgIG5hbWUgKyA0KSA9PSAwKTsKLQotCQkgICAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICAgIHsKLQkJICAgICAgICBmbGFnd29yZCBmbGFnczsKLQotCQkgICAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQotCQkJICAgICAgICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQkJICAgICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCQkgIGZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgICAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywgZmxhZ3MpCi0JCQkgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQkgIHJldHVybiBmYWxzZTsKLQkJICAgICAgfQotCQkgIH0KLQotCSAgICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCSAgICAgICAgLyogSWYgd2UgYXJlIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCBhbmQgdGhpcyBpcyBhCi0gICAgICAgICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbCwgd2UgY291bnQgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZQotICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb25zIHdlIGhhdmUgZW50ZXJlZCBmb3IgdGhpcyBzeW1ib2wsIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAgICB3ZSBjYW4gZGlzY2FyZCB0aGVtIGFnYWluIGlmIHRoZSBzeW1ib2wgaXMgbGF0ZXIKLSAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgIGlzIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSB1c2luZyBhbiBlbGZfaTM4NiBsaW5rZXIKLSAgICAgICAgICAgICAgICAgICBoYXNoIHRhYmxlLCB3aGljaCBtZWFucyB0aGF0IGggaXMgcmVhbGx5IGEgcG9pbnRlciB0bwotICAgICAgICAgICAgICAgICAgIGFuIGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeS4gICovCi0JICAgICAgICBpZiAoaCAhPSBOVUxMICYmIGluZm8tPnN5bWJvbGljCi0JCSAgICAmJiBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSBSX0FSTV9QQzI0KQotCQkgIHsKLQkJICAgIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICogZWg7Ci0JCSAgICBzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKiBwOwotCi0JCSAgICBlaCA9IChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0JCSAgICBmb3IgKHAgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkJICAgICAgaWYgKHAtPnNlY3Rpb24gPT0gc3JlbG9jKQotCQkgICAgICAgIGJyZWFrOwotCi0JCSAgICBpZiAocCA9PSBOVUxMKQotCQkgICAgICB7Ci0JCSAgICAgICAgcCA9ICgoc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkICopCi0JCQkgICAgIGJmZF9hbGxvYyAoZHlub2JqLCBzaXplb2YgKiBwKSk7Ci0KLQkJICAgICAgICBpZiAocCA9PSBOVUxMKQotCQkJICByZXR1cm4gZmFsc2U7Ci0JCSAgICAgICAgcC0+bmV4dCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOwotCQkgICAgICAgIGVoLT5wY3JlbF9yZWxvY3NfY29waWVkID0gcDsKLQkJICAgICAgICBwLT5zZWN0aW9uID0gc3JlbG9jOwotCQkgICAgICAgIHAtPmNvdW50ID0gMDsKLQkJICAgICAgfQotCi0JCSAgICArK3AtPmNvdW50OwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfQVJNX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0JICAKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0gICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdG8gYSBwYXJ0aWN1bGFyIHNlY3Rpb24gYW5kIG9mZnNldCwgZm9yIGVycm9yCi0gICByZXBvcnRpbmcuICAgVGhpcyBjb2RlIGlzIGEgZHVwbGljYXRlIG9mIHRoZSBjb2RlIGluIGVsZi5jLCBleGNlcHQKLSAgIHRoYXQgaXQgYWxzbyBhY2NlcHRzIFNUVF9BUk1fVEZVTkMgYXMgYSBzeW1ib2wgdGhhdCBuYW1lcyBhIGZ1bmN0aW9uLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2ZpbmRfbmVhcmVzdF9saW5lCi0gIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIpCi0gICAgIGJmZCAqICAgICAgICAgIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgIHNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKiogICAgIHN5bWJvbHM7Ci0gICAgIGJmZF92bWEgICAgICAgIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKiAgZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqICBmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKiBsaW5lX3B0cjsKLXsKLSAgYm9vbGVhbiAgICAgIGZvdW5kOwotICBjb25zdCBjaGFyICogZmlsZW5hbWU7Ci0gIGFzeW1ib2wgKiAgICBmdW5jOwotICBiZmRfdm1hICAgICAgbG93X2Z1bmM7Ci0gIGFzeW1ib2wgKiogICBwOwotCi0gIGlmIChfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgICAgbGluZV9wdHIsIDApKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzeW1ib2xzLCBzZWN0aW9uLCBvZmZzZXQsCi0JCQkJCSAgICAgJmZvdW5kLCBmaWxlbmFtZV9wdHIsCi0JCQkJCSAgICAgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIsCi0JCQkJCSAgICAgJmVsZl90ZGF0YSAoYWJmZCktPmxpbmVfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChmb3VuZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoc3ltYm9scyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmaWxlbmFtZSA9IE5VTEw7Ci0gIGZ1bmMgPSBOVUxMOwotICBsb3dfZnVuYyA9IDA7Ci0KLSAgZm9yIChwID0gc3ltYm9sczsgKnAgIT0gTlVMTDsgcCsrKQotICAgIHsKLSAgICAgIGVsZl9zeW1ib2xfdHlwZSAqcTsKLQotICAgICAgcSA9IChlbGZfc3ltYm9sX3R5cGUgKikgKnA7Ci0KLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb24gKCZxLT5zeW1ib2wpICE9IHNlY3Rpb24pCi0JY29udGludWU7Ci0KLSAgICAgIHN3aXRjaCAoRUxGX1NUX1RZUEUgKHEtPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbykpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQljYXNlIFNUVF9GSUxFOgotCSAgZmlsZW5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgmcS0+c3ltYm9sKTsKLQkgIGJyZWFrOwotCWNhc2UgU1RUX05PVFlQRToKLQljYXNlIFNUVF9GVU5DOgotCWNhc2UgU1RUX0FSTV9URlVOQzoKLQkgIGlmIChxLT5zeW1ib2wuc2VjdGlvbiA9PSBzZWN0aW9uCi0JICAgICAgJiYgcS0+c3ltYm9sLnZhbHVlID49IGxvd19mdW5jCi0JICAgICAgJiYgcS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldCkKLQkgICAgewotCSAgICAgIGZ1bmMgPSAoYXN5bWJvbCAqKSBxOwotCSAgICAgIGxvd19mdW5jID0gcS0+c3ltYm9sLnZhbHVlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChmdW5jID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpmaWxlbmFtZV9wdHIgPSBmaWxlbmFtZTsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBiZmRfYXN5bWJvbF9uYW1lIChmdW5jKTsKLSAgKmxpbmVfcHRyID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIGJmZCAqIGR5bm9iajsKLSAgYXNlY3Rpb24gKiBzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSA9PSAwKQotCXsKLQkgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgd2Ugc2F3IGEgUExUMzIgcmVsb2MgaW4gYW4gaW5wdXQKLSAgICAgICAgICAgICBmaWxlLCBidXQgdGhlIHN5bWJvbCB3YXMgbmV2ZXIgcmVmZXJyZWQgdG8gYnkgYSBkeW5hbWljCi0gICAgICAgICAgICAgb2JqZWN0LiAgSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gYnVpbGQKLSAgICAgICAgICAgICBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBhbmQgd2UgY2FuIGp1c3QgZG8gYSBQQzMyCi0gICAgICAgICAgICAgcmVsb2MgaW5zdGVhZC4gICovCi0JICBCRkRfQVNTRVJUICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgLnBsdCBlbnRyeSwgbWFrZSByb29tIGZvciB0aGUgc3BlY2lhbAotCSBmaXJzdCBlbnRyeS4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0Jcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCX0KLQotICAgICAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLQotICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5nb3QucGx0IHNlY3Rpb24sIHdoaWNoCi0JIHdpbGwgYmUgcGxhY2VkIGluIHRoZSAuZ290IHNlY3Rpb24gYnkgdGhlIGxpbmtlciBzY3JpcHQuICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX0FSTV9DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWwuYnNzIHNlY3Rpb24gd2UgYXJlIGdvaW5nIHRvIHVzZS4gICovCi0gIGlmICgoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gMykKLSAgICBwb3dlcl9vZl90d28gPSAzOwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLXsKLSAgYmZkICogZHlub2JqOwotICBhc2VjdGlvbiAqIHM7Ci0gIGJvb2xlYW4gcGx0OwotICBib29sZWFuIHJlbG9jczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbC5nb3Qgc2VjdGlvbi4KLSAgICAgICAgIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwKLSAgICAgICAgIG5vdCBhY3R1YWxseSB1c2UgdGhlc2UgZW50cmllcy4gIFJlc2V0IHRoZSBzaXplIG9mIC5yZWwuZ290LAotICAgICAgICAgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgIGJlbG93LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgc2hhcmVkIGxpbmssIHRoZW4gd2UgbmVlZCB0byBkaXNjYXJkIGFsbAotICAgICBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4KLSAgICAgV2UgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZSBjaGVja19yZWxvY3Mgcm91dGluZSwgYnV0IHdlCi0gICAgIHdpbGwgbm90IGZpbGwgdGhlbSBpbiBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCAmJiBpbmZvLT5zeW1ib2xpYykKLSAgICBlbGYzMl9hcm1fbGlua19oYXNoX3RyYXZlcnNlIChlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICBlbGYzMl9hcm1fZGlzY2FyZF9jb3BpZXMsCi0JCQkJICAoUFRSKSBOVUxMKTsKLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHBsdCA9IGZhbHNlOwotICByZWxvY3MgPSBmYWxzZTsKLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBTdHJpcCB0aGlzIHNlY3Rpb24gaWYgd2UgZG9uJ3QgbmVlZCBpdDsgc2VlIHRoZQotICAgICAgICAgICAgICAgICBjb21tZW50IGJlbG93LiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgaXMgYSBQTFQuICAqLwotCSAgICAgIHBsdCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbW9zdGx5IHRvIGhhbmRsZSAucmVsLmJzcyBhbmQKLQkJIC5yZWwucGx0LiAgV2UgbXVzdCBjcmVhdGUgYm90aCBzZWN0aW9ucyBpbgotCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgdGhleSBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHRhcmdldDsKLQotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWxvYyBzZWN0aW9ucyBvdGhlcgotICAgICAgICAgICAgICAgICB0aGFuIC5yZWwucGx0LiAgKi8KLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlbC5wbHQiKSAhPSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQotCQkgIHJlbG9jcyA9IHRydWU7Ci0KLQkJICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSAgICAgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTAotCQkgICAgIGVudHJ5LiAgVGhlIGVudHJpZXMgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24KLQkJICAgICByZWFsbHkgYXBwbHkgdG8gdGhlIC5nb3Qgc2VjdGlvbiwgd2hpY2ggd2UKLQkJICAgICBjcmVhdGVkIG91cnNlbHZlcyBhbmQgc28ga25vdyBpcyBub3QgcmVhZG9ubHkuICAqLwotCQkgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJCSAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCQkgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNCk7Ci0JCSAgCi0JCSAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgcmVsdGV4dCA9IHRydWU7Ci0JCX0KLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmdvdCIsIDQpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgYXNlY3Rpb24gKiogc3BwOwotCi0JICBmb3IgKHNwcCA9ICZzLT5vdXRwdXRfc2VjdGlvbi0+b3duZXItPnNlY3Rpb25zOwotCSAgICAgICAqc3BwICE9IHMtPm91dHB1dF9zZWN0aW9uOwotCSAgICAgICBzcHAgPSAmKCpzcHApLT5uZXh0KQotCSAgICA7Ci0JICAqc3BwID0gcy0+b3V0cHV0X3NlY3Rpb24tPm5leHQ7Ci0JICAtLXMtPm91dHB1dF9zZWN0aW9uLT5vd25lci0+c2VjdGlvbl9jb3VudDsKLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbG9jcykKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEVOVCwKLQkJCQkJCXNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgZWxmMzJfYXJtX2xpbmtfaGFzaF90cmF2ZXJzZSBpZiB3ZSBhcmUKLSAgIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCB3aXRoIC1Cc3ltYm9saWMuICBJdCBkaXNjYXJkcyB0aGUgc3BhY2UKLSAgIGFsbG9jYXRlZCB0byBjb3B5IFBDIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgd2hpY2ggYXJlCi0gICBkZWZpbmVkIGluIHJlZ3VsYXIgb2JqZWN0cy4gIFdlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUKLSAgIGNoZWNrX3JlbG9jcyByb3V0aW5lLCBidXQgd2Ugd29uJ3QgZmlsbCB0aGVtIGluIGluIHRoZQotICAgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9kaXNjYXJkX2NvcGllcyAoaCwgaWdub3JlKQotICAgICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgIFBUUiBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkICogczsKLQotICAvKiBXZSBvbmx5IGRpc2NhcmQgcmVsb2NzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4gICovCi0gIGlmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKHMgPSBoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHMtPnNlY3Rpb24tPl9yYXdfc2l6ZSAtPSBzLT5jb3VudCAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKiBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqIHN5bTsKLXsKLSAgYmZkICogZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIHNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqIHNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqIHNyZWw7Ci0gICAgICBiZmRfdm1hIHBsdF9pbmRleDsKLSAgICAgIGJmZF92bWEgZ290X29mZnNldDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0Ci0JIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0gICAgICAvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSB3aGljaAotCSBjb3JyZXNwb25kcyB0byB0aGlzIHN5bWJvbC4gIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoaXMgc3ltYm9sCi0JIGluIGFsbCB0aGUgc3ltYm9scyBmb3Igd2hpY2ggd2UgYXJlIG1ha2luZyBwbHQgZW50cmllcy4gIFRoZQotCSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgcGx0X2luZGV4ID0gaC0+cGx0Lm9mZnNldCAvIFBMVF9FTlRSWV9TSVpFIC0gMTsKLQotICAgICAgLyogR2V0IHRoZSBvZmZzZXQgaW50byB0aGUgLmdvdCB0YWJsZSBvZiB0aGUgZW50cnkgdGhhdAotCSBjb3JyZXNwb25kcyB0byB0aGlzIGZ1bmN0aW9uLiAgRWFjaCAuZ290IGVudHJ5IGlzIDQgYnl0ZXMuCi0JIFRoZSBmaXJzdCB0aHJlZSBhcmUgcmVzZXJ2ZWQuICAqLwotICAgICAgZ290X29mZnNldCA9IChwbHRfaW5kZXggKyAzKSAqIDQ7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwKLSAgICAgICAgICAgICAgZWxmMzJfYXJtX3BsdF9lbnRyeSwKLQkgICAgICBQTFRfRU5UUllfU0laRSk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGdvdF9vZmZzZXQKLQkJICAgICAgIC0gc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgLSBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICAtIGgtPnBsdC5vZmZzZXQgLSAxMiksCi0JCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDEyKTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNwbHQtPm91dHB1dF9vZmZzZXQpLAotCQkgIHNnb3QtPmNvbnRlbnRzICsgZ290X29mZnNldCk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICArIGdvdF9vZmZzZXQpOwotICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fSlVNUF9TTE9UKTsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzcmVsLT5jb250ZW50cwotCQkJCSArIHBsdF9pbmRleCkpOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KLQkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIHNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqIHNyZWw7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0JIHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotICAgICAgcmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBUaGUgZW50cnkgaW4KLQkgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBpbml0aWFsaXplZCBpbgotCSB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9BUk1fUkVMQVRJVkUpOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOwotCSAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fR0xPQl9EQVQpOwotCX0KLQotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHNyZWwtPmNvbnRlbnRzCi0JCQkJICsgc3JlbC0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbC0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIHM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMQotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICIucmVsLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsLnJfb2Zmc2V0ID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fQ09QWSk7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgcy0+Y29udGVudHMKLQkJCQkgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgLyogTWFyayBfRFlOQU1JQyBhbmQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBiZmQgKiBkeW5vYmo7Ci0gIGFzZWN0aW9uICogc2dvdDsKLSAgYXNlY3Rpb24gKiBzZHluOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICogbmFtZTsKLQkgIGFzZWN0aW9uICogczsKLQotCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIuZ290IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOgotCSAgICAgIG5hbWUgPSAiLnJlbC5wbHQiOwotCSAgICBnZXRfdm1hOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUUkVMU1o6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbC5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7Ci0JICAgICAgZWxzZQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUkVMU1o6Ci0JICAgICAgLyogTXkgcmVhZGluZyBvZiB0aGUgU1ZSNCBBQkkgaW5kaWNhdGVzIHRoYXQgdGhlCi0JCSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSByZWxvY3MgKERUX0pNUFJFTCkgc2hvdWxkIGJlCi0JCSBpbmNsdWRlZCBpbiB0aGUgb3ZlcmFsbCByZWxvY3MgKERUX1JFTCkuICBUaGlzIGlzCi0JCSB3aGF0IFNvbGFyaXMgZG9lcy4gIEhvd2V2ZXIsIFVuaXhXYXJlIGNhbiBub3QgaGFuZGxlCi0JCSB0aGF0IGNhc2UuICBUaGVyZWZvcmUsIHdlIG92ZXJyaWRlIHRoZSBEVF9SRUxTWiBlbnRyeQotCQkgaGVyZSB0byBtYWtlIGl0IG5vdCBpbmNsdWRlIHRoZSBKTVBSRUwgcmVsb2NzLiAgU2luY2UKLQkJIHRoZSBsaW5rZXIgc2NyaXB0IGFycmFuZ2VzIGZvciAucmVsLnBsdCB0byBmb2xsb3cgYWxsCi0JCSBvdGhlciByZWxvY2F0aW9uIHNlY3Rpb25zLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5Ci0JCSBhYm91dCBjaGFuZ2luZyB0aGUgRFRfUkVMIGVudHJ5LiAgKi8KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOwotCSAgICAgIGlmIChzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fY29va2VkX3NpemU7Ci0JCSAgZWxzZQotCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X3Jhd19zaXplOwotCQl9Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQotCW1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZjMyX2FybV9wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7Ci0KLSAgICAgIC8qIFVuaXhXYXJlIHNldHMgdGhlIGVudHNpemUgb2YgLnBsdCB0byA0LCBhbHRob3VnaCB0aGF0IGRvZXNuJ3QKLQkgcmVhbGx5IHNlZW0gbGlrZSB0aGUgcmlnaHQgdmFsdWUuICAqLwotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLSAgICB9Ci0KLSAgLyogRmlsbCBpbiB0aGUgZmlyc3QgdGhyZWUgZW50cmllcyBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGlmIChzZ290LT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBzZ290LT5jb250ZW50cyk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDgpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotZWxmMzJfYXJtX3Bvc3RfcHJvY2Vzc19oZWFkZXJzIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9FaGRyICogaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotCi0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfT1NBQkldICAgICAgPSBBUk1fRUxGX09TX0FCSV9WRVJTSU9OOwotICBpX2VoZHJwLT5lX2lkZW50W0VJX0FCSVZFUlNJT05dID0gQVJNX0VMRl9BQklfVkVSU0lPTjsKLX0KLQotCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfYXJtCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX0FSTQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDgwMDAKLQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAllbGYzMl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAJZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQllbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgICAgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAJZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9maW5kX25lYXJlc3RfbGluZQkgICAgICAgIGVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZQotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSAgICAgICAgICAgICBlbGYzMl9hcm1fZ2V0X3N5bWJvbF90eXBlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgICAgICAgICBlbGYzMl9hcm1fZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICBlbGYzMl9hcm1fZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgICAgZWxmMzJfYXJtX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uICAgIAllbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wJZWxmMzJfYXJtX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwlfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wJZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucwllbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCWVsZjMyX2FybV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMJZWxmMzJfYXJtX3Bvc3RfcHJvY2Vzc19oZWFkZXJzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5ICAgIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0ICAgIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltICAgIDAKLQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJMTIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCVBMVF9FTlRSWV9TSVpFCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1kMTB2LmMgYi9iZmQvZWxmMzItZDEwdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWRlYjdjLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1kMTB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyogRDEwVi1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotLyogI2luY2x1ZGUgImVsZi9kMTB2LmgiICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIGQxMHZfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLQotCi0vKiBVc2UgUkVMIGluc3RlYWQgb2YgUkVMQSB0byBzYXZlIHNwYWNlICovCi0jZGVmaW5lIFVTRV9SRUwKLQotZW51bSByZWxvY190eXBlCi17Ci0gIFJfRDEwVl9OT05FID0gMCwKLSAgUl9EMTBWXzEwX1BDUkVMX1IsCi0gIFJfRDEwVl8xMF9QQ1JFTF9MLAotICBSX0QxMFZfMTYsCi0gIFJfRDEwVl8xOCwKLSAgUl9EMTBWXzE4X1BDUkVMLAotICBSX0QxMFZfMzIsCi0gIFJfRDEwVl9HTlVfVlRJTkhFUklULAotICBSX0QxMFZfR05VX1ZURU5UUlksCi0gIFJfRDEwVl9tYXgKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9kMTB2X2hvd3RvX3RhYmxlW10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX0QxMFZfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIFBDIFJlbGF0aXZlIDEwLWJpdCByZWxvY2F0aW9uLCBzaGlmdGVkIGJ5IDIgICovCi0gIC8qIHJpZ2h0IGNvbnRhaW5lciAqLwotICBIT1dUTyAoUl9EMTBWXzEwX1BDUkVMX1IsCS8qIHR5cGUgKi8KLQkgMiwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMCwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzEwX1BDUkVMX1IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkgICAgICAgIC8qIHNyY19tYXNrICovCi0JIDB4ZmYsICAgCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBQQyBSZWxhdGl2ZSAxMC1iaXQgcmVsb2NhdGlvbiwgc2hpZnRlZCBieSAyICAqLwotICAvKiBsZWZ0IGNvbnRhaW5lciAqLwotICBIT1dUTyAoUl9EMTBWXzEwX1BDUkVMX0wsCS8qIHR5cGUgKi8KLQkgMiwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMCwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0JIDE1LAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8xMF9QQ1JFTF9MIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZjgwMDAsCQkgICAgICAgIC8qIHNyY19tYXNrICovCi0JIDB4MDdmODAwMCwgICAJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMTYgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDEwVl8xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gMTggYml0IGFic29sdXRlIHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgMiAqLwotICBIT1dUTyAoUl9EMTBWXzE4LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8xOCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE4IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDIgICovCi0gIEhPV1RPIChSX0QxMFZfMThfUENSRUwsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzE4X1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9EMTBWXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9EMTBWX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0QxMFZfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX0QxMFZfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0QxMFZfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotIAotfTsKLQotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBEMTBWIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBkMTB2X3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZDEwdl9yZWxvY19tYXAgZDEwdl9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfRDEwVl9OT05FLCB9LAotICB7IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IsIFJfRDEwVl8xMF9QQ1JFTF9SIH0sCi0gIHsgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTCwgUl9EMTBWXzEwX1BDUkVMX0wgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfRDEwVl8xNiB9LAotICB7IEJGRF9SRUxPQ19EMTBWXzE4LCBSX0QxMFZfMTggfSwKLSAgeyBCRkRfUkVMT0NfRDEwVl8xOF9QQ1JFTCwgUl9EMTBWXzE4X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX0QxMFZfMzIgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfRDEwVl9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9EMTBWX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7Ci0gICAgICAgaSA8IHNpemVvZiAoZDEwdl9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZDEwdl9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAoZDEwdl9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmX2QxMHZfaG93dG9fdGFibGVbZDEwdl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEQxMFYgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLWQxMHZfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9EMTBWX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2QxMHZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotc3RhdGljIGFzZWN0aW9uICoKLWVsZjMyX2QxMHZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX0QxMFZfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhc2UgUl9EMTBWX0dOVV9WVEVOVFJZOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgZGVmYXVsdDoKLQkgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfZDEwdl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcyBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiB3ZSBkb24ndCB1c2UgZ290IGFuZCBwbHQgZW50cmllcyBmb3IgZDEwdiAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0gCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfZDEwdl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotIAotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0gICAgICAgIGggPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotIAotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgICAgewotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0gICAgICAgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX0QxMFZfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0gICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfRDEwVl9HTlVfVlRFTlRSWToKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWxvY2F0ZSBhIEQxMFYgRUxGIHNlY3Rpb24uICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2QxMHZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKHJfdHlwZSA9PSBSX0QxMFZfR05VX1ZURU5UUlkKLSAgICAgICAgICB8fCByX3R5cGUgPT0gUl9EMTBWX0dOVV9WVElOSEVSSVQgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaG93dG8gPSBlbGZfZDEwdl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGggIT0gTlVMTCkKLQluYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgICAgIGVsc2UKLQl7Ci0JICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgIGlmIChuYW1lID09IE5VTEwgfHwgKm5hbWUgPT0gJ1wwJykKLQkgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQl9Ci0gICAgICAKLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqIG1zZyA9IChjb25zdCBjaGFyICopIDA7Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgY29tbW9uX2Vycm9yOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQotCQkgICAgKGluZm8sIG1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2QxMHYKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfRDEwVgotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgICAgIGJmZF9lbGYzMl9kMTB2X3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1kMTB2IgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCSAgICAgICAgICAgICAwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkgICAgICAgICAgICAgZDEwdl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkgICAgICAgICAgICAgMAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nICAgMAotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgZWxmMzJfZDEwdl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vayAgICAgICAgICAgIGVsZjMyX2QxMHZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgZWxmMzJfZDEwdl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiAgICAgICAgIGVsZjMyX2QxMHZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgICAgICAgICAgMQotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItZDMwdi5jIGIvYmZkL2VsZjMyLWQzMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzYjVjMC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItZDMwdi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAxICswLDAgQEAKLS8qIEQzMFYtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgZDMwdl9pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGJmZF9lbGZfZDMwdl9yZWxvYyBQQVJBTVMgKCgKLSAgICAgYmZkICphYmZkLAotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICAgYXN5bWJvbCAqc3ltYm9sLAotICAgICBQVFIgZGF0YSwKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYmZkX2VsZl9kMzB2X3JlbG9jXzIxIFBBUkFNUyAoKAotICAgICBiZmQgKmFiZmQsCi0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgICBhc3ltYm9sICpzeW1ib2wsCi0gICAgIFBUUiBkYXRhLAotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgYmZkICpvdXRwdXRfYmZkLAotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgUl9EMzBWX05PTkUgPSAwLAotICBSX0QzMFZfNiwKLSAgUl9EMzBWXzlfUENSRUwsCi0gIFJfRDMwVl85X1BDUkVMX1IsCi0gIFJfRDMwVl8xNSwKLSAgUl9EMzBWXzE1X1BDUkVMLAotICBSX0QzMFZfMTVfUENSRUxfUiwKLSAgUl9EMzBWXzIxLAotICBSX0QzMFZfMjFfUENSRUwsCi0gIFJfRDMwVl8yMV9QQ1JFTF9SLAotICBSX0QzMFZfMzIsCi0gIFJfRDMwVl8zMl9QQ1JFTCwKLSAgUl9EMzBWXzMyX05PUk1BTCwKLSAgUl9EMzBWX21heAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2QzMHZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfRDMwVl9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QzMFZfNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl85X1BDUkVMLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzlfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl85X1BDUkVMX1IsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfOV9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8xNSwJCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8xNSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8xNV9QQ1JFTCwJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMTVfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8xNV9QQ1JFTF9SLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8xNV9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMjEgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzIxLAkJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzIxIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAyMSBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAzICovCi0gIEhPV1RPIChSX0QzMFZfMjFfUENSRUwsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzIxX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDIxIGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMsIGluIHRoZSBSaWdodCBjb250YWluZXIgKi8KLSAgSE9XVE8gKFJfRDMwVl8yMV9QQ1JFTF9SLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8yMV9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIEQzMFYgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDMwVl8zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAzMiBiaXQgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9EMzBWXzMyX1BDUkVMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8zMl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWd1bGFyIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QzMFZfMzJfTk9STUFMLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMzJfTk9STUFMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLSNkZWZpbmUgTUlOMzIgKGxvbmcgbG9uZykweGZmZmZmZmZmODAwMDAwMDBMTAotI2RlZmluZSBNQVgzMiAweDdmZmZmZmZmTEwKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2VsZl9kMzB2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgbG9uZyBsb25nIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW4xLCBpbjIsIG51bTsKLSAgYmZkX3ZtYSB0bXBfYWRkciA9IDA7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+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+PiAxMikpIDw8IDEyKTsKLSAgZWxzZQotICAgIGluMSB8PSByZWxvY2F0aW9uICYgbWFzazsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBpbjEsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIAotICByZXR1cm4gZmxhZzsKLX0gICAKLQotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBEMzBWIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBkMzB2X3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGQzMHZfcmVsb2NfbWFwIGQzMHZfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX0QzMFZfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl82LCBSX0QzMFZfNiB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzlfUENSRUwsIFJfRDMwVl85X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SLCBSX0QzMFZfOV9QQ1JFTF9SIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMTUsIFJfRDMwVl8xNSB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMLCBSX0QzMFZfMTVfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SLCBSX0QzMFZfMTVfUENSRUxfUiB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzIxLCBSX0QzMFZfMjEgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTCwgUl9EMzBWXzIxX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUiwgUl9EMzBWXzIxX1BDUkVMX1IgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8zMiwgUl9EMzBWXzMyIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwsIFJfRDMwVl8zMl9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9EMzBWXzMyX05PUk1BTCB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKGQzMHZfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGQzMHZfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKGQzMHZfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9kMzB2X2hvd3RvX3RhYmxlW2QzMHZfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBEMzBWIEVMRiByZWxvYyAodHlwZSBSRUwpLiAgKi8KLQotc3RhdGljIHZvaWQKLWQzMHZfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9EMzBWX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2QzMHZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBEMzBWIEVMRiByZWxvYyAodHlwZSBSRUxBKS4gICovCi0KLXN0YXRpYyB2b2lkCi1kMzB2X2luZm9fdG9faG93dG9fcmVsYSAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9EMzBWX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2QzMHZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfZDMwdgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19EMzBWCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgYmZkX2VsZjMyX2QzMHZfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWQzMHYiCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCWQzMHZfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJMAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCTAKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWZyMzAuYyBiL2JmZC9lbGYzMi1mcjMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YzdkMzcuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWZyMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDgxNCArMCwwIEBACi0vKiBGUjMwLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvZnIzMC5oIgotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZyMzBfZWxmX2kyMF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZnIzMF9lbGZfaTMyX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBmcjMwX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIGZyMzBfaW5mb190b19ob3d0b19yZWxhIAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIGZyMzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gZnIzMF9lbGZfZ2Nfc3dlZXBfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGFzZWN0aW9uICogZnIzMF9lbGZfZ2NfbWFya19ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZnIzMF9lbGZfaG93dG9fdGFibGUgW10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX0ZSMzBfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIDggYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzgiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDBmZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIwIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF8yMCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGZyMzBfZWxmX2kyMF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzIwIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF8zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBpbnRvIDQ4IGJpdHMgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0ZSMzBfNDgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBmcjMwX2VsZl9pMzJfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRlIzMF80OCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF82X0lOXzQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzZfSU5fNCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMGYwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBBbiA4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF84X0lOXzgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzhfSU5fOCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwZmYwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBBIDkgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzlfSU5fOCwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDksCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfOV9JTl84IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDBmZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEEgMTAgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzEwX0lOXzgsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzEwX0lOXzgiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MGZmMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgUEMgcmVsYXRpdmUgOSBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAxLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF85X1BDUkVMLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA5LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzlfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIFBDIHJlbGF0aXZlIDEyIGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDEuICAqLwotICBIT1dUTyAoUl9GUjMwXzEyX1BDUkVMLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRlIzMF8xMl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9GUjMwX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0ZSMzBfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX0ZSMzBfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0ZSMzBfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotIAotfTsKLQwKLS8qIFV0aWxpdHkgdG8gYWN0dWFsbHkgcGVyZm9ybSBhbiBSX0ZSMzBfMjAgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1mcjMwX2VsZl9pMjBfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiAgcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiAgc3ltYm9sOwotICAgICBQVFIgICAgICAgIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogICAgICBvdXRwdXRfYmZkOwotICAgICBjaGFyICoqICAgIGVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSAgICAgICByZWxvY2F0aW9uOwotICB1bnNpZ25lZCBsb25nIHg7Ci0gIAotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICAvKiBGSVhNRTogU2VlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJcyB0aGlzIHJpZ2h0PyAgKi8KLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIHJlbG9jYXRpb24gPQotICAgIHN5bWJvbC0+dmFsdWUKLSAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY2F0aW9uID4gKCgxVSA8PCAyMCkgLSAxKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICB4ID0gKHggJiAweGZmMGYwMDAwKSB8IChyZWxvY2F0aW9uICYgMHgwMDAwZmZmZikgfCAoKHJlbG9jYXRpb24gJiAweDAwMGYwMDAwKSA8PCA0KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0MCi0vKiBVdGlsaXR5IHRvIGFjdHVhbGx5IHBlcmZvcm0gYSBSX0ZSMzBfNDggcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1mcjMwX2VsZl9pMzJfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiAgcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiAgc3ltYm9sOwotICAgICBQVFIgICAgICAgIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogICAgICBvdXRwdXRfYmZkOwotICAgICBjaGFyICoqICAgIGVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSAgICAgICByZWxvY2F0aW9uOwotCi0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIC8qIEZJWE1FOiBTZWUgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIElzIHRoaXMgcmlnaHQ/ICAqLwotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgcmVsb2NhdGlvbiA9Ci0gICAgc3ltYm9sLT52YWx1ZQotICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgcmVsb2NhdGlvbiwgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzICsgMik7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQwKLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gRlIzMCBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZnIzMF9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGludCBmcjMwX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZnIzMF9yZWxvY19tYXAgZnIzMF9yZWxvY19tYXAgW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCAgICAgICAgICAgUl9GUjMwX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfOCwgICAgICAgICAgICAgIFJfRlIzMF84IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfMjAsICAgICAgICBSX0ZSMzBfMjAgfSwKLSAgeyBCRkRfUkVMT0NfMzIsICAgICAgICAgICAgIFJfRlIzMF8zMiB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzQ4LCAgICAgICAgUl9GUjMwXzQ4IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfNl9JTl80LCAgICBSX0ZSMzBfNl9JTl80IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfOF9JTl84LCAgICBSX0ZSMzBfOF9JTl84IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfOV9JTl84LCAgICBSX0ZSMzBfOV9JTl84IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfMTBfSU5fOCwgICBSX0ZSMzBfMTBfSU5fOCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzlfUENSRUwsICAgUl9GUjMwXzlfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTCwgIFJfRlIzMF8xMl9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl9GUjMwX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCAgIFJfRlIzMF9HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZnIzMF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gc2l6ZW9mIChmcjMwX3JlbG9jX21hcCkgLyBzaXplb2YgKGZyMzBfcmVsb2NfbWFwWzBdKTsKLSAgICAgICAtLWk7KQotICAgIGlmIChmcjMwX3JlbG9jX21hcCBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotICAgICAgcmV0dXJuICYgZnIzMF9lbGZfaG93dG9fdGFibGUgW2ZyMzBfcmVsb2NfbWFwW2ldLmZyMzBfcmVsb2NfdmFsXTsKLSAgCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEZSMzAgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyMzBfaW5mb190b19ob3d0b19yZWxhIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICogY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICogZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0ZSMzBfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICYgZnIzMF9lbGZfaG93dG9fdGFibGUgW3JfdHlwZV07Ci19Ci0MCi0vKiBQZXJmb3JtIGEgc2luZ2xlIHJlbG9jYXRpb24uICBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgc3RhbmRhcmQgQkZECi0gICByb3V0aW5lcywgYnV0IGEgZmV3IHJlbG9jcywgd2UgaGF2ZSB0byBkbyB0aGVtIG91cnNlbHZlcy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbCwgcmVsb2NhdGlvbikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqICBob3d0bzsKLSAgICAgYmZkICogICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiByZWw7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHIgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgICAgICAgICAgICAgICB4OwotICBiZmRfc2lnbmVkX3ZtYQlzcmVsOwotICAKLSAgc3dpdGNoIChob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0ZSMzBfMjA6Ci0gICAgICBjb250ZW50cyAgICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0KLSAgICAgIGlmIChyZWxvY2F0aW9uID4gKCgxIDw8IDIwKSAtIDEpKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZmYwZjAwMDApIHwgKHJlbG9jYXRpb24gJiAweDAwMDBmZmZmKSB8ICgocmVsb2NhdGlvbiAmIDB4MDAwZjAwMDApIDw8IDQpOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9GUjMwXzQ4OgotICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0ICsgMjsKLSAgICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfRlIzMF85X1BDUkVMOgotICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0ICsgMTsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247Ci0gICAgICBzcmVsICs9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsIC09IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsIC09IDI7ICAvKiBCcmFuY2ggaW5zdHJ1Y3Rpb25zIGFkZCAyIHRvIHRoZSBQQy4uLiAqLwotICAgICAgc3JlbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICAKLSAgICAgIGlmIChzcmVsICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgICBpZiAoc3JlbCA+ICgoMSA8PCA4KSAtIDEpIHx8IChzcmVsIDwgLSAoMSA8PCA4KSkpCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHNyZWwgPj4gMSwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfRlIzMF8xMl9QQ1JFTDoKLSAgICAgIGNvbnRlbnRzICAgKz0gcmVsLT5yX29mZnNldDsKLSAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247Ci0gICAgICBzcmVsICs9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBzcmVsIC09IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsIC09IDI7IC8qIEJyYW5jaCBpbnN0cnVjdGlvbnMgYWRkIDIgdG8gdGhlIFBDLi4uICovCi0gICAgICBzcmVsIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkJICAgICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIAotICAgICAgaWYgKHNyZWwgJiAxKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgIGlmIChzcmVsID4gKCgxIDw8IDExKSAtIDEpIHx8IChzcmVsIDwgLSAoMSA8PCAxMSkpKQotCSAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOwotICAgICAgeCA9ICh4ICYgMHhmODAwKSB8ICgoc3JlbCA+PiAxKSAmIDB4N2ZmKTsKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJICAgIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOwotICAgIH0KLQotICByZXR1cm4gcjsKLX0KLQotDAotLyogUmVsb2NhdGUgYW4gRlIzMCBFTEYgc2VjdGlvbi4KLSAgIFRoZXJlIGlzIHNvbWUgYXR0ZW1wdCB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdXNhYmxlIGZvciBtYW55IGFyY2hpdGVjdHVyZXMsCi0gICBib3RoIFVTRV9SRUwgYW5kIFVTRV9SRUxBIFsndHdvdWxkIGJlIG5pY2UgaWYgc3VjaCBhIGNyaXR0ZXIgZXhpc3RlZF0sCi0gICBpZiBvbmx5IHRvIHNlcnZlIGFzIGEgbGVhcm5pbmcgdG9vbC4KLQotICAgVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3RpbmcgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZQotICAgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzIG5lY2Vzc2FyeS4KLQotICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCi0gICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQotICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKLSAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICBhY2NvcmRpbmdseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1mcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICBpbmZvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgIGxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqICAgICAgICAgICAgIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgcmVsZW5kICAgICA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCArKykKLSAgICB7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgIGhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICByX3N5bW5keDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltOwotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICBzZWM7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgIHI7Ci0gICAgICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMOwotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICByX3R5cGU7Ci0gICAgICAKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgCi0gICAgICBpZiAoICAgcl90eXBlID09IFJfRlIzMF9HTlVfVlRJTkhFUklUCi0JICB8fCByX3R5cGUgPT0gUl9GUjMwX0dOVV9WVEVOVFJZKQotCWNvbnRpbnVlOwotICAgICAgCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLSAgICAgICAgICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0gICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgCi0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnMgW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGhvd3RvICA9IGZyMzBfZWxmX2hvd3RvX3RhYmxlICsgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBoICAgICAgPSBOVUxMOwotICAgICAgc3ltICAgID0gTlVMTDsKLSAgICAgIHNlYyAgICA9IE5VTEw7Ci0gICAgICAKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnMgW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQkgIAotCSAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKTsKLQkgIG5hbWUgPSAobmFtZSA9PSBOVUxMKSA/IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKSA6IG5hbWU7Ci0jaWYgMAotCSAgZnByaW50ZiAoc3RkZXJyLCAibG9jYWw6IHNlYzogJXMsIHN5bTogJXMgKCVkKSwgdmFsdWU6ICV4ICsgJXggKyAleCBhZGRlbmQgJXhcbiIsCi0JCSAgIHNlYy0+bmFtZSwgbmFtZSwgc3ltLT5zdF9uYW1lLAotCQkgICBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEsIHNlYy0+b3V0cHV0X29mZnNldCwKLQkJICAgc3ltLT5zdF92YWx1ZSwgcmVsLT5yX2FkZGVuZCk7Ci0jZW5kaWYKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXMgW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCi0JICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIAotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotI2lmIDAKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICAiZGVmaW5lZDogc2VjOiAlcywgbmFtZTogJXMsIHZhbHVlOiAleCArICV4ICsgJXggZ2l2ZXM6ICV4XG4iLAotCQkgICAgICAgc2VjLT5uYW1lLCBuYW1lLCBoLT5yb290LnUuZGVmLnZhbHVlLAotCQkgICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hLCBzZWMtPm91dHB1dF9vZmZzZXQsIHJlbG9jYXRpb24pOwotI2VuZGlmCi0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgewotI2lmIDAKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJ1bmRlZmluZWQ6IHNlYzogJXMsIG5hbWU6ICVzXG4iLAotCQkgICAgICAgc2VjLT5uYW1lLCBuYW1lKTsKLSNlbmRpZgotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0jaWYgMAotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInVua25vd246IG5hbWU6ICVzXG4iLCBuYW1lKTsKLSNlbmRpZgotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICByID0gZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgY29udGVudHMsIHJlbCwgcmVsb2NhdGlvbik7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikgTlVMTDsKLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHIgPSBpbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93Ci0JCShpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgciA9IGluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbAotCQkoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgcmVsb2NhdGlvbiIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAobXNnKQotCSAgICByID0gaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nCi0JICAgICAgKGluZm8sIG1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KTsKLQotCSAgaWYgKCEgcikKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KLSAgIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotZnIzMF9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgICAgIGluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICByZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgICAgICBzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSX0ZSMzBfR05VX1ZUSU5IRVJJVDoKLQljYXNlIFJfRlIzMF9HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWZyMzBfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICBpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuCi0gICBTaW5jZSB3ZSBkb24ndCBkbyAuZ290cyBvciAucGx0cywgd2UganVzdCBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgdmlydHVhbCB0YWJsZSByZWxvY3MgZm9yIGdjLiAgKi8KLSAKLXN0YXRpYyBib29sZWFuCi1mcjMwX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotIAotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0gICAgICAgIGggPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotIAotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgICAgewotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0gICAgICAgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX0ZSMzBfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0gICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfRlIzMF9HTlVfVlRFTlRSWToKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gCi0gIHJldHVybiB0cnVlOwotfQotDAotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfZnIzMAotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19GUjMwCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgYmZkX2VsZjMyX2ZyMzBfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWZyMzAiCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQkJTlVMTAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJCWZyMzBfaW5mb190b19ob3d0b19yZWxhCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JCWZyMzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCQlmcjMwX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawkJZnIzMF9lbGZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgICAgZnIzMF9lbGZfY2hlY2tfcmVsb2NzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCQkxCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkJZnIzMF9yZWxvY190eXBlX2xvb2t1cAotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItZ2VuLmMgYi9iZmQvZWxmMzItZ2VuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZGE1M2IuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWdlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyogR2VuZXJpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5MywgMTk5NSwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi0vKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgYW55IHJlbG9jYXRpb24gaW5mb3JtYXRpb24sIGJ1dCBzaG91bGQgYmUKLSAgIGdvb2QgZW5vdWdoIGZvciBHREIgb3Igb2JqZHVtcCB0byByZWFkIHRoZSBmaWxlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZHVtbXkgPQotICBIT1dUTyAoMCwJCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJVTktOT1dOIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotc3RhdGljIHZvaWQKLWVsZl9nZW5lcmljX2luZm9fdG9faG93dG8gKGFiZmQsIGJmZF9yZWxvYywgZWxmX3JlbG9jKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICplbGZfcmVsb2MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZkdW1teTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmJmZF9yZWxvYzsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICplbGZfcmVsb2MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZkdW1teTsKLX0KLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGYzMi1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmMzItYmlnIgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX3Vua25vd24KLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fTk9ORQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJZWxmX2dlbmVyaWNfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1ocHBhLmMgYi9iZmQvZWxmMzItaHBwYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzRmZDZlLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1ocHBhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzI5ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSFAgUEEtUklTQyBFTEYgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkKLQotCUNlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZQotCURlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZQotCVVuaXZlcnNpdHkgb2YgVXRhaAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2hwcGEuaCIKLSNpbmNsdWRlICJsaWJocHBhLmgiCi0jaW5jbHVkZSAiZWxmMzItaHBwYS5oIgotI2RlZmluZSBBUkNIX1NJWkUJCTMyCi0jaW5jbHVkZSAiZWxmLWhwcGEuaCIKLQotCi0vKiBXZSB1c2UgdGhyZWUgZGlmZmVyZW50IGhhc2ggdGFibGVzIHRvIGhvbGQgaW5mb3JtYXRpb24gZm9yCi0gICBsaW5raW5nIFBBIEVMRiBvYmplY3RzLgotCi0gICBUaGUgZmlyc3QgaXMgdGhlIGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlIHdoaWNoIGlzIGRlcml2ZWQKLSAgIGZyb20gdGhlIHN0YW5kYXJkIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gIFdlIHVzZSB0aGlzIGFzIGEgcGxhY2UgdG8KLSAgIGF0dGFjaCBvdGhlciBoYXNoIHRhYmxlcyBhbmQgc3RhdGljIGluZm9ybWF0aW9uLgotCi0gICBUaGUgc2Vjb25kIGlzIHRoZSBzdHViIGhhc2ggdGFibGUgd2hpY2ggaXMgZGVyaXZlZCBmcm9tIHRoZQotICAgYmFzZSBCRkQgaGFzaCB0YWJsZS4gIFRoZSBzdHViIGhhc2ggdGFibGUgaG9sZHMgdGhlIGluZm9ybWF0aW9uCi0gICBuZWNlc3NhcnkgdG8gYnVpbGQgdGhlIGxpbmtlciBzdHVicyBkdXJpbmcgYSBsaW5rLiAgKi8KLQotLyogSGFzaCB0YWJsZSBmb3IgbGlua2VyIHN0dWJzLiAgKi8KLQotc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5Ci17Ci0gIC8qIEJhc2UgaGFzaCB0YWJsZSBlbnRyeSBzdHJ1Y3R1cmUsIHdlIGNhbiBnZXQgdGhlIG5hbWUgb2YgdGhlIHN0dWIKLSAgICAgKGFuZCB0aHVzIGtub3cgZXhhY3RseSB3aGF0IGFjdGlvbnMgaXQgcGVyZm9ybXMpIGZyb20gdGhlIGJhc2UKLSAgICAgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIE9mZnNldCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc3R1Yi4gICovCi0gIGJmZF92bWEgb2Zmc2V0OwotCi0gIC8qIEdpdmVuIHRoZSBzeW1ib2wncyB2YWx1ZSBhbmQgaXRzIHNlY3Rpb24gd2UgY2FuIGRldGVybWluZSBpdHMgZmluYWwKLSAgICAgdmFsdWUgd2hlbiBidWlsZGluZyB0aGUgc3R1YnMgKHNvIHRoZSBzdHViIGtub3dzIHdoZXJlIHRvIGp1bXAuICAqLwotICBzeW12YWx1ZSB0YXJnZXRfdmFsdWU7Ci0gIGFzZWN0aW9uICp0YXJnZXRfc2VjdGlvbjsKLX07Ci0KLXN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZQotewotICAvKiBUaGUgaGFzaCB0YWJsZSBpdHNlbGYuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBUaGUgc3R1YiBCRkQuICAqLwotICBiZmQgKnN0dWJfYmZkOwotCi0gIC8qIFdoZXJlIHRvIHBsYWNlIHRoZSBuZXh0IHN0dWIuICAqLwotICBiZmRfYnl0ZSAqbG9jYXRpb247Ci0KLSAgLyogQ3VycmVudCBvZmZzZXQgaW4gdGhlIHN0dWIgc2VjdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0KLX07Ci0KLXN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotfTsKLQotc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBtYWluIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFRoZSBzdHViIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnN0dWJfaGFzaF90YWJsZTsKLQotICAvKiBBIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygb3V0cHV0IHN5bWJvbHMuICAqLwotICB1bnNpZ25lZCBpbnQgb3V0cHV0X3N5bWJvbF9jb3VudDsKLQotICAvKiBTdHVmZiBzbyB3ZSBjYW4gaGFuZGxlIERQIHJlbGF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgbG9uZyBnbG9iYWxfdmFsdWU7Ci0gIGludCBnbG9iYWxfc3ltX2RlZmluZWQ7Ci19OwotCi0vKiBFTEYzMi9IUFBBIHJlbG9jYXRpb24gc3VwcG9ydAotCi0JVGhpcyBmaWxlIGNvbnRhaW5zIEVMRjMyL0hQUEEgcmVsb2NhdGlvbiBzdXBwb3J0IGFzIHNwZWNpZmllZAotCWluIHRoZSBTdHJhdHVzIEZUWC9Hb2xmIE9iamVjdCBGaWxlIEZvcm1hdCAoU0VELTE3NjIpIGRhdGVkCi0JRmVicnVhcnkgMTk5NC4gICovCi0KLSNpbmNsdWRlICJlbGYzMi1ocHBhLmgiCi0jaW5jbHVkZSAiaHBwYV9zdHVicy5oIgotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBocHBhX2VsZl9yZWxvY2F0ZV9pbnNuCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBsb25nLAotCSAgIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmMzJfaHBwYV9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBiZmRfYnl0ZSAqLCBiZmRfdm1hLCBiZmRfdm1hLCBiZmRfdm1hLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgIGFzZWN0aW9uICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZWxmMzJfaHBwYV9zdHViX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqLCBiZmQgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpKTsKLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfYnVpbGRfb25lX3N0dWIgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGVsZjMyX2hwcGFfc2l6ZV9vZl9zdHViCi0gIFBBUkFNUyAoKGJmZF92bWEsIGJmZF92bWEsIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZCBlbGYzMl9ocHBhX25hbWVfb2Zfc3R1YgotICBQQVJBTVMgKChiZmRfdm1hLCBiZmRfdm1hLCBjaGFyICopKTsKLQotLyogRm9yIGxpbmtlciBzdHViIGhhc2ggdGFibGVzLiAgKi8KLSNkZWZpbmUgZWxmMzJfaHBwYV9zdHViX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLSNkZWZpbmUgZWxmMzJfaHBwYV9zdHViX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pIFwKLSAgKGJmZF9oYXNoX3RyYXZlcnNlIFwKLSAgICgmKHRhYmxlKS0+cm9vdCwgXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwgXAotICAgIChpbmZvKSkpCi0KLS8qIEZvciBIUFBBIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlbGYzMl9ocHBhX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpXAotICAoKHN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQlcCi0gICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotI2RlZmluZSBlbGYzMl9ocHBhX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgUEEgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGYzMl9ocHBhX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotCi0vKiBBc3NvcnRlZCBoYXNoIHRhYmxlIGZ1bmN0aW9ucy4gICovCi0KLS8qIEluaXRpYWxpemUgYW4gZW50cnkgaW4gdGhlIHN0dWIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZWxmMzJfaHBwYV9zdHViX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICpyZXQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5vZmZzZXQgPSAwOwotICAgICAgcmV0LT50YXJnZXRfdmFsdWUgPSAwOwotICAgICAgcmV0LT50YXJnZXRfc2VjdGlvbiA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogSW5pdGlhbGl6ZSBhIHN0dWIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgc3R1Yl9iZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqc3R1Yl9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHRhYmxlLT5vZmZzZXQgPSAwOwotICB0YWJsZS0+bG9jYXRpb24gPSAwOwotICB0YWJsZS0+c3R1Yl9iZmQgPSBzdHViX2JmZDsKLSAgcmV0dXJuIChiZmRfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIG5ld2Z1bmMpKTsKLX0KLQotLyogQ3JlYXRlIHRoZSBkZXJpdmVkIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhlIFBBIEVMRiBwb3J0IHVzZXMgdGhlIGRlcml2ZWQKLSAgIGhhc2ggdGFibGUgdG8ga2VlcCBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgUEEgRUxGIGxpbmtlciAod2l0aG91dAotICAgdXNpbmcgc3RhdGljIHZhcmlhYmxlcykuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCFfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldC0+c3R1Yl9oYXNoX3RhYmxlID0gTlVMTDsKLSAgcmV0LT5vdXRwdXRfc3ltYm9sX2NvdW50ID0gMDsKLSAgcmV0LT5nbG9iYWxfdmFsdWUgPSAwOwotICByZXQtPmdsb2JhbF9zeW1fZGVmaW5lZCA9IDA7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogUmVsb2NhdGUgdGhlIGdpdmVuIElOU04gZ2l2ZW4gdGhlIHZhcmlvdXMgaW5wdXQgcGFyYW1ldGVycy4KLQotICAgRklYTUU6IGVuZGlhbm5lc3MgYW5kIHNpemVvZiAobG9uZykgaXNzdWVzIGFib3VuZCBoZXJlLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWhwcGFfZWxmX3JlbG9jYXRlX2luc24gKGFiZmQsIGlucHV0X3NlY3QsIGluc24sIGFkZHJlc3MsIHN5bV92YWx1ZSwKLQkJCXJfYWRkZW5kLCByX2Zvcm1hdCwgcl9maWVsZCwgcGNyZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Q7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotICAgICBsb25nIHN5bV92YWx1ZTsKLSAgICAgbG9uZyByX2FkZGVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyByX2Zvcm1hdDsKLSAgICAgdW5zaWduZWQgbG9uZyByX2ZpZWxkOwotICAgICB1bnNpZ25lZCBsb25nIHBjcmVsOwotewotICB1bnNpZ25lZCBjaGFyIG9wY29kZSA9IGdldF9vcGNvZGUgKGluc24pOwotICBsb25nIGNvbnN0YW50X3ZhbHVlOwotCi0gIHN3aXRjaCAob3Bjb2RlKQotICAgIHsKLSAgICBjYXNlIExETzoKLSAgICBjYXNlIExEQjoKLSAgICBjYXNlIExESDoKLSAgICBjYXNlIExEVzoKLSAgICBjYXNlIExEV006Ci0gICAgY2FzZSBTVEI6Ci0gICAgY2FzZSBTVEg6Ci0gICAgY2FzZSBTVFc6Ci0gICAgY2FzZSBTVFdNOgotICAgIGNhc2UgQ09NSUNMUjoKLSAgICBjYXNlIFNVQkk6Ci0gICAgY2FzZSBBRERJVDoKLSAgICBjYXNlIEFEREk6Ci0gICAgY2FzZSBMRElMOgotICAgIGNhc2UgQURESUw6Ci0gICAgICBjb25zdGFudF92YWx1ZSA9IEhQUEFfUl9DT05TVEFOVCAocl9hZGRlbmQpOwotCi0gICAgICBpZiAocGNyZWwpCi0Jc3ltX3ZhbHVlIC09IGFkZHJlc3M7Ci0KLSAgICAgIHN5bV92YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIGNvbnN0YW50X3ZhbHVlLCByX2ZpZWxkKTsKLSAgICAgIHJldHVybiBocHBhX3JlYnVpbGRfaW5zbiAoYWJmZCwgaW5zbiwgc3ltX3ZhbHVlLCByX2Zvcm1hdCk7Ci0KLSAgICBjYXNlIEJMOgotICAgIGNhc2UgQkU6Ci0gICAgY2FzZSBCTEU6Ci0gICAgICAvKiBYWFggY29tcHV0aW5nIGNvbnN0YW50X3ZhbHVlIGlzIG5vdCBuZWVkZWQ/Pz8gKi8KLSAgICAgIGNvbnN0YW50X3ZhbHVlID0gYXNzZW1ibGVfMTcgKChpbnNuICYgMHgwMDFmMDAwMCkgPj4gMTYsCi0JCQkJICAgIChpbnNuICYgMHgwMDAwMWZmYykgPj4gMiwKLQkJCQkgICAgaW5zbiAmIDEpOwotCi0gICAgICBjb25zdGFudF92YWx1ZSA9IChjb25zdGFudF92YWx1ZSA8PCAxNSkgPj4gMTU7Ci0gICAgICBpZiAocGNyZWwpCi0JewotCSAgc3ltX3ZhbHVlIC09Ci0JICAgIGFkZHJlc3MgKyBpbnB1dF9zZWN0LT5vdXRwdXRfb2Zmc2V0Ci0JICAgICsgaW5wdXRfc2VjdC0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIHN5bV92YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIC04LCByX2ZpZWxkKTsKLQl9Ci0gICAgICBlbHNlCi0Jc3ltX3ZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgY29uc3RhbnRfdmFsdWUsIHJfZmllbGQpOwotCi0gICAgICByZXR1cm4gaHBwYV9yZWJ1aWxkX2luc24gKGFiZmQsIGluc24sIHN5bV92YWx1ZSA+PiAyLCByX2Zvcm1hdCk7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKG9wY29kZSA9PSAwKQotCXsKLQkgIGNvbnN0YW50X3ZhbHVlID0gSFBQQV9SX0NPTlNUQU5UIChyX2FkZGVuZCk7Ci0KLQkgIGlmIChwY3JlbCkKLQkgICAgc3ltX3ZhbHVlIC09IGFkZHJlc3M7Ci0KLQkgIHJldHVybiBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCBjb25zdGFudF92YWx1ZSwgcl9maWVsZCk7Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotICAgIH0KLX0KLQotLyogUmVsb2NhdGUgYW4gSFBQQSBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaG93dG8gPSBlbGZfaHBwYV9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHN5bV9zZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0OwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzeW1fc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc3ltX3NlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OCi0JCQkgICA/IDAgOiBzeW0tPnN0X3ZhbHVlKQotCQkJICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldAotCQkJICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvbmcgaW5keDsKLQotCSAgaW5keCA9IHJfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgIGggPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc3ltX3NlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaCAhPSBOVUxMKQotCXN5bV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkgICAgICBzeW0tPnN0X25hbWUpOwotCSAgaWYgKHN5bV9uYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICgqc3ltX25hbWUgPT0gJ1wwJykKLQkgICAgc3ltX25hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHN5bV9zZWMpOwotCX0KLQotICAgICAgciA9IGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCQkgICAgICByZWwtPnJfb2Zmc2V0LCByZWxvY2F0aW9uLAotCQkJCQkgICAgICByZWwtPnJfYWRkZW5kLCBpbmZvLCBzeW1fc2VjLAotCQkJCQkgICAgICBzeW1fbmFtZSwgaCA9PSBOVUxMKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICAvKiBUaGlzIGNhbiBoYXBwZW4gZm9yIERQIHJlbGF0aXZlIHJlbG9jcyBpZiAkZ2xvYmFsJCBpcwotCSAgICAgICB1bmRlZmluZWQuICBUaGlzIGlzIGEgcGFuaWMgc2l0dWF0aW9uIHNvIHdlIGRvbid0IHRyeQotCSAgICAgICB0byBjb250aW51ZS4gICovCi0JICAgIGNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sICIkZ2xvYmFsJCIsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICB7Ci0JCS8qIFdlIHVzZSB0aGlzIHJldHVybiB2YWx1ZSB0byBpbmRpY2F0ZSB0aGF0IHdlIHBlcmZvcm1lZAotCQkgICBhICJkYW5nZXJvdXMiIHJlbG9jYXRpb24uICBUaGlzIGRvZXNuJ3QgbWVhbiB3ZSBkaWQKLQkJICAgdGhlIHdyb25nIHRoaW5nLCBpdCBqdXN0IG1lYW5zIHRoZXJlIG1heSBiZSBzb21lIGNsZWFudXAKLQkJICAgdGhhdCBuZWVkcyB0byBiZSBkb25lIGhlcmUuCi0KLQkJICAgSW4gcGFydGljdWxhciB3ZSBoYWQgdG8gc3dhcCB0aGUgbGFzdCBjYWxsIGluc24gYW5kIGl0cwotCQkgICBkZWxheSBzbG90LiAgSWYgdGhlIGRlbGF5IHNsb3QgaW5zbiBuZWVkZWQgYSByZWxvY2F0aW9uLAotCQkgICB0aGVuIHdlJ2xsIG5lZWQgdG8gYWRqdXN0IHRoZSBuZXh0IHJlbG9jYXRpb24gZW50cnkncwotCQkgICBvZmZzZXQgdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCB0aGUgaW5zbiBtb3ZlZC4KLQotCQkgICBUaGlzIGhhaXIgd291bGRuJ3QgYmUgbmVjZXNzYXJ5IGlmIHdlIGluc2VydGVkIHN0dWJzCi0JCSAgIGJldHdlZW4gcHJvY2VkdXJlcyBhbmQgdXNlZCBhICJibCIgdG8gZ2V0IHRvIHRoZSBzdHViLiAgKi8KLQkJaWYgKHJlbCAhPSByZWxlbmQpCi0JCSAgewotCQkgICAgRWxmX0ludGVybmFsX1JlbGEgKm5leHRfcmVsID0gcmVsICsgMTsKLQotCQkgICAgaWYgKHJlbC0+cl9vZmZzZXQgKyA0ID09IG5leHRfcmVsLT5yX29mZnNldCkKLQkJICAgICAgbmV4dF9yZWwtPnJfb2Zmc2V0IC09IDQ7Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAoaW5mbywgc3ltX25hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBY3R1YWxseSBwZXJmb3JtIGEgcmVsb2NhdGlvbiBhcyBwYXJ0IG9mIGEgZmluYWwgbGluay4gIFRoaXMgY2FuIGdldAotICAgcmF0aGVyIGhhaXJ5IHdoZW4gbGlua2VyIHN0dWJzIGFyZSBuZWVkZWQuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCSAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCB2YWx1ZSwKLQkJCQkgICAgYWRkZW5kLCBpbmZvLCBzeW1fc2VjLCBzeW1fbmFtZSwgaXNfbG9jYWwpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjOwotICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLSAgICAgaW50IGlzX2xvY2FsOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgcl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIHVuc2lnbmVkIGxvbmcgcl9mb3JtYXQgPSBob3d0by0+Yml0c2l6ZTsKLSAgdW5zaWduZWQgbG9uZyByX2ZpZWxkID0gZV9mc2VsOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLSAgYm9vbGVhbiByX3BjcmVsID0gaG93dG8tPnBjX3JlbGF0aXZlOwotCi0gIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKTsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbHVlIGZvciAkZ2xvYmFsJC4gIEZJWE1FIGlzbid0IHRoaXMgZWZmZWN0aXZlbHkKLSAgICAganVzdCBsaWtlIHRoZSBncCBwb2ludGVyIG9uIE1JUFM/ICBDYW4gd2UgdXNlIHRob3NlIHJvdXRpbmVzIGZvciB0aGlzCi0gICAgIHB1cnBvc2U/ICAqLwotICBpZiAoIWVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF9zeW1fZGVmaW5lZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAiJGdsb2JhbCQiLCBmYWxzZSwKLQkJCQkgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgLyogSWYgdGhlcmUgaXNuJ3QgYSAkZ2xvYmFsJCwgdGhlbiB3ZSdyZSBpbiBkZWVwIHRyb3VibGUuICAqLwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgICAgLyogSWYgJGdsb2JhbCQgaXNuJ3QgYSBkZWZpbmVkIHN5bWJvbCwgdGhlbiB3ZSdyZSBzdGlsbCBpbiBkZWVwCi0JIHRyb3VibGUuICAqLwotICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF92YWx1ZSA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfc3ltX2RlZmluZWQgPSAxOwotICAgIH0KLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1BBUklTQ19OT05FOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfUEFSSVNDX0RJUjMyOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTdGOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN0M6Ci0gICAgICByX2ZpZWxkID0gZV9mc2VsOwotICAgICAgZ290byBkb19iYXNpY190eXBlXzE7Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDIxTDoKLSAgICAgIHJfZmllbGQgPSBlX2xyc2VsOwotICAgICAgZ290byBkb19iYXNpY190eXBlXzE7Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxN1I6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3UjoKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTRSOgotICAgICAgcl9maWVsZCA9IGVfcnJzZWw7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLQotICAgIC8qIEZvciBhbGwgdGhlIERQIHJlbGF0aXZlIHJlbG9jYXRpb25zLCB3ZSBuZWVkIHRvIGV4YW1pbmUgdGhlIHN5bWJvbCdzCi0gICAgICAgc2VjdGlvbi4gIElmIGl0J3MgYSBjb2RlIHNlY3Rpb24sIHRoZW4gImRhdGEgcG9pbnRlciByZWxhdGl2ZSIgbWFrZXMKLSAgICAgICBubyBzZW5zZS4gIEluIHRoYXQgY2FzZSB3ZSBkb24ndCBhZGp1c3QgdGhlICJ2YWx1ZSIsIGFuZCBmb3IgMjEgYml0Ci0gICAgICAgYWRkaWwgaW5zdHJ1Y3Rpb25zLCB3ZSBjaGFuZ2UgdGhlIHNvdXJjZSBhZGRlbmQgcmVnaXN0ZXIgZnJvbSAlZHAgdG8KLSAgICAgICAlcjAuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwyMUw6Ci0gICAgICByX2ZpZWxkID0gZV9scnNlbDsKLSAgICAgIGlmIChzeW1fc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotCXsKLQkgIGlmICgoaW5zbiAmIDB4ZmMwMDAwMDApID4+IDI2ID09IDB4YQotCSAgICAgICAmJiAoaW5zbiAmIDB4MDNlMDAwMDApID4+IDIxID09IDB4MWIpCi0JICAgIGluc24gJj0gfjB4MDNlMDAwMDA7Ci0JfQotICAgICAgZWxzZQotCXZhbHVlIC09IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF92YWx1ZTsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNFI6Ci0gICAgICByX2ZpZWxkID0gZV9ycnNlbDsKLSAgICAgIGlmICgoc3ltX3NlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLQl2YWx1ZSAtPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfdmFsdWU7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLSAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRGOgotICAgICAgcl9maWVsZCA9IGVfZnNlbDsKLSAgICAgIGlmICgoc3ltX3NlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLQl2YWx1ZSAtPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfdmFsdWU7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLQotICAgIC8qIFRoZXNlIGNhc2VzIGFyZSBzZXBhcmF0ZSBhcyB0aGV5IG1heSBpbnZvbHZlIGEgbG90IG1vcmUgd29yawotICAgICAgIHRvIGRlYWwgd2l0aCBsaW5rZXIgc3R1YnMuICAqLwotICAgIGNhc2UgUl9QQVJJU0NfUExBQkVMMzI6Ci0gICAgY2FzZSBSX1BBUklTQ19QTEFCRUwyMUw6Ci0gICAgY2FzZSBSX1BBUklTQ19QTEFCRUwxNFI6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3RjoKLSAgICAgIHsKLQliZmRfdm1hIGxvY2F0aW9uOwotCXVuc2lnbmVkIGludCBsZW47Ci0JY2hhciAqbmV3X25hbWUsICpzdHViX25hbWU7Ci0KLQkvKiBHZXQgdGhlIGZpZWxkIHNlbGVjdG9yIHJpZ2h0LiAgV2UnbGwgbmVlZCBpdCBpbiBhIG1pbnV0ZS4gICovCi0JaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QQ1JFTDE3RgotCSAgICB8fCByX3R5cGUgPT0gUl9QQVJJU0NfUExBQkVMMzIpCi0JICByX2ZpZWxkID0gZV9mc2VsOwotCWVsc2UgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QTEFCRUwyMUwpCi0JICByX2ZpZWxkID0gZV9scnNlbDsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExBQkVMMTRSKQotCSAgcl9maWVsZCA9IGVfcnJzZWw7Ci0KLQkvKiBGaW5kIG91dCB3aGVyZSB3ZSBhcmUgYW5kIHdoZXJlIHdlJ3JlIGdvaW5nLiAgKi8KLQlsb2NhdGlvbiA9IChvZmZzZXQgKwotCQkgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArCi0JCSAgICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotCWxlbiA9IHN0cmxlbiAoc3ltX25hbWUpICsgMTsKLQlpZiAoaXNfbG9jYWwpCi0JICBsZW4gKz0gOTsKLQluZXdfbmFtZSA9IGJmZF9tYWxsb2MgKGxlbik7Ci0JaWYgKCFuZXdfbmFtZSkKLQkgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCXN0cmNweSAobmV3X25hbWUsIHN5bV9uYW1lKTsKLQotCS8qIExvY2FsIHN5bWJvbHMgaGF2ZSB1bmlxdWUgSURzLiAgKi8KLQlpZiAoaXNfbG9jYWwpCi0JICBzcHJpbnRmIChuZXdfbmFtZSArIGxlbiAtIDEwLCAiXyUwOHgiLCAoaW50KXN5bV9zZWMpOwotCi0JLyogQW55IGtpbmQgb2YgbGlua2VyIHN0dWIgbmVlZGVkPyAgKi8KLQlpZiAoKChpbnQpKHZhbHVlIC0gbG9jYXRpb24pID4gMHgzZmZmZikKLQkgICAgfHwgKChpbnQpKHZhbHVlIC0gbG9jYXRpb24pIDwgKGludCkweGZmZmMwMDAwKSkKLQkgIHsKLQkgICAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICpzdHViX2hhc2hfdGFibGU7Ci0JICAgIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqc3R1Yl9oYXNoOwotCSAgICBhc2VjdGlvbiAqc3R1Yl9zZWN0aW9uOwotCi0JICAgIC8qIEJ1aWxkIGEgbmFtZSBmb3IgdGhlIHN0dWIuICAqLwotCi0JICAgIGxlbiA9IHN0cmxlbiAobmV3X25hbWUpOwotCSAgICBsZW4gKz0gMjM7Ci0JICAgIHN0dWJfbmFtZSA9IGJmZF9tYWxsb2MgKGxlbik7Ci0JICAgIGlmICghc3R1Yl9uYW1lKQotCSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCSAgICBlbGYzMl9ocHBhX25hbWVfb2Zfc3R1YiAobG9jYXRpb24sIHZhbHVlLCBzdHViX25hbWUpOwotCSAgICBzdHJjYXQgKHN0dWJfbmFtZSwgbmV3X25hbWUpOwotCSAgICBmcmVlIChuZXdfbmFtZSk7Ci0KLQkgICAgc3R1Yl9oYXNoX3RhYmxlID0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+c3R1Yl9oYXNoX3RhYmxlOwotCi0JICAgIHN0dWJfaGFzaAotCSAgICAgID0gZWxmMzJfaHBwYV9zdHViX2hhc2hfbG9va3VwIChzdHViX2hhc2hfdGFibGUsIHN0dWJfbmFtZSwKLQkJCQkJICAgICBmYWxzZSwgZmFsc2UpOwotCi0JICAgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGF0IG5hbWUuICAqLwotCSAgICBmcmVlIChzdHViX25hbWUpOwotCi0JICAgIC8qIFRoZSBzdHViIEJGRCBvbmx5IGhhcyBvbmUgc2VjdGlvbi4gICovCi0JICAgIHN0dWJfc2VjdGlvbiA9IHN0dWJfaGFzaF90YWJsZS0+c3R1Yl9iZmQtPnNlY3Rpb25zOwotCi0JICAgIGlmIChzdHViX2hhc2ggIT0gTlVMTCkKLQkgICAgICB7Ci0JCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUENSRUwxN0YpCi0JCSAgewotCQkgICAgdW5zaWduZWQgbG9uZyBkZWxheV9pbnNuOwotCQkgICAgdW5zaWduZWQgaW50IG9wY29kZSwgcnRuX3JlZywgbGRvX3RhcmdldF9yZWcsIGxkb19zcmNfcmVnOwotCi0JCSAgICAvKiBXZSdsbCBuZWVkIHRvIHBlZWsgYXQgdGhlIG5leHQgaW5zbi4gICovCi0JCSAgICBkZWxheV9pbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSArIDQpOwotCQkgICAgb3Bjb2RlID0gZ2V0X29wY29kZSAoZGVsYXlfaW5zbik7Ci0KLQkJICAgIC8qIFdlIGFsc28gbmVlZCB0byBrbm93IHRoZSByZXR1cm4gcmVnaXN0ZXIgZm9yIHRoaXMKLQkJICAgICAgIGNhbGwuICAqLwotCQkgICAgcnRuX3JlZyA9IChpbnNuICYgMHgwM2UwMDAwMCkgPj4gMjE7Ci0KLQkJICAgIGxkb19zcmNfcmVnID0gKGRlbGF5X2luc24gJiAweDAzZTAwMDAwKSA+PiAyMTsKLQkJICAgIGxkb190YXJnZXRfcmVnID0gKGRlbGF5X2luc24gJiAweDAwMWYwMDAwKSA+PiAxNjsKLQotCQkgICAgLyogTXVuZ2UgdXAgdGhlIHZhbHVlIGFuZCBvdGhlciBwYXJhbWV0ZXJzIGZvcgotCQkgICAgICAgaHBwYV9lbGZfcmVsb2NhdGVfaW5zbi4gICovCi0KLQkJICAgIHZhbHVlID0gKHN0dWJfaGFzaC0+b2Zmc2V0Ci0JCQkgICAgICsgc3R1Yl9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICsgc3R1Yl9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotCQkgICAgcl9mb3JtYXQgPSAxNzsKLQkJICAgIHJfZmllbGQgPSBlX2ZzZWw7Ci0JCSAgICByX3BjcmVsID0gMDsKLQkJICAgIGFkZGVuZCA9IDA7Ci0KLQkJICAgIC8qIFdlIG5lZWQgdG8gcGVlayBhdCB0aGUgZGVsYXkgaW5zbiBhbmQgZGV0ZXJtaW5lIGlmCi0JCSAgICAgICB3ZSdsbCBuZWVkIHRvIHN3YXAgdGhlIGJyYW5jaCBhbmQgaXRzIGRlbGF5IGluc24uICAqLwotCQkgICAgaWYgKChpbnNuICYgMikKLQkJCXx8IChvcGNvZGUgPT0gTERPCi0JCQkgICAgJiYgbGRvX3RhcmdldF9yZWcgPT0gcnRuX3JlZykKLQkJCXx8IChkZWxheV9pbnNuID09IDB4MDgwMDAyNDApKQotCQkgICAgICB7Ci0JCQkvKiBObyBuZWVkIHRvIHN3YXAgdGhlIGJyYW5jaCBhbmQgaXRzIGRlbGF5IHNsb3QsIGJ1dAotCQkJICAgd2UgZG8gbmVlZCB0byBtYWtlIHN1cmUgdG8ganVtcCBwYXN0IHRoZSByZXR1cm4KLQkJCSAgIHBvaW50ZXIgdXBkYXRlIGluIHRoZSBzdHViLiAgKi8KLQkJCXZhbHVlICs9IDQ7Ci0KLQkJCS8qIElmIHRoZSBkZWxheSBpbnNuIGRvZXMgYSByZXR1cm4gcG9pbnRlciBhZGp1c3RtZW50LAotCQkJICAgdGhlbiB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSBpdCBzdGF5cyB2YWxpZC4gICovCi0JCQlpZiAob3Bjb2RlID09IExETwotCQkJICAgICYmIGxkb190YXJnZXRfcmVnID09IHJ0bl9yZWcpCi0JCQkgIHsKLQkJCSAgICBkZWxheV9pbnNuICY9IDB4ZmMwMGZmZmY7Ci0JCQkgICAgZGVsYXlfaW5zbiB8PSAoKDMxIDw8IDIxKSB8ICgzMSA8PCAxNikpOwotCQkJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgZGVsYXlfaW5zbiwgaGl0X2RhdGEgKyA0KTsKLQkJCSAgfQotCQkJLyogVXNlIGEgQkxFIHRvIHJlYWNoIHRoZSBzdHViLiAgKi8KLQkJCWluc24gPSBCTEVfU1I0X1IwOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCS8qIFdvbmRlcmZ1bCwgd2UgaGF2ZSB0byBzd2FwIHRoZSBjYWxsIGluc24gYW5kIGl0cwotCQkJICAgZGVsYXkgc2xvdC4gICovCi0JCQliZmRfcHV0XzMyIChpbnB1dF9iZmQsIGRlbGF5X2luc24sIGhpdF9kYXRhKTsKLQkJCS8qIFVzZSBhIEJMRSxuIHRvIHJlYWNoIHRoZSBzdHViLiAgKi8KLQkJCWluc24gPSAoQkxFX1NSNF9SMCB8IDB4Mik7Ci0JCQliZmRfcHV0XzMyIChpbnB1dF9iZmQsIGluc24sIGhpdF9kYXRhICsgNCk7Ci0JCQlpbnNuID0gaHBwYV9lbGZfcmVsb2NhdGVfaW5zbiAoaW5wdXRfYmZkLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkgICAgICAgaW5zbiwgb2Zmc2V0ICsgNCwKLQkJCQkJCSAgICAgICB2YWx1ZSwgYWRkZW5kLAotCQkJCQkJICAgICAgIHJfZm9ybWF0LCByX2ZpZWxkLAotCQkJCQkJICAgICAgIHJfcGNyZWwpOwotCQkJLyogVXBkYXRlIHRoZSBpbnN0cnVjdGlvbiB3b3JkLiAgKi8KLQkJCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgaGl0X2RhdGEgKyA0KTsKLQkJCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgICAgZWxzZQotCQkgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCSAgICAgIH0KLQkgIH0KLQlnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLSAgICAgIH0KLQotZG9fYmFzaWNfdHlwZV8xOgotICAgICAgaW5zbiA9IGhwcGFfZWxmX3JlbG9jYXRlX2luc24gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgaW5zbiwKLQkJCQkgICAgIG9mZnNldCwgdmFsdWUsIGFkZGVuZCwgcl9mb3JtYXQsCi0JCQkJICAgICByX2ZpZWxkLCByX3BjcmVsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogU29tZXRoaW5nIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZS4gICovCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLQotICAvKiBVcGRhdGUgdGhlIGluc3RydWN0aW9uIHdvcmQuICAqLwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGluc24sIGhpdF9kYXRhKTsKLSAgcmV0dXJuIChiZmRfcmVsb2Nfb2spOwotfQotCi0vKiBVbmRvIHRoZSBnZW5lcmljIEVMRiBjb2RlJ3Mgc3VidHJhY3Rpb24gb2Ygc2VjdGlvbi0+dm1hIGZyb20gdGhlCi0gICB2YWx1ZSBvZiBlYWNoIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmbGFnd29yZCAqZmxhZ3NwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYmZkX3ZtYSAqdmFscDsKLXsKLSAgKnZhbHAgKz0gKCpzZWNwKS0+dm1hOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSBzdHViIG5lZWRlZCB0byBwZXJmb3JtIGEgY2FsbCBhc3N1bWluZyB0aGUKLSAgIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBmb3IgY2FsbGVyIGFuZCBjYWxsZWUgYXJlIGluIENBTExFUiBhbmQgQ0FMTEVFCi0gICBmb3IgYSBjYWxsIGZyb20gTE9DQVRJT04gdG8gREVTVElOQVRJT04uICBDb3B5IHRoZSBuYW1lIGludG8gU1RVQl9OQU1FLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjMyX2hwcGFfbmFtZV9vZl9zdHViIChsb2NhdGlvbiwgZGVzdGluYXRpb24sIHN0dWJfbmFtZSkKLSAgICAgYmZkX3ZtYSBsb2NhdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIGRlc3RpbmF0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKnN0dWJfbmFtZTsKLXsKLSAgc3RyY3B5IChzdHViX25hbWUsICJfX19fX2xvbmdfYnJhbmNoX3N0dWJfIik7Ci19Ci0KLS8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHN0dWIgbmVlZGVkIHRvIGNhbGwgZnJvbSBMT0NBVElPTiB0byBERVNUSU5BVElPTgotICAgKGEgZnVuY3Rpb24gbmFtZWQgU1lNX05BTUUpLCB3aXRoIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBDQUxMRVIgYW5kCi0gICBDQUxMRUUuICBSZXR1cm4gemVybyBpZiBubyBzdHViIGlzIG5lZWRlZCB0byBwZXJmb3JtIHN1Y2ggYSBjYWxsLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotZWxmMzJfaHBwYV9zaXplX29mX3N0dWIgKGxvY2F0aW9uLCBkZXN0aW5hdGlvbiwgc3ltX25hbWUpCi0gICAgIGJmZF92bWEgbG9jYXRpb24sIGRlc3RpbmF0aW9uOwotICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLXsKLSAgLyogRGV0ZXJtaW5lIGlmIGEgbG9uZyBicmFuY2ggc3R1YiBpcyBuZWVkZWQuICAqLwotICBpZiAoISgoKGludCkobG9jYXRpb24gLSBkZXN0aW5hdGlvbikgPiAweDNmZmZmKQotCXx8ICgoaW50KShsb2NhdGlvbiAtIGRlc3RpbmF0aW9uKSA8IChpbnQpMHhmZmZjMDAwMCkpKQotICAgIHJldHVybiAwOwotCi0gIGlmICghc3RybmNtcCAoIiQkIiwgc3ltX25hbWUsIDIpCi0gICAgICAmJiBzdHJjbXAgKCIkJGR5bmNhbGwiLCBzeW1fbmFtZSkpCi0gICAgcmV0dXJuIDEyOwotICBlbHNlCi0gICAgcmV0dXJuIDE2OwotfQotCi0vKiBCdWlsZCBvbmUgbGlua2VyIHN0dWIgYXMgZGVmaW5lZCBieSB0aGUgc3R1YiBoYXNoIHRhYmxlIGVudHJ5IEdFTl9FTlRSWS4KLSAgIElOX0FSR1MgY29udGFpbnMgdGhlIHN0dWIgQkZEIGFuZCBsaW5rIGluZm8gcG9pbnRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9idWlsZF9vbmVfc3R1YiAoZ2VuX2VudHJ5LCBpbl9hcmdzKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmdlbl9lbnRyeTsKLSAgICAgUFRSIGluX2FyZ3M7Ci17Ci0gIHZvaWQgKiphcmdzID0gKHZvaWQgKiopaW5fYXJnczsKLSAgYmZkICpzdHViX2JmZCA9IChiZmQgKilhcmdzWzBdOwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKWFyZ3NbMV07Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqZW50cnk7Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlOwotICBiZmRfYnl0ZSAqbG9jOwotICBzeW12YWx1ZSBzeW1fdmFsdWU7Ci0gIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCi0gIC8qIEluaXRpYWxpemUgcG9pbnRlcnMgdG8gdGhlIHN0dWIgaGFzaCB0YWJsZSwgdGhlIHBhcnRpY3VsYXIgZW50cnkgd2UKLSAgICAgYXJlIGJ1aWxkaW5nIGEgc3R1YiBmb3IsIGFuZCB3aGVyZSAoaW4gbWVtb3J5KSB3ZSBzaG91bGQgcGxhY2UgdGhlIHN0dWIKLSAgICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgZW50cnkgPSAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICopZ2VuX2VudHJ5OwotICBzdHViX2hhc2hfdGFibGUgPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUoaW5mbyktPnN0dWJfaGFzaF90YWJsZTsKLSAgbG9jID0gc3R1Yl9oYXNoX3RhYmxlLT5sb2NhdGlvbjsKLQotICAvKiBNYWtlIGEgbm90ZSBvZiB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgc3R1YnMgZm9yIHRoaXMgZW50cnkuICAqLwotICBlbnRyeS0+b2Zmc2V0ID0gc3R1Yl9oYXNoX3RhYmxlLT5vZmZzZXQ7Ci0KLSAgLyogVGhlIHN5bWJvbCdzIG5hbWUgc3RhcnRzIGF0IG9mZnNldCAyMi4gICovCi0gIHN5bV9uYW1lID0gZW50cnktPnJvb3Quc3RyaW5nICsgMjI7Ci0KLSAgc3ltX3ZhbHVlID0gKGVudHJ5LT50YXJnZXRfdmFsdWUKLQkgICAgICAgKyBlbnRyeS0+dGFyZ2V0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkgICAgICAgKyBlbnRyeS0+dGFyZ2V0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0gIGlmICgxKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBvbmUgb2YgdHdvIHZhcmlhbnQgbG9uZyBicmFuY2ggc3R1YnMuICBPbmUgZm9yICQkZHluY2FsbCBhbmQKLQkgbm9ybWFsIGNhbGxzLCB0aGUgb3RoZXIgZm9yIGNhbGxzIHRvIG1pbGxpY29kZS4gICovCi0gICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgICBpbnQgbWlsbGljb2RlX2NhbGwgPSAwOwotCi0gICAgICBpZiAoIXN0cm5jbXAgKCIkJCIsIHN5bV9uYW1lLCAyKSAmJiBzdHJjbXAgKCIkJGR5bmNhbGwiLCBzeW1fbmFtZSkpCi0JbWlsbGljb2RlX2NhbGwgPSAxOwotCi0gICAgICAvKiBGaXJzdCB0aGUgcmV0dXJuIHBvaW50ZXIgYWRqdXN0bWVudC4gIERlcGVuZGluZyBvbiBleGFjdCBjYWxsaW5nCi0JIHNlcXVlbmNlIHRoaXMgaW5zdHJ1Y3Rpb24gbWF5IGJlIHNraXBwZWQuICAqLwotICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIExET19NNF9SMzFfUjMxLCBsb2MpOwotCi0gICAgICAvKiBUaGUgbmV4dCB0d28gaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgbG9uZyBicmFuY2ggaXRzZWxmLiAgQSBsb25nIGJyYW5jaAotCSBpcyBmb3JtZWQgd2l0aCAibGRpbCIgbG9hZGluZyB0aGUgdXBwZXIgYml0cyBvZiB0aGUgdGFyZ2V0IGFkZHJlc3MKLQkgaW50byBhIHJlZ2lzdGVyLCB0aGVuIGJyYW5jaGluZyB3aXRoICJiZSIgd2hpY2ggYWRkcyBpbiB0aGUgbG93ZXIgYml0cy4KLQkgTG9uZyBicmFuY2hlcyB0byBtaWxsaWNvZGUgbnVsbGlmeSB0aGUgZGVsYXkgc2xvdCBvZiB0aGUgImJlIi4gICovCi0gICAgICBpbnNuID0gaHBwYV9yZWJ1aWxkX2luc24gKHN0dWJfYmZkLCBMRElMX1IxLAotCQkJCWhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIDAsIGVfbHJzZWwpLCAyMSk7Ci0gICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgaW5zbiwgbG9jICsgNCk7Ci0gICAgICBpbnNuID0gaHBwYV9yZWJ1aWxkX2luc24gKHN0dWJfYmZkLCBCRV9TUjRfUjEgfCAobWlsbGljb2RlX2NhbGwgPyAyIDogMCksCi0JCQkJaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgMCwgZV9ycnNlbCkgPj4gMiwKLQkJCQkxNyk7Ci0gICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgaW5zbiwgbG9jICsgOCk7Ci0KLSAgICAgIGlmICghbWlsbGljb2RlX2NhbGwpCi0JewotCSAgLyogVGhlIHNlcXVlbmNlIHRvIGNhbGwgdGhpcyBzdHViIHBsYWNlcyB0aGUgcmV0dXJuIHBvaW50ZXIgaW50byAlcjMxLAotCSAgICAgdGhlIGZpbmFsIHRhcmdldCBleHBlY3RzIHRoZSByZXR1cm4gcG9pbnRlciBpbiAlcjIsIHNvIGNvcHkgdGhlCi0JICAgICAgcmV0dXJuIHBvaW50ZXIgaW50byB0aGUgcHJvcGVyIHJlZ2lzdGVyLiAgKi8KLQkgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBDT1BZX1IzMV9SMiwgbG9jICsgMTIpOwotCi0JICAvKiBVcGRhdGUgdGhlIGxvY2F0aW9uIGFuZCBvZmZzZXRzLiAgKi8KLQkgIHN0dWJfaGFzaF90YWJsZS0+bG9jYXRpb24gKz0gMTY7Ci0JICBzdHViX2hhc2hfdGFibGUtPm9mZnNldCArPSAxNjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVXBkYXRlIHRoZSBsb2NhdGlvbiBhbmQgb2Zmc2V0cy4gICovCi0JICBzdHViX2hhc2hfdGFibGUtPmxvY2F0aW9uICs9IDEyOwotCSAgc3R1Yl9oYXNoX3RhYmxlLT5vZmZzZXQgKz0gMTI7Ci0JfQotCi0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRXh0ZXJuYWwgZW50cnkgcG9pbnRzIGZvciBzaXppbmcgYW5kIGJ1aWxkaW5nIGxpbmtlciBzdHVicy4gICovCi0KLS8qIEJ1aWxkIGFsbCB0aGUgc3R1YnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG91dHB1dCBmaWxlLiAgVGhlCi0gICBzdHVicyBhcmUga2VwdCBpbiBhIGhhc2ggdGFibGUgYXR0YWNoZWQgdG8gdGhlIG1haW4gbGlua2VyIGhhc2gKLSAgIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgdmlhIGhwcGFlbGZfZmluaXNoIGluIHRoZSBsaW5rZXIuICAqLwotCi1ib29sZWFuCi1lbGYzMl9ocHBhX2J1aWxkX3N0dWJzIChzdHViX2JmZCwgaW5mbykKLSAgICAgYmZkICpzdHViX2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIC8qIFRoZSBzdHViIEJGRCBvbmx5IGhhcyBvbmUgc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpzdHViX3NlYyA9IHN0dWJfYmZkLT5zZWN0aW9uczsKLSAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICp0YWJsZTsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIHZvaWQgKmFyZ3NbMl07Ci0KLSAgLyogU28gd2UgY2FuIHBhc3MgYm90aCB0aGUgQkZEIGZvciB0aGUgc3R1YnMgYW5kIHRoZSBsaW5rIGluZm8KLSAgICAgc3RydWN0dXJlIHRvIHRoZSByb3V0aW5lIHdoaWNoIGFjdHVhbGx5IGJ1aWxkcyBzdHVicy4gICovCi0gIGFyZ3NbMF0gPSBzdHViX2JmZDsKLSAgYXJnc1sxXSA9IGluZm87Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIGxpbmtlciBzdHVicy4gICovCi0gIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChzdHViX2JmZCwgc3R1Yl9zZWMpOwotICBzdHViX3NlYy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChzdHViX2JmZCwgc2l6ZSk7Ci0gIGlmIChzdHViX3NlYy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHRhYmxlID0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGluZm8pLT5zdHViX2hhc2hfdGFibGU7Ci0gIHRhYmxlLT5sb2NhdGlvbiA9IHN0dWJfc2VjLT5jb250ZW50czsKLQotICAvKiBCdWlsZCB0aGUgc3R1YnMgYXMgZGlyZWN0ZWQgYnkgdGhlIHN0dWIgaGFzaCB0YWJsZS4gICovCi0gIGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RyYXZlcnNlICh0YWJsZSwgZWxmMzJfaHBwYV9idWlsZF9vbmVfc3R1YiwgYXJncyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERldGVybWluZSBhbmQgc2V0IHRoZSBzaXplIG9mIHRoZSBzdHViIHNlY3Rpb24gZm9yIGEgZmluYWwgbGluay4KLQotICAgVGhlIGJhc2ljIGlkZWEgaGVyZSBpcyB0byBleGFtaW5lIGFsbCB0aGUgcmVsb2NhdGlvbnMgbG9va2luZyBmb3IKLSAgIFBDLXJlbGF0aXZlIGNhbGxzIHRvIGEgdGFyZ2V0IHRoYXQgaXMgdW5yZWFjaGFibGUgd2l0aCBhICJibCIKLSAgIGluc3RydWN0aW9uIG9yIGNhbGxzIHdoZXJlIHRoZSBjYWxsZXIgYW5kIGNhbGxlZSBkaXNhZ3JlZSBvbiB0aGUKLSAgIGxvY2F0aW9uIG9mIHRoZWlyIGFyZ3VtZW50cyBvciByZXR1cm4gdmFsdWUuICAqLwotCi1ib29sZWFuCi1lbGYzMl9ocHBhX3NpemVfc3R1YnMgKHN0dWJfYmZkLCBvdXRwdXRfYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqc3R1Yl9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBiZmQgKmlucHV0X2JmZDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24sICpzdHViX3NlYyA9IDA7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zLCAqKmFsbF9sb2NhbF9zeW1zOwotICB1bnNpZ25lZCBpbnQgaSwgaW5kZXgsIGJmZF9jb3VudCA9IDA7Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlID0gMDsKLQotICAvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIHN0dWIgaGFzaCB0YWJsZS4gICovCi0gIHN0dWJfaGFzaF90YWJsZSA9ICgoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICopCi0JCSAgICAgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUpKSk7Ci0gIGlmICghc3R1Yl9oYXNoX3RhYmxlKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGVfaW5pdCAoc3R1Yl9oYXNoX3RhYmxlLCBzdHViX2JmZCwKLQkJCQkJZWxmMzJfaHBwYV9zdHViX2hhc2hfbmV3ZnVuYykpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogQXR0YWNoIHRoZSBoYXNoIHRhYmxlcyB0byB0aGUgbWFpbiBoYXNoIHRhYmxlLiAgKi8KLSAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGxpbmtfaW5mbyktPnN0dWJfaGFzaF90YWJsZSA9IHN0dWJfaGFzaF90YWJsZTsKLQotICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGlucHV0IEJGRHMuICAqLwotICBmb3IgKGlucHV0X2JmZCA9IGxpbmtfaW5mby0+aW5wdXRfYmZkczsKLSAgICAgICBpbnB1dF9iZmQgIT0gTlVMTDsKLSAgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9iZmQtPmxpbmtfbmV4dCkKLSAgICAgYmZkX2NvdW50Kys7Ci0KLSAgLyogTWFnaWMgYXMgd2Uga25vdyB0aGUgc3R1YiBiZmQgb25seSBoYXMgb25lIHNlY3Rpb24uICAqLwotICBzdHViX3NlYyA9IHN0dWJfYmZkLT5zZWN0aW9uczsKLQotICAvKiBJZiBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlLCB0aGVuIHdlIGRvbid0Ci0gICAgIGhhdmUgdG8gZXhhbWluZSB0aGUgcmVsb2NzLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0gICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSBhcmd1bWVudCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYWxsIHRoZSBnbG9iYWwKLSAgICAgZnVuY3Rpb25zIHdlIGNhbiBzdGFydCBsb29raW5nIGZvciBzdHVicy4gICovCi0gIGZvciAoaW5wdXRfYmZkID0gbGlua19pbmZvLT5pbnB1dF9iZmRzLCBpbmRleCA9IDA7Ci0gICAgICAgaW5wdXRfYmZkICE9IE5VTEw7Ci0gICAgICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQsIGluZGV4KyspCi0gICAgewotICAgICAgLyogV2UnbGwgbmVlZCB0aGUgc3ltYm9sIHRhYmxlIGluIGEgc2Vjb25kLiAgKi8KLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICAgICAgaWYgKHN5bXRhYl9oZHItPnNoX2luZm8gPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgbG9jYWxfc3ltcyA9IGFsbF9sb2NhbF9zeW1zW2luZGV4XTsKLQotICAgICAgLyogV2FsayBvdmVyIGVhY2ggc2VjdGlvbiBhdHRhY2hlZCB0byB0aGUgaW5wdXQgYmZkLiAgKi8KLSAgICAgIGZvciAoc2VjdGlvbiA9IGlucHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgc2VjdGlvbiAhPSBOVUxMOwotCSAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TaGRyICppbnB1dF9yZWxfaGRyOwotCSAgRWxmMzJfRXh0ZXJuYWxfUmVsYSAqZXh0ZXJuYWxfcmVsb2NzLCAqZXJlbGFlbmQsICplcmVsYTsKLQkgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MsICppcmVsYWVuZCwgKmlyZWxhOwotCi0JICAvKiBJZiB0aGVyZSBhcmVuJ3QgYW55IHJlbG9jcywgdGhlbiB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uICAqLwotCSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgICAgIHx8IHNlY3Rpb24tPnJlbG9jX2NvdW50ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGV4dGVybmFsIHJlbG9jYXRpb25zLiAgKi8KLQkgIGV4dGVybmFsX3JlbG9jcwotCSAgICA9ICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCSAgICAgICBiZmRfbWFsbG9jIChzZWN0aW9uLT5yZWxvY19jb3VudAotCQkJICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpKSk7Ci0JICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIExpa2V3aXNlIGZvciB0aGUgaW50ZXJuYWwgcmVsb2NhdGlvbnMuICAqLwotCSAgaW50ZXJuYWxfcmVsb2NzCi0JICAgID0gKChFbGZfSW50ZXJuYWxfUmVsYSAqKQotCSAgICAgICBiZmRfbWFsbG9jIChzZWN0aW9uLT5yZWxvY19jb3VudCAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbGEpKSk7Ci0JICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgcmVsb2NzLiAgKi8KLQkgIGlucHV0X3JlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbF9oZHI7Ci0JICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgaW5wdXRfcmVsX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIDEsIGlucHV0X3JlbF9oZHItPnNoX3NpemUsCi0JCQkgICBpbnB1dF9iZmQpICE9IGlucHV0X3JlbF9oZHItPnNoX3NpemUpCi0JICAgIHsKLQkgICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICAvKiBTd2FwIGluIHRoZSByZWxvY3MuICAqLwotCSAgZXJlbGEgPSBleHRlcm5hbF9yZWxvY3M7Ci0JICBlcmVsYWVuZCA9IGVyZWxhICsgc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JICBpcmVsYSA9IGludGVybmFsX3JlbG9jczsKLQkgIGZvciAoOyBlcmVsYSA8IGVyZWxhZW5kOyBlcmVsYSsrLCBpcmVsYSsrKQotCSAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4gKGlucHV0X2JmZCwgZXJlbGEsIGlyZWxhKTsKLQotCSAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBleHRlcm5hbCByZWxvY3MsIGZyZWUgdGhlbS4gICovCi0JICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotCi0JICAvKiBOb3cgZXhhbWluZSBlYWNoIHJlbG9jYXRpb24uICAqLwotCSAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBpcmVsYWVuZCA9IGlyZWxhICsgc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JICBmb3IgKDsgaXJlbGEgPCBpcmVsYWVuZDsgaXJlbGErKykKLQkgICAgewotCSAgICAgIGxvbmcgcl90eXBlLCBzaXplX29mX3N0dWI7Ci0JICAgICAgdW5zaWduZWQgbG9uZyByX2luZGV4OwotCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoYXNoOwotCSAgICAgIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqc3R1Yl9oYXNoOwotCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLQkgICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLQkgICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQkgICAgICBzeW12YWx1ZSBzeW1fdmFsdWU7Ci0JICAgICAgYmZkX3ZtYSBsb2NhdGlvbiwgZGVzdGluYXRpb247Ci0JICAgICAgY2hhciAqbmV3X25hbWUgPSBOVUxMOwotCi0JICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChpcmVsYS0+cl9pbmZvKTsKLQkgICAgICByX2luZGV4ID0gRUxGMzJfUl9TWU0gKGlyZWxhLT5yX2luZm8pOwotCi0JICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpCi0JCXsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCQkgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJICAgIGlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgLyogT25seSBsb29rIGZvciBzdHVicyBvbiBjYWxsIGluc3RydWN0aW9ucyBvciBwbGFiZWwKLQkJIHJlZmVyZW5jZXMuICAqLwotCSAgICAgIGlmIChyX3R5cGUgIT0gUl9QQVJJU0NfUENSRUwxN0YKLQkJICAmJiByX3R5cGUgIT0gUl9QQVJJU0NfUExBQkVMMzIKLQkJICAmJiByX3R5cGUgIT0gUl9QQVJJU0NfUExBQkVMMjFMCi0JCSAgJiYgcl90eXBlICE9IFJfUEFSSVNDX1BMQUJFTDE0UikKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBOb3cgZGV0ZXJtaW5lIHRoZSBjYWxsIHRhcmdldCwgaXRzIG5hbWUsIHZhbHVlLCBzZWN0aW9uCi0JCSBhbmQgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzLiAgKi8KLQkgICAgICBoYXNoID0gTlVMTDsKLQkgICAgICBzeW0gPSBOVUxMOwotCSAgICAgIHN5bV9zZWMgPSBOVUxMOwotCSAgICAgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkJewotCQkgIC8qIEl0J3MgYSBsb2NhbCBzeW1ib2wuICAqLwotCQkgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLQkJICBzeW0gPSBsb2NhbF9zeW1zICsgcl9pbmRleDsKLQkJICBoZHIgPSBlbGZfZWxmc2VjdGlvbnMgKGlucHV0X2JmZClbc3ltLT5zdF9zaG5keF07Ci0JCSAgc3ltX3NlYyA9IGhkci0+YmZkX3NlY3Rpb247Ci0JCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICAgICBzeW0tPnN0X25hbWUpOwotCQkgIHN5bV92YWx1ZSA9IChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTgotCQkJICAgICAgID8gMCA6IHN5bS0+c3RfdmFsdWUpOwotCQkgIGRlc3RpbmF0aW9uID0gKHN5bV92YWx1ZQotCQkJCSArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCQkgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotCQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgbG9jYWwKLQkJICAgICBzeW1ib2wgaW4gdGhlIHN0dWIgb3IgYXJnIGluZm8gaGFzaCB0YWJsZXMuICAqLwotCQkgIG5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzeW1fbmFtZSkgKyAxMCk7Ci0JCSAgaWYgKG5ld19uYW1lID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOwotCQkgIHN5bV9uYW1lID0gbmV3X25hbWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBJdCdzIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JCSAgbG9uZyBpbmRleDsKLQotCQkgIGluZGV4ID0gcl9pbmRleCAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCSAgaGFzaCA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2luZGV4XTsKLQkJICBpZiAoaGFzaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoYXNoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgewotCQkgICAgICBzeW1fc2VjID0gaGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgICBzeW1fbmFtZSA9IGhhc2gtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCSAgICAgIHN5bV92YWx1ZSA9IGhhc2gtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgICAgIGRlc3RpbmF0aW9uID0gKHN5bV92YWx1ZQotCQkJCSAgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBOb3cgZGV0ZXJtaW5lIHdoZXJlIHRoZSBjYWxsIHBvaW50IGlzLiAgKi8KLQkgICAgICBsb2NhdGlvbiA9IChzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICsgc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlyZWxhLT5yX29mZnNldCk7Ci0KLQkgICAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGRlc3RpbmF0aW9uIGZvciBQQ1JFTCBmdW5jdGlvbgotCQkgY2FsbHMgKGVnLiB3ZSBkb24ndCBjYXJlIGZvciBQTEFCRUxTKS4gICovCi0JICAgICAgaWYgKHJfdHlwZSAhPSBSX1BBUklTQ19QQ1JFTDE3RikKLQkJbG9jYXRpb24gPSBkZXN0aW5hdGlvbjsKLQotCSAgICAgIC8qIERldGVybWluZSB3aGF0IChpZiBhbnkpIGxpbmtlciBzdHViIGlzIG5lZWRlZCBhbmQgaXRzCi0JCSBzaXplIChpbiBieXRlcykuICAqLwotCSAgICAgIHNpemVfb2Zfc3R1YiA9IGVsZjMyX2hwcGFfc2l6ZV9vZl9zdHViIChsb2NhdGlvbiwKLQkJCQkJCSAgICAgIGRlc3RpbmF0aW9uLAotCQkJCQkJICAgICAgc3ltX25hbWUpOwotCSAgICAgIGlmIChzaXplX29mX3N0dWIgIT0gMCkKLQkJewotCQkgIGNoYXIgKnN0dWJfbmFtZTsKLQkJICB1bnNpZ25lZCBpbnQgbGVuOwotCi0JCSAgLyogR2V0IHRoZSBuYW1lIG9mIHRoaXMgc3R1Yi4gICovCi0JCSAgbGVuID0gc3RybGVuIChzeW1fbmFtZSk7Ci0JCSAgbGVuICs9IDIzOwotCi0JCSAgc3R1Yl9uYW1lID0gYmZkX21hbGxvYyAobGVuKTsKLQkJICBpZiAoIXN0dWJfbmFtZSkKLQkJICAgIHsKLQkJICAgICAgLyogQmVjYXVzZSBzeW1fbmFtZSB3YXMgbWFsbG9jZCBhYm92ZSBmb3IgbG9jYWwKLQkJCSBzeW1ib2xzLiAgKi8KLQkJICAgICAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCQkJZnJlZSAobmV3X25hbWUpOwotCi0JCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQkgIGVsZjMyX2hwcGFfbmFtZV9vZl9zdHViIChsb2NhdGlvbiwgZGVzdGluYXRpb24sIHN0dWJfbmFtZSk7Ci0JCSAgc3RyY2F0IChzdHViX25hbWUgKyAyMiwgc3ltX25hbWUpOwotCi0JCSAgLyogQmVjYXVzZSBzeW1fbmFtZSB3YXMgbWFsbG9jZWQgYWJvdmUgZm9yIGxvY2FsIHN5bWJvbHMuICAqLwotCQkgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkJICAgIGZyZWUgKG5ld19uYW1lKTsKLQotCQkgIHN0dWJfaGFzaAotCQkgICAgPSBlbGYzMl9ocHBhX3N0dWJfaGFzaF9sb29rdXAgKHN0dWJfaGFzaF90YWJsZSwgc3R1Yl9uYW1lLAotCQkJCQkJICAgZmFsc2UsIGZhbHNlKTsKLQkJICBpZiAoc3R1Yl9oYXNoICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBwcm9wZXIgc3R1YiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIG5vdGhpbmcKLQkJCSBlbHNlIHRvIGRvLiAgKi8KLQkJICAgICAgZnJlZSAoc3R1Yl9uYW1lKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChzdHViX2JmZCwgc3R1Yl9zZWMsCi0JCQkJCSAgICAoYmZkX3NlY3Rpb25fc2l6ZSAoc3R1Yl9iZmQsCi0JCQkJCQkJICAgICAgIHN0dWJfc2VjKQotCQkJCQkgICAgICsgc2l6ZV9vZl9zdHViKSk7Ci0KLQkJICAgICAgLyogRW50ZXIgdGhpcyBlbnRyeSBpbnRvIHRoZSBsaW5rZXIgc3R1YiBoYXNoIHRhYmxlLiAgKi8KLQkJICAgICAgc3R1Yl9oYXNoCi0JCQk9IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2xvb2t1cCAoc3R1Yl9oYXNoX3RhYmxlLAotCQkJCQkJICAgICAgIHN0dWJfbmFtZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCSAgICAgIGlmIChzdHViX2hhc2ggPT0gTlVMTCkKLQkJCXsKLQkJCSAgZnJlZSAoc3R1Yl9uYW1lKTsKLQkJCSAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQkJCSAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQkJICAgIGlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJCX0KLQotCQkgICAgICAvKiBXZSdsbCBuZWVkIHRoZXNlIHRvIGRldGVybWluZSB0aGUgYWRkcmVzcyB0aGF0IHRoZQotCQkJIHN0dWIgd2lsbCBicmFuY2ggdG8uICAqLwotCQkgICAgICBzdHViX2hhc2gtPnRhcmdldF92YWx1ZSA9IHN5bV92YWx1ZTsKLQkJICAgICAgc3R1Yl9oYXNoLT50YXJnZXRfc2VjdGlvbiA9IHN5bV9zZWM7Ci0JCSAgICB9Ci0JCSAgZnJlZSAoc3R1Yl9uYW1lKTsKLQkJfQotCSAgICB9Ci0JICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIGludGVybmFsIHJlbG9jcywgZnJlZSB0aGVtLiAgKi8KLQkgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JfQotICAgIH0KLSAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBsb2NhbCBzeW1ib2xzLCBmcmVlIHRoZW0uICAqLwotICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0gICAgaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0gIHJldHVybiB0cnVlOwotCi1lcnJvcl9yZXR1cm46Ci0gIC8qIFJldHVybiBncmFjZWZ1bGx5LCBhdm9pZGluZyBkYW5nbGluZyByZWZlcmVuY2VzIHRvIHRoZSBoYXNoIHRhYmxlcy4gICovCi0gIGlmIChzdHViX2hhc2hfdGFibGUpCi0gICAgewotICAgICAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGxpbmtfaW5mbyktPnN0dWJfaGFzaF90YWJsZSA9IE5VTEw7Ci0gICAgICBmcmVlIChzdHViX2hhc2hfdGFibGUpOwotICAgIH0KLSAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBzdHViIHNlY3Rpb24gdG8gemVybyBzaW5jZSB3ZSdyZSBuZXZlciBnb2luZwotICAgICB0byBjcmVhdGUgdGhlbS4gICBBdm9pZHMgbG9zaW5nIHdoZW4gd2UgdHJ5IHRvIGdldCBpdHMgY29udGVudHMKLSAgICAgdG9vLiAgKi8KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKHN0dWJfYmZkLCBzdHViX3NlYywgMCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTWlzYyBCRkQgc3VwcG9ydCBjb2RlLiAgKi8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkJZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCWVsZl9ocHBhX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8gICAgICAgICAgICAgICAJZWxmX2hwcGFfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwgICAgICAgICAgIAllbGZfaHBwYV9pbmZvX3RvX2hvd3RvX3JlbAotCi0vKiBTdHVmZiBmb3IgdGhlIEJGRCBsaW5rZXIuICAqLwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQllbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCQllbGYzMl9ocHBhX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwkJZWxmX2hwcGFfZmFrZV9zZWN0aW9ucwotCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9ocHBhX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1ocHBhIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfaHBwYQotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX1BBUklTQwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaHBwYS5oIGIvYmZkL2VsZjMyLWhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1ZmMxMy4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogRUxGMzIvSFBQQSBzdXBwb3J0Ci0KLSAgIFRoaXMgZmlsZSBjb250YWlucyBFTEYzMi9IUFBBIHJlbG9jYXRpb24gc3VwcG9ydCBhcyBzcGVjaWZpZWQKLSAgIGluIHRoZSBTdHJhdHVzIEZUWC9Hb2xmIE9iamVjdCBGaWxlIEZvcm1hdCAoU0VELTE3NjIpIGRhdGVkCi0gICBGZWJydWFyeSAxOTk0LgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5OgotCi0gICBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKLSAgIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGMzJfSFBQQV9ICi0jZGVmaW5lIF9FTEYzMl9IUFBBX0gKLQotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJsaWJocHBhLmgiCi0jaW5jbHVkZSAiZWxmL2hwcGEuaCIKLQotYm9vbGVhbiBlbGYzMl9ocHBhX3NpemVfc3R1YnMKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWJvb2xlYW4gZWxmMzJfaHBwYV9idWlsZF9zdHVicwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gZWxmX2hwcGFfcmVsb2NfdHlwZSAqKiBfYmZkX2VsZjMyX2hwcGFfZ2VuX3JlbG9jX3R5cGUKLSAgUEFSQU1TICgoYmZkICosIGVsZl9ocHBhX3JlbG9jX3R5cGUsIGludCwgaW50LCBpbnQsIGFzeW1ib2wgKikpOwotCi0vKiBEZWZpbmUgZ3JvdXBzIG9mIGJhc2ljIHJlbG9jYXRpb25zLiAgRklYTUU6ICBUaGVzZSBzaG91bGQKLSAgIGJlIHRoZSBvbmx5IGJhc2ljIHJlbG9jYXRpb25zIGNyZWF0ZWQgYnkgR0FTLiAgVGhlIHJlc3QKLSAgIHNob3VsZCBiZSBpbnRlcm5hbCB0byB0aGUgQkZEIGJhY2tlbmQuCi0KLSAgIFRoZSBpZGVhIGlzIGJvdGggU09NIGFuZCBFTEYgZGVmaW5lIHRoZXNlIGJhc2ljIHJlbG9jYXRpb24KLSAgIHR5cGVzIHNvIHRoZXkgbWFwIGludG8gYSBTT00gb3IgRUxGIHNwZWNpZmljIHJlbG9jYXRpb24KLSAgIGFzIGFwcHJvcHJpYXRlLiAgVGhpcyBhbGxvd3MgR0FTIHRvIHNoYXJlIG11Y2ggbW9yZSBjb2RlCi0gICBiZXR3ZWVuIHRoZSB0d28gdGFyZ2V0IG9iamVjdCBmb3JtYXRzLiAgKi8KLQotI2RlZmluZSBSX0hQUEFfTk9ORQkJCVJfUEFSSVNDX05PTkUKLSNkZWZpbmUgUl9IUFBBCQkJCVJfUEFSSVNDX0RJUjMyCi0jZGVmaW5lIFJfSFBQQV9HT1RPRkYJCQlSX1BBUklTQ19EUFJFTDIxTAotI2RlZmluZSBSX0hQUEFfUENSRUxfQ0FMTAkJUl9QQVJJU0NfUENSRUwyMUwKLSNkZWZpbmUgUl9IUFBBX0FCU19DQUxMCQkJUl9QQVJJU0NfRElSMTdGCi0jZGVmaW5lIFJfSFBQQV9DT01QTEVYCQkJUl9QQVJJU0NfVU5JTVBMRU1FTlRFRAotCi0jZW5kaWYgLyogX0VMRjMyX0hQUEFfSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWkzODYuYyBiL2JmZC9lbGYzMi1pMzg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNTE0YWMuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NTEgKzAsMCBAQAotLyogSW50ZWwgODAzODYvODA0ODYtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgZWxmX2kzODZfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZl9pMzg2X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0jZGVmaW5lIFVTRV9SRUwJMQkJLyogMzg2IHVzZXMgUkVMIHJlbG9jYXRpb25zIGluc3RlYWQgb2YgUkVMQSAqLwotCi0jaW5jbHVkZSAiZWxmL2kzODYuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2hvd3RvX3RhYmxlW109Ci17Ci0gIEhPV1RPKFJfMzg2X05PTkUsCSAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9OT05FIiwJICAgIHRydWUsMHgwMDAwMDAwMCwweDAwMDAwMDAwLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfMzIsCSAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl8zMiIsCSAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BDMzIsCSAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9QQzMyIiwJICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSXzM4Nl9HT1QzMiwJIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dPVDMyIiwgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9QTFQzMiwJIDAsMiwzMix0cnVlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfUExUMzIiLCAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl8zODZfQ09QWSwgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9DT1BZIiwJICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfR0xPQl9EQVQsICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9HTE9CX0RBVCIsIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfSlVNUF9TTE9ULCAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9KVU1QX1NMT1QiLHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfUkVMQVRJVkUsICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9SRUxBVElWRSIsIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfR09UT0ZGLCAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9HT1RPRkYiLCAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfR09UUEMsICAgICAwLDIsMzIsdHJ1ZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dPVFBDIiwgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEVNUFRZX0hPV1RPICgxMSksCi0gIEVNUFRZX0hPV1RPICgxMiksCi0gIEVNUFRZX0hPV1RPICgxMyksCi0gIEVNUFRZX0hPV1RPICgxNCksCi0gIEVNUFRZX0hPV1RPICgxNSksCi0gIEVNUFRZX0hPV1RPICgxNiksCi0gIEVNUFRZX0hPV1RPICgxNyksCi0gIEVNUFRZX0hPV1RPICgxOCksCi0gIEVNUFRZX0hPV1RPICgxOSksCi0gIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBhIEdOVSBleHRlbnNpb24uICAqLwotICBIT1dUTyhSXzM4Nl8xNiwJIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2XzE2IiwJICAgIHRydWUsMHhmZmZmLDB4ZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BDMTYsCSAwLDEsMTYsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9QQzE2IiwJICAgIHRydWUsMHhmZmZmLDB4ZmZmZix0cnVlKSwKLSAgSE9XVE8oUl8zODZfOCwJIDAsMCw4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfOCIsCSAgICB0cnVlLDB4ZmYsMHhmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BDOCwJIDAsMCw4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X1BDOCIsCSAgICB0cnVlLDB4ZmYsMHhmZix0cnVlKSwKLX07Ci0KLS8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5LiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvID0KLSAgSE9XVE8gKFJfMzg2X0dOVV9WVElOSEVSSVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfMzg2X0dOVV9WVElOSEVSSVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwotCi0vKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZS4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9pMzg2X3Z0ZW50cnlfaG93dG8gPQotICBIT1dUTyAoUl8zODZfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSXzM4Nl9HTlVfVlRFTlRSWSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7Ci0KLSNpZmRlZiBERUJVR19HRU5fUkVMT0MKLSNkZWZpbmUgVFJBQ0Uoc3RyKSBmcHJpbnRmIChzdGRlcnIsICJpMzg2IGJmZCByZWxvYyBsb29rdXAgJWQgKCVzKVxuIiwgY29kZSwgc3RyKQotI2Vsc2UKLSNkZWZpbmUgVFJBQ0Uoc3RyKQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTk9ORToKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DX05PTkUiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X05PTkUgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzIiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2XzMyIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfQ1RPUiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfMzIgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfUEMzMiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfUEMzMiBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVDMyOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0dPVDMyIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9HT1QzMiBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X1BMVDMyOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X1BMVDMyIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9QTFQzMiBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0NPUFk6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfQ09QWSIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfQ09QWSBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dMT0JfREFUOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0dMT0JfREFUIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9HTE9CX0RBVCBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0pVTVBfU0xPVDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1QiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0pVTVBfU0xPVCBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X1JFTEFUSVZFOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X1JFTEFUSVZFIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9SRUxBVElWRSBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVE9GRjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9HT1RPRkYiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0dPVE9GRiBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVFBDOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0dPVFBDIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9HT1RQQyBdOwotCi0gICAgICAvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgYSBHTlUgZXh0ZW5zaW9uLiAgKi8KLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzE2Iik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsoaW50KSBSXzM4Nl8xNl07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzE2X1BDUkVMIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsoaW50KSBSXzM4Nl9QQzE2XTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ184Iik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsoaW50KSBSXzM4Nl84XTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzhfUENSRUw6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ184X1BDUkVMIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsoaW50KSBSXzM4Nl9QQzhdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCIpOwotICAgICAgcmV0dXJuICZlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSIpOwotICAgICAgcmV0dXJuICZlbGYzMl9pMzg2X3Z0ZW50cnlfaG93dG87Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIFRSQUNFICgiVW5rbm93biIpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9pMzg2X2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQJCSphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQJCSpjYWNoZV9wdHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFib3J0ICgpOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgZW51bSBlbGZfaTM4Nl9yZWxvY190eXBlIHR5cGU7Ci0KLSAgdHlwZSA9IChlbnVtIGVsZl9pMzg2X3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBpZiAodHlwZSA9PSBSXzM4Nl9HTlVfVlRJTkhFUklUKQotICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmMzJfaTM4Nl92dGluaGVyaXRfaG93dG87Ci0gIGVsc2UgaWYgKHR5cGUgPT0gUl8zODZfR05VX1ZURU5UUlkpCi0gICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGYzMl9pMzg2X3Z0ZW50cnlfaG93dG87Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUICh0eXBlIDwgUl8zODZfbWF4KTsKLSAgICAgIEJGRF9BU1NFUlQgKHR5cGUgPCBGSVJTVF9JTlZBTElEX1JFTE9DIHx8IHR5cGUgPiBMQVNUX0lOVkFMSURfUkVMT0MpOwotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfaG93dG9fdGFibGVbKGludCkgdHlwZV07Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBuYW1lIGltcGxpZXMgYSBsb2NhbCBsYWJlbC4gIFRoZSBVbml4V2FyZQotICAgMi4xIGNjIGdlbmVyYXRlcyB0ZW1wb3Jhcnkgc3ltYm9scyB0aGF0IHN0YXJ0IHdpdGggLlgsIHNvIHdlCi0gICByZWNvZ25pemUgdGhlbSBoZXJlLiAgRklYTUU6IGRvIG90aGVyIFNWUjQgY29tcGlsZXJzIGFsc28gdXNlIC5YPy4KLSAgIElmIHNvLCB3ZSBzaG91bGQgbW92ZSB0aGUgLlggcmVjb2duaXRpb24gaW50bwotICAgX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICdYJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSk7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIHRoZSBpMzg2IEVMRiBsaW5rZXIuICAqLwotCi0vKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCi0gICBzZWN0aW9uLiAgKi8KLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGliYy5zby4xIgotCi0vKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDE2Ci0KLS8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhbiBhYnNvbHV0ZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rcyBsaWtlCi0gICB0aGlzLiAgU2VlIHRoZSBTVlI0IEFCSSBpMzg2IHN1cHBsZW1lbnQgdG8gc2VlIGhvdyB0aGlzIHdvcmtzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9pMzg2X3BsdDBfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHhmZiwgMHgzNSwJLyogcHVzaGwgY29udGVudHMgb2YgYWRkcmVzcyAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIGFkZHJlc3Mgb2YgLmdvdCArIDQuICAqLwotICAweGZmLCAweDI1LAkvKiBqbXAgaW5kaXJlY3QgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBhZGRyZXNzIG9mIC5nb3QgKyA4LiAgKi8KLSAgMCwgMCwgMCwgMAkvKiBwYWQgb3V0IHRvIDE2IGJ5dGVzLiAgKi8KLX07Ci0KLS8qIFN1YnNlcXVlbnQgZW50cmllcyBpbiBhbiBhYnNvbHV0ZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rIGxpa2UKLSAgIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2kzODZfcGx0X2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4ZmYsIDB4MjUsCS8qIGptcCBpbmRpcmVjdCAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIGFkZHJlc3Mgb2YgdGhpcyBzeW1ib2wgaW4gLmdvdC4gICovCi0gIDB4NjgsCQkvKiBwdXNobCBpbW1lZGlhdGUgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgaW50byByZWxvY2F0aW9uIHRhYmxlLiAgKi8KLSAgMHhlOSwJCS8qIGptcCByZWxhdGl2ZSAqLwotICAwLCAwLCAwLCAwCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIHN0YXJ0IG9mIC5wbHQuICAqLwotfTsKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgUElDIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2sgbGlrZSB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9pMzg2X3BpY19wbHQwX2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4ZmYsIDB4YjMsIDQsIDAsIDAsIDAsCS8qIHB1c2hsIDQoJWVieCkgKi8KLSAgMHhmZiwgMHhhMywgOCwgMCwgMCwgMCwJLyogam1wICo4KCVlYngpICovCi0gIDAsIDAsIDAsIDAJCQkvKiBwYWQgb3V0IHRvIDE2IGJ5dGVzLiAgKi8KLX07Ci0KLS8qIFN1YnNlcXVlbnQgZW50cmllcyBpbiBhIFBJQyBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rIGxpa2UgdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfaTM4Nl9waWNfcGx0X2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4ZmYsIDB4YTMsCS8qIGptcCAqb2Zmc2V0KCVlYngpICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IG9mIHRoaXMgc3ltYm9sIGluIC5nb3QuICAqLwotICAweDY4LAkJLyogcHVzaGwgaW1tZWRpYXRlICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4ZTksCQkvKiBqbXAgcmVsYXRpdmUgKi8KLSAgMCwgMCwgMCwgMAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLX07Ci0KLS8qIFRoZSBpMzg2IGxpbmtlciBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHRoYXQgaXQKLSAgIGRlY2lkZXMgdG8gY29weSBpbiBjaGVja19yZWxvY3MgZm9yIGVhY2ggc3ltYm9sLiAgVGhpcyBpcyBzbyB0aGF0Ci0gICBpdCBjYW4gZGlzY2FyZCBQQyByZWxhdGl2ZSByZWxvY3MgaWYgaXQgZG9lc24ndCBuZWVkIHRoZW0gd2hlbgotICAgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMuICBXZSBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gYSBmaWVsZAotICAgZXh0ZW5kaW5nIHRoZSByZWd1bGFyIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIHdlCi0gICBoYXZlIGNvcGllZCBmb3IgYSBnaXZlbiBzeW1ib2wuICAqLwotCi1zdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZAotewotICAvKiBOZXh0IHNlY3Rpb24uICAqLwotICBzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqbmV4dDsKLSAgLyogQSBzZWN0aW9uIGluIGR5bm9iai4gICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwotICAvKiBOdW1iZXIgb2YgcmVsb2NzIGNvcGllZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBiZmRfc2l6ZV90eXBlIGNvdW50OwotfTsKLQotLyogaTM4NiBFTEYgbGlua2VyIGhhc2ggZW50cnkuICAqLwotCi1zdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogTnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyBjb3BpZWQgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQgKnBjcmVsX3JlbG9jc19jb3BpZWQ7Ci19OwotCi0vKiBpMzg2IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIERlY2xhcmUgdGhpcyBub3cgdGhhdCB0aGUgYWJvdmUgc3RydWN0dXJlcyBhcmUgZGVmaW5lZC4gICovCi0KLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2Rpc2NhcmRfY29waWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIFRyYXZlcnNlIGFuIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBlbGZfaTM4Nl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBpMzg2IEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgZWxmX2kzODZfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGZfaTM4Nl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZXQtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBpMzg2IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGZfaTM4Nl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmX2kzODZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQotICAgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsZ290OwotICBhc2VjdGlvbiAqc3JlbG9jOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpOwotCi0gIHNnb3QgPSBOVUxMOwotICBzcmVsZ290ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLSAgICAgIC8qIFNvbWUgcmVsb2NzIHJlcXVpcmUgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQl7Ci0JICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCSAgICB7Ci0JICAgIGNhc2UgUl8zODZfR09UMzI6Ci0JICAgIGNhc2UgUl8zODZfR09UT0ZGOgotCSAgICBjYXNlIFJfMzg2X0dPVFBDOgotCSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfMzg2X0dPVDMyOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCSAgICAgICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLSAgICAgCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JCXsKLQkJICBzaXplX3Qgc2l6ZTsKLQkJICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLQotCQkgIHNpemUgPSBzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChiZmRfdm1hKTsKLQkJICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IChiZmRfdm1hICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JCSAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKSA9IGxvY2FsX2dvdF9vZmZzZXRzOwotCQkgIGZvciAoaSA9IDA7IGkgPCBzeW10YWJfaGRyLT5zaF9pbmZvOyBpKyspCi0JCSAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tpXSA9IChiZmRfdm1hKSAtMTsKLQkJfQotCSAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gPSBzZ290LT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQl7Ci0JCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYSBSXzM4Nl9SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZSBkeW5hbWljCi0gICAgICAgICAgICAgICAgICAgICBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQkJfQotCSAgICB9Ci0KLQkgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OwotCi0JICBicmVhazsKLQotCWNhc2UgUl8zODZfUExUMzI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKLSAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aGljaCBpcwotICAgICAgICAgICAgIG5ldmVyIHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgaW4gd2hpY2ggY2FzZSB3ZQotICAgICAgICAgICAgIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeQotICAgICAgICAgICAgIGFmdGVyIGFsbC4gICovCi0KLQkgIC8qIElmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wsIHdlIHJlc29sdmUgaXQgZGlyZWN0bHkgd2l0aG91dAotICAgICAgICAgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl8zMjoKLQljYXNlIFJfMzg2X1BDMzI6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX05PTl9HT1RfUkVGOwotCi0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYW5kIHRoaXMgaXMgYSByZWxvYwotICAgICAgICAgICAgIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCBvciBhIG5vbiBQQyByZWxhdGl2ZSByZWxvYwotICAgICAgICAgICAgIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIHRoZW4gd2UgbmVlZCB0byBjb3B5IHRoZSByZWxvYwotICAgICAgICAgICAgIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgSG93ZXZlciwgaWYgd2UgYXJlIGxpbmtpbmcgd2l0aAotICAgICAgICAgICAgIC1Cc3ltYm9saWMsIHdlIGRvIG5vdCBuZWVkIHRvIGNvcHkgYSByZWxvYyBhZ2FpbnN0IGEKLSAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYW4gb2JqZWN0IHdlIGFyZQotICAgICAgICAgICAgIGluY2x1ZGluZyBpbiB0aGUgbGluayAoaS5lLiwgREVGX1JFR1VMQVIgaXMgc2V0KS4gIEF0Ci0gICAgICAgICAgICAgdGhpcyBwb2ludCB3ZSBoYXZlIG5vdCBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIHNvIGl0IGlzCi0gICAgICAgICAgICAgcG9zc2libGUgdGhhdCBERUZfUkVHVUxBUiBpcyBub3Qgc2V0IG5vdyBidXQgd2lsbCBiZSBzZXQKLSAgICAgICAgICAgICBsYXRlciAoaXQgaXMgbmV2ZXIgY2xlYXJlZCkuICBXZSBhY2NvdW50IGZvciB0aGF0Ci0gICAgICAgICAgICAgcG9zc2liaWxpdHkgYmVsb3cgYnkgc3RvcmluZyBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgICAgICAgICAgICBwY3JlbF9yZWxvY3NfY29waWVkIGZpZWxkIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICAgICYmIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSAhPSBSXzM4Nl9QQzMyCi0JCSAgfHwgKGggIT0gTlVMTAotCQkgICAgICAmJiAoISBpbmZvLT5zeW1ib2xpYwotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQotCSAgICB7Ci0JICAgICAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotICAgICAgICAgICAgICAgICByZWxvYyB0eXBlcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gZHlub2JqIGFuZCBtYWtlIHJvb20gZm9yIHRoaXMgcmVsb2MuICAqLwotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGFiZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSBuYW1lICsgNCkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkKLQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCQkgICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCQlmbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLQkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywgZmxhZ3MpCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIGFuZCB0aGlzIGlzIGEKLSAgICAgICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbCwgd2UgY291bnQgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZQotICAgICAgICAgICAgICAgICByZWxvY2F0aW9ucyB3ZSBoYXZlIGVudGVyZWQgZm9yIHRoaXMgc3ltYm9sLCBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgIHdlIGNhbiBkaXNjYXJkIHRoZW0gYWdhaW4gaWYgdGhlIHN5bWJvbCBpcyBsYXRlcgotICAgICAgICAgICAgICAgICBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbgotICAgICAgICAgICAgICAgICBpcyBvbmx5IGNhbGxlZCBpZiB3ZSBhcmUgdXNpbmcgYW4gZWxmX2kzODYgbGlua2VyCi0gICAgICAgICAgICAgICAgIGhhc2ggdGFibGUsIHdoaWNoIG1lYW5zIHRoYXQgaCBpcyByZWFsbHkgYSBwb2ludGVyIHRvCi0gICAgICAgICAgICAgICAgIGFuIGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeS4gICovCi0JICAgICAgaWYgKGggIT0gTlVMTCAmJiBpbmZvLT5zeW1ib2xpYwotCQkgICYmIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfMzg2X1BDMzIpCi0JCXsKLQkJICBzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICplaDsKLQkJICBzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqcDsKLQotCQkgIGVoID0gKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikgaDsKLQotCQkgIGZvciAocCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQkgICAgaWYgKHAtPnNlY3Rpb24gPT0gc3JlbG9jKQotCQkgICAgICBicmVhazsKLQotCQkgIGlmIChwID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHAgPSAoKHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkICopCi0JCQkgICBiZmRfYWxsb2MgKGR5bm9iaiwgc2l6ZW9mICpwKSk7Ci0JCSAgICAgIGlmIChwID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIHAtPm5leHQgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsKLQkJICAgICAgZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBwOwotCQkgICAgICBwLT5zZWN0aW9uID0gc3JlbG9jOwotCQkgICAgICBwLT5jb3VudCA9IDA7Ci0JCSAgICB9Ci0KLQkJICArK3AtPmNvdW50OwotCQl9Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLQkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfMzg2X0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotCSAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSXzM4Nl9HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWVsZl9pMzg2X2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfMzg2X0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSXzM4Nl9HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qID8/PyBJdCB3b3VsZCBzZWVtIHRoYXQgdGhlIGV4aXN0aW5nIGkzODYgY29kZSBkb2VzIG5vIHNvcnQKLSAgICAgb2YgcmVmZXJlbmNlIGNvdW50aW5nIG9yIHdoYXRub3Qgb24gaXRzIEdPVCBhbmQgUExUIGVudHJpZXMsCi0gICAgIHNvIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBnYXJiYWdlIGNvbGxlY3QgdGhlbSBhdCB0aGlzIHRpbWUuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSA9PSAwKQotCXsKLQkgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgd2Ugc2F3IGEgUExUMzIgcmVsb2MgaW4gYW4gaW5wdXQKLSAgICAgICAgICAgICBmaWxlLCBidXQgdGhlIHN5bWJvbCB3YXMgbmV2ZXIgcmVmZXJyZWQgdG8gYnkgYSBkeW5hbWljCi0gICAgICAgICAgICAgb2JqZWN0LiAgSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gYnVpbGQKLSAgICAgICAgICAgICBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBhbmQgd2UgY2FuIGp1c3QgZG8gYSBQQzMyCi0gICAgICAgICAgICAgcmVsb2MgaW5zdGVhZC4gICovCi0JICBCRkRfQVNTRVJUICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgLnBsdCBlbnRyeSwgbWFrZSByb29tIGZvciB0aGUgc3BlY2lhbAotCSBmaXJzdCBlbnRyeS4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCi0Jcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCX0KLQotICAgICAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLQotICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5nb3QucGx0IHNlY3Rpb24sIHdoaWNoCi0JIHdpbGwgYmUgcGxhY2VkIGluIHRoZSAuZ290IHNlY3Rpb24gYnkgdGhlIGxpbmtlciBzY3JpcHQuICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sIHRoYXQgZG8gbm90IHVzZSB0aGUKLSAgICAgR09ULCB3ZSBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGEgY29weSByZWxvYy4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX05PTl9HT1RfUkVGKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSXzM4Nl9DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWwuYnNzIHNlY3Rpb24gd2UgYXJlIGdvaW5nIHRvIHVzZS4gICovCi0gIGlmICgoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gMykKLSAgICBwb3dlcl9vZl90d28gPSAzOwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHBsdDsKLSAgYm9vbGVhbiByZWxvY3M7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWwuZ290IHNlY3Rpb24uCi0gICAgICAgICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCi0gICAgICAgICBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsLmdvdCwKLSAgICAgICAgIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0IHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlCi0gICAgICAgICBiZWxvdy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIHNoYXJlZCBsaW5rLCB0aGVuIHdlIG5lZWQgdG8gZGlzY2FyZCBhbGwKLSAgICAgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuCi0gICAgIFdlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZQotICAgICB3aWxsIG5vdCBmaWxsIHRoZW0gaW4gaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQgJiYgaW5mby0+c3ltYm9saWMpCi0gICAgZWxmX2kzODZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaTM4Nl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMsCi0JCQkJIChQVFIpIE5VTEwpOwotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcGx0ID0gZmFsc2U7Ci0gIHJlbG9jcyA9IGZhbHNlOwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogU3RyaXAgdGhpcyBzZWN0aW9uIGlmIHdlIGRvbid0IG5lZWQgaXQ7IHNlZSB0aGUKLSAgICAgICAgICAgICAgICAgY29tbWVudCBiZWxvdy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGlzIGEgUExULiAgKi8KLQkgICAgICBwbHQgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbC5ic3MgYW5kCi0JCSAucmVsLnBsdC4gIFdlIG11c3QgY3JlYXRlIGJvdGggc2VjdGlvbnMgaW4KLQkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIHRoZXkgbXVzdCBiZSBjcmVhdGVkCi0JCSBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAotCQkgc2VjdGlvbnMuICBUaGUgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUKLQkJIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZCBpdCBpcyB0aGF0Ci0JCSBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gZ28KLQkJIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWxvYyBzZWN0aW9ucyBvdGhlcgotICAgICAgICAgICAgICAgICB0aGFuIC5yZWwucGx0LiAgKi8KLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlbC5wbHQiKSAhPSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQotCQkgIHJlbG9jcyA9IHRydWU7Ci0KLQkJICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSAgICAgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTAotCQkgICAgIGVudHJ5LiAgVGhlIGVudHJpZXMgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24KLQkJICAgICByZWFsbHkgYXBwbHkgdG8gdGhlIC5nb3Qgc2VjdGlvbiwgd2hpY2ggd2UKLQkJICAgICBjcmVhdGVkIG91cnNlbHZlcyBhbmQgc28ga25vdyBpcyBub3QgcmVhZG9ubHkuICAqLwotCQkgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJCSAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCQkgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNCk7Ci0JCSAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgcmVsdGV4dCA9IHRydWU7Ci0JCX0KLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmdvdCIsIDQpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsb2NzKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMRU5ULAotCQkJCQkJc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGZfaTM4Nl9saW5rX2hhc2hfdHJhdmVyc2UgaWYgd2UgYXJlCi0gICBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3Qgd2l0aCAtQnN5bWJvbGljLiAgSXQgZGlzY2FyZHMgdGhlIHNwYWNlCi0gICBhbGxvY2F0ZWQgdG8gY29weSBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIHdoaWNoIGFyZQotICAgZGVmaW5lZCBpbiByZWd1bGFyIG9iamVjdHMuICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlCi0gICBjaGVja19yZWxvY3Mgcm91dGluZSwgYnV0IHdlIHdvbid0IGZpbGwgdGhlbSBpbiBpbiB0aGUKLSAgIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2Rpc2NhcmRfY29waWVzIChoLCBpZ25vcmUpCi0gICAgIHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQgKnM7Ci0KLSAgLyogV2Ugb25seSBkaXNjYXJkIHJlbG9jcyBmb3Igc3ltYm9scyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuICAqLwotICBpZiAoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yIChzID0gaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICBzLT5zZWN0aW9uLT5fcmF3X3NpemUgLT0gcy0+Y291bnQgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIGkzODYgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNwbHQgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlID09IFJfMzg2X0dOVV9WVElOSEVSSVQKLQkgIHx8IHJfdHlwZSA9PSBSXzM4Nl9HTlVfVlRFTlRSWSkKLQljb250aW51ZTsKLSAgICAgIGlmIChyX3R5cGUgPCAwCi0JICB8fCByX3R5cGUgPj0gKGludCkgUl8zODZfbWF4Ci0JICB8fCAocl90eXBlID49IChpbnQpIEZJUlNUX0lOVkFMSURfUkVMT0MKLQkgICAgICAmJiByX3R5cGUgPD0gKGludCkgTEFTVF9JTlZBTElEX1JFTE9DKSkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBob3d0byA9IGVsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIGJmZF92bWEgdmFsOwotCi0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHZhbCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkJICB2YWwgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgaWYgKHJfdHlwZSA9PSBSXzM4Nl9HT1RQQwotCQkgIHx8IChyX3R5cGUgPT0gUl8zODZfUExUMzIKLQkJICAgICAgJiYgaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0JCSAgfHwgKHJfdHlwZSA9PSBSXzM4Nl9HT1QzMgotCQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgICAmJiAoISBpbmZvLT5zaGFyZWQKLQkJCSAgfHwgKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSXzM4Nl8zMgotCQkJICB8fCByX3R5cGUgPT0gUl8zODZfUEMzMikKLQkJICAgICAgJiYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkJICAvKiBEV0FSRiB3aWxsIGVtaXQgUl8zODZfMzIgcmVsb2NhdGlvbnMgaW4gaXRzCi0JCQkgICAgIHNlY3Rpb25zIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGV4dGVybmFsbHkKLQkJCSAgICAgaW4gc2hhcmVkIGxpYnJhcmllcy4gIFdlIGNhbid0IGRvIGFueXRoaW5nCi0JCQkgICAgIHdpdGggdGhlbSBoZXJlLiAgKi8KLQkJCSAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkpKQotCQl7Ci0JCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZQotICAgICAgICAgICAgICAgICAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl8zODZfR09UMzI6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGdsb2JhbAotCSAgICAgb2Zmc2V0IHRhYmxlLiAgKi8KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIG9mZiA9IGgtPmdvdC5vZmZzZXQ7Ci0JICAgICAgQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCi0JCSAgICAgLUJzeW1ib2xpYyBsaW5rIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkJICAgICBsb2NhbGx5LCBvciB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwKLQkJICAgICBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLiAgV2UgbXVzdCBpbml0aWFsaXplCi0JCSAgICAgdGhpcyBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNpbmNlIHRoZQotCQkgICAgIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUKLQkJICAgICBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotCQkgICAgIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCi0KLQkJICAgICBXaGVuIGRvaW5nIGEgZHluYW1pYyBsaW5rLCB3ZSBjcmVhdGUgYSAucmVsLmdvdAotCQkgICAgIHJlbG9jYXRpb24gZW50cnkgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUuICBUaGlzCi0JCSAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCQkgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJICAgIG9mZiAmPSB+MTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICBzZ290LT5jb250ZW50cyArIG9mZik7Ci0JCSAgICAgIGgtPmdvdC5vZmZzZXQgfD0gMTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgQkZEX0FTU0VSVCAobG9jYWxfZ290X29mZnNldHMgIT0gTlVMTAotCQkJICAmJiBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIG9mZiA9IGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XTsKLQotCSAgICAgIC8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LiAgV2UgdXNlCi0gICAgICAgICAgICAgICAgIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotICAgICAgICAgICAgICAgICBhbHJlYWR5IGdlbmVyYXRlZCB0aGUgbmVjZXNzYXJ5IHJlbG9jLiAgKi8KLQkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCW9mZiAmPSB+MTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0KLQkJICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3JlbGdvdDsKLQkJICAgICAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7Ci0KLQkJICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCQkgICAgICBCRkRfQVNTRVJUIChzcmVsZ290ICE9IE5VTEwpOwotCi0JCSAgICAgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkJICsgb2ZmKTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl8zODZfUkVMQVRJVkUpOwotCQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCQkoKChFbGYzMl9FeHRlcm5hbF9SZWwgKikKLQkJCQkJCSAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCQkgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOwotCQkgICAgICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OwotCQkgICAgfQotCi0JCSAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0JCX0KLQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl9HT1RPRkY6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgZ2xvYmFsIG9mZnNldAotCSAgICAgdGFibGUuICAqLwotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICAvKiBOb3RlIHRoYXQgc2dvdC0+b3V0cHV0X29mZnNldCBpcyBub3QgaW52b2x2ZWQgaW4gdGhpcwotCSAgICAgY2FsY3VsYXRpb24uICBXZSBhbHdheXMgd2FudCB0aGUgc3RhcnQgb2YgLmdvdC4gIElmIHdlCi0JICAgICBkZWZpbmVkIF9HTE9CQUxfT0ZGU0VUX1RBQkxFIGluIGEgZGlmZmVyZW50IHdheSwgYXMgaXMKLQkgICAgIHBlcm1pdHRlZCBieSB0aGUgQUJJLCB3ZSBtaWdodCBoYXZlIHRvIGNoYW5nZSB0aGlzCi0JICAgICBjYWxjdWxhdGlvbi4gICovCi0JICByZWxvY2F0aW9uIC09IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl9HT1RQQzoKLQkgIC8qIFVzZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGFzIHN5bWJvbCB2YWx1ZS4gICovCi0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0JICBicmVhazsKLQotCWNhc2UgUl8zODZfUExUMzI6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0JICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLQkgIC8qIFJlc29sdmUgYSBQTFQzMiByZWxvYyBhZ2FpbiBhIGxvY2FsIHN5bWJvbCBkaXJlY3RseSwKLSAgICAgICAgICAgICB3aXRob3V0IHVzaW5nIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBicmVhazsKLQotCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotICAgICAgICAgICAgICAgICBoYXBwZW5zIHdoZW4gc3RhdGljYWxseSBsaW5raW5nIFBJQyBjb2RlLCBvciB3aGVuCi0gICAgICAgICAgICAgICAgIHVzaW5nIC1Cc3ltYm9saWMuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChzcGx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIGgtPnBsdC5vZmZzZXQpOwotCi0JICBicmVhazsKLQotCWNhc2UgUl8zODZfMzI6Ci0JY2FzZSBSXzM4Nl9QQzMyOgotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICAgICYmIChyX3R5cGUgIT0gUl8zODZfUEMzMgotCQkgIHx8IChoICE9IE5VTEwKLQkJICAgICAgJiYgaC0+ZHluaW5keCAhPSAtMQotCQkgICAgICAmJiAoISBpbmZvLT5zeW1ib2xpYwotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7Ci0JICAgICAgYm9vbGVhbiBza2lwLCByZWxvY2F0ZTsKLQotCSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlIHJlbG9jYXRpb25zCi0JCSBhcmUgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlIHRvIGJlIHJlc29sdmVkIGF0IHJ1bgotCQkgdGltZS4gICovCi0KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChpbnB1dF9iZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiksCi0JCQkJCSBuYW1lICsgNCkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0JCX0KLQotCSAgICAgIHNraXAgPSBmYWxzZTsKLQotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JCW91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3ZtYSBvZmY7Ci0KLQkJICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCQkgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCi0JCQkgIHJlbC0+cl9vZmZzZXQpKTsKLQkJICBpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKLQkJICAgIHNraXAgPSB0cnVlOwotCQkgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkJfQotCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JICAgICAgaWYgKHNraXApCi0JCXsKLQkJICBtZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCQkgIHJlbG9jYXRlID0gZmFsc2U7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChyX3R5cGUgPT0gUl8zODZfUEMzMikKLQkJewotCQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCAmJiBoLT5keW5pbmR4ICE9IC0xKTsKLQkJICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2X1BDMzIpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogaC0+ZHluaW5keCBtYXkgYmUgLTEgaWYgdGhpcyBzeW1ib2wgd2FzIG1hcmtlZCB0bwotICAgICAgICAgICAgICAgICAgICAgYmVjb21lIGxvY2FsLiAgKi8KLQkJICBpZiAoaCA9PSBOVUxMCi0JCSAgICAgIHx8ICgoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkpCi0JCSAgICB7Ci0JCSAgICAgIHJlbG9jYXRlID0gdHJ1ZTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl8zODZfUkVMQVRJVkUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0JCSAgICAgIHJlbG9jYXRlID0gZmFsc2U7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2XzMyKTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkoKChFbGYzMl9FeHRlcm5hbF9SZWwgKikKLQkJCQkJICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0JICAgICAgKytzcmVsb2MtPnJlbG9jX2NvdW50OwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG8KLQkJIG5vdCB3YW50IHRvIGZpZGRsZSB3aXRoIHRoZSBhZGRlbmQuICBPdGhlcndpc2UsIHdlCi0JCSBuZWVkIHRvIGluY2x1ZGUgdGhlIHN5bWJvbCB2YWx1ZSBzbyB0aGF0IGl0IGJlY29tZXMKLQkJIGFuIGFkZGVuZCBmb3IgdGhlIGR5bmFtaWMgcmVsb2MuICAqLwotCSAgICAgIGlmICghIHJlbG9jYXRlKQotCQljb250aW51ZTsKLQkgICAgfQotCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCSAgICByZWxvY2F0aW9uLCAoYmZkX3ZtYSkgMCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJCSAgICBzeW0tPnN0X25hbWUpOwotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgaWYgKCpuYW1lID09ICdcMCcpCi0JCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JCSAgfQotCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLSAgICAgIGJmZF92bWEgcGx0X2luZGV4OwotICAgICAgYmZkX3ZtYSBnb3Rfb2Zmc2V0OwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKLQkgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEdldCB0aGUgaW5kZXggaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHdoaWNoCi0JIGNvcnJlc3BvbmRzIHRvIHRoaXMgc3ltYm9sLiAgVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhpcyBzeW1ib2wKLQkgaW4gYWxsIHRoZSBzeW1ib2xzIGZvciB3aGljaCB3ZSBhcmUgbWFraW5nIHBsdCBlbnRyaWVzLiAgVGhlCi0JIGZpcnN0IGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBpcyByZXNlcnZlZC4gICovCi0gICAgICBwbHRfaW5kZXggPSBoLT5wbHQub2Zmc2V0IC8gUExUX0VOVFJZX1NJWkUgLSAxOwotCi0gICAgICAvKiBHZXQgdGhlIG9mZnNldCBpbnRvIHRoZSAuZ290IHRhYmxlIG9mIHRoZSBlbnRyeSB0aGF0Ci0JIGNvcnJlc3BvbmRzIHRvIHRoaXMgZnVuY3Rpb24uICBFYWNoIC5nb3QgZW50cnkgaXMgNCBieXRlcy4KLQkgVGhlIGZpcnN0IHRocmVlIGFyZSByZXNlcnZlZC4gICovCi0gICAgICBnb3Rfb2Zmc2V0ID0gKHBsdF9pbmRleCArIDMpICogNDsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwgZWxmX2kzODZfcGx0X2VudHJ5LAotCQkgIFBMVF9FTlRSWV9TSVpFKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgZ290X29mZnNldCksCi0JCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwgZWxmX2kzODZfcGljX3BsdF9lbnRyeSwKLQkJICBQTFRfRU5UUllfU0laRSk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBnb3Rfb2Zmc2V0LAotCQkgICAgICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyAyKTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHBsdF9pbmRleCAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKSwKLQkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA3KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIC0gKGgtPnBsdC5vZmZzZXQgKyBQTFRfRU5UUllfU0laRSksCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgMTIpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkgICArIGgtPnBsdC5vZmZzZXQKLQkJICAgKyA2KSwKLQkJICBzZ290LT5jb250ZW50cyArIGdvdF9vZmZzZXQpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbC5wbHQgc2VjdGlvbi4gICovCi0gICAgICByZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyBnb3Rfb2Zmc2V0KTsKLSAgICAgIHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2X0pVTVBfU0xPVCk7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgc3JlbC0+Y29udGVudHMKLQkJCQkgKyBwbHRfaW5kZXgpKTsKLQotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCi0JICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JfQotICAgIH0KLQotICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKLQkgdXAuICAqLwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0gICAgICByZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIExpa2V3aXNlIGlmCi0JIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLgotCSBUaGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbgotCSBpbml0aWFsaXplZCBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl8zODZfUkVMQVRJVkUpOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOwotCSAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfR0xPQl9EQVQpOwotCX0KLQotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHNyZWwtPmNvbnRlbnRzCi0JCQkJICsgc3JlbC0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbC0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgIi5yZWwuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICByZWwucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzM4Nl9DT1BZKTsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzLT5jb250ZW50cwotCQkJCSArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICAvKiBNYXJrIF9EWU5BTUlDIGFuZCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNkeW47Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBhc2VjdGlvbiAqczsKLQotCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIuZ290IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOgotCSAgICAgIG5hbWUgPSAiLnJlbC5wbHQiOwotCSAgICBnZXRfdm1hOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUUkVMU1o6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbC5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7Ci0JICAgICAgZWxzZQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUkVMU1o6Ci0JICAgICAgLyogTXkgcmVhZGluZyBvZiB0aGUgU1ZSNCBBQkkgaW5kaWNhdGVzIHRoYXQgdGhlCi0JCSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSByZWxvY3MgKERUX0pNUFJFTCkgc2hvdWxkIGJlCi0JCSBpbmNsdWRlZCBpbiB0aGUgb3ZlcmFsbCByZWxvY3MgKERUX1JFTCkuICBUaGlzIGlzCi0JCSB3aGF0IFNvbGFyaXMgZG9lcy4gIEhvd2V2ZXIsIFVuaXhXYXJlIGNhbiBub3QgaGFuZGxlCi0JCSB0aGF0IGNhc2UuICBUaGVyZWZvcmUsIHdlIG92ZXJyaWRlIHRoZSBEVF9SRUxTWiBlbnRyeQotCQkgaGVyZSB0byBtYWtlIGl0IG5vdCBpbmNsdWRlIHRoZSBKTVBSRUwgcmVsb2NzLiAgU2luY2UKLQkJIHRoZSBsaW5rZXIgc2NyaXB0IGFycmFuZ2VzIGZvciAucmVsLnBsdCB0byBmb2xsb3cgYWxsCi0JCSBvdGhlciByZWxvY2F0aW9uIHNlY3Rpb25zLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5Ci0JCSBhYm91dCBjaGFuZ2luZyB0aGUgRFRfUkVMIGVudHJ5LiAgKi8KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOwotCSAgICAgIGlmIChzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fY29va2VkX3NpemU7Ci0JCSAgZWxzZQotCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X3Jhd19zaXplOwotCQl9Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgaWYgKHNwbHQgJiYgc3BsdC0+X3Jhd19zaXplID4gMCkKLQl7Ci0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzLCBlbGZfaTM4Nl9waWNfcGx0MF9lbnRyeSwgUExUX0VOVFJZX1NJWkUpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWVtY3B5IChzcGx0LT5jb250ZW50cywgZWxmX2kzODZfcGx0MF9lbnRyeSwgUExUX0VOVFJZX1NJWkUpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCQkgIHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgNCwKLQkJCSAgc3BsdC0+Y29udGVudHMgKyAyKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJICBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDgsCi0JCQkgIHNwbHQtPmNvbnRlbnRzICsgOCk7Ci0JICAgIH0KLQotCSAgLyogVW5peFdhcmUgc2V0cyB0aGUgZW50c2l6ZSBvZiAucGx0IHRvIDQsIGFsdGhvdWdoIHRoYXQgZG9lc24ndAotCSAgICAgcmVhbGx5IHNlZW0gbGlrZSB0aGUgcmlnaHQgdmFsdWUuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLQl9Ci0gICAgfQotCi0gIC8qIEZpbGwgaW4gdGhlIGZpcnN0IHRocmVlIGVudHJpZXMgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgc2dvdC0+Y29udGVudHMpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgNCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA4KTsKLSAgICB9Ci0KLSAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjMyX2kzODZfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjMyLWkzODYiCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfaTM4NgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV8zODYKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHgxMDAwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQllbGZfaTM4Nl9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAllbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgXAotCQkJCQllbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLQkJCQkJZWxmX2kzODZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJZWxmX2kzODZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgllbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawllbGZfaTM4Nl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawllbGZfaTM4Nl9nY19zd2VlcF9ob29rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0CTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5CTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltCTAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQlQTFRfRU5UUllfU0laRQotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaTg2MC5jIGIvYmZkL2VsZjMyLWk4NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEyZDJkOS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaTg2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogSW50ZWwgODYwIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAliZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJX2JmZF9lbGZfbm9faW5mb190b19ob3d0bwotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCSBiZmRfZWxmMzJfaTg2MF92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAiZWxmMzItaTg2MCIKLSNkZWZpbmUgRUxGX0FSQ0gJIGJmZF9hcmNoX2k4NjAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERSBFTV84NjAKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFICAxIC8qIEZJWE1FOiBUaGlzIG51bWJlciBpcyB3cm9uZywgIEl0IHNob3VsZCBiZSB0aGUgcGFnZSBzaXplIGluIGJ5dGVzLiAgKi8KLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWk5NjAuYyBiL2JmZC9lbGYzMi1pOTYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOWZjM2QuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWk5NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKiBJbnRlbCA4NjAgc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvaTk2MC5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjMyX2k5NjBfcmVsb2NhdGUKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqZWxmMzJfaTk2MF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci0KLSNkZWZpbmUgVVNFX1JFTCAxCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAllbGYzMl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQllbGYzMl9pOTYwX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQllbGYzMl9pOTYwX2luZm9fdG9faG93dG9fcmVsCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9ob3d0b190YWJsZVtdPQotewotICBIT1dUTyhSXzk2MF9OT05FLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JZWxmMzJfaTk2MF9yZWxvY2F0ZSwgIlJfOTYwX05PTkUiLCB0cnVlLAotCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIGZhbHNlKSwKLSAgRU1QVFlfSE9XVE8gKDEpLAotICBIT1dUTyAoUl85NjBfMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JZWxmMzJfaTk2MF9yZWxvY2F0ZSwgIlJfOTYwXzMyIiwgdHJ1ZSwKLQkweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSXzk2MF9JUDI0LCAwLCAyLCAyNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCWVsZjMyX2k5NjBfcmVsb2NhdGUsICJSXzk2MF9JUDI0ICIsIHRydWUsCi0JMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgZmFsc2UpLAotICBFTVBUWV9IT1dUTyAoNCksCi0gIEVNUFRZX0hPV1RPICg1KSwKLSAgRU1QVFlfSE9XVE8gKDYpLAotICBFTVBUWV9IT1dUTyAoNykKLX07Ci0KLXN0YXRpYyBlbnVtIGVsZl9pOTYwX3JlbG9jX3R5cGUKLWVsZjMyX2k5NjBfYmZkX3RvX3JlbG9jX3R5cGUgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKQotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gUl85NjBfTk9ORTsKLSAgICBjYXNlIEJGRF9SRUxPQ19JOTYwX0NBTExKOgotICAgICAgcmV0dXJuIFJfOTYwX09QVENBTEw7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIHJldHVybiBSXzk2MF8zMjsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNF9QQ1JFTDoKLSAgICAgIHJldHVybiBSXzk2MF9JUDI0OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWVsZjMyX2k5NjBfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZAkJKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudAkJKmNhY2hlX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3QgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGYzMl9pOTYwX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGVudW0gZWxmX2k5NjBfcmVsb2NfdHlwZSB0eXBlOwotCi0gIHR5cGUgPSAoZW51bSBlbGZfaTk2MF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAodHlwZSA8IFJfOTYwX21heCk7Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfaG93dG9fdGFibGVbKGludCkgdHlwZV07Ci19Ci0KLS8qIEVMRiByZWxvY3MgYXJlIGFnYWluc3Qgc3ltYm9scy4gIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlCi0gICBvdXRwdXQsIGFuZCB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCBub3RoaW5nCi0gICBoYXMgZ2l2ZW4gdXMgYW55IGFkZGl0aW9uYWwgYWRkZW5kLCB0aGUgcmVzdWx0aW5nIHJlbG9jIHdpbGwgYWxzbwotICAgYmUgYWdhaW5zdCB0aGUgc2FtZSBzeW1ib2wuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0bwotICAgY2hhbmdlIGFueXRoaW5nIGFib3V0IHRoZSB3YXkgdGhlIHJlbG9jIGlzIGhhbmRsZWQsIHNpbmNlIGl0IHdpbGwKLSAgIGFsbCBiZSBkb25lIGF0IGZpbmFsIGxpbmsgdGltZS4gIFJhdGhlciB0aGFuIHB1dCBzcGVjaWFsIGNhc2UgY29kZQotICAgaW50byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBhbGwgdGhlIHJlbG9jIHR5cGVzIHVzZSB0aGlzIGhvd3RvCi0gICBmdW5jdGlvbi4gIEl0IGp1c3Qgc2hvcnQgY2lyY3VpdHMgdGhlIHJlbG9jIGlmIHByb2R1Y2luZwotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLS8qQVJHU1VTRUQqLwotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGYzMl9pOTYwX3JlbG9jYXRlIChhYmZkLAotCQkgICAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgICBzeW1ib2wsCi0JCSAgICAgICBkYXRhLAotCQkgICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgIG91dHB1dF9iZmQsCi0JCSAgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogSEFDSzogSSB0aGluayB0aGlzIGZpcnN0IGNvbmRpdGlvbiBpcyBuZWNlc3Nhcnkgd2hlbiBwcm9kdWNpbmcKLSAgICAgcmVsb2NhdGFibGUgb3V0cHV0LiAgQWZ0ZXIgdGhlIGVuZCBvZiBIQUNLLCB0aGUgY29kZSBpcyBpZGVudGljYWwKLSAgICAgdG8gYmZkX2VsZl9nZW5lcmljX3JlbG9jKCkuICBJIHdvdWxkIF9ndWVzc18gdGhlIGZpcnN0IGNoYW5nZQotICAgICBiZWxvbmdzIHRoZXJlIHJhdGhlciB0aGFuIGhlcmUuICBtYXJ0aW5kbyAxOTk4LTEwLTIzLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiByZWxvY19lbnRyeS0+aG93dG8tPnBjX3JlbGF0aXZlCi0gICAgICAmJiAhcmVsb2NfZW50cnktPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCAtPSBzeW1ib2wtPnZhbHVlOwotICAgIH0KLSAgLyogVGhpcyBpcyBtb3JlIGR1YmlvdXMuICovCi0gIGVsc2UgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0JICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCAtPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogZW5kIG9mIEhBQ0sgKi8KLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotCSAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLQkgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICAgICAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLQl7Ci0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZjMyX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgcmV0dXJuIGVsZl9ob3d0b190YWJsZSArIGVsZjMyX2k5NjBfYmZkX3RvX3JlbG9jX3R5cGUgKGNvZGUpOwotfQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9pOTYwX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLWk5NjAiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9pOTYwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fOTYwCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAgCTEgLyogRklYTUU6IFRoaXMgbnVtYmVyIGlzIHdyb25nLCAgSXQgc2hvdWxkIGJlIHRoZSBwYWdlIHNpemUgaW4gYnl0ZXMuICAqLwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbTMyci5jIGIvYmZkL2VsZjMyLW0zMnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljZTU1Yi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItbTMyci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA4OCArMCwwIEBACi0vKiBNMzJSLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvbTMyci5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG0zMnJfZWxmXzEwX3BjcmVsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9kb18xMF9wY3JlbF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgcmVsb2NfaG93dG9fdHlwZSAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF9ieXRlICosIGJmZF92bWEsIGFzZWN0aW9uICosIGJmZF92bWEsIGJmZF92bWEpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfaGkxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIG0zMnJfZWxmX3JlbG9jYXRlX2hpMTYKLSAgUEFSQU1TICgoYmZkICosIGludCwgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfbG8xNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfc2RhMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBtMzJyX2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1ib29sZWFuIF9iZmRfbTMycl9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICosIGludCAqKSk7Ci12b2lkIF9iZmRfbTMycl9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotI2lmIDAgLyogbm90IHlldCAqLwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBpbnQpKTsKLSNlbmRpZgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG0zMnJfZWxmX2ZpbmFsX3NkYV9iYXNlCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBtMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotI2RlZmluZSBOT1BfSU5TTgkJMHg3MDAwCi0jZGVmaW5lIE1BS0VfUEFSQUxMRUwoaW5zbikJKChpbnNuKSB8IDB4ODAwMCkKLQotLyogVXNlIFJFTCBpbnN0ZWFkIG9mIFJFTEEgdG8gc2F2ZSBzcGFjZS4KLSAgIFRoaXMgb25seSBzYXZlcyBzcGFjZSBpbiBsaWJyYXJpZXMgYW5kIG9iamVjdCBmaWxlcywgYnV0IHBlcmhhcHMKLSAgIHJlbG9jcyB3aWxsIGJlIHB1dCBpbiBST00/ICBBbGwgaW4gYWxsIHRob3VnaCwgUkVMIHJlbG9jcyBhcmUgYSBwYWluCi0gICB0byB3b3JrIHdpdGguICAqLwotI2RlZmluZSBVU0VfUkVMCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG0zMnJfZWxmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX00zMlJfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NMzJSX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMTYgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NMzJSXzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl8zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NMzJSXzMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDI0IGJpdCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl8yNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NMzJSXzI0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIFBDIFJlbGF0aXZlIDEwLWJpdCByZWxvY2F0aW9uLCBzaGlmdGVkIGJ5IDIuCi0gICAgIFRoaXMgcmVsb2MgaXMgY29tcGxpY2F0ZWQgYmVjYXVzZSByZWxvY2F0aW9ucyBhcmUgcmVsYXRpdmUgdG8gcGMgJiAtNC4KLSAgICAgaS5lLiBicmFuY2hlcyBpbiB0aGUgcmlnaHQgaW5zbiBzbG90IHVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgbGVmdCBpbnNuCi0gICAgIHNsb3QgZm9yIHBjLiAgKi8KLSAgLyogPz8/IEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgdGhpcyBzaG91bGQgaGF2ZSBwYXJ0aWFsX2lucGxhY2Ugc2V0IG9yIG5vdC4KLSAgICAgQnJhbmNoIHJlbGF4aW5nIGluIHRoZSBhc3NlbWJsZXIgY2FuIHN0b3JlIHRoZSBhZGRlbmQgaW4gdGhlIGluc24sCi0gICAgIGFuZCBpZiBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIGdldHMgY2FsbGVkIHRoZSBhZGRlbmQgbWF5IGdldCBhZGRlZAotICAgICBhZ2Fpbi4gICovCi0gIEhPV1RPIChSX00zMlJfMTBfUENSRUwsCS8qIHR5cGUgKi8KLQkgMiwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMCwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtMzJyX2VsZl8xMF9wY3JlbF9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NMzJSXzEwX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJICAgICAgICAvKiBzcmNfbWFzayAqLwotCSAweGZmLCAgIAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAxOCBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAyLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl8xOF9QQ1JFTCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMThfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDI2IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDIuICAqLwotICAvKiA/Pz8gSXQncyBub3QgY2xlYXIgd2hldGhlciB0aGlzIHNob3VsZCBoYXZlIHBhcnRpYWxfaW5wbGFjZSBzZXQgb3Igbm90LgotICAgICBCcmFuY2ggcmVsYXhpbmcgaW4gdGhlIGFzc2VtYmxlciBjYW4gc3RvcmUgdGhlIGFkZGVuZCBpbiB0aGUgaW5zbiwKLSAgICAgYW5kIGlmIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gZ2V0cyBjYWxsZWQgdGhlIGFkZGVuZCBtYXkgZ2V0IGFkZGVkCi0gICAgIGFnYWluLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl8yNl9QQ1JFTCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMjZfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGFkZHJlc3Mgd2hlbiBsb3dlciAxNiBpcyBvcidkIGluLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl9ISTE2X1VMTywJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTMycl9lbGZfaGkxNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NMzJSX0hJMTZfVUxPIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBhZGRyZXNzIHdoZW4gbG93ZXIgMTYgaXMgYWRkZWQgaW4uICAqLwotICBIT1dUTyAoUl9NMzJSX0hJMTZfU0xPLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtMzJyX2VsZl9oaTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfSEkxNl9TTE8iLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93ZXIgMTYgYml0cyBvZiBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl9MTzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtMzJyX2VsZl9sbzE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfTE8xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU21hbGwgZGF0YSBhcmVhIDE2IGJpdHMgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKFJfTTMyUl9TREExNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtMzJyX2VsZl9zZGExNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NMzJSX1NEQTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgLyogRklYTUU6IGNvcnJlY3Q/ICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfTTMyUl9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9NMzJSX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9NMzJSX0dOVV9WVEVOVFJZLCAgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9NMzJSX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotfTsKLQwKLS8qIEhhbmRsZSB0aGUgUl9NMzJSXzEwX1BDUkVMIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbTMycl9lbGZfMTBfcGNyZWxfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXJlbGVudCAqIHJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICogc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKiBvdXRwdXRfYmZkOwotICAgICBjaGFyICoqIGVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogVGhpcyBwYXJ0IGlzIGZyb20gYmZkX2VsZl9nZW5lcmljX3JlbG9jLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgKCEgcmVsb2NfZW50cnktPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogRklYTUU6IFNlZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgSXMgdGhpcyByaWdodD8gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLQotICByZXR1cm4gbTMycl9lbGZfZG9fMTBfcGNyZWxfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LT5ob3d0bywKLQkJCQkgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICBkYXRhLCByZWxvY19lbnRyeS0+YWRkcmVzcywKLQkJCQkgICAgIHN5bWJvbC0+c2VjdGlvbiwKLQkJCQkgICAgIChzeW1ib2wtPnZhbHVlCi0JCQkJICAgICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCksCi0JCQkJICAgICByZWxvY19lbnRyeS0+YWRkZW5kKTsKLX0KLQotLyogVXRpbGl0eSB0byBhY3R1YWxseSBwZXJmb3JtIGFuIFJfTTMyUl8xMF9QQ1JFTCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jIChhYmZkLCBob3d0bywgaW5wdXRfc2VjdGlvbiwgZGF0YSwgb2Zmc2V0LAotCQkJICAgIHN5bWJvbF9zZWN0aW9uLCBzeW1ib2xfdmFsdWUsIGFkZGVuZCkKLSAgICAgYmZkICphYmZkOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYXNlY3Rpb24gKnN5bWJvbF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgc3ltYm9sX3ZhbHVlOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLXsKLSAgYmZkX3NpZ25lZF92bWEgcmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgbG9uZyB4OwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3RhdHVzOwotCi0gIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcyAob2Zmc2V0IGluIHNlY3Rpb24pLiAgKi8KLSAgaWYgKG9mZnNldCA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgcmVsb2NhdGlvbiA9IHN5bWJvbF92YWx1ZSArIGFkZGVuZDsKLSAgLyogTWFrZSBpdCBwYyByZWxhdGl2ZS4gICovCi0gIHJlbG9jYXRpb24gLT0JKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gIC8qIFRoZXNlIGp1bXBzIG1hc2sgb2ZmIHRoZSBsb3dlciB0d28gYml0cyBvZiB0aGUgY3VycmVudCBhZGRyZXNzCi0gICAgIGJlZm9yZSBkb2luZyBwY3JlbCBjYWxjdWxhdGlvbnMuICAqLwotICByZWxvY2F0aW9uIC09IChvZmZzZXQgJiAtNEwpOwotCi0gIGlmIChyZWxvY2F0aW9uIDwgLTB4MjAwIHx8IHJlbG9jYXRpb24gPiAweDFmZikKLSAgICBzdGF0dXMgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gIGVsc2UKLSAgICBzdGF0dXMgPSBiZmRfcmVsb2Nfb2s7Ci0KLSAgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIGRhdGEgKyBvZmZzZXQpOwotICByZWxvY2F0aW9uID4+PSBob3d0by0+cmlnaHRzaGlmdDsKLSAgcmVsb2NhdGlvbiA8PD0gaG93dG8tPmJpdHBvczsKLSAgeCA9ICh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIHJlbG9jYXRpb24pICYgaG93dG8tPmRzdF9tYXNrKTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgZGF0YSArIG9mZnNldCk7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyogSGFuZGxlIHRoZSBSX00zMlJfSEkxNl9bU1VdTE8gcmVsb2NzLgotICAgSEkxNl9TTE8gaXMgZm9yIHRoZSBhZGQzIGFuZCBsb2FkL3N0b3JlIHdpdGggZGlzcGxhY2VtZW50IGluc3RydWN0aW9ucy4KLSAgIEhJMTZfVUxPIGlzIGZvciB0aGUgb3IzIGluc3RydWN0aW9uLgotICAgRm9yIFJfTTMyUl9ISTE2X1NMTywgdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHNpZ24gZXh0ZW5kZWQgd2hlbiBhZGRlZCB0bwotICAgdGhlIGhpZ2ggMTYgYnl0ZXMgc28gaWYgdGhlIGxvd2VyIDE2IGJpdHMgYXJlIG5lZ2F0aXZlIChiaXQgMTUgPT0gMSkgdGhlbgotICAgd2UgbXVzdCBhZGQgb25lIHRvIHRoZSBoaWdoIDE2IGJ5dGVzICh3aGljaCB3aWxsIGdldCBzdWJ0cmFjdGVkIG9mZiB3aGVuCi0gICB0aGUgbG93IDE2IGJpdHMgYXJlIGFkZGVkKS4KLSAgIFRoZXNlIHJlbG9jcyBoYXZlIHRvIGJlIGRvbmUgaW4gY29tYmluYXRpb24gd2l0aCBhbiBSX00zMlJfTE8xNiByZWxvYwotICAgYmVjYXVzZSB0aGVyZSBpcyBhIGNhcnJ5IGZyb20gdGhlIExPMTYgdG8gdGhlIEhJMTYuICBIZXJlIHdlIGp1c3Qgc2F2ZQotICAgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQ7IHdlIGRvIHRoZSBhY3R1YWwgcmVsb2NhdGlvbiB3aGVuIHdlIHNlZSB0aGUgTE8xNi4KLSAgIFRoaXMgY29kZSBpcyBjb3BpZWQgZnJvbSB0aGUgZWxmMzItbWlwcy5jLiAgV2UgYWxzbyBzdXBwb3J0IGFuIGFyYml0cmFyeQotICAgbnVtYmVyIG9mIEhJMTYgcmVsb2NzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBMTzE2IHJlbG9jLiAgVGhlCi0gICBhc3NlbWJsZXIgc29ydHMgdGhlIHJlbG9jcyB0byBlbnN1cmUgZWFjaCBISTE2IGltbWVkaWF0ZWx5IHByZWNlZGVzIGl0cwotICAgTE8xNi4gIEhvd2V2ZXIgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvcGllcywgdGhlIGFzc2VtYmxlciBtYXkgbm90IGZpbmQKLSAgIHRoZSByZWFsIExPMTYgc28gaXQgcGlja3MgdGhlIGZpcnN0IG9uZSBpdCBmaW5kcy4gICovCi0KLXN0cnVjdCBtMzJyX2hpMTYKLXsKLSAgc3RydWN0IG0zMnJfaGkxNiAqbmV4dDsKLSAgYmZkX2J5dGUgKmFkZHI7Ci0gIGJmZF92bWEgYWRkZW5kOwotfTsKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBhIHN0YXRpYyB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbTMycl9oaTE2ICptMzJyX2hpMTZfbGlzdDsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbTMycl9lbGZfaGkxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgc3RydWN0IG0zMnJfaGkxNiAqbjsKLQotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuCi0gICAgIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG9uJ3Qgd2FudAotICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcyAob2Zmc2V0IGluIHNlY3Rpb24pLiAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIFNhdmUgdGhlIGluZm9ybWF0aW9uLCBhbmQgbGV0IExPMTYgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbTMycl9oaTE2ICopIGJmZF9tYWxsb2MgKHNpemVvZiAqbik7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICBuLT5hZGRyID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbi0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgbi0+bmV4dCA9IG0zMnJfaGkxNl9saXN0OwotICBtMzJyX2hpMTZfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogSGFuZGxlIGFuIE0zMlIgRUxGIEhJMTYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCB0eXBlLCByZWxoaSwgcmVsbG8sIGNvbnRlbnRzLCBhZGRlbmQpCi0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBpbnQgdHlwZTsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGhpOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsbG87Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgYmZkX3ZtYSBhZGRsbzsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGhpLT5yX29mZnNldCk7Ci0KLSAgYWRkbG8gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsbG8tPnJfb2Zmc2V0KTsKLSAgaWYgKHR5cGUgPT0gUl9NMzJSX0hJMTZfU0xPKQotICAgIGFkZGxvID0gKChhZGRsbyAmIDB4ZmZmZikgXiAweDgwMDApIC0gMHg4MDAwOwotICBlbHNlCi0gICAgYWRkbG8gJj0gMHhmZmZmOwotCi0gIGFkZGVuZCArPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGFkZGxvOwotCi0gIC8qIFJlYWNjb3VudCBmb3Igc2lnbiBleHRlbnNpb24gb2YgbG93IHBhcnQuICAqLwotICBpZiAodHlwZSA9PSBSX00zMlJfSEkxNl9TTE8KLSAgICAgICYmIChhZGRlbmQgJiAweDgwMDApICE9IDApCi0gICAgYWRkZW5kICs9IDB4MTAwMDA7Ci0KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCSAgICAgIChpbnNuICYgMHhmZmZmMDAwMCkgfCAoKGFkZGVuZCA+PiAxNikgJiAweGZmZmYpLAotCSAgICAgIGNvbnRlbnRzICsgcmVsaGktPnJfb2Zmc2V0KTsKLX0KLQotLyogRG8gYW4gUl9NMzJSX0xPMTYgcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSBzdHJhaWdodGZvcndhcmQgMTYgYml0Ci0gICBpbnBsYWNlIHJlbG9jYXRpb247IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGluIG9yZGVyIHRvIGRvIHRoZQotICAgUl9NMzJSX0hJMTZfW1NVXUxPIHJlbG9jYXRpb24gZGVzY3JpYmVkIGFib3ZlLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9sbzE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAobTMycl9oaTE2X2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbTMycl9oaTE2ICpsOwotCi0gICAgICBsID0gbTMycl9oaTE2X2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtMzJyX2hpMTYgKm5leHQ7Ci0KLQkgIC8qIERvIHRoZSBISTE2IHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QgbmVlZAotCSAgICAgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgTE8xNiBpdHNlbGYsIGV4Y2VwdCB3aGVyZSB0bwotCSAgICAgZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlIExPMTYuICAqLwotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOwotCSAgdmFsbG8gPSAoKGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpCi0JCSAgICYgMHhmZmZmKSBeIDB4ODAwMCkgLSAweDgwMDA7Ci0JICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotCSAgdmFsICs9IGwtPmFkZGVuZDsKLQotCSAgLyogUmVhY2NvdW50IGZvciBzaWduIGV4dGVuc2lvbiBvZiBsb3cgcGFydC4gICovCi0JICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsICs9IDB4MTAwMDA7Ci0KLQkgIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKCh2YWwgPj4gMTYpICYgMHhmZmZmKTsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGwtPmFkZHIpOwotCi0JICBuZXh0ID0gbC0+bmV4dDsKLQkgIGZyZWUgKGwpOwotCSAgbCA9IG5leHQ7Ci0JfQotCi0gICAgICBtMzJyX2hpMTZfbGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIE5vdyBkbyB0aGUgTE8xNiByZWxvYyBpbiB0aGUgdXN1YWwgd2F5LiAgKi8KLSAgcmV0dXJuIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQlpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLX0KLQotLyogSGFuZGxlIHRoZSBSX00zMlJfU0RBMTYgcmVsb2MuCi0gICBUaGlzIHJlbG9jIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgYWRkcmVzcyBvZiBvYmplY3RzIGluIHRoZSBzbWFsbCBkYXRhIGFyZWEKLSAgIGFuZCB0byBwZXJmb3JtIGxvYWRzIGFuZCBzdG9yZXMgZnJvbSB0aGF0IGFyZWEuCi0gICBUaGUgbG93ZXIgMTYgYml0cyBhcmUgc2lnbiBleHRlbmRlZCBhbmQgYWRkZWQgdG8gdGhlIHJlZ2lzdGVyIHNwZWNpZmllZAotICAgaW4gdGhlIGluc3RydWN0aW9uLCB3aGljaCBpcyBhc3N1bWVkIHRvIHBvaW50IHRvIF9TREFfQkFTRV8uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9zZGExNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBTZWUgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIElzIHRoaXMgcmlnaHQ/ICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IG5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZSB5ZXQuICBCdXQgdGhlbiBhZ2FpbiwgdGhlIGxpbmtlcgotICAgICBtYXkgbmV2ZXIgY2FsbCB1cy4gICovCi0gIGFib3J0ICgpOwotfQotDAotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBNMzJSIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBtMzJyX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtMzJyX3JlbG9jX21hcCBtMzJyX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NMzJSX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfTTMyUl8xNiB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9NMzJSXzMyIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfMjQsIFJfTTMyUl8yNCB9LAotICB7IEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMLCBSX00zMlJfMTBfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTCwgUl9NMzJSXzE4X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwsIFJfTTMyUl8yNl9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPLCBSX00zMlJfSEkxNl9VTE8gfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTywgUl9NMzJSX0hJMTZfU0xPIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfTE8xNiwgUl9NMzJSX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl9TREExNiwgUl9NMzJSX1NEQTE2IH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX00zMlJfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfTTMyUl9HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKG0zMnJfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IG0zMnJfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKG0zMnJfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJm0zMnJfZWxmX2hvd3RvX3RhYmxlW20zMnJfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBNMzJSIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1tMzJyX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfTTMyUl9tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJm0zMnJfZWxmX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0MCi0vKiBHaXZlbiBhIEJGRCBzZWN0aW9uLCB0cnkgdG8gbG9jYXRlIHRoZSBjb3JyZXNwb25kaW5nIEVMRiBzZWN0aW9uCi0gICBpbmRleC4gICovCi0KLWJvb2xlYW4KLV9iZmRfbTMycl9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBoZHIsIHNlYywgcmV0dmFsKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGludCAqcmV0dmFsOwotewotICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5zY29tbW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICAqcmV0dmFsID0gU0hOX00zMlJfU0NPTU1PTjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBNMzJSIEVMRiB1c2VzIHR3byBjb21tb24gc2VjdGlvbnMuICBPbmUgaXMgdGhlIHVzdWFsIG9uZSwgYW5kIHRoZSBvdGhlcgotICAgaXMgZm9yIHNtYWxsIG9iamVjdHMuICBBbGwgdGhlIHNtYWxsIG9iamVjdHMgYXJlIGtlcHQgdG9nZXRoZXIsIGFuZCB0aGVuCi0gICByZWZlcmVuY2VkIHZpYSBvbmUgcmVnaXN0ZXIsIHdoaWNoIHlpZWxkcyBmYXN0ZXIgYXNzZW1ibGVyIGNvZGUuICBJdCBpcwotICAgdXAgdG8gdGhlIGNvbXBpbGVyIHRvIGVtaXQgYW4gaW5zdHJ1Y3Rpb24gdG8gbG9hZCB0aGUgcmVnaXN0ZXIgd2l0aAotICAgX1NEQV9CQVNFLiAgVGhpcyBpcyB3aGF0IHdlIHVzZSBmb3IgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgVGhpcwotICAgYXBwcm9hY2ggaXMgY29waWVkIGZyb20gZWxmMzItbWlwcy5jLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiBtMzJyX2VsZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCBtMzJyX2VsZl9zY29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICptMzJyX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0KLS8qIEhhbmRsZSB0aGUgc3BlY2lhbCBNMzJSIHNlY3Rpb24gbnVtYmVycyB0aGF0IGEgc3ltYm9sIG1heSB1c2UuICAqLwotCi12b2lkCi1fYmZkX20zMnJfZWxmX3N5bWJvbF9wcm9jZXNzaW5nIChhYmZkLCBhc3ltKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqYXN5bTsKLXsKLSAgZWxmX3N5bWJvbF90eXBlICplbGZzeW07Ci0KLSAgZWxmc3ltID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBhc3ltOwotCi0gIHN3aXRjaCAoZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4KQotICAgIHsKLSAgICBjYXNlIFNITl9NMzJSX1NDT01NT046Ci0gICAgICBpZiAobTMycl9lbGZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICBtMzJyX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtMzJyX2VsZl9zY29tX3NlY3Rpb24uZmxhZ3MgPSBTRUNfSVNfQ09NTU9OOwotCSAgbTMycl9lbGZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJm0zMnJfZWxmX3Njb21fc2VjdGlvbjsKLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2wgPSAmbTMycl9lbGZfc2NvbV9zeW1ib2w7Ci0JICBtMzJyX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbTMycl9lbGZfc2NvbV9zeW1ib2xfcHRyOwotCSAgbTMycl9lbGZfc2NvbV9zeW1ib2wubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtMzJyX2VsZl9zY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG0zMnJfZWxmX3Njb21fc3ltYm9sLnNlY3Rpb24gPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotCSAgbTMycl9lbGZfc2NvbV9zeW1ib2xfcHRyID0gJm0zMnJfZWxmX3Njb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogSG9vayBjYWxsZWQgYnkgdGhlIGxpbmtlciByb3V0aW5lIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIFdlIG11c3QgaGFuZGxlIHRoZSBzcGVjaWFsIE0zMlIgc2VjdGlvbiBudW1iZXJzIGhlcmUuCi0gICBXZSBhbHNvIGtlZXAgd2F0Y2hpbmcgZm9yIHdoZXRoZXIgd2UgbmVlZCB0byBjcmVhdGUgdGhlIHNkYXRhIHNwZWNpYWwKLSAgIGxpbmtlciBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3AgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICgqbmFtZXApWzBdID09ICdfJyAmJiAoKm5hbWVwKVsxXSA9PSAnUycKLSAgICAgICYmIHN0cmNtcCAoKm5hbWVwLCAiX1NEQV9CQVNFXyIpID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBpcyBzaW1wbGVyIHRoYW4gdXNpbmcgX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCi0JIChvdXIgbmVlZHMgYXJlIHNpbXBsZXIgdGhhbiBwcGMncyBuZWVkcykuICBBbHNvCi0JIF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiBjdXJyZW50bHkgaGFzIGEgYnVnIHdoZXJlIGlmIGEgLnNkYXRhCi0JIHNlY3Rpb24gYWxyZWFkeSBleGlzdHMgYSBuZXcgb25lIGlzIGNyZWF0ZWQgdGhhdCBmb2xsb3dzIGl0IHdoaWNoCi0JIHNjcmV3cyBvZiBfU0RBX0JBU0VfIGFkZHJlc3MgY2FsY3MgYmVjYXVzZSBvdXRwdXRfb2Zmc2V0ICE9IDAuICAqLwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBhc2VjdGlvbiAqcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7Ci0KLSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgY29iYmxlZCBmcm9tIGVsZjMyLXBwYy5jIGFuZCBlbGZsaW5rLmMuICAqLwotCi0gICAgICBpZiAocyA9PSBOVUxMKQotCXsKLQkgIGludCBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLQkgIHMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5zZGF0YSIpOwotCSAgaWYgKHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKTsKLQl9Ci0KLSAgICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQliZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9TREFfQkFTRV8iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgaWYgKChoID09IE5VTEwgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCSAgJiYgIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywKLQkJCQkJCSBhYmZkLAotCQkJCQkJICJfU0RBX0JBU0VfIiwKLQkJCQkJCSBCU0ZfR0xPQkFMLAotCQkJCQkJIHMsCi0JCQkJCQkgMzI3NjgsCi0JCQkJCQkgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCSBmYWxzZSwKLQkJCQkJCSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCQkJCQkgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotICAgIH0KLQotICBzd2l0Y2ggKHN5bS0+c3Rfc2huZHgpCi0gICAgewotICAgIGNhc2UgU0hOX00zMlJfU0NPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBTREFfQkFTRSB2YWx1ZSwgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZQotICAgc3ltYm9sIHZhbHVlIGNvcnJlY3RseS4gIFdlIGxvb2sgdXAgdGhlIHN5bWJvbCBfU0RBX0JBU0VfIGluIHRoZSBvdXRwdXQKLSAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVMRgotICAgdGFyZ2V0IGRhdGEuICBXZSBkb24ndCBuZWVkIHRvIGFkanVzdCB0aGUgc3ltYm9sIHZhbHVlIGZvciBhbgotICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2ZpbmFsX3NkYV9iYXNlIChvdXRwdXRfYmZkLCBpbmZvLCBlcnJvcl9tZXNzYWdlLCBwc2IpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJvcl9tZXNzYWdlOwotICAgICBiZmRfdm1hICpwc2I7Ci17Ci0gIGlmIChlbGZfZ3AgKG91dHB1dF9iZmQpID09IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9TREFfQkFTRV8iLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCWVsZl9ncCAob3V0cHV0X2JmZCkgPSAoaC0+dS5kZWYudmFsdWUKLQkJCSAgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIE9ubHkgZ2V0IHRoZSBlcnJvciBvbmNlLiAgKi8KLQkgICpwc2IgPSBlbGZfZ3AgKG91dHB1dF9iZmQpID0gNDsKLQkgICplcnJvcl9tZXNzYWdlID0KLQkgICAgKGNvbnN0IGNoYXIgKikgXygiU0RBIHJlbG9jYXRpb24gd2hlbiBfU0RBX0JBU0VfIG5vdCBkZWZpbmVkIik7Ci0JICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQl9Ci0gICAgfQotICAqcHNiID0gZWxmX2dwIChvdXRwdXRfYmZkKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQwKLS8qIFJlbG9jYXRlIGFuIE0zMlIvRCBFTEYgc2VjdGlvbi4KLSAgIFRoZXJlIGlzIHNvbWUgYXR0ZW1wdCB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdXNhYmxlIGZvciBtYW55IGFyY2hpdGVjdHVyZXMsCi0gICBib3RoIFVTRV9SRUwgYW5kIFVTRV9SRUxBIFsndHdvdWxkIGJlIG5pY2UgaWYgc3VjaCBhIGNyaXR0ZXIgZXhpc3RlZF0sCi0gICBpZiBvbmx5IHRvIHNlcnZlIGFzIGEgbGVhcm5pbmcgdG9vbC4KLQotICAgVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3QgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCi0gICBuZWNlc3NhcnkuCi0KLSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYwotICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICBMT0NBTF9TWU1TIGlzIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbiBsb2NhbCBzeW1ib2xzLgotCi0gICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICBUaGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBnbG9iYWwgc3ltYm9scyBjYW4gYmUgZm91bmQKLSAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZSBvdXRwdXQgc3ltYm9sIGlzCi0gICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0Ci0gICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgYWNjb3JkaW5nbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIC8qIEFzc3VtZSBzdWNjZXNzLiAgKi8KLSAgYm9vbGVhbiByZXQgPSB0cnVlOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICAvKiBXZSBjYW4ndCBtb2RpZnkgcl9hZGRlbmQgaGVyZSBhcyBlbGZfbGlua19pbnB1dF9iZmQgaGFzIGFuIGFzc2VydCB0bwotCSBlbnN1cmUgaXQncyB6ZXJvICh3ZSB1c2UgUkVMIHJlbG9jcywgbm90IFJFTEEpLiAgVGhlcmVmb3JlIHRoaXMKLQkgc2hvdWxkIGJlIGFzc2lnbmluZyB6ZXJvIHRvIGBhZGRlbmQnLCBidXQgZm9yIGNsYXJpdHkgd2UgdXNlCi0JIGByX2FkZGVuZCcuICAqLwotICAgICAgYmZkX3ZtYSBhZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotICAgICAgYmZkX3ZtYSBvZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZyA9IE5VTEw7Ci0KLSAgICAgIGggPSBOVUxMOwotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9NMzJSX21heCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCSAoaW50KSByX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHJfdHlwZSA9PSBSX00zMlJfR05VX1ZURU5UUlkKLSAgICAgICAgICB8fCByX3R5cGUgPT0gUl9NMzJSX0dOVV9WVElOSEVSSVQpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBob3d0byA9IG0zMnJfZWxmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBzZWMgPSBOVUxMOwotCSAgaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICAvKiBFeHRlcm5hbCBzeW1ib2wuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIExvY2FsIHN5bWJvbC4gICovCi0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzeW1fbmFtZSA9ICI8bG9jYWwgc3ltYm9sPiI7Ci0JICAvKiBTVFRfU0VDVElPTjogc3ltYm9sIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHNlY3Rpb24uICAqLwotCSAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9TRUNUSU9OKQotCSAgICB7Ci0JICAgICAgLyogU3ltYm9sIGlzbid0IGFzc29jaWF0ZWQgd2l0aCBhIHNlY3Rpb24uICBOb3RoaW5nIHRvIGRvLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICBhZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLSNpZm5kZWYgVVNFX1JFTAotCSAgLyogVGhpcyBjYW4ndCBiZSBkb25lIGZvciBVU0VfUkVMIGJlY2F1c2UgaXQgZG9lc24ndCBtZWFuIGFueXRoaW5nCi0JICAgICBhbmQgZWxmX2xpbmtfaW5wdXRfYmZkIGFzc2VydHMgdGhpcyBzdGF5cyB6ZXJvLiAgKi8KLQkgIHJlbC0+cl9hZGRlbmQgPSBhZGRlbmQ7Ci0jZW5kaWYKLQotI2lmbmRlZiBVU0VfUkVMCi0JICAvKiBBZGRlbmRzIGFyZSBzdG9yZWQgd2l0aCByZWxvY3MuICBXZSdyZSBkb25lLiAgKi8KLQkgIGNvbnRpbnVlOwotI2Vsc2UgLyogVVNFX1JFTCAqLwotCSAgLyogSWYgcGFydGlhbF9pbnBsYWNlLCB3ZSBuZWVkIHRvIHN0b3JlIGFueSBhZGRpdGlvbmFsIGFkZGVuZAotCSAgICAgYmFjayBpbiB0aGUgc2VjdGlvbi4gICovCi0JICBpZiAoISBob3d0by0+cGFydGlhbF9pbnBsYWNlKQotCSAgICBjb250aW51ZTsKLQkgIC8qID8/PyBIZXJlIGlzIGEgbmljZSBwbGFjZSB0byBjYWxsIGEgc3BlY2lhbF9mdW5jdGlvbgotCSAgICAgbGlrZSBoYW5kbGVyLiAgKi8KLQkgIGlmIChyX3R5cGUgIT0gUl9NMzJSX0hJMTZfU0xPICYmIHJfdHlwZSAhPSBSX00zMlJfSEkxNl9VTE8pCi0JICAgIHIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLAotCQkJCQlhZGRlbmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpsb3JlbDsKLQotCSAgICAgIC8qIFdlIGFsbG93IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgSEkxNiByZWxvY3MgYmVmb3JlIHRoZQotCQkgTE8xNiByZWxvYy4gIFRoaXMgcGVybWl0cyBnY2MgdG8gZW1pdCB0aGUgSEkgYW5kIExPIHJlbG9jcwotCQkgaXRzZWxmLiAgKi8KLQkgICAgICBmb3IgKGxvcmVsID0gcmVsICsgMTsKLQkJICAgKGxvcmVsIDwgcmVsZW5kCi0JCSAgICAmJiAoRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfSEkxNl9TTE8KLQkJCXx8IEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0hJMTZfVUxPKSk7Ci0JCSAgIGxvcmVsKyspCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChsb3JlbCA8IHJlbGVuZAotCQkgICYmIEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0xPMTYpCi0JCXsKLQkJICBtMzJyX2VsZl9yZWxvY2F0ZV9oaTE2IChpbnB1dF9iZmQsIHJfdHlwZSwgcmVsLCBsb3JlbCwKLQkJCQkJICBjb250ZW50cywgYWRkZW5kKTsKLQkJICByID0gYmZkX3JlbG9jX29rOwotCQl9Ci0JICAgICAgZWxzZQotCQlyID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwKLQkJCQkJICAgIGFkZGVuZCwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgICB9Ci0jZW5kaWYgLyogVVNFX1JFTCAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLQkgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLQkgIHN5bSA9IE5VTEw7Ci0JICBzZWMgPSBOVUxMOwotCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgLyogTG9jYWwgc3ltYm9sLiAgKi8KLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgICAgIHN5bV9uYW1lID0gIjxsb2NhbCBzeW1ib2w+IjsKLQkgICAgICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgKyBzeW0tPnN0X3ZhbHVlKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICAgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JCWggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgICAgICBzeW1fbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0KLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJICAgIHJlbG9jYXRpb24gPSAwOwotCQkgIGVsc2UKLQkJICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkJIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgIGlucHV0X3NlY3Rpb24sIG9mZnNldCkpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgIH0KLQotCSAgLyogU2FuaXR5IGNoZWNrIHRoZSBhZGRyZXNzLiAgKi8KLQkgIGlmIChvZmZzZXQgPiBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JICAgIHsKLQkgICAgICByID0gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0JICAgICAgZ290byBjaGVja19yZWxvYzsKLQkgICAgfQotCi0JICBzd2l0Y2ggKChpbnQpIHJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIChpbnQpIFJfTTMyUl8xMF9QQ1JFTCA6Ci0JICAgICAgciA9IG0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jIChpbnB1dF9iZmQsIGhvd3RvLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgICBjb250ZW50cywgb2Zmc2V0LAotCQkJCQkgICAgICBzZWMsIHJlbG9jYXRpb24sIGFkZGVuZCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAoaW50KSBSX00zMlJfSEkxNl9TTE8gOgotCSAgICBjYXNlIChpbnQpIFJfTTMyUl9ISTE2X1VMTyA6Ci0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfUmVsYSAqbG9yZWw7Ci0KLQkJLyogV2UgYWxsb3cgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBISTE2IHJlbG9jcyBiZWZvcmUgdGhlCi0JCSAgIExPMTYgcmVsb2MuICBUaGlzIHBlcm1pdHMgZ2NjIHRvIGVtaXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLQkJICAgaXRzZWxmLiAgKi8KLQkJZm9yIChsb3JlbCA9IHJlbCArIDE7Ci0JCSAgICAgKGxvcmVsIDwgcmVsZW5kCi0JCSAgICAgICYmIChFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9ISTE2X1NMTwotCQkJICB8fCBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9ISTE2X1VMTykpOwotCQkgICAgIGxvcmVsKyspCi0JCSAgY29udGludWU7Ci0JCWlmIChsb3JlbCA8IHJlbGVuZAotCQkgICAgJiYgRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfTE8xNikKLQkJICB7Ci0JCSAgICBtMzJyX2VsZl9yZWxvY2F0ZV9oaTE2IChpbnB1dF9iZmQsIHJfdHlwZSwgcmVsLCBsb3JlbCwKLQkJCQkJICAgIGNvbnRlbnRzLCByZWxvY2F0aW9uICsgYWRkZW5kKTsKLQkJICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JCSAgfQotCQllbHNlCi0JCSAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCWNvbnRlbnRzLCBvZmZzZXQsCi0JCQkJCQlyZWxvY2F0aW9uLCBhZGRlbmQpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIChpbnQpIFJfTTMyUl9TREExNiA6Ci0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCUJGRF9BU1NFUlQgKHNlYyAhPSBOVUxMKTsKLQkJbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0JCWlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAobmFtZSwgIi5zY29tbW9uIikgPT0gMCkKLQkJICB7Ci0JCSAgICBiZmRfdm1hIHNkYV9iYXNlOwotCQkgICAgYmZkICpvdXRfYmZkID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXI7Ci0KLQkJICAgIHIgPSBtMzJyX2VsZl9maW5hbF9zZGFfYmFzZSAob3V0X2JmZCwgaW5mbywKLQkJCQkJCSAmZXJybXNnLAotCQkJCQkJICZzZGFfYmFzZSk7Ci0JCSAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JCSAgICAgIHsKLQkJCXJldCA9IGZhbHNlOwotCQkJZ290byBjaGVja19yZWxvYzsKLQkJICAgICAgfQotCi0JCSAgICAvKiBBdCB0aGlzIHBvaW50IGByZWxvY2F0aW9uJyBjb250YWlucyB0aGUgb2JqZWN0J3MKLQkJICAgICAgIGFkZHJlc3MuICAqLwotCQkgICAgcmVsb2NhdGlvbiAtPSBzZGFfYmFzZTsKLQkJICAgIC8qIE5vdyBpdCBjb250YWlucyB0aGUgb2Zmc2V0IGZyb20gX1NEQV9CQVNFXy4gICovCi0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogVGhlIHRhcmdldCAoJXMpIG9mIGFuICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIHNlY3Rpb24gKCVzKSIpLAotCQkJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJCQkgICBzeW1fbmFtZSwKLQkJCQkJICAgbTMycl9lbGZfaG93dG9fdGFibGVbKGludCkgcl90eXBlXS5uYW1lLAotCQkJCQkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSk7Ci0JCSAgICAvKmJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOyA/Pz8gd2h5PyAqLwotCQkgICAgcmV0ID0gZmFsc2U7Ci0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGRlZmF1bHQgOgotCSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cywgb2Zmc2V0LAotCQkJCQkgICAgcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgIGNoZWNrX3JlbG9jOgotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGdlbmVyaWMgZW5vdWdoIHRvIGdvIGluIGEgdXRpbGl0eS4gICovCi0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgIH0KLQotCSAgaWYgKGVycm1zZyAhPSBOVUxMKQotCSAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBvZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgZXJybXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgZXJybXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZXJybXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgZXJybXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQwKLSNpZiAwIC8qIHJlbGF4aW5nIG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBmb3IgdGhlIG0zMnIuCi0gICBSZWxheGluZyBvbiB0aGUgbTMyciBpcyB0cmlja3kgYmVjYXVzZSBvZiBpbnN0cnVjdGlvbiBhbGlnbm1lbnQKLSAgIHJlcXVpcmVtZW50cyAoNCBieXRlIGluc3RydWN0aW9ucyBtdXN0IGJlIGFsaWduZWQgb24gNCBieXRlIGJvdW5kYXJpZXMpLgotCi0gICBUaGUgZm9sbG93aW5nIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMgYXJlIGhhbmRsZWQ6Ci0KLSAgIHNldGgvYWRkMy9qbCAtPiBibDI0IG9yIGJsOAotICAgc2V0aC9hZGQzIC0+IGxkMjQKLQotICAgSXQgd291bGQgYmUgbmljZSB0byBoYW5kbGUgYmwyNCAtPiBibDggYnV0IGdpdmVuOgotCi0gICAtIDQgYnl0ZSBpbnNucyBtdXN0IGJlIG9uIDQgYnl0ZSBib3VuZGFyaWVzCi0gICAtIGJyYW5jaCBpbnN0cnVjdGlvbnMgb25seSBicmFuY2ggdG8gaW5zbnMgb24gNCBieXRlIGJvdW5kYXJpZXMKLQotICAgdGhpcyBpc24ndCBtdWNoIG9mIGEgd2luIGJlY2F1c2UgdGhlIGluc24gaW4gdGhlIDIgImRlbGV0ZWQiIGJ5dGVzCi0gICBtdXN0IGJlY29tZSBhIG5vcC4gIFdpdGggc29tZSBjb21wbGV4aXR5IHNvbWUgcmVhbCByZWxheGF0aW9uIGNvdWxkIGJlCi0gICBkb25lIGJ1dCB0aGUgZnJlcXVlbmN5IGp1c3Qgd291bGRuJ3QgbWFrZSBpdCB3b3J0aCBpdDsgaXQncyBiZXR0ZXIgdG8KLSAgIHRyeSB0byBkbyBhbGwgdGhlIGNvZGUgY29tcGFjdGlvbiBvbmUgY2FuIGVsc2V3aGVyZS4KLSAgIFdoZW4gdGhlIGNoaXAgc3VwcG9ydHMgcGFyYWxsZWwgMTYgYml0IGluc25zLCB0aGluZ3MgbWF5IGNoYW5nZS4KLSovCi0KLXN0YXRpYyBib29sZWFuIAotbTMycl9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgLyogVGhlIFJlbGEgc3RydWN0dXJlcyBhcmUgdXNlZCBoZXJlIGJlY2F1c2UgdGhhdCdzIHdoYXQKLSAgICAgX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzIHVzZXMgW2ZvciBjb252ZW5pZW5jZSAtIGl0IHNldHMgdGhlIGFkZGVuZAotICAgICBmaWVsZCB0byAwXS4gICovCi0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLSAgLyogQXNzdW1lIG5vdGhpbmcgY2hhbmdlcy4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIC8qIFdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgZm9yIGEgcmVsb2NhdGVhYmxlIGxpbmssIGlmCi0gICAgIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIHJlbG9jcywgb3IgaWYgdGhpcyBpcyBub3QgYQotICAgICBjb2RlIHNlY3Rpb24uICAqLwotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDAKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX0NPREUpID09IDAKLSAgICAgIHx8IDAgLyogRklYTUU6IGNoZWNrIFNIRl9NMzJSX0NBTl9SRUxBWCAqLykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc2VjdGlvbiwKLSAgICAgaW5pdGlhbGl6ZSB0aGUgY29va2VkIHNpemUuICAqLwotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLQotICAvKiBHZXQgYSBjb3B5IG9mIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMuICAqLwotICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCSAgICAgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIC8qIFdhbGsgdGhyb3VnaCB0aGVtIGxvb2tpbmcgZm9yIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgc3ltdmFsOwotCi0gICAgICAvKiBJZiB0aGlzIGlzbid0IHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZWxheGVkLCB0aGVuIGlnbm9yZQotCSB0aGlzIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9NMzJSX0hJMTZfU0xPKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBSZWFkIHRoaXMgQkZEJ3Mgc3ltYm9scyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCSAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLQkgICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBleHRzeW1zOwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCQkgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkJICAgICAgIT0gc3ltdGFiX2hkci0+c2hfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhlIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCSAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0KLQkgIC8qIEEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwKLQkJCQkgICAgZXh0c3ltcyArIEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCSAgICAmaXN5bSk7Ci0KLQkgIHN5bV9zZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaXN5bS5zdF9zaG5keCk7Ci0JICBzeW12YWwgPSAoaXN5bS5zdF92YWx1ZQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluZHg7Ci0JICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogQW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgIGluZHggPSBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZHhdOwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgSnVzdCBpZ25vcmUgaXQtLWl0IHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQotICAgICAgICAgICAgICAgICByZWd1bGFyIHJlbG9jIHByb2Nlc3NpbmcuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN5bXZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCX0KLQotICAgICAgLyogRm9yIHNpbXBsaWNpdHkgb2YgY29kaW5nLCB3ZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IHRoZSBzZWN0aW9uCi0JIGNvbnRlbnRzLCB0aGUgc2VjdGlvbiByZWxvY3MsIGFuZCB0aGUgQkZEIHN5bWJvbCB0YWJsZS4gIFdlCi0JIG11c3QgdGVsbCB0aGUgcmVzdCBvZiB0aGUgY29kZSBub3QgdG8gZnJlZSB1cCB0aGlzCi0JIGluZm9ybWF0aW9uLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8gaW5zdGVhZCBjcmVhdGUgYSB0YWJsZQotCSBvZiBjaGFuZ2VzIHdoaWNoIGhhdmUgdG8gYmUgbWFkZSwgYXMgaXMgZG9uZSBpbiBjb2ZmLW1pcHMuYzsKLQkgdGhhdCB3b3VsZCBiZSBtb3JlIHdvcmssIGJ1dCB3b3VsZCByZXF1aXJlIGxlc3MgbWVtb3J5IHdoZW4KLQkgdGhlIGxpbmtlciBpcyBydW4uICAqLwotCi0gICAgICAvKiBUcnkgdG8gY2hhbmdlIGEgc2V0aC9hZGQzL2psIHN1YnJvdXRpbmUgY2FsbCB0byBibDI0IG9yIGJsOC4KLQkgVGhpcyBzZXF1ZW5jZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIHdoZW4gY29tcGlsaW5nIGluCi0JIDMyIGJpdCBtb2RlLiAgQWxzbyBsb29rIGZvciBzZXRoL2FkZDMgLT4gbGQyNC4gICovCi0KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NMzJSX0hJMTZfU0xPKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWxhICpucmVsOwotCSAgYmZkX3ZtYSBwYyA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgaXJlbC0+cl9vZmZzZXQpOwotCSAgYmZkX3NpZ25lZF92bWEgcGNyZWxfdmFsdWUgPSBzeW12YWwgLSBwYzsKLQkgIHVuc2lnbmVkIGludCBjb2RlLHJlZzsKLQkgIGludCBhZGRlbmQsbm9wX3AsYmw4X3AsdG9fZGVsZXRlOwotCi0JICAvKiBUaGUgdGVzdHMgYXJlIG9yZGVyZWQgc28gdGhhdCB3ZSBnZXQgb3V0IGFzIHF1aWNrbHkgYXMgcG9zc2libGUKLQkgICAgIGlmIHRoaXMgaXNuJ3Qgc29tZXRoaW5nIHdlIGNhbiByZWxheCwgdGFraW5nIGludG8gYWNjb3VudCB0aGF0Ci0JICAgICB3ZSBhcmUgbG9va2luZyBmb3IgdHdvIHNlcGFyYXRlIHBvc3NpYmlsaXRpZXMgKGpsL2xkMjQpLiAgKi8KLQotCSAgLyogRG8gbm90aGluZyBpZiBubyByb29tIGluIHRoZSBzZWN0aW9uIGZvciB0aGlzIHRvIGJlIHdoYXQgd2UncmUKLQkgICAgIGxvb2tpbmcgZm9yLiAgKi8KLQkgIGlmIChpcmVsLT5yX29mZnNldCA+IHNlYy0+X2Nvb2tlZF9zaXplIC0gOCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGUgbmV4dCByZWxvY2F0aW9uIGFwcGxpZXMgdG8gdGhlIG5leHQKLQkgICAgIGluc3RydWN0aW9uIGFuZCB0aGF0IGl0J3MgdGhlIGFkZDMncyByZWxvYy4gICovCi0JICBucmVsID0gaXJlbCArIDE7Ci0JICBpZiAobnJlbCA9PSBpcmVsZW5kCi0JICAgICAgfHwgaXJlbC0+cl9vZmZzZXQgKyA0ICE9IG5yZWwtPnJfb2Zmc2V0Ci0JICAgICAgfHwgRUxGMzJfUl9UWVBFIChucmVsLT5yX2luZm8pICE9IChpbnQpIFJfTTMyUl9MTzE2KQotCSAgICBjb250aW51ZTsKLQotCSAgLyogU2VlIGlmIHRoZSBpbnN0cnVjdGlvbnMgYXJlIHNldGgvYWRkMy4gICovCi0JICAvKiBGSVhNRTogVGhpcyBpcyB3aGVyZSBtYWNyb3MgZnJvbSBjZ2VuIGNhbiBjb21lIGluLiAgKi8KLQkgIGNvZGUgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMCk7Ci0JICBpZiAoKGNvZGUgJiAweGYwZmYpICE9IDB4ZDBjMCkKLQkgICAgY29udGludWU7IC8qIG5vdCBzZXRoIHJOLGZvbyAqLwotCSAgcmVnID0gKGNvZGUgJiAweDBmMDApID4+IDg7Ci0JICBjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDQpOwotCSAgaWYgKGNvZGUgIT0gKDB4ODBhMCB8IHJlZyB8IChyZWcgPDwgOCkpKQotCSAgICBjb250aW51ZTsgLyogbm90IGFkZDMgck4sck4sZm9vICovCi0KLQkgIC8qIEF0IHRoaXMgcG9pbnQgd2UndmUgY29uZmlybWVkIHdlIGhhdmUgc2V0aC9hZGQzLiAgTm93IGNoZWNrCi0JICAgICB3aGV0aGVyIHRoZSBuZXh0IGluc24gaXMgYSBqbCwgaW4gd2hpY2ggY2FzZSB0cnkgdG8gY2hhbmdlIHRoaXMKLQkgICAgIHRvIGJsMjQgb3IgYmw4LiAgKi8KLQotCSAgLyogRW5zdXJlIHRoZSBicmFuY2ggdGFyZ2V0IGlzIGluIHJhbmdlLgotCSAgICAgVGhlIGJsMjQgaW5zdHJ1Y3Rpb24gaGFzIGEgMjQgYml0IG9wZXJhbmQgd2hpY2ggaXMgdGhlIHRhcmdldAotCSAgICAgYWRkcmVzcyByaWdodCBzaGlmdGVkIGJ5IDIsIGdpdmluZyBhIHNpZ25lZCByYW5nZSBvZiAyNiBiaXRzLgotCSAgICAgTm90ZSB0aGF0IDQgYnl0ZXMgYXJlIGFkZGVkIHRvIHRoZSBoaWdoIHZhbHVlIGJlY2F1c2UgdGhlIHRhcmdldAotCSAgICAgd2lsbCBiZSBhdCBsZWFzdCA0IGJ5dGVzIGNsb3NlciBpZiB3ZSBjYW4gcmVsYXguICBJdCdsbCBhY3R1YWxseQotCSAgICAgYmUgNCBvciA4IGJ5dGVzIGNsb3NlciwgYnV0IHdlIGRvbid0IGtub3cgd2hpY2gganVzdCB5ZXQgYW5kCi0JICAgICB0aGUgZGlmZmVyZW5jZSBpc24ndCBzaWduaWZpY2FudCBlbm91Z2ggdG8gd29ycnkgYWJvdXQuICAqLwotI2lmbmRlZiBVU0VfUkVMIC8qIHB1dCBpbiBmb3IgbGVhcm5pbmcgcHVycG9zZXMgKi8KLQkgIHBjcmVsX3ZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotI2Vsc2UKLQkgIGFkZGVuZCA9IGJmZF9nZXRfc2lnbmVkXzE2IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMik7Ci0JICBwY3JlbF92YWx1ZSArPSBhZGRlbmQ7Ci0jZW5kaWYKLQotCSAgaWYgKHBjcmVsX3ZhbHVlID49IC0oMSA8PCAyNSkgJiYgcGNyZWxfdmFsdWUgPCAoMSA8PCAyNSkgKyA0Ci0JICAgICAgLyogRG8gbm90aGluZyBpZiBubyByb29tIGluIHRoZSBzZWN0aW9uIGZvciB0aGlzIHRvIGJlIHdoYXQgd2UncmUKLQkJIGxvb2tpbmcgZm9yLiAgKi8KLQkgICAgICAmJiAoaXJlbC0+cl9vZmZzZXQgPD0gc2VjLT5fY29va2VkX3NpemUgLSAxMikKLQkgICAgICAvKiBFbnN1cmUgdGhlIG5leHQgaW5zbiBpcyAiamwgck4iLiAgKi8KLQkgICAgICAmJiAoKGNvZGUgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgOCkpLAotCQkgIGNvZGUgIT0gKDB4MWVjMCB8IHJlZykpKQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuIHJlbGF4IHRvIGJsMjQvYmw4LiAgKi8KLQotCSAgICAgIC8qIFNlZSBpZiB0aGVyZSdzIGEgbm9wIGZvbGxvd2luZyB0aGUgamwuCi0JCSBBbHNvIHNlZSBpZiB3ZSBjYW4gdXNlIGEgYmw4IGluc24uICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMTApOwotCSAgICAgIG5vcF9wID0gKGNvZGUgJiAweDdmZmYpID09IE5PUF9JTlNOOwotCSAgICAgIGJsOF9wID0gcGNyZWxfdmFsdWUgPj0gLTB4MjAwICYmIHBjcmVsX3ZhbHVlIDwgMHgyMDA7Ci0KLQkgICAgICBpZiAoYmw4X3ApCi0JCXsKLQkJICAvKiBDaGFuZ2UgInNldGggck4sZm9vIiB0byAiYmw4IGZvbyB8fCBub3AiLgotCQkgICAgIFdlIE9SIGluIENPREUganVzdCBpbiBjYXNlIGl0J3Mgbm90IGEgbm9wICh0ZWNobmljYWxseSwKLQkJICAgICBDT0RFIGN1cnJlbnRseSBtdXN0IGJlIGEgbm9wLCBidXQgZm9yIGNsZWFubmVzcyB3ZQotCQkgICAgIGFsbG93IGl0IHRvIGJlIGFueXRoaW5nKS4gICovCi0jaWZuZGVmIFVTRV9SRUwgLyogcHV0IGluIGZvciBsZWFybmluZyBwdXJwb3NlcyAqLwotCQkgIGNvZGUgPSAweDdlMDAwMDAwIHwgTUFLRV9QQVJBTExFTCAoY29kZSk7Ci0jZWxzZQotCQkgIGNvZGUgPSAoMHg3ZTAwMDAwMCArICgoKGFkZGVuZCA+PiAyKSAmIDB4ZmYpIDw8IDE2KSkgfCBNQUtFX1BBUkFMTEVMIChjb2RlKTsKLSNlbmRpZgotCQkgIHRvX2RlbGV0ZSA9IDg7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBDaGFuZ2UgdGhlIHNldGggck4sZm9vIHRvIGEgYmwyNCBmb28uICAqLwotI2lmbmRlZiBVU0VfUkVMIC8qIHB1dCBpbiBmb3IgbGVhcm5pbmcgcHVycG9zZXMgKi8KLQkJICBjb2RlID0gMHhmZTAwMDAwMDsKLSNlbHNlCi0JCSAgY29kZSA9IDB4ZmUwMDAwMDAgKyAoKGFkZGVuZCA+PiAyKSAmIDB4ZmZmZmZmKTsKLSNlbmRpZgotCQkgIHRvX2RlbGV0ZSA9IG5vcF9wID8gOCA6IDQ7Ci0JCX0KLQotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCi0JICAgICAgLyogU2V0IHRoZSBuZXcgcmVsb2MgdHlwZS4gICovCi0JICAgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAobnJlbC0+cl9pbmZvKSwKLQkJCQkJICAgYmw4X3AgPyBSX00zMlJfMTBfUENSRUwgOiBSX00zMlJfMjZfUENSRUwpOwotCi0JICAgICAgLyogRGVsZXRlIHRoZSBhZGQzIHJlbG9jIGJ5IG1ha2luZyBpdCBhIG51bGwgcmVsb2MuICAqLwotCSAgICAgIG5yZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKG5yZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTTMyUl9OT05FKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoYWRkZW5kID49IDAKLQkJICAgJiYgc3ltdmFsICsgYWRkZW5kIDw9IDB4ZmZmZmZmKQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuIHJlbGF4IHRvIGxkMjQuICAqLwotCi0JICAgICAgY29kZSA9IDB4ZTAwMDAwMDAgfCAocmVnIDw8IDI0KSB8IChhZGRlbmQgJiAweGZmZmZmZik7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0JICAgICAgdG9fZGVsZXRlID0gNDsKLQkgICAgICAvKiBUZWxsIHRoZSBmb2xsb3dpbmcgY29kZSBhIG5vcCBmaWxsZXIgaXNuJ3QgbmVlZGVkLiAgKi8KLQkgICAgICBub3BfcCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIENhbid0IGRvIGFueXRoaW5nIGhlcmUuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgIC8qIERlbGV0ZSBUT19ERUxFVEUgYnl0ZXMgb2YgZGF0YS4gICovCi0JICBpZiAoIW0zMnJfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkgICAgaXJlbC0+cl9vZmZzZXQgKyA0LCB0b19kZWxldGUpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogTm93IHRoYXQgdGhlIGZvbGxvd2luZyBieXRlcyBoYXZlIGJlZW4gbW92ZWQgaW50byBwbGFjZSwgc2VlIGlmCi0JICAgICB3ZSBuZWVkIHRvIHJlcGxhY2UgdGhlIGpsIHdpdGggYSBub3AuICBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBoYWQKLQkgICAgIHRvIHVzZSBhIGJsMjQgaW5zbiBhbmQgdGhlIGluc24gZm9sbG93aW5nIHRoZSBqbCBpc24ndCBhIG5vcC4KLQkgICAgIFRlY2huaWNhbGx5LCB0aGlzIHNpdHVhdGlvbiBjYW4ndCBoYXBwZW4gKHNpbmNlIHRoZSBpbnNuIGNhbgotCSAgICAgbmV2ZXIgYmUgZXhlY3V0ZWQpIGJ1dCB0byBiZSBjbGVhbiB3ZSBkbyB0aGlzLiAgV2hlbiB0aGUgY2hpcAotCSAgICAgc3VwcG9ydHMgcGFyYWxsZWwgMTYgYml0IGluc25zIHRoaW5ncyBtYXkgY2hhbmdlLgotCSAgICAgV2UgZG9uJ3QgbmVlZCB0byBkbyB0aGlzIGluIHRoZSBjYXNlIG9mIHJlbGF4aW5nIHRvIGxkMjQsCi0JICAgICBhbmQgdGhlIGFib3ZlIGNvZGUgc2V0cyBub3BfcCBzbyB0aGlzIGlzbid0IGRvbmUuICAqLwotCSAgaWYgKCEgbm9wX3AgJiYgdG9fZGVsZXRlID09IDQpCi0JICAgIGJmZF9wdXRfMTYgKGFiZmQsIE5PUF9JTlNOLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgNCk7Ci0KLQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbyB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JICAqYWdhaW4gPSB0cnVlOwotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIGxvb3AgdG8gdHJ5IHRoZSBuZXh0IHJlbG9jICovCi0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQl9Ci0gICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQl9Ci0gICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWRkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXM7Ci0gIGludCBzaG5keCwgaW5kZXg7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFsaWduOwotICBiZmRfdm1hIHRvYWRkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0KLSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLSAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQotICAvKiBUaGUgZGVsZXRpb24gbXVzdCBzdG9wIGF0IHRoZSBuZXh0IEFMSUdOIHJlbG9jIGZvciBhbiBhbGlnbWVudAotICAgICBwb3dlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGFyZSBkZWxldGluZy4gICovCi0KLSAgaXJlbGFsaWduID0gTlVMTDsKLSAgdG9hZGRyID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsKLSAgaXJlbGVuZCA9IGlyZWwgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLwotICBtZW1tb3ZlIChjb250ZW50cyArIGFkZHIsIGNvbnRlbnRzICsgYWRkciArIGNvdW50LCB0b2FkZHIgLSBhZGRyIC0gY291bnQpOwotICBzZWMtPl9jb29rZWRfc2l6ZSAtPSBjb3VudDsKLQotICAvKiBBZGp1c3QgYWxsIHRoZSByZWxvY3MuICAqLwotICBmb3IgKGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgLyogR2V0IHRoZSBuZXcgcmVsb2MgYWRkcmVzcy4gICovCi0gICAgICBpZiAoKGlyZWwtPnJfb2Zmc2V0ID4gYWRkcgotCSAgICYmIGlyZWwtPnJfb2Zmc2V0IDwgdG9hZGRyKSkKLQlpcmVsLT5yX29mZnNldCAtPSBjb3VudDsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IHRoZSBsb2NhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmIGlzeW0uc3RfdmFsdWUgPiBhZGRyCi0JICAmJiBpc3ltLnN0X3ZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIGlzeW0uc3RfdmFsdWUgLT0gY291bnQ7Ci0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmaXN5bSwgZXN5bSk7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYWRqdXN0IHRoZSBnbG9iYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSk7Ci0gIGZvciAoaW5kZXggPSAwOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpbmRleCsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0gICAgICBzeW1faGFzaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmRleF07Ci0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgKChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCAoc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA+IGFkZHIKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpCi0JewotCSAgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSAtPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgIHdoaWNoIHVzZXMgbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1tMzJyX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJIGRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgbWVtY3B5IChkYXRhLCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICppc3ltcDsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCi0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQlleHRlcm5hbF9zeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBleHRlcm5hbF9zeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKTsKLQkgIGlmIChleHRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKLQkJCSAgICBzeW10YWJfaGRyLT5zaF9pbmZvLCBpbnB1dF9iZmQpCi0JCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCSAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOwotICAgICAgc2VjcHAgPSBzZWN0aW9uczsKLSAgICAgIGVzeW0gPSBleHRlcm5hbF9zeW1zOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyArK2VzeW0sICsraXN5bXAsICsrc2VjcHApCi0JewotCSAgYXNlY3Rpb24gKmlzZWM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA+IDAgJiYgaXN5bXAtPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgaXNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX00zMlJfU0NPTU1PTikKLQkgICAgaXNlYyA9ICZtMzJyX2VsZl9zY29tX3NlY3Rpb247Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXaG8ga25vd3M/ICAqLwotCSAgICAgIGlzZWMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpzZWNwcCA9IGlzZWM7Ci0JfQotCi0gICAgICBpZiAoISBtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSAgICAgICBpbnRlcm5hbF9zeW1zLCBzZWN0aW9ucykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotCWZyZWUgKHNlY3Rpb25zKTsKLSAgICAgIHNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0JZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBpbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLQlmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgICAgIGV4dGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotCWZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gZGF0YTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBOVUxMCi0gICAgICAmJiBpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNlbmRpZiAvKiAjaWYgMCAqLwotDAotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlci4gICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX00zMlJfQVJDSCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIEVfTTMyUl9BUkNIOiAgICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9tMzJyLCBiZmRfbWFjaF9tMzJyKTsgIGJyZWFrOwotICAgIGNhc2UgRV9NMzJSWF9BUkNIOiAgKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX20zMnIsIGJmZF9tYWNoX20zMnJ4KTsgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RvcmUgdGhlIG1hY2hpbmUgbnVtYmVyIGluIHRoZSBmbGFncyBmaWVsZC4gICovCi1zdGF0aWMgdm9pZAotbTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKiAgIGFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9tYWNoX20zMnI6ICB2YWwgPSBFX00zMlJfQVJDSDsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tMzJyeDogdmFsID0gRV9NMzJSWF9BUkNIOyBicmVhazsKLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj1+IEVGX00zMlJfQVJDSDsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOwotfQotCi0vKiBGdW5jdGlvbiB0byBrZWVwIE0zMlIgc3BlY2lmaWMgZmlsZSBmbGFncy4gKi8KLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqICAgIGFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPT0gZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID0gZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIG9uZSBvYmplY3QgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi1tMzJyX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpCi0JICAgICAgfHwgKGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzCi0JCSAgPT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpKTsKLQotICBlbGZfZ3AgKG9iZmQpID0gZWxmX2dwIChpYmZkKTsKLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICogaWJmZDsKLSAgICAgYmZkICogb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb3V0X2ZsYWdzOwotICBmbGFnd29yZCBpbl9mbGFnczsKLQotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5fZmxhZ3MgID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG91dF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghIGVsZl9mbGFnc19pbml0IChvYmZkKSkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgaW5wdXQgaXMgdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIHRoZW4gZG8gbm90Ci0JIGJvdGhlciBzZXR0aW5nIHRoZSBmbGFncyBmb3IgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUsCi0JIGluc3RlYWQgYWxsb3cgZnV0dXJlIG1lcmdlcyB0byBkbyB0aGlzLiAgSWYgbm8gZnV0dXJlCi0JIG1lcmdlcyBldmVyIHNldCB0aGVzZSBmbGFncyB0aGVuIHRoZXkgd2lsbCByZXRhaW4gdGhlaXIKLQkgdW5pdGlhbGlzZWQgdmFsdWVzLCB3aGljaCBzdXJwcmlzZSBzdXJwcmlzZSwgY29ycmVzcG9uZAotCSB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuICAqLwotICAgICAgaWYgKGJmZF9nZXRfYXJjaF9pbmZvIChpYmZkKS0+dGhlX2RlZmF1bHQpCi0JcmV0dXJuIHRydWU7Ci0gICAgICAKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotCi0gICAgICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0JICAmJiBiZmRfZ2V0X2FyY2hfaW5mbyAob2JmZCktPnRoZV9kZWZhdWx0KQotCXsKLQkgIHJldHVybiBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZmxhZyBjb21wYXRpYmlsaXR5LiAgKi8KLSAgaWYgKGluX2ZsYWdzID09IG91dF9mbGFncykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGluX2ZsYWdzICYgRUZfTTMyUl9BUkNIKSAhPSAob3V0X2ZsYWdzICYgRUZfTTMyUl9BUkNIKSkKLSAgICB7Ci0gICAgICBpZiAoKGluX2ZsYWdzICYgRUZfTTMyUl9BUkNIKSAhPSBFX00zMlJfQVJDSCkKLQl7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBJbnN0cnVjdGlvbiBzZXQgbWlzbWF0Y2ggd2l0aCBwcmV2aW91cyBtb2R1bGVzIiksCi0JCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERpc3BsYXkgdGhlIGZsYWdzIGZpZWxkICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKiAgIGFiZmQ7Ci0gICAgIFBUUiAgICAgcHRyOwotewotICBGSUxFICogZmlsZSA9IChGSUxFICopIHB0cjsKLSAgCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCkKLSAgCi0gIF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cik7Ci0gIAotICBmcHJpbnRmIChmaWxlLCBfKCJwcml2YXRlIGZsYWdzID0gJWx4IiksIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKTsKLSAgCi0gIHN3aXRjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NMzJSX0FSQ0gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBFX00zMlJfQVJDSDogIGZwcmludGYgKGZpbGUsIF8oIjogbTMyciBpbnN0cnVjdGlvbnMiKSk7ICBicmVhazsKLSAgICBjYXNlIEVfTTMyUlhfQVJDSDogZnByaW50ZiAoZmlsZSwgXygiOiBtMzJyeCBpbnN0cnVjdGlvbnMiKSk7IGJyZWFrOwotICAgIH0KLSAgCi0gIGZwdXRjICgnXG4nLCBmaWxlKTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi1hc2VjdGlvbiAqCi1tMzJyX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICAgIGJmZCAqYWJmZDsKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfTTMyUl9HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX00zMlJfR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotIAotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIHdlIGRvbid0IHVzZSBnb3QgYW5kIHBsdCBlbnRyaWVzIGZvciBtMzJyICovCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotIAotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfTTMyUl9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9NMzJSX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotDAotCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tMzJyCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX00zMlIKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEgLyogRXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgTWl0c3ViaXNoaS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgYmZkX2VsZjMyX20zMnJfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLW0zMnIiCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCQkwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJCW0zMnJfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCV9iZmRfbTMycl9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCQlfYmZkX20zMnJfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkJbTMycl9lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JCW0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rICAgICAgICAgICAgICAgIG0zMnJfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rICAgICAgICAgICAgICAgbTMycl9lbGZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgICAgbTMycl9lbGZfY2hlY2tfcmVsb2NzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zICAgICAgICAgICAgIDEKLSNpZiAwIC8qIG5vdCB5ZXQgKi8KLS8qIHJlbGF4IHN1cHBvcnQgKi8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uCQltMzJyX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLQkJCQkJbTMycl9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkJCW0zMnJfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgCW0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgCW0zMnJfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgCW0zMnJfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJbTMycl9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCW0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQkJCQkJCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbTY4ay5jIGIvYmZkL2VsZjMyLW02OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3ZWM3YS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItbTY4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIwOSArMCwwIEBACi0vKiBNb3Rvcm9sYSA2OGsgc2VyaWVzIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvbTY4ay5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgcnR5cGVfdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbGZfbTY4a19saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICplbGZfbTY4a19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19jaGVja19yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGFzZWN0aW9uICplbGZfbTY4a19nY19tYXJrX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19nY19zd2VlcF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjMyX202OGtfc2V0X3ByaXZhdGVfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX202OGtfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX202OGtfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSB7Ci0gIEhPV1RPKFJfNjhLX05PTkUsICAgICAgIDAsIDAsIDAsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19OT05FIiwgICAgICBmYWxzZSwgMCwgMHgwMDAwMDAwMCxmYWxzZSksCi0gIEhPV1RPKFJfNjhLXzMyLCAgICAgICAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S18zMiIsICAgICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLXzE2LCAgICAgICAgIDAsIDEsMTYsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S18xNiIsICAgICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLXzgsICAgICAgICAgIDAsIDAsIDgsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S184IiwgICAgICAgICBmYWxzZSwgMCwgMHgwMDAwMDBmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX1BDMzIsICAgICAgIDAsIDIsMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QQzMyIiwgICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfUEMxNiwgICAgICAgMCwgMSwxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BDMTYiLCAgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSXzY4S19QQzgsICAgICAgICAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUEM4IiwgICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX0dPVDMyLCAgICAgIDAsIDIsMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1QzMiIsICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfR09UMTYsICAgICAgMCwgMSwxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0dPVDE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSXzY4S19HT1Q4LCAgICAgICAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UOCIsICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX0dPVDMyTywgICAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1QzMk8iLCAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX0dPVDE2TywgICAgIDAsIDEsMTYsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1QxNk8iLCAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX0dPVDhPLCAgICAgIDAsIDAsIDgsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1Q4TyIsICAgICBmYWxzZSwgMCwgMHgwMDAwMDBmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX1BMVDMyLCAgICAgIDAsIDIsMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQzMiIsICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfUExUMTYsICAgICAgMCwgMSwxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BMVDE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSXzY4S19QTFQ4LCAgICAgICAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUOCIsICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX1BMVDMyTywgICAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQzMk8iLCAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX1BMVDE2TywgICAgIDAsIDEsMTYsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQxNk8iLCAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX1BMVDhPLCAgICAgIDAsIDAsIDgsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQ4TyIsICAgICBmYWxzZSwgMCwgMHgwMDAwMDBmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX0NPUFksICAgICAgIDAsIDAsIDAsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19DT1BZIiwgICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX0dMT0JfREFULCAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HTE9CX0RBVCIsICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX0pNUF9TTE9ULCAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19KTVBfU0xPVCIsICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfNjhLX1JFTEFUSVZFLCAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19SRUxBVElWRSIsICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSXzY4S19HTlVfVlRJTkhFUklULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSXzY4S19HTlVfVlRJTkhFUklUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwKLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfNjhLX0dOVV9WVEVOVFJZLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl82OEtfR05VX1ZURU5UUlkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAotfTsKLQotc3RhdGljIHZvaWQKLXJ0eXBlX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgQkZEX0FTU0VSVCAoRUxGMzJfUl9UWVBFKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfNjhLX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmaG93dG9fdGFibGVbRUxGMzJfUl9UWVBFKGRzdC0+cl9pbmZvKV07Ci19Ci0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8gcnR5cGVfdG9faG93dG8KLQotc3RhdGljIGNvbnN0IHN0cnVjdAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3ZhbDsKLSAgaW50IGVsZl92YWw7Ci19IHJlbG9jX21hcFtdID0gewotICB7IEJGRF9SRUxPQ19OT05FLCBSXzY4S19OT05FIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSXzY4S18zMiB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl82OEtfMTYgfSwKLSAgeyBCRkRfUkVMT0NfOCwgUl82OEtfOCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl82OEtfUEMzMiB9LAotICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl82OEtfUEMxNiB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSXzY4S19QQzggfSwKLSAgeyBCRkRfUkVMT0NfMzJfR09UX1BDUkVMLCBSXzY4S19HT1QzMiB9LAotICB7IEJGRF9SRUxPQ18xNl9HT1RfUENSRUwsIFJfNjhLX0dPVDE2IH0sCi0gIHsgQkZEX1JFTE9DXzhfR09UX1BDUkVMLCBSXzY4S19HT1Q4IH0sCi0gIHsgQkZEX1JFTE9DXzMyX0dPVE9GRiwgUl82OEtfR09UMzJPIH0sCi0gIHsgQkZEX1JFTE9DXzE2X0dPVE9GRiwgUl82OEtfR09UMTZPIH0sCi0gIHsgQkZEX1JFTE9DXzhfR09UT0ZGLCBSXzY4S19HT1Q4TyB9LAotICB7IEJGRF9SRUxPQ18zMl9QTFRfUENSRUwsIFJfNjhLX1BMVDMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTCwgUl82OEtfUExUMTYgfSwKLSAgeyBCRkRfUkVMT0NfOF9QTFRfUENSRUwsIFJfNjhLX1BMVDggfSwKLSAgeyBCRkRfUkVMT0NfMzJfUExUT0ZGLCBSXzY4S19QTFQzMk8gfSwKLSAgeyBCRkRfUkVMT0NfMTZfUExUT0ZGLCBSXzY4S19QTFQxNk8gfSwKLSAgeyBCRkRfUkVMT0NfOF9QTFRPRkYsIFJfNjhLX1BMVDhPIH0sCi0gIHsgQkZEX1JFTE9DX05PTkUsIFJfNjhLX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfNjhLX0dMT0JfREFULCBSXzY4S19HTE9CX0RBVCB9LAotICB7IEJGRF9SRUxPQ182OEtfSk1QX1NMT1QsIFJfNjhLX0pNUF9TTE9UIH0sCi0gIHsgQkZEX1JFTE9DXzY4S19SRUxBVElWRSwgUl82OEtfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfQ1RPUiwgUl82OEtfMzIgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfNjhLX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSXzY4S19HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHJlbG9jX21hcCkgLyBzaXplb2YgKHJlbG9jX21hcFswXSk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocmVsb2NfbWFwW2ldLmJmZF92YWwgPT0gY29kZSkKLQlyZXR1cm4gJmhvd3RvX3RhYmxlW3JlbG9jX21hcFtpXS5lbGZfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgRUxGX0FSQ0ggYmZkX2FyY2hfbTY4awotLyogZW5kIGNvZGUgZ2VuZXJhdGVkIGJ5IGVsZi5lbCAqLwotCi0jZGVmaW5lIFVTRV9SRUxBCi0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgdGhlIG02OGsgRUxGIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9saWJjLnNvLjEiCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMjAKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9va3MgbGlrZSB0aGlzLiAgU2VlCi0gICB0aGUgU1ZSNCBBQkkgbTY4ayBzdXBwbGVtZW50IHRvIHNlZSBob3cgdGhpcyB3b3Jrcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfbTY4a19wbHQwX2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MmYsIDB4M2IsIDB4MDEsIDB4NzAsIC8qIG1vdmUubCAoJXBjLGFkZHIpLC0oJXNwKSAqLwotICAwLCAwLCAwLCAwLAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byAuZ290ICsgNC4gICovCi0gIDB4NGUsIDB4ZmIsIDB4MDEsIDB4NzEsIC8qIGptcCAoWyVwYyxhZGRyXSkgKi8KLSAgMCwgMCwgMCwgMCwJCSAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gLmdvdCArIDguICAqLwotICAwLCAwLCAwLCAwCQkgIC8qIHBhZCBvdXQgdG8gMjAgYnl0ZXMuICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX202OGtfcGx0X2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4NGUsIDB4ZmIsIDB4MDEsIDB4NzEsIC8qIGptcCAoWyVwYyxzeW1ib2xAR09UUENdKSAqLwotICAwLCAwLCAwLCAwLAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzeW1ib2wncyAuZ290IGVudHJ5LiAgKi8KLSAgMHgyZiwgMHgzYywJCSAgLyogbW92ZS5sICNvZmZzZXQsLSglc3ApICovCi0gIDAsIDAsIDAsIDAsCQkgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4NjAsIDB4ZmYsCQkgIC8qIGJyYS5sIC5wbHQgKi8KLSAgMCwgMCwgMCwgMAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLX07Ci0KLSNkZWZpbmUgQ1BVMzJfRkxBRyhhYmZkKSAgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQ1BVMzIpCi0KLSNkZWZpbmUgUExUX0NQVTMyX0VOVFJZX1NJWkUgMjQKLS8qIFByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJpZXMgZm9yIHRoZSBjcHUzMiAqLwotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9jcHUzMl9wbHQwX2VudHJ5W1BMVF9DUFUzMl9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MjIsIDB4N2IsIDB4MDEsIDB4NzAsIC8qIG1vdmVhbCAlcGNAKDB4YyksICVhMSAqLwotICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byAuZ290ICsgNC4gICovCi0gIDB4NGUsIDB4ZDEsICAgICAgICAgICAgIC8qIGptcCAlYTFAICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCBvZmZzZXQgdG8gLmdvdCArOC4gKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgLyogcGFkIG91dCB0byAyNCBieXRlcy4gICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIHBhZCBvdXQgdG8gMjQgYnl0ZXMuICAqLwotICAwLCAwCi19OwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2NwdTMyX3BsdF9lbnRyeVtQTFRfQ1BVMzJfRU5UUllfU0laRV0gPQotewotICAweDIyLCAweDdiLCAweDAxLCAweDcwLCAgLyogbW92ZWFsICVwY0AoMHhjKSwgJWExICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzeW1ib2wncyAuZ290IGVudHJ5LiAgKi8KLSAgMHg0ZSwgMHhkMSwgICAgICAgICAgICAgIC8qIGptcCAlYTFAICovCi0gIDB4MmYsIDB4M2MsICAgICAgICAgICAgICAvKiBtb3ZlLmwgI29mZnNldCwtKCVzcCkgKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4NjAsIDB4ZmYsICAgICAgICAgICAgICAvKiBicmEubCAucGx0ICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLSAgMCwgMAotfTsKLQotLyogVGhlIG02OGsgbGlua2VyIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWxvY3MgdGhhdCBpdAotICAgZGVjaWRlcyB0byBjb3B5IGluIGNoZWNrX3JlbG9jcyBmb3IgZWFjaCBzeW1ib2wuICBUaGlzIGlzIHNvIHRoYXQgaXQKLSAgIGNhbiBkaXNjYXJkIFBDIHJlbGF0aXZlIHJlbG9jcyBpZiBpdCBkb2Vzbid0IG5lZWQgdGhlbSB3aGVuIGxpbmtpbmcKLSAgIHdpdGggLUJzeW1ib2xpYy4gIFdlIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGZpZWxkIGV4dGVuZGluZyB0aGUKLSAgIHJlZ3VsYXIgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3Mgd2UgaGF2ZQotICAgY29waWVkIGZvciBhIGdpdmVuIHN5bWJvbC4gICovCi0KLXN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkCi17Ci0gIC8qIE5leHQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICpuZXh0OwotICAvKiBBIHNlY3Rpb24gaW4gZHlub2JqLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIC8qIE51bWJlciBvZiByZWxvY3MgY29waWVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci19OwotCi0vKiBtNjhrIEVMRiBsaW5rZXIgaGFzaCBlbnRyeS4gICovCi0KLXN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBOdW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgdGhpcyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqcGNyZWxfcmVsb2NzX2NvcGllZDsKLX07Ci0KLS8qIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogRGVjbGFyZSB0aGlzIG5vdyB0aGF0IHRoZSBhYm92ZSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfZGlzY2FyZF9jb3BpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogVHJhdmVyc2UgYW4gbTY4ayBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGZfbTY4a19oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlICopIChwKS0+aGFzaCkKLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGZfbTY4a19saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZXQtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBtNjhrIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGZfbTY4a19saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmX202OGtfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIEtlZXAgbTY4ay1zcGVjaWZpYyBmbGFncyBpbiB0aGUgRUxGIGhlYWRlciAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX202OGtfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBtNjhrLXNwZWNpZmljIGRhdGEgZnJvbSBvbmUgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tNjhrX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLSAKLSAgaW5fZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAKLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfbTY4a19tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb3V0X2ZsYWdzOwotICBmbGFnd29yZCBpbl9mbGFnczsKLQotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5fZmxhZ3MgID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG91dF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tNjhrX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgcHRyOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgcHRyOwotCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCk7Ci0KLSAgLyogUHJpbnQgbm9ybWFsIEVMRiBwcml2YXRlIGRhdGEuICAqLwotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotCi0gIC8qIElnbm9yZSBpbml0IGZsYWcgLSBpdCBtYXkgbm90IGJlIHNldCwgZGVzcGl0ZSB0aGUgZmxhZ3MgZmllbGQgY29udGFpbmluZyB2YWxpZCBkYXRhLiAgKi8KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfICgicHJpdmF0ZSBmbGFncyA9ICVseDoiKSwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0NQVTMyKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2NwdTMyXSIpKTsKLQotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNyZWxnb3QgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzY4S19HT1Q4OgotCWNhc2UgUl82OEtfR09UMTY6Ci0JY2FzZSBSXzY4S19HT1QzMjoKLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSXzY4S19HT1Q4TzoKLQljYXNlIFJfNjhLX0dPVDE2TzoKLQljYXNlIFJfNjhLX0dPVDMyTzoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCFfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJIChTRUNfQUxMT0MKLQkJCQkJCSAgfCBTRUNfTE9BRAotCQkJCQkJICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA9PSAtMSkKLQkJewotCQkgIGgtPmdvdC5yZWZjb3VudCA9IDE7Ci0KLQkJICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQkgICAgewotCQkgICAgICBpZiAoIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICAvKiBBbGxvY2F0ZSBzcGFjZSBpbiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkJICAvKiBBbGxvY2F0ZSByZWxvY2F0aW9uIHNwYWNlLiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJaC0+Z290LnJlZmNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF9zaWduZWRfdm1hKTsKLQkJICBsb2NhbF9nb3RfcmVmY291bnRzID0gKChiZmRfc2lnbmVkX3ZtYSAqKQotCQkJCQkgYmZkX2FsbG9jIChhYmZkLCBzaXplKSk7Ci0JCSAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCkgPSBsb2NhbF9nb3RfcmVmY291bnRzOwotCQkgIG1lbXNldCAobG9jYWxfZ290X3JlZmNvdW50cywgLTEsIHNpemUpOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID09IC0xKQotCQl7Ci0JCSAgbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPSAxOwotCi0JCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHsKLQkJICAgICAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0JCQkgb3V0cHV0IGEgUl82OEtfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUgZHluYW1pYwotCQkJIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICAgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCWxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdKys7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4OgotCWNhc2UgUl82OEtfUExUMTY6Ci0JY2FzZSBSXzY4S19QTFQzMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotCSAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2hpY2ggaXMKLSAgICAgICAgICAgICBuZXZlciByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgICAgICAgICBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkKLSAgICAgICAgICAgICBhZnRlciBhbGwuICAqLwotCi0JICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSByZXNvbHZlIGl0IGRpcmVjdGx5IHdpdGhvdXQKLQkgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCSAgICBoLT5wbHQucmVmY291bnQgPSAxOwotCSAgZWxzZQotCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4TzoKLQljYXNlIFJfNjhLX1BMVDE2TzoKLQljYXNlIFJfNjhLX1BMVDMyTzoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBoYXZlIHRoaXMgcmVsb2NhdGlvbiBmb3IgYQotCQkgbG9jYWwgc3ltYm9sLiAgRklYTUU6IGRvZXMgaXQ/ICBIb3cgdG8gaGFuZGxlIGl0IGlmCi0JCSBpdCBkb2VzIG1ha2Ugc2Vuc2U/ICAqLwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAoIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgaWYgKGgtPnBsdC5yZWZjb3VudCA9PSAtMSkKLQkgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkgIGVsc2UKLQkgICAgaC0+cGx0LnJlZmNvdW50Kys7Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUEM4OgotCWNhc2UgUl82OEtfUEMxNjoKLQljYXNlIFJfNjhLX1BDMzI6Ci0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSBhbmQgdGhpcyBpcyBub3QgYSBsb2NhbAotCSAgICAgc3ltYm9sLCB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbG9jIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgSG93ZXZlciB3aGVuIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljIGFuZCB0aGlzIGlzIGEgZ2xvYmFsCi0JICAgICBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlIGluY2x1ZGluZyBpbiB0aGUKLQkgICAgIGxpbmsgKGkuZS4sIERFRl9SRUdVTEFSIGlzIHNldCksIHRoZW4gd2UgY2FuIHJlc29sdmUgdGhlCi0JICAgICByZWxvYyBkaXJlY3RseS4gIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBub3Qgc2VlbiBhbGwgdGhlIGlucHV0Ci0JICAgICBmaWxlcywgc28gaXQgaXMgcG9zc2libGUgdGhhdCBERUZfUkVHVUxBUiBpcyBub3Qgc2V0IG5vdyBidXQKLQkgICAgIHdpbGwgYmUgc2V0IGxhdGVyIChpdCBpcyBuZXZlciBjbGVhcmVkKS4gIFdlIGFjY291bnQgZm9yIHRoYXQKLQkgICAgIHBvc3NpYmlsaXR5IGJlbG93IGJ5IHN0b3JpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi0JICAgICBwY3JlbF9yZWxvY3NfY29waWVkIGZpZWxkIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQkgIGlmICghKGluZm8tPnNoYXJlZAotCQkmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkmJiBoICE9IE5VTEwKLQkJJiYgKCFpbmZvLT5zeW1ib2xpYwotCQkgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKQotCSAgICB7Ci0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJewotCQkgIC8qIE1ha2Ugc3VyZSBhIHBsdCBlbnRyeSBpcyBjcmVhdGVkIGZvciB0aGlzIHN5bWJvbCBpZgotCQkgICAgIGl0IHR1cm5zIG91dCB0byBiZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBkeW5hbWljCi0JCSAgICAgb2JqZWN0LiAgKi8KLQkJICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCQkgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkJICBlbHNlCi0JCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl82OEtfODoKLQljYXNlIFJfNjhLXzE2OgotCWNhc2UgUl82OEtfMzI6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogTWFrZSBzdXJlIGEgcGx0IGVudHJ5IGlzIGNyZWF0ZWQgZm9yIHRoaXMgc3ltYm9sIGlmIGl0Ci0JCSB0dXJucyBvdXQgdG8gYmUgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLwotCSAgICAgIGlmIChoLT5wbHQucmVmY291bnQgPT0gLTEpCi0JCWgtPnBsdC5yZWZjb3VudCA9IDE7Ci0JICAgICAgZWxzZQotCQloLT5wbHQucmVmY291bnQrKzsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbmVlZCB0byBjb3B5IHRoZQotCSAgICAgcmVsb2MgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotCQkgcmVsb2MgdHlwZXMgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotCQkgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYy4gICovCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoYWJmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywKLQkJCQkJCSAgICAgKFNFQ19BTExPQwotCQkJCQkJICAgICAgfCBTRUNfTE9BRAotCQkJCQkJICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICAgICB8IFNFQ19SRUFET05MWSkpCi0JCQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIHdlIGNvdW50IHRoZSBudW1iZXIgb2YKLQkJIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdlIGhhdmUgZW50ZXJlZCBmb3IgdGhpcyBzeW1ib2wsCi0JCSBzbyB0aGF0IHdlIGNhbiBkaXNjYXJkIHRoZW0gYWdhaW4gaWYgdGhlIHN5bWJvbCBpcyBsYXRlcgotCQkgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMKLQkJIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSB1c2luZyBhbiBtNjhrZWxmIGxpbmtlciBoYXNoIHRhYmxlLAotCQkgd2hpY2ggbWVhbnMgdGhhdCBoIGlzIHJlYWxseSBhIHBvaW50ZXIgdG8gYW4KLQkJIGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeS4gICovCi0JICAgICAgaWYgKChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSBSXzY4S19QQzgKLSAJCSAgIHx8IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfNjhLX1BDMTYKLSAJCSAgIHx8IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfNjhLX1BDMzIpCi0JCSAgJiYgaW5mby0+c3ltYm9saWMpCi0JCXsKLQkJICBzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICplaDsKLQkJICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqcDsKLQotCQkgIGVoID0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgaDsKLQotCQkgIGZvciAocCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQkgICAgaWYgKHAtPnNlY3Rpb24gPT0gc3JlbG9jKQotCQkgICAgICBicmVhazsKLQotCQkgIGlmIChwID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHAgPSAoKHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICopCi0JCQkgICBiZmRfYWxsb2MgKGR5bm9iaiwgc2l6ZW9mICpwKSk7Ci0JCSAgICAgIGlmIChwID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIHAtPm5leHQgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsKLQkJICAgICAgZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBwOwotCQkgICAgICBwLT5zZWN0aW9uID0gc3JlbG9jOwotCQkgICAgICBwLT5jb3VudCA9IDA7Ci0JCSAgICB9Ci0KLQkJICArK3AtPmNvdW50OwotCQl9Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLQkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfNjhLX0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotCSAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSXzY4S19HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWVsZl9tNjhrX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfNjhLX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSXzY4S19HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBpZiAoZHlub2JqKQotICAgIHsKLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICB9Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzY4S19HT1Q4OgotCWNhc2UgUl82OEtfR09UMTY6Ci0JY2FzZSBSXzY4S19HT1QzMjoKLQljYXNlIFJfNjhLX0dPVDhPOgotCWNhc2UgUl82OEtfR09UMTZPOgotCWNhc2UgUl82OEtfR09UMzJPOgotCSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCSAgaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICAgIGlmIChoLT5nb3QucmVmY291bnQgPiAwKQotCQl7Ci0JCSAgLS1oLT5nb3QucmVmY291bnQ7Ci0JCSAgaWYgKGgtPmdvdC5yZWZjb3VudCA9PSAwKQotCQkgICAgewotCQkgICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSAuZ290IGVudHJ5IGFueSBtb3JlLiAgKi8KLQkJICAgICAgc2dvdC0+X3Jhd19zaXplIC09IDQ7Ci0JCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSAtPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA+IDApCi0JCXsKLQkJICAtLWxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdOwotCQkgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA9PSAwKQotCQkgICAgewotCQkgICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSAuZ290IGVudHJ5IGFueSBtb3JlLiAgKi8KLQkJICAgICAgc2dvdC0+X3Jhd19zaXplIC09IDQ7Ci0JCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCQlzcmVsZ290LT5fcmF3X3NpemUgLT0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUExUODoKLQljYXNlIFJfNjhLX1BMVDE2OgotCWNhc2UgUl82OEtfUExUMzI6Ci0JY2FzZSBSXzY4S19QTFQ4TzoKLQljYXNlIFJfNjhLX1BMVDE2TzoKLQljYXNlIFJfNjhLX1BMVDMyTzoKLQljYXNlIFJfNjhLX1BDODoKLQljYXNlIFJfNjhLX1BDMTY6Ci0JY2FzZSBSXzY4S19QQzMyOgotCWNhc2UgUl82OEtfODoKLQljYXNlIFJfNjhLXzE2OgotCWNhc2UgUl82OEtfMzI6Ci0JICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JICBpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgICAgaWYgKGgtPnBsdC5yZWZjb3VudCA+IDApCi0JCS0taC0+cGx0LnJlZmNvdW50OwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgcHV0IGl0IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFdlCi0gICAgIHdpbGwgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxhdGVyLAotICAgICB3aGVuIHdlIGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpID09IDAKLQkgIC8qIFdlIG11c3QgYWx3YXlzIGNyZWF0ZSB0aGUgcGx0IGVudHJ5IGlmIGl0IHdhcyByZWZlcmVuY2VkCi0JICAgICBieSBhIFBMVHh4TyByZWxvY2F0aW9uLiAgSW4gdGhpcyBjYXNlIHdlIGFscmVhZHkgcmVjb3JkZWQKLQkgICAgIGl0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgJiYgaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFBMVHh4IHJlbG9jIGluIGFuIGlucHV0Ci0JICAgICBmaWxlLCBidXQgdGhlIHN5bWJvbCB3YXMgbmV2ZXIgcmVmZXJyZWQgdG8gYnkgYSBkeW5hbWljCi0JICAgICBvYmplY3QuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZAotCSAgICAgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgUEN4eAotCSAgICAgcmVsb2MgaW5zdGVhZC4gICovCi0JICBCRkRfQVNTRVJUICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKTsKLQkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIEdDIG1heSBoYXZlIHJlbmRlcmVkIHRoaXMgZW50cnkgdW51c2VkLiAgKi8KLSAgICAgIGlmIChoLT5wbHQucmVmY291bnQgPD0gMCkKLQl7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IC5wbHQgZW50cnksIG1ha2Ugcm9vbSBmb3IgdGhlIHNwZWNpYWwKLQkgZmlyc3QgZW50cnkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXsKLQkgIGlmIChDUFUzMl9GTEFHIChkeW5vYmopKQotCSAgICBzLT5fcmF3X3NpemUgKz0gUExUX0NQVTMyX0VOVFJZX1NJWkU7Ci0JICBlbHNlCi0JICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0JIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotCSBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotCSBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotCSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKCFpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQl9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgICBpZiAoQ1BVMzJfRkxBRyAoZHlub2JqKSkKLSAgICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9DUFUzMl9FTlRSWV9TSVpFOwotICAgICAgZWxzZQotICAgICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAuZ290LnBsdCBzZWN0aW9uLCB3aGljaAotCSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgLmdvdCBzZWN0aW9uIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSA0OwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogUmVpbml0aWFsaXplIHRoZSBwbHQgb2Zmc2V0IG5vdyB0aGF0IGl0IGlzIG5vdCB1c2VkIGFzIGEgcmVmZXJlbmNlCi0gICAgIGNvdW50IGFueSBtb3JlLiAgKi8KLSAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSXzY4S19DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWxhLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gMykKLSAgICBwb3dlcl9vZl90d28gPSAzOwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0gIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLSAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcGx0OwotICBib29sZWFuIHJlbG9jczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCFpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsYS5nb3Qgc2VjdGlvbi4KLQkgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotCSBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsCi0JIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0IHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlCi0JIGJlbG93LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIHNoYXJlZCBsaW5rLCB0aGVuIHdlIG5lZWQgdG8gZGlzY2FyZCBhbGwgUEMKLSAgICAgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuICBXZQotICAgICBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIGNoZWNrX3JlbG9jcyByb3V0aW5lLCBidXQgd2Ugd2lsbCBub3QKLSAgICAgZmlsbCB0aGVtIGluIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotICBpZiAoaW5mby0+c2hhcmVkICYmIGluZm8tPnN5bWJvbGljKQotICAgIGVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX202OGtfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJIGVsZl9tNjhrX2Rpc2NhcmRfY29waWVzLAotCQkJCSAoUFRSKSBOVUxMKTsKLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHBsdCA9IGZhbHNlOwotICByZWxvY3MgPSBmYWxzZTsKLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbW9zdGx5IHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsYS5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVsb2Mgc2VjdGlvbnMgb3RoZXIKLSAgICAgICAgICAgICAgICAgdGhhbiAucmVsYS5wbHQuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsYS5wbHQiKSAhPSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQotCQkgIHJlbG9jcyA9IHRydWU7Ci0KLQkJICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSAgICAgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTAotCQkgICAgIGVudHJ5LiAgLnJlbGEucGx0IGlzIGFjdHVhbGx5IGFzc29jaWF0ZWQgd2l0aAotCQkgICAgIC5nb3QucGx0LCB3aGljaCBpcyBuZXZlciByZWFkb25seS4gICovCi0JCSAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkJICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JCSAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA1KTsKLQkJICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgICByZWx0ZXh0ID0gdHJ1ZTsKLQkJfQotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKHMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCFpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQotCSAgICAgIHx8ICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMQSkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsb2NzKQotCXsKLQkgIGlmICghYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBLCAwKQotCSAgICAgIHx8ICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBRU5ULAotCQkJCQkgICAgICAgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGZfbTY4a19saW5rX2hhc2hfdHJhdmVyc2UgaWYgd2UgYXJlCi0gICBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3Qgd2l0aCAtQnN5bWJvbGljLiAgSXQgZGlzY2FyZHMgdGhlIHNwYWNlCi0gICBhbGxvY2F0ZWQgdG8gY29weSBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkCi0gICBpbiByZWd1bGFyIG9iamVjdHMuICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIGNoZWNrX3JlbG9jcwotICAgcm91dGluZSwgYnV0IHdlIHdvbid0IGZpbGwgdGhlbSBpbiBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfZGlzY2FyZF9jb3BpZXMgKGgsIGlnbm9yZSkKLSAgICAgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqczsKLQotICAvKiBXZSBvbmx5IGRpc2NhcmQgcmVsb2NzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4gICovCi0gIGlmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKHMgPSBoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHMtPnNlY3Rpb24tPl9yYXdfc2l6ZSAtPSBzLT5jb3VudCAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIE02OEsgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNwbHQgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl82OEtfbWF4KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAoKChyX3R5cGUgPT0gUl82OEtfUExUOAotCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDE2Ci0JCSAgICB8fCByX3R5cGUgPT0gUl82OEtfUExUMzIKLQkJICAgIHx8IHJfdHlwZSA9PSBSXzY4S19QTFQ4TwotCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDE2TwotCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDMyTykKLQkJICAgJiYgaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEKLQkJICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0JCSAgfHwgKChyX3R5cGUgPT0gUl82OEtfR09UOE8KLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QxNk8KLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QzMk8KLQkJICAgICAgIHx8ICgocl90eXBlID09IFJfNjhLX0dPVDgKLQkJCSAgICB8fCByX3R5cGUgPT0gUl82OEtfR09UMTYKLQkJCSAgICB8fCByX3R5cGUgPT0gUl82OEtfR09UMzIpCi0JCQkgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICAgICAgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApKQotCQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgICAmJiAoISBpbmZvLT5zaGFyZWQKLQkJCSAgfHwgKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQkJICAgICAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSAgICAgICYmIChyX3R5cGUgPT0gUl82OEtfOAotCQkJICB8fCByX3R5cGUgPT0gUl82OEtfMTYKLQkJCSAgfHwgcl90eXBlID09IFJfNjhLXzMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSXzY4S19QQzgKLQkJCSAgfHwgcl90eXBlID09IFJfNjhLX1BDMTYKLQkJCSAgfHwgcl90eXBlID09IFJfNjhLX1BDMzIpKSkKLQkJewotCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uCi0JCSAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0JCSAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoIShpbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wKLQkJICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfNjhLX0dPVDg6Ci0JY2FzZSBSXzY4S19HT1QxNjoKLQljYXNlIFJfNjhLX0dPVDMyOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgYWRkcmVzcyBvZiB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sCi0JICAgICBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl82OEtfR09UOE86Ci0JY2FzZSBSXzY4S19HT1QxNk86Ci0JY2FzZSBSXzY4S19HT1QzMk86Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbgotCSAgICAgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotCi0JICB7Ci0JICAgIGJmZF92bWEgb2ZmOwotCi0JICAgIGlmIChzZ290ID09IE5VTEwpCi0JICAgICAgewotCQlzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkJQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGggIT0gTlVMTCkKLQkgICAgICB7Ci0JCW9mZiA9IGgtPmdvdC5vZmZzZXQ7Ci0JCUJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JCWlmICghZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICAgIHx8IChpbmZvLT5zaGFyZWQKLQkJCSYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkJJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCSAgewotCQkgICAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCi0JCSAgICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCQkgICAgICAgbG9jYWxseSwgb3IgdGhlIHN5bWJvbCB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsCi0JCSAgICAgICBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLi4gIFdlIG11c3QgaW5pdGlhbGl6ZQotCQkgICAgICAgdGhpcyBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNpbmNlCi0JCSAgICAgICB0aGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNCwgd2UKLQkJICAgICAgIHVzZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyCi0JCSAgICAgICB3ZSBoYXZlIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCi0KLQkJICAgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLmdvdAotCQkgICAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKLQkJICAgICAgIGlzIGRvbmUgaW4gdGhlIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAgKi8KLQkJICAgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJICAgICAgb2ZmICY9IH4xOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgICBzZ290LT5jb250ZW50cyArIG9mZik7Ci0JCQloLT5nb3Qub2Zmc2V0IHw9IDE7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMCi0JCQkgICAgJiYgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkJb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOwotCi0JCS8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LiAgV2UgdXNlCi0JCSAgIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQotCQkgICBhbHJlYWR5IGdlbmVyYXRlZCB0aGUgbmVjZXNzYXJ5IHJlbG9jLiAgKi8KLQkJaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgIG9mZiAmPSB+MTsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQotCQkgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgICAgewotCQkJYXNlY3Rpb24gKnNyZWxnb3Q7Ci0JCQlFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkJCXNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCQlCRkRfQVNTRVJUIChzcmVsZ290ICE9IE5VTEwpOwotCi0JCQlvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkJICAgKyBvZmYpOwotCQkJb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl82OEtfUkVMQVRJVkUpOwotCQkJb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbjsKLQkJCWJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCQkgICAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCi0JCQkJCQkgICAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkJICAgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKLQkJCSsrc3JlbGdvdC0+cmVsb2NfY291bnQ7Ci0JCSAgICAgIH0KLQotCQkgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZjsKLQkgICAgaWYgKHJfdHlwZSA9PSBSXzY4S19HT1Q4TwotCQl8fCByX3R5cGUgPT0gUl82OEtfR09UMTZPCi0JCXx8IHJfdHlwZSA9PSBSXzY4S19HT1QzMk8pCi0JICAgICAgewotCQkvKiBUaGlzIHJlbG9jYXRpb24gZG9lcyBub3QgdXNlIHRoZSBhZGRlbmQuICAqLwotCQlyZWwtPnJfYWRkZW5kID0gMDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICByZWxvY2F0aW9uICs9IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUExUODoKLQljYXNlIFJfNjhLX1BMVDE2OgotCWNhc2UgUl82OEtfUExUMzI6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0JICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLQkgIC8qIFJlc29sdmUgYSBQTFR4eCByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sIGRpcmVjdGx5LAotCSAgICAgd2l0aG91dCB1c2luZyB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMQotCSAgICAgIHx8ICFlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQkgICAgewotCSAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKLQkJIGhhcHBlbnMgd2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgUElDIGNvZGUsIG9yIHdoZW4KLQkJIHVzaW5nIC1Cc3ltYm9saWMuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChzcGx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIGgtPnBsdC5vZmZzZXQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfNjhLX1BMVDhPOgotCWNhc2UgUl82OEtfUExUMTZPOgotCWNhc2UgUl82OEtfUExUMzJPOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4KLQkgICAgIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwgJiYgaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICBpZiAoc3BsdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICByZWxvY2F0aW9uID0gaC0+cGx0Lm9mZnNldDsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRvZXMgbm90IHVzZSB0aGUgYWRkZW5kLiAgKi8KLQkgIHJlbC0+cl9hZGRlbmQgPSAwOwotCi0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUEM4OgotCWNhc2UgUl82OEtfUEMxNjoKLQljYXNlIFJfNjhLX1BDMzI6Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSXzY4S184OgotCWNhc2UgUl82OEtfMTY6Ci0JY2FzZSBSXzY4S18zMjoKLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkgICAgICAmJiAoKHJfdHlwZSAhPSBSXzY4S19QQzgKLQkJICAgJiYgcl90eXBlICE9IFJfNjhLX1BDMTYKLQkJICAgJiYgcl90eXBlICE9IFJfNjhLX1BDMzIpCi0JCSAgfHwgKCFpbmZvLT5zeW1ib2xpYwotCQkgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQkgICAgICBib29sZWFuIHNraXAsIHJlbG9jYXRlOwotCi0JICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKLQkJIGFyZSBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuCi0JCSB0aW1lLiAgKi8KLQotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGlucHV0X2JmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0JCX0KLQotCSAgICAgIHNraXAgPSBmYWxzZTsKLQotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JCW91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3ZtYSBvZmY7Ci0KLQkJICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCQkgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCi0JCQkgIHJlbC0+cl9vZmZzZXQpKTsKLQkJICBpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKLQkJICAgIHNraXAgPSB0cnVlOwotCQkgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkJfQotCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JICAgICAgaWYgKHNraXApCi0JCXsKLQkJICBtZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCQkgIHJlbG9jYXRlID0gZmFsc2U7Ci0JCX0KLQkgICAgICAvKiBoLT5keW5pbmR4IG1heSBiZSAtMSBpZiB0aGUgc3ltYm9sIHdhcyBtYXJrZWQgdG8KLSAgICAgICAgICAgICAgICAgYmVjb21lIGxvY2FsLiAgKi8KLQkgICAgICBlbHNlIGlmIChoICE9IE5VTEwKLQkJICAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0JCSAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCByX3R5cGUpOwotCQkgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJfdHlwZSA9PSBSXzY4S18zMikKLQkJICAgIHsKLQkJICAgICAgcmVsb2NhdGUgPSB0cnVlOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzY4S19SRUxBVElWRSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbG9uZyBpbmR4OwotCi0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQlzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJCSAgICAgIHx8IChoLT5yb290LnR5cGUKLQkJCQkJICA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQkJCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkJfQotCQkgICAgICBpZiAoc2VjICE9IE5VTEwgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQotCQkJaW5keCA9IDA7Ci0JCSAgICAgIGVsc2UgaWYgKHNlYyA9PSBOVUxMIHx8IHNlYy0+b3duZXIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBhc2VjdGlvbiAqb3NlYzsKLQotCQkJICBvc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQkJCSAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKG9zZWMpLT5keW5pbmR4OwotCQkJICBCRkRfQVNTRVJUIChpbmR4ID4gMCk7Ci0JCQl9Ci0KLQkJICAgICAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaW5keCwgcl90eXBlKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCi0JCQkJCSAgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJCSAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0JICAgICAgKytzcmVsb2MtPnJlbG9jX2NvdW50OwotCi0JICAgICAgLyogVGhpcyByZWxvYyB3aWxsIGJlIGNvbXB1dGVkIGF0IHJ1bnRpbWUsIHNvIHRoZXJlJ3Mgbm8KLSAgICAgICAgICAgICAgICAgbmVlZCB0byBkbyBhbnl0aGluZyBub3csIGV4Y2VwdCBmb3IgUl82OEtfMzIKLSAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbnMgdGhhdCBoYXZlIGJlZW4gdHVybmVkIGludG8KLSAgICAgICAgICAgICAgICAgUl82OEtfUkVMQVRJVkUuICAqLwotCSAgICAgIGlmICghcmVsb2NhdGUpCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19HTlVfVlRJTkhFUklUOgotCWNhc2UgUl82OEtfR05VX1ZURU5UUlk6Ci0JICAvKiBUaGVzZSBhcmUgbm8tb3BzIGluIHRoZSBlbmQuICAqLwotCSAgY29udGludWU7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkgICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJCSAgICBzeW0tPnN0X25hbWUpOwotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgaWYgKCpuYW1lID09ICdcMCcpCi0JCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JCSAgfQotCQlpZiAoIShpbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93Ci0JCSAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotICBpbnQgcGx0X29mZjEsIHBsdF9vZmYyLCBwbHRfb2ZmMzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIGJmZF92bWEgcGx0X2luZGV4OwotICAgICAgYmZkX3ZtYSBnb3Rfb2Zmc2V0OwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFNldAotCSBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgd2hpY2gKLQkgY29ycmVzcG9uZHMgdG8gdGhpcyBzeW1ib2wuICBUaGlzIGlzIHRoZSBpbmRleCBvZiB0aGlzIHN5bWJvbAotCSBpbiBhbGwgdGhlIHN5bWJvbHMgZm9yIHdoaWNoIHdlIGFyZSBtYWtpbmcgcGx0IGVudHJpZXMuICBUaGUKLQkgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGlzIHJlc2VydmVkLiAgKi8KLSAgICAgIGlmICggQ1BVMzJfRkxBRyAob3V0cHV0X2JmZCkpCi0gICAgICAgIHBsdF9pbmRleCA9IGgtPnBsdC5vZmZzZXQgLyBQTFRfQ1BVMzJfRU5UUllfU0laRSAtIDE7Ci0gICAgICBlbHNlCi0gICAgICAgIHBsdF9pbmRleCA9IGgtPnBsdC5vZmZzZXQgLyBQTFRfRU5UUllfU0laRSAtIDE7Ci0KLSAgICAgIC8qIEdldCB0aGUgb2Zmc2V0IGludG8gdGhlIC5nb3QgdGFibGUgb2YgdGhlIGVudHJ5IHRoYXQKLQkgY29ycmVzcG9uZHMgdG8gdGhpcyBmdW5jdGlvbi4gIEVhY2ggLmdvdCBlbnRyeSBpcyA0IGJ5dGVzLgotCSBUaGUgZmlyc3QgdGhyZWUgYXJlIHJlc2VydmVkLiAgKi8KLSAgICAgIGdvdF9vZmZzZXQgPSAocGx0X2luZGV4ICsgMykgKiA0OwotCi0gICAgICBpZiAoIENQVTMyX0ZMQUcgKG91dHB1dF9iZmQpKQotICAgICAgICB7Ci0gICAgICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwgZWxmX2NwdTMyX3BsdF9lbnRyeSwKLQkgICAgICAgICAgUExUX0NQVTMyX0VOVFJZX1NJWkUpOwotICAgICAgICAgIHBsdF9vZmYxID0gNDsKLSAgICAgICAgICBwbHRfb2ZmMiA9IDEyOwotICAgICAgICAgIHBsdF9vZmYzID0gMTg7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICAgICAgbWVtY3B5IChzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQsIGVsZl9tNjhrX3BsdF9lbnRyeSwKLQkgICAgICAgICAgUExUX0VOVFJZX1NJWkUpOwotICAgICAgICAgIHBsdF9vZmYxID0gNDsKLSAgICAgICAgICBwbHRfb2ZmMiA9IDEwOwotICAgICAgICAgIHBsdF9vZmYzID0gMTY7Ci0gICAgICAgIH0KLQotICAgICAgLyogVGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgZmlyc3QgZXh0ZW5zaW9uIHdvcmQuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBnb3Rfb2Zmc2V0Ci0JCSAgIC0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBoLT5wbHQub2Zmc2V0ICsgMikpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIHBsdF9vZmYxKTsKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcGx0X2luZGV4ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSwKLQkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyBwbHRfb2ZmMik7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAtIChoLT5wbHQub2Zmc2V0ICsgcGx0X29mZjMpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIHBsdF9vZmYzKTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBoLT5wbHQub2Zmc2V0Ci0JCSAgICsgOCksCi0JCSAgc2dvdC0+Y29udGVudHMgKyBnb3Rfb2Zmc2V0KTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGdvdF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfNjhLX0pNUF9TTE9UKTsKLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgcGx0X2luZGV4KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0JIHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBMaWtld2lzZSBpZgotCSB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4KLQkgVGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KLQkgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXsKLQkgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzY4S19SRUxBVElWRSk7Ci0JICByZWxhLnJfYWRkZW5kID0gYmZkX2dldF9zaWduZWRfMzIgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgKHNnb3QtPmNvbnRlbnRzCi0JCQkJCSAgICAgICsgKGgtPmdvdC5vZmZzZXQgJiB+MSkpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsCi0JCSAgICAgIHNnb3QtPmNvbnRlbnRzICsgKGgtPmdvdC5vZmZzZXQgJiB+MSkpOwotCSAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfNjhLX0dMT0JfREFUKTsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLQotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgc3JlbGEtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3NyZWxhLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMQotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzY4S19DT1BZKTsKLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzLT5jb250ZW50cwotCQkJCSAgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgLyogTWFyayBfRFlOQU1JQyBhbmQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzZHluOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYXNlY3Rpb24gKnM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUR09UOgotCSAgICAgIG5hbWUgPSAiLmdvdCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX0pNUFJFTDoKLQkgICAgICBuYW1lID0gIi5yZWxhLnBsdCI7Ci0JICAgIGdldF92bWE6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRSRUxTWjoKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsYS5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7Ci0JICAgICAgZWxzZQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUkVMQVNaOgotCSAgICAgIC8qIFRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSByZWxvY3MgKERUX0pNUFJFTCkgc2hvdWxkCi0JCSBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG92ZXJhbGwgcmVsb2NzIChEVF9SRUxBKS4KLQkJIFRoZXJlZm9yZSwgd2Ugb3ZlcnJpZGUgdGhlIERUX1JFTEFTWiBlbnRyeSBoZXJlIHRvCi0JCSBtYWtlIGl0IG5vdCBpbmNsdWRlIHRoZSBKTVBSRUwgcmVsb2NzLiAgU2luY2UgdGhlCi0JCSBsaW5rZXIgc2NyaXB0IGFycmFuZ2VzIGZvciAucmVsYS5wbHQgdG8gZm9sbG93IGFsbAotCQkgb3RoZXIgcmVsb2NhdGlvbiBzZWN0aW9ucywgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeQotCQkgYWJvdXQgY2hhbmdpbmcgdGhlIERUX1JFTEEgZW50cnkuICAqLwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWxhLnBsdCIpOwotCSAgICAgIGlmIChzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fY29va2VkX3NpemU7Ci0JCSAgZWxzZQotCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X3Jhd19zaXplOwotCQl9Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQotCXsKLSAgICAgICAgICBpZiAoIUNQVTMyX0ZMQUcgKG91dHB1dF9iZmQpKQotICAgICAgICAgICAgewotCSAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZl9tNjhrX3BsdDBfZW50cnksIFBMVF9FTlRSWV9TSVpFKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAgICAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA0Ci0JCSAgICAgICAgICAgLSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDIpKSwKLQkJICAgICAgICAgIHNwbHQtPmNvbnRlbnRzICsgNCk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgICAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgOAotCQkgICAgICAgICAgIC0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAxMCkpLAotCQkgICAgICAgICAgc3BsdC0+Y29udGVudHMgKyAxMik7Ci0gICAgICAgICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSAKLSAgICAgICAgICAgICAgID0gUExUX0VOVFJZX1NJWkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSAvKiBjcHUzMiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzLCBlbGZfY3B1MzJfcGx0MF9lbnRyeSwgUExUX0NQVTMyX0VOVFJZX1NJWkUpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDQKLQkJICAgICAgICAgICAtIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMikpLAotCQkgICAgICAgICAgc3BsdC0+Y29udGVudHMgKyA0KTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAgICAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA4Ci0JCSAgICAgICAgICAgLSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDEwKSksCi0JCSAgICAgICAgICBzcGx0LT5jb250ZW50cyArIDEwKTsKLSAgICAgICAgICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplIAotICAgICAgICAgICAgICAgPSBQTFRfQ1BVMzJfRU5UUllfU0laRTsKLSAgICAgICAgICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEZpbGwgaW4gdGhlIGZpcnN0IHRocmVlIGVudHJpZXMgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgc2dvdC0+Y29udGVudHMpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgNCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA4KTsKLSAgICB9Ci0KLSAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGYzMl9tNjhrX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmMzItbTY4ayIKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fNjhLCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MjAwMAotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0JCQkJCWVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCV9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJZWxmX202OGtfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgllbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawllbGZfbTY4a19nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawllbGZfbTY4a19nY19zd2VlcF9ob29rCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGYzMl9tNjhrX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZjMyX202OGtfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGYzMl9tNjhrX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxmMzJfbTY4a19wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0IDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5IDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltIDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tODhrLmMgYi9iZmQvZWxmMzItbTg4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGRlMjJhLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tODhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBNb3Rvcm9sYSA4OGstc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSByZWxvY2F0aW9ucywgYnV0IHNob3VsZCBiZSBnb29kIGVub3VnaAotICAgZm9yIEdEQi4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9tODhrX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1tODhrIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbTg4awotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNXzg4SwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgIAkxIC8qIEZJWE1FOiBUaGlzIG51bWJlciBpcyB3cm9uZywgIEl0IHNob3VsZCBiZSB0aGUgcGFnZSBzaXplIGluIGJ5dGVzLiAgKi8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJX2JmZF9lbGZfbm9faW5mb190b19ob3d0bwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbWNvcmUuYyBiL2JmZC9lbGYzMi1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YThiNzBhLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzY0ICswLDAgQEAKLS8qIE1vdG9yb2xhIE1Db3JlIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBhIHByZWxpbWluYXJ5IFJDRSBFTEYgQUJJLiAgVGhlCi0gICBpbmZvcm1hdGlvbiBtYXkgbm90IG1hdGNoIHRoZSBmaW5hbCBSQ0UgRUxGIEFCSS4gICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvbWNvcmUuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2RlZmluZQlVU0VfUkVMQQkvKiBPbmx5IFVTRV9SRUwgaXMgYWN0dWFsbHkgc2lnbmlmaWNhbnQsIGJ1dCB0aGlzIGlzCi0JCQkgICBoZXJlIGFyZSBhIHJlbWluZGVyLi4uICovCi0KLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9ob3d0b19pbml0Ci0gIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogbWNvcmVfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gbWNvcmVfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gbWNvcmVfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG1jb3JlX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtY29yZV9lbGZfdW5zdXBwb3J0ZWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbKGludCkgUl9NQ09SRV9tYXhdOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtY29yZV9lbGZfaG93dG9fcmF3W10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX01DT1JFX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX05PTkUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzdGFuZGFyZCAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01DT1JFX0FERFIzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJBRERSMzIiLAkJLyogbmFtZSAqLy8qIEZvciBjb21wYXRhYmlsaXR5IHdpdGggY29mZi9wZSBwb3J0LiAgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXRzICsgMiB6ZXJvIGJpdHM7IGptcGkvanNyaS9scncgaW5zdHJ1Y3Rpb25zLgotICAgICBTaG91bGQgbm90IGFwcGVhciBpbiBvYmplY3QgZmlsZXMuICovCi0gIEhPV1RPIChSX01DT1JFX1BDUkVMSU1NOEJZNCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9QQ1JFTElNTThCWTQiLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBic3IvYnQvYmYvYnIgaW5zdHJ1Y3Rpb25zOyAxMSBiaXRzICsgMSB6ZXJvIGJpdCAKLSAgICAgU3BhbiAyayBpbnN0cnVjdGlvbnMgPT0gNGsgYnl0ZXMuCi0gICAgIE9ubHkgdXNlZnVsIHBpZWNlcyBhdCB0aGUgcmVsb2NhdGVkIGFkZHJlc3MgYXJlIHRoZSBvcGNvZGUgKDUgYml0cykgKi8KLSAgSE9XVE8gKFJfTUNPUkVfUENSRUxJTU0xMUJZMiwvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUENSRUxJTU0xMUJZMiIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDQgYml0cyArIDEgemVybyBiaXQ7ICdsb29wdCcgaW5zdHJ1Y3Rpb24gb25seTsgdW5zdXBwb3J0ZWQuICovCi0gIEhPV1RPIChSX01DT1JFX1BDUkVMSU1NNEJZMiwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1BDUkVMSU1NNEJZMiIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyLWJpdCBwYy1yZWxhdGl2ZS4gRXZlbnR1YWxseSB0aGlzIHdpbGwgaGVscCBzdXBwb3J0IFBJQyBjb2RlLiAqLwotICBIT1dUTyAoUl9NQ09SRV9QQ1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9QQ1JFTDMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFBDUkVMSU1NMTFCWTIsIHRoaXMgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhCi0gICAgICdqc3JpJyBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuIFRoZXJlIGlzIGEgc2VwYXJhdGUgcmVsb2NhdGlvbgotICAgICBlbnRyeSBmb3IgdGhlIGxpdGVyYWwgcG9vbCBlbnRyeSB0aGF0IGl0IHJlZmVyZW5jZXMsIGJ1dCB3ZSAKLSAgICAgbWlnaHQgYmUgYWJsZSB0byBjaGFuZ2UgdGhlIGpzcmkgdG8gYSBic3IgaWYgdGhlIHRhcmdldCB0dXJucyBvdXQKLSAgICAgdG8gYmUgY2xvc2UgZW5vdWdoIFtldmVuIHRob3VnaCB3ZSB3b24ndCByZWNsYWltIHRoZSBsaXRlcmFsIHBvb2wKLSAgICAgZW50cnksIHdlJ2xsIGdldCBzb21lIHJ1bnRpbWUgZWZmaWNpZW5jeSBiYWNrXS4gTm90ZSB0aGF0IHRoaXMKLSAgICAgaXMgYSByZWxvY2F0aW9uIHRoYXQgd2UgYXJlIGFsbG93ZWQgdG8gc2FmZWx5IGlnbm9yZS4gICovIAotICBIT1dUTyAoUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMiwvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTIiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NQ09SRV9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9NQ09SRV9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfTUNPUkVfR05VX1ZURU5UUlksICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX01DT1JFX0dOVV9WVEVOVFJZIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBIT1dUTyAoUl9NQ09SRV9SRUxBVElWRSwgICAgICAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1JFTEFUSVZFIiwgICAgLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYSlbMF0pCi0jZW5kaWYKLQwKLS8qIEluaXRpYWxpemUgdGhlIG1jb3JlX2VsZl9ob3d0b190YWJsZSwgc28gdGhhdCBsaW5lYXIgYWNjZXNzZXMgY2FuIGJlIGRvbmUuICAqLwotc3RhdGljIHZvaWQKLW1jb3JlX2VsZl9ob3d0b19pbml0ICgpCi17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IE5VTV9FTEVNIChtY29yZV9lbGZfaG93dG9fcmF3KTsgaS0tOykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgICAgIAotICAgICAgdHlwZSA9IG1jb3JlX2VsZl9ob3d0b19yYXdbaV0udHlwZTsKLSAgICAgIAotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IE5VTV9FTEVNIChtY29yZV9lbGZfaG93dG9fdGFibGUpKTsKLSAgICAgIAotICAgICAgbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFt0eXBlXSA9ICYgbWNvcmVfZWxmX2hvd3RvX3JhdyBbaV07Ci0gICAgfQotfQotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1tY29yZV9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGVudW0gZWxmX21jb3JlX3JlbG9jX3R5cGUgbWNvcmVfcmVsb2MgPSBSX01DT1JFX05PTkU7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgkJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfTk9ORTsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6CQkJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfQUREUjMyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0OgkgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTElNTThCWTQ7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyOiAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX1BDUkVMSU1NMTFCWTI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTI6CSAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX1BDUkVMSU1NNEJZMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CQkgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTDMyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTI6IG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6ICAgICAgICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfR05VX1ZUSU5IRVJJVDsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOiAgICAgICAgICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfR05VX1ZURU5UUlk7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1JWQTogICAgICAgICAgICAgICAgICAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX1JFTEFUSVZFOyBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCEgbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFtSX01DT1JFX1BDUkVMSU1NOEJZNF0pCS8qIEluaXRpYWxpemUgaG93dG8gdGFibGUgaWYgbmVlZGVkICovCi0gICAgbWNvcmVfZWxmX2hvd3RvX2luaXQgKCk7Ci0KLSAgcmV0dXJuIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbKGludCkgbWNvcmVfcmVsb2NdOwotfTsKLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhIFJDRSBFTEYgcmVsb2MuICAqLwotc3RhdGljIHZvaWQKLW1jb3JlX2VsZl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICogYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICogY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICogZHN0OwotewotICBpZiAoISBtY29yZV9lbGZfaG93dG9fdGFibGUgW1JfTUNPUkVfUENSRUxJTU04Qlk0XSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KLSAgICBtY29yZV9lbGZfaG93dG9faW5pdCAoKTsKLQotICBCRkRfQVNTRVJUIChFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfTUNPUkVfbWF4KTsKLSAgCi0gIGNhY2hlX3B0ci0+aG93dG8gPSBtY29yZV9lbGZfaG93dG9fdGFibGUgW0VMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pXTsKLX0KLQotLyogRnVuY3Rpb24gdG8gc2V0IHdoZXRoZXIgYSBtb2R1bGUgbmVlZHMgdGhlIC1tcmVsb2NhdGFibGUgYml0IHNldC4gKi8KLXN0YXRpYyBib29sZWFuCi1tY29yZV9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKiBhYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoISBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlci4gICovCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICogaWJmZDsKLSAgICAgYmZkICogb2JmZDsKLXsKLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKCEgZWxmX2ZsYWdzX2luaXQgKG9iZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotc3RhdGljIGJvb2xlYW4KLW1jb3JlX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBmbGFnd29yZCBvbGRfZmxhZ3M7Ci0gIGZsYWd3b3JkIG5ld19mbGFnczsKLQotICAvKiBDaGVjayBpZiB3ZSBoYXZlIHRoZSBzYW1lIGVuZGlhbmVzcyAqLwotICBpZiAoICAgaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGNvbXBpbGVkIGZvciBhICVzIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyAlcyBlbmRpYW4uXG4iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAoaWJmZCkgPyAiYmlnIiA6ICJsaXR0bGUiLAotICAgICAgICAgYmZkX2JpZ19lbmRpYW4gKG9iZmQpID8gImJpZyIgOiAibGl0dGxlIik7Ci0KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmV3X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG9sZF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotICAKLSAgaWYgKCEgZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQkvKiBGaXJzdCBjYWxsLCBubyBmbGFncyBzZXQgKi8KLSAgICB7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0gICAgfQotICBlbHNlIGlmIChuZXdfZmxhZ3MgPT0gb2xkX2ZsYWdzKQkvKiBDb21wYXRpYmxlIGZsYWdzIGFyZSBvayAqLwotICAgIDsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBEb24ndCBwcmV0ZW5kIHdlIGNhbiBkZWFsIHdpdGggdW5zdXBwb3J0ZWQgcmVsb2NzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tY29yZV9lbGZfdW5zdXBwb3J0ZWRfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBhcmVsZW50ICogcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiBzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqIG91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKiBlcnJvcl9tZXNzYWdlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIEJGRF9BU1NFUlQgKHJlbG9jX2VudHJ5LT5ob3d0byAhPSAocmVsb2NfaG93dG9fdHlwZSAqKTApOwotICAKLSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogUmVsb2NhdGlvbiAlcyAoJWQpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIiksCi0JCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkgICAgICByZWxvY19lbnRyeS0+aG93dG8tPm5hbWUsCi0JCSAgICAgIHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZSk7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci19Ci0KLQwKLS8qIFRoZSBSRUxPQ0FURV9TRUNUSU9OIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3QgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCi0gICBuZWNlc3NhcnkuCi0KLSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYwotICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICBMT0NBTF9TWU1TIGlzIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbiBsb2NhbCBzeW1ib2xzLgotCi0gICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICBUaGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBnbG9iYWwgc3ltYm9scyBjYW4gYmUgZm91bmQKLSAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZSBvdXRwdXQgc3ltYm9sIGlzCi0gICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0Ci0gICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgYWNjb3JkaW5nbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqIG91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBiZmQgKiBpbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiBjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiByZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKiBsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkciA9ICYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbCA9IHJlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwKLQkgICAibWNvcmVfZWxmX3JlbG9jYXRlX3NlY3Rpb24gY2FsbGVkIGZvciAlcyBzZWN0aW9uICVzLCAlbGQgcmVsb2NhdGlvbnMlc1xuIiwKLQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCSAgIGJmZF9zZWN0aW9uX25hbWUoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKLQkgICAobG9uZykgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQsCi0JICAgKGluZm8tPnJlbG9jYXRlYWJsZSkgPyAiIChyZWxvY2F0YWJsZSkiIDogIiIpOwotI2VuZGlmCi0KLSAgaWYgKCEgbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFtSX01DT1JFX1BDUkVMSU1NOEJZNF0pCS8qIEluaXRpYWxpemUgaG93dG8gdGFibGUgaWYgbmVlZGVkICovCi0gICAgbWNvcmVfZWxmX2hvd3RvX2luaXQgKCk7Ci0KLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgZW51bSBlbGZfbWNvcmVfcmVsb2NfdHlwZSAgICByX3R5cGUgPSAoZW51bSBlbGZfbWNvcmVfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgIHIgPSBiZmRfcmVsb2Nfb3RoZXI7Ci0gICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgIHNlYyA9IChhc2VjdGlvbiAqKSAwOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBob3d0bzsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltID0gKEVsZl9JbnRlcm5hbF9TeW0gKikgMDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgMDsKLSAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgb2xkaW5zdDsKLSAgICAgIAotICAgICAgLyogVW5rbm93biByZWxvY2F0aW9uIGhhbmRsaW5nICovCi0gICAgICBpZiAoKHVuc2lnbmVkKSByX3R5cGUgPj0gKHVuc2lnbmVkKSBSX01DT1JFX21heAotCSAgfHwgISBtY29yZV9lbGZfaG93dG9fdGFibGUgWyhpbnQpcl90eXBlXSkKLQl7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBVbmtub3duIHJlbG9jYXRpb24gdHlwZSAlZFxuIiksCi0JCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJICAgICAgKGludCkgcl90eXBlKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIAotICAgICAgaG93dG8gPSBtY29yZV9lbGZfaG93dG9fdGFibGUgWyhpbnQpIHJfdHlwZV07Ci0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICAKLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgCi0JICAgICAgaWYgKCh1bnNpZ25lZClFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0jaWZkZWYgREVCVUcKLQkgIGZwcmludGYgKHN0ZGVyciwgIlx0dHlwZSA9ICVzICglZCksIHN5bWJvbCBpbmRleCA9ICVsZCwgb2Zmc2V0ID0gJWxkLCBhZGRlbmQgPSAlbGRcbiIsCi0JCSAgIGhvd3RvLT5uYW1lLCAoaW50KSByX3R5cGUsIHJfc3ltbmR4LCAobG9uZykgb2Zmc2V0LCAobG9uZykgYWRkZW5kKTsKLSNlbmRpZgotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0KLSAgICAgIC8qIENvbXBsYWluIGFib3V0IGtub3duIHJlbG9jYXRpb24gdGhhdCBhcmUgbm90IHlldCBzdXBwb3J0ZWQgKi8KLSAgICAgIGlmIChob3d0by0+c3BlY2lhbF9mdW5jdGlvbiA9PSBtY29yZV9lbGZfdW5zdXBwb3J0ZWRfcmVsb2MpCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogUmVsb2NhdGlvbiAlcyAoJWQpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIiksCi0JCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJICAgICAgaG93dG8tPm5hbWUsCi0JCQkgICAgICAoaW50KXJfdHlwZSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnMgW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXMgW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICBpZiAoICAgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkJKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJIAkgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICByZXQgPSBmYWxzZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQotCWNhc2UgUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMjoKLQkgIG9sZGluc3QgPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLSNkZWZpbmUJTUNPUkVfSU5TVF9CU1IJMHhGODAwCi0JICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIE1DT1JFX0lOU1RfQlNSLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBicmVhazsKLQl9Ci0KLQotI2lmZGVmIERFQlVHCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcdHR5cGUgPSAlcyAoJWQpLCBzeW1ib2wgaW5kZXggPSAlbGQsIG9mZnNldCA9ICVsZCwgYWRkZW5kID0gJWxkXG4iLAotCSAgICAgICBob3d0by0+bmFtZSwgcl90eXBlLCByX3N5bW5keCwgKGxvbmcpIG9mZnNldCwgKGxvbmcpIGFkZGVuZCk7Ci0jZW5kaWYKLQotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotCShob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCByZWxvY2F0aW9uLCBhZGRlbmQpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2sgJiYgcl90eXBlID09IFJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTIpCi0JewotCSAgLyogV2Fzbid0IG9rLCBiYWNrIGl0IG91dCBhbmQgZ2l2ZSB1cC4gICovCi0JICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIG9sZGluc3QsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgICAgCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgcmV0ID0gZmFsc2U7Ci0JICAKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqIG5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgICAgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICAKLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBpZiAoKiBuYW1lID09ICdcMCcpCi0JCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JCSAgfQotCi0JCSgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgIG9mZnNldCk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQotICByZXR1cm4gcmV0OwotfQotDAotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1jb3JlX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgIHJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfTUNPUkVfR05VX1ZUSU5IRVJJVDoKLQljYXNlIFJfTUNPUkVfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICAKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICBpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuCi0gICBTaW5jZSB3ZSBkb24ndCBkbyAuZ290cyBvciAucGx0cywgd2UganVzdCBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgdmlydHVhbCB0YWJsZSByZWxvY3MgZm9yIGdjLiAgKi8KLSAKLXN0YXRpYyBib29sZWFuCi1tY29yZV9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBhc2VjdGlvbiAqIHNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiByZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogICAgIHJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICAKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICAKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0gICAgICAgIGggPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBoID0gc3ltX2hhc2hlcyBbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9NQ09SRV9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotCSAgCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX01DT1JFX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9tY29yZV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLW1jb3JlLWJpZyIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgICAgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgICAgImVsZjMyLW1jb3JlLWxpdHRsZSIKLQotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbWNvcmUKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9NQ09SRQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAkJLyogNGssIGlmIHdlIGV2ZXIgaGF2ZSAnZW0gKi8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JbWNvcmVfZWxmX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCU5VTEwKLQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCW1jb3JlX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCW1jb3JlX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJCW1jb3JlX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCQltY29yZV9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJbWNvcmVfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCQltY29yZV9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJCW1jb3JlX2VsZl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICAgICBtY29yZV9lbGZfY2hlY2tfcmVsb2NzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCQkxCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1taXBzLmMgYi9iZmQvZWxmMzItbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGI5YzIzLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ODY3ICswLDAgQEAKLS8qIE1JUFMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgTW9zdCBvZiB0aGUgaW5mb3JtYXRpb24gYWRkZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsCi0gICA8aWFuQGN5Z251cy5jb20+LgotICAgTjMyLzY0IEFCSSBzdXBwb3J0IGFkZGVkIGJ5IE1hcmsgTWl0Y2hlbGwsIENvZGVTb3VyY2VyeSwgTExDLgotICAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaGFuZGxlcyBNSVBTIEVMRiB0YXJnZXRzLiAgU0dJIElyaXggNSB1c2VzIGEgc2xpZ2h0bHkKLSAgIGRpZmZlcmVudCBNSVBTIEVMRiBmcm9tIG90aGVyIHRhcmdldHMuICBUaGlzIG1hdHRlcnMgd2hlbiBsaW5raW5nLgotICAgVGhpcyBmaWxlIHN1cHBvcnRzIGJvdGgsIHN3aXRjaGluZyBhdCBydW50aW1lLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICAqLwotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAiY29mZi9taXBzLmgiCi0jZGVmaW5lIEVDT0ZGXzMyCi0jaW5jbHVkZSAiZWNvZmZzd2FwLmgiCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCAuZ290IGluZm9ybWF0aW9uIHdoZW4gbGlua2luZy4gIEl0Ci0gICBpcyBzdG9yZWQgaW4gdGhlIHRkYXRhIGZpZWxkIG9mIHRoZSBiZmRfZWxmX3NlY3Rpb25fZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgbWlwc19nb3RfaW5mbwotewotICAvKiBUaGUgZ2xvYmFsIHN5bWJvbCBpbiB0aGUgR09UIHdpdGggdGhlIGxvd2VzdCBpbmRleCBpbiB0aGUgZHluYW1pYwotICAgICBzeW1ib2wgdGFibGUuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqZ2xvYmFsX2dvdHN5bTsKLSAgLyogVGhlIG51bWJlciBvZiBnbG9iYWwgLmdvdCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgaW50IGdsb2JhbF9nb3RubzsKLSAgLyogVGhlIG51bWJlciBvZiBsb2NhbCAuZ290IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBpbnQgbG9jYWxfZ290bm87Ci0gIC8qIFRoZSBudW1iZXIgb2YgbG9jYWwgLmdvdCBlbnRyaWVzIHdlIGhhdmUgdXNlZC4gICovCi0gIHVuc2lnbmVkIGludCBhc3NpZ25lZF9nb3RubzsKLX07Ci0KLS8qIFRoZSBNSVBTIEVMRiBsaW5rZXIgbmVlZHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBzeW1ib2wgaW4KLSAgIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBFeHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBFWFRSIGVzeW07Ci0KLSAgLyogTnVtYmVyIG9mIFJfTUlQU18zMiwgUl9NSVBTX1JFTDMyLCBvciBSX01JUFNfNjQgcmVsb2NzIGFnYWluc3QKLSAgICAgdGhpcyBzeW1ib2wuICAqLyAKLSAgdW5zaWduZWQgaW50IHBvc3NpYmx5X2R5bmFtaWNfcmVsb2NzOwotCi0gIC8qIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZHluYW1pYyByZWxvY2F0aW9uIChpbiB0aGUgLnJlbC5keW4KLSAgICAgc2VjdGlvbikgYWdhaW5zdCB0aGlzIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGludCBtaW5fZHluX3JlbG9jX2luZGV4OwotCi0gIC8qIElmIHRoZXJlIGlzIGEgc3R1YiB0aGF0IDMyIGJpdCBmdW5jdGlvbnMgc2hvdWxkIHVzZSB0byBjYWxsIHRoaXMKLSAgICAgMTYgYml0IGZ1bmN0aW9uLCB0aGlzIHBvaW50cyB0byB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBzdHViLiAgKi8KLSAgYXNlY3Rpb24gKmZuX3N0dWI7Ci0KLSAgLyogV2hldGhlciB3ZSBuZWVkIHRoZSBmbl9zdHViOyB0aGlzIGlzIHNldCBpZiB0aGlzIHN5bWJvbCBhcHBlYXJzCi0gICAgIGluIGFueSByZWxvY3Mgb3RoZXIgdGhhbiBhIDE2IGJpdCBjYWxsLiAgKi8KLSAgYm9vbGVhbiBuZWVkX2ZuX3N0dWI7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSBzdHViIHRoYXQgMTYgYml0IGZ1bmN0aW9ucyBzaG91bGQgdXNlIHRvIGNhbGwgdGhpcwotICAgICAzMiBiaXQgZnVuY3Rpb24sIHRoaXMgcG9pbnRzIHRvIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHN0dWIuICAqLwotICBhc2VjdGlvbiAqY2FsbF9zdHViOwotCi0gIC8qIFRoaXMgaXMgbGlrZSB0aGUgY2FsbF9zdHViIGZpZWxkLCBidXQgaXQgaXMgdXNlZCBpZiB0aGUgZnVuY3Rpb24KLSAgICAgYmVpbmcgY2FsbGVkIHJldHVybnMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZS4gICovCi0gIGFzZWN0aW9uICpjYWxsX2ZwX3N0dWI7Ci19OwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHMzMl82NGJpdF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICptaXBzX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgbWlwc19pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19pbmZvX3RvX2hvd3RvX3JlbGEKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9ncHRhYiAqLCBFbGYzMl9ncHRhYiAqKSk7Ci1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfZ3B0YWIgKiwgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKikpOwotc3RhdGljIHZvaWQgYmZkX21pcHNfZWxmX3N3YXBfbXN5bV9pbiAKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX01zeW0gKiwgRWxmMzJfSW50ZXJuYWxfTXN5bSAqKSk7Ci1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGZfc3dhcF9tc3ltX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfSW50ZXJuYWxfTXN5bSAqLCBFbGYzMl9FeHRlcm5hbF9Nc3ltICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3N5bV9pc19nbG9iYWwgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZQotICBQQVJBTVMgKChQVFIsIGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLXN0YXRpYyBJTkxJTkUgaW50IGVsZl9taXBzX2lzYSBQQVJBTVMgKChmbGFnd29yZCkpOwotc3RhdGljIElOTElORSBpbnQgZWxmX21pcHNfbWFjaCBQQVJBTVMgKChmbGFnd29yZCkpOwotc3RhdGljIElOTElORSBjaGFyKiBlbGZfbWlwc19hYmlfbmFtZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICptaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBncHRhYl9jb21wYXJlIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHMxNl9qdW1wX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzMTZfZ3ByZWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jcmVhdGVfY29tcGFjdF9yZWxfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfZWxmX2ZpbmFsX2dwCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJvb2xlYW4sIGNoYXIgKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJmZF9ieXRlICplbGYzMl9taXBzX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl9jcmVhdGVfbXN5bV9zZWN0aW9uIAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGZfaXJpeDZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX3NpZ25fZXh0ZW5kIFBBUkFNUyAoKGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfb3ZlcmZsb3dfcCBQQVJBTVMgKChiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX2hpZ2ggUEFSQU1TICgoYmZkX3ZtYSkpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfaGlnaGVyIFBBUkFNUyAoKGJmZF92bWEpKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX2hpZ2hlc3QgUEFSQU1TICgoYmZkX3ZtYSkpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfZ2xvYmFsX2dvdF9pbmRleAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfbG9jYWxfZ290X2luZGV4Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYmZkX3ZtYSBtaXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXgKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9yZWNvcmRfZ2xvYmFsX2dvdF9zeW1ib2wgCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgc3RydWN0IG1pcHNfZ290X2luZm8gKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfZ290X3BhZ2UKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZF92bWEsIGJmZF92bWEgKikpOwotc3RhdGljIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICptaXBzX2VsZl9uZXh0X2xvMTZfcmVsb2NhdGlvbgotICBQQVJBTVMgKChjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfdm1hLCByZWxvY19ob3d0b190eXBlICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqLCBjb25zdCBjaGFyICoqLAotCSAgIGJvb2xlYW4gKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfb2J0YWluX2NvbnRlbnRzCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkICosIGJmZF9ieXRlICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbgotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCByZWxvY19ob3d0b190eXBlICosIAotCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF92bWEsCi0JICAgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2Fzc2lnbl9ncCBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9zb3J0X2hhc2hfdGFibGVfZiAKLSAgUEFSQU1TICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZSAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGFzZWN0aW9uICogbWlwc19lbGZfZ290X3NlY3Rpb24gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqbWlwc19lbGZfZ290X2luZm8gCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF92bWEgbWlwc19lbGZfY3JlYXRlX2xvY2FsX2dvdF9lbnRyeSAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBtaXBzX2dvdF9pbmZvICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyBiZmRfdm1hIG1pcHNfZWxmX2dvdDE2X2VudHJ5IAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfcmVsb2NhdGlvbiAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBhc2VjdGlvbiAqLAotCSAgIGJmZF92bWEsIGJmZF92bWEgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGZfYWxsb2NhdGVfZHluYW1pY19yZWxvY2F0aW9ucyAKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfc3R1Yl9zZWN0aW9uX3AgCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0KLS8qIFRoZSBsZXZlbCBvZiBJUklYIGNvbXBhdGliaWxpdHkgd2UncmUgc3RyaXZpbmcgZm9yLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgaWN0X25vbmUsCi0gIGljdF9pcml4NSwKLSAgaWN0X2lyaXg2Ci19IGlyaXhfY29tcGF0X3Q7Ci0KLS8qIE5vbnplcm8gaWYgQUJGRCBpcyB1c2luZyB0aGUgTjMyIEFCSS4gICovCi0KLSNkZWZpbmUgQUJJX04zMl9QKGFiZmQpIFwKLSAgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJMikgIT0gMCkKLQotLyogTm9uemVybyBpZiBBQkZEIGlzIHVzaW5nIHRoZSA2NC1iaXQgQUJJLiAgRklYTUU6IFRoaXMgaXMgbmV2ZXIKLSAgIHRydWUsIHlldC4gICovCi0jZGVmaW5lIEFCSV82NF9QKGFiZmQpIFwKLSAgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1M2NCkgIT0gMCkKLQotLyogV2hhdCB2ZXJzaW9uIG9mIElyaXggd2UgYXJlIHRyeWluZyB0byBiZSBjb21wYXRpYmxlIHdpdGguICBGSVhNRToKLSAgIEF0IHRoZSBtb21lbnQsIHdlIG5ldmVyIGdlbmVyYXRlICJub3JtYWwiIE1JUFMgRUxGIEFCSSBleGVjdXRhYmxlczsKLSAgIHdlIGFsd2F5cyB1c2Ugc29tZSB2ZXJzaW9uIG9mIElyaXguICAqLwotCi0jZGVmaW5lIElSSVhfQ09NUEFUKGFiZmQpIFwKLSAgKChBQklfTjMyX1AgKGFiZmQpIHx8IEFCSV82NF9QIChhYmZkKSkgPyBpY3RfaXJpeDYgOiBpY3RfaXJpeDUpCi0KLS8qIFdoZXRoZXIgd2UgYXJlIHRyeWluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggSVJJWCBhdCBhbGwuICAqLwotCi0jZGVmaW5lIFNHSV9DT01QQVQoYWJmZCkgXAotICAoSVJJWF9DT01QQVQgKGFiZmQpICE9IGljdF9ub25lKQotCi0vKiBUaGUgbmFtZSBvZiB0aGUgbXN5bSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUoYWJmZCkgIi5tc3ltIgotCi0vKiBUaGUgbmFtZSBvZiB0aGUgc3JkYXRhIHNlY3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0VMRl9TUkRBVEFfU0VDVElPTl9OQU1FKGFiZmQpICIuc3JkYXRhIgotCi0vKiBUaGUgbmFtZSBvZiB0aGUgb3B0aW9ucyBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUoYWJmZCkgXAotICAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NiA/ICIuTUlQUy5vcHRpb25zIiA6ICIub3B0aW9ucyIpCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBzdHViIHNlY3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRShhYmZkKSBcCi0gIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2ID8gIi5NSVBTLnN0dWJzIiA6ICIuc3R1YiIpCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gc2VjdGlvbi4gICovCi0jZGVmaW5lIE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FKGFiZmQpICIucmVsLmR5biIKLQotLyogVGhlIHNpemUgb2YgYW4gZXh0ZXJuYWwgUkVMIHJlbG9jYXRpb24uICAqLwotI2RlZmluZSBNSVBTX0VMRl9SRUxfU0laRShhYmZkKSBcCi0gIChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9yZWwpCi0KLS8qIFRoZSBzaXplIG9mIGFuIGV4dGVybmFsIGR5bmFtaWMgdGFibGUgZW50cnkuICAqLwotI2RlZmluZSBNSVBTX0VMRl9EWU5fU0laRShhYmZkKSBcCi0gIChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9keW4pCi0KLS8qIFRoZSBzaXplIG9mIGEgR09UIGVudHJ5LiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfR09UX1NJWkUoYWJmZCkgXAotICAoZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5hcmNoX3NpemUgLyA4KQotCi0vKiBUaGUgc2l6ZSBvZiBhIHN5bWJvbC10YWJsZSBlbnRyeS4gICovCi0jZGVmaW5lIE1JUFNfRUxGX1NZTV9TSVpFKGFiZmQpIFwKLSAgKGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX3N5bSkKLQotLyogVGhlIGRlZmF1bHQgYWxpZ25tZW50IGZvciBzZWN0aW9ucywgYXMgYSBwb3dlciBvZiB0d28uICAqLwotI2RlZmluZSBNSVBTX0VMRl9MT0dfRklMRV9BTElHTihhYmZkKQkJCQlcCi0gIChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPmZpbGVfYWxpZ24gPT0gOCA/IDMgOiAyKQotCi0vKiBHZXQgd29yZC1zaXplZCBkYXRhLiAgKi8KLSNkZWZpbmUgTUlQU19FTEZfR0VUX1dPUkQoYWJmZCwgcHRyKSBcCi0gIChBQklfNjRfUCAoYWJmZCkgPyBiZmRfZ2V0XzY0IChhYmZkLCBwdHIpIDogYmZkX2dldF8zMiAoYWJmZCwgcHRyKSkKLQotLyogUHV0IG91dCB3b3JkLXNpemVkIGRhdGEuICAqLwotI2RlZmluZSBNSVBTX0VMRl9QVVRfV09SRChhYmZkLCB2YWwsIHB0cikJXAotICAoQUJJXzY0X1AgKGFiZmQpIAkJCQlcCi0gICA/IGJmZF9wdXRfNjQgKGFiZmQsIHZhbCwgcHRyKSAJCVwKLSAgIDogYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCBwdHIpKQotCi0vKiBBZGQgYSBkeW5hbWljIHN5bWJvbCB0YWJsZS1lbnRyeS4gICovCi0jaWZkZWYgQkZENjQKLSNkZWZpbmUgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkoaW5mbywgdGFnLCB2YWwpIFwKLSAgKEFCSV82NF9QIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaikJICAgXAotICAgPyBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIHRhZywgdmFsKSAgXAotICAgOiBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIHRhZywgdmFsKSkKLSNlbHNlCi0jZGVmaW5lIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZKGluZm8sIHRhZywgdmFsKSBcCi0gIChBQklfNjRfUCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmopCSAgIFwKLSAgID8gKGFib3J0ICgpLCBmYWxzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIDogYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCB0YWcsIHZhbCkpCi0jZW5kaWYKLQotLyogVGhlIG51bWJlciBvZiBsb2NhbCAuZ290IGVudHJpZXMgd2UgcmVzZXJ2ZS4gICovCi0jZGVmaW5lIE1JUFNfUkVTRVJWRURfR09UTk8gKDIpCi0KLS8qIEluc3RydWN0aW9ucyB3aGljaCBhcHBlYXIgaW4gYSBzdHViLiAgRm9yIHNvbWUgcmVhc29uIHRoZSBzdHViIGlzCi0gICBzbGlnaHRseSBkaWZmZXJlbnQgb24gYW4gU0dJIHN5c3RlbS4gICovCi0jZGVmaW5lIEVMRl9NSVBTX0dQX09GRlNFVChhYmZkKSAoU0dJX0NPTVBBVCAoYWJmZCkgPyAweDdmZjAgOiAweDgwMDApCi0jZGVmaW5lIFNUVUJfTFcoYWJmZCkJCQkJCQlcCi0gIChTR0lfQ09NUEFUIChhYmZkKQkJCQkJCVwKLSAgID8gKEFCSV82NF9QIChhYmZkKSAgCQkJCQkJXAotICAgICAgPyAweGRmOTk4MDEwCQkvKiBsZCB0OSwweDgwMTAoZ3ApICovCQlcCi0gICAgICA6IDB4OGY5OTgwMTApICAgICAgICAgICAgIC8qIGx3IHQ5LDB4ODAxMChncCkgKi8JCVwKLSAgIDogMHg4Zjk5ODAwMCkJCS8qIGx3IHQ5LDB4ODAwMChncCkgKi8KLSNkZWZpbmUgU1RVQl9NT1ZFIDB4MDNlMDc4MjUJLyogbW92ZSB0NyxyYSAqLwotI2RlZmluZSBTVFVCX0pBTFIgMHgwMzIwZjgwOQkvKiBqYWwgdDkgKi8KLSNkZWZpbmUgU1RVQl9MSTE2IDB4MzQxODAwMDAJLyogb3JpIHQ4LHplcm8sMCAqLwotI2RlZmluZSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSAoMTYpCi0KLSNpZiAwCi0vKiBXZSBubyBsb25nZXIgdHJ5IHRvIGlkZW50aWZ5IHBhcnRpY3VsYXIgc2VjdGlvbnMgZm9yIHRoZSAuZHluc3ltCi0gICBzZWN0aW9uLiAgV2hlbiB3ZSBkbywgd2Ugd2luZCB1cCBjcmFzaGluZyBpZiB0aGVyZSBhcmUgb3RoZXIgcmFuZG9tCi0gICBzZWN0aW9ucyB3aXRoIHJlbG9jYXRpb25zLiAgKi8KLQotLyogTmFtZXMgb2Ygc2VjdGlvbnMgd2hpY2ggYXBwZWFyIGluIHRoZSAuZHluc3ltIHNlY3Rpb24gaW4gYW4gSXJpeCA1Ci0gICBleGVjdXRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzW10gPQotewotICAiLnRleHQiLAotICAiLmluaXQiLAotICAiLmZpbmkiLAotICAiLmRhdGEiLAotICAiLnJvZGF0YSIsCi0gICIuc2RhdGEiLAotICAiLnNic3MiLAotICAiLmJzcyIsCi0gIE5VTEwKLX07Ci0KLSNkZWZpbmUgU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTIFwKLSAgKHNpemVvZiBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzIC8gc2l6ZW9mIG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXNbMF0pCi0KLS8qIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzIHdoaWNoIGdvIGluIHRoZQotICAgdGV4dCBzZWdtZW50LiAgKi8KLQotI2RlZmluZSBNSVBTX1RFWFRfRFlOU1lNX1NFQ05PICgzKQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGUgbmFtZXMgb2YgdGhlIHJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlIHN5bWJvbHMgdXNlZCBvbiBJcml4IDUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbXSA9Ci17Ci0gICJfcHJvY2VkdXJlX3RhYmxlIiwKLSAgIl9wcm9jZWR1cmVfc3RyaW5nX3RhYmxlIiwKLSAgIl9wcm9jZWR1cmVfdGFibGVfc2l6ZSIsCi0gIE5VTEwKLX07Ci0KLS8qIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIC5jb21wYWN0X3JlbCBzZWN0aW9uIG9uCi0gICBJcml4IDUuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nIGlkMTsJCS8qIEFsd2F5cyBvbmU/ICAqLwotICB1bnNpZ25lZCBsb25nIG51bTsJCS8qIE51bWJlciBvZiBjb21wYWN0IHJlbG9jYXRpb24gZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgaWQyOwkJLyogQWx3YXlzIHR3bz8gICovCi0gIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkJLyogVGhlIGZpbGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByZXNlcnZlZDA7CS8qIFplcm8/ICAqLwotICB1bnNpZ25lZCBsb25nIHJlc2VydmVkMTsJLyogWmVybz8gICovCi19IEVsZjMyX2NvbXBhY3RfcmVsOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfYnl0ZSBpZDFbNF07Ci0gIGJmZF9ieXRlIG51bVs0XTsKLSAgYmZkX2J5dGUgaWQyWzRdOwotICBiZmRfYnl0ZSBvZmZzZXRbNF07Ci0gIGJmZF9ieXRlIHJlc2VydmVkMFs0XTsKLSAgYmZkX2J5dGUgcmVzZXJ2ZWQxWzRdOwotfSBFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgaW50IGN0eXBlIDogMTsJLyogMTogbG9uZyAwOiBzaG9ydCBmb3JtYXQuIFNlZSBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGludCBydHlwZSA6IDQ7CS8qIFJlbG9jYXRpb24gdHlwZXMuIFNlZSBiZWxvdy4gKi8KLSAgdW5zaWduZWQgaW50IGRpc3QydG8gOiA4OwotICB1bnNpZ25lZCBpbnQgcmVsdmFkZHIgOiAxOTsJLyogKFZBRERSIC0gdmFkZHIgb2YgdGhlIHByZXZpb3VzIGVudHJ5KS8gNCAqLwotICB1bnNpZ25lZCBsb25nIGtvbnN0OwkJLyogS09OU1QgZmllbGQuIFNlZSBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGxvbmcgdmFkZHI7CQkvKiBWQUREUiB0byBiZSByZWxvY2F0ZWQuICAqLwotfSBFbGYzMl9jcmluZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGludCBjdHlwZSA6IDE7CS8qIDE6IGxvbmcgMDogc2hvcnQgZm9ybWF0LiBTZWUgYmVsb3cuICAqLwotICB1bnNpZ25lZCBpbnQgcnR5cGUgOiA0OwkvKiBSZWxvY2F0aW9uIHR5cGVzLiBTZWUgYmVsb3cuICovCi0gIHVuc2lnbmVkIGludCBkaXN0MnRvIDogODsKLSAgdW5zaWduZWQgaW50IHJlbHZhZGRyIDogMTk7CS8qIChWQUREUiAtIHZhZGRyIG9mIHRoZSBwcmV2aW91cyBlbnRyeSkvIDQgKi8KLSAgdW5zaWduZWQgbG9uZyBrb25zdDsJCS8qIEtPTlNUIGZpZWxkLiBTZWUgYmVsb3cuICAqLwotfSBFbGYzMl9jcmluZm8yOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfYnl0ZSBpbmZvWzRdOwotICBiZmRfYnl0ZSBrb25zdFs0XTsKLSAgYmZkX2J5dGUgdmFkZHJbNF07Ci19IEVsZjMyX0V4dGVybmFsX2NyaW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgYmZkX2J5dGUgaW5mb1s0XTsKLSAgYmZkX2J5dGUga29uc3RbNF07Ci19IEVsZjMyX0V4dGVybmFsX2NyaW5mbzI7Ci0KLS8qIFRoZXNlIGFyZSB0aGUgY29uc3RhbnRzIHVzZWQgdG8gc3dhcCB0aGUgYml0ZmllbGRzIGluIGEgY3JpbmZvLiAgKi8KLQotI2RlZmluZSBDUklORk9fQ1RZUEUgKDB4MSkKLSNkZWZpbmUgQ1JJTkZPX0NUWVBFX1NIICgzMSkKLSNkZWZpbmUgQ1JJTkZPX1JUWVBFICgweGYpCi0jZGVmaW5lIENSSU5GT19SVFlQRV9TSCAoMjcpCi0jZGVmaW5lIENSSU5GT19ESVNUMlRPICgweGZmKQotI2RlZmluZSBDUklORk9fRElTVDJUT19TSCAoMTkpCi0jZGVmaW5lIENSSU5GT19SRUxWQUREUiAoMHg3ZmZmZikKLSNkZWZpbmUgQ1JJTkZPX1JFTFZBRERSX1NIICgwKQotCi0vKiBBIGNvbXBhY3QgcmVsb2NhdGlvbiBpbmZvIGhhcyBsb25nICgzIHdvcmRzKSBvciBzaG9ydCAoMiB3b3JkcykKLSAgIGZvcm1hdHMuICBBIHNob3J0IGZvcm1hdCBkb2Vzbid0IGhhdmUgVkFERFIgZmllbGQgYW5kIHJlbHZhZGRyCi0gICBmaWVsZHMgY29udGFpbnMgKChWQUREUiAtIHZhZGRyIG9mIHRoZSBwcmV2aW91cyBlbnRyeSkgPj4gMikuICAqLwotI2RlZmluZSBDUkZfTUlQU19MT05HCQkJMQotI2RlZmluZSBDUkZfTUlQU19TSE9SVAkJCTAKLQotLyogVGhlcmUgYXJlIDQgdHlwZXMgb2YgY29tcGFjdCByZWxvY2F0aW9uIGF0IGxlYXN0LiBUaGUgdmFsdWUgS09OU1QKLSAgIGhhcyBkaWZmZXJlbnQgbWVhbmluZyBmb3IgZWFjaCB0eXBlOgotCi0gICAodHlwZSkJCShrb25zdCkKLSAgIENUX01JUFNfUkVMMzIJQWRkcmVzcyBpbiBkYXRhCi0gICBDVF9NSVBTX1dPUkQJCUFkZHJlc3MgaW4gd29yZCAoWFhYKQotICAgQ1RfTUlQU19HUEhJX0xPCUdQIC0gdmFkZHIKLSAgIENUX01JUFNfSk1QQUQJQWRkcmVzcyB0byBqdW1wCi0gICAqLwotCi0jZGVmaW5lIENSVF9NSVBTX1JFTDMyCQkJMHhhCi0jZGVmaW5lIENSVF9NSVBTX1dPUkQJCQkweGIKLSNkZWZpbmUgQ1JUX01JUFNfR1BISV9MTwkJMHhjCi0jZGVmaW5lIENSVF9NSVBTX0pNUEFECQkJMHhkCi0KLSNkZWZpbmUgbWlwc19lbGZfc2V0X2NyX2Zvcm1hdCh4LGZvcm1hdCkJKCh4KS5jdHlwZSA9IChmb3JtYXQpKQotI2RlZmluZSBtaXBzX2VsZl9zZXRfY3JfdHlwZSh4LHR5cGUpCQkoKHgpLnJ0eXBlID0gKHR5cGUpKQotI2RlZmluZSBtaXBzX2VsZl9zZXRfY3JfZGlzdDJ0byh4LHYpCQkoKHgpLmRpc3QydG8gPSAodikpCi0jZGVmaW5lIG1pcHNfZWxmX3NldF9jcl9yZWx2YWRkcih4LGQpCQkoKHgpLnJlbHZhZGRyID0gKGQpPDwyKQotCi1zdGF0aWMgdm9pZCBiZmRfZWxmMzJfc3dhcF9jb21wYWN0X3JlbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX2NvbXBhY3RfcmVsICosIEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsICopKTsKLXN0YXRpYyB2b2lkIGJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX2NyaW5mbyAqLCBFbGYzMl9FeHRlcm5hbF9jcmluZm8gKikpOwotCi0jZGVmaW5lIFVTRV9SRUwJMQkJLyogTUlQUyB1c2VzIFJFTCByZWxvY2F0aW9ucyBpbnN0ZWFkIG9mIFJFTEEgKi8KLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBzeW1ib2wgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAyNiBiaXQgYnJhbmNoIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NSVBTXzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMjYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISTE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MTzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19MTzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGxpdGVyYWwgc2VjdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xJVEVSQUwiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlZmVyZW5jZSB0byBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1QxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19QQzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUEMxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBjYWxsIHRocm91Z2ggZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTEwxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgICAvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgZGVmaW5lZCBvbiBJcml4IDUsIGFsdGhvdWdoIHRoZXkgYXJlCi0gICAgICAgbm90IGRlZmluZWQgYnkgdGhlIEFCSS4gICovCi0gICAgRU1QVFlfSE9XVE8gKDEzKSwKLSAgICBFTVBUWV9IT1dUTyAoMTQpLAotICAgIEVNUFRZX0hPV1RPICgxNSksCi0KLSAgLyogQSA1IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ1LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDUiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2MwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseTsgYSBzcGVjaWFsIGZ1bmN0aW9uIGlzCi0gICAgIG5lZWRlZCB0byBwdXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIHRoZSByaWdodCBwbGFjZS4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzQsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2M0LAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfNjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMzJfNjRiaXRfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0RJU1AsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ESVNQIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCB0byBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9QQUdFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfUEFHRSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBPZmZzZXQgZnJvbSBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9PRlNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfT0ZTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgc3VidHJhY3Rpb24uICBVc2VkIGluIHRoZSBOMzIgQUJJLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TVUIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TVUIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIHRvIGNhdXNlIHRoZSBsaW5rZXIgdG8gaW5zZXJ0IGFuZCBkZWxldGUgaW5zdHJ1Y3Rpb25zPyAgKi8KLSAgRU1QVFlfSE9XVE8gKFJfTUlQU19JTlNFUlRfQSksCi0gIEVNUFRZX0hPV1RPIChSX01JUFNfSU5TRVJUX0IpLAotICBFTVBUWV9IT1dUTyAoUl9NSVBTX0RFTEVURSksCi0KLSAgLyogR2V0IHRoZSBoaWdoZXIgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFUiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHZXQgdGhlIGhpZ2hlc3QgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNlY3Rpb24gZGlzcGxhY2VtZW50LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TQ05fRElTUCwgICAgICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TQ05fRElTUCIsICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEVNUFRZX0hPV1RPIChSX01JUFNfUkVMMTYpLAotICBFTVBUWV9IT1dUTyAoUl9NSVBTX0FERF9JTU1FRElBVEUpLAotICBFTVBUWV9IT1dUTyAoUl9NSVBTX1BKVU1QKSwKLSAgRU1QVFlfSE9XVE8gKFJfTUlQU19SRUxHT1QpLAotCi0gIC8qIFByb3RlY3RlZCBqdW1wIGNvbnZlcnNpb24uICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBoaW50LiAgTm8gCi0gICAgIHJlbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19KQUxSLAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19KQUxSIiwJICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVGhlIHJlbG9jIHVzZWQgZm9yIEJGRF9SRUxPQ19DVE9SIHdoZW4gZG9pbmcgYSA2NCBiaXQgbGluay4gIFRoaXMKLSAgIGlzIGEgaGFjayB0byBtYWtlIHRoZSBsaW5rZXIgdGhpbmsgdGhhdCB3ZSBuZWVkIDY0IGJpdCB2YWx1ZXMuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfY3RvcjY0X2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQU182NCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMzJfNjRiaXRfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFRoZSByZWxvYyB1c2VkIGZvciB0aGUgbWlwczE2IGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHMxNl9qdW1wX2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQUzE2XzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgbWlwczE2X2p1bXBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQUzE2XzI2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFRoZSByZWxvYyB1c2VkIGZvciB0aGUgbWlwczE2IGdwcmVsIGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzMTZfZ3ByZWxfaG93dG8gPQotICBIT1dUTyAoUl9NSVBTMTZfR1BSRUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMTZfZ3ByZWxfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQUzE2X0dQUkVMIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmYwMDFmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmMDAxZiwJICAgICAgICAvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotCi0vKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0byA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0byA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR05VX1ZURU5UUlkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIERvIGEgUl9NSVBTX0hJMTYgcmVsb2NhdGlvbi4gIFRoaXMgaGFzIHRvIGJlIGRvbmUgaW4gY29tYmluYXRpb24KLSAgIHdpdGggYSBSX01JUFNfTE8xNiByZWxvYywgYmVjYXVzZSB0aGVyZSBpcyBhIGNhcnJ5IGZyb20gdGhlIExPMTYgdG8KLSAgIHRoZSBISTE2LiAgSGVyZSB3ZSBqdXN0IHNhdmUgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQ7IHdlIGRvIHRoZQotICAgYWN0dWFsIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIExPMTYuICBNSVBTIEVMRiByZXF1aXJlcyB0aGF0IHRoZQotICAgTE8xNiBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIEhJMTYuICBBcyBhIEdOVSBleHRlbnNpb24sIHdlIHBlcm1pdCBhbgotICAgYXJiaXRyYXJ5IG51bWJlciBvZiBISTE2IHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8xNgotICAgcmVsb2MuICBUaGlzIGV4dGVuc2lvbiBwZXJtaXRzIGdjYyB0byBvdXRwdXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLSAgIGl0c2VsZi4gICovCi0KLXN0cnVjdCBtaXBzX2hpMTYKLXsKLSAgc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKLSAgYmZkX2J5dGUgKmFkZHI7Ci0gIGJmZF92bWEgYWRkZW5kOwotfTsKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBhIHN0YXRpYyB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19oaTE2ICptaXBzX2hpMTZfbGlzdDsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MgKGFiZmQsCi0JCSAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgc3ltYm9sLAotCQkgICAgIGRhdGEsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLAotCQkgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgc3RydWN0IG1pcHNfaGkxNiAqbjsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0KLSAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwgIl9ncF9kaXNwIikgPT0gMCkKLSAgICB7Ci0gICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgIGJmZF92bWEgZ3A7Ci0KLSAgICAgIGlmIChyZXQgPT0gYmZkX3JlbG9jX3VuZGVmaW5lZCkKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLQlyZWxvY2F0ZWFibGUgPSB0cnVlOwotICAgICAgZWxzZQotCXsKLQkgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotCSAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotCX0KLQotICAgICAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgcmVsb2NhdGVhYmxlLAotCQkJICAgICAgIGVycm9yX21lc3NhZ2UsICZncCk7Ci0gICAgICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLQlyZXR1cm4gcmV0OwotCi0gICAgICByZWxvY2F0aW9uID0gZ3AgLSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0JICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLQlyZXQgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCXJlbG9jYXRpb24gPSAwOwotICAgICAgZWxzZQotCXJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotICAgIH0KLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFNhdmUgdGhlIGluZm9ybWF0aW9uLCBhbmQgbGV0IExPMTYgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbWlwc19oaTE2ICopIGJmZF9tYWxsb2MgKHNpemVvZiAqbik7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICBuLT5hZGRyID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbi0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgbi0+bmV4dCA9IG1pcHNfaGkxNl9saXN0OwotICBtaXBzX2hpMTZfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRG8gYSBSX01JUFNfTE8xNiByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQKLSAgIGlucGxhY2UgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlCi0gICBSX01JUFNfSEkxNiByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jIChhYmZkLAotCQkgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgIHN5bWJvbCwKLQkJICAgICBkYXRhLAotCQkgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwKLQkJICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYXJlbGVudCBncF9kaXNwX3JlbGVudDsKLQotICBpZiAobWlwc19oaTE2X2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbWlwc19oaTE2ICpsOwotCi0gICAgICBsID0gbWlwc19oaTE2X2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtaXBzX2hpMTYgKm5leHQ7Ci0KLQkgIC8qIERvIHRoZSBISTE2IHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QgbmVlZAotCSAgICAgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgTE8xNiBpdHNlbGYsIGV4Y2VwdCB3aGVyZSB0bwotCSAgICAgZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlIExPMTYuICAqLwotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOwotCSAgdmFsbG8gPSAoYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcykKLQkJICAgJiAweGZmZmYpOwotCSAgdmFsID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyB2YWxsbzsKLQkgIHZhbCArPSBsLT5hZGRlbmQ7Ci0KLQkgIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQKLQkgICAgIHZhbHVlLiAgVGhlcmVmb3JlLCBhIG5lZ2F0aXZlIHZhbHVlIGluIHRoZSBsb3cgb3JkZXIgYml0cwotCSAgICAgcmVxdWlyZXMgYW4gYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZAotCSAgICAgdG8gbWFrZSB0aGlzIGFkanVzdG1lbnQgaW4gdHdvIHdheXM6IG9uY2UgZm9yIHRoZSBiaXRzIHdlCi0JICAgICB0b29rIGZyb20gdGhlIGRhdGEsIGFuZCBvbmNlIGZvciB0aGUgYml0cyB3ZSBhcmUgcHV0dGluZwotCSAgICAgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCi0JICBpZiAoKHZhbGxvICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgLT0gMHgxMDAwMDsKLQkgIGlmICgodmFsICYgMHg4MDAwKSAhPSAwKQotCSAgICB2YWwgKz0gMHgxMDAwMDsKLQotCSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgbC0+YWRkcik7Ci0KLQkgIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksICJfZ3BfZGlzcCIpID09IDApCi0JICAgIHsKLQkgICAgICBncF9kaXNwX3JlbGVudCA9ICpyZWxvY19lbnRyeTsKLQkgICAgICByZWxvY19lbnRyeSA9ICZncF9kaXNwX3JlbGVudDsKLQkgICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gbC0+YWRkZW5kOwotCSAgICB9Ci0KLQkgIG5leHQgPSBsLT5uZXh0OwotCSAgZnJlZSAobCk7Ci0JICBsID0gbmV4dDsKLQl9Ci0KLSAgICAgIG1pcHNfaGkxNl9saXN0ID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwgIl9ncF9kaXNwIikgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICAgICAgYmZkX3ZtYSBncCwgcmVsb2NhdGlvbjsKLQotICAgICAgLyogRklYTUU6IERvZXMgdGhpcyBjYXNlIGV2ZXIgb2NjdXI/ICAqLwotCi0gICAgICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCB0cnVlLCBlcnJvcl9tZXNzYWdlLCAmZ3ApOwotICAgICAgaWYgKHJldCAhPSBiZmRfcmVsb2Nfb2spCi0JcmV0dXJuIHJldDsKLQotICAgICAgcmVsb2NhdGlvbiA9IGdwIC0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gICAgICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0JcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gICAgICBncF9kaXNwX3JlbGVudCA9ICpyZWxvY19lbnRyeTsKLSAgICAgIHJlbG9jX2VudHJ5ID0gJmdwX2Rpc3BfcmVsZW50OwotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb24gLSA0OwotICAgIH0KLQotICAvKiBOb3cgZG8gdGhlIExPMTYgcmVsb2MgaW4gdGhlIHVzdWFsIHdheS4gICovCi0gIHJldHVybiBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkJaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci19Ci0KLS8qIERvIGEgUl9NSVBTX0dPVDE2IHJlbG9jLiAgVGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGdsb2JhbCBvZmZzZXQKLSAgIHRhYmxlIHVzZWQgZm9yIFBJQyBjb2RlLiAgSWYgdGhlIHN5bWJvbCBpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHRoZQotICAgaW5zdHJ1Y3Rpb24gaXMgbW9kaWZpZWQgdG8gY29udGFpbiB0aGUgb2Zmc2V0IG9mIHRoZSBhcHByb3ByaWF0ZQotICAgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBJZiB0aGUgc3ltYm9sIGlzIGEgc2VjdGlvbgotICAgc3ltYm9sLCB0aGUgbmV4dCByZWxvYyBpcyBhIFJfTUlQU19MTzE2IHJlbG9jLiAgVGhlIHR3byAxNiBiaXQKLSAgIGFkZGVuZHMgYXJlIGNvbWJpbmVkIHRvIGZvcm0gdGhlIHJlYWwgYWRkZW5kIGFnYWluc3QgdGhlIHNlY3Rpb24KLSAgIHN5bWJvbDsgdGhlIEdPVDE2IGlzIG1vZGlmaWVkIHRvIGNvbnRhaW4gdGhlIG9mZnNldCBvZiBhbiBlbnRyeSBpbgotICAgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIGFuZCB0aGUgTE8xNiBpcyBtb2RpZmllZCB0byBvZmZzZXQgaXQKLSAgIGFwcHJvcHJpYXRlbHkuICBUaHVzIGFuIG9mZnNldCBsYXJnZXIgdGhhbiAxNiBiaXRzIHJlcXVpcmVzIGEKLSAgIG1vZGlmaWVkIHZhbHVlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotCi0gICBUaGlzIGltcGxlbWVudGF0aW9uIHN1ZmZpY2VzIGZvciB0aGUgYXNzZW1ibGVyLCBidXQgdGhlIGxpbmtlciBkb2VzCi0gICBub3QgeWV0IGtub3cgaG93IHRvIGNyZWF0ZSBnbG9iYWwgb2Zmc2V0IHRhYmxlcy4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYyAoYWJmZCwKLQkJICAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgIHN5bWJvbCwKLQkJICAgICAgZGF0YSwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG9uJ3Qgd2FudAotICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSBjYW4gaGFuZGxlIGl0Ci0gICAgIGp1c3QgbGlrZSBISTE2LiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICByZXR1cm4gX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFNldCB0aGUgR1AgdmFsdWUgZm9yIE9VVFBVVF9CRkQuICBSZXR1cm5zIGZhbHNlIGlmIHRoaXMgaXMgYQotICAgZGFuZ2Vyb3VzIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfYXNzaWduX2dwIChvdXRwdXRfYmZkLCBwZ3ApCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkX3ZtYSAqcGdwOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGFzeW1ib2wgKipzeW07Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIElmIHdlJ3ZlIGFscmVhZHkgZmlndXJlZCBvdXQgd2hhdCBHUCB3aWxsIGJlLCBqdXN0IHJldHVybiBpdC4gICovCi0gICpwZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0gIGlmICgqcGdwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0gIHN5bSA9IGJmZF9nZXRfb3V0c3ltYm9scyAob3V0cHV0X2JmZCk7Ci0KLSAgLyogVGhlIGxpbmtlciBzY3JpcHQgd2lsbCBoYXZlIGNyZWF0ZWQgYSBzeW1ib2wgbmFtZWQgYF9ncCcgd2l0aCB0aGUKLSAgICAgYXBwcm9wcmlhdGUgdmFsdWUuICAqLwotICBpZiAoc3ltID09IChhc3ltYm9sICoqKSBOVUxMKQotICAgIGkgPSBjb3VudDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBzeW0rKykKLQl7Ci0JICByZWdpc3RlciBDT05TVCBjaGFyICpuYW1lOwotCi0JICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoKnN5bSk7Ci0JICBpZiAoKm5hbWUgPT0gJ18nICYmIHN0cmNtcCAobmFtZSwgIl9ncCIpID09IDApCi0JICAgIHsKLQkgICAgICAqcGdwID0gYmZkX2FzeW1ib2xfdmFsdWUgKCpzeW0pOwotCSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCAqcGdwKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGkgPj0gY291bnQpCi0gICAgewotICAgICAgLyogT25seSBnZXQgdGhlIGVycm9yIG9uY2UuICAqLwotICAgICAgKnBncCA9IDQ7Ci0gICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgKnBncCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIGdwIHZhbHVlLCBzbyB0aGF0IHdlIGNhbiBhZGp1c3QgdGhlCi0gICBzeW1ib2wgdmFsdWUgY29ycmVjdGx5LiAgV2UgbG9vayB1cCB0aGUgc3ltYm9sIF9ncCBpbiB0aGUgb3V0cHV0Ci0gICBCRkQuICBJZiB3ZSBjYW4ndCBmaW5kIGl0LCB3ZSdyZSBzdHVjay4gIFdlIGNhY2hlIGl0IGluIHRoZSBFTEYKLSAgIHRhcmdldCBkYXRhLiAgV2UgZG9uJ3QgbmVlZCB0byBhZGp1c3QgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgYW4KLSAgIGV4dGVybmFsIHN5bWJvbCBpZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsIGVycm9yX21lc3NhZ2UsIHBncCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLSAgICAgYmZkX3ZtYSAqcGdwOwotewotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAhIHJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAqcGdwID0gMDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotICAgIH0KLQotICAqcGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoKnBncCA9PSAwCi0gICAgICAmJiAoISByZWxvY2F0ZWFibGUKLQkgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAocmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIE1ha2UgdXAgYSB2YWx1ZS4gICovCi0JICAqcGdwID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMHg0MDAwOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsICpwZ3ApOwotCX0KLSAgICAgIGVsc2UgaWYgKCFtaXBzX2VsZl9hc3NpZ25fZ3AgKG91dHB1dF9iZmQsIHBncCkpCi0JewotCSAgKmVycm9yX21lc3NhZ2UgPQotCSAgICAoY2hhciAqKSBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gX2dwIG5vdCBkZWZpbmVkIik7Ci0JICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIERvIGEgUl9NSVBTX0dQUkVMMTYgcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSAxNiBiaXQgdmFsdWUgd2hpY2ggbXVzdAotICAgYmVjb21lIHRoZSBvZmZzZXQgZnJvbSB0aGUgZ3AgcmVnaXN0ZXIuICBUaGlzIGZ1bmN0aW9uIGFsc28gaGFuZGxlcwotICAgUl9NSVBTX0xJVEVSQUwgcmVsb2NhdGlvbnMsIGFsdGhvdWdoIHRob3NlIGNhbiBiZSBoYW5kbGVkIG1vcmUKLSAgIGNsZXZlcmx5IGJlY2F1c2UgdGhlIGVudHJpZXMgaW4gdGhlIC5saXQ4IGFuZCAubGl0NCBzZWN0aW9ucyBjYW4gYmUKLSAgIG1lcmdlZC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZ3ByZWwxNl93aXRoX2dwIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCQkgICAgICBhcmVsZW50ICosIGFzZWN0aW9uICosCi0JCQkJCQkgICAgICBib29sZWFuLCBQVFIsIGJmZF92bWEpKTsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSBncDsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wgd2l0aCBubwotICAgICBhZGRlbmQsIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGFueXRoaW5nLiAgV2Ugd2lsbCBvbmx5IGhhdmUgYW4KLSAgICAgYWRkZW5kIGlmIHRoaXMgaXMgYSBuZXdseSBjcmVhdGVkIHJlbG9jLCBub3QgcmVhZCBmcm9tIGFuIEVMRgotICAgICBmaWxlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotICAgIH0KLQotICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsIGVycm9yX21lc3NhZ2UsCi0JCQkgICAmZ3ApOwotICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLSAgICByZXR1cm4gcmV0OwotCi0gIHJldHVybiBncHJlbDE2X3dpdGhfZ3AgKGFiZmQsIHN5bWJvbCwgcmVsb2NfZW50cnksIGlucHV0X3NlY3Rpb24sCi0JCQkgIHJlbG9jYXRlYWJsZSwgZGF0YSwgZ3ApOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1ncHJlbDE2X3dpdGhfZ3AgKGFiZmQsIHN5bWJvbCwgcmVsb2NfZW50cnksIGlucHV0X3NlY3Rpb24sIHJlbG9jYXRlYWJsZSwgZGF0YSwKLQkJIGdwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGJmZF92bWEgZ3A7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIC8qIFNldCB2YWwgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9yIHN5bWJvbC4gICovCi0gIGlmIChyZWxvY19lbnRyeS0+aG93dG8tPnNyY19tYXNrID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBjYXNlIG9jY3VycyB3aXRoIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLiAgKi8KLSAgICAgIHZhbCA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsID0gKChpbnNuICYgMHhmZmZmKSArIHJlbG9jX2VudHJ5LT5hZGRlbmQpICYgMHhmZmZmOwotICAgICAgaWYgKHZhbCAmIDB4ODAwMCkKLQl2YWwgLT0gMHgxMDAwMDsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IHZhbCBmb3IgdGhlIGZpbmFsIHNlY3Rpb24gbG9jYXRpb24gYW5kIEdQIHZhbHVlLiAgSWYgd2UKLSAgICAgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgZm9yCi0gICAgIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0gIGlmICghIHJlbG9jYXRlYWJsZQotICAgICAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgdmFsICs9IHJlbG9jYXRpb24gLSBncDsKLQotICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICh2YWwgJiAweGZmZmYpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAocmVsb2NhdGVhYmxlKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogTWFrZSBzdXJlIGl0IGZpdCBpbiAxNiBiaXRzLiAgKi8KLSAgaWYgKHZhbCA+PSAweDgwMDAgJiYgdmFsIDwgMHhmZmZmODAwMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIERvIGEgUl9NSVBTX0dQUkVMMzIgcmVsb2NhdGlvbi4gIElzIHRoaXMgMzIgYml0IHZhbHVlIHRoZSBvZmZzZXQKLSAgIGZyb20gdGhlIGdwIHJlZ2lzdGVyPyBYWFggKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBncHJlbDMyX3dpdGhfZ3AgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJCSAgICAgIGJvb2xlYW4sIFBUUiwgYmZkX3ZtYSkpOwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYyAoYWJmZCwKLQkJCXJlbG9jX2VudHJ5LAotCQkJc3ltYm9sLAotCQkJZGF0YSwKLQkJCWlucHV0X3NlY3Rpb24sCi0JCQlvdXRwdXRfYmZkLAotCQkJZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIGdwOwotCi0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbCB3aXRoIG5vCi0gICAgIGFkZGVuZCwgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgYW55dGhpbmcuICBXZSB3aWxsIG9ubHkgaGF2ZSBhbgotICAgICBhZGRlbmQgaWYgdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgcmVsb2MsIG5vdCByZWFkIGZyb20gYW4gRUxGCi0gICAgIGZpbGUuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKQotCV8oIjMyYml0cyBncCByZWxhdGl2ZSByZWxvY2F0aW9uIG9jY3VycyBmb3IgYW4gZXh0ZXJuYWwgc3ltYm9sIik7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY2F0ZWFibGUgPSB0cnVlOwotICAgICAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsb2NhdGVhYmxlID0gZmFsc2U7Ci0gICAgICBvdXRwdXRfYmZkID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXI7Ci0KLSAgICAgIHJldCA9IG1pcHNfZWxmX2ZpbmFsX2dwIChvdXRwdXRfYmZkLCBzeW1ib2wsIHJlbG9jYXRlYWJsZSwKLQkJCSAgICAgICBlcnJvcl9tZXNzYWdlLCAmZ3ApOwotICAgICAgaWYgKHJldCAhPSBiZmRfcmVsb2Nfb2spCi0JcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgcmV0dXJuIGdwcmVsMzJfd2l0aF9ncCAoYWJmZCwgc3ltYm9sLCByZWxvY19lbnRyeSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgcmVsb2NhdGVhYmxlLCBkYXRhLCBncCk7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWdwcmVsMzJfd2l0aF9ncCAoYWJmZCwgc3ltYm9sLCByZWxvY19lbnRyeSwgaW5wdXRfc2VjdGlvbiwgcmVsb2NhdGVhYmxlLCBkYXRhLAotCQkgZ3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBQVFIgZGF0YTsKLSAgICAgYmZkX3ZtYSBncDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICB1bnNpZ25lZCBsb25nIHZhbDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5ob3d0by0+c3JjX21hc2sgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNhc2UgYXJpc2VzIHdpdGggdGhlIDY0LWJpdCBNSVBTIEVMRiBBQkkuICAqLwotICAgICAgdmFsID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICAvKiBTZXQgdmFsIHRvIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvciBzeW1ib2wuICAqLwotICB2YWwgKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBBZGp1c3QgdmFsIGZvciB0aGUgZmluYWwgc2VjdGlvbiBsb2NhdGlvbiBhbmQgR1AgdmFsdWUuICBJZiB3ZQotICAgICBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IKLSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLSAgaWYgKCEgcmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB2YWwgKz0gcmVsb2NhdGlvbiAtIGdwOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgaWYgKHJlbG9jYXRlYWJsZSkKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEhhbmRsZSBhIDY0IGJpdCByZWxvYyBpbiBhIDMyIGJpdCBNSVBTIEVMRiBmaWxlLiAgVGhlc2UgYXJlCi0gICBnZW5lcmF0ZWQgd2hlbiBhZGRyZXNlcyBhcmUgNjQgYml0cy4gIFRoZSB1cHBlciAzMiBiaXRzIGFyZSBhIHNpbWxlCi0gICBzaWduIGV4dGVuc2lvbi4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHMzMl82NGJpdF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLSAgYXJlbGVudCByZWxvYzMyOwotICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgYmZkX3NpemVfdHlwZSBhZGRyOwotCi0gIHIgPSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotICBpZiAociAhPSBiZmRfcmVsb2NfY29udGludWUpCi0gICAgcmV0dXJuIHI7Ci0KLSAgLyogRG8gYSBub3JtYWwgMzIgYml0IHJlbG9jYXRpb24gb24gdGhlIGxvd2VyIDMyIGJpdHMuICAqLwotICByZWxvYzMyID0gKnJlbG9jX2VudHJ5OwotICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHJlbG9jMzIuYWRkcmVzcyArPSA0OwotICByZWxvYzMyLmhvd3RvID0gJmVsZl9taXBzX2hvd3RvX3RhYmxlW1JfTUlQU18zMl07Ci0gIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChhYmZkLCAmcmVsb2MzMiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotCi0gIC8qIFNpZ24gZXh0ZW5kIGludG8gdGhlIHVwcGVyIDMyIGJpdHMuICAqLwotICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jMzIuYWRkcmVzcyk7Ci0gIGlmICgodmFsICYgMHg4MDAwMDAwMCkgIT0gMCkKLSAgICB2YWwgPSAweGZmZmZmZmZmOwotICBlbHNlCi0gICAgdmFsID0gMDsKLSAgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotICAgIGFkZHIgKz0gNDsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIHJldHVybiByOwotfQotCi0vKiBIYW5kbGUgYSBtaXBzMTYganVtcC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHMxNl9qdW1wX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBGSVhNRS4gICovCi0gIHsKLSAgICBzdGF0aWMgYm9vbGVhbiB3YXJuZWQ7Ci0KLSAgICBpZiAoISB3YXJuZWQpCi0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiTGlua2luZyBtaXBzMTYgb2JqZWN0cyBpbnRvICVzIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkIiksCi0JIGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpKTsKLSAgICB3YXJuZWQgPSB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci19Ci0KLS8qIEhhbmRsZSBhIG1pcHMxNiBHUCByZWxhdGl2ZSByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHMxNl9ncHJlbF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSBncDsKLSAgdW5zaWduZWQgc2hvcnQgZXh0ZW5kLCBpbnNuOwotICB1bnNpZ25lZCBsb25nIGZpbmFsOwotCi0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbCB3aXRoIG5vCi0gICAgIGFkZGVuZCwgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgYW55dGhpbmcuICBXZSB3aWxsIG9ubHkgaGF2ZSBhbgotICAgICBhZGRlbmQgaWYgdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgcmVsb2MsIG5vdCByZWFkIGZyb20gYW4gRUxGCi0gICAgIGZpbGUuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHJlbG9jYXRlYWJsZSA9IHRydWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY2F0ZWFibGUgPSBmYWxzZTsKLSAgICAgIG91dHB1dF9iZmQgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcjsKLSAgICB9Ci0KLSAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgcmVsb2NhdGVhYmxlLCBlcnJvcl9tZXNzYWdlLAotCQkJICAgJmdwKTsKLSAgaWYgKHJldCAhPSBiZmRfcmVsb2Nfb2spCi0gICAgcmV0dXJuIHJldDsKLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFBpY2sgdXAgdGhlIG1pcHMxNiBleHRlbmQgaW5zdHJ1Y3Rpb24gYW5kIHRoZSByZWFsIGluc3RydWN0aW9uLiAgKi8KLSAgZXh0ZW5kID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzICsgMik7Ci0KLSAgLyogU3R1ZmYgdGhlIGN1cnJlbnQgYWRkZW5kIGJhY2sgYXMgYSAzMiBiaXQgdmFsdWUsIGRvIHRoZSB1c3VhbAotICAgICByZWxvY2F0aW9uLCBhbmQgdGhlbiBjbGVhbiB1cC4gICovCi0gIGJmZF9wdXRfMzIgKGFiZmQsCi0JICAgICAgKCgoZXh0ZW5kICYgMHgxZikgPDwgMTEpCi0JICAgICAgIHwgKGV4dGVuZCAmIDB4N2UwKQotCSAgICAgICB8IChpbnNuICYgMHgxZikpLAotCSAgICAgIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIHJldCA9IGdwcmVsMTZfd2l0aF9ncCAoYWJmZCwgc3ltYm9sLCByZWxvY19lbnRyeSwgaW5wdXRfc2VjdGlvbiwKLQkJCSByZWxvY2F0ZWFibGUsIGRhdGEsIGdwKTsKLQotICBmaW5hbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICBiZmRfcHV0XzE2IChhYmZkLAotCSAgICAgICgoZXh0ZW5kICYgMHhmODAwKQotCSAgICAgICB8ICgoZmluYWwgPj4gMTEpICYgMHgxZikKLQkgICAgICAgfCAoZmluYWwgJiAweDdlMCkpLAotCSAgICAgIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICBiZmRfcHV0XzE2IChhYmZkLAotCSAgICAgICgoaW5zbiAmIDB4ZmZlMCkKLQkgICAgICAgfCAoZmluYWwgJiAweDFmKSksCi0JICAgICAgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyArIDIpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFJldHVybiB0aGUgSVNBIGZvciBhIE1JUFMgZV9mbGFncyB2YWx1ZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1lbGZfbWlwc19pc2EgKGZsYWdzKQotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgc3dpdGNoIChmbGFncyAmIEVGX01JUFNfQVJDSCkKLSAgICB7Ci0gICAgY2FzZSBFX01JUFNfQVJDSF8xOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBFX01JUFNfQVJDSF8yOgotICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSBFX01JUFNfQVJDSF8zOgotICAgICAgcmV0dXJuIDM7Ci0gICAgY2FzZSBFX01JUFNfQVJDSF80OgotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotICByZXR1cm4gNDsKLX0KLQotLyogUmV0dXJuIHRoZSBNQUNIIGZvciBhIE1JUFMgZV9mbGFncyB2YWx1ZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1lbGZfbWlwc19tYWNoIChmbGFncykKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIHN3aXRjaCAoZmxhZ3MgJiBFRl9NSVBTX01BQ0gpCi0gICAgewotICAgIGNhc2UgRV9NSVBTX01BQ0hfMzkwMDoKLSAgICAgIHJldHVybiBiZmRfbWFjaF9taXBzMzkwMDsKLQotICAgIGNhc2UgRV9NSVBTX01BQ0hfNDAxMDoKLSAgICAgIHJldHVybiBiZmRfbWFjaF9taXBzNDAxMDsKLQotICAgIGNhc2UgRV9NSVBTX01BQ0hfNDEwMDoKLSAgICAgIHJldHVybiBiZmRfbWFjaF9taXBzNDEwMDsKLQotICAgIGNhc2UgRV9NSVBTX01BQ0hfNDExMToKLSAgICAgIHJldHVybiBiZmRfbWFjaF9taXBzNDExMTsKLQotICAgIGNhc2UgRV9NSVBTX01BQ0hfNDY1MDoKLSAgICAgIHJldHVybiBiZmRfbWFjaF9taXBzNDY1MDsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzd2l0Y2ggKGZsYWdzICYgRUZfTUlQU19BUkNIKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgRV9NSVBTX0FSQ0hfMToKLQkgIHJldHVybiBiZmRfbWFjaF9taXBzMzAwMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX01JUFNfQVJDSF8yOgotCSAgcmV0dXJuIGJmZF9tYWNoX21pcHM2MDAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfTUlQU19BUkNIXzM6Ci0JICByZXR1cm4gYmZkX21hY2hfbWlwczQwMDA7Ci0JICBicmVhazsKLQotCWNhc2UgRV9NSVBTX0FSQ0hfNDoKLQkgIHJldHVybiBiZmRfbWFjaF9taXBzODAwMDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBwcmludGFibGUgbmFtZSBmb3IgQUJJLiAqLwotCi1zdGF0aWMgSU5MSU5FIGNoYXIqCi1lbGZfbWlwc19hYmlfbmFtZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBmbGFnd29yZCBmbGFnczsKLQotICBpZiAoQUJJX04zMl9QIChhYmZkKSkKLSAgICByZXR1cm4gIk4zMiI7Ci0gIGVsc2UgaWYgKEFCSV82NF9QIChhYmZkKSkKLSAgICByZXR1cm4gIjY0IjsKLSAgICAgIAotICBmbGFncyA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzOwotICBzd2l0Y2ggKGZsYWdzICYgRUZfTUlQU19BQkkpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAibm9uZSI7Ci0gICAgY2FzZSBFX01JUFNfQUJJX08zMjoKLSAgICAgIHJldHVybiAiTzMyIjsKLSAgICBjYXNlIEVfTUlQU19BQklfTzY0OgotICAgICAgcmV0dXJuICJPNjQiOwotICAgIGNhc2UgRV9NSVBTX0FCSV9FQUJJMzI6Ci0gICAgICByZXR1cm4gIkVBQkkzMiI7Ci0gICAgY2FzZSBFX01JUFNfQUJJX0VBQkk2NDoKLSAgICAgIHJldHVybiAiRUFCSTY0IjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICJ1bmtub3duIGFiaSI7Ci0gICAgfQotfQotCi0vKiBBIG1hcHBpbmcgZnJvbSBCRkQgcmVsb2MgdHlwZXMgdG8gTUlQUyBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcCB7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICBlbnVtIGVsZl9taXBzX3JlbG9jX3R5cGUgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBtaXBzX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NSVBTX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01JUFNfMTYgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfTUlQU18zMiB9LAotICB7IEJGRF9SRUxPQ182NCwgUl9NSVBTXzY0IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfSk1QLCBSX01JUFNfMjYgfSwKLSAgeyBCRkRfUkVMT0NfSEkxNl9TLCBSX01JUFNfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19MTzE2LCBSX01JUFNfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBSX01JUFNfR1BSRUwxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIFJfTUlQU19MSVRFUkFMIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UMTYsIFJfTUlQU19HT1QxNiB9LAotICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NSVBTX1BDMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19DQUxMMTYsIFJfTUlQU19DQUxMMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTDMyLCBSX01JUFNfR1BSRUwzMiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2LCBSX01JUFNfR09UX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgUl9NSVBTX0dPVF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2LCBSX01JUFNfQ0FMTF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LCBSX01JUFNfQ0FMTF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfU1VCLCBSX01JUFNfU1VCIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX1BBR0UsIFJfTUlQU19HT1RfUEFHRSB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9PRlNULCBSX01JUFNfR09UX09GU1QgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfRElTUCwgUl9NSVBTX0dPVF9ESVNQIH0KLX07Ci0KLS8qIEdpdmVuIGEgQkZEIHJlbG9jIHR5cGUsIHJldHVybiBhIGhvd3RvIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG1pcHNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKG1pcHNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9taXBzX2hvd3RvX3RhYmxlWyhpbnQpIG1pcHNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIC8qIFdlIG5lZWQgdG8gaGFuZGxlIEJGRF9SRUxPQ19DVE9SIHNwZWNpYWxseS4KLQkgU2VsZWN0IHRoZSByaWdodCByZWxvY2F0aW9uIChSX01JUFNfMzIgb3IgUl9NSVBTXzY0KSBiYXNlZCBvbiB0aGUKLQkgc2l6ZSBvZiBhZGRyZXNzZXMgb24gdGhpcyBhcmNoaXRlY3R1cmUuICAqLwotICAgICAgaWYgKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGFiZmQpID09IDMyKQotCXJldHVybiAmZWxmX21pcHNfaG93dG9fdGFibGVbKGludCkgUl9NSVBTXzMyXTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gJmVsZl9taXBzX2N0b3I2NF9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9KTVA6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzMTZfanVtcF9ob3d0bzsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUw6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzMTZfZ3ByZWxfaG93dG87Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICByZXR1cm4gJmVsZl9taXBzX2dudV92dGluaGVyaXRfaG93dG87Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0bzsKLSAgICB9Ci19Ci0KLS8qIEdpdmVuIGEgTUlQUyBFbGYzMl9JbnRlcm5hbF9SZWwsIGZpbGwgaW4gYW4gYXJlbGVudCBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1taXBzX3J0eXBlX3RvX2hvd3RvIChyX3R5cGUpCi0gICAgIHVuc2lnbmVkIGludCByX3R5cGU7Ci17Ci0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfTUlQUzE2XzI2OgotICAgICAgcmV0dXJuICZlbGZfbWlwczE2X2p1bXBfaG93dG87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUlQUzE2X0dQUkVMOgotICAgICAgcmV0dXJuICZlbGZfbWlwczE2X2dwcmVsX2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01JUFNfR05VX1ZUSU5IRVJJVDoKLSAgICAgIHJldHVybiAmZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NSVBTX0dOVV9WVEVOVFJZOgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0bzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfTUlQU19tYXgpOwotICAgICAgcmV0dXJuICZlbGZfbWlwc19ob3d0b190YWJsZVtyX3R5cGVdOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBHaXZlbiBhIE1JUFMgRWxmMzJfSW50ZXJuYWxfUmVsLCBmaWxsIGluIGFuIGFyZWxlbnQgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSBtaXBzX3J0eXBlX3RvX2hvd3RvIChyX3R5cGUpOwotCi0gIC8qIFRoZSBhZGRlbmQgZm9yIGEgR1BSRUwxNiBvciBMSVRFUkFMIHJlbG9jYXRpb24gY29tZXMgZnJvbSB0aGUgR1AKLSAgICAgdmFsdWUgZm9yIHRoZSBvYmplY3QgZmlsZS4gIFdlIGdldCB0aGUgYWRkZW5kIG5vdywgcmF0aGVyIHRoYW4KLSAgICAgd2hlbiB3ZSBkbyB0aGUgcmVsb2NhdGlvbiwgYmVjYXVzZSB0aGUgc3ltYm9sIG1hbmlwdWxhdGlvbnMgZG9uZQotICAgICBieSB0aGUgbGlua2VyIG1heSBjYXVzZSB1cyB0byBsb3NlIHRyYWNrIG9mIHRoZSBpbnB1dCBCRkQuICAqLwotICBpZiAoKCgqY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwCi0gICAgICAmJiAocl90eXBlID09ICh1bnNpZ25lZCBpbnQpIFJfTUlQU19HUFJFTDE2Ci0JICB8fCByX3R5cGUgPT0gKHVuc2lnbmVkIGludCkgUl9NSVBTX0xJVEVSQUwpKQotICAgIGNhY2hlX3B0ci0+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+bXNfaW5mbyk7Ci19Ci0KLQwKLS8qIERldGVybWluZSB3aGV0aGVyIGEgc3ltYm9sIGlzIGdsb2JhbCBmb3IgdGhlIHB1cnBvc2VzIG9mIHNwbGl0dGluZwotICAgdGhlIHN5bWJvbCB0YWJsZSBpbnRvIGdsb2JhbCBzeW1ib2xzIGFuZCBsb2NhbCBzeW1ib2xzLiAgQXQgbGVhc3QKLSAgIG9uIElyaXggNSwgdGhpcyBzcGxpdCBtdXN0IGJlIGJldHdlZW4gc2VjdGlvbiBzeW1ib2xzIGFuZCBhbGwgb3RoZXIKLSAgIHN5bWJvbHMuICBPbiBtb3N0IEVMRiB0YXJnZXRzIHRoZSBzcGxpdCBpcyBiZXR3ZWVuIHN0YXRpYyBzeW1ib2xzCi0gICBhbmQgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9zeW1faXNfZ2xvYmFsIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIHJldHVybiAoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCA/IHRydWUgOiBmYWxzZTsKLX0KLQwKLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGEgTUlQUyBFTEYgZmlsZS4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIElyaXggNSBhbmQgNiBpcyBicm9rZW4uICBPYmplY3QgZmlsZSBzeW1ib2wgdGFibGVzIGFyZSBub3QgYWx3YXlzCi0gICAgIHNvcnRlZCBjb3JyZWN0bHkgc3VjaCB0aGF0IGxvY2FsIHN5bWJvbHMgcHJlY2VkZSBnbG9iYWwgc3ltYm9scywKLSAgICAgYW5kIHRoZSBzaF9pbmZvIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUgaXMgbm90IGFsd2F5cyByaWdodC4gICovCi0gIGVsZl9iYWRfc3ltdGFiIChhYmZkKSA9IHRydWU7Ci0KLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbWlwcywKLQkJCSAgICAgZWxmX21pcHNfbWFjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBmaW5hbCBwcm9jZXNzaW5nIGRvbmUganVzdCBiZWZvcmUgd3JpdGluZyBvdXQgYSBNSVBTIEVMRiBvYmplY3QKLSAgIGZpbGUuICBUaGlzIGdldHMgdGhlIE1JUFMgYXJjaGl0ZWN0dXJlIHJpZ2h0IGJhc2VkIG9uIHRoZSBtYWNoaW5lCi0gICBudW1iZXIuICBUaGlzIGlzIHVzZWQgYnkgYm90aCB0aGUgMzItYml0IGFuZCB0aGUgNjQtYml0IEFCSS4gICovCi0KLS8qQVJHU1VTRUQqLwotdm9pZAotX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gIHVuc2lnbmVkIGludCBpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmhkcnBwOwotICBjb25zdCBjaGFyICpuYW1lOwotICBhc2VjdGlvbiAqc2VjOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHMzMDAwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzMzkwMDoKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzEgfCBFX01JUFNfTUFDSF8zOTAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM2MDAwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDAwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MzAwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDAxMDoKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzMgfCBFX01JUFNfTUFDSF80MDEwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MTAwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQxMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczQxMTE6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8zIHwgRV9NSVBTX01BQ0hfNDExMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDY1MDoKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzMgfCBFX01JUFNfTUFDSF80NjUwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM4MDAwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfNDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPSB+IChFRl9NSVBTX0FSQ0ggfCBFRl9NSVBTX01BQ0gpOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSB2YWw7Ci0KLSAgLyogU2V0IHRoZSBzaF9pbmZvIGZpZWxkIGZvciAuZ3B0YWIgc2VjdGlvbnMgYW5kIG90aGVyIGFwcHJvcHJpYXRlCi0gICAgIGluZm8gZm9yIGVhY2ggc3BlY2lhbCBzZWN0aW9uLiAgKi8KLSAgZm9yIChpID0gMSwgaGRycHAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpICsgMTsKLSAgICAgICBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07Ci0gICAgICAgaSsrLCBoZHJwcCsrKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKCpoZHJwcCktPnNoX3R5cGUpCi0JewotCWNhc2UgU0hUX01JUFNfTVNZTToKLQljYXNlIFNIVF9NSVBTX0xJQkxJU1Q6Ci0JICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zdHIiKTsKLQkgIGlmIChzZWMgIT0gTlVMTCkKLQkgICAgKCpoZHJwcCktPnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfTUlQU19HUFRBQjoKLQkgIEJGRF9BU1NFUlQgKCgqaGRycHApLT5iZmRfc2VjdGlvbiAhPSBOVUxMKTsKLQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgKCpoZHJwcCktPmJmZF9zZWN0aW9uKTsKLQkgIEJGRF9BU1NFUlQgKG5hbWUgIT0gTlVMTAotCQkgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLmdwdGFiLiIsIHNpemVvZiAiLmdwdGFiLiIgLSAxKSA9PSAwKTsKLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lICsgc2l6ZW9mICIuZ3B0YWIiIC0gMSk7Ci0JICBCRkRfQVNTRVJUIChzZWMgIT0gTlVMTCk7Ci0JICAoKmhkcnBwKS0+c2hfaW5mbyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9NSVBTX0NPTlRFTlQ6Ci0JICBCRkRfQVNTRVJUICgoKmhkcnBwKS0+YmZkX3NlY3Rpb24gIT0gTlVMTCk7Ci0JICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsICgqaGRycHApLT5iZmRfc2VjdGlvbik7Ci0JICBCRkRfQVNTRVJUIChuYW1lICE9IE5VTEwKLQkJICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5NSVBTLmNvbnRlbnQiLAotCQkJCSAgc2l6ZW9mICIuTUlQUy5jb250ZW50IiAtIDEpID09IDApOwotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsCi0JCQkJCSBuYW1lICsgc2l6ZW9mICIuTUlQUy5jb250ZW50IiAtIDEpOwotCSAgQkZEX0FTU0VSVCAoc2VjICE9IE5VTEwpOwotCSAgKCpoZHJwcCktPnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfTUlQU19TWU1CT0xfTElCOgotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3ltIik7Ci0JICBpZiAoc2VjICE9IE5VTEwpCi0JICAgICgqaGRycHApLT5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5saWJsaXN0Iik7Ci0JICBpZiAoc2VjICE9IE5VTEwpCi0JICAgICgqaGRycHApLT5zaF9pbmZvID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX01JUFNfRVZFTlRTOgotCSAgQkZEX0FTU0VSVCAoKCpoZHJwcCktPmJmZF9zZWN0aW9uICE9IE5VTEwpOwotCSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCAoKmhkcnBwKS0+YmZkX3NlY3Rpb24pOwotCSAgQkZEX0FTU0VSVCAobmFtZSAhPSBOVUxMKTsKLQkgIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuZXZlbnRzIiwgc2l6ZW9mICIuTUlQUy5ldmVudHMiIC0gMSkgPT0gMCkKLQkgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsCi0JCQkJCSAgIG5hbWUgKyBzaXplb2YgIi5NSVBTLmV2ZW50cyIgLSAxKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIuTUlQUy5wb3N0X3JlbCIsCi0JCQkJICAgc2l6ZW9mICIuTUlQUy5wb3N0X3JlbCIgLSAxKSA9PSAwKTsKLQkgICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwKLQkJCQkJICAgICAobmFtZQotCQkJCQkgICAgICArIHNpemVvZiAiLk1JUFMucG9zdF9yZWwiIC0gMSkpOwotCSAgICB9Ci0JICBCRkRfQVNTRVJUIChzZWMgIT0gTlVMTCk7Ci0JICAoKmhkcnBwKS0+c2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQl9Ci0gICAgfQotfQotDAotLyogRnVuY3Rpb24gdG8ga2VlcCBNSVBTIHNwZWNpZmljIGZpbGUgZmxhZ3MgbGlrZSBhcyBFRl9NSVBTX1BJQy4gKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpCi0JICAgICAgfHwgKGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzCi0JCSAgPT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpKTsKLQotICBlbGZfZ3AgKG9iZmQpID0gZWxmX2dwIChpYmZkKTsKLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG9sZF9mbGFnczsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzOwotICBib29sZWFuIG9rOwotCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmIChpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0gICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm1zZzsKLQotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChpYmZkKSkKLQltc2cgPSBfKCIlczogY29tcGlsZWQgZm9yIGEgYmlnIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyBsaXR0bGUgZW5kaWFuIik7Ci0gICAgICBlbHNlCi0JbXNnID0gXygiJXM6IGNvbXBpbGVkIGZvciBhIGxpdHRsZSBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgYmlnIGVuZGlhbiIpOwotCi0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKG1zZywgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIG5ld19mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyB8PSBuZXdfZmxhZ3MgJiBFRl9NSVBTX05PUkVPUkRFUjsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKCEgZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IG5ld19mbGFnczsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2lkZW50W0VJX0NMQVNTXSAKLQk9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2lkZW50W0VJX0NMQVNTXTsKLQotICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKLQl7Ci0JICBpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwKLQkJCQkgICBiZmRfZ2V0X21hY2ggKGliZmQpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZsYWcgY29tcGF0aWJpbGl0eS4gICovCi0KLSAgbmV3X2ZsYWdzICY9IH5FRl9NSVBTX05PUkVPUkRFUjsKLSAgb2xkX2ZsYWdzICY9IH5FRl9NSVBTX05PUkVPUkRFUjsKLQotICBpZiAobmV3X2ZsYWdzID09IG9sZF9mbGFncykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBvayA9IHRydWU7Ci0KLSAgaWYgKChuZXdfZmxhZ3MgJiBFRl9NSVBTX1BJQykgIT0gKG9sZF9mbGFncyAmIEVGX01JUFNfUElDKSkKLSAgICB7Ci0gICAgICBuZXdfZmxhZ3MgJj0gfkVGX01JUFNfUElDOwotICAgICAgb2xkX2ZsYWdzICY9IH5FRl9NSVBTX1BJQzsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogbGlua2luZyBQSUMgZmlsZXMgd2l0aCBub24tUElDIGZpbGVzIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICAgIG9rID0gZmFsc2U7Ci0gICAgfQotCi0gIGlmICgobmV3X2ZsYWdzICYgRUZfTUlQU19DUElDKSAhPSAob2xkX2ZsYWdzICYgRUZfTUlQU19DUElDKSkKLSAgICB7Ci0gICAgICBuZXdfZmxhZ3MgJj0gfkVGX01JUFNfQ1BJQzsKLSAgICAgIG9sZF9mbGFncyAmPSB+RUZfTUlQU19DUElDOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBsaW5raW5nIGFiaWNhbGxzIGZpbGVzIHdpdGggbm9uLWFiaWNhbGxzIGZpbGVzIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICAgIG9rID0gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENvbXBhcmUgdGhlIElTQSdzLiAqLwotICBpZiAoKG5ld19mbGFncyAmIChFRl9NSVBTX0FSQ0ggfCBFRl9NSVBTX01BQ0gpKQotICAgICAgIT0gKG9sZF9mbGFncyAmIChFRl9NSVBTX0FSQ0ggfCBFRl9NSVBTX01BQ0gpKSkKLSAgICB7Ci0gICAgICBpbnQgbmV3X21hY2ggPSBuZXdfZmxhZ3MgJiBFRl9NSVBTX01BQ0g7Ci0gICAgICBpbnQgb2xkX21hY2ggPSBvbGRfZmxhZ3MgJiBFRl9NSVBTX01BQ0g7Ci0gICAgICBpbnQgbmV3X2lzYSA9IGVsZl9taXBzX2lzYSAobmV3X2ZsYWdzKTsKLSAgICAgIGludCBvbGRfaXNhID0gZWxmX21pcHNfaXNhIChvbGRfZmxhZ3MpOwotCi0gICAgICAvKiBJZiBlaXRoZXIgaGFzIG5vIG1hY2hpbmUgc3BlY2lmaWVkLCBqdXN0IGNvbXBhcmUgdGhlIGdlbmVyYWwgaXNhJ3MuCi0JIFNvbWUgY29tYmluYXRpb25zIG9mIG1hY2hpbmVzIGFyZSBvaywgaWYgdGhlIGlzYSdzIG1hdGNoLiAqLwotICAgICAgaWYgKCEgbmV3X21hY2ggCi0JICB8fCAhIG9sZF9tYWNoCi0JICB8fCBuZXdfbWFjaCA9PSBvbGRfbWFjaAotCSAgKQotCXsKLQkgIC8qIERvbid0IHdhcm4gYWJvdXQgbWl4aW5nIC1taXBzMSBhbmQgLW1pcHMyIGNvZGUsIG9yIG1peGluZyAtbWlwczMKLQkgICAgIGFuZCAtbWlwczQgY29kZS4gIFRoZXkgd2lsbCBub3JtYWxseSB1c2UgdGhlIHNhbWUgZGF0YSBzaXplcyBhbmQKLQkgICAgIGNhbGxpbmcgY29udmVudGlvbnMuICAqLwotCi0JICBpZiAoKG5ld19pc2EgPT0gMSB8fCBuZXdfaXNhID09IDIpCi0JICAgICAgPyAob2xkX2lzYSAhPSAxICYmIG9sZF9pc2EgIT0gMikKLQkgICAgICA6IChvbGRfaXNhID09IDEgfHwgb2xkX2lzYSA9PSAyKSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoXygiJXM6IElTQSBtaXNtYXRjaCAoLW1pcHMlZCkgd2l0aCBwcmV2aW91cyBtb2R1bGVzICgtbWlwcyVkKSIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwgbmV3X2lzYSwgb2xkX2lzYSk7Ci0JICAgICAgb2sgPSBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IElTQSBtaXNtYXRjaCAoJWQpIHdpdGggcHJldmlvdXMgbW9kdWxlcyAoJWQpIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkgICAgIGVsZl9taXBzX21hY2ggKG5ld19mbGFncyksCi0JICAgICBlbGZfbWlwc19tYWNoIChvbGRfZmxhZ3MpKTsKLQkgIG9rID0gZmFsc2U7Ci0JfQotCi0gICAgICBuZXdfZmxhZ3MgJj0gfiAoRUZfTUlQU19BUkNIIHwgRUZfTUlQU19NQUNIKTsKLSAgICAgIG9sZF9mbGFncyAmPSB+IChFRl9NSVBTX0FSQ0ggfCBFRl9NSVBTX01BQ0gpOwotICAgIH0KLQotICAvKiBDb21wYXJlIEFCSSdzLiAgVGhlIDY0LWJpdCBBQkkgZG9lcyBub3QgdXNlIEVGX01JUFNfQUJJLiAgQnV0LCBpdAotICAgICBkb2VzIHNldCBFSV9DTEFTUyBkaWZmZXJlbnRseSBmcm9tIGFueSAzMi1iaXQgQUJJLiAgKi8KLSAgaWYgKChuZXdfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgIT0gKG9sZF9mbGFncyAmIEVGX01JUFNfQUJJKQotICAgICAgfHwgKGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2lkZW50W0VJX0NMQVNTXSAKLQkgICE9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2lkZW50W0VJX0NMQVNTXSkpCi0gICAgewotICAgICAgLyogT25seSBlcnJvciBpZiBib3RoIGFyZSBzZXQgKHRvIGRpZmZlcmVudCB2YWx1ZXMpLiAqLwotICAgICAgaWYgKCgobmV3X2ZsYWdzICYgRUZfTUlQU19BQkkpICYmIChvbGRfZmxhZ3MgJiBFRl9NSVBTX0FCSSkpCi0JICB8fCAoZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfaWRlbnRbRUlfQ0xBU1NdIAotCSAgICAgICE9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2lkZW50W0VJX0NMQVNTXSkpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogQUJJIG1pc21hdGNoOiBsaW5raW5nICVzIG1vZHVsZSB3aXRoIHByZXZpb3VzICVzIG1vZHVsZXMiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCSAgICAgZWxmX21pcHNfYWJpX25hbWUgKGliZmQpLAotCSAgICAgZWxmX21pcHNfYWJpX25hbWUgKG9iZmQpKTsKLQkgIG9rID0gZmFsc2U7Ci0JfQotICAgICAgbmV3X2ZsYWdzICY9IH5FRl9NSVBTX0FCSTsKLSAgICAgIG9sZF9mbGFncyAmPSB+RUZfTUlQU19BQkk7Ci0gICAgfQotCi0gIC8qIFdhcm4gYWJvdXQgYW55IG90aGVyIG1pc21hdGNoZXMgKi8KLSAgaWYgKG5ld19mbGFncyAhPSBvbGRfZmxhZ3MpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiB1c2VzIGRpZmZlcmVudCBlX2ZsYWdzICgweCVseCkgZmllbGRzIHRoYW4gcHJldmlvdXMgbW9kdWxlcyAoMHglbHgpIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCAodW5zaWduZWQgbG9uZykgbmV3X2ZsYWdzLAotCSAodW5zaWduZWQgbG9uZykgb2xkX2ZsYWdzKTsKLSAgICAgIG9rID0gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIG9rKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBwdHI7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBwdHI7Ci0KLSAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKTsKLQotICAvKiBQcmludCBub3JtYWwgRUxGIHByaXZhdGUgZGF0YS4gICovCi0gIF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cik7Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXyAoInByaXZhdGUgZmxhZ3MgPSAlbHg6IiksIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKTsKLQotICBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpID09IEVfTUlQU19BQklfTzMyKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaT1PMzJdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgPT0gRV9NSVBTX0FCSV9PNjQpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPU82NF0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSA9PSBFX01JUFNfQUJJX0VBQkkzMikKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmk9RUFCSTMyXSIpKTsKLSAgZWxzZSBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpID09IEVfTUlQU19BQklfRUFCSTY0KQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaT1FQUJJNjRdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpIHVua25vd25dIikpOwotICBlbHNlIGlmIChBQklfTjMyX1AgKGFiZmQpKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaT1OMzJdIikpOwotICBlbHNlIGlmIChBQklfNjRfUCAoYWJmZCkpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPTY0XSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW25vIGFiaSBzZXRdIikpOwotCi0gIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzEpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbWlwczFdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzIpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbWlwczJdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzMpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbWlwczNdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzQpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbWlwczRdIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbdW5rbm93biBJU0FdIikpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfMzJCSVRNT0RFKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgWzMyYml0bW9kZV0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtub3QgMzJiaXRtb2RlXSIpKTsKLQotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBIYW5kbGUgYSBNSVBTIHNwZWNpZmljIHNlY3Rpb24gd2hlbiByZWFkaW5nIGFuIG9iamVjdCBmaWxlLiAgVGhpcwotICAgaXMgY2FsbGVkIHdoZW4gZWxmY29kZS5oIGZpbmRzIGEgc2VjdGlvbiB3aXRoIGFuIHVua25vd24gdHlwZS4KLSAgIFRoaXMgcm91dGluZSBzdXBwb3J0cyBib3RoIHRoZSAzMi1iaXQgYW5kIDY0LWJpdCBFTEYgQUJJLgotCi0gICBGSVhNRTogV2UgbmVlZCB0byBoYW5kbGUgdGhlIFNIRl9NSVBTX0dQUkVMIGZsYWcsIGJ1dCBJJ20gbm90IHN1cmUKLSAgIGhvdyB0by4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBjaGFyICpuYW1lOwotewotICBmbGFnd29yZCBmbGFncyA9IDA7Ci0KLSAgLyogVGhlcmUgb3VnaHQgdG8gYmUgYSBwbGFjZSB0byBrZWVwIEVMRiBiYWNrZW5kIHNwZWNpZmljIGZsYWdzLCBidXQKLSAgICAgYXQgdGhlIG1vbWVudCB0aGVyZSBpc24ndCBvbmUuICBXZSBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlCi0gICAgIHNlY3Rpb25zIGJ5IHRoZWlyIG5hbWUsIGluc3RlYWQuICBGb3J0dW5hdGVseSwgdGhlIEFCSSBnaXZlcwotICAgICBzdWdnZXN0ZWQgbmFtZXMgZm9yIGFsbCB0aGUgTUlQUyBzcGVjaWZpYyBzZWN0aW9ucywgc28gd2Ugd2lsbAotICAgICBwcm9iYWJseSBnZXQgYXdheSB3aXRoIHRoaXMuICAqLwotICBzd2l0Y2ggKGhkci0+c2hfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTSFRfTUlQU19MSUJMSVNUOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5saWJsaXN0IikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX01TWU06Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoYWJmZCkpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19DT05GTElDVDoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuY29uZmxpY3QiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfR1BUQUI6Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX1VDT0RFOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi51Y29kZSIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUJVRzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIubWRlYnVnIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmbGFncyA9IFNFQ19ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX1JFR0lORk86Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlZ2luZm8iKSAhPSAwCi0JICB8fCBoZHItPnNoX3NpemUgIT0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmbGFncyA9IChTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19JRkFDRToKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuTUlQUy5pbnRlcmZhY2VzIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0NPTlRFTlQ6Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmNvbnRlbnQiLCBzaXplb2YgIi5NSVBTLmNvbnRlbnQiIC0gMSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX09QVElPTlM6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAoYWJmZCkpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19EV0FSRjoKLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLmRlYnVnXyIsIHNpemVvZiAiLmRlYnVnXyIgLSAxKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfU1lNQk9MX0xJQjoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuTUlQUy5zeW1saWIiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfRVZFTlRTOgotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIuTUlQUy5ldmVudHMiLCBzaXplb2YgIi5NSVBTLmV2ZW50cyIgLSAxKSAhPSAwCi0JICAmJiBzdHJuY21wIChuYW1lLCAiLk1JUFMucG9zdF9yZWwiLAotCQkgICAgICBzaXplb2YgIi5NSVBTLnBvc3RfcmVsIiAtIDEpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGZsYWdzKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgaGRyLT5iZmRfc2VjdGlvbiwKLQkJCQkgICAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLAotCQkJCQkJCSAgIGhkci0+YmZkX3NlY3Rpb24pCi0JCQkJICAgIHwgZmxhZ3MpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBXZSBzaG91bGQgcmVjb3JkIHNoX2luZm8gZm9yIGEgLmdwdGFiIHNlY3Rpb24uICAqLwotCi0gIC8qIEZvciBhIC5yZWdpbmZvIHNlY3Rpb24sIHNldCB0aGUgZ3AgdmFsdWUgaW4gdGhlIHRkYXRhIGluZm9ybWF0aW9uCi0gICAgIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbi4gIFdlIG5lZWQgdGhlIGdwIHZhbHVlIHdoaWxlCi0gICAgIHByb2Nlc3NpbmcgcmVsb2NzLCBzbyB3ZSBqdXN0IGdldCBpdCBub3cuICBUaGUgLnJlZ2luZm8gc2VjdGlvbgotICAgICBpcyBub3QgdXNlZCBpbiB0aGUgNjQtYml0IE1JUFMgRUxGIEFCSS4gICovCi0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX01JUFNfUkVHSU5GTykKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKLSAgICAgIEVsZjMyX1JlZ0luZm8gczsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLCAoUFRSKSAmZXh0LAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2l6ZW9mIGV4dCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX2luIChhYmZkLCAmZXh0LCAmcyk7Ci0gICAgICBlbGZfZ3AgKGFiZmQpID0gcy5yaV9ncF92YWx1ZTsKLSAgICB9Ci0KLSAgLyogRm9yIGEgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLCBsb29rIGZvciBhIE9ES19SRUdJTkZPIGVudHJ5LCBhbmQKLSAgICAgc2V0IHRoZSBncCB2YWx1ZSBiYXNlZCBvbiB3aGF0IHdlIGZpbmQuICBXZSBtYXkgc2VlIGJvdGgKLSAgICAgU0hUX01JUFNfUkVHSU5GTyBhbmQgU0hUX01JUFNfT1BUSU9OUy9PREtfUkVHSU5GTzsgaW4gdGhhdCBjYXNlLAotICAgICB0aGV5IHNob3VsZCBhZ3JlZS4gICovCi0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX01JUFNfT1BUSU9OUykKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqY29udGVudHMsICpsLCAqbGVuZDsKLQotICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaGRyLT5zaF9zaXplKTsKLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaGRyLT5iZmRfc2VjdGlvbiwgY29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBoZHItPnNoX3NpemUpKQotCXsKLQkgIGZyZWUgKGNvbnRlbnRzKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBsID0gY29udGVudHM7Ci0gICAgICBsZW5kID0gY29udGVudHMgKyBoZHItPnNoX3NpemU7Ci0gICAgICB3aGlsZSAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpIDw9IGxlbmQpCi0JewotCSAgRWxmX0ludGVybmFsX09wdGlvbnMgaW50b3B0OwotCi0JICBiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luIChhYmZkLCAoRWxmX0V4dGVybmFsX09wdGlvbnMgKikgbCwKLQkJCQkJJmludG9wdCk7Ci0JICBpZiAoQUJJXzY0X1AgKGFiZmQpICYmIGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQotCSAgICB7Ci0JICAgICAgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyBpbnRyZWc7Ci0KLQkgICAgICBiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9faW4KLQkJKGFiZmQsCi0JCSAoKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKikKLQkJICAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpKSksCi0JCSAmaW50cmVnKTsKLQkgICAgICBlbGZfZ3AgKGFiZmQpID0gaW50cmVnLnJpX2dwX3ZhbHVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbnRvcHQua2luZCA9PSBPREtfUkVHSU5GTykKLQkgICAgewotCSAgICAgIEVsZjMyX1JlZ0luZm8gaW50cmVnOwotCi0JICAgICAgYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX2luCi0JCShhYmZkLAotCQkgKChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICopCi0JCSAgKGwgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKSkpLAotCQkgJmludHJlZyk7Ci0JICAgICAgZWxmX2dwIChhYmZkKSA9IGludHJlZy5yaV9ncF92YWx1ZTsKLQkgICAgfQotCSAgbCArPSBpbnRvcHQuc2l6ZTsKLQl9Ci0gICAgICBmcmVlIChjb250ZW50cyk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGNvcnJlY3QgdHlwZSBmb3IgYSBNSVBTIEVMRiBzZWN0aW9uLiAgV2UgZG8gdGhpcyBieSB0aGUKLSAgIHNlY3Rpb24gbmFtZSwgd2hpY2ggaXMgYSBoYWNrLCBidXQgb3VnaHQgdG8gd29yay4gIFRoaXMgcm91dGluZSBpcwotICAgdXNlZCBieSBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zIChhYmZkLCBoZHIsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICIubGlibGlzdCIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfTElCTElTVDsKLSAgICAgIGhkci0+c2hfaW5mbyA9IHNlYy0+X3Jhd19zaXplIC8gc2l6ZW9mIChFbGYzMl9MaWIpOwotICAgICAgLyogVGhlIHNoX2xpbmsgZmllbGQgaXMgc2V0IGluIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmNvbmZsaWN0IikgPT0gMCkKLSAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19DT05GTElDVDsKLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19HUFRBQjsKLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpOwotICAgICAgLyogVGhlIHNoX2luZm8gZmllbGQgaXMgc2V0IGluIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnVjb2RlIikgPT0gMCkKLSAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19VQ09ERTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLm1kZWJ1ZyIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfREVCVUc7Ci0gICAgICAvKiBJbiBhIHNoYXJlZCBvYmplY3Qgb24gSXJpeCA1LjMsIHRoZSAubWRlYnVnIHNlY3Rpb24gaGFzIGFuCi0gICAgICAgICBlbnRzaXplIG9mIDAuICBGSVhNRTogRG9lcyB0aGlzIG1hdHRlcj8gICovCi0gICAgICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQloZHItPnNoX2VudHNpemUgPSAwOwotICAgICAgZWxzZQotCWhkci0+c2hfZW50c2l6ZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfUkVHSU5GTzsKLSAgICAgIC8qIEluIGEgc2hhcmVkIG9iamVjdCBvbiBJcml4IDUuMywgdGhlIC5yZWdpbmZvIHNlY3Rpb24gaGFzIGFuCi0gICAgICAgICBlbnRzaXplIG9mIDB4MTguICBGSVhNRTogRG9lcyB0aGlzIG1hdHRlcj8gICovCi0gICAgICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQloZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pOwotICAgICAgZWxzZQotCWhkci0+c2hfZW50c2l6ZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChTR0lfQ09NUEFUIChhYmZkKQotCSAgICYmIChzdHJjbXAgKG5hbWUsICIuaGFzaCIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChuYW1lLCAiLmR5bmFtaWMiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5keW5zdHIiKSA9PSAwKSkKLSAgICB7Ci0gICAgICBoZHItPnNoX2VudHNpemUgPSAwOwotI2lmIDAKLSAgICAgIC8qIFRoaXMgaXNuJ3QgaG93IHRoZSBJcml4IDYgbGlua2VyIGJlaGF2ZXMuICAqLwotICAgICAgaGRyLT5zaF9pbmZvID0gU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTOwotI2VuZGlmCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZ290IikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgTUlQU19FTEZfU1JEQVRBX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwKQotICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX01JUFNfR1BSRUw7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLmludGVyZmFjZXMiKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0lGQUNFOwotICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19OT1NUUklQOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmNvbnRlbnQiLCBzdHJsZW4gKCIuTUlQUy5jb250ZW50IikpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfQ09OVEVOVDsKLSAgICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX01JUFNfTk9TVFJJUDsKLSAgICAgIC8qIFRoZSBzaF9pbmZvIGZpZWxkIGlzIHNldCBpbiBmaW5hbF93cml0ZV9wcm9jZXNzaW5nLiAgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKGFiZmQpKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX09QVElPTlM7Ci0gICAgICBoZHItPnNoX2VudHNpemUgPSAxOwotICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19OT1NUUklQOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5kZWJ1Z18iLCBzaXplb2YgIi5kZWJ1Z18iIC0gMSkgPT0gMCkKLSAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19EV0FSRjsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLk1JUFMuc3ltbGliIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19TWU1CT0xfTElCOwotICAgICAgLyogVGhlIHNoX2xpbmsgYW5kIHNoX2luZm8gZmllbGRzIGFyZSBzZXQgaW4KLSAgICAgICAgIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmV2ZW50cyIsIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpID09IDAKLQkgICB8fCBzdHJuY21wIChuYW1lLCAiLk1JUFMucG9zdF9yZWwiLAotCQkgICAgICAgc2l6ZW9mICIuTUlQUy5wb3N0X3JlbCIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0VWRU5UUzsKLSAgICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX01JUFNfTk9TVFJJUDsKLSAgICAgIC8qIFRoZSBzaF9saW5rIGZpZWxkIGlzIHNldCBpbiBmaW5hbF93cml0ZV9wcm9jZXNzaW5nLiAgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKGFiZmQpKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX01TWU07Ci0gICAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDg7Ci0gICAgfQotCi0gIC8qIFRoZSBnZW5lcmljIGVsZl9mYWtlX3NlY3Rpb25zIHdpbGwgc2V0IHVwIFJFTF9IRFIgdXNpbmcgdGhlCi0gICAgIGRlZmF1bHQga2luZCBvZiByZWxvY2F0aW9ucy4gIEJ1dCwgd2UgbWF5IGFjdHVhbGx5IG5lZWQgYm90aAotICAgICBraW5kcyBvZiByZWxvY2F0aW9ucywgc28gd2Ugc2V0IHVwIHRoZSBzZWNvbmQgaGVhZGVyIGhlcmUuICAqLwotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICplc2Q7Ci0KLSAgICAgIGVzZCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyk7Ci0gICAgICBCRkRfQVNTRVJUIChlc2QtPnJlbF9oZHIyID09IE5VTEwpOwotICAgICAgZXNkLT5yZWxfaGRyMiAKLQk9IChFbGZfSW50ZXJuYWxfU2hkciAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyKSk7Ci0gICAgICBpZiAoIWVzZC0+cmVsX2hkcjIpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgX2JmZF9lbGZfaW5pdF9yZWxvY19zaGRyIChhYmZkLCBlc2QtPnJlbF9oZHIyLCBzZWMsCi0JCQkJIWVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnVzZV9yZWxhX3ApOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2l2ZW4gYSBCRkQgc2VjdGlvbiwgdHJ5IHRvIGxvY2F0ZSB0aGUgY29ycmVzcG9uZGluZyBFTEYgc2VjdGlvbgotICAgaW5kZXguICBUaGlzIGlzIHVzZWQgYnkgYm90aCB0aGUgMzItYml0IGFuZCB0aGUgNjQtYml0IEFCSS4KLSAgIEFjdHVhbGx5LCBpdCdzIG5vdCBjbGVhciB0byBtZSB0aGF0IHRoZSA2NC1iaXQgQUJJIHN1cHBvcnRzIHRoZXNlLAotICAgYnV0IGZvciBub24tUElDIG9iamVjdHMgd2Ugd2lsbCBjZXJ0YWlubHkgd2FudCBzdXBwb3J0IGZvciBhdCBsZWFzdAotICAgdGhlIC5zY29tbW9uIHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgaGRyLCBzZWMsIHJldHZhbCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKmhkciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBpbnQgKnJldHZhbDsKLXsKLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuc2NvbW1vbiIpID09IDApCi0gICAgewotICAgICAgKnJldHZhbCA9IFNITl9NSVBTX1NDT01NT047Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLmFjb21tb24iKSA9PSAwKQotICAgIHsKLSAgICAgICpyZXR2YWwgPSBTSE5fTUlQU19BQ09NTU9OOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFdoZW4gYXJlIHdyaXRpbmcgb3V0IHRoZSAub3B0aW9ucyBvciAuTUlQUy5vcHRpb25zIHNlY3Rpb24sCi0gICByZW1lbWJlciB0aGUgYnl0ZXMgd2UgYXJlIHdyaXRpbmcgb3V0LCBzbyB0aGF0IHdlIGNhbiBpbnN0YWxsIHRoZQotICAgR1AgdmFsdWUgaW4gdGhlIHNlY3Rpb25fcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgTUlQU19FTEZfT1BUSU9OU19TRUNUSU9OX05BTUUgKGFiZmQpKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjOwotCi0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbikgPT0gTlVMTCkKLQl7Ci0JICBzZWN0aW9uLT51c2VkX2J5X2JmZCA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKSk7Ci0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbikgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGMgPSAoYmZkX2J5dGUgKikgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRkYXRhOwotICAgICAgaWYgKGMgPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLQkgIGlmIChzZWN0aW9uLT5fY29va2VkX3NpemUgIT0gMCkKLQkgICAgc2l6ZSA9IHNlY3Rpb24tPl9jb29rZWRfc2l6ZTsKLQkgIGVsc2UKLQkgICAgc2l6ZSA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLQkgIGMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZSk7Ci0JICBpZiAoYyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGRhdGEgPSAoUFRSKSBjOwotCX0KLQotICAgICAgbWVtY3B5IChjICsgb2Zmc2V0LCBsb2NhdGlvbiwgY291bnQpOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsCi0JCQkJCWNvdW50KTsKLX0KLQotLyogV29yayBvdmVyIGEgc2VjdGlvbiBqdXN0IGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIFRoaXMgcm91dGluZSBpcwotICAgdXNlZCBieSBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLiAgRklYTUU6IFdlIHJlY29nbml6ZQotICAgc2VjdGlvbnMgdGhhdCBuZWVkIHRoZSBTSEZfTUlQU19HUFJFTCBmbGFnIGJ5IG5hbWU7IHRoZXJlIGhhcyB0byBiZQotICAgYSBiZXR0ZXIgd2F5LiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcgKGFiZmQsIGhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotewotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9NSVBTX1JFR0lORk8KLSAgICAgICYmIGhkci0+c2hfc2l6ZSA+IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYnVmWzRdOwotCi0gICAgICBCRkRfQVNTRVJUIChoZHItPnNoX3NpemUgPT0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSk7Ci0gICAgICBCRkRfQVNTRVJUIChoZHItPmNvbnRlbnRzID09IE5VTEwpOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICBoZHItPnNoX29mZnNldCArIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykgLSA0LAotCQkgICAgU0VFS19TRVQpID09IC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGVsZl9ncCAoYWJmZCksIGJ1Zik7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChidWYsIChiZmRfc2l6ZV90eXBlKSAxLCAoYmZkX3NpemVfdHlwZSkgNCwgYWJmZCkgIT0gNCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX01JUFNfT1BUSU9OUwotICAgICAgJiYgaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAmJiBlbGZfc2VjdGlvbl9kYXRhIChoZHItPmJmZF9zZWN0aW9uKSAhPSBOVUxMCi0gICAgICAmJiBlbGZfc2VjdGlvbl9kYXRhIChoZHItPmJmZF9zZWN0aW9uKS0+dGRhdGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqY29udGVudHMsICpsLCAqbGVuZDsKLQotICAgICAgLyogV2Ugc3RvcmVkIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGluIHRoZSBlbGZfc2VjdGlvbl9kYXRhIHRkYXRhCi0JIGZpZWxkIGluIHRoZSBzZXRfc2VjdGlvbl9jb250ZW50cyByb3V0aW5lLiAgV2Ugc2F2ZSB0aGUKLQkgc2VjdGlvbiBjb250ZW50cyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcmVhZCB0aGVtIGFnYWluLgotCSBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBlbGZfZ3AgaXMgc2V0LCBzbyB3ZSBjYW4gbG9vawotCSB0aHJvdWdoIHRoZSBzZWN0aW9uIGNvbnRlbnRzIHRvIHNlZSBpZiB0aGVyZSBpcyBhbgotCSBPREtfUkVHSU5GTyBzdHJ1Y3R1cmUuICAqLwotCi0gICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBlbGZfc2VjdGlvbl9kYXRhIChoZHItPmJmZF9zZWN0aW9uKS0+dGRhdGE7Ci0gICAgICBsID0gY29udGVudHM7Ci0gICAgICBsZW5kID0gY29udGVudHMgKyBoZHItPnNoX3NpemU7Ci0gICAgICB3aGlsZSAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpIDw9IGxlbmQpCi0JewotCSAgRWxmX0ludGVybmFsX09wdGlvbnMgaW50b3B0OwotCi0JICBiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luIChhYmZkLCAoRWxmX0V4dGVybmFsX09wdGlvbnMgKikgbCwKLQkJCQkJJmludG9wdCk7Ci0JICBpZiAoQUJJXzY0X1AgKGFiZmQpICYmIGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgYnVmWzhdOwotCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkJICAgIChoZHItPnNoX29mZnNldAotCQkJICAgICArIChsIC0gY29udGVudHMpCi0JCQkgICAgICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykKLQkJCSAgICAgKyAoc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKSAtIDgpKSwKLQkJCSAgICAgU0VFS19TRVQpID09IC0xKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYmZkX2hfcHV0XzY0IChhYmZkLCBlbGZfZ3AgKGFiZmQpLCBidWYpOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgOCwgYWJmZCkgIT0gOCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbnRvcHQua2luZCA9PSBPREtfUkVHSU5GTykKLQkgICAgewotCSAgICAgIGJmZF9ieXRlIGJ1Zls0XTsKLQotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJCSAgICAoaGRyLT5zaF9vZmZzZXQKLQkJCSAgICAgKyAobCAtIGNvbnRlbnRzKQotCQkJICAgICArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpCi0JCQkgICAgICsgKHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykgLSA0KSksCi0JCQkgICAgIFNFRUtfU0VUKSA9PSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZWxmX2dwIChhYmZkKSwgYnVmKTsKLQkgICAgICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDQsIGFiZmQpICE9IDQpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgbCArPSBpbnRvcHQuc2l6ZTsKLQl9Ci0gICAgfQotCi0gIGlmIChoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uKTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDAKLQkgIHx8IHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMAotCSAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCXsKLQkgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DIHwgU0hGX1dSSVRFIHwgU0hGX01JUFNfR1BSRUw7Ci0JICBoZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCXsKLQkgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DIHwgU0hGX1dSSVRFIHwgU0hGX01JUFNfR1BSRUw7Ci0JICBoZHItPnNoX3R5cGUgPSBTSFRfTk9CSVRTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgTUlQU19FTEZfU1JEQVRBX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0MgfCBTSEZfTUlQU19HUFJFTDsKLQkgIGhkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuY29tcGFjdF9yZWwiKSA9PSAwKQotCXsKLQkgIGhkci0+c2hfZmxhZ3MgPSAwOwotCSAgaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5ydHByb2MiKSA9PSAwKQotCXsKLQkgIGlmIChoZHItPnNoX2FkZHJhbGlnbiAhPSAwICYmIGhkci0+c2hfZW50c2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGFkanVzdDsKLQotCSAgICAgIGFkanVzdCA9IGhkci0+c2hfc2l6ZSAlIGhkci0+c2hfYWRkcmFsaWduOwotCSAgICAgIGlmIChhZGp1c3QgIT0gMCkKLQkJaGRyLT5zaF9zaXplICs9IGhkci0+c2hfYWRkcmFsaWduIC0gYWRqdXN0OwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogTUlQUyBFTEYgdXNlcyB0d28gY29tbW9uIHNlY3Rpb25zLiAgT25lIGlzIHRoZSB1c3VhbCBvbmUsIGFuZCB0aGUKLSAgIG90aGVyIGlzIGZvciBzbWFsbCBvYmplY3RzLiAgQWxsIHRoZSBzbWFsbCBvYmplY3RzIGFyZSBrZXB0Ci0gICB0b2dldGhlciwgYW5kIHRoZW4gcmVmZXJlbmNlZCB2aWEgdGhlIGdwIHBvaW50ZXIsIHdoaWNoIHlpZWxkcwotICAgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgVGhpcyBpcyB3aGF0IHdlIHVzZSBmb3IgdGhlIHNtYWxsIGNvbW1vbgotICAgc2VjdGlvbi4gIFRoaXMgYXBwcm9hY2ggaXMgY29waWVkIGZyb20gZWNvZmYuYy4gICovCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfc2NvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfc2NvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfc2NvbV9zeW1ib2xfcHRyOwotCi0vKiBNSVBTIEVMRiBhbHNvIHVzZXMgYW4gYWNvbW1vbiBzZWN0aW9uLCB3aGljaCByZXByZXNlbnRzIGFuCi0gICBhbGxvY2F0ZWQgY29tbW9uIHN5bWJvbCB3aGljaCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBhCi0gICBkZWZpbml0aW9uIGluIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotc3RhdGljIGFzZWN0aW9uIG1pcHNfZWxmX2Fjb21fc2VjdGlvbjsKLXN0YXRpYyBhc3ltYm9sIG1pcHNfZWxmX2Fjb21fc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKm1pcHNfZWxmX2Fjb21fc3ltYm9sX3B0cjsKLQotLyogVGhlIElyaXggNSBzdXBwb3J0IHVzZXMgdHdvIHZpcnR1YWwgc2VjdGlvbnMsIHdoaWNoIHJlcHJlc2VudAotICAgdGV4dC9kYXRhIHN5bWJvbHMgZGVmaW5lZCBpbiBkeW5hbWljIG9iamVjdHMuICAqLwotc3RhdGljIGFzZWN0aW9uIG1pcHNfZWxmX3RleHRfc2VjdGlvbjsKLXN0YXRpYyBhc2VjdGlvbiAqbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0cjsKLXN0YXRpYyBhc3ltYm9sIG1pcHNfZWxmX3RleHRfc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKm1pcHNfZWxmX3RleHRfc3ltYm9sX3B0cjsKLQotc3RhdGljIGFzZWN0aW9uIG1pcHNfZWxmX2RhdGFfc2VjdGlvbjsKLXN0YXRpYyBhc2VjdGlvbiAqbWlwc19lbGZfZGF0YV9zZWN0aW9uX3B0cjsKLXN0YXRpYyBhc3ltYm9sIG1pcHNfZWxmX2RhdGFfc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKm1pcHNfZWxmX2RhdGFfc3ltYm9sX3B0cjsKLQotLyogSGFuZGxlIHRoZSBzcGVjaWFsIE1JUFMgc2VjdGlvbiBudW1iZXJzIHRoYXQgYSBzeW1ib2wgbWF5IHVzZS4KLSAgIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUgMzItYml0IGFuZCB0aGUgNjQtYml0IEFCSS4gICovCi0KLXZvaWQKLV9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcgKGFiZmQsIGFzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqYXN5bTsKLXsKLSAgZWxmX3N5bWJvbF90eXBlICplbGZzeW07Ci0KLSAgZWxmc3ltID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBhc3ltOwotICBzd2l0Y2ggKGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaG5keCkKLSAgICB7Ci0gICAgY2FzZSBTSE5fTUlQU19BQ09NTU9OOgotICAgICAgLyogVGhpcyBzZWN0aW9uIGlzIHVzZWQgaW4gYSBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZSBmaWxlLgotCSBJdCBpcyBhbiBhbGxvY2F0ZWQgY29tbW9uIHNlY3Rpb24uICBUaGUgZHluYW1pYyBsaW5rZXIgY2FuCi0JIGVpdGhlciByZXNvbHZlIHRoZXNlIHN5bWJvbHMgdG8gc29tZXRoaW5nIGluIGEgc2hhcmVkCi0JIGxpYnJhcnksIG9yIGl0IGNhbiBqdXN0IGxlYXZlIHRoZW0gaGVyZS4gIEZvciBvdXIgcHVycG9zZXMsCi0JIHdlIGNhbiBjb25zaWRlciB0aGVzZSBzeW1ib2xzIHRvIGJlIGluIGEgbmV3IHNlY3Rpb24uICAqLwotICAgICAgaWYgKG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgYWNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5uYW1lID0gIi5hY29tbW9uIjsKLQkgIG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5mbGFncyA9IFNFQ19BTExPQzsKLQkgIG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICZtaXBzX2VsZl9hY29tX3NlY3Rpb247Ci0JICBtaXBzX2VsZl9hY29tX3NlY3Rpb24uc3ltYm9sID0gJm1pcHNfZWxmX2Fjb21fc3ltYm9sOwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJm1pcHNfZWxmX2Fjb21fc3ltYm9sX3B0cjsKLQkgIG1pcHNfZWxmX2Fjb21fc3ltYm9sLm5hbWUgPSAiLmFjb21tb24iOwotCSAgbWlwc19lbGZfYWNvbV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICBtaXBzX2VsZl9hY29tX3N5bWJvbC5zZWN0aW9uID0gJm1pcHNfZWxmX2Fjb21fc2VjdGlvbjsKLQkgIG1pcHNfZWxmX2Fjb21fc3ltYm9sX3B0ciA9ICZtaXBzX2VsZl9hY29tX3N5bWJvbDsKLQl9Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gJm1pcHNfZWxmX2Fjb21fc2VjdGlvbjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fQ09NTU9OOgotICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbGVzcyB0aGFuIHRoZSBHUCBzaXplIGFyZSBhdXRvbWF0aWNhbGx5Ci0JIHRyZWF0ZWQgYXMgU0hOX01JUFNfU0NPTU1PTiBzeW1ib2xzIG9uIElSSVg1LiAgKi8KLSAgICAgIGlmIChhc3ltLT52YWx1ZSA+IGVsZl9ncF9zaXplIChhYmZkKQotCSAgfHwgSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NikKLQlicmVhazsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBTSE5fTUlQU19TQ09NTU9OOgotICAgICAgaWYgKG1pcHNfZWxmX3Njb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgc21hbGwgY29tbW9uIHNlY3Rpb24uICAqLwotCSAgbWlwc19lbGZfc2NvbV9zZWN0aW9uLm5hbWUgPSAiLnNjb21tb24iOwotCSAgbWlwc19lbGZfc2NvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0lTX0NPTU1PTjsKLQkgIG1pcHNfZWxmX3Njb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICZtaXBzX2VsZl9zY29tX3NlY3Rpb247Ci0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sID0gJm1pcHNfZWxmX3Njb21fc3ltYm9sOwotCSAgbWlwc19lbGZfc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJm1pcHNfZWxmX3Njb21fc3ltYm9sX3B0cjsKLQkgIG1pcHNfZWxmX3Njb21fc3ltYm9sLm5hbWUgPSAiLnNjb21tb24iOwotCSAgbWlwc19lbGZfc2NvbV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICBtaXBzX2VsZl9zY29tX3N5bWJvbC5zZWN0aW9uID0gJm1pcHNfZWxmX3Njb21fc2VjdGlvbjsKLQkgIG1pcHNfZWxmX3Njb21fc3ltYm9sX3B0ciA9ICZtaXBzX2VsZl9zY29tX3N5bWJvbDsKLQl9Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gJm1pcHNfZWxmX3Njb21fc2VjdGlvbjsKLSAgICAgIGFzeW0tPnZhbHVlID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hOX01JUFNfU1VOREVGSU5FRDoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0KLSNpZiAwIC8qIGZvciBTR0lfQ09NUEFUICovCi0gICAgY2FzZSBTSE5fTUlQU19URVhUOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IG1pcHNfZWxmX3RleHRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hOX01JUFNfREFUQToKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICB9Ci19Ci0MCi0vKiBXaGVuIGNyZWF0aW5nIGFuIElyaXggNSBleGVjdXRhYmxlLCB3ZSBuZWVkIFJFR0lORk8gYW5kIFJUUFJPQwotICAgc2VnbWVudHMuICAqLwotCi1pbnQKLV9iZmRfbWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGludCByZXQgPSAwOwotCi0gIGlmICghU0dJX0NPTVBBVCAoYWJmZCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogU2VlIGlmIHdlIG5lZWQgYSBQVF9NSVBTX1JFR0lORk8gc2VnbWVudC4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWdpbmZvIik7Ci0gIGlmIChzICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSkKLSAgICArK3JldDsKLQotICAvKiBTZWUgaWYgd2UgbmVlZCBhIFBUX01JUFNfT1BUSU9OUyBzZWdtZW50LiAgKi8KLSAgaWYgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDYKLSAgICAgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAKLQkJCQkgIE1JUFNfRUxGX09QVElPTlNfU0VDVElPTl9OQU1FIChhYmZkKSkpCi0gICAgKytyZXQ7Ci0KLSAgLyogU2VlIGlmIHdlIG5lZWQgYSBQVF9NSVBTX1JUUFJPQyBzZWdtZW50LiAgKi8KLSAgaWYgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDUKLSAgICAgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKQotICAgICAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubWRlYnVnIikpCi0gICAgKytyZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogTW9kaWZ5IHRoZSBzZWdtZW50IG1hcCBmb3IgYW4gSXJpeCA1IGV4ZWN1dGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbSwgKipwbTsKLQotICBpZiAoISBTR0lfQ09NUEFUIChhYmZkKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGVyZSBpcyBhIC5yZWdpbmZvIHNlY3Rpb24sIHdlIG5lZWQgYSBQVF9NSVBTX1JFR0lORk8KLSAgICAgc2VnbWVudC4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWdpbmZvIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgewotICAgICAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0JaWYgKG0tPnBfdHlwZSA9PSBQVF9NSVBTX1JFR0lORk8pCi0JICBicmVhazsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JewotCSAgbSA9IChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAqbSk7Ci0JICBpZiAobSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIG0tPnBfdHlwZSA9IFBUX01JUFNfUkVHSU5GTzsKLQkgIG0tPmNvdW50ID0gMTsKLQkgIG0tPnNlY3Rpb25zWzBdID0gczsKLQotCSAgLyogV2Ugd2FudCB0byBwdXQgaXQgYWZ0ZXIgdGhlIFBIRFIgYW5kIElOVEVSUCBzZWdtZW50cy4gICovCi0JICBwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsKLQkgIHdoaWxlICgqcG0gIT0gTlVMTAotCQkgJiYgKCgqcG0pLT5wX3R5cGUgPT0gUFRfUEhEUgotCQkgICAgIHx8ICgqcG0pLT5wX3R5cGUgPT0gUFRfSU5URVJQKSkKLQkgICAgcG0gPSAmKCpwbSktPm5leHQ7Ci0KLQkgIG0tPm5leHQgPSAqcG07Ci0JICAqcG0gPSBtOwotCX0KLSAgICB9Ci0KLSAgLyogRm9yIElSSVggNiwgd2UgZG9uJ3QgaGF2ZSAubWRlYnVnIHNlY3Rpb25zLCBub3IgZG9lcyBhbnl0aGluZyBidXQKLSAgICAgLmR5bmFtaWMgZW5kIHVwIGluIFBUX0RZTkFNSUMuICBIb3dldmVyLCB3ZSBkbyBoYXZlIHRvIGluc2VydCBhCi0gICAgIFBUX09QVElPTlMgc2VnZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBwcm9ncmFtIGhlYWRlcgotICAgICB0YWJsZS4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0JaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9NSVBTX09QVElPTlMpCi0JICBicmVhazsKLQotICAgICAgaWYgKHMpCi0JewotCSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqb3B0aW9uc19zZWdtZW50OwotCi0JICAvKiBVc3VhbGx5LCB0aGVyZSdzIGEgcHJvZ3JhbSBoZWFkZXIgdGFibGUuICBCdXQsIHNvbWV0aW1lcwotCSAgICAgdGhlcmUncyBub3QgKGxpa2Ugd2hlbiBydW5uaW5nIHRoZSBgbGQnIHRlc3RzdWl0ZSkuICBTbywKLQkgICAgIGlmIHRoZXJlJ3Mgbm8gcHJvZ3JhbSBoZWFkZXIgdGFibGUsIHdlIGp1c3QgcHV0IHRoZQotCSAgICAgb3B0aW9ucyBzZWdlbWVudCBhdCB0aGUgZW5kLiAgKi8KLQkgIGZvciAocG0gPSAmZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IAotCSAgICAgICAqcG0gIT0gTlVMTDsKLQkgICAgICAgcG0gPSAmKCpwbSktPm5leHQpCi0JICAgIGlmICgoKnBtKS0+cF90eXBlID09IFBUX1BIRFIpCi0JICAgICAgYnJlYWs7Ci0KLQkgIG9wdGlvbnNfc2VnbWVudCA9IGJmZF96YWxsb2MgKGFiZmQsIAotCQkJCQlzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApKTsKLQkgIG9wdGlvbnNfc2VnbWVudC0+bmV4dCA9ICpwbTsKLQkgIG9wdGlvbnNfc2VnbWVudC0+cF90eXBlID0gUFRfTUlQU19PUFRJT05TOwotCSAgb3B0aW9uc19zZWdtZW50LT5wX2ZsYWdzID0gUEZfUjsKLQkgIG9wdGlvbnNfc2VnbWVudC0+cF9mbGFnc192YWxpZCA9IHRydWU7Ci0JICBvcHRpb25zX3NlZ21lbnQtPmNvdW50ID0gMTsKLQkgIG9wdGlvbnNfc2VnbWVudC0+c2VjdGlvbnNbMF0gPSBzOwotCSAgKnBtID0gb3B0aW9uc19zZWdtZW50OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJZiB0aGVyZSBhcmUgLmR5bmFtaWMgYW5kIC5tZGVidWcgc2VjdGlvbnMsIHdlIG1ha2UgYSByb29tCi0JIGZvciB0aGUgUlRQUk9DIGhlYWRlci4gIEZJWE1FOiBSZXdyaXRlIHdpdGhvdXQgc2VjdGlvbiBuYW1lcy4gICovCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaW50ZXJwIikgPT0gTlVMTAotCSAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpICE9IE5VTEwKLQkgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLm1kZWJ1ZyIpICE9IE5VTEwpCi0JewotCSAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0JICAgIGlmIChtLT5wX3R5cGUgPT0gUFRfTUlQU19SVFBST0MpCi0JICAgICAgYnJlYWs7Ci0JICBpZiAobSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbSA9IChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAqbSk7Ci0JICAgICAgaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgbS0+cF90eXBlID0gUFRfTUlQU19SVFBST0M7Ci0KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucnRwcm9jIik7Ci0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJewotCQkgIG0tPmNvdW50ID0gMDsKLQkJICBtLT5wX2ZsYWdzID0gMDsKLQkJICBtLT5wX2ZsYWdzX3ZhbGlkID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG0tPmNvdW50ID0gMTsKLQkJICBtLT5zZWN0aW9uc1swXSA9IHM7Ci0JCX0KLQotCSAgICAgIC8qIFdlIHdhbnQgdG8gcHV0IGl0IGFmdGVyIHRoZSBEWU5BTUlDIHNlZ21lbnQuICAqLwotCSAgICAgIHBtID0gJmVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOwotCSAgICAgIHdoaWxlICgqcG0gIT0gTlVMTCAmJiAoKnBtKS0+cF90eXBlICE9IFBUX0RZTkFNSUMpCi0JCXBtID0gJigqcG0pLT5uZXh0OwotCSAgICAgIGlmICgqcG0gIT0gTlVMTCkKLQkJcG0gPSAmKCpwbSktPm5leHQ7Ci0KLQkgICAgICBtLT5uZXh0ID0gKnBtOwotCSAgICAgICpwbSA9IG07Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIE9uIElyaXggNSwgdGhlIFBUX0RZTkFNSUMgc2VnbWVudCBpbmNsdWRlcyB0aGUgLmR5bmFtaWMsCi0JIC5keW5zdHIsIC5keW5zeW0sIGFuZCAuaGFzaCBzZWN0aW9ucywgYW5kIGV2ZXJ5dGhpbmcgaW4KLQkgYmV0d2Vlbi4gICovCi0gICAgICBmb3IgKHBtID0gJmVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOyAqcG0gIT0gTlVMTDsgcG0gPSAmKCpwbSktPm5leHQpCi0JaWYgKCgqcG0pLT5wX3R5cGUgPT0gUFRfRFlOQU1JQykKLQkgIGJyZWFrOwotICAgICAgbSA9ICpwbTsKLSAgICAgIGlmIChtICE9IE5VTEwKLQkgICYmIG0tPmNvdW50ID09IDEKLQkgICYmIHN0cmNtcCAobS0+c2VjdGlvbnNbMF0tPm5hbWUsICIuZHluYW1pYyIpID09IDApCi0JewotCSAgc3RhdGljIGNvbnN0IGNoYXIgKnNlY19uYW1lc1tdID0KLQkgIHsgIi5keW5hbWljIiwgIi5keW5zdHIiLCAiLmR5bnN5bSIsICIuaGFzaCIgfTsKLQkgIGJmZF92bWEgbG93LCBoaWdoOwotCSAgdW5zaWduZWQgaW50IGksIGM7Ci0JICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICpuOwotCi0JICBsb3cgPSAweGZmZmZmZmZmOwotCSAgaGlnaCA9IDA7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIHNlY19uYW1lcyAvIHNpemVvZiBzZWNfbmFtZXNbMF07IGkrKykKLQkgICAgewotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc2VjX25hbWVzW2ldKTsKLQkgICAgICBpZiAocyAhPSBOVUxMICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwKQotCQl7Ci0JCSAgYmZkX3NpemVfdHlwZSBzejsKLQotCQkgIGlmIChsb3cgPiBzLT52bWEpCi0JCSAgICBsb3cgPSBzLT52bWE7Ci0JCSAgc3ogPSBzLT5fY29va2VkX3NpemU7Ci0JCSAgaWYgKHN6ID09IDApCi0JCSAgICBzeiA9IHMtPl9yYXdfc2l6ZTsKLQkJICBpZiAoaGlnaCA8IHMtPnZtYSArIHN6KQotCQkgICAgaGlnaCA9IHMtPnZtYSArIHN6OwotCQl9Ci0JICAgIH0KLQotCSAgYyA9IDA7Ci0JICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwCi0JCSYmIHMtPnZtYSA+PSBsb3cKLQkJJiYgKChzLT52bWEKLQkJICAgICArIChzLT5fY29va2VkX3NpemUgIT0gMCA/IHMtPl9jb29rZWRfc2l6ZSA6IHMtPl9yYXdfc2l6ZSkpCi0JCSAgICA8PSBoaWdoKSkKLQkgICAgICArK2M7Ci0KLQkgIG4gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKLQkgICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICpuICsgKGMgLSAxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICpuID0gKm07Ci0JICBuLT5jb3VudCA9IGM7Ci0KLQkgIGkgPSAwOwotCSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKLQkJICAmJiBzLT52bWEgPj0gbG93Ci0JCSAgJiYgKChzLT52bWEKLQkJICAgICAgICsgKHMtPl9jb29rZWRfc2l6ZSAhPSAwID8KLQkJCSAgcy0+X2Nvb2tlZF9zaXplIDogcy0+X3Jhd19zaXplKSkKLQkJICAgICAgPD0gaGlnaCkpCi0JCXsKLQkJICBuLT5zZWN0aW9uc1tpXSA9IHM7Ci0JCSAgKytpOwotCQl9Ci0JICAgIH0KLQotCSAgKnBtID0gbjsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhlIHN0cnVjdHVyZSBvZiB0aGUgcnVudGltZSBwcm9jZWR1cmUgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IHRoZQotICAgbG9hZGVyIGZvciB1c2UgYnkgdGhlIHN0YXRpYyBleGNlcHRpb24gc3lzdGVtLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgcnVudGltZV9wZHIgewotCWJmZF92bWEJYWRyOwkJLyogbWVtb3J5IGFkZHJlc3Mgb2Ygc3RhcnQgb2YgcHJvY2VkdXJlICovCi0JbG9uZwlyZWdtYXNrOwkvKiBzYXZlIHJlZ2lzdGVyIG1hc2sgKi8KLQlsb25nCXJlZ29mZnNldDsJLyogc2F2ZSByZWdpc3RlciBvZmZzZXQgKi8KLQlsb25nCWZyZWdtYXNrOwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG1hc2sgKi8KLQlsb25nCWZyZWdvZmZzZXQ7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JbG9uZwlmcmFtZW9mZnNldDsJLyogZnJhbWUgc2l6ZSAqLwotCXNob3J0CWZyYW1lcmVnOwkvKiBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyICovCi0Jc2hvcnQJcGNyZWc7CQkvKiBvZmZzZXQgb3IgcmVnIG9mIHJldHVybiBwYyAqLwotCWxvbmcJaXJwc3M7CQkvKiBpbmRleCBpbnRvIHRoZSBydW50aW1lIHN0cmluZyB0YWJsZSAqLwotCWxvbmcJcmVzZXJ2ZWQ7Ci0Jc3RydWN0IGV4Y2VwdGlvbl9pbmZvICpleGNlcHRpb25faW5mbzsvKiBwb2ludGVyIHRvIGV4Y2VwdGlvbiBhcnJheSAqLwotfSBSUERSLCAqcFJQRFI7Ci0jZGVmaW5lIGNiUlBEUiBzaXplb2YoUlBEUikKLSNkZWZpbmUgcnBkTmlsICgocFJQRFIpIDApCi0KLS8qIFN3YXAgUlBEUiAocnVudGltZSBwcm9jZWR1cmUgdGFibGUgZW50cnkpIGZvciBvdXRwdXQuICAqLwotCi1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3JwZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBSUERSICosIHN0cnVjdCBycGRyX2V4dCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3JwZHJfb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgUlBEUiAqaW47Ci0gICAgIHN0cnVjdCBycGRyX2V4dCAqZXg7Ci17Ci0gIC8qIGVjb2ZmX3B1dF9vZmYgd2FzIGRlZmluZWQgaW4gZWNvZmZzd2FwLmguICAqLwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbi0+YWRyLCAoYmZkX2J5dGUgKikgZXgtPnBfYWRyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+cmVnbWFzaywgKGJmZF9ieXRlICopIGV4LT5wX3JlZ21hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5yZWdvZmZzZXQsIChiZmRfYnl0ZSAqKSBleC0+cF9yZWdvZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5mcmVnbWFzaywgKGJmZF9ieXRlICopIGV4LT5wX2ZyZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+ZnJlZ29mZnNldCwgKGJmZF9ieXRlICopIGV4LT5wX2ZyZWdvZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5mcmFtZW9mZnNldCwgKGJmZF9ieXRlICopIGV4LT5wX2ZyYW1lb2Zmc2V0KTsKLQotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT5mcmFtZXJlZywgKGJmZF9ieXRlICopIGV4LT5wX2ZyYW1lcmVnKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+cGNyZWcsIChiZmRfYnl0ZSAqKSBleC0+cF9wY3JlZyk7Ci0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+aXJwc3MsIChiZmRfYnl0ZSAqKSBleC0+cF9pcnBzcyk7Ci0jaWYgMCAvKiBGSVhNRSAqLwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbi0+ZXhjZXB0aW9uX2luZm8sIChiZmRfYnl0ZSAqKSBleC0+cF9leGNlcHRpb25faW5mbyk7Ci0jZW5kaWYKLX0KLQwKLS8qIFJlYWQgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSAubWRlYnVnIHNlY3Rpb24gaW50byBhCi0gICBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvIChhYmZkLCBzZWN0aW9uLCBkZWJ1ZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotewotICBIRFJSICpzeW1oZHI7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICBjaGFyICpleHRfaGRyID0gTlVMTDsKLQotICBzd2FwID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotICBtZW1zZXQgKGRlYnVnLCAwLCBzaXplb2YoKmRlYnVnKSk7Ci0KLSAgZXh0X2hkciA9IChjaGFyICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplKTsKLSAgaWYgKGV4dF9oZHIgPT0gTlVMTCAmJiBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGV4dF9oZHIsIChmaWxlX3B0cikgMCwKLQkJCQlzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSkKLSAgICAgID09IGZhbHNlKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICAoKnN3YXAtPnN3YXBfaGRyX2luKSAoYWJmZCwgZXh0X2hkciwgc3ltaGRyKTsKLQotICAvKiBUaGUgc3ltYm9saWMgaGVhZGVyIGNvbnRhaW5zIGFic29sdXRlIGZpbGUgb2Zmc2V0cyBhbmQgc2l6ZXMgdG8KLSAgICAgcmVhZC4gICovCi0jZGVmaW5lIFJFQUQocHRyLCBvZmZzZXQsIGNvdW50LCBzaXplLCB0eXBlKQkJCQlcCi0gIGlmIChzeW1oZHItPmNvdW50ID09IDApCQkJCQkJXAotICAgIGRlYnVnLT5wdHIgPSBOVUxMOwkJCQkJCQlcCi0gIGVsc2UJCQkJCQkJCQlcCi0gICAgewkJCQkJCQkJCVwKLSAgICAgIGRlYnVnLT5wdHIgPSAodHlwZSkgYmZkX21hbGxvYyAoKHNpemVfdCkgKHNpemUgKiBzeW1oZHItPmNvdW50KSk7CVwKLSAgICAgIGlmIChkZWJ1Zy0+cHRyID09IE5VTEwpCQkJCQkJXAotCWdvdG8gZXJyb3JfcmV0dXJuOwkJCQkJCVwKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBzeW1oZHItPm9mZnNldCwgU0VFS19TRVQpICE9IDAJXAotCSAgfHwgKGJmZF9yZWFkIChkZWJ1Zy0+cHRyLCBzaXplLCBzeW1oZHItPmNvdW50LAkJXAotCQkJYWJmZCkgIT0gc2l6ZSAqIHN5bWhkci0+Y291bnQpKQkJCVwKLQlnb3RvIGVycm9yX3JldHVybjsJCQkJCQlcCi0gICAgfQotCi0gIFJFQUQgKGxpbmUsIGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpLCB1bnNpZ25lZCBjaGFyICopOwotICBSRUFEIChleHRlcm5hbF9kbnIsIGNiRG5PZmZzZXQsIGlkbk1heCwgc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3BkciwgY2JQZE9mZnNldCwgaXBkTWF4LCBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfc3ltLCBjYlN5bU9mZnNldCwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX29wdCwgY2JPcHRPZmZzZXQsIGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9hdXgsIGNiQXV4T2Zmc2V0LCBpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpLAotCXVuaW9uIGF1eF9leHQgKik7Ci0gIFJFQUQgKHNzLCBjYlNzT2Zmc2V0LCBpc3NNYXgsIHNpemVvZiAoY2hhciksIGNoYXIgKik7Ci0gIFJFQUQgKHNzZXh0LCBjYlNzRXh0T2Zmc2V0LCBpc3NFeHRNYXgsIHNpemVvZiAoY2hhciksIGNoYXIgKik7Ci0gIFJFQUQgKGV4dGVybmFsX2ZkciwgY2JGZE9mZnNldCwgaWZkTWF4LCBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfcmZkLCBjYlJmZE9mZnNldCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX2V4dCwgY2JFeHRPZmZzZXQsIGlleHRNYXgsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplLCBQVFIpOwotI3VuZGVmIFJFQUQKLQotICBkZWJ1Zy0+ZmRyID0gTlVMTDsKLSAgZGVidWctPmFkanVzdCA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChleHRfaGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0X2hkcik7Ci0gIGlmIChkZWJ1Zy0+bGluZSAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5saW5lKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9kbnIgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9wZHIgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcGRyKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9zeW0gIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9vcHQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0KTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9hdXggIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4KTsKLSAgaWYgKGRlYnVnLT5zcyAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5zcyk7Ci0gIGlmIChkZWJ1Zy0+c3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+c3NleHQpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2ZkciAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9mZHIpOwotICBpZiAoZGVidWctPmV4dGVybmFsX3JmZCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9yZmQpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9leHQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBNSVBTIEVMRiBsb2NhbCBsYWJlbHMgc3RhcnQgd2l0aCAnJCcsIG5vdCAnTCcuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICckJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBPbiBJcml4IDYsIHRoZSBsYWJlbHMgZ28gYmFjayB0byBzdGFydGluZyB3aXRoICcuJywgc28gd2UgYWNjZXB0Ci0gICAgIHRoZSBnZW5lcmljIEVMRiBsb2NhbCBsYWJlbCBzeW50YXggYXMgd2VsbC4gICovCi0gIHJldHVybiBfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKTsKLX0KLQotLyogTUlQUyBFTEYgdXNlcyBhIHNwZWNpYWwgZmluZF9uZWFyZXN0X2xpbmUgcm91dGluZSBpbiBvcmRlciB0aGUKLSAgIGhhbmRsZSB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZQotewotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkOwotICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lIGk7Ci19OwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGVuYW1lX3B0ciwKLQkJCQkgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIGFzZWN0aW9uICptc2VjOwotCi0gIGlmIChfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgICAgbGluZV9wdHIpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgICAgbGluZV9wdHIsIAotCQkJCSAgICAgQUJJXzY0X1AgKGFiZmQpID8gOCA6IDApKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5tZGVidWciKTsKLSAgaWYgKG1zZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmbGFnd29yZCBvcmlnZmxhZ3M7Ci0gICAgICBzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lICpmaTsKLSAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3Qgc3dhcCA9Ci0JZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgY2FsbGVkIGR1cmluZyBhIGxpbmssIG1pcHNfZWxmX2ZpbmFsX2xpbmsgbWF5IGhhdmUKLQkgY2xlYXJlZCB0aGUgU0VDX0hBU19DT05URU5UUyBmaWVsZC4gIFdlIGZvcmNlIGl0IGJhY2sgb24gaGVyZQotCSBpZiBhcHByb3ByaWF0ZSAod2hpY2ggaXQgbm9ybWFsbHkgd2lsbCBiZSkuICAqLwotICAgICAgb3JpZ2ZsYWdzID0gbXNlYy0+ZmxhZ3M7Ci0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobXNlYyktPnRoaXNfaGRyLnNoX3R5cGUgIT0gU0hUX05PQklUUykKLQltc2VjLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gICAgICBmaSA9IGVsZl90ZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvOwotICAgICAgaWYgKGZpID09IE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9mZHJfc2l6ZTsKLQkgIGNoYXIgKmZyYXdfc3JjOwotCSAgY2hhciAqZnJhd19lbmQ7Ci0JICBzdHJ1Y3QgZmRyICpmZHJfcHRyOwotCi0JICBmaSA9ICgoc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSAqKQotCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUpKSk7Ci0JICBpZiAoZmkgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoISBfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyAoYWJmZCwgbXNlYywgJmZpLT5kKSkKLQkgICAgewotCSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBTd2FwIGluIHRoZSBGRFIgaW5mb3JtYXRpb24uICAqLwotCSAgZmktPmQuZmRyID0gKChzdHJ1Y3QgZmRyICopCi0JCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAoZmktPmQuc3ltYm9saWNfaGVhZGVyLmlmZE1heCAqCi0JCQkJICAgc2l6ZW9mIChzdHJ1Y3QgZmRyKSkpKTsKLQkgIGlmIChmaS0+ZC5mZHIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZXh0ZXJuYWxfZmRyX3NpemUgPSBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZTsKLQkgIGZkcl9wdHIgPSBmaS0+ZC5mZHI7Ci0JICBmcmF3X3NyYyA9IChjaGFyICopIGZpLT5kLmV4dGVybmFsX2ZkcjsKLQkgIGZyYXdfZW5kID0gKGZyYXdfc3JjCi0JCSAgICAgICsgZmktPmQuc3ltYm9saWNfaGVhZGVyLmlmZE1heCAqIGV4dGVybmFsX2Zkcl9zaXplKTsKLQkgIGZvciAoOyBmcmF3X3NyYyA8IGZyYXdfZW5kOyBmcmF3X3NyYyArPSBleHRlcm5hbF9mZHJfc2l6ZSwgZmRyX3B0cisrKQotCSAgICAoKnN3YXAtPnN3YXBfZmRyX2luKSAoYWJmZCwgKFBUUikgZnJhd19zcmMsIGZkcl9wdHIpOwotCi0JICBlbGZfdGRhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbyA9IGZpOwotCi0JICAvKiBOb3RlIHRoYXQgd2UgZG9uJ3QgYm90aGVyIHRvIGV2ZXIgZnJlZSB0aGlzIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgIGZpbmRfbmVhcmVzdF9saW5lIGlzIGVpdGhlciBjYWxsZWQgYWxsIHRoZSB0aW1lLCBhcyBpbgotICAgICAgICAgICAgIG9iamR1bXAgLWwsIHNvIHRoZSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgc2F2ZWQsIG9yIGl0IGlzCi0gICAgICAgICAgICAgcmFyZWx5IGNhbGxlZCwgYXMgaW4gbGQgZXJyb3IgbWVzc2FnZXMsIHNvIHRoZSBtZW1vcnkKLSAgICAgICAgICAgICB3YXN0ZWQgaXMgdW5pbXBvcnRhbnQuICBTdGlsbCwgaXQgd291bGQgcHJvYmFibHkgYmUgYQotICAgICAgICAgICAgIGdvb2QgaWRlYSBmb3IgZnJlZV9jYWNoZWRfaW5mbyB0byB0aHJvdyBpdCBhd2F5LiAgKi8KLQl9Ci0KLSAgICAgIGlmIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lIChhYmZkLCBzZWN0aW9uLCBvZmZzZXQsICZmaS0+ZCwgc3dhcCwKLQkJCQkgICZmaS0+aSwgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgbGluZV9wdHIpKQotCXsKLQkgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLSAgICB9Ci0KLSAgLyogRmFsbCBiYWNrIG9uIHRoZSBnZW5lcmljIEVMRiBmaW5kX25lYXJlc3RfbGluZSByb3V0aW5lLiAgKi8KLQotICByZXR1cm4gX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgICAgIGxpbmVfcHRyKTsKLX0KLQwKLSAgLyogVGhlIG1pcHMxNiBjb21waWxlciB1c2VzIGEgY291cGxlIG9mIHNwZWNpYWwgc2VjdGlvbnMgdG8gaGFuZGxlCi0gICAgIGZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cy4KLQotICAgICBTZWN0aW9uIG5hbWVzIHRoYXQgbG9vayBsaWtlIC5taXBzMTYuZm4uRk5OQU1FIGNvbnRhaW4gc3R1YnMgdGhhdAotICAgICBjb3B5IGZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cyBmcm9tIHRoZSBmcCByZWdzIHRvIHRoZSBncCByZWdzIGFuZAotICAgICB0aGVuIGp1bXAgdG8gRk5OQU1FLiAgSWYgYW55IDMyIGJpdCBmdW5jdGlvbiBjYWxscyBGTk5BTUUsIHRoZQotICAgICBjYWxsIHNob3VsZCBiZSByZWRpcmVjdGVkIHRvIHRoZSBzdHViIGluc3RlYWQuICBJZiBubyAzMiBiaXQKLSAgICAgZnVuY3Rpb24gY2FsbHMgRk5OQU1FLCB0aGUgc3R1YiBzaG91bGQgYmUgZGlzY2FyZGVkLiAgV2UgbmVlZCB0bwotICAgICBjb25zaWRlciBhbnkgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiwgbm90IGp1c3QgYSBjYWxsLCBiZWNhdXNlCi0gICAgIGlmIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBpcyB0YWtlbiB3ZSB3aWxsIG5lZWQgdGhlIHN0dWIsCi0gICAgIHNpbmNlIHRoZSBhZGRyZXNzIG1pZ2h0IGJlIHBhc3NlZCB0byBhIDMyIGJpdCBmdW5jdGlvbi4KLQotICAgICBTZWN0aW9uIG5hbWVzIHRoYXQgbG9vayBsaWtlIC5taXBzMTYuY2FsbC5GTk5BTUUgY29udGFpbiBzdHVicwotICAgICB0aGF0IGNvcHkgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzIGZyb20gdGhlIGdwIHJlZ3MgdG8gdGhlIGZwCi0gICAgIHJlZ3MgYW5kIHRoZW4ganVtcCB0byBGTk5BTUUuICBJZiBGTk5BTUUgaXMgYSAzMiBiaXQgZnVuY3Rpb24sCi0gICAgIHRoZW4gYW55IDE2IGJpdCBmdW5jdGlvbiB0aGF0IGNhbGxzIEZOTkFNRSBzaG91bGQgYmUgcmVkaXJlY3RlZAotICAgICB0byB0aGUgc3R1YiBpbnN0ZWFkLiAgSWYgRk5OQU1FIGlzIG5vdCBhIDMyIGJpdCBmdW5jdGlvbiwgdGhlCi0gICAgIHN0dWIgc2hvdWxkIGJlIGRpc2NhcmRlZC4KLQotICAgICAubWlwczE2LmNhbGwuZnAuRk5OQU1FIHNlY3Rpb25zIGFyZSBzaW1pbGFyLCBidXQgY29udGFpbiBzdHVicwotICAgICB3aGljaCBjYWxsIEZOTkFNRSBhbmQgdGhlbiBjb3B5IHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZnAgcmVncwotICAgICB0byB0aGUgZ3AgcmVncy4gIFRoZXNlIHN0dWJzIHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgaW4gJDE4IHdoaWxlCi0gICAgIGNhbGxpbmcgRk5OQU1FOyBhbnkgZnVuY3Rpb24gd2hpY2ggbWlnaHQgY2FsbCBvbmUgb2YgdGhlc2Ugc3R1YnMKLSAgICAgbXVzdCBhcnJhbmdlIHRvIHNhdmUgJDE4IGFyb3VuZCB0aGUgY2FsbC4gIChUaGlzIGNhc2UgaXMgbm90Ci0gICAgIG5lZWRlZCBmb3IgMzIgYml0IGZ1bmN0aW9ucyB0aGF0IGNhbGwgMTYgYml0IGZ1bmN0aW9ucywgYmVjYXVzZQotICAgICAxNiBiaXQgZnVuY3Rpb25zIGFsd2F5cyByZXR1cm4gZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGluIGJvdGgKLSAgICAgJGYwLyRmMSBhbmQgJDIvJDMuKQotCi0gICAgIE5vdGUgdGhhdCBpbiBhbGwgY2FzZXMgRk5OQU1FIG1pZ2h0IGJlIGRlZmluZWQgc3RhdGljYWxseS4KLSAgICAgVGhlcmVmb3JlLCBGTk5BTUUgaXMgbm90IHVzZWQgbGl0ZXJhbGx5LiAgSW5zdGVhZCwgdGhlIHJlbG9jYXRpb24KLSAgICAgaW5mb3JtYXRpb24gd2lsbCBpbmRpY2F0ZSB3aGljaCBzeW1ib2wgdGhlIHNlY3Rpb24gaXMgZm9yLgotCi0gICAgIFdlIHJlY29yZCBhbnkgc3R1YnMgdGhhdCB3ZSBmaW5kIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi0jZGVmaW5lIEZOX1NUVUIgIi5taXBzMTYuZm4uIgotI2RlZmluZSBDQUxMX1NUVUIgIi5taXBzMTYuY2FsbC4iCi0jZGVmaW5lIENBTExfRlBfU1RVQiAiLm1pcHMxNi5jYWxsLmZwLiIKLQotLyogTUlQUyBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0jaWYgMAotICAvKiBXZSBubyBsb25nZXIgdXNlIHRoaXMuICAqLwotICAvKiBTdHJpbmcgc2VjdGlvbiBpbmRpY2VzIGZvciB0aGUgZHluYW1pYyBzZWN0aW9uIHN5bWJvbHMuICAqLwotICBiZmRfc2l6ZV90eXBlIGR5bnN5bV9zZWNfc3RyaW5kZXhbU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTXTsKLSNlbmRpZgotICAvKiBUaGUgbnVtYmVyIG9mIC5ydHByb2MgZW50cmllcy4gICovCi0gIGJmZF9zaXplX3R5cGUgcHJvY2VkdXJlX2NvdW50OwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgLmNvbXBhY3RfcmVsIHNlY3Rpb24gKGlmIFNHSV9DT01QQVQpLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBjb21wYWN0X3JlbF9zaXplOwotICAvKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIERUX01JUFNfUkxEX01BUCBkeW5hbWljCi0gICAgIGVudHJ5IGlzIHNldCB0byB0aGUgYWRkcmVzcyBvZiBfX3JsZF9vYmpfaGVhZCBhcyBpbiBJcml4IDUuICovCi0gIGJvb2xlYW4gdXNlX3JsZF9vYmpfaGVhZDsKLSAgLyogVGhpcyBpcyB0aGUgdmFsdWUgb2YgdGhlIF9fcmxkX21hcCBvciBfX3JsZF9vYmpfaGVhZCBzeW1ib2wuICAqLwotICBiZmRfdm1hIHJsZF92YWx1ZTsKLSAgLyogVGhpcyBpcyBzZXQgaWYgd2Ugc2VlIGFueSBtaXBzMTYgc3R1YiBzZWN0aW9ucy4gKi8KLSAgYm9vbGVhbiBtaXBzMTZfc3R1YnNfc2VlbjsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbWlwc19lbGZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLAkJXAotCQkJIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBtaXBzX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgbWlwc19lbGZfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfb3V0cHV0X2V4dHN5bQotICBQQVJBTVMgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotbWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICBtZW1zZXQgKCZyZXQtPmVzeW0sIDAsIHNpemVvZiAoRVhUUikpOwotICAgICAgLyogV2UgdXNlIC0yIGFzIGEgbWFya2VyIHRvIGluZGljYXRlIHRoYXQgdGhlIGluZm9ybWF0aW9uIGhhcwotCSBub3QgYmVlbiBzZXQuICAtMSBtZWFucyB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIGlmZC4gICovCi0gICAgICByZXQtPmVzeW0uaWZkID0gLTI7Ci0gICAgICByZXQtPnBvc3NpYmx5X2R5bmFtaWNfcmVsb2NzID0gMDsKLSAgICAgIHJldC0+bWluX2R5bl9yZWxvY19pbmRleCA9IDA7Ci0gICAgICByZXQtPmZuX3N0dWIgPSBOVUxMOwotICAgICAgcmV0LT5uZWVkX2ZuX3N0dWIgPSBmYWxzZTsKLSAgICAgIHJldC0+Y2FsbF9zdHViID0gTlVMTDsKLSAgICAgIHJldC0+Y2FsbF9mcF9zdHViID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYSBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLV9iZmRfbWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgIG1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotI2lmIDAKLSAgLyogV2Ugbm8gbG9uZ2VyIHVzZSB0aGlzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IFNJWkVPRl9NSVBTX0RZTlNZTV9TRUNOQU1FUzsgaSsrKQotICAgIHJldC0+ZHluc3ltX3NlY19zdHJpbmRleFtpXSA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLSNlbmRpZgotICByZXQtPnByb2NlZHVyZV9jb3VudCA9IDA7Ci0gIHJldC0+Y29tcGFjdF9yZWxfc2l6ZSA9IDA7Ci0gIHJldC0+dXNlX3JsZF9vYmpfaGVhZCA9IGZhbHNlOwotICByZXQtPnJsZF92YWx1ZSA9IDA7Ci0gIHJldC0+bWlwczE2X3N0dWJzX3NlZW4gPSBmYWxzZTsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgbXVzdCBoYW5kbGUgdGhlIHNwZWNpYWwgTUlQUyBzZWN0aW9uIG51bWJlcnMgaGVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3AgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkKLSAgICAgICYmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmIHN0cmNtcCAoKm5hbWVwLCAiX3JsZF9uZXdfaW50ZXJmYWNlIikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBTa2lwIElyaXggNSBybGQgZW50cnkgbmFtZS4gICovCi0gICAgICAqbmFtZXAgPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHN3aXRjaCAoc3ltLT5zdF9zaG5keCkKLSAgICB7Ci0gICAgY2FzZSBTSE5fQ09NTU9OOgotICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbGVzcyB0aGFuIHRoZSBHUCBzaXplIGFyZSBhdXRvbWF0aWNhbGx5Ci0JIHRyZWF0ZWQgYXMgU0hOX01JUFNfU0NPTU1PTiBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChzeW0tPnN0X3NpemUgPiBlbGZfZ3Bfc2l6ZSAoYWJmZCkKLQkgIHx8IElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDYpCi0JYnJlYWs7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgU0hOX01JUFNfU0NPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19URVhUOgotICAgICAgLyogVGhpcyBzZWN0aW9uIGlzIHVzZWQgaW4gYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgICAgIGlmIChtaXBzX2VsZl90ZXh0X3NlY3Rpb25fcHRyID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgc2VjdGlvbi4gICovCi0JICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24ubmFtZSA9ICIudGV4dCI7Ci0JICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24uZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0JICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSBOVUxMOwotCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uLnN5bWJvbCA9ICZtaXBzX2VsZl90ZXh0X3N5bWJvbDsKLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZtaXBzX2VsZl90ZXh0X3N5bWJvbF9wdHI7Ci0JICBtaXBzX2VsZl90ZXh0X3N5bWJvbC5uYW1lID0gIi50ZXh0IjsKLQkgIG1pcHNfZWxmX3RleHRfc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNIHwgQlNGX0RZTkFNSUM7Ci0JICBtaXBzX2VsZl90ZXh0X3N5bWJvbC5zZWN0aW9uID0gJm1pcHNfZWxmX3RleHRfc2VjdGlvbjsKLQkgIG1pcHNfZWxmX3RleHRfc3ltYm9sX3B0ciA9ICZtaXBzX2VsZl90ZXh0X3N5bWJvbDsKLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbl9wdHIgPSAmbWlwc19lbGZfdGV4dF9zZWN0aW9uOwotCX0KLSAgICAgIC8qIFRoaXMgY29kZSB1c2VkIHRvIGRvICpzZWNwID0gYmZkX3VuZF9zZWN0aW9uX3B0ciBpZgotICAgICAgICAgaW5mby0+c2hhcmVkLiAgSSBkb24ndCBrbm93IHdoeSwgYW5kIHRoYXQgZG9lc24ndCBtYWtlIHNlbnNlLAotICAgICAgICAgc28gSSB0b29rIGl0IG91dC4gICovCi0gICAgICAqc2VjcCA9IG1pcHNfZWxmX3RleHRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hOX01JUFNfQUNPTU1PTjoKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gWFhYIENhbiB3ZSB0cmVhdCB0aGlzIGFzIGFsbG9jYXRlZCBkYXRhPyAgKi8KLSAgICBjYXNlIFNITl9NSVBTX0RBVEE6Ci0gICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgdXNlZCBpbiBhIHNoYXJlZCBvYmplY3QuICAqLwotICAgICAgaWYgKG1pcHNfZWxmX2RhdGFfc2VjdGlvbl9wdHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzZWN0aW9uLiAgKi8KLQkgIG1pcHNfZWxmX2RhdGFfc2VjdGlvbi5uYW1lID0gIi5kYXRhIjsKLQkgIG1pcHNfZWxmX2RhdGFfc2VjdGlvbi5mbGFncyA9IFNFQ19OT19GTEFHUzsKLQkgIG1pcHNfZWxmX2RhdGFfc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9IE5VTEw7Ci0JICBtaXBzX2VsZl9kYXRhX3NlY3Rpb24uc3ltYm9sID0gJm1pcHNfZWxmX2RhdGFfc3ltYm9sOwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJm1pcHNfZWxmX2RhdGFfc3ltYm9sX3B0cjsKLQkgIG1pcHNfZWxmX2RhdGFfc3ltYm9sLm5hbWUgPSAiLmRhdGEiOwotCSAgbWlwc19lbGZfZGF0YV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU0gfCBCU0ZfRFlOQU1JQzsKLQkgIG1pcHNfZWxmX2RhdGFfc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfZGF0YV9zZWN0aW9uOwotCSAgbWlwc19lbGZfZGF0YV9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX2RhdGFfc3ltYm9sOwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uX3B0ciA9ICZtaXBzX2VsZl9kYXRhX3NlY3Rpb247Ci0JfQotICAgICAgLyogVGhpcyBjb2RlIHVzZWQgdG8gZG8gKnNlY3AgPSBiZmRfdW5kX3NlY3Rpb25fcHRyIGlmCi0gICAgICAgICBpbmZvLT5zaGFyZWQuICBJIGRvbid0IGtub3cgd2h5LCBhbmQgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2UsCi0gICAgICAgICBzbyBJIHRvb2sgaXQgb3V0LiAgKi8KLSAgICAgICpzZWNwID0gbWlwc19lbGZfZGF0YV9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19TVU5ERUZJTkVEOgotICAgICAgKnNlY3AgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChTR0lfQ09NUEFUIChhYmZkKQotICAgICAgJiYgISBpbmZvLT5zaGFyZWQKLSAgICAgICYmIGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYwotICAgICAgJiYgc3RyY21wICgqbmFtZXAsICJfX3JsZF9vYmpfaGVhZCIpID09IDApCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIE1hcmsgX19ybGRfb2JqX2hlYWQgYXMgZHluYW1pYy4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsICpuYW1lcCwgQlNGX0dMT0JBTCwgKnNlY3AsCi0JICAgICAgKGJmZF92bWEpICp2YWxwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkgICAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT51c2VfcmxkX29ial9oZWFkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIG1pcHMxNiB0ZXh0IHN5bWJvbCwgYWRkIDEgdG8gdGhlIHZhbHVlIHRvIG1ha2UgaXQKLSAgICAgb2RkLiAgVGhpcyB3aWxsIGNhdXNlIHNvbWV0aGluZyBsaWtlIC53b3JkIFNZTSB0byBjb21lIHVwIHdpdGgKLSAgICAgdGhlIHJpZ2h0IHZhbHVlIHdoZW4gaXQgaXMgbG9hZGVkIGludG8gdGhlIFBDLiAgKi8KLSAgaWYgKHN5bS0+c3Rfb3RoZXIgPT0gU1RPX01JUFMxNikKLSAgICArKyp2YWxwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIG1pcHNfZWxmX291dHB1dF9leHRzeW0uICAqLwotCi1zdHJ1Y3QgZXh0c3ltX2luZm8KLXsKLSAgYmZkICphYmZkOwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci19OwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byB3cml0ZSBvdXQgRUNPRkYgZGVidWdnaW5nIGV4dGVybmFsIHN5bWJvbAotICAgaW5mb3JtYXRpb24uICBJdCBpcyBjYWxsZWQgdmlhIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gIFRoZQotICAgRUNPRkYgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uIG11c3QgbWF0Y2ggdGhlIEVMRiBleHRlcm5hbAotICAgc3ltYm9sIGluZm9ybWF0aW9uLiAgVW5mb3J0dW5hdGVseSwgYXQgdGhpcyBwb2ludCB3ZSBkb24ndCBrbm93Ci0gICB3aGV0aGVyIGEgc3ltYm9sIGlzIHJlcXVpcmVkIGJ5IHJlbG9jIGluZm9ybWF0aW9uLCBzbyB0aGUgdHdvCi0gICB0YWJsZXMgbWF5IHdpbmQgdXAgYmVpbmcgZGlmZmVyZW50LiAgV2UgbXVzdCBzb3J0IG91dCB0aGUgZXh0ZXJuYWwKLSAgIHN5bWJvbCBpbmZvcm1hdGlvbiBiZWZvcmUgd2UgY2FuIHNldCB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgLm1kZWJ1ZwotICAgc2VjdGlvbiwgYW5kIHdlIG11c3Qgc2V0IHRoZSBzaXplIG9mIHRoZSAubWRlYnVnIHNlY3Rpb24gYmVmb3JlIHdlCi0gICBjYW4gcmVsb2NhdGUgYW55IHNlY3Rpb25zLCBhbmQgd2UgY2FuJ3Qga25vdyB3aGljaCBzeW1ib2xzIGFyZQotICAgcmVxdWlyZWQgYnkgcmVsb2NhdGlvbiB1bnRpbCB3ZSByZWxvY2F0ZSB0aGUgc2VjdGlvbnMuCi0gICBGb3J0dW5hdGVseSwgaXQgaXMgcmVsYXRpdmVseSB1bmxpa2VseSB0aGF0IGFueSBzeW1ib2wgd2lsbCBiZQotICAgc3RyaXBwZWQgYnV0IHJlcXVpcmVkIGJ5IGEgcmVsb2MuICBJbiBwYXJ0aWN1bGFyLCBpdCBjYW4gbm90IGhhcHBlbgotICAgd2hlbiBnZW5lcmF0aW5nIGEgZmluYWwgZXhlY3V0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9vdXRwdXRfZXh0c3ltIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGV4dHN5bV9pbmZvICplaW5mbyA9IChzdHJ1Y3QgZXh0c3ltX2luZm8gKikgZGF0YTsKLSAgYm9vbGVhbiBzdHJpcDsKLSAgYXNlY3Rpb24gKnNlYywgKm91dHB1dF9zZWN0aW9uOwotCi0gIGlmIChoLT5yb290LmluZHggPT0gLTIpCi0gICAgc3RyaXAgPSBmYWxzZTsKLSAgZWxzZSBpZiAoKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JICAgIHx8IChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwKQotCSAgICYmIChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCi0JICAgJiYgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDApCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlIGlmIChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICAgfHwgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgICYmIGJmZF9oYXNoX2xvb2t1cCAoZWluZm8tPmluZm8tPmtlZXBfaGFzaCwKLQkJCQkgICBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICAgZmFsc2UsIGZhbHNlKSA9PSBOVUxMKSkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UKLSAgICBzdHJpcCA9IGZhbHNlOwotCi0gIGlmIChzdHJpcCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+ZXN5bS5pZmQgPT0gLTIpCi0gICAgewotICAgICAgaC0+ZXN5bS5qbXB0YmwgPSAwOwotICAgICAgaC0+ZXN5bS5jb2JvbF9tYWluID0gMDsKLSAgICAgIGgtPmVzeW0ud2Vha2V4dCA9IDA7Ci0gICAgICBoLT5lc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uaWZkID0gaWZkTmlsOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0R2xvYmFsOwotCi0gICAgICBpZiAoU0dJX0NPTVBBVCAoZWluZm8tPmFiZmQpCi0JICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgLyogVXNlIHVuZGVmaW5lZCBjbGFzcy4gIEFsc28sIHNldCBjbGFzcyBhbmQgdHlwZSBmb3Igc29tZQotICAgICAgICAgICAgIHNwZWNpYWwgc3ltYm9scy4gICovCi0JICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCSAgaWYgKHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1swXSkgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1sxXSkgPT0gMCkKLQkgICAgewotCSAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjRGF0YTsKLQkgICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdExhYmVsOwotCSAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1syXSkgPT0gMCkKLQkgICAgewotCSAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotCSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0TGFiZWw7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0KLQkJbWlwc19lbGZfaGFzaF90YWJsZSAoZWluZm8tPmluZm8pLT5wcm9jZWR1cmVfY291bnQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9ncF9kaXNwIikgPT0gMCkKLQkgICAgewotCSAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotCSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0TGFiZWw7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gZWxmX2dwIChlaW5mby0+YWJmZCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NVbmRlZmluZWQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0gICAgICBlbHNlCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgIC8qIFdoZW4gbWFraW5nIGEgc2hhcmVkIGxpYnJhcnkgYW5kIHN5bWJvbCBoIGlzIHRoZSBvbmUgZnJvbQotCSAgICAgdGhlIGFub3RoZXIgc2hhcmVkIGxpYnJhcnksIE9VVFBVVF9TRUNUSU9OIG1heSBiZSBudWxsLiAgKi8KLQkgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChvdXRwdXRfc2VjdGlvbi0+b3duZXIsIG91dHB1dF9zZWN0aW9uKTsKLQotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjVGV4dDsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZGF0YSIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjRGF0YTsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY1NEYXRhOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yb2RhdGEiKSA9PSAwCi0JCSAgICAgICB8fCBzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY1JEYXRhOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5ic3MiKSA9PSAwKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY0JzczsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjU0JzczsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaW5pdCIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjSW5pdDsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjRmluaTsKLQkgICAgICBlbHNlCi0JCWgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotCSAgICB9Ci0JfQotCi0gICAgICBoLT5lc3ltLmFzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgaC0+ZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0gICAgfQotCi0gIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSBoLT5yb290LnJvb3QudS5jLnNpemU7Ci0gIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICB7Ci0gICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjQ29tbW9uKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotICAgICAgZWxzZSBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjU0NvbW1vbikKLQloLT5lc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0KLSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotICAgICAgaWYgKG91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgICsgb3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gICAgICBlbHNlCi0JaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdHlwZSBhbmQgdmFsdWUgZm9yIGEgc3ltYm9sIHdpdGggYSBmdW5jdGlvbiBzdHViLiAgKi8KLSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0UHJvYzsKLSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCWgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCSAgaWYgKG91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IChoLT5yb290LnBsdC5vZmZzZXQKLQkJCQkgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICArIG91dHB1dF9zZWN0aW9uLT52bWEpOwotCSAgZWxzZQotCSAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotCX0KLSNpZiAwIC8qIEZJWE1FPyAgKi8KLSAgICAgIGgtPmVzeW0uaWZkID0gMDsKLSNlbmRpZgotICAgIH0KLQotICBpZiAoISBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsIChlaW5mby0+YWJmZCwgZWluZm8tPmRlYnVnLCBlaW5mby0+c3dhcCwKLQkJCQkgICAgICBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICAgICAgJmgtPmVzeW0pKQotICAgIHsKLSAgICAgIGVpbmZvLT5mYWlsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIGEgcnVudGltZSBwcm9jZWR1cmUgdGFibGUgZnJvbSB0aGUgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUgKGhhbmRsZSwgYWJmZCwgaW5mbywgcywgZGVidWcpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICBIRFJSICpoZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgUlBEUiAqcnBkciwgKnJwOwotICBzdHJ1Y3QgcnBkcl9leHQgKmVycDsKLSAgUFRSIHJ0cHJvYzsKLSAgc3RydWN0IHBkcl9leHQgKmVwZHI7Ci0gIHN0cnVjdCBzeW1fZXh0ICplc3ltOwotICBjaGFyICpzcywgKipzdjsKLSAgY2hhciAqc3RyOwotICB1bnNpZ25lZCBsb25nIHNpemUsIGNvdW50OwotICB1bnNpZ25lZCBsb25nIHNpbmRleDsKLSAgdW5zaWduZWQgbG9uZyBpOwotICBQRFIgcGRyOwotICBTWU1SIHN5bTsKLSAgY29uc3QgY2hhciAqbm9fbmFtZV9mdW5jID0gXygic3RhdGljIHByb2NlZHVyZSAobm8gbmFtZSkiKTsKLQotICBlcGRyID0gTlVMTDsKLSAgcnBkciA9IE5VTEw7Ci0gIGVzeW0gPSBOVUxMOwotICBzcyA9IE5VTEw7Ci0gIHN2ID0gTlVMTDsKLQotICBzd2FwID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotCi0gIHNpbmRleCA9IHN0cmxlbiAobm9fbmFtZV9mdW5jKSArIDE7Ci0gIGNvdW50ID0gaGRyLT5pcGRNYXg7Ci0gIGlmIChjb3VudCA+IDApCi0gICAgewotICAgICAgc2l6ZSA9IHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplOwotCi0gICAgICBlcGRyID0gKHN0cnVjdCBwZHJfZXh0ICopIGJmZF9tYWxsb2MgKHNpemUgKiBjb3VudCk7Ci0gICAgICBpZiAoZXBkciA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoISBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIgKGhhbmRsZSwgKFBUUikgZXBkcikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNpemUgPSBzaXplb2YgKFJQRFIpOwotICAgICAgcnAgPSBycGRyID0gKFJQRFIgKikgYmZkX21hbGxvYyAoc2l6ZSAqIGNvdW50KTsKLSAgICAgIGlmIChycGRyID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHN2ID0gKGNoYXIgKiopIGJmZF9tYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIGNvdW50KTsKLSAgICAgIGlmIChzdiA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBjb3VudCA9IGhkci0+aXN5bU1heDsKLSAgICAgIHNpemUgPSBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZTsKLSAgICAgIGVzeW0gPSAoc3RydWN0IHN5bV9leHQgKikgYmZkX21hbGxvYyAoc2l6ZSAqIGNvdW50KTsKLSAgICAgIGlmIChlc3ltID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmICghIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSAoaGFuZGxlLCAoUFRSKSBlc3ltKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgY291bnQgPSBoZHItPmlzc01heDsKLSAgICAgIHNzID0gKGNoYXIgKikgYmZkX21hbGxvYyAoY291bnQpOwotICAgICAgaWYgKHNzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoISBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyAoaGFuZGxlLCAoUFRSKSBzcykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGNvdW50ID0gaGRyLT5pcGRNYXg7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcnArKykKLQl7Ci0JICAoKnN3YXAtPnN3YXBfcGRyX2luKSAoYWJmZCwgKFBUUikgKGVwZHIgKyBpKSwgJnBkcik7Ci0JICAoKnN3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgKFBUUikgJmVzeW1bcGRyLmlzeW1dLCAmc3ltKTsKLQkgIHJwLT5hZHIgPSBzeW0udmFsdWU7Ci0JICBycC0+cmVnbWFzayA9IHBkci5yZWdtYXNrOwotCSAgcnAtPnJlZ29mZnNldCA9IHBkci5yZWdvZmZzZXQ7Ci0JICBycC0+ZnJlZ21hc2sgPSBwZHIuZnJlZ21hc2s7Ci0JICBycC0+ZnJlZ29mZnNldCA9IHBkci5mcmVnb2Zmc2V0OwotCSAgcnAtPmZyYW1lb2Zmc2V0ID0gcGRyLmZyYW1lb2Zmc2V0OwotCSAgcnAtPmZyYW1lcmVnID0gcGRyLmZyYW1lcmVnOwotCSAgcnAtPnBjcmVnID0gcGRyLnBjcmVnOwotCSAgcnAtPmlycHNzID0gc2luZGV4OwotCSAgc3ZbaV0gPSBzcyArIHN5bS5pc3M7Ci0JICBzaW5kZXggKz0gc3RybGVuIChzdltpXSkgKyAxOwotCX0KLSAgICB9Ci0KLSAgc2l6ZSA9IHNpemVvZiAoc3RydWN0IHJwZHJfZXh0KSAqIChjb3VudCArIDIpICsgc2luZGV4OwotICBzaXplID0gQkZEX0FMSUdOIChzaXplLCAxNik7Ci0gIHJ0cHJvYyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gIGlmIChydHByb2MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cHJvY2VkdXJlX2NvdW50ID0gMDsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cHJvY2VkdXJlX2NvdW50ID0gY291bnQgKyAyOwotCi0gIGVycCA9IChzdHJ1Y3QgcnBkcl9leHQgKikgcnRwcm9jOwotICBtZW1zZXQgKGVycCwgMCwgc2l6ZW9mIChzdHJ1Y3QgcnBkcl9leHQpKTsKLSAgZXJwKys7Ci0gIHN0ciA9IChjaGFyICopIHJ0cHJvYyArIHNpemVvZiAoc3RydWN0IHJwZHJfZXh0KSAqIChjb3VudCArIDIpOwotICBzdHJjcHkgKHN0ciwgbm9fbmFtZV9mdW5jKTsKLSAgc3RyICs9IHN0cmxlbiAobm9fbmFtZV9mdW5jKSArIDE7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGVjb2ZmX3N3YXBfcnBkcl9vdXQgKGFiZmQsIHJwZHIgKyBpLCBlcnAgKyBpKTsKLSAgICAgIHN0cmNweSAoc3RyLCBzdltpXSk7Ci0gICAgICBzdHIgKz0gc3RybGVuIChzdltpXSkgKyAxOwotICAgIH0KLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgKGJmZF92bWEpIC0xLCAoYmZkX2J5dGUgKikgKGVycCArIGNvdW50KS0+cF9hZHIpOwotCi0gIC8qIFNldCB0aGUgc2l6ZSBhbmQgY29udGVudHMgb2YgLnJ0cHJvYyBzZWN0aW9uLiAgKi8KLSAgcy0+X3Jhd19zaXplID0gc2l6ZTsKLSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgcnRwcm9jOwotCi0gIC8qIFNraXAgdGhpcyBzZWN0aW9uIGxhdGVyIG9uIChJIGRvbid0IHRoaW5rIHRoaXMgY3VycmVudGx5Ci0gICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0gIHMtPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotICBpZiAoZXBkciAhPSBOVUxMKQotICAgIGZyZWUgKGVwZHIpOwotICBpZiAocnBkciAhPSBOVUxMKQotICAgIGZyZWUgKHJwZHIpOwotICBpZiAoZXN5bSAhPSBOVUxMKQotICAgIGZyZWUgKGVzeW0pOwotICBpZiAoc3MgIT0gTlVMTCkKLSAgICBmcmVlIChzcyk7Ci0gIGlmIChzdiAhPSBOVUxMKQotICAgIGZyZWUgKHN2KTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGVwZHIgIT0gTlVMTCkKLSAgICBmcmVlIChlcGRyKTsKLSAgaWYgKHJwZHIgIT0gTlVMTCkKLSAgICBmcmVlIChycGRyKTsKLSAgaWYgKGVzeW0gIT0gTlVMTCkKLSAgICBmcmVlIChlc3ltKTsKLSAgaWYgKHNzICE9IE5VTEwpCi0gICAgZnJlZSAoc3MpOwotICBpZiAoc3YgIT0gTlVMTCkKLSAgICBmcmVlIChzdik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQSBjb21wYXJpc29uIHJvdXRpbmUgdXNlZCB0byBzb3J0IC5ncHRhYiBlbnRyaWVzLiAgKi8KLQotc3RhdGljIGludAotZ3B0YWJfY29tcGFyZSAocDEsIHAyKQotICAgICBjb25zdCBQVFIgcDE7Ci0gICAgIGNvbnN0IFBUUiBwMjsKLXsKLSAgY29uc3QgRWxmMzJfZ3B0YWIgKmExID0gKGNvbnN0IEVsZjMyX2dwdGFiICopIHAxOwotICBjb25zdCBFbGYzMl9ncHRhYiAqYTIgPSAoY29uc3QgRWxmMzJfZ3B0YWIgKikgcDI7Ci0KLSAgcmV0dXJuIGExLT5ndF9lbnRyeS5ndF9nX3ZhbHVlIC0gYTItPmd0X2VudHJ5Lmd0X2dfdmFsdWU7Ci19Ci0KLS8qIFdlIG5lZWQgdG8gdXNlIGEgc3BlY2lhbCBsaW5rIHJvdXRpbmUgdG8gaGFuZGxlIHRoZSAucmVnaW5mbyBhbmQKLSAgIHRoZSAubWRlYnVnIHNlY3Rpb25zLiAgV2UgbmVlZCB0byBtZXJnZSBhbGwgaW5zdGFuY2VzIG9mIHRoZXNlCi0gICBzZWN0aW9ucyB0b2dldGhlciwgbm90IHdyaXRlIHRoZW0gYWxsIG91dCBzZXF1ZW50aWFsbHkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICoqc2VjcHA7Ci0gIGFzZWN0aW9uICpvOwotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIGFzZWN0aW9uICpyZWdpbmZvX3NlYywgKm1kZWJ1Z19zZWMsICpncHRhYl9kYXRhX3NlYywgKmdwdGFiX2Jzc19zZWM7Ci0gIGFzZWN0aW9uICpydHByb2Nfc2VjOwotICBFbGYzMl9SZWdJbmZvIHJlZ2luZm87Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGRlYnVnOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcAotICAgID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotICBIRFJSICpzeW1oZHIgPSAmZGVidWcuc3ltYm9saWNfaGVhZGVyOwotICBQVFIgbWRlYnVnX2hhbmRsZSA9IE5VTEw7Ci0KLSAgLyogSWYgYWxsIHRoZSB0aGluZ3Mgd2UgbGlua2VkIHRvZ2V0aGVyIHdlcmUgUElDLCBidXQgd2UncmUKLSAgICAgcHJvZHVjaW5nIGFuIGV4ZWN1dGFibGUgKHJhdGhlciB0aGFuIGEgc2hhcmVkIG9iamVjdCksIHRoZW4gdGhlCi0gICAgIHJlc3VsdGluZyBmaWxlIGlzIENQSUMgKGkuZS4sIGl0IGNhbGxzIFBJQyBjb2RlLikgICovCi0gIGlmICghaW5mby0+c2hhcmVkCi0gICAgICAmJiAhaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfUElDKQotICAgIHsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9IH5FRl9NSVBTX1BJQzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX01JUFNfQ1BJQzsKLSAgICB9Ci0KLSAgLyogV2UnZCBjYXJlZnVsbHkgYXJyYW5nZWQgdGhlIGR5bmFtaWMgc3ltYm9sIGluZGljZXMsIGFuZCB0aGVuIHRoZQotICAgICBnZW5lcmljIHNpemVfZHluYW1pY19zZWN0aW9ucyByZW51bWJlcmVkIHRoZW0gb3V0IGZyb20gdW5kZXIgdXMuCi0gICAgIFJhdGhlciB0aGFuIHRyeWluZyBzb21laG93IHRvIHByZXZlbnQgdGhlIHJlbnVtYmVyaW5nLCBqdXN0IGRvCi0gICAgIHRoZSBzb3J0IGFnYWluLiAgKi8KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGJmZCAqZHlub2JqOwotICAgICAgYXNlY3Rpb24gKmdvdDsKLSAgICAgIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotCi0gICAgICAvKiBXaGVuIHdlIHJlc29ydCwgd2UgbXVzdCB0ZWxsIG1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZSB3aGF0Ci0JIHRoZSBsb3dlc3QgaW5kZXggaXQgbWF5IHVzZSBpcy4gIFRoYXQncyB0aGUgbnVtYmVyIG9mIHNlY3Rpb24KLQkgc3ltYm9scyB3ZSdyZSBnb2luZyB0byBhZGQuICBUaGUgZ2VuZXJpYyBFTEYgbGlua2VyIG9ubHkKLQkgYWRkcyB0aGVzZSBzeW1ib2xzIHdoZW4gYnVpbGRpbmcgYSBzaGFyZWQgb2JqZWN0LiAgTm90ZSB0aGF0Ci0JIHdlIGNvdW50IHRoZSBzZWN0aW9ucyBhZnRlciAocG9zc2libHkpIHJlbW92aW5nIHRoZSAub3B0aW9ucwotCSBzZWN0aW9uIGFib3ZlLiAgKi8KLSAgICAgIGlmICghbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlIChpbmZvLCAoaW5mby0+c2hhcmVkIAotCQkJCQkgICAgPyBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpICsgMQotCQkJCQkgICAgOiAxKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgLyogTWFrZSBzdXJlIHdlIGRpZG4ndCBncm93IHRoZSBnbG9iYWwgLmdvdCByZWdpb24uICAqLwotICAgICAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gICAgICBnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChnb3QpLT50ZGF0YTsKLQotICAgICAgaWYgKGctPmdsb2JhbF9nb3RzeW0gIT0gTlVMTCkKLQlCRkRfQVNTRVJUICgoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudAotCQkgICAgIC0gZy0+Z2xvYmFsX2dvdHN5bS0+ZHluaW5keCkKLQkJICAgIDw9IGctPmdsb2JhbF9nb3Rubyk7Ci0gICAgfQotCi0gIC8qIE9uIElSSVg1LCB3ZSBvbWl0IHRoZSAub3B0aW9ucyBzZWN0aW9uLiAgT24gSVJJWDYsIGhvd2V2ZXIsIHdlCi0gICAgIGluY2x1ZGUgaXQsIGV2ZW4gdGhvdWdoIHdlIGRvbid0IHByb2Nlc3MgaXQgcXVpdGUgcmlnaHQuICAoU29tZQotICAgICBlbnRyaWVzIGFyZSBzdXBwb3NlZCB0byBiZSBtZXJnZWQuKSAgRW1waXJpY2FsbHksIHdlIHNlZW0gdG8gYmUKLSAgICAgYmV0dGVyIG9mZiBpbmNsdWRpbmcgaXQgdGhlbiBub3QuICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NSkKLSAgICBmb3IgKHNlY3BwID0gJmFiZmQtPnNlY3Rpb25zOyAqc2VjcHAgIT0gTlVMTDsgc2VjcHAgPSAmKCpzZWNwcCktPm5leHQpCi0gICAgICB7Ci0JaWYgKHN0cmNtcCAoKCpzZWNwcCktPm5hbWUsIE1JUFNfRUxGX09QVElPTlNfU0VDVElPTl9OQU1FIChhYmZkKSkgPT0gMCkKLQkgIHsKLQkgICAgZm9yIChwID0gKCpzZWNwcCktPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+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+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgLyogVGhlIHRhYmxlIG11c3QgYmUgc29ydGVkIGJ5IC1HIHZhbHVlLiAgKi8KLQkgIGlmIChjID4gMikKLQkgICAgcXNvcnQgKHRhYiArIDEsIGMgLSAxLCBzaXplb2YgKHRhYlswXSksIGdwdGFiX2NvbXBhcmUpOwotCi0JICAvKiBTd2FwIG91dCB0aGUgdGFibGUuICAqLwotCSAgZXh0X3RhYiA9ICgoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKikKLQkJICAgICBiZmRfYWxsb2MgKGFiZmQsIGMgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKSkpOwotCSAgaWYgKGV4dF90YWIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWUgKHRhYik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0JICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfb3V0IChhYmZkLCB0YWIgKyBpLCBleHRfdGFiICsgaSk7Ci0JICBmcmVlICh0YWIpOwotCi0JICBvLT5fcmF3X3NpemUgPSBjICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9ncHRhYik7Ci0JICBvLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRfdGFiOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIEludm9rZSB0aGUgcmVndWxhciBFTEYgYmFja2VuZCBsaW5rZXIgdG8gZG8gYWxsIHRoZSB3b3JrLiAgKi8KLSAgaWYgKEFCSV82NF9QIChhYmZkKSkKLSAgICB7Ci0jaWZkZWYgQkZENjQKLSAgICAgIGlmICghYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYgLyogQkZENjQgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKCFiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHRoZSBjb21wdXRlZCBzZWN0aW9ucy4gICovCi0KLSAgaWYgKHJlZ2luZm9fc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gZXh0OwotCi0gICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9fb3V0IChhYmZkLCAmcmVnaW5mbywgJmV4dCk7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHJlZ2luZm9fc2VjLCAoUFRSKSAmZXh0LAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2l6ZW9mIGV4dCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAobWRlYnVnX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKTsKLSAgICAgIGlmICghIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLAotCQkJCQkgICAgICAgc3dhcCwgaW5mbywKLQkJCQkJICAgICAgIG1kZWJ1Z19zZWMtPmZpbGVwb3MpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsICZkZWJ1Zywgc3dhcCwgaW5mbyk7Ci0gICAgfQotCi0gIGlmIChncHRhYl9kYXRhX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGdwdGFiX2RhdGFfc2VjLAotCQkJCSAgICAgIGdwdGFiX2RhdGFfc2VjLT5jb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgZ3B0YWJfZGF0YV9zZWMtPl9yYXdfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZ3B0YWJfYnNzX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGdwdGFiX2Jzc19zZWMsCi0JCQkJICAgICAgZ3B0YWJfYnNzX3NlYy0+Y29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgIGdwdGFiX2Jzc19zZWMtPl9yYXdfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkpCi0gICAgewotICAgICAgcnRwcm9jX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJ0cHJvYyIpOwotICAgICAgaWYgKHJ0cHJvY19zZWMgIT0gTlVMTCkKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHJ0cHJvY19zZWMsCi0JCQkJCSAgcnRwcm9jX3NlYy0+Y29udGVudHMsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLAotCQkJCQkgIHJ0cHJvY19zZWMtPl9yYXdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm5zIHRoZSBHT1Qgc2VjdGlvbiBmb3IgQUJGRC4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1taXBzX2VsZl9nb3Rfc2VjdGlvbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZ290Iik7Ci19Ci0KLS8qIFJldHVybnMgdGhlIEdPVCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsgaW5kaWNhdGVkIGJ5Ci0gICBJTkZPLiAgSWYgU0dPVFAgaXMgbm9uLU5VTEwsIGl0IGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBHT1QgCi0gICBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtaXBzX2dvdF9pbmZvICoKLW1pcHNfZWxmX2dvdF9pbmZvIChhYmZkLCBzZ290cCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqKnNnb3RwOwotewotICBhc2VjdGlvbiAqc2dvdDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgc2dvdCA9IG1pcHNfZWxmX2dvdF9zZWN0aW9uIChhYmZkKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7Ci0gIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOwotICBCRkRfQVNTRVJUIChnICE9IE5VTEwpOwotCi0gIGlmIChzZ290cCkKLSAgICAqc2dvdHAgPSBzZ290OwotICByZXR1cm4gZzsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSByZWxvY2F0aW9uIGlzIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfbG9jYWxfcmVsb2NhdGlvbl9wIChpbnB1dF9iZmQsIHJlbG9jYXRpb24sIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jYXRpb247Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotCi0gIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbG9jYXRpb24tPnJfaW5mbyk7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBpZiAoISBlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKSkKLSAgICByZXR1cm4gcl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBlbHNlCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCB0YWJsZSBkb2VzIG5vdCBmb2xsb3cgdGhlIHJ1bGUgdGhhdCBsb2NhbCBzeW1ib2xzCi0JIG11c3QgY29tZSBiZWZvcmUgZ2xvYmFscy4gICovCi0gICAgICByZXR1cm4gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdICE9IE5VTEw7Ci0gICAgfQotfQotCi0vKiBTaWduLWV4dGVuZCBWQUxVRSwgd2hpY2ggaGFzIHRoZSBpbmRpY2F0ZWQgbnVtYmVyIG9mIEJJVFMuICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbWlwc19lbGZfc2lnbl9leHRlbmQgKHZhbHVlLCBiaXRzKQotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBpbnQgYml0czsKLXsKLSAgaWYgKHZhbHVlICYgKChiZmRfdm1hKTEgPDwgKGJpdHMgLSAxKSkpCi0gICAgLyogVkFMVUUgaXMgbmVnYXRpdmUuICAqLwotICAgIHZhbHVlIHw9ICgoYmZkX3ZtYSkgLSAxKSA8PCBiaXRzOyAgICAgIAotICAKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIGluZGljYXRlZCBWQUxVRSBoYXMgb3ZlcmZsb3dlZCB0aGUgbWF4aW11bQotICAgcmFuZ2UgZXhwcmVzc2FibGUgYnkgYSBzaWduZWQgbnVtYmVyIHdpdGggdGhlIGluZGljYXRlZCBudW1iZXIgb2YKLSAgIEJJVFMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIGJpdHMpCi0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGludCBiaXRzOwotewotICBiZmRfc2lnbmVkX3ZtYSBzdmFsdWUgPSAoYmZkX3NpZ25lZF92bWEpIHZhbHVlOwotCi0gIGlmIChzdmFsdWUgPiAoMSA8PCAoYml0cyAtIDEpKSAtIDEpCi0gICAgLyogVGhlIHZhbHVlIGlzIHRvbyBiaWcuICAqLwotICAgIHJldHVybiB0cnVlOwotICBlbHNlIGlmIChzdmFsdWUgPCAtKDEgPDwgKGJpdHMgLSAxKSkpCi0gICAgLyogVGhlIHZhbHVlIGlzIHRvbyBzbWFsbC4gICovCi0gICAgcmV0dXJuIHRydWU7Ci0gICAgCi0gIC8qIEFsbCBpcyB3ZWxsLiAgKi8KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBDYWxjdWxhdGUgdGhlICVoaWdoIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2hpZ2ggKHZhbHVlKQotICAgICBiZmRfdm1hIHZhbHVlOwotewotICByZXR1cm4gKCh2YWx1ZSArIChiZmRfdm1hKSAweDgwMDApID4+IDE2KSAmIDB4ZmZmZjsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSAlaGlnaGVyIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW1pcHNfZWxmX2hpZ2hlciAodmFsdWUpCi0gICAgIGJmZF92bWEgdmFsdWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBCRkQ2NAotICByZXR1cm4gKCh2YWx1ZSArIChiZmRfdm1hKSAweDgwMDA4MDAwKSA+PiAzMikgJiAweGZmZmY7Ci0jZWxzZQotICBhYm9ydCAoKTsKLSAgcmV0dXJuIChiZmRfdm1hKSAtMTsKLSNlbmRpZgotfQotCi0vKiBDYWxjdWxhdGUgdGhlICVoaWdoZXN0IGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF92bWEgCi1taXBzX2VsZl9oaWdoZXN0ICh2YWx1ZSkKLSAgICAgYmZkX3ZtYSB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEJGRDY0Ci0gIHJldHVybiAoKHZhbHVlICsgKGJmZF92bWEpIDB4ODAwMDgwMDA4MDAwKSA+PiA0OCkgJiAweGZmZmY7Ci0jZWxzZQotICBhYm9ydCAoKTsKLSAgcmV0dXJuIChiZmRfdm1hKSAtMTsKLSNlbmRpZgotfQotCi0vKiBSZXR1cm5zIHRoZSBHT1QgaW5kZXggZm9yIHRoZSBnbG9iYWwgc3ltYm9sIGluZGljYXRlZCBieSBILiAgKi8KLQotc3RhdGljIGJmZF92bWEgCi1taXBzX2VsZl9nbG9iYWxfZ290X2luZGV4IChhYmZkLCBoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmRfdm1hIGluZGV4OwotICBhc2VjdGlvbiAqc2dvdDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgZyA9IG1pcHNfZWxmX2dvdF9pbmZvIChhYmZkLCAmc2dvdCk7Ci0KLSAgLyogT25jZSB3ZSBkZXRlcm1pbmUgdGhlIGdsb2JhbCBHT1QgZW50cnkgd2l0aCB0aGUgbG93ZXN0IGR5bmFtaWMKLSAgICAgc3ltYm9sIHRhYmxlIGluZGV4LCB3ZSBtdXN0IHB1dCBhbGwgZHluYW1pYyBzeW1ib2xzIHdpdGggZ3JlYXRlcgotICAgICBpbmRpY2VzIGludG8gdGhlIEdPVC4gIFRoYXQgbWFrZXMgaXQgZWFzeSB0byBjYWxjdWxhdGUgdGhlIEdPVAotICAgICBvZmZzZXQuICAqLwotICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ID49IGctPmdsb2JhbF9nb3RzeW0tPmR5bmluZHgpOwotICBpbmRleCA9ICgoaC0+ZHluaW5keCAtIGctPmdsb2JhbF9nb3RzeW0tPmR5bmluZHggKyBnLT5sb2NhbF9nb3RubykgCi0JICAgKiBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkpOwotICBCRkRfQVNTRVJUIChpbmRleCA8IHNnb3QtPl9yYXdfc2l6ZSk7Ci0KLSAgcmV0dXJuIGluZGV4OwotfQotCi0vKiBSZXR1cm5zIHRoZSBvZmZzZXQgZm9yIHRoZSBlbnRyeSBhdCB0aGUgSU5ERVh0aCBwb3NpdGlvbgotICAgaW4gdGhlIEdPVC4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9nb3Rfb2Zmc2V0X2Zyb21faW5kZXggKGR5bm9iaiwgb3V0cHV0X2JmZCwgaW5kZXgpCi0gICAgIGJmZCAqZHlub2JqOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZF92bWEgaW5kZXg7Ci17Ci0gIGFzZWN0aW9uICpzZ290OwotICBiZmRfdm1hIGdwOwotCi0gIHNnb3QgPSBtaXBzX2VsZl9nb3Rfc2VjdGlvbiAoZHlub2JqKTsKLSAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7Ci0gIHJldHVybiAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyBpbmRleCAtIAotCSAgZ3ApOwotfQotCi0vKiBJZiBIIGlzIGEgc3ltYm9sIHRoYXQgbmVlZHMgYSBnbG9iYWwgR09UIGVudHJ5LCBidXQgaGFzIGEgZHluYW1pYwotICAgc3ltYm9sIHRhYmxlIGluZGV4IGxvd2VyIHRoYW4gYW55IHdlJ3ZlIHNlZW4gdG8gZGF0ZSwgcmVjb3JkIGl0IGZvcgotICAgcG9zdGVyaXR5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX3JlY29yZF9nbG9iYWxfZ290X3N5bWJvbCAoaCwgaW5mbywgZykKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBBIGdsb2JhbCBzeW1ib2wgaW4gdGhlIEdPVCBtdXN0IGFsc28gYmUgaW4gdGhlIGR5bmFtaWMgc3ltYm9sCi0gICAgIHRhYmxlLiAgKi8KLSAgaWYgKGgtPmR5bmluZHggPT0gLTEKLSAgICAgICYmICFiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIC8qIElmIHdlJ3ZlIGFscmVhZHkgbWFya2VkIHRoaXMgZW50cnkgYXMgbmVlZCBHT1Qgc3BhY2UsIHdlIGRvbid0Ci0gICAgIG5lZWQgdG8gZG8gaXQgYWdhaW4uICAqLwotICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLSAxKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEJ5IHNldHRpbmcgdGhpcyB0byBhIHZhbHVlIG90aGVyIHRoYW4gLTEsIHdlIGFyZSBpbmRpY2F0aW5nIHRoYXQKLSAgICAgdGhlcmUgbmVlZHMgdG8gYmUgYSBHT1QgZW50cnkgZm9yIEguICAqLwotICBoLT5nb3Qub2Zmc2V0ID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIHRvIG1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZV9mIHdoZW4gc29ydGluZwotICAgdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0gICAgIAotc3RydWN0IG1pcHNfZWxmX2hhc2hfc29ydF9kYXRhCi17Ci0gIC8qIFRoZSBzeW1ib2wgaW4gdGhlIGdsb2JhbCBHT1Qgd2l0aCB0aGUgbG93ZXN0IGR5bmFtaWMgc3ltYm9sIHRhYmxlCi0gICAgIGluZGV4LiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmxvdzsKLSAgLyogVGhlIGxlYXN0IGR5bmFtaWMgc3ltYm9sIHRhYmxlIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gYSBzeW1ib2wKLSAgICAgd2l0aCBhIEdPVCBlbnRyeS4gICovCi0gIGxvbmcgbWluX2dvdF9keW5pbmR4OwotICAvKiBUaGUgZ3JlYXRlc3QgZHluYW1pYyBzeW1ib2wgdGFibGUgaW5kZXggbm90IGNvcnJlc3BvbmRpbmcgdG8gYQotICAgICBzeW1ib2wgd2l0aG91dCBhIEdPVCBlbnRyeS4gICovCi0gIGxvbmcgbWF4X25vbl9nb3RfZHluaW5keDsKLX07Ci0KLS8qIElmIEggbmVlZHMgYSBHT1QgZW50cnksIGFzc2lnbiBpdCB0aGUgaGlnaGVzdCBhdmFpbGFibGUgZHluYW1pYwotICAgaW5kZXguICBPdGhlcndpc2UsIGFzc2lnbiBpdCB0aGUgbG93ZXN0IGF2YWlsYWJsZSBkeW5hbWljIAotICAgaW5kZXguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfc29ydF9oYXNoX3RhYmxlX2YgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgbWlwc19lbGZfaGFzaF9zb3J0X2RhdGEgKmhzZCAKLSAgICA9IChzdHJ1Y3QgbWlwc19lbGZfaGFzaF9zb3J0X2RhdGEgKikgZGF0YTsKLQotICAvKiBTeW1ib2xzIHdpdGhvdXQgZHluYW1pYyBzeW1ib2wgdGFibGUgZW50cmllcyBhcmVuJ3QgaW50ZXJlc3RpbmcKLSAgICAgYXQgYWxsLiAgKi8KLSAgaWYgKGgtPnJvb3QuZHluaW5keCA9PSAtMSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+cm9vdC5nb3Qub2Zmc2V0ICE9IDApCi0gICAgaC0+cm9vdC5keW5pbmR4ID0gaHNkLT5tYXhfbm9uX2dvdF9keW5pbmR4Kys7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoLT5yb290LmR5bmluZHggPSAtLWhzZC0+bWluX2dvdF9keW5pbmR4OwotICAgICAgaHNkLT5sb3cgPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNvcnQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIHNvIHRoYXQgc3ltYm9scyB0aGF0IG5lZWQgR09UIGVudHJpZXMKLSAgIGFwcGVhciB0b3dhcmRzIHRoZSBlbmQuICBUaGlzIHJlZHVjZXMgdGhlIGFtb3VudCBvZiBHT1Qgc3BhY2UKLSAgIHJlcXVpcmVkLiAgTUFYX0xPQ0FMIGlzIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgbG9jYWwgc3ltYm9scwotICAga25vd24gdG8gYmUgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgRHVyaW5nCi0gICBtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMsIHRoaXMgdmFsdWUgaXMgMS4gIEFmdGVyd2FyZCwgdGhlCi0gICBzZWN0aW9uIHN5bWJvbHMgYXJlIGFkZGVkIGFuZCB0aGUgY291bnQgaXMgaGlnaGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZSAoaW5mbywgbWF4X2xvY2FsKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBtYXhfbG9jYWw7Ci17Ci0gIHN0cnVjdCBtaXBzX2VsZl9oYXNoX3NvcnRfZGF0YSBoc2Q7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotICBiZmQgKmR5bm9iajsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBoc2QubG93ID0gTlVMTDsKLSAgaHNkLm1pbl9nb3RfZHluaW5keCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0gIGhzZC5tYXhfbm9uX2dvdF9keW5pbmR4ID0gbWF4X2xvY2FsOwotICBtaXBzX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKCgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSAKLQkJCQllbGZfaGFzaF90YWJsZSAoaW5mbykpLCAKLQkJCSAgICAgICBtaXBzX2VsZl9zb3J0X2hhc2hfdGFibGVfZiwgCi0JCQkgICAgICAgJmhzZCk7Ci0KLSAgLyogVGhlcmUgc2hvdWQgaGF2ZSBiZWVuIGVub3VnaCByb29tIGluIHRoZSBzeW1ib2wgdGFibGUgdG8KLSAgICAgYWNjb21vZGF0ZSBib3RoIHRoZSBHT1QgYW5kIG5vbi1HT1Qgc3ltYm9scy4gICovCi0gIEJGRF9BU1NFUlQgKGhzZC5taW5fZ290X2R5bmluZHggPT0gaHNkLm1heF9ub25fZ290X2R5bmluZHgpOwotCi0gIC8qIE5vdyB3ZSBrbm93IHdoaWNoIGR5bmFtaWMgc3ltYm9sIGhhcyB0aGUgbG93ZXN0IGR5bmFtaWMgc3ltYm9sCi0gICAgIHRhYmxlIGluZGV4IGluIHRoZSBHT1QuICAqLwotICBnID0gbWlwc19lbGZfZ290X2luZm8gKGR5bm9iaiwgTlVMTCk7Ci0gIGctPmdsb2JhbF9nb3RzeW0gPSBoc2QubG93OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgYSBsb2NhbCBHT1QgZW50cnkgZm9yIFZBTFVFLiAgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZW50cnksCi0gICBvciAtMSBpZiBpdCBjb3VsZCBub3QgYmUgY3JlYXRlZC4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9jcmVhdGVfbG9jYWxfZ290X2VudHJ5IChhYmZkLCBnLCBzZ290LCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLSAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGlmIChnLT5hc3NpZ25lZF9nb3RubyA+PSBnLT5sb2NhbF9nb3RubykKLSAgICB7Ci0gICAgICAvKiBXZSBkaWRuJ3QgYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIHRoZSBHT1QuICAqLwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIm5vdCBlbm91Z2ggR09UIHNwYWNlIGZvciBsb2NhbCBHT1QgZW50cmllcyIpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSAtMTsKLSAgICB9Ci0KLSAgTUlQU19FTEZfUFVUX1dPUkQgKGFiZmQsIHZhbHVlLAotCQkgICAgIChzZ290LT5jb250ZW50cyAKLQkJICAgICAgKyBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBnLT5hc3NpZ25lZF9nb3RubykpOwotICByZXR1cm4gTUlQU19FTEZfR09UX1NJWkUgKGFiZmQpICogZy0+YXNzaWduZWRfZ290bm8rKzsKLX0KLQotLyogUmV0dXJucyB0aGUgR09UIG9mZnNldCBhdCB3aGljaCB0aGUgaW5kaWNhdGVkIGFkZHJlc3MgY2FuIGJlIGZvdW5kLgotICAgSWYgdGhlcmUgaXMgbm90IHlldCBhIEdPVCBlbnRyeSBmb3IgdGhpcyB2YWx1ZSwgY3JlYXRlIG9uZS4gIFJldHVybnMKLSAgIC0xIGlmIG5vIHNhdGlzZmFjdG9yeSBHT1Qgb2Zmc2V0IGNhbiBiZSBmb3VuZC4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9sb2NhbF9nb3RfaW5kZXggKGFiZmQsIGluZm8sIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBhc2VjdGlvbiAqc2dvdDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGJmZF9ieXRlICplbnRyeTsKLQotICBnID0gbWlwc19lbGZfZ290X2luZm8gKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCAmc2dvdCk7Ci0KLSAgLyogTG9vayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGFwcHJvcHJpYXRlIGVudHJ5LiAgKi8KLSAgZm9yIChlbnRyeSA9IChzZ290LT5jb250ZW50cyAKLQkJKyBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBNSVBTX1JFU0VSVkVEX0dPVE5PKTsgCi0gICAgICAgZW50cnkgIT0gc2dvdC0+Y29udGVudHMgKyBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBnLT5hc3NpZ25lZF9nb3RubzsKLSAgICAgICBlbnRyeSArPSBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkpCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRyZXNzID0gTUlQU19FTEZfR0VUX1dPUkQgKGFiZmQsIGVudHJ5KTsKLSAgICAgIGlmIChhZGRyZXNzID09IHZhbHVlKQotCXJldHVybiBlbnRyeSAtIHNnb3QtPmNvbnRlbnRzOwotICAgIH0KLQotICByZXR1cm4gbWlwc19lbGZfY3JlYXRlX2xvY2FsX2dvdF9lbnRyeSAoYWJmZCwgZywgc2dvdCwgdmFsdWUpOwotfQotCi0vKiBGaW5kIGEgR09UIGVudHJ5IHRoYXQgaXMgd2l0aGluIDMyS0Igb2YgdGhlIFZBTFVFLiAgVGhlc2UgZW50cmllcwotICAgYXJlIHN1cHBvc2VkIHRvIGJlIHBsYWNlZCBhdCBzbWFsbCBvZmZzZXRzIGluIHRoZSBHT1QsIGkuZS4sCi0gICB3aXRoaW4gMzJLQiBvZiBHUC4gIFJldHVybiB0aGUgaW5kZXggaW50byB0aGUgR09UIGZvciB0aGlzIHBhZ2UsCi0gICBhbmQgc3RvcmUgdGhlIG9mZnNldCBmcm9tIHRoaXMgZW50cnkgdG8gdGhlIGRlc2lyZWQgYWRkcmVzcyBpbgotICAgT0ZGU0VUUCwgaWYgaXQgaXMgbm9uLU5VTEwuICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbWlwc19lbGZfZ290X3BhZ2UgKGFiZmQsIGluZm8sIHZhbHVlLCBvZmZzZXRwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBiZmRfdm1hICpvZmZzZXRwOwotewotICBhc2VjdGlvbiAqc2dvdDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGJmZF9ieXRlICplbnRyeTsKLSAgYmZkX2J5dGUgKmxhc3RfZW50cnk7Ci0gIGJmZF92bWEgaW5kZXg7Ci0gIGJmZF92bWEgYWRkcmVzczsKLQotICBnID0gbWlwc19lbGZfZ290X2luZm8gKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCAmc2dvdCk7Ci0KLSAgLyogTG9vayB0byBzZWUgaWYgd2UgYWxlYWR5IGhhdmUgYW4gYXBwcm9wcmlhdGUgZW50cnkuICAqLwotICBsYXN0X2VudHJ5ID0gc2dvdC0+Y29udGVudHMgKyBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBnLT5hc3NpZ25lZF9nb3RubzsKLSAgZm9yIChlbnRyeSA9IChzZ290LT5jb250ZW50cyAKLQkJKyBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBNSVBTX1JFU0VSVkVEX0dPVE5PKTsKLSAgICAgICBlbnRyeSAhPSBsYXN0X2VudHJ5OwotICAgICAgIGVudHJ5ICs9IE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSkKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gTUlQU19FTEZfR0VUX1dPUkQgKGFiZmQsIGVudHJ5KTsKLQotICAgICAgaWYgKCFtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSAtIGFkZHJlc3MsIDE2KSkKLQl7Ci0JICAvKiBUaGlzIGVudHJ5IHdpbGwgc2VydmUgYXMgdGhlIHBhZ2UgcG9pbnRlci4gIFdlIGNhbiBhZGQgYQotCSAgICAgMTYtYml0IG51bWJlciB0byBpdCB0byBnZXQgdGhlIGFjdHVhbCBhZGRyZXNzLiAgKi8KLQkgIGluZGV4ID0gZW50cnkgLSBzZ290LT5jb250ZW50czsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgZGlkbid0IGhhdmUgYW4gYXBwcm9wcmlhdGUgZW50cnksIHdlIGNyZWF0ZSBvbmUgbm93LiAgKi8KLSAgaWYgKGVudHJ5ID09IGxhc3RfZW50cnkpCi0gICAgaW5kZXggPSBtaXBzX2VsZl9jcmVhdGVfbG9jYWxfZ290X2VudHJ5IChhYmZkLCBnLCBzZ290LCB2YWx1ZSk7Ci0KLSAgaWYgKG9mZnNldHApCi0gICAgewotICAgICAgYWRkcmVzcyA9IE1JUFNfRUxGX0dFVF9XT1JEIChhYmZkLCBlbnRyeSk7Ci0gICAgICAqb2Zmc2V0cCA9IHZhbHVlIC0gYWRkcmVzczsKLSAgICB9Ci0KLSAgcmV0dXJuIGluZGV4OwotfQotCi0vKiBGaW5kIGEgR09UIGVudHJ5IHdob3NlIGhpZ2hlci1vcmRlciAxNiBiaXRzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZQotICAgZm9yIHZhbHVlLiAgUmV0dXJuIHRoZSBpbmRleCBpbnRvIHRoZSBHT1QgZm9yIHRoaXMgZW50cnkuICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbWlwc19lbGZfZ290MTZfZW50cnkgKGFiZmQsIGluZm8sIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBhc2VjdGlvbiAqc2dvdDsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGJmZF9ieXRlICplbnRyeTsKLSAgYmZkX2J5dGUgKmxhc3RfZW50cnk7Ci0gIGJmZF92bWEgaW5kZXg7Ci0gIGJmZF92bWEgYWRkcmVzczsKLQotICAvKiBBbHRob3VnaCB0aGUgQUJJIHNheXMgdGhhdCBpdCBpcyAidGhlIGhpZ2gtb3JkZXIgMTYgYml0cyIgdGhhdCB3ZQotICAgICB3YW50LCBpdCBpcyByZWFsbHkgdGhlICVoaWdoIHZhbHVlLiAgVGhlIGNvbXBsZXRlIHZhbHVlIGlzCi0gICAgIGNhbGN1bGF0ZWQgd2l0aCBhIGBhZGRpdScgb2YgYSBMTzE2IHJlbG9jYXRpb24sIGp1c3QgYXMgd2l0aCBhCi0gICAgIEhJMTYvTE8xNiBwYWlyLiAgKi8KLSAgdmFsdWUgPSBtaXBzX2VsZl9oaWdoICh2YWx1ZSkgPDwgMTY7Ci0gIGcgPSBtaXBzX2VsZl9nb3RfaW5mbyAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosICZzZ290KTsKLQotICAvKiBMb29rIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gYXBwcm9wcmlhdGUgZW50cnkuICAqLwotICBsYXN0X2VudHJ5ID0gc2dvdC0+Y29udGVudHMgKyBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBnLT5hc3NpZ25lZF9nb3RubzsKLSAgZm9yIChlbnRyeSA9IChzZ290LT5jb250ZW50cyAKLQkJKyBNSVBTX0VMRl9HT1RfU0laRSAoYWJmZCkgKiBNSVBTX1JFU0VSVkVEX0dPVE5PKTsKLSAgICAgICBlbnRyeSAhPSBsYXN0X2VudHJ5OwotICAgICAgIGVudHJ5ICs9IE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKSkKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gTUlQU19FTEZfR0VUX1dPUkQgKGFiZmQsIGVudHJ5KTsKLSAgICAgIGlmICgoYWRkcmVzcyAmIDB4ZmZmZjAwMDApID09IHZhbHVlKQotCXsKLQkgIC8qIFRoaXMgZW50cnkgaGFzIHRoZSByaWdodCBoaWdoLW9yZGVyIDE2IGJpdHMuICAqLwotCSAgaW5kZXggPSBlbnRyeSAtIHNnb3QtPmNvbnRlbnRzOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBkaWRuJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSBlbnRyeSwgd2UgY3JlYXRlIG9uZSBub3cuICAqLwotICBpZiAoZW50cnkgPT0gbGFzdF9lbnRyeSkKLSAgICBpbmRleCA9IG1pcHNfZWxmX2NyZWF0ZV9sb2NhbF9nb3RfZW50cnkgKGFiZmQsIGcsIHNnb3QsIHZhbHVlKTsKLQotICByZXR1cm4gaW5kZXg7Ci19Ci0KLS8qIFJldHVybnMgdGhlIGZpcnN0IFJfTUlQU19MTzE2IHJlbG9jYXRpb24gZm91bmQsIGJlZ2lubmluZyB3aXRoCi0gICBSRUxPQ0FUSU9OLiAgUkVMRU5EIGlzIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIHJlbG9jYXRpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKgotbWlwc19lbGZfbmV4dF9sbzE2X3JlbG9jYXRpb24gKHJlbG9jYXRpb24sIHJlbGVuZCkKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jYXRpb247Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci17Ci0gIC8qIEFjY29yZGluZyB0byB0aGUgTUlQUyBFTEYgQUJJLCB0aGUgUl9NSVBTX0xPMTYgcmVsb2NhdGlvbiBtdXN0IGJlCi0gICAgIGltbWVkaWF0ZWx5IGZvbGxvd2luZy4gIEhvd2V2ZXIsIGZvciB0aGUgSVJJWDYgQUJJLCB0aGUgbmV4dAotICAgICByZWxvY2F0aW9uIG1heSBiZSBhIGNvbXBvc2VkIHJlbG9jYXRpb24gY29uc2lzdGluZyBvZiBzZXZlcmFsCi0gICAgIHJlbG9jYXRpb25zIGZvciB0aGUgc2FtZSBhZGRyZXNzLiAgSW4gdGhhdCBjYXNlLCB0aGUgUl9NSVBTX0xPMTYKLSAgICAgcmVsb2NhdGlvbiBtYXkgb2NjdXIgYXMgb25lIG9mIHRoZXNlLiAgV2UgcGVybWl0IGEgc2ltaWxhcgotICAgICBleHRlbnNpb24gaW4gZ2VuZXJhbCwgYXMgdGhhdCBpcyB1c2VmdWwgZm9yIEdDQy4gICovCi0gIHdoaWxlIChyZWxvY2F0aW9uIDwgcmVsZW5kKQotICAgIHsKLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKHJlbG9jYXRpb24tPnJfaW5mbykgPT0gUl9NSVBTX0xPMTYpCi0JcmV0dXJuIHJlbG9jYXRpb247Ci0KLSAgICAgICsrcmVsb2NhdGlvbjsKLSAgICB9Ci0KLSAgLyogV2UgZGlkbid0IGZpbmQgaXQuICAqLwotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIENyZWF0ZSBhIHJlbC5keW4gcmVsb2NhdGlvbiBmb3IgdGhlIGR5bmFtaWMgbGlua2VyIHRvIHJlc29sdmUuICBSRUwKLSAgIGlzIHRoZSBvcmlnaW5hbCByZWxvY2F0aW9uLCB3aGljaCBpcyBub3cgYmVpbmcgdHJhbnNmb3JtZWQgaW50byBhCi0gICBkeWFubWljIHJlbG9jYXRpb24uICBUaGUgQURERU5EUCBpcyBhZGp1c3RlZCBpZiBuZWNlc3Nhcnk7IHRoZQotICAgY2FsbGVyIHNob3VsZCBzdG9yZSB0aGUgcmVzdWx0IGluIHBsYWNlIG9mIHRoZSBvcmlnaW5hbCBhZGRlbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfcmVsb2NhdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgcmVsLCBoLCBzZWMsCi0JCQkJICAgIHN5bWJvbCwgYWRkZW5kcCwgaW5wdXRfc2VjdGlvbikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBzeW1ib2w7Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotewotICBFbGZfSW50ZXJuYWxfUmVsIG91dHJlbDsKLSAgYm9vbGVhbiBza2lwOwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBiZmQgKmR5bm9iajsKLSAgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHNyZWxvYyAKLSAgICA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosCi0JCQkgICAgICAgTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUgKG91dHB1dF9iZmQpKTsKLSAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCi0gIHNraXAgPSBmYWxzZTsKLQotICAvKiBXZSBiZWdpbiBieSBhc3N1bWluZyB0aGF0IHRoZSBvZmZzZXQgZm9yIHRoZSBkeW5hbWljIHJlbG9jYXRpb24KLSAgICAgaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBvcmlnaW5hbCByZWxvY2F0aW9uLiAgV2UnbGwgYWRqdXN0IHRoaXMKLSAgICAgbGF0ZXIgdG8gcmVmbGVjdCB0aGUgY29ycmVjdCBvdXRwdXQgb2Zmc2V0cy4gICovCi0gIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0gICAgb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEV4Y2VwdCB0aGF0IGluIGEgc3RhYiBzZWN0aW9uIHRoaW5ncyBhcmUgbW9yZSBjb21wbGV4LgotCSBCZWNhdXNlIHdlIGNvbXByZXNzIHN0YWIgaW5mb3JtYXRpb24sIHRoZSBvZmZzZXQgZ2l2ZW4gaW4gdGhlCi0JIHJlbG9jYXRpb24gbWF5IG5vdCBiZSB0aGUgb25lIHdlIHdhbnQ7IHdlIG11c3QgbGV0IHRoZSBzdGFicwotCSBtYWNoaW5lcnkgdGVsbCB1cyB0aGUgb2Zmc2V0LiAgKi8KLSAgICAgIG91dHJlbC5yX29mZnNldCAKLQk9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkgICAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCSAgICBpbnB1dF9zZWN0aW9uLAotCSAgICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkgICAgcmVsLT5yX29mZnNldCkpOwotICAgICAgLyogSWYgd2UgZGlkbid0IG5lZWQgdGhlIHJlbG9jYXRpb24gYXQgYWxsLCB0aGlzIHZhbHVlIHdpbGwgYmUKLQkgLTEuICAqLwotICAgICAgaWYgKG91dHJlbC5yX29mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0Jc2tpcCA9IHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHdlJ3ZlIGRlY2lkZWQgdG8gc2tpcCB0aGlzIHJlbG9jYXRpb24sIGp1c3Qgb3V0cHV0IGFuIGVtdHB5Ci0gICAgIHJlY29yZC4gIE5vdGUgdGhhdCBSX01JUFNfTk9ORSA9PSAwLCBzbyB0aGF0IHRoaXMgY2FsbCB0byBtZW1zZXQKLSAgICAgaXMgYSB3YXkgb2Ygc2V0dGluZyBSX1RZUEUgdG8gUl9NSVBTX05PTkUuICAqLwotICBpZiAoc2tpcCkKLSAgICBtZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiAob3V0cmVsKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIGluZHg7Ci0gICAgICBiZmRfdm1hIHNlY3Rpb25fb2Zmc2V0OwotCi0gICAgICAvKiBXZSBtdXN0IG5vdyBjYWxjdWxhdGUgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGluZGV4IHRvIHVzZQotCSBpbiB0aGUgcmVsb2NhdGlvbi4gICovCi0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoISBpbmZvLT5zeW1ib2xpYyB8fCAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQl7Ci0JICBpbmR4ID0gaC0+cm9vdC5keW5pbmR4OwotCSAgQkZEX0FTU0VSVCAoaW5keCAhPSAtMSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JICAgIGluZHggPSAwOwotCSAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjLT5vdXRwdXRfc2VjdGlvbiktPmR5bmluZHg7Ci0JICAgICAgaWYgKGluZHggPT0gMCkKLQkJYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgLyogRmlndXJlIG91dCBob3cgZmFyIHRoZSB0YXJnZXQgb2YgdGhlIHJlbG9jYXRpb24gaXMgZnJvbQotCSAgICAgdGhlIGJlZ2lubmluZyBvZiBpdHMgc2VjdGlvbi4gICovCi0JICBzZWN0aW9uX29mZnNldCA9IHN5bWJvbCAtIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIC8qIFRoZSByZWxvY2F0aW9uIHdlJ3JlIGJ1aWxkaW5nIGlzIHNlY3Rpb24tcmVsYXRpdmUuCi0JICAgICBUaGVyZWZvcmUsIHRoZSBvcmlnaW5hbCBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZCBieSB0aGUKLQkgICAgIHNlY3Rpb24gb2Zmc2V0LiAgKi8KLQkgICphZGRlbmRwICs9IHN5bWJvbCAtIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIC8qIE5vdywgdGhlIHJlbG9jYXRpb24gaXMganVzdCBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLQkgIHN5bWJvbCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQl9Ci0gICAgICAKLSAgICAgIC8qIElmIHRoZSByZWxvY2F0aW9uIHdhcyBwcmV2aW91c2x5IGFuIGFic29sdXRlIHJlbG9jYXRpb24sIHdlCi0JIG11c3QgYWRqdXN0IGl0IGJ5IHRoZSB2YWx1ZSB3ZSBnaXZlIGl0IGluIHRoZSBkeW5hbWljIHN5bWJvbAotCSB0YWJsZS4gICovCi0gICAgICBpZiAocl90eXBlICE9IFJfTUlQU19SRUwzMikKLQkqYWRkZW5kcCArPSBzeW1ib2w7Ci0KLSAgICAgIC8qIFRoZSByZWxvY2F0aW9uIGlzIGFsd2F5cyBhbiBSRUwzMiByZWxvY2F0aW9uIGJlY2F1c2Ugd2UgZG9uJ3QKLQkga25vdyB3aGVyZSB0aGUgc2hhcmVkIGxpYnJhcnkgd2lsbCB3aW5kIHVwIGF0IGxvYWQtdGltZS4gICovCi0gICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChpbmR4LCBSX01JUFNfUkVMMzIpOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIG91dHB1dCBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gdG8gcmVmZXJlbmNlIHRoZQotCSBjb3JyZWN0IGxvY2F0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICB9Ci0KLSAgLyogUHV0IHRoZSByZWxvY2F0aW9uIGJhY2sgb3V0LiAgV2UgaGF2ZSB0byB1c2UgdGhlIHNwZWNpYWwKLSAgICAgcmVsb2NhdGlvbiBvdXRwdXR0ZXIgaW4gdGhlIDY0LWJpdCBjYXNlIHNpbmNlIHRoZSA2NC1iaXQKLSAgICAgcmVsb2NhdGlvbiBmb3JtYXQgaXMgbm9uLXN0YW5kYXJkLiAgKi8KLSAgaWYgKEFCSV82NF9QIChvdXRwdXRfYmZkKSkKLSAgICB7Ci0gICAgICAoKmdldF9lbGZfYmFja2VuZF9kYXRhIChvdXRwdXRfYmZkKS0+cy0+c3dhcF9yZWxvY19vdXQpCi0JKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JIChzcmVsb2MtPmNvbnRlbnRzIAotCSAgKyBzcmVsb2MtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCkpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkgICAgICAoKChFbGYzMl9FeHRlcm5hbF9SZWwgKikKLQkJCQlzcmVsb2MtPmNvbnRlbnRzKQotCQkJICAgICAgICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOwotCi0gIC8qIFJlY29yZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHJlbG9jYXRpb24gcmVmZXJlbmNpbmcgSC4gIFRoaXMKLSAgICAgaW5mb3JtYXRpb24gaXMgbGF0ZXIgZW1pdHRlZCBpbiB0aGUgLm1zeW0gc2VjdGlvbi4gICovCi0gIGlmIChoICE9IE5VTEwKLSAgICAgICYmIChoLT5taW5fZHluX3JlbG9jX2luZGV4ID09IDAgCi0JICB8fCBzcmVsb2MtPnJlbG9jX2NvdW50IDwgaC0+bWluX2R5bl9yZWxvY19pbmRleCkpCi0gICAgaC0+bWluX2R5bl9yZWxvY19pbmRleCA9IHNyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogV2UndmUgbm93IGFkZGVkIGFub3RoZXIgcmVsb2NhdGlvbi4gICovCi0gICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotICAvKiBNYWtlIHN1cmUgdGhlIG91dHB1dCBzZWN0aW9uIGlzIHdyaXRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyCi0gICAgIHdpbGwgYmUgd3JpdGluZyB0byBpdC4gICovCi0gIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZmxhZ3MKLSAgICB8PSBTSEZfV1JJVEU7Ci0KLSAgLyogT24gSVJJWDUsIG1ha2UgYW4gZW50cnkgb2YgY29tcGFjdCByZWxvY2F0aW9uIGluZm8uICAqLwotICBpZiAoISBza2lwICYmIElSSVhfQ09NUEFUIChvdXRwdXRfYmZkKSA9PSBpY3RfaXJpeDUpCi0gICAgewotICAgICAgYXNlY3Rpb24qIHNjcHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmNvbXBhY3RfcmVsIik7Ci0gICAgICBiZmRfYnl0ZSAqY3I7Ci0KLSAgICAgIGlmIChzY3B0KQotCXsKLQkgIEVsZjMyX2NyaW5mbyBjcHRyZWw7Ci0KLQkgIG1pcHNfZWxmX3NldF9jcl9mb3JtYXQgKGNwdHJlbCwgQ1JGX01JUFNfTE9ORyk7Ci0JICBjcHRyZWwudmFkZHIgPSAocmVsLT5yX29mZnNldAotCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIGlmIChyX3R5cGUgPT0gUl9NSVBTX1JFTDMyKQotCSAgICBtaXBzX2VsZl9zZXRfY3JfdHlwZSAoY3B0cmVsLCBDUlRfTUlQU19SRUwzMik7Ci0JICBlbHNlCi0JICAgIG1pcHNfZWxmX3NldF9jcl90eXBlIChjcHRyZWwsIENSVF9NSVBTX1dPUkQpOwotCSAgbWlwc19lbGZfc2V0X2NyX2Rpc3QydG8gKGNwdHJlbCwgMCk7Ci0JICBjcHRyZWwua29uc3QgPSAqYWRkZW5kcDsKLQotCSAgY3IgPSAoc2NwdC0+Y29udGVudHMKLQkJKyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKSk7Ci0JICBiZmRfZWxmMzJfc3dhcF9jcmluZm9fb3V0IChvdXRwdXRfYmZkLCAmY3B0cmVsLAotCQkJCSAgICAgKChFbGYzMl9FeHRlcm5hbF9jcmluZm8gKikgY3IKLQkJCQkgICAgICArIHNjcHQtPnJlbG9jX2NvdW50KSk7Ci0JICArK3NjcHQtPnJlbG9jX2NvdW50OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgdmFsdWUgcHJvZHVjZWQgYnkgdGhlIFJFTE9DQVRJT04gKHdoaWNoIGNvbWVzIGZyb20KLSAgIHRoZSBJTlBVVF9CRkQpLiAgVGhlIEFEREVORCBpcyB0aGUgYWRkZW5kIHRvIHVzZSBmb3IgdGhpcwotICAgUkVMT0NBVElPTjsgUkVMT0NBVElPTi0+Ul9BRERFTkQgaXMgaWdub3JlZC4KLQotICAgVGhlIHJlc3VsdCBvZiB0aGUgcmVsb2NhdGlvbiBjYWxjdWxhdGlvbiBpcyBzdG9yZWQgaW4gVkFMVUVQLgotICAgUkVRVUlSRV9KQUxYUCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIG9wY29kZSB1c2VkIHdpdGggdGhpcwotICAgcmVsb2NhdGlvbiBtdXN0IGJlIEpBTFguCi0KLSAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBiZmRfcmVsb2NfY29udGludWUgaWYgdGhlIGNhbGxlciBuZWVkIHRha2Ugbm8KLSAgIGZ1cnRoZXIgYWN0aW9uIHJlZ2FyZGluZyB0aGlzIHJlbG9jYXRpb24sIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQgaWYKLSAgIHNvbWV0aGluZyBnb2VzIGRyYW1hdGljYWxseSB3cm9uZywgYmZkX3JlbG9jX292ZXJmbG93IGlmIGFuCi0gICBvdmVyZmxvdyBvY2N1cnMsIGFuZCBiZmRfcmVsb2Nfb2sgdG8gaW5kaWNhdGUgc3VjY2Vzcy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uIChhYmZkLCAKLQkJCSAgICAgICBpbnB1dF9iZmQsCi0JCQkgICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgICBpbmZvLAotCQkJICAgICAgIHJlbG9jYXRpb24sCi0JCQkgICAgICAgYWRkZW5kLAotCQkJICAgICAgIGhvd3RvLAotCQkJICAgICAgIGxvY2FsX3N5bXMsCi0JCQkgICAgICAgbG9jYWxfc2VjdGlvbnMsCi0JCQkgICAgICAgdmFsdWVwLAotCQkJICAgICAgIG5hbWVwLAotCQkJICAgICAgIHJlcXVpcmVfamFseHApIAotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY2F0aW9uOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci0gICAgIGJmZF92bWEgKnZhbHVlcDsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwOwotICAgICBib29sZWFuICpyZXF1aXJlX2phbHhwOwotewotICAvKiBUaGUgZXZlbnR1YWwgdmFsdWUgd2Ugd2lsbCByZXR1cm4uICAqLwotICBiZmRfdm1hIHZhbHVlOwotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGFnYWluc3Qgd2hpY2ggdGhlIHJlbG9jYXRpb24gaXMKLSAgICAgb2NjdXJyaW5nLiAgKi8KLSAgYmZkX3ZtYSBzeW1ib2wgPSAwOwotICAvKiBUaGUgZmluYWwgR1AgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIHJlbG9jYXRhYmxlLCBleGVjdXRhYmxlLCBvcgotICAgICBzaGFyZWQgb2JqZWN0IGZpbGUgYmVpbmcgcHJvZHVjZWQuICAqLwotICBiZmRfdm1hIGdwID0gKGJmZF92bWEpIC0gMTsKLSAgLyogVGhlIHBsYWNlIChzZWN0aW9uIG9mZnNldCBvciBhZGRyZXNzKSBvZiB0aGUgc3RvcmFnZSB1bml0IGJlaW5nCi0gICAgIHJlbG9jYXRlZC4gICovCi0gIGJmZF92bWEgcDsKLSAgLyogVGhlIHZhbHVlIG9mIEdQIHVzZWQgdG8gY3JlYXRlIHRoZSByZWxvY2F0YWJsZSBvYmplY3QuICAqLwotICBiZmRfdm1hIGdwMCA9IChiZmRfdm1hKSAtIDE7Ci0gIC8qIFRoZSBvZmZzZXQgaW50byB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBhdCB3aGljaCB0aGUgYWRkcmVzcyBvZgotICAgICB0aGUgcmVsb2NhdGlvbiBlbnRyeSBzeW1ib2wsIGFkanVzdGVkIGJ5IHRoZSBhZGRlbmQsIHJlc2lkZXMKLSAgICAgZHVyaW5nIGV4ZWN1dGlvbi4gICovCi0gIGJmZF92bWEgZyA9IChiZmRfdm1hKSAtIDE7Ci0gIC8qIFRoZSBzZWN0aW9uIGluIHdoaWNoIHRoZSBzeW1ib2wgcmVmZXJlbmNlZCBieSB0aGUgcmVsb2NhdGlvbiBpcwotICAgICBsb2NhdGVkLiAgKi8KLSAgYXNlY3Rpb24gKnNlYyA9IE5VTEw7Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkqIGggPSBOVUxMOwotICAvKiBUcnVlIGlmIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhpcyByZWxvY2F0aW9uIGlzIGEgbG9jYWwKLSAgICAgc3ltYm9sLiAgKi8KLSAgYm9vbGVhbiBsb2NhbF9wOwotICAvKiBUcnVlIGlmIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhpcyByZWxvY2F0aW9uIGlzICJfZ3BfZGlzcCIuICAqLwotICBib29sZWFuIGdwX2Rpc3BfcCA9IGZhbHNlOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc2l6ZV90IGV4dHN5bW9mZjsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgaW50IHJfdHlwZTsKLSAgLyogVHJ1ZSBpZiBvdmVyZmxvdyBvY2N1cnJlZCBkdXJpbmcgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZQotICAgICByZWxvY2F0aW9uIHZhbHVlLiAgKi8KLSAgYm9vbGVhbiBvdmVyZmxvd2VkX3A7Ci0gIC8qIFRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHJlZmVycyB0byBhIE1JUFMxNiBmdW5jdGlvbi4gICovCi0gIGJvb2xlYW4gdGFyZ2V0X2lzXzE2X2JpdF9jb2RlX3AgPSBmYWxzZTsKLQotICAvKiBQYXJzZSB0aGUgcmVsb2NhdGlvbi4gICovCi0gIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbG9jYXRpb24tPnJfaW5mbyk7Ci0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsb2NhdGlvbi0+cl9pbmZvKTsKLSAgcCA9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hIAotICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICAgICsgcmVsb2NhdGlvbi0+cl9vZmZzZXQpOwotCi0gIC8qIEFzc3VtZSB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gb3ZlcmZsb3cuICAqLwotICBvdmVyZmxvd2VkX3AgPSBmYWxzZTsKLQotICAvKiBGaWd1cmUgb3V0IHdoZXRoZXIgb3Igbm90IHRoZSBzeW1ib2wgaXMgbG9jYWwsIGFuZCBnZXQgdGhlIG9mZnNldAotICAgICB1c2VkIGluIHRoZSBhcnJheSBvZiBoYXNoIHRhYmxlIGVudHJpZXMuICAqLwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgbG9jYWxfcCA9IG1pcHNfZWxmX2xvY2FsX3JlbG9jYXRpb25fcCAoaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCQkgbG9jYWxfc2VjdGlvbnMpOwotICBpZiAoISBlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKSkKLSAgICBleHRzeW1vZmYgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBlbHNlCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCB0YWJsZSBkb2VzIG5vdCBmb2xsb3cgdGhlIHJ1bGUgdGhhdCBsb2NhbCBzeW1ib2xzCi0JIG11c3QgY29tZSBiZWZvcmUgZ2xvYmFscy4gICovCi0gICAgICBleHRzeW1vZmYgPSAwOwotICAgIH0KLSAgICAgIAotICAvKiBGaWd1cmUgb3V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgKi8KLSAgaWYgKGxvY2FsX3ApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotCi0gICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0gICAgICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0KLSAgICAgIHN5bWJvbCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldDsKLSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfU0VDVElPTikKLQlzeW1ib2wgKz0gc3ltLT5zdF92YWx1ZTsKLQotICAgICAgLyogTUlQUzE2IHRleHQgbGFiZWxzIHNob3VsZCBiZSB0cmVhdGVkIGFzIG9kZC4gICovCi0gICAgICBpZiAoc3ltLT5zdF9vdGhlciA9PSBTVE9fTUlQUzE2KQotCSsrc3ltYm9sOwotCi0gICAgICAvKiBSZWNvcmQgdGhlIG5hbWUgb2YgdGhpcyBzeW1ib2wsIGZvciBvdXIgY2FsbGVyLiAgKi8KLSAgICAgICpuYW1lcCA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCXN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQlzeW0tPnN0X25hbWUpOwotICAgICAgaWYgKCpuYW1lcCA9PSAnXDAnKQotCSpuYW1lcCA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQotICAgICAgdGFyZ2V0X2lzXzE2X2JpdF9jb2RlX3AgPSAoc3ltLT5zdF9vdGhlciA9PSBTVE9fTUlQUzE2KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3IgZ2xvYmFsIHN5bWJvbHMgd2UgbG9vayB1cCB0aGUgc3ltYm9sIGluIHRoZSBoYXNoLXRhYmxlLiAgKi8KLSAgICAgIGggPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgCi0JICAgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkgW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXSk7Ci0gICAgICAvKiBGaW5kIHRoZSByZWFsIGhhc2gtdGFibGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCSAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQloID0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC5yb290LnUuaS5saW5rOwotICAgICAgCi0gICAgICAvKiBSZWNvcmQgdGhlIG5hbWUgb2YgdGhpcyBzeW1ib2wsIGZvciBvdXIgY2FsbGVyLiAgKi8KLSAgICAgICpuYW1lcCA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgaXMgdGhlIHNwZWNpYWwgX2dwX2Rpc3Agc3ltYm9sLiAgTm90ZSB0aGF0IHN1Y2ggYQotCSBzeW1ib2wgbXVzdCBhbHdheXMgYmUgYSBnbG9iYWwgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgIl9ncF9kaXNwIikgPT0gMCkKLQl7Ci0JICAvKiBSZWxvY2F0aW9ucyBhZ2FpbnN0IF9ncF9kaXNwIGFyZSBwZXJtaXR0ZWQgb25seSB3aXRoCi0JICAgICBSX01JUFNfSEkxNiBhbmQgUl9NSVBTX0xPMTYgcmVsb2NhdGlvbnMuICAqLwotCSAgaWYgKHJfdHlwZSAhPSBSX01JUFNfSEkxNiAmJiByX3R5cGUgIT0gUl9NSVBTX0xPMTYpCi0JICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0JICBncF9kaXNwX3AgPSB0cnVlOwotCX0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQsIGNhbGN1bGF0ZSBpdHMgYWRkcmVzcy4gIE5vdGUgdGhhdAotCSBfZ3BfZGlzcCBpcyBhIG1hZ2ljIHN5bWJvbCwgYWx3YXlzIGltcGxpY2l0bHkgZGVmaW5lZCBieSB0aGUKLQkgbGlua2VyLCBzbyBpdCdzIGluYXBwcm9wcmlhdGUgdG8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgb3Igbm90Ci0JIGl0cyBkZWZpbmVkLiAgKi8KLSAgICAgIGVsc2UgaWYgKChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgICAmJiBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikKLQl7Ci0JICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uKQotCSAgICBzeW1ib2wgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlIAotCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICBlbHNlCi0JICAgIHN5bWJvbCA9IGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkvKiBXZSBhbGxvdyByZWxvY2F0aW9ucyBhZ2FpbnN0IHVuZGVmaW5lZCB3ZWFrIHN5bWJvbHMsIGdpdmluZwotCSAgIGl0IHRoZSB2YWx1ZSB6ZXJvLCBzbyB0aGF0IHlvdSBjYW4gdW5kZWZpbmVkIHdlYWsgZnVuY3Rpb25zCi0JICAgYW5kIGNoZWNrIHRvIHNlZSBpZiB0aGV5IGV4aXN0IGJ5IGxvb2tpbmcgYXQgdGhlaXIKLQkgICBhZGRyZXNzZXMuICAqLwotCXN5bWJvbCA9IDA7Ci0gICAgICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0Jc3ltYm9sID0gMDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUNfTElOSyIpID09IDApCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgbGluaywgd2Ugc2hvdWxkIGhhdmUgY3JlYXRlZCBhCi0JICAgICBfRFlOQU1JQ19MSU5LIHN5bWJvbCBpbiBtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQkgICAgIE90aGVyd2lzZSwgd2Ugc2hvdWxkIGRlZmluZSB0aGUgc3ltYm9sIHdpdGggYSB2YWx1ZSBvZiAwLgotCSAgICAgRklYTUU6IEl0IHNob3VsZCBwcm9iYWJseSBnZXQgaW50byB0aGUgc3ltYm9sIHRhYmxlCi0JICAgICBzb21laG93IGFzIHdlbGwuICAqLwotCSAgQkZEX0FTU0VSVCAoISBpbmZvLT5zaGFyZWQpOwotCSAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpID09IE5VTEwpOwotCSAgc3ltYm9sID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JICAgIChpbmZvLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbG9jYXRpb24tPnJfb2Zmc2V0KTsKLQkgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCX0KLQotICAgICAgdGFyZ2V0X2lzXzE2X2JpdF9jb2RlX3AgPSAoaC0+cm9vdC5vdGhlciA9PSBTVE9fTUlQUzE2KTsKLSAgICB9Ci0gIAotICAvKiBJZiB0aGlzIGlzIGEgMzItYml0IGNhbGwgdG8gYSAxNi1iaXQgZnVuY3Rpb24gd2l0aCBhIHN0dWIsIHdlCi0gICAgIG5lZWQgdG8gcmVkaXJlY3QgdGhlIGNhbGwgdG8gdGhlIHN0dWIsIHVubGVzcyB3ZSdyZSBhbHJlYWR5ICppbioKLSAgICAgYSBzdHViLiAgKi8KLSAgaWYgKHJfdHlwZSAhPSBSX01JUFMxNl8yNiAmJiAhaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAoKGggIT0gTlVMTCAmJiBoLT5mbl9zdHViICE9IE5VTEwpCi0JICB8fCAobG9jYWxfcCAmJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPmxvY2FsX3N0dWJzICE9IE5VTEwKLQkgICAgICAmJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPmxvY2FsX3N0dWJzW3Jfc3ltbmR4XSAhPSBOVUxMKSkKLSAgICAgICYmICFtaXBzX2VsZl9zdHViX3NlY3Rpb25fcCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgMzItYml0IGNhbGwgdG8gYSAxNi1iaXQgZnVuY3Rpb24uICBXZSBzaG91bGQKLQkgaGF2ZSBhbHJlYWR5IG5vdGljZWQgdGhhdCB3ZSB3ZXJlIGdvaW5nIHRvIG5lZWQgdGhlCi0JIHN0dWIuICAqLwotICAgICAgaWYgKGxvY2FsX3ApCi0Jc2VjID0gZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9zdHVic1tyX3N5bW5keF07Ci0gICAgICBlbHNlCi0JewotCSAgQkZEX0FTU0VSVCAoaC0+bmVlZF9mbl9zdHViKTsKLQkgIHNlYyA9IGgtPmZuX3N0dWI7Ci0JfQotCi0gICAgICBzeW1ib2wgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgfQotICAvKiBJZiB0aGlzIGlzIGEgMTYtYml0IGNhbGwgdG8gYSAzMi1iaXQgZnVuY3Rpb24gd2l0aCBhIHN0dWIsIHdlCi0gICAgIG5lZWQgdG8gcmVkaXJlY3QgdGhlIGNhbGwgdG8gdGhlIHN0dWIuICAqLwotICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTMTZfMjYgJiYgIWluZm8tPnJlbG9jYXRlYWJsZQotCSAgICYmIGggIT0gTlVMTCAKLQkgICAmJiAoaC0+Y2FsbF9zdHViICE9IE5VTEwgfHwgaC0+Y2FsbF9mcF9zdHViICE9IE5VTEwpCi0JICAgJiYgIXRhcmdldF9pc18xNl9iaXRfY29kZV9wKQotICAgIHsKLSAgICAgIC8qIElmIGJvdGggY2FsbF9zdHViIGFuZCBjYWxsX2ZwX3N0dWIgYXJlIGRlZmluZWQsIHdlIGNhbiBmaWd1cmUKLQkgb3V0IHdoaWNoIG9uZSB0byB1c2UgYnkgc2VlaW5nIHdoaWNoIG9uZSBhcHBlYXJzIGluIHRoZSBpbnB1dAotCSBmaWxlLiAgKi8KLSAgICAgIGlmIChoLT5jYWxsX3N0dWIgIT0gTlVMTCAmJiBoLT5jYWxsX2ZwX3N0dWIgIT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqbzsKLQotCSAgc2VjID0gTlVMTDsKLQkgIGZvciAobyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgbyksCi0JCQkgICBDQUxMX0ZQX1NUVUIsIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSA9PSAwKQotCQl7Ci0JCSAgc2VjID0gaC0+Y2FsbF9mcF9zdHViOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGlmIChzZWMgPT0gTlVMTCkKLQkgICAgc2VjID0gaC0+Y2FsbF9zdHViOwotCX0KLSAgICAgIGVsc2UgaWYgKGgtPmNhbGxfc3R1YiAhPSBOVUxMKQotCXNlYyA9IGgtPmNhbGxfc3R1YjsKLSAgICAgIGVsc2UKLQlzZWMgPSBoLT5jYWxsX2ZwX3N0dWI7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHNlYy0+X3Jhd19zaXplID4gMCk7Ci0gICAgICBzeW1ib2wgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgfQotCi0gIC8qIENhbGxzIGZyb20gMTYtYml0IGNvZGUgdG8gMzItYml0IGNvZGUgYW5kIHZpY2UgdmVyc2EgcmVxdWlyZSB0aGUKLSAgICAgc3BlY2lhbCBqYWx4IGluc3RydWN0aW9uLiAgKi8KLSAgKnJlcXVpcmVfamFseHAgPSAoIWluZm8tPnJlbG9jYXRlYWJsZQotCQkgICAgJiYgKChyX3R5cGUgPT0gUl9NSVBTMTZfMjYpICE9IHRhcmdldF9pc18xNl9iaXRfY29kZV9wKSk7Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRldGVybWluZWQgdGhlIEdPVCBvZmZzZXQsIG9yIHRoZSBHUCB2YWx1ZSwKLSAgICAgYW5kIHdlJ3JlIGdvaW5nIHRvIG5lZWQgaXQsIGdldCBpdCBub3cuICAqLwotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX01JUFNfQ0FMTDE2OgotICAgIGNhc2UgUl9NSVBTX0dPVDE2OgotICAgIGNhc2UgUl9NSVBTX0dPVF9ESVNQOgotICAgIGNhc2UgUl9NSVBTX0dPVF9ISTE2OgotICAgIGNhc2UgUl9NSVBTX0NBTExfSEkxNjoKLSAgICBjYXNlIFJfTUlQU19HT1RfTE8xNjoKLSAgICBjYXNlIFJfTUlQU19DQUxMX0xPMTY6Ci0gICAgICAvKiBGaW5kIHRoZSBpbmRleCBpbnRvIHRoZSBHT1Qgd2hlcmUgdGhpcyB2YWx1ZSBpcyBsb2NhdGVkLiAgKi8KLSAgICAgIGlmICghbG9jYWxfcCkKLQl7Ci0JICBCRkRfQVNTRVJUIChhZGRlbmQgPT0gMCk7Ci0JICBnID0gbWlwc19lbGZfZ2xvYmFsX2dvdF9pbmRleCAKLQkgICAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCSAgICAgKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KikgaCk7Ci0JfQotICAgICAgZWxzZSBpZiAocl90eXBlID09IFJfTUlQU19HT1QxNikKLQkvKiBUaGVyZSdzIG5vIG5lZWQgdG8gY3JlYXRlIGEgbG9jYWwgR09UIGVudHJ5IGhlcmU7IHRoZQotCSAgIGNhbGN1bGF0aW9uIGZvciBhIGxvY2FsIEdPVDE2IGVudHJ5IGRvZXMgbm90IGludm9sdmUgRy4gICovCi0JYnJlYWs7Ci0gICAgICBlbHNlCi0JewotCSAgZyA9IG1pcHNfZWxmX2xvY2FsX2dvdF9pbmRleCAoYWJmZCwgaW5mbywgc3ltYm9sICsgYWRkZW5kKTsKLQkgIGlmIChnID09IChiZmRfdm1hKSAtMSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogQ29udmVydCBHT1QgaW5kaWNlcyB0byBhY3R1YWwgb2Zmc2V0cy4gICovCi0gICAgICBnID0gbWlwc19lbGZfZ290X29mZnNldF9mcm9tX2luZGV4IChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkJICBhYmZkLCBnKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX01JUFNfSEkxNjoKLSAgICBjYXNlIFJfTUlQU19MTzE2OgotICAgIGNhc2UgUl9NSVBTX0dQUkVMMTY6Ci0gICAgY2FzZSBSX01JUFNfR1BSRUwzMjoKLSAgICBjYXNlIFJfTUlQU19MSVRFUkFMOgotICAgICAgZ3AwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGlucHV0X2JmZCk7Ci0gICAgICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBGaWd1cmUgb3V0IHdoYXQga2luZCBvZiByZWxvY2F0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZC4gICovCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfTUlQU19OT05FOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICAgIGNhc2UgUl9NSVBTXzE2OgotICAgICAgdmFsdWUgPSBzeW1ib2wgKyBtaXBzX2VsZl9zaWduX2V4dGVuZCAoYWRkZW5kLCAxNik7Ci0gICAgICBvdmVyZmxvd2VkX3AgPSBtaXBzX2VsZl9vdmVyZmxvd19wICh2YWx1ZSwgMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU18zMjoKLSAgICBjYXNlIFJfTUlQU19SRUwzMjoKLSAgICBjYXNlIFJfTUlQU182NDoKLSAgICAgIGlmICgoaW5mby0+c2hhcmVkCi0JICAgfHwgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JICAgICAgICYmIGggIT0gTlVMTAotCSAgICAgICAmJiAoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpCi0JCSAgID09IDApKSkKLQkgICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQl7Ci0JICAvKiBJZiB3ZSdyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBvciB0aGlzIHJlbG9jYXRpb24gaXMKLQkgICAgIGFnYWluc3QgYSBzeW1ib2wgaW4gYSBzaGFyZWQgbGlicmFyeSwgdGhlbiB3ZSBjYW4ndCBrbm93Ci0JICAgICB3aGVyZSB0aGUgc3ltYm9sIHdpbGwgZW5kIHVwLiAgU28sIHdlIGNyZWF0ZSBhIHJlbG9jYXRpb24KLQkgICAgIHJlY29yZCBpbiB0aGUgb3V0cHV0LCBhbmQgbGVhdmUgdGhlIGpvYiB1cCB0byB0aGUgZHluYW1pYwotCSAgICAgbGlua2VyLiAgKi8KLQkgIHZhbHVlID0gYWRkZW5kOwotCSAgaWYgKCFtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19yZWxvY2F0aW9uIChhYmZkLCAKLQkJCQkJCSAgIGluZm8sIAotCQkJCQkJICAgcmVsb2NhdGlvbiwKLQkJCQkJCSAgIGgsCi0JCQkJCQkgICBzZWMsCi0JCQkJCQkgICBzeW1ib2wsCi0JCQkJCQkgICAmdmFsdWUsCi0JCQkJCQkgICBpbnB1dF9zZWN0aW9uKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocl90eXBlICE9IFJfTUlQU19SRUwzMikKLQkgICAgdmFsdWUgPSBzeW1ib2wgKyBhZGRlbmQ7Ci0JICBlbHNlCi0JICAgIHZhbHVlID0gYWRkZW5kOwotCX0KLSAgICAgIHZhbHVlICY9IGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFMxNl8yNjoKLSAgICAgIC8qIFRoZSBjYWxjdWxhdGlvbiBmb3IgUl9NSVBTXzI2IGlzIGp1c3QgdGhlIHNhbWUgYXMgZm9yIGFuCi0JIFJfTUlQU18yNi4gIEl0J3Mgb25seSB0aGUgc3RvcmFnZSBvZiB0aGUgcmVsb2NhdGVkIGZpZWxkIGludG8KLQkgdGhlIG91dHB1dCBmaWxlIHRoYXQncyBkaWZmZXJlbnQuICBUaGF0J3MgaGFuZGxlZCBpbgotCSBtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24uICBTbywgd2UganVzdCBmYWxsIHRocm91Z2ggdG8gdGhlCi0JIFJfTUlQU18yNiBjYXNlIGhlcmUuICAqLwotICAgIGNhc2UgUl9NSVBTXzI2OgotICAgICAgaWYgKGxvY2FsX3ApCi0JdmFsdWUgPSAoKChhZGRlbmQgPDwgMikgfCAocCAmIDB4ZjAwMDAwMDApKSArIHN5bWJvbCkgPj4gMjsKLSAgICAgIGVsc2UKLQl2YWx1ZSA9IChtaXBzX2VsZl9zaWduX2V4dGVuZCAoYWRkZW5kIDw8IDIsIDI4KSArIHN5bWJvbCkgPj4gMjsKLSAgICAgIHZhbHVlICY9IGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfSEkxNjoKLSAgICAgIGlmICghZ3BfZGlzcF9wKQotCXsKLQkgIHZhbHVlID0gbWlwc19lbGZfaGlnaCAoYWRkZW5kICsgc3ltYm9sKTsKLQkgIHZhbHVlICY9IGhvd3RvLT5kc3RfbWFzazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdmFsdWUgPSBtaXBzX2VsZl9oaWdoIChhZGRlbmQgKyBncCAtIHApOwotCSAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0xPMTY6Ci0gICAgICBpZiAoIWdwX2Rpc3BfcCkKLQl2YWx1ZSA9IChzeW1ib2wgKyBhZGRlbmQpICYgaG93dG8tPmRzdF9tYXNrOwotICAgICAgZWxzZQotCXsKLQkgIHZhbHVlID0gYWRkZW5kICsgZ3AgLSBwICsgNDsKLQkgIC8qIFRoZSBNSVBTIEFCSSByZXF1aXJlcyBjaGVja2luZyB0aGUgUl9NSVBTX0xPMTYgcmVsb2NhdGlvbgotCSAgICAgZm9yIG92ZXJmbG93LiAgQnV0LCBvbiwgc2F5LCBJcml4IDUsIHJlbG9jYXRpb25zIGFnYWluc3QKLQkgICAgIF9ncF9kaXNwIGFyZSBub3JtYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgLmNwbG9hZAotCSAgICAgcHNldWRvLW9wLiAgSXQgZ2VuZXJhdGVzIGNvZGUgdGhhdCBub3JtYWxseSBsb29rcyBsaWtlCi0JICAgICB0aGlzOgotCi0JICAgICAgIGx1aSAgICAkZ3AsJWhpKF9ncF9kaXNwKQotCSAgICAgICBhZGRpdSAgJGdwLCRncCwlbG8oX2dwX2Rpc3ApCi0JICAgICAgIGFkZHUgICAkZ3AsJGdwLCR0OQotCi0JICAgICBIZXJlICR0OSBob2xkcyB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLAotCSAgICAgYXMgcmVxdWlyZWQgYnkgdGhlIE1JUFMgRUxGIEFCSS4gIFRoZSBSX01JUFNfTE8xNgotCSAgICAgcmVsb2NhdGlvbiBjYW4gZWFzaWx5IG92ZXJmbG93IGluIHRoaXMgc2l0dWF0aW9uLCBidXQgdGhlCi0JICAgICBSX01JUFNfSEkxNiByZWxvY2F0aW9uIHdpbGwgaGFuZGxlIHRoZSBvdmVyZmxvdy4KLQkgICAgIFRoZXJlZm9yZSwgd2UgY29uc2lkZXIgdGhpcyBhIGJ1ZyBpbiB0aGUgTUlQUyBBQkksIGFuZCBkbwotCSAgICAgbm90IGNoZWNrIGZvciBvdmVyZmxvdyBoZXJlLiAgKi8KLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0xJVEVSQUw6Ci0gICAgICAvKiBCZWNhdXNlIHdlIGRvbid0IG1lcmdlIGxpdGVyYWwgc2VjdGlvbnMsIHdlIGNhbiBoYW5kbGUgdGhpcwotCSBqdXN0IGxpa2UgUl9NSVBTX0dQUkVMMTYuICBJbiB0aGUgbG9uZyBydW4sIHdlIHNob3VsZCBtZXJnZQotCSBzaGFyZWQgbGl0ZXJhbHMsIGFuZCB0aGVuIHdlIHdpbGwgbmVlZCB0byBhZGRpdGlvbmFsIHdvcmsKLQkgaGVyZS4gICovCi0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0KLSAgICBjYXNlIFJfTUlQUzE2X0dQUkVMOgotICAgICAgLyogVGhlIFJfTUlQUzE2X0dQUkVMIHBlcmZvcm1zIHRoZSBzYW1lIGNhbGN1bGF0aW9uIGFzCi0JIFJfTUlQU19HUFJFTDE2LCBidXQgc3RvcmVzIHRoZSByZWxvY2F0ZWQgYml0cyBpbiBhIGRpZmZlcmVudAotCSBvcmRlci4gIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCBoZXJlOyB0aGUKLQkgZGlmZmVyZW5jZXMgYXJlIGhhbmRsZWQgaW4gbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uLiAgKi8KLSAgICBjYXNlIFJfTUlQU19HUFJFTDE2OgotICAgICAgaWYgKGxvY2FsX3ApCi0JdmFsdWUgPSBtaXBzX2VsZl9zaWduX2V4dGVuZCAoYWRkZW5kLCAxNikgKyBzeW1ib2wgKyBncDAgLSBncDsKLSAgICAgIGVsc2UKLQl2YWx1ZSA9IG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChhZGRlbmQsIDE2KSArIHN5bWJvbCAtIGdwOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX01JUFNfR09UMTY6Ci0gICAgICBpZiAobG9jYWxfcCkKLQl7Ci0JICB2YWx1ZSA9IG1pcHNfZWxmX2dvdDE2X2VudHJ5IChhYmZkLCBpbmZvLCBzeW1ib2wgKyBhZGRlbmQpOwotCSAgaWYgKHZhbHVlID09IChiZmRfdm1hKSAtMSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgdmFsdWUgCi0JICAgID0gbWlwc19lbGZfZ290X29mZnNldF9mcm9tX2luZGV4IChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkJICAgICAgYWJmZCwKLQkJCQkJICAgICAgdmFsdWUpOwotCSAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQotICAgIGNhc2UgUl9NSVBTX0NBTEwxNjoKLSAgICBjYXNlIFJfTUlQU19HT1RfRElTUDoKLSAgICAgIHZhbHVlID0gZzsKLSAgICAgIG92ZXJmbG93ZWRfcCA9IG1pcHNfZWxmX292ZXJmbG93X3AgKHZhbHVlLCAxNik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0dQUkVMMzI6Ci0gICAgICB2YWx1ZSA9IChhZGRlbmQgKyBzeW1ib2wgKyBncDAgLSBncCkgJiBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX1BDMTY6Ci0gICAgICB2YWx1ZSA9IG1pcHNfZWxmX3NpZ25fZXh0ZW5kIChhZGRlbmQsIDE2KSArIHN5bWJvbCAtIHA7Ci0gICAgICB2YWx1ZSA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSB2YWx1ZSAvIDQpOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0gICAgY2FzZSBSX01JUFNfQ0FMTF9ISTE2OgotICAgICAgLyogV2UncmUgYWxsb3dlZCB0byBoYW5kbGUgdGhlc2UgdHdvIHJlbG9jYXRpb25zIGlkZW50aWNhbGx5LgotCSBUaGUgZHluYW1pYyBsaW5rZXIgaXMgYWxsb3dlZCB0byBoYW5kbGUgdGhlIENBTEwgcmVsb2NhdGlvbnMKLQkgZGlmZmVyZW50bHkgYnkgY3JlYXRpbmcgYSBsYXp5IGV2YWx1YXRpb24gc3R1Yi4gICovCi0gICAgICB2YWx1ZSA9IGc7Ci0gICAgICB2YWx1ZSA9IG1pcHNfZWxmX2hpZ2ggKHZhbHVlKTsKLSAgICAgIHZhbHVlICY9IGhvd3RvLT5kc3RfbWFzazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfR09UX0xPMTY6Ci0gICAgY2FzZSBSX01JUFNfQ0FMTF9MTzE2OgotICAgICAgdmFsdWUgPSBnICYgaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19HT1RfUEFHRToKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfZ290X3BhZ2UgKGFiZmQsIGluZm8sIHN5bWJvbCArIGFkZGVuZCwgTlVMTCk7Ci0gICAgICBpZiAodmFsdWUgPT0gKGJmZF92bWEpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfZ290X29mZnNldF9mcm9tX2luZGV4IChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkJICAgICAgYWJmZCwKLQkJCQkJICAgICAgdmFsdWUpOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX01JUFNfR09UX09GU1Q6Ci0gICAgICBtaXBzX2VsZl9nb3RfcGFnZSAoYWJmZCwgaW5mbywgc3ltYm9sICsgYWRkZW5kLCAmdmFsdWUpOwotICAgICAgb3ZlcmZsb3dlZF9wID0gbWlwc19lbGZfb3ZlcmZsb3dfcCAodmFsdWUsIDE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX01JUFNfU1VCOgotICAgICAgdmFsdWUgPSBzeW1ib2wgLSBhZGRlbmQ7Ci0gICAgICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9NSVBTX0hJR0hFUjoKLSAgICAgIHZhbHVlID0gbWlwc19lbGZfaGlnaGVyIChhZGRlbmQgKyBzeW1ib2wpOwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19ISUdIRVNUOgotICAgICAgdmFsdWUgPSBtaXBzX2VsZl9oaWdoZXN0IChhZGRlbmQgKyBzeW1ib2wpOwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfTUlQU19TQ05fRElTUDoKLSAgICAgIHZhbHVlID0gc3ltYm9sICsgYWRkZW5kIC0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgdmFsdWUgJj0gaG93dG8tPmRzdF9tYXNrOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfTUlQU19QSlVNUDoKLSAgICBjYXNlIFJfTUlQU19KQUxSOgotICAgICAgLyogQm90aCBvZiB0aGVzZSBtYXkgYmUgaWdub3JlZC4gIFJfTUlQU19KQUxSIGlzIGFuIG9wdGltaXphdGlvbgotCSBoaW50OyB3ZSBjb3VsZCBpbXByb3ZlIHBlcmZvcm1hbmNlIGJ5IGhvbm9yaW5nIHRoYXQgaGludC4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gICAgY2FzZSBSX01JUFNfR05VX1ZUSU5IRVJJVDoKLSAgICBjYXNlIFJfTUlQU19HTlVfVlRFTlRSWToKLSAgICAgIC8qIFdlIGRvbid0IGRvIGFueXRoaW5nIHdpdGggdGhlc2UgYXQgcHJlc2VudC4gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIEFuIHVucmVjb2duaXplZCByZWxvY2F0aW9uIHR5cGUuICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotCi0gIC8qIFN0b3JlIHRoZSBWQUxVRSBmb3Igb3VyIGNhbGxlci4gICovCi0gICp2YWx1ZXAgPSB2YWx1ZTsKLSAgcmV0dXJuIG92ZXJmbG93ZWRfcCA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vazsKLX0KLQotLyogT2J0YWluIHRoZSBmaWVsZCByZWxvY2F0ZWQgYnkgUkVMT0NBVElPTi4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1taXBzX2VsZl9vYnRhaW5fY29udGVudHMgKGhvd3RvLCByZWxvY2F0aW9uLCBpbnB1dF9iZmQsIGNvbnRlbnRzKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jYXRpb247Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci17Ci0gIGJmZF92bWEgeDsKLSAgYmZkX2J5dGUgKmxvY2F0aW9uID0gY29udGVudHMgKyByZWxvY2F0aW9uLT5yX29mZnNldDsKLQotICAvKiBPYnRhaW4gdGhlIGJ5dGVzLiAgKi8KLSAgeCA9IGJmZF9nZXQgKDggKiBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKSwgaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0KLSAgaWYgKChFTEYzMl9SX1RZUEUgKHJlbG9jYXRpb24tPnJfaW5mbykgPT0gUl9NSVBTMTZfMjYKLSAgICAgICB8fCBFTEYzMl9SX1RZUEUgKHJlbG9jYXRpb24tPnJfaW5mbykgPT0gUl9NSVBTMTZfR1BSRUwpCi0gICAgICAmJiBiZmRfbGl0dGxlX2VuZGlhbiAoaW5wdXRfYmZkKSkKLSAgICAvKiBUaGUgdHdvIDE2LWJpdCB3b3JkcyB3aWxsIGJlIHJldmVyc2VkIG9uIGEgbGl0dGxlLWVuZGlhbgotICAgICAgIHN5c3RlbS4gIFNlZSBtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gZm9yIG1vcmUgZGV0YWlscy4gICovCi0gICAgeCA9ICgoKHggJiAweGZmZmYpIDw8IDE2KSB8ICgoeCAmIDB4ZmZmZjAwMDApID4+IDE2KSk7Ci0KLSAgcmV0dXJuIHg7Ci19Ci0KLS8qIEl0IGhhcyBiZWVuIGRldGVybWluZWQgdGhhdCB0aGUgcmVzdWx0IG9mIHRoZSBSRUxPQ0FUSU9OIGlzIHRoZQotICAgVkFMVUUuICBVc2UgSE9XVE8gdG8gcGxhY2UgVkFMVUUgaW50byB0aGUgb3V0cHV0IGZpbGUgYXQgdGhlCi0gICBhcHByb3ByaWF0ZSBwb3NpdGlvbi4gIFRoZSBTRUNUSU9OIGlzIHRoZSBzZWN0aW9uIHRvIHdoaWNoIHRoZQotICAgcmVsb2NhdGlvbiBhcHBsaWVzLiAgSWYgUkVRVUlSRV9KQUxYIGlzIHRydWUsIHRoZW4gdGhlIG9wY29kZSB1c2VkCi0gICBmb3IgdGhlIHJlbG9jYXRpb24gbXVzdCBiZSBlaXRoZXIgSkFMIG9yIEpBTFgsIGFuZCBpdCBpcwotICAgdW5jb25kaXRpb25hbGx5IGNvbnZlcnRlZCB0byBKQUxYLgotCi0gICBSZXR1cm5zIGZhbHNlIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uIChpbmZvLCBob3d0bywgcmVsb2NhdGlvbiwgdmFsdWUsCi0JCQkgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgCi0JCQkgICAgIGNvbnRlbnRzLCByZXF1aXJlX2phbHgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jYXRpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBib29sZWFuIHJlcXVpcmVfamFseDsKLXsKLSAgYmZkX3ZtYSB4OwotICBiZmRfYnl0ZSAqbG9jYXRpb247Ci0gIGludCByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbG9jYXRpb24tPnJfaW5mbyk7Ci0KLSAgLyogRmlndXJlIG91dCB3aGVyZSB0aGUgcmVsb2NhdGlvbiBpcyBvY2N1cnJpbmcuICAqLwotICBsb2NhdGlvbiA9IGNvbnRlbnRzICsgcmVsb2NhdGlvbi0+cl9vZmZzZXQ7Ci0KLSAgLyogT2J0YWluIHRoZSBjdXJyZW50IHZhbHVlLiAgKi8KLSAgeCA9IG1pcHNfZWxmX29idGFpbl9jb250ZW50cyAoaG93dG8sIHJlbG9jYXRpb24sIGlucHV0X2JmZCwgY29udGVudHMpOwotCi0gIC8qIENsZWFyIHRoZSBmaWVsZCB3ZSBhcmUgc2V0dGluZy4gICovCi0gIHggJj0gfmhvd3RvLT5kc3RfbWFzazsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBSX01JUFMxNl8yNiByZWxvY2F0aW9uLCB3ZSBtdXN0IHN0b3JlIHRoZQotICAgICB2YWx1ZSBpbiBhIGZ1bm55IHdheS4gICovCi0gIGlmIChyX3R5cGUgPT0gUl9NSVBTMTZfMjYpCi0gICAgewotICAgICAgLyogUl9NSVBTMTZfMjYgaXMgdXNlZCBmb3IgdGhlIG1pcHMxNiBqYWwgYW5kIGphbHggaW5zdHJ1Y3Rpb25zLgotCSBNb3N0IG1pcHMxNiBpbnN0cnVjdGlvbnMgYXJlIDE2IGJpdHMsIGJ1dCB0aGVzZSBpbnN0cnVjdGlvbnMKLQkgYXJlIDMyIGJpdHMuCi0KLQkgVGhlIGZvcm1hdCBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgaXM6Ci0KLQkgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSAhICAgICBKQUxYICAgICAhIFghICAgSW1tIDIwOjE2ICAhICAgSW1tIDI1OjIxICAhCi0JICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkgIQkgIAkgIEltbWVkaWF0ZSAgMTU6MAkJICAgICEKLQkgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSAKLQkgSkFMWCBpcyB0aGUgNS1iaXQgdmFsdWUgMDAwMTEuICBYIGlzIDAgZm9yIGphbCwgMSBmb3IgamFseC4KLQkgTm90ZSB0aGF0IHRoZSBpbW1lZGlhdGUgdmFsdWUgaW4gdGhlIGZpcnN0IHdvcmQgaXMgc3dhcHBlZC4KLQotCSBXaGVuIHByb2R1Y2luZyBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZSwgUl9NSVBTMTZfMjYgaXMKLQkgaGFuZGxlZCBtb3N0bHkgbGlrZSBSX01JUFNfMjYuICBJbiBwYXJ0aWN1bGFyLCB0aGUgYWRkZW5kIGlzCi0JIHN0b3JlZCBhcyBhIHN0cmFpZ2h0IDI2LWJpdCB2YWx1ZSBpbiBhIDMyLWJpdCBpbnN0cnVjdGlvbi4KLQkgKGdhcyBtYWtlcyBsaWZlIHNpbXBsZXIgZm9yIGl0c2VsZiBieSBuZXZlciBhZGp1c3RpbmcgYQotCSBSX01JUFMxNl8yNiByZWxvYyB0byBiZSBhZ2FpbnN0IGEgc2VjdGlvbiwgc28gdGhlIGFkZGVuZCBpcwotCSBhbHdheXMgemVybykuICBIb3dldmVyLCB0aGUgMzIgYml0IGluc3RydWN0aW9uIGlzIHN0b3JlZCBhcyAyCi0JIDE2LWJpdCB2YWx1ZXMsIHJhdGhlciB0aGFuIGEgc2luZ2xlIDMyLWJpdCB2YWx1ZS4gIEluIGEKLQkgYmlnLWVuZGlhbiBmaWxlLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lOyBpbiBhIGxpdHRsZS1lbmRpYW4KLQkgZmlsZSwgdGhlIHR3byAxNi1iaXQgaGFsdmVzIG9mIHRoZSAzMiBiaXQgdmFsdWUgYXJlIHN3YXBwZWQuCi0JIFRoaXMgaXMgc28gdGhhdCBhIGRpc2Fzc2VtYmxlciBjYW4gcmVjb2duaXplIHRoZSBqYWwKLQkgaW5zdHJ1Y3Rpb24uCi0KLQkgV2hlbiBkb2luZyBhIGZpbmFsIGxpbmssIFJfTUlQUzE2XzI2IGlzIHRyZWF0ZWQgYXMgYSAzMiBiaXQKLQkgaW5zdHJ1Y3Rpb24gc3RvcmVkIGFzIHR3byAxNi1iaXQgdmFsdWVzLiAgVGhlIGFkZGVuZCBBIGlzIHRoZQotCSBjb250ZW50cyBvZiB0aGUgdGFyZzI2IGZpZWxkLiAgVGhlIGNhbGN1bGF0aW9uIGlzIHRoZSBzYW1lIGFzCi0JIFJfTUlQU18yNi4gIFdoZW4gc3RvcmluZyB0aGUgY2FsY3VsYXRlZCB2YWx1ZSwgcmVvcmRlciB0aGUKLQkgaW1tZWRpYXRlIHZhbHVlIGFzIHNob3duIGFib3ZlLCBhbmQgZG9uJ3QgZm9yZ2V0IHRvIHN0b3JlIHRoZQotCSB2YWx1ZSBhcyB0d28gMTYtYml0IHZhbHVlcy4KLQotCSBUbyBwdXQgaXQgaW4gTUlQUyBBQkkgdGVybXMsIHRoZSByZWxvY2F0aW9uIGZpZWxkIGlzIFQtdGFyZzI2LTE2LAotCSBkZWZpbmVkIGFzCi0JIAotCSBiaWctZW5kaWFuOgotCSArLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8Ci0JIHwgICAgICAgIHwgICAgdGFyZzI2LTE2ICAgICAgICAgfAotCSB8MzEgICAgMjZ8MjUgICAgICAgICAgICAgICAgICAgMHwKLQkgKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JIAotCSBsaXR0bGUtZW5kaWFuOgotCSArLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLSsKLQkgfCAgICAgICAgICB8ICAgICAgfCAgICAgICAgICAgICB8Ci0JIHwgIHN1YjEgICAgfCAgICAgIHwgICAgIHN1YjIgICAgfAotCSB8MCAgICAgICAgOXwxMCAgMTV8MTYgICAgICAgICAzMXwKLQkgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JIHdoZXJlIHRhcmcyNi0xNiBpcyBzdWIxIGZvbGxvd2VkIGJ5IHN1YjIgKGkuZS4sIHRoZSBhZGRlbmQgZmllbGQgQSBpcwotCSAoKHN1YjEgPDwgMTYpIHwgc3ViMikpLgotCSAKLQkgV2hlbiBwcm9kdWNpbmcgYSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUsIHRoZSBjYWxjdWxhdGlvbiBpcwotCSAoKChBIDwgMikgfCAoUCAmIDB4ZjAwMDAwMDApICsgUykgPj4gMikKLQkgV2hlbiBwcm9kdWNpbmcgYSBmdWxseSBsaW5rZWQgZmlsZSwgdGhlIGNhbGN1bGF0aW9uIGlzCi0JIGxldCBSID0gKCgoQSA8IDIpIHwgKFAgJiAweGYwMDAwMDAwKSArIFMpID4+IDIpCi0JICgoUiAmIDB4MWYwMDAwKSA8PCA1KSB8ICgoUiAmIDB4M2UwMDAwMCkgPj4gNSkgfCAoUiAmIDB4ZmZmZikgICovCi0KLSAgICAgIGlmICghaW5mby0+cmVsb2NhdGVhYmxlKQotCS8qIFNodWZmbGUgdGhlIGJpdHMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhIGFib3ZlLiAgKi8KLQl2YWx1ZSA9ICgoKHZhbHVlICYgMHgxZjAwMDApIDw8IDUpIAotCQkgfCAoKHZhbHVlICYgMHgzZTAwMDAwKSA+PiA1KSAKLQkJIHwgKHZhbHVlICYgMHhmZmZmKSk7Ci0gICAgICAKLSAgICB9Ci0gIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl9HUFJFTCkKLSAgICB7Ci0gICAgICAvKiBSX01JUFMxNl9HUFJFTCBpcyB1c2VkIGZvciBHUC1yZWxhdGl2ZSBhZGRyZXNzaW5nIGluIG1pcHMxNgotCSBtb2RlLiAgQSB0eXBpY2FsIGluc3RydWN0aW9uIHdpbGwgaGF2ZSBhIGZvcm1hdCBsaWtlIHRoaXM6Ci0KLQkgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSAhICAgIEVYVEVORCAgICAhICAgICBJbW0gMTA6NSAgICAhICAgSW1tIDE1OjExICAhCi0JICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkgISAgICBNYWpvciAgICAgISAgIHJ4ICAgISAgIHJ5ICAgISAgIEltbSAgNDowICAgIQotCSArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JIAotCSBFWFRFTkQgaXMgdGhlIGZpdmUgYml0IHZhbHVlIDExMTEwLiAgTWFqb3IgaXMgdGhlIGluc3RydWN0aW9uCi0JIG9wY29kZS4KLQkgCi0JIFRoaXMgaXMgaGFuZGxlZCBleGFjdGx5IGxpa2UgUl9NSVBTX0dQUkVMMTYsIGV4Y2VwdCB0aGF0IHRoZQotCSBhZGRlbmQgaXMgcmV0cmlldmVkIGFuZCBzdG9yZWQgYXMgc2hvd24gaW4gdGhpcyBkaWFncmFtOyB0aGF0Ci0JIGlzLCB0aGUgSW1tIGZpZWxkcyBhYm92ZSByZXBsYWNlIHRoZSBWLXJlbDE2IGZpZWxkLiAgCi0KLSAgICAgICAgIEFsbCB3ZSBuZWVkIHRvIGRvIGhlcmUgaXMgc2h1ZmZsZSB0aGUgYml0cyBhcHByb3ByaWF0ZWx5LiAgQXMKLQkgYWJvdmUsIHRoZSB0d28gMTYtYml0IGhhbHZlcyBtdXN0IGJlIHN3YXBwZWQgb24gYQotCSBsaXR0bGUtZW5kaWFuIHN5c3RlbS4gICovCi0gICAgICB2YWx1ZSA9ICgoKHZhbHVlICYgMHg3ZTApIDw8IDE2KQotCSAgICAgICB8ICgodmFsdWUgJiAweGY4MDApIDw8IDUpCi0JICAgICAgIHwgKHZhbHVlICYgMHgxZikpOwotICAgIH0KLQotICAvKiBTZXQgdGhlIGZpZWxkLiAgKi8KLSAgeCB8PSAodmFsdWUgJiBob3d0by0+ZHN0X21hc2spOwotCi0gIC8qIElmIHJlcXVpcmVkLCB0dXJuIEpBTCBpbnRvIEpBTFguICAqLwotICBpZiAocmVxdWlyZV9qYWx4KQotICAgIHsKLSAgICAgIGJvb2xlYW4gb2s7Ci0gICAgICBiZmRfdm1hIG9wY29kZSA9IHggPj4gMjY7Ci0gICAgICBiZmRfdm1hIGphbHhfb3Bjb2RlOwotCi0gICAgICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIG9wY29kZSBpcyBhbHJlYWR5IEpBTCBvciBKQUxYLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9NSVBTMTZfMjYpCi0JewotCSAgb2sgPSAoKG9wY29kZSA9PSAweDYpIHx8IChvcGNvZGUgPT0gMHg3KSk7Ci0JICBqYWx4X29wY29kZSA9IDB4NzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb2sgPSAoKG9wY29kZSA9PSAweDMpIHx8IChvcGNvZGUgPT0gMHgxZCkpOwotCSAgamFseF9vcGNvZGUgPSAweDFkOwotCX0KLQotICAgICAgLyogSWYgdGhlIG9wY29kZSBpcyBub3QgSkFMIG9yIEpBTFgsIHRoZXJlJ3MgYSBwcm9ibGVtLiAgKi8KLSAgICAgIGlmICghb2spCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogJXMrMHglbHg6IGp1bXAgdG8gc3R1YiByb3V0aW5lIHdoaWNoIGlzIG5vdCBqYWwiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JICAgICBpbnB1dF9zZWN0aW9uLT5uYW1lLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpIHJlbG9jYXRpb24tPnJfb2Zmc2V0KTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogTWFrZSB0aGlzIHRoZSBKQUxYIG9wY29kZS4gICovCi0gICAgICB4ID0gKHggJiB+KDB4M2YgPDwgMjYpKSB8IChqYWx4X29wY29kZSA8PCAyNik7Ci0gICAgfQotCi0gIC8qIFN3YXAgdGhlIGhpZ2gtIGFuZCBsb3ctb3JkZXIgMTYgYml0cyBvbiBsaXR0bGUtZW5kaWFuIHN5c3RlbXMKLSAgICAgd2hlbiBkb2luZyBhIE1JUFMxNiByZWxvY2F0aW9uLiAgKi8KLSAgaWYgKChyX3R5cGUgPT0gUl9NSVBTMTZfR1BSRUwgfHwgcl90eXBlID09IFJfTUlQUzE2XzI2KQotICAgICAgJiYgYmZkX2xpdHRsZV9lbmRpYW4gKGlucHV0X2JmZCkpCi0gICAgeCA9ICgoKHggJiAweGZmZmYpIDw8IDE2KSB8ICgoeCAmIDB4ZmZmZjAwMDApID4+IDE2KSk7Ci0gIAotICAvKiBQdXQgdGhlIHZhbHVlIGludG8gdGhlIG91dHB1dC4gICovCi0gIGJmZF9wdXQgKDggKiBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKSwgaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm5zIHRydWUgaWYgU0VDVElPTiBpcyBhIE1JUFMxNiBzdHViIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfc3R1Yl9zZWN0aW9uX3AgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgY29uc3QgY2hhciAqbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWN0aW9uKTsKLQotICByZXR1cm4gKHN0cm5jbXAgKG5hbWUsIEZOX1NUVUIsIHNpemVvZiBGTl9TVFVCIC0gMSkgPT0gMAotCSAgfHwgc3RybmNtcCAobmFtZSwgQ0FMTF9TVFVCLCBzaXplb2YgQ0FMTF9TVFVCIC0gMSkgPT0gMAotCSAgfHwgc3RybmNtcCAobmFtZSwgQ0FMTF9GUF9TVFVCLCBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCk7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgTUlQUyBFTEYgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCWNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIGJvb2xlYW4gdXNlX3NhdmVkX2FkZGVuZF9wID0gZmFsc2U7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0KLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKG91dHB1dF9iZmQpOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCAqIGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWw7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7ICsrcmVsKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBib29sZWFuIHJlcXVpcmVfamFseDsKLSAgICAgIC8qIFRydWUgaWYgdGhlIHJlbG9jYXRpb24gaXMgYSBSRUxBIHJlbG9jYXRpb24sIHJhdGhlciB0aGFuIGEKLSAgICAgICAgIFJFTCByZWxvY2F0aW9uLiAgKi8KLSAgICAgIGJvb2xlYW4gcmVsYV9yZWxvY2F0aW9uX3AgPSB0cnVlOwotICAgICAgaW50IHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICAvKiBGaW5kIHRoZSByZWxvY2F0aW9uIGhvd3RvIGZvciB0aGlzIHJlbG9jYXRpb24uICAqLwotICAgICAgaWYgKHJfdHlwZSA9PSBSX01JUFNfNjQgJiYgIUFCSV82NF9QIChvdXRwdXRfYmZkKSkKLQl7Ci0JICAvKiBTb21lIDMyLWJpdCBjb2RlIHVzZXMgUl9NSVBTXzY0LiAgSW4gcGFydGljdWxhciwgcGVvcGxlIHVzZQotCSAgICAgNjQtYml0IGNvZGUsIGJ1dCBtYWtlIHN1cmUgYWxsIHRoZWlyIGFkZHJlc3NlcyBhcmUgaW4gdGhlIAotCSAgICAgbG93ZXJtb3N0IG9yIHVwcGVybW9zdCAzMi1iaXQgc2VjdGlvbiBvZiB0aGUgNjQtYml0IGFkZHJlc3MKLQkgICAgIHNwYWNlLiAgVGh1cywgd2hlbiB0aGV5IHVzZSBhbiBSX01JUFNfNjQgdGhleSBtZWFuIHdoYXQgaXMKLQkgICAgIHVzdWFsbHkgbWVhbnQgYnkgUl9NSVBTXzMyLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGUKLQkgICAgIHN0b3JlZCB2YWx1ZSBpcyBzaWduLWV4dGVuZGVkIHRvIDY0IGJpdHMuICAqLwotCSAgaG93dG8gPSBlbGZfbWlwc19ob3d0b190YWJsZSArIFJfTUlQU18zMjsKLQotCSAgLyogT24gYmlnLWVuZGlhbiBzeXN0ZW1zLCB3ZSBuZWVkIHRvIGxpZSBhYm91dCB0aGUgcG9zaXRpb24KLQkgICAgIG9mIHRoZSByZWxvYy4gICovCi0JICBpZiAoYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JICAgICAgcmVsLT5yX29mZnNldCArPSA0OwotCX0KLSAgICAgIGVsc2UKLQlob3d0byA9IG1pcHNfcnR5cGVfdG9faG93dG8gKHJfdHlwZSk7Ci0KLSAgICAgIGlmICghdXNlX3NhdmVkX2FkZGVuZF9wKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotCi0JICAvKiBJZiB0aGVzZSByZWxvY2F0aW9ucyB3ZXJlIG9yaWdpbmFsbHkgb2YgdGhlIFJFTCB2YXJpZXR5LAotCSAgICAgd2UgbXVzdCBwdWxsIHRoZSBhZGRlbmQgb3V0IG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUKLQkgICAgIHJlbG9jYXRlZC4gIE90aGVyd2lzZSwgd2Ugc2ltcGx5IHVzZSB0aGUgY29udGVudHMgb2YgdGhlCi0JICAgICBSRUxBIHJlbG9jYXRpb24uICBUbyBkZXRlcm1pbmUgd2hpY2ggZmxhdm9yIG9yIHJlbG9jYXRpb24KLQkgICAgIHRoaXMgaXMsIHdlIGRlcGVuZCBvbiB0aGUgZmFjdCB0aGF0IHRoZSBJTlBVVF9TRUNUSU9OJ3MKLQkgICAgIFJFTF9IRFIgaXMgcmVhZCBiZWZvcmUgaXRzIFJFTF9IRFIyLiAgKi8KLQkgIHJlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHI7Ci0JICBpZiAoKHNpemVfdCkgKHJlbCAtIHJlbG9jcykKLQkgICAgICA+PSAocmVsX2hkci0+c2hfc2l6ZSAvIHJlbF9oZHItPnNoX2VudHNpemUKLQkJICAqIGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWwpKQotCSAgICByZWxfaGRyID0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIyOwotCSAgaWYgKHJlbF9oZHItPnNoX2VudHNpemUgPT0gTUlQU19FTEZfUkVMX1NJWkUgKGlucHV0X2JmZCkpCi0JICAgIHsKLQkgICAgICAvKiBOb3RlIHRoYXQgdGhpcyBpcyBhIFJFTCByZWxvY2F0aW9uLiAgKi8KLQkgICAgICByZWxhX3JlbG9jYXRpb25fcCA9IGZhbHNlOwotCi0JICAgICAgLyogR2V0IHRoZSBhZGRlbmQsIHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUgaW5wdXQgZmlsZS4gICovCi0JICAgICAgYWRkZW5kID0gbWlwc19lbGZfb2J0YWluX2NvbnRlbnRzIChob3d0bywgCi0JCQkJCQkgcmVsLAotCQkJCQkJIGlucHV0X2JmZCwKLQkJCQkJCSBjb250ZW50cyk7Ci0JICAgICAgYWRkZW5kICY9IGhvd3RvLT5zcmNfbWFzazsKLQotCSAgICAgIC8qIEZvciBzb21lIGtpbmRzIG9mIHJlbG9jYXRpb25zLCB0aGUgQURERU5EIGlzIGEKLQkJIGNvbWJpbmF0aW9uIG9mIHRoZSBhZGRlbmQgc3RvcmVkIGluIHR3byBkaWZmZXJlbnQKLQkJIHJlbG9jYXRpb25zLiAgICovCi0JICAgICAgaWYgKHJfdHlwZSA9PSBSX01JUFNfSEkxNgotCQkgIHx8IChyX3R5cGUgPT0gUl9NSVBTX0dPVDE2Ci0JCSAgICAgICYmIG1pcHNfZWxmX2xvY2FsX3JlbG9jYXRpb25fcCAoaW5wdXRfYmZkLCByZWwsCi0JCQkJCQkgICAgICBsb2NhbF9zZWN0aW9ucykpKQotCQl7Ci0JCSAgYmZkX3ZtYSBsOwotCQkgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpsbzE2X3JlbG9jYXRpb247Ci0JCSAgcmVsb2NfaG93dG9fdHlwZSAqbG8xNl9ob3d0bzsKLQotCQkgIC8qIFRoZSBjb21iaW5lZCB2YWx1ZSBpcyB0aGUgc3VtIG9mIHRoZSBISTE2IGFkZGVuZCwKLQkJICAgICBsZWZ0LXNoaWZ0ZWQgYnkgc2l4dGVlbiBiaXRzLCBhbmQgdGhlIExPMTYKLQkJICAgICBhZGRlbmQsIHNpZ24gZXh0ZW5kZWQuICAoVXN1YWxseSwgdGhlIGNvZGUgZG9lcwotCQkgICAgIGEgYGx1aScgb2YgdGhlIEhJMTYgdmFsdWUsIGFuZCB0aGVuIGFuIGBhZGRpdScgb2YKLQkJICAgICB0aGUgTE8xNiB2YWx1ZS4pICAKLQotCQkgICAgIFNjYW4gYWhlYWQgdG8gZmluZCBhIG1hdGNoaW5nIFJfTUlQU19MTzE2Ci0JCSAgICAgcmVsb2NhdGlvbi4gICovCi0JCSAgbG8xNl9yZWxvY2F0aW9uIAotCQkgICAgPSBtaXBzX2VsZl9uZXh0X2xvMTZfcmVsb2NhdGlvbiAocmVsLCByZWxlbmQpOyAKLQkJICBpZiAobG8xNl9yZWxvY2F0aW9uID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAvKiBPYnRhaW4gdGhlIGFkZGVuZCBrZXB0IHRoZXJlLiAgKi8KLQkJICBsbzE2X2hvd3RvID0gbWlwc19ydHlwZV90b19ob3d0byAoUl9NSVBTX0xPMTYpOwotCQkgIGwgPSBtaXBzX2VsZl9vYnRhaW5fY29udGVudHMgKGxvMTZfaG93dG8sCi0JCQkJCQlsbzE2X3JlbG9jYXRpb24sCi0JCQkJCQlpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLQkJICBsICY9IGxvMTZfaG93dG8tPnNyY19tYXNrOwotCQkgIGwgPSBtaXBzX2VsZl9zaWduX2V4dGVuZCAobCwgMTYpOwotCi0JCSAgYWRkZW5kIDw8PSAxNjsKLQotCQkgIC8qIENvbXB1dGUgdGhlIGNvbWJpbmVkIGFkZGVuZC4gICovCi0JCSAgYWRkZW5kICs9IGw7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTMTZfR1BSRUwpCi0JCXsKLQkJICAvKiBUaGUgYWRkZW5kIGlzIHNjcmFtYmxlZCBpbiB0aGUgb2JqZWN0IGZpbGUuICBTZWUKLQkJICAgICBtaXBzX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gZm9yIGRldGFpbHMgb24gdGhlCi0JCSAgICAgZm9ybWF0LiAgKi8KLQkJICBhZGRlbmQgPSAoKChhZGRlbmQgJiAweDFmMDAwMCkgPj4gNSkKLQkJCSAgICB8ICgoYWRkZW5kICYgMHg3ZTAwMDAwKSA+PiAxNikKLQkJCSAgICB8IChhZGRlbmQgJiAweDFmKSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCX0KLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0JICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotCi0JICAvKiBTaW5jZSB3ZSdyZSBqdXN0IHJlbG9jYXRpbmcsIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGNvcHkKLQkgICAgIHRoZSByZWxvY2F0aW9ucyBiYWNrIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVubGVzcwotCSAgICAgdGhleSdyZSBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIGluIHdoaWNoIGNhc2Ugd2UgbmVlZAotCSAgICAgdG8gYWRqdXN0IGJ5IHRoZSBzZWN0aW9uIG9mZnNldCwgb3IgdW5sZXNzIHRoZXkncmUgR1AKLQkgICAgIHJlbGF0aXZlIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBhZGp1c3QgYnkgdGhlIGFtb3VudAotCSAgICAgdGhhdCB3ZSdyZSBhZGp1c3RpbmcgR1AgaW4gdGhpcyByZWxvY2F0ZWFibGUgb2JqZWN0LiAgKi8KLQotCSAgaWYgKCFtaXBzX2VsZl9sb2NhbF9yZWxvY2F0aW9uX3AgKGlucHV0X2JmZCwgcmVsLCBsb2NhbF9zZWN0aW9ucykpCi0JICAgIC8qIFRoZXJlJ3Mgbm90aGluZyB0byBkbyBmb3Igbm9uLWxvY2FsIHJlbG9jYXRpb25zLiAgKi8KLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChyX3R5cGUgPT0gUl9NSVBTMTZfR1BSRUwgCi0JICAgICAgfHwgcl90eXBlID09IFJfTUlQU19HUFJFTDE2Ci0JICAgICAgfHwgcl90eXBlID09IFJfTUlQU19HUFJFTDMyCi0JICAgICAgfHwgcl90eXBlID09IFJfTUlQU19MSVRFUkFMKQotCSAgICBhZGRlbmQgLT0gKF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKQotCQkgICAgICAgLSBfYmZkX2dldF9ncF92YWx1ZSAoaW5wdXRfYmZkKSk7Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTXzI2IHx8IHJfdHlwZSA9PSBSX01JUFMxNl8yNikKLQkgICAgLyogVGhlIGFkZGVuZCBpcyBzdG9yZWQgd2l0aG91dCBpdHMgdHdvIGxlYXN0Ci0JICAgICAgIHNpZ25pZmljYW50IGJpdHMgKHdoaWNoIGFyZSBhbHdheXMgemVyby4pICBJbiBhCi0JICAgICAgIG5vbi1yZWxvY2F0ZWFibGUgbGluaywgY2FsY3VsYXRlX3JlbG9jYXRpb24gd2lsbCBkbwotCSAgICAgICB0aGlzIHNoaWZ0OyBoZXJlLCB3ZSBtdXN0IGRvIGl0IG91cnNlbHZlcy4gICovCi0JICAgIGFkZGVuZCA8PD0gMjsKLQotCSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCSAgICAvKiBBZGp1c3QgdGhlIGFkZGVuZCBhcHByb3ByaWF0ZWx5LiAgKi8KLQkgICAgYWRkZW5kICs9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XS0+b3V0cHV0X29mZnNldDsKLQkgIAotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGEgUl9NSVBTX0hJMTYgb3IgUl9NSVBTX0dPVDE2LAotCSAgICAgdGhlbiB3ZSBvbmx5IHdhbnQgdG8gd3JpdGUgb3V0IHRoZSBoaWdoLW9yZGVyIDE2IGJpdHMuCi0JICAgICBUaGUgc3Vic2VxdWVudCBSX01JUFNfTE8xNiB3aWxsIGhhbmRsZSB0aGUgbG93LW9yZGVyIGJpdHMuICAqLwotCSAgaWYgKHJfdHlwZSA9PSBSX01JUFNfSEkxNiB8fCByX3R5cGUgPT0gUl9NSVBTX0dPVDE2KQotCSAgICBhZGRlbmQgPSBtaXBzX2VsZl9oaWdoIChhZGRlbmQpOwotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGFuIFJfTUlQU18yNiByZWxvY2F0aW9uLCB0aGVuCi0JICAgICB0aGUgdHdvIGxvdy1vcmRlciBiaXRzIGFyZSBub3Qgc3RvcmVkIGluIHRoZSBvYmplY3QgZmlsZTsKLQkgICAgIHRoZXkgYXJlIGltcGxpY2l0bHkgemVyby4gICovCi0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTXzI2IHx8IHJfdHlwZSA9PSBSX01JUFMxNl8yNikKLQkgICAgYWRkZW5kID4+PSAyOwotCi0JICBpZiAocmVsYV9yZWxvY2F0aW9uX3ApCi0JICAgIC8qIElmIHRoaXMgaXMgYSBSRUxBIHJlbG9jYXRpb24sIGp1c3QgdXBkYXRlIHRoZSBhZGRlbmQuCi0gICAgICAgICAgICAgICBXZSBoYXZlIHRvIGNhc3QgYXdheSBjb25zdG5lc3MgZm9yIFJFTC4gICovCi0JICAgIHJlbC0+cl9hZGRlbmQgPSBhZGRlbmQ7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBPdGhlcndpc2UsIHdlIGhhdmUgdG8gd3JpdGUgdGhlIHZhbHVlIGJhY2sgb3V0LiAgTm90ZQotCQkgdGhhdCB3ZSB1c2UgdGhlIHNvdXJjZSBtYXNrLCByYXRoZXIgdGhhbiB0aGUKLQkJIGRlc3RpbmF0aW9uIG1hc2sgYmVjYXVzZSB0aGUgcGxhY2UgdG8gd2hpY2ggd2UgYXJlCi0JCSB3cml0aW5nIHdpbGwgYmUgc291cmNlIG9mIHRoZSBhZGRlbmQgaW4gdGhlIGZpbmFsCi0JCSBsaW5rLiAgKi8KLQkgICAgICBhZGRlbmQgJj0gaG93dG8tPnNyY19tYXNrOwotCSAgICAgIGlmICghbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uIChpbmZvLCBob3d0bywgcmVsLCBhZGRlbmQsCi0JCQkJCQlpbnB1dF9iZmQsICBpbnB1dF9zZWN0aW9uLCAKLQkJCQkJCWNvbnRlbnRzLCBmYWxzZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBHbyBvbiB0byB0aGUgbmV4dCByZWxvY2F0aW9uLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSW4gdGhlIE4zMiBhbmQgNjQtYml0IEFCSXMgdGhlcmUgbWF5IGJlIG11bHRpcGxlIGNvbnNlY3V0aXZlCi0JIHJlbG9jYXRpb25zIGZvciB0aGUgc2FtZSBvZmZzZXQuICBJbiB0aGF0IGNhc2Ugd2UgYXJlCi0JIHN1cHBvc2VkIHRvIHRyZWF0IHRoZSBvdXRwdXQgb2YgZWFjaCByZWxvY2F0aW9uIGFzIHRoZSBhZGRlbmQKLQkgZm9yIHRoZSBuZXh0LiAgKi8KLSAgICAgIGlmIChyZWwgKyAxIDwgcmVsZW5kIAotCSAgJiYgcmVsLT5yX29mZnNldCA9PSByZWxbMV0ucl9vZmZzZXQKLQkgICYmIEVMRjMyX1JfVFlQRSAocmVsWzFdLnJfaW5mbykgIT0gUl9NSVBTX05PTkUpCi0JdXNlX3NhdmVkX2FkZGVuZF9wID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQl1c2Vfc2F2ZWRfYWRkZW5kX3AgPSBmYWxzZTsKLQotICAgICAgLyogRmlndXJlIG91dCB3aGF0IHZhbHVlIHdlIGFyZSBzdXBwb3NlZCB0byByZWxvY2F0ZS4gICovCi0gICAgICBzd2l0Y2ggKG1pcHNfZWxmX2NhbGN1bGF0ZV9yZWxvY2F0aW9uIChvdXRwdXRfYmZkLCAKLQkJCQkJICAgICBpbnB1dF9iZmQsCi0JCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICBpbmZvLAotCQkJCQkgICAgIHJlbCwKLQkJCQkJICAgICBhZGRlbmQsCi0JCQkJCSAgICAgaG93dG8sCi0JCQkJCSAgICAgbG9jYWxfc3ltcywKLQkJCQkJICAgICBsb2NhbF9zZWN0aW9ucywKLQkJCQkJICAgICAmdmFsdWUsCi0JCQkJCSAgICAgJm5hbWUsCi0JCQkJCSAgICAgJnJlcXVpcmVfamFseCkpCi0JewotCWNhc2UgYmZkX3JlbG9jX2NvbnRpbnVlOgotCSAgLyogVGhlcmUncyBub3RoaW5nIHRvIGRvLiAgKi8KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgLyogbWlwc19lbGZfY2FsY3VsYXRlX3JlbG9jYXRpb24gYWxyZWFkeSBjYWxsZWQgdGhlCi0gICAgICAgICAgICAgdW5kZWZpbmVkX3N5bWJvbCBjYWxsYmFjay4gIFRoZXJlJ3Mgbm8gcmVhbCBwb2ludCBpbgotCSAgICAgdHJ5aW5nIHRvIHBlcmZvcm0gdGhlIHJlbG9jYXRpb24gYXQgdGhpcyBwb2ludCwgc28gd2UKLQkgICAgIGp1c3Qgc2tpcCBhaGVhZCB0byB0aGUgbmV4dCByZWxvY2F0aW9uLiAgKi8KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgaWYgKHVzZV9zYXZlZF9hZGRlbmRfcCkKLQkgICAgLyogSWdub3JlIG92ZXJmbG93IHVudGlsIHdlIHJlYWNoIHRoZSBsYXN0IHJlbG9jYXRpb24gZm9yCi0JICAgICAgIGEgZ2l2ZW4gbG9jYXRpb24uICAqLwotCSAgICA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUIChuYW1lICE9IE5VTEwpOwotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSd2ZSBnb3QgYW5vdGhlciByZWxvY2F0aW9uIGZvciB0aGUgYWRkcmVzcywga2VlcCBnb2luZwotCSB1bnRpbCB3ZSByZWFjaCB0aGUgbGFzdCBvbmUuICAqLwotICAgICAgaWYgKHVzZV9zYXZlZF9hZGRlbmRfcCkKLQl7Ci0JICBhZGRlbmQgPSB2YWx1ZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHJfdHlwZSA9PSBSX01JUFNfNjQgJiYgIUFCSV82NF9QIChvdXRwdXRfYmZkKSkKLQkvKiBTZWUgdGhlIGNvbW1lbnQgYWJvdmUgYWJvdXQgdXNpbmcgUl9NSVBTXzY0IGluIHRoZSAzMi1iaXQKLQkgICBBQkkuICBVbnRpbCBub3csIHdlJ3ZlIGJlZW4gdXNpbmcgdGhlIEhPV1RPIGZvciBSX01JUFNfMzI7Ci0JICAgdGhhdCBjYWxjdWxhdGVkIHRoZSByaWdodCB2YWx1ZS4gIE5vdywgaG93ZXZlciwgd2UKLQkgICBzaWduLWV4dGVuZCB0aGUgMzItYml0IHJlc3VsdCB0byA2NC1iaXRzLCBhbmQgc3RvcmUgaXQgYXMgYQotCSAgIDY0LWJpdCB2YWx1ZS4gIFdlIGFyZSBlc3BlY2lhbGx5IGdlbmVyb3VzIGhlcmUgaW4gdGhhdCB3ZQotCSAgIGdvIHRvIGV4dHJlbWUgbGVuZ3RocyB0byBzdXBwb3J0IHRoaXMgdXNhZ2Ugb24gc3lzdGVtcyB3aXRoCi0JICAgb25seSBhIDMyLWJpdCBWTUEuICAqLwotCXsKLQkgIGJmZF92bWEgc2lnbl9iaXRzOwotCSAgYmZkX3ZtYSBsb3dfYml0czsKLQkgIGJmZF92bWEgaGlnaF9iaXRzOwotCi0JICBpZiAodmFsdWUgJiAweDgwMDAwMDAwKQotCSAgICBzaWduX2JpdHMgPSAweGZmZmZmZmZmOwotCSAgZWxzZQotCSAgICBzaWduX2JpdHMgPSAwOwotCi0JICAvKiBJZiBvbmx5IGEgMzItYml0IFZNQSBpcyBhdmFpbGFibGUgZG8gdHdvIHNlcGFyYXRlCi0JICAgICBzdG9yZXMuICAqLwotCSAgaWYgKGJmZF9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCSAgICB7Ci0JICAgICAgLyogVW5kbyB3aGF0IHdlIGRpZCBhYm92ZS4gICovCi0JICAgICAgcmVsLT5yX29mZnNldCAtPSA0OwotCSAgICAgIC8qIFN0b3JlIHRoZSBzaWduLWJpdHMgKHdoaWNoIGFyZSBtb3N0IHNpZ25pZmljYW50KQotCQkgZmlyc3QuICAqLwotCSAgICAgIGxvd19iaXRzID0gc2lnbl9iaXRzOwotCSAgICAgIGhpZ2hfYml0cyA9IHZhbHVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsb3dfYml0cyA9IHZhbHVlOwotCSAgICAgIGhpZ2hfYml0cyA9IHNpZ25fYml0czsKLQkgICAgfQotCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBsb3dfYml0cywgCi0JCSAgICAgIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGhpZ2hfYml0cywgCi0JCSAgICAgIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCArIDQpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBY3R1YWxseSBwZXJmb3JtIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgICAgIGlmICghbWlwc19lbGZfcGVyZm9ybV9yZWxvY2F0aW9uIChpbmZvLCBob3d0bywgcmVsLCB2YWx1ZSwgaW5wdXRfYmZkLCAKLQkJCQkJaW5wdXRfc2VjdGlvbiwgY29udGVudHMsCi0JCQkJCXJlcXVpcmVfamFseCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBob29rIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGxpbmtlciB3cml0ZXMgb3V0IGEgZ2xvYmFsCi0gICBzeW1ib2wuICBXZSBtYXJrIHN5bWJvbHMgYXMgc21hbGwgY29tbW9uIGlmIGFwcHJvcHJpYXRlLiAgVGhpcyBpcwotICAgYWxzbyB3aGVyZSB3ZSB1bmRvIHRoZSBpbmNyZW1lbnQgb2YgdGhlIHZhbHVlIGZvciBhIG1pcHMxNiBzeW1ib2wuICAqLwotCi0vKkFSR1NJR05PUkVEKi8KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIG5hbWUsIHN5bSwgaW5wdXRfc2VjKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWM7Ci17Ci0gIC8qIElmIHdlIHNlZSBhIGNvbW1vbiBzeW1ib2wsIHdoaWNoIGltcGxpZXMgYSByZWxvY2F0YWJsZSBsaW5rLCB0aGVuCi0gICAgIGlmIGEgc3ltYm9sIHdhcyBzbWFsbCBjb21tb24gaW4gYW4gaW5wdXQgZmlsZSwgbWFyayBpdCBhcyBzbWFsbAotICAgICBjb21tb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTgotICAgICAgJiYgc3RyY21wIChpbnB1dF9zZWMtPm5hbWUsICIuc2NvbW1vbiIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX1NDT01NT047Ci0KLSAgaWYgKHN5bS0+c3Rfb3RoZXIgPT0gU1RPX01JUFMxNgotICAgICAgJiYgKHN5bS0+c3RfdmFsdWUgJiAxKSAhPSAwKQotICAgIC0tc3ltLT5zdF92YWx1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLQotLyogVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgaW50ZXJwcmV0ZXIuICBUaGlzIGlzIHB1dCBpbiB0aGUgLmludGVycAotICAgc2VjdGlvbi4gICovCi0KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIoYWJmZCkgCQlcCi0gICAoQUJJX04zMl9QIChhYmZkKSA/ICIvdXNyL2xpYjMyL2xpYmMuc28uMSIgCVwKLSAgICA6IEFCSV82NF9QIChhYmZkKSA/ICIvdXNyL2xpYjY0L2xpYmMuc28uMSIgCVwKLSAgICA6ICIvdXNyL2xpYi9saWJjLnNvLjEiKQotCi0vKiBDcmVhdGUgZHluYW1pYyBzZWN0aW9ucyB3aGVuIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgY29uc3QgY2hhciAqIGNvbnN0ICpuYW1lcDsKLQotICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZCi0JICAgfCBTRUNfTElOS0VSX0NSRUFURUQgfCBTRUNfUkVBRE9OTFkpOwotCi0gIC8qIE1pcHMgQUJJIHJlcXVlc3RzIHRoZSAuZHluYW1pYyBzZWN0aW9uIHRvIGJlIHJlYWQgb25seS4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoISBtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDcmVhdGUgdGhlIC5tc3ltIHNlY3Rpb24gb24gSVJJWDYuICBJdCBpcyB1c2VkIGJ5IHRoZSBkeW5hbWljCi0gICAgIGxpbmtlciB0byBzcGVlZCB1cCBkeW5hbWljIHJlbG9jYXRpb25zLCBhbmQgdG8gYXZvaWQgY29tcHV0aW5nCi0gICAgIHRoZSBFTEYgaGFzaCBmb3Igc3ltYm9scy4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2Ci0gICAgICAmJiAhbWlwc19lbGZfY3JlYXRlX21zeW1fc2VjdGlvbiAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogQ3JlYXRlIC5zdHViIHNlY3Rpb24uICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIAotCQkJICAgICAgIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FIChhYmZkKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUgKGFiZmQpKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19DT0RFKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLAotCQkJCQkgIE1JUFNfRUxGX0xPR19GSUxFX0FMSUdOIChhYmZkKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NQotICAgICAgJiYgIWluZm8tPnNoYXJlZAotICAgICAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmxkX21hcCIpID09IE5VTEwpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucmxkX21hcCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzICYgflNFQ19SRUFET05MWSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywKLQkJCQkJICBNSVBTX0VMRl9MT0dfRklMRV9BTElHTiAoYWJmZCkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogT24gSVJJWDUsIHdlIGFkanVzdCBhZGQgc29tZSBhZGRpdGlvbmFsIHN5bWJvbHMgYW5kIGNoYW5nZSB0aGUKLSAgICAgYWxpZ25tZW50cyBvZiBzZXZlcmFsIHNlY3Rpb25zLiAgVGhlcmUgaXMgbm8gQUJJIGRvY3VtZW50YXRpb24KLSAgICAgaW5kaWNhdGluZyB0aGF0IHRoaXMgaXMgbmVjZXNzYXJ5IG9uIElSSVg2LCBub3IgYW55IGV2aWRlbmNlIHRoYXQKLSAgICAgdGhlIGxpbmtlciB0YWtlcyBzdWNoIGFjdGlvbi4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg1KQotICAgIHsKLSAgICAgIGZvciAobmFtZXAgPSBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzOyAqbmFtZXAgIT0gTlVMTDsgbmFtZXArKykKLQl7Ci0JICBoID0gTlVMTDsKLQkgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgKGluZm8sIGFiZmQsICpuYW1lcCwgQlNGX0dMT0JBTCwgYmZkX3VuZF9zZWN0aW9uX3B0ciwKLQkJICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JCSAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQkgIGgtPnR5cGUgPSBTVFRfU0VDVElPTjsKLQotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSAuY29tcGFjdF9yZWwgc2VjdGlvbi4gICovCi0gICAgICBpZiAoISBtaXBzX2VsZl9jcmVhdGVfY29tcGFjdF9yZWxfc2VjdGlvbiAoYWJmZCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBDaGFuZ2UgYWxpZ21lbnRzIG9mIHNvbWUgc2VjdGlvbnMuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmhhc2giKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCk7Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3ltIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN0ciIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCA0KTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWdpbmZvIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCk7Ci0gICAgfQotCi0gIGlmICghaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGggPSBOVUxMOwotICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JICAgICAoaW5mbywgYWJmZCwgIl9EWU5BTUlDX0xJTksiLCBCU0ZfR0xPQkFMLCBiZmRfYWJzX3NlY3Rpb25fcHRyLAotCSAgICAgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkgICAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgICBoLT50eXBlID0gU1RUX1NFQ1RJT047Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZCkKLQl7Ci0JICAvKiBfX3JsZF9tYXAgaXMgYSBmb3VyIGJ5dGUgd29yZCBsb2NhdGVkIGluIHRoZSAuZGF0YSBzZWN0aW9uCi0JICAgICBhbmQgaXMgZmlsbGVkIGluIGJ5IHRoZSBydGxkIHRvIGNvbnRhaW4gYSBwb2ludGVyIHRvCi0JICAgICB0aGUgX3JfZGVidWcgc3RydWN0dXJlLiBJdHMgc3ltYm9sIHZhbHVlIHdpbGwgYmUgc2V0IGluCi0JICAgICBtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wuICAqLwotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJsZF9tYXAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLQkgIGggPSBOVUxMOwotCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCSAoaW5mbywgYWJmZCwgIl9fcmxkX21hcCIsIEJTRl9HTE9CQUwsIHMsCi0JCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCQkgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0JICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgLmNvbXBhY3RfcmVsIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX2NvbXBhY3RfcmVsX3NlY3Rpb24gKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5jb21wYWN0X3JlbCIpID09IE5VTEwpCi0gICAgewotICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkgICAgICAgfCBTRUNfUkVBRE9OTFkpOwotCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5jb21wYWN0X3JlbCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLAotCQkJCQkgIE1JUFNfRUxGX0xPR19GSUxFX0FMSUdOIChhYmZkKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uIHRvIGhvbGQgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4gICovCi0gIGlmIChtaXBzX2VsZl9nb3Rfc2VjdGlvbiAoYWJmZCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5nb3QiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCA0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLiAgV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUKLSAgICAgbGlua2VyIHNjcmlwdCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSBzeW1ib2wgaWYgd2UKLSAgICAgYXJlIG5vdCBjcmVhdGluZyBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBoID0gTlVMTDsKLSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JIChpbmZvLCBhYmZkLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiwgQlNGX0dMT0JBTCwgcywKLQkgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZAotICAgICAgJiYgISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgZmlyc3Qgc2V2ZXJhbCBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJpZXMgYXJlIHJlc2VydmVkLiAgKi8KLSAgcy0+X3Jhd19zaXplID0gTUlQU19SRVNFUlZFRF9HT1ROTyAqIE1JUFNfRUxGX0dPVF9TSVpFIChhYmZkKTsKLQotICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICBzaXplb2YgKHN0cnVjdCBtaXBzX2dvdF9pbmZvKSk7Ci0gIGlmIChnID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBnLT5nbG9iYWxfZ290c3ltID0gTlVMTDsKLSAgZy0+bG9jYWxfZ290bm8gPSBNSVBTX1JFU0VSVkVEX0dPVE5POwotICBnLT5hc3NpZ25lZF9nb3RubyA9IE1JUFNfUkVTRVJWRURfR09UTk87Ci0gIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHMtPnVzZWRfYnlfYmZkID0KLQkoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSkpOwotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRkYXRhID0gKFBUUikgZzsKLSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2ZsYWdzIAotICAgIHw9IFNIRl9BTExPQyB8IFNIRl9XUklURSB8IFNIRl9NSVBTX0dQUkVMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm5zIHRoZSAubXN5bSBzZWN0aW9uIGZvciBBQkZELCBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdAotICAgYWxyZWFkeSBleGlzdC4gIFJldHVybnMgTlVMTCB0byBpbmRpY2F0ZSBlcnJvci4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1taXBzX2VsZl9jcmVhdGVfbXN5bV9zZWN0aW9uIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKGFiZmQpKTsKLSAgaWYgKCFzKSAKLSAgICB7Ci0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKGFiZmQpKTsKLSAgICAgIGlmICghcwotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgCi0JCQkJICAgICBTRUNfQUxMT0MKLQkJCQkgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQgCi0JCQkJICAgICB8IFNFQ19SRUFET05MWSkKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLAotCQkJCQkgTUlQU19FTEZfTE9HX0ZJTEVfQUxJR04gKGFiZmQpKSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHM7Ci19Ci0KLS8qIEFkZCByb29tIGZvciBOIHJlbG9jYXRpb25zIHRvIHRoZSAucmVsLmR5biBzZWN0aW9uIGluIEFCRkQuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGZfYWxsb2NhdGVfZHluYW1pY19yZWxvY2F0aW9ucyAoYWJmZCwgbikKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgbjsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSAoYWJmZCkpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAKLSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgYSBudWxsIGVsZW1lbnQuICovCi0gICAgICBzLT5fcmF3X3NpemUgKz0gTUlQU19FTEZfUkVMX1NJWkUgKGFiZmQpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0gIHMtPl9yYXdfc2l6ZSArPSBuICogTUlQU19FTEZfUkVMX1NJWkUgKGFiZmQpOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLSAgc2l6ZV90IGV4dHN5bW9mZjsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgZXh0c3ltb2ZmID0gKGVsZl9iYWRfc3ltdGFiIChhYmZkKSkgPyAwIDogc3ltdGFiX2hkci0+c2hfaW5mbzsKLQotICAvKiBDaGVjayBmb3IgdGhlIG1pcHMxNiBzdHViIHNlY3Rpb25zLiAgKi8KLQotICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7Ci0gIGlmIChzdHJuY21wIChuYW1lLCBGTl9TVFVCLCBzaXplb2YgRk5fU1RVQiAtIDEpID09IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLQotICAgICAgLyogTG9vayBhdCB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBmaWd1cmUgb3V0IHdoaWNoIHN5bWJvbAotICAgICAgICAgdGhpcyBpcyBmb3IuICAqLwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWxvY3MtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IGV4dHN5bW9mZgotCSAgfHwgc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl0gPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqbzsKLQotCSAgLyogVGhpcyBzdHViIGlzIGZvciBhIGxvY2FsIHN5bWJvbC4gIFRoaXMgc3R1YiB3aWxsIG9ubHkgYmUKLSAgICAgICAgICAgICBuZWVkZWQgaWYgdGhlcmUgaXMgc29tZSByZWxvY2F0aW9uIGluIHRoaXMgQkZELCBvdGhlcgotICAgICAgICAgICAgIHRoYW4gYSAxNiBiaXQgZnVuY3Rpb24gY2FsbCwgd2hpY2ggcmVmZXJzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnNlY19yZWxvY3M7Ci0JICAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnIsICpyZW5kOwotCi0JICAgICAgLyogV2UgY2FuIGlnbm9yZSBzdHViIHNlY3Rpb25zIHdoZW4gbG9va2luZyBmb3IgcmVsb2NzLiAgKi8KLQkgICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JCSAgfHwgby0+cmVsb2NfY291bnQgPT0gMAotCQkgIHx8IHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgRk5fU1RVQiwKLQkJCSAgICAgIHNpemVvZiBGTl9TVFVCIC0gMSkgPT0gMAotCQkgIHx8IHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgQ0FMTF9TVFVCLAotCQkJICAgICAgc2l6ZW9mIENBTExfU1RVQiAtIDEpID09IDAKLQkJICB8fCBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksIENBTExfRlBfU1RVQiwKLQkJCSAgICAgIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSA9PSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIHNlY19yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgICAgKGFiZmQsIG8sIChQVFIpIE5VTEwsCi0JCQkgICAgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkJICAgICBpbmZvLT5rZWVwX21lbW9yeSkpOwotCSAgICAgIGlmIChzZWNfcmVsb2NzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIHJlbmQgPSBzZWNfcmVsb2NzICsgby0+cmVsb2NfY291bnQ7Ci0JICAgICAgZm9yIChyID0gc2VjX3JlbG9jczsgciA8IHJlbmQ7IHIrKykKLQkJaWYgKEVMRjMyX1JfU1lNIChyLT5yX2luZm8pID09IHJfc3ltbmR4Ci0JCSAgICAmJiBFTEYzMl9SX1RZUEUgKHItPnJfaW5mbykgIT0gUl9NSVBTMTZfMjYpCi0JCSAgYnJlYWs7Ci0KLQkgICAgICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKLQkJZnJlZSAoc2VjX3JlbG9jcyk7Ci0KLQkgICAgICBpZiAociA8IHJlbmQpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChvID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGVyZSBpcyBubyBub24tY2FsbCByZWxvYyBmb3IgdGhpcyBzdHViLCBzbyB3ZSBkbwotICAgICAgICAgICAgICAgICBub3QgbmVlZCBpdC4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZQotICAgICAgICAgICAgICAgICB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zLCB3ZQotICAgICAgICAgICAgICAgICBjYW4gZWFzaWx5IGRpc2NhcmQgaXQgYnkgc2V0dGluZyB0aGUgU0VDX0VYQ0xVREUKLSAgICAgICAgICAgICAgICAgZmxhZy4gICovCi0JICAgICAgc2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCi0JICAvKiBSZWNvcmQgdGhpcyBzdHViIGluIGFuIGFycmF5IG9mIGxvY2FsIHN5bWJvbCBzdHVicyBmb3IKLSAgICAgICAgICAgICB0aGlzIEJGRC4gKi8KLQkgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5sb2NhbF9zdHVicyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyBzeW1jb3VudDsKLQkgICAgICBhc2VjdGlvbiAqKm47Ci0KLQkgICAgICBpZiAoZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotCQlzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzeW10YWJfaGRyLT5zaF9lbnRzaXplOwotCSAgICAgIGVsc2UKLQkJc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgICAgIG4gPSAoYXNlY3Rpb24gKiopIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkJCSAgICBzeW1jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotCSAgICAgIGlmIChuID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBlbGZfdGRhdGEgKGFiZmQpLT5sb2NhbF9zdHVicyA9IG47Ci0JICAgIH0KLQotCSAgZWxmX3RkYXRhIChhYmZkKS0+bG9jYWxfc3R1YnNbcl9zeW1uZHhdID0gc2VjOwotCi0JICAvKiBXZSBkb24ndCBuZWVkIHRvIHNldCBtaXBzMTZfc3R1YnNfc2VlbiBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICAgVGhhdCBmbGFnIGlzIHVzZWQgdG8gc2VlIHdoZXRoZXIgd2UgbmVlZCB0byBsb29rIHRocm91Z2gKLSAgICAgICAgICAgICB0aGUgZ2xvYmFsIHN5bWJvbCB0YWJsZSBmb3Igc3R1YnMuICBXZSBkb24ndCBuZWVkIHRvIHNldAotICAgICAgICAgICAgIGl0IGhlcmUsIGJlY2F1c2Ugd2UganVzdCBoYXZlIGEgbG9jYWwgc3R1Yi4gICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICAgICAgc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl0pOwotCi0JICAvKiBIIGlzIHRoZSBzeW1ib2wgdGhpcyBzdHViIGlzIGZvci4gICovCi0KLQkgIGgtPmZuX3N0dWIgPSBzZWM7Ci0JICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+bWlwczE2X3N0dWJzX3NlZW4gPSB0cnVlOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsIENBTExfU1RVQiwgc2l6ZW9mIENBTExfU1RVQiAtIDEpID09IDAKLQkgICB8fCBzdHJuY21wIChuYW1lLCBDQUxMX0ZQX1NUVUIsIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYXNlY3Rpb24gKipsb2M7Ci0KLSAgICAgIC8qIExvb2sgYXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gZmlndXJlIG91dCB3aGljaCBzeW1ib2wKLSAgICAgICAgIHRoaXMgaXMgZm9yLiAgKi8KLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsb2NzLT5yX2luZm8pOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBleHRzeW1vZmYKLQkgIHx8IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdID09IE5VTEwpCi0JewotCSAgLyogVGhpcyBzdHViIHdhcyBhY3R1YWxseSBidWlsdCBmb3IgYSBzdGF0aWMgc3ltYm9sIGRlZmluZWQKLQkgICAgIGluIHRoZSBzYW1lIGZpbGUuICBXZSBhc3N1bWUgdGhhdCBhbGwgc3RhdGljIHN5bWJvbHMgaW4KLQkgICAgIG1pcHMxNiBjb2RlIGFyZSB0aGVtc2VsdmVzIG1pcHMxNiwgc28gd2UgY2FuIHNpbXBseQotCSAgICAgZGlzY2FyZCB0aGlzIHN0dWIuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUKLQkgICAgIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMsIHdlIGNhbgotCSAgICAgZWFzaWx5IGRpc2NhcmQgaXQgYnkgc2V0dGluZyB0aGUgU0VDX0VYQ0xVREUgZmxhZy4gICovCi0JICBzZWMtPmZsYWdzIHw9IFNFQ19FWENMVURFOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBoID0gKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl0pOwotCi0gICAgICAvKiBIIGlzIHRoZSBzeW1ib2wgdGhpcyBzdHViIGlzIGZvci4gICovCi0KLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCBDQUxMX0ZQX1NUVUIsIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSA9PSAwKQotCWxvYyA9ICZoLT5jYWxsX2ZwX3N0dWI7Ci0gICAgICBlbHNlCi0JbG9jID0gJmgtPmNhbGxfc3R1YjsKLQotICAgICAgLyogSWYgd2UgYWxyZWFkeSBoYXZlIGFuIGFwcHJvcHJpYXRlIHN0dWIgZm9yIHRoaXMgZnVuY3Rpb24sIHdlCi0JIGRvbid0IG5lZWQgYW5vdGhlciBvbmUsIHNvIHdlIGNhbiBkaXNjYXJkIHRoaXMgb25lLiAgU2luY2UKLQkgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucwotCSB0byBvdXRwdXQgc2VjdGlvbnMsIHdlIGNhbiBlYXNpbHkgZGlzY2FyZCBpdCBieSBzZXR0aW5nIHRoZQotCSBTRUNfRVhDTFVERSBmbGFnLiAgV2UgY2FuIGFsc28gZGlzY2FyZCB0aGlzIHNlY3Rpb24gaWYgd2UKLQkgaGFwcGVuIHRvIGFscmVhZHkga25vdyB0aGF0IHRoaXMgaXMgYSBtaXBzMTYgZnVuY3Rpb247IGl0IGlzCi0JIG5vdCBuZWNlc3NhcnkgdG8gY2hlY2sgdGhpcyBoZXJlLCBhcyBpdCBpcyBjaGVja2VkIGxhdGVyLCBidXQKLQkgaXQgaXMgc2xpZ2h0bHkgZmFzdGVyIHRvIGNoZWNrIG5vdy4gICovCi0gICAgICBpZiAoKmxvYyAhPSBOVUxMIHx8IGgtPnJvb3Qub3RoZXIgPT0gU1RPX01JUFMxNikKLQl7Ci0JICBzZWMtPmZsYWdzIHw9IFNFQ19FWENMVURFOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAqbG9jID0gc2VjOwotICAgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPm1pcHMxNl9zdHVic19zZWVuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGR5bm9iaiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNnb3QgPSBOVUxMOwotICAgICAgZyA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2dvdCA9IG1pcHNfZWxmX2dvdF9zZWN0aW9uIChkeW5vYmopOwotICAgICAgaWYgKHNnb3QgPT0gTlVMTCkKLQlnID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLQkgIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOwotCSAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLQl9Ci0gICAgfQotCi0gIHNyZWxvYyA9IE5VTEw7Ci0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQgKiBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsOwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgKytyZWwpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IGV4dHN5bW9mZikKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl07Ci0KLQkgIC8qIFRoaXMgbWF5IGJlIGFuIGluZGlyZWN0IHN5bWJvbCBjcmVhdGVkIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uLiAgKi8KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0JCWggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgICAgfQotCX0KLQotICAgICAgLyogU29tZSByZWxvY3MgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMIHx8IHNnb3QgPT0gTlVMTCkKLQl7Ci0JICBzd2l0Y2ggKHJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIFJfTUlQU19HT1QxNjoKLQkgICAgY2FzZSBSX01JUFNfQ0FMTDE2OgotCSAgICBjYXNlIFJfTUlQU19DQUxMX0hJMTY6Ci0JICAgIGNhc2UgUl9NSVBTX0NBTExfTE8xNjoKLQkgICAgY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0JICAgIGNhc2UgUl9NSVBTX0dPVF9MTzE2OgotCSAgICBjYXNlIFJfTUlQU19HT1RfUEFHRToKLQkgICAgY2FzZSBSX01JUFNfR09UX09GU1Q6Ci0JICAgIGNhc2UgUl9NSVBTX0dPVF9ESVNQOgotCSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkJZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGcgPSBtaXBzX2VsZl9nb3RfaW5mbyAoZHlub2JqLCAmc2dvdCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX01JUFNfMzI6Ci0JICAgIGNhc2UgUl9NSVBTX1JFTDMyOgotCSAgICBjYXNlIFJfTUlQU182NDoKLQkgICAgICBpZiAoZHlub2JqID09IE5VTEwKLQkJICAmJiAoaW5mby0+c2hhcmVkIHx8IGggIT0gTlVMTCkKLQkJICAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghaCAmJiAocl90eXBlID09IFJfTUlQU19DQUxMX0xPMTYKLQkJIHx8IHJfdHlwZSA9PSBSX01JUFNfR09UX0xPMTYKLQkJIHx8IHJfdHlwZSA9PSBSX01JUFNfR09UX0RJU1ApKQotCXsKLQkgIC8qIFdlIG1heSBuZWVkIGEgbG9jYWwgR09UIGVudHJ5IGZvciB0aGlzIHJlbG9jYXRpb24uICBXZQotCSAgICAgZG9uJ3QgY291bnQgUl9NSVBTX0dPVF9QQUdFIGJlY2F1c2Ugd2UgY2FuIGVzdGltYXRlIHRoZQotCSAgICAgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMgbmVlZGVkIGJ5IGxvb2tpbmcgYXQgdGhlIHNpemUgb2YKLQkgICAgIHRoZSBzZWdtZW50LiAgU2ltaWxhciBjb21tZW50cyBhcHBseSB0byBSX01JUFNfR09UMTYuICBXZQotCSAgICAgZG9uJ3QgY291bnQgUl9NSVBTX0dPVF9ISTE2LCBvciBSX01JUFNfQ0FMTF9ISTE2IGJlY2F1c2UKLQkgICAgIHRoZXNlIGFyZSBhbHdheXMgZm9sbG93ZWQgYnkgYW4gUl9NSVBTX0dPVF9MTzE2IG9yCi0JICAgICBSX01JUFNfQ0FMTF9MTzE2LgotCi0JICAgICBUaGlzIGVzdGltYXRpb24gaXMgdmVyeSBjb25zZXJ2YXRpdmUgc2luY2Ugd2UgY2FuIG1lcmdlCi0JICAgICBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUgR09ULiAgSW4gb3JkZXIgdG8gYmUgbGVzcwotCSAgICAgY29uc2VydmF0aXZlLCB3ZSBjb3VsZCBhY3R1YWxseSBidWlsZCB0aGUgR09UIGhlcmUsCi0JICAgICByYXRoZXIgdGhhbiBpbiByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQkgIGctPmxvY2FsX2dvdG5vKys7Ci0JICBzZ290LT5fcmF3X3NpemUgKz0gTUlQU19FTEZfR09UX1NJWkUgKGR5bm9iaik7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSX01JUFNfQ0FMTDE2OgotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IENBTEwxNiByZWxvYyBhdCAweCVseCBub3QgYWdhaW5zdCBnbG9iYWwgc3ltYm9sIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl9vZmZzZXQpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQotCWNhc2UgUl9NSVBTX0NBTExfSEkxNjoKLQljYXNlIFJfTUlQU19DQUxMX0xPMTY6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoIW1pcHNfZWxmX3JlY29yZF9nbG9iYWxfZ290X3N5bWJvbCAoaCwgaW5mbywgZykpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIFdlIG5lZWQgYSBzdHViLCBub3QgYSBwbHQgZW50cnkgZm9yIHRoZSB1bmRlZmluZWQKLQkJIGZ1bmN0aW9uLiAgQnV0IHdlIHJlY29yZCBpdCBhcyBpZiBpdCBuZWVkcyBwbHQuICBTZWUKLQkJIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgaW4gZWxmbGluay5oLiAgKi8KLQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgICAgIGgtPnR5cGUgPSBTVFRfRlVOQzsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfTUlQU19HT1QxNjoKLQljYXNlIFJfTUlQU19HT1RfSEkxNjoKLQljYXNlIFJfTUlQU19HT1RfTE8xNjoKLQljYXNlIFJfTUlQU19HT1RfRElTUDoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0JICBpZiAoaCAmJiAhbWlwc19lbGZfcmVjb3JkX2dsb2JhbF9nb3Rfc3ltYm9sIChoLCBpbmZvLCBnKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfTUlQU18zMjoKLQljYXNlIFJfTUlQU19SRUwzMjoKLQljYXNlIFJfTUlQU182NDoKLQkgIGlmICgoaW5mby0+c2hhcmVkIHx8IGggIT0gTlVMTCkKLQkgICAgICAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWUgPSBNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSAoZHlub2JqKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywKLQkJCQkJCSAgICAgIChTRUNfQUxMT0MKLQkJCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgICAgICB8IFNFQ19SRUFET05MWSkpCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsCi0JCQkJCQkJICA0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCS8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKLQkJICAgcmVsb2MgdHlwZXMgaW50byB0aGUgb3V0cHV0IGZpbGUgYXMgUl9NSVBTX1JFTDMyCi0JCSAgIHJlbG9jcy4gIFdlIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYyBpbiB0aGUKLQkJICAgLnJlbC5keW4gcmVsb2Mgc2VjdGlvbi4gICovCi0JCW1pcHNfZWxmX2FsbG9jYXRlX2R5bmFtaWNfcmVsb2NhdGlvbnMgKGR5bm9iaiwgMSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaG1pcHM7Ci0KLQkJICAvKiBXZSBvbmx5IG5lZWQgdG8gY29weSB0aGlzIHJlbG9jIGlmIHRoZSBzeW1ib2wgaXMKLSAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgaW4gYSBkeW5hbWljIG9iamVjdC4gICovCi0JCSAgaG1pcHMgPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCQkgICsraG1pcHMtPnBvc3NpYmx5X2R5bmFtaWNfcmVsb2NzOwotCQl9Ci0JICAgICAKLQkgICAgICAvKiBFdmVuIHRob3VnaCB3ZSBkb24ndCBkaXJlY3RseSBuZWVkIGEgR09UIGVudHJ5IGZvcgotCQkgdGhpcyBzeW1ib2wsIGEgc3ltYm9sIG11c3QgaGF2ZSBhIGR5bmFtaWMgc3ltYm9sCi0JCSB0YWJsZSBpbmRleCBncmVhdGVyIHRoYXQgRFRfTUlQU19HT1RTWU0gaWYgdGhlcmUgYXJlCi0JCSBkeW5hbWljIHJlbG9jYXRpb25zIGFnYWluc3QgaXQuICAqLwotCSAgICAgIGlmIChoICE9IE5VTEwKLQkJICAmJiAhbWlwc19lbGZfcmVjb3JkX2dsb2JhbF9nb3Rfc3ltYm9sIChoLCBpbmZvLCBnKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChTR0lfQ09NUEFUIChkeW5vYmopKQotCSAgICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Y29tcGFjdF9yZWxfc2l6ZSArPQotCSAgICAgIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfY3JpbmZvKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX01JUFNfMjY6Ci0JY2FzZSBSX01JUFNfR1BSRUwxNjoKLQljYXNlIFJfTUlQU19MSVRFUkFMOgotCWNhc2UgUl9NSVBTX0dQUkVMMzI6Ci0JICBpZiAoU0dJX0NPTVBBVCAoZHlub2JqKSkKLQkgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPmNvbXBhY3RfcmVsX3NpemUgKz0KLQkgICAgICBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NyaW5mbyk7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotCSAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9NSVBTX0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotCSAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSX01JUFNfR05VX1ZURU5UUlk6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogSWYgdGhpcyByZWxvYyBpcyBub3QgYSAxNiBiaXQgY2FsbCwgYW5kIGl0IGhhcyBhIGdsb2JhbAotICAgICAgICAgc3ltYm9sLCB0aGVuIHdlIHdpbGwgbmVlZCB0aGUgZm5fc3R1YiBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICAgICBSZWZlcmVuY2VzIGZyb20gYSBzdHViIHNlY3Rpb24gZG8gbm90IGNvdW50LiAqLwotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgcl90eXBlICE9IFJfTUlQUzE2XzI2Ci0JICAmJiBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgRk5fU1RVQiwKLQkJICAgICAgc2l6ZW9mIEZOX1NUVUIgLSAxKSAhPSAwCi0JICAmJiBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgQ0FMTF9TVFVCLAotCQkgICAgICBzaXplb2YgQ0FMTF9TVFVCIC0gMSkgIT0gMAotCSAgJiYgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIENBTExfRlBfU1RVQiwKLQkJICAgICAgc2l6ZW9mIENBTExfRlBfU1RVQiAtIDEpICE9IDApCi0JewotCSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqbWg7Ci0KLQkgIG1oID0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaDsKLQkgIG1oLT5uZWVkX2ZuX3N0dWIgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgotICAgcmVsb2NhdGlvbi4gICovCi0KLWFzZWN0aW9uICoKLV9iZmRfbWlwc19lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICAvKiA/Pz8gRG8gbWlwczE2IHN0dWIgc2VjdGlvbnMgbmVlZCB0byBiZSBoYW5kbGVkIHNwZWNpYWw/ICAqLwotCi0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSX01JUFNfR05VX1ZUSU5IRVJJVDoKLQljYXNlIFJfTUlQU19HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcyBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIDAKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKLQotICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX01JUFNfR09UMTY6Ci0gICAgICBjYXNlIFJfTUlQU19DQUxMMTY6Ci0gICAgICBjYXNlIFJfTUlQU19DQUxMX0hJMTY6Ci0gICAgICBjYXNlIFJfTUlQU19DQUxMX0xPMTY6Ci0gICAgICBjYXNlIFJfTUlQU19HT1RfSEkxNjoKLSAgICAgIGNhc2UgUl9NSVBTX0dPVF9MTzE2OgotCS8qID8/PyBJdCB3b3VsZCBzZWVtIHRoYXQgdGhlIGV4aXN0aW5nIE1JUFMgY29kZSBkb2VzIG5vIHNvcnQKLQkgICBvZiByZWZlcmVuY2UgY291bnRpbmcgb3Igd2hhdG5vdCBvbiBpdHMgR09UIGFuZCBQTFQgZW50cmllcywKLQkgICBzbyBpdCBpcyBub3QgcG9zc2libGUgdG8gZ2FyYmFnZSBjb2xsZWN0IHRoZW0gYXQgdGhpcyB0aW1lLiAgKi8KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpobWlwczsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gYSBkeW5hbWljIG9iamVjdCwgd2UgbmVlZCB0byBjb3B5Ci0gICAgIGFueSBSX01JUFNfMzIgb3IgUl9NSVBTX1JFTDMyIHJlbG9jcyBhZ2FpbnN0IGl0IGludG8gdGhlIG91dHB1dAotICAgICBmaWxlLiAgKi8KLSAgaG1pcHMgPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGhtaXBzLT5wb3NzaWJseV9keW5hbWljX3JlbG9jcyAhPSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgbWlwc19lbGZfYWxsb2NhdGVfZHluYW1pY19yZWxvY2F0aW9ucyAoZHlub2JqLCAKLQkJCQkJICAgaG1pcHMtPnBvc3NpYmx5X2R5bmFtaWNfcmVsb2NzKTsKLQotICAvKiBGb3IgYSBmdW5jdGlvbiwgY3JlYXRlIGEgc3R1YiwgaWYgbmVlZGVkLiAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIHRoZW4gc2V0Ci0JIHRoZSBzeW1ib2wgdG8gdGhlIHN0dWIgbG9jYXRpb24uICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UKLQkgZnVuY3Rpb24gcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwKLQkgZXhlY3V0YWJsZSBhbmQgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogV2UgbmVlZCAuc3R1YiBzZWN0aW9uLiAgKi8KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAKLQkJCQkgICAgICAgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUgKGR5bm9iaikpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLQkgIC8qIFhYWCBXcml0ZSB0aGlzIHN0dWIgYWRkcmVzcyBzb21ld2hlcmUuICAqLwotCSAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLQotCSAgLyogTWFrZSByb29tIGZvciB0aGlzIHN0dWIgY29kZS4gICovCi0JICBzLT5fcmF3X3NpemUgKz0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkU7Ci0KLQkgIC8qIFRoZSBsYXN0IGhhbGYgd29yZCBvZiB0aGUgc3R1YiB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBpbmRleAotCSAgICAgb2YgdGhpcyBzeW1ib2wgaW4gLmR5bnN5bSBzZWN0aW9uLiAgKi8KLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHJlYWQsCi0gICBhbmQgdGhlIGlucHV0IHNlY3Rpb25zIGhhdmUgYmVlbiBhc3NpZ25lZCB0byBvdXRwdXQgc2VjdGlvbnMuICBXZQotICAgY2hlY2sgZm9yIGFueSBtaXBzMTYgc3R1YiBzZWN0aW9ucyB0aGF0IHdlIGNhbiBkaXNjYXJkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY2hlY2tfbWlwczE2X3N0dWJzCi0gIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpyaTsKLQotICAvKiBUaGUgLnJlZ2luZm8gc2VjdGlvbiBoYXMgYSBmaXhlZCBzaXplLiAgKi8KLSAgcmkgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWdpbmZvIik7Ci0gIGlmIChyaSAhPSBOVUxMKQotICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRwdXRfYmZkLCByaSwgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgISBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+bWlwczE2X3N0dWJzX3NlZW4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWlwc19lbGZfbGlua19oYXNoX3RyYXZlcnNlIChtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgICBtaXBzX2VsZl9jaGVja19taXBzMTZfc3R1YnMsCi0JCQkgICAgICAgKFBUUikgTlVMTCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoZWNrIHRoZSBtaXBzMTYgc3R1YnMgZm9yIGEgcGFydGljdWxhciBzeW1ib2wsIGFuZCBzZWUgaWYgd2UgY2FuCi0gICBkaXNjYXJkIHRoZW0uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jaGVja19taXBzMTZfc3R1YnMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChoLT5mbl9zdHViICE9IE5VTEwKLSAgICAgICYmICEgaC0+bmVlZF9mbl9zdHViKQotICAgIHsKLSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGZuX3N0dWI7IHRoZSBvbmx5IHJlZmVyZW5jZXMgdG8gdGhpcyBzeW1ib2wKLSAgICAgICAgIGFyZSAxNiBiaXQgY2FsbHMuICBDbG9iYmVyIHRoZSBzaXplIHRvIDAgdG8gcHJldmVudCBpdCBmcm9tCi0gICAgICAgICBiZWluZyBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCi0gICAgICBoLT5mbl9zdHViLT5fcmF3X3NpemUgPSAwOwotICAgICAgaC0+Zm5fc3R1Yi0+X2Nvb2tlZF9zaXplID0gMDsKLSAgICAgIGgtPmZuX3N0dWItPmZsYWdzICY9IH4gU0VDX1JFTE9DOwotICAgICAgaC0+Zm5fc3R1Yi0+cmVsb2NfY291bnQgPSAwOwotICAgICAgaC0+Zm5fc3R1Yi0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0gICAgfQotCi0gIGlmIChoLT5jYWxsX3N0dWIgIT0gTlVMTAotICAgICAgJiYgaC0+cm9vdC5vdGhlciA9PSBTVE9fTUlQUzE2KQotICAgIHsKLSAgICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGNhbGxfc3R1YjsgdGhpcyBpcyBhIDE2IGJpdCBmdW5jdGlvbiwgc28KLSAgICAgICAgIGNhbGxzIGZyb20gb3RoZXIgMTYgYml0IGZ1bmN0aW9ucyBhcmUgT0suICBDbG9iYmVyIHRoZSBzaXplCi0gICAgICAgICB0byAwIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCi0gICAgICBoLT5jYWxsX3N0dWItPl9yYXdfc2l6ZSA9IDA7Ci0gICAgICBoLT5jYWxsX3N0dWItPl9jb29rZWRfc2l6ZSA9IDA7Ci0gICAgICBoLT5jYWxsX3N0dWItPmZsYWdzICY9IH4gU0VDX1JFTE9DOwotICAgICAgaC0+Y2FsbF9zdHViLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBoLT5jYWxsX3N0dWItPmZsYWdzIHw9IFNFQ19FWENMVURFOwotICAgIH0KLQotICBpZiAoaC0+Y2FsbF9mcF9zdHViICE9IE5VTEwKLSAgICAgICYmIGgtPnJvb3Qub3RoZXIgPT0gU1RPX01JUFMxNikKLSAgICB7Ci0gICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSBjYWxsX3N0dWI7IHRoaXMgaXMgYSAxNiBiaXQgZnVuY3Rpb24sIHNvCi0gICAgICAgICBjYWxscyBmcm9tIG90aGVyIDE2IGJpdCBmdW5jdGlvbnMgYXJlIE9LLiAgQ2xvYmJlciB0aGUgc2l6ZQotICAgICAgICAgdG8gMCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICAgICAgaC0+Y2FsbF9mcF9zdHViLT5fcmF3X3NpemUgPSAwOwotICAgICAgaC0+Y2FsbF9mcF9zdHViLT5fY29va2VkX3NpemUgPSAwOwotICAgICAgaC0+Y2FsbF9mcF9zdHViLT5mbGFncyAmPSB+IFNFQ19SRUxPQzsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+cmVsb2NfY291bnQgPSAwOwotICAgICAgaC0+Y2FsbF9mcF9zdHViLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHJlbHRleHQ7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnID0gTlVMTDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgCi0JICAgID0gc3RybGVuIChFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAob3V0cHV0X2JmZCkpICsgMTsKLQkgIHMtPmNvbnRlbnRzIAotCSAgICA9IChiZmRfYnl0ZSAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAob3V0cHV0X2JmZCk7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHJlbHRleHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogV2Ugb25seSBzdHJpcCB0aGUgc2VjdGlvbiBpZiB0aGUgb3V0cHV0IHNlY3Rpb24gbmFtZQotICAgICAgICAgICAgICAgICBoYXMgdGhlIHNhbWUgbmFtZS4gIE90aGVyd2lzZSwgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbAotICAgICAgICAgICAgICAgICBpbnB1dCBzZWN0aW9ucyBmb3IgdGhpcyBvdXRwdXQgc2VjdGlvbi4gIEZJWE1FOiBUaGlzCi0gICAgICAgICAgICAgICAgIGNvZGUgaXMgcHJvYmFibHkgbm90IG5lZWRlZCB0aGVzZSBkYXlzIGFueWhvdywgc2luY2UKLSAgICAgICAgICAgICAgICAgdGhlIGxpbmtlciBub3cgZG9lcyBub3QgY3JlYXRlIGVtcHR5IG91dHB1dCBzZWN0aW9ucy4gICovCi0JICAgICAgaWYgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkJICAmJiBzdHJjbXAgKG5hbWUsCi0JCQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIsCi0JCQkJCQkgICBzLT5vdXRwdXRfc2VjdGlvbikpID09IDApCi0JCXN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotICAgICAgICAgICAgICAgICBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LgotICAgICAgICAgICAgICAgICBJZiB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uIGlzIC5yZWwuZHluLCB3ZSBhbHdheXMKLSAgICAgICAgICAgICAgICAgYXNzZXJ0IGEgRFRfVEVYVFJFTCBlbnRyeSByYXRoZXIgdGhhbiB0ZXN0aW5nIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgdGhlcmUgZXhpc3RzIGEgcmVsb2NhdGlvbiB0byBhIHJlYWQgb25seSBzZWN0aW9uIG9yCi0gICAgICAgICAgICAgICAgIG5vdC4gICovCi0JICAgICAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgICAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA0KTsKLQkgICAgICBpZiAoKHRhcmdldCAhPSBOVUxMCi0JCSAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgIHx8IHN0cmNtcCAob3V0bmFtZSwgCi0JCQkgICAgIE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FIChvdXRwdXRfYmZkKSkgPT0gMCkKLQkJcmVsdGV4dCA9IHRydWU7Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgCi0JCQkgIE1JUFNfRUxGX1JFTF9EWU5fU0VDVElPTl9OQU1FIChvdXRwdXRfYmZkKSkgIT0gMCkKLQkJcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSA9PSAwKQotCXsKLQkgIGludCBpOwotIAkgIGJmZF9zaXplX3R5cGUgbG9hZGFibGVfc2l6ZSA9IDA7Ci0gCSAgYmZkX3NpemVfdHlwZSBsb2NhbF9nb3RubzsKLSAJICBzdHJ1Y3QgX2JmZCAqc3ViOwotCi0gCSAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAocykgIT0gTlVMTCk7Ci0JICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50ZGF0YTsKLSAJICBCRkRfQVNTRVJUIChnICE9IE5VTEwpOwotCi0gCSAgLyogQ2FsY3VsYXRlIHRoZSB0b3RhbCBsb2FkYWJsZSBzaXplIG9mIHRoZSBvdXRwdXQuICBUaGF0Ci0gCSAgICAgd2lsbCBnaXZlIHVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBHT1RfUEFHRSBlbnRyaWVzCi0gCSAgICAgcmVxdWlyZWQuICAqLwotIAkgIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAJICAgIHsKLSAJICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0gCi0gCSAgICAgIGZvciAoc3Vic2VjdGlvbiA9IHN1Yi0+c2VjdGlvbnM7IAotIAkJICAgc3Vic2VjdGlvbjsgCi0gCQkgICBzdWJzZWN0aW9uID0gc3Vic2VjdGlvbi0+bmV4dCkKLSAJCXsKLSAJCSAgaWYgKChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLSAJCSAgICBjb250aW51ZTsKLSAJCSAgbG9hZGFibGVfc2l6ZSArPSAoc3Vic2VjdGlvbi0+X3Jhd19zaXplICsgMHhmKSAmIH4weGY7Ci0gCQl9Ci0gCSAgICB9Ci0gCSAgbG9hZGFibGVfc2l6ZSArPSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRTsKLQotIAkgIC8qIEFzc3VtZSB0aGVyZSBhcmUgdHdvIGxvYWRhYmxlIHNlZ21lbnRzIGNvbnNpc3Rpbmcgb2YKLSAJICAgICBjb250aWd1b3VzIHNlY3Rpb25zLiAgSXMgNSBlbm91Z2g/ICAqLwotIAkgIGxvY2FsX2dvdG5vID0gKGxvYWRhYmxlX3NpemUgPj4gMTYpICsgNTsKLQkgIGlmIChJUklYX0NPTVBBVCAob3V0cHV0X2JmZCkgPT0gaWN0X2lyaXg2KQotCSAgICAvKiBJdCdzIHBvc3NpYmxlIHdlIHdpbGwgbmVlZCBHT1RfUEFHRSBlbnRyaWVzIGFzIHdlbGwgYXMKLQkgICAgICAgR09UMTYgZW50cmllcy4gIE9mdGVuLCB0aGVzZSB3aWxsIGJlIGFibGUgdG8gc2hhcmUgR09UCi0JICAgICAgIGVudHJpZXMsIGJ1dCBub3QgYWx3YXlzLiAgKi8KLQkgICAgbG9jYWxfZ290bm8gKj0gMjsKLQotIAkgIGctPmxvY2FsX2dvdG5vICs9IGxvY2FsX2dvdG5vOwotIAkgIHMtPl9yYXdfc2l6ZSArPSBsb2NhbF9nb3RubyAqIE1JUFNfRUxGX0dPVF9TSVpFIChkeW5vYmopOwotCi0gCSAgLyogVGhlcmUgaGFzIHRvIGJlIGEgZ2xvYmFsIEdPVCBlbnRyeSBmb3IgZXZlcnkgc3ltYm9sIHdpdGgKLSAJICAgICBhIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGluZGV4IG9mIERUX01JUFNfR09UU1lNIG9yCi0gCSAgICAgaGlnaGVyLiAgVGhlcmVmb3JlLCBpdCBtYWtlIHNlbnNlIHRvIHB1dCB0aG9zZSBzeW1ib2xzCi0gCSAgICAgdGhhdCBuZWVkIEdPVCBlbnRyaWVzIGF0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCB0YWJsZS4gIFdlCi0gCSAgICAgZG8gdGhhdCBoZXJlLiAgKi8KLSAJICBpZiAoIW1pcHNfZWxmX3NvcnRfaGFzaF90YWJsZSAoaW5mbywgMSkpCi0gCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmIChnLT5nbG9iYWxfZ290c3ltICE9IE5VTEwpCi0JICAgIGkgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50IC0gZy0+Z2xvYmFsX2dvdHN5bS0+ZHluaW5keDsKLQkgIGVsc2UKLQkgICAgLyogSWYgdGhlcmUgYXJlIG5vIGdsb2JhbCBzeW1ib2xzLCBvciBub25lIHJlcXVpcmluZwotCSAgICAgICByZWxvY2F0aW9ucywgdGhlbiBHTE9CQUxfR09UU1lNIHdpbGwgYmUgTlVMTC4gICovCi0JICAgIGkgPSAwOwotCSAgZy0+Z2xvYmFsX2dvdG5vID0gaTsKLQkgIHMtPl9yYXdfc2l6ZSArPSBpICogTUlQU19FTEZfR09UX1NJWkUgKGR5bm9iaik7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpID09IDApCi0JewotCSAgLyogSXJpeCBybGQgYXNzdW1lcyB0aGF0IHRoZSBmdW5jdGlvbiBzdHViIGlzbid0IGF0IHRoZSBlbmQKLQkgICAgIG9mIC50ZXh0IHNlY3Rpb24uIFNvIHB1dCBhIGR1bW15LiBYWFggICovCi0JICBzLT5fcmF3X3NpemUgKz0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkU7Ci0JfQotICAgICAgZWxzZSBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICAgICAgJiYgISBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZAotCSAgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLnJsZF9tYXAiLCA4KSA9PSAwKQotCXsKLQkgIC8qIFdlIGFkZCBhIHJvb20gZm9yIF9fcmxkX21hcC4gSXQgd2lsbCBiZSBmaWxsZWQgaW4gYnkgdGhlCi0JICAgICBydGxkIHRvIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBfcl9kZWJ1ZyBzdHJ1Y3R1cmUuICAqLwotCSAgcy0+X3Jhd19zaXplICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkKLQkgICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5jb21wYWN0X3JlbCIsIDEyKSA9PSAwKQotCXMtPl9yYXdfc2l6ZSArPSBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Y29tcGFjdF9yZWxfc2l6ZTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKG91dHB1dF9iZmQpKQotCSAgICAgICA9PSAwKQotCXMtPl9yYXdfc2l6ZSA9IChzaXplb2YgKEVsZjMyX0V4dGVybmFsX01zeW0pIAotCQkJKiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudAotCQkJICAgKyBiZmRfY291bnRfc2VjdGlvbnMgKG91dHB1dF9iZmQpKSk7Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmluaXQiLCA1KSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmX21pcHNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKSkKLQkgICAgewotCSAgICAgIC8qIFNHSSBvYmplY3QgaGFzIHRoZSBlcXVpdmFsZW5jZSBvZiBEVF9ERUJVRyBpbiB0aGUKLQkJIERUX01JUFNfUkxEX01BUCBlbnRyeS4gICovCi0JICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfUkxEX01BUCwgMCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfREVCVUcsIDApKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX1BMVEdPVCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwKLQkJCQkgICBNSVBTX0VMRl9SRUxfRFlOX1NFQ1RJT05fTkFNRSAoZHlub2JqKSkpCi0JewotCSAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX1JFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX1JFTFNaLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfUkVMRU5ULCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfQ09ORkxJQ1ROTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19MSUJMSVNUTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuY29uZmxpY3QiKSAhPSBOVUxMKQotCXsKLQkgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0NPTkZMSUNULCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5saWJsaXN0Iik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0JICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19MSUJMSVNULCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfUkxEX1ZFUlNJT04sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfRkxBR1MsIDApKQotCXJldHVybiBmYWxzZTsKLQotI2lmIDAKLSAgICAgIC8qIFRpbWUgc3RhbXBzIGluIGV4ZWN1dGFibGUgZmlsZXMgYXJlIGEgYmFkIGlkZWEuICAqLwotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfVElNRV9TVEFNUCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KLSNpZiAwIC8qIEZJWE1FICAqLwotICAgICAgaWYgKCEgTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfSUNIRUNLU1VNLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQotI2lmIDAgLyogRklYTUUgICovCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19JVkVSU0lPTiwgMCkpCi0JcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0JBU0VfQUREUkVTUywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19MT0NBTF9HT1ROTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19TWU1UQUJOTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBNSVBTX0VMRl9BRERfRFlOQU1JQ19FTlRSWSAoaW5mbywgRFRfTUlQU19VTlJFRkVYVE5PLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0dPVFNZTSwgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoSVJJWF9DT01QQVQgKGR5bm9iaikgPT0gaWN0X2lyaXg1Ci0JICAmJiAhIE1JUFNfRUxGX0FERF9EWU5BTUlDX0VOVFJZIChpbmZvLCBEVF9NSVBTX0hJUEFHRU5PLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChJUklYX0NPTVBBVCAoZHlub2JqKSA9PSBpY3RfaXJpeDYKLQkgICYmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAKLQkgICAgICAoZHlub2JqLCBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAoZHlub2JqKSkpCi0JICAmJiAhTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfT1BUSU9OUywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgCi0JCQkJICAgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKGR5bm9iaikpCi0JICAmJiAhTUlQU19FTEZfQUREX0RZTkFNSUNfRU5UUlkgKGluZm8sIERUX01JUFNfTVNZTSwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSWYgTkFNRSBpcyBvbmUgb2YgdGhlIHNwZWNpYWwgSVJJWDYgc3ltYm9scyBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIsCi0gICBhZGp1c3QgaXQgYXBwcm9wcmlhdGVseSBub3cuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGZfaXJpeDZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChhYmZkLCBuYW1lLCBzeW0pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIC8qIFRoZSBsaW5rZXIgc2NyaXB0IHRha2VzIGNhcmUgb2YgcHJvdmlkaW5nIG5hbWVzIGFuZCB2YWx1ZXMgZm9yCi0gICAgIHRoZXNlLCBidXQgd2UgbXVzdCBwbGFjZSB0aGVtIGludG8gdGhlIHJpZ2h0IHNlY3Rpb25zLiAgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHRleHRfc2VjdGlvbl9zeW1ib2xzW10gPSB7Ci0gICAgIl9mdGV4dCIsCi0gICAgIl9ldGV4dCIsCi0gICAgIl9fZHNvX2Rpc3BsYWNlbWVudCIsCi0gICAgIl9fZWxmX2hlYWRlciIsCi0gICAgIl9fcHJvZ3JhbV9oZWFkZXJfdGFibGUiLAotICAgIE5VTEwKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgZGF0YV9zZWN0aW9uX3N5bWJvbHNbXSA9IHsKLSAgICAiX2ZkYXRhIiwKLSAgICAiX2VkYXRhIiwKLSAgICAiX2VuZCIsCi0gICAgIl9mYnNzIiwKLSAgICBOVUxMCi0gIH07Ci0KLSAgY29uc3QgY2hhciogY29uc3QgKnA7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpCi0gICAgZm9yIChwID0gKGkgPT0gMCkgPyB0ZXh0X3NlY3Rpb25fc3ltYm9scyA6IGRhdGFfc2VjdGlvbl9zeW1ib2xzOyAKLQkgKnA7Ci0JICsrcCkKLSAgICAgIGlmIChzdHJjbXAgKCpwLCBuYW1lKSA9PSAwKQotCXsKLQkgIC8qIEFsbCBvZiB0aGVzZSBzeW1ib2xzIGFyZSBnaXZlbiB0eXBlIFNUVF9TRUNUSU9OIGJ5IHRoZQotCSAgICAgSVJJWDYgbGlua2VyLiAgKi8KLQkgIHN5bS0+c3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBTVFRfU0VDVElPTik7Ci0JICAKLQkgIC8qIFRoZSBJUklYIGxpbmtlciBwdXRzIHRoZXNlIHN5bWJvbHMgaW4gc3BlY2lhbCBzZWN0aW9ucy4gICovCi0JICBpZiAoaSA9PSAwKQotCSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX01JUFNfVEVYVDsKLQkgIGVsc2UKLQkgICAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX0RBVEE7Ci0JICAKLQkgIGJyZWFrOwotCX0KLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBiZmQgKmR5bm9iajsKLSAgYmZkX3ZtYSBndmFsOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNtc3ltOwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqbWg7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGd2YWwgPSBzeW0tPnN0X3ZhbHVlOwotICBtaCA9IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgYmZkX2J5dGUgKnA7Ci0gICAgICBiZmRfYnl0ZSBzdHViW01JUFNfRlVOQ1RJT05fU1RVQl9TSVpFXTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGEgc3R1Yi4gIFNldCBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgCi0JCQkJICAgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUgKGR5bm9iaikpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogRmlsbCB0aGUgc3R1Yi4gICovCi0gICAgICBwID0gc3R1YjsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNUVUJfTFcob3V0cHV0X2JmZCksIHApOwotICAgICAgcCArPSA0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1RVQl9NT1ZFLCBwKTsKLSAgICAgIHAgKz0gNDsKLQotICAgICAgLyogRklYTUU6IENhbiBoLT5keW5pbmRleCBiZSBtb3JlIHRoYW4gNjRLPyAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ICYgMHhmZmZmMDAwMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNUVUJfSkFMUiwgcCk7Ci0gICAgICBwICs9IDQ7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTVFVCX0xJMTYgKyBoLT5keW5pbmR4LCBwKTsKLQotICAgICAgQkZEX0FTU0VSVCAoaC0+cGx0Lm9mZnNldCA8PSBzLT5fcmF3X3NpemUpOwotICAgICAgbWVtY3B5IChzLT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQsIHN0dWIsIE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFKTsKLQotICAgICAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZC4gIHBsdC5vZmZzZXQgIT0gLTEgb2NjdXJzCi0JIG9ubHkgZm9yIHRoZSByZWZlcmVuY2VkIHN5bWJvbC4gICovCi0gICAgICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCi0gICAgICAvKiBUaGUgcnVuLXRpbWUgbGlua2VyIHVzZXMgdGhlIHN0X3ZhbHVlIGZpZWxkIG9mIHRoZSBzeW1ib2wKLQkgdG8gcmVzZXQgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIHRoaXMgZXh0ZXJuYWwKLQkgdG8gaXRzIHN0dWIgYWRkcmVzcyB3aGVuIHVubGlua2luZyBhIHNoYXJlZCBvYmplY3QuICAqLwotICAgICAgZ3ZhbCA9IHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0ICsgaC0+cGx0Lm9mZnNldDsKLSAgICAgIHN5bS0+c3RfdmFsdWUgPSBndmFsOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICBzZ290ID0gbWlwc19lbGZfZ290X3NlY3Rpb24gKGR5bm9iaik7Ci0gIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOwotICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKLSAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLQotICAvKiBSdW4gdGhyb3VnaCB0aGUgZ2xvYmFsIHN5bWJvbCB0YWJsZSwgY3JlYXRpbmcgR09UIGVudHJpZXMgZm9yIGFsbAotICAgICB0aGUgc3ltYm9scyB0aGF0IG5lZWQgdGhlbS4gICovCi0gIGlmIChnLT5nbG9iYWxfZ290c3ltICE9IE5VTEwKLSAgICAgICYmIGgtPmR5bmluZHggPj0gZy0+Z2xvYmFsX2dvdHN5bS0+ZHluaW5keCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0KLSAgICAgIGlmIChzeW0tPnN0X3ZhbHVlKQotCXZhbHVlID0gc3ltLT5zdF92YWx1ZTsKLSAgICAgIGVsc2UKLQkvKiBGb3IgYW4gZW50aXR5IGRlZmluZWQgaW4gYSBzaGFyZWQgb2JqZWN0LCB0aGlzIHdpbGwgYmUKLQkgICBOVUxMLiAgKEZvciBmdW5jdGlvbnMgaW4gc2hhcmVkIG9iamVjdHMgZm9yCi0JICAgd2hpY2ggd2UgaGF2ZSBjcmVhdGVkIHN0dWJzLCBTVF9WQUxVRSB3aWxsIGJlIG5vbi1OVUxMLgotCSAgIFRoYXQncyBiZWNhdXNlIHN1Y2ggdGhlIGZ1bmN0aW9ucyBhcmUgbm93IG5vIGxvbmdlciBkZWZpbmVkCi0JICAgaW4gYSBzaGFyZWQgb2JqZWN0LikgICovCi0JdmFsdWUgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotCi0gICAgICBvZmZzZXQgPSBtaXBzX2VsZl9nbG9iYWxfZ290X2luZGV4IChkeW5vYmosIGgpOwotICAgICAgTUlQU19FTEZfUFVUX1dPUkQgKG91dHB1dF9iZmQsIHZhbHVlLCBzZ290LT5jb250ZW50cyArIG9mZnNldCk7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhIC5tc3ltIGVudHJ5LCBpZiBhcHByb3ByaWF0ZS4gICovCi0gIHNtc3ltID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgCi0JCQkJICAgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKGR5bm9iaikpOwotICBpZiAoc21zeW0pCi0gICAgewotICAgICAgRWxmMzJfSW50ZXJuYWxfTXN5bSBtc3ltOwotCi0gICAgICBtc3ltLm1zX2hhc2hfdmFsdWUgPSBiZmRfZWxmX2hhc2ggKGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotICAgICAgLyogSXQgaXMgdW5kb2N1bWVudGVkIHdoYXQgdGhlIGAxJyBpbmRpY2F0ZXMsIGJ1dCBJUklYNiB1c2VzCi0JIHRoaXMgdmFsdWUuICAqLwotICAgICAgbXN5bS5tc19pbmZvID0gRUxGMzJfTVNfSU5GTyAobWgtPm1pbl9keW5fcmVsb2NfaW5kZXgsIDEpOwotICAgICAgYmZkX21pcHNfZWxmX3N3YXBfbXN5bV9vdXQgCi0JKGR5bm9iaiwgJm1zeW0sCi0JICgoRWxmMzJfRXh0ZXJuYWxfTXN5bSAqKSBzbXN5bS0+Y29udGVudHMpICsgaC0+ZHluaW5keCk7Ci0gICAgfQotCi0gIC8qIE1hcmsgX0RZTkFNSUMgYW5kIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhcyBhYnNvbHV0ZS4gICovCi0gIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICBpZiAoc3RyY21wIChuYW1lLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKG5hbWUsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfRFlOQU1JQ19MSU5LIikgPT0gMCkKLSAgICB7Ci0gICAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLSAgICAgIHN5bS0+c3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBTVFRfU0VDVElPTik7Ci0gICAgICBzeW0tPnN0X3ZhbHVlID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICJfZ3BfZGlzcCIpID09IDApCi0JewotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgc3ltLT5zdF92YWx1ZSA9IGVsZl9ncCAob3V0cHV0X2JmZCk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzBdKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1sxXSkgPT0gMCkKLQl7Ci0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgc3ltLT5zdF9vdGhlciA9IFNUT19QUk9URUNURUQ7Ci0JICBzeW0tPnN0X3ZhbHVlID0gMDsKLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19EQVRBOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1syXSkgPT0gMCkKLQl7Ci0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgc3ltLT5zdF9vdGhlciA9IFNUT19QUk9URUNURUQ7Ci0JICBzeW0tPnN0X3ZhbHVlID0gbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnByb2NlZHVyZV9jb3VudDsKLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0FCUykKLQl7Ci0JICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQykKLQkgICAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX1RFWFQ7Ci0JICBlbHNlIGlmIChoLT50eXBlID09IFNUVF9PQkpFQ1QpCi0JICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19EQVRBOwotCX0KLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBJUklYNi1zcGVjaWZpYyBzeW1ib2xzLiAgKi8KLSAgaWYgKElSSVhfQ09NUEFUIChvdXRwdXRfYmZkKSA9PSBpY3RfaXJpeDYpCi0gICAgbWlwc19lbGZfaXJpeDZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBuYW1lLCBzeW0pOwotCi0gIGlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKQotICAgICAgJiYgISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgaWYgKCEgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQKLQkgICYmIHN0cmNtcCAobmFtZSwgIl9fcmxkX21hcCIpID09IDApCi0JewotCSAgYXNlY3Rpb24gKnMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJsZF9tYXAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzeW0tPnN0X3ZhbHVlID0gcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHMtPm91dHB1dF9vZmZzZXQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgcy0+Y29udGVudHMpOwotCSAgaWYgKG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5ybGRfdmFsdWUgPT0gMCkKLQkgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnJsZF92YWx1ZSA9IHN5bS0+c3RfdmFsdWU7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiX19ybGRfb2JqX2hlYWQiKSA9PSAwKQotCXsKLQkgIC8qIElSSVg2IGRvZXMgbm90IHVzZSBhIC5ybGRfbWFwIHNlY3Rpb24uICAqLwotCSAgaWYgKElSSVhfQ09NUEFUIChvdXRwdXRfYmZkKSA9PSBpY3RfaXJpeDUpCi0JICAgIEJGRF9BU1NFUlQgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmxkX21hcCIpIAotCQkJIT0gTlVMTCk7Ci0JICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cmxkX3ZhbHVlID0gc3ltLT5zdF92YWx1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBtaXBzMTYgc3ltYm9sLCBmb3JjZSB0aGUgdmFsdWUgdG8gYmUgZXZlbi4gICovCi0gIGlmIChzeW0tPnN0X290aGVyID09IFNUT19NSVBTMTYKLSAgICAgICYmIChzeW0tPnN0X3ZhbHVlICYgMSkgIT0gMCkKLSAgICAtLXN5bS0+c3RfdmFsdWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2R5bjsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBzZ290ID0gbWlwc19lbGZfZ290X3NlY3Rpb24gKGR5bm9iaik7Ci0gIGlmIChzZ290ID09IE5VTEwpCi0gICAgZyA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLSAgICAgIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOwotICAgICAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpiOwotCi0gICAgICBCRkRfQVNTRVJUIChzZHluICE9IE5VTEwpOwotICAgICAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLQotICAgICAgZm9yIChiID0gc2R5bi0+Y29udGVudHM7Ci0JICAgYiA8IHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplOwotCSAgIGIgKz0gTUlQU19FTEZfRFlOX1NJWkUgKGR5bm9iaikpCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgc2l6ZV90IGVsZW1zaXplOwotCSAgYXNlY3Rpb24gKnM7Ci0JICBib29sZWFuIHN3YXBfb3V0X3A7Ci0KLQkgIC8qIFJlYWQgaW4gdGhlIGN1cnJlbnQgZHluYW1pYyBlbnRyeS4gICovCi0JICAoKmdldF9lbGZfYmFja2VuZF9kYXRhIChkeW5vYmopLT5zLT5zd2FwX2R5bl9pbikgKGR5bm9iaiwgYiwgJmR5bik7Ci0JICAKLQkgIC8qIEFzc3VtZSB0aGF0IHdlJ3JlIGdvaW5nIHRvIG1vZGlmeSBpdCBhbmQgd3JpdGUgaXQgb3V0LiAgKi8KLQkgIHN3YXBfb3V0X3AgPSB0cnVlOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBjYXNlIERUX1JFTEVOVDoKLQkgICAgICBzID0gKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIAotCQkgICAoZHlub2JqLAotCQkgICAgTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUgKGR5bm9iaikpKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gTUlQU19FTEZfUkVMX1NJWkUgKGR5bm9iaik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9TVFJTWjoKLQkgICAgICAvKiBSZXdyaXRlIERUX1NUUlNaLiAgKi8KLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9Ci0JCV9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBuYW1lID0gIi5nb3QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUOgotCSAgICAgIG5hbWUgPSAiLmNvbmZsaWN0IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUOgotCSAgICAgIG5hbWUgPSAiLmxpYmxpc3QiOwotCSAgICBnZXRfdm1hOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfUkxEX1ZFUlNJT046Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSAxOyAvKiBYWFggKi8KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfRkxBR1M6Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSBSSEZfTk9UUE9UOyAvKiBYWFggKi8KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1ROTzoKLQkgICAgICBuYW1lID0gIi5jb25mbGljdCI7Ci0JICAgICAgZWxlbXNpemUgPSBzaXplb2YgKEVsZjMyX0NvbmZsaWN0KTsKLQkgICAgICBnb3RvIHNldF9lbGVtbm87Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0xJQkxJU1ROTzoKLQkgICAgICBuYW1lID0gIi5saWJsaXN0IjsKLQkgICAgICBlbGVtc2l6ZSA9IHNpemVvZiAoRWxmMzJfTGliKTsKLQkgICAgc2V0X2VsZW1ubzoKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIGlmIChzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCSAgICBkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZSAvIGVsZW1zaXplOwotCQkgIGVsc2UKLQkJICAgIGR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplIC8gZWxlbXNpemU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX1RJTUVfU1RBTVA6Ci0JICAgICAgdGltZSAoKHRpbWVfdCAqKSAmZHluLmRfdW4uZF92YWwpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19JQ0hFQ0tTVU06Ci0JICAgICAgLyogWFhYIEZJWE1FOiAqLwotCSAgICAgIHN3YXBfb3V0X3AgPSBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfSVZFUlNJT046Ci0JICAgICAgLyogWFhYIEZJWE1FOiAqLwotCSAgICAgIHN3YXBfb3V0X3AgPSBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfQkFTRV9BRERSRVNTOgotCSAgICAgIHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hICYgfigweGZmZmYpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19MT0NBTF9HT1ROTzoKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IGctPmxvY2FsX2dvdG5vOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19VTlJFRkVYVE5POgotCSAgICAgIC8qIFRoZSBpbmRleCBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSB3aGljaCBpcyB0aGUKLQkJIGVudHJ5IG9mIHRoZSBmaXJzdCBleHRlcm5hbCBzeW1ib2wgdGhhdCBpcyBub3QKLQkJIHJlZmVyZW5jZWQgd2l0aGluIHRoZSBzYW1lIG9iamVjdC4gICovCi0JICAgICAgZHluLmRfdW4uZF92YWwgPSBiZmRfY291bnRfc2VjdGlvbnMgKG91dHB1dF9iZmQpICsgMTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfR09UU1lNOgotCSAgICAgIGlmIChnLT5nbG9iYWxfZ290c3ltKQotCQl7Ci0JCSAgZHluLmRfdW4uZF92YWwgPSBnLT5nbG9iYWxfZ290c3ltLT5keW5pbmR4OwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgLyogSW4gY2FzZSBpZiB3ZSBkb24ndCBoYXZlIGdsb2JhbCBnb3Qgc3ltYm9scyB3ZSBkZWZhdWx0Ci0JCSB0byBzZXR0aW5nIERUX01JUFNfR09UU1lNIHRvIHRoZSBzYW1lIHZhbHVlIGFzCi0JCSBEVF9NSVBTX1NZTVRBQk5PLCBzbyB3ZSBqdXN0IGZhbGwgdGhyb3VnaC4gICovCi0KLQkgICAgY2FzZSBEVF9NSVBTX1NZTVRBQk5POgotCSAgICAgIG5hbWUgPSAiLmR5bnN5bSI7Ci0JICAgICAgZWxlbXNpemUgPSBNSVBTX0VMRl9TWU1fU0laRSAob3V0cHV0X2JmZCk7Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0JICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZSAvIGVsZW1zaXplOwotCSAgICAgIGVsc2UKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemUgLyBlbGVtc2l6ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfSElQQUdFTk86Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSBnLT5sb2NhbF9nb3RubyAtIE1JUFNfUkVTRVJWRURfR09UTk87Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX1JMRF9NQVA6Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cmxkX3ZhbHVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19PUFRJT05TOgotCSAgICAgIHMgPSAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgCi0JCSAgIChvdXRwdXRfYmZkLCBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfTVNZTToKLQkgICAgICBzID0gKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIAotCQkgICAob3V0cHV0X2JmZCwgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKG91dHB1dF9iZmQpKSk7Ci0JICAgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBzd2FwX291dF9wID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHN3YXBfb3V0X3ApCi0JICAgICgqZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGR5bm9iaiktPnMtPnN3YXBfZHluX291dCkgCi0JICAgICAgKGR5bm9iaiwgJmR5biwgYik7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgZmlyc3QgZW50cnkgb2YgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBiZSBmaWxsZWQgYXQKLSAgICAgcnVudGltZS4gVGhlIHNlY29uZCBlbnRyeSB3aWxsIGJlIHVzZWQgYnkgc29tZSBydW50aW1lIGxvYWRlcnMuCi0gICAgIFRoaXMgaXNuJ3QgdGhlIGNhc2Ugb2YgSXJpeCBybGQuICovCi0gIGlmIChzZ290ICE9IE5VTEwgJiYgc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBNSVBTX0VMRl9QVVRfV09SRCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIE1JUFNfRUxGX1BVVF9XT1JEIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMHg4MDAwMDAwMCwgCi0JCQkgc2dvdC0+Y29udGVudHMgKyBNSVBTX0VMRl9HT1RfU0laRSAob3V0cHV0X2JmZCkpOwotICAgIH0KLQotICBpZiAoc2dvdCAhPSBOVUxMKQotICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZQotICAgICAgPSBNSVBTX0VMRl9HT1RfU0laRSAob3V0cHV0X2JmZCk7Ci0KLSAgewotICAgIGFzZWN0aW9uICpzbXN5bTsKLSAgICBhc2VjdGlvbiAqczsKLSAgICBFbGYzMl9jb21wYWN0X3JlbCBjcHQ7Ci0KLSAgICAvKiA/Pz8gVGhlIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucyB3ZXJlIHNldCB1cCBpbgotICAgICAgIF9iZmRfZWxmX2ZpbmFsX2xpbmsuICBTR0kgc2V0cyB0aGUgU1RUX05PVFlQRSBhdHRyaWJ1dGUgZm9yIHRoZXNlCi0gICAgICAgc3ltYm9scy4gIFNob3VsZCB3ZSBkbyBzbz8gICovCi0KLSAgICBzbXN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSAgICAgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKGR5bm9iaikpOwotICAgIGlmIChzbXN5bSAhPSBOVUxMKQotICAgICAgewotCUVsZjMyX0ludGVybmFsX01zeW0gbXN5bTsKLQotCW1zeW0ubXNfaGFzaF92YWx1ZSA9IDA7Ci0JbXN5bS5tc19pbmZvID0gRUxGMzJfTVNfSU5GTyAoMCwgMSk7Ci0KLQlmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkgIHsKLQkgICAgbG9uZyBkeW5pbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHg7Ci0KLQkgICAgYmZkX21pcHNfZWxmX3N3YXBfbXN5bV9vdXQgCi0JICAgICAgKG91dHB1dF9iZmQsICZtc3ltLAotCSAgICAgICAoKChFbGYzMl9FeHRlcm5hbF9Nc3ltICopIHNtc3ltLT5jb250ZW50cykKLQkJKyBkeW5pbmR4KSk7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkpCi0gICAgICB7Ci0JLyogV3JpdGUgLmNvbXBhY3RfcmVsIHNlY3Rpb24gb3V0LiAgKi8KLQlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5jb21wYWN0X3JlbCIpOwotCWlmIChzICE9IE5VTEwpCi0JICB7Ci0JICAgIGNwdC5pZDEgPSAxOwotCSAgICBjcHQubnVtID0gcy0+cmVsb2NfY291bnQ7Ci0JICAgIGNwdC5pZDIgPSAyOwotCSAgICBjcHQub2Zmc2V0ID0gKHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zCi0JCQkgICsgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCkpOwotCSAgICBjcHQucmVzZXJ2ZWQwID0gMDsKLQkgICAgY3B0LnJlc2VydmVkMSA9IDA7Ci0JICAgIGJmZF9lbGYzMl9zd2FwX2NvbXBhY3RfcmVsX291dCAob3V0cHV0X2JmZCwgJmNwdCwKLQkJCQkJICAgICgoRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwgKikKLQkJCQkJICAgICBzLT5jb250ZW50cykpOwotCi0JICAgIC8qIENsZWFuIHVwIGEgZHVtbXkgc3R1YiBmdW5jdGlvbiBlbnRyeSBpbiAudGV4dC4gICovCi0JICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAKLQkJCQkJIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLQkgICAgaWYgKHMgIT0gTlVMTCkKLQkgICAgICB7Ci0JCWZpbGVfcHRyIGR1bW15X29mZnNldDsKLQotCQlCRkRfQVNTRVJUIChzLT5fcmF3X3NpemUgPj0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkUpOwotCQlkdW1teV9vZmZzZXQgPSBzLT5fcmF3X3NpemUgLSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRTsKLQkJbWVtc2V0IChzLT5jb250ZW50cyArIGR1bW15X29mZnNldCwgMCwKLQkJCU1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFKTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAvKiBDbGVhbiB1cCBhIGZpcnN0IHJlbG9jYXRpb24gaW4gLnJlbC5keW4uICAqLwotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAKLQkJCQkgTUlQU19FTEZfUkVMX0RZTl9TRUNUSU9OX05BTUUgKGR5bm9iaikpOwotICAgIGlmIChzICE9IE5VTEwgJiYgcy0+X3Jhd19zaXplID4gMCkKLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIE1JUFNfRUxGX1JFTF9TSVpFIChkeW5vYmopKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhpcyBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIGJmZF9nZW5lcmljX2dldF8uLi4gZXhjZXB0IHRoYXQgc29tZQotICAgTUlQUyByZWxvY2F0aW9ucyBuZWVkIHRvIGJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgU2lnaC4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1lbGYzMl9taXBzX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkgICByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0gIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX2NvdW50OwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogcmVhZCBpbiB0aGUgc2VjdGlvbiAqLwotICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLAotCQkJCSAoUFRSKSBkYXRhLAotCQkJCSAwLAotCQkJCSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlJ3JlIG5vdCByZWxheGluZyB0aGUgc2VjdGlvbiwgc28ganVzdCBjb3B5IHRoZSBzaXplIGluZm8gKi8KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplOwotICBpbnB1dF9zZWN0aW9uLT5yZWxvY19kb25lID0gdHJ1ZTsKLQotICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwKLQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJcmVsb2NfdmVjdG9yLAotCQkJCQlzeW1ib2xzKTsKLSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAocmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipwYXJlbnQ7Ci0gICAgICAvKiBmb3IgbWlwcyAqLwotICAgICAgaW50IGdwX2ZvdW5kOwotICAgICAgYmZkX3ZtYSBncCA9IDB4MTIzNDU2Nzg7CS8qIGluaXRpYWxpemUganVzdCB0byBzaHV0IGdjYyB1cCAqLwotCi0gICAgICB7Ci0Jc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpoOwotCXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpsaDsKLQkvKiBTa2lwIGFsbCB0aGlzIHN0dWZmIGlmIHdlIGFyZW4ndCBtaXhpbmcgZm9ybWF0cy4gICovCi0JaWYgKGFiZmQgJiYgaW5wdXRfYmZkCi0JICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5wdXRfYmZkLT54dmVjKQotCSAgbGggPSAwOwotCWVsc2UKLQkgIHsKLQkgICAgaCA9IGJmZF9oYXNoX2xvb2t1cCAoJmxpbmtfaW5mby0+aGFzaC0+dGFibGUsICJfZ3AiLCBmYWxzZSwgZmFsc2UpOwotCSAgICBsaCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCSAgfQotICAgICAgbG9va3VwOgotCWlmIChsaCkKLQkgIHsKLQkgICAgc3dpdGNoIChsaC0+dHlwZSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JCWdwX2ZvdW5kID0gMDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JCWdwX2ZvdW5kID0gMTsKLQkJZ3AgPSBsaC0+dS5kZWYudmFsdWU7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLQkJbGggPSBsaC0+dS5pLmxpbms7Ci0JCS8qIEBARklYTUUgIGlnbm9yaW5nIHdhcm5pbmcgZm9yIG5vdyAqLwotCQlnb3RvIGxvb2t1cDsKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotCSAgICAgIGRlZmF1bHQ6Ci0JCWFib3J0ICgpOwotCSAgICAgIH0KLQkgIH0KLQllbHNlCi0JICBncF9mb3VuZCA9IDA7Ci0gICAgICB9Ci0gICAgICAvKiBlbmQgbWlwcyAqLwotICAgICAgZm9yIChwYXJlbnQgPSByZWxvY192ZWN0b3I7ICpwYXJlbnQgIT0gKGFyZWxlbnQgKikgTlVMTDsKLQkgICBwYXJlbnQrKykKLQl7Ci0JICBjaGFyICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikgTlVMTDsKLQkgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0JICAvKiBTcGVjaWZpYyB0byBNSVBTOiBEZWFsIHdpdGggcmVsb2NhdGlvbiB0eXBlcyB0aGF0IHJlcXVpcmUKLQkgICAgIGtub3dpbmcgdGhlIGdwIG9mIHRoZSBvdXRwdXQgYmZkLiAgKi8KLQkgIGFzeW1ib2wgKnN5bSA9ICooKnBhcmVudCktPnN5bV9wdHJfcHRyOwotCSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSAmJiBhYmZkKQotCSAgICB7Ci0JICAgICAgLyogVGhlIHNwZWNpYWxfZnVuY3Rpb24gd291bGRuJ3QgZ2V0IGNhbGxlZCBhbnl3YXlzLiAgKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoIWdwX2ZvdW5kKQotCSAgICB7Ci0JICAgICAgLyogVGhlIGdwIGlzbid0IHRoZXJlOyBsZXQgdGhlIHNwZWNpYWwgZnVuY3Rpb24gY29kZQotCQkgZmFsbCBvdmVyIG9uIGl0cyBvd24uICAqLwotCSAgICB9Ci0JICBlbHNlIGlmICgoKnBhcmVudCktPmhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uCi0JCSAgID09IF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYykKLQkgICAgewotCSAgICAgIC8qIGJ5cGFzcyBzcGVjaWFsX2Z1bmN0aW9uIGNhbGwgKi8KLQkgICAgICByID0gZ3ByZWwxNl93aXRoX2dwIChpbnB1dF9iZmQsIHN5bSwgKnBhcmVudCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICByZWxvY2F0ZWFibGUsIChQVFIpIGRhdGEsIGdwKTsKLQkgICAgICBnb3RvIHNraXBfYmZkX3BlcmZvcm1fcmVsb2NhdGlvbjsKLQkgICAgfQotCSAgLyogZW5kIG1pcHMgc3BlY2lmaWMgc3R1ZmYgKi8KLQotCSAgciA9IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwKLQkJCQkgICAgICAqcGFyZW50LAotCQkJCSAgICAgIChQVFIpIGRhdGEsCi0JCQkJICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICByZWxvY2F0ZWFibGUgPyBhYmZkIDogKGJmZCAqKSBOVUxMLAotCQkJCSAgICAgICZlcnJvcl9tZXNzYWdlKTsKLQlza2lwX2JmZF9wZXJmb3JtX3JlbG9jYXRpb246Ci0KLQkgIGlmIChyZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqb3MgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgICAgIC8qIEEgcGFydGlhbCBsaW5rLCBzbyBrZWVwIHRoZSByZWxvY3MgKi8KLQkgICAgICBvcy0+b3JlbG9jYXRpb25bb3MtPnJlbG9jX2NvdW50XSA9ICpwYXJlbnQ7Ci0JICAgICAgb3MtPnJlbG9jX2NvdW50Kys7Ci0JICAgIH0KLQotCSAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyKQotCQl7Ci0JCWNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkJICBpZiAoISgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkJKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKigqcGFyZW50KS0+c3ltX3B0cl9wdHIpLAotCQkJIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKCpwYXJlbnQpLT5hZGRyZXNzKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCQkgIEJGRF9BU1NFUlQgKGVycm9yX21lc3NhZ2UgIT0gKGNoYXIgKikgTlVMTCk7Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkJKGxpbmtfaW5mbywgZXJyb3JfbWVzc2FnZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkJKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKigqcGFyZW50KS0+c3ltX3B0cl9wdHIpLAotCQkJICgqcGFyZW50KS0+aG93dG8tPm5hbWUsICgqcGFyZW50KS0+YWRkZW5kLAotCQkJIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKCpwYXJlbnQpLT5hZGRyZXNzKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJICBicmVhazsKLQkJfQotCi0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci0KLWVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBOVUxMOwotfQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGVsZjMyX21pcHNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0MCi0vKiBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZXNlIGFyZSB1c2VkIHdoZW4gZGVhbGluZyB3aXRoIHRoZQotICAgLm1kZWJ1ZyBzZWN0aW9uLCB3aGljaCBpcyBpbiB0aGUgRUNPRkYgZGVidWdnaW5nIGZvcm1hdC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgbWlwc19lbGYzMl9lY29mZl9kZWJ1Z19zd2FwID0KLXsKLSAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCi0gIG1hZ2ljU3ltLAotICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gIDQsCi0gIC8qIFNpemVzIG9mIGV4dGVybmFsIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGRucl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBwZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IG9wdF9leHQpLAotICBzaXplb2YgKHN0cnVjdCBmZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGV4dF9leHQpLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBpbiBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgZWNvZmZfc3dhcF9oZHJfaW4sCi0gIGVjb2ZmX3N3YXBfZG5yX2luLAotICBlY29mZl9zd2FwX3Bkcl9pbiwKLSAgZWNvZmZfc3dhcF9zeW1faW4sCi0gIGVjb2ZmX3N3YXBfb3B0X2luLAotICBlY29mZl9zd2FwX2Zkcl9pbiwKLSAgZWNvZmZfc3dhcF9yZmRfaW4sCi0gIGVjb2ZmX3N3YXBfZXh0X2luLAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luLAotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgb3V0IGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfZG5yX291dCwKLSAgZWNvZmZfc3dhcF9wZHJfb3V0LAotICBlY29mZl9zd2FwX3N5bV9vdXQsCi0gIGVjb2ZmX3N3YXBfb3B0X291dCwKLSAgZWNvZmZfc3dhcF9mZHJfb3V0LAotICBlY29mZl9zd2FwX3JmZF9vdXQsCi0gIGVjb2ZmX3N3YXBfZXh0X291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQsCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCwKLSAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8KLX07Ci0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQliZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkiZWxmMzItbGl0dGxlbWlwcyIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQliZmRfZWxmMzJfYmlnbWlwc192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkJImVsZjMyLWJpZ21pcHMiCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfbWlwcwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV9NSVBTCi0KLS8qIFRoZSBTVlI0IE1JUFMgQUJJIHNheXMgdGhhdCB0aGlzIHNob3VsZCBiZSAweDEwMDAwLCBidXQgSXJpeCA1IHVzZXMKLSAgIGEgdmFsdWUgb2YgMHgxMDAwLCBhbmQgd2UgYXJlIGNvbXBhdGlibGUuICAqLwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEwMDAKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jb2xsZWN0CQl0cnVlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rCXRydWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCXRydWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2lnbl9leHRlbmRfdm1hCXRydWUKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCW1pcHNfaW5mb190b19ob3d0b19yZWxhCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJbWlwc19pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsCW1pcHNfZWxmX3N5bV9pc19nbG9iYWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCV9iZmRfbWlwc19lbGZfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIJX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCV9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gXAotCQkJCQlfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcJX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwCV9iZmRfbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotCQkJCQlfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAkmbWlwc19lbGYzMl9lY29mZl9kZWJ1Z19zd2FwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawlfYmZkX21pcHNfZWxmX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCV9iZmRfbWlwc19lbGZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCV9iZmRfbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCV9iZmRfbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayBcCi0JCQkJCV9iZmRfbWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawlfYmZkX21pcHNfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCV9iZmRfbWlwc19lbGZfZ2Nfc3dlZXBfaG9vawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQkoNCpNSVBTX1JFU0VSVkVEX0dPVE5PKQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUJMAotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0JCQkJCW1pcHNfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmZkX2VsZjMyX2ZpbmRfbmVhcmVzdF9saW5lCV9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgYmZkX2VsZjMyX3NldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZmluYWxfbGluawlfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQlfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQlfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwlfYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLXBqLmMgYi9iZmQvZWxmMzItcGouYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5Njk0OS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItcGouYworKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKiBwaWNvSmF2YSBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYW4gb2YgVHJhbnNtZXRhIChzYWNAcG9ib3guY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvcGouaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwal9lbGZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcGpfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHBqX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcGpfZWxmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfUEpfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwal9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BKX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgU2V0dGluZyBwYXJ0aWFsX2lucGxhY2UgdG8gdHJ1ZSBhbmQKLSAgICAgc3JjX21hc2sgdG8gYSBub24temVybyB2YWx1ZSBpcyBzaW1pbGFyIHRvIHRoZSBDT0ZGIHRvb2xjaGFpbi4gICovCi0gIEhPV1RPIChSX1BKX0RBVEFfRElSMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwal9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BKX0RJUjMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX1BKX0NPREVfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwal9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BKX1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiAxNiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX1BKX0NPREVfUkVMMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZjZ3ICovCi0JIHBqX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUEpfUkVMMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEVNUFRZX0hPV1RPICg0KSwKLSAgRU1QVFlfSE9XVE8gKDUpLAotICBIT1dUTyAoUl9QSl9DT0RFX0RJUjMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwal9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BKX0NPREVfRElSMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgRU1QVFlfSE9XVE8gKDcpLAotICBFTVBUWV9IT1dUTyAoOCksCi0gIEVNUFRZX0hPV1RPICg5KSwKLSAgRU1QVFlfSE9XVE8gKDEwKSwKLSAgRU1QVFlfSE9XVE8gKDExKSwKLSAgRU1QVFlfSE9XVE8gKDEyKSwKLQotICBIT1dUTyAoUl9QSl9DT0RFX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBqX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUEpfTE8xNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotCi0gICAgSE9XVE8gKFJfUEpfQ09ERV9ISTE2LAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcGpfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QSl9ISTE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX1BKX0dOVV9WVElOSEVSSVQsICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1BKX0dOVV9WVElOSEVSSVQiLCAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfUEpfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1BKX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG5vcm1hbCByZWxvY3MuICBUaGlzIGlzIGxpa2UgdGhlIENPRkYKLSAgIGZ1bmN0aW9uLCBhbmQgaXMgYWxtb3N0IGNlcnRhaW5seSBpbmNvcnJlY3QgZm9yIG90aGVyIEVMRiB0YXJnZXRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcGpfZWxmX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBiZmRfdm1hIHN5bV92YWx1ZTsKLSAgZW51bSBlbGZfcGpfcmVsb2NfdHlwZSByX3R5cGU7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBhZGRyICsgKGJmZF9ieXRlICopIGRhdGE7Ci0KLSAgcl90eXBlID0gKGVudW0gZWxmX3BqX3JlbG9jX3R5cGUpIHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZTsKLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFBhcnRpYWwgbGlua2luZy0tZG8gbm90aGluZy4gICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKHN5bWJvbF9pbiAhPSBOVUxMCi0gICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKLSAgICBzeW1fdmFsdWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBlbHNlIAotICAgIHN5bV92YWx1ZSA9IChzeW1ib2xfaW4tPnZhbHVlICsKLQkJIHN5bWJvbF9pbi0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSBzeW1ib2xfaW4tPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfUEpfREFUQV9ESVIzMjoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogUmVsb2NhdGlvbnMgaW4gY29kZSBhcmUgYWx3YXlzIGJpZ2VuZGlhbiwgbm8gbWF0dGVyIHdoYXQgdGhlCi0JIGRhdGEgZW5kaWFubmVzcyBpcy4gKi8KLQotICAgIGNhc2UgUl9QSl9DT0RFX0RJUjMyOgotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGhpdF9kYXRhKTsKLSAgICAgIGluc24gKz0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAgIGJmZF9wdXRiMzIgKGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1BKX0NPREVfUkVMMTY6Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoaGl0X2RhdGEpOwotICAgICAgaW5zbiArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kCi0gICAgICAgIC0gIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0gICAgICAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgYmZkX3B1dGIxNiAoaW5zbiwgaGl0X2RhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1BKX0NPREVfTE8xNjoKLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBiZmRfcHV0YjE2IChpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9QSl9DT0RFX0hJMTY6Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoaGl0X2RhdGEpOwotICAgICAgaW5zbiArPSAoc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZCkgPj4gMTY7Ci0gICAgICBiZmRfcHV0YjE2IChpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1hcCBCRkQgcmVsb2MgY29kZXMgdG8gUEogRUxGIHJlbG9jcy4gICovCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi0vKiBBbiBhcnJheSBtYXBwaW5nIEJGRCByZWxvYyBjb2RlcyB0byBQSiBFTEYgcmVsb2NzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGZfcmVsb2NfbWFwIHBqX3JlbG9jX21hcFtdID0KLXsKLSAgICB7IEJGRF9SRUxPQ19OT05FLCAJCVJfUEpfTk9ORSAgICAgICAgICB9LAotICAgIHsgQkZEX1JFTE9DXzMyLCAJCVJfUEpfREFUQV9ESVIzMiAgICB9LAotICAgIHsgQkZEX1JFTE9DX1BKX0NPREVfRElSMTYsIAlSX1BKX0NPREVfRElSMTYgICAgfSwKLSAgICB7IEJGRF9SRUxPQ19QSl9DT0RFX0RJUjMyLCAJUl9QSl9DT0RFX0RJUjMyICAgIH0sCi0gICAgeyBCRkRfUkVMT0NfUEpfQ09ERV9MTzE2LCAJUl9QSl9DT0RFX0xPMTYgICAgIH0sCi0gICAgeyBCRkRfUkVMT0NfUEpfQ09ERV9ISTE2LCAJUl9QSl9DT0RFX0hJMTYgICAgIH0sCi0gICAgeyBCRkRfUkVMT0NfUEpfQ09ERV9SRUwzMiwgIFJfUEpfQ09ERV9SRUwzMiAgICB9LAotICAgIHsgQkZEX1JFTE9DX1BKX0NPREVfUkVMMTYsICBSX1BKX0NPREVfUkVMMTYgICAgfSwKLSAgICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl9QSl9HTlVfVlRJTkhFUklUIH0sCi0gICAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCAgIFJfUEpfR05VX1ZURU5UUlkgICB9LAotfTsKLQotLyogR2l2ZW4gYSBCRkQgcmVsb2MgY29kZSwgcmV0dXJuIHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIHRoZQotICAgY29ycmVzcG9uZGluZyBQSiBFTGYgcmVsb2MuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1wal9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwal9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocGpfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJnBqX2VsZl9ob3d0b190YWJsZVsoaW50KSBwal9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBHaXZlbiBhbiBFTEYgcmVsb2MsIGZpbGwgaW4gdGhlIGhvd3RvIGZpZWxkIG9mIGEgcmVsZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXBqX2VsZl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHI7Ci0KLSAgciA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotCi0gIEJGRF9BU1NFUlQgKHIgPCAodW5zaWduZWQgaW50KSBSX1BKX21heCk7Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZwal9lbGZfaG93dG9fdGFibGVbcl07Ci19Ci0KLS8qIFRha2UgdGhpcyBtb21lbnQgdG8gZmlsbCBpbiB0aGUgc3BlY2lhbCBwaWNvSmF2YSBiaXRzIGluIHRoZQotICAgZV9mbGFncyBmaWVsZC4gKi8KLQotc3RhdGljIHZvaWQKLXBqX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRl9QSUNPSkFWQV9BUkNIOwotICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1BJQ09KQVZBX0dOVUNBTExTOwotfQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfcGpfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLXBqIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfcGpsX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLXBqbCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX3BqCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fUEoKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJICAgICAgICAgICAgIHBqX2VsZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nICAgICAgICAgICBwal9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJICAgICAgICAgICAgIHBqX2VsZl9pbmZvX3RvX2hvd3RvCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItcHBjLmMgYi9iZmQvZWxmMzItcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZTE5N2IuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc1OCArMCwwIEBACi0vKiBQb3dlclBDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGEgcHJlbGltaW5hcnkgUG93ZXJQQyBFTEYgQUJJLiAgVGhlCi0gICBpbmZvcm1hdGlvbiBtYXkgbm90IG1hdGNoIHRoZSBmaW5hbCBQb3dlclBDIEVMRiBBQkkuICBJdCBpbmNsdWRlcwotICAgc3VnZ2VzdGlvbnMgZnJvbSB0aGUgaW4tcHJvZ3Jlc3MgRW1iZWRkZWQgUG93ZXJQQyBBQkksIGFuZCB0aGF0Ci0gICBpbmZvcm1hdGlvbiBtYXkgYWxzbyBub3QgbWF0Y2guICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0KLSNkZWZpbmUgVVNFX1JFTEEJCS8qIHdlIHdhbnQgUkVMQSByZWxvY2F0aW9ucywgbm90IFJFTCAqLwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFyZWxlbnQgKmNhY2hlX3B0ciwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWxmX2hvd3RvX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotc3RhdGljIGludCBwcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX21vZGlmeV9zZWdtZW50X21hcCBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfc2VjdGlvbl9mcm9tX3NoZHIgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgIEVsZjMyX0ludGVybmFsX1NoZHIgKiwKLQkJCQkJCSAgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2Zha2Vfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKikpOwotCi1zdGF0aWMgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfY2hlY2tfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgICAgYXNlY3Rpb24gKiwKLQkJCQkJICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLXN0YXRpYyBhc2VjdGlvbiAqIHBwY19lbGZfZ2NfbWFya19ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCXN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkJRWxmX0ludGVybmFsX1JlbGEgKnJlbCwKLQkJCQkJCXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAotCQkJCQkJRWxmX0ludGVybmFsX1N5bSAqc3ltKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfZ2Nfc3dlZXBfaG9vayBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCSAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjLAotCQkJCQkgICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkJCQkJCSBiZmQgKiwKLQkJCQkJCSBhc2VjdGlvbiAqLAotCQkJCQkJIGJmZF9ieXRlICosCi0JCQkJCQkgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcywKLQkJCQkJCSBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zLAotCQkJCQkJIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfYWRkX3N5bWJvbF9ob29rICBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkJCQkJCSBjb25zdCBjaGFyICoqLAotCQkJCQkJIGZsYWd3b3JkICosCi0JCQkJCQkgYXNlY3Rpb24gKiosCi0JCQkJCQkgYmZkX3ZtYSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JCQkJCQkgICAgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0jZGVmaW5lIEJSQU5DSF9QUkVESUNUX0JJVCAweDIwMDAwMAkJLyogYnJhbmNoIHByZWRpY3Rpb24gYml0IGZvciBicmFuY2ggdGFrZW4gcmVsb2NzICovCi0jZGVmaW5lIFJBX1JFR0lTVEVSX01BU0sgMHgwMDFmMDAwMAkJLyogbWFzayB0byBzZXQgUkEgaW4gbWVtb3J5IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBSQV9SRUdJU1RFUl9TSElGVCAxNgkJCS8qIHZhbHVlIHRvIHNoaWZ0IHJlZ2lzdGVyIGJ5IHRvIGluc2VydCBSQSAqLwotCi0vKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCi0gICBzZWN0aW9uLiAgKi8KLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGQuc28uMSIKLQotLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTIKLS8qIFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHBsdCByZXNlcnZlZCBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLSNkZWZpbmUgUExUX0lOSVRJQUxfRU5UUllfU0laRSA3MgotLyogVGhlIHNpemUgb2YgdGhlIGdhcCBiZXR3ZWVuIGVudHJpZXMgaW4gdGhlIFBMVC4gICovCi0jZGVmaW5lIFBMVF9TTE9UX1NJWkUgOAotLyogVGhlIG51bWJlciBvZiBzaW5nbGUtc2xvdCBQTFQgZW50cmllcyAodGhlIHJlc3QgdXNlIHR3byBzbG90cykuICAqLwotI2RlZmluZSBQTFRfTlVNX1NJTkdMRV9FTlRSSUVTIDgxOTIKLQotDAotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpUl9QUENfbWF4IF07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHBwY19lbGZfaG93dG9fcmF3W10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX1BQQ19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMjYgYml0IGJyYW5jaDsgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4KLSAgICAgRklYTUU6IHdlIGRvbid0IGNoZWNrIHRoYXQsIHdlIGp1c3QgY2xlYXIgdGhlbS4gICovCi0gIEhPV1RPIChSX1BQQ19BRERSMjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0FERFIyNCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzdGFuZGFyZCAxNiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX1BQQ19BRERSMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0FERFIxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgcmVsb2NhdGlvbiB3aXRob3V0IG92ZXJmbG93LiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNl9MTywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2X0xPIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIGFuIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9QUENfQUREUjE2X0hJLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0FERFIxNl9ISSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggb3JkZXIgMTYgYml0cyBvZiBhbiBhZGRyZXNzLCBwbHVzIDEgaWYgdGhlIGNvbnRlbnRzIG9mCi0gICAgIHRoZSBsb3cgMTYgYml0cywgdHJlYXRlZCBhcyBhIHNpZ25lZCBudW1iZXIsIGlzIG5lZ2F0aXZlLgkqLwotICBIT1dUTyAoUl9QUENfQUREUjE2X0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2X0hBIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBhYnNvbHV0ZSAxNiBiaXQgYnJhbmNoOyB0aGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLgotICAgICBGSVhNRTogd2UgZG9uJ3QgY2hlY2sgdGhhdCwgd2UganVzdCBjbGVhciB0aGVtLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE0IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBhYnNvbHV0ZSAxNiBiaXQgYnJhbmNoLCBmb3Igd2hpY2ggYml0IDEwIHNob3VsZCBiZSBzZXQgdG8KLSAgICAgaW5kaWNhdGUgdGhhdCB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlIHRha2VuLglUaGUgbG93ZXIgdHdvCi0gICAgIGJpdHMgbXVzdCBiZSB6ZXJvLgkgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNF9CUlRBS0VOLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0FERFIxNF9CUlRBS0VOIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE2IGJpdCBicmFuY2gsIGZvciB3aGljaCBiaXQgMTAgc2hvdWxkIGJlIHNldCB0bwotICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBicmFuY2ggaXMgbm90IGV4cGVjdGVkIHRvIGJlIHRha2VuLiAgVGhlIGxvd2VyCi0gICAgIHR3byBiaXRzIG11c3QgYmUgemVyby4gICovCi0gIEhPV1RPIChSX1BQQ19BRERSMTRfQlJOVEFLRU4sIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE0X0JSTlRBS0VOIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMjYgYml0IGJyYW5jaDsgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4JICovCi0gIEhPV1RPIChSX1BQQ19SRUwyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMMjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE2IGJpdCBicmFuY2g7IHRoZSBsb3dlciB0d28gYml0cyBtdXN0IGJlIHplcm8uCSAqLwotICBIT1dUTyAoUl9QUENfUkVMMTQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1JFTDE0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAxNiBiaXQgYnJhbmNoLglCaXQgMTAgc2hvdWxkIGJlIHNldCB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgIHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uICBUaGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZQotICAgICB6ZXJvLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1JFTDE0X0JSVEFLRU4sCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMMTRfQlJUQUtFTiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAxNiBiaXQgYnJhbmNoLglCaXQgMTAgc2hvdWxkIGJlIHNldCB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgIHRoZSBicmFuY2ggaXMgbm90IGV4cGVjdGVkIHRvIGJlIHRha2VuLiAgVGhlIGxvd2VyIHR3byBiaXRzIG11c3QKLSAgICAgYmUgemVyby4gICovCi0gIEhPV1RPIChSX1BQQ19SRUwxNF9CUk5UQUtFTiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwxNF9CUk5UQUtFTiIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNiwgYnV0IHJlZmVycmluZyB0byB0aGUgR09UIHRhYmxlIGVudHJ5IGZvciB0aGUKLSAgICAgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0dPVDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR09UMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9MTywgYnV0IHJlZmVycmluZyB0byB0aGUgR09UIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0dPVDE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR09UMTZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0hJLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBHT1QgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfR09UMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dPVDE2X0hJIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfSEEsIGJ1dCByZWZlcnJpbmcgdG8gdGhlIEdPVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19HT1QxNl9IQSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HT1QxNl9IQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19SRUwyNCwgYnV0IHJlZmVycmluZyB0byB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUKLSAgICAgZW50cnkgZm9yIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfUExUUkVMMjQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVFJFTDI0IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIGlzIHVzZWQgb25seSBieSB0aGUgZHluYW1pYyBsaW5rZXIuICBUaGUgc3ltYm9sIHNob3VsZCBleGlzdAotICAgICBib3RoIGluIHRoZSBvYmplY3QgYmVpbmcgcnVuIGFuZCBpbiBzb21lIHNoYXJlZCBsaWJyYXJ5LiAgVGhlCi0gICAgIGR5bmFtaWMgbGlua2VyIGNvcGllcyB0aGUgZGF0YSBhZGRyZXNzZWQgYnkgdGhlIHN5bWJvbCBmcm9tIHRoZQotICAgICBzaGFyZWQgbGlicmFyeSBpbnRvIHRoZSBvYmplY3QsIGJlY2F1c2UgdGhlIG9iamVjdCBiZWluZwotICAgICBydW4gaGFzIHRvIGhhdmUgdGhlIGRhdGEgYXQgc29tZSBwYXJ0aWN1bGFyIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9QUENfQ09QWSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0NPUFkiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjMyLCBidXQgdXNlZCB3aGVuIHNldHRpbmcgZ2xvYmFsIG9mZnNldCB0YWJsZQotICAgICBlbnRyaWVzLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0dMT0JfREFULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCSAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HTE9CX0RBVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIE1hcmtzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkgZm9yIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0pNUF9TTE9ULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCSAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19KTVBfU0xPVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIG9ubHkgYnkgdGhlIGR5bmFtaWMgbGlua2VyLiAgV2hlbiB0aGUgb2JqZWN0IGlzIHJ1biwgdGhpcwotICAgICBsb25nd29yZCBpcyBzZXQgdG8gdGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgb2JqZWN0LCBwbHVzIHRoZQotICAgICBhZGRlbmQuICAqLwotICBIT1dUTyAoUl9QUENfUkVMQVRJVkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1JFTEFUSVZFIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19SRUwyNCwgYnV0IHVzZXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgd2l0aGluIHRoZQotICAgICBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIGZpbmFsIHZhbHVlLiAgTm9ybWFsbHkgdXNlZCBmb3IKLSAgICAgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0xPQ0FMMjRQQywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19MT0NBTDI0UEMiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjMyLCBidXQgbWF5IGJlIHVuYWxpZ25lZC4gICovCi0gIEhPV1RPIChSX1BQQ19VQUREUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19VQUREUjMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTYsIGJ1dCBtYXkgYmUgdW5hbGlnbmVkLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1VBRERSMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1VBRERSMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyLWJpdCBQQyByZWxhdGl2ZSAqLwotICBIT1dUTyAoUl9QUENfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IHJlbG9jYXRpb24gdG8gdGhlIHN5bWJvbCdzIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLgotICAgICBGSVhNRTogbm90IHN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKFJfUFBDX1BMVDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFQzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gdG8gdGhlIHN5bWJvbCdzIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLgotICAgICBGSVhNRTogbm90IHN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKFJfUFBDX1BMVFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfTE8sIGJ1dCByZWZlcnJpbmcgdG8gdGhlIFBMVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19QTFQxNl9MTywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVDE2X0xPIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9ISSwgYnV0IHJlZmVycmluZyB0byB0aGUgUExUIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1BMVDE2X0hJLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFQxNl9ISSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0hBLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBQTFQgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfUExUMTZfSEEsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUMTZfSEEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgc2lnbi1leHRlbmRlZCAxNiBiaXQgdmFsdWUgcmVsYXRpdmUgdG8gX1NEQV9CQVNFXywgZm9yIHVzZSB3aXRoCi0gICAgIHNtYWxsIGRhdGEgaXRlbXMuICAqLwotICBIT1dUTyAoUl9QUENfU0RBUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NEQVJFTDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICBIT1dUTyAoUl9QUENfU0VDVE9GRiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19TRUNUT0ZGIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2LWJpdCBsb3dlciBoYWxmIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSAgSE9XVE8gKFJfUFBDX1NFQ1RPRkZfTE8sCSAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NFQ1RPRkZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2LWJpdCB1cHBlciBoYWxmIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSAgSE9XVE8gKFJfUFBDX1NFQ1RPRkZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NFQ1RPRkZfSEkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCSAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNi1iaXQgdXBwZXIgaGFsZiBhZGp1c3RlZCBzZWN0aW9uIHJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0gIEhPV1RPIChSX1BQQ19TRUNUT0ZGX0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NFQ1RPRkZfSEEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBmcm9tIHRoZSBFbWJlZGRlZCBFTEYgQUJJLCBhbmQgYXJlIG5vdAotICAgICBpbiB0aGUgU1ZSNCBFTEYgQUJJLiAgKi8KLQotICAvKiAzMiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gdGhlIGFkZGVuZCBtaW51cyB0aGUgc3ltYm9sICovCi0gIEhPV1RPIChSX1BQQ19FTUJfTkFERFIzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfTkFERFIzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9OQUREUjE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gdGhlIGFkZGVuZCBtaW51cyB0aGUgc3ltYm9sICovCi0gIEhPV1RPIChSX1BQQ19FTUJfTkFERFIxNl9MTywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX0FERFIxNl9MTyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggb3JkZXIgMTYgYml0cyBvZiB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2X0hJLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9OQUREUjE2X0hJIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIHRoZSByZXN1bHQgb2YgdGhlIGFkZGVuZCBtaW51cyB0aGUgYWRkcmVzcywKLSAgICAgcGx1cyAxIGlmIHRoZSBjb250ZW50cyBvZiB0aGUgbG93IDE2IGJpdHMsIHRyZWF0ZWQgYXMgYSBzaWduZWQgbnVtYmVyLAotICAgICBpcyBuZWdhdGl2ZS4gICovCi0gIEhPV1RPIChSX1BQQ19FTUJfTkFERFIxNl9IQSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9OQUREUjE2X0hBIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gYWxsb2NhdGluZyBhIDQgYnl0ZSB3b3JkIHRvIGhvbGQgYW4KLSAgICAgYWRkcmVzcyBpbiB0aGUgLnNkYXRhIHNlY3Rpb24sIGFuZCByZXR1cm5pbmcgdGhlIG9mZnNldCBmcm9tCi0gICAgIF9TREFfQkFTRV8gZm9yIHRoYXQgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9QUENfRU1CX1NEQUkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfU0RBSTE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gYWxsb2NhdGluZyBhIDQgYnl0ZSB3b3JkIHRvIGhvbGQgYW4KLSAgICAgYWRkcmVzcyBpbiB0aGUgLnNkYXRhMiBzZWN0aW9uLCBhbmQgcmV0dXJuaW5nIHRoZSBvZmZzZXQgZnJvbQotICAgICBfU0RBMl9CQVNFXyBmb3IgdGhhdCByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBMkkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfU0RBMkkxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzaWduLWV4dGVuZGVkIDE2IGJpdCB2YWx1ZSByZWxhdGl2ZSB0byBfU0RBMl9CQVNFXywgZm9yIHVzZSB3aXRoCi0gICAgIHNtYWxsIGRhdGEgaXRlbXMuCSAqLwotICBIT1dUTyAoUl9QUENfRU1CX1NEQTJSRUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREEyUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWxvY2F0ZSBhZ2FpbnN0IGVpdGhlciBfU0RBX0JBU0VfIG9yIF9TREEyX0JBU0VfLCBmaWxsaW5nIGluIHRoZSAxNiBiaXQKLSAgICAgc2lnbmVkIG9mZnNldCBmcm9tIHRoZSBhcHByb3ByaWF0ZSBiYXNlLCBhbmQgZmlsbGluZyBpbiB0aGUgcmVnaXN0ZXIKLSAgICAgZmllbGQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIgKDAsIDIsIG9yIDEzKS4gICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBMjEsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREEyMSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX01SS1JFRiAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfUkVMU0VDMTYgKi8KLSAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX1JFTFNUX0xPICovCi0gIC8qIFJlbG9jYXRpb24gbm90IGhhbmRsZWQ6IFJfUFBDX0VNQl9SRUxTVF9ISSAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfUkVMU1RfSEEgKi8KLSAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX0JJVF9GTEQgKi8KLQotICAvKiBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGFnYWluc3QgZWl0aGVyIF9TREFfQkFTRV8gb3IgX1NEQTJfQkFTRV8sIGZpbGxpbmcKLSAgICAgaW4gdGhlIDE2IGJpdCBzaWduZWQgb2Zmc2V0IGZyb20gdGhlIGFwcHJvcHJpYXRlIGJhc2UsIGFuZCBmaWxsaW5nIGluIHRoZQotICAgICByZWdpc3RlciBmaWVsZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciAoMCwgMiwgb3IgMTMpLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9SRUxTREEsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX1JFTFNEQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfUFBDX0dOVV9WVElOSEVSSVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dOVV9WVElOSEVSSVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfUFBDX0dOVV9WVEVOVFJZLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HTlVfVlRFTlRSWSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBQaG9ueSByZWxvYyB0byBoYW5kbGUgQUlYIHN0eWxlIFRPQyBlbnRyaWVzICovCi0gIEhPV1RPIChSX1BQQ19UT0MxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1RPQzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0MCi0vKiBJbml0aWFsaXplIHRoZSBwcGNfZWxmX2hvd3RvX3RhYmxlLCBzbyB0aGF0IGxpbmVhciBhY2Nlc3NlcyBjYW4gYmUgZG9uZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX2hvd3RvX2luaXQgKCkKLXsKLSAgdW5zaWduZWQgaW50IGksIHR5cGU7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAocHBjX2VsZl9ob3d0b19yYXcpIC8gc2l6ZW9mIChwcGNfZWxmX2hvd3RvX3Jhd1swXSk7IGkrKykKLSAgICB7Ci0gICAgICB0eXBlID0gcHBjX2VsZl9ob3d0b19yYXdbaV0udHlwZTsKLSAgICAgIEJGRF9BU1NFUlQgKHR5cGUgPCBzaXplb2YocHBjX2VsZl9ob3d0b190YWJsZSkgLyBzaXplb2YocHBjX2VsZl9ob3d0b190YWJsZVswXSkpOwotICAgICAgcHBjX2VsZl9ob3d0b190YWJsZVt0eXBlXSA9ICZwcGNfZWxmX2hvd3RvX3Jhd1tpXTsKLSAgICB9Ci19Ci0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBmb3IgdGhlIFBQQyB3aXRoIG9wdGlvbiAtLW1wYzg2MGMwWz08bj5dLgotCi0gICBUaGUgTVBDODYwLCByZXZpc2lvbiBDMCBvciBlYXJsaWVyIGNvbnRhaW5zIGEgYnVnIGluIHRoZSBkaWUuCi0gICBJZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVlLCB0aGUgbmV4dCBpbnN0cnVjdGlvbgotICAgdG8gYmUgZXhlY3V0ZWQgKm1heSogYmUgdHJlYXRlZCBhcyBhIG5vLW9wLgotICAgMS8gQSBmb3J3YXJkIGJyYW5jaCBpcyBleGVjdXRlZC4KLSAgIDIvIFRoZSBicmFuY2ggaXMgcHJlZGljdGVkIGFzIG5vdCB0YWtlbi4KLSAgIDMvIFRoZSBicmFuY2ggaXMgdGFrZW4uCi0gICA0LyBUaGUgYnJhbmNoIGlzIGxvY2F0ZWQgaW4gdGhlIGxhc3QgNSB3b3JkcyBvZiBhIHBhZ2UuCi0gICAgICAoVGhlIEVPUCBsaW1pdCBpcyA1IGJ5IGRlZmF1bHQgYnV0IG1heSBiZSBzcGVjaWZpZWQgYXMgYW55IHZhbHVlIGZyb20gMS0xMC4pCi0gICAKLSAgIE91ciBzb2Z0d2FyZSBzb2x1dGlvbiBpcyB0byBkZXRlY3QgdGhlc2UgcHJvYmxlbWF0aWMgYnJhbmNoZXMgaW4gYQotICAgbGlua2VyIHBhc3MgYW5kIG1vZGlmeSB0aGVtIGFzIGZvbGxvd3M6Ci0gICAxLyBVbmNvbmRpdGlvbmFsIGJyYW5jaGVzIC0gU2luY2UgdGhlc2UgYXJlIGFsd2F5cyBwcmVkaWN0ZWQgdGFrZW4sCi0gICAgICB0aGVyZSBpcyBubyBwcm9ibGVtIGFuZCBubyBhY3Rpb24gaXMgcmVxdWlyZWQuCi0gICAyLyBDb25kaXRpb25hbCBiYWNrd2FyZCBicmFuY2hlcyAtIE5vIHByb2JsZW0sIG5vIGFjdGlvbiByZXF1aXJlZC4KLSAgIDMvIENvbmRpdGlvbmFsIGZvcndhcmQgYnJhbmNoZXMgLSBFbnN1cmUgdGhhdCB0aGUgImludmVyc2UgcHJlZGljdGlvbgotICAgICAgYml0IiBpcyBzZXQgKGVuc3VyZSBpdCBpcyBwcmVkaWN0ZWQgdGFrZW4pLgotICAgNC8gQ29uZGl0aW9uYWwgcmVnaXN0ZXIgYnJhbmNoZXMgLSBFbnN1cmUgdGhhdCB0aGUgInkgYml0IiBpcyBzZXQKLSAgICAgIChlbnN1cmUgaXQgaXMgcHJlZGljdGVkIHRha2VuKS4KLSovCi0KLS8qIFNvcnQgc2VjdGlvbnMgYnkgYWRkcmVzcy4gICovCi0KLXN0YXRpYyBpbnQKLXBwY19lbGZfc29ydF9yZWxhIChhcmcxLCBhcmcyKQotICAgIGNvbnN0IHZvaWQgKmFyZzE7Ci0gICAgY29uc3Qgdm9pZCAqYXJnMjsKLXsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKipyZWxhMSA9IChjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSoqKSBhcmcxOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKnJlbGEyID0gKGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhKiopIGFyZzI7Ci0KLSAgLyogU29ydCBieSBvZmZzZXQuICovCi0gIHJldHVybiAoKCpyZWxhMSktPnJfb2Zmc2V0IC0gKCpyZWxhMiktPnJfb2Zmc2V0KTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgaXNlYywgbGlua19pbmZvLCBhZ2FpbikKLSAgICBiZmQgKmFiZmQ7Ci0gICAgYXNlY3Rpb24gKmlzZWM7Ci0gICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICBib29sZWFuICphZ2FpbjsKLXsKLSNkZWZpbmUgUEFHRVNJWkUgMHgxMDAwCi0KLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKipyZWxhX2NvbWIgPSBOVUxMOwotICBpbnQgY29tYl9jdXJyLCBjb21iX2NvdW50OwotCi0gIC8qIFdlIG5ldmVyIGhhdmUgdG8gZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBwZXIgaW5wdXQgc2VjdGlvbi4gKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgLyogSWYgbmVlZGVkLCBpbml0aWFsaXplIHRoaXMgc2VjdGlvbidzIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKGlzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgICAgaXNlYy0+X2Nvb2tlZF9zaXplID0gaXNlYy0+X3Jhd19zaXplOwotCi0gIC8qIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiB0ZXh0IHNlY3Rpb25zIHdoaWNoIG92ZXJsYXAgdGhlCi0gIHRyb3VibGVzb21lIGFyZWEgYXQgdGhlIGVuZCBvZiBhIHBhZ2UuICovCi0gIGlmIChsaW5rX2luZm8tPm1wYzg2MGMwICYmIChpc2VjLT5mbGFncyAmIFNFQ19DT0RFKSAmJiBpc2VjLT5fY29va2VkX3NpemUpCi0gICAgewotICAgICAgYmZkX3ZtYSBkb3QsIGVuZF9wYWdlLCBlbmRfc2VjdGlvbjsKLSAgICAgIGJvb2xlYW4gc2VjdGlvbl9tb2RpZmllZDsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAqLwotICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkci5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChpc2VjLT5fcmF3X3NpemUpOwotCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaXNlYywgY29udGVudHMsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBpc2VjLT5fcmF3X3NpemUpKQotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgY29tYl9jdXJyID0gMDsKLSAgICAgIGNvbWJfY291bnQgPSAwOwotICAgICAgaWYgKGlzZWMtPnJlbG9jX2NvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgbjsKLQotICAgICAgICAgIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gICAgICAgICAgaW50ZXJuYWxfcmVsb2NzID0gX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzICgKLSAgICAJICAgIGFiZmQsIGlzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCAKLSAgICAJICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpOwotICAgICAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICAJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICAJICAgICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgCi0gICAgICAgICAgLyogU2V0dXAgYSBmYXN0ZXIgYWNjZXNzIG1ldGhvZCBmb3IgdGhlIHJlbG9jIGluZm8gd2UgbmVlZC4gKi8KLSAgICAgICAgICByZWxhX2NvbWIgPSAoRWxmX0ludGVybmFsX1JlbGEqKikKLQkgICAgYmZkX21hbGxvYyAoaXNlYy0+cmVsb2NfY291bnQqc2l6ZW9mKEVsZl9JbnRlcm5hbF9SZWxhKikpOwotICAgICAgICAgIGlmIChyZWxhX2NvbWIgPT0gTlVMTCkKLSAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAgICAgZm9yIChuPTA7IG48aXNlYy0+cmVsb2NfY291bnQ7ICsrbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbG9uZyByX3R5cGU7Ci0gICAgCi0gICAgICAgICAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaW50ZXJuYWxfcmVsb2NzW25dLnJfaW5mbyk7Ci0gICAgICAgICAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KVJfUFBDX21heCkKLSAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIAotICAgICAgICAgICAgICAvKiBQcm9sb2d1ZSBjb25zdGFudHMgYXJlIHNvbWV0aW1lcyBwcmVzZW50IGluIHRoZSAiLnRleHQiCi0gICAgICAgICAgICAgIHNlY3Rpb25zIGFuZCB0aGV5IGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZWlyIGFzc29jaWF0ZWQgcmVsb2NhdGlvbi4KLSAgICAgICAgICAgICAgV2UgZG9uJ3Qgd2FudCB0byBwcm9jZXNzIHRob3NlIHdvcmRzIGFuZCBzb21lIG90aGVycyB3aGljaAotICAgICAgICAgICAgICBjYW4gYWxzbyBiZSBpZGVudGlmaWVkIGJ5IHRoZWlyIHJlbG9jYXRpb25zLiAgSG93ZXZlciwgbm90IGFsbAotICAgICAgICAgICAgICBjb25kaXRpb25hbCBicmFuY2hlcyB3aWxsIGhhdmUgYSByZWxvY2F0aW9uIHNvIHdlIHdpbGwKLSAgICAgICAgICAgICAgb25seSBpZ25vcmUgd29yZHMgdGhhdCAxKSBoYXZlIGEgcmVsb2MsIGFuZCAyKSB0aGUgcmVsb2MKLSAgICAgICAgICAgICAgaXMgbm90IGFwcGxpY2FibGUgdG8gYSBjb25kaXRpb25hbCBicmFuY2guCi0gICAgICAgICAgICAgIFRoZSBhcnJheSByZWxhX2NvbWIgaXMgYnVpbHQgaGVyZSBmb3IgdXNlIGluIHRoZSBFT1Agc2NhbiBsb29wLiAqLwotICAgICAgICAgICAgICBzd2l0Y2ggKHJfdHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBSX1BQQ19BRERSMTRfQlJOVEFLRU46ICAgICAvKiBhYnNvbHV0ZSwgcHJlZGljdGVkIG5vdCB0YWtlbiAqLwotICAgICAgICAgICAgICAgIGNhc2UgUl9QUENfUkVMMTQ6ICAgICAgICAgICAgICAgLyogcmVsYXRpdmUgY29uZC4gYnIuICovCi0gICAgICAgICAgICAgICAgY2FzZSBSX1BQQ19SRUwxNF9CUk5UQUtFTjogICAgICAvKiByZWwuIGNvbmQuIGJyLiwgcHJlZGljdGVkIG5vdCB0YWtlbiAqLwotICAgICAgICAgICAgICAgICAgLyogV2Ugc2hvdWxkIGNoZWNrIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAvKiBUaGUgd29yZCBpcyBub3QgYSBjb25kaXRpb25hbCBicmFuY2ggLSBpZ25vcmUgaXQuICovCi0gICAgICAgICAgICAgICAgICByZWxhX2NvbWJbY29tYl9jb3VudCsrXSA9ICZpbnRlcm5hbF9yZWxvY3Nbbl07Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGNvbWJfY291bnQgPiAxKQotICAgICAgICAgICAgICBxc29ydCAocmVsYV9jb21iLCAoc2l6ZV90KSBjb21iX2NvdW50LCBzaXplb2YgKGludCksIHBwY19lbGZfc29ydF9yZWxhKTsKLSAgICAgICAgfQotCi0gICAgICAvKiBFbnVtZXJhdGUgZWFjaCBFT1AgcmVnaW9uIHRoYXQgb3ZlcmxhcHMgdGhpcyBzZWN0aW9uLiAqLwotICAgICAgZW5kX3NlY3Rpb24gPSBpc2VjLT52bWEgKyBpc2VjLT5fY29va2VkX3NpemU7Ci0gICAgICBkb3QgPSBlbmRfcGFnZSA9IChpc2VjLT52bWEgfCAoUEFHRVNJWkUgLSAxKSkgKyAxOwotICAgICAgZG90IC09IGxpbmtfaW5mby0+bXBjODYwYzA7Ci0gICAgICBzZWN0aW9uX21vZGlmaWVkID0gZmFsc2U7Ci0gICAgICBpZiAoZG90IDwgaXNlYy0+dm1hKSAgICAgIC8qIEluY3JlbWVudCB0aGUgc3RhcnQgcG9zaXRpb24gaWYgdGhpcyBzZWN0aW9uICovCi0gICAgICAgICAgZG90ID0gaXNlYy0+dm1hOyAgICAgIC8qIGJlZ2lucyBpbiB0aGUgbWlkZGxlIG9mIGl0cyBmaXJzdCBFT1AgcmVnaW9uLiAqLwotICAgICAgZm9yICg7Ci0gICAgICAgICAgIGRvdCA8IGVuZF9zZWN0aW9uOwotICAgICAgICAgICBkb3QgKz0gUEFHRVNJWkUsIGVuZF9wYWdlICs9IFBBR0VTSVpFKQotICAgICAgICB7Ci0KLSAgICAgICAgICAvKiBDaGVjayBlYWNoIHdvcmQgaW4gdGhpcyBFT1AgcmVnaW9uLiAqLwotICAgICAgICAgIGZvciAoOyBkb3QgPCBlbmRfcGFnZTsgZG90ICs9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJmZF92bWEgaXNlY19vZmZzZXQ7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgICAgICAgICAgYm9vbGVhbiBza2lwLCBtb2RpZmllZDsKLQotICAgICAgICAgICAgICAvKiBEb24ndCBwcm9jZXNzIHRoaXMgd29yZCBpZiB0aGVyZSBpcyBhIHJlbG9jYXRpb24gZm9yIGl0IGFuZAotICAgICAgICAgICAgICB0aGUgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgdGhlIHdvcmQgaXMgbm90IGEgY29uZGl0aW9uYWwgYnJhbmNoLiAqLwotICAgICAgICAgICAgICBza2lwID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGlzZWNfb2Zmc2V0ID0gZG90IC0gaXNlYy0+dm1hOwotICAgICAgICAgICAgICBmb3IgKDsgY29tYl9jdXJyPGNvbWJfY291bnQ7ICsrY29tYl9jdXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJmZF92bWEgcl9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgIHJfb2Zmc2V0ID0gcmVsYV9jb21iW2NvbWJfY3Vycl0tPnJfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgaWYgKHJfb2Zmc2V0ID49IGlzZWNfb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKHJfb2Zmc2V0ID09IGlzZWNfb2Zmc2V0KSBza2lwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKHNraXApIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgIC8qIENoZWNrIHRoZSBjdXJyZW50IHdvcmQgZm9yIGEgcHJvYmxlbWF0aWMgY29uZGl0aW9uYWwgYnJhbmNoLiAqLwotI2RlZmluZSBCTzAoaW5zbikgKChpbnNuKSAmIDB4MDIwMDAwMDApCi0jZGVmaW5lIEJPMihpbnNuKSAoKGluc24pICYgMHgwMDgwMDAwMCkKLSNkZWZpbmUgQk80KGluc24pICgoaW5zbikgJiAweDAwMjAwMDAwKQotICAgICAgICAgICAgICBpbnNuID0gKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgaXNlY19vZmZzZXQpOwotICAgICAgICAgICAgICBtb2RpZmllZCA9IGZhbHNlOwotICAgICAgICAgICAgICBpZiAoKGluc24gJiAweEZjMDAwMDAwKSA9PSAweDQwMDAwMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIEluc3RydWN0aW9uIGlzIEJDeCAqLwotICAgICAgICAgICAgICAgICAgaWYgKCghQk8wKGluc24pIHx8ICFCTzIoaW5zbikpICYmICFCTzQoaW5zbikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBiZmRfdm1hIHRhcmdldDsKLSAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgIm5vcm1hbCIuCi0gICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBhIGZvcndhcmQgYnJhbmNoLCBpdCBpcyBwcm9ibGVtYXRpYy4gKi8KLQotICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGluc24gJiAweDAwMDBGZmZjOyAgICAgICAgICAgICAgIC8qZXh0cmFjdCovCi0gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKHRhcmdldCBeIDB4ODAwMCkgLSAweDgwMDA7ICAgICAgLypzaWduIGV4dGVuZCovCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnNuICYgMHgwMDAwMDAwMikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ICs9IGRvdDsgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbnZlcnQgdG8gYWJzKi8KLSAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID4gZG90KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNuIHw9IDB4MDAyMDAwMDA7ICAgLyogc2V0IHRoZSBwcmVkaWN0aW9uIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKChpbnNuICYgMHhGYzAwRmZmZSkgPT0gMHg0YzAwMDQyMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvKiBJbnN0cnVjdGlvbiBpcyBCQ0NUUnggKi8KLSAgICAgICAgICAgICAgICAgIGlmICgoIUJPMChpbnNuKSB8fCAhQk8yKGluc24pKSAmJiAhQk80KGluc24pKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgbm90LXRha2VuLgotCQkgICAgICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2gsIGl0IGlzIHByb2JsZW1hdGljLgotICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHdlIGNhbid0IHRlbGwgc3RhdGljYWxseSBpZiBpdCB3aWxsIGJyYW5jaCBmb3J3YXJkLAotICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBzZXQgdGhlIHByZWRpY3Rpb24gYml0LiAqLwotICAgICAgICAgICAgICAgICAgICAgIGluc24gfD0gMHgwMDIwMDAwMDsgICAvKiBzZXQgdGhlIHByZWRpY3Rpb24gYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotCQkgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAoKGluc24gJiAweEZjMDBGZmZlKSA9PSAweDRjMDAwMDIwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIEluc3RydWN0aW9uIGlzIEJDTFJ4ICovCi0gICAgICAgICAgICAgICAgICBpZiAoKCFCTzAoaW5zbikgfHwgIUJPMihpbnNuKSkgJiYgIUJPNChpbnNuKSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBicmFuY2ggaXMgcHJlZGljdGVkIGFzIG5vdC10YWtlbi4KLQkJICAgICAgSWYgdGhpcyBpcyBhIGZvcndhcmQgYnJhbmNoLCBpdCBpcyBwcm9ibGVtYXRpYy4KLSAgICAgICAgICAgICAgICAgICAgICBTaW5jZSB3ZSBjYW4ndCB0ZWxsIHN0YXRpY2FsbHkgaWYgaXQgd2lsbCBicmFuY2ggZm9yd2FyZCwKLSAgICAgICAgICAgICAgICAgICAgICBhbHdheXMgc2V0IHRoZSBwcmVkaWN0aW9uIGJpdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICBpbnNuIHw9IDB4MDAyMDAwMDA7ICAgLyogc2V0IHRoZSBwcmVkaWN0aW9uIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jdW5kZWYgQk8wCi0jdW5kZWYgQk8yCi0jdW5kZWYgQk80Ci0gICAgICAgICAgICAgIGlmIChtb2RpZmllZCkKLQkgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgaXNlY19vZmZzZXQpOwotCQkgIHNlY3Rpb25fbW9kaWZpZWQgPSB0cnVlOwotCSAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBpZiAoc2VjdGlvbl9tb2RpZmllZCkKLQl7Ci0JICBlbGZfc2VjdGlvbl9kYXRhIChpc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgaWYgKHJlbGFfY29tYiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbGFfY29tYik7Ci0gICAgICByZWxhX2NvbWIgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotZXJyb3JfcmV0dXJuOgotICBpZiAocmVsYV9jb21iICE9IE5VTEwpCi0gICAgZnJlZSAocmVsYV9jb21iKTsKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQwKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgZW51bSBlbGZfcHBjX3JlbG9jX3R5cGUgcHBjX3JlbG9jID0gUl9QUENfTk9ORTsKLQotICBpZiAoIXBwY19lbGZfaG93dG9fdGFibGVbUl9QUENfQUREUjMyXSkKLSAgICAvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIHBwY19lbGZfaG93dG9faW5pdCAoKTsKLQotICBzd2l0Y2ggKChpbnQpY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKU5VTEw7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgkJcHBjX3JlbG9jID0gUl9QUENfTk9ORTsJCQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMzI7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkEyNjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIyNDsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgkJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTZfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2X0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2X0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTQ7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTRfQlJUQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU46CXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNF9CUk5UQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IyNjoJCXBwY19yZWxvYyA9IFJfUFBDX1JFTDI0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IxNjoJCXBwY19yZWxvYyA9IFJfUFBDX1JFTDE0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19SRUwxNF9CUlRBS0VOOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19SRUwxNF9CUk5UQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfR09UMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2X0dPVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2X0xPOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9HT1RPRkY6CQlwcGNfcmVsb2MgPSBSX1BQQ19HT1QxNl9ISTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkY6CXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2X0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjRfUExUX1BDUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19QTFRSRUwyNDsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19DT1BZOgkJcHBjX3JlbG9jID0gUl9QUENfQ09QWTsJCQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfR0xPQl9EQVQ6CXBwY19yZWxvYyA9IFJfUFBDX0dMT0JfREFUOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQzoJcHBjX3JlbG9jID0gUl9QUENfTE9DQUwyNFBDOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CQlwcGNfcmVsb2MgPSBSX1BQQ19SRUwzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX1BMVDMyOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUX1BDUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19QTFRSRUwzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTZfUExUT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfUExUMTZfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1BMVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX1BMVDE2X0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRjoJcHBjX3JlbG9jID0gUl9QUENfUExUMTZfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDE2OgkJcHBjX3JlbG9jID0gUl9QUENfU0RBUkVMMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9CQVNFUkVMOgkJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTDoJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRl9MTzsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTDoJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRl9ISTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19TRUNUT0ZGX0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoJCXBwY19yZWxvYyA9IFJfUFBDX1RPQzE2OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfTkFERFIzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX05BRERSMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE86CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0xPOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEk6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0hJOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0hBOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQUkxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQTJJMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUw6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9TREEyUkVMOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMToJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQTIxOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUY6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9NUktSRUY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2OglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU0VDMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfSEk7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQ6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9CSVRfRkxEOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9SRUxTREE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoJcHBjX3JlbG9jID0gUl9QUENfR05VX1ZUSU5IRVJJVDsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOglwcGNfcmVsb2MgPSBSX1BQQ19HTlVfVlRFTlRSWTsJCWJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClwcGNfcmVsb2MgXTsKLX07Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYSBQb3dlclBDIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIGlmICghcHBjX2VsZl9ob3d0b190YWJsZVsgUl9QUENfQUREUjMyIF0pCS8qIEluaXRpYWxpemUgaG93dG8gdGFibGUgaWYgbmVlZGVkICovCi0gICAgcHBjX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9QUENfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9IHBwY19lbGZfaG93dG9fdGFibGVbRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyldOwotfQotCi0vKiBIYW5kbGUgdGhlIFJfUFBDX0FERFIxNl9IQSByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19lbGZfYWRkcjE2X2hhX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgcmVsb2NfZW50cnktPmFkZGVuZCArPSAocmVsb2NhdGlvbiAmIDB4ODAwMCkgPDwgMTsKLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKiBGdW5jdGlvbiB0byBzZXQgd2hldGhlciBhIG1vZHVsZSBuZWVkcyB0aGUgLW1yZWxvY2F0YWJsZSBiaXQgc2V0LiAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZyAqLwotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG9sZF9mbGFnczsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzOwotICBib29sZWFuIGVycm9yOwotCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmIChpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0gICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm1zZzsKLQotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChpYmZkKSkKLQltc2cgPSBfKCIlczogY29tcGlsZWQgZm9yIGEgYmlnIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyBsaXR0bGUgZW5kaWFuIik7Ci0gICAgICBlbHNlCi0JbXNnID0gXygiJXM6IGNvbXBpbGVkIGZvciBhIGxpdHRsZSBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgYmlnIGVuZGlhbiIpOwotCi0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKG1zZywgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIG5ld19mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvbGRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLSAgaWYgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCS8qIEZpcnN0IGNhbGwsIG5vIGZsYWdzIHNldCAqLwotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IG5ld19mbGFnczsKLSAgICB9Ci0KLSAgZWxzZSBpZiAobmV3X2ZsYWdzID09IG9sZF9mbGFncykJLyogQ29tcGF0aWJsZSBmbGFncyBhcmUgb2sgKi8KLSAgICA7Ci0KLSAgZWxzZQkJCQkJLyogSW5jb21wYXRpYmxlIGZsYWdzICovCi0gICAgewotICAgICAgLyogV2FybiBhYm91dCAtbXJlbG9jYXRhYmxlIG1pc21hdGNoLiAgQWxsb3cgLW1yZWxvY2F0YWJsZS1saWIgdG8gYmUgbGlua2VkCi0gICAgICAgICB3aXRoIGVpdGhlci4gICovCi0gICAgICBlcnJvciA9IGZhbHNlOwotICAgICAgaWYgKChuZXdfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEUpICE9IDAKLQkgICYmIChvbGRfZmxhZ3MgJiAoRUZfUFBDX1JFTE9DQVRBQkxFIHwgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQikpID09IDApCi0JewotCSAgZXJyb3IgPSB0cnVlOwotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogY29tcGlsZWQgd2l0aCAtbXJlbG9jYXRhYmxlIGFuZCBsaW5rZWQgd2l0aCBtb2R1bGVzIGNvbXBpbGVkIG5vcm1hbGx5IiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0JfQotICAgICAgZWxzZSBpZiAoKG5ld19mbGFncyAmIChFRl9QUENfUkVMT0NBVEFCTEUgfCBFRl9QUENfUkVMT0NBVEFCTEVfTElCKSkgPT0gMAotCSAgICAgICAmJiAob2xkX2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFKSAhPSAwKQotCXsKLQkgIGVycm9yID0gdHJ1ZTsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGNvbXBpbGVkIG5vcm1hbGx5IGFuZCBsaW5rZWQgd2l0aCBtb2R1bGVzIGNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCX0KLQotICAgICAgLyogVGhlIG91dHB1dCBpcyAtbXJlbG9jYXRhYmxlLWxpYiBpZmYgYm90aCB0aGUgaW5wdXQgZmlsZXMgYXJlLiAgKi8KLSAgICAgIGlmICghIChuZXdfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEVfTElCKSkKLQllbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyAmPSB+RUZfUFBDX1JFTE9DQVRBQkxFX0xJQjsKLQotICAgICAgLyogVGhlIG91dHB1dCBpcyAtbXJlbG9jYXRhYmxlIGlmZiBpdCBjYW4ndCBiZSAtbXJlbG9jYXRhYmxlLWxpYiwKLSAgICAgICAgIGJ1dCBlYWNoIGlucHV0IGZpbGUgaXMgZWl0aGVyIC1tcmVsb2NhdGFibGUgb3IgLW1yZWxvY2F0YWJsZS1saWIuICAqLwotICAgICAgaWYgKCEgKGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQikKLQkgICYmIChuZXdfZmxhZ3MgJiAoRUZfUFBDX1JFTE9DQVRBQkxFX0xJQiB8IEVGX1BQQ19SRUxPQ0FUQUJMRSkpCi0JICAmJiAob2xkX2ZsYWdzICYgKEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgfCBFRl9QUENfUkVMT0NBVEFCTEUpKSkKLQllbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyB8PSBFRl9QUENfUkVMT0NBVEFCTEU7Ci0KLSAgICAgIC8qIERvIG5vdCB3YXJuIGFib3V0IGVhYmkgdnMuIFYuNCBtaXNtYXRjaCwganVzdCBvciBpbiB0aGUgYml0IGlmIGFueSBtb2R1bGUgdXNlcyBpdCAqLwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgfD0gKG5ld19mbGFncyAmIEVGX1BQQ19FTUIpOwotCi0gICAgICBuZXdfZmxhZ3MgJj0gfiAoRUZfUFBDX1JFTE9DQVRBQkxFIHwgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQiB8IEVGX1BQQ19FTUIpOwotICAgICAgb2xkX2ZsYWdzICY9IH4gKEVGX1BQQ19SRUxPQ0FUQUJMRSB8IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgfCBFRl9QUENfRU1CKTsKLQotICAgICAgLyogV2FybiBhYm91dCBhbnkgb3RoZXIgbWlzbWF0Y2hlcyAqLwotICAgICAgaWYgKG5ld19mbGFncyAhPSBvbGRfZmxhZ3MpCi0JewotCSAgZXJyb3IgPSB0cnVlOwotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdXNlcyBkaWZmZXJlbnQgZV9mbGFncyAoMHglbHgpIGZpZWxkcyB0aGFuIHByZXZpb3VzIG1vZHVsZXMgKDB4JWx4KSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksIChsb25nKW5ld19mbGFncywgKGxvbmcpb2xkX2ZsYWdzKTsKLQl9Ci0KLSAgICAgIGlmIChlcnJvcikKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBIYW5kbGUgYSBQb3dlclBDIHNwZWNpZmljIHNlY3Rpb24gd2hlbiByZWFkaW5nIGFuIG9iamVjdCBmaWxlLiAgVGhpcwotICAgaXMgY2FsbGVkIHdoZW4gZWxmY29kZS5oIGZpbmRzIGEgc2VjdGlvbiB3aXRoIGFuIHVua25vd24gdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmV3c2VjdCA9IGhkci0+YmZkX3NlY3Rpb247Ci0gIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBuZXdzZWN0KTsKLSAgaWYgKGhkci0+c2hfZmxhZ3MgJiBTSEZfRVhDTFVERSkKLSAgICBmbGFncyB8PSBTRUNfRVhDTFVERTsKLQotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9PUkRFUkVEKQotICAgIGZsYWdzIHw9IFNFQ19TT1JUX0VOVFJJRVM7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBuZXdzZWN0LCBmbGFncyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBTZXQgdXAgYW55IG90aGVyIHNlY3Rpb24gZmxhZ3MgYW5kIHN1Y2ggdGhhdCBtYXkgYmUgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfZmFrZV9zZWN0aW9ucyAoYWJmZCwgc2hkciwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICpzaGRyOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci17Ci0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0VYQ0xVREUpICE9IDApCi0gICAgc2hkci0+c2hfZmxhZ3MgfD0gU0hGX0VYQ0xVREU7Ci0KLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfU09SVF9FTlRSSUVTKSAhPSAwKQotICAgIHNoZHItPnNoX3R5cGUgPSBTSFRfT1JERVJFRDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogQ3JlYXRlIGEgc3BlY2lhbCBsaW5rZXIgc2VjdGlvbiAqLwotc3RhdGljIGVsZl9saW5rZXJfc2VjdGlvbl90ICoKLXBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCB3aGljaCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bSB3aGljaDsKLXsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotCi0gIC8qIFJlY29yZCB0aGUgZmlyc3QgYmZkIHNlY3Rpb24gdGhhdCBuZWVkcyB0aGUgc3BlY2lhbCBzZWN0aW9uICovCi0gIGlmICghZHlub2JqKQotICAgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lLCBjcmVhdGUgdGhlIHNlY3Rpb24gKi8KLSAgbHNlY3QgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgd2hpY2gpOwotICBpZiAoIWxzZWN0KQotICAgIHsKLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbl90IGRlZmF1bHRzOwotICAgICAgc3RhdGljIGVsZl9saW5rZXJfc2VjdGlvbl90IHplcm9fc2VjdGlvbjsKLQotICAgICAgZGVmYXVsdHMgPSB6ZXJvX3NlY3Rpb247Ci0gICAgICBkZWZhdWx0cy53aGljaCA9IHdoaWNoOwotICAgICAgZGVmYXVsdHMuaG9sZV93cml0dGVuX3AgPSBmYWxzZTsKLSAgICAgIGRlZmF1bHRzLmFsaWdubWVudCA9IDI7Ci0KLSAgICAgIC8qIEJvdGggb2YgdGhlc2Ugc2VjdGlvbnMgYXJlICh0ZWNobmljYWxseSkgY3JlYXRlZCBieSB0aGUgdXNlcgotCSBwdXR0aW5nIGRhdGEgaW4gdGhlbSwgc28gdGhleSBzaG91bGRuJ3QgYmUgbWFya2VkCi0JIFNFQ19MSU5LRVJfQ1JFQVRFRC4KLQotCSBUaGUgbGlua2VyIGNyZWF0ZXMgdGhlbSBzbyBpdCBoYXMgc29tZXdoZXJlIHRvIGF0dGFjaCB0aGVpcgotCSByZXNwZWN0aXZlIHN5bWJvbHMuIEluIGZhY3QsIGlmIHRoZXkgd2VyZSBlbXB0eSBpdCB3b3VsZAotCSBiZSBPSyB0byBsZWF2ZSB0aGUgc3ltYm9sIHNldCB0byAwIChvciBhbnkgcmFuZG9tIG51bWJlciksIGJlY2F1c2UKLQkgdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyIHNob3VsZCBuZXZlciBiZSB1c2VkLiAgKi8KLSAgICAgIGRlZmF1bHRzLmZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkJfCBTRUNfSU5fTUVNT1JZKTsKLQotICAgICAgc3dpdGNoICh3aGljaCkKLQl7Ci0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFVua25vd24gc3BlY2lhbCBsaW5rZXIgdHlwZSAlZCIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgKGludCl3aGljaCk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQljYXNlIExJTktFUl9TRUNUSU9OX1NEQVRBOgkvKiAuc2RhdGEvLnNic3Mgc2VjdGlvbiAqLwotCSAgZGVmYXVsdHMubmFtZQkJICA9ICIuc2RhdGEiOwotCSAgZGVmYXVsdHMucmVsX25hbWUJICA9ICIucmVsYS5zZGF0YSI7Ci0JICBkZWZhdWx0cy5ic3NfbmFtZQkgID0gIi5zYnNzIjsKLQkgIGRlZmF1bHRzLnN5bV9uYW1lCSAgPSAiX1NEQV9CQVNFXyI7Ci0JICBkZWZhdWx0cy5zeW1fb2Zmc2V0CSAgPSAzMjc2ODsKLQkgIGJyZWFrOwotCi0JY2FzZSBMSU5LRVJfU0VDVElPTl9TREFUQTI6CS8qIC5zZGF0YTIvLnNic3MyIHNlY3Rpb24gKi8KLQkgIGRlZmF1bHRzLm5hbWUJCSAgPSAiLnNkYXRhMiI7Ci0JICBkZWZhdWx0cy5yZWxfbmFtZQkgID0gIi5yZWxhLnNkYXRhMiI7Ci0JICBkZWZhdWx0cy5ic3NfbmFtZQkgID0gIi5zYnNzMiI7Ci0JICBkZWZhdWx0cy5zeW1fbmFtZQkgID0gIl9TREEyX0JBU0VfIjsKLQkgIGRlZmF1bHRzLnN5bV9vZmZzZXQJICA9IDMyNzY4OwotCSAgZGVmYXVsdHMuZmxhZ3MJIHw9IFNFQ19SRUFET05MWTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbHNlY3QgPSBfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHdoaWNoLCAmZGVmYXVsdHMpOwotICAgIH0KLQotICByZXR1cm4gbHNlY3Q7Ci19Ci0KLQwKLS8qIElmIHdlIGhhdmUgYSBub24temVybyBzaXplZCAuc2JzczIgb3IgLlBQQy5FTUIuc2JzczAgc2VjdGlvbnMsIHdlIG5lZWQgdG8gYnVtcCB1cAotICAgdGhlIG51bWJlciBvZiBzZWN0aW9uIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgaW50Ci1wcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBpbnQgcmV0OwotCi0gIHJldCA9IDA7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmludGVycCIpOwotICBpZiAocyAhPSBOVUxMKQotICAgICsrcmV0OwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zYnNzMiIpOwotICBpZiAocyAhPSBOVUxMICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwICYmIHMtPl9yYXdfc2l6ZSA+IDApCi0gICAgKytyZXQ7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLlBQQy5FTUIuc2JzczAiKTsKLSAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCAmJiBzLT5fcmF3X3NpemUgPiAwKQotICAgICsrcmV0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIE1vZGlmeSB0aGUgc2VnbWVudCBtYXAgaWYgbmVlZGVkICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX21vZGlmeV9zZWdtZW50X21hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyogV2UgaGF2ZSB0byBjcmVhdGUgLmR5bnNic3MgYW5kIC5yZWxhLnNic3MgaGVyZSBzbyB0aGF0IHRoZXkgZ2V0IG1hcHBlZAotICAgdG8gb3V0cHV0IHNlY3Rpb25zIChqdXN0IGxpa2UgX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgaGFzCi0gICB0byBjcmVhdGUgLmR5bmJzcyBhbmQgLnJlbGEuYnNzKS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKCFfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyhhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5zYnNzIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBTRUNfQUxMT0MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucmVsYS5zYnNzIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLSAgYmZkX3ZtYSBwbHRfb2Zmc2V0OwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgY2FsbGVkIGZvciAlc1xuIiwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgfHwgKCghaW5mby0+c2hhcmVkIHx8IGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCi0JICB8fCAoaW5mby0+c2hhcmVkICYmIGgtPnBsdC5yZWZjb3VudCA8PSAwKSkKLQl7Ci0JICAvKiBBIFBMVCBlbnRyeSBpcyBub3QgcmVxdWlyZWQvYWxsb3dlZCB3aGVuOgotCi0JICAgICAxLiBXZSBhcmUgbm90IHVzaW5nIGxkLnNvOyBiZWNhdXNlIHRoZW4gdGhlIFBMVCBlbnRyeQotCSAgICAgY2FuJ3QgYmUgc2V0IHVwLCBzbyB3ZSBjYW4ndCB1c2Ugb25lLgotCi0JICAgICAyLiBXZSBrbm93IGZvciBjZXJ0YWluIHRoYXQgYSBzeW1ib2wgaXMgZGVmaW5lZCBpbgotCSAgICAgdGhpcyBvYmplY3QsIGJlY2F1c2UgdGhpcyBvYmplY3QgaXMgdGhlIGFwcGxpY2F0aW9uLAotCSAgICAgaXMgbGlua2VkIHdpdGggLUJzeW1ib2xpYywgb3IgYmVjYXVzZSB0aGUgc3ltYm9sIGlzIGxvY2FsLgotCi0JICAgICAzLiBHQyBoYXMgcmVuZGVyZWQgdGhlIGVudHJ5IHVudXNlZC4KLQkgICAgIE5vdGUsIGhvd2V2ZXIsIHRoYXQgaW4gYW4gZXhlY3V0YWJsZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUKLQkgICAgIHN5bWJvbCBnbyB0byB0aGUgUExULCBzbyB3ZSBjYW4ndCB0dXJuIGl0IG9mZiBpbiB0aGF0IGNhc2UuCi0JICAgICA/Pz8gVGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8gaGVyZSBpcyB0byByZWZlcmVuY2UgY291bnQKLQkgICAgIGFsbCB1c2VzIG9mIHRoZSBzeW1ib2wsIG5vdCBqdXN0IHRob3NlIHRvIHRoZSBHT1Qgb3IgUExULiAgKi8KLQkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCi0JIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gUExUX0lOSVRJQUxfRU5UUllfU0laRTsKLQotICAgICAgLyogVGhlIFBvd2VyUEMgUExUIGlzIGFjdHVhbGx5IGNvbXBvc2VkIG9mIHR3byBwYXJ0cywgdGhlIGZpcnN0IHBhcnQKLQkgaXMgMiB3b3JkcyAoZm9yIGEgbG9hZCBhbmQgYSBqdW1wKSwgYW5kIHRoZW4gdGhlcmUgaXMgYSByZW1haW5pbmcKLQkgd29yZCBhdmFpbGFibGUgYXQgdGhlIGVuZC4gICovCi0gICAgICBwbHRfb2Zmc2V0ID0gKFBMVF9JTklUSUFMX0VOVFJZX1NJWkUKLQkJICAgICsgKFBMVF9TTE9UX1NJWkUKLQkJICAgICAgICogKChzLT5fcmF3X3NpemUgLSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFKQotCQkJICAvIFBMVF9FTlRSWV9TSVpFKSkpOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcGx0X29mZnNldDsKLQl9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBwbHRfb2Zmc2V0OwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICBBZnRlciB0aGUgODE5Mm5kIGVudHJ5LCByb29tCi0gICAgICAgICBmb3IgdHdvIGVudHJpZXMgaXMgYWxsb2NhdGVkLiAgKi8KLSAgICAgIGlmICgocy0+X3Jhd19zaXplIC0gUExUX0lOSVRJQUxfRU5UUllfU0laRSkgLyBQTFRfRU5UUllfU0laRQotCSAgPj0gUExUX05VTV9TSU5HTEVfRU5UUklFUykKLQlzLT5fcmF3X3NpemUgKz0gMiAqIFBMVF9FTlRSWV9TSVpFOwotICAgICAgZWxzZQotCXMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuCi0KLSAgICAgT2YgY291cnNlLCBpZiB0aGUgc3ltYm9sIGlzIHN1ZmZpY2llbnRseSBzbWFsbCwgd2UgbXVzdCBpbnN0ZWFkCi0gICAgIGFsbG9jYXRlIGl0IGluIC5zYnNzLiAgRklYTUU6IEl0IHdvdWxkIGJlIGJldHRlciB0byBkbyB0aGlzIGlmIGFuZAotICAgICBvbmx5IGlmIHRoZXJlIHdlcmUgYWN0dWFsbHkgU0RBUkVMIHJlbG9jcyBmb3IgdGhhdCBzeW1ib2wuICAqLwotCi0gIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnNic3MiKTsKLSAgZWxzZQotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX1BQQ19DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWxhLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotCXNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuc2JzcyIpOwotICAgICAgZWxzZQotCXNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gNCkKLSAgICBwb3dlcl9vZl90d28gPSA0OwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcGx0OwotICBib29sZWFuIHJlbG9jczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgY2FsbGVkXG4iKTsKLSNlbmRpZgotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290LCAucmVsYS5zZGF0YSwgYW5kCi0JIC5yZWxhLnNkYXRhMiBzZWN0aW9ucy4gIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlCi0JIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQKLQkgdGhlIHNpemUgb2YgLnJlbGEuZ290LCBldCBhbCwgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQKLQkgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUgYmVsb3cuICAqLwotICAgICAgc3RhdGljIGNoYXIgKnJlbGFfc2VjdGlvbnNbXSA9IHsgIi5yZWxhLmdvdCIsICIucmVsYS5zZGF0YSIsCi0JCQkJICAgICAgICIucmVsYS5zZGF0YTIiLCAiLnJlbGEuc2JzcyIsCi0JCQkJICAgICAgIChjaGFyICopMCB9OwotICAgICAgY2hhciAqKnA7Ci0KLSAgICAgIGZvciAocCA9IHJlbGFfc2VjdGlvbnM7ICpwICE9IChjaGFyICopMDsgcCsrKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAqcCk7Ci0JICBpZiAocyAhPSBOVUxMKQotCSAgICBzLT5fcmF3X3NpemUgPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICBwbHQgPSBmYWxzZTsKLSAgcmVsb2NzID0gZmFsc2U7Ci0gIHJlbHRleHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBTdHJpcCB0aGlzIHNlY3Rpb24gaWYgd2UgZG9uJ3QgbmVlZCBpdDsgc2VlIHRoZQotICAgICAgICAgICAgICAgICBjb21tZW50IGJlbG93LiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgaXMgYSBQTFQuICAqLwotCSAgICAgIHBsdCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbGEuYnNzIGFuZAotCQkgLnJlbGEucGx0LiAgV2UgbXVzdCBjcmVhdGUgYm90aCBzZWN0aW9ucyBpbgotCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgdGhleSBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVsb2NhdGlvbiBzZWN0aW9ucy4gKi8KLQkgICAgICByZWxvY3MgPSB0cnVlOwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4gICovCi0JICAgICAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgICAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA1KTsKLQkgICAgICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQlyZWx0ZXh0ID0gdHJ1ZTsKLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZ290IikgIT0gMAotCSAgICAgICAmJiBzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSAhPSAwCi0JICAgICAgICYmIHN0cmNtcCAobmFtZSwgIi5zZGF0YTIiKSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWxvY3MpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCi0JCQkJCQlzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQotICAgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGE7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YTI7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIGFzZWN0aW9uICpzZ290ID0gTlVMTDsKLSAgYXNlY3Rpb24gKnNyZWxnb3QgPSBOVUxMOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX2NoZWNrX3JlbG9jcyBjYWxsZWQgZm9yIHNlY3Rpb24gJXMgaW4gJXNcbiIsCi0JICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotI2VuZGlmCi0KLSAgLyogQ3JlYXRlIHRoZSBsaW5rZXIgZ2VuZXJhdGVkIHNlY3Rpb25zIGFsbCB0aGUgdGltZSBzbyB0aGF0IHRoZQotICAgICBzcGVjaWFsIHN5bWJvbHMgYXJlIGNyZWF0ZWQuICAqLwotCi0gIGlmICgoc2RhdGEgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGFiZmQsIExJTktFUl9TRUNUSU9OX1NEQVRBKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZGF0YSA9IHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCBMSU5LRVJfU0VDVElPTl9TREFUQSk7Ci0gICAgICBpZiAoIXNkYXRhKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICBpZiAoKHNkYXRhMiA9IGVsZl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgTElOS0VSX1NFQ1RJT05fU0RBVEEyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZGF0YTIgPSBwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgTElOS0VSX1NFQ1RJT05fU0RBVEEyKTsKLSAgICAgIGlmICghc2RhdGEyKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKLQotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCi0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgLyogSWYgYSByZWxvY2F0aW9uIHJlZmVycyB0byBfR0xPQkFMX09GRlNFVF9UQUJMRV8sIGNyZWF0ZSB0aGUgLmdvdC4KLQkgVGhpcyBzaG93cyB1cCBpbiBwYXJ0aWN1bGFyIGluIGFuIFJfUFBDX0FERFIzMiBpbiB0aGUgZWFiaQotCSBzdGFydHVwIGNvZGUuICAqLwotICAgICAgaWYgKGggJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQl7Ci0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCQllbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JLyogR09UMTYgcmVsb2NhdGlvbnMgKi8KLQljYXNlIFJfUFBDX0dPVDE2OgotCWNhc2UgUl9QUENfR09UMTZfTE86Ci0JY2FzZSBSX1BQQ19HT1QxNl9ISToKLQljYXNlIFJfUFBDX0dPVDE2X0hBOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkJZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCSAgICAgICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA9PSAtMSkKLQkJewotCQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCSAgICBpZiAoIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQotCQkgIC8qIEFsbG9jYXRlIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkJICAvKiBBbGxvY2F0ZSByZWxvY2F0aW9uIHNwYWNlLiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotCQkgIGgtPmdvdC5yZWZjb3VudCA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWgtPmdvdC5yZWZjb3VudCsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbCBzeW1ib2wuICAqLwotCSAgICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzID09IE5VTEwpCi0JCXsKLQkJICBzaXplX3Qgc2l6ZTsKLQotCQkgIHNpemUgPSBzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChiZmRfc2lnbmVkX3ZtYSk7Ci0JCSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IChiZmRfc2lnbmVkX3ZtYSAqKQotCQkgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICBpZiAobG9jYWxfZ290X3JlZmNvdW50cyA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKSA9IGxvY2FsX2dvdF9yZWZjb3VudHM7Ci0JCSAgbWVtc2V0IChsb2NhbF9nb3RfcmVmY291bnRzLCAtMSwgc2l6ZSk7Ci0JCX0KLQkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPT0gLTEpCi0JCXsKLQkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQotCQkgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGEgUl9QUENfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotCQkgIGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0rKzsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkvKiBJbmRpcmVjdCAuc2RhdGEgcmVsb2NhdGlvbiAqLwotCWNhc2UgUl9QUENfRU1CX1NEQUkxNjoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogcmVsb2NhdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCB3aGVuIG1ha2luZyBhIHNoYXJlZCBvYmplY3QiKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICJSX1BQQ19FTUJfU0RBSTE2IikpOwotCSAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTCAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCFiZmRfZWxmMzJfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHNkYXRhLCBoLCByZWwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGJyZWFrOwotCi0JLyogSW5kaXJlY3QgLnNkYXRhMiByZWxvY2F0aW9uICovCi0JY2FzZSBSX1BQQ19FTUJfU0RBMkkxNjoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogcmVsb2NhdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCB3aGVuIG1ha2luZyBhIHNoYXJlZCBvYmplY3QiKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICJSX1BQQ19FTUJfU0RBMkkxNiIpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTCAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCFiZmRfZWxmMzJfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHNkYXRhMiwgaCwgcmVsKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9QUENfU0RBUkVMMTY6Ci0JY2FzZSBSX1BQQ19FTUJfU0RBMlJFTDoKLQljYXNlIFJfUFBDX0VNQl9TREEyMToKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogcmVsb2NhdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCB3aGVuIG1ha2luZyBhIHNoYXJlZCBvYmplY3QiKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCXBwY19lbGZfaG93dG9fdGFibGVbKGludClFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKV0tPm5hbWUpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BQQ19QTFQzMjoKLQljYXNlIFJfUFBDX1BMVFJFTDI0OgotCWNhc2UgUl9QUENfUExUMTZfTE86Ci0JY2FzZSBSX1BQQ19QTFQxNl9ISToKLQljYXNlIFJfUFBDX1BMVDE2X0hBOgotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJSZWxvYyByZXF1aXJlcyBhIFBMVCBlbnRyeVxuIik7Ci0jZW5kaWYKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotICAgICAgICAgICAgIGFjdHVhbGx5IGJ1aWxkIHRoZSBlbnRyeSBpbiBhZGp1c3RfZHluYW1pY19zeW1ib2wsCi0gICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdpdGhvdXQKLSAgICAgICAgICAgICBsaW5raW5nIGluIGFueSBkeW5hbWljIG9iamVjdHMsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QKLSAgICAgICAgICAgICBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgYWZ0ZXIgYWxsLiAgKi8KLQotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIHByb2NlZHVyZSBsaW5rYWdlCi0gICAgICAgICAgICAgICAgIHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaWYgKGgtPnBsdC5yZWZjb3VudCA9PSAtMSkKLQkgICAgewotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICAgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGUgZm9sbG93aW5nIHJlbG9jYXRpb25zIGRvbid0IG5lZWQgdG8gcHJvcGFnYXRlIHRoZQotCSAgICAgcmVsb2NhdGlvbiBpZiBsaW5raW5nIGEgc2hhcmVkIG9iamVjdCBzaW5jZSB0aGV5IGFyZQotCSAgICAgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0JY2FzZSBSX1BQQ19TRUNUT0ZGOgotCWNhc2UgUl9QUENfU0VDVE9GRl9MTzoKLQljYXNlIFJfUFBDX1NFQ1RPRkZfSEk6Ci0JY2FzZSBSX1BQQ19TRUNUT0ZGX0hBOgotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVmZXJzIG9ubHkgdG8gZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5ICovCi0JY2FzZSBSX1BQQ19MT0NBTDI0UEM6Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotCSAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9QUENfR05VX1ZUSU5IRVJJVDoKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0JICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfUFBDX0dOVV9WVEVOVFJZOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCSAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotCSAgICAgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2MKLQkgICAgIHNlY3Rpb24gaW4gZHlub2JqIGFuZCBtYWtlIHJvb20gZm9yIHRoZSByZWxvYy4gICovCi0JY2FzZSBSX1BQQ19SRUwyNDoKLQljYXNlIFJfUFBDX1JFTDE0OgotCWNhc2UgUl9QUENfUkVMMTRfQlJUQUtFTjoKLQljYXNlIFJfUFBDX1JFTDE0X0JSTlRBS0VOOgotCWNhc2UgUl9QUENfUkVMMzI6Ci0JICBpZiAoaCA9PSBOVUxMCi0JICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCWRlZmF1bHQ6Ci0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX2NoZWNrX3JlbG9jcyBuZWVkIHRvIGNyZWF0ZSByZWxvY2F0aW9uIGZvciAlc1xuIiwKLQkJICAgICAgIChoICYmIGgtPnJvb3Qucm9vdC5zdHJpbmcpID8gaC0+cm9vdC5yb290LnN0cmluZyA6ICI8dW5rbm93bj4iKTsKLSNlbmRpZgotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGFiZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmbGFnd29yZCBmbGFnczsKLQotCQkgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCi0JCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQkJICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkJZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsIGZsYWdzKQotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgaGVyZSBkbyB3aGF0IHRoZSBtNjhrIGFuZCBpMzg2Ci0JCSBiYWNrZW5kcyBkbzogaWYgdGhlIHJlbG9jIGlzIHBjLXJlbGF0aXZlLCByZWNvcmQgaXQKLQkJIGluIGNhc2UgaXQgdHVybnMgb3V0IHRoYXQgdGhlIHJlbG9jIGlzIHVubmVjZXNzYXJ5Ci0JCSBiZWNhdXNlIHRoZSBzeW1ib2wgaXMgZm9yY2VkIGxvY2FsIGJ5IHZlcnNpb25pbmcgb3IKLQkJIHdlIGFyZSBsaW5raW5nIHdpdGggLUJkeW5hbWljLiAgRm9ydHVuYXRlbHkgdGhpcwotCQkgY2FzZSBpcyBub3QgZnJlcXVlbnQuICAqLwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgotICAgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1wcGNfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfUFBDX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSX1BQQ19HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKLQotICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX1BQQ19HT1QxNjoKLSAgICAgIGNhc2UgUl9QUENfR09UMTZfTE86Ci0gICAgICBjYXNlIFJfUFBDX0dPVDE2X0hJOgotICAgICAgY2FzZSBSX1BQQ19HT1QxNl9IQToKLQlyX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICB7Ci0JICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgIGlmIChoLT5nb3QucmVmY291bnQgPiAwKQotCSAgICAgIGgtPmdvdC5yZWZjb3VudC0tOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID4gMCkKLQkgICAgICBsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XS0tOwotCSAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBSX1BQQ19QTFQzMjoKLSAgICAgIGNhc2UgUl9QUENfUExUUkVMMjQ6Ci0gICAgICBjYXNlIFJfUFBDX1BMVDE2X0xPOgotICAgICAgY2FzZSBSX1BQQ19QTFQxNl9ISToKLSAgICAgIGNhc2UgUl9QUENfUExUMTZfSEE6Ci0Jcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCWlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgewotCSAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICBpZiAoaC0+cGx0LnJlZmNvdW50ID4gMCkKLQkgICAgICBoLT5wbHQucmVmY291bnQtLTsKLQkgIH0KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSB1c2UgaXQgdG8gcHV0IC5jb21tIGl0ZW1zIGluIC5zYnNzLCBhbmQgbm90IC5ic3MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmbGFnd29yZCAqZmxhZ3NwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYmZkX3ZtYSAqdmFscDsKLXsKLSAgaWYgKHN5bS0+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+b3V0cHV0X29mZnNldCwKLQkJICAgIGNvbnRlbnRzKzQpOwotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIKLSAgIHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4KLQotICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKLSAgIHplcm8uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdCB0aGUgc2VjdGlvbiBjb250ZW50cyBhcwotICAgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzIGFuZCBnZW5lcmF0aW5nIGEKLSAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZSByZWxvYyBhZGRlbmQgYXMKLSAgIG5lY2Vzc2FyeS4KLQotICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCi0gICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQotICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKLSAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICBhY2NvcmRpbmdseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcgkJICA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBiZmQgKmR5bm9iagkJCQkgID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YQkJICA9IChkeW5vYmopID8gZWxmX2xpbmtlcl9zZWN0aW9uIChkeW5vYmosIExJTktFUl9TRUNUSU9OX1NEQVRBKSAgOiBOVUxMOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGEyCQkgID0gKGR5bm9iaikgPyBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgTElOS0VSX1NFQ1RJT05fU0RBVEEyKSA6IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwJCSAgPSByZWxvY3M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQJCSAgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgYXNlY3Rpb24gKnNyZWxvYwkJCSAgPSBOVUxMOwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBib29sZWFuIHJldAkJCQkgID0gdHJ1ZTsKLSAgbG9uZyBpbnNuOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGNhbGxlZCBmb3IgJXMgc2VjdGlvbiAlcywgJWxkIHJlbG9jYXRpb25zJXNcbiIsCi0JICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICBiZmRfc2VjdGlvbl9uYW1lKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCi0JICAgKGxvbmcpaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQsCi0JICAgKGluZm8tPnJlbG9jYXRlYWJsZSkgPyAiIChyZWxvY2F0YWJsZSkiIDogIiIpOwotI2VuZGlmCi0KLSAgaWYgKCFwcGNfZWxmX2hvd3RvX3RhYmxlWyBSX1BQQ19BRERSMzIgXSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KLSAgICBwcGNfZWxmX2hvd3RvX2luaXQgKCk7Ci0KLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgc3BsdCA9IHNnb3QgPSBOVUxMOwotICBpZiAoZHlub2JqICE9IE5VTEwpCi0gICAgewotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICB9Ci0KLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgZW51bSBlbGZfcHBjX3JlbG9jX3R5cGUgcl90eXBlCT0gKGVudW0gZWxmX3BwY19yZWxvY190eXBlKUVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgYmZkX3ZtYSBvZmZzZXQJCQk9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBiZmRfdm1hIGFkZGVuZAkJCT0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByCQk9IGJmZF9yZWxvY19vdGhlcjsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bQkJPSAoRWxmX0ludGVybmFsX1N5bSAqKTA7Ci0gICAgICBhc2VjdGlvbiAqc2VjCQkJPSAoYXNlY3Rpb24gKikwOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgJPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikwOwotICAgICAgY29uc3QgY2hhciAqc3ltX25hbWUJCT0gKGNvbnN0IGNoYXIgKikwOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gICAgICAvKiBVbmtub3duIHJlbG9jYXRpb24gaGFuZGxpbmcgKi8KLSAgICAgIGlmICgodW5zaWduZWQpcl90eXBlID49ICh1bnNpZ25lZClSX1BQQ19tYXggfHwgIXBwY19lbGZfaG93dG9fdGFibGVbKGludClyX3R5cGVdKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJIChpbnQpcl90eXBlKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaG93dG8gPSBwcGNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpcl90eXBlXTsKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoKHVuc2lnbmVkKUVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKLQkJICAgaG93dG8tPm5hbWUsCi0JCSAgIChpbnQpcl90eXBlLAotCQkgICByX3N5bW5keCwKLQkJICAgKGxvbmcpb2Zmc2V0LAotCQkgICAobG9uZylhZGRlbmQpOwotI2VuZGlmCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgc3ltX25hbWUgPSAiPGxvY2FsIHN5bWJvbD4iOwotCi0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIHN5bV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAoKHJfdHlwZSA9PSBSX1BQQ19QTFQzMgotCQkgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICB8fCAocl90eXBlID09IFJfUFBDX0xPQ0FMMjRQQwotCQkgICAgICAmJiBzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCSAgfHwgKChyX3R5cGUgPT0gUl9QUENfR09UMTYKLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19HT1QxNl9MTwotCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX0dPVDE2X0hJCi0JCSAgICAgICB8fCByX3R5cGUgPT0gUl9QUENfR09UMTZfSEEpCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCQkgIC8qIFRlc3RpbmcgU0VDX0RFQlVHR0lORyBoZXJlIG1heSBiZSB3cm9uZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQncyBoZXJlIHRvIGF2b2lkIGEgY3Jhc2ggd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkgd2l0aCBEV0FSRgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCQkgICAgICAgICAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSX1BQQ19BRERSMzIKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIyNAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTZfTE8KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNl9ISQotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2X0hBCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTQKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNF9CUlRBS0VOCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTRfQlJOVEFLRU4KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1BMVFJFTDI0Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19DT1BZCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19HTE9CX0RBVAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfSk1QX1NMT1QKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1VBRERSMzIKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1VBRERSMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1NEQVJFTDE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIzMgotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9OQUREUjE2X0xPCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIxNl9ISQotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTZfSEEKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREFJMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREEySTE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfU0RBMlJFTAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1NEQTIxCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTVJLUkVGCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfQklUX0ZMRAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1JFTFNEQQotCQkJICB8fCAoKHJfdHlwZSA9PSBSX1BQQ19SRUwyNAotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwzMgotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwxNAotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwxNF9CUlRBS0VOCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTDE0X0JSTlRBS0VOCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTEFUSVZFKQotCQkJICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAgICAgICAgICAoXygiJXM6IHdhcm5pbmc6IHVucmVzb2x2YWJsZSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIGAlcycgZnJvbSAlcyBzZWN0aW9uIiksCi0gICAgICAgICAgICAgICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCSAgICAgICAgfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+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+cmVsb2Nfb3ZlcmZsb3cpKGluZm8sCi0JCQkJCQkgICBuYW1lLAotCQkJCQkJICAgaG93dG8tPm5hbWUsCi0JCQkJCQkgICAoYmZkX3ZtYSkgMCwKLQkJCQkJCSAgIGlucHV0X2JmZCwKLQkJCQkJCSAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkgICBvZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXJldCA9IGZhbHNlOwotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQotICByZXR1cm4gcmV0OwotfQotCi0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItcG93ZXJwY2xlIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX3Bvd2VycGNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLXBvd2VycGMiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9wb3dlcnBjCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fUFBDCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwlwcGNfZWxmX2luZm9fdG9faG93dG8KLQotI2lmZGVmICBFTV9DWUdOVVNfUE9XRVJQQwotI2RlZmluZSBFTEZfTUFDSElORV9BTFQxCUVNX0NZR05VU19QT1dFUlBDCi0jZW5kaWYKLQotI2lmZGVmIEVNX1BQQ19PTEQKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMglFTV9QUENfT0xECi0jZW5kaWYKLQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZAkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9zeW1ib2xfb2Zmc2V0CTQKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQlQTFRfSU5JVElBTF9FTlRSWV9TSVpFCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEJcHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCXBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24gICAgICAgICAgICAgcHBjX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCXBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJcHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmsJCV9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKLQotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJCXBwY19lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJCXBwY19lbGZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkJcHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQlwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMJcHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJCXBwY19lbGZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbAlwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJCXBwY19lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucwlwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wJcHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMJcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCQlwcGNfZWxmX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMJcHBjX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAJCXBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1zaC5jIGIvYmZkL2VsZjMyLXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNWJkOWYuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTE0ICswLDAgQEAKLS8qIEhpdGFjaGkgU0ggc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvc2guaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzaF9lbGZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNoX2VsZl9pZ25vcmVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqc2hfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHNoX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfZWxmX2FsaWduX2xvYWRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfYnl0ZSAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9zd2FwX2luc25zCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKnNoX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotCSAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc2hfZWxmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfU0hfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgU2V0dGluZyBwYXJ0aWFsX2lucGxhY2UgdG8gdHJ1ZSBhbmQKLSAgICAgc3JjX21hc2sgdG8gYSBub24temVybyB2YWx1ZSBpcyBzaW1pbGFyIHRvIHRoZSBDT0ZGIHRvb2xjaGFpbi4gICovCi0gIEhPV1RPIChSX1NIX0RJUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVIzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9TSF9SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgUEMgcmVsYXRpdmUgYnJhbmNoIGRpdmlkZWQgYnkgMi4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXUE4sCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOFdQTiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBQQyByZWxhdGl2ZSBicmFuY2ggZGl2aWRlZCBieSAyLiAgKi8KLSAgSE9XVE8gKFJfU0hfSU5EMTJXLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9JTkQxMlciLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCB1bnNpZ25lZCBQQyByZWxhdGl2ZSBkaXZpZGVkIGJ5IDQuICAqLwotICBIT1dUTyAoUl9TSF9ESVI4V1BMLAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOFdQTCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IHVuc2lnbmVkIFBDIHJlbGF0aXZlIGRpdmlkZWQgYnkgMi4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXUFosCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVI4V1BaIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgR0JSIHJlbGF0aXZlLiAgRklYTUU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiB3ZSBoYXZlIHNvbWUKLSAgICAgc3BlY2lhbCBzeW1ib2wgZm9yIHRoZSBHQlIgcmVsYXRpdmUgYXJlYSwgYW5kIHRoYXQgaXMgbm90Ci0gICAgIGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOEJQLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjhCUCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgR0JSIHJlbGF0aXZlIGRpdmlkZWQgYnkgMi4gIEZJWE1FOiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYKLSAgICAgd2UgaGF2ZSBzb21lIHNwZWNpYWwgc3ltYm9sIGZvciB0aGUgR0JSIHJlbGF0aXZlIGFyZWEsIGFuZCB0aGF0Ci0gICAgIGlzIG5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjhXIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBHQlIgcmVsYXRpdmUgZGl2aWRlZCBieSA0LiAgRklYTUU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZgotICAgICB3ZSBoYXZlIHNvbWUgc3BlY2lhbCBzeW1ib2wgZm9yIHRoZSBHQlIgcmVsYXRpdmUgYXJlYSwgYW5kIHRoYXQKLSAgICAgaXMgbm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOEwsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOEwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEVNUFRZX0hPV1RPICgxMCksCi0gIEVNUFRZX0hPV1RPICgxMSksCi0gIEVNUFRZX0hPV1RPICgxMiksCi0gIEVNUFRZX0hPV1RPICgxMyksCi0gIEVNUFRZX0hPV1RPICgxNCksCi0gIEVNUFRZX0hPV1RPICgxNSksCi0gIEVNUFRZX0hPV1RPICgxNiksCi0gIEVNUFRZX0hPV1RPICgxNyksCi0gIEVNUFRZX0hPV1RPICgxOCksCi0gIEVNUFRZX0hPV1RPICgxOSksCi0gIEVNUFRZX0hPV1RPICgyMCksCi0gIEVNUFRZX0hPV1RPICgyMSksCi0gIEVNUFRZX0hPV1RPICgyMiksCi0gIEVNUFRZX0hPV1RPICgyMyksCi0gIEVNUFRZX0hPV1RPICgyNCksCi0KLSAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGEgR05VIGV4dGVuc2lvbiB1c2VkIGZvciByZWxheGluZy4gIFRoZQotICAgICBmaW5hbCBwYXNzIG9mIHRoZSBsaW5rZXIgbmV2ZXIgbmVlZHMgdG8gZG8gYW55dGhpbmcgd2l0aCBhbnkgb2YKLSAgICAgdGhlc2UgcmVsb2NzLiAgQW55IHJlcXVpcmVkIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgYnkgdGhlCi0gICAgIHJlbGF4YXRpb24gY29kZS4gICovCi0KLSAgLyogQSAxNiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5LiAgVGhpcyBpcyBnZW5lcmF0ZWQgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgc3VjaCBhcyBgYC53b3JkIEwxIC0gTDInJy4gIFRoZSBvZmZzZXQgaG9sZHMgdGhlIGRpZmZlcmVuY2UKLSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgTDIuICAqLwotICBIT1dUTyAoUl9TSF9TV0lUQ0gxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfU1dJVENIMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5LiAgVGhpcyBpcyBnZW5lcmF0ZWQgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgc3VjaCBhcyBgYC5sb25nIEwxIC0gTDInJy4gIFRoZSBvZmZzZXQgaG9sZHMgdGhlIGRpZmZlcmVuY2UKLSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgTDIuICAqLwotICBIT1dUTyAoUl9TSF9TV0lUQ0gzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfU1dJVENIMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5kaWNhdGVzIGEgLnVzZXMgcHNldWRvLW9wLiAgVGhlIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgLnVzZXMKLSAgICAgcHNldWRvLW9wcyB3aGVuIGl0IGZpbmRzIGEgZnVuY3Rpb24gY2FsbCB3aGljaCBjYW4gYmUgcmVsYXhlZC4KLSAgICAgVGhlIG9mZnNldCBmaWVsZCBob2xkcyB0aGUgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSBpbnN0cnVjdGlvbgotICAgICB3aGljaCBsb2FkcyB0aGUgcmVnaXN0ZXIgdXNlZCBpbiB0aGUgZnVuY3Rpb24gY2FsbC4gICovCi0gIEhPV1RPIChSX1NIX1VTRVMsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfVVNFUyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIHRoaXMgcmVsb2MgZm9yIGFkZHJlc3NlcyByZWZlcnJlZCB0bwotICAgICBieSB0aGUgcmVnaXN0ZXIgbG9hZHMgYXNzb2NpYXRlZCB3aXRoIFVTRVMgcmVsb2NzLiAgVGhlIG9mZnNldAotICAgICBmaWVsZCBob2xkcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhZGRyZXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlCi0gICAgIG9iamVjdCBmaWxlLiAgKi8KLSAgSE9XVE8gKFJfU0hfQ09VTlQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfQ09VTlQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEluZGljYXRlcyBhbiBhbGlnbm1lbnQgc3RhdGVtZW50LiAgVGhlIG9mZnNldCBmaWVsZCBpcyB0aGUgcG93ZXIKLSAgICAgb2YgMiB0byB3aGljaCBzdWJzZXF1ZW50IHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZSBtdXN0IGJlCi0gICAgIGFsaWduZWQuICAqLwotICBIT1dUTyAoUl9TSF9BTElHTiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9BTElHTiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgdGhpcyByZWxvYyBiZWZvcmUgYSBibG9jayBvZgotICAgICBpbnN0cnVjdGlvbnMuICBBIHNlY3Rpb24gc2hvdWxkIGJlIHByb2Nlc3NlZCBhcyBhc3N1bWluaW5nIGl0Ci0gICAgIGNvbnRhaW5zIGRhdGEsIHVubGVzcyB0aGlzIHJlbG9jIGlzIHNlZW4uICAqLwotICBIT1dUTyAoUl9TSF9DT0RFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0NPREUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSB0aGlzIHJlbG9jIGFmdGVyIGEgYmxvY2sgb2YKLSAgICAgaW5zdHJ1Y3Rpb25zIHdoZW4gaXQgc2VlcyBkYXRhIHRoYXQgaXMgbm90IGluc3RydWN0aW9ucy4gICovCi0gIEhPV1RPIChSX1NIX0RBVEEsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfREFUQSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhpcyByZWxvYyBmb3IgZWFjaCBsYWJlbCB3aXRoaW4gYSBibG9jawotICAgICBvZiBpbnN0cnVjdGlvbnMuICBUaGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0byBhdm9pZCBzd2FwcGluZwotICAgICBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIHRoZSB0YXJnZXRzIG9mIGJyYW5jaGVzLiAgKi8KLSAgSE9XVE8gKFJfU0hfTEFCRUwsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfTEFCRUwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIDggYml0IHN3aXRjaCB0YWJsZSBlbnRyeS4gIFRoaXMgaXMgZ2VuZXJhdGVkIGZvciBhbiBleHByZXNzaW9uCi0gICAgIHN1Y2ggYXMgYGAud29yZCBMMSAtIEwyJycuICBUaGUgb2Zmc2V0IGhvbGRzIHRoZSBkaWZmZXJlbmNlCi0gICAgIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kIEwyLiAgKi8KLSAgSE9XVE8gKFJfU0hfU1dJVENIOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9TV0lUQ0g4IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX1NIX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1NIX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9TSF9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfU0hfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG5vcm1hbCByZWxvY3MuICBUaGlzIGlzIGxpa2UgdGhlIENPRkYKLSAgIGZ1bmN0aW9uLCBhbmQgaXMgYWxtb3N0IGNlcnRhaW5seSBpbmNvcnJlY3QgZm9yIG90aGVyIEVMRiB0YXJnZXRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc2hfZWxmX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBiZmRfdm1hIHN5bV92YWx1ZTsKLSAgZW51bSBlbGZfc2hfcmVsb2NfdHlwZSByX3R5cGU7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBhZGRyICsgKGJmZF9ieXRlICopIGRhdGE7Ci0KLSAgcl90eXBlID0gKGVudW0gZWxmX3NoX3JlbG9jX3R5cGUpIHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZTsKLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFBhcnRpYWwgbGlua2luZy0tZG8gbm90aGluZy4gICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogQWxtb3N0IGFsbCByZWxvY3MgaGF2ZSB0byBkbyB3aXRoIHJlbGF4aW5nLiAgSWYgYW55IHdvcmsgbXVzdCBiZQotICAgICBkb25lIGZvciB0aGVtLCBpdCBoYXMgYmVlbiBkb25lIGluIHNoX3JlbGF4X3NlY3Rpb24uICAqLwotICBpZiAocl90eXBlICE9IFJfU0hfRElSMzIKLSAgICAgICYmIChyX3R5cGUgIT0gUl9TSF9JTkQxMlcKLQkgIHx8IChzeW1ib2xfaW4tPmZsYWdzICYgQlNGX0xPQ0FMKSAhPSAwKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gIGlmIChzeW1ib2xfaW4gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCi0gICAgc3ltX3ZhbHVlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgZWxzZSAKLSAgICBzeW1fdmFsdWUgPSAoc3ltYm9sX2luLT52YWx1ZSArCi0JCSBzeW1ib2xfaW4tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCQkgc3ltYm9sX2luLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1NIX0RJUjMyOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGhpdF9kYXRhKTsKLSAgICAgIGluc24gKz0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9TSF9JTkQxMlc6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgaGl0X2RhdGEpOwotICAgICAgc3ltX3ZhbHVlICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBzeW1fdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgKyBhZGRyCi0JCSAgICArIDQpOwotICAgICAgc3ltX3ZhbHVlICs9IChpbnNuICYgMHhmZmYpIDw8IDE7Ci0gICAgICBpZiAoaW5zbiAmIDB4ODAwKQotCXN5bV92YWx1ZSAtPSAweDEwMDA7Ci0gICAgICBpbnNuID0gKGluc24gJiAweGYwMDApIHwgKHN5bV92YWx1ZSAmIDB4ZmZmKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGlmIChzeW1fdmFsdWUgPCAoYmZkX3ZtYSkgLTB4MTAwMCB8fCBzeW1fdmFsdWUgPj0gMHgxMDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciByZWxvY3Mgd2hpY2ggYXJlIG9ubHkgdXNlZCBmb3IgcmVsYXhpbmcsCi0gICB3aGljaCB0aGUgbGlua2VyIHNob3VsZCBvdGhlcndpc2UgaWdub3JlLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc2hfZWxmX2lnbm9yZV9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWFwIEJGRCByZWxvYyBjb2RlcyB0byBTSCBFTEYgcmVsb2NzLiAgKi8KLQotc3RydWN0IGVsZl9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLS8qIEFuIGFycmF5IG1hcHBpbmcgQkZEIHJlbG9jIGNvZGVzIHRvIFNIIEVMRiByZWxvY3MuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZl9yZWxvY19tYXAgc2hfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX1NIX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfU0hfRElSMzIgfSwKLSAgeyBCRkRfUkVMT0NfQ1RPUiwgUl9TSF9ESVIzMiB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9TSF9SRUwzMiB9LAotICB7IEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyLCBSX1NIX0RJUjhXUE4gfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENESVNQMTJCWTIsIFJfU0hfSU5EMTJXIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMiwgUl9TSF9ESVI4V1BaIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNCwgUl9TSF9ESVI4V1BMIH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfU0hfU1dJVENIOCB9LAotICB7IEJGRF9SRUxPQ19TSF9TV0lUQ0gxNiwgUl9TSF9TV0lUQ0gxNiB9LAotICB7IEJGRF9SRUxPQ19TSF9TV0lUQ0gzMiwgUl9TSF9TV0lUQ0gzMiB9LAotICB7IEJGRF9SRUxPQ19TSF9VU0VTLCBSX1NIX1VTRVMgfSwKLSAgeyBCRkRfUkVMT0NfU0hfQ09VTlQsIFJfU0hfQ09VTlQgfSwKLSAgeyBCRkRfUkVMT0NfU0hfQUxJR04sIFJfU0hfQUxJR04gfSwKLSAgeyBCRkRfUkVMT0NfU0hfQ09ERSwgUl9TSF9DT0RFIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0RBVEEsIFJfU0hfREFUQSB9LAotICB7IEJGRF9SRUxPQ19TSF9MQUJFTCwgUl9TSF9MQUJFTCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl9TSF9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9TSF9HTlVfVlRFTlRSWSB9LAotfTsKLQotLyogR2l2ZW4gYSBCRkQgcmVsb2MgY29kZSwgcmV0dXJuIHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIHRoZQotICAgY29ycmVzcG9uZGluZyBTSCBFTGYgcmVsb2MuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1zaF9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc2hfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKHNoX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZzaF9lbGZfaG93dG9fdGFibGVbKGludCkgc2hfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2l2ZW4gYW4gRUxGIHJlbG9jLCBmaWxsIGluIHRoZSBob3d0byBmaWVsZCBvZiBhIHJlbGVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zaF9lbGZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByOwotCi0gIHIgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLQotICBCRkRfQVNTRVJUIChyIDwgKHVuc2lnbmVkIGludCkgUl9TSF9tYXgpOwotICBCRkRfQVNTRVJUIChyIDwgUl9TSF9GSVJTVF9JTlZBTElEX1JFTE9DIHx8IHIgPiBSX1NIX0xBU1RfSU5WQUxJRF9SRUxPQyk7Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZzaF9lbGZfaG93dG9fdGFibGVbcl07Ci19Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIFNIIEVMRi4gIFNlZSB0aGUgY29ycmVzcG9uZGluZwotICAgZnVuY3Rpb24gaW4gY29mZi1zaC5jIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhpcyBkb2VzLiAgRklYTUU6Ci0gICBUaGVyZSBpcyBhIGxvdCBvZiBkdXBsaWNhdGlvbiBoZXJlIGJldHdlZW4gdGhpcyBjb2RlIGFuZCB0aGUgQ09GRgotICAgc3BlY2lmaWMgY29kZS4gIFRoZSBmb3JtYXQgb2YgcmVsb2NzIGFuZCBzeW1ib2xzIGlzIHdvdW5kIGRlZXBseQotICAgaW50byB0aGlzIGNvZGUsIGJ1dCBpdCB3b3VsZCBzdGlsbCBiZSBiZXR0ZXIgaWYgdGhlIGR1cGxpY2F0aW9uCi0gICBjb3VsZCBiZSBlbGltaW5hdGVkIHNvbWVob3cuICBOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCBhbHRob3VnaCBib3RoCi0gICBmdW5jdGlvbnMgdXNlIHN5bWJvbHMgbGlrZSBSX1NIX0NPREUsIHRob3NlIHN5bWJvbHMgaGF2ZSBkaWZmZXJlbnQKLSAgIHZhbHVlczsgaW4gY29mZi1zaC5jIHRoZXkgY29tZSBmcm9tIGluY2x1ZGUvY29mZi9zaC5oLCB3aGVyZWFzIGhlcmUKLSAgIHRoZXkgY29tZSBmcm9tIGVudW0gZWxmX3NoX3JlbG9jX3R5cGUgaW4gaW5jbHVkZS9lbGYvc2guaC4gICovCi0KLXN0YXRpYyBib29sZWFuIAotc2hfZWxmX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIGJvb2xlYW4gaGF2ZV9jb2RlOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLSAgICAgIHx8IHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc2VjdGlvbiwKLSAgICAgaW5pdGlhbGl6ZSB0aGUgY29va2VkIHNpemUuICAqLwotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLQotICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCSAgICAgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIGhhdmVfY29kZSA9IGZhbHNlOwotCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBsYWRkciwgcGFkZHIsIHN5bXZhbDsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGluc247Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGZuLCAqaXJlbHNjYW4sICppcmVsY291bnQ7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSBmb2ZmOwotCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfQ09ERSkKLQloYXZlX2NvZGUgPSB0cnVlOwotCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfVVNFUykKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCSAgICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogVGhlIHJfYWRkZW5kIGZpZWxkIG9mIHRoZSBSX1NIX1VTRVMgcmVsb2Mgd2lsbCBwb2ludCB1cyB0bwotICAgICAgICAgdGhlIHJlZ2lzdGVyIGxvYWQuICBUaGUgNCBpcyBiZWNhdXNlIHRoZSByX2FkZGVuZCBmaWVsZCBpcwotICAgICAgICAgY29tcHV0ZWQgYXMgdGhvdWdoIGl0IHdlcmUgYSBqdW1wIG9mZnNldCwgd2hpY2ggYXJlIGJhc2VkCi0gICAgICAgICBmcm9tIDQgYnl0ZXMgYWZ0ZXIgdGhlIGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgbGFkZHIgPSBpcmVsLT5yX29mZnNldCArIDQgKyBpcmVsLT5yX2FkZGVuZDsKLSAgICAgIGlmIChsYWRkciA+PSBzZWMtPl9yYXdfc2l6ZSkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiAweCVseDogd2FybmluZzogYmFkIFJfU0hfVVNFUyBvZmZzZXQiKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCk7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBsYWRkcik7Ci0KLSAgICAgIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QgbW92LmwgTk4sck4sIHdlIGRvbid0IGtub3cgd2hhdCB0bwotICAgICAgICAgZG8uICAqLwotICAgICAgaWYgKChpbnNuICYgMHhmMDAwKSAhPSAweGQwMDApCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IFJfU0hfVVNFUyBwb2ludHMgdG8gdW5yZWNvZ25pemVkIGluc24gMHgleCIpLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0LCBpbnNuKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSByZWdpc3RlciBpcyBiZWluZyBsb2FkZWQuICBUaGUKLSAgICAgIAkgZGlzcGxhY2VtZW50IGluIHRoZSBtb3YubCBpbnN0cnVjdGlvbiBpcyBxdWFkcnVwbGVkLiAgSXQgaXMgYQotICAgICAgCSBkaXNwbGFjZW1lbnQgZnJvbSBmb3VyIGJ5dGVzIGFmdGVyIHRoZSBtb3ZsIGluc3RydWN0aW9uLCBidXQsCi0gICAgICAJIGJlZm9yZSBhZGRpbmcgaW4gdGhlIFBDIGFkZHJlc3MsIHR3byBsZWFzdCBzaWduaWZpY2FudCBiaXRzCi0gICAgICAJIG9mIHRoZSBQQyBhcmUgY2xlYXJlZC4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzZWN0aW9uIGlzIGFsaWduZWQKLSAgICAgIAkgb24gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotICAgICAgcGFkZHIgPSBpbnNuICYgMHhmZjsKLSAgICAgIHBhZGRyICo9IDQ7Ci0gICAgICBwYWRkciArPSAobGFkZHIgKyA0KSAmfiAzOwotICAgICAgaWYgKHBhZGRyID49IHNlYy0+X3Jhd19zaXplKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgUl9TSF9VU0VTIGxvYWQgb2Zmc2V0IiksCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSByZWxvYyBmb3IgdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0aGUgcmVnaXN0ZXIgaXMKLSAgICAgICAgIGJlaW5nIGxvYWRlZC4gIFRoaXMgcmVsb2Mgd2lsbCB0ZWxsIHVzIHdoaWNoIGZ1bmN0aW9uIGlzCi0gICAgICAgICBhY3R1YWxseSBiZWluZyBjYWxsZWQuICAqLwotICAgICAgZm9yIChpcmVsZm4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxmbiA8IGlyZWxlbmQ7IGlyZWxmbisrKQotCWlmIChpcmVsZm4tPnJfb2Zmc2V0ID09IHBhZGRyCi0JICAgICYmIEVMRjMyX1JfVFlQRSAoaXJlbGZuLT5yX2luZm8pID09IChpbnQpIFJfU0hfRElSMzIpCi0JICBicmVhazsKLSAgICAgIGlmIChpcmVsZm4gPj0gaXJlbGVuZCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKF8oIiVzOiAweCVseDogd2FybmluZzogY291bGQgbm90IGZpbmQgZXhwZWN0ZWQgcmVsb2MiKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBSZWFkIHRoaXMgQkZEJ3Mgc3ltYm9scyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCXsKLQkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLQkgICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBleHRzeW1zOwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCQkgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkJICAgICAgIT0gc3ltdGFiX2hkci0+c2hfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhlIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1NZTSAoaXJlbGZuLT5yX2luZm8pIDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLQkgIC8qIEEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwKLQkJCQkgICAgZXh0c3ltcyArIEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbyksCi0JCQkJICAgICZpc3ltKTsKLQotCSAgaWYgKGlzeW0uc3Rfc2huZHggIT0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpKQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBzeW1ib2wgaW4gdW5leHBlY3RlZCBzZWN0aW9uIiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaXN5bS5zdF92YWx1ZQotCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGluZHggPSBFTEYzMl9SX1NZTSAoaXJlbGZuLT5yX2luZm8pIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkgIGggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5keF07Ci0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCSAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBhcHBlYXJzIHRvIGJlIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgICBzeW1ib2wuICBKdXN0IGlnbm9yZSBpdC0taXQgd2lsbCBiZSBjYXVnaHQgYnkgdGhlCi0gICAgICAgICAgICAgICAgIHJlZ3VsYXIgcmVsb2MgcHJvY2Vzc2luZy4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3ltdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JfQotCi0gICAgICBzeW12YWwgKz0gYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBwYWRkcik7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGZ1bmN0aW9uIGNhbGwgY2FuIGJlIHNob3J0ZW5lZC4gICovCi0gICAgICBmb2ZmID0gKHN5bXZhbAotCSAgICAgIC0gKGlyZWwtPnJfb2Zmc2V0Ci0JCSArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICsgNCkpOwotICAgICAgaWYgKGZvZmYgPCAtMHgxMDAwIHx8IGZvZmYgPj0gMHgxMDAwKQotCXsKLQkgIC8qIEFmdGVyIGFsbCB0aGF0IHdvcmssIHdlIGNhbid0IHNob3J0ZW4gdGhpcyBmdW5jdGlvbiBjYWxsLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogU2hvcnRlbiB0aGUgZnVuY3Rpb24gY2FsbC4gICovCi0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0gICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0gICAgICAvKiBSZXBsYWNlIHRoZSBqc3Igd2l0aCBhIGJzci4gICovCi0KLSAgICAgIC8qIENoYW5nZSB0aGUgUl9TSF9VU0VTIHJlbG9jIGludG8gYW4gUl9TSF9JTkQxMlcgcmVsb2MsIGFuZAotICAgICAgICAgcmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuICAqLwotICAgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbGZuLT5yX2luZm8pLCBSX1NIX0lORDEyVyk7Ci0gICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgLyogSWYgdGhpcyBuZWVkcyB0byBiZSBjaGFuZ2VkIGJlY2F1c2Ugb2YgZnV0dXJlIHJlbGF4aW5nLAotICAgICAgICAgICAgIGl0IHdpbGwgYmUgaGFuZGxlZCBoZXJlIGxpa2Ugb3RoZXIgaW50ZXJuYWwgSU5EMTJXCi0gICAgICAgICAgICAgcmVsb2NzLiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsCi0JCSAgICAgIDB4YjAwMCB8ICgoZm9mZiA+PiAxKSAmIDB4ZmZmKSwKLQkJICAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGNhbid0IGZ1bGx5IHJlc29sdmUgdGhpcyB5ZXQsIGJlY2F1c2UgdGhlIGV4dGVybmFsCi0gICAgICAgICAgICAgc3ltYm9sIHZhbHVlIG1heSBiZSBjaGFuZ2VkIGJ5IGZ1dHVyZSByZWxheGluZy4gIFdlIGxldAotICAgICAgICAgICAgIHRoZSBmaW5hbCBsaW5rIHBoYXNlIGhhbmRsZSBpdC4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLCAweGIwMDAsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCX0KLQotICAgICAgLyogU2VlIGlmIHRoZXJlIGlzIGFub3RoZXIgUl9TSF9VU0VTIHJlbG9jIHJlZmVycmluZyB0byB0aGUgc2FtZQotICAgICAgICAgcmVnaXN0ZXIgbG9hZC4gICovCi0gICAgICBmb3IgKGlyZWxzY2FuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsc2NhbiA8IGlyZWxlbmQ7IGlyZWxzY2FuKyspCi0JaWYgKEVMRjMyX1JfVFlQRSAoaXJlbHNjYW4tPnJfaW5mbykgPT0gKGludCkgUl9TSF9VU0VTCi0JICAgICYmIGxhZGRyID09IGlyZWxzY2FuLT5yX29mZnNldCArIDQgKyBpcmVsc2Nhbi0+cl9hZGRlbmQpCi0JICBicmVhazsKLSAgICAgIGlmIChpcmVsc2NhbiA8IGlyZWxlbmQpCi0JewotCSAgLyogU29tZSBvdGhlciBmdW5jdGlvbiBjYWxsIGRlcGVuZHMgdXBvbiB0aGlzIHJlZ2lzdGVyIGxvYWQsCi0JICAgICBhbmQgd2UgaGF2ZSBub3QgeWV0IGNvbnZlcnRlZCB0aGF0IGZ1bmN0aW9uIGNhbGwuCi0JICAgICBJbmRlZWQsIHdlIG1heSBuZXZlciBiZSBhYmxlIHRvIGNvbnZlcnQgaXQuICBUaGVyZSBpcwotCSAgICAgbm90aGluZyBlbHNlIHdlIGNhbiBkbyBhdCB0aGlzIHBvaW50LiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgYSBSX1NIX0NPVU5UIHJlbG9jIG9uIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUKLSAgICAgICAgIGZ1bmN0aW9uIGFkZHJlc3MgaXMgc3RvcmVkLiAgRG8gdGhpcyBiZWZvcmUgZGVsZXRpbmcgYW55Ci0gICAgICAgICBieXRlcywgdG8gYXZvaWQgY29uZnVzaW9uIGFib3V0IHRoZSBhZGRyZXNzLiAgKi8KLSAgICAgIGZvciAoaXJlbGNvdW50ID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsY291bnQgPCBpcmVsZW5kOyBpcmVsY291bnQrKykKLQlpZiAoaXJlbGNvdW50LT5yX29mZnNldCA9PSBwYWRkcgotCSAgICAmJiBFTEYzMl9SX1RZUEUgKGlyZWxjb3VudC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0NPVU5UKQotCSAgYnJlYWs7Ci0KLSAgICAgIC8qIERlbGV0ZSB0aGUgcmVnaXN0ZXIgbG9hZC4gICovCi0gICAgICBpZiAoISBzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGxhZGRyLCAyKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCBqdXN0IGluIGNhc2UgaXQgcGVybWl0cyBzb21lCi0gICAgICAgICBvdGhlciBmdW5jdGlvbiBjYWxsIHRvIGNvbWUgd2l0aGluIHJhbmdlLCB3ZSBzaG91bGQgcmVsYXgKLSAgICAgICAgIGFnYWluLiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotICAgICAgKmFnYWluID0gdHJ1ZTsKLQotICAgICAgLyogTm93IGNoZWNrIHdoZXRoZXIgd2UgZ290IGEgQ09VTlQgcmVsb2MuICAqLwotICAgICAgaWYgKGlyZWxjb3VudCA+PSBpcmVsZW5kKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCBDT1VOVCByZWxvYyIpLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBudW1iZXIgb2YgdXNlcyBpcyBzdG9yZWQgaW4gdGhlIHJfYWRkZW5kIGZpZWxkLiAgV2UndmUKLSAgICAgICAgIGp1c3QgZGVsZXRlZCBvbmUuICAqLwotICAgICAgaWYgKGlyZWxjb3VudC0+cl9hZGRlbmQgPT0gMCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBjb3VudCIpLAotCQkJCSAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJICAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLS1pcmVsY291bnQtPnJfYWRkZW5kOwotCi0gICAgICAvKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSB1c2VzLCB3ZSBjYW4gZGVsZXRlIHRoZSBhZGRyZXNzLiAgUmVsb2FkCi0gICAgICAgICB0aGUgYWRkcmVzcyBmcm9tIGlyZWxmbiwgaW4gY2FzZSBpdCB3YXMgY2hhbmdlZCBieSB0aGUKLSAgICAgICAgIHByZXZpb3VzIGNhbGwgdG8gc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcy4gICovCi0gICAgICBpZiAoaXJlbGNvdW50LT5yX2FkZGVuZCA9PSAwKQotCXsKLQkgIGlmICghIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgaXJlbGZuLT5yX29mZnNldCwgNCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgLyogV2UndmUgZG9uZSBhbGwgd2UgY2FuIHdpdGggdGhhdCBmdW5jdGlvbiBjYWxsLiAgKi8KLSAgICB9Ci0KLSAgLyogTG9vayBmb3IgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zIHRoYXQgd2UgY2FuIGFsaWduIG9uIGZvdXIKLSAgICAgYnl0ZSBib3VuZGFyaWVzLiAgKi8KLSAgaWYgKGhhdmVfY29kZSkKLSAgICB7Ci0gICAgICBib29sZWFuIHN3YXBwZWQ7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIHNoX2VsZl9hbGlnbl9sb2FkcyAoYWJmZCwgc2VjLCBpbnRlcm5hbF9yZWxvY3MsIGNvbnRlbnRzLAotCQkJCSZzd2FwcGVkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKHN3YXBwZWQpCi0JewotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2V4dHN5bXMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCX0KLSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERlbGV0ZSBzb21lIGJ5dGVzIGZyb20gYSBzZWN0aW9uIHdoaWxlIHJlbGF4aW5nLiAgRklYTUU6IFRoZXJlIGlzIGEKLSAgIGxvdCBvZiBkdXBsaWNhdGlvbiBiZXR3ZWVuIHRoaXMgZnVuY3Rpb24gYW5kIHNoX3JlbGF4X2RlbGV0ZV9ieXRlcwotICAgaW4gY29mZi1zaC5jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWRkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXM7Ci0gIGludCBzaG5keCwgaW5kZXg7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFsaWduOwotICBiZmRfdm1hIHRvYWRkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwotICBhc2VjdGlvbiAqbzsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCi0gIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0gIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0KLSAgLyogVGhlIGRlbGV0aW9uIG11c3Qgc3RvcCBhdCB0aGUgbmV4dCBBTElHTiByZWxvYyBmb3IgYW4gYWxpZ21lbnQKLSAgICAgcG93ZXIgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgZGVsZXRpbmcuICAqLwotCi0gIGlyZWxhbGlnbiA9IE5VTEw7Ci0gIHRvYWRkciA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gIGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7Ci0gIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0FMSUdOCi0JICAmJiBpcmVsLT5yX29mZnNldCA+IGFkZHIKLQkgICYmIGNvdW50IDwgKDEgPDwgaXJlbC0+cl9hZGRlbmQpKQotCXsKLQkgIGlyZWxhbGlnbiA9IGlyZWw7Ci0JICB0b2FkZHIgPSBpcmVsLT5yX29mZnNldDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0gIG1lbW1vdmUgKGNvbnRlbnRzICsgYWRkciwgY29udGVudHMgKyBhZGRyICsgY291bnQsIHRvYWRkciAtIGFkZHIgLSBjb3VudCk7Ci0gIGlmIChpcmVsYWxpZ24gPT0gTlVMTCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSAtPSBjb3VudDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0jZGVmaW5lIE5PUF9PUENPREUgKDB4MDAwOSkKLQotICAgICAgQkZEX0FTU0VSVCAoKGNvdW50ICYgMSkgPT0gMCk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMikKLQliZmRfcHV0XzE2IChhYmZkLCBOT1BfT1BDT0RFLCBjb250ZW50cyArIHRvYWRkciAtIGNvdW50ICsgaSk7Ci0gICAgfQotCi0gIC8qIEFkanVzdCBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAoaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIG5yYWRkciwgc3RvcDsKLSAgICAgIGJmZF92bWEgc3RhcnQgPSAwOwotICAgICAgaW50IGluc24gPSAwOwotICAgICAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0gICAgICBpbnQgb2ZmLCBhZGp1c3QsIG9pbnNuOwotICAgICAgYmZkX3NpZ25lZF92bWEgdm9mZiA9IDA7Ci0gICAgICBib29sZWFuIG92ZXJmbG93OwotCi0gICAgICAvKiBHZXQgdGhlIG5ldyByZWxvYyBhZGRyZXNzLiAgKi8KLSAgICAgIG5yYWRkciA9IGlyZWwtPnJfb2Zmc2V0OwotICAgICAgaWYgKChpcmVsLT5yX29mZnNldCA+IGFkZHIKLQkgICAmJiBpcmVsLT5yX29mZnNldCA8IHRvYWRkcikKLQkgIHx8IChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9BTElHTgotCSAgICAgICYmIGlyZWwtPnJfb2Zmc2V0ID09IHRvYWRkcikpCi0JbnJhZGRyIC09IGNvdW50OwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyByZWxvYyB3YXMgZm9yIHRoZSBieXRlcyB3ZSBoYXZlIGRlbGV0ZWQsIGluIHdoaWNoCi0JIGNhc2Ugd2Ugbm8gbG9uZ2VyIGNhcmUgYWJvdXQgaXQuICBEb24ndCBkZWxldGUgcmVsb2NzIHdoaWNoCi0JIHJlcHJlc2VudCBhZGRyZXNzZXMsIHRob3VnaC4gICovCi0gICAgICBpZiAoaXJlbC0+cl9vZmZzZXQgPj0gYWRkcgotCSAgJiYgaXJlbC0+cl9vZmZzZXQgPCBhZGRyICsgY291bnQKLQkgICYmIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0FMSUdOCi0JICAmJiBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9TSF9DT0RFCi0JICAmJiBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9TSF9EQVRBCi0JICAmJiBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9TSF9MQUJFTCkKLQlpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCSAgICAgKGludCkgUl9TSF9OT05FKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jLCBzZWUgaWYgdGhlIHJhbmdlIGl0IGNvdmVycwotICAgICAgICAgaW5jbHVkZXMgdGhlIGJ5dGVzIHdlIGhhdmUgZGVsZXRlZC4gICovCi0gICAgICBzd2l0Y2ggKChlbnVtIGVsZl9zaF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9ESVI4V1BOOgotCWNhc2UgUl9TSF9JTkQxMlc6Ci0JY2FzZSBSX1NIX0RJUjhXUFo6Ci0JY2FzZSBSX1NIX0RJUjhXUEw6Ci0JICBzdGFydCA9IGlyZWwtPnJfb2Zmc2V0OwotCSAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgc3dpdGNoICgoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pKQotCXsKLQlkZWZhdWx0OgotCSAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0RJUjMyOgotCSAgLyogSWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgaW4gdGhpcwotICAgICAgICAgICAgIHNlY3Rpb24sIGFuZCB0aGUgc3ltYm9sIHdpbGwgbm90IGJlIGFkanVzdGVkIGJlbG93LCB3ZQotICAgICAgICAgICAgIG11c3QgY2hlY2sgdGhlIGFkZGVuZCB0byBzZWUgaXQgd2lsbCBwdXQgdGhlIHZhbHVlIGluCi0gICAgICAgICAgICAgcmFuZ2UgdG8gYmUgYWRqdXN0ZWQsIGFuZCBoZW5jZSBtdXN0IGJlIGNoYW5nZWQuICAqLwotCSAgaWYgKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pIDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwKLQkJCQkJZXh0c3ltcyArIEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkmc3ltKTsKLQkgICAgICBpZiAoc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JCSAgJiYgKHN5bS5zdF92YWx1ZSA8PSBhZGRyCi0JCSAgICAgIHx8IHN5bS5zdF92YWx1ZSA+PSB0b2FkZHIpKQotCQl7Ci0JCSAgYmZkX3ZtYSB2YWw7Ci0KLQkJICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JCSAgdmFsICs9IHN5bS5zdF92YWx1ZTsKLQkJICBpZiAodmFsID4gYWRkciAmJiB2YWwgPCB0b2FkZHIpCi0JCSAgICBiZmRfcHV0XzMyIChhYmZkLCB2YWwgLSBjb3VudCwgY29udGVudHMgKyBucmFkZHIpOwotCQl9Ci0JICAgIH0KLQkgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9ESVI4V1BOOgotCSAgb2ZmID0gaW5zbiAmIDB4ZmY7Ci0JICBpZiAob2ZmICYgMHg4MCkKLQkgICAgb2ZmIC09IDB4MTAwOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIDQgKyBvZmYgKiAyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0lORDEyVzoKLQkgIGlmIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICBzdGFydCA9IHN0b3AgPSBhZGRyOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb2ZmID0gaW5zbiAmIDB4ZmZmOwotCSAgICAgIGlmIChvZmYgJiAweDgwMCkKLQkJb2ZmIC09IDB4MTAwMDsKLQkgICAgICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgNCArIG9mZiAqIDIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9ESVI4V1BaOgotCSAgb2ZmID0gaW5zbiAmIDB4ZmY7Ci0JICBzdG9wID0gc3RhcnQgKyA0ICsgb2ZmICogMjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0RJUjhXUEw6Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIHN0b3AgPSAoc3RhcnQgJn4gKGJmZF92bWEpIDMpICsgNCArIG9mZiAqIDQ7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9TV0lUQ0g4OgotCWNhc2UgUl9TSF9TV0lUQ0gxNjoKLQljYXNlIFJfU0hfU1dJVENIMzI6Ci0JICAvKiBUaGVzZSByZWxvY3MgdHlwZXMgcmVwcmVzZW50Ci0JICAgICAgIC53b3JkIEwyLUwxCi0JICAgICBUaGUgcl9hZGRlbmQgZmllbGQgaG9sZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVsb2MKLQkgICAgIGFkZHJlc3MgYW5kIEwxLiAgVGhhdCBpcyB0aGUgc3RhcnQgb2YgdGhlIHJlbG9jLCBhbmQKLQkgICAgIGFkZGluZyBpbiB0aGUgY29udGVudHMgZ2l2ZXMgdXMgdGhlIHRvcC4gIFdlIG11c3QgYWRqdXN0Ci0JICAgICBib3RoIHRoZSByX29mZnNldCBmaWVsZCBhbmQgdGhlIHNlY3Rpb24gY29udGVudHMuCi0JICAgICBOLkIuIGluIGdhcyAvIGNvZmYgYmZkLCB0aGUgZWxmIGJmZCByX2FkZGVuZCBpcyBjYWxsZWQgcl9vZmZzZXQsCi0JICAgICBhbmQgdGhlIGVsZiBiZmQgcl9vZmZzZXQgaXMgY2FsbGVkIHJfdmFkZHIuICAqLwotCi0JICBzdG9wID0gaXJlbC0+cl9vZmZzZXQ7Ci0JICBzdGFydCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdG9wIC0gKGxvbmcpIGlyZWwtPnJfYWRkZW5kKTsKLQotCSAgaWYgKHN0YXJ0ID4gYWRkcgotCSAgICAgICYmIHN0YXJ0IDwgdG9hZGRyCi0JICAgICAgJiYgKHN0b3AgPD0gYWRkciB8fCBzdG9wID49IHRvYWRkcikpCi0JICAgIGlyZWwtPnJfYWRkZW5kICs9IGNvdW50OwotCSAgZWxzZSBpZiAoc3RvcCA+IGFkZHIKLQkJICAgJiYgc3RvcCA8IHRvYWRkcgotCQkgICAmJiAoc3RhcnQgPD0gYWRkciB8fCBzdGFydCA+PSB0b2FkZHIpKQotCSAgICBpcmVsLT5yX2FkZGVuZCAtPSBjb3VudDsKLQotCSAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX1NXSVRDSDE2KQotCSAgICB2b2ZmID0gYmZkX2dldF9zaWduZWRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIGVsc2UgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX1NXSVRDSDgpCi0JICAgIHZvZmYgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgIGVsc2UKLQkgICAgdm9mZiA9IGJmZF9nZXRfc2lnbmVkXzMyIChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgdm9mZik7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1VTRVM6Ci0JICBzdGFydCA9IGlyZWwtPnJfb2Zmc2V0OwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydAotCQkJICAgICsgKGxvbmcpIGlyZWwtPnJfYWRkZW5kCi0JCQkgICAgKyA0KTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHN0YXJ0ID4gYWRkcgotCSAgJiYgc3RhcnQgPCB0b2FkZHIKLQkgICYmIChzdG9wIDw9IGFkZHIgfHwgc3RvcCA+PSB0b2FkZHIpKQotCWFkanVzdCA9IGNvdW50OwotICAgICAgZWxzZSBpZiAoc3RvcCA+IGFkZHIKLQkgICAgICAgJiYgc3RvcCA8IHRvYWRkcgotCSAgICAgICAmJiAoc3RhcnQgPD0gYWRkciB8fCBzdGFydCA+PSB0b2FkZHIpKQotCWFkanVzdCA9IC0gY291bnQ7Ci0gICAgICBlbHNlCi0JYWRqdXN0ID0gMDsKLQotICAgICAgaWYgKGFkanVzdCAhPSAwKQotCXsKLQkgIG9pbnNuID0gaW5zbjsKLQkgIG92ZXJmbG93ID0gZmFsc2U7Ci0JICBzd2l0Y2ggKChlbnVtIGVsZl9zaF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfRElSOFdQTjoKLQkgICAgY2FzZSBSX1NIX0RJUjhXUFo6Ci0JICAgICAgaW5zbiArPSBhZGp1c3QgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfSU5EMTJXOgotCSAgICAgIGluc24gKz0gYWRqdXN0IC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmMDAwKSAhPSAoaW5zbiAmIDB4ZjAwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0RJUjhXUEw6Ci0JICAgICAgQkZEX0FTU0VSVCAoYWRqdXN0ID09IGNvdW50IHx8IGNvdW50ID49IDQpOwotCSAgICAgIGlmIChjb3VudCA+PSA0KQotCQlpbnNuICs9IGFkanVzdCAvIDQ7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKChpcmVsLT5yX29mZnNldCAmIDMpID09IDApCi0JCSAgICArK2luc247Ci0JCX0KLQkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1NXSVRDSDE2OgotCSAgICAgIHZvZmYgKz0gYWRqdXN0OwotCSAgICAgIGlmICh2b2ZmIDwgLSAweDgwMDAgfHwgdm9mZiA+PSAweDgwMDApCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0X3NpZ25lZF8xNiAoYWJmZCwgdm9mZiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9TV0lUQ0gzMjoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBiZmRfcHV0X3NpZ25lZF8zMiAoYWJmZCwgdm9mZiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9VU0VTOgotCSAgICAgIGlyZWwtPnJfYWRkZW5kICs9IGFkanVzdDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAob3ZlcmZsb3cpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogMHglbHg6IGZhdGFsOiByZWxvYyBvdmVyZmxvdyB3aGlsZSByZWxheGluZyIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0KSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpcmVsLT5yX29mZnNldCA9IG5yYWRkcjsKLSAgICB9Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgb3RoZXIgc2VjdGlvbnMuICBJZiB0aGVyZSBjb250YWluIGFueSBJTU0zMgotICAgICByZWxvY3MgYWdhaW5zdCBpbnRlcm5hbCBzeW1ib2xzIHdoaWNoIHdlIGFyZSBub3QgZ29pbmcgdG8gYWRqdXN0Ci0gICAgIGJlbG93LCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlIGFkZGVuZHMuICAqLwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxzY2FuLCAqaXJlbHNjYW5lbmQ7Ci0gICAgICBiZmRfYnl0ZSAqb2NvbnRlbnRzOwotCi0gICAgICBpZiAobyA9PSBzZWMKLQkgIHx8IChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgfHwgby0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgYWx3YXlzIGNhY2hlIHRoZSByZWxvY3MuICBQZXJoYXBzLCBpZiBpbmZvLT5rZWVwX21lbW9yeSBpcwotICAgICAgICAgZmFsc2UsIHdlIHNob3VsZCBmcmVlIHRoZW0sIGlmIHdlIGFyZSBwZXJtaXR0ZWQgdG8sIHdoZW4gd2UKLSAgICAgICAgIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgKGFiZmQsIG8sIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkJICB0cnVlKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBvY29udGVudHMgPSBOVUxMOwotICAgICAgaXJlbHNjYW5lbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBvLT5yZWxvY19jb3VudDsKLSAgICAgIGZvciAoaXJlbHNjYW4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxzY2FuIDwgaXJlbHNjYW5lbmQ7IGlyZWxzY2FuKyspCi0JewotCSAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0KLQkgIC8qIER3YXJmIGxpbmUgbnVtYmVycyB1c2UgUl9TSF9TV0lUQ0gzMiByZWxvY3MuICAqLwotCSAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbHNjYW4tPnJfaW5mbykgPT0gKGludCkgUl9TSF9TV0lUQ0gzMikKLQkgICAgewotCSAgICAgIGJmZF92bWEgc3RhcnQsIHN0b3A7Ci0JICAgICAgYmZkX3NpZ25lZF92bWEgdm9mZjsKLQotCSAgICAgIGlmIChvY29udGVudHMgPT0gTlVMTCkKLQkJewotCQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkJICAgIG9jb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50czsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGFsd2F5cyBjYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICBQZXJoYXBzLCBpZiBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgZnJlZSB0aGVtLCBpZiB3ZSBhcmUgcGVybWl0dGVkIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gd2UgbGVhdmUgc2hfY29mZl9yZWxheF9zZWN0aW9uLiAgKi8KLQkJICAgICAgb2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG8tPl9yYXdfc2l6ZSk7Ci0JCSAgICAgIGlmIChvY29udGVudHMgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLCBvY29udGVudHMsCi0JCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJCQkgICAgICBvLT5fcmF3X3NpemUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHMgPSBvY29udGVudHM7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHN0b3AgPSBpcmVsc2Nhbi0+cl9vZmZzZXQ7Ci0JICAgICAgc3RhcnQKLQkJPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RvcCAtIChsb25nKSBpcmVsc2Nhbi0+cl9hZGRlbmQpOwotCi0JICAgICAgLyogU1RPUCBpcyBpbiBhIGRpZmZlcmVudCBzZWN0aW9uLCBzbyBpdCB3b24ndCBjaGFuZ2UuICAqLwotCSAgICAgIGlmIChzdGFydCA+IGFkZHIgJiYgc3RhcnQgPCB0b2FkZHIpCi0JCWlyZWxzY2FuLT5yX2FkZGVuZCArPSBjb3VudDsKLQotCSAgICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfb2Zmc2V0KTsKLQkgICAgICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgdm9mZik7Ci0KLQkgICAgICBpZiAoc3RhcnQgPiBhZGRyCi0JCSAgJiYgc3RhcnQgPCB0b2FkZHIKLQkJICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKLQkJYmZkX3B1dF9zaWduZWRfMzIgKGFiZmQsIHZvZmYgKyBjb3VudCwKLQkJCQkgICBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOwotCSAgICAgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCi0JCSAgICAgICAmJiBzdG9wIDwgdG9hZGRyCi0JCSAgICAgICAmJiAoc3RhcnQgPD0gYWRkciB8fCBzdGFydCA+PSB0b2FkZHIpKQotCQliZmRfcHV0X3NpZ25lZF8zMiAoYWJmZCwgdm9mZiAtIGNvdW50LAotCQkJCSAgIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX29mZnNldCk7Ci0JICAgIH0KLQotCSAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbHNjYW4tPnJfaW5mbykgIT0gKGludCkgUl9TSF9ESVIzMikKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChFTEYzMl9SX1NZTSAoaXJlbHNjYW4tPnJfaW5mbykgPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgY29udGludWU7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwKLQkJCQkgICAgZXh0c3ltcyArIEVMRjMyX1JfU1lNIChpcmVsc2Nhbi0+cl9pbmZvKSwKLQkJCQkgICAgJnN5bSk7Ci0KLQkgIGlmIChzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICAgICAmJiAoc3ltLnN0X3ZhbHVlIDw9IGFkZHIKLQkJICB8fCBzeW0uc3RfdmFsdWUgPj0gdG9hZGRyKSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgaWYgKG9jb250ZW50cyA9PSBOVUxMKQotCQl7Ci0JCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCQkgICAgb2NvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogV2UgYWx3YXlzIGNhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmhhcHMsIGlmIGluZm8tPmtlZXBfbWVtb3J5IGlzIGZhbHNlLCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBmcmVlIHRoZW0sIGlmIHdlIGFyZSBwZXJtaXR0ZWQgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB3ZSBsZWF2ZSBzaF9jb2ZmX3JlbGF4X3NlY3Rpb24uICAqLwotCQkgICAgICBvY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoby0+X3Jhd19zaXplKTsKLQkJICAgICAgaWYgKG9jb250ZW50cyA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8sIG9jb250ZW50cywKLQkJCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkJCSAgICAgIG8tPl9yYXdfc2l6ZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50cyA9IG9jb250ZW50czsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfb2Zmc2V0KTsKLQkgICAgICB2YWwgKz0gc3ltLnN0X3ZhbHVlOwotCSAgICAgIGlmICh2YWwgPiBhZGRyICYmIHZhbCA8IHRvYWRkcikKLQkJYmZkX3B1dF8zMiAoYWJmZCwgdmFsIC0gY291bnQsCi0JCQkgICAgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfb2Zmc2V0KTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQWRqdXN0IHRoZSBsb2NhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmIGlzeW0uc3RfdmFsdWUgPiBhZGRyCi0JICAmJiBpc3ltLnN0X3ZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIGlzeW0uc3RfdmFsdWUgLT0gY291bnQ7Ci0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmaXN5bSwgZXN5bSk7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYWRqdXN0IHRoZSBnbG9iYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSk7Ci0gIGZvciAoaW5kZXggPSAwOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpbmRleCsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0gICAgICBzeW1faGFzaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmRleF07Ci0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgKChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCAoc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA+IGFkZHIKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpCi0JewotCSAgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSAtPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gIC8qIFNlZSBpZiB3ZSBjYW4gbW92ZSB0aGUgQUxJR04gcmVsb2MgZm9yd2FyZC4gIFdlIGhhdmUgYWRqdXN0ZWQKLSAgICAgcl9vZmZzZXQgZm9yIGl0IGFscmVhZHkuICAqLwotICBpZiAoaXJlbGFsaWduICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3ZtYSBhbGlnbnRvLCBhbGlnbmFkZHI7Ci0KLSAgICAgIGFsaWdudG8gPSBCRkRfQUxJR04gKHRvYWRkciwgMSA8PCBpcmVsYWxpZ24tPnJfYWRkZW5kKTsKLSAgICAgIGFsaWduYWRkciA9IEJGRF9BTElHTiAoaXJlbGFsaWduLT5yX29mZnNldCwKLQkJCSAgICAgMSA8PCBpcmVsYWxpZ24tPnJfYWRkZW5kKTsKLSAgICAgIGlmIChhbGlnbnRvICE9IGFsaWduYWRkcikKLQl7Ci0JICAvKiBUYWlsIHJlY3Vyc2lvbi4gICovCi0JICByZXR1cm4gc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhbGlnbmFkZHIsCi0JCQkJCSAgICBhbGlnbnRvIC0gYWxpZ25hZGRyKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIGZvciBsb2FkcyBhbmQgc3RvcmVzIHdoaWNoIHdlIGNhbiBhbGlnbiB0byBmb3VyIGJ5dGUKLSAgIGJvdW5kYXJpZXMuICBUaGlzIGlzIGxpa2Ugc2hfYWxpZ25fbG9hZHMgaW4gY29mZi1zaC5jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2VsZl9hbGlnbl9sb2FkcyAoYWJmZCwgc2VjLCBpbnRlcm5hbF9yZWxvY3MsIGNvbnRlbnRzLCBwc3dhcHBlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJvb2xlYW4gKnBzd2FwcGVkOwotewotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF92bWEgKmxhYmVscyA9IE5VTEw7Ci0gIGJmZF92bWEgKmxhYmVsLCAqbGFiZWxfZW5kOwotCi0gICpwc3dhcHBlZCA9IGZhbHNlOwotCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gIC8qIEdldCBhbGwgdGhlIGFkZHJlc3NlcyB3aXRoIGxhYmVscyBvbiB0aGVtLiAgKi8KLSAgbGFiZWxzID0gKGJmZF92bWEgKikgYmZkX21hbGxvYyAoc2VjLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYmZkX3ZtYSkpOwotICBpZiAobGFiZWxzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGxhYmVsX2VuZCA9IGxhYmVsczsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9MQUJFTCkKLQl7Ci0JICAqbGFiZWxfZW5kID0gaXJlbC0+cl9vZmZzZXQ7Ci0JICArK2xhYmVsX2VuZDsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdGUgdGhhdCB0aGUgYXNzZW1ibGVyIGN1cnJlbnRseSBhbHdheXMgb3V0cHV0cyByZWxvY3MgaW4KLSAgICAgYWRkcmVzcyBvcmRlci4gIElmIHRoYXQgZXZlciBjaGFuZ2VzLCB0aGlzIGNvZGUgd2lsbCBuZWVkIHRvIHNvcnQKLSAgICAgdGhlIGxhYmVsIHZhbHVlcyBhbmQgdGhlIHJlbG9jcy4gICovCi0KLSAgbGFiZWwgPSBsYWJlbHM7Ci0KLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgc3RhcnQsIHN0b3A7Ci0KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9TSF9DT0RFKQotCWNvbnRpbnVlOwotCi0gICAgICBzdGFydCA9IGlyZWwtPnJfb2Zmc2V0OwotCi0gICAgICBmb3IgKGlyZWwrKzsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLQlpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfREFUQSkKLQkgIGJyZWFrOwotICAgICAgaWYgKGlyZWwgPCBpcmVsZW5kKQotCXN0b3AgPSBpcmVsLT5yX29mZnNldDsKLSAgICAgIGVsc2UKLQlzdG9wID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgICAgIGlmICghIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuIChhYmZkLCBzZWMsIGNvbnRlbnRzLCBzaF9lbGZfc3dhcF9pbnNucywKLQkJCQkgICAgIChQVFIpIGludGVybmFsX3JlbG9jcywgJmxhYmVsLAotCQkJCSAgICAgbGFiZWxfZW5kLCBzdGFydCwgc3RvcCwgcHN3YXBwZWQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmcmVlIChsYWJlbHMpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAobGFiZWxzICE9IE5VTEwpCi0gICAgZnJlZSAobGFiZWxzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTd2FwIHR3byBTSCBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIGxpa2Ugc2hfc3dhcF9pbnNucyBpbiBjb2ZmLXNoLmMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX3N3YXBfaW5zbnMgKGFiZmQsIHNlYywgcmVsb2NzLCBjb250ZW50cywgYWRkcikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgcmVsb2NzOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSByZWxvY3M7Ci0gIHVuc2lnbmVkIHNob3J0IGkxLCBpMjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotCi0gIC8qIFN3YXAgdGhlIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLiAgKi8KLSAgaTEgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIpOwotICBpMiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgYWRkciArIDIpOwotICBiZmRfcHV0XzE2IChhYmZkLCBpMiwgY29udGVudHMgKyBhZGRyKTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgaTEsIGNvbnRlbnRzICsgYWRkciArIDIpOwotCi0gIC8qIEFkanVzdCBhbGwgcmVsb2MgYWRkcmVzc2VzLiAgKi8KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBlbnVtIGVsZl9zaF9yZWxvY190eXBlIHR5cGU7Ci0gICAgICBpbnQgYWRkOwotCi0gICAgICAvKiBUaGVyZSBhcmUgYSBmZXcgc3BlY2lhbCB0eXBlcyBvZiByZWxvY3MgdGhhdCB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICBhZGp1c3QuICBUaGVzZSByZWxvY3MgZG8gbm90IGFwcGx5IHRvIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYsCi0gICAgICAgICBidXQgYXJlIG9ubHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGRyZXNzLiAgKi8KLSAgICAgIHR5cGUgPSAoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pOwotICAgICAgaWYgKHR5cGUgPT0gUl9TSF9BTElHTgotCSAgfHwgdHlwZSA9PSBSX1NIX0NPREUKLQkgIHx8IHR5cGUgPT0gUl9TSF9EQVRBCi0JICB8fCB0eXBlID09IFJfU0hfTEFCRUwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIGFuIFJfU0hfVVNFUyByZWxvYyBwb2ludHMgdG8gb25lIG9mIHRoZSBhZGRyZXNzZXMgYmVpbmcKLSAgICAgICAgIHN3YXBwZWQsIHdlIG11c3QgYWRqdXN0IGl0LiAgSXQgd291bGQgYmUgaW5jb3JyZWN0IHRvIGRvIHRoaXMKLSAgICAgICAgIGZvciBhIGp1bXAsIHRob3VnaCwgc2luY2Ugd2Ugd2FudCB0byBleGVjdXRlIGJvdGgKLSAgICAgICAgIGluc3RydWN0aW9ucyBhZnRlciB0aGUganVtcC4gIChXZSBoYXZlIGF2b2lkZWQgc3dhcHBpbmcKLSAgICAgICAgIGFyb3VuZCBhIGxhYmVsLCBzbyB0aGUganVtcCB3aWxsIG5vdCB3aW5kIHVwIGV4ZWN1dGluZyBhbgotICAgICAgICAgaW5zdHJ1Y3Rpb24gaXQgc2hvdWxkbid0KS4gICovCi0gICAgICBpZiAodHlwZSA9PSBSX1NIX1VTRVMpCi0JewotCSAgYmZkX3ZtYSBvZmY7Ci0KLQkgIG9mZiA9IGlyZWwtPnJfb2Zmc2V0ICsgNCArIGlyZWwtPnJfYWRkZW5kOwotCSAgaWYgKG9mZiA9PSBhZGRyKQotCSAgICBpcmVsLT5yX29mZnNldCArPSAyOwotCSAgZWxzZSBpZiAob2ZmID09IGFkZHIgKyAyKQotCSAgICBpcmVsLT5yX29mZnNldCAtPSAyOwotCX0KLQotICAgICAgaWYgKGlyZWwtPnJfb2Zmc2V0ID09IGFkZHIpCi0JewotCSAgaXJlbC0+cl9vZmZzZXQgKz0gMjsKLQkgIGFkZCA9IC0yOwotCX0KLSAgICAgIGVsc2UgaWYgKGlyZWwtPnJfb2Zmc2V0ID09IGFkZHIgKyAyKQotCXsKLQkgIGlyZWwtPnJfb2Zmc2V0IC09IDI7Ci0JICBhZGQgPSAyOwotCX0KLSAgICAgIGVsc2UKLQlhZGQgPSAwOwotCi0gICAgICBpZiAoYWRkICE9IDApCi0JewotCSAgYmZkX2J5dGUgKmxvYzsKLQkgIHVuc2lnbmVkIHNob3J0IGluc24sIG9pbnNuOwotCSAgYm9vbGVhbiBvdmVyZmxvdzsKLQotCSAgbG9jID0gY29udGVudHMgKyBpcmVsLT5yX29mZnNldDsKLQkgIG92ZXJmbG93ID0gZmFsc2U7Ci0JICBzd2l0Y2ggKHR5cGUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfRElSOFdQTjoKLQkgICAgY2FzZSBSX1NIX0RJUjhXUFo6Ci0JICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7Ci0JICAgICAgb2luc24gPSBpbnNuOwotCSAgICAgIGluc24gKz0gYWRkIC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9JTkQxMlc6Ci0JICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7Ci0JICAgICAgb2luc24gPSBpbnNuOwotCSAgICAgIGluc24gKz0gYWRkIC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmMDAwKSAhPSAoaW5zbiAmIDB4ZjAwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9ESVI4V1BMOgotCSAgICAgIC8qIFRoaXMgcmVsb2MgaWdub3JlcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgMyBiaXRzIG9mCi0gICAgICAgICAgICAgICAgIHRoZSBwcm9ncmFtIGNvdW50ZXIgYmVmb3JlIGFkZGluZyBpbiB0aGUgb2Zmc2V0LgotICAgICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgaWYgQUREUiBpcyBhdCBhbiBldmVuIGFkZHJlc3MsIHRoZQotICAgICAgICAgICAgICAgICBzd2FwIHdpbGwgbm90IGFmZmVjdCB0aGUgb2Zmc2V0LiAgSWYgQUREUiBpcyBhbiBhdCBhbgotICAgICAgICAgICAgICAgICBvZGQgYWRkcmVzcywgdGhlbiB0aGUgaW5zdHJ1Y3Rpb24gd2lsbCBiZSBjcm9zc2luZyBhCi0gICAgICAgICAgICAgICAgIGZvdXIgYnl0ZSBib3VuZGFyeSwgYW5kIG11c3QgYmUgYWRqdXN0ZWQuICAqLwotCSAgICAgIGlmICgoYWRkciAmIDMpICE9IDApCi0JCXsKLQkJICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkJICBvaW5zbiA9IGluc247Ci0JCSAgaW5zbiArPSBhZGQgLyAyOwotCQkgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkJICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOwotCQl9Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAob3ZlcmZsb3cpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogMHglbHg6IGZhdGFsOiByZWxvYyBvdmVyZmxvdyB3aGlsZSByZWxheGluZyIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0KSk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJlbG9jYXRlIGFuIFNIIEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3ZtYSBhZGRlbmQgPSAoYmZkX3ZtYSkwOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotICAgICAgICAgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLSAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgLyogTWFueSBvZiB0aGUgcmVsb2NzIGFyZSBvbmx5IHVzZWQgZm9yIHJlbGF4aW5nLCBhbmQgYXJlCi0gICAgICAgICBoYW5kbGVkIGVudGlyZWx5IGJ5IHRoZSByZWxheGF0aW9uIGNvZGUuICAqLwotICAgICAgaWYgKHJfdHlwZSA+IChpbnQpIFJfU0hfTEFTVF9JTlZBTElEX1JFTE9DKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAocl90eXBlIDwgMAotCSAgfHwgcl90eXBlID49IChpbnQpIFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQykKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIGNlcnRhaW5seSBpbmNvcnJlY3QuICBIb3dldmVyLCBpdCBpcyBob3cgdGhlCi0gICAgICAgICBDT0ZGIGxpbmtlciB3b3Jrcy4gICovCi0gICAgICBpZiAocl90eXBlICE9IChpbnQpIFJfU0hfRElSMzIKLQkgICYmIHJfdHlwZSAhPSAoaW50KSBSX1NIX0lORDEyVykKLQljb250aW51ZTsKLQotICAgICAgaG93dG8gPSBzaF9lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIC8qIFRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYW4gaW50ZXJuYWwgSU5EMTJXCi0gICAgICAgICAgICAgcmVsb2NhdGlvbi4gIEZJWE1FOiBUaGlzIGlzIHByb2JhYmx5IHdyb25nLCBidXQgaXQncyBob3cKLSAgICAgICAgICAgICB0aGUgQ09GRiByZWxvY2F0aW9ucyB3b3JrLiAgKi8KLQkgIGlmIChyX3R5cGUgPT0gKGludCkgUl9TSF9JTkQxMlcpCi0JICAgIGNvbnRpbnVlOwotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIGhvdyB0aGUgQ09GRiByZWxvY2F0aW9ucyB3b3JrLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgPT0gKGludCkgUl9TSF9JTkQxMlcpCi0JcmVsb2NhdGlvbiAtPSA0OwotCi0gICAgICBzd2l0Y2ggKChpbnQpcl90eXBlKQotCXsKLQljYXNlIChpbnQpUl9TSF9ESVIzMjoKLQkgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIENPRkYgcmVsb2NzIGRvbid0IHVzZSB0aGUgYWRkZW5kLiBUaGUgYWRkZW5kIGlzIHVzZWQgZm9yIFJfU0hfRElSMzIgCi0JIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBjb21waWxlcnMuICovCi0gICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkgICAgcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgaWYgKCpuYW1lID09ICdcMCcpCi0JCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JCSAgfQotCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgIHdoaWNoIHVzZXMgc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotc2hfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLAotCQkJCQlkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1N5bSAqaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0KLSAgLyogV2Ugb25seSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiByZWxheGluZywgb3Igb2YgaGF2aW5nIGEKLSAgICAgcGFydGljdWxhciBzZXQgb2Ygc2VjdGlvbiBjb250ZW50cywgc3BlY2lhbGx5LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZQotICAgICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCQkgICAgICAgcmVsb2NhdGVhYmxlLAotCQkJCQkJICAgICAgIHN5bWJvbHMpOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotCi0gIG1lbWNweSAoZGF0YSwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzLAotCSAgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0gICAgICAmJiBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSAqaXN5bXA7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3BwOwotICAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLQotICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JZXh0ZXJuYWxfc3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICBlbHNlCi0JewotCSAgZXh0ZXJuYWxfc3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgICAgICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSk7Ci0JICBpZiAoZXh0ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9zeW1zLCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSksCi0JCQkgICAgc3ltdGFiX2hkci0+c2hfaW5mbywgaW5wdXRfYmZkKQotCQkgICE9IChzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpIE5VTEwsCi0JCQkgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCBmYWxzZSkpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpbnRlcm5hbF9zeW1zID0gKChFbGZfSW50ZXJuYWxfU3ltICopCi0JCSAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCQkgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlzeW1wID0gaW50ZXJuYWxfc3ltczsKLSAgICAgIHNlY3BwID0gc2VjdGlvbnM7Ci0gICAgICBlc3ltID0gZXh0ZXJuYWxfc3ltczsKLSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgKytlc3ltLCArK2lzeW1wLCArK3NlY3BwKQotCXsKLQkgIGFzZWN0aW9uICppc2VjOwotCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgaXN5bXApOwotCi0JICBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgaXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPiAwICYmIGlzeW1wLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIGlzZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltcC0+c3Rfc2huZHgpOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIGlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIGlzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2hvIGtub3dzPyAgKi8KLQkgICAgICBpc2VjID0gTlVMTDsKLQkgICAgfQotCi0JICAqc2VjcHAgPSBpc2VjOwotCX0KLQotICAgICAgaWYgKCEgc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLQlmcmVlIChzZWN0aW9ucyk7Ci0gICAgICBzZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotCWZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0JZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAotICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0gICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotc3RhdGljIGFzZWN0aW9uICoKLXNoX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICAgIGJmZCAqYWJmZDsKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfU0hfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhc2UgUl9TSF9HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNoX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcyBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiB3ZSBkb24ndCB1c2UgZ290IGFuZCBwbHQgZW50cmllcyBmb3Igc2guICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuCi0gICBTaW5jZSB3ZSBkb24ndCBkbyAuZ290cyBvciAucGx0cywgd2UganVzdCBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgdmlydHVhbCB0YWJsZSByZWxvY3MgZm9yIGdjLiAgKi8KLSAKLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9TSF9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9TSF9HTlVfVlRFTlRSWToKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfc2hfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLXNoIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfc2hsX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLXNobCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX3NoCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fU0gKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEKLQotI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCXNoX2VsZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJc2hfZWxmX2luZm9fdG9faG93dG8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uCXNoX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24Jc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCQlzaF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rICAgICAgICBzaF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgc2hfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICBzaF9lbGZfY2hlY2tfcmVsb2NzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1zcGFyYy5jIGIvYmZkL2VsZjMyLXNwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OWQyNWIuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkwICswLDAgQEAKLS8qIFNQQVJDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9zcGFyYy5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqZWxmMzJfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgZWxmMzJfc3BhcmNfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19jaGVja19yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotDAotLyogVGhlIHJlbG9jYXRpb24gImhvd3RvIiB0YWJsZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXJlbG9jX2hvd3RvX3R5cGUgX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzgsICAgICAgICAgMCwwLCA4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfOCIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xNiwgICAgICAgIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzE2IiwgICAgICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMzIsICAgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18zMiIsICAgICAgZmFsc2UsMCwweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1A4LCAgICAgMCwwLCA4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDgiLCAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMTYsICAgIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AxNiIsICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDMyLCAgICAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQMzIiLCAgZmFsc2UsMCwweDAwZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMzAsICAgMiwyLDMwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AzMCIsIGZhbHNlLDAsMHgzZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDIyLCAgIDIsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMjIiLCBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSEkyMiwgICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ISTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzIyLCAgICAgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMjIiLCAgICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xMywgICAgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzEzIiwgICAgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE8xMCwgICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19MTzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEwLCAgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMywgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDEzIiwgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMjIsICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QyMiIsICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMTAsICAgICAgMCwyLDEwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMxMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzIyLCAgICAgMTAsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV1BMVDMwLCAgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XUExUMzAiLCAgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0NPUFksICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfQ09QWSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HTE9CX0RBVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dMT0JfREFUIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSk1QX1NMT1QsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19KTVBfU0xPVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1JFTEFUSVZFLCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUkVMQVRJVkUiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19VQTMyLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1VBMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUExUMzIsICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUExUMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSElQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfSElQTFQyMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE9QTFQxMCwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfTE9QTFQxMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQzMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENQTFQzMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENQTFQyMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQxMCwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENQTFQxMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTAsICAgICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMCIsICAgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzExLCAgICAgICAgMCwyLDExLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTEiLCAgICAgIGZhbHNlLDAsMHgwMDAwMDdmZix0cnVlKSwKLSAgLyogVGhlc2UgYXJlIGZvciBzcGFyYzY0IGluIGEgNjQgYml0IGVudmlyb25tZW50LgotICAgICBWYWx1ZXMgbmVlZCB0byBiZSBoZXJlIGJlY2F1c2UgdGhlIHRhYmxlIGlzIGluZGV4ZWQgYnkgcmVsb2MgbnVtYmVyLiAgKi8KLSAgSE9XVE8oUl9TUEFSQ182NCwgICAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ182NCIsICAgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX09MTzEwLCAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX09MTzEwIiwgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSEgyMiwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfSEgyMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ITTEwLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19ITTEwIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0xNMjIsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX0xNMjIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfSEgyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENfSEgyMiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19ITTEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ19ITTEwIiwgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0xNMjIsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX1BDX0xNMjIiLCBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIC8qIEVuZCBzcGFyYzY0IGluIDY0IGJpdCBlbnZpcm9ubWVudCB2YWx1ZXMuCi0gICAgIFRoZSBmb2xsb3dpbmcgYXJlIGZvciBzcGFyYzY0IGluIGEgMzIgYml0IGVudmlyb25tZW50LiAgKi8KLSAgSE9XVE8oUl9TUEFSQ19XRElTUDE2LCAgIDIsMiwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jLCJSX1NQQVJDX1dESVNQMTYiLCBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AxOSwgICAyLDIsMTksdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDE5IiwgZmFsc2UsMCwweDAwMDdmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VOVVNFRF80MiwgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVU5VU0VEXzQyIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNywgICAgICAgICAwLDIsIDcsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ183IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDdmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzUsICAgICAgICAgMCwyLCA1LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNSIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAxZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ182LCAgICAgICAgIDAsMiwgNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzYiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwM2YsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1JFVjMyLCAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1JFVjMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi19Owotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfc3BhcmNfdnRpbmhlcml0X2hvd3RvID0KLSAgSE9XVE8gKFJfU1BBUkNfR05VX1ZUSU5IRVJJVCwgMCwyLDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9TUEFSQ19HTlVfVlRJTkhFUklUIiwgZmFsc2UsMCwgMCwgZmFsc2UpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfc3BhcmNfdnRlbnRyeV9ob3d0byA9Ci0gIEhPV1RPIChSX1NQQVJDX0dOVV9WVEVOVFJZLCAwLDIsMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sIlJfU1BBUkNfR05VX1ZURU5UUlkiLCBmYWxzZSwwLDAsIGZhbHNlKTsKLQotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcCB7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9yZWxvY19tYXAgc3BhcmNfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX1NQQVJDX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX1NQQVJDXzE2LCB9LAotICB7IEJGRF9SRUxPQ184LCBSX1NQQVJDXzggfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TUEFSQ19ESVNQOCB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX1NQQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX1NQQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSX1NQQVJDX0RJU1AzMiB9LAotICB7IEJGRF9SRUxPQ19ISTIyLCBSX1NQQVJDX0hJMjIgfSwKLSAgeyBCRkRfUkVMT0NfTE8xMCwgUl9TUEFSQ19MTzEwLCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwgUl9TUEFSQ19XRElTUDMwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDMjIsIFJfU1BBUkNfMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMxMywgUl9TUEFSQ18xMyB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwgUl9TUEFSQ19HT1QxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMywgUl9TUEFSQ19HT1QxMyB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QyMiwgUl9TUEFSQ19HT1QyMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzEwLCBSX1NQQVJDX1BDMTAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUEMyMiwgUl9TUEFSQ19QQzIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwgUl9TUEFSQ19XUExUMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfQ09QWSwgUl9TUEFSQ19DT1BZIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFULCBSX1NQQVJDX0dMT0JfREFUIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9ULCBSX1NQQVJDX0pNUF9TTE9UIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFLCBSX1NQQVJDX1JFTEFUSVZFIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIsIFJfU1BBUkNfV0RJU1AyMiB9LAotICAvKiA/Pz8gRG9lc24ndCBkd2FyZiB1c2UgdGhpcz8gICovCi0vKnsgQkZEX1JFTE9DX1NQQVJDX1VBMzIsIFJfU1BBUkNfVUEzMiB9LCBub3QgdXNlZD8/ICovCi0gIHtCRkRfUkVMT0NfU1BBUkNfMTAsIFJfU1BBUkNfMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDXzExLCBSX1NQQVJDXzExfSwKLSAge0JGRF9SRUxPQ19TUEFSQ182NCwgUl9TUEFSQ182NH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfT0xPMTAsIFJfU1BBUkNfT0xPMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0hIMjIsIFJfU1BBUkNfSEgyMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSE0xMCwgUl9TUEFSQ19ITTEwfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19MTTIyLCBSX1NQQVJDX0xNMjJ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIsIFJfU1BBUkNfUENfSEgyMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfSE0xMCwgUl9TUEFSQ19QQ19ITTEwfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19MTTIyLCBSX1NQQVJDX1BDX0xNMjJ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1dESVNQMTYsIFJfU1BBUkNfV0RJU1AxNn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOSwgUl9TUEFSQ19XRElTUDE5fSwKLSAge0JGRF9SRUxPQ19TUEFSQ183LCBSX1NQQVJDXzd9LAotICB7QkZEX1JFTE9DX1NQQVJDXzUsIFJfU1BBUkNfNX0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNiwgUl9TUEFSQ182fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19SRVYzMiwgUl9TUEFSQ19SRVYzMiB9LAotICB7QkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX1NQQVJDX0dOVV9WVElOSEVSSVR9LAotICB7QkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9TUEFSQ19HTlVfVlRFTlRSWX0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGYzMl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICByZXR1cm4gJmVsZjMyX3NwYXJjX3Z0aW5oZXJpdF9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIHJldHVybiAmZWxmMzJfc3BhcmNfdnRlbnRyeV9ob3d0bzsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzcGFyY19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChzcGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCSAgICByZXR1cm4gJl9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHNwYXJjX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogV2UgbmVlZCB0byB1c2UgRUxGMzJfUl9UWVBFIHNvIHdlIGhhdmUgb3VyIG93biBjb3B5IG9mIHRoaXMgZnVuY3Rpb24sCi0gICBhbmQgZWxmNjQtc3BhcmMuYyBoYXMgaXRzIG93biBjb3B5LiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBzd2l0Y2ggKEVMRjMyX1JfVFlQRShkc3QtPnJfaW5mbykpCi0gICAgewotICAgIGNhc2UgUl9TUEFSQ19HTlVfVlRJTkhFUklUOgotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGYzMl9zcGFyY192dGluaGVyaXRfaG93dG87Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9TUEFSQ19HTlVfVlRFTlRSWToKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmMzJfc3BhcmNfdnRlbnRyeV9ob3d0bzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRShkc3QtPnJfaW5mbykgPCAodW5zaWduZWQgaW50KSBSX1NQQVJDX21heF9zdGQpOwotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZVtFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pXTsKLSAgICB9Ci19Ci0MCi0vKiBGb3IgdW5zdXBwb3J0ZWQgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYyAoYWJmZCwKLQkJCSAgICAgcmVsb2NfZW50cnksCi0JCQkgICAgIHN5bWJvbCwKLQkJCSAgICAgZGF0YSwKLQkJCSAgICAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgb3V0cHV0X2JmZCwKLQkJCSAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgV0RJU1AxNiByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jIChhYmZkLAotCQkJIHJlbG9jX2VudHJ5LAotCQkJIHN5bWJvbCwKLQkJCSBkYXRhLAotCQkJIGlucHV0X3NlY3Rpb24sCi0JCQkgb3V0cHV0X2JmZCwKLQkJCSBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgeDsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnZhbHVlCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09CShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICByZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0gIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgeCB8PSAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKLQl8ICgocmVsb2NhdGlvbiA+PiAyKSAmIDB4M2ZmZikpOwotICBiZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uIDwgLSAweDQwMDAwCi0gICAgICB8fCAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPiAweDNmZmZmKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gIGVsc2UKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotDAotLyogRnVuY3Rpb25zIGZvciB0aGUgU1BBUkMgRUxGIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9sZC5zby4xIgotCi0vKiBUaGUgbm9wIG9wY29kZSB3ZSB1c2UuICAqLwotCi0jZGVmaW5lIFNQQVJDX05PUCAweDAxMDAwMDAwCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTIKLQotLyogVGhlIGZpcnN0IGZvdXIgZW50cmllcyBpbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGFyZSByZXNlcnZlZCwKLSAgIGFuZCB0aGUgaW5pdGlhbCBjb250ZW50cyBhcmUgdW5pbXBvcnRhbnQgKHdlIHplcm8gdGhlbSBvdXQpLgotICAgU3Vic2VxdWVudCBlbnRyaWVzIGxvb2sgbGlrZSB0aGlzLiAgU2VlIHRoZSBTVlI0IEFCSSBTUEFSQwotICAgc3VwcGxlbWVudCB0byBzZWUgaG93IHRoaXMgd29ya3MuICAqLwotCi0vKiBzZXRoaSAlaGkoLi0ucGx0MCksJWcxLiAgV2UgZmlsbCBpbiB0aGUgYWRkcmVzcyBsYXRlci4gICovCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMCAweDAzMDAwMDAwCi0vKiBiLGEgLnBsdDAuICBXZSBmaWxsIGluIHRoZSBvZmZzZXQgbGF0ZXIuICAqLwotI2RlZmluZSBQTFRfRU5UUllfV09SRDEgMHgzMDgwMDAwMAotLyogbm9wLiAgKi8KLSNkZWZpbmUgUExUX0VOVFJZX1dPUkQyIFNQQVJDX05PUAotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3JlbGdvdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSX1NQQVJDX0dPVDEwOgotCWNhc2UgUl9TUEFSQ19HT1QxMzoKLQljYXNlIFJfU1BBUkNfR09UMjI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoZHlub2JqID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBDcmVhdGUgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF92bWEpOwotCQkgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7Ci0JCSAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKLQkJICAgIGxvY2FsX2dvdF9vZmZzZXRzW2ldID0gKGJmZF92bWEpIC0xOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCQl9Ci0JICAgIH0KLQotCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0KLQkgIC8qIElmIHRoZSAuZ290IHNlY3Rpb24gaXMgbW9yZSB0aGFuIDB4MTAwMCBieXRlcywgd2UgYWRkCi0JICAgICAweDEwMDAgdG8gdGhlIHZhbHVlIG9mIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgc28gdGhhdCAxMwotCSAgICAgYml0IHJlbG9jYXRpb25zIGhhdmUgYSBncmVhdGVyIGNoYW5jZSBvZiB3b3JraW5nLiAgKi8KLQkgIGlmIChzZ290LT5fcmF3X3NpemUgPj0gMHgxMDAwCi0JICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlID09IDApCi0JICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZSA9IDB4MTAwMDsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2l0aG91dAotICAgICAgICAgICAgIGxpbmtpbmcgaW4gYW55IGR5bmFtaWMgb2JqZWN0cywgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndAotICAgICAgICAgICAgIG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBhZnRlciBhbGwuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhlIFNvbGFyaXMgbmF0aXZlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIGEgV1BMVDMwCi0gICAgICAgICAgICAgICAgIHJlbG9jIGZvciBhIGxvY2FsIHN5bWJvbCBpZiB5b3UgYXNzZW1ibGUgYSBjYWxsIGZyb20KLSAgICAgICAgICAgICAgICAgb25lIHNlY3Rpb24gdG8gYW5vdGhlciB3aGVuIHVzaW5nIC1LIHBpYy4gIFdlIHRyZWF0Ci0gICAgICAgICAgICAgICAgIGl0IGFzIFdESVNQMzAuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19QQzEwOgotCWNhc2UgUl9TUEFSQ19QQzIyOgotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19OT05fR09UX1JFRjsKLQotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfRElTUDg6Ci0JY2FzZSBSX1NQQVJDX0RJU1AxNjoKLQljYXNlIFJfU1BBUkNfRElTUDMyOgotCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCWNhc2UgUl9TUEFSQ19XRElTUDIyOgotCWNhc2UgUl9TUEFSQ19XRElTUDE5OgotCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19OT05fR09UX1JFRjsKLQotCSAgLyogSWYgd2UgYXJlIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCB3ZSBkbyBub3QgbmVlZCB0byBjb3B5Ci0gICAgICAgICAgICAgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aGljaCBpcwotICAgICAgICAgICAgIGRlZmluZWQgaW4gYW4gb2JqZWN0IHdlIGFyZSBpbmNsdWRpbmcgaW4gdGhlIGxpbmsgKGkuZS4sCi0gICAgICAgICAgICAgREVGX1JFR1VMQVIgaXMgc2V0KS4gIEZJWE1FOiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbm90Ci0gICAgICAgICAgICAgc2VlbiBhbGwgdGhlIGlucHV0IGZpbGVzLCBzbyBpdCBpcyBwb3NzaWJsZSB0aGF0Ci0gICAgICAgICAgICAgREVGX1JFR1VMQVIgaXMgbm90IHNldCBub3cgYnV0IHdpbGwgYmUgc2V0IGxhdGVyIChpdCBpcwotICAgICAgICAgICAgIG5ldmVyIGNsZWFyZWQpLiAgVGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGluCi0gICAgICAgICAgICAgZWxmMzItaTM4Ni5jLiAgKi8KLQkgIGlmIChoID09IE5VTEwKLQkgICAgICB8fCAoaW5mby0+c3ltYm9saWMKLQkJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSX1NQQVJDXzg6Ci0JY2FzZSBSX1NQQVJDXzE2OgotCWNhc2UgUl9TUEFSQ18zMjoKLQljYXNlIFJfU1BBUkNfSEkyMjoKLQljYXNlIFJfU1BBUkNfMjI6Ci0JY2FzZSBSX1NQQVJDXzEzOgotCWNhc2UgUl9TUEFSQ19MTzEwOgotCWNhc2UgUl9TUEFSQ19VQTMyOgotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19OT05fR09UX1JFRjsKLQotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKLSAgICAgICAgICAgICAgICAgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2MKLSAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChhYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQotCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0JCSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSX1NQQVJDX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSX1NQQVJDX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotZWxmMzJfc3BhcmNfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLQotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfU1BBUkNfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhc2UgUl9TUEFSQ19HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotCi0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9TUEFSQ19HT1QxMDoKLSAgICAgIGNhc2UgUl9TUEFSQ19HT1QxMzoKLSAgICAgIGNhc2UgUl9TUEFSQ19HT1QyMjoKLQlyX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0JaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICB7Ci0JICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAgIGlmIChoLT5nb3QucmVmY291bnQgPiAwKQotCSAgICAgIGgtPmdvdC5yZWZjb3VudC0tOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID4gMCkKLQkgICAgICBsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XS0tOwotCSAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBSX1NQQVJDX1BMVDMyOgotICAgICAgY2FzZSBSX1NQQVJDX0hJUExUMjI6Ci0gICAgICBjYXNlIFJfU1BBUkNfTE9QTFQxMDoKLSAgICAgIGNhc2UgUl9TUEFSQ19QQ1BMVDMyOgotICAgICAgY2FzZSBSX1NQQVJDX1BDUExUMTA6Ci0Jcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCWlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgewotCSAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICBpZiAoaC0+cGx0LnJlZmNvdW50ID4gMCkKLQkgICAgICBoLT5wbHQucmVmY291bnQtLTsKLQkgIH0KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKLSAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIKLSAgICAgKGFsdGhvdWdoIHdlIGNvdWxkIGFjdHVhbGx5IGRvIGl0IGhlcmUpLiAgVGhlIFNUVF9OT1RZUEUKLSAgICAgY29uZGl0aW9uIGlzIGEgaGFjayBzcGVjaWZpY2FsbHkgZm9yIHRoZSBPcmFjbGUgbGlicmFyaWVzCi0gICAgIGRlbGl2ZXJlZCBmb3IgU29sYXJpczsgZm9yIHNvbWUgaW5leHBsaWNhYmxlIHJlYXNvbiwgdGhleSBkZWZpbmUKLSAgICAgc29tZSBvZiB0aGVpciBmdW5jdGlvbnMgYXMgU1RUX05PVFlQRSB3aGVuIHRoZXkgcmVhbGx5IHNob3VsZCBiZQotICAgICBTVFRfRlVOQy4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwCi0gICAgICB8fCAoaC0+dHlwZSA9PSBTVFRfTk9UWVBFCi0JICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgfHwgKCghaW5mby0+c2hhcmVkIHx8IGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCXsKLQkgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgd2Ugc2F3IGEgV1BMVDMwIHJlbG9jIGluIGFuIGlucHV0Ci0JICAgICBmaWxlLCBidXQgbm9uZSBvZiB0aGUgaW5wdXQgZmlsZXMgd2VyZSBkeW5hbWljIG9iamVjdHMuCi0JICAgICBPciwgd2hlbiBsaW5raW5nIHRoZSBtYWluIGFwcGxpY2F0aW9uIG9yIGEgLUJzeW1ib2xpYwotCSAgICAgc2hhcmVkIGxpYnJhcnkgYWdhaW5zdCBQSUMgY29kZS4gIE9yIHdoZW4gYSBnbG9iYWwgc3ltYm9sCi0JICAgICBoYXMgYmVlbiBtYWRlIHByaXZhdGUsIGUuZy4gdmlhIHZlcnNpb25pbmcuCi0KLQkgICAgIEluIHRoZXNlIGNhc2VzIHdlIGtub3cgd2hhdCB2YWx1ZSB0aGUgc3ltYm9sIHdpbGwgcmVzb2x2ZQotCSAgICAgdG8sIHNvIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gYnVpbGQgYSBwcm9jZWR1cmUgbGlua2FnZQotCSAgICAgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFdESVNQMzAgcmVsb2MgaW5zdGVhZC4gICovCi0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBmb3VyIGVudHJpZXMgaW4gLnBsdCBhcmUgcmVzZXJ2ZWQuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSA9IDQgKiBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogVGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGhhcyBhIG1heGltdW0gc2l6ZS4gICovCi0gICAgICBpZiAocy0+X3Jhd19zaXplID49IDB4NDAwMDAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotICAgICAgIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotICAgICAgIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCi0gICAgICAgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLSAgICAgICB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgICB7Ci0JaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQloLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotICAgICAgfQotCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICAqLwotICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGVyZSBhcmUgbm8gcmVmZXJlbmNlcyB0byB0aGlzIHN5bWJvbCB0aGF0IGRvIG5vdCB1c2UgdGhlCi0gICAgIEdPVCwgd2UgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSBhIGNvcHkgcmVsb2MuICAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19OT05fR09UX1JFRikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLiAgKi8KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl9TUEFSQ19DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyCi0gICAgIHRvIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWwuYnNzIHNlY3Rpb24gd2UgYXJlIGdvaW5nIHRvIHVzZS4gICovCi0gIGlmICgoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhpcyBzeW1ib2wuICBJCi0gICAgIGhhdmUgbm8gaWRlYSBob3cgRUxGIGxpbmtlcnMgaGFuZGxlIHRoaXMuICAqLwotICBwb3dlcl9vZl90d28gPSBiZmRfbG9nMiAoaC0+c2l6ZSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiAzKQotICAgIHBvd2VyX29mX3R3byA9IDM7Ci0KLSAgLyogQXBwbHkgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAocy0+X3Jhd19zaXplLAotCQkJICAgIChiZmRfc2l6ZV90eXBlKSAoMSA8PCBwb3dlcl9vZl90d28pKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCi0gIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0gIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0KLSAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLSAgYm9vbGVhbiByZWxwbHQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3BhY2UgZm9yIHRoZSB0cmFpbGluZyBub3AgaW4gLnBsdC4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBpZiAocy0+X3Jhd19zaXplID4gMCkKLQlzLT5fcmF3X3NpemUgKz0gNDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWxhLmdvdCBzZWN0aW9uLgotICAgICAgICAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotICAgICAgICAgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbGEuZ290LAotICAgICAgICAgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgIGJlbG93LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcmVsdGV4dCA9IGZhbHNlOwotICByZWxwbHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsLnBsdC4gIFdlIG11c3QgY3JlYXRlIGl0IGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSBpdCBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpvdXRuYW1lOwotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KLQkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOwotCSAgICAgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWxhLnBsdCIpID09IDApCi0JCXJlbHBsdCA9IHRydWU7Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpICE9IDAKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLmdvdCIpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMQSkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBLCAwKQotCSAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBRU5ULAotCQkJCQkgICAgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsb2NhdGUgYSBTUEFSQyBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYmZkX3ZtYSBnb3RfYmFzZTsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcGx0OwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290ID09IE5VTEwpCi0gICAgZ290X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgZ290X2Jhc2UgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWU7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNwbHQgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9TUEFSQ19HTlVfVlRJTkhFUklUIAotICAgICAgICAgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0dOVV9WVEVOVFJZKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfU1BBUkNfbWF4X3N0ZCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBob3d0byA9IF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgaWYgKChyX3R5cGUgPT0gUl9TUEFSQ19XUExUMzAKLQkJICAgJiYgaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0JCSAgfHwgKChyX3R5cGUgPT0gUl9TUEFSQ19HT1QxMAotCQkgICAgICAgfHwgcl90eXBlID09IFJfU1BBUkNfR09UMTMKLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0dPVDIyKQotCQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgICAmJiAoISBpbmZvLT5zaGFyZWQKLQkJCSAgfHwgKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSX1NQQVJDXzgKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfMTYKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfMzIKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfRElTUDgKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfRElTUDE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0RJU1AzMgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19XRElTUDMwCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1dESVNQMjIKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfV0RJU1AxOQotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19XRElTUDE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0hJMjIKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfMjIKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfMTMKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfTE8xMAotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19VQTMyCi0JCQkgIHx8ICgocl90eXBlID09IFJfU1BBUkNfUEMxMAotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1BDMjIpCi0JCQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJCSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgIT0gMCkpKSkKLQkJewotCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZS4gIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUKLSAgICAgICAgICAgICAgICAgICAgIG9ic2N1cmUgY2FzZXMgc2VjLT5vdXRwdXRfc2VjdGlvbiB3aWxsIGJlIE5VTEwuICAqLwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQlyZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSX1NQQVJDX0dPVDEwOgotCWNhc2UgUl9TUEFSQ19HT1QxMzoKLQljYXNlIFJfU1BBUkNfR09UMjI6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGdsb2JhbAotICAgICAgICAgICAgIG9mZnNldCB0YWJsZS4gICovCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBvZmYgPSBoLT5nb3Qub2Zmc2V0OwotCSAgICAgIEJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYWN0dWFsbHkgYSBzdGF0aWMgbGluaywgb3IgaXQgaXMgYQotICAgICAgICAgICAgICAgICAgICAgLUJzeW1ib2xpYyBsaW5rIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLSAgICAgICAgICAgICAgICAgICAgIGxvY2FsbHksIG9yIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbAotICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4gIFdlIG11c3QgaW5pdGlhbGl6ZQotICAgICAgICAgICAgICAgICAgICAgdGhpcyBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNpbmNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNCwgd2UgdXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCi0KLQkJICAgICBXaGVuIGRvaW5nIGEgZHluYW1pYyBsaW5rLCB3ZSBjcmVhdGUgYSAucmVsYS5nb3QKLQkJICAgICByZWxvY2F0aW9uIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcwotCQkgICAgIGlzIGRvbmUgaW4gdGhlIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAgKi8KLQkJICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCSAgICBvZmYgJj0gfjE7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCQkgICAgICBoLT5nb3Qub2Zmc2V0IHw9IDE7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gZ290X2Jhc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgQkZEX0FTU0VSVCAobG9jYWxfZ290X29mZnNldHMgIT0gTlVMTAotCQkJICAmJiBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIG9mZiA9IGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XTsKLQotCSAgICAgIC8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LiAgV2UgdXNlCi0JCSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUKLQkJIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgZW50cnkuICAqLwotCSAgICAgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJb2ZmICY9IH4xOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQotCQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICpzcmVsZ290OwotCQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkJICAgICAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2MKLQkJCSBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLQkJICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJCSArIG9mZik7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfU1BBUkNfUkVMQVRJVkUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSAwOwotCQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkJICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJCSAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkJICArIHNyZWxnb3QtPnJlbG9jX2NvdW50KSk7Ci0JCSAgICAgICsrc3JlbGdvdC0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0KLQkJICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQkJfQotCi0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmYgLSBnb3RfYmFzZTsKLQkgICAgfQotCi0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19XUExUMzA6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0gICAgICAgICAgICAgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0JICAvKiBUaGUgU29sYXJpcyBuYXRpdmUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgYSBXUExUMzAgcmVsb2MKLQkgICAgIGZvciBhIGxvY2FsIHN5bWJvbCBpZiB5b3UgYXNzZW1ibGUgYSBjYWxsIGZyb20gb25lCi0JICAgICBzZWN0aW9uIHRvIGFub3RoZXIgd2hlbiB1c2luZyAtSyBwaWMuICBXZSB0cmVhdCBpdCBhcwotCSAgICAgV0RJU1AzMC4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBicmVhazsKLQotCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotICAgICAgICAgICAgICAgICBoYXBwZW5zIHdoZW4gc3RhdGljYWxseSBsaW5raW5nIFBJQyBjb2RlLCBvciB3aGVuCi0gICAgICAgICAgICAgICAgIHVzaW5nIC1Cc3ltYm9saWMuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChzcGx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIGgtPnBsdC5vZmZzZXQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfUEMxMDoKLQljYXNlIFJfU1BBUkNfUEMyMjoKLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSX1NQQVJDX0RJU1A4OgotCWNhc2UgUl9TUEFSQ19ESVNQMTY6Ci0JY2FzZSBSX1NQQVJDX0RJU1AzMjoKLQljYXNlIFJfU1BBUkNfV0RJU1AzMDoKLQljYXNlIFJfU1BBUkNfV0RJU1AyMjoKLQljYXNlIFJfU1BBUkNfV0RJU1AxOToKLQljYXNlIFJfU1BBUkNfV0RJU1AxNjoKLQkgIGlmIChoID09IE5VTEwKLQkgICAgICB8fCAoaW5mby0+c3ltYm9saWMKLQkJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSX1NQQVJDXzg6Ci0JY2FzZSBSX1NQQVJDXzE2OgotCWNhc2UgUl9TUEFSQ18zMjoKLQljYXNlIFJfU1BBUkNfSEkyMjoKLQljYXNlIFJfU1BBUkNfMjI6Ci0JY2FzZSBSX1NQQVJDXzEzOgotCWNhc2UgUl9TUEFSQ19MTzEwOgotCWNhc2UgUl9TUEFSQ19VQTMyOgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQkgICAgICBib29sZWFuIHNraXA7Ci0KLQkgICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucwotICAgICAgICAgICAgICAgICBhcmUgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlIHRvIGJlIHJlc29sdmVkIGF0IHJ1bgotICAgICAgICAgICAgICAgICB0aW1lLiAgKi8KLQotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGlucHV0X2JmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0JCX0KLQotCSAgICAgIHNraXAgPSBmYWxzZTsKLQotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JCW91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX3ZtYSBvZmY7Ci0KLQkJICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCQkgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCi0JCQkgIHJlbC0+cl9vZmZzZXQpKTsKLQkJICBpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKLQkJICAgIHNraXAgPSB0cnVlOwotCQkgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKLQkJfQotCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JICAgICAgaWYgKHNraXApCi0JCW1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0JICAgICAgLyogaC0+ZHluaW5keCBtYXkgYmUgLTEgaWYgdGhlIHN5bWJvbCB3YXMgbWFya2VkIHRvCi0gICAgICAgICAgICAgICAgIGJlY29tZSBsb2NhbC4gICovCi0JICAgICAgZWxzZSBpZiAoaCAhPSBOVUxMCi0JCSAgICAgICAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJewotCQkgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIHJfdHlwZSk7Ci0JCSAgb3V0cmVsLnJfYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChyX3R5cGUgPT0gUl9TUEFSQ18zMikKLQkJICAgIHsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbG9uZyBpbmR4OwotCi0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQlzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJCSAgICAgIHx8IChoLT5yb290LnR5cGUKLQkJCQkJICA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQkJCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkJfQotCQkgICAgICBpZiAoc2VjICE9IE5VTEwgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQotCQkJaW5keCA9IDA7Ci0JCSAgICAgIGVsc2UgaWYgKHNlYyA9PSBOVUxMIHx8IHNlYy0+b3duZXIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBhc2VjdGlvbiAqb3NlYzsKLQotCQkJICBvc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQkJCSAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKG9zZWMpLT5keW5pbmR4OwotCi0JCQkgIC8qIEZJWE1FOiB3ZSByZWFsbHkgc2hvdWxkIGJlIGFibGUgdG8gbGluayBub24tcGljCi0JCQkgICAgIHNoYXJlZCBsaWJyYXJpZXMuICAqLwotCQkJICBpZiAoaW5keCA9PSAwKQotCQkJICAgIHsKLQkJCSAgICAgIEJGRF9GQUlMICgpOwotCQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkJKF8oIiVzOiBwcm9iYWJseSBjb21waWxlZCB3aXRob3V0IC1mUElDPyIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQkJCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChpbmR4LCByX3R5cGUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgc3JlbG9jLT5jb250ZW50cykKLQkJCQkJICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICAgICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICAvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28gdGhlcmUncyBubwotICAgICAgICAgICAgICAgICBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdywgdW5sZXNzIHRoaXMgaXMgYSBSRUxBVElWRQotICAgICAgICAgICAgICAgICByZWxvYyBpbiBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoc2tpcAotCQkgIHx8IChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkgIHx8IEVMRjMyX1JfVFlQRSAob3V0cmVsLnJfaW5mbykgIT0gUl9TUEFSQ19SRUxBVElWRSkKLQkJY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHJfdHlwZSA9PSBSX1NQQVJDX1dESVNQMTYpCi0JewotCSAgYmZkX3ZtYSB4OwotCi0JICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0JICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHJlbG9jYXRpb24gLT0gcmVsLT5yX29mZnNldDsKLQotCSAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgIHggfD0gKCgoKHJlbG9jYXRpb24gPj4gMikgJiAweGMwMDApIDw8IDYpCi0JCXwgKChyZWxvY2F0aW9uID4+IDIpICYgMHgzZmZmKSk7Ci0JICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0KLQkgIGlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPCAtIDB4NDAwMDAKLQkgICAgICB8fCAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPiAweDNmZmZmKQotCSAgICByID0gYmZkX3JlbG9jX292ZXJmbG93OwotCSAgZWxzZQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCX0KLSAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX1NQQVJDX1JFVjMyKQotCXsKLQkgIGJmZF92bWEgeDsKLQotCSAgcmVsb2NhdGlvbiA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCi0JICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgeCA9IHggKyByZWxvY2F0aW9uOwotCSAgYmZkX3B1dGwzMiAoLyppbnB1dF9iZmQsKi8geCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgICAgZWxzZQotCXIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJICAgICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0KLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBiZmQgKmR5bm9iajsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0Ci0gICAgICAgICBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICBQTFRfRU5UUllfV09SRDAgKyBoLT5wbHQub2Zmc2V0LAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChQTFRfRU5UUllfV09SRDEKLQkJICAgKyAoKCgtIChoLT5wbHQub2Zmc2V0ICsgNCkpID4+IDIpICYgMHgzZmZmZmYpKSwKLQkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9FTlRSWV9XT1JEMiwKLQkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA4KTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGgtPnBsdC5vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfSk1QX1NMT1QpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBoLT5wbHQub2Zmc2V0IC8gUExUX0VOVFJZX1NJWkUgLSA0KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0gICAgICAgICB1cC4gICovCi0KLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIChoLT5nb3Qub2Zmc2V0ICZ+IDEpKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgbGluaywgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCSBsb2NhbGx5LCB3ZSBqdXN0IHdhbnQgdG8gZW1pdCBhIFJFTEFUSVZFIHJlbG9jLiAgTGlrZXdpc2UgaWYKLQkgdGhlIHN5bWJvbCB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuCi0JIFRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuCi0JIGluaXRpYWxpemVkIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQlyZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7Ci0JICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19HTE9CX0RBVCk7Ci0JfQotCi0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIHNyZWxhLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzcmVsYS0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9scyBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0NPUFkpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHMtPmNvbnRlbnRzCi0JCQkJICArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICAvKiBNYXJrIHNvbWUgc3BlY2lhbGx5IGRlZmluZWQgc3ltYm9scyBhcyBhYnNvbHV0ZS4gICovCi0gIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2R5bjsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYm9vbGVhbiBzaXplOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6ICAgbmFtZSA9ICIucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUxTWjogbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gdHJ1ZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOiAgIG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgZGVmYXVsdDoJICBuYW1lID0gTlVMTDsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgfQotCi0JICBpZiAobmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnM7Ci0KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIGlmIChzID09IE5VTEwpCi0JCWR5bi5kX3VuLmRfdmFsID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISBzaXplKQotCQkgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkJICAgICAgZWxzZQotCQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBDbGVhciB0aGUgZmlyc3QgZm91ciBlbnRyaWVzIGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwKLQkgYW5kIHB1dCBhIG5vcCBpbiB0aGUgbGFzdCBmb3VyIGJ5dGVzLiAgKi8KLSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQotCXsKLQkgIG1lbXNldCAoc3BsdC0+Y29udGVudHMsIDAsIDQgKiBQTFRfRU5UUllfU0laRSk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTUEFSQ19OT1AsCi0JCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgc3BsdC0+X3Jhd19zaXplIC0gNCk7Ci0JfQotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPQotCVBMVF9FTlRSWV9TSVpFOwotICAgIH0KLQotICAvKiBTZXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHRvIHRoZSBhZGRyZXNzIG9mCi0gICAgIHRoZSBkeW5hbWljIHNlY3Rpb24uICAqLwotICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHNnb3QtPmNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIHRoZSBlX2ZsYWdzIGZpZWxkLgotCi0gICBXZSBkb24ndCBkZWZpbmUgc2V0X3ByaXZhdGVfZmxhZ3Mgb3IgY29weV9wcml2YXRlX2JmZF9kYXRhIGJlY2F1c2UKLSAgIHRoZSBvbmx5IGN1cnJlbnRseSBkZWZpbmVkIHZhbHVlcyBhcmUgYmFzZWQgb24gdGhlIGJmZCBtYWNoIG51bWJlciwKLSAgIHNvIHdlIHVzZSB0aGUgbGF0dGVyIGluc3RlYWQgYW5kIGRlZmVyIHNldHRpbmcgZV9mbGFncyB1bnRpbCB0aGUKLSAgIGZpbGUgaXMgd3JpdHRlbiBvdXQuICAqLwotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGJvb2xlYW4gZXJyb3I7Ci0gIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgc3RhdGljLiAgKi8KLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldmlvdXNfaWJmZF9lX2ZsYWdzID0gKHVuc2lnbmVkIGxvbmcpIC0xOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBlcnJvciA9IGZhbHNlOwotCi0jaWYgMAotICAvKiA/Pz8gVGhlIG5hdGl2ZSBsaW5rZXIgZG9lc24ndCBkbyB0aGlzIHNvIHdlIGNhbid0IChvdGhlcndpc2UgZ2NjIHdvdWxkCi0gICAgIGhhdmUgdG8ga25vdyB3aGljaCBsaW5rZXIgaXMgYmVpbmcgdXNlZCkuICBJbnN0ZWFkLCB0aGUgbmF0aXZlIGxpbmtlcgotICAgICBidW1wcyB1cCB0aGUgYXJjaGl0ZWN0dXJlIGxldmVsIHdoZW4gaXQgaGFzIHRvLiAgSG93ZXZlciwgSSBzdGlsbCB0aGluawotICAgICB3YXJuaW5ncyBsaWtlIHRoZXNlIGFyZSBnb29kLCBzbyBpdCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgdGhlbSB0dXJuZWQgb24KLSAgICAgYnkgc29tZSBvcHRpb24uICAqLwotCi0gIC8qIElmIHRoZSBvdXRwdXQgbWFjaGluZSBpcyBub3JtYWwgc3BhcmMsIHdlIGNhbid0IGFsbG93IHY5IGlucHV0IGZpbGVzLiAgKi8KLSAgaWYgKGJmZF9nZXRfbWFjaCAob2JmZCkgPT0gYmZkX21hY2hfc3BhcmMKLSAgICAgICYmIChiZmRfZ2V0X21hY2ggKGliZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1cwotCSAgfHwgYmZkX2dldF9tYWNoIChpYmZkKSA9PSBiZmRfbWFjaF9zcGFyY192OHBsdXNhKSkKLSAgICB7Ci0gICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGNvbXBpbGVkIGZvciBhIHY4cGx1cyBzeXN0ZW0gYW5kIHRhcmdldCBpcyB2OCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgfQotICAvKiBJZiB0aGUgb3V0cHV0IG1hY2hpbmUgaXMgdjksIHdlIGNhbid0IGFsbG93IHY5K3ZpcyBpbnB1dCBmaWxlcy4gICovCi0gIGlmIChiZmRfZ2V0X21hY2ggKG9iZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1cwotICAgICAgJiYgYmZkX2dldF9tYWNoIChpYmZkKSA9PSBiZmRfbWFjaF9zcGFyY192OHBsdXNhKQotICAgIHsKLSAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgdjhwbHVzYSBzeXN0ZW0gYW5kIHRhcmdldCBpcyB2OHBsdXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgIH0KLSNlbHNlCi0gIGlmIChiZmRfZ2V0X21hY2ggKGliZmQpID49IGJmZF9tYWNoX3NwYXJjX3Y5KQotICAgIHsKLSAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgNjQgYml0IHN5c3RlbSBhbmQgdGFyZ2V0IGlzIDMyIGJpdCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKG9iZmQpIDwgYmZkX2dldF9tYWNoIChpYmZkKSkKLSAgICBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotI2VuZGlmCi0KLSAgaWYgKCgoZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19MRURBVEEpCi0gICAgICAgIT0gcHJldmlvdXNfaWJmZF9lX2ZsYWdzKQotICAgICAgJiYgcHJldmlvdXNfaWJmZF9lX2ZsYWdzICE9ICh1bnNpZ25lZCBsb25nKSAtMSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGxpbmtpbmcgbGl0dGxlIGVuZGlhbiBmaWxlcyB3aXRoIGJpZyBlbmRpYW4gZmlsZXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgICAgZXJyb3IgPSB0cnVlOwotICAgIH0KLSAgcHJldmlvdXNfaWJmZF9lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19MRURBVEE7Ci0KLSAgaWYgKGVycm9yKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX21hY2hpbmUgPT0gRU1fU1BBUkMzMlBMVVMpCi0gICAgewotICAgICAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfU1VOX1VTMSkKLQlyZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc3BhcmMsCi0JCQkJCSAgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSk7Ci0gICAgICBlbHNlIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDXzMyUExVUykKLQlyZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc3BhcmMsCi0JCQkJCSAgYmZkX21hY2hfc3BhcmNfdjhwbHVzKTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX0xFREFUQSkKLSAgICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc3BhcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjKTsKLX0KLQotLyogVGhlIGZpbmFsIHByb2Nlc3NpbmcgZG9uZSBqdXN0IGJlZm9yZSB3cml0aW5nIG91dCB0aGUgb2JqZWN0IGZpbGUuCi0gICBXZSBuZWVkIHRvIHNldCB0aGUgZV9tYWNoaW5lIGZpZWxkIGFwcHJvcHJpYXRlbHkuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyYyA6Ci0gICAgICBicmVhazsgLyogbm90aGluZyB0byBkbyAqLwotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjhwbHVzIDoKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX21hY2hpbmUgPSBFTV9TUEFSQzMyUExVUzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9TUEFSQ18zMlBMVVNfTUFTSzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDXzMyUExVUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSA6Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9tYWNoaW5lID0gRU1fU1BBUkMzMlBMVVM7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPX4gRUZfU1BBUkNfMzJQTFVTX01BU0s7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRl9TUEFSQ18zMlBMVVMgfCBFRl9TUEFSQ19TVU5fVVMxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUgOgotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfbWFjaGluZSA9IEVNX1NQQVJDOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfTEVEQVRBOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JYmZkX2VsZjMyX3NwYXJjX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJImVsZjMyLXNwYXJjIgotI2RlZmluZSBFTEZfQVJDSAliZmRfYXJjaF9zcGFyYwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFIEVNX1NQQVJDCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEgRU1fU1BBUkMzMlBMVVMKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFIDB4MTAwMDAKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQllbGYzMl9zcGFyY19pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCWVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAotCQkJCQllbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAotCQkJCQllbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQllbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQllbGYzMl9zcGFyY19vYmplY3RfcAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFwKLQkJCQkJZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgIGVsZjMyX3NwYXJjX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rICAgICAgIGVsZjMyX3NwYXJjX2djX3N3ZWVwX2hvb2sKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUgNAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUgKDQqUExUX0VOVFJZX1NJWkUpCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi12ODUwLmMgYi9iZmQvZWxmMzItdjg1MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTllNTk4Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi12ODUwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjM2ICswLDAgQEAKLS8qIFY4NTAtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotCi0vKiBYWFggRklYTUU6IFRoaXMgY29kZSBpcyBsaXR0ZXJlZCB3aXRoIDMyYml0IGludCwgMTZiaXQgc2hvcnQsIDhiaXQgY2hhcgotICAgZGVwZW5kZW5jaWVzLiAgQXMgaXMgdGhlIGdhcyAmIHNpbXVsYXRvciBjb2RlIG9yIHRoZSB2ODUwLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvdjg1MC5oIgotCi0vKiBzaWduLWV4dGVuZCBhIDI0LWJpdCBudW1iZXIgKi8KLSNkZWZpbmUgU0VYVDI0KHgpCSgoKCh4KSAmIDB4ZmZmZmZmKSBeICh+IDB4N2ZmZmZmKSkgKyAweDgwMDAwMCkKLSAgICAgIAotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnY4NTBfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIHY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgdm9pZCB2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbGEKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHY4NTBfZWxmX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIGludCwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfY2hlY2tfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCByZW1lbWJlcl9oaTE2c19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotc3RhdGljIGJmZF9ieXRlICogZmluZF9yZW1lbWJlcmVkX2hpMTZzX3JlbG9jCi0gIFBBUkFNUyAoKGJmZF92bWEsIGJvb2xlYW4gKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hLAotCSAgIGJmZF92bWEsIGJmZF92bWEsIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2Zha2Vfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgdjg1MF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLXN0YXRpYyB2b2lkIHY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgY2hhciAqKSk7Ci0KLS8qIE5vdGU6IEl0IGlzIFJFUVVJUkVEIHRoYXQgdGhlICd0eXBlJyB2YWx1ZSBvZiBlYWNoIGVudHJ5IGluIHRoaXMgYXJyYXkKLSAgIG1hdGNoIHRoZSBpbmRleCBvZiB0aGUgZW50cnkgaW4gdGhlIGFycmF5LiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHY4NTBfZWxmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX1Y4NTBfTk9ORSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9OT05FIiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgUEMgcmVsYXRpdmUgOSBiaXQgYnJhbmNoLiAqLwotICBIT1dUTyAoUl9WODUwXzlfUENSRUwsCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfOV9QQ1JFTCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMGZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIFBDIHJlbGF0aXZlIDIyIGJpdCBicmFuY2guICovCi0gIEhPV1RPIChSX1Y4NTBfMjJfUENSRUwsCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIyLAkJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDcsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwXzIyX1BDUkVMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmZmZjgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDdmZmZmODAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9WODUwX0hJMTZfUywJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfSEkxNl9TIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9ISTE2LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9ISTE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9MTzE2LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9MTzE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2ltcGxlIDMyYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF8zMiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfMzIiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNpbXBsZSAxNmJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX1Y4NTBfMTYsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF8xNiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNpbXBsZSA4Yml0IHJlbG9jLgkgKi8KLSAgSE9XVE8gKFJfVjg1MF84LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF84IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE1IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDEsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZSwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmUsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTUgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VULAkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAxLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmUsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZlLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzZfOF9PRkZTRVQsCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDEsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfNl84X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdlLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDdlLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1REQV83XzhfT0ZGU0VULAkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzdfOF9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogNyBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1REQV83XzdfT0ZGU0VULAkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA3LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzdfN19PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlciEgICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzE2XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1REQV8xNl8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNSBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1REQV80XzVfT0ZGU0VULAkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzRfNV9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDQgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9UREFfNF80X09GRlNFVCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNCwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1REQV80XzRfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MGYsCQkJCS8qIHNyY19tYXNrICovCi0JIDB4MGYsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZTAwMjAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZlMDAyMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZTAwMjAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZlMDAyMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDcsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2YsCQkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KLSAgSE9XVE8gKFJfVjg1MF9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9WODUwX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9WODUwX0dOVV9WVEVOVFJZLCAgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9WODUwX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAKLX07Ci0KLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gVjg1MCBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3Qgdjg1MF9lbGZfcmVsb2NfbWFwCi17Ci0gIC8qIEJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVCBpcyAyNTgsIHdoaWNoIHdpbGwgbm90IGZpeCBpbiBhbgotICAgICB1bnNpZ25lZCBjaGFyLiAgKi8KLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdjg1MF9lbGZfcmVsb2NfbWFwIHY4NTBfZWxmX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwJCVJfVjg1MF9OT05FIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfOV9QQ1JFTCwJUl9WODUwXzlfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF8yMl9QQ1JFTCwJUl9WODUwXzIyX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0hJMTZfUywJCVJfVjg1MF9ISTE2X1MgfSwKLSAgeyBCRkRfUkVMT0NfSEkxNiwJCVJfVjg1MF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX0xPMTYsCQlSX1Y4NTBfTE8xNiB9LAotICB7IEJGRF9SRUxPQ18zMiwJCVJfVjg1MF8zMiB9LAotICB7IEJGRF9SRUxPQ18xNiwJCVJfVjg1MF8xNiB9LAotICB7IEJGRF9SRUxPQ184LAkJUl9WODUwXzggfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VULCBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1NEQV8xNV8xNl9PRkZTRVQsIFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCwgUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9aREFfMTVfMTZfT0ZGU0VULCBSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VULCAgIFJfVjg1MF9UREFfNl84X09GRlNFVCAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQsICAgUl9WODUwX1REQV83XzhfT0ZGU0VUICAgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfN183X09GRlNFVCwgICBSX1Y4NTBfVERBXzdfN19PRkZTRVQgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQsIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQsICAgICAgICAgUl9WODUwX1REQV80XzVfT0ZGU0VUICAgICAgICAgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVCwgICAgICAgICBSX1Y4NTBfVERBXzRfNF9PRkZTRVQgICAgICAgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQsIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCwgUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VULCAgICAgICBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCAgICAgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVCwgICAgIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQgICAgIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCAgICAgICAgICAgICAgIFJfVjg1MF9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgICAgICAgICAgICAgICAgIFJfVjg1MF9HTlVfVlRFTlRSWSB9LAotCi19OwotCi0MCi0vKiBNYXAgYSBiZmQgcmVsb2NhdGlvbiBpbnRvIHRoZSBhcHByb3ByaWF0ZSBob3d0byBzdHJ1Y3R1cmUgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXY4NTBfZWxmX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKHY4NTBfZWxmX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCB2ODUwX2VsZl9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAodjg1MF9lbGZfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQl7Ci0JICBCRkRfQVNTRVJUICh2ODUwX2VsZl9ob3d0b190YWJsZVt2ODUwX2VsZl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF0udHlwZSA9PSB2ODUwX2VsZl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbCk7Ci0JICAKLQkgIHJldHVybiAmIHY4NTBfZWxmX2hvd3RvX3RhYmxlW3Y4NTBfZWxmX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0MCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIFY4NTAgRUxGIHJlbG9jLiAgKi8KLXN0YXRpYyB2b2lkCi12ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKiAgICAgICAgICAgICBjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqICBkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfVjg1MF9tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJnY4NTBfZWxmX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYSBWODUwIEVMRiByZWxvYyAodHlwZSBSRUxBKS4gKi8KLXN0YXRpYyB2b2lkCi12ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbGEgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICogICAgICAgICAgICAgY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICAgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9WODUwX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmdjg1MF9lbGZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotDAotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgICBpbmZvOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICBzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogIHJlbG9jczsKLXsKLSAgYm9vbGVhbiByZXQgPSB0cnVlOwotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIGVudW0gdjg1MF9yZWxvY190eXBlIHJfdHlwZTsKLSAgaW50IG90aGVyID0gMDsKLSAgY29uc3QgY2hhciAqY29tbW9uID0gKGNvbnN0IGNoYXIgKikwOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJ2ODUwX2VsZl9jaGVja19yZWxvY3MgY2FsbGVkIGZvciBzZWN0aW9uICVzIGluICVzXG4iLAotCSAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSNlbmRpZgotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgcl90eXBlID0gKGVudW0gdjg1MF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgUl9WODUwX05PTkU6Ci0JY2FzZSBSX1Y4NTBfOV9QQ1JFTDoKLQljYXNlIFJfVjg1MF8yMl9QQ1JFTDoKLQljYXNlIFJfVjg1MF9ISTE2X1M6Ci0JY2FzZSBSX1Y4NTBfSEkxNjoKLQljYXNlIFJfVjg1MF9MTzE2OgotCWNhc2UgUl9WODUwXzMyOgotCWNhc2UgUl9WODUwXzE2OgotCWNhc2UgUl9WODUwXzg6Ci0JY2FzZSBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVDoKLQljYXNlIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQ6Ci0JICBicmVhazsKLQotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0gICAgICAgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX1Y4NTBfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9WODUwX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQotCWNhc2UgUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVDoKLQljYXNlIFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUOgotCSAgb3RoZXIgPSBWODUwX09USEVSX1NEQTsKLQkgIGNvbW1vbiA9ICIuc2NvbW1vbiI7Ci0JICBnb3RvIHNtYWxsX2RhdGFfY29tbW9uOwotCSAgCi0JY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVDoKLQljYXNlIFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQ6Ci0JICBvdGhlciA9IFY4NTBfT1RIRVJfWkRBOwotCSAgY29tbW9uID0gIi56Y29tbW9uIjsKLQkgIGdvdG8gc21hbGxfZGF0YV9jb21tb247Ci0JICAKLQljYXNlIFJfVjg1MF9UREFfNF81X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfNF80X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfNl84X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfN184X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfN183X09GRlNFVDoKLQljYXNlIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VUOgotCSAgb3RoZXIgPSBWODUwX09USEVSX1REQTsKLQkgIGNvbW1vbiA9ICIudGNvbW1vbiI7Ci0JICAvKiBmYWxsIHRocm91Z2ggKi8KLQotI2RlZmluZSBWODUwX09USEVSX01BU0sgKFY4NTBfT1RIRVJfVERBIHwgVjg1MF9PVEhFUl9TREEgfCBWODUwX09USEVSX1pEQSkKLQotCXNtYWxsX2RhdGFfY29tbW9uOgotCSAgaWYgKGgpCi0JICAgIHsKLQkgICAgICBoLT5vdGhlciB8PSBvdGhlcjsJLyogZmxhZyB3aGljaCB0eXBlIG9mIHJlbG9jYXRpb24gd2FzIHVzZWQgKi8KLQkgICAgICBpZiAoKGgtPm90aGVyICYgVjg1MF9PVEhFUl9NQVNLKSAhPSAob3RoZXIgJiBWODUwX09USEVSX01BU0spCi0JCSAgJiYgKGgtPm90aGVyICYgVjg1MF9PVEhFUl9FUlJPUikgPT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKiBtc2c7Ci0JCSAgc3RhdGljIGNoYXIgIGJ1ZmZbMjAwXTsgLyogWFhYICovCi0KLQkJICBzd2l0Y2ggKGgtPm90aGVyICYgVjg1MF9PVEhFUl9NQVNLKQotCQkgICAgewotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgbXNnID0gXygiVmFyaWFibGUgYCVzJyBjYW5ub3Qgb2NjdXB5IGluIG11bHRpcGxlIHNtYWxsIGRhdGEgcmVnaW9ucyIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVjg1MF9PVEhFUl9TREEgfCBWODUwX09USEVSX1pEQSB8IFY4NTBfT1RIRVJfVERBOgotCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbiBvbmx5IGJlIGluIG9uZSBvZiB0aGUgc21hbGwsIHplcm8sIGFuZCB0aW55IGRhdGEgcmVnaW9ucyIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVjg1MF9PVEhFUl9TREEgfCBWODUwX09USEVSX1pEQToKLQkJICAgICAgbXNnID0gXygiVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCBzbWFsbCBhbmQgemVybyBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFY4NTBfT1RIRVJfU0RBIHwgVjg1MF9PVEhFUl9UREE6Ci0JCSAgICAgIG1zZyA9IF8oIlZhcmlhYmxlIGAlcycgY2Fubm90IGJlIGluIGJvdGggc21hbGwgYW5kIHRpbnkgZGF0YSByZWdpb25zIHNpbXVsdGFuZW91c2x5Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBWODUwX09USEVSX1pEQSB8IFY4NTBfT1RIRVJfVERBOgotCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHplcm8gYW5kIHRpbnkgZGF0YSByZWdpb25zIHNpbXVsdGFuZW91c2x5Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgc3ByaW50ZiAoYnVmZiwgbXNnLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkJICBpbmZvLT5jYWxsYmFja3MtPndhcm5pbmcgKGluZm8sIGJ1ZmYsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJCSAgICBhYmZkLCBoLT5yb290LnUuZGVmLnNlY3Rpb24sIDApOwotCi0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgaC0+b3RoZXIgfD0gVjg1MF9PVEhFUl9FUlJPUjsKLQkJICByZXQgPSBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgICAgICYmIGgtPnJvb3QudS5jLnAKLQkgICAgICAmJiAhc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgaC0+cm9vdC51LmMucC0+c2VjdGlvbiksICJDT01NT04iKSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgY29tbW9uKTsKLQkgICAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgICB9Ci0KLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAidjg1MF9lbGZfY2hlY2tfcmVsb2NzLCBmb3VuZCAlcyByZWxvY2F0aW9uIGZvciAlcyVzXG4iLAotCQkgICB2ODUwX2VsZl9ob3d0b190YWJsZVsgKGludClyX3R5cGUgXS5uYW1lLAotCQkgICAoaCAmJiBoLT5yb290LnJvb3Quc3RyaW5nKSA/IGgtPnJvb3Qucm9vdC5zdHJpbmcgOiAiPHVua25vd24+IiwKLQkJICAgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikgPyAiLCBzeW1ib2wgaXMgY29tbW9uIiA6ICIiKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKgotICogSW4gdGhlIG9sZCB2ZXJzaW9uLCB3aGVuIGFuIGVudHJ5IHdhcyBjaGVja2VkIG91dCBmcm9tIHRoZSB0YWJsZSwKLSAqIGl0IHdhcyBkZWxldGVkLiAgVGhpcyBwcm9kdWNlZCBhbiBlcnJvciBpZiB0aGUgZW50cnkgd2FzIG5lZWRlZAotICogbW9yZSB0aGFuIG9uY2UsIGFzIHRoZSBzZWNvbmQgYXR0ZW1wdGVkIHJldHJ5IGZhaWxlZC4KLSAqCi0gKiBJbiB0aGUgY3VycmVudCB2ZXJzaW9uLCB0aGUgZW50cnkgaXMgbm90IGRlbGV0ZWQsIGluc3RlYWQgd2Ugc2V0Ci0gKiB0aGUgZmllbGQgJ2ZvdW5kJyB0byB0cnVlLiAgSWYgYSBzZWNvbmQgbG9va3VwIG1hdGNoZXMgdGhlIHNhbWUKLSAqIGVudHJ5LCB0aGVuIHdlIGtub3cgdGhhdCB0aGUgaGkxNnMgcmVsb2MgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkCi0gKiBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSB1cGRhdGVkIGEgc2Vjb25kIHRpbWUuCi0gKgotICogVE9ETyAtIFRPRklYOiBJZiBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIG5lZWQgdG8gcmVzdG9yZSAyIGRpZmZlcmVudAotICogYWRkcmVzc2VzIGZyb20gdGhlIHNhbWUgdGFibGUgZW50cnksIHdoZXJlIHRoZSBmaXJzdCBnZW5lcmF0ZXMgYW4KLSAqIG92ZXJmbG93LCB3aGlsc3QgdGhlIHNlY29uZCBkbyBub3QsIHRoZW4gdGhpcyBjb2RlIHdpbGwgZmFpbC4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBoaTE2c19sb2NhdGlvbgotewotICBiZmRfdm1hICAgICAgIGFkZGVuZDsKLSAgYmZkX2J5dGUgKiAgICBhZGRyZXNzOwotICB1bnNpZ25lZCBsb25nIGNvdW50ZXI7Ci0gIGJvb2xlYW4gICAgICAgZm91bmQ7Ci0gIHN0cnVjdCBoaTE2c19sb2NhdGlvbiAqIG5leHQ7Ci19Ci1oaTE2c19sb2NhdGlvbjsKLQotc3RhdGljIGhpMTZzX2xvY2F0aW9uICogIHByZXZpb3VzX2hpMTZzOwotc3RhdGljIGhpMTZzX2xvY2F0aW9uICogIGZyZWVfaGkxNnM7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyAgICAgaGkxNnNfY291bnRlcjsKLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX2hpMTZzX3JlbG9jIChhYmZkLCBhZGRlbmQsIGFkZHJlc3MpCi0gICAgIGJmZCAqICAgICAgYWJmZDsKLSAgICAgYmZkX3ZtYSAgICBhZGRlbmQ7Ci0gICAgIGJmZF9ieXRlICogYWRkcmVzczsKLXsKLSAgaGkxNnNfbG9jYXRpb24gKiBlbnRyeSA9IE5VTEw7Ci0gIAotICAvKiBGaW5kIGEgZnJlZSBzdHJ1Y3R1cmUuICAqLwotICBpZiAoZnJlZV9oaTE2cyA9PSBOVUxMKQotICAgIGZyZWVfaGkxNnMgPSAoaGkxNnNfbG9jYXRpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICgqIGZyZWVfaGkxNnMpKTsKLQotICBlbnRyeSAgICAgID0gZnJlZV9oaTE2czsKLSAgZnJlZV9oaTE2cyA9IGZyZWVfaGkxNnMtPm5leHQ7Ci0gIAotICBlbnRyeS0+YWRkZW5kICA9IGFkZGVuZDsKLSAgZW50cnktPmFkZHJlc3MgPSBhZGRyZXNzOwotICBlbnRyeS0+Y291bnRlciA9IGhpMTZzX2NvdW50ZXIgKys7Ci0gIGVudHJ5LT5mb3VuZCAgID0gZmFsc2U7Ci0gIGVudHJ5LT5uZXh0ICAgID0gcHJldmlvdXNfaGkxNnM7Ci0gIHByZXZpb3VzX2hpMTZzID0gZW50cnk7Ci0gIAotICAvKiBDb3BlIHdpdGggd3JhcCBhcm91bmQgb2Ygb3VyIGNvdW50ZXIuICAqLwotICBpZiAoaGkxNnNfY291bnRlciA9PSAwKQotICAgIHsKLSAgICAgIC8qIFhYWCAtIEFzc3VtZSB0aGF0IGFsbCBjb3VudGVyIGVudHJpZXMgZGlmZmVyIG9ubHkgaW4gdGhlaXIgbG93IDE2IGJpdHMuICAqLwotICAgICAgZm9yIChlbnRyeSA9IHByZXZpb3VzX2hpMTZzOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQotCWVudHJ5LT5jb3VudGVyICY9IDB4ZmZmZjsKLQotICAgICAgaGkxNnNfY291bnRlciA9IDB4MTAwMDA7Ci0gICAgfQotICAKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgYmZkX2J5dGUgKgotZmluZF9yZW1lbWJlcmVkX2hpMTZzX3JlbG9jIChhZGRlbmQsIGFscmVhZHlfZm91bmQpCi0gICAgIGJmZF92bWEgICBhZGRlbmQ7Ci0gICAgIGJvb2xlYW4gKiBhbHJlYWR5X2ZvdW5kOwotewotICBoaTE2c19sb2NhdGlvbiAqIG1hdGNoID0gTlVMTDsKLSAgaGkxNnNfbG9jYXRpb24gKiBlbnRyeTsKLSAgaGkxNnNfbG9jYXRpb24gKiBwcmV2aW91cyA9IE5VTEw7Ci0gIGhpMTZzX2xvY2F0aW9uICogcHJldjsKLSAgYmZkX2J5dGUgKiAgICAgICBhZGRyOwotICAKLSAgLyogU2VhcmNoIHRoZSB0YWJsZS4gIFJlY29yZCB0aGUgbW9zdCByZWNlbnQgZW50cnkgdGhhdCBtYXRjaGVzLiAgKi8KLSAgZm9yIChlbnRyeSA9IHByZXZpb3VzX2hpMTZzOyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZW50cnktPmFkZGVuZCA9PSBhZGRlbmQKLQkgICYmIChtYXRjaCA9PSBOVUxMIHx8IG1hdGNoLT5jb3VudGVyIDwgZW50cnktPmNvdW50ZXIpKQotCXsKLQkgIHByZXZpb3VzID0gcHJldjsKLQkgIG1hdGNoICAgID0gZW50cnk7Ci0JfQotICAgICAgCi0gICAgICBwcmV2ID0gZW50cnk7Ci0gICAgfQotCi0gIGlmIChtYXRjaCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIEV4dHJhY3QgdGhlIGFkZHJlc3MuICAqLwotICBhZGRyID0gbWF0Y2gtPmFkZHJlc3M7Ci0KLSAgLyogUmVtZWJlciBpZiB0aGlzIGVudHJ5IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBiZWZvcmUuICAqLwotICBpZiAoYWxyZWFkeV9mb3VuZCkKLSAgICAqIGFscmVhZHlfZm91bmQgPSBtYXRjaC0+Zm91bmQ7Ci0KLSAgLyogTm90ZSB0aGF0IHRoaXMgZW50cnkgaGFzIG5vdyBiZWVuIHVzZWQuICAqLwotICBtYXRjaC0+Zm91bmQgPSB0cnVlOwotICAKLSAgcmV0dXJuIGFkZHI7Ci19ICAgICAKLQotLyogRklYTUU6ICBUaGUgY29kZSBoZXJlIHByb2JhYmx5IG91Z2h0IHRvIGJlIHJlbW92ZWQgYW5kIHRoZSBjb2RlIGluIHJlbG9jLmMKLSAgIGFsbG93ZWQgdG8gZG8gaXRzICBzdHVmZiBpbnN0ZWFkLiAgQXQgbGVhc3QgZm9yIG1vc3Qgb2YgdGhlIHJlbG9jcywgYW53eWF5LiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbiAoYWJmZCwgcl90eXBlLCBhZGRlbmQsIGFkZHJlc3MpCi0gICAgIGJmZCAqICAgICAgYWJmZDsKLSAgICAgaW50ICAgICAgICByX3R5cGU7Ci0gICAgIGJmZF92bWEgICAgYWRkZW5kOwotICAgICBiZmRfYnl0ZSAqIGFkZHJlc3M7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgYmZkX3NpZ25lZF92bWEgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAKLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBmcHJpbnRmIChzdGRlcnIsICJyZWxvYyB0eXBlICVkIG5vdCBTVVBQT1JURURcbiIsIHJfdHlwZSApOyAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF8zMjoKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGFkZGVuZCwgYWRkcmVzcyk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfMjJfUENSRUw6Ci0gICAgICBpZiAoc2FkZGVuZCA+IDB4MWZmZmZmIHx8IHNhZGRlbmQgPCAtMHgyMDAwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKChhZGRlbmQgJSAyKSAhPSAwKQotCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuICA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgaW5zbiAmPSB+MHhmZmZlMDAzZjsKLSAgICAgIGluc24gfD0gKCgoYWRkZW5kICYgMHhmZmZlKSA8PCAxNikgfCAoKGFkZGVuZCAmIDB4M2YwMDAwKSA+PiAxNikpOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgYWRkcmVzcyk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfOV9QQ1JFTDoKLSAgICAgIGlmIChzYWRkZW5kID4gMHhmZiB8fCBzYWRkZW5kIDwgLTB4MTAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmICgoYWRkZW5kICUgMikgIT0gMCkKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAgPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGluc24gJj0gfiAweGY4NzA7Ci0gICAgICBpbnNuIHw9ICgoYWRkZW5kICYgMHgxZjApIDw8IDcpIHwgKChhZGRlbmQgJiAweDBlKSA8PCAzKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfSEkxNjoKLSAgICAgIGFkZGVuZCArPSAoYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcykgPDwgMTYpOwotICAgICAgYWRkZW5kID0gKGFkZGVuZCA+PiAxNik7Ci0gICAgICBpbnNuID0gYWRkZW5kOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9ISTE2X1M6Ci0gICAgICAvKiBSZW1lbWJlciB3aGVyZSB0aGlzIHJlbG9jYXRpb24gdG9vayBwbGFjZS4gICovCi0gICAgICByZW1lbWJlcl9oaTE2c19yZWxvYyAoYWJmZCwgYWRkZW5kLCBhZGRyZXNzKTsKLQotICAgICAgYWRkZW5kICs9IChiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKSA8PCAxNik7Ci0gICAgICBhZGRlbmQgPSAoYWRkZW5kID4+IDE2KSArICgoYWRkZW5kICYgMHg4MDAwKSAhPSAwKTsKLSAgICAgIAotICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGNhbm5vdCBvdmVyZmxvdy4gKi8KLSAgICAgIGlmIChhZGRlbmQgPiAweDdmZmYpCi0JYWRkZW5kID0gMDsKLSAgICAgIAotICAgICAgaW5zbiA9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfTE8xNjoKLSAgICAgIC8qIENhbGN1bGF0ZSB0aGUgc3VtIG9mIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uIGFuZCB0aGUKLQkgYWRkZW5kIGFuZCBjaGVjayBmb3Igb3ZlcmZsb3cgZnJvbSB0aGUgbG93IDE2IGJpdHMgaW50byB0aGUgaGlnaAotCSAxNiBiaXRzLiAgVGhlIGFzc2VtYmxlciBoYXMgYWxyZWFkeSBkb25lIHNvbWUgb2YgdGhpczogIElmIHRoZQotCSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uIGhhcyBpdHMgMTV0aCBiaXQgc2V0LCAoY291bnRpbmcKLQkgZnJvbSB6ZXJvKSB0aGVuIHRoZSBhc3NlbWJsZXIgd2lsbCBoYXZlIGFkZGVkIDEgdG8gdGhlIHZhbHVlCi0JIHN0b3JlZCBpbiB0aGUgYXNzb2NpYXRlZCBISTE2UyByZWxvYy4gIFNvIGZvciBleGFtcGxlLCB0aGVzZQotCSByZWxvY2F0aW9uczoKLQotCSAgICAgbW92aGkgaGkoIGZyZWQgKSwgcjAsIHIxCi0JICAgICBtb3ZlYSBsbyggZnJlZCApLCByMSwgcjEKLQotCSB3aWxsIHN0b3JlIDAgaW4gdGhlIHZhbHVlIGZpZWxkcyBmb3IgdGhlIE1PVkhJIGFuZCBNT1ZFQSBpbnN0cnVjdGlvbnMKLQkgYW5kIGFkZGVuZCB3aWxsIGJlIHRoZSBhZGRyZXNzIG9mIGZyZWQsIGJ1dCBmb3IgdGhlc2UgaW5zdHJ1Y3Rpb25zOgotCi0JICAgICBtb3ZoaSBoaSggZnJlZCArIDB4MTIzNDU2KSwgcjAsIHIxCi0JICAgICBtb3ZlYSBsbyggZnJlZCArIDB4MTIzNDU2KSwgcjEsIHIxCi0KLQkgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTU9WSEkgaW5zdHJ1Y3Rpb24gd2lsbCBiZSAweDEyIGFuZCB0aGUgdmFsdWUKLQkgc3RvcmVkIGluIHRoZSBNT1ZFQSBpbnN0cnVjdGlvbiB3aWxsIGJlIDB4MzQ1Ni4gIElmIGhvd2V2ZXIgdGhlCi0JIGluc3RydWN0aW9ucyB3ZXJlOgotCi0JICAgICBtb3ZoaSBoaSggZnJlZCArIDB4MTBmZmZmKSwgcjAsIHIxCi0JICAgICBtb3ZlYSBsbyggZnJlZCArIDB4MTBmZmZmKSwgcjEsIHIxCi0KLQkgdGhlbiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBNT1ZISSBpbnN0cnVjdGlvbiB3b3VsZCBiZSAweDExIChub3QKLQkgMHgxMCkgYW5kIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIE1PVkVBIGluc3RydWN0aW9uIHdvdWxkIGJlIDB4ZmZmZi4KLQkgVGh1cyAoYXNzdW1pbmcgZm9yIHRoZSBtb21lbnQgdGhhdCB0aGUgYWRkZW5kIGlzIDApLCBhdCBydW4gdGltZSB0aGUKLQkgTU9WSEkgaW5zdHJ1Y3Rpb24gbG9hZHMgMHgxMTAwMDAgaW50byByMSwgdGhlbiB0aGUgTU9WRUEgaW5zdHJ1Y3Rpb24KLQkgYWRkcyAweGZmZmZmZmZmIChzaWduIGV4dGVuc2lvbiEpIHByb2R1Y2luZyAweDEwZmZmZi4gIFNpbWlsYXJseSBpZgotCSB0aGUgaW5zdHJ1Y3Rpb25zIHdlcmU6Ci0KLQkgICAgIG1vdmhpIGhpKCBmcmVkIC0gMSksIHIwLCByMQotCSAgICAgbW92ZWEgbG8oIGZyZWQgLSAxKSwgcjEsIHIxCi0KLQkgdGhlbiAwIGlzIHN0b3JlZCBpbiB0aGUgTU9WSEkgaW5zdHJ1Y3Rpb24gYW5kIC0xIGlzIHN0b3JlZCBpbiB0aGUKLQkgTU9WRUEgaW5zdHJ1Y3Rpb24uCi0KLQkgT3ZlcmZsb3cgY2FuIG9jY3VyIGlmIHRoZSBhZGRpdGlvbiBvZiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZQotCSBpbnN0cnVjdGlvbiBwbHVzIHRoZSBhZGRlbmQgc2V0cyB0aGUgMTV0aCBiaXQgd2hlbiBiZWZvcmUgaXQgd2FzIGNsZWFyLgotCSBUaGlzIGlzIGJlY2F1c2UgdGhlIDE1dGggYml0IHdpbGwgYmUgc2lnbiBleHRlbmRlZCBpbnRvIHRoZSBoaWdoIHBhcnQsCi0JIHRodXMgcmVkdWNpbmcgaXRzIHZhbHVlIGJ5IG9uZSwgYnV0IHNpbmNlIHRoZSAxNXRoIGJpdCB3YXMgb3JpZ2luYWxseQotCSBjbGVhciwgdGhlIGFzc2VtYmxlciB3aWxsIG5vdCBoYXZlIGFkZGVkIDEgdG8gdGhlIHByZXZpb3VzIEhJMTZTIHJlbG9jCi0JIHRvIGNvbXBlbnNhdGUgZm9yIHRoaXMgZWZmZWN0LiAgRm9yIGV4YW1wbGU6Ci0KLQkgICAgbW92aGkgaGkoIGZyZWQgKyAweDEyMzQ1NiksIHIwLCByMQotCSAgICBtb3ZlYSBsbyggZnJlZCArIDB4MTIzNDU2KSwgcjEsIHIxCi0KLQkgVGhlIHZhbHVlIHN0b3JlZCBpbiBISTE2UyByZWxvYyBpcyAweDEyLCB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBMTzE2Ci0JIHJlbG9jIGlzIDB4MzQ1Ni4gIElmIHdlIGFzc3VtZSB0aGF0IHRoZSBhZGRyZXNzIG9mIGZyZWQgaXMgMHgwMDAwNzAwMAotCSB0aGVuIHRoZSByZWxvY2F0aW9ucyBiZWNvbWU6Ci0KLQkgICBISTE2UzogMHgwMDEyICsgKDB4MDAwMDcwMDAgPj4gMTYpICAgID0gMHgxMgotCSAgIExPMTY6ICAweDM0NTYgKyAoMHgwMDAwNzAwMCAmIDB4ZmZmZikgPSAweGE0NTYKLQotCSBidXQgd2hlbiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBleGVjdXRlZCwgdGhlIE1PVkVBIGluc3RydWN0aW9uJ3MgdmFsdWUKLQkgaXMgc2lnbmVkIGV4dGVuZGVkLCBzbyB0aGUgc3VtIGJlY29tZXM6Ci0KLQkgICAgICAweDAwMTIwMDAwCi0JICAgICsgMHhmZmZmYTQ1NgotCSAgICAtLS0tLS0tLS0tLS0KLQkgICAgICAweDAwMTFhNDU2ICAgIGJ1dCAnZnJlZCArIDB4MTIzNDU2JyA9IDB4MDAxMmE0NTYKLQotCSBOb3RlIHRoYXQgaWYgdGhlIDE1dGggYml0IHdhcyBzZXQgaW4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTE8xNgotCSByZWxvYywgdGhlbiB3ZSBkbyBub3QgaGF2ZSB0byBkbyBhbnl0aGluZzoKLQotCSAgICBtb3ZoaSBoaSggZnJlZCArIDB4MTBmZmZmKSwgcjAsIHIxCi0JICAgIG1vdmVhIGxvKCBmcmVkICsgMHgxMGZmZmYpLCByMSwgcjEKLQotCSAgICBISTE2UzogIDB4MDAxMSArICgweDAwMDA3MDAwID4+IDE2KSAgICA9IDB4MTEKLQkgICAgTE8xNjogICAweGZmZmYgKyAoMHgwMDAwNzAwMCAmIDB4ZmZmZikgPSAweDZmZmYKLQotCSAgICAgIDB4MDAxMTAwMDAKLQkgICAgKyAweDAwMDA2ZmZmCi0JICAgIC0tLS0tLS0tLS0tLQotCSAgICAgIDB4MDAxMTZmZmYgID0gZnJlZCArIDB4MTBmZmZmID0gMHg3MDAwICsgMHgxMGZmZmYKLQotCSAKLQkgT3ZlcmZsb3cgY2FuIGFsc28gb2NjdXIgaWYgdGhlIGNvbXB1dGF0aW9uIGNhcnJpZXMgaW50byB0aGUgMTZ0aCBiaXQKLQkgYW5kIGl0IGFsc28gcmVzdWx0cyBpbiB0aGUgMTV0aCBiaXQgaGF2aW5nIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSAxNXRoCi0JIGJpdCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUuICAgV2hhdCBoYXBwZW5zIGlzIHRoYXQgdGhlIEhJMTZTIHJlbG9jCi0JIHdpbGwgaGF2ZSBhbHJlYWR5IGV4YW1pbmVkIHRoZSAxNXRoIGJpdCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUgYW5kCi0JIGFkZGVkIDEgdG8gdGhlIGhpZ2ggcGFydCBpZiB0aGUgYml0IGlzIHNldC4gIFRoaXMgY29tcGVuc2F0ZXMgZm9yIHRoZQotCSBzaWduIGV4dGVuc2lvbiBvZiAxNXRoIGJpdCBvZiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wdXRhdGlvbi4gIEJ1dCBub3cKLQkgdGhlcmUgaXMgYSBjYXJyeSBpbnRvIHRoZSAxNnRoIGJpdCwgYW5kIHRoaXMgaGFzIG5vdCBiZWVuIGFsbG93ZWQgZm9yLgotCi0JIFNvLCBmb3IgZXhhbXBsZSBpZiBmcmVkIGlzIGF0IGFkZHJlc3MgMHhmMDAwOgotCi0JICAgbW92aGkgaGkoIGZyZWQgKyAweGZmZmYpLCByMCwgcjEgICAgW2JpdCAxNSBvZiB0aGUgb2Zmc2V0IGlzIHNldF0KLQkgICBtb3ZlYSBsbyggZnJlZCArIDB4ZmZmZiksIHIxLCByMQotCi0JICAgSEkxNlM6IDB4MDAwMSArICgweDAwMDBmMDAwID4+IDE2KSAgICA9IDB4MDAwMQotCSAgIExPMTY6ICAweGZmZmYgKyAoMHgwMDAwZjAwMCAmIDB4ZmZmZikgPSAweGVmZmYgICAoY2FycnkgaW50byBiaXQgMTYgaXMgbG9zdCkKLQotCSAgICAgMHgwMDAxMDAwMAotCSAgICsgMHhmZmZmZWZmZgotCSAgIC0tLS0tLS0tLS0tLQotCSAgICAgMHgwMDAwZWZmZiAgIGJ1dCAnZnJlZCArIDB4ZmZmZicgPSAweDAwMDFlZmZmCi0KLQkgU2ltaWxhcmx5LCBpZiB0aGUgMTV0aCBiaXQgcmVtYWlucyBjbGVhciwgYnV0IG92ZXJmbG93IG9jY3VycyBpbnRvCi0JIHRoZSAxNnRoIGJpdCB0aGVuIChhc3N1bWluZyB0aGUgYWRkcmVzcyBvZiBmcmVkIGlzIDB4ZjAwMCk6Ci0KLQkgICBtb3ZoaSBoaSggZnJlZCArIDB4NzAwMCksIHIwLCByMSAgICBbYml0IDE1IG9mIHRoZSBvZmZzZXQgaXMgY2xlYXJdCi0JICAgbW92ZWEgbG8oIGZyZWQgKyAweDcwMDApLCByMSwgcjEKLQotCSAgIEhJMTZTOiAweDAwMDAgKyAoMHgwMDAwZjAwMCA+PiAxNikgICAgPSAweDAwMDAKLQkgICBMTzE2OiAgMHg3MDAwICsgKDB4MDAwMGYwMDAgJiAweGZmZmYpID0gMHg2ZmZmICAoY2FycnkgaW50byBiaXQgMTYgaXMgbG9zdCkKLQotCSAgICAgMHgwMDAwMDAwMAotCSAgICsgMHgwMDAwNmZmZgotCSAgIC0tLS0tLS0tLS0tLQotCSAgICAgMHgwMDAwNmZmZiAgIGJ1dCAnZnJlZCArIDB4NzAwMCcgPSAweDAwMDE2ZmZmCi0JICAgCi0JIE5vdGUgLSB0aGVyZSBpcyBubyBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZyBpZiBhIGNhcnJ5IG9jY3VycywgYW5kIHRoZQotCSAxNXRoIGJpdCBjaGFuZ2VzIGl0cyB2YWx1ZSBmcm9tIGJlaW5nIHNldCB0byBiZWluZyBjbGVhciwgYXMgdGhlIEhJMTZTCi0JIHJlbG9jIHdpbGwgaGF2ZSBhbHJlYWR5IGFkZGVkIGluIDEgdG8gdGhlIGhpZ2ggcGFydCBmb3IgdXM6Ci0KLQkgICBtb3ZoaSBoaSggZnJlZCArIDB4ZmZmZiksIHIwLCByMSAgICAgW2JpdCAxNSBvZiB0aGUgb2Zmc2V0IGlzIHNldF0KLQkgICBtb3ZlYSBsbyggZnJlZCArIDB4ZmZmZiksIHIxLCByMQotCi0JICAgSEkxNlM6IDB4MDAwMSArICgweDAwMDA3MDAwID4+IDE2KQotCSAgIExPMTY6ICAweGZmZmYgKyAoMHgwMDAwNzAwMCAmIDB4ZmZmZikgPSAweDZmZmYgIChjYXJyeSBpbnRvIGJpdCAxNiBpcyBsb3N0KQotCi0JICAgICAweDAwMDEwMDAwCi0JICAgKyAweDAwMDA2ZmZmICAgKGJpdCAxNSBub3Qgc2V0LCBzbyB0aGUgdG9wIGhhbGYgaXMgemVybykKLQkgICAtLS0tLS0tLS0tLS0KLQkgICAgIDB4MDAwMTZmZmYgICB3aGljaCBpcyByaWdodCAoYXNzdW1pbmcgdGhhdCBmcmVkIGlzIGF0IDB4NzAwMCkKLQotCSBidXQgaWYgdGhlIDE1dGggYml0IGdvZXMgZnJvbSBiZWluZyBjbGVhciB0byBiZWluZyBzZXQsIHRoZW4gd2UgbXVzdAotCSBvbmNlIGFnYWluIGhhbmRsZSBvdmVyZmxvdzoKLQotCSAgIG1vdmhpIGhpKCBmcmVkICsgMHg3MDAwKSwgcjAsIHIxICAgICBbYml0IDE1IG9mIHRoZSBvZmZzZXQgaXMgY2xlYXJdCi0JICAgbW92ZWEgbG8oIGZyZWQgKyAweDcwMDApLCByMSwgcjEKLQotCSAgIEhJMTZTOiAweDAwMDAgKyAoMHgwMDAwZmZmZiA+PiAxNikKLQkgICBMTzE2OiAgMHg3MDAwICsgKDB4MDAwMGZmZmYgJiAweGZmZmYpID0gMHg2ZmZmICAoY2FycnkgaW50byBiaXQgMTYpCi0KLQkgICAgIDB4MDAwMDAwMDAKLQkgICArIDB4MDAwMDZmZmYgICAoYml0IDE1IG5vdCBzZXQsIHNvIHRoZSB0b3AgaGFsZiBpcyB6ZXJvKQotCSAgIC0tLS0tLS0tLS0tLQotCSAgICAgMHgwMDAwNmZmZiAgIHdoaWNoIGlzIHdyb25nIChhc3N1bWluZyB0aGF0IGZyZWQgaXMgYXQgMHhmZmZmKQotCSAqLwotCi0gICAgICB7Ci0JbG9uZyByZXN1bHQ7Ci0KLQlpbnNuICAgPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLQlyZXN1bHQgPSBpbnNuICsgYWRkZW5kOwotCi0jZGVmaW5lIEJJVDE1X1NFVCh4KSAoKHgpICYgMHg4MDAwKQotI2RlZmluZSBPVkVSRkxPV1MoYSxpKSAoKCgoYSkgJiAweGZmZmYpICsgKGkpKSA+IDB4ZmZmZikKLQkKLQlpZiAoKEJJVDE1X1NFVCAocmVzdWx0KSAmJiAhIEJJVDE1X1NFVCAoYWRkZW5kKSkKLQkgICAgfHwgKE9WRVJGTE9XUyAoYWRkZW5kLCBpbnNuKQotCQkmJiAoKCEgQklUMTVfU0VUIChpbnNuKSkgfHwgKEJJVDE1X1NFVCAoYWRkZW5kKSkpKSkKLQkgIHsKLQkgICAgYm9vbGVhbiBhbHJlYWR5X3VwZGF0ZWQ7Ci0JICAgIGJmZF9ieXRlICogaGkxNnNfYWRkcmVzcyA9IGZpbmRfcmVtZW1iZXJlZF9oaTE2c19yZWxvYwotCSAgICAgIChhZGRlbmQsICYgYWxyZWFkeV91cGRhdGVkKTsKLQkgICAgCi0JICAgIC8qIEFtZW5kIHRoZSBtYXRjaGluZyBISTE2X1MgcmVsb2NhdGlvbi4gICovCi0JICAgIGlmIChoaTE2c19hZGRyZXNzICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAoISBhbHJlYWR5X3VwZGF0ZWQpCi0JCSAgewotCQkgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGhpMTZzX2FkZHJlc3MpOwotCQkgICAgaW5zbiArPSAxOwotCQkgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgaGkxNnNfYWRkcmVzcyk7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZnByaW50ZiAoc3RkZXJyLCBfKCJGQUlMRUQgdG8gZmluZCBwcmV2aW91cyBISTE2IHJlbG9jXG4iKSk7Ci0JCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICAgICAgfQotCSAgfQotCQotCS8qIERvIG5vdCBjb21wbGFpbiBpZiB2YWx1ZSBoYXMgdG9wIGJpdCBzZXQsIGFzIHRoaXMgaGFzIGJlZW4gYW50aWNpcGF0ZWQuICAqLwotCWluc24gPSByZXN1bHQgJiAweGZmZmY7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIFJfVjg1MF84OgotICAgICAgYWRkZW5kICs9IChjaGFyKSBiZmRfZ2V0XzggKGFiZmQsIGFkZHJlc3MpOwotCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZiB8fCBzYWRkZW5kIDwgLTB4ODApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChhYmZkLCBhZGRlbmQsIGFkZHJlc3MpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVDoKLSAgICAgIGFkZGVuZCArPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4ZmZmZiB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBpbnNuID0gYWRkZW5kOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF8xNjoKLQotICAgICAgLyogZHJvcCB0aHJvdWdoICovICAgICAgICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1REQV8xNl8xNl9PRkZTRVQ6Ci0gICAgICBhZGRlbmQgKz0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDdmZmYgfHwgc2FkZGVuZCA8IC0weDgwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgaW5zbiA9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9IChpbnNuICYgMHhmZmZlKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2ZmZSB8fCBzYWRkZW5kIDwgLTB4ODAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoYWRkZW5kICYgMSkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gPSAoYWRkZW5kICYgfjEpIHwgKGluc24gJiAxKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfVERBXzZfOF9PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHg3ZSkgPDwgMSk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweGZjIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmIChhZGRlbmQgJiAzKQotCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuICY9IDB4ZmY4MTsKLSAgICAgIGluc24gfD0gKGFkZGVuZCA+PiAxKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfVERBXzdfOF9PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHg3ZikgPDwgMSk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweGZlIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmIChhZGRlbmQgJiAxKQotCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuICY9IDB4ZmY4MDsKLSAgICAgIGluc24gfD0gKGFkZGVuZCA+PiAxKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfVERBXzdfN19PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gaW5zbiAmIDB4N2Y7Ci0JCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZiB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpbnNuICY9IDB4ZmY4MDsKLSAgICAgIGluc24gfD0gYWRkZW5kOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9UREFfNF81X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoKGluc24gJiAweGYpIDw8IDEpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHgxZSB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoYWRkZW5kICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmZjA7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgPj4gMSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1REQV80XzRfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9IGluc24gJiAweGY7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweGYgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmZjA7Ci0gICAgICBpbnNuIHw9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4ZmZmZTAwMDApID4+IDE2KSArICgoaW5zbiAmIDB4MjApID4+IDUpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZmZmIHx8IHNhZGRlbmQgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHgwMDAxZmZkZjsKLSAgICAgIGluc24gfD0gKGFkZGVuZCAmIDEpIDw8IDU7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgJiB+MSkgPDwgMTY7Ci0gICAgICAKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGFkZHJlc3MpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX0NBTExUXzZfN19PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHgzZikgPDwgMSk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDdlIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmIChhZGRlbmQgJiAxKQotCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuICY9IDB4ZmY4MDsKLSAgICAgIGluc24gfD0gKGFkZGVuZCA+PiAxKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1Y4NTBfR05VX1ZUSU5IRVJJVDoKLSAgICBjYXNlIFJfVjg1MF9HTlVfVlRFTlRSWToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICB9Ci0KLSAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgYWRkcmVzcyk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLS8qIEluc2VydCB0aGUgYWRkZW5kIGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXY4NTBfZWxmX3JlbG9jIChhYmZkLCByZWxvYywgc3ltYm9sLCBkYXRhLCBpc2VjdGlvbiwgb2JmZCwgZXJyKQotICAgICBiZmQgKiAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKiAgIHJlbG9jOwotICAgICBhc3ltYm9sICogICBzeW1ib2w7Ci0gICAgIFBUUiAgICAgICAgIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiAgaXNlY3Rpb247Ci0gICAgIGJmZCAqICAgICAgIG9iZmQ7Ci0gICAgIGNoYXIgKiogICAgIGVyciBBVFRSSUJVVEVfVU5VU0VEOwotewotICBsb25nIHJlbG9jYXRpb247Ci0gIAotICAvKiBJZiB0aGVyZSBpcyBhbiBvdXRwdXQgQkZELAotICAgICBhbmQgdGhlIHN5bWJvbCBpcyBub3QgYSBzZWN0aW9uIG5hbWUgKHdoaWNoIGlzIG9ubHkgZGVmaW5lZCBhdCBmaW5hbCBsaW5rIHRpbWUpLAotICAgICBhbmQgZWl0aGVyIHdlIGFyZSBub3QgcHV0dGluZyB0aGUgYWRkZW5kIGludG8gdGhlIGluc3RydWN0aW9uCi0gICAgICAgICBvciB0aGUgYWRkZW5kIGlzIHplcm8sIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gYWRkIGludG8gdGhlIGluc3RydWN0aW9uCi0gICAgIHRoZW4ganVzdCBmaXh1cCB0aGUgYWRkcmVzcyBhbmQgcmV0dXJuLiAgKi8KLSAgaWYgKG9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgKCEgcmVsb2MtPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgIHx8IHJlbG9jLT5hZGRlbmQgPT0gMCkpCi0gICAgewotICAgICAgcmVsb2MtPmFkZHJlc3MgKz0gaXNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLSNpZiAwICAKLSAgZWxzZSBpZiAob2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgfQotI2VuZGlmCi0gIAotICAvKiBDYXRjaCByZWxvY3MgaW52b2x2aW5nIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMAotICAgICAgJiYgb2JmZCA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIFdlIGhhbmRsZSBmaW5hbCBsaW5raW5nIG9mIHNvbWUgcmVsb2NzIG91cnNlbHZlcy4gICovCi0KLSAgLyogSXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gcmVhbGx5IHdpdGhpbiB0aGUgc2VjdGlvbj8gICovCi0gIGlmIChyZWxvYy0+YWRkcmVzcyA+IGlzZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICAKLSAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCi0gIAotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLSAgCi0gIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUgKyBhZGRlbmQuICAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2MtPmFkZGVuZDsKLSAgCi0gIGlmIChyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0gICAgewotICAgICAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKLQkgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCi0gICAgICByZWxvY2F0aW9uIC09IGlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICAKLSAgICAgIC8qIERlYWwgd2l0aCBwY3JlbF9vZmZzZXQgKi8KLSAgICAgIHJlbG9jYXRpb24gLT0gcmVsb2MtPmFkZHJlc3M7Ci0gICAgfQotCi0gIHJlbG9jLT5hZGRlbmQgPSByZWxvY2F0aW9uOwkKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotDAotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICogICAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiAgbmFtZTsKLXsKLSAgcmV0dXJuICggICAobmFtZVswXSA9PSAnLicgJiYgKG5hbWVbMV0gPT0gJ0wnIHx8IG5hbWVbMV0gPT0gJy4nKSkKLQkgIHx8IChuYW1lWzBdID09ICdfJyAmJiAgbmFtZVsxXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAnTCcgJiYgbmFtZVszXSA9PSAnXycpKTsKLX0KLQotDAotLyogUGVyZm9ybSBhIHJlbG9jYXRpb24gYXMgcGFydCBvZiBhIGZpbmFsIGxpbmsuICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIG9mZnNldCwgdmFsdWUsCi0JCQkJICAgIGFkZGVuZCwgaW5mbywgc3ltX3NlYywgaXNfbG9jYWwpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgIGhvd3RvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgY29udGVudHM7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgIG9mZnNldDsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgdmFsdWU7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgc3ltX3NlYzsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgaXNfbG9jYWwgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgbG9uZyAgcl90eXBlICAgPSBob3d0by0+dHlwZTsKLSAgYmZkX2J5dGUgKiAgICAgaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLQotICAvKiBBZGp1c3QgdGhlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcmVsb2NhdGlvbi4gICovCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfVjg1MF85X1BDUkVMOgotICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHZhbHVlIC09IG9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIAotICAgIGNhc2UgUl9WODUwXzIyX1BDUkVMOgotICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSsgb2Zmc2V0KTsKLQotICAgICAgLyogSWYgdGhlIHNpZ24gZXh0ZW5zaW9uIHdpbGwgY29ycnVwdCB0aGUgdmFsdWUgdGhlbiB3ZSBoYXZlIG92ZXJmbG93ZWQuICAqLwotICAgICAgaWYgKCgodmFsdWUgJiAweGZmMDAwMDAwKSAhPSAweDApICYmICgodmFsdWUgJiAweGZmMDAwMDAwKSAhPSAweGZmMDAwMDAwKSkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICB2YWx1ZSA9IFNFWFQyNCAodmFsdWUpOyAgLyogT25seSB0aGUgYm90dG9tIDI0IGJpdHMgb2YgdGhlIFBDIGFyZSB2YWxpZCAqLwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9ISTE2X1M6Ci0gICAgY2FzZSBSX1Y4NTBfSEkxNjoKLSAgICBjYXNlIFJfVjg1MF9MTzE2OgotICAgIGNhc2UgUl9WODUwXzE2OgotICAgIGNhc2UgUl9WODUwXzMyOgotICAgIGNhc2UgUl9WODUwXzg6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQ6CQotICAgIGNhc2UgUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVDoKLSAgICAgIGlmIChzeW1fc2VjID09IE5VTEwpCi0JcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0JICAKLSAgICAgIHZhbHVlIC09IHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgZ3A7Ci0Jc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCi0JaWYgKHN5bV9zZWMgPT0gTlVMTCkKLQkgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCSAgCi0JLyogR2V0IHRoZSB2YWx1ZSBvZiBfX2dwLiAgKi8KLQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfX2dwIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQlpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci0KLQlncCA9IChoLT51LmRlZi52YWx1ZQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQl2YWx1ZSAtPSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCXZhbHVlIC09IChncCAtIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotICAgICAgfQotICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1Y4NTBfVERBXzRfNF9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzRfNV9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzE2XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9UREFfN183X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9UREFfN184X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9UREFfNl84X09GRlNFVDoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGVwOwotCXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogaDsKLQkKLQkvKiBHZXQgdGhlIHZhbHVlIG9mIF9fZXAuICAqLwotCWggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9fZXAiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCWlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsgIC8qIEFjdHVhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgX19lcCBjb3VsZCBub3QgYmUgZm91bmQuICovCi0KLQllcCA9IChoLT51LmRlZi52YWx1ZQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQl2YWx1ZSAtPSBlcDsKLSAgICAgIH0KLSAgICBicmVhazsKLSAgICAKLSAgICBjYXNlIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgY3RicDsKLQlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0JCi0JLyogR2V0IHRoZSB2YWx1ZSBvZiBfX2N0YnAuICAqLwotCWggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9fY3RicCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICByZXR1cm4gKGJmZF9yZWxvY19kYW5nZXJvdXMgKyAxKTsgIC8qIEFjdHVhbGx5IHRoaXMgaW5kaWNhdGVzIHRoYXQgX19jdGJwIGNvdWxkIG5vdCBiZSBmb3VuZC4gKi8KLQotCWN0YnAgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCXZhbHVlIC09IGN0YnA7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgY3RicDsKLQlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0KLQlpZiAoc3ltX3NlYyA9PSBOVUxMKQotCSAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0JICAKLQkvKiBHZXQgdGhlIHZhbHVlIG9mIF9fY3RicC4gICovCi0JaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCAiX19jdGJwIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQlpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgIHJldHVybiAoYmZkX3JlbG9jX2Rhbmdlcm91cyArIDEpOwotCi0JY3RicCA9IChoLT51LmRlZi52YWx1ZQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQl2YWx1ZSAtPSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCXZhbHVlIC09IChjdGJwIC0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9OT05FOgotICAgIGNhc2UgUl9WODUwX0dOVV9WVElOSEVSSVQ6Ci0gICAgY2FzZSBSX1Y4NTBfR05VX1ZURU5UUlk6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLQotICAvKiBQZXJmb3JtIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgcmV0dXJuIHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbiAoaW5wdXRfYmZkLCByX3R5cGUsIHZhbHVlICsgYWRkZW5kLCBoaXRfZGF0YSk7IAotfQotCi0MCi0vKiBSZWxvY2F0ZSBhbiBWODUwIEVMRiBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgIGxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqICAgICAgICAgICAgbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotCi0gIGlmIChzeW1faGFzaGVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nCi0JKGluZm8sICJubyBoYXNoIHRhYmxlIGF2YWlsYWJsZSIsIE5VTEwsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgMCk7Ci0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIAotICAvKiBSZXNldCB0aGUgbGlzdCBvZiByZW1lbWJlcmVkIEhJMTZTIHJlbG9jcyB0byBlbXB0eS4gICovCi0gIGZyZWVfaGkxNnMgICAgID0gcHJldmlvdXNfaGkxNnM7Ci0gIHByZXZpb3VzX2hpMTZzID0gTlVMTDsKLSAgaGkxNnNfY291bnRlciAgPSAwOwotICAKLSAgcmVsICAgID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgIGhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICByX3N5bW5keDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltOwotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICBzZWM7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSAgID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9WODUwX0dOVV9WVEVOVFJZCi0gICAgICAgICAgfHwgcl90eXBlID09IFJfVjg1MF9HTlVfVlRJTkhFUklUKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaG93dG8gPSB2ODUwX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotICAgICAgICAgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLSAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0jaWYgMAotCSAgewotCSAgICBjaGFyICogbmFtZTsKLQkgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKTsKLQkgICAgbmFtZSA9IChuYW1lID09IE5VTEwpID8gIjxub25lPiIgOiBuYW1lOwotZnByaW50ZiAoc3RkZXJyLCAibG9jYWw6IHNlYzogJXMsIHN5bTogJXMgKCVkKSwgdmFsdWU6ICV4ICsgJXggKyAleCBhZGRlbmQgJXhcbiIsCi0JIHNlYy0+bmFtZSwgbmFtZSwgc3ltLT5zdF9uYW1lLAotCSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEsIHNlYy0+b3V0cHV0X29mZnNldCwgc3ltLT5zdF92YWx1ZSwgcmVsLT5yX2FkZGVuZCk7Ci0JICB9Ci0jZW5kaWYKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIAotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICAKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLSNpZiAwCi1mcHJpbnRmIChzdGRlcnIsICJkZWZpbmVkOiBzZWM6ICVzLCBuYW1lOiAlcywgdmFsdWU6ICV4ICsgJXggKyAleCBnaXZlczogJXhcbiIsCi0JIHNlYy0+bmFtZSwgaC0+cm9vdC5yb290LnN0cmluZywgaC0+cm9vdC51LmRlZi52YWx1ZSwgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hLCBzZWMtPm91dHB1dF9vZmZzZXQsIHJlbG9jYXRpb24pOwotI2VuZGlmCi0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgewotI2lmIDAKLWZwcmludGYgKHN0ZGVyciwgInVuZGVmaW5lZDogc2VjOiAlcywgbmFtZTogJXNcbiIsCi0JIHNlYy0+bmFtZSwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotI2lmIDAKLWZwcmludGYgKHN0ZGVyciwgInVua25vd246IG5hbWU6ICVzXG4iLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLSNlbmRpZgotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHVzZSB0aGUgYWRkZW5kLCBidXQgdGhlIENPRkYgcmVsb2NhdGlvbnMKLSAgICAgICAgIGRvbid0LiAgKi8KLSAgICAgIHIgPSB2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkJcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCwKLQkJCQkJaW5mbywgc2VjLCBoID09IE5VTEwpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqIG5hbWU7Ci0JICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikwOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdGhlcjoKLQkgICAgICBtc2cgPSBfKCJjb3VsZCBub3QgbG9jYXRlIHNwZWNpYWwgbGlua2VyIHN5bWJvbCBfX2dwIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfY29udGludWU6Ci0JICAgICAgbXNnID0gXygiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19lcCIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgKGJmZF9yZWxvY19kYW5nZXJvdXMgKyAxKToKLQkgICAgICBtc2cgPSBfKCJjb3VsZCBub3QgbG9jYXRlIHNwZWNpYWwgbGlua2VyIHN5bWJvbCBfX2N0YnAiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQkgICAgICAKLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGNvbW1vbl9lcnJvcjoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcyBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBObyBnb3QgYW5kIHBsdCBlbnRyaWVzIGZvciB2ODUwLWVsZiAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGFzZWN0aW9uICoKLXY4NTBfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgICAgYmZkICphYmZkOwotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9WODUwX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfVjg1MF9HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gTlVMTDsKLX0KLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIuICAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9WODUwX0FSQ0gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBFX1Y4NTBfQVJDSDogICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfdjg1MCwgMCk7IGJyZWFrOwotICAgIGNhc2UgRV9WODUwRV9BUkNIOiAgKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3Y4NTAsIGJmZF9tYWNoX3Y4NTBlKTsgYnJlYWs7Ci0gICAgY2FzZSBFX1Y4NTBFQV9BUkNIOiAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfdjg1MCwgYmZkX21hY2hfdjg1MGVhKTsgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RvcmUgdGhlIG1hY2hpbmUgbnVtYmVyIGluIHRoZSBmbGFncyBmaWVsZC4gICovCi1zdGF0aWMgdm9pZAotdjg1MF9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKiAgIGFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6IHZhbCA9IEVfVjg1MF9BUkNIOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOiAgdmFsID0gRV9WODUwRV9BUkNIOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlYTogdmFsID0gRV9WODUwRUFfQVJDSDsgIGJyZWFrOwotICAgIH0KLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPX4gRUZfVjg1MF9BUkNIOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSB2YWw7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGtlZXAgVjg1MCBzcGVjaWZpYyBmaWxlIGZsYWdzLiAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICogICAgYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICogaWJmZDsKLSAgICAgYmZkICogb2JmZDsKLXsKLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCAoZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MKLQkJICA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncykpOwotCi0gIGVsZl9ncCAob2JmZCkgPSBlbGZfZ3AgKGliZmQpOwotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBmbGFnd29yZCBvdXRfZmxhZ3M7Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbl9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAotCSBib3RoZXIgc2V0dGluZyB0aGUgZmxhZ3MgZm9yIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLAotCSBpbnN0ZWFkIGFsbG93IGZ1dHVyZSBtZXJnZXMgdG8gZG8gdGhpcy4gIElmIG5vIGZ1dHVyZQotCSBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCi0JIHVuaXRpYWxpc2VkIHZhbHVlcywgd2hpY2ggc3VycHJpc2Ugc3VycHJpc2UsIGNvcnJlc3BvbmQKLQkgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoaWJmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiB0cnVlOwotICAgICAgCi0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLQotICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKLQl7Ci0JICByZXR1cm4gYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZsYWcgY29tcGF0aWJpbGl0eS4gICovCi0gIGlmIChpbl9mbGFncyA9PSBvdXRfZmxhZ3MpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX1Y4NTBfQVJDSCkgIT0gKG91dF9mbGFncyAmIEVGX1Y4NTBfQVJDSCkKLSAgICAgICYmIChpbl9mbGFncyAmIEVGX1Y4NTBfQVJDSCkgIT0gRV9WODUwX0FSQ0gpCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogQXJjaGl0ZWN0dXJlIG1pc21hdGNoIHdpdGggcHJldmlvdXMgbW9kdWxlcyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBQVFIgICAgIHB0cjsKLXsKLSAgRklMRSAqIGZpbGUgPSAoRklMRSAqKSBwdHI7Ci0gIAotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOwotICAKLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKTsKLSAgCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8oInByaXZhdGUgZmxhZ3MgPSAlbHg6ICIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7Ci0gIAotICBzd2l0Y2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfVjg1MF9BUkNIKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgRV9WODUwX0FSQ0g6IGZwcmludGYgKGZpbGUsIF8oInY4NTAgYXJjaGl0ZWN0dXJlIikpOyBicmVhazsKLSAgICBjYXNlIEVfVjg1MEVfQVJDSDogIGZwcmludGYgKGZpbGUsIF8oInY4NTBlIGFyY2hpdGVjdHVyZSIpKTsgYnJlYWs7Ci0gICAgY2FzZSBFX1Y4NTBFQV9BUkNIOiBmcHJpbnRmIChmaWxlLCBfKCJ2ODUwZWEgYXJjaGl0ZWN0dXJlIikpOyBicmVhazsKLSAgICB9Ci0gIAotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVjg1MCBFTEYgdXNlcyBmb3VyIGNvbW1vbiBzZWN0aW9ucy4gIE9uZSBpcyB0aGUgdXN1YWwgb25lLCBhbmQgdGhlCi0gICBvdGhlcnMgYXJlIGZvciAoc21hbGwpIG9iamVjdHMgaW4gb25lIG9mIHRoZSBzcGVjaWFsIGRhdGEgYXJlYXM6Ci0gICBzbWFsbCwgdGlueSBhbmQgemVyby4gIEFsbCB0aGUgb2JqZWN0cyBhcmUga2VwdCB0b2dldGhlciwgYW5kIHRoZW4KLSAgIHJlZmVyZW5jZWQgdmlhIHRoZSBncCByZWdpc3RlciwgdGhlIGVwIHJlZ2lzdGVyIG9yIHRoZSByMCByZWdpc3RlcgotICAgcmVzcGVjdGl2ZWx5LCB3aGljaCB5aWVsZHMgc21hbGxlciwgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgVGhpcwotICAgYXBwcm9hY2ggaXMgY29waWVkIGZyb20gZWxmMzItbWlwcy5jLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICB2ODUwX2VsZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCAgIHY4NTBfZWxmX3Njb21fc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKiB2ODUwX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci1zdGF0aWMgYXNlY3Rpb24gIHY4NTBfZWxmX3Rjb21fc2VjdGlvbjsKLXN0YXRpYyBhc3ltYm9sICAgdjg1MF9lbGZfdGNvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqIHY4NTBfZWxmX3Rjb21fc3ltYm9sX3B0cjsKLXN0YXRpYyBhc2VjdGlvbiAgdjg1MF9lbGZfemNvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgICB2ODUwX2VsZl96Y29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICogdjg1MF9lbGZfemNvbV9zeW1ib2xfcHRyOwotCi0KLS8qIEdpdmVuIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRUxGIHNlY3Rpb24KLSAgIGluZGV4LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgaGRyLCBzZWMsIHJldHZhbCkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIGhkciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgc2VjOwotICAgICBpbnQgKiAgICAgICAgICAgICAgICAgcmV0dmFsOwotewotICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5zY29tbW9uIikgPT0gMCkKLSAgICAqcmV0dmFsID0gU0hOX1Y4NTBfU0NPTU1PTjsKLSAgZWxzZSBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi50Y29tbW9uIikgPT0gMCkKLSAgICAqcmV0dmFsID0gU0hOX1Y4NTBfVENPTU1PTjsKLSAgZWxzZSBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi56Y29tbW9uIikgPT0gMCkKLSAgICAqcmV0dmFsID0gU0hOX1Y4NTBfWkNPTU1PTjsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgdGhlIHNwZWNpYWwgVjg1MCBzZWN0aW9uIG51bWJlcnMgdGhhdCBhIHN5bWJvbCBtYXkgdXNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nIChhYmZkLCBhc3ltKQotICAgICBiZmQgKiAgICAgYWJmZDsKLSAgICAgYXN5bWJvbCAqIGFzeW07Ci17Ci0gIGVsZl9zeW1ib2xfdHlwZSAqIGVsZnN5bSA9IChlbGZfc3ltYm9sX3R5cGUgKikgYXN5bTsKLSAgdW5zaWduZWQgc2hvcnQgaW5kZXg7Ci0gIAotICBpbmRleCA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaG5keDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbiBpbmRleCBpcyBhbiAib3JkaW5hcnkiIGluZGV4LCB0aGVuIGl0IG1heQotICAgICByZWZlciB0byBhIHY4NTAgc3BlY2lmaWMgc2VjdGlvbiBjcmVhdGVkIGJ5IHRoZSBhc3NlbWJsZXIuCi0gICAgIENoZWNrIHRoZSBzZWN0aW9uJ3MgdHlwZSBhbmQgY2hhbmdlIHRoZSBpbmRleCBpdCBtYXRjaGVzLgotICAgICAKLSAgICAgRklYTUU6IFNob3VsZCB3ZSBhbHRlciB0aGUgc3Rfc2huZHggZmllbGQgYXMgd2VsbCA/ICAqLwotICAKLSAgaWYgKGluZGV4IDwgZWxmX2VsZmhlYWRlcihhYmZkKVswXS5lX3NobnVtKQotICAgIHN3aXRjaCAoZWxmX2VsZnNlY3Rpb25zKGFiZmQpW2luZGV4XS0+c2hfdHlwZSkKLSAgICAgIHsKLSAgICAgIGNhc2UgU0hUX1Y4NTBfU0NPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1NDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIFNIVF9WODUwX1RDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9UQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgY2FzZSBTSFRfVjg1MF9aQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfWkNPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIAotICBzd2l0Y2ggKGluZGV4KQotICAgIHsKLSAgICBjYXNlIFNITl9WODUwX1NDT01NT046Ci0gICAgICBpZiAodjg1MF9lbGZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICB2ODUwX2VsZl9zY29tX3NlY3Rpb24ubmFtZSAgICAgICAgICAgPSAiLnNjb21tb24iOwotCSAgdjg1MF9lbGZfc2NvbV9zZWN0aW9uLmZsYWdzICAgICAgICAgID0gU0VDX0lTX0NPTU1PTiB8IFNFQ19BTExPQyB8IFNFQ19EQVRBOwotCSAgdjg1MF9lbGZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJiB2ODUwX2VsZl9zY29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sICAgICAgICAgPSAmIHY4NTBfZWxmX3Njb21fc3ltYm9sOwotCSAgdjg1MF9lbGZfc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJiB2ODUwX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0JICB2ODUwX2VsZl9zY29tX3N5bWJvbC5uYW1lICAgICAgICAgICAgPSAiLnNjb21tb24iOwotCSAgdjg1MF9lbGZfc2NvbV9zeW1ib2wuZmxhZ3MgICAgICAgICAgID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgdjg1MF9lbGZfc2NvbV9zeW1ib2wuc2VjdGlvbiAgICAgICAgID0gJiB2ODUwX2VsZl9zY29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl9zY29tX3N5bWJvbF9wdHIgICAgICAgICAgICAgPSAmIHY4NTBfZWxmX3Njb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmIHY4NTBfZWxmX3Njb21fc2VjdGlvbjsKLSAgICAgIGFzeW0tPnZhbHVlID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgU0hOX1Y4NTBfVENPTU1PTjoKLSAgICAgIGlmICh2ODUwX2VsZl90Y29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHRjb21tb24gc2VjdGlvbi4gICovCi0JICB2ODUwX2VsZl90Y29tX3NlY3Rpb24ubmFtZSAgICAgICAgICAgPSAiLnRjb21tb24iOwotCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLmZsYWdzICAgICAgICAgID0gU0VDX0lTX0NPTU1PTjsKLQkgIHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICYgdjg1MF9lbGZfdGNvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLnN5bWJvbCAgICAgICAgID0gJiB2ODUwX2VsZl90Y29tX3N5bWJvbDsKLQkgIHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICYgdjg1MF9lbGZfdGNvbV9zeW1ib2xfcHRyOwotCSAgdjg1MF9lbGZfdGNvbV9zeW1ib2wubmFtZSAgICAgICAgICAgID0gIi50Y29tbW9uIjsKLQkgIHY4NTBfZWxmX3Rjb21fc3ltYm9sLmZsYWdzICAgICAgICAgICA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIHY4NTBfZWxmX3Rjb21fc3ltYm9sLnNlY3Rpb24gICAgICAgICA9ICYgdjg1MF9lbGZfdGNvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfdGNvbV9zeW1ib2xfcHRyICAgICAgICAgICAgID0gJiB2ODUwX2VsZl90Y29tX3N5bWJvbDsKLQl9Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gJiB2ODUwX2VsZl90Y29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9WODUwX1pDT01NT046Ci0gICAgICBpZiAodjg1MF9lbGZfemNvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSB6Y29tbW9uIHNlY3Rpb24uICAqLwotCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLm5hbWUgICAgICAgICAgID0gIi56Y29tbW9uIjsKLQkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5mbGFncyAgICAgICAgICA9IFNFQ19JU19DT01NT047Ci0JICB2ODUwX2VsZl96Y29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmIHY4NTBfZWxmX3pjb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5zeW1ib2wgICAgICAgICA9ICYgdjg1MF9lbGZfemNvbV9zeW1ib2w7Ci0JICB2ODUwX2VsZl96Y29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmIHY4NTBfZWxmX3pjb21fc3ltYm9sX3B0cjsKLQkgIHY4NTBfZWxmX3pjb21fc3ltYm9sLm5hbWUgICAgICAgICAgICA9ICIuemNvbW1vbiI7Ci0JICB2ODUwX2VsZl96Y29tX3N5bWJvbC5mbGFncyAgICAgICAgICAgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICB2ODUwX2VsZl96Y29tX3N5bWJvbC5zZWN0aW9uICAgICAgICAgPSAmIHY4NTBfZWxmX3pjb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3pjb21fc3ltYm9sX3B0ciAgICAgICAgICAgICA9ICYgdjg1MF9lbGZfemNvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICYgdjg1MF9lbGZfemNvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogSG9vayBjYWxsZWQgYnkgdGhlIGxpbmtlciByb3V0aW5lIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIFdlIG11c3QgaGFuZGxlIHRoZSBzcGVjaWFsIHY4NTAgc2VjdGlvbiBudW1iZXJzIGhlcmUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICBpbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiBzeW07Ci0gICAgIGNvbnN0IGNoYXIgKiogICAgICAgICAgICBuYW1lcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmbGFnd29yZCAqICAgICAgICAgICAgICAgZmxhZ3NwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICoqICAgICAgICAgICAgICBzZWNwOwotICAgICBiZmRfdm1hICogICAgICAgICAgICAgICAgdmFscDsKLXsKLSAgaW50IGluZGV4ID0gc3ltLT5zdF9zaG5keDsKLSAgCi0gIC8qIElmIHRoZSBzZWN0aW9uIGluZGV4IGlzIGFuICJvcmRpbmFyeSIgaW5kZXgsIHRoZW4gaXQgbWF5Ci0gICAgIHJlZmVyIHRvIGEgdjg1MCBzcGVjaWZpYyBzZWN0aW9uIGNyZWF0ZWQgYnkgdGhlIGFzc2VtYmxlci4KLSAgICAgQ2hlY2sgdGhlIHNlY3Rpb24ncyB0eXBlIGFuZCBjaGFuZ2UgdGhlIGluZGV4IGl0IG1hdGNoZXMuCi0gICAgIAotICAgICBGSVhNRTogU2hvdWxkIHdlIGFsdGVyIHRoZSBzdF9zaG5keCBmaWVsZCBhcyB3ZWxsID8gICovCi0gIAotICBpZiAoaW5kZXggPCBlbGZfZWxmaGVhZGVyKGFiZmQpWzBdLmVfc2hudW0pCi0gICAgc3dpdGNoIChlbGZfZWxmc2VjdGlvbnMoYWJmZClbaW5kZXhdLT5zaF90eXBlKQotICAgICAgewotICAgICAgY2FzZSBTSFRfVjg1MF9TQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfU0NPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgU0hUX1Y4NTBfVENPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1RDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIFNIVF9WODUwX1pDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9aQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLSAgCi0gIHN3aXRjaCAoaW5kZXgpCi0gICAgewotICAgIGNhc2UgU0hOX1Y4NTBfU0NPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBTSE5fVjg1MF9UQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIudGNvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFNITl9WODUwX1pDT01NT046Ci0gICAgICAqc2VjcCA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi56Y29tbW9uIik7Ci0gICAgICAoKnNlY3ApLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qQVJHU0lHTk9SRUQqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBuYW1lLCBzeW0sIGlucHV0X3NlYykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICogICAgICAgICAgIG5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICBzeW07Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgaW5wdXRfc2VjOwotewotICAvKiBJZiB3ZSBzZWUgYSBjb21tb24gc3ltYm9sLCB3aGljaCBpbXBsaWVzIGEgcmVsb2NhdGFibGUgbGluaywgdGhlbgotICAgICBpZiBhIHN5bWJvbCB3YXMgaW4gYSBzcGVjaWFsIGNvbW1vbiBzZWN0aW9uIGluIGFuIGlucHV0IGZpbGUsIG1hcmsKLSAgICAgaXQgYXMgYSBzcGVjaWFsIGNvbW1vbiBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICAKLSAgaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChpbnB1dF9zZWMtPm5hbWUsICIuc2NvbW1vbiIpID09IDApCi0Jc3ltLT5zdF9zaG5keCA9IFNITl9WODUwX1NDT01NT047Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGlucHV0X3NlYy0+bmFtZSwgIi50Y29tbW9uIikgPT0gMCkKLQlzeW0tPnN0X3NobmR4ID0gU0hOX1Y4NTBfVENPTU1PTjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaW5wdXRfc2VjLT5uYW1lLCAiLnpjb21tb24iKSA9PSAwKQotCXN5bS0+c3Rfc2huZHggPSBTSE5fVjg1MF9aQ09NTU9OOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKiBoZHI7Ci0gICAgIGNoYXIgKiAgICAgICAgICAgICAgbmFtZTsKLXsKLSAgLyogVGhlcmUgb3VnaHQgdG8gYmUgYSBwbGFjZSB0byBrZWVwIEVMRiBiYWNrZW5kIHNwZWNpZmljIGZsYWdzLCBidXQKLSAgICAgYXQgdGhlIG1vbWVudCB0aGVyZSBpc24ndCBvbmUuICBXZSBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlCi0gICAgIHNlY3Rpb25zIGJ5IHRoZWlyIG5hbWUsIGluc3RlYWQuICAqLwotCi0gIGlmICghIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN3aXRjaCAoaGRyLT5zaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9WODUwX1NDT01NT046Ci0gICAgY2FzZSBTSFRfVjg1MF9UQ09NTU9OOgotICAgIGNhc2UgU0hUX1Y4NTBfWkNPTU1PTjoKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgaGRyLT5iZmRfc2VjdGlvbiwKLQkJCQkgICAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLAotCQkJCQkJCSAgIGhkci0+YmZkX3NlY3Rpb24pCi0JCQkJICAgIHwgU0VDX0lTX0NPTU1PTikpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29ycmVjdCB0eXBlIGZvciBhIFY4NTAgRUxGIHNlY3Rpb24uICBXZSBkbyB0aGlzIGJ5IHRoZQotICAgc2VjdGlvbiBuYW1lLCB3aGljaCBpcyBhIGhhY2ssIGJ1dCBvdWdodCB0byB3b3JrLiAgKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9mYWtlX3NlY3Rpb25zIChhYmZkLCBoZHIsIHNlYykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIGhkcjsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgIHNlYzsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqIG5hbWU7Ci0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICIuc2NvbW1vbiIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX1Y4NTBfU0NPTU1PTjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi50Y29tbW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfVjg1MF9UQ09NTU9OOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnpjb21tb24iKSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9WODUwX1pDT01NT047Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQkJYmZkX2VsZjMyX3Y4NTBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJCSJlbGYzMi12ODUwIgotI2RlZmluZSBFTEZfQVJDSAkJCQliZmRfYXJjaF92ODUwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCQlFTV9DWUdOVVNfVjg1MAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkJMHgxMDAwCi0JCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQkJdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWxhCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJCXY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCQl2ODUwX2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiAgICAJdjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkJCXY4NTBfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgCXY4NTBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIAl2ODUwX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJCXY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkJdjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIAl2ODUwX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkJdjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwkJdjg1MF9lbGZfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgICAgdjg1MF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICB2ODUwX2VsZl9nY19zd2VlcF9ob29rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQl2ODUwX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCXY4NTBfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAl2ODUwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIAl2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJCXY4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQl2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIJCQknXycKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLmMgYi9iZmQvZWxmMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyMjk2OS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIEVMRiAzMi1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRQkJMzIKLQotCi0jaW5jbHVkZSAiZWxmY29kZS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LWFscGhhLmMgYi9iZmQvZWxmNjQtYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExNGJjYy4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQtYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3MDEgKzAsMCBAQAotLyogQWxwaGEgc3BlY2lmaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdlIG5lZWQgYSBwdWJsaXNoZWQgQUJJIHNwZWMgZm9yIHRoaXMuICBVbnRpbCBvbmUgY29tZXMgb3V0LCBkb24ndAotICAgYXNzdW1lIHRoaXMnbGwgcmVtYWluIHVuY2hhbmdlZCBmb3JldmVyLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2luY2x1ZGUgImVsZi9hbHBoYS5oIgotCi0jZGVmaW5lIEFMUEhBRUNPRkYKLQotI2RlZmluZSBOT19DT0ZGX1JFTE9DUwotI2RlZmluZSBOT19DT0ZGX1NZTUJPTFMKLSNkZWZpbmUgTk9fQ09GRl9MSU5FTk9TCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBOZWVkZWQgZm9yIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbi4gKi8KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotI2luY2x1ZGUgImNvZmYvYWxwaGEuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0jZGVmaW5lIEVDT0ZGXzY0Ci0jaW5jbHVkZSAiZWNvZmZzd2FwLmgiCi0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICogZWxmNjRfYWxwaGFfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICogZWxmNjRfYWxwaGFfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TKChiZmQgKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjY0X2FscGhhX3JlbG9jX25pbAotICBQQVJBTVMoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGY2NF9hbHBoYV9yZWxvY19iYWQKLSAgUEFSQU1TKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwCi0gIFBBUkFNUygoYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICosIGJmZF9ieXRlICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmNjRfYWxwaGFfcmVsb2NfZ3BkaXNwCi0gIFBBUkFNUygoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogZWxmNjRfYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUygoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgZWxmNjRfYWxwaGFfaW5mb190b19ob3d0bwotICBQQVJBTVMoKGJmZCAqLCBhcmVsZW50ICosIEVsZjY0X0ludGVybmFsX1JlbGEgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9vYmplY3RfcAotICBQQVJBTVMoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMoKGJmZCAqLCBFbGY2NF9JbnRlcm5hbF9TaGRyICosIGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmFrZV9zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBFbGY2NF9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NyZWF0ZV9nb3Rfc2VjdGlvbgotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbwotICBQQVJBTVMoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9pc19sb2NhbF9sYWJlbF9uYW1lCi0gIFBBUkFNUygoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnk7Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfb3V0cHV0X2V4dHN5bQotICBQQVJBTVMoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jYW5fbWVyZ2VfZ290cwotICBQQVJBTVMoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgZWxmNjRfYWxwaGFfbWVyZ2VfZ290cwotICBQQVJBTVMoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0c19mb3Jfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIHZvaWQgZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0cyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzCi0gIFBBUkFNUyAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqc2VjLAotCSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUygoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmluYWxfbGluawotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLQwKLXN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogRXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgRVhUUiBlc3ltOwotCi0gIC8qIEN1bXVsYXRpdmUgZmxhZ3MgZm9yIGFsbCB0aGUgLmdvdCBlbnRyaWVzLiAgKi8KLSAgaW50IGZsYWdzOwotCi0gIC8qIENvbnRleHRzIChMSVRVU0UpIGluIHdoaWNoIGEgbGl0ZXJhbCB3YXMgcmVmZXJlbmNlZC4gICovCi0jZGVmaW5lIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfQUREUiAweDAxCi0jZGVmaW5lIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfTUVNICAweDAyCi0jZGVmaW5lIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfQllURSAweDA0Ci0jZGVmaW5lIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfRlVOQyAweDA4Ci0KLSAgLyogVXNlZCB0byBpbXBsZW1lbnQgbXVsdGlwbGUgLmdvdCBzdWJzZWN0aW9ucy4gICovCi0gIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5Ci0gIHsKLSAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqbmV4dDsKLQotICAgIC8qIHdoaWNoIC5nb3Qgc3Vic2VjdGlvbj8gICovCi0gICAgYmZkICpnb3RvYmo7Ci0KLSAgICAvKiB0aGUgYWRkZW5kIGluIGVmZmVjdCBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAvKiB0aGUgLmdvdCBvZmZzZXQgZm9yIHRoaXMgZW50cnkuICAqLwotICAgIGludCBnb3Rfb2Zmc2V0OwotCi0gICAgaW50IGZsYWdzOwotCi0gICAgLyogQW4gYWRkaXRpb25hbCBmbGFnLiAgKi8KLSNkZWZpbmUgQUxQSEFfRUxGX0dPVF9FTlRSWV9SRUxPQ1NfRE9ORSAweDEwCi0KLSAgICBpbnQgdXNlX2NvdW50OwotICB9ICpnb3RfZW50cmllczsKLQotICAvKiB1c2VkIHRvIGNvdW50IG5vbi1nb3QsIG5vbi1wbHQgcmVsb2NhdGlvbnMgZm9yIGRlbGF5ZWQgc2l6aW5nCi0gICAgIG9mIHJlbG9jYXRpb24gc2VjdGlvbnMuICAqLwotICBzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5Ci0gIHsKLSAgICBzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5ICpuZXh0OwotCi0gICAgLyogd2hpY2ggLnJlbG9jIHNlY3Rpb24/ICovCi0gICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAvKiB3aGF0IGtpbmQgb2YgcmVsb2NhdGlvbj8gKi8KLSAgICB1bnNpZ25lZCBsb25nIHJ0eXBlOwotCi0gICAgLyogaG93IG1hbnkgZGlkIHdlIGZpbmQ/ICAqLwotICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7Ci0gIH0gKnJlbG9jX2VudHJpZXM7Ci19OwotCi0vKiBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFRoZSBoZWFkIG9mIGEgbGlzdCBvZiAuZ290IHN1YnNlY3Rpb25zIGxpbmtlZCB0aHJvdWdoCi0gICAgIGFscGhhX2VsZl90ZGF0YShhYmZkKS0+Z290X2xpbmtfbmV4dC4gICovCi0gIGJmZCAqZ290X2xpc3Q7Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhbHBoYV9lbGZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCi0gICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFscGhhX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGFscGhhX2VsZl9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogR2V0IHRoZSBvYmplY3QncyBzeW1ib2xzIGFzIG91ciBvd24gZW50cnkgdHlwZS4gICovCi0KLSNkZWZpbmUgYWxwaGFfZWxmX3N5bV9oYXNoZXMoYWJmZCkgXAotICAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICoqKWVsZl9zeW1faGFzaGVzKGFiZmQpKQotCi0vKiBTaG91bGQgd2UgZG8gZHluYW1pYyB0aGluZ3MgdG8gdGhpcyBzeW1ib2w/ICAqLwotCi0jZGVmaW5lIGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKGgsIGluZm8pIAkJCQlcCi0gICgoKChpbmZvKS0+c2hhcmVkICYmICEoaW5mbyktPnN5bWJvbGljKQkJCQlcCi0gICAgfHwgKCgoaCktPmVsZl9saW5rX2hhc2hfZmxhZ3MJCQkJCVwKLQkgJiAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQyB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpKQlcCi0gICAgICAgID09IChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikpCVwKLSAgICB8fCAoaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawkJCVwKLSAgICB8fCAoaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCQkJCVwKLSAgICYmIChoKS0+ZHluaW5keCAhPSAtMSkKLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGEgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGY2NF9hbHBoYV9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgbWVtc2V0ICgmcmV0LT5lc3ltLCAwLCBzaXplb2YgKEVYVFIpKTsKLSAgICAgIC8qIFdlIHVzZSAtMiBhcyBhIG1hcmtlciB0byBpbmRpY2F0ZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBoYXMKLQkgbm90IGJlZW4gc2V0LiAgLTEgbWVhbnMgdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCBpZmQuICAqLwotICAgICAgcmV0LT5lc3ltLmlmZCA9IC0yOwotICAgICAgcmV0LT5mbGFncyA9IDA7Ci0gICAgICByZXQtPmdvdF9lbnRyaWVzID0gTlVMTDsKLSAgICAgIHJldC0+cmVsb2NfZW50cmllcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWVsZjY0X2FscGhhX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgICBlbGY2NF9hbHBoYV9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQwKLS8qIFdlIGhhdmUgc29tZSBwcml2YXRlIGZpZWxkcyBoYW5naW5nIG9mZiBvZiB0aGUgZWxmX3RkYXRhIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhCi17Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhIHJvb3Q7Ci0KLSAgLyogRm9yIGV2ZXJ5IGlucHV0IGZpbGUsIHRoZXNlIGFyZSB0aGUgZ290IGVudHJpZXMgZm9yIHRoYXQgb2JqZWN0J3MKLSAgICAgbG9jYWwgc3ltYm9scy4gICovCi0gIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqIGxvY2FsX2dvdF9lbnRyaWVzOwotCi0gIC8qIEZvciBldmVyeSBpbnB1dCBmaWxlLCB0aGlzIGlzIHRoZSBvYmplY3QgdGhhdCBvd25zIHRoZSBnb3QgdGhhdAotICAgICB0aGlzIGlucHV0IGZpbGUgdXNlcy4gICovCi0gIGJmZCAqZ290b2JqOwotCi0gIC8qIEZvciBldmVyeSBnb3QsIHRoaXMgaXMgYSBsaW5rZWQgbGlzdCB0aHJvdWdoIHRoZSBvYmplY3RzIHVzaW5nIHRoaXMgZ290ICovCi0gIGJmZCAqaW5fZ290X2xpbmtfbmV4dDsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIGEgbGluayB0byB0aGUgbmV4dCBnb3Qgc3Vic2VnbWVudC4gICovCi0gIGJmZCAqZ290X2xpbmtfbmV4dDsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIHRoZSBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKmdvdDsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIGl0J3MgdG90YWwgbnVtYmVyIG9mICplbnRyaWVzKi4gICovCi0gIGludCB0b3RhbF9nb3RfZW50cmllczsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlciBvZiAqZW50cmllcyogcmVxdWlyZWQKLSAgICAgdG8gaG9sZCBhbGwgb2YgdGhlIG1lbWJlciBvYmplY3QncyBsb2NhbCBnb3QuICAqLwotICBpbnQgbl9sb2NhbF9nb3RfZW50cmllczsKLX07Ci0KLSNkZWZpbmUgYWxwaGFfZWxmX3RkYXRhKGFiZmQpIFwKLSAgKChzdHJ1Y3QgYWxwaGFfZWxmX29ial90ZGF0YSAqKSAoYWJmZCktPnRkYXRhLmFueSkKLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPnRkYXRhLmFueSA9IGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9vYmpfdGRhdGEpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmFueSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAvKiBBbGxvY2F0ZSBvdXIgc3BlY2lhbCB0YXJnZXQgZGF0YS4gICovCi0gIHN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhICpuZXdfdGRhdGE7Ci0gIG5ld190ZGF0YSA9IGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9vYmpfdGRhdGEpKTsKLSAgaWYgKG5ld190ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmV3X3RkYXRhLT5yb290ID0gKmFiZmQtPnRkYXRhLmVsZl9vYmpfZGF0YTsKLSAgYWJmZC0+dGRhdGEuYW55ID0gbmV3X3RkYXRhOwotCi0gIC8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGFuIEFscGhhIEVMRiBmaWxlLiAgKi8KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2FscGhhLCAwKTsKLX0KLQwKLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUKLSAgIGZyb20gc21hbGxlciB2YWx1ZXMuICBTdGFydCB3aXRoIHplcm8sIHdpZGVuLCAqdGhlbiogZGVjcmVtZW50LiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FCSgoKGJmZF92bWEpMCkgLSAxKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGY2NF9hbHBoYV9ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8gKFJfQUxQSEFfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX25pbCwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfUkVGTE9ORywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZMT05HIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfUkVGUVVBRCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZRVUFEIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IEdQIHJlbGF0aXZlIG9mZnNldC4gIFRoaXMgaXMganVzdCBsaWtlIFJFRkxPTkcgZXhjZXB0Ci0gICAgIHRoYXQgd2hlbiB0aGUgdmFsdWUgaXMgdXNlZCB0aGUgdmFsdWUgb2YgdGhlIGdwIHJlZ2lzdGVyIHdpbGwgYmUKLSAgICAgYWRkZWQgaW4uICAqLwotICBIT1dUTyAoUl9BTFBIQV9HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIGZvciBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlZmVycyB0byBtZW1vcnkgb2ZmIHRoZSBHUCByZWdpc3Rlci4gICovCi0gIEhPV1RPIChSX0FMUEhBX0xJVEVSQUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkVMRl9MSVRFUkFMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgcmVsb2Mgb25seSBhcHBlYXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhbiBFTEZfTElURVJBTCByZWxvYy4KLSAgICAgSXQgaWRlbnRpZmllcyBhIHVzZSBvZiB0aGUgbGl0ZXJhbC4gIFRoZSBzeW1ib2wgaW5kZXggaXMgc3BlY2lhbDoKLSAgICAgMSBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSBiYXNlIHJlZ2lzdGVyIG9mIGEgbWVtb3J5Ci0gICAgIGZvcm1hdCBpbnN0cnVjdGlvbjsgMiBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSBieXRlCi0gICAgIG9mZnNldCByZWdpc3RlciBvZiBhIGJ5dGUtbWFuaXB1bGF0aW9uIGluc3RydWN0aW9uOyAzIG1lYW5zIHRoZQotICAgICBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIHRhcmdldCByZWdpc3RlciBvZiBhIGpzciBpbnN0cnVjdGlvbi4KLSAgICAgVGhpcyBkb2VzIG5vdCBhY3R1YWxseSBkbyBhbnkgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0FMUEhBX0xJVFVTRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19uaWwsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVFVTRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG9hZCB0aGUgZ3AgcmVnaXN0ZXIuICBUaGlzIGlzIGFsd2F5cyB1c2VkIGZvciBhIGxkYWggaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggbG9hZHMgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGdwIHJlZ2lzdGVyLiAgVGhlIHN5bWJvbAotICAgICBpbmRleCBvZiB0aGUgR1BESVNQIGluc3RydWN0aW9uIGlzIGFuIG9mZnNldCBpbiBieXRlcyB0byB0aGUgbGRhCi0gICAgIGluc3RydWN0aW9uIHRoYXQgbG9hZHMgdGhlIGxvd2VyIDE2IGJpdHMuICBUaGUgdmFsdWUgdG8gdXNlIGZvcgotICAgICB0aGUgcmVsb2NhdGlvbiBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBHUCB2YWx1ZSBhbmQgdGhlCi0gICAgIGN1cnJlbnQgbG9jYXRpb247IHRoZSBsb2FkIHdpbGwgYWx3YXlzIGJlIGRvbmUgYWdhaW5zdCBhIHJlZ2lzdGVyCi0gICAgIGhvbGRpbmcgdGhlIGN1cnJlbnQgYWRkcmVzcy4KLQotICAgICBOT1RFOiBVbmxpa2UgRUNPRkYsIHBhcnRpYWwgaW4tcGxhY2UgcmVsb2NhdGlvbiBpcyBub3QgZG9uZS4gIElmCi0gICAgIGFueSBvZmZzZXQgaXMgcHJlc2VudCBpbiB0aGUgaW5zdHJ1Y3Rpb25zLCBpdCBpcyBhbiBvZmZzZXQgZnJvbQotICAgICB0aGUgcmVnaXN0ZXIgdG8gdGhlIGxkYWggaW5zdHJ1Y3Rpb24uICBUaGlzIGxldHMgdXMgYXZvaWQgYW55Ci0gICAgIHN0dXBpZCBoYWNrZXJ5IGxpa2UgaW52ZW50aW5nIGEgZ3AgdmFsdWUgdG8gZG8gcGFydGlhbCByZWxvY2F0aW9uCi0gICAgIGFnYWluc3QuICBBbHNvIHVubGlrZSBFQ09GRiwgd2UgZG8gdGhlIHdob2xlIHJlbG9jYXRpb24gb2ZmIG9mCi0gICAgIHRoZSBHUERJU1AgcmF0aGVyIHRoYW4gYSBHUERJU1BfSEkxNi9HUERJU1BfTE8xNiBwYWlyLiAgQW4gb2RkLAotICAgICBzcGFjZSBjb25zdW1pbmcgYml0LCB0aGF0LCBzaW5jZSBhbGwgdGhlIGluZm9ybWF0aW9uIHdhcyBwcmVzZW50Ci0gICAgIGluIHRoZSBHUERJU1BfSEkxNiByZWxvYy4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dQRElTUCwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfZ3BkaXNwLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUERJU1AiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyMSBiaXQgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfQlJBRERSLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkJSQUREUiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBoaW50IGZvciBhIGp1bXAgdG8gYSByZWdpc3Rlci4gICovCi0gIEhPV1RPIChSX0FMUEhBX0hJTlQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJISU5UIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9TUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9TUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfU1JFTDY0LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUw2NCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBQdXNoIGEgdmFsdWUgb24gdGhlIHJlbG9jIGV2YWx1YXRpb24gc3RhY2suICAqLwotICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfT1BfUFVTSCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFVTSCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3RvcmUgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAgU3RvcmUgaXQgaW4KLSAgICAgYSBiaXRmaWVsZCBvZiBzaXplIHJfc2l6ZSBzdGFydGluZyBhdCBiaXQgcG9zaXRpb24gcl9vZmZzZXQuICAqLwotICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9TVE9SRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN1YnRyYWN0IHRoZSByZWxvYyBhZGRyZXNzIGZyb20gdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlCi0gICAgIHJlbG9jYXRpb24gc3RhY2suICAqLwotICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfT1BfUFNVQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFNVQiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2hpZnQgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHJlbG9jYXRpb24gc3RhY2sgcmlnaHQgYnkgdGhlCi0gICAgIGdpdmVuIHZhbHVlLiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX09QX1BSU0hJRlQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BSU0hJRlQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIENoYW5nZSB0aGUgdmFsdWUgb2YgR1AgdXNlZCBieSArcl9hZGRlbmQgdW50aWwgdGhlIG5leHQgR1BWQUxVRSBvciB0aGUKLSAgICAgZW5kIG9mIHRoZSBpbnB1dCBiZmQuICAqLwotICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR1BWQUxVRSwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQVkFMVUUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIDE2IGJpdHMgb2YgdGhlIGRpc3BsYWNlbWVudCBmcm9tIEdQIHRvIHRoZSB0YXJnZXQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9HUFJFTEhJR0gsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFJFTEhJR0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBkaXNwbGFjZW1lbnQgZnJvbSBHUCB0byB0aGUgdGFyZ2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR1BSRUxMT1csCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BSRUxMT1ciLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNi1iaXQgZGlzcGxhY2VtZW50IGZyb20gdGhlIEdQIHRvIHRoZSB0YXJnZXQuICAqLwotICAvKiBYWFg6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0lNTUVEX0dQXzE2LAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NRURfR1BfMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggYml0cyBvZiBhIDMyLWJpdCBkaXNwbGFjZW1lbnQgZnJvbSB0aGUgR1AgdG8gdGhlIHRhcmdldDsgdGhlCi0gICAgIGxvdyBiaXRzIGFyZSBzdXBwbGllZCBpbiB0aGUgc3Vic2VxdWVudCBSX0FMUEhBX0lNTUVEX0xPMzIgcmVsb2NzLiAgKi8KLSAgLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9JTU1FRF9HUF9ISTMyLAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NRURfR1BfSEkzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggYml0cyBvZiBhIDMyLWJpdCBkaXNwbGFjZW1lbnQgdG8gdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlCi0gICAgIGN1cnJlbnQgc2VjdGlvbiAodGhlIHJlbG9jYXRpb24gdGFyZ2V0IGlzIGlnbm9yZWQpOyB0aGUgbG93IGJpdHMgYXJlIAotICAgICBzdXBwbGllZCBpbiB0aGUgc3Vic2VxdWVudCBSX0FMUEhBX0lNTUVEX0xPMzIgcmVsb2NzLiAgKi8KLSAgLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9JTU1FRF9TQ05fSEkzMiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX1NDTl9ISTMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBiaXRzIG9mIGEgMzItYml0IGRpc3BsYWNlbWVudCBmcm9tIHRoZSBwcmV2aW91cyBiciwgYnNyLCBqc3IKLSAgICAgb3Igam1wIGluc24gKGFzIHRhZ2dlZCBieSBhIEJSQUREUiBvciBISU5UIHJlbG9jKSB0byB0aGUgdGFyZ2V0OyB0aGUKLSAgICAgbG93IGJpdHMgYXJlIHN1cHBsaWVkIGJ5IHN1YnNlcXVlbnQgUl9BTFBIQV9JTU1FRF9MTzMyIHJlbG9jcy4gICovCi0gIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSU1NRURfQlJfSEkzMiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX0JSX0hJMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBsb3cgMTYgYml0cyBvZiBhIGRpc3BsYWNlbWVudCBjYWxjdWxhdGVkIGluIGEgcHJldmlvdXMgSEkzMiByZWxvYy4gICovCi0gIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSU1NRURfTE8zMiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX0xPMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIE1pc2MgRUxGIHJlbG9jYXRpb25zLiAqLwotCi0gIC8qIEEgZHluYW1pYyByZWxvY2F0aW9uIHRvIGNvcHkgdGhlIHRhcmdldCBpbnRvIG91ciAuZHluYnNzIHNlY3Rpb24uICAqLwotICAvKiBOb3QgZ2VuZXJhdGVkLCBhcyBhbGwgQWxwaGEgb2JqZWN0cyB1c2UgUElDLCBzbyBpdCBpcyBub3QgbmVlZGVkLiAgSXQKLSAgICAgaXMgcHJlc2VudCBiZWNhdXNlIGV2ZXJ5IG90aGVyIEVMRiBoYXMgb25lLCBidXQgc2hvdWxkIG5vdCBiZSB1c2VkCi0gICAgIGJlY2F1c2UgLmR5bmJzcyBpcyBhbiB1Z2x5IHRoaW5nLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfQ09QWSwKLQkgMCwKLQkgMCwKLQkgMCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIkNPUFkiLAotCSBmYWxzZSwKLQkgMCwKLQkgMCwKLQkgdHJ1ZSksCi0KLSAgLyogQSBkeW5hbWljIHJlbG9jYXRpb24gZm9yIGEgLmdvdCBlbnRyeS4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dMT0JfREFULAotCSAwLAotCSAwLAotCSAwLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiR0xPQl9EQVQiLAotCSBmYWxzZSwKLQkgMCwKLQkgMCwKLQkgdHJ1ZSksCi0KLSAgLyogQSBkeW5hbWljIHJlbG9jYXRpb24gZm9yIGEgLnBsdCBlbnRyeS4gICovCi0gIEhPV1RPIChSX0FMUEhBX0pNUF9TTE9ULAotCSAwLAotCSAwLAotCSAwLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiSk1QX1NMT1QiLAotCSBmYWxzZSwKLQkgMCwKLQkgMCwKLQkgdHJ1ZSksCi0KLSAgLyogQSBkeW5hbWljIHJlbG9jYXRpb24gdG8gYWRkIHRoZSBiYXNlIG9mIHRoZSBEU08gdG8gYSA2NC1iaXQgZmllbGQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9SRUxBVElWRSwKLQkgMCwKLQkgMCwKLQkgMCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJFTEFUSVZFIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIHRydWUpCi19OwotCi0vKiBBIHJlbG9jYXRpb24gZnVuY3Rpb24gd2hpY2ggZG9lc24ndCBkbyBhbnl0aGluZy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjY0X2FscGhhX3JlbG9jX25pbCAoYWJmZCwgcmVsb2MsIHN5bSwgZGF0YSwgc2VjLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCkKLSAgICByZWxvYy0+YWRkcmVzcyArPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEEgcmVsb2NhdGlvbiBmdW5jdGlvbiB1c2VkIGZvciBhbiB1bnN1cHBvcnRlZCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjY0X2FscGhhX3JlbG9jX2JhZCAoYWJmZCwgcmVsb2MsIHN5bSwgZGF0YSwgc2VjLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCkKLSAgICByZWxvYy0+YWRkcmVzcyArPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotfQotCi0vKiBEbyB0aGUgd29yayBvZiB0aGUgR1BESVNQIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3AgKGFiZmQsIGdwZGlzcCwgcF9sZGFoLCBwX2xkYSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIGdwZGlzcDsKLSAgICAgYmZkX2J5dGUgKnBfbGRhaDsKLSAgICAgYmZkX2J5dGUgKnBfbGRhOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0ID0gYmZkX3JlbG9jX29rOwotICBiZmRfdm1hIGFkZGVuZDsKLSAgdW5zaWduZWQgbG9uZyBpX2xkYWgsIGlfbGRhOwotCi0gIGlfbGRhaCA9IGJmZF9nZXRfMzIgKGFiZmQsIHBfbGRhaCk7Ci0gIGlfbGRhID0gYmZkX2dldF8zMiAoYWJmZCwgcF9sZGEpOwotCi0gIC8qIENvbXBsYWluIGlmIHRoZSBpbnN0cnVjdGlvbnMgYXJlIG5vdCBjb3JyZWN0LiAgKi8KLSAgaWYgKCgoaV9sZGFoID4+IDI2KSAmIDB4M2YpICE9IDB4MDkKLSAgICAgIHx8ICgoaV9sZGEgPj4gMjYpICYgMHgzZikgIT0gMHgwOCkKLSAgICByZXQgPSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCi0gIC8qIEV4dHJhY3QgdGhlIHVzZXItc3VwcGxpZWQgb2Zmc2V0LCBtaXJyb3JpbmcgdGhlIHNpZ24gZXh0ZW5zaW9ucwotICAgICB0aGF0IHRoZSBpbnN0cnVjdGlvbnMgcGVyZm9ybS4gICovCi0gIGFkZGVuZCA9ICgoaV9sZGFoICYgMHhmZmZmKSA8PCAxNikgfCAoaV9sZGEgJiAweGZmZmYpOwotICBhZGRlbmQgPSAoYWRkZW5kIF4gMHg4MDAwODAwMCkgLSAweDgwMDA4MDAwOwotCi0gIGdwZGlzcCArPSBhZGRlbmQ7Ci0KLSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgZ3BkaXNwIDwgLShiZmRfc2lnbmVkX3ZtYSkgMHg4MDAwMDAwMAotICAgICAgfHwgKGJmZF9zaWduZWRfdm1hKSBncGRpc3AgPj0gKGJmZF9zaWduZWRfdm1hKSAweDdmZmY4MDAwKQotICAgIHJldCA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAvKiBjb21wZW5zYXRlIGZvciB0aGUgc2lnbiBleHRlbnNpb24gYWdhaW4uICAqLwotICBpX2xkYWggPSAoKGlfbGRhaCAmIDB4ZmZmZjAwMDApCi0JICAgIHwgKCgoZ3BkaXNwID4+IDE2KSArICgoZ3BkaXNwID4+IDE1KSAmIDEpKSAmIDB4ZmZmZikpOwotICBpX2xkYSA9IChpX2xkYSAmIDB4ZmZmZjAwMDApIHwgKGdwZGlzcCAmIDB4ZmZmZik7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgaV9sZGFoLCBwX2xkYWgpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpX2xkYSwgcF9sZGEpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoZSBzcGVjaWFsIGZ1bmN0aW9uIGZvciB0aGUgR1BESVNQIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmNjRfYWxwaGFfcmVsb2NfZ3BkaXNwIChhYmZkLCByZWxvY19lbnRyeSwgc3ltLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJICBvdXRwdXRfYmZkLCBlcnJfbXNnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyX21zZzsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSBncCwgcmVsb2NhdGlvbjsKLSAgYmZkX2J5dGUgKnBfbGRhaCwgKnBfbGRhOwotCi0gIC8qIERvbid0IGRvIGFueXRoaW5nIGlmIHdlJ3JlIG5vdCBkb2luZyBhIGZpbmFsIGxpbmsuICAqLwotICBpZiAob3V0cHV0X2JmZCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplIHx8Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArIHJlbG9jX2VudHJ5LT5hZGRlbmQgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFRoZSBncCB1c2VkIGluIHRoZSBwb3J0aW9uIG9mIHRoZSBvdXRwdXQgb2JqZWN0IHRvIHdoaWNoIHRoaXMKLSAgICAgaW5wdXQgb2JqZWN0IGJlbG9uZ3MgaXMgY2FjaGVkIG9uIHRoZSBpbnB1dCBiZmQuICAqLwotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChhYmZkKTsKLQotICByZWxvY2F0aW9uID0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIHBfbGRhaCA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIHBfbGRhID0gcF9sZGFoICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICByZXQgPSBlbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3AgKGFiZmQsIGdwIC0gcmVsb2NhdGlvbiwgcF9sZGFoLCBwX2xkYSk7Ci0KLSAgLyogQ29tcGxhaW4gaWYgdGhlIGluc3RydWN0aW9ucyBhcmUgbm90IGNvcnJlY3QuICAqLwotICBpZiAocmV0ID09IGJmZF9yZWxvY19kYW5nZXJvdXMpCi0gICAgKmVycl9tc2cgPSBfKCJHUERJU1AgcmVsb2NhdGlvbiBkaWQgbm90IGZpbmQgbGRhaCBhbmQgbGRhIGluc3RydWN0aW9ucyIpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEEgbWFwcGluZyBmcm9tIEJGRCByZWxvYyB0eXBlcyB0byBBbHBoYSBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgaW50IGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVsZl9yZWxvY19tYXAgZWxmNjRfYWxwaGFfcmVsb2NfbWFwW10gPQotewotICB7QkZEX1JFTE9DX05PTkUsCQlSX0FMUEhBX05PTkV9LAotICB7QkZEX1JFTE9DXzMyLAkJUl9BTFBIQV9SRUZMT05HfSwKLSAge0JGRF9SRUxPQ182NCwJCVJfQUxQSEFfUkVGUVVBRH0sCi0gIHtCRkRfUkVMT0NfQ1RPUiwJCVJfQUxQSEFfUkVGUVVBRH0sCi0gIHtCRkRfUkVMT0NfR1BSRUwzMiwJCVJfQUxQSEFfR1BSRUwzMn0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwsCVJfQUxQSEFfTElURVJBTH0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfTElUVVNFLAlSX0FMUEhBX0xJVFVTRX0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfR1BESVNQLAlSX0FMUEhBX0dQRElTUH0sCi0gIHtCRkRfUkVMT0NfMjNfUENSRUxfUzIsCVJfQUxQSEFfQlJBRERSfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9ISU5ULAlSX0FMUEhBX0hJTlR9LAotICB7QkZEX1JFTE9DXzE2X1BDUkVMLAkJUl9BTFBIQV9TUkVMMTZ9LAotICB7QkZEX1JFTE9DXzMyX1BDUkVMLAkJUl9BTFBIQV9TUkVMMzJ9LAotICB7QkZEX1JFTE9DXzY0X1BDUkVMLAkJUl9BTFBIQV9TUkVMNjR9LAotCi0vKiBUaGUgQkZEX1JFTE9DX0FMUEhBX1VTRVJfKiByZWxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgYXNzZW1ibGVyIHRvIHByb2Nlc3MKLSAgIHRoZSBleHBsaWNpdCAhPHJlbG9jPiFzZXF1ZW5jZSByZWxvY2F0aW9ucywgYW5kIGFyZSBtYXBwZWQgaW50byB0aGUgbm9ybWFsCi0gICByZWxvY2F0aW9ucyBhdCB0aGUgZW5kIG9mIHByb2Nlc3NpbmcuICovCi0gIHtCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRFUkFMLAlSX0FMUEhBX0xJVEVSQUx9LAotICB7QkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JBU0UsCVJfQUxQSEFfTElUVVNFfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkYsCVJfQUxQSEFfTElUVVNFfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9KU1IsCVJfQUxQSEFfTElUVVNFfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9VU0VSX0dQRElTUCwJCVJfQUxQSEFfR1BESVNQfSwKLSAge0JGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMSElHSCwJUl9BTFBIQV9HUFJFTEhJR0h9LAotICB7QkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxMT1csCVJfQUxQSEFfR1BSRUxMT1d9LAotfTsKLQotLyogR2l2ZW4gYSBCRkQgcmVsb2MgdHlwZSwgcmV0dXJuIGEgSE9XVE8gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmNjRfYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBjb25zdCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCAqaSwgKmU7Ci0gIGkgPSBlID0gZWxmNjRfYWxwaGFfcmVsb2NfbWFwOwotICBlICs9IHNpemVvZiAoZWxmNjRfYWxwaGFfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOwotICBmb3IgKDsgaSAhPSBlOyArK2kpCi0gICAgewotICAgICAgaWYgKGktPmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZjY0X2FscGhhX2hvd3RvX3RhYmxlW2ktPmVsZl9yZWxvY192YWxdOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEdpdmVuIGFuIEFscGhhIEVMRiByZWxvYyB0eXBlLCBmaWxsIGluIGFuIGFyZWxlbnQgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjY0X2FscGhhX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmNjRfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICB1bnNpZ25lZCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGNjRfUl9UWVBFKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9BTFBIQV9tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZjY0X2FscGhhX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0MCi0vKiBUaGVzZSBmdW5jdGlvbnMgZG8gcmVsYXhhdGlvbiBmb3IgQWxwaGEgRUxGLiAKLQotICAgQ3VycmVudGx5IEknbSBvbmx5IGhhbmRsaW5nIHdoYXQgSSBjYW4gZG8gd2l0aCBleGlzdGluZyBjb21waWxlcgotICAgYW5kIGFzc2VtYmxlciBzdXBwb3J0LCB3aGljaCBtZWFucyBubyBpbnN0cnVjdGlvbnMgYXJlIHJlbW92ZWQsCi0gICB0aG91Z2ggc29tZSBtYXkgYmUgbm9wcGVkLiAgQXQgdGhpcyB0aW1lIEdDQyBkb2VzIG5vdCBlbWl0IGVub3VnaAotICAgaW5mb3JtYXRpb24gdG8gZG8gYWxsIG9mIHRoZSByZWxheGluZyB0aGF0IGlzIHBvc3NpYmxlLiAgSXQgd2lsbAotICAgdGFrZSBzb21lIG5vdCBzbWFsbCBhbW91bnQgb2Ygd29yayBmb3IgdGhhdCB0byBoYXBwZW4uCi0KLSAgIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBpbnRlcmVzdGluZyBwYXBlcnMgdGhhdCBJIG9uY2UgcmVhZCBvbiB0aGlzCi0gICBzdWJqZWN0LCB0aGF0IEkgY2Fubm90IGZpbmQgcmVmZXJlbmNlcyB0byBhdCB0aGUgbW9tZW50LCB0aGF0Ci0gICByZWxhdGVkIHRvIEFscGhhIGluIHBhcnRpY3VsYXIuICBUaGV5IGFyZSBieSBEYXZpZCBXYWxsLCB0aGVuIG9mCi0gICBERUMgV1JMLiAgKi8KLQotI2RlZmluZSBPUF9MREEJCTB4MDgKLSNkZWZpbmUgT1BfTERBSAkJMHgwOQotI2RlZmluZSBJTlNOX0pTUgkweDY4MDA0MDAwCi0jZGVmaW5lIElOU05fSlNSX01BU0sJMHhmYzAwYzAwMAotI2RlZmluZSBPUF9MRFEJCTB4MjkKLSNkZWZpbmUgT1BfQlIJCTB4MzAKLSNkZWZpbmUgT1BfQlNSCQkweDM0Ci0jZGVmaW5lIElOU05fVU5PUAkweDJmZTAwMDAwCi0KLXN0cnVjdCBhbHBoYV9yZWxheF9pbmZvCi17Ci0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzLCAqcmVsZW5kOwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICBib29sZWFuIGNoYW5nZWRfY29udGVudHM7Ci0gIGJvb2xlYW4gY2hhbmdlZF9yZWxvY3M7Ci0gIGJmZF92bWEgZ3A7Ci0gIGJmZCAqZ290b2JqOwotICBhc2VjdGlvbiAqdHNlYzsKLSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0gIHVuc2lnbmVkIGNoYXIgb3RoZXI7Ci19OwotCi1zdGF0aWMgRWxmX0ludGVybmFsX1JlbGEgKiBlbGY2NF9hbHBoYV9yZWxheF93aXRoX2xpdHVzZQotICBQQVJBTVMoKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvLCBiZmRfdm1hIHN5bXZhbCwgCi0gICAgICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsZW5kKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3JlbGF4X3dpdGhvdXRfbGl0dXNlCi0gIFBBUkFNUygoc3RydWN0IGFscGhhX3JlbGF4X2luZm8gKmluZm8sIGJmZF92bWEgc3ltdmFsLCAKLSAgICAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCkpOwotCi1zdGF0aWMgYmZkX3ZtYSBlbGY2NF9hbHBoYV9yZWxheF9vcHRfY2FsbAotICBQQVJBTVMoKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvLCBiZmRfdm1hIHN5bXZhbCkpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUygoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotCSAgYm9vbGVhbiAqYWdhaW4pKTsKLQotc3RhdGljIEVsZl9JbnRlcm5hbF9SZWxhICoKLWVsZjY0X2FscGhhX2ZpbmRfcmVsb2NfYXRfb2ZzIChyZWwsIHJlbGVuZCwgb2Zmc2V0LCB0eXBlKQotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIHdoaWxlIChyZWwgPCByZWxlbmQpCi0gICAgewotICAgICAgaWYgKHJlbC0+cl9vZmZzZXQgPT0gb2Zmc2V0ICYmIEVMRjY0X1JfVFlQRSAocmVsLT5yX2luZm8pID09IHR5cGUpCi0JcmV0dXJuIHJlbDsKLSAgICAgICsrcmVsOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBFbGZfSW50ZXJuYWxfUmVsYSAqCi1lbGY2NF9hbHBoYV9yZWxheF93aXRoX2xpdHVzZSAoaW5mbywgc3ltdmFsLCBpcmVsLCBpcmVsZW5kKQotICAgICBzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSBzeW12YWw7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLXsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnVyZWw7Ci0gIGludCBmbGFncywgY291bnQsIGk7Ci0gIGJmZF9zaWduZWRfdm1hIGRpc3A7Ci0gIGJvb2xlYW4gZml0czE2OwotICBib29sZWFuIGZpdHMzMjsKLSAgYm9vbGVhbiBsaXRfcmV1c2VkID0gZmFsc2U7Ci0gIGJvb2xlYW4gYWxsX29wdGltaXplZCA9IHRydWU7Ci0gIHVuc2lnbmVkIGludCBsaXRfaW5zbjsKLQotICBsaXRfaW5zbiA9IGJmZF9nZXRfMzIgKGluZm8tPmFiZmQsIGluZm8tPmNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotICBpZiAobGl0X2luc24gPj4gMjYgIT0gT1BfTERRKQotICAgIHsKLSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAoIiVzOiAlcysweCVseDogd2FybmluZzogTElURVJBTCByZWxvY2F0aW9uIGFnYWluc3QgdW5leHBlY3RlZCBpbnNuIiwKLQliZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKSwgaW5mby0+c2VjLT5uYW1lLAotCSh1bnNpZ25lZCBsb25nKWlyZWwtPnJfb2Zmc2V0KSk7Ci0gICAgICByZXR1cm4gaXJlbDsKLSAgICB9Ci0KLSAgLyogU3VtbWFyaXplIGhvdyB0aGlzIHBhcnRpY3VsYXIgTElURVJBTCBpcyB1c2VkLiAgKi8KLSAgZm9yICh1cmVsID0gaXJlbCsxLCBmbGFncyA9IGNvdW50ID0gMDsgdXJlbCA8IGlyZWxlbmQ7ICsrdXJlbCwgKytjb3VudCkKLSAgICB7Ci0gICAgICBpZiAoRUxGNjRfUl9UWVBFICh1cmVsLT5yX2luZm8pICE9IFJfQUxQSEFfTElUVVNFKQotCWJyZWFrOwotICAgICAgaWYgKHVyZWwtPnJfYWRkZW5kID49IDAgJiYgdXJlbC0+cl9hZGRlbmQgPD0gMykKLQlmbGFncyB8PSAxIDw8IHVyZWwtPnJfYWRkZW5kOwotICAgIH0KLQotICAvKiBBIGxpdHRsZSBwcmVwYXJhdGlvbiBmb3IgdGhlIGxvb3AuLi4gKi8KLSAgZGlzcCA9IHN5bXZhbCAtIGluZm8tPmdwOwotICBmaXRzMTYgPSAoZGlzcCA+PSAtKGJmZF9zaWduZWRfdm1hKTB4ODAwMCAmJiBkaXNwIDwgMHg4MDAwKTsKLSAgZml0czMyID0gKGRpc3AgPj0gLShiZmRfc2lnbmVkX3ZtYSkweDgwMDAwMDAwICYmIGRpc3AgPCAweDdmZmY4MDAwKTsKLQotICBmb3IgKHVyZWwgPSBpcmVsKzEsIGkgPSAwOyBpIDwgY291bnQ7ICsraSwgKyt1cmVsKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGluZm8tPmFiZmQsIGluZm8tPmNvbnRlbnRzICsgdXJlbC0+cl9vZmZzZXQpOwotCi0gICAgICBzd2l0Y2ggKHVyZWwtPnJfYWRkZW5kKQotCXsKLQlkZWZhdWx0OiAvKiAwID0gQUREUkVTUyBGT1JNQVQgKi8KLQkgIC8qIFRoaXMgdHlwZSBpcyByZWFsbHkganVzdCBhIHBsYWNlaG9sZGVyIHRvIG5vdGUgdGhhdCBhbGwKLQkgICAgIHVzZXMgY2Fubm90IGJlIG9wdGltaXplZCwgYnV0IHRvIHN0aWxsIGFsbG93IHNvbWUuICAqLwotCSAgYWxsX29wdGltaXplZCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIDE6IC8qIE1FTSBGT1JNQVQgKi8KLQkgIC8qIFdlIGNhbiBhbHdheXMgb3B0aW1pemUgMTYtYml0IGRpc3BsYWNlbWVudHMuICAqLwotCSAgaWYgKGZpdHMxNikKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBzYW5pdHkgY2hlY2sgdGhlIGluc24gZm9yIG1lbSBmb3JtYXQgd2l0aAotCQkgemVybyBhZGRlbmQuICAqLwotCi0JICAgICAgLyogVGFrZSB0aGUgb3AgY29kZSBhbmQgZGVzdCBmcm9tIHRoaXMgaW5zbiwgdGFrZSB0aGUgYmFzZSAKLQkJIHJlZ2lzdGVyIGZyb20gdGhlIGxpdGVyYWwgaW5zbi4gIExlYXZlIHRoZSBvZmZzZXQgYWxvbmUuICAqLwotCSAgICAgIGluc24gPSAoaW5zbiAmIDB4ZmZlMDAwMDApIHwgKGxpdF9pbnNuICYgMHgwMDFmMDAwMCk7Ci0JICAgICAgdXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPIChFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgUl9BTFBIQV9HUFJFTExPVyk7Ci0JICAgICAgdXJlbC0+cl9hZGRlbmQgPSBpcmVsLT5yX2FkZGVuZDsKLQkgICAgICBpbmZvLT5jaGFuZ2VkX3JlbG9jcyA9IHRydWU7Ci0KLQkgICAgICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBpbnNuLCBpbmZvLT5jb250ZW50cyArIHVyZWwtPnJfb2Zmc2V0KTsKLQkgICAgICBpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLQkgICAgfQotCi0JICAvKiBJZiBhbGwgbWVtK2J5dGUsIHdlIGNhbiBvcHRpbWl6ZSAzMi1iaXQgbWVtIGRpc3BsYWNlbWVudHMuICAqLwotCSAgZWxzZSBpZiAoZml0czMyICYmICEoZmxhZ3MgJiB+NikpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogc2FuaXR5IGNoZWNrIHRoYXQgbGl0IGluc24gUmEgaXMgbWVtIGluc24gUmIsIGFuZAotCQkgdGhhdCBtZW1faW5zbiBkaXNwIGlzIHplcm8uICAqLwotCi0JICAgICAgaXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPIChFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgUl9BTFBIQV9HUFJFTEhJR0gpOwotCSAgICAgIGxpdF9pbnNuID0gKE9QX0xEQUggPDwgMjYpIHwgKGxpdF9pbnNuICYgMHgwM2ZmMDAwMCk7Ci0JICAgICAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgbGl0X2luc24sCi0JCQkgIGluZm8tPmNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCSAgICAgIGxpdF9yZXVzZWQgPSB0cnVlOwotCSAgICAgIGluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOwotCi0JICAgICAgdXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPIChFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgUl9BTFBIQV9HUFJFTExPVyk7Ci0JICAgICAgdXJlbC0+cl9hZGRlbmQgPSBpcmVsLT5yX2FkZGVuZDsKLQkgICAgICBpbmZvLT5jaGFuZ2VkX3JlbG9jcyA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYWxsX29wdGltaXplZCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIDI6IC8qIEJZVEUgT0ZGU0VUIEZPUk1BVCAqLwotCSAgLyogV2UgY2FuIGFsd2F5cyBvcHRpbWl6ZSBieXRlIGluc3RydWN0aW9ucy4gICovCi0KLQkgIC8qIEZJWE1FOiBzYW5pdHkgY2hlY2sgdGhlIGluc24gZm9yIGJ5dGUgb3AuICBDaGVjayB0aGF0IHRoZQotCSAgICAgbGl0ZXJhbCBkZXN0IHJlZyBpcyBpbmRlZWQgUmIgaW4gdGhlIGJ5dGUgaW5zbi4gICovCi0KLQkgIGluc24gPSAoaW5zbiAmIH4weDAwMWZmMDAwKSB8ICgoc3ltdmFsICYgNykgPDwgMTMpIHwgMHgxMDAwOwotCi0JICB1cmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKDAsIFJfQUxQSEFfTk9ORSk7Ci0JICB1cmVsLT5yX2FkZGVuZCA9IDA7Ci0JICBpbmZvLT5jaGFuZ2VkX3JlbG9jcyA9IHRydWU7Ci0KLQkgIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGluc24sIGluZm8tPmNvbnRlbnRzICsgdXJlbC0+cl9vZmZzZXQpOwotCSAgaW5mby0+Y2hhbmdlZF9jb250ZW50cyA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgMzogLyogQ0FMTCBGT1JNQVQgKi8KLQkgIHsKLQkgICAgLyogSWYgbm90IHplcm8sIHBsYWNlIHRvIGp1bXAgd2l0aG91dCBuZWVkaW5nIHB2LiAgKi8KLQkgICAgYmZkX3ZtYSBvcHRkZXN0ID0gZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwgKGluZm8sIHN5bXZhbCk7Ci0JICAgIGJmZF92bWEgb3JnID0gKGluZm8tPnNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBpbmZvLT5zZWMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICsgdXJlbC0+cl9vZmZzZXQgKyA0KTsKLQkgICAgYmZkX3NpZ25lZF92bWEgb2Rpc3A7Ci0KLQkgICAgb2Rpc3AgPSAob3B0ZGVzdCA/IG9wdGRlc3QgOiBzeW12YWwpIC0gb3JnOwotCSAgICBpZiAob2Rpc3AgPj0gLTB4NDAwMDAwICYmIG9kaXNwIDwgMHg0MDAwMDApCi0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfUmVsYSAqeHJlbDsKLQotCQkvKiBQcmVzZXJ2ZSBicmFuY2ggcHJlZGljdGlvbiBjYWxsIHN0YWNrIHdoZW4gcG9zc2libGUuICovCi0JCWlmICgoaW5zbiAmIElOU05fSlNSX01BU0spID09IElOU05fSlNSKQotCQkgIGluc24gPSAoT1BfQlNSIDw8IDI2KSB8IChpbnNuICYgMHgwM2UwMDAwMCk7Ci0JCWVsc2UKLQkJICBpbnNuID0gKE9QX0JSIDw8IDI2KSB8IChpbnNuICYgMHgwM2UwMDAwMCk7Ci0JCSAgCi0JCXVyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAgUl9BTFBIQV9CUkFERFIpOwotCQl1cmVsLT5yX2FkZGVuZCA9IGlyZWwtPnJfYWRkZW5kOwotCi0JCWlmIChvcHRkZXN0KQotCQkgIHVyZWwtPnJfYWRkZW5kICs9IG9wdGRlc3QgLSBzeW12YWw7Ci0JCWVsc2UKLQkJICBhbGxfb3B0aW1pemVkID0gZmFsc2U7Ci0KLQkJYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgaW5zbiwgaW5mby0+Y29udGVudHMgKyB1cmVsLT5yX29mZnNldCk7Ci0KLQkJLyogS2lsbCBhbnkgSElOVCByZWxvYyB0aGF0IG1pZ2h0IGV4aXN0IGZvciB0aGlzIGluc24uICAqLwotCQl4cmVsID0gKGVsZjY0X2FscGhhX2ZpbmRfcmVsb2NfYXRfb2ZzCi0JCQkoaW5mby0+cmVsb2NzLCBpbmZvLT5yZWxlbmQsIHVyZWwtPnJfb2Zmc2V0LCAKLQkJCSBSX0FMUEhBX0hJTlQpKTsKLQkJaWYgKHhyZWwpCi0JCSAgeHJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX0FMUEhBX05PTkUpOwotCi0JCWluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOwotCQlpbmZvLT5jaGFuZ2VkX3JlbG9jcyA9IHRydWU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgYWxsX29wdGltaXplZCA9IGZhbHNlOwotCi0JICAgIC8qID8/PyBJZiB0YXJnZXQgZ3AgPT0gY3VycmVudCBncCB3ZSBjYW4gZWxpbWluYXRlIHRoZSBncCByZWxvYWQuCi0JICAgICAgIFRoaXMgZG9lcyBkZXBlbmQgb24gZXZlcnkgcGxhY2UgYSBncCBjb3VsZCBiZSByZWxvYWRlZCB3aWxsCi0JICAgICAgIGJlLCB3aGljaCBjdXJyZW50bHkgaGFwcGVucyBmb3IgYWxsIGNvZGUgcHJvZHVjZWQgYnkgZ2NjLCBidXQKLQkgICAgICAgbm90IG5lY2Vzc2FyaWx5IGJ5IGhhbmQtY29kZWQgYXNzZW1ibHksIG9yIGlmIHNpYmxpbmcgY2FsbHMKLQkgICAgICAgYXJlIGVuYWJsZWQgaW4gZ2NjLiAKLQotCSAgICAgICBQZXJoYXBzIGNvbmRpdGlvbmFsaXplIHRoaXMgb24gYSBmbGFnIGJlaW5nIHNldCBpbiB0aGUgdGFyZ2V0Ci0JICAgICAgIG9iamVjdCBmaWxlJ3MgaGVhZGVyLCBhbmQgaGF2ZSBnY2Mgc2V0IGl0PyAgKi8KLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgYWxsIGNhc2VzIHdlcmUgb3B0aW1pemVkLCB3ZSBjYW4gcmVkdWNlIHRoZSB1c2UgY291bnQgb24gdGhpcwotICAgICBnb3QgZW50cnkgYnkgb25lLCBwb3NzaWJseSBlbGltaW5hdGluZyBpdC4gICovCi0gIGlmIChhbGxfb3B0aW1pemVkKQotICAgIHsKLSAgICAgIGluZm8tPmdvdGVudC0+dXNlX2NvdW50IC09IDE7Ci0gICAgICBhbHBoYV9lbGZfdGRhdGEgKGluZm8tPmdvdGVudC0+Z290b2JqKS0+dG90YWxfZ290X2VudHJpZXMgLT0gMTsKLSAgICAgIGlmICghaW5mby0+aCkKLQlhbHBoYV9lbGZfdGRhdGEgKGluZm8tPmdvdGVudC0+Z290b2JqKS0+bl9sb2NhbF9nb3RfZW50cmllcyAtPSAxOwotCi0gICAgICAvKiBJZiB0aGUgbGl0ZXJhbCBpbnN0cnVjdGlvbiBpcyBubyBsb25nZXIgbmVlZGVkIChpdCBtYXkgaGF2ZSBiZWVuCi0JIHJldXNlZC4gIFdlIGNhbiBlbGltaW5hdGUgaXQuCi0JID8/PyBGb3Igbm93LCBJIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIGNvbXBhY3RpbmcgdGhlIHNlY3Rpb24sCi0JIHNvIGp1c3Qgbm9wIGl0IG91dC4gICovCi0gICAgICBpZiAoIWxpdF9yZXVzZWQpCi0JewotCSAgaXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX0FMUEhBX05PTkUpOwotCSAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCi0JICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBJTlNOX1VOT1AsIGluZm8tPmNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCSAgaW5mby0+Y2hhbmdlZF9jb250ZW50cyA9IHRydWU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gaXJlbCArIGNvdW50OwotfQotCi1zdGF0aWMgYmZkX3ZtYQotZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwgKGluZm8sIHN5bXZhbCkKLSAgICAgc3RydWN0IGFscGhhX3JlbGF4X2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgc3ltdmFsOwotewotICAvKiBJZiB0aGUgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIGdwLCBhbmQgd2UgY2FuIGlkZW50aWZ5IHRoYXQgdGhlCi0gICAgIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSBpdHMgZnVuY3Rpb24gcG9pbnRlciwgd2UgY2FuIGVsaW1pbmF0ZSB0aGUKLSAgICAgYWRkcmVzcyBsb2FkLiAgKi8KLQotICAvKiBJZiB0aGUgc3ltYm9sIGlzIG1hcmtlZCBOT1BWLCB3ZSBhcmUgYmVpbmcgdG9sZCB0aGUgZnVuY3Rpb24gbmV2ZXIKLSAgICAgbmVlZHMgaXRzIHByb2NlZHVyZSB2YWx1ZS4gICovCi0gIGlmIChpbmZvLT5vdGhlciA9PSBTVE9fQUxQSEFfTk9QVikKLSAgICByZXR1cm4gc3ltdmFsOwotCi0gIC8qIElmIHRoZSBzeW1ib2wgaXMgbWFya2VkIFNURF9HUCwgd2UgYXJlIGJlaW5nIHRvbGQgdGhlIGZ1bmN0aW9uIGRvZXMKLSAgICAgYSBub3JtYWwgbGRncCBpbiB0aGUgZmlyc3QgdHdvIHdvcmRzLiAgKi8gCi0gIGVsc2UgaWYgKGluZm8tPm90aGVyID09IFNUT19BTFBIQV9TVERfR1BMT0FEKQotICAgIDsKLQotICAvKiBPdGhlcndpc2UsIHdlIG1heSBiZSBhYmxlIHRvIGlkZW50aWZ5IGEgR1AgbG9hZCBpbiB0aGUgZmlyc3QgdHdvCi0gICAgIHdvcmRzLCB3aGljaCB3ZSBjYW4gdGhlbiBza2lwLiAgKi8KLSAgZWxzZSAKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqdHNlY19yZWxvY3MsICp0c2VjX3JlbGVuZCwgKnRzZWNfZnJlZSwgKmdwZGlzcDsKLSAgICAgIGJmZF92bWEgb2ZzOwotCi0gICAgICAvKiBMb2FkIHRoZSByZWxvY2F0aW9ucyBmcm9tIHRoZSBzZWN0aW9uIHRoYXQgdGhlIHRhcmdldCBzeW1ib2wgaXMgaW4uICovCi0gICAgICBpZiAoaW5mby0+c2VjID09IGluZm8tPnRzZWMpCi0JewotCSAgdHNlY19yZWxvY3MgPSBpbmZvLT5yZWxvY3M7Ci0JICB0c2VjX3JlbGVuZCA9IGluZm8tPnJlbGVuZDsKLQkgIHRzZWNfZnJlZSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRzZWNfcmVsb2NzID0gKF9iZmRfZWxmNjRfbGlua19yZWFkX3JlbG9jcwotCQkgICAgICAgICAoaW5mby0+YWJmZCwgaW5mby0+dHNlYywgKFBUUikgTlVMTCwKLQkJCSAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJCSBpbmZvLT5saW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0JICBpZiAodHNlY19yZWxvY3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0JICB0c2VjX3JlbGVuZCA9IHRzZWNfcmVsb2NzICsgaW5mby0+dHNlYy0+cmVsb2NfY291bnQ7Ci0JICB0c2VjX2ZyZWUgPSAoaW5mby0+bGlua19pbmZvLT5rZWVwX21lbW9yeSA/IE5VTEwgOiB0c2VjX3JlbG9jcyk7Ci0JfQotCi0gICAgICAvKiBSZWNvdmVyIHRoZSBzeW1ib2wncyBvZmZzZXQgd2l0aGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgICAgIG9mcyA9IChzeW12YWwgLSBpbmZvLT50c2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAtIGluZm8tPnRzZWMtPm91dHB1dF9vZmZzZXQpOwotICAKLSAgICAgIC8qIExvb2sgZm9yIGEgR1BESVNQIHJlbG9jLiAgKi8KLSAgICAgIGdwZGlzcCA9IChlbGY2NF9hbHBoYV9maW5kX3JlbG9jX2F0X29mcwotCQkodHNlY19yZWxvY3MsIHRzZWNfcmVsZW5kLCBvZnMsIFJfQUxQSEFfR1BESVNQKSk7Ci0KLSAgICAgIGlmICghZ3BkaXNwIHx8IGdwZGlzcC0+cl9hZGRlbmQgIT0gNCkKLQl7Ci0JICBpZiAodHNlY19mcmVlKQotCSAgICBmcmVlICh0c2VjX2ZyZWUpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgaWYgKHRzZWNfZnJlZSkKLSAgICAgICAgZnJlZSAodHNlY19mcmVlKTsKLSAgICB9Ci0KLSAgLyogV2UndmUgbm93IGRldGVybWluZWQgdGhhdCB3ZSBjYW4gc2tpcCBhbiBpbml0aWFsIGdwIGxvYWQuICBWZXJpZnkgCi0gICAgIHRoYXQgdGhlIGNhbGwgYW5kIHRoZSB0YXJnZXQgdXNlIHRoZSBzYW1lIGdwLiAgICovCi0gIGlmIChpbmZvLT5saW5rX2luZm8tPmhhc2gtPmNyZWF0b3IgIT0gaW5mby0+dHNlYy0+b3duZXItPnh2ZWMKLSAgICAgIHx8IGluZm8tPmdvdG9iaiAhPSBhbHBoYV9lbGZfdGRhdGEgKGluZm8tPnRzZWMtPm93bmVyKS0+Z290b2JqKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBzeW12YWwgKyA4OwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfcmVsYXhfd2l0aG91dF9saXR1c2UgKGluZm8sIHN5bXZhbCwgaXJlbCkKLSAgICAgc3RydWN0IGFscGhhX3JlbGF4X2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgc3ltdmFsOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbDsKLXsKLSAgdW5zaWduZWQgaW50IGluc247Ci0gIGJmZF9zaWduZWRfdm1hIGRpc3A7Ci0KLSAgLyogR2V0IHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGluc24gPSBiZmRfZ2V0XzMyIChpbmZvLT5hYmZkLCBpbmZvLT5jb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQotICBpZiAoaW5zbiA+PiAyNiAhPSBPUF9MRFEpCi0gICAgewotICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICgiJXM6ICVzKzB4JWx4OiB3YXJuaW5nOiBMSVRFUkFMIHJlbG9jYXRpb24gYWdhaW5zdCB1bmV4cGVjdGVkIGluc24iLAotCWJmZF9nZXRfZmlsZW5hbWUgKGluZm8tPmFiZmQpLCBpbmZvLT5zZWMtPm5hbWUsCi0JKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0KSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogU28gd2UgYXJlbid0IHRvbGQgbXVjaC4gIERvIHdoYXQgd2UgY2FuIHdpdGggdGhlIGFkZHJlc3MgbG9hZCBhbmQKLSAgICAgZmFrZSB0aGUgcmVzdC4gIEFsbCBvZiB0aGUgb3B0aW1pemF0aW9ucyBoZXJlIHJlcXVpcmUgdGhhdCB0aGUKLSAgICAgb2Zmc2V0IGZyb20gdGhlIEdQIGZpdCBpbiAxNiBiaXRzLiAgKi8KLQotICBkaXNwID0gc3ltdmFsIC0gaW5mby0+Z3A7Ci0gIGlmIChkaXNwIDwgLTB4ODAwMCB8fCBkaXNwID49IDB4ODAwMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBPbiB0aGUgTElURVJBTCBpbnN0cnVjdGlvbiBpdHNlbGYsIGNvbnNpZGVyIGV4Y2hhbmdpbmcKLSAgICAgYGxkcSBSLFgoZ3ApJyBmb3IgYGxkYSBSLFkoZ3ApJy4gICovCi0KLSAgaW5zbiA9IChPUF9MREEgPDwgMjYpIHwgKGluc24gJiAweDAzZmYwMDAwKTsKLSAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgaW5zbiwgaW5mby0+Y29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0gIGluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOwotCi0gIGlyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksIFJfQUxQSEFfR1BSRUxMT1cpOwotICBpbmZvLT5jaGFuZ2VkX3JlbG9jcyA9IHRydWU7Ci0KLSAgLyogUmVkdWNlIHRoZSB1c2UgY291bnQgb24gdGhpcyBnb3QgZW50cnkgYnkgb25lLCBwb3NzaWJseQotICAgICBlbGltaW5hdGluZyBpdC4gICovCi0gIGluZm8tPmdvdGVudC0+dXNlX2NvdW50IC09IDE7Ci0gIGFscGhhX2VsZl90ZGF0YSAoaW5mby0+Z290ZW50LT5nb3RvYmopLT50b3RhbF9nb3RfZW50cmllcyAtPSAxOwotICBpZiAoIWluZm8tPmgpCi0gICAgYWxwaGFfZWxmX3RkYXRhIChpbmZvLT5nb3RlbnQtPmdvdG9iaiktPm5fbG9jYWxfZ290X2VudHJpZXMgLT0gMTsKLQotICAvKiA/Pz8gU2VhcmNoIGZvcndhcmQgdGhyb3VnaCB0aGlzIGJhc2ljIGJsb2NrIGxvb2tpbmcgZm9yIGluc25zCi0gICAgIHRoYXQgdXNlIHRoZSB0YXJnZXQgcmVnaXN0ZXIuICBTdG9wIGFmdGVyIGFuIGluc24gbW9kaWZ5aW5nIHRoZQotICAgICByZWdpc3RlciBpcyBzZWVuLCBvciBhZnRlciBhIGJyYW5jaCBvciBjYWxsLgotCi0gICAgIEFueSBzdWNoIG1lbW9yeSBsb2FkIGluc24gbWF5IGJlIHN1YnN0aXR1dGVkIGJ5IGEgbG9hZCBkaXJlY3RseQotICAgICBvZmYgdGhlIEdQLiAgVGhpcyBhbGxvd3MgdGhlIG1lbW9yeSBsb2FkIGluc24gdG8gYmUgaXNzdWVkIGJlZm9yZQotICAgICB0aGUgY2FsY3VsYXRlZCBHUCByZWdpc3RlciB3b3VsZCBvdGhlcndpc2UgYmUgcmVhZHkuIAotCi0gICAgIEFueSBzdWNoIGpzciBpbnNuIGNhbiBiZSByZXBsYWNlZCBieSBhIGJzciBpZiBpdCBpcyBpbiByYW5nZS4KLQotICAgICBUaGlzIHdvdWxkIG1lYW4gdGhhdCB3ZSdkIGhhdmUgdG8gX2FkZF8gcmVsb2NhdGlvbnMsIHRoZSBwYWluIG9mCi0gICAgIHdoaWNoIGdpdmVzIG9uZSBwYXVzZS4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgRWxmNjRfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKLSAgRWxmNjRfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOwotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKmxvY2FsX2dvdF9lbnRyaWVzOwotICBzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyBpbmZvOwotCi0gIC8qIFdlIGFyZSBub3QgY3VycmVudGx5IGNoYW5naW5nIGFueSBzaXplcywgc28gb25seSBvbmUgcGFzcy4gICovCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLSAgICAgIHx8IHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc2VjdGlvbiwKLSAgICAgaW5pdGlhbGl6ZSB0aGUgY29va2VkIHNpemUuICAqLwotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgbG9jYWxfZ290X2VudHJpZXMgPSBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPmxvY2FsX2dvdF9lbnRyaWVzOwotCi0gIC8qIExvYWQgdGhlIHJlbG9jYXRpb25zIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGY2NF9saW5rX3JlYWRfcmVsb2NzCi0JCSAgICAgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCi0gIG1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLSAgaW5mby5hYmZkID0gYWJmZDsKLSAgaW5mby5zZWMgPSBzZWM7Ci0gIGluZm8ubGlua19pbmZvID0gbGlua19pbmZvOwotICBpbmZvLnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgaW5mby5yZWxlbmQgPSBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLQotICAvKiBGaW5kIHRoZSBHUCBmb3IgdGhpcyBvYmplY3QuICAqLwotICBpbmZvLmdvdG9iaiA9IGFscGhhX2VsZl90ZGF0YSAoYWJmZCktPmdvdG9iajsKLSAgaWYgKGluZm8uZ290b2JqKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290ID0gYWxwaGFfZWxmX3RkYXRhIChpbmZvLmdvdG9iaiktPmdvdDsKLSAgICAgIGluZm8uZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAoaW5mby5nb3RvYmopOwotICAgICAgaWYgKGluZm8uZ3AgPT0gMCkKLQl7Ci0JICBpbmZvLmdwID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIDB4ODAwMCk7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAoaW5mby5nb3RvYmosIGluZm8uZ3ApOwotCX0KLSAgICB9Ci0KLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgc3ltdmFsOwotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKLQotICAgICAgaWYgKEVMRjY0X1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX0FMUEhBX0xJVEVSQUwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoaW5mby5jb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCSAgICBpbmZvLmNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbmZvLmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoaW5mby5jb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gaW5mby5jb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBpbmZvLmNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFJlYWQgdGhpcyBCRkQncyBzeW1ib2xzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JewotCSAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGV4dHN5bXMgPSAoRWxmNjRfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXh0c3ltcyA9ICgoRWxmNjRfRXh0ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOwotCSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCQkgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGUgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pIDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBpbmZvLnRzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIGluZm8udHNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpc3ltLnN0X3NobmR4KTsKLQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgaW5mby50c2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgaW5mby50c2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgCi0JICAgIGNvbnRpbnVlOwkvKiB3aG8ga25vd3MuICovCi0KLQkgIGluZm8uaCA9IE5VTEw7Ci0JICBpbmZvLm90aGVyID0gaXN5bS5zdF9vdGhlcjsKLQkgIGdvdGVudCA9IGxvY2FsX2dvdF9lbnRyaWVzW0VMRjY0X1JfU1lNKGlyZWwtPnJfaW5mbyldOwotCSAgc3ltdmFsID0gaXN5bS5zdF92YWx1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGluZHggPSBFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gYWxwaGFfZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZHhdOwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQotCSAgd2hpbGUgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWgtPnJvb3Qucm9vdC51LmkubGluazsKLQotCSAgLyogV2UgY2FuJ3QgZG8gYW50aGluZyB3aXRoIHVuZGVmaW5lZCBvciBkeW5hbWljIHN5bWJvbHMuICAqLwotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLQkgICAgICB8fCBhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoJmgtPnJvb3QsIGxpbmtfaW5mbykpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpbmZvLmggPSBoOwotCSAgaW5mby5nb3RlbnQgPSBnb3RlbnQ7Ci0JICBpbmZvLnRzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIGluZm8ub3RoZXIgPSBoLT5yb290Lm90aGVyOwotCSAgZ290ZW50ID0gaC0+Z290X2VudHJpZXM7Ci0JICBzeW12YWwgPSBoLT5yb290LnJvb3QudS5kZWYudmFsdWU7Ci0JfQotCi0gICAgICAvKiBTZWFyY2ggZm9yIHRoZSBnb3QgZW50cnkgdG8gYmUgdXNlZCBieSB0aGlzIHJlbG9jYXRpb24uICAqLwotICAgICAgd2hpbGUgKGdvdGVudC0+Z290b2JqICE9IGluZm8uZ290b2JqIHx8IGdvdGVudC0+YWRkZW5kICE9IGlyZWwtPnJfYWRkZW5kKQotCWdvdGVudCA9IGdvdGVudC0+bmV4dDsKLSAgICAgIGluZm8uZ290ZW50ID0gZ290ZW50OwotCi0gICAgICBzeW12YWwgKz0gaW5mby50c2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5mby50c2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgc3ltdmFsICs9IGlyZWwtPnJfYWRkZW5kOwotCi0gICAgICBCRkRfQVNTRVJUKGluZm8uZ290ZW50ICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGVyZSBleGlzdCBMSVRVU0UgcmVsb2NhdGlvbnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nLCB0aGlzCi0JIG9wZW5zIHVwIGFsbCBzb3J0cyBvZiBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb25zLCBiZWNhdXNlIHdlCi0JIG5vdyBrbm93IGV2ZXJ5IGxvY2F0aW9uIHRoYXQgdGhpcyBhZGRyZXNzIGxvYWQgaXMgdXNlZC4gICovCi0KLSAgICAgIGlmIChpcmVsKzEgPCBpcmVsZW5kICYmIEVMRjY0X1JfVFlQRSAoaXJlbFsxXS5yX2luZm8pID09IFJfQUxQSEFfTElUVVNFKQotCXsKLQkgIGlyZWwgPSBlbGY2NF9hbHBoYV9yZWxheF93aXRoX2xpdHVzZSAoJmluZm8sIHN5bXZhbCwgaXJlbCwgaXJlbGVuZCk7Ci0JICBpZiAoaXJlbCA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCFlbGY2NF9hbHBoYV9yZWxheF93aXRob3V0X2xpdHVzZSAoJmluZm8sIHN5bXZhbCwgaXJlbCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKCFlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucyAoYWJmZCwgbGlua19pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZm8uY2hhbmdlZF9yZWxvY3MpCi0gICAgewotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgfQotCi0gIGlmIChpbmZvLmNoYW5nZWRfY29udGVudHMpCi0gICAgewotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBpbmZvLmNvbnRlbnRzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGluZm8uY29udGVudHM7Ci0JfQotICAgIH0KLQotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2V4dHN5bXMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCX0KLSAgICB9Ci0KLSAgKmFnYWluID0gaW5mby5jaGFuZ2VkX2NvbnRlbnRzIHx8IGluZm8uY2hhbmdlZF9yZWxvY3M7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIFBMVC9HT1QgU3R1ZmYgKi8KLSNkZWZpbmUgUExUX0hFQURFUl9TSVpFIDMyCi0jZGVmaW5lIFBMVF9IRUFERVJfV09SRDEJMHhjMzYwMDAwMAkvKiBiciAgICQyNywuKzQgICAgICovCi0jZGVmaW5lIFBMVF9IRUFERVJfV09SRDIJMHhhNzdiMDAwYwkvKiBsZHEgICQyNywxMigkMjcpICovCi0jZGVmaW5lIFBMVF9IRUFERVJfV09SRDMJMHg0N2ZmMDQxZgkvKiBub3AgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBMVF9IRUFERVJfV09SRDQJMHg2YjdiMDAwMAkvKiBqbXAgICQyNywoJDI3KSAgICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTIKLSNkZWZpbmUgUExUX0VOVFJZX1dPUkQxCQkweGMzODAwMDAwCS8qIGJyICAgJDI4LCBwbHQwICAgKi8KLSNkZWZpbmUgUExUX0VOVFJZX1dPUkQyCQkwCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMwkJMAotCi0jZGVmaW5lIE1BWF9HT1RfRU5UUklFUwkJKDY0KjEwMjQgLyA4KQotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9sZC5zbyIKLQwKLS8qIEhhbmRsZSBhbiBBbHBoYSBzcGVjaWZpYyBzZWN0aW9uIHdoZW4gcmVhZGluZyBhbiBvYmplY3QgZmlsZS4gIFRoaXMKLSAgIGlzIGNhbGxlZCB3aGVuIGVsZmNvZGUuaCBmaW5kcyBhIHNlY3Rpb24gd2l0aCBhbiB1bmtub3duIHR5cGUuCi0gICBGSVhNRTogV2UgbmVlZCB0byBoYW5kbGUgdGhlIFNIRl9BTFBIQV9HUFJFTCBmbGFnLCBidXQgSSdtIG5vdCBzdXJlCi0gICBob3cgdG8uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGY2NF9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotCi0gIC8qIFRoZXJlIG91Z2h0IHRvIGJlIGEgcGxhY2UgdG8ga2VlcCBFTEYgYmFja2VuZCBzcGVjaWZpYyBmbGFncywgYnV0Ci0gICAgIGF0IHRoZSBtb21lbnQgdGhlcmUgaXNuJ3Qgb25lLiAgV2UganVzdCBrZWVwIHRyYWNrIG9mIHRoZQotICAgICBzZWN0aW9ucyBieSB0aGVpciBuYW1lLCBpbnN0ZWFkLiAgRm9ydHVuYXRlbHksIHRoZSBBQkkgZ2l2ZXMKLSAgICAgc3VnZ2VzdGVkIG5hbWVzIGZvciBhbGwgdGhlIE1JUFMgc3BlY2lmaWMgc2VjdGlvbnMsIHNvIHdlIHdpbGwKLSAgICAgcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCB0aGlzLiAgKi8KLSAgc3dpdGNoIChoZHItPnNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX0FMUEhBX0RFQlVHOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5tZGVidWciKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLSAgICBjYXNlIFNIVF9BTFBIQV9SRUdJTkZPOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWdpbmZvIikgIT0gMAotCSAgfHwgaGRyLT5zaF9zaXplICE9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmV3c2VjdCA9IGhkci0+YmZkX3NlY3Rpb247Ci0KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfQUxQSEFfREVCVUcpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBuZXdzZWN0LAotCQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIG5ld3NlY3QpCi0JCQkJICAgIHwgU0VDX0RFQlVHR0lORykpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZmRlZiBFUklDX25ldmVyZGVmCi0gIC8qIEZvciBhIC5yZWdpbmZvIHNlY3Rpb24sIHNldCB0aGUgZ3AgdmFsdWUgaW4gdGhlIHRkYXRhIGluZm9ybWF0aW9uCi0gICAgIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbi4gIFdlIG5lZWQgdGhlIGdwIHZhbHVlIHdoaWxlCi0gICAgIHByb2Nlc3NpbmcgcmVsb2NzLCBzbyB3ZSBqdXN0IGdldCBpdCBub3cuICAqLwotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9BTFBIQV9SRUdJTkZPKQotICAgIHsKLSAgICAgIEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gZXh0OwotICAgICAgRWxmNjRfUmVnSW5mbyBzOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG5ld3NlY3QsIChQVFIpICZleHQsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzaXplb2YgZXh0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9yZWdpbmZvX2luIChhYmZkLCAmZXh0LCAmcyk7Ci0gICAgICBlbGZfZ3AgKGFiZmQpID0gcy5yaV9ncF92YWx1ZTsKLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBjb3JyZWN0IHR5cGUgZm9yIGFuIEFscGhhIEVMRiBzZWN0aW9uLiAgV2UgZG8gdGhpcyBieSB0aGUKLSAgIHNlY3Rpb24gbmFtZSwgd2hpY2ggaXMgYSBoYWNrLCBidXQgb3VnaHQgdG8gd29yay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9mYWtlX3NlY3Rpb25zIChhYmZkLCBoZHIsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBFbGY2NF9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICIubWRlYnVnIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfQUxQSEFfREVCVUc7Ci0gICAgICAvKiBJbiBhIHNoYXJlZCBvYmplY3Qgb24gSXJpeCA1LjMsIHRoZSAubWRlYnVnIHNlY3Rpb24gaGFzIGFuCi0gICAgICAgICBlbnRzaXplIG9mIDAuICBGSVhNRTogRG9lcyB0aGlzIG1hdHRlcj8gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCApCi0JaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgICAgIGVsc2UKLQloZHItPnNoX2VudHNpemUgPSAxOwotICAgIH0KLSNpZmRlZiBFUklDX25ldmVyZGVmCi0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWdpbmZvIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfQUxQSEFfUkVHSU5GTzsKLSAgICAgIC8qIEluIGEgc2hhcmVkIG9iamVjdCBvbiBJcml4IDUuMywgdGhlIC5yZWdpbmZvIHNlY3Rpb24gaGFzIGFuCi0gICAgICAgICBlbnRzaXplIG9mIDB4MTguICBGSVhNRTogRG9lcyB0aGlzIG1hdHRlcj8gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQloZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pOwotICAgICAgZWxzZQotCWhkci0+c2hfZW50c2l6ZSA9IDE7Ci0KLSAgICAgIC8qIEZvcmNlIHRoZSBzZWN0aW9uIHNpemUgdG8gdGhlIGNvcnJlY3QgdmFsdWUsIGV2ZW4gaWYgdGhlCi0JIGxpbmtlciB0aGlua3MgaXQgaXMgbGFyZ2VyLiAgVGhlIGxpbmsgcm91dGluZSBiZWxvdyB3aWxsIG9ubHkKLQkgd3JpdGUgb3V0IHRoaXMgbXVjaCBkYXRhIGZvciAucmVnaW5mby4gICovCi0gICAgICBoZHItPnNoX3NpemUgPSBzZWMtPl9yYXdfc2l6ZSA9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaGFzaCIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIuZHluYW1pYyIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIuZHluc3RyIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX2VudHNpemUgPSAwOwotICAgICAgaGRyLT5zaF9pbmZvID0gU0laRU9GX0FMUEhBX0RZTlNZTV9TRUNOQU1FUzsKLSAgICB9Ci0jZW5kaWYKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKLSAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9BTFBIQV9HUFJFTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSG9vayBjYWxsZWQgYnkgdGhlIGxpbmtlciByb3V0aW5lIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIFdlIHVzZSBpdCB0byBwdXQgLmNvbW0gaXRlbXMgaW4gLnNic3MsIGFuZCBub3QgLmJzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3A7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYmZkX3ZtYSAqdmFscDsKLXsKLSAgaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTgotICAgICAgJiYgIWluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgc3ltLT5zdF9zaXplIDw9IGJmZF9nZXRfZ3Bfc2l6ZSAoYWJmZCkpCi0gICAgewotICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIC1HIG5uIGJ5dGVzIGFyZQotCSBhdXRvbWF0aWNhbGx5IHB1dCBpbnRvIC5zYnNzLiAgKi8KLQotICAgICAgYXNlY3Rpb24gKnNjb21tID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc2NvbW1vbiIpOwotCi0gICAgICBpZiAoc2NvbW0gPT0gTlVMTCkKLQl7Ci0JICBzY29tbSA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuc2NvbW1vbiIpOwotCSAgaWYgKHNjb21tID09IE5VTEwKLQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzY29tbSwgKFNFQ19BTExPQwotCQkJCQkJICAgICAgIHwgU0VDX0lTX0NPTU1PTgotCQkJCQkJICAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgICpzZWNwID0gc2NvbW07Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2NyZWF0ZV9nb3Rfc2VjdGlvbihhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqczsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZ290IikpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKSkKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWxwaGFfZWxmX3RkYXRhIChhYmZkKS0+Z290ID0gczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIGFsbCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIC8qIFdlIG5lZWQgdG8gY3JlYXRlIC5wbHQsIC5yZWxhLnBsdCwgLmdvdCwgYW5kIC5yZWxhLmdvdCBzZWN0aW9ucy4gICovCi0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucGx0Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCSAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkgICAgfCBTRUNfQ09ERSkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiB0aGUKLSAgICAgLnBsdCBzZWN0aW9uLiAgKi8KLSAgaCA9IE5VTEw7Ci0gIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAoaW5mbywgYWJmZCwgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iLCBCU0ZfR0xPQkFMLCBzLAotCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICBpZiAoaW5mby0+c2hhcmVkCi0gICAgICAmJiAhIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucmVsYS5wbHQiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV2UgbWF5IG9yIG1heSBub3QgaGF2ZSBjcmVhdGVkIGEgLmdvdCBzZWN0aW9uIGZvciB0aGlzIG9iamVjdCwgYnV0Ci0gICAgIHdlIGRlZmluaXRlbHkgaGF2bid0IGRvbmUgdGhlIHJlc3Qgb2YgdGhlIHdvcmsuICAqLwotCi0gIGlmICghZWxmNjRfYWxwaGFfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24oYWJmZCwgIi5yZWxhLmdvdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIGR5bm9iaidzIC5nb3Qgc2VjdGlvbi4gIFdlIGRvbid0IGRvIHRoaXMgaW4gdGhlIGxpbmtlciBzY3JpcHQKLSAgICAgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGRlZmluZSB0aGUgc3ltYm9sIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcKLSAgICAgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaCA9IE5VTEw7Ci0gIGlmICghKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JKGluZm8sIGFiZmQsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iLCBCU0ZfR0xPQkFMLAotCSBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPmdvdCwgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsCi0JIGZhbHNlLCBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZAotICAgICAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdCA9IGg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBSZWFkIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmcm9tIGEgLm1kZWJ1ZyBzZWN0aW9uIGludG8gYQotICAgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfcmVhZF9lY29mZl9pbmZvIChhYmZkLCBzZWN0aW9uLCBkZWJ1ZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotewotICBIRFJSICpzeW1oZHI7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICBjaGFyICpleHRfaGRyID0gTlVMTDsKLQotICBzd2FwID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotICBtZW1zZXQgKGRlYnVnLCAwLCBzaXplb2YoKmRlYnVnKSk7Ci0KLSAgZXh0X2hkciA9IChjaGFyICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplKTsKLSAgaWYgKGV4dF9oZHIgPT0gTlVMTCAmJiBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGV4dF9oZHIsIChmaWxlX3B0cikgMCwKLQkJCQlzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSkKLSAgICAgID09IGZhbHNlKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICAoKnN3YXAtPnN3YXBfaGRyX2luKSAoYWJmZCwgZXh0X2hkciwgc3ltaGRyKTsKLQotICAvKiBUaGUgc3ltYm9saWMgaGVhZGVyIGNvbnRhaW5zIGFic29sdXRlIGZpbGUgb2Zmc2V0cyBhbmQgc2l6ZXMgdG8KLSAgICAgcmVhZC4gICovCi0jZGVmaW5lIFJFQUQocHRyLCBvZmZzZXQsIGNvdW50LCBzaXplLCB0eXBlKQkJCQlcCi0gIGlmIChzeW1oZHItPmNvdW50ID09IDApCQkJCQkJXAotICAgIGRlYnVnLT5wdHIgPSBOVUxMOwkJCQkJCQlcCi0gIGVsc2UJCQkJCQkJCQlcCi0gICAgewkJCQkJCQkJCVwKLSAgICAgIGRlYnVnLT5wdHIgPSAodHlwZSkgYmZkX21hbGxvYyAoKHNpemVfdCkgKHNpemUgKiBzeW1oZHItPmNvdW50KSk7CVwKLSAgICAgIGlmIChkZWJ1Zy0+cHRyID09IE5VTEwpCQkJCQkJXAotCWdvdG8gZXJyb3JfcmV0dXJuOwkJCQkJCVwKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBzeW1oZHItPm9mZnNldCwgU0VFS19TRVQpICE9IDAJXAotCSAgfHwgKGJmZF9yZWFkIChkZWJ1Zy0+cHRyLCBzaXplLCBzeW1oZHItPmNvdW50LAkJXAotCQkJYWJmZCkgIT0gc2l6ZSAqIHN5bWhkci0+Y291bnQpKQkJCVwKLQlnb3RvIGVycm9yX3JldHVybjsJCQkJCQlcCi0gICAgfQotCi0gIFJFQUQgKGxpbmUsIGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpLCB1bnNpZ25lZCBjaGFyICopOwotICBSRUFEIChleHRlcm5hbF9kbnIsIGNiRG5PZmZzZXQsIGlkbk1heCwgc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3BkciwgY2JQZE9mZnNldCwgaXBkTWF4LCBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfc3ltLCBjYlN5bU9mZnNldCwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX29wdCwgY2JPcHRPZmZzZXQsIGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9hdXgsIGNiQXV4T2Zmc2V0LCBpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpLAotCXVuaW9uIGF1eF9leHQgKik7Ci0gIFJFQUQgKHNzLCBjYlNzT2Zmc2V0LCBpc3NNYXgsIHNpemVvZiAoY2hhciksIGNoYXIgKik7Ci0gIFJFQUQgKHNzZXh0LCBjYlNzRXh0T2Zmc2V0LCBpc3NFeHRNYXgsIHNpemVvZiAoY2hhciksIGNoYXIgKik7Ci0gIFJFQUQgKGV4dGVybmFsX2ZkciwgY2JGZE9mZnNldCwgaWZkTWF4LCBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfcmZkLCBjYlJmZE9mZnNldCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX2V4dCwgY2JFeHRPZmZzZXQsIGlleHRNYXgsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplLCBQVFIpOwotI3VuZGVmIFJFQUQKLQotICBkZWJ1Zy0+ZmRyID0gTlVMTDsKLSAgZGVidWctPmFkanVzdCA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChleHRfaGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0X2hkcik7Ci0gIGlmIChkZWJ1Zy0+bGluZSAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5saW5lKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9kbnIgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9wZHIgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcGRyKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9zeW0gIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9vcHQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0KTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9hdXggIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4KTsKLSAgaWYgKGRlYnVnLT5zcyAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5zcyk7Ci0gIGlmIChkZWJ1Zy0+c3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+c3NleHQpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2ZkciAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9mZHIpOwotICBpZiAoZGVidWctPmV4dGVybmFsX3JmZCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9yZmQpOwotICBpZiAoZGVidWctPmV4dGVybmFsX2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9leHQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFscGhhIEVMRiBsb2NhbCBsYWJlbHMgc3RhcnQgd2l0aCAnJCcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbmFtZVswXSA9PSAnJCc7Ci19Ci0KLS8qIEFscGhhIEVMRiBmb2xsb3dzIE1JUFMgRUxGIGluIHVzaW5nIGEgc3BlY2lhbCBmaW5kX25lYXJlc3RfbGluZQotICAgcm91dGluZSBpbiBvcmRlciB0byBoYW5kbGUgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFdlCi0gICBzdGlsbCBjYWxsIHRoaXMgbWlwc19lbGZfZmluZF9saW5lIGJlY2F1c2Ugb2YgdGhlIHNsb3QKLSAgIGZpbmRfbGluZV9pbmZvIGluIGVsZl9vYmpfdGRhdGEgaXMgZGVjbGFyZWQgdGhhdCB3YXkuICAqLwotCi1zdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lCi17Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGQ7Ci0gIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgaTsKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsCi0JCQkgICAgICAgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIGFzZWN0aW9uICptc2VjOwotCi0gIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5tZGVidWciKTsKLSAgaWYgKG1zZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmbGFnd29yZCBvcmlnZmxhZ3M7Ci0gICAgICBzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lICpmaTsKLSAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3Qgc3dhcCA9Ci0JZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgY2FsbGVkIGR1cmluZyBhIGxpbmssIGFscGhhX2VsZl9maW5hbF9saW5rIG1heSBoYXZlCi0JIGNsZWFyZWQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmllbGQuICBXZSBmb3JjZSBpdCBiYWNrIG9uIGhlcmUKLQkgaWYgYXBwcm9wcmlhdGUgKHdoaWNoIGl0IG5vcm1hbGx5IHdpbGwgYmUpLiAgKi8KLSAgICAgIG9yaWdmbGFncyA9IG1zZWMtPmZsYWdzOwotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG1zZWMpLT50aGlzX2hkci5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0JbXNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQotICAgICAgZmkgPSBlbGZfdGRhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbzsKLSAgICAgIGlmIChmaSA9PSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemU7Ci0JICBjaGFyICpmcmF3X3NyYzsKLQkgIGNoYXIgKmZyYXdfZW5kOwotCSAgc3RydWN0IGZkciAqZmRyX3B0cjsKLQotCSAgZmkgPSAoKHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKikKLQkJYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lKSkpOwotCSAgaWYgKGZpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKCFlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8gKGFiZmQsIG1zZWMsICZmaS0+ZCkpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogU3dhcCBpbiB0aGUgRkRSIGluZm9ybWF0aW9uLiAgKi8KLQkgIGZpLT5kLmZkciA9ICgoc3RydWN0IGZkciAqKQotCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgKGZpLT5kLnN5bWJvbGljX2hlYWRlci5pZmRNYXggKgotCQkJCSAgIHNpemVvZiAoc3RydWN0IGZkcikpKSk7Ci0JICBpZiAoZmktPmQuZmRyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGV4dGVybmFsX2Zkcl9zaXplID0gc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemU7Ci0JICBmZHJfcHRyID0gZmktPmQuZmRyOwotCSAgZnJhd19zcmMgPSAoY2hhciAqKSBmaS0+ZC5leHRlcm5hbF9mZHI7Ci0JICBmcmF3X2VuZCA9IChmcmF3X3NyYwotCQkgICAgICArIGZpLT5kLnN5bWJvbGljX2hlYWRlci5pZmRNYXggKiBleHRlcm5hbF9mZHJfc2l6ZSk7Ci0JICBmb3IgKDsgZnJhd19zcmMgPCBmcmF3X2VuZDsgZnJhd19zcmMgKz0gZXh0ZXJuYWxfZmRyX3NpemUsIGZkcl9wdHIrKykKLQkgICAgKCpzd2FwLT5zd2FwX2Zkcl9pbikgKGFiZmQsIChQVFIpIGZyYXdfc3JjLCBmZHJfcHRyKTsKLQotCSAgZWxmX3RkYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPSBmaTsKLQotCSAgLyogTm90ZSB0aGF0IHdlIGRvbid0IGJvdGhlciB0byBldmVyIGZyZWUgdGhpcyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICBmaW5kX25lYXJlc3RfbGluZSBpcyBlaXRoZXIgY2FsbGVkIGFsbCB0aGUgdGltZSwgYXMgaW4KLSAgICAgICAgICAgICBvYmpkdW1wIC1sLCBzbyB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHNhdmVkLCBvciBpdCBpcwotICAgICAgICAgICAgIHJhcmVseSBjYWxsZWQsIGFzIGluIGxkIGVycm9yIG1lc3NhZ2VzLCBzbyB0aGUgbWVtb3J5Ci0gICAgICAgICAgICAgd2FzdGVkIGlzIHVuaW1wb3J0YW50LiAgU3RpbGwsIGl0IHdvdWxkIHByb2JhYmx5IGJlIGEKLSAgICAgICAgICAgICBnb29kIGlkZWEgZm9yIGZyZWVfY2FjaGVkX2luZm8gdG8gdGhyb3cgaXQgYXdheS4gICovCi0JfQotCi0gICAgICBpZiAoX2JmZF9lY29mZl9sb2NhdGVfbGluZSAoYWJmZCwgc2VjdGlvbiwgb2Zmc2V0LCAmZmktPmQsIHN3YXAsCi0JCQkJICAmZmktPmksIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgIGxpbmVfcHRyKSkKLQl7Ci0JICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0gICAgfQotCi0gIC8qIEZhbGwgYmFjayBvbiB0aGUgZ2VuZXJpYyBFTEYgZmluZF9uZWFyZXN0X2xpbmUgcm91dGluZS4gICovCi0KLSAgcmV0dXJuIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0cik7Ci19Ci0MCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIGFscGhhX2VsZl9vdXRwdXRfZXh0c3ltLiAgKi8KLQotc3RydWN0IGV4dHN5bV9pbmZvCi17Ci0gIGJmZCAqYWJmZDsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gIGJvb2xlYW4gZmFpbGVkOwotfTsKLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX291dHB1dF9leHRzeW0gKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGV4dHN5bV9pbmZvICplaW5mbyA9IChzdHJ1Y3QgZXh0c3ltX2luZm8gKikgZGF0YTsKLSAgYm9vbGVhbiBzdHJpcDsKLSAgYXNlY3Rpb24gKnNlYywgKm91dHB1dF9zZWN0aW9uOwotCi0gIGlmIChoLT5yb290LmluZHggPT0gLTIpCi0gICAgc3RyaXAgPSBmYWxzZTsKLSAgZWxzZSBpZiAoKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAgICAgIHx8IChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwKQotICAgICAgICAgICYmIChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAgICAgJiYgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDApCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlIGlmIChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0gICAgICAgICAgfHwgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0gICAgICAgICAgICAgICYmIGJmZF9oYXNoX2xvb2t1cCAoZWluZm8tPmluZm8tPmtlZXBfaGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKSA9PSBOVUxMKSkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UKLSAgICBzdHJpcCA9IGZhbHNlOwotCi0gIGlmIChzdHJpcCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+ZXN5bS5pZmQgPT0gLTIpCi0gICAgewotICAgICAgaC0+ZXN5bS5qbXB0YmwgPSAwOwotICAgICAgaC0+ZXN5bS5jb2JvbF9tYWluID0gMDsKLSAgICAgIGgtPmVzeW0ud2Vha2V4dCA9IDA7Ci0gICAgICBoLT5lc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uaWZkID0gaWZkTmlsOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0R2xvYmFsOwotCi0gICAgICBpZiAoaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0gICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICAgICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgICAgICAgIC8qIFdoZW4gbWFraW5nIGEgc2hhcmVkIGxpYnJhcnkgYW5kIHN5bWJvbCBoIGlzIHRoZSBvbmUgZnJvbQotICAgICAgICAgICAgdGhlIGFub3RoZXIgc2hhcmVkIGxpYnJhcnksIE9VVFBVVF9TRUNUSU9OIG1heSBiZSBudWxsLiAgKi8KLSAgICAgICAgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChvdXRwdXRfc2VjdGlvbi0+b3duZXIsIG91dHB1dF9zZWN0aW9uKTsKLQotICAgICAgICAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1RleHQ7Ci0gICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRhdGEiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NEYXRhOwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yb2RhdGEiKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgfHwgc3RyY21wIChuYW1lLCAiLnJkYXRhIikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjUkRhdGE7Ci0gICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0JzczsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0gICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NJbml0OwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjRmluaTsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgICAgICAgfQotICAgICAgIH0KLQotICAgICAgaC0+ZXN5bS5hc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotICAgIH0KLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gaC0+cm9vdC5yb290LnUuYy5zaXplOwotICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLSAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0JzczsKLSAgICAgIGVsc2UgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY1NDb21tb24pCi0gICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotCi0gICAgICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLSAgICAgIGlmIChvdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIGVsc2UKLSAgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNldCB0eXBlIGFuZCB2YWx1ZSBmb3IgYSBzeW1ib2wgd2l0aCBhIGZ1bmN0aW9uIHN0dWIuICAqLwotICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RQcm9jOwotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGVpbmZvLT5hYmZkLCAiLnBsdCIpOwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCWgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCSAgaWYgKG91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IChoLT5yb290LnBsdC5vZmZzZXQKLQkJCQkgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICArIG91dHB1dF9zZWN0aW9uLT52bWEpOwotCSAgZWxzZQotCSAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotCX0KLSNpZiAwIC8qIEZJWE1FPyAgKi8KLSAgICAgIGgtPmVzeW0uaWZkID0gMDsKLSNlbmRpZgotICAgIH0KLQotICBpZiAoISBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsIChlaW5mby0+YWJmZCwgZWluZm8tPmRlYnVnLCBlaW5mby0+c3dhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgtPmVzeW0pKQotICAgIHsKLSAgICAgIGVpbmZvLT5mYWlsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRklYTUU6ICBDcmVhdGUgYSBydW50aW1lIHByb2NlZHVyZSB0YWJsZSBmcm9tIHRoZSAubWRlYnVnIHNlY3Rpb24uCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jcmVhdGVfcHJvY2VkdXJlX3RhYmxlIChoYW5kbGUsIGFiZmQsIGluZm8sIHMsIGRlYnVnKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqczsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotKi8KLQwKLS8qIEhhbmRsZSBkeW5hbWljIHJlbG9jYXRpb25zIHdoZW4gZG9pbmcgYW4gQWxwaGEgRUxGIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIGNvbnN0IGNoYXIgKnJlbF9zZWNfbmFtZTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKipsb2NhbF9nb3RfZW50cmllczsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgaW50IGdvdF9jcmVhdGVkOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKLSAgaWYgKGR5bm9iaiA9PSBOVUxMKQotICAgIGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCi0gIHNyZWxvYyA9IE5VTEw7Ci0gIHJlbF9zZWNfbmFtZSA9IE5VTEw7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gYWxwaGFfZWxmX3N5bV9oYXNoZXMoYWJmZCk7Ci0gIGxvY2FsX2dvdF9lbnRyaWVzID0gYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5sb2NhbF9nb3RfZW50cmllczsKLSAgZ290X2NyZWF0ZWQgPSAwOwotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7ICsrcmVsKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHgsIHJfdHlwZTsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjY0X1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLQkgIHdoaWxlIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloLT5yb290LnJvb3QudS5pLmxpbms7Ci0KLQkgIGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSOwotCX0KLSAgICAgIHJfdHlwZSA9IEVMRjY0X1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSX0FMUEhBX0xJVEVSQUw6Ci0JICB7Ci0JICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0JICAgIGludCBmbGFncyA9IDA7Ci0KLQkgICAgaWYgKGgpCi0JICAgICAgewotCQkvKiBTZWFyY2ggZm9yIGFuZCBwb3NzaWJseSBjcmVhdGUgYSBnb3QgZW50cnkuICAqLwotCQlmb3IgKGdvdGVudCA9IGgtPmdvdF9lbnRyaWVzOyBnb3RlbnQgOyBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCi0JCSAgaWYgKGdvdGVudC0+Z290b2JqID09IGFiZmQgJiYKLQkJICAgICAgZ290ZW50LT5hZGRlbmQgPT0gcmVsLT5yX2FkZGVuZCkKLQkJICAgIGJyZWFrOwotCi0JCWlmICghZ290ZW50KQotCQkgIHsKLQkJICAgIGdvdGVudCA9ICgoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKikKLQkJCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkpKSk7Ci0JCSAgICBpZiAoIWdvdGVudCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgICBnb3RlbnQtPmdvdG9iaiA9IGFiZmQ7Ci0JCSAgICBnb3RlbnQtPmFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICBnb3RlbnQtPmdvdF9vZmZzZXQgPSAtMTsKLQkJICAgIGdvdGVudC0+ZmxhZ3MgPSAwOwotCQkgICAgZ290ZW50LT51c2VfY291bnQgPSAxOwotCi0JCSAgICBnb3RlbnQtPm5leHQgPSBoLT5nb3RfZW50cmllczsKLQkJICAgIGgtPmdvdF9lbnRyaWVzID0gZ290ZW50OwotCi0JCSAgICBhbHBoYV9lbGZfdGRhdGEgKGFiZmQpLT50b3RhbF9nb3RfZW50cmllcysrOwotCQkgIH0KLQkJZWxzZQotCQkgIGdvdGVudC0+dXNlX2NvdW50ICs9IDE7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKiBUaGlzIGlzIGEgbG9jYWwgLmdvdCBlbnRyeSAtLSByZWNvcmQgZm9yIG1lcmdlLiAgKi8KLQkJaWYgKCFsb2NhbF9nb3RfZW50cmllcykKLQkJICB7Ci0JCSAgICBzaXplX3Qgc2l6ZTsKLQkJICAgIHNpemUgPSAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJICAgICogc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKSk7Ci0KLQkJICAgIGxvY2FsX2dvdF9lbnRyaWVzID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKikKLQkJCQkJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSkpOwotCQkgICAgaWYgKCFsb2NhbF9nb3RfZW50cmllcykKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgICBtZW1zZXQgKGxvY2FsX2dvdF9lbnRyaWVzLCAwLCBzaXplKTsKLQkJICAgIGFscGhhX2VsZl90ZGF0YSAoYWJmZCktPmxvY2FsX2dvdF9lbnRyaWVzID0KLQkJICAgICAgbG9jYWxfZ290X2VudHJpZXM7Ci0JCSAgfQotCi0JCWZvciAoZ290ZW50ID0gbG9jYWxfZ290X2VudHJpZXNbRUxGNjRfUl9TWU0ocmVsLT5yX2luZm8pXTsKLQkJICAgICBnb3RlbnQgIT0gTlVMTCAmJiBnb3RlbnQtPmFkZGVuZCAhPSByZWwtPnJfYWRkZW5kOwotCQkgICAgIGdvdGVudCA9IGdvdGVudC0+bmV4dCkKLQkJICBjb250aW51ZTsKLQkJaWYgKCFnb3RlbnQpCi0JCSAgewotCQkgICAgZ290ZW50ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKQotCQkJICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSkpKTsKLQkJICAgIGlmICghZ290ZW50KQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAgIGdvdGVudC0+Z290b2JqID0gYWJmZDsKLQkJICAgIGdvdGVudC0+YWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkJICAgIGdvdGVudC0+Z290X29mZnNldCA9IC0xOwotCQkgICAgZ290ZW50LT5mbGFncyA9IDA7Ci0JCSAgICBnb3RlbnQtPnVzZV9jb3VudCA9IDE7Ci0KLQkJICAgIGdvdGVudC0+bmV4dCA9IGxvY2FsX2dvdF9lbnRyaWVzW0VMRjY0X1JfU1lNKHJlbC0+cl9pbmZvKV07Ci0JCSAgICBsb2NhbF9nb3RfZW50cmllc1tFTEY2NF9SX1NZTShyZWwtPnJfaW5mbyldID0gZ290ZW50OwotCi0JCSAgICBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPnRvdGFsX2dvdF9lbnRyaWVzKys7Ci0JCSAgICBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPm5fbG9jYWxfZ290X2VudHJpZXMrKzsKLQkJICB9Ci0JCWVsc2UKLQkJICBnb3RlbnQtPnVzZV9jb3VudCArPSAxOwotCSAgICAgIH0KLQotCSAgICAvKiBSZW1lbWJlciBob3cgdGhpcyBsaXRlcmFsIGlzIHVzZWQgZnJvbSBpdHMgTElUVVNFcy4KLQkgICAgICAgVGhpcyB3aWxsIGJlIGltcG9ydGFudCB3aGVuIGl0IGNvbWVzIHRvIGRlY2lkZSBpZiB3ZSBjYW4KLQkgICAgICAgY3JlYXRlIGEgLnBsdCBlbnRyeSBmb3IgYSBmdW5jdGlvbiBzeW1ib2wuICAqLwotCSAgICBpZiAocmVsKzEgPCByZWxlbmQKLQkJJiYgRUxGNjRfUl9UWVBFIChyZWxbMV0ucl9pbmZvKSA9PSBSX0FMUEhBX0xJVFVTRSkKLQkgICAgICB7Ci0JCWRvCi0JCSAgewotCQkgICAgKytyZWw7Ci0JCSAgICBpZiAocmVsLT5yX2FkZGVuZCA+PSAxICYmIHJlbC0+cl9hZGRlbmQgPD0gMykKLQkJICAgICAgZmxhZ3MgfD0gMSA8PCByZWwtPnJfYWRkZW5kOwotCQkgIH0KLQkJd2hpbGUgKHJlbCsxIDwgcmVsZW5kICYmCi0JCSAgICAgICBFTEY2NF9SX1RZUEUgKHJlbFsxXS5yX2luZm8pID09IFJfQUxQSEFfTElUVVNFKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCS8qIE5vIExJVFVTRXMgLS0gcHJlc3VtYWJseSB0aGUgYWRkcmVzcyBpcyBub3QgYmVpbmcKLQkJICAgbG9hZGVkIGZvciBub3RoaW5nLiAgKi8KLQkJZmxhZ3MgPSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0FERFI7Ci0JICAgICAgfQotCi0JICAgIGdvdGVudC0+ZmxhZ3MgfD0gZmxhZ3M7Ci0JICAgIGlmIChoKQotCSAgICAgIHsKLQkJLyogTWFrZSBhIGd1ZXNzIGFzIHRvIHdoZXRoZXIgYSAucGx0IGVudHJ5IHdpbGwgYmUgbmVlZGVkLiAgKi8KLQkJaWYgKChoLT5mbGFncyB8PSBmbGFncykgPT0gQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9GVU5DKQotCQkgIGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkJZWxzZQotCQkgIGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICAgICAgfQotCSAgfQotCSAgLyogRkFMTFRIUlUgKi8KLQotCWNhc2UgUl9BTFBIQV9HUERJU1A6Ci0JY2FzZSBSX0FMUEhBX0dQUkVMMzI6Ci0JY2FzZSBSX0FMUEhBX0dQUkVMSElHSDoKLQljYXNlIFJfQUxQSEFfR1BSRUxMT1c6Ci0JICAvKiBXZSBkb24ndCBhY3R1YWxseSB1c2UgdGhlIC5nb3QgaGVyZSwgYnV0IHRoZSBzZWN0aW9ucyBtdXN0Ci0JICAgICBiZSBjcmVhdGVkIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JICAgICBzZWN0aW9ucy4gICovCi0JICBpZiAoIWdvdF9jcmVhdGVkKQotCSAgICB7Ci0JICAgICAgaWYgKCFlbGY2NF9hbHBoYV9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBNYWtlIHN1cmUgdGhlIG9iamVjdCdzIGdvdG9iaiBpcyBzZXQgdG8gaXRzZWxmIHNvCi0JCSB0aGF0IHdlIGRlZmF1bHQgdG8gZXZlcnkgb2JqZWN0IHdpdGggaXRzIG93biAuZ290LgotCQkgV2UnbGwgbWVyZ2UgLmdvdHMgbGF0ZXIgb25jZSB3ZSd2ZSBjb2xsZWN0ZWQgZWFjaAotCQkgb2JqZWN0J3MgaW5mby4gICovCi0JICAgICAgYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5nb3RvYmogPSBhYmZkOwotCi0JICAgICAgZ290X2NyZWF0ZWQgPSAxOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9BTFBIQV9TUkVMMTY6Ci0JY2FzZSBSX0FMUEhBX1NSRUwzMjoKLQljYXNlIFJfQUxQSEFfU1JFTDY0OgotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGQUxMVEhSVSAqLwotCi0JY2FzZSBSX0FMUEhBX1JFRkxPTkc6Ci0JY2FzZSBSX0FMUEhBX1JFRlFVQUQ6Ci0JICBpZiAocmVsX3NlY19uYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICByZWxfc2VjX25hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAgICAgKGFiZmQsIGVsZl9lbGZoZWFkZXIoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICAgICAgZWxmX3NlY3Rpb25fZGF0YShzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkgICAgICBpZiAocmVsX3NlY19uYW1lID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKHJlbF9zZWNfbmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCSAgICAgcmVsX3NlY19uYW1lKzUpID09IDApOwotCSAgICB9Ci0KLQkgIC8qIFdlIG5lZWQgdG8gY3JlYXRlIHRoZSBzZWN0aW9uIGhlcmUgbm93IHdoZXRoZXIgd2UgZXZlbnR1YWxseQotCSAgICAgdXNlIGl0IG9yIG5vdCBzbyB0aGF0IGl0IGdldHMgbWFwcGVkIHRvIGFuIG91dHB1dCBzZWN0aW9uIGJ5Ci0JICAgICB0aGUgbGlua2VyLiAgSWYgbm90IHVzZWQsIHdlJ2xsIGtpbGwgaXQgaW4KLQkgICAgIHNpemVfZHluYW1pY19zZWN0aW9ucy4gICovCi0JICBpZiAoc3JlbG9jID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCByZWxfc2VjX25hbWUpOwotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgcmVsX3NlY19uYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsCi0JCQkJCQkgKFNFQ19BTExPQ3xTRUNfTE9BRAotCQkJCQkJICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAzKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoKQotCSAgICB7Ci0JICAgICAgLyogU2luY2Ugd2UgaGF2bid0IHNlZW4gYWxsIG9mIHRoZSBpbnB1dCBzeW1ib2xzIHlldCwgd2UKLQkJIGRvbid0IGtub3cgd2hldGhlciB3ZSdsbCBhY3R1YWxseSBuZWVkIGEgZHluYW1pYyByZWxvY2F0aW9uCi0JCSBlbnRyeSBmb3IgdGhpcyByZWxvYy4gIFNvIG1ha2UgYSByZWNvcmQgb2YgaXQuICBPbmNlIHdlCi0JCSBmaW5kIG91dCBpZiB0aGlzIHRoaW5nIG5lZWRzIGR5bmFtaWMgcmVsb2NhdGlvbiB3ZSdsbAotCQkgZXhwYW5kIHRoZSByZWxvY2F0aW9uIHNlY3Rpb25zIGJ5IHRoZSBhcHByb3ByaWF0ZSBhbW91bnQuICovCi0KLQkgICAgICBzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5ICpyZW50OwotCi0JICAgICAgZm9yIChyZW50ID0gaC0+cmVsb2NfZW50cmllczsgcmVudDsgcmVudCA9IHJlbnQtPm5leHQpCi0JCWlmIChyZW50LT5ydHlwZSA9PSByX3R5cGUgJiYgcmVudC0+c3JlbCA9PSBzcmVsb2MpCi0JCSAgYnJlYWs7Ci0KLQkgICAgICBpZiAoIXJlbnQpCi0JCXsKLQkJICByZW50ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5ICopCi0JCQkgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICAgIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSkpKTsKLQkJICBpZiAoIXJlbnQpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICByZW50LT5zcmVsID0gc3JlbG9jOwotCQkgIHJlbnQtPnJ0eXBlID0gcl90eXBlOwotCQkgIHJlbnQtPmNvdW50ID0gMTsKLQotCQkgIHJlbnQtPm5leHQgPSBoLT5yZWxvY19lbnRyaWVzOwotCQkgIGgtPnJlbG9jX2VudHJpZXMgPSByZW50OwotCQl9Ci0JICAgICAgZWxzZQotCQlyZW50LT5jb3VudCsrOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgc2hhcmVkIGxpYnJhcnksIHdlIG5lZWQgYSBSRUxBVElWRSByZWxvYy4gICovCi0JICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmFoOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7Ci0gIGFoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaDsKLQotICAvKiBOb3cgdGhhdCB3ZSd2ZSBzZWVuIGFsbCBvZiB0aGUgaW5wdXQgc3ltYm9scywgZmluYWxpemUgb3VyIGRlY2lzaW9uCi0gICAgIGFib3V0IHdoZXRoZXIgdGhpcyBzeW1ib2wgc2hvdWxkIGdldCBhIC5wbHQgZW50cnkuICAqLwotCi0gIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLSAgICAgICYmIGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wIChoLCBpbmZvKQotICAgICAgJiYgKChoLT50eXBlID09IFNUVF9GVU5DCi0JICAgJiYgIShhaC0+ZmxhZ3MgJiBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0FERFIpKQotCSAgfHwgKGgtPnR5cGUgPT0gU1RUX05PVFlQRQotCSAgICAgICYmIGFoLT5mbGFncyA9PSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0ZVTkMpKQotICAgICAgLyogRG9uJ3QgcHJldmVudCBvdGhlcndpc2UgdmFsaWQgcHJvZ3JhbXMgZnJvbSBsaW5raW5nIGJ5IGF0dGVtcHRpbmcKLQkgdG8gY3JlYXRlIGEgbmV3IC5nb3QgZW50cnkgc29tZXdoZXJlLiAgQSBDb3JyZWN0IFNvbHV0aW9uIHdvdWxkIGJlCi0JIHRvIGFkZCBhIG5ldyAuZ290IHNlY3Rpb24gdG8gYSBuZXcgb2JqZWN0IGZpbGUgYW5kIGxldCBpdCBiZSBtZXJnZWQKLQkgc29tZXdoZXJlIGxhdGVyLiAgQnV0IGZvciBub3cgZG9uJ3QgYm90aGVyLiAgKi8KLSAgICAgICYmIGFoLT5nb3RfZW50cmllcykKLSAgICB7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUoZHlub2JqLCAiLnBsdCIpOwotICAgICAgaWYgKCFzICYmICFlbGY2NF9hbHBoYV9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoZHlub2JqLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBiaXQgb2YgdGhlIC5wbHQgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSA9IFBMVF9IRUFERVJfU0laRTsKLQotICAgICAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUgbm90Ci0JIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGUgbG9jYXRpb24KLQkgaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24gcG9pbnRlcnMgY29tcGFyZQotCSBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPnBsdC5vZmZzZXQ7Ci0JfQotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgYSBKTVBfU0xPVCBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gIFRoZSBBbHBoYSwgc2luY2UgaXQgdXNlcyAuZ290IGVudHJpZXMgZm9yIGFsbAotICAgICBzeW1ib2xzIGV2ZW4gaW4gcmVndWxhciBvYmplY3RzLCBkb2VzIG5vdCBuZWVkIHRoZSBoYWNrZXJ5IG9mIGEKLSAgICAgLmR5bmJzcyBzZWN0aW9uIGFuZCBDT1BZIGR5bmFtaWMgcmVsb2NhdGlvbnMuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTeW1ib2wgdmVyc2lvbmluZyBjYW4gY3JlYXRlIG5ldyBzeW1ib2xzLCBhbmQgbWFrZSBvdXIgb2xkIHN5bWJvbHMKLSAgIGluZGlyZWN0IHRvIHRoZSBuZXcgb25lcy4gIENvbnNvbGlkYXRlIHRoZSBnb3QgYW5kIHJlbG9jIGluZm9ybWF0aW9uCi0gICBpbiB0aGVzZSBzaXR1YXRpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX21lcmdlX2luZF9zeW1ib2xzIChoaSwgZHVtbXkpCi0gICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoaTsKLSAgICAgUFRSIGR1bW15OwotewotICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaHM7Ci0KLSAgaWYgKGhpLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotICAgIHJldHVybiB0cnVlOwotICBocyA9IGhpOwotICBkbyB7Ci0gICAgaHMgPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKilocy0+cm9vdC5yb290LnUuaS5saW5rOwotICB9IHdoaWxlIChocy0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCk7Ci0KLSAgLyogTWVyZ2UgdGhlIGZsYWdzLiAgV2hlZS4gICovCi0KLSAgaHMtPmZsYWdzIHw9IGhpLT5mbGFnczsKLQotICAvKiBNZXJnZSB0aGUgLmdvdCBlbnRyaWVzLiAgQ2FubmliYWxpemUgdGhlIG9sZCBzeW1ib2wncyBsaXN0IGluCi0gICAgIGRvaW5nIHNvLCBzaW5jZSB3ZSBkb24ndCBuZWVkIGl0IGFueW1vcmUuICAqLwotCi0gIGlmIChocy0+Z290X2VudHJpZXMgPT0gTlVMTCkKLSAgICBocy0+Z290X2VudHJpZXMgPSBoaS0+Z290X2VudHJpZXM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ2ksICpncywgKmdpbiwgKmdzaDsKLQotICAgICAgZ3NoID0gaHMtPmdvdF9lbnRyaWVzOwotICAgICAgZm9yIChnaSA9IGhpLT5nb3RfZW50cmllczsgZ2kgOyBnaSA9IGdpbikKLQl7Ci0JICBnaW4gPSBnaS0+bmV4dDsKLQkgIGZvciAoZ3MgPSBnc2g7IGdzIDsgZ3MgPSBncy0+bmV4dCkKLQkgICAgaWYgKGdpLT5nb3RvYmogPT0gZ3MtPmdvdG9iaiAmJiBnaS0+YWRkZW5kID09IGdzLT5hZGRlbmQpCi0JICAgICAgZ290byBnb3RfZm91bmQ7Ci0JICBnaS0+bmV4dCA9IGhzLT5nb3RfZW50cmllczsKLQkgIGhzLT5nb3RfZW50cmllcyA9IGdpOwotCWdvdF9mb3VuZDo7Ci0JfQotICAgIH0KLSAgaGktPmdvdF9lbnRyaWVzID0gTlVMTDsKLQotICAvKiBBbmQgc2ltaWxhciBmb3IgdGhlIHJlbG9jIGVudHJpZXMuICAqLwotCi0gIGlmIChocy0+cmVsb2NfZW50cmllcyA9PSBOVUxMKQotICAgIGhzLT5yZWxvY19lbnRyaWVzID0gaGktPnJlbG9jX2VudHJpZXM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5ICpyaSwgKnJzLCAqcmluLCAqcnNoOwotCi0gICAgICByc2ggPSBocy0+cmVsb2NfZW50cmllczsKLSAgICAgIGZvciAocmkgPSBoaS0+cmVsb2NfZW50cmllczsgcmkgOyByaSA9IHJpbikKLQl7Ci0JICByaW4gPSByaS0+bmV4dDsKLQkgIGZvciAocnMgPSByc2g7IHJzIDsgcnMgPSBycy0+bmV4dCkKLQkgICAgaWYgKHJpLT5ydHlwZSA9PSBycy0+cnR5cGUpCi0JICAgICAgewotCQlycy0+Y291bnQgKz0gcmktPmNvdW50OwotCQlnb3RvIGZvdW5kX3JlbG9jOwotCSAgICAgIH0KLQkgIHJpLT5uZXh0ID0gaHMtPnJlbG9jX2VudHJpZXM7Ci0JICBocy0+cmVsb2NfZW50cmllcyA9IHJpOwotCWZvdW5kX3JlbG9jOjsKLQl9Ci0gICAgfQotICBoaS0+cmVsb2NfZW50cmllcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIElzIGl0IHBvc3NpYmxlIHRvIG1lcmdlIHR3byBvYmplY3QgZmlsZSdzIC5nb3QgdGFibGVzPyAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzIChhLCBiKQotICAgICBiZmQgKmEsICpiOwotewotICBpbnQgdG90YWwgPSBhbHBoYV9lbGZfdGRhdGEgKGEpLT50b3RhbF9nb3RfZW50cmllczsKLSAgYmZkICpic3ViOwotCi0gIC8qIFRyaXZpYWwgcXVpY2sgZmFsbG91dCB0ZXN0LiAgKi8KLSAgaWYgKHRvdGFsICsgYWxwaGFfZWxmX3RkYXRhIChiKS0+dG90YWxfZ290X2VudHJpZXMgPD0gTUFYX0dPVF9FTlRSSUVTKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEJ5IHRoZWlyIG5hdHVyZSwgbG9jYWwgLmdvdCBlbnRyaWVzIGNhbm5vdCBiZSBtZXJnZWQuICAqLwotICBpZiAoKHRvdGFsICs9IGFscGhhX2VsZl90ZGF0YSAoYiktPm5fbG9jYWxfZ290X2VudHJpZXMpID4gTUFYX0dPVF9FTlRSSUVTKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBGYWlsaW5nIHRoZSBjb21tb24gdHJpdmlhbCBjb21wYXJpc29uLCB3ZSBtdXN0IGVmZmVjdGl2ZWx5Ci0gICAgIHBlcmZvcm0gdGhlIG1lcmdlLiAgTm90IGFjdHVhbGx5IHBlcmZvcm1pbmcgdGhlIG1lcmdlIG1lYW5zIHRoYXQKLSAgICAgd2UgZG9uJ3QgaGF2ZSB0byBzdG9yZSB1bmRvIGluZm9ybWF0aW9uIGluIGNhc2Ugd2UgZmFpbC4gICovCi0gIGZvciAoYnN1YiA9IGI7IGJzdWIgOyBic3ViID0gYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+aW5fZ290X2xpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hlcyA9IGFscGhhX2VsZl9zeW1faGFzaGVzIChic3ViKTsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYnN1YiktPnN5bXRhYl9oZHI7Ci0gICAgICBpbnQgaSwgbjsKLQotICAgICAgbiA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzeW10YWJfaGRyLT5zaF9lbnRzaXplIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCi0JewotCSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmFlLCAqYmU7Ci0JICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IGhhc2hlc1tpXTsKLQkgIHdoaWxlIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaC0+cm9vdC5yb290LnUuaS5saW5rOwotCi0JICBmb3IgKGJlID0gaC0+Z290X2VudHJpZXM7IGJlIDsgYmUgPSBiZS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChiZS0+dXNlX2NvdW50ID09IDApCi0JICAgICAgICBjb250aW51ZTsKLQkgICAgICBpZiAoYmUtPmdvdG9iaiAhPSBiKQotCSAgICAgICAgY29udGludWU7Ci0KLQkgICAgICBmb3IgKGFlID0gaC0+Z290X2VudHJpZXM7IGFlIDsgYWUgPSBhZS0+bmV4dCkKLQkgICAgICAgIGlmIChhZS0+Z290b2JqID09IGEgJiYgYWUtPmFkZGVuZCA9PSBiZS0+YWRkZW5kKQotCQkgIGdvdG8gZ2xvYmFsX2ZvdW5kOwotCi0JICAgICAgaWYgKCsrdG90YWwgPiBNQVhfR09UX0VOVFJJRVMpCi0JICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGdsb2JhbF9mb3VuZDo7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBY3R1YWxseSBtZXJnZSB0d28gLmdvdCB0YWJsZXMuICAqLwotCi1zdGF0aWMgdm9pZAotZWxmNjRfYWxwaGFfbWVyZ2VfZ290cyAoYSwgYikKLSAgICAgYmZkICphLCAqYjsKLXsKLSAgaW50IHRvdGFsID0gYWxwaGFfZWxmX3RkYXRhIChhKS0+dG90YWxfZ290X2VudHJpZXM7Ci0gIGJmZCAqYnN1YjsKLQotICAvKiBSZW1lbWJlciBsb2NhbCBleHBhbnNpb24uICAqLwotICB7Ci0gICAgaW50IGUgPSBhbHBoYV9lbGZfdGRhdGEgKGIpLT5uX2xvY2FsX2dvdF9lbnRyaWVzOwotICAgIHRvdGFsICs9IGU7Ci0gICAgYWxwaGFfZWxmX3RkYXRhIChhKS0+bl9sb2NhbF9nb3RfZW50cmllcyArPSBlOwotICB9Ci0KLSAgZm9yIChic3ViID0gYjsgYnN1YiA7IGJzdWIgPSBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5pbl9nb3RfbGlua19uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqbG9jYWxfZ290X2VudHJpZXM7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hlczsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICAgICAgaW50IGksIG47Ci0KLSAgICAgIC8qIExldCB0aGUgbG9jYWwgLmdvdCBlbnRyaWVzIGtub3cgdGhleSBhcmUgcGFydCBvZiBhIG5ldyBzdWJzZWdtZW50LiAgKi8KLSAgICAgIGxvY2FsX2dvdF9lbnRyaWVzID0gYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+bG9jYWxfZ290X2VudHJpZXM7Ci0gICAgICBpZiAobG9jYWxfZ290X2VudHJpZXMpCi0gICAgICAgIHsKLQkgIG4gPSBlbGZfdGRhdGEgKGJzdWIpLT5zeW10YWJfaGRyLnNoX2luZm87Ci0JICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmVudDsKLQkgICAgICBmb3IgKGVudCA9IGxvY2FsX2dvdF9lbnRyaWVzW2ldOyBlbnQ7IGVudCA9IGVudC0+bmV4dCkKLQkgICAgICAgIGVudC0+Z290b2JqID0gYTsKLQkgICAgfQotICAgICAgICB9Ci0KLSAgICAgIC8qIE1lcmdlIHRoZSBnbG9iYWwgLmdvdCBlbnRyaWVzLiAgKi8KLSAgICAgIGhhc2hlcyA9IGFscGhhX2VsZl9zeW1faGFzaGVzIChic3ViKTsKLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChic3ViKS0+c3ltdGFiX2hkcjsKLQotICAgICAgbiA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzeW10YWJfaGRyLT5zaF9lbnRzaXplIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCi0gICAgICAgIHsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICphZSwgKmJlLCAqKnBiZSwgKipzdGFydDsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gaGFzaGVzW2ldOwotCSAgd2hpbGUgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkgICAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloLT5yb290LnJvb3QudS5pLmxpbms7Ci0KLQkgIHN0YXJ0ID0gJmgtPmdvdF9lbnRyaWVzOwotCSAgZm9yIChwYmUgPSBzdGFydCwgYmUgPSAqc3RhcnQ7IGJlIDsgcGJlID0gJmJlLT5uZXh0LCBiZSA9IGJlLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKGJlLT51c2VfY291bnQgPT0gMCkKLQkgICAgICAgIHsKLQkJICAqcGJlID0gYmUtPm5leHQ7Ci0JCSAgY29udGludWU7Ci0JICAgICAgICB9Ci0JICAgICAgaWYgKGJlLT5nb3RvYmogIT0gYikKLQkgICAgICAgIGNvbnRpbnVlOwotCi0JICAgICAgZm9yIChhZSA9ICpzdGFydDsgYWUgOyBhZSA9IGFlLT5uZXh0KQotCSAgICAgICAgaWYgKGFlLT5nb3RvYmogPT0gYSAmJiBhZS0+YWRkZW5kID09IGJlLT5hZGRlbmQpCi0JCSAgewotCQkgICAgYWUtPmZsYWdzIHw9IGJlLT5mbGFnczsKLQkJICAgIGFlLT51c2VfY291bnQgKz0gYmUtPnVzZV9jb3VudDsKLQkJICAgICpwYmUgPSBiZS0+bmV4dDsKLQkJICAgIGdvdG8gZ2xvYmFsX2ZvdW5kOwotCQkgIH0KLQkgICAgICBiZS0+Z290b2JqID0gYTsKLQkgICAgICB0b3RhbCArPSAxOwotCi0JICAgIGdsb2JhbF9mb3VuZDo7Ci0JICAgIH0KLSAgICAgICAgfQotCi0gICAgICBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5nb3RvYmogPSBhOwotICAgIH0KLSAgYWxwaGFfZWxmX3RkYXRhIChhKS0+dG90YWxfZ290X2VudHJpZXMgPSB0b3RhbDsKLQotICAvKiBNZXJnZSB0aGUgdHdvIGluX2dvdCBjaGFpbnMuICAqLwotICB7Ci0gICAgYmZkICpuZXh0OwotCi0gICAgYnN1YiA9IGE7Ci0gICAgd2hpbGUgKChuZXh0ID0gYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+aW5fZ290X2xpbmtfbmV4dCkgIT0gTlVMTCkKLSAgICAgIGJzdWIgPSBuZXh0OwotCi0gICAgYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+aW5fZ290X2xpbmtfbmV4dCA9IGI7Ci0gIH0KLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBvZmZzZXRzIGZvciB0aGUgZ290IGVudHJpZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0c19mb3Jfc3ltYm9sIChoLCBhcmcpCi0gICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgYXJnOwotewotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCi0gIGZvciAoZ290ZW50ID0gaC0+Z290X2VudHJpZXM7IGdvdGVudDsgZ290ZW50ID0gZ290ZW50LT5uZXh0KQotICAgIGlmIChnb3RlbnQtPnVzZV9jb3VudCA+IDApCi0gICAgICB7Ci0JYmZkX3NpemVfdHlwZSAqcGxnZQotCSAgPSAmYWxwaGFfZWxmX3RkYXRhIChnb3RlbnQtPmdvdG9iaiktPmdvdC0+X3Jhd19zaXplOwotCi0JZ290ZW50LT5nb3Rfb2Zmc2V0ID0gKnBsZ2U7Ci0JKnBsZ2UgKz0gODsKLSAgICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHMgKGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmksICpnb3RfbGlzdCA9IGFscGhhX2VsZl9oYXNoX3RhYmxlKGluZm8pLT5nb3RfbGlzdDsKLQotICAvKiBGaXJzdCwgemVybyBvdXQgdGhlIC5nb3Qgc2l6ZXMsIGFzIHdlIG1heSBiZSByZWNhbGN1bGF0aW5nIHRoZQotICAgICAuZ290IGFmdGVyIG9wdGltaXppbmcgaXQuICAqLwotICBmb3IgKGkgPSBnb3RfbGlzdDsgaSA7IGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQpCi0gICAgYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3QtPl9yYXdfc2l6ZSA9IDA7Ci0KLSAgLyogTmV4dCwgZmlsbCBpbiB0aGUgb2Zmc2V0cyBmb3IgYWxsIHRoZSBnbG9iYWwgZW50cmllcy4gICovCi0gIGFscGhhX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQllbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzX2Zvcl9zeW1ib2wsCi0JCQkJTlVMTCk7Ci0KLSAgLyogRmluYWxseSwgZmlsbCBpbiB0aGUgb2Zmc2V0cyBmb3IgdGhlIGxvY2FsIGVudHJpZXMuICAqLwotICBmb3IgKGkgPSBnb3RfbGlzdDsgaSA7IGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBnb3Rfb2Zmc2V0ID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3QtPl9yYXdfc2l6ZTsKLSAgICAgIGJmZCAqajsKLQotICAgICAgZm9yIChqID0gaTsgaiA7IGogPSBhbHBoYV9lbGZfdGRhdGEoaiktPmluX2dvdF9saW5rX25leHQpCi0JewotCSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKipsb2NhbF9nb3RfZW50cmllcywgKmdvdGVudDsKLQkgIGludCBrLCBuOwotCi0JICBsb2NhbF9nb3RfZW50cmllcyA9IGFscGhhX2VsZl90ZGF0YShqKS0+bG9jYWxfZ290X2VudHJpZXM7Ci0JICBpZiAoIWxvY2FsX2dvdF9lbnRyaWVzKQotCSAgICBjb250aW51ZTsKLQotCSAgZm9yIChrID0gMCwgbiA9IGVsZl90ZGF0YShqKS0+c3ltdGFiX2hkci5zaF9pbmZvOyBrIDwgbjsgKytrKQotCSAgICBmb3IgKGdvdGVudCA9IGxvY2FsX2dvdF9lbnRyaWVzW2tdOyBnb3RlbnQ7IGdvdGVudCA9IGdvdGVudC0+bmV4dCkKLQkgICAgICBpZiAoZ290ZW50LT51c2VfY291bnQgPiAwKQotCSAgICAgICAgewotCQkgIGdvdGVudC0+Z290X29mZnNldCA9IGdvdF9vZmZzZXQ7Ci0JCSAgZ290X29mZnNldCArPSA4OwotCSAgICAgICAgfQotCX0KLQotICAgICAgYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3QtPl9yYXdfc2l6ZSA9IGdvdF9vZmZzZXQ7Ci0gICAgICBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdC0+X2Nvb2tlZF9zaXplID0gZ290X29mZnNldDsKLSAgICB9Ci19Ci0KLS8qIENvbnN0cnVjdHMgdGhlIGdvdHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqaSwgKmdvdF9saXN0LCAqY3VyX2dvdF9vYmo7Ci0gIGludCBzb21ldGhpbmdfY2hhbmdlZCA9IDA7Ci0KLSAgZ290X2xpc3QgPSBhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9saXN0OwotCi0gIC8qIE9uIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gsIHByZXRlbmQgd2UgaGF2ZSBhbiBleGlzdGluZyBnb3QgbGlzdAotICAgICBjb25zaXN0aW5nIG9mIGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICBpZiAoZ290X2xpc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBpbmZvLT5pbnB1dF9iZmRzOyBpIDsgaSA9IGktPmxpbmtfbmV4dCkKLQl7Ci0JICBiZmQgKnRoaXNfZ290ID0gYWxwaGFfZWxmX3RkYXRhIChpKS0+Z290b2JqOwotCSAgaWYgKHRoaXNfZ290ID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBXZSBhcmUgYXNzdW1pbmcgbm8gbWVyZ2luZyBoYXMgeWV0IG9jdXJyZWQuICAqLwotCSAgQkZEX0FTU0VSVCAodGhpc19nb3QgPT0gaSk7Ci0KLSAgICAgICAgICBpZiAoYWxwaGFfZWxmX3RkYXRhICh0aGlzX2dvdCktPnRvdGFsX2dvdF9lbnRyaWVzID4gTUFYX0dPVF9FTlRSSUVTKQotCSAgICB7Ci0JICAgICAgLyogWWlrZXMhIEEgc2luZ2xlIG9iamVjdCBmaWxlIGhhcyB0b28gbWFueSBlbnRyaWVzLiAgKi8KLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgIChfKCIlczogLmdvdCBzdWJzZWdtZW50IGV4Y2VlZHMgNjRLIChzaXplICVkKSIpLAotCSAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGkpLAotCSAgICAgICAgIGFscGhhX2VsZl90ZGF0YSAodGhpc19nb3QpLT50b3RhbF9nb3RfZW50cmllcyAqIDgpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoZ290X2xpc3QgPT0gTlVMTCkKLQkgICAgZ290X2xpc3QgPSB0aGlzX2dvdDsKLQkgIGVsc2UKLQkgICAgYWxwaGFfZWxmX3RkYXRhKGN1cl9nb3Rfb2JqKS0+Z290X2xpbmtfbmV4dCA9IHRoaXNfZ290OwotCSAgY3VyX2dvdF9vYmogPSB0aGlzX2dvdDsKLQl9Ci0KLSAgICAgIC8qIFN0cmFuZ2UgZGVnZW5lcmF0ZSBjYXNlIG9mIG5vIGdvdCByZWZlcmVuY2VzLiAgKi8KLSAgICAgIGlmIChnb3RfbGlzdCA9PSBOVUxMKQotCXJldHVybiB0cnVlOwotCi0gICAgICBhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9saXN0ID0gZ290X2xpc3Q7Ci0KLSAgICAgIC8qIEZvcmNlIGdvdCBvZmZzZXRzIHRvIGJlIHJlY2FsY3VsYXRlZC4gICovCi0gICAgICBzb21ldGhpbmdfY2hhbmdlZCA9IDE7Ci0gICAgfQotCi0gIGN1cl9nb3Rfb2JqID0gZ290X2xpc3Q7Ci0gIGkgPSBhbHBoYV9lbGZfdGRhdGEoY3VyX2dvdF9vYmopLT5nb3RfbGlua19uZXh0OwotICB3aGlsZSAoaSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChlbGY2NF9hbHBoYV9jYW5fbWVyZ2VfZ290cyAoY3VyX2dvdF9vYmosIGkpKQotCXsKLQkgIGVsZjY0X2FscGhhX21lcmdlX2dvdHMgKGN1cl9nb3Rfb2JqLCBpKTsKLQkgIGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQ7Ci0JICBhbHBoYV9lbGZfdGRhdGEoY3VyX2dvdF9vYmopLT5nb3RfbGlua19uZXh0ID0gaTsKLQkgIHNvbWV0aGluZ19jaGFuZ2VkID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY3VyX2dvdF9vYmogPSBpOwotCSAgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dDsKLQl9Ci0gICAgfQotCi0gIC8qIE9uY2UgdGhlIGdvdHMgaGF2ZSBiZWVuIG1lcmdlZCwgZmlsbCBpbiB0aGUgZ290IG9mZnNldHMgZm9yCi0gICAgIGV2ZXJ5dGhpbmcgdGhlcmVpbi4gICovCi0gIGlmICgxIHx8IHNvbWV0aGluZ19jaGFuZ2VkKQotICAgIGVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHMgKGluZm8pOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfYWx3YXlzX3NpemVfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqaTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpcnN0LCB0YWtlIGNhcmUgb2YgdGhlIGluZGlyZWN0IHN5bWJvbHMgY3JlYXRlZCBieSB2ZXJzaW9uaW5nLiAgKi8KLSAgYWxwaGFfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCWVsZjY0X2FscGhhX21lcmdlX2luZF9zeW1ib2xzLAotCQkJCU5VTEwpOwotCi0gIGlmICghZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYWxsIG9mIHRoZSAuZ290IHN1YnNlY3Rpb25zLiAgKi8KLSAgaSA9IGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Z290X2xpc3Q7Ci0gIGZvciAoIDsgaSA7IGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnMgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdDsKLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPiAwKQotCXsKLQkgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGksIHMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdvcmsgb3V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyByZWxvY2F0aW9uIGVudHJpZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMgKGgsIGluZm8pCi0gICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgLyogSWYgdGhlIHN5bWJvbCB3YXMgZGVmaW5lZCBhcyBhIGNvbW1vbiBzeW1ib2wgaW4gYSByZWd1bGFyIG9iamVjdAotICAgICBmaWxlLCBhbmQgdGhlcmUgd2FzIG5vIGRlZmluaXRpb24gaW4gYW55IGR5bmFtaWMgb2JqZWN0LCB0aGVuIHRoZQotICAgICBsaW5rZXIgd2lsbCBoYXZlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlIHN5bWJvbCBpbiBhIGNvbW1vbgotICAgICBzZWN0aW9uIGJ1dCB0aGUgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUiBmbGFnIHdpbGwgbm90IGhhdmUgYmVlbgotICAgICBzZXQuICBUaGlzIGlzIGRvbmUgZm9yIGR5bmFtaWMgc3ltYm9scyBpbgotICAgICBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGJ1dCB0aGlzIGlzIG5vdCBkb25lIGZvciBub24tZHluYW1pYwotICAgICBzeW1ib2xzLCBzb21laG93LiAgKi8KLSAgaWYgKCgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzCi0gICAgICAgJiAoRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUgotCSAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JICB8IEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpKQotICAgICAgID09IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpCi0gICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiAhKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSkKLSAgICB7Ci0gICAgICBoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIHN5bWJvbCBpcyBkeW5hbWljLCB3ZSdsbCBuZWVkIGFsbCB0aGUgcmVsb2NhdGlvbnMgaW4gdGhlaXIKLSAgICAgbmF0dXJhbCBmb3JtLiAgSWYgdGhpcyBpcyBhIHNoYXJlZCBvYmplY3QsIGFuZCBpdCBoYXMgYmVlbiBmb3JjZWQKLSAgICAgbG9jYWwsIHdlJ2xsIG5lZWQgdGhlIHNhbWUgbnVtYmVyIG9mIFJFTEFUSVZFIHJlbG9jYXRpb25zLiAgKi8KLQotICBpZiAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKCZoLT5yb290LCBpbmZvKSB8fCBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqcmVsZW50OwotICAgICAgYmZkICpkeW5vYmo7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotICAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBmb3IgKHJlbGVudCA9IGgtPnJlbG9jX2VudHJpZXM7IHJlbGVudDsgcmVsZW50ID0gcmVsZW50LT5uZXh0KQotCWlmIChyZWxlbnQtPnJ0eXBlID09IFJfQUxQSEFfUkVGTE9ORwotCSAgICB8fCByZWxlbnQtPnJ0eXBlID09IFJfQUxQSEFfUkVGUVVBRCkKLQkgIHsKLQkgICAgcmVsZW50LT5zcmVsLT5fcmF3X3NpemUgKz0KLQkgICAgICBzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiByZWxlbnQtPmNvdW50OwotCSAgfQotCi0gICAgICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOwotICAgICAgY291bnQgPSAwOwotCi0gICAgICBmb3IgKGdvdGVudCA9IGgtPmdvdF9lbnRyaWVzOyBnb3RlbnQgOyBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCi0JY291bnQrKzsKLQotICAgICAgLyogSWYgd2UgYXJlIHVzaW5nIGEgLnBsdCBlbnRyeSwgc3VidHJhY3Qgb25lLCBhcyB0aGUgZmlyc3QKLQkgcmVmZXJlbmNlIHVzZXMgYSAucmVsYS5wbHQgZW50cnkgaW5zdGVhZC4gICovCi0gICAgICBpZiAoaC0+cm9vdC5wbHQub2Zmc2V0ICE9IE1JTlVTX09ORSkKLQljb3VudC0tOwotCi0gICAgICBpZiAoY291bnQgPiAwKQotCXsKLQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotCSAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiBjb3VudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHJlbHRleHQ7Ci0gIGJvb2xlYW4gcmVscGx0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotCi0gICAgICAvKiBOb3cgdGhhdCB3ZSd2ZSBzZWVuIGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMsIHdlIGNhbiBkZWNpZGUgd2hpY2gKLQkgc3ltYm9scyBuZWVkIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzIGFuZCB3aGljaCBkb24ndC4gIFdlJ3ZlCi0JIGNvbGxlY3RlZCBpbmZvcm1hdGlvbiBpbiBjaGVja19yZWxvY3MgdGhhdCB3ZSBjYW4gbm93IGFwcGx5IHRvCi0JIHNpemUgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBzZWN0aW9ucy4gICovCi0gICAgICBhbHBoYV9lbGZfbGlua19oYXNoX3RyYXZlcnNlIChhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgIGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzLAotCQkJCSAgICBpbmZvKTsKLQotICAgICAgLyogV2hlbiBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLCBlYWNoIGxvY2FsIC5nb3QgZW50cnkgbmVlZHMgYQotCSBSRUxBVElWRSByZWxvYy4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkKQotCXsKLQkgIGJmZCAqaTsKLQkgIGFzZWN0aW9uICpzcmVsOwotCSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLQotCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0KLQkgIGZvciAoaSA9IGFscGhhX2VsZl9oYXNoX3RhYmxlKGluZm8pLT5nb3RfbGlzdCwgY291bnQgPSAwOwotCSAgICAgICBpICE9IE5VTEw7Ci0JICAgICAgIGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQpCi0JICAgIGNvdW50ICs9IGFscGhhX2VsZl90ZGF0YShpKS0+bl9sb2NhbF9nb3RfZW50cmllczsKLQotCSAgc3JlbC0+X3Jhd19zaXplICs9IGNvdW50ICogc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCX0KLSAgICB9Ci0gIC8qIGVsc2Ugd2UncmUgbm90IGR5bmFtaWMgYW5kIGJ5IGRlZmluaXRpb24gd2UgZG9uJ3QgbmVlZCBzdWNoIHRoaW5ncy4gICovCi0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIHJlbHBsdCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoIShzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUgb3V0cHV0IGZpbGUuCi0JIFRoaXMgaXMgdG8gaGFuZGxlIC5yZWxhLmJzcyBhbmQgLnJlbGEucGx0LiAgV2UgbXVzdCBjcmVhdGUgaXQKLQkgaW4gY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgaXQgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZQotCSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zLiAgVGhlCi0JIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZAotCSBpdCBpcyB0aGF0IGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0bwotCSBnbyBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgc3RyaXAgPSAocy0+X3Jhd19zaXplID09IDApOwotCi0JICBpZiAoIXN0cmlwKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4gICovCi0JICAgICAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgICAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA1KTsKLQkgICAgICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQlyZWx0ZXh0ID0gdHJ1ZTsKLQotCSAgICAgIGlmIChzdHJjbXAobmFtZSwgIi5yZWxhLnBsdCIpID09IDApCi0JCXJlbHBsdCA9IHRydWU7Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBkeW5hbWljIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQlfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotCSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyhkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChyZWxwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQotCSAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCi0JCQkJCSAgICBzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIEFscGhhIEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0gIGFzZWN0aW9uICpzZWMsICpzZ290LCAqc3JlbCwgKnNyZWxnb3Q7Ci0gIGJmZCAqZHlub2JqLCAqZ290b2JqOwotICBiZmRfdm1hIGdwOwotCi0gIHNyZWxnb3QgPSBzcmVsID0gTlVMTDsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBpZiAoZHlub2JqKQotICAgIHsKLSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgfQotCi0gIC8qIEZpbmQgdGhlIGdwIHZhbHVlIGZvciB0aGlzIGlucHV0IGJmZC4gICovCi0gIHNnb3QgPSBOVUxMOwotICBncCA9IDA7Ci0gIGdvdG9iaiA9IGFscGhhX2VsZl90ZGF0YSAoaW5wdXRfYmZkKS0+Z290b2JqOwotICBpZiAoZ290b2JqKQotICAgIHsKLSAgICAgIHNnb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGdvdG9iaiktPmdvdDsKLSAgICAgIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGdvdG9iaik7Ci0gICAgICBpZiAoZ3AgPT0gMCkKLQl7Ci0JICBncCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkrIDB4ODAwMCk7Ci0JICBfYmZkX3NldF9ncF92YWx1ZSAoZ290b2JqLCBncCk7Ci0JfQotICAgIH0KLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEY2NF9SX1RZUEUocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfQUxQSEFfbWF4KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gZWxmNjRfYWxwaGFfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0ocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0KLQkgIC8qIFRoZSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIEdQRElTUCBhbmQgTElUVVNFIGlzIAotCSAgICAgaW1tYXRlcmlhbC4gIE9ubHkgdGhlIGFkZGVuZCBpcyBzaWduaWZpY2FudC4gICovCi0JICBpZiAocl90eXBlID09IFJfQUxQSEFfR1BESVNQIHx8IHJfdHlwZSA9PSBSX0FMUEhBX0xJVFVTRSkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gYWxwaGFfZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotCSAgd2hpbGUgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWgtPnJvb3Qucm9vdC51LmkubGluazsKLQotCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCi0jaWYgcnRoX25vdGRlZgotCSAgICAgIGlmICgocl90eXBlID09IFJfQUxQSEFfTElURVJBTAotCQkgICAmJiBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICYmICghaW5mby0+c2hhcmVkCi0JCSAgICAgICB8fCAhaW5mby0+c3ltYm9saWMKLQkJICAgICAgIHx8ICEoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoIWluZm8tPnN5bWJvbGljCi0JCQkgIHx8ICEoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQkJICAgICAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKQotCQkgICAgICAmJiAocl90eXBlID09IFJfQUxQSEFfUkVGTE9ORwotCQkJICB8fCByX3R5cGUgPT0gUl9BTFBIQV9SRUZRVUFECi0JCQkgIHx8IHJfdHlwZSA9PSBSX0FMUEhBX0xJVEVSQUwpKSkKLQkJewotCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uIHZhbHVlLgotCQkgICAgIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUgb2JzY3VyZSBjYXNlcwotCQkgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotI2Vsc2UKLQkgICAgICAvKiBGSVhNRTogQXJlIG5vdCB0aGVzZSBvYnNjdXJlIGNhc2VzIHNpbXBseSBidWdzPyAgTGV0J3MKLQkJIGdldCBzb21ldGhpbmcgd29ya2luZyBhbmQgY29tZSBiYWNrIHRvIHRoaXMuICAqLwotCSAgICAgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCXJlbG9jYXRpb24gPSAwOwotI2VuZGlmIC8qIHJ0aF9ub3RkZWYgKi8KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWxvY2F0aW9uID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQotCQkJCSsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfQUxQSEFfR1BESVNQOgotCSAgewotCSAgICBiZmRfYnl0ZSAqcF9sZGFoLCAqcF9sZGE7Ci0KLQkgICAgQkZEX0FTU0VSVChncCAhPSAwKTsKLQotCSAgICByZWxvY2F0aW9uID0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICsgcmVsLT5yX29mZnNldCk7Ci0KLQkgICAgcF9sZGFoID0gY29udGVudHMgKyByZWwtPnJfb2Zmc2V0IC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCSAgICBwX2xkYSA9IHBfbGRhaCArIHJlbC0+cl9hZGRlbmQ7Ci0KLQkgICAgciA9IGVsZjY0X2FscGhhX2RvX3JlbG9jX2dwZGlzcCAoaW5wdXRfYmZkLCBncCAtIHJlbG9jYXRpb24sCi0JCQkJCSAgICAgcF9sZGFoLCBwX2xkYSk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgUl9BTFBIQV9PUF9QVVNIOgotCWNhc2UgUl9BTFBIQV9PUF9TVE9SRToKLQljYXNlIFJfQUxQSEFfT1BfUFNVQjoKLQljYXNlIFJfQUxQSEFfT1BfUFJTSElGVDoKLQkgIC8qIFdlIGhhdGUgdGhlc2Ugc2lsbHkgYmVhc3RzLiAgKi8KLQkgIGFib3J0KCk7Ci0KLQljYXNlIFJfQUxQSEFfTElURVJBTDoKLQkgIHsKLQkgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKLQkgICAgYm9vbGVhbiBkeW5hbWljX3N5bWJvbDsKLQotCSAgICBCRkRfQVNTRVJUKHNnb3QgIT0gTlVMTCk7Ci0JICAgIEJGRF9BU1NFUlQoZ3AgIT0gMCk7Ci0KLQkgICAgaWYgKGggIT0gTlVMTCkKLQkgICAgICB7Ci0JCWdvdGVudCA9IGgtPmdvdF9lbnRyaWVzOwotCQlkeW5hbWljX3N5bWJvbCA9IGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wICgmaC0+cm9vdCwgaW5mbyk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlnb3RlbnQgPSAoYWxwaGFfZWxmX3RkYXRhKGlucHV0X2JmZCktPgotCQkJICBsb2NhbF9nb3RfZW50cmllc1tyX3N5bW5keF0pOwotCQlkeW5hbWljX3N5bWJvbCA9IGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBCRkRfQVNTRVJUKGdvdGVudCAhPSBOVUxMKTsKLQotCSAgICB3aGlsZSAoZ290ZW50LT5nb3RvYmogIT0gZ290b2JqIHx8IGdvdGVudC0+YWRkZW5kICE9IGFkZGVuZCkKLQkgICAgICBnb3RlbnQgPSBnb3RlbnQtPm5leHQ7Ci0KLQkgICAgQkZEX0FTU0VSVChnb3RlbnQtPnVzZV9jb3VudCA+PSAxKTsKLQotCSAgICAvKiBJbml0aWFsaXplIHRoZSAuZ290IGVudHJ5J3MgdmFsdWUuICAqLwotCSAgICBpZiAoIShnb3RlbnQtPmZsYWdzICYgQUxQSEFfRUxGX0dPVF9FTlRSWV9SRUxPQ1NfRE9ORSkpCi0JICAgICAgewotCQliZmRfcHV0XzY0IChvdXRwdXRfYmZkLCByZWxvY2F0aW9uK2FkZGVuZCwKLQkJCSAgICBzZ290LT5jb250ZW50cyArIGdvdGVudC0+Z290X29mZnNldCk7Ci0KLQkJLyogSWYgdGhlIHN5bWJvbCBoYXMgYmVlbiBmb3JjZWQgbG9jYWwsIG91dHB1dCBhCi0JCSAgIFJFTEFUSVZFIHJlbG9jLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBoYW5kbGVkIGluCi0JCSAgIGZpbmlzaF9keW5hbWljX3N5bWJvbC4gICovCi0JCWlmIChpbmZvLT5zaGFyZWQgJiYgIWR5bmFtaWNfc3ltYm9sKQotCQkgIHsKLQkJICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQotCQkgICAgQkZEX0FTU0VSVChzcmVsZ290ICE9IE5VTEwpOwotCi0JCSAgICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkgICAgICAgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCQkgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTygwLCBSX0FMUEhBX1JFTEFUSVZFKTsKLQkJICAgIG91dHJlbC5yX2FkZGVuZCA9IDA7Ci0KLQkJICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAgICAgICAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgICAgICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJICAgICAgICsgc3JlbGdvdC0+cmVsb2NfY291bnQrKyk7Ci0JCSAgICBCRkRfQVNTRVJUIChzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkKLQkJCQkqIHNyZWxnb3QtPnJlbG9jX2NvdW50Ci0JCQkJPD0gc3JlbGdvdC0+X2Nvb2tlZF9zaXplKTsKLQkJICB9Ci0KLQkJZ290ZW50LT5mbGFncyB8PSBBTFBIQV9FTEZfR09UX0VOVFJZX1JFTE9DU19ET05FOwotCSAgICAgIH0KLQotCSAgICAvKiBGaWd1cmUgdGhlIGdwcmVsIHJlbG9jYXRpb24uICAqLwotCSAgICBhZGRlbmQgPSAwOwotCSAgICByZWxvY2F0aW9uID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQkgICAgcmVsb2NhdGlvbiAtPSBncDsKLQkgIH0KLQkgIC8qIG92ZXJmbG93IGhhbmRsZWQgYnkgX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlICovCi0JICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQljYXNlIFJfQUxQSEFfR1BSRUwzMjoKLQljYXNlIFJfQUxQSEFfR1BSRUxMT1c6Ci0JICBCRkRfQVNTRVJUKGdwICE9IDApOwotCSAgcmVsb2NhdGlvbiAtPSBncDsKLQkgIGdvdG8gZGVmYXVsdF9yZWxvYzsKLQotCWNhc2UgUl9BTFBIQV9HUFJFTEhJR0g6Ci0JICBCRkRfQVNTRVJUKGdwICE9IDApOwotCSAgcmVsb2NhdGlvbiAtPSBncDsKLQkgIHJlbG9jYXRpb24gKz0gYWRkZW5kOwotCSAgYWRkZW5kID0gMDsKLQkgIHJlbG9jYXRpb24gPSAoKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PiAxNikKLQkJCSsgKChyZWxvY2F0aW9uID4+IDE1KSAmIDEpKTsKLQkgIGdvdG8gZGVmYXVsdF9yZWxvYzsKLQotCWNhc2UgUl9BTFBIQV9CUkFERFI6Ci0JY2FzZSBSX0FMUEhBX0hJTlQ6Ci0JICAvKiBUaGUgcmVndWxhciBQQy1yZWxhdGl2ZSBzdHVmZiBtZWFzdXJlcyBmcm9tIHRoZSBzdGFydCBvZgotCSAgICAgdGhlIGluc3RydWN0aW9uIHJhdGhlciB0aGFuIHRoZSBlbmQuICAqLwotCSAgYWRkZW5kIC09IDQ7Ci0JICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQljYXNlIFJfQUxQSEFfUkVGTE9ORzoKLQljYXNlIFJfQUxQSEFfUkVGUVVBRDoKLQkgIHsKLQkgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCSAgICBib29sZWFuIHNraXA7Ci0KLQkgICAgLyogQ2FyZWZ1bCBoZXJlIHRvIHJlbWVtYmVyIFJFTEFUSVZFIHJlbG9jYXRpb25zIGZvciBnbG9iYWwKLQkgICAgICAgdmFyaWFibGVzIGZvciBzeW1ib2xpYyBzaGFyZWQgb2JqZWN0cy4gICovCi0KLQkgICAgaWYgKGggJiYgYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKCZoLT5yb290LCBpbmZvKSkKLQkgICAgICB7Ci0JCUJGRF9BU1NFUlQoaC0+cm9vdC5keW5pbmR4ICE9IC0xKTsKLQkJb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyhoLT5yb290LmR5bmluZHgsIHJfdHlwZSk7Ci0JCW91dHJlbC5yX2FkZGVuZCA9IGFkZGVuZDsKLQkJYWRkZW5kID0gMCwgcmVsb2NhdGlvbiA9IDA7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgICAgewotCQlvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPKDAsIFJfQUxQSEFfUkVMQVRJVkUpOwotCQlvdXRyZWwucl9hZGRlbmQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIGdvdG8gZGVmYXVsdF9yZWxvYzsKLQotCSAgICBpZiAoIXNyZWwpCi0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lOwotCi0JCW5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJKGlucHV0X2JmZCwgZWxmX2VsZmhlYWRlcihpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAotCQkJIGVsZl9zZWN0aW9uX2RhdGEoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQlCRkRfQVNTRVJUKG5hbWUgIT0gTlVMTCk7Ci0KLQkJc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQlCRkRfQVNTRVJUKHNyZWwgIT0gTlVMTCk7Ci0JICAgICAgfQotCi0JICAgIHNraXAgPSBmYWxzZTsKLQotCSAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCSAgICAgIG91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWJmZF92bWEgb2ZmOwotCi0JCW9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJICAgICAgIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQlpbnB1dF9zZWN0aW9uLAotCQkJJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCi0JCQlyZWwtPnJfb2Zmc2V0KSk7Ci0JCWlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQkgIHNraXAgPSB0cnVlOwotCQlvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JICAgICAgfQotCi0JICAgIGlmICghIHNraXApCi0JICAgICAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICBlbHNlCi0JICAgICAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQotCSAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCSAgICAgICAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKLQkJCQkJc3JlbC0+Y29udGVudHMpCi0JCQkJICAgICAgICsgc3JlbC0+cmVsb2NfY291bnQrKyk7Ci0JICAgIEJGRF9BU1NFUlQgKHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSAqIHNyZWwtPnJlbG9jX2NvdW50Ci0JCQk8PSBzcmVsLT5fY29va2VkX3NpemUpOwotCSAgfQotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JZGVmYXVsdDoKLQlkZWZhdWx0X3JlbG9jOgotCSAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHJlbG9jYXRpb24sCi0JCQkJCWFkZGVuZCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN3aXRjaCAocikKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWlmICgqbmFtZSA9PSAnXDAnKQotCQkgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgICAgfQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IE1JTlVTX09ORSkKLSAgICB7Ci0gICAgICAvKiBGaWxsIGluIHRoZSAucGx0IGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gICovCi0gICAgICBhc2VjdGlvbiAqc3BsdCwgKnNnb3QsICpzcmVsOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotICAgICAgYmZkX3ZtYSBnb3RfYWRkciwgcGx0X2FkZHI7Ci0gICAgICBiZmRfdm1hIHBsdF9pbmRleDsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICAvKiBUaGUgZmlyc3QgLmdvdCBlbnRyeSB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlIC5wbHQgd2l0aCB0aGUKLQkgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IGZ1bmN0aW9uLiAgKi8KLSAgICAgIGdvdGVudCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaCktPmdvdF9lbnRyaWVzOwotICAgICAgQkZEX0FTU0VSVCAoZ290ZW50ICYmIGdvdGVudC0+YWRkZW5kID09IDApOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNnb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGdvdGVudC0+Z290b2JqKS0+Z290OwotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQotICAgICAgZ290X2FkZHIgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLSAgICAgIHBsdF9hZGRyID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICArIGgtPnBsdC5vZmZzZXQpOwotCi0gICAgICBwbHRfaW5kZXggPSAoaC0+cGx0Lm9mZnNldCAtIFBMVF9IRUFERVJfU0laRSkgLyBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIHsKLQl1bnNpZ25lZCBpbnNuMSwgaW5zbjIsIGluc24zOwotCi0JaW5zbjEgPSBQTFRfRU5UUllfV09SRDEgfCAoKC0oaC0+cGx0Lm9mZnNldCArIDQpID4+IDIpICYgMHgxZmZmZmYpOwotCWluc24yID0gUExUX0VOVFJZX1dPUkQyOwotCWluc24zID0gUExUX0VOVFJZX1dPUkQzOwotCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbjEsIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCk7Ci0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbjIsIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDQpOwotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24zLCBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA4KTsKLSAgICAgIH0KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIG91dHJlbC5yX29mZnNldCA9IGdvdF9hZGRyOwotICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyhoLT5keW5pbmR4LCBSX0FMUEhBX0pNUF9TTE9UKTsKLSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IDA7Ci0KLSAgICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKXNyZWwtPmNvbnRlbnRzCi0JCQkJICArIHBsdF9pbmRleCkpOwotCi0gICAgICBpZiAoIShoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbiB0aGUKLQkgICAgIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cmllcyBpbiB0aGUgLmdvdC4gICovCi0gICAgICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCBwbHRfYWRkciwgc2dvdC0+Y29udGVudHMgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCi0gICAgICAvKiBTdWJzZXF1ZW50IC5nb3QgZW50cmllcyB3aWxsIGNvbnRpbnVlIHRvIGJvdW5jZSB0aHJvdWdoIHRoZSAucGx0LiAgKi8KLSAgICAgIGlmIChnb3RlbnQtPm5leHQpCi0JewotCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgIEJGRF9BU1NFUlQgKCEgaW5mby0+c2hhcmVkIHx8IHNyZWwgIT0gTlVMTCk7Ci0KLQkgIGdvdGVudCA9IGdvdGVudC0+bmV4dDsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBzZ290ID0gYWxwaGFfZWxmX3RkYXRhKGdvdGVudC0+Z290b2JqKS0+Z290OwotCSAgICAgIEJGRF9BU1NFUlQoc2dvdCAhPSBOVUxMKTsKLQkgICAgICBCRkRfQVNTRVJUKGdvdGVudC0+YWRkZW5kID09IDApOwotCi0JICAgICAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcGx0X2FkZHIsCi0JCSAgICAgICAgICBzZ290LT5jb250ZW50cyArIGdvdGVudC0+Z290X29mZnNldCk7Ci0KLQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQl7Ci0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCSAgICAgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oMCwgUl9BTFBIQV9SRUxBVElWRSk7Ci0JCSAgb3V0cmVsLnJfYWRkZW5kID0gMDsKLQotCQkgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJCSAgICAgIHNyZWwtPmNvbnRlbnRzKQotCQkJCQkgICAgICsgc3JlbC0+cmVsb2NfY291bnQrKyk7Ci0JCSAgQkZEX0FTU0VSVCAoc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpICogc3JlbC0+cmVsb2NfY291bnQKLQkJCSAgICAgIDw9IHNyZWwtPl9jb29rZWRfc2l6ZSk7Ci0JCX0KLQotCSAgICAgIGdvdGVudCA9IGdvdGVudC0+bmV4dDsKLQkgICAgfQotICAgICAgICAgIHdoaWxlIChnb3RlbnQgIT0gTlVMTCk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKGgsIGluZm8pKQotICAgIHsKLSAgICAgIC8qIEZpbGwgaW4gdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMgZm9yIHRoaXMgc3ltYm9sJ3MgLmdvdCBlbnRyaWVzLiAgKi8KLSAgICAgIGFzZWN0aW9uICpzcmVsOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKLQotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0KLSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsIFJfQUxQSEFfR0xPQl9EQVQpOwotICAgICAgZm9yIChnb3RlbnQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIGgpLT5nb3RfZW50cmllczsKLQkgICBnb3RlbnQgIT0gTlVMTDsKLQkgICBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCi0JewotCSAgYXNlY3Rpb24gKnNnb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGdvdGVudC0+Z290b2JqKS0+Z290OwotCSAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQkgIG91dHJlbC5yX2FkZGVuZCA9IGdvdGVudC0+YWRkZW5kOwotCi0JICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCSAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopc3JlbC0+Y29udGVudHMKLQkJCQkgICAgICArIHNyZWwtPnJlbG9jX2NvdW50KyspKTsKLQkgIEJGRF9BU1NFUlQgKHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSAqIHNyZWwtPnJlbG9jX2NvdW50Ci0JCSAgICAgIDw9IHNyZWwtPl9jb29rZWRfc2l6ZSk7Ci0JfQotICAgIH0KLQotICAvKiBNYXJrIHNvbWUgc3BlY2lhbGx5IGRlZmluZWQgc3ltYm9scyBhcyBhYnNvbHV0ZS4gICovCi0gIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2R5bjsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjY0X0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmNjRfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYXNlY3Rpb24gKnM7Ci0KLQkgIGJmZF9lbGY2NF9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBuYW1lID0gIi5wbHQiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9QTFRSRUxTWjoKLQkgICAgICBuYW1lID0gIi5yZWxhLnBsdCI7Ci0JICAgICAgZ290byBnZXRfc2l6ZTsKLQkgICAgY2FzZSBEVF9KTVBSRUw6Ci0JICAgICAgbmFtZSA9ICIucmVsYS5wbHQiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQotCSAgICBjYXNlIERUX1JFTEFTWjoKLQkgICAgICAvKiBNeSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgVElTIHYxLjEgRUxGIGRvY3VtZW50IGluZGljYXRlcwotCQkgdGhhdCBSRUxBU1ogc2hvdWxkIG5vdCBpbmNsdWRlIEpNUFJFTC4gIFRoaXMgaXMgbm90IHdoYXQKLQkJIHRoZSByZXN0IG9mIHRoZSBCRkQgZG9lcy4gIEl0IGlzLCBob3dldmVyLCB3aGF0IHRoZQotCQkgZ2xpYmMgbGQuc28gd2FudHMuICBEbyB0aGlzIGZpeHVwIGhlcmUgdW50aWwgd2UgZm91bmQKLQkJIG91dCB3aG8gaXMgcmlnaHQuICAqLwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWxhLnBsdCIpOwotCSAgICAgIGlmIChzKQotCQl7Ci0JCSAgZHluLmRfdW4uZF92YWwgLT0KLQkJICAgIChzLT5fY29va2VkX3NpemUgPyBzLT5fY29va2VkX3NpemUgOiBzLT5fcmF3X3NpemUpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZ2V0X3ZtYToKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gKHMgPyBzLT52bWEgOiAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBnZXRfc2l6ZToKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0KLQkJKHMtPl9jb29rZWRfc2l6ZSA/IHMtPl9jb29rZWRfc2l6ZSA6IHMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgYmZkX2VsZjY0X3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQl9Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIFBMVDAgZW50cnkgKi8KLSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9IRUFERVJfV09SRDEsIHNwbHQtPmNvbnRlbnRzKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9IRUFERVJfV09SRDIsIHNwbHQtPmNvbnRlbnRzICsgNCk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBQTFRfSEVBREVSX1dPUkQzLCBzcGx0LT5jb250ZW50cyArIDgpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0hFQURFUl9XT1JENCwgc3BsdC0+Y29udGVudHMgKyAxMik7Ci0KLQkgIC8qIFRoZSBuZXh0IHR3byB3b3JkcyB3aWxsIGJlIGZpbGxlZCBpbiBieSBsZC5zbyAqLwotCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgMCwgc3BsdC0+Y29udGVudHMgKyAxNik7Ci0JICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCAwLCBzcGx0LT5jb250ZW50cyArIDI0KTsKLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0KLQkgICAgUExUX0hFQURFUl9TSVpFOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIG5lZWQgdG8gdXNlIGEgc3BlY2lhbCBsaW5rIHJvdXRpbmUgdG8gaGFuZGxlIHRoZSAucmVnaW5mbyBhbmQKLSAgIHRoZSAubWRlYnVnIHNlY3Rpb25zLiAgV2UgbmVlZCB0byBtZXJnZSBhbGwgaW5zdGFuY2VzIG9mIHRoZXNlCi0gICBzZWN0aW9ucyB0b2dldGhlciwgbm90IHdyaXRlIHRoZW0gYWxsIG91dCBzZXF1ZW50aWFsbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgYXNlY3Rpb24gKnJlZ2luZm9fc2VjLCAqbWRlYnVnX3NlYywgKmdwdGFiX2RhdGFfc2VjLCAqZ3B0YWJfYnNzX3NlYzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwCi0gICAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gIEhEUlIgKnN5bWhkciA9ICZkZWJ1Zy5zeW1ib2xpY19oZWFkZXI7Ci0gIFBUUiBtZGVidWdfaGFuZGxlID0gTlVMTDsKLQotI2lmIDAKLQkgICAgICBpZiAoKytuZ290cyA9PSAyKQotCQl7Ci0JCSAgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgXygidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIiksIChjaGFyICopIE5VTEwsCi0JCSAgICAgb3V0cHV0X2JmZCwgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKTsKLQkJfQotI2VuZGlmCi0KLSAgLyogR28gdGhyb3VnaCB0aGUgc2VjdGlvbnMgYW5kIGNvbGxlY3QgdGhlIC5yZWdpbmZvIGFuZCAubWRlYnVnCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgcmVnaW5mb19zZWMgPSBOVUxMOwotICBtZGVidWdfc2VjID0gTlVMTDsKLSAgZ3B0YWJfZGF0YV9zZWMgPSBOVUxMOwotICBncHRhYl9ic3Nfc2VjID0gTlVMTDsKLSAgZm9yIChvID0gYWJmZC0+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+aG93dG8gPSAmZHVtbXk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWwgKmVsZl9yZWxvYzsKLXsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZkdW1teTsKLX0KLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGY2NC1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmNjQtYmlnIgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX3Vua25vd24KLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fTk9ORQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJZWxmX2dlbmVyaWNfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1taXBzLmMgYi9iZmQvZWxmNjQtbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmMwZGNkLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGY2NC1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkwICswLDAgQEAKLS8qIE1JUFMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotICAgTGlua2VyIHN1cHBvcnQgYWRkZWQgYnkgTWFyayBNaXRjaGVsbCwgQ29kZVNvdXJjZXJ5LCBMTEMuCi0gICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBzdXBwb3J0cyB0aGUgNjQtYml0IE1JUFMgRUxGIEFCSS4KLQotICAgVGhlIE1JUFMgNjQtYml0IEVMRiBBQkkgdXNlcyBhbiB1bnVzdWFsIHJlbG9jIGZvcm1hdC4gIFRoaXMgZmlsZQotICAgb3ZlcnJpZGVzIHRoZSB1c3VhbCBFTEYgcmVsb2MgaGFuZGxpbmcsIGFuZCBoYW5kbGVzIHJlYWRpbmcgYW5kCi0gICB3cml0aW5nIHRoZSByZWxvY2F0aW9ucyBoZXJlLgotCi0gICBUaGUgTUlQUyA2NC1iaXQgRUxGIEFCSSBhbHNvIHVzZXMgYW4gdW51c3VhbCBhcmNoaXZlIG1hcCBmb3JtYXQuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGUgNjQtYml0IEFCSSBpcyBub3Qgc3VwcG9zZWQgdG8KLSAgIHVzZSBFQ09GRi4gIEhvd2V2ZXIsIHdlIHN1cHBvcnQgaXQgYW55aG93IGZvciBhbiBlYXNpZXIgY2hhbmdlb3Zlci4gICovCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLS8qIFRoZSA2NCBiaXQgdmVyc2lvbnMgb2YgdGhlIG1kZWJ1ZyBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGFscGhhLmguICAqLwotI2luY2x1ZGUgImNvZmYvYWxwaGEuaCIKLSNkZWZpbmUgRUNPRkZfNjQKLSNpbmNsdWRlICJlY29mZnN3YXAuaCIKLQotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqLAotCSAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWxmNjRfc3dhcF9yZWxvY2FfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqLAotCSAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X3N3YXBfcmVsb2Nfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbCAqLAotCSAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgKiwKLQkgICBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWxmNjRfYmVfc3dhcF9yZWxvY19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWwgKiwgYmZkX2J5dGUgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jYV9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jYV9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF9ieXRlICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICptaXBzX2VsZjY0X3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBsb25nIG1pcHNfZWxmNjRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3NsdXJwX29uZV9yZWxvY190YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgY29uc3QgRWxmX0ludGVybmFsX1NoZHIgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGY2NF9zbHVycF9yZWxvY190YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotc3RhdGljIHZvaWQgbWlwc19lbGY2NF93cml0ZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGY2NF9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGY2NF93cml0ZV9hcm1hcAotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSk7Ci0KLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUKLSAgIGZyb20gc21hbGxlciB2YWx1ZXMuICBTdGFydCB3aXRoIHplcm8sIHdpZGVuLCAqdGhlbiogZGVjcmVtZW50LiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FCSgoKGJmZF92bWEpMCkgLSAxKQotCi0vKiBUaGUgbnVtYmVyIG9mIGxvY2FsIC5nb3QgZW50cmllcyB3ZSByZXNlcnZlLiAgKi8KLSNkZWZpbmUgTUlQU19SRVNFUlZFRF9HT1ROTyAoMikKLQotLyogVGhlIHJlbG9jYXRpb24gdGFibGUgdXNlZCBmb3IgU0hUX1JFTCBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBzeW1ib2wgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAyNiBiaXQgYnJhbmNoIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NSVBTXzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMjYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISTE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MTzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19MTzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGxpdGVyYWwgc2VjdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xJVEVSQUwiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlZmVyZW5jZSB0byBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1QxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX1BDMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19QQzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IGNhbGwgdGhyb3VnaCBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HUFJFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gICAgeyAxMyB9LAotICAgIHsgMTQgfSwKLSAgICB7IDE1IH0sCi0KLSAgLyogQSA1IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ1LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDUiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2MwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseTsgYSBzcGVjaWFsIGZ1bmN0aW9uIGlzCi0gICAgIG5lZWRlZCB0byBwdXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIHRoZSByaWdodCBwbGFjZS4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3YzQsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2M0LAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNjQgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzY0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfNjQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEaXNwbGFjZW1lbnQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfRElTUCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0RJU1AiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGlzcGxhY2VtZW50IHRvIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9QQUdFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfUEFHRSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBPZmZzZXQgZnJvbSBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfT0ZTVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX09GU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0hJMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2NCBiaXQgc3Vic3RyYWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfU1VCLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU1VCIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5zZXJ0IHRoZSBhZGRlbmQgYXMgYW4gaW5zdHJ1Y3Rpb24uICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19JTlNFUlRfQSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0lOU0VSVF9BIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEluc2VydCB0aGUgYWRkZW5kIGFzIGFuIGluc3RydWN0aW9uLCBhbmQgY2hhbmdlIGFsbCByZWxvY2F0aW9ucwotICAgICB0byByZWZlciB0byB0aGUgb2xkIGluc3RydWN0aW9uIGF0IHRoZSBhZGRyZXNzLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSU5TRVJUX0IsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19JTlNFUlRfQiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEZWxldGUgYSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ERUxFVEUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfREVMRVRFIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdldCB0aGUgaGlnaGVyIHZhbHVlIG9mIGEgNjQgYml0IGFkZGVuZC4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJR0hFUiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSElHSEVSIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHZXQgdGhlIGhpZ2hlc3QgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSElHSEVTVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISUdIRVNUIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTF9MTzE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTExfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJJ20gbm90IHN1cmUgd2hhdCB0aGUgcmVtYWluaW5nIHJlbG9jcyBhcmUsIGJ1dCB0aGV5IGFyZSBkZWZpbmVkCi0gICAgIG9uIElyaXggNi4gICovCi0KLSAgSE9XVE8gKFJfTUlQU19TQ05fRElTUCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NDTl9ESVNQIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUkVMMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19BRERfSU1NRURJQVRFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQUREX0lNTUVESUFURSIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX1BKVU1QLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1BKVU1QIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUkVMR09ULAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTEdPVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBQcm90ZWN0ZWQganVtcCBjb252ZXJzaW9uLiAgVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gaGludC4gIE5vIAotICAgICByZWxvY2F0aW9uIGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcy4gICovCi0gIEhPV1RPIChSX01JUFNfSkFMUiwJICAgICAgICAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSkFMUiIsCSAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLS8qIFRoZSByZWxvY2F0aW9uIHRhYmxlIHVzZWQgZm9yIFNIVF9SRUxBIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbWlwc19lbGY2NF9ob3d0b190YWJsZV9yZWxhW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18zMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBzeW1ib2wgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMjYgYml0IGJyYW5jaCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18yNiwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgCQkJLyogVGhpcyBuZWVkcyBjb21wbGV4IG92ZXJmbG93Ci0JCQkJICAgZGV0ZWN0aW9uLCBiZWNhdXNlIHRoZSB1cHBlciBmb3VyCi0JCQkJICAgYml0cyBtdXN0IG1hdGNoIHRoZSBQQy4gICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzI2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISTE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9NSVBTX0xPMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xPMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdQIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfR1BSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGxpdGVyYWwgc2VjdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xJVEVSQUwiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19QQzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUEMxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IGNhbGwgdGhyb3VnaCBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HUFJFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAgIHsgMTMgfSwKLSAgICB7IDE0IH0sCi0gICAgeyAxNSB9LAotCi0gIC8qIEEgNSBiaXQgc2hpZnQgZmllbGQuICAqLwotICBIT1dUTyAoUl9NSVBTX1NISUZUNSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDUsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0hJRlQ1IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3YzAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDYgYml0IHNoaWZ0IGZpZWxkLiAgKi8KLSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5OyBhIHNwZWNpYWwgZnVuY3Rpb24gaXMKLSAgICAgbmVlZGVkIHRvIHB1dCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TSElGVDYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NISUZUNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2M0LAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNjQgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzY0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfNjQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ESVNQLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfRElTUCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGlzcGxhY2VtZW50IHRvIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9QQUdFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfUEFHRSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogT2Zmc2V0IGZyb20gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX09GU1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9PRlNUIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfSEkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfSEkxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNjQgYml0IHN1YnN0cmFjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX1NVQiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NVQiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5zZXJ0IHRoZSBhZGRlbmQgYXMgYW4gaW5zdHJ1Y3Rpb24uICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19JTlNFUlRfQSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0lOU0VSVF9BIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEluc2VydCB0aGUgYWRkZW5kIGFzIGFuIGluc3RydWN0aW9uLCBhbmQgY2hhbmdlIGFsbCByZWxvY2F0aW9ucwotICAgICB0byByZWZlciB0byB0aGUgb2xkIGluc3RydWN0aW9uIGF0IHRoZSBhZGRyZXNzLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSU5TRVJUX0IsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19JTlNFUlRfQiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEZWxldGUgYSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ERUxFVEUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfREVMRVRFIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdldCB0aGUgaGlnaGVyIHZhbHVlIG9mIGEgNjQgYml0IGFkZGVuZC4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJR0hFUiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSElHSEVSIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdldCB0aGUgaGlnaGVzdCB2YWx1ZSBvZiBhIDY0IGJpdCBhZGRlbmQuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFU1QiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTExfSEkxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9MTzE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJJ20gbm90IHN1cmUgd2hhdCB0aGUgcmVtYWluaW5nIHJlbG9jcyBhcmUsIGJ1dCB0aGV5IGFyZSBkZWZpbmVkCi0gICAgIG9uIElyaXggNi4gICovCi0KLSAgSE9XVE8gKFJfTUlQU19TQ05fRElTUCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NDTl9ESVNQIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUkVMMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19BRERfSU1NRURJQVRFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQUREX0lNTUVESUFURSIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX1BKVU1QLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1BKVU1QIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfUkVMR09ULAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTEdPVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBQcm90ZWN0ZWQganVtcCBjb252ZXJzaW9uLiAgVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gaGludC4gIE5vIAotICAgICByZWxvY2F0aW9uIGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcy4gICovCi0gIEhPV1RPIChSX01JUFNfSkFMUiwJICAgICAgICAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSkFMUiIsCSAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLS8qIFN3YXAgaW4gYSBNSVBTIDY0LWJpdCBSZWwgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGY2NF9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqc3JjOwotICAgICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbCAqZHN0OwotewotICBkc3QtPnJfb2Zmc2V0ID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX29mZnNldCk7Ci0gIGRzdC0+cl9zeW0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfc3ltKTsKLSAgZHN0LT5yX3NzeW0gPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9zc3ltKTsKLSAgZHN0LT5yX3R5cGUzID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZTMpOwotICBkc3QtPnJfdHlwZTIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlMik7Ci0gIGRzdC0+cl90eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZSk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBNSVBTIDY0LWJpdCBSZWxhIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqc3JjOwotICAgICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgZHN0LT5yX29mZnNldCA9IGJmZF9oX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9vZmZzZXQpOwotICBkc3QtPnJfc3ltID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3N5bSk7Ci0gIGRzdC0+cl9zc3ltID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfc3N5bSk7Ci0gIGRzdC0+cl90eXBlMyA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUzKTsKLSAgZHN0LT5yX3R5cGUyID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZTIpOwotICBkc3QtPnJfdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUpOwotICBkc3QtPnJfYWRkZW5kID0gYmZkX2hfZ2V0X3NpZ25lZF82NCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9hZGRlbmQpOwotfQotCi0vKiBTd2FwIG91dCBhIE1JUFMgNjQtYml0IFJlbCByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbCAqc3JjOwotICAgICBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqZHN0OwotewotICBiZmRfaF9wdXRfNjQgKGFiZmQsIHNyYy0+cl9vZmZzZXQsIChiZmRfYnl0ZSAqKSBkc3QtPnJfb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnJfc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3N5bSk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfc3N5bSwgKGJmZF9ieXRlICopIGRzdC0+cl9zc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMywgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMyk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZTIsIChiZmRfYnl0ZSAqKSBkc3QtPnJfdHlwZTIpOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUsIChiZmRfYnl0ZSAqKSBkc3QtPnJfdHlwZSk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgTUlQUyA2NC1iaXQgUmVsYSByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhICpzcmM7Ci0gICAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqZHN0OwotewotICBiZmRfaF9wdXRfNjQgKGFiZmQsIHNyYy0+cl9vZmZzZXQsIChiZmRfYnl0ZSAqKSBkc3QtPnJfb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnJfc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3N5bSk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfc3N5bSwgKGJmZF9ieXRlICopIGRzdC0+cl9zc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMywgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMyk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZTIsIChiZmRfYnl0ZSAqKSBkc3QtPnJfdHlwZTIpOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUsIChiZmRfYnl0ZSAqKSBkc3QtPnJfdHlwZSk7Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgc3JjLT5yX2FkZGVuZCwgKGJmZF9ieXRlICopIGRzdC0+cl9hZGRlbmQpOwotfQotCi0vKiBTd2FwIGluIGEgTUlQUyA2NC1iaXQgUmVsIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfYmVfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgYmZkX2J5dGUgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbCAqZHN0OwotewotICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbCBtaXJlbDsKLQotICBtaXBzX2VsZjY0X3N3YXBfcmVsb2NfaW4gKGFiZmQsIAotCQkJICAgIChjb25zdCBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqKSBzcmMsCi0JCQkgICAgJm1pcmVsKTsKLQotICBkc3RbMF0ucl9vZmZzZXQgPSBtaXJlbC5yX29mZnNldDsKLSAgZHN0WzBdLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAobWlyZWwucl9zeW0sIG1pcmVsLnJfdHlwZSk7Ci0gIGRzdFsxXS5yX29mZnNldCA9IG1pcmVsLnJfb2Zmc2V0OwotICBkc3RbMV0ucl9pbmZvID0gRUxGMzJfUl9JTkZPIChtaXJlbC5yX3NzeW0sIG1pcmVsLnJfdHlwZTIpOwotICBkc3RbMl0ucl9vZmZzZXQgPSBtaXJlbC5yX29mZnNldDsKLSAgZHN0WzJdLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoU1ROX1VOREVGLCBtaXJlbC5yX3R5cGUzKTsKLX0KLQotLyogU3dhcCBpbiBhIE1JUFMgNjQtYml0IFJlbGEgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgYmZkX2J5dGUgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhIG1pcmVsYTsKLQotICBtaXBzX2VsZjY0X3N3YXBfcmVsb2NhX2luIChhYmZkLCAKLQkJCSAgICAgKGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSBzcmMsCi0JCQkgICAgICZtaXJlbGEpOwotCi0gIGRzdFswXS5yX29mZnNldCA9IG1pcmVsYS5yX29mZnNldDsKLSAgZHN0WzBdLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAobWlyZWxhLnJfc3ltLCBtaXJlbGEucl90eXBlKTsKLSAgZHN0WzBdLnJfYWRkZW5kID0gbWlyZWxhLnJfYWRkZW5kOwotICBkc3RbMV0ucl9vZmZzZXQgPSBtaXJlbGEucl9vZmZzZXQ7Ci0gIGRzdFsxXS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKG1pcmVsYS5yX3NzeW0sIG1pcmVsYS5yX3R5cGUyKTsKLSAgZHN0WzFdLnJfYWRkZW5kID0gMDsKLSAgZHN0WzJdLnJfb2Zmc2V0ID0gbWlyZWxhLnJfb2Zmc2V0OwotICBkc3RbMl0ucl9pbmZvID0gRUxGMzJfUl9JTkZPIChTVE5fVU5ERUYsIG1pcmVsYS5yX3R5cGUzKTsKLSAgZHN0WzJdLnJfYWRkZW5kID0gMDsKLX0KLQotLyogU3dhcCBvdXQgYSBNSVBTIDY0LWJpdCBSZWwgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbCAqc3JjOwotICAgICBiZmRfYnl0ZSAqZHN0OwotewotICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbCBtaXJlbDsKLQotICBtaXJlbC5yX29mZnNldCA9IHNyYy0+cl9vZmZzZXQ7Ci0gIG1pcmVsLnJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoc3JjLT5yX2luZm8pOwotICBtaXJlbC5yX3N5bSA9IEVMRjMyX1JfU1lNIChzcmMtPnJfaW5mbyk7Ci0gIG1pcmVsLnJfdHlwZTIgPSBSX01JUFNfTk9ORTsKLSAgbWlyZWwucl9zc3ltID0gU1ROX1VOREVGOwotICBtaXJlbC5yX3R5cGUzID0gUl9NSVBTX05PTkU7Ci0KLSAgbWlwc19lbGY2NF9zd2FwX3JlbG9jX291dCAoYWJmZCwgJm1pcmVsLCAKLQkJCSAgICAgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICopIGRzdCk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgTUlQUyA2NC1iaXQgUmVsYSByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X2JlX3N3YXBfcmVsb2NhX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnNyYzsKLSAgICAgYmZkX2J5dGUgKmRzdDsKLXsKLSAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhIG1pcmVsYTsKLQotICBtaXJlbGEucl9vZmZzZXQgPSBzcmMtPnJfb2Zmc2V0OwotICBtaXJlbGEucl90eXBlID0gRUxGMzJfUl9UWVBFIChzcmMtPnJfaW5mbyk7Ci0gIG1pcmVsYS5yX2FkZGVuZCA9IHNyYy0+cl9hZGRlbmQ7Ci0gIG1pcmVsYS5yX3N5bSA9IEVMRjMyX1JfU1lNIChzcmMtPnJfaW5mbyk7Ci0gIG1pcmVsYS5yX3R5cGUyID0gUl9NSVBTX05PTkU7Ci0gIG1pcmVsYS5yX3NzeW0gPSBTVE5fVU5ERUY7Ci0gIG1pcmVsYS5yX3R5cGUzID0gUl9NSVBTX05PTkU7Ci0KLSAgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKGFiZmQsICZtaXJlbGEsIAotCQkJICAgICAgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSBkc3QpOwotfQotCi0vKiBBIG1hcHBpbmcgZnJvbSBCRkQgcmVsb2MgdHlwZXMgdG8gTUlQUyBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgZW51bSBlbGZfbWlwc19yZWxvY190eXBlIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9yZWxvY19tYXAgbWlwc19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfTUlQU19OT05FLCB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9NSVBTXzE2IH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX01JUFNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfNjQsIFJfTUlQU182NCB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX01JUFNfNjQgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfTUlQU19SRUwzMiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0pNUCwgUl9NSVBTXzI2IH0sCi0gIHsgQkZEX1JFTE9DX0hJMTZfUywgUl9NSVBTX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTE8xNiwgUl9NSVBTX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTCwgUl9NSVBTX0dQUkVMMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19MSVRFUkFMLCBSX01JUFNfTElURVJBTCB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBSX01JUFNfR09UMTYgfSwKLSAgeyBCRkRfUkVMT0NfMTZfUENSRUwsIFJfTUlQU19QQzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTDE2LCBSX01JUFNfQ0FMTDE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR1BSRUwzMiwgUl9NSVBTX0dQUkVMMzIgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNiwgUl9NSVBTX0dPVF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsIFJfTUlQU19HT1RfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNiwgUl9NSVBTX0NBTExfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiwgUl9NSVBTX0NBTExfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX1NVQiwgUl9NSVBTX1NVQiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9QQUdFLCBSX01JUFNfR09UX1BBR0UgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfT0ZTVCwgUl9NSVBTX0dPVF9PRlNUIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX0RJU1AsIFJfTUlQU19HT1RfRElTUCB9Ci19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyB0eXBlLCByZXR1cm4gYSBob3d0byBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1taXBzX2VsZjY0X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChtaXBzX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChtaXBzX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JewotCSAgaW50IHY7Ci0KLQkgIHYgPSAoaW50KSBtaXBzX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsOwotCSAgcmV0dXJuICZtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbFt2XTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTaW5jZSBlYWNoIGVudHJ5IGluIGFuIFNIVF9SRUwgb3IgU0hUX1JFTEEgc2VjdGlvbiBjYW4gcmVwcmVzZW50IHVwCi0gICB0byB0aHJlZSByZWxvY3MsIHdlIG11c3QgdGVsbCB0aGUgdXNlciB0byBhbGxvY2F0ZSBtb3JlIHNwYWNlLiAgKi8KLQotc3RhdGljIGxvbmcKLW1pcHNfZWxmNjRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmV0dXJuIChzZWMtPnJlbG9jX2NvdW50ICogMyArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi0vKiBSZWFkIHRoZSByZWxvY2F0aW9ucyBmcm9tIG9uZSByZWxvYyBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scywgcmVsX2hkcikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLXsKLSAgUFRSIGFsbG9jYXRlZCA9IE5VTEw7Ci0gIGJmZF9ieXRlICpuYXRpdmVfcmVsb2NzOwotICBhcmVsZW50ICpyZWxlbnRzOwotICBhcmVsZW50ICpyZWxlbnQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBlbnRzaXplOwotICByZWxvY19ob3d0b190eXBlICpob3d0b190YWJsZTsKLQotICBhbGxvY2F0ZWQgPSAoUFRSKSBiZmRfbWFsbG9jIChyZWxfaGRyLT5zaF9zaXplKTsKLSAgaWYgKGFsbG9jYXRlZCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgcmVsX2hkci0+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+aG93dG8tPnR5cGU7Ci0KLQkgICsraWR4OwotCX0KLQotICAgICAgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKGFiZmQsICZpbnRfcmVsYSwgZXh0X3JlbGEpOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChleHRfcmVsYSAtIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKikgcmVsYV9oZHItPmNvbnRlbnRzCi0JICAgICAgPT0gY291bnQpOwotfQotDAotLyogSXJpeCA2IGRlZmluZXMgYSBicmFuZCBuZXcgYXJjaGl2ZSBtYXAgZm9ybWF0LCBzbyB0aGF0IHRoZXkgY2FuCi0gICBoYXZlIGFyY2hpdmVzIG1vcmUgdGhhbiA0IEdCIGluIHNpemUuICAqLwotCi0vKiBSZWFkIGFuIElyaXggNiBhcm1hcC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZjY0X3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgY2hhciBuZXh0bmFtZVsxN107Ci0gIGZpbGVfcHRyIGFyaGRycG9zOwotICBiZmRfc2l6ZV90eXBlIGksIHBhcnNlZF9zaXplLCBuc3lteiwgc3RyaW5nc2l6ZSwgY2Fyc3ltX3NpemUsIHB0cnNpemU7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIGJmZF9ieXRlIGludF9idWZbOF07Ci0gIGNoYXIgKnN0cmluZ2Jhc2U7Ci0gIGJmZF9ieXRlICpyYXdfYXJtYXAgPSBOVUxMOwotICBjYXJzeW0gKmNhcnN5bXM7Ci0KLSAgYXJkYXRhLT5zeW1kZWZzID0gTlVMTDsKLQotICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQuICAqLwotICBhcmhkcnBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgaSA9IGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpOwotICBpZiAoaSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoaSAhPSAxNikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0gMTYsIFNFRUtfQ1VSKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBcmNoaXZlcyB3aXRoIHRyYWRpdGlvbmFsIGFybWFwcyBhcmUgc3RpbGwgcGVybWl0dGVkLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSA9PSAwKQotICAgIHJldHVybiBiZmRfc2x1cnBfYXJtYXAgKGFiZmQpOwotCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIi9TWU02NC8gICAgICAgICAiLCAxNikgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBtYXBkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gIGlmIChtYXBkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBwYXJzZWRfc2l6ZSA9IG1hcGRhdGEtPnBhcnNlZF9zaXplOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgbWFwZGF0YSk7Ci0KLSAgaWYgKGJmZF9yZWFkIChpbnRfYnVmLCAxLCA4LCBhYmZkKSAhPSA4KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBuc3lteiA9IGJmZF9nZXRiNjQgKGludF9idWYpOwotICBzdHJpbmdzaXplID0gcGFyc2VkX3NpemUgLSA4ICogbnN5bXogLSA4OwotCi0gIGNhcnN5bV9zaXplID0gbnN5bXogKiBzaXplb2YgKGNhcnN5bSk7Ci0gIHB0cnNpemUgPSA4ICogbnN5bXo7Ci0KLSAgYXJkYXRhLT5zeW1kZWZzID0gKGNhcnN5bSAqKSBiZmRfemFsbG9jIChhYmZkLCBjYXJzeW1fc2l6ZSArIHN0cmluZ3NpemUgKyAxKTsKLSAgaWYgKGFyZGF0YS0+c3ltZGVmcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgY2Fyc3ltcyA9IGFyZGF0YS0+c3ltZGVmczsKLSAgc3RyaW5nYmFzZSA9ICgoY2hhciAqKSBhcmRhdGEtPnN5bWRlZnMpICsgY2Fyc3ltX3NpemU7Ci0KLSAgcmF3X2FybWFwID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgcHRyc2l6ZSk7Ci0gIGlmIChyYXdfYXJtYXAgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3JlYWQgKHJhd19hcm1hcCwgMSwgcHRyc2l6ZSwgYWJmZCkgIT0gcHRyc2l6ZQotICAgICAgfHwgYmZkX3JlYWQgKHN0cmluZ2Jhc2UsIDEsIHN0cmluZ3NpemUsIGFiZmQpICE9IHN0cmluZ3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IG5zeW16OyBpKyspCi0gICAgewotICAgICAgY2Fyc3ltcy0+ZmlsZV9vZmZzZXQgPSBiZmRfZ2V0YjY0IChyYXdfYXJtYXAgKyBpICogOCk7Ci0gICAgICBjYXJzeW1zLT5uYW1lID0gc3RyaW5nYmFzZTsKLSAgICAgIHN0cmluZ2Jhc2UgKz0gc3RybGVuIChzdHJpbmdiYXNlKSArIDE7Ci0gICAgICArK2NhcnN5bXM7Ci0gICAgfQotICAqc3RyaW5nYmFzZSA9ICdcMCc7Ci0KLSAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSBuc3ltejsKLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBhcmhkcnBvcyArIHNpemVvZiAoc3RydWN0IGFyX2hkcikgKyBwYXJzZWRfc2l6ZTsKLQotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgcmF3X2FybWFwKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHJhd19hcm1hcCAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCByYXdfYXJtYXApOwotICBpZiAoYXJkYXRhLT5zeW1kZWZzICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIGFyZGF0YS0+c3ltZGVmcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIElyaXggNiBhcm1hcC4gIFRoZSBJcml4IDYgdG9vbHMgYXJlIHN1cHBvc2VkIHRvIGJlCi0gICBhYmxlIHRvIGhhbmRsZSBvcmRpbmFyeSBFTEYgYXJtYXBzLCBidXQgYXQgbGVhc3Qgb24gSXJpeCA2LjIgdGhlCi0gICBsaW5rZXIgY3Jhc2hlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZjY0X3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoLCBtYXAsIHN5bWJvbF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIHVuc2lnbmVkIGludCByYW5saWJzaXplID0gKHN5bWJvbF9jb3VudCAqIDgpICsgODsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemUgPSBzdHJpZHg7Ci0gIHVuc2lnbmVkIGludCBtYXBzaXplID0gc3RyaW5nc2l6ZSArIHJhbmxpYnNpemU7Ci0gIGZpbGVfcHRyIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyOwotICBiZmQgKmN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgcGFkZGluZzsKLSAgYmZkX2J5dGUgYnVmWzhdOwotCi0gIHBhZGRpbmcgPSBCRkRfQUxJR04gKG1hcHNpemUsIDgpIC0gbWFwc2l6ZTsKLSAgbWFwc2l6ZSArPSBwYWRkaW5nOwotCi0gIC8qIHdvcmsgb3V0IHdoZXJlIHRoZSBmaXJzdCBvYmplY3QgZmlsZSB3aWxsIGdvIGluIHRoZSBhcmNoaXZlICovCi0gIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyID0gKG1hcHNpemUKLQkJCSAgICAgKyBlbGVuZ3RoCi0JCQkgICAgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKQotCQkJICAgICArIFNBUk1BRyk7Ci0KLSAgbWVtc2V0ICgoY2hhciAqKSAoJmhkciksIDAsIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICBzdHJjcHkgKGhkci5hcl9uYW1lLCAiL1NZTTY0LyIpOwotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbWFwc2l6ZSk7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgKGxvbmcpIHRpbWUgKE5VTEwpKTsKLSAgLyogVGhpcywgYXQgbGVhc3QsIGlzIHdoYXQgSW50ZWwgY29mZiBzZXRzIHRoZSB2YWx1ZXMgdG8uOiAqLwotICBzcHJpbnRmICgoaGRyLmFyX3VpZCksICIlZCIsIDApOwotICBzcHJpbnRmICgoaGRyLmFyX2dpZCksICIlZCIsIDApOwotICBzcHJpbnRmICgoaGRyLmFyX21vZGUpLCAiJS03byIsICh1bnNpZ25lZCkgMCk7Ci0gIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCi0gICAgaWYgKCgoY2hhciAqKSAoJmhkcikpW2ldID09ICdcMCcpCi0gICAgICAoKChjaGFyICopICgmaGRyKSlbaV0pID0gJyAnOwotCi0gIC8qIFdyaXRlIHRoZSBhciBoZWFkZXIgZm9yIHRoaXMgaXRlbSBhbmQgdGhlIG51bWJlciBvZiBzeW1ib2xzICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9wdXRiNjQgKHN5bWJvbF9jb3VudCwgYnVmKTsKLSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA4LCBhcmNoKSAhPSA4KQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUd28gcGFzc2VzLCBmaXJzdCB3cml0ZSB0aGUgZmlsZSBvZmZzZXRzIGZvciBlYWNoIHN5bWJvbCAtCi0gICAgIHJlbWVtYmVyaW5nIHRoYXQgZWFjaCBvZmZzZXQgaXMgb24gYSB0d28gYnl0ZSBib3VuZGFyeS4gICovCi0KLSAgLyogV3JpdGUgb3V0IHRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGVhY2gKLSAgICAgc3ltYm9sLCBhbmQgcmVtZW1iZXIgdG8ga2VlcCB0aGUgb2Zmc2V0cyBwYWRkZWQgb3V0LiAgKi8KLQotICBjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOwotICBjb3VudCA9IDA7Ci0gIHdoaWxlIChjdXJyZW50ICE9IChiZmQgKikgTlVMTCAmJiBjb3VudCA8IHN5bWJvbF9jb3VudCkKLSAgICB7Ci0gICAgICAvKiBGb3IgZWFjaCBzeW1ib2wgd2hpY2ggaXMgdXNlZCBkZWZpbmVkIGluIHRoaXMgb2JqZWN0LCB3cml0ZSBvdXQKLQkgdGhlIG9iamVjdCBmaWxlJ3MgYWRkcmVzcyBpbiB0aGUgYXJjaGl2ZSAqLwotCi0gICAgICB3aGlsZSAoKChiZmQgKikgKG1hcFtjb3VudF0pLnBvcykgPT0gY3VycmVudCkKLQl7Ci0JICBiZmRfcHV0YjY0IChhcmNoaXZlX21lbWJlcl9maWxlX3B0ciwgYnVmKTsKLQkgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgOCwgYXJjaCkgIT0gOCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgY291bnQrKzsKLQl9Ci0gICAgICAvKiBBZGQgc2l6ZSBvZiB0aGlzIGFyY2hpdmUgZW50cnkgKi8KLSAgICAgIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyICs9IChhcmVsdF9zaXplIChjdXJyZW50KQotCQkJCSAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIC8qIHJlbWVtYmVyIGFib3V0IHRoZSBldmVuIGFsaWdubWVudCAqLwotICAgICAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgKz0gYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgJSAyOwotICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7Ci0gICAgfQotCi0gIC8qIG5vdyB3cml0ZSB0aGUgc3RyaW5ncyB0aGVtc2VsdmVzICovCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHN5bWJvbF9jb3VudDsgY291bnQrKykKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuID0gc3RybGVuICgqbWFwW2NvdW50XS5uYW1lKSArIDE7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKCptYXBbY291bnRdLm5hbWUsIDEsIGxlbiwgYXJjaCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIHNwZWMgc2F5cyB0aGF0IHRoaXMgc2hvdWxkIGJlIHBhZGRlZCB0byBhbiA4IGJ5dGUgYm91bmRhcnkuCi0gICAgIEhvd2V2ZXIsIHRoZSBJcml4IDYuMiB0b29scyBkbyBub3QgYXBwZWFyIHRvIGRvIHRoaXMuICAqLwotICB3aGlsZSAocGFkZGluZyAhPSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCIiLCAxLCAxLCBhcmNoKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC0tcGFkZGluZzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZXNlIGFyZSB1c2VkIHdoZW4gZGVhbGluZyB3aXRoIHRoZQotICAgLm1kZWJ1ZyBzZWN0aW9uLCB3aGljaCBpcyBpbiB0aGUgRUNPRkYgZGVidWdnaW5nIGZvcm1hdC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgbWlwc19lbGY2NF9lY29mZl9kZWJ1Z19zd2FwID0KLXsKLSAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCi0gIG1hZ2ljU3ltMiwKLSAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICA4LAotICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBkbnJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAotICBzaXplb2YgKHN0cnVjdCBvcHRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAotICBzaXplb2YgKHN0cnVjdCBleHRfZXh0KSwKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX2luLAotICBlY29mZl9zd2FwX2Rucl9pbiwKLSAgZWNvZmZfc3dhcF9wZHJfaW4sCi0gIGVjb2ZmX3N3YXBfc3ltX2luLAotICBlY29mZl9zd2FwX29wdF9pbiwKLSAgZWNvZmZfc3dhcF9mZHJfaW4sCi0gIGVjb2ZmX3N3YXBfcmZkX2luLAotICBlY29mZl9zd2FwX2V4dF9pbiwKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgZWNvZmZfc3dhcF9oZHJfb3V0LAotICBlY29mZl9zd2FwX2Rucl9vdXQsCi0gIGVjb2ZmX3N3YXBfcGRyX291dCwKLSAgZWNvZmZfc3dhcF9zeW1fb3V0LAotICBlY29mZl9zd2FwX29wdF9vdXQsCi0gIGVjb2ZmX3N3YXBfZmRyX291dCwKLSAgZWNvZmZfc3dhcF9yZmRfb3V0LAotICBlY29mZl9zd2FwX2V4dF9vdXQsCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCi0gIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCi0gIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvCi19OwotDAotLyogUmVsb2NhdGlvbnMgaW4gdGhlIDY0IGJpdCBNSVBTIEVMRiBBQkkgYXJlIG1vcmUgY29tcGxleCB0aGFuIGluCi0gICBzdGFuZGFyZCBFTEYuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJlZGlyZWN0IHRoZSByZWxvY2F0aW9uCi0gICBoYW5kbGluZyByb3V0aW5lcy4gICovCi0KLWNvbnN0IHN0cnVjdCBlbGZfc2l6ZV9pbmZvIG1pcHNfZWxmNjRfc2l6ZV9pbmZvID0KLXsKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9FaGRyKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9QaGRyKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9TaGRyKSwKLSAgc2l6ZW9mIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCksCi0gIHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9TeW0pLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX0R5biksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX05vdGUpLAotICA0LCAgICAgICAgICAgIC8qIGhhc2gtdGFibGUgZW50cnkgc2l6ZSAqLwotICAzLCAgICAgICAgICAgIC8qIGludGVybmFsIHJlbG9jYXRpb25zIHBlciBleHRlcm5hbCByZWxvY2F0aW9ucyAqLwotICA2NCwJCS8qIGFyY2hfc2l6ZSAqLwotICA4LAkJLyogZmlsZV9hbGlnbiAqLwotICBFTEZDTEFTUzY0LAotICBFVl9DVVJSRU5ULAotICBiZmRfZWxmNjRfd3JpdGVfb3V0X3BoZHJzLAotICBiZmRfZWxmNjRfd3JpdGVfc2hkcnNfYW5kX2VoZHIsCi0gIG1pcHNfZWxmNjRfd3JpdGVfcmVsb2NzLAotICBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0LAotICBtaXBzX2VsZjY0X3NsdXJwX3JlbG9jX3RhYmxlLAotICBiZmRfZWxmNjRfc2x1cnBfc3ltYm9sX3RhYmxlLAotICBiZmRfZWxmNjRfc3dhcF9keW5faW4sCi0gIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQsCi0gIG1pcHNfZWxmNjRfYmVfc3dhcF9yZWxvY19pbiwKLSAgbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jX291dCwKLSAgbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jYV9pbiwKLSAgbWlwc19lbGY2NF9iZV9zd2FwX3JlbG9jYV9vdXQKLX07Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCWJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGY2NC1saXR0bGVtaXBzIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGY2NF9iaWdtaXBzX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmNjQtYmlnbWlwcyIKLSNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF9taXBzCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX01JUFMKLQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEwMDAKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jb2xsZWN0CQl0cnVlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rCXRydWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCXRydWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvCQltaXBzX2VsZjY0X3NpemVfaW5mbwotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkJX2JmZF9taXBzX2VsZl9vYmplY3RfcAotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcglfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMJX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiBcCi0JCQkJCV9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZwlfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZwlfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAJX2JmZF9taXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCSZtaXBzX2VsZjY0X2Vjb2ZmX2RlYnVnX3N3YXAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCV9iZmRfbWlwc19lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJX2JmZF9taXBzX2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMgXAotCQkJCQlfYmZkX21pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24gICAgX2JmZF9taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAotCQkJCQlfYmZkX21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCV9iZmRfbWlwc19lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJX2JmZF9taXBzX2VsZl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQkoNCpNSVBTX1JFU0VSVkVEX0dPVE5PKQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUJMAotI2RlZmluZSBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbF9wICAgICAgIDEKLQotLyogV2UgZG9uJ3Qgc2V0IGJmZF9lbGY2NF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZWNhdXNlIHRoZSAzMi1iaXQgCi0gICBNSVBTLXNwZWNpZmljIGZ1bmN0aW9uIG9ubHkgYXBwbGllcyB0byBJUklYNSwgd2hpY2ggaGFkIG5vIDY0LWJpdAotICAgQUJJLiAgKi8KLSNkZWZpbmUgYmZkX2VsZjY0X2ZpbmRfbmVhcmVzdF9saW5lCV9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgYmZkX2VsZjY0X3NldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfZmluYWxfbGluawlfYmZkX21pcHNfZWxmX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQlfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQlfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9zZXRfcHJpdmF0ZV9mbGFncwlfYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotCi0jZGVmaW5lIGJmZF9lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgbWlwc19lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cAltaXBzX2VsZjY0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX2Z1bmN0aW9ucwotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9zbHVycF9hcm1hcAltaXBzX2VsZjY0X3NsdXJwX2FybWFwCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAotCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3RydW5jYXRlX2FybmFtZSBcCi0JCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV93cml0ZV9hcm1hcAltaXBzX2VsZjY0X3dyaXRlX2FybWFwCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3JlYWRfYXJfaGRyCV9iZmRfYXJjaGl2ZV9jb2ZmX3JlYWRfYXJfaGRyCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0JCQkJX2JmZF9hcmNoaXZlX2NvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX2dldF9lbHRfYXRfaW5kZXggXAotCQkJCQlfYmZkX2FyY2hpdmVfY29mZl9nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0JCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIFwKLQkJCQlfYmZkX2FyY2hpdmVfY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1zcGFyYy5jIGIvYmZkL2VsZjY0LXNwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMjc4OTcuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjY0LXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkwICswLDAgQEAKLS8qIFNQQVJDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDY0LWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogVGhpcyBpcyBkZWZpbmVkIGlmIG9uZSB3YW50cyB0byBidWlsZCB1cHdhcmQgY29tcGF0aWJsZSBiaW5hcmllcwotICAgd2l0aCB0aGUgb3JpZ2luYWwgc3BhcmM2NC1lbGYgdG9vbGNoYWluLiAgVGhlIHN1cHBvcnQgaXMga2VwdCBpbiBmb3IKLSAgIG5vdyBidXQgaXMgdHVybmVkIG9mZiBieSBkZWZhdWx0LiAgZGplIDk3MDkzMCAgKi8KLS8qI2RlZmluZSBTUEFSQzY0X09MRF9SRUxPQ1MqLwotCi0jaW5jbHVkZSAiZWxmL3NwYXJjLmgiCi0KLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUuICAqLwotI2RlZmluZSBNSU5VU19PTkUgKH4gKGJmZF92bWEpIDApCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqIHNwYXJjNjRfZWxmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUygoYmZkICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpzcGFyYzY0X2VsZl9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBzcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotc3RhdGljIHZvaWQgc3BhcmM2NF9lbGZfYnVpbGRfcGx0Ci0gIFBBUkFNUygoYmZkICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgYmZkX3ZtYSBzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0Ci0gIFBBUkFNUygoaW50KSk7Ci1zdGF0aWMgYmZkX3ZtYSBzcGFyYzY0X2VsZl9wbHRfcHRyX29mZnNldAotICBQQVJBTVMoKGludCwgaW50KSk7Ci0KLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqc2VjLAotCSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUygoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBpbnQgc3BhcmM2NF9lbGZfZ2V0X3N5bWJvbF90eXBlCi0gIFBBUkFNUyAoKCBFbGZfSW50ZXJuYWxfU3ltICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0gICAgICAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyB2b2lkIHNwYXJjNjRfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLQotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHNwYXJjNjRfZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGxvbmcgc3BhcmM2NF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX3NsdXJwX29uZV9yZWxvY190YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfc2x1cnBfcmVsb2NfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLXN0YXRpYyBsb25nIHNwYXJjNjRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgdm9pZCBzcGFyYzY0X2VsZl93cml0ZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotDAotLyogVGhlIHJlbG9jYXRpb24gImhvd3RvIiB0YWJsZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX25vdHN1cF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNwYXJjX2VsZl9oaXgyMl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX2xveDEwX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBzcGFyYzY0X2VsZl9ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgICAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsICAgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgICAwLDIsMTAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgICAxMCwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAgIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSNpZm5kZWYgU1BBUkM2NF9PTERfUkVMT0NTCi0gIC8qIFRoZXNlIGFyZW4ndCBpbXBsZW1lbnRlZCB5ZXQuICAqLwotICBIT1dUTyhSX1NQQVJDX1BMVDMyLCAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUExUMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSElQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19ISVBMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MT1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX0xPUExUMTAiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDUExUMzIsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUENQTFQzMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QQ1BMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1BDUExUMTAiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotI2VuZGlmCi0gIEhPV1RPKFJfU1BBUkNfMTAsICAgICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMCIsICAgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzExLCAgICAgICAgMCwyLDExLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTEiLCAgICAgIGZhbHNlLDAsMHgwMDAwMDdmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ182NCwgICAgICAgIDAsNCw2NCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzY0IiwgICAgICBmYWxzZSwwLE1JTlVTX09ORSwgdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfT0xPMTAsICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19PTE8xMCIsICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hIMjIsICAgICA0MiwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfSEgyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ITTEwLCAgICAgMzIsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hNMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE0yMiwgICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19MTTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0hIMjIsICA0MiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUENfSEgyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19ITTEwLCAgMzIsMiwxMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDX0hNMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfTE0yMiwgIDEwLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQ19MTTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMTYsICAgMiwyLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MsIlJfU1BBUkNfV0RJU1AxNiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDE5LCAgIDIsMiwxOSx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMTkiLCBmYWxzZSwwLDB4MDAwN2ZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVU5VU0VEXzQyLCAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VTlVTRURfNDIiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ183LCAgICAgICAgIDAsMiwgNyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzciLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwN2YsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNSwgICAgICAgICAwLDIsIDUsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ181IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDFmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzYsICAgICAgICAgMCwyLCA2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNiIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAzZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQNjQsICAgIDAsNCw2NCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1A2NCIsICBmYWxzZSwwLE1JTlVTX09ORSwgdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUExUNjQsICAgICAwLDQsNjQsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QTFQ2NCIsICAgZmFsc2UsMCxNSU5VU19PTkUsIGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISVgyMiwgICAgIDAsNCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLHNwYXJjX2VsZl9oaXgyMl9yZWxvYywgICJSX1NQQVJDX0hJWDIyIiwgICBmYWxzZSwwLE1JTlVTX09ORSwgZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX0xPWDEwLCAgICAgMCw0LCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX2xveDEwX3JlbG9jLCAgIlJfU1BBUkNfTE9YMTAiLCAgIGZhbHNlLDAsTUlOVVNfT05FLCBmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfSDQ0LCAgICAgIDIyLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19INDQiLCAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19NNDQsICAgICAgMTIsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX000NCIsICAgICBmYWxzZSwwLDB4MDAwMDAzZmYsZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX0w0NCwgICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTDQ0IiwgICAgIGZhbHNlLDAsMHgwMDAwMGZmZixmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVHSVNURVIsICAwLDQsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19SRUdJU1RFUiIsZmFsc2UsMCxNSU5VU19PTkUsIGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19VQTY0LCAgICAgICAgMCw0LDY0LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUE2NCIsICAgICAgZmFsc2UsMCxNSU5VU19PTkUsIHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMTYsICAgICAgICAwLDEsMTYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VQTE2IiwgICAgICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSkKLX07Ci0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwIHsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzcGFyY19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU1BBUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfU1BBUkNfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU1BBUkNfOCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NQQVJDX0RJU1A4IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU1BBUkNfNjQgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU1BBUkNfRElTUDMyIH0sCi0gIHsgQkZEX1JFTE9DX0hJMjIsIFJfU1BBUkNfSEkyMiB9LAotICB7IEJGRF9SRUxPQ19MTzEwLCBSX1NQQVJDX0xPMTAsIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCBSX1NQQVJDX1dESVNQMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMyMiwgUl9TUEFSQ18yMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzEzLCBSX1NQQVJDXzEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCBSX1NQQVJDX0dPVDEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCBSX1NQQVJDX0dPVDEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCBSX1NQQVJDX0dPVDIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMTAsIFJfU1BBUkNfUEMxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzIyLCBSX1NQQVJDX1BDMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCBSX1NQQVJDX1dQTFQzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19DT1BZLCBSX1NQQVJDX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsIFJfU1BBUkNfR0xPQl9EQVQgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsIFJfU1BBUkNfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsIFJfU1BBUkNfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgUl9TUEFSQ19XRElTUDIyIH0sCi0gIC8qID8/PyBEb2Vzbid0IGR3YXJmIHVzZSB0aGlzPyAgKi8KLS8qeyBCRkRfUkVMT0NfU1BBUkNfVUEzMiwgUl9TUEFSQ19VQTMyIH0sIG5vdCB1c2VkPz8gKi8KLSAge0JGRF9SRUxPQ19TUEFSQ18xMCwgUl9TUEFSQ18xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfMTEsIFJfU1BBUkNfMTF9LAotICB7QkZEX1JFTE9DX1NQQVJDXzY0LCBSX1NQQVJDXzY0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19PTE8xMCwgUl9TUEFSQ19PTE8xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSEgyMiwgUl9TUEFSQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ITTEwLCBSX1NQQVJDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0xNMjIsIFJfU1BBUkNfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiwgUl9TUEFSQ19QQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19ITTEwLCBSX1NQQVJDX1BDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIsIFJfU1BBUkNfUENfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiwgUl9TUEFSQ19XRElTUDE2fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19XRElTUDE5LCBSX1NQQVJDX1dESVNQMTl9LAotICB7QkZEX1JFTE9DX1NQQVJDXzcsIFJfU1BBUkNfN30sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNSwgUl9TUEFSQ181fSwKLSAge0JGRF9SRUxPQ19TUEFSQ182LCBSX1NQQVJDXzZ9LAotICB7QkZEX1JFTE9DX1NQQVJDX0RJU1A2NCwgUl9TUEFSQ19ESVNQNjR9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BMVDY0LCBSX1NQQVJDX1BMVDY0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ISVgyMiwgUl9TUEFSQ19ISVgyMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfTE9YMTAsIFJfU1BBUkNfTE9YMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0g0NCwgUl9TUEFSQ19INDR9LAotICB7QkZEX1JFTE9DX1NQQVJDX000NCwgUl9TUEFSQ19NNDR9LAotICB7QkZEX1JFTE9DX1NQQVJDX0w0NCwgUl9TUEFSQ19MNDR9LAotICB7QkZEX1JFTE9DX1NQQVJDX1JFR0lTVEVSLCBSX1NQQVJDX1JFR0lTVEVSfQotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotc3BhcmM2NF9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzcGFyY19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3BhcmNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJnNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHNwYXJjX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotc3BhcmM2NF9lbGZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIEJGRF9BU1NFUlQgKEVMRjY0X1JfVFlQRV9JRCAoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9TUEFSQ19tYXhfc3RkKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZzcGFyYzY0X2VsZl9ob3d0b190YWJsZVtFTEY2NF9SX1RZUEVfSUQgKGRzdC0+cl9pbmZvKV07Ci19Ci0MCi0vKiBEdWUgdG8gdGhlIHdheSBob3cgd2UgaGFuZGxlIFJfU1BBUkNfT0xPMTAsIGVhY2ggZW50cnkgaW4gYSBTSFRfUkVMQQotICAgc2VjdGlvbiBjYW4gcmVwcmVzZW50IHVwIHRvIHR3byByZWxvY3MsIHdlIG11c3QgdGVsbCB0aGUgdXNlciB0byBhbGxvY2F0ZQotICAgbW9yZSBzcGFjZS4gICovCi0gICAKLXN0YXRpYyBsb25nCi1zcGFyYzY0X2VsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZXR1cm4gKHNlYy0+cmVsb2NfY291bnQgKiAyICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLXN0YXRpYyBsb25nCi1zcGFyYzY0X2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gX2JmZF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpICogMjsKLX0KLQotLyogUmVhZCAgcmVsb2NhdGlvbnMgZm9yIEFTRUNUIGZyb20gUkVMX0hEUi4gIFRoZXJlIGFyZSBSRUxPQ19DT1VOVCBvZiAKLSAgIHRoZW0uICBXZSBjYW5ub3QgdXNlIGdlbmVyaWMgZWxmIHJvdXRpbmVzIGZvciB0aGlzLCAgYmVjYXVzZSBSX1NQQVJDX09MTzEwCi0gICBoYXMgc2Vjb25kYXJ5IGFkZGVuZCBpbiBFTEY2NF9SX1RZUEVfREFUQS4gIFdlIGhhbmRsZSBpdCBhcyB0d28gcmVsb2NhdGlvbnMKLSAgIGZvciB0aGUgc2FtZSBsb2NhdGlvbiwgIFJfU1BBUkNfTE8xMCBhbmQgUl9TUEFSQ18xMy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9zbHVycF9vbmVfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCByZWxfaGRyLCBzeW1ib2xzLCBkeW5hbWljKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICogY29uc3QgZWJkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBQVFIgYWxsb2NhdGVkID0gTlVMTDsKLSAgYmZkX2J5dGUgKm5hdGl2ZV9yZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbGVudDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBlbnRzaXplOwotICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICBhcmVsZW50ICpyZWxlbnRzOwotCi0gIGFsbG9jYXRlZCA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbF9oZHItPnNoX3NpemUpOwotICBpZiAoYWxsb2NhdGVkID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCByZWxfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKGFsbG9jYXRlZCwgMSwgcmVsX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkgICE9IHJlbF9oZHItPnNoX3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIG5hdGl2ZV9yZWxvY3MgPSAoYmZkX2J5dGUgKikgYWxsb2NhdGVkOwotCi0gIHJlbGVudHMgPSBhc2VjdC0+cmVsb2NhdGlvbiArIGFzZWN0LT5yZWxvY19jb3VudDsKLQotICBlbnRzaXplID0gcmVsX2hkci0+c2hfZW50c2l6ZTsKLSAgQkZEX0FTU0VSVCAoZW50c2l6ZSA9PSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpKTsKLSAgCi0gIGNvdW50ID0gcmVsX2hkci0+c2hfc2l6ZSAvIGVudHNpemU7Ci0KLSAgZm9yIChpID0gMCwgcmVsZW50ID0gcmVsZW50czsgaSA8IGNvdW50OwotICAgICAgIGkrKywgcmVsZW50KyssIG5hdGl2ZV9yZWxvY3MgKz0gZW50c2l6ZSkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIChFbGY2NF9FeHRlcm5hbF9SZWxhICopIG5hdGl2ZV9yZWxvY3MsICZyZWxhKTsKLQotICAgICAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAotCSBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBzaGFyZWQgbGlicmFyeS4KLQkgVGhlIGFkZHJlc3Mgb2YgYSBub3JtYWwgQkZEIHJlbG9jIGlzIGFsd2F5cyBzZWN0aW9uIHJlbGF0aXZlLAotCSBhbmQgdGhlIGFkZHJlc3Mgb2YgYSBkeW5hbWljIHJlbG9jIGlzIGFic29sdXRlLi4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwIHx8IGR5bmFtaWMpCi0JcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldDsKLSAgICAgIGVsc2UKLQlyZWxlbnQtPmFkZHJlc3MgPSByZWxhLnJfb2Zmc2V0IC0gYXNlY3QtPnZtYTsKLQotICAgICAgaWYgKEVMRjY0X1JfU1lNIChyZWxhLnJfaW5mbykgPT0gMCkKLQlyZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICBlbHNlCi0JewotCSAgYXN5bWJvbCAqKnBzLCAqczsKLQotCSAgcHMgPSBzeW1ib2xzICsgRUxGNjRfUl9TWU0gKHJlbGEucl9pbmZvKSAtIDE7Ci0JICBzID0gKnBzOwotCi0JICAvKiBDYW5vbmljYWxpemUgRUxGIHNlY3Rpb24gc3ltYm9scy4gIEZJWE1FOiBXaHk/ICAqLwotCSAgaWYgKChzLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQkgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHBzOwotCSAgZWxzZQotCSAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gcy0+c2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0JfQotCi0gICAgICByZWxlbnQtPmFkZGVuZCA9IHJlbGEucl9hZGRlbmQ7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKEVMRjY0X1JfVFlQRV9JRCAocmVsYS5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9TUEFSQ19tYXhfc3RkKTsKLSAgICAgIGlmIChFTEY2NF9SX1RZUEVfSUQgKHJlbGEucl9pbmZvKSA9PSBSX1NQQVJDX09MTzEwKQotCXsKLQkgIHJlbGVudC0+aG93dG8gPSAmc3BhcmM2NF9lbGZfaG93dG9fdGFibGVbUl9TUEFSQ19MTzEwXTsKLQkgIHJlbGVudFsxXS5hZGRyZXNzID0gcmVsZW50LT5hZGRyZXNzOwotCSAgcmVsZW50Kys7Ci0JICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JICByZWxlbnQtPmFkZGVuZCA9IEVMRjY0X1JfVFlQRV9EQVRBIChyZWxhLnJfaW5mbyk7Ci0JICByZWxlbnQtPmhvd3RvID0gJnNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlW1JfU1BBUkNfMTNdOwotCX0KLSAgICAgIGVsc2UKLQlyZWxlbnQtPmhvd3RvID0gJnNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlW0VMRjY0X1JfVFlQRV9JRCAocmVsYS5yX2luZm8pXTsKLSAgICB9Ci0KLSAgYXNlY3QtPnJlbG9jX2NvdW50ICs9IHJlbGVudCAtIHJlbGVudHM7Ci0KLSAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jYXRlZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhbGxvY2F0ZWQgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvY2F0ZWQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlYWQgaW4gYW5kIHN3YXAgdGhlIGV4dGVybmFsIHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKiBjb25zdCBkID0gZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHIyOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbiAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIGR5bmFtaWMpCi0gICAgewotICAgICAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgIHx8IGFzZWN0LT5yZWxvY19jb3VudCA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICByZWxfaGRyID0gJmQtPnJlbF9oZHI7Ci0gICAgICByZWxfaGRyMiA9IGQtPnJlbF9oZHIyOwotCi0gICAgICBCRkRfQVNTRVJUIChhc2VjdC0+cmVsX2ZpbGVwb3MgPT0gcmVsX2hkci0+c2hfb2Zmc2V0Ci0JCSAgfHwgKHJlbF9oZHIyICYmIGFzZWN0LT5yZWxfZmlsZXBvcyA9PSByZWxfaGRyMi0+c2hfb2Zmc2V0KSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTm90ZSB0aGF0IEFTRUNULT5SRUxPQ19DT1VOVCB0ZW5kcyBub3QgdG8gYmUgYWNjdXJhdGUgaW4gdGhpcwotCSBjYXNlIGJlY2F1c2UgcmVsb2NhdGlvbnMgYWdhaW5zdCB0aGlzIHNlY3Rpb24gbWF5IHVzZSB0aGUKLQkgZHluYW1pYyBzeW1ib2wgdGFibGUsIGFuZCBpbiB0aGF0IGNhc2UgYmZkX3NlY3Rpb25fZnJvbV9zaGRyCi0JIGluIGVsZi5jIGRvZXMgbm90IHVwZGF0ZSB0aGUgUkVMT0NfQ09VTlQuICAqLwotICAgICAgaWYgKGFzZWN0LT5fcmF3X3NpemUgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgcmVsX2hkciA9ICZkLT50aGlzX2hkcjsKLSAgICAgIGFzZWN0LT5yZWxvY19jb3VudCA9IHJlbF9oZHItPnNoX3NpemUgLyByZWxfaGRyLT5zaF9lbnRzaXplOwotICAgICAgcmVsX2hkcjIgPSBOVUxMOwotICAgIH0KLQotICBhc2VjdC0+cmVsb2NhdGlvbiA9ICgoYXJlbGVudCAqKSAKLQkJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgCi0JCQkJICBhc2VjdC0+cmVsb2NfY291bnQgKiAyICogc2l6ZW9mIChhcmVsZW50KSkpOwotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIHNwYXJjNjRfZWxmX3NsdXJwX29uZV9yZWxvY190YWJsZSByb3V0aW5lIGluY3JlbWVudHMgcmVsb2NfY291bnQuICAqLwotICBhc2VjdC0+cmVsb2NfY291bnQgPSAwOwotICAgIAotICBpZiAoIXNwYXJjNjRfZWxmX3NsdXJwX29uZV9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHJlbF9oZHIsIHN5bWJvbHMsCi0JCQkJCSAgZHluYW1pYykpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaWYgKHJlbF9oZHIyIAotICAgICAgJiYgIXNwYXJjNjRfZWxmX3NsdXJwX29uZV9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHJlbF9oZHIyLCBzeW1ib2xzLAotCQkJCQkgICAgIGR5bmFtaWMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2Fub25pY2FsaXplIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcy4gIE5vdGUgdGhhdCB3ZSByZXR1cm4KLSAgIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zIGFzIGEgc2luZ2xlIGJsb2NrLCBhbHRob3VnaCB0aGV5IGFyZQotICAgYWN0dWFsbHkgYXNzb2NpYXRlZCB3aXRoIHBhcnRpY3VsYXIgc2VjdGlvbnM7IHRoZSBpbnRlcmZhY2UsIHdoaWNoCi0gICB3YXMgZGVzaWduZWQgZm9yIFN1bk9TIHN0eWxlIHNoYXJlZCBsaWJyYXJpZXMsIGV4cGVjdHMgdGhhdCB0aGVyZQotICAgaXMgb25seSBvbmUgc2V0IG9mIGR5bmFtaWMgcmVsb2NzLiAgQW55IHNlY3Rpb24gdGhhdCB3YXMgYWN0dWFsbHkKLSAgIGluc3RhbGxlZCBpbiB0aGUgQkZELCBhbmQgaGFzIHR5cGUgU0hUX1JFTCBvciBTSFRfUkVMQSwgYW5kIHVzZXMKLSAgIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgaXMgY29uc2lkZXJlZCB0byBiZSBhIGR5bmFtaWMgcmVsb2MKLSAgIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgbG9uZwotc3BhcmM2NF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgKGFiZmQsIHN0b3JhZ2UsIHN5bXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqKnN0b3JhZ2U7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotewotICBhc2VjdGlvbiAqczsKLSAgbG9uZyByZXQ7Ci0KLSAgaWYgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0ID0gMDsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9saW5rID09IGVsZl9keW5zeW10YWIgKGFiZmQpCi0JICAmJiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTEEpKQotCXsKLQkgIGFyZWxlbnQgKnA7Ci0JICBsb25nIGNvdW50LCBpOwotCi0JICBpZiAoISBzcGFyYzY0X2VsZl9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgcywgc3ltcywgdHJ1ZSkpCi0JICAgIHJldHVybiAtMTsKLQkgIGNvdW50ID0gcy0+cmVsb2NfY291bnQ7Ci0JICBwID0gcy0+cmVsb2NhdGlvbjsKLQkgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCSAgICAqc3RvcmFnZSsrID0gcCsrOwotCSAgcmV0ICs9IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgKnN0b3JhZ2UgPSBOVUxMOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNwYXJjNjRfZWxmX3dyaXRlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotewotICBib29sZWFuICpmYWlsZWRwID0gKGJvb2xlYW4gKikgZGF0YTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbGFfaGRyOwotICBFbGY2NF9FeHRlcm5hbF9SZWxhICpvdXRib3VuZF9yZWxvY2FzOwotICB1bnNpZ25lZCBpbnQgaWR4LCBjb3VudDsKLSAgYXN5bWJvbCAqbGFzdF9zeW0gPSAwOwotICBpbnQgbGFzdF9zeW1faWR4ID0gMDsKLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgZmFpbGVkLCBkb24ndCBkbyBhbnl0aGluZy4gICovCi0gIGlmICgqZmFpbGVkcCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBUaGUgbGlua2VyIGJhY2tlbmQgd3JpdGVzIHRoZSByZWxvY3Mgb3V0IGl0c2VsZiwgYW5kIHNldHMgdGhlCi0gICAgIHJlbG9jX2NvdW50IGZpZWxkIHRvIHplcm8gdG8gaW5oaWJpdCB3cml0aW5nIHRoZW0gaGVyZS4gIEFsc28sCi0gICAgIHNvbWV0aW1lcyB0aGUgU0VDX1JFTE9DIGZsYWcgZ2V0cyBzZXQgZXZlbiB3aGVuIHRoZXJlIGFyZW4ndCBhbnkKLSAgICAgcmVsb2NzLiAgKi8KLSAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyogV2UgY2FuIGNvbWJpbmUgdHdvIHJlbG9jcyB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIGFkZHJlc3MKLSAgICAgaW50byBSX1NQQVJDX09MTzEwIGlmIGZpcnN0IG9uZSBpcyBSX1NQQVJDX0xPMTAgYW5kIHRoZQotICAgICBsYXR0ZXIgaXMgUl9TUEFSQ18xMyB3aXRoIG5vIGFzc29jaWF0ZWQgc3ltYm9sLiAgKi8KLSAgY291bnQgPSAwOwotICBmb3IgKGlkeCA9IDA7IGlkeCA8IHNlYy0+cmVsb2NfY291bnQ7IGlkeCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgYWRkcjsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICArK2NvdW50OwotCi0gICAgICBhZGRyID0gc2VjLT5vcmVsb2NhdGlvbltpZHhdLT5hZGRyZXNzOwotICAgICAgaWYgKHNlYy0+b3JlbG9jYXRpb25baWR4XS0+aG93dG8tPnR5cGUgPT0gUl9TUEFSQ19MTzEwCi0JICAmJiBpZHggPCBzZWMtPnJlbG9jX2NvdW50IC0gMSkKLQl7Ci0JICBhcmVsZW50ICpyID0gc2VjLT5vcmVsb2NhdGlvbltpZHggKyAxXTsKLQotCSAgaWYgKHItPmhvd3RvLT50eXBlID09IFJfU1BBUkNfMTMKLQkgICAgICAmJiByLT5hZGRyZXNzID09IGFkZHIKLQkgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKCgqci0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uKQotCSAgICAgICYmICgqci0+c3ltX3B0cl9wdHIpLT52YWx1ZSA9PSAwKQotCSAgICArK2lkeDsKLQl9Ci0gICAgfQotCi0gIHJlbGFfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHI7Ci0KLSAgcmVsYV9oZHItPnNoX3NpemUgPSByZWxhX2hkci0+c2hfZW50c2l6ZSAqIGNvdW50OwotICByZWxhX2hkci0+Y29udGVudHMgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJlbGFfaGRyLT5zaF9zaXplKTsKLSAgaWYgKHJlbGFfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRmlndXJlIG91dCB3aGV0aGVyIHRoZSByZWxvY2F0aW9ucyBhcmUgUkVMQSBvciBSRUwgcmVsb2NhdGlvbnMuICAqLwotICBpZiAocmVsYV9oZHItPnNoX3R5cGUgIT0gU0hUX1JFTEEpCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogb3JlbG9jYXRpb24gaGFzIHRoZSBkYXRhLCByZWxvY19jb3VudCBoYXMgdGhlIGNvdW50Li4uICovCi0gIG91dGJvdW5kX3JlbG9jYXMgPSAoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSByZWxhX2hkci0+Y29udGVudHM7Ci0KLSAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSBkc3RfcmVsYTsKLSAgICAgIEVsZjY0X0V4dGVybmFsX1JlbGEgKnNyY19yZWxhOwotICAgICAgYXJlbGVudCAqcHRyOwotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgaW50IG47Ci0KLSAgICAgIHB0ciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XTsKLSAgICAgIHNyY19yZWxhID0gb3V0Ym91bmRfcmVsb2NhcyArIGlkeDsKLQotICAgICAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAotCSBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBzaGFyZWQgbGlicmFyeS4KLQkgVGhlIGFkZHJlc3Mgb2YgYSBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQlkc3RfcmVsYS5yX29mZnNldCA9IHB0ci0+YWRkcmVzczsKLSAgICAgIGVsc2UKLQlkc3RfcmVsYS5yX29mZnNldCA9IHB0ci0+YWRkcmVzcyArIHNlYy0+dm1hOwotCi0gICAgICBzeW0gPSAqcHRyLT5zeW1fcHRyX3B0cjsKLSAgICAgIGlmIChzeW0gPT0gbGFzdF9zeW0pCi0JbiA9IGxhc3Rfc3ltX2lkeDsKLSAgICAgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSAmJiBzeW0tPnZhbHVlID09IDApCi0JbiA9IFNUTl9VTkRFRjsKLSAgICAgIGVsc2UKLQl7Ci0JICBsYXN0X3N5bSA9IHN5bTsKLQkgIG4gPSBfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIChhYmZkLCAmc3ltKTsKLQkgIGlmIChuIDwgMCkKLQkgICAgewotCSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGxhc3Rfc3ltX2lkeCA9IG47Ci0JfQotCi0gICAgICBpZiAoKCpwdHItPnN5bV9wdHJfcHRyKS0+dGhlX2JmZCAhPSBOVUxMCi0JICAmJiAoKnB0ci0+c3ltX3B0cl9wdHIpLT50aGVfYmZkLT54dmVjICE9IGFiZmQtPnh2ZWMKLQkgICYmICEgX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgKGFiZmQsIHB0cikpCi0JewotCSAgKmZhaWxlZHAgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKHB0ci0+aG93dG8tPnR5cGUgPT0gUl9TUEFSQ19MTzEwCi0JICAmJiBpZHggPCBzZWMtPnJlbG9jX2NvdW50IC0gMSkKLQl7Ci0JICBhcmVsZW50ICpyID0gc2VjLT5vcmVsb2NhdGlvbltpZHggKyAxXTsKLQotCSAgaWYgKHItPmhvd3RvLT50eXBlID09IFJfU1BBUkNfMTMKLQkgICAgICAmJiByLT5hZGRyZXNzID09IHB0ci0+YWRkcmVzcwotCSAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pCi0JICAgICAgJiYgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlID09IDApCi0JICAgIHsKLQkgICAgICBpZHgrKzsKLQkgICAgICBkc3RfcmVsYS5yX2luZm8KLQkJPSBFTEY2NF9SX0lORk8gKG4sIEVMRjY0X1JfVFlQRV9JTkZPIChyLT5hZGRlbmQsCi0JCQkJCQkgICAgICBSX1NQQVJDX09MTzEwKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZHN0X3JlbGEucl9pbmZvID0gRUxGNjRfUl9JTkZPIChuLCBSX1NQQVJDX0xPMTApOwotCX0KLSAgICAgIGVsc2UKLQlkc3RfcmVsYS5yX2luZm8gPSBFTEY2NF9SX0lORk8gKG4sIHB0ci0+aG93dG8tPnR5cGUpOwotCi0gICAgICBkc3RfcmVsYS5yX2FkZGVuZCA9IHB0ci0+YWRkZW5kOwotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJmRzdF9yZWxhLCBzcmNfcmVsYSk7Ci0gICAgfQotfQotDAotLyogU3BhcmM2NCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3BhcmM2NF9lbGZfYXBwX3JlZwotewotICB1bnNpZ25lZCBjaGFyIGJpbmQ7Ci0gIHVuc2lnbmVkIHNob3J0IHNobmR4OwotICBiZmQgKmFiZmQ7Ci0gIGNoYXIgKm5hbWU7Ci19OwotCi1zdHJ1Y3Qgc3BhcmM2NF9lbGZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgc3RydWN0IHNwYXJjNjRfZWxmX2FwcF9yZWcgYXBwX3JlZ3MgWzRdOwotfTsKLQotLyogR2V0IHRoZSBTcGFyYzY0IEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgc3BhcmM2NF9lbGZfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IHNwYXJjNjRfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLSAgCi0vKiBDcmVhdGUgYSBTcGFyYzY0IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1zcGFyYzY0X2VsZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3Qgc3BhcmM2NF9lbGZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3Qgc3BhcmM2NF9lbGZfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNwYXJjNjRfZWxmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHNwYXJjNjRfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgICBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotDAotLyogVXRpbGl0eSBmb3IgcGVyZm9ybWluZyB0aGUgc3RhbmRhcmQgaW5pdGlhbCB3b3JrIG9mIGFuIGluc3RydWN0aW9uCi0gICByZWxvY2F0aW9uLgotICAgKlBSRUxPQ0FUSU9OIHdpbGwgY29udGFpbiB0aGUgcmVsb2NhdGVkIGl0ZW0uCi0gICAqUElOU04gd2lsbCBjb250YWluIHRoZSBpbnN0cnVjdGlvbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCi0gICBJZiB0aGUgcmVzdWx0IGlzIGBiZmRfcmVsb2Nfb3RoZXInIHRoZSBjYWxsZXIgY2FuIGNvbnRpbnVlIHdpdGgKLSAgIHBlcmZvcm1pbmcgdGhlIHJlbG9jYXRpb24uICBPdGhlcndpc2UgaXQgbXVzdCBzdG9wIGFuZCByZXR1cm4gdGhlCi0gICB2YWx1ZSB0byBpdHMgY2FsbGVyLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaW5pdF9pbnNuX3JlbG9jIChhYmZkLAotCQkgcmVsb2NfZW50cnksCi0JCSBzeW1ib2wsCi0JCSBkYXRhLAotCQkgaW5wdXRfc2VjdGlvbiwKLQkJIG91dHB1dF9iZmQsCi0JCSBwcmVsb2NhdGlvbiwKLQkJIHBpbnNuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBiZmRfdm1hICpwcmVsb2NhdGlvbjsKLSAgICAgYmZkX3ZtYSAqcGluc247Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgKCEgaG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogVGhpcyB3b3JrcyBiZWNhdXNlIHBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIHJlbG9jYXRpb24gPSAoc3ltYm9sLT52YWx1ZQotCQkrIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotCi0gICpwcmVsb2NhdGlvbiA9IHJlbG9jYXRpb247Ci0gICpwaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX290aGVyOwotfQotCi0vKiBGb3IgdW5zdXBwb3J0ZWQgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX25vdHN1cF9yZWxvYyAoYWJmZCwKLQkJCXJlbG9jX2VudHJ5LAotCQkJc3ltYm9sLAotCQkJZGF0YSwKLQkJCWlucHV0X3NlY3Rpb24sCi0JCQlvdXRwdXRfYmZkLAotCQkJZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotfQotCi0vKiBIYW5kbGUgdGhlIFdESVNQMTYgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfdm1hIGluc247Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzdGF0dXM7Ci0KLSAgc3RhdHVzID0gaW5pdF9pbnNuX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsICZyZWxvY2F0aW9uLCAmaW5zbik7Ci0gIGlmIChzdGF0dXMgIT0gYmZkX3JlbG9jX290aGVyKQotICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgaW5zbiA9IChpbnNuICYgfjB4MzAzZmZmKSB8ICgoKChyZWxvY2F0aW9uID4+IDIpICYgMHhjMDAwKSA8PCA2KQotCQkJICAgICAgIHwgKChyZWxvY2F0aW9uID4+IDIpICYgMHgzZmZmKSk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIGlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPCAtIDB4NDAwMDAKLSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+IDB4M2ZmZmYpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgZWxzZQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgSElYMjIgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGFyY19lbGZfaGl4MjJfcmVsb2MgKGFiZmQsCi0JCSAgICAgICByZWxvY19lbnRyeSwKLQkJICAgICAgIHN5bWJvbCwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW5zbjsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKLQotICBzdGF0dXMgPSBpbml0X2luc25fcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgJnJlbG9jYXRpb24sICZpbnNuKTsKLSAgaWYgKHN0YXR1cyAhPSBiZmRfcmVsb2Nfb3RoZXIpCi0gICAgcmV0dXJuIHN0YXR1czsKLQotICByZWxvY2F0aW9uIF49IE1JTlVTX09ORTsKLSAgaW5zbiA9IChpbnNuICYgfjB4M2ZmZmZmKSB8ICgocmVsb2NhdGlvbiA+PiAxMCkgJiAweDNmZmZmZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIGlmICgocmVsb2NhdGlvbiAmIH4gKGJmZF92bWEpIDB4ZmZmZmZmZmYpICE9IDApCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgZWxzZQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTE9YMTAgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGFyY19lbGZfbG94MTBfcmVsb2MgKGFiZmQsCi0JCSAgICAgICByZWxvY19lbnRyeSwKLQkJICAgICAgIHN5bWJvbCwKLQkJICAgICAgIGRhdGEsCi0JCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgICAgb3V0cHV0X2JmZCwKLQkJICAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW5zbjsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKLQotICBzdGF0dXMgPSBpbml0X2luc25fcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgJnJlbG9jYXRpb24sICZpbnNuKTsKLSAgaWYgKHN0YXR1cyAhPSBiZmRfcmVsb2Nfb3RoZXIpCi0gICAgcmV0dXJuIHN0YXR1czsKLQotICBpbnNuID0gKGluc24gJiB+MHgxZmZmKSB8IDB4MWMwMCB8IChyZWxvY2F0aW9uICYgMHgzZmYpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotDAotLyogUExUL0dPVCBzdHVmZiAqLwotCi0vKiBCb3RoIHRoZSBoZWFkZXJzIGFuZCB0aGUgZW50cmllcyBhcmUgaWNhY2hlIGFsaWduZWQuICAqLwotI2RlZmluZSBQTFRfRU5UUllfU0laRQkJMzIKLSNkZWZpbmUgUExUX0hFQURFUl9TSVpFCQkoNCAqIFBMVF9FTlRSWV9TSVpFKQotI2RlZmluZSBMQVJHRV9QTFRfVEhSRVNIT0xECTMyNzY4Ci0jZGVmaW5lIEdPVF9SRVNFUlZFRF9FTlRSSUVTCTEKLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvc3BhcmN2OS9sZC5zby4xIgotCi0KLS8qIEZpbGwgaW4gdGhlIC5wbHQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zcGFyYzY0X2VsZl9idWlsZF9wbHQgKG91dHB1dF9iZmQsIGNvbnRlbnRzLCBuZW50cmllcykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpjb250ZW50czsKLSAgICAgaW50IG5lbnRyaWVzOwotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbm9wID0gMHgwMTAwMDAwMDsKLSAgaW50IGksIGo7Ci0gIAotICAvKiBUaGUgZmlyc3QgZm91ciBlbnRyaWVzIGFyZSByZXNlcnZlZCwgYW5kIGFyZSBpbml0aWFsbHkgdW5kZWZpbmVkLgotICAgICBXZSBmaWxsIHRoZW0gd2l0aCBgaWxsdHJhcCAwJyB0byBmb3JjZSBsZC5zbyB0byBkbyBzb21ldGhpbmcuICAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBQTFRfSEVBREVSX1NJWkUvNDsgKytpKQotICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGNvbnRlbnRzK2kqNCk7Ci0KLSAgLyogVGhlIGZpcnN0IDMyNzY4IGVudHJpZXMgYXJlIGNsb3NlIGVub3VnaCB0byBwbHQxIHRvIGdldCB0aGVyZSB2aWEKLSAgICAgYSBzdHJhaWdodCBicmFuY2guICAqLwotCi0gIGZvciAoaSA9IDQ7IGkgPCBMQVJHRV9QTFRfVEhSRVNIT0xEICYmIGkgPCBuZW50cmllczsgKytpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmVudHJ5ID0gY29udGVudHMgKyBpICogUExUX0VOVFJZX1NJWkU7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2V0aGksIGJhOwotCi0gICAgICAvKiBzZXRoaSAoLiAtIHBsdDApLCAlZzEgKi8KLSAgICAgIHNldGhpID0gMHgwMzAwMDAwMCB8IChpICogUExUX0VOVFJZX1NJWkUpOwotCi0gICAgICAvKiBiYSxhLHB0ICV4Y2MsIHBsdDEgKi8KLSAgICAgIGJhID0gMHgzMDY4MDAwMCB8ICgoKGNvbnRlbnRzK1BMVF9FTlRSWV9TSVpFKSAtIChlbnRyeSs0KSkgLyA0ICYgMHg3ZmZmZik7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHNldGhpLCBlbnRyeSk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBiYSwgZW50cnkrNCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzgpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSsxMik7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzE2KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMjApOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSsyNCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzI4KTsKLSAgICB9Ci0KLSAgLyogTm93IHRoZSB0cmlja3kgYml0LiAgRW50cmllcyAzMjc2OCBhbmQgaGlnaGVyIGFyZSBncm91cGVkIGluIGJsb2NrcyBvZgotICAgICAxNjA6IDE2MCBlbnRyaWVzIGFuZCAxNjAgcG9pbnRlcnMuICBUaGlzIGlzIHRvIHNlcGFyYXRlIGNvZGUgZnJvbSBkYXRhLAotICAgICB3aGljaCBpcyBtdWNoIGZyaWVuZGxpZXIgb24gdGhlIGNhY2hlLiAgKi8KLSAgCi0gIGZvciAoOyBpIDwgbmVudHJpZXM7IGkgKz0gMTYwKQotICAgIHsKLSAgICAgIGludCBibG9jayA9IChpICsgMTYwIDw9IG5lbnRyaWVzID8gMTYwIDogbmVudHJpZXMgLSBpKTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBibG9jazsgKytqKQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgKmVudHJ5LCAqcHRyOwotCSAgdW5zaWduZWQgaW50IGxkeDsKLQotCSAgZW50cnkgPSBjb250ZW50cyArIGkqUExUX0VOVFJZX1NJWkUgKyBqKjQqNjsKLQkgIHB0ciA9IGNvbnRlbnRzICsgaSpQTFRfRU5UUllfU0laRSArIGJsb2NrKjQqNiArIGoqODsKLQotCSAgLyogbGR4IFslbzcgKyBwdHIgLSBlbnRyeSs0XSwgJWcxICovCi0JICBsZHggPSAweGMyNWJlMDAwIHwgKChwdHIgLSBlbnRyeSs0KSAmIDB4MWZmZik7Ci0KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDB4OGExMDAwMGYsIGVudHJ5KTsgICAgLyogbW92ICVvNywlZzUgKi8KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDB4NDAwMDAwMDIsIGVudHJ5KzQpOyAgLyogY2FsbCAuKzggKi8KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrOCk7ICAgICAgICAgLyogbm9wICovCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBsZHgsIGVudHJ5KzEyKTsgICAgICAgIC8qIGxkeCBbJW83K1BdLCVnMSAqLwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg4M2MzYzAwMSwgZW50cnkrMTYpOyAvKiBqbXBsICVvNyslZzEsJWcxICovCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAweDllMTAwMDA1LCBlbnRyeSsyMCk7IC8qIG1vdiAlZzUsJW83ICovCi0KLQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIGNvbnRlbnRzIC0gKGVudHJ5KzQpLCBwdHIpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJldHVybiB0aGUgb2Zmc2V0IG9mIGEgcGFydGljdWxhciBwbHQgZW50cnkgd2l0aGluIHRoZSAucGx0IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCAoaW5kZXgpCi0gICAgIGludCBpbmRleDsKLXsKLSAgaW50IGJsb2NrLCBvZnM7Ci0KLSAgaWYgKGluZGV4IDwgTEFSR0VfUExUX1RIUkVTSE9MRCkKLSAgICByZXR1cm4gaW5kZXggKiBQTFRfRU5UUllfU0laRTsKLQotICAvKiBTZWUgYWJvdmUgZm9yIGRldGFpbHMuICAqLwotCi0gIGJsb2NrID0gKGluZGV4IC0gTEFSR0VfUExUX1RIUkVTSE9MRCkgLyAxNjA7Ci0gIG9mcyA9IChpbmRleCAtIExBUkdFX1BMVF9USFJFU0hPTEQpICUgMTYwOwotCi0gIHJldHVybiAoKGJmZF92bWEpKExBUkdFX1BMVF9USFJFU0hPTEQgKyBibG9jayoxNjApICogUExUX0VOVFJZX1NJWkUKLQkgICsgb2ZzICogNio0KTsKLX0KLQotc3RhdGljIGJmZF92bWEKLXNwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0IChpbmRleCwgbWF4KQotICAgICBpbnQgaW5kZXgsIG1heDsKLXsKLSAgaW50IGJsb2NrLCBvZnMsIGxhc3Q7Ci0KLSAgQkZEX0FTU0VSVChpbmRleCA+PSBMQVJHRV9QTFRfVEhSRVNIT0xEKTsKLQotICAvKiBTZWUgYWJvdmUgZm9yIGRldGFpbHMuICAqLwotCi0gIGJsb2NrID0gKCgoaW5kZXggLSBMQVJHRV9QTFRfVEhSRVNIT0xEKSAvIDE2MCkgKiAxNjApCi0JICArIExBUkdFX1BMVF9USFJFU0hPTEQ7Ci0gIG9mcyA9IGluZGV4IC0gYmxvY2s7Ci0gIGlmIChibG9jayArIDE2MCA+IG1heCkKLSAgICBsYXN0ID0gKG1heCAtIExBUkdFX1BMVF9USFJFU0hPTEQpICUgMTYwOwotICBlbHNlCi0gICAgbGFzdCA9IDE2MDsKLQotICByZXR1cm4gKGJsb2NrICogUExUX0VOVFJZX1NJWkUKLQkgICsgbGFzdCAqIDYqNAotCSAgKyBvZnMgKiA4KTsKLX0KLQotCi0MCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlIHx8ICEoc2VjLT5mbGFncyAmIFNFQ19BTExPQykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpOwotCi0gIHNnb3QgPSBOVUxMOwotICBzcmVsZ290ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEY2NF9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICBzd2l0Y2ggKEVMRjY0X1JfVFlQRV9JRCAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JY2FzZSBSX1NQQVJDX0dPVDEzOgotCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTCAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDMpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF92bWEpOwotCQkgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7Ci0JCSAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKLQkJICAgIGxvY2FsX2dvdF9vZmZzZXRzW2ldID0gKGJmZF92bWEpIC0xOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCQl9Ci0JICAgIH0KLQotCSAgc2dvdC0+X3Jhd19zaXplICs9IDg7Ci0KLSNpZiAwCi0JICAvKiBEb2Vzbid0IHdvcmsgZm9yIDY0LWJpdCAtZlBJQywgc2luY2Ugc2V0aGkvb3IgYnVpbGRzCi0JICAgICB1bnNpZ25lZCBudW1iZXJzLiAgSWYgd2UgcGVybWl0IG91cnNlbHZlcyB0byBtb2RpZnkKLQkgICAgIGNvZGUgc28gd2UgZ2V0IHNldGhpL3hvciwgdGhpcyBjb3VsZCB3b3JrLgotCSAgICAgUXVlc3Rpb246IGRvIHdlIGNvbnNpZGVyIGNvbmRpdGlvbmFsbHkgcmUtZW5hYmxpbmcKLSAgICAgICAgICAgICB0aGlzIGZvciAtZnBpYywgb25jZSB3ZSBrbm93IGFib3V0IG9iamVjdCBjb2RlIG1vZGVscz8gICovCi0JICAvKiBJZiB0aGUgLmdvdCBzZWN0aW9uIGlzIG1vcmUgdGhhbiAweDEwMDAgYnl0ZXMsIHdlIGFkZAotCSAgICAgMHgxMDAwIHRvIHRoZSB2YWx1ZSBvZiBfR0xPQkFMX09GRlNFVF9UQUJMRV8sIHNvIHRoYXQgMTMKLQkgICAgIGJpdCByZWxvY2F0aW9ucyBoYXZlIGEgZ3JlYXRlciBjaGFuY2Ugb2Ygd29ya2luZy4gICovCi0JICBpZiAoc2dvdC0+X3Jhd19zaXplID49IDB4MTAwMAotCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZSA9PSAwKQotCSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWUgPSAweDEwMDA7Ci0jZW5kaWYKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCWNhc2UgUl9TUEFSQ19QTFQzMjoKLQljYXNlIFJfU1BBUkNfSElQTFQyMjoKLQljYXNlIFJfU1BBUkNfTE9QTFQxMDoKLQljYXNlIFJfU1BBUkNfUENQTFQzMjoKLQljYXNlIFJfU1BBUkNfUENQTFQyMjoKLQljYXNlIFJfU1BBUkNfUENQTFQxMDoKLQljYXNlIFJfU1BBUkNfUExUNjQ6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKLSAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aXRob3V0Ci0gICAgICAgICAgICAgbGlua2luZyBpbiBhbnkgZHluYW1pYyBvYmplY3RzLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0Ci0gICAgICAgICAgICAgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGFmdGVyIGFsbC4gICovCi0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGhhdmUgYSBwcm9jZWR1cmUgbGlua2FnZQotICAgICAgICAgICAgICAgICB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbCBzeW1ib2wuICAqLwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1BDMTA6Ci0JY2FzZSBSX1NQQVJDX1BDMjI6Ci0JY2FzZSBSX1NQQVJDX1BDX0hIMjI6Ci0JY2FzZSBSX1NQQVJDX1BDX0hNMTA6Ci0JY2FzZSBSX1NQQVJDX1BDX0xNMjI6Ci0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ19ESVNQODoKLQljYXNlIFJfU1BBUkNfRElTUDE2OgotCWNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JY2FzZSBSX1NQQVJDX0RJU1A2NDoKLQljYXNlIFJfU1BBUkNfV0RJU1AzMDoKLQljYXNlIFJfU1BBUkNfV0RJU1AyMjoKLQljYXNlIFJfU1BBUkNfV0RJU1AxOToKLQljYXNlIFJfU1BBUkNfV0RJU1AxNjoKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfODoKLQljYXNlIFJfU1BBUkNfMTY6Ci0JY2FzZSBSX1NQQVJDXzMyOgotCWNhc2UgUl9TUEFSQ19ISTIyOgotCWNhc2UgUl9TUEFSQ18yMjoKLQljYXNlIFJfU1BBUkNfMTM6Ci0JY2FzZSBSX1NQQVJDX0xPMTA6Ci0JY2FzZSBSX1NQQVJDX1VBMzI6Ci0JY2FzZSBSX1NQQVJDXzEwOgotCWNhc2UgUl9TUEFSQ18xMToKLQljYXNlIFJfU1BBUkNfNjQ6Ci0JY2FzZSBSX1NQQVJDX09MTzEwOgotCWNhc2UgUl9TUEFSQ19ISDIyOgotCWNhc2UgUl9TUEFSQ19ITTEwOgotCWNhc2UgUl9TUEFSQ19MTTIyOgotCWNhc2UgUl9TUEFSQ183OgotCWNhc2UgUl9TUEFSQ181OgotCWNhc2UgUl9TUEFSQ182OgotCWNhc2UgUl9TUEFSQ19ISVgyMjoKLQljYXNlIFJfU1BBUkNfTE9YMTA6Ci0JY2FzZSBSX1NQQVJDX0g0NDoKLQljYXNlIFJfU1BBUkNfTTQ0OgotCWNhc2UgUl9TUEFSQ19MNDQ6Ci0JY2FzZSBSX1NQQVJDX1VBNjQ6Ci0JY2FzZSBSX1NQQVJDX1VBMTY6Ci0JICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlIHJlbG9jcwotCSAgICAgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYyBzZWN0aW9uIGluCi0JICAgICBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIHJlbG9jLiAKLQotCSAgICAgQnV0IGRvbid0IGRvIHRoaXMgZm9yIGRlYnVnZ2luZyBzZWN0aW9ucyAtLSB0aGlzIHNob3dzIHVwCi0JICAgICB3aXRoIERXQVJGMiAtLSBmaXJzdCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBsb2FkZWQsIGFuZAotCSAgICAgc2Vjb25kIGJlY2F1c2UgRFdBUkYgc2V6IHRoZSBkZWJ1ZyBpbmZvIGlzIG5vdCB0byBiZQotCSAgICAgYmlhc2VkIGJ5IHRoZSBsb2FkIGFkZHJlc3MuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZCAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykpCi0JICAgIHsKLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChhYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQotCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0JCSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1JFR0lTVEVSOgotCSAgLyogTm90aGluZyB0byBkby4gICovCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikoXygiJXM6IGNoZWNrX3JlbG9jczogdW5oYW5kbGVkIHJlbG9jIHR5cGUgJWQiKSwKLQkJCQliZmRfZ2V0X2ZpbGVuYW1lKGFiZmQpLAotCQkJCUVMRjY0X1JfVFlQRV9JRCAocmVsLT5yX2luZm8pKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgdXNlIGl0IGZvciBTVFRfUkVHSVNURVIgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3A7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYmZkX3ZtYSAqdmFscDsKLXsKLSAgc3RhdGljIGNoYXIgKnN0dF90eXBlc1tdID0geyAiTk9UWVBFIiwgIk9CSkVDVCIsICJGVU5DVElPTiIgfTsKLQotICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1JFR0lTVEVSKQotICAgIHsKLSAgICAgIGludCByZWc7Ci0gICAgICBzdHJ1Y3Qgc3BhcmM2NF9lbGZfYXBwX3JlZyAqcDsKLSAgICAgIAotICAgICAgcmVnID0gKGludClzeW0tPnN0X3ZhbHVlOwotICAgICAgc3dpdGNoIChyZWcgJiB+MSkKLQl7Ci0JY2FzZSAyOiByZWcgLT0gMjsgYnJlYWs7Ci0JY2FzZSA2OiByZWcgLT0gNDsgYnJlYWs7Ci0JZGVmYXVsdDoKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgIChfKCIlczogT25seSByZWdpc3RlcnMgJSVnWzIzNjddIGNhbiBiZSBkZWNsYXJlZCB1c2luZyBTVFRfUkVHSVNURVIiKSwKLSAgICAgICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBhYmZkLT54dmVjCi0JICB8fCAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgICAgICB7Ci0JICAvKiBTVFRfUkVHSVNURVIgb25seSB3b3JrcyB3aGVuIGxpbmtpbmcgYW4gZWxmNjRfc3BhcmMgb2JqZWN0LgotCSAgICAgSWYgU1RUX1JFR0lTVEVSIGNvbWVzIGZyb20gYSBkeW5hbWljIG9iamVjdCwgZG9uJ3QgcHV0IGl0IGludG8KLQkgICAgIHRoZSBvdXRwdXQgYmZkLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgcmVjaGVjayBpdC4gICovCi0JICAqbmFtZXAgPSBOVUxMOwotCSAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgcCA9IHNwYXJjNjRfZWxmX2hhc2hfdGFibGUoaW5mbyktPmFwcF9yZWdzICsgcmVnOwotCi0gICAgICBpZiAocC0+bmFtZSAhPSBOVUxMICYmIHN0cmNtcCAocC0+bmFtZSwgKm5hbWVwKSkKLQl7Ci0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgICAgICAoXygiUmVnaXN0ZXIgJSVnJWQgdXNlZCBpbmNvbXBhdGlibHk6ICIKLSAgICAgICAgICAgICAgICJwcmV2aW91c2x5IGRlY2xhcmVkIGluICVzIHRvICVzLCBpbiAlcyByZWRlZmluZWQgdG8gJXMiKSwKLSAgICAgICAgICAgICAoaW50KXN5bS0+c3RfdmFsdWUsCi0gICAgICAgICAgICAgYmZkX2dldF9maWxlbmFtZSAocC0+YWJmZCksICpwLT5uYW1lID8gcC0+bmFtZSA6ICIjc2NyYXRjaCIsCi0gICAgICAgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICoqbmFtZXAgPyAqbmFtZXAgOiAiI3NjcmF0Y2giKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwLT5uYW1lID09IE5VTEwpCi0JewotCSAgaWYgKCoqbmFtZXApCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQkgICAgICAKLQkgICAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JCWJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCAqbmFtZXAsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJewotCQkgIHVuc2lnbmVkIGNoYXIgdHlwZSA9IGgtPnR5cGU7Ci0KLQkJICBpZiAodHlwZSA+IFNUVF9GVU5DKSB0eXBlID0gMDsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCJTeW1ib2wgYCVzJyBoYXMgZGlmZmVyaW5nIHR5cGVzOiAiCi0JCSAgICAgICAicHJldmlvdXNseSAlcywgUkVHSVNURVIgaW4gJXMiKSwKLQkJICAgICAqbmFtZXAsIHN0dF90eXBlcyBbdHlwZV0sIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHAtPm5hbWUgPSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkgICBzdHJsZW4gKCpuYW1lcCkgKyAxKTsKLQkgICAgICBpZiAoIXAtPm5hbWUpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIHN0cmNweSAocC0+bmFtZSwgKm5hbWVwKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBwLT5uYW1lID0gIiI7Ci0JICBwLT5iaW5kID0gRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbyk7Ci0JICBwLT5hYmZkID0gYWJmZDsKLQkgIHAtPnNobmR4ID0gc3ltLT5zdF9zaG5keDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHAtPmJpbmQgPT0gU1RCX1dFQUsKLQkgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSA9PSBTVEJfR0xPQkFMKQotCSAgICB7Ci0JICAgICAgcC0+YmluZCA9IFNUQl9HTE9CQUw7Ci0JICAgICAgcC0+YWJmZCA9IGFiZmQ7Ci0JICAgIH0KLQl9Ci0gICAgICAqbmFtZXAgPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlIGlmICghICpuYW1lcCB8fCAhICoqbmFtZXApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHN0cnVjdCBzcGFyYzY0X2VsZl9hcHBfcmVnICpwOwotCi0gICAgICBwID0gc3BhcmM2NF9lbGZfaGFzaF90YWJsZShpbmZvKS0+YXBwX3JlZ3M7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBwKyspCi0JaWYgKHAtPm5hbWUgIT0gTlVMTCAmJiAhIHN0cmNtcCAocC0+bmFtZSwgKm5hbWVwKSkKLQkgIHsKLQkgICAgdW5zaWduZWQgY2hhciB0eXBlID0gRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbyk7Ci0KLQkgICAgaWYgKHR5cGUgPiBTVFRfRlVOQykgdHlwZSA9IDA7Ci0JICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgIChfKCJTeW1ib2wgYCVzJyBoYXMgZGlmZmVyaW5nIHR5cGVzOiAiCi0JCSAiUkVHSVNURVIgaW4gJXMsICVzIGluICVzIiksCi0JICAgICAgICpuYW1lcCwgYmZkX2dldF9maWxlbmFtZSAocC0+YWJmZCksIHN0dF90eXBlcyBbdHlwZV0sCi0JICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBlbWl0aW5nIFNUVF9SRUdJU1RFUiBzeW1ib2xzCi0gICB3aGljaCB3ZSBjYW5ub3QgZWFzaWx5IGtlZXAgaW4gdGhlIHN5bWJvbCBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX291dHB1dF9hcmNoX3N5bXMgKG91dHB1dF9iZmQsIGluZm8sIGZpbmZvLCBmdW5jKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBQVFIgZmluZm87Ci0gICAgIGJvb2xlYW4gKCpmdW5jKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwKLQkJCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKikpOwotewotICBpbnQgcmVnOwotICBzdHJ1Y3Qgc3BhcmM2NF9lbGZfYXBwX3JlZyAqYXBwX3JlZ3MgPQotICAgIHNwYXJjNjRfZWxmX2hhc2hfdGFibGUoaW5mbyktPmFwcF9yZWdzOwotICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLQotICAvKiBXZSBhcnJhbmdlZCBpbiBzaXplX2R5bmFtaWNfc2VjdGlvbnMgdG8gcHV0IHRoZSBTVFRfUkVHSVNURVIgZW50cmllcwotICAgICBhdCB0aGUgZW5kIG9mIHRoZSBkeW5sb2NhbCBsaXN0LCBzbyB0aGV5IGNhbWUgYXQgdGhlIGVuZCBvZiB0aGUgbG9jYWwKLSAgICAgc3ltYm9scyBpbiB0aGUgc3ltdGFiLiAgRXhjZXB0IHRoYXQgdGhleSBhcmVuJ3QgU1RCX0xPQ0FMLCBzbyB3ZSBuZWVkCi0gICAgIHRvIGJhY2sgdXAgc3ltdGFiLT5zaF9pbmZvLiAgKi8KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlubG9jYWwpCi0gICAgewotICAgICAgYmZkICogZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gICAgICBhc2VjdGlvbiAqZHluc3ltc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19sb2NhbF9keW5hbWljX2VudHJ5ICplOwotCi0gICAgICBmb3IgKGUgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmxvY2FsOyBlIDsgZSA9IGUtPm5leHQpCi0JaWYgKGUtPmlucHV0X2luZHggPT0gLTEpCi0JICBicmVhazsKLSAgICAgIGlmIChlKQotCXsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKGR5bnN5bXNlYy0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvCi0JICAgID0gZS0+ZHluaW5keDsKLQl9Ci0gICAgfQotCi0gIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yIChyZWcgPSAwOyByZWcgPCA0OyByZWcrKykKLSAgICBpZiAoYXBwX3JlZ3MgW3JlZ10ubmFtZSAhPSBOVUxMKQotICAgICAgewotCWlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICYmIGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+a2VlcF9oYXNoLAotCQkJCWFwcF9yZWdzIFtyZWddLm5hbWUsCi0JCQkJZmFsc2UsIGZhbHNlKSA9PSBOVUxMKQotCSAgY29udGludWU7Ci0KLQlzeW0uc3RfdmFsdWUgPSByZWcgPCAyID8gcmVnICsgMiA6IHJlZyArIDQ7Ci0Jc3ltLnN0X3NpemUgPSAwOwotCXN5bS5zdF9vdGhlciA9IDA7Ci0Jc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoYXBwX3JlZ3MgW3JlZ10uYmluZCwgU1RUX1JFR0lTVEVSKTsKLQlzeW0uc3Rfc2huZHggPSBhcHBfcmVncyBbcmVnXS5zaG5keDsKLQlpZiAoISAoKmZ1bmMpIChmaW5mbywgYXBwX3JlZ3MgW3JlZ10ubmFtZSwgJnN5bSwKLQkJICAgICAgIHN5bS5zdF9zaG5keCA9PSBTSE5fQUJTCi0JCQkgPyBiZmRfYWJzX3NlY3Rpb25fcHRyIDogYmZkX3VuZF9zZWN0aW9uX3B0cikpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQKLXNwYXJjNjRfZWxmX2dldF9zeW1ib2xfdHlwZSAoZWxmX3N5bSwgdHlwZSkKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqIGVsZl9zeW07Ci0gICAgIGludCB0eXBlOwotewotICBpZiAoRUxGX1NUX1RZUEUgKGVsZl9zeW0tPnN0X2luZm8pID09IFNUVF9SRUdJU1RFUikKLSAgICByZXR1cm4gU1RUX1JFR0lTVEVSOwotICBlbHNlCi0gICAgcmV0dXJuIHR5cGU7Ci19Ci0KLS8qIEEgU1RCX0dMT0JBTCxTVFRfUkVHSVNURVIgc3ltYm9sIHNob3VsZCBiZSBCU0ZfR0xPQkFMCi0gICBldmVuIGluIFNITl9VTkRFRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXNwYXJjNjRfZWxmX3N5bWJvbF9wcm9jZXNzaW5nIChhYmZkLCBhc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKmFzeW07Ci17Ci0gIGVsZl9zeW1ib2xfdHlwZSAqZWxmc3ltOwotCi0gIGVsZnN5bSA9IChlbGZfc3ltYm9sX3R5cGUgKikgYXN5bTsKLSAgaWYgKGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvCi0gICAgICA9PSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1JFR0lTVEVSKSkKLSAgICB7Ci0gICAgICBhc3ltLT5mbGFncyB8PSBCU0ZfR0xPQkFMOwotICAgIH0KLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKLSAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIKLSAgICAgKGFsdGhvdWdoIHdlIGNvdWxkIGFjdHVhbGx5IGRvIGl0IGhlcmUpLiAgVGhlIFNUVF9OT1RZUEUKLSAgICAgY29uZGl0aW9uIGlzIGEgaGFjayBzcGVjaWZpY2FsbHkgZm9yIHRoZSBPcmFjbGUgbGlicmFyaWVzCi0gICAgIGRlbGl2ZXJlZCBmb3IgU29sYXJpczsgZm9yIHNvbWUgaW5leHBsaWNhYmxlIHJlYXNvbiwgdGhleSBkZWZpbmUKLSAgICAgc29tZSBvZiB0aGVpciBmdW5jdGlvbnMgYXMgU1RUX05PVFlQRSB3aGVuIHRoZXkgcmVhbGx5IHNob3VsZCBiZQotICAgICBTVFRfRlVOQy4gICovCi0gIGlmIChoLT50eXBlID09IFNUVF9GVU5DCi0gICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwCi0gICAgICB8fCAoaC0+dHlwZSA9PSBTVFRfTk9UWVBFCi0JICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQl7Ci0JICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFdQTFQzMCByZWxvYyBpbiBhbiBpbnB1dAotICAgICAgICAgICAgIGZpbGUsIGJ1dCBub25lIG9mIHRoZSBpbnB1dCBmaWxlcyB3ZXJlIGR5bmFtaWMgb2JqZWN0cy4KLSAgICAgICAgICAgICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZCBhCi0gICAgICAgICAgICAgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFdESVNQMzAKLSAgICAgICAgICAgICByZWxvYyBpbnN0ZWFkLiAgKi8KLQkgIEJGRF9BU1NFUlQgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBmb3VyIGJpdCBpbiAucGx0IGlzIHJlc2VydmVkLiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgPSBQTFRfSEVBREVSX1NJWkU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCi0JIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcwotCSBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotCSBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAotCSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0JfQotCi0gICAgICAvKiBUbyBzaW1wbGlmeSBtYXR0ZXJzIGxhdGVyLCBqdXN0IHN0b3JlIHRoZSBwbHQgaW5kZXggaGVyZS4gICovCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplIC8gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBUaGUgZmlyc3QgcGx0IGVudHJpZXMgYXJlIHJlc2VydmVkLCBhbmQgdGhlIHJlbG9jYXRpb25zIG11c3QKLQkgcGFpciB1cCBleGFjdGx5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gKFBMVF9IRUFERVJfU0laRS9QTFRfRU5UUllfU0laRQotCQkJICogc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKSk7Ci0KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCi0gICAgICAvKiBUaGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgc2l6ZSBpcyBib3VuZGVkIGJ5IHRoZSBtYWduaXR1ZGUKLQkgb2YgdGhlIG9mZnNldCB3ZSBjYW4gZGVzY3JpYmUgaW4gdGhlIGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPj0gKGJmZF92bWEpMSA8PCAzMikKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX1NQQVJDX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIKLSAgICAgdG8gY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQotICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKLSAgICAgLnJlbC5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gIDE2LWJ5dGVzIGlzIHRoZSBzaXplCi0gICAgIG9mIHRoZSBsYXJnZXN0IHR5cGUgdGhhdCByZXF1aXJlcyBoYXJkIGFsaWdubWVudCAtLSBsb25nIGRvdWJsZS4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDQpCi0gICAgcG93ZXJfb2ZfdHdvID0gNDsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLwotICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotICBib29sZWFuIHJlbHBsdDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWxhLmdvdCBzZWN0aW9uLgotICAgICAgICAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotICAgICAgICAgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbGEuZ290LAotICAgICAgICAgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgIGJlbG93LiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcmVsdGV4dCA9IGZhbHNlOwotICByZWxwbHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsLnBsdC4gIFdlIG11c3QgY3JlYXRlIGl0IGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSBpdCBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpvdXRuYW1lOwotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KLQkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOwotCSAgICAgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwKQotCQlyZWx0ZXh0ID0gdHJ1ZTsKLQotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsYS5wbHQiKSA9PSAwKQotCQlyZWxwbHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSAhPSAwCi0JICAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgIT0gMCkKLQl7Ci0JICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJpcCkKLQl7Ci0JICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKHMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgWmVybyB0aGUgbWVtb3J5Ci0JIGZvciB0aGUgYmVuZWZpdCBvZiAucmVsYS5wbHQsIHdoaWNoIGhhcyA0IHVudXNlZCBlbnRyaWVzCi0JIGF0IHRoZSBiZWdpbm5pbmcsIGFuZCB3ZSBkb24ndCB3YW50IGdhcmJhZ2UuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaW50IHJlZzsKLSAgICAgIHN0cnVjdCBzcGFyYzY0X2VsZl9hcHBfcmVnICogYXBwX3JlZ3M7Ci0gICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpkeW5zdHI7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqZWh0ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pOwotCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWxwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQSwgMCkKLQkgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCi0JICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJICAgIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogQWRkIGR5bmFtaWMgU1RUX1JFR0lTVEVSIHN5bWJvbHMgYW5kIGNvcnJlc3BvbmRpbmcgRFRfU1BBUkNfUkVHSVNURVIKLQkgZW50cmllcyBpZiBuZWVkZWQuICAqLwotICAgICAgYXBwX3JlZ3MgPSBzcGFyYzY0X2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+YXBwX3JlZ3M7Ci0gICAgICBkeW5zdHIgPSBlaHQtPmR5bnN0cjsKLQotICAgICAgZm9yIChyZWcgPSAwOyByZWcgPCA0OyByZWcrKykKLQlpZiAoYXBwX3JlZ3MgW3JlZ10ubmFtZSAhPSBOVUxMKQotCSAgewotCSAgICBzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqZW50cnksICplOwotCSAgICAgIAotCSAgICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NQQVJDX1JFR0lTVEVSLCAwKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgZW50cnkgPSAoc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKikKLQkgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLCBzaXplb2YgKCplbnRyeSkpOwotCSAgICBpZiAoZW50cnkgPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgLyogV2UgY2hlYXQgaGVyZSBhIGxpdHRsZSBiaXQ6IHRoZSBzeW1ib2wgd2lsbCBub3QgYmUgbG9jYWwsIHNvIHdlCi0JICAgICAgIHB1dCBpdCBhdCB0aGUgZW5kIG9mIHRoZSBkeW5sb2NhbCBsaW5rZWQgbGlzdC4gIFdlIHdpbGwgZml4IGl0Ci0JICAgICAgIGxhdGVyIG9uLCBhcyB3ZSBoYXZlIHRvIGZpeCBvdGhlciBmaWVsZHMgYW55d2F5LiAgKi8KLQkgICAgZW50cnktPmlzeW0uc3RfdmFsdWUgPSByZWcgPCAyID8gcmVnICsgMiA6IHJlZyArIDQ7Ci0JICAgIGVudHJ5LT5pc3ltLnN0X3NpemUgPSAwOwotCSAgICBpZiAoKmFwcF9yZWdzIFtyZWddLm5hbWUgIT0gJ1wwJykKLQkgICAgICBlbnRyeS0+aXN5bS5zdF9uYW1lCi0JCT0gX2JmZF9zdHJpbmd0YWJfYWRkIChkeW5zdHIsIGFwcF9yZWdzW3JlZ10ubmFtZSwgdHJ1ZSwgZmFsc2UpOwotCSAgICBlbHNlCi0JICAgICAgZW50cnktPmlzeW0uc3RfbmFtZSA9IDA7Ci0JICAgIGVudHJ5LT5pc3ltLnN0X290aGVyID0gMDsKLQkgICAgZW50cnktPmlzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChhcHBfcmVncyBbcmVnXS5iaW5kLAotCQkJCQkgICAgICAgU1RUX1JFR0lTVEVSKTsKLQkgICAgZW50cnktPmlzeW0uc3Rfc2huZHggPSBhcHBfcmVncyBbcmVnXS5zaG5keDsKLQkgICAgZW50cnktPm5leHQgPSBOVUxMOwotCSAgICBlbnRyeS0+aW5wdXRfYmZkID0gb3V0cHV0X2JmZDsKLQkgICAgZW50cnktPmlucHV0X2luZHggPSAtMTsKLQotCSAgICBpZiAoZWh0LT5keW5sb2NhbCA9PSBOVUxMKQotCSAgICAgIGVodC0+ZHlubG9jYWwgPSBlbnRyeTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZm9yIChlID0gZWh0LT5keW5sb2NhbDsgZS0+bmV4dDsgZSA9IGUtPm5leHQpCi0JCSAgOwotCQllLT5uZXh0ID0gZW50cnk7Ci0JICAgICAgfQotCSAgICBlaHQtPmR5bnN5bWNvdW50Kys7Ci0JICB9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVsb2NhdGUgYSBTUEFSQzY0IEVMRiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBiZmRfdm1hIGdvdF9iYXNlOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNwbHQ7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChpbnB1dF9iZmQpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZShpbmZvKS0+aGdvdCA9PSBOVUxMKQotICAgIGdvdF9iYXNlID0gMDsKLSAgZWxzZQotICAgIGdvdF9iYXNlID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlOwotCi0gIHNnb3QgPSBzcGx0ID0gc3JlbG9jID0gTlVMTDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjY0X1JfVFlQRV9JRCAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfU1BBUkNfbWF4X3N0ZCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBob3d0byA9IHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICByX3N5bW5keCA9IEVMRjY0X1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBib29sZWFuIHNraXBfaXQgPSBmYWxzZTsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgICBzd2l0Y2ggKHJfdHlwZSkKLQkJewotCQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCQljYXNlIFJfU1BBUkNfUExUMzI6Ci0JCWNhc2UgUl9TUEFSQ19ISVBMVDIyOgotCQljYXNlIFJfU1BBUkNfTE9QTFQxMDoKLQkJY2FzZSBSX1NQQVJDX1BDUExUMzI6Ci0JCWNhc2UgUl9TUEFSQ19QQ1BMVDIyOgotCQljYXNlIFJfU1BBUkNfUENQTFQxMDoKLQkJY2FzZSBSX1NQQVJDX1BMVDY0OgotCQkgIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICAgIHNraXBfaXQgPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9TUEFSQ19HT1QxMDoKLQkJY2FzZSBSX1NQQVJDX0dPVDEzOgotCQljYXNlIFJfU1BBUkNfR09UMjI6Ci0JCSAgaWYgKGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICAgICAgJiYgKCFpbmZvLT5zaGFyZWQKLQkJCSAgfHwgKCFpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAhKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQkJICAgIHNraXBfaXQgPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9TUEFSQ19QQzEwOgotCQljYXNlIFJfU1BBUkNfUEMyMjoKLQkJY2FzZSBSX1NQQVJDX1BDX0hIMjI6Ci0JCWNhc2UgUl9TUEFSQ19QQ19ITTEwOgotCQljYXNlIFJfU1BBUkNfUENfTE0yMjoKLQkJICBpZiAoIXN0cmNtcChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikpCi0JCSAgICBicmVhazsKLQkJICAvKiBGQUxMVEhSVSAqLwotCi0JCWNhc2UgUl9TUEFSQ184OgotCQljYXNlIFJfU1BBUkNfMTY6Ci0JCWNhc2UgUl9TUEFSQ18zMjoKLQkJY2FzZSBSX1NQQVJDX0RJU1A4OgotCQljYXNlIFJfU1BBUkNfRElTUDE2OgotCQljYXNlIFJfU1BBUkNfRElTUDMyOgotCQljYXNlIFJfU1BBUkNfV0RJU1AzMDoKLQkJY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JCWNhc2UgUl9TUEFSQ19ISTIyOgotCQljYXNlIFJfU1BBUkNfMjI6Ci0JCWNhc2UgUl9TUEFSQ18xMzoKLQkJY2FzZSBSX1NQQVJDX0xPMTA6Ci0JCWNhc2UgUl9TUEFSQ19VQTMyOgotCQljYXNlIFJfU1BBUkNfMTA6Ci0JCWNhc2UgUl9TUEFSQ18xMToKLQkJY2FzZSBSX1NQQVJDXzY0OgotCQljYXNlIFJfU1BBUkNfT0xPMTA6Ci0JCWNhc2UgUl9TUEFSQ19ISDIyOgotCQljYXNlIFJfU1BBUkNfSE0xMDoKLQkJY2FzZSBSX1NQQVJDX0xNMjI6Ci0JCWNhc2UgUl9TUEFSQ19XRElTUDE5OgotCQljYXNlIFJfU1BBUkNfV0RJU1AxNjoKLQkJY2FzZSBSX1NQQVJDXzc6Ci0JCWNhc2UgUl9TUEFSQ181OgotCQljYXNlIFJfU1BBUkNfNjoKLQkJY2FzZSBSX1NQQVJDX0RJU1A2NDoKLQkJY2FzZSBSX1NQQVJDX0hJWDIyOgotCQljYXNlIFJfU1BBUkNfTE9YMTA6Ci0JCWNhc2UgUl9TUEFSQ19INDQ6Ci0JCWNhc2UgUl9TUEFSQ19NNDQ6Ci0JCWNhc2UgUl9TUEFSQ19MNDQ6Ci0JCWNhc2UgUl9TUEFSQ19VQTY0OgotCQljYXNlIFJfU1BBUkNfVUExNjoKLQkJICBpZiAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoIWluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8ICEoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQkgICAgc2tpcF9pdCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGlmIChza2lwX2l0KQotCQl7Ci0JCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZQotICAgICAgICAgICAgICAgICAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkrIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMgYXJlIGNvcGllZAotCSBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4gdGltZS4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykpCi0JewotCSAgc3dpdGNoIChyX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBSX1NQQVJDX1BDMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19QQzIyOgotCSAgICBjYXNlIFJfU1BBUkNfUENfSEgyMjoKLQkgICAgY2FzZSBSX1NQQVJDX1BDX0hNMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19QQ19MTTIyOgotCSAgICAgIGlmIChoICE9IE5VTEwKLQkJICAmJiAhc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikpCi0JCWJyZWFrOwotCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgIGNhc2UgUl9TUEFSQ19ESVNQODoKLQkgICAgY2FzZSBSX1NQQVJDX0RJU1AxNjoKLQkgICAgY2FzZSBSX1NQQVJDX0RJU1AzMjoKLQkgICAgY2FzZSBSX1NQQVJDX1dESVNQMzA6Ci0JICAgIGNhc2UgUl9TUEFSQ19XRElTUDIyOgotCSAgICBjYXNlIFJfU1BBUkNfV0RJU1AxOToKLQkgICAgY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JICAgIGNhc2UgUl9TUEFSQ19ESVNQNjQ6Ci0JICAgICAgaWYgKGggPT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgY2FzZSBSX1NQQVJDXzg6Ci0JICAgIGNhc2UgUl9TUEFSQ18xNjoKLQkgICAgY2FzZSBSX1NQQVJDXzMyOgotCSAgICBjYXNlIFJfU1BBUkNfSEkyMjoKLQkgICAgY2FzZSBSX1NQQVJDXzIyOgotCSAgICBjYXNlIFJfU1BBUkNfMTM6Ci0JICAgIGNhc2UgUl9TUEFSQ19MTzEwOgotCSAgICBjYXNlIFJfU1BBUkNfVUEzMjoKLQkgICAgY2FzZSBSX1NQQVJDXzEwOgotCSAgICBjYXNlIFJfU1BBUkNfMTE6Ci0JICAgIGNhc2UgUl9TUEFSQ182NDoKLQkgICAgY2FzZSBSX1NQQVJDX09MTzEwOgotCSAgICBjYXNlIFJfU1BBUkNfSEgyMjoKLQkgICAgY2FzZSBSX1NQQVJDX0hNMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19MTTIyOgotCSAgICBjYXNlIFJfU1BBUkNfNzoKLQkgICAgY2FzZSBSX1NQQVJDXzU6Ci0JICAgIGNhc2UgUl9TUEFSQ182OgotCSAgICBjYXNlIFJfU1BBUkNfSElYMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ19MT1gxMDoKLQkgICAgY2FzZSBSX1NQQVJDX0g0NDoKLQkgICAgY2FzZSBSX1NQQVJDX000NDoKLQkgICAgY2FzZSBSX1NQQVJDX0w0NDoKLQkgICAgY2FzZSBSX1NQQVJDX1VBNjQ6Ci0JICAgIGNhc2UgUl9TUEFSQ19VQTE2OgotCSAgICAgIHsKLQkJRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCQlib29sZWFuIHNraXA7Ci0KLQkJaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKm5hbWUgPQotCQkgICAgICAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAgKGlucHV0X2JmZCwKLQkJCWVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCQllbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0KLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQotCQkgICAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJCSYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUoaW5wdXRfYmZkLAotCQkJCQkJCQlpbnB1dF9zZWN0aW9uKSwKLQkJCQkJICAgbmFtZSArIDUpID09IDApOwotCi0JCSAgICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICAgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkJICB9Ci0KLQkJc2tpcCA9IGZhbHNlOwotCi0JCWlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGJmZF92bWEgb2ZmOwotCi0JCSAgICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCQkgICAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCi0JCQkgICAgcmVsLT5yX29mZnNldCkpOwotCQkgICAgaWYgKG9mZiA9PSBNSU5VU19PTkUpCi0JCSAgICAgIHNraXAgPSB0cnVlOwotCQkgICAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQkgIH0KLQotCQlvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCQkvKiBPcHRpbWl6ZSB1bmFsaWduZWQgcmVsb2MgdXNhZ2Ugbm93IHRoYXQgd2Uga25vdyB3aGVyZQotCQkgICBpdCBmaW5hbGx5IHJlc2lkZXMuICAqLwotCQlzd2l0Y2ggKHJfdHlwZSkKLQkJICB7Ci0JCSAgY2FzZSBSX1NQQVJDXzE2OgotCQkgICAgaWYgKG91dHJlbC5yX29mZnNldCAmIDEpIHJfdHlwZSA9IFJfU1BBUkNfVUExNjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgUl9TUEFSQ19VQTE2OgotCQkgICAgaWYgKCEob3V0cmVsLnJfb2Zmc2V0ICYgMSkpIHJfdHlwZSA9IFJfU1BBUkNfMTY7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFJfU1BBUkNfMzI6Ci0JCSAgICBpZiAob3V0cmVsLnJfb2Zmc2V0ICYgMykgcl90eXBlID0gUl9TUEFSQ19VQTMyOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBSX1NQQVJDX1VBMzI6Ci0JCSAgICBpZiAoIShvdXRyZWwucl9vZmZzZXQgJiAzKSkgcl90eXBlID0gUl9TUEFSQ18zMjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgUl9TUEFSQ182NDoKLQkJICAgIGlmIChvdXRyZWwucl9vZmZzZXQgJiA3KSByX3R5cGUgPSBSX1NQQVJDX1VBNjQ7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFJfU1BBUkNfVUE2NDoKLQkJICAgIGlmICghKG91dHJlbC5yX29mZnNldCAmIDcpKSByX3R5cGUgPSBSX1NQQVJDXzY0OwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0JCWlmIChza2lwKQotCQkgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0JCS8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoZSBzeW1ib2wgd2FzIG1hcmtlZCB0bwotCQkgICBiZWNvbWUgbG9jYWwuICAqLwotCQllbHNlIGlmIChoICE9IE5VTEwKLQkJCSAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB7Ci0JCSAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICAgIG91dHJlbC5yX2luZm8KLQkJICAgICAgPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsCi0JCQkJICAgICAgRUxGNjRfUl9UWVBFX0lORk8gKAotCQkJCQlFTEY2NF9SX1RZUEVfREFUQSAocmVsLT5yX2luZm8pLAotCQkJCQkJCSAgIHJfdHlwZSkpOwotCQkgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpZiAocl90eXBlID09IFJfU1BBUkNfNjQpCi0JCSAgICAgIHsKLQkJCW91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8gKDAsIFJfU1BBUkNfUkVMQVRJVkUpOwotCQkJb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJbG9uZyBpbmR4OwotCi0JCQlpZiAoaCA9PSBOVUxMKQotCQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkJCXx8IChoLT5yb290LnR5cGUKLQkJCQkJICAgID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCQkJICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJCSAgfQotCQkJaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkJCSAgaW5keCA9IDA7Ci0JCQllbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JCQkgIHsKLQkJCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGFzZWN0aW9uICpvc2VjOwotCi0JCQkgICAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JCQkgICAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKG9zZWMpLT5keW5pbmR4OwotCi0JCQkgICAgLyogRklYTUU6IHdlIHJlYWxseSBzaG91bGQgYmUgYWJsZSB0byBsaW5rIG5vbi1waWMKLQkJCSAgICAgICBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLQkJCSAgICBpZiAoaW5keCA9PSAwKQotCQkJICAgICAgewotCQkJCUJGRF9GQUlMICgpOwotCQkJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJCSAgKF8oIiVzOiBwcm9iYWJseSBjb21waWxlZCB3aXRob3V0IC1mUElDPyIpLAotCQkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCQkJCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCSAgICAgIH0KLQkJCSAgfQotCi0JCQlvdXRyZWwucl9pbmZvCi0JCQkgID0gRUxGNjRfUl9JTkZPIChpbmR4LAotCQkJCQkgIEVMRjY0X1JfVFlQRV9JTkZPICgKLQkJCQkJICAgIEVMRjY0X1JfVFlQRV9EQVRBIChyZWwtPnJfaW5mbyksCi0JCQkJCQkJICAgICAgIHJfdHlwZSkpOwotCQkJb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICAgIH0KLQkJICB9Ci0KLQkJYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICAgKCgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICAgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJCSAgICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkJKytzcmVsb2MtPnJlbG9jX2NvdW50OwotCi0JCS8qIFRoaXMgcmVsb2Mgd2lsbCBiZSBjb21wdXRlZCBhdCBydW50aW1lLCBzbyB0aGVyZSdzIG5vCi0JCSAgIG5lZWQgdG8gZG8gYW55dGhpbmcgbm93LCB1bmxlc3MgdGhpcyBpcyBhIFJFTEFUSVZFCi0JCSAgIHJlbG9jIGluIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24uICAqLwotCQlpZiAoc2tpcAotCQkgICAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSAgICB8fCBFTEY2NF9SX1RZUEVfSUQgKG91dHJlbC5yX2luZm8pICE9IFJfU1BBUkNfUkVMQVRJVkUpCi0JCSAgY29udGludWU7Ci0JICAgICAgfQotCSAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9TUEFSQ19HT1QxMDoKLQljYXNlIFJfU1BBUkNfR09UMTM6Ci0JY2FzZSBSX1NQQVJDX0dPVDIyOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSBnbG9iYWwKLQkgICAgIG9mZnNldCB0YWJsZS4gICovCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmYgPSBoLT5nb3Qub2Zmc2V0OwotCSAgICAgIEJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYWN0dWFsbHkgYSBzdGF0aWMgbGluaywgb3IgaXQgaXMgYSAtQnN5bWJvbGljCi0JCSAgICAgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGxvY2FsbHksIG9yIHRoZSBzeW1ib2wKLQkJICAgICB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuICBXZQotCQkgICAgIG11c3QgaW5pdGlhbGl6ZSB0aGlzIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotCQkgICAgIFNpbmNlIHRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA4LCB3ZQotCQkgICAgIHVzZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlCi0JCSAgICAgaGF2ZSBpbml0aWFsaXplZCBpdCBhbHJlYWR5LgotCi0JCSAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuZ290Ci0JCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMgaXMKLQkJICAgICBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCi0KLQkJICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCSAgICBvZmYgJj0gfjE7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSAgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCQkgICAgICBoLT5nb3Qub2Zmc2V0IHw9IDE7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIGdvdF9iYXNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIEJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwpOwotCSAgICAgIG9mZiA9IGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XTsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIC8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA4LiAgV2UgdXNlCi0JCSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUKLQkJIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgZW50cnkuICAqLwotCSAgICAgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJb2ZmICY9IH4xOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQotCQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICpzcmVsZ290OwotCQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkJICAgICAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2MKLQkJCSBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLQkJICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgICAgICBCRkRfQVNTRVJUIChzcmVsZ290ICE9IE5VTEwpOwotCi0JCSAgICAgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkJICsgb2ZmKTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb247Ci0JCSAgICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCQkgKCgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkJICAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCQkgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKLQkJICAgICAgKytzcmVsZ290LT5yZWxvY19jb3VudDsKLQkJICAgIH0KLQkJfQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gZ290X2Jhc2U7Ci0JICAgIH0KLQkgIGdvdG8gZG9fZGVmYXVsdDsKLQotCWNhc2UgUl9TUEFSQ19XUExUMzA6Ci0JY2FzZSBSX1NQQVJDX1BMVDMyOgotCWNhc2UgUl9TUEFSQ19ISVBMVDIyOgotCWNhc2UgUl9TUEFSQ19MT1BMVDEwOgotCWNhc2UgUl9TUEFSQ19QQ1BMVDMyOgotCWNhc2UgUl9TUEFSQ19QQ1BMVDIyOgotCWNhc2UgUl9TUEFSQ19QQ1BMVDEwOgotCWNhc2UgUl9TUEFSQ19QTFQ2NDoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLSAgICAgICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCi0JICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JICAgIHsKLQkgICAgICAvKiBXZSBkaWRuJ3QgbWFrZSBhIFBMVCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICBUaGlzCi0JCSBoYXBwZW5zIHdoZW4gc3RhdGljYWxseSBsaW5raW5nIFBJQyBjb2RlLCBvciB3aGVuCi0JCSB1c2luZyAtQnN5bWJvbGljLiAgKi8KLQkgICAgICBnb3RvIGRvX2RlZmF1bHQ7Ci0JICAgIH0KLQotCSAgaWYgKHNwbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCAoaC0+cGx0Lm9mZnNldCkpOwotCSAgZ290byBkb19kZWZhdWx0OwotCi0JY2FzZSBSX1NQQVJDX09MTzEwOgotCSAgewotCSAgICBiZmRfdm1hIHg7Ci0KLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPnJfYWRkZW5kOwotCSAgICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gJiAweDNmZikgKyBFTEY2NF9SX1RZUEVfREFUQSAocmVsLT5yX2luZm8pOwotCi0JICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JICAgIHggPSAoeCAmIH4weDFmZmYpIHwgKHJlbG9jYXRpb24gJiAweDFmZmYpOwotCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0KLQkgICAgciA9IGJmZF9jaGVja19vdmVyZmxvdyAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93LAotCQkJCSAgICBob3d0by0+Yml0c2l6ZSwgaG93dG8tPnJpZ2h0c2hpZnQsCi0JCQkJICAgIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGlucHV0X2JmZCksCi0JCQkJICAgIHJlbG9jYXRpb24pOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfV0RJU1AxNjoKLQkgIHsKLQkgICAgYmZkX3ZtYSB4OwotCi0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQkgICAgLyogQWRqdXN0IGZvciBwYy1yZWxhdGl2ZS1uZXNzLiAgKi8KLQkgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgcmVsb2NhdGlvbiAtPSByZWwtPnJfb2Zmc2V0OwotCi0JICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JICAgIHggPSAoeCAmIH4weDMwM2ZmZikgfCAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKLQkJCQkgICB8ICgocmVsb2NhdGlvbiA+PiAyKSAmIDB4M2ZmZikpOwotCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0KLQkgICAgciA9IGJmZF9jaGVja19vdmVyZmxvdyAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93LAotCQkJCSAgICBob3d0by0+Yml0c2l6ZSwgaG93dG8tPnJpZ2h0c2hpZnQsCi0JCQkJICAgIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGlucHV0X2JmZCksCi0JCQkJICAgIHJlbG9jYXRpb24pOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfSElYMjI6Ci0JICB7Ci0JICAgIGJmZF92bWEgeDsKLQotCSAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0JICAgIHJlbG9jYXRpb24gPSByZWxvY2F0aW9uIF4gTUlOVVNfT05FOwotCi0JICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JICAgIHggPSAoeCAmIH4weDNmZmZmZikgfCAoKHJlbG9jYXRpb24gPj4gMTApICYgMHgzZmZmZmYpOwotCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0KLQkgICAgciA9IGJmZF9jaGVja19vdmVyZmxvdyAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93LAotCQkJCSAgICBob3d0by0+Yml0c2l6ZSwgaG93dG8tPnJpZ2h0c2hpZnQsCi0JCQkJICAgIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGlucHV0X2JmZCksCi0JCQkJICAgIHJlbG9jYXRpb24pOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfTE9YMTA6Ci0JICB7Ci0JICAgIGJmZF92bWEgeDsKLQotCSAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0JICAgIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiAmIDB4M2ZmKSB8IDB4MWMwMDsKLQotCSAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgICB4ID0gKHggJiB+MHgxZmZmKSB8IHJlbG9jYXRpb247Ci0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCSAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCWRvX2RlZmF1bHQ6Ci0JICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkJcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN3aXRjaCAocikKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgaWYgKGggIT0gTlVMTCkKLQkgICAgICB7Ci0JCWlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLQkJICAgICYmIGhvd3RvLT5wY19yZWxhdGl2ZSkKLQkJICB7Ci0JCSAgICAvKiBBc3N1bWUgdGhpcyBpcyBhIGNhbGwgcHJvdGVjdGVkIGJ5IG90aGVyIGNvZGUgdGhhdAotCQkgICAgICAgZGV0ZWN0IHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwKLQkJICAgICAgIHdlIGNhbiBzYWZlbHkgaWdub3JlIHRoZSBvdmVyZmxvdy4gIElmIG5vdCwgdGhlIAotCQkgICAgICAgcHJvZ3JhbSBpcyBob3NlZCBhbnl3YXksIGFuZCBhIGxpdHRsZSB3YXJuaW5nIGlzbid0Ci0JCSAgICAgICBnb2luZyB0byBoZWxwLiAgKi8KLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJICAKLQkgICAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkoaW5wdXRfYmZkLAotCQkJIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkgc3ltLT5zdF9uYW1lKSk7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICAgIH0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQlicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBQTFQuICBTZXQgaXQgdXAuICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotCi0gICAgICBpZiAoaC0+cGx0Lm9mZnNldCA8IExBUkdFX1BMVF9USFJFU0hPTEQpCi0JewotCSAgcmVsYS5yX29mZnNldCA9IHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQgKGgtPnBsdC5vZmZzZXQpOwotCSAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBtYXggPSBzcGx0LT5fcmF3X3NpemUgLyBQTFRfRU5UUllfU0laRTsKLQkgIHJlbGEucl9vZmZzZXQgPSBzcGFyYzY0X2VsZl9wbHRfcHRyX29mZnNldCAoaC0+cGx0Lm9mZnNldCwgbWF4KTsKLQkgIHJlbGEucl9hZGRlbmQgPSAtKHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQgKGgtPnBsdC5vZmZzZXQpICsgNCkKLQkJCSAgLShzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc3BsdC0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgcmVsYS5yX29mZnNldCArPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNwbHQtPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfSk1QX1NMT1QpOwotCi0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBoLT5wbHQub2Zmc2V0KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBHT1QuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICByZWxhLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIExpa2V3aXNlIGlmCi0JIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLgotCSBUaGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbgotCSBpbml0aWFsaXplZCBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JewotCSAgYXNlY3Rpb24gKnNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIHJlbGEucl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLQkgIHJlbGEucl9hZGRlbmQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7Ci0JICByZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19HTE9CX0RBVCk7Ci0JICByZWxhLnJfYWRkZW5kID0gMDsKLQl9Ci0KLSAgICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIHNyZWxhLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzcmVsYS0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9scyBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICIucmVsYS5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0NPUFkpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopIHMtPmNvbnRlbnRzCi0JCQkJICArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICAvKiBNYXJrIHNvbWUgc3BlY2lhbGx5IGRlZmluZWQgc3ltYm9scyBhcyBhYnNvbHV0ZS4gICovCi0gIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBpbnQgc3R0X3JlZ2lkeCA9IC0xOwotICBhc2VjdGlvbiAqc2R5bjsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIEVsZjY0X0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmNjRfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOwotICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JewotCSAgRWxmX0ludGVybmFsX0R5biBkeW47Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYm9vbGVhbiBzaXplOwotCi0JICBiZmRfZWxmNjRfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6ICAgbmFtZSA9ICIucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUxTWjogbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gdHJ1ZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOiAgIG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgY2FzZSBEVF9TUEFSQ19SRUdJU1RFUjoKLQkgICAgICBpZiAoc3R0X3JlZ2lkeCA9PSAtMSkKLQkJewotCQkgIHN0dF9yZWdpZHggPQotCQkgICAgX2JmZF9lbGZfbGlua19sb29rdXBfbG9jYWxfZHluaW5keCAoaW5mbywgb3V0cHV0X2JmZCwgLTEpOwotCQkgIGlmIChzdHRfcmVnaWR4ID09IC0xKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgZHluLmRfdW4uZF92YWwgPSBzdHRfcmVnaWR4Kys7Ci0JICAgICAgYmZkX2VsZjY0X3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICAvKiBmYWxsdGhyb3VnaCAqLwotCSAgICBkZWZhdWx0OgkgICAgICBuYW1lID0gTlVMTDsgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgfQotCi0JICBpZiAobmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnM7Ci0KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIGlmIChzID09IE5VTEwpCi0JCWR5bi5kX3VuLmRfdmFsID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISBzaXplKQotCQkgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkJICAgICAgZWxzZQotCQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBiZmRfZWxmNjRfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQotCXsKLQkgIHNwYXJjNjRfZWxmX2J1aWxkX3BsdChvdXRwdXRfYmZkLCBzcGx0LT5jb250ZW50cywKLQkJCQlzcGx0LT5fcmF3X3NpemUgLyBQTFRfRU5UUllfU0laRSk7Ci0JfQotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPQotCVBMVF9FTlRSWV9TSVpFOwotICAgIH0KLQotICAvKiBTZXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHRvIHRoZSBhZGRyZXNzIG9mCi0gICAgIHRoZSBkeW5hbWljIHNlY3Rpb24uICAqLwotICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzY0IChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgZWxzZQotCWJmZF9wdXRfNjQgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHNnb3QtPmNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gODsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIHRoZSBlX2ZsYWdzIGZpZWxkLiAqLwotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGJvb2xlYW4gZXJyb3I7Ci0gIGZsYWd3b3JkIG5ld19mbGFncywgb2xkX2ZsYWdzOwotICBpbnQgbmV3X21tLCBvbGRfbW07Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIG5ld19mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvbGRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoIWVsZl9mbGFnc19pbml0IChvYmZkKSkgICAvKiBGaXJzdCBjYWxsLCBubyBmbGFncyBzZXQgKi8KLSAgICB7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgIAotICBlbHNlIGlmIChuZXdfZmxhZ3MgPT0gb2xkX2ZsYWdzKSAgICAgIC8qIENvbXBhdGlibGUgZmxhZ3MgYXJlIG9rICovCi0gICAgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY29tcGF0aWJsZSBmbGFncyAqLwotICAgIHsKLSAgICAgIGVycm9yID0gZmFsc2U7Ci0gIAotICAgICAgb2xkX2ZsYWdzIHw9IChuZXdfZmxhZ3MgJiAoRUZfU1BBUkNfU1VOX1VTMXxFRl9TUEFSQ19IQUxfUjEpKTsKLSAgICAgIG5ld19mbGFncyB8PSAob2xkX2ZsYWdzICYgKEVGX1NQQVJDX1NVTl9VUzF8RUZfU1BBUkNfSEFMX1IxKSk7Ci0gICAgICBpZiAoKG9sZF9mbGFncyAmIChFRl9TUEFSQ19TVU5fVVMxfEVGX1NQQVJDX0hBTF9SMSkpID09Ci0gICAgICAgICAgIChFRl9TUEFSQ19TVU5fVVMxfEVGX1NQQVJDX0hBTF9SMSkpCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgICAgICAoXygiJXM6IGxpbmtpbmcgVWx0cmFTUEFSQyBzcGVjaWZpYyB3aXRoIEhBTCBzcGVjaWZpYyBjb2RlIiksCi0gICAgICAgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgLyogQ2hvb3NlIHRoZSBtb3N0IHJlc3RyaWN0aXZlIG1lbW9yeSBvcmRlcmluZyAqLwotICAgICAgb2xkX21tID0gKG9sZF9mbGFncyAmIEVGX1NQQVJDVjlfTU0pOwotICAgICAgbmV3X21tID0gKG5ld19mbGFncyAmIEVGX1NQQVJDVjlfTU0pOwotICAgICAgb2xkX2ZsYWdzICY9IH5FRl9TUEFSQ1Y5X01NOwotICAgICAgbmV3X2ZsYWdzICY9IH5FRl9TUEFSQ1Y5X01NOwotICAgICAgaWYgKG5ld19tbSA8IG9sZF9tbSkgb2xkX21tID0gbmV3X21tOwotICAgICAgb2xkX2ZsYWdzIHw9IG9sZF9tbTsKLSAgICAgIG5ld19mbGFncyB8PSBvbGRfbW07Ci0KLSAgICAgIC8qIFdhcm4gYWJvdXQgYW55IG90aGVyIG1pc21hdGNoZXMgKi8KLSAgICAgIGlmIChuZXdfZmxhZ3MgIT0gb2xkX2ZsYWdzKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAgKF8oIiVzOiB1c2VzIGRpZmZlcmVudCBlX2ZsYWdzICgweCVseCkgZmllbGRzIHRoYW4gcHJldmlvdXMgbW9kdWxlcyAoMHglbHgpIiksCi0gICAgICAgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksIChsb25nKW5ld19mbGFncywgKGxvbmcpb2xkX2ZsYWdzKTsKLSAgICAgICAgfQotCi0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IG9sZF9mbGFnczsKLQotICAgICAgaWYgKGVycm9yKQotICAgICAgICB7Ci0gICAgICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFByaW50IGEgU1RUX1JFR0lTVEVSIHN5bWJvbCB0byBmaWxlIEZJTEUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1zcGFyYzY0X2VsZl9wcmludF9zeW1ib2xfYWxsIChhYmZkLCBmaWxlcCwgc3ltYm9sKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlcDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgZmlsZXA7Ci0gIGludCByZWcsIHR5cGU7Ci0gIAotICBpZiAoRUxGX1NUX1RZUEUgKCgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbykKLSAgICAgICE9IFNUVF9SRUdJU1RFUikKLSAgICByZXR1cm4gTlVMTDsKLQotICByZWcgPSAoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlOwotICB0eXBlID0gc3ltYm9sLT5mbGFnczsKLSAgZnByaW50ZiAoZmlsZSwgIlJFR18lYyVjJTExcyVjJWMgICAgUiIsICJHT0xJIiBbcmVnIC8gOF0sICcwJyArIChyZWcgJiA3KSwgIiIsCi0JCSAoKHR5cGUgJiBCU0ZfTE9DQUwpCi0JCSAgPyAodHlwZSAmIEJTRl9HTE9CQUwpID8gJyEnIDogJ2wnCi0gIAkgICAgICAgICAgOiAodHlwZSAmIEJTRl9HTE9CQUwpID8gJ2cnIDogJyAnKSwKLSAgCSAgICAgICAgICh0eXBlICYgQlNGX1dFQUspID8gJ3cnIDogJyAnKTsKLSAgaWYgKHN5bWJvbC0+bmFtZSA9PSBOVUxMIHx8IHN5bWJvbC0+bmFtZSBbMF0gPT0gJ1wwJykKLSAgICByZXR1cm4gIiNzY3JhdGNoIjsKLSAgZWxzZQotICAgIHJldHVybiBzeW1ib2wtPm5hbWU7Ci19Ci0MCi0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyIGZvciBhIFNQQVJDNjQgRUxGIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgbG9uZyBtYWNoID0gYmZkX21hY2hfc3BhcmNfdjk7Ci0gIAotICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19TVU5fVVMxKQotICAgIG1hY2ggPSBiZmRfbWFjaF9zcGFyY192OWE7Ci0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9zcGFyYywgbWFjaCk7Ci19Ci0KLS8qIFJlbG9jYXRpb25zIGluIHRoZSA2NCBiaXQgU1BBUkMgRUxGIEFCSSBhcmUgbW9yZSBjb21wbGV4IHRoYW4gaW4KLSAgIHN0YW5kYXJkIEVMRiwgYmVjYXVzZSBSX1NQQVJDX09MTzEwIGhhcyBzZWNvbmRhcnkgYWRkZW5kIGluCi0gICBFTEY2NF9SX1RZUEVfREFUQSBmaWVsZC4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmVkaXJlY3QgdGhlCi0gICByZWxvY2F0aW9uIGhhbmRsaW5nIHJvdXRpbmVzLiAgKi8KLQotY29uc3Qgc3RydWN0IGVsZl9zaXplX2luZm8gc3BhcmM2NF9lbGZfc2l6ZV9pbmZvID0KLXsKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9FaGRyKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9QaGRyKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9TaGRyKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWwpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpLAotICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1N5bSksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfRHluKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfTm90ZSksCi0gIDQsCQkvKiBoYXNoLXRhYmxlIGVudHJ5IHNpemUgKi8KLSAgLyogaW50ZXJuYWwgcmVsb2NhdGlvbnMgcGVyIGV4dGVybmFsIHJlbG9jYXRpb25zLgotICAgICBGb3IgbGluayBwdXJwb3NlcyB3ZSB1c2UganVzdCAxIGludGVybmFsIHBlcgotICAgICAxIGV4dGVybmFsLCBmb3IgYXNzZW1ibHkgYW5kIHNsdXJwIHN5bWJvbCB0YWJsZQotICAgICB3ZSB1c2UgMi4gKi8KLSAgMSwKLSAgNjQsCQkvKiBhcmNoX3NpemUgKi8KLSAgOCwJCS8qIGZpbGVfYWxpZ24gKi8KLSAgRUxGQ0xBU1M2NCwKLSAgRVZfQ1VSUkVOVCwKLSAgYmZkX2VsZjY0X3dyaXRlX291dF9waGRycywKLSAgYmZkX2VsZjY0X3dyaXRlX3NoZHJzX2FuZF9laGRyLAotICBzcGFyYzY0X2VsZl93cml0ZV9yZWxvY3MsCi0gIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQsCi0gIHNwYXJjNjRfZWxmX3NsdXJwX3JlbG9jX3RhYmxlLAotICBiZmRfZWxmNjRfc2x1cnBfc3ltYm9sX3RhYmxlLAotICBiZmRfZWxmNjRfc3dhcF9keW5faW4sCi0gIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwKLX07Ci0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JYmZkX2VsZjY0X3NwYXJjX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJImVsZjY0LXNwYXJjIgotI2RlZmluZSBFTEZfQVJDSAliZmRfYXJjaF9zcGFyYwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgMHgxMDAwMDAKLQotLyogVGhpcyBpcyB0aGUgb2ZmaWNpYWwgQUJJIHZhbHVlLiAgKi8KLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERSBFTV9TUEFSQ1Y5Ci0KLS8qIFRoaXMgaXMgdGhlIHZhbHVlIHRoYXQgd2UgdXNlZCBiZWZvcmUgdGhlIEFCSSB3YXMgcmVsZWFzZWQuICAqLwotI2RlZmluZSBFTEZfTUFDSElORV9BTFQxIEVNX09MRF9TUEFSQ1Y5Ci0KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLSAgc3BhcmM2NF9lbGZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvIFwKLSAgc3BhcmM2NF9lbGZfaW5mb190b19ob3d0bwotI2RlZmluZSBiZmRfZWxmNjRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgc3BhcmM2NF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGJmZF9lbGY2NF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBcCi0gIHNwYXJjNjRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGJmZF9lbGY2NF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gIHNwYXJjNjRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfcmVsb2NfdHlwZV9sb29rdXAgXAotICBzcGFyYzY0X2VsZl9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKLSAgX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rIFwKLSAgc3BhcmM2NF9lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSBcCi0gIHNwYXJjNjRfZWxmX2dldF9zeW1ib2xfdHlwZQotI2RlZmluZSBlbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZyBcCi0gIHNwYXJjNjRfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyBcCi0gIHNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAotICBzcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFwKLSAgc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24gXAotICBzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0gIHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0gIHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3ByaW50X3N5bWJvbF9hbGwgXAotICBzcGFyYzY0X2VsZl9wcmludF9zeW1ib2xfYWxsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX291dHB1dF9hcmNoX3N5bXMgXAotICBzcGFyYzY0X2VsZl9vdXRwdXRfYXJjaF9zeW1zCi0KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgc3BhcmM2NF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfaW5mbyBcCi0gIHNwYXJjNjRfZWxmX3NpemVfaW5mbwotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcCBcCi0gIHNwYXJjNjRfZWxmX29iamVjdF9wCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0IDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5IDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltIDEKLQotLyogU2VjdGlvbiA1LjIuNCBvZiB0aGUgQUJJIHNwZWNpZmllcyBhIDI1Ni1ieXRlIGJvdW5kYXJ5IGZvciB0aGUgdGFibGUuICAqLwotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50IDgKLQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUgOAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUgUExUX0hFQURFUl9TSVpFCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC5jIGIvYmZkL2VsZjY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmI1YjUuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBFTEYgNjQtYml0IGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUJCTY0Ci0KLSNpbmNsdWRlICJlbGZjb2RlLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmYXJtLW5hYmkuYyBiL2JmZC9lbGZhcm0tbmFiaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODc3OGI3Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGZhcm0tbmFiaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLS8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNIG5ldyBhYmkgb3B0aW9uLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImVsZi9hcm0uaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLSNpZm5kZWYgTlVNX0VMRU0KLSNkZWZpbmUgTlVNX0VMRU0oYSkgIChzaXplb2YgKGEpIC8gKHNpemVvZiAoYSlbMF0pKQotI2VuZGlmCi0KLSNkZWZpbmUgVVNFX1JFTAotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgICAgICAgICAgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgICAgICAgICAgICAiZWxmMzItbGl0dGxlYXJtIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICAgICAgICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICAgICAgICAgICAgImVsZjMyLWJpZ2FybSIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsICAgICAgICAgICBlbGYzMl9hcm1faW5mb190b19ob3d0bwotCi0jZGVmaW5lIEFSTV9FTEZfQUJJX1ZFUlNJT04JCTAKLSNkZWZpbmUgQVJNX0VMRl9PU19BQklfVkVSU0lPTgkJRUxGT1NBQklfQVJNCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1BDMjQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUEMyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMGZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBzdGFuZGFyZCAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyAqLwotICBIT1dUTyAoUl9BUk1fUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SRUwzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9QQzEzLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUEMxMyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gICAvKiAxNiBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzEyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzEyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA4ZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwOGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9BQlM1LAkvKiB0eXBlICovCi0JIDYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA1LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fQUJTNSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2UwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlM4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1NCUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1NCUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzIyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMywJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMjIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmYwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9USE1fUEM4LAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9QQzgiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9BTVBfVkNBTEw5LAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BTVBfVkNBTEw5IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fU1dJMjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fU1dJMjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1NXSTgsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9TV0k4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlc2UgbmV4dCB0d28gcmVsb2NzIGFyZSBkZWZpbmVkLCBidXQgSSBkbyBub3Qga25vdyB3aGF0IHRoZXkgZG8uICAqLwotICAKLSAgSE9XVE8gKFJfQVJNX1hQQzI1LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1hQQzI1IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9YUEMyMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9YUEMyMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBUaGVzZSBuZXh0IHRocmVlIHJlbG9jcyBhcmUgbm90IGRlZmluZWQsIGJ1dCB3ZSBuZWVkIHRvIGZpbGwgdGhlIHNwYWNlLiAgKi8KLQotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fdW5rbm93bl8xNyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fdW5rbm93bl8xOCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fdW5rbm93bl8xOSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWxvY3MgdXNlZCBpbiBBUk0gTGludXggKi8KLSAgCi0gIEhPV1RPIChSX0FSTV9DT1BZLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0NPUFkiLAkJLyogbmFtZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9HTE9CX0RBVCwJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dMT0JfREFUIiwJLyogbmFtZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAgICAgICAgCi0gIEhPV1RPIChSX0FSTV9KVU1QX1NMT1QsCS8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9KVU1QX1NMT1QiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX1JFTEFUSVZFLAkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fUkVMQVRJVkUiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0dPVE9GRiwJCS8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HT1RPRkYiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0dPVFBDLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dPVFBDIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0dPVDMyLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HT1QzMiIsCQkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAgICAgICAgCi0gIEhPV1RPIChSX0FSTV9QTFQzMiwJCS8qIHR5cGUgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDI2LCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9QTFQzMiIsCQkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHgwMGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogRW5kIG9mIHJlbG9jcyB1c2VkIGluIEFSTSBMaW51eCAqLyAKLQotICBIT1dUTyAoUl9BUk1fUlJFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JBQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkFCUzMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9SUEMyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUlBDMjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9SQkFTRSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkJBU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9hcm1fdnRpbmhlcml0X2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKTsgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV92dGVudHJ5X2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX0dOVV9WVEVOVFJZLCAgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSk7ICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBwYyByZWxhdGl2ZSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX3RobV9wYzExX2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzExLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9QQzExIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgcGMgcmVsYXRpdmUgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzksCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDOSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSk7CQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAKLXN0YXRpYyB2b2lkCi1lbGYzMl9hcm1faW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqIGJmZF9yZWxvYzsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICogZWxmX3JlbG9jOwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICAKLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChlbGZfcmVsb2MtPnJfaW5mbyk7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9BUk1fR05VX1ZUSU5IRVJJVDoKLSAgICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV92dGluaGVyaXRfaG93dG87Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9BUk1fR05VX1ZURU5UUlk6Ci0gICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1fdnRlbnRyeV9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX0FSTV9USE1fUEMxMToKLSAgICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV90aG1fcGMxMV9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX0FSTV9USE1fUEM5OgotICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX3RobV9wYzlfaG93dG87Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAocl90eXBlID49IE5VTV9FTEVNIChlbGYzMl9hcm1faG93dG9fdGFibGUpKQotCWJmZF9yZWxvYy0+aG93dG8gPSBOVUxMOwotICAgICAgZWxzZQotICAgICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1faG93dG9fdGFibGVbcl90eXBlXTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLSAgCi1zdHJ1Y3QgZWxmMzJfYXJtX3JlbG9jX21hcAotICB7Ci0gICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICBiZmRfcmVsb2NfdmFsOwotICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgZWxmX3JlbG9jX3ZhbDsKLSAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwIGVsZjMyX2FybV9yZWxvY19tYXBbXSA9Ci17Ci0gIHtCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgICAgICAgIFJfQVJNX05PTkV9LAotICB7QkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsICAgICBSX0FSTV9QQzI0fSwKLSAge0JGRF9SRUxPQ18zMiwgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTMzJ9LAotICB7QkZEX1JFTE9DXzMyX1BDUkVMLCAgICAgICAgICAgICBSX0FSTV9SRUwzMn0sCi0gIHtCRkRfUkVMT0NfOCwgICAgICAgICAgICAgICAgICAgIFJfQVJNX0FCUzh9LAotICB7QkZEX1JFTE9DXzE2LCAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlMxNn0sCi0gIHtCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU0sICAgICAgIFJfQVJNX0FCUzEyfSwKLSAge0JGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VULCAgICAgUl9BUk1fVEhNX0FCUzV9LAotICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzLCBSX0FSTV9USE1fUEMyMn0sCi0gIHtCRkRfUkVMT0NfQVJNX0NPUFksICAgICAgICAgICAgIFJfQVJNX0NPUFl9LAotICB7QkZEX1JFTE9DX0FSTV9HTE9CX0RBVCwgICAgICAgICBSX0FSTV9HTE9CX0RBVH0sCi0gIHtCRkRfUkVMT0NfQVJNX0pVTVBfU0xPVCwgICAgICAgIFJfQVJNX0pVTVBfU0xPVH0sCi0gIHtCRkRfUkVMT0NfQVJNX1JFTEFUSVZFLCAgICAgICAgIFJfQVJNX1JFTEFUSVZFfSwKLSAge0JGRF9SRUxPQ19BUk1fR09UT0ZGLCAgICAgICAgICAgUl9BUk1fR09UT0ZGfSwKLSAge0JGRF9SRUxPQ19BUk1fR09UUEMsICAgICAgICAgICAgUl9BUk1fR09UUEN9LAotICB7QkZEX1JFTE9DX0FSTV9HT1QzMiwgICAgICAgICAgICBSX0FSTV9HT1QzMn0sCi0gIHtCRkRfUkVMT0NfQVJNX1BMVDMyLCAgICAgICAgICAgIFJfQVJNX1BMVDMyfQotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICByZXR1cm4gJiBlbGYzMl9hcm1fdnRpbmhlcml0X2hvd3RvOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgcmV0dXJuICYgZWxmMzJfYXJtX3Z0ZW50cnlfaG93dG87Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMjoKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV90aG1fcGMxMV9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDk6Ci0gICAgICByZXR1cm4gJiBlbGYzMl9hcm1fdGhtX3BjOV9ob3d0bzsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0VMRU0gKGVsZjMyX2FybV9yZWxvY19tYXApOyBpICsrKQotCWlmIChlbGYzMl9hcm1fcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQkgIHJldHVybiAmIGVsZjMyX2FybV9ob3d0b190YWJsZVtlbGYzMl9hcm1fcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgICAgCi0gICAgICByZXR1cm4gTlVMTDsKLSAgIH0KLX0KLQotI2luY2x1ZGUgImVsZjMyLWFybS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZmFybS1vYWJpLmMgYi9iZmQvZWxmYXJtLW9hYmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmNjJmMi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmYXJtLW9hYmkuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vKiAzMi1iaXQgRUxGIHN1cHBvcnQgZm9yIEFSTSBvbGQgYWJpIG9wdGlvbi4KLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJlbGYvYXJtLW9hYmkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLSNpZm5kZWYgTlVNX0VMRU0KLSNkZWZpbmUgTlVNX0VMRU0oYSkgKHNpemVvZiAoYSkgLyBzaXplb2YgKGEpWzBdKQotI2VuZGlmCi0KLSNkZWZpbmUgVVNFX1JFTEEKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICAgICAgICAgICAgIGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgICAgICAgICAgICAiZWxmMzItbGl0dGxlYXJtLW9hYmkiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgICAgICAgICAgICAgYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAgICAgICAgICAgICJlbGYzMi1iaWdhcm0tb2FiaSIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byAgICAgICAgICAgICAgIGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbCAgICAgICAgICAgMAotCi0jZGVmaW5lIEFSTV9FTEZfQUJJX1ZFUlNJT04JCTAKLSNkZWZpbmUgQVJNX0VMRl9PU19BQklfVkVSU0lPTgkJMAotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9hcm1faG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIE5vIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfQVJNX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUEMyNCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUEMyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMGZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogc3RhbmRhcmQgMzJiaXQgcGMtcmVsYXRpdmUgcmVsb2MgKi8KLSAgSE9XVE8gKFJfQVJNX1JFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTOCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gICAvKiAxNiBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlMxNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9BQlMxMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMTIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDhmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA4ZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX0FCUzUsCS8qIHR5cGUgKi8KLQkgNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDUsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fQUJTNSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2UwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzIyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMywJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9QQzIyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwN2ZmMDdmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDdmZjA3ZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fU0JSRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fU0JSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fQU1QX1ZDQUxMOSwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FNUF9WQ0FMTDkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBwYyByZWxhdGl2ZSAqLwotICBIT1dUTyAoUl9BUk1fVEhNX1BDMTEsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMTEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBwYyByZWxhdGl2ZSAqLwotICBIT1dUTyAoUl9BUk1fVEhNX1BDOSwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEM5IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9BUk1fR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9BUk1fR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogWFhYIC0gZ2FwIGluIGluZGV4IG51bWJlcmluZyBoZXJlLiAgKi8KLSAgCi0gIEhPV1RPIChSX0FSTV9QTFQzMiwJCS8qIHR5cGUgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDI2LCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9QTFQzMiIsCQkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHgwMGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogWFhYIC0gZ2FwIGluIGluZGV4IG51bWJlcmluZyBoZXJlLiAgKi8KLQotICBIT1dUTyAoUl9BUk1fUlJFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUlJFTDMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9SQUJTMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SQUJTMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JQQzI0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUlBDMjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9SQkFTRSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JCQVNFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLS8qIExvY2F0ZSBhIHJlbG9jIGluIHRoZSBob3d0byB0YWJsZS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkCi0gICB3aGVuIHRoZSBlbnRyeSBudW1iZXIgaXMgaXMgPiBSX0FSTV9HTlVfVlRJTkhFUklULiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWZpbmRfaG93dG8gKHJfdHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHJfdHlwZTsKLXsKLSAgaW50IGk7Ci0gIAotICBmb3IgKGkgPSBOVU1fRUxFTSAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTsgaS0tOykKLSAgICBpZiAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlIFtpXS50eXBlID09IHJfdHlwZSkKLSAgICAgIHJldHVybiBlbGYzMl9hcm1faG93dG9fdGFibGUgKyBpOwotCi0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotZWxmMzJfYXJtX2luZm9fdG9faG93dG8gKGFiZmQsIGJmZF9yZWxvYywgZWxmX3JlbG9jKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICplbGZfcmVsb2M7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChlbGZfcmVsb2MtPnJfaW5mbyk7Ci0KLSAgaWYgKHJfdHlwZSA8PSBSX0FSTV9HTlVfVlRJTkhFUklUKQotICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV9ob3d0b190YWJsZVtyX3R5cGVdOwotICBlbHNlCi0gICAgYmZkX3JlbG9jLT5ob3d0byA9IGZpbmRfaG93dG8gKHJfdHlwZSk7Ci19Ci0KLXN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwCi0gIHsKLSAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmMzJfYXJtX3JlbG9jX21hcCBlbGYzMl9hcm1fcmVsb2NfbWFwW10gPQotewotICB7QkZEX1JFTE9DX05PTkUsICAgICAgICAgICAgICAgICBSX0FSTV9OT05FIH0sCi0gIHtCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwgICAgIFJfQVJNX1BDMjQgfSwKLSAge0JGRF9SRUxPQ18zMiwgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTMzIgfSwKLSAge0JGRF9SRUxPQ18zMl9QQ1JFTCwgICAgICAgICAgICAgUl9BUk1fUkVMMzIgfSwKLSAge0JGRF9SRUxPQ184LCAgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTOCB9LAotICB7QkZEX1JFTE9DXzE2LCAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlMxNiB9LAotICB7QkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NLCAgICAgICBSX0FSTV9BQlMxMiB9LAotICB7QkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQsICAgICBSX0FSTV9USE1fQUJTNSB9LAotICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzLCBSX0FSTV9USE1fUEMyMiB9LAotICB7QkZEX1JFTE9DX05PTkUsICAgICAgICAgICAgICAgICBSX0FSTV9TQlJFTDMyIH0sCi0gIHtCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgICAgICAgIFJfQVJNX0FNUF9WQ0FMTDkgfSwKLSAge0JGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMiwgUl9BUk1fVEhNX1BDMTEgfSwKLSAge0JGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5LCAgUl9BUk1fVEhNX1BDOSB9LCAgCi0gIHtCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsICAgICAgIFJfQVJNX0dOVV9WVElOSEVSSVQgfSwKLSAge0JGRF9SRUxPQ19WVEFCTEVfRU5UUlksICAgICAgICAgUl9BUk1fR05VX1ZURU5UUlkgfQotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKiBhYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSBOVU1fRUxFTSAoZWxmMzJfYXJtX3JlbG9jX21hcCk7IGktLTspCi0gICAgaWYgKGVsZjMyX2FybV9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotICAgICAgcmV0dXJuICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlIFtlbGYzMl9hcm1fcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotCi0gIGlmIChjb2RlID09IEJGRF9SRUxPQ19BUk1fUExUMzIpCi0gICAgcmV0dXJuIGZpbmRfaG93dG8gKFJfQVJNX1BMVDMyKTsKLSAgCi0gIHJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIFwKLQliZmRfZWxmMzJfYXJtX29hYmlfYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIFwKLQliZmRfZWxmMzJfYXJtX29hYmlfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0jZGVmaW5lIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiBcCi0JYmZkX2VsZjMyX2FybV9vYWJpX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLQotI2luY2x1ZGUgImVsZjMyLWFybS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZmNvZGUuaCBiL2JmZC9lbGZjb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZWRmOWIuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmNvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NDYgKzAsMCBAQAotLyogRUxGIGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgZnJvbSBpbmZvcm1hdGlvbiBwdWJsaXNoZWQKLSAgIGluICJVTklYIFN5c3RlbSBWIFJlbGVhc2UgNCwgUHJvZ3JhbW1lcnMgR3VpZGU6IEFOU0kgQyBhbmQKLSAgIFByb2dyYW1taW5nIFN1cHBvcnQgVG9vbHMiLiAgU3VmZmljaWVudCBzdXBwb3J0IGZvciBnZGIuCi0KLSAgIFJld3JpdHRlbiBieSBNYXJrIEVpY2hpbiBAIEN5Z251cyBTdXBwb3J0LCBmcm9tIGluZm9ybWF0aW9uCi0gICBwdWJsaXNoZWQgaW4gIlN5c3RlbSBWIEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UiLCBjaGFwdGVycyA0Ci0gICBhbmQgNSwgYXMgd2VsbCBhcyB0aGUgdmFyaW91cyAiUHJvY2Vzc29yIFN1cHBsZW1lbnQiIGRvY3VtZW50cwotICAgZGVyaXZlZCBmcm9tIGl0LiBBZGRlZCBzdXBwb3J0IGZvciBhc3NlbWJsZXIgYW5kIG90aGVyIG9iamVjdCBmaWxlCi0gICB1dGlsaXRpZXMuICBGdXJ0aGVyIHdvcmsgZG9uZSBieSBLZW4gUmFlYnVybiAoQ3lnbnVzIFN1cHBvcnQpLCBNaWNoYWVsCi0gICBNZWlzc25lciAoT3BlbiBTb2Z0d2FyZSBGb3VuZGF0aW9uKSwgYW5kIFBldGVyIEhvb2dlbmJvb20gKFVuaXZlcnNpdHkKLSAgIG9mIFV0YWgpIHRvIGZpbmlzaCBhbmQgZXh0ZW5kIHRoaXMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogUHJvYmxlbXMgYW5kIG90aGVyIGlzc3VlcyB0byByZXNvbHZlLgotCi0gICAoMSkJQkZEIGV4cGVjdHMgdGhlcmUgdG8gYmUgc29tZSBmaXhlZCBudW1iZXIgb2YgInNlY3Rpb25zIiBpbgotICAgICAgICB0aGUgb2JqZWN0IGZpbGUuICBJLkUuIHRoZXJlIGlzIGEgInNlY3Rpb25fY291bnQiIHZhcmlhYmxlIGluIHRoZQotCWJmZCBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgdGhlIG51bWJlciBvZiBzZWN0aW9ucy4gIEhvd2V2ZXIsIEVMRgotCXN1cHBvcnRzIG11bHRpcGxlICJ2aWV3cyIgb2YgYSBmaWxlLiAgSW4gcGFydGljdWxhciwgd2l0aCBjdXJyZW50Ci0JaW1wbGVtZW50YXRpb25zLCBleGVjdXRhYmxlIGZpbGVzIHR5cGljYWxseSBoYXZlIHR3byB0YWJsZXMsIGEKLQlwcm9ncmFtIGhlYWRlciB0YWJsZSBhbmQgYSBzZWN0aW9uIGhlYWRlciB0YWJsZSwgYm90aCBvZiB3aGljaAotCXBhcnRpdGlvbiB0aGUgZXhlY3V0YWJsZS4KLQotCUluIEVMRi1zcGVhaywgdGhlICJsaW5raW5nIHZpZXciIG9mIHRoZSBmaWxlIHVzZXMgdGhlIHNlY3Rpb24gaGVhZGVyCi0JdGFibGUgdG8gYWNjZXNzICJzZWN0aW9ucyIgd2l0aGluIHRoZSBmaWxlLCBhbmQgdGhlICJleGVjdXRpb24gdmlldyIKLQl1c2VzIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZSB0byBhY2Nlc3MgInNlZ21lbnRzIiB3aXRoaW4gdGhlIGZpbGUuCi0JIlNlZ21lbnRzIiB0eXBpY2FsbHkgbWF5IGNvbnRhaW4gYWxsIHRoZSBkYXRhIGZyb20gb25lIG9yIG1vcmUKLQkic2VjdGlvbnMiLgotCi0JTm90ZSB0aGF0IHRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZSBpcyBvcHRpb25hbCBpbiBFTEYgZXhlY3V0YWJsZXMsCi0JYnV0IGl0IGlzIHRoaXMgaW5mb3JtYXRpb24gdGhhdCBpcyBtb3N0IHVzZWZ1bCB0byBnZGIuICBJZiB0aGUKLQlzZWN0aW9uIGhlYWRlciB0YWJsZSBpcyBtaXNzaW5nLCB0aGVuIGdkYiBzaG91bGQgcHJvYmFibHkgdHJ5Ci0JdG8gbWFrZSBkbyB3aXRoIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZS4gIChGSVhNRSkKLQotICAgKDIpICBUaGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgY29tcGlsZWQgdHdpY2UsIG9uY2UgaW4gMzItYml0IG1vZGUgYW5kCi0Jb25jZSBpbiA2NC1iaXQgbW9kZS4gIE1vcmUgb2YgaXQgc2hvdWxkIGJlIG1hZGUgc2l6ZS1pbmRlcGVuZGVudAotCWFuZCBtb3ZlZCBpbnRvIGVsZi5jLgotCi0gICAoMykJRUxGIHNlY3Rpb24gc3ltYm9scyBhcmUgaGFuZGxlZCByYXRoZXIgc2xvcHBpbHkgbm93LiAgVGhpcyBzaG91bGQKLQliZSBjbGVhbmVkIHVwLCBhbmQgRUxGIHNlY3Rpb24gc3ltYm9scyByZWNvbmNpbGVkIHdpdGggQkZEIHNlY3Rpb24KLQlzeW1ib2xzLgotCi0gICAoNCkgIFdlIG5lZWQgYSBwdWJsaXNoZWQgc3BlYyBmb3IgNjQtYml0IEVMRi4gIFdlJ3ZlIGdvdCBzb21lIHN0dWZmIGhlcmUKLQl0aGF0IHdlJ3JlIHVzaW5nIGZvciBTUEFSQyBWOSA2NC1iaXQgY2hpcHMsIGJ1dCBkb24ndCBhc3N1bWUgdGhhdAotCWl0J3MgY2FzdCBpbiBzdG9uZS4KLSAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogUmVuYW1pbmcgc3RydWN0dXJlcywgdHlwZWRlZnMsIG1hY3JvcyBhbmQgZnVuY3Rpb25zIHRvIGJlIHNpemUtc3BlY2lmaWMuICAqLwotI2RlZmluZSBFbGZfRXh0ZXJuYWxfRWhkcglOQU1FKEVsZixFeHRlcm5hbF9FaGRyKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfU3ltCU5BTUUoRWxmLEV4dGVybmFsX1N5bSkKLSNkZWZpbmUgRWxmX0V4dGVybmFsX1NoZHIJTkFNRShFbGYsRXh0ZXJuYWxfU2hkcikKLSNkZWZpbmUgRWxmX0V4dGVybmFsX1BoZHIJTkFNRShFbGYsRXh0ZXJuYWxfUGhkcikKLSNkZWZpbmUgRWxmX0V4dGVybmFsX1JlbAlOQU1FKEVsZixFeHRlcm5hbF9SZWwpCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9SZWxhCU5BTUUoRWxmLEV4dGVybmFsX1JlbGEpCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9EeW4JTkFNRShFbGYsRXh0ZXJuYWxfRHluKQotCi0jZGVmaW5lIGVsZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCU5BTUUoYmZkX2VsZixjb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKQotI2RlZmluZSBlbGZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCU5BTUUoYmZkX2VsZixjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpCi0jZGVmaW5lIGVsZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgXAotICBOQU1FKGJmZF9lbGYsY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQotI2RlZmluZSBlbGZfb2JqZWN0X3AJCQlOQU1FKGJmZF9lbGYsb2JqZWN0X3ApCi0jZGVmaW5lIGVsZl9jb3JlX2ZpbGVfcAkJCU5BTUUoYmZkX2VsZixjb3JlX2ZpbGVfcCkKLSNkZWZpbmUgZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQJTkFNRShiZmRfZWxmLGdldF9zeW10YWJfdXBwZXJfYm91bmQpCi0jZGVmaW5lIGVsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgXAotICBOQU1FKGJmZF9lbGYsZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKQotI2RlZmluZSBlbGZfc3dhcF9yZWxvY19pbgkJTkFNRShiZmRfZWxmLHN3YXBfcmVsb2NfaW4pCi0jZGVmaW5lIGVsZl9zd2FwX3JlbG9jYV9pbgkJTkFNRShiZmRfZWxmLHN3YXBfcmVsb2NhX2luKQotI2RlZmluZSBlbGZfc3dhcF9yZWxvY19vdXQJCU5BTUUoYmZkX2VsZixzd2FwX3JlbG9jX291dCkKLSNkZWZpbmUgZWxmX3N3YXBfcmVsb2NhX291dAkJTkFNRShiZmRfZWxmLHN3YXBfcmVsb2NhX291dCkKLSNkZWZpbmUgZWxmX3N3YXBfc3ltYm9sX2luCQlOQU1FKGJmZF9lbGYsc3dhcF9zeW1ib2xfaW4pCi0jZGVmaW5lIGVsZl9zd2FwX3N5bWJvbF9vdXQJCU5BTUUoYmZkX2VsZixzd2FwX3N5bWJvbF9vdXQpCi0jZGVmaW5lIGVsZl9zd2FwX3BoZHJfaW4JCU5BTUUoYmZkX2VsZixzd2FwX3BoZHJfaW4pCi0jZGVmaW5lIGVsZl9zd2FwX3BoZHJfb3V0CQlOQU1FKGJmZF9lbGYsc3dhcF9waGRyX291dCkKLSNkZWZpbmUgZWxmX3N3YXBfZHluX2luCQkJTkFNRShiZmRfZWxmLHN3YXBfZHluX2luKQotI2RlZmluZSBlbGZfc3dhcF9keW5fb3V0CQlOQU1FKGJmZF9lbGYsc3dhcF9keW5fb3V0KQotI2RlZmluZSBlbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCU5BTUUoYmZkX2VsZixnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZGVmaW5lIGVsZl9jYW5vbmljYWxpemVfcmVsb2MJCU5BTUUoYmZkX2VsZixjYW5vbmljYWxpemVfcmVsb2MpCi0jZGVmaW5lIGVsZl9zbHVycF9zeW1ib2xfdGFibGUJCU5BTUUoYmZkX2VsZixzbHVycF9zeW1ib2xfdGFibGUpCi0jZGVmaW5lIGVsZl9nZXRfc3ltdGFiCQkJTkFNRShiZmRfZWxmLGdldF9zeW10YWIpCi0jZGVmaW5lIGVsZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgXAotICBOQU1FKGJmZF9lbGYsY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKQotI2RlZmluZSBlbGZfbWFrZV9lbXB0eV9zeW1ib2wJCU5BTUUoYmZkX2VsZixtYWtlX2VtcHR5X3N5bWJvbCkKLSNkZWZpbmUgZWxmX2dldF9zeW1ib2xfaW5mbwkJTkFNRShiZmRfZWxmLGdldF9zeW1ib2xfaW5mbykKLSNkZWZpbmUgZWxmX2dldF9saW5lbm8JCQlOQU1FKGJmZF9lbGYsZ2V0X2xpbmVubykKLSNkZWZpbmUgZWxmX3NldF9hcmNoX21hY2gJCU5BTUUoYmZkX2VsZixzZXRfYXJjaF9tYWNoKQotI2RlZmluZSBlbGZfZmluZF9uZWFyZXN0X2xpbmUJCU5BTUUoYmZkX2VsZixmaW5kX25lYXJlc3RfbGluZSkKLSNkZWZpbmUgZWxmX3NpemVvZl9oZWFkZXJzCQlOQU1FKGJmZF9lbGYsc2l6ZW9mX2hlYWRlcnMpCi0jZGVmaW5lIGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cwlOQU1FKGJmZF9lbGYsc2V0X3NlY3Rpb25fY29udGVudHMpCi0jZGVmaW5lIGVsZl9ub19pbmZvX3RvX2hvd3RvCQlOQU1FKGJmZF9lbGYsbm9faW5mb190b19ob3d0bykKLSNkZWZpbmUgZWxmX25vX2luZm9fdG9faG93dG9fcmVsCU5BTUUoYmZkX2VsZixub19pbmZvX3RvX2hvd3RvX3JlbCkKLSNkZWZpbmUgZWxmX2ZpbmRfc2VjdGlvbgkJTkFNRShiZmRfZWxmLGZpbmRfc2VjdGlvbikKLSNkZWZpbmUgZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzCU5BTUUoYmZkX2VsZixiZmRfbGlua19hZGRfc3ltYm9scykKLSNkZWZpbmUgZWxmX2FkZF9keW5hbWljX2VudHJ5CQlOQU1FKGJmZF9lbGYsYWRkX2R5bmFtaWNfZW50cnkpCi0jZGVmaW5lIGVsZl93cml0ZV9zaGRyc19hbmRfZWhkcglOQU1FKGJmZF9lbGYsd3JpdGVfc2hkcnNfYW5kX2VoZHIpCi0jZGVmaW5lIGVsZl93cml0ZV9vdXRfcGhkcnMJCU5BTUUoYmZkX2VsZix3cml0ZV9vdXRfcGhkcnMpCi0jZGVmaW5lIGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKLSAgTkFNRShiZmRfZWxmLGxpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpCi0jZGVmaW5lIGVsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JmZF9maW5hbF9saW5rCQlOQU1FKGJmZF9lbGYsYmZkX2ZpbmFsX2xpbmspCi0jZGVmaW5lIGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiBOQU1FKGJmZF9lbGYsY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiBOQU1FKGJmZF9lbGYsZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9nY19zZWN0aW9ucwkJCU5BTUUoX2JmZF9lbGYsZ2Nfc2VjdGlvbnMpCi0jZGVmaW5lIGVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMgXAotICBOQU1FKF9iZmRfZWxmLGdjX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cykKLSNkZWZpbmUgZWxmX2djX2NvbW1vbl9maW5hbF9saW5rCU5BTUUoX2JmZF9lbGYsZ2NfY29tbW9uX2ZpbmFsX2xpbmspCi0jZGVmaW5lIGVsZl9nY19yZWNvcmRfdnRpbmhlcml0CQlOQU1FKF9iZmRfZWxmLGdjX3JlY29yZF92dGluaGVyaXQpCi0jZGVmaW5lIGVsZl9nY19yZWNvcmRfdnRlbnRyeQkJTkFNRShfYmZkX2VsZixnY19yZWNvcmRfdnRlbnRyeSkKLSNkZWZpbmUgZWxmX2xpbmtfcmVjb3JkX2xvY2FsX2R5bmFtaWNfc3ltYm9sIFwKLSAgTkFNRShfYmZkX2VsZixsaW5rX3JlY29yZF9sb2NhbF9keW5hbWljX3N5bWJvbCkKLQotI2lmIEFSQ0hfU0laRSA9PSA2NAotI2RlZmluZSBFTEZfUl9JTkZPKFgsWSkJRUxGNjRfUl9JTkZPKFgsWSkKLSNkZWZpbmUgRUxGX1JfU1lNKFgpCUVMRjY0X1JfU1lNKFgpCi0jZGVmaW5lIEVMRl9SX1RZUEUoWCkJRUxGNjRfUl9UWVBFKFgpCi0jZGVmaW5lIEVMRkNMQVNTCUVMRkNMQVNTNjQKLSNkZWZpbmUgRklMRV9BTElHTgk4Ci0jZGVmaW5lIExPR19GSUxFX0FMSUdOCTMKLSNlbmRpZgotI2lmIEFSQ0hfU0laRSA9PSAzMgotI2RlZmluZSBFTEZfUl9JTkZPKFgsWSkJRUxGMzJfUl9JTkZPKFgsWSkKLSNkZWZpbmUgRUxGX1JfU1lNKFgpCUVMRjMyX1JfU1lNKFgpCi0jZGVmaW5lIEVMRl9SX1RZUEUoWCkJRUxGMzJfUl9UWVBFKFgpCi0jZGVmaW5lIEVMRkNMQVNTCUVMRkNMQVNTMzIKLSNkZWZpbmUgRklMRV9BTElHTgk0Ci0jZGVmaW5lIExPR19GSUxFX0FMSUdOCTIKLSNlbmRpZgotCi0vKiBTdGF0aWMgZnVuY3Rpb25zICovCi0KLXN0YXRpYyB2b2lkIGVsZl9zd2FwX2VoZHJfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9FaGRyICosIEVsZl9JbnRlcm5hbF9FaGRyICopKTsKLXN0YXRpYyB2b2lkIGVsZl9zd2FwX2VoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfRWhkciAqLCBFbGZfRXh0ZXJuYWxfRWhkciAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc3dhcF9zaGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfU2hkciAqLCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc3dhcF9zaGRyX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1NoZHIgKiwgRWxmX0V4dGVybmFsX1NoZHIgKikpOwotCi0jZGVmaW5lIGVsZl9zdHJpbmd0YWJfaW5pdCBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdAotCi0jZGVmaW5lIHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXgKLQotc3RhdGljIGJvb2xlYW4gZWxmX3NsdXJwX3JlbG9jX3RhYmxlX2Zyb21fc2VjdGlvbiAKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGJmZF9zaXplX3R5cGUsCi0JICAgYXJlbGVudCAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfc2x1cnBfcmVsb2NfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLQotc3RhdGljIHZvaWQgd3JpdGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2ZpbGVfcCBQQVJBTVMgKChFbGZfRXh0ZXJuYWxfRWhkciAqKSk7Ci0KLSNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgZWxmX2RlYnVnX3NlY3Rpb24gUEFSQU1TICgoaW50LCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfZGVidWdfZmlsZSBQQVJBTVMgKChFbGZfSW50ZXJuYWxfRWhkciAqKSk7Ci1zdGF0aWMgY2hhciAqZWxmX3N5bWJvbF9mbGFncyBQQVJBTVMgKChmbGFnd29yZCkpOwotI2VuZGlmCi0MCi0vKiBTdHJ1Y3R1cmUgc3dhcHBpbmcgcm91dGluZXMgKi8KLQotLyogU2hvdWxkIHBlcmhhcHMgdXNlIHB1dF9vZmZzZXQsIHB1dF93b3JkLCBldGMuICBGb3Igbm93LCB0aGUgdHdvIHZlcnNpb25zCi0gICBjYW4gYmUgaGFuZGxlZCBieSBleHBsaWNpdGx5IHNwZWNpZnlpbmcgMzIgYml0cyBvciAidGhlIGxvbmcgdHlwZSIuICAqLwotI2lmIEFSQ0hfU0laRSA9PSA2NAotI2RlZmluZSBwdXRfd29yZAliZmRfaF9wdXRfNjQKLSNkZWZpbmUgcHV0X3NpZ25lZF93b3JkCWJmZF9oX3B1dF9zaWduZWRfNjQKLSNkZWZpbmUgZ2V0X3dvcmQJYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIGdldF9zaWduZWRfd29yZAliZmRfaF9nZXRfc2lnbmVkXzY0Ci0jZW5kaWYKLSNpZiBBUkNIX1NJWkUgPT0gMzIKLSNkZWZpbmUgcHV0X3dvcmQJYmZkX2hfcHV0XzMyCi0jZGVmaW5lIHB1dF9zaWduZWRfd29yZAliZmRfaF9wdXRfc2lnbmVkXzMyCi0jZGVmaW5lIGdldF93b3JkCWJmZF9oX2dldF8zMgotI2RlZmluZSBnZXRfc2lnbmVkX3dvcmQJYmZkX2hfZ2V0X3NpZ25lZF8zMgotI2VuZGlmCi0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgc3ltYm9sIGluIGV4dGVybmFsIGZvcm1hdCBpbnRvIGFuIEVMRiBzeW1ib2wgaW4gaW50ZXJuYWwKLSAgIGZvcm1hdC4gKi8KLQotdm9pZAotZWxmX3N3YXBfc3ltYm9sX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfU3ltICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmRzdDsKLXsKLSAgaW50IHNpZ25lZF92bWEgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnNpZ25fZXh0ZW5kX3ZtYTsKLQotICBkc3QtPnN0X25hbWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X25hbWUpOwotICBpZiAoc2lnbmVkX3ZtYSkKLSAgICBkc3QtPnN0X3ZhbHVlID0gZ2V0X3NpZ25lZF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF92YWx1ZSk7Ci0gIGVsc2UKLSAgICBkc3QtPnN0X3ZhbHVlID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X3ZhbHVlKTsKLSAgZHN0LT5zdF9zaXplID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X3NpemUpOwotICBkc3QtPnN0X2luZm8gPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3RfaW5mbyk7Ci0gIGRzdC0+c3Rfb3RoZXIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3Rfb3RoZXIpOwotICBkc3QtPnN0X3NobmR4ID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9zaG5keCk7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgc3ltYm9sIGluIGludGVybmFsIGZvcm1hdCBpbnRvIGFuIEVMRiBzeW1ib2wgaW4gZXh0ZXJuYWwKLSAgIGZvcm1hdC4gKi8KLQotdm9pZAotZWxmX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgc3JjLCBjZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnNyYzsKLSAgICAgUFRSIGNkc3Q7Ci17Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmRzdCA9IChFbGZfRXh0ZXJuYWxfU3ltICopIGNkc3Q7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5zdF9uYW1lLCBkc3QtPnN0X25hbWUpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5zdF92YWx1ZSwgZHN0LT5zdF92YWx1ZSk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnN0X3NpemUsIGRzdC0+c3Rfc2l6ZSk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnN0X2luZm8sIGRzdC0+c3RfaW5mbyk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnN0X290aGVyLCBkc3QtPnN0X290aGVyKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnN0X3NobmR4LCBkc3QtPnN0X3NobmR4KTsKLX0KLQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIGZpbGUgaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdCBpbnRvIGFuIEVMRiBmaWxlIGhlYWRlciBpbgotICAgaW50ZXJuYWwgZm9ybWF0LiAqLwotCi1zdGF0aWMgdm9pZAotZWxmX3N3YXBfZWhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX0VoZHIgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX0VoZHIgKmRzdDsKLXsKLSAgbWVtY3B5IChkc3QtPmVfaWRlbnQsIHNyYy0+ZV9pZGVudCwgRUlfTklERU5UKTsKLSAgZHN0LT5lX3R5cGUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfdHlwZSk7Ci0gIGRzdC0+ZV9tYWNoaW5lID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX21hY2hpbmUpOwotICBkc3QtPmVfdmVyc2lvbiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV92ZXJzaW9uKTsKLSAgZHN0LT5lX2VudHJ5ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfZW50cnkpOwotICBkc3QtPmVfcGhvZmYgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9waG9mZik7Ci0gIGRzdC0+ZV9zaG9mZiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3Nob2ZmKTsKLSAgZHN0LT5lX2ZsYWdzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX2ZsYWdzKTsKLSAgZHN0LT5lX2Voc2l6ZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9laHNpemUpOwotICBkc3QtPmVfcGhlbnRzaXplID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3BoZW50c2l6ZSk7Ci0gIGRzdC0+ZV9waG51bSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9waG51bSk7Ci0gIGRzdC0+ZV9zaGVudHNpemUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hlbnRzaXplKTsKLSAgZHN0LT5lX3NobnVtID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3NobnVtKTsKLSAgZHN0LT5lX3Noc3RybmR4ID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3Noc3RybmR4KTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBmaWxlIGhlYWRlciBpbiBpbnRlcm5hbCBmb3JtYXQgaW50byBhbiBFTEYgZmlsZSBoZWFkZXIgaW4KLSAgIGV4dGVybmFsIGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLWVsZl9zd2FwX2VoZHJfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfRWhkciAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfRWhkciAqZHN0OwotewotICBtZW1jcHkgKGRzdC0+ZV9pZGVudCwgc3JjLT5lX2lkZW50LCBFSV9OSURFTlQpOwotICAvKiBub3RlIHRoYXQgYWxsIGVsZW1lbnRzIG9mIGRzdCBhcmUgKmFycmF5cyBvZiB1bnNpZ25lZCBjaGFyKiBhbHJlYWR5Li4uICovCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3R5cGUsIGRzdC0+ZV90eXBlKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfbWFjaGluZSwgZHN0LT5lX21hY2hpbmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+ZV92ZXJzaW9uLCBkc3QtPmVfdmVyc2lvbik7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPmVfZW50cnksIGRzdC0+ZV9lbnRyeSk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPmVfcGhvZmYsIGRzdC0+ZV9waG9mZik7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPmVfc2hvZmYsIGRzdC0+ZV9zaG9mZik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5lX2ZsYWdzLCBkc3QtPmVfZmxhZ3MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9laHNpemUsIGRzdC0+ZV9laHNpemUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9waGVudHNpemUsIGRzdC0+ZV9waGVudHNpemUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9waG51bSwgZHN0LT5lX3BobnVtKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfc2hlbnRzaXplLCBkc3QtPmVfc2hlbnRzaXplKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfc2hudW0sIGRzdC0+ZV9zaG51bSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3Noc3RybmR4LCBkc3QtPmVfc2hzdHJuZHgpOwotfQotCi0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgaW4gZXh0ZXJuYWwgZm9ybWF0IGludG8gYW4KLSAgIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBpbnRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfc3dhcF9zaGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfU2hkciAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqZHN0OwotewotICBpbnQgc2lnbmVkX3ZtYSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+c2lnbl9leHRlbmRfdm1hOwotCi0gIGRzdC0+c2hfbmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfbmFtZSk7Ci0gIGRzdC0+c2hfdHlwZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfdHlwZSk7Ci0gIGRzdC0+c2hfZmxhZ3MgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfZmxhZ3MpOwotICBpZiAoc2lnbmVkX3ZtYSkKLSAgICBkc3QtPnNoX2FkZHIgPSBnZXRfc2lnbmVkX3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX2FkZHIpOwotICBlbHNlCi0gICAgZHN0LT5zaF9hZGRyID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX2FkZHIpOwotICBkc3QtPnNoX29mZnNldCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9vZmZzZXQpOwotICBkc3QtPnNoX3NpemUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfc2l6ZSk7Ci0gIGRzdC0+c2hfbGluayA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfbGluayk7Ci0gIGRzdC0+c2hfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfaW5mbyk7Ci0gIGRzdC0+c2hfYWRkcmFsaWduID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX2FkZHJhbGlnbik7Ci0gIGRzdC0+c2hfZW50c2l6ZSA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9lbnRzaXplKTsKLSAgZHN0LT5iZmRfc2VjdGlvbiA9IE5VTEw7Ci0gIGRzdC0+Y29udGVudHMgPSBOVUxMOwotfQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGludGVybmFsIGZvcm1hdCBpbnRvIGFuCi0gICBFTEYgc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgaW4gZXh0ZXJuYWwgZm9ybWF0LiAqLwotCi1zdGF0aWMgdm9pZAotZWxmX3N3YXBfc2hkcl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TaGRyICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9TaGRyICpkc3Q7Ci17Ci0gIC8qIG5vdGUgdGhhdCBhbGwgZWxlbWVudHMgb2YgZHN0IGFyZSAqYXJyYXlzIG9mIHVuc2lnbmVkIGNoYXIqIGFscmVhZHkuLi4gKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnNoX25hbWUsIGRzdC0+c2hfbmFtZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5zaF90eXBlLCBkc3QtPnNoX3R5cGUpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5zaF9mbGFncywgZHN0LT5zaF9mbGFncyk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX2FkZHIsIGRzdC0+c2hfYWRkcik7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX29mZnNldCwgZHN0LT5zaF9vZmZzZXQpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5zaF9zaXplLCBkc3QtPnNoX3NpemUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c2hfbGluaywgZHN0LT5zaF9saW5rKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnNoX2luZm8sIGRzdC0+c2hfaW5mbyk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX2FkZHJhbGlnbiwgZHN0LT5zaF9hZGRyYWxpZ24pOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5zaF9lbnRzaXplLCBkc3QtPnNoX2VudHNpemUpOwotfQotCi0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgcHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgaW4gZXh0ZXJuYWwgZm9ybWF0IGludG8gYW4KLSAgIEVMRiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBpbnRlcm5hbCBmb3JtYXQuICovCi0KLXZvaWQKLWVsZl9zd2FwX3BoZHJfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9QaGRyICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9QaGRyICpkc3Q7Ci17Ci0gIGludCBzaWduZWRfdm1hID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zaWduX2V4dGVuZF92bWE7Ci0KLSAgZHN0LT5wX3R5cGUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfdHlwZSk7Ci0gIGRzdC0+cF9mbGFncyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9mbGFncyk7Ci0gIGRzdC0+cF9vZmZzZXQgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9vZmZzZXQpOwotICBpZiAoc2lnbmVkX3ZtYSkKLSAgICB7Ci0gICAgICBkc3QtPnBfdmFkZHIgPSBnZXRfc2lnbmVkX3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfdmFkZHIpOwotICAgICAgZHN0LT5wX3BhZGRyID0gZ2V0X3NpZ25lZF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX3BhZGRyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkc3QtPnBfdmFkZHIgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF92YWRkcik7Ci0gICAgICBkc3QtPnBfcGFkZHIgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9wYWRkcik7Ci0gICAgfQotICBkc3QtPnBfZmlsZXN6ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfZmlsZXN6KTsKLSAgZHN0LT5wX21lbXN6ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfbWVtc3opOwotICBkc3QtPnBfYWxpZ24gPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9hbGlnbik7Ci19Ci0KLXZvaWQKLWVsZl9zd2FwX3BoZHJfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfUGhkciAqZHN0OwotewotICAvKiBub3RlIHRoYXQgYWxsIGVsZW1lbnRzIG9mIGRzdCBhcmUgKmFycmF5cyBvZiB1bnNpZ25lZCBjaGFyKiBhbHJlYWR5Li4uICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5wX3R5cGUsIGRzdC0+cF90eXBlKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9vZmZzZXQsIGRzdC0+cF9vZmZzZXQpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX3ZhZGRyLCBkc3QtPnBfdmFkZHIpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX3BhZGRyLCBkc3QtPnBfcGFkZHIpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX2ZpbGVzeiwgZHN0LT5wX2ZpbGVzeik7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfbWVtc3osIGRzdC0+cF9tZW1zeik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5wX2ZsYWdzLCBkc3QtPnBfZmxhZ3MpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX2FsaWduLCBkc3QtPnBfYWxpZ24pOwotfQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHJlbG9jIGZyb20gZXh0ZXJuYWwgZm9ybWF0IHRvIGludGVybmFsIGZvcm1hdC4gKi8KLUlOTElORSB2b2lkCi1lbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1JlbCAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGRzdC0+cl9vZmZzZXQgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9vZmZzZXQpOwotICBkc3QtPnJfaW5mbyA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX2luZm8pOwotfQotCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfcmVsb2NhX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfUmVsYSAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBkc3QtPnJfb2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfb2Zmc2V0KTsKLSAgZHN0LT5yX2luZm8gPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9pbmZvKTsKLSAgZHN0LT5yX2FkZGVuZCA9IGdldF9zaWduZWRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9hZGRlbmQpOwotfQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHJlbG9jIGZyb20gaW50ZXJuYWwgZm9ybWF0IHRvIGV4dGVybmFsIGZvcm1hdC4gKi8KLUlOTElORSB2b2lkCi1lbGZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWwgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1JlbCAqZHN0OwotewotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5yX29mZnNldCwgZHN0LT5yX29mZnNldCk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnJfaW5mbywgZHN0LT5yX2luZm8pOwotfQotCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfcmVsb2NhX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cl9vZmZzZXQsIGRzdC0+cl9vZmZzZXQpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5yX2luZm8sIGRzdC0+cl9pbmZvKTsKLSAgcHV0X3NpZ25lZF93b3JkIChhYmZkLCBzcmMtPnJfYWRkZW5kLCBkc3QtPnJfYWRkZW5kKTsKLX0KLQotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX2R5bl9pbiAoYWJmZCwgcCwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFBUUiBwOwotICAgICBFbGZfSW50ZXJuYWxfRHluICpkc3Q7Ci17Ci0gIGNvbnN0IEVsZl9FeHRlcm5hbF9EeW4gKnNyYyA9IChjb25zdCBFbGZfRXh0ZXJuYWxfRHluICopIHA7Ci0KLSAgZHN0LT5kX3RhZyA9IGdldF93b3JkIChhYmZkLCBzcmMtPmRfdGFnKTsKLSAgZHN0LT5kX3VuLmRfdmFsID0gZ2V0X3dvcmQgKGFiZmQsIHNyYy0+ZF91bi5kX3ZhbCk7Ci19Ci0KLUlOTElORSB2b2lkCi1lbGZfc3dhcF9keW5fb3V0IChhYmZkLCBzcmMsIHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX0R5biAqc3JjOwotICAgICBQVFIgcDsKLXsKLSAgRWxmX0V4dGVybmFsX0R5biAqZHN0ID0gKEVsZl9FeHRlcm5hbF9EeW4gKikgcDsKLQotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5kX3RhZywgZHN0LT5kX3RhZyk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPmRfdW4uZF92YWwsIGRzdC0+ZF91bi5kX3ZhbCk7Ci19Ci0MCi0vKiBFTEYgLm8vZXhlYyBmaWxlIHJlYWRpbmcgKi8KLQotCi0vKiBCZWdpbiBwcm9jZXNzaW5nIGEgZ2l2ZW4gb2JqZWN0LgotCi0gICBGaXJzdCB3ZSB2YWxpZGF0ZSB0aGUgZmlsZSBieSByZWFkaW5nIGluIHRoZSBFTEYgaGVhZGVyIGFuZCBjaGVja2luZwotICAgdGhlIG1hZ2ljIG51bWJlci4gICovCi0KLXN0YXRpYyBJTkxJTkUgYm9vbGVhbgotZWxmX2ZpbGVfcCAoeF9laGRycCkKLSAgICAgRWxmX0V4dGVybmFsX0VoZHIgKnhfZWhkcnA7Ci17Ci0gIHJldHVybiAoKHhfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMF0gPT0gRUxGTUFHMCkKLQkgICYmICh4X2VoZHJwLT5lX2lkZW50W0VJX01BRzFdID09IEVMRk1BRzEpCi0JICAmJiAoeF9laGRycC0+ZV9pZGVudFtFSV9NQUcyXSA9PSBFTEZNQUcyKQotCSAgJiYgKHhfZWhkcnAtPmVfaWRlbnRbRUlfTUFHM10gPT0gRUxGTUFHMykpOwotfQotCi0vKiBDaGVjayB0byBzZWUgaWYgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIEFCRkQgbWF0Y2hlcyB0aGUgdGFyZ2V0IHZlY3RvcgotICAgdGhhdCBBQkZEIHBvaW50cyB0by4KLQotICAgTm90ZSB0aGF0IHdlIG1heSBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB3aXRoIHRoZSBzYW1lIEFCRkQsIGJ1dCBkaWZmZXJlbnQKLSAgIHRhcmdldCB2ZWN0b3JzLCBtb3N0IG9mIHdoaWNoIHdpbGwgbm90IG1hdGNoLiAgV2UgaGF2ZSB0byBhdm9pZCBsZWF2aW5nCi0gICBhbnkgc2lkZSBlZmZlY3RzIGluIEFCRkQsIG9yIGFueSBkYXRhIGl0IHBvaW50cyB0byAobGlrZSB0ZGF0YSksIGlmIHRoZQotICAgZmlsZSBkb2VzIG5vdCBtYXRjaCB0aGUgdGFyZ2V0IHZlY3Rvci4gICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEVsZl9FeHRlcm5hbF9FaGRyIHhfZWhkcjsJLyogRWxmIGZpbGUgaGVhZGVyLCBleHRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9FaGRyICppX2VoZHJwOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLSAgRWxmX0V4dGVybmFsX1NoZHIgeF9zaGRyOwkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSwgZXh0ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfU2hkciAqaV9zaGRycCA9IE5VTEw7IC8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlLCBpbnRlcm5hbCBmb3JtICovCi0gIHVuc2lnbmVkIGludCBzaGluZGV4OwotICBjaGFyICpzaHN0cnRhYjsJCS8qIEludGVybmFsIGNvcHkgb2Ygc2VjdGlvbiBoZWFkZXIgc3RyaW5ndGFiICovCi0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICplYmQ7Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhICpwcmVzZXJ2ZWRfdGRhdGEgPSBlbGZfdGRhdGEgKGFiZmQpOwotICBzdHJ1Y3QgZWxmX29ial90ZGF0YSAqbmV3X3RkYXRhID0gTlVMTDsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgLyogUmVhZCBpbiB0aGUgRUxGIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQuICAqLwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiB4X2VoZHIsIHNpemVvZiAoeF9laGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh4X2VoZHIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgICBlbHNlCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIE5vdyBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHZhbGlkIEVMRiBmaWxlLCBhbmQgb25lIHRoYXQgQkZEIGNhbgotICAgICBtYWtlIHVzZSBvZi4gIFRoZSBtYWdpYyBudW1iZXIgbXVzdCBtYXRjaCwgdGhlIGFkZHJlc3Mgc2l6ZSAoJ2NsYXNzJykKLSAgICAgYW5kIGJ5dGUtc3dhcHBpbmcgbXVzdCBtYXRjaCBvdXIgWFZFQyBlbnRyeSwgYW5kIGl0IG11c3QgaGF2ZSBhCi0gICAgIHNlY3Rpb24gaGVhZGVyIHRhYmxlIChGSVhNRTogU2VlIGNvbW1lbnRzIHJlIHNlY3Rpb25zIGF0IHRvcCBvZiB0aGlzCi0gICAgIGZpbGUpLiAqLwotCi0gIGlmICgoZWxmX2ZpbGVfcCAoJnhfZWhkcikgPT0gZmFsc2UpIHx8Ci0gICAgICAoeF9laGRyLmVfaWRlbnRbRUlfVkVSU0lPTl0gIT0gRVZfQ1VSUkVOVCkgfHwKLSAgICAgICh4X2VoZHIuZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1MpKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAvKiBDaGVjayB0aGF0IGZpbGUncyBieXRlIG9yZGVyIG1hdGNoZXMgeHZlYydzICovCi0gIHN3aXRjaCAoeF9laGRyLmVfaWRlbnRbRUlfREFUQV0pCi0gICAgewotICAgIGNhc2UgRUxGREFUQTJNU0I6CQkvKiBCaWctZW5kaWFuICovCi0gICAgICBpZiAoISBiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRUxGREFUQTJMU0I6CQkvKiBMaXR0bGUtZW5kaWFuICovCi0gICAgICBpZiAoISBiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRUxGREFUQU5PTkU6CQkvKiBObyBkYXRhIGVuY29kaW5nIHNwZWNpZmllZCAqLwotICAgIGRlZmF1bHQ6CQkJLyogVW5rbm93biBkYXRhIGVuY29kaW5nIHNwZWNpZmllZCAqLwotICAgICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZWxmX29ial90ZGF0YSBzdHJ1Y3R1cmUgYW5kIGhvb2sgaXQgdXAgdG8KLSAgICAgdGhlIHRkYXRhIHBvaW50ZXIgaW4gdGhlIGJmZC4gICovCi0KLSAgbmV3X3RkYXRhID0gKChzdHJ1Y3QgZWxmX29ial90ZGF0YSAqKQotCSAgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfb2JqX3RkYXRhKSkpOwotICBpZiAobmV3X3RkYXRhID09IE5VTEwpCi0gICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0gIGVsZl90ZGF0YSAoYWJmZCkgPSBuZXdfdGRhdGE7Ci0KLSAgLyogTm93IHRoYXQgd2Uga25vdyB0aGUgYnl0ZSBvcmRlciwgc3dhcCBpbiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyICovCi0gIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgZWxmX3N3YXBfZWhkcl9pbiAoYWJmZCwgJnhfZWhkciwgaV9laGRycCk7Ci0jaWYgREVCVUcgJiAxCi0gIGVsZl9kZWJ1Z19maWxlIChpX2VoZHJwKTsKLSNlbmRpZgotCi0gIC8qIFJlamVjdCBFVF9DT1JFIChoZWFkZXIgaW5kaWNhdGVzIGNvcmUgZmlsZSwgbm90IG9iamVjdCBmaWxlKSAqLwotICBpZiAoaV9laGRycC0+ZV90eXBlID09IEVUX0NPUkUpCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIC8qIElmIHRoZXJlIGlzIG5vIHNlY3Rpb24gaGVhZGVyIHRhYmxlLCB3ZSdyZSBob3NlZC4gKi8KLSAgaWYgKGlfZWhkcnAtPmVfc2hvZmYgPT0gMCkKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgLyogQXMgYSBzaW1wbGUgc2FuaXR5IGNoZWNrLCB2ZXJpZnkgdGhhdCB0aGUgd2hhdCBCRkQgdGhpbmtzIGlzIHRoZQotICAgICBzaXplIG9mIGVhY2ggc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgYWN0dWFsbHkgbWF0Y2hlcyB0aGUgc2l6ZQotICAgICByZWNvcmRlZCBpbiB0aGUgZmlsZS4gKi8KLSAgaWYgKGlfZWhkcnAtPmVfc2hlbnRzaXplICE9IHNpemVvZiAoeF9zaGRyKSkKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgZWJkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIC8qIENoZWNrIHRoYXQgdGhlIEVMRiBlX21hY2hpbmUgZmllbGQgbWF0Y2hlcyB3aGF0IHRoaXMgcGFydGljdWxhcgotICAgICBCRkQgZm9ybWF0IGV4cGVjdHMuICAqLwotICBpZiAoZWJkLT5lbGZfbWFjaGluZV9jb2RlICE9IGlfZWhkcnAtPmVfbWFjaGluZQotICAgICAgJiYgKGViZC0+ZWxmX21hY2hpbmVfYWx0MSA9PSAwIHx8IGlfZWhkcnAtPmVfbWFjaGluZSAhPSBlYmQtPmVsZl9tYWNoaW5lX2FsdDEpCi0gICAgICAmJiAoZWJkLT5lbGZfbWFjaGluZV9hbHQyID09IDAgfHwgaV9laGRycC0+ZV9tYWNoaW5lICE9IGViZC0+ZWxmX21hY2hpbmVfYWx0MikpCi0gICAgewotICAgICAgY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0ICp0YXJnZXRfcHRyOwotCi0gICAgICBpZiAoZWJkLT5lbGZfbWFjaGluZV9jb2RlICE9IEVNX05PTkUpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gICAgICAvKiBUaGlzIGlzIHRoZSBnZW5lcmljIEVMRiB0YXJnZXQuICBMZXQgaXQgbWF0Y2ggYW55IEVMRiB0YXJnZXQKLQkgZm9yIHdoaWNoIHdlIGRvIG5vdCBoYXZlIGEgc3BlY2lmaWMgYmFja2VuZC4gICovCi0gICAgICBmb3IgKHRhcmdldF9wdHIgPSBiZmRfdGFyZ2V0X3ZlY3RvcjsgKnRhcmdldF9wdHIgIT0gTlVMTDsgdGFyZ2V0X3B0cisrKQotCXsKLQkgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiYWNrOwotCi0JICBpZiAoKCp0YXJnZXRfcHRyKS0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCSAgICBjb250aW51ZTsKLQkgIGJhY2sgPSAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKikgKCp0YXJnZXRfcHRyKS0+YmFja2VuZF9kYXRhOwotCSAgaWYgKGJhY2stPmVsZl9tYWNoaW5lX2NvZGUgPT0gaV9laGRycC0+ZV9tYWNoaW5lCi0JICAgICAgfHwgKGJhY2stPmVsZl9tYWNoaW5lX2FsdDEgIT0gMAotCQkgICYmIGJhY2stPmVsZl9tYWNoaW5lX2FsdDEgPT0gaV9laGRycC0+ZV9tYWNoaW5lKQotCSAgICAgIHx8IChiYWNrLT5lbGZfbWFjaGluZV9hbHQyICE9IDAKLQkJICAmJiBiYWNrLT5lbGZfbWFjaGluZV9hbHQyID09IGlfZWhkcnAtPmVfbWFjaGluZSkpCi0JICAgIHsKLQkgICAgICAvKiB0YXJnZXRfcHRyIGlzIGFuIEVMRiBiYWNrZW5kIHdoaWNoIG1hdGNoZXMgdGhpcwotCQkgb2JqZWN0IGZpbGUsIHNvIHJlamVjdCB0aGUgZ2VuZXJpYyBFTEYgdGFyZ2V0LiAgKi8KLQkgICAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChpX2VoZHJwLT5lX3R5cGUgPT0gRVRfRVhFQykKLSAgICBhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gIGVsc2UgaWYgKGlfZWhkcnAtPmVfdHlwZSA9PSBFVF9EWU4pCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLQotICBpZiAoaV9laGRycC0+ZV9waG51bSA+IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRDsKLQotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBlYmQtPmFyY2gsIDApKQotICAgIHsKLSAgICAgIC8qIEl0J3MgT0sgaWYgdGhpcyBmYWlscyBmb3IgdGhlIGdlbmVyaWMgdGFyZ2V0LiAgKi8KLSAgICAgIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gRU1fTk9ORSkKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogUmVtZW1iZXIgdGhlIGVudHJ5IHBvaW50IHNwZWNpZmllZCBpbiB0aGUgRUxGIGZpbGUgaGVhZGVyLiAqLwotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gaV9laGRycC0+ZV9lbnRyeTsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBjb3B5IG9mIHRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZSBpbgotICAgICBpbnRlcm5hbCBmb3JtLCBzZWVrIHRvIHRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZSBpbiB0aGUgZmlsZSwKLSAgICAgcmVhZCBpdCBpbiwgYW5kIGNvbnZlcnQgaXQgdG8gaW50ZXJuYWwgZm9ybS4gICovCi0gIGlfc2hkcnAgPSAoKEVsZl9JbnRlcm5hbF9TaGRyICopCi0JICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoKmlfc2hkcnApICogaV9laGRycC0+ZV9zaG51bSkpOwotICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpID0gKChFbGZfSW50ZXJuYWxfU2hkciAqKikKLQkJCSAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAgICAgIHNpemVvZiAoaV9zaGRycCkgKiBpX2VoZHJwLT5lX3NobnVtKSk7Ci0gIGlmICghaV9zaGRycCB8fCAhZWxmX2VsZnNlY3Rpb25zIChhYmZkKSkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBpX2VoZHJwLT5lX3Nob2ZmLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLSAgZm9yIChzaGluZGV4ID0gMDsgc2hpbmRleCA8IGlfZWhkcnAtPmVfc2hudW07IHNoaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgeF9zaGRyLCBzaXplb2YgeF9zaGRyLCAxLCBhYmZkKSAhPSBzaXplb2YgKHhfc2hkcikpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgICBlbGZfc3dhcF9zaGRyX2luIChhYmZkLCAmeF9zaGRyLCBpX3NoZHJwICsgc2hpbmRleCk7Ci0gICAgICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0gaV9zaGRycCArIHNoaW5kZXg7Ci0KLSAgICAgIC8qIElmIHRoZSBzZWN0aW9uIGlzIGxvYWRlZCwgYnV0IG5vdCBwYWdlIGFsaWduZWQsIGNsZWFyCi0gICAgICAgICBEX1BBR0VELiAgKi8KLSAgICAgIGlmICgoaV9zaGRycFtzaGluZGV4XS5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMAotCSAgJiYgaV9zaGRycFtzaGluZGV4XS5zaF90eXBlICE9IFNIVF9OT0JJVFMKLQkgICYmICgoKGlfc2hkcnBbc2hpbmRleF0uc2hfYWRkciAtIGlfc2hkcnBbc2hpbmRleF0uc2hfb2Zmc2V0KQotCSAgICAgICAlIGViZC0+bWF4cGFnZXNpemUpCi0JICAgICAgIT0gMCkpCi0JYWJmZC0+ZmxhZ3MgJj0gfkRfUEFHRUQ7Ci0gICAgfQotICBpZiAoaV9laGRycC0+ZV9zaHN0cm5keCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGlfZWhkcnAtPmVfc2hzdHJuZHgpKQotCWdvdG8gZ290X25vX21hdGNoOwotICAgIH0KLQotICAvKiBSZWFkIGluIHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotICBpZiAoaV9laGRycC0+ZV9waG51bSA9PSAwKQotICAgIGVsZl90ZGF0YSAoYWJmZCktPnBoZHIgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1BoZHIgKmlfcGhkcjsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5waGRyID0gKChFbGZfSW50ZXJuYWxfUGhkciAqKQotCQkJCWJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgKGlfZWhkcnAtPmVfcGhudW0KLQkJCQkJICAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUGhkcikpKSk7Ci0gICAgICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+cGhkciA9PSBOVUxMKQotCWdvdG8gZ290X25vX21hdGNoOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpX2VoZHJwLT5lX3Bob2ZmLCBTRUVLX1NFVCkgIT0gMCkKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICAgIGlfcGhkciA9IGVsZl90ZGF0YSAoYWJmZCktPnBoZHI7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaV9laGRycC0+ZV9waG51bTsgaSsrLCBpX3BoZHIrKykKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfUGhkciB4X3BoZHI7Ci0KLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgJnhfcGhkciwgc2l6ZW9mIHhfcGhkciwgMSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgeF9waGRyKQotCSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLQkgIGVsZl9zd2FwX3BoZHJfaW4gKGFiZmQsICZ4X3BoZHIsIGlfcGhkcik7Ci0JfQotICAgIH0KLQotICAvKiBSZWFkIGluIHRoZSBzdHJpbmcgdGFibGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIHNlY3Rpb25zLiAgV2UKLSAgICAgd2lsbCBuZWVkIHRoZSBiYXNlIHBvaW50ZXIgdG8gdGhpcyB0YWJsZSBsYXRlci4gKi8KLSAgLyogV2UgcmVhZCB0aGlzIGlubGluZSBub3csIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBnbyB0aHJvdWdoCi0gICAgIGJmZF9zZWN0aW9uX2Zyb21fc2hkciB3aXRoIGl0IChzaW5jZSB0aGlzIHBhcnRpY3VsYXIgc3RydGFiIGlzCi0gICAgIHVzZWQgdG8gZmluZCBhbGwgb2YgdGhlIEVMRiBzZWN0aW9uIG5hbWVzLikgKi8KLQotICBzaHN0cnRhYiA9IGJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uIChhYmZkLCBpX2VoZHJwLT5lX3Noc3RybmR4KTsKLSAgaWYgKCFzaHN0cnRhYikKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLQotICAvKiBPbmNlIGFsbCBvZiB0aGUgc2VjdGlvbiBoZWFkZXJzIGhhdmUgYmVlbiByZWFkIGFuZCBjb252ZXJ0ZWQsIHdlCi0gICAgIGNhbiBzdGFydCBwcm9jZXNzaW5nIHRoZW0uICBOb3RlIHRoYXQgdGhlIGZpcnN0IHNlY3Rpb24gaGVhZGVyIGlzCi0gICAgIGEgZHVtbXkgcGxhY2Vob2xkZXIgZW50cnksIHNvIHdlIGlnbm9yZSBpdC4gICovCi0KLSAgZm9yIChzaGluZGV4ID0gMTsgc2hpbmRleCA8IGlfZWhkcnAtPmVfc2hudW07IHNoaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIHNoaW5kZXgpKQotCWdvdG8gZ290X25vX21hdGNoOwotICAgIH0KLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgZG91YmxlIGNoZWNrIHRoZSBmb3JtYXQgYW5kIG92ZXJyaWRlIGdsb2JhbAotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChlYmQtPmVsZl9iYWNrZW5kX29iamVjdF9wKQotICAgIHsKLSAgICAgIGlmICgoKmViZC0+ZWxmX2JhY2tlbmRfb2JqZWN0X3ApIChhYmZkKSA9PSBmYWxzZSkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgY3JlYXRlZCBhbnkgcmVsb2Mgc2VjdGlvbnMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoCi0gICAgIGRlYnVnZ2luZyBzZWN0aW9ucywgbWFyayB0aGUgcmVsb2Mgc2VjdGlvbnMgYXMgZGVidWdnaW5nIGFzIHdlbGwuICAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUwKLQkgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkgICYmIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9pbmZvID4gMCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHRhcmdfaW5kZXg7Ci0JICBhc2VjdGlvbiAqdGFyZ19zZWM7Ci0KLQkgIHRhcmdfaW5kZXggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfaW5mbzsKLQkgIHRhcmdfc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHRhcmdfaW5kZXgpOwotCSAgaWYgKHRhcmdfc2VjICE9IE5VTEwKLQkgICAgICAmJiAodGFyZ19zZWMtPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLQkgICAgcy0+ZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAoYWJmZC0+eHZlYyk7Ci0KLSBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOgotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSBnb3Rfbm9fbWF0Y2g6Ci0gIGlmIChuZXdfdGRhdGEgIT0gTlVMTAotICAgICAgJiYgbmV3X3RkYXRhLT5lbGZfc2VjdF9wdHIgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgbmV3X3RkYXRhLT5lbGZfc2VjdF9wdHIpOwotICBpZiAoaV9zaGRycCAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpX3NoZHJwKTsKLSAgaWYgKG5ld190ZGF0YSAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuZXdfdGRhdGEpOwotICBlbGZfdGRhdGEgKGFiZmQpID0gcHJlc2VydmVkX3RkYXRhOwotICByZXR1cm4gKE5VTEwpOwotfQotDAotLyogRUxGIC5vL2V4ZWMgZmlsZSB3cml0aW5nICovCi0KLS8qIFdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotewotICBib29sZWFuICpmYWlsZWRwID0gKGJvb2xlYW4gKikgZGF0YTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbGFfaGRyOwotICBFbGZfRXh0ZXJuYWxfUmVsYSAqb3V0Ym91bmRfcmVsb2NhczsKLSAgRWxmX0V4dGVybmFsX1JlbCAqb3V0Ym91bmRfcmVsb2NzOwotICB1bnNpZ25lZCBpbnQgaWR4OwotICBpbnQgdXNlX3JlbGFfcDsKLSAgYXN5bWJvbCAqbGFzdF9zeW0gPSAwOwotICBpbnQgbGFzdF9zeW1faWR4ID0gMDsKLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgZmFpbGVkLCBkb24ndCBkbyBhbnl0aGluZy4gICovCi0gIGlmICgqZmFpbGVkcCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBUaGUgbGlua2VyIGJhY2tlbmQgd3JpdGVzIHRoZSByZWxvY3Mgb3V0IGl0c2VsZiwgYW5kIHNldHMgdGhlCi0gICAgIHJlbG9jX2NvdW50IGZpZWxkIHRvIHplcm8gdG8gaW5oaWJpdCB3cml0aW5nIHRoZW0gaGVyZS4gIEFsc28sCi0gICAgIHNvbWV0aW1lcyB0aGUgU0VDX1JFTE9DIGZsYWcgZ2V0cyBzZXQgZXZlbiB3aGVuIHRoZXJlIGFyZW4ndCBhbnkKLSAgICAgcmVsb2NzLiAgKi8KLSAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgcmVsYV9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkcjsKLQotICByZWxhX2hkci0+c2hfc2l6ZSA9IHJlbGFfaGRyLT5zaF9lbnRzaXplICogc2VjLT5yZWxvY19jb3VudDsKLSAgcmVsYV9oZHItPmNvbnRlbnRzID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByZWxhX2hkci0+c2hfc2l6ZSk7Ci0gIGlmIChyZWxhX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAqZmFpbGVkcCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEZpZ3VyZSBvdXQgd2hldGhlciB0aGUgcmVsb2NhdGlvbnMgYXJlIFJFTEEgb3IgUkVMIHJlbG9jYXRpb25zLiAgKi8KLSAgaWYgKHJlbGFfaGRyLT5zaF90eXBlID09IFNIVF9SRUxBKQotICAgIHVzZV9yZWxhX3AgPSB0cnVlOwotICBlbHNlIGlmIChyZWxhX2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMKQotICAgIHVzZV9yZWxhX3AgPSBmYWxzZTsKLSAgZWxzZQotICAgIC8qIEV2ZXJ5IHJlbG9jYXRpb24gc2VjdGlvbiBzaG91bGQgYmUgZWl0aGVyIGFuIFNIVF9SRUxBIG9yIGFuCi0gICAgICAgU0hUX1JFTCBzZWN0aW9uLiAgKi8KLSAgICBhYm9ydCAoKTsKLQotICAvKiBvcmVsb2NhdGlvbiBoYXMgdGhlIGRhdGEsIHJlbG9jX2NvdW50IGhhcyB0aGUgY291bnQuLi4gKi8KLSAgaWYgKHVzZV9yZWxhX3ApCi0gICAgewotICAgICAgb3V0Ym91bmRfcmVsb2NhcyA9IChFbGZfRXh0ZXJuYWxfUmVsYSAqKSByZWxhX2hkci0+Y29udGVudHM7Ci0KLSAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgc2VjLT5yZWxvY19jb3VudDsgaWR4KyspCi0JewotCSAgRWxmX0ludGVybmFsX1JlbGEgZHN0X3JlbGE7Ci0JICBFbGZfRXh0ZXJuYWxfUmVsYSAqc3JjX3JlbGE7Ci0JICBhcmVsZW50ICpwdHI7Ci0JICBhc3ltYm9sICpzeW07Ci0JICBpbnQgbjsKLQotCSAgcHRyID0gc2VjLT5vcmVsb2NhdGlvbltpZHhdOwotCSAgc3JjX3JlbGEgPSBvdXRib3VuZF9yZWxvY2FzICsgaWR4OwotCi0JICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0Ci0JICAgICBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBzaGFyZWQgbGlicmFyeS4KLQkgICAgIFRoZSBhZGRyZXNzIG9mIGEgQkZEIHJlbG9jIGlzIGFsd2F5cyBzZWN0aW9uIHJlbGF0aXZlLiAgKi8KLQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDApCi0JICAgIGRzdF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzOwotCSAgZWxzZQotCSAgICBkc3RfcmVsYS5yX29mZnNldCA9IHB0ci0+YWRkcmVzcyArIHNlYy0+dm1hOwotCi0JICBzeW0gPSAqcHRyLT5zeW1fcHRyX3B0cjsKLQkgIGlmIChzeW0gPT0gbGFzdF9zeW0pCi0JICAgIG4gPSBsYXN0X3N5bV9pZHg7Ci0JICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikgJiYgc3ltLT52YWx1ZSA9PSAwKQotCSAgICBuID0gU1ROX1VOREVGOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbGFzdF9zeW0gPSBzeW07Ci0JICAgICAgbiA9IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgKGFiZmQsICZzeW0pOwotCSAgICAgIGlmIChuIDwgMCkKLQkJewotCQkgICpmYWlsZWRwID0gdHJ1ZTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBsYXN0X3N5bV9pZHggPSBuOwotCSAgICB9Ci0KLQkgIGlmICgoKnB0ci0+c3ltX3B0cl9wdHIpLT50aGVfYmZkICE9IE5VTEwKLQkgICAgICAmJiAoKnB0ci0+c3ltX3B0cl9wdHIpLT50aGVfYmZkLT54dmVjICE9IGFiZmQtPnh2ZWMKLQkgICAgICAmJiAhIF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jIChhYmZkLCBwdHIpKQotCSAgICB7Ci0JICAgICAgKmZhaWxlZHAgPSB0cnVlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBkc3RfcmVsYS5yX2luZm8gPSBFTEZfUl9JTkZPIChuLCBwdHItPmhvd3RvLT50eXBlKTsKLQotCSAgZHN0X3JlbGEucl9hZGRlbmQgPSBwdHItPmFkZGVuZDsKLQkgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKGFiZmQsICZkc3RfcmVsYSwgc3JjX3JlbGEpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICAvKiBSRUwgcmVsb2NhdGlvbnMgKi8KLSAgICB7Ci0gICAgICBvdXRib3VuZF9yZWxvY3MgPSAoRWxmX0V4dGVybmFsX1JlbCAqKSByZWxhX2hkci0+Y29udGVudHM7Ci0KLSAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgc2VjLT5yZWxvY19jb3VudDsgaWR4KyspCi0JewotCSAgRWxmX0ludGVybmFsX1JlbCBkc3RfcmVsOwotCSAgRWxmX0V4dGVybmFsX1JlbCAqc3JjX3JlbDsKLQkgIGFyZWxlbnQgKnB0cjsKLQkgIGludCBuOwotCSAgYXN5bWJvbCAqc3ltOwotCi0JICBwdHIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeF07Ci0JICBzeW0gPSAqcHRyLT5zeW1fcHRyX3B0cjsKLQkgIHNyY19yZWwgPSBvdXRib3VuZF9yZWxvY3MgKyBpZHg7Ci0KLQkgIC8qIFRoZSBhZGRyZXNzIG9mIGFuIEVMRiByZWxvYyBpcyBzZWN0aW9uIHJlbGF0aXZlIGZvciBhbiBvYmplY3QKLQkgICAgIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgVGhlIGFkZHJlc3Mgb2YgYSBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQkgICAgZHN0X3JlbC5yX29mZnNldCA9IHB0ci0+YWRkcmVzczsKLQkgIGVsc2UKLQkgICAgZHN0X3JlbC5yX29mZnNldCA9IHB0ci0+YWRkcmVzcyArIHNlYy0+dm1hOwotCi0JICBpZiAoc3ltID09IGxhc3Rfc3ltKQotCSAgICBuID0gbGFzdF9zeW1faWR4OwotCSAgZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pICYmIHN5bS0+dmFsdWUgPT0gMCkKLQkgICAgbiA9IFNUTl9VTkRFRjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxhc3Rfc3ltID0gc3ltOwotCSAgICAgIG4gPSBfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIChhYmZkLCAmc3ltKTsKLQkgICAgICBpZiAobiA8IDApCi0JCXsKLQkJICAqZmFpbGVkcCA9IHRydWU7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgbGFzdF9zeW1faWR4ID0gbjsKLQkgICAgfQotCi0JICBpZiAoKCpwdHItPnN5bV9wdHJfcHRyKS0+dGhlX2JmZCAhPSBOVUxMCi0JICAgICAgJiYgKCpwdHItPnN5bV9wdHJfcHRyKS0+dGhlX2JmZC0+eHZlYyAhPSBhYmZkLT54dmVjCi0JICAgICAgJiYgISBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyAoYWJmZCwgcHRyKSkKLQkgICAgewotCSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgZHN0X3JlbC5yX2luZm8gPSBFTEZfUl9JTkZPIChuLCBwdHItPmhvd3RvLT50eXBlKTsKLQotCSAgZWxmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmZHN0X3JlbCwgc3JjX3JlbCk7Ci0JfQotICAgIH0KLX0KLQotLyogV3JpdGUgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotCi1pbnQKLWVsZl93cml0ZV9vdXRfcGhkcnMgKGFiZmQsIHBoZHIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICpwaGRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIHdoaWxlIChjb3VudC0tKQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9QaGRyIGV4dHBoZHI7Ci0gICAgICBlbGZfc3dhcF9waGRyX291dCAoYWJmZCwgcGhkciwgJmV4dHBoZHIpOwotICAgICAgaWYgKGJmZF93cml0ZSAoJmV4dHBoZHIsIHNpemVvZiAoRWxmX0V4dGVybmFsX1BoZHIpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkcikpCi0JcmV0dXJuIC0xOwotICAgICAgcGhkcisrOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgc2VjdGlvbiBoZWFkZXJzIGFuZCB0aGUgRUxGIGZpbGUgaGVhZGVyLiAgKi8KLQotYm9vbGVhbgotZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEVsZl9FeHRlcm5hbF9FaGRyIHhfZWhkcjsJLyogRWxmIGZpbGUgaGVhZGVyLCBleHRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9FaGRyICppX2VoZHJwOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLSAgRWxmX0V4dGVybmFsX1NoZHIgKnhfc2hkcnA7CS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlLCBleHRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUsIGludGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0gIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgaV9zaGRycCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7Ci0KLSAgLyogc3dhcCB0aGUgaGVhZGVyIGJlZm9yZSBzcGl0dGluZyBpdCBvdXQuLi4gKi8KLQotI2lmIERFQlVHICYgMQotICBlbGZfZGVidWdfZmlsZSAoaV9laGRycCk7Ci0jZW5kaWYKLSAgZWxmX3N3YXBfZWhkcl9vdXQgKGFiZmQsIGlfZWhkcnAsICZ4X2VoZHIpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICYgeF9laGRyLCBzaXplb2YgKHhfZWhkciksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKHhfZWhkcikpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBhdCB0aGlzIHBvaW50IHdlJ3ZlIGNvbmNvY3RlZCBhbGwgdGhlIEVMRiBzZWN0aW9ucy4uLiAqLwotICB4X3NoZHJwID0gKEVsZl9FeHRlcm5hbF9TaGRyICopCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCp4X3NoZHJwKSAqIChpX2VoZHJwLT5lX3NobnVtKSk7Ci0gIGlmICgheF9zaGRycCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgaV9laGRycC0+ZV9zaG51bTsgY291bnQrKykKLSAgICB7Ci0jaWYgREVCVUcgJiAyCi0gICAgICBlbGZfZGVidWdfc2VjdGlvbiAoY291bnQsIGlfc2hkcnBbY291bnRdKTsKLSNlbmRpZgotICAgICAgZWxmX3N3YXBfc2hkcl9vdXQgKGFiZmQsIGlfc2hkcnBbY291bnRdLCB4X3NoZHJwICsgY291bnQpOwotICAgIH0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGlfZWhkcnAtPmVfc2hvZmYsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSB4X3NoZHJwLCBzaXplb2YgKCp4X3NoZHJwKSwgaV9laGRycC0+ZV9zaG51bSwgYWJmZCkKLQkgICE9IHNpemVvZiAoKnhfc2hkcnApICogaV9laGRycC0+ZV9zaG51bSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIG5lZWQgdG8gZHVtcCB0aGUgc3RyaW5nIHRhYmxlIHRvby4uLiAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi1sb25nCi1lbGZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkLCBzeW1wdHJzLCBkeW5hbWljKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1wdHJzOwkJLyogQnVmZmVyIGZvciBnZW5lcmF0ZWQgYmZkIHN5bWJvbHMgKi8KLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICBFbGZfSW50ZXJuYWxfU2hkciAqdmVyaGRyOwotICB1bnNpZ25lZCBsb25nIHN5bWNvdW50OwkvKiBOdW1iZXIgb2YgZXh0ZXJuYWwgRUxGIHN5bWJvbHMgKi8KLSAgZWxmX3N5bWJvbF90eXBlICpzeW07CQkvKiBQb2ludGVyIHRvIGN1cnJlbnQgYmZkIHN5bWJvbCAqLwotICBlbGZfc3ltYm9sX3R5cGUgKnN5bWJhc2U7CS8qIEJ1ZmZlciBmb3IgZ2VuZXJhdGVkIGJmZCBzeW1ib2xzICovCi0gIEVsZl9JbnRlcm5hbF9TeW0gaV9zeW07Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKnhfc3ltcCA9IE5VTEw7Ci0gIEVsZl9FeHRlcm5hbF9WZXJzeW0gKnhfdmVyc3ltcCA9IE5VTEw7Ci0KLSAgLyogUmVhZCBlYWNoIHJhdyBFTEYgc3ltYm9sLCBjb252ZXJ0aW5nIGZyb20gZXh0ZXJuYWwgRUxGIGZvcm0gdG8KLSAgICAgaW50ZXJuYWwgRUxGIGZvcm0sIGFuZCB0aGVuIHVzaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBjcmVhdGUgYQotICAgICBjYW5vbmljYWwgYmZkIHN5bWJvbCB0YWJsZSBlbnRyeS4KLQotICAgICBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgdGhlIGluaXRpYWwgYmZkIGNhbm9uaWNhbCBzeW1ib2wgYnVmZmVyCi0gICAgIGJhc2VkIG9uIGEgb25lLXRvLW9uZSBtYXBwaW5nIG9mIHRoZSBFTEYgc3ltYm9scyB0byBjYW5vbmljYWwKLSAgICAgc3ltYm9scy4gIFdlIGFjdHVhbGx5IHVzZSBhbGwgdGhlIEVMRiBzeW1ib2xzLCBzbyB0aGVyZSB3aWxsIGJlIG5vCi0gICAgIHNwYWNlIGxlZnQgb3ZlciBhdCB0aGUgZW5kLiAgV2hlbiB3ZSBoYXZlIGFsbCB0aGUgc3ltYm9scywgd2UKLSAgICAgYnVpbGQgdGhlIGNhbGxlcidzIHBvaW50ZXIgdmVjdG9yLiAqLwotCi0gIGlmICghIGR5bmFtaWMpCi0gICAgewotICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gICAgICB2ZXJoZHIgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zeW10YWJfaGRyOwotICAgICAgaWYgKGVsZl9keW52ZXJzeW0gKGFiZmQpID09IDApCi0JdmVyaGRyID0gTlVMTDsKLSAgICAgIGVsc2UKLQl2ZXJoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyc3ltX2hkcjsKLSAgICAgIGlmICgoZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX3NlY3Rpb24gIT0gMAotCSAgICYmIGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZiA9PSBOVUxMKQotCSAgfHwgKGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnJlZl9zZWN0aW9uICE9IDAKLQkgICAgICAmJiBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWYgPT0gTlVMTCkpCi0JewotCSAgaWYgKCEgX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMgKGFiZmQpKQotCSAgICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0gICAgcmV0dXJuIC0xOwotCi0gIHN5bWNvdW50ID0gaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLQotICBpZiAoc3ltY291bnQgPT0gMCkKLSAgICBzeW0gPSBzeW1iYXNlID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCwgU0VFS19TRVQpID09IC0xKQotCXJldHVybiAtMTsKLQotICAgICAgc3ltYmFzZSA9ICgoZWxmX3N5bWJvbF90eXBlICopCi0JCSBiZmRfemFsbG9jIChhYmZkLCBzeW1jb3VudCAqIHNpemVvZiAoZWxmX3N5bWJvbF90eXBlKSkpOwotICAgICAgaWYgKHN5bWJhc2UgPT0gKGVsZl9zeW1ib2xfdHlwZSAqKSBOVUxMKQotCXJldHVybiAtMTsKLSAgICAgIHN5bSA9IHN5bWJhc2U7Ci0KLSAgICAgIC8qIFRlbXBvcmFyaWx5IGFsbG9jYXRlIHJvb20gZm9yIHRoZSByYXcgRUxGIHN5bWJvbHMuICAqLwotICAgICAgeF9zeW1wID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCi0JCWJmZF9tYWxsb2MgKHN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpOwotICAgICAgaWYgKHhfc3ltcCA9PSBOVUxMICYmIHN5bWNvdW50ICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgeF9zeW1wLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLCBzeW1jb3VudCwgYWJmZCkKLQkgICE9IHN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogUmVhZCB0aGUgcmF3IEVMRiB2ZXJzaW9uIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0KLSAgICAgIGlmICh2ZXJoZHIgIT0gTlVMTAotCSAgJiYgdmVyaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyc3ltKSAhPSBzeW1jb3VudCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiB2ZXJzaW9uIGNvdW50ICglbGQpIGRvZXMgbm90IG1hdGNoIHN5bWJvbCBjb3VudCAoJWxkKSIpLAotCSAgICAgYWJmZC0+ZmlsZW5hbWUsCi0JICAgICAobG9uZykgKHZlcmhkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcnN5bSkpLAotCSAgICAgc3ltY291bnQpOwotCi0JICAvKiBTbHVycCBpbiB0aGUgc3ltYm9scyB3aXRob3V0IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLAotICAgICAgICAgICAgIHNpbmNlIHRoYXQgaXMgbW9yZSBoZWxwZnVsIHRoYW4ganVzdCBxdWl0dGluZy4gICovCi0JICB2ZXJoZHIgPSBOVUxMOwotCX0KLQotICAgICAgaWYgKHZlcmhkciAhPSBOVUxMKQotCXsKLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgdmVyaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgeF92ZXJzeW1wID0gKEVsZl9FeHRlcm5hbF9WZXJzeW0gKikgYmZkX21hbGxvYyAodmVyaGRyLT5zaF9zaXplKTsKLQkgIGlmICh4X3ZlcnN5bXAgPT0gTlVMTCAmJiB2ZXJoZHItPnNoX3NpemUgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgeF92ZXJzeW1wLCAxLCB2ZXJoZHItPnNoX3NpemUsIGFiZmQpCi0JICAgICAgIT0gdmVyaGRyLT5zaF9zaXplKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIC8qIFNraXAgZmlyc3Qgc3ltYm9sLCB3aGljaCBpcyBhIG51bGwgZHVtbXkuICAqLwotICAgICAgZm9yIChpID0gMTsgaSA8IHN5bWNvdW50OyBpKyspCi0JewotCSAgZWxmX3N3YXBfc3ltYm9sX2luIChhYmZkLCB4X3N5bXAgKyBpLCAmaV9zeW0pOwotCSAgbWVtY3B5ICgmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLCAmaV9zeW0sIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpOwotI2lmZGVmIEVMRl9LRUVQX0VYVFNZTQotCSAgbWVtY3B5ICgmc3ltLT5uYXRpdmVfZWxmX3N5bSwgeF9zeW1wICsgaSwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSk7Ci0jZW5kaWYKLQkgIHN5bS0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCi0JICBzeW0tPnN5bWJvbC5uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwKLQkJCQkJCQkgICAgICBoZHItPnNoX2xpbmssCi0JCQkJCQkJICAgICAgaV9zeW0uc3RfbmFtZSk7Ci0KLQkgIHN5bS0+c3ltYm9sLnZhbHVlID0gaV9zeW0uc3RfdmFsdWU7Ci0KLQkgIGlmIChpX3N5bS5zdF9zaG5keCA+IDAgJiYgaV9zeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsCi0JCQkJCQkJICAgIGlfc3ltLnN0X3NobmR4KTsKLQkgICAgICBpZiAoc3ltLT5zeW1ib2wuc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgLyogVGhpcyBzeW1ib2wgaXMgaW4gYSBzZWN0aW9uIGZvciB3aGljaCB3ZSBkaWQgbm90Ci0JCSAgICAgY3JlYXRlIGEgQkZEIHNlY3Rpb24uICBKdXN0IHVzZSBiZmRfYWJzX3NlY3Rpb24sCi0JCSAgICAgYWx0aG91Z2ggaXQgaXMgd3JvbmcuICBGSVhNRS4gICovCi0JCSAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoaV9zeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICB9Ci0JICBlbHNlIGlmIChpX3N5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICAgICAgLyogRWxmIHB1dHMgdGhlIGFsaWdubWVudCBpbnRvIHRoZSBgdmFsdWUnIGZpZWxkLCBhbmQKLQkJIHRoZSBzaXplIGludG8gdGhlIGBzaXplJyBmaWVsZC4gIEJGRCB3YW50cyB0byBzZWUgdGhlCi0JCSBzaXplIGluIHRoZSB2YWx1ZSBmaWVsZCwgYW5kIGRvZXNuJ3QgY2FyZSAoYXQgdGhlCi0JCSBtb21lbnQpIGFib3V0IHRoZSBhbGlnbm1lbnQuICAqLwotCSAgICAgIHN5bS0+c3ltYm9sLnZhbHVlID0gaV9zeW0uc3Rfc2l6ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaV9zeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSByZWxvY2F0ZWFibGUgZmlsZSwgdGhlbiB0aGUgc3ltYm9sIHZhbHVlIGlzCi0gICAgICAgICAgICAgYWxyZWFkeSBzZWN0aW9uIHJlbGF0aXZlLiAgKi8KLQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpICE9IDApCi0JICAgIHN5bS0+c3ltYm9sLnZhbHVlIC09IHN5bS0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLQotCSAgc3dpdGNoIChFTEZfU1RfQklORCAoaV9zeW0uc3RfaW5mbykpCi0JICAgIHsKLQkgICAgY2FzZSBTVEJfTE9DQUw6Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0xPQ0FMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNUQl9HTE9CQUw6Ci0JICAgICAgaWYgKGlfc3ltLnN0X3NobmR4ICE9IFNITl9VTkRFRgotCQkgICYmIGlfc3ltLnN0X3NobmR4ICE9IFNITl9DT01NT04pCi0JCXN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1RCX1dFQUs6Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX1dFQUs7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChFTEZfU1RfVFlQRSAoaV9zeW0uc3RfaW5mbykpCi0JICAgIHsKLQkgICAgY2FzZSBTVFRfU0VDVElPTjoKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU0gfCBCU0ZfREVCVUdHSU5HOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNUVF9GSUxFOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GSUxFIHwgQlNGX0RFQlVHR0lORzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTVFRfRlVOQzoKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1RUX09CSkVDVDoKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfT0JKRUNUOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChkeW5hbWljKQotCSAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRFlOQU1JQzsKLQotCSAgaWYgKHhfdmVyc3ltcCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1ZlcnN5bSBpdmVyc3ltOwotCi0JICAgICAgX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4gKGFiZmQsIHhfdmVyc3ltcCArIGksICZpdmVyc3ltKTsKLQkgICAgICBzeW0tPnZlcnNpb24gPSBpdmVyc3ltLnZzX3ZlcnM7Ci0JICAgIH0KLQotCSAgLyogRG8gc29tZSBiYWNrZW5kLXNwZWNpZmljIHByb2Nlc3Npbmcgb24gdGhpcyBzeW1ib2wuICAqLwotCSAgewotCSAgICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqZWJkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCSAgICBpZiAoZWJkLT5lbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZykKLQkgICAgICAoKmViZC0+ZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcpIChhYmZkLCAmc3ltLT5zeW1ib2wpOwotCSAgfQotCi0JICBzeW0rKzsKLQl9Ci0gICAgfQotCi0gIC8qIERvIHNvbWUgYmFja2VuZC1zcGVjaWZpYyBwcm9jZXNzaW5nIG9uIHRoaXMgc3ltYm9sIHRhYmxlLiAgKi8KLSAgewotICAgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICplYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gICAgaWYgKGViZC0+ZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpCi0gICAgICAoKmViZC0+ZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpIChhYmZkLCBzeW1iYXNlLCBzeW1jb3VudCk7Ci0gIH0KLQotICAvKiBXZSByZWx5IG9uIHRoZSB6YWxsb2MgdG8gY2xlYXIgb3V0IHRoZSBmaW5hbCBzeW1ib2wgZW50cnkuICAqLwotCi0gIHN5bWNvdW50ID0gc3ltIC0gc3ltYmFzZTsKLQotICAvKiBGaWxsIGluIHRoZSB1c2VyJ3Mgc3ltYm9sIHBvaW50ZXIgdmVjdG9yIGlmIG5lZWRlZC4gICovCi0gIGlmIChzeW1wdHJzKQotICAgIHsKLSAgICAgIGxvbmcgbCA9IHN5bWNvdW50OwotCi0gICAgICBzeW0gPSBzeW1iYXNlOwotICAgICAgd2hpbGUgKGwtLSA+IDApCi0JewotCSAgKnN5bXB0cnMrKyA9ICZzeW0tPnN5bWJvbDsKLQkgIHN5bSsrOwotCX0KLSAgICAgICpzeW1wdHJzID0gMDsJCS8qIEZpbmFsIG51bGwgcG9pbnRlciAqLwotICAgIH0KLQotICBpZiAoeF92ZXJzeW1wICE9IE5VTEwpCi0gICAgZnJlZSAoeF92ZXJzeW1wKTsKLSAgaWYgKHhfc3ltcCAhPSBOVUxMKQotICAgIGZyZWUgKHhfc3ltcCk7Ci0gIHJldHVybiBzeW1jb3VudDsKLWVycm9yX3JldHVybjoKLSAgaWYgKHhfdmVyc3ltcCAhPSBOVUxMKQotICAgIGZyZWUgKHhfdmVyc3ltcCk7Ci0gIGlmICh4X3N5bXAgIT0gTlVMTCkKLSAgICBmcmVlICh4X3N5bXApOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qIFJlYWQgIHJlbG9jYXRpb25zIGZvciBBU0VDVCBmcm9tIFJFTF9IRFIuICBUaGVyZSBhcmUgUkVMT0NfQ09VTlQgb2YgCi0gICB0aGVtLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9zbHVycF9yZWxvY190YWJsZV9mcm9tX3NlY3Rpb24gKGFiZmQsIGFzZWN0LCByZWxfaGRyLCByZWxvY19jb3VudCwKLQkJCQkgICAgcmVsZW50cywgc3ltYm9scywgZHluYW1pYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbG9jX2NvdW50OwotICAgICBhcmVsZW50ICpyZWxlbnRzOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgUFRSIGFsbG9jYXRlZCA9IE5VTEw7Ci0gIGJmZF9ieXRlICpuYXRpdmVfcmVsb2NzOwotICBhcmVsZW50ICpyZWxlbnQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgZW50c2l6ZTsKLQotICBhbGxvY2F0ZWQgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxfaGRyLT5zaF9zaXplKTsKLSAgaWYgKGFsbG9jYXRlZCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgcmVsX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChhbGxvY2F0ZWQsIDEsIHJlbF9oZHItPnNoX3NpemUsIGFiZmQpCi0JICAhPSByZWxfaGRyLT5zaF9zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBuYXRpdmVfcmVsb2NzID0gKGJmZF9ieXRlICopIGFsbG9jYXRlZDsKLQotICBlbnRzaXplID0gcmVsX2hkci0+c2hfZW50c2l6ZTsKLSAgQkZEX0FTU0VSVCAoZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpCi0JICAgICAgfHwgZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSk7Ci0KLSAgZm9yIChpID0gMCwgcmVsZW50ID0gcmVsZW50czsKLSAgICAgICBpIDwgcmVsb2NfY291bnQ7Ci0gICAgICAgaSsrLCByZWxlbnQrKywgbmF0aXZlX3JlbG9jcyArPSBlbnRzaXplKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgaWYgKGVudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpCi0JZWxmX3N3YXBfcmVsb2NhX2luIChhYmZkLCAoRWxmX0V4dGVybmFsX1JlbGEgKikgbmF0aXZlX3JlbG9jcywgJnJlbGEpOwotICAgICAgZWxzZQotCXsKLQkgIGVsZl9zd2FwX3JlbG9jX2luIChhYmZkLCAoRWxmX0V4dGVybmFsX1JlbCAqKSBuYXRpdmVfcmVsb2NzLCAmcmVsKTsKLQkgIHJlbGEucl9vZmZzZXQgPSByZWwucl9vZmZzZXQ7Ci0JICByZWxhLnJfaW5mbyA9IHJlbC5yX2luZm87Ci0JICByZWxhLnJfYWRkZW5kID0gMDsKLQl9Ci0KLSAgICAgIC8qIFRoZSBhZGRyZXNzIG9mIGFuIEVMRiByZWxvYyBpcyBzZWN0aW9uIHJlbGF0aXZlIGZvciBhbiBvYmplY3QKLQkgZmlsZSwgYW5kIGFic29sdXRlIGZvciBhbiBleGVjdXRhYmxlIGZpbGUgb3Igc2hhcmVkIGxpYnJhcnkuCi0JIFRoZSBhZGRyZXNzIG9mIGEgbm9ybWFsIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZSwKLQkgYW5kIHRoZSBhZGRyZXNzIG9mIGEgZHluYW1pYyByZWxvYyBpcyBhYnNvbHV0ZS4uICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCB8fCBkeW5hbWljKQotCXJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQ7Ci0gICAgICBlbHNlCi0JcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldCAtIGFzZWN0LT52bWE7Ci0KLSAgICAgIGlmIChFTEZfUl9TWU0gKHJlbGEucl9pbmZvKSA9PSAwKQotCXJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc3ltYm9sICoqcHMsICpzOwotCi0JICBwcyA9IHN5bWJvbHMgKyBFTEZfUl9TWU0gKHJlbGEucl9pbmZvKSAtIDE7Ci0JICBzID0gKnBzOwotCi0JICAvKiBDYW5vbmljYWxpemUgRUxGIHNlY3Rpb24gc3ltYm9scy4gIEZJWE1FOiBXaHk/ICAqLwotCSAgaWYgKChzLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQkgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHBzOwotCSAgZWxzZQotCSAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gcy0+c2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0JfQotCi0gICAgICByZWxlbnQtPmFkZGVuZCA9IHJlbGEucl9hZGRlbmQ7Ci0KLSAgICAgIGlmIChlbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKQotCSgqZWJkLT5lbGZfaW5mb190b19ob3d0bykgKGFiZmQsIHJlbGVudCwgJnJlbGEpOwotICAgICAgZWxzZQotCSgqZWJkLT5lbGZfaW5mb190b19ob3d0b19yZWwpIChhYmZkLCByZWxlbnQsICZyZWwpOwotICAgIH0KLQotICBpZiAoYWxsb2NhdGVkICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2NhdGVkKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jYXRlZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCBpbiBhbmQgc3dhcCB0aGUgZXh0ZXJuYWwgcmVsb2NzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKiBjb25zdCBkID0gZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHIyOwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX2NvdW50OwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX2NvdW50MjsKLSAgYXJlbGVudCAqcmVsZW50czsKLQotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24gIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoISBkeW5hbWljKQotICAgIHsKLSAgICAgIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICB8fCBhc2VjdC0+cmVsb2NfY291bnQgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgcmVsX2hkciA9ICZkLT5yZWxfaGRyOwotICAgICAgcmVsb2NfY291bnQgPSByZWxfaGRyLT5zaF9zaXplIC8gcmVsX2hkci0+c2hfZW50c2l6ZTsKLSAgICAgIHJlbF9oZHIyID0gZC0+cmVsX2hkcjI7Ci0gICAgICByZWxvY19jb3VudDIgPSAocmVsX2hkcjIgCi0JCSAgICAgID8gKHJlbF9oZHIyLT5zaF9zaXplIC8gcmVsX2hkcjItPnNoX2VudHNpemUpCi0JCSAgICAgIDogMCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGFzZWN0LT5yZWxvY19jb3VudCA9PSByZWxvY19jb3VudCArIHJlbG9jX2NvdW50Mik7Ci0gICAgICBCRkRfQVNTRVJUIChhc2VjdC0+cmVsX2ZpbGVwb3MgPT0gcmVsX2hkci0+c2hfb2Zmc2V0Ci0JCSAgfHwgKHJlbF9oZHIyICYmIGFzZWN0LT5yZWxfZmlsZXBvcyA9PSByZWxfaGRyMi0+c2hfb2Zmc2V0KSk7Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBOb3RlIHRoYXQgQVNFQ1QtPlJFTE9DX0NPVU5UIHRlbmRzIG5vdCB0byBiZSBhY2N1cmF0ZSBpbiB0aGlzCi0JIGNhc2UgYmVjYXVzZSByZWxvY2F0aW9ucyBhZ2FpbnN0IHRoaXMgc2VjdGlvbiBtYXkgdXNlIHRoZQotCSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgYW5kIGluIHRoYXQgY2FzZSBiZmRfc2VjdGlvbl9mcm9tX3NoZHIKLQkgaW4gZWxmLmMgZG9lcyBub3QgdXBkYXRlIHRoZSBSRUxPQ19DT1VOVC4gICovCi0gICAgICBpZiAoYXNlY3QtPl9yYXdfc2l6ZSA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICByZWxfaGRyID0gJmQtPnRoaXNfaGRyOwotICAgICAgcmVsb2NfY291bnQgPSByZWxfaGRyLT5zaF9zaXplIC8gcmVsX2hkci0+c2hfZW50c2l6ZTsKLSAgICAgIHJlbF9oZHIyID0gTlVMTDsKLSAgICAgIHJlbG9jX2NvdW50MiA9IDA7Ci0gICAgfQotCi0gIHJlbGVudHMgPSAoKGFyZWxlbnQgKikgCi0JICAgICBiZmRfYWxsb2MgKGFiZmQsIAotCQkJKHJlbG9jX2NvdW50ICsgcmVsb2NfY291bnQyKSAqIHNpemVvZiAoYXJlbGVudCkpKTsKLSAgaWYgKHJlbGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFlbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uIChhYmZkLCBhc2VjdCwKLQkJCQkJICAgcmVsX2hkciwgcmVsb2NfY291bnQsCi0JCQkJCSAgIHJlbGVudHMsCi0JCQkJCSAgIHN5bWJvbHMsIGR5bmFtaWMpKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIGlmIChyZWxfaGRyMiAKLSAgICAgICYmICFlbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uIChhYmZkLCBhc2VjdCwKLQkJCQkJICAgICAgcmVsX2hkcjIsIHJlbG9jX2NvdW50MiwKLQkJCQkJICAgICAgcmVsZW50cyArIHJlbG9jX2NvdW50LAotCQkJCQkgICAgICBzeW1ib2xzLCBkeW5hbWljKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgCi0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsZW50czsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQKLWVsZl9kZWJ1Z19zZWN0aW9uIChudW0sIGhkcikKLSAgICAgaW50IG51bTsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG5TZWN0aW9uIyVkICclcycgMHglLjhseFxuIiwgbnVtLAotCSAgIGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTCA/IGhkci0+YmZkX3NlY3Rpb24tPm5hbWUgOiAiIiwKLQkgICAobG9uZykgaGRyKTsKLSAgZnByaW50ZiAoc3RkZXJyLAotCSAgICJzaF9uYW1lICAgICAgPSAlbGRcdHNoX3R5cGUgICAgICA9ICVsZFx0c2hfZmxhZ3MgICAgID0gJWxkXG4iLAotCSAgIChsb25nKSBoZHItPnNoX25hbWUsCi0JICAgKGxvbmcpIGhkci0+c2hfdHlwZSwKLQkgICAobG9uZykgaGRyLT5zaF9mbGFncyk7Ci0gIGZwcmludGYgKHN0ZGVyciwKLQkgICAic2hfYWRkciAgICAgID0gJWxkXHRzaF9vZmZzZXQgICAgPSAlbGRcdHNoX3NpemUgICAgICA9ICVsZFxuIiwKLQkgICAobG9uZykgaGRyLT5zaF9hZGRyLAotCSAgIChsb25nKSBoZHItPnNoX29mZnNldCwKLQkgICAobG9uZykgaGRyLT5zaF9zaXplKTsKLSAgZnByaW50ZiAoc3RkZXJyLAotCSAgICJzaF9saW5rICAgICAgPSAlbGRcdHNoX2luZm8gICAgICA9ICVsZFx0c2hfYWRkcmFsaWduID0gJWxkXG4iLAotCSAgIChsb25nKSBoZHItPnNoX2xpbmssCi0JICAgKGxvbmcpIGhkci0+c2hfaW5mbywKLQkgICAobG9uZykgaGRyLT5zaF9hZGRyYWxpZ24pOwotICBmcHJpbnRmIChzdGRlcnIsICJzaF9lbnRzaXplICAgPSAlbGRcbiIsCi0JICAgKGxvbmcpIGhkci0+c2hfZW50c2l6ZSk7Ci0gIGZmbHVzaCAoc3RkZXJyKTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9kZWJ1Z19maWxlIChlaGRycCkKLSAgICAgRWxmX0ludGVybmFsX0VoZHIgKmVoZHJwOwotewotICBmcHJpbnRmIChzdGRlcnIsICJlX2VudHJ5ICAgICAgPSAweCUuOGx4XG4iLCAobG9uZykgZWhkcnAtPmVfZW50cnkpOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3Bob2ZmICAgICAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9waG9mZik7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfcGhudW0gICAgICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3BobnVtKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9waGVudHNpemUgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfcGhlbnRzaXplKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9zaG9mZiAgICAgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfc2hvZmYpOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3NobnVtICAgICAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9zaG51bSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfc2hlbnRzaXplICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3NoZW50c2l6ZSk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWVsZl9zeW1ib2xfZmxhZ3MgKGZsYWdzKQotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOwotCi0gIGJ1ZmZlclswXSA9ICdcMCc7Ci0gIGlmIChmbGFncyAmIEJTRl9MT0NBTCkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBsb2NhbCIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9HTE9CQUwpCi0gICAgc3RyY2F0IChidWZmZXIsICIgZ2xvYmFsIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0RFQlVHR0lORykKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBkZWJ1ZyIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9GVU5DVElPTikKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBmdW5jdGlvbiIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9LRUVQKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGtlZXAiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfS0VFUF9HKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGtlZXBfZyIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9XRUFLKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIHdlYWsiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0gICAgc3RyY2F0IChidWZmZXIsICIgc2VjdGlvbi1zeW0iKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfT0xEX0NPTU1PTikKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBvbGQtY29tbW9uIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX05PVF9BVF9FTkQpCi0gICAgc3RyY2F0IChidWZmZXIsICIgbm90LWF0LWVuZCIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBjb25zdHJ1Y3RvciIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9XQVJOSU5HKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIHdhcm5pbmciKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfSU5ESVJFQ1QpCi0gICAgc3RyY2F0IChidWZmZXIsICIgaW5kaXJlY3QiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfRklMRSkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBmaWxlIik7Ci0KLSAgaWYgKGZsYWdzICYgRFlOQU1JQykKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBkeW5hbWljIik7Ci0KLSAgaWYgKGZsYWdzICYgfihCU0ZfTE9DQUwKLQkJfCBCU0ZfR0xPQkFMCi0JCXwgQlNGX0RFQlVHR0lORwotCQl8IEJTRl9GVU5DVElPTgotCQl8IEJTRl9LRUVQCi0JCXwgQlNGX0tFRVBfRwotCQl8IEJTRl9XRUFLCi0JCXwgQlNGX1NFQ1RJT05fU1lNCi0JCXwgQlNGX09MRF9DT01NT04KLQkJfCBCU0ZfTk9UX0FUX0VORAotCQl8IEJTRl9DT05TVFJVQ1RPUgotCQl8IEJTRl9XQVJOSU5HCi0JCXwgQlNGX0lORElSRUNUCi0JCXwgQlNGX0ZJTEUKLQkJfCBCU0ZfRFlOQU1JQykpCi0gICAgc3RyY2F0IChidWZmZXIsICIgdW5rbm93bi1iaXRzIik7Ci0KLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLSNlbmRpZgotDAotI2luY2x1ZGUgImVsZmNvcmUuaCIKLSNpbmNsdWRlICJlbGZsaW5rLmgiCi0MCi0vKiBTaXplLWRlcGVuZGVudCBkYXRhIGFuZCBmdW5jdGlvbnMuICAqLwotY29uc3Qgc3RydWN0IGVsZl9zaXplX2luZm8gTkFNRShfYmZkX2VsZixzaXplX2luZm8pID0gewotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9FaGRyKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkciksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX1NoZHIpLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfRHluKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfTm90ZSksCi0gIEFSQ0hfU0laRSAvIDgsCi0gIDEsCi0gIEFSQ0hfU0laRSwgRklMRV9BTElHTiwKLSAgRUxGQ0xBU1MsIEVWX0NVUlJFTlQsCi0gIGVsZl93cml0ZV9vdXRfcGhkcnMsCi0gIGVsZl93cml0ZV9zaGRyc19hbmRfZWhkciwKLSAgd3JpdGVfcmVsb2NzLAotICBlbGZfc3dhcF9zeW1ib2xfb3V0LAotICBlbGZfc2x1cnBfcmVsb2NfdGFibGUsCi0gIGVsZl9zbHVycF9zeW1ib2xfdGFibGUsCi0gIGVsZl9zd2FwX2R5bl9pbiwKLSAgZWxmX3N3YXBfZHluX291dCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTAotfTsKZGlmZiAtLWdpdCBhL2JmZC9lbGZjb3JlLmggYi9iZmQvZWxmY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ1NGFhLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZjb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyogRUxGIGNvcmUgZmlsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi1jaGFyKgotZWxmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfY29tbWFuZDsKLX0KLQotaW50Ci1lbGZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3NpZ25hbDsKLX0KLQotCi1ib29sZWFuCi1lbGZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQ7Ci0gICAgIGJmZCAqZXhlY19iZmQ7Ci17Ci0gIGNoYXIqIGNvcmVuYW1lOwotCi0gIC8qIHh2ZWNzIG11c3QgbWF0Y2ggaWYgYm90aCBhcmUgRUxGIGZpbGVzIGZvciB0aGUgc2FtZSB0YXJnZXQuICovCi0KLSAgaWYgKGNvcmVfYmZkLT54dmVjICE9IGV4ZWNfYmZkLT54dmVjKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFNlZSBpZiB0aGUgbmFtZSBpbiB0aGUgY29yZWZpbGUgbWF0Y2hlcyB0aGUgZXhlY3V0YWJsZSBuYW1lLiAqLwotCi0gIGNvcmVuYW1lID0gZWxmX3RkYXRhIChjb3JlX2JmZCktPmNvcmVfcHJvZ3JhbTsKLSAgaWYgKGNvcmVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciogZXhlY25hbWUgPSBzdHJyY2hyIChleGVjX2JmZC0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBleGVjbmFtZSA9IGV4ZWNuYW1lID8gZXhlY25hbWUgKyAxIDogZXhlY19iZmQtPmZpbGVuYW1lOwotCi0gICAgICBpZiAoc3RyY21wKGV4ZWNuYW1lLCBjb3JlbmFtZSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qICBDb3JlIGZpbGVzIGFyZSBzaW1wbHkgc3RhbmRhcmQgRUxGIGZvcm1hdHRlZCBmaWxlcyB0aGF0IHBhcnRpdGlvbgotICAgIHRoZSBmaWxlIHVzaW5nIHRoZSBleGVjdXRpb24gdmlldyBvZiB0aGUgZmlsZSAocHJvZ3JhbSBoZWFkZXIgdGFibGUpCi0gICAgcmF0aGVyIHRoYW4gdGhlIGxpbmtpbmcgdmlldy4gIEluIGZhY3QsIHRoZXJlIGlzIG5vIHNlY3Rpb24gaGVhZGVyCi0gICAgdGFibGUgaW4gYSBjb3JlIGZpbGUuCi0KLSAgICBUaGUgcHJvY2VzcyBzdGF0dXMgaW5mb3JtYXRpb24gKGluY2x1ZGluZyB0aGUgY29udGVudHMgb2YgdGhlIGdlbmVyYWwKLSAgICByZWdpc3RlciBzZXQpIGFuZCB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgc2V0IGFyZSBzdG9yZWQgaW4gYQotICAgIHNlZ21lbnQgb2YgdHlwZSBQVF9OT1RFLiAgV2UgaGFuZGNyYWZ0IGEgY291cGxlIG9mIGV4dHJhIGJmZCBzZWN0aW9ucwotICAgIHRoYXQgYWxsb3cgc3RhbmRhcmQgYmZkIGFjY2VzcyB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgKC5yZWcpIGFuZCB0aGUKLSAgICBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKC5yZWcyKS4KLQotICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotZWxmX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEVsZl9FeHRlcm5hbF9FaGRyIHhfZWhkcjsJLyogRWxmIGZpbGUgaGVhZGVyLCBleHRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9FaGRyICppX2VoZHJwOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX1BoZHIgKmlfcGhkcnA7CS8qIEVsZiBwcm9ncmFtIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICB1bnNpZ25lZCBpbnQgcGhpbmRleDsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZDsKLQotICAvKiBSZWFkIGluIHRoZSBFTEYgaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdC4gICovCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiB4X2VoZHIsIHNpemVvZiAoeF9laGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh4X2VoZHIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBDaGVjayB0aGUgbWFnaWMgbnVtYmVyLiAqLwotICBpZiAoZWxmX2ZpbGVfcCAoJnhfZWhkcikgPT0gZmFsc2UpCi0gICAgewotICAgIHdyb25nOgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogRklYTUU6IENoZWNrIEVJX1ZFUlNJT04gaGVyZSAhICovCi0KLSAgLyogQ2hlY2sgdGhlIGFkZHJlc3Mgc2l6ZSAoImNsYXNzIikuICovCi0gIGlmICh4X2VoZHIuZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1MpCi0gICAgZ290byB3cm9uZzsKLQotICAvKiBDaGVjayB0aGUgYnl0ZW9yZGVyLiAqLwotICBzd2l0Y2ggKHhfZWhkci5lX2lkZW50W0VJX0RBVEFdKQotICAgIHsKLSAgICBjYXNlIEVMRkRBVEEyTVNCOgkJLyogQmlnLWVuZGlhbiAqLwotICAgICAgaWYgKCEgYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCWdvdG8gd3Jvbmc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVMRkRBVEEyTFNCOgkJLyogTGl0dGxlLWVuZGlhbiAqLwotICAgICAgaWYgKCEgYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotCWdvdG8gd3Jvbmc7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZ290byB3cm9uZzsKLSAgICB9Ci0KLSAgLyogR2l2ZSBhYmZkIGFuIGVsZl9vYmpfdGRhdGEuICovCi0gIGVsZl90ZGF0YSAoYWJmZCkgPQotICAgIChzdHJ1Y3QgZWxmX29ial90ZGF0YSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfb2JqX3RkYXRhKSk7Ci0gIGlmIChlbGZfdGRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogRklYTUU6IGZyb20gaGVyZSBvbiBkb3duLCAiZ290byB3cm9uZyIgd2lsbCBsZWFrIG1lbW9yeS4gICovCi0KLSAgLyogU3dhcCBpbiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyLCBub3cgdGhhdCB3ZSBoYXZlIHRoZSBieXRlIG9yZGVyLiAqLwotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0gIGVsZl9zd2FwX2VoZHJfaW4gKGFiZmQsICZ4X2VoZHIsIGlfZWhkcnApOwotCi0jaWYgREVCVUcgJiAxCi0gIGVsZl9kZWJ1Z19maWxlIChpX2VoZHJwKTsKLSNlbmRpZgotCi0gIGViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICAvKiBDaGVjayB0aGF0IHRoZSBFTEYgZV9tYWNoaW5lIGZpZWxkIG1hdGNoZXMgd2hhdCB0aGlzIHBhcnRpY3VsYXIKLSAgICAgQkZEIGZvcm1hdCBleHBlY3RzLiAgKi8KLQotICBpZiAoZWJkLT5lbGZfbWFjaGluZV9jb2RlICE9IGlfZWhkcnAtPmVfbWFjaGluZQotICAgICAgJiYgKGViZC0+ZWxmX21hY2hpbmVfYWx0MSA9PSAwCi0JICB8fCBpX2VoZHJwLT5lX21hY2hpbmUgIT0gZWJkLT5lbGZfbWFjaGluZV9hbHQxKQotICAgICAgJiYgKGViZC0+ZWxmX21hY2hpbmVfYWx0MiA9PSAwCi0JICB8fCBpX2VoZHJwLT5lX21hY2hpbmUgIT0gZWJkLT5lbGZfbWFjaGluZV9hbHQyKSkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldF9wdHI7Ci0KLSAgICAgIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gRU1fTk9ORSkKLQlnb3RvIHdyb25nOwotCi0gICAgICAvKiBUaGlzIGlzIHRoZSBnZW5lcmljIEVMRiB0YXJnZXQuICBMZXQgaXQgbWF0Y2ggYW55IEVMRiB0YXJnZXQKLQkgZm9yIHdoaWNoIHdlIGRvIG5vdCBoYXZlIGEgc3BlY2lmaWMgYmFja2VuZC4gICovCi0KLSAgICAgIGZvciAodGFyZ2V0X3B0ciA9IGJmZF90YXJnZXRfdmVjdG9yOyAqdGFyZ2V0X3B0ciAhPSBOVUxMOyB0YXJnZXRfcHRyKyspCi0JewotCSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJhY2s7Ci0KLQkgIGlmICgoKnRhcmdldF9wdHIpLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgIGNvbnRpbnVlOwotCSAgYmFjayA9IChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqKSAoKnRhcmdldF9wdHIpLT5iYWNrZW5kX2RhdGE7Ci0JICBpZiAoYmFjay0+ZWxmX21hY2hpbmVfY29kZSA9PSBpX2VoZHJwLT5lX21hY2hpbmUpCi0JICAgIHsKLQkgICAgICAvKiB0YXJnZXRfcHRyIGlzIGFuIEVMRiBiYWNrZW5kIHdoaWNoIG1hdGNoZXMgdGhpcwotCQkgb2JqZWN0IGZpbGUsIHNvIHJlamVjdCB0aGUgZ2VuZXJpYyBFTEYgdGFyZ2V0LiAgKi8KLQkgICAgICBnb3RvIHdyb25nOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBubyBwcm9ncmFtIGhlYWRlciwgb3IgdGhlIHR5cGUgaXMgbm90IGEgY29yZSBmaWxlLCB0aGVuCi0gICAgIHdlIGFyZSBob3NlZC4gKi8KLSAgaWYgKGlfZWhkcnAtPmVfcGhvZmYgPT0gMCB8fCBpX2VoZHJwLT5lX3R5cGUgIT0gRVRfQ09SRSkKLSAgICBnb3RvIHdyb25nOwotCi0gIC8qIERvZXMgQkZEJ3MgaWRlYSBvZiB0aGUgcGhkciBzaXplIG1hdGNoIHRoZSBzaXplCi0gICAgIHJlY29yZGVkIGluIHRoZSBmaWxlPyAqLwotICBpZiAoaV9laGRycC0+ZV9waGVudHNpemUgIT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkcikpCi0gICAgZ290byB3cm9uZzsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHByb2dyYW0gaGVhZGVycy4gKi8KLSAgaV9waGRycCA9IChFbGZfSW50ZXJuYWxfUGhkciAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqaV9waGRycCkgKiBpX2VoZHJwLT5lX3BobnVtKTsKLSAgaWYgKCFpX3BoZHJwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPnBoZHIgPSBpX3BoZHJwOwotCi0gIC8qIFJlYWQgYW5kIGNvbnZlcnQgdG8gaW50ZXJuYWwgZm9ybS4gKi8KLSAgZm9yIChwaGluZGV4ID0gMDsgcGhpbmRleCA8IGlfZWhkcnAtPmVfcGhudW07ICsrcGhpbmRleCkKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUGhkciB4X3BoZHI7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICZ4X3BoZHIsIHNpemVvZiAoeF9waGRyKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoeF9waGRyKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgZWxmX3N3YXBfcGhkcl9pbiAoYWJmZCwgJnhfcGhkciwgaV9waGRycCArIHBoaW5kZXgpOwotICAgIH0KLQotICAvKiBQcm9jZXNzIGVhY2ggcHJvZ3JhbSBoZWFkZXIuICovCi0gIGZvciAocGhpbmRleCA9IDA7IHBoaW5kZXggPCBpX2VoZHJwLT5lX3BobnVtOyArK3BoaW5kZXgpCi0gICAgewotICAgICAgaWYgKCFfYmZkX2VsZmNvcmVfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGlfcGhkcnAgKyBwaGluZGV4LCBwaGluZGV4KSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogU2V0IHRoZSBtYWNoaW5lIGFyY2hpdGVjdHVyZS4gKi8KLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgZWJkLT5hcmNoLCAwKSkKLSAgICB7Ci0gICAgICAvKiBJdCdzIE9LIGlmIHRoaXMgZmFpbHMgZm9yIHRoZSBnZW5lcmljIHRhcmdldC4gICovCi0gICAgICBpZiAoZWJkLT5lbGZfbWFjaGluZV9jb2RlICE9IEVNX05PTkUpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFNhdmUgdGhlIGVudHJ5IHBvaW50IGZyb20gdGhlIEVMRiBoZWFkZXIuICovCi0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBpX2VoZHJwLT5lX2VudHJ5OwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZmxpbmsuYyBiL2JmZC9lbGZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMDkxNWIuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDUxNSArMCwwIEBACi0vKiBFTEYgbGlua2luZyBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2RlZmluZSBBUkNIX1NJWkUgMAotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotYm9vbGVhbgotX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBpbnQgcHRyYWxpZ247Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiAgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmdvdCIpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3dpdGNoIChiZWQtPnMtPmFyY2hfc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAzMjogcHRyYWxpZ24gPSAyOyBicmVhazsKLSAgICBjYXNlIDY0OiBwdHJhbGlnbiA9IDM7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0KCk7Ci0gICAgfQotCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJlZC0+d2FudF9nb3RfcGx0KQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdvdC5wbHQiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgdGhlIC5nb3QKLSAgICAgKG9yIC5nb3QucGx0KSBzZWN0aW9uLiAgV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUgbGlua2VyIHNjcmlwdAotICAgICBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSBzeW1ib2wgaWYgd2UgYXJlIG5vdCBjcmVhdGluZwotICAgICBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBoID0gTlVMTDsKLSAgaWYgKCEoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkoaW5mbywgYWJmZCwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCi0JIGJlZC0+Z290X3N5bWJvbF9vZmZzZXQsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSBiZWQtPmNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZAotICAgICAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdCA9IGg7Ci0KLSAgLyogVGhlIGZpcnN0IGJpdCBvZiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBpcyB0aGUgaGVhZGVyLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGJlZC0+Z290X2hlYWRlcl9zaXplICsgYmVkLT5nb3Rfc3ltYm9sX29mZnNldDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLQotLyogQ3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFncywgcGx0ZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBpbnQgcHRyYWxpZ24gPSAwOwotCi0gIHN3aXRjaCAoYmVkLT5zLT5hcmNoX3NpemUpCi0gICAgewotICAgIGNhc2UgMzI6IHB0cmFsaWduID0gMjsgYnJlYWs7Ci0gICAgY2FzZSA2NDogcHRyYWxpZ24gPSAzOyBicmVhazsKLSAgICBkZWZhdWx0OiBhYm9ydCgpOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSAucGx0LCAucmVsW2FdLnBsdCwgLmdvdCwgLmdvdC5wbHQsIC5keW5ic3MsIGFuZAotICAgICAucmVsW2FdLmJzcyBzZWN0aW9ucy4gICovCi0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICBwbHRmbGFncyA9IGZsYWdzOwotICBwbHRmbGFncyB8PSBTRUNfQ09ERTsKLSAgaWYgKGJlZC0+cGx0X25vdF9sb2FkZWQpCi0gICAgcGx0ZmxhZ3MgJj0gfiAoU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTKTsKLSAgaWYgKGJlZC0+cGx0X3JlYWRvbmx5KQotICAgIHBsdGZsYWdzIHw9IFNFQ19SRUFET05MWTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5wbHQiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIHBsdGZsYWdzKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBiZWQtPnBsdF9hbGlnbm1lbnQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmVkLT53YW50X3BsdF9zeW0pCi0gICAgewotICAgICAgLyogRGVmaW5lIHRoZSBzeW1ib2wgX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgdGhlCi0JIC5wbHQgc2VjdGlvbi4gICovCi0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBhYmZkLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCi0JICAgICAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSAgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICAgICAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIAotCQkJYmVkLT5kZWZhdWx0X3VzZV9yZWxhX3AgPyAiLnJlbGEucGx0IiA6ICIucmVsLnBsdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJlZC0+d2FudF9keW5ic3MpCi0gICAgewotICAgICAgLyogVGhlIC5keW5ic3Mgc2VjdGlvbiBpcyBhIHBsYWNlIHRvIHB1dCBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkCi0JIGJ5IGR5bmFtaWMgb2JqZWN0cywgYXJlIHJlZmVyZW5jZWQgYnkgcmVndWxhciBvYmplY3RzLCBhbmQgYXJlCi0JIG5vdCBmdW5jdGlvbnMuICBXZSBtdXN0IGFsbG9jYXRlIHNwYWNlIGZvciB0aGVtIGluIHRoZSBwcm9jZXNzCi0JIGltYWdlIGFuZCB1c2UgYSBSXypfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bwotCSBpbml0aWFsaXplIHRoZW0gYXQgcnVuIHRpbWUuICBUaGUgbGlua2VyIHNjcmlwdCBwdXRzIHRoZSAuZHluYnNzCi0JIHNlY3Rpb24gaW50byB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBmaW5hbCBpbWFnZS4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5ic3MiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBTRUNfQUxMT0MpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIC5yZWxbYV0uYnNzIHNlY3Rpb24gaG9sZHMgY29weSByZWxvY3MuICBUaGlzIHNlY3Rpb24gaXMgbm90Ci0gICAgIG5vcm1hbGx5IG5lZWRlZC4gIFdlIG5lZWQgdG8gY3JlYXRlIGl0IGhlcmUsIHRob3VnaCwgc28gdGhhdCB0aGUKLSAgICAgbGlua2VyIHdpbGwgbWFwIGl0IHRvIGFuIG91dHB1dCBzZWN0aW9uLiAgV2UgY2FuJ3QganVzdCBjcmVhdGUgaXQKLSAgICAgb25seSBpZiB3ZSBuZWVkIGl0LCBiZWNhdXNlIHdlIHdpbGwgbm90IGtub3cgd2hldGhlciB3ZSBuZWVkIGl0Ci0gICAgIHVudGlsIHdlIGhhdmUgc2VlbiBhbGwgdGhlIGlucHV0IGZpbGVzLCBhbmQgdGhlIGZpcnN0IHRpbWUgdGhlCi0gICAgIG1haW4gbGlua2VyIGNvZGUgY2FsbHMgQkZEIGFmdGVyIGV4YW1pbmluZyBhbGwgdGhlIGlucHV0IGZpbGVzCi0gICAgIChzaXplX2R5bmFtaWNfc2VjdGlvbnMpIHRoZSBpbnB1dCBzZWN0aW9ucyBoYXZlIGFscmVhZHkgYmVlbgotICAgICBtYXBwZWQgdG8gdGhlIG91dHB1dCBzZWN0aW9ucy4gIElmIHRoZSBzZWN0aW9uIHR1cm5zIG91dCBub3QgdG8KLSAgICAgYmUgbmVlZGVkLCB3ZSBjYW4gZGlzY2FyZCBpdCBsYXRlci4gIFdlIHdpbGwgbmV2ZXIgbmVlZCB0aGlzCi0gICAgIHNlY3Rpb24gd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgc2luY2UgdGhleSBkbyBub3QgdXNlCi0gICAgIGNvcHkgcmVsb2NzLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgCi0JCQkJKGJlZC0+ZGVmYXVsdF91c2VfcmVsYV9wIAotCQkJCSA/ICIucmVsYS5ic3MiIDogIi5yZWwuYnNzIikpOyAKLQkgIGlmIChzID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBwdHJhbGlnbikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotCi0vKiBSZWNvcmQgYSBuZXcgZHluYW1pYyBzeW1ib2wuICBXZSByZWNvcmQgdGhlIGR5bmFtaWMgc3ltYm9scyBhcyB3ZQotICAgcmVhZCB0aGUgaW5wdXQgZmlsZXMsIHNpbmNlIHdlIG5lZWQgdG8gaGF2ZSBhIGxpc3Qgb2YgYWxsIG9mIHRoZW0KLSAgIGJlZm9yZSB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBmaW5hbCBzaXplcyBvZiB0aGUgb3V0cHV0IHNlY3Rpb25zLgotICAgTm90ZSB0aGF0IHdlIG1heSBhY3R1YWxseSBjYWxsIHRoaXMgZnVuY3Rpb24gZXZlbiB0aG91Z2ggd2UgYXJlIG5vdAotICAgZ29pbmcgdG8gb3V0cHV0IGFueSBkeW5hbWljIHN5bWJvbHM7IGluIHNvbWUgY2FzZXMgd2Uga25vdyB0aGF0IGEKLSAgIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBidXQgb25seSBpZiB0aGVyZSBpcwotICAgb25lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZHluc3RyOwotICAgICAgY2hhciAqcCwgKmFsYzsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIGNvcHk7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLSAgICAgIGgtPmR5bmluZHggPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICAgICAgKytlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCi0gICAgICBkeW5zdHIgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cjsKLSAgICAgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBDcmVhdGUgYSBzdHJ0YWIgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2wgbmFtZXMuICAqLwotCSAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPSBkeW5zdHIgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLQkgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgZG9uJ3QgcHV0IGFueSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSBkeW5hbWljIHN0cmluZwotICAgICAgICAgdGFibGUuICAqLwotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBwID0gc3RyY2hyIChuYW1lLCBFTEZfVkVSX0NIUik7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIGFsYyA9IE5VTEw7Ci0JICBjb3B5ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFsYyA9IGJmZF9tYWxsb2MgKHAgLSBuYW1lICsgMSk7Ci0JICBpZiAoYWxjID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN0cm5jcHkgKGFsYywgbmFtZSwgcCAtIG5hbWUpOwotCSAgYWxjW3AgLSBuYW1lXSA9ICdcMCc7Ci0JICBuYW1lID0gYWxjOwotCSAgY29weSA9IHRydWU7Ci0JfQotCi0gICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChkeW5zdHIsIG5hbWUsIHRydWUsIGNvcHkpOwotCi0gICAgICBpZiAoYWxjICE9IE5VTEwpCi0JZnJlZSAoYWxjKTsKLQotICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPmR5bnN0cl9pbmRleCA9IGluZHg7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGR5bmluZGV4IG9mIGEgbG9jYWwgZHluYW1pYyBzeW1ib2wuICAqLwotCi1sb25nCi1fYmZkX2VsZl9saW5rX2xvb2t1cF9sb2NhbF9keW5pbmR4IChpbmZvLCBpbnB1dF9iZmQsIGlucHV0X2luZHgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgbG9uZyBpbnB1dF9pbmR4OwotewotICBzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqZTsKLQotICBmb3IgKGUgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmxvY2FsOyBlIDsgZSA9IGUtPm5leHQpCi0gICAgaWYgKGUtPmlucHV0X2JmZCA9PSBpbnB1dF9iZmQgJiYgZS0+aW5wdXRfaW5keCA9PSBpbnB1dF9pbmR4KQotICAgICAgcmV0dXJuIGUtPmR5bmluZHg7Ci0gIHJldHVybiAtMTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbnVtYmVyIHRoZSBkeW5hbWljIHN5bWJvbHMsIGlmIHNvbWUgb2YKLSAgIHRoZW0gYXJlIHJlbW92ZWQgYmVjYXVzZSB0aGV5IGFyZSBtYXJrZWQgYXMgbG9jYWwuICBUaGlzIGlzIGNhbGxlZAotICAgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19yZW51bWJlcl9oYXNoX3RhYmxlX2R5bnN5bXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19yZW51bWJlcl9oYXNoX3RhYmxlX2R5bnN5bXMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc2l6ZV90ICpjb3VudCA9IChzaXplX3QgKikgZGF0YTsKLQotICBpZiAoaC0+ZHluaW5keCAhPSAtMSkKLSAgICBoLT5keW5pbmR4ID0gKysoKmNvdW50KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXNzaWduIGR5bnN5bSBpbmRpY2llcy4gIEluIGEgc2hhcmVkIGxpYnJhcnkgd2UgZ2VuZXJhdGUgYSBzZWN0aW9uCi0gICBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24sIHdoaWNoIGNvbWUgZmlyc3QuICBOZXh0IGNvbWUgYWxsIG9mCi0gICB0aGUgYmFjay1lbmQgYWxsb2NhdGVkIGxvY2FsIGR5bmFtaWMgc3ltcywgZm9sbG93ZWQgYnkgdGhlIHJlc3Qgb2YKLSAgIHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0KLXVuc2lnbmVkIGxvbmcKLV9iZmRfZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgbG9uZyBkeW5zeW1jb3VudCA9IDA7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqcDsKLSAgICAgIGZvciAocCA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBwIDsgcCA9IHAtPm5leHQpCi0JZWxmX3NlY3Rpb25fZGF0YSAocCktPmR5bmluZHggPSArK2R5bnN5bWNvdW50OwotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5sb2NhbCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqcDsKLSAgICAgIGZvciAocCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlubG9jYWw7IHAgOyBwID0gcC0+bmV4dCkKLQlwLT5keW5pbmR4ID0gKytkeW5zeW1jb3VudDsKLSAgICB9Ci0KLSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICBlbGZfbGlua19yZW51bWJlcl9oYXNoX3RhYmxlX2R5bnN5bXMsCi0JCQkgICZkeW5zeW1jb3VudCk7Ci0KLSAgLyogVGhlcmUgaXMgYW4gdW51c2VkIE5VTEwgZW50cnkgYXQgdGhlIGhlYWQgb2YgdGhlIHRhYmxlIHdoaWNoCi0gICAgIHdlIG11c3QgYWNjb3VudCBmb3IgaW4gb3VyIGNvdW50LiAgVW5sZXNzIHRoZXJlIHdlcmVuJ3QgYW55Ci0gICAgIHN5bWJvbHMsIHdoaWNoIG1lYW5zIHdlJ2xsIGhhdmUgbm8gdGFibGUgYXQgYWxsLiAgKi8KLSAgaWYgKGR5bnN5bWNvdW50ICE9IDApCi0gICAgKytkeW5zeW1jb3VudDsKLQotICByZXR1cm4gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCA9IGR5bnN5bWNvdW50OwotfQotDAotLyogQ3JlYXRlIGEgc3BlY2lhbCBsaW5rZXIgc2VjdGlvbiwgb3IgcmV0dXJuIGEgcG9pbnRlciB0byBhIGxpbmtlcgotICAgc2VjdGlvbiBhbHJlYWR5IGNyZWF0ZWQgKi8KLQotZWxmX2xpbmtlcl9zZWN0aW9uX3QgKgotX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCB3aGljaCwgZGVmYXVsdHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0gd2hpY2g7Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpkZWZhdWx0czsKLXsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotCi0gIC8qIFJlY29yZCB0aGUgZmlyc3QgYmZkIHNlY3Rpb24gdGhhdCBuZWVkcyB0aGUgc3BlY2lhbCBzZWN0aW9uICovCi0gIGlmICghZHlub2JqKQotICAgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lLCBjcmVhdGUgdGhlIHNlY3Rpb24gKi8KLSAgbHNlY3QgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgd2hpY2gpOwotICBpZiAoIWxzZWN0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBsc2VjdCA9IChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKQotCWJmZF9hbGxvYyAoZHlub2JqLCBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl90KSk7Ci0KLSAgICAgICpsc2VjdCA9ICpkZWZhdWx0czsKLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCB3aGljaCkgPSBsc2VjdDsKLSAgICAgIGxzZWN0LT53aGljaCA9IHdoaWNoOwotICAgICAgbHNlY3QtPmhvbGVfd3JpdHRlbl9wID0gZmFsc2U7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGUgc2VjdGlvbnMgYWxyZWFkeSBleGlzdCAqLwotICAgICAgbHNlY3QtPnNlY3Rpb24gPSBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPm5hbWUpOwotICAgICAgaWYgKCFzIHx8IChzLT5mbGFncyAmIGRlZmF1bHRzLT5mbGFncykgIT0gZGVmYXVsdHMtPmZsYWdzKQotCXsKLQkgIGxzZWN0LT5zZWN0aW9uID0gcyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChkeW5vYmosIGxzZWN0LT5uYW1lKTsKLQotCSAgaWYgKHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzLCBkZWZhdWx0cy0+ZmxhZ3MpOwotCSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBsc2VjdC0+YWxpZ25tZW50KTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpIDwgbHNlY3QtPmFsaWdubWVudCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIGxzZWN0LT5hbGlnbm1lbnQpOwotCi0gICAgICBzLT5fcmF3X3NpemUgPSBhbGlnbl9wb3dlciAocy0+X3Jhd19zaXplLCBsc2VjdC0+YWxpZ25tZW50KTsKLQotICAgICAgLyogSXMgdGhlcmUgYSBob2xlIHdlIGhhdmUgdG8gcHJvdmlkZT8gIElmIHNvIGNoZWNrIHdoZXRoZXIgdGhlIHNlZ21lbnQgaXMKLQkgdG9vIGJpZyBhbHJlYWR5ICovCi0gICAgICBpZiAobHNlY3QtPmhvbGVfc2l6ZSkKLQl7Ci0JICBsc2VjdC0+aG9sZV9vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0JICBzLT5fcmF3X3NpemUgKz0gbHNlY3QtPmhvbGVfc2l6ZTsKLQkgIGlmIChsc2VjdC0+aG9sZV9vZmZzZXQgPiBsc2VjdC0+bWF4X2hvbGVfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogU2VjdGlvbiAlcyBpcyBhbHJlYWR5IHRvIGxhcmdlIHRvIHB1dCBob2xlIG9mICVsZCBieXRlcyBpbiIpLAotCQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJICAgICBsc2VjdC0+bmFtZSwKLQkJCQkgICAgIChsb25nKWxzZWN0LT5ob2xlX3NpemUpOwotCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0JICAgIH0KLQl9Ci0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ3JlYXRpbmcgc2VjdGlvbiAlcywgY3VycmVudCBzaXplID0gJWxkXG4iLAotCSAgICAgICBsc2VjdC0+bmFtZSwgKGxvbmcpcy0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0gICAgICBpZiAobHNlY3QtPnN5bV9uYW1lKQotCXsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiQWRkaW5nICVzIHRvIHNlY3Rpb24gJXNcbiIsCi0JCSAgIGxzZWN0LT5zeW1fbmFtZSwKLQkJICAgbHNlY3QtPm5hbWUpOwotI2VuZGlmCi0JICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgIGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBsc2VjdC0+c3ltX25hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICBpZiAoKGggPT0gTlVMTCB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgICAgJiYgIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywKLQkJCQkJCSAgICAgYWJmZCwKLQkJCQkJCSAgICAgbHNlY3QtPnN5bV9uYW1lLAotCQkJCQkJICAgICBCU0ZfR0xPQkFMLAotCQkJCQkJICAgICBzLAotCQkJCQkJICAgICAoKGxzZWN0LT5ob2xlX3NpemUpCi0JCQkJCQkgICAgICA/IHMtPl9yYXdfc2l6ZSAtIGxzZWN0LT5ob2xlX3NpemUgKyBsc2VjdC0+c3ltX29mZnNldAotCQkJCQkJICAgICAgOiBsc2VjdC0+c3ltX29mZnNldCksCi0JCQkJCQkgICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkgICAgIGZhbHNlLAotCQkJCQkJICAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCQkJCQkgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQkgIGlmICgoZGVmYXVsdHMtPndoaWNoICE9IExJTktFUl9TRUNUSU9OX1NEQVRBKQotCSAgICAgICYmIChkZWZhdWx0cy0+d2hpY2ggIT0gTElOS0VSX1NFQ1RJT05fU0RBVEEyKSkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDOwotCi0JICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQkgIGxzZWN0LT5zeW1faGFzaCA9IGg7Ci0KLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAhIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0JfQotICAgIH0KLQotI2lmIDAKLSAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIHNlbnNlLiAgVGhlIHNlY3Rpb25zIHdoaWNoIG1heSBleGlzdCBpbiB0aGUKLSAgICAgb2JqZWN0IGZpbGUgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggdGhlIHNlY3Rpb25zIHdlIHdhbnQgdG8KLSAgICAgY3JlYXRlLiAgKi8KLQotICAvKiBGaW5kIHRoZSByZWxhdGVkIHNlY3Rpb25zIGlmIHRoZXkgaGF2ZSBiZWVuIGNyZWF0ZWQgKi8KLSAgaWYgKGxzZWN0LT5ic3NfbmFtZSAmJiAhbHNlY3QtPmJzc19zZWN0aW9uKQotICAgIGxzZWN0LT5ic3Nfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIGxzZWN0LT5ic3NfbmFtZSk7Ci0KLSAgaWYgKGxzZWN0LT5yZWxfbmFtZSAmJiAhbHNlY3QtPnJlbF9zZWN0aW9uKQotICAgIGxzZWN0LT5yZWxfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIGxzZWN0LT5yZWxfbmFtZSk7Ci0jZW5kaWYKLQotICByZXR1cm4gbHNlY3Q7Ci19Ci0KLQwKLS8qIEZpbmQgYSBsaW5rZXIgZ2VuZXJhdGVkIHBvaW50ZXIgd2l0aCBhIGdpdmVuIGFkZGVuZCBhbmQgdHlwZS4gICovCi0KLWVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoKLV9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAobGlua2VyX3BvaW50ZXJzLCBhZGRlbmQsIHdoaWNoKQotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqbGlua2VyX3BvaW50ZXJzOwotICAgICBiZmRfc2lnbmVkX3ZtYSBhZGRlbmQ7Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2g7Ci17Ci0gIGZvciAoIDsgbGlua2VyX3BvaW50ZXJzICE9IE5VTEw7IGxpbmtlcl9wb2ludGVycyA9IGxpbmtlcl9wb2ludGVycy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAod2hpY2ggPT0gbGlua2VyX3BvaW50ZXJzLT53aGljaCAmJiBhZGRlbmQgPT0gbGlua2VyX3BvaW50ZXJzLT5hZGRlbmQpCi0JcmV0dXJuIGxpbmtlcl9wb2ludGVyczsKLSAgICB9Ci0KLSAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKTA7Ci19Ci0KLQwKLS8qIE1ha2UgdGhlIC5yZWxhIHNlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGVkIGxpbmtlciBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhIChkeW5vYmosIGxzZWN0LCBhbGlnbm1lbnQpCi0gICAgIGJmZCAqZHlub2JqOwotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci17Ci0gIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbHNlY3QtPnJlbF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKLSAgaWYgKGxzZWN0LT5yZWxfc2VjdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxzZWN0LT5yZWxfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKLSAgICAgIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24gPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwKLQkJCQkgICAgICBsc2VjdC0+cmVsX3NlY3Rpb24sCi0JCQkJICAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIGxzZWN0LT5yZWxfc2VjdGlvbiwgYWxpZ25tZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZmxpbmsuaCBiL2JmZC9lbGZsaW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjFhMWYuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmxpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3MDYgKzAsMCBAQAotLyogRUxGIGxpbmtlciBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRUxGIGxpbmtlciBjb2RlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIHJvdXRpbmVzIGNhbGxlZCB2aWEKLSAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2Ugd2hpY2ggbXVzdCByZXR1cm4gZmFpbHVyZS4gICovCi0KLXN0cnVjdCBlbGZfaW5mb19mYWlsZWQKLXsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotfTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbWVyZ2Vfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiwKLQkgICBib29sZWFuICosIGJvb2xlYW4gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfZXhwb3J0X3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9maXhfc3ltYm9sX2ZsYWdzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2NvbGxlY3RfaGFzaF9jb2RlcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbiAKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIFBUUiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIHZvaWQgZWxmX2xpbmtfb3V0cHV0X3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfc2l6ZV9yZWxvY19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfbGlua19hZGp1c3RfcmVsb2NzIAotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgdW5zaWduZWQgaW50LCAKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotCi0vKiBHaXZlbiBhbiBFTEYgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0dXJuIGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIHJldHVybiBlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotDAotLyogU2VhcmNoIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIGFyY2hpdmUgZWxlbWVudCBvZiB0aGUgYXJjaGl2ZSBBQkZECi0gICB3aG9lcyBhcmNob3ZlIG1hcCBjb250YWlucyBhIG1lbnRpb24gb2YgU1lNREVGLCBhbmQgZGV0ZXJtaW5lIGlmCi0gICB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhpcyBlbGVtZW50LiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19pc19kZWZpbmVkX2FyY2hpdmVfc3ltYm9sIChhYmZkLCBzeW1kZWYpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGNhcnN5bSAqIHN5bWRlZjsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiBoZHI7Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKiAgZXN5bTsKLSAgRWxmX0V4dGVybmFsX1N5bSAqICBlc3ltZW5kOwotICBFbGZfRXh0ZXJuYWxfU3ltICogIGJ1ZiA9IE5VTEw7Ci0gIHNpemVfdCBzeW1jb3VudDsKLSAgc2l6ZV90IGV4dHN5bWNvdW50OwotICBzaXplX3QgZXh0c3ltb2ZmOwotICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAKLSAgYWJmZCA9IF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIChhYmZkLCBzeW1kZWYtPmZpbGVfb2Zmc2V0KTsKLSAgaWYgKGFiZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCB8fCBlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBlbHNlCi0gICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotCi0gIC8qIFRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBzeW10YWIgaGVhZGVyIHRlbGxzIHVzIHdoZXJlIHRoZQotICAgICBleHRlcm5hbCBzeW1ib2xzIHN0YXJ0LiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbG9jYWwgc3ltYm9scy4gICovCi0gIGlmIChlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgewotICAgICAgZXh0c3ltY291bnQgPSBzeW1jb3VudDsKLSAgICAgIGV4dHN5bW9mZiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXh0c3ltY291bnQgPSBzeW1jb3VudCAtIGhkci0+c2hfaW5mbzsKLSAgICAgIGV4dHN5bW9mZiA9IGhkci0+c2hfaW5mbzsKLSAgICB9Ci0KLSAgYnVmID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCi0JIGJmZF9tYWxsb2MgKGV4dHN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpOwotICBpZiAoYnVmID09IE5VTEwgJiYgZXh0c3ltY291bnQgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlLgotICAgICBGSVhNRTogIFRoaXMgb3VnaHQgdG8gYmUgY2FjaGVkIHNvbWV3aGVyZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJaGRyLT5zaF9vZmZzZXQgKyBleHRzeW1vZmYgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkICgoUFRSKSBidWYsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksIGV4dHN5bWNvdW50LCBhYmZkKQotCSAgIT0gZXh0c3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLSAgICB7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTY2FuIHRoZSBzeW1ib2wgdGFibGUgbG9va2luZyBmb3IgU1lNREVGLiAgKi8KLSAgZXN5bWVuZCA9IGJ1ZiArIGV4dHN5bWNvdW50OwotICBmb3IgKGVzeW0gPSBidWY7Ci0gICAgICAgZXN5bSA8IGVzeW1lbmQ7Ci0gICAgICAgZXN5bSsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0KLSAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJiBzeW0pOwotCi0gICAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgaGRyLT5zaF9saW5rLCBzeW0uc3RfbmFtZSk7Ci0gICAgICBpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotCWJyZWFrOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCBzeW1kZWYtPm5hbWUpID09IDApCi0JewotCSAgcmVzdWx0ID0KLQkgICAgKEVMRl9TVF9CSU5EIChzeW0uc3RfaW5mbykgPT0gU1RCX0dMT0JBTCkKLQkgICAgJiYgKHN5bS5zdF9zaG5keCAhPSBTSE5fVU5ERUYpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmcmVlIChidWYpOwotICAKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQwKLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBFTEYgYXJjaGl2ZSBmaWxlIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4gIFdlCi0gICBkb24ndCB1c2UgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyBiZWNhdXNlIG9mIGEKLSAgIHByb2JsZW0gd2hpY2ggYXJpc2VzIG9uIFVuaXhXYXJlLiAgVGhlIFVuaXhXYXJlIGxpYmMuc28gaXMgYW4KLSAgIGFyY2hpdmUgd2hpY2ggaW5jbHVkZXMgYW4gZW50cnkgbGliYy5zby4xIHdoaWNoIGRlZmluZXMgYSBidW5jaCBvZgotICAgc3ltYm9scy4gIFRoZSBsaWJjLnNvIGFyY2hpdmUgYWxzbyBpbmNsdWRlcyBhIG51bWJlciBvZiBvdGhlcgotICAgb2JqZWN0IGZpbGVzLCB3aGljaCBhbHNvIGRlZmluZSBzeW1ib2xzLCBzb21lIG9mIHdoaWNoIGFyZSB0aGUgc2FtZQotICAgYXMgdGhvc2UgZGVmaW5lZCBpbiBsaWJjLnNvLjEuICBDb3JyZWN0IGxpbmtpbmcgcmVxdWlyZXMgdGhhdCB3ZQotICAgY29uc2lkZXIgZWFjaCBvYmplY3QgZmlsZSBpbiB0dXJuLCBhbmQgaW5jbHVkZSBpdCBpZiBpdCBkZWZpbmVzIGFueQotICAgc3ltYm9scyB3ZSBuZWVkLiAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyBkb2VzIG5vdCBkbwotICAgdGhpczsgaXQgbG9va3MgdGhyb3VnaCB0aGUgbGlzdCBvZiB1bmRlZmluZWQgc3ltYm9scywgYW5kIGluY2x1ZGVzCi0gICBhbnkgb2JqZWN0IGZpbGUgd2hpY2ggZGVmaW5lcyB0aGVtLiAgV2hlbiB0aGlzIGFsZ29yaXRobSBpcyB1c2VkIG9uCi0gICBVbml4V2FyZSwgaXQgd2luZHMgdXAgcHVsbGluZyBpbiBsaWJjLnNvLjEgZWFybHkgYW5kIGRlZmluaW5nIGEKLSAgIGJ1bmNoIG9mIHN5bWJvbHMuICBUaGlzIG1lYW5zIHRoYXQgc29tZSBvZiB0aGUgb3RoZXIgb2JqZWN0cyBpbiB0aGUKLSAgIGFyY2hpdmUgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgbGluaywgd2hpY2ggaXMgaW5jb3JyZWN0IHNpbmNlIHRoZXkKLSAgIHByZWNlZGUgbGliYy5zby4xIGluIHRoZSBhcmNoaXZlLgotCi0gICBGb3J0dW5hdGVseSwgRUxGIGFyY2hpdmUgaGFuZGxpbmcgaXMgc2ltcGxlciB0aGFuIHRoYXQgZG9uZSBieQotICAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scywgd2hpY2ggaGFzIHRvIGFsbG93IGZvciBhLm91dAotICAgb2RkaXRpZXMuICBJbiBFTEYsIGlmIHdlIGZpbmQgYSBzeW1ib2wgaW4gdGhlIGFyY2hpdmUgbWFwLCBhbmQgdGhlCi0gICBzeW1ib2wgaXMgY3VycmVudGx5IHVuZGVmaW5lZCwgd2Uga25vdyB0aGF0IHdlIG11c3QgcHVsbCBpbiB0aGF0Ci0gICBvYmplY3QgZmlsZS4KLQotICAgVW5mb3J0dW5hdGVseSwgd2UgZG8gaGF2ZSB0byBtYWtlIG11bHRpcGxlIHBhc3NlcyBvdmVyIHRoZSBzeW1ib2wKLSAgIHRhYmxlIHVudGlsIG5vdGhpbmcgZnVydGhlciBpcyByZXNvbHZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzeW1pbmRleCBjOwotICBib29sZWFuICpkZWZpbmVkID0gTlVMTDsKLSAgYm9vbGVhbiAqaW5jbHVkZWQgPSBOVUxMOwotICBjYXJzeW0gKnN5bWRlZnM7Ci0gIGJvb2xlYW4gbG9vcDsKLQotICBpZiAoISBiZmRfaGFzX21hcCAoYWJmZCkpCi0gICAgewotICAgICAgLyogQW4gZW1wdHkgYXJjaGl2ZSBpcyBhIHNwZWNpYWwgY2FzZS4gICovCi0gICAgICBpZiAoYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgKGJmZCAqKSBOVUxMKSA9PSBOVUxMKQotCXJldHVybiB0cnVlOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2FybWFwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogS2VlcCB0cmFjayBvZiBhbGwgc3ltYm9scyB3ZSBrbm93IHRvIGJlIGFscmVhZHkgZGVmaW5lZCwgYW5kIGFsbAotICAgICBmaWxlcyB3ZSBrbm93IHRvIGJlIGFscmVhZHkgaW5jbHVkZWQuICBUaGlzIGlzIHRvIHNwZWVkIHVwIHRoZQotICAgICBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgcGFzc2VzLiAgKi8KLSAgYyA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZfY291bnQ7Ci0gIGlmIChjID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGRlZmluZWQgPSAoYm9vbGVhbiAqKSBiZmRfbWFsbG9jIChjICogc2l6ZW9mIChib29sZWFuKSk7Ci0gIGluY2x1ZGVkID0gKGJvb2xlYW4gKikgYmZkX21hbGxvYyAoYyAqIHNpemVvZiAoYm9vbGVhbikpOwotICBpZiAoZGVmaW5lZCA9PSAoYm9vbGVhbiAqKSBOVUxMIHx8IGluY2x1ZGVkID09IChib29sZWFuICopIE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG1lbXNldCAoZGVmaW5lZCwgMCwgYyAqIHNpemVvZiAoYm9vbGVhbikpOwotICBtZW1zZXQgKGluY2x1ZGVkLCAwLCBjICogc2l6ZW9mIChib29sZWFuKSk7Ci0KLSAgc3ltZGVmcyA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzOwotCi0gIGRvCi0gICAgewotICAgICAgZmlsZV9wdHIgbGFzdDsKLSAgICAgIHN5bWluZGV4IGk7Ci0gICAgICBjYXJzeW0gKnN5bWRlZjsKLSAgICAgIGNhcnN5bSAqc3ltZGVmZW5kOwotCi0gICAgICBsb29wID0gZmFsc2U7Ci0gICAgICBsYXN0ID0gLTE7Ci0KLSAgICAgIHN5bWRlZiA9IHN5bWRlZnM7Ci0gICAgICBzeW1kZWZlbmQgPSBzeW1kZWYgKyBjOwotICAgICAgZm9yIChpID0gMDsgc3ltZGVmIDwgc3ltZGVmZW5kOyBzeW1kZWYrKywgaSsrKQotCXsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgYmZkICplbGVtZW50OwotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnVuZGVmc190YWlsOwotCSAgc3ltaW5kZXggbWFyazsKLQotCSAgaWYgKGRlZmluZWRbaV0gfHwgaW5jbHVkZWRbaV0pCi0JICAgIGNvbnRpbnVlOwotCSAgaWYgKHN5bWRlZi0+ZmlsZV9vZmZzZXQgPT0gbGFzdCkKLQkgICAgewotCSAgICAgIGluY2x1ZGVkW2ldID0gdHJ1ZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgc3ltZGVmLT5uYW1lLAotCQkJCSAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNoYXIgKnAsICpjb3B5OwotCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIGRlZmF1bHQgdmVyc2lvbiAodGhlIG5hbWUgY29udGFpbnMgQEApLAotCQkgbG9vayB1cCB0aGUgc3ltYm9sIGFnYWluIHdpdGhvdXQgdGhlIHZlcnNpb24uICBUaGUKLQkJIGVmZmVjdCBpcyB0aGF0IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCB3aXRob3V0IHRoZQotCQkgdmVyc2lvbiB3aWxsIGJlIG1hdGNoZWQgYnkgdGhlIGRlZmF1bHQgc3ltYm9sIGluIHRoZQotCQkgYXJjaGl2ZS4gICovCi0KLQkgICAgICBwID0gc3RyY2hyIChzeW1kZWYtPm5hbWUsIEVMRl9WRVJfQ0hSKTsKLQkgICAgICBpZiAocCA9PSBOVUxMIHx8IHBbMV0gIT0gRUxGX1ZFUl9DSFIpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgY29weSA9IGJmZF9hbGxvYyAoYWJmZCwgcCAtIHN5bWRlZi0+bmFtZSArIDEpOwotCSAgICAgIGlmIChjb3B5ID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIG1lbWNweSAoY29weSwgc3ltZGVmLT5uYW1lLCBwIC0gc3ltZGVmLT5uYW1lKTsKLQkgICAgICBjb3B5W3AgLSBzeW1kZWYtPm5hbWVdID0gJ1wwJzsKLQotCSAgICAgIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBjb3B5LAotCQkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBjb3B5KTsKLQkgICAgfQotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkgICAgewotCSAgICAgIC8qIFdlIGN1cnJlbnRseSBoYXZlIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBhcmNoaXZlIG1hcCBjb250YWlucwotCQkgYSByZWZlcmVuY2UgdG8gdGhpcyBzeW1ib2wsIHNvIHdlIG1heSB3YW50IHRvIGluY2x1ZGUgaXQuICBXZQotCQkgb25seSB3YW50IHRvIGluY2x1ZGUgaXQgaG93ZXZlciwgaWYgdGhpcyBhcmNoaXZlIGVsZW1lbnQKLQkJIGNvbnRhaW5zIGEgZGVmaW5pdGlvbiBvZiB0aGUgc3ltYm9sLCBub3QganVzdCBhbm90aGVyIGNvbW1vbgotCQkgZGVjbGFyYXRpb24gb2YgaXQuCi0KLQkJIFVuZm9ydHVuYXRlbHkgc29tZSBhcmNoaXZlcnMgKGluY2x1ZGluZyBHTlUgYXIpIHdpbGwgcHV0Ci0JCSBkZWNsYXJhdGlvbnMgb2YgY29tbW9uIHN5bWJvbHMgaW50byB0aGVpciBhcmNoaXZlIG1hcHMsIGFzCi0JCSB3ZWxsIGFzIHJlYWwgZGVmaW5pdGlvbnMsIHNvIHdlIGNhbm5vdCBqdXN0IGdvIGJ5IHRoZSBhcmNoaXZlCi0JCSBtYXAgYWxvbmUuICBJbnN0ZWFkIHdlIG11c3QgcmVhZCBpbiB0aGUgZWxlbWVudCdzIHN5bWJvbAotCQkgdGFibGUgYW5kIGNoZWNrIHRoYXQgdG8gc2VlIHdoYXQga2luZCBvZiBzeW1ib2wgZGVmaW5pdGlvbgotCQkgdGhpcyBpcy4gICovCi0JICAgICAgaWYgKCEgZWxmX2xpbmtfaXNfZGVmaW5lZF9hcmNoaXZlX3N5bWJvbCAoYWJmZCwgc3ltZGVmKSkKLQkJY29udGludWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQkgICAgewotCSAgICAgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCWRlZmluZWRbaV0gPSB0cnVlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFdlIG5lZWQgdG8gaW5jbHVkZSB0aGlzIGFyY2hpdmUgbWVtYmVyLiAgKi8KLQotCSAgZWxlbWVudCA9IF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIChhYmZkLCBzeW1kZWYtPmZpbGVfb2Zmc2V0KTsKLQkgIGlmIChlbGVtZW50ID09IChiZmQgKikgTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGVsZW1lbnQsIGJmZF9vYmplY3QpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogRG91YmxlY2hlY2sgdGhhdCB3ZSBoYXZlIG5vdCBpbmNsdWRlZCB0aGlzIG9iamVjdAotCSAgICAgYWxyZWFkeS0taXQgc2hvdWxkIGJlIGltcG9zc2libGUsIGJ1dCB0aGVyZSBtYXkgYmUKLQkgICAgIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSBhcmNoaXZlLiAgKi8KLQkgIGlmIChlbGVtZW50LT5hcmNoaXZlX3Bhc3MgIT0gMCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPSAxOwotCi0JICB1bmRlZnNfdGFpbCA9IGluZm8tPmhhc2gtPnVuZGVmc190YWlsOwotCi0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGVsZW1lbnQsCi0JCQkJCQkJIHN5bWRlZi0+bmFtZSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKCEgZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChlbGVtZW50LCBpbmZvKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIElmIHRoZXJlIGFyZSBhbnkgbmV3IHVuZGVmaW5lZCBzeW1ib2xzLCB3ZSBuZWVkIHRvIG1ha2UKLQkgICAgIGFub3RoZXIgcGFzcyB0aHJvdWdoIHRoZSBhcmNoaXZlIGluIG9yZGVyIHRvIHNlZSB3aGV0aGVyCi0JICAgICB0aGV5IGNhbiBiZSBkZWZpbmVkLiAgRklYTUU6IFRoaXMgaXNuJ3QgcGVyZmVjdCwgYmVjYXVzZQotCSAgICAgY29tbW9uIHN5bWJvbHMgd2luZCB1cCBvbiB1bmRlZnNfdGFpbCBhbmQgYmVjYXVzZSBhbgotCSAgICAgdW5kZWZpbmVkIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGxhdGVyIG9uIGluIHRoaXMgcGFzcwotCSAgICAgZG9lcyBub3QgcmVxdWlyZSBhbm90aGVyIHBhc3MuICBUaGlzIGlzbid0IGEgYnVnLCBidXQgaXQKLQkgICAgIGRvZXMgbWFrZSB0aGUgY29kZSBsZXNzIGVmZmljaWVudCB0aGFuIGl0IGNvdWxkIGJlLiAgKi8KLQkgIGlmICh1bmRlZnNfdGFpbCAhPSBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCkKLQkgICAgbG9vcCA9IHRydWU7Ci0KLQkgIC8qIExvb2sgYmFja3dhcmQgdG8gbWFyayBhbGwgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0IGZpbGUKLQkgICAgIHdoaWNoIHdlIGhhdmUgYWxyZWFkeSBzZWVuIGluIHRoaXMgcGFzcy4gICovCi0JICBtYXJrID0gaTsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBpbmNsdWRlZFttYXJrXSA9IHRydWU7Ci0JICAgICAgaWYgKG1hcmsgPT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgLS1tYXJrOwotCSAgICB9Ci0JICB3aGlsZSAoc3ltZGVmc1ttYXJrXS5maWxlX29mZnNldCA9PSBzeW1kZWYtPmZpbGVfb2Zmc2V0KTsKLQotCSAgLyogV2UgbWFyayBzdWJzZXF1ZW50IHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCBmaWxlIGFzIHdlIGdvCi0JICAgICBvbiB0aHJvdWdoIHRoZSBsb29wLiAgKi8KLQkgIGxhc3QgPSBzeW1kZWYtPmZpbGVfb2Zmc2V0OwotCX0KLSAgICB9Ci0gIHdoaWxlIChsb29wKTsKLQotICBmcmVlIChkZWZpbmVkKTsKLSAgZnJlZSAoaW5jbHVkZWQpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZGVmaW5lZCAhPSAoYm9vbGVhbiAqKSBOVUxMKQotICAgIGZyZWUgKGRlZmluZWQpOwotICBpZiAoaW5jbHVkZWQgIT0gKGJvb2xlYW4gKikgTlVMTCkKLSAgICBmcmVlIChpbmNsdWRlZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSB3YW50IHRvIGRlZmluZSBhIG5ldyBzeW1ib2wuICBJdAotICAgaGFuZGxlcyB0aGUgdmFyaW91cyBjYXNlcyB3aGljaCBhcmlzZSB3aGVuIHdlIGZpbmQgYSBkZWZpbml0aW9uIGluCi0gICBhIGR5bmFtaWMgb2JqZWN0LCBvciB3aGVuIHRoZXJlIGlzIGFscmVhZHkgYSBkZWZpbml0aW9uIGluIGEKLSAgIGR5bmFtaWMgb2JqZWN0LiAgVGhlIG5ldyBzeW1ib2wgaXMgZGVzY3JpYmVkIGJ5IE5BTUUsIFNZTSwgUFNFQywKLSAgIGFuZCBQVkFMVUUuICBXZSBzZXQgU1lNX0hBU0ggdG8gdGhlIGhhc2ggdGFibGUgZW50cnkuICBXZSBzZXQKLSAgIE9WRVJSSURFIGlmIHRoZSBvbGQgc3ltYm9sIGlzIG92ZXJyaWRpbmcgYSBuZXcgZGVmaW5pdGlvbi4gIFdlIHNldAotICAgVFlQRV9DSEFOR0VfT0sgaWYgaXQgaXMgT0sgZm9yIHRoZSB0eXBlIHRvIGNoYW5nZS4gIFdlIHNldAotICAgU0laRV9DSEFOR0VfT0sgaWYgaXQgaXMgT0sgZm9yIHRoZSBzaXplIHRvIGNoYW5nZS4gIEJ5IE9LIHRvCi0gICBjaGFuZ2UsIHdlIG1lYW4gdGhhdCB3ZSBzaG91bGRuJ3Qgd2FybiBpZiB0aGUgdHlwZSBvciBzaXplIGRvZXMKLSAgIGNoYW5nZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbWVyZ2Vfc3ltYm9sIChhYmZkLCBpbmZvLCBuYW1lLCBzeW0sIHBzZWMsIHB2YWx1ZSwgc3ltX2hhc2gsCi0JCSAgb3ZlcnJpZGUsIHR5cGVfY2hhbmdlX29rLCBzaXplX2NoYW5nZV9vaykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBhc2VjdGlvbiAqKnBzZWM7Ci0gICAgIGJmZF92bWEgKnB2YWx1ZTsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgICAgYm9vbGVhbiAqb3ZlcnJpZGU7Ci0gICAgIGJvb2xlYW4gKnR5cGVfY2hhbmdlX29rOwotICAgICBib29sZWFuICpzaXplX2NoYW5nZV9vazsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGludCBiaW5kOwotICBiZmQgKm9sZGJmZDsKLSAgYm9vbGVhbiBuZXdkeW4sIG9sZGR5biwgb2xkZGVmLCBuZXdkZWYsIG5ld2R5bmNvbW1vbiwgb2xkZHluY29tbW9uOwotCi0gICpvdmVycmlkZSA9IGZhbHNlOwotCi0gIHNlYyA9ICpwc2VjOwotICBiaW5kID0gRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbyk7Ci0KLSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpKQotICAgIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotICBlbHNlCi0gICAgaCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywgbmFtZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICAqc3ltX2hhc2ggPSBoOwotCi0gIC8qIFRoaXMgY29kZSBpcyBmb3IgY29waW5nIHdpdGggZHluYW1pYyBvYmplY3RzLCBhbmQgaXMgb25seSB1c2VmdWwKLSAgICAgaWYgd2UgYXJlIGRvaW5nIGFuIEVMRiBsaW5rLiAgKi8KLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGb3IgbWVyZ2luZywgd2Ugb25seSBjYXJlIGFib3V0IHJlYWwgc3ltYm9scy4gICovCi0KLSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0gICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCi0gIC8qIElmIHdlIGp1c3QgY3JlYXRlZCB0aGUgc3ltYm9sLCBtYXJrIGl0IGFzIGJlaW5nIGFuIEVMRiBzeW1ib2wuCi0gICAgIE90aGVyIHRoYW4gdGhhdCwgdGhlcmUgaXMgbm90aGluZyB0byBkby0tdGhlcmUgaXMgbm8gbWVyZ2UgaXNzdWUKLSAgICAgd2l0aCBhIG5ld2x5IGRlZmluZWQgc3ltYm9sLS1zbyB3ZSBqdXN0IHJldHVybi4gICovCi0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLSAgICB7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIE9MREJGRCBpcyBhIEJGRCBhc3NvY2lhdGVkIHdpdGggdGhlIGV4aXN0aW5nIHN5bWJvbC4gICovCi0KLSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBvbGRiZmQgPSBOVUxMOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICBvbGRiZmQgPSBoLT5yb290LnUudW5kZWYuYWJmZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICBvbGRiZmQgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgb2xkYmZkID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+b3duZXI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogSW4gY2FzZXMgaW52b2x2aW5nIHdlYWsgdmVyc2lvbmVkIHN5bWJvbHMsIHdlIG1heSB3aW5kIHVwIHRyeWluZwotICAgICB0byBtZXJnZSBhIHN5bWJvbCB3aXRoIGl0c2VsZi4gIENhdGNoIHRoYXQgaGVyZSwgdG8gYXZvaWQgdGhlCi0gICAgIGNvbmZ1c2lvbiB0aGF0IHJlc3VsdHMgaWYgd2UgdHJ5IHRvIG92ZXJyaWRlIGEgc3ltYm9sIHdpdGgKLSAgICAgaXRzZWxmLiAgVGhlIGFkZGl0aW9uYWwgdGVzdHMgY2F0Y2ggY2FzZXMgbGlrZQotICAgICBfR0xPQkFMX09GRlNFVF9UQUJMRV8sIHdoaWNoIGFyZSByZWd1bGFyIHN5bWJvbHMgZGVmaW5lZCBpbiBhCi0gICAgIGR5bmFtaWMgb2JqZWN0LCB3aGljaCB3ZSBkbyB3YW50IHRvIGhhbmRsZSBoZXJlLiAgKi8KLSAgaWYgKGFiZmQgPT0gb2xkYmZkCi0gICAgICAmJiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMAotCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBORVdEWU4gYW5kIE9MRERZTiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkIHN5bWJvbCwKLSAgICAgcmVzcGVjdGl2ZWx5LCBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QuICAqLwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIG5ld2R5biA9IHRydWU7Ci0gIGVsc2UKLSAgICBuZXdkeW4gPSBmYWxzZTsKLQotICBpZiAob2xkYmZkICE9IE5VTEwpCi0gICAgb2xkZHluID0gKG9sZGJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwOwotICBlbHNlCi0gICAgewotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0KLSAgICAgIC8qIFRoaXMgY29kZSBoYW5kbGVzIHRoZSBzcGVjaWFsIFNITl9NSVBTX3tURVhULERBVEF9IHNlY3Rpb24KLSAgICAgICAgIGluZGljZXMgdXNlZCBieSBNSVBTIEVMRi4gICovCi0gICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGhzZWMgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQljYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICBoc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGhzZWMgPT0gTlVMTCkKLQlvbGRkeW4gPSBmYWxzZTsKLSAgICAgIGVsc2UKLQlvbGRkeW4gPSAoaHNlYy0+c3ltYm9sLT5mbGFncyAmIEJTRl9EWU5BTUlDKSAhPSAwOwotICAgIH0KLQotICAvKiBORVdERUYgYW5kIE9MRERFRiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkIHN5bWJvbCwKLSAgICAgcmVzcGVjdGl2ZWx5LCBhcHBlYXIgdG8gYmUgYSBkZWZpbml0aW9uIHJhdGhlciB0aGFuIHJlZmVyZW5jZS4gICovCi0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0gICAgbmV3ZGVmID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBuZXdkZWYgPSB0cnVlOwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIG9sZGRlZiA9IGZhbHNlOwotICBlbHNlCi0gICAgb2xkZGVmID0gdHJ1ZTsKLQotICAvKiBORVdEWU5DT01NT04gYW5kIE9MRERZTkNPTU1PTiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkCi0gICAgIHN5bWJvbCwgcmVzcGVjdGl2ZWx5LCBhcHBlYXJzIHRvIGJlIGEgY29tbW9uIHN5bWJvbCBpbiBhIGR5bmFtaWMKLSAgICAgb2JqZWN0LiAgSWYgYSBzeW1ib2wgYXBwZWFycyBpbiBhbiB1bmluaXRpYWxpemVkIHNlY3Rpb24sIGFuZCBpcwotICAgICBub3Qgd2VhaywgYW5kIGlzIG5vdCBhIGZ1bmN0aW9uLCB0aGVuIGl0IG1heSBiZSBhIGNvbW1vbiBzeW1ib2wKLSAgICAgd2hpY2ggd2FzIHJlc29sdmVkIHdoZW4gdGhlIGR5bmFtaWMgb2JqZWN0IHdhcyBjcmVhdGVkLiAgV2Ugd2FudAotICAgICB0byB0cmVhdCBzdWNoIHN5bWJvbHMgc3BlY2lhbGx5LCBiZWNhdXNlIHRoZXkgcmFpc2Ugc3BlY2lhbAotICAgICBjb25zaWRlcmF0aW9ucyB3aGVuIHNldHRpbmcgdGhlIHN5bWJvbCBzaXplOiBpZiB0aGUgc3ltYm9sCi0gICAgIGFwcGVhcnMgYXMgYSBjb21tb24gc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QsIGFuZCB0aGUgc2l6ZSBpbgotICAgICB0aGUgcmVndWxhciBvYmplY3QgaXMgbGFyZ2VyLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHdlIHVzZSB0aGUKLSAgICAgbGFyZ2VyIHNpemUuICBUaGlzIHByb2JsZW1hdGljIGNhc2UgY2FuIGFsd2F5cyBiZSBhdm9pZGVkIGluIEMsCi0gICAgIGJ1dCBpdCBtdXN0IGJlIGhhbmRsZWQgY29ycmVjdGx5IHdoZW4gdXNpbmcgRm9ydHJhbiBzaGFyZWQKLSAgICAgbGlicmFyaWVzLgotCi0gICAgIE5vdGUgdGhhdCBpZiBORVdEWU5DT01NT04gaXMgc2V0LCBORVdERUYgd2lsbCBiZSBzZXQsIGFuZAotICAgICBsaWtld2lzZSBmb3IgT0xERFlOQ09NTU9OIGFuZCBPTERERUYuCi0KLSAgICAgTm90ZSB0aGF0IHRoaXMgdGVzdCBpcyBqdXN0IGEgaGV1cmlzdGljLCBhbmQgdGhhdCBpdCBpcyBxdWl0ZQotICAgICBwb3NzaWJsZSB0byBoYXZlIGFuIHVuaW5pdGlhbGl6ZWQgc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdCB3aGljaAotICAgICBpcyByZWFsbHkgYSBkZWZpbml0aW9uLCByYXRoZXIgdGhhbiBhIGNvbW1vbiBzeW1ib2wuICBUaGlzIGNvdWxkCi0gICAgIGxlYWQgdG8gc29tZSBtaW5vciBjb25mdXNpb24gd2hlbiB0aGUgc3ltYm9sIHJlYWxseSBpcyBhIGNvbW1vbgotICAgICBzeW1ib2wgaW4gc29tZSByZWd1bGFyIG9iamVjdC4gIEhvd2V2ZXIsIEkgdGhpbmsgaXQgd2lsbCBiZQotICAgICBoYXJtbGVzcy4gICovCi0KLSAgaWYgKG5ld2R5bgotICAgICAgJiYgbmV3ZGVmCi0gICAgICAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotICAgICAgJiYgc3ltLT5zdF9zaXplID4gMAotICAgICAgJiYgYmluZCAhPSBTVEJfV0VBSwotICAgICAgJiYgRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX0ZVTkMpCi0gICAgbmV3ZHluY29tbW9uID0gdHJ1ZTsKLSAgZWxzZQotICAgIG5ld2R5bmNvbW1vbiA9IGZhbHNlOwotCi0gIGlmIChvbGRkeW4KLSAgICAgICYmIG9sZGRlZgotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotICAgICAgJiYgaC0+c2l6ZSA+IDAKLSAgICAgICYmIGgtPnR5cGUgIT0gU1RUX0ZVTkMpCi0gICAgb2xkZHluY29tbW9uID0gdHJ1ZTsKLSAgZWxzZQotICAgIG9sZGR5bmNvbW1vbiA9IGZhbHNlOwotCi0gIC8qIEl0J3MgT0sgdG8gY2hhbmdlIHRoZSB0eXBlIGlmIGVpdGhlciB0aGUgZXhpc3Rpbmcgc3ltYm9sIG9yIHRoZQotICAgICBuZXcgc3ltYm9sIGlzIHdlYWsuICAqLwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLSAgICAgIHx8IGJpbmQgPT0gU1RCX1dFQUspCi0gICAgKnR5cGVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAvKiBJdCdzIE9LIHRvIGNoYW5nZSB0aGUgc2l6ZSBpZiBlaXRoZXIgdGhlIGV4aXN0aW5nIHN5bWJvbCBvciB0aGUKLSAgICAgbmV3IHN5bWJvbCBpcyB3ZWFrLCBvciBpZiB0aGUgb2xkIHN5bWJvbCBpcyB1bmRlZmluZWQuICAqLwotCi0gIGlmICgqdHlwZV9jaGFuZ2Vfb2sKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLSAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOwotCi0gIC8qIElmIGJvdGggdGhlIG9sZCBhbmQgdGhlIG5ldyBzeW1ib2xzIGxvb2sgbGlrZSBjb21tb24gc3ltYm9scyBpbiBhCi0gICAgIGR5bmFtaWMgb2JqZWN0LCBzZXQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0byB0aGUgbGFyZ2VyIG9mIHRoZQotICAgICB0d28uICAqLwotCi0gIGlmIChvbGRkeW5jb21tb24KLSAgICAgICYmIG5ld2R5bmNvbW1vbgotICAgICAgJiYgc3ltLT5zdF9zaXplICE9IGgtPnNpemUpCi0gICAgewotICAgICAgLyogU2luY2Ugd2UgdGhpbmsgd2UgaGF2ZSB0d28gY29tbW9uIHN5bWJvbHMsIGlzc3VlIGEgbXVsdGlwbGUKLSAgICAgICAgIGNvbW1vbiB3YXJuaW5nIGlmIGRlc2lyZWQuICBOb3RlIHRoYXQgd2Ugb25seSB3YXJuIGlmIHRoZQotICAgICAgICAgc2l6ZSBpcyBkaWZmZXJlbnQuICBJZiB0aGUgc2l6ZSBpcyB0aGUgc2FtZSwgd2Ugc2ltcGx5IGxldAotICAgICAgICAgdGhlIG9sZCBzeW1ib2wgb3ZlcnJpZGUgdGhlIG5ldyBvbmUgYXMgbm9ybWFsbHkgaGFwcGVucyB3aXRoCi0gICAgICAgICBzeW1ib2xzIGRlZmluZWQgaW4gZHluYW1pYyBvYmplY3RzLiAgKi8KLQotICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgb2xkYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwKLQkgICAgICBoLT5zaXplLCBhYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgc3ltLT5zdF9zaXplKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc3ltLT5zdF9zaXplID4gaC0+c2l6ZSkKLQloLT5zaXplID0gc3ltLT5zdF9zaXplOwotCi0gICAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbG9va2luZyBhdCBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2UgaGF2ZSBmb3VuZCBhCi0gICAgIGRlZmluaXRpb24sIHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBzeW1ib2wgd2FzIGFscmVhZHkgZGVmaW5lZCBieQotICAgICBzb21lIG90aGVyIG9iamVjdC4gIElmIHNvLCB3ZSB3YW50IHRvIHVzZSB0aGUgZXhpc3RpbmcKLSAgICAgZGVmaW5pdGlvbiwgYW5kIHdlIGRvIG5vdCB3YW50IHRvIHJlcG9ydCBhIG11bHRpcGxlIHN5bWJvbAotICAgICBkZWZpbml0aW9uIGVycm9yOyB3ZSBkbyB0aGlzIGJ5IGNsb2JiZXJpbmcgKlBTRUMgdG8gYmUKLSAgICAgYmZkX3VuZF9zZWN0aW9uX3B0ci4KLQotICAgICBXZSB0cmVhdCBhIGNvbW1vbiBzeW1ib2wgYXMgYSBkZWZpbml0aW9uIGlmIHRoZSBzeW1ib2wgaW4gdGhlCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGlzIGEgZnVuY3Rpb24sIHNpbmNlIGNvbW1vbiBzeW1ib2xzIGFsd2F5cwotICAgICByZXByZXNlbnQgdmFyaWFibGVzOyB0aGlzIGNhbiBjYXVzZSBjb25mdXNpb24gaW4gcHJpbmNpcGxlLCBidXQKLSAgICAgYW55IHN1Y2ggY29uZnVzaW9uIHdvdWxkIHNlZW0gdG8gaW5kaWNhdGUgYW4gZXJyb25lb3VzIHByb2dyYW0gb3IKLSAgICAgc2hhcmVkIGxpYnJhcnkuICBXZSBhbHNvIHBlcm1pdCBhIGNvbW1vbiBzeW1ib2wgaW4gYSByZWd1bGFyCi0gICAgIG9iamVjdCB0byBvdmVycmlkZSBhIHdlYWsgc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdC4KLQotICAgICBXZSBwcmVmZXIgYSBub24td2VhayBkZWZpbml0aW9uIGluIGEgc2hhcmVkIGxpYnJhcnkgdG8gYSB3ZWFrCi0gICAgIGRlZmluaXRpb24gaW4gdGhlIGV4ZWN1dGFibGUuICAqLwotCi0gIGlmIChuZXdkeW4KLSAgICAgICYmIG5ld2RlZgotICAgICAgJiYgKG9sZGRlZgotCSAgfHwgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgICAgICYmIChiaW5kID09IFNUQl9XRUFLCi0JCSAgfHwgRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX0ZVTkMpKSkKLSAgICAgICYmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JICB8fCBiaW5kID09IFNUQl9XRUFLKSkKLSAgICB7Ci0gICAgICAqb3ZlcnJpZGUgPSB0cnVlOwotICAgICAgbmV3ZGVmID0gZmFsc2U7Ci0gICAgICBuZXdkeW5jb21tb24gPSBmYWxzZTsKLQotICAgICAgKnBzZWMgPSBzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAgICAgLyogSWYgd2UgZ2V0IGhlcmUgd2hlbiB0aGUgb2xkIHN5bWJvbCBpcyBhIGNvbW1vbiBzeW1ib2wsIHRoZW4KLSAgICAgICAgIHdlIGFyZSBleHBsaWNpdGx5IGxldHRpbmcgaXQgb3ZlcnJpZGUgYSB3ZWFrIHN5bWJvbCBvcgotICAgICAgICAgZnVuY3Rpb24gaW4gYSBkeW5hbWljIG9iamVjdCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gd2FybiBhYm91dAotICAgICAgICAgYSB0eXBlIGNoYW5nZS4gIElmIHRoZSBvbGQgc3ltYm9sIGlzIGEgZGVmaW5lZCBzeW1ib2wsIGEgdHlwZQotICAgICAgICAgY2hhbmdlIHdhcm5pbmcgbWF5IHN0aWxsIGJlIGFwcHJvcHJpYXRlLiAgKi8KLQotICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkqdHlwZV9jaGFuZ2Vfb2sgPSB0cnVlOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBhbiBvbGQgY29tbW9uIHN5bWJvbCBtZXJnaW5nIHdpdGggYQotICAgICBuZXcgc3ltYm9sIHdoaWNoIGxvb2tzIGxpa2UgYSBjb21tb24gc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdC4KLSAgICAgV2UgY2hhbmdlICpQU0VDIGFuZCAqUFZBTFVFIHRvIG1ha2UgdGhlIG5ldyBzeW1ib2wgbG9vayBsaWtlIGEKLSAgICAgY29tbW9uIHN5bWJvbCwgYW5kIGxldCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aWxsIGRvCi0gICAgIHRoZSByaWdodCB0aGluZy4gICovCi0KLSAgaWYgKG5ld2R5bmNvbW1vbgotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIHsKLSAgICAgICpvdmVycmlkZSA9IHRydWU7Ci0gICAgICBuZXdkZWYgPSBmYWxzZTsKLSAgICAgIG5ld2R5bmNvbW1vbiA9IGZhbHNlOwotICAgICAgKnB2YWx1ZSA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgICpwc2VjID0gc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLSAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBvbGQgc3ltYm9sIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdCwgYW5kIHRoZSBuZXcgc3ltYm9sIGlzCi0gICAgIGEgZGVmaW5pdGlvbiB3aGljaCBpcyBub3QgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCB0aGVuIHRoZSBuZXcKLSAgICAgc3ltYm9sIG92ZXJyaWRlcyB0aGUgb2xkIHN5bWJvbC4gIFN5bWJvbHMgZnJvbSByZWd1bGFyIGZpbGVzCi0gICAgIGFsd2F5cyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBzeW1ib2xzIGZyb20gZHluYW1pYyBvYmplY3RzLCBldmVuIGlmCi0gICAgIHRoZXkgYXJlIGRlZmluZWQgYWZ0ZXIgdGhlIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBsaW5rLgotCi0gICAgIEFzIGFib3ZlLCB3ZSBhZ2FpbiBwZXJtaXQgYSBjb21tb24gc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QgdG8KLSAgICAgb3ZlcnJpZGUgYSBkZWZpbml0aW9uIGluIGEgc2hhcmVkIG9iamVjdCBpZiB0aGUgc2hhcmVkIG9iamVjdAotICAgICBzeW1ib2wgaXMgYSBmdW5jdGlvbiBvciBpcyB3ZWFrLgotCi0gICAgIEFzIGFib3ZlLCB3ZSBwZXJtaXQgYSBub24td2VhayBkZWZpbml0aW9uIGluIGEgc2hhcmVkIG9iamVjdCB0bwotICAgICBvdmVycmlkZSBhIHdlYWsgZGVmaW5pdGlvbiBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLQotICBpZiAoISBuZXdkeW4KLSAgICAgICYmIChuZXdkZWYKLQkgIHx8IChiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykKLQkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgIHx8IGgtPnR5cGUgPT0gU1RUX0ZVTkMpKSkKLSAgICAgICYmIG9sZGR5bgotICAgICAgJiYgb2xkZGVmCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChiaW5kICE9IFNUQl9XRUFLCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICB7Ci0gICAgICAvKiBDaGFuZ2UgdGhlIGhhc2ggdGFibGUgZW50cnkgdG8gdW5kZWZpbmVkLCBhbmQgbGV0Ci0JIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIGRvIHRoZSByaWdodCB0aGluZyB3aXRoIHRoZQotCSBuZXcgZGVmaW5pdGlvbi4gICovCi0KLSAgICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotICAgICAgaC0+cm9vdC51LnVuZGVmLmFiZmQgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAgICAgb2xkZGVmID0gZmFsc2U7Ci0gICAgICBvbGRkeW5jb21tb24gPSBmYWxzZTsKLQotICAgICAgLyogV2UgYWdhaW4gcGVybWl0IGEgdHlwZSBjaGFuZ2Ugd2hlbiBhIGNvbW1vbiBzeW1ib2wgbWF5IGJlCi0gICAgICAgICBvdmVycmlkaW5nIGEgZnVuY3Rpb24uICAqLwotCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotCSp0eXBlX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgICAgIC8qIFRoaXMgdW5pb24gbWF5IGhhdmUgYmVlbiBzZXQgdG8gYmUgbm9uLU5VTEwgd2hlbiB0aGlzIHN5bWJvbAotCSB3YXMgc2VlbiBpbiBhIGR5bmFtaWMgb2JqZWN0LiAgV2UgbXVzdCBmb3JjZSB0aGUgdW5pb24gdG8gYmUKLQkgTlVMTCwgc28gdGhhdCBpdCBpcyBjb3JyZWN0IGZvciBhIHJlZ3VsYXIgc3ltYm9sLiAgKi8KLQotICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gTlVMTDsKLQotICAgICAgLyogSW4gdGhpcyBzcGVjaWFsIGNhc2UsIGlmIEggaXMgdGhlIHRhcmdldCBvZiBhbiBpbmRpcmVjdGlvbiwKLSAgICAgICAgIHdlIHdhbnQgdGhlIGNhbGxlciB0byBmcm9iIHdpdGggSCByYXRoZXIgdGhhbiB3aXRoIHRoZQotICAgICAgICAgaW5kaXJlY3Qgc3ltYm9sLiAgVGhhdCB3aWxsIHBlcm1pdCB0aGUgY2FsbGVyIHRvIHJlZGVmaW5lIHRoZQotICAgICAgICAgdGFyZ2V0IG9mIHRoZSBpbmRpcmVjdGlvbiwgcmF0aGVyIHRoYW4gdGhlIGluZGlyZWN0IHN5bWJvbAotICAgICAgICAgaXRzZWxmLiAgRklYTUU6IFRoaXMgd2lsbCBicmVhayB0aGUgLXkgb3B0aW9uIGlmIHdlIHN0b3JlIGEKLSAgICAgICAgIHN5bWJvbCB3aXRoIGEgZGlmZmVyZW50IG5hbWUuICAqLwotICAgICAgKnN5bV9oYXNoID0gaDsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSBuZXcgY29tbW9uIHN5bWJvbCBtZXJnaW5nIHdpdGggYW4KLSAgICAgb2xkIHN5bWJvbCB0aGF0IGxvb2tzIGxpa2UgaXQgbWlnaHQgYmUgYSBjb21tb24gc3ltYm9sIGRlZmluZWQgaW4KLSAgICAgYSBzaGFyZWQgb2JqZWN0LiAgTm90ZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBjYXNlIGluCi0gICAgIHdoaWNoIGEgbmV3IGNvbW1vbiBzeW1ib2wgc2hvdWxkIHNpbXBseSBvdmVycmlkZSB0aGUgZGVmaW5pdGlvbgotICAgICBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi0gIGlmICghIG5ld2R5bgotICAgICAgJiYgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpCi0gICAgICAmJiBvbGRkeW5jb21tb24pCi0gICAgewotICAgICAgLyogSXQgd291bGQgYmUgYmVzdCBpZiB3ZSBjb3VsZCBzZXQgdGhlIGhhc2ggdGFibGUgZW50cnkgdG8gYQotCSBjb21tb24gc3ltYm9sLCBidXQgd2UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSBmb3IgdGhlIHNlY3Rpb24KLQkgb3IgdGhlIGFsaWdubWVudC4gICovCi0gICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKLQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBvbGRiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLAotCSAgICAgIGgtPnNpemUsIGFiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBzeW0tPnN0X3NpemUpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHRoZSBwcmVkdW1lZCBjb21tb24gc3ltYm9sIGluIHRoZSBkeW5hbWljIG9iamVjdCBpcwotICAgICAgICAgbGFyZ2VyLCBwcmV0ZW5kIHRoYXQgdGhlIG5ldyBzeW1ib2wgaGFzIGl0cyBzaXplLiAgKi8KLQotICAgICAgaWYgKGgtPnNpemUgPiAqcHZhbHVlKQotCSpwdmFsdWUgPSBoLT5zaXplOwotCi0gICAgICAvKiBGSVhNRTogV2Ugbm8gbG9uZ2VyIGtub3cgdGhlIGFsaWdubWVudCByZXF1aXJlZCBieSB0aGUgc3ltYm9sCi0JIGluIHRoZSBkeW5hbWljIG9iamVjdCwgc28gd2UganVzdCB3aW5kIHVwIHVzaW5nIHRoZSBvbmUgZnJvbQotCSB0aGUgcmVndWxhciBvYmplY3QuICAqLwotCi0gICAgICBvbGRkZWYgPSBmYWxzZTsKLSAgICAgIG9sZGR5bmNvbW1vbiA9IGZhbHNlOwotCi0gICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLSAgICAgIGgtPnJvb3QudS51bmRlZi5hYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLSAgICAgICp0eXBlX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgd2VhayBkZWZpbml0aW9uIGluIGEgcmVndWxhciBvYmplY3QKLSAgICAgZm9sbG93ZWQgYnkgYSBub24td2VhayBkZWZpbml0aW9uIGluIGEgc2hhcmVkIG9iamVjdC4gIEluIHRoaXMKLSAgICAgY2FzZSwgd2UgcHJlZmVyIHRoZSBkZWZpbml0aW9uIGluIHRoZSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgaWYgKG9sZGRlZgotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotICAgICAgJiYgbmV3ZGVmCi0gICAgICAmJiBuZXdkeW4KLSAgICAgICYmIGJpbmQgIT0gU1RCX1dFQUspCi0gICAgewotICAgICAgLyogVG8gbWFrZSB0aGlzIHdvcmsgd2UgaGF2ZSB0byBmcm9iIHRoZSBmbGFncyBzbyB0aGF0IHRoZSByZXN0Ci0gICAgICAgICBvZiB0aGUgY29kZSBkb2VzIG5vdCB0aGluayB3ZSBhcmUgdXNpbmcgdGhlIHJlZ3VsYXIKLSAgICAgICAgIGRlZmluaXRpb24uICAqLwotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkKLQloLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVI7Ci0gICAgICBlbHNlIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDApCi0JaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+IChFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSCi0JCQkJICAgfCBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKTsKLQotICAgICAgLyogSWYgSCBpcyB0aGUgdGFyZ2V0IG9mIGFuIGluZGlyZWN0aW9uLCB3ZSB3YW50IHRoZSBjYWxsZXIgdG8KLSAgICAgICAgIHVzZSBIIHJhdGhlciB0aGFuIHRoZSBpbmRpcmVjdCBzeW1ib2wuICBPdGhlcndpc2UgaWYgd2UgYXJlCi0gICAgICAgICBkZWZpbmluZyBhIG5ldyBpbmRpcmVjdCBzeW1ib2wgd2Ugd2lsbCB3aW5kIHVwIGF0dGFjaGluZyBpdAotICAgICAgICAgdG8gdGhlIGVudHJ5IHdlIGFyZSBvdmVycmlkaW5nLiAgKi8KLSAgICAgICpzeW1faGFzaCA9IGg7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgbm9uLXdlYWsgZGVmaW5pdGlvbiBpbiBhIHNoYXJlZAotICAgICBvYmplY3QgZm9sbG93ZWQgYnkgYSB3ZWFrIGRlZmluaXRpb24gaW4gYSByZWd1bGFyIG9iamVjdC4gIEluCi0gICAgIHRoaXMgY2FzZSB3ZSBwcmVmZXIgdG8gZGVmaW5pdGlvbiBpbiB0aGUgc2hhcmVkIG9iamVjdC4gIFRvIG1ha2UKLSAgICAgdGhpcyB3b3JrIHdlIGhhdmUgdG8gdGVsbCB0aGUgY2FsbGVyIHRvIG5vdCB0cmVhdCB0aGUgbmV3IHN5bWJvbAotICAgICBhcyBhIGRlZmluaXRpb24uICAqLwotICBpZiAob2xkZGVmCi0gICAgICAmJiBvbGRkeW4KLSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKLSAgICAgICYmIG5ld2RlZgotICAgICAgJiYgISBuZXdkeW4KLSAgICAgICYmIGJpbmQgPT0gU1RCX1dFQUspCi0gICAgKm92ZXJyaWRlID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBFTEYgb2JqZWN0IGZpbGUgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYm9vbGVhbiAoKmFkZF9zeW1ib2xfaG9vaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosCi0JCQkJICAgICAgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotICBib29sZWFuICgqY2hlY2tfcmVsb2NzKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICBhc2VjdGlvbiAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0gIGJvb2xlYW4gY29sbGVjdDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgc2l6ZV90IHN5bWNvdW50OwotICBzaXplX3QgZXh0c3ltY291bnQ7Ci0gIHNpemVfdCBleHRzeW1vZmY7Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmJ1ZiA9IE5VTEw7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIGJvb2xlYW4gZHluYW1pYzsKLSAgYmZkX2J5dGUgKmR5bnZlciA9IE5VTEw7Ci0gIEVsZl9FeHRlcm5hbF9WZXJzeW0gKmV4dHZlcnN5bSA9IE5VTEw7Ci0gIEVsZl9FeHRlcm5hbF9WZXJzeW0gKmV2ZXI7Ci0gIEVsZl9FeHRlcm5hbF9EeW4gKmR5bmJ1ZiA9IE5VTEw7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICp3ZWFrczsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZXN5bTsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZXN5bWVuZDsKLQotICBhZGRfc3ltYm9sX2hvb2sgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9hZGRfc3ltYm9sX2hvb2s7Ci0gIGNvbGxlY3QgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3Q7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0gICAgZHluYW1pYyA9IGZhbHNlOwotICBlbHNlCi0gICAgewotICAgICAgZHluYW1pYyA9IHRydWU7Ci0KLSAgICAgIC8qIFlvdSBjYW4ndCB1c2UgLXIgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LiAgQWxzbywgdGhlcmUncyBubwotCSBob3BlIG9mIHVzaW5nIGEgZHluYW1pYyBvYmplY3Qgd2hpY2ggZG9lcyBub3QgZXhhY3RseSBtYXRjaAotCSB0aGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlIHx8IGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYykKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBBcyBhIEdOVSBleHRlbnNpb24sIGFueSBpbnB1dCBzZWN0aW9ucyB3aGljaCBhcmUgbmFtZWQKLSAgICAgLmdudS53YXJuaW5nLlNZTUJPTCBhcmUgdHJlYXRlZCBhcyB3YXJuaW5nIHN5bWJvbHMgZm9yIHRoZSBnaXZlbgotICAgICBzeW1ib2wuICBUaGlzIGRpZmZlcnMgZnJvbSAuZ251Lndhcm5pbmcgc2VjdGlvbnMsIHdoaWNoIGdlbmVyYXRlCi0gICAgIHdhcm5pbmdzIHdoZW4gdGhleSBhcmUgaW5jbHVkZWQgaW4gYW4gb3V0cHV0IGZpbGUuICAqLwotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgcyk7Ci0JICBpZiAoc3RybmNtcCAobmFtZSwgIi5nbnUud2FybmluZy4iLCBzaXplb2YgIi5nbnUud2FybmluZy4iIC0gMSkgPT0gMCkKLQkgICAgewotCSAgICAgIGNoYXIgKm1zZzsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHN6OwotCi0JICAgICAgbmFtZSArPSBzaXplb2YgIi5nbnUud2FybmluZy4iIC0gMTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBzaGFyZWQgb2JqZWN0LCB0aGVuIGxvb2sgdXAgdGhlIHN5bWJvbAotCQkgaW4gdGhlIGhhc2ggdGFibGUuICBJZiBpdCBpcyB0aGVyZSwgYW5kIGl0IGlzIGFscmVhZHkKLQkJIGJlZW4gZGVmaW5lZCwgdGhlbiB3ZSB3aWxsIG5vdCBiZSB1c2luZyB0aGUgZW50cnkKLQkJIGZyb20gdGhpcyBzaGFyZWQgb2JqZWN0LCBzbyB3ZSBkb24ndCBuZWVkIHRvIHdhcm4uCi0JCSBGSVhNRTogSWYgd2Ugc2VlIHRoZSBkZWZpbml0aW9uIGluIGEgcmVndWxhciBvYmplY3QKLQkJIGxhdGVyIG9uLCB3ZSB3aWxsIHdhcm4sIGJ1dCB3ZSBzaG91bGRuJ3QuICBUaGUgb25seQotCQkgZml4IGlzIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCB3YXJuaW5ncyB3ZSBhcmUgc3VwcG9zZWQKLQkJIHRvIGVtaXQsIGFuZCB0aGVuIGhhbmRsZSB0aGVtIGFsbCBhdCB0aGUgZW5kIG9mIHRoZQotCQkgbGluay4gICovCi0JICAgICAgaWYgKGR5bmFtaWMgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotCQl7Ci0JCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkJICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwKLQkJCQkJICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLQkJICAvKiBGSVhNRTogV2hhdCBhYm91dCBiZmRfbGlua19oYXNoX2NvbW1vbj8gICovCi0JCSAgaWYgKGggIT0gTlVMTAotCQkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJICAgIHsKLQkJICAgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpc3N1ZSB0aGlzIHdhcm5pbmcuICBDbG9iYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNlY3Rpb24gc2l6ZSBzbyB0aGF0IHRoZSB3YXJuaW5nIGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JCSAgICAgIHMtPl9yYXdfc2l6ZSA9IDA7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHMpOwotCSAgICAgIG1zZyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc3ogKyAxKTsKLQkgICAgICBpZiAobXNnID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCBtc2csIChmaWxlX3B0cikgMCwgc3opKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIG1zZ1tzel0gPSAnXDAnOwotCi0JICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCSAgICAgKGluZm8sIGFiZmQsIG5hbWUsIEJTRl9XQVJOSU5HLCBzLCAoYmZkX3ZtYSkgMCwgbXNnLAotCQkgICAgICBmYWxzZSwgY29sbGVjdCwgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBOVUxMKSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCQl7Ci0JCSAgLyogQ2xvYmJlciB0aGUgc2VjdGlvbiBzaXplIHNvIHRoYXQgdGhlIHdhcm5pbmcgZG9lcwotICAgICAgICAgICAgICAgICAgICAgbm90IGdldCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCQkgIHMtPl9yYXdfc2l6ZSA9IDA7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgb2JqZWN0LCB3ZSBhbHdheXMgbGluayBhZ2FpbnN0IHRoZSAuZHluc3ltCi0gICAgIHN5bWJvbCB0YWJsZSwgbm90IHRoZSAuc3ltdGFiIHN5bWJvbCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlcgotICAgICB3aWxsIG9ubHkgc2VlIHRoZSAuZHluc3ltIHN5bWJvbCB0YWJsZSwgc28gdGhlcmUgaXMgbm8gcmVhc29uIHRvCi0gICAgIGxvb2sgYXQgLnN5bXRhYiBmb3IgYSBkeW5hbWljIG9iamVjdC4gICovCi0KLSAgaWYgKCEgZHluYW1pYyB8fCBlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBlbHNlCi0gICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7Ci0KLSAgaWYgKGR5bmFtaWMpCi0gICAgewotICAgICAgLyogUmVhZCBpbiBhbnkgdmVyc2lvbiBkZWZpbml0aW9ucy4gICovCi0KLSAgICAgIGlmICghIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIChhYmZkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogUmVhZCBpbiB0aGUgc3ltYm9sIHZlcnNpb25zLCBidXQgZG9uJ3QgYm90aGVyIHRvIGNvbnZlcnQgdGhlbQotICAgICAgICAgdG8gaW50ZXJuYWwgZm9ybWF0LiAgKi8KLSAgICAgIGlmIChlbGZfZHludmVyc3ltIChhYmZkKSAhPSAwKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TaGRyICp2ZXJzeW1oZHI7Ci0KLQkgIHZlcnN5bWhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJzeW1faGRyOwotCSAgZXh0dmVyc3ltID0gKEVsZl9FeHRlcm5hbF9WZXJzeW0gKikgYmZkX21hbGxvYyAoaGRyLT5zaF9zaXplKTsKLQkgIGlmIChleHR2ZXJzeW0gPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIHZlcnN5bWhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IChiZmRfcmVhZCAoKFBUUikgZXh0dmVyc3ltLCAxLCB2ZXJzeW1oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgIT0gdmVyc3ltaGRyLT5zaF9zaXplKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICBzeW1jb3VudCA9IGhkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0KLSAgLyogVGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIHN5bXRhYiBoZWFkZXIgdGVsbHMgdXMgd2hlcmUgdGhlCi0gICAgIGV4dGVybmFsIHN5bWJvbHMgc3RhcnQuICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBsb2NhbCBzeW1ib2xzIGF0Ci0gICAgIHRoaXMgcG9pbnQuICAqLwotICBpZiAoZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHsKLSAgICAgIGV4dHN5bWNvdW50ID0gc3ltY291bnQ7Ci0gICAgICBleHRzeW1vZmYgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dHN5bWNvdW50ID0gc3ltY291bnQgLSBoZHItPnNoX2luZm87Ci0gICAgICBleHRzeW1vZmYgPSBoZHItPnNoX2luZm87Ci0gICAgfQotCi0gIGJ1ZiA9ICgoRWxmX0V4dGVybmFsX1N5bSAqKQotCSBiZmRfbWFsbG9jIChleHRzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMICYmIGV4dHN5bWNvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2Ugc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBoYXNoIHRhYmxlIGVudHJ5IGZvciBlYWNoIGV4dGVybmFsCi0gICAgIHN5bWJvbC4gICovCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgZXh0c3ltY291bnQgKiBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKSk7Ci0gIGlmIChzeW1faGFzaCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBlbGZfc3ltX2hhc2hlcyAoYWJmZCkgPSBzeW1faGFzaDsKLQotICBpZiAoISBkeW5hbWljKQotICAgIHsKLSAgICAgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBjcmVhdGUgYWxsIHRoZSBkeW5hbWljCi0gICAgICAgICBzZWN0aW9ucyBpbW1lZGlhdGVseS4gIFdlIG5lZWQgdG8gYXR0YWNoIHRoZW0gdG8gc29tZXRoaW5nLAotICAgICAgICAgc28gd2UgYXR0YWNoIHRoZW0gdG8gdGhpcyBCRkQsIHByb3ZpZGVkIGl0IGlzIHRoZSByaWdodAotICAgICAgICAgZm9ybWF0LiAgRklYTUU6IElmIHRoZXJlIGFyZSBubyBpbnB1dCBCRkQncyBvZiB0aGUgc2FtZQotICAgICAgICAgZm9ybWF0IGFzIHRoZSBvdXRwdXQsIHdlIGNhbid0IG1ha2UgYSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAhIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0JewotCSAgaWYgKCEgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBib29sZWFuIGFkZF9uZWVkZWQ7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYmZkX3NpemVfdHlwZSBvbGRzaXplOwotICAgICAgYmZkX3NpemVfdHlwZSBzdHJpbmRleDsKLQotICAgICAgLyogRmluZCB0aGUgbmFtZSB0byB1c2UgaW4gYSBEVF9ORUVERUQgZW50cnkgdGhhdCByZWZlcnMgdG8gdGhpcwotCSBvYmplY3QuICBJZiB0aGUgb2JqZWN0IGhhcyBhIERUX1NPTkFNRSBlbnRyeSwgd2UgdXNlIGl0LgotCSBPdGhlcndpc2UsIGlmIHRoZSBnZW5lcmljIGxpbmtlciBzdHVjayBzb21ldGhpbmcgaW4KLQkgZWxmX2R0X25hbWUsIHdlIHVzZSB0aGF0LiAgT3RoZXJ3aXNlLCB3ZSBqdXN0IHVzZSB0aGUgZmlsZQotCSBuYW1lLiAgSWYgdGhlIGdlbmVyaWMgbGlua2VyIHB1dCBhIG51bGwgc3RyaW5nIGludG8KLQkgZWxmX2R0X25hbWUsIHdlIGRvbid0IG1ha2UgYSBEVF9ORUVERUQgZW50cnkgYXQgYWxsLCBldmVuIGlmCi0JIHRoZXJlIGlzIGEgRFRfU09OQU1FIGVudHJ5LiAgKi8KLSAgICAgIGFkZF9uZWVkZWQgPSB0cnVlOwotICAgICAgbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgICAgaWYgKGVsZl9kdF9uYW1lIChhYmZkKSAhPSBOVUxMKQotCXsKLQkgIG5hbWUgPSBlbGZfZHRfbmFtZSAoYWJmZCk7Ci0JICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkgICAgYWRkX25lZWRlZCA9IGZhbHNlOwotCX0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9EeW4gKmV4dGR5bjsKLQkgIEVsZl9FeHRlcm5hbF9EeW4gKmV4dGR5bmVuZDsKLQkgIGludCBlbGZzZWM7Ci0JICB1bnNpZ25lZCBsb25nIGxpbms7Ci0KLQkgIGR5bmJ1ZiA9IChFbGZfRXh0ZXJuYWxfRHluICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAoZHluYnVmID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIChQVFIpIGR5bmJ1ZiwKLQkJCQkJICAoZmlsZV9wdHIpIDAsIHMtPl9yYXdfc2l6ZSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBlbGZzZWMgPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHMpOwotCSAgaWYgKGVsZnNlYyA9PSAtMSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBsaW5rID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtlbGZzZWNdLT5zaF9saW5rOwotCi0JICB7Ci0JICAgIC8qIFRoZSBzaGFyZWQgbGlicmFyaWVzIGRpc3RyaWJ1dGVkIHdpdGggaHB1eDExIGhhdmUgYSBib2d1cwotCSAgICAgICBzaF9saW5rIGZpZWxkIGZvciB0aGUgIi5keW5hbWljIiBzZWN0aW9uLiAgVGhpcyBjb2RlIGRldGVjdHMKLQkgICAgICAgd2hlbiBMSU5LIHJlZmVycyB0byBhIHNlY3Rpb24gdGhhdCBpcyBub3QgYSBzdHJpbmcgdGFibGUgYW5kCi0JICAgICAgIHRyaWVzIHRvIGZpbmQgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhlICIuZHluc3ltIiBzZWN0aW9uCi0JICAgICAgIGluc3RlYWQuICAqLwotCSAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtsaW5rXTsKLQkgICAgaWYgKGhkci0+c2hfdHlwZSAhPSBTSFRfU1RSVEFCKQotCSAgICAgIHsKLQkJYXNlY3Rpb24gKnMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zeW0iKTsKLQkJaW50IGVsZnNlYyA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgcyk7Ci0JCWlmIChlbGZzZWMgPT0gLTEpCi0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCWxpbmsgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2VsZnNlY10tPnNoX2xpbms7Ci0JICAgICAgfQotCSAgfQotCi0JICBleHRkeW4gPSBkeW5idWY7Ci0JICBleHRkeW5lbmQgPSBleHRkeW4gKyBzLT5fcmF3X3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9EeW4pOwotCSAgZm9yICg7IGV4dGR5biA8IGV4dGR5bmVuZDsgZXh0ZHluKyspCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQotCSAgICAgIGVsZl9zd2FwX2R5bl9pbiAoYWJmZCwgZXh0ZHluLCAmZHluKTsKLQkgICAgICBpZiAoZHluLmRfdGFnID09IERUX1NPTkFNRSkKLQkJewotCQkgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBsaW5rLAotCQkJCQkJCSAgZHluLmRfdW4uZF92YWwpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfTkVFREVEKQotCQl7Ci0JCSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuLCAqKnBuOwotCQkgIGNoYXIgKmZubSwgKmFubTsKLQotCQkgIG4gPSAoKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqKQotCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCkpKTsKLQkJICBmbm0gPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBsaW5rLAotCQkJCQkJCSBkeW4uZF91bi5kX3ZhbCk7Ci0JCSAgaWYgKG4gPT0gTlVMTCB8fCBmbm0gPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGFubSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChmbm0pICsgMSk7Ci0JCSAgaWYgKGFubSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3RyY3B5IChhbm0sIGZubSk7Ci0JCSAgbi0+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+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDOwotCQkJICBpZiAoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkJCQkgfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywKLQkJCQkJCQkJCSBoaSkpCi0JCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIC8qIE5vdyBzZXQgSEkgdG8gSCwgc28gdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHNldCB0aGUgb3RoZXIgZmllbGRzIGNvcnJlY3RseS4gICovCi0JCSAgICAgIGhpID0gaDsKLQkJICAgIH0KLQotCQkgIC8qIElmIHRoZXJlIGlzIGEgZHVwbGljYXRlIGRlZmluaXRpb24gc29tZXdoZXJlLAotCQkgICAgIHRoZW4gSEkgbWF5IG5vdCBwb2ludCB0byBhbiBpbmRpcmVjdCBzeW1ib2wuICBXZQotCQkgICAgIHdpbGwgaGF2ZSByZXBvcnRlZCBhbiBlcnJvciB0byB0aGUgdXNlciBpbiB0aGF0Ci0JCSAgICAgY2FzZS4gICovCi0KLQkJICBpZiAoaGktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotCQkgICAgewotCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaHQ7Ci0KLQkJICAgICAgLyogSWYgdGhlIHN5bWJvbCBiZWNhbWUgaW5kaXJlY3QsIHRoZW4gd2UgYXNzdW1lCi0JCQkgdGhhdCB3ZSBoYXZlIG5vdCBzZWVuIGEgZGVmaW5pdGlvbiBiZWZvcmUuICAqLwotCQkgICAgICBCRkRfQVNTRVJUICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCi0JCQkJICAgICAgfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQkJCQkgID09IDApOwotCi0JCSAgICAgIGh0ID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGhpLT5yb290LnUuaS5saW5rOwotCi0JCSAgICAgIC8qIENvcHkgZG93biBhbnkgcmVmZXJlbmNlcyB0aGF0IHdlIG1heSBoYXZlCi0JCQkgYWxyZWFkeSBzZWVuIHRvIHRoZSBzeW1ib2wgd2hpY2gganVzdCBiZWNhbWUKLQkJCSBpbmRpcmVjdC4gICovCi0JCSAgICAgIGh0LT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9Ci0JCQkoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAmIChFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDCi0JCQkgICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkgICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUsKLQkJCSAgICB8IEVMRl9MSU5LX05PTl9HT1RfUkVGKSk7Ci0KLQkJICAgICAgLyogQ29weSBvdmVyIHRoZSBnbG9iYWwgYW5kIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlCi0JCQkgb2Zmc2V0IGVudHJpZXMuICBUaGVzZSBtYXkgaGF2ZSBiZWVuIGFscmVhZHkgc2V0Ci0JCQkgdXAgYnkgYSBjaGVja19yZWxvY3Mgcm91dGluZS4gICovCi0JCSAgICAgIGlmIChodC0+Z290Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JCQl7Ci0JCQkgIGh0LT5nb3Qub2Zmc2V0ID0gaGktPmdvdC5vZmZzZXQ7Ci0JCQkgIGhpLT5nb3Qub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCQkJfQotCQkgICAgICBCRkRfQVNTRVJUIChoaS0+Z290Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpOwotCi0JCSAgICAgIGlmIChodC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JCQl7Ci0JCQkgIGh0LT5wbHQub2Zmc2V0ID0gaGktPnBsdC5vZmZzZXQ7Ci0JCQkgIGhpLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCQkJfQotCQkgICAgICBCRkRfQVNTRVJUIChoaS0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpOwotCi0JCSAgICAgIGlmIChodC0+ZHluaW5keCA9PSAtMSkKLQkJCXsKLQkJCSAgaHQtPmR5bmluZHggPSBoaS0+ZHluaW5keDsKLQkJCSAgaHQtPmR5bnN0cl9pbmRleCA9IGhpLT5keW5zdHJfaW5kZXg7Ci0JCQkgIGhpLT5keW5pbmR4ID0gLTE7Ci0JCQkgIGhpLT5keW5zdHJfaW5kZXggPSAwOwotCQkJfQotCQkgICAgICBCRkRfQVNTRVJUIChoaS0+ZHluaW5keCA9PSAtMSk7Ci0KLQkJICAgICAgLyogRklYTUU6IFRoZXJlIG1heSBiZSBvdGhlciBpbmZvcm1hdGlvbiB0byBjb3B5Ci0JCQkgb3ZlciBmb3IgcGFydGljdWxhciB0YXJnZXRzLiAgKi8KLQotCQkgICAgICAvKiBTZWUgaWYgdGhlIG5ldyBmbGFncyBsZWFkIHVzIHRvIHJlYWxpemUgdGhhdAotCQkJIHRoZSBzeW1ib2wgbXVzdCBiZSBkeW5hbWljLiAgKi8KLQkJICAgICAgaWYgKCEgZHluc3ltKQotCQkJewotCQkJICBpZiAoISBkeW5hbWljKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkJCQkgIHx8ICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAgICAgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKQotCQkJCSAgICAgICE9IDApKQotCQkJCWR5bnN5bSA9IHRydWU7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgaWYgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMCkKLQkJCQlkeW5zeW0gPSB0cnVlOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQotCQkgIC8qIFdlIGFsc28gbmVlZCB0byBkZWZpbmUgYW4gaW5kaXJlY3Rpb24gZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgIG5vbmRlZmF1bHQgdmVyc2lvbiBvZiB0aGUgc3ltYm9sLiAgKi8KLQotCQkgIHNob3J0bmFtZSA9IGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJCQkgc3RybGVuIChuYW1lKSk7Ci0JCSAgaWYgKHNob3J0bmFtZSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3RybmNweSAoc2hvcnRuYW1lLCBuYW1lLCBwIC0gbmFtZSk7Ci0JCSAgc3RyY3B5IChzaG9ydG5hbWUgKyAocCAtIG5hbWUpLCBwICsgMSk7Ci0KLQkJICAvKiBPbmNlIGFnYWluLCBtZXJnZSB3aXRoIGFueSBleGlzdGluZyBzeW1ib2wuICAqLwotCQkgIHR5cGVfY2hhbmdlX29rID0gZmFsc2U7Ci0JCSAgc2l6ZV9jaGFuZ2Vfb2sgPSBmYWxzZTsKLQkJICBpZiAoISBlbGZfbWVyZ2Vfc3ltYm9sIChhYmZkLCBpbmZvLCBzaG9ydG5hbWUsICZzeW0sICZzZWMsCi0JCQkJCSAgJnZhbHVlLCAmaGksICZvdmVycmlkZSwKLQkJCQkJICAmdHlwZV9jaGFuZ2Vfb2ssICZzaXplX2NoYW5nZV9vaykpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIGlmIChvdmVycmlkZSkKLQkJICAgIHsKLQkJICAgICAgLyogSGVyZSBTSE9SVE5BTUUgaXMgYSB2ZXJzaW9uZWQgbmFtZSwgc28gd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBleHBlY3QgdG8gc2VlIHRoZSB0eXBlIG9mIG92ZXJyaWRlIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG8gaW4gdGhlIGNhc2UgYWJvdmUuICAqLwotCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCIlczogd2FybmluZzogdW5leHBlY3RlZCByZWRlZmluaXRpb24gb2YgYCVzJyIpLAotCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzaG9ydG5hbWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCQkgICAgIChpbmZvLCBhYmZkLCBzaG9ydG5hbWUsIEJTRl9JTkRJUkVDVCwKLQkJCSAgICAgIGJmZF9pbmRfc2VjdGlvbl9wdHIsIChiZmRfdm1hKSAwLCBuYW1lLCBmYWxzZSwKLQkJCSAgICAgIGNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmhpKSkpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgICAvKiBJZiB0aGVyZSBpcyBhIGR1cGxpY2F0ZSBkZWZpbml0aW9uIHNvbWV3aGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIEhJIG1heSBub3QgcG9pbnQgdG8gYW4gaW5kaXJlY3Qgc3ltYm9sLgotICAgICAgICAgICAgICAgICAgICAgICAgIFdlIHdpbGwgaGF2ZSByZXBvcnRlZCBhbiBlcnJvciB0byB0aGUgdXNlciBpbgotICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2FzZS4gICovCi0KLQkJICAgICAgaWYgKGhpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLQkJCXsKLQkJCSAgLyogSWYgdGhlIHN5bWJvbCBiZWNhbWUgaW5kaXJlY3QsIHRoZW4gd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzdW1lIHRoYXQgd2UgaGF2ZSBub3Qgc2VlbiBhIGRlZmluaXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlLiAgKi8KLQkJCSAgQkZEX0FTU0VSVCAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICAgICAgICYgKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMKLQkJCQkJICB8IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCQkJCSAgICAgID09IDApOwotCi0JCQkgIC8qIENvcHkgZG93biBhbnkgcmVmZXJlbmNlcyB0aGF0IHdlIG1heSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgc2VlbiB0byB0aGUgc3ltYm9sIHdoaWNoIGp1c3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYW1lIGluZGlyZWN0LiAgKi8KLQkJCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PQotCQkJICAgIChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAmIChFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDCi0JCQkJfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUsKLQkJCQl8IEVMRl9MSU5LX05PTl9HT1RfUkVGKSk7Ci0KLQkJCSAgLyogQ29weSBvdmVyIHRoZSBnbG9iYWwgYW5kIHByb2NlZHVyZSBsaW5rYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlIG9mZnNldCBlbnRyaWVzLiAgVGhlc2UgbWF5IGhhdmUgYmVlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IHNldCB1cCBieSBhIGNoZWNrX3JlbG9jcyByb3V0aW5lLiAgKi8KLQkJCSAgaWYgKGgtPmdvdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCQkJICAgIHsKLQkJCSAgICAgIGgtPmdvdC5vZmZzZXQgPSBoaS0+Z290Lm9mZnNldDsKLQkJCSAgICAgIGhpLT5nb3Qub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCQkJICAgIH0KLQkJCSAgQkZEX0FTU0VSVCAoaGktPmdvdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKTsKLQotCQkJICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JCQkgICAgewotCQkJICAgICAgaC0+cGx0Lm9mZnNldCA9IGhpLT5wbHQub2Zmc2V0OwotCQkJICAgICAgaGktPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JCQkgICAgfQotCQkJICBCRkRfQVNTRVJUIChoaS0+Z290Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpOwotCi0JCQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQkJICAgIHsKLQkJCSAgICAgIGgtPmR5bmluZHggPSBoaS0+ZHluaW5keDsKLQkJCSAgICAgIGgtPmR5bnN0cl9pbmRleCA9IGhpLT5keW5zdHJfaW5kZXg7Ci0JCQkgICAgICBoaS0+ZHluaW5keCA9IC0xOwotCQkJICAgICAgaGktPmR5bnN0cl9pbmRleCA9IDA7Ci0JCQkgICAgfQotCQkJICBCRkRfQVNTRVJUIChoaS0+ZHluaW5keCA9PSAtMSk7Ci0KLQkJCSAgLyogRklYTUU6IFRoZXJlIG1heSBiZSBvdGhlciBpbmZvcm1hdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5IG92ZXIgZm9yIHBhcnRpY3VsYXIgdGFyZ2V0cy4gICovCi0KLQkJCSAgLyogU2VlIGlmIHRoZSBuZXcgZmxhZ3MgbGVhZCB1cyB0byByZWFsaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIHN5bWJvbCBtdXN0IGJlIGR5bmFtaWMuICAqLwotCQkJICBpZiAoISBkeW5zeW0pCi0JCQkgICAgewotCQkJICAgICAgaWYgKCEgZHluYW1pYykKLQkJCQl7Ci0JCQkJICBpZiAoaW5mby0+c2hhcmVkCi0JCQkJICAgICAgfHwgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCQkgICAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpCi0JCQkJCSAgIT0gMCkpCi0JCQkJICAgIGR5bnN5bSA9IHRydWU7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIGlmICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAgICAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwKQotCQkJCSAgICBkeW5zeW0gPSB0cnVlOwotCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoZHluc3ltICYmIGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGlmIChoLT53ZWFrZGVmICE9IE5VTEwKLQkJICAmJiAhIG5ld193ZWFrZGVmCi0JCSAgJiYgaC0+d2Vha2RlZi0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLAotCQkJCQkJCSAgICAgaC0+d2Vha2RlZikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBOb3cgc2V0IHRoZSB3ZWFrZGVmcyBmaWVsZCBjb3JyZWN0bHkgZm9yIGFsbCB0aGUgd2VhayBkZWZpbmVkCi0gICAgIHN5bWJvbHMgd2UgZm91bmQuICBUaGUgb25seSB3YXkgdG8gZG8gdGhpcyBpcyB0byBzZWFyY2ggYWxsIHRoZQotICAgICBzeW1ib2xzLiAgU2luY2Ugd2Ugb25seSBuZWVkIHRoZSBpbmZvcm1hdGlvbiBmb3Igbm9uIGZ1bmN0aW9ucyBpbgotICAgICBkeW5hbWljIG9iamVjdHMsIHRoYXQncyB0aGUgb25seSB0aW1lIHdlIGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbgotICAgICB0aGUgbGlzdCBXRUFLUy4gIFdlIG5lZWQgdGhpcyBpbmZvcm1hdGlvbiBzbyB0aGF0IGlmIGEgcmVndWxhcgotICAgICBvYmplY3QgcmVmZXJzIHRvIGEgc3ltYm9sIGRlZmluZWQgd2Vha2x5IGluIGEgZHluYW1pYyBvYmplY3QsIHRoZQotICAgICByZWFsIHN5bWJvbCBpbiB0aGUgZHluYW1pYyBvYmplY3QgaXMgYWxzbyBwdXQgaW4gdGhlIGR5bmFtaWMKLSAgICAgc3ltYm9sczsgd2UgYWxzbyBtdXN0IGFycmFuZ2UgZm9yIGJvdGggc3ltYm9scyB0byBwb2ludCB0byB0aGUKLSAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24uICBXZSBjb3VsZCBoYW5kbGUgdGhlIGdlbmVyYWwgY2FzZSBvZiBzeW1ib2wKLSAgICAgYWxpYXNpbmcsIGJ1dCBhIGdlbmVyYWwgc3ltYm9sIGFsaWFzIGNhbiBvbmx5IGJlIGdlbmVyYXRlZCBpbgotICAgICBhc3NlbWJsZXIgY29kZSwgaGFuZGxpbmcgaXQgY29ycmVjdGx5IHdvdWxkIGJlIHZlcnkgdGltZQotICAgICBjb25zdW1pbmcsIGFuZCBvdGhlciBFTEYgbGlua2VycyBkb24ndCBoYW5kbGUgZ2VuZXJhbCBhbGlhc2luZwotICAgICBlaXRoZXIuICAqLwotICB3aGlsZSAod2Vha3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaGxvb2s7Ci0gICAgICBhc2VjdGlvbiAqc2xvb2s7Ci0gICAgICBiZmRfdm1hIHZsb29rOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipocHA7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKmhwcGVuZDsKLQotICAgICAgaGxvb2sgPSB3ZWFrczsKLSAgICAgIHdlYWtzID0gaGxvb2stPndlYWtkZWY7Ci0gICAgICBobG9vay0+d2Vha2RlZiA9IE5VTEw7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGhsb29rLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaGxvb2stPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJICB8fCBobG9vay0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JCSAgfHwgaGxvb2stPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KTsKLSAgICAgIHNsb29rID0gaGxvb2stPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHZsb29rID0gaGxvb2stPnJvb3QudS5kZWYudmFsdWU7Ci0KLSAgICAgIGhwcCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgICAgIGhwcGVuZCA9IGhwcCArIGV4dHN5bWNvdW50OwotICAgICAgZm9yICg7IGhwcCA8IGhwcGVuZDsgaHBwKyspCi0JewotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSAqaHBwOwotCSAgaWYgKGggIT0gTlVMTCAmJiBoICE9IGhsb29rCi0JICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzbG9vawotCSAgICAgICYmIGgtPnJvb3QudS5kZWYudmFsdWUgPT0gdmxvb2spCi0JICAgIHsKLQkgICAgICBobG9vay0+d2Vha2RlZiA9IGg7Ci0KLQkgICAgICAvKiBJZiB0aGUgd2VhayBkZWZpbml0aW9uIGlzIGluIHRoZSBsaXN0IG9mIGR5bmFtaWMKLQkJIHN5bWJvbHMsIG1ha2Ugc3VyZSB0aGUgcmVhbCBkZWZpbml0aW9uIGlzIHB1dCB0aGVyZQotCQkgYXMgd2VsbC4gICovCi0JICAgICAgaWYgKGhsb29rLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgaC0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICAvKiBJZiB0aGUgcmVhbCBkZWZpbml0aW9uIGlzIGluIHRoZSBsaXN0IG9mIGR5bmFtaWMKLSAgICAgICAgICAgICAgICAgc3ltYm9scywgbWFrZSBzdXJlIHRoZSB3ZWFrIGRlZmluaXRpb24gaXMgcHV0IHRoZXJlCi0gICAgICAgICAgICAgICAgIGFzIHdlbGwuICBJZiB3ZSBkb24ndCBkbyB0aGlzLCB0aGVuIHRoZSBkeW5hbWljCi0gICAgICAgICAgICAgICAgIGxvYWRlciBtaWdodCBub3QgbWVyZ2UgdGhlIGVudHJpZXMgZm9yIHRoZSByZWFsCi0gICAgICAgICAgICAgICAgIGRlZmluaXRpb24gYW5kIHRoZSB3ZWFrIGRlZmluaXRpb24uICAqLwotCSAgICAgIGlmIChoLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgaGxvb2stPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaGxvb2spKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIGJ1ZiA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChleHR2ZXJzeW0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChleHR2ZXJzeW0pOwotICAgICAgZXh0dmVyc3ltID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBvYmplY3QgaXMgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBvdXRwdXQgb2JqZWN0LCBhbmQgaXQgaXMKLSAgICAgbm90IGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gbGV0IHRoZSBiYWNrZW5kIGxvb2sgdGhyb3VnaCB0aGUKLSAgICAgcmVsb2NzLgotCi0gICAgIFRoaXMgaXMgcmVxdWlyZWQgdG8gYnVpbGQgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyaWVzIGFuZCB0bwotICAgICBhcnJhbmdlIGZvciBkeW5hbWljIHJlbG9jcy4gIEl0IGlzIG5vdCByZXF1aXJlZCBmb3IgdGhlCi0gICAgIHBhcnRpY3VsYXIgY29tbW9uIGNhc2Ugb2YgbGlua2luZyBub24gUElDIGNvZGUsIGV2ZW4gd2hlbiBsaW5raW5nCi0gICAgIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcywgYnV0IHVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gd2F5IG9mCi0gICAgIGtub3dpbmcgd2hldGhlciBhbiBvYmplY3QgZmlsZSBoYXMgYmVlbiBjb21waWxlZCBQSUMgb3Igbm90LgotICAgICBMb29raW5nIHRocm91Z2ggdGhlIHJlbG9jcyBpcyBub3QgcGFydGljdWxhcmx5IHRpbWUgY29uc3VtaW5nLgotICAgICBUaGUgcHJvYmxlbSBpcyB0aGF0IHdlIG11c3QgZWl0aGVyICgxKSBrZWVwIHRoZSByZWxvY3MgaW4gbWVtb3J5LAotICAgICB3aGljaCBjYXVzZXMgdGhlIGxpbmtlciB0byByZXF1aXJlIGFkZGl0aW9uYWwgcnVudGltZSBtZW1vcnkgb3IKLSAgICAgKDIpIHJlYWQgdGhlIHJlbG9jcyB0d2ljZSBmcm9tIHRoZSBpbnB1dCBmaWxlLCB3aGljaCB3YXN0ZXMgdGltZS4KLSAgICAgVGhpcyB3b3VsZCBiZSBhIGdvb2QgY2FzZSBmb3IgdXNpbmcgbW1hcC4KLQotICAgICBJIGhhdmUgbm8gaWRlYSBob3cgdG8gaGFuZGxlIGxpbmtpbmcgUElDIGNvZGUgaW50byBhIGZpbGUgb2YgYQotICAgICBkaWZmZXJlbnQgZm9ybWF0LiAgSXQgcHJvYmFibHkgY2FuJ3QgYmUgZG9uZS4gICovCi0gIGNoZWNrX3JlbG9jcyA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y2hlY2tfcmVsb2NzOwotICBpZiAoISBkeW5hbWljCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IKLSAgICAgICYmIGNoZWNrX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpvOwotCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotCSAgYm9vbGVhbiBvazsKLQotCSAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgICAgIHx8IG8tPnJlbG9jX2NvdW50ID09IDAKLQkgICAgICB8fCAoKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbCB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9kZWJ1Z2dlcikKLQkJICAmJiAoby0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAoby0+b3V0cHV0X3NlY3Rpb24pKQotCSAgICBjb250aW51ZTsKLQotCSAgaW50ZXJuYWxfcmVsb2NzID0gKE5BTUUoX2JmZF9lbGYsbGlua19yZWFkX3JlbG9jcykKLQkJCSAgICAgKGFiZmQsIG8sIChQVFIpIE5VTEwsCi0JCQkgICAgICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJCSAgICAgIGluZm8tPmtlZXBfbWVtb3J5KSk7Ci0JICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBvayA9ICgqY2hlY2tfcmVsb2NzKSAoYWJmZCwgaW5mbywgbywgaW50ZXJuYWxfcmVsb2NzKTsKLQotCSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0JICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0KLQkgIGlmICghIG9rKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBub24tdHJhZGl0aW9uYWwsIG5vbi1yZWxvY2F0ZWFibGUgbGluaywgdHJ5IHRvCi0gICAgIG9wdGltaXplIHRoZSBoYW5kbGluZyBvZiB0aGUgLnN0YWIvLnN0YWJzdHIgc2VjdGlvbnMuICAqLwotICBpZiAoISBkeW5hbWljCi0gICAgICAmJiAhIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgISBpbmZvLT50cmFkaXRpb25hbF9mb3JtYXQKLSAgICAgICYmIGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgJiYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCAmJiBpbmZvLT5zdHJpcCAhPSBzdHJpcF9kZWJ1Z2dlcikpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN0YWIsICpzdGFic3RyOwotCi0gICAgICBzdGFiID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc3RhYiIpOwotICAgICAgaWYgKHN0YWIgIT0gTlVMTCkKLQl7Ci0JICBzdGFic3RyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc3RhYnN0ciIpOwotCi0JICBpZiAoc3RhYnN0ciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICpzZWNkYXRhOwotCi0JICAgICAgc2VjZGF0YSA9IGVsZl9zZWN0aW9uX2RhdGEgKHN0YWIpOwotCSAgICAgIGlmICghIF9iZmRfbGlua19zZWN0aW9uX3N0YWJzIChhYmZkLAotCQkJCQkgICAgICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCQkJICAgICBzdGFiLCBzdGFic3RyLAotCQkJCQkgICAgICZzZWNkYXRhLT5zdGFiX2luZm8pKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICBpZiAoZHluYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoZHluYnVmKTsKLSAgaWYgKGR5bnZlciAhPSBOVUxMKQotICAgIGZyZWUgKGR5bnZlcik7Ci0gIGlmIChleHR2ZXJzeW0gIT0gTlVMTCkKLSAgICBmcmVlIChleHR2ZXJzeW0pOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENyZWF0ZSBzb21lIHNlY3Rpb25zIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGggZHluYW1pYyBsaW5raW5nCi0gICBpbmZvcm1hdGlvbi4gIEFCRkQgaXMgYW4gaW5wdXQgZmlsZSB3aGljaCByZXF1aXJlcyBkeW5hbWljIHNlY3Rpb25zCi0gICB0byBiZSBjcmVhdGVkLiAgVGhlIGR5bmFtaWMgc2VjdGlvbnMgdGFrZSB1cCB2aXJ0dWFsIG1lbW9yeSBzcGFjZQotICAgd2hlbiB0aGUgZmluYWwgZXhlY3V0YWJsZSBpcyBydW4sIHNvIHdlIG5lZWQgdG8gY3JlYXRlIHRoZW0gYmVmb3JlCi0gICBhZGRyZXNzZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBvdXRwdXQgc2VjdGlvbnMuICBXZSB3b3JrIG91dCB0aGUKLSAgIGFjdHVhbCBjb250ZW50cyBhbmQgc2l6ZSBvZiB0aGVzZSBzZWN0aW9ucyBsYXRlci4gICovCi0KLWJvb2xlYW4KLWVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCBhbGwgZHluYW1pYyBzZWN0aW9ucyB1c2UgdGhlIHNhbWUgaW5wdXQgQkZELiAgKi8KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotICBlbHNlCi0gICAgYWJmZCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE5vdGUgdGhhdCB3ZSBzZXQgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZyBmb3IgYWxsIG9mIHRoZXNlCi0gICAgIHNlY3Rpb25zLiAgKi8KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JICAgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICAvKiBBIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlIGhhcyBhIC5pbnRlcnAgc2VjdGlvbiwgYnV0IGEKLSAgICAgc2hhcmVkIGxpYnJhcnkgZG9lcyBub3QuICAqLwotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuaW50ZXJwIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHNlY3Rpb25zIHRvIGhvbGQgdmVyc2lvbiBpbmZvcm1hdGlvbnMuICBUaGVzZSBhcmUgcmVtb3ZlZAotICAgICBpZiB0aGV5IGFyZSBub3QgbmVlZGVkLiAgKi8KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ251LnZlcnNpb25fZCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ251LnZlcnNpb24iKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAxKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ251LnZlcnNpb25fciIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc3ltIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgTE9HX0ZJTEVfQUxJR04pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5zdHIiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ3JlYXRlIGEgc3RydGFiIHRvIGhvbGQgdGhlIGR5bmFtaWMgc3ltYm9sIG5hbWVzLiAgKi8KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyID09IE5VTEwpCi0gICAgewotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPSBlbGZfc3RyaW5ndGFiX2luaXQgKCk7Ci0gICAgICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBzcGVjaWFsIHN5bWJvbCBfRFlOQU1JQyBpcyBhbHdheXMgc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgLmR5bmFtaWMgc2VjdGlvbi4gIFRoaXMgY2FsbCBvY2N1cnMgYmVmb3JlIHdlIGhhdmUgcHJvY2Vzc2VkIHRoZQotICAgICBzeW1ib2xzIGZvciBhbnkgZHluYW1pYyBvYmplY3QsIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQKLSAgICAgb3ZlcnJpZGluZyBhIGR5bmFtaWMgZGVmaW5pdGlvbi4gIFdlIGNvdWxkIHNldCBfRFlOQU1JQyBpbiBhCi0gICAgIGxpbmtlciBzY3JpcHQsIGJ1dCB3ZSBvbmx5IHdhbnQgdG8gZGVmaW5lIGl0IGlmIHdlIGFyZSwgaW4gZmFjdCwKLSAgICAgY3JlYXRpbmcgYSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgaXQgaWYgdGhlcmUKLSAgICAgaXMgbm8gLmR5bmFtaWMgc2VjdGlvbiwgc2luY2Ugb24gc29tZSBFTEYgcGxhdGZvcm1zIHRoZSBzdGFydCB1cAotICAgICBjb2RlIGV4YW1pbmVzIGl0IHRvIGRlY2lkZSBob3cgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvY2Vzcy4gICovCi0gIGggPSBOVUxMOwotICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgKGluZm8sIGFiZmQsICJfRFlOQU1JQyIsIEJTRl9HTE9CQUwsIHMsIChiZmRfdm1hKSAwLAotCSAgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZAotICAgICAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5oYXNoIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgTE9HX0ZJTEVfQUxJR04pKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9oYXNoX2VudHJ5OwotCi0gIC8qIExldCB0aGUgYmFja2VuZCBjcmVhdGUgdGhlIHJlc3Qgb2YgdGhlIHNlY3Rpb25zLiAgVGhpcyBsZXRzIHRoZQotICAgICBiYWNrZW5kIHNldCB0aGUgcmlnaHQgZmxhZ3MuICBUaGUgYmFja2VuZCB3aWxsIG5vcm1hbGx5IGNyZWF0ZQotICAgICB0aGUgLmdvdCBhbmQgLnBsdCBzZWN0aW9ucy4gICovCi0gIGlmICghICgqYmVkLT5lbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucykgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhbiBlbnRyeSB0byB0aGUgLmR5bmFtaWMgdGFibGUuICAqLwotCi1ib29sZWFuCi1lbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIHRhZywgdmFsKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSB0YWc7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBzaXplX3QgbmV3c2l6ZTsKLSAgYmZkX2J5dGUgKm5ld2NvbnRlbnRzOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICBuZXdzaXplID0gcy0+X3Jhd19zaXplICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfRHluKTsKLSAgbmV3Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3JlYWxsb2MgKHMtPmNvbnRlbnRzLCBuZXdzaXplKTsKLSAgaWYgKG5ld2NvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGR5bi5kX3RhZyA9IHRhZzsKLSAgZHluLmRfdW4uZF92YWwgPSB2YWw7Ci0gIGVsZl9zd2FwX2R5bl9vdXQgKGR5bm9iaiwgJmR5biwKLQkJICAgIChFbGZfRXh0ZXJuYWxfRHluICopIChuZXdjb250ZW50cyArIHMtPl9yYXdfc2l6ZSkpOwotCi0gIHMtPl9yYXdfc2l6ZSA9IG5ld3NpemU7Ci0gIHMtPmNvbnRlbnRzID0gbmV3Y29udGVudHM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlY29yZCBhIG5ldyBsb2NhbCBkeW5hbWljIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWVsZl9saW5rX3JlY29yZF9sb2NhbF9keW5hbWljX3N5bWJvbCAoaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9pbmR4KQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGxvbmcgaW5wdXRfaW5keDsKLXsKLSAgc3RydWN0IGVsZl9saW5rX2xvY2FsX2R5bmFtaWNfZW50cnkgKmVudHJ5OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqZWh0OwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpkeW5zdHI7Ci0gIEVsZl9FeHRlcm5hbF9TeW0gZXN5bTsKLSAgdW5zaWduZWQgbG9uZyBkeW5zdHJfaW5kZXg7Ci0gIGNoYXIgKm5hbWU7Ci0KLSAgLyogU2VlIGlmIHRoZSBlbnRyeSBleGlzdHMgYWxyZWFkeS4gICovCi0gIGZvciAoZW50cnkgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmxvY2FsOyBlbnRyeSA7IGVudHJ5ID0gZW50cnktPm5leHQpCi0gICAgaWYgKGVudHJ5LT5pbnB1dF9iZmQgPT0gaW5wdXRfYmZkICYmIGVudHJ5LT5pbnB1dF9pbmR4ID09IGlucHV0X2luZHgpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICBlbnRyeSA9IChzdHJ1Y3QgZWxmX2xpbmtfbG9jYWxfZHluYW1pY19lbnRyeSAqKQotICAgIGJmZF9hbGxvYyAoaW5wdXRfYmZkLCBzaXplb2YgKCplbnRyeSkpOwotICBpZiAoZW50cnkgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR28gZmluZCB0aGUgc3ltYm9sLCBzbyB0aGF0IHdlIGNhbiBmaW5kIGl0J3MgbmFtZS4gICovCi0gIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLAotCQkoZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyLnNoX29mZnNldAotCQkgKyBpbnB1dF9pbmR4ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSksCi0JCVNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKCZlc3ltLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLCAxLCBpbnB1dF9iZmQpCi0JICAhPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsZl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCAmZXN5bSwgJmVudHJ5LT5pc3ltKTsKLQotICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkgIChpbnB1dF9iZmQsIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkci5zaF9saW5rLAotCSAgIGVudHJ5LT5pc3ltLnN0X25hbWUpKTsKLQotICBkeW5zdHIgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cjsKLSAgaWYgKGR5bnN0ciA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBhIHN0cnRhYiB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbCBuYW1lcy4gICovCi0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciA9IGR5bnN0ciA9IF9iZmRfZWxmX3N0cmluZ3RhYl9pbml0ICgpOwotICAgICAgaWYgKGR5bnN0ciA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZHluc3RyX2luZGV4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChkeW5zdHIsIG5hbWUsIHRydWUsIGZhbHNlKTsKLSAgaWYgKGR5bnN0cl9pbmRleCA9PSAodW5zaWduZWQgbG9uZykgLTEpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbnRyeS0+aXN5bS5zdF9uYW1lID0gZHluc3RyX2luZGV4OwotCi0gIGVodCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBlbnRyeS0+bmV4dCA9IGVodC0+ZHlubG9jYWw7Ci0gIGVodC0+ZHlubG9jYWwgPSBlbnRyeTsKLSAgZW50cnktPmlucHV0X2JmZCA9IGlucHV0X2JmZDsKLSAgZW50cnktPmlucHV0X2luZHggPSBpbnB1dF9pbmR4OwotICBlaHQtPmR5bnN5bWNvdW50Kys7Ci0KLSAgLyogV2hhdGV2ZXIgYmluZGluZyB0aGUgc3ltYm9sIGhhZCBiZWZvcmUsIGl0J3Mgbm93IGxvY2FsLiAgKi8KLSAgZW50cnktPmlzeW0uc3RfaW5mbwotICAgID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgRUxGX1NUX1RZUEUgKGVudHJ5LT5pc3ltLnN0X2luZm8pKTsKLQotICAvKiBUaGUgZHluaW5keCB3aWxsIGJlIHNldCBhdCB0aGUgZW5kIG9mIHNpemVfZHluYW1pY19zZWN0aW9ucy4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0KLS8qIFJlYWQgYW5kIHN3YXAgdGhlIHJlbG9jcyBmcm9tIHRoZSBzZWN0aW9uIGluZGljYXRlZCBieSBTSERSLiAgVGhpcwotICAgbWF5IGJlIGVpdGhlciBhIFJFTCBvciBhIFJFTEEgc2VjdGlvbi4gIFRoZSByZWxvY2F0aW9ucyBhcmUKLSAgIHRyYW5zbGF0ZWQgaW50byBSRUxBIHJlbG9jYXRpb25zIGFuZCBzdG9yZWQgaW4gSU5URVJOQUxfUkVMT0NTLAotICAgd2hpY2ggc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCB0byBjb250YWluIGVub3VnaCBzcGFjZS4KLSAgIFRoZSBFWFRFUk5BTF9SRUxPQ1MgYXJlIGEgYnVmZmVyIHdoZXJlIHRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZQotICAgcmVsb2NhdGlvbnMgc2hvdWxkIGJlIHN0b3JlZC4KLQotICAgUmV0dXJucyBmYWxzZSBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19yZWFkX3JlbG9jc19mcm9tX3NlY3Rpb24gKGFiZmQsIHNoZHIsIGV4dGVybmFsX3JlbG9jcywKLQkJCQkgICBpbnRlcm5hbF9yZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKnNoZHI7Ci0gICAgIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci17Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0KLSAgLyogSWYgdGhlcmUgYXJlbid0IGFueSByZWxvY2F0aW9ucywgdGhhdCdzIE9LLiAgKi8KLSAgaWYgKCFzaGRyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFBvc2l0aW9uIG91cnNlbHZlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24uICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNoZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlYWQgdGhlIHJlbG9jYXRpb25zLiAgKi8KLSAgaWYgKGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIDEsIHNoZHItPnNoX3NpemUsIGFiZmQpCi0gICAgICAhPSBzaGRyLT5zaF9zaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgLyogQ29udmVydCB0aGUgZXh0ZXJuYWwgcmVsb2NhdGlvbnMgdG8gdGhlIGludGVybmFsIGZvcm1hdC4gICovCi0gIGlmIChzaGRyLT5zaF9lbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbCkpCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX1JlbCAqZXJlbDsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWxlbmQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsICppcmVsOwotCi0gICAgICBlcmVsID0gKEVsZl9FeHRlcm5hbF9SZWwgKikgZXh0ZXJuYWxfcmVsb2NzOwotICAgICAgZXJlbGVuZCA9IGVyZWwgKyBzaGRyLT5zaF9zaXplIC8gc2hkci0+c2hfZW50c2l6ZTsKLSAgICAgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotICAgICAgaXJlbCA9IGJmZF9hbGxvYyAoYWJmZCwgKGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWwKLQkJCSAgICAgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbCkpKTsKLSAgICAgIGZvciAoOyBlcmVsIDwgZXJlbGVuZDsgZXJlbCsrLCBpcmVsYSArPSBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsKQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgaTsKLQotCSAgaWYgKGJlZC0+cy0+c3dhcF9yZWxvY19pbikKLQkgICAgKCpiZWQtPnMtPnN3YXBfcmVsb2NfaW4pIChhYmZkLCAoYmZkX2J5dGUgKikgZXJlbCwgaXJlbCk7Ci0JICBlbHNlCi0JICAgIGVsZl9zd2FwX3JlbG9jX2luIChhYmZkLCBlcmVsLCBpcmVsKTsKLQotCSAgZm9yIChpID0gMDsgaSA8IGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWw7ICsraSkKLQkgICAgewotCSAgICAgIGlyZWxhW2ldLnJfb2Zmc2V0ID0gaXJlbFtpXS5yX29mZnNldDsKLQkgICAgICBpcmVsYVtpXS5yX2luZm8gPSBpcmVsW2ldLnJfaW5mbzsKLQkgICAgICBpcmVsYVtpXS5yX2FkZGVuZCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhOwotICAgICAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhZW5kOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhOwotCi0gICAgICBCRkRfQVNTRVJUIChzaGRyLT5zaF9lbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKTsKLQotICAgICAgZXJlbGEgPSAoRWxmX0V4dGVybmFsX1JlbGEgKikgZXh0ZXJuYWxfcmVsb2NzOwotICAgICAgZXJlbGFlbmQgPSBlcmVsYSArIHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOwotICAgICAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBmb3IgKDsgZXJlbGEgPCBlcmVsYWVuZDsgZXJlbGErKywgaXJlbGEgKz0gYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbCkKLQl7Ci0JICBpZiAoYmVkLT5zLT5zd2FwX3JlbG9jYV9pbikKLQkgICAgKCpiZWQtPnMtPnN3YXBfcmVsb2NhX2luKSAoYWJmZCwgKGJmZF9ieXRlICopIGVyZWxhLCBpcmVsYSk7Ci0JICBlbHNlCi0JICAgIGVsZl9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgZXJlbGEsIGlyZWxhKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGFuZCBzd2FwIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBPLiAgVGhleSBtYXkgaGF2ZSBiZWVuCi0gICBjYWNoZWQuICBJZiB0aGUgRVhURVJOQUxfUkVMT0NTIGFuZCBJTlRFUk5BTF9SRUxPQ1MgYXJndW1lbnRzIGFyZQotICAgbm90IE5VTEwsIHRoZXkgYXJlIHVzZWQgYXMgYnVmZmVycyB0byByZWFkIGludG8uICBUaGV5IGFyZSBrbm93biB0bwotICAgYmUgbGFyZ2UgZW5vdWdoLiAgSWYgdGhlIElOVEVSTkFMX1JFTE9DUyByZWxvY3MgYXJndW1lbnQgaXMgTlVMTCwKLSAgIHRoZSByZXR1cm4gdmFsdWUgaXMgYWxsb2NhdGVkIHVzaW5nIGVpdGhlciBtYWxsb2Mgb3IgYmZkX2FsbG9jLAotICAgYWNjb3JkaW5nIHRvIHRoZSBLRUVQX01FTU9SWSBhcmd1bWVudC4gIElmIE8gaGFzIHR3byByZWxvY2F0aW9uCi0gICBzZWN0aW9ucyAoYm90aCBSRUwgYW5kIFJFTEEgcmVsb2NhdGlvbnMpLCB0aGVuIHRoZSBSRUxfSERSCi0gICByZWxvY2F0aW9ucyB3aWxsIGFwcGVhciBmaXJzdCBpbiBJTlRFUk5BTF9SRUxPQ1MsIGZvbGxvd2VkIGJ5IHRoZQotICAgUkVMX0hEUjIgcmVsb2NhdGlvbnMuICAqLwotCi1FbGZfSW50ZXJuYWxfUmVsYSAqCi1OQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpIChhYmZkLCBvLCBleHRlcm5hbF9yZWxvY3MsIGludGVybmFsX3JlbG9jcywKLQkJCQkga2VlcF9tZW1vcnkpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKm87Ci0gICAgIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgIGJvb2xlYW4ga2VlcF9tZW1vcnk7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotICBQVFIgYWxsb2MxID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmFsbG9jMiA9IE5VTEw7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxvY3MgIT0gTlVMTCkKLSAgICByZXR1cm4gZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbG9jczsKLQotICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyOwotCi0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaXplX3Qgc2l6ZTsKLQotICAgICAgc2l6ZSA9IChvLT5yZWxvY19jb3VudCAqIGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWwgCi0JICAgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKSk7Ci0gICAgICBpZiAoa2VlcF9tZW1vcnkpCi0JaW50ZXJuYWxfcmVsb2NzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfcmVsb2NzID0gYWxsb2MyID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIGJmZF9tYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgc2l6ZV90IHNpemUgPSAoc2l6ZV90KSByZWxfaGRyLT5zaF9zaXplOwotCi0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyKQotCXNpemUgKz0gKHNpemVfdCkgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyLT5zaF9zaXplOwotICAgICAgYWxsb2MxID0gKFBUUikgYmZkX21hbGxvYyAoc2l6ZSk7Ci0gICAgICBpZiAoYWxsb2MxID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBleHRlcm5hbF9yZWxvY3MgPSBhbGxvYzE7Ci0gICAgfQotCi0gIGlmICghZWxmX2xpbmtfcmVhZF9yZWxvY3NfZnJvbV9zZWN0aW9uIChhYmZkLCByZWxfaGRyLAotCQkJCQkgIGV4dGVybmFsX3JlbG9jcywKLQkJCQkJICBpbnRlcm5hbF9yZWxvY3MpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoIWVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbiAKLSAgICAgIChhYmZkLCAKLSAgICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjIsCi0gICAgICAgKChiZmRfYnl0ZSAqKSBleHRlcm5hbF9yZWxvY3MpICsgcmVsX2hkci0+c2hfc2l6ZSwKLSAgICAgICBpbnRlcm5hbF9yZWxvY3MgKyAocmVsX2hkci0+c2hfc2l6ZSAvIHJlbF9oZHItPnNoX2VudHNpemUKLQkJCSAgKiBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsKSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogQ2FjaGUgdGhlIHJlc3VsdHMgZm9yIG5leHQgdGltZSwgaWYgd2UgY2FuLiAgKi8KLSAgaWYgKGtlZXBfbWVtb3J5KQotICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgaWYgKGFsbG9jMSAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jMSk7Ci0KLSAgLyogRG9uJ3QgZnJlZSBhbGxvYzIsIHNpbmNlIGlmIGl0IHdhcyBhbGxvY2F0ZWQgd2UgYXJlIHBhc3NpbmcgaXQKLSAgICAgYmFjayAodW5kZXIgdGhlIG5hbWUgb2YgaW50ZXJuYWxfcmVsb2NzKS4gICovCi0KLSAgcmV0dXJuIGludGVybmFsX3JlbG9jczsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGFsbG9jMSAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jMSk7Ci0gIGlmIChhbGxvYzIgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvYzIpOwotICByZXR1cm4gTlVMTDsKLX0KLQwKLQotLyogUmVjb3JkIGFuIGFzc2lnbm1lbnQgdG8gYSBzeW1ib2wgbWFkZSBieSBhIGxpbmtlciBzY3JpcHQuICBXZSBuZWVkCi0gICB0aGlzIGluIGNhc2Ugc29tZSBkeW5hbWljIG9iamVjdCByZWZlcnMgdG8gdGhpcyBzeW1ib2wuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLU5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSAob3V0cHV0X2JmZCwgaW5mbywgbmFtZSwgcHJvdmlkZSkKLSAgICAgYmZkICpvdXRwdXRfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIHByb3ZpZGU7Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIHRydWUsIHRydWUsIGZhbHNlKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGJlaW5nIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LCBhbmQgaXQgaXMKLSAgICAgY3VycmVudGx5IGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgYnV0IG5vdCBieSBhIHJlZ3VsYXIKLSAgICAgb2JqZWN0LCB0aGVuIG1hcmsgaXQgYXMgdW5kZWZpbmVkIHNvIHRoYXQgdGhlIGdlbmVyaWMgbGlua2VyIHdpbGwKLSAgICAgZm9yY2UgdGhlIGNvcnJlY3QgdmFsdWUuICAqLwotICBpZiAocHJvdmlkZQotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGJlaW5nIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LCBhbmQgaXQgaXMKLSAgICAgY3VycmVudGx5IGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgYnV0IG5vdCBieSBhIHJlZ3VsYXIgb2JqZWN0LAotICAgICB0aGVuIGNsZWFyIG91dCBhbnkgdmVyc2lvbiBpbmZvcm1hdGlvbiBiZWNhdXNlIHRoZSBzeW1ib2wgd2lsbCBub3QgYmUKLSAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBkeW5hbWljIG9iamVjdCBhbnkgbW9yZS4gICovCi0gIGlmICghcHJvdmlkZQotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgaC0+dmVyaW5mby52ZXJkZWYgPSBOVUxMOwotCi0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQotICAvKiBXaGVuIHBvc3NpYmxlLCBrZWVwIHRoZSBvcmlnaW5hbCB0eXBlIG9mIHRoZSBzeW1ib2wgKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX05PVFlQRSkKLSAgICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICBpZiAoKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMKLQkJCQkgIHwgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykpICE9IDAKLSAgICAgICB8fCBpbmZvLT5zaGFyZWQpCi0gICAgICAmJiBoLT5keW5pbmR4ID09IC0xKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSB3ZWFrIGRlZmluZWQgc3ltYm9sLCBhbmQgd2Uga25vdyBhIGNvcnJlc3BvbmRpbmcKLQkgcmVhbCBzeW1ib2wgZnJvbSB0aGUgc2FtZSBkeW5hbWljIG9iamVjdCwgbWFrZSBzdXJlIHRoZSByZWFsCi0JIHN5bWJvbCBpcyBhbHNvIG1hZGUgaW50byBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT53ZWFrZGVmICE9IE5VTEwKLQkgICYmIGgtPndlYWtkZWYtPmR5bmluZHggPT0gLTEpCi0JewotCSAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgtPndlYWtkZWYpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uLiAgKi8KLQotc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbwotewotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogVmVyc2lvbiB0cmVlLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJkZWZzOwotICAvKiBXaGV0aGVyIHdlIGFyZSBleHBvcnRpbmcgYWxsIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIGJvb2xlYW4gZXhwb3J0X2R5bmFtaWM7Ci0gIC8qIFdoZXRoZXIgd2UgaGFkIGEgZmFpbHVyZS4gICovCi0gIGJvb2xlYW4gZmFpbGVkOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvCi0gICBlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzLiAgKi8KLQotc3RydWN0IGVsZl9maW5kX3ZlcmRlcF9pbmZvCi17Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBUaGUgbnVtYmVyIG9mIGRlcGVuZGVuY2llcy4gICovCi0gIHVuc2lnbmVkIGludCB2ZXJzOwotICAvKiBXaGV0aGVyIHdlIGhhZCBhIGZhaWx1cmUuICAqLwotICBib29sZWFuIGZhaWxlZDsKLX07Ci0KLS8qIEFycmF5IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgaGFzaCB0YWJsZSBidWNrZXRzIHRvIHVzZQotICAgYmFzZWQgb24gdGhlIG51bWJlciBvZiBzeW1ib2xzIHRoZXJlIGFyZS4gIElmIHRoZXJlIGFyZSBmZXdlciB0aGFuCi0gICAzIHN5bWJvbHMgd2UgdXNlIDEgYnVja2V0LCBmZXdlciB0aGFuIDE3IHN5bWJvbHMgd2UgdXNlIDMgYnVja2V0cywKLSAgIGZld2VyIHRoYW4gMzcgd2UgdXNlIDE3IGJ1Y2tldHMsIGFuZCBzbyBmb3J0aC4gIFdlIG5ldmVyIHVzZSBtb3JlCi0gICB0aGFuIDMyNzcxIGJ1Y2tldHMuICAqLwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGVsZl9idWNrZXRzW10gPQotewotICAxLCAzLCAxNywgMzcsIDY3LCA5NywgMTMxLCAxOTcsIDI2MywgNTIxLCAxMDMxLCAyMDUzLCA0MDk5LCA4MjA5LAotICAxNjQxMSwgMzI3NzEsIDAKLX07Ci0KLS8qIENvbXB1dGUgYnVja2V0IGNvdW50IGZvciBoYXNoaW5nIHRhYmxlLiAgV2UgZG8gbm90IHVzZSBhIHN0YXRpYyBzZXQKLSAgIG9mIHBvc3NpYmxlIHRhYmxlcyBzaXplcyBhbnltb3JlLiAgSW5zdGVhZCB3ZSBkZXRlcm1pbmUgZm9yIGFsbAotICAgcG9zc2libGUgcmVhc29uYWJsZSBzaXplcyBvZiB0aGUgdGFibGUgdGhlIG91dGNvbWUgKGkuZS4sIHRoZQotICAgbnVtYmVyIG9mIGNvbGxpc2lvbnMgZXRjKSBhbmQgY2hvb3NlIHRoZSBiZXN0IHNvbHV0aW9uLiAgVGhlCi0gICB3ZWlnaHRpbmcgZnVuY3Rpb25zIGFyZSBub3QgdG9vIHNpbXBsZSB0byBhbGxvdyB0aGUgdGFibGUgdG8gZ3JvdwotICAgd2l0aG91dCBib3VuZHMuICBJbnN0ZWFkIG9uZSBvZiB0aGUgd2VpZ2h0aW5nIGZhY3RvcnMgaXMgdGhlIHNpemUuCi0gICBUaGVyZWZvcmUgdGhlIHJlc3VsdCBpcyBhbHdheXMgYSBnb29kIHBheW9mZiBiZXR3ZWVuIGZldyBjb2xsaXNpb25zCi0gICAoPSBzaG9ydCBjaGFpbiBsZW5ndGhzKSBhbmQgdGFibGUgc2l6ZS4gICovCi1zdGF0aWMgc2l6ZV90Ci1jb21wdXRlX2J1Y2tldF9jb3VudCAoaW5mbykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHNpemVfdCBkeW5zeW1jb3VudCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0gIHNpemVfdCBiZXN0X3NpemUgPSAwOwotICB1bnNpZ25lZCBsb25nIGludCAqaGFzaGNvZGVzOwotICB1bnNpZ25lZCBsb25nIGludCAqaGFzaGNvZGVzcDsKLSAgdW5zaWduZWQgbG9uZyBpbnQgaTsKLQotICAvKiBDb21wdXRlIHRoZSBoYXNoIHZhbHVlcyBmb3IgYWxsIGV4cG9ydGVkIHN5bWJvbHMuICBBdCB0aGUgc2FtZQotICAgICB0aW1lIHN0b3JlIHRoZSB2YWx1ZXMgaW4gYW4gYXJyYXkgc28gdGhhdCB3ZSBjb3VsZCB1c2UgdGhlbSBmb3IKLSAgICAgb3B0aW1pemF0aW9ucy4gICovCi0gIGhhc2hjb2RlcyA9ICh1bnNpZ25lZCBsb25nIGludCAqKSBiZmRfbWFsbG9jIChkeW5zeW1jb3VudAotCQkJCQkJKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSk7Ci0gIGlmIChoYXNoY29kZXMgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgaGFzaGNvZGVzcCA9IGhhc2hjb2RlczsKLQotICAvKiBQdXQgYWxsIGhhc2ggdmFsdWVzIGluIEhBU0hDT0RFUy4gICovCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgZWxmX2NvbGxlY3RfaGFzaF9jb2RlcywgJmhhc2hjb2Rlc3ApOwotCi0vKiBXZSBoYXZlIGEgcHJvYmxlbSBoZXJlLiAgVGhlIGZvbGxvd2luZyBjb2RlIHRvIG9wdGltaXplIHRoZSB0YWJsZQotICAgc2l6ZSByZXF1aXJlcyBhbiBpbnRlZ2VyIHR5cGUgd2l0aCBtb3JlIHRoZSAzMiBiaXRzLiAgSWYKLSAgIEJGRF9IT1NUX1VfNjRfQklUIGlzIHNldCB3ZSBrbm93IGFib3V0IHN1Y2ggYSB0eXBlLiAgKi8KLSNpZmRlZiBCRkRfSE9TVF9VXzY0X0JJVAotICBpZiAoaW5mby0+b3B0aW1pemUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCBuc3ltcyA9IGhhc2hjb2Rlc3AgLSBoYXNoY29kZXM7Ci0gICAgICBzaXplX3QgbWluc2l6ZTsKLSAgICAgIHNpemVfdCBtYXhzaXplOwotICAgICAgQkZEX0hPU1RfVV82NF9CSVQgYmVzdF9jaGxlbiA9IH4oKEJGRF9IT1NUX1VfNjRfQklUKSAwKTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW50ICpjb3VudHMgOwotCi0gICAgICAvKiBQb3NzaWJsZSBvcHRpbWl6YXRpb24gcGFyYW1ldGVyczogaWYgd2UgaGF2ZSBOU1lNUyBzeW1ib2xzIHdlIHNheQotCSB0aGF0IHRoZSBoYXNoaW5nIHRhYmxlIG11c3QgYXQgbGVhc3QgaGF2ZSBOU1lNUy80IGFuZCBhdCBtb3N0Ci0JIDIqTlNZTVMgYnVja2V0cy4gICovCi0gICAgICBtaW5zaXplID0gbnN5bXMgLyA0OwotICAgICAgaWYgKG1pbnNpemUgPT0gMCkKLQltaW5zaXplID0gMTsKLSAgICAgIGJlc3Rfc2l6ZSA9IG1heHNpemUgPSBuc3ltcyAqIDI7Ci0KLSAgICAgIC8qIENyZWF0ZSBhcnJheSB3aGVyZSB3ZSBjb3VudCB0aGUgY29sbGlzaW9ucyBpbi4gIFdlIG11c3QgdXNlIGJmZF9tYWxsb2MKLQkgc2luY2UgdGhlIHNpemUgY291bGQgYmUgbGFyZ2UuICAqLwotICAgICAgY291bnRzID0gKHVuc2lnbmVkIGxvbmcgaW50ICopIGJmZF9tYWxsb2MgKG1heHNpemUKLQkJCQkJCSAqIHNpemVvZiAodW5zaWduZWQgbG9uZyBpbnQpKTsKLSAgICAgIGlmIChjb3VudHMgPT0gTlVMTCkKLQl7Ci0JICBmcmVlIChoYXNoY29kZXMpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBDb21wdXRlIHRoZSAib3B0aW1hbCIgc2l6ZSBmb3IgdGhlIGhhc2ggdGFibGUuICBUaGUgY3JpdGVyaWEgaXMgYQotCSBtaW5pbWFsIGNoYWluIGxlbmd0aC4gIFRoZSBtaW5vciBjcml0ZXJpYSBpcyAob2YgY291cnNlKSB0aGUgc2l6ZQotCSBvZiB0aGUgdGFibGUuICAqLwotICAgICAgZm9yIChpID0gbWluc2l6ZTsgaSA8IG1heHNpemU7ICsraSkKLQl7Ci0JICAvKiBXYWxrIHRocm91Z2ggdGhlIGFycmF5IG9mIGhhc2hjb2RlcyBhbmQgY291bnQgdGhlIGNvbGxpc2lvbnMuICAqLwotCSAgQkZEX0hPU1RfVV82NF9CSVQgbWF4OwotCSAgdW5zaWduZWQgbG9uZyBpbnQgajsKLQkgIHVuc2lnbmVkIGxvbmcgaW50IGZhY3Q7Ci0KLQkgIG1lbXNldCAoY291bnRzLCAnXDAnLCBpICogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpOwotCi0JICAvKiBEZXRlcm1pbmUgaG93IG9mdGVuIGVhY2ggaGFzaCBidWNrZXQgaXMgdXNlZC4gICovCi0JICBmb3IgKGogPSAwOyBqIDwgbnN5bXM7ICsraikKLQkgICAgKytjb3VudHNbaGFzaGNvZGVzW2pdICUgaV07Ci0KLQkgIC8qIEZvciB0aGUgd2VpZ2h0IGZ1bmN0aW9uIHdlIG5lZWQgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQkgICAgIHBhZ2VzaXplIG9uIHRoZSB0YXJnZXQuICBUaGlzIGlzIGluZm9ybWF0aW9uIG5lZWQgbm90IGJlIDEwMCUKLQkgICAgIGFjY3VyYXRlLiAgU2luY2UgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIChzbyBmYXIpIHdlCi0JICAgICBkZWZpbmUgaXQgaGVyZSB0byBhIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZS4gIElmIGl0IGlzIGNydWNpYWwKLQkgICAgIHRvIGhhdmUgYSBiZXR0ZXIgdmFsdWUgc29tZSBkYXkgc2ltcGx5IGRlZmluZSB0aGlzIHZhbHVlLiAgKi8KLSMgaWZuZGVmIEJGRF9UQVJHRVRfUEFHRVNJWkUKLSMgIGRlZmluZSBCRkRfVEFSR0VUX1BBR0VTSVpFCSg0MDk2KQotIyBlbmRpZgotCi0JICAvKiBXZSBpbiBhbnkgY2FzZSBuZWVkIDIgKyBOU1lNUyBlbnRyaWVzIGZvciB0aGUgc2l6ZSB2YWx1ZXMgYW5kCi0JICAgICB0aGUgY2hhaW5zLiAgKi8KLQkgIG1heCA9ICgyICsgbnN5bXMpICogKEFSQ0hfU0laRSAvIDgpOwotCi0jIGlmIDEKLQkgIC8qIFZhcmlhbnQgMTogb3B0aW1pemUgZm9yIHNob3J0IGNoYWlucy4gIFdlIGFkZCB0aGUgc3F1YXJlcwotCSAgICAgb2YgYWxsIHRoZSBjaGFpbiBsZW5ndGhzICh3aGljaCBmYXZvdXMgbWFueSBzbWFsbCBjaGFpbgotCSAgICAgb3ZlciBhIGZldyBsb25nIGNoYWlucykuICAqLwotCSAgZm9yIChqID0gMDsgaiA8IGk7ICsraikKLQkgICAgbWF4ICs9IGNvdW50c1tqXSAqIGNvdW50c1tqXTsKLQotCSAgLyogVGhpcyBhZGRzIHBlbmFsdGllcyBmb3IgdGhlIG92ZXJhbGwgc2l6ZSBvZiB0aGUgdGFibGUuICAqLwotCSAgZmFjdCA9IGkgLyAoQkZEX1RBUkdFVF9QQUdFU0laRSAvIChBUkNIX1NJWkUgLyA4KSkgKyAxOwotCSAgbWF4ICo9IGZhY3QgKiBmYWN0OwotIyBlbHNlCi0JICAvKiBWYXJpYW50IDI6IE9wdGltaXplIGEgbG90IG1vcmUgZm9yIHNtYWxsIHRhYmxlLiAgSGVyZSB3ZQotCSAgICAgYWxzbyBhZGQgc3F1YXJlcyBvZiB0aGUgc2l6ZSBidXQgd2UgYWxzbyBhZGQgcGVuYWx0aWVzIGZvcgotCSAgICAgZW1wdHkgc2xvdHMgKHRoZSArMSB0ZXJtKS4gICovCi0JICBmb3IgKGogPSAwOyBqIDwgaTsgKytqKQotCSAgICBtYXggKz0gKDEgKyBjb3VudHNbal0pICogKDEgKyBjb3VudHNbal0pOwotCi0JICAvKiBUaGUgb3ZlcmFsbCBzaXplIG9mIHRoZSB0YWJsZSBpcyBjb25zaWRlcmVkLCBidXQgbm90IGFzCi0JICAgICBzdHJvbmcgYXMgaW4gdmFyaWFudCAxLCB3aGVyZSBpdCBpcyBzcXVhcmVkLiAgKi8KLQkgIGZhY3QgPSBpIC8gKEJGRF9UQVJHRVRfUEFHRVNJWkUgLyAoQVJDSF9TSVpFIC8gOCkpICsgMTsKLQkgIG1heCAqPSBmYWN0OwotIyBlbmRpZgotCi0JICAvKiBDb21wYXJlIHdpdGggY3VycmVudCBiZXN0IHJlc3VsdHMuICAqLwotCSAgaWYgKG1heCA8IGJlc3RfY2hsZW4pCi0JICAgIHsKLQkgICAgICBiZXN0X2NobGVuID0gbWF4OwotCSAgICAgIGJlc3Rfc2l6ZSA9IGk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZyZWUgKGNvdW50cyk7Ci0gICAgfQotICBlbHNlCi0jZW5kaWYgLyogZGVmaW5lZCAoQkZEX0hPU1RfVV82NF9CSVQpICovCi0gICAgewotICAgICAgLyogVGhpcyBpcyB0aGUgZmFsbGJhY2sgc29sdXRpb24gaWYgbm8gNjRiaXQgdHlwZSBpcyBhdmFpbGFibGUgb3IgaWYgd2UKLQkgYXJlIG5vdCBzdXBwb3NlZCB0byBzcGVuZCBtdWNoIHRpbWUgb24gb3B0aW1pemF0aW9ucy4gIFdlIHNlbGVjdCB0aGUKLQkgYnVja2V0IGNvdW50IHVzaW5nIGEgZml4ZWQgc2V0IG9mIG51bWJlcnMuICAqLwotICAgICAgZm9yIChpID0gMDsgZWxmX2J1Y2tldHNbaV0gIT0gMDsgaSsrKQotCXsKLQkgIGJlc3Rfc2l6ZSA9IGVsZl9idWNrZXRzW2ldOwotCSAgaWYgKGR5bnN5bWNvdW50IDwgZWxmX2J1Y2tldHNbaSArIDFdKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEZyZWUgdGhlIGFycmF5cyB3ZSBuZWVkZWQuICAqLwotICBmcmVlIChoYXNoY29kZXMpOwotCi0gIHJldHVybiBiZXN0X3NpemU7Ci19Ci0KLS8qIFNldCB1cCB0aGUgc2l6ZXMgYW5kIGNvbnRlbnRzIG9mIHRoZSBFTEYgZHluYW1pYyBzZWN0aW9ucy4gIFRoaXMgaXMKLSAgIGNhbGxlZCBieSB0aGUgRUxGIGxpbmtlciBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZS4gIFdlCi0gICBtdXN0IHNldCB0aGUgc2l6ZXMgb2YgdGhlIHNlY3Rpb25zIGJlZm9yZSB0aGUgbGlua2VyIHNldHMgdGhlCi0gICBhZGRyZXNzZXMgb2YgdGhlIHZhcmlvdXMgc2VjdGlvbnMuICAqLwotCi1ib29sZWFuCi1OQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSAob3V0cHV0X2JmZCwgc29uYW1lLCBycGF0aCwKLQkJCQkgICAgIGV4cG9ydF9keW5hbWljLCBmaWx0ZXJfc2hsaWIsCi0JCQkJICAgICBhdXhpbGlhcnlfZmlsdGVycywgaW5mbywgc2ludGVycHB0ciwKLQkJCQkgICAgIHZlcmRlZnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY29uc3QgY2hhciAqc29uYW1lOwotICAgICBjb25zdCBjaGFyICpycGF0aDsKLSAgICAgYm9vbGVhbiBleHBvcnRfZHluYW1pYzsKLSAgICAgY29uc3QgY2hhciAqZmlsdGVyX3NobGliOwotICAgICBjb25zdCBjaGFyICogY29uc3QgKmF1eGlsaWFyeV9maWx0ZXJzOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKipzaW50ZXJwcHRyOwotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcmRlZnM7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc29uYW1lX2luZHg7Ci0gIGJmZCAqZHlub2JqOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotICBzdHJ1Y3QgZWxmX2Fzc2lnbl9zeW1fdmVyc2lvbl9pbmZvIGFzdmluZm87Ci0KLSAgKnNpbnRlcnBwdHIgPSBOVUxMOwotCi0gIHNvbmFtZV9pbmR4ID0gKGJmZF9zaXplX3R5cGUpIC0xOwotCi0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhlIGJhY2tlbmQgbWF5IGhhdmUgdG8gY3JlYXRlIHNvbWUgc2VjdGlvbnMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCi0gICAgIHdlJ3JlIGR5bmFtaWMgb3Igbm90LiAgKi8KLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKG91dHB1dF9iZmQpOwotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucwotICAgICAgJiYgISAoKmJlZC0+ZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMpIChvdXRwdXRfYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogSWYgdGhlcmUgd2VyZSBubyBkeW5hbWljIG9iamVjdHMgaW4gdGhlIGxpbmssIHRoZXJlIGlzIG5vdGhpbmcgdG8KLSAgICAgZG8gaGVyZS4gICovCi0gIGlmIChkeW5vYmogPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB3ZSBhcmUgc3VwcG9zZWQgdG8gZXhwb3J0IGFsbCBzeW1ib2xzIGludG8gdGhlIGR5bmFtaWMgc3ltYm9sCi0gICAgIHRhYmxlICh0aGlzIGlzIG5vdCB0aGUgbm9ybWFsIGNhc2UpLCB0aGVuIGRvIHNvLiAgKi8KLSAgaWYgKGV4cG9ydF9keW5hbWljKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgZWlmOwotCi0gICAgICBlaWYuZmFpbGVkID0gZmFsc2U7Ci0gICAgICBlaWYuaW5mbyA9IGluZm87Ci0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIGVsZl9leHBvcnRfc3ltYm9sLAotCQkJICAgICAgKFBUUikgJmVpZik7Ci0gICAgICBpZiAoZWlmLmZhaWxlZCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkIGVpZjsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3NpemVfdHlwZSBzdHJzaXplOwotCi0gICAgICAqc2ludGVycHB0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0gICAgICBCRkRfQVNTRVJUICgqc2ludGVycHB0ciAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCk7Ci0KLSAgICAgIGlmIChzb25hbWUgIT0gTlVMTCkKLQl7Ci0JICBzb25hbWVfaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCi0JCQkJCSAgICBzb25hbWUsIHRydWUsIHRydWUpOwotCSAgaWYgKHNvbmFtZV9pbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMQotCSAgICAgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TT05BTUUsIHNvbmFtZV9pbmR4KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGluZm8tPnN5bWJvbGljKQotCXsKLQkgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1lNQk9MSUMsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocnBhdGggIT0gTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLCBycGF0aCwKLQkJCQkgICAgIHRydWUsIHRydWUpOwotCSAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xCi0JICAgICAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JQQVRILCBpbmR4KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGZpbHRlcl9zaGxpYiAhPSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCSAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCi0JCQkJICAgICBmaWx0ZXJfc2hsaWIsIHRydWUsIHRydWUpOwotCSAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xCi0JICAgICAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0ZJTFRFUiwgaW5keCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChhdXhpbGlhcnlfZmlsdGVycyAhPSBOVUxMKQotCXsKLQkgIGNvbnN0IGNoYXIgKiBjb25zdCAqcDsKLQotCSAgZm9yIChwID0gYXV4aWxpYXJ5X2ZpbHRlcnM7ICpwICE9IE5VTEw7IHArKykKLQkgICAgewotCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCQkgKnAsIHRydWUsIHRydWUpOwotCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMQotCQkgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9BVVhJTElBUlksIGluZHgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEF0dGFjaCBhbGwgdGhlIHN5bWJvbHMgdG8gdGhlaXIgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0gICAgICBhc3ZpbmZvLm91dHB1dF9iZmQgPSBvdXRwdXRfYmZkOwotICAgICAgYXN2aW5mby5pbmZvID0gaW5mbzsKLSAgICAgIGFzdmluZm8udmVyZGVmcyA9IHZlcmRlZnM7Ci0gICAgICBhc3ZpbmZvLmV4cG9ydF9keW5hbWljID0gZXhwb3J0X2R5bmFtaWM7Ci0gICAgICBhc3ZpbmZvLmZhaWxlZCA9IGZhbHNlOwotCi0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICBlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24sCi0JCQkgICAgICAoUFRSKSAmYXN2aW5mbyk7Ci0gICAgICBpZiAoYXN2aW5mby5mYWlsZWQpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGaW5kIGFsbCBzeW1ib2xzIHdoaWNoIHdlcmUgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0IGFuZCBtYWtlCi0JIHRoZSBiYWNrZW5kIHBpY2sgYSByZWFzb25hYmxlIHZhbHVlIGZvciB0aGVtLiAgKi8KLSAgICAgIGVpZi5mYWlsZWQgPSBmYWxzZTsKLSAgICAgIGVpZi5pbmZvID0gaW5mbzsKLSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wsCi0JCQkgICAgICAoUFRSKSAmZWlmKTsKLSAgICAgIGlmIChlaWYuZmFpbGVkKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gc29tZSBvZiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGZfYmZkX2ZpbmFsX2xpbmssIGJ1dCB3ZSBtdXN0IGFkZCB0aGUgZW50cmllcwotCSBub3cgc28gdGhhdCB3ZSBrbm93IHRoZSBmaW5hbCBzaXplIG9mIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgKi8KLQotICAgICAgLyogSWYgdGhlcmUgYXJlIGluaXRpYWxpemF0aW9uIGFuZC9vciBmaW5hbGl6YXRpb24gZnVuY3Rpb25zIHRvCi0JIGNhbGwgdGhlbiBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgRFRfSU5JVC9EVF9GSU5JIGVudHJpZXMuICAqLwotICAgICAgaCA9IChpbmZvLT5pbml0X2Z1bmN0aW9uCi0JICAgPyBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCQkgICBpbmZvLT5pbml0X2Z1bmN0aW9uLCBmYWxzZSwKLQkJCQkgICBmYWxzZSwgZmFsc2UpCi0JICAgOiBOVUxMKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkJCQkJfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkgIT0gMCkKLQl7Ci0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0lOSVQsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaCA9IChpbmZvLT5maW5pX2Z1bmN0aW9uCi0JICAgPyBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCQkgICBpbmZvLT5maW5pX2Z1bmN0aW9uLCBmYWxzZSwKLQkJCQkgICBmYWxzZSwgZmFsc2UpCi0JICAgOiBOVUxMKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkJCQkJfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkgIT0gMCkKLQl7Ci0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0ZJTkksIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzdHJzaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpOwotICAgICAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9IQVNILCAwKQotCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NUUlRBQiwgMCkKLQkgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TWU1UQUIsIDApCi0JICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1RSU1osIHN0cnNpemUpCi0JICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1lNRU5ULAotCQkJCSAgICAgIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIGJhY2tlbmQgbXVzdCB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYWxsIHRoZSBvdGhlciBkeW5hbWljCi0gICAgIHNlY3Rpb25zLiAgKi8KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gICAgICAmJiAhICgqYmVkLT5lbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpIChvdXRwdXRfYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHNpemVfdCBkeW5zeW1jb3VudDsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgc2l6ZV90IGJ1Y2tldGNvdW50ID0gMDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLSAgICAgIHNpemVfdCBoYXNoX2VudHJ5X3NpemU7Ci0KLSAgICAgIC8qIFNldCB1cCB0aGUgdmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24uICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb25fZCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBhZGRpdGlvbmFsIHZlcnNpb24gZGVmaW5pdGlvbnMgaWYgd2UgYXJlCi0gICAgICAgICBqdXN0IGxpbmtpbmcgYSByZWd1bGFyIGFwcGxpY2F0aW9uLiAgKi8KLSAgICAgIHZlcmRlZnMgPSBhc3ZpbmZvLnZlcmRlZnM7Ci0KLSAgICAgIGlmICh2ZXJkZWZzID09IE5VTEwpCi0JX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBpbnQgY2RlZnM7Ci0JICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7Ci0JICBiZmRfYnl0ZSAqcDsKLQkgIEVsZl9JbnRlcm5hbF9WZXJkZWYgZGVmOwotCSAgRWxmX0ludGVybmFsX1ZlcmRhdXggZGVmYXV4OwotCi0JICBjZGVmcyA9IDA7Ci0JICBzaXplID0gMDsKLQotCSAgLyogTWFrZSBzcGFjZSBmb3IgdGhlIGJhc2UgdmVyc2lvbi4gICovCi0JICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgKytjZGVmczsKLQotCSAgZm9yICh0ID0gdmVyZGVmczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqbjsKLQotCSAgICAgIHNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKLQkgICAgICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgICAgICsrY2RlZnM7Ci0KLQkgICAgICBmb3IgKG4gPSB0LT5kZXBzOyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQlzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgICB9Ci0KLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemU7Ci0JICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBGaWxsIGluIHRoZSB2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbi4gICovCi0KLQkgIHAgPSBzLT5jb250ZW50czsKLQotCSAgZGVmLnZkX3ZlcnNpb24gPSBWRVJfREVGX0NVUlJFTlQ7Ci0JICBkZWYudmRfZmxhZ3MgPSBWRVJfRkxHX0JBU0U7Ci0JICBkZWYudmRfbmR4ID0gMTsKLQkgIGRlZi52ZF9jbnQgPSAxOwotCSAgZGVmLnZkX2F1eCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICBkZWYudmRfbmV4dCA9IChzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpCi0JCQkgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KSk7Ci0KLQkgIGlmIChzb25hbWVfaW5keCAhPSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JICAgIHsKLQkgICAgICBkZWYudmRfaGFzaCA9IGJmZF9lbGZfaGFzaCAoc29uYW1lKTsKLQkgICAgICBkZWZhdXgudmRhX25hbWUgPSBzb25hbWVfaW5keDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgICAgICBuYW1lID0gb3V0cHV0X2JmZC0+ZmlsZW5hbWU7Ci0JICAgICAgZGVmLnZkX2hhc2ggPSBiZmRfZWxmX2hhc2ggKG5hbWUpOwotCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCQkgICAgbmFtZSwgdHJ1ZSwgZmFsc2UpOwotCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGRlZmF1eC52ZGFfbmFtZSA9IGluZHg7Ci0JICAgIH0KLQkgIGRlZmF1eC52ZGFfbmV4dCA9IDA7Ci0KLQkgIF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCAob3V0cHV0X2JmZCwgJmRlZiwKLQkJCQkgICAgKEVsZl9FeHRlcm5hbF9WZXJkZWYgKilwKTsKLQkgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKLQkgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKG91dHB1dF9iZmQsICZkZWZhdXgsCi0JCQkJICAgICAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgcCk7Ci0JICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCi0JICBmb3IgKHQgPSB2ZXJkZWZzOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGNkZXBzOwotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqbjsKLQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIGNkZXBzID0gMDsKLQkgICAgICBmb3IgKG4gPSB0LT5kZXBzOyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQkrK2NkZXBzOwotCi0JICAgICAgLyogQWRkIGEgc3ltYm9sIHJlcHJlc2VudGluZyB0aGlzIHZlcnNpb24uICAqLwotCSAgICAgIGggPSBOVUxMOwotCSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgICAgIChpbmZvLCBkeW5vYmosIHQtPm5hbWUsIEJTRl9HTE9CQUwsIGJmZF9hYnNfc2VjdGlvbl9wdHIsCi0JCSAgICAgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkJICAgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGR5bm9iaiktPmNvbGxlY3QsCi0JCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfiBFTEZfTElOS19OT05fRUxGOwotCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQkgICAgICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQkgICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OwotCi0JICAgICAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBkZWYudmRfdmVyc2lvbiA9IFZFUl9ERUZfQ1VSUkVOVDsKLQkgICAgICBkZWYudmRfZmxhZ3MgPSAwOwotCSAgICAgIGlmICh0LT5nbG9iYWxzID09IE5VTEwgJiYgdC0+bG9jYWxzID09IE5VTEwgJiYgISB0LT51c2VkKQotCQlkZWYudmRfZmxhZ3MgfD0gVkVSX0ZMR19XRUFLOwotCSAgICAgIGRlZi52ZF9uZHggPSB0LT52ZXJudW0gKyAxOwotCSAgICAgIGRlZi52ZF9jbnQgPSBjZGVwcyArIDE7Ci0JICAgICAgZGVmLnZkX2hhc2ggPSBiZmRfZWxmX2hhc2ggKHQtPm5hbWUpOwotCSAgICAgIGRlZi52ZF9hdXggPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOwotCSAgICAgIGlmICh0LT5uZXh0ICE9IE5VTEwpCi0JCWRlZi52ZF9uZXh0ID0gKHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZikKLQkJCSAgICAgICArIChjZGVwcyArIDEpICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCkpOwotCSAgICAgIGVsc2UKLQkJZGVmLnZkX25leHQgPSAwOwotCi0JICAgICAgX2JmZF9lbGZfc3dhcF92ZXJkZWZfb3V0IChvdXRwdXRfYmZkLCAmZGVmLAotCQkJCQkoRWxmX0V4dGVybmFsX1ZlcmRlZiAqKSBwKTsKLQkgICAgICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0KLQkgICAgICBkZWZhdXgudmRhX25hbWUgPSBoLT5keW5zdHJfaW5kZXg7Ci0JICAgICAgaWYgKHQtPmRlcHMgPT0gTlVMTCkKLQkJZGVmYXV4LnZkYV9uZXh0ID0gMDsKLQkgICAgICBlbHNlCi0JCWRlZmF1eC52ZGFfbmV4dCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCSAgICAgIHQtPm5hbWVfaW5keCA9IGRlZmF1eC52ZGFfbmFtZTsKLQotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKG91dHB1dF9iZmQsICZkZWZhdXgsCi0JCQkJCSAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgcCk7Ci0JICAgICAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQotCSAgICAgIGZvciAobiA9IHQtPmRlcHM7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCi0JCXsKLQkJICBpZiAobi0+dmVyc2lvbl9uZWVkZWQgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUKLQkJCSB2ZXJzaW9uIHNjcmlwdC4gICovCi0JCSAgICAgIGRlZmF1eC52ZGFfbmFtZSA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgZGVmYXV4LnZkYV9uYW1lID0gbi0+dmVyc2lvbl9uZWVkZWQtPm5hbWVfaW5keDsKLQkJICBpZiAobi0+bmV4dCA9PSBOVUxMKQotCQkgICAgZGVmYXV4LnZkYV9uZXh0ID0gMDsKLQkJICBlbHNlCi0JCSAgICBkZWZhdXgudmRhX25leHQgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQotCQkgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQgKG91dHB1dF9iZmQsICZkZWZhdXgsCi0JCQkJCSAgICAgKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHApOwotCQkgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUkRFRiwgMCkKLQkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVkVSREVGTlVNLCBjZGVmcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+Y3ZlcmRlZnMgPSBjZGVmczsKLQl9Ci0KLSAgICAgIC8qIFdvcmsgb3V0IHRoZSBzaXplIG9mIHRoZSB2ZXJzaW9uIHJlZmVyZW5jZSBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb25fciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHsKLQlzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8gc2luZm87Ci0KLQlzaW5mby5vdXRwdXRfYmZkID0gb3V0cHV0X2JmZDsKLQlzaW5mby5pbmZvID0gaW5mbzsKLQlzaW5mby52ZXJzID0gZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+Y3ZlcmRlZnM7Ci0JaWYgKHNpbmZvLnZlcnMgPT0gMCkKLQkgIHNpbmZvLnZlcnMgPSAxOwotCXNpbmZvLmZhaWxlZCA9IGZhbHNlOwotCi0JZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCWVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMsCi0JCQkJKFBUUikgJnNpbmZvKTsKLQotCWlmIChlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT52ZXJyZWYgPT0gTlVMTCkKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0JZWxzZQotCSAgewotCSAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQkgICAgdW5zaWduZWQgaW50IHNpemU7Ci0JICAgIHVuc2lnbmVkIGludCBjcmVmczsKLQkgICAgYmZkX2J5dGUgKnA7Ci0KLQkgICAgLyogQnVpbGQgdGhlIHZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uLiAgKi8KLQkgICAgc2l6ZSA9IDA7Ci0JICAgIGNyZWZzID0gMDsKLQkgICAgZm9yICh0ID0gZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+dmVycmVmOwotCQkgdCAhPSBOVUxMOwotCQkgdCA9IHQtPnZuX25leHRyZWYpCi0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQotCQlzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5lZWQpOwotCQkrK2NyZWZzOwotCQlmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkgIHNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmF1eCk7Ci0JICAgICAgfQotCi0JICAgIHMtPl9yYXdfc2l6ZSA9IHNpemU7Ci0JICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgc2l6ZSk7Ci0JICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBwID0gcy0+Y29udGVudHM7Ci0JICAgIGZvciAodCA9IGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPnZlcnJlZjsKLQkJIHQgIT0gTlVMTDsKLQkJIHQgPSB0LT52bl9uZXh0cmVmKQotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IGNhdXg7Ci0JCUVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOwotCQliZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkJY2F1eCA9IDA7Ci0JCWZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JCSAgKytjYXV4OwotCi0JCXQtPnZuX3ZlcnNpb24gPSBWRVJfTkVFRF9DVVJSRU5UOwotCQl0LT52bl9jbnQgPSBjYXV4OwotCQlpZiAoZWxmX2R0X25hbWUgKHQtPnZuX2JmZCkgIT0gTlVMTCkKLQkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgICBlbGZfZHRfbmFtZSAodC0+dm5fYmZkKSwKLQkJCQkJICAgICB0cnVlLCBmYWxzZSk7Ci0JCWVsc2UKLQkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgICB0LT52bl9iZmQtPmZpbGVuYW1lLCB0cnVlLCBmYWxzZSk7Ci0JCWlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXQtPnZuX2ZpbGUgPSBpbmR4OwotCQl0LT52bl9hdXggPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuZWVkKTsKLQkJaWYgKHQtPnZuX25leHRyZWYgPT0gTlVMTCkKLQkJICB0LT52bl9uZXh0ID0gMDsKLQkJZWxzZQotCQkgIHQtPnZuX25leHQgPSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmVlZCkKLQkJCQkrIGNhdXggKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuYXV4KSk7Ci0KLQkJX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCAob3V0cHV0X2JmZCwgdCwKLQkJCQkJICAgKEVsZl9FeHRlcm5hbF9WZXJuZWVkICopIHApOwotCQlwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5lZWQpOwotCi0JCWZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JCSAgewotCQkgICAgYS0+dm5hX2hhc2ggPSBiZmRfZWxmX2hhc2ggKGEtPnZuYV9ub2RlbmFtZSk7Ci0JCSAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgICAgIGEtPnZuYV9ub2RlbmFtZSwgdHJ1ZSwgZmFsc2UpOwotCQkgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBhLT52bmFfbmFtZSA9IGluZHg7Ci0JCSAgICBpZiAoYS0+dm5hX25leHRwdHIgPT0gTlVMTCkKLQkJICAgICAgYS0+dm5hX25leHQgPSAwOwotCQkgICAgZWxzZQotCQkgICAgICBhLT52bmFfbmV4dCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5hdXgpOwotCi0JCSAgICBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0IChvdXRwdXRfYmZkLCBhLAotCQkJCQkgICAgICAgKEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopIHApOwotCQkgICAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuYXV4KTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVkVSTkVFRCwgMCkKLQkJfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUk5FRUROVU0sIGNyZWZzKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+Y3ZlcnJlZnMgPSBjcmVmczsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgLyogQXNzaWduIGR5bnN5bSBpbmRpY2llcy4gIEluIGEgc2hhcmVkIGxpYnJhcnkgd2UgZ2VuZXJhdGUgYSAKLQkgc2VjdGlvbiBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24sIHdoaWNoIGNvbWUgZmlyc3QuCi0JIE5leHQgY29tZSBhbGwgb2YgdGhlIGJhY2stZW5kIGFsbG9jYXRlZCBsb2NhbCBkeW5hbWljIHN5bXMsCi0JIGZvbGxvd2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0KLSAgICAgIGR5bnN5bWNvdW50ID0gX2JmZF9lbGZfbGlua19yZW51bWJlcl9keW5zeW1zIChvdXRwdXRfYmZkLCBpbmZvKTsKLQotICAgICAgLyogV29yayBvdXQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB2ZXJzaW9uIHNlY3Rpb24uICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb24iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBpZiAoZHluc3ltY291bnQgPT0gMAotCSAgfHwgKHZlcmRlZnMgPT0gTlVMTCAmJiBlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT52ZXJyZWYgPT0gTlVMTCkpCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIC8qIFRoZSBEWU5TWU1DT1VOVCBtaWdodCBoYXZlIGNoYW5nZWQgaWYgd2Ugd2VyZSBnb2luZyB0bwotCSAgICAgb3V0cHV0IGEgZHluYW1pYyBzeW1ib2wgdGFibGUgZW50cnkgZm9yIFMuICAqLwotCSAgZHluc3ltY291bnQgPSBfYmZkX2VsZl9saW5rX3JlbnVtYmVyX2R5bnN5bXMgKG91dHB1dF9iZmQsIGluZm8pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzLT5fcmF3X3NpemUgPSBkeW5zeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcnN5bSk7Ci0JICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotCSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9WRVJTWU0sIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5keW5zeW0gYW5kIC5oYXNoIHNlY3Rpb25zLiAgV2UgY291bnRlZAotCSB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyBpbiBlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMuCi0JIFdlIHdpbGwgYnVpbGQgdGhlIGNvbnRlbnRzIG9mIC5keW5zeW0gYW5kIC5oYXNoIHdoZW4gd2UgYnVpbGQKLQkgdGhlIGZpbmFsIHN5bWJvbCB0YWJsZSwgYmVjYXVzZSB1bnRpbCB0aGVuIHdlIGRvIG5vdCBrbm93IHRoZQotCSBjb3JyZWN0IHZhbHVlIHRvIGdpdmUgdGhlIHN5bWJvbHMuICBXZSBidWlsdCB0aGUgLmR5bnN0cgotCSBzZWN0aW9uIGFzIHdlIHdlbnQgYWxvbmcgaW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IGR5bnN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIGZpcnN0IGVudHJ5IGluIC5keW5zeW0gaXMgYSBkdW1teSBzeW1ib2wuICAqLwotICAgICAgaXN5bS5zdF92YWx1ZSA9IDA7Ci0gICAgICBpc3ltLnN0X3NpemUgPSAwOwotICAgICAgaXN5bS5zdF9uYW1lID0gMDsKLSAgICAgIGlzeW0uc3RfaW5mbyA9IDA7Ci0gICAgICBpc3ltLnN0X290aGVyID0gMDsKLSAgICAgIGlzeW0uc3Rfc2huZHggPSAwOwotICAgICAgZWxmX3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJmlzeW0sCi0JCQkgICAoUFRSKSAoRWxmX0V4dGVybmFsX1N5bSAqKSBzLT5jb250ZW50cyk7Ci0KLSAgICAgIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGhhc2hpbmcgdGFibGUuICBBcyBhIHNpZGUgZWZmZWN0IHRoaXMKLQkgY29tcHV0ZXMgdGhlIGhhc2ggdmFsdWVzIGZvciBhbGwgdGhlIG5hbWVzIHdlIGV4cG9ydC4gICovCi0gICAgICBidWNrZXRjb3VudCA9IGNvbXB1dGVfYnVja2V0X2NvdW50IChpbmZvKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGhhc2hfZW50cnlfc2l6ZSA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplOwotICAgICAgcy0+X3Jhd19zaXplID0gKCgyICsgYnVja2V0Y291bnQgKyBkeW5zeW1jb3VudCkgKiBoYXNoX2VudHJ5X3NpemUpOwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLQotICAgICAgYmZkX3B1dCAoOCAqIGhhc2hfZW50cnlfc2l6ZSwgb3V0cHV0X2JmZCwgYnVja2V0Y291bnQsIHMtPmNvbnRlbnRzKTsKLSAgICAgIGJmZF9wdXQgKDggKiBoYXNoX2VudHJ5X3NpemUsIG91dHB1dF9iZmQsIGR5bnN5bWNvdW50LCAKLQkgICAgICAgcy0+Y29udGVudHMgKyBoYXNoX2VudHJ5X3NpemUpOwotCi0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmJ1Y2tldGNvdW50ID0gYnVja2V0Y291bnQ7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN0ciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKTsKLQotICAgICAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9OVUxMLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRml4IHVwIHRoZSBmbGFncyBmb3IgYSBzeW1ib2wuICBUaGlzIGhhbmRsZXMgdmFyaW91cyBjYXNlcyB3aGljaAotICAgY2FuIG9ubHkgYmUgZml4ZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBhcmUgc2Vlbi4gIFRoaXMgaXMKLSAgIGN1cnJlbnRseSBjYWxsZWQgYnkgYm90aCBhZGp1c3RfZHluYW1pY19zeW1ib2wgYW5kCi0gICBhc3NpZ25fc3ltX3ZlcnNpb24sIHdoaWNoIGlzIHVubmVjZXNzYXJ5IGJ1dCBwZXJoYXBzIG1vcmUgcm9idXN0IGluCi0gICB0aGUgZmFjZSBvZiBmdXR1cmUgY2hhbmdlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZml4X3N5bWJvbF9mbGFncyAoaCwgZWlmKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqZWlmOwotewotICAvKiBJZiB0aGlzIHN5bWJvbCB3YXMgbWVudGlvbmVkIGluIGEgbm9uLUVMRiBmaWxlLCB0cnkgdG8gc2V0Ci0gICAgIERFRl9SRUdVTEFSIGFuZCBSRUZfUkVHVUxBUiBjb3JyZWN0bHkuICBUaGlzIGlzIHRoZSBvbmx5IHdheSB0bwotICAgICBwZXJtaXQgYSBub24tRUxGIGZpbGUgdG8gY29ycmVjdGx5IHJlZmVyIHRvIGEgc3ltYm9sIGRlZmluZWQgaW4KLSAgICAgYW4gRUxGIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfTk9OX0VMRikgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQloLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpKQotCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkJICAgICAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKTsKLQkgIGVsc2UKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotCX0KLQotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEKLQkgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApKQotCXsKLQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChlaWYtPmluZm8sIGgpKQotCSAgICB7Ci0JICAgICAgZWlmLT5mYWlsZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBVbmZvcnR1bmF0ZWx5LCBFTEZfTElOS19OT05fRUxGIGlzIG9ubHkgY29ycmVjdCBpZiB0aGUgc3ltYm9sCi0gICAgICAgICB3YXMgZmlyc3Qgc2VlbiBpbiBhIG5vbi1FTEYgZmlsZS4gIEZvcnR1bmF0ZWx5LCBpZiB0aGUgc3ltYm9sCi0gICAgICAgICB3YXMgZmlyc3Qgc2VlbiBpbiBhbiBFTEYgZmlsZSwgd2UncmUgcHJvYmFibHkgT0sgdW5sZXNzIHRoZQotICAgICAgICAgc3ltYm9sIHdhcyBkZWZpbmVkIGluIGEgbm9uLUVMRiBmaWxlLiAgQ2F0Y2ggdGhhdCBjYXNlIGhlcmUuCi0gICAgICAgICBGSVhNRTogV2UncmUgc3RpbGwgaW4gdHJvdWJsZSBpZiB0aGUgc3ltYm9sIHdhcyBmaXJzdCBzZWVuIGluCi0gICAgICAgICBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgdGhlbiBsYXRlciBpbiBhIG5vbi1FTEYgcmVndWxhciBvYmplY3QuICAqLwotICAgICAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotCSAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIgIT0gTlVMTAotCSAgICAgID8gKGJmZF9nZXRfZmxhdm91ciAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcikKLQkJICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgICAgOiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pCi0JCSAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMCkpKQotCWgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIGFuZCB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGFzIGEgY29tbW9uCi0gICAgIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIGFuZCB0aGVyZSB3YXMgbm8gZGVmaW5pdGlvbiBpbgotICAgICBhbnkgZHluYW1pYyBvYmplY3QsIHRoZW4gdGhlIGxpbmtlciB3aWxsIGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvcgotICAgICB0aGUgc3ltYm9sIGluIGEgY29tbW9uIHNlY3Rpb24gYnV0IHRoZSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSCi0gICAgIGZsYWcgd2lsbCBub3QgaGF2ZSBiZWVuIHNldC4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQotICAvKiBJZiAtQnN5bWJvbGljIHdhcyB1c2VkICh3aGljaCBtZWFucyB0byBiaW5kIHJlZmVyZW5jZXMgdG8gZ2xvYmFsCi0gICAgIHN5bWJvbHMgdG8gdGhlIGRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgb2JqZWN0KSwgYW5kIHRoaXMKLSAgICAgc3ltYm9sIHdhcyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QsIHRoZW4gaXQgYWN0dWFsbHkgZG9lc24ndAotICAgICBuZWVkIGEgUExUIGVudHJ5LiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDAKLSAgICAgICYmIGVpZi0+aW5mby0+c2hhcmVkCi0gICAgICAmJiBlaWYtPmluZm8tPnN5bWJvbGljCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCi0gICAgewotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0gICAgICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBkZWZpbmVkIHN5bWJvbCBpbiBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2Uga25vdwotICAgICB0aGUgcmVhbCBkZWZpbml0aW9uIGluIHRoZSBkeW5hbWljIG9iamVjdCwgY29weSBpbnRlcmVzdGluZyBmbGFncwotICAgICBvdmVyIHRvIHRoZSByZWFsIGRlZmluaXRpb24uICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICp3ZWFrZGVmOwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICB3ZWFrZGVmID0gaC0+d2Vha2RlZjsKLSAgICAgIEJGRF9BU1NFUlQgKHdlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCB3ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIEJGRF9BU1NFUlQgKHdlYWtkZWYtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKTsKLQotICAgICAgLyogSWYgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QgZmlsZSwKLQkgZG9uJ3QgZG8gYW55dGhpbmcgc3BlY2lhbC4gIFNlZSB0aGUgbG9uZ2VyIGRlc2NyaXB0aW9uIGluCi0JIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wsIGJlbG93LiAgKi8KLSAgICAgIGlmICgod2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCi0JaC0+d2Vha2RlZiA9IE5VTEw7Ci0gICAgICBlbHNlCi0Jd2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PQotCSAgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkgICAmIChFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JICAgICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUsKLQkgICAgICB8IEVMRl9MSU5LX05PTl9HT1RfUkVGKSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIHRoZSBiYWNrZW5kIHBpY2sgYSBnb29kIHZhbHVlIGZvciBhIGR5bmFtaWMgc3ltYm9sLiAgVGhpcyBpcwotICAgY2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLCBhbmQgYWxzbyBjYWxscyBpdHNlbGYKLSAgIHJlY3Vyc2l2ZWx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqZWlmID0gKHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKikgZGF0YTsKLSAgYmZkICpkeW5vYmo7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0KLSAgLyogSWdub3JlIGluZGlyZWN0IHN5bWJvbHMuICBUaGVzZSBhcmUgYWRkZWQgYnkgdGhlIHZlcnNpb25pbmcgY29kZS4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaXggdGhlIHN5bWJvbCBmbGFncy4gICovCi0gIGlmICghIGVsZl9maXhfc3ltYm9sX2ZsYWdzIChoLCBlaWYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBkb2VzIG5vdCByZXF1aXJlIGEgUExUIGVudHJ5LCBhbmQgaXQgaXMgbm90Ci0gICAgIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgb3IgaXMgbm90IHJlZmVyZW5jZWQgYnkgYSByZWd1bGFyCi0gICAgIG9iamVjdCwgaWdub3JlIGl0LiAgV2UgZG8gaGF2ZSB0byBoYW5kbGUgYSB3ZWFrIGRlZmluZWQgc3ltYm9sLAotICAgICBldmVuIGlmIG5vIHJlZ3VsYXIgb2JqZWN0IHJlZmVycyB0byBpdCwgaWYgd2UgZGVjaWRlZCB0byBhZGQgaXQKLSAgICAgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgRklYTUU6IERvIHdlIG5vcm1hbGx5IG5lZWQgdG8gd29ycnkKLSAgICAgYWJvdXQgc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZCBieSBvbmUgZHluYW1pYyBvYmplY3QgYW5kCi0gICAgIHJlZmVyZW5jZWQgYnkgYW5vdGhlciBvbmU/ICAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgPT0gMAotICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMAotCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCi0JICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwCi0JICAgICAgJiYgKGgtPndlYWtkZWYgPT0gTlVMTCB8fCBoLT53ZWFrZGVmLT5keW5pbmR4ID09IC0xKSkpKQotICAgIHsKLSAgICAgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgd2UndmUgYWxyZWFkeSBhZGp1c3RlZCB0aGlzIHN5bWJvbCwgZG9uJ3QgZG8gaXQgYWdhaW4uICBUaGlzCi0gICAgIGNhbiBoYXBwZW4gdmlhIGEgcmVjdXJzaXZlIGNhbGwuICAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RZTkFNSUNfQURKVVNURUQpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRG9uJ3QgbG9vayBhdCB0aGlzIHN5bWJvbCBhZ2Fpbi4gIE5vdGUgdGhhdCB3ZSBtdXN0IHNldCB0aGlzCi0gICAgIGFmdGVyIGNoZWNraW5nIHRoZSBhYm92ZSBjb25kaXRpb25zLCBiZWNhdXNlIHdlIG1heSBsb29rIGF0IGEKLSAgICAgc3ltYm9sIG9uY2UsIGRlY2lkZSBub3QgdG8gZG8gYW55dGhpbmcsIGFuZCB0aGVuIGdldCBjYWxsZWQKLSAgICAgcmVjdXJzaXZlbHkgbGF0ZXIgYWZ0ZXIgUkVGX1JFR1VMQVIgaXMgc2V0IGJlbG93LiAgKi8KLSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RZTkFNSUNfQURKVVNURUQ7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgZGVmaW5pdGlvbiwgYW5kIHdlIGtub3cgYSByZWFsIGRlZmluaXRpb24sIGFuZAotICAgICB0aGUgcmVhbCBzeW1ib2wgaXMgbm90IGl0c2VsZiBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QgZmlsZSwKLSAgICAgdGhlbiBnZXQgYSBnb29kIHZhbHVlIGZvciB0aGUgcmVhbCBkZWZpbml0aW9uLiAgV2UgaGFuZGxlIHRoZQotICAgICByZWFsIHN5bWJvbCBmaXJzdCwgZm9yIHRoZSBjb252ZW5pZW5jZSBvZiB0aGUgYmFja2VuZCByb3V0aW5lLgotCi0gICAgIE5vdGUgdGhhdCB0aGVyZSBpcyBhIGNvbmZ1c2luZyBjYXNlIGhlcmUuICBJZiB0aGUgcmVhbCBkZWZpbml0aW9uCi0gICAgIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdCBmaWxlLCB3ZSBkb24ndCBnZXQgdGhlIHJlYWwgc3ltYm9sCi0gICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UgZG8gZ2V0IHRoZSB3ZWFrIHN5bWJvbC4gIElmIHRoZQotICAgICBwcm9jZXNzb3IgYmFja2VuZCB1c2VzIGEgQ09QWSByZWxvYywgdGhlbiBpZiBzb21lIHJvdXRpbmUgaW4gdGhlCi0gICAgIGR5bmFtaWMgb2JqZWN0IGNoYW5nZXMgdGhlIHJlYWwgc3ltYm9sLCB3ZSB3aWxsIG5vdCBzZWUgdGhhdAotICAgICBjaGFuZ2UgaW4gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBzeW1ib2wuICBUaGlzIGlzIHRoZSB3YXkgb3RoZXIKLSAgICAgRUxGIGxpbmtlcnMgd29yayBhcyB3ZWxsLCBhbmQgc2VlbXMgdG8gYmUgYSByZXN1bHQgb2YgdGhlIHNoYXJlZAotICAgICBsaWJyYXJ5IG1vZGVsLgotCi0gICAgIEkgd2lsbCBjbGFyaWZ5IHRoaXMgaXNzdWUuICBNb3N0IFNWUjQgc2hhcmVkIGxpYnJhcmllcyBkZWZpbmUgdGhlCi0gICAgIHZhcmlhYmxlIF90aW1lem9uZSBhbmQgZGVmaW5lIHRpbWV6b25lIGFzIGEgd2VhayBzeW5vbnltLiAgVGhlCi0gICAgIHR6c2V0IGNhbGwgY2hhbmdlcyBfdGltZXpvbmUuICBJZiB5b3Ugd3JpdGUKLSAgICAgICBleHRlcm4gaW50IHRpbWV6b25lOwotICAgICAgIGludCBfdGltZXpvbmUgPSA1OwotICAgICAgIGludCBtYWluICgpIHsgdHpzZXQgKCk7IHByaW50ZiAoIiVkICVkXG4iLCB0aW1lem9uZSwgX3RpbWV6b25lKTsgfQotICAgICB5b3UgbWlnaHQgZXhwZWN0IHRoYXQsIHNpbmNlIHRpbWV6b25lIGlzIGEgc3lub255bSBmb3IgX3RpbWV6b25lLAotICAgICB0aGUgc2FtZSBudW1iZXIgd2lsbCBwcmludCBib3RoIHRpbWVzLiAgSG93ZXZlciwgaWYgdGhlIHByb2Nlc3NvcgotICAgICBiYWNrZW5kIHVzZXMgYSBDT1BZIHJlbG9jLCB0aGVuIGFjdHVhbGx5IHRpbWV6b25lIHdpbGwgYmUgY29waWVkCi0gICAgIGludG8geW91ciBwcm9jZXNzIGltYWdlLCBhbmQsIHNpbmNlIHlvdSBkZWZpbmUgX3RpbWV6b25lCi0gICAgIHlvdXJzZWxmLCBfdGltZXpvbmUgd2lsbCBub3QuICBUaHVzIHRpbWV6b25lIGFuZCBfdGltZXpvbmUgd2lsbAotICAgICB3aW5kIHVwIGF0IGRpZmZlcmVudCBtZW1vcnkgbG9jYXRpb25zLiAgVGhlIHR6c2V0IGNhbGwgd2lsbCBzZXQKLSAgICAgX3RpbWV6b25lLCBsZWF2aW5nIHRpbWV6b25lIHVuY2hhbmdlZC4gICovCi0KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBnZXQgdG8gdGhpcyBwb2ludCwgd2Uga25vdyB0aGVyZSBpcyBhbiBpbXBsaWNpdAotCSByZWZlcmVuY2UgYnkgYSByZWd1bGFyIG9iamVjdCBmaWxlIHZpYSB0aGUgd2VhayBzeW1ib2wgSC4KLQkgRklYTUU6IElzIHRoaXMgcmVhbGx5IHRydWU/ICBXaGF0IGlmIHRoZSB0cmF2ZXJzYWwgZmluZHMKLQkgSC0+V0VBS0RFRiBiZWZvcmUgaXQgZmluZHMgSD8gICovCi0gICAgICBoLT53ZWFrZGVmLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVI7Ci0KLSAgICAgIGlmICghIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGgtPndlYWtkZWYsIChQVFIpIGVpZikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiBhIHN5bWJvbCBoYXMgbm8gdHlwZSBhbmQgbm8gc2l6ZSBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIFBMVAotICAgICBlbnRyeSwgdGhlbiB3ZSBhcmUgcHJvYmFibHkgYWJvdXQgdG8gZG8gdGhlIHdyb25nIHRoaW5nIGhlcmU6IHdlCi0gICAgIGFyZSBwcm9iYWJseSBnb2luZyB0byBjcmVhdGUgYSBDT1BZIHJlbG9jIGZvciBhbiBlbXB0eSBvYmplY3QuCi0gICAgIFRoaXMgY2FzZSBjYW4gYXJpc2Ugd2hlbiBhIHNoYXJlZCBvYmplY3QgaXMgYnVpbHQgd2l0aCBhc3NlbWJseQotICAgICBjb2RlLCBhbmQgdGhlIGFzc2VtYmx5IGNvZGUgZmFpbHMgdG8gc2V0IHRoZSBzeW1ib2wgdHlwZS4gICovCi0gIGlmIChoLT5zaXplID09IDAKLSAgICAgICYmIGgtPnR5cGUgPT0gU1RUX05PVFlQRQotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgPT0gMCkKLSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgIChfKCJ3YXJuaW5nOiB0eXBlIGFuZCBzaXplIG9mIGR5bmFtaWMgc3ltYm9sIGAlcycgYXJlIG5vdCBkZWZpbmVkIiksCi0JIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChlaWYtPmluZm8pLT5keW5vYmo7Ci0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChkeW5vYmopOwotICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKSAoZWlmLT5pbmZvLCBoKSkKLSAgICB7Ci0gICAgICBlaWYtPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gZXhwb3J0IGFsbCBkZWZpbmVkIHN5bWJvbHMgaW50byB0aGUgZHluYW1pYwotICAgc3ltYm9sIHRhYmxlLiAgSXQgaXMgY2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9leHBvcnRfc3ltYm9sIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKmVpZiA9IChzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkICopIGRhdGE7Ci0KLSAgLyogSWdub3JlIGluZGlyZWN0IHN5bWJvbHMuICBUaGVzZSBhcmUgYWRkZWQgYnkgdGhlIHZlcnNpb25pbmcgY29kZS4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+ZHluaW5keCA9PSAtMQotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkgICYgKEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoZWlmLT5pbmZvLCBoKSkKLQl7Ci0JICBlaWYtPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZCBpbiBvdGhlciBzaGFyZWQKLSAgIGxpYnJhcmllcyBhbmQgcmVmZXJlbmNlZCBoZXJlLiAgVXBkYXRlIHRoZSBsaXN0IG9mIHZlcnNpb24KLSAgIGRlcGVuZGVuY2llcy4gIFRoaXMgd2lsbCBiZSBwdXQgaW50byB0aGUgLmdudS52ZXJzaW9uX3Igc2VjdGlvbi4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZl9maW5kX3ZlcmRlcF9pbmZvICpyaW5mbyA9IChzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8gKikgZGF0YTsKLSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnQ7Ci0gIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOwotCi0gIC8qIFdlIG9ubHkgY2FyZSBhYm91dCBzeW1ib2xzIGRlZmluZWQgaW4gc2hhcmVkIG9iamVjdHMgd2l0aCB2ZXJzaW9uCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwCi0gICAgICB8fCBoLT5keW5pbmR4ID09IC0xCi0gICAgICB8fCBoLT52ZXJpbmZvLnZlcmRlZiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlZSBpZiB3ZSBhbHJlYWR5IGtub3cgYWJvdXQgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgZm9yICh0ID0gZWxmX3RkYXRhIChyaW5mby0+b3V0cHV0X2JmZCktPnZlcnJlZjsgdCAhPSBOVUxMOyB0ID0gdC0+dm5fbmV4dHJlZikKLSAgICB7Ci0gICAgICBpZiAodC0+dm5fYmZkICE9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9iZmQpCi0JY29udGludWU7Ci0KLSAgICAgIGZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JaWYgKGEtPnZuYV9ub2RlbmFtZSA9PSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfbm9kZW5hbWUpCi0JICByZXR1cm4gdHJ1ZTsKLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSBuZXcgdmVyc2lvbi4gIEFkZCBpdCB0byB0cmVlIHdlIGFyZSBidWlsZGluZy4gICovCi0KLSAgaWYgKHQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB0ID0gKEVsZl9JbnRlcm5hbF9WZXJuZWVkICopIGJmZF96YWxsb2MgKHJpbmZvLT5vdXRwdXRfYmZkLCBzaXplb2YgKnQpOwotICAgICAgaWYgKHQgPT0gTlVMTCkKLQl7Ci0JICByaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHQtPnZuX2JmZCA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9iZmQ7Ci0gICAgICB0LT52bl9uZXh0cmVmID0gZWxmX3RkYXRhIChyaW5mby0+b3V0cHV0X2JmZCktPnZlcnJlZjsKLSAgICAgIGVsZl90ZGF0YSAocmluZm8tPm91dHB1dF9iZmQpLT52ZXJyZWYgPSB0OwotICAgIH0KLQotICBhID0gKEVsZl9JbnRlcm5hbF9WZXJuYXV4ICopIGJmZF96YWxsb2MgKHJpbmZvLT5vdXRwdXRfYmZkLCBzaXplb2YgKmEpOwotCi0gIC8qIE5vdGUgdGhhdCB3ZSBhcmUgY29weWluZyBhIHN0cmluZyBwb2ludGVyIGhlcmUsIGFuZCB0ZXN0aW5nIGl0Ci0gICAgIGFib3ZlLiAgSWYgYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiBpcyBldmVyIGNoYW5nZWQgdG8KLSAgICAgZGlzY2FyZCB0aGUgc3RyaW5nIGRhdGEgd2hlbiBsb3cgaW4gbWVtb3J5LCB0aGlzIHdpbGwgaGF2ZSB0byBiZQotICAgICBmaXhlZC4gICovCi0gIGEtPnZuYV9ub2RlbmFtZSA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9ub2RlbmFtZTsKLQotICBhLT52bmFfZmxhZ3MgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfZmxhZ3M7Ci0gIGEtPnZuYV9uZXh0cHRyID0gdC0+dm5fYXV4cHRyOwotCi0gIGgtPnZlcmluZm8udmVyZGVmLT52ZF9leHBfcmVmbm8gPSByaW5mby0+dmVyczsKLSAgKytyaW5mby0+dmVyczsKLQotICBhLT52bmFfb3RoZXIgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfZXhwX3JlZm5vICsgMTsKLQotICB0LT52bl9hdXhwdHIgPSBhOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaWd1cmUgb3V0IGFwcHJvcHJpYXRlIHZlcnNpb25zIGZvciBhbGwgdGhlIHN5bWJvbHMuICBXZSBtYXkgbm90Ci0gICBoYXZlIHRoZSB2ZXJzaW9uIG51bWJlciBzY3JpcHQgdW50aWwgd2UgaGF2ZSByZWFkIGFsbCBvZiB0aGUgaW5wdXQKLSAgIGZpbGVzLCBzbyB1bnRpbCB0aGF0IHBvaW50IHdlIGRvbid0IGtub3cgd2hpY2ggc3ltYm9scyBzaG91bGQgYmUKLSAgIGxvY2FsLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8gKnNpbmZvID0KLSAgICAoc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyAqKSBkYXRhOwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IHNpbmZvLT5pbmZvOwotICBzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkIGVpZjsKLSAgY2hhciAqcDsKLQotICAvKiBGaXggdGhlIHN5bWJvbCBmbGFncy4gICovCi0gIGVpZi5mYWlsZWQgPSBmYWxzZTsKLSAgZWlmLmluZm8gPSBpbmZvOwotICBpZiAoISBlbGZfZml4X3N5bWJvbF9mbGFncyAoaCwgJmVpZikpCi0gICAgewotICAgICAgaWYgKGVpZi5mYWlsZWQpCi0Jc2luZm8tPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlIG9ubHkgbmVlZCB2ZXJzaW9uIG51bWJlcnMgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiByZWd1bGFyCi0gICAgIG9iamVjdHMuICAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHAgPSBzdHJjaHIgKGgtPnJvb3Qucm9vdC5zdHJpbmcsIEVMRl9WRVJfQ0hSKTsKLSAgaWYgKHAgIT0gTlVMTCAmJiBoLT52ZXJpbmZvLnZlcnRyZWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7Ci0gICAgICBib29sZWFuIGhpZGRlbjsKLQotICAgICAgaGlkZGVuID0gdHJ1ZTsKLQotICAgICAgLyogVGhlcmUgYXJlIHR3byBjb25zZWN1dGl2ZSBFTEZfVkVSX0NIUiBjaGFyYWN0ZXJzIGlmIHRoaXMgaXMKLSAgICAgICAgIG5vdCBhIGhpZGRlbiBzeW1ib2wuICAqLwotICAgICAgKytwOwotICAgICAgaWYgKCpwID09IEVMRl9WRVJfQ0hSKQotCXsKLQkgIGhpZGRlbiA9IGZhbHNlOwotCSAgKytwOwotCX0KLQotICAgICAgLyogSWYgdGhlcmUgaXMgbm8gdmVyc2lvbiBzdHJpbmcsIHdlIGNhbiBqdXN0IHJldHVybiBvdXQuICAqLwotICAgICAgaWYgKCpwID09ICdcMCcpCi0JewotCSAgaWYgKGhpZGRlbikKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19ISURERU47Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgZm9yIHRoZSB2ZXJzaW9uLiAgSWYgd2UgZmluZCBpdCwgaXQgaXMgbm8gbG9uZ2VyIHdlYWsuICAqLwotICAgICAgZm9yICh0ID0gc2luZm8tPnZlcmRlZnM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JewotCSAgaWYgKHN0cmNtcCAodC0+bmFtZSwgcCkgPT0gMCkKLQkgICAgewotCSAgICAgIGludCBsZW47Ci0JICAgICAgY2hhciAqYWxjOwotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZDsKLQotCSAgICAgIGxlbiA9IHAgLSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIGFsYyA9IGJmZF9hbGxvYyAoc2luZm8tPm91dHB1dF9iZmQsIGxlbik7Ci0JICAgICAgaWYgKGFsYyA9PSBOVUxMKQotCSAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAgIHN0cm5jcHkgKGFsYywgaC0+cm9vdC5yb290LnN0cmluZywgbGVuIC0gMSk7Ci0JICAgICAgYWxjW2xlbiAtIDFdID0gJ1wwJzsKLQkgICAgICBpZiAoYWxjW2xlbiAtIDJdID09IEVMRl9WRVJfQ0hSKQotCSAgICAgICAgYWxjW2xlbiAtIDJdID0gJ1wwJzsKLQotCSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IHQ7Ci0JICAgICAgdC0+dXNlZCA9IHRydWU7Ci0JICAgICAgZCA9IE5VTEw7Ci0KLQkgICAgICBpZiAodC0+Z2xvYmFscyAhPSBOVUxMKQotCQl7Ci0JCSAgZm9yIChkID0gdC0+Z2xvYmFsczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLQkJICAgIGlmICgoKmQtPm1hdGNoKSAoZCwgYWxjKSkKLQkJICAgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIFNlZSBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBmb3JjZSB0aGlzIHN5bWJvbCB0bwotICAgICAgICAgICAgICAgICBsb2NhbCBzY29wZS4gICovCi0JICAgICAgaWYgKGQgPT0gTlVMTCAmJiB0LT5sb2NhbHMgIT0gTlVMTCkKLQkJewotCQkgIGZvciAoZCA9IHQtPmxvY2FsczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCgqZC0+bWF0Y2gpIChkLCBhbGMpKQotCQkJewotCQkJICBpZiAoaC0+ZHluaW5keCAhPSAtMQotCQkJICAgICAgJiYgaW5mby0+c2hhcmVkCi0JCQkgICAgICAmJiAhIHNpbmZvLT5leHBvcnRfZHluYW1pYykKLQkJCSAgICB7Ci0JCQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0ZPUkNFRF9MT0NBTDsKLQkJCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+Ci0JCQkJRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JCQkgICAgICBoLT5keW5pbmR4ID0gLTE7Ci0JCQkgICAgICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCQkJICAgICAgLyogRklYTUU6IFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaGFzCi0JCQkJIGFscmVhZHkgYmVlbiByZWNvcmRlZCBpbiB0aGUgZHluYW1pYwotCQkJCSBzdHJpbmcgdGFibGUgc2VjdGlvbi4gICovCi0JCQkgICAgfQotCi0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfcmVsZWFzZSAoc2luZm8tPm91dHB1dF9iZmQsIGFsYyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBidWlsZGluZyBhbiBhcHBsaWNhdGlvbiwgd2UgbmVlZCB0byBjcmVhdGUgYQotICAgICAgICAgdmVyc2lvbiBub2RlIGZvciB0aGlzIHZlcnNpb24uICAqLwotICAgICAgaWYgKHQgPT0gTlVMTCAmJiAhIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKipwcDsKLQkgIGludCB2ZXJzaW9uX2luZGV4OwotCi0JICAvKiBJZiB3ZSBhcmVuJ3QgZ29pbmcgdG8gZXhwb3J0IHRoaXMgc3ltYm9sLCB3ZSBkb24ndCBuZWVkCi0gICAgICAgICAgICAgdG8gd29ycnkgYWJvdXQgaXQuICovCi0JICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgcmV0dXJuIHRydWU7Ci0KLQkgIHQgPSAoKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKQotCSAgICAgICBiZmRfYWxsb2MgKHNpbmZvLT5vdXRwdXRfYmZkLCBzaXplb2YgKnQpKTsKLQkgIGlmICh0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgdC0+bmV4dCA9IE5VTEw7Ci0JICB0LT5uYW1lID0gcDsKLQkgIHQtPmdsb2JhbHMgPSBOVUxMOwotCSAgdC0+bG9jYWxzID0gTlVMTDsKLQkgIHQtPmRlcHMgPSBOVUxMOwotCSAgdC0+bmFtZV9pbmR4ID0gKHVuc2lnbmVkIGludCkgLTE7Ci0JICB0LT51c2VkID0gdHJ1ZTsKLQotCSAgdmVyc2lvbl9pbmRleCA9IDE7Ci0JICBmb3IgKHBwID0gJnNpbmZvLT52ZXJkZWZzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JICAgICsrdmVyc2lvbl9pbmRleDsKLQkgIHQtPnZlcm51bSA9IHZlcnNpb25faW5kZXg7Ci0KLQkgICpwcCA9IHQ7Ci0KLQkgIGgtPnZlcmluZm8udmVydHJlZSA9IHQ7Ci0JfQotICAgICAgZWxzZSBpZiAodCA9PSBOVUxMKQotCXsKLQkgIC8qIFdlIGNvdWxkIG5vdCBmaW5kIHRoZSB2ZXJzaW9uIGZvciBhIHN5bWJvbCB3aGVuCi0gICAgICAgICAgICAgZ2VuZXJhdGluZyBhIHNoYXJlZCBhcmNoaXZlLiAgUmV0dXJuIGFuIGVycm9yLiAgKi8KLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHVuZGVmaW5lZCB2ZXJzaW9uZWQgc3ltYm9sIG5hbWUgJXMiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHNpbmZvLT5vdXRwdXRfYmZkKSwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHNpbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGhpZGRlbikKLQloLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hJRERFTjsKLSAgICB9Ci0KLSAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIHZlcnNpb24gZm9yIHRoaXMgc3ltYm9sLCBzZWUgaWYgd2UgY2FuIGZpbmQKLSAgICAgc29tZXRoaW5nLiAgKi8KLSAgaWYgKGgtPnZlcmluZm8udmVydHJlZSA9PSBOVUxMICYmIHNpbmZvLT52ZXJkZWZzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp0OwotICAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpkZWZsdDsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZDsKLQotICAgICAgLyogU2VlIGlmIGNhbiBmaW5kIHdoYXQgdmVyc2lvbiB0aGlzIHN5bWJvbCBpcyBpbi4gIElmIHRoZQotICAgICAgICAgc3ltYm9sIGlzIHN1cHBvc2VkIHRvIGJlIGxvY2FsLCB0aGVuIGRvbid0IGFjdHVhbGx5IHJlZ2lzdGVyCi0gICAgICAgICBpdC4gICovCi0gICAgICBkZWZsdCA9IE5VTEw7Ci0gICAgICBmb3IgKHQgPSBzaW5mby0+dmVyZGVmczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQl7Ci0JICBpZiAodC0+Z2xvYmFscyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm9yIChkID0gdC0+Z2xvYmFsczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLQkJewotCQkgIGlmICgoKmQtPm1hdGNoKSAoZCwgaC0+cm9vdC5yb290LnN0cmluZykpCi0JCSAgICB7Ci0JCSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IHQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoZCAhPSBOVUxMKQotCQlicmVhazsKLQkgICAgfQotCi0JICBpZiAodC0+bG9jYWxzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBmb3IgKGQgPSB0LT5sb2NhbHM7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0JCXsKLQkJICBpZiAoZC0+cGF0dGVyblswXSA9PSAnKicgJiYgZC0+cGF0dGVyblsxXSA9PSAnXDAnKQotCQkgICAgZGVmbHQgPSB0OwotCQkgIGVsc2UgaWYgKCgqZC0+bWF0Y2gpIChkLCBoLT5yb290LnJvb3Quc3RyaW5nKSkKLQkJICAgIHsKLQkJICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKLQkJICAgICAgaWYgKGgtPmR5bmluZHggIT0gLTEKLQkJCSAgJiYgaW5mby0+c2hhcmVkCi0JCQkgICYmICEgc2luZm8tPmV4cG9ydF9keW5hbWljKQotCQkJewotCQkJICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0ZPUkNFRF9MT0NBTDsKLQkJCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JCQkgIGgtPmR5bmluZHggPSAtMTsKLQkJCSAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkJCSAgLyogRklYTUU6IFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaGFzIGFscmVhZHkKLQkJCSAgICAgYmVlbiByZWNvcmRlZCBpbiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGUKLQkJCSAgICAgc2VjdGlvbi4gICovCi0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoZCAhPSBOVUxMKQotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGRlZmx0ICE9IE5VTEwgJiYgaC0+dmVyaW5mby52ZXJ0cmVlID09IE5VTEwpCi0JewotCSAgaC0+dmVyaW5mby52ZXJ0cmVlID0gZGVmbHQ7Ci0JICBpZiAoaC0+ZHluaW5keCAhPSAtMQotCSAgICAgICYmIGluZm8tPnNoYXJlZAotCSAgICAgICYmICEgc2luZm8tPmV4cG9ydF9keW5hbWljKQotCSAgICB7Ci0JICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19GT1JDRURfTE9DQUw7Ci0JICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICAgICAgaC0+ZHluaW5keCA9IC0xOwotCSAgICAgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JICAgICAgLyogRklYTUU6IFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaGFzIGFscmVhZHkgYmVlbgotCQkgcmVjb3JkZWQgaW4gdGhlIGR5bmFtaWMgc3RyaW5nIHRhYmxlIHNlY3Rpb24uICAqLwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEZpbmFsIHBoYXNlIG9mIEVMRiBsaW5rZXIuICAqLwotCi0vKiBBIHN0cnVjdHVyZSB3ZSB1c2UgdG8gYXZvaWQgcGFzc2luZyBsYXJnZSBudW1iZXJzIG9mIGFyZ3VtZW50cy4gICovCi0KLXN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvCi17Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBTeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3ltc3RydGFiOwotICAvKiAuZHluc3ltIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqZHluc3ltX3NlYzsKLSAgLyogLmhhc2ggc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpoYXNoX3NlYzsKLSAgLyogc3ltYm9sIHZlcnNpb24gc2VjdGlvbiAoLmdudS52ZXJzaW9uKS4gICovCi0gIGFzZWN0aW9uICpzeW12ZXJfc2VjOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgY29udGVudHMgb2YgYW55IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCByZWxvY3Mgb2YgYW55IHNlY3Rpb24uICAqLwotICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgaW50ZXJuYWwgcmVsb2NzIG9mIGFueSBzZWN0aW9uLiAgKi8KLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIGxvY2FsIHN5bWJvbHMgb2YgYW55IGlucHV0Ci0gICAgIEJGRC4gICovCi0gIEVsZl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBpbnRlcm5hbCBsb2NhbCBzeW1ib2xzIG9mIGFueSBpbnB1dAotICAgICBCRkQuICAqLwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zOwotICAvKiBBcnJheSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIHN5bWJvbCBpbmRleCBmb3IgZWFjaCBsb2NhbCBzeW1ib2wKLSAgICAgb2YgYW55IGlucHV0IEJGRC4gICovCi0gIGxvbmcgKmluZGljZXM7Ci0gIC8qIEFycmF5IGxhcmdlIGVub3VnaCB0byBob2xkIGEgc2VjdGlvbiBwb2ludGVyIGZvciBlYWNoIGxvY2FsCi0gICAgIHN5bWJvbCBvZiBhbnkgaW5wdXQgQkZELiAgKi8KLSAgYXNlY3Rpb24gKipzZWN0aW9uczsKLSAgLyogQnVmZmVyIHRvIGhvbGQgc3dhcHBlZCBvdXQgc3ltYm9scy4gICovCi0gIEVsZl9FeHRlcm5hbF9TeW0gKnN5bWJ1ZjsKLSAgLyogTnVtYmVyIG9mIHN3YXBwZWQgb3V0IHN5bWJvbHMgaW4gYnVmZmVyLiAgKi8KLSAgc2l6ZV90IHN5bWJ1Zl9jb3VudDsKLSAgLyogTnVtYmVyIG9mIHN5bWJvbHMgd2hpY2ggZml0IGluIHN5bWJ1Zi4gICovCi0gIHNpemVfdCBzeW1idWZfc2l6ZTsKLX07Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX291dHB1dF9zeW0KLSAgUEFSQU1TICgoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAotCSAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfb3V0cHV0X2V4dHN5bQotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX2lucHV0X2JmZAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIGVsZl9saW5rX291dHB1dF9leHRzeW0uICAqLwotCi1zdHJ1Y3QgZWxmX291dGV4dF9pbmZvCi17Ci0gIGJvb2xlYW4gZmFpbGVkOwotICBib29sZWFuIGxvY2Fsc3ltczsKLSAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotfTsKLQotLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiwgYW5kIGFsbG9jYXRlIHNwYWNlIGZvciwgUkVMX0hEUiB3aGljaCBpcyB0aGUKLSAgIHNlY3Rpb24gaGVhZGVyIGZvciBhIHNlY3Rpb24gY29udGFpbmluZyByZWxvY2F0aW9ucyBmb3IgTy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19zaXplX3JlbG9jX3NlY3Rpb24gKGFiZmQsIHJlbF9oZHIsIG8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gICAgIGFzZWN0aW9uICpvOwotewotICByZWdpc3RlciBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnAsICoqcGVuZDsKLSAgdW5zaWduZWQgcmVsb2NfY291bnQ7Ci0KLSAgLyogRmlndXJlIG91dCBob3cgbWFueSByZWxvY2F0aW9ucyB0aGVyZSB3aWxsIGJlLiAgKi8KLSAgaWYgKHJlbF9oZHIgPT0gJmVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyKQotICAgIHJlbG9jX2NvdW50ID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9jb3VudDsKLSAgZWxzZQotICAgIHJlbG9jX2NvdW50ID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9jb3VudDI7Ci0KLSAgLyogVGhhdCBhbGxvd3MgdXMgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgcmVsX2hkci0+c2hfc2l6ZSA9IHJlbF9oZHItPnNoX2VudHNpemUgKiByZWxvY19jb3VudDsKLQotICAvKiBUaGUgY29udGVudHMgZmllbGQgbXVzdCBsYXN0IGludG8gd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCBzbyB3ZQotICAgICBhbGxvY2F0ZSBpdCB3aXRoIGJmZF9hbGxvYyByYXRoZXIgdGhhbiBtYWxsb2MuICAqLwotICByZWxfaGRyLT5jb250ZW50cyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsX2hkci0+c2hfc2l6ZSk7Ci0gIGlmIChyZWxfaGRyLT5jb250ZW50cyA9PSBOVUxMICYmIHJlbF9oZHItPnNoX3NpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICAvKiBXZSBvbmx5IGFsbG9jYXRlIG9uZSBzZXQgb2YgaGFzaCBlbnRyaWVzLCBzbyB3ZSBvbmx5IGRvIGl0IHRoZQotICAgICBmaXJzdCB0aW1lIHdlIGFyZSBjYWxsZWQuICAqLwotICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudAotCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKSk7Ci0gICAgICBpZiAocCA9PSBOVUxMICYmIG8tPnJlbG9jX2NvdW50ICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyA9IHA7Ci0gICAgICBwZW5kID0gcCArIG8tPnJlbG9jX2NvdW50OwotICAgICAgZm9yICg7IHAgPCBwZW5kOyBwKyspCi0JKnAgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2hlbiBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZSBpbnB1dCByZWxvY2F0aW9ucyBhcmUKLSAgIHByZXNlcnZlZC4gIEJ1dCwgaWYgdGhleSByZWZlcmVuY2UgZ2xvYmFsIHN5bWJvbHMsIHRoZSBpbmRpY2VzCi0gICByZWZlcmVuY2VkIG11c3QgYmUgdXBkYXRlZC4gIFVwZGF0ZSBhbGwgdGhlIHJlbG9jYXRpb25zIGluCi0gICBSRUxfSERSICh0aGVyZSBhcmUgQ09VTlQgb2YgdGhlbSksIHVzaW5nIHRoZSBkYXRhIGluIFJFTF9IQVNILiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZl9saW5rX2FkanVzdF9yZWxvY3MgKGFiZmQsIHJlbF9oZHIsIGNvdW50LCByZWxfaGFzaCkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgICAgdW5zaWduZWQgaW50IGNvdW50OwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcmVsX2hhc2grKykKLSAgICB7Ci0gICAgICBpZiAoKnJlbF9oYXNoID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKCgqcmVsX2hhc2gpLT5pbmR4ID49IDApOwotCi0gICAgICBpZiAocmVsX2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7Ci0JICBFbGZfSW50ZXJuYWxfUmVsIGlyZWw7Ci0JICAKLQkgIGVyZWwgPSAoRWxmX0V4dGVybmFsX1JlbCAqKSByZWxfaGRyLT5jb250ZW50cyArIGk7Ci0JICBlbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgZXJlbCwgJmlyZWwpOwotCSAgaXJlbC5yX2luZm8gPSBFTEZfUl9JTkZPICgoKnJlbF9oYXNoKS0+aW5keCwKLQkJCQkgICAgRUxGX1JfVFlQRSAoaXJlbC5yX2luZm8pKTsKLQkgIGVsZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJmlyZWwsIGVyZWwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfUmVsYSAqZXJlbGE7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSBpcmVsYTsKLQkgIAotCSAgQkZEX0FTU0VSVCAocmVsX2hkci0+c2hfZW50c2l6ZQotCQkgICAgICA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSk7Ci0JICAKLQkgIGVyZWxhID0gKEVsZl9FeHRlcm5hbF9SZWxhICopIHJlbF9oZHItPmNvbnRlbnRzICsgaTsKLQkgIGVsZl9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgZXJlbGEsICZpcmVsYSk7Ci0JICBpcmVsYS5yX2luZm8gPSBFTEZfUl9JTkZPICgoKnJlbF9oYXNoKS0+aW5keCwKLQkJCQkgICAgIEVMRl9SX1RZUEUgKGlyZWxhLnJfaW5mbykpOwotCSAgZWxmX3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJmlyZWxhLCBlcmVsYSk7Ci0JfQotICAgIH0KLX0KLQotLyogRG8gdGhlIGZpbmFsIHN0ZXAgb2YgYW4gRUxGIGxpbmsuICAqLwotCi1ib29sZWFuCi1lbGZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJvb2xlYW4gZHluYW1pYzsKLSAgYmZkICpkeW5vYmo7Ci0gIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvIGZpbmZvOwotICByZWdpc3RlciBhc2VjdGlvbiAqbzsKLSAgcmVnaXN0ZXIgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICByZWdpc3RlciBiZmQgKnN1YjsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBzaXplX3QgbWF4X2V4dGVybmFsX3JlbG9jX3NpemU7Ci0gIHNpemVfdCBtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQ7Ci0gIHNpemVfdCBtYXhfc3ltX2NvdW50OwotICBmaWxlX3B0ciBvZmY7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gZWxmc3ltOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW1zdHJ0YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBzdHJ1Y3QgZWxmX291dGV4dF9pbmZvIGVvaW5mbzsKLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgZHluYW1pYyA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkOwotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN5bXN0cnRhYiA9IGVsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKGZpbmZvLnN5bXN0cnRhYiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBkeW5hbWljKQotICAgIHsKLSAgICAgIGZpbmZvLmR5bnN5bV9zZWMgPSBOVUxMOwotICAgICAgZmluZm8uaGFzaF9zZWMgPSBOVUxMOwotICAgICAgZmluZm8uc3ltdmVyX3NlYyA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZmluZm8uZHluc3ltX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBmaW5mby5oYXNoX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOwotICAgICAgQkZEX0FTU0VSVCAoZmluZm8uZHluc3ltX3NlYyAhPSBOVUxMICYmIGZpbmZvLmhhc2hfc2VjICE9IE5VTEwpOwotICAgICAgZmluZm8uc3ltdmVyX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb24iKTsKLSAgICAgIC8qIE5vdGUgdGhhdCBpdCBpcyBPSyBpZiBzeW12ZXJfc2VjIGlzIE5VTEwuICAqLwotICAgIH0KLQotICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZmluZm8uaW5kaWNlcyA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25zID0gTlVMTDsKLSAgZmluZm8uc3ltYnVmID0gTlVMTDsKLSAgZmluZm8uc3ltYnVmX2NvdW50ID0gMDsKLQotICAvKiBDb3VudCB1cCB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIHdlIHdpbGwgb3V0cHV0IGZvciBlYWNoIG91dHB1dAotICAgICBzZWN0aW9uLCBzbyB0aGF0IHdlIGtub3cgdGhlIHNpemVzIG9mIHRoZSByZWxvYyBzZWN0aW9ucy4gIFdlCi0gICAgIGFsc28gZmlndXJlIG91dCBzb21lIG1heGltdW0gc2l6ZXMuICAqLwotICBtYXhfY29udGVudHNfc2l6ZSA9IDA7Ci0gIG1heF9leHRlcm5hbF9yZWxvY19zaXplID0gMDsKLSAgbWF4X2ludGVybmFsX3JlbG9jX2NvdW50ID0gMDsKLSAgbWF4X3N5bV9jb3VudCA9IDA7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0KLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JICAgICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgICsrby0+cmVsb2NfY291bnQ7Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JCW8tPnJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICBpZiAoc2VjLT5fcmF3X3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKLQkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQkgICAgICBpZiAoc2VjLT5fY29va2VkX3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKLQkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotCSAgICAgIC8qIFdlIGFyZSBpbnRlcmVzdGVkIGluIGp1c3QgbG9jYWwgc3ltYm9scywgbm90IGFsbAotCQkgc3ltYm9scy4gICovCi0JICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoc2VjLT5vd25lcikgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCQkgICYmIChzZWMtPm93bmVyLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0JCXsKLQkJICBzaXplX3Qgc3ltX2NvdW50OwotCi0JCSAgaWYgKGVsZl9iYWRfc3ltdGFiIChzZWMtPm93bmVyKSkKLQkJICAgIHN5bV9jb3VudCA9IChlbGZfdGRhdGEgKHNlYy0+b3duZXIpLT5zeW10YWJfaGRyLnNoX3NpemUKLQkJCQkgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKTsKLQkJICBlbHNlCi0JCSAgICBzeW1fY291bnQgPSBlbGZfdGRhdGEgKHNlYy0+b3duZXIpLT5zeW10YWJfaGRyLnNoX2luZm87Ci0KLQkJICBpZiAoc3ltX2NvdW50ID4gbWF4X3N5bV9jb3VudCkKLQkJICAgIG1heF9zeW1fY291bnQgPSBzeW1fY291bnQ7Ci0KLQkJICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIHNpemVfdCBleHRfc2l6ZTsKLQotCQkgICAgICBleHRfc2l6ZSA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfc2l6ZTsKLQkJICAgICAgaWYgKGV4dF9zaXplID4gbWF4X2V4dGVybmFsX3JlbG9jX3NpemUpCi0JCQltYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGV4dF9zaXplOwotCQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9pbnRlcm5hbF9yZWxvY19jb3VudCkKLQkJCW1heF9pbnRlcm5hbF9yZWxvY19jb3VudCA9IHNlYy0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ID4gMCkKLQlvLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0gICAgICBlbHNlCi0JewotCSAgLyogRXhwbGljaXRseSBjbGVhciB0aGUgU0VDX1JFTE9DIGZsYWcuICBUaGUgbGlua2VyIHRlbmRzIHRvCi0JICAgICBzZXQgaXQgKHRoaXMgaXMgcHJvYmFibHkgYSBidWcpIGFuZCBpZiBpdCBpcyBzZXQKLQkgICAgIGFzc2lnbl9zZWN0aW9uX251bWJlcnMgd2lsbCBjcmVhdGUgYSByZWxvYyBzZWN0aW9uLiAgKi8KLQkgIG8tPmZsYWdzICY9fiBTRUNfUkVMT0M7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgU0VDX0FMTE9DIGZsYWcgaXMgbm90IHNldCwgZm9yY2UgdGhlIHNlY3Rpb24gVk1BIHRvCi0JIHplcm8uICBUaGlzIGlzIGRvbmUgaW4gZWxmX2Zha2Vfc2VjdGlvbnMgYXMgd2VsbCwgYnV0IGZvcmNpbmcKLQkgdGhlIFZNQSB0byAwIGhlcmUgd2lsbCBlbnN1cmUgdGhhdCByZWxvY3MgYWdhaW5zdCB0aGVzZQotCSBzZWN0aW9ucyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMAotCSAgJiYgISBvLT51c2VyX3NldF92bWEpCi0Jby0+dm1hID0gMDsKLSAgICB9Ci0KLSAgLyogRmlndXJlIG91dCB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIGV2ZXJ5dGhpbmcgYnV0IHRoZSBzeW1ib2wgdGFibGUKLSAgICAgYW5kIHRoZSByZWxvY3MuICBXZSBzZXQgc3ltY291bnQgdG8gZm9yY2UgYXNzaWduX3NlY3Rpb25fbnVtYmVycwotICAgICB0byBjcmVhdGUgYSBzeW1ib2wgdGFibGUuICAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IGluZm8tPnN0cmlwID09IHN0cmlwX2FsbCA/IDAgOiAxOwotICBCRkRfQVNTRVJUICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pOwotICBpZiAoISBfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQsIGluZm8pKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIEZpZ3VyZSBvdXQgaG93IG1hbnkgcmVsb2NhdGlvbnMgd2Ugd2lsbCBoYXZlIGluIGVhY2ggc2VjdGlvbi4KLSAgICAgSnVzdCB1c2luZyBSRUxPQ19DT1VOVCBpc24ndCBnb29kIGVub3VnaCBzaW5jZSB0aGF0IGRvZXNuJ3QKLSAgICAgbWFpbnRhaW4gYSBzZXBhcmF0ZSB2YWx1ZSBmb3IgUkVMIHZzLiBSRUxBIHJlbG9jYXRpb25zLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICAgIGZvciAobyA9IHN1Yi0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCi0JICBpZiAoISBvLT5saW5rZXJfbWFyaykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc2VjdGlvbiB3YXMgb21pdHRlZCBmcm9tIHRoZSBsaW5rLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBvdXRwdXRfc2VjdGlvbiA9IG8tPm91dHB1dF9zZWN0aW9uOwotCi0JICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTAotCSAgICAgICYmIChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqZXNkaSAKLQkJPSBlbGZfc2VjdGlvbl9kYXRhIChvKTsKLQkgICAgICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKmVzZG8gCi0JCT0gZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pOwotCSAgICAgIHVuc2lnbmVkIGludCAqcmVsX2NvdW50OwotCSAgICAgIHVuc2lnbmVkIGludCAqcmVsX2NvdW50MjsKLQotCSAgICAgIC8qIFdlIG11c3QgYmUgY2FyZWZ1bCB0byBhZGQgdGhlIHJlbG9jYXRpb24gZnJvbXMgdGhlCi0JCSBpbnB1dCBzZWN0aW9uIHRvIHRoZSByaWdodCBvdXRwdXQgY291bnQuICAqLwotCSAgICAgIGlmIChlc2RpLT5yZWxfaGRyLnNoX2VudHNpemUgPT0gZXNkby0+cmVsX2hkci5zaF9lbnRzaXplKQotCQl7Ci0JCSAgcmVsX2NvdW50ID0gJmVzZG8tPnJlbF9jb3VudDsKLQkJICByZWxfY291bnQyID0gJmVzZG8tPnJlbF9jb3VudDI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWxfY291bnQgPSAmZXNkby0+cmVsX2NvdW50MjsKLQkJICByZWxfY291bnQyID0gJmVzZG8tPnJlbF9jb3VudDsKLQkJfQotCSAgICAgIAotCSAgICAgICpyZWxfY291bnQgKz0gKGVzZGktPnJlbF9oZHIuc2hfc2l6ZSAKLQkJCSAgICAgLyBlc2RpLT5yZWxfaGRyLnNoX2VudHNpemUpOwotCSAgICAgIGlmIChlc2RpLT5yZWxfaGRyMikKLQkJKnJlbF9jb3VudDIgKz0gKGVzZGktPnJlbF9oZHIyLT5zaF9zaXplIAotCQkJCS8gZXNkaS0+cmVsX2hkcjItPnNoX2VudHNpemUpOwotCSAgICB9Ci0JfQotCi0gIC8qIFRoYXQgY3JlYXRlZCB0aGUgcmVsb2Mgc2VjdGlvbnMuICBTZXQgdGhlaXIgc2l6ZXMsIGFuZCBhc3NpZ24KLSAgICAgdGhlbSBmaWxlIHBvc2l0aW9ucywgYW5kIGFsbG9jYXRlIHNvbWUgYnVmZmVycy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgaWYgKCFlbGZfbGlua19zaXplX3JlbG9jX3NlY3Rpb24gKGFiZmQsCi0JCQkJCSAgICAmZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIsCi0JCQkJCSAgICBvKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjIKLQkgICAgICAmJiAhZWxmX2xpbmtfc2l6ZV9yZWxvY19zZWN0aW9uIChhYmZkLAotCQkJCQkgICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyLAotCQkJCQkgICAgICAgbykpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgLyogTm93LCByZXNldCBSRUxfQ09VTlQgYW5kIFJFTF9DT1VOVDIgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0KLQkgdG8gY291bnQgdXB3YXJkcyB3aGlsZSBhY3R1YWxseSBvdXRwdXR0aW5nIHRoZSByZWxvY2F0aW9ucy4gKi8KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfY291bnQgPSAwOwotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9jb3VudDIgPSAwOwotICAgIH0KLQotICBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyAoYWJmZCk7Ci0KLSAgLyogV2UgaGF2ZSBub3cgYXNzaWduZWQgZmlsZSBwb3NpdGlvbnMgZm9yIGFsbCB0aGUgc2VjdGlvbnMgZXhjZXB0Ci0gICAgIC5zeW10YWIgYW5kIC5zdHJ0YWIuICBXZSBzdGFydCB0aGUgLnN5bXRhYiBzZWN0aW9uIGF0IHRoZSBjdXJyZW50Ci0gICAgIGZpbGUgcG9zaXRpb24sIGFuZCB3cml0ZSBkaXJlY3RseSB0byBpdC4gIFdlIGJ1aWxkIHRoZSAuc3RydGFiCi0gICAgIHNlY3Rpb24gaW4gbWVtb3J5LiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIC8qIHNoX25hbWUgaXMgc2V0IGluIHByZXBfaGVhZGVycy4gICovCi0gIHN5bXRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1lNVEFCOwotICBzeW10YWJfaGRyLT5zaF9mbGFncyA9IDA7Ci0gIHN5bXRhYl9oZHItPnNoX2FkZHIgPSAwOwotICBzeW10YWJfaGRyLT5zaF9zaXplID0gMDsKLSAgc3ltdGFiX2hkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0gIC8qIHNoX2xpbmsgaXMgc2V0IGluIGFzc2lnbl9zZWN0aW9uX251bWJlcnMuICAqLwotICAvKiBzaF9pbmZvIGlzIHNldCBiZWxvdy4gICovCi0gIC8qIHNoX29mZnNldCBpcyBzZXQganVzdCBiZWxvdy4gICovCi0gIHN5bXRhYl9oZHItPnNoX2FkZHJhbGlnbiA9IDQ7ICAvKiBGSVhNRTogc3lzdGVtIGRlcGVuZGVudD8gICovCi0KLSAgb2ZmID0gZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvczsKLSAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKHN5bXRhYl9oZHIsIG9mZiwgdHJ1ZSk7Ci0KLSAgLyogTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvcyBpcwotICAgICBpbmNvcnJlY3QuICBXZSBkbyBub3QgeWV0IGtub3cgdGhlIHNpemUgb2YgdGhlIC5zeW10YWIgc2VjdGlvbi4KLSAgICAgV2UgY29ycmVjdCBuZXh0X2ZpbGVfcG9zIGJlbG93LCBhZnRlciB3ZSBkbyBrbm93IHRoZSBzaXplLiAgKi8KLQotICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBob2xkIHN3YXBwZWQgb3V0IHN5bWJvbHMuICBUaGlzIGlzIHRvIGF2b2lkCi0gICAgIGNvbnRpbnVvdXNseSBzZWVraW5nIHRvIHRoZSByaWdodCBwb3NpdGlvbiBpbiB0aGUgZmlsZS4gICovCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8IG1heF9zeW1fY291bnQgPCAyMCkKLSAgICBmaW5mby5zeW1idWZfc2l6ZSA9IDIwOwotICBlbHNlCi0gICAgZmluZm8uc3ltYnVmX3NpemUgPSBtYXhfc3ltX2NvdW50OwotICBmaW5mby5zeW1idWYgPSAoKEVsZl9FeHRlcm5hbF9TeW0gKikKLQkJICBiZmRfbWFsbG9jIChmaW5mby5zeW1idWZfc2l6ZSAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKTsKLSAgaWYgKGZpbmZvLnN5bWJ1ZiA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFN0YXJ0IHdyaXRpbmcgb3V0IHRoZSBzeW1ib2wgdGFibGUuICBUaGUgZmlyc3Qgc3ltYm9sIGlzIGFsd2F5cyBhCi0gICAgIGR1bW15IHN5bWJvbC4gICovCi0gIGlmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgfHwgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGVsZnN5bS5zdF92YWx1ZSA9IDA7Ci0gICAgICBlbGZzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBlbGZzeW0uc3RfaW5mbyA9IDA7Ci0gICAgICBlbGZzeW0uc3Rfb3RoZXIgPSAwOwotICAgICAgZWxmc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOwotICAgICAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoJmZpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAmZWxmc3ltLCBiZmRfdW5kX3NlY3Rpb25fcHRyKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSNpZiAwCi0gIC8qIFNvbWUgc3RhbmRhcmQgRUxGIGxpbmtlcnMgZG8gdGhpcywgYnV0IHdlIGRvbid0IGJlY2F1c2UgaXQgY2F1c2VzCi0gICAgIGJvb3RzdHJhcCBjb21wYXJpc29uIGZhaWx1cmVzLiAgKi8KLSAgLyogT3V0cHV0IGEgZmlsZSBzeW1ib2wgZm9yIHRoZSBvdXRwdXQgZmlsZSBhcyB0aGUgc2Vjb25kIHN5bWJvbC4KLSAgICAgV2Ugb3V0cHV0IHRoaXMgZXZlbiBpZiB3ZSBhcmUgZGlzY2FyZGluZyBsb2NhbCBzeW1ib2xzLCBhbHRob3VnaAotICAgICBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyBjb3JyZWN0LiAgKi8KLSAgZWxmc3ltLnN0X3ZhbHVlID0gMDsKLSAgZWxmc3ltLnN0X3NpemUgPSAwOwotICBlbGZzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9GSUxFKTsKLSAgZWxmc3ltLnN0X290aGVyID0gMDsKLSAgZWxmc3ltLnN0X3NobmR4ID0gU0hOX0FCUzsKLSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoJmZpbmZvLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCSAgICAgJmVsZnN5bSwgYmZkX2Fic19zZWN0aW9uX3B0cikpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0jZW5kaWYKLQotICAvKiBPdXRwdXQgYSBzeW1ib2wgZm9yIGVhY2ggc2VjdGlvbi4gIFdlIG91dHB1dCB0aGVzZSBldmVuIGlmIHdlIGFyZQotICAgICBkaXNjYXJkaW5nIGxvY2FsIHN5bWJvbHMsIHNpbmNlIHRoZXkgYXJlIHVzZWQgZm9yIHJlbG9jcy4gIFRoZXNlCi0gICAgIHN5bWJvbHMgaGF2ZSBubyBuYW1lcy4gIFdlIHN0b3JlIHRoZSBpbmRleCBvZiBlYWNoIG9uZSBpbiB0aGUKLSAgICAgaW5kZXggZmllbGQgb2YgdGhlIHNlY3Rpb24sIHNvIHRoYXQgd2UgY2FuIGZpbmQgaXQgYWdhaW4gd2hlbgotICAgICBvdXRwdXR0aW5nIHJlbG9jcy4gICovCi0gIGlmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgfHwgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGVsZnN5bS5zdF9zaXplID0gMDsKLSAgICAgIGVsZnN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOwotICAgICAgZWxmc3ltLnN0X290aGVyID0gMDsKLSAgICAgIGZvciAoaSA9IDE7IGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bTsgaSsrKQotCXsKLQkgIG8gPSBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpKTsKLQkgIGlmIChvICE9IE5VTEwpCi0JICAgIG8tPnRhcmdldF9pbmRleCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCSAgZWxmc3ltLnN0X3NobmR4ID0gaTsKLQkgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUgfHwgbyA9PSBOVUxMKQotCSAgICBlbGZzeW0uc3RfdmFsdWUgPSAwOwotCSAgZWxzZQotCSAgICBlbGZzeW0uc3RfdmFsdWUgPSBvLT52bWE7Ci0JICBpZiAoISBlbGZfbGlua19vdXRwdXRfc3ltICgmZmluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgICAmZWxmc3ltLCBvKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzb21lIG1lbW9yeSB0byBob2xkIGluZm9ybWF0aW9uIHJlYWQgaW4gZnJvbSB0aGUgaW5wdXQKLSAgICAgZmlsZXMuICAqLwotICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChQVFIpIGJmZF9tYWxsb2MgKG1heF9leHRlcm5hbF9yZWxvY19zaXplKTsKLSAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gKChFbGZfSW50ZXJuYWxfUmVsYSAqKQotCQkJICAgYmZkX21hbGxvYyAobWF4X2ludGVybmFsX3JlbG9jX2NvdW50Ci0JCQkJICAgICAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsYSkKLQkJCQkgICAgICAgKiBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsKSk7Ci0gIGZpbmZvLmV4dGVybmFsX3N5bXMgPSAoKEVsZl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKTsKLSAgZmluZm8uaW50ZXJuYWxfc3ltcyA9ICgoRWxmX0ludGVybmFsX1N5bSAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkgICAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSkpOwotICBmaW5mby5pbmRpY2VzID0gKGxvbmcgKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAobG9uZykpOwotICBmaW5mby5zZWN0aW9ucyA9ICgoYXNlY3Rpb24gKiopCi0JCSAgICBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpOwotICBpZiAoKGZpbmZvLmNvbnRlbnRzID09IE5VTEwgJiYgbWF4X2NvbnRlbnRzX3NpemUgIT0gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZSAhPSAwKQotICAgICAgfHwgKGZpbmZvLmludGVybmFsX3JlbG9jcyA9PSBOVUxMICYmIG1heF9pbnRlcm5hbF9yZWxvY19jb3VudCAhPSAwKQotICAgICAgfHwgKGZpbmZvLmV4dGVybmFsX3N5bXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ICE9IDApCi0gICAgICB8fCAoZmluZm8uaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkKLSAgICAgIHx8IChmaW5mby5pbmRpY2VzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCAhPSAwKQotICAgICAgfHwgKGZpbmZvLnNlY3Rpb25zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCAhPSAwKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBTaW5jZSBFTEYgcGVybWl0cyByZWxvY2F0aW9ucyB0byBiZSBhZ2FpbnN0IGxvY2FsIHN5bWJvbHMsIHdlCi0gICAgIG11c3QgaGF2ZSB0aGUgbG9jYWwgc3ltYm9scyBhdmFpbGFibGUgd2hlbiB3ZSBkbyB0aGUgcmVsb2NhdGlvbnMuCi0gICAgIFNpbmNlIHdlIHdvdWxkIHJhdGhlciBvbmx5IHJlYWQgdGhlIGxvY2FsIHN5bWJvbHMgb25jZSwgYW5kIHdlCi0gICAgIHdvdWxkIHJhdGhlciBub3Qga2VlcCB0aGVtIGluIG1lbW9yeSwgd2UgaGFuZGxlIGFsbCB0aGUKLSAgICAgcmVsb2NhdGlvbnMgZm9yIGEgc2luZ2xlIGlucHV0IGZpbGUgYXQgdGhlIHNhbWUgdGltZS4KLQotICAgICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB0aGUgdG90YWwgbnVtYmVyIG9mIGxvY2FsCi0gICAgIHN5bWJvbHMgdW50aWwgd2UgaGF2ZSBzZWVuIGFsbCBvZiB0aGVtLCBhbmQgdGhlIGxvY2FsIHN5bWJvbAotICAgICBpbmRpY2VzIHByZWNlZGUgdGhlIGdsb2JhbCBzeW1ib2wgaW5kaWNlcy4gIFRoaXMgbWVhbnMgdGhhdCB3aGVuCi0gICAgIHdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFuZCB3ZSBzZWUgYSByZWxvYyBhZ2FpbnN0Ci0gICAgIGEgZ2xvYmFsIHN5bWJvbCwgd2UgY2FuIG5vdCBrbm93IHRoZSBzeW1ib2wgaW5kZXggdW50aWwgd2UgaGF2ZQotICAgICBmaW5pc2hlZCBleGFtaW5pbmcgYWxsIHRoZSBsb2NhbCBzeW1ib2xzIHRvIHNlZSB3aGljaCBvbmVzIHdlIGFyZQotICAgICBnb2luZyB0byBvdXRwdXQuICBUbyBkZWFsIHdpdGggdGhpcywgd2Uga2VlcCB0aGUgcmVsb2NhdGlvbnMgaW4KLSAgICAgbWVtb3J5LCBhbmQgZG9uJ3Qgb3V0cHV0IHRoZW0gdW50aWwgdGhlIGVuZCBvZiB0aGUgbGluay4gIFRoaXMgaXMKLSAgICAgYW4gdW5mb3J0dW5hdGUgd2FzdGUgb2YgbWVtb3J5LCBidXQgSSBkb24ndCBzZWUgYSBnb29kIHdheSBhcm91bmQKLSAgICAgaXQuICBGb3J0dW5hdGVseSwgaXQgb25seSBoYXBwZW5zIHdoZW4gcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZQotICAgICBsaW5rLCB3aGljaCBpcyBub3QgdGhlIGNvbW1vbiBjYXNlLiAgRklYTUU6IElmIGtlZXBfbWVtb3J5IGlzIHNldAotICAgICB3ZSBjb3VsZCB3cml0ZSB0aGUgcmVsb2NzIG91dCBhbmQgdGhlbiByZWFkIHRoZW0gYWdhaW47IEkgZG9uJ3QKLSAgICAga25vdyBob3cgYmFkIHRoZSBtZW1vcnkgbG9zcyB3aWxsIGJlLiAgKi8KLQotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAocC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcikKLQkJICA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKSkKLQkgICAgewotCSAgICAgIHN1YiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0JICAgICAgaWYgKCEgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuKQotCQl7Ci0JCSAgaWYgKCEgZWxmX2xpbmtfaW5wdXRfYmZkICgmZmluZm8sIHN1YikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGlmICghIGVsZl9yZWxvY19saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFRoYXQgd3JvdGUgb3V0IGFsbCB0aGUgbG9jYWwgc3ltYm9scy4gIEZpbmlzaCB1cCB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIHdpdGggdGhlIGdsb2JhbCBzeW1ib2xzLiAgKi8KLQotICBpZiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsICYmIGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICAvKiBPdXRwdXQgYW55IGdsb2JhbCBzeW1ib2xzIHRoYXQgZ290IGNvbnZlcnRlZCB0byBsb2NhbCBpbiBhCi0gICAgICAgICB2ZXJzaW9uIHNjcmlwdC4gIFdlIGRvIHRoaXMgaW4gYSBzZXBhcmF0ZSBzdGVwIHNpbmNlIEVMRgotICAgICAgICAgcmVxdWlyZXMgYWxsIGxvY2FsIHN5bWJvbHMgdG8gYXBwZWFyIHByaW9yIHRvIGFueSBnbG9iYWwKLSAgICAgICAgIHN5bWJvbHMuICBGSVhNRTogV2Ugc2hvdWxkIG9ubHkgZG8gdGhpcyBpZiBzb21lIGdsb2JhbAotICAgICAgICAgc3ltYm9scyB3ZXJlLCBpbiBmYWN0LCBjb252ZXJ0ZWQgdG8gYmVjb21lIGxvY2FsLiAgRklYTUU6Ci0gICAgICAgICBXaWxsIHRoaXMgd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgSXJpeCA1IGxpbmtlcj8gICovCi0gICAgICBlb2luZm8uZmFpbGVkID0gZmFsc2U7Ci0gICAgICBlb2luZm8uZmluZm8gPSAmZmluZm87Ci0gICAgICBlb2luZm8ubG9jYWxzeW1zID0gdHJ1ZTsKLSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSwKLQkJCSAgICAgIChQVFIpICZlb2luZm8pOwotICAgICAgaWYgKGVvaW5mby5mYWlsZWQpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc2hfaW5mbyBmaWVsZCByZWNvcmRzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm9uIGxvY2FsIHN5bWJvbC4gICovCi0gIHN5bXRhYl9oZHItPnNoX2luZm8gPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQotICBpZiAoZHluYW1pYykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgICAgIEVsZl9FeHRlcm5hbF9TeW0gKmR5bnN5bSA9Ci0JKEVsZl9FeHRlcm5hbF9TeW0gKilmaW5mby5keW5zeW1fc2VjLT5jb250ZW50czsKLSAgICAgIGxvbmcgbGFzdF9sb2NhbCA9IDA7Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JewotCSAgYXNlY3Rpb24gKnM7Ci0KLQkgIHN5bS5zdF9zaXplID0gMDsKLQkgIHN5bS5zdF9uYW1lID0gMDsKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOwotCSAgc3ltLnN0X290aGVyID0gMDsKLQotCSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JICAgIHsKLQkgICAgICBpbnQgaW5keDsKLQkgICAgICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgICAgIEJGRF9BU1NFUlQgKGluZHggPiAwKTsKLQkgICAgICBzeW0uc3Rfc2huZHggPSBpbmR4OwotCSAgICAgIHN5bS5zdF92YWx1ZSA9IHMtPnZtYTsKLQotCSAgICAgIGVsZl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZzeW0sCi0JCQkJICAgZHluc3ltICsgZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHgpOwotCSAgICB9Ci0KLQkgIGxhc3RfbG9jYWwgPSBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpOwotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBsb2NhbCBkeW5zeW1zLiAgKi8KLSAgICAgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmxvY2FsKQotCXsKLQkgIHN0cnVjdCBlbGZfbGlua19sb2NhbF9keW5hbWljX2VudHJ5ICplOwotCSAgZm9yIChlID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5sb2NhbDsgZSA7IGUgPSBlLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnM7Ci0KLQkgICAgICBzeW0uc3Rfc2l6ZSA9IGUtPmlzeW0uc3Rfc2l6ZTsKLQkgICAgICBzeW0uc3Rfb3RoZXIgPSBlLT5pc3ltLnN0X290aGVyOwotCi0JICAgICAgLyogQ29weSB0aGUgaW50ZXJuYWwgc3ltYm9sIGFzIGlzLgotCQkgTm90ZSB0aGF0IHdlIHNhdmVkIGEgd29yZCBvZiBzdG9yYWdlIGFuZCBvdmVyd3JvdGUKLSAgICAgICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHN0X25hbWUgd2l0aCB0aGUgZHluc3RyX2luZGV4LiAgKi8KLSAgICAgICAgICAgICAgc3ltID0gZS0+aXN5bTsKLQotCSAgICAgIGlmIChlLT5pc3ltLnN0X3NobmR4ID4gMCAmJiBlLT5pc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkJewotCQkgIHMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoZS0+aW5wdXRfYmZkLAotCQkJCQkJICBlLT5pc3ltLnN0X3NobmR4KTsKLQotCQkgIHN5bS5zdF9zaG5keCA9Ci0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaWR4OwotCQkgIHN5bS5zdF92YWx1ZSA9IChzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIHMtPm91dHB1dF9vZmZzZXQKLQkJCQkgICsgZS0+aXN5bS5zdF92YWx1ZSk7Ci0JCX0KLQotCSAgICAgIGlmIChsYXN0X2xvY2FsIDwgZS0+ZHluaW5keCkKLQkJbGFzdF9sb2NhbCA9IGUtPmR5bmluZHg7Ci0KLQkgICAgICBlbGZfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmc3ltLCBkeW5zeW0gKyBlLT5keW5pbmR4KTsKLQkgICAgfQotCX0KLQotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoZmluZm8uZHluc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0KLQlsYXN0X2xvY2FsICsgMTsKLSAgICB9Ci0KLSAgLyogV2UgZ2V0IHRoZSBnbG9iYWwgc3ltYm9scyBmcm9tIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgZW9pbmZvLmZhaWxlZCA9IGZhbHNlOwotICBlb2luZm8ubG9jYWxzeW1zID0gZmFsc2U7Ci0gIGVvaW5mby5maW5mbyA9ICZmaW5mbzsKLSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBlbGZfbGlua19vdXRwdXRfZXh0c3ltLAotCQkJICAoUFRSKSAmZW9pbmZvKTsKLSAgaWYgKGVvaW5mby5mYWlsZWQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIGJhY2tlbmQgbmVlZHMgdG8gb3V0cHV0IHNvbWUgc3ltYm9scyBub3QgcHJlc2VudCBpbiB0aGUgaGFzaAotICAgICB0YWJsZSwgZG8gaXQgbm93LiAgKi8KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfb3V0cHV0X2FyY2hfc3ltcykKLSAgICB7Ci0gICAgICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfb3V0cHV0X2FyY2hfc3ltcykKLQkgICAgICAoYWJmZCwgaW5mbywgKFBUUikgJmZpbmZvLAotCSAgICAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosCi0JICAgICAgICAgICAgICAgICAgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICopKSkKLQkgICAgICAgZWxmX2xpbmtfb3V0cHV0X3N5bSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0gICAgICAKLQotICAvKiBGbHVzaCBhbGwgc3ltYm9scyB0byB0aGUgZmlsZS4gICovCi0gIGlmICghIGVsZl9saW5rX2ZsdXNoX291dHB1dF9zeW1zICgmZmluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgc3ltdGFiIHNlY3Rpb24uICAqLwotICBvZmYgKz0gc3ltdGFiX2hkci0+c2hfc2l6ZTsKLQotICAvKiBGaW5pc2ggdXAgYW5kIHdyaXRlIG91dCB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZSAoLnN0cnRhYikKLSAgICAgc2VjdGlvbi4gICovCi0gIHN5bXN0cnRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkcjsKLSAgLyogc2hfbmFtZSB3YXMgc2V0IGluIHByZXBfaGVhZGVycy4gICovCi0gIHN5bXN0cnRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotICBzeW1zdHJ0YWJfaGRyLT5zaF9mbGFncyA9IDA7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX2FkZHIgPSAwOwotICBzeW1zdHJ0YWJfaGRyLT5zaF9zaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZmluZm8uc3ltc3RydGFiKTsKLSAgc3ltc3RydGFiX2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX2xpbmsgPSAwOwotICBzeW1zdHJ0YWJfaGRyLT5zaF9pbmZvID0gMDsKLSAgLyogc2hfb2Zmc2V0IGlzIHNldCBqdXN0IGJlbG93LiAgKi8KLSAgc3ltc3RydGFiX2hkci0+c2hfYWRkcmFsaWduID0gMTsKLQotICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoc3ltc3RydGFiX2hkciwgb2ZmLCB0cnVlKTsKLSAgZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvcyA9IG9mZjsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltc3RydGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBmaW5mby5zeW1zdHJ0YWIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IHRoZSByZWxvY3MgdG8gaGF2ZSB0aGUgY29ycmVjdCBzeW1ib2wgaW5kaWNlcy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGVsZl9saW5rX2FkanVzdF9yZWxvY3MgKGFiZmQsICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkciwgCi0JCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2NvdW50LAotCQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMpOwotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMiAhPSBOVUxMKQotCWVsZl9saW5rX2FkanVzdF9yZWxvY3MgKGFiZmQsIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMiwKLQkJCQllbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2NvdW50MiwKLQkJCQkoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMgCi0JCQkJICsgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9jb3VudCkpOwotCi0gICAgICAvKiBTZXQgdGhlIHJlbG9jX2NvdW50IGZpZWxkIHRvIDAgdG8gcHJldmVudCB3cml0ZV9yZWxvY3MgZnJvbQotCSB0cnlpbmcgdG8gc3dhcCB0aGUgcmVsb2NzIG91dCBpdHNlbGYuICAqLwotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbGlua2luZyBhZ2FpbnN0IGEgZHluYW1pYyBvYmplY3QsIG9yIGdlbmVyYXRpbmcgYQotICAgICBzaGFyZWQgbGlicmFyeSwgZmluaXNoIHVwIHRoZSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqLwotICBpZiAoZHluYW1pYykKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIC8qIEZpeCB1cCAuZHluYW1pYyBlbnRyaWVzLiAgKi8KLSAgICAgIG8gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLSAgICAgIEJGRF9BU1NFUlQgKG8gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGZfRXh0ZXJuYWxfRHluICopIG8tPmNvbnRlbnRzOwotICAgICAgZHluY29uZW5kID0gKEVsZl9FeHRlcm5hbF9EeW4gKikgKG8tPmNvbnRlbnRzICsgby0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIHVuc2lnbmVkIGludCB0eXBlOwotCi0JICBlbGZfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEVF9JTklUOgotCSAgICAgIG5hbWUgPSBpbmZvLT5pbml0X2Z1bmN0aW9uOwotCSAgICAgIGdvdG8gZ2V0X3N5bTsKLQkgICAgY2FzZSBEVF9GSU5JOgotCSAgICAgIG5hbWUgPSBpbmZvLT5maW5pX2Z1bmN0aW9uOwotCSAgICBnZXRfc3ltOgotCSAgICAgIHsKLQkJc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkJaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsCi0JCQkJCSAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJaWYgKGggIT0gTlVMTAotCQkgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCXx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQkgIHsKLQkJICAgIGR5bi5kX3VuLmRfdmFsID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJICAgIG8gPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgICBpZiAoby0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQkJICAgICAgZHluLmRfdW4uZF92YWwgKz0gKG8tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgby0+b3V0cHV0X29mZnNldCk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCS8qIFRoZSBzeW1ib2wgaXMgaW1wb3J0ZWQgZnJvbSBhbm90aGVyIHNoYXJlZAotCQkJICAgbGlicmFyeSBhbmQgZG9lcyBub3QgYXBwbHkgdG8gdGhpcyBvbmUuICAqLwotCQkJZHluLmRfdW4uZF92YWwgPSAwOwotCQkgICAgICB9Ci0KLQkJICAgIGVsZl9zd2FwX2R5bl9vdXQgKGR5bm9iaiwgJmR5biwgZHluY29uKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfSEFTSDoKLQkgICAgICBuYW1lID0gIi5oYXNoIjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfU1RSVEFCOgotCSAgICAgIG5hbWUgPSAiLmR5bnN0ciI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX1NZTVRBQjoKLQkgICAgICBuYW1lID0gIi5keW5zeW0iOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9WRVJERUY6Ci0JICAgICAgbmFtZSA9ICIuZ251LnZlcnNpb25fZCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX1ZFUk5FRUQ6Ci0JICAgICAgbmFtZSA9ICIuZ251LnZlcnNpb25fciI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX1ZFUlNZTToKLQkgICAgICBuYW1lID0gIi5nbnUudmVyc2lvbiI7Ci0JICAgIGdldF92bWE6Ci0JICAgICAgbyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChvICE9IE5VTEwpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gby0+dm1hOwotCSAgICAgIGVsZl9zd2FwX2R5bl9vdXQgKGR5bm9iaiwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1JFTDoKLQkgICAgY2FzZSBEVF9SRUxBOgotCSAgICBjYXNlIERUX1JFTFNaOgotCSAgICBjYXNlIERUX1JFTEFTWjoKLQkgICAgICBpZiAoZHluLmRfdGFnID09IERUX1JFTCB8fCBkeW4uZF90YWcgPT0gRFRfUkVMU1opCi0JCXR5cGUgPSBTSFRfUkVMOwotCSAgICAgIGVsc2UKLQkJdHlwZSA9IFNIVF9SRUxBOwotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gMDsKLQkgICAgICBmb3IgKGkgPSAxOyBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07IGkrKykKLQkJewotCQkgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLQkJICBoZHIgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2ldOwotCQkgIGlmIChoZHItPnNoX3R5cGUgPT0gdHlwZQotCQkgICAgICAmJiAoaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9SRUxTWiB8fCBkeW4uZF90YWcgPT0gRFRfUkVMQVNaKQotCQkJZHluLmRfdW4uZF92YWwgKz0gaGRyLT5zaF9zaXplOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGlmIChkeW4uZF91bi5kX3ZhbCA9PSAwCi0JCQkgICAgICB8fCBoZHItPnNoX2FkZHIgPCBkeW4uZF91bi5kX3ZhbCkKLQkJCSAgICBkeW4uZF91bi5kX3ZhbCA9IGhkci0+c2hfYWRkcjsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsZl9zd2FwX2R5bl9vdXQgKGR5bm9iaiwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGFueSBkeW5hbWljIHNlY3Rpb25zLCB0aGVuIG91dHB1dCB0aGVtLiAgKi8KLSAgaWYgKGR5bm9iaiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgqYmVkLT5lbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucykgKGFiZmQsIGluZm8pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBmb3IgKG8gPSBkeW5vYmotPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICAgICAgfHwgby0+X3Jhd19zaXplID09IDApCi0JICAgIGNvbnRpbnVlOwotCSAgaWYgKChvLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gc2VjdGlvbnMKLSAgICAgICAgICAgICAgICAgY3JlYXRlZCBieSBlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGlmICgoZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF90eXBlCi0JICAgICAgICE9IFNIVF9TVFJUQUIpCi0JICAgICAgfHwgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksICIuZHluc3RyIikgIT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgby0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIG8tPmNvbnRlbnRzLCBvLT5vdXRwdXRfb2Zmc2V0LAotCQkJCQkgICAgICBvLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZmlsZV9wdHIgb2ZmOwotCi0JICAgICAgLyogVGhlIGNvbnRlbnRzIG9mIHRoZSAuZHluc3RyIHNlY3Rpb24gYXJlIGFjdHVhbGx5IGluIGEKLSAgICAgICAgICAgICAgICAgc3RyaW5ndGFiLiAgKi8KLQkgICAgICBvZmYgPSBlbGZfc2VjdGlvbl9kYXRhIChvLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX29mZnNldDsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZiwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAhIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsCi0JCQkJCSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cikpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlIG9wdGltaXplZCBzdGFicyBzdHJpbmdzLCBvdXRwdXQgdGhlbS4gICovCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIChhYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAoZmluZm8uc3ltc3RydGFiICE9IE5VTEwpCi0gICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3ltc3RydGFiKTsKLSAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uY29udGVudHMpOwotICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGZpbmZvLmludGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5pbmRpY2VzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW5kaWNlcyk7Ci0gIGlmIChmaW5mby5zZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25zKTsKLSAgaWYgKGZpbmZvLnN5bWJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnN5bWJ1Zik7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLQkgICYmIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzICE9IE5VTEwpCi0JZnJlZSAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMpOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5saW5rZXIgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZmluZm8uc3ltc3RydGFiICE9IE5VTEwpCi0gICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3ltc3RydGFiKTsKLSAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uY29udGVudHMpOwotICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGZpbmZvLmludGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5pbmRpY2VzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW5kaWNlcyk7Ci0gIGlmIChmaW5mby5zZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25zKTsKLSAgaWYgKGZpbmZvLnN5bWJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnN5bWJ1Zik7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLQkgICYmIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzICE9IE5VTEwpCi0JZnJlZSAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oYXNoZXMpOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgb3V0cHV0IHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19vdXRwdXRfc3ltIChmaW5mbywgbmFtZSwgZWxmc3ltLCBpbnB1dF9zZWMpCi0gICAgIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqZWxmc3ltOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjOwotewotICBib29sZWFuICgqb3V0cHV0X3N5bWJvbF9ob29rKSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkgY29uc3QgY2hhciAqLAotCQkJCQkgRWxmX0ludGVybmFsX1N5bSAqLAotCQkJCQkgYXNlY3Rpb24gKikpOwotCi0gIG91dHB1dF9zeW1ib2xfaG9vayA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPgotICAgIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rOwotICBpZiAob3V0cHV0X3N5bWJvbF9ob29rICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCgqb3V0cHV0X3N5bWJvbF9ob29rKQotCSAgICAgKGZpbmZvLT5vdXRwdXRfYmZkLCBmaW5mby0+aW5mbywgbmFtZSwgZWxmc3ltLCBpbnB1dF9zZWMpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChuYW1lID09IChjb25zdCBjaGFyICopIE5VTEwgfHwgKm5hbWUgPT0gJ1wwJykKLSAgICBlbGZzeW0tPnN0X25hbWUgPSAwOwotICBlbHNlIGlmIChpbnB1dF9zZWMtPmZsYWdzICYgU0VDX0VYQ0xVREUpCi0gICAgZWxmc3ltLT5zdF9uYW1lID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGVsZnN5bS0+c3RfbmFtZSA9ICh1bnNpZ25lZCBsb25nKSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zeW1zdHJ0YWIsCi0JCQkJCQkJICAgIG5hbWUsIHRydWUsCi0JCQkJCQkJICAgIGZhbHNlKTsKLSAgICAgIGlmIChlbGZzeW0tPnN0X25hbWUgPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGZpbmZvLT5zeW1idWZfY291bnQgPj0gZmluZm8tPnN5bWJ1Zl9zaXplKQotICAgIHsKLSAgICAgIGlmICghIGVsZl9saW5rX2ZsdXNoX291dHB1dF9zeW1zIChmaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlbGZfc3dhcF9zeW1ib2xfb3V0IChmaW5mby0+b3V0cHV0X2JmZCwgZWxmc3ltLAotCQkgICAgICAgKFBUUikgKGZpbmZvLT5zeW1idWYgKyBmaW5mby0+c3ltYnVmX2NvdW50KSk7Ci0gICsrZmluZm8tPnN5bWJ1Zl9jb3VudDsKLQotICArKyBiZmRfZ2V0X3N5bWNvdW50IChmaW5mby0+b3V0cHV0X2JmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZsdXNoIHRoZSBvdXRwdXQgc3ltYm9scyB0byB0aGUgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19mbHVzaF9vdXRwdXRfc3ltcyAoZmluZm8pCi0gICAgIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLXsKLSAgaWYgKGZpbmZvLT5zeW1idWZfY291bnQgPiAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWI7Ci0KLSAgICAgIHN5bXRhYiA9ICZlbGZfdGRhdGEgKGZpbmZvLT5vdXRwdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICAgICAgaWYgKGJmZF9zZWVrIChmaW5mby0+b3V0cHV0X2JmZCwgc3ltdGFiLT5zaF9vZmZzZXQgKyBzeW10YWItPnNoX3NpemUsCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF93cml0ZSAoKFBUUikgZmluZm8tPnN5bWJ1ZiwgZmluZm8tPnN5bWJ1Zl9jb3VudCwKLQkJCSBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLCBmaW5mby0+b3V0cHV0X2JmZCkKLQkgICAgICAhPSBmaW5mby0+c3ltYnVmX2NvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzeW10YWItPnNoX3NpemUgKz0gZmluZm8tPnN5bWJ1Zl9jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0KLSAgICAgIGZpbmZvLT5zeW1idWZfY291bnQgPSAwOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGFuIGV4dGVybmFsIHN5bWJvbCB0byB0aGUgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgZnJvbQotICAgdGhlIGhhc2ggdGFibGUgdHJhdmVyc2FsIHJvdXRpbmUuICBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LAotICAgd2UgZ28gdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIHR3aWNlLiAgVGhlIGZpcnN0IHRpbWUgd2Ugb3V0cHV0Ci0gICBhbnl0aGluZyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBmb3JjZWQgdG8gbG9jYWwgc2NvcGUgaW4gYSB2ZXJzaW9uCi0gICBzY3JpcHQuICBUaGUgc2Vjb25kIHRpbWUgd2Ugb3V0cHV0IHRoZSBzeW1ib2xzIHRoYXQgYXJlIHN0aWxsCi0gICBnbG9iYWwgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19vdXRwdXRfZXh0c3ltIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGZfb3V0ZXh0X2luZm8gKmVvaW5mbyA9IChzdHJ1Y3QgZWxmX291dGV4dF9pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IGVvaW5mby0+ZmluZm87Ci0gIGJvb2xlYW4gc3RyaXA7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjOwotCi0gIC8qIERlY2lkZSB3aGV0aGVyIHRvIG91dHB1dCB0aGlzIHN5bWJvbCBpbiB0aGlzIHBhc3MuICAqLwotICBpZiAoZW9pbmZvLT5sb2NhbHN5bXMpCi0gICAgewotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMKSA9PSAwKQotCXJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCkgIT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhpcyBzeW1ib2wgaXMKLSAgICAgcmVmZXJlbmNlZCBieSBhIHNoYXJlZCBsaWJyYXJ5IGJ1dCBpcyBub3QgZGVmaW5lZCBhbnl3aGVyZSwgdGhlbgotICAgICB3YXJuIHRoYXQgaXQgaXMgdW5kZWZpbmVkLiAgSWYgd2UgZG8gbm90IGRvIHRoaXMsIHRoZSBydW50aW1lCi0gICAgIGxpbmtlciB3aWxsIGNvbXBsYWluIHRoYXQgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgd2hlbiB0aGUKLSAgICAgcHJvZ3JhbSBpcyBydW4uICBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHN5bWJvbHMgdGhhdCBhcmUKLSAgICAgcmVmZXJlbmNlZCBieSByZWd1bGFyIGZpbGVzLCBiZWNhdXNlIHdlIHdpbGwgYWxyZWFkeSBoYXZlIGlzc3VlZAotICAgICB3YXJuaW5ncyBmb3IgdGhlbS4gICovCi0gIGlmICghIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICEgKGZpbmZvLT5pbmZvLT5zaGFyZWQKLQkgICAgJiYgIWZpbmZvLT5pbmZvLT5ub191bmRlZmluZWQpCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwKQotICAgIHsKLSAgICAgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JICAgICAoZmluZm8tPmluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGgtPnJvb3QudS51bmRlZi5hYmZkLAotCSAgICAgIChhc2VjdGlvbiAqKSBOVUxMLCAwKSkpCi0JewotCSAgZW9pbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogV2UgZG9uJ3Qgd2FudCB0byBvdXRwdXQgc3ltYm9scyB0aGF0IGhhdmUgbmV2ZXIgYmVlbiBtZW50aW9uZWQgYnkKLSAgICAgYSByZWd1bGFyIGZpbGUsIG9yIHRoYXQgd2UgaGF2ZSBiZWVuIHRvbGQgdG8gc3RyaXAuICBIb3dldmVyLCBpZgotICAgICBoLT5pbmR4IGlzIHNldCB0byAtMiwgdGhlIHN5bWJvbCBpcyB1c2VkIGJ5IGEgcmVsb2MgYW5kIHdlIG11c3QKLSAgICAgb3V0cHV0IGl0LiAgKi8KLSAgaWYgKGgtPmluZHggPT0gLTIpCi0gICAgc3RyaXAgPSBmYWxzZTsKLSAgZWxzZSBpZiAoKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCSAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApCi0JICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCi0JICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZSBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgIHx8IChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0JCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZQotICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgLyogSWYgd2UncmUgc3RyaXBwaW5nIGl0LCBhbmQgaXQncyBub3QgYSBkeW5hbWljIHN5bWJvbCwgdGhlcmUncwotICAgICBub3RoaW5nIGVsc2UgdG8gZG8uICAqLwotICBpZiAoc3RyaXAgJiYgaC0+ZHluaW5keCA9PSAtMSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzeW0uc3RfdmFsdWUgPSAwOwotICBzeW0uc3Rfc2l6ZSA9IGgtPnNpemU7Ci0gIHN5bS5zdF9vdGhlciA9IGgtPm90aGVyOwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19GT1JDRURfTE9DQUwpICE9IDApCi0gICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBoLT50eXBlKTsKLSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfV0VBSywgaC0+dHlwZSk7Ci0gIGVsc2UKLSAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBoLT50eXBlKTsKLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgICAgaW5wdXRfc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIHN5bS5zdF9zaG5keCA9IFNITl9VTkRFRjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIGlucHV0X3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBzeW0uc3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgewotCWlucHV0X3NlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQlpZiAoaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCSAgewotCSAgICBzeW0uc3Rfc2huZHggPQotCSAgICAgIF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoZmluZm8tPm91dHB1dF9iZmQsCi0JCQkJCQkgaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgIGlmIChzeW0uc3Rfc2huZHggPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogY291bGQgbm90IGZpbmQgb3V0cHV0IHNlY3Rpb24gJXMgZm9yIGlucHV0IHNlY3Rpb24gJXMiKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoZmluZm8tPm91dHB1dF9iZmQpLAotCQkgICBpbnB1dF9zZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLAotCQkgICBpbnB1dF9zZWMtPm5hbWUpOwotCQllb2luZm8tPmZhaWxlZCA9IHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgLyogRUxGIHN5bWJvbHMgaW4gcmVsb2NhdGVhYmxlIGZpbGVzIGFyZSBzZWN0aW9uIHJlbGF0aXZlLAotCSAgICAgICBidXQgaW4gbm9ucmVsb2NhdGVhYmxlIGZpbGVzIHRoZXkgYXJlIHZpcnR1YWwKLQkgICAgICAgYWRkcmVzc2VzLiAgKi8KLQkgICAgc3ltLnN0X3ZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZSArIGlucHV0X3NlYy0+b3V0cHV0X29mZnNldDsKLQkgICAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgICBzeW0uc3RfdmFsdWUgKz0gaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjLT5vd25lciA9PSBOVUxMCi0JCQl8fCAoaW5wdXRfc2VjLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKTsKLQkgICAgc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOwotCSAgICBpbnB1dF9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgaW5wdXRfc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLSAgICAgIHN5bS5zdF9zaG5keCA9IFNITl9DT01NT047Ci0gICAgICBzeW0uc3RfdmFsdWUgPSAxIDw8IGgtPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgICAgLyogVGhlc2Ugc3ltYm9scyBhcmUgY3JlYXRlZCBieSBzeW1ib2wgdmVyc2lvbmluZy4gIFRoZXkgcG9pbnQKLSAgICAgICAgIHRvIHRoZSBkZWNvcmF0ZWQgdmVyc2lvbiBvZiB0aGUgbmFtZS4gIEZvciBleGFtcGxlLCBpZiB0aGUKLSAgICAgICAgIHN5bWJvbCBmb29AQEdOVV8xLjIgaXMgdGhlIGRlZmF1bHQsIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4KLSAgICAgICAgIGZvbyBpcyB1c2VkIHdpdGggbm8gdmVyc2lvbiwgdGhlbiB3ZSBhZGQgYW4gaW5kaXJlY3Qgc3ltYm9sCi0gICAgICAgICBmb28gd2hpY2ggcG9pbnRzIHRvIGZvb0BAR05VXzEuMi4gIFdlIGlnbm9yZSB0aGVzZSBzeW1ib2xzLAotICAgICAgICAgc2luY2UgdGhlIGluZGlyZWN0ZWQgc3ltYm9sIGlzIGFscmVhZHkgaW4gdGhlIGhhc2ggdGFibGUuICBJZgotICAgICAgICAgdGhlIGluZGlyZWN0IHN5bWJvbCBpcyBub24tRUxGLCBmYWxsIHRocm91Z2ggYW5kIG91dHB1dCBpdC4gICovCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19OT05fRUxGKSA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogV2UgY2FuJ3QgcmVwcmVzZW50IHRoZXNlIHN5bWJvbHMgaW4gRUxGLCBhbHRob3VnaCBhIHdhcm5pbmcKLSAgICAgICAgIHN5bWJvbCBtYXkgaGF2ZSBjb21lIGZyb20gYSAuZ251Lndhcm5pbmcuU1lNQk9MIHNlY3Rpb24uICBXZQotICAgICAgICAganVzdCBwdXQgdGhlIHRhcmdldCBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuICBJZiB0aGUgdGFyZ2V0Ci0gICAgICAgICBzeW1ib2wgZG9lcyBub3QgcmVhbGx5IGV4aXN0LCBkb24ndCBkbyBhbnl0aGluZy4gICovCi0gICAgICBpZiAoaC0+cm9vdC51LmkubGluay0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIHJldHVybiAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bQotCSAgICAgICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluaywgZGF0YSkpOwotICAgIH0KLQotICAvKiBHaXZlIHRoZSBwcm9jZXNzb3IgYmFja2VuZCBhIGNoYW5jZSB0byB0d2VhayB0aGUgc3ltYm9sIHZhbHVlLAotICAgICBhbmQgYWxzbyB0byBmaW5pc2ggdXAgYW55dGhpbmcgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciB0aGlzCi0gICAgIHN5bWJvbC4gICovCi0gIGlmICgoaC0+ZHluaW5keCAhPSAtMQotICAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMKSAhPSAwKQotICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7Ci0KLSAgICAgIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChmaW5mby0+b3V0cHV0X2JmZCk7Ci0gICAgICBpZiAoISAoKCpiZWQtPmVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCkKLQkgICAgIChmaW5mby0+b3V0cHV0X2JmZCwgZmluZm8tPmluZm8sIGgsICZzeW0pKSkKLQl7Ci0JICBlb2luZm8tPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbWFya2luZyB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgYW5kIHRoZXJlIGFyZSBubwotICAgICBub24td2VhayByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sIGZyb20gYSByZWd1bGFyIG9iamVjdCwgdGhlbgotICAgICBtYXJrIHRoZSBzeW1ib2wgYXMgd2VhayB1bmRlZmluZWQ7IGlmIHRoZXJlIGFyZSBub24td2VhawotICAgICByZWZlcmVuY2VzLCBtYXJrIHRoZSBzeW1ib2wgYXMgc3Ryb25nLiAgV2UgY2FuJ3QgZG8gdGhpcyBlYXJsaWVyLAotICAgICBiZWNhdXNlIGl0IG1pZ2h0IG5vdCBiZSBtYXJrZWQgYXMgdW5kZWZpbmVkIHVudGlsIHRoZQotICAgICBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZSBnZXRzIHRocm91Z2ggd2l0aCBpdC4gICovCi0gIGlmIChzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLSAgICAgICYmIChFTEZfU1RfQklORChzeW0uc3RfaW5mbykgPT0gU1RCX0dMT0JBTAotCSAgfHwgRUxGX1NUX0JJTkQoc3ltLnN0X2luZm8pID09IFNUQl9XRUFLKSkKLSAgICB7Ci0gICAgICBpbnQgYmluZHR5cGU7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSykgIT0gMCkKLQliaW5kdHlwZSA9IFNUQl9HTE9CQUw7Ci0gICAgICBlbHNlCi0JYmluZHR5cGUgPSBTVEJfV0VBSzsKLSAgICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKGJpbmR0eXBlLCBFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgc2hvdWxkIGJlIHB1dCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLCB0aGVuIHB1dCBpdAotICAgICB0aGVyZSBub3cuICBXZSBoYXZlIGFscmVhZHkga25vdyB0aGUgc3ltYm9sIGluZGV4LiAgV2UgYWxzbyBmaWxsCi0gICAgIGluIHRoZSBlbnRyeSBpbiB0aGUgLmhhc2ggc2VjdGlvbi4gICovCi0gIGlmIChoLT5keW5pbmR4ICE9IC0xCi0gICAgICAmJiBlbGZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgc2l6ZV90IGJ1Y2tldGNvdW50OwotICAgICAgc2l6ZV90IGJ1Y2tldDsKLSAgICAgIHNpemVfdCBoYXNoX2VudHJ5X3NpemU7Ci0gICAgICBiZmRfYnl0ZSAqYnVja2V0cG9zOwotICAgICAgYmZkX3ZtYSBjaGFpbjsKLQotICAgICAgc3ltLnN0X25hbWUgPSBoLT5keW5zdHJfaW5kZXg7Ci0KLSAgICAgIGVsZl9zd2FwX3N5bWJvbF9vdXQgKGZpbmZvLT5vdXRwdXRfYmZkLCAmc3ltLAotCQkJICAgKFBUUikgKCgoRWxmX0V4dGVybmFsX1N5bSAqKQotCQkJCSAgIGZpbmZvLT5keW5zeW1fc2VjLT5jb250ZW50cykKLQkJCQkgICsgaC0+ZHluaW5keCkpOwotCi0gICAgICBidWNrZXRjb3VudCA9IGVsZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmJ1Y2tldGNvdW50OwotICAgICAgYnVja2V0ID0gaC0+ZWxmX2hhc2hfdmFsdWUgJSBidWNrZXRjb3VudDsKLSAgICAgIGhhc2hfZW50cnlfc2l6ZSAKLQk9IGVsZl9zZWN0aW9uX2RhdGEgKGZpbmZvLT5oYXNoX3NlYyktPnRoaXNfaGRyLnNoX2VudHNpemU7Ci0gICAgICBidWNrZXRwb3MgPSAoKGJmZF9ieXRlICopIGZpbmZvLT5oYXNoX3NlYy0+Y29udGVudHMKLQkJICAgKyAoYnVja2V0ICsgMikgKiBoYXNoX2VudHJ5X3NpemUpOwotICAgICAgY2hhaW4gPSBiZmRfZ2V0ICg4ICogaGFzaF9lbnRyeV9zaXplLCBmaW5mby0+b3V0cHV0X2JmZCwgYnVja2V0cG9zKTsKLSAgICAgIGJmZF9wdXQgKDggKiBoYXNoX2VudHJ5X3NpemUsIGZpbmZvLT5vdXRwdXRfYmZkLCBoLT5keW5pbmR4LCBidWNrZXRwb3MpOwotICAgICAgYmZkX3B1dCAoOCAqIGhhc2hfZW50cnlfc2l6ZSwgZmluZm8tPm91dHB1dF9iZmQsIGNoYWluLAotCSAgICAgICAoKGJmZF9ieXRlICopIGZpbmZvLT5oYXNoX3NlYy0+Y29udGVudHMKLQkJKyAoYnVja2V0Y291bnQgKyAyICsgaC0+ZHluaW5keCkgKiBoYXNoX2VudHJ5X3NpemUpKTsKLQotICAgICAgaWYgKGZpbmZvLT5zeW12ZXJfc2VjICE9IE5VTEwgJiYgZmluZm8tPnN5bXZlcl9zZWMtPmNvbnRlbnRzICE9IE5VTEwpCi0JewotCSAgRWxmX0ludGVybmFsX1ZlcnN5bSBpdmVyc3ltOwotCi0JICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnZlcmluZm8udmVyZGVmID09IE5VTEwpCi0JCWl2ZXJzeW0udnNfdmVycyA9IDA7Ci0JICAgICAgZWxzZQotCQlpdmVyc3ltLnZzX3ZlcnMgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfZXhwX3JlZm5vICsgMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnZlcmluZm8udmVydHJlZSA9PSBOVUxMKQotCQlpdmVyc3ltLnZzX3ZlcnMgPSAxOwotCSAgICAgIGVsc2UKLQkJaXZlcnN5bS52c192ZXJzID0gaC0+dmVyaW5mby52ZXJ0cmVlLT52ZXJudW0gKyAxOwotCSAgICB9Ci0KLQkgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hJRERFTikgIT0gMCkKLQkgICAgaXZlcnN5bS52c192ZXJzIHw9IFZFUlNZTV9ISURERU47Ci0KLQkgIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dCAoZmluZm8tPm91dHB1dF9iZmQsICZpdmVyc3ltLAotCQkJCSAgICAoKChFbGZfRXh0ZXJuYWxfVmVyc3ltICopCi0JCQkJICAgICAgZmluZm8tPnN5bXZlcl9zZWMtPmNvbnRlbnRzKQotCQkJCSAgICAgKyBoLT5keW5pbmR4KSk7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSdyZSBzdHJpcHBpbmcgaXQsIHRoZW4gaXQgd2FzIGp1c3QgYSBkeW5hbWljIHN5bWJvbCwgYW5kCi0gICAgIHRoZXJlJ3Mgbm90aGluZyBlbHNlIHRvIGRvLiAgKi8KLSAgaWYgKHN0cmlwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGgtPmluZHggPSBiZmRfZ2V0X3N5bWNvdW50IChmaW5mby0+b3V0cHV0X2JmZCk7Ci0KLSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsICZzeW0sIGlucHV0X3NlYykpCi0gICAgewotICAgICAgZW9pbmZvLT5mYWlsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSB0aGUgcmVsb2NhdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSBJTlRFUk5BTF9SRUxPQ1MgKHdoaWNoCi0gICBvcmlnaW5hdGVkIGZyb20gdGhlIHNlY3Rpb24gZ2l2ZW4gYnkgSU5QVVRfUkVMX0hEUikgdG8gdGhlCi0gICBPVVRQVVRfQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZl9saW5rX291dHB1dF9yZWxvY3MgKG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGlucHV0X3JlbF9oZHIsIAotCQkJaW50ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaW5wdXRfcmVsX2hkcjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpvdXRwdXRfcmVsX2hkcjsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgKnJlbF9jb3VudHAgPSBOVUxMOwotCi0gIG91dHB1dF9zZWN0aW9uID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0gIG91dHB1dF9yZWxfaGRyID0gTlVMTDsKLQotICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX2VudHNpemUgCi0gICAgICA9PSBpbnB1dF9yZWxfaGRyLT5zaF9lbnRzaXplKQotICAgIHsKLSAgICAgIG91dHB1dF9yZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2hkcjsKLSAgICAgIHJlbF9jb3VudHAgPSAmZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQ7Ci0gICAgfQotICBlbHNlIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oZHIyCi0JICAgJiYgKGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2hkcjItPnNoX2VudHNpemUKLQkgICAgICAgPT0gaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZSkpCi0gICAgewotICAgICAgb3V0cHV0X3JlbF9oZHIgPSBlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oZHIyOwotICAgICAgcmVsX2NvdW50cCA9ICZlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9jb3VudDI7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKG91dHB1dF9yZWxfaGRyICE9IE5VTEwpOwotICAKLSAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gIGlyZWxhZW5kID0gaXJlbGEgKyBpbnB1dF9yZWxfaGRyLT5zaF9zaXplIC8gaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZTsKLSAgaWYgKGlucHV0X3JlbF9oZHItPnNoX2VudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsKSkKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsOwotCi0gICAgICBlcmVsID0gKChFbGZfRXh0ZXJuYWxfUmVsICopIG91dHB1dF9yZWxfaGRyLT5jb250ZW50cyArICpyZWxfY291bnRwKTsKLSAgICAgIGZvciAoOyBpcmVsYSA8IGlyZWxhZW5kOyBpcmVsYSsrLCBlcmVsKyspCi0JewotCSAgRWxmX0ludGVybmFsX1JlbCBpcmVsOwotCi0JICBpcmVsLnJfb2Zmc2V0ID0gaXJlbGEtPnJfb2Zmc2V0OwotCSAgaXJlbC5yX2luZm8gPSBpcmVsYS0+cl9pbmZvOwotCSAgQkZEX0FTU0VSVCAoaXJlbGEtPnJfYWRkZW5kID09IDApOwotCSAgZWxmX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmaXJlbCwgZXJlbCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKLQotICAgICAgQkZEX0FTU0VSVCAoaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZQotCQkgID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKTsKLSAgICAgIGVyZWxhID0gKChFbGZfRXh0ZXJuYWxfUmVsYSAqKSBvdXRwdXRfcmVsX2hkci0+Y29udGVudHMgKyAqcmVsX2NvdW50cCk7Ci0gICAgICBmb3IgKDsgaXJlbGEgPCBpcmVsYWVuZDsgaXJlbGErKywgZXJlbGErKykKLQllbGZfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCBpcmVsYSwgZXJlbGEpOwotICAgIH0KLQotICAvKiBCdW1wIHRoZSBjb3VudGVyLCBzbyB0aGF0IHdlIGtub3cgd2hlcmUgdG8gYWRkIHRoZSBuZXh0IHNldCBvZgotICAgICByZWxvY2F0aW9ucy4gICovCi0gICpyZWxfY291bnRwICs9IGlucHV0X3JlbF9oZHItPnNoX3NpemUgLyBpbnB1dF9yZWxfaGRyLT5zaF9lbnRzaXplOwotfQotCi0vKiBMaW5rIGFuIGlucHV0IGZpbGUgaW50byB0aGUgbGlua2VyIG91dHB1dCBmaWxlLiAgVGhpcyBmdW5jdGlvbgotICAgaGFuZGxlcyBhbGwgdGhlIHNlY3Rpb25zIGFuZCByZWxvY2F0aW9ucyBvZiB0aGUgaW5wdXQgZmlsZSBhdCBvbmNlLgotICAgVGhpcyBpcyBzbyB0aGF0IHdlIG9ubHkgaGF2ZSB0byByZWFkIHRoZSBsb2NhbCBzeW1ib2xzIG9uY2UsIGFuZAotICAgZG9uJ3QgaGF2ZSB0byBrZWVwIHRoZW0gaW4gbWVtb3J5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2lucHV0X2JmZCAoZmluZm8sIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgYm9vbGVhbiAoKnJlbG9jYXRlX3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkJCQkgICAgICAgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkJCQkgICAgICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzaXplX3QgbG9jc3ltY291bnQ7Ci0gIHNpemVfdCBleHRzeW1vZmY7Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXM7Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmVzeW07Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmVzeW1lbmQ7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKmlzeW07Ci0gIGxvbmcgKnBpbmRleDsKLSAgYXNlY3Rpb24gKipwcHNlY3Rpb247Ci0gIGFzZWN0aW9uICpvOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKG91dHB1dF9iZmQpOwotICByZWxvY2F0ZV9zZWN0aW9uID0gYmVkLT5lbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uOwotCi0gIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIG9iamVjdCwgd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyBoZXJlOgotICAgICB3ZSBkb24ndCB3YW50IHRoZSBsb2NhbCBzeW1ib2xzLCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGUgc2VjdGlvbgotICAgICBjb250ZW50cy4gICovCi0gIGlmICgoaW5wdXRfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIGlmIChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKSkKLSAgICB7Ci0gICAgICBsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotICAgICAgZXh0c3ltb2ZmID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBleHRzeW1vZmYgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBsb2NhbCBzeW1ib2xzLiAgKi8KLSAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0gICAgZXh0ZXJuYWxfc3ltcyA9IChFbGZfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICBlbHNlIGlmIChsb2NzeW1jb3VudCA9PSAwKQotICAgIGV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgZXh0ZXJuYWxfc3ltcyA9IGZpbmZvLT5leHRlcm5hbF9zeW1zOwotICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfcmVhZCAoZXh0ZXJuYWxfc3ltcywgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwKLQkJCWxvY3N5bWNvdW50LCBpbnB1dF9iZmQpCi0JICAgICAgIT0gbG9jc3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFN3YXAgaW4gdGhlIGxvY2FsIHN5bWJvbHMgYW5kIHdyaXRlIG91dCB0aGUgb25lcyB3aGljaCB3ZSBrbm93Ci0gICAgIGFyZSBnb2luZyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGVzeW0gPSBleHRlcm5hbF9zeW1zOwotICBlc3ltZW5kID0gZXN5bSArIGxvY3N5bWNvdW50OwotICBpc3ltID0gZmluZm8tPmludGVybmFsX3N5bXM7Ci0gIHBpbmRleCA9IGZpbmZvLT5pbmRpY2VzOwotICBwcHNlY3Rpb24gPSBmaW5mby0+c2VjdGlvbnM7Ci0gIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpc3ltKyssIHBpbmRleCsrLCBwcHNlY3Rpb24rKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqaXNlYzsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIG9zeW07Ci0KLSAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltKTsKLSAgICAgICpwaW5kZXggPSAtMTsKLQotICAgICAgaWYgKGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpKQotCXsKLQkgIGlmIChFTEZfU1RfQklORCAoaXN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgICB7Ci0JICAgICAgKnBwc2VjdGlvbiA9IE5VTEw7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChpc3ltLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JaXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlIGlmIChpc3ltLT5zdF9zaG5keCA+IDAgJiYgaXN5bS0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCWlzZWMgPSBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW0tPnN0X3NobmR4KTsKLSAgICAgIGVsc2UgaWYgKGlzeW0tPnN0X3NobmR4ID09IFNITl9BQlMpCi0JaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlIGlmIChpc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCWlzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFdobyBrbm93cz8gICovCi0JICBpc2VjID0gTlVMTDsKLQl9Ci0KLSAgICAgICpwcHNlY3Rpb24gPSBpc2VjOwotCi0gICAgICAvKiBEb24ndCBvdXRwdXQgdGhlIGZpcnN0LCB1bmRlZmluZWQsIHN5bWJvbC4gICovCi0gICAgICBpZiAoZXN5bSA9PSBleHRlcm5hbF9zeW1zKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgc3RyaXBwaW5nIGFsbCBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IHRvIG91dHB1dCB0aGlzCi0JIG9uZS4gICovCi0gICAgICBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgbmV2ZXIgb3V0cHV0IHNlY3Rpb24gc3ltYm9scy4gIEluc3RlYWQsIHdlIHVzZSB0aGUgc2VjdGlvbgotCSBzeW1ib2wgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICAgICAgaWYgKEVMRl9TVF9UWVBFIChpc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgd2UgYXJlIGRpc2NhcmRpbmcgYWxsIGxvY2FsIHN5bWJvbHMsIHdlIGRvbid0IHdhbnQgdG8KLQkgb3V0cHV0IHRoaXMgb25lLiAgSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0Ci0JIGZpbGUsIHRoZW4gc29tZSBvZiB0aGUgbG9jYWwgc3ltYm9scyBtYXkgYmUgcmVxdWlyZWQgYnkKLQkgcmVsb2NzOyB3ZSBvdXRwdXQgdGhlbSBiZWxvdyBhcyB3ZSBkaXNjb3ZlciB0aGF0IHRoZXkgYXJlCi0JIG5lZWRlZC4gICovCi0gICAgICBpZiAoZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gYSBzZWN0aW9uIHdoaWNoIHdlIGFyZQotICAgICAgICAgZGlzY2FyZGluZywgd2UgZG9uJ3QgbmVlZCB0byBrZWVwIGl0LCBidXQgbm90ZSB0aGF0Ci0gICAgICAgICBsaW5rZXJfbWFyayBpcyBvbmx5IHJlbGlhYmxlIGZvciBzZWN0aW9ucyB0aGF0IGhhdmUgY29udGVudHMuCi0gICAgICAgICBGb3IgdGhlIGJlbmVmaXQgb2YgdGhlIE1JUFMgRUxGIGxpbmtlciwgd2UgY2hlY2sgU0VDX0VYQ0xVREUKLSAgICAgICAgIGFzIHdlbGwgYXMgbGlua2VyX21hcmsuICAqLwotICAgICAgaWYgKGlzeW0tPnN0X3NobmR4ID4gMAotCSAgJiYgaXN5bS0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFCi0JICAmJiBpc2VjICE9IE5VTEwKLQkgICYmICgoISBpc2VjLT5saW5rZXJfbWFyayAmJiAoaXNlYy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCSAgICAgIHx8ICghIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUKLQkJICAmJiAoaXNlYy0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkgIT0gMCkpKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC4gICovCi0gICAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkgICAgICBpc3ltLT5zdF9uYW1lKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTZWUgaWYgd2UgYXJlIGRpc2NhcmRpbmcgc3ltYm9scyB3aXRoIHRoaXMgbmFtZS4gICovCi0gICAgICBpZiAoKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKQotCSAgICAgICA9PSBOVUxMKSkKLQkgIHx8IChmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wKLQkgICAgICAmJiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoaW5wdXRfYmZkLCBuYW1lKSkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHdlIGdldCBoZXJlLCB3ZSBhcmUgZ29pbmcgdG8gb3V0cHV0IHRoaXMgc3ltYm9sLiAgKi8KLQotICAgICAgb3N5bSA9ICppc3ltOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIHNlY3Rpb24gaW5kZXggZm9yIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gICAgICBvc3ltLnN0X3NobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChvdXRwdXRfYmZkLAotCQkJCQkJCSBpc2VjLT5vdXRwdXRfc2VjdGlvbik7Ci0gICAgICBpZiAob3N5bS5zdF9zaG5keCA9PSAodW5zaWduZWQgc2hvcnQpIC0xKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgKnBpbmRleCA9IGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOwotCi0gICAgICAvKiBFTEYgc3ltYm9scyBpbiByZWxvY2F0ZWFibGUgZmlsZXMgYXJlIHNlY3Rpb24gcmVsYXRpdmUsIGJ1dAotCSBpbiBleGVjdXRhYmxlIGZpbGVzIHRoZXkgYXJlIHZpcnR1YWwgYWRkcmVzc2VzLiAgTm90ZSB0aGF0Ci0JIHRoaXMgY29kZSBhc3N1bWVzIHRoYXQgYWxsIEVMRiBzZWN0aW9ucyBoYXZlIGFuIGFzc29jaWF0ZWQKLQkgQkZEIHNlY3Rpb24gd2l0aCBhIHJlYXNvbmFibGUgdmFsdWUgZm9yIG91dHB1dF9vZmZzZXQ7IGJlbG93Ci0JIHdlIGFzc3VtZSB0aGF0IHRoZXkgYWxzbyBoYXZlIGEgcmVhc29uYWJsZSB2YWx1ZSBmb3IKLQkgb3V0cHV0X3NlY3Rpb24uICBBbnkgc3BlY2lhbCBzZWN0aW9ucyBtdXN0IGJlIHNldCB1cCB0byBtZWV0Ci0JIHRoZXNlIHJlcXVpcmVtZW50cy4gICovCi0gICAgICBvc3ltLnN0X3ZhbHVlICs9IGlzZWMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQotCW9zeW0uc3RfdmFsdWUgKz0gaXNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIG5hbWUsICZvc3ltLCBpc2VjKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFJlbG9jYXRlIHRoZSBjb250ZW50cyBvZiBlYWNoIHNlY3Rpb24uICAqLwotICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50czsKLQotICAgICAgaWYgKCEgby0+bGlua2VyX21hcmspCi0JewotCSAgLyogVGhpcyBzZWN0aW9uIHdhcyBvbWl0dGVkIGZyb20gdGhlIGxpbmsuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgfHwgKG8tPl9yYXdfc2l6ZSA9PSAwICYmIChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpICE9IDApCi0JewotCSAgLyogU2VjdGlvbiB3YXMgY3JlYXRlZCBieSBlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotCSAgICAgb3Igc29tZXN1Y2guICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uLiAgVGhleSBoYXZlIGJlZW4gY2FjaGVkIGJ5IGEKLSAgICAgICAgIHJlbGF4YXRpb24gcm91dGluZS4gIE5vdGUgdGhhdCBvIGlzIGEgc2VjdGlvbiBpbiBhbiBpbnB1dAotICAgICAgICAgZmlsZSwgc28gdGhlIGNvbnRlbnRzIGZpZWxkIHdpbGwgbm90IGhhdmUgYmVlbiBzZXQgYnkgYW55IG9mCi0gICAgICAgICB0aGUgcm91dGluZXMgd2hpY2ggd29yayBvbiBvdXRwdXQgZmlsZXMuICAqLwotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQotCWNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIGNvbnRlbnRzID0gZmluZm8tPmNvbnRlbnRzOwotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIG8sIGNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwgby0+X3Jhd19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotCi0JICAvKiBHZXQgdGhlIHN3YXBwZWQgcmVsb2NzLiAgKi8KLQkgIGludGVybmFsX3JlbG9jcyA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JCQkgICAgIChpbnB1dF9iZmQsIG8sIGZpbmZvLT5leHRlcm5hbF9yZWxvY3MsCi0JCQkgICAgICBmaW5mby0+aW50ZXJuYWxfcmVsb2NzLCBmYWxzZSkpOwotCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMCi0JICAgICAgJiYgby0+cmVsb2NfY291bnQgPiAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFJlbG9jYXRlIHRoZSBzZWN0aW9uIGJ5IGludm9raW5nIGEgYmFjayBlbmQgcm91dGluZS4KLQotCSAgICAgVGhlIGJhY2sgZW5kIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdGluZyB0aGUKLQkgICAgIHNlY3Rpb24gY29udGVudHMgYXMgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzCi0JICAgICBhbmQgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZQotCSAgICAgcmVsb2MgYWRkZW5kIGFzIG5lY2Vzc2FyeS4KLQotCSAgICAgVGhlIGJhY2sgZW5kIHJvdXRpbmUgZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nCi0JICAgICB0aGUgcmVsb2MgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0JICAgICBUaGUgYmFjayBlbmQgcm91dGluZSBpcyBnaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgaW4KLQkgICAgIGludGVybmFsIHN5bWJvbHMsIGFuZCBjYW4gYWNjZXNzIHRoZSBoYXNoIHRhYmxlIGVudHJpZXMKLQkgICAgIGZvciB0aGUgZXh0ZXJuYWwgc3ltYm9scyB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCi0KLQkgICAgIFdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGUgYmFjayBlbmQgcm91dGluZQotCSAgICAgbXVzdCBoYW5kbGUgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlCi0JICAgICBvdXRwdXQgc3ltYm9sIGlzIGdvaW5nIHRvIGJlIGEgc2VjdGlvbiBzeW1ib2wKLQkgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dCBzZWN0aW9uLCB3aGljaCB3aWxsIHJlcXVpcmUKLQkgICAgIHRoZSBhZGRlbmQgdG8gYmUgYWRqdXN0ZWQuICAqLwotCi0JICBpZiAoISAoKnJlbG9jYXRlX3NlY3Rpb24pIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkgICAgIGlucHV0X2JmZCwgbywgY29udGVudHMsCi0JCQkJICAgICBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJICAgICBmaW5mby0+aW50ZXJuYWxfc3ltcywKLQkJCQkgICAgIGZpbmZvLT5zZWN0aW9ucykpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGE7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhZW5kOwotCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0JICAgICAgRWxmX0ludGVybmFsX1NoZHIgKmlucHV0X3JlbF9oZHI7Ci0KLQkgICAgICAvKiBBZGp1c3QgdGhlIHJlbG9jIGFkZHJlc3NlcyBhbmQgc3ltYm9sIGluZGljZXMuICAqLwotCi0JICAgICAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICAgICAgaXJlbGFlbmQgPSAKLQkJaXJlbGEgKyBvLT5yZWxvY19jb3VudCAqIGJlZC0+cy0+aW50X3JlbHNfcGVyX2V4dF9yZWw7Ci0JICAgICAgcmVsX2hhc2ggPSAoZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT5yZWxfaGFzaGVzCi0JCQkgICsgZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQKLQkJCSAgKyBlbGZfc2VjdGlvbl9kYXRhIChvLT5vdXRwdXRfc2VjdGlvbiktPnJlbF9jb3VudDIpOwotCSAgICAgIGZvciAoOyBpcmVsYSA8IGlyZWxhZW5kOyBpcmVsYSsrLCByZWxfaGFzaCsrKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLQkJICBFbGZfSW50ZXJuYWxfU3ltICppc3ltOwotCQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkJICBpcmVsYS0+cl9vZmZzZXQgKz0gby0+b3V0cHV0X29mZnNldDsKLQotCQkgIHJfc3ltbmR4ID0gRUxGX1JfU1lNIChpcmVsYS0+cl9pbmZvKTsKLQotCQkgIGlmIChyX3N5bW5keCA9PSAwKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAocl9zeW1uZHggPj0gbG9jc3ltY291bnQKLQkJICAgICAgfHwgKGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpCi0JCQkgICYmIGZpbmZvLT5zZWN0aW9uc1tyX3N5bW5keF0gPT0gTlVMTCkpCi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpyaDsKLQkJICAgICAgbG9uZyBpbmR4OwotCi0JCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbC4gIFdlCi0JCQkgaGF2ZSBub3QgeWV0IG91dHB1dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMsIHNvCi0JCQkgd2UgZG8gbm90IGtub3cgdGhlIHN5bWJvbCBpbmRleCBvZiBhbnkgZ2xvYmFsCi0JCQkgc3ltYm9sLiAgV2Ugc2V0IHRoZSByZWxfaGFzaCBlbnRyeSBmb3IgdGhpcwotCQkJIHJlbG9jIHRvIHBvaW50IHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeQotCQkJIGZvciB0aGlzIHN5bWJvbC4gIFRoZSBzeW1ib2wgaW5kZXggaXMgdGhlbgotCQkJIHNldCBhdCB0aGUgZW5kIG9mIGVsZl9iZmRfZmluYWxfbGluay4gICovCi0JCSAgICAgIGluZHggPSByX3N5bW5keCAtIGV4dHN5bW9mZjsKLQkJICAgICAgcmggPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKLQkJICAgICAgd2hpbGUgKHJoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkJICAgICB8fCByaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkJCXJoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIHJoLT5yb290LnUuaS5saW5rOwotCi0JCSAgICAgIC8qIFNldHRpbmcgdGhlIGluZGV4IHRvIC0yIHRlbGxzCi0JCQkgZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSB0aGF0IHRoaXMgc3ltYm9sIGlzCi0JCQkgdXNlZCBieSBhIHJlbG9jLiAgKi8KLQkJICAgICAgQkZEX0FTU0VSVCAocmgtPmluZHggPCAwKTsKLQkJICAgICAgcmgtPmluZHggPSAtMjsKLQotCQkgICAgICAqcmVsX2hhc2ggPSByaDsKLQotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQotCQkgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLiAqLwotCi0JCSAgKnJlbF9oYXNoID0gTlVMTDsKLQkJICBpc3ltID0gZmluZm8tPmludGVybmFsX3N5bXMgKyByX3N5bW5keDsKLQkJICBzZWMgPSBmaW5mby0+c2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIGlmIChFTEZfU1RfVFlQRSAoaXN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCSAgICB7Ci0JCSAgICAgIC8qIEkgc3VwcG9zZSB0aGUgYmFja2VuZCBvdWdodCB0byBmaWxsIGluIHRoZQotCQkJIHNlY3Rpb24gb2YgYW55IFNUVF9TRUNUSU9OIHN5bWJvbCBhZ2FpbnN0IGEKLQkJCSBwcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbi4gIElmIHdlIGhhdmUKLQkJCSBkaXNjYXJkZWQgYSBzZWN0aW9uLCB0aGUgb3V0cHV0X3NlY3Rpb24gd2lsbAotCQkJIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgKi8KLQkJICAgICAgaWYgKHNlYyAhPSBOVUxMCi0JCQkgICYmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLQkJCSAgICAgIHx8IChzZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkJCQkgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjLT5vdXRwdXRfc2VjdGlvbikpKSkKLQkJCXJfc3ltbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJewotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHJfc3ltbmR4ID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCQkJICBCRkRfQVNTRVJUIChyX3N5bW5keCAhPSAwKTsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChmaW5mby0+aW5kaWNlc1tyX3N5bW5keF0gPT0gLTEpCi0JCQl7Ci0JCQkgIHVuc2lnbmVkIGxvbmcgbGluazsKLQkJCSAgY29uc3QgY2hhciAqbmFtZTsKLQkJCSAgYXNlY3Rpb24gKm9zZWM7Ci0KLQkJCSAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0JCQkgICAgewotCQkJICAgICAgLyogWW91IGNhbid0IGRvIGxkIC1yIC1zLiAgKi8KLQkJCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCQkgICAgfQotCi0JCQkgIC8qIFRoaXMgc3ltYm9sIHdhcyBza2lwcGVkIGVhcmxpZXIsIGJ1dAotCQkJICAgICBzaW5jZSBpdCBpcyBuZWVkZWQgYnkgYSByZWxvYywgd2UKLQkJCSAgICAgbXVzdCBvdXRwdXQgaXQgbm93LiAgKi8KLQkJCSAgbGluayA9IHN5bXRhYl9oZHItPnNoX2xpbms7Ci0JCQkgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJCSAgbGluaywKLQkJCQkJCQkJICBpc3ltLT5zdF9uYW1lKTsKLQkJCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJCSAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JCQkgIGlzeW0tPnN0X3NobmR4ID0KLQkJCSAgICBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKG91dHB1dF9iZmQsCi0JCQkJCQkJICAgICAgIG9zZWMpOwotCQkJICBpZiAoaXN5bS0+c3Rfc2huZHggPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJCSAgaXN5bS0+c3RfdmFsdWUgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotCQkJICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQotCQkJICAgIGlzeW0tPnN0X3ZhbHVlICs9IG9zZWMtPnZtYTsKLQotCQkJICBmaW5mby0+aW5kaWNlc1tyX3N5bW5keF0gPSBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKLQotCQkJICBpZiAoISBlbGZfbGlua19vdXRwdXRfc3ltIChmaW5mbywgbmFtZSwgaXN5bSwgc2VjKSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJICAgICAgcl9zeW1uZHggPSBmaW5mby0+aW5kaWNlc1tyX3N5bW5keF07Ci0JCSAgICB9Ci0KLQkJICBpcmVsYS0+cl9pbmZvID0gRUxGX1JfSU5GTyAocl9zeW1uZHgsCi0JCQkJCSAgICAgIEVMRl9SX1RZUEUgKGlyZWxhLT5yX2luZm8pKTsKLQkJfQotCi0JICAgICAgLyogU3dhcCBvdXQgdGhlIHJlbG9jcy4gICovCi0JICAgICAgaW5wdXRfcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjsKLQkgICAgICBlbGZfbGlua19vdXRwdXRfcmVsb2NzIChvdXRwdXRfYmZkLCBvLCAKLQkJCQkgICAgICBpbnB1dF9yZWxfaGRyLAotCQkJCSAgICAgIGludGVybmFsX3JlbG9jcyk7Ci0JICAgICAgaW50ZXJuYWxfcmVsb2NzIAotCQkrPSBpbnB1dF9yZWxfaGRyLT5zaF9zaXplIC8gaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZTsKLQkgICAgICBpbnB1dF9yZWxfaGRyID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHIyOwotCSAgICAgIGlmIChpbnB1dF9yZWxfaGRyKQotCQllbGZfbGlua19vdXRwdXRfcmVsb2NzIChvdXRwdXRfYmZkLCBvLCAKLQkJCQkJaW5wdXRfcmVsX2hkciwKLQkJCQkJaW50ZXJuYWxfcmVsb2NzKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBtb2RpZmllZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JewotCSAgaWYgKCEgKG8tPmZsYWdzICYgU0VDX0VYQ0xVREUpICYmCi0JICAgICAgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCQkgIGNvbnRlbnRzLCBvLT5vdXRwdXRfb2Zmc2V0LAotCQkJCQkgIChvLT5fY29va2VkX3NpemUgIT0gMAotCQkJCQkgICA/IG8tPl9jb29rZWRfc2l6ZQotCQkJCQkgICA6IG8tPl9yYXdfc2l6ZSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKLQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+c3RhYl9pbmZvLAotCQkgIG8sICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+c3RhYl9pbmZvLCBjb250ZW50cykpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2VuZXJhdGUgYSByZWxvYyB3aGVuIGxpbmtpbmcgYW4gRUxGIGZpbGUuICBUaGlzIGlzIGEgcmVsb2MKLSAgIHJlcXVlc3RlZCBieSB0aGUgbGlua2VyLCBhbmQgZG9lcyBjb21lIGZyb20gYW55IGlucHV0IGZpbGUuICBUaGlzCi0gICBpcyB1c2VkIHRvIGJ1aWxkIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIHRhYmxlcyB3aGVuIGxpbmtpbmcKLSAgIHdpdGggLVVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBsb25nIGluZHg7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBiZmRfdm1hIGFkZGVuZDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaF9wdHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotCi0gIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnJlbG9jKTsKLSAgaWYgKGhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGFkZGVuZCA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIHN5bWJvbCBpbmRleC4gICovCi0gIHJlbF9oYXNoX3B0ciA9IChlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oYXNoZXMKLQkJICArIGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50Ci0JCSAgKyBlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9jb3VudDIpOwotICBpZiAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyKQotICAgIHsKLSAgICAgIGluZHggPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgQkZEX0FTU0VSVCAoaW5keCAhPSAwKTsKLSAgICAgICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBUcmVhdCBhIHJlbG9jIGFnYWluc3QgYSBkZWZpbmVkIHN5bWJvbCBhcyB0aG91Z2ggaXQgd2VyZQotICAgICAgICAgYWN0dWFsbHkgYWdhaW5zdCB0aGUgc2VjdGlvbi4gICovCi0gICAgICBoID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotCSAgc2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIGluZHggPSBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgKnJlbF9oYXNoX3B0ciA9IE5VTEw7Ci0JICAvKiBJdCBzZWVtcyB0aGF0IHdlIG91Z2h0IHRvIGFkZCB0aGUgc3ltYm9sIHZhbHVlIHRvIHRoZQotICAgICAgICAgICAgIGFkZGVuZCBoZXJlLCBidXQgaW4gcHJhY3RpY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZAotICAgICAgICAgICAgIGJlY2F1c2UgaXQgd2FzIHBhc3NlZCB0byBjb25zdHJ1Y3Rvcl9jYWxsYmFjay4gICovCi0JICBhZGRlbmQgKz0gc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCXsKLQkgIC8qIFNldHRpbmcgdGhlIGluZGV4IHRvIC0yIHRlbGxzIGVsZl9saW5rX291dHB1dF9leHRzeW0gdGhhdAotCSAgICAgdGhpcyBzeW1ib2wgaXMgdXNlZCBieSBhIHJlbG9jLiAgKi8KLQkgIGgtPmluZHggPSAtMjsKLQkgICpyZWxfaGFzaF9wdHIgPSBoOwotCSAgaW5keCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJIChpbmZvLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwgKGJmZCAqKSBOVUxMLAotCQkgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpbmR4ID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYW4gaW5wbGFjZSByZWxvYywgd2UgbXVzdCB3cml0ZSB0aGUgYWRkZW5kIGludG8gdGhlCi0gICAgIG9iamVjdCBmaWxlLiAgKi8KLSAgaWYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgJiYgYWRkZW5kICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfem1hbGxvYyAoc2l6ZSk7Ci0gICAgICBpZiAoYnVmID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIG91dHB1dF9iZmQsIGFkZGVuZCwgYnVmKTsKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sCi0JCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJICAgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uKQotCQkgICA6IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lKSwKLQkJICBob3d0by0+bmFtZSwgYWRkZW5kLCAoYmZkICopIE5VTEwsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkgIChiZmRfdm1hKSAwKSkpCi0JICAgIHsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLCAoUFRSKSBidWYsCi0JCQkJICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwgc2l6ZSk7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgaWYgKCEgb2spCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgYWRkcmVzcyBvZiBhIHJlbG9jIGlzIHJlbGF0aXZlIHRvIHRoZSBzZWN0aW9uIGluIGEKLSAgICAgcmVsb2NhdGVhYmxlIGZpbGUsIGFuZCBpcyBhIHZpcnR1YWwgYWRkcmVzcyBpbiBhbiBleGVjdXRhYmxlCi0gICAgIGZpbGUuICAqLwotICBvZmZzZXQgPSBsaW5rX29yZGVyLT5vZmZzZXQ7Ci0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICBvZmZzZXQgKz0gb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICByZWxfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2hkcjsKLQotICBpZiAocmVsX2hkci0+c2hfdHlwZSA9PSBTSFRfUkVMKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgaXJlbDsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7Ci0KLSAgICAgIGlyZWwucl9vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICBpcmVsLnJfaW5mbyA9IEVMRl9SX0lORk8gKGluZHgsIGhvd3RvLT50eXBlKTsKLSAgICAgIGVyZWwgPSAoKEVsZl9FeHRlcm5hbF9SZWwgKikgcmVsX2hkci0+Y29udGVudHMKLQkgICAgICArIGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2NvdW50KTsKLSAgICAgIGVsZl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJmlyZWwsIGVyZWwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIGlyZWxhOwotICAgICAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhOwotCi0gICAgICBpcmVsYS5yX29mZnNldCA9IG9mZnNldDsKLSAgICAgIGlyZWxhLnJfaW5mbyA9IEVMRl9SX0lORk8gKGluZHgsIGhvd3RvLT50eXBlKTsKLSAgICAgIGlyZWxhLnJfYWRkZW5kID0gYWRkZW5kOwotICAgICAgZXJlbGEgPSAoKEVsZl9FeHRlcm5hbF9SZWxhICopIHJlbF9oZHItPmNvbnRlbnRzCi0JICAgICAgICsgZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQpOwotICAgICAgZWxmX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJmlyZWxhLCBlcmVsYSk7Ci0gICAgfQotCi0gICsrZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfY291bnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIEFsbG9jYXRlIGEgcG9pbnRlciB0byBsaXZlIGluIGEgbGlua2VyIGNyZWF0ZWQgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLWVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgbHNlY3QsIGgsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLXsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKipwdHJfbGlua2VyX3NlY3Rpb25fcHRyID0gTlVMTDsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKmxpbmtlcl9zZWN0aW9uX3B0cjsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keCA9IEVMRl9SX1NZTSAocmVsLT5yX2luZm8pOzsKLQotICBCRkRfQVNTRVJUIChsc2VjdCAhPSBOVUxMKTsKLQotICAvKiBJcyB0aGlzIGEgZ2xvYmFsIHN5bWJvbD8gKi8KLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBIYXMgdGhpcyBzeW1ib2wgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCwgaWYgc28sIG91ciB3b3JrIGlzIGRvbmUgKi8KLSAgICAgIGlmIChfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGgtPmxpbmtlcl9zZWN0aW9uX3BvaW50ZXIsCi0JCQkJCQlyZWwtPnJfYWRkZW5kLAotCQkJCQkJbHNlY3QtPndoaWNoKSkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgcHRyX2xpbmtlcl9zZWN0aW9uX3B0ciA9ICZoLT5saW5rZXJfc2VjdGlvbl9wb2ludGVyOwotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGVsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24pCi0JbHNlY3QtPnJlbF9zZWN0aW9uLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgfQotCi0gIGVsc2UgIC8qIEFsbG9jYXRpb24gb2YgYSBwb2ludGVyIHRvIGEgbG9jYWwgc3ltYm9sICovCi0gICAgewotICAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKipwdHIgPSBlbGZfbG9jYWxfcHRyX29mZnNldHMgKGFiZmQpOwotCi0gICAgICAvKiBBbGxvY2F0ZSBhIHRhYmxlIHRvIGhvbGQgdGhlIGxvY2FsIHN5bWJvbHMgaWYgZmlyc3QgdGltZSAqLwotICAgICAgaWYgKCFwdHIpCi0JewotCSAgdW5zaWduZWQgaW50IG51bV9zeW1ib2xzID0gZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9pbmZvOwotCSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLQkgIHB0ciA9IChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKikKLQkgICAgYmZkX2FsbG9jIChhYmZkLCBudW1fc3ltYm9scyAqIHNpemVvZiAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKikpOwotCi0JICBpZiAoIXB0cikKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBlbGZfbG9jYWxfcHRyX29mZnNldHMgKGFiZmQpID0gcHRyOwotCSAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1ib2xzOyBpKyspCi0JICAgIHB0cltpXSA9IChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKTA7Ci0JfQotCi0gICAgICAvKiBIYXMgdGhpcyBzeW1ib2wgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCwgaWYgc28sIG91ciB3b3JrIGlzIGRvbmUgKi8KLSAgICAgIGlmIChfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKHB0cltyX3N5bW5keF0sCi0JCQkJCQlyZWwtPnJfYWRkZW5kLAotCQkJCQkJbHNlY3QtPndoaWNoKSkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgcHRyX2xpbmtlcl9zZWN0aW9uX3B0ciA9ICZwdHJbcl9zeW1uZHhdOwotCi0gICAgICBpZiAoaW5mby0+c2hhcmVkKQotCXsKLQkgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbmVlZCB0bwotCSAgICAgb3V0cHV0IGEgUl88eHh4Pl9SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZQotCSAgICAgZHluYW1pYyBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JICBCRkRfQVNTRVJUIChsc2VjdC0+cmVsX3NlY3Rpb24gIT0gTlVMTCk7Ci0JICBsc2VjdC0+cmVsX3NlY3Rpb24tPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKTsKLQl9Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIHBvaW50ZXIgaW4gdGhlIGxpbmtlciBzZWN0aW9uLCBhbmQgYWxsb2NhdGUgYSBuZXcgcG9pbnRlciByZWNvcmQKLSAgICAgZnJvbSBpbnRlcm5hbCBtZW1vcnkuICAqLwotICBCRkRfQVNTRVJUIChwdHJfbGlua2VyX3NlY3Rpb25fcHRyICE9IE5VTEwpOwotICBsaW5rZXJfc2VjdGlvbl9wdHIgPSAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QpKTsKLQotICBpZiAoIWxpbmtlcl9zZWN0aW9uX3B0cikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbGlua2VyX3NlY3Rpb25fcHRyLT5uZXh0ID0gKnB0cl9saW5rZXJfc2VjdGlvbl9wdHI7Ci0gIGxpbmtlcl9zZWN0aW9uX3B0ci0+YWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLSAgbGlua2VyX3NlY3Rpb25fcHRyLT53aGljaCA9IGxzZWN0LT53aGljaDsKLSAgbGlua2VyX3NlY3Rpb25fcHRyLT53cml0dGVuX2FkZHJlc3NfcCA9IGZhbHNlOwotICAqcHRyX2xpbmtlcl9zZWN0aW9uX3B0ciA9IGxpbmtlcl9zZWN0aW9uX3B0cjsKLQotI2lmIDAKLSAgaWYgKGxzZWN0LT5ob2xlX3NpemUgJiYgbHNlY3QtPmhvbGVfb2Zmc2V0IDwgbHNlY3QtPm1heF9ob2xlX29mZnNldCkKLSAgICB7Ci0gICAgICBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCA9IGxzZWN0LT5zZWN0aW9uLT5fcmF3X3NpemUgLSBsc2VjdC0+aG9sZV9zaXplICsgKEFSQ0hfU0laRSAvIDgpOwotICAgICAgbHNlY3QtPmhvbGVfb2Zmc2V0ICs9IEFSQ0hfU0laRSAvIDg7Ci0gICAgICBsc2VjdC0+c3ltX29mZnNldCAgKz0gQVJDSF9TSVpFIC8gODsKLSAgICAgIGlmIChsc2VjdC0+c3ltX2hhc2gpCS8qIEJ1bXAgdXAgc3ltYm9sIHZhbHVlIGlmIG5lZWRlZCAqLwotCXsKLQkgIGxzZWN0LT5zeW1faGFzaC0+cm9vdC51LmRlZi52YWx1ZSArPSBBUkNIX1NJWkUgLyA4OwotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJCdW1wIHVwICVzIGJ5ICVsZCwgY3VycmVudCB2YWx1ZSA9ICVsZFxuIiwKLQkJICAgbHNlY3QtPnN5bV9oYXNoLT5yb290LnJvb3Quc3RyaW5nLAotCQkgICAobG9uZylBUkNIX1NJWkUgLyA4LAotCQkgICAobG9uZylsc2VjdC0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUpOwotI2VuZGlmCi0JfQotICAgIH0KLSAgZWxzZQotI2VuZGlmCi0gICAgbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQgPSBsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplOwotCi0gIGxzZWN0LT5zZWN0aW9uLT5fcmF3X3NpemUgKz0gQVJDSF9TSVpFIC8gODsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIkNyZWF0ZSBwb2ludGVyIGluIGxpbmtlciBzZWN0aW9uICVzLCBvZmZzZXQgPSAlbGQsIHNlY3Rpb24gc2l6ZSA9ICVsZFxuIiwKLQkgICBsc2VjdC0+bmFtZSwgKGxvbmcpbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQsIChsb25nKWxzZWN0LT5zZWN0aW9uLT5fcmF3X3NpemUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLSNpZiBBUkNIX1NJWkU9PTY0Ci0jZGVmaW5lIGJmZF9wdXRfcHRyKEJGRCxWQUwsQUREUikgYmZkX3B1dF82NCAoQkZELCBWQUwsIEFERFIpCi0jZW5kaWYKLSNpZiBBUkNIX1NJWkU9PTMyCi0jZGVmaW5lIGJmZF9wdXRfcHRyKEJGRCxWQUwsQUREUikgYmZkX3B1dF8zMiAoQkZELCBWQUwsIEFERFIpCi0jZW5kaWYKLQotLyogRmlsbCBpbiB0aGUgYWRkcmVzcyBmb3IgYSBwb2ludGVyIGdlbmVyYXRlZCBpbiBhbGlua2VyIHNlY3Rpb24uICAqLwotCi1iZmRfdm1hCi1lbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgaW5mbywgbHNlY3QsIGgsIHJlbG9jYXRpb24sIHJlbCwgcmVsYXRpdmVfcmVsb2MpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIGludCByZWxhdGl2ZV9yZWxvYzsKLXsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKmxpbmtlcl9zZWN0aW9uX3B0cjsKLQotICBCRkRfQVNTRVJUIChsc2VjdCAhPSBOVUxMKTsKLQotICBpZiAoaCAhPSBOVUxMKQkJLyogZ2xvYmFsIHN5bWJvbCAqLwotICAgIHsKLSAgICAgIGxpbmtlcl9zZWN0aW9uX3B0ciA9IF9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAoaC0+bGlua2VyX3NlY3Rpb25fcG9pbnRlciwKLQkJCQkJCQkJIHJlbC0+cl9hZGRlbmQsCi0JCQkJCQkJCSBsc2VjdC0+d2hpY2gpOwotCi0gICAgICBCRkRfQVNTRVJUIChsaW5rZXJfc2VjdGlvbl9wdHIgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JICB8fCAoaW5mby0+c2hhcmVkCi0JICAgICAgJiYgaW5mby0+c3ltYm9saWMKLQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQl7Ci0JICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLQkgICAgIC1Cc3ltYm9saWMgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JICAgICBsb2NhbGx5LiAgV2UgbXVzdCBpbml0aWFsaXplIHRoaXMgZW50cnkgaW4gdGhlCi0JICAgICBnbG9iYWwgc2VjdGlvbi4KLQotCSAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuPHh4eD4KLQkgICAgIHJlbG9jYXRpb24gZW50cnkgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUuICBUaGlzCi0JICAgICBpcyBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCi0JICBpZiAoIWxpbmtlcl9zZWN0aW9uX3B0ci0+d3JpdHRlbl9hZGRyZXNzX3ApCi0JICAgIHsKLQkgICAgICBsaW5rZXJfc2VjdGlvbl9wdHItPndyaXR0ZW5fYWRkcmVzc19wID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0X3B0ciAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiArIGxpbmtlcl9zZWN0aW9uX3B0ci0+YWRkZW5kLAotCQkJICBsc2VjdC0+c2VjdGlvbi0+Y29udGVudHMgKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCQkJCS8qIGxvY2FsIHN5bWJvbCAqLwotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHggPSBFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIEJGRF9BU1NFUlQgKGVsZl9sb2NhbF9wdHJfb2Zmc2V0cyAoaW5wdXRfYmZkKSAhPSBOVUxMKTsKLSAgICAgIEJGRF9BU1NFUlQgKGVsZl9sb2NhbF9wdHJfb2Zmc2V0cyAoaW5wdXRfYmZkKVtyX3N5bW5keF0gIT0gTlVMTCk7Ci0gICAgICBsaW5rZXJfc2VjdGlvbl9wdHIgPSBfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGVsZl9sb2NhbF9wdHJfb2Zmc2V0cyAoaW5wdXRfYmZkKVtyX3N5bW5keF0sCi0JCQkJCQkJCSByZWwtPnJfYWRkZW5kLAotCQkJCQkJCQkgbHNlY3QtPndoaWNoKTsKLQotICAgICAgQkZEX0FTU0VSVCAobGlua2VyX3NlY3Rpb25fcHRyICE9IE5VTEwpOwotCi0gICAgICAvKiBXcml0ZSBvdXQgcG9pbnRlciBpZiBpdCBoYXNuJ3QgYmVlbiByZXdyaXR0ZW4gb3V0IGJlZm9yZSAqLwotICAgICAgaWYgKCFsaW5rZXJfc2VjdGlvbl9wdHItPndyaXR0ZW5fYWRkcmVzc19wKQotCXsKLQkgIGxpbmtlcl9zZWN0aW9uX3B0ci0+d3JpdHRlbl9hZGRyZXNzX3AgPSB0cnVlOwotCSAgYmZkX3B1dF9wdHIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24gKyBsaW5rZXJfc2VjdGlvbl9wdHItPmFkZGVuZCwKLQkJICAgICAgIGxzZWN0LT5zZWN0aW9uLT5jb250ZW50cyArIGxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0KTsKLQotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzcmVsID0gbHNlY3QtPnJlbF9zZWN0aW9uOwotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSByZWxhdGl2ZSByZWxvYyBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLQkgICAgICBpZiAoIXNyZWwpCi0JCWxzZWN0LT5yZWxfc2VjdGlvbiA9IHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkJCQkJCSAgICAgbHNlY3QtPnJlbF9uYW1lKTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0KLQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSAobHNlY3QtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgKyBsc2VjdC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJCSArIGxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0KTsKLQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGX1JfSU5GTyAoMCwgcmVsYXRpdmVfcmVsb2MpOwotCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IDA7Ci0JICAgICAgZWxmX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkgICAoKChFbGZfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCSAgICAgbHNlY3QtPnNlY3Rpb24tPmNvbnRlbnRzKQotCQkJCSAgICArIGVsZl9zZWN0aW9uX2RhdGEgKGxzZWN0LT5zZWN0aW9uKS0+cmVsX2NvdW50KSk7Ci0JICAgICAgKytlbGZfc2VjdGlvbl9kYXRhIChsc2VjdC0+c2VjdGlvbiktPnJlbF9jb3VudDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmVsb2NhdGlvbiA9IChsc2VjdC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkrIGxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0Ci0JCS0gbHNlY3QtPmhvbGVfb2Zmc2V0Ci0JCS0gbHNlY3QtPnN5bV9vZmZzZXQpOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiRmluaXNoIHBvaW50ZXIgaW4gbGlua2VyIHNlY3Rpb24gJXMsIG9mZnNldCA9ICVsZCAoMHglbHgpXG4iLAotCSAgIGxzZWN0LT5uYW1lLCAobG9uZylyZWxvY2F0aW9uLCAobG9uZylyZWxvY2F0aW9uKTsKLSNlbmRpZgotCi0gIC8qIFN1YnRyYWN0IG91dCB0aGUgYWRkZW5kLCBiZWNhdXNlIGl0IHdpbGwgZ2V0IGFkZGVkIGJhY2sgaW4gYnkgdGhlIG5vcm1hbAotICAgICBwcm9jZXNzaW5nLiAgKi8KLSAgcmV0dXJuIHJlbG9jYXRpb24gLSBsaW5rZXJfc2VjdGlvbl9wdHItPmFkZGVuZDsKLX0KLQwKLS8qIEdhcmJhZ2UgY29sbGVjdCB1bnVzZWQgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfZ2NfbWFyawotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgYXNlY3Rpb24gKnNlYywKLQkgICBhc2VjdGlvbiAqICgqZ2NfbWFya19ob29rKQotCSAgICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19zd2VlcAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBib29sZWFuICgqZ2Nfc3dlZXBfaG9vaykKLQkgICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpvLAotCQkgICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSkpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX3N3ZWVwX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgUFRSIGlkeHB0cikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfZ2NfYWxsb2NhdGVfZ290X29mZnNldHMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIFBUUiBvZmZhcmcpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX3Byb3BhZ2F0ZV92dGFibGVfZW50cmllc191c2VkCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBQVFIgZHVtbXkpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX3NtYXNoX3VudXNlZF92dGVudHJ5X3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgUFRSIGR1bW15KSk7Ci0KLS8qIFRoZSBtYXJrIHBoYXNlIG9mIGdhcmJhZ2UgY29sbGVjdGlvbi4gIEZvciBhIGdpdmVuIHNlY3Rpb24sIG1hcmsKLSAgIGl0LCBhbmQgYWxsIHRoZSBzZWN0aW9ucyB3aGljaCBkZWZpbmUgc3ltYm9scyB0byB3aGljaCBpdCByZWZlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2djX21hcmsgKGluZm8sIHNlYywgZ2NfbWFya19ob29rKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXNlY3Rpb24gKiAoKmdjX21hcmtfaG9vaykKLSAgICAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkJc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci17Ci0gIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQotICBzZWMtPmdjX21hcmsgPSAxOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc2VjdGlvbiByZWxvY3MuICAqLwotCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCAmJiBzZWMtPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsc3RhcnQsICpyZWwsICpyZWxlbmQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgICAgIHNpemVfdCBubG9jc3ltczsKLSAgICAgIHNpemVfdCBleHRzeW1vZmY7Ci0gICAgICBFbGZfRXh0ZXJuYWxfU3ltICpsb2NzeW1zLCAqZnJlZXN5bXMgPSBOVUxMOwotICAgICAgYmZkICppbnB1dF9iZmQgPSBzZWMtPm93bmVyOwotICAgICAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpOwotCi0gICAgICAvKiBHQ0ZJWE1FOiBob3cgdG8gYXJyYW5nZSBzbyB0aGF0IHJlbG9jcyBhbmQgc3ltYm9scyBhcmUgbm90Ci0JIHJlcmVhZCBjb250aW51YWxseT8gICovCi0KLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICAgICAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotCi0gICAgICAvKiBSZWFkIHRoZSBsb2NhbCBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKSkKLQl7Ci0JICBubG9jc3ltcyA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotICAgICAgICAgIGV4dHN5bW9mZiA9IDA7Ci0JfQotICAgICAgZWxzZQotCWV4dHN5bW9mZiA9IG5sb2NzeW1zID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cykKLQlsb2NzeW1zID0gKEVsZl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICBlbHNlIGlmIChubG9jc3ltcyA9PSAwKQotCWxvY3N5bXMgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIGxvY3N5bXMgPSBmcmVlc3ltcyA9Ci0JICAgIGJmZF9tYWxsb2MgKG5sb2NzeW1zICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSk7Ci0JICBpZiAoZnJlZXN5bXMgPT0gTlVMTAotCSAgICAgIHx8IGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGxvY3N5bXMsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksCi0JCQkgICAgbmxvY3N5bXMsIGlucHV0X2JmZCkKLQkJICAhPSBubG9jc3ltcyAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotCSAgICB7Ci0JICAgICAgcmV0ID0gZmFsc2U7Ci0JICAgICAgZ290byBvdXQxOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBSZWFkIHRoZSByZWxvY2F0aW9ucy4gICovCi0gICAgICByZWxzdGFydCA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JCSAgKHNlYy0+b3duZXIsIHNlYywgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCSAgIGluZm8tPmtlZXBfbWVtb3J5KSk7Ci0gICAgICBpZiAocmVsc3RhcnQgPT0gTlVMTCkKLQl7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGdvdG8gb3V0MTsKLQl9Ci0gICAgICByZWxlbmQgPSByZWxzdGFydCArIHNlYy0+cmVsb2NfY291bnQgKiBiZWQtPnMtPmludF9yZWxzX3Blcl9leHRfcmVsOwotCi0gICAgICBmb3IgKHJlbCA9IHJlbHN0YXJ0OyByZWwgPCByZWxlbmQ7IHJlbCsrKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0JICBhc2VjdGlvbiAqcnNlYzsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgRWxmX0ludGVybmFsX1N5bSBzOwotCi0JICByX3N5bW5keCA9IEVMRl9SX1NZTSAocmVsLT5yX2luZm8pOwotCSAgaWYgKHJfc3ltbmR4ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoZWxmX2JhZF9zeW10YWIgKHNlYy0+b3duZXIpKQotCSAgICB7Ci0JICAgICAgZWxmX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsICZsb2NzeW1zW3Jfc3ltbmR4XSwgJnMpOwotCSAgICAgIGlmIChFTEZfU1RfQklORCAocy5zdF9pbmZvKSA9PSBTVEJfTE9DQUwpCi0JICAgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgTlVMTCwgJnMpOwotCSAgICAgIGVsc2UKLQkJewotCSAgICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl07Ci0JICAgICAgICAgIHJzZWMgPSAoKmdjX21hcmtfaG9vaykoc2VjLT5vd25lciwgaW5mbywgcmVsLCBoLCBOVUxMKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChyX3N5bW5keCA+PSBubG9jc3ltcykKLQkgICAgewotCSAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXTsKLQkgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgaCwgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCAmbG9jc3ltc1tyX3N5bW5keF0sICZzKTsKLQkgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgTlVMTCwgJnMpOwotCSAgICB9Ci0KLQkgIGlmIChyc2VjICYmICFyc2VjLT5nY19tYXJrKQotCSAgICBpZiAoIWVsZl9nY19tYXJrIChpbmZvLCByc2VjLCBnY19tYXJrX2hvb2spKQotCSAgICAgIHsKLQkJcmV0ID0gZmFsc2U7Ci0JCWdvdG8gb3V0MjsKLQkgICAgICB9Ci0JfQotCi0gICAgb3V0MjoKLSAgICAgIGlmICghaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAocmVsc3RhcnQpOwotICAgIG91dDE6Ci0gICAgICBpZiAoZnJlZXN5bXMpCi0JZnJlZSAoZnJlZXN5bXMpOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgc3dlZXAgcGhhc2Ugb2YgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgUmVtb3ZlIGFsbCBnYXJiYWdlIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19zd2VlcCAoaW5mbywgZ2Nfc3dlZXBfaG9vaykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKCpnY19zd2VlcF9ob29rKQotICAgICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpvLAotCQljb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSk7Ci17Ci0gIGJmZCAqc3ViOwotCi0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpvOwotCi0gICAgICBmb3IgKG8gPSBzdWItPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIC8qIEtlZXAgc3BlY2lhbCBzZWN0aW9ucy4gIEtlZXAgLmRlYnVnIHNlY3Rpb25zLiAgKi8KLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpCi0JICAgICAgfHwgKG8tPmZsYWdzICYgU0VDX0RFQlVHR0lORykpCi0JICAgIG8tPmdjX21hcmsgPSAxOwotCi0JICBpZiAoby0+Z2NfbWFyaykKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNraXAgc3dlZXBpbmcgc2VjdGlvbnMgYWxyZWFkeSBleGNsdWRlZC4gICovCi0JICBpZiAoby0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNpbmNlIHRoaXMgaXMgZWFybHkgaW4gdGhlIGxpbmsgcHJvY2VzcywgaXQgaXMgc2ltcGxlCi0JICAgICB0byByZW1vdmUgYSBzZWN0aW9uIGZyb20gdGhlIG91dHB1dC4gICovCi0JICBvLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLQotCSAgLyogQnV0IHdlIGFsc28gaGF2ZSB0byB1cGRhdGUgc29tZSBvZiB0aGUgcmVsb2NhdGlvbgotCSAgICAgaW5mbyB3ZSBjb2xsZWN0ZWQgYmVmb3JlLiAgKi8KLQkgIGlmIChnY19zd2VlcF9ob29rCi0JICAgICAgJiYgKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAmJiBvLT5yZWxvY19jb3VudCA+IDApCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGJvb2xlYW4gcjsKLQotCSAgICAgIGludGVybmFsX3JlbG9jcyA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JCQkJIChvLT5vd25lciwgbywgTlVMTCwgTlVMTCwgaW5mby0+a2VlcF9tZW1vcnkpKTsKLQkgICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIHIgPSAoKmdjX3N3ZWVwX2hvb2spKG8tPm93bmVyLCBpbmZvLCBvLCBpbnRlcm5hbF9yZWxvY3MpOwotCi0JICAgICAgaWYgKCFpbmZvLT5rZWVwX21lbW9yeSkKLQkJZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQotCSAgICAgIGlmICghcikKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBSZW1vdmUgdGhlIHN5bWJvbHMgdGhhdCB3ZXJlIGluIHRoZSBzd2VwdCBzZWN0aW9ucyBmcm9tIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbCB0YWJsZS4gIEdDRklYTUU6IEFueW9uZSBrbm93IGhvdyB0byBnZXQgdGhlbSBvdXQgb2YgdGhlCi0gICAgIHN0YXRpYyBzeW1ib2wgdGFibGUgYXMgd2VsbD8gICovCi0gIHsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgZWxmX2djX3N3ZWVwX3N5bWJvbCwKLQkJCSAgICAoUFRSKSAmaSk7Ci0KLSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ID0gaTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTd2VlcCBzeW1ib2xzIGluIHN3ZXB0IHNlY3Rpb25zLiAgQ2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19zd2VlcF9zeW1ib2wgKGgsIGlkeHB0cikKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpZHhwdHI7Ci17Ci0gIGludCAqaWR4ID0gKGludCAqKSBpZHhwdHI7Ci0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEKLSAgICAgICYmICgoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICB8fCBoLT5yb290LnUuZGVmLnNlY3Rpb24tPmdjX21hcmspKQotICAgIGgtPmR5bmluZHggPSAoKmlkeCkrKzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJvcG9nYXRlIGNvbGxlY3RlZCB2dGFibGUgaW5mb3JtYXRpb24uICBUaGlzIGlzIGNhbGxlZCB0aHJvdWdoCi0gICBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCAoaCwgb2twKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIG9rcDsKLXsKLSAgLyogVGhvc2UgdGhhdCBhcmUgbm90IHZ0YWJsZXMuICovCi0gIGlmIChoLT52dGFibGVfcGFyZW50ID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhvc2UgdnRhYmxlcyB0aGF0IGRvIG5vdCBoYXZlIHBhcmVudHMsIHdlIGNhbm5vdCBtZXJnZS4gICovCi0gIGlmIChoLT52dGFibGVfcGFyZW50ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSAtMSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGJlZW4gZG9uZSwgZXhpdC4gICovCi0gIGlmIChoLT52dGFibGVfZW50cmllc191c2VkICYmIGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWRbLTFdKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgcGFyZW50J3MgdGFibGUgaXMgdXAgdG8gZGF0ZS4gICovCi0gIGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCAoaC0+dnRhYmxlX3BhcmVudCwgb2twKTsKLQotICBpZiAoaC0+dnRhYmxlX2VudHJpZXNfdXNlZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vbmUgb2YgdGhpcyB0YWJsZSdzIGVudHJpZXMgd2VyZSByZWZlcmVuY2VkLiAgUmUtdXNlIHRoZQotCSBwYXJlbnQncyB0YWJsZS4gICovCi0gICAgICBoLT52dGFibGVfZW50cmllc191c2VkID0gaC0+dnRhYmxlX3BhcmVudC0+dnRhYmxlX2VudHJpZXNfdXNlZDsKLSAgICAgIGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUgPSBoLT52dGFibGVfcGFyZW50LT52dGFibGVfZW50cmllc19zaXplOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemVfdCBuOwotICAgICAgYm9vbGVhbiAqY3UsICpwdTsKLQotICAgICAgLyogT3IgdGhlIHBhcmVudCdzIGVudHJpZXMgaW50byBvdXJzLiAgKi8KLSAgICAgIGN1ID0gaC0+dnRhYmxlX2VudHJpZXNfdXNlZDsKLSAgICAgIGN1Wy0xXSA9IHRydWU7Ci0gICAgICBwdSA9IGgtPnZ0YWJsZV9wYXJlbnQtPnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0gICAgICBpZiAocHUgIT0gTlVMTCkKLQl7Ci0JICBuID0gaC0+dnRhYmxlX3BhcmVudC0+dnRhYmxlX2VudHJpZXNfc2l6ZSAvIEZJTEVfQUxJR047Ci0JICB3aGlsZSAoLS1uICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoKnB1KSAqY3UgPSB0cnVlOwotCSAgICAgIHB1KyssIGN1Kys7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2djX3NtYXNoX3VudXNlZF92dGVudHJ5X3JlbG9jcyAoaCwgb2twKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIG9rcDsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX3ZtYSBoc3RhcnQsIGhlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxzdGFydCwgKnJlbGVuZCwgKnJlbDsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICAvKiBUYWtlIGNhcmUgb2YgYm90aCB0aG9zZSBzeW1ib2xzIHRoYXQgZG8gbm90IGRlc2NyaWJlIHZ0YWJsZXMgYXMKLSAgICAgd2VsbCBhcyB0aG9zZSB0aGF0IGFyZSBub3QgbG9hZGVkLiAgKi8KLSAgaWYgKGgtPnZ0YWJsZV9wYXJlbnQgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0KLSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICBoc3RhcnQgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotICBoZW5kID0gaHN0YXJ0ICsgaC0+c2l6ZTsKLQotICByZWxzdGFydCA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JICAgICAgKHNlYy0+b3duZXIsIHNlYywgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIHRydWUpKTsKLSAgaWYgKCFyZWxzdGFydCkKLSAgICByZXR1cm4gKihib29sZWFuICopb2twID0gZmFsc2U7Ci0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChzZWMtPm93bmVyKTsKLSAgcmVsZW5kID0gcmVsc3RhcnQgKyBzZWMtPnJlbG9jX2NvdW50ICogYmVkLT5zLT5pbnRfcmVsc19wZXJfZXh0X3JlbDsKLQotICBmb3IgKHJlbCA9IHJlbHN0YXJ0OyByZWwgPCByZWxlbmQ7ICsrcmVsKQotICAgIGlmIChyZWwtPnJfb2Zmc2V0ID49IGhzdGFydCAmJiByZWwtPnJfb2Zmc2V0IDwgaGVuZCkKLSAgICAgIHsKLQkvKiBJZiB0aGUgZW50cnkgaXMgaW4gdXNlLCBkbyBub3RoaW5nLiAgKi8KLQlpZiAoaC0+dnRhYmxlX2VudHJpZXNfdXNlZAotCSAgICAmJiAocmVsLT5yX29mZnNldCAtIGhzdGFydCkgPCBoLT52dGFibGVfZW50cmllc19zaXplKQotCSAgewotCSAgICBiZmRfdm1hIGVudHJ5ID0gKHJlbC0+cl9vZmZzZXQgLSBoc3RhcnQpIC8gRklMRV9BTElHTjsKLQkgICAgaWYgKGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWRbZW50cnldKQotCSAgICAgIGNvbnRpbnVlOwotCSAgfQotCS8qIE90aGVyd2lzZSwga2lsbCBpdC4gICovCi0JcmVsLT5yX29mZnNldCA9IHJlbC0+cl9pbmZvID0gcmVsLT5yX2FkZGVuZCA9IDA7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERvIG1hcmsgYW5kIHN3ZWVwIG9mIHVudXNlZCBzZWN0aW9ucy4gICovCi0KLWJvb2xlYW4KLWVsZl9nY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYm9vbGVhbiBvayA9IHRydWU7Ci0gIGJmZCAqc3ViOwotICBhc2VjdGlvbiAqICgqZ2NfbWFya19ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLSAgICAgICAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci0KLSAgaWYgKCFnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNhbl9nY19zZWN0aW9ucwotICAgICAgfHwgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBcHBseSB0cmFuc2l0aXZlIGNsb3N1cmUgdG8gdGhlIHZ0YWJsZSBlbnRyeSB1c2FnZSBpbmZvLiAgKi8KLSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICBlbGZfZ2NfcHJvcGFnYXRlX3Z0YWJsZV9lbnRyaWVzX3VzZWQsCi0JCQkgIChQVFIpICZvayk7Ci0gIGlmICghb2spCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEtpbGwgdGhlIHZ0YWJsZSByZWxvY2F0aW9ucyB0aGF0IHdlcmUgbm90IHVzZWQuICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MsCi0JCQkgIChQVFIpICZvayk7Ci0gIGlmICghb2spCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdyb3ZlbCB0aHJvdWdoIHJlbG9jcyB0byBmaW5kIG91dCB3aG8gc3RheXMgLi4uICAqLwotCi0gIGdjX21hcmtfaG9vayA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Z2NfbWFya19ob29rOwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLSAgICAgIGZvciAobyA9IHN1Yi0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgaWYgKG8tPmZsYWdzICYgU0VDX0tFRVApCi0gIAkgICAgaWYgKCFlbGZfZ2NfbWFyayAoaW5mbywgbywgZ2NfbWFya19ob29rKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiAuLi4gYW5kIG1hcmsgU0VDX0VYQ0xVREUgZm9yIHRob3NlIHRoYXQgZ28uICAqLwotICBpZiAoIWVsZl9nY19zd2VlcChpbmZvLCBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmdjX3N3ZWVwX2hvb2spKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIENhbGxlZCBmcm9tIGNoZWNrX3JlbG9jcyB0byByZWNvcmQgdGhlIGV4aXN0YW5jZSBvZiBhIFZUSU5IRVJJVCByZWxvYy4gICovCi0KLWJvb2xlYW4KLWVsZl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIG9mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzZWFyY2gsICpjaGlsZDsKLSAgYmZkX3NpemVfdHlwZSBleHRzeW1jb3VudDsKLQotICAvKiBUaGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgc3ltdGFiIGhlYWRlciB0ZWxscyB1cyB3aGVyZSB0aGUKLSAgICAgZXh0ZXJuYWwgc3ltYm9scyBzdGFydC4gIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGxvY2FsIHN5bWJvbHMgYXQKLSAgICAgdGhpcyBwb2ludC4gICovCi0gIGV4dHN5bWNvdW50ID0gZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9zaXplL3NpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIGV4dHN5bWNvdW50IC09IGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfaW5mbzsKLQotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBleHRzeW1jb3VudDsKLQotICAvKiBIdW50IGRvd24gdGhlIGNoaWxkIHN5bWJvbCwgd2hpY2ggaXMgaW4gdGhpcyBzZWN0aW9uIGF0IHRoZSBzYW1lCi0gICAgIG9mZnNldCBhcyB0aGUgcmVsb2NhdGlvbi4gICovCi0gIGZvciAoc2VhcmNoID0gc3ltX2hhc2hlczsgc2VhcmNoICE9IHN5bV9oYXNoZXNfZW5kOyArK3NlYXJjaCkKLSAgICB7Ci0gICAgICBpZiAoKGNoaWxkID0gKnNlYXJjaCkgIT0gTlVMTAotCSAgJiYgKGNoaWxkLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgY2hpbGQtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiBjaGlsZC0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgY2hpbGQtPnJvb3QudS5kZWYudmFsdWUgPT0gb2Zmc2V0KQotCWdvdG8gd2luOwotICAgIH0KLQotICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCIlczogJXMrJWx1OiBObyBzeW1ib2wgZm91bmQgZm9yIElOSEVSSVQiLAotCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzZWMtPm5hbWUsCi0JCQkgKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KTsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotCi13aW46Ci0gIGlmICghaCkKLSAgICB7Ci0gICAgICAvKiBUaGlzICpzaG91bGQqIG9ubHkgYmUgdGhlIGFic29sdXRlIHNlY3Rpb24uICBJdCBjb3VsZCBwb3RlbnRpYWxseQotCSBiZSB0aGF0IHNvbWVvbmUgaGFzIGRlZmluZWQgYSBub24tZ2xvYmFsIHZ0YWJsZSB0aG91Z2gsIHdoaWNoCi0JIHdvdWxkIGJlIGJhZC4gIEl0IGlzbid0IHdvcnRoIHBhZ2luZyBpbiB0aGUgbG9jYWwgc3ltYm9scyB0byBiZQotCSBzdXJlIHRob3VnaDsgdGhhdCBjYXNlIHNob3VsZCBzaW1wbHkgYmUgaGFuZGxlZCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KLQotICAgICAgY2hpbGQtPnZ0YWJsZV9wYXJlbnQgPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgLTE7Ci0gICAgfQotICBlbHNlCi0gICAgY2hpbGQtPnZ0YWJsZV9wYXJlbnQgPSBoOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDYWxsZWQgZnJvbSBjaGVja19yZWxvY3MgdG8gcmVjb3JkIHRoZSBleGlzdGFuY2Ugb2YgYSBWVEVOVFJZIHJlbG9jLiAgKi8KLQotYm9vbGVhbgotZWxmX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIGFkZGVuZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotewotICBpZiAoYWRkZW5kID49IGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUpCi0gICAgewotICAgICAgc2l6ZV90IHNpemUsIGJ5dGVzOwotICAgICAgYm9vbGVhbiAqcHRyID0gaC0+dnRhYmxlX2VudHJpZXNfdXNlZDsKLQotICAgICAgLyogV2hpbGUgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIHdlIGhhdmUgdG8gYmUgcHJlcGFyZWQgdG8gaGFuZGxlCi0JIGEgemVybyBzaXplLiAgKi8KLSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0Jc2l6ZSA9IGFkZGVuZDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzaXplID0gaC0+c2l6ZTsKLQkgIGlmIChzaXplIDwgYWRkZW5kKQotCSAgICB7Ci0JICAgICAgLyogT29wcyEgIFdlJ3ZlIGdvdCBhIHJlZmVyZW5jZSBwYXN0IHRoZSBkZWZpbmVkIGVuZCBvZgotCQkgdGhlIHRhYmxlLiAgVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyAtLSBzaGFsbCB3ZSB3YXJuPyAgKi8KLQkgICAgICBzaXplID0gYWRkZW5kOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBbGxvY2F0ZSBvbmUgZXh0cmEgZW50cnkgZm9yIHVzZSBhcyBhICJkb25lIiBmbGFnIGZvciB0aGUKLQkgY29uc29saWRhdGlvbiBwYXNzLiAgKi8KLSAgICAgIGJ5dGVzID0gKHNpemUgLyBGSUxFX0FMSUdOICsgMSkgKiBzaXplb2YgKGJvb2xlYW4pOwotCi0gICAgICBpZiAocHRyKQotCXsKLQkgIHB0ciA9IGJmZF9yZWFsbG9jIChwdHIgLSAxLCBieXRlcyk7Ci0JICAKLQkgIGlmIChwdHIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNpemVfdCBvbGRieXRlczsKLQotCSAgICAgIG9sZGJ5dGVzID0gKGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUvRklMRV9BTElHTiArIDEpICogc2l6ZW9mIChib29sZWFuKTsKLQkgICAgICBtZW1zZXQgKCgoY2hhciAqKXB0cikgKyBvbGRieXRlcywgMCwgYnl0ZXMgLSBvbGRieXRlcyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JcHRyID0gYmZkX3ptYWxsb2MgKGJ5dGVzKTsKLQotICAgICAgaWYgKHB0ciA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgLyogQW5kIGFycmFuZ2UgZm9yIHRoYXQgZG9uZSBmbGFnIHRvIGJlIGF0IGluZGV4IC0xLiAgKi8KLSAgICAgIGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQgPSBwdHIgKyAxOwotICAgICAgaC0+dnRhYmxlX2VudHJpZXNfc2l6ZSA9IHNpemU7Ci0gICAgfQotICAKLSAgaC0+dnRhYmxlX2VudHJpZXNfdXNlZFthZGRlbmQgLyBGSUxFX0FMSUdOXSA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFuZCBhbiBhY2NvbXBhbnlpbmcgYml0IHRvIHdvcmsgb3V0IGZpbmFsIGdvdCBlbnRyeSBvZmZzZXRzIG9uY2UKLSAgIHdlJ3JlIGRvbmUuICBTaG91bGQgYmUgY2FsbGVkIGZyb20gZmluYWxfbGluay4gICovCi0KLWJvb2xlYW4KLWVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqaTsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgYmZkX3ZtYSBnb3RvZmY7Ci0KLSAgLyogVGhlIEdPVCBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIC5nb3Qgc2VjdGlvbiwgYnV0IHRoZSBHT1QgaGVhZGVyIGlzCi0gICAgIHB1dCBpbnRvIHRoZSAuZ290LnBsdCBzZWN0aW9uLCBpZiB0aGUgYmFja2VuZCB1c2VzIGl0LiAgKi8KLSAgaWYgKGJlZC0+d2FudF9nb3RfcGx0KQotICAgIGdvdG9mZiA9IDA7Ci0gIGVsc2UKLSAgICBnb3RvZmYgPSBiZWQtPmdvdF9oZWFkZXJfc2l6ZTsKLQotICAvKiBEbyB0aGUgbG9jYWwgLmdvdCBlbnRyaWVzIGZpcnN0LiAgKi8KLSAgZm9yIChpID0gaW5mby0+aW5wdXRfYmZkczsgaTsgaSA9IGktPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290ID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGkpOwotICAgICAgYmZkX3NpemVfdHlwZSBqLCBsb2NzeW1jb3VudDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotCi0gICAgICBpZiAoIWxvY2FsX2dvdCkKLQljb250aW51ZTsKLQotICAgICAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGkpLT5zeW10YWJfaGRyOwotICAgICAgaWYgKGVsZl9iYWRfc3ltdGFiIChpKSkKLQlsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotICAgICAgZWxzZQotCWxvY3N5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IGxvY3N5bWNvdW50OyArK2opCi0JewotCSAgaWYgKGxvY2FsX2dvdFtqXSA+IDApCi0JICAgIHsKLQkgICAgICBsb2NhbF9nb3Rbal0gPSBnb3RvZmY7Ci0JICAgICAgZ290b2ZmICs9IEFSQ0hfU0laRSAvIDg7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgbG9jYWxfZ290W2pdID0gKGJmZF92bWEpIC0xOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlbiB0aGUgZ2xvYmFsIC5nb3QgYW5kIC5wbHQgZW50cmllcy4gICovCi0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzLAotCQkJICAoUFRSKSAmZ290b2ZmKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIG5lZWQgYSBzcGVjaWFsIHRvcC1sZXZlbCBsaW5rIHJvdXRpbmUgdG8gY29udmVydCBnb3QgcmVmZXJlbmNlIGNvdW50cwotICAgdG8gcmVhbCBnb3Qgb2Zmc2V0cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2NfYWxsb2NhdGVfZ290X29mZnNldHMgKGgsIG9mZmFyZykKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBvZmZhcmc7Ci17Ci0gIGJmZF92bWEgKm9mZiA9IChiZmRfdm1hICopIG9mZmFyZzsKLQotICBpZiAoaC0+Z290LnJlZmNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBoLT5nb3Qub2Zmc2V0ID0gb2ZmWzBdOwotICAgICAgb2ZmWzBdICs9IEFSQ0hfU0laRSAvIDg7Ci0gICAgfQotICBlbHNlCi0gICAgaC0+Z290Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFueSBmb2xrIG5lZWQgbm8gbW9yZSBpbiB0aGUgd2F5IG9mIGZpbmFsIGxpbmsgdGhhbiB0aGlzLCBvbmNlCi0gICBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50aW5nIGlzIGVuYWJsZWQuICAqLwotCi1ib29sZWFuCi1lbGZfZ2NfY29tbW9uX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGlmICghZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEludm9rZSB0aGUgcmVndWxhciBFTEYgYmFja2VuZCBsaW5rZXIgdG8gZG8gYWxsIHRoZSB3b3JrLiAgKi8KLSAgcmV0dXJuIGVsZl9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbyk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdGhvdWdoIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgdG8gc3RvcmUKLSAgIGFsbCBoYXNoIHZhbHVlIG9mIHRoZSBleHBvcnRlZCBzeW1ib2xzIGluIGFuIGFycmF5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9jb2xsZWN0X2hhc2hfY29kZXMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgdW5zaWduZWQgbG9uZyAqKnZhbHVlcCA9ICh1bnNpZ25lZCBsb25nICoqKSBkYXRhOwotICBjb25zdCBjaGFyICpuYW1lOwotICBjaGFyICpwOwotICB1bnNpZ25lZCBsb25nIGhhOwotICBjaGFyICphbGMgPSBOVUxMOwotCi0gIC8qIElnbm9yZSBpbmRpcmVjdCBzeW1ib2xzLiAgVGhlc2UgYXJlIGFkZGVkIGJ5IHRoZSB2ZXJzaW9uaW5nIGNvZGUuICAqLwotICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgcCA9IHN0cmNociAobmFtZSwgRUxGX1ZFUl9DSFIpOwotICBpZiAocCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFsYyA9IGJmZF9tYWxsb2MgKHAgLSBuYW1lICsgMSk7Ci0gICAgICBtZW1jcHkgKGFsYywgbmFtZSwgcCAtIG5hbWUpOwotICAgICAgYWxjW3AgLSBuYW1lXSA9ICdcMCc7Ci0gICAgICBuYW1lID0gYWxjOwotICAgIH0KLQotICAvKiBDb21wdXRlIHRoZSBoYXNoIHZhbHVlLiAgKi8KLSAgaGEgPSBiZmRfZWxmX2hhc2ggKG5hbWUpOwotCi0gIC8qIFN0b3JlIHRoZSBmb3VuZCBoYXNoIHZhbHVlIGluIHRoZSBhcnJheSBnaXZlbiBhcyB0aGUgYXJndW1lbnQuICAqLwotICAqKCp2YWx1ZXApKysgPSBoYTsKLQotICAvKiBBbmQgc3RvcmUgaXQgaW4gdGhlIHN0cnVjdCBzbyB0aGF0IHdlIGNhbiBwdXQgaXQgaW4gdGhlIGhhc2ggdGFibGUKLSAgICAgbGF0ZXIuICAqLwotICBoLT5lbGZfaGFzaF92YWx1ZSA9IGhhOwotCi0gIGlmIChhbGMgIT0gTlVMTCkKLSAgICBmcmVlIChhbGMpOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZnh4LXRhcmdldC5oIGIvYmZkL2VsZnh4LXRhcmdldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTY5ZGQ4Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGZ4eC10YXJnZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwMSArMCwwIEBACi0vKiBUYXJnZXQgZGVmaW5pdGlvbnMgZm9yIE5OLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBCRkQga25vd3MgYWJvdXQgYSB0YXJnZXQuCi0gICBJdCBpbmNsdWRlcyB0aGluZ3MgbGlrZSBpdHMgYnl0ZSBvcmRlciwgbmFtZSwgd2hhdCByb3V0aW5lcyB0byBjYWxsCi0gICB0byBkbyB2YXJpb3VzIG9wZXJhdGlvbnMsIGV0Yy4gIEV2ZXJ5IEJGRCBwb2ludHMgdG8gYSB0YXJnZXQgc3RydWN0dXJlCi0gICB3aXRoIGl0cyAieHZlYyIgbWVtYmVyLgotCi0gICBUaGVyZSBhcmUgdHdvIHN1Y2ggc3RydWN0dXJlcyBoZXJlOiAgb25lIGZvciBiaWctZW5kaWFuIG1hY2hpbmVzIGFuZAotICAgb25lIGZvciBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLiAgICovCi0KLSNkZWZpbmUJYmZkX2VsZk5OX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNpZm5kZWYgYmZkX2VsZk5OX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc2VjdGlvbl9jb250ZW50cyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotCi0jZGVmaW5lIGJmZF9lbGZOTl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZGVmaW5lIGJmZF9lbGZOTl9jYW5vbmljYWxpemVfcmVsb2MJX2JmZF9lbGZfY2Fub25pY2FsaXplX3JlbG9jCi0jaWZuZGVmIGJmZF9lbGZOTl9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiZmRfZWxmTk5fZmluZF9uZWFyZXN0X2xpbmUJX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUKLSNlbmRpZgotI2RlZmluZSBiZmRfZWxmTk5fcmVhZF9taW5pc3ltYm9scwlfYmZkX2VsZl9yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGJmZF9lbGZOTl9taW5pc3ltYm9sX3RvX3N5bWJvbAlfYmZkX2VsZl9taW5pc3ltYm9sX3RvX3N5bWJvbAotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X2xpbmVubwkJX2JmZF9lbGZfZ2V0X2xpbmVubwotI2lmbmRlZiBiZmRfZWxmTk5fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgX2JmZF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0jZW5kaWYKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9zeW1ib2xfaW5mbwlfYmZkX2VsZl9nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9zeW10YWIJCV9iZmRfZWxmX2dldF9zeW10YWIKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9lbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2lmIDAgLyogZG9uZSBpbiBlbGYtYmZkLmggKi8KLSNkZWZpbmUgYmZkX2VsZk5OX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sCi0jZW5kaWYKLSNkZWZpbmUgYmZkX2VsZk5OX21ha2VfZW1wdHlfc3ltYm9sCV9iZmRfZWxmX21ha2VfZW1wdHlfc3ltYm9sCi0jZGVmaW5lIGJmZF9lbGZOTl9uZXdfc2VjdGlvbl9ob29rCV9iZmRfZWxmX25ld19zZWN0aW9uX2hvb2sKLSNkZWZpbmUgYmZkX2VsZk5OX3NldF9hcmNoX21hY2gJCV9iZmRfZWxmX3NldF9hcmNoX21hY2gKLSNpZm5kZWYgYmZkX2VsZk5OX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGZOTl9zZXRfc2VjdGlvbl9jb250ZW50cwlfYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0jZGVmaW5lIGJmZF9lbGZOTl9zaXplb2ZfaGVhZGVycwlfYmZkX2VsZl9zaXplb2ZfaGVhZGVycwotI2RlZmluZSBiZmRfZWxmTk5fd3JpdGVfb2JqZWN0X2NvbnRlbnRzIF9iZmRfZWxmX3dyaXRlX29iamVjdF9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fd3JpdGVfY29yZWZpbGVfY29udGVudHMgX2JmZF9lbGZfd3JpdGVfY29yZWZpbGVfY29udGVudHMKLQotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2dvdF9zeW1ib2xfb2Zmc2V0Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9zeW1ib2xfb2Zmc2V0IChiZmRfdm1hKSAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bSAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfcGx0X25vdF9sb2FkZWQKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X25vdF9sb2FkZWQgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudCAyCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfd2FudF9keW5ic3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9keW5ic3MgMQotI2VuZGlmCi0KLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CWJmZF92b2lkCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfZGVidWdfaW5mb19lbmQJYmZkX3ZvaWQKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJKFBST1RPKHZvaWQsKCopLChiZmQqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKLQotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJTlVMTAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawlOVUxMCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2djX3NlY3Rpb25zIF9iZmRfZWxmTk5fZ2Nfc2VjdGlvbnMKLSNlbmRpZgotCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgdm9pZCAqLCB1bnNpZ25lZCBsb25nKSkpIGJmZF9udWxsdm9pZHB0cikKLQotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBcCi0gIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCi0gIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSkpIGJmZF90cnVlKQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBcCi0gIF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIGJmZF9lbGZOTl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZW5kaWYKLQotI2lmZGVmIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZW5kaWYKLSNlbHNlIC8qICEgZGVmaW5lZCAoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbikgKi8KLS8qIElmIG5vIGJhY2tlbmQgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLCB1c2UgdGhlIGdlbmVyaWMgbGlua2VyLiAgKi8KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19hZGRfc3ltYm9scwlfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfZmluYWxfbGluawotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2ZpbmFsX2xpbmsJX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNlbmRpZgotI2VuZGlmIC8qICEgZGVmaW5lZCAoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbikgKi8KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2FyY2hpdmVfcAotI2RlZmluZSBiZmRfZWxmTk5fYXJjaGl2ZV9wIGJmZF9nZW5lcmljX2FyY2hpdmVfcAotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzCi0jZW5kaWYKLQotI2lmbmRlZiBiZmRfZWxmTk5fbWtvYmplY3QKLSNkZWZpbmUgYmZkX2VsZk5OX21rb2JqZWN0IGJmZF9lbGZfbWtvYmplY3QKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9ta2NvcmVmaWxlCi0jZGVmaW5lIGJmZF9lbGZOTl9ta2NvcmVmaWxlIGJmZF9lbGZfbWtjb3JlZmlsZQotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX21rYXJjaGl2ZQotI2RlZmluZSBiZmRfZWxmTk5fbWthcmNoaXZlIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyIDAKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvIDAKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwgMAotI2VuZGlmCi0KLSNpZm5kZWYgRUxGX01BWFBBR0VTSVpFCi0gICNlcnJvciBFTEZfTUFYUEFHRVNJWkUgaXMgbm90IGRlZmluZWQKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFIDEKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2NvbGxlY3QKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY29sbGVjdCBmYWxzZQotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rIGZhbHNlCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3BoZHIJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucyAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzCU5VTEwKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9wcmludF9zeW1ib2xfYWxsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3ByaW50X3N5bWJvbF9hbGwJCU5VTEwKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9vdXRwdXRfYXJjaF9zeW1zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX291dHB1dF9hcmNoX3N5bXMJCU5VTEwKLSNlbmRpZgotCi0vKiBQcmV2aW91c2x5LCBiYWNrZW5kcyBjb3VsZCBvbmx5IHVzZSBTSFRfUkVMIG9yIFNIVF9SRUxBIHJlbG9jYXRpb24KLSAgIHNlY3Rpb25zLCBidXQgbm90IGJvdGguICBUaGV5IGRlZmluZWQgVVNFX1JFTCB0byBpbmRpY2F0ZSBTSFRfUkVMCi0gICBzZWN0aW9ucywgYW5kIGxlZnQgaXQgdW5kZWZpbmVkIHRvIGluZGljYXRlZCBTSFRfUkVMQSBzZWN0aW9ucy4KLSAgIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2Ugc3RpbGwgc3VwcG9ydCB0aGlzIHVzYWdlLiAgKi8KLSNpZm5kZWYgVVNFX1JFTAotI2RlZmluZSBVU0VfUkVMIDAKLSNlbHNlCi0jdW5kZWYgVVNFX1JFTAotI2RlZmluZSBVU0VfUkVMIDEKLSNlbmRpZiAKLQotLyogVXNlIHRoZXNlIGluIG5ldyBjb2RlLiAgKi8KLSNpZm5kZWYgZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxfcCAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxfcCBVU0VfUkVMCi0jZW5kaWYgCi0jaWZuZGVmIGVsZl9iYWNrZW5kX21heV91c2VfcmVsYV9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX21heV91c2VfcmVsYV9wICFVU0VfUkVMCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZGVmYXVsdF91c2VfcmVsYV9wIAotI2RlZmluZSBlbGZfYmFja2VuZF9kZWZhdWx0X3VzZV9yZWxhX3AgIVVTRV9SRUwKLSNlbmRpZgotCi0jaWZuZGVmIEVMRl9NQUNISU5FX0FMVDEKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMSAwCi0jZW5kaWYKLQotI2lmbmRlZiBFTEZfTUFDSElORV9BTFQyCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDIgMAotI2VuZGlmCi0KLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfaW5mbyBfYmZkX2VsZk5OX3NpemVfaW5mbwotI2VuZGlmCi0KLSNpZm5kZWYgZWxmX2JhY2tlbmRfc2lnbl9leHRlbmRfdm1hCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpZ25fZXh0ZW5kX3ZtYSAwCi0jZW5kaWYKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBlbGZfc2l6ZV9pbmZvIF9iZmRfZWxmTk5fc2l6ZV9pbmZvOwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgZWxmTk5fYmVkID0KLXsKLSAgRUxGX0FSQ0gsCQkJLyogYXJjaCAqLwotICBFTEZfTUFDSElORV9DT0RFLAkJLyogZWxmX21hY2hpbmVfY29kZSAqLwotICBFTEZfTUFYUEFHRVNJWkUsCQkvKiBtYXhwYWdlc2l6ZSAqLwotICBlbGZfaW5mb190b19ob3d0bywKLSAgZWxmX2luZm9fdG9faG93dG9fcmVsLAotICBlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsLAotICBlbGZfYmFja2VuZF9vYmplY3RfcCwKLSAgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcsCi0gIGVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nLAotICBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUsCi0gIGVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIsCi0gIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9waGRyLAotICBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24sCi0gIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vaywKLSAgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2ssCi0gIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MsCi0gIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMsCi0gIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiwKLSAgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sLAotICBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMsCi0gIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCwKLSAgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rLAotICBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rLAotICBlbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycywKLSAgZWxmX2JhY2tlbmRfcHJpbnRfc3ltYm9sX2FsbCwKLSAgZWxmX2JhY2tlbmRfb3V0cHV0X2FyY2hfc3ltcywKLSAgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCwKLSAgRUxGX01BQ0hJTkVfQUxUMSwKLSAgRUxGX01BQ0hJTkVfQUxUMiwKLSAgJmVsZl9iYWNrZW5kX3NpemVfaW5mbywKLSAgZWxmX2JhY2tlbmRfZ290X3N5bWJvbF9vZmZzZXQsCi0gIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSwKLSAgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplLAotICBlbGZfYmFja2VuZF9jb2xsZWN0LAotICBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vaywKLSAgZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxfcCwKLSAgZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxhX3AsCi0gIGVsZl9iYWNrZW5kX2RlZmF1bHRfdXNlX3JlbGFfcCwKLSAgZWxmX2JhY2tlbmRfc2lnbl9leHRlbmRfdm1hLAotICBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQsCi0gIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSwKLSAgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltLAotICBlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZCwKLSAgZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudCwKLSAgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF93YW50X2R5bmJzcwotfTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgdXNlIHdoZW4gaW5pdGlhbGlzaW5nIGFsdGVybmF0aXZlX3RhcmdldCBmaWVsZC4gICovCi0jaWZkZWYgVEFSR0VUX0xJVFRMRV9TWU0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9MSVRUTEVfU1lNOwotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfQklHX1NZTQotY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfQklHX1NZTSA9Ci17Ci0gIC8qIG5hbWU6IGlkZW50aWZ5IGtpbmQgb2YgdGFyZ2V0ICovCi0gIFRBUkdFVF9CSUdfTkFNRSwKLQotICAvKiBmbGF2b3VyOiBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgZmlsZSAqLwotICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotCi0gIC8qIGJ5dGVvcmRlcjogZGF0YSBpcyBiaWcgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fQklHLAotCi0gIC8qIGhlYWRlcl9ieXRlb3JkZXI6IGhlYWRlciBpcyBhbHNvIGJpZyBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9CSUcsCi0KLSAgLyogb2JqZWN0X2ZsYWdzOiBtYXNrIG9mIGFsbCBmaWxlIGZsYWdzICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwKLSAgIERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgLyogc2VjdGlvbl9mbGFnczogbWFzayBvZiBhbGwgc2VjdGlvbiBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX1JFQURPTkxZIHwKLSAgIFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfREVCVUdHSU5HIHwgU0VDX0VYQ0xVREUgfCBTRUNfU09SVF9FTlRSSUVTKSwKLQotICAgLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAotICAgICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCi0gIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyLAotCi0gIC8qIGFyX3BhZF9jaGFyOiBwYWQgY2hhcmFjdGVyIGZvciBmaWxlbmFtZXMgd2l0aGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBFTEYsIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kL29yIG9zIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlICovCi0gICcvJywKLQotICAvKiBhcl9tYXhfbmFtZWxlbjogbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlLiAgVGhpcyB2YWx1ZSBpcwotICAgICBhIFdBRyAod2lsZCBhKiogZ3Vlc3MpICovCi0gIDE0LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGRhdGEgc2VjdGlvbnMgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXJzICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotCi0gIC8qIGJmZF9jaGVja19mb3JtYXQ6IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQgKi8KLSAgeyBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgYmZkX2VsZk5OX29iamVjdF9wLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLwotICAgIGJmZF9lbGZOTl9hcmNoaXZlX3AsCS8qIGFuIGFyY2hpdmUgKi8KLSAgICBiZmRfZWxmTk5fY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgfSwKLQotICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgYmZkX2VsZk5OX21rb2JqZWN0LAotICAgIGJmZF9lbGZOTl9ta2FyY2hpdmUsCi0gICAgYmZkX2VsZk5OX21rY29yZWZpbGUKLSAgfSwKLQotICAvKiBiZmRfd3JpdGVfY29udGVudHM6IHdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIGJmZF9lbGZOTl93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2VsZk5OX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzLAotICB9LAotCi0gICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGJmZF9lbGZOTiksCi0jaWZkZWYgYmZkX2VsZk5OX2FyY2hpdmVfZnVuY3Rpb25zCi0gICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChiZmRfZWxmTk5fYXJjaGl2ZSksCi0jZWxzZQotICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotI2VuZGlmCi0gICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoYmZkX2VsZk5OKSwKLQotICAvKiBBbHRlcm5hdGl2ZSBlbmRpYW4gdGFyZ2V0LiAgKi8KLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotICAmIFRBUkdFVF9MSVRUTEVfU1lNLAotI2Vsc2UKLSAgTlVMTCwKLSNlbmRpZgotCi0gIC8qIGJhY2tlbmRfZGF0YTogKi8KLSAgKFBUUikgJmVsZk5OX2JlZAotfTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0xJVFRMRV9TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0xJVFRMRV9TWU0gPQotewotICAvKiBuYW1lOiBpZGVudGlmeSBraW5kIG9mIHRhcmdldCAqLwotICBUQVJHRVRfTElUVExFX05BTUUsCi0KLSAgLyogZmxhdm91cjogZ2VuZXJhbCBpbmRpY2F0aW9uIGFib3V0IGZpbGUgKi8KLSAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKLQotICAvKiBieXRlb3JkZXI6IGRhdGEgaXMgbGl0dGxlIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwKLQotICAvKiBoZWFkZXJfYnl0ZW9yZGVyOiBoZWFkZXIgaXMgYWxzbyBsaXR0bGUgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAotCi0gIC8qIG9iamVjdF9mbGFnczogbWFzayBvZiBhbGwgZmlsZSBmbGFncyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8Ci0gICBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIC8qIHNlY3Rpb25fZmxhZ3M6IG1hc2sgb2YgYWxsIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19SRUFET05MWSB8Ci0gICBTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX0RFQlVHR0lORyB8IFNFQ19FWENMVURFIHwgU0VDX1NPUlRfRU5UUklFUyksCi0KLSAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciwKLQotICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLwotICAnLycsCi0KLSAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIEVMRiwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKLSAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLwotICAxNCwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwKLQotICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgIGJmZF9lbGZOTl9vYmplY3RfcCwJCS8qIGFzc2VtYmxlci9saW5rZXIgb3V0cHV0IChvYmplY3QgZmlsZSkgKi8KLSAgICBiZmRfZWxmTk5fYXJjaGl2ZV9wLAkvKiBhbiBhcmNoaXZlICovCi0gICAgYmZkX2VsZk5OX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gIH0sCi0KLSAgLyogYmZkX3NldF9mb3JtYXQ6IHNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIGJmZF9lbGZOTl9ta29iamVjdCwKLSAgICBiZmRfZWxmTk5fbWthcmNoaXZlLAotICAgIGJmZF9lbGZOTl9ta2NvcmVmaWxlCi0gIH0sCi0KLSAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBiZmRfZWxmTk5fd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKLSAgfSwKLQotICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChiZmRfZWxmTk4pLAotI2lmZGVmIGJmZF9lbGZOTl9hcmNoaXZlX2Z1bmN0aW9ucwotICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoYmZkX2VsZk5OX2FyY2hpdmUpLAotI2Vsc2UKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSNlbmRpZgotICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKGJmZF9lbGZOTiksCi0KLSAgLyogQWx0ZXJuYXRpdmUgZW5kaWFuIHRhcmdldC4gICovCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLSAgJiBUQVJHRVRfQklHX1NZTSwKLSNlbHNlCi0gIE5VTEwsCi0jZW5kaWYKLSAgCi0gIC8qIGJhY2tlbmRfZGF0YTogKi8KLSAgKFBUUikgJmVsZk5OX2JlZAotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2Vwb2MtcGUtYXJtLmMgYi9iZmQvZXBvYy1wZS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhMjc3YS4uMDAwMDAwMAotLS0gYS9iZmQvZXBvYy1wZS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQVJNIEVQT0MgUEUgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFICAgIDAKLSNkZWZpbmUgVVNFUl9MQUJFTF9QUkVGSVggICAgIiIKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBhcm1fZXBvY19wZV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJlcG9jLXBlLWFybS1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIGFybV9lcG9jX3BlX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgImVwb2MtcGUtYXJtLWJpZyIKLQotI2RlZmluZSBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBcCi0JYmZkX2FybV9lcG9jX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2FybV9lcG9jX3BlX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotI2RlZmluZSBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gXAotCWJmZF9hcm1fZXBvY19wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0KLSNpbmNsdWRlICJwZS1hcm0uYyIKLQpkaWZmIC0tZ2l0IGEvYmZkL2Vwb2MtcGVpLWFybS5jIGIvYmZkL2Vwb2MtcGVpLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjI1NDhkLi4wMDAwMDAwCi0tLSBhL2JmZC9lcG9jLXBlaS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQVJNIEVQT0MgUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgICAgMAotI2RlZmluZSBVU0VSX0xBQkVMX1BSRUZJWCAgICAiIgotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJlcG9jLXBlaS1hcm0tbGl0dGxlIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICBhcm1fZXBvY19wZWlfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAiZXBvYy1wZWktYXJtLWJpZyIKLQotI2luY2x1ZGUgInBlaS1hcm0uYyIKLQpkaWZmIC0tZ2l0IGEvYmZkL2Zvcm1hdC5jIGIvYmZkL2Zvcm1hdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWYxZjljLi4wMDAwMDAwCi0tLSBhL2JmZC9mb3JtYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKiBHZW5lcmljIEJGRCBzdXBwb3J0IGZvciBmaWxlIGZvcm1hdHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlGaWxlIGZvcm1hdHMKLQotCUEgZm9ybWF0IGlzIGEgQkZEIGNvbmNlcHQgb2YgaGlnaCBsZXZlbCBmaWxlIGNvbnRlbnRzIHR5cGUuIFRoZQotCWZvcm1hdHMgc3VwcG9ydGVkIGJ5IEJGRCBhcmU6IAotCi0JbyA8PGJmZF9vYmplY3Q+PgotCi0JVGhlIEJGRCBtYXkgY29udGFpbiBkYXRhLCBzeW1ib2xzLCByZWxvY2F0aW9ucyBhbmQgZGVidWcgaW5mby4KLQotCW8gPDxiZmRfYXJjaGl2ZT4+Ci0KLQlUaGUgQkZEIGNvbnRhaW5zIG90aGVyIEJGRHMgYW5kIGFuIG9wdGlvbmFsIGluZGV4LgotCi0JbyA8PGJmZF9jb3JlPj4KLQotCVRoZSBCRkQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiBhbiBleGVjdXRhYmxlIGNvcmUgZHVtcC4KLQotCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIElNUE9SVCBmcm9tIHRhcmdldHMuYy4gICovCi1leHRlcm4gY29uc3Qgc2l6ZV90IF9iZmRfdGFyZ2V0X3ZlY3Rvcl9lbnRyaWVzOwotCi0vKgotRlVOQ1RJT04KLQliZmRfY2hlY2tfZm9ybWF0Ci0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2hlY2tfZm9ybWF0KGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQpOwotCi1ERVNDUklQVElPTgotCVZlcmlmeSBpZiB0aGUgZmlsZSBhdHRhY2hlZCB0byB0aGUgQkZEIEB2YXJ7YWJmZH0gaXMgY29tcGF0aWJsZQotCXdpdGggdGhlIGZvcm1hdCBAdmFye2Zvcm1hdH0gKGkuZS4sIG9uZSBvZiA8PGJmZF9vYmplY3Q+PiwKLQk8PGJmZF9hcmNoaXZlPj4gb3IgPDxiZmRfY29yZT4+KS4KLQotCUlmIHRoZSBCRkQgaGFzIGJlZW4gc2V0IHRvIGEgc3BlY2lmaWMgdGFyZ2V0IGJlZm9yZSB0aGUKLQljYWxsLCBvbmx5IHRoZSBuYW1lZCB0YXJnZXQgYW5kIGZvcm1hdCBjb21iaW5hdGlvbiBpcwotCWNoZWNrZWQuIElmIHRoZSB0YXJnZXQgaGFzIG5vdCBiZWVuIHNldCwgb3IgaGFzIGJlZW4gc2V0IHRvCi0JPDxkZWZhdWx0Pj4sIHRoZW4gYWxsIHRoZSBrbm93biB0YXJnZXQgYmFja2VuZHMgaXMKLQlpbnRlcnJvZ2F0ZWQgdG8gZGV0ZXJtaW5lIGEgbWF0Y2guICBJZiB0aGUgZGVmYXVsdCB0YXJnZXQKLQltYXRjaGVzLCBpdCBpcyB1c2VkLiAgSWYgbm90LCBleGFjdGx5IG9uZSB0YXJnZXQgbXVzdCByZWNvZ25pemUKLQl0aGUgZmlsZSwgb3IgYW4gZXJyb3IgcmVzdWx0cy4KLQotCVRoZSBmdW5jdGlvbiByZXR1cm5zIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSA8PGZhbHNlPj4KLQl3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOiAgCi0KLQlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLQotCWlmIDw8Zm9ybWF0Pj4gaXMgbm90IG9uZSBvZiA8PGJmZF9vYmplY3Q+PiwgPDxiZmRfYXJjaGl2ZT4+IG9yCi0JPDxiZmRfY29yZT4+LgotCi0JbyA8PGJmZF9lcnJvcl9zeXN0ZW1fY2FsbD4+IC0KLQlpZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyBhIHJlYWQgLSBldmVuIHNvbWUgZmlsZSBtaXNtYXRjaGVzCi0JY2FuIGNhdXNlIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbHMuCi0KLQlvIDw8ZmlsZV9ub3RfcmVjb2duaXNlZD4+IC0KLQlub25lIG9mIHRoZSBiYWNrZW5kcyByZWNvZ25pc2VkIHRoZSBmaWxlIGZvcm1hdC4KLQotCW8gPDxiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkPj4gLQotCW1vcmUgdGhhbiBvbmUgYmFja2VuZCByZWNvZ25pc2VkIHRoZSBmaWxlIGZvcm1hdC4KLSovCi0KLWJvb2xlYW4KLWJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGZvcm1hdCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLXsKLSAgcmV0dXJuIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgZm9ybWF0LCBOVUxMKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCwgY2hhciAqKiptYXRjaGluZyk7Ci0KLURFU0NSSVBUSU9OCi0JTGlrZSA8PGJmZF9jaGVja19mb3JtYXQ+PiwgZXhjZXB0IHdoZW4gaXQgcmV0dXJucyBmYWxzZSB3aXRoCi0JPDxiZmRfZXJybm8+PiBzZXQgdG8gPDxiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkPj4uICBJbiB0aGF0Ci0JY2FzZSwgaWYgQHZhcnttYXRjaGluZ30gaXMgbm90IE5VTEwsIGl0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLQlhIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgZm9ybWF0cyB0aGF0IG1hdGNoZWQsCi0JYWxsb2NhdGVkIHdpdGggPDxtYWxsb2M+Pi4KLQlUaGVuIHRoZSB1c2VyIG1heSBjaG9vc2UgYSBmb3JtYXQgYW5kIHRyeSBhZ2Fpbi4KLQotCVdoZW4gZG9uZSB3aXRoIHRoZSBsaXN0IHRoYXQgQHZhcnttYXRjaGluZ30gcG9pbnRzIHRvLCB0aGUgY2FsbGVyCi0Jc2hvdWxkIGZyZWUgaXQuICAKLSovCi0KLWJvb2xlYW4KLWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgZm9ybWF0LCBtYXRjaGluZykKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLSAgICAgY2hhciAqKiptYXRjaGluZzsKLXsKLSAgZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmluYXJ5X3ZlYzsKLSAgY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0ICp0YXJnZXQsICpzYXZlX3RhcmcsICpyaWdodF90YXJnOwotICBjaGFyICoqbWF0Y2hpbmdfdmVjdG9yID0gTlVMTDsKLSAgaW50IG1hdGNoX2NvdW50OwotCi0gIGlmICghYmZkX3JlYWRfcCAoYWJmZCkgfHwKLSAgICAgICgoaW50KShhYmZkLT5mb3JtYXQpIDwgKGludCliZmRfdW5rbm93bikgfHwKLSAgICAgICgoaW50KShhYmZkLT5mb3JtYXQpID49IChpbnQpYmZkX3R5cGVfZW5kKSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfdW5rbm93bikKLSAgICByZXR1cm4gKGFiZmQtPmZvcm1hdCA9PSBmb3JtYXQpPyB0cnVlOiBmYWxzZTsKLQotCi0gIC8qIFNpbmNlIHRoZSB0YXJnZXQgdHlwZSB3YXMgZGVmYXVsdGVkLCBjaGVjayB0aGVtIAotICAgICBhbGwgaW4gdGhlIGhvcGUgdGhhdCBvbmUgd2lsbCBiZSB1bmlxdWVseSByZWNvZ25pemVkLiAgKi8KLQotICBzYXZlX3RhcmcgPSBhYmZkLT54dmVjOwotICBtYXRjaF9jb3VudCA9IDA7Ci0gIGlmIChtYXRjaGluZykKLSAgICB7Ci0gICAgICBtYXRjaGluZ192ZWN0b3IgPQotCShjaGFyICoqKSBiZmRfbWFsbG9jIChzaXplb2YgKGNoYXIgKikgKgotCQkJICAgICAgKF9iZmRfdGFyZ2V0X3ZlY3Rvcl9lbnRyaWVzICsgMSkpOwotICAgICAgaWYgKCFtYXRjaGluZ192ZWN0b3IpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWF0Y2hpbmdfdmVjdG9yWzBdID0gTlVMTDsKLSAgICAgICptYXRjaGluZyA9IG1hdGNoaW5nX3ZlY3RvcjsKLSAgICB9Ci0gIHJpZ2h0X3RhcmcgPSAwOwotCi0KLSAgLyogcHJlc3VtZSB0aGUgYW5zd2VyIGlzIHllcyAqLwotICBhYmZkLT5mb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgLyogSWYgdGhlIHRhcmdldCB0eXBlIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCwganVzdCBjaGVjayB0aGF0IHRhcmdldC4gICovCi0KLSAgaWYgKCFhYmZkLT50YXJnZXRfZGVmYXVsdGVkKSB7Ci0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpMCwgU0VFS19TRVQpICE9IDApCS8qIHJld2luZCEgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByaWdodF90YXJnID0gQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX2NoZWNrX2Zvcm1hdCwgKGFiZmQpKTsKLSAgICBpZiAocmlnaHRfdGFyZykgewotICAgICAgYWJmZC0+eHZlYyA9IHJpZ2h0X3Rhcmc7CQkvKiBTZXQgdGhlIHRhcmdldCBhcyByZXR1cm5lZCAqLwotICAgICAgaWYgKG1hdGNoaW5nKQotCWZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0gICAgICByZXR1cm4gdHJ1ZTsJCQkvKiBGaWxlIHBvc2l0aW9uIGhhcyBtb3ZlZCwgQlRXICovCi0gICAgfQotCi0gICAgLyogRm9yIGEgbG9uZyB0aW1lIHRoZSBjb2RlIGhhcyBkcm9wcGVkIHRocm91Z2ggdG8gY2hlY2sgYWxsCi0gICAgICAgdGFyZ2V0cyBpZiB0aGUgc3BlY2lmaWVkIHRhcmdldCB3YXMgd3JvbmcuICBJIGRvbid0IGtub3cgd2h5LAotICAgICAgIGFuZCBJJ20gcmVsdWN0YW50IHRvIGNoYW5nZSBpdC4gIEhvd2V2ZXIsIGluIHRoZSBjYXNlIG9mIGFuCi0gICAgICAgYXJjaGl2ZSwgaXQgY2FuIGNhdXNlIHByb2JsZW1zLiAgSWYgdGhlIHNwZWNpZmllZCB0YXJnZXQgZG9lcwotICAgICAgIG5vdCBwZXJtaXQgYXJjaGl2ZXMgKGUuZy4sIHRoZSBiaW5hcnkgdGFyZ2V0KSwgdGhlbiB3ZSBzaG91bGQKLSAgICAgICBub3QgYWxsb3cgc29tZSBvdGhlciB0YXJnZXQgdG8gcmVjb2duaXplIGl0IGFzIGFuIGFyY2hpdmUsIGJ1dAotICAgICAgIHNob3VsZCBpbnN0ZWFkIGFsbG93IHRoZSBzcGVjaWZpZWQgdGFyZ2V0IHRvIHJlY29nbml6ZSBpdCBhcyBhbgotICAgICAgIG9iamVjdC4gIFdoZW4gSSBmaXJzdCBtYWRlIHRoaXMgY2hhbmdlLCBpdCBicm9rZSB0aGUgUEUgdGFyZ2V0LAotICAgICAgIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBwZWktaTM4NiB0YXJnZXQgZGlkIG5vdCByZWNvZ25pemUgdGhlCi0gICAgICAgYWN0dWFsIHBlLWkzODYgYXJjaGl2ZS4gIFNpbmNlIHRoZXJlIG1heSBiZSBvdGhlciBwcm9ibGVtcyBvZgotICAgICAgIHRoaXMgc29ydCwgSSBjaGFuZ2VkIHRoaXMgdGVzdCB0byBjaGVjayBvbmx5IGZvciB0aGUgYmluYXJ5Ci0gICAgICAgdGFyZ2V0LiAgKi8KLQotICAgIGlmIChmb3JtYXQgPT0gYmZkX2FyY2hpdmUgJiYgc2F2ZV90YXJnID09ICZiaW5hcnlfdmVjKQotICAgICAgewotCWFiZmQtPnh2ZWMgPSBzYXZlX3Rhcmc7Ci0JYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247Ci0JaWYgKG1hdGNoaW5nKQotCSAgZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCk7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgfQotICB9Ci0KLSAgZm9yICh0YXJnZXQgPSBiZmRfdGFyZ2V0X3ZlY3RvcjsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykgewotICAgIGNvbnN0IGJmZF90YXJnZXQgKnRlbXA7Ci0KLSAgICBpZiAoKnRhcmdldCA9PSAmYmluYXJ5X3ZlYykKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgYWJmZC0+eHZlYyA9ICp0YXJnZXQ7CS8qIENoYW5nZSBCRkQncyB0YXJnZXQgdGVtcG9yYXJpbHkgKi8KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAvKiBJZiBfYmZkX2NoZWNrX2Zvcm1hdCBuZWdsZWN0cyB0byBzZXQgYmZkX2Vycm9yLCBhc3N1bWUgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdC4KLSAgICAgICBXZSBkaWRuJ3QgdXNlZCB0byBldmVuIHBheSBhbnkgYXR0ZW50aW9uIHRvIGJmZF9lcnJvciwgc28gSSBzdXNwZWN0Ci0gICAgICAgdGhhdCBzb21lIF9iZmRfY2hlY2tfZm9ybWF0IG1pZ2h0IGhhdmUgdGhpcyBwcm9ibGVtLiAgKi8KLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICB0ZW1wID0gQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX2NoZWNrX2Zvcm1hdCwgKGFiZmQpKTsKLSAgICBpZiAodGVtcCkgewkJCQkvKiBUaGlzIGZvcm1hdCBjaGVja3Mgb3V0IGFzIG9rISAqLwotICAgICAgcmlnaHRfdGFyZyA9IHRlbXA7Ci0gICAgICBpZiAobWF0Y2hpbmcpCi0JewotCSAgbWF0Y2hpbmdfdmVjdG9yW21hdGNoX2NvdW50XSA9IHRlbXAtPm5hbWU7Ci0JICBtYXRjaGluZ192ZWN0b3JbbWF0Y2hfY291bnQgKyAxXSA9IE5VTEw7Ci0JfQotICAgICAgbWF0Y2hfY291bnQrKzsKLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGRlZmF1bHQgdGFyZ2V0LCBhY2NlcHQgaXQsIGV2ZW4gaWYgb3RoZXIgdGFyZ2V0cwotCSBtaWdodCBtYXRjaC4gIFBlb3BsZSB3aG8gd2FudCB0aG9zZSBvdGhlciB0YXJnZXRzIGhhdmUgdG8gc2V0IAotCSB0aGUgR05VVEFSR0VUIHZhcmlhYmxlLiAgKi8KLSAgICAgIGlmICh0ZW1wID09IGJmZF9kZWZhdWx0X3ZlY3RvclswXSkKLQl7Ci0JICBpZiAobWF0Y2hpbmcpCi0JICAgIHsKLQkgICAgICBtYXRjaGluZ192ZWN0b3JbMF0gPSB0ZW1wLT5uYW1lOwotCSAgICAgIG1hdGNoaW5nX3ZlY3RvclsxXSA9IE5VTEw7Ci0JICAgIH0KLQkgIG1hdGNoX2NvdW50ID0gMTsKLQkgIGJyZWFrOwotCX0KLSNpZmRlZiBHTlU5NjAKLSAgICAgIC8qIEJpZy0gYW5kIGxpdHRsZS1lbmRpYW4gYi5vdXQgYXJjaGl2ZXMgbG9vayB0aGUgc2FtZSwgYnV0IGl0IGRvZXNuJ3QKLSAgICAgICAqIG1hdHRlcjogdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpbiB0aGVpciBoZWFkZXJzLCBhbmQgbWVtYmVyIGZpbGUgYnl0ZQotICAgICAgICogb3JkZXJzIHdpbGwgKEkgaG9wZSkgYmUgaGFuZGxlZCBhcHByb3ByaWF0ZWx5IGJ5IGJmZC4gIERpdHRvIGZvciBiaWcKLSAgICAgICAqIGFuZCBsaXR0bGUgY29mZiBhcmNoaXZlcy4gIEFuZCB0aGUgNCBjb2ZmL2Iub3V0IG9iamVjdCBmb3JtYXRzIGFyZQotICAgICAgICogdW5hbWJpZ3VvdXMuICBTbyBhY2NlcHQgdGhlIGZpcnN0IG1hdGNoIHdlIGZpbmQuCi0gICAgICAgKi8KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgfSBlbHNlIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpIHsKLSAgICAgIGFiZmQtPnh2ZWMgPSBzYXZlX3Rhcmc7Ci0gICAgICBhYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKLSAgICAgIGlmIChtYXRjaGluZyAmJiBiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBpZiAobWF0Y2hfY291bnQgPT0gMSkgewotICAgIGFiZmQtPnh2ZWMgPSByaWdodF90YXJnOwkJLyogQ2hhbmdlIEJGRCdzIHRhcmdldCBwZXJtYW5lbnRseSAqLwotICAgIGlmIChtYXRjaGluZykKLSAgICAgIGZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0gICAgcmV0dXJuIHRydWU7CQkJLyogRmlsZSBwb3NpdGlvbiBoYXMgbW92ZWQsIEJUVyAqLwotICB9Ci0KLSAgYWJmZC0+eHZlYyA9IHNhdmVfdGFyZzsJCS8qIFJlc3RvcmUgb3JpZ2luYWwgdGFyZ2V0IHR5cGUgKi8KLSAgYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247CQkvKiBSZXN0b3JlIG9yaWdpbmFsIGZvcm1hdCAqLwotICBpZiAobWF0Y2hfY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCk7Ci0gICAgICBpZiAobWF0Y2hpbmcpCi0JZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2Zvcm1hdAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9mb3JtYXQoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCk7Ci0KLURFU0NSSVBUSU9OCi0JVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBmaWxlIGZvcm1hdCBvZiB0aGUgQkZEIEB2YXJ7YWJmZH0gdG8gdGhlCi0JZm9ybWF0IEB2YXJ7Zm9ybWF0fS4gSWYgdGhlIHRhcmdldCBzZXQgaW4gdGhlIEJGRCBkb2VzIG5vdAotCXN1cHBvcnQgdGhlIGZvcm1hdCByZXF1ZXN0ZWQsIHRoZSBmb3JtYXQgaXMgaW52YWxpZCwgb3IgdGhlIEJGRAotCWlzIG5vdCBvcGVuIGZvciB3cml0aW5nLCB0aGVuIGFuIGVycm9yIG9jY3Vycy4KLQotKi8KLQotYm9vbGVhbgotYmZkX3NldF9mb3JtYXQgKGFiZmQsIGZvcm1hdCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLXsKLQotICBpZiAoYmZkX3JlYWRfcCAoYWJmZCkgfHwKLSAgICAgICgoaW50KWFiZmQtPmZvcm1hdCA8IChpbnQpYmZkX3Vua25vd24pIHx8Ci0gICAgICAoKGludClhYmZkLT5mb3JtYXQgPj0gKGludCliZmRfdHlwZV9lbmQpKSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF91bmtub3duKQotICAgIHJldHVybiAoYWJmZC0+Zm9ybWF0ID09IGZvcm1hdCkgPyB0cnVlOmZhbHNlOwotCi0gIC8qIHByZXN1bWUgdGhlIGFuc3dlciBpcyB5ZXMgKi8KLSAgYWJmZC0+Zm9ybWF0ID0gZm9ybWF0OwotCi0gIGlmICghQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX3NldF9mb3JtYXQsIChhYmZkKSkpIHsKLSAgICBhYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZm9ybWF0X3N0cmluZwotCi1TWU5PUFNJUwotCUNPTlNUIGNoYXIgKmJmZF9mb3JtYXRfc3RyaW5nKGJmZF9mb3JtYXQgZm9ybWF0KTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBwb2ludGVyIHRvIGEgY29uc3Qgc3RyaW5nCi0JPDxpbnZhbGlkPj4sIDw8b2JqZWN0Pj4sIDw8YXJjaGl2ZT4+LCA8PGNvcmU+Piwgb3IgPDx1bmtub3duPj4sCi0JZGVwZW5kaW5nIHVwb24gdGhlIHZhbHVlIG9mIEB2YXJ7Zm9ybWF0fS4KLSovCi0KLUNPTlNUIGNoYXIgKgotYmZkX2Zvcm1hdF9zdHJpbmcgKGZvcm1hdCkKLSAgICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci17Ci0gIGlmICgoKGludClmb3JtYXQgPChpbnQpIGJmZF91bmtub3duKSAKLSAgICAgIHx8ICgoaW50KWZvcm1hdCA+PShpbnQpIGJmZF90eXBlX2VuZCkpIAotICAgIHJldHVybiAiaW52YWxpZCI7Ci0gIAotICBzd2l0Y2ggKGZvcm1hdCkgewotICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgcmV0dXJuICJvYmplY3QiOwkJLyogbGlua2VyL2Fzc2VtYmVyL2NvbXBpbGVyIG91dHB1dCAqLwotICBjYXNlIGJmZF9hcmNoaXZlOiAKLSAgICByZXR1cm4gImFyY2hpdmUiOwkJLyogb2JqZWN0IGFyY2hpdmUgZmlsZSAqLwotICBjYXNlIGJmZF9jb3JlOiAKLSAgICByZXR1cm4gImNvcmUiOwkJLyogY29yZSBkdW1wICovCi0gIGRlZmF1bHQ6IAotICAgIHJldHVybiAidW5rbm93biI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2JmZC9mcmVlYnNkLmggYi9iZmQvZnJlZWJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmIxOWFjLi4wMDAwMDAwCi0tLSBhL2JmZC9mcmVlYnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRlZmluaXRpb25zIHVzZWQgYnkgYWxsIEZyZWVCU0QgdGFyZ2V0cy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0qLwotCi0vKiBGcmVlQlNEIFpNQUdJQyBmaWxlcyBuZXZlciBoYXZlIHRoZSBoZWFkZXIgaW4gdGhlIHRleHQuICovCi0jZGVmaW5lCU5fSEVBREVSX0lOX1RFWFQoeCkJMAotCi0vKiBaTUFHSUMgZmlsZXMgc3RhcnQgYXQgb2Zmc2V0IDAuICBEb2VzIG5vdCBhcHBseSB0byBRTUFHSUMgZmlsZXMuICovCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUgkJMAotCi0jZGVmaW5lIE5fR0VUTUFHSUNfTkVUKGV4ZWMpIFwKLQkoKGV4ZWMpLmFfaW5mbyAmIDB4ZmZmZikKLSNkZWZpbmUgTl9HRVRNSURfTkVUKGV4ZWMpIFwKLQkoKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHgzZmYpCi0jZGVmaW5lIE5fR0VURkxBR19ORVQoZXgpIFwKLQkoKChleGVjKS5hX2luZm8gPj4gMjYpICYgMHgzZikKLQotI2RlZmluZSBOX01BQ0hUWVBFKGV4ZWMpIFwKLQkoKGVudW0gbWFjaGluZV90eXBlKSBcCi0JICgoTl9HRVRNQUdJQ19ORVQgKGV4ZWMpID09IFpNQUdJQykgPyBOX0dFVE1JRF9ORVQgKGV4ZWMpIDogXAotCSAgKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHgzZmYpKQotI2RlZmluZSBOX0ZMQUdTKGV4ZWMpIFwKLQkoKE5fR0VUTUFHSUNfTkVUIChleGVjKSA9PSBaTUFHSUMpID8gTl9HRVRGTEFHX05FVCAoZXhlYykgOiBcCi0JICgoZXhlYykuYV9pbmZvID4+IDI2KSAmIDB4M2YpCi0KLSNkZWZpbmUgTl9TRVRfSU5GTyhleGVjLCBtYWdpYywgdHlwZSwgZmxhZ3MpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCi0JIHwgKCgoaW50KSh0eXBlKSAmIDB4M2ZmKSA8PCAxNikgXAotCSB8ICgoKGZsYWdzKSAmIDB4M2YpIDw8IDI2KSkKLSNkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9IFwKLSAgICAgICAgICgoZXhlYykuYV9pbmZvICYgMHhmYjAwZmZmZikgfCAoKCgoaW50KShtYWNodHlwZSkpJjB4M2ZmKSA8PCAxNikpCi0jZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCi0JKChleGVjKS5hX2luZm8gPSBcCi0JICgoZXhlYykuYV9pbmZvICYgMHgwM2ZmZmZmZikgfCAoKGZsYWdzICYgMHgwM2YpIDw8IDI2KSkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotLyogT24gRnJlZUJTRCwgdGhlIG1hZ2ljIG51bWJlciBpcyBhbHdheXMgaW4gaTM4NiAobGl0dGxlLWVuZGlhbikKLSAgIGZvcm1hdC4gIEkgdGhpbmsuICAqLwotI2RlZmluZSBTV0FQX01BR0lDKGV4dCkgYmZkX2dldGwzMiAoZXh0KQotCi0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLXN0YXRpYyBib29sZWFuIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZS4KLSAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLU1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0jaWYgQ0hPT1NFX1JFTE9DX1NJWkUKLSAgQ0hPT1NFX1JFTE9DX1NJWkUoYWJmZCk7Ci0jZWxzZQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSNlbmRpZgotCi0gIC8qIE1hZ2ljIG51bWJlciwgbWFlc3RybywgcGxlYXNlISAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2goYWJmZCkpIHsKLSAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgIGlmIChzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJhLm91dC1tNjhrNGstbmV0YnNkIikgPT0gMCkKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV82OEs0S19ORVRCU0QpOwotICAgIGVsc2UKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV82OEtfTkVUQlNEKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fU1BBUkNfTkVUQlNEKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV8zODZfTkVUQlNEKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9uczMyazoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fNTMyX05FVEJTRCk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX1VOS05PV04pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvZ2VuLWFvdXQuYyBiL2JmZC9nZW4tYW91dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWVkOTFhLi4wMDAwMDAwCi0tLSBhL2JmZC9nZW4tYW91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qIEdlbmVyYXRlIHBhcmFtZXRlcnMgZm9yIGFuIGEub3V0IHN5c3RlbS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICIvdXNyL2luY2x1ZGUvYS5vdXQuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOyBjaGFyKiogYXJndjsKLXsKLSAgc3RydWN0IGV4ZWMgbXlfZXhlYzsKLSAgaW50IHBhZ2Vfc2l6ZTsKLSAgY2hhciAqdGFyZ2V0ID0gInVua25vd24iLCAqYXJjaCA9ICJ1bmtub3duIjsKLSAgRklMRSAqZmlsZSA9IGZvcGVuKCJnZW4tYW91dCIsICJyIik7Ci0KLSAgaWYgKGZpbGUgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBnZW4tYW91dCFcbiIpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChmcmVhZCgmbXlfZXhlYywgc2l6ZW9mKHN0cnVjdCBleGVjKSwgMSwgZmlsZSkgIT0gMSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgcmVhZCBnZW4tYW91dCFcbiIpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgdGFyZ2V0ID0gYXJndlsxXTsKLSAgaWYgKHRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBnZW4tYW91dCB0YXJnZXRfbmFtZVxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgfQotCi0jaWZkZWYgTl9UWFRPRkYKLSAgcGFnZV9zaXplID0gTl9UWFRPRkYobXlfZXhlYyk7Ci0gIGlmIChwYWdlX3NpemUgPT0gMCkKLSAgICBwcmludGYoIiNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAxXG4iKTsKLSAgZWxzZQotICAgIHByaW50ZigiI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDBcbiIpOwotI2VuZGlmCi0KLSAgcHJpbnRmKCIjZGVmaW5lIEJZVEVTX0lOX1dPUkQgJWRcbiIsIHNpemVvZiAoaW50KSk7Ci0gIGlmIChteV9leGVjLmFfZW50cnkgPT0gMCkgewotICAgICAgcHJpbnRmKCIjZGVmaW5lIEVOVFJZX0NBTl9CRV9aRVJPXG4iKTsKLSAgICAgIHByaW50ZigiI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMCAvKiBBdm9pZHMgd2FybmluZyAqL1xuIik7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgICBwcmludGYoIi8qI2RlZmluZSBFTlRSWV9DQU5fQkVfWkVSTyovXG4iKTsKLSAgICAgIHByaW50ZigiLyojZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwKi9cbiIpOwotICB9Ci0KLSAgcHJpbnRmKCIjZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAlZFxuIiwgbXlfZXhlYy5hX2VudHJ5KTsKLQotI2lmZGVmIFBBR1NJWgotICBpZiAocGFnZV9zaXplID09IDApCi0gICAgcGFnZV9zaXplID0gUEFHU0laOwotI2VuZGlmCi0gIGlmIChwYWdlX3NpemUgIT0gMCkKLSAgICBwcmludGYoIiNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAlZFxuIiwgcGFnZV9zaXplKTsKLSAgZWxzZQotICAgIHByaW50ZigiLyogI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFID8/PyAqL1xuIik7Ci0gIHByaW50ZigiI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRVxuIik7Ci0KLSNpZmRlZiB2YXgKLSAgYXJjaCA9ICJ2YXgiOwotI2VuZGlmCi0jaWZkZWYgbTY4awotICBhcmNoID0gIm02OGsiOwotI2VuZGlmCi0gIGlmIChhcmNoWzBdID09ICcxJykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIndhcm5pbmc6IHByZXByb2Nlc3NvciBzdWJzdGl0dXRlZCBhcmNoaXRlY3R1cmUgbmFtZSBpbnNpZGUgc3RyaW5nOyIpKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiICAgICAgICAgZml4IERFRkFVTFRfQVJDSCBpbiB0aGUgb3V0cHV0IGZpbGUgeW91cnNlbGZcbiIpKTsKLSAgICAgIGFyY2ggPSAidW5rbm93biI7Ci0gICAgfQotICBwcmludGYoIiNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoXyVzXG4iLCBhcmNoKTsKLQotICBwcmludGYoIlxuI2RlZmluZSBNWShPUCkgQ0FUKCVzXyxPUClcbiIsIHRhcmdldCk7Ci0gIHByaW50ZigiI2RlZmluZSBUQVJHRVROQU1FIFwiYS5vdXQtJXNcIlxuXG4iLCB0YXJnZXQpOwotCi0gIHByaW50ZigiI2luY2x1ZGUgXCJiZmQuaFwiXG4iKTsKLSAgcHJpbnRmKCIjaW5jbHVkZSBcInN5c2RlcC5oXCJcbiIpOwotICBwcmludGYoIiNpbmNsdWRlIFwibGliYmZkLmhcIlxuIik7Ci0gIHByaW50ZigiI2luY2x1ZGUgXCJsaWJhb3V0LmhcIlxuIik7Ci0gIHByaW50ZigiXG4jaW5jbHVkZSBcImFvdXQtdGFyZ2V0LmhcIlxuIik7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvZ2VubGluay5oIGIvYmZkL2dlbmxpbmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUwYThkZS4uMDAwMDAwMAotLS0gYS9iZmQvZ2VubGluay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIGdlbmxpbmsuaCAtLSBpbnRlcmZhY2UgdG8gdGhlIEJGRCBnZW5lcmljIGxpbmtlcgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgR0VOTElOS19ICi0jZGVmaW5lIEdFTkxJTktfSAotCi0vKiBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVybmFsIHRvIEJGRC4gIEl0IGRlc2NyaWJlcyB0aGUgaW50ZXJuYWwKLSAgIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBCRkQgZ2VuZXJpYyBsaW5rZXIsIGluIGNhc2UKLSAgIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBsaW5rZXJzIHdhbnQgdG8gdXNlIG9yIGNhbGwgdGhlbS4gIE5vdGUKLSAgIHRoYXQgc29tZSBmdW5jdGlvbnMsIHN1Y2ggYXMgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsCi0gICBhcmUgZGVjbGFyZWQgaW4gbGliYmZkLmgsIGJlY2F1c2UgdGhleSBhcmUgZXhwZWN0ZWQgdG8gYmUgd2lkZWx5Ci0gICB1c2VkLiAgVGhlIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgd2lsbCBwcm9iYWJseSBvbmx5Ci0gICBiZSB1c2VkIGJ5IGEgZmV3IGZpbGVzIGJlc2lkZXMgbGlua2VyLmMgaXRzZWxmLiAgSW4gZmFjdCwgdGhpcyBmaWxlCi0gICBpcyBub3QgcGFydGljdWxhcmx5IGNvbXBsZXRlOyBJIGhhdmUgb25seSBwdXQgaW4gdGhlIGludGVyZmFjZXMgSQotICAgYWN0dWFsbHkgbmVlZGVkLiAgKi8KLQotLyogVGhlIGdlbmVyaWMgbGlua2VyIHVzZXMgYSBoYXNoIHRhYmxlIHdoaWNoIGlzIGEgZGVyaXZlZCBjbGFzcyBvZgotICAgdGhlIHN0YW5kYXJkIGxpbmtlciBoYXNoIHRhYmxlLCBqdXN0IGFzIHRoZSBvdGhlciBiYWNrZW5kIHNwZWNpZmljCi0gICBsaW5rZXJzIGRvLiAgRG8gbm90IGNvbmZ1c2UgdGhlIGdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUgd2l0aCB0aGUKLSAgIHN0YW5kYXJkIEJGRCBsaW5rZXIgaGFzaCB0YWJsZSBpdCBpcyBidWlsdCB1cG9uLiAgKi8KLQotLyogR2VuZXJpYyBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIFdoZXRoZXIgdGhpcyBzeW1ib2wgaGFzIGJlZW4gd3JpdHRlbiBvdXQuICAqLwotICBib29sZWFuIHdyaXR0ZW47Ci0gIC8qIFN5bWJvbCBmcm9tIGlucHV0IEJGRC4gICovCi0gIGFzeW1ib2wgKnN5bTsKLX07Ci0KLS8qIEdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYW4gZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIFRoZSBnZW5lcmljIGxpbmtlciByZWFkcyBpbiB0aGUgYXN5bWJvbCBzdHJ1Y3R1cmVzIGZvciBhbiBpbnB1dCBCRkQKLSAgIGFuZCBrZWVwcyB0aGVtIGluIHRoZSBvdXRzeW1ib2wgYW5kIHN5bWNvdW50IGZpZWxkcy4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMoYWJmZCkgKChhYmZkKS0+b3V0c3ltYm9scykKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50KGFiZmQpICgoYWJmZCktPnN5bWNvdW50KQotCi0vKiBBZGQgdGhlIHN5bWJvbHMgb2YgaW5wdXRfYmZkIHRvIHRoZSBzeW1ib2xzIGJlaW5nIGJ1aWx0IGZvcgotICAgb3V0cHV0X2JmZC4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIGJmZCAqaW5wdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgIHNpemVfdCAqcHN5bWFsbG9jKSk7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCwgd2hpY2ggbWF5IGJlIGNhbGxlZCB2aWEKLSAgIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8KLXsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgc2l6ZV90ICpwc3ltYWxsb2M7Ci19OwotCi0vKiBXcml0ZSBvdXQgYSBzaW5nbGUgZ2xvYmFsIHN5bWJvbC4gIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkCi0gICB2aWEgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90cmF2ZXJzZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdAotICAgYWN0dWFsbHkgYmUgYSBzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8gKi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogR2VuZXJpYyBsaW5rIGhhc2ggdGFibGUgZW50cnkgY3JlYXRpb24gcm91dGluZS4gICovCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0gICAgICAgICAgIGNvbnN0IGNoYXIgKikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9nbzMyc3R1Yi5oIGIvYmZkL2dvMzJzdHViLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDM4OGMuLjAwMDAwMDAKLS0tIGEvYmZkL2dvMzJzdHViLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotMHg0ZCwweDVhLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDI3LDB4MDAsMHhmZiwweGZmLDB4MDAsMHgwMCwKLTB4NjAsMHgwNywweDAwLDB4MDAsMHg1NCwweDAwLDB4MDAsMHgwMCwweDBkLDB4MGEsMHg3MywweDc0LDB4NzUsMHg2MiwweDJlLDB4NjgsCi0weDIwLDB4NjcsMHg2NSwweDZlLDB4NjUsMHg3MiwweDYxLDB4NzQsMHg2NSwweDY0LDB4MjAsMHg2NiwweDcyLDB4NmYsMHg2ZCwweDIwLAotMHg3MywweDc0LDB4NzUsMHg2MiwweDJlLDB4NjEsMHg3MywweDZkLDB4MjAsMHg2MiwweDc5LDB4MjAsMHg2NCwweDZhLDB4NjEsMHg3MywKLTB4NmQsMHgyYywweDIwLDB4NmYsMHg2ZSwweDIwLDB4NTcsMHg2NSwweDY0LDB4MjAsMHg0YSwweDc1LDB4NmUsMHgyMCwweDMxLDB4MzEsCi0weDIwLDB4MzEsMHgzNiwweDNhLDB4MzAsMHgzOSwweDNhLDB4MzEsMHgzNSwweDIwLDB4MzEsMHgzOSwweDM5LDB4MzcsMHgwZCwweDBhLAotMHg1NCwweDY4LDB4NjUsMHgyMCwweDUzLDB4NTQsMHg1NSwweDQyLDB4MmUsMHg0NSwweDU4LDB4NDUsMHgyMCwweDczLDB4NzQsMHg3NSwKLTB4NjIsMHgyMCwweDZjLDB4NmYsMHg2MSwweDY0LDB4NjUsMHg3MiwweDIwLDB4NjksMHg3MywweDIwLDB4NDMsMHg2ZiwweDcwLDB4NzksCi0weDcyLDB4NjksMHg2NywweDY4LDB4NzQsMHgyMCwweDI4LDB4NDMsMHgyOSwweDIwLDB4MzEsMHgzOSwweDM5LDB4MzMsMHgyZCwweDMxLAotMHgzOSwweDM5LDB4MzUsMHgyMCwweDQ0LDB4NGEsMHgyMCwweDQ0LDB4NjUsMHg2YywweDZmLDB4NzIsMHg2OSwweDY1LDB4MmUsMHgyMCwKLTB4MGQsMHgwYSwweDUwLDB4NjUsMHg3MiwweDZkLDB4NjksMHg3MywweDczLDB4NjksMHg2ZiwweDZlLDB4MjAsMHg2NywweDcyLDB4NjEsCi0weDZlLDB4NzQsMHg2NSwweDY0LDB4MjAsMHg3NCwweDZmLDB4MjAsMHg3NSwweDczLDB4NjUsMHgyMCwweDY2LDB4NmYsMHg3MiwweDIwLAotMHg2MSwweDZlLDB4NzksMHgyMCwweDcwLDB4NzUsMHg3MiwweDcwLDB4NmYsMHg3MywweDY1LDB4MjAsMHg3MCwweDcyLDB4NmYsMHg3NiwKLTB4NjksMHg2NCwweDY1LDB4NjQsMHgyMCwweDc0LDB4NjgsMHg2OSwweDczLDB4MjAsMHg2MywweDZmLDB4NzAsMHg3OSwweDcyLDB4NjksCi0weDY3LDB4NjgsMHg3NCwweDIwLDB4MGQsMHgwYSwweDcyLDB4NjUsMHg2ZCwweDYxLDB4NjksMHg2ZSwweDczLDB4MjAsMHg3MCwweDcyLAotMHg2NSwweDczLDB4NjUsMHg2ZSwweDc0LDB4MjAsMHg2MSwweDZlLDB4NjQsMHgyMCwweDc1LDB4NmUsMHg2ZCwweDZmLDB4NjQsMHg2OSwKLTB4NjYsMHg2OSwweDY1LDB4NjQsMHgyZSwweDIwLDB4MGQsMHgwYSwweDU0LDB4NjgsMHg2OSwweDczLDB4MjAsMHg2ZiwweDZlLDB4NmMsCi0weDc5LDB4MjAsMHg2MSwweDcwLDB4NzAsMHg2YywweDY5LDB4NjUsMHg3MywweDIwLDB4NzQsMHg2ZiwweDIwLDB4NzQsMHg2OCwweDY1LAotMHgyMCwweDczLDB4NzQsMHg3NSwweDYyLDB4MmMsMHgyMCwweDYxLDB4NmUsMHg2NCwweDIwLDB4NmUsMHg2ZiwweDc0LDB4MjAsMHg2ZSwKLTB4NjUsMHg2MywweDYzLDB4NjUsMHg3MywweDczLDB4NjEsMHg3MiwweDY5LDB4NmMsMHg3OSwweDIwLDB4NzQsMHg2OCwweDY1LDB4MjAsCi0weDc3LDB4NjgsMHg2ZiwweDZjLDB4NjUsMHgyMCwweDcwLDB4NzIsMHg2ZiwweDY3LDB4NzIsMHg2MSwweDZkLDB4MmUsMHgwYSwweDBkLAotMHgwYSwweDI0LDB4NDksMHg2NCwweDNhLDB4MjAsMHg3MywweDc0LDB4NzUsMHg2MiwweDJlLDB4NjEsMHg3MywweDZkLDB4MjAsMHg2MiwKLTB4NzUsMHg2OSwweDZjLDB4NzQsMHgyMCwweDMwLDB4MzYsMHgyZiwweDMxLDB4MzEsMHgyZiwweDM5LDB4MzcsMHgyMCwweDMxLDB4MzYsCi0weDNhLDB4MzAsMHgzOSwweDNhLDB4MzEsMHgzNSwweDIwLDB4NjIsMHg3OSwweDIwLDB4NjQsMHg2YSwweDYxLDB4NzMsMHg2ZCwweDIwLAotMHgyNCwweDBhLDB4MGQsMHgwYSwweDQwLDB4MjgsMHgyMywweDI5LDB4MjAsMHg3MywweDc0LDB4NzUsMHg2MiwweDJlLDB4NjEsMHg3MywKLTB4NmQsMHgyMCwweDYyLDB4NzUsMHg2OSwweDZjLDB4NzQsMHgyMCwweDMwLDB4MzYsMHgyZiwweDMxLDB4MzEsMHgyZiwweDM5LDB4MzcsCi0weDIwLDB4MzEsMHgzNiwweDNhLDB4MzAsMHgzOSwweDNhLDB4MzEsMHgzNSwweDIwLDB4NjIsMHg3OSwweDIwLDB4NjQsMHg2YSwweDYxLAotMHg3MywweDZkLDB4MGEsMHgwZCwweDBhLDB4MWEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDY3LDB4NmYsMHgzMywweDMyLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyYywweDIwLDB4NzYsMHgyMCwweDMyLDB4MmUsMHgzMCwweDMwLAotMHg1NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLDB4NTcsMHg1MywweDQ0LDB4NTAsMHg0ZCwweDQ5LDB4MmUsMHg0NSwweDU4LDB4NDUsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwZSwweDFmLDB4OGMsMHgxZSwweDI0LDB4MDAsMHg4YywweDA2LDB4NjAsMHgwNywweGZjLDB4YjQsCi0weDMwLDB4Y2QsMHgyMSwweDNjLDB4MDMsMHg3MywweDA2LDB4YmEsMHg4NiwweDA1LDB4ZTksMHhiMiwweDAzLDB4YTIsMHg2OSwweDA4LAotMHhiYiwweDcwLDB4MDgsMHhhMSwweDIwLDB4MDAsMHgzOSwweGMzLDB4NzMsMHgwMiwweDg5LDB4YzMsMHg4OSwweDFlLDB4MjAsMHgwMCwKLTB4ZmUsMHhjNywweGI5LDB4MDQsMHhmZiwweGQzLDB4ZWIsMHhiNCwweDRhLDB4Y2QsMHgyMSwweDczLDB4MGEsMHhkMywweGUzLDB4ZmUsCi0weGNmLDB4ODksMHgxZSwweDIwLDB4MDAsMHhlYiwweGQ5LDB4MjYsMHg4ZSwweDA2LDB4MmMsMHgwMCwweDMxLDB4ZmYsMHgzMCwweGMwLAotMHhhOSwweGYyLDB4YWUsMHgyNiwweDgxLDB4M2QsMHg1MCwweDQxLDB4NzUsMHgxNSwweGFmLDB4MjYsMHg4MSwweDNkLDB4NTQsMHg0OCwKLTB4NzUsMHgwZCwweGFmLDB4MjYsMHg4MCwweDNkLDB4M2QsMHg3NSwweDA2LDB4NDcsMHg4OSwweDNlLDB4NjcsMHgwNCwweDRmLDB4YWUsCi0weDc1LDB4ZGYsMHhhZiwweDA2LDB4NTcsMHgzMSwweGM5LDB4NzQsMHgxMCwweGJhLDB4NWQsMHgwNSwweGU5LDB4NTAsMHgwMywweDA5LAotMHhjOSwweDc1LDB4ZjYsMHg0MSwweGU4LDB4OTIsMHgwMywweDcyLDB4ZjAsMHhiOCwweDg3LDB4MTYsMHhjZCwweDJmLDB4MDksMHhjMCwKLTB4NzUsMHhlZCwweDgwLDB4ZTMsMHgwMSwweDc0LDB4ZTgsMHg4OSwweDNlLDB4MDAsMHgwNiwweDhjLDB4MDYsMHgwMiwweDA2LDB4ODksCi0weDM2LDB4MDQsMHgwNiwweDVmLDB4MDcsMHhlOCwweGQ1LDB4MDIsMHg4OSwweDNlLDB4MmEsMHgwMCwweDg5LDB4MzYsMHg2MiwweDA3LAotMHg4MCwweDNlLDB4MmMsMHgwMCwweDAwLDB4NzQsMHgyNCwweGI5LDB4MDgsMHgwMCwweGJmLDB4MmMsMHgwMCwweDhhLDB4MDUsMHg0NywKLTB4MDgsMHhjMCwweDc0LDB4MDUsMHg4OCwweDA3LDB4NDMsMHhlMiwweGY0LDB4NjYsMHhjNywweDA3LDB4MmUsMHg0NSwweDU4LDB4NDUsCi0weDgxLDB4YzMsMHgwNCwweDAwLDB4YzYsMHgwNywweDAwLDB4ODksMHgxZSwweDYyLDB4MDcsMHhiOCwweDAwLDB4M2QsMHhiYSwweDY0LAotMHgwNywweGNkLDB4MjEsMHgwZiwweDgyLDB4YjQsMHgwMiwweGEzLDB4MDYsMHgwNiwweDg5LDB4YzMsMHhiOSwweDA2LDB4MDAsMHhiYSwKLTB4YjUsMHgwNywweGI0LDB4M2YsMHhjZCwweDIxLDB4MzEsMHhkMiwweDMxLDB4YzksMHhhMSwweGI1LDB4MDcsMHgzZCwweDRjLDB4MDEsCi0weDc0LDB4MWIsMHgzZCwweDRkLDB4NWEsMHgwZiwweDg1LDB4OTcsMHgwMiwweDhiLDB4MTYsMHhiOSwweDA3LDB4YzEsMHhlMiwweDA5LAotMHg4YiwweDFlLDB4YjcsMHgwNywweDA5LDB4ZGIsMHg3NCwweDA1LDB4ODAsMHhlZSwweDAyLDB4MDEsMHhkYSwweDg5LDB4MTYsMHhiYiwKLTB4MDcsMHg4OSwweDBlLDB4YmQsMHgwNywweGI4LDB4MDAsMHg0MiwweDhiLDB4MWUsMHgwNiwweDA2LDB4Y2QsMHgyMSwweGI5LDB4YTgsCi0weDAwLDB4YmEsMHhiZiwweDA3LDB4YjQsMHgzZiwweGNkLDB4MjEsMHgzZCwweGE4LDB4MDAsMHg3NSwweDA2LDB4ODEsMHgzZSwweGJmLAotMHgwNywweDRjLDB4MDEsMHgwZiwweDg1LDB4NWUsMHgwMiwweDY2LDB4YTEsMHhlMywweDA3LDB4NjYsMHhhMywweDEwLDB4MDYsMHg2NiwKLTB4OGIsMHgwZSwweGJiLDB4MDcsMHg2NiwweGExLDB4MDMsMHgwOCwweDY2LDB4MDEsMHhjOCwweDY2LDB4YTMsMHgwOCwweDA2LDB4NjYsCi0weGExLDB4MmIsMHgwOCwweDY2LDB4MDEsMHhjOCwweDY2LDB4YTMsMHgwYywweDA2LDB4NjYsMHg4YiwweDFlLDB4NGIsMHgwOCwweDY2LAotMHhhMSwweDRmLDB4MDgsMHg2NiwweDAxLDB4YzMsMHg2NiwweGI4LDB4MDEsMHgwMCwweDAxLDB4MDAsMHg2NiwweDM5LDB4YzMsMHg3MywKLTB4MDMsMHg2NiwweDg5LDB4YzMsMHg2NiwweDgxLDB4YzMsMHhmZiwweGZmLDB4MDAsMHgwMCwweDMxLDB4ZGIsMHg2NiwweDg5LDB4MWUsCi0weDFjLDB4MDAsMHhlOCwweGU4LDB4MDIsMHg4YiwweDFlLDB4MDQsMHgwNiwweDA5LDB4ZGIsMHg3NCwweDBhLDB4YjQsMHg0OCwweGNkLAotMHgyMSwweDBmLDB4ODIsMHgxMCwweDAyLDB4OGUsMHhjMCwweGU4LDB4ZmIsMHgwMiwweGI4LDB4MDEsMHgwMCwweGZmLDB4MWUsMHgwMCwKLTB4MDYsMHgwZiwweDgyLDB4MDgsMHgwMiwweDhjLDB4MDYsMHgyNiwweDAwLDB4OGMsMHgwZSwweDI4LDB4MDAsMHg4YywweGQ4LDB4YTMsCi0weDIyLDB4MDAsMHg4ZSwweGMwLDB4MzEsMHhjMCwweGI5LDB4MDEsMHgwMCwweGNkLDB4MzEsMHg3MiwweDA3LDB4YTMsMHgxNCwweDA2LAotMHgzMSwweGMwLDB4Y2QsMHgzMSwweDBmLDB4ODIsMHhlYSwweDAxLDB4YTMsMHgxNiwweDA2LDB4NjYsMHg4YiwweDBlLDB4MWMsMHgwMCwKLTB4YjgsMHgwMSwweDA1LDB4OGIsMHgxZSwweDFlLDB4MDAsMHhjZCwweDMxLDB4MGYsMHg4MiwweGRhLDB4MDEsMHg4OSwweDFlLDB4MWEsCi0weDA2LDB4ODksMHgwZSwweDE4LDB4MDYsMHg4OSwweDM2LDB4MWEsMHgwMCwweDg5LDB4M2UsMHgxOCwweDAwLDB4YjgsMHgwNywweDAwLAotMHg4YiwweDFlLDB4MTQsMHgwNiwweDhiLDB4MGUsMHgxYSwweDA2LDB4OGIsMHgxNiwweDE4LDB4MDYsMHhjZCwweDMxLDB4YjgsMHgwOSwKLTB4MDAsMHg4YywweGM5LDB4ODEsMHhlMSwweDAzLDB4MDAsMHhjMSwweGUxLDB4MDUsMHg1MSwweDgxLDB4YzksMHg5YiwweGMwLDB4Y2QsCi0weDMxLDB4YjgsMHgwOCwweDAwLDB4OGIsMHgwZSwweDFlLDB4MDAsMHg0OSwweGJhLDB4ZmYsMHhmZiwweGNkLDB4MzEsMHhiOCwweDA3LAotMHgwMCwweDhiLDB4MWUsMHgxNiwweDA2LDB4OGIsMHgwZSwweDFhLDB4MDYsMHg4YiwweDE2LDB4MTgsMHgwNiwweGNkLDB4MzEsMHhiOCwKLTB4MDksMHgwMCwweDU5LDB4ODEsMHhjOSwweDkzLDB4YzAsMHhjZCwweDMxLDB4YjgsMHgwOCwweDAwLDB4OGIsMHgwZSwweDFlLDB4MDAsCi0weDQ5LDB4YmEsMHhmZiwweGZmLDB4Y2QsMHgzMSwweGI4LDB4MDAsMHgwMSwweGJiLDB4MDAsMHgwZiwweGNkLDB4MzEsMHg3MywweDEwLAotMHgzZCwweDA4LDB4MDAsMHgwZiwweDg1LDB4NjUsMHgwMSwweGI4LDB4MDAsMHgwMSwweGNkLDB4MzEsMHgwZiwweDgyLDB4NWMsMHgwMSwKLTB4YTMsMHgxYywweDA2LDB4ODksMHgxNiwweDFlLDB4MDYsMHhjMSwweGUzLDB4MDQsMHg4OSwweDFlLDB4MjAsMHgwNiwweDY2LDB4OGIsCi0weDM2LDB4MDgsMHgwNiwweDY2LDB4OGIsMHgzZSwweGZiLDB4MDcsMHg2NiwweDhiLDB4MGUsMHhmZiwweDA3LDB4ZTgsMHg0OSwweDAwLAotMHg2NiwweDhiLDB4MzYsMHgwYywweDA2LDB4NjYsMHg4YiwweDNlLDB4MjMsMHgwOCwweDY2LDB4OGIsMHgwZSwweDI3LDB4MDgsMHhlOCwKLTB4MzcsMHgwMCwweDhlLDB4MDYsMHgxNiwweDA2LDB4NjYsMHg4YiwweDNlLDB4NGIsMHgwOCwweDY2LDB4OGIsMHgwZSwweDRmLDB4MDgsCi0weDY2LDB4MzEsMHhjMCwweDY2LDB4YzEsMHhlOSwweDAyLDB4NjcsMHhmMywweDY2LDB4YWIsMHhiNCwweDNlLDB4OGIsMHgxZSwweDA2LAotMHgwNiwweGNkLDB4MjEsMHhiOCwweDAxLDB4MDEsMHg4YiwweDE2LDB4MWUsMHgwNiwweGNkLDB4MzEsMHgxZSwweDBmLDB4YTEsMHg4ZSwKLTB4MWUsMHgxNiwweDA2LDB4NjYsMHg2NCwweGZmLDB4MmUsMHgxMCwweDA2LDB4NjYsMHg4OSwweGYwLDB4NjYsMHgyNSwweGZmLDB4MDEsCi0weDAwLDB4MDAsMHg2NiwweDAxLDB4YzEsMHgyOSwweGM2LDB4NjYsMHgyOSwweGM3LDB4NjYsMHg4OSwweDBlLDB4MjYsMHgwNiwweDY2LAotMHg4OSwweDNlLDB4MjIsMHgwNiwweGU4LDB4ZmUsMHgwMCwweDg5LDB4MzYsMHgzZSwweDA2LDB4NjYsMHhjMSwweGVlLDB4MTAsMHg4OSwKLTB4MzYsMHg0MiwweDA2LDB4OGIsMHgxZSwweDA2LDB4MDYsMHg4OSwweDFlLDB4M2EsMHgwNiwweGM3LDB4MDYsMHg0NiwweDA2LDB4MDAsCi0weDQyLDB4ZTgsMHhmMiwweDAwLDB4YTEsMHgxYywweDA2LDB4YTMsMHg0ZSwweDA2LDB4YzcsMHgwNiwweDNlLDB4MDYsMHgwMCwweDAwLAotMHhjNiwweDA2LDB4NDcsMHgwNiwweDNmLDB4YTEsMHgyOCwweDA2LDB4MDksMHhjMCwweDc1LDB4MDksMHhhMSwweDI2LDB4MDYsMHgzYiwKLTB4MDYsMHgyMCwweDA2LDB4NzYsMHgwMywweGExLDB4MjAsMHgwNiwweGEzLDB4NDIsMHgwNiwweGU4LDB4YzgsMHgwMCwweDY2LDB4MzEsCi0weGM5LDB4OGIsMHgwZSwweDQ2LDB4MDYsMHg2NiwweDhiLDB4M2UsMHgyMiwweDA2LDB4NjYsMHgwMSwweDBlLDB4MjIsMHgwNiwweDY2LAotMHgyOSwweDBlLDB4MjYsMHgwNiwweDY2LDB4MzEsMHhmNiwweGMxLDB4ZTksMHgwMiwweDFlLDB4MDYsMHg4ZSwweDA2LDB4MTYsMHgwNiwKLTB4OGUsMHgxZSwweDFlLDB4MDYsMHg2NywweGYzLDB4NjYsMHhhNSwweDA3LDB4MWYsMHg2NiwweDAzLDB4MGUsMHgyNiwweDA2LDB4NzUsCi0weGFmLDB4YzMsMHgzYywweDNhLDB4NzQsMHgwNiwweDNjLDB4MmYsMHg3NCwweDAyLDB4M2MsMHg1YywweGMzLDB4YmUsMHg2NCwweDA3LAotMHg4OSwweGYzLDB4MjYsMHg4YSwweDA1LDB4NDcsMHg4OCwweDA0LDB4MzgsMHhlMCwweDc0LDB4MGUsMHgwOCwweGMwLDB4NzQsMHgwYSwKLTB4NDYsMHhlOCwweGRlLDB4ZmYsMHg3NSwweGVjLDB4ODksMHhmMywweDc0LDB4ZTgsMHhjMywweGJhLDB4MjYsMHgwNSwweGViLDB4MDgsCi0weGJhLDB4MzQsMHgwNSwweGViLDB4MDMsMHhiYSwweDNlLDB4MDUsMHg1MiwweDhiLDB4MWUsMHg2MiwweDA3LDB4YzYsMHgwNywweDI0LAotMHhiYiwweDY0LDB4MDcsMHhlYiwweDFlLDB4ZTgsMHhlZCwweDAwLDB4YmEsMHg3OCwweDA1LDB4ZWIsMHgxMiwweGJhLDB4OTEsMHgwNSwKLTB4ZWIsMHgwZCwweGJhLDB4YTMsMHgwNSwweGViLDB4MDgsMHhiYSwweGI1LDB4MDUsMHhlYiwweDAzLDB4YmEsMHg3OCwweDA1LDB4NTIsCi0weGJiLDB4MTksMHgwNSwweGU4LDB4MTQsMHgwMCwweDViLDB4ZTgsMHgxMCwweDAwLDB4YmIsMHg0MiwweDA0LDB4ZTgsMHgwYSwweDAwLAotMHhiOCwweGZmLDB4NGMsMHhjZCwweDIxLDB4NDMsMHhiNCwweDAyLDB4Y2QsMHgyMSwweDhhLDB4MTcsMHg4MCwweGZhLDB4MjQsMHg3NSwKLTB4ZjQsMHhjMywweDBkLDB4MGEsMHgyNCwweDUwLDB4NTEsMHg1NywweDMxLDB4YzAsMHhiZiwweDJhLDB4MDYsMHhiOSwweDE5LDB4MDAsCi0weGYzLDB4YWIsMHg1ZiwweDU5LDB4NTgsMHhjMywweGI4LDB4MDAsMHgwMywweGJiLDB4MjEsMHgwMCwweDMxLDB4YzksMHg2NiwweGJmLAotMHgyYSwweDA2LDB4MDAsMHgwMCwweGNkLDB4MzEsMHhjMywweDAwLDB4MDAsMHgzMCwweGU0LDB4ZTgsMHg1ZiwweGZmLDB4ODksMHhkZSwKLTB4OGIsMHgzZSwweDY3LDB4MDQsMHhlYiwweDE4LDB4YjQsMHgzYiwweGU4LDB4NTIsMHhmZiwweDgxLDB4ZmUsMHg2NCwweDA3LDB4NzQsCi0weDEzLDB4OGEsMHg4NCwweGZmLDB4ZmYsMHhlOCwweDNhLDB4ZmYsMHg3NCwweDA0LDB4YzYsMHgwNCwweDVjLDB4NDYsMHhlOCwweDAzLAotMHgwMCwweDcyLDB4ZTMsMHhjMywweGU4LDB4MzYsMHgwMCwweGJiLDB4NDQsMHgwMCwweDhhLDB4MDcsMHg4OCwweDA0LDB4NDMsMHg0NiwKLTB4MDgsMHhjMCwweDc1LDB4ZjYsMHgwNiwweDU3LDB4MWUsMHgwNywweGU4LDB4OWEsMHhmZiwweGJiLDB4MmEsMHgwNiwweDhjLDB4OWYsCi0weDA0LDB4MDAsMHg4OSwweDlmLDB4MDIsMHgwMCwweGJhLDB4NjQsMHgwNywweGI4LDB4MDAsMHg0YiwweGNkLDB4MjEsMHg1ZiwweDA3LAotMHg3MiwweDA5LDB4YjQsMHg0ZCwweGNkLDB4MjEsMHgyZCwweDAwLDB4MDMsMHhmNywweGQ4LDB4ZWIsMHgyOCwweDgwLDB4M2UsMHg2OSwKLTB4MDgsMHgwNSwweDcyLDB4MjAsMHhiOCwweDAwLDB4NTgsMHhjZCwweDIxLDB4YTIsMHg2NywweDA4LDB4YjgsMHgwMiwweDU4LDB4Y2QsCi0weDIxLDB4YTIsMHg2OCwweDA4LDB4YjgsMHgwMSwweDU4LDB4YmIsMHg4MCwweDAwLDB4Y2QsMHgyMSwweGI4LDB4MDMsMHg1OCwweGJiLAotMHgwMSwweDAwLDB4Y2QsMHgyMSwweGMzLDB4OWMsMHg4MCwweDNlLDB4NjksMHgwOCwweDA1LDB4NzIsMHgxYSwweDUwLDB4NTMsMHhiOCwKLTB4MDMsMHg1OCwweDhhLDB4MWUsMHg2OCwweDA4LDB4MzAsMHhmZiwweGNkLDB4MjEsMHhiOCwweDAxLDB4NTgsMHg4YSwweDFlLDB4NjcsCi0weDA4LDB4MzAsMHhmZiwweGNkLDB4MjEsMHg1YiwweDU4LDB4OWQsMHhjMywweDRjLDB4NmYsMHg2MSwweDY0LDB4MjAsMHg2NSwweDcyLAotMHg3MiwweDZmLDB4NzIsMHgzYSwweDIwLDB4MjQsMHgzYSwweDIwLDB4NjMsMHg2MSwweDZlLDB4NmUsMHg2ZiwweDc0LDB4MjAsMHg2ZiwKLTB4NzAsMHg2NSwweDZlLDB4MjQsMHgzYSwweDIwLDB4NmUsMHg2ZiwweDc0LDB4MjAsMHg0NSwweDU4LDB4NDUsMHgyNCwweDNhLDB4MjAsCi0weDZlLDB4NmYsMHg3NCwweDIwLDB4NDMsMHg0ZiwweDQ2LDB4NDYsMHgyMCwweDI4LDB4NDMsMHg2OCwweDY1LDB4NjMsMHg2YiwweDIwLAotMHg2NiwweDZmLDB4NzIsMHgyMCwweDc2LDB4NjksMHg3MiwweDc1LDB4NzMsMHg2NSwweDczLDB4MjksMHgyNCwweDZlLDB4NmYsMHgyMCwKLTB4NDQsMHg1MCwweDRkLDB4NDksMHgyMCwweDJkLDB4MjAsMHg0NywweDY1LDB4NzQsMHgyMCwweDYzLDB4NzMsMHg2NCwweDcwLDB4NmQsCi0weDY5LDB4MmEsMHg2MiwweDJlLDB4N2EsMHg2OSwweDcwLDB4MjQsMHg2ZSwweDZmLDB4MjAsMHg0NCwweDRmLDB4NTMsMHgyMCwweDZkLAotMHg2NSwweDZkLDB4NmYsMHg3MiwweDc5LDB4MjQsMHg2ZSwweDY1LDB4NjUsMHg2NCwweDIwLDB4NDQsMHg0ZiwweDUzLDB4MjAsMHgzMywKLTB4MjQsMHg2MywweDYxLDB4NmUsMHgyNywweDc0LDB4MjAsMHg3MywweDc3LDB4NjksMHg3NCwweDYzLDB4NjgsMHgyMCwweDZkLDB4NmYsCi0weDY0LDB4NjUsMHgyNCwweDZlLDB4NmYsMHgyMCwweDQ0LDB4NTAsMHg0ZCwweDQ5LDB4MjAsMHg3MywweDY1LDB4NmMsMHg2NSwweDYzLAotMHg3NCwweDZmLDB4NzIsMHg3MywweDI0LDB4NmUsMHg2ZiwweDIwLDB4NDQsMHg1MCwweDRkLDB4NDksMHgyMCwweDZkLDB4NjUsMHg2ZCwKLTB4NmYsMHg3MiwweDc5LDB4MjQsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsCi0weDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLAotMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwKLTB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAKZGlmZiAtLWdpdCBhL2JmZC9oYXNoLmMgYi9iZmQvaGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNlYWY3Li4wMDAwMDAwCi0tLSBhL2JmZC9oYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzQgKzAsMCBAQAotLyogaGFzaC5jIC0tIGhhc2ggdGFibGUgcm91dGluZXMgZm9yIEJGRAotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+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+c2l6ZTsKLSAgZm9yIChwcGggPSAmdGFibGUtPnRhYmxlW2luZGV4XTsKLSAgICAgICAoKnBwaCkgIT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMOwotICAgICAgIHBwaCA9ICYoKnBwaCktPm5leHQpCi0gICAgewotICAgICAgaWYgKCpwcGggPT0gb2xkKQotCXsKLQkgICpwcGggPSBudzsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGFib3J0ICgpOwotfQotCi0vKiBCYXNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBuZXcgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWJmZF9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGVudHJ5ID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICBlbnRyeSA9ICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopCi0JICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5KSkpOwotICByZXR1cm4gZW50cnk7Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIGluIGEgaGFzaCB0YWJsZS4gICovCi0KLVBUUgotYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgUFRSIHJldDsKLQotICByZXQgPSBvYmphbGxvY19hbGxvYyAoKHN0cnVjdCBvYmphbGxvYyAqKSB0YWJsZS0+bWVtb3J5LCBzaXplKTsKLSAgaWYgKHJldCA9PSBOVUxMICYmIHNpemUgIT0gMCkKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVHJhdmVyc2UgYSBoYXNoIHRhYmxlLiAgKi8KLQotdm9pZAotYmZkX2hhc2hfdHJhdmVyc2UgKHRhYmxlLCBmdW5jLCBpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBib29sZWFuICgqZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotICAgICBQVFIgaW5mbzsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpwOwotCi0gICAgICBmb3IgKHAgPSB0YWJsZS0+dGFibGVbaV07IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKCEgKCpmdW5jKSAocCwgaW5mbykpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotfQotDAotLyogQSBmZXcgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMgKGEub3V0LCBDT0ZGLCBFTEYpIHVzZSBhIHN0cmluZwotICAgdGFibGUuICBUaGVzZSBmdW5jdGlvbnMgc3VwcG9ydCBhZGRpbmcgc3RyaW5ncyB0byBhIHN0cmluZyB0YWJsZSwKLSAgIHJldHVybmluZyB0aGUgYnl0ZSBvZmZzZXQsIGFuZCB3cml0aW5nIG91dCB0aGUgdGFibGUuCi0KLSAgIFBvc3NpYmxlIGltcHJvdmVtZW50czoKLSAgICsgbG9vayBmb3Igc3RyaW5ncyBtYXRjaGluZyB0cmFpbGluZyBzdWJzdHJpbmdzIG9mIG90aGVyIHN0cmluZ3MKLSAgICsgYmV0dGVyIGRhdGEgc3RydWN0dXJlcz8gIGJhbGFuY2VkIHRyZWVzPwotICAgKyBsb29rIGF0IHJlZHVjaW5nIG1lbW9yeSB1c2UgZWxzZXdoZXJlIC0tIG1heWJlIGlmIHdlIGRpZG4ndCBoYXZlCi0gICAgIHRvIGNvbnN0cnVjdCB0aGUgZW50aXJlIHN5bWJvbCB0YWJsZSBhdCBvbmNlLCB3ZSBjb3VsZCBnZXQgYnkKLSAgICAgd2l0aCBzbWFsbGVyIGFtb3VudHMgb2YgVk0/ICAoV2hhdCBlZmZlY3QgZG9lcyB0aGF0IGhhdmUgb24gdGhlCi0gICAgIHN0cmluZyB0YWJsZSByZWR1Y3Rpb25zPykgICovCi0KLS8qIEFuIGVudHJ5IGluIHRoZSBzdHJ0YWIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogSW5kZXggaW4gc3RyaW5nIHRhYmxlLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBpbmRleDsKLSAgLyogTmV4dCBzdHJpbmcgaW4gc3RydGFiLiAgKi8KLSAgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICpuZXh0OwotfTsKLQotLyogVGhlIHN0cnRhYiBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9zdHJ0YWJfaGFzaAotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgdGFibGU7Ci0gIC8qIFNpemUgb2Ygc3RydGFiLS1hbHNvIG5leHQgYXZhaWxhYmxlIGluZGV4LiAgKi8KLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICAvKiBGaXJzdCBzdHJpbmcgaW4gc3RydGFiLiAgKi8KLSAgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICpmaXJzdDsKLSAgLyogTGFzdCBzdHJpbmcgaW4gc3RydGFiLiAgKi8KLSAgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICpsYXN0OwotICAvKiBXaGV0aGVyIHRvIHByZWNlZGUgc3RyaW5ncyB3aXRoIGEgdHdvIGJ5dGUgbGVuZ3RoLCBhcyBpbiB0aGUKLSAgICAgWENPRkYgLmRlYnVnIHNlY3Rpb24uICAqLwotICBib29sZWFuIHhjb2ZmOwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3RydGFiX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhIHN0cnRhYi4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotc3RydGFiX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPmluZGV4ID0gKGJmZF9zaXplX3R5cGUpIC0xOwotICAgICAgcmV0LT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIHN0cnRhYi4gICovCi0KLSNkZWZpbmUgc3RydGFiX2hhc2hfbG9va3VwKHQsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0KS0+dGFibGUsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogQ3JlYXRlIGEgbmV3IHN0cnRhYi4gICovCi0KLXN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKgotX2JmZF9zdHJpbmd0YWJfaW5pdCAoKQotewotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWJsZTsKLQotICB0YWJsZSA9ICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKQotCSAgIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCkpKTsKLSAgaWYgKHRhYmxlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT50YWJsZSwgc3RydGFiX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAodGFibGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHRhYmxlLT5zaXplID0gMDsKLSAgdGFibGUtPmZpcnN0ID0gTlVMTDsKLSAgdGFibGUtPmxhc3QgPSBOVUxMOwotICB0YWJsZS0+eGNvZmYgPSBmYWxzZTsKLQotICByZXR1cm4gdGFibGU7Ci19Ci0KLS8qIENyZWF0ZSBhIG5ldyBzdHJ0YWIgaW4gd2hpY2ggdGhlIHN0cmluZ3MgYXJlIG91dHB1dCBpbiB0aGUgZm9ybWF0Ci0gICB1c2VkIGluIHRoZSBYQ09GRiAuZGVidWcgc2VjdGlvbjogYSB0d28gYnl0ZSBsZW5ndGggcHJlY2VkZXMgZWFjaAotICAgc3RyaW5nLiAgKi8KLQotc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqCi1fYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0ICgpCi17Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnJldDsKLQotICByZXQgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgcmV0LT54Y29mZiA9IHRydWU7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEZyZWUgYSBzdHJ0YWIuICAqLwotCi12b2lkCi1fYmZkX3N0cmluZ3RhYl9mcmVlICh0YWJsZSkKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFibGU7Ci17Ci0gIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZ0YWJsZS0+dGFibGUpOwotICBmcmVlICh0YWJsZSk7Ci19Ci0KLS8qIEdldCB0aGUgaW5kZXggb2YgYSBzdHJpbmcgaW4gYSBzdHJ0YWIsIGFkZGluZyBpdCBpZiBpdCBpcyBub3QKLSAgIGFscmVhZHkgcHJlc2VudC4gIElmIEhBU0ggaXMgZmFsc2UsIHdlIGRvbid0IHJlYWxseSB1c2UgdGhlIGhhc2gKLSAgIHRhYmxlLCBhbmQgd2UgZG9uJ3QgZWxpbWluYXRlIGR1cGxpY2F0ZSBzdHJpbmdzLiAgKi8KLQotYmZkX3NpemVfdHlwZQotX2JmZF9zdHJpbmd0YWJfYWRkICh0YWIsIHN0ciwgaGFzaCwgY29weSkKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFiOwotICAgICBjb25zdCBjaGFyICpzdHI7Ci0gICAgIGJvb2xlYW4gaGFzaDsKLSAgICAgYm9vbGVhbiBjb3B5OwotewotICByZWdpc3RlciBzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKmVudHJ5OwotCi0gIGlmIChoYXNoKQotICAgIHsKLSAgICAgIGVudHJ5ID0gc3RydGFiX2hhc2hfbG9va3VwICh0YWIsIHN0ciwgdHJ1ZSwgY29weSk7Ci0gICAgICBpZiAoZW50cnkgPT0gTlVMTCkKLQlyZXR1cm4gKGJmZF9zaXplX3R5cGUpIC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGVudHJ5ID0gKChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikKLQkgICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZ0YWItPnRhYmxlLAotCQkJCSAgc2l6ZW9mIChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkpKSk7Ci0gICAgICBpZiAoZW50cnkgPT0gTlVMTCkKLQlyZXR1cm4gKGJmZF9zaXplX3R5cGUpIC0xOwotICAgICAgaWYgKCEgY29weSkKLQllbnRyeS0+cm9vdC5zdHJpbmcgPSBzdHI7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqbjsKLQotCSAgbiA9IChjaGFyICopIGJmZF9oYXNoX2FsbG9jYXRlICgmdGFiLT50YWJsZSwgc3RybGVuIChzdHIpICsgMSk7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICByZXR1cm4gKGJmZF9zaXplX3R5cGUpIC0xOwotCSAgZW50cnktPnJvb3Quc3RyaW5nID0gbjsKLQl9Ci0gICAgICBlbnRyeS0+aW5kZXggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0gICAgICBlbnRyeS0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChlbnRyeS0+aW5kZXggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotICAgIHsKLSAgICAgIGVudHJ5LT5pbmRleCA9IHRhYi0+c2l6ZTsKLSAgICAgIHRhYi0+c2l6ZSArPSBzdHJsZW4gKHN0cikgKyAxOwotICAgICAgaWYgKHRhYi0+eGNvZmYpCi0JewotCSAgZW50cnktPmluZGV4ICs9IDI7Ci0JICB0YWItPnNpemUgKz0gMjsKLQl9Ci0gICAgICBpZiAodGFiLT5maXJzdCA9PSBOVUxMKQotCXRhYi0+Zmlyc3QgPSBlbnRyeTsKLSAgICAgIGVsc2UKLQl0YWItPmxhc3QtPm5leHQgPSBlbnRyeTsKLSAgICAgIHRhYi0+bGFzdCA9IGVudHJ5OwotICAgIH0KLQotICByZXR1cm4gZW50cnktPmluZGV4OwotfQotCi0vKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHN0cnRhYi4gICovCi0KLWJmZF9zaXplX3R5cGUKLV9iZmRfc3RyaW5ndGFiX3NpemUgKHRhYikKLSAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFiOwotewotICByZXR1cm4gdGFiLT5zaXplOwotfQotCi0vKiBXcml0ZSBvdXQgYSBzdHJ0YWIuICBBQkZEIG11c3QgYWxyZWFkeSBiZSBhdCB0aGUgcmlnaHQgbG9jYXRpb24gaW4KLSAgIHRoZSBmaWxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgdGFiKQotICAgICByZWdpc3RlciBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYjsKLXsKLSAgcmVnaXN0ZXIgYm9vbGVhbiB4Y29mZjsKLSAgcmVnaXN0ZXIgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICplbnRyeTsKLQotICB4Y29mZiA9IHRhYi0+eGNvZmY7Ci0KLSAgZm9yIChlbnRyeSA9IHRhYi0+Zmlyc3Q7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCi0gICAgewotICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqc3RyOwotICAgICAgcmVnaXN0ZXIgc2l6ZV90IGxlbjsKLQotICAgICAgc3RyID0gZW50cnktPnJvb3Quc3RyaW5nOwotICAgICAgbGVuID0gc3RybGVuIChzdHIpICsgMTsKLQotICAgICAgaWYgKHhjb2ZmKQotCXsKLQkgIGJmZF9ieXRlIGJ1ZlsyXTsKLQotCSAgLyogVGhlIG91dHB1dCBsZW5ndGggaW5jbHVkZXMgdGhlIG51bGwgYnl0ZS4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLCBsZW4sIGJ1Zik7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWYsIDEsIDIsIGFiZmQpICE9IDIpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHN0ciwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9ob3N0LWFvdXQuYyBiL2JmZC9ob3N0LWFvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2NDNkYy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdC1hb3V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgbG9jYWwgaG9zdCdzIGEub3V0IGJpbmFyaWVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4gIFByb2JhYmx5IEpvaG4gR2lsbW9yZSdzIGZhdWx0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZQlBUkNIX1NJWkUJMzIKLQotLyogV2hlbiBwb3J0aW5nIHRvIGEgbmV3IHN5c3RlbSwgeW91IG11c3Qgc3VwcGx5OgotCi0JSE9TVF9QQUdFX1NJWkUJCShvcHRpb25hbCkKLQlIT1NUX1NFR01FTlRfU0laRQkob3B0aW9uYWwgLS0gZGVmYXVsdHMgdG8gcGFnZSBzaXplKQotCUhPU1RfTUFDSElORV9BUkNICShvcHRpb25hbCkKLQlIT1NUX01BQ0hJTkVfTUFDSElORQkob3B0aW9uYWwpCi0JSE9TVF9URVhUX1NUQVJUX0FERFIJKG9wdGlvbmFsKQotCUhPU1RfU1RBQ0tfRU5EX0FERFIJKG5vdCB1c2VkLCBleGNlcHQgYnkgdHJhZC1jb3JlID8/PykKLQlIT1NUX0JJR19FTkRJQU5fUAkocmVxdWlyZWQgLS0gZGVmaW5lIGlmIGJpZy1lbmRpYW4pCi0KLSAgIGluIHRoZSAuL2hvc3RzL2gtc3lzdGVtbmFtZS5oIGZpbGUuICAqLwotCi0jaWZkZWYgVFJBRF9IRUFERVIKLSNpbmNsdWRlIFRSQURfSEVBREVSCi0jZW5kaWYKLQotI2lmZGVmCQkJSE9TVF9QQUdFX1NJWkUKLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQlIT1NUX1BBR0VfU0laRQotI2VuZGlmCi0KLSNpZmRlZgkJCUhPU1RfU0VHTUVOVF9TSVpFCi0jZGVmaW5lCVNFR01FTlRfU0laRQlIT1NUX1NFR01FTlRfU0laRQotI2Vsc2UKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLSNlbmRpZgotCi0jaWZkZWYJCQlIT1NUX1RFWFRfU1RBUlRfQUREUgotI2RlZmluZQlURVhUX1NUQVJUX0FERFIJSE9TVF9URVhUX1NUQVJUX0FERFIKLSNlbmRpZgotCi0jaWZkZWYJCQlIT1NUX1NUQUNLX0VORF9BRERSCi0jZGVmaW5lCVNUQUNLX0VORF9BRERSCUhPU1RfU1RBQ0tfRU5EX0FERFIKLSNlbmRpZgotCi0jaWZkZWYJCQlIT1NUX0JJR19FTkRJQU5fUAotI2RlZmluZQlUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZWxzZQotI3VuZGVmICBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0jaWZkZWYgSE9TVF9NQUNISU5FX0FSQ0gKLSNpZmRlZiBIT1NUX01BQ0hJTkVfTUFDSElORQotI2RlZmluZSBTRVRfQVJDSF9NQUNIKGFiZmQsIGV4ZWNwKSBcCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgSE9TVF9NQUNISU5FX0FSQ0gsIEhPU1RfTUFDSElORV9NQUNISU5FKQotI2Vsc2UKLSNkZWZpbmUgU0VUX0FSQ0hfTUFDSChhYmZkLCBleGVjcCkgXAotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoKGFiZmQsIEhPU1RfTUFDSElORV9BUkNILCAwKQotI2VuZGlmCi0jZW5kaWYgLyogSE9TVF9NQUNISU5FX0FSQ0ggKi8KLQotI2RlZmluZSBNWShPUCkgQ0FUKGhvc3RfYW91dF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0IgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9hbHBoYWxpbnV4LmggYi9iZmQvaG9zdHMvYWxwaGFsaW51eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWI4ZDY5Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9hbHBoYWxpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS8qIExpbnV4IGR1bXBzICJzdHJ1Y3QgdGFza19zdHJ1Y3QiIGF0IHRoZSBlbmQgb2YgdGhlIGNvcmUtZmlsZS4gIFRoaXMKLSAgIHN0cnVjdHVyZSBpcyBjdXJyZW50bHkgMTA4MCBieXRlcyBsb25nLCBidXQgd2UgYWxsb3cgdXAgdG8gNDA5NgotICAgYnl0ZXMgdG8gYWxsb3cgZm9yIHNvbWUgZnV0dXJlIGdyb3d0aC4gICovCi0jZGVmaW5lIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQJCTQwOTYKLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gICgoYWJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnNpZ25hbCkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9hbHBoYXZtcy5oIGIvYmZkL2hvc3RzL2FscGhhdm1zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZTM5MWEuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2FscGhhdm1zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKiBhbHBoYXZtcy5oIC0tIEJGRCBkZWZpbml0aW9ucyBmb3IgYW4gb3BlblZNUyBob3N0Ci0gICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgS+RtcGYgKGtrYWVtcGZAcHJvZ2lzLmRlKQotICAgb2YgcHJvR0lTIFNvZnR3YXJlZW50d2lja2x1bmcsIEFhY2hlbiwgR2VybWFueQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bml4bGliLmg+Ci0jaW5jbHVkZSA8dW5peGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0KLSNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCi0vKiBNYWtlIHRoZSBiYXNpYyB0eXBlcyA2NC1iaXQgcXVhbnRpdGllcyBvbiB0aGUgaG9zdC4KLSAgIEFsc28gcHJvdmlkZSB0aGUgc3VwcG9ydCBtYWNyb3MgQkZEIG5lZWRzLiAgKi8KLSMgaWZkZWYgX19HTlVDX18KLSMgIGRlZmluZQlCRkRfSE9TVF82NF9CSVQJbG9uZyBsb25nCi0jIGVsc2UKLSMgIGRlZmluZQlCRkRfSE9TVF82NF9CSVQJbG9uZwotIyBlbmRpZgotdHlwZWRlZiB1bnNpZ25lZCBCRkRfSE9TVF82NF9CSVQgdWludDY0X3R5cGU7Ci10eXBlZGVmIEJGRF9IT1NUXzY0X0JJVCBpbnQ2NF90eXBlOwotCi0jIGRlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYgKHMsICIlMDE2bHgiLCB4KSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLSMgZGVmaW5lIGZwcmludGZfdm1hKGYseCkgZnByaW50ZiAoZiwgIiUwMTZseCIsIHgpIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwotCi0jIGRlZmluZSBCWVRFU19JTl9QUklOVEZfSU5UIDQKLQotLyogVGhlc2UgbXVzdCBoYXZlIHR5cGUgdW5zaWduZWQgbG9uZyBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgYXMKLSAgIGFyZ3VtZW50cyBpbiBwcmludGYgZnVuY3Rpb25zLiAgKi8KLSMgZGVmaW5lIHVpbnQ2NF90eXBlTE9XKHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgJiAweGZmZmZmZmZmKSkpIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwotIyBkZWZpbmUgdWludDY0X3R5cGVISUdIKHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgPj4gMzIpICYgMHhmZmZmZmZmZikpIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwotCi0jZW5kaWYgLyogQkZEX0hPU1RfNjRfQklUICovCi0KLSNpbmNsdWRlICJmb3Blbi12bXMuaCIKLQotI2RlZmluZSBOT19GQ05UTCAxCi0KLSNpZm5kZWYgT19BQ0NNT0RFCi0jZGVmaW5lIE9fQUNDTU9ERSAoT19SRE9OTFkgfCBPX1dST05MWSB8IE9fUkRXUikKLSNlbmRpZgotCi1leHRlcm4gaW50IGdldHBhZ2VzaXplIFBBUkFNUyAoKHZvaWQpKTsKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9kZWNzdGF0aW9uLmggYi9iZmQvaG9zdHMvZGVjc3RhdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODBjMTQzLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9kZWNzdGF0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKiBIb3BlZnVsbHkgdGhpcyBzaG91bGQgaW5jbHVkZSBlaXRoZXIgbWFjaGluZS9wYXJhbS5oIChVbHRyaXgpIG9yCi0gICBtYWNoaW5lL21hY2hwYXJhbS5oIChNYWNoKSwgd2hpY2hldmVyIGlzIGl0cyBuYW1lIG9uIHRoaXMgc3lzdGVtLiAgKi8KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0vKiAjZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcgLS0gd2UgdXNlIEhPU1RfREFUQV9TVEFSVF9BRERSICovCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX21pcHMKLS8qICNkZWZpbmUJSE9TVF9NQUNISU5FX01BQ0hJTkUJICovCi0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9EQVRBX1NUQVJUX0FERFIJCVVTUkRBVEEKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkJVVNSU1RBQ0sKLQotI2RlZmluZSBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGNvcmVfYmZkKSBcCi0gICgoY29yZV9iZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2FyZ1swXSkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9kZWx0YTY4LmggYi9iZmQvaG9zdHMvZGVsdGE2OC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTZhNmU2Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9kZWx0YTY4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKiBEZWZpbml0aW9ucyBmb3IgYSBNb3Rvcm9sYSBEZWx0YSAzMzAwIGJveCBydW5uaW5nIFN5c3RlbSBWIFIzLjAuCi0gICBDb250cmlidXRlZCBieSBtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZS4gICovCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0cmFkLWNvcmUuYy4gICovCi0jZGVmaW5lCU5CUEcJCQlOQlBDCi0jZGVmaW5lCUhPU1RfREFUQV9TVEFSVF9BRERSCXUudV9leGRhdGEudXhfZGF0b3JnCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCXUudV9leGRhdGEudXhfdHh0b3JnCi0jaWYgMAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCTB4NDAwMDAwMDAKLSNlbHNlCi0vKiBVc2VyJ3Mgc3RhY2ssIGNvcGllZCBmcm9tIHN5cy9wYXJhbS5oICAqLwotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCi0jZW5kaWYKLSNkZWZpbmUJVVBBR0VTCQkJVVNJWkUKLSNkZWZpbmUJVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gIGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnVfYWJvcnQKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9kcHgyLmggYi9iZmQvaG9zdHMvZHB4Mi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTYzOTVmLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9kcHgyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLS8qIERlZmluaXRpb25zIHRoYXQgYXJlIG5lZWRlZCBmb3IgY29yZSBmaWxlcy4gIENvcmUgc2VjdGlvbiBzaXplcyBmb3IKLSAgIHRoZSBEUFgyIGFyZSBpbiBieXRlcy4gICovCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNkZWZpbmUgTkJQRyAxCi0jZGVmaW5lIFVQQUdFUyAoVVNJWkUgKiBOQlBQKQotI2RlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiAodS51X2V4ZGF0YS51eF9kYXRvcmcpCi0jZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgKFVTRVJTVEFDSykKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9ocDMwMGJzZC5oIGIvYmZkL2hvc3RzL2hwMzAwYnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Mjg3MTcuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2hwMzAwYnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaWZkZWYgQlNENF80Ci0jZGVmaW5lIE5PX0NPUkVfQ09NTUFORAotI2VuZGlmCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLSNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRwkvKiBEYXRhIHNlZyBzdGFydCBhZGRyIHJvdW5kcyB0byBOQlBHICovCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX202OGsKLS8qICNkZWZpbmUJSE9TVF9NQUNISU5FX01BQ0hJTkUJICovCi0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJCTAKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkJMHhmZmYwMDAwMAotI2RlZmluZQlIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2kzODZic2QuaCBiL2JmZC9ob3N0cy9pMzg2YnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZWUzZDguLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2kzODZic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEludGVsIDM4NiBydW5uaW5nIGFueSBCU0QgVW5peCAqLwotCi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotCi0vKiBSZWNlbnQgdmVyc2lvbnMgb2YgRnJlZUJTRCBkb24ndCBkZWZpbmUgTkJQRy4gICovCi0jaWZuZGVmIE5CUEcKLSNpZmRlZiBQQUdFX1NJWkUKLSNkZWZpbmUgTkJQRyBQQUdFX1NJWkUKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfaTM4NgotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgkJVVNSVEVYVAotCi0vKiBKb2xpdHogc3VnZ2VzdGVkIGRlZmluaW5nIEhPU1RfU1RBQ0tfRU5EX0FERFIgdG8KLSAgICh1LnVfa3Byb2Mua3BfZXByb2MuZV92bS52bV9tYXhzYWRkciArIE1BWFNTSVopLCB3aGljaCBzaG91bGQgd29yayBvbgotICAgYm90aCBCU0RJIGFuZCAzODZCU0QsIGJ1dCB0aGF0IGlzIGJlbGlldmVkIG5vdCB0byB3b3JrIGZvciBCU0QgNC40LiAgKi8KLQotI2lmZGVmIF9fYnNkaV9fCi0vKiBUaGlzIHNlZW1zIHRvIGJlIHRoZSByaWdodCB0aGluZyBmb3IgQlNESS4gICovCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCVVTUlNUQUNLCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSICgoYmZkX3ZtYSl1LnVfa3Byb2Mua3BfZXByb2MuZV92bS52bV9kYWRkcikKLSNlbHNlCi0vKiBUaGlzIHNlZW1zIHRvIGJlIHRoZSByaWdodCB0aGluZyBmb3IgMzg2QlNEIHJlbGVhc2UgMC4xLiAgKi8KLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkJKFVTUlNUQUNLIC0gTUFYU1NJWikKLSNlbmRpZgotCi0jZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoY29yZV9iZmQpIFwKLSAgKChjb3JlX2JmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnVfc2lnKQotI2RlZmluZSB1X2NvbW0gdV9rcHJvYy5rcF9wcm9jLnBfY29tbQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2kzODZsaW51eC5oIGIvYmZkL2hvc3RzL2kzODZsaW51eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2E1MWYxLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9pMzg2bGludXguaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotLyogTGludXggd3JpdGVzIHRoZSB0YXNrIHN0cnVjdHVyZSBhdCB0aGUgZW5kIG9mIHRoZSBjb3JlIGZpbGUuICBDdXJyZW50bHkgaXQKLSAgIGlzIDI5MTIgYnl0ZXMuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoaXMgc2hvdWxkIGJlIGEgcGlja2llciBjaGVjaywgYnV0Ci0gICB3ZSBzaG91bGQgcHJvYmFibHkgbm90IGJlIHRvbyBwaWNreSAodGhlIHNpemUgb2YgdGhlIHRhc2sgc3RydWN0dXJlIG1pZ2h0Ci0gICB2YXJ5LCBhbmQgaWYgaXQncyBub3QgdGhlIGxlbmd0aCB3ZSBleHBlY3QgaXQgdG8gYmUsIGl0IGRvZXNuJ3QgYWZmZWN0Ci0gICBvdXIgYWJpbGl0eSB0byBwcm9jZXNzIHRoZSBjb3JlIGZpbGUpLiAgU28gYWxsb3cgMC00MDk2IGV4dHJhIGJ5dGVzIGF0Ci0gICB0aGUgZW5kLiAgKi8KLQotI2RlZmluZSBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VEIDQwOTYKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pMzg2bWFjaDMuaCBiL2JmZC9ob3N0cy9pMzg2bWFjaDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjNjFlMy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvaTM4Nm1hY2gzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLS8qIFRoaXMgaXMgYW4gdWdseSB3YXkgdG8gaGFjayBhcm91bmQgdGhlIGluY29ycmVjdAotICogZGVmaW5pdGlvbiBvZiBVUEFHRVMgaW4gaTM4Ni9tYWNocGFyYW0uaC4KLSAqCi0gKiBUaGUgZGVmaW5pdGlvbiBzaG91bGQgc3BlY2lmeSB0aGUgc2l6ZSByZXNlcnZlZAotICogZm9yICJzdHJ1Y3QgdXNlciIgaW4gY29yZSBmaWxlcyBpbiBQQUdFUywKLSAqIGJ1dCBpbnN0ZWFkIGl0IGdpdmVzIGl0IGluIDUxMi1ieXRlIGNvcmUtY2xpY2tzCi0gKiBmb3IgaTM4NiBhbmQgaTg2MC4gVVBBR0VTIGlzIHVzZWQgb25seSBpbiB0cmFkLWNvcmUuYy4KLSAqLwotI2lmIFVQQUdFUyA9PSAxNgotI3VuZGVmICBVUEFHRVMKLSNkZWZpbmUgVVBBR0VTIDIKLSNlbmRpZgotCi0jaWYgVVBBR0VTICE9IDIKLUZJWE1FISEgVVBBR0VTIGlzIG5laXRoZXIgMiBub3IgMTYKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQkxCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfaTM4NgotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pMzg2c2NvLmggYi9iZmQvaG9zdHMvaTM4NnNjby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzg2MDhjLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9pMzg2c2NvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBDb3JlIGZpbGUgc3R1ZmYuICBBdCBsZWFzdCBzb21lLCBwZXJoYXBzIGFsbCwgb2YgdGhlIGZvbGxvd2luZwotICAgZGVmaW5lcyB3b3JrIG9uIG1hbnkgbW9yZSBzeXN0ZW1zIHRoYW4ganVzdCBTQ08uICAqLwotCi0jZGVmaW5lIE5CUEcgTkJQQwotI2RlZmluZSBVUEFHRVMgVVNJWkUKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgdS51X2V4ZGF0YS51eF9kYXRvcmcKLSNkZWZpbmUgSE9TVF9TVEFDS19TVEFSVF9BRERSIHUudV9zdWIKLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gICgoY29yZV91cGFnZShhYmZkKS0+dV9zeXNhYm9ydCAhPSAwKSBcCi0gICA/IGNvcmVfdXBhZ2UoYWJmZCktPnVfc3lzYWJvcnQgXAotICAgOiAtMSkKLQotLyogQWNjb3JkaW5nIHRvIHRoZSBtYW5wYWdlLCBhIHZlcnNpb24gMiBTQ08gY29yZWZpbGUgY2FuIGNvbnRhaW4KLSAgIHZhcmlvdXMgYWRkaXRpb25hbCBzZWN0aW9ucyAoaXQgaXMgY2xldmVybHkgYXJyYW5nZWQgc28gdGhlIHUgYXJlYSwKLSAgIGRhdGEsIGFuZCBzdGFjayBhcmUgZmlyc3Qgd2hlcmUgd2UgY2FuIGZpbmQgdGhlbSkuICBTbyB3aXRob3V0Ci0gICB3cml0aW5nIGxvdHMgb2YgY29kZSB0byBwYXJzZSBhbGwgdGhlaXIgaGVhZGVycyBhbmQgc3R1ZmYsIHdlIGNhbid0Ci0gICBrbm93IHdoZXRoZXIgYSBjb3JlZmlsZSBpcyBiaWdnZXIgdGhhbiBpdCBzaG91bGQgYmUuICAqLwotCi0jZGVmaW5lIFRSQURfQ09SRV9BTExPV19BTllfRVhUUkFfU0laRSAxCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTg2MG1hY2gzLmggYi9iZmQvaG9zdHMvaTg2MG1hY2gzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDJhYTEuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2k4NjBtYWNoMy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogVGhpcyBmaWxlIHdhcyBoYWNrZWQgZnJvbSBpMzg2bWFjaDMuaCAgIFtkb2xhbkBzc2QuaW50ZWwuY29tXSAqLwotCi0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLS8qIFRoaXMgaXMgYW4gdWdseSB3YXkgdG8gaGFjayBhcm91bmQgdGhlIGluY29ycmVjdAotICogZGVmaW5pdGlvbiBvZiBVUEFHRVMgaW4gaTM4Ni9tYWNocGFyYW0uaC4KLSAqCi0gKiBUaGUgZGVmaW5pdGlvbiBzaG91bGQgc3BlY2lmeSB0aGUgc2l6ZSByZXNlcnZlZAotICogZm9yICJzdHJ1Y3QgdXNlciIgaW4gY29yZSBmaWxlcyBpbiBQQUdFUywKLSAqIGJ1dCBpbnN0ZWFkIGl0IGdpdmVzIGl0IGluIDUxMi1ieXRlIGNvcmUtY2xpY2tzCi0gKiBmb3IgaTM4NiBhbmQgaTg2MC4gVVBBR0VTIGlzIHVzZWQgb25seSBpbiB0cmFkLWNvcmUuYy4KLSAqLwotI2lmIFVQQUdFUyA9PSAxNgotI3VuZGVmICBVUEFHRVMKLSNkZWZpbmUgVVBBR0VTIDIKLSNlbmRpZgotCi0jaWYgVVBBR0VTICE9IDIKLUZJWE1FISEgVVBBR0VTIGlzIG5laXRoZXIgMiBub3IgMTYKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQkxCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfaTg2MAotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9tNjhrYXV4LmggYi9iZmQvaG9zdHMvbTY4a2F1eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjM3NzU1Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9tNjhrYXV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKiBEZWZpbml0aW9ucyBmb3IgYW4gQXBwbGUgTWFjaW50b3NoIHJ1bm5pbmcgQS9VWCAzLnguICovCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvcGFnZS5oPgotCi0vKiBEZWZpbml0aW9ucyB1c2VkIGJ5IHRyYWQtY29yZS5jLiAgKi8KLSNkZWZpbmUJTkJQRwkJCU5CUFAKLQotI2RlZmluZQlIT1NUX0RBVEFfU1RBUlRfQUREUgl1LnVfZXhkYXRhLnV4X2RhdG9yZwotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgl1LnVfZXhkYXRhLnV4X3R4dG9yZwotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCTB4MTAwMDAwMDAwCi0KLSNkZWZpbmUJVVBBR0VTCQkJVVNJWkUKLQotI2RlZmluZQlUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGFiZmQpIFwKLSAgKGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnVfYXJnWzBdKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL202OGtsaW51eC5oIGIvYmZkL2hvc3RzL202OGtsaW51eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDY3ZGZhLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9tNjhrbGludXguaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLyogTGludXggZHVtcHMgInN0cnVjdCB0YXNrX3N0cnVjdCIgYXQgdGhlIGVuZCBvZiB0aGUgY29yZS1maWxlLiAgVGhpcwotICAgc3RydWN0dXJlIGlzIGN1cnJlbnRseSAyNTEyIGJ5dGVzIGxvbmcsIGJ1dCB3ZSBhbGxvdyB1cCB0byA0MDk2Ci0gICBieXRlcyB0byBhbGxvdyBmb3Igc29tZSBmdXR1cmUgZ3Jvd3RoLiAgKi8KLSNkZWZpbmUgVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRAkJNDA5NgotI2RlZmluZSBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGFiZmQpIFwKLSAgKChhYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUuc2lnbmFsKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL204OGttYWNoMy5oIGIvYmZkL2hvc3RzL204OGttYWNoMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjE1NTM4Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9tODhrbWFjaDMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotI3VuZGVmIFVQQUdFUwotI2RlZmluZSBVUEFHRVMgMwotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfbTg4awotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9taXBzYnNkLmggYi9iZmQvaG9zdHMvbWlwc2JzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmZhZDIxLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9taXBzYnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI3VuZGVmIEFMSUdOCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLS8qICNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRyAtLSB3ZSB1c2UgSE9TVF9EQVRBX1NUQVJUX0FERFIgKi8KLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfbWlwcwotLyogI2RlZmluZQlIT1NUX01BQ0hJTkVfTUFDSElORQkgKi8KLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgkJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCQlVU1JTVEFDSwotI2RlZmluZSBOT19DT1JFX0NPTU1BTkQKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9taXBzbWFjaDMuaCBiL2JmZC9ob3N0cy9taXBzbWFjaDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjNDY4ZC4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbWlwc21hY2gzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS9tYWNocGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotLyogI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHICAqLwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9taXBzCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9EQVRBX1NUQVJUX0FERFIJVVNSREFUQQotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbmV3cy1taXBzLmggYi9iZmQvaG9zdHMvbmV3cy1taXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzk5YmUuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL25ld3MtbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLyogU29ueSBOZXdzIHJ1bm5pbmcgTmV3c09TIDMuMi4gICovCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZSBIT1NUX1BBR0VfU0laRSBOQlBHCi0KLSNkZWZpbmUgSE9TVF9NQUNISU5FX0FSQ0ggYmZkX2FyY2hfbWlwcwotCi0jZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSIFVTUlRFWFQKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgVVNSREFUQQotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIFVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbmV3cy5oIGIvYmZkL2hvc3RzL25ld3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3OTQ2Yy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbmV3cy5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0vKiBTb255IE5ld3MgcnVubmluZyBOZXdzT1MgMy4yLiAgKi8KLQotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotCi0jZGVmaW5lIEhPU1RfUEFHRV9TSVpFIE5CUEcKLSNkZWZpbmUgSE9TVF9TRUdNRU5UX1NJWkUgTkJQRwotI2RlZmluZSBIT1NUX01BQ0hJTkVfQVJDSCBiZmRfYXJjaF9tNjhrCi0jZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiAoS0VSTkJBU0UgLSAoVVBBR0VTICogTkJQRykpCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvcGM1MzJtYWNoLmggYi9iZmQvaG9zdHMvcGM1MzJtYWNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOTZmNTkuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3BjNTMybWFjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0vKiBUaGlzIGlzIGFuIHVnbHkgd2F5IHRvIGhhY2sgYXJvdW5kIHRoZSBpbmNvcnJlY3QKLSAqIGRlZmluaXRpb24gb2YgVVBBR0VTIGluIG5zNTMyL21hY2hwYXJhbS5oLgotICoKLSAqIFRoZSBkZWZpbml0aW9uIHNob3VsZCBzcGVjaWZ5IHRoZSBzaXplIHJlc2VydmVkCi0gKiBmb3IgInN0cnVjdCB1c2VyIiBpbiBjb3JlIGZpbGVzIGluIFBBR0VTLAotICogYnV0IGluc3RlYWQgaXQgZ2l2ZXMgaXQgaW4gNTEyLWJ5dGUgY29yZS1jbGlja3MKLSAqIGZvciBuczUzMiwgaTM4NiBhbmQgaTg2MC4gVVBBR0VTIGlzIHVzZWQgb25seSBpbiB0cmFkLWNvcmUuYy4KLSAqLwotI2lmIFVQQUdFUyA9PSAxNgotI3VuZGVmICBVUEFHRVMKLSNkZWZpbmUgVVBBR0VTIDIKLSNlbmRpZgotCi0jaWYgVVBBR0VTICE9IDIKLSNlcnJvciBVUEFHRVMgaXMgbmVpdGhlciAyIG5vciAxNgotI2VuZGlmCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCTEKLSNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRwotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9yaXNjb3MuaCBiL2JmZC9ob3N0cy9yaXNjb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmYTgyNi4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvcmlzY29zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vKiBSSVNDL29zIDQuNTJDLCBhbmQgcHJlc3VtYWJseSBvdGhlciB2ZXJzaW9ucy4gICovCi0KLSNpbmNsdWRlIDxic2Q0My9tYWNoaW5lL21hY2hwYXJhbS5oPgotI2luY2x1ZGUgPGJzZDQzL21hY2hpbmUvdm1wYXJhbS5oPgotCi0jZGVmaW5lIE5CUEcgQlNENDNfTkJQRwotI2RlZmluZSBVUEFHRVMgQlNENDNfVVBBR0VTCi0jZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSIEJTRDQzX1VTUlRFWFQKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgQlNENDNfVVNSREFUQQotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIEJTRDQzX1VTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvc3ltbWV0cnkuaCBiL2JmZC9ob3N0cy9zeW1tZXRyeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTcxN2IzLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9zeW1tZXRyeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyogU3ltbWV0cnkgcnVubmluZyBlaXRoZXIgZHluaXggMy4xIChic2QpIG9yIHB0eCAoc3lzdikuICAqLwotCi0jZGVmaW5lIE5CUEcgNDA5NgotI2RlZmluZSBVUEFHRVMgMQotCi0jaWZkZWYgX1NFUVVFTlRfCi0vKiBwdHggKi8KLSNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIDB4M2ZmZmUwMDAKLSNkZWZpbmUgVFJBRF9DT1JFX1VTRVJfT0ZGU0VUICgoVVBBR0VTICogTkJQRykgLSBzaXplb2YgKHN0cnVjdCB1c2VyKSkKLSNlbHNlCi0vKiBkeW5peCAqLwotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiAweDEwMDAKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgKE5CUEcgKiB1LnVfdHNpemUpCi0jZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgMHgzZmZmZjAwMAotI2RlZmluZSBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGNvcmVfYmZkKSBcCi0gICgoY29yZV9iZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2FyZ1swXSkKLSNlbmRpZgotCi0jZGVmaW5lIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3RhaG9lLmggYi9iZmQvaG9zdHMvdGFob2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2Y2VlMi4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvdGFob2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNkZWZpbmUJTk9fQ09SRV9DT01NQU5ECi0KLSN1bmRlZglBTElHTgkJCS8qIFRoZXkgdXNlIGl0LCB3ZSB1c2UgaXQgdG9vICovCi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI3VuZGVmCUFMSUdOCQkJLyogVGhleSB1c2UgaXQsIHdlIHVzZSBpdCB0b28gKi8KLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF90YWhvZQotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCTAKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkoS0VSTkJBU0UgLSAoVVBBR0VTICogTkJQRykpCi0jZGVmaW5lCUhPU1RfQklHX0VORElBTl9QCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvdmF4YnNkLmggYi9iZmQvaG9zdHMvdmF4YnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjljY2UuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3ZheGJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2RlZmluZQlOT19DT1JFX0NPTU1BTkQJCS8qIE5vIGNvbW1hbmQgbmFtZSBpbiBjb3JlIGZpbGUgKi8KLQotI2lmIDAKLSN1bmRlZglBTElHTgkJCS8qIFRoZXkgdXNlIGl0LCB3ZSB1c2UgaXQgdG9vICovCi0vKiBEb2VzIG5vdCBleGlzdCBvbiBCU0QgNC4zLCBpdCB1c2VzIG1hY2hpbmUvbWFjaHBhcmFtLmguCi0gICBXaGF0ZXZlciBpdCBpcywgaXQncyBpbmNsdWRlZCBieSA8c3lzL3BhcmFtLmg+LCB3aGljaCB0cmFkLWNvcmUuYywKLSAgIHRoZSBvbmx5IHBsYWNlIHRoYXQgdXNlcyB0aGlzIChJIHRoaW5rKSwgYWxyZWFkeSBpbmNsdWRlcy4gICovCi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI2VuZGlmCi0jdW5kZWYJQUxJR04JCQkvKiBUaGV5IHVzZSBpdCwgd2UgdXNlIGl0IHRvbyAqLwotCi0vKiBOb3RlIHRoYXQgSE9TVF9QQUdFX1NJWkUgLS0gdGhlIHBhZ2Ugc2l6ZSBhcyBmYXIgYXMgZXhlY3V0YWJsZSBmaWxlcwotICAgYXJlIGNvbmNlcm5lZCAtLSBpcyBub3QgdGhlIHNhbWUgYXMgTkJQRywgYmVjYXVzZSBvZiBwYWdlIGNsdXN0ZXJpbmcuICAqLwotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJMTAyNAotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF92YXgKLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgkwCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJKDB4ODAwMDAwMDAgLSAoVVBBR0VTICogTkJQRykpCi0jdW5kZWYJSE9TVF9CSUdfRU5ESUFOX1AKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy92YXh1bHQuaCBiL2JmZC9ob3N0cy92YXh1bHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3MzFiNy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvdmF4dWx0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNpbmNsdWRlIDxtYWNoaW5lL3BhcmFtLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQkoTkJQRypDTFNJWkUpCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX3ZheAotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwotI3VuZGVmCUhPU1RfQklHX0VORElBTl9QCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvdmF4dWx0Mi5oIGIvYmZkL2hvc3RzL3ZheHVsdDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3MzFiNy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvdmF4dWx0Mi5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJKE5CUEcqQ0xTSVpFKQotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF92YXgKLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKLSN1bmRlZglIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hwMzAwYnNkLmMgYi9iZmQvaHAzMDBic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2N2IxOC4uMDAwMDAwMAotLS0gYS9iZmQvaHAzMDBic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSFAgOTAwMC8zMDAgKDY4MDAwLWJhc2VkKSBtYWNoaW5lcyBydW5uaW5nIEJTRCBVbml4LgotICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAgLyogQXZvaWRzIHdhcm5pbmcgKi8KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9tNjhrCi0KLSNkZWZpbmUgTVkoT1ApIENBVChocDMwMGJzZF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWhwMzAwYnNkIgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ocDMwMGhwdXguYyBiL2JmZC9ocDMwMGhwdXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc3MmQ0Zi4uMDAwMDAwMAotLS0gYS9iZmQvaHAzMDBocHV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NzAgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIGhwLXV4IDkwMDAvMzAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5NCwgOTUsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBHbGVubiBFbmdlbC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotCi0gICAgaHB1eCBuYXRpdmUgIC0tLS0tLS0tLS0tLT4gfCAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhwMzAwaHB1eCBiZmQgfCAtLS0tLS0tLS0tPiBocHV4IHcvZ251IGV4dAotICAgIGhwdXggdy9nbnUgZXh0ZW5zaW9uIC0tLS0+IHwgICAgICAgICAgICAgICB8Ci0KLQotICAgIFN1cHBvcnQgZm9yIHRoZSA5MDAwL1szNF0wMCBoYXMgc2V2ZXJhbCBsaW1pdGF0aW9ucy4KLSAgICAgIDEuIFNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAyLiBUaGUgb3V0cHV0IGZvcm1hdCBmcm9tIHRoaXMgYmZkIGlzIG5vdCB1c2FibGUgYnkgbmF0aXZlIHRvb2xzLgotCi0gICAgVGhlIHByaW1hcnkgbW90aXZhdGlvbiBmb3Igd3JpdGluZyB0aGlzIGJmZCB3YXMgdG8gYWxsb3cgdXNlIG9mCi0gICAgZ2RiIGFuZCBnY2MgZm9yIGhvc3QgYmFzZWQgZGVidWdnaW5nIGFuZCBub3QgdG8gbWltaWMgdGhlIGhwLXV4IHRvb2xzCi0gICAgaW4gZXZlcnkgZGV0YWlsLiAgVGhpcyBsZWFkcyB0byBhIHNpZ25pZmljYW50IHNpbXBsaWZpY2F0aW9uIG9mIHRoZQotICAgIGNvZGUgYW5kIGEgbGVhcCBpbiBwZXJmb3JtYW5jZS4gIFRoZSBkZWNpc2lvbiB0byBub3Qgb3V0cHV0IGhwIG5hdGl2ZQotICAgIGNvbXBhdGlibGUgb2JqZWN0cyB3YXMgZnVydGhlciBzdHJlbmd0aGVuZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcmljaG5lc3MKLSAgICBvZiB0aGUgZ2NjIGNvbXBpbGVkIG9iamVjdHMgY291bGQgbm90IGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgbG9zcyBvZgotICAgIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHdoaWxlIHRoZSBocCBmb3JtYXQgc3VwcG9ydHMgdGhlIGNvbmNlcHQgb2YKLSAgICBzZWNvbmRhcnkgc3ltYm9scywgaXQgZG9lcyBub3Qgc3VwcG9ydCBpbmRpcmVjdCBzeW1ib2xzLiAgQW5vdGhlcgotICAgIHJlYXNvbiBpcyB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGltcGxlbWVudGF0aW9ucwotICAgIG9mIGdjYyBvbiBocHV4IHdoaWNoIHVzZWQgJ2hweHQnIHRvIHRyYW5zbGF0ZSAuYSBhbmQgLm8gZmlsZXMgaW50byBhCi0gICAgZm9ybWF0IHdoaWNoIGNvdWxkIGJlIHJlYWRpbHkgdW5kZXJzdG9vZCBieSB0aGUgZ251IGxpbmtlciBhbmQgZ2RiLgotICAgIFRoaXMgYWxsb3dzIHJlYWRpbmcgaHAgc2Vjb25kYXJ5IHN5bWJvbHMgYW5kIGNvbnZlcnRpbmcgdGhlbSBpbnRvCi0gICAgaW5kaXJlY3Qgc3ltYm9scyBidXQgdGhlIHJldmVyc2UgaXQgbm90IGFsd2F5cyBwb3NzaWJsZS4KLQotICAgIEFub3RoZXIgZXhhbXBsZSBvZiBkaWZmZXJlbmNlcyBpcyB0aGF0IHRoZSBocCBmb3JtYXQgc3RvcmVzIHN5bWJvbCBvZmZzZXRzCi0gICAgaW4gdGhlIG9iamVjdCBjb2RlIHdoaWxlIHRoZSBnbnUgdXRpbGl0aWVzIHVzZSBhIGZpZWxkIGluIHRoZQotICAgIHJlbG9jYXRpb24gcmVjb3JkIGZvciB0aGlzLiAgVG8gc3VwcG9ydCB0aGUgaHAgbmF0aXZlIGZvcm1hdCwgdGhlIG9iamVjdAotICAgIGNvZGUgd291bGQgbmVlZCB0byBiZSBwYXRjaGVkIHdpdGggdGhlIG9mZnNldHMgd2hlbiBwcm9kdWNpbmcgLm8gZmlsZXMuCi0KLSAgICBUaGUgYmFzaWMgdGVjaG5pcXVlIHRha2VuIGluIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8gI2luY2x1ZGUgdGhlIGNvZGUKLSAgICBmcm9tIGFvdXR4LmggYW5kIGFvdXQtdGFyZ2V0Lmggd2l0aCBhcHByb3ByaWF0ZSAjZGVmaW5lcyB0byBvdmVycmlkZQotICAgIGNvZGUgd2hlcmUgYSB1bmlxdWUgaW1wbGVtZW50YXRpb24gaXMgbmVlZGVkOgotCi0gICAgewotICAgICAgICAjZGVmaW5lIGEgYnVuY2ggb2Ygc3R1ZmYKLSAgICAgICAgI2luY2x1ZGUgPGFvdXR4Lmg+Ci0KLSAgICAgICAgaW1wbGVtZW50IGEgYnVuY2ggb2YgZnVuY3Rpb25zCi0KLSAgICAgICAgI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCi0gICAgfQotCi0gICAgVGhlIGhwIHN5bWJvbCB0YWJsZSBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiBvdGhlciBhLm91dCB0YXJnZXRzLiAgSW5zdGVhZAotICAgIG9mIGhhdmluZyBhbiBhcnJheSBvZiBubGlzdCBpdGVtcyBhbmQgYW4gYXJyYXkgb2Ygc3RyaW5ncywgaHAncyBmb3JtYXQKLSAgICBoYXMgdGhlbSBtaXhlZCB0b2dldGhlciBpbiBvbmUgc3RydWN0dXJlLiAgSW4gYWRkaXRpb24sIHRoZSBzdHJpbmdzIGFyZQotICAgIG5vdCBudWxsIHRlcm1pbmF0ZWQuICBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gICAgbmxpc3QgZWxlbWVudCAxCi0gICAgc3RyaW5nMQotICAgIG5saXN0IGVsZW1lbnQgMgotICAgIHN0cmluZzIKLSAgICAuLi4KLQotICAgIFRoZSB3aG9sZSBzeW1ib2wgdGFibGUgaXMgcmVhZCBhcyBvbmUgY2h1bmsgYW5kIHRoZW4gd2UgbWFyY2ggdGhydSBpdAotICAgIGFuZCBjb252ZXJ0IGl0IHRvIGNhbm9uaWNhbCBmb3JtLiAgQXMgd2UgbWFyY2ggdGhydSB0aGUgdGFibGUsIHdlIGNvcHkKLSAgICB0aGUgbmxpc3QgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCBmb3JtIGFuZCB3ZSBjb21wYWN0IHRoZSBzdHJpbmdzIGFuZCBudWxsCi0gICAgdGVybWluYXRlIHRoZW0sIHVzaW5nIHN0b3JhZ2UgZnJvbSB0aGUgYWxyZWFkeSBhbGxvY2F0ZWQgc3ltYm9sIHRhYmxlOgotCi0gICAgc3RyaW5nMQotICAgIG51bGwKLSAgICBzdHJpbmcyCi0gICAgbnVsbAotICovCi0KLS8qIEBAIElzIHRoaXMgcmVhbGx5IHNvIGRpZmZlcmVudCBmcm9tIG5vcm1hbCBhLm91dCB0aGF0IGl0IG5lZWRzIHRvIGluY2x1ZGUKLSAgIGFvdXR4Lmg/ICBXZSBzaG91bGQgZ28gdGhyb3VnaCB0aGlzIGZpbGUgc29tZXRpbWUgYW5kIHNlZSB3aGF0IGNhbiBiZSBtYWRlCi0gICBtb3JlIGRlcGVuZGVudCBvbiBhb3V0MzIubyBhbmQgd2hhdCBtaWdodCBuZWVkIHRvIGJlIGJyb2tlbiBvZmYgYW5kIGFjY2Vzc2VkCi0gICB0aHJvdWdoIHRoZSBiYWNrZW5kX2RhdGEgZmllbGQuICBPciwgbWF5YmUgd2UgcmVhbGx5IGRvIG5lZWQgc3VjaCBhCi0gICBjb21wbGV0ZWx5IHNlcGFyYXRlIGltcGxlbWVudGF0aW9uLiAgSSBkb24ndCBoYXZlIHRpbWUgdG8gaW52ZXN0aWdhdGUgdGhpcwotICAgbXVjaCBmdXJ0aGVyIHJpZ2h0IG5vdy4gIFtyYWVidXJuOjE5OTMwNDI4LjIxMjRFU1RdICovCi0vKiBAQCBBbHNvLCBub3RlIHRoYXQgdGhlcmUgd2luZCB1cCBiZWluZyB0d28gdmVyc2lvbnMgb2Ygc29tZSByb3V0aW5lcywgd2l0aAotICAgZGlmZmVyZW50IG5hbWVzLCBvbmx5IG9uZSBvZiB3aGljaCBhY3R1YWxseSBnZXRzIHVzZWQuICBGb3IgZXhhbXBsZToKLQlzbHVycF9zeW1ib2xfdGFibGUKLQlzd2FwX3N0ZF9yZWxvY19pbgotCXNsdXJwX3JlbG9jX3RhYmxlCi0JZ2V0X3N5bXRhYgotCWdldF9zeW10YWJfdXBwZXJfYm91bmQKLQljYW5vbmljYWxpemVfcmVsb2MKLQlta29iamVjdAotICAgVGhpcyBzaG91bGQgYWxzbyBiZSBmaXhlZC4gICovCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaHAzMDBocHV4IgotI2RlZmluZSBNWShPUCkgQ0FUKGhwMzAwaHB1eF8sT1ApCi0KLSNkZWZpbmUgZXh0ZXJuYWxfZXhlYyBocDMwMGhwdXhfZXhlY19ieXRlcwotI2RlZmluZSBleHRlcm5hbF9ubGlzdCBocDMwMGhwdXhfbmxpc3RfYnl0ZXMKLQotI2luY2x1ZGUgImFvdXQvaHAzMDBocHV4LmgiCi0KLS8qIGRlZmluZSB0aGVzZSBzbyB3ZSBjYW4gY29tcGlsZSB1bnVzZWQgcm91dGluZXMgaW4gYW91dHguaCAqLwotI2RlZmluZSBlX3N0cnggIGVfc2hsaWIKLSNkZWZpbmUgZV9vdGhlciBlX2xlbmd0aAotI2RlZmluZSBlX2Rlc2MgIGVfYWxtb2QKLQotI2RlZmluZSBBUl9QQURfQ0hBUiAnLycKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2JzZF9hcm1hcF9mMgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBwcm92aWRlIG92ZXJyaWRlcyBmb3Igcm91dGluZXMgaW4gdGhpcyBmaWxlICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiB0aGVzZSBkb24ndCB1c2UgTVkgYmVjYXVzZSB0aGF0IGNhdXNlcyBwcm9ibGVtcyB3aXRoaW4gSlVNUF9UQUJMRQotICAgKENBVCB3aW5kcyB1cCBiZWluZyBleHBhbmRlZCByZWN1cnNpdmVseSwgd2hpY2ggQU5TSSBDIGNvbXBpbGVycwotICAgd2lsbCBub3QgZG8pLiAgKi8KLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBocDMwMGhwdXhfZ2V0X3N5bXRhYgotI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGhwMzAwaHB1eF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBocDMwMGhwdXhfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBocDMwMGhwdXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9maW5hbF9saW5rX2NhbGxiYWNrIHVudXNlZAotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0vKiBVbnRpbCBhbmQgdW5sZXNzIHdlIGNvbnZlcnQgdGhlIHNsdXJwX3JlbG9jIGFuZCBzbHVycF9zeW10YWIKLSAgIHJvdXRpbmVzIGluIHRoaXMgZmlsZSwgd2UgY2FuIG5vdCB1c2UgdGhlIGRlZmF1bHQgYW91dAotICAgZnJlZV9jYWNoZWRfaW5mbyByb3V0aW5lIHdoaWNoIGFzc3VtZXMgdGhhdCB0aGUgcmVsb2NzIGFuZCBzeW10YWJzCi0gICB3ZXJlIGFsbG9jYXRlZCB1c2luZyBtYWxsb2MuICAqLwotI2RlZmluZSBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBiZmRfdHJ1ZQotCi0jZGVmaW5lIGhwMzAwaHB1eF93cml0ZV9zeW1zIGFvdXRfMzJfd3JpdGVfc3ltcwotCi0jZGVmaW5lIE1ZX2NhbGxiYWNrIE1ZKGNhbGxiYWNrKQotCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDB4MgotCi0jZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGhwMzAwaHB1eF8zMl8sc3dhcF9leGVjX2hlYWRlcl9pbikKLQotI2RlZmluZSBIUF9TWU1UWVBFX1VOREVGSU5FRAkweDAwCi0jZGVmaW5lIEhQX1NZTVRZUEVfQUJTT0xVVEUJMHgwMQotI2RlZmluZSBIUF9TWU1UWVBFX1RFWFQJCTB4MDIKLSNkZWZpbmUgSFBfU1lNVFlQRV9EQVRBCQkweDAzCi0jZGVmaW5lIEhQX1NZTVRZUEVfQlNTCQkweDA0Ci0jZGVmaW5lIEhQX1NZTVRZUEVfQ09NTU9OCTB4MDUKLQotI2RlZmluZSBIUF9TWU1UWVBFX1RZUEUJCTB4MEYKLSNkZWZpbmUgSFBfU1lNVFlQRV9GSUxFTkFNRQkweDFGCi0KLSNkZWZpbmUgSFBfU1lNVFlQRV9BTElHTgkweDEwCi0jZGVmaW5lIEhQX1NZTVRZUEVfRVhURVJOQUwJMHgyMAotI2RlZmluZSBIUF9TRUNPTkRBUllfU1lNQk9MICAgICAweDQwCi0KLS8qIFJFTE9DQVRJT04gREVGSU5JVElPTlMgKi8KLSNkZWZpbmUgSFBfUlNFR01FTlRfVEVYVAkweDAwCi0jZGVmaW5lIEhQX1JTRUdNRU5UX0RBVEEJMHgwMQotI2RlZmluZSBIUF9SU0VHTUVOVF9CU1MJCTB4MDIKLSNkZWZpbmUgSFBfUlNFR01FTlRfRVhURVJOQUwJMHgwMwotI2RlZmluZSBIUF9SU0VHTUVOVF9QQ1JFTCAgICAgICAweDA0Ci0jZGVmaW5lIEhQX1JTRUdNRU5UX1JETFQgICAgICAgIDB4MDUKLSNkZWZpbmUgSFBfUlNFR01FTlRfUlBMVCAgICAgICAgMHgwNgotI2RlZmluZSBIUF9SU0VHTUVOVF9OT09QCTB4M0YKLQotI2RlZmluZSBIUF9STEVOR1RIX0JZVEUJCTB4MDAKLSNkZWZpbmUgSFBfUkxFTkdUSF9XT1JECQkweDAxCi0jZGVmaW5lIEhQX1JMRU5HVEhfTE9ORwkJMHgwMgotI2RlZmluZSBIUF9STEVOR1RIX0FMSUdOCTB4MDMKLQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhocDMwMGhwdXgsXzMyXyx5KQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotLyogYW91dHguaCByZXF1aXJlcyBkZWZpbml0aW9ucyBmb3IgQk1BR0lDIGFuZCBRTUFHSUMuICAqLwotI2RlZmluZSBCTUFHSUMgSFBVWF9ET1RfT19NQUdJQwotI2RlZmluZSBRTUFHSUMgMDMxNAotCi0jaW5jbHVkZSAiYW91dHguaCIKLQotLyogU2luY2UgdGhlIGhwdXggc3ltYm9sIHRhYmxlIGhhcyBubGlzdCBlbGVtZW50cyBpbnRlcnNwZXJzZWQgd2l0aAotICAgc3RyaW5ncyBhbmQgd2UgbmVlZCB0byBpbnNlcnQgc29tIHN0cmluZ3MgZm9yIHNlY29uZGFyeSBzeW1ib2xzLCB3ZQotICAgZ2l2ZSBvdXJzZWx2ZXMgYSBsaXR0bGUgZXh0cmEgcGFkZGluZyB1cCBmcm9udCB0byBhY2NvdW50IGZvcgotICAgdGhpcy4gIE5vdGUgdGhhdCBmb3IgZWFjaCBub24tc2Vjb25kYXJ5IHN5bWJvbCB3ZSBwcm9jZXNzLCB3ZSBnYWluCi0gICA5IGJ5dGVzIG9mIHNwYWNlIGZvciB0aGUgZGlzY2FyZGVkIG5saXN0IGVsZW1lbnQgKG9uZSBieXRlIHVzZWQgZm9yCi0gICBudWxsKS4gIFNZTV9FWFRSQV9CWVRFUyBpcyB0aGUgZXh0cmEgc3BhY2UuICAqLwotI2RlZmluZSBTWU1fRVhUUkFfQllURVMgICAxMDI0Ci0KLS8qIFNldCBwYXJhbWV0ZXJzIGFib3V0IHRoaXMgYS5vdXQgZmlsZSB0aGF0IGFyZSBtYWNoaW5lLWRlcGVuZGVudC4KLSAgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBzb21lX2FvdXRfb2JqZWN0X3AganVzdCBiZWZvcmUgaXQgcmV0dXJucy4gICovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWSAoY2FsbGJhY2spIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAvKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBwYXJ0cyBvZiBhIG5ld2x5IHJlYWQgYW91dCBoZWFkZXIgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOX1RYVFNJWkUgKCpleGVjcCk7Ci0KLSAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSICgqZXhlY3ApOwotICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gTl9CU1NBRERSICgqZXhlY3ApOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSNpZmRlZiBTRVRfQVJDSF9NQUNICi0gIFNFVF9BUkNIX01BQ0ggKGFiZmQsICpleGVjcCk7Ci0jZWxzZQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBERUZBVUxUX0FSQ0gsIDApOwotI2VuZGlmCi0KLQotICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBnbnVfZW5jYXBfZm9ybWF0KQotICAgIHsKLSAgICAgIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqLwotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fR05VX1RSRUxPRkYgKCpleGVjcCk7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9HTlVfRFJFTE9GRiAoKmV4ZWNwKTsKLQotICAgICAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICAgICAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IE5fR05VX1NZTU9GRiAoKmV4ZWNwKTsKLSAgICAgIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSAob2JqX3N5bV9maWxlcG9zIChhYmZkKSArIGV4ZWNwLT5hX3N5bXMpOwotCi0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTOwotICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBleGVjcC0+YV9zeW1zIC8gMTI7Ci0gICAgICBvYmpfc3ltYm9sX2VudHJ5X3NpemUgKGFiZmQpID0gMTI7Ci0gICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgICB9Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLWV4dGVybiBib29sZWFuIGFvdXRfMzJfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1NWSAod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwkvKiBkdW1teSB2YXJzICovCi0gIGZpbGVfcHRyIHRleHRfZW5kOwotCi0gIG1lbXNldCAoJmV4ZWNfYnl0ZXMsIDAsIHNpemVvZiAoZXhlY19ieXRlcykpOwotI2lmIENIT09TRV9SRUxPQ19TSVpFCi0gIENIT09TRV9SRUxPQ19TSVpFIChhYmZkKTsKLSNlbHNlCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotI2VuZGlmCi0KLSAgaWYgKGFkYXRhIChhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCi0gICAgTkFNRSAoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwotICBleGVjcC0+YV9zeW1zID0gMDsKLQotICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0KLSAgZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0JCSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgZXhlY3AtPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0JCSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLQotICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCAweGMpOwotICBOX1NFVF9GTEFHUyAoKmV4ZWNwLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLQotICBOQU1FIChhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsKLQotICAvKiB1cGRhdGUgZmllbGRzIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgc3dhcF9leGVjX2hlYWRlcl9vdXQgKi8KLQotICAvKiB0aGlzIGlzIHJlYWxseSB0aGUgc3ltIHRhYmxlIHNpemUgYnV0IHdlIHN0b3JlIGl0IGluIGRyZWxvY3MgKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIDEyLCBleGVjX2J5dGVzLmVfZHJlbG9jcyk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwTCwgZmFsc2UpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICYgZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotCSAgIT0gRVhFQ19CWVRFU19TSVpFKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzeW1ib2xzLCBhbmQgdGhlbiB0aGUgcmVsb2NzLiAgV2UgbXVzdCB3cml0ZSBvdXQKLSAgICAgICB0aGUgc3ltYm9scyBmaXJzdCBzbyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbCBpbmRpY2VzLiAgKi8KLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTa2lwIHRoZSByZWxvY3MgdG8gd2hlcmUgd2Ugd2FudCB0byBwdXQgdGhlIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIE5fRFJFTE9GRiAoKmV4ZWNwKSArIGV4ZWNwLT5hX2Ryc2l6ZSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCFNWSAod3JpdGVfc3ltcykgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChsb25nKSAoTl9UUkVMT0ZGICgqZXhlY3ApKSwgZmFsc2UpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFOQU1FIChhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChsb25nKSAoTl9EUkVMT0ZGICgqZXhlY3ApKSwgZmFsc2UpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFOQU1FIChhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBjb252ZXJ0IHRoZSBocCBzeW1ib2wgdHlwZSB0byBiZSB0aGUgc2FtZSBhcyBhb3V0NjQuaCB1c2FnZSBzbyB3ZSAqLwotLyogY2FuIHBpZ2d5YmFjayByb3V0aW5lcyBpbiBhb3V0eC5oLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotc3RhdGljIHZvaWQKLWNvbnZlcnRfc3ltX3R5cGUgKHN5bV9wb2ludGVyLCBjYWNoZV9wdHIsIGFiZmQpCi0gICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX3BvaW50ZXIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYW91dF9zeW1ib2xfdHlwZSAqY2FjaGVfcHRyOwotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IG5hbWVfdHlwZTsKLSAgaW50IG5ld190eXBlOwotCi0gIG5hbWVfdHlwZSA9IChjYWNoZV9wdHItPnR5cGUpOwotICBuZXdfdHlwZSA9IDA7Ci0KLSAgaWYgKChuYW1lX3R5cGUgJiBIUF9TWU1UWVBFX0FMSUdOKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIGlvdV9lcnJvciAoImFsaWduZWQgc3ltYm9sIGVuY291bnRlcmVkOiAlcyIsIG5hbWUpOyovCi0gICAgICBuYW1lX3R5cGUgPSAwOwotICAgIH0KLQotICBpZiAobmFtZV90eXBlID09IEhQX1NZTVRZUEVfRklMRU5BTUUpCi0gICAgbmV3X3R5cGUgPSBOX0ZOOwotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChuYW1lX3R5cGUgJiBIUF9TWU1UWVBFX1RZUEUpCi0JewotCWNhc2UgSFBfU1lNVFlQRV9VTkRFRklORUQ6Ci0JICBuZXdfdHlwZSA9IE5fVU5ERjsKLQkgIGJyZWFrOwotCi0JY2FzZSBIUF9TWU1UWVBFX0FCU09MVVRFOgotCSAgbmV3X3R5cGUgPSBOX0FCUzsKLQkgIGJyZWFrOwotCi0JY2FzZSBIUF9TWU1UWVBFX1RFWFQ6Ci0JICBuZXdfdHlwZSA9IE5fVEVYVDsKLQkgIGJyZWFrOwotCi0JY2FzZSBIUF9TWU1UWVBFX0RBVEE6Ci0JICBuZXdfdHlwZSA9IE5fREFUQTsKLQkgIGJyZWFrOwotCi0JY2FzZSBIUF9TWU1UWVBFX0JTUzoKLQkgIG5ld190eXBlID0gTl9CU1M7Ci0JICBicmVhazsKLQotCWNhc2UgSFBfU1lNVFlQRV9DT01NT046Ci0JICBuZXdfdHlwZSA9IE5fQ09NTTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKG5hbWVfdHlwZSAmIEhQX1NZTVRZUEVfRVhURVJOQUwpCi0JbmV3X3R5cGUgfD0gTl9FWFQ7Ci0KLSAgICAgIGlmIChuYW1lX3R5cGUgJiBIUF9TRUNPTkRBUllfU1lNQk9MKQotCXsKLQkgIHN3aXRjaCAobmV3X3R5cGUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBOX1VOREYgfCBOX0VYVDoKLQkgICAgICAvKiBJZiB0aGUgdmFsdWUgaXMgbm9uemVybywgdGhlbiBqdXN0IHRyZWF0IHRoaXMgYXMgYQotICAgICAgICAgICAgICAgICBjb21tb24gc3ltYm9sLiAgSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgY29ycmVjdCBpbgotICAgICAgICAgICAgICAgICBhbGwgY2FzZXMsIGJ1dCBpdCBpcyBtb3JlIGNvcnJlY3QgdGhhbiB0cmVhdGluZyBpdCBhcwotICAgICAgICAgICAgICAgICBhIHdlYWsgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlID09IDApCi0JCW5ld190eXBlID0gTl9XRUFLVTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX0FCUyB8IE5fRVhUOgotCSAgICAgIG5ld190eXBlID0gTl9XRUFLQTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX1RFWFQgfCBOX0VYVDoKLQkgICAgICBuZXdfdHlwZSA9IE5fV0VBS1Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0JICAgICAgbmV3X3R5cGUgPSBOX1dFQUtEOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5fQlNTIHwgTl9FWFQ6Ci0JICAgICAgbmV3X3R5cGUgPSBOX1dFQUtCOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgY2FjaGVfcHRyLT50eXBlID0gbmV3X3R5cGU7Ci0KLX0KLQotCi0vKgotREVTQ1JJUFRJT04KLSAgICAgICAgU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGV4ZWN1dGFibGUgaGVhZGVyIHRha2VuIGZyb20gYSByYXcKLSAgICAgICAgYnl0ZSBzdHJlYW0gbWVtb3J5IGltYWdlLCBpbnRvIHRoZSBpbnRlcm5hbCBleGVjX2hlYWRlcgotICAgICAgICBzdHJ1Y3R1cmUuCi0qLwotCi12b2lkCi1OQU1FIChhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pIChhYmZkLCByYXdfYnl0ZXMsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopIHJhd19ieXRlczsKLQotICAvKiBUaGUgaW50ZXJuYWxfZXhlYyBzdHJ1Y3R1cmUgaGFzIHNvbWUgZmllbGRzIHRoYXQgYXJlIHVudXNlZCBpbiB0aGlzCi0gICAgIGNvbmZpZ3VyYXRpb24gKElFIGZvciBpOTYwKSwgc28gZW5zdXJlIHRoYXQgYWxsIHN1Y2ggdW5pbml0aWFsaXplZAotICAgICBmaWVsZHMgYXJlIHplcm8nZCBvdXQuICBUaGVyZSBhcmUgcGxhY2VzIHdoZXJlIHR3byBvZiB0aGVzZSBzdHJ1Y3RzCi0gICAgIGFyZSBtZW1jbXAnZCwgYW5kIHRodXMgdGhlIGNvbnRlbnRzIGRvIG1hdHRlci4gKi8KLSAgbWVtc2V0IChleGVjcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYykpOwotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+YV9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKLSAgZXhlY3AtPmFfdGV4dCA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90ZXh0KTsKLSAgZXhlY3AtPmFfZGF0YSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kYXRhKTsKLSAgZXhlY3AtPmFfYnNzID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Jzcyk7Ci0gIGV4ZWNwLT5hX3N5bXMgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7Ci0gIGV4ZWNwLT5hX2VudHJ5ID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgZXhlY3AtPmFfdHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kcnNpemUpOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qIGNoZWNrIHRoZSBoZWFkZXIgdG8gc2VlIGlmIGl0IHdhcyBnZW5lcmF0ZWQgYnkgYSBiZmQgb3V0cHV0ICovCi0gIC8qIHRoaXMgaXMgZGV0ZWN0ZWQgcmF0aGVyIGJpemFyZWx5IGJ5IHJlcXVpcmluZyBhIGJ1bmNoIG9mICAgICovCi0gIC8qIGhlYWRlciBmaWVsZHMgdG8gYmUgemVybyBhbmQgYW4gb2xkIHVudXNlZCBmaWVsZCAobm93IHVzZWQpICovCi0gIC8qIHRvIGJlIHNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIGRvCi0gICAgewotICAgICAgbG9uZyBzeW1zOwotICAgICAgc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0cjsKLSAgICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX3Bhc3NpemUpICE9IDApCi0JYnJlYWs7Ci0gICAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9zeW1zKSAhPSAwKQotCWJyZWFrOwotICAgICAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfc3Vwc2l6ZSkgIT0gMCkKLQlicmVhazsKLQotICAgICAgc3ltcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfZHJlbG9jcyk7Ci0gICAgICBpZiAoc3ltcyA9PSAwKQotCWJyZWFrOwotCi0gICAgICAvKiBPSywgd2UndmUgcGFzc2VkIHRoZSB0ZXN0IGFzIGJlc3QgYXMgd2UgY2FuIGRldGVybWluZSAqLwotICAgICAgZXhlY3AtPmFfc3ltcyA9IHN5bXM7Ci0KLSAgICAgIC8qIGFsbG9jYXRlIHN0b3JhZ2UgZm9yIHdoZXJlIHdlIHdpbGwgc3RvcmUgdGhpcyByZXN1bHQgKi8KLSAgICAgIHJhd3B0ciA9IChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKCpyYXdwdHIpKTsKLQotICAgICAgaWYgKHJhd3B0ciA9PSBOVUxMKQotCXJldHVybjsKLSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9IHJhd3B0cjsKLSAgICAgIG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPSBnbnVfZW5jYXBfZm9ybWF0OwotICAgIH0KLSAgd2hpbGUgKDApOwotfQotCi0KLS8qIFRoZSBocCBzeW1ib2wgdGFibGUgaXMgYSBiaXQgZGlmZmVyZW50IHRoYW4gb3RoZXIgYS5vdXQgdGFyZ2V0cy4gIEluc3RlYWQKLSAgIG9mIGhhdmluZyBhbiBhcnJheSBvZiBubGlzdCBpdGVtcyBhbmQgYW4gYXJyYXkgb2Ygc3RyaW5ncywgaHAncyBmb3JtYXQKLSAgIGhhcyB0aGVtIG1peGVkIHRvZ2V0aGVyIGluIG9uZSBzdHJ1Y3R1cmUuICBJbiBhZGRpdGlvbiwgdGhlIHN0cmluZ3MgYXJlCi0gICBub3QgbnVsbCB0ZXJtaW5hdGVkLiAgSXQgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczoKLQotICAgbmxpc3QgZWxlbWVudCAxCi0gICBzdHJpbmcxCi0gICBubGlzdCBlbGVtZW50IDIKLSAgIHN0cmluZzIKLSAgIC4uLgotCi0gICBUaGUgd2hvbGUgc3ltYm9sIHRhYmxlIGlzIHJlYWQgYXMgb25lIGNodW5rIGFuZCB0aGVuIHdlIG1hcmNoIHRocnUgaXQKLSAgIGFuZCBjb252ZXJ0IGl0IHRvIGNhbm9uaWNhbCBmb3JtLiAgQXMgd2UgbWFyY2ggdGhydSB0aGUgdGFibGUsIHdlIGNvcHkKLSAgIHRoZSBubGlzdCBkYXRhIGludG8gdGhlIGludGVybmFsIGZvcm0gYW5kIHdlIGNvbXBhY3QgdGhlIHN0cmluZ3MgYW5kIG51bGwKLSAgIHRlcm1pbmF0ZSB0aGVtLCB1c2luZyBzdG9yYWdlIGZyb20gdGhlIGFscmVhZHkgYWxsb2NhdGVkIHN5bWJvbCB0YWJsZToKLQotICAgc3RyaW5nMQotICAgbnVsbAotICAgc3RyaW5nMgotICAgbnVsbAotICAgLi4uCi0qLwotCi1ib29sZWFuCi1NWSAoc2x1cnBfc3ltYm9sX3RhYmxlKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWJvbF9ieXRlczsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bV9wb2ludGVyOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bV9lbmQ7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0gIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlZDsKLSAgdW5zaWduZWQgbnVtX3N5bXMgPSAwOwotCi0gIC8qIElmIHRoZXJlJ3Mgbm8gd29yayB0byBiZSBkb25lLCBkb24ndCBkbyBhbnkgKi8KLSAgaWYgKG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpICE9IChhb3V0X3N5bWJvbF90eXBlICopIE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0gIHN5bWJvbF9ieXRlcyA9IGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zOwotCi0gIHN0cmluZ3MgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJc3ltYm9sX2J5dGVzICsgU1lNX0VYVFJBX0JZVEVTKTsKLSAgaWYgKCFzdHJpbmdzKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgKHN0cmluZ3MgKyBTWU1fRVhUUkFfQllURVMpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoKFBUUikgc3ltcywgc3ltYm9sX2J5dGVzLCAxLCBhYmZkKSAhPSBzeW1ib2xfYnl0ZXMpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHN5bXMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gIHN5bV9lbmQgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopICgoKGNoYXIgKikgc3ltcykgKyBzeW1ib2xfYnl0ZXMpOwotCi0gIC8qIGZpcnN0LCBtYXJjaCB0aHJ1IHRoZSB0YWJsZSBhbmQgZmlndXJlIG91dCBob3cgbWFueSBzeW1ib2xzIHRoZXJlIGFyZSAqLwotICBmb3IgKHN5bV9wb2ludGVyID0gc3ltczsgc3ltX3BvaW50ZXIgPCBzeW1fZW5kOyBzeW1fcG9pbnRlcisrLCBudW1fc3ltcysrKQotICAgIHsKLSAgICAgIC8qIHNraXAgb3ZlciB0aGUgZW1iZWRkZWQgc3ltYm9sLiAqLwotICAgICAgc3ltX3BvaW50ZXIgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopICgoKGNoYXIgKikgc3ltX3BvaW50ZXIpICsKLQkJCQkJICAgICAgIHN5bV9wb2ludGVyLT5lX2xlbmd0aFswXSk7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbCBjb3VudCwgdXBkYXRlIHRoZSBiZmQgaGVhZGVyICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gbnVtX3N5bXM7Ci0KLSAgY2FjaGVkID0gKChhb3V0X3N5bWJvbF90eXBlICopCi0JICAgIGJmZF96YWxsb2MgKGFiZmQsCi0JCQliZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSkpKTsKLSAgaWYgKGNhY2hlZCA9PSBOVUxMICYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIGFzIHdlIG1hcmNoIHRocnUgdGhlIGhwIHN5bWJvbCB0YWJsZSwgY29udmVydCBpdCBpbnRvIGEgbGlzdCBvZgotICAgICBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncyB0byBob2xkIHRoZSBzeW1ib2wgbmFtZXMuICBNYWtlIHN1cmUgYW55Ci0gICAgIGFzc2lnbm1lbnQgdG8gdGhlIHN0cmluZ3MgcG9pbnRlciBpcyBkb25lIGFmdGVyIHdlJ3JlIHRocnUgdXNpbmcKLSAgICAgdGhlIG5saXN0IHNvIHdlIGRvbid0IG92ZXJ3cml0ZSBhbnl0aGluZyBpbXBvcnRhbnQuICovCi0KLSAgLyogT0ssIG5vdyB3YWxrIHRoZSBuZXcgc3ltdGFibGUsIGNhY2hlaW5nIHN5bWJvbCBwcm9wZXJ0aWVzICovCi0gIHsKLSAgICBhb3V0X3N5bWJvbF90eXBlICpjYWNoZV9wdHIgPSBjYWNoZWQ7Ci0gICAgYW91dF9zeW1ib2xfdHlwZSBjYWNoZV9zYXZlOwotICAgIC8qIFJ1biB0aHJvdWdoIHRhYmxlIGFuZCBjb3B5IHZhbHVlcyAqLwotICAgIGZvciAoc3ltX3BvaW50ZXIgPSBzeW1zLCBjYWNoZV9wdHIgPSBjYWNoZWQ7Ci0JIHN5bV9wb2ludGVyIDwgc3ltX2VuZDsgc3ltX3BvaW50ZXIrKywgY2FjaGVfcHRyKyspCi0gICAgICB7Ci0JdW5zaWduZWQgaW50IGxlbmd0aDsKLQljYWNoZV9wdHItPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQljYWNoZV9wdHItPnN5bWJvbC52YWx1ZSA9IEdFVF9TV09SRCAoYWJmZCwgc3ltX3BvaW50ZXItPmVfdmFsdWUpOwotCWNhY2hlX3B0ci0+ZGVzYyA9IGJmZF9nZXRfMTYgKGFiZmQsIHN5bV9wb2ludGVyLT5lX2FsbW9kKTsKLQljYWNoZV9wdHItPnR5cGUgPSBiZmRfZ2V0XzggKGFiZmQsIHN5bV9wb2ludGVyLT5lX3R5cGUpOwotCWNhY2hlX3B0ci0+c3ltYm9sLnVkYXRhLnAgPSBOVUxMOwotCWxlbmd0aCA9IGJmZF9nZXRfOCAoYWJmZCwgc3ltX3BvaW50ZXItPmVfbGVuZ3RoKTsKLQljYWNoZV9wdHItPm90aGVyID0gbGVuZ3RoOwkvKiBvdGhlciBub3QgdXNlZCwgc2F2ZSBsZW5ndGggaGVyZSAqLwotCi0JY2FjaGVfc2F2ZSA9ICpjYWNoZV9wdHI7Ci0JY29udmVydF9zeW1fdHlwZSAoc3ltX3BvaW50ZXIsIGNhY2hlX3B0ciwgYWJmZCk7Ci0JaWYgKCF0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzIChhYmZkLCBjYWNoZV9wdHIpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8qIGZvciBocHV4LCB0aGUgJ2xlbmdodCcgdmFsdWUgaW5kaWNhdGVzIHRoZSBsZW5ndGggb2YgKi8KLQkvKiB0aGUgc3ltYm9sIG5hbWUgd2hpY2ggZm9sbG93cyB0aGUgbmxpc3QgZW50cnkuICAgICAgICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCWlmIChsZW5ndGgpCi0JICB7Ci0JICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkgICAgLyogdGhlIGhwIHN0cmluZyBpcyBub3QgbnVsbCB0ZXJtaW5hdGVkIHNvIHdlIGNyZWF0ZSBhIG5ldyBvbmUqLwotCSAgICAvKiBieSBjb3B5aW5nIHRoZSBzdHJpbmcgdG8gb3ZlcmxhcCB0aGUganVzdCB2YWNhdGVkIG5saXN0ICAgICovCi0JICAgIC8qIHN0cnVjdHVyZSBiZWZvcmUgaXQgaW4gbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCSAgICBjYWNoZV9wdHItPnN5bWJvbC5uYW1lID0gc3RyaW5nczsKLQkgICAgbWVtY3B5IChzdHJpbmdzLCBzeW1fcG9pbnRlciArIDEsIGxlbmd0aCk7Ci0JICAgIHN0cmluZ3NbbGVuZ3RoXSA9ICdcMCc7Ci0JICAgIHN0cmluZ3MgKz0gbGVuZ3RoICsgMTsKLQkgIH0KLQllbHNlCi0JICBjYWNoZV9wdHItPnN5bWJvbC5uYW1lID0gKGNoYXIgKikgTlVMTDsKLQotCS8qIHNraXAgb3ZlciB0aGUgZW1iZWRkZWQgc3ltYm9sLiAqLwotCXN5bV9wb2ludGVyID0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSAoKChjaGFyICopIHN5bV9wb2ludGVyKSArCi0JCQkJCQkgbGVuZ3RoKTsKLSAgICAgIH0KLSAgfQotCi0gIG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpID0gY2FjaGVkOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLQotdm9pZAotTVkgKHN3YXBfc3RkX3JlbG9jX2luKSAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGhwMzAwaHB1eF9yZWxvYyAqYnl0ZXM7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybiA9IDA7Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWwgPSAwOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcyk7Ci0gIHJfaW5kZXggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGJ5dGVzLT5yX2luZGV4KTsKLQotICBzd2l0Y2ggKGJ5dGVzLT5yX3R5cGVbMF0pCi0gICAgewotICAgIGNhc2UgSFBfUlNFR01FTlRfVEVYVDoKLSAgICAgIHJfaW5kZXggPSBOX1RFWFQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX0RBVEE6Ci0gICAgICByX2luZGV4ID0gTl9EQVRBOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9CU1M6Ci0gICAgICByX2luZGV4ID0gTl9CU1M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX0VYVEVSTkFMOgotICAgICAgcl9leHRlcm4gPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9QQ1JFTDoKLSAgICAgIHJfZXh0ZXJuID0gMTsKLSAgICAgIHJfcGNyZWwgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9SRExUOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9SUExUOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9OT09QOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHN3aXRjaCAoYnl0ZXMtPnJfbGVuZ3RoWzBdKQotICAgIHsKLSAgICBjYXNlIEhQX1JMRU5HVEhfQllURToKLSAgICAgIHJfbGVuZ3RoID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUkxFTkdUSF9XT1JEOgotICAgICAgcl9sZW5ndGggPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9STEVOR1RIX0xPTkc6Ci0gICAgICByX2xlbmd0aCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IGhvd3RvX3RhYmxlX3N0ZCArIHJfbGVuZ3RoICsgNCAqIHJfcGNyZWw7Ci0gIC8qIEZJWE1FLXNvb246ICBSb2xsIGJhc2VyZWwsIGptcHRhYmxlLCByZWxhdGl2ZSBiaXRzIGludG8gaG93dG8gc2V0dGluZyAqLwotCi0gIC8qIFRoaXMgbWFjcm8gdXNlcyB0aGUgcl9pbmRleCB2YWx1ZSBjb21wdXRlZCBhYm92ZSAqLwotICBpZiAocl9wY3JlbCAmJiByX2V4dGVybikKLSAgICB7Ci0gICAgICAvKiBUaGUgR05VIGxpbmtlciBhc3N1bWVzIGFueSBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiAqLwotICAgICAgLyogaXMgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgaW1hZ2Ugd2hpbGUgdGhlIEhQIGxpbmtlciAgKi8KLSAgICAgIC8qIGFkZHMgdGhpcyBpbiBsYXRlci4gIEFkZCBpdCBpbiBub3cuLi4gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBNT1ZFX0FERFJFU1MgKC1jYWNoZV9wdHItPmFkZHJlc3MpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIE1PVkVfQUREUkVTUyAoMCk7Ci0gICAgfQotfQotCi1ib29sZWFuCi1NWSAoc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBhc2VjdCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX3NpemU7Ci0gIFBUUiByZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbG9jX2NhY2hlOwotICBzaXplX3QgZWFjaF9zaXplOwotICBzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICpycHRyOwotICB1bnNpZ25lZCBpbnQgY291bnRlcjsKLSAgYXJlbGVudCAqY2FjaGVfcHRyOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemU7Ci0gICAgICBnb3RvIGRvaXQ7Ci0gICAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemU7Ci0gICAgICBnb3RvIGRvaXQ7Ci0gICAgfQotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLQotZG9pdDoKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhc2VjdC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotCi0gIGNvdW50ID0gcmVsb2Nfc2l6ZSAvIGVhY2hfc2l6ZTsKLQotCi0gIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikgYmZkX3phbGxvYyAoYWJmZCwgKHNpemVfdCkgKGNvdW50ICogc2l6ZW9mCi0JCQkJCQkJKGFyZWxlbnQpKSk7Ci0gIGlmICghcmVsb2NfY2FjaGUgJiYgY291bnQgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmVsb2NzID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByZWxvY19zaXplKTsKLSAgaWYgKCFyZWxvY3MgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOwotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jX2NhY2hlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcnB0ciA9IChzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICopIHJlbG9jczsKLSAgY291bnRlciA9IDA7Ci0gIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlOwotCi0gIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLSAgICB7Ci0gICAgICBNWSAoc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBycHRyLCBjYWNoZV9wdHIsIHN5bWJvbHMsCi0JCQkgICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7Ci0gICAgfQotCi0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jcyk7Ci0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGlkZW50aWNhbCB0byBmdW5jdGlvbnMgaW4gYW91dHguaCBleGNlcHQgKi8KLS8qIHRoZXkgcmVmZXIgdG8gTVkoZnVuYykgcmF0aGVyIHRoYW4gTkFNRShhb3V0LGZ1bmMpIGFuZCB0aGV5IGFsc28gICAgICovCi0vKiBjYWxsIGFvdXRfMzIgdmVyc2lvbnMgaWYgdGhlIGlucHV0IGZpbGUgd2FzIGdlbmVyYXRlZCBieSBnY2MgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotbG9uZyBhb3V0XzMyX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICogYWJmZCwgYXN5bWJvbCAqKiBsb2NhdGlvbikpOwotbG9uZyBhb3V0XzMyX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi1sb25nIGFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jIFBBUkFNUyAoKGJmZCAqIGFiZmQsIHNlY19wdHIgc2VjdGlvbiwKLQkJCQkJIGFyZWxlbnQgKiogcmVscHRyLAotCQkJCQkgYXN5bWJvbCAqKiBzeW1ib2xzKSk7Ci0KLWxvbmcKLU1ZIChnZXRfc3ltdGFiKSAoYWJmZCwgbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0KLSAgaWYgKG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gZ251X2VuY2FwX2Zvcm1hdCkKLSAgICByZXR1cm4gYW91dF8zMl9nZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbik7Ci0KLSAgaWYgKCFNWSAoc2x1cnBfc3ltYm9sX3RhYmxlKSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGZvciAoc3ltYmFzZSA9IG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpOyBjb3VudGVyKysgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTspCi0gICAgKihsb2NhdGlvbisrKSA9IChhc3ltYm9sICopIChzeW1iYXNlKyspOwotICAqbG9jYXRpb24rKyA9IDA7Ci0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotbG9uZwotTVkgKGdldF9zeW10YWJfdXBwZXJfYm91bmQpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IGdudV9lbmNhcF9mb3JtYXQpCi0gICAgcmV0dXJuIGFvdXRfMzJfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmICghTVkgKHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlICopKTsKLX0KLQotCi0KLQotbG9uZwotTVkgKGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IGdudV9lbmNhcF9mb3JtYXQpCi0gICAgcmV0dXJuIGFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpOwotCi0gIGlmICghKHRibHB0ciB8fCBNWSAoc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICB7Ci0gICAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspCi0JewotCSAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0JICBjaGFpbiA9IGNoYWluLT5uZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLQl7Ci0JICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLQl9Ci0gICAgfQotICAqcmVscHRyID0gMDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaHBwYV9zdHVicy5oIGIvYmZkL2hwcGFfc3R1YnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4OTNlOC4uMDAwMDAwMAotLS0gYS9iZmQvaHBwYV9zdHVicy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogSFBQQSBsaW5rZXIgc3R1YiBpbnN0cnVjdGlvbnMgICovCi0KLS8qIFRoZXNlIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIHdoaWNoIHRoZSBsaW5rZXIgbWF5IGluc2VydCBpbnRvIHRoZQotICAgY29kZSBzdHJlYW0gd2hlbiBidWlsZGluZyBmaW5hbCBleGVjdXRhYmxlcyB0byBoYW5kbGUgb3V0LW9mLXJhbmdlCi0gICBjYWxscyBhbmQgYXJndW1lbnQgcmVsb2NhdGlvbnMuICAqLwotCi0jZGVmaW5lIExET19NNF9SMzFfUjMxCQkweDM3ZmYzZmY5CS8qIGxkbyAtNCglcjMxKSwlcjMxCSAgKi8KLSNkZWZpbmUgTERJTF9SMQkJCTB4MjAyMDAwMDAJLyogbGRpbCBYWFgsJXIxCQkgICovCi0jZGVmaW5lIEJFX1NSNF9SMQkJMHhlMDIwMjAwMAkvKiBiZSBYWFgoJXNyNCwlcjEpCSAgKi8KLSNkZWZpbmUgQ09QWV9SMzFfUjIgICAgICAgICAgCTB4MDgxZjAyNDIJLyogY29weSAlcjMxLCVyMgkgICovCi0jZGVmaW5lIEJMRV9TUjRfUjAJCTB4ZTQwMDIwMDAJLyogYmxlIFhYWCglc3I0LCVyMCkJICAqLwotI2RlZmluZSBCTEVfU1I0X1IxCQkweGU0MjAyMDAwCS8qIGJsZSBYWFgoJXNyNCwlcjEpCSAgKi8KLSNkZWZpbmUgQlZfTl8wX1IzMQkJMHhlYmUwYzAwMgkvKiBidixuIDAoJXIzMSkJCSAgKi8KLSNkZWZpbmUgU1RXX1IzMV9NOFIzMAkJMHg2YmRmM2ZmMQkvKiBzdHcgJXIzMSwtOCglcjMwKQkgICovCi0jZGVmaW5lIExEV19NOFIzMF9SMzEJCTB4NGJkZjNmZjEJLyogbGR3IC04KCVyMzApLCVyMzEJICAqLwotI2RlZmluZSBTVFdfQVJHX00xNlIzMAkJMHg2YmMwM2ZlMQkvKiBzdHcgJWFyZ1gsLTE2KCVyMzApCSAgKi8KLSNkZWZpbmUgTERXX00xNlIzMF9BUkcJCTB4NGJjMDNmZTEJLyogbGR3IC0xMiglcjMwKSwlYXJnWAkgICovCi0jZGVmaW5lIFNUV19BUkdfTTEyUjMwCQkweDZiYzAzZmU5CS8qIHN0dyAlYXJnWCwtMTYoJXIzMCkJICAqLwotI2RlZmluZSBMRFdfTTEyUjMwX0FSRwkJMHg0YmMwM2ZlOQkvKiBsZHcgLTEyKCVyMzApLCVhcmdYCSAgKi8KLSNkZWZpbmUgRlNUV19GQVJHX00xNlIzMAkweDI3YzExMjAwCS8qIGZzdHdzICVmYXJnWCwtMTYoJXIzMCkgKi8KLSNkZWZpbmUgRkxEV19NMTZSMzBfRkFSRwkweDI3YzExMDAwCS8qIGZsZHdzIC0xNiglcjMwKSwlZmFyZ1ggKi8KLSNkZWZpbmUgRlNURF9GQVJHX00xNlIzMAkweDJmYzExMjAwCS8qIGZzdGRzICVmYXJnWCwtMTYoJXIzMCkgKi8KLSNkZWZpbmUgRkxERF9NMTZSMzBfRkFSRwkweDJmYzExMDAwCS8qIGZsZGRzIC0xNiglcjMwKSwlZmFyZ1ggKi8KZGlmZiAtLWdpdCBhL2JmZC9ocHBhYnNkLWNvcmUuYyBiL2JmZC9ocHBhYnNkLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzZTZiMi4uMDAwMDAwMAotLS0gYS9iZmQvaHBwYWJzZC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIUFBBIEJTRCBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0gICBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAotICAgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LiAKLQotICAgVGhlIGNvcmUgZmlsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBVdGFoIDQuM0JTRCBhbmQgT1NGMSBwb3J0cyBvbiB0aGUKLSAgIFBBIGlzIGEgbWl4IGJldHdlZW4gdHJhZGl0aW9uYWwgY29yZXMgYW5kIGhwdXggY29yZXMgLS0ganVzdAotICAgZGlmZmVyZW50IGVub3VnaCB0aGF0IHN1cHBvcnRpbmcgdGhpcyBmb3JtYXQgd291bGQgdGVuZCB0byBhZGQKLSAgIGdyb3NzIGhhY2tzIHRvIHRyYWQtY29yZS5jIG9yIGhwdXgtY29yZS5jLiAgU28gaW5zdGVhZCB3ZSBrZWVwIGFueQotICAgZ3Jvc3MgaGFja3MgaXNvbGF0ZWQgdG8gdGhpcyBmaWxlLiAgKi8KLSAgIAotCi0vKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgSFBQQS1CU0Qgc3R5bGUKLSAgIGNvcmUgZmlsZXMuCi0KLSAgIEkgd291bGQgbm90IGV4cGVjdCB0aGlzIHRvIGJlIG9mIHVzZSB0byBhbnkgb3RoZXIgaG9zdC90YXJnZXQsIGJ1dAotICAgeW91IG5ldmVyIGtub3cuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFCU0QpCi0KLSNpbmNsdWRlICJtYWNoaW5lL3ZtcGFyYW0uaCIKLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotI2luY2x1ZGUgPHN5cy91c2VyLmg+CQkvKiBBZnRlciBhLm91dC5oICAqLwotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0KLXN0YXRpYyBhc2VjdGlvbiAqbWFrZV9iZmRfYXNlY3Rpb24gUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwKLQkJCQkJICAgIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLAotCQkJCQkgICAgZmlsZV9wdHIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGFzeW1ib2wgKmhwcGFic2RfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKmhwcGFic2RfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEuICAqLwotCi1zdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdAotICB7Ci0gICAgaW50IHNpZzsKLSAgICBjaGFyIGNtZFtNQVhDT01MRU4gKyAxXTsKLSAgICBhc2VjdGlvbiAqZGF0YV9zZWN0aW9uOwotICAgIGFzZWN0aW9uICpzdGFja19zZWN0aW9uOwotICAgIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEuaHBwYWJzZF9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKLSNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKLSNkZWZpbmUgY29yZV9kYXRhc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPmRhdGFfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9zdGFja3NlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5zdGFja19zZWN0aW9uKQotI2RlZmluZSBjb3JlX3JlZ3NlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5yZWdfc2VjdGlvbikKLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCBvZmZzZXQsIGFsaWdubWVudF9wb3dlcikKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLXsKLSAgYXNlY3Rpb24gKmFzZWN0OwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT5maWxlcG9zID0gb2Zmc2V0OwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gYWxpZ25tZW50X3Bvd2VyOwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotaHBwYWJzZF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdmFsOwotICBzdHJ1Y3QgdXNlciB1OwotICBzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCAqY29yZWRhdGE7Ci0gIGludCBjbGlja3N6OwotCi0gIC8qIFRyeSB0byByZWFkIGluIHRoZSB1LWFyZWEuICBXZSB3aWxsIG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGlzCi0gICAgIHRvIGtub3cgaG93IHRvIGdyb2sgdGhlIHJlc3Qgb2YgdGhlIGNvcmUgc3RydWN0dXJlcy4gICovCi0gIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSAmdSwgMSwgc2l6ZW9mIHUsIGFiZmQpOwotICBpZiAodmFsICE9IHNpemVvZiB1KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBHZXQgdGhlIHBhZ2Ugc2l6ZSBvdXQgb2YgdGhlIHUgc3RydWN0dXJlLiAgVGhpcyB3aWxsIGJlIGRpZmZlcmVudAotICAgICBmb3IgUEEgMS4wIG1hY2hpbmVzIGFuZCBQQSAxLjEgbWFjaGluZXMuICAgWXVrISAgKi8KLSAgY2xpY2tzeiA9IHUudV9wY2IucGNiX3Bnc3o7Ci0KLSAgLyogY2xpY2tzeiBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvID49IDJrLiAgKi8KLSAgaWYgKGNsaWNrc3ogPCAweDgwMAotICAgICAgfHwgY2xpY2tzeiAhPSAoY2xpY2tzeiAmIC1jbGlja3N6KSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotCi0gIC8qIFNhbml0eSBjaGVja3MuICBNYWtlIHN1cmUgdGhlIHNpemUgb2YgdGhlIGNvcmUgZmlsZSBtYXRjaGVzIHRoZQotICAgICB0aGUgc2l6ZSBjb21wdXRlZCBmcm9tIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgY29yZSBpdHNlbGYuICAqLwotICB7Ci0gICAgRklMRSAqc3RyZWFtID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgICBpZiAoc3RyZWFtID09IE5VTEwgfHwgZnN0YXQgKGZpbGVubyAoc3RyZWFtKSwgJnN0YXRidWYpIDwgMCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIGlmIChOQlBHICogKFVQQUdFUyArIHUudV9kc2l6ZSArIHUudV9zc2l6ZSkgPiBzdGF0YnVmLnN0X3NpemUpCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICBpZiAoY2xpY2tzeiAqIChVUEFHRVMgKyB1LnVfZHNpemUgKyB1LnVfc3NpemUpIDwgc3RhdGJ1Zi5zdF9zaXplKQotICAgICAgewotCS8qIFRoZSBmaWxlIGlzIHRvbyBiaWcuICBNYXliZSBpdCdzIG5vdCBhIGNvcmUgZmlsZQotCSAgIG9yIHdlIG90aGVyd2lzZSBoYXZlIGJhZCB2YWx1ZXMgZm9yIHVfZHNpemUgYW5kIHVfc3NpemUpLiAgKi8KLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIGNvcmVkYXRhID0gKHN0cnVjdCBocHBhYnNkX2NvcmVfc3RydWN0ICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCkpOwotICBpZiAoIWNvcmVkYXRhKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIE1ha2UgdGhlIGNvcmUgZGF0YSBhbmQgYXZhaWxhYmxlIHZpYSB0aGUgdGRhdGEgcGFydCBvZiB0aGUgQkZELiAgKi8KLSAgYWJmZC0+dGRhdGEuaHBwYWJzZF9jb3JlX2RhdGEgPSBjb3JlZGF0YTsKLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb25zLiAgKi8KLSAgY29yZV9zdGFja3NlYyAoYWJmZCkgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsCi0JCQkJCSAgIFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJCSAgIGNsaWNrc3ogKiB1LnVfc3NpemUsCi0JCQkJCSAgIE5CUEcgKiAoVVNJWkUgKyBLU1RBS1NJWkUpIAotCQkJCQkgICAgICsgY2xpY2tzeiAqIHUudV9kc2l6ZSwgMik7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSBVU1JTVEFDSzsgCi0KLSAgY29yZV9kYXRhc2VjIChhYmZkKSA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLAotCQkJCQkgIFNFQ19BTExPQyArIFNFQ19MT0FECi0JCQkJCSAgICArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJCSAgY2xpY2tzeiAqIHUudV9kc2l6ZSwKLQkJCQkJICBOQlBHICogKFVTSVpFICsgS1NUQUtTSVpFKSwgMik7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPnZtYSA9IFVEQVRBU0VHOwotCi0gIGNvcmVfcmVnc2VjIChhYmZkKSA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0JCQkJCSBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCQkgS1NUQUtTSVpFICogTkJQRywKLQkJCQkJIE5CUEcgKiBVU0laRSwgMik7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gMDsKLQotICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCB1LnVfY29tbSwgTUFYQ09NTEVOICsgMSk7Ci0gIGNvcmVfc2lnbmFsIChhYmZkKSA9IHUudV9jb2RlOwotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNoYXIgKgotaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci1ocHBhYnNkX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgYm9vbGVhbgotaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIC8qIFRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cgdGhpcy4uLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgXAotICBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGhwcGFic2RfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBocHBhYnNkX2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBocHBhYnNkX2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQgKCkKLXsKLSAgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwLiAgKi8KLSAgYWJvcnQgKCk7CQotfQotCi0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IGhwcGFic2RfY29yZV92ZWMgPQotICB7Ci0gICAgImhwcGFic2QtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBocHBhYnNkX2NvcmVfY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChocHBhYnNkX2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChocHBhYnNkX2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIE5VTEwsCi0gICAgCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2hwdXgtY29yZS5jIGIvYmZkL2hwdXgtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmFhMmMyLi4wMDAwMDAwCi0tLSBhL2JmZC9ocHV4LWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhQL1VYIGNvcmUgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0dSBHcm9zc21hbiwgQ3lnbnVzIFN1cHBvcnQuCi0gICBDb252ZXJ0ZWQgdG8gYmFjay1lbmQgZm9ybSBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU1VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjYW4gb25seSBiZSBjb21waWxlZCBvbiBzeXN0ZW1zIHdoaWNoIHVzZSBIUC9VWCBzdHlsZQotICAgY29yZSBmaWxlcy4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpIHx8IGRlZmluZWQgKEhPU1RfSFAzMDBIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFNUEVJWCkKLQotLyogRklYTUU6IHN5cy9jb3JlLmggZG9lc24ndCBleGlzdCBmb3IgSFBVWCB2ZXJzaW9uIDcuICBIUFVYIHZlcnNpb24KLSAgIDUsIDYsIGFuZCA3IGNvcmUgZmlsZXMgc2VlbSB0byBiZSBzdGFuZGFyZCB0cmFkLWNvcmUuYyB0eXBlIGNvcmUKLSAgIGZpbGVzOyBjYW4gd2UganVzdCB1c2UgdHJhZC1jb3JlLmMgaW4gYWRkaXRpb24gdG8gdGhpcyBmaWxlPyAgKi8KLQotI2luY2x1ZGUgPHN5cy9jb3JlLmg+Ci0jaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLQotI2VuZGlmIC8qIEhPU1RfSFBQQUhQVVggKi8KLQotI2lmZGVmIEhPU1RfSFBQQUJTRAotCi0vKiBOb3QgYSB2ZXJ5IHN3aWZ0IHBsYWNlIHRvIHB1dCBpdCwgYnV0IHRoYXQncyB3aGVyZSB0aGUgQlNEIHBvcnQKLSAgIHB1dHMgdGhlbS4gICovCi0jaW5jbHVkZSAiL2hwdXgvdXNyL2luY2x1ZGUvc3lzL2NvcmUuaCIKLQotI2VuZGlmIC8qIEhPU1RfSFBQQUJTRCAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaWZkZWYgSEFWRV9ESVJFTlRfSAotIyBpbmNsdWRlIDxkaXJlbnQuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfU1lTX05ESVJfSAotIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4KLSMgZW5kaWYKLSMgaWZkZWYgSEFWRV9TWVNfRElSX0gKLSMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KLSMgZW5kaWYKLSMgaWZkZWYgSEFWRV9ORElSX0gKLSMgIGluY2x1ZGUgPG5kaXIuaD4KLSMgZW5kaWYKLSNlbmRpZgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+Ci0jaW5jbHVkZSA8c3lzL3VzZXIuaD4JCS8qIEFmdGVyIGEub3V0LmggICovCi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLQotLyogS2x1ZGdlOiBUaGVyZSdzIG5vIGV4cGxpY2l0IG1lY2hhbmlzbSBwcm92aWRlZCBieSBzeXMvY29yZS5oIHRvCi0gICBjb25kaXRpb25hbGx5IGtub3cgd2hldGhlciBhIHByb2NfaW5mbyBoYXMgdGhyZWFkIGlkIGZpZWxkcy4KLSAgIEhvd2V2ZXIsIENPUkVfQU5PTl9TSE1FTSBzaG93cyB1cCBmaXJzdCBhdCAxMC4zMCwgd2hpY2ggaXMKLSAgIGhhcHBpbHkgYWxzbyB3aGVuIG1lYW5pbmdmdWwgdGhyZWFkIGlkJ3Mgc2hvdyB1cCBpbiBwcm9jX2luZm8uICovCi0jaWYgZGVmaW5lZChDT1JFX0FOT05fU0hNRU0pCi0jZGVmaW5lIFBST0NfSU5GT19IQVNfVEhSRUFEX0lEICgxKQotI2VuZGlmCi0KLS8qIFRoaXMgdHlwZSBhcHBlYXJzIGF0IEhQLVVYIDEwLjMwLiAgRGVmaW5pbmcgaXQgaWYgbm90IGRlZmluZWQKLSAgIGJ5IHN5cy9jb3JlLmggYWxsb3dzIHVzIHRvIGJ1aWxkIGZvciBvbGRlciBIUC1VWCdzLCBhbmQgKHNpbmNlCi0gICBpdCB3b24ndCBiZSBlbmNvdW50ZXJlZCBpbiBjb3JlLWR1bXBzIGZyb20gb2xkZXIgSFAtVVgncykgaXMKLSAgIGhhcm1sZXNzLiAqLwotI2lmICFkZWZpbmVkKENPUkVfQU5PTl9TSE1FTSkKLSNkZWZpbmUgQ09SRV9BTk9OX1NITUVNIDB4MDAwMDAyMDAgICAgICAgICAvKiBhbm9ueW1vdXMgc2hhcmVkIG1lbW9yeSAqLwotI2VuZGlmCi0KLS8qIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJmZCdzIHRkYXRhICovCi0KLS8qIC5sd3BpZCBhbmQgLnVzZXJfdGlkIGFyZSBvbmx5IHZhbGlkIGlmIFBST0NfSU5GT19IQVNfVEhSRUFEX0lELCBlbHNlIHRoZXkKLSAgIGFyZSBzZXQgdG8gMC4gIEFsc28sIHVudGlsIEhQLVVYIGltcGxlbWVudHMgTXhOIHRocmVhZHMsIC51c2VyX3RpZCBhbmQKLSAgIC5sd3BpZCBhcmUgc3lub255bW91cy4gKi8KLXN0cnVjdCBocHV4X2NvcmVfc3RydWN0IAotewotICBpbnQgc2lnOwotICBpbnQgbHdwaWQ7ICAgICAgICAgICAgICAgLyogS2VybmVsIHRocmVhZCBJRC4gKi8KLSAgdW5zaWduZWQgbG9uZyB1c2VyX3RpZDsgIC8qIFVzZXIgdGhyZWFkIElELiAqLwotICBjaGFyIGNtZFtNQVhDT01MRU4gKyAxXTsKLX07Ci0KLSNkZWZpbmUgY29yZV9oZHIoYmZkKSAoKGJmZCktPnRkYXRhLmhwdXhfY29yZV9kYXRhKQotI2RlZmluZSBjb3JlX3NpZ25hbChiZmQpIChjb3JlX2hkcihiZmQpLT5zaWcpCi0jZGVmaW5lIGNvcmVfY29tbWFuZChiZmQpIChjb3JlX2hkcihiZmQpLT5jbWQpCi0jZGVmaW5lIGNvcmVfa2VybmVsX3RocmVhZF9pZChiZmQpIChjb3JlX2hkcihiZmQpLT5sd3BpZCkKLSNkZWZpbmUgY29yZV91c2VyX3RocmVhZF9pZChiZmQpIChjb3JlX2hkcihiZmQpLT51c2VyX3RpZCkKLQotc3RhdGljIHZvaWQgc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgdm1hLCBhbGlnbm1lbnRfcG93ZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLXsKLSAgYXNlY3Rpb24gKmFzZWN0OwotICBjaGFyICpuZXduYW1lOwotCi0gIG5ld25hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAobmFtZSkgKyAxKTsKLSAgaWYgKCFuZXduYW1lKQotICAgIHJldHVybiBOVUxMOwotCi0gIHN0cmNweSAobmV3bmFtZSwgbmFtZSk7Ci0KLSAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmV3bmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gYWxpZ25tZW50X3Bvd2VyOwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotaHB1eF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLQotLyogdGhpcyBmdW5jdGlvbiBidWlsZHMgYSBiZmQgdGFyZ2V0IGlmIHRoZSBmaWxlIGlzIGEgY29yZWZpbGUuCi0gICBJdCByZXR1cm5zIG51bGwgb3IgMCBpZiBpdCBmaW5kcyBvdXQgdGhhYXQgaXQgaXMgbm90IGEgY29yZSBmaWxlLgotICAgVGhlIHdheSBpdCBjaGVja3MgdGhpcyBpcyBieSBsb29raW5nIGZvciBhbGxvd2VkICd0eXBlJyBmaWVsZCB2YWx1ZXMuCi0gICBUaGVzZSBhcmUgZGVjbGFyZWQgaW4gc3lzL2NvcmUuaAotICAgVGhlcmUgYXJlIHNvbWUgdmFsdWVzIHdoaWNoIGFyZSAncmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UnLiBJbiBwYXJ0aWN1bGFyCi0gICBDT1JFX05PTkUgaXMgYWN0dWFsbHkgZGVmaW5lZCBhcyAwLiBUaGlzIG1heSBiZSBhIGNhdGNoLWFsbCBmb3IgY2FzZXMKLSAgIGluIHdoaWNoIHRoZSBjb3JlIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHNvbWUgbm9uLWhwdXggYXBwbGljYXRpb24uCi0gICAoSSBhbSBqdXN0IGd1ZXNzaW5nIGhlcmUhKQotKi8KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWhwdXhfY29yZV9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgIGdvb2Rfc2VjdGlvbnMgPSAwOwotICBpbnQgIHVua25vd25fc2VjdGlvbnMgPSAwOwotCi0gIGNvcmVfaGRyIChhYmZkKSA9IChzdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGhwdXhfY29yZV9zdHJ1Y3QpKTsKLSAgaWYgKCFjb3JlX2hkciAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaW50IHZhbDsKLSAgICAgIHN0cnVjdCBjb3JlaGVhZCBjb3JlX2hlYWRlcjsKLQotICAgICAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopICZjb3JlX2hlYWRlciwgMSwgc2l6ZW9mIGNvcmVfaGVhZGVyLCBhYmZkKTsKLSAgICAgIGlmICh2YWwgPD0gMCkKLQlicmVhazsKLSAgICAgIHN3aXRjaCAoY29yZV9oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBDT1JFX0tFUk5FTDoKLQljYXNlIENPUkVfRk9STUFUOgotCSAgYmZkX3NlZWsgKGFiZmQsIGNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpOwkvKiBKdXN0IHNraXAgdGhpcyAqLwotICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKLQkgIGJyZWFrOwotCWNhc2UgQ09SRV9FWEVDOgotCSAgewotCSAgICBzdHJ1Y3QgcHJvY19leGVjIHByb2NfZXhlYzsKLQkgICAgaWYgKGJmZF9yZWFkICgodm9pZCAqKSAmcHJvY19leGVjLCAxLCBjb3JlX2hlYWRlci5sZW4sIGFiZmQpCi0JCSE9IGNvcmVfaGVhZGVyLmxlbikKLQkgICAgICBicmVhazsKLQkgICAgc3RybmNweSAoY29yZV9jb21tYW5kIChhYmZkKSwgcHJvY19leGVjLmNtZCwgTUFYQ09NTEVOICsgMSk7Ci0gICAgICAgICAgICBnb29kX3NlY3Rpb25zKys7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIENPUkVfUFJPQzoKLQkgIHsKLQkgICAgc3RydWN0IHByb2NfaW5mbyBwcm9jX2luZm87Ci0JICAgIGNoYXIgIHNlY25hbWVbMTAwXTsgIC8qIE9mIGFyYml0cmFyeSBzaXplLCBidXQgcGxlbnR5IGxhcmdlLiAqLwotCi0gICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHJlYWQgdGhpcyBzZWN0aW9uLCAnY2F1c2Ugd2UgbmVlZCB0byBkZXRlcm1pbmUKLSAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIGNvcmUtZHVtcGVkIGFwcCB3YXMgdGhyZWFkZWQgYmVmb3JlIHdlIGNyZWF0ZQotICAgICAgICAgICAgICAgYW55IC5yZWcgc2VjdGlvbnMuICovCi0JICAgIGlmIChiZmRfcmVhZCAoJnByb2NfaW5mbywgMSwgY29yZV9oZWFkZXIubGVuLCBhYmZkKQotCQkhPSBjb3JlX2hlYWRlci5sZW4pCi0JICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgLyogSG93ZXZlciwgd2UgYWxzbyB3YW50IHRvIGNyZWF0ZSB0aG9zZSBzZWN0aW9ucyB3aXRoIHRoZQotICAgICAgICAgICAgICAgICBmaWxlIHBvc2l0aW9uZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZWNvcmQsIGl0IHNlZW1zLiAqLwotICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAtY29yZV9oZWFkZXIubGVuLCBTRUVLX0NVUikgIT0gMCkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSNpZiBkZWZpbmVkKFBST0NfSU5GT19IQVNfVEhSRUFEX0lEKQotICAgICAgICAgICAgY29yZV9rZXJuZWxfdGhyZWFkX2lkIChhYmZkKSA9IHByb2NfaW5mby5sd3BpZDsKLSAgICAgICAgICAgIGNvcmVfdXNlcl90aHJlYWRfaWQgKGFiZmQpID0gcHJvY19pbmZvLnVzZXJfdGlkOwotI2Vsc2UKLSAgICAgICAgICAgIGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkgPSAwOwotICAgICAgICAgICAgY29yZV91c2VyX3RocmVhZF9pZCAoYWJmZCkgPSAwOwotI2VuZGlmCi0gICAgICAgICAgICAvKiBJZiB0aGUgcHJvZ3JhbSB3YXMgdW50aHJlYWRlZCwgdGhlbiB3ZSdsbCBqdXN0IGNyZWF0ZSBhCi0gICAgICAgICAgICAgICAucmVnIHNlY3Rpb24uCi0KLSAgICAgICAgICAgICAgIElmIHRoZSBwcm9ncmFtIHdhcyB0aHJlYWRlZCwgdGhlbiB3ZSdsbCBjcmVhdGUgLnJlZy9YWFhYWAotICAgICAgICAgICAgICAgc2VjdGlvbiBmb3IgZWFjaCB0aHJlYWQsIHdoZXJlIFhYWFhYIGlzIGEgcHJpbnRhYmxlCi0gICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBvZiB0aGUga2VybmVsIHRocmVhZCBpZC4gIFdlJ2xsIGFsc28KLSAgICAgICAgICAgICAgIGNyZWF0ZSBhIC5yZWcgc2VjdGlvbiBmb3IgdGhlIHRocmVhZCB0aGF0IHdhcyBydW5uaW5nCi0gICAgICAgICAgICAgICBhbmQgc2lnbmFsbGVkIGF0IHRoZSB0aW1lIG9mIHRoZSBjb3JlLWR1bXAgKGkuZS4sIHRoaXMKLSAgICAgICAgICAgICAgIGlzIGVmZmVjdGl2ZWx5IGFuIGFsaWFzLCBuZWVkZWQgdG8ga2VlcCBHREIgaGFwcHkuKQotCi0gICAgICAgICAgICAgICBOb3RlIHRoYXQgd2UgdXNlIGAucmVnL1hYWFhYJyBhcyBvcHBvc2VkIHRvICcucmVnWFhYWFgnCi0gICAgICAgICAgICAgICBiZWNhdXNlIEdEQiBleHBlY3RzIHRoYXQgLnJlZzIgd2lsbCBiZSB0aGUgZmxvYXRpbmctCi0gICAgICAgICAgICAgICBwb2ludCByZWdpc3RlcnMuICovCi0gICAgICAgICAgICBpZiAoY29yZV9rZXJuZWxfdGhyZWFkX2lkIChhYmZkKSA9PSAwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19IQVNfQ09OVEVOVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9oZWFkZXIubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICZwcm9jX2luZm8gLSAoaW50KSAmIHByb2NfaW5mby5od19yZWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpKQotICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFRoZXJlIGFyZSB0aHJlYWRzLiAgSXMgdGhpcyB0aGUgb25lIHRoYXQgY2F1c2VkIHRoZQotICAgICAgICAgICAgICAgICAgIGNvcmUtZHVtcD8gIFdlJ2xsIGNsYWltIGl0IHdhcyB0aGUgcnVubmluZyB0aHJlYWQuICovCi0gICAgICAgICAgICAgICAgaWYgKHByb2NfaW5mby5zaWcgIT0gLTEpCi0gICAgICAgICAgICAgICAgICB7Ci0JCSAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0JCQkJCSAgICBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCQkgICAgY29yZV9oZWFkZXIubGVuLAotCQkJCQkgICAgKGludCkgJnByb2NfaW5mbyAtIChpbnQpICYgcHJvY19pbmZvLmh3X3JlZ3MsCi0JCQkJCSAgICAyKSkKLQkJICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogV2UgYWx3YXlzIG1ha2Ugb25lIG9mIHRoZXNlIHNlY3Rpb25zLCBmb3IgZXZlcnkgdGhyZWFkLiAqLwotICAgICAgICAgICAgICAgIHNwcmludGYgKHNlY25hbWUsICIucmVnLyVkIiwgY29yZV9rZXJuZWxfdGhyZWFkX2lkIChhYmZkKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgc2VjbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfSEFTX0NPTlRFTlRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfaGVhZGVyLmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAmcHJvY19pbmZvIC0gKGludCkgJiBwcm9jX2luZm8uaHdfcmVncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSkKLSAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICB9Ci0JICAgIGNvcmVfc2lnbmFsIChhYmZkKSA9IHByb2NfaW5mby5zaWc7Ci0gICAgICAgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpICE9IDApCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZ29vZF9zZWN0aW9ucysrOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIENPUkVfREFUQToKLQljYXNlIENPUkVfU1RBQ0s6Ci0JY2FzZSBDT1JFX1RFWFQ6Ci0JY2FzZSBDT1JFX01NRjoKLQljYXNlIENPUkVfU0hNOgotCWNhc2UgQ09SRV9BTk9OX1NITUVNOgotCSAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCQkgIFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUywKLQkJCQkgIGNvcmVfaGVhZGVyLmxlbiwgY29yZV9oZWFkZXIuYWRkciwgMikpCi0JICAgIHJldHVybiBOVUxMOwotCi0JICBiZmRfc2VlayAoYWJmZCwgY29yZV9oZWFkZXIubGVuLCBTRUVLX0NVUik7Ci0gICAgICAgICAgZ29vZF9zZWN0aW9ucysrOwotCSAgYnJlYWs7Ci0KLQljYXNlIENPUkVfTk9ORToKLSAgICAgICAgICAvKiBMZXQncyBub3QgcHVudCBpZiB3ZSBlbmNvdW50ZXIgYSBzZWN0aW9uIG9mIHVua25vd24KLSAgICAgICAgICAgICB0eXBlLiAgUmF0aGVyLCBsZXQncyBtYWtlIGEgbm90ZSBvZiBpdC4gIElmIHdlIGxhdGVyCi0gICAgICAgICAgICAgc2VlIHRoYXQgdGhlcmUgd2VyZSBhbHNvICJnb29kIiBzZWN0aW9ucywgdGhlbiB3ZSdsbAotICAgICAgICAgICAgIGRlY2xhcmUgdGhhdCB0aGlzIGEgY29yZSBmaWxlLCBidXQgd2UnbGwgYWxzbyB3YXJuIHRoYXQKLSAgICAgICAgICAgICBpdCBtYXkgYmUgaW5jb21wYXRpYmxlIHdpdGggdGhpcyBnZGIuCi0gICAgICAgICAgICAgKi8KLQkgIHVua25vd25fc2VjdGlvbnMrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAKLSAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwOyAvKnVucmVjb2duaXplZCBjb3JlIGZpbGUgdHlwZSAqLwotCX0KLSAgICB9Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgLyogV2VyZSB0aGVyZSBzZWN0aW9ucyBvZiB1bmtub3duIHR5cGU/ICBJZiBzbywgeWV0IHRoZXJlIHdlcmUKLSAgICAgYXQgbGVhc3Qgc29tZSBjb21wbGV0ZSBzZWN0aW9ucyBvZiBrbm93biB0eXBlLCB0aGVuLCBpc3N1ZQotICAgICBhIHdhcm5pbmcuICBQb3NzaWJseSB0aGUgY29yZSBmaWxlIHdhcyBnZW5lcmF0ZWQgb24gYSB2ZXJzaW9uCi0gICAgIG9mIEhQLVVYIHRoYXQgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhhdCBmb3Igd2hpY2ggdGhpcyBnZGIgd2FzCi0gICAgIGJ1aWx0LgotICAgICAqLwotICBpZiAoKHVua25vd25fc2VjdGlvbnMgPiAwKSAmJiAoZ29vZF9zZWN0aW9ucyA+IDApKQotICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgKCIlcyBhcHBlYXJzIHRvIGJlIGEgY29yZSBmaWxlLFxuYnV0IGNvbnRhaW5zIHVua25vd24gc2VjdGlvbnMuICBJdCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgb24gYW4gaW5jb21wYXRpYmxlXG52ZXJzaW9uIG9mIEhQLVVYLiAgQXMgYSByZXN1bHQsIHNvbWUgaW5mb3JtYXRpb24gbWF5IGJlIHVuYXZhaWxhYmxlLlxuIiwKLSAgICAgICBhYmZkLT5maWxlbmFtZSk7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWhwdXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGludAotaHB1eF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9zaWduYWwgKGFiZmQpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGJvb2xlYW4KLWhwdXhfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsJCQkvKiBGSVhNRSwgV2UgaGF2ZSBubyB3YXkgb2YgdGVsbGluZyBhdCB0aGlzIHBvaW50ICovCi19Ci0MCi0jZGVmaW5lIGhwdXhfY29yZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgaHB1eF9jb3JlX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBocHV4X2NvcmVfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotI2RlZmluZSBocHV4X2NvcmVfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBocHV4X2NvcmVfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgXAotICBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBocHV4X2NvcmVfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGhwdXhfY29yZV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBocHV4X2NvcmVfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBocHV4X2NvcmVfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGhwdXhfY29yZV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0vKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCi1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCgpCi17Ci0gIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLwotfQotI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19TSUdORURfR0VUIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBocHV4X2NvcmVfdmVjID0KLSAgewotICAgICJocHV4LWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgaHB1eF9jb3JlX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoaHB1eF9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoaHB1eF9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICBOVUxMLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvaTM4NmFvdXQuYyBiL2JmZC9pMzg2YW91dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGIyY2ZmLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2YW91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBpMzg2IGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoZSBvbmx5IDM4NiBhb3V0IHN5c3RlbSB3ZSBoYXZlIGhlcmUgaXMgR08zMiBmcm9tIERKLiAKLSAgIFRoZXNlIG51bWJlcnMgbWFrZSBCRkQgd29yayB3aXRoIHRoYXQuIElmIHlvdXIgYW91dCAzODYgc3lzdGVtCi0gICBkb2Vzbid0IHdvcmsgd2l0aCB0aGVzZSwgd2UnbGwgaGF2ZSB0byBzcGxpdCB0aGVtIGludG8gZGlmZmVyZW50Ci0gICBmaWxlcy4gIFNlbmQgbWUgKHNhY0BjeWdudXMuY29tKSB0aGUgcnVuZXMgdG8gbWFrZSBpdCB3b3JrIG9uIHlvdXIKLSAgIHN5c3RlbSwgYW5kIEknbGwgc3RpY2sgaXQgaW4gZm9yIHRoZSBuZXh0IHJlbGVhc2UuICAqLwotCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2RlZmluZSBOX1RYVE9GRih4KSAweDIwCi0jZGVmaW5lIE5fVFhUQUREUih4KSAoTl9NQUdJQyh4KT09Wk1BR0lDID8gMHgxMDIwIDogMCkKLQotI2RlZmluZSBOX1RYVFNJWkUoeCkgKCh4KS5hX3RleHQpCi0jaWYgMAotI2RlZmluZSBOX0RBVEFERFIoeCkgKE5fTUFHSUMoeCk9PU9NQUdJQz8gKE5fVFhUQUREUih4KSsoeCkuYV90ZXh0KSA6IChTRUdNRU5UX1NJWkUgKyAoKDB4MTAyMCsoeCkuYV90ZXh0LTEpICYgfihTRUdNRU5UX1NJWkUtMSkpKSkKLSNkZWZpbmUgTk9TVUJFWEVDQgotCi0jZW5kaWYKLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFNFR01FTlRfU0laRSAweDQwMDAwMAotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfaTM4NgotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmFvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2IgotI2RlZmluZSBOT19XUklURV9IRUFERVJfS0xVREdFIDEKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0vKiBTZXQgdGhlIG1hY2hpbmUgdHlwZSBjb3JyZWN0bHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaTM4NmFvdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzM4Nik7Ci0KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0KLSAgV1JJVEVfSEVBREVSUyAoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBpMzg2YW91dF93cml0ZV9vYmplY3RfY29udGVudHMKLQotc3RhdGljIGJvb2xlYW4gTVkoc2V0X3NpemVzKSgpOwotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEgJk1ZKGJhY2tlbmRfZGF0YSkKLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgTVkoYmFja2VuZF9kYXRhKSA9IHsKLSAgMCwJCQkJLyogem1hZ2ljIGNvbnRpZ3VvdXMgKi8KLSAgMSwJCQkJLyogdGV4dCBpbmNsIGhlYWRlciAqLwotICAwLAkJCQkvKiBlbnRyeSBpcyB0ZXh0IGFkZHJlc3MgKi8KLSAgMCwJCQkJLyogZXhlY19oZHJfZmxhZ3MgKi8KLSAgMCwJCQkJLyogdGV4dCB2bWE/ICovCi0gIE1ZKHNldF9zaXplcyksCi0gIDEsCQkJCS8qIGV4ZWMgaGVhZGVyIG5vdCBjb3VudGVkICovCi0gIDAsCQkJCS8qIGFkZF9keW5hbWljX3N5bWJvbHMgKi8KLSAgMCwJCQkJLyogYWRkX29uZV9zeW1ib2wgKi8KLSAgMCwJCQkJLyogbGlua19keW5hbWljX29iamVjdCAqLwotICAwLAkJCQkvKiB3cml0ZV9keW5hbWljX3N5bWJvbCAqLwotICAwLAkJCQkvKiBjaGVja19keW5hbWljX3JlbG9jICovCi0gIDAJCQkJLyogZmluaXNoX2R5bmFtaWNfbGluayAqLwotfTsKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4NmJzZC5jIGIvYmZkL2kzODZic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyOGZlMy4uMDAwMDAwMAotLS0gYS9iZmQvaTM4NmJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBpMzg2IGEub3V0IGJpbmFyaWVzIHVuZGVyIEJTRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGRhdGEgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBmb3JtYXQgdXNlZCB1bmRlciBhbGwgdGhlIHZhcmlvdXMKLSAgIEJTRCBwb3J0cyBmb3IgMzg2IG1hY2hpbmVzLiAgKi8KLQotI2RlZmluZQlCWVRFU19JTl9XT1JECTQKLQotLyogWk1BR0lDIGZpbGVzIG5ldmVyIGhhdmUgdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4gICovCi0jZGVmaW5lCU5fSEVBREVSX0lOX1RFWFQoeCkJMAotCi0vKiBaTUFHSUMgZmlsZXMgc3RhcnQgYXQgYWRkcmVzcyAwLiAgVGhpcyBkb2VzIG5vdCBhcHBseSB0byBRTUFHSUMuICAqLwotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzM4NiB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZic2RfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWJzZCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4NmR5bml4LmMgYi9iZmQvaTM4NmR5bml4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNTBhMTQuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZkeW5peC5jCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBpMzg2IGEub3V0IGJpbmFyaWVzIHVuZGVyIGR5bml4LgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgQkZEIGlzIGN1cnJlbnRseSBvbmx5IHRlc3RlZCB3aXRoIGdkYiwgd3JpdGluZyBvYmplY3QgZmlsZXMKLSAgIG1heSBub3Qgd29yay4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRAk0Ci0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDQwOTYKLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRQk0MDk2Ci0jZGVmaW5lIFNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0KLSNpbmNsdWRlICJhb3V0L2R5bml4My5oIgotCi0jZGVmaW5lIERFRkFVTFRfQVJDSAliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzM4NiB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZkeW5peF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYtZHluaXgiCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQzKGkzODZkeW5peCxfMzJfLHkpCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotI2RlZmluZSBOQU1FX3N3YXBfZXhlY19oZWFkZXJfaW4gTkFNRShpMzg2ZHluaXhfMzJfLHN3YXBfZXhlY19oZWFkZXJfaW4pCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLQotLyogYW91dHguaCByZXF1aXJlcyBkZWZpbml0aW9ucyBmb3IgTk1BR0lDLCBCTUFHSUMgYW5kIFFNQUdJQy4gICovCi0jZGVmaW5lIE5NQUdJQyAwCi0jZGVmaW5lIEJNQUdJQyBPTUFHSUMKLSNkZWZpbmUgUU1BR0lDIFhNQUdJQwotCi0jaW5jbHVkZSAiYW91dHguaCIKLQotLyogKEFiKXVzZSBzb21lIGZpZWxkcyBpbiB0aGUgaW50ZXJuYWwgZXhlYyBoZWFkZXIgdG8gYmUgYWJsZSB0byByZWFkCi0gICBleGVjdXRhYmxlcyB0aGF0IGNvbnRhaW4gc2hhcmVkIGRhdGEuICAqLwotCi0jZGVmaW5lIGFfc2hkYXRhIGFfdGxvYWQKLSNkZWZpbmUgYV9zaGRyc2l6ZSBhX2Rsb2FkCi0KLXZvaWQKLWkzODZkeW5peF8zMl9zd2FwX2V4ZWNfaGVhZGVyX2luIChhYmZkLCByYXdfYnl0ZXMsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopcmF3X2J5dGVzOwotCi0gIC8qIFRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdHVyZSBoYXMgc29tZSBmaWVsZHMgdGhhdCBhcmUgdW51c2VkIGluIHRoaXMKLSAgICAgY29uZmlndXJhdGlvbiAoSUUgZm9yIGk5NjApLCBzbyBlbnN1cmUgdGhhdCBhbGwgc3VjaCB1bmluaXRpYWxpemVkCi0gICAgIGZpZWxkcyBhcmUgemVybydkIG91dC4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgdHdvIG9mIHRoZXNlIHN0cnVjdHMKLSAgICAgYXJlIG1lbWNtcCdkLCBhbmQgdGh1cyB0aGUgY29udGVudHMgZG8gbWF0dGVyLiAqLwotICBtZW1zZXQgKChQVFIpIGV4ZWNwLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKSk7Ci0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgZXhlY3AsIGZyb20gdGhlIGJ5dGVzIGluIHRoZSByYXcgZGF0YS4gICovCi0gIGV4ZWNwLT5hX2luZm8gICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfaW5mbyk7Ci0gIGV4ZWNwLT5hX3RleHQgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90ZXh0KTsKLSAgZXhlY3AtPmFfZGF0YSAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2RhdGEpOwotICBleGVjcC0+YV9ic3MgICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfYnNzKTsKLSAgZXhlY3AtPmFfc3ltcyAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3N5bXMpOwotICBleGVjcC0+YV9lbnRyeSAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZW50cnkpOwotICBleGVjcC0+YV90cnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgZXhlY3AtPmFfZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci0gIGV4ZWNwLT5hX3NoZGF0YSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zaGRhdGEpOwotICBleGVjcC0+YV9zaGRyc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zaGRyc2l6ZSk7Ci19Ci0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZmcmVlYnNkLmMgYi9iZmQvaTM4NmZyZWVic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2MzcxYi4uMDAwMDAwMAotLS0gYS9iZmQvaTM4NmZyZWVic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgRnJlZUJTRC8zODYgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZQlCWVRFU19JTl9XT1JECTQKLSN1bmRlZiBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQk0MDk2Ci0jZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0KLSNkZWZpbmUJREVGQVVMVF9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fMzg2X05FVEJTRCB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZmcmVlYnNkXyxPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYtZnJlZWJzZCIKLQotI2luY2x1ZGUgImZyZWVic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2bGludXguYyBiL2JmZC9pMzg2bGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmMmExMS4uMDAwMDAwMAotLS0gYS9iZmQvaTM4NmxpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBsaW51eCBmbGF2b3JlZCBpMzg2IGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZSBaTUFHSUNfRElTS19CTE9DS19TSVpFIDEwMjQKLSNkZWZpbmUJU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCTB4MAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV8zODYgfHwgKG10eXBlKSA9PSBNX1VOS05PV04pCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9pMzg2Ci0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmxpbnV4XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1saW51eCIKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgTVkodmVjKTsKLQotLyogV2UgYWx3YXlzIGdlbmVyYXRlIFFNQUdJQyBmaWxlcyBpbiBwcmVmZXJlbmNlIHRvIFpNQUdJQyBmaWxlcy4gIEl0Ci0gICB3b3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlIHRoaXMgYSBsaW5rZXIgb3B0aW9uLCBpZiB0aGF0IGV2ZXIKLSAgIGJlY29tZXMgaW1wb3J0YW50LiAgKi8KLQotc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOwotc3RhdGljIGJvb2xlYW4gaTM4NmxpbnV4X2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpMzg2bGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1pMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPSBxX21hZ2ljX2Zvcm1hdDsKLSAgcmV0dXJuIE5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgaTM4NmxpbnV4X2JmZF9maW5hbF9saW5rCi0KLS8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pMzg2bGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzM4Nik7Ci0KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIGkzODZsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMKLQwKLS8qIENvZGUgdG8gbGluayBhZ2FpbnN0IExpbnV4IGEub3V0IHNoYXJlZCBsaWJyYXJpZXMuICAqLwotCi0vKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLSNpZm5kZWYgR09UX1JFRl9QUkVGSVgKLSNkZWZpbmUJR09UX1JFRl9QUkVGSVgJIl9fR09UXyIKLSNlbmRpZgotCi0jZGVmaW5lIElTX0dPVF9TWU0obmFtZSkgXAotICAoc3RybmNtcCAobmFtZSwgR09UX1JFRl9QUkVGSVgsIHNpemVvZiBHT1RfUkVGX1BSRUZJWCAtIDEpID09IDApCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNpZm5kZWYgUExUX1JFRl9QUkVGSVgKLSNkZWZpbmUJUExUX1JFRl9QUkVGSVgJIl9fUExUXyIKLSNlbmRpZgotCi0jZGVmaW5lIElTX1BMVF9TWU0obmFtZSkgXAotICAoc3RybmNtcCAobmFtZSwgUExUX1JFRl9QUkVGSVgsIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpID09IDApCi0KLS8qIFRoaXMgc3RyaW5nIGlzIHVzZWQgdG8gZ2VuZXJhdGUgc3BlY2lhbGl6ZWQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi0jaWZuZGVmIE5FRURTX1NIUkxJQgotI2RlZmluZSBORUVEU19TSFJMSUIgIl9fTkVFRFNfU0hSTElCXyIKLSNlbmRpZgotCi0vKiBUaGlzIHNwZWNpYWwgc3ltYm9sIGlzIGEgc2V0IHZlY3RvciB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZgotICAgcG9pbnRlcnMgdG8gZml4dXAgdGFibGVzLiAgSXQgd2lsbCBiZSBwcmVzZW50IGluIGFueSBkeW5hbWljbHkKLSAgIGxpbmtlZCBmaWxlLiAgVGhlIGxpbmtlciBnZW5lcmF0ZWQgZml4dXAgdGFibGUgc2hvdWxkIGFsc28gYmUgYWRkZWQKLSAgIHRvIHRoZSBsaXN0LCBhbmQgaXQgc2hvdWxkIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHNlY29uZCBzbG90ICh0aGUKLSAgIGZpcnN0IG9uZSBpcyBhIGR1bW15IHdpdGggYSBtYWdpYyBudW1iZXIgdGhhdCBpcyBkZWZpbmVkIGluCi0gICBjcnQwLm8pLiAgKi8KLQotI2lmbmRlZiBTSEFSQUJMRV9DT05GTElDVFMKLSNkZWZpbmUgU0hBUkFCTEVfQ09ORkxJQ1RTICJfX1NIQVJBQkxFX0NPTkZMSUNUU19fIgotI2VuZGlmCi0KLS8qIFdlIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFRoZSB0ZXJtaW5vbG9neSBpcyBhIGJpdCBzdHJhbmdlLCBidXQKLSAgIGVhY2ggZml4dXAgY29udGFpbnMgdHdvIDMyIGJpdCBudW1iZXJzLiAgQSByZWd1bGFyIGZpeHVwIGNvbnRhaW5zCi0gICBhbiBhZGRyZXNzIGFuZCBhIHBvaW50ZXIsIGFuZCBhdCBydW50aW1lIHdlIHNob3VsZCBzdG9yZSB0aGUKLSAgIGFkZHJlc3MgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIHBvaW50ZXIuICBBIGJ1aWx0aW4gZml4dXAKLSAgIGNvbnRhaW5zIHR3byBwb2ludGVycywgYW5kIHdlIHNob3VsZCByZWFkIHRoZSBhZGRyZXNzIHVzaW5nIG9uZQotICAgcG9pbnRlciBhbmQgc3RvcmUgaXQgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIG90aGVyCi0gICBwb2ludGVyLiAgQnVpbHRpbiBmaXh1cHMgY29tZSBpbnRvIHBsYXkgd2hlbiB3ZSBoYXZlIGR1cGxpY2F0ZQotICAgX19HT1RfXyBzeW1ib2xzIGZvciB0aGUgc2FtZSB2YXJpYWJsZS4gIFRoZSBidWlsdGluIGZpeHVwIHdpbGwgY29weQotICAgdGhlIEdPVCBwb2ludGVyIGZyb20gb25lIG92ZXIgaW50byB0aGUgb3RoZXIuICAqLwotCi1zdHJ1Y3QgZml4dXAKLXsKLSAgc3RydWN0IGZpeHVwICpuZXh0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIC8qIE5vbnplcm8gaWYgdGhpcyBpcyBhIGp1bXAgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSBmaXhlZCwKLSAgICAgemVybyBpZiB0aGlzIGlzIGp1c3QgYSBwb2ludGVyICovCi0gIGNoYXIganVtcDsKLQotICBjaGFyIGJ1aWx0aW47Ci19OwotCi0vKiBXZSBkb24ndCBuZWVkIGEgc3BlY2lhbCBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZSwgYnV0IHdlIGRvIG5lZWQKLSAgIHRvIGtlZXAgc29tZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIGxpbmtlciBwYXNzZXMsIHNvIHdlIHVzZSBhIHNwZWNpYWwKLSAgIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSByb290OwotfTsKLQotc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBGaXJzdCBkeW5hbWljIG9iamVjdCBmb3VuZCBpbiBsaW5rLiAgKi8KLSAgYmZkICpkeW5vYmo7Ci0KLSAgLyogTnVtYmVyIG9mIGZpeHVwcy4gICovCi0gIHNpemVfdCBmaXh1cF9jb3VudDsKLQotICAvKiBOdW1iZXIgb2YgYnVpbHRpbiBmaXh1cHMuICAqLwotICBzaXplX3QgbG9jYWxfYnVpbHRpbnM7Ci0KLSAgLyogTGlzdCBvZiBmaXh1cHMuICAqLwotICBzdHJ1Y3QgZml4dXAgKmZpeHVwX2xpc3Q7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpsaW51eF9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGZpeHVwICpuZXdfZml4dXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbGludXhfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAotCSAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF90YWxseV9zeW1ib2xzCi0gIFBBUkFNUyAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGFuIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotbGludXhfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLQkgTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHM7IHRoZXJlIGFyZW4ndCBhbnkuICAqLwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1saW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJCSBsaW51eF9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5keW5vYmogPSBOVUxMOwotICByZXQtPmZpeHVwX2NvdW50ID0gMDsKLSAgcmV0LT5sb2NhbF9idWlsdGlucyA9IDA7Ci0gIHJldC0+Zml4dXBfbGlzdCA9IE5VTEw7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbGludXhfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYW91dF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksXAotCQkJICAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYW91dF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIExpbnV4IGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSBsaW51eF9oYXNoX3RhYmxlKHApICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogU3RvcmUgdGhlIGluZm9ybWF0aW9uIGZvciBhIG5ldyBmaXh1cC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKgotbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgYnVpbHRpbikKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGludCBidWlsdGluOwotewotICBzdHJ1Y3QgZml4dXAgKmY7Ci0KLSAgZiA9IChzdHJ1Y3QgZml4dXAgKikgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkJICBzaXplb2YgKHN0cnVjdCBmaXh1cCkpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIHJldHVybiBmOwotICBmLT5uZXh0ID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0gIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0ID0gZjsKLSAgZi0+aCA9IGg7Ci0gIGYtPnZhbHVlID0gdmFsdWU7Ci0gIGYtPmJ1aWx0aW4gPSBidWlsdGluOwotICBmLT5qdW1wID0gMDsKLSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQ7Ci0gIHJldHVybiBmOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSByZWFsaXplIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGxpbmsgdG8gYSBzaGFyZWQKLSAgIGxpYnJhcnkuICBXZSBuZWVkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQotICAgZml4dXAgdGFibGUsIGFuZCB3ZSB1bHRpbWF0ZWx5IG5lZWQgdG8gYWRkIGEgcG9pbnRlciB0byB0aGlzIGludG8KLSAgIHRoZSBzZXQgdmVjdG9yIGZvciBTSEFSQUJMRV9DT05GTElDVFMuICBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdAotICAga25vdyB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiwgYnV0IHRoYXQncyBPSyAtIHdlIGp1c3QgbmVlZCB0bwotICAgY3JlYXRlIGl0IGZvciBub3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIHNldCB0aGUgU0VDX0lOX01FTU9SWSBmbGFnLiAgKi8KLSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCi0gIC8qIFdlIGNob29zZSB0byB1c2UgdGhlIG5hbWUgIi5saW51eC1keW5hbWljIiBmb3IgdGhlIGZpeHVwIHRhYmxlLgotICAgICBXaHkgbm90PyAqLwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzLT5fcmF3X3NpemUgPSAwOwotICBzLT5jb250ZW50cyA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0JCSAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gaW5zZXJ0OwotCi0gIC8qIExvb2sgdXAgYW5kIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuCi0gICAgIElmIHdlIGRvLCBhbmQgdGhlIGRlZmluaW5nIGVudHJ5IGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgd2UKLSAgICAgbmVlZCB0byBjcmVhdGUgdGhlIGR5bmFtaWMgc2VjdGlvbnMuCi0KLSAgICAgRklYTUU6IFdoYXQgaWYgYWJmZC0+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+Y29udGVudHMsIDEsIHMtPl9yYXdfc2l6ZSwgb3V0cHV0X2JmZCkKLSAgICAgICE9IHMtPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCBsaW51eF9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLQotI2RlZmluZSBNWV96bWFnaWNfY29udGlndW91cyAxCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZseW54LmMgYi9iZmQvaTM4Nmx5bnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5OWRkMC4uMDAwMDAwMAotLS0gYS9iZmQvaTM4Nmx5bnguYworKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgTHlueE9TLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfaTM4NgotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4Nmx5bnhfYW91dF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYtbHlueCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWZuZGVmIFdSSVRFX0hFQURFUlMKLSNkZWZpbmUgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCkJCQkJCSAgICAgIFwKLSAgICAgIHsJCQkJCQkJCQkgICAgICBcCi0JYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7IC8qIGR1bW15IHZhcnMgKi8JCQkgICAgICBcCi0JZmlsZV9wdHIgdGV4dF9lbmQ7CQkJCQkJICAgICAgXAotCWlmIChhZGF0YShhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCQkJICAgICAgXAotCSAgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCk7ICAgICBcCi0gICAgCQkJCQkJCQkJICAgICAgXAotCWV4ZWNwLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIEVYVEVSTkFMX05MSVNUX1NJWkU7CSAgICAgIFwKLQlleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CQkJICAgICAgXAotICAgIAkJCQkJCQkJCSAgICAgIFwKLQlleGVjcC0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgICAgIFwKLQkJCSAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkgICAgICBcCi0JZXhlY3AtPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCQkgICAgICBcCi0JCQkgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwkJICAgICAgXAotCU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCAmZXhlY19ieXRlcyk7CSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApIHJldHVybiBmYWxzZTsJICAgICAgXAotCWlmIChiZmRfd3JpdGUgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCSAgICAgIFwKLQkgICAgIT0gRVhFQ19CWVRFU19TSVpFKQkJCQkJCSAgICAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgICAgXAotCS8qIE5vdyB3cml0ZSBvdXQgcmVsb2MgaW5mbywgZm9sbG93ZWQgYnkgc3ltcyBhbmQgc3RyaW5ncyAqLwkgICAgICBcCi0gIAkJCQkJCQkJCSAgICAgIFwKLQlpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkgCQkJCSAgICAgIFwKLQkgICAgewkJCQkJCQkJICAgICAgXAotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY3ApKSwgU0VFS19TRVQpICAgICBcCi0JCSAgIT0gMCkJCQkJCQkJICAgICAgXAotCSAgICAgICAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQkgICAgICBpZiAoISBOQU1FKGFvdXQsd3JpdGVfc3ltcykoYWJmZCkpIHJldHVybiBmYWxzZTsJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9UUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgICAgXAotCQkgICE9IDApCQkJCQkJCSAgICAgIFwKLQkgICAgICAgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKCFOQU1FKGx5bngsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKSAgIFwKLQkJcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIFwKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9EUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgICAgXAotCQkgICE9IDApCQkJCQkJCSAgICAgIFwKLQkgICAgICAgIHJldHVybiAwOwkJCQkJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQkgICAgICBpZiAoIU5BTUUobHlueCxzcXVpcnRfb3V0X3JlbG9jcykoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkgICAgXAotCQlyZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCSAgICB9CQkJCQkJCQkgICAgICBcCi0gICAgICB9Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLWNoYXIgKmx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoKTsKLWludCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoKTsKLWJvb2xlYW4gbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKCk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpseW54X2NvcmVfZmlsZV9wICgpOwotCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUJTVlfY29yZV9maWxlX3AgbHlueF9jb3JlX2ZpbGVfcAotCi0jZW5kaWYgLyogTFlOWF9DT1JFICovCi0MCi0KLSNkZWZpbmUgS0VFUElUIHVkYXRhLmkKLQotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgYW91dF8zMl9leHRfaG93dG9fdGFibGVbXTsKLWV4dGVybiByZWxvY19ob3d0b190eXBlIGFvdXRfMzJfc3RkX2hvd3RvX3RhYmxlW107Ci0KLS8qIFN0YW5kYXJkIHJlbG9jIHN0dWZmICovCi0vKiBPdXRwdXQgc3RhbmRhcmQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBhIGZpbGUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICovCi0KLXZvaWQKLU5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19vdXQpIChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZTsKLSAgdW5zaWduZWQgaW50IHJfYWRkZW5kOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEIChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl9sZW5ndGggPSBnLT5ob3d0by0+c2l6ZTsJLyogU2l6ZSBhcyBhIHBvd2VyIG9mIHR3byAqLwotICByX3BjcmVsID0gKGludCkgZy0+aG93dG8tPnBjX3JlbGF0aXZlOwkvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLSAgLyogcl9iYXNlcmVsLCByX2ptcHRhYmxlLCByX3JlbGF0aXZlPz8/ICBGSVhNRS1zb29uICovCi0gIHJfYmFzZXJlbCA9IDA7Ci0gIHJfam1wdGFibGUgPSAwOwotICByX3JlbGF0aXZlID0gMDsKLQotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgLyogbmFtZSB3YXMgY2xvYmJlcmVkIGJ5IGFvdXRfd3JpdGVfc3ltcyB0byBiZSBzeW1ib2wgaW5kZXggKi8KLQotICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gYSBzeW1ib2wgdGhlbiBzZXQgdGhlCi0gICAgIHJfaW5kZXggdG8gdGhlIHN5bWJvbHMgaW5kZXgsIGFuZCB0aGUgcl9leHRlcm4gYml0LgotCi0gICAgIEFic29sdXRlIHN5bWJvbHMgY2FuIGNvbWUgaW4gaW4gdHdvIHdheXMsIGVpdGhlciBhcyBhbiBvZmZzZXQKLSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24sIG9yIGFzIGEgc3ltYm9sIHdoaWNoIGhhcyBhbiBhYnMgdmFsdWUuCi0gICAgIGNoZWNrIGZvciB0aGF0IGhlcmUKLSAgICAgKi8KLQotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX2Fic19zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pKQotICAgIHsKLSAgICAgIGlmIChiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2wgPT0gc3ltKQotCXsKLQkgIC8qIFdob29wcywgbG9va2VkIGxpa2UgYW4gYWJzIHN5bWJvbCwgYnV0IGlzIHJlYWxseSBhbiBvZmZzZXQKLQkgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiAqLwotCSAgcl9pbmRleCA9IDA7Ci0JICByX2V4dGVybiA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEZpbGwgaW4gc3ltYm9sICovCi0JICByX2V4dGVybiA9IDE7Ci0JICByX2luZGV4ID0gKCpnLT5zeW1fcHRyX3B0ciktPktFRVBJVDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKHJfZXh0ZXJuID8gUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRyA6IDApCi0JfCAocl9wY3JlbCA/IFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRyA6IDApCi0JfCAocl9iYXNlcmVsID8gUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcgOiAwKQotCXwgKHJfam1wdGFibGUgPyBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcgOiAwKQotCXwgKHJfcmVsYXRpdmUgPyBSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcgOiAwKQotCXwgKHJfbGVuZ3RoIDw8IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCShyX2V4dGVybiA/IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUgOiAwKQotCXwgKHJfcGNyZWwgPyBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUgOiAwKQotCXwgKHJfYmFzZXJlbCA/IFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFIDogMCkKLQl8IChyX2ptcHRhYmxlID8gUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFIDogMCkKLQl8IChyX3JlbGF0aXZlID8gUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFIDogMCkKLQl8IChyX2xlbmd0aCA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLSAgICB9Ci19Ci0KLQotLyogRXh0ZW5kZWQgc3R1ZmYgKi8KLS8qIE91dHB1dCBleHRlbmRlZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGEgZmlsZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gKi8KLQotdm9pZAotTkFNRShseW54LHN3YXBfZXh0X3JlbG9jX291dCkgKGFiZmQsIGcsIG5hdHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpnOwotICAgICByZWdpc3RlciBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpuYXRwdHI7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gIHVuc2lnbmVkIGludCByX2FkZGVuZDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgUFVUX1dPUkQgKGFiZmQsIGctPmFkZHJlc3MsIG5hdHB0ci0+cl9hZGRyZXNzKTsKLQotICByX3R5cGUgPSAodW5zaWduZWQgaW50KSBnLT5ob3d0by0+dHlwZTsKLQotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQotICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gYSBzeW1ib2wgdGhlbiBzZXQgdGhlCi0gICAgIHJfaW5kZXggdG8gdGhlIHN5bWJvbHMgaW5kZXgsIGFuZCB0aGUgcl9leHRlcm4gYml0LgotCi0gICAgIEFic29sdXRlIHN5bWJvbHMgY2FuIGNvbWUgaW4gaW4gdHdvIHdheXMsIGVpdGhlciBhcyBhbiBvZmZzZXQKLSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24sIG9yIGFzIGEgc3ltYm9sIHdoaWNoIGhhcyBhbiBhYnMgdmFsdWUuCi0gICAgIGNoZWNrIGZvciB0aGF0IGhlcmUKLSAgICAgKi8KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sID09IHN5bSkKLQl7Ci0JICAvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JIGZyb20gdGhlIGFicyBzZWN0aW9uICovCi0JICByX2luZGV4ID0gMDsKLQkgIHJfZXh0ZXJuID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcl9leHRlcm4gPSAxOwotCSAgcl9pbmRleCA9ICgqZy0+c3ltX3B0cl9wdHIpLT5LRUVQSVQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKHJfZXh0ZXJuID8gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRyA6IDApCi0JfCAocl90eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLQkocl9leHRlcm4gPyBSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFIDogMCkKLQl8IChyX3R5cGUgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUpOwotICAgIH0KLQotICBQVVRfV09SRCAoYWJmZCwgcl9hZGRlbmQsIG5hdHB0ci0+cl9hZGRlbmQpOwotfQotCi0vKiBCRkQgZGVhbHMgaW50ZXJuYWxseSB3aXRoIGFsbCB0aGluZ3MgYmFzZWQgZnJvbSB0aGUgc2VjdGlvbiB0aGV5J3JlCi0gICBpbi4gc28sIHNvbWV0aGluZyBpbiAxMCBieXRlcyBpbnRvIGEgdGV4dCBzZWN0aW9uICB3aXRoIGEgYmFzZSBvZgotICAgNTAgd291bGQgaGF2ZSBhIHN5bWJvbCAoLnRleHQrMTApIGFuZCBrbm93IC50ZXh0IHZtYSB3YXMgNTAuCi0KLSAgIEFvdXQga2VlcHMgYWxsIGl0J3Mgc3ltYm9scyBiYXNlZCBmcm9tIHplcm8sIHNvIHRoZSBzeW1ib2wgd291bGQKLSAgIGNvbnRhaW4gNjAuIFRoaXMgbWFjcm8gc3VicyB0aGUgYmFzZSBvZiBlYWNoIHNlY3Rpb24gZnJvbSB0aGUgdmFsdWUKLSAgIHRvIGdpdmUgdGhlIHRydWUgb2Zmc2V0IGZyb20gdGhlIHNlY3Rpb24gKi8KLQotCi0jZGVmaW5lIE1PVkVfQUREUkVTUyhhZCkgICAgICAgCQkJCQkJXAotICBpZiAocl9leHRlcm4pIHsJCQkJCQkJXAotICAgLyogdW5kZWZpbmVkIHN5bWJvbCAqLwkJCQkJCVwKLSAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyByX2luZGV4OwkJCVwKLSAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZDsJCQkJCQlcCi0gICAgIH0gZWxzZSB7CQkJCQkJCQlcCi0gICAgLyogZGVmaW5lZCwgc2VjdGlvbiByZWxhdGl2ZS4gcmVwbGFjZSBzeW1ib2wgd2l0aCBwb2ludGVyIHRvICAgIAlcCi0gICAgICAgc3ltYm9sIHdoaWNoIHBvaW50cyB0byBzZWN0aW9uICAqLwkJCQlcCi0gICAgc3dpdGNoIChyX2luZGV4KSB7CQkJCQkJCVwKLSAgICBjYXNlIE5fVEVYVDoJCQkJCQkJXAotICAgIGNhc2UgTl9URVhUIHwgTl9FWFQ6CQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfdGV4dHNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgIC0gc3UtPnRleHRzZWMtPnZtYTsJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBjYXNlIE5fREFUQToJCQkJCQkJXAotICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6CQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfZGF0YXNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgLSBzdS0+ZGF0YXNlYy0+dm1hOwkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIGNhc2UgTl9CU1M6CQkJCQkJCQlcCi0gICAgY2FzZSBOX0JTUyB8IE5fRVhUOgkJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyICA9IG9ial9ic3NzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkIC0gc3UtPmJzc3NlYy0+dm1hOwkJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBkZWZhdWx0OgkJCQkJCQkJXAotICAgIGNhc2UgTl9BQlM6CQkJCQkJCQlcCi0gICAgY2FzZSBOX0FCUyB8IE5fRVhUOgkJCQkJCQlcCi0gICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZDsJCQkJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotICB9ICAgICAJCQkJCQkJCVwKLQotdm9pZAotTkFNRShseW54LHN3YXBfZXh0X3JlbG9jX2luKSAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqYnl0ZXM7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLSAgc3RydWN0IGFvdXRkYXRhICpzdSA9ICYoYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hKTsKLQotICBjYWNoZV9wdHItPmFkZHJlc3MgPSAoR0VUX1NXT1JEIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKSk7Ci0KLSAgcl9pbmRleCA9IGJ5dGVzLT5yX2luZGV4WzFdOwotICByX2V4dGVybiA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcpKTsKLSAgcl90eXBlID0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcpCi0gICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUc7Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IGFvdXRfMzJfZXh0X2hvd3RvX3RhYmxlICsgcl90eXBlOwotICBNT1ZFX0FERFJFU1MgKEdFVF9TV09SRCAoYWJmZCwgYnl0ZXMtPnJfYWRkZW5kKSk7Ci19Ci0KLXZvaWQKLU5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19pbikgKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLQotICByX2luZGV4ID0gYnl0ZXMtPnJfaW5kZXhbMV07Ci0gIHJfZXh0ZXJuID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOwotICByX3BjcmVsID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0gIHJfYmFzZXJlbCA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHKSk7Ci0gIHJfam1wdGFibGUgPSAoMCAhPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcpKTsKLSAgcl9yZWxhdGl2ZSA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRykpOwotICByX2xlbmd0aCA9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCi0gICAgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRzsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gYW91dF8zMl9zdGRfaG93dG9fdGFibGUgKyByX2xlbmd0aCArIDQgKiByX3BjcmVsOwotICAvKiBGSVhNRS1zb29uOiAgUm9sbCBiYXNlcmVsLCBqbXB0YWJsZSwgcmVsYXRpdmUgYml0cyBpbnRvIGhvd3RvIHNldHRpbmcgKi8KLQotICBNT1ZFX0FERFJFU1MgKDApOwotfQotCi0vKiBSZWxvYyBoYWNrZXJ5ICovCi0KLWJvb2xlYW4KLU5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKLSAgUFRSIHJlbG9jczsKLSAgYXJlbGVudCAqcmVsb2NfY2FjaGU7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICByZWxvY19zaXplID0gZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZTsKLSAgICAgIGdvdG8gZG9pdDsKLSAgICB9Ci0KLSAgaWYgKGFzZWN0ID09IG9ial90ZXh0c2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICByZWxvY19zaXplID0gZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZTsKLSAgICAgIGdvdG8gZG9pdDsKLSAgICB9Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotCi1kb2l0OgotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGFzZWN0LT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0KLSAgY291bnQgPSByZWxvY19zaXplIC8gZWFjaF9zaXplOwotCi0KLSAgcmVsb2NfY2FjaGUgPSAoYXJlbGVudCAqKSBiZmRfbWFsbG9jIChjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOwotICBpZiAoIXJlbG9jX2NhY2hlICYmIGNvdW50ICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1zZXQgKHJlbG9jX2NhY2hlLCAwLCBjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jcyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsb2Nfc2l6ZSk7Ci0gIGlmICghcmVsb2NzICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOwotICAgICAgZnJlZSAocmVsb2NfY2FjaGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJwdHIgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvY3M7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gICAgICBhcmVsZW50ICpjYWNoZV9wdHIgPSByZWxvY19jYWNoZTsKLQotICAgICAgZm9yICg7IGNvdW50ZXIgPCBjb3VudDsgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotCXsKLQkgIE5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKLQkJCQkJYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpycHRyID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzOwotICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICAgICAgYXJlbGVudCAqY2FjaGVfcHRyID0gcmVsb2NfY2FjaGU7Ci0KLSAgICAgIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLQl7Ci0JICBOQU1FKGx5bngsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBycHRyLCBjYWNoZV9wdHIsIHN5bWJvbHMsCi0JCQkJCWJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLQl9Ci0KLSAgICB9Ci0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jcyk7Ci0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLS8qIFdyaXRlIG91dCBhIHJlbG9jYXRpb24gc2VjdGlvbiBpbnRvIGFuIG9iamVjdCBmaWxlLiAgKi8KLQotYm9vbGVhbgotTkFNRShseW54LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgYXJlbGVudCAqKmdlbmVyaWM7Ci0gIHVuc2lnbmVkIGNoYXIgKm5hdGl2ZSwgKm5hdHB0cjsKLSAgc2l6ZV90IGVhY2hfc2l6ZTsKLQotICB1bnNpZ25lZCBpbnQgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgc2l6ZV90IG5hdHNpemU7Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotICBuYXRzaXplID0gZWFjaF9zaXplICogY291bnQ7Ci0gIG5hdGl2ZSA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF96YWxsb2MgKGFiZmQsIG5hdHNpemUpOwotICBpZiAoIW5hdGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZ2VuZXJpYyA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCi0gIGlmIChlYWNoX3NpemUgPT0gUkVMT0NfRVhUX1NJWkUpCi0gICAgewotICAgICAgZm9yIChuYXRwdHIgPSBuYXRpdmU7Ci0JICAgY291bnQgIT0gMDsKLQkgICAtLWNvdW50LCBuYXRwdHIgKz0gZWFjaF9zaXplLCArK2dlbmVyaWMpCi0JTkFNRShseW54LHN3YXBfZXh0X3JlbG9jX291dCkgKGFiZmQsICpnZW5lcmljLCAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSBuYXRwdHIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOwotCSAgIGNvdW50ICE9IDA7Ci0JICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotCU5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19vdXQpIChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgbmF0cHRyKTsKLSAgICB9Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmF0aXZlLCAxLCBuYXRzaXplLCBhYmZkKSAhPSBuYXRzaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuYXRpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIG5hdGl2ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLwotbG9uZwotTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaWYgKCEodGJscHRyIHx8IE5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHsKLSAgICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQl7Ci0JICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotCXsKLQkgICpyZWxwdHIrKyA9IHRibHB0cisrOwotCX0KLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4Nm1hY2gzLmMgYi9iZmQvaTM4Nm1hY2gzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjc1ODIuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZtYWNoMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBpMzg2IGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGZvciBNYWNoIDMsIHdoaWNoIHVzZXMgYS5vdXQsIG5vdCBNYWNoLU8uICAqLwotCi0vKiBUaGVyZSBpcyBubyBtYWdpYyBudW1iZXIgb3IgYW55dGhpbmcgd2hpY2ggbGV0cyB1cyBkaXN0aW5ndWlzaCB0aGlzIHRhcmdldAotICAgZnJvbSBpMzg2YW91dCBvciBpMzg2YnNkLiAgU28gdGhpcyB0YXJnZXQgaXMgb25seSB1c2VmdWwgaWYgaXQgaXMgdGhlCi0gICBkZWZhdWx0IHRhcmdldC4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQkxCi0jZGVmaW5lCVNFR01FTlRfU0laRQkweDEwMDAKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCTB4MTAwMDAKLSNkZWZpbmUgQVJDSCAzMgotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLS8qIFRoaXMgbWFjcm8gaXMgb25seSByZWxldmFudCB3aGVuIE5fTUFHSUMoeCkgPT0gWk1BR0lDLiAgKi8KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KQkxCi0KLSNkZWZpbmUgTl9UWFRTSVpFKHgpCSgoeCkuYV90ZXh0KQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZtYWNoM18sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW1hY2gzIgotCi1zdGF0aWMgYm9vbGVhbiBNWShzZXRfc2l6ZXMpKCk7Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0gewotICAwLAkJCQkvKiB6bWFnaWMgY29udGlndW91cyAqLwotICAxLAkJCQkvKiB0ZXh0IGluY2wgaGVhZGVyICovCi0gIDAsCQkJCS8qIGVudHJ5IGlzIHRleHQgYWRkcmVzcyAqLwotICAwLAkJCQkvKiBleGVjX2hkcl9mbGFncyAqLwotICAwLAkJCQkvKiB0ZXh0IHZtYT8gKi8KLSAgTVkoc2V0X3NpemVzKSwKLSAgMSwJCQkJLyogZXhlYyBoZWFkZXIgbm90IGNvdW50ZWQgKi8KLSAgMCwJCQkJLyogYWRkX2R5bmFtaWNfc3ltYm9scyAqLwotICAwLAkJCQkvKiBhZGRfb25lX3N5bWJvbCAqLwotICAwLAkJCQkvKiBsaW5rX2R5bmFtaWNfb2JqZWN0ICovCi0gIDAsCQkJCS8qIHdyaXRlX2R5bmFtaWNfc3ltYm9sICovCi0gIDAsCQkJCS8qIGNoZWNrX2R5bmFtaWNfcmVsb2MgKi8KLSAgMAkJCQkvKiBmaW5pc2hfZHluYW1pY19saW5rICovCi19OwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2bXNkb3MuYyBiL2JmZC9pMzg2bXNkb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzllYzg2NC4uMDAwMDAwMAotLS0gYS9iZmQvaTM4Nm1zZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNUy1ET1MgZXhlY3V0YWJsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQnJ5YW4gRm9yZCBvZiB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jaWYgMAotc3RydWN0IGV4ZV9oZWFkZXIKLXsKLQl1bnNpZ25lZCBzaG9ydCBtYWdpYzsKLQl1bnNpZ25lZCBzaG9ydCBieXRlc19pbl9sYXN0X3BhZ2U7Ci0JdW5zaWduZWQgc2hvcnQgbnBhZ2VzOwkvKiBudW1iZXIgb2YgNTEyLWJ5dGUgInBhZ2VzIiBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCBucmVsb2NzOwotCXVuc2lnbmVkIHNob3J0IGhlYWRlcl9wYXJhczsJLyogbnVtYmVyIG9mIDE2LWJ5dGUgcGFyYWdyYXBocyBpbiBoZWFkZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDsKLQl1bnNpZ25lZCBzaG9ydCBsb2FkX3N3aXRjaDsKLQl1bnNpZ25lZCBzaG9ydCBzc19vZnM7Ci0JdW5zaWduZWQgc2hvcnQgc3A7Ci0JdW5zaWduZWQgc2hvcnQgY2hlY2tzdW07Ci0JdW5zaWduZWQgc2hvcnQgaXA7Ci0JdW5zaWduZWQgc2hvcnQgY3Nfb2ZzOwotCXVuc2lnbmVkIHNob3J0IHJlbG9jX29mczsKLQl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDI7Ci0JdW5zaWduZWQgc2hvcnQgc29tZXRoaW5nMTsKLQl1bnNpZ25lZCBzaG9ydCBzb21ldGhpbmcyOwotCXVuc2lnbmVkIHNob3J0IHNvbWV0aGluZzM7Ci19OwotI2VuZGlmCi0KLSNkZWZpbmUgRVhFX01BR0lDCTB4NWE0ZAotI2RlZmluZSBFWEVfTE9BRF9ISUdICTB4MDAwMAotI2RlZmluZSBFWEVfTE9BRF9MT1cJMHhmZmZmCi0jZGVmaW5lIEVYRV9QQUdFX1NJWkUJNTEyCi0KLQotc3RhdGljIGludAotbXNkb3Nfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIGV4ZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1tc2Rvc193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RhdGljIGNoYXIgaGRyW0VYRV9QQUdFX1NJWkVdOwotICBmaWxlX3B0ciBvdXRmaWxlX3NpemUgPSBzaXplb2YoaGRyKTsKLSAgYmZkX3ZtYSBoaWdoX3ZtYSA9IDA7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgLyogRmluZCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcHJvZ3JhbSBvbiBkaXNrIGFuZCBpbiBtZW1vcnkuICAqLwotICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpID09IDApCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19BTExPQykKLSAgICAgICAgewotCSAgYmZkX3ZtYSBzZWNfdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCSAgCQkgICAgKyBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYyk7Ci0JICBpZiAoc2VjX3ZtYSA+IGhpZ2hfdm1hKQotCSAgICBoaWdoX3ZtYSA9IHNlY192bWE7Ci0JfQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19MT0FEKQotICAgICAgICB7Ci0JICBmaWxlX3B0ciBzZWNfZW5kID0gc2l6ZW9mKGhkcikKLQkgIAkJICAgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKLQkJCSAgICAgKyBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYyk7Ci0JICBpZiAoc2VjX2VuZCA+IG91dGZpbGVfc2l6ZSkKLQkgICAgb3V0ZmlsZV9zaXplID0gc2VjX2VuZDsKLQl9Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgcHJvZ3JhbSBpc24ndCB0b28gYmlnLiAgKi8KLSAgaWYgKGhpZ2hfdm1hID4gKGJmZF92bWEpMHhmZmZmKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIGNvbnN0YW50cyAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgRVhFX01BR0lDLCAmaGRyWzBdKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIEVYRV9QQUdFX1NJWkUgLyAxNiwgJmhkcls4XSk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBFWEVfTE9BRF9MT1csICZoZHJbMTJdKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIDB4M2UsICZoZHJbMjRdKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIDB4MDAwMSwgJmhkclsyOF0pOyAvKiBYWFg/Pz8gKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIDB4MzBmYiwgJmhkclszMF0pOyAvKiBYWFg/Pz8gKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIDB4NzI2YSwgJmhkclszMl0pOyAvKiBYWFg/Pz8gKi8KLQotICAvKiBieXRlcyBpbiBsYXN0IHBhZ2UgKDAgPSBmdWxsIHBhZ2UpICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBvdXRmaWxlX3NpemUgJiAoRVhFX1BBR0VfU0laRSAtIDEpLCAmaGRyWzJdKTsKLQotICAvKiBudW1iZXIgb2YgcGFnZXMgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIChvdXRmaWxlX3NpemUgKyBFWEVfUEFHRV9TSVpFIC0gMSkgLyBFWEVfUEFHRV9TSVpFLAotICAJICAgICAgICZoZHJbNF0pOwotCi0gIC8qIFNldCB0aGUgaW5pdGlhbCBzdGFjayBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGJzcy4KLSAgICAgVGhlIHByb2dyYW0ncyBjcnQwIGNvZGUgbXVzdCByZWxvY2F0ZSBpdCB0byBhIHJlYWwgc3RhY2suICAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgaGlnaF92bWEsICZoZHJbMTZdKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF93cml0ZSAoaGRyLCAxLCBzaXplb2YoaGRyKSwgYWJmZCkgIT0gc2l6ZW9mKGhkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotbXNkb3Nfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2VjdGlvbi0+ZmlsZXBvcyA9IEVYRV9QQUdFX1NJWkUgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0aW9uKSAmIFNFQ19MT0FEKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCksIFNFRUtfU0VUKSAhPSAwCi0gICAgICAgICAgfHwgYmZkX3dyaXRlIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLQotI2RlZmluZSBtc2Rvc19ta29iamVjdCBhb3V0XzMyX21rb2JqZWN0Ci0jZGVmaW5lIG1zZG9zX21ha2VfZW1wdHlfc3ltYm9sIGFvdXRfMzJfbWFrZV9lbXB0eV9zeW1ib2wKLSNkZWZpbmUgbXNkb3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGFvdXRfMzJfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZQltc2Rvc19jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgbXNkb3NfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIG1zZG9zX25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLSNkZWZpbmUgbXNkb3NfZ2V0X3NlY3Rpb25fY29udGVudHMgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIG1zZG9zX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNkZWZpbmUgbXNkb3NfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBtc2Rvc19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIG1zZG9zX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBtc2Rvc19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBtc2Rvc19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBtc2Rvc19iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBtc2Rvc19iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgbXNkb3Nfc2V0X2FyY2hfbWFjaCBfYmZkX2dlbmVyaWNfc2V0X2FyY2hfbWFjaAotCi0jZGVmaW5lIG1zZG9zX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBtc2Rvc19nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgbXNkb3NfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotI2RlZmluZSBtc2Rvc19nZXRfc3ltYm9sX2luZm8gX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIG1zZG9zX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIG1zZG9zX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBtc2Rvc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBtc2Rvc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIG1zZG9zX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBtc2Rvc19taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIG1zZG9zX2Nhbm9uaWNhbGl6ZV9yZWxvYyBfYmZkX25vcmVsb2NzX2Nhbm9uaWNhbGl6ZV9yZWxvYwotI2RlZmluZSBtc2Rvc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgX2JmZF9ub3JlbG9jc19nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgbXNkb3NfMzJfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi1jb25zdCBiZmRfdGFyZ2V0IGkzODZtc2Rvc192ZWMgPQotewotICAibXNkb3MiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoRVhFQ19QKSwJCQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIG1zZG9zX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBtc2Rvc193cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChtc2RvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChtc2RvcyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAobXNkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAobXNkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChtc2RvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMAotfTsKLQotCmRpZmYgLS1naXQgYS9iZmQvaTM4Nm5ldGJzZC5jIGIvYmZkL2kzODZuZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI3YjZmOS4uMDAwMDAwMAotLS0gYS9iZmQvaTM4Nm5ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvMzg2IGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZQlCWVRFU19JTl9XT1JECTQKLSN1bmRlZiBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQk0MDk2Ci0jZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0KLSNkZWZpbmUJREVGQVVMVF9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUJREVGQVVMVF9NSUQgCU1fMzg2X05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4Nm5ldGJzZF8sT1ApCi0vKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLwotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZvczlrLmMgYi9iZmQvaTM4Nm9zOWsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhZGVlNS4uMDAwMDAwMAotLS0gYS9iZmQvaTM4Nm9zOWsuYworKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIG9zOTAwMCBpMzg2IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0jaW5jbHVkZSAib3M5ay5oIgotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqb3M5a19jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgdGFrZW4gZnJvbSBhIHJhdyBieXRlCi0gICBzdHJlYW0gbWVtb3J5IGltYWdlLCBpbnRvIHRoZSBpbnRlcm5hbCBleGVjX2hlYWRlciBzdHJ1Y3R1cmUuICAqLwotYm9vbGVhbgotb3M5a19zd2FwX2V4ZWNfaGVhZGVyX2luIChhYmZkLCByYXdfYnl0ZXMsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG1oX2NvbSAqcmF3X2J5dGVzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIG1oX2NvbSAqYnl0ZXMgPSAobWhfY29tICopIHJhd19ieXRlczsKLSAgdW5zaWduZWQgaW50IGRsb2FkLCBkbWVtc2l6ZSwgZG1lbXN0YXJ0OwotCi0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgZXhlY3AsIGZyb20gdGhlIGJ5dGVzIGluIHRoZSByYXcgZGF0YS4gICovCi0gIGV4ZWNwLT5hX2luZm8gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGJ5dGVzLT5tX3N5bmMpOwotICBleGVjcC0+YV9zeW1zID0gMDsKLSAgZXhlY3AtPmFfZW50cnkgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5tX2V4ZWMpOwotICBleGVjcC0+YV90YWxpZ24gPSAyOwotICBleGVjcC0+YV9kYWxpZ24gPSAyOwotICBleGVjcC0+YV9iYWxpZ24gPSAyOwotCi0gIGRsb2FkID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+bV9pZGF0YSk7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBkbG9hZCArIDg7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGRsb2FkLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkICgmZG1lbXN0YXJ0LCBzaXplb2YgKGRtZW1zdGFydCksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKGRtZW1zdGFydCkpCi0gICAgICB8fCAoYmZkX3JlYWQgKCZkbWVtc2l6ZSwgc2l6ZW9mIChkbWVtc2l6ZSksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKGRtZW1zaXplKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGV4ZWNwLT5hX3Rsb2FkID0gMDsKLSAgZXhlY3AtPmFfZGxvYWQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZkbWVtc3RhcnQpOwotICBleGVjcC0+YV90ZXh0ID0gZGxvYWQgLSBleGVjcC0+YV90bG9hZDsKLSAgZXhlY3AtPmFfZGF0YSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmRtZW1zaXplKTsKLSAgZXhlY3AtPmFfYnNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+bV9kYXRhKSAtIGV4ZWNwLT5hX2RhdGE7Ci0KLSAgZXhlY3AtPmFfdHJzaXplID0gMDsKLSAgZXhlY3AtPmFfZHJzaXplID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmIDAKLS8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBpbnRlcm5hbCBleGVjIGhlYWRlciBzdHJ1Y3R1cmUgaW50byB0aGUKLSAgIHN1cHBsaWVkIGJ1ZmZlciByZWFkeSBmb3Igd3JpdGluZyB0byBkaXNrLiAgKi8KLQotUFJPVE8gKHZvaWQsIG9zOWtfc3dhcF9leGVjX2hlYWRlcl9vdXQsCi0gICAgICAgICAoYmZkICogYWJmZCwKLQkgIHN0cnVjdCBpbnRlcm5hbF9leGVjICogZXhlY3AsCi0JICBzdHJ1Y3QgbWhfY29tICogcmF3X2J5dGVzKSk7Ci12b2lkCi1vczlrX3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjcCwgcmF3X2J5dGVzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLSAgICAgbWhfY29tICpyYXdfYnl0ZXM7Ci17Ci0gIG1oX2NvbSAqYnl0ZXMgPSAobWhfY29tICopIHJhd19ieXRlczsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIHJhdyBkYXRhLCBmcm9tIHRoZSBmaWVsZHMgaW4gdGhlIGV4ZWMgc3RydWN0LiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2luZm8sIGJ5dGVzLT5lX2luZm8pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX3RleHQsIGJ5dGVzLT5lX3RleHQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2RhdGEsIGJ5dGVzLT5lX2RhdGEpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2JzcywgYnl0ZXMtPmVfYnNzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9zeW1zLCBieXRlcy0+ZV9zeW1zKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9lbnRyeSwgYnl0ZXMtPmVfZW50cnkpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX3Ryc2l6ZSwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9kcnNpemUsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfdGxvYWQsIGJ5dGVzLT5lX3Rsb2FkKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9kbG9hZCwgYnl0ZXMtPmVfZGxvYWQpOwotICBieXRlcy0+ZV90YWxpZ25bMF0gPSBleGVjcC0+YV90YWxpZ247Ci0gIGJ5dGVzLT5lX2RhbGlnblswXSA9IGV4ZWNwLT5hX2RhbGlnbjsKLSAgYnl0ZXMtPmVfYmFsaWduWzBdID0gZXhlY3AtPmFfYmFsaWduOwotICBieXRlcy0+ZV9yZWxheGFibGVbMF0gPSBleGVjcC0+YV9yZWxheGFibGU7Ci19Ci0KLSNlbmRpZgkvKiAwICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLW9zOWtfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgYW5leGVjOwotICBtaF9jb20gZXhlY19ieXRlczsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgZXhlY19ieXRlcywgTUhDT01fQllURVNfU0laRSwgMSwgYWJmZCkKLSAgICAgICE9IE1IQ09NX0JZVEVTX1NJWkUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGFuZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGV4ZWNfYnl0ZXMubV9zeW5jKTsKLSAgaWYgKE5fQkFETUFHIChhbmV4ZWMpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmICghIG9zOWtfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgJmV4ZWNfYnl0ZXMsICZhbmV4ZWMpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuIGFvdXRfMzJfc29tZV9hb3V0X29iamVjdF9wIChhYmZkLCAmYW5leGVjLCBvczlrX2NhbGxiYWNrKTsKLX0KLQotCi0vKiBGaW5pc2ggdXAgdGhlIG9wZW5pbmcgb2YgYSBiLm91dCBmaWxlIGZvciByZWFkaW5nLiAgRmlsbCBpbiBhbGwgdGhlCi0gICBmaWVsZHMgdGhhdCBhcmUgbm90IGhhbmRsZWQgYnkgY29tbW9uIGNvZGUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vczlrX2NhbGxiYWNrIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgdW5zaWduZWQgbG9uZyBic3Nfc3RhcnQ7Ci0KLSAgLyogQXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgKi8KLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2kzODYsIDApOwotCi0gIC8qIFRoZSBwb3NpdGlvbnMgb2YgdGhlIHN0cmluZyB0YWJsZSBhbmQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IDA7Ci0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSAwOwotCi0gIC8qIFRoZSBhbGlnbm1lbnRzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGV4ZWNwLT5hX3RhbGlnbjsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV9kYWxpZ247Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV9iYWxpZ247Ci0KLSAgLyogVGhlIHN0YXJ0aW5nIGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMuICAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSA9IGV4ZWNwLT5hX3Rsb2FkOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IGV4ZWNwLT5hX2Rsb2FkOwotCi0gIC8qIEFuZCByZWxvYWQgdGhlIHNpemVzLCBzaW5jZSB0aGUgYW91dCBtb2R1bGUgemFwcyB0aGVtICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfdGV4dDsKLQotICBic3Nfc3RhcnQgPSBleGVjcC0+YV9kbG9hZCArIGV4ZWNwLT5hX2RhdGE7CS8qIEJTUyA9IGVuZCBvZiBkYXRhIHNlY3Rpb24gKi8KLSAgb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSA9IGFsaWduX3Bvd2VyIChic3Nfc3RhcnQsIGV4ZWNwLT5hX2JhbGlnbik7Ci0KLSAgLyogVGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBleGVjcC0+YV9lbnRyeTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gZXhlY3AtPmFfZGxvYWQ7Ci0KLSAgLyogVGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKioqCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX1RST0ZGKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSAgTl9EUk9GRigqZXhlY3ApOwotICAqLwotCi0gIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAxOwkvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDE7LyogTm90IGFwcGxpY2FibGUuICovCi0gIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBNSENPTV9CWVRFU19TSVpFOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0jaWYgMAotc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QKLXsKLSAgc3RydWN0IGFvdXRkYXRhIGE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGU7Ci19OwotCi1zdGF0aWMgYm9vbGVhbgotb3M5a19ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqcmF3cHRyOwotCi0gIHJhd3B0ciA9IChzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBib3V0X2RhdGFfc3RydWN0KSk7Ci0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWJmZC0+dGRhdGEuYm91dF9kYXRhID0gcmF3cHRyOwotICBleGVjX2hkciAoYWJmZCkgPSAmcmF3cHRyLT5lOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBvYmpfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgb2JqX2Jzc3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW9zOWtfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIHN3YXBwZWRfaGRyOwotCi0gIGlmICghIGFvdXRfMzJfbWFrZV9zZWN0aW9ucyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV9pbmZvID0gQk1BR0lDOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90ZXh0ID0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kYXRhID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9ic3MgPSBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogc2l6ZW9mIChzdHJ1Y3Qgbmxpc3QpOwotICBleGVjX2hkciAoYWJmZCktPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBleGVjX2hkciAoYWJmZCktPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0JCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoKLQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pKTsKLQotICBleGVjX2hkciAoYWJmZCktPmFfdGFsaWduID0gb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kYWxpZ24gPSBvYmpfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlcjsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2JhbGlnbiA9IG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3Rsb2FkID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9kbG9hZCA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOwotCi0gIGJvdXRfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNfaGRyIChhYmZkKSwgJnN3YXBwZWRfaGRyKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICYgc3dhcHBlZF9oZHIsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLQkgICE9IEVYRUNfQllURVNfU0laRSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3cml0ZSBvdXQgcmVsb2MgaW5mbywgZm9sbG93ZWQgYnkgc3ltcyBhbmQgc3RyaW5ncyAqLwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fU1lNT0ZGICgqZXhlY19oZHIgKGFiZmQpKSksIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghYW91dF8zMl93cml0ZV9zeW1zIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoTl9UUk9GRiAoKmV4ZWNfaGRyIChhYmZkKSkpLCBTRUVLX1NFVCkKLQkgICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoIWJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoTl9EUk9GRiAoKmV4ZWNfaGRyIChhYmZkKSkpLCBTRUVLX1NFVCkKLQkgICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoIWJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotDAotc3RhdGljIGJvb2xlYW4KLW9zOWtfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgaW50IGNvdW50OwotewotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQotICAgIHsJCQkJLyogc2V0IGJ5IGJmZC5jIGhhbmRsZXIgKi8KLSAgICAgIGlmICghIGFvdXRfMzJfbWFrZV9zZWN0aW9ucyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKTsKLSAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcwotCSsgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgICB9Ci0gIC8qIHJlZ2FyZGxlc3MsIG9uY2Ugd2Uga25vdyB3aGF0IHdlJ3JlIGRvaW5nLCB3ZSBtaWdodCBhcyB3ZWxsIGdldCBnb2luZyAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGJmZF93cml0ZSAoKFBUUikgbG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSA9PSBjb3VudCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZgkvKiAwICovCi0KLXN0YXRpYyBpbnQKLW9zOWtfc2l6ZW9mX2hlYWRlcnMgKGlnbm9yZV9hYmZkLCBpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwIGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBhb3V0XzMyX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLQotI2RlZmluZSBhb3V0XzMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jZGVmaW5lIG9zOWtfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBvczlrX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgb3M5a19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgb3M5a19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBvczlrX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIG9zOWtfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgb3M5a19iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgaTM4Nm9zOWtfdmVjID0KLXsKLSAgImkzODZvczlrIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZHIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IFdQX1RFWFQpLAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sIGxlYWRpbmcgY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogaGRycyAqLwotICB7X2JmZF9kdW1teV90YXJnZXQsIG9zOWtfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChvczlrKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9pZWVlLmMgYi9iZmQvaWVlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODlkNzI0Li4wMDAwMDAwCi0tLSBhL2JmZC9pZWVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTc5ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgaWVlZS02OTUgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEtFRVBNSU5VU1BDSU5JTlNUIDAKLQotLyogSUVFRSA2OTUgZm9ybWF0IGlzIGEgc3RyZWFtIG9mIHJlY29yZHMsIHdoaWNoIHdlIHBhcnNlIHVzaW5nIGEgc2ltcGxlIG9uZS0KLSAgIHRva2VuICh3aGljaCBpcyBvbmUgYnl0ZSBpbiB0aGlzIGxleGljb24pIGxvb2thaGVhZCByZWN1cnNpdmUgZGVjZW50Ci0gICBwYXJzZXIuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiaWVlZS5oIgotI2luY2x1ZGUgImxpYmllZWUuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfYnl0ZSBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlXzJieXRlcyBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2ludCBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9pZCBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2V4cHJlc3Npb24KLSAgUEFSQU1TICgoYmZkICosIGJmZF92bWEsIGFzeW1ib2wgKiwgYm9vbGVhbiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBpZWVlX3dyaXRlX2ludDUgUEFSQU1TICgoYmZkX2J5dGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9pbnQ1X291dCBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9zZWN0aW9uX3BhcnQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGRvX3dpdGhfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkb19hc19yZXBlYXQgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGRvX3dpdGhvdXRfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2V4dGVybmFsX3BhcnQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfZGF0YV9wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2RlYnVnX3BhcnQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfbWVfcGFydCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9wcm9jZXNzb3IgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4gaWVlZV9zbHVycF9kZWJ1ZyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgUEFSQU1TICgoYmZkICopKTsKLQotLyogRnVuY3Rpb25zIGZvciB3cml0aW5nIHRvIGllZWUgZmlsZXMgaW4gdGhlIHN0cmFuZ2Ugd2F5IHRoYXQgdGhlCi0gICBzdGFuZGFyZCByZXF1aXJlcy4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgYmFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgYmFyZzsKLXsKLSAgYmZkX2J5dGUgYnl0ZTsKLQotICBieXRlID0gYmFyZzsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmJ5dGUsIDEsIDEsIGFiZmQpICE9IDEpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBieXRlcykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgYnl0ZXM7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlclsyXTsKLQotICBidWZmZXJbMF0gPSBieXRlcyA+PiA4OwotICBidWZmZXJbMV0gPSBieXRlcyAmIDB4ZmY7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmZlciwgMSwgMiwgYWJmZCkgIT0gMikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9pbnQgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGlmICh2YWx1ZSA8PSAxMjcpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGxlbmd0aDsKLQotICAgICAgLyogSG93IG1hbnkgc2lnbmlmaWNhbnQgYnl0ZXMgPyAqLwotICAgICAgLyogRklYTUUgRk9SIExPTkdFUiBJTlRTICovCi0gICAgICBpZiAodmFsdWUgJiAweGZmMDAwMDAwKQotCWxlbmd0aCA9IDQ7Ci0gICAgICBlbHNlIGlmICh2YWx1ZSAmIDB4MDBmZjAwMDApCi0JbGVuZ3RoID0gMzsKLSAgICAgIGVsc2UgaWYgKHZhbHVlICYgMHgwMDAwZmYwMCkKLQlsZW5ndGggPSAyOwotICAgICAgZWxzZQotCWxlbmd0aCA9IDE7Ci0KLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCSAgICAgKGJmZF9ieXRlKSAoKGludCkgaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW0KLQkJCQkJICsgbGVuZ3RoKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3dpdGNoIChsZW5ndGgpCi0JewotCWNhc2UgNDoKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAodmFsdWUgPj4gMjQpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIDM6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgKHZhbHVlID4+IDE2KSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAyOgotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpICh2YWx1ZSA+PiA4KSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAxOgotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpICh2YWx1ZSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaWQgKGFiZmQsIGlkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKmlkOwotewotICBzaXplX3QgbGVuZ3RoID0gc3RybGVuIChpZCk7Ci0KLSAgaWYgKGxlbmd0aCA8PSAxMjcpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpIGxlbmd0aCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAobGVuZ3RoIDwgMjU1KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzFfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpIGxlbmd0aCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAobGVuZ3RoIDwgNjU1MzUpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMl9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgKGludCkgbGVuZ3RoKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBzdHJpbmcgdG9vIGxvbmcgKCVkIGNoYXJzLCBtYXggNjU1MzUpIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsZW5ndGgpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgaWQsIDEsIGxlbmd0aCwgYWJmZCkgIT0gbGVuZ3RoKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1GdW5jdGlvbnMgZm9yIHJlYWRpbmcgZnJvbSBpZWVlIGZpbGVzIGluIHRoZSBzdHJhbmdlIHdheSB0aGF0IHRoZQotc3RhbmRhcmQgcmVxdWlyZXM6Ci0qLwotCi0jZGVmaW5lIHRoaXNfYnl0ZShpZWVlKSAqKChpZWVlKS0+aW5wdXRfcCkKLSNkZWZpbmUgbmV4dF9ieXRlKGllZWUpICgoaWVlZSktPmlucHV0X3ArKykKLSNkZWZpbmUgdGhpc19ieXRlX2FuZF9uZXh0KGllZWUpICgqKChpZWVlKS0+aW5wdXRfcCsrKSkKLQotc3RhdGljIHVuc2lnbmVkIHNob3J0Ci1yZWFkXzJieXRlcyAoaWVlZSkKLSAgICAgY29tbW9uX2hlYWRlcl90eXBlICppZWVlOwotewotICB1bnNpZ25lZCBjaGFyIGMxID0gdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKLSAgdW5zaWduZWQgY2hhciBjMiA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gIHJldHVybiAoYzEgPDwgOCkgfCBjMjsKLX0KLQotc3RhdGljIHZvaWQKLWJmZF9nZXRfc3RyaW5nIChpZWVlLCBzdHJpbmcsIGxlbmd0aCkKLSAgICAgY29tbW9uX2hlYWRlcl90eXBlICppZWVlOwotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIHNpemVfdCBsZW5ndGg7Ci17Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgc3RyaW5nW2ldID0gdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXJlYWRfaWQgKGllZWUpCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLXsKLSAgc2l6ZV90IGxlbmd0aDsKLSAgY2hhciAqc3RyaW5nOwotICBsZW5ndGggPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICBpZiAobGVuZ3RoIDw9IDB4N2YpCi0gICAgewotICAgICAgLyogU2ltcGxlIHN0cmluZyBvZiBsZW5ndGggMCB0byAxMjcgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKGxlbmd0aCA9PSAweGRlKQotICAgIHsKLSAgICAgIC8qIExlbmd0aCBpcyBuZXh0IGJ5dGUsIGFsbG93aW5nIDAuLjI1NSAqLwotICAgICAgbGVuZ3RoID0gdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbmd0aCA9PSAweGRmKQotICAgIHsKLSAgICAgIC8qIExlbmd0aCBpcyBuZXh0IHR3byBieXRlcywgYWxsb3dpbmcgMC4uNjU1MzUgKi8KLSAgICAgIGxlbmd0aCA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gICAgICBsZW5ndGggPSAobGVuZ3RoICogMjU2KSArIHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gICAgfQotICAvKiBCdXkgbWVtb3J5IGFuZCByZWFkIHN0cmluZyAqLwotICBzdHJpbmcgPSBiZmRfYWxsb2MgKGllZWUtPmFiZmQsIGxlbmd0aCArIDEpOwotICBpZiAoIXN0cmluZykKLSAgICByZXR1cm4gTlVMTDsKLSAgYmZkX2dldF9zdHJpbmcgKGllZWUsIHN0cmluZywgbGVuZ3RoKTsKLSAgc3RyaW5nW2xlbmd0aF0gPSAwOwotICByZXR1cm4gc3RyaW5nOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9leHByZXNzaW9uIChhYmZkLCB2YWx1ZSwgc3ltYm9sLCBwY3JlbCwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBib29sZWFuIHBjcmVsOwotICAgICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci17Ci0gIHVuc2lnbmVkIGludCB0ZXJtX2NvdW50ID0gMDsKLQotICBpZiAodmFsdWUgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHRlcm1fY291bnQrKzsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIERlZiBvZiBhIGNvbW1vbiBzeW1ib2wgKi8KLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9YX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBzeW1ib2wtPnZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0ZXJtX2NvdW50Kys7Ci0gICAgfQotICBlbHNlIGlmICghIGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBSZWYgdG8gZGVmaW5lZCBzeW1ib2wgLSAqLwotCi0gICAgICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9HTE9CQUwpCi0JewotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX0lfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBzeW1ib2wtPnZhbHVlKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgdGVybV9jb3VudCsrOwotCX0KLSAgICAgIGVsc2UgaWYgKHN5bWJvbC0+ZmxhZ3MgJiAoQlNGX0xPQ0FMIHwgQlNGX1NFQ1RJT05fU1lNKSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZCBsb2NhbCBzeW1ib2wuICBXZSBjYW4KLQkgICAgIGVhc2lseSBkbyBhIGxvY2FsIGFzIGEgc2VjdGlvbitvZmZzZXQuICAqLwotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1JfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkgICAgKGJmZF9ieXRlKSAoc3ltYm9sLT5zZWN0aW9uLT5pbmRleAotCQkJCQkJKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgdGVybV9jb3VudCsrOwotCSAgaWYgKHN5bWJvbC0+dmFsdWUgIT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCBzeW1ib2wtPnZhbHVlKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHRlcm1fY291bnQrKzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiB1bnJlY29nbml6ZWQgc3ltYm9sIGAlcycgZmxhZ3MgMHgleCIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksCi0JICAgICBzeW1ib2wtPmZsYWdzKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAocGNyZWwpCi0gICAgewotICAgICAgLyogc3VidHJhY3QgdGhlIHBjIGZyb20gaGVyZSBieSBhc2tpbmcgZm9yIFBDIG9mIHRoaXMgc2VjdGlvbiovCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfUF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJKGJmZF9ieXRlKSAoaW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZnVuY3Rpb25fbWludXNfZW51bSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIGRlZ2VuZXJhdGUgY2FzZSBvZiBhIDAgYWRkcmVzcy4gICovCi0gIGlmICh0ZXJtX2NvdW50ID09IDApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIDApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgd2hpbGUgKHRlcm1fY291bnQgPiAxKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9mdW5jdGlvbl9wbHVzX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHRlcm1fY291bnQtLTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi13cml0ZXMgYW55IGludGVnZXIgaW50byB0aGUgYnVmZmVyIHN1cHBsaWVkIGFuZCBhbHdheXMgdGFrZXMgNSBieXRlcwotKi8KLXN0YXRpYyB2b2lkCi1pZWVlX3dyaXRlX2ludDUgKGJ1ZmZlciwgdmFsdWUpCi0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGJ1ZmZlclswXSA9IChiZmRfYnl0ZSkgaWVlZV9udW1iZXJfcmVwZWF0XzRfZW51bTsKLSAgYnVmZmVyWzFdID0gKHZhbHVlID4+IDI0KSAmIDB4ZmY7Ci0gIGJ1ZmZlclsyXSA9ICh2YWx1ZSA+PiAxNikgJiAweGZmOwotICBidWZmZXJbM10gPSAodmFsdWUgPj4gOCkgJiAweGZmOwotICBidWZmZXJbNF0gPSAodmFsdWUgPj4gMCkgJiAweGZmOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9pbnQ1X291dCAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgYmZkX2J5dGUgYls1XTsKLQotICBpZWVlX3dyaXRlX2ludDUgKGIsIHZhbHVlKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgYiwgMSwgNSwgYWJmZCkgIT0gNSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfaW50IChpZWVlLCB2YWx1ZV9wdHIpCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLSAgICAgYmZkX3ZtYSAqdmFsdWVfcHRyOwotewotICBpbnQgdmFsdWUgPSB0aGlzX2J5dGUgKGllZWUpOwotICBpbnQgcmVzdWx0OwotICBpZiAodmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxMjcpCi0gICAgewotICAgICAgKnZhbHVlX3B0ciA9IHZhbHVlOwotICAgICAgbmV4dF9ieXRlIChpZWVlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZSBpZiAodmFsdWUgPj0gMHg4MCAmJiB2YWx1ZSA8PSAweDg4KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjb3VudCA9IHZhbHVlICYgMHhmOwotICAgICAgcmVzdWx0ID0gMDsKLSAgICAgIG5leHRfYnl0ZSAoaWVlZSk7Ci0gICAgICB3aGlsZSAoY291bnQpCi0JewotCSAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSB8IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0JICBjb3VudC0tOwotCX0KLSAgICAgICp2YWx1ZV9wdHIgPSByZXN1bHQ7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludAotcGFyc2VfaSAoaWVlZSwgb2spCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLSAgICAgYm9vbGVhbiAqb2s7Ci17Ci0gIGJmZF92bWEgeDsKLSAgKm9rID0gcGFyc2VfaW50IChpZWVlLCAmeCk7Ci0gIHJldHVybiB4OwotfQotCi1zdGF0aWMgYmZkX3ZtYQotbXVzdF9wYXJzZV9pbnQgKGllZWUpCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLXsKLSAgYmZkX3ZtYSByZXN1bHQ7Ci0gIEJGRF9BU1NFUlQgKHBhcnNlX2ludCAoaWVlZSwgJnJlc3VsdCkgPT0gdHJ1ZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5bWJvbDsKLX0gaWVlZV92YWx1ZV90eXBlOwotCi0KLSNpZiBLRUVQTUlOVVNQQ0lOSU5TVAotCi0jZGVmaW5lIFNSQ19NQVNLKGFyZykgYXJnCi0jZGVmaW5lIFBDUkVMX09GRlNFVCBmYWxzZQotCi0jZWxzZQotCi0jZGVmaW5lIFNSQ19NQVNLKGFyZykgMAotI2RlZmluZSBQQ1JFTF9PRkZTRVQgdHJ1ZQotCi0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWJzMzJfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMiwKLQkgMzIsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgMCwKLQkgImFiczMyIiwKLQkgdHJ1ZSwKLQkgMHhmZmZmZmZmZiwKLQkgMHhmZmZmZmZmZiwKLQkgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBhYnMxNl9ob3d0byA9Ci0gIEhPV1RPICgxLAotCSAwLAotCSAxLAotCSAxNiwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSAwLAotCSAiYWJzMTYiLAotCSB0cnVlLAotCSAweDAwMDBmZmZmLAotCSAweDAwMDBmZmZmLAotCSBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFiczhfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSAwLAotCSAiYWJzOCIsCi0JIHRydWUsCi0JIDB4MDAwMDAwZmYsCi0JIDB4MDAwMDAwZmYsCi0JIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcmVsMzJfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMiwKLQkgMzIsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgMCwKLQkgInJlbDMyIiwKLQkgdHJ1ZSwKLQkgU1JDX01BU0sgKDB4ZmZmZmZmZmYpLAotCSAweGZmZmZmZmZmLAotCSBQQ1JFTF9PRkZTRVQpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByZWwxNl9ob3d0byA9Ci0gIEhPV1RPICgxLAotCSAwLAotCSAxLAotCSAxNiwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCSAwLAotCSAicmVsMTYiLAotCSB0cnVlLAotCSBTUkNfTUFTSyAoMHgwMDAwZmZmZiksCi0JIDB4MDAwMGZmZmYsCi0JIFBDUkVMX09GRlNFVCk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJlbDhfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCSAwLAotCSAicmVsOCIsCi0JIHRydWUsCi0JIFNSQ19NQVNLICgweDAwMDAwMGZmKSwKLQkgMHgwMDAwMDBmZiwKLQkgUENSRUxfT0ZGU0VUKTsKLQotc3RhdGljIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgTk9TWU1CT0wgPSB7MCwgMH07Ci0KLXN0YXRpYyB2b2lkCi1wYXJzZV9leHByZXNzaW9uIChpZWVlLCB2YWx1ZSwgc3ltYm9sLCBwY3JlbCwgZXh0cmEsIHNlY3Rpb24pCi0gICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotICAgICBiZmRfdm1hICp2YWx1ZTsKLSAgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSAqc3ltYm9sOwotICAgICBib29sZWFuICpwY3JlbDsKLSAgICAgdW5zaWduZWQgaW50ICpleHRyYTsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uOwotCi17Ci0jZGVmaW5lIFBPUyBzcFsxXQotI2RlZmluZSBUT1Mgc3BbMF0KLSNkZWZpbmUgTk9TIHNwWy0xXQotI2RlZmluZSBJTkMgc3ArKzsKLSNkZWZpbmUgREVDIHNwLS07Ci0KLSAgYm9vbGVhbiBsb29wID0gdHJ1ZTsKLSAgaWVlZV92YWx1ZV90eXBlIHN0YWNrWzEwXTsKLQotICAvKiBUaGUgc3RhY2sgcG9pbnRlciBhbHdheXMgcG9pbnRzIHRvIHRoZSBuZXh0IHVudXNlZCBsb2NhdGlvbiAqLwotI2RlZmluZSBQVVNIKHgseSx6KSBUT1Muc3ltYm9sPXg7VE9TLnNlY3Rpb249eTtUT1MudmFsdWU9ejtJTkM7Ci0jZGVmaW5lIFBPUCh4LHkseikgREVDO3g9VE9TLnN5bWJvbDt5PVRPUy5zZWN0aW9uO3o9VE9TLnZhbHVlOwotICBpZWVlX3ZhbHVlX3R5cGUgKnNwID0gc3RhY2s7Ci0KLSAgd2hpbGUgKGxvb3ApCi0gICAgewotICAgICAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotCXsKLQljYXNlIGllZWVfdmFyaWFibGVfUF9lbnVtOgotCSAgLyogUCB2YXJpYWJsZSwgY3VycmVudCBwcm9ncmFtIGNvdW50ZXIgZm9yIHNlY3Rpb24gbiAqLwotCSAgewotCSAgICBpbnQgc2VjdGlvbl9uOwotCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICAqcGNyZWwgPSB0cnVlOwotCSAgICBzZWN0aW9uX24gPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIFBVU0ggKE5PU1lNQk9MLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCAwKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX0xfZW51bToKLQkgIC8qIEwgdmFyaWFibGUgIGFkZHJlc3Mgb2Ygc2VjdGlvbiBOICovCi0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgUFVTSCAoTk9TWU1CT0wsIGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXSwgMCk7Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFyaWFibGVfUl9lbnVtOgotCSAgLyogUiB2YXJpYWJsZSwgbG9naWNhbCBhZGRyZXNzIG9mIHNlY3Rpb24gbW9kdWxlICovCi0JICAvKiBGSVhNRSwgdGhpcyBzaG91bGQgYmUgZGlmZmVyZW50IHRvIEwgKi8KLQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICBQVVNIIChOT1NZTUJPTCwgaWVlZS0+c2VjdGlvbl90YWJsZVttdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSldLCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgaWVlZV92YXJpYWJsZV9TX2VudW06Ci0JICAvKiBTIHZhcmlhYmxlLCBzaXplIGluIE1BVVMgb2Ygc2VjdGlvbiBtb2R1bGUgKi8KLQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICBQVVNIIChOT1NZTUJPTCwKLQkJMCwKLQkJaWVlZS0+c2VjdGlvbl90YWJsZVttdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSldLT5fcmF3X3NpemUpOwotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX0lfZW51bToKLQkgIC8qIFB1c2ggdGhlIGFkZHJlc3Mgb2YgdmFyaWFibGUgbiAqLwotCSAgewotCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5OwotCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICBzeS5pbmRleCA9IChpbnQpIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkgICAgc3kubGV0dGVyID0gJ0knOwotCi0JICAgIFBVU0ggKHN5LCBiZmRfYWJzX3NlY3Rpb25fcHRyLCAwKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgaWVlZV92YXJpYWJsZV9YX2VudW06Ci0JICAvKiBQdXNoIHRoZSBhZGRyZXNzIG9mIGV4dGVybmFsIHZhcmlhYmxlIG4gKi8KLQkgIHsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgc3kuaW5kZXggPSAoaW50KSAobXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpKTsKLQkgICAgc3kubGV0dGVyID0gJ1gnOwotCi0JICAgIFBVU0ggKHN5LCBiZmRfdW5kX3NlY3Rpb25fcHRyLCAwKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgaWVlZV9mdW5jdGlvbl9taW51c19lbnVtOgotCSAgewotCSAgICBiZmRfdm1hIHZhbHVlMSwgdmFsdWUyOwotCSAgICBhc2VjdGlvbiAqc2VjdGlvbjEsICpzZWN0aW9uX2R1bW15OwotCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5OwotCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0JICAgIFBPUCAoc3ksIHNlY3Rpb24xLCB2YWx1ZTEpOwotCSAgICBQT1AgKHN5LCBzZWN0aW9uX2R1bW15LCB2YWx1ZTIpOwotCSAgICBQVVNIIChzeSwgc2VjdGlvbjEgPyBzZWN0aW9uMSA6IHNlY3Rpb25fZHVtbXksIHZhbHVlMiAtIHZhbHVlMSk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfZnVuY3Rpb25fcGx1c19lbnVtOgotCSAgewotCSAgICBiZmRfdm1hIHZhbHVlMSwgdmFsdWUyOwotCSAgICBhc2VjdGlvbiAqc2VjdGlvbjE7Ci0JICAgIGFzZWN0aW9uICpzZWN0aW9uMjsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTE7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3kyOwotCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0JICAgIFBPUCAoc3kxLCBzZWN0aW9uMSwgdmFsdWUxKTsKLQkgICAgUE9QIChzeTIsIHNlY3Rpb24yLCB2YWx1ZTIpOwotCSAgICBQVVNIIChzeTEubGV0dGVyID8gc3kxIDogc3kyLAotCQkgIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbjEpID8gc2VjdGlvbjIgOiBzZWN0aW9uMSwKLQkJICB2YWx1ZTEgKyB2YWx1ZTIpOwotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHsKLQkgICAgYmZkX3ZtYSB2YTsKLQkgICAgQkZEX0FTU0VSVCAodGhpc19ieXRlICgmKGllZWUtPmgpKSA8IChpbnQpIGllZWVfdmFyaWFibGVfQV9lbnVtCi0JCSAgICB8fCB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpID4gKGludCkgaWVlZV92YXJpYWJsZV9aX2VudW0pOwotCSAgICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmEpKQotCSAgICAgIHsKLQkJUFVTSCAoTk9TWU1CT0wsIGJmZF9hYnNfc2VjdGlvbl9wdHIsIHZhKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCS8qCi0JCSAgVGhhdHMgYWxsIHRoYXQgd2UgY2FuIHVuZGVyc3RhbmQuIEFzIGZhciBhcyBJIGNhbiBzZWUKLQkJICB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgTWljcm90ZWMgSUVFRSBvdXRwdXQgd2hpY2ggSSdtCi0JCSAgdXNpbmcgdG8gc2Nhbiwgd2hlcmVieSB0aGUgY29tbWEgb3BlcmF0b3IgaXMgb21pdHRlZAotCQkgIHNvbWV0aW1lcyBpbiBhbiBleHByZXNzaW9uLCBnaXZpbmcgZXhwcmVzc2lvbnMgd2l0aCB0b28KLQkJICBtYW55IHRlcm1zLiBXZSBjYW4gdGVsbCBpZiB0aGF0J3MgdGhlIGNhc2UgYnkgZW5zdXJpbmcKLQkJICB0aGF0IHNwID09IHN0YWNrIGhlcmUuIElmIG5vdCwgdGhlbiB3ZSd2ZSBwdXNoZWQKLQkJICBzb21ldGhpbmcgdG9vIGZhciwgc28gd2Uga2VlcCBhZGRpbmcuICAqLwotCi0JCXdoaWxlIChzcCAhPSBzdGFjayArIDEpCi0JCSAgewotCQkgICAgYXNlY3Rpb24gKnNlY3Rpb24xOwotCQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTE7Ci0JCSAgICBQT1AgKHN5MSwgc2VjdGlvbjEsICpleHRyYSk7Ci0JCSAgfQotCQl7Ci0JCSAgYXNlY3Rpb24gKmR1bW15OwotCi0JCSAgUE9QICgqc3ltYm9sLCBkdW1teSwgKnZhbHVlKTsKLQkJICBpZiAoc2VjdGlvbikKLQkJICAgICpzZWN0aW9uID0gZHVtbXk7Ci0JCX0KLQotCQlsb29wID0gZmFsc2U7Ci0JICAgICAgfQotCSAgfQotCX0KLSAgICB9Ci19Ci0KLQotI2RlZmluZSBpZWVlX3NlZWsoYWJmZCwgb2Zmc2V0KSBcCi0gIElFRUVfREFUQShhYmZkKS0+aC5pbnB1dF9wID0gSUVFRV9EQVRBKGFiZmQpLT5oLmZpcnN0X2J5dGUgKyBvZmZzZXQKLQotI2RlZmluZSBpZWVlX3BvcyhhYmZkKSBcCi0gIChJRUVFX0RBVEEoYWJmZCktPmguaW5wdXRfcCAtIElFRUVfREFUQShhYmZkKS0+aC5maXJzdF9ieXRlKQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGxhc3RfaW5kZXg7Ci1zdGF0aWMgY2hhciBsYXN0X3R5cGU7CQkvKiBpcyB0aGUgaW5kZXggZm9yIGFuIFggb3IgYSBEICovCi0KLXN0YXRpYyBpZWVlX3N5bWJvbF90eXBlICoKLWdldF9zeW1ib2wgKGFiZmQsCi0JICAgIGllZWUsCi0JICAgIGxhc3Rfc3ltYm9sLAotCSAgICBzeW1ib2xfY291bnQsCi0JICAgIHBwdHIsCi0JICAgIG1heF9pbmRleCwKLQkgICAgdGhpc190eXBlCi0pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKLSAgICAgaWVlZV9zeW1ib2xfdHlwZSAqbGFzdF9zeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCAqc3ltYm9sX2NvdW50OwotICAgICBpZWVlX3N5bWJvbF90eXBlICoqKnBwdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbWF4X2luZGV4OwotICAgICBjaGFyIHRoaXNfdHlwZQotICAgICAgOwotewotICAvKiBOZWVkIGEgbmV3IHN5bWJvbCAqLwotICB1bnNpZ25lZCBpbnQgbmV3X2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotICBpZiAobmV3X2luZGV4ICE9IGxhc3RfaW5kZXggfHwgdGhpc190eXBlICE9IGxhc3RfdHlwZSkKLSAgICB7Ci0gICAgICBpZWVlX3N5bWJvbF90eXBlICpuZXdfc3ltYm9sID0gKGllZWVfc3ltYm9sX3R5cGUgKikgYmZkX2FsbG9jIChpZWVlLT5oLmFiZmQsCi0JCQkJCQkgc2l6ZW9mIChpZWVlX3N5bWJvbF90eXBlKSk7Ci0gICAgICBpZiAoIW5ld19zeW1ib2wpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIG5ld19zeW1ib2wtPmluZGV4ID0gbmV3X2luZGV4OwotICAgICAgbGFzdF9pbmRleCA9IG5ld19pbmRleDsKLSAgICAgICgqc3ltYm9sX2NvdW50KSsrOwotICAgICAgKipwcHRyID0gbmV3X3N5bWJvbDsKLSAgICAgICpwcHRyID0gJm5ld19zeW1ib2wtPm5leHQ7Ci0gICAgICBpZiAobmV3X2luZGV4ID4gKm1heF9pbmRleCkKLQl7Ci0JICAqbWF4X2luZGV4ID0gbmV3X2luZGV4OwotCX0KLSAgICAgIGxhc3RfdHlwZSA9IHRoaXNfdHlwZTsKLSAgICAgIG5ld19zeW1ib2wtPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIHJldHVybiBuZXdfc3ltYm9sOwotICAgIH0KLSAgcmV0dXJuIGxhc3Rfc3ltYm9sOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgZmlsZV9wdHIgb2Zmc2V0ID0gaWVlZS0+dy5yLmV4dGVybmFsX3BhcnQ7Ci0KLSAgaWVlZV9zeW1ib2xfdHlwZSAqKnByZXZfc3ltYm9sc19wdHIgPSAmaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sczsKLSAgaWVlZV9zeW1ib2xfdHlwZSAqKnByZXZfcmVmZXJlbmNlX3B0ciA9ICZpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2U7Ci0gIGllZWVfc3ltYm9sX3R5cGUgKnN5bWJvbCA9IChpZWVlX3N5bWJvbF90eXBlICopIE5VTEw7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQgPSAwOwotICBib29sZWFuIGxvb3AgPSB0cnVlOwotICBsYXN0X2luZGV4ID0gMHhmZmZmZmY7Ci0gIGllZWUtPnN5bWJvbF90YWJsZV9mdWxsID0gdHJ1ZTsKLQotICBpZWVlX3NlZWsgKGFiZmQsIG9mZnNldCk7Ci0KLSAgd2hpbGUgKGxvb3ApCi0gICAgewotICAgICAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotCXsKLQljYXNlIGllZWVfbm5fcmVjb3JkOgotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgc3ltYm9sID0gZ2V0X3N5bWJvbCAoYWJmZCwgaWVlZSwgc3ltYm9sLCAmc3ltYm9sX2NvdW50LAotCQkJICAgICAgICZwcmV2X3N5bWJvbHNfcHRyLAotCQkJICAgICAgICZpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4LCAnSScpOwotCSAgaWYgKHN5bWJvbCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIHN5bWJvbC0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCSAgc3ltYm9sLT5zeW1ib2wubmFtZSA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotCSAgc3ltYm9sLT5zeW1ib2wudWRhdGEucCA9IChQVFIpIE5VTEw7Ci0JICBzeW1ib2wtPnN5bWJvbC5mbGFncyA9IEJTRl9OT19GTEFHUzsKLQkgIGJyZWFrOwotCWNhc2UgaWVlZV9leHRlcm5hbF9zeW1ib2xfZW51bToKLQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0KLQkgIHN5bWJvbCA9IGdldF9zeW1ib2wgKGFiZmQsIGllZWUsIHN5bWJvbCwgJnN5bWJvbF9jb3VudCwKLQkJCSAgICAgICAmcHJldl9zeW1ib2xzX3B0ciwKLQkJCSAgICAgICAmaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleCwgJ0QnKTsKLQkgIGlmIChzeW1ib2wgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBCRkRfQVNTRVJUIChzeW1ib2wtPmluZGV4ID49IGllZWUtPmV4dGVybmFsX3N5bWJvbF9taW5faW5kZXgpOwotCi0JICBzeW1ib2wtPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQkgIHN5bWJvbC0+c3ltYm9sLm5hbWUgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKLQkgIHN5bWJvbC0+c3ltYm9sLnVkYXRhLnAgPSAoUFRSKSBOVUxMOwotCSAgc3ltYm9sLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTk9fRkxBR1M7Ci0JICBicmVhazsKLQljYXNlIGllZWVfYXR0cmlidXRlX3JlY29yZF9lbnVtID4+IDg6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBzeW1ib2xfbmFtZV9pbmRleDsKLQkgICAgdW5zaWduZWQgaW50IHN5bWJvbF90eXBlX2luZGV4OwotCSAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX2F0dHJpYnV0ZV9kZWY7Ci0JICAgIGJmZF92bWEgdmFsdWU7Ci0JICAgIHN3aXRjaCAocmVhZF8yYnl0ZXMgKGllZWUpKQotCSAgICAgIHsKLQkgICAgICBjYXNlIGllZWVfYXR0cmlidXRlX3JlY29yZF9lbnVtOgotCQlzeW1ib2xfbmFtZV9pbmRleCA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJc3ltYm9sX3R5cGVfaW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCXN5bWJvbF9hdHRyaWJ1dGVfZGVmID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQlzd2l0Y2ggKHN5bWJvbF9hdHRyaWJ1dGVfZGVmKQotCQkgIHsKLQkJICBjYXNlIDg6Ci0JCSAgY2FzZSAxOToKLQkJICAgIHBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWx1ZSk7Ci0JCSAgICBicmVhazsKLQkJICBkZWZhdWx0OgotCQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAgIChfKCIlczogdW5pbXBsZW1lbnRlZCBBVEkgcmVjb3JkICAldSBmb3Igc3ltYm9sICV1IiksCi0JCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3ltYm9sX2F0dHJpYnV0ZV9kZWYsCi0JCSAgICAgICBzeW1ib2xfbmFtZV9pbmRleCk7Ci0JCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9pbmZvX3JlY29yZF9lbnVtOgotCQkvKiBTa2lwIG92ZXIgQVRYIHJlY29yZC4gKi8KLQkJcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmFsdWUpOwotCQlwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JCXBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmFsdWUpOwotCQlicmVhazsKLQkgICAgICBjYXNlIGllZWVfYXRuX3JlY29yZF9lbnVtOgotCQkvKiBXZSBtYXkgZ2V0IGNhbGwgb3B0aW1pemF0aW9uIGluZm9ybWF0aW9uIGhlcmUsCi0JCSAgIHdoaWNoIHdlIGp1c3QgaWdub3JlLiAgVGhlIGZvcm1hdCBpcwotCQkgICB7JEYxfSR7Q0V9e2luZGV4fXskMDB9eyQzRn17JDNGfXsjX29mX0FTTnN9ICovCi0JCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWx1ZSk7Ci0JCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWx1ZSk7Ci0JCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWx1ZSk7Ci0JCWlmICh2YWx1ZSAhPSAweDNmKQotCQkgIHsKLQkJICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgICAoXygiJXM6IHVuZXhwZWN0ZWQgQVROIHR5cGUgJWQgaW4gZXh0ZXJuYWwgcGFydCIpLAotCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAoaW50KSB2YWx1ZSk7Ci0JCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWx1ZSk7Ci0JCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWx1ZSk7Ci0JCXdoaWxlICh2YWx1ZSA+IDApCi0JCSAgewotCQkgICAgYmZkX3ZtYSB2YWwxOwotCi0JCSAgICAtLXZhbHVlOwotCi0JCSAgICBzd2l0Y2ggKHJlYWRfMmJ5dGVzIChpZWVlKSkKLQkJICAgICAgewotCQkgICAgICBjYXNlIGllZWVfYXNuX3JlY29yZF9lbnVtOgotCQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbDEpOwotCQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbDEpOwotCQkJYnJlYWs7Ci0KLQkJICAgICAgZGVmYXVsdDoKLQkJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJICAoXygiJXM6IHVuZXhwZWN0ZWQgdHlwZSBhZnRlciBBVE4iKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX3ZhbHVlX3JlY29yZF9lbnVtID4+IDg6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBzeW1ib2xfbmFtZV9pbmRleDsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeW1ib2xfaWdub3JlOwotCSAgICBib29sZWFuIHBjcmVsX2lnbm9yZTsKLQkgICAgdW5zaWduZWQgaW50IGV4dHJhOwotCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0JICAgIHN5bWJvbF9uYW1lX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICBwYXJzZV9leHByZXNzaW9uIChpZWVlLAotCQkJICAgICAgJnN5bWJvbC0+c3ltYm9sLnZhbHVlLAotCQkJICAgICAgJnN5bWJvbF9pZ25vcmUsCi0JCQkgICAgICAmcGNyZWxfaWdub3JlLAotCQkJICAgICAgJmV4dHJhLAotCQkJICAgICAgJnN5bWJvbC0+c3ltYm9sLnNlY3Rpb24pOwotCi0JICAgIC8qIEZ1bGx5IGxpbmtlZCBJRUVFLTY5NSBmaWxlcyB0ZW5kIHRvIGdpdmUgZXZlcnkgc3ltYm9sCi0gICAgICAgICAgICAgICBhbiBhYnNvbHV0ZSB2YWx1ZS4gIFRyeSB0byBjb252ZXJ0IHRoYXQgYmFjayBpbnRvIGEKLSAgICAgICAgICAgICAgIHNlY3Rpb24gcmVsYXRpdmUgdmFsdWUuICBGSVhNRTogVGhpcyB3b24ndCBhbHdheXMgdG8KLSAgICAgICAgICAgICAgIHRoZSByaWdodCB0aGluZy4gICovCi0JICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24pCi0JCSYmIChhYmZkLT5mbGFncyAmIEhBU19SRUxPQykgPT0gMCkKLQkgICAgICB7Ci0JCWJmZF92bWEgdmFsOwotCQlhc2VjdGlvbiAqczsKLQotCQl2YWwgPSBzeW1ib2wtPnN5bWJvbC52YWx1ZTsKLQkJZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JCSAgewotCQkgICAgaWYgKHZhbCA+PSBzLT52bWEgJiYgdmFsIDwgcy0+dm1hICsgcy0+X3Jhd19zaXplKQotCQkgICAgICB7Ci0JCQlzeW1ib2wtPnN5bWJvbC5zZWN0aW9uID0gczsKLQkJCXN5bWJvbC0+c3ltYm9sLnZhbHVlIC09IHMtPnZtYTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBzeW1ib2wtPnN5bWJvbC5mbGFncyA9IEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUOwotCi0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfd2Vha19leHRlcm5hbF9yZWZlcmVuY2VfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSBzaXplOwotCSAgICBiZmRfdm1hIHZhbHVlOwotCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICAvKiBUaHJvdyBhd2F5IHRoZSBleHRlcm5hbCByZWZlcmVuY2UgaW5kZXggKi8KLQkgICAgKHZvaWQpIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkgICAgLyogRmV0Y2ggdGhlIGRlZmF1bHQgc2l6ZSBpZiBub3QgcmVzb2x2ZWQgKi8KLQkgICAgc2l6ZSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkgICAgLyogRmV0Y2ggdGhlIGRlZmF1dGx0IHZhbHVlIGlmIGF2YWlsYWJsZSAqLwotCSAgICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmFsdWUpID09IGZhbHNlKQotCSAgICAgIHsKLQkJdmFsdWUgPSAwOwotCSAgICAgIH0KLQkgICAgLyogVGhpcyB0dXJucyBpbnRvIGEgY29tbW9uICovCi0JICAgIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgICBzeW1ib2wtPnN5bWJvbC52YWx1ZSA9IHNpemU7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgaWVlZV9leHRlcm5hbF9yZWZlcmVuY2VfZW51bToKLQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0KLQkgIHN5bWJvbCA9IGdldF9zeW1ib2wgKGFiZmQsIGllZWUsIHN5bWJvbCwgJnN5bWJvbF9jb3VudCwKLQkJCSAgICAgICAmcHJldl9yZWZlcmVuY2VfcHRyLAotCQkJICAgICAgICZpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWF4X2luZGV4LCAnWCcpOwotCSAgaWYgKHN5bWJvbCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIHN5bWJvbC0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCSAgc3ltYm9sLT5zeW1ib2wubmFtZSA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotCSAgc3ltYm9sLT5zeW1ib2wudWRhdGEucCA9IChQVFIpIE5VTEw7Ci0JICBzeW1ib2wtPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIHN5bWJvbC0+c3ltYm9sLnZhbHVlID0gKGJmZF92bWEpIDA7Ci0JICBzeW1ib2wtPnN5bWJvbC5mbGFncyA9IDA7Ci0KLQkgIEJGRF9BU1NFUlQgKHN5bWJvbC0+aW5kZXggPj0gaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21pbl9pbmRleCk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBsb29wID0gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleCAhPSAwKQotICAgIHsKLSAgICAgIGllZWUtPmV4dGVybmFsX3N5bWJvbF9jb3VudCA9Ci0JaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleCAtCi0JaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21pbl9pbmRleCArIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgaWYgKGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXggIT0gMCkKLSAgICB7Ci0gICAgICBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfY291bnQgPQotCWllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXggLQotCWllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9taW5faW5kZXggKyAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9jb3VudCA9IDA7Ci0gICAgfQotCi0gIGFiZmQtPnN5bWNvdW50ID0KLSAgICBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfY291bnQgKyBpZWVlLT5leHRlcm5hbF9zeW1ib2xfY291bnQ7Ci0KLSAgaWYgKHN5bWJvbF9jb3VudCAhPSBhYmZkLT5zeW1jb3VudCkKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBhcmUgZ2FwcyBpbiB0aGUgdGFibGUgLS0gKi8KLSAgICAgIGllZWUtPnN5bWJvbF90YWJsZV9mdWxsID0gZmFsc2U7Ci0gICAgfQotCi0gICpwcmV2X3N5bWJvbHNfcHRyID0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgKnByZXZfcmVmZXJlbmNlX3B0ciA9IChpZWVlX3N5bWJvbF90eXBlICopIE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoSUVFRV9EQVRBIChhYmZkKS0+cmVhZF9zeW1ib2xzID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgSUVFRV9EQVRBIChhYmZkKS0+cmVhZF9zeW1ib2xzID0gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1sb25nCi1pZWVlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCEgaWVlZV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGFiZmQtPnN5bWNvdW50ICE9IDApID8KLSAgICAoYWJmZC0+c3ltY291bnQgKyAxKSAqIChzaXplb2YgKGllZWVfc3ltYm9sX3R5cGUgKikpIDogMDsKLX0KLQotLyoKLU1vdmUgZnJvbSBvdXIgaW50ZXJuYWwgbGlzdHMgdG8gdGhlIGNhbm9uIHRhYmxlLCBhbmQgaW5zZXJ0IGluCi1zeW1ib2wgaW5kZXggb3JkZXIKLSovCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGllZWVfdmVjOwotCi1sb25nCi1pZWVlX2dldF9zeW10YWIgKGFiZmQsIGxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLXsKLSAgaWVlZV9zeW1ib2xfdHlwZSAqc3ltcDsKLSAgc3RhdGljIGJmZCBkdW1teV9iZmQ7Ci0gIHN0YXRpYyBhc3ltYm9sIGVtcHR5X3N5bWJvbCA9Ci0gIC8qIHRoZV9iZmQsIG5hbWUsIHZhbHVlLCBhdHRyLCBzZWN0aW9uICovCi0gIHsmZHVtbXlfYmZkLCAiIGllZWUgZW1wdHkiLCAoc3ltdmFsdWUpIDAsIEJTRl9ERUJVR0dJTkcsIGJmZF9hYnNfc2VjdGlvbl9wdHIsIHsgMCB9fTsKLQotICBpZiAoYWJmZC0+c3ltY291bnQpCi0gICAgewotICAgICAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICAgICAgZHVtbXlfYmZkLnh2ZWMgPSAmaWVlZV92ZWM7Ci0gICAgICBpZiAoISBpZWVlX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0JcmV0dXJuIC0xOwotCi0gICAgICBpZiAoaWVlZS0+c3ltYm9sX3RhYmxlX2Z1bGwgPT0gZmFsc2UpCi0JewotCSAgLyogQXJyZ2ggLSB0aGVyZSBhcmUgZ2FwcyBpbiB0aGUgdGFibGUsIHJ1biB0aHJvdWdoIGFuZCBmaWxsIHRoZW0gKi8KLQkgIC8qIHVwIHdpdGggcG9pbnRlcnMgdG8gYSBudWxsIHBsYWNlICovCi0JICB1bnNpZ25lZCBpbnQgaTsKLQkgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zeW1jb3VudDsgaSsrKQotCSAgICB7Ci0JICAgICAgbG9jYXRpb25baV0gPSAmZW1wdHlfc3ltYm9sOwotCSAgICB9Ci0JfQotCi0gICAgICBpZWVlLT5leHRlcm5hbF9zeW1ib2xfYmFzZV9vZmZzZXQgPSAtaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21pbl9pbmRleDsKLSAgICAgIGZvciAoc3ltcCA9IElFRUVfREFUQSAoYWJmZCktPmV4dGVybmFsX3N5bWJvbHM7Ci0JICAgc3ltcCAhPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBOVUxMOwotCSAgIHN5bXAgPSBzeW1wLT5uZXh0KQotCXsKLQkgIC8qIFBsYWNlIGludG8gdGFibGUgYXQgY29ycmVjdCBpbmRleCBsb2NhdGlvbnMgKi8KLQkgIGxvY2F0aW9uW3N5bXAtPmluZGV4ICsgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2Jhc2Vfb2Zmc2V0XSA9ICZzeW1wLT5zeW1ib2w7Ci0JfQotCi0gICAgICAvKiBUaGUgZXh0ZXJuYWwgcmVmcyBhcmUgaW5kZXhlZCBpbiBhIGJpdCAqLwotICAgICAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2Jhc2Vfb2Zmc2V0ID0KLQktaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21pbl9pbmRleCArIGllZWUtPmV4dGVybmFsX3N5bWJvbF9jb3VudDsKLQotICAgICAgZm9yIChzeW1wID0gSUVFRV9EQVRBIChhYmZkKS0+ZXh0ZXJuYWxfcmVmZXJlbmNlOwotCSAgIHN5bXAgIT0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQkgICBzeW1wID0gc3ltcC0+bmV4dCkKLQl7Ci0JICBsb2NhdGlvbltzeW1wLT5pbmRleCArIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9iYXNlX29mZnNldF0gPQotCSAgICAmc3ltcC0+c3ltYm9sOwotCi0JfQotICAgIH0KLSAgaWYgKGFiZmQtPnN5bWNvdW50KQotICAgIHsKLSAgICAgIGxvY2F0aW9uW2FiZmQtPnN5bWNvdW50XSA9IChhc3ltYm9sICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gYWJmZC0+c3ltY291bnQ7Ci19Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1nZXRfc2VjdGlvbl9lbnRyeSAoYWJmZCwgaWVlZSwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRleDsKLXsKLSAgaWYgKGluZGV4ID49IGllZWUtPnNlY3Rpb25fdGFibGVfc2l6ZSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYywgaTsKLSAgICAgIGFzZWN0aW9uICoqbjsKLQotICAgICAgYyA9IGllZWUtPnNlY3Rpb25fdGFibGVfc2l6ZTsKLSAgICAgIGlmIChjID09IDApCi0JYyA9IDIwOwotICAgICAgd2hpbGUgKGMgPD0gaW5kZXgpCi0JYyAqPSAyOwotCi0gICAgICBuID0gKChhc2VjdGlvbiAqKikKLQkgICBiZmRfcmVhbGxvYyAoaWVlZS0+c2VjdGlvbl90YWJsZSwgYyAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgICAgIGlmIChuID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGZvciAoaSA9IGllZWUtPnNlY3Rpb25fdGFibGVfc2l6ZTsgaSA8IGM7IGkrKykKLQluW2ldID0gTlVMTDsKLQotICAgICAgaWVlZS0+c2VjdGlvbl90YWJsZSA9IG47Ci0gICAgICBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemUgPSBjOwotICAgIH0KLQotICBpZiAoaWVlZS0+c2VjdGlvbl90YWJsZVtpbmRleF0gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgY2hhciAqdG1wID0gYmZkX2FsbG9jIChhYmZkLCAxMSk7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICAgICAgaWYgKCF0bXApCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBzcHJpbnRmICh0bXAsICIgZnNlYyU0ZCIsIGluZGV4KTsKLSAgICAgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCB0bXApOwotICAgICAgaWVlZS0+c2VjdGlvbl90YWJsZVtpbmRleF0gPSBzZWN0aW9uOwotICAgICAgc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0gICAgICBzZWN0aW9uLT50YXJnZXRfaW5kZXggPSBpbmRleDsKLSAgICAgIGllZWUtPnNlY3Rpb25fdGFibGVbaW5kZXhdID0gc2VjdGlvbjsKLSAgICB9Ci0gIHJldHVybiBpZWVlLT5zZWN0aW9uX3RhYmxlW2luZGV4XTsKLX0KLQotc3RhdGljIHZvaWQKLWllZWVfc2x1cnBfc2VjdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBmaWxlX3B0ciBvZmZzZXQgPSBpZWVlLT53LnIuc2VjdGlvbl9wYXJ0OwotICBhc2VjdGlvbiAqc2VjdGlvbiA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBjaGFyICpuYW1lOwotCi0gIGlmIChvZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBzZWN0aW9uX3R5cGVbM107Ci0gICAgICBpZWVlX3NlZWsgKGFiZmQsIG9mZnNldCk7Ci0gICAgICB3aGlsZSAodHJ1ZSkKLQl7Ci0JICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JICAgIHsKLQkgICAgY2FzZSBpZWVlX3NlY3Rpb25fdHlwZV9lbnVtOgotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IHNlY3Rpb25faW5kZXg7Ci0JCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCXNlY3Rpb25faW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0KLQkJc2VjdGlvbiA9IGdldF9zZWN0aW9uX2VudHJ5IChhYmZkLCBpZWVlLCBzZWN0aW9uX2luZGV4KTsKLQotCQlzZWN0aW9uX3R5cGVbMF0gPSB0aGlzX2J5dGVfYW5kX25leHQgKCYoaWVlZS0+aCkpOwotCi0JCS8qIFNldCBtaW5pbWFsIHNlY3Rpb24gYXR0cmlidXRlcy4gQXR0cmlidXRlcyBhcmUKLQkJICAgZXh0ZW5kZWQgbGF0ZXIsIGJhc2VkIG9uIHNlY3Rpb24gY29udGVudHMuICovCi0KLQkJc3dpdGNoIChzZWN0aW9uX3R5cGVbMF0pCi0JCSAgewotCQkgIGNhc2UgMHhDMToKLQkJICAgIC8qIE5vcm1hbCBhdHRyaWJ1dGVzIGZvciBhYnNvbHV0ZSBzZWN0aW9ucwkqLwotCQkgICAgc2VjdGlvbl90eXBlWzFdID0gdGhpc19ieXRlICgmKGllZWUtPmgpKTsKLQkJICAgIHNlY3Rpb24tPmZsYWdzID0gU0VDX0FMTE9DOwotCQkgICAgc3dpdGNoIChzZWN0aW9uX3R5cGVbMV0pCi0JCSAgICAgIHsKLQkJICAgICAgY2FzZSAweEQzOgkvKiBBUyBBYnNvbHV0ZSBzZWN0aW9uIGF0dHJpYnV0ZXMgKi8KLQkJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQlzZWN0aW9uX3R5cGVbMl0gPSB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJc3dpdGNoIChzZWN0aW9uX3R5cGVbMl0pCi0JCQkgIHsKLQkJCSAgY2FzZSAweEQwOgotCQkJICAgIC8qIE5vcm1hbCBjb2RlICovCi0JCQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJCSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQ09ERTsKLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSAweEM0OgotCQkJICAgIC8qIE5vcm1hbCBkYXRhICovCi0JCQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJCSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfREFUQTsKLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSAweEQyOgotCQkJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQkgICAgLyogTm9ybWFsIHJvbSBkYXRhICovCi0JCQkgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX1JPTSB8IFNFQ19EQVRBOwotCQkJICAgIGJyZWFrOwotCQkJICBkZWZhdWx0OgotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgMHhDMzoJLyogTmFtZWQgcmVsb2NhdGFibGUgc2VjdGlvbnMgKHR5cGUgQykgKi8KLQkJICAgIHNlY3Rpb25fdHlwZVsxXSA9IHRoaXNfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCSAgICBzZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkJICAgIHN3aXRjaCAoc2VjdGlvbl90eXBlWzFdKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgMHhEMDoJLyogTm9ybWFsIGNvZGUgKENQKSAqLwotCQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJCXNlY3Rpb24tPmZsYWdzIHw9IFNFQ19DT0RFOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgMHhDNDoJLyogTm9ybWFsIGRhdGEgKENEKSAqLwotCQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJCXNlY3Rpb24tPmZsYWdzIHw9IFNFQ19EQVRBOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgMHhEMjoJLyogTm9ybWFsIHJvbSBkYXRhIChDUikgKi8KLQkJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQlzZWN0aW9uLT5mbGFncyB8PSBTRUNfUk9NIHwgU0VDX0RBVEE7Ci0JCQlicmVhazsKLQkJICAgICAgZGVmYXVsdDoKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCS8qIFJlYWQgc2VjdGlvbiBuYW1lLCB1c2UgaXQgaWYgbm9uIGVtcHR5LiAqLwotCQluYW1lID0gcmVhZF9pZCAoJmllZWUtPmgpOwotCQlpZiAobmFtZVswXSkKLQkJICBzZWN0aW9uLT5uYW1lID0gbmFtZTsKLQotCQkvKiBTa2lwIHRoZXNlIGZpZWxkcywgd2hpY2ggd2UgZG9uJ3QgY2FyZSBhYm91dCAqLwotCQl7Ci0JCSAgYmZkX3ZtYSBwYXJlbnQsIGJyb3RoZXIsIGNvbnRleHQ7Ci0JCSAgcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmcGFyZW50KTsKLQkJICBwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZicm90aGVyKTsKLQkJICBwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZjb250ZXh0KTsKLQkJfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBpZWVlX3NlY3Rpb25fYWxpZ25tZW50X2VudW06Ci0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgc2VjdGlvbl9pbmRleDsKLQkJYmZkX3ZtYSB2YWx1ZTsKLQkJYXNlY3Rpb24gKnNlY3Rpb247Ci0JCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCXNlY3Rpb25faW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJmllZWUtPmgpOwotCQlzZWN0aW9uID0gZ2V0X3NlY3Rpb25fZW50cnkgKGFiZmQsIGllZWUsIHNlY3Rpb25faW5kZXgpOwotCQlpZiAoc2VjdGlvbl9pbmRleCA+IGllZWUtPnNlY3Rpb25fY291bnQpCi0JCSAgewotCQkgICAgaWVlZS0+c2VjdGlvbl9jb3VudCA9IHNlY3Rpb25faW5kZXg7Ci0JCSAgfQotCQlzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPQotCQkgIGJmZF9sb2cyIChtdXN0X3BhcnNlX2ludCAoJmllZWUtPmgpKTsKLQkJKHZvaWQpIHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgaWVlZV9lMl9maXJzdF9ieXRlX2VudW06Ci0JICAgICAgewotCQlpZWVlX3JlY29yZF9lbnVtX3R5cGUgdCA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpIChyZWFkXzJieXRlcyAoJihpZWVlLT5oKSkpOwotCi0JCXN3aXRjaCAodCkKLQkJICB7Ci0JCSAgY2FzZSBpZWVlX3NlY3Rpb25fc2l6ZV9lbnVtOgotCQkgICAgc2VjdGlvbiA9IGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXTsKLQkJICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9waHlzaWNhbF9yZWdpb25fc2l6ZV9lbnVtOgotCQkgICAgc2VjdGlvbiA9IGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXTsKLQkJICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9yZWdpb25fYmFzZV9hZGRyZXNzX2VudW06Ci0JCSAgICBzZWN0aW9uID0gaWVlZS0+c2VjdGlvbl90YWJsZVttdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSldOwotCQkgICAgc2VjdGlvbi0+dm1hID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgc2VjdGlvbi0+bG1hID0gc2VjdGlvbi0+dm1hOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBpZWVlX21hdV9zaXplX2VudW06Ci0JCSAgICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIGllZWVfbV92YWx1ZV9lbnVtOgotCQkgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBpZWVlX3NlY3Rpb25fYmFzZV9hZGRyZXNzX2VudW06Ci0JCSAgICBzZWN0aW9uID0gaWVlZS0+c2VjdGlvbl90YWJsZVttdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSldOwotCQkgICAgc2VjdGlvbi0+dm1hID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgc2VjdGlvbi0+bG1hID0gc2VjdGlvbi0+dm1hOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBpZWVlX3NlY3Rpb25fb2Zmc2V0X2VudW06Ci0JCSAgICAodm9pZCkgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgKHZvaWQpIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICByZXR1cm47Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBNYWtlIGEgc2VjdGlvbiBmb3IgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgaWYgYW55LiAgV2UgZG9uJ3QgdHJ5Ci0gICB0byBpbnRlcnByZXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbjsgd2UganVzdCBwb2ludCB0aGUgc2VjdGlvbgotICAgYXQgdGhlIGFyZWEgaW4gdGhlIGZpbGUgc28gdGhhdCBwcm9ncmFtIHdoaWNoIHVuZGVyc3RhbmQgY2FuIGRpZyBpdAotICAgb3V0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc2x1cnBfZGVidWcgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBhc2VjdGlvbiAqc2VjOwotICBmaWxlX3B0ciBkZWJ1Z19lbmQ7Ci0KLSAgaWYgKGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kZWJ1ZyIpOwotICBpZiAoc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzZWMtPmZsYWdzIHw9IFNFQ19ERUJVR0dJTkcgfCBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWMtPmZpbGVwb3MgPSBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydDsKLQotICBkZWJ1Z19lbmQgPSBpZWVlLT53LnIuZGF0YV9wYXJ0OwotICBpZiAoZGVidWdfZW5kID09IDApCi0gICAgZGVidWdfZW5kID0gaWVlZS0+dy5yLnRyYWlsZXJfcGFydDsKLSAgaWYgKGRlYnVnX2VuZCA9PSAwKQotICAgIGRlYnVnX2VuZCA9IGllZWUtPncuci5tZV9yZWNvcmQ7Ci0gIHNlYy0+X3Jhd19zaXplID0gZGVidWdfZW5kIC0gaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIGFyY2hpdmUgc3R1ZmYKLSovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotaWVlZV9hcmNoaXZlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqbGlicmFyeTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzUxMl07Ci0gIGZpbGVfcHRyIGJ1ZmZlcl9vZmZzZXQgPSAwOwotICBpZWVlX2FyX2RhdGFfdHlwZSAqc2F2ZSA9IGFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YTsKLSAgaWVlZV9hcl9kYXRhX3R5cGUgKmllZWU7Ci0gIHVuc2lnbmVkIGludCBhbGNfZWx0czsKLSAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKmVsdHMgPSBOVUxMOwotCi0gIGFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YSA9Ci0gICAgKGllZWVfYXJfZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpZWVlX2FyX2RhdGFfdHlwZSkpOwotICBpZiAoIWFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWVlZSA9IElFRUVfQVJfREFUQSAoYWJmZCk7Ci0KLSAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvIHJlYWQKLSAgICAgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLSAgYmZkX3JlYWQgKChQVFIpIGJ1ZmZlciwgMSwgc2l6ZW9mIChidWZmZXIpLCBhYmZkKTsKLQotICBpZWVlLT5oLmZpcnN0X2J5dGUgPSBidWZmZXI7Ci0gIGllZWUtPmguaW5wdXRfcCA9IGJ1ZmZlcjsKLQotICBpZWVlLT5oLmFiZmQgPSBhYmZkOwotCi0gIGlmICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpICE9IE1vZHVsZV9CZWdpbm5pbmcpCi0gICAgewotICAgICAgYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhID0gc2F2ZTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotICBsaWJyYXJ5ID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0gIGlmIChzdHJjbXAgKGxpYnJhcnksICJMSUJSQVJZIikgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaWVlZSk7Ci0gICAgICBhYmZkLT50ZGF0YS5pZWVlX2FyX2RhdGEgPSBzYXZlOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotICAvKiBUaHJvdyBhd2F5IHRoZSBmaWxlbmFtZSAqLwotICByZWFkX2lkICgmKGllZWUtPmgpKTsKLQotICBpZWVlLT5lbGVtZW50X2NvdW50ID0gMDsKLSAgaWVlZS0+ZWxlbWVudF9pbmRleCA9IDA7Ci0KLSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsJLyogRHJvcCB0aGUgYWQgcGFydCAqLwotICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CS8qIEFuZCB0aGUgdHdvIGR1bW15IG51bWJlcnMgKi8KLSAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCi0gIGFsY19lbHRzID0gMTA7Ci0gIGVsdHMgPSAoaWVlZV9hcl9vYnN0YWNrX3R5cGUgKikgYmZkX21hbGxvYyAoYWxjX2VsdHMgKiBzaXplb2YgKmVsdHMpOwotICBpZiAoZWx0cyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFJlYWQgdGhlIGluZGV4IG9mIHRoZSBCQiB0YWJsZSAqLwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgcmVjOwotICAgICAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKnQ7Ci0KLSAgICAgIHJlYyA9IHJlYWRfMmJ5dGVzICgmKGllZWUtPmgpKTsKLSAgICAgIGlmIChyZWMgIT0gKGludCkgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSkKLQlicmVhazsKLQotICAgICAgaWYgKGllZWUtPmVsZW1lbnRfY291bnQgPj0gYWxjX2VsdHMpCi0JewotCSAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKm47Ci0KLQkgIGFsY19lbHRzICo9IDI7Ci0JICBuID0gKChpZWVlX2FyX29ic3RhY2tfdHlwZSAqKQotCSAgICAgICBiZmRfcmVhbGxvYyAoZWx0cywgYWxjX2VsdHMgKiBzaXplb2YgKmVsdHMpKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgZWx0cyA9IG47Ci0JfQotCi0gICAgICB0ID0gJmVsdHNbaWVlZS0+ZWxlbWVudF9jb3VudF07Ci0gICAgICBpZWVlLT5lbGVtZW50X2NvdW50Kys7Ci0KLSAgICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLSAgICAgIHQtPmZpbGVfb2Zmc2V0ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotICAgICAgdC0+YWJmZCA9IChiZmQgKikgTlVMTDsKLQotICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgZ28gb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KLQotICAgICAgaWYgKChzaXplX3QpIGllZWVfcG9zIChhYmZkKSA+IHNpemVvZiAoYnVmZmVyKSAvIDIpCi0JewotCSAgLyogUGFzdCBoYWxmIHdheSwgcmVzZWVrIGFuZCByZXByaW1lICovCi0JICBidWZmZXJfb2Zmc2V0ICs9IGllZWVfcG9zIChhYmZkKTsKLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgYnVmZmVyX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzCi0JICAgICB0byByZWFkIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0JICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOwotCSAgaWVlZS0+aC5maXJzdF9ieXRlID0gYnVmZmVyOwotCSAgaWVlZS0+aC5pbnB1dF9wID0gYnVmZmVyOwotCX0KLSAgICB9Ci0KLSAgaWVlZS0+ZWxlbWVudHMgPSAoKGllZWVfYXJfb2JzdGFja190eXBlICopCi0JCSAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgICAgICAgaWVlZS0+ZWxlbWVudF9jb3VudCAqIHNpemVvZiAqaWVlZS0+ZWxlbWVudHMpKTsKLSAgaWYgKGllZWUtPmVsZW1lbnRzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG1lbWNweSAoaWVlZS0+ZWxlbWVudHMsIGVsdHMsCi0JICBpZWVlLT5lbGVtZW50X2NvdW50ICogc2l6ZW9mICppZWVlLT5lbGVtZW50cyk7Ci0gIGZyZWUgKGVsdHMpOwotICBlbHRzID0gTlVMTDsKLQotICAvKiBOb3cgc2NhbiB0aGUgYXJlYSBhZ2FpbiwgYW5kIHJlcGxhY2UgQkIgb2Zmc2V0cyB3aXRoIGZpbGUgKi8KLSAgLyogb2Zmc2V0cyAqLwotCi0gIGZvciAoaSA9IDI7IGkgPCBpZWVlLT5lbGVtZW50X2NvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpZWVlLT5lbGVtZW50c1tpXS5maWxlX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8KLQkgcmVhZCB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICAgICAgYmZkX3JlYWQgKChQVFIpIGJ1ZmZlciwgMSwgc2l6ZW9mIChidWZmZXIpLCBhYmZkKTsKLSAgICAgIGllZWUtPmguZmlyc3RfYnl0ZSA9IGJ1ZmZlcjsKLSAgICAgIGllZWUtPmguaW5wdXRfcCA9IGJ1ZmZlcjsKLQotICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsJLyogRHJvcCBGOCAqLwotICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsJLyogRHJvcCAxNCAqLwotICAgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIHNpemUgb2YgYmxvY2sgKi8KLSAgICAgIGlmIChtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSkgIT0gMCkKLQl7Ci0JICAvKiBUaGlzIG9iamVjdCBoYXMgYmVlbiBkZWxldGVkICovCi0JICBpZWVlLT5lbGVtZW50c1tpXS5maWxlX29mZnNldCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGllZWUtPmVsZW1lbnRzW2ldLmZpbGVfb2Zmc2V0ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCX0KLSAgICB9Ci0KLSAgLyogIGFiZmQtPmhhc19hcm1hcCA9IDsqLwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZWx0cyAhPSBOVUxMKQotICAgIGZyZWUgKGVsdHMpOwotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYWJmZC0+dGRhdGEuaWVlZV9kYXRhID0gKGllZWVfZGF0YV90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoaWVlZV9kYXRhX3R5cGUpKTsKLSAgcmV0dXJuIGFiZmQtPnRkYXRhLmllZWVfZGF0YSA/IHRydWUgOiBmYWxzZTsKLX0KLQotY29uc3QgYmZkX3RhcmdldCAqCi1pZWVlX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKnByb2Nlc3NvcjsKLSAgdW5zaWduZWQgaW50IHBhcnQ7Ci0gIGllZWVfZGF0YV90eXBlICppZWVlOwotICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclszMDBdOwotICBpZWVlX2RhdGFfdHlwZSAqc2F2ZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0KLSAgYWJmZC0+dGRhdGEuaWVlZV9kYXRhID0gMDsKLSAgaWVlZV9ta29iamVjdCAoYWJmZCk7Ci0KLSAgaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGZhaWw7Ci0gIC8qIFJlYWQgdGhlIGZpcnN0IGZldyBieXRlcyBpbiB0byBzZWUgaWYgaXQgbWFrZXMgc2Vuc2UgKi8KLSAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvIHJlYWQKLSAgICAgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLSAgYmZkX3JlYWQgKChQVFIpIGJ1ZmZlciwgMSwgc2l6ZW9mIChidWZmZXIpLCBhYmZkKTsKLQotICBpZWVlLT5oLmlucHV0X3AgPSBidWZmZXI7Ci0gIGlmICh0aGlzX2J5dGVfYW5kX25leHQgKCYoaWVlZS0+aCkpICE9IE1vZHVsZV9CZWdpbm5pbmcpCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0OwotCi0gIGllZWUtPnJlYWRfc3ltYm9scyA9IGZhbHNlOwotICBpZWVlLT5yZWFkX2RhdGEgPSBmYWxzZTsKLSAgaWVlZS0+c2VjdGlvbl9jb3VudCA9IDA7Ci0gIGllZWUtPmV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXggPSAwOwotICBpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWluX2luZGV4ID0gSUVFRV9QVUJMSUNfQkFTRTsKLSAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21pbl9pbmRleCA9IElFRUVfUkVGRVJFTkNFX0JBU0U7Ci0gIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXggPSAwOwotICBpZWVlLT5oLmFiZmQgPSBhYmZkOwotICBpZWVlLT5zZWN0aW9uX3RhYmxlID0gTlVMTDsKLSAgaWVlZS0+c2VjdGlvbl90YWJsZV9zaXplID0gMDsKLQotICBwcm9jZXNzb3IgPSBpZWVlLT5tYi5wcm9jZXNzb3IgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKLSAgaWYgKHN0cmNtcCAocHJvY2Vzc29yLCAiTElCUkFSWSIpID09IDApCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0OwotICBpZWVlLT5tYi5tb2R1bGVfbmFtZSA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotICBpZiAoYWJmZC0+ZmlsZW5hbWUgPT0gKENPTlNUIGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhYmZkLT5maWxlbmFtZSA9IGllZWUtPm1iLm1vZHVsZV9uYW1lOwotICAgIH0KLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuCi0gICAgICovCi0gIHsKLSAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2g7Ci0gICAgY2hhciBmYW1pbHlbMTBdOwotCi0gICAgLyogSUVFRSBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBmb3JtYXQgb2YgdGhlIHByb2Nlc3NvciBpZGVudGlmaWNhdG9uCi0gICAgICAgc3RyaW5nLCBzbyB0aGUgY29tcGlsZXIgaXMgZnJlZSB0byBwdXQgaW4gaXQgd2hhdGV2ZXIgaXQgd2FudHMuCi0gICAgICAgV2UgdHJ5IGhlcmUgdG8gcmVjb2duaXplIGRpZmZlcmVudCBwcm9jZXNzb3JzIGJlbG9uZ2luZyB0byB0aGUKLSAgICAgICBtNjhrIGZhbWlseS4gIENvZGUgZm9yIG90aGVyIHByb2Nlc3NvcnMgY2FuIGJlIGFkZGVkIGhlcmUuICAqLwotICAgIGlmICgocHJvY2Vzc29yWzBdID09ICc2JykgJiYgKHByb2Nlc3NvclsxXSA9PSAnOCcpKQotICAgICAgewotCWlmIChwcm9jZXNzb3JbMl0gPT0gJzMnKQkgICAgLyogNjgzeHggaW50ZWdyYXRlZCBwcm9jZXNzb3JzICovCi0JICB7Ci0JICAgIHN3aXRjaCAocHJvY2Vzc29yWzNdKQotCSAgICAgIHsKLQkgICAgICBjYXNlICcwJzoJCQkgICAgLyogNjgzMDIsIDY4MzA2LCA2ODMwNyAqLwotCSAgICAgIGNhc2UgJzInOgkJCSAgICAvKiA2ODMyMiwgNjgzMjggKi8KLQkgICAgICBjYXNlICc1JzoJCQkgICAgLyogNjgzNTYgKi8KLQkJc3RyY3B5IChmYW1pbHksICI2ODAwMCIpOyAgIC8qIE1DNjgwMDAtYmFzZWQgY29udHJvbGxlcnMgKi8KLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICczJzoJCQkgICAgLyogNjgzMzAsIDY4MzMxLCA2ODMzMiwgNjgzMzMsCi0JCQkJCSAgICAgICA2ODMzNCwgNjgzMzUsIDY4MzM2LCA2ODMzOCAqLwotCSAgICAgIGNhc2UgJzYnOgkJCSAgICAvKiA2ODM2MCAqLwotCSAgICAgIGNhc2UgJzcnOgkJCSAgICAvKiA2ODM3NiAqLwotCQlzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7ICAgLyogQ1BVMzIgYW5kIENQVTMyKyAqLwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzQnOgotCQlpZiAocHJvY2Vzc29yWzRdID09ICc5JykgICAgLyogNjgzNDkgKi8KLQkJICBzdHJjcHkgKGZhbWlseSwgIjY4MDMwIik7IC8qIENQVTAzMCAqLwotCQllbHNlCQkgICAgICAgICAgICAvKiA2ODM0MCwgNjgzNDEgKi8KLQkJICBzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7IC8qIENQVTMyIGFuZCBDUFUzMisgKi8KLQkJYnJlYWs7Ci0KLQkgICAgICBkZWZhdWx0OgkJCSAgICAvKiBEb2VzIG5vdCBleGlzdCB5ZXQgKi8KLQkJc3RyY3B5IChmYW1pbHksICI2ODMzMiIpOyAgIC8qIEd1ZXNzIGl0IHdpbGwgYmUgQ1BVMzIgKi8KLQkgICAgICB9Ci0JICB9Ci0JZWxzZSBpZiAodG91cHBlciAocHJvY2Vzc29yWzNdKSA9PSAnRicpICAgLyogNjhGMzMzICovCi0JICBzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7CSAgICAgICAgICAvKiBDUFUzMiAqLwotCWVsc2UgaWYgKCh0b3VwcGVyIChwcm9jZXNzb3JbM10pID09ICdDJykgIC8qIEVtYmVkZGVkIGNvbnRyb2xsZXJzICovCi0JCSAmJiAoKHRvdXBwZXIgKHByb2Nlc3NvclsyXSkgPT0gJ0UnKQotCQkgICAgIHx8ICh0b3VwcGVyIChwcm9jZXNzb3JbMl0pID09ICdIJykKLQkJICAgICB8fCAodG91cHBlciAocHJvY2Vzc29yWzJdKSA9PSAnTCcpKSkKLQkgIHsKLQkgICAgc3RyY3B5IChmYW1pbHksICI2OCIpOwotCSAgICBzdHJuY2F0IChmYW1pbHksIHByb2Nlc3NvciArIDQsIDcpOwotCSAgICBmYW1pbHlbOV0gPSAnXDAnOwotCSAgfQotCWVsc2UJCQkJIC8qICJSZWd1bGFyIiBwcm9jZXNzb3JzICovCi0JICB7Ci0JICAgIHN0cm5jcHkgKGZhbWlseSwgcHJvY2Vzc29yLCA5KTsKLQkgICAgZmFtaWx5WzldID0gJ1wwJzsKLQkgIH0KLSAgICAgIH0KLSAgICBlbHNlIGlmICgoc3RybmNtcCAocHJvY2Vzc29yLCAiY3B1MzIiLCA1KSA9PSAwKSAvKiBDUFUzMiBhbmQgQ1BVMzIrICovCi0JICAgICB8fCAoc3RybmNtcCAocHJvY2Vzc29yLCAiQ1BVMzIiLCA1KSA9PSAwKSkKLSAgICAgIHN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsKLSAgICBlbHNlCi0gICAgICB7Ci0Jc3RybmNweSAoZmFtaWx5LCBwcm9jZXNzb3IsIDkpOwotCWZhbWlseVs5XSA9ICdcMCc7Ci0gICAgICB9Ci0KLSAgICBhcmNoID0gYmZkX3NjYW5fYXJjaCAoZmFtaWx5KTsKLSAgICBpZiAoYXJjaCA9PSAwKQotICAgICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0OwotICAgIGFiZmQtPmFyY2hfaW5mbyA9IGFyY2g7Ci0gIH0KLQotICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSAhPSAoaW50KSBpZWVlX2FkZHJlc3NfZGVzY3JpcHRvcl9lbnVtKQotICAgIHsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0gIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0KLSAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJmllZWUtPmFkLm51bWJlcl9vZl9iaXRzX21hdSkgPT0gZmFsc2UpCi0gICAgewotICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJmllZWUtPmFkLm51bWJlcl9vZl9tYXVzX2luX2FkZHJlc3MpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSBieXRlIG9yZGVyIGluZm8sIHRha2UgaXQgKi8KLSAgaWYgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPT0gKGludCkgaWVlZV92YXJpYWJsZV9MX2VudW0gfHwKLSAgICAgIHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPT0gKGludCkgaWVlZV92YXJpYWJsZV9NX2VudW0pCi0gICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotICBmb3IgKHBhcnQgPSAwOyBwYXJ0IDwgTl9XX1ZBUklBQkxFUzsgcGFydCsrKQotICAgIHsKLSAgICAgIGJvb2xlYW4gb2s7Ci0gICAgICBpZiAocmVhZF8yYnl0ZXMgKCYoaWVlZS0+aCkpICE9IChpbnQpIGllZWVfYXNzaWduX3ZhbHVlX3RvX3ZhcmlhYmxlX2VudW0pCi0JewotCSAgZ290byBmYWlsOwotCX0KLSAgICAgIGlmICh0aGlzX2J5dGVfYW5kX25leHQgKCYoaWVlZS0+aCkpICE9IHBhcnQpCi0JewotCSAgZ290byBmYWlsOwotCX0KLQotICAgICAgaWVlZS0+dy5vZmZzZXRbcGFydF0gPSBwYXJzZV9pICgmKGllZWUtPmgpLCAmb2spOwotICAgICAgaWYgKG9rID09IGZhbHNlKQotCXsKLQkgIGdvdG8gZmFpbDsKLQl9Ci0KLSAgICB9Ci0KLSAgaWYgKGllZWUtPncuci5leHRlcm5hbF9wYXJ0ICE9IDApCi0gICAgYWJmZC0+ZmxhZ3MgPSBIQVNfU1lNUzsKLQotICAvKiBCeSBub3cgd2Uga25vdyB0aGF0IHRoaXMgaXMgYSByZWFsIElFRUUgZmlsZSwgd2UncmUgZ29pbmcgdG8gcmVhZAotICAgICB0aGUgd2hvbGUgdGhpbmcgaW50byBtZW1vcnkgc28gdGhhdCB3ZSBjYW4gcnVuIHVwIGFuZCBkb3duIGl0Ci0gICAgIHF1aWNrbHkuICBXZSBjYW4gd29yayBvdXQgaG93IGJpZyB0aGUgZmlsZSBpcyBmcm9tIHRoZSB0cmFpbGVyCi0gICAgIHJlY29yZCAqLwotCi0gIElFRUVfREFUQSAoYWJmZCktPmguZmlyc3RfYnl0ZSA9Ci0gICAgKHVuc2lnbmVkIGNoYXIgKikgYmZkX2FsbG9jIChpZWVlLT5oLmFiZmQsIGllZWUtPncuci5tZV9yZWNvcmQgKyAxKTsKLSAgaWYgKCFJRUVFX0RBVEEgKGFiZmQpLT5oLmZpcnN0X2J5dGUpCi0gICAgZ290byBmYWlsOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBmYWlsOwotICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAotICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICBiZmRfcmVhZCAoKFBUUikgKElFRUVfREFUQSAoYWJmZCktPmguZmlyc3RfYnl0ZSksIDEsCi0JICAgIGllZWUtPncuci5tZV9yZWNvcmQgKyAxLCBhYmZkKTsKLQotICBpZWVlX3NsdXJwX3NlY3Rpb25zIChhYmZkKTsKLQotICBpZiAoISBpZWVlX3NsdXJwX2RlYnVnIChhYmZkKSkKLSAgICBnb3RvIGZhaWw7Ci0KLSAgLyogUGFyc2Ugc2VjdGlvbiBkYXRhIHRvIGFjdGl2YXRlIGZpbGUgYW5kIHNlY3Rpb24gZmxhZ3MgaW1wbGllZCBieQotICAgICBzZWN0aW9uIGNvbnRlbnRzLiAqLwotCi0gIGlmICghIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKSkKLSAgICBnb3RvIGZhaWw7Ci0gICAgCi0gIHJldHVybiBhYmZkLT54dmVjOwotZ290X3dyb25nX2Zvcm1hdDoKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci1mYWlsOgotICAodm9pZCkgYmZkX3JlbGVhc2UgKGFiZmQsIGllZWUpOwotICBhYmZkLT50ZGF0YS5pZWVlX2RhdGEgPSBzYXZlOwotICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLX0KLQotdm9pZAotaWVlZV9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotICBpZiAoc3ltYm9sLT5uYW1lWzBdID09ICcgJykKLSAgICByZXQtPm5hbWUgPSAiKiBlbXB0eSB0YWJsZSBlbnRyeSAiOwotICBpZiAoIXN5bWJvbC0+c2VjdGlvbikKLSAgICByZXQtPnR5cGUgPSAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkgPyAnYScgOiAnQSc7Ci19Ci0KLXZvaWQKLWllZWVfcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYWZpbGU7Ci0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotI2lmIDAKLSAgICAgIGZwcmludGYgKGZpbGUsICIlNHggJTJ4IiwgYW91dF9zeW1ib2wgKHN5bWJvbCktPmRlc2MgJiAweGZmZmYsCi0JICAgICAgIGFvdXRfc3ltYm9sIChzeW1ib2wpLT5vdGhlciAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICBCRkRfRkFJTCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lID0KLQkgIChzeW1ib2wtPnNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwKLQkgICA/ICIqYWJzIgotCSAgIDogc3ltYm9sLT5zZWN0aW9uLT5uYW1lKTsKLQlpZiAoc3ltYm9sLT5uYW1lWzBdID09ICcgJykKLQkgIHsKLQkgICAgZnByaW50ZiAoZmlsZSwgIiogZW1wdHkgdGFibGUgZW50cnkgIik7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCi0JICAgIGZwcmludGYgKGZpbGUsICIgJS01cyAlMDR4ICUwMnggJXMiLAotCQkgICAgIHNlY3Rpb25fbmFtZSwKLQkJICAgICAodW5zaWduZWQpIGllZWVfc3ltYm9sIChzeW1ib2wpLT5pbmRleCwKLQkJICAgICAodW5zaWduZWQpIDAsCi0JCSAgICAgc3ltYm9sLT5uYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLWRvX29uZSAoaWVlZSwgY3VycmVudF9tYXAsIGxvY2F0aW9uX3B0ciwgcywgaXRlcmF0aW9ucykKLSAgICAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0gICAgIGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqY3VycmVudF9tYXA7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmxvY2F0aW9uX3B0cjsKLSAgICAgYXNlY3Rpb24gKnM7Ci0gICAgIGludCBpdGVyYXRpb25zOwotewotICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0gICAgewotICAgIGNhc2UgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW06Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IG51bWJlcl9vZl9tYXVzOwotCXVuc2lnbmVkIGludCBpOwotCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JbnVtYmVyX29mX21hdXMgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyX29mX21hdXM7IGkrKykKLQkgIHsKLQkgICAgbG9jYXRpb25fcHRyW2N1cnJlbnRfbWFwLT5wYysrXSA9IHRoaXNfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgaWVlZV9sb2FkX3dpdGhfcmVsb2NhdGlvbl9lbnVtOgotICAgICAgewotCWJvb2xlYW4gbG9vcCA9IHRydWU7Ci0JbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQl3aGlsZSAobG9vcCkKLQkgIHsKLQkgICAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotCSAgICAgIHsKLQkgICAgICBjYXNlIGllZWVfdmFyaWFibGVfUl9lbnVtOgotCi0JICAgICAgY2FzZSBpZWVlX2Z1bmN0aW9uX3NpZ25lZF9vcGVuX2JfZW51bToKLQkgICAgICBjYXNlIGllZWVfZnVuY3Rpb25fdW5zaWduZWRfb3Blbl9iX2VudW06Ci0JICAgICAgY2FzZSBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9vcGVuX2JfZW51bToKLQkJewotCQkgIHVuc2lnbmVkIGludCBleHRyYSA9IDQ7Ci0JCSAgYm9vbGVhbiBwY3JlbCA9IGZhbHNlOwotCQkgIGFzZWN0aW9uICpzZWN0aW9uOwotCQkgIGllZWVfcmVsb2NfdHlwZSAqciA9Ci0JCSAgKGllZWVfcmVsb2NfdHlwZSAqKSBiZmRfYWxsb2MgKGllZWUtPmguYWJmZCwKLQkJCQkJCSBzaXplb2YgKGllZWVfcmVsb2NfdHlwZSkpOwotCQkgIGlmICghcikKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgICooY3VycmVudF9tYXAtPnJlbG9jX3RhaWxfcHRyKSA9IHI7Ci0JCSAgY3VycmVudF9tYXAtPnJlbG9jX3RhaWxfcHRyID0gJnItPm5leHQ7Ci0JCSAgci0+bmV4dCA9IChpZWVlX3JlbG9jX3R5cGUgKikgTlVMTDsKLQkJICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotLyoJCQkgICAgYWJvcnQoKTsqLwotCQkgIHItPnJlbGVudC5zeW1fcHRyX3B0ciA9IDA7Ci0JCSAgcGFyc2VfZXhwcmVzc2lvbiAoaWVlZSwKLQkJCQkgICAgJnItPnJlbGVudC5hZGRlbmQsCi0JCQkJICAgICZyLT5zeW1ib2wsCi0JCQkJICAgICZwY3JlbCwgJmV4dHJhLCAmc2VjdGlvbik7Ci0JCSAgci0+cmVsZW50LmFkZHJlc3MgPSBjdXJyZW50X21hcC0+cGM7Ci0JCSAgcy0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCQkgIHMtPm93bmVyLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0JCSAgcy0+cmVsb2NfY291bnQrKzsKLQkJICBpZiAoci0+cmVsZW50LnN5bV9wdHJfcHRyID09IE5VTEwgJiYgc2VjdGlvbiAhPSBOVUxMKQotCQkgICAgci0+cmVsZW50LnN5bV9wdHJfcHRyID0gc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0KLQkJICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSA9PSAoaW50KSBpZWVlX2NvbW1hKQotCQkgICAgewotCQkgICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgICAvKiBGZXRjaCBudW1iZXIgb2YgYnl0ZXMgdG8gcGFkICovCi0JCSAgICAgIGV4dHJhID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgfTsKLQotCQkgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQkJICAgIHsKLQkJICAgIGNhc2UgaWVlZV9mdW5jdGlvbl9zaWduZWRfY2xvc2VfYl9lbnVtOgotCQkgICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgaWVlZV9mdW5jdGlvbl91bnNpZ25lZF9jbG9zZV9iX2VudW06Ci0JCSAgICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9jbG9zZV9iX2VudW06Ci0JCSAgICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgLyogQnVpbGQgYSByZWxvY2F0aW9uIGVudHJ5IGZvciB0aGlzIHR5cGUgKi8KLQkJICAvKiBJZiBwYyByZWwgdGhlbiBzdGljayAtdmUgcGMgaW50byBpbnN0cnVjdGlvbgotCQkgICAgIGFuZCB0YWtlIG91dCBvZiByZWxvYyAuLgotCi0JCSAgICAgSSd2ZSBjaGFuZ2VkIHRoaXMuIEl0J3MgYWxsIHRvbyBjb21wbGljYXRlZC4gSQotCQkgICAgIGtlZXAgMCBpbiB0aGUgaW5zdHJ1Y3Rpb24gbm93LiAgKi8KLQotCQkgIHN3aXRjaCAoZXh0cmEpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDA6Ci0JCSAgICBjYXNlIDQ6Ci0KLQkJICAgICAgaWYgKHBjcmVsID09IHRydWUpCi0JCQl7Ci0jaWYgS0VFUE1JTlVTUENJTklOU1QKLQkJCSAgYmZkX3B1dF8zMiAoaWVlZS0+aC5hYmZkLCAtY3VycmVudF9tYXAtPnBjLCBsb2NhdGlvbl9wdHIgKwotCQkJCSAgICAgIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZyZWwzMl9ob3d0bzsKLQkJCSAgci0+cmVsZW50LmFkZGVuZCAtPQotCQkJICAgIGN1cnJlbnRfbWFwLT5wYzsKLSNlbHNlCi0JCQkgIGJmZF9wdXRfMzIgKGllZWUtPmguYWJmZCwgMCwgbG9jYXRpb25fcHRyICsKLQkJCQkgICAgICBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsMzJfaG93dG87Ci0jZW5kaWYKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBiZmRfcHV0XzMyIChpZWVlLT5oLmFiZmQsIDAsIGxvY2F0aW9uX3B0ciArCi0JCQkJICAgICAgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJmFiczMyX2hvd3RvOwotCQkJfQotCQkgICAgICBjdXJyZW50X21hcC0+cGMgKz0gNDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDI6Ci0JCSAgICAgIGlmIChwY3JlbCA9PSB0cnVlKQotCQkJewotI2lmIEtFRVBNSU5VU1BDSU5JTlNUCi0JCQkgIGJmZF9wdXRfMTYgKGllZWUtPmguYWJmZCwgKGludCkgKC1jdXJyZW50X21hcC0+cGMpLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuYWRkZW5kIC09IGN1cnJlbnRfbWFwLT5wYzsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJnJlbDE2X2hvd3RvOwotI2Vsc2UKLQotCQkJICBiZmRfcHV0XzE2IChpZWVlLT5oLmFiZmQsIDAsIGxvY2F0aW9uX3B0ciArIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZyZWwxNl9ob3d0bzsKLSNlbmRpZgotCQkJfQotCi0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYmZkX3B1dF8xNiAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmYWJzMTZfaG93dG87Ci0JCQl9Ci0JCSAgICAgIGN1cnJlbnRfbWFwLT5wYyArPSAyOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMToKLQkJICAgICAgaWYgKHBjcmVsID09IHRydWUpCi0JCQl7Ci0jaWYgS0VFUE1JTlVTUENJTklOU1QKLQkJCSAgYmZkX3B1dF84IChpZWVlLT5oLmFiZmQsIChpbnQpICgtY3VycmVudF9tYXAtPnBjKSwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50LmFkZGVuZCAtPSBjdXJyZW50X21hcC0+cGM7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZyZWw4X2hvd3RvOwotI2Vsc2UKLQkJCSAgYmZkX3B1dF84IChpZWVlLT5oLmFiZmQsIDAsIGxvY2F0aW9uX3B0ciArIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZyZWw4X2hvd3RvOwotI2VuZGlmCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYmZkX3B1dF84IChpZWVlLT5oLmFiZmQsIDAsIGxvY2F0aW9uX3B0ciArIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZhYnM4X2hvd3RvOwotCQkJfQotCQkgICAgICBjdXJyZW50X21hcC0+cGMgKz0gMTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIEJGRF9GQUlMICgpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJewotCQkgIGJmZF92bWEgdGhpc19zaXplOwotCQkgIGlmIChwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ0aGlzX3NpemUpID09IHRydWUpCi0JCSAgICB7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBpOwotCQkgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpc19zaXplOyBpKyspCi0JCQl7Ci0JCQkgIGxvY2F0aW9uX3B0cltjdXJyZW50X21hcC0+cGMrK10gPSB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbG9vcCA9IGZhbHNlOwotCQkgICAgfQotCQl9Ci0JICAgICAgfQotCi0JICAgIC8qIFByZXZlbnQgbW9yZSB0aGFuIHRoZSBmaXJzdCBsb2FkLWl0ZW0gb2YgYW4gTFIgcmVjb3JkCi0JICAgICAgIGZyb20gYmVpbmcgcmVwZWF0ZWQgKE1SSSBjb252ZW50aW9uKS4gKi8KLQkgICAgaWYgKGl0ZXJhdGlvbnMgIT0gMSkKLQkgICAgICBsb29wID0gZmFsc2U7Ci0JICB9Ci0gICAgICB9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBpbiBhbGwgdGhlIHNlY3Rpb24gZGF0YSBhbmQgcmVsb2NhdGlvbiBzdHVmZiB0b28gKi8KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfYnl0ZSAqbG9jYXRpb25fcHRyID0gKGJmZF9ieXRlICopIE5VTEw7Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fbnVtYmVyOwotCi0gIGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqY3VycmVudF9tYXAgPSAoaWVlZV9wZXJfc2VjdGlvbl90eXBlICopIE5VTEw7Ci0gIGFzZWN0aW9uICpzOwotICAvKiBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBhcmVhICovCi0gIGlmIChpZWVlLT5yZWFkX2RhdGEgPT0gdHJ1ZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWVlZS0+cmVhZF9kYXRhID0gdHJ1ZTsKLSAgaWVlZV9zZWVrIChhYmZkLCBpZWVlLT53LnIuZGF0YV9wYXJ0KTsKLQotICAvKiBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIGFsbCB0aGUgc2VjdGlvbiBjb250ZW50cyAqLwotCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKnBlciA9IChpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKikgcy0+dXNlZF9ieV9iZmQ7Ci0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLQljb250aW51ZTsKLSAgICAgIHBlci0+ZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGllZWUtPmguYWJmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmICghcGVyLT5kYXRhKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qU1VQUFJFU1MgNjgqLwotICAgICAgcGVyLT5yZWxvY190YWlsX3B0ciA9Ci0JKGllZWVfcmVsb2NfdHlwZSAqKikgJiAocy0+cmVsb2NhdGlvbik7Ci0gICAgfQotCi0gIHdoaWxlICh0cnVlKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQl7Ci0JICAvKiBJRiB3ZSBzZWUgYW55dGhpbmcgc3RyYW5nZSB0aGVuIHF1aXQgKi8KLQlkZWZhdWx0OgotCSAgcmV0dXJuIHRydWU7Ci0KLQljYXNlIGllZWVfc2V0X2N1cnJlbnRfc2VjdGlvbl9lbnVtOgotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgIHNlY3Rpb25fbnVtYmVyID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgcyA9IGllZWUtPnNlY3Rpb25fdGFibGVbc2VjdGlvbl9udW1iZXJdOwotCSAgcy0+ZmxhZ3MgfD0gU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTOwotCSAgY3VycmVudF9tYXAgPSAoaWVlZV9wZXJfc2VjdGlvbl90eXBlICopIHMtPnVzZWRfYnlfYmZkOwotCSAgbG9jYXRpb25fcHRyID0gY3VycmVudF9tYXAtPmRhdGEgLSBzLT52bWE7Ci0JICAvKiBUaGUgZG9jdW1lbnQgSSBoYXZlIHNheXMgdGhhdCBNaWNyb3RlYydzIGNvbXBpbGVycyByZXNldCAqLwotCSAgLyogdGhpcyBhZnRlciBhIHNlYyBzZWN0aW9uLCBldmVuIHRob3VnaCB0aGUgc3RhbmRhcmQgc2F5cyBub3QgKi8KLQkgIC8qIHRvLiBTTyAuLiAqLwotCSAgY3VycmVudF9tYXAtPnBjID0gcy0+dm1hOwotCSAgYnJlYWs7Ci0KLQljYXNlIGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtOgotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQkgICAgewotCSAgICBjYXNlIGllZWVfc2V0X2N1cnJlbnRfcGNfZW51bSAmIDB4ZmY6Ci0JICAgICAgewotCQliZmRfdm1hIHZhbHVlOwotCQlpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5bWJvbDsKLQkJdW5zaWduZWQgaW50IGV4dHJhOwotCQlib29sZWFuIHBjcmVsOwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQltdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CS8qIFRob3cgYXdheSBzZWN0aW9uICMqLwotCQlwYXJzZV9leHByZXNzaW9uIChpZWVlLCAmdmFsdWUsCi0JCQkJICAmc3ltYm9sLAotCQkJCSAgJnBjcmVsLCAmZXh0cmEsCi0JCQkJICAwKTsKLQkJY3VycmVudF9tYXAtPnBjID0gdmFsdWU7Ci0JCUJGRF9BU1NFUlQgKCh1bnNpZ25lZCkgKHZhbHVlIC0gcy0+dm1hKSA8PSBzLT5fcmF3X3NpemUpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGllZWVfdmFsdWVfc3RhcnRpbmdfYWRkcmVzc19lbnVtICYgMHhmZjoKLQkgICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICAgIGlmICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpID09IGllZWVfZnVuY3Rpb25fZWl0aGVyX29wZW5fYl9lbnVtKQotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICAgIGFiZmQtPnN0YXJ0X2FkZHJlc3MgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgICAgLyogV2UndmUgZ290IHRvIHRoZSBlbmQgb2YgdGhlIGRhdGEgbm93IC0gKi8KLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBCRkRfRkFJTCAoKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgaWVlZV9yZXBlYXRfZGF0YV9lbnVtOgotCSAgewotCSAgICAvKiBSZXBlYXQgdGhlIGZvbGxvd2luZyBMRCBvciBMUiBuIHRpbWVzIC0gd2UgZG8gdGhpcyBieQotCQkgcmVtZW1iZXJpbmcgdGhlIHN0cmVhbSBwb2ludGVyIGJlZm9yZSBydW5uaW5nIGl0IGFuZAotCQkgcmVzZXR0aW5nIGl0IGFuZCBydW5uaW5nIGl0IG4gdGltZXMuIFdlIHNwZWNpYWwgY2FzZQotCQkgdGhlIHJlcGV0aXRpb24gb2YgYSByZXBlYXRfZGF0YS9sb2FkX2NvbnN0YW50Ci0JCSAqLwotCi0JICAgIHVuc2lnbmVkIGludCBpdGVyYXRpb25zOwotCSAgICB1bnNpZ25lZCBjaGFyICpzdGFydDsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgaXRlcmF0aW9ucyA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkgICAgc3RhcnQgPSBpZWVlLT5oLmlucHV0X3A7Ci0JICAgIGlmIChzdGFydFswXSA9PSAoaW50KSBpZWVlX2xvYWRfY29uc3RhbnRfYnl0ZXNfZW51bSAmJgotCQlzdGFydFsxXSA9PSAxKQotCSAgICAgIHsKLQkJd2hpbGUgKGl0ZXJhdGlvbnMgIT0gMCkKLQkJICB7Ci0JCSAgICBsb2NhdGlvbl9wdHJbY3VycmVudF9tYXAtPnBjKytdID0gc3RhcnRbMl07Ci0JCSAgICBpdGVyYXRpb25zLS07Ci0JCSAgfQotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJd2hpbGUgKGl0ZXJhdGlvbnMgIT0gMCkKLQkJICB7Ci0JCSAgICBpZWVlLT5oLmlucHV0X3AgPSBzdGFydDsKLQkJICAgIGlmICghZG9fb25lIChpZWVlLCBjdXJyZW50X21hcCwgbG9jYXRpb25fcHRyLCBzLAotCQkJCSBpdGVyYXRpb25zKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgaXRlcmF0aW9ucy0tOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfbG9hZF9jb25zdGFudF9ieXRlc19lbnVtOgotCWNhc2UgaWVlZV9sb2FkX3dpdGhfcmVsb2NhdGlvbl9lbnVtOgotCSAgewotCSAgICBpZiAoIWRvX29uZSAoaWVlZSwgY3VycmVudF9tYXAsIGxvY2F0aW9uX3B0ciwgcywgMSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci19Ci0KLWJvb2xlYW4KLWllZWVfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgbmV3c2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqbmV3c2VjdDsKLXsKLSAgbmV3c2VjdC0+dXNlZF9ieV9iZmQgPSAoUFRSKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpZWVlX3Blcl9zZWN0aW9uX3R5cGUpKTsKLSAgaWYgKCFuZXdzZWN0LT51c2VkX2J5X2JmZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGllZWVfcGVyX3NlY3Rpb24gKG5ld3NlY3QpLT5kYXRhID0gKGJmZF9ieXRlICopIE5VTEw7Ci0gIGllZWVfcGVyX3NlY3Rpb24gKG5ld3NlY3QpLT5zZWN0aW9uID0gbmV3c2VjdDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWxvbmcKLWllZWVfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmICghIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKnAgPSAoaWVlZV9wZXJfc2VjdGlvbl90eXBlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkOwotICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLSAgICByZXR1cm4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwKLQkJCQkJICAgICAgb2Zmc2V0LCBjb3VudCk7Ci0gIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKTsKLSAgKHZvaWQpIG1lbWNweSAoKFBUUikgbG9jYXRpb24sIChQVFIpIChwLT5kYXRhICsgb2Zmc2V0KSwgKHVuc2lnbmVkKSBjb3VudCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1sb25nCi1pZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0vKiAgaWVlZV9wZXJfc2VjdGlvbl90eXBlICpwID0gKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSBzZWN0aW9uLT51c2VkX2J5X2JmZDsqLwotICBpZWVlX3JlbG9jX3R5cGUgKnNyYyA9IChpZWVlX3JlbG9jX3R5cGUgKikgKHNlY3Rpb24tPnJlbG9jYXRpb24pOwotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgd2hpbGUgKHNyYyAhPSAoaWVlZV9yZWxvY190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgLyogV29yayBvdXQgd2hpY2ggc3ltYm9sIHRvIGF0dGFjaCBpdCB0aGlzIHJlbG9jIHRvICovCi0gICAgICBzd2l0Y2ggKHNyYy0+c3ltYm9sLmxldHRlcikKLQl7Ci0JY2FzZSAnSSc6Ci0JICBzcmMtPnJlbGVudC5zeW1fcHRyX3B0ciA9Ci0JICAgIHN5bWJvbHMgKyBzcmMtPnN5bWJvbC5pbmRleCArIGllZWUtPmV4dGVybmFsX3N5bWJvbF9iYXNlX29mZnNldDsKLQkgIGJyZWFrOwotCWNhc2UgJ1gnOgotCSAgc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIgPQotCSAgICBzeW1ib2xzICsgc3JjLT5zeW1ib2wuaW5kZXggKyBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfYmFzZV9vZmZzZXQ7Ci0JICBicmVhazsKLQljYXNlIDA6Ci0JICBpZiAoc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIgIT0gTlVMTCkKLQkgICAgc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIgPQotCSAgICAgIHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyWzBdLT5zZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0KLQkgIEJGRF9GQUlMICgpOwotCX0KLSAgICAgICpyZWxwdHIrKyA9ICZzcmMtPnJlbGVudDsKLSAgICAgIHNyYyA9IHNyYy0+bmV4dDsKLSAgICB9Ci0gICpyZWxwdHIgPSAoYXJlbGVudCAqKSBOVUxMOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvbXAgKGFwLCBicCkKLSAgICAgQ09OU1QgUFRSIGFwOwotICAgICBDT05TVCBQVFIgYnA7Ci17Ci0gIGFyZWxlbnQgKmEgPSAqKChhcmVsZW50ICoqKSBhcCk7Ci0gIGFyZWxlbnQgKmIgPSAqKChhcmVsZW50ICoqKSBicCk7Ci0gIHJldHVybiBhLT5hZGRyZXNzIC0gYi0+YWRkcmVzczsKLX0KLQotLyogV3JpdGUgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX3NlY3Rpb25fcGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGFzZWN0aW9uICpzOwotICBpZWVlLT53LnIuc2VjdGlvbl9wYXJ0ID0gYmZkX3RlbGwgKGFiZmQpOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChzKQotCSAgJiYgKHMtPmZsYWdzICYgU0VDX0RFQlVHR0lORykgPT0gMCkKLQl7Ci0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfc2VjdGlvbl90eXBlX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJICAgIChiZmRfYnl0ZSkgKHMtPmluZGV4Ci0JCQkJCQkrIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaW1hZ2UgaXMgZXhlY3V0YWJsZSwgc28gb3V0cHV0IGFic29sdXRlIHNlY3Rpb25zICovCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX0FfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9TX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9DX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChzLT5mbGFncyAmIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSkpCi0JICAgIHsKLQkgICAgY2FzZSBTRUNfQ09ERSB8IFNFQ19MT0FEOgotCSAgICBjYXNlIFNFQ19DT0RFOgotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9QX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU0VDX0RBVEE6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX0RfZW51bSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTRUNfUk9NOgotCSAgICBjYXNlIFNFQ19ST00gfCBTRUNfREFUQToKLQkgICAgY2FzZSBTRUNfUk9NIHwgU0VDX0xPQUQ6Ci0JICAgIGNhc2UgU0VDX1JPTSB8IFNFQ19EQVRBIHwgU0VDX0xPQUQ6Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1JfZW51bSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0KLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsIHMtPm5hbWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0jaWYgMAotCSAgaWVlZV93cml0ZV9pbnQgKGFiZmQsIDApOwkvKiBQYXJlbnQgKi8KLQkgIGllZWVfd3JpdGVfaW50IChhYmZkLCAwKTsJLyogQnJvdGhlciAqLwotCSAgaWVlZV93cml0ZV9pbnQgKGFiZmQsIDApOwkvKiBDb250ZXh0ICovCi0jZW5kaWYKLQkgIC8qIEFsaWdubWVudCAqLwotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NlY3Rpb25fYWxpZ25tZW50X2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJICAgIChiZmRfYnl0ZSkgKHMtPmluZGV4Ci0JCQkJCQkrIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgMSA8PCBzLT5hbGlnbm1lbnRfcG93ZXIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFNpemUgKi8KLQkgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3NlY3Rpb25fc2l6ZV9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCSAgICAoYmZkX2J5dGUpIChzLT5pbmRleAotCQkJCQkJKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHMtPl9yYXdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLQkgICAgewotCSAgICAgIC8qIFJlbG9jYXRlYWJsZSBzZWN0aW9ucyBkb24ndCBoYXZlIGFzbCByZWNvcmRzICovCi0JICAgICAgLyogVm1hICovCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGllZWVfc2VjdGlvbl9iYXNlX2FkZHJlc3NfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkJKChiZmRfYnl0ZSkKLQkJCQkJIChzLT5pbmRleAotCQkJCQkgICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcy0+bG1hKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotZG9fd2l0aF9yZWxvY3MgKGFiZmQsIHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIHVuc2lnbmVkIGludCBudW1iZXJfb2ZfbWF1c19pbl9hZGRyZXNzID0KLSAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKSAvIGJmZF9hcmNoX2JpdHNfcGVyX2J5dGUgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgcmVsb2NzX3RvX2dvID0gcy0+cmVsb2NfY291bnQ7Ci0gIGJmZF9ieXRlICpzdHJlYW0gPSBpZWVlX3Blcl9zZWN0aW9uIChzKS0+ZGF0YTsKLSAgYXJlbGVudCAqKnAgPSBzLT5vcmVsb2NhdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBjdXJyZW50X2J5dGVfaW5kZXggPSAwOwotCi0gIHFzb3J0IChzLT5vcmVsb2NhdGlvbiwKLQkgcmVsb2NzX3RvX2dvLAotCSBzaXplb2YgKGFyZWxlbnQgKiopLAotCSBjb21wKTsKLQotICAvKiBPdXRwdXQgdGhlIHNlY3Rpb24gcHJlaGVhZGVyICovCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZXRfY3VycmVudF9zZWN0aW9uX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCSAgICAoYmZkX2J5dGUpIChzLT5pbmRleCArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3NldF9jdXJyZW50X3BjX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCSAgICAoYmZkX2J5dGUpIChzLT5pbmRleCArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMCAmJiByZWxvY3NfdG9fZ28gPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcy0+bG1hKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9leHByZXNzaW9uIChhYmZkLCAwLCBzLT5zeW1ib2wsIDAsIDApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHJlbG9jc190b19nbyA9PSAwKQotICAgIHsKLSAgICAgIC8qIElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NhdGlvbnMgdGhlbiBvdXRwdXQgdGhlIGxvYWQgY29uc3RhbnQKLQkgYnl0ZSBvcGNvZGUgcmF0aGVyIHRoYW4gdGhlIGxvYWQgd2l0aCByZWxvY2F0aW9uIG9wY29kZSAqLwotCi0gICAgICB3aGlsZSAoY3VycmVudF9ieXRlX2luZGV4IDwgcy0+X3Jhd19zaXplKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgcnVuOwotCSAgdW5zaWduZWQgaW50IE1BWFJVTiA9IDEyNzsKLQkgIHJ1biA9IE1BWFJVTjsKLQkgIGlmIChydW4gPiBzLT5fcmF3X3NpemUgLSBjdXJyZW50X2J5dGVfaW5kZXgpCi0JICAgIHsKLQkgICAgICBydW4gPSBzLT5fcmF3X3NpemUgLSBjdXJyZW50X2J5dGVfaW5kZXg7Ci0JICAgIH0KLQotCSAgaWYgKHJ1biAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2xvYWRfY29uc3RhbnRfYnl0ZXNfZW51bSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAvKiBPdXRwdXQgYSBzdHJlYW0gb2YgYnl0ZXMgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcnVuKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIChzdHJlYW0gKyBjdXJyZW50X2J5dGVfaW5kZXgpLAotCQkJICAgICAxLAotCQkJICAgICBydW4sCi0JCQkgICAgIGFiZmQpCi0JCSAgIT0gcnVuKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgY3VycmVudF9ieXRlX2luZGV4ICs9IHJ1bjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfbG9hZF93aXRoX3JlbG9jYXRpb25fZW51bSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBPdXRwdXQgdGhlIGRhdGEgc3RyZWFtIGFzIHRoZSBsb25nZXN0IHNlcXVlbmNlIG9mIGJ5dGVzCi0JIHBvc3NpYmxlLCBhbGxvd2luZyBmb3IgdGhlIGEgcmVhc29uYWJsZSBwYWNrZXQgc2l6ZSBhbmQKLQkgcmVsb2NhdGlvbiBzdHVmZnMuICAqLwotCi0gICAgICBpZiAoKFBUUikgc3RyZWFtID09IChQVFIpIE5VTEwpCi0JewotCSAgLyogT3V0cHV0dGluZyBhIHNlY3Rpb24gd2l0aG91dCBkYXRhLCBmaWxsIGl0IHVwICovCi0JICBzdHJlYW0gPSAodW5zaWduZWQgY2hhciAqKSAoYmZkX2FsbG9jIChhYmZkLCBzLT5fcmF3X3NpemUpKTsKLQkgIGlmICghc3RyZWFtKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBtZW1zZXQgKChQVFIpIHN0cmVhbSwgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLQl9Ci0gICAgICB3aGlsZSAoY3VycmVudF9ieXRlX2luZGV4IDwgcy0+X3Jhd19zaXplKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgcnVuOwotCSAgdW5zaWduZWQgaW50IE1BWFJVTiA9IDEyNzsKLQkgIGlmIChyZWxvY3NfdG9fZ28pCi0JICAgIHsKLQkgICAgICBydW4gPSAoKnApLT5hZGRyZXNzIC0gY3VycmVudF9ieXRlX2luZGV4OwotCSAgICAgIGlmIChydW4gPiBNQVhSVU4pCi0JCXJ1biA9IE1BWFJVTjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcnVuID0gTUFYUlVOOwotCSAgICB9Ci0JICBpZiAocnVuID4gcy0+X3Jhd19zaXplIC0gY3VycmVudF9ieXRlX2luZGV4KQotCSAgICB7Ci0JICAgICAgcnVuID0gcy0+X3Jhd19zaXplIC0gY3VycmVudF9ieXRlX2luZGV4OwotCSAgICB9Ci0KLQkgIGlmIChydW4gIT0gMCkKLQkgICAgewotCSAgICAgIC8qIE91dHB1dCBhIHN0cmVhbSBvZiBieXRlcyAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCBydW4pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgKHN0cmVhbSArIGN1cnJlbnRfYnl0ZV9pbmRleCksCi0JCQkgICAgIDEsCi0JCQkgICAgIHJ1biwKLQkJCSAgICAgYWJmZCkKLQkJICAhPSBydW4pCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBjdXJyZW50X2J5dGVfaW5kZXggKz0gcnVuOwotCSAgICB9Ci0JICAvKiBPdXRwdXQgYW55IHJlbG9jYXRpb25zIGhlcmUgKi8KLQkgIGlmIChyZWxvY3NfdG9fZ28gJiYgKCpwKSAmJiAoKnApLT5hZGRyZXNzID09IGN1cnJlbnRfYnl0ZV9pbmRleCkKLQkgICAgewotCSAgICAgIHdoaWxlIChyZWxvY3NfdG9fZ28KLQkJICAgICAmJiAoKnApICYmICgqcCktPmFkZHJlc3MgPT0gY3VycmVudF9ieXRlX2luZGV4KQotCQl7Ci0JCSAgYXJlbGVudCAqciA9ICpwOwotCQkgIGJmZF9zaWduZWRfdm1hIG92OwotCi0jaWYgMAotCQkgIGlmIChyLT5ob3d0by0+cGNfcmVsYXRpdmUpCi0JCSAgICB7Ci0JCSAgICAgIHItPmFkZGVuZCArPSBjdXJyZW50X2J5dGVfaW5kZXg7Ci0JCSAgICB9Ci0jZW5kaWYKLQotCQkgIHN3aXRjaCAoci0+aG93dG8tPnNpemUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDI6Ci0KLQkJICAgICAgb3YgPSBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgc3RyZWFtICsgY3VycmVudF9ieXRlX2luZGV4KTsKLQkJICAgICAgY3VycmVudF9ieXRlX2luZGV4ICs9IDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAxOgotCQkgICAgICBvdiA9IGJmZF9nZXRfc2lnbmVkXzE2IChhYmZkLAotCQkJCQkgICAgICBzdHJlYW0gKyBjdXJyZW50X2J5dGVfaW5kZXgpOwotCQkgICAgICBjdXJyZW50X2J5dGVfaW5kZXggKz0gMjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDA6Ci0JCSAgICAgIG92ID0gYmZkX2dldF9zaWduZWRfOCAoYWJmZCwKLQkJCQkJICAgICBzdHJlYW0gKyBjdXJyZW50X2J5dGVfaW5kZXgpOwotCQkgICAgICBjdXJyZW50X2J5dGVfaW5kZXgrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBvdiA9IDA7Ci0JCSAgICAgIEJGRF9GQUlMICgpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBvdiAmPSByLT5ob3d0by0+c3JjX21hc2s7Ci0KLQkJICBpZiAoci0+aG93dG8tPnBjX3JlbGF0aXZlCi0JCSAgICAgICYmICEgci0+aG93dG8tPnBjcmVsX29mZnNldCkKLQkJICAgIG92ICs9IHItPmFkZHJlc3M7Ci0KLQkJICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJCSBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9vcGVuX2JfZW51bSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLS8qCQkgIGFib3J0KCk7Ki8KLQotCQkgIGlmIChyLT5zeW1fcHRyX3B0ciAhPSAoYXN5bWJvbCAqKikgTlVMTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgaWVlZV93cml0ZV9leHByZXNzaW9uIChhYmZkLCByLT5hZGRlbmQgKyBvdiwKLQkJCQkJCSAgICooci0+c3ltX3B0cl9wdHIpLAotCQkJCQkJICAgci0+aG93dG8tPnBjX3JlbGF0aXZlLAotCQkJCQkJICAgcy0+aW5kZXgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgaWVlZV93cml0ZV9leHByZXNzaW9uIChhYmZkLCByLT5hZGRlbmQgKyBvdiwKLQkJCQkJCSAgIChhc3ltYm9sICopIE5VTEwsCi0JCQkJCQkgICByLT5ob3d0by0+cGNfcmVsYXRpdmUsCi0JCQkJCQkgICBzLT5pbmRleCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBpZiAobnVtYmVyX29mX21hdXNfaW5fYWRkcmVzcwotCQkgICAgICAhPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHItPmhvd3RvKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsCi0JCQkJCSAgICBiZmRfZ2V0X3JlbG9jX3NpemUgKHItPmhvd3RvKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCQkgaWVlZV9mdW5jdGlvbl9laXRoZXJfY2xvc2VfYl9lbnVtKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIHJlbG9jc190b19nby0tOwotCQkgIHArKzsKLQkJfQotCi0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJZiB0aGVyZSBhcmUgbm8gcmVsb2NhdGlvbnMgaW4gdGhlIG91dHB1dCBzZWN0aW9uIHRoZW4gd2UgY2FuIGJlCi0gICBjbGV2ZXIgYWJvdXQgaG93IHdlIHdyaXRlLiAgV2UgYmxvY2sgaXRlbXMgdXAgaW50byBhIG1heCBvZiAxMjcKLSAgIGJ5dGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRvX2FzX3JlcGVhdCAoYWJmZCwgcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgaWYgKHMtPl9yYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfc2V0X2N1cnJlbnRfc2VjdGlvbl9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJKGJmZF9ieXRlKSAocy0+aW5kZXgKLQkJCQkJICAgICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NldF9jdXJyZW50X3BjX2VudW0gPj4gOCkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NldF9jdXJyZW50X3BjX2VudW0gJiAweGZmKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJKGJmZF9ieXRlKSAocy0+aW5kZXgKLQkJCQkJICAgICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHMtPmxtYSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3JlcGVhdF9kYXRhX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBzLT5fcmF3X3NpemUpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZG9fd2l0aG91dF9yZWxvY3MgKGFiZmQsIHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGJmZF9ieXRlICpzdHJlYW0gPSBpZWVlX3Blcl9zZWN0aW9uIChzKS0+ZGF0YTsKLQotICBpZiAoc3RyZWFtID09IDAgfHwgKChzLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKSkKLSAgICB7Ci0gICAgICBpZiAoISBkb19hc19yZXBlYXQgKGFiZmQsIHMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5fcmF3X3NpemU7IGkrKykKLQl7Ci0JICBpZiAoc3RyZWFtW2ldICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBkb193aXRoX3JlbG9jcyAoYWJmZCwgcykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGlmICghIGRvX2FzX3JlcGVhdCAoYWJmZCwgcykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0cl9zdGFydDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHJfZW5kOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmlucHV0X3B0cl9zdGFydDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICppbnB1dF9wdHI7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqaW5wdXRfcHRyX2VuZDsKLXN0YXRpYyBiZmQgKmlucHV0X2JmZDsKLXN0YXRpYyBiZmQgKm91dHB1dF9iZmQ7Ci1zdGF0aWMgaW50IG91dHB1dF9idWZmZXI7Ci0KLXN0YXRpYyB2b2lkCi1maWxsICgpCi17Ci0gIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0byByZWFkCi0gICAgIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gIGJmZF9yZWFkICgoUFRSKSBpbnB1dF9wdHJfc3RhcnQsIDEsIGlucHV0X3B0cl9lbmQgLSBpbnB1dF9wdHJfc3RhcnQsIGlucHV0X2JmZCk7Ci0gIGlucHV0X3B0ciA9IGlucHV0X3B0cl9zdGFydDsKLX0KLXN0YXRpYyB2b2lkCi1mbHVzaCAoKQotewotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAob3V0cHV0X3B0cl9zdGFydCksIDEsIG91dHB1dF9wdHIgLSBvdXRwdXRfcHRyX3N0YXJ0LAotCQkgb3V0cHV0X2JmZCkKLSAgICAgICE9IChiZmRfc2l6ZV90eXBlKSAob3V0cHV0X3B0ciAtIG91dHB1dF9wdHJfc3RhcnQpKQotICAgIGFib3J0ICgpOwotICBvdXRwdXRfcHRyID0gb3V0cHV0X3B0cl9zdGFydDsKLSAgb3V0cHV0X2J1ZmZlcisrOwotfQotCi0jZGVmaW5lIFRISVMoKSAoICppbnB1dF9wdHIgKQotI2RlZmluZSBORVhUKCkgeyBpbnB1dF9wdHIrKzsgaWYgKGlucHV0X3B0ciA9PSBpbnB1dF9wdHJfZW5kKSBmaWxsKCk7IH0KLSNkZWZpbmUgT1VUKHgpIHsgKm91dHB1dF9wdHIrKyA9ICh4KTsgaWYob3V0cHV0X3B0ciA9PSBvdXRwdXRfcHRyX2VuZCkgIGZsdXNoKCk7IH0KLQotc3RhdGljIHZvaWQKLXdyaXRlX2ludCAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTI3KQotICAgIHsKLSAgICAgIE9VVCAodmFsdWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0gICAgICAvKiBIb3cgbWFueSBzaWduaWZpY2FudCBieXRlcyA/ICovCi0gICAgICAvKiBGSVhNRSBGT1IgTE9OR0VSIElOVFMgKi8KLSAgICAgIGlmICh2YWx1ZSAmIDB4ZmYwMDAwMDApCi0JewotCSAgbGVuZ3RoID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmICh2YWx1ZSAmIDB4MDBmZjAwMDApCi0JewotCSAgbGVuZ3RoID0gMzsKLQl9Ci0gICAgICBlbHNlIGlmICh2YWx1ZSAmIDB4MDAwMGZmMDApCi0JewotCSAgbGVuZ3RoID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JbGVuZ3RoID0gMTsKLQotICAgICAgT1VUICgoaW50KSBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bSArIGxlbmd0aCk7Ci0gICAgICBzd2l0Y2ggKGxlbmd0aCkKLQl7Ci0JY2FzZSA0OgotCSAgT1VUICh2YWx1ZSA+PiAyNCk7Ci0JY2FzZSAzOgotCSAgT1VUICh2YWx1ZSA+PiAxNik7Ci0JY2FzZSAyOgotCSAgT1VUICh2YWx1ZSA+PiA4KTsKLQljYXNlIDE6Ci0JICBPVVQgKHZhbHVlKTsKLQl9Ci0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb3B5X2lkICgpCi17Ci0gIGludCBsZW5ndGggPSBUSElTICgpOwotICBjaGFyIGNoOwotICBPVVQgKGxlbmd0aCk7Ci0gIE5FWFQgKCk7Ci0gIHdoaWxlIChsZW5ndGgtLSkKLSAgICB7Ci0gICAgICBjaCA9IFRISVMgKCk7Ci0gICAgICBPVVQgKGNoKTsKLSAgICAgIE5FWFQgKCk7Ci0gICAgfQotfQotCi0jZGVmaW5lIFZBUih4KSAoKHggfCAweDgwKSkKLXN0YXRpYyB2b2lkCi1jb3B5X2V4cHJlc3Npb24gKCkKLXsKLSAgaW50IHN0YWNrWzEwXTsKLSAgaW50ICp0b3MgPSBzdGFjazsKLSAgaW50IHZhbHVlID0gMDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgc3dpdGNoIChUSElTICgpKQotCXsKLQljYXNlIDB4ODQ6Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgICp0b3MrKyA9IHZhbHVlOwotCSAgYnJlYWs7Ci0JY2FzZSAweDgzOgotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgICp0b3MrKyA9IHZhbHVlOwotCSAgYnJlYWs7Ci0JY2FzZSAweDgyOgotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgKnRvcysrID0gdmFsdWU7Ci0JICBicmVhazsKLQljYXNlIDB4ODE6Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgICp0b3MrKyA9IHZhbHVlOwotCSAgYnJlYWs7Ci0JY2FzZSAweDgwOgotCSAgTkVYVCAoKTsKLQkgICp0b3MrKyA9IDA7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgaWYgKFRISVMgKCkgPiAweDg0KQotCSAgICB7Ci0JICAgICAgLyogTm90IGEgbnVtYmVyLCBqdXN0IGJ1ZyBvdXQgd2l0aCB0aGUgYW5zd2VyICovCi0JICAgICAgd3JpdGVfaW50ICgqKC0tdG9zKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICAqdG9zKysgPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhhNToKLQkgIC8qIFBMVVMgYW55dGhpbmcgKi8KLQkgIHsKLQkgICAgaW50IHZhbHVlID0gKigtLXRvcyk7Ci0JICAgIHZhbHVlICs9ICooLS10b3MpOwotCSAgICAqdG9zKysgPSB2YWx1ZTsKLQkgICAgTkVYVCAoKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgVkFSICgnUicpOgotCSAgewotCSAgICBpbnQgc2VjdGlvbl9udW1iZXI7Ci0JICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotCSAgICBhc2VjdGlvbiAqczsKLQkgICAgTkVYVCAoKTsKLQkgICAgc2VjdGlvbl9udW1iZXIgPSBUSElTICgpOwotCi0JICAgIE5FWFQgKCk7Ci0JICAgIGllZWUgPSBJRUVFX0RBVEEgKGlucHV0X2JmZCk7Ci0JICAgIHMgPSBpZWVlLT5zZWN0aW9uX3RhYmxlW3NlY3Rpb25fbnVtYmVyXTsKLQkgICAgaWYgKHMtPm91dHB1dF9zZWN0aW9uKQotCSAgICAgIHsKLQkJdmFsdWUgPSBzLT5vdXRwdXRfc2VjdGlvbi0+bG1hOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJdmFsdWUgPSAwOwotCSAgICAgIH0KLQkgICAgdmFsdWUgKz0gcy0+b3V0cHV0X29mZnNldDsKLQkgICAgKnRvcysrID0gdmFsdWU7Ci0JICAgIHZhbHVlID0gMDsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgMHg5MDoKLQkgIHsKLQkgICAgTkVYVCAoKTsKLQkgICAgd3JpdGVfaW50ICgqKC0tdG9zKSk7Ci0JICAgIE9VVCAoMHg5MCk7Ci0JICAgIHJldHVybjsKLQotCSAgfQotCX0KLSAgICB9Ci0KLX0KLQotLyogRHJvcCB0aGUgaW50IGluIHRoZSBidWZmZXIsIGFuZCBjb3B5IGEgbnVsbCBpbnRvIHRoZSBnYXAsIHdoaWNoIHdlCi0gICB3aWxsIG92ZXJ3cml0ZSBsYXRlciAqLwotCi1zdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciAqcHRycDsKLSAgaW50IGJ1ZmZlcjsKLX07Ci0KLXN0YXRpYyB2b2lkCi1maWxsX2ludCAoYnVmKQotICAgICBzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3QgKmJ1ZjsKLXsKLSAgaWYgKGJ1Zi0+YnVmZmVyID09IG91dHB1dF9idWZmZXIpCi0gICAgewotICAgICAgLyogU3RpbGwgYSBjaGFuY2UgdG8gb3V0cHV0IHRoZSBzaXplICovCi0gICAgICBpbnQgdmFsdWUgPSBvdXRwdXRfcHRyIC0gYnVmLT5wdHJwICsgMzsKLSAgICAgIGJ1Zi0+cHRycFswXSA9IHZhbHVlID4+IDI0OwotICAgICAgYnVmLT5wdHJwWzFdID0gdmFsdWUgPj4gMTY7Ci0gICAgICBidWYtPnB0cnBbMl0gPSB2YWx1ZSA+PiA4OwotICAgICAgYnVmLT5wdHJwWzNdID0gdmFsdWUgPj4gMDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kcm9wX2ludCAoYnVmKQotICAgICBzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3QgKmJ1ZjsKLXsKLSAgaW50IHR5cGUgPSBUSElTICgpOwotICBpbnQgY2g7Ci0gIGlmICh0eXBlIDw9IDB4ODQpCi0gICAgewotICAgICAgTkVYVCAoKTsKLSAgICAgIHN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSAweDg0OgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODM6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCWNhc2UgMHg4MjoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgxOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODA6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBPVVQgKDB4ODQpOwotICBidWYtPnB0cnAgPSBvdXRwdXRfcHRyOwotICBidWYtPmJ1ZmZlciA9IG91dHB1dF9idWZmZXI7Ci0gIE9VVCAoMCk7Ci0gIE9VVCAoMCk7Ci0gIE9VVCAoMCk7Ci0gIE9VVCAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb3B5X2ludCAoKQotewotICBpbnQgdHlwZSA9IFRISVMgKCk7Ci0gIGludCBjaDsKLSAgaWYgKHR5cGUgPD0gMHg4NCkKLSAgICB7Ci0gICAgICBPVVQgKHR5cGUpOwotICAgICAgTkVYVCAoKTsKLSAgICAgIHN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSAweDg0OgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIE9VVCAoY2gpOwotCWNhc2UgMHg4MzoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKGNoKTsKLQljYXNlIDB4ODI6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgT1VUIChjaCk7Ci0JY2FzZSAweDgxOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIE9VVCAoY2gpOwotCWNhc2UgMHg4MDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLSNkZWZpbmUgSUQgY29weV9pZCgpCi0jZGVmaW5lIElOVCBjb3B5X2ludCgpCi0jZGVmaW5lIEVYUCBjb3B5X2V4cHJlc3Npb24oKQotc3RhdGljIHZvaWQgY29weV90aWxsX2VuZCAoKTsKLSNkZWZpbmUgSU5UbihxKSBjb3B5X2ludCgpCi0jZGVmaW5lIEVYUG4ocSkgY29weV9leHByZXNzaW9uKCkKLQotc3RhdGljIHZvaWQKLWYxX3JlY29yZCAoKQotewotICBpbnQgY2g7Ci0gIC8qIEFUTiByZWNvcmQgKi8KLSAgTkVYVCAoKTsKLSAgY2ggPSBUSElTICgpOwotICBzd2l0Y2ggKGNoKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgT1VUICgweGYxKTsKLSAgICAgIE9VVCAoY2gpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweGM5OgotICAgICAgTkVYVCAoKTsKLSAgICAgIE9VVCAoMHhmMSk7Ci0gICAgICBPVVQgKDB4YzkpOwotICAgICAgSU5UOwotICAgICAgSU5UOwotICAgICAgY2ggPSBUSElTICgpOwotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAweDE2OgotCSAgTkVYVCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMToKLQkgIE5FWFQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4MDA6Ci0JICBORVhUICgpOwotCSAgSU5UOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAzOgotCSAgTkVYVCAoKTsKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgxMzoKLQkgIEVYUG4gKGluc3RydWN0aW9uIGFkZHJlc3MpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhkODoKLSAgICAgIC8qIEVYdGVybmFsIHJlZiAqLwotICAgICAgTkVYVCAoKTsKLSAgICAgIE9VVCAoMHhmMSk7Ci0gICAgICBPVVQgKDB4ZDgpOwotICAgICAgRVhQOwotICAgICAgRVhQOwotICAgICAgRVhQOwotICAgICAgRVhQOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweGNlOgotICAgICAgTkVYVCAoKTsKLSAgICAgIE9VVCAoMHhmMSk7Ci0gICAgICBPVVQgKDB4Y2UpOwotICAgICAgSU5UOwotICAgICAgSU5UOwotICAgICAgY2ggPSBUSElTICgpOwotICAgICAgSU5UOwotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAweDAxOgotCSAgSU5UOwotCSAgSU5UOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAyOgotCSAgSU5UOwotCSAgYnJlYWs7Ci0JY2FzZSAweDA0OgotCSAgRVhQbiAoZXh0ZXJuYWwgZnVuY3Rpb24pOwotCSAgYnJlYWs7Ci0JY2FzZSAweDA1OgotCSAgYnJlYWs7Ci0JY2FzZSAweDA3OgotCSAgSU5UbiAobGluZSBudW1iZXIpOwotCSAgSU5UOwotCWNhc2UgMHgwODoKLQkgIGJyZWFrOwotCWNhc2UgMHgwYToKLQkgIElOVG4gKGxvY2tlZCByZWdpc3Rlcik7Ci0JICBJTlQ7Ci0JICBicmVhazsKLQljYXNlIDB4M2Y6Ci0JICBjb3B5X3RpbGxfZW5kICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDNlOgotCSAgY29weV90aWxsX2VuZCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHg0MDoKLQkgIGNvcHlfdGlsbF9lbmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4NDE6Ci0JICBJRDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLX0KLQotc3RhdGljIHZvaWQKLWYwX3JlY29yZCAoKQotewotICAvKiBBdHRyaWJ1dGUgcmVjb3JkICovCi0gIE5FWFQgKCk7Ci0gIE9VVCAoMHhmMCk7Ci0gIElOVG4gKFN5bWJvbCBuYW1lKTsKLSAgSUQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb3B5X3RpbGxfZW5kICgpCi17Ci0gIGludCBjaCA9IFRISVMgKCk7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHdoaWxlIChjaCA8PSAweDgwKQotCXsKLQkgIE9VVCAoY2gpOwotCSAgTkVYVCAoKTsKLQkgIGNoID0gVEhJUyAoKTsKLQl9Ci0gICAgICBzd2l0Y2ggKGNoKQotCXsKLQljYXNlIDB4ODQ6Ci0JICBPVVQgKFRISVMgKCkpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODM6Ci0JICBPVVQgKFRISVMgKCkpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODI6Ci0JICBPVVQgKFRISVMgKCkpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODE6Ci0JICBPVVQgKFRISVMgKCkpOwotCSAgTkVYVCAoKTsKLQkgIE9VVCAoVEhJUyAoKSk7Ci0JICBORVhUICgpOwotCi0JICBjaCA9IFRISVMgKCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLX0KLQotc3RhdGljIHZvaWQKLWYyX3JlY29yZCAoKQotewotICBORVhUICgpOwotICBPVVQgKDB4ZjIpOwotICBJTlQ7Ci0gIE5FWFQgKCk7Ci0gIE9VVCAoMHhjZSk7Ci0gIElOVDsKLSAgY29weV90aWxsX2VuZCAoKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBibG9jayAoKTsKLXN0YXRpYyB2b2lkCi1mOF9yZWNvcmQgKCkKLXsKLSAgaW50IGNoOwotICBORVhUICgpOwotICBjaCA9IFRISVMgKCk7Ci0gIHN3aXRjaCAoY2gpCi0gICAgewotICAgIGNhc2UgMHgwMToKLSAgICBjYXNlIDB4MDI6Ci0gICAgY2FzZSAweDAzOgotICAgICAgLyogVW5pcXVlIHR5cGVkZWZzIGZvciBtb2R1bGUgKi8KLSAgICAgIC8qIEdMb2JhbCB0eXBlZGVmcyAgKi8KLSAgICAgIC8qIEhpZ2ggbGV2ZWwgbW9kdWxlIHNjb3BlIGJlZ2lubmluZyAqLwotICAgICAgewotCXN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCBvYjsKLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUIChjaCk7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0KLQlibG9jayAoKTsKLQotCU5FWFQgKCk7Ci0JZmlsbF9pbnQgKCZvYik7Ci0JT1VUICgweGY5KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwNDoKLSAgICAgIC8qIEdsb2JhbCBmdW5jdGlvbiAqLwotICAgICAgewotCXN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCBvYjsKLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUICgweDA0KTsKLQlkcm9wX2ludCAoJm9iKTsKLQlJRDsKLQlJTlRuIChzdGFjayBzaXplKTsKLQlJTlRuIChyZXQgdmFsKTsKLQlFWFBuIChvZmZzZXQpOwotCi0JYmxvY2sgKCk7Ci0KLQlORVhUICgpOwotCU9VVCAoMHhmOSk7Ci0JRVhQbiAoc2l6ZSBvZiBibG9jayk7Ci0JZmlsbF9pbnQgKCZvYik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMHgwNToKLSAgICAgIC8qIEZpbGUgbmFtZSBmb3Igc291cmNlIGxpbmUgbnVtYmVycyAqLwotICAgICAgewotCXN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCBvYjsKLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUICgweDA1KTsKLQlkcm9wX2ludCAoJm9iKTsKLQlJRDsKLQlJTlRuICh5ZWFyKTsKLQlJTlRuIChtb250aCk7Ci0JSU5UbiAoZGF5KTsKLQlJTlRuIChob3VyKTsKLQlJTlRuIChtb251dGUpOwotCUlOVG4gKHNlY29uZCk7Ci0JYmxvY2sgKCk7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjkpOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MDY6Ci0gICAgICAvKiBMb2NhbCBmdW5jdGlvbiAqLwotICAgICAgewotCXN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCBvYjsKLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUICgweDA2KTsKLQlkcm9wX2ludCAoJm9iKTsKLQlJRDsKLQlJTlRuIChzdGFjayBzaXplKTsKLQlJTlRuICh0eXBlIHJldHVybik7Ci0JRVhQbiAob2Zmc2V0KTsKLQlibG9jayAoKTsKLQlORVhUICgpOwotCU9VVCAoMHhmOSk7Ci0JRVhQbiAoc2l6ZSk7Ci0JZmlsbF9pbnQgKCZvYik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMHgwYToKLSAgICAgIC8qIEFzc2VtYmxlciBtb2R1bGUgc2NvcGUgYmVnaW5uaW5nIC0qLwotICAgICAgewotCXN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCBvYjsKLQotCU5FWFQgKCk7Ci0JT1VUICgweGY4KTsKLQlPVVQgKDB4MGEpOwotCWRyb3BfaW50ICgmb2IpOwotCUlEOwotCUlEOwotCUlOVDsKLQlJRDsKLQlJTlQ7Ci0JSU5UOwotCUlOVDsKLQlJTlQ7Ci0JSU5UOwotCUlOVDsKLQotCWJsb2NrICgpOwotCi0JTkVYVCAoKTsKLQlPVVQgKDB4ZjkpOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDBiOgotICAgICAgewotCXN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCBvYjsKLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUICgweDBiKTsKLQlkcm9wX2ludCAoJm9iKTsKLQlJRDsKLQlJTlQ7Ci0JSU5UbiAoc2VjdGlvbiBpbmRleCk7Ci0JRVhQbiAob2Zmc2V0KTsKLQlJTlRuIChzdHVmZik7Ci0KLQlibG9jayAoKTsKLQotCU9VVCAoMHhmOSk7Ci0JTkVYVCAoKTsKLQlFWFBuIChTaXplIGluIE1hdXMpOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZTJfcmVjb3JkICgpCi17Ci0gIE9VVCAoMHhlMik7Ci0gIE5FWFQgKCk7Ci0gIE9VVCAoMHhjZSk7Ci0gIE5FWFQgKCk7Ci0gIElOVDsKLSAgRVhQOwotfQotCi1zdGF0aWMgdm9pZAotYmxvY2sgKCkKLXsKLSAgaW50IGNoOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjaCA9IFRISVMgKCk7Ci0gICAgICBzd2l0Y2ggKGNoKQotCXsKLQljYXNlIDB4ZTE6Ci0JY2FzZSAweGU1OgotCSAgcmV0dXJuOwotCWNhc2UgMHhmOToKLQkgIHJldHVybjsKLQljYXNlIDB4ZjA6Ci0JICBmMF9yZWNvcmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4ZjE6Ci0JICBmMV9yZWNvcmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4ZjI6Ci0JICBmMl9yZWNvcmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4Zjg6Ci0JICBmOF9yZWNvcmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4ZTI6Ci0JICBlMl9yZWNvcmQgKCk7Ci0JICBicmVhazsKLQotCX0KLSAgICB9Ci19Ci0KLQotCi0vKiByZWxvY2F0ZV9kZWJ1ZywKLSAgIG1vdmVzIGFsbCB0aGUgZGVidWcgaW5mb3JtYXRpb24gZnJvbSB0aGUgc291cmNlIGJmZCB0byB0aGUgb3V0cHV0Ci0gICBiZmQsIGFuZCByZWxvY2F0ZXMgYW55IGV4cHJlc3Npb25zIGl0IGZpbmRzCi0qLwotCi1zdGF0aWMgdm9pZAotcmVsb2NhdGVfZGVidWcgKG91dHB1dCwgaW5wdXQpCi0gICAgIGJmZCAqb3V0cHV0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqaW5wdXQ7Ci17Ci0jZGVmaW5lIElCUyA0MDAKLSNkZWZpbmUgT0JTIDQwMAotICB1bnNpZ25lZCBjaGFyIGlucHV0X2J1ZmZlcltJQlNdOwotCi0gIGlucHV0X3B0cl9zdGFydCA9IGlucHV0X3B0ciA9IGlucHV0X2J1ZmZlcjsKLSAgaW5wdXRfcHRyX2VuZCA9IGlucHV0X2J1ZmZlciArIElCUzsKLSAgaW5wdXRfYmZkID0gaW5wdXQ7Ci0gIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0byByZWFkCi0gICAgIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gIGJmZF9yZWFkICgoUFRSKSBpbnB1dF9wdHJfc3RhcnQsIDEsIElCUywgaW5wdXQpOwotICBibG9jayAoKTsKLX0KLQotLyoKLSAgRHVyaW5nIGxpbmtpbmcsIHdlIHdlIHRvbGQgYWJvdXQgdGhlIGJmZHMgd2hpY2ggbWFkZSB1cCBvdXIKLSAgY29udGVudHMsIHdlIGhhdmUgYSBsaXN0IG9mIHRoZW0uIFRoZXkgd2lsbCBzdGlsbCBiZSBvcGVuLCBzbyBnbyB0bwotICB0aGUgZGVidWcgaW5mbyBpbiBlYWNoLCBhbmQgY29weSBpdCBvdXQsIHJlbG9jYXRpbmcgaXQgYXMgd2UgZ28uCi0qLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9kZWJ1Z19wYXJ0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgYmZkX2NoYWluX3R5cGUgKmNoYWluID0gaWVlZS0+Y2hhaW5fcm9vdDsKLSAgdW5zaWduZWQgY2hhciBvdXRwdXRfYnVmZmVyW09CU107Ci0gIGJvb2xlYW4gc29tZV9kZWJ1ZyA9IGZhbHNlOwotICBmaWxlX3B0ciBoZXJlID0gYmZkX3RlbGwgKGFiZmQpOwotCi0gIG91dHB1dF9wdHJfc3RhcnQgPSBvdXRwdXRfcHRyID0gb3V0cHV0X2J1ZmZlcjsKLSAgb3V0cHV0X3B0cl9lbmQgPSBvdXRwdXRfYnVmZmVyICsgT0JTOwotICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1ZmZlcjsKLSAgb3V0cHV0X2JmZCA9IGFiZmQ7Ci0KLSAgaWYgKGNoYWluID09IChiZmRfY2hhaW5fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQlpZiAoKHMtPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQl7Ci0JICBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9IDA7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID0gaGVyZTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKHMtPmNvbnRlbnRzLCAxLCBzLT5fcmF3X3NpemUsIGFiZmQpICE9IHMtPl9yYXdfc2l6ZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKGNoYWluICE9IChiZmRfY2hhaW5fdHlwZSAqKSBOVUxMKQotCXsKLQkgIGJmZCAqZW50cnkgPSBjaGFpbi0+dGhpczsKLQkgIGllZWVfZGF0YV90eXBlICplbnRyeV9pZWVlID0gSUVFRV9EQVRBIChlbnRyeSk7Ci0JICBpZiAoZW50cnlfaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQpCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGVudHJ5LCBlbnRyeV9pZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCwKLQkJCSAgICBTRUVLX1NFVCkKLQkJICAhPSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGVfZGVidWcgKGFiZmQsIGVudHJ5KTsKLQkgICAgfQotCi0JICBjaGFpbiA9IGNoYWluLT5uZXh0OwotCX0KLSAgICAgIGlmIChzb21lX2RlYnVnKQotCXsKLQkgIGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID0gaGVyZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPSAwOwotCX0KLQotICAgICAgZmx1c2ggKCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSB0aGUgZGF0YSBpbiBhbiBpZWVlIHdheS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2RhdGFfcGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBpZWVlLT53LnIuZGF0YV9wYXJ0ID0gYmZkX3RlbGwgKGFiZmQpOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgLyogU2tpcCBzZWN0aW9ucyB0aGF0IGhhdmUgbm8gbG9hZGFibGUgY29udGVudHMgKC5ic3MsCi0gICAgICAgICBkZWJ1Z2dpbmcsIGV0Yy4pICAqLwotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTb3J0IHRoZSByZWxvYyByZWNvcmRzIHNvIHdlIGNhbiBpbnNlcnQgdGhlbSBpbiB0aGUgY29ycmVjdAotCSBwbGFjZXMgKi8KLSAgICAgIGlmIChzLT5yZWxvY19jb3VudCAhPSAwKQotCXsKLQkgIGlmICghIGRvX3dpdGhfcmVsb2NzIChhYmZkLCBzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBkb193aXRob3V0X3JlbG9jcyAoYWJmZCwgcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBib29sZWFuCi1pbml0X2Zvcl9vdXRwdXQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLQljb250aW51ZTsKLSAgICAgIGlmIChzLT5fcmF3X3NpemUgIT0gMCkKLQl7Ci0JICBpZWVlX3Blcl9zZWN0aW9uIChzKS0+ZGF0YSA9IChiZmRfYnl0ZSAqKSAoYmZkX2FsbG9jIChhYmZkLCBzLT5fcmF3X3NpemUpKTsKLQkgIGlmICghaWVlZV9wZXJfc2VjdGlvbiAocyktPmRhdGEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKiBleGVjIGFuZCBjb3JlIGZpbGUgc2VjdGlvbnMgKi8KLQotLyogc2V0IHNlY3Rpb24gY29udGVudHMgaXMgY29tcGxpY2F0ZWQgd2l0aCBJRUVFIHNpbmNlIHRoZSBmb3JtYXQgaXMKLSogbm90IGEgYnl0ZSBpbWFnZSwgYnV0IGEgcmVjb3JkIHN0cmVhbS4KLSovCi1ib29sZWFuCi1pZWVlX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQotCQkJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2VjdGlvbi0+X3Jhd19zaXplKSk7Ci0JICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIC8qIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgZXZlcnl0aGluZwotICAgICAgICAgaXMgd2l0aGluIHJhbmdlLiAgKi8KLSAgICAgIG1lbWNweSAoc2VjdGlvbi0+Y29udGVudHMgKyBvZmZzZXQsIGxvY2F0aW9uLCBjb3VudCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGllZWVfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhID09IChiZmRfYnl0ZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghaW5pdF9mb3Jfb3V0cHV0IChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBtZW1jcHkgKChQVFIpIChpZWVlX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSArIG9mZnNldCksCi0JICAoUFRSKSBsb2NhdGlvbiwKLQkgICh1bnNpZ25lZCBpbnQpIGNvdW50KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIHRoZSBleHRlcm5hbCBzeW1ib2xzIG9mIGEgZmlsZS4gIElFRUUgY29uc2lkZXJzIHR3byBzb3J0cyBvZgotICAgZXh0ZXJuYWwgc3ltYm9scywgcHVibGljLCBhbmQgcmVmZXJlbmNlZC4gIEl0IHVzZXMgdG8gaW50ZXJuYWwKLSAgIGZvcm1zIHRvIGluZGV4IHRoZW0gYXMgd2VsbC4gIFdoZW4gd2Ugd3JpdGUgdGhlbSBvdXQgd2UgdHVybiB0aGVpcgotICAgc3ltYm9sIHZhbHVlcyBpbnRvIGluZGV4ZXMgZnJvbSB0aGUgcmlnaHQgYmFzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2V4dGVybmFsX3BhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqKnE7Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLQotICB1bnNpZ25lZCBpbnQgcmVmZXJlbmNlX2luZGV4ID0gSUVFRV9SRUZFUkVOQ0VfQkFTRTsKLSAgdW5zaWduZWQgaW50IHB1YmxpY19pbmRleCA9IElFRUVfUFVCTElDX0JBU0UgKyAyOwotICBmaWxlX3B0ciBoZXJlID0gYmZkX3RlbGwgKGFiZmQpOwotICBib29sZWFuIGhhZG9uZSA9IGZhbHNlOwotICBpZiAoYWJmZC0+b3V0c3ltYm9scyAhPSAoYXN5bWJvbCAqKikgTlVMTCkKLSAgICB7Ci0KLSAgICAgIGZvciAocSA9IGFiZmQtPm91dHN5bWJvbHM7ICpxICE9IChhc3ltYm9sICopIE5VTEw7IHErKykKLQl7Ci0JICBhc3ltYm9sICpwID0gKnE7Ci0JICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChwLT5zZWN0aW9uKSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgbXVzdCBiZSBhIHN5bWJvbCByZWZlcmVuY2UgLi4gKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcmVmZXJlbmNlX2luZGV4KQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoYWJmZCwgcC0+bmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBwLT52YWx1ZSA9IHJlZmVyZW5jZV9pbmRleDsKLQkgICAgICByZWZlcmVuY2VfaW5kZXgrKzsKLQkgICAgICBoYWRvbmUgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHdlYWsgcmVmZXJlbmNlICovCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHJlZmVyZW5jZV9pbmRleCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGFiZmQsIHAtPm5hbWUpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJCWllZWVfd2Vha19leHRlcm5hbF9yZWZlcmVuY2VfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCByZWZlcmVuY2VfaW5kZXgpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcC0+dmFsdWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcC0+dmFsdWUgPSByZWZlcmVuY2VfaW5kZXg7Ci0JICAgICAgcmVmZXJlbmNlX2luZGV4Kys7Ci0JICAgICAgaGFkb25lID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAocC0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBtdXN0IGJlIGEgc3ltYm9sIGRlZmluaXRpb24gKi8KLQotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlcm5hbF9zeW1ib2xfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBwdWJsaWNfaW5kZXgpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2lkIChhYmZkLCBwLT5uYW1lKQotCQkgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGllZWVfYXR0cmlidXRlX3JlY29yZF9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHB1YmxpY19pbmRleCkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMTUpIC8qIGluc3RydWN0aW9uIGFkZHJlc3MgKi8KLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMTkpIC8qIHN0YXRpYyBzeW1ib2wgKi8KLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMSkpIC8qIG9uZSBvZiB0aGVtICovCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIFdyaXRlIG91dCB0aGUgdmFsdWUgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV92YWx1ZV9yZWNvcmRfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBwdWJsaWNfaW5kZXgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChwLT5zZWN0aW9uKSkKLQkJewotCQkgIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLQkJICAgIHsKLQkJICAgICAgLyogSWYgZnVsbHkgbGlua2VkLCB0aGVuIG91dHB1dCBhbGwgc3ltYm9scwotCQkJIHJlbG9jYXRlZCAqLwotCQkgICAgICBpZiAoISAoaWVlZV93cml0ZV9pbnQKLQkJCSAgICAgKGFiZmQsCi0JCQkgICAgICAocC0+dmFsdWUKLQkJCSAgICAgICArIHAtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgICArIHAtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISAoaWVlZV93cml0ZV9leHByZXNzaW9uCi0JCQkgICAgIChhYmZkLAotCQkJICAgICAgcC0+dmFsdWUgKyBwLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAotCQkJICAgICAgcC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnN5bWJvbCwKLQkJCSAgICAgIGZhbHNlLCAwKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISBpZWVlX3dyaXRlX2V4cHJlc3Npb24gKGFiZmQsCi0JCQkJCSAgICAgICBwLT52YWx1ZSwKLQkJCQkJICAgICAgIGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCwKLQkJCQkJICAgICAgIGZhbHNlLCAwKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIHAtPnZhbHVlID0gcHVibGljX2luZGV4OwotCSAgICAgIHB1YmxpY19pbmRleCsrOwotCSAgICAgIGhhZG9uZSA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiAtIHdoZW4gdGhlcmUgYXJlIGdhcHMgaW4gdGhlIHN5bWJvbHMgcmVhZCAqLwotCSAgICAgIC8qIGZyb20gYW4gaW5wdXQgaWVlZSBmaWxlICovCi0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAoaGFkb25lKQotICAgIGllZWUtPncuci5leHRlcm5hbF9wYXJ0ID0gaGVyZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgQ09OU1QgdW5zaWduZWQgY2hhciBleHRlbltdID0KLXsKLSAgMHhmMCwgMHgyMCwgMHgwMCwKLSAgMHhmMSwgMHhjZSwgMHgyMCwgMHgwMCwgMzcsIDMsIDMsCS8qIFNldCB2ZXJzaW9uIDMgcmV2IDMgICAJKi8KLSAgMHhmMSwgMHhjZSwgMHgyMCwgMHgwMCwgMzksIDIsLyoga2VlcCBzeW1ib2wgaW4gIG9yaWdpbmFsIGNhc2UgKi8KLSAgMHhmMSwgMHhjZSwgMHgyMCwgMHgwMCwgMzgJLyogc2V0IG9iamVjdCB0eXBlIHJlbG9jYXRlYWJsZSB0byB4ICovCi19OwotCi1zdGF0aWMgQ09OU1QgdW5zaWduZWQgY2hhciBlbnZpW10gPQotewotICAweGYwLCAweDIxLCAweDAwLAotCi0vKiAgICAweGYxLCAweGNlLCAweDIxLCAwMCwgNTAsIDB4ODIsIDB4MDcsIDB4YzcsIDB4MDksIDB4MTEsIDB4MTEsCi0gICAgMHgxOSwgMHgyYywKLSovCi0gIDB4ZjEsIDB4Y2UsIDB4MjEsIDAwLCA1MiwgMHgwMCwJLyogZXhlYyBvayAqLwotCi0gIDB4ZjEsIDB4Y2UsIDB4MjEsIDAsIDUzLCAweDAzLC8qIGhvc3QgdW5peCAqLwotLyogICAgMHhmMSwgMHhjZSwgMHgyMSwgMCwgNTQsIDIsMSwxCXRvb2wgJiB2ZXJzaW9uICMgKi8KLX07Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX21lX3BhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBpZWVlLT53LnIudHJhaWxlcl9wYXJ0ID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoYWJmZC0+c3RhcnRfYWRkcmVzcykKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV92YWx1ZV9zdGFydGluZ19hZGRyZXNzX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9mdW5jdGlvbl9laXRoZXJfb3Blbl9iX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBhYmZkLT5zdGFydF9hZGRyZXNzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZnVuY3Rpb25fZWl0aGVyX2Nsb3NlX2JfZW51bSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWVlZS0+dy5yLm1lX3JlY29yZCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX21vZHVsZV9lbmRfZW51bSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBJRUVFIHByb2Nlc3NvciBJRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX3Byb2Nlc3NvciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2g7Ci0KLSAgYXJjaCA9IGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKTsKLSAgc3dpdGNoIChhcmNoLT5hcmNoKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgYmZkX3ByaW50YWJsZV9uYW1lIChhYmZkKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiMjkwMDAiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfaDgzMDA6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiSDgvMzAwIikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2g4NTAwOgotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIkg4LzUwMCIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgc3dpdGNoIChhcmNoLT5tYWNoKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX21hY2hfaTk2MF9jb3JlOgotCWNhc2UgYmZkX21hY2hfaTk2MF9rYV9zYToKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICI4MDk2MEtBIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfbWFjaF9pOTYwX2tiX3NiOgotCSAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIjgwOTYwS0IiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9tYWNoX2k5NjBfY2E6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiODA5NjBDQSIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX21hY2hfaTk2MF9tYzoKLQljYXNlIGJmZF9tYWNoX2k5NjBfeGE6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiODA5NjBNQyIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIHsKLQljb25zdCBjaGFyICppZDsKLQotCXN3aXRjaCAoYXJjaC0+bWFjaCkKLQkgIHsKLQkgIGRlZmF1bHQ6CQlpZCA9ICI2ODAyMCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwMDA6IGlkID0gIjY4MDAwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODAwODogaWQgPSAiNjgwMDgiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDEwOiBpZCA9ICI2ODAxMCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwMjA6IGlkID0gIjY4MDIwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODAzMDogaWQgPSAiNjgwMzAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDQwOiBpZCA9ICI2ODA0MCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwNjA6IGlkID0gIjY4MDYwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2NwdTMyOiAgaWQgPSAiY3B1MzIiOyBicmVhazsKLQkgIH0KLQotCWlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsIGlkKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotaWVlZV93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgZmlsZV9wdHIgb2xkOwotCi0gIC8qIEZhc3QgZm9yd2FyZCBvdmVyIHRoZSBoZWFkZXIgYXJlYSAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9tb2R1bGVfYmVnaW5uaW5nX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfcHJvY2Vzc29yIChhYmZkKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChhYmZkLCBhYmZkLT5maWxlbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEZhc3QgZm9yd2FyZCBvdmVyIHRoZSB2YXJpYWJsZSBiaXRzICovCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9hZGRyZXNzX2Rlc2NyaXB0b3JfZW51bSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEJpdHMgcGVyIE1BVSAqLwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgKGJmZF9hcmNoX2JpdHNfcGVyX2J5dGUgKGFiZmQpKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAvKiBNQVUncyBwZXIgYWRkcmVzcyAqLwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkgKGJmZF9ieXRlKSAoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCkKLQkJCQkgICAgIC8gYmZkX2FyY2hfYml0c19wZXJfYnl0ZSAoYWJmZCkpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgb2xkID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKDggKiBOX1dfVkFSSUFCTEVTKSwgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGllZWUtPncuci5leHRlbnNpb25fcmVjb3JkID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSBleHRlbiwgMSwgc2l6ZW9mIChleHRlbiksIGFiZmQpICE9IHNpemVvZiAoZXh0ZW4pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMHgxKSkgLyogQWJzb2x1dGUgKi8KLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAweDIpKSAvKiBSZWxvY2F0ZWFibGUgKi8KLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGllZWUtPncuci5lbnZpcm9ubWVudGFsX3JlY29yZCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgaWYgKGJmZF93cml0ZSAoKGNoYXIgKikgZW52aSwgMSwgc2l6ZW9mIChlbnZpKSwgYWJmZCkgIT0gc2l6ZW9mIChlbnZpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIEhQIGVtdWxhdG9yIGRhdGFiYXNlIHJlcXVpcmVzIGEgdGltZXN0YW1wIGluIHRoZSBmaWxlLiAgKi8KLSAgewotICAgIHRpbWVfdCBub3c7Ci0gICAgY29uc3Qgc3RydWN0IHRtICp0OwotCi0gICAgdGltZSAoJm5vdyk7Ci0gICAgdCA9IChzdHJ1Y3QgdG0gKikgbG9jYWx0aW1lICgmbm93KTsKLSAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDB4MjEpCi0JfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDApCi0JfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDUwKQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX3llYXIgKyAxOTAwKQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX21vbiArIDEpCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1fbWRheSkKLQl8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCB0LT50bV9ob3VyKQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX21pbikKLQl8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCB0LT50bV9zZWMpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgb3V0cHV0X2JmZCA9IGFiZmQ7Ci0KLSAgZmx1c2ggKCk7Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9zZWN0aW9uX3BhcnQgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgLyogRmlyc3Qgd3JpdGUgdGhlIHN5bWJvbHMuICBUaGlzIGNoYW5nZXMgdGhlaXIgdmFsdWVzIGludG8gdGFibGUKLSAgICBpbmRlY2VzIHNvIHdlIGNhbnQgdXNlIGl0IGFmdGVyIHRoaXMgcG9pbnQuICAqLwotICBpZiAoISBpZWVlX3dyaXRlX2V4dGVybmFsX3BhcnQgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiAgaWVlZV93cml0ZV9ieXRlKGFiZmQsIGllZWVfcmVjb3JkX3NlcGVyYXRvcl9lbnVtKTsqLwotCi0gIC8qICBpZWVlX3dyaXRlX2J5dGUoYWJmZCwgaWVlZV9yZWNvcmRfc2VwZXJhdG9yX2VudW0pOyovCi0KLQotICAvKiBXcml0ZSBhbnkgZGVidWdzIHdlIGhhdmUgYmVlbiB0b2xkIGFib3V0LiAgKi8KLSAgaWYgKCEgaWVlZV93cml0ZV9kZWJ1Z19wYXJ0IChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ2FuIG9ubHkgd3JpdGUgdGhlIGRhdGEgb25jZSB0aGUgc3ltYm9scyBoYXZlIGJlZW4gd3JpdHRlbiwgc2luY2UKLSAgICAgdGhlIGRhdGEgY29udGFpbnMgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB3aGljaCBwb2ludHMgdG8gdGhlCi0gICAgIHN5bWJvbHMuICAqLwotICBpZiAoISBpZWVlX3dyaXRlX2RhdGFfcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEF0IHRoZSBlbmQgd2UgcHV0IHRoZSBlbmQhICAqLwotICBpZiAoISBpZWVlX3dyaXRlX21lX3BhcnQgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZW5lcmF0ZSB0aGUgaGVhZGVyICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2xkLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5fV19WQVJJQUJMRVM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpIGkpCi0JICB8fCAhIGllZWVfd3JpdGVfaW50NV9vdXQgKGFiZmQsIGllZWUtPncub2Zmc2V0W2ldKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogTmF0aXZlLWxldmVsIGludGVyZmFjZSB0byBzeW1ib2xzLiAqLwotCi0vKiBXZSByZWFkIHRoZSBzeW1ib2xzIGludG8gYSBidWZmZXIsIHdoaWNoIGlzIGRpc2NhcmRlZCB3aGVuIHRoaXMKLSAgIGZ1bmN0aW9uIGV4aXRzLiAgV2UgcmVhZCB0aGUgc3RyaW5ncyBpbnRvIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0bwotICAgaG9sZCB0aGVtIGFsbCBwbHVzIGFsbCB0aGUgY2FjaGVkIHN5bWJvbCBlbnRyaWVzLiAqLwotCi1hc3ltYm9sICoKLWllZWVfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9zeW1ib2xfdHlwZSAqbmV3ID0KLSAgICAoaWVlZV9zeW1ib2xfdHlwZSAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChpZWVlX3N5bWJvbF90eXBlKSk7Ci0gIGlmICghbmV3KQotICAgIHJldHVybiBOVUxMOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotc3RhdGljIGJmZCAqCi1pZWVlX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaCwgcHJldikKLSAgICAgYmZkICphcmNoOwotICAgICBiZmQgKnByZXY7Ci17Ci0gIGllZWVfYXJfZGF0YV90eXBlICphciA9IElFRUVfQVJfREFUQSAoYXJjaCk7Ci0gIC8qIHRha2UgdGhlIG5leHQgb25lIGZyb20gdGhlIGFyY2ggc3RhdGUsIG9yIHJlc2V0ICovCi0gIGlmIChwcmV2ID09IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBSZXNldCB0aGUgaW5kZXggLSB0aGUgZmlyc3QgdHdvIGVudHJpZXMgYXJlIGJvZ3VzKi8KLSAgICAgIGFyLT5lbGVtZW50X2luZGV4ID0gMjsKLSAgICB9Ci0gIHdoaWxlICh0cnVlKQotICAgIHsKLSAgICAgIGllZWVfYXJfb2JzdGFja190eXBlICpwID0gYXItPmVsZW1lbnRzICsgYXItPmVsZW1lbnRfaW5kZXg7Ci0gICAgICBhci0+ZWxlbWVudF9pbmRleCsrOwotICAgICAgaWYgKGFyLT5lbGVtZW50X2luZGV4IDw9IGFyLT5lbGVtZW50X2NvdW50KQotCXsKLQkgIGlmIChwLT5maWxlX29mZnNldCAhPSAoZmlsZV9wdHIpIDApCi0JICAgIHsKLQkgICAgICBpZiAocC0+YWJmZCA9PSAoYmZkICopIE5VTEwpCi0JCXsKLQkJICBwLT5hYmZkID0gX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsIChhcmNoKTsKLQkJICBwLT5hYmZkLT5vcmlnaW4gPSBwLT5maWxlX29mZnNldDsKLQkJfQotCSAgICAgIHJldHVybiBwLT5hYmZkOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKLQkgIHJldHVybiAoYmZkICopIE5VTEw7Ci0JfQotCi0gICAgfQotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwKLQkJCXNlY3Rpb24sCi0JCQlzeW1ib2xzLAotCQkJb2Zmc2V0LAotCQkJZmlsZW5hbWVfcHRyLAotCQkJZnVuY3Rpb25uYW1lX3B0ciwKLQkJCWxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludAotaWVlZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqYnVmOwotewotICBpZWVlX2FyX2RhdGFfdHlwZSAqYXIgPSAoaWVlZV9hcl9kYXRhX3R5cGUgKikgTlVMTDsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0KLSAgaWYgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLSAgICBhciA9IGFiZmQtPm15X2FyY2hpdmUtPnRkYXRhLmllZWVfYXJfZGF0YTsKLSAgaWYgKGFyID09IChpZWVlX2FyX2RhdGFfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChJRUVFX0RBVEEgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGllZWVfb2JqZWN0X3AgKGFiZmQpID09IE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICBpZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLQotICBidWYtPnN0X3NpemUgPSBpZWVlLT53LnIubWVfcmVjb3JkICsgMTsKLSAgYnVmLT5zdF9tb2RlID0gMDY0NDsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWllZWVfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuIHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogVGhlIGRlYnVnIGluZm8gcm91dGluZXMgYXJlIG5ldmVyIHVzZWQuICAqLwotI2lmIDAKLQotc3RhdGljIHZvaWQKLWllZWVfYmZkX2RlYnVnX2luZm9fc3RhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLQotfQotCi1zdGF0aWMgdm9pZAotaWVlZV9iZmRfZGVidWdfaW5mb19lbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLQotfQotCi0KLS8qIEFkZCB0aGlzIHNlY3Rpb24gdG8gdGhlIGxpc3Qgb2Ygc2VjdGlvbnMgd2UgaGF2ZSBkZWJ1ZyBpbmZvIGZvciwgdG8KLSAgIGJlIHJlYWR5IHRvIG91dHB1dCBpdCBhdCBjbG9zZSB0aW1lCi0gICAqLwotc3RhdGljIHZvaWQKLWllZWVfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZSAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKHNlY3Rpb24tPm93bmVyKTsKLSAgaWVlZV9kYXRhX3R5cGUgKm91dHB1dF9pZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgLyogY2FuIG9ubHkgYWNjdW11bGF0ZSBkYXRhIGZyb20gb3RoZXIgaWVlZSBiZmRzICovCi0gIGlmIChzZWN0aW9uLT5vd25lci0+eHZlYyAhPSBhYmZkLT54dmVjKQotICAgIHJldHVybjsKLSAgLyogT25seSBib3RoZXIgb25jZSBwZXIgYmZkICovCi0gIGlmIChpZWVlLT5kb25lX2RlYnVnID09IHRydWUpCi0gICAgcmV0dXJuOwotICBpZWVlLT5kb25lX2RlYnVnID0gdHJ1ZTsKLQotICAvKiBEb24ndCBib3RoZXIgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mbyAqLwotICBpZiAoaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPT0gMCkKLSAgICByZXR1cm47Ci0KLQotICAvKiBBZGQgdG8gY2hhaW4gKi8KLSAgewotICAgIGJmZF9jaGFpbl90eXBlICpuID0gKGJmZF9jaGFpbl90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChiZmRfY2hhaW5fdHlwZSkpOwotICAgIGlmICghbikKLSAgICAgIGFib3J0ICgpOwkJLyogRklYTUUgKi8KLSAgICBuLT50aGlzID0gc2VjdGlvbi0+b3duZXI7Ci0gICAgbi0+bmV4dCA9IChiZmRfY2hhaW5fdHlwZSAqKSBOVUxMOwotCi0gICAgaWYgKG91dHB1dF9pZWVlLT5jaGFpbl9oZWFkKQotICAgICAgewotCW91dHB1dF9pZWVlLT5jaGFpbl9oZWFkLT5uZXh0ID0gbjsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0Jb3V0cHV0X2llZWUtPmNoYWluX3Jvb3QgPSBuOwotCi0gICAgICB9Ci0gICAgb3V0cHV0X2llZWUtPmNoYWluX2hlYWQgPSBuOwotICB9Ci19Ci0KLSNlbmRpZgotCi0jZGVmaW5lCWllZWVfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIGllZWVfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgaWVlZV9zbHVycF9hcm1hcCBiZmRfdHJ1ZQotI2RlZmluZSBpZWVlX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmZkX3RydWUKLSNkZWZpbmUgaWVlZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfdHJ1ZSkKLSNkZWZpbmUgaWVlZV90cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIGllZWVfd3JpdGVfYXJtYXAgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSkpIFwKLSAgIGJmZF90cnVlKQotI2RlZmluZSBpZWVlX3JlYWRfYXJfaGRyIGJmZF9udWxsdm9pZHB0cgotI2RlZmluZSBpZWVlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLSNkZWZpbmUgaWVlZV9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0KLSNkZWZpbmUgaWVlZV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGllZWVfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGllZWVfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBpZWVlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgaWVlZV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBpZWVlX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIGllZWVfc2V0X2FyY2hfbWFjaCBfYmZkX2dlbmVyaWNfc2V0X2FyY2hfbWFjaAotCi0jZGVmaW5lIGllZWVfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2RlZmluZSBpZWVlX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgaWVlZV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGllZWVfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIGllZWVfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgaWVlZV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBpZWVlX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIGllZWVfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi0vKlNVUFBSRVNTIDQ2MCAqLwotY29uc3QgYmZkX3RhcmdldCBpZWVlX3ZlYyA9Ci17Ci0gICJpZWVlIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfaWVlZV9mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LAotICAgaWVlZV9vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGllZWVfYXJjaGl2ZV9wLAotICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgaWVlZV9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIGllZWVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGllZWUpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGllZWUpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGllZWUpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvaWhleC5jIGIvYmZkL2loZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc3NDBkOC4uMDAwMDAwMAotLS0gYS9iZmQvaWhleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA0MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIEhleCBvYmplY3RzLgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3Igb2YgQ3lnbnVzIFN1cHBvcnQgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIHdoYXQgSW50ZWwgSGV4IGZpbGVzIGxvb2sgbGlrZToKLQotMS4gSU5URUwgRk9STUFUUwotCi1BLiBJbnRlbCAxCi0KLSAgIDE2LWJpdCBhZGRyZXNzLWZpZWxkIGZvcm1hdCwgZm9yIGZpbGVzIDY0ayBieXRlcyBpbiBsZW5ndGggb3IgbGVzcy4KLQotICAgREFUQSBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbig6KQotICAgMi4uMwkJVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIGhleCBub3RhdGlvbgotICAgNC4uNQkJSGlnaCBieXRlIG9mIHRoZSByZWNvcmQgbG9hZCBhZGRyZXNzCi0gICA2Li43CQlMb3cgYnl0ZSBvZiB0aGUgcmVjb3JkIGxvYWQgYWRkcmVzcwotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjAwIgotICAgMTAuLngJRGF0YSBieXRlcyBpbiBoZXggbm90YXRpb246Ci0JeCA9IChudW1iZXIgb2YgYnl0ZXMgLSAxKSAqIDIgKyAxMQotICAgeCsxLi54KzIJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICB4KzMuLngrNAlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotCi0gICBFTkQgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24gKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDAiCi0gICA0Li43CQlUcmFuc2Zlci1hZGRyZXNzICh1c3VhbGx5ICIwMDAwIikKLQkJdGhlIGp1bXAtdG8gYWRkcmVzcywgZXhlY3V0aW9uIHN0YXJ0IGFkZHJlc3MKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMSIKLSAgIDEwLi4xMQlDaGVja3N1bSwgaW4gaGV4IG5vdGF0aW9uCi0gICAxMi4uMTMJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotQi4gSU5URUwgMgotCi0gICBNQ1MtODYgZm9ybWF0LCB1c2luZyBhIDIwLWJpdCBhZGRyZXNzIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA2NEsgYnl0ZXMuCi0KLSAgIERBVEEgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24gKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCBvZiB0aGlzIHJlY29yZCwgaGV4IG5vdGF0aW9uCi0gICA0Li41CQlIaWdoIGJ5dGUgb2YgdGhlIHJlY29yZCBsb2FkIGFkZHJlc3MKLSAgIDYuLjcJCUxvdyBieXRlIG9mIHRoZSByZWNvcmQgbG9hZCBhZGRyZXNzCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDAiCi0gICAxMC4ueAlUaGUgZGF0YSBieXRlcyBpbiBoZXggbm90YXRpb246Ci0JeCA9IChudW1iZXIgb2YgZGF0YSBieXRlcyAtIDEpICogMiArIDExCi0gICB4KzEuLngrMglDaGVja3N1bSBpbiBoZXggbm90YXRpb24KLSAgIHgrMy4ueCs0CUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLSAgIEVYVEVOREVEIEFERFJFU1MgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24oOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwMiIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMiIKLSAgIDEwLi4xMQlIaWdoIGJ5dGUgb2YgdGhlIG9mZnNldCBhZGRyZXNzCi0gICAxMi4uMTMJTG93IGJ5dGUgb2YgdGhlIG9mZnNldCBhZGRyZXNzCi0gICAxNC4uMTUJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICAxNi4uMTcJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotICAgVGhlIGNoZWNrc3VtcyBhcmUgdGhlIHR3bydzIGNvbXBsZW1lbnQgb2YgdGhlIDgtYml0IHN1bQotICAgd2l0aG91dCBjYXJyeSBvZiB0aGUgYnl0ZSBjb3VudCwgb2Zmc2V0IGFkZHJlc3MsIGFuZCB0aGUKLSAgIHJlY29yZCB0eXBlLgotCi0gICBTVEFSVCBBRERSRVNTIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQsIG11c3QgYmUgIjA0IgotICAgNC4uNwkJTG9hZCBhZGRyZXNzLCBtdXN0IGJlICIwMDAwIgotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjAzIgotICAgMTAuLjEzCTgwODYgQ1MgdmFsdWUKLSAgIDE0Li4xNwk4MDg2IElQIHZhbHVlCi0gICAxOC4uMTkJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICAyMC4uMjEJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotQW5vdGhlciBkb2N1bWVudCByZXBvcnRzIHRoZXNlIGFkZGl0aW9uYWwgdHlwZXM6Ci0KLSAgIEVYVEVOREVEIExJTkVBUiBBRERSRVNTIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQsIG11c3QgYmUgIjAyIgotICAgNC4uNwkJTG9hZCBhZGRyZXNzLCBtdXN0IGJlICIwMDAwIgotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjA0IgotICAgMTAuLjEzCVVwcGVyIDE2IGJpdHMgb2YgYWRkcmVzcyBvZiBzdWJzZXF1ZW50IHJlY29yZHMKLSAgIDE0Li4xNQlDaGVja3N1bSBpbiBoZXggbm90YXRpb24KLSAgIDE2Li4xNwlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotCi0gICBTVEFSVCBMSU5FQVIgQUREUkVTUyBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwMiIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwNSIKLSAgIDEwLi4xMwlVcHBlciAxNiBiaXRzIG9mIHN0YXJ0IGFkZHJlc3MKLSAgIDE0Li4xNQlDaGVja3N1bSBpbiBoZXggbm90YXRpb24KLSAgIDE2Li4xNwlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotCi1UaGUgTVJJIGNvbXBpbGVyIHVzZXMgdGhpcywgd2hpY2ggaXMgYSByZXBlYXQgb2YgdHlwZSA1OgotCi0gIEVYVEVOREVEIFNUQVJUIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQsIG11c3QgYmUgIjA0IgotICAgNC4uNwkJTG9hZCBhZGRyZXNzLCBtdXN0IGJlICIwMDAwIgotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjA1IgotICAgMTAuLjEzCVVwcGVyIDE2IGJpdHMgb2Ygc3RhcnQgYWRkcmVzcwotICAgMTQuLjE3CUxvd2VyIDE2IGJpdHMgb2Ygc3RhcnQgYWRkcmVzcwotICAgMTguLjE5CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgMjAuLjIxCUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1zdGF0aWMgdm9pZCBpaGV4X2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gaWhleF9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIElOTElORSBpbnQgaWhleF9nZXRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgdm9pZCBpaGV4X2JhZF9ieXRlIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWhleF9zY2FuIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqaWhleF9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaWhleF9yZWFkX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICopKTsKLXN0YXRpYyBib29sZWFuIGloZXhfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIGloZXhfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIGloZXhfd3JpdGVfcmVjb3JkCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBiZmRfdm1hLCB1bnNpZ25lZCBpbnQsIGJmZF9ieXRlICopKTsKLXN0YXRpYyBib29sZWFuIGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqaWhleF9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaWhleF9zZXRfYXJjaF9tYWNoCi0gIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBpbnQgaWhleF9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdlIHB1dCBvbiBvbmUgbGluZSBkdXJpbmcgb3V0cHV0LiAgKi8KLQotI2RlZmluZSBDSFVOSyAoMjEpCi0KLS8qIE1hY3JvcyBmb3IgY29udmVydGluZyBiZXR3ZWVuIGhleCBhbmQgYmluYXJ5LiAqLwotCi0jZGVmaW5lIE5JQkJMRSh4KSAoaGV4X3ZhbHVlICh4KSkKLSNkZWZpbmUgSEVYMihidWZmZXIpICgoTklCQkxFICgoYnVmZmVyKVswXSkgPDwgNCkgKyBOSUJCTEUgKChidWZmZXIpWzFdKSkKLSNkZWZpbmUgSEVYNChidWZmZXIpICgoSEVYMiAoYnVmZmVyKSA8PCA4KSArIEhFWDIgKChidWZmZXIpICsgMikpCi0jZGVmaW5lIElTSEVYKHgpIChoZXhfcCAoeCkpCi0KLS8qIFdoZW4gd2Ugd3JpdGUgb3V0IGFuIGloZXggdmFsdWUsIHRoZSB2YWx1ZXMgY2FuIG5vdCBiZSBvdXRwdXQgYXMKLSAgIHRoZXkgYXJlIHNlZW4uICBJbnN0ZWFkLCB3ZSBob2xkIHRoZW0gaW4gbWVtb3J5IGluIHRoaXMgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGloZXhfZGF0YV9saXN0Ci17Ci0gIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqbmV4dDsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIGJmZF92bWEgd2hlcmU7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLX07Ci0KLS8qIFRoZSBpaGV4IHRkYXRhIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QKLXsKLSAgc3RydWN0IGloZXhfZGF0YV9saXN0ICpoZWFkOwotICBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKnRhaWw7Ci19OwotCi0vKiBJbml0aWFsaXplIGJ5IGZpbGxpbmcgaW4gdGhlIGhleCBjb252ZXJzaW9uIGFycmF5LiAgKi8KLQotc3RhdGljIHZvaWQKLWloZXhfaW5pdCAoKQotewotICBzdGF0aWMgYm9vbGVhbiBpbml0ZWQ7Ci0KLSAgaWYgKCEgaW5pdGVkKQotICAgIHsKLSAgICAgIGluaXRlZCA9IHRydWU7Ci0gICAgICBoZXhfaW5pdCAoKTsKLSAgICB9Ci19Ci0KLS8qIENyZWF0ZSBhbiBpaGV4IG9iamVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1paGV4X21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT50ZGF0YS5paGV4X2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWhleF9kYXRhX3N0cnVjdCAqdGRhdGE7Ci0KLSAgICAgIHRkYXRhID0gKChzdHJ1Y3QgaWhleF9kYXRhX3N0cnVjdCAqKQotCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QpKSk7Ci0gICAgICBpZiAodGRhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBhYmZkLT50ZGF0YS5paGV4X2RhdGEgPSB0ZGF0YTsKLSAgICAgIHRkYXRhLT5oZWFkID0gTlVMTDsKLSAgICAgIHRkYXRhLT50YWlsID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBieXRlIGZyb20gYSBCRkQuICBTZXQgKkVSUk9SUFRSIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICAgUmV0dXJuIEVPRiBvbiBlcnJvciBvciBlbmQgb2YgZmlsZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1paGV4X2dldF9ieXRlIChhYmZkLCBlcnJvcnB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuICplcnJvcnB0cjsKLXsKLSAgYmZkX2J5dGUgYzsKLQotICBpZiAoYmZkX3JlYWQgKCZjLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKLQkqZXJyb3JwdHIgPSB0cnVlOwotICAgICAgcmV0dXJuIEVPRjsKLSAgICB9Ci0KLSAgcmV0dXJuIChpbnQpIChjICYgMHhmZik7Ci19Ci0KLS8qIFJlcG9ydCBhIHByb2JsZW0gaW4gYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotaWhleF9iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcikKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgbGluZW5vOwotICAgICBpbnQgYzsKLSAgICAgYm9vbGVhbiBlcnJvcjsKLXsKLSAgaWYgKGMgPT0gRU9GKQotICAgIHsKLSAgICAgIGlmICghIGVycm9yKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciBidWZbMTBdOwotCi0gICAgICBpZiAoISBpc3ByaW50IChjKSkKLQlzcHJpbnRmIChidWYsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSBjKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBidWZbMF0gPSBjOwotCSAgYnVmWzFdID0gJ1wwJzsKLQl9Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6JWQ6IHVuZXhwZWN0ZWQgY2hhcmFjdGVyIGAlcycgaW4gSW50ZWwgSGV4IGZpbGVcbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vLCBidWYpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgfQotfQotCi0vKiBSZWFkIGFuIEludGVsIGhleCBmaWxlIGFuZCB0dXJuIGl0IGludG8gc2VjdGlvbnMuICBXZSBjcmVhdGUgYSBuZXcKLSAgIHNlY3Rpb24gZm9yIGVhY2ggY29udGlndW91cyBzZXQgb2YgYnl0ZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9zY2FuIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF92bWEgc2VnYmFzZTsKLSAgYmZkX3ZtYSBleHRiYXNlOwotICBhc2VjdGlvbiAqc2VjOwotICBpbnQgbGluZW5vOwotICBib29sZWFuIGVycm9yOwotICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKLSAgc2l6ZV90IGJ1ZnNpemU7Ci0gIGludCBjOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBhYmZkLT5zdGFydF9hZGRyZXNzID0gMDsKLQotICBzZWdiYXNlID0gMDsKLSAgZXh0YmFzZSA9IDA7Ci0gIHNlYyA9IE5VTEw7Ci0gIGxpbmVubyA9IDE7Ci0gIGVycm9yID0gZmFsc2U7Ci0gIGJ1ZnNpemUgPSAwOwotICB3aGlsZSAoKGMgPSBpaGV4X2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YpCi0gICAgewotICAgICAgaWYgKGMgPT0gJ1xyJykKLQljb250aW51ZTsKLSAgICAgIGVsc2UgaWYgKGMgPT0gJ1xuJykKLQl7Ci0JICArK2xpbmVubzsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKGMgIT0gJzonKQotCXsKLQkgIGloZXhfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZpbGVfcHRyIHBvczsKLQkgIGNoYXIgaGRyWzhdOwotCSAgdW5zaWduZWQgaW50IGk7Ci0JICB1bnNpZ25lZCBpbnQgbGVuOwotCSAgYmZkX3ZtYSBhZGRyOwotCSAgdW5zaWduZWQgaW50IHR5cGU7Ci0JICB1bnNpZ25lZCBpbnQgY2hhcnM7Ci0JICB1bnNpZ25lZCBpbnQgY2hrc3VtOwotCi0JICAvKiBUaGlzIGlzIGEgZGF0YSByZWNvcmQuICAqLwotCi0JICBwb3MgPSBiZmRfdGVsbCAoYWJmZCkgLSAxOwotCi0JICAvKiBSZWFkIHRoZSBoZWFkZXIgYnl0ZXMuICAqLwotCi0JICBpZiAoYmZkX3JlYWQgKGhkciwgMSwgOCwgYWJmZCkgIT0gOCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoISBJU0hFWCAoaGRyW2ldKSkKLQkJewotCQkgIGloZXhfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgaGRyW2ldLCBlcnJvcik7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCi0JICBsZW4gPSBIRVgyIChoZHIpOwotCSAgYWRkciA9IEhFWDQgKGhkciArIDIpOwotCSAgdHlwZSA9IEhFWDIgKGhkciArIDYpOwotCi0JICAvKiBSZWFkIHRoZSBkYXRhIGJ5dGVzLiAgKi8KLQotCSAgY2hhcnMgPSBsZW4gKiAyICsgMjsKLQkgIGlmIChjaGFycyA+PSBidWZzaXplKQotCSAgICB7Ci0JICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChidWYsIGNoYXJzKTsKLQkgICAgICBpZiAoYnVmID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGJ1ZnNpemUgPSBjaGFyczsKLQkgICAgfQotCi0JICBpZiAoYmZkX3JlYWQgKGJ1ZiwgMSwgY2hhcnMsIGFiZmQpICE9IGNoYXJzKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgZm9yIChpID0gMDsgaSA8IGNoYXJzOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoISBJU0hFWCAoYnVmW2ldKSkKLQkJewotCQkgIGloZXhfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgaGRyW2ldLCBlcnJvcik7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCi0JICAvKiBDaGVjayB0aGUgY2hlY2tzdW0uICAqLwotCSAgY2hrc3VtID0gbGVuICsgYWRkciArIChhZGRyID4+IDgpICsgdHlwZTsKLQkgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkgICAgY2hrc3VtICs9IEhFWDIgKGJ1ZiArIDIgKiBpKTsKLQkgIGlmICgoKC0gY2hrc3VtKSAmIDB4ZmYpICE9ICh1bnNpZ25lZCBpbnQpIEhFWDIgKGJ1ZiArIDIgKiBpKSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6JWQ6IGJhZCBjaGVja3N1bSBpbiBJbnRlbCBIZXggZmlsZSAoZXhwZWN0ZWQgJXUsIGZvdW5kICV1KSIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubywKLQkJICgtIGNoa3N1bSkgJiAweGZmLCAodW5zaWduZWQgaW50KSBIRVgyIChidWYgKyAyICogaSkpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAodHlwZSkKLQkgICAgewotCSAgICBjYXNlIDA6Ci0JICAgICAgLyogVGhpcyBpcyBhIGRhdGEgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAoc2VjICE9IE5VTEwKLQkJICAmJiBzZWMtPnZtYSArIHNlYy0+X3Jhd19zaXplID09IGV4dGJhc2UgKyBzZWdiYXNlICsgYWRkcikKLQkJewotCQkgIC8qIFRoaXMgZGF0YSBnb2VzIGF0IHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gd2UgYXJlCi0gICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkgYnVpbGRpbmcuICAqLwotCQkgIHNlYy0+X3Jhd19zaXplICs9IGxlbjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxlbiA+IDApCi0JCXsKLQkJICBjaGFyIHNlY2J1ZlsyMF07Ci0JCSAgY2hhciAqc2VjbmFtZTsKLQotCQkgIHNwcmludGYgKHNlY2J1ZiwgIi5zZWMlZCIsIGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkgKyAxKTsKLQkJICBzZWNuYW1lID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHNlY2J1ZikgKyAxKTsKLQkJICBpZiAoc2VjbmFtZSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3RyY3B5IChzZWNuYW1lLCBzZWNidWYpOwotCQkgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIHNlY25hbWUpOwotCQkgIGlmIChzZWMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHNlYy0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0JCSAgc2VjLT52bWEgPSBleHRiYXNlICsgc2VnYmFzZSArIGFkZHI7Ci0JCSAgc2VjLT5sbWEgPSBleHRiYXNlICsgc2VnYmFzZSArIGFkZHI7Ci0JCSAgc2VjLT5fcmF3X3NpemUgPSBsZW47Ci0JCSAgc2VjLT5maWxlcG9zID0gcG9zOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAxOgotCSAgICAgIC8qIEFuIGVuZCByZWNvcmQuICAqLwotCSAgICAgIGlmIChhYmZkLT5zdGFydF9hZGRyZXNzID09IDApCi0JCWFiZmQtPnN0YXJ0X2FkZHJlc3MgPSBhZGRyOwotCSAgICAgIGlmIChidWYgIT0gTlVMTCkKLQkJZnJlZSAoYnVmKTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQotCSAgICBjYXNlIDI6Ci0JICAgICAgLyogQW4gZXh0ZW5kZWQgYWRkcmVzcyByZWNvcmQuICAqLwotCSAgICAgIGlmIChsZW4gIT0gMikKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiVkOiBiYWQgZXh0ZW5kZWQgYWRkcmVzcyByZWNvcmQgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIHNlZ2Jhc2UgPSBIRVg0IChidWYpIDw8IDQ7Ci0KLQkgICAgICBzZWMgPSBOVUxMOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAzOgotCSAgICAgIC8qIEFuIGV4dGVuZGVkIHN0YXJ0IGFkZHJlc3MgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAobGVuICE9IDQpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczolZDogYmFkIGV4dGVuZGVkIHN0YXJ0IGFkZHJlc3MgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIGFiZmQtPnN0YXJ0X2FkZHJlc3MgKz0gKEhFWDQgKGJ1ZikgPDwgNCkgKyBIRVg0IChidWYgKyA0KTsKLQotCSAgICAgIHNlYyA9IE5VTEw7Ci0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDQ6Ci0JICAgICAgLyogQW4gZXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAobGVuICE9IDIpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczolZDogYmFkIGV4dGVuZGVkIGxpbmVhciBhZGRyZXNzIHJlY29yZCBsZW5ndGggaW4gSW50ZWwgSGV4IGZpbGUiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgZXh0YmFzZSA9IEhFWDQgKGJ1ZikgPDwgMTY7Ci0KLQkgICAgICBzZWMgPSBOVUxMOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSA1OgotCSAgICAgIC8qIEFuIGV4dGVuZGVkIGxpbmVhciBzdGFydCBhZGRyZXNzIHJlY29yZC4gICovCi0JICAgICAgaWYgKGxlbiAhPSAyICYmIGxlbiAhPSA0KQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6JWQ6IGJhZCBleHRlbmRlZCBsaW5lYXIgc3RhcnQgYWRkcmVzcyBsZW5ndGggaW4gSW50ZWwgSGV4IGZpbGUiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgaWYgKGxlbiA9PSAyKQotCQlhYmZkLT5zdGFydF9hZGRyZXNzICs9IEhFWDQgKGJ1ZikgPDwgMTY7Ci0JICAgICAgZWxzZQotCQlhYmZkLT5zdGFydF9hZGRyZXNzID0gKEhFWDQgKGJ1ZikgPDwgMTYpICsgSEVYNCAoYnVmICsgNCk7Ci0KLQkgICAgICBzZWMgPSBOVUxMOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiVkOiB1bnJlY29nbml6ZWQgaWhleCB0eXBlICV1IGluIEludGVsIEhleCBmaWxlXG4iKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8sIHR5cGUpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZXJyb3IpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRyeSB0byByZWNvZ25pemUgYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1paGV4X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9ieXRlIGJbOV07Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLQotICBpaGV4X2luaXQgKCk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotICBpZiAoYmZkX3JlYWQgKGIsIDEsIDksIGFiZmQpICE9IDkpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChiWzBdICE9ICc6JykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBmb3IgKGkgPSAxOyBpIDwgOTsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIElTSEVYIChiW2ldKSkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgdHlwZSA9IEhFWDIgKGIgKyA3KTsKLSAgaWYgKHR5cGUgPiA1KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9LLCBpdCBsb29rcyBsaWtlIGl0IHJlYWxseSBpcyBhbiBJbnRlbCBIZXggZmlsZS4gICovCi0KLSAgaWYgKCEgaWhleF9ta29iamVjdCAoYWJmZCkKLSAgICAgIHx8ICEgaWhleF9zY2FuIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfcmVhZF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBjb250ZW50cykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBpbnQgYzsKLSAgYmZkX2J5dGUgKnA7Ci0gIGJmZF9ieXRlICpidWYgPSBOVUxMOwotICBzaXplX3QgYnVmc2l6ZTsKLSAgYm9vbGVhbiBlcnJvcjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHAgPSBjb250ZW50czsKLSAgYnVmc2l6ZSA9IDA7Ci0gIGVycm9yID0gZmFsc2U7Ci0gIHdoaWxlICgoYyA9IGloZXhfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRikKLSAgICB7Ci0gICAgICBjaGFyIGhkcls4XTsKLSAgICAgIHVuc2lnbmVkIGludCBsZW47Ci0gICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKLQljb250aW51ZTsKLQotICAgICAgLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgaWhleF9zY2FuIGhhcyBzdWNjZWVkZWQsIHNvIHdlIG91Z2h0IHRvCi0gICAgICAgICBrbm93IHRoZSBleGFjdCBmb3JtYXQuICAqLwotICAgICAgQkZEX0FTU0VSVCAoYyA9PSAnOicpOwotCi0gICAgICBpZiAoYmZkX3JlYWQgKGhkciwgMSwgOCwgYWJmZCkgIT0gOCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgbGVuID0gSEVYMiAoaGRyKTsKLSAgICAgIGFkZHIgPSBIRVg0IChoZHIgKyAyKTsKLSAgICAgIHR5cGUgPSBIRVgyIChoZHIgKyA2KTsKLQotICAgICAgLyogV2Ugc2hvdWxkIG9ubHkgc2VlIHR5cGUgMCByZWNvcmRzIGhlcmUuICAqLwotICAgICAgaWYgKHR5cGUgIT0gMCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBpbnRlcm5hbCBlcnJvciBpbiBpaGV4X3JlYWRfc2VjdGlvbiIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGlmIChsZW4gKiAyID4gYnVmc2l6ZSkKLQl7Ci0JICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3JlYWxsb2MgKGJ1ZiwgbGVuICogMik7Ci0JICBpZiAoYnVmID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgYnVmc2l6ZSA9IGxlbiAqIDI7Ci0JfQotCi0gICAgICBpZiAoYmZkX3JlYWQgKGJ1ZiwgMSwgbGVuICogMiwgYWJmZCkgIT0gbGVuICogMikKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCSpwKysgPSBIRVgyIChidWYgKyAyICogaSk7Ci0gICAgICBpZiAoKGJmZF9zaXplX3R5cGUpIChwIC0gY29udGVudHMpID49IHNlY3Rpb24tPl9yYXdfc2l6ZSkKLQl7Ci0JICAvKiBXZSd2ZSByZWFkIGV2ZXJ5dGhpbmcgaW4gdGhlIHNlY3Rpb24uICAqLwotCSAgaWYgKGJ1ZiAhPSBOVUxMKQotCSAgICBmcmVlIChidWYpOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBTa2lwIHRoZSBjaGVja3N1bS4gICovCi0gICAgICBpZiAoYmZkX3JlYWQgKGJ1ZiwgMSwgMiwgYWJmZCkgIT0gMikKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKChiZmRfc2l6ZV90eXBlKSAocCAtIGNvbnRlbnRzKSA8IHNlY3Rpb24tPl9yYXdfc2l6ZSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGJhZCBzZWN0aW9uIGxlbmd0aCBpbiBpaGV4X3JlYWRfc2VjdGlvbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogR2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24gaW4gYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoc2VjdGlvbi0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT51c2VkX2J5X2JmZCA9IGJmZF9hbGxvYyAoYWJmZCwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzZWN0aW9uLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGloZXhfcmVhZF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBzZWN0aW9uLT51c2VkX2J5X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBtZW1jcHkgKGxvY2F0aW9uLCAoYmZkX2J5dGUgKikgc2VjdGlvbi0+dXNlZF9ieV9iZmQgKyBvZmZzZXQsCi0JICAoc2l6ZV90KSBjb3VudCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgc3RydWN0IGloZXhfZGF0YV9saXN0ICpuOwotICBiZmRfYnl0ZSAqZGF0YTsKLSAgc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKnRkYXRhOwotCi0gIGlmIChjb3VudCA9PSAwCi0gICAgICB8fCAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDAKLSAgICAgIHx8IChzZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIG4gPSAoKHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqKQotICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaWhleF9kYXRhX2xpc3QpKSk7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBjb3VudCk7Ci0gIGlmIChkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1jcHkgKGRhdGEsIGxvY2F0aW9uLCAoc2l6ZV90KSBjb3VudCk7Ci0KLSAgbi0+ZGF0YSA9IGRhdGE7Ci0gIG4tPndoZXJlID0gc2VjdGlvbi0+bG1hICsgb2Zmc2V0OwotICBuLT5zaXplID0gY291bnQ7Ci0KLSAgLyogU29ydCB0aGUgcmVjb3JkcyBieSBhZGRyZXNzLiAgT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSBvZgotICAgICBhZGRpbmcgYSByZWNvcmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gICovCi0gIHRkYXRhID0gYWJmZC0+dGRhdGEuaWhleF9kYXRhOwotICBpZiAodGRhdGEtPnRhaWwgIT0gTlVMTAotICAgICAgJiYgbi0+d2hlcmUgPj0gdGRhdGEtPnRhaWwtPndoZXJlKQotICAgIHsKLSAgICAgIHRkYXRhLT50YWlsLT5uZXh0ID0gbjsKLSAgICAgIG4tPm5leHQgPSBOVUxMOwotICAgICAgdGRhdGEtPnRhaWwgPSBuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqKnBwOwotCi0gICAgICBmb3IgKHBwID0gJnRkYXRhLT5oZWFkOwotCSAgICpwcCAhPSBOVUxMICYmICgqcHApLT53aGVyZSA8IG4tPndoZXJlOwotCSAgIHBwID0gJigqcHApLT5uZXh0KQotCTsKLSAgICAgIG4tPm5leHQgPSAqcHA7Ci0gICAgICAqcHAgPSBuOwotICAgICAgaWYgKG4tPm5leHQgPT0gTlVMTCkKLQl0ZGF0YS0+dGFpbCA9IG47Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhIHJlY29yZCBvdXQgdG8gYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF93cml0ZV9yZWNvcmQgKGFiZmQsIGNvdW50LCBhZGRyLCB0eXBlLCBkYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotewotICBzdGF0aWMgY29uc3QgY2hhciBkaWdzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0gIGNoYXIgYnVmWzkgKyBDSFVOSyAqIDIgKyA0XTsKLSAgY2hhciAqcDsKLSAgdW5zaWduZWQgaW50IGNoa3N1bTsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSNkZWZpbmUgVE9IRVgoYnVmLCB2KSBcCi0gICgoYnVmKVswXSA9IGRpZ3NbKCh2KSA+PiA0KSAmIDB4Zl0sIChidWYpWzFdID0gZGlnc1sodikgJiAweGZdKQotCi0gIGJ1ZlswXSA9ICc6JzsKLSAgVE9IRVggKGJ1ZiArIDEsIGNvdW50KTsKLSAgVE9IRVggKGJ1ZiArIDMsIChhZGRyID4+IDgpICYgMHhmZik7Ci0gIFRPSEVYIChidWYgKyA1LCBhZGRyICYgMHhmZik7Ci0gIFRPSEVYIChidWYgKyA3LCB0eXBlKTsKLQotICBjaGtzdW0gPSBjb3VudCArIGFkZHIgKyAoYWRkciA+PiA4KSArIHR5cGU7Ci0KLSAgZm9yIChpID0gMCwgcCA9IGJ1ZiArIDk7IGkgPCBjb3VudDsgaSsrLCBwICs9IDIsIGRhdGErKykKLSAgICB7Ci0gICAgICBUT0hFWCAocCwgKmRhdGEpOwotICAgICAgY2hrc3VtICs9ICpkYXRhOwotICAgIH0KLQotICBUT0hFWCAocCwgKC0gY2hrc3VtKSAmIDB4ZmYpOwotICBwWzJdID0gJ1xyJzsKLSAgcFszXSA9ICdcbic7Ci0KLSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA5ICsgY291bnQgKiAyICsgNCwgYWJmZCkgIT0gOSArIGNvdW50ICogMiArIDQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX3ZtYSBzZWdiYXNlOwotICBiZmRfdm1hIGV4dGJhc2U7Ci0gIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqbDsKLQotICBzZWdiYXNlID0gMDsKLSAgZXh0YmFzZSA9IDA7Ci0gIGZvciAobCA9IGFiZmQtPnRkYXRhLmloZXhfZGF0YS0+aGVhZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHdoZXJlOwotICAgICAgYmZkX2J5dGUgKnA7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotCi0gICAgICB3aGVyZSA9IGwtPndoZXJlOwotICAgICAgcCA9IGwtPmRhdGE7Ci0gICAgICBjb3VudCA9IGwtPnNpemU7Ci0gICAgICB3aGlsZSAoY291bnQgPiAwKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgbm93OwotCi0JICBub3cgPSBjb3VudDsKLQkgIGlmIChub3cgPiBDSFVOSykKLQkgICAgbm93ID0gQ0hVTks7Ci0KLQkgIGlmICh3aGVyZSA+IHNlZ2Jhc2UgKyBleHRiYXNlICsgMHhmZmZmKQotCSAgICB7Ci0JICAgICAgYmZkX2J5dGUgYWRkclsyXTsKLQotCSAgICAgIC8qIFdlIG5lZWQgYSBuZXcgYmFzZSBhZGRyZXNzLiAgKi8KLQkgICAgICBpZiAod2hlcmUgPD0gMHhmZmZmZikKLQkJewotCQkgIC8qIFRoZSBhZGRyZXNzZXMgc2hvdWxkIGJlIHNvcnRlZC4gICovCi0JCSAgQkZEX0FTU0VSVCAoZXh0YmFzZSA9PSAwKTsKLQotCQkgIHNlZ2Jhc2UgPSB3aGVyZSAmIDB4ZjAwMDA7Ci0JCSAgYWRkclswXSA9IChiZmRfYnl0ZSkoc2VnYmFzZSA+PiAxMikgJiAweGZmOwotCQkgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKHNlZ2Jhc2UgPj4gNCkgJiAweGZmOwotCQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCAyLCAwLCAyLCBhZGRyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoZSBleHRlbmRlZCBhZGRyZXNzIHJlY29yZCBhbmQgdGhlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICBsaW5lYXIgYWRkcmVzcyByZWNvcmQgYXJlIGNvbWJpbmVkLCBhdCBsZWFzdCBieQotICAgICAgICAgICAgICAgICAgICAgc29tZSByZWFkZXJzLiAgV2UgbmVlZCBhbiBleHRlbmRlZCBsaW5lYXIgYWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgcmVjb3JkIGhlcmUsIHNvIGlmIHdlJ3ZlIGFscmVhZHkgd3JpdHRlbiBvdXQgYW4KLSAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkIGFkZHJlc3MgcmVjb3JkLCB6ZXJvIGl0IG91dCB0byBhdm9pZAotICAgICAgICAgICAgICAgICAgICAgY29uZnVzaW9uLiAgKi8KLQkJICBpZiAoc2VnYmFzZSAhPSAwKQotCQkgICAgewotCQkgICAgICBhZGRyWzBdID0gMDsKLQkJICAgICAgYWRkclsxXSA9IDA7Ci0JCSAgICAgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCAyLCAwLCAyLCBhZGRyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgc2VnYmFzZSA9IDA7Ci0JCSAgICB9Ci0KLQkJICBleHRiYXNlID0gd2hlcmUgJiAweGZmZmYwMDAwOwotCQkgIGlmICh3aGVyZSA+IGV4dGJhc2UgKyAweGZmZmYpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgYnVmWzIwXTsKLQotCQkgICAgICBzcHJpbnRmX3ZtYSAoYnVmLCB3aGVyZSk7Ci0JCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJKF8oIiVzOiBhZGRyZXNzIDB4JXMgb3V0IG9mIHJhbmdlIGZvciBJbnRleCBIZXggZmlsZSIpLAotCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBidWYpOwotCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGV4dGJhc2UgPj4gMjQpICYgMHhmZjsKLQkJICBhZGRyWzFdID0gKGJmZF9ieXRlKShleHRiYXNlID4+IDE2KSAmIDB4ZmY7Ci0JCSAgaWYgKCEgaWhleF93cml0ZV9yZWNvcmQgKGFiZmQsIDIsIDAsIDQsIGFkZHIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgaWhleF93cml0ZV9yZWNvcmQgKGFiZmQsIG5vdywgd2hlcmUgLSAoZXh0YmFzZSArIHNlZ2Jhc2UpLAotCQkJCSAgIDAsIHApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIHdoZXJlICs9IG5vdzsKLQkgIHAgKz0gbm93OwotCSAgY291bnQgLT0gbm93OwotCX0KLSAgICB9Ci0KLSAgaWYgKGFiZmQtPnN0YXJ0X2FkZHJlc3MgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN0YXJ0OwotICAgICAgYmZkX2J5dGUgc3RhcnRidWZbNF07Ci0KLSAgICAgIHN0YXJ0ID0gYWJmZC0+c3RhcnRfYWRkcmVzczsKLQotICAgICAgaWYgKHN0YXJ0IDw9IDB4ZmZmZmYpCi0JewotCSAgc3RhcnRidWZbMF0gPSAoYmZkX2J5dGUpKChzdGFydCAmIDB4ZjAwMDApID4+IDEyKSAmIDB4ZmY7Ci0JICBzdGFydGJ1ZlsxXSA9IDA7Ci0JICBzdGFydGJ1ZlsyXSA9IChiZmRfYnl0ZSkoc3RhcnQgPj4gOCkgJiAweGZmOwotCSAgc3RhcnRidWZbM10gPSAoYmZkX2J5dGUpc3RhcnQgJiAweGZmOwotCSAgaWYgKCEgaWhleF93cml0ZV9yZWNvcmQgKGFiZmQsIDQsIDAsIDMsIHN0YXJ0YnVmKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdGFydGJ1ZlswXSA9IChiZmRfYnl0ZSkoc3RhcnQgPj4gMjQpICYgMHhmZjsKLQkgIHN0YXJ0YnVmWzFdID0gKGJmZF9ieXRlKShzdGFydCA+PiAxNikgJiAweGZmOwotCSAgc3RhcnRidWZbMl0gPSAoYmZkX2J5dGUpKHN0YXJ0ID4+IDgpICYgMHhmZjsKLQkgIHN0YXJ0YnVmWzNdID0gKGJmZF9ieXRlKXN0YXJ0ICYgMHhmZjsKLQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCA0LCAwLCA1LCBzdGFydGJ1ZikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCAwLCAwLCAxLCBOVUxMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYW4gZW1wdHkgc3ltYm9sLiAgVGhpcyBpcyByZXF1aXJlZCBvbmx5IGJlY2F1c2UKLSAgIGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IHdhbnRzIHRvIGNyZWF0ZSBhIHN5bWJvbCBmb3IgdGhlIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqCi1paGV4X21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldzsKLQotICBuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldyAhPSBOVUxMKQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIGZvciB0aGUgb3V0cHV0IGZpbGUuICBUaGUgYXJjaGl0ZWN0dXJlIGlzCi0gICBpcnJlbGV2YW50LCBzbyB3ZSBpZ25vcmUgZXJyb3JzIGFib3V0IHVua25vd24gYXJjaGl0ZWN0dXJlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1paGV4X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLXsKLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCkpCi0gICAgewotICAgICAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBzaXplIG9mIHRoZSBoZWFkZXJzLCBmb3IgdGhlIGxpbmtlci4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotaWhleF9zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZXhlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotLyogU29tZSByYW5kb20gZGVmaW5pdGlvbnMgZm9yIHRoZSB0YXJnZXQgdmVjdG9yLiAgKi8KLQotI2RlZmluZQlpaGV4X2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBpaGV4X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBpaGV4X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLSNkZWZpbmUgaWhleF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgaWhleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGJmZF8wbAotI2RlZmluZSBpaGV4X2dldF9zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKLSNkZWZpbmUgaWhleF9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGloZXhfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBpaGV4X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGloZXhfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGloZXhfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaWhleF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGloZXhfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGloZXhfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBpaGV4X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQotI2RlZmluZSBpaGV4X2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgYmZkXzBsKQotI2RlZmluZSBpaGV4X2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIGloZXhfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBpaGV4X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgaWhleF9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgaWhleF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBpaGV4X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGloZXhfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgaWhleF9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotLyogVGhlIEludGVsIEhleCB0YXJnZXQgdmVjdG9yLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCBpaGV4X3ZlYyA9Ci17Ci0gICJpaGV4IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIDAsCQkJCS8qIG9iamVjdCBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIGloZXhfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgaWhleF9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgaWhleF93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChpaGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoaWhleCksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvaW5pdC5jIGIvYmZkL2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhMWQ1MC4uMDAwMDAwMAotLS0gYS9iZmQvaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogYmZkIGluaXRpYWxpemF0aW9uIHN0dWZmCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qCi1TRUNUSU9OCi0JSW5pdGlhbGl6YXRpb24KLQotCVRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIGluaXRpYWxpemluZyBhIEJGRC4KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9pbml0Ci0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfaW5pdCh2b2lkKTsKLQotREVTQ1JJUFRJT04KLQlUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBCRkQgZnVuY3Rpb24gdG8KLQlpbml0aWFsaXplIG1hZ2ljYWwgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgotKi8KLQotLyogQWN0dWFsbHksIHRoZXJlIGlzIGN1cnJlbnRseSBub3RoaW5nIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGRvLgotICAgSG93ZXZlciwgc29tZWRheSBpdCBtYXkgYmUgbmVlZGVkLCBzbyBrZWVwIGl0IGFyb3VuZC4gICovCi0KLXZvaWQKLWJmZF9pbml0ICgpCi17Ci19CmRpZmYgLS1naXQgYS9iZmQvaXJpeC1jb3JlLmMgYi9iZmQvaXJpeC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNmU2YTcuLjAwMDAwMDAKLS0tIGEvYmZkL2lyaXgtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSXJpeCBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0dSBHcm9zc21hbiwgQ3lnbnVzIFN1cHBvcnQuCi0gICBDb252ZXJ0ZWQgdG8gYmFjay1lbmQgZm9ybSBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjYW4gb25seSBiZSBjb21waWxlZCBvbiBzeXN0ZW1zIHdoaWNoIHVzZSBJcml4IHN0eWxlIGNvcmUKLSAgIGZpbGVzIChuYW1lbHksIElyaXggNCBhbmQgSXJpeCA1LCBzbyBmYXIpLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWZkZWYgSVJJWF9DT1JFCi0KLSNpbmNsdWRlIDxjb3JlLm91dC5oPgotCi1zdHJ1Y3Qgc2dpX2NvcmVfc3RydWN0IAotewotICBpbnQgc2lnOwotICBjaGFyIGNtZFtDT1JFX05BTUVTSVpFXTsKLX07Ci0KLSNkZWZpbmUgY29yZV9oZHIoYmZkKSAoKGJmZCktPnRkYXRhLnNnaV9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKLSNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKLQotc3RhdGljIGFzZWN0aW9uICptYWtlX2JmZF9hc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBmbGFnd29yZCwgYmZkX3NpemVfdHlwZSwgYmZkX3ZtYSwgZmlsZV9wdHIpKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICppcml4X2NvcmVfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjaGFyICppcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBpcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpcml4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIAotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBhc3ltYm9sICppcml4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0KLSAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDQ7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1pcml4X2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHZhbDsKLSAgaW50IGk7Ci0gIGNoYXIgKnNlY25hbWU7Ci0gIHN0cnVjdCBjb3Jlb3V0IGNvcmVvdXQ7Ci0gIHN0cnVjdCBpZGVzYyAqaWRnLCAqaWRmLCAqaWRzOwotCi0gIHZhbCA9IGJmZF9yZWFkICgoUFRSKSZjb3Jlb3V0LCAxLCBzaXplb2YgY29yZW91dCwgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIGNvcmVvdXQpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZuZGVmIENPUkVfTUFHSUNOMzIKLSNkZWZpbmUgQ09SRV9NQUdJQ04zMiBDT1JFX01BR0lDCi0jZW5kaWYKLSAgaWYgKChjb3Jlb3V0LmNfbWFnaWMgIT0gQ09SRV9NQUdJQyAmJiBjb3Jlb3V0LmNfbWFnaWMgIT0gQ09SRV9NQUdJQ04zMikKLSAgICAgIHx8IGNvcmVvdXQuY192ZXJzaW9uICE9IENPUkVfVkVSU0lPTjEpCi0gICAgcmV0dXJuIDA7Ci0KLSAgY29yZV9oZHIgKGFiZmQpID0gKHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc2dpX2NvcmVfc3RydWN0KSk7Ci0gIGlmICghY29yZV9oZHIgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHN0cm5jcHkgKGNvcmVfY29tbWFuZCAoYWJmZCksIGNvcmVvdXQuY19uYW1lLCBDT1JFX05BTUVTSVpFKTsKLSAgY29yZV9zaWduYWwgKGFiZmQpID0gY29yZW91dC5jX3NpZ2NhdXNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY29yZW91dC5jX3ZtYXBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3Jlb3V0LmNfbnZtYXA7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgdm1hcCB2bWFwOwotCi0gICAgICB2YWwgPSBiZmRfcmVhZCAoKFBUUikmdm1hcCwgMSwgc2l6ZW9mIHZtYXAsIGFiZmQpOwotICAgICAgaWYgKHZhbCAhPSBzaXplb2Ygdm1hcCkKLQlicmVhazsKLQotICAgICAgc3dpdGNoICh2bWFwLnZfdHlwZSkKLQl7Ci0JY2FzZSBWREFUQToKLQkgIHNlY25hbWUgPSAiLmRhdGEiOwotCSAgYnJlYWs7Ci0JY2FzZSBWU1RBQ0s6Ci0JICBzZWNuYW1lID0gIi5zdGFjayI7Ci0JICBicmVhazsKLSNpZmRlZiBWTUFQRklMRQotCWNhc2UgVk1BUEZJTEU6Ci0JICBzZWNuYW1lID0gIi5tYXBmaWxlIjsKLQkgIGJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQSBmaWxlIG9mZnNldCBvZiB6ZXJvIG1lYW5zIHRoYXQgdGhlIHNlY3Rpb24gaXMgbm90IGNvbnRhaW5lZAotCSBpbiB0aGUgY29yZWZpbGUuICAqLwotICAgICAgaWYgKHZtYXAudl9vZmZzZXQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgc2VjbmFtZSwKLQkJCSAgICAgIFNFQ19BTExPQytTRUNfTE9BRCtTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAgICAgdm1hcC52X2xlbiwKLQkJCSAgICAgIHZtYXAudl92YWRkciwKLQkJCSAgICAgIHZtYXAudl9vZmZzZXQpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgcmVncyBhcmUgY29udGlndW91cyB3aXRoaW4gdGhlIGNvcmUgZmlsZS4gKi8KLQotICBpZGcgPSAmY29yZW91dC5jX2lkZXNjW0lfR1BSRUdTXTsKLSAgaWRmID0gJmNvcmVvdXQuY19pZGVzY1tJX0ZQUkVHU107Ci0gIGlkcyA9ICZjb3Jlb3V0LmNfaWRlc2NbSV9TUEVDUkVHU107Ci0KLSAgaWYgKGlkZy0+aV9vZmZzZXQgKyBpZGctPmlfbGVuICE9IGlkZi0+aV9vZmZzZXQKLSAgICAgIHx8IGlkZi0+aV9vZmZzZXQgKyBpZGYtPmlfbGVuICE9IGlkcy0+aV9vZmZzZXQpCi0gICAgcmV0dXJuIDA7CQkJLyogQ2FuJ3QgZGVhbCB3aXRoIG5vbi1jb250aWcgcmVncyAqLwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgaWRnLT5pX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKLQkJICAgICBTRUNfSEFTX0NPTlRFTlRTLAotCQkgICAgIGlkZy0+aV9sZW4gKyBpZGYtPmlfbGVuICsgaWRzLT5pX2xlbiwKLQkJICAgICAwLAotCQkgICAgIGlkZy0+aV9vZmZzZXQpOwotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1pcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotc3RhdGljIGludAotaXJpeF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9zaWduYWwgKGFiZmQpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaXJpeF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJCS8qIFhYWCAtIEZJWE1FICovCi19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLWlyaXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0jZGVmaW5lIGlyaXhfY29yZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgaXJpeF9jb3JlX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBpcml4X2NvcmVfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotI2RlZmluZSBpcml4X2NvcmVfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBpcml4X2NvcmVfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgXAotICBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBpcml4X2NvcmVfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGlyaXhfY29yZV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBpcml4X2NvcmVfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBpcml4X2NvcmVfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGlyaXhfY29yZV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0vKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCi1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCgpCi17Ci0gIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLwotfQotI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19TSUdORURfR0VUIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBpcml4X2NvcmVfdmVjID0KLSAgewotICAgICJpcml4LWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgaXJpeF9jb3JlX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoaXJpeF9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoaXJpeF9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICBOVUxMLAotICAgIAotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0KLSNlbmRpZiAvKiBJUklYX0NPUkUgKi8KZGlmZiAtLWdpdCBhL2JmZC9saWJhb3V0LmggYi9iZmQvbGliYW91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDAxZDNkLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJhb3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MjQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgYS5vdXQgKGFuZCBzaW1pbGFyKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTElCQU9VVF9ICi0jZGVmaW5lIExJQkFPVVRfSAotCi0vKiBXZSB0cnkgdG8gZW5jYXBzdWxhdGUgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSB2YXJpb3VzIGEub3V0IGZpbGUKLSAgIHZhcmlhbnRzIGluIGEgZmV3IHJvdXRpbmVzLCBhbmQgb3RoZXJ3aXNlIHNoYXJlIGxhcmdlIG1hc3NlcyBvZiBjb2RlLgotICAgVGhpcyBtZWFucyB3ZSBvbmx5IGhhdmUgdG8gZml4IGJ1Z3MgaW4gb25lIHBsYWNlLCBtb3N0IG9mIHRoZSB0aW1lLiAgKi8KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotLyogUGFyYW1ldGVyaXplIHRoZSBhLm91dCBjb2RlIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMgYmVpbmcgYnVpbHQKLSAgIGZvciBhIDMyLWJpdCBhcmNoaXRlY3R1cmUgb3IgYSA2NC1iaXQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNpZiBBUkNIX1NJWkU9PTY0Ci0jZGVmaW5lIEdFVF9XT1JEIGJmZF9oX2dldF82NAotI2RlZmluZSBHRVRfU1dPUkQgYmZkX2hfZ2V0X3NpZ25lZF82NAotI2RlZmluZSBQVVRfV09SRCBiZmRfaF9wdXRfNjQKLSNpZm5kZWYgTkFNRQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyh4LF82NF8seSkKLSNlbmRpZgotI2RlZmluZSBKTkFNRSh4KSBDQVQoeCxfNjQpCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgOAotI2Vsc2UgLyogQVJDSF9TSVpFID09IDMyICovCi0jZGVmaW5lIEdFVF9XT1JEIGJmZF9oX2dldF8zMgotI2RlZmluZSBHRVRfU1dPUkQgYmZkX2hfZ2V0X3NpZ25lZF8zMgotI2RlZmluZSBQVVRfV09SRCBiZmRfaF9wdXRfMzIKLSNpZm5kZWYgTkFNRQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyh4LF8zMl8seSkKLSNlbmRpZgotI2RlZmluZSBKTkFNRSh4KSBDQVQoeCxfMzIpCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2VuZGlmIC8qIEFSQ0hfU0laRT09MzIgKi8KLQotLyogRGVjbGFyZSBhdCBmaWxlIGxldmVsLCBzaW5jZSB1c2VkIGluIHBhcmFtZXRlciBsaXN0cywgd2hpY2ggaGF2ZQotICAgd2VpcmQgc2NvcGUuICAqLwotc3RydWN0IGV4dGVybmFsX2V4ZWM7Ci1zdHJ1Y3QgZXh0ZXJuYWxfbmxpc3Q7Ci1zdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsOwotc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbDsKLQwKLS8qIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotICAvKiBXaGV0aGVyIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LiAgKi8KLSAgYm9vbGVhbiB3cml0dGVuOwotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICAqLwotICBpbnQgaW5keDsKLX07Ci0KLS8qIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhb3V0X2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBhLm91dCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFvdXRfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgYS5vdXQgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGFvdXRfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQwKLS8qIEJhY2stZW5kIGluZm9ybWF0aW9uIGZvciB2YXJpb3VzIGEub3V0IHRhcmdldHMuICAqLwotc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhCi17Ci0gIC8qIEFyZSBaTUFHSUMgZmlsZXMgbWFwcGVkIGNvbnRpZ3VvdXNseT8gIElmIHNvLCB0aGUgdGV4dCBzZWN0aW9uIG1heQotICAgICBuZWVkIG1vcmUgcGFkZGluZywgaWYgdGhlIHNlZ21lbnQgc2l6ZSAoZ3JhbnVsYXJpdHkgZm9yIG1lbW9yeSBhY2Nlc3MKLSAgICAgY29udHJvbCkgaXMgbGFyZ2VyIHRoYW4gdGhlIHBhZ2Ugc2l6ZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgem1hZ2ljX21hcHBlZF9jb250aWd1b3VzOwotICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCBaTUFHSUMvTk1BR0lDIGZpbGUgaGVhZGVycyBnZXQgbWFwcGVkIGluIHdpdGggdGhlCi0gICAgIHRleHQgc2VjdGlvbiwgd2hpY2ggc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaWxlIGhlYWRlci4KLSAgICAgSWYgbm90LCB0aGUgdGV4dCBzZWN0aW9uIHN0YXJ0cyBvbiB0aGUgbmV4dCBwYWdlLiAgKi8KLSAgdW5zaWduZWQgY2hhciB0ZXh0X2luY2x1ZGVzX2hlYWRlcjsKLQotICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIGlmIHRoZSBlbnRyeSBhZGRyZXNzIGlzIG5vdCBpbiB0aGUKLSAgICAgZmlyc3QgU0VHTUVOVF9TSVpFIGJ5dGVzIG9mIHRoZSB0ZXh0IHNlY3Rpb24sIGl0IGlzIHRha2VuIHRvIGJlCi0gICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsCi0gICAgIGZvciBrZXJuZWxzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBlbnRyeV9pc190ZXh0X2FkZHJlc3M7Ci0KLSAgLyogVGhlIHZhbHVlIHRvIHBhc3MgdG8gTl9TRVRfRkxBR1MuICAqLwotICB1bnNpZ25lZCBjaGFyIGV4ZWNfaGRyX2ZsYWdzOwotCi0gIC8qIElmIHRoZSB0ZXh0IHNlY3Rpb24gVk1BIGlzbid0IHNwZWNpZmllZCwgYW5kIHdlIG5lZWQgYW4gYWJzb2x1dGUKLSAgICAgYWRkcmVzcywgdXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQuICBJZiB3ZSdyZSBwcm9kdWNpbmcgYSByZWxvY2F0YWJsZQotICAgICBmaWxlLCB6ZXJvIGlzIGFsd2F5cyB1c2VkLiAgKi8KLSAgLyogPz8gUGVyaGFwcyBhIGNhbGxiYWNrIHdvdWxkIGJlIGEgYmV0dGVyIGNob2ljZT8gIFdpbGwgdGhpcyBkbyBhbnl0aGluZwotICAgICByZWFzb25hYmxlIGZvciBhIGZvcm1hdCB0aGF0IGhhbmRsZXMgbXVsdGlwbGUgQ1BVcyB3aXRoIGRpZmZlcmVudAotICAgICBsb2FkIGFkZHJlc3NlcyBmb3IgZWFjaD8gICovCi0gIGJmZF92bWEgZGVmYXVsdF90ZXh0X3ZtYTsKLQotICAvKiBDYWxsYmFjayBmb3Igc2V0dGluZyB0aGUgcGFnZSBhbmQgc2VnbWVudCBzaXplcywgaWYgdGhleSBjYW4ndCBiZQotICAgICB0cml2aWFsbHkgZGV0ZXJtaW5lZCBmcm9tIHRoZSBhcmNoaXRlY3R1cmUuICAqLwotICBib29sZWFuICgqc2V0X3NpemVzKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIHptYWdpYyBmaWxlcyBvbmx5LiBGb3IgZ28zMiwgdGhlIGxlbmd0aCBvZiB0aGUgZXhlYyBoZWFkZXIgY29udHJpYnV0ZXMKLSAgICAgdG8gdGhlIHNpemUgb2YgdGhlIHRleHQgc2VjdGlvbiBpbiB0aGUgZmlsZSBmb3IgYWxpZ25tZW50IHB1cnBvc2VzIGJ1dAotICAgICBkb2VzICpub3QqIGdldCBjb3VudGVkIGluIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgc2VjdGlvbi4gKi8KLSAgdW5zaWduZWQgY2hhciBleGVjX2hlYWRlcl9ub3RfY291bnRlZDsKLQotICAvKiBDYWxsYmFjayBmcm9tIHRoZSBhZGQgc3ltYm9scyBwaGFzZSBvZiB0aGUgbGlua2VyIGNvZGUgdG8gaGFuZGxlCi0gICAgIGEgZHluYW1pYyBvYmplY3QuICAqLwotICBib29sZWFuICgqYWRkX2R5bmFtaWNfc3ltYm9scykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgc3RydWN0IGV4dGVybmFsX25saXN0ICoqLAotCQkJCQkgIGJmZF9zaXplX3R5cGUgKiwgY2hhciAqKikpOwotCi0gIC8qIENhbGxiYWNrIGZyb20gdGhlIGFkZCBzeW1ib2xzIHBoYXNlIG9mIHRoZSBsaW5rZXIgY29kZSB0byBoYW5kbGUKLSAgICAgYWRkaW5nIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKmFkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JCQkJICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sCi0JCQkJICAgICBib29sZWFuLAotCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLQotICAvKiBDYWxsZWQgdG8gaGFuZGxlIGxpbmtpbmcgYSBkeW5hbWljIG9iamVjdC4gICovCi0gIGJvb2xlYW4gKCpsaW5rX2R5bmFtaWNfb2JqZWN0KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotCi0gIC8qIENhbGxlZCBmb3IgZWFjaCBnbG9iYWwgc3ltYm9sIGJlaW5nIHdyaXR0ZW4gb3V0IGJ5IHRoZSBsaW5rZXIuCi0gICAgIFRoaXMgc2hvdWxkIHdyaXRlIG91dCB0aGUgZHluYW1pYyBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBib29sZWFuICgqd3JpdGVfZHluYW1pY19zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpOwotCi0gIC8qIElmIHRoaXMgY2FsbGJhY2sgaXMgbm90IE5VTEwsIHRoZSBsaW5rZXIgY2FsbHMgaXQgZm9yIGVhY2ggcmVsb2MuCi0gICAgIFJFTE9DIGlzIGEgcG9pbnRlciB0byB0aGUgdW5zd2FwcGVkIHJlbG9jLiAgSWYgKlNLSVAgaXMgc2V0IHRvCi0gICAgIHRydWUsIHRoZSByZWxvYyB3aWxsIGJlIHNraXBwZWQuICAqUkVMT0NBVElPTiBtYXkgYmUgY2hhbmdlZCB0bwotICAgICBjaGFuZ2UgdGhlIGVmZmVjdHMgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotICBib29sZWFuICgqY2hlY2tfZHluYW1pY19yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCSAgYmZkICppbnB1dF9iZmQsCi0JCQkJCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0JCQkJCSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoLAotCQkJCQkgIFBUUiByZWxvYywgYmZkX2J5dGUgKmNvbnRlbnRzLAotCQkJCQkgIGJvb2xlYW4gKnNraXAsCi0JCQkJCSAgYmZkX3ZtYSAqcmVsb2NhdGlvbikpOwotCi0gIC8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIGEgbGluayB0byBmaW5pc2ggdXAgYW55IGR5bmFtaWMgbGlua2luZwotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGJvb2xlYW4gKCpmaW5pc2hfZHluYW1pY19saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotfTsKLSNkZWZpbmUgYW91dF9iYWNrZW5kX2luZm8oYWJmZCkgXAotCSgoQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhICopKChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKSkKLQotLyogVGhpcyBpcyB0aGUgbGF5b3V0IGluIG1lbW9yeSBvZiBhICJzdHJ1Y3QgZXhlYyIgd2hpbGUgd2UgcHJvY2VzcyBpdC4KLSAgIEFsbCAnbGVuZ3RocycgYXJlIGdpdmVuIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICAgQWxsICdhbGlnbm1lbnRzJyBhcmUgZm9yIHJlbGlua2FibGUgZmlsZXMgb25seTsgIGFuIGFsaWdubWVudCBvZgotCSduJyBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBtdXN0IGJlZ2luIGF0IGFuCi0JYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgKDIqKm4pLiAgKi8KLQotc3RydWN0IGludGVybmFsX2V4ZWMKLXsKLSAgICBsb25nIGFfaW5mbzsJCS8qIE1hZ2ljIG51bWJlciBhbmQgZmxhZ3MsIHBhY2tlZCAqLwotICAgIGJmZF92bWEgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICAqLwotICAgIGJmZF92bWEgYV9kYXRhOwkJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICAqLwotICAgIGJmZF92bWEgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgaW4gbWVtICovCi0gICAgYmZkX3ZtYSBhX3N5bXM7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSAqLwotICAgIGJmZF92bWEgYV9lbnRyeTsJCS8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgICBiZmRfdm1hIGFfdHJzaXplOwkJLyogbGVuZ3RoIG9mIHRleHQncyByZWxvY2F0aW9uIGluZm8sIGluIGJ5dGVzICovCi0gICAgYmZkX3ZtYSBhX2Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiBkYXRhJ3MgcmVsb2NhdGlvbiBpbmZvLCBpbiBieXRlcyAqLwotICAgIC8qIEFkZGVkIGZvciBpOTYwICovCi0gICAgYmZkX3ZtYSBhX3Rsb2FkOwkJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcyAqLwotICAgIGJmZF92bWEgYV9kbG9hZDsJCS8qIERhdGEgcnVudGltZSBsb2FkIGFkZHJlc3MgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfdGFsaWduOwkvKiBBbGlnbm1lbnQgb2YgdGV4dCBzZWdtZW50ICovCi0gICAgdW5zaWduZWQgY2hhciBhX2RhbGlnbjsJLyogQWxpZ25tZW50IG9mIGRhdGEgc2VnbWVudCAqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9iYWxpZ247CS8qIEFsaWdubWVudCBvZiBic3Mgc2VnbWVudCAqLwotICAgIGNoYXIgYV9yZWxheGFibGU7ICAgICAgICAgICAvKiBFbm91Z2ggaW5mbyBmb3IgbGlua2VyIHJlbGF4ICovCi19OwotCi0vKiBNYWdpYyBudW1iZXIgaXMgd3JpdHRlbiAKLTwgTVNCICAgICAgICAgID4KLTMxMzAyOTI4MjcyNjI1MjQyMzIyMjEyMDE5MTgxNzE2MTUxNDEzMTIxMTEwMDkwODA3MDYwNTA0MDMwMjAxMDAKLTwgRkxBR1MgICAgICAgID48IE1BQ0hJTkUgVFlQRSA+PCAgTUFHSUMgTlVNQkVSICAgICAgICAgICAgICAgID4KLSovCi0vKiBNYWdpYyBudW1iZXIgZm9yIE5ldEJTRCBpcwotPE1TQiAgICAgICAgICAgPgotMzEzMDI5MjgyNzI2MjUyNDIzMjIyMTIwMTkxODE3MTYxNTE0MTMxMjExMTAwOTA4MDcwNjA1MDQwMzAyMDEwMAotPCBGTEFHUyAgICA+PCBNQUNISU5FIFRZUEUgICAgID48ICBNQUdJQyBOVU1CRVIgICAgICAgICAgICAgICAgPgotKi8KLQotZW51bSBtYWNoaW5lX3R5cGUgewotICBNX1VOS05PV04gPSAwLAotICBNXzY4MDEwID0gMSwKLSAgTV82ODAyMCA9IDIsCi0gIE1fU1BBUkMgPSAzLAotICAvKiBza2lwIGEgYnVuY2ggc28gd2UgZG9uJ3QgcnVuIGludG8gYW55IG9mIHN1bnMgbnVtYmVycyAqLwotICAvKiBtYWtlIHRoZXNlIHVwIGZvciB0aGUgbnMzMmsqLwotICBNX05TMzIwMzIgPSAoNjQpLAkJLyogbnMzMjAzMiBydW5uaW5nID8gKi8KLSAgTV9OUzMyNTMyID0gKDY0ICsgNSksCQkvKiBuczMyNTMyIHJ1bm5pbmcgbWFjaCAqLwotCi0gIE1fMzg2ID0gMTAwLAotICBNXzI5SyA9IDEwMSwgICAgICAgICAgLyogQU1EIDI5MDAwICovCi0gIE1fMzg2X0RZTklYID0gMTAyLAkvKiBTZXF1ZW50IHJ1bm5pbmcgZHluaXggKi8KLSAgTV9BUk0gPSAxMDMsCQkvKiBBZHZhbmNlZCBSaXNjIE1hY2hpbmVzIEFSTSAqLwotICBNX1NQQVJDTEVUID0gMTMxLAkvKiBTUEFSQ2xldCA9IE1fU1BBUkMgKyAxMjggKi8KLSAgTV8zODZfTkVUQlNEID0gMTM0LAkvKiBOZXRCU0QvaTM4NiBiaW5hcnkgKi8KLSAgTV82OEtfTkVUQlNEID0gMTM1LAkvKiBOZXRCU0QvbTY4ayBiaW5hcnkgKi8KLSAgTV82OEs0S19ORVRCU0QgPSAxMzYsCS8qIE5ldEJTRC9tNjhrNGsgYmluYXJ5ICovCi0gIE1fNTMyX05FVEJTRCA9IDEzNywJLyogTmV0QlNEL25zMzJrIGJpbmFyeSAqLwotICBNX1NQQVJDX05FVEJTRCA9IDEzOCwJLyogTmV0QlNEL3NwYXJjIGJpbmFyeSAqLwotICBNX1BNQVhfTkVUQlNEID0gMTM5LAkvKiBOZXRCU0QvcG1heCAoTUlQUyBsaXR0bGUtZW5kaWFuKSBiaW5hcnkgKi8KLSAgTV9WQVhfTkVUQlNEID0gMTQwLAkvKiBOZXRCU0QvdmF4IGJpbmFyeSAqLwotICBNX0FMUEhBX05FVEJTRCA9IDE0MSwJLyogTmV0QlNEL2FscGhhIGJpbmFyeSAqLwotICBNX0FSTTZfTkVUQlNEID0gMTQzLAkvKiBOZXRCU0QvYXJtMzIgYmluYXJ5ICovCi0gIE1fU1BBUkNMRVRfMSA9IDE0NywJLyogMHg5MywgcmVzZXJ2ZWQgKi8KLSAgTV9NSVBTMSA9IDE1MSwgICAgICAgIC8qIE1JUFMgUjIwMDAvUjMwMDAgYmluYXJ5ICovCi0gIE1fTUlQUzIgPSAxNTIsICAgICAgICAvKiBNSVBTIFI0MDAwL1I2MDAwIGJpbmFyeSAqLwotICBNX1NQQVJDTEVUXzIgPSAxNjMsCS8qIDB4YTMsIHJlc2VydmVkICovCi0gIE1fU1BBUkNMRVRfMyA9IDE3OSwJLyogMHhiMywgcmVzZXJ2ZWQgKi8KLSAgTV9TUEFSQ0xFVF80ID0gMTk1LAkvKiAweGMzLCByZXNlcnZlZCAqLwotICBNX0hQMjAwID0gMjAwLAkvKiBIUCAyMDAgKDY4MDEwKSBCU0QgYmluYXJ5ICovCi0gIE1fSFAzMDAgPSAoMzAwICUgMjU2KSwgLyogSFAgMzAwICg2ODAyMCs2ODg4MSkgQlNEIGJpbmFyeSAqLwotICBNX0hQVVggPSAoMHgyMGMgJSAyNTYpLCAvKiBIUCAyMDAvMzAwIEhQVVggYmluYXJ5ICovCi0gIE1fU1BBUkNMRVRfNSA9IDIxMSwJLyogMHhkMywgcmVzZXJ2ZWQgKi8KLSAgTV9TUEFSQ0xFVF82ID0gMjI3LAkvKiAweGUzLCByZXNlcnZlZCAqLwotICAvKiAgTV9TUEFSQ0xFVF83ID0gMjQzCS8gKiAweGYzLCByZXNlcnZlZCAqLwotICBNX1NQQVJDTElURV9MRSA9IDI0MwotfTsKLQotI2RlZmluZSBOX0RZTkFNSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweDgwMDAwMDAwKQotCi0jaWZuZGVmIE5fTUFHSUMKLSMgZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCi0jZW5kaWYKLQotI2lmbmRlZiBOX01BQ0hUWVBFCi0jIGRlZmluZSBOX01BQ0hUWVBFKGV4ZWMpICgoZW51bSBtYWNoaW5lX3R5cGUpKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4ZmYpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9GTEFHUwotIyBkZWZpbmUgTl9GTEFHUyhleGVjKSAoKChleGVjKS5hX2luZm8gPj4gMjQpICYgMHhmZikKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX0lORk8KLSMgZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCi0oKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCi0gfCAoKChpbnQpKHR5cGUpICYgMHhmZikgPDwgMTYpIFwKLSB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX0RZTkFNSUMKLSMgZGVmaW5lIE5fU0VUX0RZTkFNSUMoZXhlYywgZHluYW1pYykgXAotKChleGVjKS5hX2luZm8gPSAoZHluYW1pYykgPyAoKGV4ZWMpLmFfaW5mbyB8IDB4ODAwMDAwMDApIDogXAotKChleGVjKS5hX2luZm8gJiAweDdmZmZmZmZmKSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX01BR0lDCi0jIGRlZmluZSBOX1NFVF9NQUdJQyhleGVjLCBtYWdpYykgXAotKChleGVjKS5hX2luZm8gPSAoKChleGVjKS5hX2luZm8gJiAweGZmZmYwMDAwKSB8ICgobWFnaWMpICYgMHhmZmZmKSkpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9NQUNIVFlQRQotIyBkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKLSgoZXhlYykuYV9pbmZvID0gXAotICgoZXhlYykuYV9pbmZvJjB4ZmYwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweGZmKSA8PCAxNikpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9GTEFHUwotIyBkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKLSgoZXhlYykuYV9pbmZvID0gXAotICgoZXhlYykuYV9pbmZvJjB4MDBmZmZmZmYpIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IGFvdXRfc3ltYm9sIHsKLSAgYXN5bWJvbCBzeW1ib2w7Ci0gIHNob3J0IGRlc2M7Ci0gIGNoYXIgb3RoZXI7Ci0gIHVuc2lnbmVkIGNoYXIgdHlwZTsKLX0gYW91dF9zeW1ib2xfdHlwZTsKLQotLyogVGhlIGB0ZGF0YScgc3RydWN0IGZvciBhbGwgYS5vdXQtbGlrZSBvYmplY3QgZmlsZSBmb3JtYXRzLgotICAgVmFyaW91cyB0aGluZ3MgZGVwZW5kIG9uIHRoaXMgc3RydWN0IGJlaW5nIGFyb3VuZCBhbnkgdGltZSBhbiBhLm91dAotICAgZmlsZSBpcyBiZWluZyBoYW5kbGVkLiAgQW4gZXhhbXBsZSBpcyBkYnhyZWFkLmMgaW4gR0RCLiAgKi8KLQotc3RydWN0IGFvdXRkYXRhIHsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmhkcjsJCS8qIGV4ZWMgZmlsZSBoZWFkZXIgKi8KLSAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYm9sczsJCS8qIHN5bXRhYiBmb3IgaW5wdXQgYmZkICovCi0gIAotICAvKiBGb3IgZWFzZSwgd2UgZG8gdGhpcyAqLwotICBhc2VjdGlvbiAqdGV4dHNlYzsKLSAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0gIGFzZWN0aW9uICpic3NzZWM7Ci0KLSAgLyogV2UgcmVtZW1iZXIgdGhlc2Ugb2Zmc2V0cyBzbyB0aGF0IGFmdGVyIGNoZWNrX2ZpbGVfZm9ybWF0LCB3ZSBoYXZlCi0gICAgIG5vIGRlcGVuZGVuY2llcyBvbiB0aGUgcGFydGljdWxhciBmb3JtYXQgb2YgdGhlIGV4ZWNfaGRyLiAgKi8KLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0gIGZpbGVfcHRyIHN0cl9maWxlcG9zOwotCi0gIC8qIFNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5IGluIGV4dGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgcmVsb2NfZW50cnlfc2l6ZTsKLQotICAvKiBTaXplIG9mIGEgc3ltYm9sIHRhYmxlIGVudHJ5IGluIGV4dGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgc3ltYm9sX2VudHJ5X3NpemU7Ci0KLSAgLyogUGFnZSBzaXplIC0gbmVlZGVkIGZvciBhbGlnbm1lbnQgb2YgZGVtYW5kIHBhZ2VkIGZpbGVzLiAqLwotICB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsKLQotICAvKiBTZWdtZW50IHNpemUgLSBuZWVkZWQgZm9yIGFsaWdubWVudCBvZiBkZW1hbmQgcGFnZWQgZmlsZXMuICovCi0gIHVuc2lnbmVkIGxvbmcgc2VnbWVudF9zaXplOwotCi0gIC8qIFptYWdpYyBkaXNrIGJsb2NrIHNpemUgLSBuZWVkIHRvIGFsaWduIHRoZSBzdGFydCBvZiB0aGUgdGV4dAotICAgICBzZWN0aW9uIGluIFpNQUdJQyBiaW5hcmllcy4gIE5vcm1hbGx5IHRoZSBzYW1lIGFzIHBhZ2Vfc2l6ZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZTsKLQotICB1bnNpZ25lZCBleGVjX2J5dGVzX3NpemU7Ci0gIHVuc2lnbmVkIHZtYV9hZGp1c3RlZCA6IDE7Ci0KLSAgLyogdXNlZCB3aGVuIGEgYmZkIHN1cHBvcnRzIHNldmVyYWwgaGlnaGx5IHNpbWlsYXIgZm9ybWF0cyAqLwotICBlbnVtCi0gICAgewotICAgICAgZGVmYXVsdF9mb3JtYXQgPSAwLAotICAgICAgLyogVXNlZCBvbiBIUCA5MDAwLzMwMCBydW5uaW5nIEhQL1VYLiAgU2VlIGhwMzAwaHB1eC5jLiAgKi8KLSAgICAgIGdudV9lbmNhcF9mb3JtYXQsCi0gICAgICAvKiBVc2VkIG9uIExpbnV4LCAzODZCU0QsIGV0Yy4gIFNlZSBpbmNsdWRlL2FvdXQvYW91dDY0LmguICAqLwotICAgICAgcV9tYWdpY19mb3JtYXQKLSAgICB9IHN1YmZvcm1hdDsKLQotICBlbnVtCi0gICAgewotICAgICAgdW5kZWNpZGVkX21hZ2ljID0gMCwKLSAgICAgIHpfbWFnaWMsCi0gICAgICBvX21hZ2ljLAotICAgICAgbl9tYWdpYwotICAgIH0gbWFnaWM7Ci0KLSAgLyogQSBidWZmZXIgZm9yIGZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgY2hhciAqbGluZV9idWY7Ci0KLSAgLyogVGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZXh0ZXJuYWxfc3ltczsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fY291bnQ7Ci0gIGJmZF93aW5kb3cgc3ltX3dpbmRvdzsKLSAgY2hhciAqZXh0ZXJuYWxfc3RyaW5nczsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zdHJpbmdfc2l6ZTsKLSAgYmZkX3dpbmRvdyBzdHJpbmdfd2luZG93OwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotCi0gIC8qIEEgcG9pbnRlciBmb3Igc2hhcmVkIGxpYnJhcnkgaW5mb3JtYXRpb24uICAqLwotICBQVFIgZHluYW1pY19pbmZvOwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gb2Zmc2V0cyBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0Ci0gICAgIHRhYmxlLCB1c2VkIHdoZW4gbGlua2luZyBvbiBTdW5PUy4gIFRoaXMgaXMgaW5kZXhlZCBieSB0aGUgc3ltYm9sCi0gICAgIGluZGV4LiAgKi8KLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci19OwotCi1zdHJ1Y3QgIGFvdXRfZGF0YV9zdHJ1Y3QgewotICAgIHN0cnVjdCBhb3V0ZGF0YSBhOwotICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGU7Ci19OwotCi0jZGVmaW5lCWFkYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEuYW91dF9kYXRhLT5hKQotI2RlZmluZQlleGVjX2hkcihiZmQpCQkoYWRhdGEoYmZkKS5oZHIpCi0jZGVmaW5lCW9ial9hb3V0X3N5bWJvbHMoYmZkKQkoYWRhdGEoYmZkKS5zeW1ib2xzKQotI2RlZmluZQlvYmpfdGV4dHNlYyhiZmQpCShhZGF0YShiZmQpLnRleHRzZWMpCi0jZGVmaW5lCW9ial9kYXRhc2VjKGJmZCkJKGFkYXRhKGJmZCkuZGF0YXNlYykKLSNkZWZpbmUJb2JqX2Jzc3NlYyhiZmQpCQkoYWRhdGEoYmZkKS5ic3NzZWMpCi0jZGVmaW5lCW9ial9zeW1fZmlsZXBvcyhiZmQpCShhZGF0YShiZmQpLnN5bV9maWxlcG9zKQotI2RlZmluZQlvYmpfc3RyX2ZpbGVwb3MoYmZkKQkoYWRhdGEoYmZkKS5zdHJfZmlsZXBvcykKLSNkZWZpbmUJb2JqX3JlbG9jX2VudHJ5X3NpemUoYmZkKSAoYWRhdGEoYmZkKS5yZWxvY19lbnRyeV9zaXplKQotI2RlZmluZQlvYmpfc3ltYm9sX2VudHJ5X3NpemUoYmZkKSAoYWRhdGEoYmZkKS5zeW1ib2xfZW50cnlfc2l6ZSkKLSNkZWZpbmUgb2JqX2FvdXRfc3ViZm9ybWF0KGJmZCkJKGFkYXRhKGJmZCkuc3ViZm9ybWF0KQotI2RlZmluZSBvYmpfYW91dF9leHRlcm5hbF9zeW1zKGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3ltcykKLSNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50KGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3ltX2NvdW50KQotI2RlZmluZSBvYmpfYW91dF9zeW1fd2luZG93KGJmZCkgKGFkYXRhKGJmZCkuc3ltX3dpbmRvdykKLSNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyhiZmQpIChhZGF0YShiZmQpLmV4dGVybmFsX3N0cmluZ3MpCi0jZGVmaW5lIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ19zaXplKGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3RyaW5nX3NpemUpCi0jZGVmaW5lIG9ial9hb3V0X3N0cmluZ193aW5kb3coYmZkKSAoYWRhdGEoYmZkKS5zdHJpbmdfd2luZG93KQotI2RlZmluZSBvYmpfYW91dF9zeW1faGFzaGVzKGJmZCkgKGFkYXRhKGJmZCkuc3ltX2hhc2hlcykKLSNkZWZpbmUgb2JqX2FvdXRfZHluYW1pY19pbmZvKGJmZCkgKGFkYXRhKGJmZCkuZHluYW1pY19pbmZvKQotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFuIGFzeW1ib2wgdG8gZW5zdXJlIHRoYXQgdGhlCi0gICBtYWNybyBpcyBvbmx5IGV2ZXIgYXBwbGllZCB0byBhbiBhc3ltYm9sICovCi0jZGVmaW5lIGFvdXRfc3ltYm9sKGFzeW1ib2wpICgoYW91dF9zeW1ib2xfdHlwZSAqKSgmKGFzeW1ib2wpLT50aGVfYmZkKSkKLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZWFjaCBhLm91dCBzZWN0aW9uLiAgVGhpcyBpcyBjdXJyZW50bHkgb25seQotICAgdXNlZCBieSB0aGUgYS5vdXQgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0Ci17Ci0gIC8qIFRoZSB1bnN3YXBwZWQgcmVsb2NhdGlvbiBlbnRyaWVzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBQVFIgcmVsb2NzOwotfTsKLQotI2RlZmluZSBhb3V0X3NlY3Rpb25fZGF0YShzKSBcCi0gICgoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKSAocyktPnVzZWRfYnlfYmZkKQotCi0jZGVmaW5lIHNldF9hb3V0X3NlY3Rpb25fZGF0YShzLHYpIFwKLSAgKChzKS0+dXNlZF9ieV9iZmQgPSAoUFRSKSYodiktPnJlbG9jcykKLQotLyogUHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gYW91dHguaCAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSBQQVJBTVMgKChiZmQgKikpOwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLU5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkgICAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwLAotCQkJCSAgICAgICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrKShiZmQgKikpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LG1rb2JqZWN0KSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotZW51bSBtYWNoaW5lX3R5cGUKLU5BTUUoYW91dCxtYWNoaW5lX3R5cGUpIFBBUkFNUyAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCQkJCSB1bnNpZ25lZCBsb25nIG1hY2hpbmUsCi0JCQkJIGJvb2xlYW4gKnVua25vd24pKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LHNldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqYWJmZCwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsCi0JCSAJCSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpuZXdzZWN0KSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIHNlY3Rpb24sCi0JCQkgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLQotYXN5bWJvbCAqCi1OQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoYmZkICosIGFvdXRfc3ltYm9sX3R5cGUgKiwKLQkJCQkJICAgc3RydWN0IGV4dGVybmFsX25saXN0ICosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUsIGNoYXIgKiwKLQkJCQkJICAgYmZkX3NpemVfdHlwZSwKLQkJCQkJICAgYm9vbGVhbiBkeW5hbWljKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsd3JpdGVfc3ltcykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxyZWNsYWltX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWxvbmcKLU5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotbG9uZwotTkFNRShhb3V0LGdldF9zeW10YWIpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmxvY2F0aW9uKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiwKLQkJCQkgICAgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJmZF9zaXplX3R5cGUpKTsKLXZvaWQKLU5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiwKLQkJCQkgICAgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJmZF9zaXplX3R5cGUpKTsKLQotcmVsb2NfaG93dG9fdHlwZSAqCi1OQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkgICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBhc2VjdCwKLQkJCQkgICAgICBhc3ltYm9sICoqc3ltYm9scykpOwotCi1sb25nCi1OQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSBQQVJBTVMgKChiZmQgKmFiZmQsIHNlY19wdHIgc2VjdGlvbiwKLQkJCQkgICAgICAgYXJlbGVudCAqKnJlbHB0ciwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLQotbG9uZwotTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIGFzZWN0KSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxyZWNsYWltX3JlbG9jKSBQQVJBTVMgKChiZmQgKmlnbm9yZV9hYmZkLCBzZWNfcHRyIGlnbm9yZSkpOwotCi1hbGVudCAqCi1OQU1FKGFvdXQsZ2V0X2xpbmVubykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwgYXN5bWJvbCAqaWdub3JlX3N5bWJvbCkpOwotCi12b2lkCi1OQU1FKGFvdXQscHJpbnRfc3ltYm9sKSBQQVJBTVMgKChiZmQgKmlnbm9yZV9hYmZkLCBQVFIgZmlsZSwKLQkJCSAgICBhc3ltYm9sICpzeW1ib2wsIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKLQotdm9pZAotTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgICBhc3ltYm9sICoqc3ltYm9scywgYmZkX3ZtYSBvZmZzZXQsIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHIsCi0gICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciwgdW5zaWduZWQgaW50ICpsaW5lX3B0cikpOwotCi1sb25nCi1OQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpOwotCi1hc3ltYm9sICoKLU5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKLQkJCQkJIGFzeW1ib2wgKikpOwotCi1pbnQKLU5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIGV4ZWMpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgIGJmZF9zaXplX3R5cGUgKnRleHRfc2l6ZSwgZmlsZV9wdHIgKnRleHRfZW5kKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcykpOwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpCi0gICAgIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKLQkgICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCSAgY29uc3QgY2hhciAqKSkpOwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1OQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxmaW5hbF9saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCSAgICAgICB2b2lkICgqKSAoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosCi0JCQkJCSBmaWxlX3B0ciAqKSkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEEub3V0IHVzZXMgdGhlIGdlbmVyaWMgdmVyc2lvbnMgb2YgdGhlc2Ugcm91dGluZXMuLi4gKi8KLQotI2RlZmluZQlhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lCWFvdXRfNjRfZ2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jaWZuZGVmIE5PX1dSSVRFX0hFQURFUl9LTFVER0UKLSNkZWZpbmUgTk9fV1JJVEVfSEVBREVSX0tMVURHRSAwCi0jZW5kaWYKLQotI2lmbmRlZiBhb3V0XzMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgV1JJVEVfSEVBREVSUwotI2RlZmluZSBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKQkJCQkJICAgICAgXAotICAgICAgewkJCQkJCQkJCSAgICAgIFwKLQliZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsgLyogZHVtbXkgdmFycyAqLwkJCSAgICAgIFwKLQlmaWxlX3B0ciB0ZXh0X2VuZDsJCQkJCQkgICAgICBcCi0JaWYgKGFkYXRhKGFiZmQpLm1hZ2ljID09IHVuZGVjaWRlZF9tYWdpYykJCQkgICAgICBcCi0JICBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsgICAgIFwKLSAgICAJCQkJCQkJCQkgICAgICBcCi0JZXhlY3AtPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogRVhURVJOQUxfTkxJU1RfU0laRTsJICAgICAgXAotCWV4ZWNwLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsJCQkgICAgICBcCi0gICAgCQkJCQkJCQkJICAgICAgXAotCWV4ZWNwLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgICAgXAotCQkJICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCSAgICAgIFwKLQlleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgICAgIFwKLQkJCSAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkgICAgICBcCi0JTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkgcmV0dXJuIGZhbHNlOwkgICAgICBcCi0JaWYgKGJmZF93cml0ZSAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkJICAgICAgXAotCSAgICAhPSBFWEVDX0JZVEVTX1NJWkUpCQkJCQkJICAgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICAgICBcCi0JLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCSAgICAgIFwKLSAgCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCQkgICAgICBcCi0JICAgICYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAkJCQkgICAgICBcCi0JICB7CQkJCQkJCQkgICAgICBcCi0JICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApIFwKLQkgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCSAgICBpZiAoISBOQU1FKGFvdXQsd3JpdGVfc3ltcykoYWJmZCkpIHJldHVybiBmYWxzZTsJCSAgICAgIFwKLQkgIH0JCQkJCQkJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9UUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCi0JaWYgKCFOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKSAgICAgICAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICAJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSAgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgCSAgICAgIFwKLQlpZiAoIU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkgICAgICAgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCi0gICAgICB9CQkJCQkJCQkJICAgICAgCi0jZW5kaWYKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoTElCQU9VVF9IKSAqLwpkaWZmIC0tZ2l0IGEvYmZkL2xpYmJmZC1pbi5oIGIvYmZkL2xpYmJmZC1pbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWExNzZkLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJiZmQtaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDU1MyArMCwwIEBACi0vKiBsaWJiZmQuaCAtLSBEZWNsYXJhdGlvbnMgdXNlZCBieSBiZmQgbGlicmFyeSAqaW1wbGVtZW50YXRpb24qLgotICAgKFRoaXMgaW5jbHVkZSBmaWxlIGlzIG5vdCBmb3IgdXNlcnMgb2YgdGhlIGxpYnJhcnkuKQotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0qKiBOT1RFOiBsaWJiZmQuaCBpcyBhIEdFTkVSQVRFRCBmaWxlLiAgRG9uJ3QgY2hhbmdlIGl0OyBpbnN0ZWFkLAotKiogY2hhbmdlIGxpYmJmZC1pbi5oIG9yIHRoZSBvdGhlciBCRkQgc291cmNlIGZpbGVzIHByb2Nlc3NlZCB0bwotKiogZ2VuZXJhdGUgdGhpcyBmaWxlLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEFsaWduIGFuIGFkZHJlc3MgdXB3YXJkIHRvIGEgYm91bmRhcnksIGV4cHJlc3NlZCBhcyBhIG51bWJlciBvZiBieXRlcy4KLSAgIEUuZy4gYWxpZ24gdG8gYW4gOC1ieXRlIGJvdW5kYXJ5IHdpdGggYXJndW1lbnQgb2YgOC4gIFRha2UgY2FyZSBuZXZlcgotICAgdG8gd3JhcCBhcm91bmQgaWYgdGhlIGFkZHJlc3MgaXMgd2l0aGluIGJvdW5kYXJ5LTEgb2YgdGhlIGVuZCBvZiB0aGUKLSAgIGFkZHJlc3Mgc3BhY2UuICAqLwotI2RlZmluZSBCRkRfQUxJR04odGhpcywgYm91bmRhcnkpCQkJCQlcCi0gICgoKChiZmRfdm1hKSAodGhpcykgKyAoYm91bmRhcnkpIC0gMSkgPj0gKGJmZF92bWEpICh0aGlzKSkJCVwKLSAgID8gKCgoYmZkX3ZtYSkgKHRoaXMpICsgKChib3VuZGFyeSkgLSAxKSkgJiAofigoYm91bmRhcnkpLTEpKSkJXAotICAgOiB+IChiZmRfdm1hKSAwKQotCi0vKiBJZiB5b3Ugd2FudCB0byByZWFkIGFuZCB3cml0ZSBsYXJnZSBibG9ja3MsIHlvdSBtaWdodCB3YW50IHRvIGRvIGl0Ci0gICBpbiBxdWFudGEgb2YgdGhpcyBhbW91bnQgKi8KLSNkZWZpbmUgREVGQVVMVF9CVUZGRVJTSVpFIDgxOTIKLQotLyogU2V0IGEgdGRhdGEgZmllbGQuICBDYW4ndCB1c2UgdGhlIG90aGVyIG1hY3JvcyBmb3IgdGhpcywgc2luY2UgdGhleQotICAgZG8gY2FzdHMsIGFuZCBjYXN0aW5nIHRvIHRoZSBsZWZ0IG9mIGFzc2lnbm1lbnQgaXNuJ3QgcG9ydGFibGUuICAqLwotI2RlZmluZSBzZXRfdGRhdGEoYmZkLCB2KSAoKGJmZCktPnRkYXRhLmFueSA9IChQVFIpICh2KSkKLQotLyogSWYgQkZEX0lOX01FTU9SWSBpcyBzZXQgZm9yIGEgQkZELCB0aGVuIHRoZSBpb3N0cmVhbSBmaWVsZHMgcG9pbnRzCi0gICB0byBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBiZmRfaW5fbWVtb3J5Ci17Ci0gIC8qIFNpemUgb2YgYnVmZmVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICAvKiBCdWZmZXIgaG9sZGluZyBjb250ZW50cyBvZiBCRkQuICAqLwotICBiZmRfYnl0ZSAqYnVmZmVyOwotfTsKLQotLyogdGRhdGEgZm9yIGFuIGFyY2hpdmUuICBGb3IgYW4gaW5wdXQgYXJjaGl2ZSwgY2FjaGUKLSAgIG5lZWRzIHRvIGJlIGZyZWUoKSdkLiAgRm9yIGFuIG91dHB1dCBhcmNoaXZlLCBzeW1kZWZzIGRvLiAgKi8KLQotc3RydWN0IGFydGRhdGEgewotICBmaWxlX3B0ciBmaXJzdF9maWxlX2ZpbGVwb3M7Ci0gIC8qIFNwZWVkIHVwIHNlYXJjaGluZyB0aGUgYXJtYXAgKi8KLSAgc3RydWN0IGFyX2NhY2hlICpjYWNoZTsKLSAgYmZkICphcmNoaXZlX2hlYWQ7ICAgICAgICAgICAgLyogT25seSBpbnRlcmVzdGluZyBpbiBvdXRwdXQgcm91dGluZXMgKi8KLSAgY2Fyc3ltICpzeW1kZWZzOwkJLyogdGhlIHN5bWRlZiBlbnRyaWVzICovCi0gIHN5bWluZGV4IHN5bWRlZl9jb3VudDsgICAgICAgICAgICAgLyogaG93IG1hbnkgdGhlcmUgYXJlICovCi0gIGNoYXIgKmV4dGVuZGVkX25hbWVzOwkJLyogY2xldmVyIGludGVsIGV4dGVuc2lvbiAqLwotICAvKiB3aGVuIG1vcmUgY29tcGlsZXJzIGFyZSBzdGFuZGFyZCBDLCB0aGlzIGNhbiBiZSBhIHRpbWVfdCAqLwotICBsb25nICBhcm1hcF90aW1lc3RhbXA7CS8qIFRpbWVzdGFtcCB2YWx1ZSB3cml0dGVuIGludG8gYXJtYXAuCi0JCQkJICAgVGhpcyBpcyB1c2VkIGZvciBCU0QgYXJjaGl2ZXMgdG8gY2hlY2sKLQkJCQkgICB0aGF0IHRoZSB0aW1lc3RhbXAgaXMgcmVjZW50IGVub3VnaAotCQkJCSAgIGZvciB0aGUgQlNEIGxpbmtlciB0byBub3QgY29tcGxhaW4sCi0JCQkJICAganVzdCBiZWZvcmUgd2UgZmluaXNoIHdyaXRpbmcgYW4KLQkJCQkgICBhcmNoaXZlLiAgKi8KLSAgZmlsZV9wdHIgYXJtYXBfZGF0ZXBvczsJLyogUG9zaXRpb24gd2l0aGluIGFyY2hpdmUgdG8gc2VlayB0bwotCQkJCSAgIHJld3JpdGUgdGhlIGRhdGUgZmllbGQuICAqLwotICBQVFIgdGRhdGE7CQkJLyogQmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi19OwotCi0jZGVmaW5lIGJmZF9hcmRhdGEoYmZkKSAoKGJmZCktPnRkYXRhLmFvdXRfYXJfZGF0YSkKLQotLyogR29lcyBpbiBiZmQncyBhcmVsdF9kYXRhIHNsb3QgKi8KLXN0cnVjdCBhcmVsdGRhdGEgewotICBjaGFyICogYXJjaF9oZWFkZXI7CQkJICAgICAvKiBpdCdzIGFjdHVhbGx5IGEgc3RyaW5nICovCi0gIHVuc2lnbmVkIGludCBwYXJzZWRfc2l6ZTsgICAgIC8qIG9jdGV0cyBvZiBmaWxlc2l6ZSBub3QgaW5jbHVkaW5nIGFyX2hkciAqLwotICBjaGFyICpmaWxlbmFtZTsJCQkgICAgIC8qIG51bGwtdGVybWluYXRlZCAqLwotfTsKLQotI2RlZmluZSBhcmVsdF9zaXplKGJmZCkgKCgoc3RydWN0IGFyZWx0ZGF0YSAqKSgoYmZkKS0+YXJlbHRfZGF0YSkpLT5wYXJzZWRfc2l6ZSkKLQotZXh0ZXJuIFBUUiBiZmRfbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotZXh0ZXJuIFBUUiBiZmRfcmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotZXh0ZXJuIFBUUiBiZmRfem1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLQotZXh0ZXJuIGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgX2JmZF9lcnJvcl9oYW5kbGVyOwotCi0vKiBUaGVzZSByb3V0aW5lcyBhbGxvY2F0ZSBhbmQgZnJlZSB0aGluZ3Mgb24gdGhlIEJGRCdzIG9iamFsbG9jLiAgKi8KLQotZXh0ZXJuIFBUUiBiZmRfYWxsb2MgUEFSQU1TICgoYmZkICosIHNpemVfdCkpOwotZXh0ZXJuIFBUUiBiZmRfemFsbG9jIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QpKTsKLWV4dGVybiB2b2lkIGJmZF9yZWxlYXNlIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotYmZkICoJX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsIFBBUkFNUyAoKGJmZCAqb2JmZCkpOwotYmZkICoJX2JmZF9sb29rX2Zvcl9iZmRfaW5fY2FjaGUgUEFSQU1TICgoYmZkICphcmNoX2JmZCwgZmlsZV9wdHIgaW5kZXgpKTsKLWJvb2xlYW4gX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyLCBiZmQgKikpOwotYm9vbGVhbglfYmZkX2dlbmVyaWNfbWthcmNoaXZlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotY29uc3QgYmZkX3RhcmdldCAqYmZkX2dlbmVyaWNfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbgliZmRfc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuIGJmZF9zbHVycF9ic2RfYXJtYXBfZjIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jZGVmaW5lIGJmZF9zbHVycF9ic2RfYXJtYXAgYmZkX3NsdXJwX2FybWFwCi0jZGVmaW5lIGJmZF9zbHVycF9jb2ZmX2FybWFwIGJmZF9zbHVycF9hcm1hcAotYm9vbGVhbglfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICopKTsKLWJvb2xlYW4JX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbiBfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCkpOwotYmZkICpfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyBQQVJBTVMgKChiZmQgKmFyY2hpdmUsIGZpbGVfcHRyIGZpbGVwb3MpKTsKLWV4dGVybiBiZmQgKl9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4IFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpOwotYmZkICogX2JmZF9uZXdfYmZkIFBBUkFNUyAoKHZvaWQpKTsKLQotYm9vbGVhbgliZmRfZmFsc2UgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWJvb2xlYW4JYmZkX3RydWUgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLVBUUgliZmRfbnVsbHZvaWRwdHIgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWludAliZmRfMCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotdW5zaWduZWQgaW50CWJmZF8wdSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotbG9uZwliZmRfMGwgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWxvbmcJX2JmZF9uMSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotdm9pZAliZmRfdm9pZCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotCi1iZmQgKl9iZmRfbmV3X2JmZF9jb250YWluZWRfaW4gUEFSQU1TICgoYmZkICopKTsKLWNvbnN0IGJmZF90YXJnZXQgKl9iZmRfZHVtbXlfdGFyZ2V0IFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi12b2lkCWJmZF9kb250X3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLXZvaWQJYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci12b2lkCWJmZF9nbnVfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotCi1ib29sZWFuCWJzZF93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKmFyY2gsIHVuc2lnbmVkIGludCBlbGVuZ3RoLAotCQkJCSAgc3RydWN0IG9ybCAqbWFwLCB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCBpbnQgc3RyaWR4KSk7Ci0KLWJvb2xlYW4JY29mZl93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKmFyY2gsIHVuc2lnbmVkIGludCBlbGVuZ3RoLAotCQkJCSAgIHN0cnVjdCBvcmwgKm1hcCwgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOwotCi1leHRlcm4gUFRSIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkciBQQVJBTVMgKChiZmQgKikpOwotCi1leHRlcm4gUFRSIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi1iZmQgKgliZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICphcmNoaXZlLAotCQkJCQkJICAgICBiZmQgKmxhc3RfZmlsZSkpOwotCi1pbnQJYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotCi0jZGVmaW5lIF9iZmRfcmVhZF9hcl9oZHIoYWJmZCkgXAotICBCRkRfU0VORCAoYWJmZCwgX2JmZF9yZWFkX2FyX2hkcl9mbiwgKGFiZmQpKQotDAotLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMuICBVc2UKLSAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cCBiZmRfdHJ1ZQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gYmZkX3RydWUKLSNkZWZpbmUgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF90cnVlKQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfd2luZG93ICosIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9DT1BZLiAgVXNlCi0gICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZCAqLCBhc3ltYm9sICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIFBUUikpKSBiZmRfdHJ1ZSkKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9DT1JFIHdoZW4gdGhlcmUgaXMgbm8gY29yZSBmaWxlCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKS4gICovCi0KLWV4dGVybiBjaGFyICpfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgd2hlbiB0aGVyZSBpcyBubyBhcmNoaXZlCi0gICBmaWxlIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9zbHVycF9hcm1hcCBiZmRfZmFsc2UKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfZmFsc2UKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV90cnVuY2F0ZV9hcm5hbWUgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNoYXIgKikpKSBiZmRfdm9pZCkKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfd3JpdGVfYXJtYXAgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfcmVhZF9hcl9oZHIgYmZkX251bGx2b2lkcHRyCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gICgoYmZkICooKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfZ2V0X2VsdF9hdF9pbmRleCBcCi0gICgoYmZkICooKikgUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfZmFsc2UKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHRvIGdldCBCU0Qgc3R5bGUKLSAgIGFyY2hpdmVzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLiAgKi8KLQotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3NsdXJwX2FybWFwIGJmZF9zbHVycF9ic2RfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi1leHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF90cnVuY2F0ZV9hcm5hbWUgYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF93cml0ZV9hcm1hcCBic2Rfd3JpdGVfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9yZWFkX2FyX2hkciBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICBiZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFwKLSAgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB0byBnZXQgQ09GRiBzdHlsZQotICAgYXJjaGl2ZXMuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLiAgKi8KLQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9zbHVycF9hcm1hcCBiZmRfc2x1cnBfY29mZl9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi1leHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfd3JpdGVfYXJtYXAgY29mZl93cml0ZV9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9yZWFkX2FyX2hkciBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFwKLSAgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF90cnVlCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyB3aGVyZSB0aGVyZSBpcyBubyBzeW1ib2wKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbjEKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYiBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfbWFrZV9lbXB0eV9zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbCBcCi0gICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbyBcCi0gICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpKSBiZmRfdm9pZCkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vIFwKLSAgKChhbGVudCAqKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZSBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLCBcCi0JICAgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIsIHVuc2lnbmVkIGxvbmcpKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSICosIHVuc2lnbmVkIGludCAqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwgYXN5bWJvbCAqKSkpIFwKLSAgIGJmZF9udWxsdm9pZHB0cikKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9SRUxPQ1Mgd2hlbiB0aGVyZSBpcyBubyByZWxvYwotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19jYW5vbmljYWxpemVfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwIFwKLSAgKChyZWxvY19ob3d0b190eXBlICooKikgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfV1JJVEUgZm9yIHRhcmdldHMgd2hpY2ggbWF5IG5vdAotICAgYmUgd3JpdHRlbi4gIFVzZSBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9ub3dyaXRlKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3dyaXRlX3NldF9hcmNoX21hY2ggXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vd3JpdGVfc2V0X3NlY3Rpb25fY29udGVudHMgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSkpIFwKLSAgIGJmZF9mYWxzZSkKLQotLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1dSSVRFLiAgVXNlCi0gICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX3NldF9hcmNoX21hY2ggYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfTElOSyBmb3IgdGFyZ2V0cyB3aGljaCBkbyBub3QKLSAgIHN1cHBvcnQgbGlua2luZy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluaykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9saW5rX3NpemVvZl9oZWFkZXJzICgoaW50ICgqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpKSBiZmRfMCkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gICgoYmZkX2J5dGUgKigqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBcCi0JICAgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSkpIFwKLSAgIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX3JlbGF4X3NlY3Rpb24gXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2djX3NlY3Rpb25zIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKigqKSBQQVJBTVMgKChiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX2FkZF9zeW1ib2xzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9maW5hbF9saW5rIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX2ZhbHNlKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgZm9yIHRhcmdldHMgd2hpY2ggZG8gbm90Ci0gICBoYXZlIGR5bmFtaWMgc3ltYm9scyBvciByZWxvY3MuICBVc2UgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQwotICAgKF9iZmRfbm9keW5hbWljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbjEKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotDAotLyogR2VuZXJpYyByb3V0aW5lIHRvIGRldGVybWluZSBvZiB0aGUgZ2l2ZW4gc3ltYm9sIGlzIGEgbG9jYWwKLSAgIGxhYmVsLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBHZW5lcmljIG1pbmlzeW1ib2wgcm91dGluZXMuICAqLwotZXh0ZXJuIGxvbmcgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpOwotZXh0ZXJuIGFzeW1ib2wgKl9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY29uc3QgUFRSLCBhc3ltYm9sICopKTsKLQotLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHVzaW5nIC5zdGFiLy5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBib29sZWFuICosIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICosIFBUUiAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYWRlcnN0IGxpbmUgdXNpbmcgRFdBUkYgMSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLQotLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHVzaW5nIERXQVJGIDIgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogQSByb3V0aW5lIHRvIGNyZWF0ZSBlbnRyaWVzIGZvciBhIGJmZF9saW5rX2hhc2hfdGFibGUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5LAotCSAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCi0JICAgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci0KLS8qIEluaXRpYWxpemUgYSBiZmRfbGlua19oYXNoX3RhYmxlLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotCi0vKiBHZW5lcmljIGxpbmsgaGFzaCB0YWJsZSBjcmVhdGlvbiByb3V0aW5lLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLQotLyogR2VuZXJpYyBhZGQgc3ltYm9sIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogR2VuZXJpYyBhZGQgc3ltYm9sIHJvdXRpbmUuICBUaGlzIHZlcnNpb24gaXMgdXNlZCBieSB0YXJnZXRzIGZvcgotICAgd2hpY2ggdGhlIGxpbmtlciBtdXN0IGNvbGxlY3QgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBieSBuYW1lLAotICAgYXMgdGhlIGNvbGxlY3QyIHByb2dyYW0gZG9lcy4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgYXJjaGl2ZSBhZGQgc3ltYm9sIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBib29sZWFuICgqY2hlY2tmbikgKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKSk7Ci0KLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uIHRvIGF2b2lkIHByb3RvdHlwZSBlcnJvcnMuICAqLwotdHlwZWRlZiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSBfYmZkX2xpbmtfaGFzaF9lbnRyeTsKLQotLyogR2VuZXJpYyByb3V0aW5lIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKm5hbWUsIGZsYWd3b3JkLAotCSAgIGFzZWN0aW9uICosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjb3B5LAotCSAgIGJvb2xlYW4gY29uc3RydWN0b3IsIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci0KLS8qIEdlbmVyaWMgbGluayByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpOwotCi0vKiBHZW5lcmljIHJlbG9jX2xpbmtfb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIERlZmF1bHQgbGluayBvcmRlciBwcm9jZXNzaW5nIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogQ291bnQgdGhlIG51bWJlciBvZiByZWxvYyBlbnRyaWVzIGluIGEgbGluayBvcmRlciBsaXN0LiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBGaW5hbCBsaW5rIHJlbG9jYXRpb24gcm91dGluZS4gICovCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIGJmZF92bWEgYWRkcmVzcywgYmZkX3ZtYSB2YWx1ZSwgYmZkX3ZtYSBhZGRlbmQpKTsKLQotLyogUmVsb2NhdGUgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIGJ5IGEgaG93dG8gYW5kIGEgdmFsdWUuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICopKTsKLQotLyogTGluayBzdGFicyBpbiBzZWN0aW9ucyBpbiB0aGUgZmlyc3QgcGFzcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfbGlua19zZWN0aW9uX3N0YWJzCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgYXNlY3Rpb24gKiwgUFRSICopKTsKLQotLyogV3JpdGUgb3V0IHRoZSAuc3RhYiBzZWN0aW9uIHdoZW4gbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicwotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIFBUUiAqLCBiZmRfYnl0ZSAqKSk7Ci0KLS8qIFdyaXRlIG91dCB0aGUgLnN0YWJzdHIgc3RyaW5nIHRhYmxlIHdoZW4gbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIFBBUkFNUyAoKGJmZCAqLCBQVFIgKikpOwotCi0vKiBGaW5kIGFuIG9mZnNldCB3aXRoaW4gYSAuc3RhYiBzZWN0aW9uIHdoZW4gbGlua2luZyBzdGFicyBpbgotICAgc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYmZkX3ZtYSBfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBQVFIgKiwgYmZkX3ZtYSkpOwotCi0vKiBDcmVhdGUgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKl9iZmRfc3RyaW5ndGFiX2luaXQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBDcmVhdGUgYW4gWENPRkYgLmRlYnVnIHNlY3Rpb24gc3R5bGUgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogRnJlZSBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gdm9pZCBfYmZkX3N0cmluZ3RhYl9mcmVlIFBBUkFNUyAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBHZXQgdGhlIHNpemUgb2YgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgX2JmZF9zdHJpbmd0YWJfc2l6ZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogQWRkIGEgc3RyaW5nIHRvIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBiZmRfc2l6ZV90eXBlIF9iZmRfc3RyaW5ndGFiX2FkZAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBoYXNoLAotCSAgIGJvb2xlYW4gY29weSkpOwotCi0vKiBXcml0ZSBvdXQgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zdHJpbmd0YWJfZW1pdCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0KLS8qIENoZWNrIHRoYXQgZW5kaWFubmVzcyBvZiBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgbWF0Y2guICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2ggUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0MCi0vKiBNYWNyb3MgdG8gdGVsbCBpZiBiZmRzIGFyZSByZWFkIG9yIHdyaXRlIGVuYWJsZWQuCi0KLSAgIE5vdGUgdGhhdCBiZmRzIG9wZW4gZm9yIHJlYWQgbWF5IGJlIHNjcmliYmxlZCBpbnRvIGlmIHRoZSBmZCBwYXNzZWQKLSAgIHRvIGJmZF9mZG9wZW5yIGlzIGFjdHVhbGx5IG9wZW4gYm90aCBmb3IgcmVhZCBhbmQgd3JpdGUKLSAgIHNpbXVsdGFuZW91c2x5LiAgSG93ZXZlciBhbiBvdXRwdXQgYmZkIHdpbGwgbmV2ZXIgYmUgb3BlbiBmb3IKLSAgIHJlYWQuICBUaGVyZWZvcmUgc29tZXRpbWVzIHlvdSB3YW50IHRvIGNoZWNrIGJmZF9yZWFkX3Agb3IKLSAgICFiZmRfcmVhZF9wLCBhbmQgb25seSBzb21ldGltZXMgYmZkX3dyaXRlX3AuCi0qLwotCi0jZGVmaW5lCWJmZF9yZWFkX3AoYWJmZCkgKChhYmZkKS0+ZGlyZWN0aW9uID09IHJlYWRfZGlyZWN0aW9uIHx8IChhYmZkKS0+ZGlyZWN0aW9uID09IGJvdGhfZGlyZWN0aW9uKQotI2RlZmluZQliZmRfd3JpdGVfcChhYmZkKSAoKGFiZmQpLT5kaXJlY3Rpb24gPT0gd3JpdGVfZGlyZWN0aW9uIHx8IChhYmZkKS0+ZGlyZWN0aW9uID09IGJvdGhfZGlyZWN0aW9uKQotCi12b2lkCWJmZF9hc3NlcnQgUEFSQU1TICgoY29uc3QgY2hhciosaW50KSk7Ci0KLSNkZWZpbmUgQkZEX0FTU0VSVCh4KSBcCi17IGlmICghKHgpKSBiZmRfYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfQotCi0jZGVmaW5lIEJGRF9GQUlMKCkgXAoteyBiZmRfYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfQotCi1leHRlcm4gdm9pZCBfYmZkX2Fib3J0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopKQotICAgICBBVFRSSUJVVEVfTk9SRVRVUk47Ci0KLS8qIGlmIGdjYywgd2UgY2FuIGdpdmUgYSBmdW5jdGlvbiBuYW1lLCB0b28gKi8KLSNpZiAhZGVmaW5lZCAoX19HTlVDX18pIHx8IF9fR05VQ19NSU5PUl9fIDw9IDUKLSNkZWZpbmUgX19QUkVUVFlfRlVOQ1RJT05fXyAgKChjaGFyICopIE5VTEwpCi0jZW5kaWYKLQotI3VuZGVmIGFib3J0Ci0jZGVmaW5lIGFib3J0KCkgX2JmZF9hYm9ydCAoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fKQotCi1GSUxFICoJYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIGJmZCAqYmZkX2xhc3RfY2FjaGU7Ci0KLS8qIExpc3Qgb2Ygc3VwcG9ydGVkIHRhcmdldCB2ZWN0b3JzLCBhbmQgdGhlIGRlZmF1bHQgdmVjdG9yIChpZgotICAgYmZkX2RlZmF1bHRfdmVjdG9yWzBdIGlzIE5VTEwsIHRoZXJlIGlzIG5vIGRlZmF1bHQpLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgYmZkX3RhcmdldF92ZWN0b3JbXTsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpiZmRfZGVmYXVsdF92ZWN0b3JbXTsKLQotLyogRnVuY3Rpb25zIHNoYXJlZCBieSB0aGUgRUNPRkYgYW5kIE1JUFMgRUxGIGJhY2tlbmRzLCB3aGljaCBoYXZlIG5vCi0gICBvdGhlciBjb21tb24gaGVhZGVyIGZpbGVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgZWNvZmZfZmluZF9saW5lOwotI2VuZGlmCi0KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCwgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIgUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0gUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyBQQVJBTVMgKChQVFIsIGJmZF9ieXRlICopKTsKLQotZXh0ZXJuIGJmZF92bWEgX2JmZF9nZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIF9iZmRfc2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hKSk7Ci0KLS8qIEZ1bmN0aW9uIHNoYXJlZCBieSB0aGUgQ09GRiBhbmQgRUxGIFNIIGJhY2tlbmRzLCB3aGljaCBoYXZlIG5vCi0gICBvdGhlciBjb21tb24gaGVhZGVyIGZpbGVzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgYm9vbGVhbiAoKikgKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpLAotCSAgIFBUUiwgYmZkX3ZtYSAqKiwgYmZkX3ZtYSAqLCBiZmRfdm1hLCBiZmRfdm1hLCBib29sZWFuICopKTsKLQotLyogQW5kIG1vcmUgZm9sbG93cyAqLwotCmRpZmYgLS1naXQgYS9iZmQvbGliYmZkLmMgYi9iZmQvbGliYmZkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0M2U4OGMuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmJmZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMwNyArMCwwIEBACi0vKiBBc3NvcnRlZCBCRkQgc3VwcG9ydCByb3V0aW5lcywgb25seSB1c2VkIGludGVybmFsbHkuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSNkZWZpbmUgZ2V0cGFnZXNpemUoKSAyMDQ4Ci0jZW5kaWYKLQotc3RhdGljIGludCByZWFsX3JlYWQgUEFSQU1TICgoUFRSLCBzaXplX3QsIHNpemVfdCwgRklMRSAqKSk7Ci0KLS8qCi1TRUNUSU9OCi0JSW50ZXJuYWwgZnVuY3Rpb25zCi0KLURFU0NSSVBUSU9OCi0JVGhlc2Ugcm91dGluZXMgYXJlIHVzZWQgd2l0aGluIEJGRC4KLQlUaGV5IGFyZSBub3QgaW50ZW5kZWQgZm9yIGV4cG9ydCwgYnV0IGFyZSBkb2N1bWVudGVkIGhlcmUgZm9yCi0JY29tcGxldGVuZXNzLgotKi8KLQotLyogQSByb3V0aW5lIHdoaWNoIGlzIHVzZWQgaW4gdGFyZ2V0IHZlY3RvcnMgZm9yIHVuc3VwcG9ydGVkCi0gICBvcGVyYXRpb25zLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1iZmRfZmFsc2UgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBIHJvdXRpbmUgd2hpY2ggaXMgdXNlZCBpbiB0YXJnZXQgdmVjdG9ycyBmb3Igc3VwcG9ydGVkIG9wZXJhdGlvbnMKLSAgIHdoaWNoIGRvIG5vdCBhY3R1YWxseSBkbyBhbnl0aGluZy4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotYmZkX3RydWUgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEEgcm91dGluZSB3aGljaCBpcyB1c2VkIGluIHRhcmdldCB2ZWN0b3JzIGZvciB1bnN1cHBvcnRlZAotICAgb3BlcmF0aW9ucyB3aGljaCByZXR1cm4gYSBwb2ludGVyIHZhbHVlLiAgKi8KLQotLypBUkdTVVNFRCovCi1QVFIKLWJmZF9udWxsdm9pZHB0ciAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gTlVMTDsKLX0KLQotLypBUkdTVVNFRCovCi1pbnQgCi1iZmRfMCAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotLypBUkdTVVNFRCovCi11bnNpZ25lZCBpbnQgCi1iZmRfMHUgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgIHJldHVybiAwOwotfQotCi0vKkFSR1VTRUQqLwotbG9uZwotYmZkXzBsIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBBIHJvdXRpbmUgd2hpY2ggaXMgdXNlZCBpbiB0YXJnZXQgdmVjdG9ycyBmb3IgdW5zdXBwb3J0ZWQKLSAgIG9wZXJhdGlvbnMgd2hpY2ggcmV0dXJuIC0xIG9uIGVycm9yLiAgKi8KLQotLypBUkdTVVNFRCovCi1sb25nCi1fYmZkX24xIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qQVJHU1VTRUQqLwotdm9pZCAKLWJmZF92b2lkIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci19Ci0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChpZ25vcmVfY29yZV9iZmQsIGlnbm9yZV9leGVjX2JmZCkKLSAgICAgYmZkICppZ25vcmVfY29yZV9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICppZ25vcmVfZXhlY19iZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSb3V0aW5lIHRvIGhhbmRsZSBjb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGVudHJ5IHBvaW50IGZvciB0YXJnZXRzCi0gICB3aXRob3V0IGNvcmUgZmlsZSBzdXBwb3J0LiAgKi8KLQotLypBUkdTVVNFRCovCi1jaGFyICoKLV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGlnbm9yZV9hYmZkKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiAoY2hhciAqKU5VTEw7Ci19Ci0KLS8qIFJvdXRpbmUgdG8gaGFuZGxlIGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBlbnRyeSBwb2ludCBmb3IgdGFyZ2V0cwotICAgd2l0aG91dCBjb3JlIGZpbGUgc3VwcG9ydC4gICovCi0KLS8qQVJHU1VTRUQqLwotaW50Ci1fYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGlnbm9yZV9hYmZkKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiAwOwotfQotCi0vKkFSR1NVU0VEKi8KLWNvbnN0IGJmZF90YXJnZXQgKgotX2JmZF9kdW1teV90YXJnZXQgKGlnbm9yZV9hYmZkKQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICByZXR1cm4gMDsKLX0KLQwKLS8qIEFsbG9jYXRlIG1lbW9yeSB1c2luZyBtYWxsb2MuICAqLwotCi1QVFIKLWJmZF9tYWxsb2MgKHNpemUpCi0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgcHRyOwotCi0gIHB0ciA9IChQVFIpIG1hbGxvYyAoc2l6ZSk7Ci0gIGlmIChwdHIgPT0gTlVMTCAmJiBzaXplICE9IDApCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIFJlYWxsb2NhdGUgbWVtb3J5IHVzaW5nIHJlYWxsb2MuICAqLwotCi1QVFIKLWJmZF9yZWFsbG9jIChwdHIsIHNpemUpCi0gICAgIFBUUiBwdHI7Ci0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgcmV0OwotCi0gIGlmIChwdHIgPT0gTlVMTCkKLSAgICByZXQgPSBtYWxsb2MgKHNpemUpOwotICBlbHNlCi0gICAgcmV0ID0gcmVhbGxvYyAocHRyLCBzaXplKTsKLQotICBpZiAocmV0ID09IE5VTEwpCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQWxsb2NhdGUgbWVtb3J5IHVzaW5nIG1hbGxvYyBhbmQgY2xlYXIgaXQuICAqLwotCi1QVFIKLWJmZF96bWFsbG9jIChzaXplKQotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHB0cjsKLQotICBwdHIgPSAoUFRSKSBtYWxsb2MgKHNpemUpOwotCi0gIGlmIChzaXplICE9IDApCi0gICAgewotICAgICAgaWYgKHB0ciA9PSBOVUxMKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgZWxzZQotCW1lbXNldCAocHRyLCAwLCBzaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHB0cjsKLX0KLQwKLS8qIFNvbWUgSU8gY29kZSAqLwotCi0KLS8qIE5vdGUgdGhhdCBhcmNoaXZlIGVudHJpZXMgZG9uJ3QgaGF2ZSBzdHJlYW1zOyB0aGV5IHNoYXJlIHRoZWlyIHBhcmVudCdzLgotICAgVGhpcyBhbGxvd3Mgc29tZW9uZSB0byBwbGF5IHdpdGggdGhlIGlvc3RyZWFtIGJlaGluZCBCRkQncyBiYWNrLgotCi0gICBBbHNvLCBub3RlIHRoYXQgdGhlIG9yaWdpbiBwb2ludGVyIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIGEgZmlsZSdzCi0gICBjb250ZW50cyAoMCBmb3Igbm9uLWFyY2hpdmUgZWxlbWVudHMpLiAgRm9yIGFyY2hpdmUgZW50cmllcyB0aGlzIGlzIHRoZQotICAgZmlyc3Qgb2N0ZXQgaW4gdGhlIGZpbGUsIE5PVCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcmNoaXZlIGhlYWRlci4gKi8KLQotc3RhdGljIGludAotcmVhbF9yZWFkICh3aGVyZSwgYSxiLCBmaWxlKQotICAgICBQVFIgd2hlcmU7Ci0gICAgIHNpemVfdCBhOwotICAgICBzaXplX3QgYjsKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgLyogRklYTUUgLSB0aGlzIGxvb2tzIGxpa2UgYW4gb3B0aW1pemF0aW9uLCBidXQgaXQncyByZWFsbHkgdG8gY292ZXIKLSAgICAgdXAgZm9yIGEgZmVhdHVyZSBvZiBzb21lIE9TcyAobm90IHNvbGFyaXMgLSBzaWdoKSB0aGF0Ci0gICAgIGxkL3BlLWRsbC5jIHRha2VzIGFkdmFudGFnZSBvZiAoYXBwYXJlbnRseSkgd2hlbiBpdCBjcmVhdGVzIEJGRHMKLSAgICAgaW50ZXJuYWxseSBhbmQgdHJpZXMgdG8gbGluayBhZ2FpbnN0IHRoZW0uICBCRkQgc2VlbXMgdG8gYmUgc21hcnQKLSAgICAgZW5vdWdoIHRvIHJlYWxpemUgdGhlcmUgYXJlIG5vIHN5bWJvbCByZWNvcmRzIGluIHRoZSAiZmlsZSIgdGhhdAotICAgICBkb2Vzbid0IGV4aXN0IGJ1dCBhdHRlbXB0cyB0byByZWFkIHRoZW0gYW55d2F5LiAgT24gU29sYXJpcywKLSAgICAgYXR0ZW1wdGluZyB0byByZWFkIHplcm8gYnl0ZXMgZnJvbSBhIE5VTEwgZmlsZSByZXN1bHRzIGluIGEgY29yZQotICAgICBkdW1wLCBidXQgb24gb3RoZXIgcGxhdGZvcm1zIGl0IGp1c3QgcmV0dXJucyB6ZXJvIGJ5dGVzIHJlYWQuCi0gICAgIFRoaXMgbWFrZXMgaXQgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUuIC0gREogKi8KLSAgaWYgKGEgPT0gMCB8fCBiID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSNpZiBkZWZpbmVkIChfX1ZBWCkgJiYgZGVmaW5lZCAoVk1TKQotICAvKiBBcHBhcmVudGx5IGZyZWFkIG9uIFZheCBWTVMgZG9lcyBub3Qga2VlcCB0aGUgcmVjb3JkIGxlbmd0aAotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIHJldHVybiByZWFkIChmaWxlbm8gKGZpbGUpLCB3aGVyZSwgYSAqIGIpOwotI2Vsc2UKLSAgcmV0dXJuIGZyZWFkICh3aGVyZSwgYSwgYiwgZmlsZSk7Ci0jZW5kaWYKLX0KLQotLyogUmV0dXJuIHZhbHVlIGlzIGFtb3VudCByZWFkIChGSVhNRTogaG93IGFyZSBlcnJvcnMgYW5kIGVuZCBvZiBmaWxlIGRlYWx0Ci0gICB3aXRoPyAgV2UgbmV2ZXIgY2FsbCBiZmRfc2V0X2Vycm9yLCB3aGljaCBpcyBwcm9iYWJseSBhIG1pc3Rha2UpLiAgKi8KLQotYmZkX3NpemVfdHlwZQotYmZkX3JlYWQgKHB0ciwgc2l6ZSwgbml0ZW1zLCBhYmZkKQotICAgICBQVFIgcHRyOwotICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgIGJmZF9zaXplX3R5cGUgbml0ZW1zOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBucmVhZDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltOwotICAgICAgYmZkX3NpemVfdHlwZSBnZXQ7Ci0KLSAgICAgIGJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSBhYmZkLT5pb3N0cmVhbTsKLSAgICAgIGdldCA9IHNpemUgKiBuaXRlbXM7Ci0gICAgICBpZiAoYWJmZC0+d2hlcmUgKyBnZXQgPiBiaW0tPnNpemUpCi0JewotCSAgZ2V0ID0gYmltLT5zaXplIC0gYWJmZC0+d2hlcmU7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCX0KLSAgICAgIG1lbWNweSAocHRyLCBiaW0tPmJ1ZmZlciArIGFiZmQtPndoZXJlLCBnZXQpOwotICAgICAgYWJmZC0+d2hlcmUgKz0gZ2V0OwotICAgICAgcmV0dXJuIGdldDsKLSAgICB9Ci0KLSAgbnJlYWQgPSByZWFsX3JlYWQgKHB0ciwgMSwgKHNpemVfdCkoc2l6ZSpuaXRlbXMpLCBiZmRfY2FjaGVfbG9va3VwKGFiZmQpKTsKLSAgaWYgKG5yZWFkID4gMCkKLSAgICBhYmZkLT53aGVyZSArPSBucmVhZDsKLQotICAvKiBTZXQgYmZkX2Vycm9yIGlmIHdlIGRpZCBub3QgcmVhZCBhcyBtdWNoIGRhdGEgYXMgd2UgZXhwZWN0ZWQuCi0KLSAgICAgSWYgdGhlIHJlYWQgZmFpbGVkIGR1ZSB0byBhbiBlcnJvciBzZXQgdGhlIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCwKLSAgICAgZWxzZSBzZXQgYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkLgotCi0gICAgIEEgQkZEIGJhY2tlbmQgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkIHRvCi0gICAgIHByb3ZpZGUgc29tZXRoaW5nIG1vcmUgdXNlZnVsIChlZy4gbm9fc3ltYm9scyBvciB3cm9uZ19mb3JtYXQpLiAgKi8KLSAgaWYgKG5yZWFkICE9IChpbnQpIChzaXplICogbml0ZW1zKSkKLSAgICB7Ci0gICAgICBpZiAoZmVycm9yIChiZmRfY2FjaGVfbG9va3VwIChhYmZkKSkpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIGVsc2UKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgIH0KLQotICByZXR1cm4gbnJlYWQ7Ci19Ci0KLS8qIFRoZSB3aW5kb3cgc3VwcG9ydCBzdHVmZiBzaG91bGQgcHJvYmFibHkgYmUgYnJva2VuIG91dCBpbnRvCi0gICBhbm90aGVyIGZpbGUuLi4uICAqLwotLyogVGhlIGlkZWEgYmVoaW5kIHRoZSBuZXh0IGFuZCByZWZjb3VudCBmaWVsZHMgaXMgdGhhdCBvbmUgbWFwcGVkCi0gICByZWdpb24gY2FuIHN1ZmZpY2UgZm9yIG11bHRpcGxlIHJlYWQtb25seSB3aW5kb3dzIG9yIG11bHRpcGxlCi0gICBub24tb3ZlcmxhcHBpbmcgcmVhZC13cml0ZSB3aW5kb3dzLiAgSXQncyBub3QgaW1wbGVtZW50ZWQgeWV0Ci0gICB0aG91Z2guICAqLwotc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsIHsKLSAgc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsICpuZXh0OwotICBQVFIgZGF0YTsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBpbnQgcmVmY291bnQgOiAzMTsJCS8qIHNob3VsZCBiZSBlbm91Z2guLi4gKi8KLSAgdW5zaWduZWQgbWFwcGVkIDogMTsJCS8qIDEgPSBtbWFwLCAwID0gbWFsbG9jICovCi19OwotCi12b2lkCi1iZmRfaW5pdF93aW5kb3cgKHdpbmRvd3ApCi0gICAgIGJmZF93aW5kb3cgKndpbmRvd3A7Ci17Ci0gIHdpbmRvd3AtPmRhdGEgPSAwOwotICB3aW5kb3dwLT5pID0gMDsKLSAgd2luZG93cC0+c2l6ZSA9IDA7Ci19Ci0MCi0vKiBDdXJyZW50bHksIGlmIFVTRV9NTUFQIGlzIHVuZGVmaW5lZCwgbm9uZSBpZiB0aGUgd2luZG93IHN0dWZmIGlzCi0gICB1c2VkLiAgT2theSwgc28gaXQncyBtaXMtbmFtZWQuICBBdCBsZWFzdCB0aGUgY29tbWFuZC1saW5lIG9wdGlvbgotICAgIi0td2l0aG91dC1tbWFwIiBpcyBtb3JlIG9idmlvdXMgdGhhbiAiLS13aXRob3V0LXdpbmRvd3MiIG9yIHNvbWUKLSAgIHN1Y2guICAqLwotI2lmZGVmIFVTRV9NTUFQCi0KLSN1bmRlZiBIQVZFX01QUk9URUNUIC8qIGNvZGUncyBub3QgdGVzdGVkIHlldCAqLwotCi0jaWYgSEFWRV9NTUFQIHx8IEhBVkVfTVBST1RFQ1QgfHwgSEFWRV9NQURWSVNFCi0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNlbmRpZgotCi0jaWZuZGVmIE1BUF9GSUxFCi0jZGVmaW5lIE1BUF9GSUxFIDAKLSNlbmRpZgotCi1zdGF0aWMgaW50IGRlYnVnX3dpbmRvd3M7Ci0KLXZvaWQKLWJmZF9mcmVlX3dpbmRvdyAod2luZG93cCkKLSAgICAgYmZkX3dpbmRvdyAqd2luZG93cDsKLXsKLSAgYmZkX3dpbmRvd19pbnRlcm5hbCAqaSA9IHdpbmRvd3AtPmk7Ci0gIHdpbmRvd3AtPmkgPSAwOwotICB3aW5kb3dwLT5kYXRhID0gMDsKLSAgaWYgKGkgPT0gMCkKLSAgICByZXR1cm47Ci0gIGktPnJlZmNvdW50LS07Ci0gIGlmIChkZWJ1Z193aW5kb3dzKQotICAgIGZwcmludGYgKHN0ZGVyciwgImZyZWVpbmcgd2luZG93IEAlcDwlcCwlbHgsJXA+XG4iLAotCSAgICAgd2luZG93cCwgd2luZG93cC0+ZGF0YSwgd2luZG93cC0+c2l6ZSwgd2luZG93cC0+aSk7Ci0gIGlmIChpLT5yZWZjb3VudCAhPSAwKQotICAgIHJldHVybjsKLQotICBpZiAoaS0+bWFwcGVkKQotICAgIHsKLSNpZmRlZiBIQVZFX01NQVAKLSAgICAgIG11bm1hcCAoaS0+ZGF0YSwgaS0+c2l6ZSk7Ci0gICAgICBnb3RvIG5vX2ZyZWU7Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICB9Ci0jaWZkZWYgSEFWRV9NUFJPVEVDVAotICBtcHJvdGVjdCAoaS0+ZGF0YSwgaS0+c2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7Ci0jZW5kaWYKLSAgZnJlZSAoaS0+ZGF0YSk7Ci0jaWZkZWYgSEFWRV9NTUFQCi0gbm9fZnJlZToKLSNlbmRpZgotICBpLT5kYXRhID0gMDsKLSAgLyogVGhlcmUgc2hvdWxkIGJlIG5vIG1vcmUgcmVmZXJlbmNlcyB0byBpIGF0IHRoaXMgcG9pbnQuICAqLwotICBmcmVlIChpKTsKLX0KLQotc3RhdGljIGludCBva190b19tYXAgPSAxOwotCi1ib29sZWFuCi1iZmRfZ2V0X2ZpbGVfd2luZG93IChhYmZkLCBvZmZzZXQsIHNpemUsIHdpbmRvd3AsIHdyaXRhYmxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICBiZmRfd2luZG93ICp3aW5kb3dwOwotICAgICBib29sZWFuIHdyaXRhYmxlOwotewotICBzdGF0aWMgc2l6ZV90IHBhZ2VzaXplOwotICBiZmRfd2luZG93X2ludGVybmFsICppID0gd2luZG93cC0+aTsKLSAgc2l6ZV90IHNpemVfdG9fYWxsb2MgPSBzaXplOwotCi0gIGlmIChkZWJ1Z193aW5kb3dzKQotICAgIGZwcmludGYgKHN0ZGVyciwgImJmZF9nZXRfZmlsZV93aW5kb3cgKCVwLCAlNmxkLCAlNmxkLCAlcDwlcCwlbHgsJXA+LCAlZCkiLAotCSAgICAgYWJmZCwgKGxvbmcpIG9mZnNldCwgKGxvbmcpIHNpemUsCi0JICAgICB3aW5kb3dwLCB3aW5kb3dwLT5kYXRhLCAodW5zaWduZWQgbG9uZykgd2luZG93cC0+c2l6ZSwKLQkgICAgIHdpbmRvd3AtPmksIHdyaXRhYmxlKTsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB0aGUgcGFnZSBzaXplLCBzbyB3ZSBjYW4gYmUgZnJpZW5kbHkgdG8gbW1hcC4gICovCi0gIGlmIChwYWdlc2l6ZSA9PSAwKQotICAgIHBhZ2VzaXplID0gZ2V0cGFnZXNpemUgKCk7Ci0gIGlmIChwYWdlc2l6ZSA9PSAwKQotICAgIGFib3J0ICgpOwotCi0gIGlmIChpID09IDApCi0gICAgewotICAgICAgd2luZG93cC0+aSA9IGkgPSAoYmZkX3dpbmRvd19pbnRlcm5hbCAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChiZmRfd2luZG93X2ludGVybmFsKSk7Ci0gICAgICBpZiAoaSA9PSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGktPmRhdGEgPSAwOwotICAgIH0KLSNpZmRlZiBIQVZFX01NQVAKLSAgaWYgKG9rX3RvX21hcAotICAgICAgJiYgKGktPmRhdGEgPT0gMCB8fCBpLT5tYXBwZWQgPT0gMSkKLSAgICAgICYmIChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpID09IDApCi0gICAgewotICAgICAgZmlsZV9wdHIgZmlsZV9vZmZzZXQsIG9mZnNldDI7Ci0gICAgICBzaXplX3QgcmVhbF9zaXplOwotICAgICAgaW50IGZkOwotICAgICAgRklMRSAqZjsKLQotICAgICAgLyogRmluZCB0aGUgcmVhbCBmaWxlIGFuZCB0aGUgcmVhbCBvZmZzZXQgaW50byBpdC4gICovCi0gICAgICB3aGlsZSAoYWJmZC0+bXlfYXJjaGl2ZSAhPSBOVUxMKQotCXsKLQkgIG9mZnNldCArPSBhYmZkLT5vcmlnaW47Ci0JICBhYmZkID0gYWJmZC0+bXlfYXJjaGl2ZTsKLQl9Ci0gICAgICBmID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gICAgICBmZCA9IGZpbGVubyAoZik7Ci0KLSAgICAgIC8qIENvbXB1dGUgb2Zmc2V0cyBhbmQgc2l6ZSBmb3IgbW1hcCBhbmQgZm9yIHRoZSB1c2VyJ3MgZGF0YS4gICovCi0gICAgICBvZmZzZXQyID0gb2Zmc2V0ICUgcGFnZXNpemU7Ci0gICAgICBpZiAob2Zmc2V0MiA8IDApCi0JYWJvcnQgKCk7Ci0gICAgICBmaWxlX29mZnNldCA9IG9mZnNldCAtIG9mZnNldDI7Ci0gICAgICByZWFsX3NpemUgPSBvZmZzZXQgKyBzaXplIC0gZmlsZV9vZmZzZXQ7Ci0gICAgICByZWFsX3NpemUgPSByZWFsX3NpemUgKyBwYWdlc2l6ZSAtIDE7Ci0gICAgICByZWFsX3NpemUgLT0gcmVhbF9zaXplICUgcGFnZXNpemU7Ci0KLSAgICAgIC8qIElmIHdlJ3JlIHJlLXVzaW5nIGEgbWVtb3J5IHJlZ2lvbiwgbWFrZSBzdXJlIGl0J3MgYmlnIGVub3VnaC4gICovCi0gICAgICBpZiAoaS0+ZGF0YSAmJiBpLT5zaXplIDwgc2l6ZSkKLQl7Ci0JICBtdW5tYXAgKGktPmRhdGEsIGktPnNpemUpOwotCSAgaS0+ZGF0YSA9IDA7Ci0JfQotICAgICAgaS0+ZGF0YSA9IG1tYXAgKGktPmRhdGEsIHJlYWxfc2l6ZSwKLQkJICAgICAgd3JpdGFibGUgPyBQUk9UX1dSSVRFIHwgUFJPVF9SRUFEIDogUFJPVF9SRUFELAotCQkgICAgICAod3JpdGFibGUKLQkJICAgICAgID8gTUFQX0ZJTEUgfCBNQVBfUFJJVkFURQotCQkgICAgICAgOiBNQVBfRklMRSB8IE1BUF9TSEFSRUQpLAotCQkgICAgICBmZCwgZmlsZV9vZmZzZXQpOwotICAgICAgaWYgKGktPmRhdGEgPT0gKFBUUikgLTEpCi0JewotCSAgLyogQW4gZXJyb3IgaGFwcGVuZWQuICBSZXBvcnQgaXQsIG9yIHRyeSB1c2luZyBtYWxsb2MsIG9yCi0JICAgICBzb21ldGhpbmcuICAqLwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQkgIGktPmRhdGEgPSAwOwotCSAgd2luZG93cC0+ZGF0YSA9IDA7Ci0JICBpZiAoZGVidWdfd2luZG93cykKLQkgICAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdG1tYXAgZmFpbGVkIVxuIik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKGRlYnVnX3dpbmRvd3MpCi0JZnByaW50ZiAoc3RkZXJyLCAiXG5cdG1hcHBlZCAlbGQgYXQgJXAsIG9mZnNldCBpcyAlbGRcbiIsCi0JCSAobG9uZykgcmVhbF9zaXplLCBpLT5kYXRhLCAobG9uZykgb2Zmc2V0Mik7Ci0gICAgICBpLT5zaXplID0gcmVhbF9zaXplOwotICAgICAgd2luZG93cC0+ZGF0YSA9IChQVFIpICgoYmZkX2J5dGUgKikgaS0+ZGF0YSArIG9mZnNldDIpOwotICAgICAgd2luZG93cC0+c2l6ZSA9IHNpemU7Ci0gICAgICBpLT5tYXBwZWQgPSAxOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlIGlmIChkZWJ1Z193aW5kb3dzKQotICAgIHsKLSAgICAgIGlmIChva190b19tYXApCi0JZnByaW50ZiAoc3RkZXJyLCBfKCJub3QgbWFwcGluZzogZGF0YT0lbHggbWFwcGVkPSVkXG4iKSwKLQkJICh1bnNpZ25lZCBsb25nKSBpLT5kYXRhLCAoaW50KSBpLT5tYXBwZWQpOwotICAgICAgZWxzZQotCWZwcmludGYgKHN0ZGVyciwgXygibm90IG1hcHBpbmc6IGVudiB2YXIgbm90IHNldFxuIikpOwotICAgIH0KLSNlbHNlCi0gIG9rX3RvX21hcCA9IDA7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTVBST1RFQ1QKLSAgaWYgKCF3cml0YWJsZSkKLSAgICB7Ci0gICAgICBzaXplX3RvX2FsbG9jICs9IHBhZ2VzaXplIC0gMTsKLSAgICAgIHNpemVfdG9fYWxsb2MgLT0gc2l6ZV90b19hbGxvYyAlIHBhZ2VzaXplOwotICAgIH0KLSNlbmRpZgotICBpZiAoZGVidWdfd2luZG93cykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJcblx0JXMoJTZsZCkiLAotCSAgICAgaS0+ZGF0YSA/ICJyZWFsbG9jIiA6ICIgbWFsbG9jIiwgKGxvbmcpIHNpemVfdG9fYWxsb2MpOwotICBpLT5kYXRhID0gKFBUUikgYmZkX3JlYWxsb2MgKGktPmRhdGEsIHNpemVfdG9fYWxsb2MpOwotICBpZiAoZGVidWdfd2luZG93cykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJcdC0+ICVwXG4iLCBpLT5kYXRhKTsKLSAgaS0+cmVmY291bnQgPSAxOwotICBpZiAoaS0+ZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzaXplX3RvX2FsbG9jID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGktPnNpemUgPSBiZmRfcmVhZCAoaS0+ZGF0YSwgc2l6ZSwgMSwgYWJmZCk7Ci0gIGlmIChpLT5zaXplICE9IHNpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpLT5tYXBwZWQgPSAwOwotI2lmZGVmIEhBVkVfTVBST1RFQ1QKLSAgaWYgKCF3cml0YWJsZSkKLSAgICB7Ci0gICAgICBpZiAoZGVidWdfd2luZG93cykKLQlmcHJpbnRmIChzdGRlcnIsICJcdG1wcm90ZWN0ICglcCwgJWxkLCBQUk9UX1JFQUQpXG4iLCBpLT5kYXRhLAotCQkgKGxvbmcpIGktPnNpemUpOwotICAgICAgbXByb3RlY3QgKGktPmRhdGEsIGktPnNpemUsIFBST1RfUkVBRCk7Ci0gICAgfQotI2VuZGlmCi0gIHdpbmRvd3AtPmRhdGEgPSBpLT5kYXRhOwotICB3aW5kb3dwLT5zaXplID0gaS0+c2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZiAvKiBVU0VfTU1BUCAqLwotDAotYmZkX3NpemVfdHlwZQotYmZkX3dyaXRlIChwdHIsIHNpemUsIG5pdGVtcywgYWJmZCkKLSAgICAgQ09OU1QgUFRSIHB0cjsKLSAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICBiZmRfc2l6ZV90eXBlIG5pdGVtczsKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIG53cm90ZTsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltID0gKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopIChhYmZkLT5pb3N0cmVhbSk7Ci0gICAgICBzaXplICo9IG5pdGVtczsKLSAgICAgIGlmIChhYmZkLT53aGVyZSArIHNpemUgPiBiaW0tPnNpemUpCi0JewotCSAgbG9uZyBuZXdzaXplLCBvbGRzaXplID0gKGJpbS0+c2l6ZSArIDEyNykgJiB+MTI3OwotCSAgYmltLT5zaXplID0gYWJmZC0+d2hlcmUgKyBzaXplOwotCSAgLyogUm91bmQgdXAgdG8gY3V0IGRvd24gb24gbWVtb3J5IGZyYWdtZW50YXRpb24gKi8KLQkgIG5ld3NpemUgPSAoYmltLT5zaXplICsgMTI3KSAmIH4xMjc7Ci0JICBpZiAobmV3c2l6ZSA+IG9sZHNpemUpCi0JICAgIHsKLQkgICAgICBiaW0tPmJ1ZmZlciA9IGJmZF9yZWFsbG9jIChiaW0tPmJ1ZmZlciwgbmV3c2l6ZSk7Ci0JICAgICAgaWYgKGJpbS0+YnVmZmVyID09IDApCi0JCXsKLQkJICBiaW0tPnNpemUgPSAwOwotCQkgIHJldHVybiAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBtZW1jcHkgKGJpbS0+YnVmZmVyICsgYWJmZC0+d2hlcmUsIHB0ciwgc2l6ZSk7Ci0gICAgICBhYmZkLT53aGVyZSArPSBzaXplOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gIG53cm90ZSA9IGZ3cml0ZSAocHRyLCAxLCAoc2l6ZV90KSAoc2l6ZSAqIG5pdGVtcyksCi0JCSAgIGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpKTsKLSAgaWYgKG53cm90ZSA+IDApCi0gICAgYWJmZC0+d2hlcmUgKz0gbndyb3RlOwotICBpZiAoKGJmZF9zaXplX3R5cGUpIG53cm90ZSAhPSBzaXplICogbml0ZW1zKQotICAgIHsKLSNpZmRlZiBFTk9TUEMKLSAgICAgIGlmIChud3JvdGUgPj0gMCkKLQllcnJubyA9IEVOT1NQQzsKLSNlbmRpZgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICB9Ci0gIHJldHVybiBud3JvdGU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50Ci0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludChiZmQgKmFiZmQsICBpbnQgaSk7Ci0KLURFU0NSSVBUSU9OCi0JV3JpdGUgYSA0IGJ5dGUgaW50ZWdlciBAdmFye2l9IHRvIHRoZSBvdXRwdXQgQkZEIEB2YXJ7YWJmZH0sIGluIGJpZwotCWVuZGlhbiBvcmRlciByZWdhcmRsZXNzIG9mIHdoYXQgZWxzZSBpcyBnb2luZyBvbi4gIFRoaXMgaXMgdXNlZnVsIGluCi0JYXJjaGl2ZXMuCi0KLSovCi12b2lkCi1iZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludCAoYWJmZCwgaSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgaTsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICBiZmRfcHV0YjMyKGksIGJ1ZmZlcik7Ci0gIGlmIChiZmRfd3JpdGUoKFBUUilidWZmZXIsIDQsIDEsIGFiZmQpICE9IDQpCi0gICAgYWJvcnQgKCk7Ci19Ci0KLWxvbmcKLWJmZF90ZWxsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGZpbGVfcHRyIHB0cjsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICByZXR1cm4gYWJmZC0+d2hlcmU7Ci0KLSAgcHRyID0gZnRlbGwgKGJmZF9jYWNoZV9sb29rdXAoYWJmZCkpOwotCi0gIGlmIChhYmZkLT5teV9hcmNoaXZlKQotICAgIHB0ciAtPSBhYmZkLT5vcmlnaW47Ci0gIGFiZmQtPndoZXJlID0gcHRyOwotICByZXR1cm4gcHRyOwotfQotCi1pbnQKLWJmZF9mbHVzaCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGZmbHVzaCAoYmZkX2NhY2hlX2xvb2t1cChhYmZkKSk7Ci19Ci0KLS8qIFJldHVybnMgMCBmb3Igc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgZm9yIGZhaWx1cmUgKGluIHdoaWNoIGNhc2UKLSAgIGJmZF9nZXRfZXJyb3IgY2FuIHJldHJpZXZlIHRoZSBlcnJvciBjb2RlKS4gICovCi1pbnQKLWJmZF9zdGF0IChhYmZkLCBzdGF0YnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzdGF0ICpzdGF0YnVmOwotewotICBGSUxFICpmOwotICBpbnQgcmVzdWx0OwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIGYgPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgcmVzdWx0ID0gZnN0YXQgKGZpbGVubyAoZiksIHN0YXRidWYpOwotICBpZiAocmVzdWx0IDwgMCkKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbnplcm8gZm9yIGZhaWx1cmUgKGluIHdoaWNoIGNhc2UgYmZkX2dldF9lcnJvcgotICAgY2FuIHJldHJpZXZlIHRoZSBlcnJvciBjb2RlKS4gICovCi0KLWludAotYmZkX3NlZWsgKGFiZmQsIHBvc2l0aW9uLCBkaXJlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmlsZV9wdHIgcG9zaXRpb247Ci0gICAgIGludCBkaXJlY3Rpb247Ci17Ci0gIGludCByZXN1bHQ7Ci0gIEZJTEUgKmY7Ci0gIGZpbGVfcHRyIGZpbGVfcG9zaXRpb247Ci0gIC8qIEZvciB0aGUgdGltZSBiZWluZywgYSBCRkQgbWF5IG5vdCBzZWVrIHRvIGl0J3MgZW5kLiAgVGhlIHByb2JsZW0KLSAgICAgaXMgdGhhdCB3ZSBkb24ndCBlYXNpbHkgaGF2ZSBhIHdheSB0byByZWNvZ25pemUgdGhlIGVuZCBvZiBhbgotICAgICBlbGVtZW50IGluIGFuIGFyY2hpdmUuICovCi0KLSAgQkZEX0FTU0VSVCAoZGlyZWN0aW9uID09IFNFRUtfU0VUIHx8IGRpcmVjdGlvbiA9PSBTRUVLX0NVUik7Ci0KLSAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX0NVUiAmJiBwb3NpdGlvbiA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gU0VFS19TRVQpCi0JYWJmZC0+d2hlcmUgPSBwb3NpdGlvbjsKLSAgICAgIGVsc2UKLQlhYmZkLT53aGVyZSArPSBwb3NpdGlvbjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9hcmNoaXZlICYmIGFiZmQtPm15X2FyY2hpdmUgPT0gMCkKLSAgICB7Ci0jaWYgMAotICAgICAgLyogRXhwbGFuYXRpb24gZm9yIHRoaXMgY29kZTogSSdtIG9ubHkgYWJvdXQgOTUrJSBzdXJlIHRoYXQgdGhlIGFib3ZlCi0JIGNvbmRpdGlvbnMgYXJlIHN1ZmZpY2llbnQgYW5kIHRoYXQgYWxsIGkvbyBjYWxscyBhcmUgcHJvcGVybHkKLQkgYWRqdXN0aW5nIHRoZSBgd2hlcmUnIGZpZWxkLiAgU28gdGhpcyBpcyBzb3J0IG9mIGFuIGBhc3NlcnQnCi0JIHRoYXQgdGhlIGB3aGVyZScgZmllbGQgaXMgY29ycmVjdC4gIElmIHdlIGNhbiBnbyBhIHdoaWxlIHdpdGhvdXQKLQkgdHJpcHBpbmcgdGhlIGFib3J0LCB3ZSBjYW4gcHJvYmFibHkgc2FmZWx5IGRpc2FibGUgdGhpcyBjb2RlLAotCSBzbyB0aGF0IHRoZSByZWFsIG9wdGltaXphdGlvbnMgaGFwcGVuLiAgKi8KLSAgICAgIGZpbGVfcHRyIHdoZXJlX2FtX2lfbm93OwotICAgICAgd2hlcmVfYW1faV9ub3cgPSBmdGVsbCAoYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCkpOwotICAgICAgaWYgKGFiZmQtPm15X2FyY2hpdmUpCi0Jd2hlcmVfYW1faV9ub3cgLT0gYWJmZC0+b3JpZ2luOwotICAgICAgaWYgKHdoZXJlX2FtX2lfbm93ICE9IGFiZmQtPndoZXJlKQotCWFib3J0ICgpOwotI2VuZGlmCi0gICAgICBpZiAoZGlyZWN0aW9uID09IFNFRUtfU0VUICYmIHBvc2l0aW9uID09IGFiZmQtPndoZXJlKQotCXJldHVybiAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgc29tZXRoaW5nIHNtYXJ0ZXIgdG8gb3B0aW1pemUgYWNjZXNzIHRvIGFyY2hpdmVzLgotCSBDdXJyZW50bHksIGFueXRoaW5nIGluc2lkZSBhbiBhcmNoaXZlIGlzIHJlYWQgdmlhIHRoZSBmaWxlCi0JIGhhbmRsZSBmb3IgdGhlIGFyY2hpdmUuICBXaGljaCBtZWFucyB0aGF0IGEgYmZkX3NlZWsgb24gb25lCi0JIGNvbXBvbmVudCBhZmZlY3RzIHRoZSBgY3VycmVudCBwb3NpdGlvbicgaW4gdGhlIGFyY2hpdmUsIGFzCi0JIHdlbGwgYXMgaW4gYW55IG90aGVyIGNvbXBvbmVudC4KLQotCSBJdCBtaWdodCBiZSBzdWZmaWNpZW50IHRvIHB1dCBhIHNwaWtlIHRocm91Z2ggdGhlIGNhY2hlCi0JIGFic3RyYWN0aW9uLCBhbmQgbG9vayB0byB0aGUgYXJjaGl2ZSBmb3IgdGhlIGZpbGUgcG9zaXRpb24sCi0JIGJ1dCBJIHRoaW5rIHdlIHNob3VsZCB0cnkgZm9yIHNvbWV0aGluZyBjbGVhbmVyLgotCi0JIEluIHRoZSBtZWFudGltZSwgbm8gb3B0aW1pemF0aW9uIGZvciBhcmNoaXZlcy4gICovCi0gICAgfQotCi0gIGYgPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKLSAgZmlsZV9wb3NpdGlvbiA9IHBvc2l0aW9uOwotICBpZiAoZGlyZWN0aW9uID09IFNFRUtfU0VUICYmIGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLSAgICBmaWxlX3Bvc2l0aW9uICs9IGFiZmQtPm9yaWdpbjsKLQotICByZXN1bHQgPSBmc2VlayAoZiwgZmlsZV9wb3NpdGlvbiwgZGlyZWN0aW9uKTsKLQotICBpZiAocmVzdWx0ICE9IDApCi0gICAgewotICAgICAgaW50IGhvbGRfZXJybm8gPSBlcnJubzsKLQotICAgICAgLyogRm9yY2UgcmVkZXRlcm1pbmF0aW9uIG9mIGB3aGVyZScgZmllbGQuICAqLwotICAgICAgYmZkX3RlbGwgKGFiZmQpOwotCi0gICAgICAvKiBBbiBFSU5WQUwgZXJyb3IgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgZmlsZSBvZmZzZXQgd2FzCi0gICAgICAgICBhYnN1cmQuICAqLwotICAgICAgaWYgKGhvbGRfZXJybm8gPT0gRUlOVkFMKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQkgIGVycm5vID0gaG9sZF9lcnJubzsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQWRqdXN0IGB3aGVyZScgZmllbGQuICAqLwotICAgICAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCkKLQlhYmZkLT53aGVyZSA9IHBvc2l0aW9uOwotICAgICAgZWxzZQotCWFiZmQtPndoZXJlICs9IHBvc2l0aW9uOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQwKLS8qKiBUaGUgZG8taXQteW91cnNlbGYgKGJ5dGUpIHNleC1jaGFuZ2Uga2l0ICovCi0KLS8qIFRoZSBtaWRkbGUgbGV0dGVyIGUuZy4gZ2V0PGI+c2hvcnQgaW5kaWNhdGVzIEJpZyBvciBMaXR0bGUgZW5kaWFuCi0gICB0YXJnZXQgbWFjaGluZS4gIEl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIGhvc3QKLSAgIG1hY2hpbmUgaXM7IHRoZXNlIHJvdXRpbmVzIHdvcmsgZm9yIGVpdGhlci4gICovCi0KLS8qIEZJWE1FOiBTaG91bGQgdGhlc2UgdGFrZSBhIGNvdW50IGFyZ3VtZW50PwotICAgQW5zd2VyIChnbnVAY3lnbnVzLmNvbSk6ICBObywgYnV0IHBlcmhhcHMgdGhleSBzaG91bGQgYmUgaW5saW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBpbiBzd2FwLmggI2lmZGVmIF9fR05VQ19fLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3Byb2YgdGhlbSBsYXRlciBhbmQgZmluZCBvdXQuICAqLwotCi0vKgotRlVOQ1RJT04KLQliZmRfcHV0X3NpemUKLUZVTkNUSU9OCi0JYmZkX2dldF9zaXplCi0KLURFU0NSSVBUSU9OCi0JVGhlc2UgbWFjcm9zIGFzIHVzZWQgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgcmF3IGRhdGEgaW4KLQlzZWN0aW9uczsgZWFjaCBhY2Nlc3MgKGV4Y2VwdCBmb3IgYnl0ZXMpIGlzIHZlY3RvcmVkIHRocm91Z2gKLQl0aGUgdGFyZ2V0IGZvcm1hdCBvZiB0aGUgQkZEIGFuZCBtYW5nbGVkIGFjY29yZGluZ2x5LiBUaGUKLQltYW5nbGluZyBwZXJmb3JtcyBhbnkgbmVjZXNzYXJ5IGVuZGlhbiB0cmFuc2xhdGlvbnMgYW5kCi0JcmVtb3ZlcyBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zLiAgTm90ZSB0aGF0IHR5cGVzIGFjY2VwdGVkIGFuZAotCXJldHVybmVkIGJ5IHRoZXNlIG1hY3JvcyBhcmUgaWRlbnRpY2FsIHNvIHRoZXkgY2FuIGJlIHN3YXBwZWQKLQlhcm91bmQgaW4gbWFjcm9zLS0tZm9yIGV4YW1wbGUsIEBmaWxle2xpYmFvdXQuaH0gZGVmaW5lcyA8PEdFVF9XT1JEPj4KLQl0byBlaXRoZXIgPDxiZmRfZ2V0XzMyPj4gb3IgPDxiZmRfZ2V0XzY0Pj4uCi0KLQlJbiB0aGUgcHV0IHJvdXRpbmVzLCBAdmFye3ZhbH0gbXVzdCBiZSBhIDw8YmZkX3ZtYT4+LiAgSWYgd2UgYXJlIG9uIGEKLQlzeXN0ZW0gd2l0aG91dCBwcm90b3R5cGVzLCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcKLQlzdXJlIHRoYXQgaXMgdHJ1ZSwgd2l0aCBhIGNhc3QgaWYgbmVjZXNzYXJ5LiAgV2UgZG9uJ3QgY2FzdAotCXRoZW0gaW4gdGhlIG1hY3JvIGRlZmluaXRpb25zIGJlY2F1c2UgdGhhdCB3b3VsZCBwcmV2ZW50IDw8bGludD4+Ci0Jb3IgPDxnY2MgLVdhbGw+PiBmcm9tIGRldGVjdGluZyBzaW5zIHN1Y2ggYXMgcGFzc2luZyBhIHBvaW50ZXIuCi0JVG8gZGV0ZWN0IGNhbGxpbmcgdGhlc2Ugd2l0aCBsZXNzIHRoYW4gYSA8PGJmZF92bWE+PiwgdXNlCi0JPDxnY2MgLVdjb252ZXJzaW9uPj4gb24gYSBob3N0IHdpdGggNjQgYml0IDw8YmZkX3ZtYT4+J3MuCi0KLS4KLS57KiBCeXRlIHN3YXBwaW5nIG1hY3JvcyBmb3IgdXNlciBzZWN0aW9uIGRhdGEuICAqfQotLgotLiNkZWZpbmUgYmZkX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgICgodm9pZCkgKCooKHVuc2lnbmVkIGNoYXIgKikocHRyKSkgPSAodW5zaWduZWQgY2hhcikodmFsKSkpCi0uI2RlZmluZSBiZmRfcHV0X3NpZ25lZF84IFwKLS4JCWJmZF9wdXRfOAotLiNkZWZpbmUgYmZkX2dldF84KGFiZmQsIHB0cikgXAotLiAgICAgICAgICAgICAgICAoKih1bnNpZ25lZCBjaGFyICopKHB0cikpCi0uI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF84KGFiZmQsIHB0cikgXAotLgkJKCgqKHVuc2lnbmVkIGNoYXIgKikocHRyKSBeIDB4ODApIC0gMHg4MCkKLS4KLS4jZGVmaW5lIGJmZF9wdXRfMTYoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHgxNiwgKCh2YWwpLChwdHIpKSkKLS4jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzE2IFwKLS4JCSBiZmRfcHV0XzE2Ci0uI2RlZmluZSBiZmRfZ2V0XzE2KGFiZmQsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDE2LCAocHRyKSkKLS4jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzE2KGFiZmQsIHB0cikgXAotLiAgICAgICAgIAkgQkZEX1NFTkQgKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCi0uCi0uI2RlZmluZSBiZmRfcHV0XzMyKGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MzIsICgodmFsKSwocHRyKSkpCi0uI2RlZmluZSBiZmRfcHV0X3NpZ25lZF8zMiBcCi0uCQkgYmZkX3B1dF8zMgotLiNkZWZpbmUgYmZkX2dldF8zMihhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgzMiwgKHB0cikpCi0uI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF8zMihhYmZkLCBwdHIpIFwKLS4JCSBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfcHV0eDY0LCAoKHZhbCksIChwdHIpKSkKLS4jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzY0IFwKLS4JCSBiZmRfcHV0XzY0Ci0uI2RlZmluZSBiZmRfZ2V0XzY0KGFiZmQsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDY0LCAocHRyKSkKLS4jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzY0KGFiZmQsIHB0cikgXAotLgkJIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF82NCwgKHB0cikpCi0uCi0uI2RlZmluZSBiZmRfZ2V0KGJpdHMsIGFiZmQsIHB0cikJCQkJXAotLiAgICAgICAgICAgICAgICAoKGJpdHMpID09IDggPyBiZmRfZ2V0XzggKGFiZmQsIHB0cikJCVwKLS4JCSA6IChiaXRzKSA9PSAxNiA/IGJmZF9nZXRfMTYgKGFiZmQsIHB0cikJXAotLgkJIDogKGJpdHMpID09IDMyID8gYmZkX2dldF8zMiAoYWJmZCwgcHRyKQlcCi0uCQkgOiAoYml0cykgPT0gNjQgPyBiZmRfZ2V0XzY0IChhYmZkLCBwdHIpCVwKLS4JCSA6IChhYm9ydCAoKSwgKGJmZF92bWEpIC0gMSkpCi0uCi0uI2RlZmluZSBiZmRfcHV0KGJpdHMsIGFiZmQsIHZhbCwgcHRyKQkJCQlcCi0uICAgICAgICAgICAgICAgICgoYml0cykgPT0gOCA/IGJmZF9wdXRfOCAoYWJmZCwgdmFsLCBwdHIpCVwKLS4JCSA6IChiaXRzKSA9PSAxNiA/IGJmZF9wdXRfMTYgKGFiZmQsIHZhbCwgcHRyKQlcCi0uCQkgOiAoYml0cykgPT0gMzIgPyBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHB0cikJXAotLgkJIDogKGJpdHMpID09IDY0ID8gYmZkX3B1dF82NCAoYWJmZCwgdmFsLCBwdHIpCVwKLS4JCSA6IChhYm9ydCAoKSwgKHZvaWQpIDApKQotLgotKi8gCi0KLS8qCi1GVU5DVElPTgotCWJmZF9oX3B1dF9zaXplCi0JYmZkX2hfZ2V0X3NpemUKLQotREVTQ1JJUFRJT04KLQlUaGVzZSBtYWNyb3MgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGVpciA8PGJmZF9nZXRfeD4+Ci0JYnJldGhlcmVuLCBleGNlcHQgdGhhdCB0aGV5IGFyZSB1c2VkIGZvciByZW1vdmluZyBpbmZvcm1hdGlvbgotCWZvciB0aGUgaGVhZGVyIHJlY29yZHMgb2Ygb2JqZWN0IGZpbGVzLiBCZWxpZXZlIGl0IG9yIG5vdCwKLQlzb21lIG9iamVjdCBmaWxlcyBrZWVwIHRoZWlyIGhlYWRlciByZWNvcmRzIGluIGJpZyBlbmRpYW4KLQlvcmRlciBhbmQgdGhlaXIgZGF0YSBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyLgotLgotLnsqIEJ5dGUgc3dhcHBpbmcgbWFjcm9zIGZvciBmaWxlIGhlYWRlciBkYXRhLiAgKn0KLS4KLS4jZGVmaW5lIGJmZF9oX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCi0uCQliZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQotLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF84KGFiZmQsIHZhbCwgcHRyKSBcCi0uCQliZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQotLiNkZWZpbmUgYmZkX2hfZ2V0XzgoYWJmZCwgcHRyKSBcCi0uCQliZmRfZ2V0XzggKGFiZmQsIHB0cikKLS4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKLS4JCWJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIHB0cikKLS4KLS4jZGVmaW5lIGJmZF9oX3B1dF8xNihhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MTYsKHZhbCxwdHIpKQotLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8xNiBcCi0uCQkgYmZkX2hfcHV0XzE2Ci0uI2RlZmluZSBiZmRfaF9nZXRfMTYoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgxNiwocHRyKSkKLS4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMTYoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMTYsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX2hfcHV0XzMyKGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHgzMiwodmFsLHB0cikpCi0uI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzMyIFwKLS4JCSBiZmRfaF9wdXRfMzIKLS4jZGVmaW5lIGJmZF9oX2dldF8zMihhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eDMyLChwdHIpKQotLiNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF8zMihhYmZkLCBwdHIpIFwKLS4JCSBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF8zMiwgKHB0cikpCi0uCi0uI2RlZmluZSBiZmRfaF9wdXRfNjQoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDY0LCh2YWwsIHB0cikpCi0uI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzY0IFwKLS4JCSBiZmRfaF9wdXRfNjQKLS4jZGVmaW5lIGJmZF9oX2dldF82NChhYmZkLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eDY0LChwdHIpKQotLiNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKLS4JCSBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF82NCwgKHB0cikpCi0uCi0qLyAKLQotLyogU2lnbiBleHRlbnNpb24gdG8gYmZkX3NpZ25lZF92bWEuICAqLwotI2RlZmluZSBDT0VSQ0UxNih4KSAoKChiZmRfc2lnbmVkX3ZtYSkgKHgpIF4gMHg4MDAwKSAtIDB4ODAwMCkKLSNkZWZpbmUgQ09FUkNFMzIoeCkgXAotICAoKGJmZF9zaWduZWRfdm1hKSAobG9uZykgKCgodW5zaWduZWQgbG9uZykgKHgpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKSkKLSNkZWZpbmUgRUlHSFRfR0FaSUxMSU9OICgoKEJGRF9IT1NUXzY0X0JJVCkweDgwMDAwMDAwKSA8PCAzMikKLSNkZWZpbmUgQ09FUkNFNjQoeCkgXAotICAoKChiZmRfc2lnbmVkX3ZtYSkgKHgpIF4gRUlHSFRfR0FaSUxMSU9OKSAtIEVJR0hUX0dBWklMTElPTikKLQotYmZkX3ZtYQotYmZkX2dldGIxNiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHJldHVybiAoYWRkclswXSA8PCA4KSB8IGFkZHJbMV07Ci19Ci0KLWJmZF92bWEKLWJmZF9nZXRsMTYgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICByZXR1cm4gKGFkZHJbMV0gPDwgOCkgfCBhZGRyWzBdOwotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGJfc2lnbmVkXzE2IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgcmV0dXJuIENPRVJDRTE2KChhZGRyWzBdIDw8IDgpIHwgYWRkclsxXSk7Ci19Ci0KLWJmZF9zaWduZWRfdm1hCi1iZmRfZ2V0bF9zaWduZWRfMTYgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICByZXR1cm4gQ09FUkNFMTYoKGFkZHJbMV0gPDwgOCkgfCBhZGRyWzBdKTsKLX0KLQotdm9pZAotYmZkX3B1dGIxNiAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhOwotICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgYWRkclswXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiA4KTsKLSAgYWRkclsxXSA9IChiZmRfYnl0ZSApZGF0YTsKLX0KLQotdm9pZAotYmZkX3B1dGwxNiAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhOyAgICAgICAgICAgICAKLSAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUgKWRhdGE7Ci0gIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gOCk7Ci19Ci0KLWJmZF92bWEKLWJmZF9nZXRiMzIgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICB1bnNpZ25lZCBsb25nIHY7Ci0KLSAgdiA9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzBdIDw8IDI0OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzFdIDw8IDE2OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzJdIDw8IDg7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbM107Ci0gIHJldHVybiAoYmZkX3ZtYSkgdjsKLX0KLQotYmZkX3ZtYQotYmZkX2dldGwzMiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdjsKLQotICB2ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF07Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgODsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCAxNjsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXSA8PCAyNDsKLSAgcmV0dXJuIChiZmRfdm1hKSB2OwotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGJfc2lnbmVkXzMyIChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2OwotCi0gIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclswXSA8PCAyNDsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsxXSA8PCAxNjsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCA4OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzNdOwotICByZXR1cm4gQ09FUkNFMzIgKHYpOwotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGxfc2lnbmVkXzMyIChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2OwotCi0gIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclswXTsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsxXSA8PCA4OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzJdIDw8IDE2OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzNdIDw8IDI0OwotICByZXR1cm4gQ09FUkNFMzIgKHYpOwotfQotCi1iZmRfdm1hCi1iZmRfZ2V0YjY0IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkciBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEJGRDY0Ci0gIGJmZF92bWEgbG93LCBoaWdoOwotCi0gIGhpZ2g9ICgoKCgoKCgoYWRkclswXSkgPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzFdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzJdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkclszXSkgKTsKLQotICBsb3cgPSAoKCgoKCgoKChiZmRfdm1hKWFkZHJbNF0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkcls1XSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkcls2XSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbN10pKTsKLQotICByZXR1cm4gaGlnaCA8PCAzMiB8IGxvdzsKLSNlbHNlCi0gIEJGRF9GQUlMKCk7Ci0gIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLWJmZF92bWEKLWJmZF9nZXRsNjQgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgQkZENjQKLSAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0gIGhpZ2g9ICgoKCgoKChhZGRyWzddIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkcls2XSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkcls1XSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbNF0pKTsKLQotICBsb3cgPSAoKCgoKCgoKGJmZF92bWEpYWRkclszXSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbMl0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbMV0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzBdKSApOwotCi0gIHJldHVybiBoaWdoIDw8IDMyIHwgbG93OwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLQotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGJfc2lnbmVkXzY0IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkciBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEJGRDY0Ci0gIGJmZF92bWEgbG93LCBoaWdoOwotCi0gIGhpZ2g9ICgoKCgoKCgoYWRkclswXSkgPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzFdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzJdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkclszXSkgKTsKLQotICBsb3cgPSAoKCgoKCgoKChiZmRfdm1hKWFkZHJbNF0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkcls1XSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkcls2XSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbN10pKTsKLQotICByZXR1cm4gQ09FUkNFNjQoaGlnaCA8PCAzMiB8IGxvdyk7Ci0jZWxzZQotICBCRkRfRkFJTCgpOwotICByZXR1cm4gMDsKLSNlbmRpZgotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGxfc2lnbmVkXzY0IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkciBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIEJGRDY0Ci0gIGJmZF92bWEgbG93LCBoaWdoOwotICBoaWdoPSAoKCgoKCgoYWRkcls3XSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzRdKSk7Ci0KLSAgbG93ID0gKCgoKCgoKChiZmRfdm1hKWFkZHJbM10gPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzJdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzFdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkclswXSkgKTsKLQotICByZXR1cm4gQ09FUkNFNjQoaGlnaCA8PCAzMiB8IGxvdyk7Ci0jZWxzZQotICBCRkRfRkFJTCgpOwotICByZXR1cm4gMDsKLSNlbmRpZgotfQotCi12b2lkCi1iZmRfcHV0YjMyIChkYXRhLCBhZGRyKQotICAgICBiZmRfdm1hIGRhdGE7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotICAgICAgICBhZGRyWzBdID0gKGJmZF9ieXRlKShkYXRhID4+IDI0KTsKLSAgICAgICAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAxNik7Ci0gICAgICAgIGFkZHJbMl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gIDgpOwotICAgICAgICBhZGRyWzNdID0gKGJmZF9ieXRlKWRhdGE7Ci19Ci0KLXZvaWQKLWJmZF9wdXRsMzIgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YTsKLSAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gICAgICAgIGFkZHJbMF0gPSAoYmZkX2J5dGUpZGF0YTsKLSAgICAgICAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAgOCk7Ci0gICAgICAgIGFkZHJbMl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gMTYpOwotICAgICAgICBhZGRyWzNdID0gKGJmZF9ieXRlKShkYXRhID4+IDI0KTsKLX0KLQotdm9pZAotYmZkX3B1dGI2NCAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgQkZENjQKLSAgYWRkclswXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNyo4KSk7Ci0gIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDYqOCkpOwotICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+ICg1KjgpKTsKLSAgYWRkclszXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNCo4KSk7Ci0gIGFkZHJbNF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDMqOCkpOwotICBhZGRyWzVdID0gKGJmZF9ieXRlKShkYXRhID4+ICgyKjgpKTsKLSAgYWRkcls2XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMSo4KSk7Ci0gIGFkZHJbN10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDAqOCkpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSNlbmRpZgotfQotCi12b2lkCi1iZmRfcHV0bDY0IChkYXRhLCBhZGRyKQotICAgICBiZmRfdm1hIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBCRkQ2NAotICBhZGRyWzddID0gKGJmZF9ieXRlKShkYXRhID4+ICg3KjgpKTsKLSAgYWRkcls2XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNio4KSk7Ci0gIGFkZHJbNV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDUqOCkpOwotICBhZGRyWzRdID0gKGJmZF9ieXRlKShkYXRhID4+ICg0KjgpKTsKLSAgYWRkclszXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMyo4KSk7Ci0gIGFkZHJbMl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDIqOCkpOwotICBhZGRyWzFdID0gKGJmZF9ieXRlKShkYXRhID4+ICgxKjgpKTsKLSAgYWRkclswXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMCo4KSk7Ci0jZWxzZQotICBCRkRfRkFJTCgpOwotI2VuZGlmCi19Ci0MCi0vKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChiZmRfc2l6ZV90eXBlKSAob2Zmc2V0ICsgY291bnQpID4gc2VjdGlvbi0+X3Jhd19zaXplKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChsb2NhdGlvbiwgKGJmZF9zaXplX3R5cGUpIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgKGFiZmQsIHNlY3Rpb24sIHcsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIHNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3dpbmRvdyAqdyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmaWxlX3B0ciBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIFVTRV9NTUFQCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoYWJmZC0+eHZlYy0+X2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAhPSBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMpCi0gICAgewotICAgICAgLyogV2UgZG9uJ3Qga25vdyB3aGF0IGNoYW5nZXMgdGhlIGJmZCdzIGdldF9zZWN0aW9uX2NvbnRlbnRzCi0JIG1ldGhvZCBtYXkgaGF2ZSB0byBtYWtlLiAgU28gcHVudCB0cnlpbmcgdG8gbWFwIHRoZSBmaWxlCi0JIHdpbmRvdywgYW5kIGxldCBnZXRfc2VjdGlvbl9jb250ZW50cyBkbyBpdHMgdGhpbmcuICAqLwotICAgICAgLyogQEAgRklYTUUgOiBJZiB0aGUgaW50ZXJuYWwgd2luZG93IGhhcyBhIHJlZmNvdW50IG9mIDEgYW5kIHdhcwotCSBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MgaW5zdGVhZCBvZiBtbWFwLCBqdXN0IHJldXNlIGl0LiAgKi8KLSAgICAgIGJmZF9mcmVlX3dpbmRvdyAodyk7Ci0gICAgICB3LT5pID0gKGJmZF93aW5kb3dfaW50ZXJuYWwgKikgYmZkX3ptYWxsb2MgKHNpemVvZiAoYmZkX3dpbmRvd19pbnRlcm5hbCkpOwotICAgICAgaWYgKHctPmkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB3LT5pLT5kYXRhID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgY291bnQpOwotICAgICAgaWYgKHctPmktPmRhdGEgPT0gTlVMTCkKLQl7Ci0JICBmcmVlICh3LT5pKTsKLQkgIHctPmkgPSBOVUxMOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHctPmktPm1hcHBlZCA9IDA7Ci0gICAgICB3LT5pLT5yZWZjb3VudCA9IDE7Ci0gICAgICB3LT5zaXplID0gdy0+aS0+c2l6ZSA9IGNvdW50OwotICAgICAgdy0+ZGF0YSA9IHctPmktPmRhdGE7Ci0gICAgICByZXR1cm4gYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCB3LT5kYXRhLCBvZmZzZXQsIGNvdW50KTsKLSAgICB9Ci0gIGlmICgoYmZkX3NpemVfdHlwZSkgKG9mZnNldCtjb3VudCkgPiBzZWN0aW9uLT5fcmF3X3NpemUKLSAgICAgIHx8IChiZmRfZ2V0X2ZpbGVfd2luZG93IChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBjb3VudCwgdywgdHJ1ZSkKLQkgID09IGZhbHNlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotI2Vsc2UKLSAgYWJvcnQgKCk7Ci0jZW5kaWYKLX0KLQotLyogVGhpcyBnZW5lcmljIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgaW4gaW1wbGVtZW50YXRpb25zIHdoZXJlIGNyZWF0aW5nCi0gICBORVcgc2VjdGlvbnMgaXMgZGlzYWxsb3dlZC4gIEl0IGlzIHVzZWZ1bCBpbiBwYXRjaGluZyBleGlzdGluZyBzZWN0aW9ucwotICAgaW4gcmVhZC13cml0ZSBmaWxlcywgdGhvdWdoLiAgU2VlIG90aGVyIHNldF9zZWN0aW9uX2NvbnRlbnRzIGZ1bmN0aW9ucwotICAgdG8gc2VlIHdoeSBpdCBkb2Vzbid0IHdvcmsgZm9yIG5ldyBzZWN0aW9ucy4gICovCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCksIFNFRUtfU0VUKSA9PSAtMQotICAgICAgfHwgYmZkX3dyaXRlIChsb2NhdGlvbiwgKGJmZF9zaXplX3R5cGUpIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9sb2cyCi0KLVNZTk9QU0lTCi0JdW5zaWduZWQgaW50IGJmZF9sb2cyKGJmZF92bWEgeCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBsb2cgYmFzZSAyIG9mIHRoZSB2YWx1ZSBzdXBwbGllZCwgcm91bmRlZCB1cC4gIEUuZy4sIGFuCi0JQHZhcnt4fSBvZiAxMDI1IHJldHVybnMgMTEuCi0qLwotCi11bnNpZ25lZCBpbnQKLWJmZF9sb2cyICh4KQotICAgICBiZmRfdm1hIHg7Ci17Ci0gIHVuc2lnbmVkIGludCByZXN1bHQgPSAwOwotCi0gIHdoaWxlICgoeCA9ICh4ID4+IDEpKSAhPSAwKQotICAgICsrcmVzdWx0OwotICByZXR1cm4gcmVzdWx0OwotfQotCi1ib29sZWFuCi1iZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgbG9jYWxzX3ByZWZpeCA9IChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09ICdfJykgPyAnTCcgOiAnLic7Ci0KLSAgcmV0dXJuIChuYW1lWzBdID09IGxvY2Fsc19wcmVmaXgpOwotfQotCi0vKiAgQ2FuIGJlIHVzZWQgZnJvbSAvIGZvciBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSB0byBjaGVjayB0aGF0Ci0gICAgZW5kaWFubmVzcyBtYXRjaGVzIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBmaWxlLiAgUmV0dXJucwotICAgIHRydWUgZm9yIGEgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlIGFuZCBlbWl0cyBhbiBlcnJvci4gICovCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfdmVyaWZ5X2VuZGlhbl9tYXRjaCAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGlmIChpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0gICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSgiJXM6IGNvbXBpbGVkIGZvciBhICVzIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyAlcyBlbmRpYW4iLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkgYmZkX2JpZ19lbmRpYW4gKGliZmQpID8gImJpZyIgOiAibGl0dGxlIiwKLQkgYmZkX2JpZ19lbmRpYW4gKG9iZmQpID8gImJpZyIgOiAibGl0dGxlIik7Ci0KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9saWJiZmQuaCBiL2JmZC9saWJiZmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiZjdlZi4uMDAwMDAwMAotLS0gYS9iZmQvbGliYmZkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MTkgKzAsMCBAQAotLyogbGliYmZkLmggLS0gRGVjbGFyYXRpb25zIHVzZWQgYnkgYmZkIGxpYnJhcnkgKmltcGxlbWVudGF0aW9uKi4KLSAgIChUaGlzIGluY2x1ZGUgZmlsZSBpcyBub3QgZm9yIHVzZXJzIG9mIHRoZSBsaWJyYXJ5LikKLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogbGliYmZkLmggaXMgYSBHRU5FUkFURUQgZmlsZS4gIERvbid0IGNoYW5nZSBpdDsgaW5zdGVhZCwKLSoqIGNoYW5nZSBsaWJiZmQtaW4uaCBvciB0aGUgb3RoZXIgQkZEIHNvdXJjZSBmaWxlcyBwcm9jZXNzZWQgdG8KLSoqIGdlbmVyYXRlIHRoaXMgZmlsZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBbGlnbiBhbiBhZGRyZXNzIHVwd2FyZCB0byBhIGJvdW5kYXJ5LCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2YgYnl0ZXMuCi0gICBFLmcuIGFsaWduIHRvIGFuIDgtYnl0ZSBib3VuZGFyeSB3aXRoIGFyZ3VtZW50IG9mIDguICBUYWtlIGNhcmUgbmV2ZXIKLSAgIHRvIHdyYXAgYXJvdW5kIGlmIHRoZSBhZGRyZXNzIGlzIHdpdGhpbiBib3VuZGFyeS0xIG9mIHRoZSBlbmQgb2YgdGhlCi0gICBhZGRyZXNzIHNwYWNlLiAgKi8KLSNkZWZpbmUgQkZEX0FMSUdOKHRoaXMsIGJvdW5kYXJ5KQkJCQkJXAotICAoKCgoYmZkX3ZtYSkgKHRoaXMpICsgKGJvdW5kYXJ5KSAtIDEpID49IChiZmRfdm1hKSAodGhpcykpCQlcCi0gICA/ICgoKGJmZF92bWEpICh0aGlzKSArICgoYm91bmRhcnkpIC0gMSkpICYgKH4oKGJvdW5kYXJ5KS0xKSkpCVwKLSAgIDogfiAoYmZkX3ZtYSkgMCkKLQotLyogSWYgeW91IHdhbnQgdG8gcmVhZCBhbmQgd3JpdGUgbGFyZ2UgYmxvY2tzLCB5b3UgbWlnaHQgd2FudCB0byBkbyBpdAotICAgaW4gcXVhbnRhIG9mIHRoaXMgYW1vdW50ICovCi0jZGVmaW5lIERFRkFVTFRfQlVGRkVSU0laRSA4MTkyCi0KLS8qIFNldCBhIHRkYXRhIGZpZWxkLiAgQ2FuJ3QgdXNlIHRoZSBvdGhlciBtYWNyb3MgZm9yIHRoaXMsIHNpbmNlIHRoZXkKLSAgIGRvIGNhc3RzLCBhbmQgY2FzdGluZyB0byB0aGUgbGVmdCBvZiBhc3NpZ25tZW50IGlzbid0IHBvcnRhYmxlLiAgKi8KLSNkZWZpbmUgc2V0X3RkYXRhKGJmZCwgdikgKChiZmQpLT50ZGF0YS5hbnkgPSAoUFRSKSAodikpCi0KLS8qIElmIEJGRF9JTl9NRU1PUlkgaXMgc2V0IGZvciBhIEJGRCwgdGhlbiB0aGUgaW9zdHJlYW0gZmllbGRzIHBvaW50cwotICAgdG8gYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgYmZkX2luX21lbW9yeQotewotICAvKiBTaXplIG9mIGJ1ZmZlci4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogQnVmZmVyIGhvbGRpbmcgY29udGVudHMgb2YgQkZELiAgKi8KLSAgYmZkX2J5dGUgKmJ1ZmZlcjsKLX07Ci0KLS8qIHRkYXRhIGZvciBhbiBhcmNoaXZlLiAgRm9yIGFuIGlucHV0IGFyY2hpdmUsIGNhY2hlCi0gICBuZWVkcyB0byBiZSBmcmVlKCknZC4gIEZvciBhbiBvdXRwdXQgYXJjaGl2ZSwgc3ltZGVmcyBkby4gICovCi0KLXN0cnVjdCBhcnRkYXRhIHsKLSAgZmlsZV9wdHIgZmlyc3RfZmlsZV9maWxlcG9zOwotICAvKiBTcGVlZCB1cCBzZWFyY2hpbmcgdGhlIGFybWFwICovCi0gIHN0cnVjdCBhcl9jYWNoZSAqY2FjaGU7Ci0gIGJmZCAqYXJjaGl2ZV9oZWFkOyAgICAgICAgICAgIC8qIE9ubHkgaW50ZXJlc3RpbmcgaW4gb3V0cHV0IHJvdXRpbmVzICovCi0gIGNhcnN5bSAqc3ltZGVmczsJCS8qIHRoZSBzeW1kZWYgZW50cmllcyAqLwotICBzeW1pbmRleCBzeW1kZWZfY291bnQ7ICAgICAgICAgICAgIC8qIGhvdyBtYW55IHRoZXJlIGFyZSAqLwotICBjaGFyICpleHRlbmRlZF9uYW1lczsJCS8qIGNsZXZlciBpbnRlbCBleHRlbnNpb24gKi8KLSAgLyogd2hlbiBtb3JlIGNvbXBpbGVycyBhcmUgc3RhbmRhcmQgQywgdGhpcyBjYW4gYmUgYSB0aW1lX3QgKi8KLSAgbG9uZyAgYXJtYXBfdGltZXN0YW1wOwkvKiBUaW1lc3RhbXAgdmFsdWUgd3JpdHRlbiBpbnRvIGFybWFwLgotCQkJCSAgIFRoaXMgaXMgdXNlZCBmb3IgQlNEIGFyY2hpdmVzIHRvIGNoZWNrCi0JCQkJICAgdGhhdCB0aGUgdGltZXN0YW1wIGlzIHJlY2VudCBlbm91Z2gKLQkJCQkgICBmb3IgdGhlIEJTRCBsaW5rZXIgdG8gbm90IGNvbXBsYWluLAotCQkJCSAgIGp1c3QgYmVmb3JlIHdlIGZpbmlzaCB3cml0aW5nIGFuCi0JCQkJICAgYXJjaGl2ZS4gICovCi0gIGZpbGVfcHRyIGFybWFwX2RhdGVwb3M7CS8qIFBvc2l0aW9uIHdpdGhpbiBhcmNoaXZlIHRvIHNlZWsgdG8KLQkJCQkgICByZXdyaXRlIHRoZSBkYXRlIGZpZWxkLiAgKi8KLSAgUFRSIHRkYXRhOwkJCS8qIEJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotfTsKLQotI2RlZmluZSBiZmRfYXJkYXRhKGJmZCkgKChiZmQpLT50ZGF0YS5hb3V0X2FyX2RhdGEpCi0KLS8qIEdvZXMgaW4gYmZkJ3MgYXJlbHRfZGF0YSBzbG90ICovCi1zdHJ1Y3QgYXJlbHRkYXRhIHsKLSAgY2hhciAqIGFyY2hfaGVhZGVyOwkJCSAgICAgLyogaXQncyBhY3R1YWxseSBhIHN0cmluZyAqLwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7ICAgICAvKiBvY3RldHMgb2YgZmlsZXNpemUgbm90IGluY2x1ZGluZyBhcl9oZHIgKi8KLSAgY2hhciAqZmlsZW5hbWU7CQkJICAgICAvKiBudWxsLXRlcm1pbmF0ZWQgKi8KLX07Ci0KLSNkZWZpbmUgYXJlbHRfc2l6ZShiZmQpICgoKHN0cnVjdCBhcmVsdGRhdGEgKikoKGJmZCktPmFyZWx0X2RhdGEpKS0+cGFyc2VkX3NpemUpCi0KLWV4dGVybiBQVFIgYmZkX21hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3JlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3ptYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLWV4dGVybiBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIF9iZmRfZXJyb3JfaGFuZGxlcjsKLQotLyogVGhlc2Ugcm91dGluZXMgYWxsb2NhdGUgYW5kIGZyZWUgdGhpbmdzIG9uIHRoZSBCRkQncyBvYmphbGxvYy4gICovCi0KLWV4dGVybiBQVFIgYmZkX2FsbG9jIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QpKTsKLWV4dGVybiBQVFIgYmZkX3phbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7Ci1leHRlcm4gdm9pZCBiZmRfcmVsZWFzZSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLWJmZCAqCV9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCBQQVJBTVMgKChiZmQgKm9iZmQpKTsKLWJmZCAqCV9iZmRfbG9va19mb3JfYmZkX2luX2NhY2hlIFBBUkFNUyAoKGJmZCAqYXJjaF9iZmQsIGZpbGVfcHRyIGluZGV4KSk7Ci1ib29sZWFuIF9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgYmZkICopKTsKLWJvb2xlYW4JX2JmZF9nZW5lcmljX21rYXJjaGl2ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWNvbnN0IGJmZF90YXJnZXQgKmJmZF9nZW5lcmljX2FyY2hpdmVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4JYmZkX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbiBiZmRfc2x1cnBfYnNkX2FybWFwX2YyIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotI2RlZmluZSBiZmRfc2x1cnBfYnNkX2FybWFwIGJmZF9zbHVycF9hcm1hcAotI2RlZmluZSBiZmRfc2x1cnBfY29mZl9hcm1hcCBiZmRfc2x1cnBfYXJtYXAKLWJvb2xlYW4JX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1ib29sZWFuCV9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4gX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50IGVsZW5ndGgpKTsKLWJmZCAqX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgUEFSQU1TICgoYmZkICphcmNoaXZlLCBmaWxlX3B0ciBmaWxlcG9zKSk7Ci1leHRlcm4gYmZkICpfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleCBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLWJmZCAqIF9iZmRfbmV3X2JmZCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWJvb2xlYW4JYmZkX2ZhbHNlIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1ib29sZWFuCWJmZF90cnVlIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1QVFIJYmZkX251bGx2b2lkcHRyIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1pbnQJYmZkXzAgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLXVuc2lnbmVkIGludAliZmRfMHUgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWxvbmcJYmZkXzBsIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1sb25nCV9iZmRfbjEgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLXZvaWQJYmZkX3ZvaWQgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLQotYmZkICpfYmZkX25ld19iZmRfY29udGFpbmVkX2luIFBBUkFNUyAoKGJmZCAqKSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpfYmZkX2R1bW15X3RhcmdldCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotdm9pZAliZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci12b2lkCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotdm9pZAliZmRfZ251X3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLQotYm9vbGVhbglic2Rfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLQkJCQkgIHN0cnVjdCBvcmwgKm1hcCwgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOwotCi1ib29sZWFuCWNvZmZfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLQkJCQkgICBzdHJ1Y3Qgb3JsICptYXAsIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKLQotZXh0ZXJuIFBUUiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIFBUUiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotYmZkICoJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwKLQkJCQkJCSAgICAgYmZkICpsYXN0X2ZpbGUpKTsKLQotaW50CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzdGF0ICopKTsKLQotI2RlZmluZSBfYmZkX3JlYWRfYXJfaGRyKGFiZmQpIFwKLSAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfcmVhZF9hcl9oZHJfZm4sIChhYmZkKSkKLQwKLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9HRU5FUklDLiAgVXNlCi0gICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAgYmZkX3RydWUKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvIGJmZF90cnVlCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfdHJ1ZSkKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3dpbmRvdyAqLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQ09QWS4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmQgKiwgYXN5bWJvbCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIpKSkgYmZkX3RydWUpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQ09SRSB3aGVuIHRoZXJlIGlzIG5vIGNvcmUgZmlsZQotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSkuICAqLwotCi1leHRlcm4gY2hhciAqX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGludCBfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHdoZW4gdGhlcmUgaXMgbm8gYXJjaGl2ZQotICAgZmlsZSBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfc2x1cnBfYXJtYXAgYmZkX2ZhbHNlCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmZkX2ZhbHNlCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfdHJ1bmNhdGVfYXJuYW1lIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjaGFyICopKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3dyaXRlX2FybWFwIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3JlYWRfYXJfaGRyIGJmZF9udWxsdm9pZHB0cgotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICAoKGJmZCAqKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2dldF9lbHRfYXRfaW5kZXggXAotICAoKGJmZCAqKCopIFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX2ZhbHNlCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB0byBnZXQgQlNEIHN0eWxlCi0gICBhcmNoaXZlcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKS4gICovCi0KLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9zbHVycF9hcm1hcCBiZmRfc2x1cnBfYnNkX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfdHJ1bmNhdGVfYXJuYW1lIGJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfd3JpdGVfYXJtYXAgYnNkX3dyaXRlX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0gIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgdG8gZ2V0IENPRkYgc3R5bGUKLSAgIGFyY2hpdmVzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKS4gICovCi0KLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2NvZmZfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl90cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3dyaXRlX2FybWFwIGNvZmZfd3JpdGVfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfcmVhZF9hcl9oZHIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCi0gIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgd2hlcmUgdGhlcmUgaXMgbm8gc3ltYm9sCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX21ha2VfZW1wdHlfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8gXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubyBcCi0gICgoYWxlbnQgKigqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwgXAotCSAgICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgUFRSLCB1bnNpZ25lZCBsb25nKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsIGFzeW1ib2wgKikpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIHdoZW4gdGhlcmUgaXMgbm8gcmVsb2MKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gICgocmVsb2NfaG93dG9fdHlwZSAqKCopIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1dSSVRFIGZvciB0YXJnZXRzIHdoaWNoIG1heSBub3QKLSAgIGJlIHdyaXR0ZW4uICBVc2UgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfbm93cml0ZSkuICAqLwotCi0jZGVmaW5lIF9iZmRfbm93cml0ZV9zZXRfYXJjaF9tYWNoIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3dyaXRlX3NldF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpKSBcCi0gICBiZmRfZmFsc2UpCi0KLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9XUklURS4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0xJTksgZm9yIHRhcmdldHMgd2hpY2ggZG8gbm90Ci0gICBzdXBwb3J0IGxpbmtpbmcuICBVc2UgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLiAgKi8KLQotI2RlZmluZSBfYmZkX25vbGlua19zaXplb2ZfaGVhZGVycyAoKGludCAoKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKSkgYmZkXzApCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICAoKGJmZF9ieXRlICooKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgXAotCSAgICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9yZWxheF9zZWN0aW9uIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9nY19zZWN0aW9ucyBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKikgUEFSQU1TICgoYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19hZGRfc3ltYm9scyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZmluYWxfbGluayBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19zcGxpdF9zZWN0aW9uIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSkpIGJmZF9mYWxzZSkKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIGZvciB0YXJnZXRzIHdoaWNoIGRvIG5vdAotICAgaGF2ZSBkeW5hbWljIHN5bWJvbHMgb3IgcmVsb2NzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMKLSAgIChfYmZkX25vZHluYW1pYykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLQwKLS8qIEdlbmVyaWMgcm91dGluZSB0byBkZXRlcm1pbmUgb2YgdGhlIGdpdmVuIHN5bWJvbCBpcyBhIGxvY2FsCi0gICBsYWJlbC4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotLyogR2VuZXJpYyBtaW5pc3ltYm9sIHJvdXRpbmVzLiAgKi8KLWV4dGVybiBsb25nIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKTsKLWV4dGVybiBhc3ltYm9sICpfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwgYXN5bWJvbCAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB1c2luZyAuc3RhYi8uc3RhYnN0ciBzZWN0aW9ucy4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYm9vbGVhbiAqLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqLCBQVFIgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFkZXJzdCBsaW5lIHVzaW5nIERXQVJGIDEgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB1c2luZyBEV0FSRiAyIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIEEgcm91dGluZSB0byBjcmVhdGUgZW50cmllcyBmb3IgYSBiZmRfbGlua19oYXNoX3RhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlLAotCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi0vKiBJbml0aWFsaXplIGEgYmZkX2xpbmtfaGFzaF90YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogR2VuZXJpYyBsaW5rIGhhc2ggdGFibGUgY3JlYXRpb24gcm91dGluZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgVGhpcyB2ZXJzaW9uIGlzIHVzZWQgYnkgdGFyZ2V0cyBmb3IKLSAgIHdoaWNoIHRoZSBsaW5rZXIgbXVzdCBjb2xsZWN0IGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYnkgbmFtZSwKLSAgIGFzIHRoZSBjb2xsZWN0MiBwcm9ncmFtIGRvZXMuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBHZW5lcmljIGFyY2hpdmUgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgYm9vbGVhbiAoKmNoZWNrZm4pIChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSkpOwotCi0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiB0byBhdm9pZCBwcm90b3R5cGUgZXJyb3JzLiAgKi8KLXR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgX2JmZF9saW5rX2hhc2hfZW50cnk7Ci0KLS8qIEdlbmVyaWMgcm91dGluZSB0byBhZGQgYSBzaW5nbGUgc3ltYm9sLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICpuYW1lLCBmbGFnd29yZCwKLQkgICBhc2VjdGlvbiAqLCBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY29weSwKLQkgICBib29sZWFuIGNvbnN0cnVjdG9yLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotCi0vKiBHZW5lcmljIGxpbmsgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLQotLyogR2VuZXJpYyByZWxvY19saW5rX29yZGVyIHByb2Nlc3Npbmcgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBEZWZhdWx0IGxpbmsgb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVsb2MgZW50cmllcyBpbiBhIGxpbmsgb3JkZXIgbGlzdC4gICovCi1leHRlcm4gdW5zaWduZWQgaW50IF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogRmluYWwgbGluayByZWxvY2F0aW9uIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBiZmRfdm1hIGFkZHJlc3MsIGJmZF92bWEgdmFsdWUsIGJmZF92bWEgYWRkZW5kKSk7Ci0KLS8qIFJlbG9jYXRlIGEgcGFydGljdWxhciBsb2NhdGlvbiBieSBhIGhvd3RvIGFuZCBhIHZhbHVlLiAgKi8KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0KLS8qIExpbmsgc3RhYnMgaW4gc2VjdGlvbnMgaW4gdGhlIGZpcnN0IHBhc3MuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicwotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIGFzZWN0aW9uICosIFBUUiAqKSk7Ci0KLS8qIFdyaXRlIG91dCB0aGUgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBQVFIgKiwgYmZkX2J5dGUgKikpOwotCi0vKiBXcml0ZSBvdXQgdGhlIC5zdGFic3RyIHN0cmluZyB0YWJsZSB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyBQQVJBTVMgKChiZmQgKiwgUFRSICopKTsKLQotLyogRmluZCBhbiBvZmZzZXQgd2l0aGluIGEgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4KLSAgIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJmZF92bWEgX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgUFRSICosIGJmZF92bWEpKTsKLQotLyogQ3JlYXRlIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQ3JlYXRlIGFuIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uIHN0eWxlIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEZyZWUgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgX2JmZF9zdHJpbmd0YWJfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogR2V0IHRoZSBzaXplIG9mIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBiZmRfc2l6ZV90eXBlIF9iZmRfc3RyaW5ndGFiX3NpemUgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0KLS8qIEFkZCBhIHN0cmluZyB0byBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYmZkX3NpemVfdHlwZSBfYmZkX3N0cmluZ3RhYl9hZGQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gaGFzaCwKLQkgICBib29sZWFuIGNvcHkpKTsKLQotLyogV3JpdGUgb3V0IGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfc3RyaW5ndGFiX2VtaXQgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBDaGVjayB0aGF0IGVuZGlhbm5lc3Mgb2YgaW5wdXQgYW5kIG91dHB1dCBmaWxlIG1hdGNoLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotDAotLyogTWFjcm9zIHRvIHRlbGwgaWYgYmZkcyBhcmUgcmVhZCBvciB3cml0ZSBlbmFibGVkLgotCi0gICBOb3RlIHRoYXQgYmZkcyBvcGVuIGZvciByZWFkIG1heSBiZSBzY3JpYmJsZWQgaW50byBpZiB0aGUgZmQgcGFzc2VkCi0gICB0byBiZmRfZmRvcGVuciBpcyBhY3R1YWxseSBvcGVuIGJvdGggZm9yIHJlYWQgYW5kIHdyaXRlCi0gICBzaW11bHRhbmVvdXNseS4gIEhvd2V2ZXIgYW4gb3V0cHV0IGJmZCB3aWxsIG5ldmVyIGJlIG9wZW4gZm9yCi0gICByZWFkLiAgVGhlcmVmb3JlIHNvbWV0aW1lcyB5b3Ugd2FudCB0byBjaGVjayBiZmRfcmVhZF9wIG9yCi0gICAhYmZkX3JlYWRfcCwgYW5kIG9ubHkgc29tZXRpbWVzIGJmZF93cml0ZV9wLgotKi8KLQotI2RlZmluZQliZmRfcmVhZF9wKGFiZmQpICgoYWJmZCktPmRpcmVjdGlvbiA9PSByZWFkX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKLSNkZWZpbmUJYmZkX3dyaXRlX3AoYWJmZCkgKChhYmZkKS0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKLQotdm9pZAliZmRfYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIqLGludCkpOwotCi0jZGVmaW5lIEJGRF9BU1NFUlQoeCkgXAoteyBpZiAoISh4KSkgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KLQotI2RlZmluZSBCRkRfRkFJTCgpIFwKLXsgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KLQotZXh0ZXJuIHZvaWQgX2JmZF9hYm9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSkKLSAgICAgQVRUUklCVVRFX05PUkVUVVJOOwotCi0vKiBpZiBnY2MsIHdlIGNhbiBnaXZlIGEgZnVuY3Rpb24gbmFtZSwgdG9vICovCi0jaWYgIWRlZmluZWQgKF9fR05VQ19fKSB8fCBfX0dOVUNfTUlOT1JfXyA8PSA1Ci0jZGVmaW5lIF9fUFJFVFRZX0ZVTkNUSU9OX18gICgoY2hhciAqKSBOVUxMKQotI2VuZGlmCi0KLSN1bmRlZiBhYm9ydAotI2RlZmluZSBhYm9ydCgpIF9iZmRfYWJvcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXykKLQotRklMRSAqCWJmZF9jYWNoZV9sb29rdXBfd29ya2VyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBiZmQgKmJmZF9sYXN0X2NhY2hlOwotCi0vKiBMaXN0IG9mIHN1cHBvcnRlZCB0YXJnZXQgdmVjdG9ycywgYW5kIHRoZSBkZWZhdWx0IHZlY3RvciAoaWYKLSAgIGJmZF9kZWZhdWx0X3ZlY3RvclswXSBpcyBOVUxMLCB0aGVyZSBpcyBubyBkZWZhdWx0KS4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0IGJmZF90YXJnZXRfdmVjdG9yW107Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2RlZmF1bHRfdmVjdG9yW107Ci0KLS8qIEZ1bmN0aW9ucyBzaGFyZWQgYnkgdGhlIEVDT0ZGIGFuZCBNSVBTIEVMRiBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubwotICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGVjb2ZmX2ZpbmRfbGluZTsKLSNlbmRpZgotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0LAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QsIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKiwKLQkgICBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MgUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci0KLWV4dGVybiBiZmRfdm1hIF9iZmRfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3NldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSkpOwotCi0vKiBGdW5jdGlvbiBzaGFyZWQgYnkgdGhlIENPRkYgYW5kIEVMRiBTSCBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubwotICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIGJvb2xlYW4gKCopIChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSwKLQkgICBQVFIsIGJmZF92bWEgKiosIGJmZF92bWEgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgYm9vbGVhbiAqKSk7Ci0KLS8qIEFuZCBtb3JlIGZvbGxvd3MgKi8KLQotdm9pZCAKLWJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50IFBBUkFNUyAoKGJmZCAqYWJmZCwgIGludCBpKSk7Ci0KLXVuc2lnbmVkIGludCAKLWJmZF9sb2cyIFBBUkFNUyAoKGJmZF92bWEgeCkpOwotCi0jZGVmaW5lIEJGRF9DQUNIRV9NQVhfT1BFTiAxMAotZXh0ZXJuIGJmZCAqYmZkX2xhc3RfY2FjaGU7Ci0KLSNkZWZpbmUgYmZkX2NhY2hlX2xvb2t1cCh4KSBcCi0gICAgKCh4KT09YmZkX2xhc3RfY2FjaGU/IFwKLSAgICAgIChGSUxFKikoYmZkX2xhc3RfY2FjaGUtPmlvc3RyZWFtKTogXAotICAgICAgIGJmZF9jYWNoZV9sb29rdXBfd29ya2VyKHgpKQotYm9vbGVhbiAKLWJmZF9jYWNoZV9pbml0ICBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbiAKLWJmZF9jYWNoZV9jbG9zZSAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLUZJTEUqIAotYmZkX29wZW5fZmlsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotRklMRSAqCi1iZmRfY2FjaGVfbG9va3VwX3dvcmtlciBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotI2lmZGVmIF9CRkRfTUFLRV9UQUJMRV9iZmRfcmVsb2NfY29kZV9yZWFsCi0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBiZmRfcmVsb2NfY29kZV9yZWFsX25hbWVzW10gPSB7ICJAQHVuaW5pdGlhbGl6ZWRAQCIsCi0KLSAgIkJGRF9SRUxPQ182NCIsCi0gICJCRkRfUkVMT0NfMzIiLAotICAiQkZEX1JFTE9DXzI2IiwKLSAgIkJGRF9SRUxPQ18yNCIsCi0gICJCRkRfUkVMT0NfMTYiLAotICAiQkZEX1JFTE9DXzE0IiwKLSAgIkJGRF9SRUxPQ184IiwKLSAgIkJGRF9SRUxPQ182NF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMzJfUENSRUwiLAotICAiQkZEX1JFTE9DXzI0X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18xNl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMTJfUENSRUwiLAotICAiQkZEX1JFTE9DXzhfUENSRUwiLAotICAiQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMTZfR09UX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ184X0dPVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMzJfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ18xNl9HT1RPRkYiLAotICAiQkZEX1JFTE9DX0xPMTZfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ19ISTE2X0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfOF9HT1RPRkYiLAotICAiQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMjRfUExUX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18xNl9QTFRfUENSRUwiLAotICAiQkZEX1JFTE9DXzhfUExUX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18zMl9QTFRPRkYiLAotICAiQkZEX1JFTE9DXzE2X1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfTE8xNl9QTFRPRkYiLAotICAiQkZEX1JFTE9DX0hJMTZfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ19ISTE2X1NfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ184X1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfNjhLX0dMT0JfREFUIiwKLSAgIkJGRF9SRUxPQ182OEtfSk1QX1NMT1QiLAotICAiQkZEX1JFTE9DXzY4S19SRUxBVElWRSIsCi0gICJCRkRfUkVMT0NfMzJfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfMTZfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfTE8xNl9CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ19ISTE2X0JBU0VSRUwiLAotICAiQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ184X0JBU0VSRUwiLAotICAiQkZEX1JFTE9DX1JWQSIsCi0gICJCRkRfUkVMT0NfOF9GRm5uIiwKLSAgIkJGRF9SRUxPQ18zMl9QQ1JFTF9TMiIsCi0gICJCRkRfUkVMT0NfMTZfUENSRUxfUzIiLAotICAiQkZEX1JFTE9DXzIzX1BDUkVMX1MyIiwKLSAgIkJGRF9SRUxPQ19ISTIyIiwKLSAgIkJGRF9SRUxPQ19MTzEwIiwKLSAgIkJGRF9SRUxPQ19HUFJFTDE2IiwKLSAgIkJGRF9SRUxPQ19HUFJFTDMyIiwKLSAgIkJGRF9SRUxPQ19JOTYwX0NBTExKIiwKLSAgIkJGRF9SRUxPQ19OT05FIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19XRElTUDIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQzIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQzEzIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19HT1QxMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfR09UMTMiLAotICAiQkZEX1JFTE9DX1NQQVJDX0dPVDIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19QQzEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19QQzIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19XUExUMzAiLAotICAiQkZEX1JFTE9DX1NQQVJDX0NPUFkiLAotICAiQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFUIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19KTVBfU0xPVCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUiLAotICAiQkZEX1JFTE9DX1NQQVJDX1VBMzIiLAotICAiQkZEX1JFTE9DX1NQQVJDX0JBU0UxMyIsCi0gICJCRkRfUkVMT0NfU1BBUkNfQkFTRTIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ18xMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfMTEiLAotICAiQkZEX1JFTE9DX1NQQVJDX09MTzEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19ISDIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19ITTEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19MTTIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19QQ19ISDIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19QQ19ITTEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19QQ19MTTIyIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19XRElTUDE2IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19XRElTUDE5IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ183IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ182IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ181IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19QTFQ2NCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfSElYMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX0xPWDEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19INDQiLAotICAiQkZEX1JFTE9DX1NQQVJDX000NCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfTDQ0IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19SRUdJU1RFUiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfUkVWMzIiLAotICAiQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2IiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNiIsCi0gICJCRkRfUkVMT0NfQUxQSEFfR1BESVNQIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTCIsCi0gICJCRkRfUkVMT0NfQUxQSEFfTElUVVNFIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUwiLAotICAiQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JBU0UiLAotICAiQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRiIsCi0gICJCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQRElTUCIsCi0gICJCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTEhJR0giLAotICAiQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxMT1ciLAotICAiQkZEX1JFTE9DX0FMUEhBX0hJTlQiLAotICAiQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UiLAotICAiQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSIiwKLSAgIkJGRF9SRUxPQ19NSVBTX0pNUCIsCi0gICJCRkRfUkVMT0NfTUlQUzE2X0pNUCIsCi0gICJCRkRfUkVMT0NfTUlQUzE2X0dQUkVMIiwKLSAgIkJGRF9SRUxPQ19ISTE2IiwKLSAgIkJGRF9SRUxPQ19ISTE2X1MiLAotICAiQkZEX1JFTE9DX0xPMTYiLAotICAiQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyIsCi0gICJCRkRfUkVMT0NfUENSRUxfTE8xNiIsCi0gICJCRkRfUkVMT0NfTUlQU19MSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19NSVBTX0dPVDE2IiwKLSAgIkJGRF9SRUxPQ19NSVBTX0NBTEwxNiIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1RfSEkxNiIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiIsCi0gICJCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYiLAotICAiQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2IiwKLSAgIkJGRF9SRUxPQ19NSVBTX1NVQiIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1RfUEFHRSIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1RfT0ZTVCIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1RfRElTUCIsCi0KLSAgIkJGRF9SRUxPQ18zODZfR09UMzIiLAotICAiQkZEX1JFTE9DXzM4Nl9QTFQzMiIsCi0gICJCRkRfUkVMT0NfMzg2X0NPUFkiLAotICAiQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfMzg2X0pVTVBfU0xPVCIsCi0gICJCRkRfUkVMT0NfMzg2X1JFTEFUSVZFIiwKLSAgIkJGRF9SRUxPQ18zODZfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ18zODZfR09UUEMiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV84IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fMTYiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV8zMiIsCi0gICJCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTlMzMktfSU1NXzMyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzgiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfMzIiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfUEpfQ09ERV9ISTE2IiwKLSAgIkJGRF9SRUxPQ19QSl9DT0RFX0xPMTYiLAotICAiQkZEX1JFTE9DX1BKX0NPREVfRElSMTYiLAotICAiQkZEX1JFTE9DX1BKX0NPREVfRElSMzIiLAotICAiQkZEX1JFTE9DX1BKX0NPREVfUkVMMTYiLAotICAiQkZEX1JFTE9DX1BKX0NPREVfUkVMMzIiLAotICAiQkZEX1JFTE9DX1BQQ19CMjYiLAotICAiQkZEX1JFTE9DX1BQQ19CQTI2IiwKLSAgIkJGRF9SRUxPQ19QUENfVE9DMTYiLAotICAiQkZEX1JFTE9DX1BQQ19CMTYiLAotICAiQkZEX1JFTE9DX1BQQ19CMTZfQlJUQUtFTiIsCi0gICJCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTiIsCi0gICJCRkRfUkVMT0NfUFBDX0JBMTYiLAotICAiQkZEX1JFTE9DX1BQQ19CQTE2X0JSVEFLRU4iLAotICAiQkZEX1JFTE9DX1BQQ19CQTE2X0JSTlRBS0VOIiwKLSAgIkJGRF9SRUxPQ19QUENfQ09QWSIsCi0gICJCRkRfUkVMT0NfUFBDX0dMT0JfREFUIiwKLSAgIkJGRF9SRUxPQ19QUENfSk1QX1NMT1QiLAotICAiQkZEX1JFTE9DX1BQQ19SRUxBVElWRSIsCi0gICJCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQyIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX05BRERSMTYiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9MTyIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEEiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfU0RBSTE2IiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1NEQTJJMTYiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfU0RBMlJFTCIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9TREEyMSIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUYiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTYiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfTE8iLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEkiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEEiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfQklUX0ZMRCIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREEiLAotICAiQkZEX1JFTE9DX0NUT1IiLAotICAiQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0giLAotICAiQkZEX1JFTE9DX0FSTV9JTU1FRElBVEUiLAotICAiQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURSIsCi0gICJCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9TSElGVF9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9TV0kiLAotICAiQkZEX1JFTE9DX0FSTV9NVUxUSSIsCi0gICJCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9BRFJfSU1NIiwKLSAgIkJGRF9SRUxPQ19BUk1fTERSX0lNTSIsCi0gICJCRkRfUkVMT0NfQVJNX0xJVEVSQUwiLAotICAiQkZEX1JFTE9DX0FSTV9JTl9QT09MIiwKLSAgIkJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTgiLAotICAiQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwiLAotICAiQkZEX1JFTE9DX0FSTV9USFVNQl9BREQiLAotICAiQkZEX1JFTE9DX0FSTV9USFVNQl9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVCIsCi0gICJCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCIsCi0gICJCRkRfUkVMT0NfQVJNX0dPVDEyIiwKLSAgIkJGRF9SRUxPQ19BUk1fR09UMzIiLAotICAiQkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QiLAotICAiQkZEX1JFTE9DX0FSTV9DT1BZIiwKLSAgIkJGRF9SRUxPQ19BUk1fR0xPQl9EQVQiLAotICAiQkZEX1JFTE9DX0FSTV9QTFQzMiIsCi0gICJCRkRfUkVMT0NfQVJNX1JFTEFUSVZFIiwKLSAgIkJGRF9SRUxPQ19BUk1fR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ19BUk1fR09UUEMiLAotICAiQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIiLAotICAiQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyIiwKLSAgIkJGRF9SRUxPQ19TSF9JTU00IiwKLSAgIkJGRF9SRUxPQ19TSF9JTU00QlkyIiwKLSAgIkJGRF9SRUxPQ19TSF9JTU00Qlk0IiwKLSAgIkJGRF9SRUxPQ19TSF9JTU04IiwKLSAgIkJGRF9SRUxPQ19TSF9JTU04QlkyIiwKLSAgIkJGRF9SRUxPQ19TSF9JTU04Qlk0IiwKLSAgIkJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTIiLAotICAiQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNCIsCi0gICJCRkRfUkVMT0NfU0hfU1dJVENIMTYiLAotICAiQkZEX1JFTE9DX1NIX1NXSVRDSDMyIiwKLSAgIkJGRF9SRUxPQ19TSF9VU0VTIiwKLSAgIkJGRF9SRUxPQ19TSF9DT1VOVCIsCi0gICJCRkRfUkVMT0NfU0hfQUxJR04iLAotICAiQkZEX1JFTE9DX1NIX0NPREUiLAotICAiQkZEX1JFTE9DX1NIX0RBVEEiLAotICAiQkZEX1JFTE9DX1NIX0xBQkVMIiwKLSAgIkJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5IiwKLSAgIkJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMiIsCi0gICJCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMiLAotICAiQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwiLAotICAiQkZEX1JFTE9DX0FSQ19CMjYiLAotICAiQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUiIsCi0gICJCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MIiwKLSAgIkJGRF9SRUxPQ19EMTBWXzE4IiwKLSAgIkJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzYiLAotICAiQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1IiLAotICAiQkZEX1JFTE9DX0QzMFZfMTUiLAotICAiQkZEX1JFTE9DX0QzMFZfMTVfUENSRUwiLAotICAiQkZEX1JFTE9DX0QzMFZfMTVfUENSRUxfUiIsCi0gICJCRkRfUkVMT0NfRDMwVl8yMSIsCi0gICJCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzMyIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NMzJSXzI0IiwKLSAgIkJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NMzJSXzE4X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NMzJSXzI2X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPIiwKLSAgIkJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPIiwKLSAgIkJGRF9SRUxPQ19NMzJSX0xPMTYiLAotICAiQkZEX1JFTE9DX00zMlJfU0RBMTYiLAotICAiQkZEX1JFTE9DX1Y4NTBfOV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfVjg1MF8yMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1NEQV8xNV8xNl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9aREFfMTVfMTZfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV83XzhfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzRfNF9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUIiwKLQotICAiQkZEX1JFTE9DX01OMTAzMDBfMzJfUENSRUwiLAotICAiQkZEX1JFTE9DX01OMTAzMDBfMTZfUENSRUwiLAotICAiQkZEX1JFTE9DX1RJQzMwX0xEUCIsCi0gICJCRkRfUkVMT0NfRlIzMF80OCIsCi0gICJCRkRfUkVMT0NfRlIzMF8yMCIsCi0gICJCRkRfUkVMT0NfRlIzMF82X0lOXzQiLAotICAiQkZEX1JFTE9DX0ZSMzBfOF9JTl84IiwKLSAgIkJGRF9SRUxPQ19GUjMwXzlfSU5fOCIsCi0gICJCRkRfUkVMT0NfRlIzMF8xMF9JTl84IiwKLSAgIkJGRF9SRUxPQ19GUjMwXzlfUENSRUwiLAotICAiQkZEX1JFTE9DX0ZSMzBfMTJfUENSRUwiLAotICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQiLAotICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyIiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyIiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9QQ1JFTF8zMiIsCi0gICJCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyIiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9SVkEiLAotICAiQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUIiwKLSAgIkJGRF9SRUxPQ19WVEFCTEVfRU5UUlkiLAotICJAQG92ZXJmbG93OiBCRkRfUkVMT0NfVU5VU0VEQEAiLAotfTsKLSNlbmRpZgotCi1yZWxvY19ob3d0b190eXBlICoKLWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0gUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgIGNvZGUpKTsKLQotYm9vbGVhbiAKLWJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLSAgICBib29sZWFuICopKTsKLQotYm9vbGVhbiAKLWJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0gUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotYmZkX2J5dGUgKgotCi1iZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwKLSAgICBiZmRfYnl0ZSAqZGF0YSwKLSAgICBib29sZWFuIHJlbG9jYXRlYWJsZSwKLSAgICBhc3ltYm9sICoqc3ltYm9scykpOwotCi1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OwotYm9vbGVhbiAKLWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICphYmZkLAotICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotICAgIHVuc2lnbmVkIGxvbmcgbWFjaCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2RlZmF1bHRfY29tcGF0aWJsZQotIFBBUkFNUyAoKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYSwKLSAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmIpKTsKLQotYm9vbGVhbiAKLWJmZF9kZWZhdWx0X3NjYW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi1zdHJ1Y3QgZWxmX2ludGVybmFsX3NoZHIgKgotYmZkX2VsZl9maW5kX3NlY3Rpb24gIFBBUkFNUyAoKGJmZCAqYWJmZCwgY2hhciAqbmFtZSkpOwotCmRpZmYgLS1naXQgYS9iZmQvbGliY29mZi1pbi5oIGIvYmZkL2xpYmNvZmYtaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxYTAyNi4uMDAwMDAwMAotLS0gYS9iZmQvbGliY29mZi1pbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLS8qIEJGRCBDT0ZGIG9iamVjdCBmaWxlIHByaXZhdGUgc3RydWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogbGliY29mZi5oIGlzIGEgR0VORVJBVEVEIGZpbGUuICBEb24ndCBjaGFuZ2UgaXQ7IGluc3RlYWQsCi0qKiBjaGFuZ2UgbGliY29mZi1pbi5oIG9yIGNvZmZjb2RlLmguCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotLyogT2JqZWN0IGZpbGUgdGRhdGE7IGFjY2VzcyBtYWNyb3MgKi8KLQotI2RlZmluZSBjb2ZmX2RhdGEoYmZkKQkJKChiZmQpLT50ZGF0YS5jb2ZmX29ial9kYXRhKQotI2RlZmluZSBleGVjX2hkcihiZmQpCQkoY29mZl9kYXRhKGJmZCktPmhkcikKLSNkZWZpbmUgb2JqX3BlKGJmZCkgICAgICAgICAgICAgKGNvZmZfZGF0YShiZmQpLT5wZSkKLSNkZWZpbmUgb2JqX3N5bWJvbHMoYmZkKQkoY29mZl9kYXRhKGJmZCktPnN5bWJvbHMpCi0jZGVmaW5lCW9ial9zeW1fZmlsZXBvcyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+c3ltX2ZpbGVwb3MpCi0KLSNkZWZpbmUgb2JqX3JlbG9jYmFzZShiZmQpCShjb2ZmX2RhdGEoYmZkKS0+cmVsb2NiYXNlKQotI2RlZmluZSBvYmpfcmF3X3N5bWVudHMoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJhd19zeW1lbnRzKQotI2RlZmluZSBvYmpfcmF3X3N5bWVudF9jb3VudChiZmQpCShjb2ZmX2RhdGEoYmZkKS0+cmF3X3N5bWVudF9jb3VudCkKLSNkZWZpbmUgb2JqX2NvbnZlcnQoYmZkKQkoY29mZl9kYXRhKGJmZCktPmNvbnZlcnNpb25fdGFibGUpCi0jZGVmaW5lIG9ial9jb252X3RhYmxlX3NpemUoYmZkKSAoY29mZl9kYXRhKGJmZCktPmNvbnZfdGFibGVfc2l6ZSkKLQotI2RlZmluZSBvYmpfY29mZl9leHRlcm5hbF9zeW1zKGJmZCkgKGNvZmZfZGF0YSAoYmZkKS0+ZXh0ZXJuYWxfc3ltcykKLSNkZWZpbmUgb2JqX2NvZmZfa2VlcF9zeW1zKGJmZCkJKGNvZmZfZGF0YSAoYmZkKS0+a2VlcF9zeW1zKQotI2RlZmluZSBvYmpfY29mZl9zdHJpbmdzKGJmZCkJKGNvZmZfZGF0YSAoYmZkKS0+c3RyaW5ncykKLSNkZWZpbmUgb2JqX2NvZmZfa2VlcF9zdHJpbmdzKGJmZCkgKGNvZmZfZGF0YSAoYmZkKS0+a2VlcF9zdHJpbmdzKQotI2RlZmluZSBvYmpfY29mZl9zeW1faGFzaGVzKGJmZCkgKGNvZmZfZGF0YSAoYmZkKS0+c3ltX2hhc2hlcykKLQotI2RlZmluZSBvYmpfY29mZl9sb2NhbF90b2NfdGFibGUoYmZkKSAoY29mZl9kYXRhKGJmZCktPmxvY2FsX3RvY19zeW1fbWFwKQotCi0vKiBgVGRhdGEnIGluZm9ybWF0aW9uIGtlcHQgZm9yIENPRkYgZmlsZXMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjb2ZmX3RkYXRhCi17Ci0gIHN0cnVjdCAgIGNvZmZfc3ltYm9sX3N0cnVjdCAqc3ltYm9sczsJLyogc3ltdGFiIGZvciBpbnB1dCBiZmQgKi8KLSAgdW5zaWduZWQgaW50ICpjb252ZXJzaW9uX3RhYmxlOwotICBpbnQgY29udl90YWJsZV9zaXplOwotICBmaWxlX3B0ciBzeW1fZmlsZXBvczsKLQotICBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpyYXdfc3ltZW50czsKLSAgdW5zaWduZWQgbG9uZyByYXdfc3ltZW50X2NvdW50OwotCi0gIC8qIFRoZXNlIGFyZSBvbmx5IHZhbGlkIG9uY2Ugd3JpdGluZyBoYXMgYmVndW4gKi8KLSAgbG9uZyBpbnQgcmVsb2NiYXNlOwotCi0gIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJyB1bmZvcnR1bmF0ZWx5IHZhcnkKLSAgICAgZnJvbSBjb2ZmIGltcGxlbWVudGF0aW9uIHRvIGltcGxlbWVudGF0aW9uLi4uICAqLwotICB1bnNpZ25lZCBsb2NhbF9uX2J0bWFzazsKLSAgdW5zaWduZWQgbG9jYWxfbl9idHNoZnQ7Ci0gIHVuc2lnbmVkIGxvY2FsX25fdG1hc2s7Ci0gIHVuc2lnbmVkIGxvY2FsX25fdHNoaWZ0OwotICB1bnNpZ25lZCBsb2NhbF9zeW1lc3o7Ci0gIHVuc2lnbmVkIGxvY2FsX2F1eGVzejsKLSAgdW5zaWduZWQgbG9jYWxfbGluZXN6OwotCi0gIC8qIFRoZSB1bnN3YXBwZWQgZXh0ZXJuYWwgc3ltYm9scy4gIE1heSBiZSBOVUxMLiAgUmVhZCBieQotICAgICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMuICAqLwotICBQVFIgZXh0ZXJuYWxfc3ltczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgZXh0ZXJuYWxfc3ltcyBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3N5bXM7Ci0KLSAgLyogVGhlIHN0cmluZyB0YWJsZS4gIE1heSBiZSBOVUxMLiAgUmVhZCBieQotICAgICBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUuICAqLwotICBjaGFyICpzdHJpbmdzOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBzdHJpbmdzIG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfc3RyaW5nczsKLQotICAvKiBpcyB0aGlzIGEgUEUgZm9ybWF0IGNvZmYgZmlsZSAqLwotICBpbnQgcGU7Ci0gIC8qIFVzZWQgYnkgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotCi0gIC8qIHVzZWQgYnkgdGhlIHBlIGxpbmtlciBmb3IgUG93ZXJQQyAqLwotICBpbnQgKmxvY2FsX3RvY19zeW1fbWFwOwotCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0KLSAgLyogVXNlZCBieSBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgUFRSIGxpbmVfaW5mbzsKLQotICAvKiBUaGUgdGltZXN0YW1wIGZyb20gdGhlIENPRkYgZmlsZSBoZWFkZXIuICAqLwotICBsb25nIHRpbWVzdGFtcDsKLQotICAvKiBDb3B5IG9mIHNvbWUgb2YgdGhlIGZfZmxhZ3MgYml0cyBpbiB0aGUgQ09GRiBmaWxlaGRyIHN0cnVjdHVyZSwKLSAgICAgdXNlZCBieSBBUk0gY29kZS4gICovCi0gIGZsYWd3b3JkIGZsYWdzOwotCi19IGNvZmZfZGF0YV90eXBlOwotCi0vKiBUZGF0YSBmb3IgcGUgaW1hZ2UgZmlsZXMuICovCi10eXBlZGVmIHN0cnVjdCBwZV90ZGF0YQotewotICBjb2ZmX2RhdGFfdHlwZSBjb2ZmOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZV9vcHRoZHI7Ci0gIGludCBkbGw7Ci0gIGludCBoYXNfcmVsb2Nfc2VjdGlvbjsKLSAgYm9vbGVhbiAoKmluX3JlbG9jX3ApIFBBUkFNUygoYmZkICosIHJlbG9jX2hvd3RvX3R5cGUgKikpOwotICBmbGFnd29yZCByZWFsX2ZsYWdzOwotfSBwZV9kYXRhX3R5cGU7Ci0KLSNkZWZpbmUgcGVfZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLnBlX29ial9kYXRhKQotCi0vKiBUZGF0YSBmb3IgWENPRkYgZmlsZXMuICAqLwotCi1zdHJ1Y3QgeGNvZmZfdGRhdGEKLXsKLSAgLyogQmFzaWMgQ09GRiBpbmZvcm1hdGlvbi4gICovCi0gIGNvZmZfZGF0YV90eXBlIGNvZmY7Ci0KLSAgLyogVHJ1ZSBpZiBhIGxhcmdlIGEub3V0IGhlYWRlciBzaG91bGQgYmUgZ2VuZXJhdGVkLiAgKi8KLSAgYm9vbGVhbiBmdWxsX2FvdXRoZHI7Ci0KLSAgLyogVE9DIHZhbHVlLiAgKi8KLSAgYmZkX3ZtYSB0b2M7Ci0KLSAgLyogSW5kZXggb2Ygc2VjdGlvbiBob2xkaW5nIFRPQy4gICovCi0gIGludCBzbnRvYzsKLQotICAvKiBJbmRleCBvZiBzZWN0aW9uIGhvbGRpbmcgZW50cnkgcG9pbnQuICAqLwotICBpbnQgc25lbnRyeTsKLQotICAvKiAudGV4dCBhbGlnbm1lbnQgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBpbnQgdGV4dF9hbGlnbl9wb3dlcjsKLQotICAvKiAuZGF0YSBhbGlnbm1lbnQgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBpbnQgZGF0YV9hbGlnbl9wb3dlcjsKLQotICAvKiBtb2R0eXBlIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgc2hvcnQgbW9kdHlwZTsKLQotICAvKiBjcHV0eXBlIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgc2hvcnQgY3B1dHlwZTsKLQotICAvKiBtYXhkYXRhIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBtYXhkYXRhOwotCi0gIC8qIG1heHN0YWNrIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBtYXhzdGFjazsKLQotICAvKiBVc2VkIGJ5IHRoZSBYQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0gIGFzZWN0aW9uICoqY3NlY3RzOwotICB1bnNpZ25lZCBsb25nICpkZWJ1Z19pbmRpY2VzOwotICB1bnNpZ25lZCBpbnQgaW1wb3J0X2ZpbGVfaWQ7Ci19OwotCi0jZGVmaW5lIHhjb2ZmX2RhdGEoYWJmZCkgKChhYmZkKS0+dGRhdGEueGNvZmZfb2JqX2RhdGEpCi0KLS8qIFdlIHRha2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBhc3ltYm9sIHRvIGVuc3VyZSB0aGF0IHRoZQotICogbWFjcm8gaXMgb25seSBldmVyIGFwcGxpZWQgdG8gYW4gYXN5bWJvbC4gICovCi0jZGVmaW5lIGNvZmZzeW1ib2woYXN5bWJvbCkgKChjb2ZmX3N5bWJvbF90eXBlICopKCYoKGFzeW1ib2wpLT50aGVfYmZkKSkpCi0KLS8qIFRoZSB1c2VkX2J5X2JmZCBmaWVsZCBvZiBhIHNlY3Rpb24gbWF5IGJlIHNldCB0byBhIHBvaW50ZXIgdG8gdGhpcwotICAgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YQotewotICAvKiBUaGUgcmVsb2NzLCBzd2FwcGVkIGludG8gQ09GRiBpbnRlcm5hbCBmb3JtLiAgVGhpcyBtYXkgYmUgTlVMTC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSByZWxvY3MgZW50cnkgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9yZWxvY3M7Ci0gIC8qIFRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgVGhpcyBtYXkgYmUgTlVMTC4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgY29udGVudHMgZW50cnkgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9jb250ZW50czsKLSAgLyogSW5mb3JtYXRpb24gY2FjaGVkIGJ5IGNvZmZfZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICBiZmRfdm1hIG9mZnNldDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNvbnN0IGNoYXIgKmZ1bmN0aW9uOwotICBpbnQgbGluZV9iYXNlOwotICAvKiBBIHBvaW50ZXIgdXNlZCBmb3IgLnN0YWIgbGlua2luZyBvcHRpbWl6YXRpb25zLiAgKi8KLSAgUFRSIHN0YWJfaW5mbzsKLSAgLyogQXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGJhY2tlbmRzLiAgKi8KLSAgUFRSIHRkYXRhOwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgY29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSAqKSAoc2VjKS0+dXNlZF9ieV9iZmQpCi0KLS8qIFRkYXRhIGZvciBzZWN0aW9ucyBpbiBYQ09GRiBmaWxlcy4gIFRoaXMgaXMgdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLQotc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVXNlZCBmb3IgWENPRkYgY3NlY3RzIGNyZWF0ZWQgYnkgdGhlIGxpbmtlcjsgcG9pbnRzIHRvIHRoZSByZWFsCi0gICAgIFhDT0ZGIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgdGhpcyBjc2VjdC4gICovCi0gIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0gIC8qIFRoZSBsaW5lbm9fY291bnQgZmllbGQgZm9yIHRoZSBlbmNsb3Npbmcgc2VjdGlvbiwgYmVjYXVzZSB3ZSBhcmUKLSAgICAgZ29pbmcgdG8gY2xvYmJlciBpdCB0aGVyZS4gICovCi0gIHVuc2lnbmVkIGludCBsaW5lbm9fY291bnQ7Ci0gIC8qIFRoZSBmaXJzdCBhbmQgb25lIHBhc3QgdGhlIGxhc3Qgc3ltYm9sIGluZGljZXMgZm9yIHN5bWJvbHMgdXNlZAotICAgICBieSB0aGlzIGNzZWN0LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaXJzdF9zeW1uZHg7Ci0gIHVuc2lnbmVkIGxvbmcgbGFzdF9zeW1uZHg7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyB0aGUgeGNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSB4Y29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEgKikgY29mZl9zZWN0aW9uX2RhdGEgKChhYmZkKSwgKHNlYykpLT50ZGF0YSkKLQotLyogVGRhdGEgZm9yIHNlY3Rpb25zIGluIFBFIGZpbGVzLiAgKi8KLQotc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhCi17Ci0gIC8qIFRoZSB2aXJ0dWFsIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLwotICBiZmRfc2l6ZV90eXBlIHZpcnRfc2l6ZTsKLSAgLyogVGhlIFBFIHNlY3Rpb24gZmxhZ3MuICAqLwotICBsb25nIHBlX2ZsYWdzOwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBwZWlfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBwZWlfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSAqKSBjb2ZmX3NlY3Rpb25fZGF0YSAoKGFiZmQpLCAoc2VjKSktPnRkYXRhKQotCi0vKiBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICBTZXQgdG8gLTEgaW5pdGlhbGx5LiAgU2V0IHRvIC0yIGlmCi0gICAgIHRoZXJlIGlzIGEgcmVsb2MgYWdhaW5zdCB0aGlzIHN5bWJvbC4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBTeW1ib2wgdHlwZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHR5cGU7Ci0KLSAgLyogU3ltYm9sIGNsYXNzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBjbGFzczsKLQotICAvKiBOdW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMuICAqLwotICBjaGFyIG51bWF1eDsKLQotICAvKiBCRkQgdG8gdGFrZSBhdXhpbGlhcnkgZW50cmllcyBmcm9tLiAgKi8KLSAgYmZkICphdXhiZmQ7Ci0KLSAgLyogUG9pbnRlciB0byBhcnJheSBvZiBhdXhpbGlhcnkgZW50cmllcywgaWYgYW55LiAgKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXg7Ci0KLSAgLyogRmxhZyB3b3JkOyBsZWdhbCB2YWx1ZXMgZm9sbG93LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgY29mZl9saW5rX2hhc2hfZmxhZ3M7Ci0gIC8qIFN5bWJvbCBpcyBhIFBFIHNlY3Rpb24gc3ltYm9sLiAgKi8KLSNkZWZpbmUgQ09GRl9MSU5LX0hBU0hfUEVfU0VDVElPTl9TWU1CT0wgKDAxKQotfTsKLQotLyogQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OwotICAvKiBBIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gdXNlZCB0byBsaW5rIHN0YWJzIGluIHNlY3Rpb25zLiAgKi8KLSAgUFRSIHN0YWJfaW5mbzsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpCVwKLSAgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLAkJXAotCQkJIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgY29mZl9oYXNoX3RhYmxlKHApICgoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBGdW5jdGlvbnMgaW4gY29mZmdlbi5jLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpjb2ZmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gc3RydWN0IHNlYyAqY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLWV4dGVybiBsb25nIGNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gaW50IGNvZmZfY291bnRfbGluZW51bWJlcnMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3QgY29mZl9zeW1ib2xfc3RydWN0ICpjb2ZmX3N5bWJvbF9mcm9tIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBib29sZWFuIGNvZmZfcmVudW1iZXJfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgaW50ICopKTsKLWV4dGVybiB2b2lkIGNvZmZfbWFuZ2xlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGNvZmZfd3JpdGVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl93cml0ZV9saW5lbnVtYmVycyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGFsZW50ICpjb2ZmX2dldF9saW5lbm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfc2VjdGlvbl9zeW1ib2wgUEFSQU1TICgoYmZkICosIGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIGNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHZvaWQgY29mZl9wcmludF9zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiBmaWxlcCwgYXN5bWJvbCAqLAotCQkJCSAgICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93KSk7Ci1leHRlcm4gdm9pZCBjb2ZmX2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotCQkJCQkgIHN5bWJvbF9pbmZvICpyZXQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSLAotCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcpKTsKLWV4dGVybiBib29sZWFuIGNvZmZfZmluZF9uZWFyZXN0X2xpbmUgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgICBhc2VjdGlvbiAqLAotCQkJCQkgICAgICAgYXN5bWJvbCAqKiwKLQkJCQkJICAgICAgIGJmZF92bWEgb2Zmc2V0LAotCQkJCQkgICAgICAgQ09OU1QgY2hhciAqKmZpbGVuYW1lX3B0ciwKLQkJCQkJICAgICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cikpOwotZXh0ZXJuIGludCBjb2ZmX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuIHJlbG9jKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotZXh0ZXJuIGJmZF9ieXRlICpiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiByZWxvY2F0ZWFibGUsIGFzeW1ib2wgKiopKTsKLWV4dGVybiBiZmRfdm1hIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIFBBUkFNUyAoKGFyZWxlbnQgKiwKLQkJCQkJCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCQkgICBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfcGVyZm9ybV9zbGlwIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHNsaXAsCi0JCQkJICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgYmZkX3ZtYSB2YWwpKTsKLQotLyogRnVuY3Rpb25zIGFuZCB0eXBlcyBpbiBjb2ZmbGluay5jLiAgKi8KLQotI2RlZmluZSBTVFJJTkdfU0laRV9TSVpFICg0KQotCi0vKiBXZSB1c2UgYSBoYXNoIHRhYmxlIHRvIG1lcmdlIGlkZW50aWNhbCBlbnVtLCBzdHJ1Y3QsIGFuZCB1bmlvbgotICAgZGVmaW5pdGlvbnMgaW4gdGhlIGxpbmtlci4gICovCi0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgc2luZ2xlIGVsZW1lbnQgKGFuIGVudW0gdmFsdWUsIGEKLSAgIHN0cnVjdHVyZSBvciB1bmlvbiBmaWVsZCkgaW4gdGhlIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50Ci17Ci0gIC8qIE5leHQgZWxlbWVudC4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQgKm5leHQ7Ci0KLSAgLyogTmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVHlwZS4gICovCi0gIHVuc2lnbmVkIGludCB0eXBlOwotCi0gIC8qIFN5bWJvbCBpbmRleCBmb3IgY29tcGxleCB0eXBlLiAgKi8KLSAgbG9uZyB0YWduZHg7Ci19OwotCi0vKiBBIGxpbmtlZCBsaXN0IG9mIGRlYnVnIG1lcmdlIGVudHJpZXMgZm9yIGEgZ2l2ZW4gbmFtZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUKLXsKLSAgLyogTmV4dCB0eXBlIHdpdGggdGhlIHNhbWUgbmFtZS4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUgKm5leHQ7Ci0KLSAgLyogQ2xhc3Mgb2YgdHlwZS4gICovCi0gIGludCBjbGFzczsKLQotICAvKiBTeW1ib2wgaW5kZXggd2hlcmUgdGhpcyB0eXBlIGlzIGRlZmluZWQuICAqLwotICBsb25nIGluZHg7Ci0KLSAgLyogTGlzdCBvZiBlbGVtZW50cy4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQgKmVsZW1lbnRzOwotfTsKLQotLyogSW5mb3JtYXRpb24gd2Ugc3RvcmUgaW4gdGhlIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIEEgbGlzdCBvZiB0eXBlcyB3aXRoIHRoaXMgbmFtZS4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUgKnR5cGVzOwotfTsKLQotLyogVGhlIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogSW5pdGlhbGl6ZSBhIENPRkYgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2luaXQodGFibGUpIFwKLSAgKGJmZF9oYXNoX3RhYmxlX2luaXQgKCYodGFibGUpLT5yb290LCBfYmZkX2NvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jKSkKLQotLyogRnJlZSBhIENPRkYgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUodGFibGUpIFwKLSAgKGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCYodGFibGUpLT5yb290KSkKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIENPRkYgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZWFjaCBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSB3aGVuIGRvaW5nCi0gICBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgKi8KLQotc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8KLXsKLSAgLyogVGhlIHJlbG9jcyB0byBiZSBvdXRwdXQuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgLyogRm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wgd2hvc2UgaW5kZXggd2FzIG5vdCBrbm93bgotICAgICB3aGVuIHRoZSByZWxvYyB3YXMgaGFuZGxlZCwgdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hlczsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHRoYXQgd2UgcGFzcyBhcm91bmQgd2hpbGUgZG9pbmcgdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLXN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbwotewotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogT3V0cHV0IEJGRC4gICovCi0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgLyogVXNlZCB0byBpbmRpY2F0ZSBmYWlsdXJlIGluIHRyYXZlcnNhbCByb3V0aW5lLiAgKi8KLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIC8qIElmIGRvaW5nICJ0YXNrIGxpbmtpbmciIHNldCBvbmx5IGR1cmluZyB0aGUgdGltZSB3aGVuIHdlIHdhbnQgdGhlCi0gICAgIGdsb2JhbCBzeW1ib2wgd3JpdGVyIHRvIGNvbnZlcnQgdGhlIHN0b3JhZ2UgY2xhc3Mgb2YgZGVmaW5lZCBnbG9iYWwKLSAgICAgc3ltYm9scyBmcm9tIGdsb2JhbCB0byBzdGF0aWMuICovCi0gIGJvb2xlYW4gZ2xvYmFsX3RvX3N0YXRpYzsKLSAgLyogSGFzaCB0YWJsZSBmb3IgbG9uZyBzeW1ib2wgbmFtZXMuICAqLwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJ0YWI7Ci0gIC8qIFdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgYW4gYXJyYXkgb2YgaW5mb3JtYXRpb24ga2VwdCBmb3IKLSAgICAgZWFjaCBvdXRwdXQgc2VjdGlvbiwgaW5kZXhlZCBieSB0aGUgdGFyZ2V0X2luZGV4IGZpZWxkLiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8gKnNlY3Rpb25faW5mbzsKLSAgLyogU3ltYm9sIGluZGV4IG9mIGxhc3QgQ19GSUxFIHN5bWJvbCAoLTEgaWYgbm9uZSkuICAqLwotICBsb25nIGxhc3RfZmlsZV9pbmRleDsKLSAgLyogQ29udGVudHMgb2YgbGFzdCBDX0ZJTEUgc3ltYm9sLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCBsYXN0X2ZpbGU7Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBmaXJzdCBhdXggZW50cnkgb2YgbGFzdCAuYmYgc3ltYm9sIHdpdGggYW4gZW1wdHkKLSAgICAgZW5kbmR4IGZpZWxkICgtMSBpZiBub25lKS4gICovCi0gIGxvbmcgbGFzdF9iZl9pbmRleDsKLSAgLyogQ29udGVudHMgb2YgbGFzdF9iZl9pbmRleCBhdXggZW50cnkuICAqLwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgbGFzdF9iZjsKLSAgLyogSGFzaCB0YWJsZSB1c2VkIHRvIG1lcmdlIGRlYnVnIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZSBkZWJ1Z19tZXJnZTsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHN3YXBwZWQgc3ltYm9scyBvZiBhbnkgaW5wdXQgZmlsZS4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmludGVybmFsX3N5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzZWN0aW9ucyBvZiBzeW1ib2xzIG9mIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgYXNlY3Rpb24gKipzZWNfcHRyczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG91dHB1dCBpbmRpY2VzIG9mIHN5bWJvbHMgb2YgYW55Ci0gICAgIGlucHV0IGZpbGUuICAqLwotICBsb25nICpzeW1faW5kaWNlczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG91dHB1dCBzeW1ib2xzIGZvciBhbnkgaW5wdXQgZmlsZS4gICovCi0gIGJmZF9ieXRlICpvdXRzeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgbGluZSBudW1iZXJzIGZvciBhbnkgaW5wdXQKLSAgICAgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpsaW5lbm9zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYW55IGlucHV0IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCByZWxvY3Mgb2YgYW55IGlucHV0IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc3dhcHBlZCByZWxvY3Mgb2YgYW55IGlucHV0IHNlY3Rpb24uICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLX07Ci0KLS8qIE1vc3QgQ09GRiB2YXJpYW50cyBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIGFsaWdubWVudCBvZiBhCi0gICBzZWN0aW9uLiAgVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBzZXQgYSBzcGVjaWZpYyBhbGlnbm1lbnQgYmFzZWQgb24KLSAgIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uLiAgKi8KLQotc3RydWN0IGNvZmZfc2VjdGlvbl9hbGlnbm1lbnRfZW50cnkKLXsKLSAgLyogVGhlIHNlY3Rpb24gbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhpcyBpcyBlaXRoZXIgKHVuc2lnbmVkIGludCkgLTEsIGluZGljYXRpbmcgdGhhdCB0aGUgc2VjdGlvbgotICAgICBuYW1lIG11c3QgbWF0Y2ggZXhhY3RseSwgb3IgaXQgaXMgdGhlIG51bWJlciBvZiBsZXR0ZXJzIHdoaWNoCi0gICAgIG11c3QgbWF0Y2ggYXQgdGhlIHN0YXJ0IG9mIHRoZSBuYW1lLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbXBhcmlzb25fbGVuZ3RoOwotCi0gIC8qIFRoZXNlIG1hY3JvcyBtYXkgYmUgdXNlZCB0byBmaWxsIGluIHRoZSBmaXJzdCB0d28gZmllbGRzIGluIGEKLSAgICAgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uLiAgKi8KLSNkZWZpbmUgQ09GRl9TRUNUSU9OX05BTUVfRVhBQ1RfTUFUQ0gobmFtZSkgKG5hbWUpLCAoKHVuc2lnbmVkIGludCkgLTEpCi0jZGVmaW5lIENPRkZfU0VDVElPTl9OQU1FX1BBUlRJQUxfTUFUQ0gobmFtZSkgKG5hbWUpLCAoc2l6ZW9mIChuYW1lKSAtIDEpCi0KLSAgLyogT25seSB1c2UgdGhpcyBlbnRyeSBpZiB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCBmb3IgdGhpcwotICAgICB0YXJnZXQgaXMgYXQgbGVhc3QgdGhhdCBtdWNoIChhcyBhIHBvd2VyIG9mIHR3bykuICBJZiB0aGlzIGZpZWxkCi0gICAgIGlzIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBpdCBzaG91bGQgYmUgaWdub3JlZC4gICovCi0gIHVuc2lnbmVkIGludCBkZWZhdWx0X2FsaWdubWVudF9taW47Ci0KLSAgLyogT25seSB1c2UgdGhpcyBlbnRyeSBpZiB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCBmb3IgdGhpcwotICAgICB0YXJnZXQgaXMgbm8gZ3JlYXRlciB0aGFuIHRoaXMgKGFzIGEgcG93ZXIgb2YgdHdvKS4gIElmIHRoaXMKLSAgICAgZmllbGQgaXMgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIGl0IHNob3VsZCBiZSBpZ25vcmVkLiAgKi8KLSAgdW5zaWduZWQgaW50IGRlZmF1bHRfYWxpZ25tZW50X21heDsKLQotI2RlZmluZSBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSAoKHVuc2lnbmVkIGludCkgLTEpCi0KLSAgLyogVGhlIGRlc2lyZWQgYWxpZ25tZW50IGZvciB0aGlzIHNlY3Rpb24gKGFzIGEgcG93ZXIgb2YgdHdvKS4gICovCi0gIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Ci19OwotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBib29sZWFuLCBiZmRfYnl0ZSAqLCBib29sZWFuLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2NvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bQotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzCi0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZAotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0KLSNkZWZpbmUgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLS8qIEZ1bmN0aW9ucyBpbiB4Y29mZmxpbmsuYy4gICovCi0KLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotCi0vKiBGdW5jdGlvbnMgaW4gY29mZi1wcGMuYy4gIEZJWE1FOiBUaGVzZSBhcmUgY2FsbGVkIGJlIHBlLmVtIGluIHRoZQotICAgbGlua2VyLCBhbmQgc28gc2hvdWxkIHN0YXJ0IHdpdGggYmZkIGFuZCBiZSBkZWNsYXJlZCBpbiBiZmQuaC4gICovCi0KLWV4dGVybiBib29sZWFuIHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBBbmQgbW9yZSB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgLi4gKi8KLQpkaWZmIC0tZ2l0IGEvYmZkL2xpYmNvZmYuaCBiL2JmZC9saWJjb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZTRjZTkuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmNvZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1MyArMCwwIEBACi0vKiBCRkQgQ09GRiBvYmplY3QgZmlsZSBwcml2YXRlIHN0cnVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGxpYmNvZmYuaCBpcyBhIEdFTkVSQVRFRCBmaWxlLiAgRG9uJ3QgY2hhbmdlIGl0OyBpbnN0ZWFkLAotKiogY2hhbmdlIGxpYmNvZmYtaW4uaCBvciBjb2ZmY29kZS5oLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qIE9iamVjdCBmaWxlIHRkYXRhOyBhY2Nlc3MgbWFjcm9zICovCi0KLSNkZWZpbmUgY29mZl9kYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEuY29mZl9vYmpfZGF0YSkKLSNkZWZpbmUgZXhlY19oZHIoYmZkKQkJKGNvZmZfZGF0YShiZmQpLT5oZHIpCi0jZGVmaW5lIG9ial9wZShiZmQpICAgICAgICAgICAgIChjb2ZmX2RhdGEoYmZkKS0+cGUpCi0jZGVmaW5lIG9ial9zeW1ib2xzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1ib2xzKQotI2RlZmluZQlvYmpfc3ltX2ZpbGVwb3MoYmZkKQkoY29mZl9kYXRhKGJmZCktPnN5bV9maWxlcG9zKQotCi0jZGVmaW5lIG9ial9yZWxvY2Jhc2UoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJlbG9jYmFzZSkKLSNkZWZpbmUgb2JqX3Jhd19zeW1lbnRzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50cykKLSNkZWZpbmUgb2JqX3Jhd19zeW1lbnRfY291bnQoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJhd19zeW1lbnRfY291bnQpCi0jZGVmaW5lIG9ial9jb252ZXJ0KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5jb252ZXJzaW9uX3RhYmxlKQotI2RlZmluZSBvYmpfY29udl90YWJsZV9zaXplKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5jb252X3RhYmxlX3NpemUpCi0KLSNkZWZpbmUgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmV4dGVybmFsX3N5bXMpCi0jZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3ltcyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3ltcykKLSNkZWZpbmUgb2JqX2NvZmZfc3RyaW5ncyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPnN0cmluZ3MpCi0jZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3RyaW5ncyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3RyaW5ncykKLSNkZWZpbmUgb2JqX2NvZmZfc3ltX2hhc2hlcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPnN5bV9oYXNoZXMpCi0KLSNkZWZpbmUgb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5sb2NhbF90b2Nfc3ltX21hcCkKLQotLyogYFRkYXRhJyBpbmZvcm1hdGlvbiBrZXB0IGZvciBDT0ZGIGZpbGVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY29mZl90ZGF0YQotewotICBzdHJ1Y3QgICBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKnN5bWJvbHM7CS8qIHN5bXRhYiBmb3IgaW5wdXQgYmZkICovCi0gIHVuc2lnbmVkIGludCAqY29udmVyc2lvbl90YWJsZTsKLSAgaW50IGNvbnZfdGFibGVfc2l6ZTsKLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0KLSAgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcmF3X3N5bWVudHM7Ci0gIHVuc2lnbmVkIGxvbmcgcmF3X3N5bWVudF9jb3VudDsKLQotICAvKiBUaGVzZSBhcmUgb25seSB2YWxpZCBvbmNlIHdyaXRpbmcgaGFzIGJlZ3VuICovCi0gIGxvbmcgaW50IHJlbG9jYmFzZTsKLQotICAvKiBUaGVzZSBtZW1iZXJzIGNvbW11bmljYXRlIGltcG9ydGFudCBjb25zdGFudHMgYWJvdXQgdGhlIHN5bWJvbCB0YWJsZQotICAgICB0byBHREIncyBzeW1ib2wtcmVhZGluZyBjb2RlLiAgVGhlc2UgYGNvbnN0YW50cycgdW5mb3J0dW5hdGVseSB2YXJ5Ci0gICAgIGZyb20gY29mZiBpbXBsZW1lbnRhdGlvbiB0byBpbXBsZW1lbnRhdGlvbi4uLiAgKi8KLSAgdW5zaWduZWQgbG9jYWxfbl9idG1hc2s7Ci0gIHVuc2lnbmVkIGxvY2FsX25fYnRzaGZ0OwotICB1bnNpZ25lZCBsb2NhbF9uX3RtYXNrOwotICB1bnNpZ25lZCBsb2NhbF9uX3RzaGlmdDsKLSAgdW5zaWduZWQgbG9jYWxfc3ltZXN6OwotICB1bnNpZ25lZCBsb2NhbF9hdXhlc3o7Ci0gIHVuc2lnbmVkIGxvY2FsX2xpbmVzejsKLQotICAvKiBUaGUgdW5zd2FwcGVkIGV4dGVybmFsIHN5bWJvbHMuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKLSAgICAgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzLiAgKi8KLSAgUFRSIGV4dGVybmFsX3N5bXM7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGV4dGVybmFsX3N5bXMgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9zeW1zOwotCi0gIC8qIFRoZSBzdHJpbmcgdGFibGUuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKLSAgICAgX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLiAgKi8KLSAgY2hhciAqc3RyaW5nczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgc3RyaW5ncyBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3N0cmluZ3M7Ci0KLSAgLyogaXMgdGhpcyBhIFBFIGZvcm1hdCBjb2ZmIGZpbGUgKi8KLSAgaW50IHBlOwotICAvKiBVc2VkIGJ5IHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiB1c2VkIGJ5IHRoZSBwZSBsaW5rZXIgZm9yIFBvd2VyUEMgKi8KLSAgaW50ICpsb2NhbF90b2Nfc3ltX21hcDsKLQotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotCi0gIC8qIFVzZWQgYnkgY29mZl9maW5kX25lYXJlc3RfbGluZS4gICovCi0gIFBUUiBsaW5lX2luZm87Ci0KLSAgLyogVGhlIHRpbWVzdGFtcCBmcm9tIHRoZSBDT0ZGIGZpbGUgaGVhZGVyLiAgKi8KLSAgbG9uZyB0aW1lc3RhbXA7Ci0KLSAgLyogQ29weSBvZiBzb21lIG9mIHRoZSBmX2ZsYWdzIGJpdHMgaW4gdGhlIENPRkYgZmlsZWhkciBzdHJ1Y3R1cmUsCi0gICAgIHVzZWQgYnkgQVJNIGNvZGUuICAqLwotICBmbGFnd29yZCBmbGFnczsKLQotfSBjb2ZmX2RhdGFfdHlwZTsKLQotLyogVGRhdGEgZm9yIHBlIGltYWdlIGZpbGVzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgcGVfdGRhdGEKLXsKLSAgY29mZl9kYXRhX3R5cGUgY29mZjsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgcGVfb3B0aGRyOwotICBpbnQgZGxsOwotICBpbnQgaGFzX3JlbG9jX3NlY3Rpb247Ci0gIGJvb2xlYW4gKCppbl9yZWxvY19wKSBQQVJBTVMoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICopKTsKLSAgZmxhZ3dvcmQgcmVhbF9mbGFnczsKLX0gcGVfZGF0YV90eXBlOwotCi0jZGVmaW5lIHBlX2RhdGEoYmZkKQkJKChiZmQpLT50ZGF0YS5wZV9vYmpfZGF0YSkKLQotLyogVGRhdGEgZm9yIFhDT0ZGIGZpbGVzLiAgKi8KLQotc3RydWN0IHhjb2ZmX3RkYXRhCi17Ci0gIC8qIEJhc2ljIENPRkYgaW5mb3JtYXRpb24uICAqLwotICBjb2ZmX2RhdGFfdHlwZSBjb2ZmOwotCi0gIC8qIFRydWUgaWYgYSBsYXJnZSBhLm91dCBoZWFkZXIgc2hvdWxkIGJlIGdlbmVyYXRlZC4gICovCi0gIGJvb2xlYW4gZnVsbF9hb3V0aGRyOwotCi0gIC8qIFRPQyB2YWx1ZS4gICovCi0gIGJmZF92bWEgdG9jOwotCi0gIC8qIEluZGV4IG9mIHNlY3Rpb24gaG9sZGluZyBUT0MuICAqLwotICBpbnQgc250b2M7Ci0KLSAgLyogSW5kZXggb2Ygc2VjdGlvbiBob2xkaW5nIGVudHJ5IHBvaW50LiAgKi8KLSAgaW50IHNuZW50cnk7Ci0KLSAgLyogLnRleHQgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgaW50IHRleHRfYWxpZ25fcG93ZXI7Ci0KLSAgLyogLmRhdGEgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgaW50IGRhdGFfYWxpZ25fcG93ZXI7Ci0KLSAgLyogbW9kdHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIHNob3J0IG1vZHR5cGU7Ci0KLSAgLyogY3B1dHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIHNob3J0IGNwdXR5cGU7Ci0KLSAgLyogbWF4ZGF0YSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgbWF4ZGF0YTsKLQotICAvKiBtYXhzdGFjayBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgbWF4c3RhY2s7Ci0KLSAgLyogVXNlZCBieSB0aGUgWENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotICBhc2VjdGlvbiAqKmNzZWN0czsKLSAgdW5zaWduZWQgbG9uZyAqZGVidWdfaW5kaWNlczsKLSAgdW5zaWduZWQgaW50IGltcG9ydF9maWxlX2lkOwotfTsKLQotI2RlZmluZSB4Y29mZl9kYXRhKGFiZmQpICgoYWJmZCktPnRkYXRhLnhjb2ZmX29ial9kYXRhKQotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgYXN5bWJvbCB0byBlbnN1cmUgdGhhdCB0aGUKLSAqIG1hY3JvIGlzIG9ubHkgZXZlciBhcHBsaWVkIHRvIGFuIGFzeW1ib2wuICAqLwotI2RlZmluZSBjb2Zmc3ltYm9sKGFzeW1ib2wpICgoY29mZl9zeW1ib2xfdHlwZSAqKSgmKChhc3ltYm9sKS0+dGhlX2JmZCkpKQotCi0vKiBUaGUgdXNlZF9ieV9iZmQgZmllbGQgb2YgYSBzZWN0aW9uIG1heSBiZSBzZXQgdG8gYSBwb2ludGVyIHRvIHRoaXMKLSAgIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHJlbG9jcywgc3dhcHBlZCBpbnRvIENPRkYgaW50ZXJuYWwgZm9ybS4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgcmVsb2NzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfcmVsb2NzOwotICAvKiBUaGUgc2VjdGlvbiBjb250ZW50cy4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGNvbnRlbnRzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfY29udGVudHM7Ci0gIC8qIEluZm9ybWF0aW9uIGNhY2hlZCBieSBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICBjb25zdCBjaGFyICpmdW5jdGlvbjsKLSAgaW50IGxpbmVfYmFzZTsKLSAgLyogQSBwb2ludGVyIHVzZWQgZm9yIC5zdGFiIGxpbmtpbmcgb3B0aW1pemF0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci0gIC8qIEF2YWlsYWJsZSBmb3IgaW5kaXZpZHVhbCBiYWNrZW5kcy4gICovCi0gIFBUUiB0ZGF0YTsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKikgKHNlYyktPnVzZWRfYnlfYmZkKQotCi0vKiBUZGF0YSBmb3Igc2VjdGlvbnMgaW4gWENPRkYgZmlsZXMuICBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0KLXN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhCi17Ci0gIC8qIFVzZWQgZm9yIFhDT0ZGIGNzZWN0cyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXI7IHBvaW50cyB0byB0aGUgcmVhbAotICAgICBYQ09GRiBzZWN0aW9uIHdoaWNoIGNvbnRhaW5zIHRoaXMgY3NlY3QuICAqLwotICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotICAvKiBUaGUgbGluZW5vX2NvdW50IGZpZWxkIGZvciB0aGUgZW5jbG9zaW5nIHNlY3Rpb24sIGJlY2F1c2Ugd2UgYXJlCi0gICAgIGdvaW5nIHRvIGNsb2JiZXIgaXQgdGhlcmUuICAqLwotICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OwotICAvKiBUaGUgZmlyc3QgYW5kIG9uZSBwYXN0IHRoZSBsYXN0IHN5bWJvbCBpbmRpY2VzIGZvciBzeW1ib2xzIHVzZWQKLSAgICAgYnkgdGhpcyBjc2VjdC4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlyc3Rfc3ltbmR4OwotICB1bnNpZ25lZCBsb25nIGxhc3Rfc3ltbmR4OwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gdGhlIHhjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgeGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCi0KLS8qIFRkYXRhIGZvciBzZWN0aW9ucyBpbiBQRSBmaWxlcy4gICovCi0KLXN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YQotewotICAvKiBUaGUgdmlydHVhbCBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSB2aXJ0X3NpemU7Ci0gIC8qIFRoZSBQRSBzZWN0aW9uIGZsYWdzLiAgKi8KLSAgbG9uZyBwZV9mbGFnczsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgcGVpX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgcGVpX3NlY3Rpb25fZGF0YShhYmZkLCBzZWMpIFwKLSAgKChzdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEgKikgY29mZl9zZWN0aW9uX2RhdGEgKChhYmZkKSwgKHNlYykpLT50ZGF0YSkKLQotLyogQ09GRiBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgU2V0IHRvIC0xIGluaXRpYWxseS4gIFNldCB0byAtMiBpZgotICAgICB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgdGhpcyBzeW1ib2wuICAqLwotICBsb25nIGluZHg7Ci0KLSAgLyogU3ltYm9sIHR5cGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB0eXBlOwotCi0gIC8qIFN5bWJvbCBjbGFzcy4gICovCi0gIHVuc2lnbmVkIGNoYXIgY2xhc3M7Ci0KLSAgLyogTnVtYmVyIG9mIGF1eGlsaWFyeSBlbnRyaWVzLiAgKi8KLSAgY2hhciBudW1hdXg7Ci0KLSAgLyogQkZEIHRvIHRha2UgYXV4aWxpYXJ5IGVudHJpZXMgZnJvbS4gICovCi0gIGJmZCAqYXV4YmZkOwotCi0gIC8qIFBvaW50ZXIgdG8gYXJyYXkgb2YgYXV4aWxpYXJ5IGVudHJpZXMsIGlmIGFueS4gICovCi0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4OwotCi0gIC8qIEZsYWcgd29yZDsgbGVnYWwgdmFsdWVzIGZvbGxvdy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGNvZmZfbGlua19oYXNoX2ZsYWdzOwotICAvKiBTeW1ib2wgaXMgYSBQRSBzZWN0aW9uIHN5bWJvbC4gICovCi0jZGVmaW5lIENPRkZfTElOS19IQVNIX1BFX1NFQ1RJT05fU1lNQk9MICgwMSkKLX07Ci0KLS8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLSAgLyogQSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHVzZWQgdG8gbGluayBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGNvZmZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogRnVuY3Rpb25zIGluIGNvZmZnZW4uYy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqY29mZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBzZWMgKmNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIGNvZmZfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGludCBjb2ZmX2NvdW50X2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdCAqY29mZl9zeW1ib2xfZnJvbSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIGludCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX21hbmdsZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGNvZmZfd3JpdGVfbGluZW51bWJlcnMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBhbGVudCAqY29mZl9nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX3NlY3Rpb25fc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKmNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIGNvZmZfcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIgZmlsZXAsIGFzeW1ib2wgKiwKLQkJCQkgICAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdykpOwotZXh0ZXJuIHZvaWQgY29mZl9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICBzeW1ib2xfaW5mbyAqcmV0KSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgICAgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgIGFzeW1ib2wgKiosCi0JCQkJCSAgICAgICBiZmRfdm1hIG9mZnNldCwKLQkJCQkJICAgICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHIsCi0JCQkJCSAgICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHIpKTsKLWV4dGVybiBpbnQgY29mZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiByZWxvYykpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLWV4dGVybiBiZmRfYnl0ZSAqYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotCSAgIGJmZF9ieXRlICosIGJvb2xlYW4gcmVsb2NhdGVhYmxlLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gYmZkX3ZtYSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSBQQVJBTVMgKChhcmVsZW50ICosCi0JCQkJCQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJICAgYXNlY3Rpb24gKikpOwotZXh0ZXJuIHZvaWQgYmZkX3BlcmZvcm1fc2xpcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCBzbGlwLAotCQkJCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIGJmZF92bWEgdmFsKSk7Ci0KLS8qIEZ1bmN0aW9ucyBhbmQgdHlwZXMgaW4gY29mZmxpbmsuYy4gICovCi0KLSNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKLQotLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB0byBtZXJnZSBpZGVudGljYWwgZW51bSwgc3RydWN0LCBhbmQgdW5pb24KLSAgIGRlZmluaXRpb25zIGluIHRoZSBsaW5rZXIuICAqLwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhIHNpbmdsZSBlbGVtZW50IChhbiBlbnVtIHZhbHVlLCBhCi0gICBzdHJ1Y3R1cmUgb3IgdW5pb24gZmllbGQpIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudAotewotICAvKiBOZXh0IGVsZW1lbnQuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICpuZXh0OwotCi0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLQotICAvKiBTeW1ib2wgaW5kZXggZm9yIGNvbXBsZXggdHlwZS4gICovCi0gIGxvbmcgdGFnbmR4OwotfTsKLQotLyogQSBsaW5rZWQgbGlzdCBvZiBkZWJ1ZyBtZXJnZSBlbnRyaWVzIGZvciBhIGdpdmVuIG5hbWUuICAqLwotCi1zdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlCi17Ci0gIC8qIE5leHQgdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICpuZXh0OwotCi0gIC8qIENsYXNzIG9mIHR5cGUuICAqLwotICBpbnQgY2xhc3M7Ci0KLSAgLyogU3ltYm9sIGluZGV4IHdoZXJlIHRoaXMgdHlwZSBpcyBkZWZpbmVkLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIExpc3Qgb2YgZWxlbWVudHMuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICplbGVtZW50czsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIHN0b3JlIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBBIGxpc3Qgb2YgdHlwZXMgd2l0aCB0aGlzIG5hbWUuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICp0eXBlczsKLX07Ci0KLS8qIFRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIEluaXRpYWxpemUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0KHRhYmxlKSBcCi0gIChiZmRfaGFzaF90YWJsZV9pbml0ICgmKHRhYmxlKS0+cm9vdCwgX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYykpCi0KLS8qIEZyZWUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlKHRhYmxlKSBcCi0gIChiZmRfaGFzaF90YWJsZV9mcmVlICgmKHRhYmxlKS0+cm9vdCkpCi0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgd2hlbiBkb2luZwotICAgYSByZWxvY2F0ZWFibGUgbGluay4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvCi17Ci0gIC8qIFRoZSByZWxvY3MgdG8gYmUgb3V0cHV0LiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gIC8qIEZvciBlYWNoIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHdob3NlIGluZGV4IHdhcyBub3Qga25vd24KLSAgICAgd2hlbiB0aGUgcmVsb2Mgd2FzIGhhbmRsZWQsIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB0aGF0IHdlIHBhc3MgYXJvdW5kIHdoaWxlIGRvaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLwotCi1zdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIFVzZWQgdG8gaW5kaWNhdGUgZmFpbHVyZSBpbiB0cmF2ZXJzYWwgcm91dGluZS4gICovCi0gIGJvb2xlYW4gZmFpbGVkOwotICAvKiBJZiBkb2luZyAidGFzayBsaW5raW5nIiBzZXQgb25seSBkdXJpbmcgdGhlIHRpbWUgd2hlbiB3ZSB3YW50IHRoZQotICAgICBnbG9iYWwgc3ltYm9sIHdyaXRlciB0byBjb252ZXJ0IHRoZSBzdG9yYWdlIGNsYXNzIG9mIGRlZmluZWQgZ2xvYmFsCi0gICAgIHN5bWJvbHMgZnJvbSBnbG9iYWwgdG8gc3RhdGljLiAqLwotICBib29sZWFuIGdsb2JhbF90b19zdGF0aWM7Ci0gIC8qIEhhc2ggdGFibGUgZm9yIGxvbmcgc3ltYm9sIG5hbWVzLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotICAvKiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuIGFycmF5IG9mIGluZm9ybWF0aW9uIGtlcHQgZm9yCi0gICAgIGVhY2ggb3V0cHV0IHNlY3Rpb24sIGluZGV4ZWQgYnkgdGhlIHRhcmdldF9pbmRleCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzZWN0aW9uX2luZm87Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBsYXN0IENfRklMRSBzeW1ib2wgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2ZpbGVfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3QgQ19GSUxFIHN5bWJvbC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgbGFzdF9maWxlOwotICAvKiBTeW1ib2wgaW5kZXggb2YgZmlyc3QgYXV4IGVudHJ5IG9mIGxhc3QgLmJmIHN5bWJvbCB3aXRoIGFuIGVtcHR5Ci0gICAgIGVuZG5keCBmaWVsZCAoLTEgaWYgbm9uZSkuICAqLwotICBsb25nIGxhc3RfYmZfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3RfYmZfaW5kZXggYXV4IGVudHJ5LiAgKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGxhc3RfYmY7Ci0gIC8qIEhhc2ggdGFibGUgdXNlZCB0byBtZXJnZSBkZWJ1ZyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUgZGVidWdfbWVyZ2U7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc2VjdGlvbnMgb2Ygc3ltYm9scyBvZiBhbnkgaW5wdXQgZmlsZS4gICovCi0gIGFzZWN0aW9uICoqc2VjX3B0cnM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgaW5kaWNlcyBvZiBzeW1ib2xzIG9mIGFueQotICAgICBpbnB1dCBmaWxlLiAgKi8KLSAgbG9uZyAqc3ltX2luZGljZXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgc3ltYm9scyBmb3IgYW55IGlucHV0IGZpbGUuICAqLwotICBiZmRfYnl0ZSAqb3V0c3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIGxpbmUgbnVtYmVycyBmb3IgYW55IGlucHV0Ci0gICAgIHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqbGluZW5vczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHN3YXBwZWQgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci19OwotCi0vKiBNb3N0IENPRkYgdmFyaWFudHMgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBhbGlnbm1lbnQgb2YgYQotICAgc2VjdGlvbi4gIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gc2V0IGEgc3BlY2lmaWMgYWxpZ25tZW50IGJhc2VkIG9uCi0gICB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBjb2ZmX3NlY3Rpb25fYWxpZ25tZW50X2VudHJ5Ci17Ci0gIC8qIFRoZSBzZWN0aW9uIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoaXMgaXMgZWl0aGVyICh1bnNpZ25lZCBpbnQpIC0xLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHNlY3Rpb24KLSAgICAgbmFtZSBtdXN0IG1hdGNoIGV4YWN0bHksIG9yIGl0IGlzIHRoZSBudW1iZXIgb2YgbGV0dGVycyB3aGljaAotICAgICBtdXN0IG1hdGNoIGF0IHRoZSBzdGFydCBvZiB0aGUgbmFtZS4gICovCi0gIHVuc2lnbmVkIGludCBjb21wYXJpc29uX2xlbmd0aDsKLQotICAvKiBUaGVzZSBtYWNyb3MgbWF5IGJlIHVzZWQgdG8gZmlsbCBpbiB0aGUgZmlyc3QgdHdvIGZpZWxkcyBpbiBhCi0gICAgIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbi4gICovCi0jZGVmaW5lIENPRkZfU0VDVElPTl9OQU1FX0VYQUNUX01BVENIKG5hbWUpIChuYW1lKSwgKCh1bnNpZ25lZCBpbnQpIC0xKQotI2RlZmluZSBDT0ZGX1NFQ1RJT05fTkFNRV9QQVJUSUFMX01BVENIKG5hbWUpIChuYW1lKSwgKHNpemVvZiAobmFtZSkgLSAxKQotCi0gIC8qIE9ubHkgdXNlIHRoaXMgZW50cnkgaWYgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgZm9yIHRoaXMKLSAgICAgdGFyZ2V0IGlzIGF0IGxlYXN0IHRoYXQgbXVjaCAoYXMgYSBwb3dlciBvZiB0d28pLiAgSWYgdGhpcyBmaWVsZAotICAgICBpcyBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgaXQgc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9hbGlnbm1lbnRfbWluOwotCi0gIC8qIE9ubHkgdXNlIHRoaXMgZW50cnkgaWYgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgZm9yIHRoaXMKLSAgICAgdGFyZ2V0IGlzIG5vIGdyZWF0ZXIgdGhhbiB0aGlzIChhcyBhIHBvd2VyIG9mIHR3bykuICBJZiB0aGlzCi0gICAgIGZpZWxkIGlzIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBpdCBzaG91bGQgYmUgaWdub3JlZC4gICovCi0gIHVuc2lnbmVkIGludCBkZWZhdWx0X2FsaWdubWVudF9tYXg7Ci0KLSNkZWZpbmUgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFkgKCh1bnNpZ25lZCBpbnQpIC0xKQotCi0gIC8qIFRoZSBkZXNpcmVkIGFsaWdubWVudCBmb3IgdGhpcyBzZWN0aW9uIChhcyBhIHBvd2VyIG9mIHR3bykuICAqLwotICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKl9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYm9vbGVhbiwgYmZkX2J5dGUgKiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0KLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscwotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotCi0jZGVmaW5lIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0vKiBGdW5jdGlvbnMgaW4geGNvZmZsaW5rLmMuICAqLwotCi1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotLyogRnVuY3Rpb25zIGluIGNvZmYtcHBjLmMuICBGSVhNRTogVGhlc2UgYXJlIGNhbGxlZCBiZSBwZS5lbSBpbiB0aGUKLSAgIGxpbmtlciwgYW5kIHNvIHNob3VsZCBzdGFydCB3aXRoIGJmZCBhbmQgYmUgZGVjbGFyZWQgaW4gYmZkLmguICAqLwotCi1leHRlcm4gYm9vbGVhbiBwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gcHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQW5kIG1vcmUgdGFrZW4gZnJvbSB0aGUgc291cmNlIC4uICovCi0KLXR5cGVkZWYgc3RydWN0IGNvZmZfcHRyX3N0cnVjdAotewotCi0gICAgICAgIC8qIFJlbWVtYmVycyB0aGUgb2Zmc2V0IGZyb20gdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGUgZmlsZSBmb3IKLSAgICAgICAgICB0aGlzIHN5bWJvbC4gR2VuZXJhdGVkIGJ5IGNvZmZfcmVudW1iZXJfc3ltYm9scy4gKi8KLXVuc2lnbmVkIGludCBvZmZzZXQ7Ci0KLSAgICAgICAgLyogU2hvdWxkIHRoZSB2YWx1ZSBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLiAgVXNlZCBmb3IKLSAgICAgICAgICBYQ09GRiBDX0JTVEFUIHN5bWJvbHMuICBTZXQgYnkgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuICAqLwotdW5zaWduZWQgaW50IGZpeF92YWx1ZSA6IDE7Ci0KLSAgICAgICAgLyogU2hvdWxkIHRoZSB0YWcgZmllbGQgb2YgdGhpcyBzeW1ib2wgYmUgcmVudW1iZXJlZC4KLSAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICovCi11bnNpZ25lZCBpbnQgZml4X3RhZyA6IDE7Ci0KLSAgICAgICAgLyogU2hvdWxkIHRoZSBlbmRpZHggZmllbGQgb2YgdGhpcyBzeW1ib2wgYmUgcmVudW1iZXJlZC4KLSAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICovCi11bnNpZ25lZCBpbnQgZml4X2VuZCA6IDE7Ci0KLSAgICAgICAgLyogU2hvdWxkIHRoZSB4X2NzZWN0Lnhfc2NubGVuIGZpZWxkIGJlIHJlbnVtYmVyZWQuCi0gICAgICAgICAgQ3JlYXRlZCBieSBjb2ZmX3BvaW50ZXJpemVfYXV4LiAqLwotdW5zaWduZWQgaW50IGZpeF9zY25sZW4gOiAxOwotCi0gICAgICAgIC8qIEZpeCB1cCBhbiBYQ09GRiBDX0JJTkNML0NfRUlOQ0wgc3ltYm9sLiAgVGhlIHZhbHVlIGlzIHRoZQotICAgICAgICAgIGluZGV4IGludG8gdGhlIGxpbmUgbnVtYmVyIGVudHJpZXMuICBTZXQgYnkKLSAgICAgICAgICBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICovCi11bnNpZ25lZCBpbnQgZml4X2xpbmUgOiAxOwotCi0gICAgICAgIC8qIFRoZSBjb250YWluZXIgZm9yIHRoZSBzeW1ib2wgc3RydWN0dXJlIGFzIHJlYWQgYW5kIHRyYW5zbGF0ZWQKLSAgICAgICAgICAgZnJvbSB0aGUgZmlsZS4gKi8KLQotdW5pb24gewotICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eGVudDsKLSAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltZW50OwotIH0gdTsKLX0gY29tYmluZWRfZW50cnlfdHlwZTsKLQotCi0gLyogRWFjaCBjYW5vbmljYWwgYXN5bWJvbCByZWFsbHkgbG9va3MgbGlrZSB0aGlzOiAqLwotCi10eXBlZGVmIHN0cnVjdCBjb2ZmX3N5bWJvbF9zdHJ1Y3QKLXsKLSAgICAvKiBUaGUgYWN0dWFsIHN5bWJvbCB3aGljaCB0aGUgcmVzdCBvZiBCRkQgd29ya3Mgd2l0aCAqLwotYXN5bWJvbCBzeW1ib2w7Ci0KLSAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIGhpZGRlbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzeW1ib2wgKi8KLWNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKLQotICAgIC8qIEEgcG9pbnRlciB0byB0aGUgbGluZW51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzeW1ib2wgKi8KLXN0cnVjdCBsaW5lbm9fY2FjaGVfZW50cnkgKmxpbmVubzsKLQotICAgIC8qIEhhdmUgdGhlIGxpbmUgbnVtYmVycyBiZWVuIHJlbG9jYXRlZCB5ZXQgPyAqLwotYm9vbGVhbiBkb25lX2xpbmVubzsKLX0gY29mZl9zeW1ib2xfdHlwZTsKLSAvKiBDT0ZGIHN5bWJvbCBjbGFzc2lmaWNhdGlvbnMuICAqLwotCi1lbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uCi17Ci0gICAvKiBHbG9iYWwgc3ltYm9sLiAgKi8KLSAgQ09GRl9TWU1CT0xfR0xPQkFMLAotICAgLyogQ29tbW9uIHN5bWJvbC4gICovCi0gIENPRkZfU1lNQk9MX0NPTU1PTiwKLSAgIC8qIFVuZGVmaW5lZCBzeW1ib2wuICAqLwotICBDT0ZGX1NZTUJPTF9VTkRFRklORUQsCi0gICAvKiBMb2NhbCBzeW1ib2wuICAqLwotICBDT0ZGX1NZTUJPTF9MT0NBTCwKLSAgIC8qIFBFIHNlY3Rpb24gc3ltYm9sLiAgKi8KLSAgQ09GRl9TWU1CT0xfUEVfU0VDVElPTgotfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdm9pZCAoKl9iZmRfY29mZl9zd2FwX2F1eF9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKLSAgICAgICBpbnQgICAgICAgICAgICAgdHlwZSwKLSAgICAgICBpbnQgICAgICAgICAgICAgY2xhc3MsCi0gICAgICAgaW50ICAgICAgICAgICAgIGluZGF1eCwKLSAgICAgICBpbnQgICAgICAgICAgICAgbnVtYXV4LAotICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOwotCi0gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9zeW1faW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgICAgICAgICphYmZkICwKLSAgICAgICBQVFIgICAgICAgICAgICAgZXh0LAotICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOwotCi0gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9faW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgICAgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgICAgICAgIGV4dCwKLSAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2F1eF9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBpbnQgICAgIHR5cGUsCi0gICAgICAgaW50ICAgICBjbGFzcywKLSAgICAgICBpbnQgICAgIGluZGF1eCwKLSAgICAgICBpbnQgICAgIG51bWF1eCwKLSAgICAgICBQVFIgICAgIGV4dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfc3ltX291dCkgUEFSQU1TICgoCi0gICAgICBiZmQgICAgICAqYWJmZCwKLSAgICAgIFBUUiAgICAgIGluLAotICAgICAgUFRSICAgICAgZXh0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW4sCi0gICAgICAgUFRSICAgICBleHQpKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3JlbG9jX291dCkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIHNyYywKLSAgICAgICBQVFIgICAgIGRzdCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBQVFIgICAgIG91dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBQVFIgICAgIG91dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGluLAotICAgICAgIFBUUiAgICAgb3V0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgX2JmZF9maWxoc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfYW91dHN6OwotIHVuc2lnbmVkIGludCBfYmZkX3NjbmhzejsKLSB1bnNpZ25lZCBpbnQgX2JmZF9zeW1lc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfYXV4ZXN6OwotIHVuc2lnbmVkIGludCBfYmZkX3JlbHN6OwotIHVuc2lnbmVkIGludCBfYmZkX2xpbmVzejsKLSB1bnNpZ25lZCBpbnQgX2JmZF9maWxubWxlbjsKLSBib29sZWFuIF9iZmRfY29mZl9sb25nX2ZpbGVuYW1lczsKLSBib29sZWFuIF9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXM7Ci0gdW5zaWduZWQgaW50IF9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyOwotIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgZXh0LAotICAgICAgIFBUUiAgICAgaW4pKTsKLSB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGV4dCwKLSAgICAgICBQVFIgICAgIGluKSk7Ci0gdm9pZCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGV4dCwKLSAgICAgICBQVFIgICAgIGluKSk7Ci0gdm9pZCAoKl9iZmRfY29mZl9zd2FwX3JlbG9jX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgZXh0LAotICAgICAgIFBUUiAgICAgaW4pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIpKTsKLSBQVFIgKCpfYmZkX2NvZmZfbWtvYmplY3RfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIsCi0gICAgICAgUFRSICAgICBpbnRlcm5hbF9hb3V0aGRyKSk7Ci0gZmxhZ3dvcmQgKCpfYmZkX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2spIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbnRlcm5hbF9zY25oZHIsCi0gICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbikpOwotIHZvaWQgKCpfYmZkX3NldF9hbGlnbm1lbnRfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBhc2VjdGlvbiAqc2VjLAotICAgICAgIFBUUiAgICAgaW50ZXJuYWxfc2NuaGRyKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0gICAgICAgdW5zaWduZWQgaW50IGluZGF1eCwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXgpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3ByaW50X2F1eCkgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkLAotICAgICAgIEZJTEUgKmZpbGUsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4LAotICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgpKTsKLSB2b2lkICgqX2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsCi0gICAgICAgYXJlbGVudCAqcmVsb2MsCi0gICAgICAgYmZkX2J5dGUgKmRhdGEsCi0gICAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyLAotICAgICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cikpOwotIGludCAoKl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgICAgYXJlbGVudCAqciwKLSAgICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKLSBlbnVtIGNvZmZfc3ltYm9sX2NsYXNzaWZpY2F0aW9uICgqX2JmZF9jb2ZmX2NsYXNzaWZ5X3N5bWJvbCkgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspIFBBUkFNUyAoKAotICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbikgUEFSQU1TICgoCi0gICAgICAgYmZkICpvdXRwdXRfYmZkLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotICAgICAgIGJmZCAqaW5wdXRfYmZkLAotICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgICAgIGJmZF9ieXRlICpjb250ZW50cywKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jcywKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zLAotICAgICAgIGFzZWN0aW9uICoqc2VjdGlvbnMpKTsKLSByZWxvY19ob3d0b190eXBlICooKl9iZmRfY29mZl9ydHlwZV90b19ob3d0bykgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkLAotICAgICAgIGFzZWN0aW9uICpzZWMsCi0gICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWwsCi0gICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSwKLSAgICAgICBiZmRfdm1hICphZGRlbmRwKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKm9iZmQsCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0gICAgICAgYmZkICppYmZkLAotICAgICAgIGFzZWN0aW9uICpzZWMsCi0gICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYywKLSAgICAgICBib29sZWFuICphZGp1c3RlZHApKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpIFBBUkFNUyAoKAotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgIGZsYWd3b3JkIGZsYWdzLCAKLSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLSAgICAgICBiZmRfdm1hIHZhbHVlLAotICAgICAgIGNvbnN0IGNoYXIgKnN0cmluZywKLSAgICAgICBib29sZWFuIGNvcHksCi0gICAgICAgYm9vbGVhbiBjb2xsZWN0LCAKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwKSk7Ci0KLSBib29sZWFuICgqX2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bikgUEFSQU1TICgoCi0gICAgICAgYmZkICogYWJmZCwKLSAgICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm8pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCkgUEFSQU1TICgoCi0gICAgICAgYmZkICogYWJmZCwKLSAgICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm8pKTsKLQotfSBiZmRfY29mZl9iYWNrZW5kX2RhdGE7Ci0KLSNkZWZpbmUgY29mZl9iYWNrZW5kX2luZm8oYWJmZCkgKChiZmRfY29mZl9iYWNrZW5kX2RhdGEgKikgKGFiZmQpLT54dmVjLT5iYWNrZW5kX2RhdGEpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hdXhfaW4oYSxlLHQsYyxpbmQsbnVtLGkpIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX2F1eF9pbikgKGEsZSx0LGMsaW5kLG51bSxpKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3N5bV9pbihhLGUsaSkgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfc3ltX2luKSAoYSxlLGkpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luKGEsZSxpKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKCBhKS0+X2JmZF9jb2ZmX3N3YXBfbGluZW5vX2luKSAoYSxlLGkpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KGFiZmQsIGksIG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3JlbG9jX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dChhYmZkLCBpLCBvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hdXhfb3V0KGEsaSx0LGMsaW5kLG51bSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9hdXhfb3V0KSAoYSxpLHQsYyxpbmQsbnVtLG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc3ltX291dChhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3N5bV9vdXQpIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQoYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dChhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dChhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfZmlsaHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfZmlsaHN6KQotI2RlZmluZSBiZmRfY29mZl9hb3V0c3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9hb3V0c3opCi0jZGVmaW5lIGJmZF9jb2ZmX3NjbmhzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3NjbmhzeikKLSNkZWZpbmUgYmZkX2NvZmZfc3ltZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc3ltZXN6KQotI2RlZmluZSBiZmRfY29mZl9hdXhlc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9hdXhlc3opCi0jZGVmaW5lIGJmZF9jb2ZmX3JlbHN6KGFiZmQpICAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3JlbHN6KQotI2RlZmluZSBiZmRfY29mZl9saW5lc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9saW5lc3opCi0jZGVmaW5lIGJmZF9jb2ZmX2ZpbG5tbGVuKGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfZmlsbm1sZW4pCi0jZGVmaW5lIGJmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzKGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9sb25nX2ZpbGVuYW1lcykKLSNkZWZpbmUgYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzKGFiZmQpIFwKLSAgICAgICAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcykKLSNkZWZpbmUgYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcihhYmZkKSBcCi0gICAgICAgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4oYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbikgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX2luKGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc2NuaGRyX2luKSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9yZWxvY19pbihhYmZkLCBpLCBvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9yZWxvY19pbikgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vayhhYmZkLCBmaWxlaGRyKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rKSAoYWJmZCwgZmlsZWhkcikpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKGFiZmQsIGZpbGVoZHIpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vaykgKGFiZmQsIGZpbGVoZHIpKQotI2RlZmluZSBiZmRfY29mZl9ta29iamVjdF9ob29rKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX21rb2JqZWN0X2hvb2spIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKSkKLQotI2RlZmluZSBiZmRfY29mZl9zdHlwX3RvX3NlY19mbGFnc19ob29rKGFiZmQsIHNjbmhkciwgbmFtZSwgc2VjdGlvbilcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2spXAotICAgICAgICAgKGFiZmQsIHNjbmhkciwgbmFtZSwgc2VjdGlvbikpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc2V0X2FsaWdubWVudF9ob29rKGFiZmQsIHNlYywgc2NuaGRyKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc2V0X2FsaWdubWVudF9ob29rKSAoYWJmZCwgc2VjLCBzY25oZHIpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZShhYmZkKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUpIChhYmZkKSkKLQotI2RlZmluZSBiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKGFiZmQsIHN5bSlcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZykgKGFiZmQsIHN5bSkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfcHJpbnRfYXV4KGFiZmQsIGZpbGUsIGJhc2UsIHN5bWJvbCwgYXV4LCBpbmRhdXgpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3ByaW50X2F1eClcCi0gICAgICAgICAoYWJmZCwgZmlsZSwgYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eCkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyhhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLCBkc3RfcHRyKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKVwKLSAgICAgICAgIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLCBkc3RfcHRyKSkKLQotI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKGFiZmQsIHNlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbylcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSlcCi0gICAgICAgICAoYWJmZCwgc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKSkKLQotI2RlZmluZSBiZmRfY29mZl9jbGFzc2lmeV9zeW1ib2woYWJmZCwgc3ltKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9jbGFzc2lmeV9zeW1ib2wpXAotICAgICAgICAgKGFiZmQsIHN5bSkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKGFiZmQpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucylcCi0gICAgICAgICAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluayhvYmZkLCBpbmZvKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAob2JmZCktPl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKVwKLSAgICAgICAgIChvYmZkLCBpbmZvKSkKLSNkZWZpbmUgYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbihvYmZkLGluZm8saWJmZCxvLGNvbixyZWwsaXN5bXMsc2VjcylcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGliZmQpLT5fYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbilcCi0gICAgICAgICAob2JmZCwgaW5mbywgaWJmZCwgbywgY29uLCByZWwsIGlzeW1zLCBzZWNzKSkKLSNkZWZpbmUgYmZkX2NvZmZfcnR5cGVfdG9faG93dG8oYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcClcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcnR5cGVfdG9faG93dG8pXAotICAgICAgICAgKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApKQotI2RlZmluZSBiZmRfY29mZl9hZGp1c3Rfc3ltbmR4KG9iZmQsIGluZm8sIGliZmQsIHNlYywgcmVsLCBhZGp1c3RlZHApXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2FkanVzdF9zeW1uZHgpXAotICAgICAgICAgKG9iZmQsIGluZm8sIGliZmQsIHNlYywgcmVsLCBhZGp1c3RlZHApKQotI2RlZmluZSBiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKGluZm8sYWJmZCxuYW1lLGZsYWdzLHNlY3Rpb24sdmFsdWUsc3RyaW5nLGNwLGNvbGwsaGFzaHApXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpXAotICAgICAgICAgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwgc3RyaW5nLCBjcCwgY29sbCwgaGFzaHApKQotCi0jZGVmaW5lIGJmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bihhLHApIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pIChhLHApKQotI2RlZmluZSBiZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQoYSxwKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KSAoYSxwKSkKLQpkaWZmIC0tZ2l0IGEvYmZkL2xpYmVjb2ZmLmggYi9iZmQvbGliZWNvZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU2MTgwNS4uMDAwMDAwMAotLS0gYS9iZmQvbGliZWNvZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKiBCRkQgRUNPRkYgb2JqZWN0IGZpbGUgcHJpdmF0ZSBzdHJ1Y3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaWZuZGVmIEVDT0ZGX0gKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jZW5kaWYKLQotLyogVGhpcyBpcyB0aGUgYmFja2VuZCBpbmZvcm1hdGlvbiBrZXB0IGZvciBFQ09GRiBmaWxlcy4gIFRoaXMKLSAgIHN0cnVjdHVyZSBpcyBjb25zdGFudCBmb3IgYSBwYXJ0aWN1bGFyIGJhY2tlbmQuICBUaGUgZmlyc3QgZWxlbWVudAotICAgaXMgdGhlIENPRkYgYmFja2VuZCBkYXRhIHN0cnVjdHVyZSwgc28gdGhhdCBFQ09GRiB0YXJnZXRzIGNhbiB1c2UKLSAgIHRoZSBnZW5lcmljIENPRkYgY29kZS4gICovCi0KLSNkZWZpbmUgZWNvZmZfYmFja2VuZChhYmZkKSBcCi0gICgoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqKSAoYWJmZCktPnh2ZWMtPmJhY2tlbmRfZGF0YSkKLQotc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YQotewotICAvKiBDT0ZGIGJhY2tlbmQgaW5mb3JtYXRpb24uICBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IGZpZWxkLiAgKi8KLSAgYmZkX2NvZmZfYmFja2VuZF9kYXRhIGNvZmY7Ci0gIC8qIFN1cHBvcnRlZCBhcmNoaXRlY3R1cmUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgLyogSW5pdGlhbCBwb3J0aW9uIG9mIGFybWFwIHN0cmluZy4gICovCi0gIGNvbnN0IGNoYXIgKmFybWFwX3N0YXJ0OwotICAvKiBUaGUgcGFnZSBib3VuZGFyeSB1c2VkIHRvIGFsaWduIHNlY3Rpb25zIGluIGEgZGVtYW5kLXBhZ2VkCi0gICAgIGV4ZWN1dGFibGUgZmlsZS4gIEUuZy4sIDB4MTAwMC4gICovCi0gIGJmZF92bWEgcm91bmQ7Ci0gIC8qIFRydWUgaWYgdGhlIC5yZGF0YSBzZWN0aW9uIGlzIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIEFscGhhLiAgRmFsc2UgaWYgLnJkYXRhIGlzIHBhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIE1JUFMuICAqLwotICBib29sZWFuIHJkYXRhX2luX3RleHQ7Ci0gIC8qIEJpdHNpemUgb2YgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGludCBjb25zdHJ1Y3Rvcl9iaXRzaXplOwotICAvKiBSZWxvYyB0byB1c2UgZm9yIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICByZWxvY19ob3d0b190eXBlICpjb25zdHJ1Y3Rvcl9yZWxvYzsKLSAgLyogSG93IHRvIHN3YXAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgZGVidWdfc3dhcDsKLSAgLyogRXh0ZXJuYWwgcmVsb2Mgc2l6ZS4gICovCi0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgLyogUmVsb2Mgc3dhcHBpbmcgZnVuY3Rpb25zLiAgKi8KLSAgdm9pZCAoKnN3YXBfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci0gIHZvaWQgKCpzd2FwX3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBQVFIpKTsKLSAgLyogQmFja2VuZCByZWxvYyB0d2Vha2luZy4gICovCi0gIHZvaWQgKCphZGp1c3RfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkgICBhcmVsZW50ICopKTsKLSAgdm9pZCAoKmFkanVzdF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBhcmVsZW50ICosCi0JCQkJICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci0gIC8qIFJlbG9jYXRlIHNlY3Rpb24gY29udGVudHMgd2hpbGUgbGlua2luZy4gICovCi0gIGJvb2xlYW4gKCpyZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgIGJmZCAqaW5wdXRfYmZkLCBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAotCQkJCSAgICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzKSk7Ci0gIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLwotICBib29sZWFuICgqYWRqdXN0X2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqLAotCQkJCSAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikpOwotICAvKiBSZWFkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcmNoaXZlIGF0IGEgZ2l2ZW4gZmlsZSBwb3NpdGlvbi4gIFRoaXMKLSAgICAgaXMgbmVlZGVkIGJlY2F1c2UgT1NGLzEgMy4yIHVzZXMgYSB3ZWlyZCBhcmNoaXZlIGZvcm1hdC4gICovCi0gIGJmZCAqKCpnZXRfZWx0X2F0X2ZpbGVwb3MpIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0cikpOwotfTsKLQotLyogVGhpcyBpcyB0aGUgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGtlcHQgZm9yIEVDT0ZGIGZpbGVzLiAgKi8KLQotI2RlZmluZSBlY29mZl9kYXRhKGFiZmQpICgoYWJmZCktPnRkYXRhLmVjb2ZmX29ial9kYXRhKQotCi10eXBlZGVmIHN0cnVjdCBlY29mZl90ZGF0YQotewotICAvKiBUaGUgcmVsb2MgZmlsZSBwb3NpdGlvbiwgc2V0IGJ5Ci0gICAgIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gICovCi0gIGZpbGVfcHRyIHJlbG9jX2ZpbGVwb3M7Ci0KLSAgLyogVGhlIHN5bWJvbCB0YWJsZSBmaWxlIHBvc2l0aW9uLCBzZXQgYnkgX2JmZF9lY29mZl9ta29iamVjdF9ob29rLiAgKi8KLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0KLSAgLyogVGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHRleHQgc2VnbWVudC4gIE9ubHkgdmFsaWQgZm9yIGFuCi0gICAgIGV4aXN0aW5nIGZpbGUsIG5vdCBmb3Igb25lIHdlIGFyZSBjcmVhdGluZy4gICovCi0gIHVuc2lnbmVkIGxvbmcgdGV4dF9zdGFydDsKLSAgdW5zaWduZWQgbG9uZyB0ZXh0X2VuZDsKLQotICAvKiBUaGUgY2FjaGVkIGdwIHZhbHVlLiAgVGhpcyBpcyB1c2VkIHdoZW4gcmVsb2NhdGluZy4gICovCi0gIGJmZF92bWEgZ3A7Ci0KLSAgLyogVGhlIG1heGltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIG9wdGltaXplIHVzaW5nIGdwLiAgVGhpcyBpcwotICAgICB0eXBpY2FsbHkgc2V0IGJ5IHRoZSAtRyBvcHRpb24gdG8gdGhlIGNvbXBpbGVyLCBhc3NlbWJsZXIgb3IKLSAgICAgbGlua2VyLiAgKi8KLSAgdW5zaWduZWQgaW50IGdwX3NpemU7Ci0KLSAgLyogVGhlIHJlZ2lzdGVyIG1hc2tzLiAgV2hlbiBsaW5raW5nLCBhbGwgdGhlIG1hc2tzIGZvdW5kIGluIHRoZQotICAgICBpbnB1dCBmaWxlcyBhcmUgY29tYmluZWQgaW50byB0aGUgbWFza3Mgb2YgdGhlIG91dHB1dCBmaWxlLgotICAgICBUaGVzZSBhcmUgbm90IGFsbCB1c2VkIGZvciBhbGwgdGFyZ2V0cywgYnV0IHRoYXQncyBPSywgYmVjYXVzZQotICAgICB0aGUgcmVsZXZhbnQgb25lcyBhcmUgdGhlIG9ubHkgb25lcyBzd2FwcGVkIGluIGFuZCBvdXQuICAqLwotICB1bnNpZ25lZCBsb25nIGdwcm1hc2s7Ci0gIHVuc2lnbmVkIGxvbmcgZnBybWFzazsKLSAgdW5zaWduZWQgbG9uZyBjcHJtYXNrWzRdOwotCi0gIC8qIFRoZSBFQ09GRiBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkZWJ1Z19pbmZvOwotCi0gIC8qIFRoZSB1bnN3YXBwZWQgRUNPRkYgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBQVFIgcmF3X3N5bWVudHM7Ci0KLSAgLyogVGhlIGNhbm9uaWNhbCBCRkQgc3ltYm9scy4gICovCi0gIHN0cnVjdCBlY29mZl9zeW1ib2xfc3RydWN0ICpjYW5vbmljYWxfc3ltYm9sczsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSBleHRlcm5hbCBzeW1ib2wgbnVtYmVycyB0byBlbnRyaWVzIGluIHRoZSBsaW5rZXIKLSAgICAgaGFzaCB0YWJsZSwgdXNlZCB3aGVuIGxpbmtpbmcuICAqLwotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSByZWxvYyBzeW1ib2wgaW5kaWNlcyB0byBzZWN0aW9ucywgdXNlZCB3aGVuCi0gICAgIGxpbmtpbmcuICAqLwotICBhc2VjdGlvbiAqKnN5bW5keF90b19zZWN0aW9uOwotCi0gIC8qIFRydWUgaWYgdGhpcyBCRkQgd2FzIHdyaXR0ZW4gYnkgdGhlIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgYm9vbGVhbiBsaW5rZXI7Ci0KLSAgLyogVHJ1ZSBpZiBhIHdhcm5pbmcgdGhhdCBtdWx0aXBsZSBnbG9iYWwgcG9pbnRlciB2YWx1ZXMgYXJlCi0gICAgIG5lZWRlZCBpbiB0aGUgb3V0cHV0IGJpbmFyeSB3YXMgaXNzdWVkIGFscmVhZHkuICAqLwotICBib29sZWFuIGlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nOwotCi0gIC8qIFVzZWQgYnkgZmluZF9uZWFyZXN0X2xpbmUgZW50cnkgcG9pbnQuICBUaGUgc3RydWN0dXJlIGNvdWxkIGJlCi0gICAgIGluY2x1ZGVkIGRpcmVjdGx5IGluIHRoaXMgb25lLCBidXQgdGhlcmUncyBubyBwb2ludCB0byB3YXN0aW5nCi0gICAgIHRoZSBtZW1vcnkganVzdCBmb3IgdGhlIGluZnJlcXVlbnRseSBjYWxsZWQgZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpmaW5kX2xpbmVfaW5mbzsKLQotICAvKiBXaGV0aGVyIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBpbiB0aGUgdGV4dCBzZWdtZW50IGZvciB0aGlzCi0gICAgIHBhcnRpY3VsYXIgRUNPRkYgZmlsZS4gIFRoaXMgaXMgbm90IHZhbGlkIHVudGlsCi0gICAgIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBpcyBjYWxsZWQuICAqLwotICBib29sZWFuIHJkYXRhX2luX3RleHQ7Ci0KLX0gZWNvZmZfZGF0YV90eXBlOwotCi0vKiBFYWNoIGNhbm9uaWNhbCBhc3ltYm9sIHJlYWxseSBsb29rcyBsaWtlIHRoaXMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlY29mZl9zeW1ib2xfc3RydWN0Ci17Ci0gIC8qIFRoZSBhY3R1YWwgc3ltYm9sIHdoaWNoIHRoZSByZXN0IG9mIEJGRCB3b3JrcyB3aXRoICovCi0gIGFzeW1ib2wgc3ltYm9sOwotCi0gIC8qIFRoZSBmZHIgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgRkRSICpmZHI7Ci0KLSAgLyogdHJ1ZSBpZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sIHJhdGhlciB0aGFuIGFuIGV4dGVybmFsIG9uZS4gICovCi0gIGJvb2xlYW4gbG9jYWw7Ci0KLSAgLyogQSBwb2ludGVyIHRvIHRoZSB1bnN3YXBwZWQgaGlkZGVuIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbC4KLSAgICAgVGhpcyBpcyBlaXRoZXIgYSBzdHJ1Y3Qgc3ltX2V4dCBvciBhIHN0cnVjdCBleHRfZXh0LCBkZXBlbmRpbmcgb24KLSAgICAgdGhlIHZhbHVlIG9mIHRoZSBsb2NhbCBmaWVsZCBhYm92ZS4gICovCi0gIFBUUiBuYXRpdmU7Ci19IGVjb2ZmX3N5bWJvbF90eXBlOwotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgYXN5bWJvbCB0byBlbnN1cmUgdGhhdCB0aGUKLSAgIG1hY3JvIGlzIG9ubHkgZXZlciBhcHBsaWVkIHRvIGFuIGFzeW1ib2wuICAqLwotI2RlZmluZSBlY29mZnN5bWJvbChhc3ltYm9sKSAoKGVjb2ZmX3N5bWJvbF90eXBlICopICgmKChhc3ltYm9sKS0+dGhlX2JmZCkpKQotCi0vKiBXZSBuZWVkIHRvIHNhdmUgdGhlIGluZGV4IG9mIGFuIGV4dGVybmFsIHN5bWJvbCB3aGVuIHdlIHdyaXRlIGl0Ci0gICBvdXQgc28gdGhhdCBjYW4gc2V0IHRoZSBzeW1ib2wgaW5kZXggY29ycmVjdGx5IHdoZW4gd2Ugd3JpdGUgb3V0Ci0gICB0aGUgcmVsb2NzLiAgKi8KLSNkZWZpbmUgZWNvZmZfZ2V0X3N5bV9pbmRleChzeW1ib2wpICgoc3ltYm9sKS0+dWRhdGEuaSkKLSNkZWZpbmUgZWNvZmZfc2V0X3N5bV9pbmRleChzeW1ib2wsIGlkeCkgKChzeW1ib2wpLT51ZGF0YS5pID0gKGlkeCkpCi0KLS8qIFdoZW4gZ2VuZXJhdGluZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLCB0aGUgbGlua2VyIHJlbGF4ZXMgdGhlIGNvZGUKLSAgIHRvIHR1cm4gUEMgcmVsYXRpdmUgYnJhbmNoZXMgaW50byBsb25nZXIgY29kZSBzZXF1ZW5jZXMgd2hlbiB0aGUgUEMKLSAgIHJlbGF0aXZlIGJyYW5jaCBpcyBvdXQgb2YgcmFuZ2UuICBUaGlzIGludm9sdmVzIHJlYWRpbmcgdGhlIHJlbG9jcwotICAgaW4gYmZkX3JlbGF4X3NlY3Rpb24gYXMgd2VsbCBhcyBpbiBiZmRfZmluYWxfbGluaywgYW5kIHJlcXVpcmVzIHRoZQotICAgY29kZSB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIHJlbG9jcyBoYXZlIGJlZW4gZXhwYW5kZWQuICBBIHBvaW50ZXIKLSAgIHRvIHRoaXMgc3RydWN0dXJlIGlzIHB1dCBpbiB0aGUgdXNlZF9ieV9iZmQgcG9pbnRlciBvZiBhIHNlY3Rpb24gdG8KLSAgIGtlZXAgdHJhY2sgb2YgdGhpcyBpbmZvcm1hdGlvbi4gIFRoZSB1c2VyX2J5X2JmZCBwb2ludGVyIHdpbGwgYmUKLSAgIE5VTEwgaWYgdGhlIGluZm9ybWF0aW9uIHdhcyBub3QgbmVlZGVkLiAgKi8KLQotc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHVuc3dhcHBlZCByZWxvY3MgZm9yIHRoaXMgc2VjdGlvbi4gIFRoZXNlIGFyZSBzdG9yZWQgaW4KLSAgICAgbWVtb3J5IHNvIHRoZSBpbnB1dCBmaWxlIGRvZXMgbm90IGhhdmUgdG8gYmUgcmVhZCB0d2ljZS4gICovCi0gIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci0KLSAgLyogVGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uLiAgVGhlc2UgYnl0ZXMgbWF5IG9yIG1heSBub3QgYmUgc2F2ZWQKLSAgICAgaW4gbWVtb3J5LCBidXQgaWYgaXQgaXMgdGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlbS4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLQotICAvKiBPZmZzZXQgYWRqdXN0bWVudHMgZm9yIFBDIHJlbGF0aXZlIGJyYW5jaGVzLiAgQSBudW1iZXIgb3RoZXIgdGhhbgotICAgICAxIGlzIGFuIGFkZGVuZCBmb3IgYSBQQyByZWxhdGl2ZSBicmFuY2gsIG9yIGEgc3dpdGNoIHRhYmxlIGVudHJ5Ci0gICAgIHdoaWNoIGlzIHRoZSBkaWZmZXJlbmNlIG9mIHR3byAudGV4dCBsb2NhdGlvbnM7IHRoaXMgYWRkZW5kCi0gICAgIGFyaXNlcyBiZWNhdXNlIHRoZSBicmFuY2ggb3IgZGlmZmVyZW5jZSBjcm9zc2VzIG9uZSBvciBtb3JlCi0gICAgIGJyYW5jaGVzIHdoaWNoIHdlcmUgZXhwYW5kZWQgaW50byBhIGxhcmdlciBjb2RlIHNlcXVlbmNlLiAgQSAxCi0gICAgIG1lYW5zIHRoYXQgdGhpcyBicmFuY2ggd2FzIGl0c2VsZiBleHBhbmRlZCBpbnRvIGEgbGFyZ2VyIGNvZGUKLSAgICAgc2VxdWVuY2UuICAxIGlzIG5vdCBhIHBvc3NpYmxlIG9mZnNldCwgc2luY2UgYWxsIG9mZnNldHMgbXVzdCBiZQotICAgICBtdWx0aXBsZXMgb2YgdGhlIGluc3RydWN0aW9uIHNpemUsIHdoaWNoIGlzIDQ7IGFsc28sIHRoZSBvbmx5Ci0gICAgIHJlbG9jcyB3aXRoIG5vbi16ZXJvIG9mZnNldHMgd2lsbCBiZSBQQyByZWxhdGl2ZSBicmFuY2hlcyBvcgotICAgICBzd2l0Y2ggdGFibGUgZW50cmllcyB3aXRoaW4gdGhlIHNhbWUgb2JqZWN0IGZpbGUuICBJZiB0aGlzIGZpZWxkCi0gICAgIGlzIE5VTEwsIG5vIGJyYW5jaGVzIHdlcmUgZXhwYW5kZWQgYW5kIG5vIG9mZnNldHMgYXJlIHJlcXVpcmVkLgotICAgICBPdGhlcndpc2UgdGhlcmUgYXJlIGFzIG1hbnkgZW50cmllcyBhcyB0aGVyZSBhcmUgcmVsb2NzIGluIHRoZQotICAgICBzZWN0aW9uLCBhbmQgdGhlIGVudHJ5IGZvciBhbnkgcmVsb2MgdGhhdCBpcyBub3QgUEMgcmVsYXRpdmUgaXMKLSAgICAgemVyby4gICovCi0gIGxvbmcgKm9mZnNldHM7Ci0KLSAgLyogV2hlbiBwcm9kdWNpbmcgYW4gZXhlY3V0YWJsZSAoaS5lLiwgZmluYWwsIG5vbi1yZWxvY2F0YWJsZSBsaW5rKQotICAgICBvbiB0aGUgQWxwaGEsIHdlIG1heSBuZWVkIHRvIHVzZSBtdWx0aXBsZSBnbG9iYWwgcG9pbnRlciB2YWx1ZXMKLSAgICAgdG8gc3BhbiB0aGUgZW50aXJlIC5saXRhIHNlY3Rpb24uICBJbiBlc3NlbmNlLCB3ZSBhbGxvdyBlYWNoCi0gICAgIGlucHV0IC5saXRhIHNlY3Rpb24gdG8gaGF2ZSBpdHMgb3duIGdwIHZhbHVlLiAgVG8gc3VwcG9ydCB0aGlzLAotICAgICB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGdwIHZhbHVlcyB0aGF0IHdlIHBpY2tlZCBmb3IgZWFjaAotICAgICBpbnB1dCAubGl0YSBzZWN0aW9uIC4gKi8KLSAgYmZkX3ZtYSBncDsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgZWNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBlY29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgKHNlYyktPnVzZWRfYnlfYmZkKQotCi0vKiBFQ09GRiBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICAqLwotICBsb25nIGluZHg7Ci0gIC8qIEJGRCB0aGF0IGV4dCBmaWVsZCB2YWx1ZSBjYW1lIGZyb20uICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIEVDT0ZGIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIEVYVFIgZXN5bTsKLSAgLyogTm9uemVybyBpZiB0aGlzIHN5bWJvbCBoYXMgYmVlbiB3cml0dGVuIG91dC4gICovCi0gIGNoYXIgd3JpdHRlbjsKLSAgLyogTm9uemVybyBpZiB0aGlzIHN5bWJvbCB3YXMgcmVmZXJyZWQgdG8gYXMgc21hbGwgdW5kZWZpbmVkLiAgKi8KLSAgY2hhciBzbWFsbDsKLX07Ci0KLS8qIEVDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogTWFrZSBhbiBFQ09GRiBvYmplY3QuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSZWFkIGluIHRoZSBFQ09GRiBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgRUNPRkYgQkZEIGJhY2tlbmQgdmVjdG9ycy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKl9iZmRfZWNvZmZfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0jZGVmaW5lCV9iZmRfZWNvZmZfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSNkZWZpbmUgX2JmZF9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBfYmZkX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBfYmZkX2Vjb2ZmX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfd3JpdGVfYXJtYXAKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpOwotI2RlZmluZSBfYmZkX2Vjb2ZmX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2Vjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgX2JmZF9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBfYmZkX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLQotZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmFsb2NhdGlvbikpOwotZXh0ZXJuIGFzeW1ib2wgKl9iZmRfZWNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3ByaW50X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVwLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9nZXRfc3ltYm9sX2luZm8KLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hIG9mZnNldCwKLQkgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyLCBjb25zdCBjaGFyICoqZm5uYW1lX3B0ciwKLQkgICB1bnNpZ25lZCBpbnQgKnJldGxpbmVfcHRyKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBfYmZkX2Vjb2ZmX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgX2JmZF9lY29mZl9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCBjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZAotZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9jYW5vbmljYWxpemVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci0vKiBlY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgZGVmaW5lZCBieSBiYWNrZW5kLiAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLWV4dGVybiBpbnQgX2JmZF9lY29mZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gcmVsb2MpKTsKLS8qIGVjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgZGVmaW5lZCBieSBiYWNrZW5kLiAgKi8KLS8qIGVjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGRlZmluZWQgYnkgYmFja2VuZC4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogSG9vayBmdW5jdGlvbnMgZm9yIHRoZSBnZW5lcmljIENPRkYgc2VjdGlvbiByZWFkaW5nIGNvZGUuICAqLwotCi1leHRlcm4gUFRSIF9iZmRfZWNvZmZfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVoZHIsIFBUUiBhb3V0aGRyKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfc2V0X2FsaWdubWVudF9ob29rIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSkpIGJmZF92b2lkKQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgZmlsZWhkcikpOwotZXh0ZXJuIGZsYWd3b3JkIF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgaGRyLCBjb25zdCBjaGFyICpuYW1lLCBhc2VjdGlvbiAqc2VjdGlvbikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLS8qIEVDT0ZGIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZXNlIGFyZSB0aGUgc2FtZQotICAgZm9yIGFsbCBFQ09GRiB0YXJnZXRzLCBzbyB0aGV5IGFyZSBkZWZpbmVkIGluIGVjb2ZmbGluay5jLiAgKi8KLQotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbgotICBQQVJBTVMgKChpbnQsIGNvbnN0IHN0cnVjdCB0aXJfZXh0ICosIFRJUiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dAotICBQQVJBTVMgKChpbnQsIGNvbnN0IFRJUiAqLCBzdHJ1Y3QgdGlyX2V4dCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbgotICBQQVJBTVMgKChpbnQsIGNvbnN0IHN0cnVjdCBybmR4X2V4dCAqLCBSTkRYUiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQKLSAgUEFSQU1TICgoaW50LCBjb25zdCBSTkRYUiAqLCBzdHJ1Y3Qgcm5keF9leHQgKikpOwpkaWZmIC0tZ2l0IGEvYmZkL2xpYmhwcGEuaCBiL2JmZC9saWJocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMmVhYmUuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmhwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyOSArMCwwIEBACi0vKiBIUCBQQS1SSVNDIFNPTSBvYmplY3QgZmlsZSBmb3JtYXQ6ICBkZWZpbml0aW9ucyBpbnRlcm5hbCB0byBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0hQUEFfSAotI2RlZmluZSBfSFBQQV9ICi0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIFBBX1BBR0VTSVpFIDB4MTAwMAotCi0jaWZuZGVmIElOTElORQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIElOTElORSBpbmxpbmUKLSNlbHNlCi0jZGVmaW5lIElOTElORQotI2VuZGlmIC8qIEdOVSBDPyAqLwotI2VuZGlmIC8qIElOTElORSAqLwotCi0jaWYgX19HTlVDX18gPj0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3Ci0vKiBEZWNsYXJlIHRoZSBmdW5jdGlvbnMgd2l0aCB0aGUgdW51c2VkIGF0dHJpYnV0ZSB0byBhdm9pZCB3YXJuaW5ncy4gICovCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBhc3NlbWJsZV8zICh1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzMgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICopCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBhc3NlbWJsZV8xMiAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzEyICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyBhc3NlbWJsZV8xNyAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JCQkJCSB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzE3ICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50ICopCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzIyICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50ICosCi0JCQkJICAgIHVuc2lnbmVkIGludCAqKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nIGFzc2VtYmxlXzIxICh1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB2b2lkIGRpc19hc3NlbWJsZV8yMSAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyBzaWduX2V4dGVuZCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBvbmVzIChpbnQpIF9fYXR0cmlidXRlICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB2b2lkIHNpZ25fdW5leHQgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyBsb3dfc2lnbl9leHRlbmQgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB2b2lkIGxvd19zaWduX3VuZXh0ICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICopCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgaHBwYV9maWVsZF9hZGp1c3QgKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCkKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgaW50IGJmZF9ocHBhX2luc24yZm10ICh1bnNpZ25lZCBsb25nKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSAgdW5zaWduZWQgbG9uZyBocHBhX3JlYnVpbGRfaW5zbiAoYmZkICosIHVuc2lnbmVkIGxvbmcsCi0JCQkJCQl1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotI2VuZGlmIC8qIGdjYyAyLjcgb3IgaGlnaGVyICovCi0KLQotLyogVGhlIFBBIGluc3RydWN0aW9uIHNldCB2YXJpYW50cy4gICovCi1lbnVtIHBhX2FyY2gge3BhMTAgPSAxMCwgcGExMSA9IDExLCBwYTIwID0gMjB9OwotCi0vKiBIUCBQQS1SSVNDIHJlbG9jYXRpb24gdHlwZXMgKi8KLQotZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUKLSAgewotICAgIFJfSFBQQV9GU0VMID0gMHgwLAotICAgIFJfSFBQQV9MU1NFTCA9IDB4MSwKLSAgICBSX0hQUEFfUlNTRUwgPSAweDIsCi0gICAgUl9IUFBBX0xTRUwgPSAweDMsCi0gICAgUl9IUFBBX1JTRUwgPSAweDQsCi0gICAgUl9IUFBBX0xEU0VMID0gMHg1LAotICAgIFJfSFBQQV9SRFNFTCA9IDB4NiwKLSAgICBSX0hQUEFfTFJTRUwgPSAweDcsCi0gICAgUl9IUFBBX1JSU0VMID0gMHg4LAotICAgIFJfSFBQQV9OU0VMICA9IDB4OSwKLSAgICBSX0hQUEFfTkxTRUwgID0gMHhhLAotICAgIFJfSFBQQV9OTFJTRUwgID0gMHhiLAotICAgIFJfSFBQQV9QU0VMID0gMHhjLAotICAgIFJfSFBQQV9MUFNFTCA9IDB4ZCwKLSAgICBSX0hQUEFfUlBTRUwgPSAweGUsCi0gICAgUl9IUFBBX1RTRUwgPSAweGYsCi0gICAgUl9IUFBBX0xUU0VMID0gMHgxMCwKLSAgICBSX0hQUEFfUlRTRUwgPSAweDExLAotICAgIFJfSFBQQV9MVFBTRUwgPSAweDEyLAotICAgIFJfSFBQQV9SVFBTRUwgPSAweDEzCi0gIH07Ci0KLS8qIC91c3IvaW5jbHVkZS9yZWxvYy5oIGRlZmluZXMgdGhlc2UgdG8gY29uc3RhbnRzLiAgV2Ugd2FudCB0byB1c2UKLSAgIHRoZW0gaW4gZW51bXMsIHNvICN1bmRlZiB0aGVtIGJlZm9yZSB3ZSBzdGFydCB1c2luZyB0aGVtLiAgV2UgbWlnaHQKLSAgIGJlIGFibGUgdG8gZml4IHRoaXMgYW5vdGhlciB3YXkgYnkgc2ltcGx5IG1hbmFnaW5nIG5vdCB0byBpbmNsdWRlCi0gICAvdXNyL2luY2x1ZGUvcmVsb2MuaCwgYnV0IGN1cnJlbnRseSBHREIgcGlja3MgdXAgdGhlc2UgZGVmaW5lcwotICAgc29tZXdoZXJlLiAgKi8KLSN1bmRlZiBlX2ZzZWwKLSN1bmRlZiBlX2xzc2VsCi0jdW5kZWYgZV9yc3NlbAotI3VuZGVmIGVfbHNlbAotI3VuZGVmIGVfcnNlbAotI3VuZGVmIGVfbGRzZWwKLSN1bmRlZiBlX3Jkc2VsCi0jdW5kZWYgZV9scnNlbAotI3VuZGVmIGVfcnJzZWwKLSN1bmRlZiBlX25zZWwKLSN1bmRlZiBlX25sc2VsCi0jdW5kZWYgZV9ubHJzZWwKLSN1bmRlZiBlX3BzZWwKLSN1bmRlZiBlX2xwc2VsCi0jdW5kZWYgZV9ycHNlbAotI3VuZGVmIGVfdHNlbAotI3VuZGVmIGVfbHRzZWwKLSN1bmRlZiBlX3J0c2VsCi0jdW5kZWYgZV9vbmUKLSN1bmRlZiBlX3R3bwotI3VuZGVmIGVfcGNyZWwKLSN1bmRlZiBlX2NvbgotI3VuZGVmIGVfcGxhYmVsCi0jdW5kZWYgZV9hYnMKLQotLyogZm9yIGNvbXBhdGliaWxpdHkgKi8KLWVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdAotICB7Ci0gICAgZV9mc2VsID0gUl9IUFBBX0ZTRUwsCi0gICAgZV9sc3NlbCA9IFJfSFBQQV9MU1NFTCwKLSAgICBlX3Jzc2VsID0gUl9IUFBBX1JTU0VMLAotICAgIGVfbHNlbCA9IFJfSFBQQV9MU0VMLAotICAgIGVfcnNlbCA9IFJfSFBQQV9SU0VMLAotICAgIGVfbGRzZWwgPSBSX0hQUEFfTERTRUwsCi0gICAgZV9yZHNlbCA9IFJfSFBQQV9SRFNFTCwKLSAgICBlX2xyc2VsID0gUl9IUFBBX0xSU0VMLAotICAgIGVfcnJzZWwgPSBSX0hQUEFfUlJTRUwsCi0gICAgZV9uc2VsID0gUl9IUFBBX05TRUwsCi0gICAgZV9ubHNlbCA9IFJfSFBQQV9OTFNFTCwKLSAgICBlX25scnNlbCA9IFJfSFBQQV9OTFJTRUwsCi0gICAgZV9wc2VsID0gUl9IUFBBX1BTRUwsCi0gICAgZV9scHNlbCA9IFJfSFBQQV9MUFNFTCwKLSAgICBlX3Jwc2VsID0gUl9IUFBBX1JQU0VMLAotICAgIGVfdHNlbCA9IFJfSFBQQV9UU0VMLAotICAgIGVfbHRzZWwgPSBSX0hQUEFfTFRTRUwsCi0gICAgZV9ydHNlbCA9IFJfSFBQQV9SVFNFTCwKLSAgICBlX2x0cHNlbCA9IFJfSFBQQV9MVFBTRUwsCi0gICAgZV9ydHBzZWwgPSBSX0hQUEFfUlRQU0VMCi0gIH07Ci0KLWVudW0gaHBwYV9yZWxvY19leHByX3R5cGUKLSAgewotICAgIFJfSFBQQV9FX09ORSA9IDAsCi0gICAgUl9IUFBBX0VfVFdPID0gMSwKLSAgICBSX0hQUEFfRV9QQ1JFTCA9IDIsCi0gICAgUl9IUFBBX0VfQ09OID0gMywKLSAgICBSX0hQUEFfRV9QTEFCRUwgPSA3LAotICAgIFJfSFBQQV9FX0FCUyA9IDE4Ci0gIH07Ci0KLS8qIGZvciBjb21wYXRpYmlsaXR5ICovCi1lbnVtIGhwcGFfcmVsb2NfZXhwcl90eXBlX2FsdAotICB7Ci0gICAgZV9vbmUgPSBSX0hQUEFfRV9PTkUsCi0gICAgZV90d28gPSBSX0hQUEFfRV9UV08sCi0gICAgZV9wY3JlbCA9IFJfSFBQQV9FX1BDUkVMLAotICAgIGVfY29uID0gUl9IUFBBX0VfQ09OLAotICAgIGVfcGxhYmVsID0gUl9IUFBBX0VfUExBQkVMLAotICAgIGVfYWJzID0gUl9IUFBBX0VfQUJTCi0gIH07Ci0KLQotLyogUmVsb2NhdGlvbnMgZm9yIGZ1bmN0aW9uIGNhbGxzIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgcGFyYW1ldGVyCi0gICByZWxvY2F0aW9uIGJpdHMuICBUaGVzZSBiaXRzIGRlc2NyaWJlIGV4YWN0bHkgd2hlcmUgdGhlIGNhbGxlciBoYXMKLSAgIHBsYWNlZCB0aGUgZnVuY3Rpb24ncyBhcmd1bWVudHMgYW5kIHdoZXJlIGl0IGV4cGVjdHMgdG8gZmluZCBhIHJldHVybgotICAgdmFsdWUuCi0KLSAgIEJvdGggRUxGIGFuZCBTT00gZW5jb2RlIHRoaXMgaW5mb3JtYXRpb24gd2l0aGluIHRoZSBhZGRlbmQgZmllbGQKLSAgIG9mIHRoZSBjYWxsIHJlbG9jYXRpb24uICAoTm90ZSB0aGlzIGNvdWxkIGJyZWFrIHZlcnkgYmFkbHkgaWYgb25lCi0gICB3YXMgdG8gbWFrZSBhIGNhbGwgbGlrZSBibCBmb28gKyAweDEyMzQ1Njc4KS4KLQotICAgVGhlIGhpZ2ggb3JkZXIgMTAgYml0cyBjb250YWluIHBhcmFtZXRlciByZWxvY2F0aW9uIGluZm9ybWF0aW9uLAotICAgdGhlIGxvdyBvcmRlciAyMiBiaXRzIGNvbnRhaW4gdGhlIGNvbnN0YW50IG9mZnNldC4gICovCi0gICAKLSNkZWZpbmUgSFBQQV9SX0FSR19SRUxPQyhhKQkoKChhKSA+PiAyMikgJiAweDNGRikKLSNkZWZpbmUgSFBQQV9SX0NPTlNUQU5UKGEpCSgoKChpbnQpKGEpKSA8PCAxMCkgPj4gMTApCi0jZGVmaW5lIEhQUEFfUl9BRERFTkQocixjKQkoKChyKSA8PCAyMikgKyAoKGMpICYgMHgzRkZGRkYpKQotI2RlZmluZSBIUFBBX1dJREUJICAgICAgICgwKSAvKiBQU1cgVy1iaXQsIG5lZWQgdG8gY2hlY2shIEZJWE1FICovCi0KLS8qIFRoZXNlIG1hY3JvcyBnZXQgYml0IGZpZWxkcyB1c2luZyBIUCdzIG51bWJlcmluZyAoTVNCID0gMCksCi0gKiBidXQgbm90ZSB0aGF0ICJNQVNLIiBhc3N1bWVzIHRoYXQgdGhlIExTQiBiaXRzIGFyZSB3aGF0J3MKLSAqIHdhbnRlZC4KLSAqLwotI2lmbmRlZiBHRVRfRklFTEQKLSNkZWZpbmUgR0VUX0ZJRUxEKFgsIEZST00sIFRPKSBcCi0gICgoWCkgPj4gKDMxIC0gKFRPKSkgJiAoKDEgPDwgKChUTykgLSAoRlJPTSkgKyAxKSkgLSAxKSkKLSNlbmRpZiAgCi0jZGVmaW5lIEdFVF9CSVQoWCwgV0hJQ0gpIFwKLSAgR0VUX0ZJRUxEIChYLCBXSElDSCwgV0hJQ0gpCi0KLSNkZWZpbmUgTUFTSyhTSVpFKSBcCi0gICh+KCgtMSkgPDwgU0laRSkpCi0gIAotI2RlZmluZSBDQVRFTkFURShYLCBYU0laRSwgWSwgWVNJWkUpIFwKLSAgKCgoWCAmIE1BU0sgKFhTSVpFKSkgPDwgWVNJWkUpIHwgKFkgJiBNQVNLIChZU0laRSkpKQotCi0jZGVmaW5lIEVMRVZFTihYKSBcCi0gIENBVEVOQVRFIChHRVRfQklUIChYLCAxMCksIDEsIEdFVF9GSUVMRCAoWCwgMCwgOSksIDEwKQotICAKLS8qIFNvbWUgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgUEEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotLyogTk9URTogdGhlc2UgdXNlIHRoZSBIUCBjb252ZW50aW9uIHRoYXQgZnsxfSBpcyB0aGUgX2xlZnRfIG1vc3QKLSAqICAgICAgIGJpdCAoTVNCKSBvZiBmOyB0aGV5IHNvbWV0aW1lcyBoYXZlIHRvIGltcG9zZSBhbiBhc3N1bXB0aW9uCi0gKiAgICAgICBhYm91dCB0aGUgc2l6ZSBvZiBhIGZpZWxkOyBhbmQgYXMgZmFyIGFzIEkgY2FuIHRlbGwsIG1vc3QKLSAqICAgICAgIGFyZW4ndCB1c2VkLgotICovCi0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotc2lnbl9leHRlbmQgKHgsIGxlbikKLSAgICAgdW5zaWduZWQgaW50IHgsIGxlbjsKLXsKLSAgcmV0dXJuIChpbnQpKHggPj4gKGxlbiAtIDEpID8gKC0xIDw8IGxlbikgfCB4IDogeCk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1hc3NlbWJsZV8zICh4KQotICAgICB1bnNpZ25lZCBpbnQgeDsKLXsKLSAgcmV0dXJuIENBVEVOQVRFIChHRVRfQklUICh4LCAyKSwgMSwgR0VUX0ZJRUxEICh4LCAwLCAxKSwgMik7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotZGlzX2Fzc2VtYmxlXzMgKHgsIHIpCi0gICAgIHVuc2lnbmVkIGludCB4OwotICAgICB1bnNpZ25lZCBpbnQgKnI7Ci17Ci0gICpyID0gKCgoeCAmIDQpID4+IDIpIHwgKCh4ICYgMykgPDwgMSkpICYgNzsKLX0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKLWFzc2VtYmxlXzYgKHgsIHkpCi0gICAgIHVuc2lnbmVkIGludCB4LCB5OwotewotICByZXR1cm4gKCgoeCAmIDB4MSkgPDwgNSkgKyAoMzIgLSAoeSAmIDB4MWYpKSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1hc3NlbWJsZV8xMiAoeCwgeSkKLSAgICAgdW5zaWduZWQgaW50IHgsIHk7Ci17Ci0gIHJldHVybiBDQVRFTkFURSAoQ0FURU5BVEUgKHksIDEsIEdFVF9CSVQgKHgsIDEwKSwgMSksIDIsCi0gCQkgICBHRVRfRklFTEQgKHgsIDAsIDkpLCA5KTsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1kaXNfYXNzZW1ibGVfMTIgKGFzMTIsIHgsIHkpCi0gICAgIHVuc2lnbmVkIGludCBhczEyOwotICAgICB1bnNpZ25lZCBpbnQgKngsICp5OwotewotICAqeSA9IChhczEyICYgMHg4MDApID4+IDExOwotICAqeCA9ICgoYXMxMiAmIDB4M2ZmKSA8PCAxKSB8ICgoYXMxMiAmIDB4NDAwKSA+PiAxMCk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotYXNzZW1ibGVfMTYgKHgsIHkpCi0gICAgIHVuc2lnbmVkIGludCB4LCB5OwotewotICAvKiBEZXBlbmRzIG9uIFBTVyBXLWJpdCAhKi8KLSAgdW5zaWduZWQgaW50IHRlbXA7Ci0KLSAgaWYgKEhQUEFfV0lERSkKLSAgICB0ZW1wID0gQ0FURU5BVEUgKENBVEVOQVRFIChHRVRfQklUICh5LCAxMyksIDEsCi0JCQkgICAgICAgKEdFVF9CSVQgKHksIDEzKSBeIEdFVF9CSVQgKHgsIDApKSwgMSksIDIsCi0JCSAgICAgQ0FURU5BVEUgKChHRVRfQklUICh5LCAxMykgXiBHRVRfQklUICh4LCAxKSksIDEsCi0JCQkgICAgICAgR0VUX0ZJRUxEICh5LCAwLCAxMiksIDEzKSwgMTQpOwotICBlbHNlCi0gICAgdGVtcCA9IENBVEVOQVRFIChDQVRFTkFURSAoR0VUX0JJVCAoeSwgMTMpLCAxLCBHRVRfQklUICh5LCAxMyksIDEpLCAyLAotCQkgICAgIENBVEVOQVRFIChHRVRfQklUICh5LCAxMyksIDEsIEdFVF9GSUVMRCAoeSwgMCwgMTIpLCAxMyksIDE0KTsKLQotICByZXR1cm4gc2lnbl9leHRlbmQgKHRlbXAsIDE2KTsKLX0KLQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWFzc2VtYmxlXzE2YSAoeCwgeSwgeikKLSAgICAgdW5zaWduZWQgaW50IHgsIHksIHo7Ci17Ci0gIC8qIERlcGVuZHMgb24gUFNXIFctYml0ICEqLwotICB1bnNpZ25lZCBpbnQgdGVtcDsKLQotICBpZiAoSFBQQV9XSURFKQotICAgIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKHosIDEsICh6IF4gR0VUX0JJVCAoeCwgMCkpLCAxKSwgMiwKLQkJICAgICBDQVRFTkFURSAoKHogXiBHRVRfQklUICh4LCAxKSksIDEsIHksIDExKSwgMTIpOwotICBlbHNlIAotICAgICAgdGVtcCA9IENBVEVOQVRFIChDQVRFTkFURSAoeiwgMSwgeiwgMSksIDIsIENBVEVOQVRFICh6LCAxLCB5LCAxMSksIDEyKTsKLQotICByZXR1cm4gc2lnbl9leHRlbmQgKCh0ZW1wIDw8IDIpLCAxNik7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotYXNzZW1ibGVfMTcgKHgsIHksIHopCi0gICAgIHVuc2lnbmVkIGludCB4LCB5LCB6OwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0KLSAgdGVtcCA9IENBVEVOQVRFIChDQVRFTkFURSAoeiwgMSwgeCwgNSksIDYsCi0JCSAgIENBVEVOQVRFIChHRVRfQklUICh5LCAxMCksIDEsIEdFVF9GSUVMRCAoeSwgMCwgOSksIDEwKSwgMTEpOwotICAKLSAgcmV0dXJuIHRlbXA7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotZGlzX2Fzc2VtYmxlXzE3IChhczE3LCB4LCB5LCB6KQotICAgICB1bnNpZ25lZCBpbnQgYXMxNzsKLSAgICAgdW5zaWduZWQgaW50ICp4LCAqeSwgKno7Ci17Ci0KLSAgKnogPSAoYXMxNyAmIDB4MTAwMDApID4+IDE2OwotICAqeCA9IChhczE3ICYgMHgwZjgwMCkgPj4gMTE7Ci0gICp5ID0gKCgoYXMxNyAmIDB4MDA0MDApID4+IDEwKSB8ICgoYXMxNyAmIDB4M2ZmKSA8PCAxKSkgJiAweDdmZjsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1kaXNfYXNzZW1ibGVfMjIgKGFzMjIsIGEsIGIsIGMsIGQpCi0gICAgIHVuc2lnbmVkIGludCBhczIyOwotICAgICB1bnNpZ25lZCBpbnQgKmEsICpiLCAqYywgKmQ7Ci17Ci0KLSAgKmQgPSAoYXMyMiAmIDB4MjAwMDAwKSA+PiAyMTsKLSAgKmEgPSAoYXMyMiAmIDB4MWYwMDAwKSA+PiAxNjsKLSAgKmIgPSAoYXMyMiAmIDB4MGY4MDApID4+IDExOwotICAqYyA9ICgoKGFzMjIgJiAweDAwNDAwKSA+PiAxMCkgfCAoKGFzMjIgJiAweDNmZikgPDwgMSkpICYgMHg3ZmY7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotYXNzZW1ibGVfMjEgKHgpCi0gICAgIHVuc2lnbmVkIGludCB4OwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0KLSAgdGVtcCA9ICgoeCAmIDEpIDw8IDIwKSB8Ci0gICAgKCh4ICYgMHhmZmUpIDw8IDgpIHwKLSAgICAoKHggJiAweGMwMDApID4+IDcpIHwKLSAgICAoKHggJiAweDFmMDAwMCkgPj4gMTQpIHwKLSAgICAoKHggJiAweDAwMzAwMCkgPj4gMTIpOwotICByZXR1cm4gdGVtcCAmIDB4MWZmZmZmOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWFzc2VtYmxlXzIyIChhLGIsYyxkKQotICAgICB1bnNpZ25lZCBpbnQgYSxiLGMsZDsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotICAKLSAgdGVtcCA9IENBVEVOQVRFIChDQVRFTkFURSAoZCwgMSwgYSwgNSksIDYsCi0JCSAgIENBVEVOQVRFIChiLCA1LCBFTEVWRU4gKGMpLCAxMSksIDE2KTsKLQotICByZXR1cm4gc2lnbl9leHRlbmQgKHRlbXAsIDIyKTsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1kaXNfYXNzZW1ibGVfMjEgKGFzMjEsIHgpCi0gICAgIHVuc2lnbmVkIGludCBhczIxLCAqeDsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotCi0KLSAgdGVtcCA9IChhczIxICYgMHgxMDAwMDApID4+IDIwOwotICB0ZW1wIHw9IChhczIxICYgMHgwZmZlMDApID4+IDg7Ci0gIHRlbXAgfD0gKGFzMjEgJiAweDAwMDE4MCkgPDwgNzsKLSAgdGVtcCB8PSAoYXMyMSAmIDB4MDAwMDdjKSA8PCAxNDsKLSAgdGVtcCB8PSAoYXMyMSAmIDB4MDAwMDAzKSA8PCAxMjsKLSAgKnggPSB0ZW1wOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotb25lcyAobikKLSAgICAgaW50IG47Ci17Ci0gIHVuc2lnbmVkIGludCBsZW5fb25lczsKLSAgaW50IGk7Ci0KLSAgaSA9IDA7Ci0gIGxlbl9vbmVzID0gMDsKLSAgd2hpbGUgKGkgPCBuKQotICAgIHsKLSAgICAgIGxlbl9vbmVzID0gKGxlbl9vbmVzIDw8IDEpIHwgMTsKLSAgICAgIGkrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIGxlbl9vbmVzOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLXNpZ25fdW5leHQgKHgsIGxlbiwgcmVzdWx0KQotICAgICB1bnNpZ25lZCBpbnQgeCwgbGVuOwotICAgICB1bnNpZ25lZCBpbnQgKnJlc3VsdDsKLXsKLSAgdW5zaWduZWQgaW50IGxlbl9vbmVzOwotCi0gIGxlbl9vbmVzID0gb25lcyAobGVuKTsKLQotICAqcmVzdWx0ID0geCAmIGxlbl9vbmVzOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWxvd19zaWduX2V4dGVuZCAoeCwgbGVuKQotICAgICB1bnNpZ25lZCBpbnQgeCwgbGVuOwotewotICByZXR1cm4gKGludCkoKHggJiAweDEgPyAoLTEgPDwgKGxlbiAtIDEpKSA6IDApIHwgeCA+PiAxKTsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1sb3dfc2lnbl91bmV4dCAoeCwgbGVuLCByZXN1bHQpCi0gICAgIHVuc2lnbmVkIGludCB4LCBsZW47Ci0gICAgIHVuc2lnbmVkIGludCAqcmVzdWx0OwotewotICB1bnNpZ25lZCBpbnQgdGVtcDsKLSAgdW5zaWduZWQgaW50IHNpZ247Ci0gIHVuc2lnbmVkIGludCByZXN0OwotICB1bnNpZ25lZCBpbnQgb25lX2JpdF9hdF9sZW47Ci0gIHVuc2lnbmVkIGludCBsZW5fb25lczsKLQotICBsZW5fb25lcyA9IG9uZXMgKGxlbik7Ci0gIG9uZV9iaXRfYXRfbGVuID0gMSA8PCAobGVuIC0gMSk7Ci0KLSAgc2lnbl91bmV4dCAoeCwgbGVuLCAmdGVtcCk7Ci0gIHNpZ24gPSB0ZW1wICYgb25lX2JpdF9hdF9sZW47Ci0gIHNpZ24gPj49IChsZW4gLSAxKTsKLQotICByZXN0ID0gdGVtcCAmIChsZW5fb25lcyBeIG9uZV9iaXRfYXRfbGVuKTsKLSAgcmVzdCA8PD0gMTsKLQotICAqcmVzdWx0ID0gcmVzdCB8IHNpZ247Ci19Ci0KLS8qIEhhbmRsZSBmaWVsZCBzZWxlY3RvcnMgZm9yIFBBIGluc3RydWN0aW9ucy4gICovCi0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBjb25zdGFudF92YWx1ZSwgcl9maWVsZCkKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgbG9uZyBjb25zdGFudF92YWx1ZTsKLSAgICAgdW5zaWduZWQgc2hvcnQgcl9maWVsZDsKLXsKLSAgc3dpdGNoIChyX2ZpZWxkKQotICAgIHsKLSAgICBjYXNlIGVfZnNlbDoJCS8qIEYgIDogbm8gY2hhbmdlCQkgICAgICAqLwotICAgIGNhc2UgZV9uc2VsOgkJLyogTiAgOiBubyBjaGFuZ2UJCSAgICAgICAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9sc3NlbDoJCS8qIExTIDogaWYgKGJpdCAyMSkgdGhlbiBhZGQgMHg4MDAKLQkJCQkgICBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExIGJpdHMgKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgaWYgKHZhbHVlICYgMHgwMDAwMDQwMCkKLQl2YWx1ZSArPSAweDgwMDsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9yc3NlbDoJCS8qIFJTIDogU2lnbiBleHRlbmQgZnJvbSBiaXQgMjEJKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgaWYgKHZhbHVlICYgMHgwMDAwMDQwMCkKLQl2YWx1ZSB8PSAweGZmZmZmODAwOwotICAgICAgZWxzZQotCXZhbHVlICY9IDB4N2ZmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfbHNlbDoJCS8qIEwgIDogQXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzICovCi0gICAgY2FzZSBlX25sc2VsOgkJLyogTkwgIDogQXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzICovCi0gICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9yc2VsOgkJLyogUiAgOiBTZXQgYml0cyAwLTIwIHRvIHplcm8JICAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICB2YWx1ZSA9IHZhbHVlICYgMHg3ZmY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9sZHNlbDoJCS8qIExEIDogQWRkIDB4ODAwLCBhcml0aG1ldGljIHNoaWZ0Ci0JCQkJICAgcmlnaHQgMTEgYml0cwkJICAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICB2YWx1ZSArPSAweDgwMDsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9yZHNlbDoJCS8qIFJEIDogU2V0IGJpdHMgMC0yMCB0byBvbmUJICAgKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgdmFsdWUgfD0gMHhmZmZmZjgwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX2xyc2VsOgkJLyogTFIgOiBMIHdpdGggInJvdW5kZWQiIGNvbnN0YW50ICAgICAgKi8KLSAgICBjYXNlIGVfbmxyc2VsOgkJLyogTkxSIDogTkwgd2l0aCAicm91bmRlZCIgY29uc3RhbnQgICAgICAqLwotICAgICAgdmFsdWUgPSB2YWx1ZSArICgoY29uc3RhbnRfdmFsdWUgKyAweDEwMDApICYgMHhmZmZmZTAwMCk7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfcnJzZWw6CQkvKiBSUiA6IFIgd2l0aCAicm91bmRlZCIgY29uc3RhbnQgICAgICAqLwotICAgICAgdmFsdWUgPSB2YWx1ZSArICgoY29uc3RhbnRfdmFsdWUgKyAweDEwMDApICYgMHhmZmZmZTAwMCk7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4N2ZmKSArIGNvbnN0YW50X3ZhbHVlIC0gKChjb25zdGFudF92YWx1ZSArIDB4MTAwMCkgJiAweGZmZmZlMDAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotCi19Ci0KLS8qIFBBLVJJU0MgT1BDT0RFUyAqLwotI2RlZmluZSBnZXRfb3Bjb2RlKGluc24pCSgoaW5zbikgJiAweGZjMDAwMDAwKSA+PiAyNgotCi0vKiBGSVhNRTogdGhpcyBsaXN0IGlzIGluY29tcGxldGUuICBJdCBzaG91bGQgYWxzbyBiZSBhbiBlbnVtZXJhdGVkCi0gICB0eXBlIHJhdGhlciB0aGFuICNkZWZpbmVzLiAgKi8KLQotI2RlZmluZSBMRE8JMHgwZAotI2RlZmluZSBMREIJMHgxMAotI2RlZmluZSBMREgJMHgxMQotI2RlZmluZSBMRFcJMHgxMgotI2RlZmluZSBMRFdNCTB4MTMKLSNkZWZpbmUgU1RCCTB4MTgKLSNkZWZpbmUgU1RICTB4MTkKLSNkZWZpbmUgU1RXCTB4MWEKLSNkZWZpbmUgU1RXTQkweDFiCi0jZGVmaW5lIENPTUlDTFIJMHgyNAotI2RlZmluZSBTVUJJCTB4MjUKLSNkZWZpbmUgU1VCSU8JMHgyNQotI2RlZmluZSBBRERJVAkweDJjCi0jZGVmaW5lIEFERElUTwkweDJjCi0jZGVmaW5lIEFEREkJMHgyZAotI2RlZmluZSBBRERJTwkweDJkCi0jZGVmaW5lIExESUwJMHgwOAotI2RlZmluZSBBRERJTAkweDBhCi0KLSNkZWZpbmUgTU9WQgkweDMyCi0jZGVmaW5lIE1PVklCCTB4MzMKLSNkZWZpbmUgQ09NQlQJMHgyMAotI2RlZmluZSBDT01CRgkweDIyCi0jZGVmaW5lIENPTUlCVAkweDIxCi0jZGVmaW5lIENPTUlCRgkweDIzCi0jZGVmaW5lIEFEREJUCTB4MjgKLSNkZWZpbmUgQUREQkYJMHgyYQotI2RlZmluZSBBRERJQlQJMHgyOQotI2RlZmluZSBBRERJQkYJMHgyYgotI2RlZmluZSBCVkIJMHgzMAotI2RlZmluZSBCQgkweDMxCi0KLSNkZWZpbmUgQkwJMHgzYQotI2RlZmluZSBCTEUJMHgzOQotI2RlZmluZSBCRQkweDM4Ci0KLSNkZWZpbmUgQ01QQkRUCTB4MjcKLSNkZWZpbmUgQ01QQkRGCTB4MmYKLSNkZWZpbmUgQ01QSUJECTB4M2IKLSNkZWZpbmUgTERECTB4MTQKLSNkZWZpbmUgU1RECTB4MWMKLSNkZWZpbmUgTERXTAkweDE3Ci0jZGVmaW5lIFNUV0wJMHgxZgotI2RlZmluZSBGRExXICAgIDB4MTYKLSNkZWZpbmUgRlNUVyAgICAweDFlCi0gIAotLyogR2l2ZW4gYSBtYWNoaW5lIGluc3RydWN0aW9uLCByZXR1cm4gaXRzIGZvcm1hdC4KLQotICAgRklYTUU6ICBvcGNvZGVzIHdoaWNoIGRvIG5vdCBtYXAgdG8gYSBrbm93biBmb3JtYXQKLSAgIHNob3VsZCByZXR1cm4gYW4gZXJyb3Igb2Ygc29tZSBzb3J0LiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWJmZF9ocHBhX2luc24yZm10IChpbnNuKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci17Ci0gIGludCBmbXQgPSAtMTsKLSAgdW5zaWduZWQgY2hhciBvcCA9IGdldF9vcGNvZGUgKGluc24pOwotICAKLSAgc3dpdGNoIChvcCkKLSAgICB7Ci0gICAgY2FzZSBBRERJOgotICAgIGNhc2UgQURESVQ6Ci0gICAgY2FzZSBTVUJJOgotICAgICAgZm10ID0gMTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1PVkI6Ci0gICAgY2FzZSBNT1ZJQjoKLSAgICBjYXNlIENPTUJUOgotICAgIGNhc2UgQ09NQkY6Ci0gICAgY2FzZSBDT01JQlQ6Ci0gICAgY2FzZSBDT01JQkY6Ci0gICAgY2FzZSBBRERCVDoKLSAgICBjYXNlIEFEREJGOgotICAgIGNhc2UgQURESUJUOgotICAgIGNhc2UgQURESUJGOgotICAgIGNhc2UgQlZCOgotICAgIGNhc2UgQkI6Ci0gICAgY2FzZSBDTVBCRFQ6Ci0gICAgY2FzZSBDTVBCREY6Ci0gICAgY2FzZSBDTVBJQkQ6Ci0gICAgICBmbXQgPSAxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTERPOgotICAgIGNhc2UgTERCOgotICAgIGNhc2UgTERIOgotICAgIGNhc2UgTERXOgotICAgIGNhc2UgTERXTToKLSAgICBjYXNlIFNUQjoKLSAgICBjYXNlIFNUSDoKLSAgICBjYXNlIFNUVzoKLSAgICBjYXNlIFNUV006Ci0gICAgICBmbXQgPSAxNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTERXTDoKLSAgICBjYXNlIFNUV0w6Ci0gICAgY2FzZSBGRExXOgotICAgIGNhc2UgRlNUVzoKLSAgICAgIC8qIFRoaXMgaXMgYSBoYWNrLiAgVW5mb3J0dW5hdGVseSwgZm9ybWF0IDExIGlzIGFscmVhZHkgdGFrZW4KLQkgYW5kIHdlJ3JlIHVzaW5nIGludGVnZXJzIHJhdGhlciB0aGFuIGFuIGVudW0sIHNvIGl0J3MgaGFyZAotCSB0byBkZXNjcmliZSB0aGUgMTBhIGZvcm1hdC4gICovCi0gICAgICBmbXQgPSAtMTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExERDoKLSAgICBjYXNlIFNURDoKLSAgICAgIGZtdCA9IDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCTDoKLSAgICBjYXNlIEJFOgotICAgIGNhc2UgQkxFOgotICAgICAgaWYgKChpbnNuICYgMHgwMDAwODAwMCkgPT0gMHgwMDAwODAwMCkKLQlyZXR1cm4gMjI7Ci0gICAgICBmbXQgPSAxNzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTERJTDoKLSAgICBjYXNlIEFERElMOgotICAgICAgZm10ID0gMjE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZm10ID0gMzI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmbXQ7Ci19Ci0KLQotLyogSW5zZXJ0IFZBTFVFIGludG8gSU5TTiB1c2luZyBSX0ZPUk1BVCB0byBkZXRlcm1pbmUgZXhhY3RseSB3aGF0Ci0gICBiaXRzIHRvIGNoYW5nZS4gICovCi0gICAKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotaHBwYV9yZWJ1aWxkX2luc24gKGFiZmQsIGluc24sIHZhbHVlLCByX2Zvcm1hdCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgbG9uZyByX2Zvcm1hdDsKLXsKLSAgdW5zaWduZWQgbG9uZyBjb25zdF9wYXJ0OwotICB1bnNpZ25lZCBsb25nIHJlYnVpbHRfcGFydDsKLQotICBzd2l0Y2ggKHJfZm9ybWF0KQotICAgIHsKLSAgICBjYXNlIDExOgotICAgICAgewotCXVuc2lnbmVkIHcxLCB3OwotCi0JY29uc3RfcGFydCA9IGluc24gJiAweGZmZmZlMDAyOwotCWRpc19hc3NlbWJsZV8xMiAodmFsdWUsICZ3MSwgJncpOwotCXJlYnVpbHRfcGFydCA9ICh3MSA8PCAyKSB8IHc7Ci0JcmV0dXJuIGNvbnN0X3BhcnQgfCByZWJ1aWx0X3BhcnQ7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDEyOgotICAgICAgewotCXVuc2lnbmVkIHcxLCB3OwotCi0JY29uc3RfcGFydCA9IGluc24gJiAweGZmZmZlMDAyOwotCWRpc19hc3NlbWJsZV8xMiAodmFsdWUsICZ3MSwgJncpOwotCXJlYnVpbHRfcGFydCA9ICh3MSA8PCAyKSB8IHc7Ci0JcmV0dXJuIGNvbnN0X3BhcnQgfCByZWJ1aWx0X3BhcnQ7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDE0OgotICAgICAgewotCXVuc2lnbmVkIGludCBleHQ7Ci0JCi0JY29uc3RfcGFydCA9IGluc24gJiAweGZmZmZjMDAwOwotCWxvd19zaWduX3VuZXh0ICh2YWx1ZSwgMTQsICZleHQpOwotCXJldHVybiBjb25zdF9wYXJ0IHwgZXh0OwotICAgICAgfQotCi0gICAgY2FzZSAxNzoKLSAgICAgIHsKLQl1bnNpZ25lZCB3MSwgdzIsIHc7Ci0KLQljb25zdF9wYXJ0ID0gaW5zbiAmIDB4ZmZlMGUwMDI7Ci0JZGlzX2Fzc2VtYmxlXzE3ICh2YWx1ZSwgJncxLCAmdzIsICZ3KTsKLQlyZWJ1aWx0X3BhcnQgPSAodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdzsKLQlyZXR1cm4gY29uc3RfcGFydCB8IHJlYnVpbHRfcGFydDsKLSAgICAgIH0KLQotICAgIGNhc2UgMjE6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IHc7Ci0KLQljb25zdF9wYXJ0ID0gaW5zbiAmIDB4ZmZlMDAwMDA7Ci0JZGlzX2Fzc2VtYmxlXzIxICh2YWx1ZSwgJncpOwotCXJldHVybiBjb25zdF9wYXJ0IHwgdzsKLSAgICAgIH0KLQotICAgIGNhc2UgMzI6Ci0gICAgICBjb25zdF9wYXJ0ID0gMDsKLSAgICAgIHJldHVybiB2YWx1ZTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIHJldHVybiBpbnNuOwotfQotCi0jZW5kaWYgLyogX0hQUEFfSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2xpYmllZWUuaCBiL2JmZC9saWJpZWVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZTgwNmUuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmllZWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKiBJRUVFLTY5NSBvYmplY3QgZmlsZSBmb3JtYXRzOiAgZGVmaW5pdGlvbnMgaW50ZXJuYWwgdG8gQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LiAgTW9zdGx5IFN0ZXZlIENoYW1iZXJsYWluJ3MgZmF1bHQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBpbnQgaW5kZXg6MjQ7Ci0gIGNoYXIgbGV0dGVyOwotfSBpZWVlX3N5bWJvbF9pbmRleF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBjdCB7Ci0gIGJmZCAqdGhpczsKLSAgc3RydWN0IGN0ICpuZXh0OwotfSBiZmRfY2hhaW5fdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9zeW1ib2wgCi17Ci0gIGFzeW1ib2wgc3ltYm9sOwotICBzdHJ1Y3QgaWVlZV9zeW1ib2wgKm5leHQ7Ci0KLSAgdW5zaWduZWQgaW50IGluZGV4OwotfSBpZWVlX3N5bWJvbF90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IGllZWVfcmVsb2MgewotICBhcmVsZW50IHJlbGVudDsKLSAgc3RydWN0IGllZWVfcmVsb2MgKm5leHQ7Ci0gIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3ltYm9sOwotCi19IGllZWVfcmVsb2NfdHlwZTsKLQotI2RlZmluZSBpZWVlX3N5bWJvbCh4KSAoKGllZWVfc3ltYm9sX3R5cGUgKikoeCkpCi0KLXR5cGVkZWYgc3RydWN0IGllZWVfcGVyX3NlY3Rpb24KLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGJmZF9ieXRlICpkYXRhOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYmZkX3ZtYSBwYzsKLSAgLyogRm9yIG91dHB1dCAqLwotICBmaWxlX3B0ciBjdXJyZW50X3BvczsKLSAgdW5zaWduZWQgaW50IGN1cnJlbnRfYnl0ZTsKLSAgYm9vbGVhbiBpbml0aWFsaXplZDsKLSAgaWVlZV9yZWxvY190eXBlICoqcmVsb2NfdGFpbF9wdHI7Ci19IGllZWVfcGVyX3NlY3Rpb25fdHlwZTsKLQotI2RlZmluZSBpZWVlX3Blcl9zZWN0aW9uKHgpICgoaWVlZV9wZXJfc2VjdGlvbl90eXBlICopKCh4KS0+dXNlZF9ieV9iZmQpKQotICAKLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgIGNoYXIgKmlucHV0X3A7Ci0gIHVuc2lnbmVkIGNoYXIgKmZpcnN0X2J5dGU7Ci0gIGJmZCAqYWJmZDsKLX0gY29tbW9uX2hlYWRlcl90eXBlIDsKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9kYXRhX3N0cnVjdAotewotICBjb21tb25faGVhZGVyX3R5cGUgaDsKLSAgYm9vbGVhbiByZWFkX3N5bWJvbHM7Ci0gIGJvb2xlYW4gcmVhZF9kYXRhOwkKLSAgZmlsZV9wdHIgb3V0cHV0X2N1cnNvcjsKLSAgLyogTWFwIG9mIHNlY3Rpb24gaW5kZXhlcyB0byBzZWN0aW9uIHB0cnMgKi8KLSAgYXNlY3Rpb24gKipzZWN0aW9uX3RhYmxlOwotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl90YWJsZV9zaXplOwotICBpZWVlX2FkZHJlc3NfZGVzY3JpcHRvcl90eXBlIGFkOwotICBpZWVlX21vZHVsZV9iZWdpbl90eXBlIG1iOwotICBpZWVlX3dfdmFyaWFibGVfdHlwZSB3OwotICAKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fY291bnQ7Ci0gIAotICB1bnNpZ25lZCBpbnQgbWFwX2lkeDsKLSAgLyogTGlzdCBvZiBHTE9CQUwgRVhQT1JUIHN5bWJvbHMgKi8KLSAgaWVlZV9zeW1ib2xfdHlwZSAqZXh0ZXJuYWxfc3ltYm9sczsKLSAgLyogTGlzdCBvZiBVTkRFRklORUQgc3ltYm9scyAqLwotICBpZWVlX3N5bWJvbF90eXBlICpleHRlcm5hbF9yZWZlcmVuY2U7Ci0gIAotICAvKiBXaGVuIHRoZSBzeW1ib2xzIGhhdmUgYmVlbiBjYW5vbmljYWxpemVkLCB0aGV5IGFyZSBpbiBhCi0gICAgKiBzcGVjaWFsIG9yZGVyLCB3ZSByZW1lbWJlciB2YXJpb3VzIGJhc2VzIGhlcmUuLiAqLwotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleDsKLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3N5bWJvbF9taW5faW5kZXg7Ci0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9zeW1ib2xfY291bnQ7Ci0gIGludCBleHRlcm5hbF9zeW1ib2xfYmFzZV9vZmZzZXQ7Ci0gIAotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleDsKLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3JlZmVyZW5jZV9taW5faW5kZXg7Ci0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9yZWZlcmVuY2VfY291bnQ7Ci0gIGludCBleHRlcm5hbF9yZWZlcmVuY2VfYmFzZV9vZmZzZXQ7Ci0gIAotCi0gIGJvb2xlYW4gc3ltYm9sX3RhYmxlX2Z1bGw7Ci0KLSAgCi1ib29sZWFuIGRvbmVfZGVidWc7Ci0KLQotYmZkX2NoYWluX3R5cGUgKmNoYWluX2hlYWQ7Ci1iZmRfY2hhaW5fdHlwZSAqY2hhaW5fcm9vdDsKLQotfSBpZWVlX2RhdGFfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBmaWxlX3B0ciBmaWxlX29mZnNldDsKLSAgYmZkICphYmZkOwotfSBpZWVlX2FyX29ic3RhY2tfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9hcl9kYXRhX3N0cnVjdCAKLXsKLSAgY29tbW9uX2hlYWRlcl90eXBlIGg7Ci0gIGllZWVfYXJfb2JzdGFja190eXBlICplbGVtZW50czsKLSAgCi0gIHVuc2lnbmVkICBpbnQgZWxlbWVudF9pbmRleCA7Ci0gIHVuc2lnbmVkIGludCBlbGVtZW50X2NvdW50OwotCi19IGllZWVfYXJfZGF0YV90eXBlOwotCi0jZGVmaW5lIElFRUVfREFUQShhYmZkKSAoKGFiZmQpLT50ZGF0YS5pZWVlX2RhdGEpCi0jZGVmaW5lIElFRUVfQVJfREFUQShhYmZkKSAoKGFiZmQpLT50ZGF0YS5pZWVlX2FyX2RhdGEpCi0KLSNkZWZpbmUgcHRyKGFiZmQpIChpZWVlX2RhdGEoYWJmZCktPmlucHV0X3ApCmRpZmYgLS1naXQgYS9iZmQvbGlibmxtLmggYi9iZmQvbGlibmxtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZDJlNGUuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYm5sbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBkYXRhIHN0cnVjdHVyZXMgZm9yIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGVzKSBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfTElCTkxNX0hfCi0jZGVmaW5lIF9MSUJOTE1fSF8gMQotCi0jaWZkZWYgQVJDSF9TSVpFCi0jICBkZWZpbmUgTkxNX0FSQ0hfU0laRSBBUkNIX1NJWkUKLSNlbmRpZgotI2luY2x1ZGUgIm5sbS9jb21tb24uaCIKLSNpbmNsdWRlICJubG0vaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJubG0vZXh0ZXJuYWwuaCIKLQotLyogQSByZWxvYyBmb3IgYW4gaW1wb3J0ZWQgTkxNIHN5bWJvbC4gIE5vcm1hbCByZWxvY3MgYXJlIGFzc29jaWF0ZWQKLSAgIHdpdGggc2VjdGlvbnMsIGFuZCBpbmNsdWRlIGEgc3ltYm9sLiAgVGhlc2UgcmVsb2NzIGFyZSBhc3NvY2lhdGVkCi0gICB3aXRoICh1bmRlZmluZWQpIHN5bWJvbHMsIGFuZCBpbmNsdWRlIGEgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBubG1fcmVsZW50Ci17Ci0gIC8qIFNlY3Rpb24gb2YgcmVsb2MuICAqLwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgLyogUmVsb2MgaW5mbyAoc3ltX3B0cl9wdHIgZmllbGQgc2V0IG9ubHkgd2hlbiBjYW5vbmljYWxpemVkKS4gICovCi0gIGFyZWxlbnQgcmVsb2M7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhbiBOTE0gc3ltYm9sLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQkZEIHN5bWJvbC4gICovCi0gIGFzeW1ib2wgc3ltYm9sOwotICAvKiBOdW1iZXIgb2YgcmVsb2MgZW50cmllcyBmb3IgaW1wb3J0ZWQgc3ltYm9sLiAgKi8KLSAgYmZkX3NpemVfdHlwZSByY250OwotICAvKiBBcnJheSBvZiByZWxvYyBpbmZvcm1hdGlvbiBmb3IgaW1wb3J0ZWQgc3ltYm9sLiAgKi8KLSAgc3RydWN0IG5sbV9yZWxlbnQgKnJlbG9jczsKLX0gbmxtTkFNRShzeW1ib2xfdHlwZSk7Ci0KLWV4dGVybiBib29sZWFuIG5sbV9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gbmxtX3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLQkJCQkJICB1bnNpZ25lZCBsb25nKSk7Ci0KLWV4dGVybiB2b2lkIG5sbU5BTUUoZ2V0X3N5bWJvbF9pbmZvKQotICAgICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7Ci1leHRlcm4gbG9uZyBubG1OQU1FKGdldF9zeW10YWJfdXBwZXJfYm91bmQpCi0gICAgIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBubG1OQU1FKGdldF9zeW10YWIpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gYXN5bWJvbCAqbmxtTkFNRShtYWtlX2VtcHR5X3N5bWJvbCkKLSAgICAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIG5sbU5BTUUocHJpbnRfc3ltYm9sKQotICAgICBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotZXh0ZXJuIGxvbmcgbmxtTkFNRShnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gbG9uZyBubG1OQU1FKGNhbm9uaWNhbGl6ZV9yZWxvYykKLSAgICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpubG1OQU1FKG9iamVjdF9wKQotICAgICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gbmxtTkFNRShzZXRfYXJjaF9tYWNoKQotICAgICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7Ci1leHRlcm4gYm9vbGVhbiBubG1OQU1FKHNldF9zZWN0aW9uX2NvbnRlbnRzKQotICAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotZXh0ZXJuIGJvb2xlYW4gbmxtTkFNRSh3cml0ZV9vYmplY3RfY29udGVudHMpCi0gICAgIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFNvbWUgcHJpdmF0ZSBkYXRhIGlzIHN0YXNoZWQgYXdheSBmb3IgZnV0dXJlIHVzZSB1c2luZyB0aGUgdGRhdGEgcG9pbnRlcgotICAgaW4gdGhlIGJmZCBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgbmxtX29ial90ZGF0YQotewotICAvKiBBY3R1YWwgZGF0YSwgYnV0IHJlZiBsaWtlIHB0ciAqLwotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyCW5sbV9maXhlZF9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIJbmxtX3ZhcmlhYmxlX2hkclsxXTsKLSAgTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyCW5sbV92ZXJzaW9uX2hkclsxXTsKLSAgTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIJbmxtX2NvcHlyaWdodF9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIJbmxtX2V4dGVuZGVkX2hkclsxXTsKLSAgTmxtX0ludGVybmFsX0N1c3RvbV9IZWFkZXIJbmxtX2N1c3RvbV9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlciBubG1fY3lnbnVzX2V4dF9oZHJbMV07Ci0gIC8qIEJGRCBOTE0gc3ltYm9scy4gICovCi0gIG5sbU5BTUUoc3ltYm9sX3R5cGUpCQkqbmxtX3N5bWJvbHM7Ci0gIC8qIExvd2VzdCB0ZXh0IGFuZCBkYXRhIFZNQSB2YWx1ZXMuICAqLwotICBiZmRfdm1hCQkJbmxtX3RleHRfbG93OwotICBiZmRfdm1hCQkJbmxtX2RhdGFfbG93OwotICAvKiBDYWNoZXMgZm9yIGRhdGEgcmVhZCBmcm9tIG9iamVjdCBmaWxlLiAgKi8KLSAgYXJlbGVudCAqCQkJbmxtX3JlbG9jX2ZpeHVwczsKLSAgYXNlY3Rpb24gKioJCQlubG1fcmVsb2NfZml4dXBfc2VjczsKLSAgLyogQmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGEgcG9pbnRlciwKLSAgICAgYnV0IHRoYXQgd291bGQgcmVxdWlyZSB5ZXQgYW5vdGhlciBlbnRyeSBwb2ludCB0byBpbml0aWFsaXplIHRoZQotICAgICBzdHJ1Y3R1cmUuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdAkvKiBBbHBoYSBiYWNrZW5kIGluZm9ybWF0aW9uLiAgKi8KLQl7Ci0JICBiZmRfdm1hIGdwOwkJCS8qIEdQIHZhbHVlLiAgKi8KLQkgIGJmZF92bWEgbGl0YV9hZGRyZXNzOwkJLyogLmxpdGEgc2VjdGlvbiBhZGRyZXNzLiAgKi8KLQkgIGJmZF9zaXplX3R5cGUgbGl0YV9zaXplOwkvKiAubGl0YSBzZWN0aW9uIHNpemUuICAqLwotCX0KLSAgICAgIGFscGhhX2JhY2tlbmRfZGF0YTsKLSAgICB9Ci0gIGJhY2tlbmRfZGF0YTsKLX07Ci0KLSNkZWZpbmUgbmxtX3RkYXRhKGJmZCkJCQkoKGJmZCkgLT4gdGRhdGEubmxtX29ial9kYXRhKQotI2RlZmluZSBubG1fZml4ZWRfaGVhZGVyKGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fZml4ZWRfaGRyKQotI2RlZmluZSBubG1fdmFyaWFibGVfaGVhZGVyKGJmZCkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV92YXJpYWJsZV9oZHIpCi0jZGVmaW5lIG5sbV92ZXJzaW9uX2hlYWRlcihiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3ZlcnNpb25faGRyKQotI2RlZmluZSBubG1fY29weXJpZ2h0X2hlYWRlcihiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fY29weXJpZ2h0X2hkcikKLSNkZWZpbmUgbmxtX2V4dGVuZGVkX2hlYWRlcihiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fZXh0ZW5kZWRfaGRyKQotI2RlZmluZSBubG1fY3VzdG9tX2hlYWRlcihiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2N1c3RvbV9oZHIpCi0jZGVmaW5lIG5sbV9jeWdudXNfZXh0X2hlYWRlcihiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fY3lnbnVzX2V4dF9oZHIpCi0jZGVmaW5lIG5sbV9nZXRfc3ltYm9scyhiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3N5bWJvbHMpCi0jZGVmaW5lIG5sbV9zZXRfc3ltYm9scyhiZmQsIHApCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3N5bWJvbHMgPSAocCkpCi0jZGVmaW5lIG5sbV9zZXRfdGV4dF9sb3coYmZkLCBpKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3RleHRfbG93ID0gKGkpKQotI2RlZmluZSBubG1fZ2V0X3RleHRfbG93KGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fdGV4dF9sb3cpCi0jZGVmaW5lIG5sbV9zZXRfZGF0YV9sb3coYmZkLCBpKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2RhdGFfbG93ID0gKGkpKQotI2RlZmluZSBubG1fZ2V0X2RhdGFfbG93KGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fZGF0YV9sb3cpCi0jZGVmaW5lIG5sbV9yZWxvY2F0aW9uX2ZpeHVwcyhiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fcmVsb2NfZml4dXBzKQotI2RlZmluZSBubG1fcmVsb2NhdGlvbl9maXh1cF9zZWNzKGJmZCkJKG5sbV90ZGF0YShiZmQpLT5ubG1fcmVsb2NfZml4dXBfc2VjcykKLQotI2RlZmluZSBubG1fYWxwaGFfYmFja2VuZF9kYXRhKGJmZCkgXAotICAoJm5sbV90ZGF0YSAoYmZkKS0+YmFja2VuZF9kYXRhLmFscGhhX2JhY2tlbmRfZGF0YSkKLQotLyogVGhpcyBpcyB1c2VkIHdoZW4gd3JpdGluZyBvdXQgdGhlIGV4dGVybmFsIHJlbG9jcy4gKi8KLQotc3RydWN0IHJlbG9jX2FuZF9zZWMKLXsKLSAgYXJlbGVudCAqcmVsOwotICBhc2VjdGlvbiAqc2VjOwotfTsKLQotLyogV2Ugc3RvcmUgc29tZSBmdW5jdGlvbiBwb2ludGVyIGluIHRoZSBiYWNrZW5kIHN0cnVjdHVyZS4gIFRoaXMgbGV0cwotICAgZGlmZmVyZW50IE5MTSB0YXJnZXRzIHNoYXJlIG1vc3Qgb2YgdGhlIHNhbWUgY29kZSwgd2hpbGUgcHJvdmlkaW5nCi0gICBzbGlnaHRseSBkaWZmZXJlbnQgY29kZSB3aGVyZSBuZWNlc3NhcnkuICAqLwotCi1zdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YQotewotICAvKiBTaWduYXR1cmUgZm9yIHRoaXMgYmFja2VuZC4gICovCi0gIGNoYXIgc2lnbmF0dXJlW05MTV9TSUdOQVRVUkVfU0laRV07Ci0gIC8qIFNpemUgb2YgdGhlIGZpeGVkIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgZml4ZWRfaGVhZGVyX3NpemU7Ci0gIC8qIFNpemUgb2Ygb3B0aW9uYWwgcHJlZml4IGZvciB0aGlzIGJhY2tlbmQuICBTb21lIGJhY2tlbmQgbWF5Ci0gICAgIHJlcXVpcmUgdGhpcyB0byBiZSBhIGZ1bmN0aW9uLCBidXQgc28gZmFyIGEgY29uc3RhbnQgaXMgT0suICBUaGlzCi0gICAgIGlzIGZvciBhIHByZWZpeCB3aGljaCBwcmVjZWRlcyB0aGUgc3RhbmRhcmQgTkxNIGZpeGVkIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgb3B0aW9uYWxfcHJlZml4X3NpemU7Ci0gIC8qIEFyY2hpdGVjdHVyZS4gICovCi0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAvKiBNYWNoaW5lLiAgKi8KLSAgbG9uZyBtYWNoOwotICAvKiBTb21lIE5MTSBmb3JtYXRzIGRvIG5vdCB1c2UgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uLCBzbwotICAgICBhbGwgdW5pbml0aWFsaXplZCBkYXRhIG11c3QgYmUgcHV0IGludG8gdGhlIHJlZ3VsYXIgZGF0YSBzZWN0aW9uCi0gICAgIGluc3RlYWQuICAqLwotICBib29sZWFuIG5vX3VuaW5pdGlhbGl6ZWRfZGF0YTsKLSAgLyogU29tZSBOTE0gZm9ybWF0cyBoYXZlIGEgcHJlZml4IG9uIHRoZSBmaWxlLiAgSWYgdGhpcyBmdW5jdGlvbiBpcwotICAgICBub3QgTlVMTCwgaXQgd2lsbCBiZSBjYWxsZWQgYnkgbmxtX29iamVjdF9wLiAgSXQgc2hvdWxkIHJldHVybgotICAgICB0cnVlIGlmIHRoaXMgZmlsZSBjb3VsZCBtYXRjaCB0aGlzIGZvcm1hdCwgYW5kIGl0IHNob3VsZCBsZWF2ZQotICAgICB0aGUgQkZEIHN1Y2ggdGhhdCBhIGJmZF9yZWFkIHdpbGwgcGljayB1cCB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLSAgYm9vbGVhbiAoKm5sbV9iYWNrZW5kX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotICAvKiBXcml0ZSBvdXQgdGhlIHByZWZpeC4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIE5VTEwuICBUaGlzIG11c3QKLSAgICAgd3JpdGUgb3V0IHRoZSBzYW1lIG51bWJlciBvZiBieXRlcyBhcyBpcyBpbiB0aGUgZmllbGQKLSAgICAgb3B0aW9uYWxfcHJlZml4X3NpemUuICAqLwotICBib29sZWFuICgqbmxtX3dyaXRlX3ByZWZpeCkgUEFSQU1TICgoYmZkICopKTsKLSAgLyogUmVhZCBhIHJlbG9jYXRpb24gZml4dXAgZnJvbSBhYmZkLiAgVGhlIHJlbG9jIGluZm9ybWF0aW9uIGlzCi0gICAgIG1hY2hpbmUgc3BlY2lmaWMuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBzeW1ib2wgaWYgdGhpcyBpcwotICAgICBhbiBpbXBvcnQsIG9yIE5VTEwgaWYgdGhpcyBpcyBhIHJlbG9jIGZpeHVwLiAgVGhpcyBmdW5jdGlvbgotICAgICBzaG91bGQgc2V0IHRoZSB0aGlyZCBhcmd1bWVudCB0byB0aGUgc2VjdGlvbiB3aGljaCB0aGUgcmVsb2MKLSAgICAgYmVsb25ncyBpbiwgYW5kIHRoZSBmb3VydGggYXJndW1lbnQgdG8gdGhlIHJlbG9jIGl0c2VsZjsgaXQgZG9lcwotICAgICBub3QgbmVlZCB0byBmaWxsIGluIHRoZSBzeW1fcHRyX3B0ciBmaWVsZCBmb3IgYSByZWxvYyBhZ2FpbnN0IGFuCi0gICAgIGltcG9ydCBzeW1ib2wuICAqLwotICBib29sZWFuICgqbmxtX3JlYWRfcmVsb2MpIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqLAotCQkJCSAgICAgYXNlY3Rpb24gKiosIGFyZWxlbnQgKikpOwotICAvKiBUbyBtYWtlIG9iamNvcHkgdG8gYW4gaTM4NiBOTE0gd29yaywgdGhlIGkzODYgYmFja2VuZCBuZWVkcyBhCi0gICAgIGNoYW5jZSB0byB3b3JrIG92ZXIgdGhlIHJlbG9jcy4gIFRoaXMgaXMgYSBiaXQgaWNreS4gICovCi0gIGJvb2xlYW4gKCpubG1fbWFuZ2xlX3JlbG9jcykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBkYXRhLAotCQkJCQliZmRfdm1hIG9mZnNldCwKLQkJCQkJYmZkX3NpemVfdHlwZSBjb3VudCkpOwotICAvKiBSZWFkIGFuIGltcG9ydCByZWNvcmQgZnJvbSBhYmZkLiAgSXQgd291bGQgYmUgbmljZSBpZiB0aGlzCi0gICAgIHdlcmUgaW4gYSBtYWNoaW5lLWRlcGVuZGVudCBmb3JtYXQsIGJ1dCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUuICovCi0gIGJvb2xlYW4gKCpubG1fcmVhZF9pbXBvcnQpIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci0gIC8qIFdyaXRlIGFuIGltcG9ydCByZWNvcmQgdG8gYWJmZC4gKi8KLSAgYm9vbGVhbiAoKm5sbV93cml0ZV9pbXBvcnQpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLSAgLyogU2V0IHRoZSBzZWN0aW9uIGZvciBhIHB1YmxpYyBzeW1ib2wuICBUaGlzIG1heSBiZSBOVUxMLCBpbiB3aGljaAotICAgICBjYXNlIGEgZGVmYXVsdCBtZXRob2Qgd2lsbCBiZSB1c2VkLiAgKi8KLSAgYm9vbGVhbiAoKm5sbV9zZXRfcHVibGljX3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci0gIC8qIEdldCB0aGUgb2Zmc2V0IHRvIHdyaXRlIG91dCBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgVGhpcyBtYXkgYmUKLSAgICAgTlVMTCwgaW4gd2hpY2ggY2FzZSBhIGRlZmF1bHQgbWV0aG9kIHdpbGwgYmUgdXNlZC4gICovCi0gIGJmZF92bWEgKCpubG1fZ2V0X3B1YmxpY19vZmZzZXQpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLSAgLyogU3dhcCB0aGUgZml4ZWQgaGVhZGVyIGluIGFuZCBvdXQgKi8KLSAgdm9pZCAoKm5sbV9zd2FwX2ZoZHJfaW4pIFBBUkFNUyAoKGJmZCAqLAotCQkJCSAgICBQVFIsCi0JCQkJICAgIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKikpOwotICB2b2lkICgqbmxtX3N3YXBfZmhkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLAotCQkJCSAgICAgc3RydWN0IG5sbV9pbnRlcm5hbF9maXhlZF9oZWFkZXIgKiwKLQkJCQkgICAgIFBUUikpOwotICAvKiBXcml0ZSBvdXQgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlLiAgKi8KLSAgYm9vbGVhbiAoKm5sbV93cml0ZV9leHRlcm5hbCkgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsCi0JCQkJCSBhc3ltYm9sICosCi0JCQkJCSBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSk7Ci0gIGJvb2xlYW4gKCpubG1fd3JpdGVfZXhwb3J0KSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmRfdm1hKSk7Ci19OwotCi0jZGVmaW5lIG5sbV9iYWNrZW5kKGJmZCkgXAotICAoKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhICopKChiZmQpIC0+IHh2ZWMgLT4gYmFja2VuZF9kYXRhKSkKLSNkZWZpbmUgbmxtX3NpZ25hdHVyZShiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gc2lnbmF0dXJlKQotI2RlZmluZSBubG1fZml4ZWRfaGVhZGVyX3NpemUoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IGZpeGVkX2hlYWRlcl9zaXplKQotI2RlZmluZSBubG1fb3B0aW9uYWxfcHJlZml4X3NpemUoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG9wdGlvbmFsX3ByZWZpeF9zaXplKQotI2RlZmluZSBubG1fYXJjaGl0ZWN0dXJlKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBhcmNoKQotI2RlZmluZSBubG1fbWFjaGluZShiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbWFjaCkKLSNkZWZpbmUgbmxtX25vX3VuaW5pdGlhbGl6ZWRfZGF0YShiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbm9fdW5pbml0aWFsaXplZF9kYXRhKQotI2RlZmluZSBubG1fYmFja2VuZF9vYmplY3RfcF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fYmFja2VuZF9vYmplY3RfcCkKLSNkZWZpbmUgbmxtX3dyaXRlX3ByZWZpeF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fd3JpdGVfcHJlZml4KQotI2RlZmluZSBubG1fcmVhZF9yZWxvY19mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fcmVhZF9yZWxvYykKLSNkZWZpbmUgbmxtX21hbmdsZV9yZWxvY3NfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX21hbmdsZV9yZWxvY3MpCi0jZGVmaW5lIG5sbV9yZWFkX2ltcG9ydF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fcmVhZF9pbXBvcnQpCi0jZGVmaW5lIG5sbV93cml0ZV9pbXBvcnRfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3dyaXRlX2ltcG9ydCkKLSNkZWZpbmUgbmxtX3NldF9wdWJsaWNfc2VjdGlvbl9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fc2V0X3B1YmxpY19zZWN0aW9uKQotI2RlZmluZSBubG1fZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX2dldF9wdWJsaWNfb2Zmc2V0KQotI2RlZmluZSBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW5fZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3N3YXBfZmhkcl9pbikKLSNkZWZpbmUgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fc3dhcF9maGRyX291dCkKLSNkZWZpbmUgbmxtX3dyaXRlX2V4dGVybmFsX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV93cml0ZV9leHRlcm5hbCkKLSNkZWZpbmUgbmxtX3dyaXRlX2V4cG9ydF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fd3JpdGVfZXhwb3J0KQotCi0vKiBUaGUgTkxNIGNvZGUsIGRhdGEsIGFuZCB1bmluaXRpYWxpemVkIHNlY3Rpb25zIGhhdmUgbm8gbmFtZXMgZGVmaW5lZAotICAgaW4gdGhlIE5MTSwgYnV0IGJmZCB3YW50cyB0byBnaXZlIHRoZW0gbmFtZXMsIHNvIHVzZSB0aGUgdHJhZGl0aW9uYWwKLSAgIFVOSVggbmFtZXMuICAqLwotCi0jZGVmaW5lIE5MTV9DT0RFX05BTUUJCQkiLnRleHQiCi0jZGVmaW5lIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUJIi5kYXRhIgotI2RlZmluZSBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUJIi5ic3MiCi0KLSNlbmRpZiAvKiBfTElCTkxNX0hfICovCmRpZmYgLS1naXQgYS9iZmQvbGlib2FzeXMuaCBiL2JmZC9saWJvYXN5cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdlYTU5Li4wMDAwMDAwCi0tLSBhL2JmZC9saWJvYXN5cy5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogQkZEIGludGVybmFsIGRlY2xhcmF0aW9ucyBmb3IgT2FzeXMgZmlsZSBmb3JtYXQgaGFuZGxpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFNjcmF3bGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19zeW1ib2wKLXsKLSAgYXN5bWJvbCBzeW1ib2w7Ci19IG9hc3lzX3N5bWJvbF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfcmVsb2MgewotICBhcmVsZW50IHJlbGVudDsKLSAgc3RydWN0IF9vYXN5c19yZWxvYyAqbmV4dDsKLSAgdW5zaWduZWQgaW50IHN5bWJvbDsKLX0gb2FzeXNfcmVsb2NfdHlwZTsKLQotCi0jZGVmaW5lIG9hc3lzX3N5bWJvbCh4KSAoKG9hc3lzX3N5bWJvbF90eXBlICopKHgpKQotI2RlZmluZSBvYXN5c19wZXJfc2VjdGlvbih4KSAoKG9hc3lzX3Blcl9zZWN0aW9uX3R5cGUgKikoeC0+dXNlZF9ieV9iZmQpKQotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfcGVyX3NlY3Rpb24KLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGJmZF9ieXRlICpkYXRhOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYm9vbGVhbiBoYWRfdm1hOwotICBvYXN5c19yZWxvY190eXBlICoqcmVsb2NfdGFpbF9wdHI7Ci0gIGJmZF92bWEgcGM7Ci0KLQotICBmaWxlX3B0ciBjdXJyZW50X3BvczsKLSAgdW5zaWduZWQgaW50IGN1cnJlbnRfYnl0ZTsKLSAgYm9vbGVhbiBpbml0aWFsaXplZDsKLX0gb2FzeXNfcGVyX3NlY3Rpb25fdHlwZTsKLQotI2RlZmluZSBOU0VDVElPTlMgMTAKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX2FyX29ic3RhY2sgewotICBmaWxlX3B0ciBmaWxlX29mZnNldDsKLSAgYmZkICphYmZkOwotfSBvYXN5c19hcl9vYnN0YWNrX3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX21vZHVsZV9pbmZvIHsKLSAgZmlsZV9wdHIgcG9zOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgYmZkICphYmZkOwotICBjaGFyICpuYW1lOwotfSBvYXN5c19tb2R1bGVfaW5mb190eXBlOwotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfYXJfZGF0YSB7Ci0gIG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKm1vZHVsZTsKLSAgdW5zaWduZWQgaW50IG1vZHVsZV9jb3VudDsKLSAgdW5zaWduZWQgaW50IG1vZHVsZV9pbmRleDsKLX0gb2FzeXNfYXJfZGF0YV90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfZGF0YSB7Ci0gIGNoYXIgKnN0cmluZ3M7Ci0gIGFzeW1ib2wgKnN5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfc3RyaW5nX2xlbmd0aDsKLSAgYXNlY3Rpb24gKnNlY3Rpb25zW09BU1lTX01BWF9TRUNfQ09VTlRdOwotICBmaWxlX3B0ciBmaXJzdF9kYXRhX3JlY29yZDsKLX0gb2FzeXNfZGF0YV90eXBlOwotCi0jZGVmaW5lIE9BU1lTX0RBVEEoYWJmZCkJKChhYmZkKS0+dGRhdGEub2FzeXNfb2JqX2RhdGEpCi0jZGVmaW5lIE9BU1lTX0FSX0RBVEEoYWJmZCkJKChhYmZkKS0+dGRhdGEub2FzeXNfYXJfZGF0YSkKLQpkaWZmIC0tZ2l0IGEvYmZkL2xpYnBlaS5oIGIvYmZkL2xpYnBlaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWY3ZmMxLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJwZWkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKiBTdXBwb3J0IGZvciB0aGUgZ2VuZXJpYyBwYXJ0cyBvZiBQRS9QRUk7IGNvbW1vbiBoZWFkZXIgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sCi0JCQlzYWNAY3lnbnVzLmNvbQotCi1QRS9QRUkgcmVhcnJhbmdlbWVudCAoYW5kIGNvZGUgYWRkZWQpOiBEb25uIFRlcnJ5Ci0JCQkJICAgICAgIFNvZnR3YXkgU3lzdGVtcywgSW5jLgotKi8KLQotLyogSGV5IGxvb2ssIHNvbWUgZG9jdW1lbnRhdGlvbiBbYW5kIGluIGEgcGxhY2UgeW91IGV4cGVjdCB0byBmaW5kIGl0XSEKLQotICAgVGhlIG1haW4gcmVmZXJlbmNlIGZvciB0aGUgcGVpIGZvcm1hdCBpcyAiTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUKLSAgIGFuZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24gNC4xIi4gIEdldCBpdCBpZiB5b3UgbmVlZCB0bwotICAgZG8gc29tZSBzZXJpb3VzIGhhY2tpbmcgb24gdGhpcyBjb2RlLgotCi0gICBBbm90aGVyIHJlZmVyZW5jZToKLSAgICJQZWVyaW5nIEluc2lkZSB0aGUgUEU6IEEgVG91ciBvZiB0aGUgV2luMzIgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgRmlsZSBGb3JtYXQiLCBNU0ogMTk5NCwgVm9sdW1lIDkuCi0KLSAgIFRoZSAqc29sZSogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwZSBmb3JtYXQgYW5kIHRoZSBwZWkgZm9ybWF0IGlzIHRoYXQgdGhlCi0gICBsYXR0ZXIgaGFzIGFuIE1TRE9TIDIuMCAuZXhlIGhlYWRlciBvbiB0aGUgZnJvbnQgdGhhdCBwcmludHMgdGhlIG1lc3NhZ2UKLSAgICJUaGlzIGFwcCBtdXN0IGJlIHJ1biB1bmRlciBXaW5kb3dzLiIgKG9yIHNvbWUgc3VjaCkuCi0gICAoRklYTUU6IFdoZXRoZXIgdGhhdCBzdGF0ZW1lbnQgaXMgKnJlYWxseSogdHJ1ZSBvciBub3QgaXMgdW5rbm93bi4KLSAgIEFyZSB0aGVyZSBtb3JlIHN1YnRsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHBlIGFuZCBwZWkgZm9ybWF0cz8KLSAgIEZvciBub3cgYXNzdW1lIHRoZXJlIGFyZW4ndC4gIElmIHlvdSBmaW5kIG9uZSwgdGhlbiBmb3IgR29kIHNha2VzCi0gICBkb2N1bWVudCBpdCBoZXJlISkKLQotICAgVGhlIE1pY3Jvc29mdCBkb2NzIHVzZSB0aGUgd29yZCAiaW1hZ2UiIGluc3RlYWQgb2YgImV4ZWN1dGFibGUiIGJlY2F1c2UKLSAgIHRoZSBmb3JtZXIgY2FuIGFsc28gcmVmZXIgdG8gYSBETEwgKHNoYXJlZCBsaWJyYXJ5KS4gIENvbmZ1c2lvbiBjYW4gYXJpc2UKLSAgIGJlY2F1c2UgdGhlIGBpJyBpbiBgcGVpJyBhbHNvIHJlZmVycyB0byAiaW1hZ2UiLiAgVGhlIGBwZScgZm9ybWF0IGNhbgotICAgYWxzbyBjcmVhdGUgaW1hZ2VzIChpLmUuIGV4ZWN1dGFibGVzKSwgaXQncyBqdXN0IHRoYXQgdG8gcnVuIG9uIGEgd2luMzIKLSAgIHN5c3RlbSB5b3UgbmVlZCB0byB1c2UgdGhlIHBlaSBmb3JtYXQuCi0KLSAgIEZJWE1FOiBQbGVhc2UgYWRkIG1vcmUgZG9jcyBoZXJlIHNvIHRoZSBuZXh0IHBvb3IgZm9vbCB0aGF0IGhhcyB0byBoYWNrCi0gICBvbiB0aGlzIGNvZGUgaGFzIGEgY2hhbmNlIG9mIGdldHRpbmcgc29tZXRoaW5nIGFjY29tcGxpc2hlZCB3aXRob3V0Ci0gICB3YXN0aW5nIHRvbyBtdWNoIHRpbWUuCi0qLwotCi0jaWZuZGVmIEdFVF9GQ05fTE5OT1BUUgotI2RlZmluZSBHRVRfRkNOX0xOTk9QVFIoYWJmZCwgZXh0KSBcCi0gICAgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZW5kaWYKLQotI2lmbmRlZiBHRVRfRkNOX0VORE5EWAotI2RlZmluZSBHRVRfRkNOX0VORE5EWChhYmZkLCBleHQpICBcCi0JYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQotI2VuZGlmCi0KLSNpZm5kZWYgUFVUX0ZDTl9MTk5PUFRSCi0jZGVmaW5lIFBVVF9GQ05fTE5OT1BUUihhYmZkLCBpbiwgZXh0KSAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9GQ05fRU5ETkRYCi0jZGVmaW5lIFBVVF9GQ05fRU5ETkRYKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xOU1pfTE5OTwotI2RlZmluZSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9MTlNaX1NJWkUKLSNkZWZpbmUgR0VUX0xOU1pfU0laRShhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNlbmRpZgotI2lmbmRlZiBQVVRfTE5TWl9MTk5PCi0jZGVmaW5lIFBVVF9MTlNaX0xOTk8oYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9MTlNaX1NJWkUKLSNkZWZpbmUgUFVUX0xOU1pfU0laRShhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9TQ05MRU4KLSNkZWZpbmUgR0VUX1NDTl9TQ05MRU4oYWJmZCwgIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05fTlJFTE9DCi0jZGVmaW5lIEdFVF9TQ05fTlJFTE9DKGFiZmQsICBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05fTkxJTk5PCi0jZGVmaW5lIEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbmxpbm5vKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fU0NOTEVOCi0jZGVmaW5lIFBVVF9TQ05fU0NOTEVOKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOX05SRUxPQwotI2RlZmluZSBQVVRfU0NOX05SRUxPQyhhYmZkLGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25yZWxvYykKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOX05MSU5OTwotI2RlZmluZSBQVVRfU0NOX05MSU5OTyhhYmZkLGluLCBleHQpICBiZmRfaF9wdXRfMTYoYWJmZCxpbiwgKGJmZF9ieXRlICAqKSBleHQtPnhfc2NuLnhfbmxpbm5vKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9MSU5FTk9fTE5OTwotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2VuZGlmCi0jaWZuZGVmIFBVVF9MSU5FTk9fTE5OTwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2VuZGlmCi0KLS8qIFRoZSBmX3N5bXB0ciBmaWVsZCBpbiB0aGUgZmlsZWhkciBpcyBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9GSUxFSERSX1NZTVBUUgotI2RlZmluZSBHRVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0ZJTEVIRFJfU1lNUFRSCi0jZGVmaW5lIFBVVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0vKiBTb21lIGZpZWxkcyBpbiB0aGUgYW91dGhkciBhcmUgc29tZXRpbWVzIDY0IGJpdHMuICAqLwotI2lmbmRlZiBHRVRfQU9VVEhEUl9UU0laRQotI2RlZmluZSBHRVRfQU9VVEhEUl9UU0laRSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9UU0laRQotI2RlZmluZSBQVVRfQU9VVEhEUl9UU0laRSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9EU0laRQotI2RlZmluZSBHRVRfQU9VVEhEUl9EU0laRSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9EU0laRQotI2RlZmluZSBQVVRfQU9VVEhEUl9EU0laRSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9CU0laRQotI2RlZmluZSBHRVRfQU9VVEhEUl9CU0laRSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9CU0laRQotI2RlZmluZSBQVVRfQU9VVEhEUl9CU0laRSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9FTlRSWQotI2RlZmluZSBHRVRfQU9VVEhEUl9FTlRSWSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9FTlRSWQotI2RlZmluZSBQVVRfQU9VVEhEUl9FTlRSWSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9URVhUX1NUQVJUCi0jZGVmaW5lIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVAotI2RlZmluZSBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUCi0jZGVmaW5lIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLQotLyogU29tZSBmaWVsZHMgaW4gdGhlIHNjbmhkciBhcmUgc29tZXRpbWVzIDY0IGJpdHMuICAqLwotI2lmbmRlZiBHRVRfU0NOSERSX1BBRERSCi0jZGVmaW5lIEdFVF9TQ05IRFJfUEFERFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9QQUREUgotI2RlZmluZSBQVVRfU0NOSERSX1BBRERSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfVkFERFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9WQUREUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1ZBRERSCi0jZGVmaW5lIFBVVF9TQ05IRFJfVkFERFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9TSVpFCi0jZGVmaW5lIEdFVF9TQ05IRFJfU0laRSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1NJWkUKLSNkZWZpbmUgUFVUX1NDTkhEUl9TSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfU0NOUFRSCi0jZGVmaW5lIEdFVF9TQ05IRFJfU0NOUFRSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfU0NOUFRSCi0jZGVmaW5lIFBVVF9TQ05IRFJfU0NOUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfUkVMUFRSCi0jZGVmaW5lIEdFVF9TQ05IRFJfUkVMUFRSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfUkVMUFRSCi0jZGVmaW5lIFBVVF9TQ05IRFJfUkVMUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfTE5OT1BUUgotI2RlZmluZSBHRVRfU0NOSERSX0xOTk9QVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9MTk5PUFRSCi0jZGVmaW5lIFBVVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0vKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQsIGFuZCBhcmUgaW4gcGVpY29kZS5oOgotICAgY29mZl9zd2FwX3JlbG9jX2luCi0gICBpbnQgY29mZl9zd2FwX3JlbG9jX291dAotICAgY29mZl9zd2FwX2ZpbGVoZHJfaW4KLSAgIGNvZmZfc3dhcF9zY25oZHJfaW4KLSAgIHBlX21rb2JqZWN0Ci0gICBwZV9ta29iamVjdF9ob29rICAqLwotCi0vKiBUaGUgZnVuY3Rpb25zIGRlc2NyaWJlZCBiZWxvdyBhcmUgY29tbW9uIGFjcm9zcyBhbGwgUEUvUEVJCi0gICBpbXBsZW1lbnRhdGlvbnMgYXJjaGl0ZWN0dXJlIHR5cGVzLCBhbmQgYWN0dWFsbHkgYXBwZWFyIGluCi0gICBwZWlnZW4uYy4gICovCi0KLXZvaWQgX2JmZF9wZWlfc3dhcF9zeW1faW4gUEFSQU1TICgoYmZkKiwgUFRSLCBQVFIpKTsKLSNkZWZpbmUgY29mZl9zd2FwX3N5bV9pbiBfYmZkX3BlaV9zd2FwX3N5bV9pbgotCi11bnNpZ25lZCBpbnQgX2JmZF9wZWlfc3dhcF9zeW1fb3V0IFBBUkFNUyAoKGJmZCosIFBUUiwgUFRSKSk7Ci0jZGVmaW5lIGNvZmZfc3dhcF9zeW1fb3V0IF9iZmRfcGVpX3N3YXBfc3ltX291dAotCi12b2lkIF9iZmRfcGVpX3N3YXBfYXV4X2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7Ci0jZGVmaW5lIGNvZmZfc3dhcF9hdXhfaW4gX2JmZF9wZWlfc3dhcF9hdXhfaW4KLQotdW5zaWduZWQgaW50IF9iZmRfcGVpX3N3YXBfYXV4X291dCBcCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7Ci0jZGVmaW5lIGNvZmZfc3dhcF9hdXhfb3V0IF9iZmRfcGVpX3N3YXBfYXV4X291dAotCi12b2lkIF9iZmRfcGVpX3N3YXBfbGluZW5vX2luIFBBUkFNUyAoKGJmZCosIFBUUiwgUFRSKSk7Ci0jZGVmaW5lIGNvZmZfc3dhcF9saW5lbm9faW4gX2JmZF9wZWlfc3dhcF9saW5lbm9faW4KLQotdW5zaWduZWQgaW50IF9iZmRfcGVpX3N3YXBfbGluZW5vX291dCBQQVJBTVMgKChiZmQqLCBQVFIsIFBUUikpOwotI2RlZmluZSBjb2ZmX3N3YXBfbGluZW5vX291dCBfYmZkX3BlaV9zd2FwX2xpbmVub19vdXQKLQotdm9pZCBfYmZkX3BlaV9zd2FwX2FvdXRoZHJfaW4gUEFSQU1TICgoYmZkKiwgUFRSLCBQVFIpKTsKLSNkZWZpbmUgY29mZl9zd2FwX2FvdXRoZHJfaW4gX2JmZF9wZWlfc3dhcF9hb3V0aGRyX2luCi0KLXVuc2lnbmVkIGludCBfYmZkX3BlaV9zd2FwX2FvdXRoZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9vdXQgX2JmZF9wZWlfc3dhcF9hb3V0aGRyX291dAotCi11bnNpZ25lZCBpbnQgX2JmZF9wZWlfc3dhcF9zY25oZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotI2RlZmluZSBjb2ZmX3N3YXBfc2NuaGRyX291dCBfYmZkX3BlaV9zd2FwX3Njbmhkcl9vdXQKLQotYm9vbGVhbiBfYmZkX3BlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGFfY29tbW9uIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotYm9vbGVhbiBfYmZkX3BlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGFfY29tbW9uIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi12b2lkIF9iZmRfcGVfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLQotYm9vbGVhbiBfYmZkX3BlaV9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci0jZGVmaW5lIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0IF9iZmRfcGVpX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSBuZWVkZWQgb25seSBmb3IgT05FIG9mIHBlIG9yIHBlaSwgYnV0IGRvbid0Ci0gICBvdGhlcndpc2UgdmFyeTsgcGVpY29kZS5oIGZpeGVzIHVwIGlmZGVmcyBidXQgd2UgcHJvdmlkZSB0aGUKLSAgIHByb3RvdHlwZS4gICovCi0KLXVuc2lnbmVkIGludCBfYmZkX3BlX29ubHlfc3dhcF9maWxlaGRyX291dCBQQVJBTVMgKChiZmQqLCBQVFIsIFBUUikpOwotdW5zaWduZWQgaW50IF9iZmRfcGVpX29ubHlfc3dhcF9maWxlaGRyX291dCBQQVJBTVMgKChiZmQqLCBQVFIsIFBUUikpOwotYm9vbGVhbiBfYmZkX3BlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmQgKiwgYXNlY3Rpb24gKikpOwpkaWZmIC0tZ2l0IGEvYmZkL2xpbmtlci5jIGIvYmZkL2xpbmtlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGY5NmZlLi4wMDAwMDAwCi0tLSBhL2JmZC9saW5rZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MDUgKzAsMCBAQAotLyogbGlua2VyLmMgLS0gQkZEIGxpbmtlciByb3V0aW5lcwotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBhbmQgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdlbmxpbmsuaCIKLQotLyoKLVNFQ1RJT04KLQlMaW5rZXIgRnVuY3Rpb25zCi0KLUBjaW5kZXggTGlua2VyCi0JVGhlIGxpbmtlciB1c2VzIHRocmVlIHNwZWNpYWwgZW50cnkgcG9pbnRzIGluIHRoZSBCRkQgdGFyZ2V0Ci0JdmVjdG9yLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byB3cml0ZSBzcGVjaWFsIHJvdXRpbmVzIGZvcgotCXRoZXNlIGVudHJ5IHBvaW50cyB3aGVuIGNyZWF0aW5nIGEgbmV3IEJGRCBiYWNrIGVuZCwgc2luY2UKLQlnZW5lcmljIHZlcnNpb25zIGFyZSBwcm92aWRlZC4gIEhvd2V2ZXIsIHdyaXRpbmcgdGhlbSBjYW4KLQlzcGVlZCB1cCBsaW5raW5nIGFuZCBtYWtlIGl0IHVzZSBzaWduaWZpY2FudGx5IGxlc3MgcnVudGltZQotCW1lbW9yeS4KLQotCVRoZSBmaXJzdCByb3V0aW5lIGNyZWF0ZXMgYSBoYXNoIHRhYmxlIHVzZWQgYnkgdGhlIG90aGVyCi0Jcm91dGluZXMuICBUaGUgc2Vjb25kIHJvdXRpbmUgYWRkcyB0aGUgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotCWZpbGUgdG8gdGhlIGhhc2ggdGFibGUuICBUaGUgdGhpcmQgcm91dGluZSB0YWtlcyBhbGwgdGhlCi0Jb2JqZWN0IGZpbGVzIGFuZCBsaW5rcyB0aGVtIHRvZ2V0aGVyIHRvIGNyZWF0ZSB0aGUgb3V0cHV0Ci0JZmlsZS4gIFRoZXNlIHJvdXRpbmVzIGFyZSBkZXNpZ25lZCBzbyB0aGF0IHRoZSBsaW5rZXIgcHJvcGVyCi0JZG9lcyBub3QgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBzeW1ib2xzIGluIHRoZSBvYmplY3QKLQlmaWxlcyB0aGF0IGl0IGlzIGxpbmtpbmcuICBUaGUgbGlua2VyIG1lcmVseSBhcnJhbmdlcyB0aGUKLQlzZWN0aW9ucyBhcyBkaXJlY3RlZCBieSB0aGUgbGlua2VyIHNjcmlwdCBhbmQgbGV0cyBCRkQgaGFuZGxlCi0JdGhlIGRldGFpbHMgb2Ygc3ltYm9scyBhbmQgcmVsb2NzLgotCi0JVGhlIHNlY29uZCByb3V0aW5lIGFuZCB0aGlyZCByb3V0aW5lcyBhcmUgcGFzc2VkIGEgcG9pbnRlciB0bwotCWEgPDxzdHJ1Y3QgYmZkX2xpbmtfaW5mbz4+IHN0cnVjdHVyZSAoZGVmaW5lZCBpbgotCTw8YmZkbGluay5oPj4pIHdoaWNoIGhvbGRzIGluZm9ybWF0aW9uIHJlbGV2YW50IHRvIHRoZSBsaW5rLAotCWluY2x1ZGluZyB0aGUgbGlua2VyIGhhc2ggdGFibGUgKHdoaWNoIHdhcyBjcmVhdGVkIGJ5IHRoZQotCWZpcnN0IHJvdXRpbmUpIGFuZCBhIHNldCBvZiBjYWxsYmFjayBmdW5jdGlvbnMgdG8gdGhlIGxpbmtlcgotCXByb3Blci4KLQotCVRoZSBnZW5lcmljIGxpbmtlciByb3V0aW5lcyBhcmUgaW4gPDxsaW5rZXIuYz4+LCBhbmQgdXNlIHRoZQotCWhlYWRlciBmaWxlIDw8Z2VubGluay5oPj4uICBBcyBvZiB0aGlzIHdyaXRpbmcsIHRoZSBvbmx5IGJhY2sKLQllbmRzIHdoaWNoIGhhdmUgaW1wbGVtZW50ZWQgdmVyc2lvbnMgb2YgdGhlc2Ugcm91dGluZXMgYXJlCi0JYS5vdXQgKGluIDw8YW91dHguaD4+KSBhbmQgRUNPRkYgKGluIDw8ZWNvZmYuYz4+KS4gIFRoZSBhLm91dAotCXJvdXRpbmVzIGFyZSB1c2VkIGFzIGV4YW1wbGVzIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9uLgotCi1AbWVudQkKLUAqIENyZWF0aW5nIGEgTGlua2VyIEhhc2ggVGFibGU6OgotQCogQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGU6OgotQCogUGVyZm9ybWluZyB0aGUgRmluYWwgTGluazo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLUNyZWF0aW5nIGEgTGlua2VyIEhhc2ggVGFibGUsIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlLCBMaW5rZXIgRnVuY3Rpb25zLCBMaW5rZXIgRnVuY3Rpb25zCi1TVUJTRUNUSU9OCi0JQ3JlYXRpbmcgYSBsaW5rZXIgaGFzaCB0YWJsZQotCi1AY2luZGV4IF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBpbiB0YXJnZXQgdmVjdG9yCi1AY2luZGV4IHRhcmdldCB2ZWN0b3IgKF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkKLQlUaGUgbGlua2VyIHJvdXRpbmVzIG11c3QgY3JlYXRlIGEgaGFzaCB0YWJsZSwgd2hpY2ggbXVzdCBiZQotCWRlcml2ZWQgZnJvbSA8PHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlPj4gZGVzY3JpYmVkIGluCi0JPDxiZmRsaW5rLmM+Pi4gIEB4cmVme0hhc2ggVGFibGVzfSwgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0bwotCWNyZWF0ZSBhIGRlcml2ZWQgaGFzaCB0YWJsZS4gIFRoaXMgZW50cnkgcG9pbnQgaXMgY2FsbGVkIHVzaW5nCi0JdGhlIHRhcmdldCB2ZWN0b3Igb2YgdGhlIGxpbmtlciBvdXRwdXQgZmlsZS4KLQotCVRoZSA8PF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZT4+IGVudHJ5IHBvaW50IG11c3QgYWxsb2NhdGUKLQlhbmQgaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZGVzaXJlZCBoYXNoIHRhYmxlLiAgSWYgdGhlCi0JYmFjayBlbmQgZG9lcyBub3QgcmVxdWlyZSBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBiZQotCXN0b3JlZCB3aXRoIHRoZSBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlLCB0aGUgZW50cnkgcG9pbnQgbWF5Ci0Jc2ltcGx5IGNyZWF0ZSBhIDw8c3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGU+Pi4gIE1vc3QgbGlrZWx5LAotCWhvd2V2ZXIsIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aWxsIGJlIG5lZWRlZC4KLQotCUZvciBleGFtcGxlLCB3aXRoIGVhY2ggZW50cnkgaW4gdGhlIGhhc2ggdGFibGUgdGhlIGEub3V0Ci0JbGlua2VyIGtlZXBzIHRoZSBpbmRleCB0aGUgc3ltYm9sIGhhcyBpbiB0aGUgZmluYWwgb3V0cHV0IGZpbGUKLQkodGhpcyBpbmRleCBudW1iZXIgaXMgdXNlZCBzbyB0aGF0IHdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUKLQlsaW5rIHRoZSBzeW1ib2wgaW5kZXggdXNlZCBpbiB0aGUgb3V0cHV0IGZpbGUgY2FuIGJlIHF1aWNrbHkKLQlmaWxsZWQgaW4gd2hlbiBjb3B5aW5nIG92ZXIgYSByZWxvYykuICBUaGUgYS5vdXQgbGlua2VyIGNvZGUKLQlkZWZpbmVzIHRoZSByZXF1aXJlZCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgZm9yIGEgaGFzaCB0YWJsZQotCWRlcml2ZWQgZnJvbSA8PHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlPj4uICBUaGUgYS5vdXQgbGlua2VyCi0JaGFzaCB0YWJsZSBpcyBjcmVhdGVkIGJ5IHRoZSBmdW5jdGlvbgotCTw8TkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpPj47IGl0IHNpbXBseSBhbGxvY2F0ZXMKLQlzcGFjZSBmb3IgdGhlIGhhc2ggdGFibGUsIGluaXRpYWxpemVzIGl0LCBhbmQgcmV0dXJucyBhCi0JcG9pbnRlciB0byBpdC4KLQotCVdoZW4gd3JpdGluZyB0aGUgbGlua2VyIHJvdXRpbmVzIGZvciBhIG5ldyBiYWNrIGVuZCwgeW91IHdpbGwKLQlnZW5lcmFsbHkgbm90IGtub3cgZXhhY3RseSB3aGljaCBmaWVsZHMgd2lsbCBiZSByZXF1aXJlZCB1bnRpbAotCXlvdSBoYXZlIGZpbmlzaGVkLiAgWW91IHNob3VsZCBzaW1wbHkgY3JlYXRlIGEgbmV3IGhhc2ggdGFibGUKLQl3aGljaCBkZWZpbmVzIG5vIGFkZGl0aW9uYWwgZmllbGRzLCBhbmQgdGhlbiBzaW1wbHkgYWRkIGZpZWxkcwotCWFzIHRoZXkgYmVjb21lIG5lY2Vzc2FyeS4KLQotSU5PREUKLUFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlLCBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rLCBDcmVhdGluZyBhIExpbmtlciBIYXNoIFRhYmxlLCBMaW5rZXIgRnVuY3Rpb25zCi1TVUJTRUNUSU9OCi0JQWRkaW5nIHN5bWJvbHMgdG8gdGhlIGhhc2ggdGFibGUKLQotQGNpbmRleCBfYmZkX2xpbmtfYWRkX3N5bWJvbHMgaW4gdGFyZ2V0IHZlY3RvcgotQGNpbmRleCB0YXJnZXQgdmVjdG9yIChfYmZkX2xpbmtfYWRkX3N5bWJvbHMpCi0JVGhlIGxpbmtlciBwcm9wZXIgd2lsbCBjYWxsIHRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+Ci0JZW50cnkgcG9pbnQgZm9yIGVhY2ggb2JqZWN0IGZpbGUgb3IgYXJjaGl2ZSB3aGljaCBpcyB0byBiZQotCWxpbmtlZCAodHlwaWNhbGx5IHRoZXNlIGFyZSB0aGUgZmlsZXMgbmFtZWQgb24gdGhlIGNvbW1hbmQKLQlsaW5lLCBidXQgc29tZSBtYXkgYWxzbyBjb21lIGZyb20gdGhlIGxpbmtlciBzY3JpcHQpLiAgVGhlCi0JZW50cnkgcG9pbnQgaXMgcmVzcG9uc2libGUgZm9yIGV4YW1pbmluZyB0aGUgZmlsZS4gIEZvciBhbgotCW9iamVjdCBmaWxlLCBCRkQgbXVzdCBhZGQgYW55IHJlbGV2YW50IHN5bWJvbCBpbmZvcm1hdGlvbiB0bwotCXRoZSBoYXNoIHRhYmxlLiAgRm9yIGFuIGFyY2hpdmUsIEJGRCBtdXN0IGRldGVybWluZSB3aGljaAotCWVsZW1lbnRzIG9mIHRoZSBhcmNoaXZlIHNob3VsZCBiZSB1c2VkIGFuZCBhZGRpbmcgdGhlbSB0byB0aGUKLQlsaW5rLgotCi0JVGhlIGEub3V0IHZlcnNpb24gb2YgdGhpcyBlbnRyeSBwb2ludCBpcwotCTw8TkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpPj4uCi0KLUBtZW51Ci1AKiBEaWZmZXJpbmcgZmlsZSBmb3JtYXRzOjoKLUAqIEFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGU6OgotQCogQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlOjoKLUBlbmQgbWVudQotCi1JTk9ERQotRGlmZmVyaW5nIGZpbGUgZm9ybWF0cywgQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUsIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlCi1TVUJTVUJTRUNUSU9OCi0JRGlmZmVyaW5nIGZpbGUgZm9ybWF0cwotCi0JTm9ybWFsbHkgYWxsIHRoZSBmaWxlcyBpbnZvbHZlZCBpbiBhIGxpbmsgd2lsbCBiZSBvZiB0aGUgc2FtZQotCWZvcm1hdCwgYnV0IGl0IGlzIGFsc28gcG9zc2libGUgdG8gbGluayB0b2dldGhlciBkaWZmZXJlbnQKLQlmb3JtYXQgb2JqZWN0IGZpbGVzLCBhbmQgdGhlIGJhY2sgZW5kIG11c3Qgc3VwcG9ydCB0aGF0LiAgVGhlCi0JPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBlbnRyeSBwb2ludCBpcyBjYWxsZWQgdmlhIHRoZSB0YXJnZXQKLQl2ZWN0b3Igb2YgdGhlIGZpbGUgdG8gYmUgYWRkZWQuICBUaGlzIGhhcyBhbiBpbXBvcnRhbnQKLQljb25zZXF1ZW5jZTogdGhlIGZ1bmN0aW9uIG1heSBub3QgYXNzdW1lIHRoYXQgdGhlIGhhc2ggdGFibGUKLQlpcyB0aGUgdHlwZSBjcmVhdGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nCi0JPDxfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGU+PiB2ZWN0b3IuICBBbGwgdGhlCi0JPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbiBjYW4gYXNzdW1lIGFib3V0IHRoZSBoYXNoCi0JdGFibGUgaXMgdGhhdCBpdCBpcyBkZXJpdmVkIGZyb20gPDxzdHJ1Y3QKLQliZmRfbGlua19oYXNoX3RhYmxlPj4uCi0KLQlTb21ldGltZXMgdGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZnVuY3Rpb24gbXVzdCBzdG9yZQotCXNvbWUgaW5mb3JtYXRpb24gaW4gdGhlIGhhc2ggdGFibGUgZW50cnkgdG8gYmUgdXNlZCBieSB0aGUKLQk8PF9iZmRfZmluYWxfbGluaz4+IGZ1bmN0aW9uLiAgSW4gc3VjaCBhIGNhc2UgdGhlIDw8Y3JlYXRvcj4+Ci0JZmllbGQgb2YgdGhlIGhhc2ggdGFibGUgbXVzdCBiZSBjaGVja2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQotCWhhc2ggdGFibGUgd2FzIGNyZWF0ZWQgYnkgYW4gb2JqZWN0IGZpbGUgb2YgdGhlIHNhbWUgZm9ybWF0LgotCi0JVGhlIDw8X2JmZF9maW5hbF9saW5rPj4gcm91dGluZSBtdXN0IGJlIHByZXBhcmVkIHRvIGhhbmRsZSBhCi0JaGFzaCBlbnRyeSB3aXRob3V0IGFueSBleHRyYSBpbmZvcm1hdGlvbiBhZGRlZCBieSB0aGUKLQk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGZ1bmN0aW9uLiAgQSBoYXNoIGVudHJ5IHdpdGhvdXQKLQlleHRyYSBpbmZvcm1hdGlvbiB3aWxsIGFsc28gb2NjdXIgd2hlbiB0aGUgbGlua2VyIHNjcmlwdAotCWRpcmVjdHMgdGhlIGxpbmtlciB0byBjcmVhdGUgYSBzeW1ib2wuICBOb3RlIHRoYXQsIHJlZ2FyZGxlc3MKLQlvZiBob3cgYSBoYXNoIHRhYmxlIGVudHJ5IGlzIGFkZGVkLCBhbGwgdGhlIGZpZWxkcyB3aWxsIGJlCi0JaW5pdGlhbGl6ZWQgdG8gc29tZSBzb3J0IG9mIG51bGwgdmFsdWUgYnkgdGhlIGhhc2ggdGFibGUgZW50cnkKLQlpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KLQotCVNlZSA8PGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscz4+IGZvciBhbiBleGFtcGxlIG9mIGhvdyB0bwotCWNoZWNrIHRoZSA8PGNyZWF0b3I+PiBmaWVsZCBiZWZvcmUgc2F2aW5nIGluZm9ybWF0aW9uIChpbiB0aGlzCi0JY2FzZSwgdGhlIEVDT0ZGIGV4dGVybmFsIHN5bWJvbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24pIGluIGEKLQloYXNoIHRhYmxlIGVudHJ5LgotCi1JTk9ERQotQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSwgQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlLCBEaWZmZXJpbmcgZmlsZSBmb3JtYXRzLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZQotU1VCU1VCU0VDVElPTgotCUFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUKLQotCVdoZW4gdGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gcm91dGluZSBpcyBwYXNzZWQgYW4gb2JqZWN0Ci0JZmlsZSwgaXQgbXVzdCBhZGQgYWxsIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2xzIGluIHRoYXQKLQlvYmplY3QgZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4gIFRoZSBhY3R1YWwgd29yayBvZiBhZGRpbmcgdGhlCi0Jc3ltYm9sIHRvIHRoZSBoYXNoIHRhYmxlIGlzIG5vcm1hbGx5IGhhbmRsZWQgYnkgdGhlIGZ1bmN0aW9uCi0JPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbD4+LiAgVGhlCi0JPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciByZWFkaW5nCi0JYWxsIHRoZSBzeW1ib2xzIGZyb20gdGhlIG9iamVjdCBmaWxlIGFuZCBwYXNzaW5nIHRoZSBjb3JyZWN0Ci0JaW5mb3JtYXRpb24gdG8gPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbD4+LgotCi0JVGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gcm91dGluZSBzaG91bGQgbm90IHVzZQotCTw8YmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWI+PiB0byByZWFkIHRoZSBzeW1ib2xzLiAgVGhlIHBvaW50IG9mCi0JcHJvdmlkaW5nIHRoaXMgcm91dGluZSBpcyB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgY29udmVydGluZwotCXRoZSBzeW1ib2xzIGludG8gZ2VuZXJpYyA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmVzLgotCi1AZmluZGV4IF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbD4+IGhhbmRsZXMgdGhlIGRldGFpbHMgb2YKLQljb21iaW5pbmcgY29tbW9uIHN5bWJvbHMsIHdhcm5pbmcgYWJvdXQgbXVsdGlwbGUgZGVmaW5pdGlvbnMsCi0JYW5kIHNvIGZvcnRoLiAgSXQgdGFrZXMgYXJndW1lbnRzIHdoaWNoIGRlc2NyaWJlIHRoZSBzeW1ib2wgdG8KLQlhZGQsIG5vdGFibHkgc3ltYm9sIGZsYWdzLCBhIHNlY3Rpb24sIGFuZCBhbiBvZmZzZXQuICBUaGUKLQlzeW1ib2wgZmxhZ3MgaW5jbHVkZSBzdWNoIHRoaW5ncyBhcyA8PEJTRl9XRUFLPj4gb3IKLQk8PEJTRl9JTkRJUkVDVD4+LiAgVGhlIHNlY3Rpb24gaXMgYSBzZWN0aW9uIGluIHRoZSBvYmplY3QKLQlmaWxlLCBvciBzb21ldGhpbmcgbGlrZSA8PGJmZF91bmRfc2VjdGlvbl9wdHI+PiBmb3IgYW4gdW5kZWZpbmVkCi0Jc3ltYm9sIG9yIDw8YmZkX2NvbV9zZWN0aW9uX3B0cj4+IGZvciBhIGNvbW1vbiBzeW1ib2wuCi0KLQlJZiB0aGUgPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIGlzIGFsc28gZ29pbmcgdG8gbmVlZCB0bwotCXJlYWQgdGhlIHN5bWJvbCBpbmZvcm1hdGlvbiwgdGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4KLQlyb3V0aW5lIHNob3VsZCBzYXZlIGl0IHNvbWV3aGVyZSBhdHRhY2hlZCB0byB0aGUgb2JqZWN0IGZpbGUKLQlCRkQuICBIb3dldmVyLCB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIG9ubHkgYmUgc2F2ZWQgaWYgdGhlCi0JPDxrZWVwX21lbW9yeT4+IGZpZWxkIG9mIHRoZSA8PGluZm8+PiBhcmd1bWVudCBpcyB0cnVlLCBzbwotCXRoYXQgdGhlIDw8LW5vLWtlZXAtbWVtb3J5Pj4gbGlua2VyIHN3aXRjaCBpcyBlZmZlY3RpdmUuCi0KLQlUaGUgYS5vdXQgZnVuY3Rpb24gd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgaXMKLQk8PGFvdXRfbGlua19hZGRfb2JqZWN0X3N5bWJvbHM+PiwgYW5kIG1vc3Qgb2YgdGhlIGludGVyZXN0aW5nCi0Jd29yayBpcyBpbiA8PGFvdXRfbGlua19hZGRfc3ltYm9scz4+LiAgVGhlIGxhdHRlciBzYXZlcwotCXBvaW50ZXJzIHRvIHRoZSBoYXNoIHRhYmxlcyBlbnRyaWVzIGNyZWF0ZWQgYnkKLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sPj4gaW5kZXhlZCBieSBzeW1ib2wgbnVtYmVyLAotCXNvIHRoYXQgdGhlIDw8X2JmZF9maW5hbF9saW5rPj4gcm91dGluZSBkb2VzIG5vdCBoYXZlIHRvIGNhbGwKLQl0aGUgaGFzaCB0YWJsZSBsb29rdXAgcm91dGluZSB0byBsb2NhdGUgdGhlIGVudHJ5LgotCi1JTk9ERQotQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlLCAsIEFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUsIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlCi1TVUJTVUJTRUNUSU9OCi0JQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlCi0KLQlXaGVuIHRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IHJvdXRpbmUgaXMgcGFzc2VkIGFuCi0JYXJjaGl2ZSwgaXQgbXVzdCBsb29rIHRocm91Z2ggdGhlIHN5bWJvbHMgZGVmaW5lZCBieSB0aGUKLQlhcmNoaXZlIGFuZCBkZWNpZGUgd2hpY2ggZWxlbWVudHMgb2YgdGhlIGFyY2hpdmUgc2hvdWxkIGJlCi0JaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBGb3IgZWFjaCBzdWNoIGVsZW1lbnQgaXQgbXVzdCBjYWxsIHRoZQotCTw8YWRkX2FyY2hpdmVfZWxlbWVudD4+IGxpbmtlciBjYWxsYmFjaywgYW5kIGl0IG11c3QgYWRkIHRoZQotCXN5bWJvbHMgZnJvbSB0aGUgb2JqZWN0IGZpbGUgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLgotCi1AZmluZGV4IF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLQlJbiBtb3N0IGNhc2VzIHRoZSB3b3JrIG9mIGxvb2tpbmcgdGhyb3VnaCB0aGUgc3ltYm9scyBpbiB0aGUKLQlhcmNoaXZlIHNob3VsZCBiZSBkb25lIGJ5IHRoZQotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scz4+IGZ1bmN0aW9uLiAgVGhpcwotCWZ1bmN0aW9uIGJ1aWxkcyBhIGhhc2ggdGFibGUgZnJvbSB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgYW5kCi0JbG9va3MgdGhyb3VnaCB0aGUgbGlzdCBvZiB1bmRlZmluZWQgc3ltYm9scyB0byBzZWUgd2hpY2gKLQllbGVtZW50cyBzaG91bGQgYmUgaW5jbHVkZWQuCi0JPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzPj4gaXMgcGFzc2VkIGEgZnVuY3Rpb24KLQl0byBjYWxsIHRvIG1ha2UgdGhlIGZpbmFsIGRlY2lzaW9uIGFib3V0IGFkZGluZyBhbiBhcmNoaXZlCi0JZWxlbWVudCB0byB0aGUgbGluayBhbmQgdG8gZG8gdGhlIGFjdHVhbCB3b3JrIG9mIGFkZGluZyB0aGUKLQlzeW1ib2xzIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KLQotCVRoZSBmdW5jdGlvbiBwYXNzZWQgdG8KLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PiBtdXN0IHJlYWQgdGhlCi0Jc3ltYm9scyBvZiB0aGUgYXJjaGl2ZSBlbGVtZW50IGFuZCBkZWNpZGUgd2hldGhlciB0aGUgYXJjaGl2ZQotCWVsZW1lbnQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgSWYgdGhlIGVsZW1lbnQgaXMgdG8KLQliZSBpbmNsdWRlZCwgdGhlIDw8YWRkX2FyY2hpdmVfZWxlbWVudD4+IGxpbmtlciBjYWxsYmFjawotCXJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgZWxlbWVudCBhcyBhbiBhcmd1bWVudCwgYW5kCi0JdGhlIGVsZW1lbnRzIHN5bWJvbHMgbXVzdCBiZSBhZGRlZCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUKLQlqdXN0IGFzIHRob3VnaCB0aGUgZWxlbWVudCBoYWQgaXRzZWxmIGJlZW4gcGFzc2VkIHRvIHRoZQotCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZnVuY3Rpb24uCi0KLQlXaGVuIHRoZSBhLm91dCA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGZ1bmN0aW9uIHJlY2VpdmVzIGFuCi0JYXJjaGl2ZSwgaXQgY2FsbHMgPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzPj4KLQlwYXNzaW5nIDw8YW91dF9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudD4+IGFzIHRoZSBmdW5jdGlvbgotCWFyZ3VtZW50LiA8PGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQ+PiBjYWxscwotCTw8YW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHM+Pi4gIElmIHRoZSBsYXR0ZXIgZGVjaWRlcyB0byBhZGQKLQl0aGUgZWxlbWVudCAoYW4gZWxlbWVudCBpcyBvbmx5IGFkZGVkIGlmIGl0IHByb3ZpZGVzIGEgcmVhbCwKLQlub24tY29tbW9uLCBkZWZpbml0aW9uIGZvciBhIHByZXZpb3VzbHkgdW5kZWZpbmVkIG9yIGNvbW1vbgotCXN5bWJvbCkgaXQgY2FsbHMgdGhlIDw8YWRkX2FyY2hpdmVfZWxlbWVudD4+IGNhbGxiYWNrIGFuZCB0aGVuCi0JPDxhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Pj4gY2FsbHMKLQk8PGFvdXRfbGlua19hZGRfc3ltYm9scz4+IHRvIGFjdHVhbGx5IGFkZCB0aGUgc3ltYm9scyB0byB0aGUKLQlsaW5rZXIgaGFzaCB0YWJsZS4KLQotCVRoZSBFQ09GRiBiYWNrIGVuZCBpcyB1bnVzdWFsIGluIHRoYXQgaXQgZG9lcyBub3Qgbm9ybWFsbHkKLQljYWxsIDw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scz4+LCBiZWNhdXNlIEVDT0ZGCi0JYXJjaGl2ZXMgYWxyZWFkeSBjb250YWluIGEgaGFzaCB0YWJsZSBvZiBzeW1ib2xzLiAgVGhlIEVDT0ZGCi0JYmFjayBlbmQgc2VhcmNoZXMgdGhlIGFyY2hpdmUgaXRzZWxmIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZgotCWNyZWF0aW5nIGEgbmV3IGhhc2ggdGFibGUuCi0KLUlOT0RFCi1QZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rLCAsIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlLCBMaW5rZXIgRnVuY3Rpb25zCi1TVUJTRUNUSU9OCi0JUGVyZm9ybWluZyB0aGUgZmluYWwgbGluawotCi1AY2luZGV4IF9iZmRfbGlua19maW5hbF9saW5rIGluIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggdGFyZ2V0IHZlY3RvciAoX2JmZF9maW5hbF9saW5rKQotCVdoZW4gYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkLCB0aGUgbGlua2VyIGNhbGxzCi0JdGhlIDw8X2JmZF9maW5hbF9saW5rPj4gZW50cnkgcG9pbnQgb2YgdGhlIG91dHB1dCBCRkQuICBUaGlzCi0Jcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IgcHJvZHVjaW5nIHRoZSBmaW5hbCBvdXRwdXQgZmlsZSwKLQl3aGljaCBoYXMgc2V2ZXJhbCBhc3BlY3RzLiAgSXQgbXVzdCByZWxvY2F0ZSB0aGUgY29udGVudHMgb2YKLQl0aGUgaW5wdXQgc2VjdGlvbnMgYW5kIGNvcHkgdGhlIGRhdGEgaW50byB0aGUgb3V0cHV0IHNlY3Rpb25zLgotCUl0IG11c3QgYnVpbGQgYW4gb3V0cHV0IHN5bWJvbCB0YWJsZSBpbmNsdWRpbmcgYW55IGxvY2FsCi0Jc3ltYm9scyBmcm9tIHRoZSBpbnB1dCBmaWxlcyBhbmQgdGhlIGdsb2JhbCBzeW1ib2xzIGZyb20gdGhlCi0JaGFzaCB0YWJsZS4gIFdoZW4gcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGl0IG11c3QKLQltb2RpZnkgdGhlIGlucHV0IHJlbG9jcyBhbmQgd3JpdGUgdGhlbSBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLQlUaGVyZSBtYXkgYWxzbyBiZSBvYmplY3QgZm9ybWF0IGRlcGVuZGVudCB3b3JrIHRvIGJlIGRvbmUuCi0KLQlUaGUgbGlua2VyIHdpbGwgYWxzbyBjYWxsIHRoZSA8PHdyaXRlX29iamVjdF9jb250ZW50cz4+IGVudHJ5Ci0JcG9pbnQgd2hlbiB0aGUgQkZEIGlzIGNsb3NlZC4gIFRoZSB0d28gZW50cnkgcG9pbnRzIG11c3Qgd29yawotCXRvZ2V0aGVyIGluIG9yZGVyIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3Qgb3V0cHV0IGZpbGUuCi0KLQlUaGUgZGV0YWlscyBvZiBob3cgdGhpcyB3b3JrcyBhcmUgaW5ldml0YWJseSBkZXBlbmRlbnQgdXBvbgotCXRoZSBzcGVjaWZpYyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGUgYS5vdXQKLQk8PF9iZmRfZmluYWxfbGluaz4+IHJvdXRpbmUgaXMgPDxOQU1FKGFvdXQsZmluYWxfbGluayk+Pi4KLQotQG1lbnUKLUAqIEluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXI6OgotQCogUmVsb2NhdGluZyB0aGUgc2VjdGlvbiBjb250ZW50czo6Ci1AKiBXcml0aW5nIHRoZSBzeW1ib2wgdGFibGU6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1JbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgbGlua2VyLCBSZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rLCBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rCi1TVUJTVUJTRUNUSU9OCi0JSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGxpbmtlcgotCi0JQmVmb3JlIHRoZSBsaW5rZXIgY2FsbHMgdGhlIDw8X2JmZF9maW5hbF9saW5rPj4gZW50cnkgcG9pbnQsCi0JaXQgc2V0cyB1cCBzb21lIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIGZ1bmN0aW9uIHRvIHVzZS4KLQotCVRoZSA8PGlucHV0X2JmZHM+PiBmaWVsZCBvZiB0aGUgPDxiZmRfbGlua19pbmZvPj4gc3RydWN0dXJlCi0Jd2lsbCBwb2ludCB0byBhIGxpc3Qgb2YgYWxsIHRoZSBpbnB1dCBmaWxlcyBpbmNsdWRlZCBpbiB0aGUKLQlsaW5rLiAgVGhlc2UgZmlsZXMgYXJlIGxpbmtlZCB0aHJvdWdoIHRoZSA8PGxpbmtfbmV4dD4+IGZpZWxkCi0Jb2YgdGhlIDw8YmZkPj4gc3RydWN0dXJlLgotCi0JRWFjaCBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGhhdmUgYSBsaXN0IG9mCi0JPDxsaW5rX29yZGVyPj4gc3RydWN0dXJlcyBhdHRhY2hlZCB0byB0aGUgPDxsaW5rX29yZGVyX2hlYWQ+PgotCWZpZWxkICh0aGUgPDxsaW5rX29yZGVyPj4gc3RydWN0dXJlIGlzIGRlZmluZWQgaW4KLQk8PGJmZGxpbmsuaD4+KS4gIFRoZXNlIHN0cnVjdHVyZXMgZGVzY3JpYmUgaG93IHRvIGNyZWF0ZSB0aGUKLQljb250ZW50cyBvZiB0aGUgb3V0cHV0IHNlY3Rpb24gaW4gdGVybXMgb2YgdGhlIGNvbnRlbnRzIG9mCi0JdmFyaW91cyBpbnB1dCBzZWN0aW9ucywgZmlsbCBjb25zdGFudHMsIGFuZCwgZXZlbnR1YWxseSwgb3RoZXIKLQl0eXBlcyBvZiBpbmZvcm1hdGlvbi4gIFRoZXkgYWxzbyBkZXNjcmliZSByZWxvY3MgdGhhdCBtdXN0IGJlCi0JY3JlYXRlZCBieSB0aGUgQkZEIGJhY2tlbmQsIGJ1dCBkbyBub3QgY29ycmVzcG9uZCB0byBhbnkgaW5wdXQKLQlmaWxlOyB0aGlzIGlzIHVzZWQgdG8gc3VwcG9ydCAtVXIsIHdoaWNoIGJ1aWxkcyBjb25zdHJ1Y3RvcnMKLQl3aGlsZSBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlLgotCi1JTk9ERQotUmVsb2NhdGluZyB0aGUgc2VjdGlvbiBjb250ZW50cywgV3JpdGluZyB0aGUgc3ltYm9sIHRhYmxlLCBJbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgbGlua2VyLCBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rCi1TVUJTVUJTRUNUSU9OCi0JUmVsb2NhdGluZyB0aGUgc2VjdGlvbiBjb250ZW50cwotCi0JVGhlIDw8X2JmZF9maW5hbF9saW5rPj4gZnVuY3Rpb24gc2hvdWxkIGxvb2sgdGhyb3VnaCB0aGUKLQk8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmVzIGF0dGFjaGVkIHRvIGVhY2ggc2VjdGlvbiBvZiB0aGUKLQlvdXRwdXQgZmlsZS4gIEVhY2ggPDxsaW5rX29yZGVyPj4gc3RydWN0dXJlIHNob3VsZCBlaXRoZXIgYmUKLQloYW5kbGVkIHNwZWNpYWxseSwgb3IgaXQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24KLQk8PF9iZmRfZGVmYXVsdF9saW5rX29yZGVyPj4gd2hpY2ggd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcKLQkoPDxfYmZkX2RlZmF1bHRfbGlua19vcmRlcj4+IGlzIGRlZmluZWQgaW4gPDxsaW5rZXIuYz4+KS4KLQotCUZvciBlZmZpY2llbmN5LCBhIDw8bGlua19vcmRlcj4+IG9mIHR5cGUKLQk8PGJmZF9pbmRpcmVjdF9saW5rX29yZGVyPj4gd2hvc2UgYXNzb2NpYXRlZCBzZWN0aW9uIGJlbG9uZ3MKLQl0byBhIEJGRCBvZiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIG91dHB1dCBCRkQgbXVzdCBiZSBoYW5kbGVkCi0Jc3BlY2lhbGx5LiAgVGhpcyB0eXBlIG9mIDw8bGlua19vcmRlcj4+IGRlc2NyaWJlcyBwYXJ0IG9mIGFuCi0Jb3V0cHV0IHNlY3Rpb24gaW4gdGVybXMgb2YgYSBzZWN0aW9uIGJlbG9uZ2luZyB0byBvbmUgb2YgdGhlCi0JaW5wdXQgZmlsZXMuICBUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBmdW5jdGlvbiBzaG91bGQgcmVhZCB0aGUKLQljb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhbmQgYW55IGFzc29jaWF0ZWQgcmVsb2NzLCBhcHBseSB0aGUKLQlyZWxvY3MgdG8gdGhlIHNlY3Rpb24gY29udGVudHMsIGFuZCB3cml0ZSBvdXQgdGhlIG1vZGlmaWVkCi0Jc2VjdGlvbiBjb250ZW50cy4gIElmIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdGhlCi0JcmVsb2NzIHRoZW1zZWx2ZXMgbXVzdCBhbHNvIGJlIG1vZGlmaWVkIGFuZCB3cml0dGVuIG91dC4KLQotQGZpbmRleCBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzCi1AZmluZGV4IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotCVRoZSBmdW5jdGlvbnMgPDxfYmZkX3JlbG9jYXRlX2NvbnRlbnRzPj4gYW5kCi0JPDxfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGU+PiBwcm92aWRlIHNvbWUgZ2VuZXJhbCBzdXBwb3J0IGZvcgotCXBlcmZvcm1pbmcgdGhlIGFjdHVhbCByZWxvY2F0aW9ucywgbm90YWJseSBvdmVyZmxvdyBjaGVja2luZy4KLQlUaGVpciBhcmd1bWVudHMgaW5jbHVkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ltYm9sIHRoZQotCXJlbG9jYXRpb24gaXMgYWdhaW5zdCBhbmQgYSA8PHJlbG9jX2hvd3RvX3R5cGU+PiBhcmd1bWVudAotCXdoaWNoIGRlc2NyaWJlcyB0aGUgcmVsb2NhdGlvbiB0byBwZXJmb3JtLiAgVGhlc2UgZnVuY3Rpb25zCi0JYXJlIGRlZmluZWQgaW4gPDxyZWxvYy5jPj4uCi0KLQlUaGUgYS5vdXQgZnVuY3Rpb24gd2hpY2ggaGFuZGxlcyByZWFkaW5nLCByZWxvY2F0aW5nLCBhbmQKLQl3cml0aW5nIHNlY3Rpb24gY29udGVudHMgaXMgPDxhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbj4+LiAgVGhlCi0JYWN0dWFsIHJlbG9jYXRpb24gaXMgZG9uZSBpbiA8PGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZD4+Ci0JYW5kIDw8YW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0Pj4uCi0KLUlOT0RFCi1Xcml0aW5nIHRoZSBzeW1ib2wgdGFibGUsICwgUmVsb2NhdGluZyB0aGUgc2VjdGlvbiBjb250ZW50cywgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluawotU1VCU1VCU0VDVElPTgotCVdyaXRpbmcgdGhlIHN5bWJvbCB0YWJsZQotCi0JVGhlIDw8X2JmZF9maW5hbF9saW5rPj4gZnVuY3Rpb24gbXVzdCBnYXRoZXIgYWxsIHRoZSBzeW1ib2xzCi0JaW4gdGhlIGlucHV0IGZpbGVzIGFuZCB3cml0ZSB0aGVtIG91dC4gIEl0IG11c3QgYWxzbyB3cml0ZSBvdXQKLQlhbGwgdGhlIHN5bWJvbHMgaW4gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgVGhpcyBtdXN0IGJlCi0JY29udHJvbGxlZCBieSB0aGUgPDxzdHJpcD4+IGFuZCA8PGRpc2NhcmQ+PiBmaWVsZHMgb2YgdGhlCi0JPDxiZmRfbGlua19pbmZvPj4gc3RydWN0dXJlLgotCi0JVGhlIGxvY2FsIHN5bWJvbHMgb2YgdGhlIGlucHV0IGZpbGVzIHdpbGwgbm90IGhhdmUgYmVlbgotCWVudGVyZWQgaW50byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PgotCXJvdXRpbmUgbXVzdCBjb25zaWRlciBlYWNoIGlucHV0IGZpbGUgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbHMKLQlpbiB0aGUgb3V0cHV0IGZpbGUuICBJdCBtYXkgYmUgY29udmVuaWVudCB0byBkbyB0aGlzIHdoZW4KLQlsb29raW5nIHRocm91Z2ggdGhlIDw8bGlua19vcmRlcj4+IHN0cnVjdHVyZXMsIG9yIGl0IG1heSBiZQotCWRvbmUgYnkgc3RlcHBpbmcgdGhyb3VnaCB0aGUgPDxpbnB1dF9iZmRzPj4gbGlzdC4KLQotCVRoZSA8PF9iZmRfZmluYWxfbGluaz4+IHJvdXRpbmUgbXVzdCBhbHNvIHRyYXZlcnNlIHRoZSBnbG9iYWwKLQloYXNoIHRhYmxlIHRvIGdhdGhlciBhbGwgdGhlIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2xzLiAgSXQKLQlpcyBwb3NzaWJsZSB0aGF0IG1vc3Qgb2YgdGhlIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2xzIG1heSBiZQotCXdyaXR0ZW4gb3V0IHdoZW4gY29uc2lkZXJpbmcgdGhlIHN5bWJvbHMgb2YgZWFjaCBpbnB1dCBmaWxlLAotCWJ1dCBpdCBpcyBzdGlsbCBuZWNlc3NhcnkgdG8gdHJhdmVyc2UgdGhlIGhhc2ggdGFibGUgc2luY2UgdGhlCi0JbGlua2VyIHNjcmlwdCBtYXkgaGF2ZSBkZWZpbmVkIHNvbWUgc3ltYm9scyB0aGF0IGFyZSBub3QgaW4KLQlhbnkgb2YgdGhlIGlucHV0IGZpbGVzLgotCi0JVGhlIDw8c3RyaXA+PiBmaWVsZCBvZiB0aGUgPDxiZmRfbGlua19pbmZvPj4gc3RydWN0dXJlCi0JY29udHJvbHMgd2hpY2ggc3ltYm9scyBhcmUgd3JpdHRlbiBvdXQuICBUaGUgcG9zc2libGUgdmFsdWVzCi0JYXJlIGxpc3RlZCBpbiA8PGJmZGxpbmsuaD4+LiAgSWYgdGhlIHZhbHVlIGlzIDw8c3RyaXBfc29tZT4+LAotCXRoZW4gdGhlIDw8a2VlcF9oYXNoPj4gZmllbGQgb2YgdGhlIDw8YmZkX2xpbmtfaW5mbz4+Ci0Jc3RydWN0dXJlIGlzIGEgaGFzaCB0YWJsZSBvZiBzeW1ib2xzIHRvIGtlZXA7IGVhY2ggc3ltYm9sCi0Jc2hvdWxkIGJlIGxvb2tlZCB1cCBpbiB0aGlzIGhhc2ggdGFibGUsIGFuZCBvbmx5IHN5bWJvbHMgd2hpY2gKLQlhcmUgcHJlc2VudCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotCi0JSWYgdGhlIDw8c3RyaXA+PiBmaWVsZCBvZiB0aGUgPDxiZmRfbGlua19pbmZvPj4gc3RydWN0dXJlCi0JcGVybWl0cyBsb2NhbCBzeW1ib2xzIHRvIGJlIHdyaXR0ZW4gb3V0LCB0aGUgPDxkaXNjYXJkPj4gZmllbGQKLQlpcyB1c2VkIHRvIGZ1cnRoZXIgY29udHJvbHMgd2hpY2ggbG9jYWwgc3ltYm9scyBhcmUgaW5jbHVkZWQKLQlpbiB0aGUgb3V0cHV0IGZpbGUuICBJZiB0aGUgdmFsdWUgaXMgPDxkaXNjYXJkX2w+PiwgdGhlbiBhbGwKLQlsb2NhbCBzeW1ib2xzIHdoaWNoIGJlZ2luIHdpdGggYSBjZXJ0YWluIHByZWZpeCBhcmUgZGlzY2FyZGVkOwotCXRoaXMgaXMgY29udHJvbGxlZCBieSB0aGUgPDxiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZT4+IGVudHJ5IHBvaW50LgotCi0JVGhlIGEub3V0IGJhY2tlbmQgaGFuZGxlcyBzeW1ib2xzIGJ5IGNhbGxpbmcKLQk8PGFvdXRfbGlua193cml0ZV9zeW1ib2xzPj4gb24gZWFjaCBpbnB1dCBCRkQgYW5kIHRoZW4KLQl0cmF2ZXJzaW5nIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSB3aXRoIHRoZSBmdW5jdGlvbgotCTw8YW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbD4+LiAgSXQgYnVpbGRzIGEgc3RyaW5nIHRhYmxlCi0Jd2hpbGUgd3JpdGluZyBvdXQgdGhlIHN5bWJvbHMsIHdoaWNoIGlzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dAotCWZpbGUgYXQgdGhlIGVuZCBvZiA8PE5BTUUoYW91dCxmaW5hbF9saW5rKT4+LgotKi8KLQotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuIGNvbGxlY3QpKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gY29sbGVjdCkpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9ub19jb2xsZWN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X2NvbGxlY3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKnBuZWVkZWQpKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKnBuZWVkZWQsIGJvb2xlYW4gY29sbGVjdCkpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkX3NpemVfdHlwZSBjb3VudCwgYXN5bWJvbCAqKiwKLQkgICBib29sZWFuIGNvbGxlY3QpKTsKLXN0YXRpYyBiZmQgKmhhc2hfZW50cnlfYmZkIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyB2b2lkIHNldF9zeW1ib2xfZnJvbV9oYXNoCi0gIFBBUkFNUyAoKGFzeW1ib2wgKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19hZGRfb3V0cHV0X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc2l6ZV90ICpwc3ltYWxsb2MsIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gZGVmYXVsdF9maWxsX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLXN0YXRpYyBib29sZWFuIGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYm9vbGVhbikpOwotCi0vKiBUaGUgbGluayBoYXNoIHRhYmxlIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIGJmZGxpbmsuaC4gIEl0IHByb3ZpZGVzCi0gICBhIGJhc2UgaGFzaCB0YWJsZSB3aGljaCB0aGUgYmFja2VuZCBzcGVjaWZpYyBoYXNoIHRhYmxlcyBhcmUgYnVpbHQKLSAgIHVwb24uICAqLwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPnR5cGUgPSBiZmRfbGlua19oYXNoX25ldzsKLSAgICAgIHJldC0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogSW5pdGlhbGl6ZSBhIGxpbmsgaGFzaCB0YWJsZS4gIFRoZSBCRkQgYXJndW1lbnQgaXMgdGhlIG9uZQotICAgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgYWJmZCwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHRhYmxlLT5jcmVhdG9yID0gYWJmZC0+eHZlYzsKLSAgdGFibGUtPnVuZGVmcyA9IE5VTEw7Ci0gIHRhYmxlLT51bmRlZnNfdGFpbCA9IE5VTEw7Ci0gIHJldHVybiBiZmRfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnRhYmxlLCBuZXdmdW5jKTsKLX0KLQotLyogTG9vayB1cCBhIHN5bWJvbCBpbiBhIGxpbmsgaGFzaCB0YWJsZS4gIElmIGZvbGxvdyBpcyB0cnVlLCB3ZQotICAgZm9sbG93IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QgYW5kIGJmZF9saW5rX2hhc2hfd2FybmluZyBsaW5rcyB0bwotICAgdGhlIHJlYWwgc3ltYm9sLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKgotYmZkX2xpbmtfaGFzaF9sb29rdXAgKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjcmVhdGU7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBmb2xsb3c7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9sb29rdXAgKCZ0YWJsZS0+dGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSk7Ci0KLSAgaWYgKGZvbGxvdyAmJiByZXQgIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgd2hpbGUgKHJldC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICB8fCByZXQtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCXJldCA9IHJldC0+dS5pLmxpbms7Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIExvb2sgdXAgYSBzeW1ib2wgaW4gdGhlIG1haW4gbGlua2VyIGhhc2ggdGFibGUgaWYgdGhlIHN5bWJvbCBtaWdodAotICAgYmUgd3JhcHBlZC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgcmVmZXJlbmNlcyB0byBhbgotICAgdW5kZWZpbmVkIHN5bWJvbCwgbm90IGZvciBkZWZpbml0aW9ucyBvZiBhIHN5bWJvbC4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoKLWJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjcmVhdGU7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBmb2xsb3c7Ci17Ci0gIGlmIChpbmZvLT53cmFwX2hhc2ggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpsOwotCi0gICAgICBsID0gc3RyaW5nOwotICAgICAgaWYgKCpsID09IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkpCi0JKytsOwotCi0jdW5kZWYgV1JBUAotI2RlZmluZSBXUkFQICJfX3dyYXBfIgotCi0gICAgICBpZiAoYmZkX2hhc2hfbG9va3VwIChpbmZvLT53cmFwX2hhc2gsIGwsIGZhbHNlLCBmYWxzZSkgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpuOwotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGJlaW5nIHdyYXBwZWQuICBXZSB3YW50IHRvIHJlcGxhY2UgYWxsCi0gICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBTWU0gd2l0aCByZWZlcmVuY2VzIHRvIF9fd3JhcF9TWU0uICAqLwotCi0JICBuID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChsKSArIHNpemVvZiBXUkFQICsgMSk7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgLyogTm90ZSB0aGF0IHN5bWJvbF9sZWFkaW5nX2NoYXIgbWF5IGJlICdcMCcuICAqLwotCSAgblswXSA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCk7Ci0JICBuWzFdID0gJ1wwJzsKLQkgIHN0cmNhdCAobiwgV1JBUCk7Ci0JICBzdHJjYXQgKG4sIGwpOwotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuLCBjcmVhdGUsIHRydWUsIGZvbGxvdyk7Ci0JICBmcmVlIChuKTsKLQkgIHJldHVybiBoOwotCX0KLQotI3VuZGVmIFdSQVAKLQotI3VuZGVmIFJFQUwKLSNkZWZpbmUgUkVBTCAiX19yZWFsXyIKLQotICAgICAgaWYgKCpsID09ICdfJwotCSAgJiYgc3RybmNtcCAobCwgUkVBTCwgc2l6ZW9mIFJFQUwgLSAxKSA9PSAwCi0JICAmJiBiZmRfaGFzaF9sb29rdXAgKGluZm8tPndyYXBfaGFzaCwgbCArIHNpemVvZiBSRUFMIC0gMSwKLQkJCSAgICAgIGZhbHNlLCBmYWxzZSkgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpuOwotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gX19yZWFsX1NZTSwgd2hlcmUgU1lNIGlzIGJlaW5nCi0gICAgICAgICAgICAgd3JhcHBlZC4gIFdlIHdhbnQgdG8gcmVwbGFjZSBhbGwgcmVmZXJlbmNlcyB0byBfX3JlYWxfU1lNCi0gICAgICAgICAgICAgd2l0aCByZWZlcmVuY2VzIHRvIFNZTS4gICovCi0KLQkgIG4gPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKGwgKyBzaXplb2YgUkVBTCAtIDEpICsgMik7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgLyogTm90ZSB0aGF0IHN5bWJvbF9sZWFkaW5nX2NoYXIgbWF5IGJlICdcMCcuICAqLwotCSAgblswXSA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCk7Ci0JICBuWzFdID0gJ1wwJzsKLQkgIHN0cmNhdCAobiwgbCArIHNpemVvZiBSRUFMIC0gMSk7Ci0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG4sIGNyZWF0ZSwgdHJ1ZSwgZm9sbG93KTsKLQkgIGZyZWUgKG4pOwotCSAgcmV0dXJuIGg7Ci0JfQotCi0jdW5kZWYgUkVBTAotICAgIH0KLQotICByZXR1cm4gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpOwotfQotCi0vKiBUcmF2ZXJzZSBhIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgVGhlIG9ubHkgcmVhc29uIHRoaXMgaXMgbm90IGEKLSAgIG1hY3JvIGlzIHRvIGRvIGJldHRlciB0eXBlIGNoZWNraW5nLiAgVGhpcyBjb2RlIHByZXN1bWVzIHRoYXQgYW4KLSAgIGFyZ3VtZW50IHBhc3NlZCBhcyBhIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqIG1heSBiZSBjYXVnaHQgYXMgYQotICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiB3aXRoIG5vIGV4cGxpY2l0IGNhc3QgcmVxdWlyZWQgb24gdGhlCi0gICBjYWxsLiAgKi8KLQotdm9pZCAKLWJmZF9saW5rX2hhc2hfdHJhdmVyc2UgKHRhYmxlLCBmdW5jLCBpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJvb2xlYW4gKCpmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLSAgICAgUFRSIGluZm87Ci17Ci0gIGJmZF9oYXNoX3RyYXZlcnNlICgmdGFibGUtPnRhYmxlLAotCQkgICAgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKQotCQkgICAgICBmdW5jKSwKLQkJICAgICBpbmZvKTsKLX0KLQotLyogQWRkIGEgc3ltYm9sIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSB1bmRlZnMgbGlzdC4gICovCi0KLUlOTElORSB2b2lkCi1iZmRfbGlua19hZGRfdW5kZWYgKHRhYmxlLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBCRkRfQVNTRVJUIChoLT5uZXh0ID09IE5VTEwpOwotICBpZiAodGFibGUtPnVuZGVmc190YWlsICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHRhYmxlLT51bmRlZnNfdGFpbC0+bmV4dCA9IGg7Ci0gIGlmICh0YWJsZS0+dW5kZWZzID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHRhYmxlLT51bmRlZnMgPSBoOwotICB0YWJsZS0+dW5kZWZzX3RhaWwgPSBoOwotfQotDAotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+d3JpdHRlbiA9IGZhbHNlOwotICAgICAgcmV0LT5zeW0gPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBnZW5lcmljIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLV9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyZXQtPnJvb3Q7Ci19Ci0KLS8qIEdyYWIgdGhlIHN5bWJvbHMgZm9yIGFuIG9iamVjdCBmaWxlIHdoZW4gZG9pbmcgYSBnZW5lcmljIGxpbmsuICBXZQotICAgc3RvcmUgdGhlIHN5bWJvbHMgaW4gdGhlIG91dHN5bWJvbHMgZmllbGQuICBXZSBuZWVkIHRvIGtlZXAgdGhlbQotICAgYXJvdW5kIGZvciB0aGUgZW50aXJlIGxpbmsgdG8gZW5zdXJlIHRoYXQgd2Ugb25seSByZWFkIHRoZW0gb25jZS4KLSAgIElmIHdlIHJlYWQgdGhlbSBtdWx0aXBsZSB0aW1lcywgd2UgbWlnaHQgd2luZCB1cCB3aXRoIHJlbG9jcyBhbmQKLSAgIHRoZSBoYXNoIHRhYmxlIHBvaW50aW5nIHRvIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgdGhlIHN5bWJvbAotICAgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPT0gKGFzeW1ib2wgKiopIE5VTEwpCi0gICAgewotICAgICAgbG9uZyBzeW1zaXplOwotICAgICAgbG9uZyBzeW1jb3VudDsKLQotICAgICAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgICAgIGlmIChzeW1zaXplIDwgMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpID0gKGFzeW1ib2wgKiopIGJmZF9hbGxvYyAoYWJmZCwgc3ltc2l6ZSk7Ci0gICAgICBpZiAoYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSA9PSBOVUxMICYmIHN5bXNpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpKTsKLSAgICAgIGlmIChzeW1jb3VudCA8IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW1jb3VudDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBHZW5lcmljIGZ1bmN0aW9uIHRvIGFkZCBzeW1ib2xzIHRvIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlCi0gICBnbG9iYWwgaGFzaCB0YWJsZS4gIFRoaXMgdmVyc2lvbiBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGNvbGxlY3QKLSAgIGNvbnN0cnVjdG9ycyBieSBuYW1lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8sIGZhbHNlKTsKLX0KLQotLyogR2VuZXJpYyBmdW5jdGlvbiB0byBhZGQgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwKLSAgIGhhc2ggdGFibGUuICBUaGlzIHZlcnNpb24gYXV0b21hdGljYWxseSBjb2xsZWN0cyBjb25zdHJ1Y3RvcnMgYnkKLSAgIG5hbWUsIGFzIHRoZSBjb2xsZWN0MiBwcm9ncmFtIGRvZXMuICBJdCBzaG91bGQgYmUgdXNlZCBmb3IgYW55Ci0gICB0YXJnZXQgd2hpY2ggZG9lcyBub3QgcHJvdmlkZSBzb21lIG90aGVyIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB1cAotICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yczsgdGhlc2UgYXJlIGFwcHJveGltYXRlbHkgdGhvc2UgdGFyZ2V0cwotICAgZm9yIHdoaWNoIGdjYyB1c2VzIGNvbGxlY3QyIGFuZCBkbyBub3Qgc3VwcG9ydCBzdGFicy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzX2NvbGxlY3QgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8sIHRydWUpOwotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8sIGNvbGxlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLXsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIHJldCA9IGdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8sIGNvbGxlY3QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIHJldCA9IChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0JICAgICAoYWJmZCwgaW5mbywKLQkgICAgICAoY29sbGVjdAotCSAgICAgICA/IGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfY29sbGVjdAotCSAgICAgICA6IGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfbm9fY29sbGVjdCkpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldCA9IGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvLCBjb2xsZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci17Ci0gIGlmICghIGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QgKGFiZmQsIGluZm8sCi0JCQkJICAgICAgIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCAoYWJmZCksCi0JCQkJICAgICAgIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKSwKLQkJCQkgICAgICAgY29sbGVjdCk7Ci19Ci0MCi0vKiBXZSBidWlsZCBhIGhhc2ggdGFibGUgb2YgYWxsIHN5bWJvbHMgZGVmaW5lZCBpbiBhbiBhcmNoaXZlLiAgKi8KLQotLyogQW4gYXJjaGl2ZSBzeW1ib2wgbWF5IGJlIGRlZmluZWQgYnkgbXVsdGlwbGUgYXJjaGl2ZSBlbGVtZW50cy4KLSAgIFRoaXMgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBob2xkIHRoZSBlbGVtZW50cy4gICovCi0KLXN0cnVjdCBhcmNoaXZlX2xpc3QKLXsKLSAgc3RydWN0IGFyY2hpdmVfbGlzdCAqbmV4dDsKLSAgaW50IGluZHg7Ci19OwotCi0vKiBBbiBlbnRyeSBpbiBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBXaGVyZSB0aGUgc3ltYm9sIGlzIGRlZmluZWQuICAqLwotICBzdHJ1Y3QgYXJjaGl2ZV9saXN0ICpkZWZzOwotfTsKLQotLyogQW4gYXJjaGl2ZSBoYXNoIHRhYmxlIGl0c2VsZi4gICovCi0KLXN0cnVjdCBhcmNoaXZlX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHRhYmxlOwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYXJjaGl2ZV9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGFyY2hpdmVfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBhcmNoaXZlX2hhc2hfdGFibGUgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7Ci0KLS8qIENyZWF0ZSBhIG5ldyBlbnRyeSBmb3IgYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1hcmNoaXZlX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5kZWZzID0gKHN0cnVjdCBhcmNoaXZlX2xpc3QgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hcmNoaXZlX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBhcmNoaXZlX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICByZXR1cm4gYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT50YWJsZSwgbmV3ZnVuYyk7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhcmNoaXZlX2hhc2hfbG9va3VwKHQsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodCktPnRhYmxlLCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIEFsbG9jYXRlIHNwYWNlIGluIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYXJjaGl2ZV9oYXNoX2FsbG9jYXRlKHQsIHNpemUpIGJmZF9oYXNoX2FsbG9jYXRlICgmKHQpLT50YWJsZSwgKHNpemUpKQotCi0vKiBGcmVlIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYXJjaGl2ZV9oYXNoX3RhYmxlX2ZyZWUodCkgYmZkX2hhc2hfdGFibGVfZnJlZSAoJih0KS0+dGFibGUpCi0KLS8qIEdlbmVyaWMgZnVuY3Rpb24gdG8gYWRkIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlIGZpbGUgdG8gdGhlIGdsb2JhbAotICAgaGFzaCBmaWxlLiAgVGhpcyBmdW5jdGlvbiBwcmVzdW1lcyB0aGF0IHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZQotICAgaGFzIGFscmVhZHkgYmVlbiByZWFkIGluICh0aGlzIGlzIG5vcm1hbGx5IGRvbmUgYnkgdGhlCi0gICBiZmRfY2hlY2tfZm9ybWF0IGVudHJ5IHBvaW50KS4gIEl0IGxvb2tzIHRocm91Z2ggdGhlIHVuZGVmaW5lZCBhbmQKLSAgIGNvbW1vbiBzeW1ib2xzIGFuZCBzZWFyY2hlcyB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgZm9yIHRoZW0uICBJZgotICAgaXQgZmluZHMgYW4gZW50cnksIGl0IGluY2x1ZGVzIHRoZSBhc3NvY2lhdGVkIG9iamVjdCBmaWxlIGluIHRoZQotICAgbGluay4KLQotICAgVGhlIG9sZCBsaW5rZXIgbG9va2VkIHRocm91Z2ggdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIGZvcgotICAgdW5kZWZpbmVkIHN5bWJvbHMuICBXZSBkbyBpdCB0aGUgb3RoZXIgd2F5IGFyb3VuZCwgbG9va2luZyB0aHJvdWdoCi0gICB1bmRlZmluZWQgc3ltYm9scyBmb3Igc3ltYm9scyBkZWZpbmVkIGluIHRoZSBhcmNoaXZlLiAgVGhlCi0gICBhZHZhbnRhZ2Ugb2YgdGhlIG5ld2VyIHNjaGVtZSBpcyB0aGF0IHdlIG9ubHkgaGF2ZSB0byBsb29rIHRocm91Z2gKLSAgIHRoZSBsaXN0IG9mIHVuZGVmaW5lZCBzeW1ib2xzIG9uY2UsIHdoZXJlYXMgdGhlIG9sZCBtZXRob2QgaGFkIHRvCi0gICByZS1zZWFyY2ggdGhlIHN5bWJvbCB0YWJsZSBlYWNoIHRpbWUgYSBuZXcgb2JqZWN0IGZpbGUgd2FzIGFkZGVkLgotCi0gICBUaGUgQ0hFQ0tGTiBhcmd1bWVudCBpcyB1c2VkIHRvIHNlZSBpZiBhbiBvYmplY3QgZmlsZSBzaG91bGQgYmUKLSAgIGluY2x1ZGVkLiAgQ0hFQ0tGTiBzaG91bGQgc2V0ICpQTkVFREVEIHRvIHRydWUgaWYgdGhlIG9iamVjdCBmaWxlCi0gICBzaG91bGQgYmUgaW5jbHVkZWQsIGFuZCBtdXN0IGFsc28gY2FsbCB0aGUgYmZkX2xpbmtfaW5mbwotICAgYWRkX2FyY2hpdmVfZWxlbWVudCBjYWxsYmFjayBmdW5jdGlvbiBhbmQgaGFuZGxlIGFkZGluZyB0aGUgc3ltYm9scwotICAgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgQ0hFQ0tGTiBzaG91bGQgb25seSByZXR1cm4gZmFsc2UgaWYgc29tZQotICAgc29ydCBvZiBlcnJvciBvY2N1cnMuCi0KLSAgIEZvciBzb21lIGZvcm1hdHMsIHN1Y2ggYXMgYS5vdXQsIGl0IGlzIHBvc3NpYmxlIHRvIGxvb2sgdGhyb3VnaCBhbgotICAgb2JqZWN0IGZpbGUgYnV0IG5vdCBhY3R1YWxseSBpbmNsdWRlIGl0IGluIHRoZSBsaW5rLiAgVGhlCi0gICBhcmNoaXZlX3Bhc3MgZmllbGQgaW4gYSBCRkQgaXMgdXNlZCB0byBhdm9pZCBjaGVja2luZyB0aGUgc3ltYm9scwotICAgb2YgYW4gb2JqZWN0IGZpbGVzIHRvbyBtYW55IHRpbWVzLiAgV2hlbiBhbiBvYmplY3QgaXMgaW5jbHVkZWQgaW4KLSAgIHRoZSBsaW5rLCBhcmNoaXZlX3Bhc3MgaXMgc2V0IHRvIC0xLiAgSWYgYW4gb2JqZWN0IGlzIHNjYW5uZWQgYnV0Ci0gICBub3QgaW5jbHVkZWQsIGFyY2hpdmVfcGFzcyBpcyBzZXQgdG8gdGhlIHBhc3MgbnVtYmVyLiAgVGhlIHBhc3MKLSAgIG51bWJlciBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSBuZXcgb2JqZWN0IGZpbGUgaXMgaW5jbHVkZWQuICBUaGUKLSAgIHBhc3MgbnVtYmVyIGlzIHVzZWQgYmVjYXVzZSB3aGVuIGEgbmV3IG9iamVjdCBmaWxlIGlzIGluY2x1ZGVkIGl0Ci0gICBtYXkgY3JlYXRlIG5ldyB1bmRlZmluZWQgc3ltYm9scyB3aGljaCBjYXVzZSBhIHByZXZpb3VzbHkgZXhhbWluZWQKLSAgIG9iamVjdCBmaWxlIHRvIGJlIGluY2x1ZGVkLiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyAoYWJmZCwgaW5mbywgY2hlY2tmbikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAoKmNoZWNrZm4pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSBib29sZWFuICpwbmVlZGVkKSk7Ci17Ci0gIGNhcnN5bSAqYXJzeW1zOwotICBjYXJzeW0gKmFyc3ltX2VuZDsKLSAgcmVnaXN0ZXIgY2Fyc3ltICphcnN5bTsKLSAgaW50IHBhc3M7Ci0gIHN0cnVjdCBhcmNoaXZlX2hhc2hfdGFibGUgYXJzeW1faGFzaDsKLSAgaW50IGluZHg7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqcHVuZGVmOwotCi0gIGlmICghIGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBBbiBlbXB0eSBhcmNoaXZlIGlzIGEgc3BlY2lhbCBjYXNlLiAgKi8KLSAgICAgIGlmIChiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fYXJtYXApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBhcnN5bXMgPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmczsKLSAgYXJzeW1fZW5kID0gYXJzeW1zICsgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudDsKLQotICAvKiBJbiBvcmRlciB0byBxdWlja2x5IGRldGVybWluZSB3aGV0aGVyIGFuIHN5bWJvbCBpcyBkZWZpbmVkIGluCi0gICAgIHRoaXMgYXJjaGl2ZSwgd2UgYnVpbGQgYSBoYXNoIHRhYmxlIG9mIHRoZSBzeW1ib2xzLiAgKi8KLSAgaWYgKCEgYXJjaGl2ZV9oYXNoX3RhYmxlX2luaXQgKCZhcnN5bV9oYXNoLCBhcmNoaXZlX2hhc2hfbmV3ZnVuYykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKGFyc3ltID0gYXJzeW1zLCBpbmR4ID0gMDsgYXJzeW0gPCBhcnN5bV9lbmQ7IGFyc3ltKyssIGluZHgrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICphcmg7Ci0gICAgICBzdHJ1Y3QgYXJjaGl2ZV9saXN0ICpsLCAqKnBwOwotCi0gICAgICBhcmggPSBhcmNoaXZlX2hhc2hfbG9va3VwICgmYXJzeW1faGFzaCwgYXJzeW0tPm5hbWUsIHRydWUsIGZhbHNlKTsKLSAgICAgIGlmIChhcmggPT0gKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGwgPSAoKHN0cnVjdCBhcmNoaXZlX2xpc3QgKikKLQkgICBhcmNoaXZlX2hhc2hfYWxsb2NhdGUgKCZhcnN5bV9oYXNoLCBzaXplb2YgKHN0cnVjdCBhcmNoaXZlX2xpc3QpKSk7Ci0gICAgICBpZiAobCA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgbC0+aW5keCA9IGluZHg7Ci0gICAgICBmb3IgKHBwID0gJmFyaC0+ZGVmczsKLQkgICAqcHAgIT0gKHN0cnVjdCBhcmNoaXZlX2xpc3QgKikgTlVMTDsKLQkgICBwcCA9ICYoKnBwKS0+bmV4dCkKLQk7Ci0gICAgICAqcHAgPSBsOwotICAgICAgbC0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFRoZSBhcmNoaXZlX3Bhc3MgZmllbGQgaW4gdGhlIGFyY2hpdmUgaXRzZWxmIGlzIHVzZWQgdG8KLSAgICAgaW5pdGlhbGl6ZSBQQVNTLCBzaW5lIHdlIG1heSBzZWFyY2ggdGhlIHNhbWUgYXJjaGl2ZSBtdWx0aXBsZQotICAgICB0aW1lcy4gICovCi0gIHBhc3MgPSBhYmZkLT5hcmNoaXZlX3Bhc3MgKyAxOwotCi0gIC8qIE5ldyB1bmRlZmluZWQgc3ltYm9scyBhcmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCwgc28gd2UKLSAgICAgb25seSBuZWVkIHRvIGxvb2sgdGhyb3VnaCBpdCBvbmNlLiAgKi8KLSAgcHVuZGVmID0gJmluZm8tPmhhc2gtPnVuZGVmczsKLSAgd2hpbGUgKCpwdW5kZWYgIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICphcmg7Ci0gICAgICBzdHJ1Y3QgYXJjaGl2ZV9saXN0ICpsOwotCi0gICAgICBoID0gKnB1bmRlZjsKLQotICAgICAgLyogV2hlbiBhIHN5bWJvbCBpcyBkZWZpbmVkLCBpdCBpcyBub3QgbmVjZXNzYXJpbHkgcmVtb3ZlZCBmcm9tCi0JIHRoZSBsaXN0LiAgKi8KLSAgICAgIGlmIChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCXsKLQkgIC8qIFJlbW92ZSB0aGlzIGVudHJ5IGZyb20gdGhlIGxpc3QsIGZvciBnZW5lcmFsIGNsZWFubGluZXNzCi0JICAgICBhbmQgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gbG9vayB0aHJvdWdoIHRoZSBsaXN0IGFnYWluCi0JICAgICBpZiB3ZSBzZWFyY2ggYW55IG1vcmUgbGlicmFyaWVzLiAgV2UgY2FuJ3QgcmVtb3ZlIHRoZQotCSAgICAgZW50cnkgaWYgaXQgaXMgdGhlIHRhaWwsIGJlY2F1c2UgdGhhdCB3b3VsZCBsb3NlIGFueQotCSAgICAgZW50cmllcyB3ZSBhZGQgdG8gdGhlIGxpc3QgbGF0ZXIgb24gKGl0IHdvdWxkIGFsc28gY2F1c2UKLQkgICAgIHVzIHRvIGxvc2UgdHJhY2sgb2Ygd2hldGhlciB0aGUgc3ltYm9sIGhhcyBiZWVuCi0JICAgICByZWZlcmVuY2VkKS4gICovCi0JICBpZiAoKnB1bmRlZiAhPSBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCkKLQkgICAgKnB1bmRlZiA9ICgqcHVuZGVmKS0+bmV4dDsKLQkgIGVsc2UKLQkgICAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGFyY2hpdmUgc3ltYm9sIG1hcC4gICovCi0gICAgICBhcmggPSBhcmNoaXZlX2hhc2hfbG9va3VwICgmYXJzeW1faGFzaCwgaC0+cm9vdC5zdHJpbmcsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoYXJoID09IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0JewotCSAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayBhdCBhbGwgdGhlIG9iamVjdHMgd2hpY2ggZGVmaW5lIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGZvciAobCA9IGFyaC0+ZGVmczsgbCAhPSAoc3RydWN0IGFyY2hpdmVfbGlzdCAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLQl7Ci0JICBiZmQgKmVsZW1lbnQ7Ci0JICBib29sZWFuIG5lZWRlZDsKLQotCSAgLyogSWYgdGhlIHN5bWJvbCBoYXMgZ290dGVuIGRlZmluZWQgYWxvbmcgdGhlIHdheSwgcXVpdC4gICovCi0JICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JICAgIGJyZWFrOwotCi0JICBlbGVtZW50ID0gYmZkX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGwtPmluZHgpOwotCSAgaWYgKGVsZW1lbnQgPT0gKGJmZCAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogSWYgd2UndmUgYWxyZWFkeSBpbmNsdWRlZCB0aGlzIGVsZW1lbnQsIG9yIGlmIHdlJ3ZlCi0JICAgICBhbHJlYWR5IGNoZWNrZWQgaXQgb24gdGhpcyBwYXNzLCBjb250aW51ZS4gICovCi0JICBpZiAoZWxlbWVudC0+YXJjaGl2ZV9wYXNzID09IC0xCi0JICAgICAgfHwgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID09IHBhc3MpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB3ZSBjYW4ndCBmaWd1cmUgdGhpcyBlbGVtZW50IG91dCwganVzdCBpZ25vcmUgaXQuICAqLwotCSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoZWxlbWVudCwgYmZkX29iamVjdCkpCi0JICAgIHsKLQkgICAgICBlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPSAtMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBDSEVDS0ZOIHdpbGwgc2VlIGlmIHRoaXMgZWxlbWVudCBzaG91bGQgYmUgaW5jbHVkZWQsIGFuZAotCSAgICAgZ28gYWhlYWQgYW5kIGluY2x1ZGUgaXQgaWYgYXBwcm9wcmlhdGUuICAqLwotCSAgaWYgKCEgKCpjaGVja2ZuKSAoZWxlbWVudCwgaW5mbywgJm5lZWRlZCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoISBuZWVkZWQpCi0JICAgIGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9IHBhc3M7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPSAtMTsKLQotCSAgICAgIC8qIEluY3JlbWVudCB0aGUgcGFzcyBjb3VudCB0byBzaG93IHRoYXQgd2UgbWF5IG5lZWQgdG8KLQkJIHJlY2hlY2sgb2JqZWN0IGZpbGVzIHdoaWNoIHdlcmUgYWxyZWFkeSBjaGVja2VkLiAgKi8KLQkgICAgICArK3Bhc3M7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0gICAgfQotCi0gIGFyY2hpdmVfaGFzaF90YWJsZV9mcmVlICgmYXJzeW1faGFzaCk7Ci0KLSAgLyogU2F2ZSBQQVNTIGluIGNhc2Ugd2UgYXJlIGNhbGxlZCBhZ2Fpbi4gICovCi0gIGFiZmQtPmFyY2hpdmVfcGFzcyA9IHBhc3M7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGFyY2hpdmVfaGFzaF90YWJsZV9mcmVlICgmYXJzeW1faGFzaCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIFNlZSBpZiB3ZSBzaG91bGQgaW5jbHVkZSBhbiBhcmNoaXZlIGVsZW1lbnQuICBUaGlzIHZlcnNpb24gaXMgdXNlZAotICAgd2hlbiB3ZSBkbyBub3Qgd2FudCB0byBhdXRvbWF0aWNhbGx5IGNvbGxlY3QgY29uc3RydWN0b3JzIGJhc2VkIG9uCi0gICB0aGUgc3ltYm9sIG5hbWUsIHByZXN1bWFibHkgYmVjYXVzZSB3ZSBoYXZlIHNvbWUgb3RoZXIgbWVjaGFuaXNtCi0gICBmb3IgZmluZGluZyB0aGVtLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfbm9fY29sbGVjdCAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgcmV0dXJuIGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQsIGZhbHNlKTsKLX0KLQotLyogU2VlIGlmIHdlIHNob3VsZCBpbmNsdWRlIGFuIGFyY2hpdmUgZWxlbWVudC4gIFRoaXMgdmVyc2lvbiBpcyB1c2VkCi0gICB3aGVuIHdlIHdhbnQgdG8gYXV0b21hdGljYWxseSBjb2xsZWN0IGNvbnN0cnVjdG9ycyBiYXNlZCBvbiB0aGUKLSAgIHN5bWJvbCBuYW1lLCBhcyBjb2xsZWN0MiBkb2VzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfY29sbGVjdCAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgcmV0dXJuIGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQsIHRydWUpOwotfQotCi0vKiBTZWUgaWYgd2Ugc2hvdWxkIGluY2x1ZGUgYW4gYXJjaGl2ZSBlbGVtZW50LiAgT3B0aW9uYWxseSBjb2xsZWN0Ci0gICBjb25zdHJ1Y3RvcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCwgY29sbGVjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotewotICBhc3ltYm9sICoqcHAsICoqcHBlbmQ7Ci0KLSAgKnBuZWVkZWQgPSBmYWxzZTsKLQotICBpZiAoISBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcHAgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIHBwZW5kID0gcHAgKyBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGFiZmQpOwotICBmb3IgKDsgcHAgPCBwcGVuZDsgcHArKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpwOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHAgPSAqcHA7Ci0KLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZ2xvYmFsbHkgdmlzaWJsZSBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAocC0+c2VjdGlvbikKLQkgICYmIChwLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX0lORElSRUNUIHwgQlNGX1dFQUspKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGlmIHdlIGtub3cgc29tZXRoaW5nIGFib3V0IHRoaXMKLQkgc3ltYm9sLCBhbmQgaXQgaXMgdW5kZWZpbmVkIG9yIGNvbW1vbi4gIEFuIHVuZGVmaW5lZCB3ZWFrCi0JIHN5bWJvbCAodHlwZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykgaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUKLQkgYSByZWZlcmVuY2Ugd2hlbiBwdWxsaW5nIGZpbGVzIG91dCBvZiBhbiBhcmNoaXZlLiAgU2VlIHRoZQotCSBTVlI0IEFCSSwgcC4gNC0yNy4gICovCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIGJmZF9hc3ltYm9sX25hbWUgKHApLCBmYWxzZSwKLQkJCQlmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgfHwgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICAgICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKSkKLQljb250aW51ZTsKLQotICAgICAgLyogUCBpcyBhIHN5bWJvbCB3ZSBhcmUgbG9va2luZyBmb3IuICAqLwotCi0gICAgICBpZiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci0JICBhc3ltYm9sICoqc3ltYm9sczsKLQotCSAgLyogVGhpcyBvYmplY3QgZmlsZSBkZWZpbmVzIHRoaXMgc3ltYm9sLCBzbyBwdWxsIGl0IGluLiAgKi8KLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwKLQkJCQkJCQkgYmZkX2FzeW1ib2xfbmFtZSAocCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzeW1jb3VudCA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0JICBzeW1ib2xzID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGFiZmQpOwotCSAgaWYgKCEgZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCAoYWJmZCwgaW5mbywgc3ltY291bnQsCi0JCQkJCSAgICAgIHN5bWJvbHMsIGNvbGxlY3QpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAqcG5lZWRlZCA9IHRydWU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIFAgaXMgYSBjb21tb24gc3ltYm9sLiAgKi8KLQotICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JewotCSAgYmZkICpzeW1iZmQ7Ci0JICBiZmRfdm1hIHNpemU7Ci0JICB1bnNpZ25lZCBpbnQgcG93ZXI7Ci0KLQkgIHN5bWJmZCA9IGgtPnUudW5kZWYuYWJmZDsKLQkgIGlmIChzeW1iZmQgPT0gKGJmZCAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzeW1ib2wgd2FzIGNyZWF0ZWQgYXMgdW5kZWZpbmVkIGZyb20gb3V0c2lkZQotCQkgQkZELiAgV2UgYXNzdW1lIHRoYXQgd2Ugc2hvdWxkIGxpbmsgaW4gdGhlIG9iamVjdAotCQkgZmlsZS4gIFRoaXMgaXMgZm9yIHRoZSAtdSBvcHRpb24gaW4gdGhlIGxpbmtlci4gICovCi0JICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpCi0JCSAgKGluZm8sIGFiZmQsIGJmZF9hc3ltYm9sX25hbWUgKHApKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgICpwbmVlZGVkID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCi0JICAvKiBUdXJuIHRoZSBzeW1ib2wgaW50byBhIGNvbW1vbiBzeW1ib2wgYnV0IGRvIG5vdCBsaW5rIGluCi0JICAgICB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIGlzIGhvdyBhLm91dCB3b3Jrcy4gIE9iamVjdAotCSAgICAgZm9ybWF0cyB0aGF0IHJlcXVpcmUgZGlmZmVyZW50IHNlbWFudGljcyBtdXN0IGltcGxlbWVudAotCSAgICAgdGhpcyBmdW5jdGlvbiBkaWZmZXJlbnRseS4gIFRoaXMgc3ltYm9sIGlzIGFscmVhZHkgb24gdGhlCi0JICAgICB1bmRlZnMgbGlzdC4gIFdlIGFkZCB0aGUgc2VjdGlvbiB0byBhIGNvbW1vbiBzZWN0aW9uCi0JICAgICBhdHRhY2hlZCB0byBzeW1iZmQgdG8gZW5zdXJlIHRoYXQgaXQgaXMgaW4gYSBCRkQgd2hpY2gKLQkgICAgIHdpbGwgYmUgbGlua2VkIGluLiAgKi8KLQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2NvbW1vbjsKLQkgIGgtPnUuYy5wID0KLQkgICAgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkgKikKLQkgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkpKSk7Ci0JICBpZiAoaC0+dS5jLnAgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBzaXplID0gYmZkX2FzeW1ib2xfdmFsdWUgKHApOwotCSAgaC0+dS5jLnNpemUgPSBzaXplOwotCi0JICBwb3dlciA9IGJmZF9sb2cyIChzaXplKTsKLQkgIGlmIChwb3dlciA+IDQpCi0JICAgIHBvd2VyID0gNDsKLQkgIGgtPnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcjsKLQotCSAgaWYgKHAtPnNlY3Rpb24gPT0gYmZkX2NvbV9zZWN0aW9uX3B0cikKLQkgICAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN5bWJmZCwgIkNPTU1PTiIpOwotCSAgZWxzZQotCSAgICBoLT51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3ltYmZkLAotCQkJCQkJCSAgcC0+c2VjdGlvbi0+bmFtZSk7Ci0JICBoLT51LmMucC0+c2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgY29tbW9uIHN5bWJvbCBpZiBuZWNlc3NhcnkuICBUaGlzCi0JICAgICBpcyBob3cgYS5vdXQgd29ya3MuICBPYmplY3QgZm9ybWF0cyB0aGF0IHJlcXVpcmUKLQkgICAgIGRpZmZlcmVudCBzZW1hbnRpY3MgbXVzdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbgotCSAgICAgZGlmZmVyZW50bHkuICAqLwotCSAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChwKSA+IGgtPnUuYy5zaXplKQotCSAgICBoLT51LmMuc2l6ZSA9IGJmZF9hc3ltYm9sX3ZhbHVlIChwKTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoaXMgYXJjaGl2ZSBlbGVtZW50IGlzIG5vdCBuZWVkZWQuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIHRoZSBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgQUJGRAotICAgaXMgdGhlIG9iamVjdCBmaWxlLiAgSU5GTyBpcyB0aGUgbGlua2VyIGluZm9ybWF0aW9uLiAgU1lNQk9MX0NPVU5UCi0gICBpcyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMuICBTWU1CT0xTIGlzIHRoZSBsaXN0IG9mIHN5bWJvbHMuICBDT0xMRUNUCi0gICBpcyB0cnVlIGlmIGNvbnN0cnVjdG9ycyBzaG91bGQgYmUgYXV0b21hdGljYWxseSBjb2xsZWN0ZWQgYnkgbmFtZQotICAgYXMgaXMgZG9uZSBieSBjb2xsZWN0Mi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0IChhYmZkLCBpbmZvLCBzeW1ib2xfY291bnQsIHN5bWJvbHMsIGNvbGxlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltYm9sX2NvdW50OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotewotICBhc3ltYm9sICoqcHAsICoqcHBlbmQ7Ci0KLSAgcHAgPSBzeW1ib2xzOwotICBwcGVuZCA9IHN5bWJvbHMgKyBzeW1ib2xfY291bnQ7Ci0gIGZvciAoOyBwcCA8IHBwZW5kOyBwcCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnA7Ci0KLSAgICAgIHAgPSAqcHA7Ci0KLSAgICAgIGlmICgocC0+ZmxhZ3MgJiAoQlNGX0lORElSRUNUCi0JCSAgICAgICB8IEJTRl9XQVJOSU5HCi0JCSAgICAgICB8IEJTRl9HTE9CQUwKLQkJICAgICAgIHwgQlNGX0NPTlNUUlVDVE9SCi0JCSAgICAgICB8IEJTRl9XRUFLKSkgIT0gMAotCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKQotCSAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKQotCSAgfHwgYmZkX2lzX2luZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY29uc3QgY2hhciAqc3RyaW5nOwotCSAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAocCk7Ci0JICBpZiAoKChwLT5mbGFncyAmIEJTRl9JTkRJUkVDVCkgIT0gMAotCSAgICAgICB8fCBiZmRfaXNfaW5kX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCSAgICAgICYmIHBwICsgMSA8IHBwZW5kKQotCSAgICB7Ci0JICAgICAgcHArKzsKLQkgICAgICBzdHJpbmcgPSBiZmRfYXN5bWJvbF9uYW1lICgqcHApOwotCSAgICB9Ci0JICBlbHNlIGlmICgocC0+ZmxhZ3MgJiBCU0ZfV0FSTklORykgIT0gMAotCQkgICAmJiBwcCArIDEgPCBwcGVuZCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBuYW1lIG9mIFAgaXMgYWN0dWFsbHkgdGhlIHdhcm5pbmcgc3RyaW5nLCBhbmQgdGhlCi0JCSBuZXh0IHN5bWJvbCBpcyB0aGUgb25lIHRvIHdhcm4gYWJvdXQuICAqLwotCSAgICAgIHN0cmluZyA9IG5hbWU7Ci0JICAgICAgcHArKzsKLQkgICAgICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoKnBwKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzdHJpbmcgPSBOVUxMOwotCi0JICBoID0gTlVMTDsKLQkgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgKGluZm8sIGFiZmQsIG5hbWUsIHAtPmZsYWdzLCBiZmRfZ2V0X3NlY3Rpb24gKHApLAotCQkgIHAtPnZhbHVlLCBzdHJpbmcsIGZhbHNlLCBjb2xsZWN0LAotCQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBJZiB0aGlzIGlzIGEgY29uc3RydWN0b3Igc3ltYm9sLCBhbmQgdGhlIGxpbmtlciBkaWRuJ3QgZG8KLSAgICAgICAgICAgICBhbnl0aGluZyB3aXRoIGl0LCB0aGVuIHdlIHdhbnQgdG8ganVzdCBwYXNzIHRoZSBzeW1ib2wKLSAgICAgICAgICAgICB0aHJvdWdoIHRvIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMgd2lsbCBoYXBwZW4gd2hlbgotICAgICAgICAgICAgIGxpbmtpbmcgd2l0aCAtci4gICovCi0JICBpZiAoKHAtPmZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwCi0JICAgICAgJiYgKGggPT0gTlVMTCB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpKQotCSAgICB7Ci0JICAgICAgcC0+dWRhdGEucCA9IE5VTEw7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogU2F2ZSB0aGUgQkZEIHN5bWJvbCBzbyB0aGF0IHdlIGRvbid0IGxvc2UgYW55IGJhY2tlbmQKLQkgICAgIHNwZWNpZmljIGluZm9ybWF0aW9uIHRoYXQgbWF5IGJlIGF0dGFjaGVkIHRvIGl0LiAgV2Ugb25seQotCSAgICAgd2FudCB0aGlzIG9uZSBpZiBpdCBnaXZlcyBtb3JlIGluZm9ybWF0aW9uIHRoYW4gdGhlCi0JICAgICBleGlzdGluZyBvbmU7IHdlIGRvbid0IHdhbnQgdG8gcmVwbGFjZSBhIGRlZmluZWQgc3ltYm9sCi0JICAgICB3aXRoIGFuIHVuZGVmaW5lZCBvbmUuICBUaGlzIHJvdXRpbmUgbWF5IGJlIGNhbGxlZCB3aXRoIGEKLQkgICAgIGhhc2ggdGFibGUgb3RoZXIgdGhhbiB0aGUgZ2VuZXJpYyBoYXNoIHRhYmxlLCBzbyB3ZSBvbmx5Ci0JICAgICBkbyB0aGlzIGlmIHdlIGFyZSBjZXJ0YWluIHRoYXQgdGhlIGhhc2ggdGFibGUgaXMgYQotCSAgICAgZ2VuZXJpYyBvbmUuICAqLwotCSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgIGlmIChoLT5zeW0gPT0gKGFzeW1ib2wgKikgTlVMTAotCQkgIHx8ICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkKLQkJICAgICAgJiYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKQotCQkJICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoaC0+c3ltKSkpKSkKLQkJewotCQkgIGgtPnN5bSA9IHA7Ci0JCSAgLyogQlNGX09MRF9DT01NT04gaXMgYSBoYWNrIHRvIHN1cHBvcnQgQ09GRiByZWxvYwotCQkgICAgIHJlYWRpbmcsIGFuZCBpdCBzaG91bGQgZ28gYXdheSB3aGVuIHRoZSBDT0ZGCi0JCSAgICAgbGlua2VyIGlzIHN3aXRjaGVkIHRvIHRoZSBuZXcgdmVyc2lvbi4gICovCi0JCSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkpCi0JCSAgICBwLT5mbGFncyB8PSBCU0ZfT0xEX0NPTU1PTjsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFN0b3JlIGEgYmFjayBwb2ludGVyIGZyb20gdGhlIHN5bWJvbCB0byB0aGUgaGFzaAotCSAgICAgdGFibGUgZW50cnkgZm9yIHRoZSBiZW5lZml0IG9mIHJlbGF4YXRpb24gY29kZSB1bnRpbAotCSAgICAgaXQgZ2V0cyByZXdyaXR0ZW4gdG8gbm90IHVzZSBhc3ltYm9sIHN0cnVjdHVyZXMuCi0JICAgICBTZXR0aW5nIHRoaXMgaXMgYWxzbyB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgdGhlc2UKLQkgICAgIHN5bWJvbHMgd2VyZSBzZXQgdXAgYnkgdGhlIGdlbmVyaWMgbGlua2VyLiAgKi8KLQkgIHAtPnVkYXRhLnAgPSAoUFRSKSBoOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBXZSB1c2UgYSBzdGF0ZSB0YWJsZSB0byBkZWFsIHdpdGggYWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBUaGUgZmlyc3QgaW5kZXggaW50byB0aGUgc3RhdGUgdGFibGUgZGVzY3JpYmVzIHRoZSBzeW1ib2wKLSAgIGZyb20gdGhlIG9iamVjdCBmaWxlLiAgVGhlIHNlY29uZCBpbmRleCBpbnRvIHRoZSBzdGF0ZSB0YWJsZSBpcyB0aGUKLSAgIHR5cGUgb2YgdGhlIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0KLS8qIFRoZSBzeW1ib2wgZnJvbSB0aGUgb2JqZWN0IGZpbGUgaXMgdHVybmVkIGludG8gb25lIG9mIHRoZXNlIHJvdwotICAgdmFsdWVzLiAgKi8KLQotZW51bSBsaW5rX3JvdwotewotICBVTkRFRl9ST1csCQkvKiBVbmRlZmluZWQuICAqLwotICBVTkRFRldfUk9XLAkJLyogV2VhayB1bmRlZmluZWQuICAqLwotICBERUZfUk9XLAkJLyogRGVmaW5lZC4gICovCi0gIERFRldfUk9XLAkJLyogV2VhayBkZWZpbmVkLiAgKi8KLSAgQ09NTU9OX1JPVywJCS8qIENvbW1vbi4gICovCi0gIElORFJfUk9XLAkJLyogSW5kaXJlY3QuICAqLwotICBXQVJOX1JPVywJCS8qIFdhcm5pbmcuICAqLwotICBTRVRfUk9XCQkvKiBNZW1iZXIgb2Ygc2V0LiAgKi8KLX07Ci0KLS8qIGFwcGFyZW50bHkgbmVlZGVkIGZvciBIaXRhY2hpIDMwNTBSKEhJLVVYL1dFMik/ICovCi0jdW5kZWYgRkFJTAotCi0vKiBUaGUgYWN0aW9ucyB0byB0YWtlIGluIHRoZSBzdGF0ZSB0YWJsZS4gICovCi0KLWVudW0gbGlua19hY3Rpb24KLXsKLSAgRkFJTCwJCS8qIEFib3J0LiAqLwotICBVTkQsCQkvKiBNYXJrIHN5bWJvbCB1bmRlZmluZWQuICAqLwotICBXRUFLLAkJLyogTWFyayBzeW1ib2wgd2VhayB1bmRlZmluZWQuICAqLwotICBERUYsCQkvKiBNYXJrIHN5bWJvbCBkZWZpbmVkLiAgKi8KLSAgREVGVywJCS8qIE1hcmsgc3ltYm9sIHdlYWsgZGVmaW5lZC4gICovCi0gIENPTSwJCS8qIE1hcmsgc3ltYm9sIGNvbW1vbi4gICovCi0gIFJFRiwJCS8qIE1hcmsgZGVmaW5lZCBzeW1ib2wgcmVmZXJlbmNlZC4gICovCi0gIENSRUYsCQkvKiBQb3NzaWJseSB3YXJuIGFib3V0IGNvbW1vbiByZWZlcmVuY2UgdG8gZGVmaW5lZCBzeW1ib2wuICAqLwotICBDREVGLAkJLyogRGVmaW5lIGV4aXN0aW5nIGNvbW1vbiBzeW1ib2wuICAqLwotICBOT0FDVCwJLyogTm8gYWN0aW9uLiAgKi8KLSAgQklHLAkJLyogTWFyayBzeW1ib2wgY29tbW9uIHVzaW5nIGxhcmdlc3Qgc2l6ZS4gICovCi0gIE1ERUYsCQkvKiBNdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yLiAgKi8KLSAgTUlORCwJCS8qIE11bHRpcGxlIGluZGlyZWN0IHN5bWJvbHMuICAqLwotICBJTkQsCQkvKiBNYWtlIGluZGlyZWN0IHN5bWJvbC4gICovCi0gIENJTkQsCQkvKiBNYWtlIGluZGlyZWN0IHN5bWJvbCBmcm9tIGV4aXN0aW5nIGNvbW1vbiBzeW1ib2wuICAqLwotICBTRVQsCQkvKiBBZGQgdmFsdWUgdG8gc2V0LiAgKi8KLSAgTVdBUk4sCS8qIE1ha2Ugd2FybmluZyBzeW1ib2wuICAqLwotICBXQVJOLAkJLyogSXNzdWUgd2FybmluZy4gICovCi0gIENXQVJOLAkvKiBXYXJuIGlmIHJlZmVyZW5jZWQsIGVsc2UgTVdBUk4uICAqLwotICBDWUNMRSwJLyogUmVwZWF0IHdpdGggc3ltYm9sIHBvaW50ZWQgdG8uICAqLwotICBSRUZDLAkJLyogTWFyayBpbmRpcmVjdCBzeW1ib2wgcmVmZXJlbmNlZCBhbmQgdGhlbiBDWUNMRS4gICovCi0gIFdBUk5DCQkvKiBJc3N1ZSB3YXJuaW5nIGFuZCB0aGVuIENZQ0xFLiAgKi8KLX07Ci0KLS8qIFRoZSBzdGF0ZSB0YWJsZSBpdHNlbGYuICBUaGUgZmlyc3QgaW5kZXggaXMgYSBsaW5rX3JvdyBhbmQgdGhlCi0gICBzZWNvbmQgaW5kZXggaXMgYSBiZmRfbGlua19oYXNoX3R5cGUuICAqLwotCi1zdGF0aWMgY29uc3QgZW51bSBsaW5rX2FjdGlvbiBsaW5rX2FjdGlvbls4XVs4XSA9Ci17Ci0gIC8qIGN1cnJlbnRccHJldiAgICBuZXcgICAgdW5kZWYgIHVuZGVmdyBkZWYgICAgZGVmdyAgIGNvbSAgICBpbmRyICAgd2FybiAgKi8KLSAgLyogVU5ERUZfUk9XIAkqLyAge1VORCwgICBOT0FDVCwgVU5ELCAgIFJFRiwgICBSRUYsICAgTk9BQ1QsIFJFRkMsICBXQVJOQyB9LAotICAvKiBVTkRFRldfUk9XCSovICB7V0VBSywgIE5PQUNULCBOT0FDVCwgUkVGLCAgIFJFRiwgICBOT0FDVCwgUkVGQywgIFdBUk5DIH0sCi0gIC8qIERFRl9ST1cgCSovICB7REVGLCAgIERFRiwgICBERUYsICAgTURFRiwgIERFRiwgICBDREVGLCAgTURFRiwgIENZQ0xFIH0sCi0gIC8qIERFRldfUk9XIAkqLyAge0RFRlcsICBERUZXLCAgREVGVywgIE5PQUNULCBOT0FDVCwgTk9BQ1QsIE5PQUNULCBDWUNMRSB9LAotICAvKiBDT01NT05fUk9XCSovICB7Q09NLCAgIENPTSwgICBDT00sICAgQ1JFRiwgIENSRUYsICBCSUcsICAgUkVGQywgIFdBUk5DIH0sCi0gIC8qIElORFJfUk9XCSovICB7SU5ELCAgIElORCwgICBJTkQsICAgTURFRiwgIElORCwgICBDSU5ELCAgTUlORCwgIENZQ0xFIH0sCi0gIC8qIFdBUk5fUk9XICAgKi8gIHtNV0FSTiwgV0FSTiwgIFdBUk4sICBDV0FSTiwgQ1dBUk4sIFdBUk4sICBDV0FSTiwgTVdBUk4gfSwKLSAgLyogU0VUX1JPVwkqLyAge1NFVCwgICBTRVQsICAgU0VULCAgIFNFVCwgICBTRVQsICAgU0VULCAgIENZQ0xFLCBDWUNMRSB9Ci19OwotCi0vKiBNb3N0IG9mIHRoZSBlbnRyaWVzIGluIHRoZSBMSU5LX0FDVElPTiB0YWJsZSBhcmUgc3RyYWlnaHRmb3J3YXJkLAotICAgYnV0IGEgZmV3IGFyZSBzb21ld2hhdCBzdWJ0bGUuCi0KLSAgIEEgcmVmZXJlbmNlIHRvIGFuIGluZGlyZWN0IHN5bWJvbCAoVU5ERUZfUk9XL2luZHIgb3IKLSAgIFVOREVGV19ST1cvaW5kcikgaXMgY291bnRlZCBhcyBhIHJlZmVyZW5jZSBib3RoIHRvIHRoZSBpbmRpcmVjdAotICAgc3ltYm9sIGFuZCB0byB0aGUgc3ltYm9sIHRoZSBpbmRpcmVjdCBzeW1ib2wgcG9pbnRzIHRvLgotCi0gICBBIHJlZmVyZW5jZSB0byBhIHdhcm5pbmcgc3ltYm9sIChVTkRFRl9ST1cvd2FybiBvciBVTkRFRldfUk9XL3dhcm4pCi0gICBjYXVzZXMgdGhlIHdhcm5pbmcgdG8gYmUgaXNzdWVkLgotCi0gICBBIGNvbW1vbiBkZWZpbml0aW9uIG9mIGFuIGluZGlyZWN0IHN5bWJvbCAoQ09NTU9OX1JPVy9pbmRyKSBpcwotICAgdHJlYXRlZCBhcyBhIG11bHRpcGxlIGRlZmluaXRpb24gZXJyb3IuICBMaWtld2lzZSBmb3IgYW4gaW5kaXJlY3QKLSAgIGRlZmluaXRpb24gb2YgYSBjb21tb24gc3ltYm9sIChJTkRSX1JPVy9jb20pLgotCi0gICBBbiBpbmRpcmVjdCBkZWZpbml0aW9uIG9mIGEgd2FybmluZyAoSU5EUl9ST1cvd2FybikgZG9lcyBub3QgY2F1c2UKLSAgIHRoZSB3YXJuaW5nIHRvIGJlIGlzc3VlZC4KLQotICAgSWYgYSB3YXJuaW5nIGlzIGNyZWF0ZWQgZm9yIGFuIGluZGlyZWN0IHN5bWJvbCAoV0FSTl9ST1cvaW5kcikgbm8KLSAgIHdhcm5pbmcgaXMgY3JlYXRlZCBmb3IgdGhlIHN5bWJvbCB0aGUgaW5kaXJlY3Qgc3ltYm9sIHBvaW50cyB0by4KLQotICAgQWRkaW5nIGFuIGVudHJ5IHRvIGEgc2V0IGRvZXMgbm90IGNvdW50IGFzIGEgcmVmZXJlbmNlIHRvIGEgc2V0LAotICAgYW5kIG5vIHdhcm5pbmcgaXMgaXNzdWVkIChTRVRfUk9XL3dhcm4pLiAgKi8KLQotLyogUmV0dXJuIHRoZSBCRkQgaW4gd2hpY2ggYSBoYXNoIGVudHJ5IGhhcyBiZWVuIGRlZmluZWQsIGlmIGtub3duLiAgKi8KLQotc3RhdGljIGJmZCAqCi1oYXNoX2VudHJ5X2JmZCAoaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIHdoaWxlIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLSAgICBoID0gaC0+dS5pLmxpbms7Ci0gIHN3aXRjaCAoaC0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIHJldHVybiBoLT51LnVuZGVmLmFiZmQ7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICByZXR1cm4gaC0+dS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIHJldHVybiBoLT51LmMucC0+c2VjdGlvbi0+b3duZXI7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLgotICAgQUJGRCBpcyB0aGUgQkZEIHRoZSBzeW1ib2wgY29tZXMgZnJvbS4KLSAgIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC4KLSAgIEZMQUdTIGlzIHRoZSBCU0ZfKiBiaXRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sLgotICAgU0VDVElPTiBpcyB0aGUgc2VjdGlvbiBpbiB3aGljaCB0aGUgc3ltYm9sIGlzIGRlZmluZWQ7IHRoaXMgbWF5IGJlCi0gICAgIGJmZF91bmRfc2VjdGlvbl9wdHIgb3IgYmZkX2NvbV9zZWN0aW9uX3B0ci4KLSAgIFZBTFVFIGlzIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLCByZWxhdGl2ZSB0byB0aGUgc2VjdGlvbi4KLSAgIFNUUklORyBpcyB1c2VkIGZvciBlaXRoZXIgYW4gaW5kaXJlY3Qgc3ltYm9sLCBpbiB3aGljaCBjYXNlIGl0IGlzCi0gICAgIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gaW5kaXJlY3QgdG8sIG9yIGEgd2FybmluZyBzeW1ib2wsIGluCi0gICAgIHdoaWNoIGNhc2UgaXQgaXMgdGhlIHdhcm5pbmcgc3RyaW5nLgotICAgQ09QWSBpcyB0cnVlIGlmIE5BTUUgb3IgU1RSSU5HIG11c3QgYmUgY29waWVkIGludG8gbG9jYWxseQotICAgICBhbGxvY2F0ZWQgbWVtb3J5IGlmIHRoZXkgbmVlZCB0byBiZSBzYXZlZC4KLSAgIENPTExFQ1QgaXMgdHJ1ZSBpZiB3ZSBzaG91bGQgYXV0b21hdGljYWxseSBjb2xsZWN0IGdjYyBjb25zdHJ1Y3RvcgotICAgICBvciBkZXN0cnVjdG9yIG5hbWVzIGFzIGNvbGxlY3QyIGRvZXMuCi0gICBIQVNIUCwgaWYgbm90IE5VTEwsIGlzIGEgcGxhY2UgdG8gc3RvcmUgdGhlIGNyZWF0ZWQgaGFzaCB0YWJsZQotICAgICBlbnRyeTsgaWYgKkhBU0hQIGlzIG5vdCBOVUxMLCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGxvb2tlZCB1cAotICAgICB0aGUgaGFzaCB0YWJsZSBlbnRyeSwgYW5kIHN0b3JlZCBpdCBpbiAqSEFTSFAuICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCi0JCQkJICBzdHJpbmcsIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIGVudW0gbGlua19yb3cgcm93OwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYm9vbGVhbiBjeWNsZTsKLQotICBpZiAoYmZkX2lzX2luZF9zZWN0aW9uIChzZWN0aW9uKQotICAgICAgfHwgKGZsYWdzICYgQlNGX0lORElSRUNUKSAhPSAwKQotICAgIHJvdyA9IElORFJfUk9XOwotICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfV0FSTklORykgIT0gMCkKLSAgICByb3cgPSBXQVJOX1JPVzsKLSAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHJvdyA9IFNFVF9ST1c7Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgewotICAgICAgaWYgKChmbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotCXJvdyA9IFVOREVGV19ST1c7Ci0gICAgICBlbHNlCi0Jcm93ID0gVU5ERUZfUk9XOwotICAgIH0KLSAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX1dFQUspICE9IDApCi0gICAgcm93ID0gREVGV19ST1c7Ci0gIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgcm93ID0gQ09NTU9OX1JPVzsKLSAgZWxzZQotICAgIHJvdyA9IERFRl9ST1c7Ci0KLSAgaWYgKGhhc2hwICE9IE5VTEwgJiYgKmhhc2hwICE9IE5VTEwpCi0gICAgaCA9ICpoYXNocDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChyb3cgPT0gVU5ERUZfUk9XIHx8IHJvdyA9PSBVTkRFRldfUk9XKQotCWggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBuYW1lLCB0cnVlLCBjb3B5LCBmYWxzZSk7Ci0gICAgICBlbHNlCi0JaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCB0cnVlLCBjb3B5LCBmYWxzZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGlmIChoYXNocCAhPSBOVUxMKQotCSAgICAqaGFzaHAgPSBOVUxMOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGluZm8tPm5vdGljZV9hbGwKLSAgICAgIHx8IChpbmZvLT5ub3RpY2VfaGFzaCAhPSAoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopIE5VTEwKLQkgICYmIChiZmRfaGFzaF9sb29rdXAgKGluZm8tPm5vdGljZV9oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpCi0JICAgICAgIT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKSkpCi0gICAgewotICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPm5vdGljZSkgKGluZm8sIGgtPnJvb3Quc3RyaW5nLCBhYmZkLCBzZWN0aW9uLAotCQkJCQl2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoaGFzaHAgIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBOVUxMKQotICAgICpoYXNocCA9IGg7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBlbnVtIGxpbmtfYWN0aW9uIGFjdGlvbjsKLQotICAgICAgY3ljbGUgPSBmYWxzZTsKLSAgICAgIGFjdGlvbiA9IGxpbmtfYWN0aW9uWyhpbnQpIHJvd11bKGludCkgaC0+dHlwZV07Ci0gICAgICBzd2l0Y2ggKGFjdGlvbikKLQl7Ci0JY2FzZSBGQUlMOgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIE5PQUNUOgotCSAgLyogRG8gbm90aGluZy4gICovCi0JICBicmVhazsKLQotCWNhc2UgVU5EOgotCSAgLyogTWFrZSBhIG5ldyB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgIGgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0JICBiZmRfbGlua19hZGRfdW5kZWYgKGluZm8tPmhhc2gsIGgpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFdFQUs6Ci0JICAvKiBNYWtlIGEgbmV3IHdlYWsgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWs7Ci0JICBoLT51LnVuZGVmLmFiZmQgPSBhYmZkOwotCSAgYnJlYWs7Ci0KLQljYXNlIENERUY6Ci0JICAvKiBXZSBoYXZlIGZvdW5kIGEgZGVmaW5pdGlvbiBmb3IgYSBzeW1ib2wgd2hpY2ggd2FzCi0JICAgICBwcmV2aW91c2x5IGNvbW1vbi4gICovCi0JICBCRkRfQVNTRVJUIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfY29tbW9uKQotCQkgKGluZm8sIGgtPnJvb3Quc3RyaW5nLAotCQkgIGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lciwgYmZkX2xpbmtfaGFzaF9jb21tb24sIGgtPnUuYy5zaXplLAotCQkgIGFiZmQsIGJmZF9saW5rX2hhc2hfZGVmaW5lZCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIERFRjoKLQljYXNlIERFRlc6Ci0JICB7Ci0JICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG9sZHR5cGU7Ci0KLQkgICAgLyogRGVmaW5lIGEgc3ltYm9sLiAgKi8KLQkgICAgb2xkdHlwZSA9IGgtPnR5cGU7Ci0JICAgIGlmIChhY3Rpb24gPT0gREVGVykKLQkgICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOwotCSAgICBlbHNlCi0JICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgICAgaC0+dS5kZWYuc2VjdGlvbiA9IHNlY3Rpb247Ci0JICAgIGgtPnUuZGVmLnZhbHVlID0gdmFsdWU7Ci0KLQkgICAgLyogSWYgd2UgaGF2ZSBiZWVuIGFza2VkIHRvLCB3ZSBhY3QgbGlrZSBjb2xsZWN0MiBhbmQKLQkgICAgICAgaWRlbnRpZnkgYWxsIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0IGJlIGdsb2JhbAotCSAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFuZCBwYXNzIHRoZW0gdXAgaW4gYQotCSAgICAgICBjYWxsYmFjay4gIFdlIG9ubHkgZG8gdGhpcyBmb3IgY2VydGFpbiBvYmplY3QgZmlsZQotCSAgICAgICB0eXBlcywgc2luY2UgbWFueSBvYmplY3QgZmlsZSB0eXBlcyBjYW4gaGFuZGxlIHRoaXMKLQkgICAgICAgYXV0b21hdGljYWxseS4gICovCi0JICAgIGlmIChjb2xsZWN0ICYmIG5hbWVbMF0gPT0gJ18nKQotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqczsKLQotCQkvKiBBIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgbmFtZSBzdGFydHMgbGlrZSB0aGlzOgotCQkgICBfK0dMT0JBTF9bXy4kXVtJRF1bXy4kXSB3aGVyZSB0aGUgZmlyc3QgW18uJF0gYW5kCi0JCSAgIHRoZSBzZWNvbmQgYXJlIHRoZSBzYW1lIGNoYXJhY3RlciAod2UgYWNjZXB0IGFueQotCQkgICBjaGFyYWN0ZXIgdGhlcmUsIGluIGNhc2UgYSBuZXcgb2JqZWN0IGZpbGUgZm9ybWF0Ci0JCSAgIGNvbWVzIGFsb25nIHdpdGggZXZlbiB3b3JzZSBuYW1pbmcgcmVzdHJpY3Rpb25zKS4gICovCi0KLSNkZWZpbmUgQ09OU19QUkVGSVggIkdMT0JBTF8iCi0jZGVmaW5lIENPTlNfUFJFRklYX0xFTiAoc2l6ZW9mIENPTlNfUFJFRklYIC0gMSkKLQotCQlzID0gbmFtZSArIDE7Ci0JCXdoaWxlICgqcyA9PSAnXycpCi0JCSAgKytzOwotCQlpZiAoc1swXSA9PSAnRycKLQkJICAgICYmIHN0cm5jbXAgKHMsIENPTlNfUFJFRklYLCBDT05TX1BSRUZJWF9MRU4gLSAxKSA9PSAwKQotCQkgIHsKLQkJICAgIGNoYXIgYzsKLQotCQkgICAgYyA9IHNbQ09OU19QUkVGSVhfTEVOICsgMV07Ci0JCSAgICBpZiAoKGMgPT0gJ0knIHx8IGMgPT0gJ0QnKQotCQkJJiYgc1tDT05TX1BSRUZJWF9MRU5dID09IHNbQ09OU19QUkVGSVhfTEVOICsgMl0pCi0JCSAgICAgIHsKLQkJCS8qIElmIHRoaXMgaXMgYSBkZWZpbml0aW9uIG9mIGEgc3ltYm9sIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgcHJldmlvdXNseSB3ZWFrbHkgZGVmaW5lZCwgd2UgYXJlIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0cm91YmxlLiAgV2UgaGF2ZSBhbHJlYWR5IGFkZGVkIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yIGVudHJ5IGZvciB0aGUgd2VhayBkZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wsIGFuZCBub3cgd2UgYXJlIHRyeWluZyB0byBhZGQgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG5ldyBzeW1ib2wuICBGb3J0dW5hdGVseSwgdGhpcyBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgbmV2ZXIgYXJpc2UgaW4gcHJhY3RpY2UuICAqLwotCQkJaWYgKG9sZHR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkJICBhYm9ydCAoKTsKLQotCQkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5jb25zdHJ1Y3RvcikKLQkJCSAgICAgICAoaW5mbywKLQkJCQljID09ICdJJyA/IHRydWUgOiBmYWxzZSwKLQkJCQloLT5yb290LnN0cmluZywgYWJmZCwgc2VjdGlvbiwgdmFsdWUpKSkKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIENPTToKLQkgIC8qIFdlIGhhdmUgZm91bmQgYSBjb21tb24gZGVmaW5pdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgIGJmZF9saW5rX2FkZF91bmRlZiAoaW5mby0+aGFzaCwgaCk7Ci0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9jb21tb247Ci0JICBoLT51LmMucCA9Ci0JICAgICgoc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5ICopCi0JICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCXNpemVvZiAoc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5KSkpOwotCSAgaWYgKGgtPnUuYy5wID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaC0+dS5jLnNpemUgPSB2YWx1ZTsKLQotCSAgLyogU2VsZWN0IGEgZGVmYXVsdCBhbGlnbm1lbnQgYmFzZWQgb24gdGhlIHNpemUuICBUaGlzIG1heQotICAgICAgICAgICAgIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNhbGxlci4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBwb3dlcjsKLQotCSAgICBwb3dlciA9IGJmZF9sb2cyICh2YWx1ZSk7Ci0JICAgIGlmIChwb3dlciA+IDQpCi0JICAgICAgcG93ZXIgPSA0OwotCSAgICBoLT51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXI7Ci0JICB9Ci0KLQkgIC8qIFRoZSBzZWN0aW9uIG9mIGEgY29tbW9uIHN5bWJvbCBpcyBvbmx5IHVzZWQgaWYgdGhlIGNvbW1vbgotICAgICAgICAgICAgIHN5bWJvbCBpcyBhY3R1YWxseSBhbGxvY2F0ZWQuICBJdCBiYXNpY2FsbHkgcHJvdmlkZXMgYQotICAgICAgICAgICAgIGhvb2sgZm9yIHRoZSBsaW5rZXIgc2NyaXB0IHRvIGRlY2lkZSB3aGljaCBvdXRwdXQgc2VjdGlvbgotICAgICAgICAgICAgIHRoZSBjb21tb24gc3ltYm9scyBzaG91bGQgYmUgcHV0IGluLiAgSW4gbW9zdCBjYXNlcywgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wgd2lsbCBiZSBiZmRfY29tX3NlY3Rpb25fcHRyLAotICAgICAgICAgICAgIHRoZSBjb2RlIGhlcmUgd2lsbCBjaG9vc2UgYSBjb21tb24gc3ltYm9sIHNlY3Rpb24gbmFtZWQKLSAgICAgICAgICAgICAiQ09NTU9OIiwgYW5kIHRoZSBsaW5rZXIgc2NyaXB0IHdpbGwgY29udGFpbiAqKENPTU1PTikgaW4KLSAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgcGxhY2UuICBBIGZldyB0YXJnZXRzIHVzZSBzZXBhcmF0ZSBjb21tb24KLSAgICAgICAgICAgICBzZWN0aW9ucyBmb3Igc21hbGwgc3ltYm9scywgYW5kIHRoZXkgcmVxdWlyZSBzcGVjaWFsCi0gICAgICAgICAgICAgaGFuZGxpbmcuICAqLwotCSAgaWYgKHNlY3Rpb24gPT0gYmZkX2NvbV9zZWN0aW9uX3B0cikKLQkgICAgewotCSAgICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiQ09NTU9OIik7Ci0JICAgICAgaC0+dS5jLnAtPnNlY3Rpb24tPmZsYWdzID0gU0VDX0FMTE9DOwotCSAgICB9Ci0JICBlbHNlIGlmIChzZWN0aW9uLT5vd25lciAhPSBhYmZkKQotCSAgICB7Ci0JICAgICAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsCi0JCQkJCQkJICAgIHNlY3Rpb24tPm5hbWUpOwotCSAgICAgIGgtPnUuYy5wLT5zZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBoLT51LmMucC0+c2VjdGlvbiA9IHNlY3Rpb247Ci0JICBicmVhazsKLQotCWNhc2UgUkVGOgotCSAgLyogQSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkIHN5bWJvbC4gICovCi0JICBpZiAoaC0+bmV4dCA9PSBOVUxMICYmIGluZm8tPmhhc2gtPnVuZGVmc190YWlsICE9IGgpCi0JICAgIGgtPm5leHQgPSBoOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJJRzoKLQkgIC8qIFdlIGhhdmUgZm91bmQgYSBjb21tb24gZGVmaW5pdGlvbiBmb3IgYSBzeW1ib2wgd2hpY2gKLQkgICAgIGFscmVhZHkgaGFkIGEgY29tbW9uIGRlZmluaXRpb24uICBVc2UgdGhlIG1heGltdW0gb2YgdGhlCi0JICAgICB0d28gc2l6ZXMuICAqLwotCSAgQkZEX0FTU0VSVCAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKLQkJIChpbmZvLCBoLT5yb290LnN0cmluZywKLQkJICBoLT51LmMucC0+c2VjdGlvbi0+b3duZXIsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBoLT51LmMuc2l6ZSwKLQkJICBhYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgdmFsdWUpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKHZhbHVlID4gaC0+dS5jLnNpemUpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgcG93ZXI7Ci0KLQkgICAgICBoLT51LmMuc2l6ZSA9IHZhbHVlOwotCi0JICAgICAgLyogU2VsZWN0IGEgZGVmYXVsdCBhbGlnbm1lbnQgYmFzZWQgb24gdGhlIHNpemUuICBUaGlzIG1heQotCQkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgY2FsbGVyLiAgKi8KLQkgICAgICBwb3dlciA9IGJmZF9sb2cyICh2YWx1ZSk7Ci0JICAgICAgaWYgKHBvd2VyID4gNCkKLQkJcG93ZXIgPSA0OwotCSAgICAgIGgtPnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcjsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIENSRUY6Ci0JICB7Ci0JICAgIGJmZCAqb2JmZDsKLQotCSAgICAvKiBXZSBoYXZlIGZvdW5kIGEgY29tbW9uIGRlZmluaXRpb24gZm9yIGEgc3ltYm9sIHdoaWNoCi0JICAgICAgIHdhcyBhbHJlYWR5IGRlZmluZWQuICBGSVhNRTogSXQgd291bGQgbmljZSBpZiB3ZSBjb3VsZAotCSAgICAgICByZXBvcnQgdGhlIEJGRCB3aGljaCBkZWZpbmVkIGFuIGluZGlyZWN0IHN5bWJvbCwgYnV0IHdlCi0JICAgICAgIGRvbid0IGhhdmUgYW55d2hlcmUgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uLiAgKi8KLQkgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCXx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgIG9iZmQgPSBoLT51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkgICAgZWxzZQotCSAgICAgIG9iZmQgPSBOVUxMOwotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKLQkJICAgKGluZm8sIGgtPnJvb3Quc3RyaW5nLCBvYmZkLCBoLT50eXBlLCAoYmZkX3ZtYSkgMCwKLQkJICAgIGFiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLCB2YWx1ZSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBNSU5EOgotCSAgLyogTXVsdGlwbGUgaW5kaXJlY3Qgc3ltYm9scy4gIFRoaXMgaXMgT0sgaWYgdGhleSBib3RoIHBvaW50Ci0JICAgICB0byB0aGUgc2FtZSBzeW1ib2wuICAqLwotCSAgaWYgKHN0cmNtcCAoaC0+dS5pLmxpbmstPnJvb3Quc3RyaW5nLCBzdHJpbmcpID09IDApCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIE1ERUY6Ci0JICAvKiBIYW5kbGUgYSBtdWx0aXBsZSBkZWZpbml0aW9uLiAgKi8KLQkgIHsKLQkgICAgYXNlY3Rpb24gKm1zZWMgPSBOVUxMOwotCSAgICBiZmRfdm1hIG12YWwgPSAwOwotCi0JICAgIHN3aXRjaCAoaC0+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+c2l6ZSk7Ci0gICAgfQotfQotCi0vKiBEZWZhdWx0IHJvdXRpbmUgdG8gaGFuZGxlIGEgYmZkX2ZpbGxfbGlua19vcmRlci4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWRlZmF1bHRfZmlsbF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBzZWMsIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICBzaXplX3Qgc2l6ZTsKLSAgY2hhciAqc3BhY2U7Ci0gIHNpemVfdCBpOwotICBpbnQgZmlsbDsKLSAgYm9vbGVhbiByZXN1bHQ7Ci0KLSAgQkZEX0FTU0VSVCAoKHNlYy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKTsKLQotICBzaXplID0gKHNpemVfdCkgbGlua19vcmRlci0+c2l6ZTsKLSAgc3BhY2UgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzaXplKTsKLSAgaWYgKHNwYWNlID09IE5VTEwgJiYgc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmaWxsID0gbGlua19vcmRlci0+dS5maWxsLnZhbHVlOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAyKQotICAgIHNwYWNlW2ldID0gZmlsbCA+PiA4OwotICBmb3IgKGkgPSAxOyBpIDwgc2l6ZTsgaSArPSAyKQotICAgIHNwYWNlW2ldID0gZmlsbDsKLSAgcmVzdWx0ID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIHNwYWNlLAotCQkJCSAgICAgKGZpbGVfcHRyKSBsaW5rX29yZGVyLT5vZmZzZXQsCi0JCQkJICAgICBsaW5rX29yZGVyLT5zaXplKTsKLSAgZnJlZSAoc3BhY2UpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBEZWZhdWx0IHJvdXRpbmUgdG8gaGFuZGxlIGEgYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlciwKLQkJCSAgICAgZ2VuZXJpY19saW5rZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBib29sZWFuIGdlbmVyaWNfbGlua2VyOwotewotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpuZXdfY29udGVudHM7Ci0KLSAgQkZEX0FTU0VSVCAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApOwotCi0gIGlmIChsaW5rX29yZGVyLT5zaXplID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0KLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gb3V0cHV0X3NlY3Rpb24pOwotICBCRkRfQVNTRVJUIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID09IGxpbmtfb3JkZXItPm9mZnNldCk7Ci0gIEJGRF9BU1NFUlQgKGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSA9PSBsaW5rX29yZGVyLT5zaXplKTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCA+IDAKLSAgICAgICYmIG91dHB1dF9zZWN0aW9uLT5vcmVsb2NhdGlvbiA9PSAoYXJlbGVudCAqKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTcGFjZSBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIGZvciB0aGUgb3V0cHV0IHJlbG9jYXRpb25zLgotCSBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhcmUgY2FsbGVkIGJ5IGEgc3BlY2lmaWMgYmFja2VuZAotCSBiZWNhdXNlIHNvbWVib2R5IGlzIGF0dGVtcHRpbmcgdG8gbGluayB0b2dldGhlciBkaWZmZXJlbnQKLQkgdHlwZXMgb2Ygb2JqZWN0IGZpbGVzLiAgSGFuZGxpbmcgdGhpcyBjYXNlIGNvcnJlY3RseSBpcwotCSBkaWZmaWN1bHQsIGFuZCBzb21ldGltZXMgaW1wb3NzaWJsZS4gICovCi0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiQXR0ZW1wdCB0byBkbyByZWxvY2F0ZWFibGUgbGluayB3aXRoICVzIGlucHV0IGFuZCAlcyBvdXRwdXQiKSwKLQkgYmZkX2dldF90YXJnZXQgKGlucHV0X2JmZCksIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgZ2VuZXJpY19saW5rZXIpCi0gICAgewotICAgICAgYXN5bWJvbCAqKnN5bXBwOwotICAgICAgYXN5bWJvbCAqKnN5bXBwZW5kOwotCi0gICAgICAvKiBHZXQgdGhlIGNhbm9uaWNhbCBzeW1ib2xzLiAgVGhlIGdlbmVyaWMgbGlua2VyIHdpbGwgYWx3YXlzCi0JIGhhdmUgcmV0cmlldmVkIHRoZW0gYnkgdGhpcyBwb2ludCwgYnV0IHdlIGFyZSBiZWluZyBjYWxsZWQgYnkKLQkgYSBzcGVjaWZpYyBsaW5rZXIsIHByZXN1bWFibHkgYmVjYXVzZSB3ZSBhcmUgbGlua2luZwotCSBkaWZmZXJlbnQgdHlwZXMgb2Ygb2JqZWN0IGZpbGVzIHRvZ2V0aGVyLiAgKi8KLSAgICAgIGlmICghIGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTaW5jZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGJ5IGEgc3BlY2lmaWMgbGlua2VyLCByYXRoZXIgdGhhbgotCSB0aGUgZ2VuZXJpYyBsaW5rZXIsIHRoZSB2YWx1ZXMgb2YgdGhlIHN5bWJvbHMgd2lsbCBub3QgYmUKLQkgcmlnaHQuICBUaGV5IHdpbGwgYmUgdGhlIHZhbHVlcyBhcyBzZWVuIGluIHRoZSBpbnB1dCBmaWxlLAotCSBub3QgdGhlIHZhbHVlcyBvZiB0aGUgZmluYWwgbGluay4gIFdlIG5lZWQgdG8gZml4IHRoZW0gdXAKLQkgYmVmb3JlIHdlIGNhbiByZWxvY2F0ZSB0aGUgc2VjdGlvbi4gICovCi0gICAgICBzeW1wcCA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpOwotICAgICAgc3ltcHBlbmQgPSBzeW1wcCArIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCAoaW5wdXRfYmZkKTsKLSAgICAgIGZvciAoOyBzeW1wcCA8IHN5bXBwZW5kOyBzeW1wcCsrKQotCXsKLQkgIGFzeW1ib2wgKnN5bTsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBzeW0gPSAqc3ltcHA7Ci0KLQkgIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfSU5ESVJFQ1QKLQkJCSAgICAgfCBCU0ZfV0FSTklORwotCQkJICAgICB8IEJTRl9HTE9CQUwKLQkJCSAgICAgfCBCU0ZfQ09OU1RSVUNUT1IKLQkJCSAgICAgfCBCU0ZfV0VBSykpICE9IDAKLQkgICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgICAgICB8fCBiZmRfaXNfaW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIHsKLQkgICAgICAvKiBzeW0tPnVkYXRhIG1heSBoYXZlIGJlZW4gc2V0IGJ5Ci0JCSBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0LiAgKi8KLQkgICAgICBpZiAoc3ltLT51ZGF0YS5wICE9IE5VTEwpCi0JCWggPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgc3ltLT51ZGF0YS5wOwotCSAgICAgIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkJaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCQkgIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksCi0JCQkJCQkgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JICAgICAgZWxzZQotCQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsCi0JCQkJCSAgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwKLQkJCQkJICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCXNldF9zeW1ib2xfZnJvbV9oYXNoIChzeW0sIGgpOwotCSAgICB9Ci0JfQkgIAotICAgIH0KLQotICAvKiBHZXQgYW5kIHJlbG9jYXRlIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgY29udGVudHMgPSAoKGJmZF9ieXRlICopCi0JICAgICAgYmZkX21hbGxvYyAoYmZkX3NlY3Rpb25fc2l6ZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSkpOwotICBpZiAoY29udGVudHMgPT0gTlVMTCAmJiBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG5ld19jb250ZW50cyA9IChiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0JCSAgKG91dHB1dF9iZmQsIGluZm8sIGxpbmtfb3JkZXIsIGNvbnRlbnRzLCBpbmZvLT5yZWxvY2F0ZWFibGUsCi0JCSAgIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpKSk7Ci0gIGlmICghbmV3X2NvbnRlbnRzKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIE91dHB1dCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sCi0JCQkJICAoUFRSKSBuZXdfY29udGVudHMsCi0JCQkJICBsaW5rX29yZGVyLT5vZmZzZXQsIGxpbmtfb3JkZXItPnNpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChjb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChjb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBIGxpdHRsZSByb3V0aW5lIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgcmVsb2NzIGluIGEgbGlua19vcmRlcgotICAgbGlzdC4gICovCi0KLXVuc2lnbmVkIGludAotX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcyAobGlua19vcmRlcikKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYzsKLSAgcmVnaXN0ZXIgc3RydWN0IGJmZF9saW5rX29yZGVyICpsOwotCi0gIGMgPSAwOwotICBmb3IgKGwgPSBsaW5rX29yZGVyOyBsICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCSAgfHwgbC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JKytjOwotICAgIH0KLQotICByZXR1cm4gYzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2xpbmtfc3BsaXRfc2VjdGlvbgotCi1TWU5PUFNJUwotICAgICAgICBib29sZWFuIGJmZF9saW5rX3NwbGl0X3NlY3Rpb24oYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gbm9uemVybyBpZiBAdmFye3NlY30gc2hvdWxkIGJlIHNwbGl0IGR1cmluZyBhCi0JcmVsb2NlYXRhYmxlIG9yIGZpbmFsIGxpbmsuCi0KLS4jZGVmaW5lIGJmZF9saW5rX3NwbGl0X3NlY3Rpb24oYWJmZCwgc2VjKSBcCi0uICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiwgKGFiZmQsIHNlYykpCi0uCi0KLSovCi0KLQotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9seW54LWNvcmUuYyBiL2JmZC9seW54LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1ODE3Ny4uMDAwMDAwMAotLS0gYS9iZmQvbHlueC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyogQkZEIGJhY2sgZW5kIGZvciBMeW54IGNvcmUgZmlsZXMKLSAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdHUgR3Jvc3NtYW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLSNpbmNsdWRlIDxzeXMvY29uZi5oPgotI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KLS8qIHN5cy9rZXJuZWwuaCBzaG91bGQgZGVmaW5lIHRoaXMsIGJ1dCBkb2Vzbid0IGFsd2F5cywgc2lnaC4gKi8KLSNpZm5kZWYgX19MWU5YT1MKLSNkZWZpbmUgX19MWU5YT1MKLSNlbmRpZgotI2luY2x1ZGUgPHN5cy9tZW0uaD4KLSNpbmNsdWRlIDxzeXMvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDxzeXMvaXRpbWVyLmg+Ci0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNpbmNsdWRlIDxzeXMvcHJvYy5oPgotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotCi1zdHJ1Y3QgbHlueF9jb3JlX3N0cnVjdCAKLXsKLSAgaW50IHNpZzsKLSAgY2hhciBjbWRbUE5NTEVOICsgMV07Ci19OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5seW54X2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotCi0vKiBIYW5kbGUgTHlueCBjb3JlIGR1bXAgZmlsZS4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgdm1hLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLSAgY2hhciAqbmV3bmFtZTsKLQotICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIGlmICghbmV3bmFtZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJjcHkgKG5ld25hbWUsIG5hbWUpOwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmV3bmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi0vKiBBUkdTVVNFRCAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1seW54X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCB2YWw7Ci0gIGludCBzZWNudW07Ci0gIHN0cnVjdCBwc3NlbnRyeSBwc3M7Ci0gIHNpemVfdCB0Y29udGV4dF9zaXplOwotICBjb3JlX3N0X3QgKnRocmVhZHA7Ci0gIGludCBwYWdlc2l6ZTsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0KLSAgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSAoKTsJLyogU2VyaW91cyBjcm9zcy10YXJnZXQgaXNzdWUgaGVyZS4uLiAgVGhpcwotCQkJCSAgIHJlYWxseSBuZWVkcyB0byBjb21lIGZyb20gYSBzeXN0ZW0tc3BlY2lmaWMKLQkJCQkgICBoZWFkZXIgZmlsZS4gICovCi0KLSAgLyogR2V0IHRoZSBwc3MgZW50cnkgZnJvbSB0aGUgY29yZSBmaWxlICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmcHNzLCAxLCBzaXplb2YgcHNzLCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgcHNzKQotICAgIHsKLSAgICAgIC8qIFRvbyBzbWFsbCB0byBiZSBhIGNvcmUgZmlsZSAqLwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGNvcmVfaGRyIChhYmZkKSA9IChzdHJ1Y3QgbHlueF9jb3JlX3N0cnVjdCAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QpKTsKLQotICBpZiAoIWNvcmVfaGRyIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCBwc3MucG5hbWUsIFBOTUxFTiArIDEpOwotCi0gIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHRocmVhZCBjb250ZXh0cyAqLwotCi0gIHRjb250ZXh0X3NpemUgPSBwc3MudGhyZWFkY250ICogc2l6ZW9mIChjb3JlX3N0X3QpOwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgdGhyZWFkIGNvbnRleHRzICovCi0KLSAgdGhyZWFkcCA9IChjb3JlX3N0X3QgKiliZmRfYWxsb2MgKGFiZmQsIHRjb250ZXh0X3NpemUpOwotICBpZiAoIXRocmVhZHApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU2F2ZSB0aHJlYWQgY29udGV4dHMgKi8KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHBhZ2VzaXplLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKil0aHJlYWRwLCBwc3MudGhyZWFkY250LCBzaXplb2YgKGNvcmVfc3RfdCksIGFiZmQpOwotCi0gIGlmICh2YWwgIT0gdGNvbnRleHRfc2l6ZSkKLSAgICB7Ci0gICAgICAvKiBQcm9iYWJseSB0b28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgCi0gIGNvcmVfc2lnbmFsIChhYmZkKSA9IHRocmVhZHAtPmN1cnJzaWc7Ci0KLSAgbmV3c2VjdCA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnN0YWNrIiwKLQkJCSAgICAgICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAgcHNzLnNzaXplLAotCQkJICAgICAgIHBzcy5zbGltaXQsCi0JCQkgICAgICAgcGFnZXNpemUgKyB0Y29udGV4dF9zaXplKTsKLSAgaWYgKCFuZXdzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIG5ld3NlY3QgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCSAgICAgICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAgcHNzLmRhdGFfbGVuICsgcHNzLmJzc19sZW4sCi0JCQkgICAgICAgcHNzLmRhdGFfc3RhcnQsCi0JCQkgICAgICAgcGFnZXNpemUgKyB0Y29udGV4dF9zaXplICsgcHNzLnNzaXplCi0jaWYgZGVmaW5lZCAoU1BBUkMpIHx8IGRlZmluZWQgKF9fU1BBUkNfXykKLQkJCSAgICAgICAvKiBTUEFSQyBMeW54IHNlZW1zIHRvIHN0YXJ0IGR1bXBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgLmRhdGEgc2VjdGlvbiBhdCBhIHBhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeS4gIEl0J3MgT0sgdG8gY2hlY2sgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgbGlrZSBTUEFSQyBoZXJlIGJlY2F1c2UgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gYSBMeW54Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC4gICovCi0JCQkgICAgICAgKyBwc3MuZGF0YV9zdGFydCAlIHBhZ2VzaXplCi0jZW5kaWYKLQkJCSAgICAgICApOwotICBpZiAoIW5ld3NlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLS8qIEFuZCwgbm93IGZvciB0aGUgLnJlZy9YWFggcHNldWRvIHNlY3Rpb25zLiAgRWFjaCB0aHJlYWQgaGFzIGl0J3Mgb3duCi0gICAucmVnL1hYWCBzZWN0aW9uLCB3aGVyZSBYWFggaXMgdGhlIHRocmVhZCBpZCAod2l0aG91dCBsZWFkaW5nIHplcm9zKS4gIFRoZQotICAgY3VycmVudGx5IHJ1bm5pbmcgdGhyZWFkIChhdCB0aGUgdGltZSBvZiB0aGUgY29yZSBkdW1wKSBhbHNvIGhhcyBhbiBhbGlhcwotICAgY2FsbGVkIGAucmVnJyAoanVzdCB0byBrZWVwIEdEQiBoYXBweSkuICBOb3RlIHRoYXQgd2UgdXNlIGAucmVnL1hYWCcgYXMKLSAgIG9wcG9zZWQgdG8gYC5yZWdYWFgnIGJlY2F1c2UgR0RCIGV4cGVjdHMgdGhhdCAucmVnMiB3aWxsIGJlIHRoZSBmbG9hdGluZy0KLSAgIHBvaW50IHJlZ2lzdGVycy4gICovCi0KLSAgbmV3c2VjdCA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0JCQkgICAgICAgU0VDX0hBU19DT05URU5UUywKLQkJCSAgICAgICBzaXplb2YgKGNvcmVfc3RfdCksCi0JCQkgICAgICAgMCwKLQkJCSAgICAgICBwYWdlc2l6ZSk7Ci0gIGlmICghbmV3c2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKHNlY251bSA9IDA7IHNlY251bSA8IHBzcy50aHJlYWRjbnQ7IHNlY251bSsrKQotICAgIHsKLSAgICAgIGNoYXIgc2VjbmFtZVsxMDBdOwotCi0gICAgICBzcHJpbnRmIChzZWNuYW1lLCAiLnJlZy8lZCIsIEJVSUxEUElEICgwLCB0aHJlYWRwW3NlY251bV0udGlkKSk7Ci0gICAgICBuZXdzZWN0ID0gbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsCi0JCQkJICAgU0VDX0hBU19DT05URU5UUywKLQkJCQkgICBzaXplb2YgKGNvcmVfc3RfdCksCi0JCQkJICAgMCwKLQkJCQkgICBwYWdlc2l6ZSArIHNlY251bSAqIHNpemVvZiAoY29yZV9zdF90KSk7Ci0gICAgICBpZiAoIW5ld3NlY3QpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1jaGFyICoKLWx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWludAotbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWJvb2xlYW4KLWx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotCi0jZW5kaWYgLyogTFlOWF9DT1JFICovCmRpZmYgLS1naXQgYS9iZmQvbTY4azRrbmV0YnNkLmMgYi9iZmQvbTY4azRrbmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MzQzOGQuLjAwMDAwMDAKLS0tIGEvYmZkL202OGs0a25ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbTY4ayBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JECTQKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgxMDAwCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX202OGsKLSNkZWZpbmUgREVGQVVMVF9NSUQgCU1fNjhLNEtfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChtNjhrNGtuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbTY4azRrLW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL202OGtsaW51eC5jIGIvYmZkL202OGtsaW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjUxNzU3Li4wMDAwMDAwCi0tLSBhL2JmZC9tNjhrbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDc3MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGxpbnV4IGZsYXZvcmVkIG02OGsgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgMTAyNAotI2RlZmluZQlTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJMHgwCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzY4MDIwIHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9tNjhrCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4a2xpbnV4XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbTY4ay1saW51eCIKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgTVkodmVjKTsKLQotLyogV2UgYWx3YXlzIGdlbmVyYXRlIFFNQUdJQyBmaWxlcyBpbiBwcmVmZXJlbmNlIHRvIFpNQUdJQyBmaWxlcy4gIEl0Ci0gICB3b3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlIHRoaXMgYSBsaW5rZXIgb3B0aW9uLCBpZiB0aGF0IGV2ZXIKLSAgIGJlY29tZXMgaW1wb3J0YW50LiAgKi8KLQotc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOwotc3RhdGljIGJvb2xlYW4gbTY4a2xpbnV4X2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtNjhrbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1tNjhrbGludXhfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPSBxX21hZ2ljX2Zvcm1hdDsKLSAgcmV0dXJuIE5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgbTY4a2xpbnV4X2JmZF9maW5hbF9saW5rCi0KLS8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tNjhrbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDIwKTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgbTY4a2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cwotDAotLyogQ29kZSB0byBsaW5rIGFnYWluc3QgTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotI2lmbmRlZiBHT1RfUkVGX1BSRUZJWAotI2RlZmluZQlHT1RfUkVGX1BSRUZJWAkiX19HT1RfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfR09UX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBHT1RfUkVGX1BSRUZJWCwgc2l6ZW9mIEdPVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2lmbmRlZiBQTFRfUkVGX1BSRUZJWAotI2RlZmluZQlQTFRfUkVGX1BSRUZJWAkiX19QTFRfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfUExUX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBQTFRfUkVGX1BSRUZJWCwgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogVGhpcyBzdHJpbmcgaXMgdXNlZCB0byBnZW5lcmF0ZSBzcGVjaWFsaXplZCBlcnJvciBtZXNzYWdlcy4gICovCi0KLSNpZm5kZWYgTkVFRFNfU0hSTElCCi0jZGVmaW5lIE5FRURTX1NIUkxJQiAiX19ORUVEU19TSFJMSUJfIgotI2VuZGlmCi0KLS8qIFRoaXMgc3BlY2lhbCBzeW1ib2wgaXMgYSBzZXQgdmVjdG9yIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mCi0gICBwb2ludGVycyB0byBmaXh1cCB0YWJsZXMuICBJdCB3aWxsIGJlIHByZXNlbnQgaW4gYW55IGR5bmFtaWNseQotICAgbGlua2VkIGZpbGUuICBUaGUgbGlua2VyIGdlbmVyYXRlZCBmaXh1cCB0YWJsZSBzaG91bGQgYWxzbyBiZSBhZGRlZAotICAgdG8gdGhlIGxpc3QsIGFuZCBpdCBzaG91bGQgYWx3YXlzIGFwcGVhciBpbiB0aGUgc2Vjb25kIHNsb3QgKHRoZQotICAgZmlyc3Qgb25lIGlzIGEgZHVtbXkgd2l0aCBhIG1hZ2ljIG51bWJlciB0aGF0IGlzIGRlZmluZWQgaW4KLSAgIGNydDAubykuICAqLwotCi0jaWZuZGVmIFNIQVJBQkxFX0NPTkZMSUNUUwotI2RlZmluZSBTSEFSQUJMRV9DT05GTElDVFMgIl9fU0hBUkFCTEVfQ09ORkxJQ1RTX18iCi0jZW5kaWYKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgVGhlIHRlcm1pbm9sb2d5IGlzIGEgYml0IHN0cmFuZ2UsIGJ1dAotICAgZWFjaCBmaXh1cCBjb250YWlucyB0d28gMzIgYml0IG51bWJlcnMuICBBIHJlZ3VsYXIgZml4dXAgY29udGFpbnMKLSAgIGFuIGFkZHJlc3MgYW5kIGEgcG9pbnRlciwgYW5kIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkIHN0b3JlIHRoZQotICAgYWRkcmVzcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci4gIEEgYnVpbHRpbiBmaXh1cAotICAgY29udGFpbnMgdHdvIHBvaW50ZXJzLCBhbmQgd2Ugc2hvdWxkIHJlYWQgdGhlIGFkZHJlc3MgdXNpbmcgb25lCi0gICBwb2ludGVyIGFuZCBzdG9yZSBpdCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgb3RoZXIKLSAgIHBvaW50ZXIuICBCdWlsdGluIGZpeHVwcyBjb21lIGludG8gcGxheSB3aGVuIHdlIGhhdmUgZHVwbGljYXRlCi0gICBfX0dPVF9fIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlLiAgVGhlIGJ1aWx0aW4gZml4dXAgd2lsbCBjb3B5Ci0gICB0aGUgR09UIHBvaW50ZXIgZnJvbSBvbmUgb3ZlciBpbnRvIHRoZSBvdGhlci4gICovCi0KLXN0cnVjdCBmaXh1cAotewotICBzdHJ1Y3QgZml4dXAgKm5leHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEganVtcCBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLAotICAgICB6ZXJvIGlmIHRoaXMgaXMganVzdCBhIHBvaW50ZXIgKi8KLSAgY2hhciBqdW1wOwotCi0gIGNoYXIgYnVpbHRpbjsKLX07Ci0KLS8qIFdlIGRvbid0IG5lZWQgYSBzcGVjaWFsIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCBidXQgd2UgZG8gbmVlZAotICAgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGJldHdlZW4gbGlua2VyIHBhc3Nlcywgc28gd2UgdXNlIGEgc3BlY2lhbAotICAgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIGxpbmsuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBOdW1iZXIgb2YgZml4dXBzLiAgKi8KLSAgc2l6ZV90IGZpeHVwX2NvdW50OwotCi0gIC8qIE51bWJlciBvZiBidWlsdGluIGZpeHVwcy4gICovCi0gIHNpemVfdCBsb2NhbF9idWlsdGluczsKLQotICAvKiBMaXN0IG9mIGZpeHVwcy4gICovCi0gIHN0cnVjdCBmaXh1cCAqZml4dXBfbGlzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKm5ld19maXh1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0JICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X3RhbGx5X3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1saW51eF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotCSBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkczsgdGhlcmUgYXJlbid0IGFueS4gICovCi0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkJIGxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmR5bm9iaiA9IE5VTEw7Ci0gIHJldC0+Zml4dXBfY291bnQgPSAwOwotICByZXQtPmxvY2FsX2J1aWx0aW5zID0gMDsKLSAgcmV0LT5maXh1cF9saXN0ID0gTlVMTDsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCi0JCQkgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgTGludXggbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGxpbnV4X2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIGEgbmV3IGZpeHVwLiAgKi8KLQotc3RhdGljIHN0cnVjdCBmaXh1cCAqCi1uZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCBidWlsdGluKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJ1aWx0aW47Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLQotICBmID0gKHN0cnVjdCBmaXh1cCAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkgIHNpemVvZiAoc3RydWN0IGZpeHVwKSk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgcmV0dXJuIGY7Ci0gIGYtPm5leHQgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3QgPSBmOwotICBmLT5oID0gaDsKLSAgZi0+dmFsdWUgPSB2YWx1ZTsKLSAgZi0+YnVpbHRpbiA9IGJ1aWx0aW47Ci0gIGYtPmp1bXAgPSAwOwotICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIHJlYWxpemUgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbGluayB0byBhIHNoYXJlZAotICAgbGlicmFyeS4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0gICBmaXh1cCB0YWJsZSwgYW5kIHdlIHVsdGltYXRlbHkgbmVlZCB0byBhZGQgYSBwb2ludGVyIHRvIHRoaXMgaW50bwotICAgdGhlIHNldCB2ZWN0b3IgZm9yIFNIQVJBQkxFX0NPTkZMSUNUUy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90Ci0gICBrbm93IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBidXQgdGhhdCdzIE9LIC0gd2UganVzdCBuZWVkIHRvCi0gICBjcmVhdGUgaXQgZm9yIG5vdy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLQotICAvKiBOb3RlIHRoYXQgd2Ugc2V0IHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcuICAqLwotICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0KLSAgLyogV2UgY2hvb3NlIHRvIHVzZSB0aGUgbmFtZSAiLmxpbnV4LWR5bmFtaWMiIGZvciB0aGUgZml4dXAgdGFibGUuCi0gICAgIFdoeSBub3Q/ICovCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHMtPl9yYXdfc2l6ZSA9IDA7Ci0gIHMtPmNvbnRlbnRzID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gYWRkIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBUaGlzIGlzCi0gICBhIHdyYXBwZXIgYXJvdW5kIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIHdoaWNoIGhhbmRsZXMgdGhlCi0gICB0d2Vha2luZyBuZWVkZWQgZm9yIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywKLQkJICAgICAgY29weSwgY29sbGVjdCwgaGFzaHApCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYm9vbGVhbiBpbnNlcnQ7Ci0KLSAgLyogTG9vayB1cCBhbmQgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZS4KLSAgICAgSWYgd2UgZG8sIGFuZCB0aGUgZGVmaW5pbmcgZW50cnkgaXMgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCB3ZQotICAgICBuZWVkIHRvIGNyZWF0ZSB0aGUgZHluYW1pYyBzZWN0aW9ucy4KLQotICAgICBGSVhNRTogV2hhdCBpZiBhYmZkLT54dmVjICE9IGluZm8tPmhhc2gtPmNyZWF0b3I/ICBXZSBtYXkgd2FudCB0bwotICAgICBiZSBhYmxlIHRvIGxpbmsgTGludXggYS5vdXQgYW5kIEVMRiBvYmplY3RzIHRvZ2V0aGVyLCBidXQgc2VyaW91cwotICAgICBjb25mdXNpb24gaXMgcG9zc2libGUuICAqLwotCi0gIGluc2VydCA9IGZhbHNlOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKG5hbWUsIFNIQVJBQkxFX0NPTkZMSUNUUykgPT0gMAotICAgICAgJiYgKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0gICAgewotICAgICAgaWYgKCEgbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGFiZmQ7Ci0gICAgICBpbnNlcnQgPSB0cnVlOwotICAgIH0KLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uKQotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIGggPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgZmFsc2UsCi0JCQkJICBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgc3RydWN0IGZpeHVwICpmOwotCi0JICBpZiAoaGFzaHAgIT0gTlVMTCkKLQkgICAgKmhhc2hwID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLQkgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCAhIElTX1BMVF9TWU0gKG5hbWUpKTsKLQkgIGlmIChmID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGYtPmp1bXAgPSBJU19QTFRfU1lNIChuYW1lKTsKLQotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICAvKiBEbyB0aGUgdXN1YWwgcHJvY2VkdXJlIGZvciBhZGRpbmcgYSBzeW1ib2wuICAqLwotICBpZiAoISBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sCi0JCQkJCSAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKLQkJCQkJICBoYXNocCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEluc2VydCBhIHBvaW50ZXIgdG8gb3VyIHRhYmxlIGluIHRoZSBzZXQgdmVjdG9yLiAgVGhlIGR5bmFtaWMKLSAgICAgbGlua2VyIHJlcXVpcmVzIHRoaXMgaW5mb3JtYXRpb24gKi8KLSAgaWYgKGluc2VydCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgLyogSGVyZSB3ZSBkbyBvdXIgc3BlY2lhbCB0aGluZyB0byBhZGQgdGhlIHBvaW50ZXIgdG8gdGhlCi0JIGR5bmFtaWMgc2VjdGlvbiBpbiB0aGUgU0hBUkFCTEVfQ09ORkxJQ1RTIHNldCB2ZWN0b3IuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCSAgICIubGludXgtZHluYW1pYyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JICAgICAoaW5mbywgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgU0hBUkFCTEVfQ09ORkxJQ1RTLAotCSAgICAgIEJTRl9HTE9CQUwgfCBCU0ZfQ09OU1RSVUNUT1IsIHMsIDAsIE5VTEwsIGZhbHNlLCBmYWxzZSwgTlVMTCkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIHdpbGwgY3Jhd2wgdGhlIGhhc2ggdGFibGUgYW5kIGNvbWUgaGVyZSBmb3IgZXZlcnkgZ2xvYmFsIHN5bWJvbC4KLSAgIFdlIHdpbGwgZXhhbWluZSBlYWNoIGVudHJ5IGFuZCBzZWUgaWYgdGhlcmUgYXJlIGluZGljYXRpb25zIHRoYXQgd2UKLSAgIG5lZWQgdG8gYWRkIGEgZml4dXAuICBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGNhc2VzIC0gb25lIGlzIHdoZXJlCi0gICB5b3UgaGF2ZSBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgb2YgUExUIG9yIEdPVCBzeW1ib2xzIC0gdGhlc2Ugd2lsbAotICAgaGF2ZSBhbHJlYWR5IGJlZW4gY2F1Z2h0IGFuZCBhZGRlZCBhcyAiYnVpbHRpbiIgZml4dXBzLiAgSWYgd2UgZmluZAotICAgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBub24gUExUL0dPVCBzeW1ib2wgaXMgYWxzbyBwcmVzZW50LCB3ZQotICAgY29udmVydCBpdCB0byBhIHJlZ3VsYXIgZml4dXAgaW5zdGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF90YWxseV9zeW1ib2xzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgZGF0YTsKLSAgc3RydWN0IGZpeHVwICpmLCAqZjE7Ci0gIGludCBpc19wbHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmgxLCAqaDI7Ci0gIGJvb2xlYW4gZXhpc3RzOwotCi0gIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgc3RybmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBORUVEU19TSFJMSUIsCi0JCSAgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDEpID09IDApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBjaGFyICphbGxvYyA9IE5VTEw7Ci0KLSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcgKyBzaXplb2YgTkVFRFNfU0hSTElCIC0gMTsKLSAgICAgIHAgPSBzdHJyY2hyIChuYW1lLCAnXycpOwotICAgICAgaWYgKHAgIT0gTlVMTCkKLQlhbGxvYyA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLQotICAgICAgaWYgKHAgPT0gTlVMTCB8fCBhbGxvYyA9PSBOVUxMKQotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzJ1xuIiksCi0JCQkgICAgICAgbmFtZSk7Ci0gICAgICBlbHNlCi0JewotCSAgc3RyY3B5IChhbGxvYywgbmFtZSk7Ci0JICBwID0gc3RycmNociAoYWxsb2MsICdfJyk7Ci0JICAqcCsrID0gJ1wwJzsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzLnNvLiVzJ1xuIiksCi0JICAgICBhbGxvYywgcCk7Ci0JICBmcmVlIChhbGxvYyk7Ci0JfQotCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGEgUExUL0dPVCwgd2UgZG8gbm90IGV2ZW4gbmVlZCB0byBsb29rIGF0IGl0ICovCi0gIGlzX3BsdCA9IElTX1BMVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0KLSAgaWYgKGlzX3BsdCB8fCBJU19HT1RfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpKQotICAgIHsKLSAgICAgIC8qIExvb2sgdXAgdGhpcyBzeW1ib2wgdHdpY2UuICBPbmNlIGp1c3QgYXMgYSByZWd1bGFyIGxvb2t1cCwKLQkgYW5kIHRoZW4gYWdhaW4gZm9sbG93aW5nIGFsbCBvZiB0aGUgaW5kaXJlY3QgbGlua3MgdW50aWwgd2UKLQkgcmVhY2ggYSByZWFsIHN5bWJvbC4gICovCi0gICAgICBoMSA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLQkJCQkgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLQkJCQkgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgLyogaDIgZG9lcyBub3QgZm9sbG93IGluZGlyZWN0IHN5bWJvbHMuICovCi0gICAgICBoMiA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCQkgICAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nCi0JCQkJICAgICsgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSksCi0JCQkJICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgIC8qIFRoZSByZWFsIHN5bWJvbCBtdXN0IGV4aXN0IGJ1dCBpZiBpdCBpcyBhbHNvIGFuIEFCUyBzeW1ib2wsCi0JIHRoZXJlIGlzIG5vIG5lZWQgdG8gaGF2ZSBhIGZpeHVwLiAgVGhpcyBpcyBiZWNhdXNlIHRoZXkgYm90aAotCSBjYW1lIGZyb20gdGhlIHNhbWUgbGlicmFyeS4gIElmIG9uIHRoZSBvdGhlciBoYW5kLCB3ZSBoYWQgdG8KLQkgdXNlIGFuIGluZGlyZWN0IHN5bWJvbCB0byBnZXQgdG8gdGhlIHJlYWwgc3ltYm9sLCB3ZSBhZGQgdGhlCi0JIGZpeHVwIGFueXdheSwgc2luY2UgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZXNlIHN5bWJvbHMgY29tZQotCSBmcm9tIGRpZmZlcmVudCBzaGFyZWQgbGlicmFyaWVzICovCi0gICAgICBpZiAoaDEgIT0gTlVMTAotCSAgJiYgKCgoaDEtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQl8fCBoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoaDEtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQkgICAgICB8fCBoMi0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkpCi0JewotCSAgLyogU2VlIGlmIHRoZXJlIGlzIGEgImJ1aWx0aW4iIGZpeHVwIGFscmVhZHkgcHJlc2VudAotCSAgICAgaW52b2x2aW5nIHRoaXMgc3ltYm9sLiAgSWYgc28sIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyCi0JICAgICBmaXh1cC4gIEluIHRoZSBlbmQsIHRoaXMgcmVsYXhlcyBzb21lIG9mIHRoZSByZXF1aXJlbWVudHMKLQkgICAgIGFib3V0IHRoZSBvcmRlciBvZiBwZXJmb3JtaW5nIGZpeHVwcy4gICovCi0JICBleGlzdHMgPSBmYWxzZTsKLQkgIGZvciAoZjEgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLQkgICAgICAgZjEgIT0gTlVMTDsKLQkgICAgICAgZjEgPSBmMS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmICgoZjEtPmggIT0gaCAmJiBmMS0+aCAhPSBoMSkKLQkJICB8fCAoISBmMS0+YnVpbHRpbiAmJiAhIGYxLT5qdW1wKSkKLQkJY29udGludWU7Ci0JICAgICAgaWYgKGYxLT5oID09IGgxKQotCQlleGlzdHMgPSB0cnVlOwotCSAgICAgIGlmICghIGV4aXN0cwotCQkgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotCQl7Ci0JCSAgZiA9IG5ld19maXh1cCAoaW5mbywgaDEsIGYxLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUsIDApOwotCQkgIGYtPmp1bXAgPSBpc19wbHQ7Ci0JCX0KLQkgICAgICBmMS0+aCA9IGgxOwotCSAgICAgIGYxLT5qdW1wID0gaXNfcGx0OwotCSAgICAgIGYxLT5idWlsdGluID0gMDsKLQkgICAgICBleGlzdHMgPSB0cnVlOwotCSAgICB9Ci0JICBpZiAoISBleGlzdHMKLQkgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQkgICAgewotCSAgICAgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBoLT5yb290LnJvb3QudS5kZWYudmFsdWUsIDApOwotCSAgICAgIGlmIChmID09IE5VTEwpCi0JCXsKLQkJICAvKiBGSVhNRTogTm8gd2F5IHRvIHJldHVybiBlcnJvci4gICovCi0JCSAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBmLT5qdW1wID0gaXNfcGx0OwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBRdWljayBhbmQgZGlydHkgd2F5IG9mIHN0cmlwcGluZyB0aGVzZSBzeW1ib2xzIGZyb20gdGhlCi0JIHN5bXRhYi4gKi8KLSAgICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQloLT5yb290LndyaXR0ZW4gPSB0cnVlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSAubGludXgtZHluYW1pYyBzZWN0aW9uIGlzLgotICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBMaW51eCBsaW5rZXIgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uCi0gICByb3V0aW5lLiAgV2UgaGF2ZSBmaW5pc2hlZCByZWFkaW5nIGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMsIGFuZCBub3cKLSAgIHdlIGp1c3Qgc2NhbiB0aGUgaGFzaCB0YWJsZXMgdG8gZmluZCBvdXQgaG93IG1hbnkgYWRkaXRpb25hbCBmaXh1cHMKLSAgIGFyZSByZXF1aXJlZC4gICovCi0KLWJvb2xlYW4KLWJmZF9tNjhrbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZml4dXAgKmY7Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpcnN0IGZpbmQgdGhlIGZpeHVwcy4uLiAqLwotICBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgIGxpbnV4X3RhbGx5X3N5bWJvbHMsCi0JCQkgICAgKFBUUikgaW5mbyk7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIGJ1aWx0aW4gZml4dXBzLCBsZWF2ZSByb29tIGZvciBhIG1hcmtlci4gIFRoaXMgaXMKLSAgICAgdXNlZCBieSB0aGUgZHluYW1pYyBsaW5rZXIgc28gdGhhdCBpdCBrbm93cyB0aGF0IGFsbCB0aGF0IGZvbGxvdwotICAgICBhcmUgYnVpbHRpbiBmaXh1cHMgaW5zdGVhZCBvZiByZWd1bGFyIGZpeHVwcy4gICovCi0gIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmLT5idWlsdGluKQotCXsKLQkgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50OwotCSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnM7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IDApCi0JYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZml4dXAgdGFibGUuICBXZSB3aWxsIGZpbGwgaXQgaW4gbGF0ZXIuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkgICAgICAgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgewotICAgICAgcy0+X3Jhd19zaXplID0gOCArIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCAqIDg7Ci0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBtZW1zZXQgKHMtPmNvbnRlbnRzLCAwLCAoc2l6ZV90KSBzLT5fcmF3X3NpemUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgY29tZSBoZXJlIG9uY2Ugd2UgYXJlIHJlYWR5IHRvIGFjdHVhbGx5IHdyaXRlIHRoZSBmaXh1cCB0YWJsZSB0bwotICAgdGhlIG91dHB1dCBmaWxlLiAgU2NhbiB0aGUgZml4dXAgdGFibGVzIGFuZCBzbyBmb3J0aCBhbmQgZ2VuZXJhdGUKLSAgIHRoZSBzdHVmZiB3ZSBuZWVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzLCAqb3MsICppczsKLSAgYmZkX2J5dGUgKmZpeHVwX3RhYmxlOwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgZml4dXAgKmY7Ci0gIHVuc2lnbmVkIGludCBuZXdfYWRkcjsKLSAgaW50IHNlY3Rpb25fb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgZml4dXBzX3dyaXR0ZW47Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0JCQkgICAgICAgIi5saW51eC1keW5hbWljIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIG9zID0gcy0+b3V0cHV0X3NlY3Rpb247Ci0gIGZpeHVwc193cml0dGVuID0gMDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgcHJpbnRmICgiRml4dXAgdGFibGUgZmlsZSBvZmZzZXQ6ICV4ICBWTUE6ICV4XG4iLCAKLQkgIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkgIG9zLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0KTsKLSNlbmRpZgotCi0gIGZpeHVwX3RhYmxlID0gcy0+Y29udGVudHM7Ci0gIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCwgZml4dXBfdGFibGUpOwotICBmaXh1cF90YWJsZSArPSA0OwotCi0gIC8qIEZpbGwgaW4gZml4dXAgdGFibGUuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLQljb250aW51ZTsKLQotICAgICAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAotCSAgICAgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaXMgPSBmLT5oLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJGaXh1cCglZCkgJXM6ICV4ICV4XG4iLGYtPmp1bXAsIGYtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JICAgICAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0gICAgICBpZiAoZi0+anVtcCkKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlICsgMiwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQl9Ci0gICAgICArK2ZpeHVwc193cml0dGVuOwotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zICE9IDApCi0gICAgewotICAgICAgLyogU3BlY2lhbCBtYXJrZXIgc28gd2Uga25vdyB0byBzd2l0Y2ggdG8gdGhlIG90aGVyIHR5cGUgb2YgZml4dXAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICAgIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotCXsKLQkgIGlmICghIGYtPmJ1aWx0aW4pCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCi0JCSBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0JICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotCSAgcHJpbnRmICgiRml4dXAoQikgJXM6ICV4ICV4XG4iLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCQkgIG5ld19hZGRyLCBmLT52YWx1ZSk7Ci0jZW5kaWYKLQotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgICsrZml4dXBzX3dyaXR0ZW47Ci0JfQotICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCAhPSBmaXh1cHNfd3JpdHRlbikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIldhcm5pbmc6IGZpeHVwIGNvdW50IG1pc21hdGNoXG4iKSk7Ci0gICAgICB3aGlsZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ID4gZml4dXBzX3dyaXR0ZW4pCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICArK2ZpeHVwc193cml0dGVuOwotCX0KLSAgICB9Ci0KLSAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCSAgICAgICJfX0JVSUxUSU5fRklYVVBTX18iLAotCQkJICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgaWYgKGggIT0gTlVMTAotICAgICAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICB7Ci0gICAgICBpcyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgbmV3X2FkZHIgPSBoLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgIHByaW50ZiAoIkJ1aWx0aW4gZml4dXAgdGFibGUgYXQgJXhcbiIsIG5ld19hZGRyKTsKLSNlbmRpZgotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgIH0KLSAgZWxzZQotICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHMtPmNvbnRlbnRzLCAxLCBzLT5fcmF3X3NpemUsIG91dHB1dF9iZmQpCi0gICAgICAhPSBzLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgbGludXhfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCi0KLSNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9tNjhrbHlueC5jIGIvYmZkL202OGtseW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhY2RmYmMuLjAwMDAwMDAKLS0tIGEvYmZkL202OGtseW54LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIG02OGsgYmluYXJpZXMgdW5kZXIgTHlueE9TLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9tNjhrCi0KLSNkZWZpbmUgTVkoT1ApIENBVChtNjhrbHlueF9hb3V0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbTY4ay1seW54IgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLSNpZmRlZiBMWU5YX0NPUkUKLQotY2hhciAqbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKCk7Ci1pbnQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwoKTsKLWJvb2xlYW4gbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AoKTsKLWNvbnN0IGJmZF90YXJnZXQgKmx5bnhfY29yZV9maWxlX3AoKTsKLQotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wIGx5bnhfY29yZV9maWxlX3AKLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9tNjhrbmV0YnNkLmMgYi9iZmQvbTY4a25ldGJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGQxNjY1Li4wMDAwMDAwCi0tLSBhL2JmZC9tNjhrbmV0YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC9tNjhrIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRAk0Ci0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotLyogT3VyIG02OGsgcG9ydHMgdXNlIGVpdGhlciA0SyBvciA4SyBwYWdlcywgYnV0IG9iamVjdCBmaWxlcyBhbHdheXMKLSAgIGFzc3VtZSA4SyBwYWdlIGFsaWdubWVudCBzbyB0aGV5IHdpbGwgd29yayBvbiBhbGwgbTY4ayBtYWNoaW5lcy4gKi8KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRQkweDIwMDAKLQotI2RlZmluZSBERUZBVUxUX0FSQ0gJYmZkX2FyY2hfbTY4awotI2RlZmluZSBERUZBVUxUX01JRCAJTV82OEtfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChtNjhrbmV0YnNkXyxPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW02OGstbmV0YnNkIgotCi0jaW5jbHVkZSAibmV0YnNkLmgiCmRpZmYgLS1naXQgYS9iZmQvbTg4a21hY2gzLmMgYi9iZmQvbTg4a21hY2gzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTY0MDguLjAwMDAwMDAKLS0tIGEvYmZkL204OGttYWNoMy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSBtODhrIGEub3V0IChNYWNoIDMpIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQkoNDA5NioyKQotI2RlZmluZSBTRUdNRU5UX1NJWkUJMHgyMDAwMAotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJMAotI2RlZmluZSBCWVRFU19JTl9XT1JECTQKLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KQkxIAkJLyogKE5fTUFHSUcoeCkgPT0gWk1BR0lDKSAqLwotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotCi0jZGVmaW5lIE5fVFhUU0laRSh4KQkoKHgpLmFfdGV4dCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTg4awotI2RlZmluZSBNWShPUCkgQ0FUKG04OGttYWNoM18sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW04OGstbWFjaDMiCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL21ha2VmaWxlLnZtcyBiL2JmZC9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNmIxZmYuLjAwMDAwMDAKLS0tIGEvYmZkL21ha2VmaWxlLnZtcworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGJmZCBsaWJyYXJ5IHVuZGVyIG9wZW5WTVMgKEFscGhhIGFuZCBWYXgpCi0jCi0jIEZvciB1c2Ugd2l0aCBnbnUtbWFrZSBmb3Igdm1zCi0jCi0jIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmLCBra2FlbXBmQHJtaS5kZQotIwotIwotCi1DQz1jYwotCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotSE9TVEZJTEU9YWxwaGF2bXMuaAotVEFSR0VUT0JKUyA9IGNwdS1hbHBoYS5vYmoKLWVsc2UKLUhPU1RGSUxFPXZheHZtcy5oCi1UQVJHRVRPQkpTID0gY3B1LXZheC5vYmoKLWVuZGlmCi0KLQotT0JKUz1hcmNoaXZlLm9iaixhcmNodXJlcy5vYmosYmZkLm9iaixjYWNoZS5vYmosY29mZmdlbi5vYmosY29yZWZpbGUub2JqLFwKLSAgZm9ybWF0Lm9iaixpbml0Lm9iaixsaWJiZmQub2JqLG9wbmNscy5vYmoscmVsb2Mub2JqLHNlY3Rpb24ub2JqLHN5bXMub2JqLFwKLSAgdGFyZ2V0cy5vYmosaGFzaC5vYmosbGlua2VyLm9iaixlbGYub2JqLHNyZWMub2JqLGJpbmFyeS5vYmosdGVraGV4Lm9iaixcCi0gIGloZXgub2JqLHN0YWItc3ltcy5vYmosdm1zLm9iaix2bXMtaGRyLm9iaix2bXMtZ3NkLm9iaix2bXMtdGlyLm9iaixcCi0gIHZtcy1taXNjLm9iaiwkKFRBUkdFVE9CSlMpCi0KLWlmZXEgKCQoQ0MpLGdjYykKLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1ERUZTPS9kZWZpbmU9KFNFTEVDVF9WRUNTPSImdm1zX2FscGhhX3ZlYyIsU0VMRUNUX0FSQ0hJVEVDVFVSRVM9IiZiZmRfYWxwaGFfYXJjaCIsXAotIkhBVkVfdm1zX2FscGhhX3ZlYz0xIikKLWVsc2UKLURFRlM9L2RlZmluZT0oU0VMRUNUX1ZFQ1M9IiZ2bXNfdmF4X3ZlYyIsU0VMRUNUX0FSQ0hJVEVDVFVSRVM9IiZiZmRfdmF4X2FyY2giLFwKLSJIQVZFX3Ztc192YXhfdmVjPTEiLCJWTVNfREVCVUciKQotZW5kaWYKLUNGTEFHUz0vaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0pJChERUZTKQotZWxzZQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLURFRlM9L2RlZmluZT0oU0VMRUNUX1ZFQ1M9IiZ2bXNfYWxwaGFfdmVjIixTRUxFQ1RfQVJDSElURUNUVVJFUz0iJmJmZF9hbHBoYV9hcmNoIixcCi0iSEFWRV92bXNfYWxwaGFfdmVjPTEiLCJ1bmxpbms9cmVtb3ZlIiwiY29uc3Q9IiwiVk1TX0RFQlVHIiwpCi1lbHNlCi1ERUZTPS9kZWZpbmU9KFNFTEVDVF9WRUNTPSImdm1zX3ZheF92ZWMiLFNFTEVDVF9BUkNISVRFQ1RVUkVTPSImYmZkX3ZheF9hcmNoIixcCi0iSEFWRV92bXNfdmF4X3ZlYz0xIiwidW5saW5rPXJlbW92ZSIsImNvbnN0PSIsIlZNU19ERUJVRyIpCi1lbmRpZgotQ0ZMQUdTPS9ub29wdC9kZWJ1Zy9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSkkKERFRlMpL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLGxvbmdleHRlcm4pCi1lbmRpZgotCi0KLWxpYmJmZC5vbGI6IHN5c2RlcC5oIGJmZC5oICQoT0JKUykKLQlwdXJnZQotCWxpYi9jcmVhdGUgbGliYmZkICQoT0JKUykKLQotc3lzZGVwLmg6IFsuaG9zdHNdJChIT1NURklMRSkgY29uZmlnLmgKLQkkKENQKSAkPCAkQAotCi1iZmQuaDogYmZkLWluMi5oCi0JJCQgQGNvbmZpZ3VyZQotCi10YXJnbWF0Y2guaDogYmZkLmgKLWNvbmZpZy5oOiBiZmQuaAotCi12bXMuYzogdm1zLmgKLXZtcy1taGQuYzogdm1zLmgKLXZtcy1nc2QuYzogdm1zLmgKLXZtcy10aXIuYzogdm1zLmgKLXZtcy1taXNjLmM6IHZtcy5oCi10YXJnZXRzLmM6IHRhcmdtYXRjaC5oCi0KLWNsZWFuOgotCSQkIHB1cmdlCi0JJChSTSkgbGliYmZkLm9sYjsKLQkkKFJNKSBzeXNkZXAuaDsKLQkkKFJNKSBiZmQuaDsKLQkkKFJNKSB0YXJnbWF0Y2guaDsKLQkkKFJNKSBjb25maWcuaDsKLQkkKFJNKSAqLm9iajsKZGlmZiAtLWdpdCBhL2JmZC9taXBzYnNkLmMgYi9iZmQvbWlwc2JzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTY4MGZiLi4wMDAwMDAwCi0tLSBhL2JmZC9taXBzYnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIE1JUFMgQlNEIChhLm91dCkgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBSYWxwaCBDYW1wYmVsbC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotLyogI2RlZmluZSBFTlRSWV9DQU5fQkVfWkVSTyAqLwotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLSAgICAoTl9NQUdJQyh4KSAhPSBaTUFHSUMgPyAoeCkuYV9lbnRyeSA6CS8qIG9iamVjdCBmaWxlIG9yIE5NQUdJQyAqL1wKLQkgICAgVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFCS8qIG5vIHBhZGRpbmcgKi9cCi0gICAgKQotI2RlZmluZSBOX0RBVEFERFIoeCkgKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCkpCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiA0MDk2Ci0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbWlwcwotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9VTktOT1dOIFwKLQkJCSAgICB8fCAobXR5cGUpID09IE1fTUlQUzEgfHwgKG10eXBlKSA9PSBNX01JUFMyKQotI2RlZmluZSBNWV9zeW1ib2xfbGVhZGluZ19jaGFyICdcMCcKLQotI2RlZmluZSBNWShPUCkgQ0FUKG1pcHNic2RfLE9QKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jZGVmaW5lIFNFVF9BUkNIX01BQ0goQUJGRCwgRVhFQykgXAotICBNWShzZXRfYXJjaF9tYWNoKShBQkZELCBOX01BQ0hUWVBFIChFWEVDKSk7IFwKLSAgTVkoY2hvb3NlX3JlbG9jX3NpemUpKEFCRkQpOwotc3RhdGljIHZvaWQgTVkoc2V0X2FyY2hfbWFjaCkgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgbWFjaHR5cGUpKTsKLXN0YXRpYyB2b2lkIE1ZKGNob29zZV9yZWxvY19zaXplKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotc3RhdGljIGJvb2xlYW4gTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogV2UgY2FuJ3QgdXNlIE1ZKHgpIGhlcmUgYmVjYXVzZSBpdCBsZWFkcyB0byBhIHJlY3Vyc2l2ZSBjYWxsIHRvIENBVAotICAgd2hlbiBleHBhbmRlZCBpbnNpZGUgSlVNUF9UQUJMRS4gICovCi0jZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCBtaXBzYnNkX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBtaXBzYnNkX2Nhbm9uaWNhbGl6ZV9yZWxvYwotCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgdW51c2VkCi0jZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0KLSNkZWZpbmUgTVlfYmFja2VuZF9kYXRhICZNWShiYWNrZW5kX2RhdGEpCi0jZGVmaW5lIE1ZX0JGRF9UQVJHRVQKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCi0KLXN0YXRpYyB2b2lkCi1NWShzZXRfYXJjaF9tYWNoKSAoYWJmZCwgbWFjaHR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG1hY2h0eXBlOwotewotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgbG9uZyBtYWNoaW5lOwotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAqLwotICBzd2l0Y2ggKG1hY2h0eXBlKSB7Ci0KLSAgY2FzZSBNX01JUFMxOgotICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgIG1hY2hpbmUgPSAzMDAwOwotICAgIGJyZWFrOwotCi0gIGNhc2UgTV9NSVBTMjoKLSAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKLSAgICBtYWNoaW5lID0gNDAwMDsKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgIGFyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOwotICAgIG1hY2hpbmUgPSAwOwotICAgIGJyZWFrOwotICB9Ci0gIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsIGFyY2gsIG1hY2hpbmUpOyAgCi19Ci0KLS8qIERldGVybWluZSB0aGUgc2l6ZSBvZiBhIHJlbG9jYXRpb24gZW50cnksIGJhc2VkIG9uIHRoZSBhcmNoaXRlY3R1cmUgKi8KLXN0YXRpYyB2b2lkCi1NWShjaG9vc2VfcmVsb2Nfc2l6ZSkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2goYWJmZCkpIHsKLSAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfRVhUX1NJWkU7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUgaW4gQlNEIGEub3V0IGZvcm1hdC4KLSAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1NWSh3cml0ZV9vYmplY3RfY29udGVudHMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAvKiBNYWdpYyBudW1iZXIsIG1hZXN0cm8sIHBsZWFzZSEgICovCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoKGFiZmQpKSB7Ci0gIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaChhYmZkKSkgewotICAgIGNhc2UgYmZkX21hY2hfbTY4MDEwOgotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzY4MDEwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMjA6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fNjgwMjApOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9TUEFSQyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fMzg2KTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV8yOUspOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgc3dpdGNoIChiZmRfZ2V0X21hY2goYWJmZCkpIHsKLSAgICBjYXNlIDQwMDA6Ci0gICAgY2FzZSA2MDAwOgotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX01JUFMyKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fTUlQUzEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9VTktOT1dOKTsKLSAgfQotCi0gIE1ZKGNob29zZV9yZWxvY19zaXplKShhYmZkKTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLSAqIE1JUFMgcmVsb2NhdGlvbiB0eXBlcy4KLSAqLwotI2RlZmluZSBNSVBTX1JFTE9DXzMyCQkwCi0jZGVmaW5lIE1JUFNfUkVMT0NfSk1QCQkxCi0jZGVmaW5lIE1JUFNfUkVMT0NfV0RJU1AxNgkyCi0jZGVmaW5lIE1JUFNfUkVMT0NfSEkxNgkJMwotI2RlZmluZSBNSVBTX1JFTE9DX0hJMTZfUwk0Ci0jZGVmaW5lIE1JUFNfUkVMT0NfTE8xNgkJNQotCi0vKgotICogVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHBlcmZvcm1pbmcgYSBCRkRfUkVMT0NfTUlQU19KTVAgcmVsb2NhdGlvbi4KLSAqIFRoZSBqdW1wIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgZm9ybWVkIGZyb20gdGhlIHVwcGVyIDQgYml0cyBvZiB0aGUKLSAqICJjdXJyZW50IiBwcm9ncmFtIGNvdW50ZXIgY29uY2F0ZW5hdGVkIHdpdGggdGhlIGp1bXAgaW5zdHJ1Y3Rpb24ncwotICogMjYgYml0IGZpZWxkIGFuZCB0d28gdHJhaWxpbmcgemVyb3MuCi0gKiBJZiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBpcyBub3QgaW4gdGhlIHNhbWUgc2VnbWVudCBhcyB0aGUgImN1cnJlbnQiCi0gKiBwcm9ncmFtIGNvdW50ZXIsIHRoZW4gd2UgbmVlZCB0byBzaWduYWwgYW4gZXJyb3IuCi0gKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfZml4X2ptcF9hZGRyIChhYmZkLHJlbG9jX2VudHJ5LHN5bWJvbCxkYXRhLGlucHV0X3NlY3Rpb24sb3V0cHV0X2JmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbiwgcGM7Ci0gCi0gIC8qIElmIHRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGp1c3QgY29udGludWUuICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiAKLSAgICogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgKiBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4KLSAgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBwYyA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArIDQ7Ci0KLSAgaWYgKChyZWxvY2F0aW9uICYgMHhGMDAwMDAwMCkgIT0gKHBjICYgMHhGMDAwMDAwMCkpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKgotICogVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHBlcmZvcm1pbmcgYSBCRkRfUkVMT0NfSEkxNl9TIHJlbG9jYXRpb24uCi0gKiBXZSBuZWVkIHRvIHNlZSBpZiBiaXQgMTUgaXMgc2V0IGluIHRoZSByZXN1bHQuIElmIGl0IGlzLCB3ZSBhZGQKLSAqIDB4MTAwMDAgYW5kIGNvbnRpbnVlIG5vcm1hbGx5LiBUaGlzIHdpbGwgY29tcGVuc2F0ZSBmb3IgdGhlIHNpZ24gZXh0ZW5zaW9uCi0gKiB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQgYXQgcnVuIHRpbWUuCi0gKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfZml4X2hpMTZfcyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCSBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2ZpeF9oaTE2X3MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gCi0gIC8qIElmIHRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGp1c3QgY29udGludWUuICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiAKLSAgICogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgKiBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4KLSAgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBpZiAocmVsb2NhdGlvbiAmIDB4ODAwMCkKLSAgICByZWxvY19lbnRyeS0+YWRkZW5kICs9IDB4MTAwMDA7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbWlwc19ob3d0b190YWJsZV9leHRbXSA9IHsKLSAge01JUFNfUkVMT0NfMzIsICAgICAgMCwgMiwgMzIsIGZhbHNlLCAwLCAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsCi0JIjMyIiwgICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsIGZhbHNlfSwKLSAge01JUFNfUkVMT0NfSk1QLCAgICAgMiwgMiwgMjYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LAotCW1pcHNfZml4X2ptcF9hZGRyLAotCSJNSVBTX0pNUCIsIGZhbHNlLCAwLCAweDAzZmZmZmZmLCBmYWxzZX0sCi0gIHtNSVBTX1JFTE9DX1dESVNQMTYsIDIsIDIsIDE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLAotCSJXRElTUDE2IiwgIGZhbHNlLCAwLCAweDAwMDBmZmZmLCBmYWxzZX0sCi0gIHtNSVBTX1JFTE9DX0hJMTYsICAgMTYsIDIsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsCi0JIkhJMTYiLCAgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge01JUFNfUkVMT0NfSEkxNl9TLCAxNiwgMiwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLSAgICAgICAgbWlwc19maXhfaGkxNl9zLAotICAgICAgICAiSEkxNl9TIiwgICBmYWxzZSwgMCwgMHgwMDAwZmZmZiwgZmFsc2V9LAotICB7TUlQU19SRUxPQ19MTzE2LCAgICAwLCAyLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsCi0JIkxPMTYiLCAgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsIGZhbHNlfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLU1ZKHJlbG9jX2hvd3RvX3R5cGVfbG9va3VwKSAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLQotICBpZiAoYmZkX2dldF9hcmNoIChhYmZkKSAhPSBiZmRfYXJjaF9taXBzKQotICAgIHJldHVybiAwOwotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfMzJdKTsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0pNUDoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfSk1QXSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUxfUzI6Ci0gICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DX1dESVNQMTZdKTsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgotICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19ISTE2XSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19ISTE2X1NdKTsKLSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19MTzE2XSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyoKLSAqIFRoaXMgaXMganVzdCBsaWtlIHRoZSBzdGFuZGFyZCBhb3V0eC5oIHZlcnNpb24gYnV0IHdlIG5lZWQgdG8gZG8gb3VyCi0gKiBvd24gbWFwcGluZyBvZiBleHRlcm5hbCByZWxvYyB0eXBlIHZhbHVlcyB0byBob3d0byBlbnRyaWVzLgotICovCi1sb25nCi1NWShjYW5vbmljYWxpemVfcmVsb2MpKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgIGJmZCAqYWJmZDsKLSAgICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgaW50IGNvdW50LCBjOwotICBleHRlcm4gcmVsb2NfaG93dG9fdHlwZSBOQU1FKGFvdXQsZXh0X2hvd3RvX3RhYmxlKVtdOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSByZWFkIGluIHRoZSByZWxvY2F0aW9uIHRhYmxlLCByZXR1cm4gdGhlIHZhbHVlcy4gKi8KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSB7Ci0gICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLQotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKSB7Ci0gICAgICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLSAgICAgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0gICAgfQotICAgICpyZWxwdHIgPSAwOwotICAgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgfQotICBpZiAodGJscHRyICYmIHNlY3Rpb24tPnJlbG9jX2NvdW50KSB7Ci0gICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspIAotICAgICAgKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgKnJlbHB0ciA9IDA7Ci0gICAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICB9Ci0KLSAgaWYgKCFOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKQotICAgIHJldHVybiAtMTsKLSAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICAvKiBmaXggdXAgaG93dG8gZW50cmllcyAqLwotICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykgCi0gICAgewotICAgICAgYyA9IHRibHB0ci0+aG93dG8gLSBOQU1FKGFvdXQsZXh0X2hvd3RvX3RhYmxlKTsKLSAgICAgIHRibHB0ci0+aG93dG8gPSAmbWlwc19ob3d0b190YWJsZV9leHRbY107Ci0KLSAgICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgIH0KLSAgKnJlbHB0ciA9IDA7Ci0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0gewotICAwLAkJCQkvKiB6bWFnaWMgY29udGlndW91cyAqLwotICAxLAkJCQkvKiB0ZXh0IGluY2wgaGVhZGVyICovCi0gIDAsCQkJCS8qIGVudHJ5IGlzIHRleHQgYWRkcmVzcyAqLwotICAwLAkJCQkvKiBleGVjX2hkcl9mbGFncyAqLwotICBUQVJHRVRfUEFHRV9TSVpFLAkJCS8qIHRleHQgdm1hICovCi0gIE1ZX3NldF9zaXplcywKLSAgMCwJCQkJLyogdGV4dCBzaXplIGluY2x1ZGVzIGV4ZWMgaGVhZGVyICovCi0gIDAsCQkJCS8qIGFkZF9keW5hbWljX3N5bWJvbHMgKi8KLSAgMCwJCQkJLyogYWRkX29uZV9zeW1ib2wgKi8KLSAgMCwJCQkJLyogbGlua19keW5hbWljX29iamVjdCAqLwotICAwLAkJCQkvKiB3cml0ZV9keW5hbWljX3N5bWJvbCAqLwotICAwLAkJCQkvKiBjaGVja19keW5hbWljX3JlbG9jICovCi0gIDAJCQkJLyogZmluaXNoX2R5bmFtaWNfbGluayAqLwotfTsKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9taXBzX2JpZ192ZWM7Ci0KLWNvbnN0IGJmZF90YXJnZXQgYW91dF9taXBzX2xpdHRsZV92ZWMgPQotewotICAiYS5vdXQtbWlwcy1saXR0bGUiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgJiBhb3V0X21pcHNfYmlnX3ZlYywKLSAgCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YQotfTsKLQotY29uc3QgYmZkX3RhcmdldCBhb3V0X21pcHNfYmlnX3ZlYyA9Ci17Ci0gICJhLm91dC1taXBzLWJpZyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAotICAgIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAmIGFvdXRfbWlwc19saXR0bGVfdmVjLAotICAKLSAgKFBUUikgTVlfYmFja2VuZF9kYXRhCi19OwpkaWZmIC0tZ2l0IGEvYmZkL21wdy1jb25maWcuaW4gYi9iZmQvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhZGRlZS4uMDAwMDAwMAotLS0gYS9iZmQvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgQkZELgotCi0jIFRoaXMgaXMgYWxtb3N0IGFsd2F5cyBjb3JyZWN0LgotCi1TZXQgc2VsYXJjaHMgIiZiZmRfe3RhcmdldF9jcHV9X2FyY2giCi1TZXQgZGVmdmVjICIiCi1TZXQgc2VsdmVjcyAiIgotU2V0IGhhdmV2ZWNzICIiCi0KLUlmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9tNjhrLWFwcGxlLW1hY29zLwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1tNjhrLmMubyAie299ImNvZmZsaW5rLmMubycKLQlTZXQgZGVmdmVjIG02OGtjb2ZmX3ZlYwotCVNldCBzZWx2ZWNzICcmbTY4a2NvZmZfdmVjJwotCVNldCBoYXZldmVjcyAnLWQgSEFWRV9tNjhrY29mZl92ZWMnCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3Bvd2VycGMtYXBwbGUtbWFjb3MvCi0JU2V0IEJGRF9CQUNLRU5EUyAnIntvfSJjb2ZmLXBtYWMuYy5vICJ7b30ieGNvZmZsaW5rLmMubycKLQlTZXQgZGVmdmVjIHBtYWNfeGNvZmZfdmVjCi0JU2V0IHNlbHZlY3MgJyZwbWFjX3hjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfcG1hY194Y29mZl92ZWMnCi0JU2V0IHNlbGFyY2hzICImYmZkX3Bvd2VycGNfYXJjaCIKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvaTM4Ni1cT3B0aW9uLXgtZ28zMi8KLQlTZXQgQkZEX0JBQ0tFTkRTICcie299ImNvZmYtaTM4Ni5jLm8nCi0JU2V0IGRlZnZlYyBpMzg2Y29mZl92ZWMKLQlTZXQgc2VsdmVjcyAnJmkzODZjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfaTM4NmNvZmZfdmVjJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9taXBzLVxPcHRpb24teC1cT3B0aW9uLXgvCi0JU2V0IEJGRF9CQUNLRU5EUyAnIntvfSJjb2ZmLW1pcHMuYy5vICJ7b30iZWNvZmYuYy5vICJ7b30iZWNvZmZsaW5rLmMubyAie299ImVsZjMyLmMubyAie299ImVsZjMyLW1pcHMuYy5vICJ7b30iZWxmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBlY29mZl9iaWdfdmVjCi0JU2V0IHNlbHZlY3MgJyZlY29mZl9iaWdfdmVjLCZlY29mZl9saXR0bGVfdmVjLCZiZmRfZWxmMzJfYmlnbWlwc192ZWMnCi0JU2V0IGhhdmV2ZWNzICctZCBIQVZFX2Vjb2ZmX2JpZ192ZWMgLWQgSEFWRV9lY29mZl9saXR0bGVfdmVjIC1kIEhBVkVfYmZkX2VsZjMyX2JpZ21pcHNfdmVjJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9zaC1cT3B0aW9uLXgtaG1zLwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1zaC5jLm8gIntvfSJjb2ZmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBzaGNvZmZfdmVjCi0JU2V0IHNlbHZlY3MgJyZzaGNvZmZfdmVjLCZzaGxjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfc2hjb2ZmX3ZlYyAtZCBIQVZFX3NobGNvZmZfdmVjJwotRW5kIElmCi0KLVNldCB0YSBgZWNobyB7c2VsYXJjaHN9IHwgc2VkIC1lICdzLyZiZmRfL3tvfWNwdS0vZycgLWUgJ3MvX2FyY2gvLmMuby9nJ2AKLQotU2V0IHRkZWZhdWx0cyAiLWQgREVGQVVMVF9WRUNUT1I9e2RlZnZlY30gLWQgU0VMRUNUX1ZFQ1M9e3NlbHZlY3N9IC1kIFNFTEVDVF9BUkNISVRFQ1RVUkVTPXtzZWxhcmNoc30ge2hhdmV2ZWNzfSIKLQotRWNobyAnIyBGcm9tIG1wdy1jb25maWcuaW4nCQkJCSA+ICJ7b30ibWsudG1wCi1FY2hvICdXT1JEU0laRSA9IDMyJwkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJ0JGRF9NQUNISU5FUyA9ICcge3RhfQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnQkZEX0JBQ0tFTkRTID0gJyB7QkZEX0JBQ0tFTkRTfQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICdUREVGQVVMVFMgPSAnIHt0ZGVmYXVsdHN9CQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICdIREVQRklMRVMgPSAnCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnVERFUEZJTEVTID0gJwkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJyMgRW5kIGZyb20gbXB3LWNvbmZpZy5pbicJCQkJPj4gIntvfSJtay50bXAKLQotRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKLUVjaG8gJyNpbmNsdWRlICJtcHcuaCInCQkJCQk+PiAie299ImNvbmZpZy5uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29uZmlnLm5ldyAie299ImNvbmZpZy5oCi0KLSMgV2UgY2FuIG9ubHkgaGFuZGxlIDMyLWJpdCB0YXJnZXRzIHJpZ2h0IG5vdy4KLQotc2VkIC1lICdzL0BXT1JEU0laRUAvMzIvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9Ad29yZHNpemVALzMyLycgXE9wdGlvbi1kCi0gICAgLWUgInMvQFZFUlNJT05AL2BDYXRlbmF0ZSB7c3JjZGlyfVZFUlNJT05gLyIgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQC8wLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUXzY0X0JJVEAvLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUX1VfNjRfQklUQC8vJyBcT3B0aW9uLWQKLSAgICAtZSAncy9AQkZEX0hPU1RfNjRCSVRfTE9OR0AvMC8nIFxPcHRpb24tZAotICAgICJ7c3JjZGlyfSJiZmQtaW4yLmggPiJ7b30iYmZkLmgtbmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImJmZC5oLW5ldyAie299ImJmZC5oCi0KLXNlZCAtZSAncy9OTi8zMi9nJyAie3NyY2Rpcn0iZWxmeHgtdGFyZ2V0LmggPiJ7b30iZWxmMzItdGFyZ2V0LmgtbmV3Ci1Nb3ZlSWZDaGFuZ2UgIntvfSJlbGYzMi10YXJnZXQuaC1uZXcgIntvfSJlbGYzMi10YXJnZXQuaAotCi0jIFByZS1leHBhbmQgc29tZSBtYWNyb3MgaW4gY29mZnN3YXAuaCwgc28gTVBXIEMgZG9lc24ndCBjaG9rZS4KLQotc2VkIC1lICdzL14gIFBVVF9BT1VUSERSX1RTSVpFICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0RTSVpFICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0JTSVpFICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0VOVFJZICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgKC8gIGJmZF9oX3B1dF8zMiAoLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvXiAgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAie3NyY2Rpcn0iY29mZnN3YXAuaCA+IntvfSJjb2Zmc3dhcC5oLW5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb2Zmc3dhcC5oLW5ldyAie299ImNvZmZzd2FwLmgKZGlmZiAtLWdpdCBhL2JmZC9tcHctbWFrZS5zZWQgYi9iZmQvbXB3LW1ha2Uuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjQ2M2M3Li4wMDAwMDAwCi0tLSBhL2JmZC9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0byBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIFVuaXggQkZEIE1ha2VmaWxlIGludG8gTVBXIHN5bnRheC4KLQotIyBXaGFjayBvdXQgdW51c2VkIGhvc3QgYW5kIHRhcmdldCBkZWZpbmUgYml0cy4KLS9IREVGSU5FUy9zL0BIREVGSU5FU0AvLwotL1RERUZJTkVTL3MvQFRERUZJTkVTQC8vCi0KLSMgRml4IHBhdGhuYW1lcyB0byBpbmNsdWRlIGRpcmVjdG9yaWVzLgotL15JTkNESVIgPSAvcy9eSU5DRElSID0gLiokL0lOQ0RJUiA9ICJ7dG9wc3JjZGlyfSJpbmNsdWRlLwotL15DU0VBUkNIID0gL3MvJC8gLWkgIntJTkNESVJ9IjptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCi0KLSMgQ29tbWVudCBvdXQgc2V0dGluZyBvZiB2YXJzLCBjb25maWd1cmUgc2NyaXB0IHdpbGwgYWRkIHRoZXNlIGl0c2VsZi4KLS9eV09SRFNJWkUgPS9zL14vIy8KLSMgL15BTExfQkFDS0VORFMvcy9eLyMvCi0vXkJGRF9CQUNLRU5EUy9zL14vIy8KLS9eQkZEX01BQ0hJTkVTL3MvXi8jLwotL15UREVGQVVMVFMvcy9eLyMvCi0KLSMgUmVtb3ZlIGV4dHJhLCB1c2VsZXNzLCAiYWxsIi4KLS9eYWxsIFxcT3B0aW9uLWYgX29sZGVzdC8sL14kL2QKLQotIyBSZW1vdmUgdGhlIE1ha2VmaWxlIHJlYnVpbGQgcnVsZS4KLS9eTWFrZWZpbGUgLywvLS1yZWNoZWNrL2QKLQotIyBEb24ndCBkbyBhbnkgcmVjdXJzaXZlIHN1YmRpciBzdHVmZi4KLS8gc3ViZGlyX2RvL3Mve01BS0V9L251bGwtY29tbWFuZC8KLQotL0JGRF9IL3MvXntCRkRfSH0vI3tCRkRfSH0vCi0KLSMgQWRkIGV4cGxpY2l0IHNyY2RpciBwYXRocyB0byBzcGVjaWFsIGZpbGVzLgotL2NvbmZpZy5iZmQvcy8gY29uZmlnLmJmZC8gIntzfSJjb25maWcuYmZkL2cKLS90YXJnbWF0Y2guc2VkL3MvIHRhcmdtYXRjaC5zZWQvICJ7c30idGFyZ21hdGNoLnNlZC9nCi0KLSMgUG9pbnQgYXQgaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBhbHdheXMgaW4gdGhlIG9iamRpci4KLS9iZmQvcy8ie3N9ImJmZFwuaC8ie299ImJmZC5oL2cKLS9jb25maWcvcy8ie3N9ImNvbmZpZ1wuaC8ie299ImNvbmZpZy5oL2cKLS90YXJnbWF0Y2gvcy8ie3N9InRhcmdtYXRjaFwuaC8ie299InRhcmdtYXRjaC5oL2cKLS90YXJnbWF0Y2gvcy9edGFyZ21hdGNoXC5oLyJ7b30idGFyZ21hdGNoLmgvCi0vZWxmMzItdGFyZ2V0L3MvIntzfSJlbGYzMi10YXJnZXRcLmgvIntvfSJlbGYzMi10YXJnZXQuaC9nCi0vZWxmMzItdGFyZ2V0L3MvXmVsZjMyLXRhcmdldFwuaC8ie299ImVsZjMyLXRhcmdldC5oLwotL2VsZjY0LXRhcmdldC9zLyJ7c30iZWxmNjQtdGFyZ2V0XC5oLyJ7b30iZWxmNjQtdGFyZ2V0LmgvZwotL2VsZjY0LXRhcmdldC9zL15lbGY2NC10YXJnZXRcLmgvIntvfSJlbGY2NC10YXJnZXQuaC8KLQotLyJ7c30ie0lOQ0RJUn0vcy8ie3N9IntJTkNESVJ9LyJ7SU5DRElSfSIvZwotCi0vZGVwL3MvXC5kZXAvX19kZXAvZwotCi0jIFJlbW92aW5nIGR1cGxpY2F0ZXMgaXMgY29vbCBidXQgcHJlc2VudGx5IHVubmVjZXNzYXJ5LAotIyBzbyB3aGFjayB0aGlzIG91dC4KLS9eb2ZpbGVzIFxcT3B0aW9uLWYvLC9eJC9kCi0vb2ZpbGVzL3Mve09GSUxFU30gb2ZpbGVzL3tPRklMRVN9LwotL2VjaG8gb2ZpbGVzID0gL2QKLS9jYXQgb2ZpbGVzL3MvYGNhdCBvZmlsZXNgL3tPRklMRVN9LwotCi0jIE5vIGNvcmVmaWxlIHN1cHBvcnQuCi0vQ09SRUZJTEUvcy9AQ09SRUZJTEVALy8KLS9DT1JFRkxBRy9zL0BDT1JFRkxBR0AvLwotCi0jIE5vIFBJQyBmb29sZXJ5IGluIHRoaXMgZW52aXJvbm1lbnQuCi0vQEFMTExJQlNAL3MvQEFMTExJQlNAL3tUQVJHRVRMSUJ9LwotL0BQSUNMSVNUQC9zL0BQSUNMSVNUQC8vCi0vQFBJQ0ZMQUdAL3MvQFBJQ0ZMQUdALy8KLS9ee09GSUxFU30gXFxPcHRpb24tZiBzdGFtcC1waWNkaXIvLC9eJC9kCi0KLSMgUmVtb3ZlIHRoZSBwaWMgdHJpY2tlcnkgZnJvbSB0aGUgZGVmYXVsdCBidWlsZCBydWxlLgotL15cLmNcLm8gXFxPcHRpb24tZiAvLC9FbmQgSWYvY1wKLS5jLm8gXFxPcHRpb24tZiAuYwotCi0jIE1QVyBNYWtlIGRvZXNuJ3Qga25vdyBhYm91dCAkPC4KLS8ie299InRhcmdldHMuYy5vIFxcT3B0aW9uLWYgIntzfSJ0YXJnZXRzLmMgTWFrZWZpbGUvLC9eJC9jXAotIntvfSJ0YXJnZXRzLmMubyBcXE9wdGlvbi1mICJ7c30idGFyZ2V0cy5jIE1ha2VmaWxlXAotCXtDQ30gQERBU0hfQ19GTEFHQCB7QUxMX0NGTEFHU30ge1RERUZBVUxUU30gIntzfSJ0YXJnZXRzLmMgLW8gIntvfSJ0YXJnZXRzLmMubwotCi0vIntvfSJhcmNodXJlcy5jLm8gXFxPcHRpb24tZiAie3N9ImFyY2h1cmVzLmMgTWFrZWZpbGUvLC9eJC9jXAotIntvfSJhcmNodXJlcy5jLm8gXFxPcHRpb24tZiAie3N9ImFyY2h1cmVzLmMgTWFrZWZpbGVcCi0Je0NDfSBAREFTSF9DX0ZMQUdAIHtBTExfQ0ZMQUdTfSB7VERFRkFVTFRTfSAie3N9ImFyY2h1cmVzLmMgLW8gIntvfSJhcmNodXJlcy5jLm8KLQotIyBSZW1vdmUgdGhlIC5oIHJlYnVpbGRpbmcgcnVsZXMsIHdlIGRvbid0IGN1cnJlbnRseSBoYXZlIGEgZG9jIHN1YmRpciwKLSMgb3IgYSB3YXkgdG8gYnVpbGQgdGhlIHByb3RvdHlwZS1oYWNraW5nIHRvb2wgdGhhdCdzIGluIGl0LgotL14ie3NyY2Rpcn0iYmZkLWluMi5oIFxcT3B0aW9uLWYgLywvXiQvZAotL14ie3NyY2Rpcn0ibGliYmZkLmggXFxPcHRpb24tZiAvLC9eJC9kCi0vXiJ7c3JjZGlyfSJsaWJjb2ZmLmggXFxPcHRpb24tZiAvLC9eJC9kCmRpZmYgLS1naXQgYS9iZmQvbmV0YnNkLWNvcmUuYyBiL2JmZC9uZXRic2QtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjhjMmExLi4wMDAwMDAwCi0tLSBhL2JmZC9uZXRic2QtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qIEJGRCBiYWNrIGVuZCBmb3IgTmV0QlNEIHN0eWxlIGNvcmUgZmlsZXMKLSAgIENvcHlyaWdodCAxOTg4LCA4OSwgOTEsIDkyLCA5MywgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFBhdWwgS3JhbmVuYnVyZywgRVVSCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy9jb3JlLmg+Ci0KLS8qCi0gKiBGSVhNRTogT24gTmV0QlNEL3NwYXJjIENPUkVfRlBVX09GRlNFVCBzaG91bGQgYmUgKHNpemVvZihzdHJ1Y3QgdHJhcGZyYW1lKSkKLSAqLwotCi1zdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0IHsKLQlzdHJ1Y3QgY29yZSBjb3JlOwotfSAqcmF3cHRyOwotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCW5ldGJzZF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBjaGFyICoJCW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGludCAJCW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbgkJbmV0YnNkX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCQkJIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsIGJmZCAqZXhlY19iZmQpKTsKLXN0YXRpYyB2b2lkCQlzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogSGFuZGxlIE5ldEJTRC1zdHlsZSBjb3JlIGR1bXAgZmlsZS4gICovCi0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1uZXRic2RfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLQotewotCWludAkJaSwgdmFsLCBvZmZzZXQ7Ci0JYXNlY3Rpb24JKmFzZWN0LCAqYXNlY3QyOwotCXN0cnVjdCBjb3JlCWNvcmU7Ci0Jc3RydWN0IGNvcmVzZWcJY29yZXNlZzsKLQotCXZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSZjb3JlLCAxLCBzaXplb2YgY29yZSwgYWJmZCk7Ci0JaWYgKHZhbCAhPSBzaXplb2YgY29yZSkgewotCQkvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKENPUkVfR0VUTUFHSUMoY29yZSkgIT0gQ09SRU1BR0lDKSB7Ci0JCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJhd3B0ciA9IChzdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0ICopCi0JCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG5ldGJzZF9jb3JlX3N0cnVjdCkpOwotCWlmIChyYXdwdHIgPT0gTlVMTCkgewotCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyYXdwdHItPmNvcmUgPSBjb3JlOwotCWFiZmQtPnRkYXRhLm5ldGJzZF9jb3JlX2RhdGEgPSByYXdwdHI7Ci0KLQlvZmZzZXQgPSBjb3JlLmNfaGRyc2l6ZTsKLQlmb3IgKGkgPSAwOyBpIDwgY29yZS5jX25zZWc7IGkrKykgewotCi0JCWlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkJCWdvdG8gcHVudDsKLQotCQl2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmY29yZXNlZywgMSwgc2l6ZW9mIGNvcmVzZWcsIGFiZmQpOwotCQlpZiAodmFsICE9IHNpemVvZiBjb3Jlc2VnKSB7Ci0JCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JCQlnb3RvIHB1bnQ7Ci0JCX0KLQkJaWYgKENPUkVfR0VUTUFHSUMoY29yZXNlZykgIT0gQ09SRVNFR01BR0lDKSB7Ci0JCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCQkJZ290byBwdW50OwotCQl9Ci0KLQkJb2Zmc2V0ICs9IGNvcmUuY19zZWdoZHJzaXplOwotCi0JCWFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZihhc2VjdGlvbikpOwotCQlpZiAoYXNlY3QgPT0gTlVMTCkgewotCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJCWdvdG8gcHVudDsKLQkJfQotCi0JCWFzZWN0LT5fcmF3X3NpemUgPSBjb3Jlc2VnLmNfc2l6ZTsKLQkJYXNlY3QtPnZtYSA9IGNvcmVzZWcuY19hZGRyOwotCQlhc2VjdC0+ZmlsZXBvcyA9IG9mZnNldDsKLQkJYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JCWFzZWN0LT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7Ci0JCWFiZmQtPnNlY3Rpb25zID0gYXNlY3Q7Ci0JCWFiZmQtPnNlY3Rpb25fY291bnQrKzsKLQkJb2Zmc2V0ICs9IGNvcmVzZWcuY19zaXplOwotCi0JCXN3aXRjaCAoQ09SRV9HRVRGTEFHKGNvcmVzZWcpKSB7Ci0JCWNhc2UgQ09SRV9DUFU6Ci0JCQlhc2VjdC0+bmFtZSA9ICIucmVnIjsKLQkJCWFzZWN0LT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFM7Ci0jaWZkZWYgQ09SRV9GUFVfT0ZGU0VUCi0JCQkvKiBIYWNraXNoLi4uICovCi0JCQlhc2VjdC0+X3Jhd19zaXplID0gQ09SRV9GUFVfT0ZGU0VUOwotCQkJYXNlY3QyID0gKGFzZWN0aW9uICopYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkJCQkgc2l6ZW9mIChhc2VjdGlvbikpOwotCQkJaWYgKGFzZWN0MiA9PSBOVUxMKSB7Ci0JCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJCQlnb3RvIHB1bnQ7Ci0JCQl9Ci0JCQlhc2VjdDItPl9yYXdfc2l6ZSA9IGNvcmVzZWcuY19zaXplIC0gQ09SRV9GUFVfT0ZGU0VUOwotCQkJYXNlY3QyLT52bWEgPSAwOwotCQkJYXNlY3QyLT5maWxlcG9zID0gYXNlY3QtPmZpbGVwb3MgKyBDT1JFX0ZQVV9PRkZTRVQ7Ci0JCQlhc2VjdDItPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JCQlhc2VjdDItPm5leHQgPSBhYmZkLT5zZWN0aW9uczsKLQkJCWFzZWN0Mi0+bmFtZSA9ICIucmVnMiI7Ci0JCQlhc2VjdDItPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUzsKLQkJCWFiZmQtPnNlY3Rpb25zID0gYXNlY3QyOwotCQkJYWJmZC0+c2VjdGlvbl9jb3VudCsrOwotI2VuZGlmCi0KLQkJCWJyZWFrOwotCQljYXNlIENPUkVfREFUQToKLQkJCWFzZWN0LT5uYW1lID0gIi5kYXRhIjsKLQkJCWFzZWN0LT5mbGFncyA9IFNFQ19BTExPQytTRUNfTE9BRCtTRUNfSEFTX0NPTlRFTlRTOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09SRV9TVEFDSzoKLQkJCWFzZWN0LT5uYW1lID0gIi5zdGFjayI7Ci0JCQlhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MrU0VDX0xPQUQrU0VDX0hBU19DT05URU5UUzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0JcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLXB1bnQ6CXsKLQkJYXNlY3Rpb24JKmFuZXh0OwotCQlmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0OyBhc2VjdCA9IGFuZXh0KSB7Ci0JCQlhbmV4dCA9IGFzZWN0LT5uZXh0OwotCQkJZnJlZSgodm9pZCAqKWFzZWN0KTsKLQkJfQotCX0KLQlmcmVlICgodm9pZCAqKXJhd3B0cik7Ci0JYWJmZC0+dGRhdGEubmV0YnNkX2NvcmVfZGF0YSA9IE5VTEw7Ci0JYWJmZC0+c2VjdGlvbnMgPSBOVUxMOwotCWFiZmQtPnNlY3Rpb25fY291bnQgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY2hhcioKLW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotCWJmZCAqYWJmZDsKLXsKLSAvKnJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOyovCi0gIHJldHVybiBhYmZkLT50ZGF0YS5uZXRic2RfY29yZV9kYXRhLT5jb3JlLmNfbmFtZTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0JYmZkICphYmZkOwotewotICAvKnJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ki8KLSAgcmV0dXJuIGFiZmQtPnRkYXRhLm5ldGJzZF9jb3JlX2RhdGEtPmNvcmUuY19zaWdubzsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1uZXRic2RfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgbmV0YnNkX2NvcmVfdmVjID0KLSAgewotICAgICJuZXRic2QtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIG5ldGJzZF9jb3JlX2ZpbGVfcAkJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChuZXRic2QpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgTlVMTCwKLSAgICAKLSAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL25ldGJzZC5oIGIvYmZkL25ldGJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTQ4MmYwLi4wMDAwMDAwCi0tLSBhL2JmZC9uZXRic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZGVmaW5pdGlvbnMgdXNlZCBieSBhbGwgTmV0QlNEIHRhcmdldHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi1VU0EuICAqLwotCi0vKiBDaGVjayBmb3Igb3VyIG1hY2hpbmUgdHlwZSAocGFydCBvZiBtYWdpYyBudW1iZXIpLiAqLwotI2lmbmRlZiBNQUNIVFlQRV9PSwotI2RlZmluZSBNQUNIVFlQRV9PSyhtKSAoKG0pID09IERFRkFVTFRfTUlEIHx8IChtKSA9PSBNX1VOS05PV04pCi0jZW5kaWYKLQotLyogVGhpcyBpcyB0aGUgbm9ybWFsIGxvYWQgYWRkcmVzcyBmb3IgZXhlY3V0YWJsZXMuICovCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUgkJVEFSR0VUX1BBR0VfU0laRQotCi0vKiBOZXRCU0QgWk1BR0lDIGhhcyBpdHMgaGVhZGVyIGluIHRoZSB0ZXh0IHNlZ21lbnQuICAqLwotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpCTEKLQotLyogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeSB1c2luZyB0aGUgZmxhZ3MuICovCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAJKE5fRFlOQU1JQyh4KSkKLQotLyogV2UgaGF2ZSA2IGJpdHMgb2YgZmxhZ3MgYW5kIDEwIGJpdHMgb2YgbWFjaGluZSBJRC4gICovCi0jZGVmaW5lIE5fTUFDSFRZUEUoZXhlYykgXAotCSgoZW51bSBtYWNoaW5lX3R5cGUpKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4MDNmZikpCi0jZGVmaW5lIE5fRkxBR1MoZXhlYykgXAotCSgoKGV4ZWMpLmFfaW5mbyA+PiAyNikgJiAweDNmKQotCi0jZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCi0JKChleGVjKS5hX2luZm8gPSAoKG1hZ2ljKSAmIDB4ZmZmZikgXAotCSB8ICgoKGludCkodHlwZSkgJiAweDNmZikgPDwgMTYpIFwKLQkgfCAoKChmbGFncykgJiAweDNmKSA8PCAyNCkpCi0jZGVmaW5lIE5fU0VUX01BQ0hUWVBFKGV4ZWMsIG1hY2h0eXBlKSBcCi0JKChleGVjKS5hX2luZm8gPSBcCi0gICAgICAgICAoKGV4ZWMpLmFfaW5mbyAmIDB4ZmIwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweDNmZikgPDwgMTYpKQotI2RlZmluZSBOX1NFVF9GTEFHUyhleGVjLCBmbGFncykgXAotCSgoZXhlYykuYV9pbmZvID0gXAotCSAoKGV4ZWMpLmFfaW5mbyAmIDB4MDNmZmZmZmYpIHwgKChmbGFncyAmIDB4MDNmKSA8PCAyNikpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLS8qIE9uIE5ldEJTRCwgdGhlIG1hZ2ljIG51bWJlciBpcyBhbHdheXMgaW4gbnRvaGwncyAibmV0d29yayIgKGJpZy1lbmRpYW4pCi0gICBmb3JtYXQuICAqLwotI2RlZmluZSBTV0FQX01BR0lDKGV4dCkgYmZkX2dldGIzMiAoZXh0KQotCi0vKiBPbiBOZXRCU0QsIHRoZSBlbnRyeSBwb2ludCBtYXkgYmUgdGFrZW4gdG8gYmUgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0Ci0gICBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzIDEKLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotc3RhdGljIGJvb2xlYW4gTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSNkZWZpbmUgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgMQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUuCi0gICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUKLSAgIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1NWSh3cml0ZV9vYmplY3RfY29udGVudHMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAvKiBXZSBtdXN0IG1ha2UgY2VydGFpbiB0aGF0IHRoZSBtYWdpYyBudW1iZXIgaGFzIGJlZW4gc2V0LiAgVGhpcwotICAgICB3aWxsIG5vcm1hbGx5IGhhdmUgYmVlbiBkb25lIGJ5IHNldF9zZWN0aW9uX2NvbnRlbnRzLCBidXQgb25seSBpZgotICAgICB0aGVyZSBhY3R1YWxseSBhcmUgc29tZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsKLSAgICAgIGZpbGVfcHRyIHRleHRfZW5kOwotCi0gICAgICBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsKLSAgICB9Ci0KLSNpZiBDSE9PU0VfUkVMT0NfU0laRQotICBDSE9PU0VfUkVMT0NfU0laRShhYmZkKTsKLSNlbHNlCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotI2VuZGlmCi0KLSAgLyogTWFnaWMgbnVtYmVyLCBtYWVzdHJvLCBwbGVhc2UhICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaChhYmZkKSkgewotICBjYXNlIERFRkFVTFRfQVJDSDoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIERFRkFVTFRfTUlEKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fVU5LTk9XTik7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBUaGUgTmV0QlNEIG1hZ2ljIG51bWJlciBpcyBhbHdheXMgYmlnLWVuZGlhbiAqLwotI2lmbmRlZiBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0gIC8qIFhYWCBhcmVuJ3QgdGhlcmUgYW55IG1hY3JvIHRvIGNoYW5nZSBieXRlb3JkZXIgb2YgYSB3b3JkIGluZGVwZW5kZW50IG9mCi0gICAgIHRoZSBob3N0J3Mgb3IgdGFyZ2V0J3MgZW5kaWFuZXNzZXM/ICAqLwotICBleGVjcC0+YV9pbmZvCi0gICAgPSAoZXhlY3AtPmFfaW5mbyAmIDB4ZmYpIDw8IDI0IHwgKGV4ZWNwLT5hX2luZm8gJiAweGZmMDApIDw8IDgKLSAgICAgIHwgKGV4ZWNwLT5hX2luZm8gJiAweGZmMDAwMCkgPj4gOCB8IChleGVjcC0+YV9pbmZvICYgMHhmZjAwMDAwMCkgPj4gMjQ7Ci0jZW5kaWYKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9uZXdzb3MzLmMgYi9iZmQvbmV3c29zMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM3YTc1Li4wMDAwMDAwCi0tLSBhL2JmZC9uZXdzb3MzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ld3NPUzMgKFNvbnksIDY4aykgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQk0MDk2Ci0jZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2RlZmluZSBNWShPUCkgQ0FUKG5ld3NvczNfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1uZXdzb3MzIgotI2RlZmluZSBFTlRSWV9DQU5fQkVfWkVSTwotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMCAvKiBBdm9pZHMgd2FybmluZyB3aGVuIGNvbXBpbGVkIHdpdGggLVdhbGwuICovCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9tNjhrCi0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG0tdGFyZ2V0LmggYi9iZmQvbmxtLXRhcmdldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzFlMjU1Li4wMDAwMDAwCi0tLSBhL2JmZC9ubG0tdGFyZ2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyogVGFyZ2V0IGRlZmluaXRpb25zIGZvciAzMi82NC1iaXQgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgbmxtX2NvcmVfZmlsZV9wIF9iZmRfZHVtbXlfdGFyZ2V0Ci0KLSNkZWZpbmUgbmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQgbmxtTkFNRShnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotI2RlZmluZSBubG1fZ2V0X3N5bXRhYiBubG1OQU1FKGdldF9zeW10YWIpCi0jZGVmaW5lIG5sbV9tYWtlX2VtcHR5X3N5bWJvbCBubG1OQU1FKG1ha2VfZW1wdHlfc3ltYm9sKQotI2RlZmluZSBubG1fcHJpbnRfc3ltYm9sIG5sbU5BTUUocHJpbnRfc3ltYm9sKQotI2RlZmluZSBubG1fZ2V0X3N5bWJvbF9pbmZvIG5sbU5BTUUoZ2V0X3N5bWJvbF9pbmZvKQotI2RlZmluZSBubG1fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBubG1fZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIG5sbV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBubG1fYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBubG1fcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBubG1fbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgbmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCBubG1OQU1FKGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSNkZWZpbmUgbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyBubG1OQU1FKGNhbm9uaWNhbGl6ZV9yZWxvYykKLSNkZWZpbmUgbmxtX2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cyBubG1OQU1FKHNldF9zZWN0aW9uX2NvbnRlbnRzKQotCi0jZGVmaW5lIG5sbV9zaXplb2ZfaGVhZGVycyBfYmZkX25vbGlua19zaXplb2ZfaGVhZGVycwotI2RlZmluZSBubG1fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBubG1fYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBubG1fYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIG5sbV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBubG1fYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgbmxtX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIG5sbV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZXZlcnl0aGluZyB0aGF0IEJGRCBrbm93cyBhYm91dCBhIHRhcmdldC4KLSAgIEl0IGluY2x1ZGVzIHRoaW5ncyBsaWtlIGl0cyBieXRlIG9yZGVyLCBuYW1lLCB3aGF0IHJvdXRpbmVzIHRvIGNhbGwKLSAgIHRvIGRvIHZhcmlvdXMgb3BlcmF0aW9ucywgZXRjLiAgRXZlcnkgQkZEIHBvaW50cyB0byBhIHRhcmdldCBzdHJ1Y3R1cmUKLSAgIHdpdGggaXRzICJ4dmVjIiBtZW1iZXIuCi0KLSAgIFRoZXJlIGFyZSB0d28gc3VjaCBzdHJ1Y3R1cmVzIGhlcmU6ICBvbmUgZm9yIGJpZy1lbmRpYW4gbWFjaGluZXMgYW5kCi0gICBvbmUgZm9yIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMuICAgKi8KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgdXNlIHdoZW4gaW5pdGlhbGlzaW5nIGFsdGVybmF0aXZlX3RhcmdldCBmaWVsZC4gICovCi0jaWZkZWYgVEFSR0VUX0xJVFRMRV9TWU0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9MSVRUTEVfU1lNOwotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfQklHX1NZTQotY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfQklHX1NZTSA9Ci17Ci0gIC8qIG5hbWU6IGlkZW50aWZ5IGtpbmQgb2YgdGFyZ2V0ICovCi0gIFRBUkdFVF9CSUdfTkFNRSwKLQotICAvKiBmbGF2b3VyOiBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgZmlsZSAqLwotICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAotCi0gIC8qIGJ5dGVvcmRlcjogZGF0YSBpcyBiaWcgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fQklHLAotCi0gIC8qIGhlYWRlcl9ieXRlb3JkZXI6IGhlYWRlciBpcyBhbHNvIGJpZyBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9CSUcsCi0KLSAgLyogb2JqZWN0X2ZsYWdzOiBtYXNrIG9mIGFsbCBmaWxlIGZsYWdzICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTCi0gICB8IFdQX1RFWFQpLAotICAKLSAgLyogc2VjdGlvbl9mbGFnczogbWFzayBvZiBhbGwgc2VjdGlvbiBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX1JFQURPTkxZIHwKLSAgIFNFQ19DT0RFIHwgU0VDX0RBVEEpLCAKLQotICAgLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAotICAgICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCi0gICAwLAotCi0gIC8qIGFyX3BhZF9jaGFyOiBwYWQgY2hhcmFjdGVyIGZvciBmaWxlbmFtZXMgd2l0aGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBOTE0sIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kL29yIG9zIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlICovCi0gICcvJywKLQotICAvKiBhcl9tYXhfbmFtZWxlbjogbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggTkxNLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlLiAgVGhpcyB2YWx1ZSBpcwotICAgICBhIFdBRyAod2lsZCBhKiogZ3Vlc3MpICovCi0gIDE1LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGRhdGEgc2VjdGlvbnMgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXJzICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotCi0gIC8qIGJmZF9jaGVja19mb3JtYXQ6IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQgKi8KLSAgeyBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgbmxtTkFNRShvYmplY3RfcCksCQkvKiBhc3NlbWJsZXIvbGlua2VyIG91dHB1dCAob2JqZWN0IGZpbGUpICovCi0gICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLAkvKiBhbiBhcmNoaXZlICovCi0gICAgbmxtX2NvcmVfZmlsZV9wCQkvKiBhIGNvcmUgZmlsZSAqLwotICB9LAotCi0gIC8qIGJmZF9zZXRfZm9ybWF0OiBzZXQgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBubG1fbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UKLSAgfSwKLQotICAvKiBiZmRfd3JpdGVfY29udGVudHM6IHdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIG5sbU5BTUUod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSwKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0KLSAgLyogSW5pdGlhbGl6ZSBhIGp1bXAgdGFibGUgd2l0aCB0aGUgc3RhbmRhcmQgbWFjcm8uICBBbGwgbmFtZXMgc3RhcnQgd2l0aAotICAgICAibmxtIiAqLwotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIC8qIEFsdGVybmF0aXZlIGVuZGlhbiB0YXJnZXQuICAqLwotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi0gICYgVEFSR0VUX0xJVFRMRV9TWU0sCi0jZWxzZQotICBOVUxMLAotI2VuZGlmCi0gIAotICAvKiBiYWNrZW5kX2RhdGE6ICovCi0gIChQVFIpIFRBUkdFVF9CQUNLRU5EX0RBVEEKLX07Ci0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi1jb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9MSVRUTEVfU1lNID0KLXsKLSAgLyogbmFtZTogaWRlbnRpZnkga2luZCBvZiB0YXJnZXQgKi8KLSAgVEFSR0VUX0xJVFRMRV9OQU1FLAotCi0gIC8qIGZsYXZvdXI6IGdlbmVyYWwgaW5kaWNhdGlvbiBhYm91dCBmaWxlICovCi0gIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIsCi0KLSAgLyogYnl0ZW9yZGVyOiBkYXRhIGlzIGxpdHRsZSBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCi0KLSAgLyogaGVhZGVyX2J5dGVvcmRlcjogaGVhZGVyIGlzIGFsc28gbGl0dGxlIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwKLQotICAvKiBvYmplY3RfZmxhZ3M6IG1hc2sgb2YgYWxsIGZpbGUgZmxhZ3MgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFMKLSAgIHwgV1BfVEVYVCksCi0gIAotICAvKiBzZWN0aW9uX2ZsYWdzOiBtYXNrIG9mIGFsbCBzZWN0aW9uIGZsYWdzICovCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfUkVBRE9OTFkgfAotICAgU0VDX0RBVEEpLCAKLQotICAgLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAotICAgICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCi0gICAwLAotCi0gIC8qIGFyX3BhZF9jaGFyOiBwYWQgY2hhcmFjdGVyIGZvciBmaWxlbmFtZXMgd2l0aGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBOTE0sIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kL29yIG9zIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlICovCi0gICcvJywKLQotICAvKiBhcl9tYXhfbmFtZWxlbjogbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggTkxNLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlLiAgVGhpcyB2YWx1ZSBpcwotICAgICBhIFdBRyAod2lsZCBhKiogZ3Vlc3MpICovCi0gIDE1LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGRhdGEgc2VjdGlvbnMgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXJzICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIC8qIGJmZF9jaGVja19mb3JtYXQ6IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQgKi8KLSAgeyBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgbmxtTkFNRShvYmplY3RfcCksCQkvKiBhc3NlbWJsZXIvbGlua2VyIG91dHB1dCAob2JqZWN0IGZpbGUpICovCi0gICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLAkvKiBhbiBhcmNoaXZlICovCi0gICAgbmxtX2NvcmVfZmlsZV9wCQkvKiBhIGNvcmUgZmlsZSAqLwotICB9LAotCi0gIC8qIGJmZF9zZXRfZm9ybWF0OiBzZXQgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBubG1fbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UKLSAgfSwKLQotICAvKiBiZmRfd3JpdGVfY29udGVudHM6IHdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIG5sbU5BTUUod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSwKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0KLSAgLyogSW5pdGlhbGl6ZSBhIGp1bXAgdGFibGUgd2l0aCB0aGUgc3RhbmRhcmQgbWFjcm8uICBBbGwgbmFtZXMgc3RhcnQgd2l0aAotICAgICAibmxtIiAqLwotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIC8qIEFsdGVybmF0aXZlIGVuZGlhbiB0YXJnZXQuICAqLwotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi0gICYgVEFSR0VUX0JJR19TWU0sCi0jZWxzZQotICBOVUxMLAotI2VuZGlmCi0gIAotICAvKiBiYWNrZW5kX2RhdGE6ICovCi0gIChQVFIpIFRBUkdFVF9CQUNLRU5EX0RBVEEKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9ubG0uYyBiL2JmZC9ubG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljNmJhYS4uMDAwMDAwMAotLS0gYS9iZmQvbmxtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLS8qIE1ha2UgYW4gTkxNIG9iamVjdC4gIFdlIGp1c3QgbmVlZCB0byBhbGxvY2F0ZSB0aGUgYmFja2VuZAotICAgaW5mb3JtYXRpb24uICAqLwotCi1ib29sZWFuCi1ubG1fbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIG5sbV90ZGF0YSAoYWJmZCkgPQotICAgIChzdHJ1Y3QgbmxtX29ial90ZGF0YSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBubG1fb2JqX3RkYXRhKSk7Ci0gIGlmIChubG1fdGRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgaWYgKG5sbV9hcmNoaXRlY3R1cmUgKGFiZmQpICE9IGJmZF9hcmNoX3Vua25vd24pCi0gICAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgbmxtX2FyY2hpdGVjdHVyZSAoYWJmZCksCi0JCQkgICAgICAgbmxtX21hY2hpbmUgKGFiZmQpKTsKLQotICAvKiBzaW5jZSBldmVyeXRoaW5nIGlzIGRvbmUgYXQgY2xvc2UgdGltZSwgZG8gd2UgbmVlZCBhbnkgaW5pdGlhbGl6YXRpb24/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+bmFtZSk7Ci0gIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkgIT0gc2l6ZW9mKGJmZF9ieXRlKSkKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgY291bnQsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChubG1faTM4Nl93cml0ZV9pbXBvcnQgKGFiZmQsIHJlbG9jc1tpXS5zZWMsCi0JCQkJIHJlbG9jc1tpXS5yZWwpID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpbmNsdWRlICJubG1zd2FwLmgiCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSBubG0zMl9pMzg2X2JhY2tlbmQgPQotewotICAiTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGVcMDMyIiwKLSAgc2l6ZW9mIChObG0zMl9pMzg2X0V4dGVybmFsX0ZpeGVkX0hlYWRlciksCi0gIDAsCS8qIG9wdGlvbmFsX3ByZWZpeF9zaXplICovCi0gIGJmZF9hcmNoX2kzODYsCi0gIDAsCi0gIGZhbHNlLAotICAwLAkvKiBiYWNrZW5kX29iamVjdF9wICovCi0gIDAsCS8qIHdyaXRlX3ByZWZpeF9mdW5jICovCi0gIG5sbV9pMzg2X3JlYWRfcmVsb2MsCi0gIG5sbV9pMzg2X21hbmdsZV9yZWxvY3MsCi0gIG5sbV9pMzg2X3JlYWRfaW1wb3J0LAotICBubG1faTM4Nl93cml0ZV9pbXBvcnQsCi0gIDAsCS8qIHNldF9wdWJsaWNfc2VjdGlvbiAqLwotICAwLAkvKiBnZXRfcHVibGljX29mZnNldCAqLwotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4sCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQsCi0gIG5sbV9pMzg2X3dyaXRlX2V4dGVybmFsLAotICAwLAkvKiB3cml0ZV9leHBvcnQgKi8KLX07Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkibmxtMzItaTM4NiIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCW5sbU5BTUUoaTM4Nl92ZWMpCi0jZGVmaW5lIFRBUkdFVF9CQUNLRU5EX0RBVEEJCSZubG0zMl9pMzg2X2JhY2tlbmQKLQotI2luY2x1ZGUgIm5sbS10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG0zMi1wcGMuYyBiL2JmZC9ubG0zMi1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmNDgzNC4uMDAwMDAwMAotLS0gYS9iZmQvbmxtMzItcHBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ1ICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIDMyLWJpdCBQb3dlclBDIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBUaGUgZm9ybWF0IG9mIGEgUG93ZXJQQyBOTE0gY2hhbmdlZC4gIERlZmluZSBPTERGT1JNQVQgdG8gZ2V0IHRoZQotICAgb2xkIGZvcm1hdC4gICovCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0KLSNpbmNsdWRlICJubG0vcHBjLWV4dC5oIgotI2RlZmluZSBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCU5sbTMyX3Bvd2VycGNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCi0KLSNpbmNsdWRlICJsaWJubG0uaCIKLQotI2lmZGVmIE9MREZPUk1BVAotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfYmFja2VuZF9vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfcHJlZml4Ci0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfcmVhZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKiwgYXNlY3Rpb24gKiosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfbWFuZ2xlX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfdm1hLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY19yZWFkX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotCi0jaWZkZWYgT0xERk9STUFUCi1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY193cml0ZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqLCBpbnQpKTsKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY193cml0ZV9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsIGFzeW1ib2wgKiwgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikpOwotCi0jaWZuZGVmIE9MREZPUk1BVAotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfc2V0X3B1YmxpY19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBubG1fcG93ZXJwY19nZXRfcHVibGljX29mZnNldAotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0jZW5kaWYKLQwKLSNpZmRlZiBPTERGT1JNQVQKLQotLyogVGhlIHByZWZpeCBoZWFkZXIgaXMgb25seSB1c2VkIGluIHRoZSBvbGQgZm9ybWF0LiAgKi8KLQotLyogUG93ZXJQQyBOTE0ncyBoYXZlIGEgcHJlZml4IGhlYWRlciBiZWZvcmUgdGhlIHN0YW5kYXJkIE5MTS4gIFRoaXMKLSAgIGZ1bmN0aW9uIHJlYWRzIGl0IGluLCB2ZXJpZmllcyB0aGUgdmVyc2lvbiwgYW5kIHNlZWtzIHRoZSBiZmQgdG8KLSAgIHRoZSBsb2NhdGlvbiBiZWZvcmUgdGhlIHJlZ3VsYXIgTkxNIGhlYWRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19iYWNrZW5kX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIgczsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZzLCBzaXplb2YgcywgMSwgYWJmZCkgIT0gc2l6ZW9mIHMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChtZW1jbXAgKHMuc2lnbmF0dXJlLCBOTE0zMl9QT1dFUlBDX1NJR05BVFVSRSwgc2l6ZW9mIHMuc2lnbmF0dXJlKSAhPSAwCi0gICAgICB8fCBiZmRfaF9nZXRfMzIgKGFiZmQsIHMuaGVhZGVyVmVyc2lvbikgIT0gTkxNMzJfUE9XRVJQQ19IRUFERVJfVkVSU0lPTikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgcHJlZml4LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3dyaXRlX3ByZWZpeCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9wcmVmaXhfaGVhZGVyIHM7Ci0KLSAgbWVtc2V0ICgmcywgMCwgc2l6ZW9mIHMpOwotICBtZW1jcHkgKHMuc2lnbmF0dXJlLCBOTE0zMl9QT1dFUlBDX1NJR05BVFVSRSwgc2l6ZW9mIHMuc2lnbmF0dXJlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgTkxNMzJfUE9XRVJQQ19IRUFERVJfVkVSU0lPTiwgcy5oZWFkZXJWZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgMCwgcy5vcmlnaW5zKTsKLQotICAvKiBGSVhNRTogV2hhdCBzaG91bGQgd2UgZG8gYWJvdXQgdGhlIGRhdGU/ICAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZzLCBzaXplb2YgcywgMSwgYWJmZCkgIT0gc2l6ZW9mIHMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgLyogT0xERk9STUFUICovCi0MCi0jaWZuZGVmIE9MREZPUk1BVAotCi0vKiBUaGVyZSBpcyBvbmx5IG9uZSB0eXBlIG9mIHJlbG9jIGluIGEgUG93ZXJQQyBOTE0uICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG1fcG93ZXJwY19ob3d0byA9Ci0gIEhPV1RPICgwLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiMzIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogUmVhZCBhIFBvd2VyUEMgTkxNIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgc2VjcCwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBiZmRfYnl0ZSB0ZW1wWzRdOwotICBiZmRfdm1hIHZhbDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoYmZkX3JlYWQgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRlbXApOwotCi0gIC8qIFRoZSB2YWx1ZSBpcyBhIHdvcmQgb2Zmc2V0IGludG8gZWl0aGVyIHRoZSBjb2RlIG9yIGRhdGEgc2VnbWVudC4KLSAgICAgVGhpcyBpcyB0aGUgbG9jYXRpb24gd2hpY2ggbmVlZHMgdG8gYmUgYWRqdXN0ZWQuCi0KLSAgICAgVGhlIGhpZ2ggYml0IGlzIDAgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldCBpbnRvIHRoZSBkYXRhCi0gICAgIHNlZ21lbnQsIG9yIDEgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldCBpbnRvIHRoZSB0ZXh0IHNlZ21lbnQuCi0KLSAgICAgSWYgdGhpcyBpcyBhIHJlbG9jYXRpb24gZml4dXAgcmF0aGVyIHRoYW4gYW4gaW1wb3J0ZWQgc3ltYm9sICh0aGUKLSAgICAgc3ltIGFyZ3VtZW50IGlzIE5VTEwpLCB0aGVuIHRoZSBzZWNvbmQgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgMAotICAgICBpZiB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWdtZW50IHNob3VsZCBiZSBhZGRlZCB0byB0aGUKLSAgICAgbG9jYXRpb24gYWRkcmVzc2VkIGJ5IHRoZSB2YWx1ZSwgb3IgMSBpZiB0aGUgYWRkcmVzcyBvZiB0aGUgdGV4dAotICAgICBzZWdtZW50IHNob3VsZCBiZSBhZGRlZC4KLQotICAgICBJZiB0aGlzIGlzIGFuIGltcG9ydGVkIHN5bWJvbCwgdGhlIHNlY29uZCBtb3N0IHNpZ25pZmljYW50IGJpdCBpcwotICAgICBub3QgdXNlZCBhbmQgbXVzdCBiZSAwLiAgKi8KLQotICBpZiAoKHZhbCAmIE5MTV9ISUJJVCkgPT0gMCkKLSAgICBuYW1lID0gTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG5hbWUgPSBOTE1fQ09ERV9OQU1FOwotICAgICAgdmFsICY9fiBOTE1fSElCSVQ7Ci0gICAgfQotICAqc2VjcCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQotICBpZiAoc3ltID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCh2YWwgJiAoTkxNX0hJQklUID4+IDEpKSA9PSAwKQotCW5hbWUgPSBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FOwotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSBOTE1fQ09ERV9OQU1FOwotCSAgdmFsICY9fiAoTkxNX0hJQklUID4+IDEpOwotCX0KLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSktPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotICByZWwtPmhvd3RvID0gJm5sbV9wb3dlcnBjX2hvd3RvOwotCi0gIHJlbC0+YWRkcmVzcyA9IHZhbCA8PCAyOwotICByZWwtPmFkZGVuZCA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbHNlIC8qIE9MREZPUk1BVCAqLwotCi0vKiBUaGlzIHJlbG9jIGhhbmRsaW5nIGlzIG9ubHkgYXBwbGljYWJsZSB0byB0aGUgb2xkIGZvcm1hdC4gICovCi0KLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgUG93ZXJQQyBOTE1zIHVzZSBYQ09GRgotICAgcmVsb2MgdHlwZXMsIGFuZCBJIGhhdmUganVzdCBjb3BpZWQgdGhlIFhDT0ZGIHJlbG9jIHRhYmxlIGhlcmUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG1fcG93ZXJwY19ob3d0b190YWJsZVtdID0KLXsKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbiwgYnV0IHN0b3JlIG5lZ2F0aXZlIHZhbHVlLiAgKi8KLSAgSE9XVE8gKDEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIC0yLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9ORUciLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiAxNiBiaXQgVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RPQyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSSBkb24ndCByZWFsbHkga25vdyB3aGF0IHRoaXMgaXMuICAqLwotICBIT1dUTyAoNCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlRCIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEV4dGVybmFsIFRPQyByZWxhdGl2ZSBzeW1ib2wuICAqLwotICBIT1dUTyAoNSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfR0wiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBMb2NhbCBUT0MgcmVsYXRpdmUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKDYsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RDTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyA3IH0sCi0gIAotICAvKiBOb24gbW9kaWZpYWJsZSBhYnNvbHV0ZSBicmFuY2guICAqLwotICBIT1dUTyAoOCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQkEiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDkgfSwKLQotICAvKiBOb24gbW9kaWZpYWJsZSByZWxhdGl2ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHhhLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9CUiIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgMHhiIH0sCi0KLSAgLyogSW5kaXJlY3QgbG9hZC4gICovCi0gIEhPV1RPICgweGMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JMIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTG9hZCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKDB4ZCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkxBIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDB4ZSB9LAotICAKLSAgLyogTm9uLXJlbG9jYXRpbmcgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKDB4ZiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVGIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsICAgICAJICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgMHgxMCB9LAotICB7IDB4MTEgfSwKLSAgCi0gIC8qIFRPQyByZWxhdGl2ZSBpbmRpcmVjdCBsb2FkLiAgKi8KLSAgSE9XVE8gKDB4MTIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RSTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogVE9DIHJlbGF0aXZlIGxvYWQgYWRkcmVzcy4gICovCi0gIEhPV1RPICgweDEzLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UUkxBIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4MTQsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JSVEJJIiwgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGFic29sdXRlIGJyYW5jaC4gICovCi0gIEhPV1RPICgweDE1LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SUlRCQSIsICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBjYWxsIGFic29sdXRlIGluZGlyZWN0LiAgKi8KLSAgSE9XVE8gKDB4MTYsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0NBSSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBjYWxsIHJlbGF0aXZlLiAgKi8KLSAgSE9XVE8gKDB4MTcsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxOCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJBIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDE5LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SQkFDIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIHJlbGF0aXZlLiAgKi8KLSAgSE9XVE8gKDB4MWEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MWIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSkgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotI2RlZmluZSBIT1dUT19DT1VOVCAoc2l6ZW9mIG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlCQlcCi0JCSAgICAgLyBzaXplb2YgbmxtX3Bvd2VycGNfaG93dG9fdGFibGVbMF0pCi0KLS8qIFJlYWQgYSBQb3dlclBDIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcmVsb2MgZXh0OwotICBiZmRfdm1hIGxfdmFkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgbF9zeW1uZHg7Ci0gIGludCBsX3J0eXBlOwotICBpbnQgbF9yc2Vjbm07Ci0gIGFzZWN0aW9uICpjb2RlX3NlYywgKmRhdGFfc2VjLCAqYnNzX3NlYzsKLQotICAvKiBSZWFkIHRoZSByZWxvYyBmcm9tIHRoZSBmaWxlLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgmZXh0LCBzaXplb2YgZXh0LCAxLCBhYmZkKSAhPSBzaXplb2YgZXh0KQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTd2FwIGluIHRoZSBmaWVsZHMuICAqLwotICBsX3ZhZGRyID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQubF92YWRkcik7Ci0gIGxfc3ltbmR4ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQubF9zeW1uZHgpOwotICBsX3J0eXBlID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQubF9ydHlwZSk7Ci0gIGxfcnNlY25tID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQubF9yc2Vjbm0pOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbnMgbm93LCBmb3IgY29udmVuaWVuY2UuICAqLwotICBjb2RlX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgZGF0YV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGJzc19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLQotICAvKiBXb3JrIG91dCB0aGUgYXJlbGVudCBmaWVsZHMuICAqLwotICBpZiAoc3ltICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhbiBpbXBvcnQuICBzeW1fcHRyX3B0ciBpcyBmaWxsZWQgaW4gYnkKLQkgbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYy4gICovCi0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBpZiAobF9zeW1uZHggPT0gMCkKLQlzZWMgPSBjb2RlX3NlYzsKLSAgICAgIGVsc2UgaWYgKGxfc3ltbmR4ID09IDEpCi0Jc2VjID0gZGF0YV9zZWM7Ci0gICAgICBlbHNlIGlmIChsX3N5bW5keCA9PSAyKQotCXNlYyA9IGJzc19zZWM7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gc2VjLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLSAgcmVsLT5hZGRlbmQgPSAwOwotCi0gIEJGRF9BU1NFUlQgKChsX3J0eXBlICYgMHhmZikgPCBIT1dUT19DT1VOVCk7Ci0KLSAgcmVsLT5ob3d0byA9IG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlICsgKGxfcnR5cGUgJiAweGZmKTsKLQotICBCRkRfQVNTRVJUIChyZWwtPmhvd3RvLT5uYW1lICE9IE5VTEwKLQkgICAgICAmJiAoKGxfcnR5cGUgJiAweDgwMDApICE9IDAKLQkJICA/IChyZWwtPmhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdwotCQkgICAgID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLQkJICA6IChyZWwtPmhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdwotCQkgICAgID09IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkKSkKLQkgICAgICAmJiAoKGxfcnR5cGUgPj4gOCkgJiAweDFmKSA9PSByZWwtPmhvd3RvLT5iaXRzaXplIC0gMSk7Ci0KLSAgaWYgKGxfcnNlY25tID09IDApCi0gICAgKnNlY3AgPSBjb2RlX3NlYzsKLSAgZWxzZSBpZiAobF9yc2Vjbm0gPT0gMSkKLSAgICB7Ci0gICAgICAqc2VjcCA9IGRhdGFfc2VjOwotICAgICAgbF92YWRkciAtPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJlbC0+YWRkcmVzcyA9IGxfdmFkZHI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZiAvKiBPTERGT1JNQVQgKi8KLQotLyogTWFuZ2xlIFBvd2VyUEMgTkxNIHJlbG9jcyBmb3Igb3V0cHV0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX21hbmdsZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIFBvd2VyUEMgTkxNIGltcG9ydCByZWNvcmQgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3JlYWRfaW1wb3J0IChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLXsKLSAgc3RydWN0IG5sbV9yZWxlbnQgKm5sbV9yZWxvY3M7CS8qIHJlbG9jYXRpb24gcmVjb3JkcyBmb3Igc3ltYm9sICovCi0gIGJmZF9zaXplX3R5cGUgcmNvdW50OwkJCS8qIG51bWJlciBvZiByZWxvY3MgKi8KLSAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CS8qIHRlbXBvcmFyeSAzMi1iaXQgdmFsdWUgKi8KLSAgdW5zaWduZWQgY2hhciBzeW1sZW5ndGg7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIG5hbWUgKi8KLSAgY2hhciAqbmFtZTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZzeW1sZW5ndGgsIHNpemVvZiAoc3ltbGVuZ3RoKSwgMSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3ltbGVuZ3RoKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgc3ltIC0+IHN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3JlYWQgKG5hbWUsIHN5bWxlbmd0aCwgMSwgYWJmZCkgIT0gc3ltbGVuZ3RoKQotICAgIHJldHVybiAoZmFsc2UpOwotICBuYW1lW3N5bWxlbmd0aF0gPSAnXDAnOwotICBzeW0gLT4gc3ltYm9sLm5hbWUgPSBuYW1lOwotICBzeW0gLT4gc3ltYm9sLmZsYWdzID0gMDsKLSAgc3ltIC0+IHN5bWJvbC52YWx1ZSA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgcmNvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKLSAgbmxtX3JlbG9jcyA9ICgoc3RydWN0IG5sbV9yZWxlbnQgKikKLQkJYmZkX2FsbG9jIChhYmZkLCByY291bnQgKiBzaXplb2YgKHN0cnVjdCBubG1fcmVsZW50KSkpOwotICBpZiAobmxtX3JlbG9jcyA9PSAoc3RydWN0IG5sbV9yZWxlbnQgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bSAtPiByZWxvY3MgPSBubG1fcmVsb2NzOwotICBzeW0gLT4gcmNudCA9IDA7Ci0gIHdoaWxlIChzeW0gLT4gcmNudCA8IHJjb3VudCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIAotICAgICAgaWYgKG5sbV9wb3dlcnBjX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgJnNlY3Rpb24sCi0JCQkJICAmbmxtX3JlbG9jcyAtPiByZWxvYykKLQkgID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5sbV9yZWxvY3MgLT4gc2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgICBubG1fcmVsb2NzKys7Ci0gICAgICBzeW0gLT4gcmNudCsrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZm5kZWYgT0xERk9STUFUCi0KLS8qIFdyaXRlIGEgUG93ZXJQQyBOTE0gcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGFzeW1ib2wgKnN5bTsKLSAgYmZkX3ZtYSB2YWw7Ci0gIGJmZF9ieXRlIHRlbXBbNF07Ci0KLSAgLyogUG93ZXJQQyBOZXRXYXJlIG9ubHkgc3VwcG9ydHMgb25lIGtpbmQgb2YgcmVsb2MuICAqLwotICBpZiAocmVsLT5hZGRlbmQgIT0gMAotICAgICAgfHwgcmVsLT5ob3d0byA9PSBOVUxMCi0gICAgICB8fCByZWwtPmhvd3RvLT5yaWdodHNoaWZ0ICE9IDAKLSAgICAgIHx8IHJlbC0+aG93dG8tPnNpemUgIT0gMgotICAgICAgfHwgcmVsLT5ob3d0by0+Yml0c2l6ZSAhPSAzMgotICAgICAgfHwgcmVsLT5ob3d0by0+Yml0cG9zICE9IDAKLSAgICAgIHx8IHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCi0gICAgICB8fCAocmVsLT5ob3d0by0+c3JjX21hc2sgIT0gMHhmZmZmZmZmZiAmJiByZWwtPmFkZGVuZCAhPSAwKQotICAgICAgfHwgcmVsLT5ob3d0by0+ZHN0X21hc2sgIT0gMHhmZmZmZmZmZikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotICAvKiBUaGUgdmFsdWUgd2Ugd3JpdGUgb3V0IGlzIHRoZSBvZmZzZXQgaW50byB0aGUgYXBwcm9wcmlhdGUKLSAgICAgc2VnbWVudCwgcmlnaHRzaGlmdGVkIGJ5IHR3by4gIFRoaXMgb2Zmc2V0IGlzIHRoZSBzZWN0aW9uIHZtYSwKLSAgICAgYWRqdXN0ZWQgYnkgdGhlIHZtYSBvZiB0aGUgbG93ZXN0IHNlY3Rpb24gaW4gdGhhdCBzZWdtZW50LCBwbHVzCi0gICAgIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgdmFsID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSArIHJlbC0+YWRkcmVzczsKLSAgaWYgKCh2YWwgJiAzKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgdmFsID4+PSAyOwotCi0gIC8qIFRoZSBoaWdoIGJpdCBpcyAwIGlmIHRoZSByZWxvYyBpcyBpbiB0aGUgZGF0YSBzZWN0aW9uLCBvciAxIGlmCi0gICAgIHRoZSByZWxvYyBpcyBpbiB0aGUgY29kZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19EQVRBKQotICAgIHZhbCAtPSBubG1fZ2V0X2RhdGFfbG93IChhYmZkKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbCAtPSBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKLSAgICAgIHZhbCB8PSBOTE1fSElCSVQ7Ci0gICAgfQotICAgIAotICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhbiBpbnRlcm5hbCByZWxvY2F0aW9uIGZpeHVwLiAgVGhlIHNlY29uZCBtb3N0Ci0JIHNpZ25pZmljYW50IGJpdCBpcyAwIGlmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBkYXRhCi0JIHNlZ21lbnQsIG9yIDEgaWYgaXQgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSB0ZXh0IHNlZ21lbnQuICAqLwotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKSAmIFNFQ19DT0RFKQotCXZhbCB8PSBOTE1fSElCSVQgPj4gMTsKLSAgICB9Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbHNlIC8qIE9MREZPUk1BVCAqLwotCi0vKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSByZWxvYyBoYW5kbGluZyBpbiB0aGUgb2xkIGZvcm1hdC4gICovCi0KLS8qIFdyaXRlIGEgUG93ZXJQQyBOTE0gcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfd3JpdGVfcmVsb2MgKGFiZmQsIHNlYywgcmVsLCBpbmR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLSAgICAgaW50IGluZHg7Ci17Ci0gIHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3JlbG9jIGV4dDsKLSAgYXNlY3Rpb24gKmNvZGVfc2VjLCAqZGF0YV9zZWMsICpic3Nfc2VjOwotICBhc3ltYm9sICpzeW07Ci0gIGFzZWN0aW9uICpzeW1zZWM7Ci0gIHVuc2lnbmVkIGxvbmcgbF9zeW1uZHg7Ci0gIGludCBsX3J0eXBlOwotICBpbnQgbF9yc2Vjbm07Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBiZmRfc2l6ZV90eXBlIGFkZHJlc3M7Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9ucyBub3csIGZvciBjb252ZW5pZW5jZS4gICovCi0gIGNvZGVfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgYnNzX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotCi0gIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotICBzeW1zZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSk7Ci0gIGlmIChpbmR4ICE9IC0xKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltc2VjKSk7Ci0gICAgICBsX3N5bW5keCA9IGluZHggKyAzOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzeW1zZWMgPT0gY29kZV9zZWMpCi0JbF9zeW1uZHggPSAwOwotICAgICAgZWxzZSBpZiAoc3ltc2VjID09IGRhdGFfc2VjKQotCWxfc3ltbmR4ID0gMTsKLSAgICAgIGVsc2UgaWYgKHN5bXNlYyA9PSBic3Nfc2VjKQotCWxfc3ltbmR4ID0gMjsKLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGxfc3ltbmR4LCBleHQubF9zeW1uZHgpOwotCi0gIGZvciAoaG93dG8gPSBubG1fcG93ZXJwY19ob3d0b190YWJsZTsKLSAgICAgICBob3d0byA8IG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlICsgSE9XVE9fQ09VTlQ7Ci0gICAgICAgaG93dG8rKykKLSAgICB7Ci0gICAgICBpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPT0gcmVsLT5ob3d0by0+cmlnaHRzaGlmdAotCSAgJiYgaG93dG8tPnNpemUgPT0gcmVsLT5ob3d0by0+c2l6ZQotCSAgJiYgaG93dG8tPmJpdHNpemUgPT0gcmVsLT5ob3d0by0+Yml0c2l6ZQotCSAgJiYgaG93dG8tPnBjX3JlbGF0aXZlID09IHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCi0JICAmJiBob3d0by0+Yml0cG9zID09IHJlbC0+aG93dG8tPmJpdHBvcwotCSAgJiYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gcmVsLT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICAgICAgfHwgKCEgcmVsLT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JCSAgJiYgcmVsLT5hZGRlbmQgPT0gMCkpCi0JICAmJiAoaG93dG8tPnNyY19tYXNrID09IHJlbC0+aG93dG8tPnNyY19tYXNrCi0JICAgICAgfHwgKHJlbC0+aG93dG8tPnNyY19tYXNrID09IDAKLQkJICAmJiByZWwtPmFkZGVuZCA9PSAwKSkKLQkgICYmIGhvd3RvLT5kc3RfbWFzayA9PSByZWwtPmhvd3RvLT5kc3RfbWFzawotCSAgJiYgaG93dG8tPnBjcmVsX29mZnNldCA9PSByZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JYnJlYWs7Ci0gICAgfQotICBpZiAoaG93dG8gPj0gbmxtX3Bvd2VycGNfaG93dG9fdGFibGUgKyBIT1dUT19DT1VOVCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgbF9ydHlwZSA9IGhvd3RvLT50eXBlOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLSAgICBsX3J0eXBlIHw9IDB4ODAwMDsKLSAgbF9ydHlwZSB8PSAoaG93dG8tPmJpdHNpemUgLSAxKSA8PCA4OwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBsX3J0eXBlLCBleHQubF9ydHlwZSk7Ci0KLSAgYWRkcmVzcyA9IHJlbC0+YWRkcmVzczsKLQotICBpZiAoc2VjID09IGNvZGVfc2VjKQotICAgIGxfcnNlY25tID0gMDsKLSAgZWxzZSBpZiAoc2VjID09IGRhdGFfc2VjKQotICAgIHsKLSAgICAgIGxfcnNlY25tID0gMTsKLSAgICAgIGFkZHJlc3MgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBsX3JzZWNubSwgZXh0LmxfcnNlY25tKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgYWRkcmVzcywgZXh0LmxfdmFkZHIpOwotCi0gIGlmIChiZmRfd3JpdGUgKCZleHQsIHNpemVvZiBleHQsIDEsIGFiZmQpICE9IHNpemVvZiBleHQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBhIFBvd2VyUEMgTkxNIGltcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY193cml0ZV9pbXBvcnQgKGFiZmQsIHNlYywgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgcmV0dXJuIG5sbV9wb3dlcnBjX3dyaXRlX3JlbG9jIChhYmZkLCBzZWMsIHJlbCwgLTEpOwotfQotCi0jZW5kaWYgLyogT0xERk9STUFUICovCi0KLS8qIFdyaXRlIGEgUG93ZXJQQyBOTE0gZXh0ZXJuYWwgc3ltYm9sLiAgVGhpcyByb3V0aW5lIGtlZXBzIGEgc3RhdGljCi0gICBjb3VudCBvZiB0aGUgc3ltYm9sIGluZGV4LiAgRklYTUU6IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCi0gICBuZWNlc3NhcnksIGFuZCB0aGUgaW5kZXggbmV2ZXIgZ2V0cyByZXNldC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY193cml0ZV9leHRlcm5hbCAoYWJmZCwgY291bnQsIHN5bSwgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgc3RydWN0IHJlbG9jX2FuZF9zZWMgKnJlbG9jczsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF9ieXRlIGxlbjsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLSNpZmRlZiBPTERGT1JNQVQKLSAgc3RhdGljIGludCBpbmR4OwotI2VuZGlmCi0KLSAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotICBpZiAoKGJmZF93cml0ZSAoJmxlbiwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpICE9IHNpemVvZihiZmRfYnl0ZSkpCi0gICAgICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50LCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0jaWZuZGVmIE9MREZPUk1BVAotICAgICAgaWYgKCEgbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0IChhYmZkLCByZWxvY3NbaV0uc2VjLCByZWxvY3NbaV0ucmVsKSkKLQlyZXR1cm4gZmFsc2U7Ci0jZWxzZQotICAgICAgaWYgKCEgbmxtX3Bvd2VycGNfd3JpdGVfcmVsb2MgKGFiZmQsIHJlbG9jc1tpXS5zZWMsCi0JCQkJICAgICByZWxvY3NbaV0ucmVsLCBpbmR4KSkKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLSAgICB9Ci0KLSNpZmRlZiBPTERGT1JNQVQKLSAgKytpbmR4OwotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0jaWZuZGVmIE9MREZPUk1BVAotCi0vKiBQb3dlclBDIE5ldHdhcmUgdXNlcyBhIHdvcmQgb2Zmc2V0LCBub3QgYSBieXRlIG9mZnNldCwgZm9yIHB1YmxpYwotICAgc3ltYm9scy4gICovCi0KLS8qIFNldCB0aGUgc2VjdGlvbiBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3NldF9wdWJsaWNfc2VjdGlvbiAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci17Ci0gIGlmIChzeW0tPnN5bWJvbC52YWx1ZSAmIE5MTV9ISUJJVCkKLSAgICB7Ci0gICAgICBzeW0tPnN5bWJvbC52YWx1ZSAmPSB+TkxNX0hJQklUOwotICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgICB9Ci0KLSAgc3ltLT5zeW1ib2wudmFsdWUgPDw9IDI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgb2Zmc2V0IHRvIHdyaXRlIG91dCBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW5sbV9wb3dlcnBjX2dldF9wdWJsaWNfb2Zmc2V0IChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBiZmRfdm1hIG9mZnNldDsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBvZmZzZXQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uIChzeW0pOwotICBpZiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotICAgIHsKLSAgICAgIG9mZnNldCAtPSBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKLSAgICAgIG9mZnNldCB8PSBOTE1fSElCSVQ7Ci0gICAgfQotICBlbHNlIGlmIChzZWMtPmZsYWdzICYgKFNFQ19EQVRBIHwgU0VDX0FMTE9DKSkKLSAgICB7Ci0gICAgICAvKiBTRUNfQUxMT0MgaXMgZm9yIHRoZSAuYnNzIHNlY3Rpb24uICAqLwotICAgICAgb2Zmc2V0IC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGNhbid0IGhhbmRsZSBhbiBleHBvcnRlZCBzeW1ib2wgdGhhdCBpcyBub3QgaW4gdGhlIGNvZGUgb3IKLQkgZGF0YSBzZWdtZW50LiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIHJldHVybiBlcnJvci4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldDsKLX0KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoT0xERk9STUFUKSAqLwotDAotI2luY2x1ZGUgIm5sbXN3YXAuaCIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBubG1fYmFja2VuZF9kYXRhIG5sbTMyX3Bvd2VycGNfYmFja2VuZCA9Ci17Ci0gICJOZXRXYXJlIFBvd2VyUEMgTW9kdWxlIFwwMzIiLAotICBzaXplb2YgKE5sbTMyX3Bvd2VycGNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyKSwKLSNpZm5kZWYgT0xERk9STUFUCi0gIDAsCS8qIG9wdGlvbmFsX3ByZWZpeF9zaXplICovCi0jZWxzZQotICBzaXplb2YgKHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIpLAotI2VuZGlmCi0gIGJmZF9hcmNoX3Bvd2VycGMsCi0gIDAsCi0gIGZhbHNlLAotI2lmbmRlZiBPTERGT1JNQVQKLSAgMCwJLyogYmFja2VuZF9vYmplY3RfcCAqLwotICAwLAkvKiB3cml0ZV9wcmVmaXggKi8KLSNlbHNlCi0gIG5sbV9wb3dlcnBjX2JhY2tlbmRfb2JqZWN0X3AsCi0gIG5sbV9wb3dlcnBjX3dyaXRlX3ByZWZpeCwKLSNlbmRpZgotICBubG1fcG93ZXJwY19yZWFkX3JlbG9jLAotICBubG1fcG93ZXJwY19tYW5nbGVfcmVsb2NzLAotICBubG1fcG93ZXJwY19yZWFkX2ltcG9ydCwKLSAgbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0LAotI2lmbmRlZiBPTERGT1JNQVQKLSAgbmxtX3Bvd2VycGNfc2V0X3B1YmxpY19zZWN0aW9uLAotICBubG1fcG93ZXJwY19nZXRfcHVibGljX29mZnNldCwKLSNlbHNlCi0gIDAsCS8qIHNldF9wdWJsaWNfc2VjdGlvbiAqLwotICAwLAkvKiBnZXRfcHVibGljX29mZnNldCAqLwotI2VuZGlmCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbiwKLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCwKLSAgbmxtX3Bvd2VycGNfd3JpdGVfZXh0ZXJuYWwsCi0gIDAsCS8qIHdyaXRlX2V4cG9ydCAqLwotfTsKLQotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkibmxtMzItcG93ZXJwYyIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQlubG1OQU1FKHBvd2VycGNfdmVjKQotI2RlZmluZSBUQVJHRVRfQkFDS0VORF9EQVRBCQkmbmxtMzJfcG93ZXJwY19iYWNrZW5kCi0KLSNpbmNsdWRlICJubG0tdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtMzItc3BhcmMuYyBiL2JmZC9ubG0zMi1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjRkODBhLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG0zMi1zcGFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIDMyLWJpdCBTUEFSQyBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2luY2x1ZGUgIm5sbS9zcGFyYzMyLWV4dC5oIgotI2RlZmluZSBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCU5sbTMyX3NwYXJjX0V4dGVybmFsX0ZpeGVkX0hlYWRlcgotCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY19yZWFkX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqLCBhc2VjdGlvbiAqKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfd3JpdGVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX21hbmdsZV9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX3ZtYSwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3JlYWRfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfd3JpdGVfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY193cml0ZV9leHRlcm5hbAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3NpemVfdHlwZSwgYXN5bWJvbCAqLCBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSk7Ci0KLWVudW0gcmVsb2NfdHlwZQotICB7Ci0gICAgUl9TUEFSQ19OT05FID0gMCwKLSAgICBSX1NQQVJDXzgsCQlSX1NQQVJDXzE2LAkJUl9TUEFSQ18zMiwgCi0gICAgUl9TUEFSQ19ESVNQOCwJUl9TUEFSQ19ESVNQMTYsCQlSX1NQQVJDX0RJU1AzMiwgCi0gICAgUl9TUEFSQ19XRElTUDMwLAlSX1NQQVJDX1dESVNQMjIsCi0gICAgUl9TUEFSQ19ISTIyLAlSX1NQQVJDXzIyLAotICAgIFJfU1BBUkNfMTMsCQlSX1NQQVJDX0xPMTAsCi0gICAgUl9TUEFSQ19HT1QxMCwJUl9TUEFSQ19HT1QxMywJCVJfU1BBUkNfR09UMjIsCi0gICAgUl9TUEFSQ19QQzEwLAlSX1NQQVJDX1BDMjIsCi0gICAgUl9TUEFSQ19XUExUMzAsCi0gICAgUl9TUEFSQ19DT1BZLAotICAgIFJfU1BBUkNfR0xPQl9EQVQsCVJfU1BBUkNfSk1QX1NMT1QsCi0gICAgUl9TUEFSQ19SRUxBVElWRSwKLSAgICBSX1NQQVJDX1VBMzIsCi0gICAgUl9TUEFSQ19tYXgKLSAgfTsKLQotI2lmIDAKLXN0YXRpYyBDT05TVCBjaGFyICpDT05TVCByZWxvY190eXBlX25hbWVzW10gPQotewotICAiUl9TUEFSQ19OT05FIiwKLSAgIlJfU1BBUkNfOCIsCQkiUl9TUEFSQ18xNiIsCQkiUl9TUEFSQ18zMiIsCi0gICJSX1NQQVJDX0RJU1A4IiwJIlJfU1BBUkNfRElTUDE2IiwJIlJfU1BBUkNfRElTUDMyIiwKLSAgIlJfU1BBUkNfV0RJU1AzMCIsCSJSX1NQQVJDX1dESVNQMjIiLAotICAiUl9TUEFSQ19ISTIyIiwJIlJfU1BBUkNfMjIiLAotICAiUl9TUEFSQ18xMyIsCQkiUl9TUEFSQ19MTzEwIiwKLSAgIlJfU1BBUkNfR09UMTAiLAkiUl9TUEFSQ19HT1QxMyIsCSJSX1NQQVJDX0dPVDIyIiwKLSAgIlJfU1BBUkNfUEMxMCIsCSJSX1NQQVJDX1BDMjIiLAotICAiUl9TUEFSQ19XUExUMzAiLAotICAiUl9TUEFSQ19DT1BZIiwKLSAgIlJfU1BBUkNfR0xPQl9EQVQiLAkiUl9TUEFSQ19KTVBfU0xPVCIsCi0gICJSX1NQQVJDX1JFTEFUSVZFIiwKLSAgIlJfU1BBUkNfVUEzMiIsCi19OwotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlW10gPSAKLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgMCwwLCA4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgMCwwLCA4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgMiwyLDMwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsIDIsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgIDAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLX07Ci0KLS8qIFJlYWQgYSBOZXRXYXJlIHNwYXJjIHJlbG9jLiAgKi8KLQotc3RydWN0IG5sbTMyX3NwYXJjX3JlbG9jX2V4dCB7Ci0gIHVuc2lnbmVkIGNoYXIgb2Zmc2V0WzRdOwotICB1bnNpZ25lZCBjaGFyIGFkZGVuZFs0XTsKLSAgdW5zaWduZWQgY2hhciB0eXBlWzFdOwotICB1bnNpZ25lZCBjaGFyIHBhZDFbM107Ci19OwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgc2VjcCwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGJmZF92bWEgdmFsLCBhZGRlbmQ7Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0gIHN0cnVjdCBubG0zMl9zcGFyY19yZWxvY19leHQgdG1wX3JlbG9jOwotICBhc2VjdGlvbiAqY29kZV9zZWMsICpkYXRhX3NlYzsKLQotICBpZiAoYmZkX3JlYWQgKCZ0bXBfcmVsb2MsIDEyLCAxLCBhYmZkKSAhPSAxMikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotCi0gICpzZWNwID0gY29kZV9zZWM7Ci0KLSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgdG1wX3JlbG9jLm9mZnNldCk7Ci0gIGFkZGVuZCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRtcF9yZWxvYy5hZGRlbmQpOwotICB0eXBlID0gYmZkX2dldF84IChhYmZkLCB0bXBfcmVsb2MudHlwZSk7Ci0KLSAgcmVsLT5hZGRyZXNzID0gdmFsOwotICByZWwtPmFkZGVuZCA9IGFkZGVuZDsKLSAgcmVsLT5ob3d0byA9IE5VTEw7Ci0KLSAgZm9yIChpbmRleCA9IDA7Ci0gICAgICAgaW5kZXggPCBzaXplb2YobmxtMzJfc3BhcmNfaG93dG9fdGFibGUpIC8gc2l6ZW9mKHJlbG9jX2hvd3RvX3R5cGUpOwotICAgICAgIGluZGV4KyspCi0gICAgaWYgKG5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlW2luZGV4XS50eXBlID09IHR5cGUpIHsKLSAgICAgIHJlbC0+aG93dG8gPSAmbmxtMzJfc3BhcmNfaG93dG9fdGFibGVbaW5kZXhdOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICBhZGRyZXNzID0gJTA4bHgsIGFkZGVuZCA9ICUwOGx4LCB0eXBlID0gJWQsIGhvd3RvID0gJTA4bHhcbiIsCi0JICAgX19GVU5DVElPTl9fLCByZWwtPmFkZHJlc3MsIHJlbC0+YWRkZW5kLCB0eXBlLCByZWwtPmhvd3RvKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLQotfQotCi0vKiBXcml0ZSBhIE5ldFdhcmUgc3BhcmMgcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3dyaXRlX3JlbG9jIChhYmZkLCBzZWMsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGJmZF92bWEgdmFsOwotICBzdHJ1Y3QgbmxtMzJfc3BhcmNfcmVsb2NfZXh0IHRtcF9yZWxvYzsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICBpbnQgdHlwZSA9IC0xOwotICByZWxvY19ob3d0b190eXBlICp0bXA7Ci0KLSAgCi0gIGZvciAoaW5kZXggPSAwOwotICAgICAgIGluZGV4IDwgc2l6ZW9mIChubG0zMl9zcGFyY19ob3d0b190YWJsZSkgLyBzaXplb2YocmVsb2NfaG93dG9fdHlwZSk7Ci0gICAgICAgaW5kZXgrKykgewotICAgIHRtcCA9ICZubG0zMl9zcGFyY19ob3d0b190YWJsZVtpbmRleF07Ci0KLSAgICBpZiAodG1wLT5yaWdodHNoaWZ0ID09IHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQKLQkmJiB0bXAtPnNpemUgPT0gcmVsLT5ob3d0by0+c2l6ZQotCSYmIHRtcC0+Yml0c2l6ZSA9PSByZWwtPmhvd3RvLT5iaXRzaXplCi0JJiYgdG1wLT5wY19yZWxhdGl2ZSA9PSByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQotCSYmIHRtcC0+Yml0cG9zID09IHJlbC0+aG93dG8tPmJpdHBvcwotCSYmIHRtcC0+c3JjX21hc2sgPT0gcmVsLT5ob3d0by0+c3JjX21hc2sKLQkmJiB0bXAtPmRzdF9tYXNrID09IHJlbC0+aG93dG8tPmRzdF9tYXNrKSB7Ci0gICAgICB0eXBlID0gdG1wLT50eXBlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmICh0eXBlID09IC0xKQotICAgIGFib3J0KCk7Ci0KLSAgLyoKLSAgICogTmV0d2FyZSB3YW50cyBhIGxpc3Qgb2YgcmVsb2NzIGZvciBlYWNoIGFkZHJlc3MuCi0gICAqIEZvcm1hdCBpczoKLSAgICoJbG9uZwlvZmZzZXQKLSAgICoJbG9uZwlhZGRlbmQKLSAgICoJY2hhcgl0eXBlCi0gICAqIFRoYXQgc2hvdWxkIGJlIGl0LgotICAgKi8KLQotICAvKiBUaGUgdmFsdWUgd2Ugd3JpdGUgb3V0IGlzIHRoZSBvZmZzZXQgaW50byB0aGUgYXBwcm9wcmlhdGUKLSAgICAgc2VnbWVudC4gIFRoaXMgb2Zmc2V0IGlzIHRoZSBzZWN0aW9uIHZtYSwgYWRqdXN0ZWQgYnkgdGhlIHZtYSBvZgotICAgICB0aGUgbG93ZXN0IHNlY3Rpb24gaW4gdGhhdCBzZWdtZW50LCBwbHVzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgICByZWxvY2F0aW9uLiAgKi8KLSNpZiAwCi0gIHZhbCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsICgqcmVsLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pICsgcmVsLT5hZGRyZXNzOwotI2Vsc2UKLSAgdmFsID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSArIHJlbC0+YWRkcmVzczsKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICB2YWwgPSAlMDhseCwgYWRkZW5kID0gJTA4bHgsIHR5cGUgPSAlZFxuIiwKLQkgICBfX0ZVTkNUSU9OX18sIHZhbCwgcmVsLT5hZGRlbmQsIHJlbC0+aG93dG8tPnR5cGUpOwotI2VuZGlmCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgdG1wX3JlbG9jLm9mZnNldCk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHJlbC0+YWRkZW5kLCB0bXBfcmVsb2MuYWRkZW5kKTsKLSAgYmZkX3B1dF84IChhYmZkLCAoc2hvcnQpKHJlbC0+aG93dG8tPnR5cGUpLCB0bXBfcmVsb2MudHlwZSk7Ci0KLSAgaWYgKGJmZF93cml0ZSAoJnRtcF9yZWxvYywgMTIsIDEsIGFiZmQpICE9IDEyKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFuZ2xlIHJlbG9jcyBmb3IgU1BBUkMgTmV0V2FyZS4gIFdlIGNhbiBqdXN0IHVzZSB0aGUgc3RhbmRhcmQKLSAgIFNQQVJDIHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIG9mZnNldCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgTmV0V2FyZSBzcGFyYyBpbXBvcnQgcmVjb3JkICovCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3JlYWRfaW1wb3J0IChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLXsKLSAgc3RydWN0IG5sbV9yZWxlbnQgKm5sbV9yZWxvY3M7CS8qIHJlbG9jYXRpb24gcmVjb3JkcyBmb3Igc3ltYm9sICovCi0gIGJmZF9zaXplX3R5cGUgcmNvdW50OwkJCS8qIG51bWJlciBvZiByZWxvY3MgKi8KLSAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CS8qIHRlbXBvcmFyeSAzMi1iaXQgdmFsdWUgKi8KLSAgdW5zaWduZWQgY2hhciBzeW1sZW5ndGg7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIG5hbWUgKi8KLSAgY2hhciAqbmFtZTsKLSAgCi0gIC8qCi0gICAqIEZpcnN0LCByZWFkIGluIHRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbgotICAgKiBlbnRyaWVzIGZvciB0aGlzIHN5bWJvbAotICAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wLCA0LCAxLCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIHJjb3VudCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRlbXApOwotICAKLSAgLyoKLSAgICogTmV4dCwgcmVhZCBpbiB0aGUgbGVuZ3RoIG9mIHRoZSBzeW1ib2wKLSAgICovCi0gIAotICBpZiAoYmZkX3JlYWQgKChQVFIpICZzeW1sZW5ndGgsIHNpemVvZiAoc3ltbGVuZ3RoKSwgMSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3ltbGVuZ3RoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bSAtPiBzeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN5bWxlbmd0aCArIDEpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIC8qCi0gICAqIFRoZW4gcmVhZCBpbiB0aGUgc3ltYm9sCi0gICAqLwotICAKLSAgaWYgKGJmZF9yZWFkIChuYW1lLCBzeW1sZW5ndGgsIDEsIGFiZmQpICE9IHN5bWxlbmd0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5hbWVbc3ltbGVuZ3RoXSA9ICdcMCc7Ci0gIHN5bSAtPiBzeW1ib2wubmFtZSA9IG5hbWU7Ci0gIHN5bSAtPiBzeW1ib2wuZmxhZ3MgPSAwOwotICBzeW0gLT4gc3ltYm9sLnZhbHVlID0gMDsKLSAgc3ltIC0+IHN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgCi0gIC8qCi0gICAqIE5leHQsIHN0YXJ0IHJlYWRpbmcgaW4gdGhlIHJlbG9jcy4KLSAgICovCi0gIAotICBubG1fcmVsb2NzID0gKChzdHJ1Y3QgbmxtX3JlbGVudCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHJjb3VudCAqIHNpemVvZiAoc3RydWN0IG5sbV9yZWxlbnQpKSk7Ci0gIGlmICghbmxtX3JlbG9jcykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bSAtPiByZWxvY3MgPSBubG1fcmVsb2NzOwotICBzeW0gLT4gcmNudCA9IDA7Ci0gIHdoaWxlIChzeW0gLT4gcmNudCA8IHJjb3VudCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIAotICAgICAgaWYgKG5sbV9zcGFyY19yZWFkX3JlbG9jIChhYmZkLCBzeW0sICZzZWN0aW9uLAotCQkJICAgICAgJm5sbV9yZWxvY3MgLT4gcmVsb2MpCi0JICA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBubG1fcmVsb2NzIC0+IHNlY3Rpb24gPSBzZWN0aW9uOwotICAgICAgbmxtX3JlbG9jcysrOwotICAgICAgc3ltIC0+IHJjbnQrKzsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3dyaXRlX2ltcG9ydCAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBjaGFyIHRlbXBbNF07Ci0gIGFzZWN0aW9uICpjb2RlLCAqZGF0YSwgKmJzcywgKnN5bXNlYzsKLSAgYmZkX3ZtYSBiYXNlOwotCi0gIGNvZGUgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGJzcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBzeW1zZWMgPSAoKnJlbC0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uOwotCi0gIGlmIChzeW1zZWMgPT0gY29kZSkgewotICAgIGJhc2UgPSAwOwotICB9IGVsc2UgaWYgKHN5bXNlYyA9PSBkYXRhKSB7Ci0gICAgYmFzZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGUpOwotICB9IGVsc2UgaWYgKHN5bXNlYyA9PSBic3MpIHsKLSAgICBiYXNlID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZSkgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBkYXRhKTsKLSAgfSBlbHNlCi0gICAgYmFzZSA9IDA7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICIlczogIDwleCwgMT5cblx0IiwKLQkgICBfX0ZVTkNUSU9OX18sIGJhc2UgKyAoKnJlbC0+c3ltX3B0cl9wdHIpLT52YWx1ZSk7Ci0jZW5kaWYKLSAgYmZkX3B1dF8zMiAoYWJmZCwgYmFzZSArICgqcmVsLT5zeW1fcHRyX3B0ciktPnZhbHVlLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUil0ZW1wLCA0LCAxLCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBmYWxzZTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgMSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpdGVtcCwgNCwgMSwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChubG1fc3BhcmNfd3JpdGVfcmVsb2MgKGFiZmQsIHNlYywgcmVsKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY193cml0ZV9leHRlcm5hbCAoYWJmZCwgY291bnQsIHN5bSwgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgc3RydWN0IHJlbG9jX2FuZF9zZWMgKnJlbG9jczsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF9ieXRlIGxlbjsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBjb3VudCwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZih0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotICBpZiAoKGJmZF93cml0ZSAoJmxlbiwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpICE9IHNpemVvZihiZmRfYnl0ZSkpCi0gICAgICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChubG1fc3BhcmNfd3JpdGVfcmVsb2MgKGFiZmQsIHJlbG9jc1tpXS5zZWMsCi0JCQkJIHJlbG9jc1tpXS5yZWwpID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfd3JpdGVfZXhwb3J0IChhYmZkLCBzeW0sIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgYmZkX2J5dGUgbGVuOwotICBiZmRfYnl0ZSB0ZW1wWzRdOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IDwleCwgJWQsICVzPlxuIiwKLQkgICBfX0ZVTkNUSU9OX18sIHZhbHVlLCBzdHJsZW4gKHN5bS0+bmFtZSksIHN5bS0+bmFtZSk7Ci0jZW5kaWYKLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsdWUsIHRlbXApOwotICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0KLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgNCwgMSwgYWJmZCkgIT0gNAotICAgICAgfHwgYmZkX3dyaXRlICgmbGVuLCAxLCAxLCBhYmZkKSAhPSAxCi0gICAgICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jdW5kZWYgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luCi0jdW5kZWYgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dAotCi0jaW5jbHVkZSAibmxtc3dhcC5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEgbmxtMzJfc3BhcmNfYmFja2VuZCA9Ci17Ci0gICJOZXRXYXJlIFNQQVJDIE1vZHVsZSAgIFwwMzIiLAotICBzaXplb2YgKE5sbTMyX3NwYXJjX0V4dGVybmFsX0ZpeGVkX0hlYWRlciksCi0gIDAsCS8qIG9wdGlvbmFsX3ByZWZpeF9zaXplICovCi0gIGJmZF9hcmNoX3NwYXJjLAotICAwLAotICBmYWxzZSwKLSAgMCwJLyogYmFja2VuZF9vYmplY3RfcCAqLwotICAwLAkvKiB3cml0ZV9wcmVmaXhfZnVuYyAqLwotICBubG1fc3BhcmNfcmVhZF9yZWxvYywKLSAgbmxtX3NwYXJjX21hbmdsZV9yZWxvY3MsCi0gIG5sbV9zcGFyY19yZWFkX2ltcG9ydCwKLSAgbmxtX3NwYXJjX3dyaXRlX2ltcG9ydCwKLSAgMCwJLyogc2V0X3B1YmxpY19zZWN0aW9uICovCi0gIDAsCS8qIGdldF9wdWJsaWNfb2Zmc2V0ICovCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbiwKLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCwKLSAgbmxtX3NwYXJjX3dyaXRlX2V4dGVybmFsLAotICBubG1fc3BhcmNfd3JpdGVfZXhwb3J0Ci19OwotCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJIm5sbTMyLXNwYXJjIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJbmxtTkFNRShzcGFyY192ZWMpCi0jZGVmaW5lIFRBUkdFVF9CQUNLRU5EX0RBVEEJCSZubG0zMl9zcGFyY19iYWNrZW5kCi0KLSNpbmNsdWRlICJubG0tdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtMzIuYyBiL2JmZC9ubG0zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzMwZTRmLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG0zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgMzItYml0IGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0jaW5jbHVkZSAibmxtY29kZS5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbTY0LmMgYi9iZmQvbmxtNjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjZDk2YS4uMDAwMDAwMAotLS0gYS9iZmQvbmxtNjQuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIDY0LWJpdCBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRSA2NAotI2luY2x1ZGUgIm5sbWNvZGUuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG1jb2RlLmggYi9iZmQvbmxtY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDFhMmY4Li4wMDAwMDAwCi0tLSBhL2JmZC9ubG1jb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDU2ICswLDAgQEAKLS8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0LCB1c2luZyBFTEYgc3VwcG9ydCBhcyB0aGUKLSAgIHRlbXBsYXRlLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJubG0uaCIKLQotLyogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgZG8gbm90IHVzZSB0aGUgbmFtZXMgdGhleSBhcHBlYXIgdG8gdXNlLgotICAgVGhpcyBmaWxlIGlzIGFjdHVhbGx5IGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzLCBvbmNlIGZvciBlYWNoIHNpemUKLSAgIG9mIE5MTSB0YXJnZXQgd2UgYXJlIHVzaW5nLiAgQXQgZWFjaCBzaXplIHdlIHVzZSBhIGRpZmZlcmVudCBuYW1lLAotICAgY29uc3RydWN0ZWQgYnkgdGhlIG1hY3JvIG5sbU5BTUUuICBGb3IgZXhhbXBsZSwgdGhlIGZ1bmN0aW9uIHdoaWNoCi0gICBpcyBuYW1lZCBubG1fc3ltYm9sX3R5cGUgYmVsb3cgaXMgYWN0dWFsbHkgbmFtZWQgbmxtMzJfc3ltYm9sX3R5cGUKLSAgIGluIHRoZSBmaW5hbCBleGVjdXRhYmxlLiAgKi8KLQotI2RlZmluZSBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfRml4ZWRfSGVhZGVyKQotI2RlZmluZSBObG1fRXh0ZXJuYWxfVmVyc2lvbl9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9WZXJzaW9uX0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0NvcHlyaWdodF9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyKQotI2RlZmluZSBObG1fRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyKQotI2RlZmluZSBObG1fRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0N1c3RvbV9IZWFkZXIpCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0N5Z251c19FeHRfSGVhZGVyKQotCi0jZGVmaW5lIG5sbV9zeW1ib2xfdHlwZQkJCW5sbU5BTUUoc3ltYm9sX3R5cGUpCi0jZGVmaW5lIG5sbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCW5sbU5BTUUoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSNkZWZpbmUgbmxtX2dldF9zeW10YWIJCQlubG1OQU1FKGdldF9zeW10YWIpCi0jZGVmaW5lIG5sbV9tYWtlX2VtcHR5X3N5bWJvbAkJbmxtTkFNRShtYWtlX2VtcHR5X3N5bWJvbCkKLSNkZWZpbmUgbmxtX3ByaW50X3N5bWJvbAkJbmxtTkFNRShwcmludF9zeW1ib2wpCi0jZGVmaW5lIG5sbV9nZXRfc3ltYm9sX2luZm8JCW5sbU5BTUUoZ2V0X3N5bWJvbF9pbmZvKQotI2RlZmluZSBubG1fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCW5sbU5BTUUoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKQotI2RlZmluZSBubG1fY2Fub25pY2FsaXplX3JlbG9jCQlubG1OQU1FKGNhbm9uaWNhbGl6ZV9yZWxvYykKLSNkZWZpbmUgbmxtX29iamVjdF9wCQkJbmxtTkFNRShvYmplY3RfcCkKLSNkZWZpbmUgbmxtX3NldF9zZWN0aW9uX2NvbnRlbnRzCW5sbU5BTUUoc2V0X3NlY3Rpb25fY29udGVudHMpCi0jZGVmaW5lIG5sbV93cml0ZV9vYmplY3RfY29udGVudHMJbmxtTkFNRSh3cml0ZV9vYmplY3RfY29udGVudHMpCi0KLSNkZWZpbmUgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luKGFiZmQsc3JjLGRzdCkgXAotICAobmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luX2Z1bmMoYWJmZCkpKGFiZmQsc3JjLGRzdCkKLSNkZWZpbmUgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dChhYmZkLHNyYyxkc3QpIFwKLSAgKG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXRfZnVuYyhhYmZkKSkoYWJmZCxzcmMsZHN0KQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBzdGF0aWMgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBib29sZWFuIGFkZF9iZmRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9pbgotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3N3YXBfdmFyaWFibGVfaGVhZGVyX291dAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZmluZF9ub256ZXJvCi0gIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbgotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc2x1cnBfc3ltYm9sX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc2x1cnBfcmVsb2NfZml4dXBzCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IG5sbV9leHRlcm5hbF9yZWxvY19jb21wYXJlCi0gIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci0KLS8qIFNob3VsZCBwZXJoYXBzIHVzZSBwdXRfb2Zmc2V0LCBwdXRfd29yZCwgZXRjLiAgRm9yIG5vdywgdGhlIHR3byB2ZXJzaW9ucwotICAgY2FuIGJlIGhhbmRsZWQgYnkgZXhwbGljaXRseSBzcGVjaWZ5aW5nIDMyIGJpdHMgb3IgInRoZSBsb25nIHR5cGUiLiAgKi8KLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSNkZWZpbmUgcHV0X3dvcmQJYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIGdldF93b3JkCWJmZF9oX2dldF82NAotI2VuZGlmCi0jaWYgQVJDSF9TSVpFID09IDMyCi0jZGVmaW5lIHB1dF93b3JkCWJmZF9oX3B1dF8zMgotI2RlZmluZSBnZXRfd29yZAliZmRfaF9nZXRfMzIKLSNlbmRpZgotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLW5sbV9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbmxtX29ial90ZGF0YSAqcHJlc2VydmVkX3RkYXRhID0gbmxtX3RkYXRhIChhYmZkKTsKLSAgYm9vbGVhbiAoKmJhY2tlbmRfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIFBUUiB4X2Z4ZGhkciA9IE5VTEw7Ci0gIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKmlfZnhkaGRycDsKLSAgc3RydWN0IG5sbV9vYmpfdGRhdGEgKm5ld190ZGF0YSA9IE5VTEw7Ci0gIGNvbnN0IGNoYXIgKnNpZ25hdHVyZTsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0KLSAgLyogU29tZSBOTE0gZm9ybWF0cyBoYXZlIGEgcHJlZml4IGJlZm9yZSB0aGUgc3RhbmRhcmQgTkxNIGZpeGVkCi0gICAgIGhlYWRlci4gICovCi0gIGJhY2tlbmRfb2JqZWN0X3AgPSBubG1fYmFja2VuZF9vYmplY3RfcF9mdW5jIChhYmZkKTsKLSAgaWYgKGJhY2tlbmRfb2JqZWN0X3ApCi0gICAgewotICAgICAgaWYgKCEoKmJhY2tlbmRfb2JqZWN0X3ApIChhYmZkKSkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIGZpeGVkIGxlbmd0aCBwb3J0aW9uIG9mIHRoZSBOTE0gaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdC4gICovCi0KLSAgeF9meGRoZHIgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpKTsKLSAgaWYgKHhfZnhkaGRyID09IE5VTEwpCi0gICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSB4X2Z4ZGhkciwgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSwgMSwgYWJmZCkgIT0KLSAgICAgIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCkpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICAgIGVsc2UKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIG5sbV9vYmpfdGRhdGEgc3RydWN0dXJlIGFuZCBob29rIGl0IHVwIHRvCi0gICAgIHRoZSB0ZGF0YSBwb2ludGVyIGluIHRoZSBiZmQuICAqLwotCi0gIG5ld190ZGF0YSA9ICgoc3RydWN0IG5sbV9vYmpfdGRhdGEgKikKLQkgICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbmxtX29ial90ZGF0YSkpKTsKLSAgaWYgKG5ld190ZGF0YSA9PSBOVUxMKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIG5sbV90ZGF0YSAoYWJmZCkgPSBuZXdfdGRhdGE7Ci0KLSAgaV9meGRoZHJwID0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCk7Ci0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbiAoYWJmZCwgeF9meGRoZHIsIGlfZnhkaGRycCk7Ci0gIGZyZWUgKHhfZnhkaGRyKTsKLSAgeF9meGRoZHIgPSBOVUxMOwotCi0gIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFuIE5MTSBmaWxlIGZvciB0aGlzIGJhY2tlbmQgYnkgbWF0Y2hpbmcKLSAgICAgdGhlIE5MTSBzaWduYXR1cmUuICovCi0KLSAgc2lnbmF0dXJlID0gbmxtX3NpZ25hdHVyZSAoYWJmZCk7Ci0gIGlmIChzaWduYXR1cmUgIT0gTlVMTAotICAgICAgJiYgKnNpZ25hdHVyZSAhPSAnXDAnCi0gICAgICAmJiBzdHJuY21wICgoY2hhciAqKSBpX2Z4ZGhkcnAtPnNpZ25hdHVyZSwgc2lnbmF0dXJlLAotCQkgIE5MTV9TSUdOQVRVUkVfU0laRSkgIT0gMCkKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgLyogVGhlcmUncyBubyBzdXBwb3J0ZWQgd2F5IHRvIGRpc2NvdmVyIHRoZSBlbmRpYW5lc3Mgb2YgYW4gTkxNLCBzbyB0ZXN0IGZvcgotICAgICBhIHNhbmUgdmVyc2lvbiBudW1iZXIgYWZ0ZXIgZG9pbmcgYnl0ZSBzd2FwcGluZyBhcHByb3ByaWF0ZSBmb3IgdGhpcwotICAgICBYVkVDLiAgKEhhY2sgYWxlcnQhKSAqLwotCi0gIGlmIChpX2Z4ZGhkcnAtPnZlcnNpb24gPiAweEZGRkYpCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIC8qIFRoZXJlJ3Mgbm8gc3VwcG9ydGVkIHdheSB0byBjaGVjayBmb3IgMzIgYml0IHZlcnN1cyA2NCBiaXQgYWRkcmVzc2VzLAotICAgICBzbyBpZ25vcmUgdGhpcyBkaXN0aW5jdGlvbiBmb3Igbm93LiAgKEZJWE1FKSAqLwotCi0gIC8qIFN3YXAgaW4gdGhlIHJlc3Qgb2YgdGhlIHJlcXVpcmVkIGhlYWRlci4gICovCi0gIGlmICghbmxtX3N3YXBfdmFyaWFibGVfaGVhZGVyX2luIChhYmZkKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgICAgZWxzZQotCWdvdG8gZ290X25vX21hdGNoOwotICAgIH0KLQotICAvKiBBZGQgdGhlIHNlY3Rpb25zIHN1cHBsaWVkIGJ5IGFsbCBOTE0ncywgYW5kIHRoZW4gcmVhZCBpbiB0aGUKLSAgICAgYXV4aWxpYXJ5IGhlYWRlcnMuICBSZWFkaW5nIHRoZSBhdXhpbGlhcnkgaGVhZGVycyBtYXkgY3JlYXRlCi0gICAgIGFkZGl0aW9uYWwgc2VjdGlvbnMgZGVzY3JpYmVkIGluIHRoZSBjeWdudXNfZXh0IGhlYWRlci4KLSAgICAgRnJvbSB0aGlzIHBvaW50IG9uIHdlIGFzc3VtZSB0aGF0IHdlIGhhdmUgYW4gTkxNLCBhbmQgZG8gbm90Ci0gICAgIHRyZWF0IGVycm9ycyBhcyBpbmRpY2F0aW5nIHRoZSB3cm9uZyBmb3JtYXQuICAqLwotCi0gIGlmICghYWRkX2JmZF9zZWN0aW9uIChhYmZkLCBOTE1fQ09ERV9OQU1FLAotCQkJaV9meGRoZHJwLT5jb2RlSW1hZ2VPZmZzZXQsCi0JCQlpX2Z4ZGhkcnAtPmNvZGVJbWFnZVNpemUsCi0JCQkoU0VDX0NPREUgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCSB8IFNFQ19SRUxPQykpCi0gICAgICB8fCAhYWRkX2JmZF9zZWN0aW9uIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FLAotCQkJICAgaV9meGRoZHJwLT5kYXRhSW1hZ2VPZmZzZXQsCi0JCQkgICBpX2Z4ZGhkcnAtPmRhdGFJbWFnZVNpemUsCi0JCQkgICAoU0VDX0RBVEEgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCSAgICB8IFNFQ19SRUxPQykpCi0gICAgICB8fCAhYWRkX2JmZF9zZWN0aW9uIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUsCi0JCQkgICAoZmlsZV9wdHIpIDAsCi0JCQkgICBpX2Z4ZGhkcnAtPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSwKLQkJCSAgIFNFQ19BTExPQykpCi0gICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0KLSAgaWYgKCFubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbiAoYWJmZCkpCi0gICAgZ290byBnb3Rfbm9fbWF0Y2g7Ci0KLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHMgIT0gMAotICAgICAgfHwgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzICE9IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mUHVibGljcyAhPSAwCi0gICAgICB8fCBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMgIT0gMAotICAgICAgfHwgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzICE9IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgYXJjaCA9IG5sbV9hcmNoaXRlY3R1cmUgKGFiZmQpOwotICBpZiAoYXJjaCAhPSBiZmRfYXJjaF91bmtub3duKQotICAgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsICh1bnNpZ25lZCBsb25nKSAwKTsKLQotICBhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y29kZVN0YXJ0T2Zmc2V0OwotCi0gIHJldHVybiAoYWJmZC0+eHZlYyk7Ci0KLWdvdF93cm9uZ19mb3JtYXRfZXJyb3I6Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotZ290X25vX21hdGNoOgotICBubG1fdGRhdGEgKGFiZmQpID0gcHJlc2VydmVkX3RkYXRhOwotICBpZiAobmV3X3RkYXRhICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIG5ld190ZGF0YSk7Ci0gIGlmICh4X2Z4ZGhkciAhPSBOVUxMKQotICAgIGZyZWUgKHhfZnhkaGRyKTsKLSAgcmV0dXJuIChOVUxMKTsKLX0KLQotLyogQWRkIGEgc2VjdGlvbiB0byB0aGUgYmZkLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotYWRkX2JmZF9zZWN0aW9uIChhYmZkLCBuYW1lLCBvZmZzZXQsIHNpemUsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0KLSAgbmV3c2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAobmV3c2VjdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiAoZmFsc2UpOwotICAgIH0KLSAgbmV3c2VjdC0+dm1hID0gMDsJCS8qIE5MTSdzIGFyZSByZWxvY2F0YWJsZS4gKi8KLSAgbmV3c2VjdC0+X3Jhd19zaXplID0gc2l6ZTsKLSAgbmV3c2VjdC0+ZmlsZXBvcyA9IG9mZnNldDsKLSAgbmV3c2VjdC0+ZmxhZ3MgPSBmbGFnczsKLSAgbmV3c2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gYmZkX2xvZzIgKDApOwkvKiBGSVhNRSAqLwotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBSZWFkIGFuZCBzd2FwIGluIHRoZSB2YXJpYWJsZSBsZW5ndGggaGVhZGVyLiAgQWxsIHRoZSBmaWVsZHMgbXVzdAotICAgZXhpc3QgaW4gdGhlIE5MTSwgYW5kIG11c3QgZXhpc3QgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHJlYWQgaGVyZS4gKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9pbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBjaGFyIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIC8qIFJlYWQgdGhlIGRlc2NyaXB0aW9uIGxlbmd0aCBhbmQgdGV4dCBtZW1iZXJzLiAqLwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgsCi0JCXNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoKSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25UZXh0LAotCQlubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGggKyAxLAotCQkxLCBhYmZkKSAhPQotICAgICAgKGJmZF9zaXplX3R5cGUpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCArIDEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogUmVhZCBhbmQgY29udmVydCB0aGUgc3RhY2tTaXplIGZpZWxkLiAqLwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnN0YWNrU2l6ZSA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGVtcCk7Ci0KLSAgLyogUmVhZCBhbmQgY29udmVydCB0aGUgcmVzZXJ2ZWQgZmllbGQuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotICBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+cmVzZXJ2ZWQgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRlbXApOwotCi0gIC8qIFJlYWQgdGhlIG9sZFRocmVhZE5hbWUgZmllbGQuICBUaGlzIGZpZWxkIGlzIGEgZml4ZWQgbGVuZ3RoIHN0cmluZy4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lLAotCQlzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPm9sZFRocmVhZE5hbWUpKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFJlYWQgdGhlIHNjcmVlbiBuYW1lIGxlbmd0aCBhbmQgdGV4dCBtZW1iZXJzLiAqLwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCwKLQkJc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCksCi0JCTEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZSwKLQkJbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGggKyAxLAotCQkxLCBhYmZkKSAhPQotICAgICAgKGJmZF9zaXplX3R5cGUpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBSZWFkIHRoZSB0aHJlYWQgbmFtZSBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgsCi0JCXNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgpLAotCQkxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWUsCi0JCW5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoICsgMSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFN3YXAgYW5kIHdyaXRlIG91dCB0aGUgdmFyaWFibGUgbGVuZ3RoIGhlYWRlci4gIEFsbCB0aGUgZmllbGRzIG11c3QKLSAgIGV4aXN0IGluIHRoZSBOTE0sIGFuZCBtdXN0IGV4aXN0IGluIHRoaXMgb3JkZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3N3YXBfdmFyaWFibGVfaGVhZGVyX291dCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBjaGFyIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIC8qIFdyaXRlIHRoZSBkZXNjcmlwdGlvbiBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCwKLQkJIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoKSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvblRleHQsCi0JCSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGggKyAxLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIENvbnZlcnQgYW5kIHdyaXRlIHRoZSBzdGFja1NpemUgZmllbGQuICovCi0KLSAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c3RhY2tTaXplLAotCSAgICAoYmZkX2J5dGUgKikgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogQ29udmVydCBhbmQgd3JpdGUgdGhlIHJlc2VydmVkIGZpZWxkLiAqLwotCi0gIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnJlc2VydmVkLAotCSAgICAoYmZkX2J5dGUgKikgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogV3JpdGUgdGhlIG9sZFRocmVhZE5hbWUgZmllbGQuICBUaGlzIGZpZWxkIGlzIGEgZml4ZWQgbGVuZ3RoIHN0cmluZy4gKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSwKLQkJIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPm9sZFRocmVhZE5hbWUpLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPm9sZFRocmVhZE5hbWUpKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFdyaXRlIHRoZSBzY3JlZW4gbmFtZSBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoLAotCQkgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCksCi0JCSAxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lLAotCQkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGggKyAxLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCArIDEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogV3JpdGUgdGhlIHRocmVhZCBuYW1lIGxlbmd0aCBhbmQgdGV4dCBtZW1iZXJzLiAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgsCi0JCSBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoKSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWUsCi0JCSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEsCi0JCSAxLCBhYmZkKSAhPQotICAgICAgKGJmZF9zaXplX3R5cGUpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoICsgMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyogUmVhZCBhbmQgc3dhcCBpbiB0aGUgY29udGVudHMgb2YgYWxsIHRoZSBhdXhpbGlhcnkgaGVhZGVycy4gIEJlY2F1c2Ugb2YKLSAgIHRoZSBicmFpbmRlYWQgZGVzaWduLCB3ZSBoYXZlIHRvIGRvIHN0cmNtcHMgb24gc3RyaW5ncyBvZiBpbmRldGVybWluYXRlCi0gICBsZW5ndGggdG8gZmlndXJlIG91dCB3aGF0IGVhY2ggYXV4aWxpYXJ5IGhlYWRlciBpcy4gIEV2ZW4gd29yc2UsIHdlIGhhdmUKLSAgIG5vIHdheSBvZiBrbm93aW5nIGhvdyBtYW55IGF1eGlsaWFyeSBoZWFkZXJzIHRoZXJlIGFyZSBvciB3aGVyZSB0aGUgZW5kCi0gICBvZiB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMgYXJlLCBleGNlcHQgYnkgZmluZGluZyBzb21ldGhpbmcgdGhhdCBkb2Vzbid0Ci0gICBsb29rIGxpa2UgYSBrbm93biBhdXhpbGlhcnkgaGVhZGVyLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBmaXJzdCBuZXcgdHlwZQotICAgb2YgYXV4aWxpYXJ5IGhlYWRlciBhZGRlZCB3aWxsIGJyZWFrIGFsbCBleGlzdGluZyB0b29scyB0aGF0IGRvbid0Ci0gICByZWNvZ25pemUgaXQuICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIHRlbXBzdHJbMTZdOwotICBsb25nIHBvc2l0aW9uOwotCi0gIGZvciAoOzspCi0gICAgewotICAgICAgcG9zaXRpb24gPSBiZmRfdGVsbCAoYWJmZCk7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXBzdHIsIHNpemVvZiAodGVtcHN0ciksIDEsIGFiZmQpICE9Ci0JICBzaXplb2YgKHRlbXBzdHIpKQotCXJldHVybiAoZmFsc2UpOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBwb3NpdGlvbiwgU0VFS19TRVQpID09IC0xKQotCXJldHVybiAoZmFsc2UpOwotICAgICAgaWYgKHN0cm5jbXAgKHRlbXBzdHIsICJWZVJzSW9OIyIsIDgpID09IDApCi0JewotCSAgTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyIHRoZHI7Ci0JICBpZiAoYmZkX3JlYWQgKChQVFIpICYgdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKLQkgICAgcmV0dXJuIChmYWxzZSk7Ci0JICBtZW1jcHkgKG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPnN0YW1wLCB0aGRyLnN0YW1wLAotCQkgIHNpemVvZiAodGhkci5zdGFtcCkpOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bWFqb3JWZXJzaW9uID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1ham9yVmVyc2lvbik7Ci0JICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5taW5vclZlcnNpb24gPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubWlub3JWZXJzaW9uKTsKLQkgIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPnJldmlzaW9uID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnJldmlzaW9uKTsKLQkgIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPnllYXIgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIueWVhcik7Ci0JICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5tb250aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tb250aCk7Ci0JICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5kYXkgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuZGF5KTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wICh0ZW1wc3RyLCAiTWVTc0FnRXMiLCA4KSA9PSAwKQotCXsKLQkgIE5sbV9FeHRlcm5hbF9FeHRlbmRlZF9IZWFkZXIgdGhkcjsKLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgJiB0aGRyLCBzaXplb2YgKHRoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRoZHIpKQotCSAgICByZXR1cm4gKGZhbHNlKTsKLQkgIG1lbWNweSAobmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnN0YW1wLCB0aGRyLnN0YW1wLAotCQkgIHNpemVvZiAodGhkci5zdGFtcCkpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmxhbmd1YWdlSUQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubGFuZ3VhZ2VJRCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUZpbGVPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubWVzc2FnZUZpbGVPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VGaWxlTGVuZ3RoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VGaWxlTGVuZ3RoKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlQ291bnQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubWVzc2FnZUNvdW50KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5oZWxwRmlsZU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5oZWxwRmlsZU9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+aGVscEZpbGVMZW5ndGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuaGVscEZpbGVMZW5ndGgpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlJQQ0RhdGFPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuUlBDRGF0YU9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+UlBDRGF0YUxlbmd0aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5SUENEYXRhTGVuZ3RoKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRDb2RlT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZENvZGVPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZENvZGVMZW5ndGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkQ29kZUxlbmd0aCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGF0YU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREYXRhT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREYXRhTGVuZ3RoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERhdGFMZW5ndGgpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFJlbG9jYXRpb25GaXh1cENvdW50ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZFJlbG9jYXRpb25GaXh1cENvdW50KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZU9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZUNvdW50KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRQdWJsaWNzT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZFB1YmxpY3NPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFB1YmxpY3NDb3VudCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRQdWJsaWNzQ291bnQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZENvdW50ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERlYnVnUmVjb3JkQ291bnQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5TaGFyZWRFeGl0UHJvY2VkdXJlT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLlNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnByb2R1Y3RJRCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5wcm9kdWN0SUQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnJlc2VydmVkMCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDApOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnJlc2VydmVkMSA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDEpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnJlc2VydmVkMiA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDIpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnJlc2VydmVkMyA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDMpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnJlc2VydmVkNCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnJlc2VydmVkNSA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5yZXNlcnZlZDUpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHRlbXBzdHIsICJDb1B5UmlHaFQ9IiwgMTApID09IDApCi0JewotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPnN0YW1wLAotCQkJc2l6ZW9mIChubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPnN0YW1wKSwKLQkJCTEsIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIChubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPnN0YW1wKSkKLQkgICAgcmV0dXJuIChmYWxzZSk7Ci0JICBpZiAoYmZkX3JlYWQgKChQVFIpICYgKG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKQotCQkJCSAtPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGgpLAotCQkJMSwgMSwgYWJmZCkgIT0gMSkKLQkgICAgcmV0dXJuIChmYWxzZSk7Ci0JICAvKiBUaGUgY29weXJpZ2h0IG1lc3NhZ2UgaXMgYSB2YXJpYWJsZSBsZW5ndGggc3RyaW5nLiAqLwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2UsCi0JCSAgICBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGggKyAxLAotCQkJMSwgYWJmZCkgIT0KLQkgICAgICAoKGJmZF9zaXplX3R5cGUpCi0JICAgICAgIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCArIDEpKQotCSAgICByZXR1cm4gKGZhbHNlKTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wICh0ZW1wc3RyLCAiQ3VTdEhlQWQiLCA4KSA9PSAwKQotCXsKLQkgIE5sbV9FeHRlcm5hbF9DdXN0b21fSGVhZGVyIHRoZHI7Ci0JICBiZmRfc2l6ZV90eXBlIGhkckxlbmd0aDsKLQkgIGZpbGVfcHRyIGRhdGFPZmZzZXQ7Ci0JICBiZmRfc2l6ZV90eXBlIGRhdGFMZW5ndGg7Ci0JICBjaGFyIGRhdGFTdGFtcFs4XTsKLQkgIFBUUiBoZHI7Ci0KLQkgIC8qIFJlYWQgdGhlIHN0YW1wICgiQ3VTdEhlQWQiKS4gICovCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpIHRoZHIuc3RhbXAsIDEsIHNpemVvZiAodGhkci5zdGFtcCksIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mICh0aGRyLnN0YW1wKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogUmVhZCB0aGUgbGVuZ3RoIG9mIHRoaXMgY3VzdG9tIGhlYWRlci4gICovCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpIHRoZHIubGVuZ3RoLCAxLCBzaXplb2YgKHRoZHIubGVuZ3RoKSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKHRoZHIubGVuZ3RoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaGRyTGVuZ3RoID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmxlbmd0aCk7Ci0JICAvKiBSZWFkIGZ1cnRoZXIgZmllbGRzIGlmIHdlIGhhdmUgdGhlbS4gICovCi0JICBpZiAoaGRyTGVuZ3RoIDwgTkxNX1RBUkdFVF9MT05HX1NJWkUpCi0JICAgIGRhdGFPZmZzZXQgPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSB0aGRyLmRhdGFPZmZzZXQsIDEsCi0JCQkgICAgc2l6ZW9mICh0aGRyLmRhdGFPZmZzZXQpLCBhYmZkKQotCQkgICE9IHNpemVvZiAodGhkci5kYXRhT2Zmc2V0KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGRhdGFPZmZzZXQgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuZGF0YU9mZnNldCk7Ci0JICAgIH0KLQkgIGlmIChoZHJMZW5ndGggPCAyICogTkxNX1RBUkdFVF9MT05HX1NJWkUpCi0JICAgIGRhdGFMZW5ndGggPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSB0aGRyLmRhdGFMZW5ndGgsIDEsCi0JCQkgICAgc2l6ZW9mICh0aGRyLmRhdGFMZW5ndGgpLCBhYmZkKQotCQkgICE9IHNpemVvZiAodGhkci5kYXRhTGVuZ3RoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGRhdGFMZW5ndGggPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuZGF0YUxlbmd0aCk7Ci0JICAgIH0KLQkgIGlmIChoZHJMZW5ndGggPCAyICogTkxNX1RBUkdFVF9MT05HX1NJWkUgKyA4KQotCSAgICBtZW1zZXQgKGRhdGFTdGFtcCwgMCwgc2l6ZW9mIChkYXRhU3RhbXApKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgZGF0YVN0YW1wLCAxLCBzaXplb2YgKGRhdGFTdGFtcCksIGFiZmQpCi0JCSAgIT0gc2l6ZW9mIChkYXRhU3RhbXApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogUmVhZCB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyLCBpZiBhbnkuICAqLwotCSAgaWYgKGhkckxlbmd0aCA8PSAyICogTkxNX1RBUkdFVF9MT05HX1NJWkUgKyA4KQotCSAgICB7Ci0JICAgICAgaGRyID0gTlVMTDsKLQkgICAgICBoZHJMZW5ndGggPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBoZHJMZW5ndGggLT0gMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgODsKLQkgICAgICBoZHIgPSBiZmRfYWxsb2MgKGFiZmQsIGhkckxlbmd0aCk7Ci0JICAgICAgaWYgKGhkciA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIGhkckxlbmd0aCwgYWJmZCkgIT0gaGRyTGVuZ3RoKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgaGF2ZSBmb3VuZCBhIEN5Z251cyBoZWFkZXIsIHByb2Nlc3MgaXQuICBPdGhlcndpc2UsCi0JICAgICBqdXN0IHNhdmUgdGhlIGFzc29jaWF0ZWQgZGF0YSB3aXRob3V0IHRyeWluZyB0byBpbnRlcnByZXQKLQkgICAgIGl0LiAgKi8KLQkgIGlmIChzdHJuY21wIChkYXRhU3RhbXAsICJDeUduVXNFeCIsIDgpID09IDApCi0JICAgIHsKLQkgICAgICBmaWxlX3B0ciBwb3M7Ci0JICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotCSAgICAgIGJmZF9ieXRlICpwLCAqcGVuZDsKLQotCSAgICAgIEJGRF9BU1NFUlQgKGhkckxlbmd0aCA9PSAwICYmIGhkciA9PSBOVUxMKTsKLQotCSAgICAgIHBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGRhdGFPZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBkYXRhTGVuZ3RoKTsKLQkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChiZmRfcmVhZCAoY29udGVudHMsIDEsIGRhdGFMZW5ndGgsIGFiZmQpICE9IGRhdGFMZW5ndGgpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHBvcywgU0VFS19TRVQpICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIG1lbWNweSAobmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKSwgIkN5R25Vc0V4IiwgOCk7Ci0JICAgICAgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+b2Zmc2V0ID0gZGF0YU9mZnNldDsKLQkgICAgICBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKGFiZmQpLT5sZW5ndGggPSBkYXRhTGVuZ3RoOwotCi0JICAgICAgLyogVGhpcyBkYXRhIHRoaXMgaGVhZGVyIHBvaW50cyB0byBwcm92aWRlcyBhIGxpc3Qgb2YKLQkJIHRoZSBzZWN0aW9ucyB3aGljaCB3ZXJlIGluIHRoZSBvcmlnaW5hbCBvYmplY3QgZmlsZQotCQkgd2hpY2ggd2FzIGNvbnZlcnRlZCB0byBiZWNvbWUgYW4gTkxNLiAgV2UgbG9jYXRlCi0JCSB0aG9zZSBzZWN0aW9ucyBhbmQgYWRkIHRoZW0gdG8gdGhlIEJGRC4gIE5vdGUgdGhhdAotCQkgdGhpcyBpcyBsaWtlbHkgdG8gY3JlYXRlIGEgc2Vjb25kIC50ZXh0LCAuZGF0YSBhbmQKLQkJIC5ic3Mgc2VjdGlvbjsgcmV0cmlldmluZyB0aGUgc2VjdGlvbnMgYnkgbmFtZSB3aWxsCi0JCSBnZXQgdGhlIGFjdHVhbCBOTE0gc2VjdGlvbnMsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudCB0bwotCQkgaGFwcGVuLiAgVGhlIHNlY3Rpb25zIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUsIHdoaWNoCi0JCSBtYXkgYmUgc3Vic2V0cyBvZiB0aGUgTkxNIHNlY3Rpb24sIGNhbiBvbmx5IGJlIGZvdW5kCi0JCSB1c2luZyBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCSAgICAgIHAgPSBjb250ZW50czsKLQkgICAgICBwZW5kID0gcCArIGRhdGFMZW5ndGg7Ci0JICAgICAgd2hpbGUgKHAgPCBwZW5kKQotCQl7Ci0JCSAgY2hhciAqbmFtZTsKLQkJICBzaXplX3QgbDsKLQkJICBmaWxlX3B0ciBmaWxlcG9zOwotCQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQkJICBhc2VjdGlvbiAqbmV3c2VjOwotCi0JCSAgLyogVGhlIGZvcm1hdCBvZiB0aGlzIGluZm9ybWF0aW9uIGlzCi0JCSAgICAgbnVsbCB0ZXJtaW5hdGVkIHNlY3Rpb24gbmFtZQotCQkgICAgIHplcm9lcyB0byBhZGp1c3QgdG8gNCBieXRlIGJvdW5kYXJ5Ci0JCSAgICAgNCBieXRlIHNlY3Rpb24gZGF0YSBmaWxlIHBvaW50ZXIKLQkJICAgICA0IGJ5dGUgc2VjdGlvbiBzaXplCi0JCSAgICAgKi8KLQotCQkgIG5hbWUgPSAoY2hhciAqKSBwOwotCQkgIGwgPSBzdHJsZW4gKG5hbWUpICsgMTsKLQkJICBsID0gKGwgKyAzKSAmfiAzOwotCQkgIHAgKz0gbDsKLQkJICBmaWxlcG9zID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBwKTsKLQkJICBwICs9IDQ7Ci0JCSAgc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcCk7Ci0JCSAgcCArPSA0OwotCi0JCSAgbmV3c2VjID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotCQkgIGlmIChuZXdzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgbmV3c2VjLT5fcmF3X3NpemUgPSBzaXplOwotCQkgIGlmIChmaWxlcG9zICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIG5ld3NlYy0+ZmlsZXBvcyA9IGZpbGVwb3M7Ci0JCSAgICAgIG5ld3NlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtZW1jcHkgKG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+c3RhbXAsIHRoZHIuc3RhbXAsCi0JCSAgICAgIHNpemVvZiAodGhkci5zdGFtcCkpOwotCSAgICAgIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoID0gaGRyTGVuZ3RoOwotCSAgICAgIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YU9mZnNldCA9IGRhdGFPZmZzZXQ7Ci0JICAgICAgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhTGVuZ3RoID0gZGF0YUxlbmd0aDsKLQkgICAgICBtZW1jcHkgKG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YVN0YW1wLCBkYXRhU3RhbXAsCi0JCSAgICAgIHNpemVvZiAoZGF0YVN0YW1wKSk7Ci0JICAgICAgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHIgPSBoZHI7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgdGhlcmUgaXMgYSBub24temVybyBieXRlIGluIGEgbWVtb3J5IGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWZpbmRfbm9uemVybyAoYnVmLCBzaXplKQotICAgICBQVFIgYnVmOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgY2hhciAqcCA9IChjaGFyICopIGJ1ZjsKLQotICB3aGlsZSAoc2l6ZS0tICE9IDApCi0gICAgaWYgKCpwKysgIT0gMCkKLSAgICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMuICBXZSBjcmVhdGUgdGhvc2UKLSAgIGF1eGlsaWFyeSBoZWFkZXJzIHdoaWNoIGhhdmUgYmVlbiBzZXQgbm9uLXplcm8uICBXZSBkbyBub3QgcmVxdWlyZQotICAgdGhlIGNhbGxlciB0byBzZXQgdXAgdGhlIHN0YW1wIGZpZWxkcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogV3JpdGUgb3V0IHRoZSB2ZXJzaW9uIGhlYWRlciBpZiB0aGVyZSBpcyBvbmUuICAqLwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIpKSkKLSAgICB7Ci0gICAgICBObG1fRXh0ZXJuYWxfVmVyc2lvbl9IZWFkZXIgdGhkcjsKLQotICAgICAgbWVtY3B5ICh0aGRyLnN0YW1wLCAiVmVSc0lvTiMiLCA4KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bWFqb3JWZXJzaW9uLAotCQkoYmZkX2J5dGUgKikgdGhkci5tYWpvclZlcnNpb24pOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5taW5vclZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSB0aGRyLm1pbm9yVmVyc2lvbik7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPnJldmlzaW9uLAotCQkoYmZkX2J5dGUgKikgdGhkci5yZXZpc2lvbik7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPnllYXIsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnllYXIpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5tb250aCwKLQkJKGJmZF9ieXRlICopIHRoZHIubW9udGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5kYXksCi0JCShiZmRfYnl0ZSAqKSB0aGRyLmRheSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIHRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGV4dGVuZGVkIGhlYWRlciBpZiB0aGVyZSBpcyBvbmUuICAqLwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0V4dGVuZGVkX0hlYWRlcikpKQotICAgIHsKLSAgICAgIE5sbV9FeHRlcm5hbF9FeHRlbmRlZF9IZWFkZXIgdGhkcjsKLQotICAgICAgbWVtY3B5ICh0aGRyLnN0YW1wLCAiTWVTc0FnRXMiLCA4KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmxhbmd1YWdlSUQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLmxhbmd1YWdlSUQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUZpbGVPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VGaWxlT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VGaWxlTGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlRmlsZUxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlQ291bnQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VDb3VudCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5oZWxwRmlsZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuaGVscEZpbGVPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+aGVscEZpbGVMZW5ndGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLmhlbHBGaWxlTGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlJQQ0RhdGFPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLlJQQ0RhdGFPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+UlBDRGF0YUxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIuUlBDRGF0YUxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRDb2RlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRDb2RlT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZENvZGVMZW5ndGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZENvZGVMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGF0YU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGF0YU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREYXRhTGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREYXRhTGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCSAgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkgICAoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFJlbG9jYXRpb25GaXh1cENvdW50LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZUNvdW50LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZUNvdW50KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFB1YmxpY3NPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZFB1YmxpY3NPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUHVibGljc0NvdW50LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRQdWJsaWNzQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAgICAgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGVidWdSZWNvcmRPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGVidWdSZWNvcmRDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGVidWdSZWNvcmRDb3VudCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkgICAoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkgICAgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5TaGFyZWRFeGl0UHJvY2VkdXJlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5TaGFyZWRFeGl0UHJvY2VkdXJlT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnByb2R1Y3RJRCwKLQkJKGJmZF9ieXRlICopIHRoZHIucHJvZHVjdElEKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnJlc2VydmVkMCwKLQkJKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQwKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnJlc2VydmVkMSwKLQkJKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQxKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnJlc2VydmVkMiwKLQkJKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQyKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnJlc2VydmVkMywKLQkJKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQzKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnJlc2VydmVkNCwKLQkJKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQ0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnJlc2VydmVkNSwKLQkJKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQ1KTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICYgdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgLyogV3JpdGUgb3V0IHRoZSBjb3B5cmlnaHQgaGVhZGVyIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIpKSkKLSAgICB7Ci0gICAgICBObG1fRXh0ZXJuYWxfQ29weXJpZ2h0X0hlYWRlciB0aGRyOwotCi0gICAgICBtZW1jcHkgKHRoZHIuc3RhbXAsICJDb1B5UmlHaFQ9IiwgMTApOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGhkci5zdGFtcCwgc2l6ZW9mICh0aGRyLnN0YW1wKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAodGhkci5zdGFtcCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdGhkci5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoWzBdID0KLQlubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGg7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0aGRyLmNvcHlyaWdodE1lc3NhZ2VMZW5ndGgsIDEsIDEsIGFiZmQpICE9IDEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLyogVGhlIGNvcHlyaWdodCBtZXNzYWdlIGlzIGEgdmFyaWFibGUgbGVuZ3RoIHN0cmluZy4gKi8KLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZSwKLQkJICAgICBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGggKyAxLAotCQkgICAgIDEsIGFiZmQpICE9Ci0JICAoKGJmZF9zaXplX3R5cGUpCi0JICAgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGN1c3RvbSBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgICovCi0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0N1c3RvbV9IZWFkZXIpKSkKLSAgICB7Ci0gICAgICBObG1fRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlciB0aGRyOwotICAgICAgYm9vbGVhbiBkczsKLSAgICAgIGJmZF9zaXplX3R5cGUgaGRyTGVuZ3RoOwotCi0gICAgICBkcyA9IGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhU3RhbXAsCi0JCQkgc2l6ZW9mIChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFTdGFtcCkpOwotICAgICAgbWVtY3B5ICh0aGRyLnN0YW1wLCAiQ3VTdEhlQWQiLCA4KTsKLSAgICAgIGhkckxlbmd0aCA9ICgyICogTkxNX1RBUkdFVF9MT05HX1NJWkUgKyAoZHMgPyA4IDogMCkKLQkJICAgKyBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkckxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgaGRyTGVuZ3RoLCB0aGRyLmxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YU9mZnNldCwKLQkJdGhkci5kYXRhT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhTGVuZ3RoLAotCQl0aGRyLmRhdGFMZW5ndGgpOwotICAgICAgaWYgKCEgZHMpCi0JewotCSAgQkZEX0FTU0VSVCAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGggPT0gMCk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdGhkciwgMSwKLQkJCSBzaXplb2YgKHRoZHIpIC0gc2l6ZW9mICh0aGRyLmRhdGFTdGFtcCksIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mICh0aGRyKSAtIHNpemVvZiAodGhkci5kYXRhU3RhbXApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAodGhkci5kYXRhU3RhbXAsIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YVN0YW1wLAotCQkgIHNpemVvZiAodGhkci5kYXRhU3RhbXApKTsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0aGRyLCBzaXplb2YgKHRoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRoZHIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoYmZkX3dyaXRlIChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkciwgMSwKLQkJCSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkckxlbmd0aCwgYWJmZCkKLQkgICAgICAhPSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkckxlbmd0aCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBDeWdudXMgZGVidWdnaW5nIGhlYWRlciBpZiB0aGVyZSBpcyBvbmUuICAqLwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIpKSkKLSAgICB7Ci0gICAgICBObG1fRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlciB0aGRyOwotCi0gICAgICBtZW1jcHkgKHRoZHIuc3RhbXAsICJDdVN0SGVBZCIsIDgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSAyICogTkxNX1RBUkdFVF9MT05HX1NJWkUgKyA4LAotCQkoYmZkX2J5dGUgKikgdGhkci5sZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKGFiZmQpLT5vZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLmRhdGFPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKGFiZmQpLT5sZW5ndGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLmRhdGFMZW5ndGgpOwotICAgICAgbWVtY3B5ICh0aGRyLmRhdGFTdGFtcCwgIkN5R25Vc0V4IiwgOCk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSByZWFkIHRoZSBOTE0ncyBwdWJsaWMgc3ltYm9scyBhbmQgdXNlIGl0IHRvIGdlbmVyYXRlIGEgYmZkIHN5bWJvbAotICAgdGFibGUgKGhleSwgaXQncyBiZXR0ZXIgdGhhbiBub3RoaW5nKSBvbiBhIG9uZS1mb3Itb25lIGJhc2lzLiAgVGh1cwotICAgdXNlIHRoZSBudW1iZXIgb2YgcHVibGljIHN5bWJvbHMgYXMgdGhlIG51bWJlciBvZiBiZmQgc3ltYm9scyB3ZSB3aWxsCi0gICBoYXZlIG9uY2Ugd2UgYWN0dWFsbHkgZ2V0IGFyb3VuZCB0byByZWFkaW5nIHRoZW0gaW4uCi0KLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGhvbGQgdGhlIHN5bXRhYiB2ZWN0b3IsIGJhc2VkIG9uCi0gICB0aGUgY291bnQgcGx1cyAxLCBzaW5jZSB3ZSB3aWxsIE5VTEwgdGVybWluYXRlIHRoZSB2ZWN0b3IgYWxsb2NhdGVkIGJhc2VkCi0gICBvbiB0aGlzIHNpemUuICovCi0KLWxvbmcKLW5sbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKmlfZnhkaGRycDsJLyogTmxtIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIGxvbmcgc3ltY291bnQ7Ci0gIGxvbmcgc3ltdGFiX3NpemUgPSAwOwotCi0gIGlfZnhkaGRycCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpOwotICBzeW1jb3VudCA9IChpX2Z4ZGhkcnAtPm51bWJlck9mUHVibGljcwotCSAgICAgICsgaV9meGRoZHJwLT5udW1iZXJPZkRlYnVnUmVjb3JkcwotCSAgICAgICsgaV9meGRoZHJwLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyk7Ci0gIHN5bXRhYl9zaXplID0gKHN5bWNvdW50ICsgMSkgKiAoc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIHJldHVybiAoc3ltdGFiX3NpemUpOwotfQotCi0vKiBOb3RlIHRoYXQgYmZkX2dldF9zeW1jb3VudCBpcyBndWFyYW50ZWVkIHRvIGJlIHplcm8gaWYgc2x1cnBpbmcgdGhlCi0gICBzeW1ib2wgdGFibGUgZmFpbHMuICovCi0KLWxvbmcKLW5sbV9nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgbmxtX3N5bWJvbF90eXBlICpzeW1iYXNlOwotICBiZmRfc2l6ZV90eXBlIGNvdW50ZXIgPSAwOwotCi0gIGlmIChubG1fc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gLTE7Ci0gIHN5bWJhc2UgPSBubG1fZ2V0X3N5bWJvbHMgKGFiZmQpOwotICB3aGlsZSAoY291bnRlciA8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKQotICAgIHsKLSAgICAgICphbG9jYXRpb24rKyA9ICZzeW1iYXNlLT5zeW1ib2w7Ci0gICAgICBzeW1iYXNlKys7Ci0gICAgICBjb3VudGVyKys7Ci0gICAgfQotICAqYWxvY2F0aW9uID0gKGFzeW1ib2wgKikgTlVMTDsKLSAgcmV0dXJuIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotfQotCi0vKiBNYWtlIGFuIE5MTSBzeW1ib2wuICBUaGVyZSBpcyBub3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZS4gICovCi0KLWFzeW1ib2wgKgotbmxtX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIG5sbV9zeW1ib2xfdHlwZSAqbmV3OwotCi0gIG5ldyA9IChubG1fc3ltYm9sX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChubG1fc3ltYm9sX3R5cGUpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotLyogR2V0IHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0KLXZvaWQKLW5sbV9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi0vKiBQcmludCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCi12b2lkCi1ubG1fcHJpbnRfc3ltYm9sIChhYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGlmIChzeW1ib2wtPm5hbWUpCi0JZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlLTVzIiwgc3ltYm9sLT5zZWN0aW9uLT5uYW1lKTsKLSAgICAgIGlmIChzeW1ib2wtPm5hbWUpCi0JZnByaW50ZiAoZmlsZSwgIiAlcyIsIHN5bWJvbC0+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+ZmxhZ3MpOwotfQpkaWZmIC0tZ2l0IGEvYmZkL25zMzJrLmggYi9iZmQvbnMzMmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzYmEwOS4uMDAwMDAwMAotLS0gYS9iZmQvbnMzMmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIEhlYWRlciBmaWxlIGZvciBuczMyayByb3V0aW5lcy4KLSAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfZG9fbnMzMmtfcmVsb2NfY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKiwKLQkgICBsb25nICgqKSBQQVJBTVMgKChiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSksCi0JICAgaW50ICgqKSBQQVJBTVMgKChsb25nLCBiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSkpKTsKLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX25zMzJrX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSwKLQkgICBiZmRfdm1hLCBiZmRfdm1hKSk7Ci0KLWV4dGVybiBsb25nIF9iZmRfbnMzMmtfZ2V0X2Rpc3BsYWNlbWVudCBQQVJBTVMgKChiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSk7Ci1leHRlcm4gbG9uZyBfYmZkX25zMzJrX2dldF9pbW1lZGlhdGUgUEFSQU1TICgoYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotZXh0ZXJuIGludCBfYmZkX25zMzJrX3B1dF9kaXNwbGFjZW1lbnQgUEFSQU1TICgobG9uZywgYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotZXh0ZXJuIGludCBfYmZkX25zMzJrX3B1dF9pbW1lZGlhdGUgUEFSQU1TICgobG9uZywgYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbnMzMmtfcmVsb2NfZGlzcAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9uczMya19yZWxvY19pbW0KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CmRpZmYgLS1naXQgYS9iZmQvbnMzMmtuZXRic2QuYyBiL2JmZC9uczMya25ldGJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjIzNTZkLi4wMDAwMDAwCi0tLSBhL2JmZC9uczMya25ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbnMzMmsgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJNDA5NgotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9uczMyawotI2RlZmluZQlERUZBVUxUX01JRCAJTV81MzJfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChwYzUzMm5ldGJzZF8sT1ApCi0KLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMobnMzMmthb3V0LF8zMl8seSkKLQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbnMzMmstbmV0YnNkIgotCi0jZGVmaW5lIG5zMzJrYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgMQotCi0vKiBXZSBjYW5gdCB1c2UgdGhlIE1ZTlMgbWFjcm8gaGVyZSBmb3IgY3BwIHJlYXNvbnMgdG9vIHN1YnRsZQotICogZm9yIG1lIC0tIElXRAotICovCi0jZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCBuczMya2FvdXRfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNpbmNsdWRlICJiZmQuaCIJCS8qIFRvIGVuc3VyZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gaXMgT0sgKi8KLQotQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqCi1NWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TKChiZmQgKmFiZmQgQU5ECi0JICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9vYXN5cy5jIGIvYmZkL29hc3lzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OTA1M2IuLjAwMDAwMDAKLS0tIGEvYmZkL29hc3lzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTM3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3Igb2FzeXMgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCwgPHNhY0BjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFVOREVSU0NPUkVfSEFDSyAxCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJvYXN5cy5oIgotI2luY2x1ZGUgImxpYm9hc3lzLmgiCi0KLS8qIFhYWCAtIEZJWE1FLiAgb2Zmc2V0b2YgYmVsb25ncyBpbiB0aGUgc3lzdGVtLXNwZWNpZmljIGZpbGVzIGluCi0gICAuLi9pbmNsdWRlL3N5cy4gKi8KLS8qIERlZmluZSBvZmZzZXRvZiBmb3IgdGhvc2Ugc3lzdGVtcyB3aGljaCBsYWNrIGl0ICovCi0KLSNpZm5kZWYgb2Zmc2V0b2YKLSNkZWZpbmUgb2Zmc2V0b2YodHlwZSwgaWRlbnRpZmllcikgKHNpemVfdCkgJigoKHR5cGUgKikgMCktPmlkZW50aWZpZXIpCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gb2FzeXNfcmVhZF9yZWNvcmQgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfc2VjdGlvbnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX3JlY29yZCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgb2FzeXNfcmVjb3JkX2VudW1fdHlwZSwKLQkJCQkJICAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKiwKLQkJCQkJICAgc2l6ZV90KSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9zeW1zIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9oZWFkZXIgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX2VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfZGF0YSBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSZWFkIGluIGFsbCB0aGUgc2VjdGlvbiBkYXRhIGFuZCByZWxvY2F0aW9uIHN0dWZmIHRvbyAqLwotUFJPVE8gKHN0YXRpYyBib29sZWFuLCBvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEsIChiZmQgKiBDT05TVCBhYmZkKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19yZWFkX3JlY29yZCAoYWJmZCwgcmVjb3JkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlICpyZWNvcmQ7Ci17Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgcmVjb3JkLCAxLCBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAocmVjb3JkLT5oZWFkZXIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKHNpemVfdCkgcmVjb3JkLT5oZWFkZXIubGVuZ3RoIDw9IChzaXplX3QpIHNpemVvZiAocmVjb3JkLT5oZWFkZXIpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoYmZkX3JlYWQgKChQVFIpICgoKGNoYXIgKikgcmVjb3JkKSArIHNpemVvZiAocmVjb3JkLT5oZWFkZXIpKSwKLQkJMSwgcmVjb3JkLT5oZWFkZXIubGVuZ3RoIC0gc2l6ZW9mIChyZWNvcmQtPmhlYWRlciksCi0JCWFiZmQpCi0gICAgICAhPSByZWNvcmQtPmhlYWRlci5sZW5ndGggLSBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotc3RhdGljIHNpemVfdAotb2FzeXNfc3RyaW5nX2xlbmd0aCAocmVjb3JkKQotICAgICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqcmVjb3JkOwotewotICByZXR1cm4gcmVjb3JkLT5oZWFkZXIubGVuZ3RoCi0gICAgLSAoKGNoYXIgKikgcmVjb3JkLT5zeW1ib2wubmFtZSAtIChjaGFyICopIHJlY29yZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLQotU2x1cnAgdGhlIHN5bWJvbCB0YWJsZSBieSByZWFkaW5nIGluIGFsbCB0aGUgcmVjb3JkcyBhdCB0aGUgc3RhcnQgZmlsZQotdGlsbCB3ZSBnZXQgdG8gdGhlIGZpcnN0IHNlY3Rpb24gcmVjb3JkLgotCi1XZSdsbCBzb3J0IHRoZSBzeW1ib2xzcyBpbnRvICB0d28gbGlzdHMsIGRlZmluZWQgYW5kIHVuZGVmaW5lZC4gVGhlCi11bmRlZmluZWQgc3ltYm9scyB3aWxsIGJlIHBsYWNlZCBpbnRvIHRoZSB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlaXIKLXJlZm5vLgotCi1XZSBkbyB0aGlzIGJ5IHBsYWNpbmcgYWxsIHVuZGVmaW5lZCBzeW1ib2xzIGF0IHRoZSBmcm9udCBvZiB0aGUgdGFibGUKLW1vdmluZyBpbiwgYW5kIHRoZSBkZWZpbmVkIHN5bWJvbHMgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUgbW92aW5nIGJhY2suCi0KLSovCi0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqQ09OU1QgYWJmZDsKLXsKLSAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgcmVjb3JkOwotICBvYXN5c19kYXRhX3R5cGUgKmRhdGEgPSBPQVNZU19EQVRBIChhYmZkKTsKLSAgYm9vbGVhbiBsb29wID0gdHJ1ZTsKLSAgYXN5bWJvbCAqZGVzdF9kZWZpbmVkOwotICBhc3ltYm9sICpkZXN0OwotICBjaGFyICpzdHJpbmdfcHRyOwotCi0KLSAgaWYgKGRhdGEtPnN5bWJvbHMgIT0gKGFzeW1ib2wgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIC8qIEJ1eSBlbm91Z2ggbWVtb3J5IGZvciBhbGwgdGhlIHN5bWJvbHMgYW5kIGFsbCB0aGUgbmFtZXMgKi8KLSAgZGF0YS0+c3ltYm9scyA9Ci0gICAgKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpICogYWJmZC0+c3ltY291bnQpOwotI2lmZGVmIFVOREVSU0NPUkVfSEFDSwotICAvKiBidXkgMSBtb3JlIGNoYXIgZm9yIGVhY2ggc3ltYm9sIHRvIGtlZXAgdGhlIHVuZGVyc2NvcmUgaW4qLwotICBkYXRhLT5zdHJpbmdzID0gYmZkX2FsbG9jIChhYmZkLCBkYXRhLT5zeW1ib2xfc3RyaW5nX2xlbmd0aCArCi0JCQkgICAgIGFiZmQtPnN5bWNvdW50KTsKLSNlbHNlCi0gIGRhdGEtPnN0cmluZ3MgPSBiZmRfYWxsb2MgKGFiZmQsIGRhdGEtPnN5bWJvbF9zdHJpbmdfbGVuZ3RoKTsKLSNlbmRpZgotICBpZiAoIWRhdGEtPnN5bWJvbHMgfHwgIWRhdGEtPnN0cmluZ3MpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGRlc3RfZGVmaW5lZCA9IGRhdGEtPnN5bWJvbHMgKyBhYmZkLT5zeW1jb3VudCAtIDE7Ci0KLSAgc3RyaW5nX3B0ciA9IGRhdGEtPnN0cmluZ3M7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHdoaWxlIChsb29wKQotICAgIHsKLQotICAgICAgaWYgKCEgb2FzeXNfcmVhZF9yZWNvcmQgKGFiZmQsICZyZWNvcmQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN3aXRjaCAocmVjb3JkLmhlYWRlci50eXBlKQotCXsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19oZWFkZXJfZW51bToKLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW06Ci0JICB7Ci0JICAgIGludCBmbGFnID0gcmVjb3JkLmhlYWRlci50eXBlID09IChpbnQpIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtID8KLQkgICAgKEJTRl9MT0NBTCkgOiAoQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQpOwotCi0KLQkgICAgc2l6ZV90IGxlbmd0aCA9IG9hc3lzX3N0cmluZ19sZW5ndGggKCZyZWNvcmQpOwotCSAgICBzd2l0Y2ggKHJlY29yZC5zeW1ib2wucmVsYiAmIFJFTE9DQVRJT05fVFlQRV9CSVRTKQotCSAgICAgIHsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9BQlM6Ci0JCWRlc3QgPSBkZXN0X2RlZmluZWQtLTsKLQkJZGVzdC0+c2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCWRlc3QtPmZsYWdzID0gMDsKLQotCQlicmVhazsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9SRUw6Ci0JCWRlc3QgPSBkZXN0X2RlZmluZWQtLTsKLQkJZGVzdC0+c2VjdGlvbiA9Ci0JCSAgT0FTWVNfREFUQSAoYWJmZCktPnNlY3Rpb25zW3JlY29yZC5zeW1ib2wucmVsYiAmCi0JCQkJCSAgICAgIFJFTE9DQVRJT05fU0VDVF9CSVRTXTsKLQkJaWYgKHJlY29yZC5oZWFkZXIudHlwZSA9PSAoaW50KSBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bSkKLQkJICB7Ci0JCSAgICBkZXN0LT5mbGFncyA9IEJTRl9MT0NBTDsKLQkJICAgIGlmIChkZXN0LT5zZWN0aW9uID09IChhc2VjdGlvbiAqKSAofjApKQotCQkgICAgICB7Ci0JCQkvKiBJdCBzZWVtcyB0aGF0IHNvbWV0aW1lcyBpbnRlcm5hbCBzeW1ib2xzIGFyZSB0aWVkIHVwLCBidXQKLQkJICAgICAgIHN0aWxsIGdldCBvdXRwdXQsIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIG5vCi0JCSAgICAgICBzZWN0aW9uICovCi0JCQlkZXN0LT5zZWN0aW9uID0gMDsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQotCQkgICAgZGVzdC0+ZmxhZ3MgPSBmbGFnOwotCQkgIH0KLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfVU5EOgotCQlkZXN0ID0gZGF0YS0+c3ltYm9scyArIGJmZF9oX2dldF8xNiAoYWJmZCwgcmVjb3JkLnN5bWJvbC5yZWZubyk7Ci0JCWRlc3QtPnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQlicmVhazsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9DT006Ci0JCWRlc3QgPSBkZXN0X2RlZmluZWQtLTsKLQkJZGVzdC0+bmFtZSA9IHN0cmluZ19wdHI7Ci0JCWRlc3QtPnRoZV9iZmQgPSBhYmZkOwotCi0JCWRlc3QtPnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCi0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCWRlc3QgPSBkZXN0X2RlZmluZWQtLTsKLQkJQkZEX0FTU0VSVCAoMCk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgZGVzdC0+bmFtZSA9IHN0cmluZ19wdHI7Ci0JICAgIGRlc3QtPnRoZV9iZmQgPSBhYmZkOwotCSAgICBkZXN0LT51ZGF0YS5wID0gKFBUUikgTlVMTDsKLQkgICAgZGVzdC0+dmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZC5zeW1ib2wudmFsdWUpOwotCi0jaWZkZWYgVU5ERVJTQ09SRV9IQUNLCi0JICAgIGlmIChyZWNvcmQuc3ltYm9sLm5hbWVbMF0gIT0gJ18nKQotCSAgICAgIHsKLQkJc3RyaW5nX3B0clswXSA9ICdfJzsKLQkJc3RyaW5nX3B0cisrOwotCSAgICAgIH0KLSNlbmRpZgotCSAgICBtZW1jcHkgKHN0cmluZ19wdHIsIHJlY29yZC5zeW1ib2wubmFtZSwgbGVuZ3RoKTsKLQotCi0JICAgIHN0cmluZ19wdHJbbGVuZ3RoXSA9IDA7Ci0JICAgIHN0cmluZ19wdHIgKz0gbGVuZ3RoICsgMTsKLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBsb29wID0gZmFsc2U7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBsb25nCi1vYXN5c19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKkNPTlNUIGFiZmQ7Ci17Ci0gIGlmICghIG9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYWJmZC0+c3ltY291bnQgKyAxKSAqIChzaXplb2YgKG9hc3lzX3N5bWJvbF90eXBlICopKTsKLX0KLQotLyoKLSovCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG9hc3lzX3ZlYzsKLQotbG9uZwotb2FzeXNfZ2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmxvY2F0aW9uOwotewotICBhc3ltYm9sICpzeW1iYXNlOwotICB1bnNpZ25lZCBpbnQgY291bnRlcjsKLSAgaWYgKG9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgc3ltYmFzZSA9IE9BU1lTX0RBVEEgKGFiZmQpLT5zeW1ib2xzOwotICBmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgYWJmZC0+c3ltY291bnQ7IGNvdW50ZXIrKykKLSAgICB7Ci0gICAgICAqKGxvY2F0aW9uKyspID0gc3ltYmFzZSsrOwotICAgIH0KLSAgKmxvY2F0aW9uID0gMDsKLSAgcmV0dXJuIGFiZmQtPnN5bWNvdW50OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIGFyY2hpdmUgc3R1ZmYKLSovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLW9hc3lzX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBvYXN5c19hcmNoaXZlX2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgb2FzeXNfZXh0YXJjaGl2ZV9oZWFkZXJfdHlwZSBoZWFkZXJfZXh0OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgZmlsZV9wdHIgZmlsZXBvczsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgZmFsc2UpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoKFBUUikgJiBoZWFkZXJfZXh0LCAxLCBzaXplb2YgKGhlYWRlcl9leHQpLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChoZWFkZXJfZXh0KSkpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGhlYWRlci52ZXJzaW9uID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnZlcnNpb24pOwotICBoZWFkZXIubW9kX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0Lm1vZF9jb3VudCk7Ci0gIGhlYWRlci5tb2RfdGJsX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC5tb2RfdGJsX29mZnNldCk7Ci0gIGhlYWRlci5zeW1fdGJsX3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQuc3ltX3RibF9zaXplKTsKLSAgaGVhZGVyLnN5bV9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC5zeW1fY291bnQpOwotICBoZWFkZXIuc3ltX3RibF9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQuc3ltX3RibF9vZmZzZXQpOwotICBoZWFkZXIueHJlZl9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC54cmVmX2NvdW50KTsKLSAgaGVhZGVyLnhyZWZfbHN0X29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC54cmVmX2xzdF9vZmZzZXQpOwotCi0gIC8qCi0gICAgVGhlcmUgaXNuJ3QgYSBtYWdpYyBudW1iZXIgaW4gYW4gT2FzeXMgYXJjaGl2ZSwgc28gdGhlIGJlc3Qgd2UKLSAgICBjYW4gZG8gdG8gdmVyaWZ5IHJlYXNuYWJsZW5lc3MgaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlcyBpbgotICAgIHRoZSBoZWFkZXIgYXJlIHRvbyB3ZWlyZAotICAgICovCi0KLSAgaWYgKGhlYWRlci52ZXJzaW9uID4gMTAwMDAgfHwKLSAgICAgIGhlYWRlci5tb2RfY291bnQgPiAxMDAwMCB8fAotICAgICAgaGVhZGVyLnN5bV9jb3VudCA+IDEwMDAwMCB8fAotICAgICAgaGVhZGVyLnhyZWZfY291bnQgPiAxMDAwMDApCi0gICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0KLSAgLyoKLSAgICBUaGF0IGFsbCB3b3JrZWQsIGxldCdzIGJ1eSB0aGUgc3BhY2UgZm9yIHRoZSBoZWFkZXIgYW5kIHJlYWQgaW4KLSAgICB0aGUgaGVhZGVycy4KLSAgICAqLwotICB7Ci0gICAgb2FzeXNfYXJfZGF0YV90eXBlICphciA9Ci0gICAgKG9hc3lzX2FyX2RhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAob2FzeXNfYXJfZGF0YV90eXBlKSk7Ci0KLSAgICBvYXN5c19tb2R1bGVfaW5mb190eXBlICptb2R1bGUgPQotICAgIChvYXN5c19tb2R1bGVfaW5mb190eXBlICopCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX21vZHVsZV9pbmZvX3R5cGUpICogaGVhZGVyLm1vZF9jb3VudCk7Ci0gICAgb2FzeXNfbW9kdWxlX3RhYmxlX3R5cGUgcmVjb3JkOwotCi0gICAgaWYgKCFhciB8fCAhbW9kdWxlKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBhYmZkLT50ZGF0YS5vYXN5c19hcl9kYXRhID0gYXI7Ci0gICAgYXItPm1vZHVsZSA9IG1vZHVsZTsKLSAgICBhci0+bW9kdWxlX2NvdW50ID0gaGVhZGVyLm1vZF9jb3VudDsKLQotICAgIGZpbGVwb3MgPSBoZWFkZXIubW9kX3RibF9vZmZzZXQ7Ci0gICAgZm9yIChpID0gMDsgaSA8IGhlYWRlci5tb2RfY291bnQ7IGkrKykKLSAgICAgIHsKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIGZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotCSAgcmV0dXJuIE5VTEw7Ci0KLQkvKiBUaGVyZSBhcmUgdHdvIHdheXMgb2Ygc3BlY2lmeWluZyB0aGUgYXJjaGl2ZSBoZWFkZXIgKi8KLQotCWlmICgwKQotCSAgewotCSAgICBvYXN5c19leHRtb2R1bGVfdGFibGVfdHlwZV9hX3R5cGUgcmVjb3JkX2V4dDsKLQkgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHJlY29yZF9leHQsIDEsIHNpemVvZiAocmVjb3JkX2V4dCksIGFiZmQpCi0JCSE9IHNpemVvZiAocmVjb3JkX2V4dCkpCi0JICAgICAgcmV0dXJuIE5VTEw7Ci0KLQkgICAgcmVjb3JkLm1vZF9zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0Lm1vZF9zaXplKTsKLQkgICAgcmVjb3JkLmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmZpbGVfb2Zmc2V0KTsKLQotCSAgICByZWNvcmQuZGVwX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmRlcF9jb3VudCk7Ci0JICAgIHJlY29yZC5kZXBlZV9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5kZXBlZV9jb3VudCk7Ci0JICAgIHJlY29yZC5zZWN0X2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LnNlY3RfY291bnQpOwotCi0JICAgIG1vZHVsZVtpXS5uYW1lID0gYmZkX2FsbG9jIChhYmZkLCAzMyk7Ci0JICAgIGlmICghbW9kdWxlW2ldLm5hbWUpCi0JICAgICAgcmV0dXJuIE5VTEw7Ci0KLQkgICAgbWVtY3B5IChtb2R1bGVbaV0ubmFtZSwgcmVjb3JkX2V4dC5tb2RfbmFtZSwgMzMpOwotCSAgICBmaWxlcG9zICs9Ci0JICAgICAgc2l6ZW9mIChyZWNvcmRfZXh0KSArCi0JICAgICAgcmVjb3JkLmRlcF9jb3VudCAqIDQgKwotCSAgICAgIHJlY29yZC5kZXBlZV9jb3VudCAqIDQgKwotCSAgICAgIHJlY29yZC5zZWN0X2NvdW50ICogOCArIDE4NzsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIG9hc3lzX2V4dG1vZHVsZV90YWJsZV90eXBlX2JfdHlwZSByZWNvcmRfZXh0OwotCSAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgcmVjb3JkX2V4dCwgMSwgc2l6ZW9mIChyZWNvcmRfZXh0KSwgYWJmZCkKLQkJIT0gc2l6ZW9mIChyZWNvcmRfZXh0KSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQotCSAgICByZWNvcmQubW9kX3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQubW9kX3NpemUpOwotCSAgICByZWNvcmQuZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZmlsZV9vZmZzZXQpOwotCi0JICAgIHJlY29yZC5kZXBfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZGVwX2NvdW50KTsKLQkgICAgcmVjb3JkLmRlcGVlX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmRlcGVlX2NvdW50KTsKLQkgICAgcmVjb3JkLnNlY3RfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuc2VjdF9jb3VudCk7Ci0JICAgIHJlY29yZC5tb2R1bGVfbmFtZV9zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0Lm1vZF9uYW1lX2xlbmd0aCk7Ci0KLQkgICAgbW9kdWxlW2ldLm5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHJlY29yZC5tb2R1bGVfbmFtZV9zaXplICsgMSk7Ci0JICAgIGlmICghbW9kdWxlW2ldLm5hbWUpCi0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIGlmIChiZmRfcmVhZCAoKFBUUikgbW9kdWxlW2ldLm5hbWUsIDEsIHJlY29yZC5tb2R1bGVfbmFtZV9zaXplLAotCQkJICBhYmZkKQotCQkhPSByZWNvcmQubW9kdWxlX25hbWVfc2l6ZSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgbW9kdWxlW2ldLm5hbWVbcmVjb3JkLm1vZHVsZV9uYW1lX3NpemVdID0gMDsKLQkgICAgZmlsZXBvcyArPQotCSAgICAgIHNpemVvZiAocmVjb3JkX2V4dCkgKwotCSAgICAgIHJlY29yZC5kZXBfY291bnQgKiA0ICsKLQkgICAgICByZWNvcmQubW9kdWxlX25hbWVfc2l6ZSArIDE7Ci0KLQkgIH0KLQotCi0JbW9kdWxlW2ldLnNpemUgPSByZWNvcmQubW9kX3NpemU7Ci0JbW9kdWxlW2ldLnBvcyA9IHJlY29yZC5maWxlX29mZnNldDsKLQltb2R1bGVbaV0uYWJmZCA9IDA7Ci0gICAgICB9Ci0KLSAgfQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0KLSAgYWJmZC0+dGRhdGEub2FzeXNfb2JqX2RhdGEgPSAob2FzeXNfZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChvYXN5c19kYXRhX3R5cGUpKTsKLSAgcmV0dXJuIGFiZmQtPnRkYXRhLm9hc3lzX29ial9kYXRhID8gdHJ1ZSA6IGZhbHNlOwotfQotCi0jZGVmaW5lIE1BWF9TRUNTIDE2Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vYXN5c19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBvYXN5c19kYXRhX3R5cGUgKm9hc3lzOwotICBvYXN5c19kYXRhX3R5cGUgKnNhdmUgPSBPQVNZU19EQVRBIChhYmZkKTsKLSAgYm9vbGVhbiBsb29wID0gdHJ1ZTsKLSAgYm9vbGVhbiBoYWRfdXNlZnVsbCA9IGZhbHNlOwotCi0gIGFiZmQtPnRkYXRhLm9hc3lzX29ial9kYXRhID0gMDsKLSAgb2FzeXNfbWtvYmplY3QgKGFiZmQpOwotICBvYXN5cyA9IE9BU1lTX0RBVEEgKGFiZmQpOwotICBtZW1zZXQgKChQVFIpIG9hc3lzLT5zZWN0aW9ucywgMHhmZiwgc2l6ZW9mIChvYXN5cy0+c2VjdGlvbnMpKTsKLQotICAvKiBQb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZmFpbDsKLSAgb2FzeXMtPnN5bWJvbF9zdHJpbmdfbGVuZ3RoID0gMDsKLSAgLyogSW5zcGVjdCB0aGUgcmVjb3JkcywgYnV0IG9ubHkga2VlcCB0aGUgc2VjdGlvbiBpbmZvIC0KLSAgICAgcmVtZW1iZXIgdGhlIHNpemUgb2YgdGhlIHN5bWJvbHMKLSAgICAgKi8KLSAgb2FzeXMtPmZpcnN0X2RhdGFfcmVjb3JkID0gMDsKLSAgd2hpbGUgKGxvb3ApCi0gICAgewotICAgICAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgcmVjb3JkOwotICAgICAgaWYgKCEgb2FzeXNfcmVhZF9yZWNvcmQgKGFiZmQsICZyZWNvcmQpKQotCWdvdG8gZmFpbDsKLSAgICAgIGlmICgoc2l6ZV90KSByZWNvcmQuaGVhZGVyLmxlbmd0aCA8IChzaXplX3QpIHNpemVvZiAocmVjb3JkLmhlYWRlcikpCi0JZ290byBmYWlsOwotCi0KLSAgICAgIHN3aXRjaCAoKG9hc3lzX3JlY29yZF9lbnVtX3R5cGUpIChyZWNvcmQuaGVhZGVyLnR5cGUpKQotCXsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19oZWFkZXJfZW51bToKLQkgIGhhZF91c2VmdWxsID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX3N5bWJvbF9lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW06Ci0JICAvKiBDb3VudCBzeW1ib2xzIGFuZCByZW1lbWJlciB0aGVpciBzaXplIGZvciBhIGZ1dHVyZSBtYWxsb2MgICAqLwotCSAgYWJmZC0+c3ltY291bnQrKzsKLQkgIG9hc3lzLT5zeW1ib2xfc3RyaW5nX2xlbmd0aCArPSAxICsgb2FzeXNfc3RyaW5nX2xlbmd0aCAoJnJlY29yZCk7Ci0JICBoYWRfdXNlZnVsbCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19zZWN0aW9uX2VudW06Ci0JICB7Ci0JICAgIGFzZWN0aW9uICpzOwotCSAgICBjaGFyICpidWZmZXI7Ci0JICAgIHVuc2lnbmVkIGludCBzZWN0aW9uX251bWJlcjsKLQkgICAgaWYgKHJlY29yZC5zZWN0aW9uLmhlYWRlci5sZW5ndGggIT0gc2l6ZW9mIChyZWNvcmQuc2VjdGlvbikpCi0JICAgICAgewotCQlnb3RvIGZhaWw7Ci0JICAgICAgfQotCSAgICBidWZmZXIgPSBiZmRfYWxsb2MgKGFiZmQsIDMpOwotCSAgICBpZiAoIWJ1ZmZlcikKLQkgICAgICBnb3RvIGZhaWw7Ci0JICAgIHNlY3Rpb25fbnVtYmVyID0gcmVjb3JkLnNlY3Rpb24ucmVsYiAmIFJFTE9DQVRJT05fU0VDVF9CSVRTOwotCSAgICBzcHJpbnRmIChidWZmZXIsICIldSIsIHNlY3Rpb25fbnVtYmVyKTsKLQkgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIGJ1ZmZlcik7Ci0JICAgIG9hc3lzLT5zZWN0aW9uc1tzZWN0aW9uX251bWJlcl0gPSBzOwotCSAgICBzd2l0Y2ggKHJlY29yZC5zZWN0aW9uLnJlbGIgJiBSRUxPQ0FUSU9OX1RZUEVfQklUUykKLQkgICAgICB7Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQUJTOgotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1JFTDoKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfVU5EOgotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0NPTToKLQkJQkZEX0ZBSUwgKCk7Ci0JICAgICAgfQotCi0JICAgIHMtPl9yYXdfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkLnNlY3Rpb24udmFsdWUpOwotCSAgICBzLT52bWEgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZC5zZWN0aW9uLnZtYSk7Ci0JICAgIHMtPmZsYWdzID0gMDsKLQkgICAgaGFkX3VzZWZ1bGwgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfZGF0YV9lbnVtOgotCSAgb2FzeXMtPmZpcnN0X2RhdGFfcmVjb3JkID0gYmZkX3RlbGwgKGFiZmQpIC0gcmVjb3JkLmhlYWRlci5sZW5ndGg7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfZGVidWdfZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19tb2R1bGVfZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19uYW1lZF9zZWN0aW9uX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfZW5kX2VudW06Ci0JICBpZiAoaGFkX3VzZWZ1bGwgPT0gZmFsc2UpCi0JICAgIGdvdG8gZmFpbDsKLQkgIGxvb3AgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBnb3RvIGZhaWw7Ci0JfQotICAgIH0KLSAgb2FzeXMtPnN5bWJvbHMgPSAoYXN5bWJvbCAqKSBOVUxMOwotICAvKgotICAgIE9hc3lzIHN1cHBvcnQgc2V2ZXJhbCBhcmNoaXRlY3R1cmVzLCBidXQgSSBjYW4ndCBzZWUgYSBzaW1wbGUgd2F5Ci0gICAgdG8gZGlzY292ZXIgd2hpY2ggb25lIGlzIGluIGEgcGFydGljdWxhciBmaWxlIC0gd2UnbGwgZ3Vlc3MKLSAgICAqLwotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9tNjhrLCAwKTsKLSAgaWYgKGFiZmQtPnN5bWNvdW50ICE9IDApCi0gICAgewotICAgICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0gICAgfQotCi0gIC8qCi0gICAgV2UgZG9uJ3Qga25vdyBpZiBhIHNlY3Rpb24gaGFzIGRhdGEgdW50aWwgd2UndmUgcmVhZCBpdC4uCi0gICAgKi8KLQotICBvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpOwotCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLWZhaWw6Ci0gICh2b2lkKSBiZmRfcmVsZWFzZSAoYWJmZCwgb2FzeXMpOwotICBhYmZkLT50ZGF0YS5vYXN5c19vYmpfZGF0YSA9IHNhdmU7Ci0gIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotfQotCi0KLXN0YXRpYyB2b2lkCi1vYXN5c19nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotICBpZiAoIXN5bWJvbC0+c2VjdGlvbikKLSAgICByZXQtPnR5cGUgPSAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkgPyAnYScgOiAnQSc7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYXN5c19wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIHsKLQlDT05TVCBjaGFyICpzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwgPwotCShDT05TVCBjaGFyICopICIqYWJzIiA6IHN5bWJvbC0+c2VjdGlvbi0+bmFtZTsKLQotCWJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0KLQlmcHJpbnRmIChmaWxlLCAiICUtNXMgJXMiLAotCQkgc2VjdGlvbl9uYW1lLAotCQkgc3ltYm9sLT5uYW1lKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLS8qCi0gVGhlIGhvd3RvIHRhYmxlIGlzIGJ1aWxkIHVzaW5nIHRoZSB0b3AgdHdvIGJpdHMgb2YgYSByZWxvYyBieXRlIHRvCi0gaW5kZXggaW50byBpdC4gVGhlIGJpdHMgYXJlIFBDUkVMLFdPUkQvTE9ORwotKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPQotewotCi0gIEhPV1RPICgwLCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiYWJzMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPICgwLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiYWJzMzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPICgwLCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAicGNyZWwxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKDAsIDAsIDIsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJwY3JlbDMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpCi19OwotCi0vKiBSZWFkIGluIGFsbCB0aGUgc2VjdGlvbiBkYXRhIGFuZCByZWxvY2F0aW9uIHN0dWZmIHRvbyAqLwotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCkKLSAgICAgYmZkICpDT05TVCBhYmZkOwotewotICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSByZWNvcmQ7Ci0gIG9hc3lzX2RhdGFfdHlwZSAqZGF0YSA9IE9BU1lTX0RBVEEgKGFiZmQpOwotICBib29sZWFuIGxvb3AgPSB0cnVlOwotCi0gIG9hc3lzX3Blcl9zZWN0aW9uX3R5cGUgKnBlcjsKLQotICBhc2VjdGlvbiAqczsKLQotICAvKiBTZWUgaWYgdGhlIGRhdGEgaGFzIGJlZW4gc2x1cnBlZCBhbHJlYWR5IC4uICovCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBwZXIgPSBvYXN5c19wZXJfc2VjdGlvbiAocyk7Ci0gICAgICBpZiAocGVyLT5pbml0aWFsaXplZCA9PSB0cnVlKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoZGF0YS0+Zmlyc3RfZGF0YV9yZWNvcmQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGRhdGEtPmZpcnN0X2RhdGFfcmVjb3JkLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIGlmICghIG9hc3lzX3JlYWRfcmVjb3JkIChhYmZkLCAmcmVjb3JkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzd2l0Y2ggKHJlY29yZC5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfaGVhZGVyX2VudW06Ci0JICBicmVhazsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19kYXRhX2VudW06Ci0JICB7Ci0KLQkgICAgYmZkX2J5dGUgKnNyYyA9IHJlY29yZC5kYXRhLmRhdGE7Ci0JICAgIGJmZF9ieXRlICplbmRfc3JjID0gKChiZmRfYnl0ZSAqKSAmIHJlY29yZCkgKyByZWNvcmQuaGVhZGVyLmxlbmd0aDsKLQkgICAgYmZkX2J5dGUgKmRzdF9wdHI7Ci0JICAgIGJmZF9ieXRlICpkc3RfYmFzZV9wdHI7Ci0JICAgIHVuc2lnbmVkIGludCByZWxiaXQ7Ci0JICAgIHVuc2lnbmVkIGludCBjb3VudDsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb24gPQotCSAgICBkYXRhLT5zZWN0aW9uc1tyZWNvcmQuZGF0YS5yZWxiICYgUkVMT0NBVElPTl9TRUNUX0JJVFNdOwotCSAgICBiZmRfdm1hIGRzdF9vZmZzZXQ7Ci0KLQkgICAgcGVyID0gb2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pOwotCi0JICAgIGlmIChwZXItPmluaXRpYWxpemVkID09IGZhbHNlKQotCSAgICAgIHsKLQkJcGVyLT5kYXRhID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCWlmICghcGVyLT5kYXRhKQotCQkgIHJldHVybiBmYWxzZTsKLQkJcGVyLT5yZWxvY190YWlsX3B0ciA9IChvYXN5c19yZWxvY190eXBlICoqKSAmIChzZWN0aW9uLT5yZWxvY2F0aW9uKTsKLQkJcGVyLT5oYWRfdm1hID0gZmFsc2U7Ci0JCXBlci0+aW5pdGlhbGl6ZWQgPSB0cnVlOwotCQlzZWN0aW9uLT5yZWxvY19jb3VudCA9IDA7Ci0JCXNlY3Rpb24tPmZsYWdzID0gU0VDX0FMTE9DOwotCSAgICAgIH0KLQotCSAgICBkc3Rfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmQuZGF0YS5hZGRyKTsKLQkgICAgaWYgKHBlci0+aGFkX3ZtYSA9PSBmYWxzZSkKLQkgICAgICB7Ci0JCS8qIFRha2UgdGhlIGZpcnN0IHZtYSB3ZSBzZWUgYXMgdGhlIGJhc2UgKi8KLQkJc2VjdGlvbi0+dm1hID0gZHN0X29mZnNldDsKLQkJcGVyLT5oYWRfdm1hID0gdHJ1ZTsKLQkgICAgICB9Ci0KLQkgICAgZHN0X29mZnNldCAtPSBzZWN0aW9uLT52bWE7Ci0KLQkgICAgZHN0X2Jhc2VfcHRyID0gb2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhOwotCSAgICBkc3RfcHRyID0gb2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhICsKLQkgICAgICBkc3Rfb2Zmc2V0OwotCi0JICAgIGlmIChzcmMgPCBlbmRfc3JjKQotCSAgICAgIHsKLQkJc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICAgIH0KLQkgICAgd2hpbGUgKHNyYyA8IGVuZF9zcmMpCi0JICAgICAgewotCQl1bnNpZ25lZCBjaGFyIG1vZF9ieXRlID0gKnNyYysrOwotCQlzaXplX3QgZ2FwID0gZW5kX3NyYyAtIHNyYzsKLQotCQljb3VudCA9IDg7Ci0JCWlmIChtb2RfYnl0ZSA9PSAwICYmIGdhcCA+PSA4KQotCQkgIHsKLQkJICAgIGRzdF9wdHJbMF0gPSBzcmNbMF07Ci0JCSAgICBkc3RfcHRyWzFdID0gc3JjWzFdOwotCQkgICAgZHN0X3B0clsyXSA9IHNyY1syXTsKLQkJICAgIGRzdF9wdHJbM10gPSBzcmNbM107Ci0JCSAgICBkc3RfcHRyWzRdID0gc3JjWzRdOwotCQkgICAgZHN0X3B0cls1XSA9IHNyY1s1XTsKLQkJICAgIGRzdF9wdHJbNl0gPSBzcmNbNl07Ci0JCSAgICBkc3RfcHRyWzddID0gc3JjWzddOwotCQkgICAgZHN0X3B0ciArPSA4OwotCQkgICAgc3JjICs9IDg7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgZm9yIChyZWxiaXQgPSAxOyBjb3VudC0tICE9IDAgJiYgc3JjIDwgZW5kX3NyYzsgcmVsYml0IDw8PSAxKQotCQkgICAgICB7Ci0JCQlpZiAocmVsYml0ICYgbW9kX2J5dGUpCi0JCQkgIHsKLQkJCSAgICB1bnNpZ25lZCBjaGFyIHJlbG9jID0gKnNyYzsKLQkJCSAgICAvKiBUaGlzIGl0ZW0gbmVlZHMgdG8gYmUgcmVsb2NhdGVkICovCi0JCQkgICAgc3dpdGNoIChyZWxvYyAmIFJFTE9DQVRJT05fVFlQRV9CSVRTKQotCQkJICAgICAgewotCQkJICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQUJTOgotCi0JCQkJYnJlYWs7Ci0KLQkJCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1JFTDoKLQkJCQl7Ci0JCQkJICAvKiBSZWxvY2F0ZSB0aGUgaXRlbSByZWxhdGl2ZSB0byB0aGUgc2VjdGlvbiAqLwotCQkJCSAgb2FzeXNfcmVsb2NfdHlwZSAqciA9Ci0JCQkJICAob2FzeXNfcmVsb2NfdHlwZSAqKQotCQkJCSAgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAgIHNpemVvZiAob2FzeXNfcmVsb2NfdHlwZSkpOwotCQkJCSAgaWYgKCFyKQotCQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkJICAqKHBlci0+cmVsb2NfdGFpbF9wdHIpID0gcjsKLQkJCQkgIHBlci0+cmVsb2NfdGFpbF9wdHIgPSAmci0+bmV4dDsKLQkJCQkgIHItPm5leHQgPSAob2FzeXNfcmVsb2NfdHlwZSAqKSBOVUxMOwotCQkJCSAgLyogUmVmZXJlbmNlIHRvIHVuZGVmaW5lZCBzeW1ib2wgKi8KLQkJCQkgIHNyYysrOwotCQkJCSAgLyogVGhlcmUgaXMgbm8gc3ltYm9sICovCi0JCQkJICByLT5zeW1ib2wgPSAwOwotCQkJCSAgLyogV29yayBvdXQgdGhlIGhvd3RvICovCi0JCQkJICBhYm9ydCAoKTsKLSNpZiAwCi0JCQkJICByLT5yZWxlbnQuc2VjdGlvbiA9Ci0JCQkJICAgIGRhdGEtPnNlY3Rpb25zW3JlbG9jICYKLQkJCQkJCSAgIFJFTE9DQVRJT05fU0VDVF9CSVRTXTsKLQotCQkJCSAgci0+cmVsZW50LmFkZGVuZCA9IC0KLQkJCQkgICAgci0+cmVsZW50LnNlY3Rpb24tPnZtYTsKLSNlbmRpZgotCQkJCSAgci0+cmVsZW50LmFkZHJlc3MgPSBkc3RfcHRyIC0gZHN0X2Jhc2VfcHRyOwotCQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJmhvd3RvX3RhYmxlW3JlbG9jID4+IDZdOwotCQkJCSAgci0+cmVsZW50LnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIE5VTEw7Ci0JCQkJICBzZWN0aW9uLT5yZWxvY19jb3VudCsrOwotCi0JCQkJICAvKiBGYWtlIHVwIHRoZSBkYXRhIHRvIGxvb2sgbGlrZSBpdCdzIGdvdCB0aGUgLXZlIHBjIGluIGl0LCB0aGlzIG1ha2VzCi0JCQkJICAgICAgIGl0IG11Y2ggZWFzaWVyIHRvIGNvbnZlcnQgaW50byBvdGhlciBmb3JtYXRzLiBUaGlzIGlzIGRvbmUgYnkKLQkJCQkgICAgICAgaGl0dGluZyB0aGUgYWRkZW5kLgotCQkJCSAgICAgICAqLwotCQkJCSAgaWYgKHItPnJlbGVudC5ob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLQkJCQkgICAgewotCQkJCSAgICAgIHItPnJlbGVudC5hZGRlbmQgLT0gZHN0X3B0ciAtIGRzdF9iYXNlX3B0cjsKLQkJCQkgICAgfQotCi0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQotCQkJICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfVU5EOgotCQkJCXsKLQkJCQkgIG9hc3lzX3JlbG9jX3R5cGUgKnIgPQotCQkJCSAgKG9hc3lzX3JlbG9jX3R5cGUgKikKLQkJCQkgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgICBzaXplb2YgKG9hc3lzX3JlbG9jX3R5cGUpKTsKLQkJCQkgIGlmICghcikKLQkJCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJCSAgKihwZXItPnJlbG9jX3RhaWxfcHRyKSA9IHI7Ci0JCQkJICBwZXItPnJlbG9jX3RhaWxfcHRyID0gJnItPm5leHQ7Ci0JCQkJICByLT5uZXh0ID0gKG9hc3lzX3JlbG9jX3R5cGUgKikgTlVMTDsKLQkJCQkgIC8qIFJlZmVyZW5jZSB0byB1bmRlZmluZWQgc3ltYm9sICovCi0JCQkJICBzcmMrKzsKLQkJCQkgIC8qIEdldCBzeW1ib2wgbnVtYmVyICovCi0JCQkJICByLT5zeW1ib2wgPSAoc3JjWzBdIDw8IDgpIHwgc3JjWzFdOwotCQkJCSAgLyogV29yayBvdXQgdGhlIGhvd3RvICovCi0JCQkJICBhYm9ydCAoKTsKLQotI2lmIDAKLQkJCQkgIHItPnJlbGVudC5zZWN0aW9uID0gKGFzZWN0aW9uCi0JCQkJCQkgICAgICAgKikgTlVMTDsKLSNlbmRpZgotCQkJCSAgci0+cmVsZW50LmFkZGVuZCA9IDA7Ci0JCQkJICByLT5yZWxlbnQuYWRkcmVzcyA9IGRzdF9wdHIgLSBkc3RfYmFzZV9wdHI7Ci0JCQkJICByLT5yZWxlbnQuaG93dG8gPSAmaG93dG9fdGFibGVbcmVsb2MgPj4gNl07Ci0JCQkJICByLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgTlVMTDsKLQkJCQkgIHNlY3Rpb24tPnJlbG9jX2NvdW50Kys7Ci0KLQkJCQkgIHNyYyArPSAyOwotCQkJCSAgLyogRmFrZSB1cCB0aGUgZGF0YSB0byBsb29rIGxpa2UgaXQncyBnb3QgdGhlIC12ZSBwYyBpbiBpdCwgdGhpcyBtYWtlcwotCQkJCSAgICAgICBpdCBtdWNoIGVhc2llciB0byBjb252ZXJ0IGludG8gb3RoZXIgZm9ybWF0cy4gVGhpcyBpcyBkb25lIGJ5Ci0JCQkJICAgICAgIGhpdHRpbmcgdGhlIGFkZGVuZC4KLQkJCQkgICAgICAgKi8KLQkJCQkgIGlmIChyLT5yZWxlbnQuaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0JCQkJICAgIHsKLQkJCQkgICAgICByLT5yZWxlbnQuYWRkZW5kIC09IGRzdF9wdHIgLSBkc3RfYmFzZV9wdHI7Ci0JCQkJICAgIH0KLQotCi0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9DT006Ci0JCQkJQkZEX0ZBSUwgKCk7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQkJCSpkc3RfcHRyKysgPSAqc3JjKys7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19zeW1ib2xfZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19zZWN0aW9uX2VudW06Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgbG9vcCA9IGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLX0KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIG5ld3NlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci17Ci0gIG5ld3NlY3QtPnVzZWRfYnlfYmZkID0gKFBUUikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAob2FzeXNfcGVyX3NlY3Rpb25fdHlwZSkpOwotICBpZiAoIW5ld3NlY3QtPnVzZWRfYnlfYmZkKQotICAgIHJldHVybiBmYWxzZTsKLSAgb2FzeXNfcGVyX3NlY3Rpb24gKG5ld3NlY3QpLT5kYXRhID0gKGJmZF9ieXRlICopIE5VTEw7Ci0gIG9hc3lzX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+c2VjdGlvbiA9IG5ld3NlY3Q7Ci0gIG9hc3lzX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+b2Zmc2V0ID0gMDsKLSAgb2FzeXNfcGVyX3NlY3Rpb24gKG5ld3NlY3QpLT5pbml0aWFsaXplZCA9IGZhbHNlOwotICBuZXdzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAxOwotICAvKiBUdXJuIHRoZSBzZWN0aW9uIHN0cmluZyBpbnRvIGFuIGluZGV4ICovCi0KLSAgc3NjYW5mIChuZXdzZWN0LT5uYW1lLCAiJXUiLCAmbmV3c2VjdC0+dGFyZ2V0X2luZGV4KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgbG9uZwotb2FzeXNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICBpZiAoISBvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLSAgcmV0dXJuIChhc2VjdC0+cmVsb2NfY291bnQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBvYXN5c19wZXJfc2VjdGlvbl90eXBlICpwID0gKG9hc3lzX3Blcl9zZWN0aW9uX3R5cGUgKikgc2VjdGlvbi0+dXNlZF9ieV9iZmQ7Ci0gIG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCk7Ci0gIGlmIChwLT5pbml0aWFsaXplZCA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICAodm9pZCkgbWVtc2V0IChsb2NhdGlvbiwgMCwgKGludCkgY291bnQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICh2b2lkKSBtZW1jcHkgKGxvY2F0aW9uLCAoUFRSKSAocC0+ZGF0YSArIG9mZnNldCksIChpbnQpIGNvdW50KTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLWxvbmcKLW9hc3lzX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaWdub3JlX2FiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuc2lnbmVkIGludCByZWxvY19jb3VudCA9IDA7Ci0gIG9hc3lzX3JlbG9jX3R5cGUgKnNyYyA9IChvYXN5c19yZWxvY190eXBlICopIChzZWN0aW9uLT5yZWxvY2F0aW9uKTsKLSAgd2hpbGUgKHNyYyAhPSAob2FzeXNfcmVsb2NfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFib3J0ICgpOwotCi0jaWYgMAotICAgICAgaWYgKHNyYy0+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+YWJmZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcyk7Ci0gICAgICByZXR1cm4gKGJmZCAqKSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLAotCQkJIHNlY3Rpb24sCi0JCQkgc3ltYm9scywKLQkJCSBvZmZzZXQsCi0JCQkgZmlsZW5hbWVfcHRyLAotCQkJIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkgbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIG9mZnNldCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICoqZmlsZW5hbWVfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGZhbHNlOwotCi19Ci0KLXN0YXRpYyBpbnQKLW9hc3lzX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzdGF0ICpidWY7Ci17Ci0gIG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKm1vZCA9IChvYXN5c19tb2R1bGVfaW5mb190eXBlICopIGFiZmQtPmFyZWx0X2RhdGE7Ci0gIGlmIChtb2QgPT0gKG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1Zi0+c3Rfc2l6ZSA9IG1vZC0+c2l6ZTsKLSAgICAgIGJ1Zi0+c3RfbW9kZSA9IDA2NjY7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLW9hc3lzX3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBleGVjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAwOwotfQotCi0jZGVmaW5lCW9hc3lzX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBvYXN5c19iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBvYXN5c19zbHVycF9hcm1hcCBiZmRfdHJ1ZQotI2RlZmluZSBvYXN5c19zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF90cnVlCi0jZGVmaW5lIG9hc3lzX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSkpIFwKLSAgIGJmZF90cnVlKQotI2RlZmluZSBvYXN5c190cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIG9hc3lzX3dyaXRlX2FybWFwIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpKSBcCi0gICBiZmRfdHJ1ZSkKLSNkZWZpbmUgb2FzeXNfcmVhZF9hcl9oZHIgYmZkX251bGx2b2lkcHRyCi0jZGVmaW5lIG9hc3lzX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgb2FzeXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotCi0jZGVmaW5lIG9hc3lzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgb2FzeXNfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIG9hc3lzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgb2FzeXNfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBvYXN5c19taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBvYXN5c19iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBvYXN5c19zZXRfYXJjaF9tYWNoIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLQotI2RlZmluZSBvYXN5c19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgb2FzeXNfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBvYXN5c19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIG9hc3lzX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBvYXN5c19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBvYXN5c19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBvYXN5c19iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBvYXN5c19iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotLypTVVBQUkVTUyA0NjAgKi8KLWNvbnN0IGJmZF90YXJnZXQgb2FzeXNfdmVjID0KLXsKLSAgIm9hc3lzIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfb2FzeXNfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LAotICAgb2FzeXNfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBvYXN5c19hcmNoaXZlX3AsCi0gICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBvYXN5c19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBvYXN5c193cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChvYXN5cyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChvYXN5cyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChvYXN5cyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9vcG5jbHMuYyBiL2JmZC9vcG5jbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxMDEzNS4uMDAwMDAwMAotLS0gYS9iZmQvb3BuY2xzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotLyogb3BuY2xzLmMgLS0gb3BlbiBhbmQgY2xvc2UgYSBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvYmphbGxvYy5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWZuZGVmIFNfSVhVU1IKLSNkZWZpbmUgU19JWFVTUiAwMTAwCS8qIEV4ZWN1dGUgYnkgb3duZXIuICAqLwotI2VuZGlmCi0jaWZuZGVmIFNfSVhHUlAKLSNkZWZpbmUgU19JWEdSUCAwMDEwCS8qIEV4ZWN1dGUgYnkgZ3JvdXAuICAqLwotI2VuZGlmCi0jaWZuZGVmIFNfSVhPVEgKLSNkZWZpbmUgU19JWE9USCAwMDAxCS8qIEV4ZWN1dGUgYnkgb3RoZXJzLiAgKi8KLSNlbmRpZgotCi0vKiBmZG9wZW4gaXMgYSBsb3NlciAtLSB3ZSBzaG91bGQgdXNlIHN0ZGlvIGV4Y2x1c2l2ZWx5LiAgVW5mb3J0dW5hdGVseQotICAgaWYgd2UgZG8gdGhhdCB3ZSBjYW4ndCB1c2UgZmNudGwuICAqLwotCi0vKiBGSVhNRTogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi1sb25nIF9iZmRfY2h1bmtzaXplID0gLTE7Ci0KLS8qIFJldHVybiBhIG5ldyBCRkQuICBBbGwgQkZEJ3MgYXJlIGFsbG9jYXRlZCB0aHJvdWdoIHRoaXMgcm91dGluZS4gICovCi0KLWJmZCAqCi1fYmZkX25ld19iZmQgKCkKLXsKLSAgYmZkICpuYmZkOwotCi0gIG5iZmQgPSAoYmZkICopIGJmZF96bWFsbG9jIChzaXplb2YgKGJmZCkpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIG5iZmQtPm1lbW9yeSA9IChQVFIpIG9iamFsbG9jX2NyZWF0ZSAoKTsKLSAgaWYgKG5iZmQtPm1lbW9yeSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG5iZmQtPmFyY2hfaW5mbyA9ICZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLQotICBuYmZkLT5kaXJlY3Rpb24gPSBub19kaXJlY3Rpb247Ci0gIG5iZmQtPmlvc3RyZWFtID0gTlVMTDsKLSAgbmJmZC0+d2hlcmUgPSAwOwotICBuYmZkLT5zZWN0aW9ucyA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBuYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKLSAgbmJmZC0+bXlfYXJjaGl2ZSA9IChiZmQgKikgTlVMTDsKLSAgbmJmZC0+b3JpZ2luID0gMDsJCQkJCi0gIG5iZmQtPm9wZW5lZF9vbmNlID0gZmFsc2U7Ci0gIG5iZmQtPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLSAgbmJmZC0+c2VjdGlvbl9jb3VudCA9IDA7Ci0gIG5iZmQtPnVzcmRhdGEgPSAoUFRSKSBOVUxMOwotICBuYmZkLT5jYWNoZWFibGUgPSBmYWxzZTsKLSAgbmJmZC0+ZmxhZ3MgPSBCRkRfTk9fRkxBR1M7Ci0gIG5iZmQtPm10aW1lX3NldCA9IGZhbHNlOwotCi0gIHJldHVybiBuYmZkOwotfQotCi0vKiBBbGxvY2F0ZSBhIG5ldyBCRkQgYXMgYSBtZW1iZXIgb2YgYXJjaGl2ZSBPQkZELiAgKi8KLQotYmZkICoKLV9iZmRfbmV3X2JmZF9jb250YWluZWRfaW4gKG9iZmQpCi0gICAgIGJmZCAqb2JmZDsKLXsKLSAgYmZkICpuYmZkOwotCi0gIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7Ci0gIG5iZmQtPnh2ZWMgPSBvYmZkLT54dmVjOwotICBuYmZkLT5teV9hcmNoaXZlID0gb2JmZDsKLSAgbmJmZC0+ZGlyZWN0aW9uID0gcmVhZF9kaXJlY3Rpb247Ci0gIG5iZmQtPnRhcmdldF9kZWZhdWx0ZWQgPSBvYmZkLT50YXJnZXRfZGVmYXVsdGVkOwotICByZXR1cm4gbmJmZDsKLX0KLQotLyoKLVNFQ1RJT04KLQlPcGVuaW5nIGFuZCBjbG9zaW5nIEJGRHMKLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX29wZW5yCi0KLVNZTk9QU0lTCi0gICAgICAgIGJmZCAqYmZkX29wZW5yKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQpOwotCi1ERVNDUklQVElPTgotCU9wZW4gdGhlIGZpbGUgQHZhcntmaWxlbmFtZX0gKHVzaW5nIDw8Zm9wZW4+Pikgd2l0aCB0aGUgdGFyZ2V0Ci0JQHZhcnt0YXJnZXR9LiAgUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBCRkQuCi0KLQlDYWxscyA8PGJmZF9maW5kX3RhcmdldD4+LCBzbyBAdmFye3RhcmdldH0gaXMgaW50ZXJwcmV0ZWQgYXMgYnkKLQl0aGF0IGZ1bmN0aW9uLgotCi0JSWYgPDxOVUxMPj4gaXMgcmV0dXJuZWQgdGhlbiBhbiBlcnJvciBoYXMgb2NjdXJlZC4gICBQb3NzaWJsZSBlcnJvcnMKLQlhcmUgPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4sIDw8YmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0Pj4gb3IgPDxzeXN0ZW1fY2FsbD4+IGVycm9yLgotKi8KLQotYmZkICoKLWJmZF9vcGVuciAoZmlsZW5hbWUsIHRhcmdldCkKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLXsKLSAgYmZkICpuYmZkOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjOwotCi0gIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdGFyZ2V0X3ZlYyA9IGJmZF9maW5kX3RhcmdldCAodGFyZ2V0LCBuYmZkKTsKLSAgaWYgKHRhcmdldF92ZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgbmJmZC0+ZGlyZWN0aW9uID0gcmVhZF9kaXJlY3Rpb247Ci0KLSAgaWYgKGJmZF9vcGVuX2ZpbGUgKG5iZmQpID09IE5VTEwpCi0gICAgewotICAgICAgLyogRmlsZSBkaWRuJ3QgZXhpc3QsIG9yIHNvbWUgc3VjaCAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBuYmZkOwotfQotCi0vKiBEb24ndCB0cnkgdG8gYG9wdGltaXplJyB0aGlzIGZ1bmN0aW9uOgotCi0gICBvIC0gV2UgbG9jayB1c2luZyBzdGFjayBzcGFjZSBzbyB0aGF0IGludGVycnVwdGluZyB0aGUgbG9ja2luZwotICAgICAgIHdvbid0IGNhdXNlIGEgc3RvcmFnZSBsZWFrLgotICAgbyAtIFdlIG9wZW4gdGhlIGZpbGUgc3RyZWFtIGxhc3QsIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0bwotICAgICAgIGNsb3NlIGl0IGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuICBDbG9zaW5nIHRoZSBzdHJlYW0gbWVhbnMgY2xvc2luZwotICAgICAgIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG9vLCBldmVuIHRob3VnaCB3ZSBkaWRuJ3Qgb3BlbiBpdC4KLSAqLwotLyoKLUZVTkNUSU9OCi0gICAgICAgICBiZmRfZmRvcGVucgotCi1TWU5PUFNJUwotICAgICAgICAgYmZkICpiZmRfZmRvcGVucihDT05TVCBjaGFyICpmaWxlbmFtZSwgQ09OU1QgY2hhciAqdGFyZ2V0LCBpbnQgZmQpOwotCi1ERVNDUklQVElPTgotICAgICAgICAgPDxiZmRfZmRvcGVucj4+IGlzIHRvIDw8YmZkX2ZvcGVucj4+IG11Y2ggbGlrZSA8PGZkb3Blbj4+IGlzIHRvIDw8Zm9wZW4+Pi4KLQkgSXQgb3BlbnMgYSBCRkQgb24gYSBmaWxlIGFscmVhZHkgZGVzY3JpYmVkIGJ5IHRoZSBAdmFye2ZkfQotCSBzdXBwbGllZC4KLQotCSBXaGVuIHRoZSBmaWxlIGlzIGxhdGVyIDw8YmZkX2Nsb3NlPj5kLCB0aGUgZmlsZSBkZXNjcmlwdG9yIHdpbGwgYmUgY2xvc2VkLgotCi0JIElmIHRoZSBjYWxsZXIgZGVzaXJlcyB0aGF0IHRoaXMgZmlsZSBkZXNjcmlwdG9yIGJlIGNhY2hlZCBieSBCRkQKLQkgKG9wZW5lZCBhcyBuZWVkZWQsIGNsb3NlZCBhcyBuZWVkZWQgdG8gZnJlZSBkZXNjcmlwdG9ycyBmb3IKLQkgb3RoZXIgb3BlbnMpLCB3aXRoIHRoZSBzdXBwbGllZCBAdmFye2ZkfSB1c2VkIGFzIGFuIGluaXRpYWwKLQkgZmlsZSBkZXNjcmlwdG9yIChidXQgc3ViamVjdCB0byBjbG9zdXJlIGF0IGFueSB0aW1lKSwgY2FsbAotCSBiZmRfc2V0X2NhY2hlYWJsZShiZmQsIDEpIG9uIHRoZSByZXR1cm5lZCBCRkQuICBUaGUgZGVmYXVsdCBpcyB0bwotCSBhc3N1bWUgbm8gY2FjaGVpbmc7IHRoZSBmaWxlIGRlc2NyaXB0b3Igd2lsbCByZW1haW4gb3BlbiB1bnRpbAotCSA8PGJmZF9jbG9zZT4+LCBhbmQgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgQkZEIG9wZXJhdGlvbnMgb24gb3RoZXIKLQkgZmlsZXMuCi0KLSAgICAgICAgIFBvc3NpYmxlIGVycm9ycyBhcmUgPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4sIDw8YmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0Pj4gYW5kIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4uCi0qLwotCi1iZmQgKgotYmZkX2Zkb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQsIGZkKQotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLSAgICAgQ09OU1QgY2hhciAqdGFyZ2V0OwotICAgICBpbnQgZmQ7Ci17Ci0gIGJmZCAqbmJmZDsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0X3ZlYzsKLSAgaW50IGZkZmxhZ3M7Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSNpZiAhIGRlZmluZWQoSEFWRV9GQ05UTCkgfHwgISBkZWZpbmVkKEZfR0VURkwpCi0gIGZkZmxhZ3MgPSBPX1JEV1I7CQkJLyogQXNzdW1lIGZ1bGwgYWNjZXNzICovCi0jZWxzZQotICBmZGZsYWdzID0gZmNudGwgKGZkLCBGX0dFVEZMLCBOVUxMKTsKLSNlbmRpZgotICBpZiAoZmRmbGFncyA9PSAtMSkgcmV0dXJuIE5VTEw7Ci0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB0YXJnZXRfdmVjID0gYmZkX2ZpbmRfdGFyZ2V0ICh0YXJnZXQsIG5iZmQpOwotICBpZiAodGFyZ2V0X3ZlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotI2lmbmRlZiBIQVZFX0ZET1BFTgotICBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUkIpOwotI2Vsc2UKLSAgLyogKE9fQUNDTU9ERSkgcGFyZW5zIGFyZSB0byBhdm9pZCBVbHRyaXggaGVhZGVyIGZpbGUgYnVnICovCi0gIHN3aXRjaCAoZmRmbGFncyAmIChPX0FDQ01PREUpKQotICAgIHsKLSAgICBjYXNlIE9fUkRPTkxZOiBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZkb3BlbiAoZmQsIEZPUEVOX1JCKTsgICBicmVhazsKLSAgICBjYXNlIE9fV1JPTkxZOiBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZkb3BlbiAoZmQsIEZPUEVOX1JVQik7ICBicmVhazsKLSAgICBjYXNlIE9fUkRXUjogICBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZkb3BlbiAoZmQsIEZPUEVOX1JVQik7ICBicmVhazsKLSAgICBkZWZhdWx0OiBhYm9ydCAoKTsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobmJmZC0+aW9zdHJlYW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPSywgcHV0IGV2ZXJ5dGhpbmcgd2hlcmUgaXQgYmVsb25ncyAqLwotCi0gIG5iZmQtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0KLSAgLyogQXMgYSBzcGVjaWFsIGNhc2Ugd2UgYWxsb3cgYSBGRCBvcGVuIGZvciByZWFkL3dyaXRlIHRvCi0gICAgIGJlIHdyaXR0ZW4gdGhyb3VnaCwgYWx0aG91Z2ggZG9pbmcgc28gcmVxdWlyZXMgdGhhdCB3ZSBlbmQKLSAgICAgdGhlIHByZXZpb3VzIGNsYXVzZSB3aXRoIGEgcHJlcG9zaXRpb24uICAqLwotICAvKiAoT19BQ0NNT0RFKSBwYXJlbnMgYXJlIHRvIGF2b2lkIFVsdHJpeCBoZWFkZXIgZmlsZSBidWcgKi8KLSAgc3dpdGNoIChmZGZsYWdzICYgT19BQ0NNT0RFKQotICAgIHsKLSAgICBjYXNlIE9fUkRPTkxZOiBuYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsgYnJlYWs7Ci0gICAgY2FzZSBPX1dST05MWTogbmJmZC0+ZGlyZWN0aW9uID0gd3JpdGVfZGlyZWN0aW9uOyBicmVhazsKLSAgICBjYXNlIE9fUkRXUjogbmJmZC0+ZGlyZWN0aW9uID0gYm90aF9kaXJlY3Rpb247IGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoISBiZmRfY2FjaGVfaW5pdCAobmJmZCkpCi0gICAgewotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIG5iZmQtPm9wZW5lZF9vbmNlID0gdHJ1ZTsKLQotICByZXR1cm4gbmJmZDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX29wZW5zdHJlYW1yCi0KLVNZTk9QU0lTCi0JYmZkICpiZmRfb3BlbnN0cmVhbXIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIFBUUik7Ci0KLURFU0NSSVBUSU9OCi0KLQlPcGVuIGEgQkZEIGZvciByZWFkIGFjY2VzcyBvbiBhbiBleGlzdGluZyBzdGRpbyBzdHJlYW0uICBXaGVuCi0JdGhlIEJGRCBpcyBwYXNzZWQgdG8gPDxiZmRfY2xvc2U+PiwgdGhlIHN0cmVhbSB3aWxsIGJlIGNsb3NlZC4KLSovCi0KLWJmZCAqCi1iZmRfb3BlbnN0cmVhbXIgKGZpbGVuYW1lLCB0YXJnZXQsIHN0cmVhbWFyZykKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRhcmdldDsKLSAgICAgUFRSIHN0cmVhbWFyZzsKLXsKLSAgRklMRSAqc3RyZWFtID0gKEZJTEUgKikgc3RyZWFtYXJnOwotICBiZmQgKm5iZmQ7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldF92ZWM7Ci0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB0YXJnZXRfdmVjID0gYmZkX2ZpbmRfdGFyZ2V0ICh0YXJnZXQsIG5iZmQpOwotICBpZiAodGFyZ2V0X3ZlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIHN0cmVhbTsKLSAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgbmJmZC0+ZGlyZWN0aW9uID0gcmVhZF9kaXJlY3Rpb247Ci0JCQkJCi0gIGlmICghIGJmZF9jYWNoZV9pbml0IChuYmZkKSkKLSAgICB7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gbmJmZDsKLX0KLQwKLS8qKiBiZmRfb3BlbncgLS0gb3BlbiBmb3Igd3JpdGluZy4KLSAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBmcmVzaGx5LWFsbG9jYXRlZCBCRkQgb24gc3VjY2Vzcywgb3IgTlVMTC4KLQotICBTZWUgY29tbWVudCBieSBiZmRfZmRvcGVuciBiZWZvcmUgeW91IHRyeSB0byBtb2RpZnkgdGhpcyBmdW5jdGlvbi4gKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX29wZW53Ci0KLVNZTk9QU0lTCi0JYmZkICpiZmRfb3BlbncoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCk7Ci0KLURFU0NSSVBUSU9OCi0JQ3JlYXRlIGEgQkZELCBhc3NvY2lhdGVkIHdpdGggZmlsZSBAdmFye2ZpbGVuYW1lfSwgdXNpbmcgdGhlCi0JZmlsZSBmb3JtYXQgQHZhcnt0YXJnZXR9LCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4KLQotCVBvc3NpYmxlIGVycm9ycyBhcmUgPDxiZmRfZXJyb3Jfc3lzdGVtX2NhbGw+PiwgPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4sCi0JPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+Pi4KLSovCi0KLWJmZCAqCi1iZmRfb3BlbncgKGZpbGVuYW1lLCB0YXJnZXQpCi0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Ci17Ci0gIGJmZCAqbmJmZDsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0X3ZlYzsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCi0gIC8qIG5iZmQgaGFzIHRvIHBvaW50IHRvIGhlYWQgb2YgbWFsbG9jJ2VkIGJsb2NrIHNvIHRoYXQgYmZkX2Nsb3NlIG1heQotICAgICByZWNsYWltIGl0IGNvcnJlY3RseS4gKi8KLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHRhcmdldF92ZWMgPSBiZmRfZmluZF90YXJnZXQgKHRhcmdldCwgbmJmZCk7Ci0gIGlmICh0YXJnZXRfdmVjID09IE5VTEwpCi0gICAgewotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgbmJmZC0+ZGlyZWN0aW9uID0gd3JpdGVfZGlyZWN0aW9uOwotCi0gIGlmIChiZmRfb3Blbl9maWxlIChuYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CS8qIEZpbGUgbm90IHdyaXRlYWJsZSwgZXRjICovCi0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qCi0KLUZVTkNUSU9OCi0JYmZkX2Nsb3NlCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2xvc2UoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQotCUNsb3NlIGEgQkZELiBJZiB0aGUgQkZEIHdhcyBvcGVuIGZvciB3cml0aW5nLAotCXRoZW4gcGVuZGluZyBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZWQgYW5kIHRoZSBmaWxlIHdyaXR0ZW4gb3V0Ci0JYW5kIGNsb3NlZC4gSWYgdGhlIGNyZWF0ZWQgZmlsZSBpcyBleGVjdXRhYmxlLCB0aGVuCi0JPDxjaG1vZD4+IGlzIGNhbGxlZCB0byBtYXJrIGl0IGFzIHN1Y2guCi0KLQlBbGwgbWVtb3J5IGF0dGFjaGVkIHRvIHRoZSBCRkQgaXMgcmVsZWFzZWQuCi0KLQlUaGUgZmlsZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkZEIGlzIGNsb3NlZCAoZXZlbgotCWlmIGl0IHdhcyBwYXNzZWQgaW4gdG8gQkZEIGJ5IDw8YmZkX2Zkb3BlbnI+PikuCi0KLVJFVFVSTlMKLQk8PHRydWU+PiBpcyByZXR1cm5lZCBpZiBhbGwgaXMgb2ssIG90aGVyd2lzZSA8PGZhbHNlPj4uCi0qLwotCi0KLWJvb2xlYW4KLWJmZF9jbG9zZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBib29sZWFuIHJldDsKLQotICBpZiAoIWJmZF9yZWFkX3AgKGFiZmQpKQotICAgIHsKLSAgICAgIGlmICghIEJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF93cml0ZV9jb250ZW50cywgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIEJGRF9TRU5EIChhYmZkLCBfY2xvc2VfYW5kX2NsZWFudXAsIChhYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldCA9IGJmZF9jYWNoZV9jbG9zZSAoYWJmZCk7Ci0KLSAgLyogSWYgdGhlIGZpbGUgd2FzIG9wZW4gZm9yIHdyaXRpbmcgYW5kIGlzIG5vdyBleGVjdXRhYmxlLAotICAgICBtYWtlIGl0IHNvICovCi0gIGlmIChyZXQKLSAgICAgICYmIGFiZmQtPmRpcmVjdGlvbiA9PSB3cml0ZV9kaXJlY3Rpb24KLSAgICAgICYmIGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIHsKLSAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLQotICAgICAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmYnVmKSA9PSAwKQotCXsKLSAJICBpbnQgbWFzayA9IHVtYXNrICgwKTsKLQkgIHVtYXNrIChtYXNrKTsKLQkgIGNobW9kIChhYmZkLT5maWxlbmFtZSwKLQkJICgwNzc3Ci0JCSAgJiAoYnVmLnN0X21vZGUgfCAoKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkgJn4gbWFzaykpKSk7Ci0JfQotICAgIH0KLQotICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIGFiZmQtPm1lbW9yeSk7Ci0gIGZyZWUgKGFiZmQpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jbG9zZV9hbGxfZG9uZQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2Nsb3NlX2FsbF9kb25lKGJmZCAqKTsKLQotREVTQ1JJUFRJT04KLQlDbG9zZSBhIEJGRC4gIERpZmZlcnMgZnJvbSA8PGJmZF9jbG9zZT4+Ci0Jc2luY2UgaXQgZG9lcyBub3QgY29tcGxldGUgYW55IHBlbmRpbmcgb3BlcmF0aW9ucy4gIFRoaXMKLQlyb3V0aW5lIHdvdWxkIGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGhhZCBqdXN0IHVzZWQgQkZEIGZvcgotCXN3YXBwaW5nIGFuZCBkaWRuJ3Qgd2FudCB0byB1c2UgYW55IG9mIHRoZSB3cml0aW5nIGNvZGUuCi0KLQlJZiB0aGUgY3JlYXRlZCBmaWxlIGlzIGV4ZWN1dGFibGUsIHRoZW4gPDxjaG1vZD4+IGlzIGNhbGxlZAotCXRvIG1hcmsgaXQgYXMgc3VjaC4KLQotCUFsbCBtZW1vcnkgYXR0YWNoZWQgdG8gdGhlIEJGRCBpcyByZWxlYXNlZC4KLQotUkVUVVJOUwotCTw8dHJ1ZT4+IGlzIHJldHVybmVkIGlmIGFsbCBpcyBvaywgb3RoZXJ3aXNlIDw8ZmFsc2U+Pi4KLQotKi8KLQotYm9vbGVhbgotYmZkX2Nsb3NlX2FsbF9kb25lIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJvb2xlYW4gcmV0OwotCi0gIHJldCA9IGJmZF9jYWNoZV9jbG9zZSAoYWJmZCk7Ci0KLSAgLyogSWYgdGhlIGZpbGUgd2FzIG9wZW4gZm9yIHdyaXRpbmcgYW5kIGlzIG5vdyBleGVjdXRhYmxlLAotICAgICBtYWtlIGl0IHNvICovCi0gIGlmIChyZXQKLSAgICAgICYmIGFiZmQtPmRpcmVjdGlvbiA9PSB3cml0ZV9kaXJlY3Rpb24KLSAgICAgICYmIGFiZmQtPmZsYWdzICYgRVhFQ19QKQotICAgIHsKLSAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLQotICAgICAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmYnVmKSA9PSAwKQotCXsKLQkgIGludCBtYXNrID0gdW1hc2sgKDApOwotCSAgdW1hc2sgKG1hc2spOwotCSAgY2htb2QgKGFiZmQtPmZpbGVuYW1lLAotCQkgKDB4Nzc3Ci0JCSAgJiAoYnVmLnN0X21vZGUgfCAoKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkgJn4gbWFzaykpKSk7Ci0JfQotICAgIH0KLQotICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIGFiZmQtPm1lbW9yeSk7Ci0gIGZyZWUgKGFiZmQpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jcmVhdGUKLQotU1lOT1BTSVMKLQliZmQgKmJmZF9jcmVhdGUoQ09OU1QgY2hhciAqZmlsZW5hbWUsIGJmZCAqdGVtcGwpOwotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIG5ldyBCRkQgaW4gdGhlIG1hbm5lciBvZgotCTw8YmZkX29wZW53Pj4sIGJ1dCB3aXRob3V0IG9wZW5pbmcgYSBmaWxlLiBUaGUgbmV3IEJGRAotCXRha2VzIHRoZSB0YXJnZXQgZnJvbSB0aGUgdGFyZ2V0IHVzZWQgYnkgQHZhcnt0ZW1wbGF0ZX0uIFRoZQotCWZvcm1hdCBpcyBhbHdheXMgc2V0IHRvIDw8YmZkX29iamVjdD4+LgotCi0qLwotCi1iZmQgKgotYmZkX2NyZWF0ZSAoZmlsZW5hbWUsIHRlbXBsKQotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLSAgICAgYmZkICp0ZW1wbDsKLXsKLSAgYmZkICpuYmZkOwotCi0gIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5iZmQtPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIGlmICh0ZW1wbCkKLSAgICBuYmZkLT54dmVjID0gdGVtcGwtPnh2ZWM7Ci0gIG5iZmQtPmRpcmVjdGlvbiA9IG5vX2RpcmVjdGlvbjsKLSAgYmZkX3NldF9mb3JtYXQgKG5iZmQsIGJmZF9vYmplY3QpOwotICByZXR1cm4gbmJmZDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfd3JpdGFibGUKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9tYWtlX3dyaXRhYmxlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JVGFrZXMgYSBCRkQgYXMgY3JlYXRlZCBieSA8PGJmZF9jcmVhdGU+PiBhbmQgY29udmVydHMgaXQKLQlpbnRvIG9uZSBsaWtlIGFzIHJldHVybmVkIGJ5IDw8YmZkX29wZW53Pj4uICBJdCBkb2VzIHRoaXMKLQlieSBjb252ZXJ0aW5nIHRoZSBCRkQgdG8gQkZEX0lOX01FTU9SWS4gIEl0J3MgYXNzdW1lZCB0aGF0Ci0JeW91IHdpbGwgY2FsbCA8PGJmZF9tYWtlX3JlYWRhYmxlPj4gb24gdGhpcyBiZmQgbGF0ZXIuCi0KLVJFVFVSTlMKLQk8PHRydWU+PiBpcyByZXR1cm5lZCBpZiBhbGwgaXMgb2ssIG90aGVyd2lzZSA8PGZhbHNlPj4uCi0qLwotCi1ib29sZWFuCi1iZmRfbWFrZV93cml0YWJsZShhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBiZmRfaW5fbWVtb3J5ICpiaW07Ci0KLSAgaWYgKGFiZmQtPmRpcmVjdGlvbiAhPSBub19kaXJlY3Rpb24pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmltID0gKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9pbl9tZW1vcnkpKTsKLSAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBiaW07Ci0gIC8qIGJmZF93cml0ZSB3aWxsIGdyb3cgdGhlc2UgYXMgbmVlZGVkICovCi0gIGJpbS0+c2l6ZSA9IDA7Ci0gIGJpbS0+YnVmZmVyID0gMDsKLQotICBhYmZkLT5mbGFncyB8PSBCRkRfSU5fTUVNT1JZOwotICBhYmZkLT5kaXJlY3Rpb24gPSB3cml0ZV9kaXJlY3Rpb247Ci0gIGFiZmQtPndoZXJlID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2VfcmVhZGFibGUKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9tYWtlX3JlYWRhYmxlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JVGFrZXMgYSBCRkQgYXMgY3JlYXRlZCBieSA8PGJmZF9jcmVhdGU+PiBhbmQKLQk8PGJmZF9tYWtlX3dyaXRhYmxlPj4gYW5kIGNvbnZlcnRzIGl0IGludG8gb25lIGxpa2UgYXMKLQlyZXR1cm5lZCBieSA8PGJmZF9vcGVucj4+LiAgSXQgZG9lcyB0aGlzIGJ5IHdyaXRpbmcgdGhlCi0JY29udGVudHMgb3V0IHRvIHRoZSBtZW1vcnkgYnVmZmVyLCB0aGVuIHJldmVyc2luZyB0aGUKLQlkaXJlY3Rpb24uCi0KLVJFVFVSTlMKLQk8PHRydWU+PiBpcyByZXR1cm5lZCBpZiBhbGwgaXMgb2ssIG90aGVyd2lzZSA8PGZhbHNlPj4uICAqLwotCi1ib29sZWFuCi1iZmRfbWFrZV9yZWFkYWJsZShhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5kaXJlY3Rpb24gIT0gd3JpdGVfZGlyZWN0aW9uIHx8ICEoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBCRkRfU0VORF9GTVQgKGFiZmQsIF9iZmRfd3JpdGVfY29udGVudHMsIChhYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIEJGRF9TRU5EIChhYmZkLCBfY2xvc2VfYW5kX2NsZWFudXAsIChhYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0KLSAgYWJmZC0+YXJjaF9pbmZvID0gJmJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OwotCi0gIGFiZmQtPndoZXJlID0gMDsKLSAgYWJmZC0+c2VjdGlvbnMgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247Ci0gIGFiZmQtPm15X2FyY2hpdmUgPSAoYmZkICopIE5VTEw7Ci0gIGFiZmQtPm9yaWdpbiA9IDA7CQkJCQotICBhYmZkLT5vcGVuZWRfb25jZSA9IGZhbHNlOwotICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0gIGFiZmQtPnNlY3Rpb25fY291bnQgPSAwOwotICBhYmZkLT51c3JkYXRhID0gKFBUUikgTlVMTDsKLSAgYWJmZC0+Y2FjaGVhYmxlID0gZmFsc2U7Ci0gIGFiZmQtPmZsYWdzID0gQkZEX0lOX01FTU9SWTsKLSAgYWJmZC0+bXRpbWVfc2V0ID0gZmFsc2U7Ci0KLSAgYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IHRydWU7Ci0gIGFiZmQtPmRpcmVjdGlvbiA9IHJlYWRfZGlyZWN0aW9uOwotICBhYmZkLT5zZWN0aW9ucyA9IDA7Ci0gIGFiZmQtPnN5bWNvdW50ID0gMDsKLSAgYWJmZC0+b3V0c3ltYm9scyA9IDA7Ci0gIGFiZmQtPnRkYXRhLmFueSA9IDA7Ci0KLSAgYmZkX2NoZWNrX2Zvcm1hdChhYmZkLCBiZmRfb2JqZWN0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2FsbG9jCi0KLVNZTk9QU0lTCi0JUFRSIGJmZF9hbGxvYyAoYmZkICphYmZkLCBzaXplX3Qgd2FudGVkKTsKLQotREVTQ1JJUFRJT04KLQlBbGxvY2F0ZSBhIGJsb2NrIG9mIEB2YXJ7d2FudGVkfSBieXRlcyBvZiBtZW1vcnkgYXR0YWNoZWQgdG8KLQk8PGFiZmQ+PiBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4KLSovCi0KLQotUFRSCi1iZmRfYWxsb2MgKGFiZmQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiByZXQ7Ci0KLSAgcmV0ID0gb2JqYWxsb2NfYWxsb2MgKGFiZmQtPm1lbW9yeSwgKHVuc2lnbmVkIGxvbmcpIHNpemUpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLVBUUgotYmZkX3phbGxvYyAoYWJmZCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHJlczsKLQotICByZXMgPSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAocmVzKQotICAgIG1lbXNldCAocmVzLCAwLCBzaXplKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotLyogRnJlZSBhIGJsb2NrIGFsbG9jYXRlZCBmb3IgYSBCRkQuICAqLwotCi12b2lkCi1iZmRfcmVsZWFzZSAoYWJmZCwgYmxvY2spCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGJsb2NrOwotewotICBvYmphbGxvY19mcmVlX2Jsb2NrICgoc3RydWN0IG9iamFsbG9jICopIGFiZmQtPm1lbW9yeSwgYmxvY2spOwotfQpkaWZmIC0tZ2l0IGEvYmZkL29zZi1jb3JlLmMgYi9iZmQvb3NmLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0ZmMxMi4uMDAwMDAwMAotLS0gYS9iZmQvb3NmLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE9TRi8xIGNvcmUgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgT1NGLzEgc3R5bGUKLSAgIGNvcmUgZmlsZXMuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlIDxzeXMvdXNlci5oPgotI2luY2x1ZGUgPHN5cy9jb3JlLmg+Ci0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBmbGFnd29yZCwgYmZkX3NpemVfdHlwZSwKLQkJCSAgIGJmZF92bWEsIGZpbGVfcHRyKSk7Ci1zdGF0aWMgYXN5bWJvbCAqCi1vc2ZfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb3NmX2NvcmVfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjaGFyICoKLW9zZl9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQKLW9zZl9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4KLW9zZl9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KLQotc3RydWN0IG9zZl9jb3JlX3N0cnVjdCAKLXsKLSAgaW50IHNpZzsKLSAgY2hhciBjbWRbTUFYQ09NTEVOICsgMV07Ci19OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5vc2ZfY29yZV9kYXRhKQotI2RlZmluZSBjb3JlX3NpZ25hbChiZmQpIChjb3JlX2hkcihiZmQpLT5zaWcpCi0jZGVmaW5lIGNvcmVfY29tbWFuZChiZmQpIChjb3JlX2hkcihiZmQpLT5jbWQpCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgdm1hLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKCFhc2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhc2VjdC0+ZmxhZ3MgPSBmbGFnczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IF9yYXdfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHZtYTsKLSAgYXNlY3QtPmZpbGVwb3MgPSBmaWxlcG9zOwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gODsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLW9zZl9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLW9zZl9jb3JlX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCB2YWw7Ci0gIGludCBpOwotICBjaGFyICpzZWNuYW1lOwotICBzdHJ1Y3QgY29yZV9maWxlaGRyIGNvcmVfaGVhZGVyOwotCi0gIHZhbCA9IGJmZF9yZWFkICgoUFRSKSZjb3JlX2hlYWRlciwgMSwgc2l6ZW9mIGNvcmVfaGVhZGVyLCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgY29yZV9oZWFkZXIpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKHN0cm5jbXAgKGNvcmVfaGVhZGVyLm1hZ2ljLCAiQ29yZSIsIDQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgY29yZV9oZHIgKGFiZmQpID0gKHN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBvc2ZfY29yZV9zdHJ1Y3QpKTsKLSAgaWYgKCFjb3JlX2hkciAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RybmNweSAoY29yZV9jb21tYW5kIChhYmZkKSwgY29yZV9oZWFkZXIubmFtZSwgTUFYQ09NTEVOICsgMSk7Ci0gIGNvcmVfc2lnbmFsIChhYmZkKSA9IGNvcmVfaGVhZGVyLnNpZ25vOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3JlX2hlYWRlci5uc2NuczsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBjb3JlX3NjbmhkciBjb3JlX3NjbmhkcjsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0gICAgICB2YWwgPSBiZmRfcmVhZCAoKFBUUikmY29yZV9zY25oZHIsIDEsIHNpemVvZiBjb3JlX3NjbmhkciwgYWJmZCk7Ci0gICAgICBpZiAodmFsICE9IHNpemVvZiBjb3JlX3NjbmhkcikKLQlicmVhazsKLQotICAgICAgLyogU2tpcCBlbXB0eSBzZWN0aW9ucy4gICovCi0gICAgICBpZiAoY29yZV9zY25oZHIuc2l6ZSA9PSAwIHx8IGNvcmVfc2NuaGRyLnNjbnB0ciA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBzd2l0Y2ggKGNvcmVfc2NuaGRyLnNjbnR5cGUpCi0JewotCWNhc2UgU0NOUkdOOgotCSAgc2VjbmFtZSA9ICIuZGF0YSI7Ci0JICBmbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLQkgIGJyZWFrOwotCWNhc2UgU0NOU1RBQ0s6Ci0JICBzZWNuYW1lID0gIi5zdGFjayI7Ci0JICBmbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLQkgIGJyZWFrOwotCWNhc2UgU0NOUkVHUzoKLQkgIHNlY25hbWUgPSAiLnJlZyI7Ci0JICBmbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJVbmhhbmRsZWQgT1NGLzEgY29yZSBmaWxlIHNlY3Rpb24gdHlwZSAlZFxuIiksCi0JCQkJIGNvcmVfc2NuaGRyLnNjbnR5cGUpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBzZWNuYW1lLCBmbGFncywKLQkJCSAgICAgIChiZmRfc2l6ZV90eXBlKSBjb3JlX3Njbmhkci5zaXplLAotCQkJICAgICAgKGJmZF92bWEpIGNvcmVfc2NuaGRyLnZhZGRyLAotCQkJICAgICAgKGZpbGVfcHRyKSBjb3JlX3Njbmhkci5zY25wdHIpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNoYXIgKgotb3NmX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLW9zZl9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9zaWduYWwgKGFiZmQpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGJvb2xlYW4KLW9zZl9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotI2RlZmluZSBvc2ZfY29yZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgb3NmX2NvcmVfZ2V0X3N5bXRhYiBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiCi0jZGVmaW5lIG9zZl9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgb3NmX2NvcmVfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBvc2ZfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBvc2ZfY29yZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgb3NmX2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgb3NmX2NvcmVfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBvc2ZfY29yZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgb3NmX2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgb3NmX2NvcmVfdmVjID0KLSAgewotICAgICJvc2YtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBvc2ZfY29yZV9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKG9zZl9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAob3NmX2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIE5VTEwsCi0gICAgCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9wYzUzMi1tYWNoLmMgYi9iZmQvcGM1MzItbWFjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Y0YWM0Li4wMDAwMDAwCi0tLSBhL2JmZC9wYzUzMi1tYWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNYWNoMy81MzIgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgSWFuIERhbGwKLSAqICAgICAgICAgICAgMTktQXByLTk0Ci0gKgotICogRm9ybWVybHkgcGFydCBvZiBhb3V0LXBjNTMyLW1hY2guYy4gU3BsaXQgb3V0IHRvIGFsbG93IG1vcmUKLSAqIGZsZXhpYmlsaXR5IHdpdGggbXVsdGlwbGUgZm9ybWF0cy4KLSAqCi0gKi8KLS8qIFRoaXMgYXJjaGl0ZWN0dXJlIGhhcyBOX1RYVE9GRiBhbmQgTl9UWFRBRERSIGRlZmluZWQgYXMgaWYKLSAqIE5fSEVBREVSX0lOX1RFWFQsIGJ1dCB0aGUgYV90ZXh0IGVudHJ5ICh0ZXh0IHNpemUpIGRvZXMgbm90IGluY2x1ZGUgdGhlCi0gKiBzcGFjZSBmb3IgdGhlIGhlYWRlci4gU28gd2UgaGF2ZSBOX0hFQURFUl9JTl9URVhUIGRlZmluZWQgdG8KLSAqIDEgYW5kIHNwZWNpYWxseSBkZWZpbmUgb3VyIG93biBOX1RYVFNJWkUKLSAqLwotCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMQotI2RlZmluZSBOX1RYVFNJWkUoeCkgKCh4KS5hX3RleHQpCi0KLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMHgxMDAwMCAgICAgICAvKiBmcm9tIG9sZCBsZCAqLwotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDB4MTAwMCAgICAgICAvKiBmcm9tIG9sZCBsZCwgIDAzMiAmIDUzMiBhcmUgcmVhbGx5IDUxMi80ayAqLwotCi0vKiBVc2UgYV9lbnRyeSBvZiAwIHRvIGRpc3Rpbmd1aXNoIG9iamVjdCBmaWxlcyBmcm9tIE9NQUdJQyBleGVjdXRhYmxlcyAqLwotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotICAoTl9NQUdJQyh4KSA9PSBPTUFHSUMgPyBcCi0gICAoKHgpLmFfZW50cnkgPCBURVhUX1NUQVJUX0FERFI/IDA6IFRFWFRfU1RBUlRfQUREUik6IFwKLSAgIChOX01BR0lDKHgpID09IE5NQUdJQz8gVEVYVF9TVEFSVF9BRERSOiBcCi0gICAgVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFKSkKLQotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9uczMyawotICAKLSNkZWZpbmUgTVkoT1ApIENBVChwYzUzMm1hY2hhb3V0XyxPUCkKLQotLyogTXVzdCBiZSB0aGUgc2FtZSBhcyBhb3V0LW5zMzJrLmMgKi8KLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMobnMzMmthb3V0LF8zMl8seSkKLQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1wYzUzMi1tYWNoIgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLS8qIFdlIGNhbmB0IHVzZSB0aGUgTVlOUyBtYWNybyBoZXJlIGZvciBjcHAgcmVhc29ucyB0b28gc3VidGxlIGZvciBtZSAtLSBJV0QgKi8KLQotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbnMzMmthb3V0X2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0vKiBsaWJhb3V0IGRvZXNuJ3QgdXNlIE5BTUUgZm9yIHRoZXNlIC4uLiAqLwotCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLQotI2RlZmluZSBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciAxCi0KLSNkZWZpbmUgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQgMQotICAgICAKLSNkZWZpbmUgTVlOU1goT1ApIENBVChuczMya2FvdXRfLE9QKQotcmVsb2NfaG93dG9fdHlwZSAqCi1NWU5TWChiZmRfcmVsb2NfdHlwZV9sb29rdXApCi0gIFBBUkFNUygoYmZkICphYmZkIEFORAotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotYm9vbGVhbgotTVlOU1god3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotICBQQVJBTVMoKGJmZCAqYWJmZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLWJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICAKLSNpZiBDSE9PU0VfUkVMT0NfU0laRQotICBDSE9PU0VfUkVMT0NfU0laRShhYmZkKTsKLSNlbHNlCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotI2VuZGlmCi0gIAotICBCRkRfQVNTRVJUIChiZmRfZ2V0X2FyY2ggKGFiZmQpID09IGJmZF9hcmNoX25zMzJrKTsKLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIDMyMDMyOgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9OUzMyMDMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI1MzI6Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fTlMzMjUzMik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIE5fU0VUX0ZMQUdTICgqZXhlY3AsIGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZXhlY19oZHJfZmxhZ3MpOwotICAKLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9wZS1hcm0uYyBiL2JmZC9wZS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhMDQ4MS4uMDAwMDAwMAotLS0gYS9iZmQvcGUtYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFSTSBQRUNPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZm5kZWYgVEFSR0VUX0xJVFRMRV9TWU0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgYXJtcGVfbGl0dGxlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAicGUtYXJtLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgYXJtcGVfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAicGUtYXJtLWJpZyIKLSNlbmRpZgotCi0jZGVmaW5lIENPRkZfV0lUSF9QRQotI2RlZmluZSBQQ1JFTE9GRlNFVCAgICAgICAgICB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpZm5kZWYgYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgCi0jZGVmaW5lIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIFwKLQliZmRfYXJtX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2FybV9wZV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfYXJtX3BlX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSNlbmRpZgotCQotI2luY2x1ZGUgImNvZmYtYXJtLmMiCmRpZmYgLS1naXQgYS9iZmQvcGUtaTM4Ni5jIGIvYmZkL3BlLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlYjc4NC4uMDAwMDAwMAotLS0gYS9iZmQvcGUtaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgUEVDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0KLSNkZWZpbmUgVEFSR0VUX1NZTSBpMzg2cGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FICJwZS1pMzg2IgotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgdHJ1ZQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0jZGVmaW5lIENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUyBcCi17IENPRkZfU0VDVElPTl9OQU1FX1BBUlRJQUxfTUFUQ0ggKCIuaWRhdGEiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5wZGF0YSIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMiB9Ci0KLSNpbmNsdWRlICJjb2ZmLWkzODYuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZS1tY29yZS5jIGIvYmZkL3BlLW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMTlmODEuLjAwMDAwMDAKLS0tIGEvYmZkL3BlLW1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1Db3JlIFBFQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2lmbmRlZiBUQVJHRVRfQklHX1NZTQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICBtY29yZV9wZV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICJwZS1tY29yZS1iaWciCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIG1jb3JlX3BlX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgInBlLW1jb3JlLWxpdHRsZSIKLSNlbmRpZgotCi0jZGVmaW5lIENPRkZfV0lUSF9QRQotI2RlZmluZSBQQ1JFTE9GRlNFVCAgICAgICAgICB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNkZWZpbmUgTUNPUkVfUEUKLQotI2luY2x1ZGUgImNvZmYtbWNvcmUuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZS1wcGMuYyBiL2JmZC9wZS1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0YTU0Ny4uMDAwMDAwMAotLS0gYS9iZmQvcGUtcHBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFBvd2VyUEMgUEVDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotCi0jZGVmaW5lIEVfRklMRU5NTEVOICAgICAxOAotCi0jZGVmaW5lIFBQQ19QRQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgYmZkX3Bvd2VycGNsZV9wZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICJwZS1wb3dlcnBjbGUiCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICBiZmRfcG93ZXJwY19wZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICJwZS1wb3dlcnBjIgotCi0jZGVmaW5lIENPRkZfV0lUSF9QRQotCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLS8qIEZJWE1FOiB2ZXJpZnkgUENSRUxPRkZTRVQgaXMgYWx3YXlzIGZhbHNlICovCi0KLS8qIEZJWE1FOiBUaGlzIHRhcmdldCBubyBsb25nZXIgd29ya3MuICBTZWFyY2ggZm9yIFBPV0VSUENfTEVfUEUgaW4KLSAgIGNvZmYtcHBjLmMgYW5kIHBlaWdlbi5jLiAgKi8KLQotI2luY2x1ZGUgImNvZmYtcHBjLmMiCmRpZmYgLS1naXQgYS9iZmQvcGVpLWFybS5jIGIvYmZkL3BlaS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhZTAxZS4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhcm0gUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2lmbmRlZiBUQVJHRVRfTElUVExFX1NZTQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgYXJtcGVpX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICJwZWktYXJtLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgIGFybXBlaV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAicGVpLWFybS1iaWciCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUICAgICAgICB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpbmNsdWRlICJjb2ZmLWFybS5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlaS1pMzg2LmMgYi9iZmQvcGVpLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwZjc3YS4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IFBFIElNQUdFIENPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNkZWZpbmUgVEFSR0VUX1NZTSBpMzg2cGVpX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRSAicGVpLWkzODYiCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgdHJ1ZQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0jZGVmaW5lIENPRkZfU0VDVElPTl9BTElHTk1FTlRfRU5UUklFUyBcCi17IENPRkZfU0VDVElPTl9OQU1FX1BBUlRJQUxfTUFUQ0ggKCIuaWRhdGEiKSwgXAotICBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgQ09GRl9BTElHTk1FTlRfRklFTERfRU1QVFksIDIgfSwgXAoteyBDT0ZGX1NFQ1RJT05fTkFNRV9FWEFDVF9NQVRDSCAoIi5wZGF0YSIpLCBcCi0gIENPRkZfQUxJR05NRU5UX0ZJRUxEX0VNUFRZLCBDT0ZGX0FMSUdOTUVOVF9GSUVMRF9FTVBUWSwgMiB9Ci0KLSNpbmNsdWRlICJjb2ZmLWkzODYuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZWktbWNvcmUuYyBiL2JmZC9wZWktbWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjM2I5NS4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLW1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1Db3JlIFBFQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2lmbmRlZiBUQVJHRVRfQklHX1NZTQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICBtY29yZV9wZWlfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAicGVpLW1jb3JlLWJpZyIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgbWNvcmVfcGVpX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgInBlaS1tY29yZS1saXR0bGUiCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUICAgICAgICB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNkZWZpbmUgTUNPUkVfUEUKLQotI2luY2x1ZGUgImNvZmYtbWNvcmUuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZWktcHBjLmMgYi9iZmQvcGVpLXBwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmUxYTVkLi4wMDAwMDAwCi0tLSBhL2JmZC9wZWktcHBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFBvd2VyUEMgUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLS8qIHNldHRpbmcgdXAgZm9yIGEgUEUgZW52aXJvbm1lbnQgc3RvbGVuIGRpcmVjdGx5IGZyb20gdGhlIGkzODYgc3RydWN0dXJlICovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotCi0jZGVmaW5lIFBQQ19QRQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgYmZkX3Bvd2VycGNsZV9wZWlfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAicGVpLXBvd2VycGNsZSIKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgIGJmZF9wb3dlcnBjX3BlaV92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICJwZWktcG93ZXJwYyIKLQotI2RlZmluZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0KLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotLyogRklYTUU6IFZlcmlmeSBQQ1JFTE9GRlNFVCBpcyBhbHdheXMgZmFsc2UgKi8KLQotLyogRklYTUU6IFRoaXMgdGFyZ2V0IG5vIGxvbmdlciB3b3Jrcy4gIFNlYXJjaCBmb3IgUE9XRVJQQ19MRV9QRSBpbgotICAgY29mZi1wcGMuYyBhbmQgcGVpZ2VuLmMuICAqLwotCi0jaW5jbHVkZSAiY29mZi1wcGMuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZWljb2RlLmggYi9iZmQvcGVpY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjZiZGU0Li4wMDAwMDAwCi0tLSBhL2JmZC9wZWljb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgdGhlIGdlbmVyaWMgcGFydHMgb2YgUEUvUEVJLCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLU1vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLAotCQkJc2FjQGN5Z251cy5jb20KLQotUEUvUEVJIHJlYXJyYW5nZW1lbnQgKGFuZCBjb2RlIGFkZGVkKTogRG9ubiBUZXJyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29mdHdheSBTeXN0ZW1zLCBJbmMuCi0qLwotCi0vKiBIZXkgbG9vaywgc29tZSBkb2N1bWVudGF0aW9uIFthbmQgaW4gYSBwbGFjZSB5b3UgZXhwZWN0IHRvIGZpbmQgaXRdIQotCi0gICBUaGUgbWFpbiByZWZlcmVuY2UgZm9yIHRoZSBwZWkgZm9ybWF0IGlzICJNaWNyb3NvZnQgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiA0LjEiLiAgR2V0IGl0IGlmIHlvdSBuZWVkIHRvCi0gICBkbyBzb21lIHNlcmlvdXMgaGFja2luZyBvbiB0aGlzIGNvZGUuCi0KLSAgIEFub3RoZXIgcmVmZXJlbmNlOgotICAgIlBlZXJpbmcgSW5zaWRlIHRoZSBQRTogQSBUb3VyIG9mIHRoZSBXaW4zMiBQb3J0YWJsZSBFeGVjdXRhYmxlCi0gICBGaWxlIEZvcm1hdCIsIE1TSiAxOTk0LCBWb2x1bWUgOS4KLQotICAgVGhlICpzb2xlKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBlIGZvcm1hdCBhbmQgdGhlIHBlaSBmb3JtYXQgaXMgdGhhdCB0aGUKLSAgIGxhdHRlciBoYXMgYW4gTVNET1MgMi4wIC5leGUgaGVhZGVyIG9uIHRoZSBmcm9udCB0aGF0IHByaW50cyB0aGUgbWVzc2FnZQotICAgIlRoaXMgYXBwIG11c3QgYmUgcnVuIHVuZGVyIFdpbmRvd3MuIiAob3Igc29tZSBzdWNoKS4KLSAgIChGSVhNRTogV2hldGhlciB0aGF0IHN0YXRlbWVudCBpcyAqcmVhbGx5KiB0cnVlIG9yIG5vdCBpcyB1bmtub3duLgotICAgQXJlIHRoZXJlIG1vcmUgc3VidGxlIGRpZmZlcmVuY2VzIGJldHdlZW4gcGUgYW5kIHBlaSBmb3JtYXRzPwotICAgRm9yIG5vdyBhc3N1bWUgdGhlcmUgYXJlbid0LiAgSWYgeW91IGZpbmQgb25lLCB0aGVuIGZvciBHb2Qgc2FrZXMKLSAgIGRvY3VtZW50IGl0IGhlcmUhKQotCi0gICBUaGUgTWljcm9zb2Z0IGRvY3MgdXNlIHRoZSB3b3JkICJpbWFnZSIgaW5zdGVhZCBvZiAiZXhlY3V0YWJsZSIgYmVjYXVzZQotICAgdGhlIGZvcm1lciBjYW4gYWxzbyByZWZlciB0byBhIERMTCAoc2hhcmVkIGxpYnJhcnkpLiAgQ29uZnVzaW9uIGNhbiBhcmlzZQotICAgYmVjYXVzZSB0aGUgYGknIGluIGBwZWknIGFsc28gcmVmZXJzIHRvICJpbWFnZSIuICBUaGUgYHBlJyBmb3JtYXQgY2FuCi0gICBhbHNvIGNyZWF0ZSBpbWFnZXMgKGkuZS4gZXhlY3V0YWJsZXMpLCBpdCdzIGp1c3QgdGhhdCB0byBydW4gb24gYSB3aW4zMgotICAgc3lzdGVtIHlvdSBuZWVkIHRvIHVzZSB0aGUgcGVpIGZvcm1hdC4KLQotICAgRklYTUU6IFBsZWFzZSBhZGQgbW9yZSBkb2NzIGhlcmUgc28gdGhlIG5leHQgcG9vciBmb29sIHRoYXQgaGFzIHRvIGhhY2sKLSAgIG9uIHRoaXMgY29kZSBoYXMgYSBjaGFuY2Ugb2YgZ2V0dGluZyBzb21ldGhpbmcgYWNjb21wbGlzaGVkIHdpdGhvdXQKLSAgIHdhc3RpbmcgdG9vIG11Y2ggdGltZS4KLSovCi0KLSNpbmNsdWRlICJsaWJwZWkuaCIKLQotc3RhdGljIGJvb2xlYW4gKCpwZV9zYXZlZF9jb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKQotICAgIFBBUkFNUyAoKGJmZCAqLCBQVFIpKSA9Ci0jaWZuZGVmIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgICAgTlVMTDsKLSNlbHNlCi0gICAgIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGE7Ci0jdW5kZWYgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIFBUUikpOwotI2RlZmluZSBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotCi1zdGF0aWMgYm9vbGVhbiAoKnBlX3NhdmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkKLSAgICBQQVJBTVMgKChiZmQgKiwgYmZkICopKSA9Ci0jaWZuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICAgICBOVUxMOwotI2Vsc2UKLSAgICAgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhOwotI3VuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgY29mZl9ta29iamVjdCAgICAgIHBlX21rb2JqZWN0Ci0jZGVmaW5lIGNvZmZfbWtvYmplY3RfaG9vayBwZV9ta29iamVjdF9ob29rCi0KLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9maWxlaGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX3Njbmhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHBlX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgUFRSIHBlX21rb2JqZWN0X2hvb2sgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgc3JjOwotICAgICBQVFIgZHN0OwotewotICBSRUxPQyAqcmVsb2Nfc3JjID0gKFJFTE9DICopIHNyYzsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19kc3QgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopIGRzdDsKLQotICByZWxvY19kc3QtPnJfdmFkZHIgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopcmVsb2Nfc3JjLT5yX3ZhZGRyKTsKLSAgcmVsb2NfZHN0LT5yX3N5bW5keCA9IGJmZF9oX2dldF9zaWduZWRfMzIoYWJmZCwgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl9zeW1uZHgpOwotCi0gIHJlbG9jX2RzdC0+cl90eXBlID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfdHlwZSk7Ci0KLSNpZmRlZiBTV0FQX0lOX1JFTE9DX09GRlNFVAotICByZWxvY19kc3QtPnJfb2Zmc2V0ID0gU1dBUF9JTl9SRUxPQ19PRkZTRVQoYWJmZCwKLQkJCQkJICAgICAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX29mZnNldCk7Ci0jZW5kaWYKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJc3JjOwotICAgICBQVFIJZHN0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jX3NyYyA9IChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKilzcmM7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqcmVsb2NfZHN0ID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKWRzdDsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIHJlbG9jX3NyYy0+cl92YWRkciwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl92YWRkcik7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCByZWxvY19zcmMtPnJfc3ltbmR4LCAoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3N5bW5keCk7Ci0KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIHJlbG9jX3NyYy0+cl90eXBlLCAoYmZkX2J5dGUgKikKLQkgICAgICAgcmVsb2NfZHN0LT5yX3R5cGUpOwotCi0jaWZkZWYgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUCi0gIFNXQVBfT1VUX1JFTE9DX09GRlNFVChhYmZkLAotCQkJcmVsb2Nfc3JjLT5yX29mZnNldCwKLQkJCShiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfb2Zmc2V0KTsKLSNlbmRpZgotI2lmZGVmIFNXQVBfT1VUX1JFTE9DX0VYVFJBCi0gIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQscmVsb2Nfc3JjLCByZWxvY19kc3QpOwotI2VuZGlmCi0gIHJldHVybiBSRUxTWjsKLX0KLQotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX2ZpbGVoZHJfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSCSAgICAgc3JjOwotICAgICBQVFIJICAgICBkc3Q7Ci17Ci0gIEZJTEhEUiAqZmlsZWhkcl9zcmMgPSAoRklMSERSICopIHNyYzsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGRzdDsKLSAgZmlsZWhkcl9kc3QtPmZfbWFnaWMgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGZpbGVoZHJfc3JjLT5mX21hZ2ljKTsKLSAgZmlsZWhkcl9kc3QtPmZfbnNjbnMgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX25zY25zKTsKLSAgZmlsZWhkcl9kc3QtPmZfdGltZGF0ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl90aW1kYXQpOwotCi0gIGZpbGVoZHJfZHN0LT5mX25zeW1zID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9uc3ltcyk7Ci0gIGZpbGVoZHJfZHN0LT5mX2ZsYWdzID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9mbGFncyk7Ci0gIGZpbGVoZHJfZHN0LT5mX3N5bXB0ciA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGZpbGVoZHJfc3JjLT5mX3N5bXB0cik7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgLyogVGhlcmUgYXJlIHJlYWxseSB0d28gbWFnaWMgbnVtYmVycyBpbnZvbHZlZDsgdGhlIG1hZ2ljIG51bWJlcgotICAgICB0aGF0IHNheXMgdGhpcyBpcyBhIE5UIGV4ZWN1dGFibGUgKFBFSSkgYW5kIHRoZSBtYWdpYyBudW1iZXIgdGhhdAotICAgICBkZXRlcm1pbmVzIHRoZSBhcmNoaXRlY3R1cmUuICBUaGUgZm9ybWVyIGlzIERPU01BR0lDLCBzdG9yZWQgaW4KLSAgICAgdGhlIGVfbWFnaWMgZmllbGQuICBUaGUgbGF0dGVyIGlzIHN0b3JlZCBpbiB0aGUgZl9tYWdpYyBmaWVsZC4KLSAgICAgSWYgdGhlIE5UIG1hZ2ljIG51bWJlciBpc24ndCB2YWxpZCwgdGhlIGFyY2hpdGVjdHVyZSBtYWdpYyBudW1iZXIKLSAgICAgY291bGQgYmUgbWltaWNrZWQgYnkgc29tZSBvdGhlciBmaWVsZCAoc3BlY2lmaWNhbGx5LCB0aGUgbnVtYmVyCi0gICAgIG9mIHJlbG9jcyBpbiBzZWN0aW9uIDMpLiAgU2luY2UgdGhpcyByb3V0aW5lIGNhbiBvbmx5IGJlIGNhbGxlZAotICAgICBjb3JyZWN0bHkgZm9yIGEgUEVJIGZpbGUsIGNoZWNrIHRoZSBlX21hZ2ljIG51bWJlciBoZXJlLCBhbmQsIGlmCi0gICAgIGl0IGRvZXNuJ3QgbWF0Y2gsIGNsb2JiZXIgdGhlIGZfbWFnaWMgbnVtYmVyIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0Ci0gICAgIGEgZmFsc2UgbWF0Y2guICAqLwotICBpZiAoYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9zcmMtPmVfbWFnaWMpICE9IERPU01BR0lDKQotICAgIGZpbGVoZHJfZHN0LT5mX21hZ2ljID0gLTE7Ci0jZW5kaWYKLQotICAvKiBPdGhlciBwZW9wbGUncyB0b29scyBzb21ldGltZXMgZ2VuZXJhdGUgaGVhZGVycyB3aXRoIGFuIG5zeW1zIGJ1dAotICAgICBhIHplcm8gc3ltcHRyLiAgKi8KLSAgaWYgKGZpbGVoZHJfZHN0LT5mX25zeW1zICE9IDAgJiYgZmlsZWhkcl9kc3QtPmZfc3ltcHRyID09IDApCi0gICAgewotICAgICAgZmlsZWhkcl9kc3QtPmZfbnN5bXMgPSAwOwotICAgICAgZmlsZWhkcl9kc3QtPmZfZmxhZ3MgfD0gRl9MU1lNUzsKLSAgICB9Ci0KLSAgZmlsZWhkcl9kc3QtPmZfb3B0aGRyID0gYmZkX2hfZ2V0XzE2KGFiZmQsIAotCQkJCSAgICAgICAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfb3B0aGRyKTsKLX0KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgX2JmZF9wZWlfb25seV9zd2FwX2ZpbGVoZHJfb3V0Ci0jZWxzZQotI2RlZmluZSBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgX2JmZF9wZV9vbmx5X3N3YXBfZmlsZWhkcl9vdXQKLSNlbmRpZgotCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfc2NuaGRyX2luIChhYmZkLCBleHQsIGluKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSCSAgICAgZXh0OwotICAgICBQVFIJICAgICBpbjsKLXsKLSAgU0NOSERSICpzY25oZHJfZXh0ID0gKFNDTkhEUiAqKSBleHQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBpbjsKLQotICBtZW1jcHkoc2NuaGRyX2ludC0+c19uYW1lLCBzY25oZHJfZXh0LT5zX25hbWUsIHNpemVvZihzY25oZHJfaW50LT5zX25hbWUpKTsKLSAgc2NuaGRyX2ludC0+c192YWRkciA9Ci0gICAgR0VUX1NDTkhEUl9WQUREUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfdmFkZHIpOwotICBzY25oZHJfaW50LT5zX3BhZGRyID0KLSAgICBHRVRfU0NOSERSX1BBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19wYWRkcik7Ci0gIHNjbmhkcl9pbnQtPnNfc2l6ZSA9Ci0gICAgR0VUX1NDTkhEUl9TSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zaXplKTsKLSAgc2NuaGRyX2ludC0+c19zY25wdHIgPQotICAgIEdFVF9TQ05IRFJfU0NOUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zY25wdHIpOwotICBzY25oZHJfaW50LT5zX3JlbHB0ciA9Ci0gICAgR0VUX1NDTkhEUl9SRUxQVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3JlbHB0cik7Ci0gIHNjbmhkcl9pbnQtPnNfbG5ub3B0ciA9Ci0gICAgR0VUX1NDTkhEUl9MTk5PUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19sbm5vcHRyKTsKLSAgc2NuaGRyX2ludC0+c19mbGFncyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19mbGFncyk7Ci0KLSAgLyogTVMgaGFuZGxlcyBvdmVyZmxvdyBvZiBsaW5lIG51bWJlcnMgYnkgY2FycnlpbmcgaW50byB0aGUgcmVsb2MKLSAgICAgZmllbGQgKGl0IGFwcGVhcnMpLiAgU2luY2UgaXQncyBzdXBwb3NlZCB0byBiZSB6ZXJvIGZvciBQRQotICAgICAqSU1BR0UqIGZvcm1hdCwgdGhhdCdzIHNhZmUuICBUaGlzIGlzIHN0aWxsIGEgYml0IGlmZnkuICAqLwotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICBzY25oZHJfaW50LT5zX25sbm5vID0KLSAgICAoYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubykKLSAgICAgKyAoYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpIDw8IDE2KSk7Ci0gIHNjbmhkcl9pbnQtPnNfbnJlbG9jID0gMDsKLSNlbHNlCi0gIHNjbmhkcl9pbnQtPnNfbnJlbG9jID0gYmZkX2hfZ2V0XzE2IChhYmZkLAotCQkJCSAgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICBzY25oZHJfaW50LT5zX25sbm5vID0gYmZkX2hfZ2V0XzE2IChhYmZkLAotCQkJCSAgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSNlbmRpZgotCi0gIGlmIChzY25oZHJfaW50LT5zX3ZhZGRyICE9IDApIAotICAgIHsKLSAgICAgIHNjbmhkcl9pbnQtPnNfdmFkZHIgKz0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gICAgICBzY25oZHJfaW50LT5zX3ZhZGRyICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc2VjdGlvbiBob2xkcyB1bmluaXRpYWxpemVkIGRhdGEsIHVzZSB0aGUgdmlydHVhbCBzaXplCi0gICAgIChzdG9yZWQgaW4gc19wYWRkcikgaW5zdGVhZCBvZiB0aGUgcGh5c2ljYWwgc2l6ZS4gICovCi0gIGlmICgoc2NuaGRyX2ludC0+c19mbGFncyAmIElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBKSAhPSAwKQotICAgIHsKLSAgICAgIHNjbmhkcl9pbnQtPnNfc2l6ZSA9IHNjbmhkcl9pbnQtPnNfcGFkZHI7Ci0gICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBzZXQgc2NuaGRyX2ludC0+c19wYWRkciB0byAwLiAgSG93ZXZlciwKLSAgICAgICAgIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIHN0b3JlcyBzX3BhZGRyIGluIHZpcnRfc2l6ZSwgd2hpY2gKLSAgICAgICAgIG9ubHkgd29ya3MgaWYgaXQgY29ycmVjdGx5IGhvbGRzIHRoZSB2aXJ0dWFsIHNpemUgb2YgdGhlCi0gICAgICAgICBzZWN0aW9uLiAgKi8KLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgcGVfZGF0YV90eXBlICpwZTsKLSAgYWJmZC0+dGRhdGEucGVfb2JqX2RhdGEgPSAKLSAgICAoc3RydWN0IHBlX3RkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAocGVfZGF0YV90eXBlKSk7Ci0KLSAgaWYgKGFiZmQtPnRkYXRhLnBlX29ial9kYXRhID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBlID0gcGVfZGF0YSAoYWJmZCk7Ci0KLSAgcGUtPmNvZmYucGUgPSAxOwotCi0gIC8qIGluX3JlbG9jX3AgaXMgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudC4gICovCi0gIHBlLT5pbl9yZWxvY19wID0gaW5fcmVsb2NfcDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgQ09GRiBiYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLXN0YXRpYyBQVFIKLXBlX21rb2JqZWN0X2hvb2sgKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotICAgICBQVFIgYW91dGhkciBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotICBwZV9kYXRhX3R5cGUgKnBlOwotCi0gIGlmIChwZV9ta29iamVjdCAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcGUgPSBwZV9kYXRhIChhYmZkKTsKLSAgcGUtPmNvZmYuc3ltX2ZpbGVwb3MgPSBpbnRlcm5hbF9mLT5mX3N5bXB0cjsKLSAgLyogVGhlc2UgbWVtYmVycyBjb21tdW5pY2F0ZSBpbXBvcnRhbnQgY29uc3RhbnRzIGFib3V0IHRoZSBzeW1ib2wKLSAgICAgdGFibGUgdG8gR0RCJ3Mgc3ltYm9sLXJlYWRpbmcgY29kZS4gIFRoZXNlIGBjb25zdGFudHMnCi0gICAgIHVuZm9ydHVuYXRlbHkgdmFyeSBhbW9uZyBjb2ZmIGltcGxlbWVudGF0aW9ucy4uLiAgKi8KLSAgcGUtPmNvZmYubG9jYWxfbl9idG1hc2sgPSBOX0JUTUFTSzsKLSAgcGUtPmNvZmYubG9jYWxfbl9idHNoZnQgPSBOX0JUU0hGVDsKLSAgcGUtPmNvZmYubG9jYWxfbl90bWFzayA9IE5fVE1BU0s7Ci0gIHBlLT5jb2ZmLmxvY2FsX25fdHNoaWZ0ID0gTl9UU0hJRlQ7Ci0gIHBlLT5jb2ZmLmxvY2FsX3N5bWVzeiA9IFNZTUVTWjsKLSAgcGUtPmNvZmYubG9jYWxfYXV4ZXN6ID0gQVVYRVNaOwotICBwZS0+Y29mZi5sb2NhbF9saW5lc3ogPSBMSU5FU1o7Ci0KLSAgcGUtPmNvZmYudGltZXN0YW1wID0gaW50ZXJuYWxfZi0+Zl90aW1kYXQ7Ci0KLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0KLSAgICBvYmpfY29udl90YWJsZV9zaXplIChhYmZkKSA9Ci0gICAgICBpbnRlcm5hbF9mLT5mX25zeW1zOwotCi0gIHBlLT5yZWFsX2ZsYWdzID0gaW50ZXJuYWxfZi0+Zl9mbGFnczsKLQotICBpZiAoKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0RMTCkgIT0gMCkKLSAgICBwZS0+ZGxsID0gMTsKLQotICBpZiAoKGludGVybmFsX2YtPmZfZmxhZ3MgJiBJTUFHRV9GSUxFX0RFQlVHX1NUUklQUEVEKSA9PSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19ERUJVRzsKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICBpZiAoYW91dGhkcikgCi0gICAgcGUtPnBlX29wdGhkciA9ICgoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKilhb3V0aGRyKS0+cGU7Ci0jZW5kaWYKLQotI2lmZGVmIEFSTSAKLSAgaWYgKCEgX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgaW50ZXJuYWxfZi0+Zl9mbGFncykpCi0gICAgY29mZl9kYXRhIChhYmZkKSAtPmZsYWdzID0gMDsKLSNlbmRpZgotICAKLSAgcmV0dXJuIChQVFIpIHBlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotcGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgdmZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0KLSAgaWYgKCFfYmZkX3BlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGFfY29tbW9uIChhYmZkLCB2ZmlsZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChwZV9zYXZlZF9jb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhICE9IE5VTEwpCi0gICAgewotICAgICAgZnB1dGMgKCdcbicsIGZpbGUpOwotCi0gICAgICByZXR1cm4gcGVfc2F2ZWRfY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgdmZpbGUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBhbnkgcHJpdmF0ZSBpbmZvIHdlIHVuZGVyc3RhbmQgZnJvbSB0aGUgaW5wdXQgYmZkCi0gICB0byB0aGUgb3V0cHV0IGJmZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQsICpvYmZkOwotewotICBpZiAoIV9iZmRfcGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YV9jb21tb24gKGliZmQsIG9iZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAocGVfc2F2ZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKQotICAgIHJldHVybiBwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAotICBfYmZkX3BlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0KLSNkZWZpbmUgY29mZl9nZXRfc3ltYm9sX2luZm8gX2JmZF9wZV9nZXRfc3ltYm9sX2luZm8KZGlmZiAtLWdpdCBhL2JmZC9wZWlnZW4uYyBiL2JmZC9wZWlnZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4YmEwZS4uMDAwMDAwMAotLS0gYS9iZmQvcGVpZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEyICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIHRoZSBnZW5lcmljIHBhcnRzIG9mIFBFL1BFSTsgdGhlIGNvbW1vbiBleGVjdXRhYmxlIHBhcnRzLgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLU1vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLAotCQkJc2FjQGN5Z251cy5jb20KLQotUEUvUEVJIHJlYXJyYW5nZW1lbnQgKGFuZCBjb2RlIGFkZGVkKTogRG9ubiBUZXJyeQotCQkJCSAgICAgICBTb2Z0d2F5IFN5c3RlbXMsIEluYy4KLSovCi0KLS8qIEhleSBsb29rLCBzb21lIGRvY3VtZW50YXRpb24gW2FuZCBpbiBhIHBsYWNlIHlvdSBleHBlY3QgdG8gZmluZCBpdF0hCi0KLSAgIFRoZSBtYWluIHJlZmVyZW5jZSBmb3IgdGhlIHBlaSBmb3JtYXQgaXMgIk1pY3Jvc29mdCBQb3J0YWJsZSBFeGVjdXRhYmxlCi0gICBhbmQgQ29tbW9uIE9iamVjdCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIDQuMSIuICBHZXQgaXQgaWYgeW91IG5lZWQgdG8KLSAgIGRvIHNvbWUgc2VyaW91cyBoYWNraW5nIG9uIHRoaXMgY29kZS4KLQotICAgQW5vdGhlciByZWZlcmVuY2U6Ci0gICAiUGVlcmluZyBJbnNpZGUgdGhlIFBFOiBBIFRvdXIgb2YgdGhlIFdpbjMyIFBvcnRhYmxlIEV4ZWN1dGFibGUKLSAgIEZpbGUgRm9ybWF0IiwgTVNKIDE5OTQsIFZvbHVtZSA5LgotCi0gICBUaGUgKnNvbGUqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcGUgZm9ybWF0IGFuZCB0aGUgcGVpIGZvcm1hdCBpcyB0aGF0IHRoZQotICAgbGF0dGVyIGhhcyBhbiBNU0RPUyAyLjAgLmV4ZSBoZWFkZXIgb24gdGhlIGZyb250IHRoYXQgcHJpbnRzIHRoZSBtZXNzYWdlCi0gICAiVGhpcyBhcHAgbXVzdCBiZSBydW4gdW5kZXIgV2luZG93cy4iIChvciBzb21lIHN1Y2gpLgotICAgKEZJWE1FOiBXaGV0aGVyIHRoYXQgc3RhdGVtZW50IGlzICpyZWFsbHkqIHRydWUgb3Igbm90IGlzIHVua25vd24uCi0gICBBcmUgdGhlcmUgbW9yZSBzdWJ0bGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwZSBhbmQgcGVpIGZvcm1hdHM/Ci0gICBGb3Igbm93IGFzc3VtZSB0aGVyZSBhcmVuJ3QuICBJZiB5b3UgZmluZCBvbmUsIHRoZW4gZm9yIEdvZCBzYWtlcwotICAgZG9jdW1lbnQgaXQgaGVyZSEpCi0KLSAgIFRoZSBNaWNyb3NvZnQgZG9jcyB1c2UgdGhlIHdvcmQgImltYWdlIiBpbnN0ZWFkIG9mICJleGVjdXRhYmxlIiBiZWNhdXNlCi0gICB0aGUgZm9ybWVyIGNhbiBhbHNvIHJlZmVyIHRvIGEgRExMIChzaGFyZWQgbGlicmFyeSkuICBDb25mdXNpb24gY2FuIGFyaXNlCi0gICBiZWNhdXNlIHRoZSBgaScgaW4gYHBlaScgYWxzbyByZWZlcnMgdG8gImltYWdlIi4gIFRoZSBgcGUnIGZvcm1hdCBjYW4KLSAgIGFsc28gY3JlYXRlIGltYWdlcyAoaS5lLiBleGVjdXRhYmxlcyksIGl0J3MganVzdCB0aGF0IHRvIHJ1biBvbiBhIHdpbjMyCi0gICBzeXN0ZW0geW91IG5lZWQgdG8gdXNlIHRoZSBwZWkgZm9ybWF0LgotCi0gICBGSVhNRTogUGxlYXNlIGFkZCBtb3JlIGRvY3MgaGVyZSBzbyB0aGUgbmV4dCBwb29yIGZvb2wgdGhhdCBoYXMgdG8gaGFjawotICAgb24gdGhpcyBjb2RlIGhhcyBhIGNoYW5jZSBvZiBnZXR0aW5nIHNvbWV0aGluZyBhY2NvbXBsaXNoZWQgd2l0aG91dAotICAgd2FzdGluZyB0b28gbXVjaCB0aW1lLgotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLQotLyogTk9URTogaXQncyBzdHJhbmdlIHRvIGJlIGluY2x1ZGluZyBhbiBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaGVhZGVyCi0gICBpbiB3aGF0J3Mgc3VwcG9zZWQgdG8gYmUgZ2VuZXJhbCAodG8gUEUvUEVJKSBjb2RlLiAgSG93ZXZlciwgdGhhdCdzCi0gICB3aGVyZSB0aGUgZGVmaW5pdGlvbnMgYXJlLCBhbmQgdGhleSBkb24ndCB2YXJ5IHBlciBhcmNoaXRlY3R1cmUKLSAgIHdpdGhpbiBQRS9QRUksIHNvIHdlIGdldCB0aGVtIGZyb20gdGhlcmUuICBGSVhNRTogVGhlIGxhY2sgb2YKLSAgIHZhcmlhbmNlIGlzIGFuIGFzc3VtcHRpb24gd2hpY2ggbWF5IHByb3ZlIHRvIGJlIGluY29ycmVjdCBpZiBuZXcKLSAgIFBFL1BFSSB0YXJnZXRzIGFyZSBjcmVhdGVkLiAgKi8KLSNpbmNsdWRlICJjb2ZmL2kzODYuaCIKLQotI2luY2x1ZGUgImNvZmYvcGUuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0jaW5jbHVkZSAibGlicGVpLmgiCi0KLS8qIEZJWE1FOiBUaGlzIGZpbGUgaGFzIHZhcmlvdXMgdGVzdHMgb2YgUE9XRVJQQ19MRV9QRS4gIFRob3NlIHRlc3RzCi0gICB3b3JrZWQgd2hlbiB0aGUgY29kZSB3YXMgaW4gcGVpY29kZS5oLCBidXQgbm8gbG9uZ2VyIHdvcmsgbm93IHRoYXQKLSAgIHRoZSBjb2RlIGlzIGluIHBlaWdlbi5jLiAgUG93ZXJQQyBOVCBpcyBzYWlkIHRvIGJlIGRlYWQuICBJZgotICAgYW55Ym9keSB3YW50cyB0byByZXZpdmUgdGhlIGNvZGUsIHlvdSB3aWxsIGhhdmUgdG8gZmlndXJlIG91dCBob3cKLSAgIHRvIGhhbmRsZSB0aG9zZSBpc3N1ZXMuICAqLwotCi1zdGF0aWMgdm9pZCBhZGRfZGF0YV9lbnRyeQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKiwgaW50LCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHBlX3ByaW50X3BkYXRhIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHBlX3ByaW50X3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLV9iZmRfcGVpX3N3YXBfc3ltX2luIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIFNZTUVOVCAqZXh0ID0gKFNZTUVOVCAqKWV4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKWluMTsKLQotICBpZiggZXh0LT5lLmVfbmFtZVswXSA9PSAwKSB7Ci0gICAgaW4tPl9uLl9uX24uX25femVyb2VzID0gMDsKLSAgICBpbi0+X24uX25fbi5fbl9vZmZzZXQgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZS5lLmVfb2Zmc2V0KTsKLSAgfQotICBlbHNlIHsKLSAgICBtZW1jcHkoaW4tPl9uLl9uX25hbWUsIGV4dC0+ZS5lX25hbWUsIFNZTU5NTEVOKTsKLSAgfQotCi0gIGluLT5uX3ZhbHVlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdmFsdWUpOwotICBpbi0+bl9zY251bSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3NjbnVtKTsKLSAgaWYgKHNpemVvZihleHQtPmVfdHlwZSkgPT0gMil7Ci0gICAgaW4tPm5fdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICB9Ci0gIGVsc2UgewotICAgIGluLT5uX3R5cGUgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgfQotICBpbi0+bl9zY2xhc3MgPSBiZmRfaF9nZXRfOChhYmZkLCBleHQtPmVfc2NsYXNzKTsKLSAgaW4tPm5fbnVtYXV4ID0gYmZkX2hfZ2V0XzgoYWJmZCwgZXh0LT5lX251bWF1eCk7Ci0KLSNpZm5kZWYgU1RSSUNUX1BFX0ZPUk1BVAotICAvKiBUaGlzIGlzIGZvciBHbnUtY3JlYXRlZCBETExzICovCi0KLSAgLyogVGhlIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhlIC5pZGF0YSQgc2VjdGlvbnMgaGF2ZSBjbGFzcyAweDY4Ci0gICAgIChDX1NFQ1RJT04pLCB3aGljaCBNUyBkb2N1bWVudGF0aW9uIGluZGljYXRlcyBpcyBhIHNlY3Rpb24KLSAgICAgc3ltYm9sLiAgVW5mb3J0dW5hdGVseSwgdGhlIHZhbHVlIGZpZWxkIGluIHRoZSBzeW1ib2wgaXMgc2ltcGx5IGEKLSAgICAgY29weSBvZiB0aGUgLmlkYXRhIHNlY3Rpb24ncyBmbGFncyByYXRoZXIgdGhhbiBzb21ldGhpbmcgdXNlZnVsLgotICAgICBXaGVuIHRoZXNlIHN5bWJvbHMgYXJlIGVuY291bnRlcmVkLCBjaGFuZ2UgdGhlIHZhbHVlIHRvIDAgc28gdGhhdAotICAgICB0aGV5IHdpbGwgYmUgaGFuZGxlZCBzb21ld2hhdCBjb3JyZWN0bHkgaW4gdGhlIGJmZCBjb2RlLiAgKi8KLSAgaWYgKGluLT5uX3NjbGFzcyA9PSBDX1NFQ1RJT04pCi0gICAgewotICAgICAgaW4tPm5fdmFsdWUgPSAweDA7Ci0KLSNpZiAwCi0gICAgICAvKiBGSVhNRTogVGhpcyBpcyBjbGVhcmx5IHdyb25nLiAgVGhlIHByb2JsZW0gc2VlbXMgdG8gYmUgdGhhdAotICAgICAgICAgdW5kZWZpbmVkIENfU0VDVElPTiBzeW1ib2xzIGFwcGVhciBpbiB0aGUgZmlyc3Qgb2JqZWN0IG9mIGEKLSAgICAgICAgIE1TIGdlbmVyYXRlZCAubGliIGZpbGUsIGFuZCB0aGUgc3ltYm9scyBhcmUgbm90IGRlZmluZWQKLSAgICAgICAgIGFueXdoZXJlLiAgKi8KLSAgICAgIGluLT5uX3NjbnVtID0gMTsKLQotICAgICAgLyogSSBoYXZlIHRyaWVkIHNldHRpbmcgdGhlIGNsYXNzIHRvIDMgYW5kIHVzaW5nIHRoZSBmb2xsb3dpbmcKLQkgdG8gc2V0IHRoZSBzZWN0aW9uIG51bWJlci4gIFRoaXMgd2lsbCBwdXQgdGhlIGFkZHJlc3Mgb2YgdGhlCi0JIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBrZXJuZWwzMi5kbGwgYXQgYWRkcmVzc2VzIDAgYW5kIDB4MTAKLQkgb2ZmIHN0YXJ0IG9mIGlkYXRhIHNlY3Rpb24gd2hpY2ggaXMgbm90IGNvcnJlY3QgKi8KLSAgICAgIC8qICAgIGlmIChzdHJjbXAgKGluLT5fbi5fbl9uYW1lLCAiLmlkYXRhJDQiKSA9PSAwKSAqLwotICAgICAgLyogICAgICBpbi0+bl9zY251bSA9IDM7ICovCi0gICAgICAvKiAgICBlbHNlICovCi0gICAgICAvKiAgICAgIGluLT5uX3NjbnVtID0gMjsgKi8KLSNlbHNlCi0gICAgICAvKiBDcmVhdGUgc3ludGhldGljIGVtcHR5IHNlY3Rpb25zIGFzIG5lZWRlZC4gIERKICovCi0gICAgICBpZiAoaW4tPm5fc2NudW0gPT0gMCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCSAgZm9yIChzZWM9YWJmZC0+c2VjdGlvbnM7IHNlYzsgc2VjPXNlYy0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKHNlYy0+bmFtZSwgaW4tPm5fbmFtZSkgPT0gMCkKLQkJewotCQkgIGluLT5uX3NjbnVtID0gc2VjLT50YXJnZXRfaW5kZXg7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGlmIChpbi0+bl9zY251bSA9PSAwKQotCXsKLQkgIGludCB1bnVzZWRfc2VjdGlvbl9udW1iZXIgPSAwOwotCSAgYXNlY3Rpb24gKnNlYzsKLQkgIGNoYXIgKm5hbWU7Ci0JICBmb3IgKHNlYz1hYmZkLT5zZWN0aW9uczsgc2VjOyBzZWM9c2VjLT5uZXh0KQotCSAgICBpZiAodW51c2VkX3NlY3Rpb25fbnVtYmVyIDw9IHNlYy0+dGFyZ2V0X2luZGV4KQotCSAgICAgIHVudXNlZF9zZWN0aW9uX251bWJlciA9IHNlYy0+dGFyZ2V0X2luZGV4KzE7Ci0KLQkgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoaW4tPm5fbmFtZSkgKyAxMCk7Ci0JICBpZiAobmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm47Ci0JICBzdHJjcHkgKG5hbWUsIGluLT5uX25hbWUpOwotCSAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotCi0JICBzZWMtPnZtYSA9IDA7Ci0JICBzZWMtPmxtYSA9IDA7Ci0JICBzZWMtPl9jb29rZWRfc2l6ZSA9IDA7Ci0JICBzZWMtPl9yYXdfc2l6ZSA9IDA7Ci0JICBzZWMtPmZpbGVwb3MgPSAwOwotCSAgc2VjLT5yZWxfZmlsZXBvcyA9IDA7Ci0JICBzZWMtPnJlbG9jX2NvdW50ID0gMDsKLQkgIHNlYy0+bGluZV9maWxlcG9zID0gMDsKLQkgIHNlYy0+bGluZW5vX2NvdW50ID0gMDsKLQkgIHNlYy0+dXNlcmRhdGEgPSBOVUxMOwotCSAgc2VjLT5uZXh0ID0gKGFzZWN0aW9uICopIE5VTEw7Ci0JICBzZWMtPmZsYWdzID0gMDsKLQkgIHNlYy0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQkgIHNlYy0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0RBVEEgfCBTRUNfTE9BRDsKLQotCSAgc2VjLT50YXJnZXRfaW5kZXggPSB1bnVzZWRfc2VjdGlvbl9udW1iZXI7Ci0KLQkgIGluLT5uX3NjbnVtID0gdW51c2VkX3NlY3Rpb25fbnVtYmVyOwotCX0KLSAgICAgIGluLT5uX3NjbGFzcyA9IENfU1RBVDsKLSNlbmRpZgotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgY29mZl9zd2FwX3N5bV9pbl9ob29rCi0gIC8qIFRoaXMgd29uJ3Qgd29yayBpbiBwZWlnZW4uYywgYnV0IHNpbmNlIGl0J3MgZm9yIFBQQyBQRSwgaXQncyBub3QKLSAgICAgd29ydGggZml4aW5nLiAqLwotICBjb2ZmX3N3YXBfc3ltX2luX2hvb2soYWJmZCwgZXh0MSwgaW4xKTsKLSNlbmRpZgotfQotCi11bnNpZ25lZCBpbnQKLV9iZmRfcGVpX3N3YXBfc3ltX291dCAoYWJmZCwgaW5wLCBleHRwKQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbnA7Ci0gICAgIFBUUglleHRwOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopaW5wOwotICBTWU1FTlQgKmV4dCA9KFNZTUVOVCAqKWV4dHA7Ci0gIGlmKGluLT5fbi5fbl9uYW1lWzBdID09IDApIHsKLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgMCwgKGJmZF9ieXRlICopIGV4dC0+ZS5lLmVfemVyb2VzKTsKLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPl9uLl9uX24uX25fb2Zmc2V0LCAoYmZkX2J5dGUgKikgIGV4dC0+ZS5lLmVfb2Zmc2V0KTsKLSAgfQotICBlbHNlIHsKLSAgICBtZW1jcHkoZXh0LT5lLmVfbmFtZSwgaW4tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLSAgfQotCi0gIGJmZF9oX3B1dF8zMihhYmZkLCAgaW4tPm5fdmFsdWUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3ZhbHVlKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsICBpbi0+bl9zY251bSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfc2NudW0pOwotICBpZiAoc2l6ZW9mKGV4dC0+ZV90eXBlKSA9PSAyKQotICAgIHsKLSAgICAgIGJmZF9oX3B1dF8xNihhYmZkLCAgaW4tPm5fdHlwZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbi0+bl90eXBlICwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgICB9Ci0gIGJmZF9oX3B1dF84KGFiZmQsICBpbi0+bl9zY2xhc3MgLCBleHQtPmVfc2NsYXNzKTsKLSAgYmZkX2hfcHV0XzgoYWJmZCwgIGluLT5uX251bWF1eCAsIGV4dC0+ZV9udW1hdXgpOwotCi0gIHJldHVybiBTWU1FU1o7Ci19Ci0KLXZvaWQKLV9iZmRfcGVpX3N3YXBfYXV4X2luIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIJICAgICBleHQxOwotICAgICBpbnQgICAgICAgICAgICAgdHlwZTsKLSAgICAgaW50ICAgICAgICAgICAgIGNsYXNzOwotICAgICBpbnQJICAgICBpbmR4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludAkgICAgIG51bWF1eCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgCSAgICAgaW4xOwotewotICBBVVhFTlQgICAgKmV4dCA9IChBVVhFTlQgKilleHQxOwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKWluMTsKLQotICBzd2l0Y2ggKGNsYXNzKSB7Ci0gIGNhc2UgQ19GSUxFOgotICAgIGlmIChleHQtPnhfZmlsZS54X2ZuYW1lWzBdID09IDApIHsKLSAgICAgIGluLT54X2ZpbGUueF9uLnhfemVyb2VzID0gMDsKLSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0ID0KLQliZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X29mZnNldCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1lbWNweSAoaW4tPnhfZmlsZS54X2ZuYW1lLCBleHQtPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7Ci0gICAgfQotICAgIHJldHVybjsKLQotCi0gIGNhc2UgQ19TVEFUOgotICBjYXNlIENfTEVBRlNUQVQ6Ci0gIGNhc2UgQ19ISURERU46Ci0gICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0gICAgICBpbi0+eF9zY24ueF9zY25sZW4gPSBHRVRfU0NOX1NDTkxFTihhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc2NuLnhfbnJlbG9jID0gR0VUX1NDTl9OUkVMT0MoYWJmZCwgZXh0KTsKLSAgICAgIGluLT54X3Njbi54X25saW5ubyA9IEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCk7Ci0gICAgICBpbi0+eF9zY24ueF9jaGVja3N1bSA9IGJmZF9oX2dldF8zMiAoYWJmZCwKLQkJCQkJICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jaGVja3N1bSk7Ci0gICAgICBpbi0+eF9zY24ueF9hc3NvY2lhdGVkID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfYXNzb2NpYXRlZCk7Ci0gICAgICBpbi0+eF9zY24ueF9jb21kYXQgPSBiZmRfaF9nZXRfOCAoYWJmZCwKLQkJCQkJKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jb21kYXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGluLT54X3N5bS54X3RhZ25keC5sID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSAgaW4tPnhfc3ltLnhfdHZuZHggPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9IEdFVF9GQ05fTE5OT1BUUiAoYWJmZCwgZXh0KTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0gR0VUX0ZDTl9FTkRORFggKGFiZmQsIGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSk7Ci0gICAgfQotCi0gIGlmIChJU0ZDTih0eXBlKSkgewotICAgIGluLT54X3N5bS54X21pc2MueF9mc2l6ZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9mc2l6ZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vID0gR0VUX0xOU1pfTE5OTyhhYmZkLCBleHQpOwotICAgIGluLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSA9IEdFVF9MTlNaX1NJWkUoYWJmZCwgZXh0KTsKLSAgfQotfQotCi11bnNpZ25lZCBpbnQKLV9iZmRfcGVpX3N3YXBfYXV4X291dCAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKQotICAgICBiZmQgICphYmZkOwotICAgICBQVFIgICBpbnA7Ci0gICAgIGludCAgIHR5cGU7Ci0gICAgIGludCAgIGNsYXNzOwotICAgICBpbnQgICBpbmR4IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCAgIG51bWF1eCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgICBleHRwOwotewotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKWlucDsKLSAgQVVYRU5UICpleHQgPSAoQVVYRU5UICopZXh0cDsKLQotICBtZW1zZXQoKFBUUilleHQsIDAsIEFVWEVTWik7Ci0gIHN3aXRjaCAoY2xhc3MpIHsKLSAgY2FzZSBDX0ZJTEU6Ci0gICAgaWYgKGluLT54X2ZpbGUueF9mbmFtZVswXSA9PSAwKSB7Ci0gICAgICBiZmRfaF9wdXRfMzIoYWJmZCwgMCwgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X3plcm9lcyk7Ci0gICAgICBiZmRfaF9wdXRfMzIoYWJmZCwKLQkgICAgICBpbi0+eF9maWxlLnhfbi54X29mZnNldCwKLQkgICAgICAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfb2Zmc2V0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBtZW1jcHkgKGV4dC0+eF9maWxlLnhfZm5hbWUsIGluLT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOwotICAgIH0KLSAgICByZXR1cm4gQVVYRVNaOwotCi0KLSAgY2FzZSBDX1NUQVQ6Ci0gIGNhc2UgQ19MRUFGU1RBVDoKLSAgY2FzZSBDX0hJRERFTjoKLSAgICBpZiAodHlwZSA9PSBUX05VTEwpIHsKLSAgICAgIFBVVF9TQ05fU0NOTEVOKGFiZmQsIGluLT54X3Njbi54X3NjbmxlbiwgZXh0KTsKLSAgICAgIFBVVF9TQ05fTlJFTE9DKGFiZmQsIGluLT54X3Njbi54X25yZWxvYywgZXh0KTsKLSAgICAgIFBVVF9TQ05fTkxJTk5PKGFiZmQsIGluLT54X3Njbi54X25saW5ubywgZXh0KTsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPnhfc2NuLnhfY2hlY2tzdW0sCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X2NoZWNrc3VtKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc2NuLnhfYXNzb2NpYXRlZCwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfYXNzb2NpYXRlZCk7Ci0gICAgICBiZmRfaF9wdXRfOCAoYWJmZCwgaW4tPnhfc2NuLnhfY29tZGF0LAotCQkgICAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X2NvbWRhdCk7Ci0gICAgICByZXR1cm4gQVVYRVNaOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGJmZF9oX3B1dF8zMihhYmZkLCBpbi0+eF9zeW0ueF90YWduZHgubCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90YWduZHgpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgaW4tPnhfc3ltLnhfdHZuZHggLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3R2bmR4KTsKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIGV4dCk7Ci0gICAgICBQVVRfRkNOX0VORE5EWChhYmZkLCAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwsIGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10pOwotICAgIH0KLQotICBpZiAoSVNGQ04gKHR5cGUpKQotICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplLAotCSAgICAgKGJmZF9ieXRlICopICBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIFBVVF9MTlNaX0xOTk8gKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubywgZXh0KTsKLSAgICAgIFBVVF9MTlNaX1NJWkUgKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSwgZXh0KTsKLSAgICB9Ci0KLSAgcmV0dXJuIEFVWEVTWjsKLX0KLQotdm9pZAotX2JmZF9wZWlfc3dhcF9saW5lbm9faW4gKGFiZmQsIGV4dDEsIGluMSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0MTsKLSAgICAgUFRSIGluMTsKLXsKLSAgTElORU5PICpleHQgPSAoTElORU5PICopZXh0MTsKLSAgc3RydWN0IGludGVybmFsX2xpbmVubyAgICAgICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICopaW4xOwotCi0gIGluLT5sX2FkZHIubF9zeW1uZHggPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+bF9hZGRyLmxfc3ltbmR4KTsKLSAgaW4tPmxfbG5ubyA9IEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpOwotfQotCi11bnNpZ25lZCBpbnQKLV9iZmRfcGVpX3N3YXBfbGluZW5vX291dCAoYWJmZCwgaW5wLCBvdXRwKQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbnA7Ci0gICAgIFBUUglvdXRwOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICopaW5wOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICpleHQgPSAoc3RydWN0IGV4dGVybmFsX2xpbmVubyAqKW91dHA7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBpbi0+bF9hZGRyLmxfc3ltbmR4LCAoYmZkX2J5dGUgKikKLQkgIGV4dC0+bF9hZGRyLmxfc3ltbmR4KTsKLQotICBQVVRfTElORU5PX0xOTk8gKGFiZmQsIGluLT5sX2xubm8sIGV4dCk7Ci0gIHJldHVybiBMSU5FU1o7Ci19Ci0KLXZvaWQKLV9iZmRfcGVpX3N3YXBfYW91dGhkcl9pbiAoYWJmZCwgYW91dGhkcl9leHQxLCBhb3V0aGRyX2ludDEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGFvdXRoZHJfZXh0MTsKLSAgICAgUFRSIGFvdXRoZHJfaW50MTsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmE7Ci0gIFBFQU9VVEhEUiAqc3JjID0gKFBFQU9VVEhEUiAqKShhb3V0aGRyX2V4dDEpOwotICBBT1VUSERSICAgICAgICAqYW91dGhkcl9leHQgPSAoQU9VVEhEUiAqKSBhb3V0aGRyX2V4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICphb3V0aGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWFvdXRoZHJfaW50MTsKLQotICBhb3V0aGRyX2ludC0+bWFnaWMgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5tYWdpYyk7Ci0gIGFvdXRoZHJfaW50LT52c3RhbXAgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT52c3RhbXApOwotICBhb3V0aGRyX2ludC0+dHNpemUgPQotICAgIEdFVF9BT1VUSERSX1RTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRzaXplKTsKLSAgYW91dGhkcl9pbnQtPmRzaXplID0KLSAgICBHRVRfQU9VVEhEUl9EU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5kc2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5ic2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfQlNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+YnNpemUpOwotICBhb3V0aGRyX2ludC0+ZW50cnkgPQotICAgIEdFVF9BT1VUSERSX0VOVFJZIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmVudHJ5KTsKLSAgYW91dGhkcl9pbnQtPnRleHRfc3RhcnQgPQotICAgIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dGV4dF9zdGFydCk7Ci0gIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ID0KLSAgICBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmRhdGFfc3RhcnQpOwotCi0gIGEgPSAmYW91dGhkcl9pbnQtPnBlOwotICBhLT5JbWFnZUJhc2UgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+SW1hZ2VCYXNlKTsKLSAgYS0+U2VjdGlvbkFsaWdubWVudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5TZWN0aW9uQWxpZ25tZW50KTsKLSAgYS0+RmlsZUFsaWdubWVudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5GaWxlQWxpZ25tZW50KTsKLSAgYS0+TWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uID0KLSAgICBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+TWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgYS0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uID0KLSAgICBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgYS0+TWFqb3JJbWFnZVZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+TWFqb3JJbWFnZVZlcnNpb24pOwotICBhLT5NaW5vckltYWdlVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5NaW5vckltYWdlVmVyc2lvbik7Ci0gIGEtPk1ham9yU3Vic3lzdGVtVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5NYWpvclN1YnN5c3RlbVZlcnNpb24pOwotICBhLT5NaW5vclN1YnN5c3RlbVZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgYS0+UmVzZXJ2ZWQxID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPlJlc2VydmVkMSk7Ci0gIGEtPlNpemVPZkltYWdlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPlNpemVPZkltYWdlKTsKLSAgYS0+U2l6ZU9mSGVhZGVycyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5TaXplT2ZIZWFkZXJzKTsKLSAgYS0+Q2hlY2tTdW0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+Q2hlY2tTdW0pOwotICBhLT5TdWJzeXN0ZW0gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+U3Vic3lzdGVtKTsKLSAgYS0+RGxsQ2hhcmFjdGVyaXN0aWNzID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPkRsbENoYXJhY3RlcmlzdGljcyk7Ci0gIGEtPlNpemVPZlN0YWNrUmVzZXJ2ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5TaXplT2ZTdGFja1Jlc2VydmUpOwotICBhLT5TaXplT2ZTdGFja0NvbW1pdCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5TaXplT2ZTdGFja0NvbW1pdCk7Ci0gIGEtPlNpemVPZkhlYXBSZXNlcnZlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPlNpemVPZkhlYXBSZXNlcnZlKTsKLSAgYS0+U2l6ZU9mSGVhcENvbW1pdCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopc3JjLT5TaXplT2ZIZWFwQ29tbWl0KTsKLSAgYS0+TG9hZGVyRmxhZ3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKXNyYy0+TG9hZGVyRmxhZ3MpOwotICBhLT5OdW1iZXJPZlJ2YUFuZFNpemVzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPk51bWJlck9mUnZhQW5kU2l6ZXMpOwotCi0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDE2OyBpZHgrKykKLSAgICAgIHsKLQlhLT5EYXRhRGlyZWN0b3J5W2lkeF0uVmlydHVhbEFkZHJlc3MgPQotCSAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPkRhdGFEaXJlY3RvcnlbaWR4XVswXSk7Ci0JYS0+RGF0YURpcmVjdG9yeVtpZHhdLlNpemUgPQotCSAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilzcmMtPkRhdGFEaXJlY3RvcnlbaWR4XVsxXSk7Ci0gICAgICB9Ci0gIH0KLQotICBpZiAoYW91dGhkcl9pbnQtPmVudHJ5KQotICAgIHsKLSAgICAgIGFvdXRoZHJfaW50LT5lbnRyeSArPSBhLT5JbWFnZUJhc2U7Ci0gICAgICBhb3V0aGRyX2ludC0+ZW50cnkgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0gIGlmIChhb3V0aGRyX2ludC0+dHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW50LT50ZXh0X3N0YXJ0ICs9IGEtPkltYWdlQmFzZTsKLSAgICAgIGFvdXRoZHJfaW50LT50ZXh0X3N0YXJ0ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICBpZiAoYW91dGhkcl9pbnQtPmRzaXplKSAKLSAgICB7Ci0gICAgICBhb3V0aGRyX2ludC0+ZGF0YV9zdGFydCArPSBhLT5JbWFnZUJhc2U7Ci0gICAgICBhb3V0aGRyX2ludC0+ZGF0YV9zdGFydCAmPSAweGZmZmZmZmZmOwotICAgIH0KLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgLyogVGhlc2UgdGhyZWUgZmllbGRzIGFyZSBub3JtYWxseSBzZXQgdXAgYnkgcHBjX3JlbG9jYXRlX3NlY3Rpb24uCi0gICAgIEluIHRoZSBjYXNlIG9mIHJlYWRpbmcgYSBmaWxlIGluLCB3ZSBjYW4gcGljayB0aGVtIHVwIGZyb20gdGhlCi0gICAgIERhdGFEaXJlY3RvcnkuICAqLwotICBmaXJzdF90aHVua19hZGRyZXNzID0gYS0+RGF0YURpcmVjdG9yeVsxMl0uVmlydHVhbEFkZHJlc3MgOwotICB0aHVua19zaXplID0gYS0+RGF0YURpcmVjdG9yeVsxMl0uU2l6ZTsKLSAgaW1wb3J0X3RhYmxlX3NpemUgPSBhLT5EYXRhRGlyZWN0b3J5WzFdLlNpemU7Ci0jZW5kaWYKLQotfQotCi0vKiBBIHN1cHBvcnQgZnVuY3Rpb24gZm9yIGJlbG93LiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9kYXRhX2VudHJ5IChhYmZkLCBhb3V0LCBpZHgsIG5hbWUsIGJhc2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmFvdXQ7Ci0gICAgIGludCBpZHg7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgYmFzZTsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQotICAvKiBhZGQgaW1wb3J0IGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBpZiBpdCBleGlzdHMgKi8KLSAgaWYgKChzZWMgIT0gTlVMTCkKLSAgICAgICYmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMKQotICAgICAgJiYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgIT0gTlVMTCkpCi0gICAgewotICAgICAgYW91dC0+RGF0YURpcmVjdG9yeVtpZHhdLlZpcnR1YWxBZGRyZXNzID0gKHNlYy0+dm1hIC0gYmFzZSkgJiAweGZmZmZmZmZmOwotICAgICAgYW91dC0+RGF0YURpcmVjdG9yeVtpZHhdLlNpemUgPSBwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT52aXJ0X3NpemU7Ci0gICAgICBzZWMtPmZsYWdzIHw9IFNFQ19EQVRBOwotICAgIH0KLX0KLQotdW5zaWduZWQgaW50Ci1fYmZkX3BlaV9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbjsKLSAgICAgUFRSCW91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFvdXRoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKilpbjsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmV4dHJhID0gJnBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHI7Ci0gIFBFQU9VVEhEUiAqYW91dGhkcl9vdXQgPSAoUEVBT1VUSERSICopb3V0OwotCi0gIGJmZF92bWEgc2EgPSBleHRyYS0+U2VjdGlvbkFsaWdubWVudDsKLSAgYmZkX3ZtYSBmYSA9IGV4dHJhLT5GaWxlQWxpZ25tZW50OwotICBiZmRfdm1hIGliID0gZXh0cmEtPkltYWdlQmFzZSA7Ci0KLSAgaWYgKGFvdXRoZHJfaW4tPnRzaXplKSAKLSAgICB7Ci0gICAgICBhb3V0aGRyX2luLT50ZXh0X3N0YXJ0IC09IGliOwotICAgICAgYW91dGhkcl9pbi0+dGV4dF9zdGFydCAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgaWYgKGFvdXRoZHJfaW4tPmRzaXplKSAKLSAgICB7Ci0gICAgICBhb3V0aGRyX2luLT5kYXRhX3N0YXJ0IC09IGliOwotICAgICAgYW91dGhkcl9pbi0+ZGF0YV9zdGFydCAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgaWYgKGFvdXRoZHJfaW4tPmVudHJ5KSAKLSAgICB7Ci0gICAgICBhb3V0aGRyX2luLT5lbnRyeSAtPSBpYjsKLSAgICAgIGFvdXRoZHJfaW4tPmVudHJ5ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotCi0jZGVmaW5lIEZBKHgpICAoKCh4KSArIGZhIC0xICkgJiAoLSBmYSkpCi0jZGVmaW5lIFNBKHgpICAoKCh4KSArIHNhIC0xICkgJiAoLSBzYSkpCi0KLSAgLyogV2UgbGlrZSB0byBoYXZlIHRoZSBzaXplcyBhbGlnbmVkICovCi0KLSAgYW91dGhkcl9pbi0+YnNpemUgPSBGQSAoYW91dGhkcl9pbi0+YnNpemUpOwotCi0KLSAgZXh0cmEtPk51bWJlck9mUnZhQW5kU2l6ZXMgPSBJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFUzsKLQotICAvKiBmaXJzdCBudWxsIG91dCBhbGwgZGF0YSBkaXJlY3RvcnkgZW50cmllcyAuLiAqLwotICBtZW1zZXQgKGV4dHJhLT5EYXRhRGlyZWN0b3J5LCBzaXplb2YgKGV4dHJhLT5EYXRhRGlyZWN0b3J5KSwgMCk7Ci0KLSAgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGV4dHJhLCAwLCAiLmVkYXRhIiwgMCk7Ci0KLSAgLyogRG9uJ3QgY2FsbCBhZGRfZGF0YV9lbnRyeSBmb3IgLmlkYXRhJDIgb3IgLmlkYXRhJDUuICBJdCdzIGRvbmUgaW4KLSAgICAgYmZkX2NvZmZfZmluYWxfbGluayB3aGVyZSBhbGwgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uIGlzCi0gICAgIGF2YWlsYWJsZS4gICovCi0KLSAgLyogSG93ZXZlciwgdW50aWwgb3RoZXIgLmlkYXRhIGZpeGVzIGFyZSBtYWRlIChwZW5kaW5nIHBhdGNoKSwgdGhlCi0gICAgIGVudHJ5IGZvciAuaWRhdGEgaXMgbmVlZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4gIEZJWE1FLiAgKi8KLSAgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGV4dHJhLCAxLCAiLmlkYXRhIiAsMCk7Ci0KLSAgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGV4dHJhLCAyLCAiLnJzcmMiICwwKTsKLQotICBhZGRfZGF0YV9lbnRyeSAoYWJmZCwgZXh0cmEsIDMsICIucGRhdGEiLCAwKTsKLQotICAvKiBGb3Igc29tZSByZWFzb24sIHRoZSB2aXJ0dWFsIHNpemUgKHdoaWNoIGlzIHdoYXQncyBzZXQgYnkKLSAgICAgYWRkX2RhdGFfZW50cnkpIGZvciAucmVsb2MgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBzaXplIHJlY29yZGVkCi0gICAgIGluIHRoaXMgc2xvdCBieSBNU1ZDOyBpdCBkb2Vzbid0IHNlZW0gdG8gY2F1c2UgcHJvYmxlbXMgKHNvIGZhciksCi0gICAgIGJ1dCBzaW5jZSBpdCdzIHRoZSBiZXN0IHdlJ3ZlIGdvdCwgdXNlIGl0LiAgSXQgZG9lcyBkbyB0aGUgcmlnaHQKLSAgICAgdGhpbmcgZm9yIC5wZGF0YS4gICovCi0gIGlmIChwZV9kYXRhIChhYmZkKS0+aGFzX3JlbG9jX3NlY3Rpb24pCi0gICAgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGV4dHJhLCA1LCAiLnJlbG9jIiwgMCk7Ci0KLSAgewotICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgYmZkX3ZtYSBkc2l6ZT0gMDsKLSAgICBiZmRfdm1hIGlzaXplID0gU0EoYWJmZC0+c2VjdGlvbnMtPmZpbGVwb3MpOwotICAgIGJmZF92bWEgdHNpemU9IDA7Ci0KLSAgICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICAgIHsKLQlpbnQgcm91bmRlZCA9IEZBKHNlYy0+X3Jhd19zaXplKTsKLQotCWlmIChzZWMtPmZsYWdzICYgU0VDX0RBVEEpCi0JICBkc2l6ZSArPSByb3VuZGVkOwotCWlmIChzZWMtPmZsYWdzICYgU0VDX0NPREUpCi0JICB0c2l6ZSArPSByb3VuZGVkOwotCS8qIFRoZSBpbWFnZSBzaXplIGlzIHRoZSB0b3RhbCBWSVJUVUFMIHNpemUgKHdoaWNoIGlzIHdoYXQgaXMKLQkgICBpbiB0aGUgdmlydF9zaXplIGZpZWxkKS4gIEZpbGVzIGhhdmUgYmVlbiBzZWVuIChmcm9tIE1TVkMKLQkgICA1LjAgbGluay5leGUpIHdoZXJlIHRoZSBmaWxlIHNpemUgb2YgdGhlIC5kYXRhIHNlZ21lbnQgaXMKLQkgICBxdWl0ZSBzbWFsbCBjb21wYXJlZCB0byB0aGUgdmlydHVhbCBzaXplLiAgV2l0aG91dCB0aGlzCi0JICAgZml4LCBzdHJpcCBtdW5nZXMgdGhlIGZpbGUuICAqLwotCWlzaXplICs9IFNBIChGQSAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+dmlydF9zaXplKSk7Ci0gICAgICB9Ci0KLSAgICBhb3V0aGRyX2luLT5kc2l6ZSA9IGRzaXplOwotICAgIGFvdXRoZHJfaW4tPnRzaXplID0gdHNpemU7Ci0gICAgZXh0cmEtPlNpemVPZkltYWdlID0gaXNpemU7Ci0gIH0KLQotICBleHRyYS0+U2l6ZU9mSGVhZGVycyA9IGFiZmQtPnNlY3Rpb25zLT5maWxlcG9zOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgYW91dGhkcl9pbi0+bWFnaWMsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQubWFnaWMpOwotCi0jZGVmaW5lIExJTktFUl9WRVJTSU9OIDI1NiAvKiBUaGF0IGlzLCAyLjU2ICovCi0KLSAgLyogVGhpcyBwaWVjZSBvZiBtYWdpYyBzZXRzIHRoZSAibGlua2VyIHZlcnNpb24iIGZpZWxkIHRvCi0gICAgIExJTktFUl9WRVJTSU9OLiAgKi8KLSAgYmZkX2hfcHV0XzE2IChhYmZkLAotCQlMSU5LRVJfVkVSU0lPTiAvIDEwMCArIChMSU5LRVJfVkVSU0lPTiAlIDEwMCkgKiAyNTYsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQudnN0YW1wKTsKLQotICBQVVRfQU9VVEhEUl9UU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+dHNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQudHNpemUpOwotICBQVVRfQU9VVEhEUl9EU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+ZHNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuZHNpemUpOwotICBQVVRfQU9VVEhEUl9CU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+YnNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuYnNpemUpOwotICBQVVRfQU9VVEhEUl9FTlRSWSAoYWJmZCwgYW91dGhkcl9pbi0+ZW50cnksIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuZW50cnkpOwotICBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIChhYmZkLCBhb3V0aGRyX2luLT50ZXh0X3N0YXJ0LAotCQkJICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLnRleHRfc3RhcnQpOwotCi0gIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgKGFiZmQsIGFvdXRoZHJfaW4tPmRhdGFfc3RhcnQsCi0JCQkgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuZGF0YV9zdGFydCk7Ci0KLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5JbWFnZUJhc2UsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+SW1hZ2VCYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2VjdGlvbkFsaWdubWVudCwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TZWN0aW9uQWxpZ25tZW50KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+RmlsZUFsaWdubWVudCwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5GaWxlQWxpZ25tZW50KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+TWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NYWpvckltYWdlVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NYWpvckltYWdlVmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1pbm9ySW1hZ2VWZXJzaW9uLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk1pbm9ySW1hZ2VWZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+TWFqb3JTdWJzeXN0ZW1WZXJzaW9uLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk1ham9yU3Vic3lzdGVtVmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1pbm9yU3Vic3lzdGVtVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NaW5vclN1YnN5c3RlbVZlcnNpb24pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5SZXNlcnZlZDEsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+UmVzZXJ2ZWQxKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mSW1hZ2UsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2l6ZU9mSW1hZ2UpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TaXplT2ZIZWFkZXJzLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZkhlYWRlcnMpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5DaGVja1N1bSwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5DaGVja1N1bSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPlN1YnN5c3RlbSwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TdWJzeXN0ZW0pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5EbGxDaGFyYWN0ZXJpc3RpY3MsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+RGxsQ2hhcmFjdGVyaXN0aWNzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mU3RhY2tSZXNlcnZlLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZlN0YWNrUmVzZXJ2ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZlN0YWNrQ29tbWl0LAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZlN0YWNrQ29tbWl0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mSGVhcFJlc2VydmUsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2l6ZU9mSGVhcFJlc2VydmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TaXplT2ZIZWFwQ29tbWl0LAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZkhlYXBDb21taXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5Mb2FkZXJGbGFncywKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5Mb2FkZXJGbGFncyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPk51bWJlck9mUnZhQW5kU2l6ZXMsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TnVtYmVyT2ZSdmFBbmRTaXplcyk7Ci0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDE2OyBpZHgrKykKLSAgICAgIHsKLQliZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5EYXRhRGlyZWN0b3J5W2lkeF0uVmlydHVhbEFkZHJlc3MsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+RGF0YURpcmVjdG9yeVtpZHhdWzBdKTsKLQliZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5EYXRhRGlyZWN0b3J5W2lkeF0uU2l6ZSwKLQkJICAgICAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5EYXRhRGlyZWN0b3J5W2lkeF1bMV0pOwotICAgICAgfQotICB9Ci0KLSAgcmV0dXJuIEFPVVRTWjsKLX0KLQotdW5zaWduZWQgaW50Ci1fYmZkX3BlaV9vbmx5X3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBpbnQgaWR4OwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKWluOwotICBzdHJ1Y3QgZXh0ZXJuYWxfUEVJX2ZpbGVoZHIgKmZpbGVoZHJfb3V0ID0gKHN0cnVjdCBleHRlcm5hbF9QRUlfZmlsZWhkciAqKW91dDsKLQotICBpZiAocGVfZGF0YSAoYWJmZCktPmhhc19yZWxvY19zZWN0aW9uKQotICAgIGZpbGVoZHJfaW4tPmZfZmxhZ3MgJj0gfkZfUkVMRkxHOwotCi0gIGlmIChwZV9kYXRhIChhYmZkKS0+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+Zl9mbGFncywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX2ZsYWdzKTsKLQotICAvKiBwdXQgaW4gZXh0cmEgZG9zIGhlYWRlciBzdHVmZi4gIFRoaXMgZGF0YSByZW1haW5zIGVzc2VudGlhbGx5Ci0gICAgIGNvbnN0YW50LCBpdCBqdXN0IGhhcyB0byBiZSB0YWNrZWQgb24gdG8gdGhlIGJlZ2lubmluZyBvZiBhbGwgZXhlcwotICAgICBmb3IgTlQgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfbWFnaWMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9tYWdpYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NibHAsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9jYmxwKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfY3AsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9jcCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NybGMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9jcmxjKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfY3BhcmhkciwKLQkgICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2NwYXJoZHIpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9taW5hbGxvYywKLQkgICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX21pbmFsbG9jKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfbWF4YWxsb2MsCi0JICAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9tYXhhbGxvYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX3NzLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfc3MpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9zcCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX3NwKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfY3N1bSwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2NzdW0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9pcCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2lwKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfY3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9jcyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2xmYXJsYywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2xmYXJsYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX292bm8sIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9vdm5vKTsKLSAgewotICAgIGludCBpZHg7Ci0gICAgZm9yIChpZHg9MDsgaWR4IDwgNDsgaWR4KyspCi0gICAgICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9yZXNbaWR4XSwKLQkJICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX3Jlc1tpZHhdKTsKLSAgfQotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9vZW1pZCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX29lbWlkKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfb2VtaW5mbywKLQkgICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX29lbWluZm8pOwotICB7Ci0gICAgaW50IGlkeDsKLSAgICBmb3IgKGlkeD0wOyBpZHggPCAxMDsgaWR4KyspCi0gICAgICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9yZXMyW2lkeF0sCi0JCSAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9yZXMyW2lkeF0pOwotICB9Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2xmYW5ldywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2xmYW5ldyk7Ci0KLSAgewotICAgIGludCBpZHg7Ci0gICAgZm9yIChpZHg9MDsgaWR4IDwgMTY7IGlkeCsrKQotICAgICAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlW2lkeF0sCi0JCSAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZG9zX21lc3NhZ2VbaWR4XSk7Ci0gIH0KLQotICAvKiBhbHNvIHB1dCBpbiB0aGUgTlQgc2lnbmF0dXJlICovCi0gIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5wZS5udF9zaWduYXR1cmUsCi0JICAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+bnRfc2lnbmF0dXJlKTsKLQotCi0KLQotICByZXR1cm4gRklMSFNaOwotfQotCi11bnNpZ25lZCBpbnQKLV9iZmRfcGVfb25seV9zd2FwX2ZpbGVoZHJfb3V0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbjsKLSAgICAgUFRSCW91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKilpbjsKLSAgRklMSERSICpmaWxlaGRyX291dCA9IChGSUxIRFIgKilvdXQ7Ci0KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfbWFnaWMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9tYWdpYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX25zY25zLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbnNjbnMpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl90aW1kYXQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl90aW1kYXQpOwotICBQVVRfRklMRUhEUl9TWU1QVFIgKGFiZmQsIChiZmRfdm1hKSBmaWxlaGRyX2luLT5mX3N5bXB0ciwKLQkJICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3N5bXB0cik7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5mX25zeW1zLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbnN5bXMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9vcHRoZHIsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9vcHRoZHIpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9mbGFncywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX2ZsYWdzKTsKLQotICByZXR1cm4gRklMSFNaOwotfQotCi11bnNpZ25lZCBpbnQKLV9iZmRfcGVpX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKWluOwotICBTQ05IRFIgKnNjbmhkcl9leHQgPSAoU0NOSERSICopb3V0OwotICB1bnNpZ25lZCBpbnQgcmV0ID0gU0NOSFNaOwotICBiZmRfdm1hIHBzOwotICBiZmRfdm1hIHNzOwotCi0gIG1lbWNweShzY25oZHJfZXh0LT5zX25hbWUsIHNjbmhkcl9pbnQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotCi0gIFBVVF9TQ05IRFJfVkFERFIgKGFiZmQsCi0JCSAgICAoKHNjbmhkcl9pbnQtPnNfdmFkZHIgCi0JCSAgICAgIC0gcGVfZGF0YShhYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZSkKLQkJICAgICAmIDB4ZmZmZmZmZmYpLAotCQkgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfdmFkZHIpOwotCi0gIC8qIE5UIHdhbnRzIHRoZSBzaXplIGRhdGEgdG8gYmUgcm91bmRlZCB1cCB0byB0aGUgbmV4dAotICAgICBOVF9GSUxFX0FMSUdOTUVOVCwgYnV0IHplcm8gaWYgaXQgaGFzIG5vIGNvbnRlbnQgKGFzIGluIC5ic3MsCi0gICAgIHNvbWV0aW1lcykuICAqLwotCi0gIGlmICgoc2NuaGRyX2ludC0+c19mbGFncyAmIElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBKSAhPSAwKQotICAgIHsKLSAgICAgIHBzID0gc2NuaGRyX2ludC0+c19zaXplOwotICAgICAgc3MgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHBzID0gc2NuaGRyX2ludC0+c19wYWRkcjsKLSAgICAgIHNzID0gc2NuaGRyX2ludC0+c19zaXplOwotICAgIH0KLQotICBQVVRfU0NOSERSX1NJWkUgKGFiZmQsIHNzLAotCQkgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zaXplKTsKLQotCi0gIC8qIHNfcGFkZHIgaW4gUEUgaXMgcmVhbGx5IHRoZSB2aXJ0dWFsIHNpemUuICAqLwotICBQVVRfU0NOSERSX1BBRERSIChhYmZkLCBwcywgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcGFkZHIpOwotCi0gIFBVVF9TQ05IRFJfU0NOUFRSIChhYmZkLCBzY25oZHJfaW50LT5zX3NjbnB0ciwKLQkJICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zY25wdHIpOwotICBQVVRfU0NOSERSX1JFTFBUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19yZWxwdHIsCi0JCSAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcmVscHRyKTsKLSAgUFVUX1NDTkhEUl9MTk5PUFRSIChhYmZkLCBzY25oZHJfaW50LT5zX2xubm9wdHIsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2xubm9wdHIpOwotCi0gIC8qIEV4dHJhIGZsYWdzIG11c3QgYmUgc2V0IHdoZW4gZGVhbGluZyB3aXRoIE5ULiAgQWxsIHNlY3Rpb25zIHNob3VsZCBhbHNvCi0gICAgIGhhdmUgdGhlIElNQUdFX1NDTl9NRU1fUkVBRCAoMHg0MDAwMDAwMCkgZmxhZyBzZXQuICBJbiBhZGRpdGlvbiwgdGhlCi0gICAgIC50ZXh0IHNlY3Rpb24gbXVzdCBoYXZlIElNQUdFX1NDTl9NRU1fRVhFQ1VURSAoMHgyMDAwMDAwMCkgYW5kIHRoZSBkYXRhCi0gICAgIHNlY3Rpb25zICguaWRhdGEsIC5kYXRhLCAuYnNzLCAuQ1JUKSBtdXN0IGhhdmUgSU1BR0VfU0NOX01FTV9XUklURSBzZXQKLSAgICAgKHRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgd2hlbiBkZWFsaW5nIHdpdGggdGhlIC5pZGF0YSBzZWN0aW9uIHNpbmNlCi0gICAgIHRoZSBhZGRyZXNzZXMgZm9yIHJvdXRpbmVzIGZyb20gLmRsbHMgbXVzdCBiZSBvdmVyd3JpdHRlbikuICBJZiAucmVsb2MKLSAgICAgc2VjdGlvbiBkYXRhIGlzIGV2ZXIgZ2VuZXJhdGVkLCB3ZSBtdXN0IGFkZCBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFCi0gICAgICgweDAyMDAwMDAwKS4gIEFsc28sIHRoZSByZXNvdXJjZSBkYXRhIHNob3VsZCBhbHNvIGJlIHJlYWQgYW5kCi0gICAgIHdyaXRhYmxlLiAgKi8KLQotICAvKiBGSVhNRTogYWxpZ25tZW50IGlzIGFsc28gZW5jb2RlZCBpbiB0aGlzIGZpZWxkLCBhdCBsZWFzdCBvbiBwcGMgKGtyaykgKi8KLSAgLyogRklYTUU6IGV2ZW4gd29yc2UsIEkgZG9uJ3Qgc2VlIGhvdyB0byBnZXQgdGhlIG9yaWdpbmFsIGFsaWdubWVudCBmaWVsZCovCi0gIC8qICAgICAgICBiYWNrLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHsKLSAgICBpbnQgZmxhZ3MgPSBzY25oZHJfaW50LT5zX2ZsYWdzOwotICAgIGJmZF9oX3B1dF8zMihhYmZkLCBmbGFncywgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfZmxhZ3MpOwotICB9Ci0KLSAgaWYgKGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mbwotICAgICAgJiYgISBjb2ZmX2RhdGEgKGFiZmQpLT5saW5rX2luZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgISBjb2ZmX2RhdGEgKGFiZmQpLT5saW5rX2luZm8tPnNoYXJlZAotICAgICAgJiYgc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIudGV4dCIpID09IDApCi0gICAgewotICAgICAgLyogQnkgaW5mZXJlbmNlIGZyb20gbG9va2luZyBhdCBNUyBvdXRwdXQsIHRoZSAzMiBiaXQgZmllbGQKLQkgd2hpY2ggaXMgdGhlIGNvbWJpbnRpb24gb2YgdGhlIG51bWJlcl9vZl9yZWxvY3MgYW5kCi0JIG51bWJlcl9vZl9saW5lbm9zIGlzIHVzZWQgZm9yIHRoZSBsaW5lIG51bWJlciBjb3VudCBpbgotCSBleGVjdXRhYmxlcy4gIEEgMTYtYml0IGZpZWxkIHdvbid0IGRvIGZvciBjYzEuICBUaGUgTVMKLQkgZG9jdW1lbnQgc2F5cyB0aGF0IHRoZSBudW1iZXIgb2YgcmVsb2NzIGlzIHplcm8gZm9yCi0JIGV4ZWN1dGFibGVzLCBidXQgdGhlIDE3LXRoIGJpdCBoYXMgYmVlbiBvYnNlcnZlZCB0byBiZSB0aGVyZS4KLQkgT3ZlcmZsb3cgaXMgbm90IGFuIGlzc3VlOiBhIDRHLWxpbmUgcHJvZ3JhbSB3aWxsIG92ZXJmbG93IGEKLQkgYnVuY2ggb2Ygb3RoZXIgZmllbGRzIGxvbmcgYmVmb3JlIHRoaXMhICAqLwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBzY25oZHJfaW50LT5zX25sbm5vICYgMHhmZmZmLAotCQkgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBzY25oZHJfaW50LT5zX25sbm5vID4+IDE2LAotCQkgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc2NuaGRyX2ludC0+c19ubG5ubyA8PSAweGZmZmYpCi0JYmZkX2hfcHV0XzE2IChhYmZkLCBzY25oZHJfaW50LT5zX25sbm5vLAotCQkgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogbGluZSBudW1iZXIgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSBzY25oZHJfaW50LT5zX25sbm5vKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICBiZmRfaF9wdXRfMTYgKGFiZmQsIDB4ZmZmZiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotCSAgcmV0ID0gMDsKLQl9Ci0gICAgICBpZiAoc2NuaGRyX2ludC0+c19ucmVsb2MgPD0gMHhmZmZmKQotCWJmZF9oX3B1dF8xNiAoYWJmZCwgc2NuaGRyX2ludC0+c19ucmVsb2MsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogcmVsb2Mgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSBzY25oZHJfaW50LT5zX25yZWxvYyk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCSAgYmZkX2hfcHV0XzE2IChhYmZkLCAweGZmZmYsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0JICByZXQgPSAwOwotCX0KLSAgICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjaGFyICogZGlyX25hbWVzW0lNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTXSA9Ci17Ci0gIE5fICgiRXhwb3J0IERpcmVjdG9yeSBbLmVkYXRhIChvciB3aGVyZSBldmVyIHdlIGZvdW5kIGl0KV0iKSwKLSAgTl8gKCJJbXBvcnQgRGlyZWN0b3J5IFtwYXJ0cyBvZiAuaWRhdGFdIiksCi0gIE5fICgiUmVzb3VyY2UgRGlyZWN0b3J5IFsucnNyY10iKSwKLSAgTl8gKCJFeGNlcHRpb24gRGlyZWN0b3J5IFsucGRhdGFdIiksCi0gIE5fICgiU2VjdXJpdHkgRGlyZWN0b3J5IiksCi0gIE5fICgiQmFzZSBSZWxvY2F0aW9uIERpcmVjdG9yeSBbLnJlbG9jXSIpLAotICBOXyAoIkRlYnVnIERpcmVjdG9yeSIpLAotICBOXyAoIkRlc2NyaXB0aW9uIERpcmVjdG9yeSIpLAotICBOXyAoIlNwZWNpYWwgRGlyZWN0b3J5IiksCi0gIE5fICgiVGhyZWFkIFN0b3JhZ2UgRGlyZWN0b3J5IFsudGxzXSIpLAotICBOXyAoIkxvYWQgQ29uZmlndXJhdGlvbiBEaXJlY3RvcnkiKSwKLSAgTl8gKCJCb3VuZCBJbXBvcnQgRGlyZWN0b3J5IiksCi0gIE5fICgiSW1wb3J0IEFkZHJlc3MgVGFibGUgRGlyZWN0b3J5IiksCi0gIE5fICgiUmVzZXJ2ZWQiKSwKLSAgTl8gKCJSZXNlcnZlZCIpLAotICBOXyAoIlJlc2VydmVkIikKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFBPV0VSUENfTEVfUEUKLS8qIFRoZSBjb2RlIGZvciB0aGUgUFBDIHJlYWxseSBmYWxscyBpbiB0aGUgImFyY2hpdGVjdHVyZSBkZXBlbmRlbnQiCi0gICBjYXRlZ29yeS4gIEhvd2V2ZXIsIGl0J3Mgbm90IGNsZWFyIHRoYXQgYW55b25lIHdpbGwgZXZlciBjYXJlLCBzbwotICAgd2UncmUgaWdub3JpbmcgdGhlIGlzc3VlIGZvciBub3c7IGlmL3doZW4gUFBDIG1hdHRlcnMsIHNvbWUgb2YgdGhpcwotICAgbWF5IG5lZWQgdG8gZ28gaW50byBwZWljb2RlLmgsIG9yIGFyZ3VtZW50cyBwYXNzZWQgdG8gZW5hYmxlIHRoZQotICAgUFBDLSBzcGVjaWZpYyBjb2RlLiAgKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBib29sZWFuCi1wZV9wcmludF9pZGF0YSAoYWJmZCwgdmZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIGJmZF9ieXRlICpkYXRhID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pZGF0YSIpOwotICB1bnNpZ25lZCBsb25nIGFkajsKLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgYXNlY3Rpb24gKnJlbF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVsZGF0YSIpOwotI2VuZGlmCi0KLSAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBkYXRhb2ZmOwotICBiZmRfc2l6ZV90eXBlIHNlY3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgaTsKLSAgaW50IG9uYWxpbmUgPSAyMDsKLQotICBwZV9kYXRhX3R5cGUgKnBlID0gcGVfZGF0YSAoYWJmZCk7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICpleHRyYSA9ICZwZS0+cGVfb3B0aGRyOwotCi0gIGlmIChzZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLSAgICAgIGRhdGFvZmYgPSAwOwotCi0gICAgICBpZiAoZGF0YXNpemUgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgZnByaW50ZiAoZmlsZSwgXygiXG5UaGUgaW1wb3J0IHRhYmxlIGlzIHRoZSAuaWRhdGEgc2VjdGlvblxuIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIGlkYXRhIGJ1cmllZCBpbiBzb21lIG90aGVyIHNlY3Rpb246IGUuZy4gS0VSTkVMMzIuRExMLiAgKi8KLSAgICAgIGJmZF92bWEgYWRkciwgc2l6ZTsKLQotICAgICAgYWRkciA9IGV4dHJhLT5EYXRhRGlyZWN0b3J5WzFdLlZpcnR1YWxBZGRyZXNzOwotICAgICAgc2l6ZSA9IGV4dHJhLT5EYXRhRGlyZWN0b3J5WzFdLlNpemU7Ci0KLSAgICAgIGlmIChhZGRyID09IDAgfHwgc2l6ZSA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLQl7Ci0JICAgaWYgKGFkZHIgPj0gc2VjdGlvbi0+dm1hCi0JICAgICAgICYmIGFkZHIgPCBzZWN0aW9uLT52bWEgKyBiZmRfc2VjdGlvbl9zaXplKGFiZmQsc2VjdGlvbikpCi0JICAgICAgICAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICAgZnByaW50ZiAoZmlsZSwKLQkJICAgIF8oIlxuVGhlcmUgaXMgYW4gaW1wb3J0IHRhYmxlLCBidXQgdGhlIHNlY3Rpb24gY29udGFpbmluZyBpdCBjb3VsZCBub3QgYmUgZm91bmRcbiIpKTsKLQkgICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGZwcmludGYgKGZpbGUsIF8oIlxuVGhlcmUgaXMgYW4gaW1wb3J0IHRhYmxlIGluICVzIGF0IDB4JWx4XG4iKSwKLQkgICAgICAgc2VjdGlvbi0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpYWRkcik7Ci0KLSAgICAgIGRhdGFvZmYgPSBhZGRyIC0gc2VjdGlvbi0+dm1hOwotICAgICAgZGF0YXNpemUgPSBzaXplOwotICAgIH0KLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgaWYgKHJlbF9zZWN0aW9uICE9IDAgJiYgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsX3NlY3Rpb24pICE9IDApCi0gICAgewotICAgICAgLyogVGhlIHRvYyBhZGRyZXNzIGNhbiBiZSBmb3VuZCBieSB0YWtpbmcgdGhlIHN0YXJ0aW5nIGFkZHJlc3MsCi0JIHdoaWNoIG9uIHRoZSBQUEMgbG9jYXRlcyBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IuIFRoZQotCSBkZXNjcmlwdG9yIGNvbnNpc3RzIG9mIHRoZSBmdW5jdGlvbiBjb2RlIHN0YXJ0aW5nIGFkZHJlc3MKLQkgZm9sbG93ZWQgYnkgdGhlIGFkZHJlc3Mgb2YgdGhlIHRvYy4gVGhlIHN0YXJ0aW5nIGFkZHJlc3Mgd2UKLQkgZ2V0IGZyb20gdGhlIGJmZCwgYW5kIHRoZSBkZXNjcmlwdG9yIGlzIHN1cHBvc2VkIHRvIGJlIGluIHRoZQotCSAucmVsZGF0YSBzZWN0aW9uLiAgKi8KLQotICAgICAgYmZkX3ZtYSBsb2FkYWJsZV90b2NfYWRkcmVzczsKLSAgICAgIGJmZF92bWEgdG9jX2FkZHJlc3M7Ci0gICAgICBiZmRfdm1hIHN0YXJ0X2FkZHJlc3M7Ci0gICAgICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gICAgICBpbnQgb2Zmc2V0OwotICAgICAgZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLAotCQkJCQkJCQkgcmVsX3NlY3Rpb24pKTsKLSAgICAgIGlmIChkYXRhID09IE5VTEwgJiYgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsX3NlY3Rpb24pICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbF9zZWN0aW9uKTsKLSAgCi0gICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsCi0JCQkJcmVsX3NlY3Rpb24sCi0JCQkJKFBUUikgZGF0YSwgMCwKLQkJCQliZmRfc2VjdGlvbl9zaXplIChhYmZkLCByZWxfc2VjdGlvbikpOwotCi0gICAgICBvZmZzZXQgPSBhYmZkLT5zdGFydF9hZGRyZXNzIC0gcmVsX3NlY3Rpb24tPnZtYTsKLQotICAgICAgc3RhcnRfYWRkcmVzcyA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStvZmZzZXQpOwotICAgICAgbG9hZGFibGVfdG9jX2FkZHJlc3MgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErb2Zmc2V0KzQpOwotICAgICAgdG9jX2FkZHJlc3MgPSBsb2FkYWJsZV90b2NfYWRkcmVzcyAtIDMyNzY4OwotCi0gICAgICBmcHJpbnRmKGZpbGUsCi0JICAgICAgXygiXG5GdW5jdGlvbiBkZXNjcmlwdG9yIGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IGFkZHJlc3M6ICUwNGx4XG4iKSwKLQkgICAgICAodW5zaWduZWQgbG9uZyBpbnQpIChhYmZkLT5zdGFydF9hZGRyZXNzKSk7Ci0gICAgICBmcHJpbnRmIChmaWxlLAotCSAgICAgICBfKCJcdGNvZGUtYmFzZSAlMDhseCB0b2MgKGxvYWRhYmxlL2FjdHVhbCkgJTA4bHgvJTA4bHhcbiIpLAotCSAgICAgICBzdGFydF9hZGRyZXNzLCBsb2FkYWJsZV90b2NfYWRkcmVzcywgdG9jX2FkZHJlc3MpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYoZmlsZSwKLQkgICAgICBfKCJcbk5vIHJlbGRhdGEgc2VjdGlvbiEgRnVuY3Rpb24gZGVzY3JpcHRvciBub3QgZGVjb2RlZC5cbiIpKTsKLSAgICB9Ci0jZW5kaWYKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJcblRoZSBJbXBvcnQgVGFibGVzIChpbnRlcnByZXRlZCAuaWRhdGEgc2VjdGlvbiBjb250ZW50cylcbiIpKTsKLSAgZnByaW50ZihmaWxlLAotCSAgXygiIHZtYTogICAgICAgICAgICBIaW50ICAgIFRpbWUgICAgICBGb3J3YXJkICBETEwgICAgICAgRmlyc3RcbiIpKTsKLSAgZnByaW50ZihmaWxlLAotCSAgXygiICAgICAgICAgICAgICAgICBUYWJsZSAgIFN0YW1wICAgICBDaGFpbiAgICBOYW1lICAgICAgVGh1bmtcbiIpKTsKLQotICBzZWNzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0gIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2Vjc2l6ZSk7Ci0gIGlmIChkYXRhID09IE5VTEwgJiYgc2Vjc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIChQVFIpIGRhdGEsIDAsIHNlY3NpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhZGogPSAtIHNlY3Rpb24tPnZtYTsKLQotICBmb3IgKGkgPSAwOyBpIDwgZGF0YXNpemU7IGkgKz0gb25hbGluZSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGhpbnRfYWRkcjsKLSAgICAgIGJmZF92bWEgdGltZV9zdGFtcDsKLSAgICAgIGJmZF92bWEgZm9yd2FyZF9jaGFpbjsKLSAgICAgIGJmZF92bWEgZGxsX25hbWU7Ci0gICAgICBiZmRfdm1hIGZpcnN0X3RodW5rOwotICAgICAgaW50IGlkeCA9IDA7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGo7Ci0gICAgICBjaGFyICpkbGw7Ci0KLSAgICAgIGZwcmludGYgKGZpbGUsCi0JICAgICAgICIgJTA4bHhcdCIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGludCkgKGkgKyBzZWN0aW9uLT52bWEgKyBkYXRhb2ZmKSk7Ci0gICAgICAKLSAgICAgIGlmIChpICsgMjAgPiBkYXRhc2l6ZSkKLQl7Ci0JICAvKiBjaGVjayBzdHVmZiAqLwotCSAgOwotCX0KLQotICAgICAgaGludF9hZGRyID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGkgKyBkYXRhb2ZmKTsKLSAgICAgIHRpbWVfc3RhbXAgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaSArIDQgKyBkYXRhb2ZmKTsKLSAgICAgIGZvcndhcmRfY2hhaW4gPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaSArIDggKyBkYXRhb2ZmKTsKLSAgICAgIGRsbF9uYW1lID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGkgKyAxMiArIGRhdGFvZmYpOwotICAgICAgZmlyc3RfdGh1bmsgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaSArIDE2ICsgZGF0YW9mZik7Ci0KLSAgICAgIGZwcmludGYgKGZpbGUsICIlMDhseCAlMDhseCAlMDhseCAlMDhseCAlMDhseFxuIiwKLQkgICAgICAgaGludF9hZGRyLAotCSAgICAgICB0aW1lX3N0YW1wLAotCSAgICAgICBmb3J3YXJkX2NoYWluLAotCSAgICAgICBkbGxfbmFtZSwKLQkgICAgICAgZmlyc3RfdGh1bmspOwotCi0gICAgICBpZiAoaGludF9hZGRyID09IDAgJiYgZmlyc3RfdGh1bmsgPT0gMCkKLQlicmVhazsKLQotICAgICAgZGxsID0gKGNoYXIgKikgZGF0YSArIGRsbF9uYW1lIC0gc2VjdGlvbi0+dm1hICsgZGF0YW9mZjsKLSAgICAgIGZwcmludGYoZmlsZSwgXygiXG5cdERMTCBOYW1lOiAlc1xuIiksIGRsbCk7Ci0KLSAgICAgIGlmIChoaW50X2FkZHIgIT0gMCkKLQl7Ci0JICBmcHJpbnRmIChmaWxlLCBfKCJcdHZtYTogIEhpbnQvT3JkIE1lbWJlci1OYW1lXG4iKSk7Ci0KLQkgIGlkeCA9IGhpbnRfYWRkciArIGFkajsKLQotCSAgZm9yIChqID0gMDsgaiA8IGRhdGFzaXplOyBqICs9IDQpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIG1lbWJlciA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpZHggKyBqKTsKLQotCSAgICAgIGlmIChtZW1iZXIgPT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgaWYgKG1lbWJlciAmIDB4ODAwMDAwMDApCi0JCWZwcmludGYgKGZpbGUsICJcdCUwNGx4XHQgJTRsdSIsIG1lbWJlciwKLQkJCSBtZW1iZXIgJiAweDdmZmZmZmZmKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnQgb3JkaW5hbDsKLQkJICBjaGFyICptZW1iZXJfbmFtZTsKLQotCQkgIG9yZGluYWwgPSBiZmRfZ2V0XzE2IChhYmZkLCBkYXRhICsgbWVtYmVyICsgYWRqKTsKLQkJICBtZW1iZXJfbmFtZSA9IChjaGFyICopIGRhdGEgKyBtZW1iZXIgKyBhZGogKyAyOwotCQkgIGZwcmludGYgKGZpbGUsICJcdCUwNGx4XHQgJTRkICAlcyIsCi0JCQkgICBtZW1iZXIsIG9yZGluYWwsIG1lbWJlcl9uYW1lKTsKLQkJfQotCi0JICAgICAgLyogSWYgdGhlIHRpbWUgc3RhbXAgaXMgbm90IHplcm8sIHRoZSBpbXBvcnQgYWRkcmVzcwotICAgICAgICAgICAgICAgICB0YWJsZSBob2xkcyBhY3R1YWwgYWRkcmVzc2VzLiAgKi8KLQkgICAgICBpZiAodGltZV9zdGFtcCAhPSAwCi0JCSAgJiYgZmlyc3RfdGh1bmsgIT0gMAotCQkgICYmIGZpcnN0X3RodW5rICE9IGhpbnRfYWRkcikKLQkJZnByaW50ZiAoZmlsZSwgIlx0JTA0bHgiLAotCQkJIGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBmaXJzdF90aHVuayArIGFkaiArIGopKTsKLQotCSAgICAgIGZwcmludGYgKGZpbGUsICJcbiIpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaGludF9hZGRyICE9IGZpcnN0X3RodW5rICYmIHRpbWVfc3RhbXAgPT0gMCkKLQl7Ci0JICBpbnQgZGlmZmVyID0gMDsKLQkgIGludCBpZHgyOwotCi0JICBpZHgyID0gZmlyc3RfdGh1bmsgKyBhZGo7Ci0KLQkgIGZvciAoaiA9IDA7IGogPCBkYXRhc2l6ZTsgaiArPSA0KQotCSAgICB7Ci0JICAgICAgaW50IG9yZGluYWw7Ci0JICAgICAgY2hhciAqbWVtYmVyX25hbWU7Ci0JICAgICAgYmZkX3ZtYSBoaW50X21lbWJlciA9IDA7Ci0JICAgICAgYmZkX3ZtYSBpYXRfbWVtYmVyOwotCi0JICAgICAgaWYgKGhpbnRfYWRkciAhPSAwKQotCQloaW50X21lbWJlciA9IGJmZF9nZXRfMzIgKGFiZmQsIGRhdGEgKyBpZHggKyBqKTsKLQkgICAgICBpYXRfbWVtYmVyID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGlkeDIgKyBqKTsKLQotCSAgICAgIGlmIChoaW50X2FkZHIgPT0gMCAmJiBpYXRfbWVtYmVyID09IDApCi0JCWJyZWFrOwotCi0JICAgICAgaWYgKGhpbnRfYWRkciA9PSAwIHx8IGhpbnRfbWVtYmVyICE9IGlhdF9tZW1iZXIpCi0JCXsKLQkJICBpZiAoZGlmZmVyID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYgKGZpbGUsCi0JCQkgICAgICAgXygiXHRUaGUgSW1wb3J0IEFkZHJlc3MgVGFibGUgKGRpZmZlcmVuY2UgZm91bmQpXG4iKSk7Ci0JCSAgICAgIGZwcmludGYoZmlsZSwgXygiXHR2bWE6ICBIaW50L09yZCBNZW1iZXItTmFtZVxuIikpOwotCQkgICAgICBkaWZmZXIgPSAxOwotCQkgICAgfQotCQkgIGlmIChpYXRfbWVtYmVyID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYoZmlsZSwKLQkJCSAgICAgIF8oIlx0Pj4+IFJhbiBvdXQgb2YgSUFUIG1lbWJlcnMhXG4iKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBvcmRpbmFsID0gYmZkX2dldF8xNihhYmZkLAotCQkJCQkgICBkYXRhICsgaWF0X21lbWJlciArIGFkaik7Ci0JCSAgICAgIG1lbWJlcl9uYW1lID0gKGNoYXIgKikgZGF0YSArIGlhdF9tZW1iZXIgKyBhZGogKyAyOwotCQkgICAgICBmcHJpbnRmKGZpbGUsICJcdCUwNGx4XHQgJTRkICAlc1xuIiwKLQkJCSAgICAgIGlhdF9tZW1iZXIsIG9yZGluYWwsIG1lbWJlcl9uYW1lKTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGhpbnRfYWRkciAhPSAwICYmIGhpbnRfbWVtYmVyID09IDApCi0JCWJyZWFrOwotCSAgICB9Ci0JICBpZiAoZGlmZmVyID09IDApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmKGZpbGUsCi0JCSAgICAgIF8oIlx0VGhlIEltcG9ydCBBZGRyZXNzIFRhYmxlIGlzIGlkZW50aWNhbFxuIikpOwotCSAgICB9Ci0JfQotCi0gICAgICBmcHJpbnRmKGZpbGUsICJcbiIpOwotCi0gICAgfQotCi0gIGZyZWUgKGRhdGEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotcGVfcHJpbnRfZWRhdGEgKGFiZmQsIHZmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZWRhdGEiKTsKLQotICBiZmRfc2l6ZV90eXBlIGRhdGFzaXplOwotICBiZmRfc2l6ZV90eXBlIGRhdGFvZmY7Ci0gIGJmZF9zaXplX3R5cGUgaTsKLQotICBpbnQgYWRqOwotICBzdHJ1Y3QgRURUX3R5cGUKLSAgICB7Ci0gICAgICBsb25nIGV4cG9ydF9mbGFnczsgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgLSBzaG91bGQgYmUgemVybyAqLwotICAgICAgbG9uZyB0aW1lX3N0YW1wOwotICAgICAgc2hvcnQgbWFqb3JfdmVyOwotICAgICAgc2hvcnQgbWlub3JfdmVyOwotICAgICAgYmZkX3ZtYSBuYW1lOyAgICAgICAgICAgICAgICAgIC8qIHJ2YSAtIHJlbGF0aXZlIHRvIGltYWdlIGJhc2UgKi8KLSAgICAgIGxvbmcgYmFzZTsgICAgICAgICAgICAgICAgICAgICAvKiBvcmRpbmFsIGJhc2UgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgbnVtX2Z1bmN0aW9uczsgICAvKiBOdW1iZXIgaW4gdGhlIGV4cG9ydCBhZGRyZXNzIHRhYmxlICovCi0gICAgICB1bnNpZ25lZCBsb25nIG51bV9uYW1lczsgICAgICAgLyogTnVtYmVyIGluIHRoZSBuYW1lIHBvaW50ZXIgdGFibGUgKi8KLSAgICAgIGJmZF92bWEgZWF0X2FkZHI7ICAgIC8qIHJ2YSB0byB0aGUgZXhwb3J0IGFkZHJlc3MgdGFibGUgKi8KLSAgICAgIGJmZF92bWEgbnB0X2FkZHI7ICAgICAgICAvKiBydmEgdG8gdGhlIEV4cG9ydCBOYW1lIFBvaW50ZXIgVGFibGUgKi8KLSAgICAgIGJmZF92bWEgb3RfYWRkcjsgLyogcnZhIHRvIHRoZSBPcmRpbmFsIFRhYmxlICovCi0gICAgfSBlZHQ7Ci0KLSAgcGVfZGF0YV90eXBlICpwZSA9IHBlX2RhdGEgKGFiZmQpOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqZXh0cmEgPSAmcGUtPnBlX29wdGhkcjsKLQotICBpZiAoc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICBkYXRhb2ZmID0gMDsKLSAgICAgIGZwcmludGYgKGZpbGUsIF8oIlxuVGhlIGV4cG9ydCB0YWJsZSBpcyB0aGUgLmVkYXRhIHNlY3Rpb25cbiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBlZGF0YSBpcyBidXJpZWQgaW4gc29tZSBvdGhlciBzZWN0aW9uOiBlLmcuIE5URExMLkRMTC4gICovCi0gICAgICBiZmRfdm1hIGFkZHIsIHNpemU7Ci0KLSAgICAgIGFkZHIgPSBleHRyYS0+RGF0YURpcmVjdG9yeVswXS5WaXJ0dWFsQWRkcmVzczsKLSAgICAgIHNpemUgPSBleHRyYS0+RGF0YURpcmVjdG9yeVswXS5TaXplOwotCi0gICAgICBpZiAoYWRkciA9PSAwIHx8IHNpemUgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JewotCSAgIGlmIChhZGRyID49IHNlY3Rpb24tPnZtYQotCSAgICAgICAmJiBhZGRyIDwgc2VjdGlvbi0+dm1hICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpCi0JICAgICBicmVhazsKLQl9Ci0gICAgICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgICBmcHJpbnRmIChmaWxlLAotCQkgICAgXygiXG5UaGVyZSBpcyBhbiBleHBvcnQgdGFibGUsIGJ1dCB0aGUgc2VjdGlvbiBjb250YWluaW5nIGl0IGNvdWxkIG5vdCBiZSBmb3VuZFxuIikpOwotCSAgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgZnByaW50ZiAoZmlsZSwgXygiXG5UaGVyZSBpcyBhbiBleHBvcnQgdGFibGUgaW4gJXMgYXQgMHglbHhcbiIpLAotCSAgICAgICBzZWN0aW9uLT5uYW1lLCAodW5zaWduZWQgbG9uZykgYWRkcik7Ci0KLSAgICAgIGRhdGFzaXplID0gc2l6ZTsKLSAgICAgIGRhdGFvZmYgPSBhZGRyIC0gc2VjdGlvbi0+dm1hOwotICAgIH0KLQotICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGRhdGFzaXplKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCAmJiBkYXRhc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIChQVFIpIGRhdGEsIGRhdGFvZmYsCi0JCQkJICBkYXRhc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdvIGdldCBFeHBvcnQgRGlyZWN0b3J5IFRhYmxlICovCi0gIGVkdC5leHBvcnRfZmxhZ3MgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSswKTsKLSAgZWR0LnRpbWVfc3RhbXAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzQpOwotICBlZHQubWFqb3JfdmVyICAgICAgPSBiZmRfZ2V0XzE2KGFiZmQsIGRhdGErOCk7Ci0gIGVkdC5taW5vcl92ZXIgICAgICA9IGJmZF9nZXRfMTYoYWJmZCwgZGF0YSsxMCk7Ci0gIGVkdC5uYW1lICAgICAgICAgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSsxMik7Ci0gIGVkdC5iYXNlICAgICAgICAgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSsxNik7Ci0gIGVkdC5udW1fZnVuY3Rpb25zICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSsyMCk7Ci0gIGVkdC5udW1fbmFtZXMgICAgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSsyNCk7Ci0gIGVkdC5lYXRfYWRkciAgICAgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSsyOCk7Ci0gIGVkdC5ucHRfYWRkciAgICAgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSszMik7Ci0gIGVkdC5vdF9hZGRyICAgICAgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSszNik7Ci0KLSAgYWRqID0gLSAoc2VjdGlvbi0+dm1hICsgZGF0YW9mZik7Ci0KLSAgLyogRHVtcCB0aGUgRURUIGZpcnN0IGZpcnN0ICovCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuVGhlIEV4cG9ydCBUYWJsZXMgKGludGVycHJldGVkIC5lZGF0YSBzZWN0aW9uIGNvbnRlbnRzKVxuXG4iKSk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiRXhwb3J0IEZsYWdzIFx0XHRcdCVseFxuIiksICh1bnNpZ25lZCBsb25nKSBlZHQuZXhwb3J0X2ZsYWdzKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJUaW1lL0RhdGUgc3RhbXAgXHRcdCVseFxuIiksICh1bnNpZ25lZCBsb25nKSBlZHQudGltZV9zdGFtcCk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiTWFqb3IvTWlub3IgXHRcdFx0JWQvJWRcbiIpLCBlZHQubWFqb3JfdmVyLCBlZHQubWlub3JfdmVyKTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgIF8oIk5hbWUgXHRcdFx0XHQiKSk7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBlZHQubmFtZSk7Ci0gIGZwcmludGYgKGZpbGUsCi0JICAgIiAlc1xuIiwgZGF0YSArIGVkdC5uYW1lICsgYWRqKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJPcmRpbmFsIEJhc2UgXHRcdFx0JWxkXG4iKSwgZWR0LmJhc2UpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIk51bWJlciBpbjpcbiIpKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJcdEV4cG9ydCBBZGRyZXNzIFRhYmxlIFx0XHQlbHhcbiIpLAotCSAgZWR0Lm51bV9mdW5jdGlvbnMpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlx0W05hbWUgUG9pbnRlci9PcmRpbmFsXSBUYWJsZVx0JWx1XG4iKSwgZWR0Lm51bV9uYW1lcyk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiVGFibGUgQWRkcmVzc2VzXG4iKSk7Ci0KLSAgZnByaW50ZiAoZmlsZSwKLQkgICBfKCJcdEV4cG9ydCBBZGRyZXNzIFRhYmxlIFx0XHQiKSk7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBlZHQuZWF0X2FkZHIpOwotICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgXygiXHROYW1lIFBvaW50ZXIgVGFibGUgXHRcdCIpKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5ucHRfYWRkcik7Ci0gIGZwcmludGYgKGZpbGUsICJcbiIpOwotCi0gIGZwcmludGYgKGZpbGUsCi0JICAgXygiXHRPcmRpbmFsIFRhYmxlIFx0XHRcdCIpKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5vdF9hZGRyKTsKLSAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0KLSAgCi0gIC8qIFRoZSBuZXh0IHRhYmxlIHRvIGZpbmQgaXMgdGhlIEV4cG9ydCBBZGRyZXNzIFRhYmxlLiBJdCdzIGJhc2ljYWxseQotICAgICBhIGxpc3Qgb2YgcG9pbnRlcnMgdGhhdCBlaXRoZXIgbG9jYXRlIGEgZnVuY3Rpb24gaW4gdGhpcyBkbGwsIG9yCi0gICAgIGZvcndhcmQgdGhlIGNhbGwgdG8gYW5vdGhlciBkbGwuIFNvbWV0aGluZyBsaWtlOgotICAgICAgdHlwZWRlZiB1bmlvbgotICAgICAgewotICAgICAgICBsb25nIGV4cG9ydF9ydmE7Ci0gICAgICAgIGxvbmcgZm9yd2FyZGVyX3J2YTsKLSAgICAgIH0gZXhwb3J0X2FkZHJlc3NfdGFibGVfZW50cnk7Ci0gICovCi0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXG5FeHBvcnQgQWRkcmVzcyBUYWJsZSAtLSBPcmRpbmFsIEJhc2UgJWxkXG4iKSwKLQkgIGVkdC5iYXNlKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgZWR0Lm51bV9mdW5jdGlvbnM7ICsraSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGVhdF9tZW1iZXIgPSBiZmRfZ2V0XzMyIChhYmZkLAotCQkJCSAgICAgICBkYXRhICsgZWR0LmVhdF9hZGRyICsgKGkgKiA0KSArIGFkaik7Ci0gICAgICBiZmRfdm1hIGVhdF9hY3R1YWwgPSBlYXRfbWVtYmVyOwotICAgICAgYmZkX3ZtYSBlZGF0YV9zdGFydCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotICAgICAgYmZkX3ZtYSBlZGF0YV9lbmQgPSBlZGF0YV9zdGFydCArIGRhdGFzaXplOwotCi0gICAgICBpZiAoZWF0X21lbWJlciA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZWRhdGFfc3RhcnQgPCBlYXRfYWN0dWFsICYmIGVhdF9hY3R1YWwgPCBlZGF0YV9lbmQpCi0JewotCSAgLyogdGhpcyBydmEgaXMgdG8gYSBuYW1lIChmb3J3YXJkaW5nIGZ1bmN0aW9uKSBpbiBvdXIgc2VjdGlvbiAqLwotCSAgLyogU2hvdWxkIGxvY2F0ZSBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IgKi8KLQkgIGZwcmludGYgKGZpbGUsCi0JCSAgICJcdFslNGxkXSArYmFzZVslNGxkXSAlMDRseCAlcyAtLSAlc1xuIiwKLQkJICAgKGxvbmcpIGksIChsb25nKSAoaSArIGVkdC5iYXNlKSwgZWF0X21lbWJlciwKLQkJICAgXygiRm9yd2FyZGVyIFJWQSIpLCBkYXRhICsgZWF0X21lbWJlciArIGFkaik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFNob3VsZCBsb2NhdGUgYSBmdW5jdGlvbiBkZXNjcmlwdG9yIGluIHRoZSByZWxkYXRhIHNlY3Rpb24gKi8KLQkgIGZwcmludGYgKGZpbGUsCi0JCSAgICJcdFslNGxkXSArYmFzZVslNGxkXSAlMDRseCAlc1xuIiwKLQkJICAgKGxvbmcpIGksIChsb25nKSAoaSArIGVkdC5iYXNlKSwgZWF0X21lbWJlciwKLQkJICAgXygiRXhwb3J0IFJWQSIpKTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBFeHBvcnQgTmFtZSBQb2ludGVyIFRhYmxlIGlzIHBhaXJlZCB3aXRoIHRoZSBFeHBvcnQgT3JkaW5hbCBUYWJsZSAqLwotICAvKiBEdW1wIHRoZW0gaW4gcGFyYWxsZWwgZm9yIGNsYXJpdHkgKi8KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXG5bT3JkaW5hbC9OYW1lIFBvaW50ZXJdIFRhYmxlXG4iKSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGVkdC5udW1fbmFtZXM7ICsraSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIG5hbWVfcHRyID0gYmZkX2dldF8zMihhYmZkLAotCQkJCSAgICBkYXRhICsKLQkJCQkgICAgZWR0Lm5wdF9hZGRyCi0JCQkJICAgICsgKGkqNCkgKyBhZGopOwotICAgICAgCi0gICAgICBjaGFyICpuYW1lID0gKGNoYXIgKikgZGF0YSArIG5hbWVfcHRyICsgYWRqOwotCi0gICAgICBiZmRfdm1hIG9yZCA9IGJmZF9nZXRfMTYoYWJmZCwKLQkJCQkgICAgZGF0YSArCi0JCQkJICAgIGVkdC5vdF9hZGRyCi0JCQkJICAgICsgKGkqMikgKyBhZGopOwotICAgICAgZnByaW50ZihmaWxlLAotCSAgICAgICJcdFslNGxkXSAlc1xuIiwgKGxvbmcpIG9yZCwgbmFtZSk7Ci0KLSAgICB9Ci0KLSAgZnJlZSAoZGF0YSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9wcmludF9wZGF0YSAoYWJmZCwgdmZpbGUpCi0gICAgIGJmZCAgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucGRhdGEiKTsKLSAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgaTsKLSAgYmZkX3NpemVfdHlwZSBzdGFydCwgc3RvcDsKLSAgaW50IG9uYWxpbmUgPSAyMDsKLQotICBpZiAoc2VjdGlvbiA9PSBOVUxMCi0gICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbikgPT0gTlVMTAotICAgICAgfHwgcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbikgPT0gTlVMTCkKLSAgICAgcmV0dXJuIHRydWU7Ci0KLSAgc3RvcCA9IHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT52aXJ0X3NpemU7Ci0gIGlmICgoc3RvcCAlIG9uYWxpbmUpICE9IDApCi0gICAgZnByaW50ZiAoZmlsZSwgXygiV2FybmluZywgLnBkYXRhIHNlY3Rpb24gc2l6ZSAoJWxkKSBpcyBub3QgYSBtdWx0aXBsZSBvZiAlZFxuIiksCi0JICAgICAobG9uZylzdG9wLCBvbmFsaW5lKTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgIF8oIlxuVGhlIEZ1bmN0aW9uIFRhYmxlIChpbnRlcnByZXRlZCAucGRhdGEgc2VjdGlvbiBjb250ZW50cylcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwKLQkgICBfKCIgdm1hOlx0XHRCZWdpbiAgICBFbmQgICAgICBFSCAgICAgICBFSCAgICAgICBQcm9sb2dFbmQgIEV4Y2VwdGlvblxuIikpOwotICBmcHJpbnRmIChmaWxlLAotCSAgIF8oIiAgICAgXHRcdEFkZHJlc3MgIEFkZHJlc3MgIEhhbmRsZXIgIERhdGEgICAgIEFkZHJlc3MgICAgTWFza1xuIikpOwotCi0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoZGF0YSA9PSBOVUxMICYmIGRhdGFzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKLQkJCSAgICBzZWN0aW9uLAotCQkJICAgIChQVFIpIGRhdGEsIDAsCi0JCQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotCi0gIHN0YXJ0ID0gMDsKLQotICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gb25hbGluZSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGJlZ2luX2FkZHI7Ci0gICAgICBiZmRfdm1hIGVuZF9hZGRyOwotICAgICAgYmZkX3ZtYSBlaF9oYW5kbGVyOwotICAgICAgYmZkX3ZtYSBlaF9kYXRhOwotICAgICAgYmZkX3ZtYSBwcm9sb2dfZW5kX2FkZHI7Ci0gICAgICBpbnQgZW1fZGF0YTsKLQotICAgICAgaWYgKGkgKyAyMCA+IHN0b3ApCi0JYnJlYWs7Ci0KLSAgICAgIGJlZ2luX2FkZHIgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSk7Ci0gICAgICBlbmRfYWRkciA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzQpOwotICAgICAgZWhfaGFuZGxlciA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzgpOwotICAgICAgZWhfZGF0YSA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzEyKTsKLSAgICAgIHByb2xvZ19lbmRfYWRkciA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzE2KTsKLSAgICAgIAotICAgICAgaWYgKGJlZ2luX2FkZHIgPT0gMCAmJiBlbmRfYWRkciA9PSAwICYmIGVoX2hhbmRsZXIgPT0gMAotCSAgJiYgZWhfZGF0YSA9PSAwICYmIHByb2xvZ19lbmRfYWRkciA9PSAwKQotCXsKLQkgIC8qIFdlIGFyZSBwcm9iYWJseSBpbnRvIHRoZSBwYWRkaW5nIG9mIHRoZSBzZWN0aW9uIG5vdy4gICovCi0JICBicmVhazsKLQl9Ci0KLSAgICAgIGZwcmludGYgKGZpbGUsCi0JICAgICAgICIgJTA4bHhcdCIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGludCkgKGkgKyBzZWN0aW9uLT52bWEpKTsKLQotICAgICAgZW1fZGF0YSA9ICgoZWhfaGFuZGxlciAmIDB4MSkgPDwgMikgfCAocHJvbG9nX2VuZF9hZGRyICYgMHgzKTsKLSAgICAgIGVoX2hhbmRsZXIgJj0gMHhmZmZmZmZmYzsKLSAgICAgIHByb2xvZ19lbmRfYWRkciAmPSAweGZmZmZmZmZjOwotCi0gICAgICBmcHJpbnRmIChmaWxlLCAiJTA4bHggJTA4bHggJTA4bHggJTA4bHggJTA4bHggICAleCIsCi0JICAgICAgIGJlZ2luX2FkZHIsCi0JICAgICAgIGVuZF9hZGRyLAotCSAgICAgICBlaF9oYW5kbGVyLAotCSAgICAgICBlaF9kYXRhLAotCSAgICAgICBwcm9sb2dfZW5kX2FkZHIsCi0JICAgICAgIGVtX2RhdGEpOwotCi0jaWZkZWYgUE9XRVJQQ19MRV9QRQotICAgICAgaWYgKGVoX2hhbmRsZXIgPT0gMCAmJiBlaF9kYXRhICE9IDApCi0JewotCSAgLyogU3BlY2lhbCBiaXRzIGhlcmUsIGFsdGhvdWdoIHRoZSBtZWFuaW5nIG1heSAqLwotCSAgLyogYmUgYSBsaXR0bGUgbXlzdGVyaW91cy4gVGhlIG9ubHkgb25lIEkga25vdyAqLwotCSAgLyogZm9yIHN1cmUgaXMgMHgwMy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgLyogQ29kZSBTaWduaWZpY2FuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgLyogMHgwMCBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgLyogMHgwMSBSZWdpc3RlciBTYXZlIE1pbGxpY29kZSAgICAgICAgICAgICAgICAqLwotCSAgLyogMHgwMiBSZWdpc3RlciBSZXN0b3JlIE1pbGxpY29kZSAgICAgICAgICAgICAqLwotCSAgLyogMHgwMyBHbHVlIENvZGUgU2VxdWVuY2UgICAgICAgICAgICAgICAgICAgICAqLwotCSAgc3dpdGNoIChlaF9kYXRhKQotCSAgICB7Ci0JICAgIGNhc2UgMHgwMToKLQkgICAgICBmcHJpbnRmKGZpbGUsIF8oIiBSZWdpc3RlciBzYXZlIG1pbGxpY29kZSIpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweDAyOgotCSAgICAgIGZwcmludGYoZmlsZSwgXygiIFJlZ2lzdGVyIHJlc3RvcmUgbWlsbGljb2RlIikpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDB4MDM6Ci0JICAgICAgZnByaW50ZihmaWxlLCBfKCIgR2x1ZSBjb2RlIHNlcXVlbmNlIikpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotI2VuZGlmCi0gICAgICBmcHJpbnRmKGZpbGUsICJcbiIpOwotICAgIH0KLQotICBmcmVlIChkYXRhKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfSElHSEFESiA0Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRibFtdID0KLXsKLSJBQlNPTFVURSIsCi0iSElHSCIsCi0iTE9XIiwKLSJISUdITE9XIiwKLSJISUdIQURKIiwKLSJNSVBTX0pNUEFERFIiLAotIlVOS05PV04iLCAgIC8qIE1VU1QgYmUgbGFzdCAqLwotfTsKLQotc3RhdGljIGJvb2xlYW4KLXBlX3ByaW50X3JlbG9jIChhYmZkLCB2ZmlsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLSAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICBhc2VjdGlvbiAqc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlbG9jIik7Ci0gIGJmZF9zaXplX3R5cGUgZGF0YXNpemUgPSAwOwotICBiZmRfc2l6ZV90eXBlIGk7Ci0gIGJmZF9zaXplX3R5cGUgc3RhcnQsIHN0b3A7Ci0KLSAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgIF8oIlxuXG5QRSBGaWxlIEJhc2UgUmVsb2NhdGlvbnMgKGludGVycHJldGVkIC5yZWxvYyBzZWN0aW9uIGNvbnRlbnRzKVxuIikpOwotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoZGF0YSA9PSBOVUxMICYmIGRhdGFzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKLQkJCSAgICBzZWN0aW9uLAotCQkJICAgIChQVFIpIGRhdGEsIDAsCi0JCQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotCi0gIHN0YXJ0ID0gMDsKLQotICBzdG9wID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0KLSAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOykKLSAgICB7Ci0gICAgICBpbnQgajsKLSAgICAgIGJmZF92bWEgdmlydHVhbF9hZGRyZXNzOwotICAgICAgbG9uZyBudW1iZXIsIHNpemU7Ci0KLSAgICAgIC8qIFRoZSAucmVsb2Mgc2VjdGlvbiBpcyBhIHNlcXVlbmNlIG9mIGJsb2Nrcywgd2l0aCBhIGhlYWRlciBjb25zaXN0aW5nCi0JIG9mIHR3byAzMiBiaXQgcXVhbnRpdGllcywgZm9sbG93ZWQgYnkgYSBudW1iZXIgb2YgMTYgYml0IGVudHJpZXMgKi8KLQotICAgICAgdmlydHVhbF9hZGRyZXNzID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2kpOwotICAgICAgc2l6ZSA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzQpOwotICAgICAgbnVtYmVyID0gKHNpemUgLSA4KSAvIDI7Ci0KLSAgICAgIGlmIChzaXplID09IDApCi0JewotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBmcHJpbnRmIChmaWxlLAotCSAgICAgICBfKCJcblZpcnR1YWwgQWRkcmVzczogJTA4bHggQ2h1bmsgc2l6ZSAlbGQgKDB4JWx4KSBOdW1iZXIgb2YgZml4dXBzICVsZFxuIiksCi0JICAgICAgIHZpcnR1YWxfYWRkcmVzcywgc2l6ZSwgc2l6ZSwgbnVtYmVyKTsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlcjsgKytqKQotCXsKLQkgIHVuc2lnbmVkIHNob3J0IGUgPSBiZmRfZ2V0XzE2IChhYmZkLCBkYXRhICsgaSArIDggKyBqICogMik7Ci0JICB1bnNpZ25lZCBpbnQgdCA9IChlICYgMHhGMDAwKSA+PiAxMjsKLQkgIGludCBvZmYgPSBlICYgMHgwRkZGOwotCi0JICBpZiAodCA+PSBzaXplb2YgKHRibCkgLyBzaXplb2YgKHRibFswXSkpCi0JICAgIHQgPSAoc2l6ZW9mICh0YmwpIC8gc2l6ZW9mICh0YmxbMF0pKSAtIDE7Ci0KLQkgIGZwcmludGYgKGZpbGUsCi0JCSAgIF8oIlx0cmVsb2MgJTRkIG9mZnNldCAlNHggWyU0bHhdICVzIiksCi0JCSAgIGosIG9mZiwgKGxvbmcpIChvZmYgKyB2aXJ0dWFsX2FkZHJlc3MpLCB0YmxbdF0pOwotCi0JICAvKiBISUdIQURKIHRha2VzIGFuIGFyZ3VtZW50LCBidXQgdGhlcmUncyBubyBkb2N1bWVudGF0aW9uCi0JICAgICBvbiB3aGF0IGl0IGRvZXMsIG9yIHdoYXQgaXQgbWVhbnMuICBJbmZlcnJlZCBmcm9tCi0JICAgICBEVU1QQklOLiAgKi8KLQkgIGlmICh0ID09IElNQUdFX1JFTF9CQVNFRF9ISUdIQURKKQotCSAgICB7Ci0JICAgICAgIGZwcmludGYgKGZpbGUsICIgKCU0eClcbiIsCi0JCQkoKHVuc2lnbmVkIGludCkKLQkJCSBiZmRfZ2V0XzE2IChhYmZkLCBkYXRhICsgaSArIDggKyBqICogMiArIDIpKSk7Ci0JICAgICAgIGorKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICAgIGZwcmludGYgKGZpbGUsICJcbiIpOwotCX0KLSAgICAgIGkgKz0gc2l6ZTsKLSAgICB9Ci0KLSAgZnJlZSAoZGF0YSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFByaW50IG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9wZV9wcmludF9wcml2YXRlX2JmZF9kYXRhX2NvbW1vbiAoYWJmZCwgdmZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHZmaWxlOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7Ci0gIGludCBqOwotICBwZV9kYXRhX3R5cGUgKnBlID0gcGVfZGF0YSAoYWJmZCk7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICppID0gJnBlLT5wZV9vcHRoZHI7Ci0KLSAgLyogVGhlIE1TIGR1bXBiaW4gcHJvZ3JhbSByZXBvcnRlZGx5IGFuZHMgd2l0aCAweGZmMGYgYmVmb3JlCi0gICAgIHByaW50aW5nIHRoZSBjaGFyYWN0ZXJpc3RpY3MgZmllbGQuICBOb3Qgc3VyZSB3aHkuICBObyByZWFzb24gdG8KLSAgICAgZW11bGF0ZSBpdCBoZXJlLiAgKi8KLSAgZnByaW50ZiAoZmlsZSwgXygiXG5DaGFyYWN0ZXJpc3RpY3MgMHgleFxuIiksIHBlLT5yZWFsX2ZsYWdzKTsKLSN1bmRlZiBQRgotI2RlZmluZSBQRih4LCB5KSAgICBpZiAocGUtPnJlYWxfZmxhZ3MgJiB4KSB7IGZwcmludGYgKGZpbGUsICJcdCVzXG4iLCB5KTsgfQotICBQRiAoRl9SRUxGTEcsICJyZWxvY2F0aW9ucyBzdHJpcHBlZCIpOwotICBQRiAoRl9FWEVDLCAiZXhlY3V0YWJsZSIpOwotICBQRiAoRl9MTk5PLCAibGluZSBudW1iZXJzIHN0cmlwcGVkIik7Ci0gIFBGIChGX0xTWU1TLCAic3ltYm9scyBzdHJpcHBlZCIpOwotICBQRiAoMHg4MCwgImxpdHRsZSBlbmRpYW4iKTsKLSAgUEYgKEZfQVIzMldSLCAiMzIgYml0IHdvcmRzIik7Ci0gIFBGICgweDIwMCwgImRlYnVnZ2luZyBpbmZvcm1hdGlvbiByZW1vdmVkIik7Ci0gIFBGICgweDEwMDAsICJzeXN0ZW0gZmlsZSIpOwotICBQRiAoRl9ETEwsICJETEwiKTsKLSAgUEYgKDB4ODAwMCwgImJpZyBlbmRpYW4iKTsKLSN1bmRlZiBQRgotCi0gIC8qIGN0aW1lIGltcGxpZXMgJ1xuJy4gICovCi0gIGZwcmludGYgKGZpbGUsICJcblRpbWUvRGF0ZVx0XHQlcyIsIGN0aW1lICgmcGUtPmNvZmYudGltZXN0YW1wKSk7Ci0gIGZwcmludGYgKGZpbGUsIlxuSW1hZ2VCYXNlXHRcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+SW1hZ2VCYXNlKTsKLSAgZnByaW50ZiAoZmlsZSwiXG5TZWN0aW9uQWxpZ25tZW50XHQiKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGktPlNlY3Rpb25BbGlnbm1lbnQpOwotICBmcHJpbnRmIChmaWxlLCJcbkZpbGVBbGlnbm1lbnRcdFx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5GaWxlQWxpZ25tZW50KTsKLSAgZnByaW50ZiAoZmlsZSwiXG5NYWpvck9TeXN0ZW1WZXJzaW9uXHQlZFxuIiwgaS0+TWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgZnByaW50ZiAoZmlsZSwiTWlub3JPU3lzdGVtVmVyc2lvblx0JWRcbiIsIGktPk1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbik7Ci0gIGZwcmludGYgKGZpbGUsIk1ham9ySW1hZ2VWZXJzaW9uXHQlZFxuIiwgaS0+TWFqb3JJbWFnZVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJNaW5vckltYWdlVmVyc2lvblx0JWRcbiIsIGktPk1pbm9ySW1hZ2VWZXJzaW9uKTsKLSAgZnByaW50ZiAoZmlsZSwiTWFqb3JTdWJzeXN0ZW1WZXJzaW9uXHQlZFxuIiwgaS0+TWFqb3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgZnByaW50ZiAoZmlsZSwiTWlub3JTdWJzeXN0ZW1WZXJzaW9uXHQlZFxuIiwgaS0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgZnByaW50ZiAoZmlsZSwiUmVzZXJ2ZWQxXHRcdCUwOGx4XG4iLCBpLT5SZXNlcnZlZDEpOwotICBmcHJpbnRmIChmaWxlLCJTaXplT2ZJbWFnZVx0XHQlMDhseFxuIiwgaS0+U2l6ZU9mSW1hZ2UpOwotICBmcHJpbnRmIChmaWxlLCJTaXplT2ZIZWFkZXJzXHRcdCUwOGx4XG4iLCBpLT5TaXplT2ZIZWFkZXJzKTsKLSAgZnByaW50ZiAoZmlsZSwiQ2hlY2tTdW1cdFx0JTA4bHhcbiIsIGktPkNoZWNrU3VtKTsKLSAgZnByaW50ZiAoZmlsZSwiU3Vic3lzdGVtXHRcdCUwOHhcbiIsIGktPlN1YnN5c3RlbSk7Ci0gIGZwcmludGYgKGZpbGUsIkRsbENoYXJhY3RlcmlzdGljc1x0JTA4eFxuIiwgaS0+RGxsQ2hhcmFjdGVyaXN0aWNzKTsKLSAgZnByaW50ZiAoZmlsZSwiU2l6ZU9mU3RhY2tSZXNlcnZlXHQiKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGktPlNpemVPZlN0YWNrUmVzZXJ2ZSk7Ci0gIGZwcmludGYgKGZpbGUsIlxuU2l6ZU9mU3RhY2tDb21taXRcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2l6ZU9mU3RhY2tDb21taXQpOwotICBmcHJpbnRmIChmaWxlLCJcblNpemVPZkhlYXBSZXNlcnZlXHQiKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGktPlNpemVPZkhlYXBSZXNlcnZlKTsKLSAgZnByaW50ZiAoZmlsZSwiXG5TaXplT2ZIZWFwQ29tbWl0XHQiKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGktPlNpemVPZkhlYXBDb21taXQpOwotICBmcHJpbnRmIChmaWxlLCJcbkxvYWRlckZsYWdzXHRcdCUwOGx4XG4iLCBpLT5Mb2FkZXJGbGFncyk7Ci0gIGZwcmludGYgKGZpbGUsIk51bWJlck9mUnZhQW5kU2l6ZXNcdCUwOGx4XG4iLCBpLT5OdW1iZXJPZlJ2YUFuZFNpemVzKTsKLQotICBmcHJpbnRmIChmaWxlLCJcblRoZSBEYXRhIERpcmVjdG9yeVxuIik7Ci0gIGZvciAoaiA9IDA7IGogPCBJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFUzsgaisrKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbGUsICJFbnRyeSAlMXggIiwgaik7Ci0gICAgICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+RGF0YURpcmVjdG9yeVtqXS5WaXJ0dWFsQWRkcmVzcyk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICUwOGx4ICIsIGktPkRhdGFEaXJlY3Rvcnlbal0uU2l6ZSk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXNcbiIsIGRpcl9uYW1lc1tqXSk7Ci0gICAgfQotCi0gIHBlX3ByaW50X2lkYXRhIChhYmZkLCB2ZmlsZSk7Ci0gIHBlX3ByaW50X2VkYXRhIChhYmZkLCB2ZmlsZSk7Ci0gIHBlX3ByaW50X3BkYXRhIChhYmZkLCB2ZmlsZSk7Ci0gIHBlX3ByaW50X3JlbG9jIChhYmZkLCB2ZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYW55IHByaXZhdGUgaW5mbyB3ZSB1bmRlcnN0YW5kIGZyb20gdGhlIGlucHV0IGJmZAotICAgdG8gdGhlIG91dHB1dCBiZmQuICAqLwotCi1ib29sZWFuCi1fYmZkX3BlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGFfY29tbW9uIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQsICpvYmZkOwotewotICAvKiBPbmUgZGF5IHdlIG1heSB0cnkgdG8gZ3JvayBvdGhlciBwcml2YXRlIGRhdGEuICAqLwotICBpZiAoaWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotICAgICAgfHwgb2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBwZV9kYXRhIChvYmZkKS0+cGVfb3B0aGRyID0gcGVfZGF0YSAoaWJmZCktPnBlX29wdGhkcjsKLSAgcGVfZGF0YSAob2JmZCktPmRsbCA9IHBlX2RhdGEgKGliZmQpLT5kbGw7Ci0KLSAgLyogZm9yIHN0cmlwOiBpZiB3ZSByZW1vdmVkIC5yZWxvYywgd2UnbGwgbWFrZSBhIHJlYWwgbWVzcyBvZiB0aGluZ3MKLSAgICAgaWYgd2UgZG9uJ3QgcmVtb3ZlIHRoaXMgZW50cnkgYXMgd2VsbC4gICovCi0gIGlmICghIHBlX2RhdGEgKG9iZmQpLT5oYXNfcmVsb2Nfc2VjdGlvbikKLSAgICB7Ci0gICAgICBwZV9kYXRhKG9iZmQpLT5wZV9vcHRoZHIuRGF0YURpcmVjdG9yeVs1XS5WaXJ0dWFsQWRkcmVzcyA9IDA7Ci0gICAgICBwZV9kYXRhKG9iZmQpLT5wZV9vcHRoZHIuRGF0YURpcmVjdG9yeVs1XS5TaXplID0gMDsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IHByaXZhdGUgc2VjdGlvbiBkYXRhLiAqLwotYm9vbGVhbgotX2JmZF9wZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYywgb2JmZCwgb3NlYykKLSAgICAgYmZkICppYmZkOwotICAgICBhc2VjdGlvbiAqaXNlYzsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlYzsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjKSAhPSBOVUxMCi0gICAgICAmJiBwZWlfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAob2JmZCwgb3NlYykgPT0gTlVMTCkKLQl7Ci0JICBvc2VjLT51c2VkX2J5X2JmZCA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKG9iZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKG9zZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAocGVpX3NlY3Rpb25fZGF0YSAob2JmZCwgb3NlYykgPT0gTlVMTCkKLQl7Ci0JICBjb2ZmX3NlY3Rpb25fZGF0YSAob2JmZCwgb3NlYyktPnRkYXRhID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAob2JmZCwgc2l6ZW9mIChzdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAob2JmZCwgb3NlYyktPnRkYXRhID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBwZWlfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKS0+dmlydF9zaXplID0KLQlwZWlfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjKS0+dmlydF9zaXplOwotICAgICAgcGVpX3NlY3Rpb25fZGF0YSAob2JmZCwgb3NlYyktPnBlX2ZsYWdzID0KLSAgICAgICAgcGVpX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYyktPnBlX2ZsYWdzOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZAotX2JmZF9wZV9nZXRfc3ltYm9sX2luZm8gKGFiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgY29mZl9nZXRfc3ltYm9sX2luZm8gKGFiZmQsIHN5bWJvbCwgcmV0KTsKLQotICBpZiAocGVfZGF0YSAoYWJmZCkgIT0gTlVMTAotICAgICAgJiYgKChzeW1ib2wtPmZsYWdzICYgQlNGX0RFQlVHR0lORykgPT0gMAotCSAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HX1JFTE9DKSAhPSAwKQotICAgICAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmV0LT52YWx1ZSArPSBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLX0KLQotLyogSGFuZGxlIHRoZSAuaWRhdGEgc2VjdGlvbiBhbmQgb3RoZXIgdGhpbmdzIHRoYXQgbmVlZCBzeW1ib2wgdGFibGUKLSAgIGFjY2Vzcy4gICovCi0KLWJvb2xlYW4KLV9iZmRfcGVpX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCAoYWJmZCwgcGZpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqcGZpbmZvOwotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmgxOwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IHBmaW5mby0+aW5mbzsKLQotICAvKiBUaGVyZSBhcmUgYSBmZXcgZmllbGRzIHRoYXQgbmVlZCB0byBiZSBmaWxsZWQgaW4gbm93IHdoaWxlIHdlCi0gICAgIGhhdmUgc3ltYm9sIHRhYmxlIGFjY2Vzcy4KLQotICAgICBUaGUgLmlkYXRhIHN1YnNlY3Rpb25zIGFyZW4ndCBkaXJlY3RseSBhdmFpbGFibGUgYXMgc2VjdGlvbnMsIGJ1dAotICAgICB0aGV5IGFyZSBpbiB0aGUgc3ltYm9sIHRhYmxlLCBzbyBnZXQgdGhlbSBmcm9tIHRoZXJlLiAgKi8KLQotICAvKiBUaGUgaW1wb3J0IGRpcmVjdG9yeS4gIFRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgLmlkYXRhJDIsIHdpdGggc2l6ZQotICAgICBvZiAuaWRhdGEkMiArIC5pZGF0YSQzLiAgKi8KLSAgaDEgPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICAiLmlkYXRhJDIiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICBpZiAoaDEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBwZV9kYXRhKGFiZmQpLT5wZV9vcHRoZHIuRGF0YURpcmVjdG9yeVsxXS5WaXJ0dWFsQWRkcmVzcyA9Ci0JKGgxLT5yb290LnUuZGVmLnZhbHVlCi0JICsgaDEtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSArIGgxLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaDEgPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAiLmlkYXRhJDQiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5EYXRhRGlyZWN0b3J5WzFdLlNpemUgPQotCSgoaDEtPnJvb3QudS5kZWYudmFsdWUKLQkgICsgaDEtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgKyBoMS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KQotCSAtIHBlX2RhdGEoYWJmZCktPnBlX29wdGhkci5EYXRhRGlyZWN0b3J5WzFdLlZpcnR1YWxBZGRyZXNzKTsKLQotICAgICAgLyogVGhlIGltcG9ydCBhZGRyZXNzIHRhYmxlLiAgVGhpcyBpcyB0aGUgc2l6ZS9hZGRyZXNzIG9mCi0gICAgICAgICAuaWRhdGEkNS4gICovCi0gICAgICBoMSA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICIuaWRhdGEkNSIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkRhdGFEaXJlY3RvcnlbMTJdLlZpcnR1YWxBZGRyZXNzID0KLQkoaDEtPnJvb3QudS5kZWYudmFsdWUKLQkgKyBoMS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICsgaDEtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBoMSA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICIuaWRhdGEkNiIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkRhdGFEaXJlY3RvcnlbMTJdLlNpemUgPQotCSgoaDEtPnJvb3QudS5kZWYudmFsdWUKLQkgICsgaDEtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgKyBoMS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KQotCSAtIHBlX2RhdGEoYWJmZCktPnBlX29wdGhkci5EYXRhRGlyZWN0b3J5WzEyXS5WaXJ0dWFsQWRkcmVzcyk7Ci0gICAgfQotCi0gIC8qIElmIHdlIGNvdWxkbid0IGZpbmQgaWRhdGEkMiwgd2UgZWl0aGVyIGhhdmUgYW4gZXhjZXNzaXZlbHkKLSAgICAgdHJpdmlhbCBwcm9ncmFtIG9yIGFyZSBpbiBERUVQIHRyb3VibGU7IHdlIGhhdmUgdG8gYXNzdW1lIHRyaXZpYWwKLSAgICAgcHJvZ3JhbS4uLi4gICovCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3BvL01ha2UtaW4gYi9iZmQvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9iZmQvcG8vTWFrZS1pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotQFNFVF9NQUtFQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1kYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KLXN1YmRpciA9IHBvCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLUNDID0gQENDQAotR0VOQ0FUID0gQEdFTkNBVEAKLUdNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACi1NU0dGTVQgPSBATVNHRk1UQAotWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAotTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKLQotREVGUyA9IEBERUZTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotCi1JTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotU09VUkNFUyA9IGNhdC1pZC10YmwuYwotUE9GSUxFUyA9IEBQT0ZJTEVTQAotR01PRklMRVMgPSBAR01PRklMRVNACi1ESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAotc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQotCi1QT1RGSUxFUyA9IFwKLQotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAotCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLQotLnBvLnBveDoKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAotCi0ucG8ubW86Ci0JJChNU0dGTVQpIC1vICRAICQ8Ci0KLS5wby5nbW86Ci0JZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAotCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8Ci0KLS5wby5jYXQ6Ci0Jc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKLQkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKLQotCi1hbGw6IGFsbC1AVVNFX05MU0AKLQotYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAotYWxsLW5vOgotCi0kKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCi0JJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAotCSAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKLQkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KLQlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCi0kKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6Ci0kKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAotCXJtIC1mIGNhdC1pZC10YmwudG1wCi0Jc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAotCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAotCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKLQkgIHJtIGNhdC1pZC10YmwudG1wOyBcCi0JZWxzZSBcCi0JICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCi0JICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCi0JZmkKLQljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCi0KLQotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOgotaW5zdGFsbC1pbmZvOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACi1pbnN0YWxsLWRhdGEtbm86IGFsbAotaW5zdGFsbC1kYXRhLXllczogYWxsCi0JaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAotCWVsc2UgXAotCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKLQlmaQotCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgY2FzZSAiJCRjYXQiIGluIFwKLQkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAotCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCi0JICBlc2FjOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZWxzZSBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAotCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKLQkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCi0JCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQlkb25lCi0Jcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgotCi1jaGVjazogYWxsCi0KLWNhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKLQotZHZpIGluZm8gdGFncyBUQUdTIElEOgotCi1tb3N0bHljbGVhbjoKLQlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCi0Jcm0gLWZyICoubwotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQlybSAtZiAkKEdNT0ZJTEVTKQotCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCi0JZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi11cGRhdGUtcG86IE1ha2VmaWxlCi0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAotCWNkICQoc3JjZGlyKTsgXAotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCi0JICBlY2hvICIkJGxhbmc6IjsgXAotCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAotCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCi0JICBlbHNlIFwKLQkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCi0JICAgIHJtIC1mICQkbGFuZy5wbzsgXAotCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAotCSAgZmk7IFwKLQlkb25lCi0KLVBPVEZJTEVTOiBQT1RGSUxFUy5pbgotCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCi0JICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKLQkgIGVsc2UgXAotCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAotCSAgZmk7IFwKLQkgIHJtIC1mICRALXQgJEAgXAotCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCi0JCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKLQkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAotCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCi0JICAgICYmIG12ICRALXQgJEAgKQotCi1QT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQotCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KLQotTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUwotCWNkIC4uIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAotCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9iZmQvcG8vUE9URklMRVMuaW4gYi9iZmQvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOGY5ODcuLjAwMDAwMDAKLS0tIGEvYmZkL3BvL1BPVEZJTEVTLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLWFpeDM4Ni1jb3JlLmMKLWFvdXQtYWRvYmUuYwotYW91dC1hcm0uYwotYW91dC1uczMyay5jCi1hb3V0LXNwYXJjbGUuYwotYW91dC10YXJnZXQuaAotYW91dC10aWMzMC5jCi1hb3V0MC5jCi1hb3V0MzIuYwotYW91dDY0LmMKLWFvdXRmMS5oCi1hb3V0eC5oCi1hcmNoaXZlLmMKLWFyY2h1cmVzLmMKLWJmZC5jCi1iaW5hcnkuYwotYm91dC5jCi1jYWNoZS5jCi1jZi1pMzg2bHlueC5jCi1jZi1tNjhrbHlueC5jCi1jZi1zcGFyY2x5bnguYwotY2lzY28tY29yZS5jCi1jb2ZmLWEyOWsuYwotY29mZi1hbHBoYS5jCi1jb2ZmLWFwb2xsby5jCi1jb2ZmLWFybS5jCi1jb2ZmLWF1eC5jCi1jb2ZmLWdvMzIuYwotY29mZi1oODMwMC5jCi1jb2ZmLWg4NTAwLmMKLWNvZmYtaTM4Ni5jCi1jb2ZmLWk4NjAuYwotY29mZi1pOTYwLmMKLWNvZmYtbTY4ay5jCi1jb2ZmLW04OGsuYwotY29mZi1taXBzLmMKLWNvZmYtcG1hYy5jCi1jb2ZmLXJzNjAwMC5jCi1jb2ZmLXNoLmMKLWNvZmYtc3BhcmMuYwotY29mZi1zdGdvMzIuYwotY29mZi1zdm02OGsuYwotY29mZi10aWMzMC5jCi1jb2ZmLXRpYzgwLmMKLWNvZmYtdTY4ay5jCi1jb2ZmLXc2NS5jCi1jb2ZmLXdlMzJrLmMKLWNvZmYtejhrLmMKLWNvZmZjb2RlLmgKLWNvZmZnZW4uYwotY29mZmxpbmsuYwotY29mZnN3YXAuaAotY29yZWZpbGUuYwotY3B1LWEyOWsuYwotY3B1LWFscGhhLmMKLWNwdS1hcmMuYwotY3B1LWFybS5jCi1jcHUtZDEwdi5jCi1jcHUtZDMwdi5jCi1jcHUtZnIzMC5jCi1jcHUtaDgzMDAuYwotY3B1LWg4NTAwLmMKLWNwdS1ocHBhLmMKLWNwdS1pMzg2LmMKLWNwdS1pODYwLmMKLWNwdS1pOTYwLmMKLWNwdS1tMTAyMDAuYwotY3B1LW0xMDMwMC5jCi1jcHUtbTMyci5jCi1jcHUtbTY4ay5jCi1jcHUtbTg4ay5jCi1jcHUtbWNvcmUuYwotY3B1LW1pcHMuYwotY3B1LW5zMzJrLmMKLWNwdS1wb3dlcnBjLmMKLWNwdS1yczYwMDAuYwotY3B1LXNoLmMKLWNwdS1zcGFyYy5jCi1jcHUtdGljMzAuYwotY3B1LXRpYzgwLmMKLWNwdS12ODUwLmMKLWNwdS12YXguYwotY3B1LXc2NS5jCi1jcHUtd2UzMmsuYwotY3B1LXo4ay5jCi1kZW1vNjQuYwotZHdhcmYyLmMKLWVjb2ZmLmMKLWVjb2ZmbGluay5jCi1lY29mZnN3YXAuaAotZWxmLWJmZC5oCi1lbGYtbTEwMjAwLmMKLWVsZi1tMTAzMDAuYwotZWxmLmMKLWVsZjMyLWFyYy5jCi1lbGYzMi1kMTB2LmMKLWVsZjMyLWQzMHYuYwotZWxmMzItZnIzMC5jCi1lbGYzMi1nZW4uYwotZWxmMzItaHBwYS5jCi1lbGYzMi1ocHBhLmgKLWVsZjMyLWkzODYuYwotZWxmMzItaTg2MC5jCi1lbGYzMi1pOTYwLmMKLWVsZjMyLW0zMnIuYwotZWxmMzItbTY4ay5jCi1lbGYzMi1tODhrLmMKLWVsZjMyLW1jb3JlLmMKLWVsZjMyLW1pcHMuYwotZWxmMzItcHBjLmMKLWVsZjMyLXNoLmMKLWVsZjMyLXNwYXJjLmMKLWVsZjMyLXY4NTAuYwotZWxmMzIuYwotZWxmNjQtYWxwaGEuYwotZWxmNjQtZ2VuLmMKLWVsZjY0LW1pcHMuYwotZWxmNjQtc3BhcmMuYwotZWxmNjQuYwotZWxmYXJtLW5hYmkuYwotZWxmYXJtLW9hYmkuYwotZWxmY29kZS5oCi1lbGZsaW5rLmMKLWZvcm1hdC5jCi1nZW5saW5rLmgKLWdvMzJzdHViLmgKLWhhc2guYwotaHAzMDBic2QuYwotaHAzMDBocHV4LmMKLWhwcGFfc3R1YnMuaAotaHB1eC1jb3JlLmMKLWkzODZhb3V0LmMKLWkzODZic2QuYwotaTM4NmR5bml4LmMKLWkzODZmcmVlYnNkLmMKLWkzODZsaW51eC5jCi1pMzg2bHlueC5jCi1pMzg2bWFjaDMuYwotaTM4Nm1zZG9zLmMKLWkzODZuZXRic2QuYwotaTM4Nm9zOWsuYwotaWVlZS5jCi1paGV4LmMKLWluaXQuYwotaXJpeC1jb3JlLmMKLWxpYmFvdXQuaAotbGliYmZkLmMKLWxpYmJmZC5oCi1saWJjb2ZmLmgKLWxpYmVjb2ZmLmgKLWxpYmhwcGEuaAotbGliaWVlZS5oCi1saWJubG0uaAotbGlib2FzeXMuaAotbGlua2VyLmMKLWx5bngtY29yZS5jCi1tNjhrNGtuZXRic2QuYwotbTY4a2xpbnV4LmMKLW02OGtseW54LmMKLW02OGtuZXRic2QuYwotbTg4a21hY2gzLmMKLW1pcHNic2QuYwotbmV0YnNkLmgKLW5ld3NvczMuYwotbmxtLXRhcmdldC5oCi1ubG0uYwotbmxtMzItYWxwaGEuYwotbmxtMzItaTM4Ni5jCi1ubG0zMi1wcGMuYwotbmxtMzItc3BhcmMuYwotbmxtMzIuYwotbmxtNjQuYwotbmxtY29kZS5oCi1uczMyay5oCi1uczMya25ldGJzZC5jCi1vYXN5cy5jCi1vcG5jbHMuYwotb3NmLWNvcmUuYwotcGM1MzItbWFjaC5jCi1wZS1hcm0uYwotcGUtaTM4Ni5jCi1wZS1tY29yZS5jCi1wZS1wcGMuYwotcGVpLWFybS5jCi1wZWktaTM4Ni5jCi1wZWktbWNvcmUuYwotcGVpLXBwYy5jCi1wcGNib290LmMKLXJlbG9jLmMKLXJlbG9jMTYuYwotcmlzY2l4LmMKLXNjbzUtY29yZS5jCi1zZWN0aW9uLmMKLXNvbS5jCi1zb20uaAotc3BhcmNsaW51eC5jCi1zcGFyY2x5bnguYwotc3BhcmNuZXRic2QuYwotc3JlYy5jCi1zdGFiLXN5bXMuYwotc3RhYnMuYwotc3Vub3MuYwotc3ltcy5jCi10YXJnZXRzLmMKLXRla2hleC5jCi10cmFkLWNvcmUuYwotdmF4bmV0YnNkLmMKLXZlcnNhZG9zLmMKLXZtcy1nc2QuYwotdm1zLWhkci5jCi12bXMtbWlzYy5jCi12bXMtdGlyLmMKLXZtcy5jCi12bXMuaAoteGNvZmZsaW5rLmMKZGlmZiAtLWdpdCBhL2JmZC9wby9iZmQucG90IGIvYmZkL3BvL2JmZC5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Y2RhMTkuLjAwMDAwMDAKLS0tIGEvYmZkL3BvL2JmZC5wb3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDg5ICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk5LTA2LTAzIDAyOjU1LTA3MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhb3V0LWFkb2JlLmM6MTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbmtub3duIHNlY3Rpb24gdHlwZSBpbiBhLm91dC5hZG9iZSBmaWxlOiAleFxuIgotbXNnc3RyICIiCi0KLSM6IGFvdXR4Lmg6MTIzNyBhb3V0eC5oOjE2NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gYCVzJyBpbiBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogYW91dHguaDoxNjIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBmb3Igc3ltYm9sIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGFvdXR4Lmg6MTYyMwotbXNnaWQgIip1bmtub3duKiIKLW1zZ3N0ciAiIgotCi0jOiBhb3V0eC5oOjM2NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbG9jYXRlYWJsZSBsaW5rIGZyb20gJXMgdG8gJXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBhcmNoaXZlLmM6MTcyNAotbXNnaWQgIldhcm5pbmc6IHdyaXRpbmcgYXJjaGl2ZSB3YXMgc2xvdzogcmV3cml0aW5nIHRpbWVzdGFtcFxuIgotbXNnc3RyICIiCi0KLSM6IGFyY2hpdmUuYzoxOTkwCi1tc2dpZCAiUmVhZGluZyBhcmNoaXZlIGZpbGUgbW9kIHRpbWVzdGFtcCIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRTogYmZkIGNhbid0IGNhbGwgcGVycm9yLgotIzogYXJjaGl2ZS5jOjIwMTQKLW1zZ2lkICJXcml0aW5nIHVwZGF0ZWQgYXJtYXAgdGltZXN0YW1wIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI3NAotbXNnaWQgIk5vIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI3NQotbXNnaWQgIlN5c3RlbSBjYWxsIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI3NgotbXNnaWQgIkludmFsaWQgYmZkIHRhcmdldCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzcKLW1zZ2lkICJGaWxlIGluIHdyb25nIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzgKLW1zZ2lkICJJbnZhbGlkIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzkKLW1zZ2lkICJNZW1vcnkgZXhoYXVzdGVkIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4MAotbXNnaWQgIk5vIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjgxCi1tc2dpZCAiQXJjaGl2ZSBoYXMgbm8gaW5kZXg7IHJ1biByYW5saWIgdG8gYWRkIG9uZSIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODIKLW1zZ2lkICJObyBtb3JlIGFyY2hpdmVkIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4MwotbXNnaWQgIk1hbGZvcm1lZCBhcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4NAotbXNnaWQgIkZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4NQotbXNnaWQgIkZpbGUgZm9ybWF0IGlzIGFtYmlndW91cyIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODYKLW1zZ2lkICJTZWN0aW9uIGhhcyBubyBjb250ZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODcKLW1zZ2lkICJOb25yZXByZXNlbnRhYmxlIHNlY3Rpb24gb24gb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4OAotbXNnaWQgIlN5bWJvbCBuZWVkcyBkZWJ1ZyBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGV4aXN0IgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4OQotbXNnaWQgIkJhZCB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyOTAKLW1zZ2lkICJGaWxlIHRydW5jYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyOTEKLW1zZ2lkICJGaWxlIHRvbyBiaWciCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjkyCi1tc2dpZCAiIzxJbnZhbGlkIGVycm9yIGNvZGU+IgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjY3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJiZmQgYXNzZXJ0aW9uIGZhaWwgJXM6JWQiCi1tc2dzdHIgIiIKLQotIzogYmluYXJ5LmM6Mjk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IFdyaXRpbmcgc2VjdGlvbiBgJXMnIHRvIGh1Z2UgKGllIG5lZ2F0aXZlKSBmaWxlIG9mZnNldCAweCVseC4iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hMjlrLmM6MTIxCi1tc2dpZCAiTWlzc2luZyBJSENPTlNUIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjE4MQotbXNnaWQgIk1pc3NpbmcgSUhJSEFMRiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWEyOWsuYzoyMTMKLW1zZ2lkICJVbnJlY29nbml6ZWQgcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hMjlrLmM6NDA2Ci1tc2dpZCAibWlzc2luZyBJSENPTlNUIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjQ5NwotbXNnaWQgIm1pc3NpbmcgSUhJSEFMRiByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFscGhhLmM6ODgwIGNvZmYtYWxwaGEuYzo5MTcKLW1zZ2lkICJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHVzZWQgd2hlbiBHUCBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFscGhhLmM6MTQ4NiBlbGY2NC1hbHBoYS5jOjQwNTEKLW1zZ2lkICJ1c2luZyBtdWx0aXBsZSBncCB2YWx1ZXMiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hbHBoYS5jOjE5OTIgY29mZi1taXBzLmM6MTQzNSBlbGYzMi1taXBzLmM6NDkyNAotbXNnaWQgIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gd2hlbiBHUCBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjg4NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5hYmxlIHRvIGZpbmQgVEhVTUIgZ2x1ZSAnJXMnIGZvciBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6OTEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmFibGUgdG8gZmluZCBBUk0gZ2x1ZSAnJXMnIGZvciBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MTE4OCBjb2ZmLWFybS5jOjEyODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMoJXMpOiB3YXJuaW5nOiBpbnRlcndvcmtpbmcgbm90IGVuYWJsZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MTE5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiBhcm0gY2FsbCB0byB0aHVtYiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjEyODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogdGh1bWIgY2FsbCB0byBhcm0iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxMjg5Ci1tc2dpZCAiICBjb25zaWRlciByZWxpbmtpbmcgd2l0aCAtLXN1cHBvcnQtb2xkLWNvZGUgZW5hYmxlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjE1NzUgY29mZi10aWM4MC5jOjY4MiBjb2ZmbGluay5jOjI3MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJhZCByZWxvYyBhZGRyZXNzIDB4JWx4IGluIHNlY3Rpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIwMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEVSUk9SOiBjb21waWxlZCBmb3IgQVBDUy0lZCB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIEFQQ1MtJWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMDUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogRVJST1I6IHBhc3NlcyBmbG9hdHMgaW4gZmxvYXQgcmVnaXN0ZXJzIHdoZXJlYXMgdGFyZ2V0ICVzIHVzZXMgaW50ZWdlciAiCi0icmVnaXN0ZXJzIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjA1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IEVSUk9SOiBwYXNzZXMgZmxvYXRzIGluIGludGVnZXIgcmVnaXN0ZXJzIHdoZXJlYXMgdGFyZ2V0ICVzIHVzZXMgZmxvYXQgIgotInJlZ2lzdGVycyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIwNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBFUlJPUjogY29tcGlsZWQgYXMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgd2hlcmVhcyB0YXJnZXQgJXMgaXMgIgotImFic29sdXRlIHBvc2l0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjA3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IEVSUk9SOiBjb21waWxlZCBhcyBhYnNvbHV0ZSBwb3NpdGlvbiBjb2RlLCB3aGVyZWFzIHRhcmdldCAlcyBpcyBwb3NpdGlvbiAiCi0iaW5kZXBlbmRlbnQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IGlucHV0IGZpbGUgJXMgc3VwcG9ydHMgaW50ZXJ3b3JraW5nLCB3aGVyZWFzICVzIGRvZXMgbm90LiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogaW5wdXQgZmlsZSAlcyBkb2VzIG5vdCBzdXBwb3J0IGludGVyd29ya2luZywgd2hlcmVhcyAlcyBkb2VzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJpdmF0ZSBmbGFncyA9ICV4OiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNDAKLW1zZ2lkICIgW2Zsb2F0cyBwYXNzZWQgaW4gZmxvYXQgcmVnaXN0ZXJzXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNDIKLW1zZ2lkICIgW2Zsb2F0cyBwYXNzZWQgaW4gaW50ZWdlciByZWdpc3RlcnNdIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjE0NQotbXNnaWQgIiBbcG9zaXRpb24gaW5kZXBlbmRlbnRdIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjE0NwotbXNnaWQgIiBbYWJzb2x1dGUgcG9zaXRpb25dIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjE1MQotbXNnaWQgIiBbaW50ZXJ3b3JraW5nIGZsYWcgbm90IGluaXRpYWxpc2VkXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNTMKLW1zZ2lkICIgW2ludGVyd29ya2luZyBzdXBwb3J0ZWRdIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjE1NQotbXNnaWQgIiBbaW50ZXJ3b3JraW5nIG5vdCBzdXBwb3J0ZWRdIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjIwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iV2FybmluZzogTm90IHNldHRpbmcgaW50ZXJ3b3JraW5nIGZsYWcgb2YgJXMsIHNpbmNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gIgotInNwZWNpZmllZCBhcyBub24taW50ZXJ3b3JraW5nIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjIwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JraW5nIGZsYWcgb2YgJXMgZHVlIHRvIG91dHNpZGUgcmVxdWVzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWk5NjAuYzoxMzUgY29mZi1pOTYwLmM6NDg0Ci1tc2dpZCAidW5jZXJ0YWluIGNhbGxpbmcgY29udmVudGlvbiBmb3Igbm9uLUNPRkYgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtbWlwcy5jOjg3NSBlbGYzMi1taXBzLmM6MTEzNgotbXNnaWQgIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gd2hlbiBfZ3Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1taXBzLmM6MjQzMwotbXNnaWQgInVuc3VwcG9ydGVkIHJlbG9jIHR5cGUiCi1tc2dzdHIgIiIKLQotIy4gTm8gb3RoZXIgc2VjdGlvbnMgc2hvdWxkIGFwcGVhciBpbiAtbWVtYmVkZGVkLXBpYwotIy4gY29kZS4KLSM6IGNvZmYtbWlwcy5jOjI0NzAKLW1zZ2lkICJyZWxvYyBhZ2FpbnN0IHVuc3VwcG9ydGVkIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29mZi1taXBzLmM6MjQ3OAotbXNnaWQgInJlbG9jIG5vdCBwcm9wZXJseSBhbGlnbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtdGljODAuYzo0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIHJlbG9jIHR5cGUgMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLXc2NS5jOjM4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJpZ25vcmluZyByZWxvYyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvZmZjb2RlLmg6MzQ0MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIGxpbmUgbnVtYmVycyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmY29kZS5oOjM0NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IGR1cGxpY2F0ZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmY29kZS5oOjM3ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFVucmVjb2duaXplZCBzdG9yYWdlIGNsYXNzICVkIGZvciAlcyBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmY29kZS5oOjM5NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IGlsbGVnYWwgc3ltYm9sIGluZGV4ICVsZCBpbiByZWxvY3MiCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDo0MDAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbGxlZ2FsIHJlbG9jYXRpb24gdHlwZSAlZCBhdCBhZGRyZXNzIDB4JWx4IgotbXNnc3RyICIiCi0KLSM6IGNvZmZnZW4uYzoxNjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgc3RyaW5nIHRhYmxlIHNpemUgJWx1IgotbXNnc3RyICIiCi0KLSM6IGNvZmZsaW5rLmM6NDIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IHR5cGUgb2Ygc3ltYm9sIGAlcycgY2hhbmdlZCBmcm9tICVkIHRvICVkIGluICVzIgotbXNnc3RyICIiCi0KLSM6IGNvZmZsaW5rLmM6MjA5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVsb2NzIGluIHNlY3Rpb24gYCVzJywgYnV0IGl0IGhhcyBubyBjb250ZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBjb2Zmc3dhcC5oOjg4OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogJXM6IGxpbmUgbnVtYmVyIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIKLW1zZ3N0ciAiIgotCi0jOiBjb2Zmc3dhcC5oOjkwMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IHJlbG9jIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo0MjAKLW1zZ2lkICJEd2FyZiBFcnJvcjogQ2FuJ3QgZmluZCAuZGVidWdfYWJicmV2IHNlY3Rpb24uIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjQzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJEd2FyZiBFcnJvcjogQWJicmV2IG9mZnNldCAoJXUpIGJpZ2dlciB0aGFuIGFiYnJldiBzaXplICgldSkuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjYxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJEd2FyZiBFcnJvcjogSW52YWxpZCBvciB1bmhhbmRsZWQgRk9STSB2YWx1ZTogJWQuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjY4NwotbXNnaWQgIkR3YXJmIEVycm9yOiBtYW5nbGVkIGxpbmUgbnVtYmVyIHNlY3Rpb24gKGJhZCBmaWxlIG51bWJlcikuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjczOAotbXNnaWQgIkR3YXJmIEVycm9yOiBDYW4ndCBmaW5kIC5kZWJ1Z19saW5lIHNlY3Rpb24uIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjkwMwotbXNnaWQgIkR3YXJmIEVycm9yOiBtYW5nbGVkIGxpbmUgbnVtYmVyIHNlY3Rpb24uIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjEwOTcgZHdhcmYyLmM6MTI0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJEd2FyZiBFcnJvcjogQ291bGQgbm90IGZpbmQgYWJicmV2IG51bWJlciAlZC4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6MTIwNQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iRHdhcmYgRXJyb3I6IGZvdW5kIGR3YXJmIHZlcnNpb24gJyVodScsIHRoaXMgcmVhZGVyIG9ubHkgaGFuZGxlcyB2ZXJzaW9uIDIgIgotImluZm9ybWF0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzoxMjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJEd2FyZiBFcnJvcjogZm91bmQgYWRkcmVzcyBzaXplICcldScsIHRoaXMgcmVhZGVyIGNhbiBub3QgaGFuZGxlIHNpemVzICIKLSJncmVhdGVyIHRoYW4gJyV1Jy4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6MTIzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJEd2FyZiBFcnJvcjogQmFkIGFiYnJldiBudW1iZXI6ICVkLiIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjEzMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBiYXNpYyB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTU4MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgRW5kKzEgc3ltYm9sOiAlbGQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNTg3IGVjb2ZmLmM6MTU5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgRmlyc3Qgc3ltYm9sOiAlbGQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBFbmQrMSBzeW1ib2w6ICUtN2xkICAgVHlwZTogICVzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgTG9jYWwgc3ltYm9sOiAlbGQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNjE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBzdHJ1Y3Q7IEVuZCsxIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgdW5pb247IEVuZCsxIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgZW51bTsgRW5kKzEgc3ltYm9sOiAlbGQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNjMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBUeXBlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYtbTEwMjAwLmM6NDU1IGVsZi1tMTAzMDAuYzo2NjcgZWxmMzItZDEwdi5jOjQ5MCBlbGYzMi1mcjMwLmM6NjUwCi0jOiBlbGYzMi1tMzJyLmM6MTE1NyBlbGYzMi12ODUwLmM6MTY3NAotbXNnaWQgImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZWxmLW0xMDIwMC5jOjQ1OSBlbGYtbTEwMzAwLmM6NjcxIGVsZjMyLWQxMHYuYzo0OTQgZWxmMzItZnIzMC5jOjY1NAotIzogZWxmMzItbTMyci5jOjExNjEgZWxmMzItdjg1MC5jOjE2NzgKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBlbGYtbTEwMjAwLmM6NDYzIGVsZi1tMTAzMDAuYzo2NzUgZWxmMzItZDEwdi5jOjQ5OCBlbGYzMi1tMzJyLmM6MTE2NQotbXNnaWQgImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZWxmLW0xMDIwMC5jOjQ2NyBlbGYtbTEwMzAwLmM6Njc5IGVsZjMyLWQxMHYuYzo1MDIgZWxmMzItZnIzMC5jOjY2MgotIzogZWxmMzItbTMyci5jOjExNjkgZWxmMzItdjg1MC5jOjE2OTgKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzozMjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGludmFsaWQgc3RyaW5nIG9mZnNldCAldSA+PSAlbHUgZm9yIHNlY3Rpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzo1NDMKLW1zZ2lkICIiCi0iXG4iCi0iUHJvZ3JhbSBIZWFkZXI6XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NTkxCi1tc2dpZCAiIgotIlxuIgotIkR5bmFtaWMgU2VjdGlvbjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzo2OTMKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBkZWZpbml0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzo3MTYKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBSZWZlcmVuY2VzOlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjcyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIHJlcXVpcmVkIGZyb20gJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MTg4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iY3JlYXRpbmcgc2VjdGlvbiBzeW1ib2wsIG5hbWUgPSAlcywgdmFsdWUgPSAweCUuOGx4LCBpbmRleCA9ICVkLCBzZWN0aW9uID0gIgotIjB4JS44bHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzoyNDkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBOb3QgZW5vdWdoIHJvb20gZm9yIHByb2dyYW0gaGVhZGVycyAoYWxsb2NhdGVkICV1LCBuZWVkICV1KSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzoyNTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBOb3QgZW5vdWdoIHJvb20gZm9yIHByb2dyYW0gaGVhZGVycywgdHJ5IGxpbmtpbmcgd2l0aCAtTiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzoyNzE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVycm9yOiBGaXJzdCBzZWN0aW9uIGluIHNlZ21lbnQgKCVzKSBzdGFydHMgYXQgMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzoyNzIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICB3aGVyZWFzIHNlZ21lbnQgc3RhcnRzIGF0IDB4JXgiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6Mjk5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogYWxsb2NhdGVkIHNlY3Rpb24gYCVzJyBub3QgaW4gc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzozMzY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzeW1ib2wgYCVzJyByZXF1aXJlZCBidXQgbm90IHByZXNlbnQiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MzM3NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgMHglLjhseCwgbmFtZSA9ICVzLCBzeW0gbnVtID0gJWQsIGZsYWdzID0gIgotIjB4JS44bHglc1xuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjM1MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IEVtcHR5IGxvYWRhYmxlIHNlZ21lbnQgZGV0ZWN0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzo0NzkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgJXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItZnIzMC5jOjY1OCBlbGYzMi12ODUwLmM6MTY4MgotbXNnaWQgImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1ocHBhLmM6MTIxNQotbXNnaWQgIlVuc3VwcG9ydGVkIGNhbGwgdG8gaHBwYV9lbGZfcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItaTM4Ni5jOjEyOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiB3YXJuaW5nOiB1bnJlc29sdmFibGUgcmVsb2NhdGlvbiBhZ2FpbnN0IHN5bWJvbCBgJXMnIGZyb20gJXMgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6ODA4Ci1tc2dpZCAiU0RBIHJlbG9jYXRpb24gd2hlbiBfU0RBX0JBU0VfIG5vdCBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzo4OTIgZWxmMzItcHBjLmM6MzA3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbTMyci5jOjExMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhbiAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBzZWN0aW9uICglcykiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbTMyci5jOjE5MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEluc3RydWN0aW9uIHNldCBtaXNtYXRjaCB3aXRoIHByZXZpb3VzIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbTMyci5jOjE5MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJpdmF0ZSBmbGFncyA9ICVseCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6MTkyOAotbXNnaWQgIjogbTMyciBpbnN0cnVjdGlvbnMiCi1tc2dzdHIgIiIKLQotIy4gSWdub3JlIGluaXQgZmxhZyAtIGl0IG1heSBub3QgYmUgc2V0LCBkZXNwaXRlIHRoZSBmbGFncyBmaWVsZCBjb250YWluaW5nIHZhbGlkIGRhdGEuCi0jOiBlbGYzMi1tNjhrLmM6NDMyIGVsZjMyLW1pcHMuYzoyMzAwCi0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAlbHg6IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW02OGsuYzo0MzUKLW1zZ2lkICIgW2NwdTMyXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tY29yZS5jOjMzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY29tcGlsZWQgZm9yIGEgJXMgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzICVzIGVuZGlhbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tY29yZS5jOjM3NCBlbGYzMi1tY29yZS5jOjUwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogUmVsb2NhdGlvbiAlcyAoJWQpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1jb3JlLmM6NDYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbmtub3duIHJlbG9jYXRpb24gdHlwZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoxMjk2Ci1tc2dpZCAiMzJiaXRzIGdwIHJlbGF0aXZlIHJlbG9jYXRpb24gb2NjdXJzIGZvciBhbiBleHRlcm5hbCBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjE0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGlua2luZyBtaXBzMTYgb2JqZWN0cyBpbnRvICVzIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMTQxIGVsZjMyLXBwYy5jOjE0MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvbXBpbGVkIGZvciBhIGJpZyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjE0MyBlbGYzMi1wcGMuYzoxNDEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSBsaXR0bGUgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGJpZyBlbmRpYW4iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIxOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGxpbmtpbmcgUElDIGZpbGVzIHdpdGggbm9uLVBJQyBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjIwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbGlua2luZyBhYmljYWxscyBmaWxlcyB3aXRoIG5vbi1hYmljYWxscyBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjIzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogSVNBIG1pc21hdGNoICgtbWlwcyVkKSB3aXRoIHByZXZpb3VzIG1vZHVsZXMgKC1taXBzJWQpIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBJU0EgbWlzbWF0Y2ggKCVkKSB3aXRoIHByZXZpb3VzIG1vZHVsZXMgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjI1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQUJJIG1pc21hdGNoOiBsaW5raW5nICVzIG1vZHVsZSB3aXRoIHByZXZpb3VzICVzIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIyNzIgZWxmMzItcHBjLmM6MTQ3OSBlbGY2NC1zcGFyYy5jOjIxOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMDMKLW1zZ2lkICIgW2FiaT1PMzJdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzA1Ci1tc2dpZCAiIFthYmk9TzY0XSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMwNwotbXNnaWQgIiBbYWJpPUVBQkkzMl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMDkKLW1zZ2lkICIgW2FiaT1FQUJJNjRdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzExCi1tc2dpZCAiIFthYmkgdW5rbm93bl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMTMKLW1zZ2lkICIgW25vIGFiaSBzZXRdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzE2Ci1tc2dpZCAiIFttaXBzMV0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMTgKLW1zZ2lkICIgW21pcHMyXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMyMAotbXNnaWQgIiBbbWlwczNdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzIyCi1tc2dpZCAiIFttaXBzNF0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMjQKLW1zZ2lkICIgW3Vua25vd24gSVNBXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMyNwotbXNnaWQgIiBbMzJiaXRtb2RlXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMyOQotbXNnaWQgIiBbbm90IDMyYml0bW9kZV0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjM4OTcKLW1zZ2lkICJzdGF0aWMgcHJvY2VkdXJlIChubyBuYW1lKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6NDQ3MCBlbGY2NC1hbHBoYS5jOjQ0MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGlsbGVnYWwgc2VjdGlvbiBuYW1lIGAlcyciCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjQ3NzcKLW1zZ2lkICJtb3JlIGdvdCBlbnRyaWVzIGFyZSBuZWVkZWQgZm9yIGhpcGFnZSByZWxvY2F0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6NTA4MQotbXNnaWQgIl9ncF9kaXNwIHVzZWQgd2hlbiBHUCBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6NTQ5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXMrMHglbHg6IGp1bXAgdG8gbWlwczE2IHJvdXRpbmUgd2hpY2ggaXMgbm90IGphbCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6NjI1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ0FMTDE2IHJlbG9jIGF0IDB4JWx4IG5vdCBhZ2FpbnN0IGdsb2JhbCBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MTQ0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZSBhbmQgbGlua2VkIHdpdGggbW9kdWxlcyBjb21waWxlZCBub3JtYWxseSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1wcGMuYzoxNDUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogY29tcGlsZWQgbm9ybWFsbHkgYW5kIGxpbmtlZCB3aXRoIG1vZHVsZXMgY29tcGlsZWQgd2l0aCAtbXJlbG9jYXRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXBwYy5jOjE1ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFVua25vd24gc3BlY2lhbCBsaW5rZXIgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1wcGMuYzoyMzExIGVsZjMyLXBwYy5jOjIzNDUgZWxmMzItcHBjLmM6MjM4MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVsb2NhdGlvbiAlcyBjYW5ub3QgYmUgdXNlZCB3aGVuIG1ha2luZyBhIHNoYXJlZCBvYmplY3QiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MzIxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWQgZm9yIHN5bWJvbCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1wcGMuYzozNTgzIGVsZjMyLXBwYy5jOjM2MDUgZWxmMzItcHBjLmM6MzY1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIG91dHB1dCBzZWN0aW9uICglcykiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MzcyMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogUmVsb2NhdGlvbiAlcyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3Igc3ltYm9sICVzLiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjY3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6Njg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogd2FybmluZzogUl9TSF9VU0VTIHBvaW50cyB0byB1bnJlY29nbml6ZWQgaW5zbiAweCV4IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6NzAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogd2FybmluZzogYmFkIFJfU0hfVVNFUyBsb2FkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjcxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6NzU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogd2FybmluZzogc3ltYm9sIGluIHVuZXhwZWN0ZWQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjg3NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIENPVU5UIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6ODg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogd2FybmluZzogYmFkIGNvdW50IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNoLmM6MTI3MSBlbGYzMi1zaC5jOjE2MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxNTAyIGVsZjY0LXNwYXJjLmM6MTU3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcHJvYmFibHkgY29tcGlsZWQgd2l0aG91dCAtZlBJQz8iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxOTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSB2OHBsdXMgc3lzdGVtIGFuZCB0YXJnZXQgaXMgdjgiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxOTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSB2OHBsdXNhIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIHY4cGx1cyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zcGFyYy5jOjE5NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvbXBpbGVkIGZvciBhIDY0IGJpdCBzeXN0ZW0gYW5kIHRhcmdldCBpcyAzMiBiaXQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxOTUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsaW5raW5nIGxpdHRsZSBlbmRpYW4gZmlsZXMgd2l0aCBiaWcgZW5kaWFuIGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzo2ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVmFyaWFibGUgYCVzJyBjYW5ub3Qgb2NjdXB5IGluIG11bHRpcGxlIHNtYWxsIGRhdGEgcmVnaW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6NjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJWYXJpYWJsZSBgJXMnIGNhbiBvbmx5IGJlIGluIG9uZSBvZiB0aGUgc21hbGwsIHplcm8sIGFuZCB0aW55IGRhdGEgcmVnaW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6Njg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHNtYWxsIGFuZCB6ZXJvIGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6Njg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHNtYWxsIGFuZCB0aW55IGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6NjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHplcm8gYW5kIHRpbnkgZGF0YSByZWdpb25zIHNpbXVsdGFuZW91c2x5IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxMDcxCi1tc2dpZCAiRkFJTEVEIHRvIGZpbmQgcHJldmlvdXMgSEkxNiByZWxvY1xuIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxNjg2Ci1tc2dpZCAiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19ncCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6MTY5MAotbXNnaWQgImNvdWxkIG5vdCBsb2NhdGUgc3BlY2lhbCBsaW5rZXIgc3ltYm9sIF9fZXAiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE2OTQKLW1zZ2lkICJjb3VsZCBub3QgbG9jYXRlIHNwZWNpYWwgbGlua2VyIHN5bWJvbCBfX2N0YnAiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE4ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEFyY2hpdGVjdHVyZSBtaXNtYXRjaCB3aXRoIHByZXZpb3VzIG1vZHVsZXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE4OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicHJpdmF0ZSBmbGFncyA9ICVseDogIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxOTA0Ci1tc2dpZCAidjg1MCBhcmNoaXRlY3R1cmUiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE5MDUKLW1zZ2lkICJ2ODUwZSBhcmNoaXRlY3R1cmUiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE5MDYKLW1zZ2lkICJ2ODUwZWEgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LWFscGhhLmM6OTQ5Ci1tc2dpZCAiR1BESVNQIHJlbG9jYXRpb24gZGlkIG5vdCBmaW5kIGxkYWggYW5kIGxkYSBpbnN0cnVjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogZWxmNjQtYWxwaGEuYzoyOTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAuZ290IHN1YnNlZ21lbnQgZXhjZWVkcyA2NEsgKHNpemUgJWQpIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LXNwYXJjLmM6ODEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjaGVja19yZWxvY3M6IHVuaGFuZGxlZCByZWxvYyB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LXNwYXJjLmM6MjE4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbGlua2luZyBVbHRyYVNQQVJDIHNwZWNpZmljIHdpdGggSEFMIHNwZWNpZmljIGNvZGUiCi1tc2dzdHIgIiIKLQotIzogZWxmY29kZS5oOjEwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHZlcnNpb24gY291bnQgKCVsZCkgZG9lcyBub3QgbWF0Y2ggc3ltYm9sIGNvdW50ICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGVsZmxpbmsuYzozMTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFNlY3Rpb24gJXMgaXMgYWxyZWFkeSB0byBsYXJnZSB0byBwdXQgaG9sZSBvZiAlbGQgYnl0ZXMgaW4iCi1tc2dzdHIgIiIKLQotIzogaTM4NmxpbnV4LmM6NDQ5IG02OGtsaW51eC5jOjQ1MyBzcGFyY2xpbnV4LmM6NDUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBpMzg2bGludXguYzo0NTcgbTY4a2xpbnV4LmM6NDYxIHNwYXJjbGludXguYzo0NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzLnNvLiVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGkzODZsaW51eC5jOjY0NSBpMzg2bGludXguYzo2OTUgbTY4a2xpbnV4LmM6NjUyIG02OGtsaW51eC5jOjcwMAotIzogc3BhcmNsaW51eC5jOjY0OCBzcGFyY2xpbnV4LmM6Njk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iCi1tc2dzdHIgIiIKLQotIzogaTM4NmxpbnV4LmM6NzE5IG02OGtsaW51eC5jOjcyNCBzcGFyY2xpbnV4LmM6NzIyCi1tc2dpZCAiV2FybmluZzogZml4dXAgY291bnQgbWlzbWF0Y2hcbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzdHJpbmcgdG9vIGxvbmcgKCVkIGNoYXJzLCBtYXggNjU1MzUpIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzoyOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVucmVjb2duaXplZCBzeW1ib2wgYCVzJyBmbGFncyAweCV4IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo3OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuaW1wbGVtZW50ZWQgQVRJIHJlY29yZCAgJXUgZm9yIHN5bWJvbCAldSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6ODE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmV4cGVjdGVkIEFUTiB0eXBlICVkIGluIGV4dGVybmFsIHBhcnQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjg0MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCB0eXBlIGFmdGVyIEFUTiIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6MjU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiB1bmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIEludGVsIEhleCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjM2OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogYmFkIGNoZWNrc3VtIGluIEludGVsIEhleCBmaWxlIChleHBlY3RlZCAldSwgZm91bmQgJXUpIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBleHRlbmRlZCBhZGRyZXNzIHJlY29yZCBsZW5ndGggaW4gSW50ZWwgSGV4IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjQzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogYmFkIGV4dGVuZGVkIHN0YXJ0IGFkZHJlc3MgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBleHRlbmRlZCBsaW5lYXIgYWRkcmVzcyByZWNvcmQgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBleHRlbmRlZCBsaW5lYXIgc3RhcnQgYWRkcmVzcyBsZW5ndGggaW4gSW50ZWwgSGV4IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjQ4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogdW5yZWNvZ25pemVkIGloZXggdHlwZSAldSBpbiBJbnRlbCBIZXggZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo2MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGludGVybmFsIGVycm9yIGluIGloZXhfcmVhZF9zZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo2NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJhZCBzZWN0aW9uIGxlbmd0aCBpbiBpaGV4X3JlYWRfc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6ODU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBhZGRyZXNzIDB4JXMgb3V0IG9mIHJhbmdlIGZvciBJbnRleCBIZXggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsaWJiZmQuYzo0ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm90IG1hcHBpbmc6IGRhdGE9JWx4IG1hcHBlZD0lZFxuIgotbXNnc3RyICIiCi0KLSM6IGxpYmJmZC5jOjQ4NAotbXNnaWQgIm5vdCBtYXBwaW5nOiBlbnYgdmFyIG5vdCBzZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsaW5rZXIuYzoyNjcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkF0dGVtcHQgdG8gZG8gcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCAlcyBpbnB1dCBhbmQgJXMgb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IG9hc3lzLmM6MTAxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIG9hc3lzIgotbXNnc3RyICIiCi0KLSM6IG9zZi1jb3JlLmM6MTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuaGFuZGxlZCBPU0YvMSBjb3JlIGZpbGUgc2VjdGlvbiB0eXBlICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQxOAotbXNnaWQgIiIKLSJcbiIKLSJwcGNib290IGhlYWRlcjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVudHJ5IG9mZnNldCAgICAgICAgPSAweCUuOGx4ICglbGQpXG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJMZW5ndGggICAgICAgICAgICAgID0gMHglLjhseCAoJWxkKVxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRmxhZyBmaWVsZCAgICAgICAgICA9IDB4JS4yeFxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUGFydGl0aW9uIG5hbWUgICAgICA9IFwiJXNcIlxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlBhcnRpdGlvblslZF0gc3RhcnQgID0geyAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMnggfVxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUGFydGl0aW9uWyVkXSBlbmQgICAgPSB7IDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCB9XG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJQYXJ0aXRpb25bJWRdIHNlY3RvciA9IDB4JS44bHggKCVsZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlBhcnRpdGlvblslZF0gbGVuZ3RoID0gMHglLjhseCAoJWxkKVxuIgotbXNnc3RyICIiCi0KLSM6IHNvbS5jOjUyNzYKLW1zZ2lkICJzb21fc2l6ZW9mX2hlYWRlcnMgdW5pbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBzcmVjLmM6MjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiBVbmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIFMtcmVjb3JkIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1zLmM6OTIyCi1tc2dpZCAiVW5zdXBwb3J0ZWQgLnN0YWIgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtZ3NkLmM6Njk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gZ3NkL2Vnc2Qgc3VidHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtaGRyLmM6NDA3Ci1tc2dpZCAiT2JqZWN0IG1vZHVsZSBOT1QgZXJyb3ItZnJlZSAhXG4iCi1tc2dzdHIgIiIKLQotIzogdm1zLW1pc2MuYzo1MzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3RhY2sgb3ZlcmZsb3cgKCVkKSBpbiBfYmZkX3Ztc19wdXNoIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6NTU4Ci1tc2dpZCAiU3RhY2sgdW5kZXJmbG93IGluIF9iZmRfdm1zX3BvcCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtbWlzYy5jOjkyOQotbXNnaWQgIl9iZmRfdm1zX291dHB1dF9jb3VudGVkIGNhbGxlZCB3aXRoIHplcm8gYnl0ZXMiCi1tc2dzdHIgIiIKLQotIzogdm1zLW1pc2MuYzo5MzQKLW1zZ2lkICJfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBjYWxsZWQgd2l0aCB0b28gbWFueSBieXRlcyIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtbWlzYy5jOjEwNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sICVzIHJlcGxhY2VkIGJ5ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogdm1zLW1pc2MuYzoxMTMzCi0jLCBjLWZvcm1hdAotbXNnaWQgImZhaWxlZCB0byBlbnRlciAlcyIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NjkKLW1zZ2lkICJObyBNZW0gISIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MzA5Ci1tc2dpZCAiQmFkIHNlY3Rpb24gaW5kZXggaW4gRVRJUl9TX0NfU1RBX1BRIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzozMjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5zdXBwb3J0ZWQgU1RBIGNtZCAlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MzI5IHZtcy10aXIuYzoxMjg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc2VydmVkIFNUQSBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjQzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJFVElSX1NfQ19TVE9fR0JMOiBubyBzeW1ib2wgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo0NTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRVRJUl9TX0NfU1RPX0NBOiBubyBzeW1ib2wgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo0NzAKLW1zZ2lkICJFVElSX1NfQ19TVE9fUkIvQUI6IE5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjUyOAotbXNnaWQgIkVUSVJfU19DX1NUT19MUF9QU0I6IE5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjUzNAotbXNnaWQgIkVUSVJfU19DX1NUT19ISU5UX0dCTDogbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo1NDAKLW1zZ2lkICJFVElSX1NfQ19TVE9fSElOVF9QUzogbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo1NDQgdm1zLXRpci5jOjE0NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVzZXJ2ZWQgU1RPIGNtZCAlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NjU3Ci1tc2dpZCAiRVRJUl9TX0NfT1BSX0lOU1Y6IE5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjY3NQotbXNnaWQgIkVUSVJfU19DX09QUl9VU0g6IE5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjY4MQotbXNnaWQgIkVUSVJfU19DX09QUl9ST1Q6IE5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjcwMAotbXNnaWQgIkVUSVJfU19DX09QUl9SRURFRjogTm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NzA2Ci1tc2dpZCAiRVRJUl9TX0NfT1BSX0RGTElUOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo3MTAgdm1zLXRpci5jOjE2NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVzZXJ2ZWQgT1BSIGNtZCAlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6Nzc5IHZtcy10aXIuYzoxNzI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc2VydmVkIENUTCBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjgwOAotbXNnaWQgIkVUSVJfU19DX1NUQ19MUDogbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6ODI2Ci1tc2dpZCAiRVRJUl9TX0NfU1RDX0dCTDogbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6ODM0Ci1tc2dpZCAiRVRJUl9TX0NfU1RDX0dDQTogbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6ODQzCi1tc2dpZCAiRVRJUl9TX0NfU1RDX1BTOiBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSMuCi0jLiAqIHN0YWNrIGJ5dGUgZnJvbSBpbWFnZQotIy4gKiBhcmc6IC0KLSMuICoKLSMuCi0jOiB2bXMtdGlyLmM6MTE4OQotbXNnaWQgIlN0YWNrLWZyb20taW1hZ2Ugbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxMjA5Ci1tc2dpZCAiU3RhY2stZW50cnktbWFzayBub3QgZnVsbHkgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIy4KLSMuICogY29tcGFyZSBwcm9jZWR1cmUgYXJndW1lbnQKLSMuICogYXJnOiBjcwlzeW1ib2wgbmFtZQotIy4gKglieQlhcmd1bWVudCBpbmRleAotIy4gKglkYQlhcmd1bWVudCBkZXNjcmlwdG9yCi0jLiAqCi0jLiAqIGNvbXBhcmUgYXJndW1lbnQgZGVzY3JpcHRvciB3aXRoIHN5bWJvbCBhcmd1bWVudCAoQVJHJFZfUEFTU01FQ0gpCi0jLiAqIGFuZCBzdGFjayBUUlVFIChhcmdzIG1hdGNoKSBvciBGQUxTRSAoYXJncyBkb250IG1hdGNoKSB2YWx1ZQotIy4KLSM6IHZtcy10aXIuYzoxMjI1Ci1tc2dpZCAiUEFTU01FQ0ggbm90IGZ1bGx5IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxMjQ1Ci1tc2dpZCAiU3RhY2stbG9jYWwtc3ltYm9sIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTI2MAotbXNnaWQgIlN0YWNrLWxpdGVyYWwgbm90IGZ1bGx5IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxMjgyCi1tc2dpZCAiU3RhY2stbG9jYWwtc3ltYm9sLWVudHJ5LXBvaW50LW1hc2sgbm90IGZ1bGx5IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxNDU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuaW1wbGVtZW50ZWQgU1RPIGNtZCAlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTU5OAotbXNnaWQgIlRJUl9TX0NfT1BSX0FTSCBpbmNvbXBsZXRlIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxNjEyCi1tc2dpZCAiVElSX1NfQ19PUFJfVVNIIGluY29tcGxldGUiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjE2MjYKLW1zZ2lkICJUSVJfU19DX09QUl9ST1QgaW5jb21wbGV0ZSIKLW1zZ3N0ciAiIgotCi0jLgotIy4gKiByZWRlZmluZSBzeW1ib2wgdG8gY3VycmVudCBsb2NhdGlvbgotIy4KLSM6IHZtcy10aXIuYzoxNjQ3Ci1tc2dpZCAiVElSX1NfQ19PUFJfUkVERUYgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jLgotIy4gKiBkZWZpbmUgYSBsaXRlcmFsCi0jLgotIzogdm1zLXRpci5jOjE2NTQKLW1zZ2lkICJUSVJfU19DX09QUl9ERkxJVCBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxNzA5Ci1tc2dpZCAiVElSX1NfQ19DVExfREZMT0Mgbm90IGZ1bGx5IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxNzE3Ci1tc2dpZCAiVElSX1NfQ19DVExfU1RMT0Mgbm90IGZ1bGx5IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxNzI1Ci1tc2dpZCAiVElSX1NfQ19DVExfU1RLREwgbm90IGZ1bGx5IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxNzgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIk9iaiBjb2RlICVkIG5vdCBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MjEyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJTRUNfUkVMT0Mgd2l0aCBubyByZWxvY3MgaW4gc2VjdGlvbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MjQwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmhhbmRsZWQgcmVsb2NhdGlvbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxNjYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBgJXMnIGhhcyBsaW5lIG51bWJlcnMgYnV0IG5vIGVuY2xvc2luZyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjE3MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNsYXNzICVkIHN5bWJvbCBgJXMnIGhhcyBubyBhdXggZW50cmllcyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxNzM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzeW1ib2wgYCVzJyBoYXMgdW5yZWNvZ25pemVkIGNzZWN0IHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MTc0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmFkIFhUWV9FUiBzeW1ib2wgYCVzJzogY2xhc3MgJWQgc2NudW0gJWQgc2NubGVuICVkIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjE3ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFhNQ19UQzAgc3ltYm9sIGAlcycgaXMgY2xhc3MgJWQgc2NubGVuICVkIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjE5MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHN5bWJvbCBgJXMnIGhhcyB1bnJlY29nbml6ZWQgc21jbGFzICVkIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjE5MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNzZWN0IGAlcycgbm90IGluIGVuY2xvc2luZyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjIwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG1pc3BsYWNlZCBYVFlfTEQgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoyMzQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiByZWxvYyAlczolZCBub3QgaW4gY3NlY3QiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MjQ4MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogWENPRkYgc2hhcmVkIG9iamVjdCB3aGVuIG5vdCBwcm9kdWNpbmcgWENPRkYgb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjI1MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGR5bmFtaWMgb2JqZWN0IHdpdGggbm8gLmxvYWRlciBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjMxNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIHN1Y2ggc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjM3MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2FybmluZzogYXR0ZW1wdCB0byBleHBvcnQgdW5kZWZpbmVkIHN5bWJvbCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjQ3MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVE9DIG92ZXJmbG93OiAweCVseCA+IDB4MTAwMDA7IHRyeSAtbW1pbmltYWwtdG9jIHdoZW4gY29tcGlsaW5nIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjU1MjkgeGNvZmZsaW5rLmM6NTg4NSB4Y29mZmxpbmsuYzo1OTIyIHhjb2ZmbGluay5jOjYyMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGxvYWRlciByZWxvYyBpbiB1bnJlY29nbml6ZWQgc2VjdGlvbiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjU1NTEgeGNvZmZsaW5rLmM6NjI1MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYCVzJyBpbiBsb2FkZXIgcmVsb2MgYnV0IG5vdCBsb2FkZXIgc3ltIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjU1NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGxvYWRlciByZWxvYyBpbiByZWFkLW9ubHkgc2VjdGlvbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo2NDQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgMHglMDJ4IgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjY0OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFRPQyByZWxvYyBhdCAweCV4IHRvIHN5bWJvbCBgJXMnIHdpdGggbm8gVE9DIGVudHJ5IgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9iZmQvcHBjYm9vdC5jIGIvYmZkL3BwY2Jvb3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkYjgyNi4uMDAwMDAwMAotLS0gYS9iZmQvcHBjYm9vdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgUFBDYnVnIGJvb3QgcmVjb3Jkcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNaWNoYWVsIE1laXNzbmVyLCBDeWdudXMgU3VwcG9ydCwgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBpcyBhIEJGRCBiYWNrZW5kIHdoaWNoIG1heSBiZSB1c2VkIHRvIHdyaXRlIFBvd2VyUENCdWcgYm9vdCBvYmplY3RzLgotICAgSXQgbWF5IG9ubHkgYmUgdXNlZCBmb3Igb3V0cHV0LCBub3QgaW5wdXQuICBUaGUgaW50ZW50aW9uIGlzIHRoYXQgdGhpcyBtYXkKLSAgIGJlIHVzZWQgYXMgYW4gb3V0cHV0IGZvcm1hdCBmb3Igb2JqY29weSBpbiBvcmRlciB0byBnZW5lcmF0ZSByYXcgYmluYXJ5Ci0gICBkYXRhLgotCi0gICBUaGlzIGlzIHZlcnkgc2ltcGxlLiAgVGhlIG9ubHkgY29tcGxpY2F0aW9uIGlzIHRoYXQgdGhlIHJlYWwgZGF0YQotICAgd2lsbCBzdGFydCBhdCBzb21lIGFkZHJlc3MgWCwgYW5kIGluIHNvbWUgY2FzZXMgd2Ugd2lsbCBub3Qgd2FudCB0bwotICAgaW5jbHVkZSBYIHplcm9lcyBqdXN0IHRvIGdldCB0byB0aGF0IHBvaW50LiAgU2luY2UgdGhlIHN0YXJ0Ci0gICBhZGRyZXNzIGlzIG5vdCBtZWFuaW5nZnVsIGZvciB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCwgd2UgdXNlIGl0Ci0gICBpbnN0ZWFkIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgemVyb2VzIHRvIHNraXAgYXQgdGhlIHN0YXJ0IG9mCi0gICB0aGUgZmlsZS4gIG9iamNvcHkgY29vcGVyYXRlcyBieSBzcGVjaWFsbHkgc2V0dGluZyB0aGUgc3RhcnQKLSAgIGFkZHJlc3MgdG8gemVybyBieSBkZWZhdWx0LiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyogUFBDYnVnIGxvY2F0aW9uIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QgcHBjYm9vdF9sb2NhdGlvbiB7Ci0gIGJmZF9ieXRlCWluZDsKLSAgYmZkX2J5dGUJaGVhZDsKLSAgYmZkX2J5dGUJc2VjdG9yOwotICBiZmRfYnl0ZQljeWxpbmRlcjsKLX0gcHBjYm9vdF9sb2NhdGlvbl90OwotCi0vKiBQUENidWcgcGFydGl0aW9uIHRhYmxlIGxheW91dCAqLwotdHlwZWRlZiBzdHJ1Y3QgcHBjYm9vdF9wYXJ0aXRpb24gewotICBwcGNib290X2xvY2F0aW9uX3QJcGFydGl0aW9uX2JlZ2luOwkvKiBwYXJ0aXRpb24gYmVnaW4gKi8KLSAgcHBjYm9vdF9sb2NhdGlvbl90CXBhcnRpdGlvbl9lbmQ7CQkvKiBwYXJ0aXRpb24gZW5kICovCi0gIGJmZF9ieXRlCQlzZWN0b3JfYmVnaW5bNF07CS8qIDMyLWJpdCBzdGFydCBSQkEgKHplcm8tYmFzZWQpLCBsaXR0bGUgZW5kaWFuICovCi0gIGJmZF9ieXRlCQlzZWN0b3JfbGVuZ3RoWzRdOwkvKiAzMi1iaXQgUkJBIGNvdW50IChvbmUtYmFzZWQpLCBsaXR0bGUgZW5kaWFuICovCi19IHBwY2Jvb3RfcGFydGl0aW9uX3Q7Ci0KLS8qIFBQQ2J1ZyBib290IGxheW91dC4gICovCi10eXBlZGVmIHN0cnVjdCBwcGNib290X2hkciB7Ci0gIGJmZF9ieXRlCQlwY19jb21wYXRpYmlsaXR5WzQ0Nl07CS8qIHg4NiBpbnN0cnVjdGlvbiBmaWVsZCAqLwotICBwcGNib290X3BhcnRpdGlvbl90CXBhcnRpdGlvbls0XTsJCS8qIHBhcnRpdGlvbiBpbmZvcm1hdGlvbiAqLwotICBiZmRfYnl0ZQkJc2lnbmF0dXJlWzJdOwkJLyogMHg1NSBhbmQgMHhhYSAqLwotICBiZmRfYnl0ZQkJZW50cnlfb2Zmc2V0WzRdOwkvKiBlbnRyeSBwb2ludCBvZmZzZXQsIGxpdHRsZSBlbmRpYW4gKi8KLSAgYmZkX2J5dGUJCWxlbmd0aFs0XTsJCS8qIGxvYWQgaW1hZ2UgbGVuZ3RoLCBsaXR0bGUgZW5kaWFuICovCi0gIGJmZF9ieXRlCQlmbGFnczsJCQkvKiBmbGFnIGZpZWxkICovCi0gIGJmZF9ieXRlCQlvc19pZDsJCQkvKiBPU19JRCAqLwotICBjaGFyCQkJcGFydGl0aW9uX25hbWVbMzJdOwkvKiBwYXJ0aXRpb24gbmFtZSAqLwotICBiZmRfYnl0ZQkJcmVzZXJ2ZWQxWzQ3MF07CQkvKiByZXNlcnZlZCAqLwotfSBwcGNib290X2hkcl90OwotCi0vKiBTaWduYXR1cmUgYnl0ZXMgZm9yIGxhc3QgMiBieXRlcyBvZiB0aGUgNTEyIGJ5dGUgcmVjb3JkICovCi0jZGVmaW5lIFNJR05BVFVSRTAgMHg1NQotI2RlZmluZSBTSUdOQVRVUkUxIDB4YWEKLQotLyogUG93ZXJQQyBib290IHR5cGUgKi8KLSNkZWZpbmUgUFBDX0lORCAweDQxCi0KLS8qIEluZm9ybWF0aW9uIG5lZWRlZCBmb3IgcHBjYm9vdCBoZWFkZXIgKi8KLXR5cGVkZWYgc3RydWN0IHBwY2Jvb3RfZGF0YSB7Ci0gIHBwY2Jvb3RfaGRyX3QJaGVhZGVyOwkJCQkvKiByYXcgaGVhZGVyICovCi0gIGFzZWN0aW9uICpzZWM7CQkJCS8qIHNpbmdsZSBzZWN0aW9uICovCi19IHBwY2Jvb3RfZGF0YV90OwotCi0vKiBBbnkgYmZkIHdlIGNyZWF0ZSBieSByZWFkaW5nIGEgcHBjYm9vdCBmaWxlIGhhcyB0aHJlZSBzeW1ib2xzOgotICAgYSBzdGFydCBzeW1ib2wsIGFuIGVuZCBzeW1ib2wsIGFuZCBhbiBhYnNvbHV0ZSBsZW5ndGggc3ltYm9sLiAgKi8KLSNkZWZpbmUgUFBDQk9PVF9TWU1TIDMKLQotc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnBwY2Jvb3Rfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHBwY2Jvb3Rfc2V0X2FyY2hfbWFjaAotICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNib290X2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgbG9uZyBwcGNib290X2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjaGFyICptYW5nbGVfbmFtZSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7Ci1zdGF0aWMgbG9uZyBwcGNib290X2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBhc3ltYm9sICpwcGNib290X21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBwcGNib290X2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNib290X3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgaW50IHBwY2Jvb3Rfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0jZGVmaW5lIHBwY2Jvb3Rfc2V0X3RkYXRhKGFiZmQsIHB0cikgKChhYmZkKS0+dGRhdGEuYW55ID0gKFBUUikgKHB0cikpCi0jZGVmaW5lIHBwY2Jvb3RfZ2V0X3RkYXRhKGFiZmQpICgocHBjYm9vdF9kYXRhX3QgKikgKChhYmZkKS0+dGRhdGEuYW55KSkKLQwKLS8qIENyZWF0ZSBhIHBwY2Jvb3Qgb2JqZWN0LiAgSW52b2tlZCB2aWEgYmZkX3NldF9mb3JtYXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjYm9vdF9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIXBwY2Jvb3RfZ2V0X3RkYXRhIChhYmZkKSkKLSAgICBwcGNib290X3NldF90ZGF0YSAoYWJmZCwgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChwcGNib290X2RhdGFfdCkpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUgdG8gUG93ZXJQQyAqLwotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3Rfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQotICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOwotCi0gIGVsc2UgaWYgKGFyY2ggIT0gYmZkX2FyY2hfcG93ZXJwYykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi0MCi0vKiBBbnkgZmlsZSBtYXkgYmUgY29uc2lkZXJlZCB0byBiZSBhIHBwY2Jvb3QgZmlsZSwgcHJvdmlkZWQgdGhlIHRhcmdldAotICAgd2FzIG5vdCBkZWZhdWx0ZWQuICBUaGF0IGlzLCBpdCBtdXN0IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGFzCi0gICBiZWluZyBwcGNib290LiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotcHBjYm9vdF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICBhc2VjdGlvbiAqc2VjOwotICBwcGNib290X2hkcl90IGhkcjsKLSAgc2l6ZV90IGk7Ci0gIHBwY2Jvb3RfZGF0YV90ICp0ZGF0YTsKLQotICBCRkRfQVNTRVJUIChzaXplb2YgKHBwY2Jvb3RfaGRyX3QpID09IDEwMjQpOwotCi0gIGlmIChhYmZkLT50YXJnZXRfZGVmYXVsdGVkKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIEZpbmQgdGhlIGZpbGUgc2l6ZS4gICovCi0gIGlmIChiZmRfc3RhdCAoYWJmZCwgJnN0YXRidWYpIDwgMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICgoc2l6ZV90KSBzdGF0YnVmLnN0X3NpemUgPCBzaXplb2YgKHBwY2Jvb3RfaGRyX3QpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmhkciwgc2l6ZW9mIChoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKGhkcikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHNvbWUgYmFzaWMgY2hlY2tzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoaGRyLnBjX2NvbXBhdGliaWxpdHkpOyBpKyspCi0gICAgaWYgKGhkci5wY19jb21wYXRpYmlsaXR5W2ldKQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotCi0gIGlmIChoZHIuc2lnbmF0dXJlWzBdICE9IFNJR05BVFVSRTAgfHwgaGRyLnNpZ25hdHVyZVsxXSAhPSBTSUdOQVRVUkUxKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChoZHIucGFydGl0aW9uWzBdLnBhcnRpdGlvbl9lbmQuaW5kICE9IFBQQ19JTkQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYWJmZC0+c3ltY291bnQgPSBQUENCT09UX1NZTVM7Ci0KLSAgLyogT25lIGRhdGEgc2VjdGlvbi4gICovCi0gIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZGF0YSIpOwotICBpZiAoc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHNlYy0+ZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBIHwgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWMtPnZtYSA9IDA7Ci0gIHNlYy0+X3Jhd19zaXplID0gc3RhdGJ1Zi5zdF9zaXplIC0gc2l6ZW9mIChwcGNib290X2hkcl90KTsKLSAgc2VjLT5maWxlcG9zID0gc2l6ZW9mIChwcGNib290X2hkcl90KTsKLQotICBwcGNib290X21rb2JqZWN0IChhYmZkKTsKLSAgdGRhdGEgPSBwcGNib290X2dldF90ZGF0YSAoYWJmZCk7Ci0gIHRkYXRhLT5zZWMgPSBzZWM7Ci0gIG1lbWNweSAoKFBUUikgJnRkYXRhLT5oZWFkZXIsIChQVFIpICZoZHIsIHNpemVvZiAocHBjYm9vdF9oZHJfdCkpOwotCi0gIHBwY2Jvb3Rfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfcG93ZXJwYywgMCk7Ci0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0jZGVmaW5lIHBwY2Jvb3RfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIHBwY2Jvb3RfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vawotCi0MCi0vKiBHZXQgY29udGVudHMgb2YgdGhlIG9ubHkgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNib290X2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQgKyBzaXplb2YocHBjYm9vdF9oZHJfdCksIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1wcGNib290X2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gKFBQQ0JPT1RfU1lNUyArIDEpICogc2l6ZW9mIChhc3ltYm9sICopOwotfQotCi0MCi0vKiBDcmVhdGUgYSBzeW1ib2wgbmFtZSBiYXNlZCBvbiB0aGUgYmZkJ3MgZmlsZW5hbWUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1tYW5nbGVfbmFtZSAoYWJmZCwgc3VmZml4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKnN1ZmZpeDsKLXsKLSAgaW50IHNpemU7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqcDsKLQotICBzaXplID0gKHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpCi0JICArIHN0cmxlbiAoc3VmZml4KQotCSAgKyBzaXplb2YgIl9wcGNib290X18iKTsKLQotICBidWYgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAoYnVmID09IE5VTEwpCi0gICAgcmV0dXJuICIiOwotCi0gIHNwcmludGYgKGJ1ZiwgIl9wcGNib290XyVzXyVzIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN1ZmZpeCk7Ci0KLSAgLyogQ2hhbmdlIGFueSBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgdG8gdW5kZXJzY29yZXMuICAqLwotICBmb3IgKHAgPSBidWY7ICpwOyBwKyspCi0gICAgaWYgKCEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpwKSkKLSAgICAgICpwID0gJ18nOwotCi0gIHJldHVybiBidWY7Ci19Ci0KLQwKLS8qIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXBwY2Jvb3RfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSBwcGNib290X2dldF90ZGF0YSAoYWJmZCktPnNlYzsKLSAgYXN5bWJvbCAqc3ltczsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgc3ltcyA9IChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgUFBDQk9PVF9TWU1TICogc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChzeW1zID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN0YXJ0IHN5bWJvbC4gICovCi0gIHN5bXNbMF0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMF0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAic3RhcnQiKTsKLSAgc3ltc1swXS52YWx1ZSA9IDA7Ci0gIHN5bXNbMF0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzBdLnNlY3Rpb24gPSBzZWM7Ci0gIHN5bXNbMF0udWRhdGEucCA9IE5VTEw7Ci0KLSAgLyogRW5kIHN5bWJvbC4gICovCi0gIHN5bXNbMV0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMV0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAiZW5kIik7Ci0gIHN5bXNbMV0udmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLSAgc3ltc1sxXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMV0uc2VjdGlvbiA9IHNlYzsKLSAgc3ltc1sxXS51ZGF0YS5wID0gTlVMTDsKLQotICAvKiBTaXplIHN5bWJvbC4gICovCi0gIHN5bXNbMl0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMl0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAic2l6ZSIpOwotICBzeW1zWzJdLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7Ci0gIHN5bXNbMl0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzJdLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICBzeW1zWzJdLnVkYXRhLnAgPSBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBQUENCT09UX1NZTVM7IGkrKykKLSAgICAqYWxvY2F0aW9uKysgPSBzeW1zKys7Ci0gICphbG9jYXRpb24gPSBOVUxMOwotCi0gIHJldHVybiBQUENCT09UX1NZTVM7Ci19Ci0KLQwKLS8qIE1ha2UgYW4gZW1wdHkgc3ltYm9sLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotcHBjYm9vdF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLX0KLQotDAotI2RlZmluZSBwcGNib290X3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLQotLyogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY2Jvb3RfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotI2RlZmluZSBwcGNib290X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgcHBjYm9vdF9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgcHBjYm9vdF9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBwcGNib290X2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgcHBjYm9vdF9yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIHBwY2Jvb3RfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgcHBjYm9vdF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF8wbCkKLSNkZWZpbmUgcHBjYm9vdF9jYW5vbmljYWxpemVfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKLSNkZWZpbmUgcHBjYm9vdF9iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQwKLS8qIFdyaXRlIHNlY3Rpb24gY29udGVudHMgb2YgYSBwcGNib290IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjYm9vdF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotewotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGJmZF92bWEgbG93OwotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIFRoZSBsb3dlc3Qgc2VjdGlvbiBWTUEgc2V0cyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdGFydAotICAgICAgICAgb2YgdGhlIGZpbGUuICBXZSB1c2UgdGhlIHNldCB0aGUgZmlsZSBwb3NpdGlvbiBvZiBhbGwgdGhlCi0gICAgICAgICBzZWN0aW9ucy4gICovCi0gICAgICBsb3cgPSBhYmZkLT5zZWN0aW9ucy0+dm1hOwotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnMtPm5leHQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JaWYgKHMtPnZtYSA8IGxvdykKLQkgIGxvdyA9IHMtPnZtYTsKLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0Jcy0+ZmlsZXBvcyA9IHMtPnZtYSAtIGxvdzsKLQotICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBzaXplKTsKLX0KLQotDAotc3RhdGljIGludAotcHBjYm9vdF9zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZXhlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gc2l6ZW9mIChwcGNib290X2hkcl90KTsKLX0KLQotDAotLyogUHJpbnQgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgZmFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmFyZzsKLXsKLSAgRklMRSAqZiA9IChGSUxFICopZmFyZzsKLSAgcHBjYm9vdF9kYXRhX3QgKnRkYXRhID0gcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpOwotICBsb25nIGVudHJ5X29mZnNldCA9IGJmZF9nZXRsX3NpZ25lZF8zMiAoKFBUUikgdGRhdGEtPmhlYWRlci5lbnRyeV9vZmZzZXQpOwotICBsb25nIGxlbmd0aCA9IGJmZF9nZXRsX3NpZ25lZF8zMiAoKFBUUikgdGRhdGEtPmhlYWRlci5sZW5ndGgpOwotICBpbnQgaTsKLQotICBmcHJpbnRmIChmLCBfKCJcbnBwY2Jvb3QgaGVhZGVyOlxuIikpOwotICBmcHJpbnRmIChmLCBfKCJFbnRyeSBvZmZzZXQgICAgICAgID0gMHglLjhseCAoJWxkKVxuIiksIGVudHJ5X29mZnNldCwgZW50cnlfb2Zmc2V0KTsKLSAgZnByaW50ZiAoZiwgXygiTGVuZ3RoICAgICAgICAgICAgICA9IDB4JS44bHggKCVsZClcbiIpLCBsZW5ndGgsIGxlbmd0aCk7Ci0KLSAgaWYgKHRkYXRhLT5oZWFkZXIuZmxhZ3MpCi0gICAgZnByaW50ZiAoZiwgXygiRmxhZyBmaWVsZCAgICAgICAgICA9IDB4JS4yeFxuIiksIHRkYXRhLT5oZWFkZXIuZmxhZ3MpOwotCi0gIGlmICh0ZGF0YS0+aGVhZGVyLm9zX2lkKQotICAgIGZwcmludGYgKGYsICJPU19JRCAgICAgICAgICAgICAgID0gMHglLjJ4XG4iLCB0ZGF0YS0+aGVhZGVyLm9zX2lkKTsKLQotICBpZiAodGRhdGEtPmhlYWRlci5wYXJ0aXRpb25fbmFtZSkKLSAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb24gbmFtZSAgICAgID0gXCIlc1wiXG4iKSwgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25fbmFtZSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICBsb25nIHNlY3Rvcl9iZWdpbiAgPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnNlY3Rvcl9iZWdpbik7Ci0gICAgICBsb25nIHNlY3Rvcl9sZW5ndGggPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnNlY3Rvcl9sZW5ndGgpOwotCi0gICAgICAvKiBTa2lwIGFsbCAwIGVudHJpZXMgKi8KLSAgICAgIGlmICghdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLmluZAotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5oZWFkCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLnNlY3RvcgotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5jeWxpbmRlcgotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuaW5kCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5oZWFkCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5zZWN0b3IKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLmN5bGluZGVyCi0JICAmJiAhc2VjdG9yX2JlZ2luICYmICFzZWN0b3JfbGVuZ3RoKQotCWNvbnRpbnVlOwotCi0gICAgICBmcHJpbnRmIChmLCBfKCJcblBhcnRpdGlvblslZF0gc3RhcnQgID0geyAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMnggfVxuIiksIGksCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5pbmQsCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5oZWFkLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uc2VjdG9yLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uY3lsaW5kZXIpOwotCi0gICAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb25bJWRdIGVuZCAgICA9IHsgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4IH1cbiIpLCBpLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLmluZCwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5oZWFkLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLnNlY3RvciwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5jeWxpbmRlcik7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlBhcnRpdGlvblslZF0gc2VjdG9yID0gMHglLjhseCAoJWxkKVxuIiksIGksIHNlY3Rvcl9iZWdpbiwgc2VjdG9yX2JlZ2luKTsKLSAgICAgIGZwcmludGYgKGYsIF8oIlBhcnRpdGlvblslZF0gbGVuZ3RoID0gMHglLjhseCAoJWxkKVxuIiksIGksIHNlY3Rvcl9sZW5ndGgsIHNlY3Rvcl9sZW5ndGgpOwotICAgIH0KLQotICBmcHJpbnRmIChmLCAiXG4iKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLSNkZWZpbmUgcHBjYm9vdF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBwcGNib290X2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBwcGNib290X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgcHBjYm9vdF9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBwcGNib290X2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBwcGNib290X2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2RlZmluZSBwcGNib290X2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgcHBjYm9vdF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSNkZWZpbmUgcHBjYm9vdF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX3NldF9wcml2YXRlX2ZsYWdzIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgcHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0IHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotY29uc3QgYmZkX3RhcmdldCBwcGNib290X3ZlYyA9Ci17Ci0gICJwcGNib290IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAkvKiBmbGF2b3VyICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogYnl0ZW9yZGVyIGlzIGJpZyBlbmRpYW4gZm9yIGNvZGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXJfYnl0ZW9yZGVyICovCi0gIEVYRUNfUCwJCQkvKiBvYmplY3RfZmxhZ3MgKi8KLSAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZIHwgU0VDX0NPREUgfCBTRUNfREFUQQotICAgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUyksIC8qIHNlY3Rpb25fZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLSAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgcHBjYm9vdF9vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBwcGNib290X21rb2JqZWN0LAotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIGJmZF90cnVlLAotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChwcGNib290KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgTlVMTAotfTsKZGlmZiAtLWdpdCBhL2JmZC9wdHJhY2UtY29yZS5jIGIvYmZkL3B0cmFjZS1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjlkY2UuLjAwMDAwMDAKLS0tIGEvYmZkL3B0cmFjZS1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIGNvcmUgZmlsZXMgd2hpY2ggdXNlIHRoZSBwdHJhY2VfdXNlciBzdHJ1Y3R1cmUKLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhlIHN0cnVjdHVyZSBvZiB0aGlzIGZpbGUgaXMgYmFzZWQgb24gdHJhZC1jb3JlLmMgd3JpdHRlbiBieSBKb2huIEdpbG1vcmUKLSAgIG9mIEN5Z251cyBTdXBwb3J0LgotICAgTW9kaWZpZWQgdG8gd29yayB3aXRoIHRoZSBwdHJhY2VfdXNlciBzdHJ1Y3R1cmUgYnkgS2V2aW4gQS4gQnVldHRuZXIuCi0gICAoTG9uZ3Rlcm0gaXQgbWF5IGJlIGJldHRlciB0byBtZXJnZSB0aGlzIGZpbGUgd2l0aCB0cmFkLWNvcmUuYykKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgUFRSQUNFX0NPUkUKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLQotCi1zdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdAotICB7Ci0gICAgYXNlY3Rpb24gKmRhdGFfc2VjdGlvbjsKLSAgICBhc2VjdGlvbiAqc3RhY2tfc2VjdGlvbjsKLSAgICBhc2VjdGlvbiAqcmVnX3NlY3Rpb247Ci0gICAgc3RydWN0IHB0cmFjZV91c2VyIHU7Ci0gIH07Ci0KLSNkZWZpbmUgY29yZV91cGFnZShiZmQpICgmKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dSkpCi0jZGVmaW5lIGNvcmVfZGF0YXNlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPmRhdGFfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9zdGFja3NlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnN0YWNrX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfcmVnc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+cmVnX3NlY3Rpb24pCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKnB0cmFjZV91bml4X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotY2hhciAqCQlwdHJhY2VfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotaW50CQlwdHJhY2VfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuCQlwdHJhY2VfdW5peF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQkJCSBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKSk7Ci1zdGF0aWMgdm9pZAlzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQVJHU1VTRUQgKi8KLWNvbnN0IGJmZF90YXJnZXQgKgotcHRyYWNlX3VuaXhfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLQotewotICBpbnQgdmFsOwotICBzdHJ1Y3QgcHRyYWNlX3VzZXIgdTsKLSAgc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgKnJhd3B0cjsKLQotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmdSwgMSwgc2l6ZW9mIHUsIGFiZmQpOwotICBpZiAodmFsICE9IHNpemVvZiB1IHx8IHUucHRfbWFnaWMgIT0gX0JDU19QVFJBQ0VfTUFHSUMgCi0gICAgICB8fCB1LnB0X3JldiAhPSBfQkNTX1BUUkFDRV9SRVYpCi0gICAgewotICAgICAgLyogVG9vIHNtYWxsIHRvIGJlIGEgY29yZSBmaWxlICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KLQotICAvKiBBbGxvY2F0ZSBib3RoIHRoZSB1cGFnZSBhbmQgdGhlIHN0cnVjdCBjb3JlX2RhdGEgYXQgb25jZSwgc28KLSAgICAgYSBzaW5nbGUgZnJlZSgpIHdpbGwgZnJlZSB0aGVtIGJvdGguICAqLwotICByYXdwdHIgPSAoc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgKikKLQkJYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCkpOwotCi0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgCi0gIGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhID0gcmF3cHRyOwotCi0gIHJhd3B0ci0+dSA9IHU7IC8qQ29weSB0aGUgdWFyZWEgaW50byB0aGUgdGRhdGEgcGFydCBvZiB0aGUgYmZkICovCi0KLSAgLyogQ3JlYXRlIHRoZSBzZWN0aW9ucy4gIFRoaXMgaXMgcmF1bmNoeSwgYnV0IGJmZF9jbG9zZSB3YW50cyB0byBmcmVlCi0gICAgIHRoZW0gc2VwYXJhdGVseS4gICovCi0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9zdGFja3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgY29yZV9kYXRhc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX2RhdGFzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3JlZ3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmFtZSA9ICIuc3RhY2siOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uYW1lID0gIi5kYXRhIjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uYW1lID0gIi5yZWciOwotCi0gIC8qIEZJWE1FOiAgTmVlZCB0byB3b3JyeSBhYm91dCBzaGFyZWQgbWVtb3J5LCBsaWJyYXJ5IGRhdGEsIGFuZCBsaWJyYXJ5Ci0gICAgIHRleHQuICBJIGRvbid0IHRoaW5rIHRoYXQgYW55IG9mIHRoZXNlIHRoaW5ncyBhcmUgc3VwcG9ydGVkIG9uIHRoZQotICAgICBzeXN0ZW0gb24gd2hpY2ggSSBhbSBkZXZlbG9waW5nIHRoaXMgZm9yIHRob3VnaC4gKi8KLQotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9ICB1LnB0X2RzaXplOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+X3Jhd19zaXplID0gdS5wdF9zc2l6ZTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBzaXplb2YodSk7Ci0KLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+dm1hID0gdS5wdF9vX2RhdGFfc3RhcnQ7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSBVU1JTVEFDSyAtIHUucHRfc3NpemU7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gMCAtIHNpemVvZih1KTsJLyogc2VlIHRyYWQtY29yZS5jICovCi0KLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChpbnQpIHUucHRfZGF0YXB0cjsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZpbGVwb3MgPSAoaW50KSAodS5wdF9kYXRhcHRyICsgdS5wdF9kc2l6ZSk7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmlsZXBvcyA9IDA7IC8qIFJlZ2lzdGVyIHNlZ21lbnQgaXMgcHRyYWNlX3VzZXIgKi8KLQotICAvKiBBbGlnbiB0byB3b3JkIGF0IGxlYXN0ICovCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgYWJmZC0+c2VjdGlvbnMgPSBjb3JlX3N0YWNrc2VjIChhYmZkKTsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5leHQgPSBjb3JlX2RhdGFzZWMgKGFiZmQpOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9yZWdzZWMgKGFiZmQpOwotICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gMzsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotY2hhciAqCi1wdHJhY2VfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmNvbSA9IGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnB0X2NvbW07Ci0gIGlmICgqY29tKQotICAgIHJldHVybiBjb207Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWludAotcHRyYWNlX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS5wdF9zaWdmcmFtZS5zaWdfbnVtOwotfQotCi0vKiBBUkdTVVNFRCAqLwotYm9vbGVhbgotcHRyYWNlX3VuaXhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIC8qIEZJWE1FOiBVc2UgcHRfdGltZGF0IGZpZWxkIG9mIHRoZSBwdHJhY2VfdXNlciBzdHJ1Y3R1cmUgdG8gbWF0Y2ggCi0gICAgIHRoZSBkYXRlIG9mIHRoZSBleGVjdXRhYmxlICovCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgcHRyYWNlX2NvcmVfdmVjID0KLSAgewotICAgICJ0cmFkLWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKHB0cmFjZV91bml4KSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIE5VTEwsCi0gICAgCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKLQotI2VuZGlmIC8qIFBUUkFDRV9DT1JFICovCmRpZmYgLS1naXQgYS9iZmQvcmVsb2MuYyBiL2JmZC9yZWxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGRiMTVmLi4wMDAwMDAwCi0tLSBhL2JmZC9yZWxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkwNSArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgcmVsb2NhdGlvbiBlbnRyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCVJlbG9jYXRpb25zCi0KLQlCRkQgbWFpbnRhaW5zIHJlbG9jYXRpb25zIGluIG11Y2ggdGhlIHNhbWUgd2F5IGl0IG1haW50YWlucwotCXN5bWJvbHM6IHRoZXkgYXJlIGxlZnQgYWxvbmUgdW50aWwgcmVxdWlyZWQsIHRoZW4gcmVhZCBpbgotCWVuLW1hc3MgYW5kIHRyYW5zbGF0ZWQgaW50byBhbiBpbnRlcm5hbCBmb3JtLiAgQSBjb21tb24KLQlyb3V0aW5lIDw8YmZkX3BlcmZvcm1fcmVsb2NhdGlvbj4+IGFjdHMgdXBvbiB0aGUKLQljYW5vbmljYWwgZm9ybSB0byBkbyB0aGUgZml4dXAuCi0KLQlSZWxvY2F0aW9ucyBhcmUgbWFpbnRhaW5lZCBvbiBhIHBlciBzZWN0aW9uIGJhc2lzLAotCXdoaWxlIHN5bWJvbHMgYXJlIG1haW50YWluZWQgb24gYSBwZXIgQkZEIGJhc2lzLgotCi0JQWxsIHRoYXQgYSBiYWNrIGVuZCBoYXMgdG8gZG8gdG8gZml0IHRoZSBCRkQgaW50ZXJmYWNlIGlzIHRvIGNyZWF0ZQotCWEgPDxzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnk+PiBmb3IgZWFjaCByZWxvY2F0aW9uCi0JaW4gYSBwYXJ0aWN1bGFyIHNlY3Rpb24sIGFuZCBmaWxsIGluIHRoZSByaWdodCBiaXRzIG9mIHRoZSBzdHJ1Y3R1cmVzLgotCi1AbWVudQotQCogdHlwZWRlZiBhcmVsZW50OjoKLUAqIGhvd3RvIG1hbmFnZXI6OgotQGVuZCBtZW51Ci0KLSovCi0KLS8qIERPIGNvbXBpbGUgaW4gdGhlIHJlbG9jX2NvZGUgbmFtZSB0YWJsZSBmcm9tIGxpYmJmZC5oLiAgKi8KLSNkZWZpbmUgX0JGRF9NQUtFX1RBQkxFX2JmZF9yZWxvY19jb2RlX3JlYWwKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLS8qCi1ET0NERAotSU5PREUKLQl0eXBlZGVmIGFyZWxlbnQsIGhvd3RvIG1hbmFnZXIsIFJlbG9jYXRpb25zLCBSZWxvY2F0aW9ucwotCi1TVUJTRUNUSU9OCi0JdHlwZWRlZiBhcmVsZW50Ci0KLQlUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgYSByZWxvY2F0aW9uIGVudHJ5OgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiBlbnVtIGJmZF9yZWxvY19zdGF0dXMKLS57Ci0uICAgICAgIHsqIE5vIGVycm9ycyBkZXRlY3RlZCAqfQotLiAgYmZkX3JlbG9jX29rLAotLgotLiAgICAgICB7KiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgdGhlcmUgd2FzIGFuIG92ZXJmbG93LiAqfQotLiAgYmZkX3JlbG9jX292ZXJmbG93LAotLgotLiAgICAgICB7KiBUaGUgYWRkcmVzcyB0byByZWxvY2F0ZSB3YXMgbm90IHdpdGhpbiB0aGUgc2VjdGlvbiBzdXBwbGllZC4gKn0KLS4gIGJmZF9yZWxvY19vdXRvZnJhbmdlLAotLgotLiAgICAgICB7KiBVc2VkIGJ5IHNwZWNpYWwgZnVuY3Rpb25zICp9Ci0uICBiZmRfcmVsb2NfY29udGludWUsCi0uCi0uICAgICAgIHsqIFVuc3VwcG9ydGVkIHJlbG9jYXRpb24gc2l6ZSByZXF1ZXN0ZWQuICp9Ci0uICBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkLAotLgotLiAgICAgICB7KiBVbnVzZWQgKn0KLS4gIGJmZF9yZWxvY19vdGhlciwKLS4KLS4gICAgICAgeyogVGhlIHN5bWJvbCB0byByZWxvY2F0ZSBhZ2FpbnN0IHdhcyB1bmRlZmluZWQuICp9Ci0uICBiZmRfcmVsb2NfdW5kZWZpbmVkLAotLgotLiAgICAgICB7KiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgbWF5IG5vdCBiZSBvayAtIHByZXNlbnRseQotLiAgICAgICAgICBnZW5lcmF0ZWQgb25seSB3aGVuIGxpbmtpbmcgaTk2MCBjb2ZmIGZpbGVzIHdpdGggaTk2MCBiLm91dAotLiAgICAgICAgICBzeW1ib2xzLiAgSWYgdGhpcyB0eXBlIGlzIHJldHVybmVkLCB0aGUgZXJyb3JfbWVzc2FnZSBhcmd1bWVudAotLiAgICAgICAgICB0byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHdpbGwgYmUgc2V0LiAgKn0KLS4gIGJmZF9yZWxvY19kYW5nZXJvdXMKLS4gfQotLiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGU7Ci0uCi0uCi0udHlwZWRlZiBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkKLS57Ci0uICAgICAgIHsqIEEgcG9pbnRlciBpbnRvIHRoZSBjYW5vbmljYWwgdGFibGUgb2YgcG9pbnRlcnMgICp9Ci0uICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltX3B0cl9wdHI7Ci0uCi0uICAgICAgIHsqIG9mZnNldCBpbiBzZWN0aW9uICp9Ci0uICBiZmRfc2l6ZV90eXBlIGFkZHJlc3M7Ci0uCi0uICAgICAgIHsqIGFkZGVuZCBmb3IgcmVsb2NhdGlvbiB2YWx1ZSAqfQotLiAgYmZkX3ZtYSBhZGRlbmQ7Ci0uCi0uICAgICAgIHsqIFBvaW50ZXIgdG8gaG93IHRvIHBlcmZvcm0gdGhlIHJlcXVpcmVkIHJlbG9jYXRpb24gKn0KLS4gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotLgotLn0gYXJlbGVudDsKLQotKi8KLQotLyoKLURFU0NSSVBUSU9OCi0KLSAgICAgICAgSGVyZSBpcyBhIGRlc2NyaXB0aW9uIG9mIGVhY2ggb2YgdGhlIGZpZWxkcyB3aXRoaW4gYW4gPDxhcmVsZW50Pj46Ci0KLSAgICAgICAgbyA8PHN5bV9wdHJfcHRyPj4KLQotICAgICAgICBUaGUgc3ltYm9sIHRhYmxlIHBvaW50ZXIgcG9pbnRzIHRvIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sCi0gICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsb2NhdGlvbiByZXF1ZXN0LiAgSXQgaXMKLSAgICAgICAgdGhlIHBvaW50ZXIgaW50byB0aGUgdGFibGUgcmV0dXJuZWQgYnkgdGhlIGJhY2sgZW5kJ3MKLSAgICAgICAgPDxnZXRfc3ltdGFiPj4gYWN0aW9uLiBAeHJlZntTeW1ib2xzfS4gVGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkCi0gICAgICAgIHRocm91Z2ggYSBwb2ludGVyIHRvIGEgcG9pbnRlciBzbyB0aGF0IHRvb2xzIGxpa2UgdGhlIGxpbmtlcgotICAgICAgICBjYW4gZml4IHVwIGFsbCB0aGUgc3ltYm9scyBvZiB0aGUgc2FtZSBuYW1lIGJ5IG1vZGlmeWluZyBvbmx5Ci0gICAgICAgIG9uZSBwb2ludGVyLiBUaGUgcmVsb2NhdGlvbiByb3V0aW5lIGxvb2tzIGluIHRoZSBzeW1ib2wgYW5kCi0gICAgICAgIHVzZXMgdGhlIGJhc2Ugb2YgdGhlIHNlY3Rpb24gdGhlIHN5bWJvbCBpcyBhdHRhY2hlZCB0byBhbmQgdGhlCi0gICAgICAgIHZhbHVlIG9mIHRoZSBzeW1ib2wgYXMgdGhlIGluaXRpYWwgcmVsb2NhdGlvbiBvZmZzZXQuIElmIHRoZQotICAgICAgICBzeW1ib2wgcG9pbnRlciBpcyB6ZXJvLCB0aGVuIHRoZSBzZWN0aW9uIHByb3ZpZGVkIGlzIGxvb2tlZCB1cC4KLQotICAgICAgICBvIDw8YWRkcmVzcz4+Ci0KLSAgICAgICAgVGhlIDw8YWRkcmVzcz4+IGZpZWxkIGdpdmVzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgYmFzZSBvZgotICAgICAgICB0aGUgc2VjdGlvbiBkYXRhIHdoaWNoIG93bnMgdGhlIHJlbG9jYXRpb24gcmVjb3JkIHRvIHRoZSBmaXJzdAotICAgICAgICBieXRlIG9mIHJlbG9jYXRhYmxlIGluZm9ybWF0aW9uLiBUaGUgYWN0dWFsIGRhdGEgcmVsb2NhdGVkCi0gICAgICAgIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcyBwb2ludDsgZm9yIGV4YW1wbGUsIGEgcmVsb2NhdGlvbgotICAgICAgICB0eXBlIHdoaWNoIG1vZGlmaWVzIHRoZSBib3R0b20gdHdvIGJ5dGVzIG9mIGEgZm91ciBieXRlIHdvcmQKLSAgICAgICAgd291bGQgbm90IHRvdWNoIHRoZSBmaXJzdCBieXRlIHBvaW50ZWQgdG8gaW4gYSBiaWcgZW5kaWFuCi0gICAgICAgIHdvcmxkLgotCi0JbyA8PGFkZGVuZD4+Ci0KLQlUaGUgPDxhZGRlbmQ+PiBpcyBhIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBiYWNrIGVuZCB0byBiZSBhZGRlZCAoISkKLQl0byB0aGUgcmVsb2NhdGlvbiBvZmZzZXQuIEl0cyBpbnRlcnByZXRhdGlvbiBpcyBkZXBlbmRlbnQgdXBvbgotCXRoZSBob3d0by4gRm9yIGV4YW1wbGUsIG9uIHRoZSA2OGsgdGhlIGNvZGU6Ci0KLQotfCAgICAgICAgY2hhciBmb29bXTsKLXwgICAgICAgIG1haW4oKQotfCAgICAgICAgICAgICAgICB7Ci18ICAgICAgICAgICAgICAgIHJldHVybiBmb29bMHgxMjM0NTY3OF07Ci18ICAgICAgICAgICAgICAgIH0KLQotICAgICAgICBDb3VsZCBiZSBjb21waWxlZCBpbnRvOgotCi18ICAgICAgICBsaW5rdyBmcCwjLTQKLXwgICAgICAgIG1vdmViIEBAIzEyMzQ1Njc4LGQwCi18ICAgICAgICBleHRibCBkMAotfCAgICAgICAgdW5sayBmcAotfCAgICAgICAgcnRzCi0KLQotICAgICAgICBUaGlzIGNvdWxkIGNyZWF0ZSBhIHJlbG9jIHBvaW50aW5nIHRvIDw8Zm9vPj4sIGJ1dCBsZWF2ZSB0aGUKLSAgICAgICAgb2Zmc2V0IGluIHRoZSBkYXRhLCBzb21ldGhpbmcgbGlrZToKLQotCi18UkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbLnRleHRdOgotfG9mZnNldCAgIHR5cGUgICAgICB2YWx1ZQotfDAwMDAwMDA2IDMyICAgICAgICBfZm9vCi18Ci18MDAwMDAwMDAgNGU1NiBmZmZjICAgICAgICAgIDsgbGlua3cgZnAsIy00Ci18MDAwMDAwMDQgMTAzOSAxMjM0IDU2NzggICAgIDsgbW92ZWIgQEAjMTIzNDU2NzgsZDAKLXwwMDAwMDAwYSA0OWMwICAgICAgICAgICAgICAgOyBleHRibCBkMAotfDAwMDAwMDBjIDRlNWUgICAgICAgICAgICAgICA7IHVubGsgZnAKLXwwMDAwMDAwZSA0ZTc1ICAgICAgICAgICAgICAgOyBydHMKLQotCi0gICAgICAgIFVzaW5nIGNvZmYgYW5kIGFuIDg4aywgc29tZSBpbnN0cnVjdGlvbnMgZG9uJ3QgaGF2ZSBlbm91Z2gKLSAgICAgICAgc3BhY2UgaW4gdGhlbSB0byByZXByZXNlbnQgdGhlIGZ1bGwgYWRkcmVzcyByYW5nZSwgYW5kCi0gICAgICAgIHBvaW50ZXJzIGhhdmUgdG8gYmUgbG9hZGVkIGluIHR3byBwYXJ0cy4gU28geW91J2QgZ2V0IHNvbWV0aGluZyBsaWtlOgotCi0KLXwgICAgICAgIG9yLnUgICAgIHIxMyxyMCxoaTE2KF9mb28rMHgxMjM0NTY3OCkKLXwgICAgICAgIGxkLmIgICAgIHIyLHIxMyxsbzE2KF9mb28rMHgxMjM0NTY3OCkKLXwgICAgICAgIGptcCAgICAgIHIxCi0KLQotICAgICAgICBUaGlzIHNob3VsZCBjcmVhdGUgdHdvIHJlbG9jcywgYm90aCBwb2ludGluZyB0byA8PF9mb28+PiwgYW5kIHdpdGgKLSAgICAgICAgMHgxMjM0MDAwMCBpbiB0aGVpciBhZGRlbmQgZmllbGQuIFRoZSBkYXRhIHdvdWxkIGNvbnNpc3Qgb2Y6Ci0KLQotfFJFTE9DQVRJT04gUkVDT1JEUyBGT1IgWy50ZXh0XToKLXxvZmZzZXQgICB0eXBlICAgICAgdmFsdWUKLXwwMDAwMDAwMiBIVlJUMTYgICAgX2ZvbysweDEyMzQwMDAwCi18MDAwMDAwMDYgTFZSVDE2ICAgIF9mb28rMHgxMjM0MDAwMAotfAotfDAwMDAwMDAwIDVkYTA1Njc4ICAgICAgICAgICA7IG9yLnUgcjEzLHIwLDB4NTY3OAotfDAwMDAwMDA0IDFjNGQ1Njc4ICAgICAgICAgICA7IGxkLmIgcjIscjEzLDB4NTY3OAotfDAwMDAwMDA4IGY0MDBjMDAxICAgICAgICAgICA7IGptcCByMQotCi0KLSAgICAgICAgVGhlIHJlbG9jYXRpb24gcm91dGluZSBkaWdzIG91dCB0aGUgdmFsdWUgZnJvbSB0aGUgZGF0YSwgYWRkcwotICAgICAgICBpdCB0byB0aGUgYWRkZW5kIHRvIGdldCB0aGUgb3JpZ2luYWwgb2Zmc2V0LCBhbmQgdGhlbiBhZGRzIHRoZQotICAgICAgICB2YWx1ZSBvZiA8PF9mb28+Pi4gTm90ZSB0aGF0IGFsbCAzMiBiaXRzIGhhdmUgdG8gYmUga2VwdCBhcm91bmQKLSAgICAgICAgc29tZXdoZXJlLCB0byBjb3BlIHdpdGggY2FycnkgZnJvbSBiaXQgMTUgdG8gYml0IDE2LgotCi0gICAgICAgIE9uZSBmdXJ0aGVyIGV4YW1wbGUgaXMgdGhlIHNwYXJjIGFuZCB0aGUgYS5vdXQgZm9ybWF0LiBUaGUKLSAgICAgICAgc3BhcmMgaGFzIGEgc2ltaWxhciBwcm9ibGVtIHRvIHRoZSA4OGssIGluIHRoYXQgc29tZQotICAgICAgICBpbnN0cnVjdGlvbnMgZG9uJ3QgaGF2ZSByb29tIGZvciBhbiBlbnRpcmUgb2Zmc2V0LCBidXQgb24gdGhlCi0gICAgICAgIHNwYXJjIHRoZSBwYXJ0cyBhcmUgY3JlYXRlZCBpbiBvZGQgc2l6ZWQgbHVtcHMuIFRoZSBkZXNpZ25lcnMgb2YKLSAgICAgICAgdGhlIGEub3V0IGZvcm1hdCBjaG9zZSB0byBub3QgdXNlIHRoZSBkYXRhIHdpdGhpbiB0aGUgc2VjdGlvbgotICAgICAgICBmb3Igc3RvcmluZyBwYXJ0IG9mIHRoZSBvZmZzZXQ7IGFsbCB0aGUgb2Zmc2V0IGlzIGtlcHQgd2l0aGluCi0gICAgICAgIHRoZSByZWxvYy4gQW55dGhpbmcgaW4gdGhlIGRhdGEgc2hvdWxkIGJlIGlnbm9yZWQuCi0KLXwgICAgICAgIHNhdmUgJXNwLC0xMTIsJXNwCi18ICAgICAgICBzZXRoaSAlaGkoX2ZvbysweDEyMzQ1Njc4KSwlZzIKLXwgICAgICAgIGxkc2IgWyVnMislbG8oX2ZvbysweDEyMzQ1Njc4KV0sJWkwCi18ICAgICAgICByZXQKLXwgICAgICAgIHJlc3RvcmUKLQotICAgICAgICBCb3RoIHJlbG9jcyBjb250YWluIGEgcG9pbnRlciB0byA8PGZvbz4+LCBhbmQgdGhlIG9mZnNldHMKLSAgICAgICAgY29udGFpbiBqdW5rLgotCi0KLXxSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFsudGV4dF06Ci18b2Zmc2V0ICAgdHlwZSAgICAgIHZhbHVlCi18MDAwMDAwMDQgSEkyMiAgICAgIF9mb28rMHgxMjM0NTY3OAotfDAwMDAwMDA4IExPMTAgICAgICBfZm9vKzB4MTIzNDU2NzgKLXwKLXwwMDAwMDAwMCA5ZGUzYmY5MCAgICAgOyBzYXZlICVzcCwtMTEyLCVzcAotfDAwMDAwMDA0IDA1MDAwMDAwICAgICA7IHNldGhpICVoaShfZm9vKzApLCVnMgotfDAwMDAwMDA4IGYwNDhhMDAwICAgICA7IGxkc2IgWyVnMislbG8oX2ZvbyswKV0sJWkwCi18MDAwMDAwMGMgODFjN2UwMDggICAgIDsgcmV0Ci18MDAwMDAwMTAgODFlODAwMDAgICAgIDsgcmVzdG9yZQotCi0KLSAgICAgICAgbyA8PGhvd3RvPj4KLQotICAgICAgICBUaGUgPDxob3d0bz4+IGZpZWxkIGNhbiBiZSBpbWFnaW5lZCBhcyBhCi0gICAgICAgIHJlbG9jYXRpb24gaW5zdHJ1Y3Rpb24uIEl0IGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSB3aGljaAotICAgICAgICBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB3aGF0IHRvIGRvIHdpdGggYWxsIG9mIHRoZSBvdGhlcgotICAgICAgICBpbmZvcm1hdGlvbiBpbiB0aGUgcmVsb2MgcmVjb3JkIGFuZCBkYXRhIHNlY3Rpb24uIEEgYmFjayBlbmQKLSAgICAgICAgd291bGQgbm9ybWFsbHkgaGF2ZSBhIHJlbG9jYXRpb24gaW5zdHJ1Y3Rpb24gc2V0IGFuZCB0dXJuCi0gICAgICAgIHJlbG9jYXRpb25zIGludG8gcG9pbnRlcnMgdG8gdGhlIGNvcnJlY3Qgc3RydWN0dXJlIG9uIGlucHV0IC0KLSAgICAgICAgYnV0IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGNyZWF0ZSBlYWNoIGhvd3RvIGZpZWxkIG9uIGRlbWFuZC4KLQotKi8KLQotLyoKLVNVQlNVQlNFQ1RJT04KLQk8PGVudW0gY29tcGxhaW5fb3ZlcmZsb3c+PgotCi0JSW5kaWNhdGVzIHdoYXQgc29ydCBvZiBvdmVyZmxvdyBjaGVja2luZyBzaG91bGQgYmUgZG9uZSB3aGVuCi0JcGVyZm9ybWluZyBhIHJlbG9jYXRpb24uCi0KLUNPREVfRlJBR01FTlQKLS4KLS5lbnVtIGNvbXBsYWluX292ZXJmbG93Ci0uewotLgl7KiBEbyBub3QgY29tcGxhaW4gb24gb3ZlcmZsb3cuICp9Ci0uICBjb21wbGFpbl9vdmVyZmxvd19kb250LAotLgotLgl7KiBDb21wbGFpbiBpZiB0aGUgYml0ZmllbGQgb3ZlcmZsb3dzLCB3aGV0aGVyIGl0IGlzIGNvbnNpZGVyZWQKLS4JICAgYXMgc2lnbmVkIG9yIHVuc2lnbmVkLiAqfQotLiAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0uCi0uCXsqIENvbXBsYWluIGlmIHRoZSB2YWx1ZSBvdmVyZmxvd3Mgd2hlbiBjb25zaWRlcmVkIGFzIHNpZ25lZAotLgkgICBudW1iZXIuICp9Ci0uICBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0uCi0uCXsqIENvbXBsYWluIGlmIHRoZSB2YWx1ZSBvdmVyZmxvd3Mgd2hlbiBjb25zaWRlcmVkIGFzIGFuCi0uCSAgIHVuc2lnbmVkIG51bWJlci4gKn0KLS4gIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkCi0ufTsKLQotKi8KLQotLyoKLVNVQlNVQlNFQ1RJT04KLSAgICAgICAgPDxyZWxvY19ob3d0b190eXBlPj4KLQotICAgICAgICBUaGUgPDxyZWxvY19ob3d0b190eXBlPj4gaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYWxsIHRoZQotICAgICAgICBpbmZvcm1hdGlvbiB0aGF0IGxpYmJmZCBuZWVkcyB0byBrbm93IHRvIHRpZSB1cCBhIGJhY2sgZW5kJ3MgZGF0YS4KLQotQ09ERV9GUkFHTUVOVAotLnN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnk7CQl7KiBGb3J3YXJkIGRlY2xhcmF0aW9uICp9Ci0uCi0uc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdAotLnsKLS4gICAgICAgeyogIFRoZSB0eXBlIGZpZWxkIGhhcyBtYWlubHkgYSBkb2N1bWVudGFyeSB1c2UgLSB0aGUgYmFjayBlbmQgY2FuCi0uICAgICAgICAgICBkbyB3aGF0IGl0IHdhbnRzIHdpdGggaXQsIHRob3VnaCBub3JtYWxseSB0aGUgYmFjayBlbmQncwotLiAgICAgICAgICAgZXh0ZXJuYWwgaWRlYSBvZiB3aGF0IGEgcmVsb2MgbnVtYmVyIGlzIHN0b3JlZAotLiAgICAgICAgICAgaW4gdGhpcyBmaWVsZC4gRm9yIGV4YW1wbGUsIGEgUEMgcmVsYXRpdmUgd29yZCByZWxvY2F0aW9uCi0uICAgICAgICAgICBpbiBhIGNvZmYgZW52aXJvbm1lbnQgaGFzIHRoZSB0eXBlIDAyMyAtIGJlY2F1c2UgdGhhdCdzCi0uICAgICAgICAgICB3aGF0IHRoZSBvdXRzaWRlIHdvcmxkIGNhbGxzIGEgUl9QQ1JXT1JEIHJlbG9jLiAqfQotLiAgdW5zaWduZWQgaW50IHR5cGU7Ci0uCi0uICAgICAgIHsqICBUaGUgdmFsdWUgdGhlIGZpbmFsIHJlbG9jYXRpb24gaXMgc2hpZnRlZCByaWdodCBieS4gVGhpcyBkcm9wcwotLiAgICAgICAgICAgdW53YW50ZWQgZGF0YSBmcm9tIHRoZSByZWxvY2F0aW9uLiAgKn0KLS4gIHVuc2lnbmVkIGludCByaWdodHNoaWZ0OwotLgotLgl7KiAgVGhlIHNpemUgb2YgdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkLiAgVGhpcyBpcyAqbm90KiBhCi0uCSAgICBwb3dlci1vZi10d28gbWVhc3VyZS4gIFRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9wZXJhdGVkCi0uCSAgICBvbiBieSBhIHR5cGUgb2YgcmVsb2NhdGlvbiwgdXNlIGJmZF9nZXRfcmVsb2Nfc2l6ZS4gICp9Ci0uICBpbnQgc2l6ZTsKLS4KLS4gICAgICAgeyogIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaXRlbSB0byBiZSByZWxvY2F0ZWQuICBUaGlzIGlzIHVzZWQKLS4JICAgIHdoZW4gZG9pbmcgb3ZlcmZsb3cgY2hlY2tpbmcuICAqfQotLiAgdW5zaWduZWQgaW50IGJpdHNpemU7Ci0uCi0uICAgICAgIHsqICBOb3RlcyB0aGF0IHRoZSByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUKLS4gICAgICAgICAgIGRhdGEgc2VjdGlvbiBvZiB0aGUgYWRkZW5kLiBUaGUgcmVsb2NhdGlvbiBmdW5jdGlvbiB3aWxsCi0uICAgICAgICAgICBzdWJ0cmFjdCBmcm9tIHRoZSByZWxvY2F0aW9uIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbgotLiAgICAgICAgICAgYmVpbmcgcmVsb2NhdGVkLiAqfQotLiAgYm9vbGVhbiBwY19yZWxhdGl2ZTsKLS4KLS4JeyogIFRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIHJlbG9jIHZhbHVlIGluIHRoZSBkZXN0aW5hdGlvbi4KLS4JICAgIFRoZSByZWxvY2F0ZWQgdmFsdWUgaXMgbGVmdCBzaGlmdGVkIGJ5IHRoaXMgYW1vdW50LiAqfQotLiAgdW5zaWduZWQgaW50IGJpdHBvczsKLS4KLS4JeyogV2hhdCB0eXBlIG9mIG92ZXJmbG93IGVycm9yIHNob3VsZCBiZSBjaGVja2VkIGZvciB3aGVuCi0uCSAgIHJlbG9jYXRpbmcuICp9Ci0uICBlbnVtIGNvbXBsYWluX292ZXJmbG93IGNvbXBsYWluX29uX292ZXJmbG93OwotLgotLiAgICAgICB7KiBJZiB0aGlzIGZpZWxkIGlzIG5vbiBudWxsLCB0aGVuIHRoZSBzdXBwbGllZCBmdW5jdGlvbiBpcwotLiAgICAgICAgICBjYWxsZWQgcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBmdW5jdGlvbi4gVGhpcyBhbGxvd3MgcmVhbGx5Ci0uICAgICAgICAgIHN0cmFuZ2UgcmVsb2NhdGlvbiBtZXRob2RzIHRvIGJlIGFjY29tb2RhdGVkIChlLmcuLCBpOTYwIGNhbGxqCi0uICAgICAgICAgIGluc3RydWN0aW9ucykuICp9Ci0uICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgKCpzcGVjaWFsX2Z1bmN0aW9uKQotLgkJCQkgICAgUEFSQU1TICgoYmZkICphYmZkLAotLgkJCQkJICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbCwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUiBkYXRhLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotLgotLiAgICAgICB7KiBUaGUgdGV4dHVhbCBuYW1lIG9mIHRoZSByZWxvY2F0aW9uIHR5cGUuICp9Ci0uICBjaGFyICpuYW1lOwotLgotLiAgICAgICB7KiBXaGVuIHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmssIHNvbWUgZm9ybWF0cyBtdXN0IG1vZGlmeSB0aGUKLS4gICAgICAgICAgcmVsb2NhdGlvbnMgcmF0aGVyIHRoYW4gdGhlIGRhdGEgLSB0aGlzIGZsYWcgc2lnbmFscyB0aGlzLip9Ci0uICBib29sZWFuIHBhcnRpYWxfaW5wbGFjZTsKLS4KLS4gICAgICAgeyogVGhlIHNyY19tYXNrIHNlbGVjdHMgd2hpY2ggcGFydHMgb2YgdGhlIHJlYWQgaW4gZGF0YQotLiAgICAgICAgICBhcmUgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbiBzdW0uICBFLmcuLCBpZiB0aGlzIHdhcyBhbiA4IGJpdAotLiAgICAgICAgICBiaXQgb2YgZGF0YSB3aGljaCB3ZSByZWFkIGFuZCByZWxvY2F0ZWQsIHRoaXMgd291bGQgYmUKLS4gICAgICAgICAgMHgwMDAwMDBmZi4gV2hlbiB3ZSBoYXZlIHJlbG9jcyB3aGljaCBoYXZlIGFuIGFkZGVuZCwgc3VjaCBhcwotLiAgICAgICAgICBzdW40IGV4dGVuZGVkIHJlbG9jcywgdGhlIHZhbHVlIGluIHRoZSBvZmZzZXQgcGFydCBvZiBhCi0uICAgICAgICAgIHJlbG9jYXRpbmcgZmllbGQgaXMgZ2FyYmFnZSBzbyB3ZSBuZXZlciB1c2UgaXQuIEluIHRoaXMgY2FzZQotLiAgICAgICAgICB0aGUgbWFzayB3b3VsZCBiZSAweDAwMDAwMDAwLiAqfQotLiAgYmZkX3ZtYSBzcmNfbWFzazsKLS4KLS4gICAgICAgeyogVGhlIGRzdF9tYXNrIHNlbGVjdHMgd2hpY2ggcGFydHMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSByZXBsYWNlZAotLiAgICAgICAgICBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gSW4gbW9zdCBjYXNlcyBzcmNfbWFzayA9PSBkc3RfbWFzaywKLS4gICAgICAgICAgZXhjZXB0IGluIHRoZSBhYm92ZSBzcGVjaWFsIGNhc2UsIHdoZXJlIGRzdF9tYXNrIHdvdWxkIGJlCi0uICAgICAgICAgIDB4MDAwMDAwZmYsIGFuZCBzcmNfbWFzayB3b3VsZCBiZSAweDAwMDAwMDAwLiAgICp9Ci0uICBiZmRfdm1hIGRzdF9tYXNrOwotLgotLiAgICAgICB7KiBXaGVuIHNvbWUgZm9ybWF0cyBjcmVhdGUgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zLCB0aGV5IGxlYXZlCi0uICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcGMgb2YgdGhlIHBsYWNlIGJlaW5nIHJlbG9jYXRlZCBpbiB0aGUgb2Zmc2V0Ci0uICAgICAgICAgIHNsb3Qgb2YgdGhlIGluc3RydWN0aW9uLCBzbyB0aGF0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBjYW4KLS4gICAgICAgICAgYmUgbWFkZSBqdXN0IGJ5IGFkZGluZyBpbiBhbiBvcmRpbmFyeSBvZmZzZXQgKGUuZy4sIHN1bjMgYS5vdXQpLgotLiAgICAgICAgICBTb21lIGZvcm1hdHMgbGVhdmUgdGhlIGRpc3BsYWNlbWVudCBwYXJ0IG9mIGFuIGluc3RydWN0aW9uCi0uICAgICAgICAgIGVtcHR5IChlLmcuLCBtODhrIGJjcyk7IHRoaXMgZmxhZyBzaWduYWxzIHRoZSBmYWN0Lip9Ci0uICBib29sZWFuIHBjcmVsX29mZnNldDsKLS4KLS59OwotCi0qLwotCi0vKgotRlVOQ1RJT04KLQlUaGUgSE9XVE8gTWFjcm8KLQotREVTQ1JJUFRJT04KLQlUaGUgSE9XVE8gZGVmaW5lIGlzIGhvcnJpYmxlIGFuZCB3aWxsIGdvIGF3YXkuCi0KLQotLiNkZWZpbmUgSE9XVE8oQywgUixTLEIsIFAsIEJJLCBPLCBTRiwgTkFNRSwgSU5QTEFDRSwgTUFTS1NSQywgTUFTS0RTVCwgUEMpIFwKLS4gIHsodW5zaWduZWQpQyxSLFMsQiwgUCwgQkksIE8sU0YsTkFNRSxJTlBMQUNFLE1BU0tTUkMsTUFTS0RTVCxQQ30KLQotREVTQ1JJUFRJT04KLQlBbmQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0b3RhbGx5IG1hZ2ljIHdheS4gQnV0IGZvciB0aGUKLQltb21lbnQsIHdlIGFyZSBjb21wYXRpYmxlLCBzbyBkbyBpdCB0aGlzIHdheS4KLQotCi0uI2RlZmluZSBORVdIT1dUTyggRlVOQ1RJT04sIE5BTUUsU0laRSxSRUwsSU4pIEhPV1RPKDAsMCxTSVpFLDAsUkVMLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCxGVU5DVElPTiwgTkFNRSxmYWxzZSwwLDAsSU4pCi0uCi0KLURFU0NSSVBUSU9OCi0JVGhpcyBpcyB1c2VkIHRvIGZpbGwgaW4gYW4gZW1wdHkgaG93dG8gZW50cnkgaW4gYW4gYXJyYXkuCi0KLS4jZGVmaW5lIEVNUFRZX0hPV1RPKEMpIFwKLS4gIEhPV1RPKChDKSwwLDAsMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsTlVMTCxOVUxMLGZhbHNlLDAsMCxmYWxzZSkKLS4KLQotREVTQ1JJUFRJT04KLQlIZWxwZXIgcm91dGluZSB0byB0dXJuIGEgc3ltYm9sIGludG8gYSByZWxvY2F0aW9uIHZhbHVlLgotCi0uI2RlZmluZSBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbCkgICAgICBcCi0uICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0uICBpZiAoc3ltYm9sICE9IChhc3ltYm9sICopTlVMTCkgeyAgICAgICAgICAgICBcCi0uICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpIHsgXAotLiAgICAgIHJlbG9jYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOyAgICAgICAgICAgICAgXAotLiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLiAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotLn0KLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9yZWxvY19zaXplCi0KLVNZTk9QU0lTCi0JdW5zaWduZWQgaW50IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG9fdHlwZSAqKTsKLQotREVTQ1JJUFRJT04KLQlGb3IgYSByZWxvY19ob3d0b190eXBlIHRoYXQgb3BlcmF0ZXMgb24gYSBmaXhlZCBudW1iZXIgb2YgYnl0ZXMsCi0JdGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb3BlcmF0ZWQgb24uCi0gKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOiByZXR1cm4gMTsKLSAgICBjYXNlIDE6IHJldHVybiAyOwotICAgIGNhc2UgMjogcmV0dXJuIDQ7Ci0gICAgY2FzZSAzOiByZXR1cm4gMDsKLSAgICBjYXNlIDQ6IHJldHVybiA4OwotICAgIGNhc2UgODogcmV0dXJuIDE2OwotICAgIGNhc2UgLTI6IHJldHVybiA0OwotICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotICAgIH0KLX0KLQotLyoKLVRZUEVERUYKLQlhcmVsZW50X2NoYWluCi0KLURFU0NSSVBUSU9OCi0KLQlIb3cgcmVsb2NzIGFyZSB0aWVkIHRvZ2V0aGVyIGluIGFuIDw8YXNlY3Rpb24+PjoKLQotLnR5cGVkZWYgc3RydWN0IHJlbGVudF9jaGFpbiB7Ci0uICBhcmVsZW50IHJlbGVudDsKLS4gIHN0cnVjdCAgIHJlbGVudF9jaGFpbiAqbmV4dDsKLS59IGFyZWxlbnRfY2hhaW47Ci0KLSovCi0KLS8qIE5fT05FUyBwcm9kdWNlcyBOIG9uZSBiaXRzLCB3aXRob3V0IG92ZXJmbG93aW5nIG1hY2hpbmUgYXJpdGhtZXRpYy4gICovCi0jZGVmaW5lIE5fT05FUyhuKSAoKCgoKGJmZF92bWEpIDEgPDwgKChuKSAtIDEpKSAtIDEpIDw8IDEpIHwgMSkKLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NoZWNrX292ZXJmbG93Ci0KLVNZTk9QU0lTCi0JYmZkX3JlbG9jX3N0YXR1c190eXBlCi0JCWJmZF9jaGVja19vdmVyZmxvdwotCQkJKGVudW0gY29tcGxhaW5fb3ZlcmZsb3cgaG93LAotCQkJIHVuc2lnbmVkIGludCBiaXRzaXplLAotCQkJIHVuc2lnbmVkIGludCByaWdodHNoaWZ0LAotCQkJIHVuc2lnbmVkIGludCBhZGRyc2l6ZSwKLQkJCSBiZmRfdm1hIHJlbG9jYXRpb24pOwotCi1ERVNDUklQVElPTgotCVBlcmZvcm0gb3ZlcmZsb3cgY2hlY2tpbmcgb24gQHZhcntyZWxvY2F0aW9ufSB3aGljaCBoYXMKLQlAdmFye2JpdHNpemV9IHNpZ25pZmljYW50IGJpdHMgYW5kIHdpbGwgYmUgc2hpZnRlZCByaWdodCBieQotCUB2YXJ7cmlnaHRzaGlmdH0gYml0cywgb24gYSBtYWNoaW5lIHdpdGggYWRkcmVzc2VzIGNvbnRhaW5pbmcKLQlAdmFye2FkZHJzaXplfSBzaWduaWZpY2FudCBiaXRzLiAgVGhlIHJlc3VsdCBpcyBlaXRoZXIgb2YKLQlAY29kZXtiZmRfcmVsb2Nfb2t9IG9yIEBjb2Rle2JmZF9yZWxvY19vdmVyZmxvd30uCi0KLSovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2NoZWNrX292ZXJmbG93IChob3csIGJpdHNpemUsIHJpZ2h0c2hpZnQsIGFkZHJzaXplLCByZWxvY2F0aW9uKQotICAgICBlbnVtIGNvbXBsYWluX292ZXJmbG93IGhvdzsKLSAgICAgdW5zaWduZWQgaW50IGJpdHNpemU7Ci0gICAgIHVuc2lnbmVkIGludCByaWdodHNoaWZ0OwotICAgICB1bnNpZ25lZCBpbnQgYWRkcnNpemU7Ci0gICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLXsKLSAgYmZkX3ZtYSBmaWVsZG1hc2ssIGFkZHJtYXNrLCBzaWdubWFzaywgc3MsIGE7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotCi0gIGEgPSByZWxvY2F0aW9uOwotCi0gIC8qIE5vdGU6IEJJVFNJWkUgc2hvdWxkIGFsd2F5cyBiZSA8PSBBRERSU0laRSwgYnV0IGluIGNhc2UgaXQncyBub3QsCi0gICAgIHdlJ2xsIGJlIHBlcm1pc3NpdmU6IGV4dHJhIGJpdHMgaW4gdGhlIGZpZWxkIG1hc2sgd2lsbAotICAgICBhdXRvbWF0aWNhbGx5IGV4dGVuZCB0aGUgYWRkcmVzcyBtYXNrIGZvciBwdXJwb3NlcyBvZiB0aGUKLSAgICAgb3ZlcmZsb3cgY2hlY2suICAqLwotICBmaWVsZG1hc2sgPSBOX09ORVMgKGJpdHNpemUpOwotICBhZGRybWFzayA9IE5fT05FUyAoYWRkcnNpemUpIHwgZmllbGRtYXNrOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGNvbXBsYWluX292ZXJmbG93X2RvbnQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkOgotICAgICAgLyogSWYgYW55IHNpZ24gYml0cyBhcmUgc2V0LCBhbGwgc2lnbiBiaXRzIG11c3QgYmUgc2V0LiAgVGhhdAotICAgICAgICAgaXMsIEEgbXVzdCBiZSBhIHZhbGlkIG5lZ2F0aXZlIGFkZHJlc3MgYWZ0ZXIgc2hpZnRpbmcuICAqLwotICAgICAgYSA9IChhICYgYWRkcm1hc2spID4+IHJpZ2h0c2hpZnQ7Ci0gICAgICBzaWdubWFzayA9IH4gKGZpZWxkbWFzayA+PiAxKTsKLSAgICAgIHNzID0gYSAmIHNpZ25tYXNrOwotICAgICAgaWYgKHNzICE9IDAgJiYgc3MgIT0gKChhZGRybWFzayA+PiByaWdodHNoaWZ0KSAmIHNpZ25tYXNrKSkKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkOgotICAgICAgLyogV2UgaGF2ZSBhbiBvdmVyZmxvdyBpZiB0aGUgYWRkcmVzcyBkb2VzIG5vdCBmaXQgaW4gdGhlIGZpZWxkLiAgKi8KLSAgICAgIGEgPSAoYSAmIGFkZHJtYXNrKSA+PiByaWdodHNoaWZ0OwotICAgICAgaWYgKChhICYgfiBmaWVsZG1hc2spICE9IDApCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZDoKLSAgICAgIC8qIEJpdGZpZWxkcyBhcmUgc29tZXRpbWVzIHNpZ25lZCwgc29tZXRpbWVzIHVuc2lnbmVkLiAgV2UKLSAgICAgICAgIG92ZXJmbG93IGlmIHRoZSB2YWx1ZSBoYXMgc29tZSwgYnV0IG5vdCBhbGwsIGJpdHMgc2V0IG91dHNpZGUKLSAgICAgICAgIHRoZSBmaWVsZCwgb3IgaWYgaXQgaGFzIGFueSBiaXRzIHNldCBvdXRzaWRlIHRoZSBmaWVsZCBidXQKLSAgICAgICAgIHRoZSBzaWduIGJpdCBpcyBub3Qgc2V0LiAgKi8KLSAgICAgIGEgPj49IHJpZ2h0c2hpZnQ7Ci0gICAgICBpZiAoKGEgJiB+IGZpZWxkbWFzaykgIT0gMCkKLQl7Ci0JICBzaWdubWFzayA9IChmaWVsZG1hc2sgPj4gMSkgKyAxOwotCSAgc3MgPSAoc2lnbm1hc2sgPDwgcmlnaHRzaGlmdCkgLSAxOwotCSAgaWYgKChzcyB8IHJlbG9jYXRpb24pICE9IH4gKGJmZF92bWEpIDApCi0JICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBmbGFnOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfcGVyZm9ybV9yZWxvY2F0aW9uCi0KLVNZTk9QU0lTCi0JYmZkX3JlbG9jX3N0YXR1c190eXBlCi0gICAgICAgICAgICAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgKGJmZCAqYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQVFIgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkgY2hhciAqKmVycm9yX21lc3NhZ2UpOwotCi1ERVNDUklQVElPTgotCUlmIEB2YXJ7b3V0cHV0X2JmZH0gaXMgc3VwcGxpZWQgdG8gdGhpcyBmdW5jdGlvbiwgdGhlCi0JZ2VuZXJhdGVkIGltYWdlIHdpbGwgYmUgcmVsb2NhdGFibGU7IHRoZSByZWxvY2F0aW9ucyBhcmUKLQljb3BpZWQgdG8gdGhlIG91dHB1dCBmaWxlIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGNoYW5nZWQgdG8KLQlyZWZsZWN0IHRoZSBuZXcgc3RhdGUgb2YgdGhlIHdvcmxkLiBUaGVyZSBhcmUgdHdvIHdheXMgb2YKLQlyZWZsZWN0aW5nIHRoZSByZXN1bHRzIG9mIHBhcnRpYWwgbGlua2FnZSBpbiBhbiBvdXRwdXQgZmlsZToKLQlieSBtb2RpZnlpbmcgdGhlIG91dHB1dCBkYXRhIGluIHBsYWNlLCBhbmQgYnkgbW9kaWZ5aW5nIHRoZQotCXJlbG9jYXRpb24gcmVjb3JkLiAgU29tZSBuYXRpdmUgZm9ybWF0cyAoZS5nLiwgYmFzaWMgYS5vdXQgYW5kCi0JYmFzaWMgY29mZikgaGF2ZSBubyB3YXkgb2Ygc3BlY2lmeWluZyBhbiBhZGRlbmQgaW4gdGhlCi0JcmVsb2NhdGlvbiB0eXBlLCBzbyB0aGUgYWRkZW5kIGhhcyB0byBnbyBpbiB0aGUgb3V0cHV0IGRhdGEuCi0JVGhpcyBpcyBubyBiaWcgZGVhbCBzaW5jZSBpbiB0aGVzZSBmb3JtYXRzIHRoZSBvdXRwdXQgZGF0YQotCXNsb3Qgd2lsbCBhbHdheXMgYmUgYmlnIGVub3VnaCBmb3IgdGhlIGFkZGVuZC4gQ29tcGxleCByZWxvYwotCXR5cGVzIHdpdGggYWRkZW5kcyB3ZXJlIGludmVudGVkIHRvIHNvbHZlIGp1c3QgdGhpcyBwcm9ibGVtLgotCVRoZSBAdmFye2Vycm9yX21lc3NhZ2V9IGFyZ3VtZW50IGlzIHNldCB0byBhbiBlcnJvciBtZXNzYWdlIGlmCi0JdGhpcyByZXR1cm4gQGNvZGV7YmZkX3JlbG9jX2Rhbmdlcm91c30uCi0KLSovCi0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChhYmZkLCByZWxvY19lbnRyeSwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJCWVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLSAgYXN5bWJvbCAqc3ltYm9sOwotCi0gIHN5bWJvbCA9ICoocmVsb2NfZW50cnktPnN5bV9wdHJfcHRyKTsKLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHJldHVybiBhbiBlcnJvciBpZgotICAgICB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkLiAgQW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sIGlzCi0gICAgIGNvbnNpZGVyZWQgdG8gaGF2ZSBhIHZhbHVlIG9mIHplcm8gKFNWUjQgQUJJLCBwLiA0LTI3KS4gICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDAKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIGZsYWcgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIElmIHRoZXJlIGlzIGEgZnVuY3Rpb24gc3VwcGxpZWQgdG8gaGFuZGxlIHRoaXMgcmVsb2NhdGlvbiB0eXBlLAotICAgICBjYWxsIGl0LiAgSXQnbGwgcmV0dXJuIGBiZmRfcmVsb2NfY29udGludWUnIGlmIGZ1cnRoZXIgcHJvY2Vzc2luZwotICAgICBjYW4gYmUgZG9uZS4gICovCi0gIGlmIChob3d0by0+c3BlY2lhbF9mdW5jdGlvbikKLSAgICB7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29udDsKLSAgICAgIGNvbnQgPSBob3d0by0+c3BlY2lhbF9mdW5jdGlvbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQkgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkJCSAgICAgIGVycm9yX21lc3NhZ2UpOwotICAgICAgaWYgKGNvbnQgIT0gYmZkX3JlbG9jX2NvbnRpbnVlKQotCXJldHVybiBjb250OwotICAgIH0KLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotCi0gIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICYmIGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0gICAgb3V0cHV0X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKLSAgICAgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCi0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgV2Ugd2FudCB0byBzZXQgUkVMT0NBVElPTgotCSB0byB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGFuZCB0aGUKLQkgbG9jYXRpb24uICBSRUxPQ0FUSU9OIGlzIGFscmVhZHkgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4KLQotCSBXZSBzdGFydCBieSBzdWJ0cmFjdGluZyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nCi0JIHRoZSBsb2NhdGlvbi4KLQotCSBJZiBwY3JlbF9vZmZzZXQgaXMgc2V0LCB3ZSBtdXN0IGZ1cnRoZXIgc3VidHJhY3QgdGhlIHBvc2l0aW9uCi0JIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBTb21lIHRhcmdldHMgYXJyYW5nZSBmb3IKLQkgdGhlIGFkZGVuZCB0byBiZSB0aGUgbmVnYXRpdmUgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbgotCSB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBleGFtcGxlLCBpMzg2LWFvdXQgZG9lcyB0aGlzLiAgRm9yCi0JIGkzODYtYW91dCwgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgU29tZSBvdGhlciB0YXJnZXRzIGRvIG5vdAotCSBpbmNsdWRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb247IGZvciBleGFtcGxlLCBtODhrYmNzLAotCSBvciBFTEYuICBGb3IgdGhvc2UgdGFyZ2V0cywgcGNyZWxfb2Zmc2V0IGlzIHRydWUuCi0KLQkgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGVuIHdlIG11c3QgZW5zdXJlCi0JIHRoYXQgdGhpcyByZWxvYyB3aWxsIGJlIGNvcnJlY3RseSBjb21wdXRlZCB3aGVuIHRoZSBmaW5hbAotCSByZWxvY2F0aW9uIGlzIGRvbmUuICBJZiBwY3JlbF9vZmZzZXQgaXMgZmFsc2Ugd2Ugd2FudCB0byB3aW5kCi0JIHVwIHdpdGggdGhlIG5lZ2F0aXZlIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24sCi0JIHdoaWNoIG1lYW5zIHdlIG11c3QgYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYnkgdGhlIGNoYW5nZQotCSBpbiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIHRydWUKLQkgd2UgZG8gbm90IHdhbnQgdG8gYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYXQgYWxsLgotCi0JIEZJWE1FOiBUaGlzIHNlZW1zIGxvZ2ljYWwgdG8gbWUsIGJ1dCBmb3IgdGhlIGNhc2Ugb2YKLQkgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQgaXQgaXMgbm90IHdoYXQgdGhlIGNvZGUKLQkgYWN0dWFsbHkgZG9lcy4gIEkgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgaXQsIGJlY2F1c2UgaXQgc2VlbXMKLQkgZmFyIHRvbyBsaWtlbHkgdGhhdCBzb21ldGhpbmcgd2lsbCBicmVhay4gICovCi0KLSAgICAgIHJlbG9jYXRpb24gLT0KLQlpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQgPT0gdHJ1ZSkKLQlyZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0JewotCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24KLQkgICAgIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgICAgIGlucGxhY2UgdG8gcmVmbGVjdCB3aGF0IHdlIG5vdyBrbm93LiAgKi8KLQkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIHJldHVybiBmbGFnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBidXQgaW5wbGFjZSwgc28gbW9kaWZ5IHRoZQotCSAgICAgcmVsb2MgcmVjb3JkIGEgYml0LgotCi0JICAgICBJZiB3ZSd2ZSByZWxvY2F0ZWQgd2l0aCBhIHN5bWJvbCB3aXRoIGEgc2VjdGlvbiwgY2hhbmdlCi0JICAgICBpbnRvIGEgcmVmIHRvIHRoZSBzZWN0aW9uIGJlbG9uZ2luZyB0byB0aGUgc3ltYm9sLiAgKi8KLQotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotCSAgLyogV1RGPz8gKi8KLQkgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0JICAgICAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAieGNvZmYtcG93ZXJtYWMiKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiY29mZi1JbnRlbC1saXR0bGUiKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiY29mZi1JbnRlbC1iaWciKSAhPSAwKQotCSAgICB7Ci0jaWYgMQotCSAgICAgIC8qIEZvciBtNjhrLWNvZmYsIHRoZSBhZGRlbmQgd2FzIGJlaW5nIHN1YnRyYWN0ZWQgdHdpY2UgZHVyaW5nCi0JCSByZWxvY2F0aW9uIHdpdGggLXIuICBSZW1vdmluZyB0aGUgbGluZSBiZWxvdyB0aGlzIGNvbW1lbnQKLQkJIGZpeGVzIHRoYXQgcHJvYmxlbTsgc2VlIFBSIDI5NTMuCi0KLUhvd2V2ZXIsIElhbiB3cm90ZSB0aGUgZm9sbG93aW5nLCByZWdhcmRpbmcgcmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3csCi13aGljaCBleHBsYWlucyB3aHkgaXQgaXMgc3RpbGwgZW5hYmxlZDogIC0tZGptCi0KLUlmIHlvdSBwdXQgYSBwYXRjaCBsaWtlIHRoYXQgaW50byBCRkQgeW91IG5lZWQgdG8gY2hlY2sgYWxsIHRoZSBDT0ZGCi1saW5rZXJzLiAgSSBhbSBmYWlybHkgY2VydGFpbiB0aGF0IHBhdGNoIHdpbGwgYnJlYWsgY29mZi1pMzg2IChlLmcuLAotU0NPKTsgc2VlIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYyB3aGVyZSBJIHdvcmtlZCBhcm91bmQgdGhlCi1wcm9ibGVtIGluIGEgZGlmZmVyZW50IHdheS4gIFRoZXJlIG1heSB2ZXJ5IHdlbGwgYmUgYSByZWFzb24gdGhhdCB0aGUKLWNvZGUgd29ya3MgYXMgaXQgZG9lcy4KLQotSG1tbS4gIFRoZSBmaXJzdCBvYnZpb3VzIHBvaW50IGlzIHRoYXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBzaG91bGQKLW5vdCBoYXZlIGFueSB0ZXN0cyB0aGF0IGRlcGVuZCB1cG9uIHRoZSBmbGF2b3VyLiAgSXQncyBzZWVtIGxpa2UKLWVudGlyZWx5IHRoZSB3cm9uZyBwbGFjZSBmb3Igc3VjaCBhIHRoaW5nLiAgVGhlIHNlY29uZCBvYnZpb3VzIHBvaW50Ci1pcyB0aGF0IHRoZSBjdXJyZW50IGNvZGUgaWdub3JlcyB0aGUgcmVsb2MgYWRkZW5kIHdoZW4gcHJvZHVjaW5nCi1yZWxvY2F0ZWFibGUgb3V0cHV0IGZvciBDT0ZGLiAgVGhhdCdzIHBlY3VsaWFyLiAgSW4gZmFjdCwgSSByZWFsbHkKLWhhdmUgbm8gaWRlYSB3aGF0IHRoZSBwb2ludCBvZiB0aGUgbGluZSB5b3Ugd2FudCB0byByZW1vdmUgaXMuCi0KLUEgdHlwaWNhbCBDT0ZGIHJlbG9jIHN1YnRyYWN0cyB0aGUgb2xkIHZhbHVlIG9mIHRoZSBzeW1ib2wgYW5kIGFkZHMgaW4KLXRoZSBuZXcgdmFsdWUgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBvYmplY3QgZmlsZSAoaWYgaXQncyBhIHBjCi1yZWxhdGl2ZSByZWxvYyBpdCBhZGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN5bWJvbCB2YWx1ZSBhbmQgdGhlCi1sb2NhdGlvbikuICBXaGVuIHJlbG9jYXRpbmcgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGF0IHByb3BlcnR5LgotCi1CRkQgaGFuZGxlcyB0aGlzIGJ5IHNldHRpbmcgdGhlIGFkZGVuZCB0byB0aGUgbmVnYXRpdmUgb2YgdGhlIG9sZAotdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFVuZm9ydHVuYXRlbHkgaXQgaGFuZGxlcyBjb21tb24gc3ltYm9scyBpbiBhCi1ub24tc3RhbmRhcmQgd2F5IChpdCBkb2Vzbid0IHN1YnRyYWN0IHRoZSBvbGQgdmFsdWUpIGJ1dCB0aGF0J3MgYQotZGlmZmVyZW50IHN0b3J5ICh3ZSBjYW4ndCBjaGFuZ2UgaXQgd2l0aG91dCBsb3NpbmcgYmFja3dhcmQKLWNvbXBhdGliaWxpdHkgd2l0aCBvbGQgb2JqZWN0IGZpbGVzKSAoY29mZi1pMzg2IGRvZXMgc3VidHJhY3QgdGhlIG9sZAotdmFsdWUsIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBleGlzdGluZyBjb2ZmLWkzODYgdGFyZ2V0cywgbGlrZSBTQ08pLgotCi1TbyBldmVyeXRoaW5nIHdvcmtzIGZpbmUgd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBXaGVuCi13ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGxvZ2ljYWxseSB3ZSBzaG91bGQgZG8gZXhhY3RseQotd2hhdCB3ZSBkbyB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoZXJlZm9yZSwgeW91cgotcGF0Y2ggaXMgY29ycmVjdC4gIEluIGZhY3QsIGl0IHNob3VsZCBwcm9iYWJseSBhbHdheXMganVzdCBzZXQKLXJlbG9jX2VudHJ5LT5hZGRlbmQgdG8gMCBmb3IgYWxsIGNhc2VzLCBzaW5jZSBpdCBpcywgaW4gZmFjdCwgZ29pbmcgdG8KLWFkZCB0aGUgdmFsdWUgaW50byB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIHdvbid0IGh1cnQgdGhlIENPRkYgY29kZSwKLXdoaWNoIGRvZXNuJ3QgdXNlIHRoZSBhZGRlbmQ7IEknbSBub3Qgc3VyZSB3aGF0IGl0IHdpbGwgZG8gdG8gb3RoZXIKLWZvcm1hdHMgKHRoZSB0aGluZyB0byBjaGVjayBmb3Igd291bGQgYmUgd2hldGhlciBhbnkgZm9ybWF0cyBib3RoIHVzZQotdGhlIGFkZGVuZCBhbmQgc2V0IHBhcnRpYWxfaW5wbGFjZSkuCi0KLVdoZW4gSSB3YW50ZWQgdG8gbWFrZSBjb2ZmLWkzODYgcHJvZHVjZSByZWxvY2F0ZWFibGUgb3V0cHV0LCBJIHJhbgotaW50byB0aGUgcHJvYmxlbSB0aGF0IHlvdSBhcmUgcnVubmluZyBpbnRvOiBJIHdhbnRlZCB0byByZW1vdmUgdGhhdAotbGluZS4gIFJhdGhlciB0aGFuIHJpc2sgaXQsIEkgbWFkZSB0aGUgY29mZi1pMzg2IHJlbG9jcyB1c2UgYSBzcGVjaWFsCi1mdW5jdGlvbjsgaXQncyBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMuICBUaGUgZnVuY3Rpb24KLXNwZWNpZmljYWxseSBhZGRzIHRoZSBhZGRlbmQgZmllbGQgaW50byB0aGUgb2JqZWN0IGZpbGUsIGtub3dpbmcgdGhhdAotYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBpcyBub3QgZ29pbmcgdG8uICBJZiB5b3UgcmVtb3ZlIHRoYXQgbGluZSwgdGhlbgotY29mZi1pMzg2LmMgd2lsbCB3aW5kIHVwIGFkZGluZyB0aGUgYWRkZW5kIGZpZWxkIGluIHR3aWNlLiAgSXQncwotdHJpdmlhbCB0byBmaXg7IGl0IGp1c3QgbmVlZHMgdG8gYmUgZG9uZS4KLQotVGhlIHByb2JsZW0gd2l0aCByZW1vdmluZyB0aGUgbGluZSBpcyBqdXN0IHRoYXQgaXQgbWF5IGJyZWFrIHNvbWUKLXdvcmtpbmcgY29kZS4gIFdpdGggQkZEIGl0J3MgaGFyZCB0byBiZSBzdXJlIG9mIGFueXRoaW5nLiAgVGhlIHJpZ2h0Ci13YXkgdG8gZGVhbCB3aXRoIHRoaXMgaXMgc2ltcGx5IHRvIGJ1aWxkIGFuZCB0ZXN0IGF0IGxlYXN0IGFsbCB0aGUKLXN1cHBvcnRlZCBDT0ZGIHRhcmdldHMuICBJdCBzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkIGlmIHRpbWUgYW5kIGRpc2sKLXNwYWNlIGNvbnN1bWluZy4gIEZvciBlYWNoIHRhcmdldDoKLSAgICAxKSBidWlsZCB0aGUgbGlua2VyCi0gICAgMikgZ2VuZXJhdGUgc29tZSBleGVjdXRhYmxlLCBhbmQgbGluayBpdCB1c2luZyAtciAoSSB3b3VsZAotICAgICAgIHByb2JhYmx5IHVzZSBwYXJhbm9pYS5vIGFuZCBsaW5rIGFnYWluc3QgbmV3bGliL2xpYmMuYSwgd2hpY2gKLSAgICAgICBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgdGFyZ2V0cyB3b3VsZCBiZSBhdmFpbGFibGUgaW4KLSAgICAgICAvdXNyL2N5Z251cy9wcm9ncmVzc2l2ZS9ILWhvc3QvdGFyZ2V0L2xpYi9saWJjLmEpLgotICAgIDMpIG1ha2UgdGhlIGNoYW5nZSB0byByZWxvYy5jCi0gICAgNCkgcmVidWlsZCB0aGUgbGlua2VyCi0gICAgNSkgcmVwZWF0IHN0ZXAgMgotICAgIDYpIGlmIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGVzIGFyZSB0aGUgc2FtZSwgeW91IGhhdmUgYXQgbGVhc3QKLSAgICAgICBtYWRlIGl0IG5vIHdvcnNlCi0gICAgNykgaWYgdGhleSBhcmUgZGlmZmVyZW50IHlvdSBoYXZlIHRvIGZpZ3VyZSBvdXQgd2hpY2ggdmVyc2lvbiBpcwotICAgICAgIHJpZ2h0Ci0qLwotCSAgICAgIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSNlbmRpZgotCSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLSAgICB9Ci0KLSAgLyogRklYTUU6IFRoaXMgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aGUgdmFsdWUKLSAgICAgbWlnaHQgaGF2ZSBvdmVyZmxvd2VkIGJlZm9yZSB3ZSBnZXQgaGVyZS4gIEZvciBhIGNvcnJlY3QgY2hlY2sgd2UKLSAgICAgbmVlZCB0byBjb21wdXRlIHRoZSB2YWx1ZSBpbiBhIHNpemUgbGFyZ2VyIHRoYW4gYml0c2l6ZSwgYnV0IHdlCi0gICAgIGNhbid0IHJlYXNvbmFibHkgZG8gdGhhdCBmb3IgYSByZWxvYyB0aGUgc2FtZSBzaXplIGFzIGEgaG9zdAotICAgICBtYWNoaW5lIHdvcmQuCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYWxzbyBkbyBvdmVyZmxvdyBjaGVja2luZyBvbiB0aGUgcmVzdWx0IGFmdGVyCi0gICAgIGFkZGluZyBpbiB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udAotICAgICAgJiYgZmxhZyA9PSBiZmRfcmVsb2Nfb2spCi0gICAgZmxhZyA9IGJmZF9jaGVja19vdmVyZmxvdyAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93LAotCQkJICAgICAgIGhvd3RvLT5iaXRzaXplLAotCQkJICAgICAgIGhvd3RvLT5yaWdodHNoaWZ0LAotCQkJICAgICAgIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGFiZmQpLAotCQkJICAgICAgIHJlbG9jYXRpb24pOwotCi0gIC8qCi0gICAgRWl0aGVyIHdlIGFyZSByZWxvY2F0aW5nIGFsbCB0aGUgd2F5LCBvciB3ZSBkb24ndCB3YW50IHRvIGFwcGx5Ci0gICAgdGhlIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IChwcm9iYWJseSBiZWNhdXNlIHRoZXJlIGlzbid0Ci0gICAgYW55IHJvb20gaW4gdGhlIG91dHB1dCBmb3JtYXQgdG8gZGVzY3JpYmUgYWRkZW5kcyB0byByZWxvY3MpCi0gICAgKi8KLQotICAvKiBUaGUgY2FzdCB0byBiZmRfdm1hIGF2b2lkcyBhIGJ1ZyBpbiB0aGUgQWxwaGEgT1NGLzEgQyBjb21waWxlcgotICAgICAoT1NGIHZlcnNpb24gMS4zLCBjb21waWxlciB2ZXJzaW9uIDMuMTEpLiAgSXQgbWlzY29tcGlsZXMgdGhlCi0gICAgIGZvbGxvd2luZyBwcm9ncmFtOgotCi0gICAgIHN0cnVjdCBzdHIKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGludCBpMDsKLSAgICAgfSBzID0geyAwIH07Ci0KLSAgICAgaW50Ci0gICAgIG1haW4gKCkKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKLQotICAgICAgIHggPSAweDEwMDAwMDAwMDsKLSAgICAgICB4IDw8PSAodW5zaWduZWQgbG9uZykgcy5pMDsKLSAgICAgICBpZiAoeCA9PSAwKQotCSBwcmludGYgKCJmYWlsZWRcbiIpOwotICAgICAgIGVsc2UKLQkgcHJpbnRmICgic3VjY2VlZGVkICglbHgpXG4iLCB4KTsKLSAgICAgfQotICAgICAqLwotCi0gIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLQotICAvKiBTaGlmdCBldmVyeXRoaW5nIHVwIHRvIHdoZXJlIGl0J3MgZ29pbmcgdG8gYmUgdXNlZCAqLwotCi0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotCi0gIC8qIFdhaXQgZm9yIHRoZSBkYXkgd2hlbiBhbGwgaGF2ZSB0aGUgbWFzayBpbiB0aGVtICovCi0KLSAgLyogV2hhdCB3ZSBkbzoKLSAgICAgaSBpbnN0cnVjdGlvbiB0byBiZSBsZWZ0IGFsb25lCi0gICAgIG8gb2Zmc2V0IHdpdGhpbiBpbnN0cnVjdGlvbgotICAgICByIHJlbG9jYXRpb24gb2Zmc2V0IHRvIGFwcGx5Ci0gICAgIFMgc3JjIG1hc2sKLSAgICAgRCBkc3QgbWFzawotICAgICBOIH5kc3QgbWFzawotICAgICBBIHBhcnQgMQotICAgICBCIHBhcnQgMgotICAgICBSIHJlc3VsdAotCi0gICAgIERvIHRoaXM6Ci0gICAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gICAgICAgIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICAgICAgICAgIFMgUyBTIFMgUyAgICB0byBnZXQgdGhlIHNpemUgb2Zmc2V0IHdlIHdhbnQKLSAgICAgKyAgIHIgciByIHIgciByIHIgciByIHIgIHRvIGdldCB0aGUgZmluYWwgdmFsdWUgdG8gcGxhY2UKLSAgICAgYW5kICAgICAgICAgICBEIEQgRCBEIEQgIHRvIGNob3AgdG8gcmlnaHQgc2l6ZQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBBIEEgQSBBIEEKLSAgICAgQW5kIHRoaXM6Ci0gICAgIC4uLiAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICBOIE4gTiBOIE4gICAgICAgICAgICBnZXQgaW5zdHJ1Y3Rpb24KLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgLi4uICAgQiBCIEIgQiBCCi0KLSAgICAgQW5kIHRoZW46Ci0gICAgIEIgQiBCIEIgQgotICAgICBvciAgICAgICAgICAgICAgQSBBIEEgQSBBCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIFIgUiBSIFIgUiBSIFIgUiBSIFIgICAgICAgIHB1dCBpbnRvIGJmZF9wdXQ8c2l6ZT4KLSAgICAgKi8KLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICggKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgIHJlbG9jYXRpb24pICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICB7Ci0JY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCAoY2hhciAqKSBkYXRhICsgYWRkcik7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF84IChhYmZkLCB4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgYWRkcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIHsKLQlzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzE2IChhYmZkLCB4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgYWRkcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAtMjoKLSAgICAgIHsKLQlsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQlET0lUICh4KTsKLQliZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIC0xOgotICAgICAgewotCWxvbmcgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0JcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMTYgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIERvIG5vdGhpbmcgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotI2lmZGVmIEJGRDY0Ci0gICAgICB7Ci0JYmZkX3ZtYSB4ID0gYmZkX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzY0IChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICAgICAgfQotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdGhlcjsKLSAgICB9Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9pbnN0YWxsX3JlbG9jYXRpb24KLQotU1lOT1BTSVMKLQliZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLSAgICAgICAgICAgICAgICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBUUiBkYXRhLCBiZmRfdm1hIGRhdGFfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0JCQkgY2hhciAqKmVycm9yX21lc3NhZ2UpOwotCi1ERVNDUklQVElPTgotCVRoaXMgbG9va3MgcmVtYXJrYWJseSBsaWtlIDw8YmZkX3BlcmZvcm1fcmVsb2NhdGlvbj4+LCBleGNlcHQgaXQKLQlkb2VzIG5vdCBleHBlY3QgdGhhdCB0aGUgc2VjdGlvbiBjb250ZW50cyBoYXZlIGJlZW4gZmlsbGVkIGluLgotCUkuZS4sIGl0J3Mgc3VpdGFibGUgZm9yIHVzZSB3aGVuIGNyZWF0aW5nLCByYXRoZXIgdGhhbiBhcHBseWluZwotCWEgcmVsb2NhdGlvbi4KLQotCUZvciBub3csIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmVzZXJ2ZWQgZm9yIHRoZQotCWFzc2VtYmxlci4KLQotKi8KLQotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9pbnN0YWxsX3JlbG9jYXRpb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBkYXRhX3N0YXJ0LCBkYXRhX3N0YXJ0X29mZnNldCwKLQkJCWlucHV0X3NlY3Rpb24sIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIFBUUiBkYXRhX3N0YXJ0OwotICAgICBiZmRfdm1hIGRhdGFfc3RhcnRfb2Zmc2V0OwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfdm1hIG91dHB1dF9iYXNlID0gMDsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0gIGFzZWN0aW9uICpyZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb247Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0KLSAgc3ltYm9sID0gKihyZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIpOwotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBhIGZ1bmN0aW9uIHN1cHBsaWVkIHRvIGhhbmRsZSB0aGlzIHJlbG9jYXRpb24gdHlwZSwKLSAgICAgY2FsbCBpdC4gIEl0J2xsIHJldHVybiBgYmZkX3JlbG9jX2NvbnRpbnVlJyBpZiBmdXJ0aGVyIHByb2Nlc3NpbmcKLSAgICAgY2FuIGJlIGRvbmUuICAqLwotICBpZiAoaG93dG8tPnNwZWNpYWxfZnVuY3Rpb24pCi0gICAgewotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvbnQ7Ci0gIAotICAgICAgLyogWFhYIC0gVGhlIHNwZWNpYWxfZnVuY3Rpb24gY2FsbHMgaGF2ZW4ndCBiZWVuIGZpeGVkIHVwIHRvIGRlYWwKLQkgd2l0aCBjcmVhdGluZyBuZXcgcmVsb2NhdGlvbnMgYW5kIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgY29udCA9IGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLAotCQkJCSAgICAgIC8qIFhYWCAtIE5vbi1wb3J0YWJsZSEgKi8KLQkJCQkgICAgICAoKGJmZF9ieXRlICopIGRhdGFfc3RhcnQKLQkJCQkgICAgICAgLSBkYXRhX3N0YXJ0X29mZnNldCksCi0JCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgYWJmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gICAgICBpZiAoY29udCAhPSBiZmRfcmVsb2NfY29udGludWUpCi0JcmV0dXJuIGNvbnQ7Ci0gICAgfQotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbiA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgLyogQ29udmVydCBpbnB1dC1zZWN0aW9uLXJlbGF0aXZlIHN5bWJvbCB2YWx1ZSB0byBhYnNvbHV0ZS4gICovCi0gIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQotICAgIG91dHB1dF9iYXNlID0gMDsKLSAgZWxzZQotICAgIG91dHB1dF9iYXNlID0gcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAvKiBBZGQgaW4gc3VwcGxpZWQgYWRkZW5kLiAgKi8KLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04KLQkgdG8gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBhbmQgdGhlCi0JIGxvY2F0aW9uLiAgUkVMT0NBVElPTiBpcyBhbHJlYWR5IHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wuCi0KLQkgV2Ugc3RhcnQgYnkgc3VidHJhY3RpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gY29udGFpbmluZwotCSB0aGUgbG9jYXRpb24uCi0KLQkgSWYgcGNyZWxfb2Zmc2V0IGlzIHNldCwgd2UgbXVzdCBmdXJ0aGVyIHN1YnRyYWN0IHRoZSBwb3NpdGlvbgotCSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgU29tZSB0YXJnZXRzIGFycmFuZ2UgZm9yCi0JIHRoZSBhZGRlbmQgdG8gYmUgdGhlIG5lZ2F0aXZlIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb24KLQkgd2l0aGluIHRoZSBzZWN0aW9uOyBmb3IgZXhhbXBsZSwgaTM4Ni1hb3V0IGRvZXMgdGhpcy4gIEZvcgotCSBpMzg2LWFvdXQsIHBjcmVsX29mZnNldCBpcyBmYWxzZS4gIFNvbWUgb3RoZXIgdGFyZ2V0cyBkbyBub3QKLQkgaW5jbHVkZSB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uOyBmb3IgZXhhbXBsZSwgbTg4a2JjcywKLQkgb3IgRUxGLiAgRm9yIHRob3NlIHRhcmdldHMsIHBjcmVsX29mZnNldCBpcyB0cnVlLgotCi0JIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlbiB3ZSBtdXN0IGVuc3VyZQotCSB0aGF0IHRoaXMgcmVsb2Mgd2lsbCBiZSBjb3JyZWN0bHkgY29tcHV0ZWQgd2hlbiB0aGUgZmluYWwKLQkgcmVsb2NhdGlvbiBpcyBkb25lLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlIHdlIHdhbnQgdG8gd2luZAotCSB1cCB3aXRoIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLAotCSB3aGljaCBtZWFucyB3ZSBtdXN0IGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGJ5IHRoZSBjaGFuZ2UKLQkgaW4gdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIElmIHBjcmVsX29mZnNldCBpcyB0cnVlCi0JIHdlIGRvIG5vdCB3YW50IHRvIGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGF0IGFsbC4KLQotCSBGSVhNRTogVGhpcyBzZWVtcyBsb2dpY2FsIHRvIG1lLCBidXQgZm9yIHRoZSBjYXNlIG9mCi0JIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0IGl0IGlzIG5vdCB3aGF0IHRoZSBjb2RlCi0JIGFjdHVhbGx5IGRvZXMuICBJIGRvbid0IHdhbnQgdG8gY2hhbmdlIGl0LCBiZWNhdXNlIGl0IHNlZW1zCi0JIGZhciB0b28gbGlrZWx5IHRoYXQgc29tZXRoaW5nIHdpbGwgYnJlYWsuICAqLwotCi0gICAgICByZWxvY2F0aW9uIC09Ci0JaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0ID09IHRydWUgJiYgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSB0cnVlKQotCXJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotCi0gIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCi0JIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGZsYWc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYnV0IGlucGxhY2UsIHNvIG1vZGlmeSB0aGUKLQkgcmVsb2MgcmVjb3JkIGEgYml0LgotCi0JIElmIHdlJ3ZlIHJlbG9jYXRlZCB3aXRoIGEgc3ltYm9sIHdpdGggYSBzZWN0aW9uLCBjaGFuZ2UKLQkgaW50byBhIHJlZiB0byB0aGUgc2VjdGlvbiBiZWxvbmdpbmcgdG8gdGhlIHN5bWJvbC4gICovCi0KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgIC8qIFdURj8/ICovCi0gICAgICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotCSAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSAhPSAwCi0JICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJ4Y29mZi1wb3dlcm1hYyIpICE9IDAKLQkgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImNvZmYtSW50ZWwtbGl0dGxlIikgIT0gMAotCSAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiY29mZi1JbnRlbC1iaWciKSAhPSAwKQotCXsKLSNpZiAxCi0vKiBGb3IgbTY4ay1jb2ZmLCB0aGUgYWRkZW5kIHdhcyBiZWluZyBzdWJ0cmFjdGVkIHR3aWNlIGR1cmluZwotICAgcmVsb2NhdGlvbiB3aXRoIC1yLiAgUmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3cgdGhpcyBjb21tZW50Ci0gICBmaXhlcyB0aGF0IHByb2JsZW07IHNlZSBQUiAyOTUzLgotCi1Ib3dldmVyLCBJYW4gd3JvdGUgdGhlIGZvbGxvd2luZywgcmVnYXJkaW5nIHJlbW92aW5nIHRoZSBsaW5lIGJlbG93LAotd2hpY2ggZXhwbGFpbnMgd2h5IGl0IGlzIHN0aWxsIGVuYWJsZWQ6ICAtLWRqbQotCi1JZiB5b3UgcHV0IGEgcGF0Y2ggbGlrZSB0aGF0IGludG8gQkZEIHlvdSBuZWVkIHRvIGNoZWNrIGFsbCB0aGUgQ09GRgotbGlua2Vycy4gIEkgYW0gZmFpcmx5IGNlcnRhaW4gdGhhdCBwYXRjaCB3aWxsIGJyZWFrIGNvZmYtaTM4NiAoZS5nLiwKLVNDTyk7IHNlZSBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMgd2hlcmUgSSB3b3JrZWQgYXJvdW5kIHRoZQotcHJvYmxlbSBpbiBhIGRpZmZlcmVudCB3YXkuICBUaGVyZSBtYXkgdmVyeSB3ZWxsIGJlIGEgcmVhc29uIHRoYXQgdGhlCi1jb2RlIHdvcmtzIGFzIGl0IGRvZXMuCi0KLUhtbW0uICBUaGUgZmlyc3Qgb2J2aW91cyBwb2ludCBpcyB0aGF0IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gc2hvdWxkCi1ub3QgaGF2ZSBhbnkgdGVzdHMgdGhhdCBkZXBlbmQgdXBvbiB0aGUgZmxhdm91ci4gIEl0J3Mgc2VlbSBsaWtlCi1lbnRpcmVseSB0aGUgd3JvbmcgcGxhY2UgZm9yIHN1Y2ggYSB0aGluZy4gIFRoZSBzZWNvbmQgb2J2aW91cyBwb2ludAotaXMgdGhhdCB0aGUgY3VycmVudCBjb2RlIGlnbm9yZXMgdGhlIHJlbG9jIGFkZGVuZCB3aGVuIHByb2R1Y2luZwotcmVsb2NhdGVhYmxlIG91dHB1dCBmb3IgQ09GRi4gIFRoYXQncyBwZWN1bGlhci4gIEluIGZhY3QsIEkgcmVhbGx5Ci1oYXZlIG5vIGlkZWEgd2hhdCB0aGUgcG9pbnQgb2YgdGhlIGxpbmUgeW91IHdhbnQgdG8gcmVtb3ZlIGlzLgotCi1BIHR5cGljYWwgQ09GRiByZWxvYyBzdWJ0cmFjdHMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCBhZGRzIGluCi10aGUgbmV3IHZhbHVlIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUgKGlmIGl0J3MgYSBwYwotcmVsYXRpdmUgcmVsb2MgaXQgYWRkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHRoZQotbG9jYXRpb24pLiAgV2hlbiByZWxvY2F0aW5nIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhhdCBwcm9wZXJ0eS4KLQotQkZEIGhhbmRsZXMgdGhpcyBieSBzZXR0aW5nIHRoZSBhZGRlbmQgdG8gdGhlIG5lZ2F0aXZlIG9mIHRoZSBvbGQKLXZhbHVlIG9mIHRoZSBzeW1ib2wuICBVbmZvcnR1bmF0ZWx5IGl0IGhhbmRsZXMgY29tbW9uIHN5bWJvbHMgaW4gYQotbm9uLXN0YW5kYXJkIHdheSAoaXQgZG9lc24ndCBzdWJ0cmFjdCB0aGUgb2xkIHZhbHVlKSBidXQgdGhhdCdzIGEKLWRpZmZlcmVudCBzdG9yeSAod2UgY2FuJ3QgY2hhbmdlIGl0IHdpdGhvdXQgbG9zaW5nIGJhY2t3YXJkCi1jb21wYXRpYmlsaXR5IHdpdGggb2xkIG9iamVjdCBmaWxlcykgKGNvZmYtaTM4NiBkb2VzIHN1YnRyYWN0IHRoZSBvbGQKLXZhbHVlLCB0byBiZSBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgY29mZi1pMzg2IHRhcmdldHMsIGxpa2UgU0NPKS4KLQotU28gZXZlcnl0aGluZyB3b3JrcyBmaW5lIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgV2hlbgotd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBsb2dpY2FsbHkgd2Ugc2hvdWxkIGRvIGV4YWN0bHkKLXdoYXQgd2UgZG8gd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGVyZWZvcmUsIHlvdXIKLXBhdGNoIGlzIGNvcnJlY3QuICBJbiBmYWN0LCBpdCBzaG91bGQgcHJvYmFibHkgYWx3YXlzIGp1c3Qgc2V0Ci1yZWxvY19lbnRyeS0+YWRkZW5kIHRvIDAgZm9yIGFsbCBjYXNlcywgc2luY2UgaXQgaXMsIGluIGZhY3QsIGdvaW5nIHRvCi1hZGQgdGhlIHZhbHVlIGludG8gdGhlIG9iamVjdCBmaWxlLiAgVGhpcyB3b24ndCBodXJ0IHRoZSBDT0ZGIGNvZGUsCi13aGljaCBkb2Vzbid0IHVzZSB0aGUgYWRkZW5kOyBJJ20gbm90IHN1cmUgd2hhdCBpdCB3aWxsIGRvIHRvIG90aGVyCi1mb3JtYXRzICh0aGUgdGhpbmcgdG8gY2hlY2sgZm9yIHdvdWxkIGJlIHdoZXRoZXIgYW55IGZvcm1hdHMgYm90aCB1c2UKLXRoZSBhZGRlbmQgYW5kIHNldCBwYXJ0aWFsX2lucGxhY2UpLgotCi1XaGVuIEkgd2FudGVkIHRvIG1ha2UgY29mZi1pMzg2IHByb2R1Y2UgcmVsb2NhdGVhYmxlIG91dHB1dCwgSSByYW4KLWludG8gdGhlIHByb2JsZW0gdGhhdCB5b3UgYXJlIHJ1bm5pbmcgaW50bzogSSB3YW50ZWQgdG8gcmVtb3ZlIHRoYXQKLWxpbmUuICBSYXRoZXIgdGhhbiByaXNrIGl0LCBJIG1hZGUgdGhlIGNvZmYtaTM4NiByZWxvY3MgdXNlIGEgc3BlY2lhbAotZnVuY3Rpb247IGl0J3MgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jLiAgVGhlIGZ1bmN0aW9uCi1zcGVjaWZpY2FsbHkgYWRkcyB0aGUgYWRkZW5kIGZpZWxkIGludG8gdGhlIG9iamVjdCBmaWxlLCBrbm93aW5nIHRoYXQKLWJmZF9pbnN0YWxsX3JlbG9jYXRpb24gaXMgbm90IGdvaW5nIHRvLiAgSWYgeW91IHJlbW92ZSB0aGF0IGxpbmUsIHRoZW4KLWNvZmYtaTM4Ni5jIHdpbGwgd2luZCB1cCBhZGRpbmcgdGhlIGFkZGVuZCBmaWVsZCBpbiB0d2ljZS4gIEl0J3MKLXRyaXZpYWwgdG8gZml4OyBpdCBqdXN0IG5lZWRzIHRvIGJlIGRvbmUuCi0KLVRoZSBwcm9ibGVtIHdpdGggcmVtb3ZpbmcgdGhlIGxpbmUgaXMganVzdCB0aGF0IGl0IG1heSBicmVhayBzb21lCi13b3JraW5nIGNvZGUuICBXaXRoIEJGRCBpdCdzIGhhcmQgdG8gYmUgc3VyZSBvZiBhbnl0aGluZy4gIFRoZSByaWdodAotd2F5IHRvIGRlYWwgd2l0aCB0aGlzIGlzIHNpbXBseSB0byBidWlsZCBhbmQgdGVzdCBhdCBsZWFzdCBhbGwgdGhlCi1zdXBwb3J0ZWQgQ09GRiB0YXJnZXRzLiAgSXQgc2hvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZCBpZiB0aW1lIGFuZCBkaXNrCi1zcGFjZSBjb25zdW1pbmcuICBGb3IgZWFjaCB0YXJnZXQ6Ci0gICAgMSkgYnVpbGQgdGhlIGxpbmtlcgotICAgIDIpIGdlbmVyYXRlIHNvbWUgZXhlY3V0YWJsZSwgYW5kIGxpbmsgaXQgdXNpbmcgLXIgKEkgd291bGQKLSAgICAgICBwcm9iYWJseSB1c2UgcGFyYW5vaWEubyBhbmQgbGluayBhZ2FpbnN0IG5ld2xpYi9saWJjLmEsIHdoaWNoCi0gICAgICAgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIHRhcmdldHMgd291bGQgYmUgYXZhaWxhYmxlIGluCi0gICAgICAgL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvSC1ob3N0L3RhcmdldC9saWIvbGliYy5hKS4KLSAgICAzKSBtYWtlIHRoZSBjaGFuZ2UgdG8gcmVsb2MuYwotICAgIDQpIHJlYnVpbGQgdGhlIGxpbmtlcgotICAgIDUpIHJlcGVhdCBzdGVwIDIKLSAgICA2KSBpZiB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlcyBhcmUgdGhlIHNhbWUsIHlvdSBoYXZlIGF0IGxlYXN0Ci0gICAgICAgbWFkZSBpdCBubyB3b3JzZQotICAgIDcpIGlmIHRoZXkgYXJlIGRpZmZlcmVudCB5b3UgaGF2ZSB0byBmaWd1cmUgb3V0IHdoaWNoIHZlcnNpb24gaXMKLSAgICAgICByaWdodAotKi8KLQkgIHJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSNlbmRpZgotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCX0KLSAgICB9Ci0KLSAgLyogRklYTUU6IFRoaXMgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aGUgdmFsdWUKLSAgICAgbWlnaHQgaGF2ZSBvdmVyZmxvd2VkIGJlZm9yZSB3ZSBnZXQgaGVyZS4gIEZvciBhIGNvcnJlY3QgY2hlY2sgd2UKLSAgICAgbmVlZCB0byBjb21wdXRlIHRoZSB2YWx1ZSBpbiBhIHNpemUgbGFyZ2VyIHRoYW4gYml0c2l6ZSwgYnV0IHdlCi0gICAgIGNhbid0IHJlYXNvbmFibHkgZG8gdGhhdCBmb3IgYSByZWxvYyB0aGUgc2FtZSBzaXplIGFzIGEgaG9zdAotICAgICBtYWNoaW5lIHdvcmQuCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYWxzbyBkbyBvdmVyZmxvdyBjaGVja2luZyBvbiB0aGUgcmVzdWx0IGFmdGVyCi0gICAgIGFkZGluZyBpbiB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkKLSAgICBmbGFnID0gYmZkX2NoZWNrX292ZXJmbG93IChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3csCi0JCQkgICAgICAgaG93dG8tPmJpdHNpemUsCi0JCQkgICAgICAgaG93dG8tPnJpZ2h0c2hpZnQsCi0JCQkgICAgICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCksCi0JCQkgICAgICAgcmVsb2NhdGlvbik7Ci0KLSAgLyoKLSAgICBFaXRoZXIgd2UgYXJlIHJlbG9jYXRpbmcgYWxsIHRoZSB3YXksIG9yIHdlIGRvbid0IHdhbnQgdG8gYXBwbHkKLSAgICB0aGUgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgKHByb2JhYmx5IGJlY2F1c2UgdGhlcmUgaXNuJ3QKLSAgICBhbnkgcm9vbSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB0byBkZXNjcmliZSBhZGRlbmRzIHRvIHJlbG9jcykKLSAgICAqLwotCi0gIC8qIFRoZSBjYXN0IHRvIGJmZF92bWEgYXZvaWRzIGEgYnVnIGluIHRoZSBBbHBoYSBPU0YvMSBDIGNvbXBpbGVyCi0gICAgIChPU0YgdmVyc2lvbiAxLjMsIGNvbXBpbGVyIHZlcnNpb24gMy4xMSkuICBJdCBtaXNjb21waWxlcyB0aGUKLSAgICAgZm9sbG93aW5nIHByb2dyYW06Ci0KLSAgICAgc3RydWN0IHN0cgotICAgICB7Ci0gICAgICAgdW5zaWduZWQgaW50IGkwOwotICAgICB9IHMgPSB7IDAgfTsKLQotICAgICBpbnQKLSAgICAgbWFpbiAoKQotICAgICB7Ci0gICAgICAgdW5zaWduZWQgbG9uZyB4OwotCi0gICAgICAgeCA9IDB4MTAwMDAwMDAwOwotICAgICAgIHggPDw9ICh1bnNpZ25lZCBsb25nKSBzLmkwOwotICAgICAgIGlmICh4ID09IDApCi0JIHByaW50ZiAoImZhaWxlZFxuIik7Ci0gICAgICAgZWxzZQotCSBwcmludGYgKCJzdWNjZWVkZWQgKCVseClcbiIsIHgpOwotICAgICB9Ci0gICAgICovCi0KLSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIGhvd3RvLT5yaWdodHNoaWZ0OwotCi0gIC8qIFNoaWZ0IGV2ZXJ5dGhpbmcgdXAgdG8gd2hlcmUgaXQncyBnb2luZyB0byBiZSB1c2VkICovCi0KLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0KLSAgLyogV2FpdCBmb3IgdGhlIGRheSB3aGVuIGFsbCBoYXZlIHRoZSBtYXNrIGluIHRoZW0gKi8KLQotICAvKiBXaGF0IHdlIGRvOgotICAgICBpIGluc3RydWN0aW9uIHRvIGJlIGxlZnQgYWxvbmUKLSAgICAgbyBvZmZzZXQgd2l0aGluIGluc3RydWN0aW9uCi0gICAgIHIgcmVsb2NhdGlvbiBvZmZzZXQgdG8gYXBwbHkKLSAgICAgUyBzcmMgbWFzawotICAgICBEIGRzdCBtYXNrCi0gICAgIE4gfmRzdCBtYXNrCi0gICAgIEEgcGFydCAxCi0gICAgIEIgcGFydCAyCi0gICAgIFIgcmVzdWx0Ci0KLSAgICAgRG8gdGhpczoKLSAgICAgaSBpIGkgaSBpIG8gbyBvIG8gbyAgICAgICAgZnJvbSBiZmRfZ2V0PHNpemU+Ci0gICAgIGFuZCAgICAgICAgICAgUyBTIFMgUyBTICAgIHRvIGdldCB0aGUgc2l6ZSBvZmZzZXQgd2Ugd2FudAotICAgICArICAgciByIHIgciByIHIgciByIHIgciAgdG8gZ2V0IHRoZSBmaW5hbCB2YWx1ZSB0byBwbGFjZQotICAgICBhbmQgICAgICAgICAgIEQgRCBEIEQgRCAgdG8gY2hvcCB0byByaWdodCBzaXplCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIEEgQSBBIEEgQQotICAgICBBbmQgdGhpczoKLSAgICAgLi4uICAgaSBpIGkgaSBpIG8gbyBvIG8gbyAgZnJvbSBiZmRfZ2V0PHNpemU+Ci0gICAgIGFuZCAgIE4gTiBOIE4gTiAgICAgICAgICAgIGdldCBpbnN0cnVjdGlvbgotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAuLi4gICBCIEIgQiBCIEIKLQotICAgICBBbmQgdGhlbjoKLSAgICAgQiBCIEIgQiBCCi0gICAgIG9yICAgICAgICAgICAgICBBIEEgQSBBIEEKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgUiBSIFIgUiBSIFIgUiBSIFIgUiAgICAgICAgcHV0IGludG8gYmZkX3B1dDxzaXplPgotICAgICAqLwotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCAoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyAgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKQotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgZGF0YV9zdGFydCArIChhZGRyIC0gZGF0YV9zdGFydF9vZmZzZXQpOwotCi0gIHN3aXRjaCAoaG93dG8tPnNpemUpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHsKLQljaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIChjaGFyICopIGRhdGEpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfOCAoYWJmZCwgeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIHsKLQlzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMTYgKGFiZmQsIHgsICh1bnNpZ25lZCBjaGFyICopIGRhdGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgewotCWxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIC0yOgotICAgICAgewotCWxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLQlyZWxvY2F0aW9uID0gLXJlbG9jYXRpb247Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8zMiAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICAvKiBEbyBub3RoaW5nICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSAgICAgIHsKLQliZmRfdm1hIHggPSBiZmRfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF82NCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci0gICAgfQotCi0gIHJldHVybiBmbGFnOwotfQotCi0vKiBUaGlzIHJlbG9jYXRpb24gcm91dGluZSBpcyB1c2VkIGJ5IHNvbWUgb2YgdGhlIGJhY2tlbmQgbGlua2Vycy4KLSAgIFRoZXkgZG8gbm90IGNvbnN0cnVjdCBhc3ltYm9sIG9yIGFyZWxlbnQgc3RydWN0dXJlcywgc28gdGhlcmUgaXMgbm8KLSAgIHJlYXNvbiBmb3IgdGhlbSB0byB1c2UgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIEFsc28sCi0gICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIHNvIGhhY2tlZCB1cCBpdCBpcyBlYXNpZXIgdG8gd3JpdGUgYSBuZXcKLSAgIGZ1bmN0aW9uIHRoYW4gdG8gdHJ5IHRvIGRlYWwgd2l0aCBpdC4KLQotICAgVGhpcyByb3V0aW5lIGRvZXMgYSBmaW5hbCByZWxvY2F0aW9uLiAgV2hldGhlciBpdCBpcyB1c2VmdWwgZm9yIGEKLSAgIHJlbG9jYXRlYWJsZSBsaW5rIGRlcGVuZHMgdXBvbiBob3cgdGhlIG9iamVjdCBmb3JtYXQgZGVmaW5lcwotICAgcmVsb2NhdGlvbnMuCi0KLSAgIEZJWE1FOiBUaGlzIHJvdXRpbmUgaWdub3JlcyBhbnkgc3BlY2lhbF9mdW5jdGlvbiBpbiB0aGUgSE9XVE8sCi0gICBzaW5jZSB0aGUgZXhpc3Rpbmcgc3BlY2lhbF9mdW5jdGlvbiB2YWx1ZXMgaGF2ZSBiZWVuIHdyaXR0ZW4gZm9yCi0gICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLgotCi0gICBIT1dUTyBpcyB0aGUgcmVsb2MgaG93dG8gaW5mb3JtYXRpb24uCi0gICBJTlBVVF9CRkQgaXMgdGhlIEJGRCB3aGljaCB0aGUgcmVsb2MgYXBwbGllcyB0by4KLSAgIElOUFVUX1NFQ1RJT04gaXMgdGhlIHNlY3Rpb24gd2hpY2ggdGhlIHJlbG9jIGFwcGxpZXMgdG8uCi0gICBDT05URU5UUyBpcyB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24uCi0gICBBRERSRVNTIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvYyB3aXRoaW4gSU5QVVRfU0VDVElPTi4KLSAgIFZBTFVFIGlzIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHRoZSByZWxvYyByZWZlcnMgdG8uCi0gICBBRERFTkQgaXMgdGhlIGFkZGVuZCBvZiB0aGUgcmVsb2MuICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIGFkZHJlc3MsCi0JCQkgIHZhbHVlLCBhZGRlbmQpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcy4gICovCi0gIGlmIChhZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgYmFzaWMgcmVsb2NhdGlvbgotICAgICBhZ2FpbnN0IGEgc3ltYm9sLiAgV2Ugd2FudCB0byBjb21wdXRlIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHRvCi0gICAgIHJlbG9jYXRlIHRvLiAgVGhpcyBpcyBqdXN0IFZBTFVFLCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCwgcGx1cwotICAgICBBRERFTkQsIGFueSBhZGRlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxvYy4gICovCi0gIHJlbG9jYXRpb24gPSB2YWx1ZSArIGFkZGVuZDsKLQotICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBQQyByZWxhdGl2ZSwgd2Ugd2FudCB0byBzZXQgUkVMT0NBVElPTiB0bwotICAgICB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIChjdXJyZW50bHkgaW4gUkVMT0NBVElPTikgYW5kIHRoZQotICAgICBsb2NhdGlvbiB3ZSBhcmUgcmVsb2NhdGluZy4gIFNvbWUgdGFyZ2V0cyAoZS5nLiwgaTM4Ni1hb3V0KQotICAgICBhcnJhbmdlIGZvciB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gdG8gYmUgdGhlIG5lZ2F0aXZlIG9mIHRoZQotICAgICBvZmZzZXQgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbjsgZm9yIHN1Y2ggdGFyZ2V0cwotICAgICBwY3JlbF9vZmZzZXQgaXMgZmFsc2UuICBPdGhlciB0YXJnZXRzIChlLmcuLCBtODhrYmNzIG9yIEVMRikKLSAgICAgc2ltcGx5IGxlYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhcyB6ZXJvOyBmb3Igc3VjaAotICAgICB0YXJnZXRzIHBjcmVsX29mZnNldCBpcyB0cnVlLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlIHdlIGRvIG5vdAotICAgICBuZWVkIHRvIHN1YnRyYWN0IG91dCB0aGUgb2Zmc2V0IG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlCi0gICAgIHNlY3Rpb24gKHdoaWNoIGlzIGp1c3QgQUREUkVTUykuICAqLwotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JcmVsb2NhdGlvbiAtPSBhZGRyZXNzOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgY29udGVudHMgKyBhZGRyZXNzKTsKLX0KLQotLyogUmVsb2NhdGUgYSBnaXZlbiBsb2NhdGlvbiB1c2luZyBhIGdpdmVuIHZhbHVlIGFuZCBob3d0by4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYXRpb24pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Ci17Ci0gIGludCBzaXplOwotICBiZmRfdm1hIHggPSAwOwotICBib29sZWFuIG92ZXJmbG93OwotICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdCA9IGhvd3RvLT5yaWdodHNoaWZ0OwotICB1bnNpZ25lZCBpbnQgYml0cG9zID0gaG93dG8tPmJpdHBvczsKLQotICAvKiBJZiB0aGUgc2l6ZSBpcyBuZWdhdGl2ZSwgbmVnYXRlIFJFTE9DQVRJT04uICBUaGlzIGlzbid0IHZlcnkKLSAgICAgZ2VuZXJhbC4gICovCi0gIGlmIChob3d0by0+c2l6ZSA8IDApCi0gICAgcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOwotCi0gIC8qIEdldCB0aGUgdmFsdWUgd2UgYXJlIGdvaW5nIHRvIHJlbG9jYXRlLiAgKi8KLSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAwOgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSAxOgotICAgICAgeCA9IGJmZF9nZXRfOCAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICB4ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0jaWZkZWYgQkZENjQKLSAgICAgIHggPSBiZmRfZ2V0XzY0IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZvciBvdmVyZmxvdy4gIEZJWE1FOiBXZSBtYXkgZHJvcCBiaXRzIGR1cmluZyB0aGUgYWRkaXRpb24KLSAgICAgd2hpY2ggd2UgZG9uJ3QgY2hlY2sgZm9yLiAgV2UgbXVzdCBlaXRoZXIgY2hlY2sgYXQgZXZlcnkgc2luZ2xlCi0gICAgIG9wZXJhdGlvbiwgd2hpY2ggd291bGQgYmUgdGVkaW91cywgb3Igd2UgbXVzdCBkbyB0aGUgY29tcHV0YXRpb25zCi0gICAgIGluIGEgdHlwZSBsYXJnZXIgdGhhbiBiZmRfdm1hLCB3aGljaCB3b3VsZCBiZSBpbmVmZmljaWVudC4gICovCi0gIG92ZXJmbG93ID0gZmFsc2U7Ci0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkZHJtYXNrLCBmaWVsZG1hc2ssIHNpZ25tYXNrLCBzczsKLSAgICAgIGJmZF92bWEgYSwgYiwgc3VtOwotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlcyB0byBiZSBhZGRlZCB0b2dldGhlci4gIEZvciBzaWduZWQgYW5kIHVuc2lnbmVkCi0gICAgICAgICByZWxvY2F0aW9ucywgd2UgYXNzdW1lIHRoYXQgYWxsIHZhbHVlcyBzaG91bGQgYmUgdHJ1bmNhdGVkIHRvCi0gICAgICAgICB0aGUgc2l6ZSBvZiBhbiBhZGRyZXNzLiAgRm9yIGJpdGZpZWxkcywgYWxsIHRoZSBiaXRzIG1hdHRlci4KLSAgICAgICAgIFNlZSBhbHNvIGJmZF9jaGVja19vdmVyZmxvdy4gICovCi0gICAgICBmaWVsZG1hc2sgPSBOX09ORVMgKGhvd3RvLT5iaXRzaXplKTsKLSAgICAgIGFkZHJtYXNrID0gTl9PTkVTIChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChpbnB1dF9iZmQpKSB8IGZpZWxkbWFzazsKLSAgICAgIGEgPSByZWxvY2F0aW9uOwotICAgICAgYiA9IHggJiBob3d0by0+c3JjX21hc2s7Ci0KLSAgICAgIHN3aXRjaCAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93KQotCXsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDoKLQkgIGEgPSAoYSAmIGFkZHJtYXNrKSA+PiByaWdodHNoaWZ0OwotCi0JICAvKiBJZiBhbnkgc2lnbiBiaXRzIGFyZSBzZXQsIGFsbCBzaWduIGJpdHMgbXVzdCBiZSBzZXQuCi0JICAgICBUaGF0IGlzLCBBIG11c3QgYmUgYSB2YWxpZCBuZWdhdGl2ZSBhZGRyZXNzIGFmdGVyCi0JICAgICBzaGlmdGluZy4gICovCi0JICBzaWdubWFzayA9IH4gKGZpZWxkbWFzayA+PiAxKTsKLQkgIHNzID0gYSAmIHNpZ25tYXNrOwotCSAgaWYgKHNzICE9IDAgJiYgc3MgIT0gKChhZGRybWFzayA+PiByaWdodHNoaWZ0KSAmIHNpZ25tYXNrKSkKLQkgICAgb3ZlcmZsb3cgPSB0cnVlOwotCi0JICAvKiBXZSBvbmx5IG5lZWQgdGhpcyBuZXh0IGJpdCBvZiBjb2RlIGlmIHRoZSBzaWduIGJpdCBvZiBCCi0gICAgICAgICAgICAgaXMgYmVsb3cgdGhlIHNpZ24gYml0IG9mIEEuICBUaGlzIHdvdWxkIG9ubHkgaGFwcGVuIGlmCi0gICAgICAgICAgICAgU1JDX01BU0sgaGFkIGZld2VyIGJpdHMgdGhhbiBCSVRTSVpFLiAgTm90ZSB0aGF0IGlmCi0gICAgICAgICAgICAgU1JDX01BU0sgaGFzIG1vcmUgYml0cyB0aGFuIEJJVFNJWkUsIHdlIGNhbiBnZXQgaW50bwotICAgICAgICAgICAgIHRyb3VibGU7IHdlIHdvdWxkIG5lZWQgdG8gdmVyaWZ5IHRoYXQgQiBpcyBpbiByYW5nZSwgYXMKLSAgICAgICAgICAgICB3ZSBkbyBmb3IgQSBhYm92ZS4gICovCi0JICBzaWdubWFzayA9ICgofiBob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrOwotCSAgaWYgKChiICYgc2lnbm1hc2spICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBTZXQgYWxsIHRoZSBiaXRzIGFib3ZlIHRoZSBzaWduIGJpdC4gICovCi0JICAgICAgYiAtPSBzaWdubWFzayA8PD0gMTsKLQkgICAgfQotCi0JICBiID0gKGIgJiBhZGRybWFzaykgPj4gYml0cG9zOwotCi0JICAvKiBOb3cgd2UgY2FuIGRvIHRoZSBhZGRpdGlvbi4gICovCi0JICBzdW0gPSBhICsgYjsKLQotCSAgLyogU2VlIGlmIHRoZSByZXN1bHQgaGFzIHRoZSBjb3JyZWN0IHNpZ24uICBCaXRzIGFib3ZlIHRoZQotICAgICAgICAgICAgIHNpZ24gYml0IGFyZSBqdW5rIG5vdzsgaWdub3JlIHRoZW0uICBJZiB0aGUgc3VtIGlzCi0gICAgICAgICAgICAgcG9zaXRpdmUsIG1ha2Ugc3VyZSB3ZSBkaWQgbm90IGhhdmUgYWxsIG5lZ2F0aXZlIGlucHV0czsKLSAgICAgICAgICAgICBpZiB0aGUgc3VtIGlzIG5lZ2F0aXZlLCBtYWtlIHN1cmUgd2UgZGlkIG5vdCBoYXZlIGFsbAotICAgICAgICAgICAgIHBvc2l0aXZlIGlucHV0cy4gIFRoZSB0ZXN0IGJlbG93IGxvb2tzIG9ubHkgYXQgdGhlIHNpZ24KLSAgICAgICAgICAgICBiaXRzLCBhbmQgaXQgcmVhbGx5IGp1c3QKLQkgICAgICAgICBTSUdOIChBKSA9PSBTSUdOIChCKSAmJiBTSUdOIChBKSAhPSBTSUdOIChTVU0pCi0JICAgICAqLwotCSAgc2lnbm1hc2sgPSAoZmllbGRtYXNrID4+IDEpICsgMTsKLQkgIGlmICgoKH4gKGEgXiBiKSkgJiAoYSBeIHN1bSkpICYgc2lnbm1hc2spCi0JICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkOgotCSAgLyogQ2hlY2tpbmcgZm9yIGFuIHVuc2lnbmVkIG92ZXJmbG93IGlzIHJlbGF0aXZlbHkgZWFzeToKLSAgICAgICAgICAgICB0cmltIHRoZSBhZGRyZXNzZXMgYW5kIGFkZCwgYW5kIHRyaW0gdGhlIHJlc3VsdCBhcyB3ZWxsLgotICAgICAgICAgICAgIE92ZXJmbG93IGlzIG5vcm1hbGx5IGluZGljYXRlZCB3aGVuIHRoZSByZXN1bHQgZG9lcyBub3QKLSAgICAgICAgICAgICBmaXQgaW4gdGhlIGZpZWxkLiAgSG93ZXZlciwgd2UgYWxzbyBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgICAgICAgICAgIGNhc2Ugd2hlbiwgZS5nLiwgZmllbGRtYXNrIGlzIDB4N2ZmZmZmZmYgb3Igc21hbGxlciwgYW4KLSAgICAgICAgICAgICBpbnB1dCBpcyAweDgwMDAwMDAwLCBhbmQgYmZkX3ZtYSBpcyBvbmx5IDMyIGJpdHM7IHRoZW4gd2UKLSAgICAgICAgICAgICB3aWxsIGdldCBzdW0gPT0gMCwgYnV0IHRoZXJlIGlzIGFuIG92ZXJmbG93LCBzaW5jZSB0aGUKLSAgICAgICAgICAgICBpbnB1dHMgZGlkIG5vdCBmaXQgaW4gdGhlIGZpZWxkLiAgSW5zdGVhZCBvZiBkb2luZyBhCi0gICAgICAgICAgICAgc2VwYXJhdGUgdGVzdCwgd2UgY2FuIGNoZWNrIGZvciB0aGlzIGJ5IG9yLWluZyBpbiB0aGUKLSAgICAgICAgICAgICBvcGVyYW5kcyB3aGVuIHRlc3RpbmcgZm9yIHRoZSBzdW0gb3ZlcmZsb3dpbmcgaXRzIGZpbmFsCi0gICAgICAgICAgICAgZmllbGQuICAqLwotCSAgYSA9IChhICYgYWRkcm1hc2spID4+IHJpZ2h0c2hpZnQ7Ci0JICBiID0gKGIgJiBhZGRybWFzaykgPj4gYml0cG9zOwotCSAgc3VtID0gKGEgKyBiKSAmIGFkZHJtYXNrOwotCSAgaWYgKChhIHwgYiB8IHN1bSkgJiB+IGZpZWxkbWFzaykKLQkgICAgb3ZlcmZsb3cgPSB0cnVlOwotCi0JICBicmVhazsKLQotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ6Ci0JICAvKiBNdWNoIGxpa2UgdW5zaWduZWQsIGV4Y2VwdCBubyB0cmltbWluZyB3aXRoIGFkZHJtYXNrLiAgSW4KLSAgICAgICAgICAgICBhZGRpdGlvbiwgdGhlIHN1bSBvdmVyZmxvd3MgaWYgdGhlcmUgaXMgYSBjYXJyeSBvdXQgb2YKLSAgICAgICAgICAgICB0aGUgYmZkX3ZtYSwgaS5lLiwgdGhlIHN1bSBpcyBsZXNzIHRoYW4gZWl0aGVyIGlucHV0Ci0gICAgICAgICAgICAgb3BlcmFuZC4gICovCi0JICBhID4+PSByaWdodHNoaWZ0OwotCSAgYiA+Pj0gYml0cG9zOwotCi0JICAvKiBCaXRmaWVsZHMgYXJlIHNvbWV0aW1lcyB1c2VkIGZvciBzaWduZWQgbnVtYmVyczsgZm9yCi0gICAgICAgICAgICAgZXhhbXBsZSwgYSAxMy1iaXQgZmllbGQgc29tZXRpbWVzIHJlcHJlc2VudHMgdmFsdWVzIGluCi0gICAgICAgICAgICAgMC4uODE5MSBhbmQgc29tZXRpbWVzIHJlcHJlc2VudHMgdmFsdWVzIGluIC00MDk2Li40MDk1LgotICAgICAgICAgICAgIElmIHRoZSBmaWVsZCBpcyBzaWduZWQgYW5kIGEgaXMgLTQwOTUgKDB4MTAwMSkgYW5kIGIgaXMKLSAgICAgICAgICAgICAtMSAoMHgxZmZmKSwgdGhlIHN1bSBpcyAtNDA5NiAoMHgxMDAwKSwgYnV0ICgweDEwMDEgKwotICAgICAgICAgICAgIDB4MWZmZiBpcyAweDMwMDApLiAgSXQncyBub3QgY2xlYXIgaG93IHRvIGhhbmRsZSB0aGlzCi0gICAgICAgICAgICAgZXZlcnl3aGVyZSwgc2luY2UgdGhlcmUgaXMgbm90IHdheSB0byBrbm93IGhvdyBtYW55IGJpdHMKLSAgICAgICAgICAgICBhcmUgc2lnbmlmaWNhbnQgaW4gdGhlIHJlbG9jYXRpb24sIGJ1dCB0aGUgb3JpZ2luYWwgY29kZQotICAgICAgICAgICAgIGFzc3VtZWQgdGhhdCBpdCB3YXMgZnVsbHkgc2lnbiBleHRlbmRlZCwgYW5kIHdlIHdpbGwga2VlcAotICAgICAgICAgICAgIHRoYXQgYXNzdW1wdGlvbi4gICovCi0JICBzaWdubWFzayA9IChmaWVsZG1hc2sgPj4gMSkgKyAxOwotCi0JICBpZiAoKGEgJiB+IGZpZWxkbWFzaykgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFNvbWUgYml0cyBvdXQgb2YgdGhlIGZpZWxkIGFyZSBzZXQuICBUaGlzIG1pZ2h0IG5vdAotICAgICAgICAgICAgICAgICBiZSBhIHByb2JsZW06IGlmIHRoaXMgaXMgYSBzaWduZWQgYml0ZmllbGQsIGl0IGlzIE9LCi0gICAgICAgICAgICAgICAgIGlmZiBhbGwgdGhlIGhpZ2ggYml0cyBhcmUgc2V0LCBpbmNsdWRpbmcgdGhlIHNpZ24KLSAgICAgICAgICAgICAgICAgYml0LiAgV2UnbGwgdHJ5IHNldHRpbmcgYWxsIGJ1dCB0aGUgbW9zdCBzaWduaWZpY2FudAotICAgICAgICAgICAgICAgICBiaXQgaW4gdGhlIG9yaWdpbmFsIHJlbG9jYXRpb24gdmFsdWU6IGlmIHRoaXMgaXMgYWxsCi0gICAgICAgICAgICAgICAgIG9uZXMsIHdlIGFyZSBPSywgYXNzdW1pbmcgYSBzaWduZWQgYml0ZmllbGQuICAqLwotCSAgICAgIHNzID0gKHNpZ25tYXNrIDw8IHJpZ2h0c2hpZnQpIC0gMTsKLQkgICAgICBpZiAoKHNzIHwgcmVsb2NhdGlvbikgIT0gfiAoYmZkX3ZtYSkgMCkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGEgJj0gZmllbGRtYXNrOwotCSAgICB9Ci0KLQkgIC8qIFdlIGp1c3QgYXNzdW1lIChiICYgfiBmaWVsZG1hc2spID09IDAuICAqLwotCi0JICAvKiBXZSBleHBsaWNpdGx5IHBlcm1pdCB3cmFwIGFyb3VuZCBpZiB0aGlzIHJlbG9jYXRpb24KLQkgICAgIGNvdmVycyB0aGUgaGlnaCBiaXQgb2YgYW4gYWRkcmVzcy4gIFRoZSBMaW51eCBrZXJuZWwKLQkgICAgIHJlbGllcyBvbiBpdCwgYW5kIGl0IGlzIHRoZSBvbmx5IHdheSB0byB3cml0ZSBhc3NlbWJsZXIKLQkgICAgIGNvZGUgd2hpY2ggY2FuIHJ1biB3aGVuIGxvYWRlZCBhdCBhIGxvY2F0aW9uIDB4ODAwMDAwMDAKLQkgICAgIGF3YXkgZnJvbSB0aGUgbG9jYXRpb24gYXQgd2hpY2ggaXQgaXMgbGlua2VkLiAgKi8KLQkgIGlmIChob3d0by0+Yml0c2l6ZSArIHJpZ2h0c2hpZnQKLQkgICAgICA9PSBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChpbnB1dF9iZmQpKQotCSAgICBicmVhazsKLQotCSAgc3VtID0gYSArIGI7Ci0JICBpZiAoc3VtIDwgYSB8fCAoc3VtICYgfiBmaWVsZG1hc2spICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGVyZSB3YXMgYSBjYXJyeSBvdXQsIG9yIHRoZSBmaWVsZCBvdmVyZmxvdy4gIFRlc3QKLSAgICAgICAgICAgICAgICAgZm9yIHNpZ25lZCBvcGVyYW5kcyBhZ2Fpbi4gIEhlcmUgaXMgdGhlIG92ZXJmbG93IHRlc3QKLSAgICAgICAgICAgICAgICAgaXMgYXMgZm9yIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZC4gICovCi0JICAgICAgaWYgKCgofiAoYSBeIGIpKSAmIChhIF4gc3VtKSkgJiBzaWdubWFzaykKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgLyogUHV0IFJFTE9DQVRJT04gaW4gdGhlIHJpZ2h0IGJpdHMuICAqLwotICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgcmlnaHRzaGlmdDsKLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGJpdHBvczsKLQotICAvKiBBZGQgUkVMT0NBVElPTiB0byB0aGUgcmlnaHQgYml0cyBvZiBYLiAgKi8KLSAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spCi0gICAgICAgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIHJlbG9jYXRpb24pICYgaG93dG8tPmRzdF9tYXNrKSk7Ci0KLSAgLyogUHV0IHRoZSByZWxvY2F0ZWQgdmFsdWUgYmFjayBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAwOgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSAxOgotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0jaWZkZWYgQkZENjQKLSAgICAgIGJmZF9wdXRfNjQgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIG92ZXJmbG93ID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rOwotfQotCi0vKgotRE9DREQKLUlOT0RFCi0JaG93dG8gbWFuYWdlciwgICwgdHlwZWRlZiBhcmVsZW50LCBSZWxvY2F0aW9ucwotCi1TRUNUSU9OCi0JVGhlIGhvd3RvIG1hbmFnZXIKLQotCVdoZW4gYW4gYXBwbGljYXRpb24gd2FudHMgdG8gY3JlYXRlIGEgcmVsb2NhdGlvbiwgYnV0IGRvZXNuJ3QKLQlrbm93IHdoYXQgdGhlIHRhcmdldCBtYWNoaW5lIG1pZ2h0IGNhbGwgaXQsIGl0IGNhbiBmaW5kIG91dCBieQotCXVzaW5nIHRoaXMgYml0IG9mIGNvZGUuCi0KLSovCi0KLS8qCi1UWVBFREVGCi0JYmZkX3JlbG9jX2NvZGVfdHlwZQotCi1ERVNDUklQVElPTgotCVRoZSBpbnNpZGVzIG9mIGEgcmVsb2MgY29kZS4gIFRoZSBpZGVhIGlzIHRoYXQsIGV2ZW50dWFsbHksIHRoZXJlCi0Jd2lsbCBiZSBvbmUgZW51bWVyYXRvciBmb3IgZXZlcnkgdHlwZSBvZiByZWxvY2F0aW9uIHdlIGV2ZXIgZG8uCi0JUGFzcyBvbmUgb2YgdGhlc2UgdmFsdWVzIHRvIDw8YmZkX3JlbG9jX3R5cGVfbG9va3VwPj4sIGFuZCBpdCdsbAotCXJldHVybiBhIGhvd3RvIHBvaW50ZXIuCi0KLQlUaGlzIGRvZXMgbWVhbiB0aGF0IHRoZSBhcHBsaWNhdGlvbiBtdXN0IGRldGVybWluZSB0aGUgY29ycmVjdAotCWVudW1lcmF0b3IgdmFsdWU7IHlvdSBjYW4ndCBnZXQgYSBob3d0byBwb2ludGVyIGZyb20gYSByYW5kb20gc2V0Ci0Jb2YgYXR0cmlidXRlcy4KLQotU0VOVU0KLSAgIGJmZF9yZWxvY19jb2RlX3JlYWwKLQotRU5VTQotICBCRkRfUkVMT0NfNjQKLUVOVU1YCi0gIEJGRF9SRUxPQ18zMgotRU5VTVgKLSAgQkZEX1JFTE9DXzI2Ci1FTlVNWAotICBCRkRfUkVMT0NfMjQKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNgotRU5VTVgKLSAgQkZEX1JFTE9DXzE0Ci1FTlVNWAotICBCRkRfUkVMT0NfOAotRU5VTURPQwotICBCYXNpYyBhYnNvbHV0ZSByZWxvY2F0aW9ucyBvZiBOIGJpdHMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzY0X1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ18yNF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzE2X1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMTJfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ184X1BDUkVMCi1FTlVNRE9DCi0gIFBDLXJlbGF0aXZlIHJlbG9jYXRpb25zLiAgU29tZXRpbWVzIHRoZXNlIGFyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcwotb2YgdGhlIHJlbG9jYXRpb24gaXRzZWxmOyBzb21ldGltZXMgdGhleSBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCi10aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSByZWxvY2F0aW9uLiAgSXQgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgdGFyZ2V0LgotCi1UaGUgMjQtYml0IHJlbG9jYXRpb24gaXMgdXNlZCBpbiBzb21lIEludGVsIDk2MCBjb25maWd1cmF0aW9ucy4KLQotRU5VTQotICBCRkRfUkVMT0NfMzJfR09UX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfR09UX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9HT1RfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ18zMl9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNl9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19MTzE2X0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DXzhfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfUExUX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMjRfUExUX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfUExUX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9QTFRfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ18zMl9QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNl9QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19MTzE2X1BMVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfUExUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DXzhfUExUT0ZGCi1FTlVNRE9DCi0gIEZvciBFTEYuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzY4S19HTE9CX0RBVAotRU5VTVgKLSAgQkZEX1JFTE9DXzY4S19KTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DXzY4S19SRUxBVElWRQotRU5VTURPQwotICBSZWxvY2F0aW9ucyB1c2VkIGJ5IDY4SyBFTEYuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzMyX0JBU0VSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNl9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xNl9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfSEkxNl9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ184X0JBU0VSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19SVkEKLUVOVU1ET0MKLSAgTGlua2FnZS10YWJsZSByZWxhdGl2ZS4KLQotRU5VTQotICBCRkRfUkVMT0NfOF9GRm5uCi1FTlVNRE9DCi0gIEFic29sdXRlIDgtYml0IHJlbG9jYXRpb24sIGJ1dCB1c2VkIHRvIGZvcm0gYW4gYWRkcmVzcyBsaWtlIDB4RkZubi4KLQotRU5VTQotICBCRkRfUkVMT0NfMzJfUENSRUxfUzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMgotRU5VTVgKLSAgQkZEX1JFTE9DXzIzX1BDUkVMX1MyCi1FTlVNRE9DCi0gIFRoZXNlIFBDLXJlbGF0aXZlIHJlbG9jYXRpb25zIGFyZSBzdG9yZWQgYXMgd29yZCBkaXNwbGFjZW1lbnRzIC0tCi1pLmUuLCBieXRlIGRpc3BsYWNlbWVudHMgc2hpZnRlZCByaWdodCB0d28gYml0cy4gIFRoZSAzMC1iaXQgd29yZAotZGlzcGxhY2VtZW50ICg8PDMyX1BDUkVMX1MyPj4gLS0gMzIgYml0cywgc2hpZnRlZCAyKSBpcyB1c2VkIG9uIHRoZQotU1BBUkMuICAoU1BBUkMgdG9vbHMgZ2VuZXJhbGx5IHJlZmVyIHRvIHRoaXMgYXMgPDxXRElTUDMwPj4uKSAgVGhlCi1zaWduZWQgMTYtYml0IGRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBNSVBTLCBhbmQgdGhlIDIzLWJpdAotZGlzcGxhY2VtZW50IGlzIHVzZWQgb24gdGhlIEFscGhhLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19ISTIyCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xMAotRU5VTURPQwotICBIaWdoIDIyIGJpdHMgYW5kIGxvdyAxMCBiaXRzIG9mIDMyLWJpdCB2YWx1ZSwgcGxhY2VkIGludG8gbG93ZXIgYml0cyBvZgotdGhlIHRhcmdldCB3b3JkLiAgVGhlc2UgYXJlIHVzZWQgb24gdGhlIFNQQVJDLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19HUFJFTDE2Ci1FTlVNWAotICBCRkRfUkVMT0NfR1BSRUwzMgotRU5VTURPQwotICBGb3Igc3lzdGVtcyB0aGF0IGFsbG9jYXRlIGEgR2xvYmFsIFBvaW50ZXIgcmVnaXN0ZXIsIHRoZXNlIGFyZQotZGlzcGxhY2VtZW50cyBvZmYgdGhhdCByZWdpc3Rlci4gIFRoZXNlIHJlbG9jYXRpb24gdHlwZXMgYXJlCi1oYW5kbGVkIHNwZWNpYWxseSwgYmVjYXVzZSB0aGUgdmFsdWUgdGhlIHJlZ2lzdGVyIHdpbGwgaGF2ZSBpcwotZGVjaWRlZCByZWxhdGl2ZWx5IGxhdGUuCi0KLQotRU5VTQotICBCRkRfUkVMT0NfSTk2MF9DQUxMSgotRU5VTURPQwotICBSZWxvYyB0eXBlcyB1c2VkIGZvciBpOTYwL2Iub3V0LgotCi1FTlVNCi0gIEJGRF9SRUxPQ19OT05FCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQzEzCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfR09UMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QxMwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUEMxMAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19XUExUMzAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19DT1BZCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19KTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfVUEzMgotRU5VTURPQwotICBTUEFSQyBFTEYgcmVsb2NhdGlvbnMuICBUaGVyZSBpcyBwcm9iYWJseSBzb21lIG92ZXJsYXAgd2l0aCBvdGhlcgotICByZWxvY2F0aW9uIHR5cGVzIGFscmVhZHkgZGVmaW5lZC4KLQotRU5VTQotICBCRkRfUkVMT0NfU1BBUkNfQkFTRTEzCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfQkFTRTIyCi1FTlVNRE9DCi0gIEkgdGhpbmsgdGhlc2UgYXJlIHNwZWNpZmljIHRvIFNQQVJDIGEub3V0IChlLmcuLCBTdW4gNCkuCi0KLUVOVU1FUQotICBCRkRfUkVMT0NfU1BBUkNfNjQKLSAgQkZEX1JFTE9DXzY0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ18xMQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX09MTzEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfSEgyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0hNMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19MTTIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUENfSEgyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0hNMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19MTTIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTkKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ183Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfNgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDXzUKLUVOVU1FUVgKLSAgQkZEX1JFTE9DX1NQQVJDX0RJU1A2NAotICBCRkRfUkVMT0NfNjRfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QTFQ2NAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0hJWDIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTE9YMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19INDQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19NNDQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19MNDQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19SRUdJU1RFUgotRU5VTURPQwotICBTUEFSQzY0IHJlbG9jYXRpb25zCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1NQQVJDX1JFVjMyCi1FTlVNRE9DCi0gIFNQQVJDIGxpdHRsZSBlbmRpYW4gcmVsb2NhdGlvbgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNgotRU5VTURPQwotICBBbHBoYSBFQ09GRiBhbmQgRUxGIHJlbG9jYXRpb25zLiAgU29tZSBvZiB0aGVzZSB0cmVhdCB0aGUgc3ltYm9sIG9yCi0gICAgICJhZGRlbmQiIGluIHNvbWUgc3BlY2lhbCB3YXkuCi0gIEZvciBHUERJU1BfSEkxNiAoImdwZGlzcCIpIHJlbG9jYXRpb25zLCB0aGUgc3ltYm9sIGlzIGlnbm9yZWQgd2hlbgotICAgICB3cml0aW5nOyB3aGVuIHJlYWRpbmcsIGl0IHdpbGwgYmUgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sLiAgVGhlCi0gICAgIGFkZGVuZCBpcyB0aGUgZGlzcGxhY2VtZW50IGluIGJ5dGVzIG9mIHRoZSAibGRhIiBpbnN0cnVjdGlvbiBmcm9tCi0gICAgIHRoZSAibGRhaCIgaW5zdHJ1Y3Rpb24gKHdoaWNoIGlzIGF0IHRoZSBhZGRyZXNzIG9mIHRoaXMgcmVsb2MpLgotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTYKLUVOVU1ET0MKLSAgRm9yIEdQRElTUF9MTzE2ICgiaWdub3JlIikgcmVsb2NhdGlvbnMsIHRoZSBzeW1ib2wgaXMgaGFuZGxlZCBhcwotICAgICB3aXRoIEdQRElTUF9ISTE2IHJlbG9jcy4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcgdGhlCi0gICAgIHJlbG9jYXRpb25zIG91dCwgYW5kIGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBmaWxlJ3MgR1AgdmFsdWUgb24KLSAgICAgcmVhZGluZywgZm9yIGNvbnZlbmllbmNlLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9HUERJU1AKLUVOVU1ET0MKLSAgVGhlIEVMRiBHUERJU1AgcmVsb2NhdGlvbiBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBHUERJU1BfSEkxNgotICAgICByZWxvY2F0aW9uIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIGFjY29tcGFueWluZyBHUERJU1BfTE8xNgotICAgICByZWxvY2F0aW9uLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0UKLUVOVU1ET0MKLSAgVGhlIEFscGhhIExJVEVSQUwvTElUVVNFIHJlbG9jcyBhcmUgcHJvZHVjZWQgYnkgYSBzeW1ib2wgcmVmZXJlbmNlOwotICAgICB0aGUgYXNzZW1ibGVyIHR1cm5zIGl0IGludG8gYSBMRFEgaW5zdHJ1Y3Rpb24gdG8gbG9hZCB0aGUgYWRkcmVzcyBvZgotICAgICB0aGUgc3ltYm9sLCBhbmQgdGhlbiBmaWxscyBpbiBhIHJlZ2lzdGVyIGluIHRoZSByZWFsIGluc3RydWN0aW9uLgotCi0gICAgIFRoZSBMSVRFUkFMIHJlbG9jLCBhdCB0aGUgTERRIGluc3RydWN0aW9uLCByZWZlcnMgdG8gdGhlIC5saXRhCi0gICAgIHNlY3Rpb24gc3ltYm9sLiAgVGhlIGFkZGVuZCBpcyBpZ25vcmVkIHdoZW4gd3JpdGluZywgYnV0IGlzIGZpbGxlZAotICAgICBpbiB3aXRoIHRoZSBmaWxlJ3MgR1AgdmFsdWUgb24gcmVhZGluZywgZm9yIGNvbnZlbmllbmNlLCBhcyB3aXRoIHRoZQotICAgICBHUERJU1BfTE8xNiByZWxvYy4KLQotICAgICBUaGUgRUxGX0xJVEVSQUwgcmVsb2MgaXMgc29tZXdoZXJlIGJldHdlZW4gMTZfR09UT0ZGIGFuZCBHUERJU1BfTE8xNi4KLSAgICAgSXQgc2hvdWxkIHJlZmVyIHRvIHRoZSBzeW1ib2wgdG8gYmUgcmVmZXJlbmNlZCwgYXMgd2l0aCAxNl9HT1RPRkYsCi0gICAgIGJ1dCBpdCBnZW5lcmF0ZXMgb3V0cHV0IG5vdCBiYXNlZCBvbiB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSAuZ290Ci0gICAgIHNlY3Rpb24sIGJ1dCByZWxhdGl2ZSB0byB0aGUgR1AgdmFsdWUgY2hvc2VuIGZvciB0aGUgZmlsZSBkdXJpbmcgdGhlCi0gICAgIGZpbmFsIGxpbmsgc3RhZ2UuCi0KLSAgICAgVGhlIExJVFVTRSByZWxvYywgb24gdGhlIGluc3RydWN0aW9uIHVzaW5nIHRoZSBsb2FkZWQgYWRkcmVzcywgZ2l2ZXMKLSAgICAgaW5mb3JtYXRpb24gdG8gdGhlIGxpbmtlciB0aGF0IGl0IG1pZ2h0IGJlIGFibGUgdG8gdXNlIHRvIG9wdGltaXplCi0gICAgIGF3YXkgc29tZSBsaXRlcmFsIHNlY3Rpb24gcmVmZXJlbmNlcy4gIFRoZSBzeW1ib2wgaXMgaWdub3JlZCAocmVhZAotICAgICBhcyB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wpLCBhbmQgdGhlICJhZGRlbmQiIGluZGljYXRlcyB0aGUgdHlwZQotICAgICBvZiBpbnN0cnVjdGlvbiB1c2luZyB0aGUgcmVnaXN0ZXI6Ci0gICAgICAgICAgICAgIDEgLSAibWVtb3J5IiBmbXQgaW5zbgotICAgICAgICAgICAgICAyIC0gYnl0ZS1tYW5pcHVsYXRpb24gKGJ5dGUgb2Zmc2V0IHJlZykKLSAgICAgICAgICAgICAgMyAtIGpzciAodGFyZ2V0IG9mIGJyYW5jaCkKLQotICAgICBUaGUgR05VIGxpbmtlciBjdXJyZW50bHkgZG9lc24ndCBkbyBhbnkgb2YgdGhpcyBvcHRpbWl6aW5nLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUwKLUVOVU1YCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQllUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1AKLUVOVU1YCi0gIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0dQUkVMSElHSAotRU5VTVgKLSAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxMT1cKLUVOVU1ET0MKLSAgVGhlIEJGRF9SRUxPQ19BTFBIQV9VU0VSXyogcmVsb2NhdGlvbnMgYXJlIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB0bwotICAgICBwcm9jZXNzIHRoZSBleHBsaWNpdCAhPHJlbG9jPiFzZXF1ZW5jZSByZWxvY2F0aW9ucywgYW5kIGFyZSBtYXBwZWQKLSAgICAgaW50byB0aGUgbm9ybWFsIHJlbG9jYXRpb25zIGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZy4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfSElOVAotRU5VTURPQwotICBUaGUgSElOVCByZWxvY2F0aW9uIGluZGljYXRlcyBhIHZhbHVlIHRoYXQgc2hvdWxkIGJlIGZpbGxlZCBpbnRvIHRoZQotICAgICAiaGludCIgZmllbGQgb2YgYSBqbXAvanNyL3JldCBpbnN0cnVjdGlvbiwgZm9yIHBvc3NpYmxlIGJyYW5jaC0KLSAgICAgcHJlZGljdGlvbiBsb2dpYyB3aGljaCBtYXkgYmUgcHJvdmlkZWQgb24gc29tZSBwcm9jZXNzb3JzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFCi1FTlVNRE9DCi0gIFRoZSBMSU5LQUdFIHJlbG9jYXRpb24gb3V0cHV0cyBhIGxpbmthZ2UgcGFpciBpbiB0aGUgb2JqZWN0IGZpbGUsCi0gICAgIHdoaWNoIGlzIGZpbGxlZCBieSB0aGUgbGlua2VyLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUgotRU5VTURPQwotICBUaGUgQ09ERUFERFIgcmVsb2NhdGlvbiBvdXRwdXRzIGEgU1RPX0NBIGluIHRoZSBvYmplY3QgZmlsZSwKLSAgICAgd2hpY2ggaXMgZmlsbGVkIGJ5IHRoZSBsaW5rZXIuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFNfSk1QCi1FTlVNRE9DCi0gIEJpdHMgMjcuLjIgb2YgdGhlIHJlbG9jYXRpb24gYWRkcmVzcyBzaGlmdGVkIHJpZ2h0IDIgYml0czsKLSAgICAgc2ltcGxlIHJlbG9jIG90aGVyd2lzZS4KLQotRU5VTQotICBCRkRfUkVMT0NfTUlQUzE2X0pNUAotRU5VTURPQwotICBUaGUgTUlQUzE2IGp1bXAgaW5zdHJ1Y3Rpb24uCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFMxNl9HUFJFTAotRU5VTURPQwotICBNSVBTMTYgR1AgcmVsYXRpdmUgcmVsb2MuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0hJMTYKLUVOVU1ET0MKLSAgSGlnaCAxNiBiaXRzIG9mIDMyLWJpdCB2YWx1ZTsgc2ltcGxlIHJlbG9jLgotRU5VTQotICBCRkRfUkVMT0NfSEkxNl9TCi1FTlVNRE9DCi0gIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWUgYnV0IHRoZSBsb3cgMTYgYml0cyB3aWxsIGJlIHNpZ24KLSAgICAgZXh0ZW5kZWQgYW5kIGFkZGVkIHRvIGZvcm0gdGhlIGZpbmFsIHJlc3VsdC4gIElmIHRoZSBsb3cgMTYKLSAgICAgYml0cyBmb3JtIGEgbmVnYXRpdmUgbnVtYmVyLCB3ZSBuZWVkIHRvIGFkZCBvbmUgdG8gdGhlIGhpZ2ggdmFsdWUKLSAgICAgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGJvcnJvdyB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQuCi1FTlVNCi0gIEJGRF9SRUxPQ19MTzE2Ci1FTlVNRE9DCi0gIExvdyAxNiBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfUENSRUxfSEkxNl9TCi1FTlVNRE9DCi0gIExpa2UgQkZEX1JFTE9DX0hJMTZfUywgYnV0IFBDIHJlbGF0aXZlLgotRU5VTQotICBCRkRfUkVMT0NfUENSRUxfTE8xNgotRU5VTURPQwotICBMaWtlIEJGRF9SRUxPQ19MTzE2LCBidXQgUEMgcmVsYXRpdmUuCi0KLUVOVU1FUQotICBCRkRfUkVMT0NfTUlQU19HUFJFTAotICBCRkRfUkVMT0NfR1BSRUwxNgotRU5VTURPQwotICBSZWxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBnbG9iYWwgcG9pbnRlci4KLQotRU5VTQotICBCRkRfUkVMT0NfTUlQU19MSVRFUkFMCi1FTlVNRE9DCi0gIFJlbG9jYXRpb24gYWdhaW5zdCBhIE1JUFMgbGl0ZXJhbCBzZWN0aW9uLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19NSVBTX0dPVDE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19DQUxMMTYKLUVOVU1FUVgKLSAgQkZEX1JFTE9DX01JUFNfR1BSRUwzMgotICBCRkRfUkVMT0NfR1BSRUwzMgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfU1VCCi1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19HT1RfUEFHRQotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfR09UX09GU1QKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9ESVNQCi1DT01NRU5UCi1FTlVNRE9DCi0gIE1JUFMgRUxGIHJlbG9jYXRpb25zLgotCi1DT01NRU5UCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzM4Nl9HT1QzMgotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9QTFQzMgotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9DT1BZCi1FTlVNWAotICBCRkRfUkVMT0NfMzg2X0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfMzg2X0pVTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfR09UUEMKLUVOVU1ET0MKLSAgaTM4Ni9lbGYgcmVsb2NhdGlvbnMKLQotRU5VTQotICBCRkRfUkVMT0NfTlMzMktfSU1NXzgKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyCi1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwKLUVOVU1ET0MKLSAgbnMzMmsgcmVsb2NhdGlvbnMKLQotRU5VTQotICBCRkRfUkVMT0NfUEpfQ09ERV9ISTE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUEpfQ09ERV9MTzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUEpfQ09ERV9ESVIxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BKX0NPREVfRElSMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19QSl9DT0RFX1JFTDE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUEpfQ09ERV9SRUwzMgotRU5VTURPQwotICBQaWNvamF2YSByZWxvY3MuICBOb3QgYWxsIG9mIHRoZXNlIGFwcGVhciBpbiBvYmplY3QgZmlsZXMuCi0gIAotRU5VTQotICBCRkRfUkVMT0NfUFBDX0IyNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CQTI2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX1RPQzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0IxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CMTZfQlJUQUtFTgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQkExNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CQTE2X0JSVEFLRU4KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19DT1BZCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0pNUF9TTE9UCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX1JFTEFUSVZFCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQwotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9MTwotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9IQQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBSTE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEyUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfTE8KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9IQQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfQklUX0ZMRAotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0RBCi1FTlVNRE9DCi0gIFBvd2VyKHJzNjAwMCkgYW5kIFBvd2VyUEMgcmVsb2NhdGlvbnMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0NUT1IKLUVOVU1ET0MKLSAgVGhlIHR5cGUgb2YgcmVsb2MgdXNlZCB0byBidWlsZCBhIGNvbnRydWN0b3IgdGFibGUgLSBhdCB0aGUgbW9tZW50Ci0gIHByb2JhYmx5IGEgMzIgYml0IHdpZGUgYWJzb2x1dGUgcmVsb2NhdGlvbiwgYnV0IHRoZSB0YXJnZXQgY2FuIGNob29zZS4KLSAgSXQgZ2VuZXJhbGx5IGRvZXMgbWFwIHRvIG9uZSBvZiB0aGUgb3RoZXIgcmVsb2NhdGlvbiB0eXBlcy4KLQotRU5VTQotICBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSAotRU5VTURPQwotICBBUk0gMjYgYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUKLSAgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi1FTlVNCi0gIEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0FEUkxfSU1NRURJQVRFCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fU0hJRlRfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1NXSQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9NVUxUSQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0FEUl9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fTERSX0lNTQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9MSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0lOX1BPT0wKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTgKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0dPVDEyCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0dPVDMyCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0pVTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9DT1BZCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1BMVDMyCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1JFTEFUSVZFCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HT1RQQwotRU5VTURPQwotICBUaGVzZSByZWxvY3MgYXJlIG9ubHkgdXNlZCB3aXRoaW4gdGhlIEFSTSBhc3NlbWJsZXIuICBUaGV5IGFyZSBub3QKLSAgKGF0IHByZXNlbnQpIHdyaXR0ZW4gdG8gYW55IG9iamVjdCBmaWxlcy4KLQotRU5VTQotICBCRkRfUkVMT0NfU0hfUENESVNQOEJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NNAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTTRCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU00Qlk0Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NOAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTThCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU04Qlk0Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfU1dJVENIMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9TV0lUQ0gzMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1VTRVMKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9DT1VOVAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0FMSUdOCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfQ09ERQotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0RBVEEKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9MQUJFTAotRU5VTURPQwotICBIaXRhY2hpIFNIIHJlbG9jcy4gIE5vdCBhbGwgb2YgdGhlc2UgYXBwZWFyIGluIG9iamVjdCBmaWxlcy4KLQotRU5VTQotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOQotRU5VTVgKLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyCi1FTlVNWAotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMKLUVOVU1ET0MKLSAgVGh1bWIgMjMtLCAxMi0gYW5kIDktYml0IHBjLXJlbGF0aXZlIGJyYW5jaGVzLiAgVGhlIGxvd2VzdCBiaXQgbXVzdAotICBiZSB6ZXJvIGFuZCBpcyBub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4KLQotRU5VTQotICBCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTAotRU5VTURPQwotICBBcmdvbmF1dCBSSVNDIENvcmUgKEFSQykgcmVsb2NzLgotICBBUkMgMjIgYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUKLSAgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyMCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyNgotICB0aHJvdWdoIDcgb2YgdGhlIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfQVJDX0IyNgotRU5VTURPQwotICBBUkMgMjYgYml0IGFic29sdXRlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUgbm90Ci0gIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyNCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyMwotICB0aHJvdWdoIDAuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUgotRU5VTURPQwotICBNaXRzdWJpc2hpIEQxMFYgcmVsb2NzLgotICBUaGlzIGlzIGEgMTAtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotICBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wKLUVOVU1ET0MKLSAgTWl0c3ViaXNoaSBEMTBWIHJlbG9jcy4KLSAgVGhpcyBpcyBhIDEwLWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLSAgYXNzdW1lZCB0byBiZSAwLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgcmVsb2MKLSAgZXhjZXB0IGl0IGlzIGluIHRoZSBsZWZ0IGNvbnRhaW5lciwgaS5lLiwKLSAgc2hpZnRlZCBsZWZ0IDE1IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMTBWXzE4Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotICBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotICBhc3N1bWVkIHRvIGJlIDAuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfNgotRU5VTURPQwotICBNaXRzdWJpc2hpIEQzMFYgcmVsb2NzLgotICBUaGlzIGlzIGEgNi1iaXQgYWJzb2x1dGUgcmVsb2MuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzlfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDYtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAgCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUgotRU5VTURPQwotICBUaGlzIGlzIGEgNi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLSAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLSAgYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotICBvZiB0aGUgY29udGFpbmVyLiAgCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzE1Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxMi1iaXQgYWJzb2x1dGUgcmVsb2Mgd2l0aCB0aGUgCi0gIHJpZ2h0IDMgYml0c2Fzc3VtZWQgdG8gYmUgMC4gIAotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMTItYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAgCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1IKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDEyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotICBhcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi0gIG9mIHRoZSBjb250YWluZXIuICAKLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMjEKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiAxOC1iaXQgYWJzb2x1dGUgcmVsb2Mgd2l0aCAKLSAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCi0gIGFzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKLSAgb2YgdGhlIGNvbnRhaW5lci4KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMzIKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDMyLWJpdCBhYnNvbHV0ZSByZWxvYy4KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDMyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYy4KLQotRU5VTQotICBCRkRfUkVMT0NfTTMyUl8yNAotRU5VTURPQwotICBNaXRzdWJpc2hpIE0zMlIgcmVsb2NzLgotICBUaGlzIGlzIGEgMjQgYml0IGFic29sdXRlIGFkZHJlc3MuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxMC1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfMThfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDI2LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTwotRU5VTURPQwotICBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGhpZ2ggMTYgYml0cyBvZiBhbiBhZGRyZXNzCi0gIHVzZWQgd2hlbiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgdHJlYXRlZCBhcyB1bnNpZ25lZC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8KLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBoaWdoIDE2IGJpdHMgb2YgYW4gYWRkcmVzcwotICB1c2VkIHdoZW4gdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHRyZWF0ZWQgYXMgc2lnbmVkLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl9MTzE2Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgbG93ZXIgMTYgYml0cyBvZiBhbiBhZGRyZXNzLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl9TREExNgotRU5VTURPQwotICBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIHNtYWxsIGRhdGEgYXJlYSBvZmZzZXQgZm9yIHVzZSBpbgotICBhZGQzLCBsb2FkLCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwXzlfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDktYml0IHJlbG9jCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwXzIyX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAyMi1iaXQgcmVsb2MKLQotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9TREFfMTVfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDE1IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCi0gIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgMTUgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLSAgemVybyBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiA4IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNiBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotICB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfN184X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGFuIDhiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDcgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUgdGlueQotICBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDcgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuCi1DT01NRU5UCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1REQV80XzVfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA1IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNCBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZSB0aW55Ci0gIGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgNCBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIsIHdpdGggdGhlCi0gIGJpdHMgcGxhY2VkIG5vbi1jb250aWdvdXNseSBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlciwgd2l0aCB0aGUKLSAgYml0cyBwbGFjZWQgbm9uLWNvbnRpZ291c2x5IGluIHRoZSBpbnN0cnVjdGlvbi4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuCi1DT01NRU5UCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01OMTAzMDBfMzJfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDMyYml0IHBjcmVsIHJlbG9jIGZvciB0aGUgbW4xMDMwMCwgb2Zmc2V0IGJ5IHR3byBieXRlcyBpbiB0aGUKLSAgaW5zdHJ1Y3Rpb24uCi1FTlVNCi0gIEJGRF9SRUxPQ19NTjEwMzAwXzE2X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNmJpdCBwY3JlbCByZWxvYyBmb3IgdGhlIG1uMTAzMDAsIG9mZnNldCBieSB0d28gYnl0ZXMgaW4gdGhlCi0gIGluc3RydWN0aW9uLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19USUMzMF9MRFAKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDhiaXQgRFAgcmVsb2MgZm9yIHRoZSB0bXMzMjBjMzAsIHdoZXJlIHRoZSBtb3N0Ci0gIHNpZ25pZmljYW50IDggYml0cyBvZiBhIDI0IGJpdCB3b3JkIGFyZSBwbGFjZWQgaW50byB0aGUgbGVhc3QKLSAgc2lnbmlmaWNhbnQgOCBiaXRzIG9mIHRoZSBvcGNvZGUuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfNDgKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDQ4IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgMzIgYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfMjAKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDMyIGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgMjAgYml0cyBzcGxpdCB1cCBpbnRvCi0gIHR3byBzZWN0aW9ucy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfNl9JTl80Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgNiBiaXQgd29yZCBvZmZzZXQgaW4KLSAgNCBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfRlIzMF84X0lOXzgKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYW4gOCBiaXQgYnl0ZSBvZmZzZXQKLSAgaW50byA4IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzlfSU5fOAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDkgYml0IHNob3J0IG9mZnNldAotICBpbnRvIDggYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfMTBfSU5fOAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDEwIGJpdCB3b3JkIG9mZnNldAotICBpbnRvIDggYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfOV9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDkgYml0IHBjIHJlbGF0aXZlCi0gIHNob3J0IG9mZnNldCBpbnRvIDggYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfMTJfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSAxMiBiaXQgcGMgcmVsYXRpdmUKLSAgc2hvcnQgb2Zmc2V0IGludG8gMTEgYml0cy4KLSAgCi1FTlVNCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0Ci1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9SVkEKLUVOVU1ET0MKLSAgTW90b3JvbGEgTWNvcmUgcmVsb2NhdGlvbnMuCi0gIAotRU5VTQotICBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLUVOVU1YCi0gIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKLUVOVU1ET0MKLSAgVGhlc2UgdHdvIHJlbG9jYXRpb25zIGFyZSB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIG9mIAotICB0aGUgZW50cmllcyBpbiBhIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGFyZSBhY3R1YWxseSB1c2VkLiAgV2hlbgotICB0aGUgLS1nYy1zZWN0aW9ucyBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBsaW5rZXIgd2lsbCB6ZXJvIG91dCB0aGUgZW50cmllcwotICB0aGF0IGFyZSBub3QgdXNlZCwgc28gdGhhdCB0aGUgY29kZSBmb3IgdGhvc2UgZnVuY3Rpb25zIG5lZWQgbm90IGJlCi0gIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCi0KLSAgVlRBQkxFX0lOSEVSSVQgaXMgYSB6ZXJvLXNwYWNlIHJlbG9jYXRpb24gdXNlZCB0byBkZXNjcmliZSB0byB0aGUKLSAgbGlua2VyIHRoZSBpbmhlcml0ZW5jZSB0cmVlIG9mIGEgQysrIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUuICBUaGUKLSAgcmVsb2NhdGlvbidzIHN5bWJvbCBzaG91bGQgYmUgdGhlIHBhcmVudCBjbGFzcycgdnRhYmxlLCBhbmQgdGhlCi0gIHJlbG9jYXRpb24gc2hvdWxkIGJlIGxvY2F0ZWQgYXQgdGhlIGNoaWxkIHZ0YWJsZS4KLQotICBWVEFCTEVfRU5UUlkgaXMgYSB6ZXJvLXNwYWNlIHJlbG9jYXRpb24gdGhhdCBkZXNjcmliZXMgdGhlIHVzZSBvZiBhCi0gIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgZW50cnkuICBUaGUgcmVsb2MncyBzeW1ib2wgc2hvdWxkIHJlZmVyIHRvIHRoZQotICB0YWJsZSBvZiB0aGUgY2xhc3MgbWVudGlvbmVkIGluIHRoZSBjb2RlLiAgT2ZmIG9mIHRoYXQgYmFzZSwgYW4gb2Zmc2V0Ci0gIGRlc2NyaWJlcyB0aGUgZW50cnkgdGhhdCBpcyBiZWluZyB1c2VkLiAgRm9yIFJlbGEgaG9zdHMsIHRoaXMgb2Zmc2V0IAotICBpcyBzdG9yZWQgaW4gdGhlIHJlbG9jJ3MgYWRkZW5kLiAgRm9yIFJlbCBob3N0cywgd2UgYXJlIGZvcmNlZCB0byBwdXQKLSAgdGhpcyBvZmZzZXQgaW4gdGhlIHJlbG9jJ3Mgc2VjdGlvbiBvZmZzZXQuCi0KLUVORFNFTlVNCi0gIEJGRF9SRUxPQ19VTlVTRUQKLUNPREVfRlJBR01FTlQKLS4KLS50eXBlZGVmIGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGU7Ci0qLwotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9yZWxvY190eXBlX2xvb2t1cAotCi1TWU5PUFNJUwotCXJlbG9jX2hvd3RvX3R5cGUgKgotCWJmZF9yZWxvY190eXBlX2xvb2t1cCAoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcG9pbnRlciB0byBhIGhvd3RvIHN0cnVjdHVyZSB3aGljaCwgd2hlbgotCWludm9rZWQsIHdpbGwgcGVyZm9ybSB0aGUgcmVsb2NhdGlvbiBAdmFye2NvZGV9IG9uIGRhdGEgZnJvbSB0aGUKLQlhcmNoaXRlY3R1cmUgbm90ZWQuCi0KLSovCi0KLQotcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgcmVsb2NfdHlwZV9sb29rdXAsIChhYmZkLCBjb2RlKSk7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGJmZF9ob3d0b18zMiA9Ci1IT1dUTyAoMCwgMDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJWUlQzMiIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCB0cnVlKTsKLQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotCi1TWU5PUFNJUwotCXJlbG9jX2hvd3RvX3R5cGUgKmJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0JKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICBjb2RlKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBhIGRlZmF1bHQgcmVsb2NhdGlvbiBsb29rdXAgcm91dGluZSBmb3IgYW55IGFyY2hpdGVjdHVyZS4KLQotCi0qLwotCi1yZWxvY19ob3d0b190eXBlICoKLWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICAvKiBUaGUgdHlwZSBvZiByZWxvYyB1c2VkIGluIGEgY3Rvciwgd2hpY2ggd2lsbCBiZSBhcyB3aWRlIGFzIHRoZQotCSBhZGRyZXNzIC0gc28gZWl0aGVyIGEgNjQsIDMyLCBvciAxNiBiaXR0ZXIuICAqLwotICAgICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0JewotCWNhc2UgNjQ6Ci0JICBCRkRfRkFJTCAoKTsKLQljYXNlIDMyOgotCSAgcmV0dXJuICZiZmRfaG93dG9fMzI7Ci0JY2FzZSAxNjoKLQkgIEJGRF9GQUlMICgpOwotCWRlZmF1bHQ6Ci0JICBCRkRfRkFJTCAoKTsKLQl9Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJGRF9GQUlMICgpOwotICAgIH0KLSAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lCi0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBhIHByaW50YWJsZSBuYW1lIGZvciB0aGUgc3VwcGxpZWQgcmVsb2NhdGlvbiBjb2RlLgotCVVzZWZ1bCBtYWlubHkgZm9yIHByaW50aW5nIGVycm9yIG1lc3NhZ2VzLgotKi8KLQotY29uc3QgY2hhciAqCi1iZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGlmIChjb2RlID4gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXNbKGludCljb2RlXTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotCSAoYmZkICphYmZkLAotCSAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgYm9vbGVhbiAqKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBkZWZhdWx0IGhhbmRsaW5nIGZvciByZWxheGluZyBmb3IgYmFjayBlbmRzIHdoaWNoCi0JZG9uJ3QgZG8gcmVsYXhpbmcgLS0gaS5lLiwgZG9lcyBub3RoaW5nLgotKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1iZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgKmFnYWluID0gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQkgKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBkZWZhdWx0IGhhbmRsaW5nIGZvciByZWxheGluZyBmb3IgYmFjayBlbmRzIHdoaWNoCi0JZG9uJ3QgZG8gc2VjdGlvbiBnYyAtLSBpLmUuLCBkb2VzIG5vdGhpbmcuCi0qLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9nZW5lcmljX2djX3NlY3Rpb25zIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLQotU1lOT1BTSVMKLQliZmRfYnl0ZSAqCi0JICAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChiZmQgKmFiZmQsCi0JICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotCSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyLAotCSAgICAgYmZkX2J5dGUgKmRhdGEsCi0JICAgICBib29sZWFuIHJlbG9jYXRlYWJsZSwKLQkgICAgIGFzeW1ib2wgKipzeW1ib2xzKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBkZWZhdWx0IGhhbmRsaW5nIG9mIHJlbG9jYXRpb24gZWZmb3J0IGZvciBiYWNrIGVuZHMKLQl3aGljaCBjYW4ndCBiZSBib3RoZXJlZCB0byBkbyBpdCBlZmZpY2llbnRseS4KLQotKi8KLQotYmZkX2J5dGUgKgotYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCSAgICByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0gIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX2NvdW50OwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsb2Nfc2l6ZSk7Ci0gIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogcmVhZCBpbiB0aGUgc2VjdGlvbiAqLwotICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLAotCQkJCSAoUFRSKSBkYXRhLAotCQkJCSAwLAotCQkJCSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlJ3JlIG5vdCByZWxheGluZyB0aGUgc2VjdGlvbiwgc28ganVzdCBjb3B5IHRoZSBzaXplIGluZm8gKi8KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplOwotICBpbnB1dF9zZWN0aW9uLT5yZWxvY19kb25lID0gdHJ1ZTsKLQotICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwKLQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJcmVsb2NfdmVjdG9yLAotCQkJCQlzeW1ib2xzKTsKLSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAocmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipwYXJlbnQ7Ci0gICAgICBmb3IgKHBhcmVudCA9IHJlbG9jX3ZlY3RvcjsgKnBhcmVudCAhPSAoYXJlbGVudCAqKSBOVUxMOwotCSAgIHBhcmVudCsrKQotCXsKLQkgIGNoYXIgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKSBOVUxMOwotCSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHIgPQotCSAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsCi0JCQkJICAgICpwYXJlbnQsCi0JCQkJICAgIChQVFIpIGRhdGEsCi0JCQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIHJlbG9jYXRlYWJsZSA/IGFiZmQgOiAoYmZkICopIE5VTEwsCi0JCQkJICAgICZlcnJvcl9tZXNzYWdlKTsKLQotCSAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpvcyA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0JICAgICAgLyogQSBwYXJ0aWFsIGxpbmssIHNvIGtlZXAgdGhlIHJlbG9jcyAqLwotCSAgICAgIG9zLT5vcmVsb2NhdGlvbltvcy0+cmVsb2NfY291bnRdID0gKnBhcmVudDsKLQkgICAgICBvcy0+cmVsb2NfY291bnQrKzsKLQkgICAgfQotCi0JICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHIpCi0JCXsKLQkJY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqKCpwYXJlbnQpLT5zeW1fcHRyX3B0ciksCi0JCQkgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoKnBhcmVudCktPmFkZHJlc3MpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JCSAgQkZEX0FTU0VSVCAoZXJyb3JfbWVzc2FnZSAhPSAoY2hhciAqKSBOVUxMKTsKLQkJICBpZiAoISgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCQkobGlua19pbmZvLCBlcnJvcl9tZXNzYWdlLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgKCpwYXJlbnQpLT5hZGRyZXNzKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCQkobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqKCpwYXJlbnQpLT5zeW1fcHRyX3B0ciksCi0JCQkgKCpwYXJlbnQpLT5ob3d0by0+bmFtZSwgKCpwYXJlbnQpLT5hZGRlbmQsCi0JCQkgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoKnBhcmVudCktPmFkZHJlc3MpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gZGF0YTsKLQotZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9iZmQvcmVsb2MxNi5jIGIvYmZkL3JlbG9jMTYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3OTUyZS4uMDAwMDAwMAotLS0gYS9iZmQvcmVsb2MxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qIDggYW5kIDE2IGJpdCBDT0ZGIHJlbG9jYXRpb24gZnVuY3Rpb25zLCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogCi1Nb3N0IG9mIHRoaXMgaGFja2VkIGJ5ICBTdGV2ZSBDaGFtYmVybGFpbiwKLQkJCXNhY0BjeWdudXMuY29tIAotKi8KLQotLyogVGhlc2Ugcm91dGluZXMgYXJlIHVzZWQgYnkgY29mZi1oODMwMCBhbmQgY29mZi16OGsgdG8gZG8KLSAgIHJlbG9jYXRpb24uCi0KLSAgIEZJWE1FOiBUaGlzIGNvZGUgc2hvdWxkIGJlIHJld3JpdHRlbiB0byBzdXBwb3J0IHRoZSBuZXcgQ09GRgotICAgbGlua2VyLiAgQmFzaWNhbGx5LCB0aGV5IG5lZWQgdG8gZGVhbCB3aXRoIENPRkYgcmVsb2NzIHJhdGhlciB0aGFuCi0gICBCRkQgZ2VuZXJpYyByZWxvY3MuICBUaGV5IHNob3VsZCBzdG9yZSB0aGUgcmVsb2NzIGluIHNvbWUgbG9jYXRpb24KLSAgIHdoZXJlIGNvZmZfbGlua19pbnB1dF9iZmQgY2FuIGZpbmQgdGhlbSAoYW5kIGNvZmZfbGlua19pbnB1dF9iZmQKLSAgIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHVzZSB0aGlzIGxvY2F0aW9uIHJhdGhlciB0aGFuIHJlcmVhZGluZyB0aGUKLSAgIGZpbGUpICh1bmxlc3MgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIGluIHdoaWNoIGNhc2UgdGhleSBzaG91bGQKLSAgIGZyZWUgdXAgdGhlIHJlbG9jcyBhZnRlciBkZWFsaW5nIHdpdGggdGhlbSkuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdlbmxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1iZmRfdm1hCi1iZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbikKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotewotICBiZmRfdm1hIHZhbHVlOwotICBhc3ltYm9sICpzeW1ib2wgPSAqKHJlbG9jLT5zeW1fcHRyX3B0cik7Ci0gIC8qIEEgc3ltYm9sIGhvbGRzIGEgcG9pbnRlciB0byBhIHNlY3Rpb24sIGFuZCBhbiBvZmZzZXQgZnJvbSB0aGUKLSAgICAgYmFzZSBvZiB0aGUgc2VjdGlvbi4gIFRvIHJlbG9jYXRlLCB3ZSBmaW5kIHdoZXJlIHRoZSBzZWN0aW9uIHdpbGwKLSAgICAgbGl2ZSBpbiB0aGUgb3V0cHV0IGFuZCBhZGQgdGhhdCBpbiAqLwotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgaW4gdGhpcyBCRkQuICBMb29rIGl0IHVwIGluIHRoZQotCSBnbG9iYWwgbGlua2VyIGhhc2ggdGFibGUuICBGSVhNRTogVGhpcyBzaG91bGQgYmUgY2hhbmdlZCB3aGVuCi0JIHdlIGNvbnZlcnQgdGhpcyBzdHVmZiB0byB1c2UgYSBzcGVjaWZpYyBmaW5hbF9saW5rIGZ1bmN0aW9uCi0JIGFuZCBjaGFuZ2UgdGhlIGludGVyZmFjZSB0byBiZmRfcmVsYXhfc2VjdGlvbiB0byBub3QgcmVxdWlyZQotCSB0aGUgZ2VuZXJpYyBzeW1ib2xzLiAgKi8KLSAgICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChpbnB1dF9zZWN0aW9uLT5vd25lciwgbGlua19pbmZvLAotCQkJCQliZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCQkJCQlmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl2YWx1ZSA9IChoLT51LmRlZi52YWx1ZQotCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZSBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCXZhbHVlID0gaC0+dS5jLnNpemU7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCQkgIGlucHV0X3NlY3Rpb24tPm93bmVyLCBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQkgIHZhbHVlID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHZhbHVlID0gc3ltYm9sLT52YWx1ZSArCi0Jc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsKLQkgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgICB9Ci0gIAotICAvKiBBZGQgdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgcmVsb2NhdGlvbiAqLwotICB2YWx1ZSArPSByZWxvYy0+YWRkZW5kOwotICAKLSAgcmV0dXJuIHZhbHVlOwotfQotCi12b2lkCi1iZmRfcGVyZm9ybV9zbGlwKGFiZmQsIHNsaXAsIGlucHV0X3NlY3Rpb24sIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBzbGlwOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgYXN5bWJvbCAqKnM7Ci0KLSAgcyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgQkZEX0FTU0VSVCAocyAhPSAoYXN5bWJvbCAqKikgTlVMTCk7Ci0KLSAgLyogRmluZCBhbGwgc3ltYm9scyBwYXN0IHRoaXMgcG9pbnQsIGFuZCBtYWtlIHRoZW0ga25vdwotICAgICB3aGF0J3MgaGFwcGVuZWQgKi8KLSAgd2hpbGUgKCpzKSAKLSAgICB7Ci0gICAgICBhc3ltYm9sICpwID0gKnM7Ci0gICAgICBpZiAocC0+c2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uKSAKLQl7Ci0JICAvKiBUaGlzIHdhcyBwb2ludGluZyBpbnRvIHRoaXMgc2VjdGlvbiwgc28gbWFuZ2xlIGl0ICovCi0JICBpZiAocC0+dmFsdWUgPiB2YWx1ZSkKLQkgICAgewotCSAgICAgIHAtPnZhbHVlIC09IHNsaXA7Ci0JICAgICAgaWYgKHAtPnVkYXRhLnAgIT0gTlVMTCkKLQkJewotCQkgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCQkgIGggPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIHAtPnVkYXRhLnA7Ci0JCSAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0JCSAgaC0+cm9vdC51LmRlZi52YWx1ZSAtPSBzbGlwOwotCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudS5kZWYudmFsdWUgPT0gcC0+dmFsdWUpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBzKys7Ci0gICAgfSAgICAKLX0KLQotYm9vbGVhbiAKLWJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgaSwgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaTsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIC8qIEdldCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIHN0dWZmICovCi0gIGJmZCAqaW5wdXRfYmZkID0gaS0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gaTsKLSAgaW50ICpzaHJpbmtzOwotICBpbnQgc2hyaW5rID0gMDsKLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgLyogV2Ugb25seSBkbyBnbG9iYWwgcmVsYXhhdGlvbiBvbmNlLiAgSXQgaXMgbm90IHNhZmUgdG8gZG8gaXQgbXVsdGlwbGUKLSAgICAgdGltZXMgKHNlZSBkaXNjdXNzaW9uIG9mIHRoZSAic2hyaW5rcyIgYXJyYXkgYmVsb3cpLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7Ci0gIGlmICghcmVsb2NfdmVjdG9yICYmIHJlbG9jX3NpemUgPiAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgdGhlIHJlbG9jcyBhbmQgdGhpbmsgYWJvdXQgdGhlbSAqLwotICByZWxvY19jb3VudCA9Ci0gICAgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvY192ZWN0b3IsCi0JCQkgICAgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGlucHV0X2JmZCkpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSByZWxvYzE2LmMgYW5kIHJlbGF0ZWQgcmVsYXhpbmcgY29kZSBpcyB2ZXJ5IHNpbXBsZSwgdGhlIHByaWNlCi0gICAgIGZvciB0aGF0IHNpbXBsaWNpdHkgaXMgd2UgY2FuIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UgZm9yCi0gICAgIGVhY2ggc2VjdGlvbi4KLQotICAgICBTbywgdG8gZ2V0IHRoZSBiZXN0IHJlc3VsdHMgd2l0aGluIHRoYXQgbGltaXRhdGlvbiwgd2UgZG8gbXVsdGlwbGUKLSAgICAgcmVsYXhpbmcgcGFzc2VzIG92ZXIgZWFjaCBzZWN0aW9uIGhlcmUuICBUaGF0IGludm9sdmVzIGtlZXBpbmcgdHJhY2sKLSAgICAgb2YgdGhlICJzaHJpbmsiIGF0IGVhY2ggcmVsb2MgaW4gdGhlIHNlY3Rpb24uICBUaGlzIGFsbG93cyB1cyB0bwotICAgICBhY2N1cmF0ZWx5IGRldGVybWluZSB0aGUgcmVsYXRpdmUgbG9jYXRpb24gb2YgdHdvIHJlbG9jcyB3aXRoaW4KLSAgICAgdGhpcyBzZWN0aW9uLgotCi0gICAgIEluIHRoZW9yeSwgaWYgd2Uga2VwdCB0aGUgInNocmlua3MiIGFycmF5IGZvciBlYWNoIHNlY3Rpb24gZm9yIHRoZQotICAgICBlbnRpcmUgbGluaywgd2UgY291bGQgdXNlIHRoZSBnZW5lcmljIHJlbGF4aW5nIGNvZGUgaW4gdGhlIGxpbmtlcgotICAgICBhbmQgZ2V0IGJldHRlciByZXN1bHRzLCBwYXJ0aWN1bGFybHkgZm9yIGpzci0+YnNyIGFuZCAyNC0+MTYgYml0Ci0gICAgIG1lbW9yeSByZWZlcmVuY2UgcmVsYXhhdGlvbnMuICAqLwotICAgICAKLSAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBpbnQgYW5vdGhlcl9wYXNzID0gMDsKLQotICAgICAgLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHNocmlua3MgYXJyYXkgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBzaHJpbmtzID0gKGludCAqKSBiZmRfbWFsbG9jIChyZWxvY19jb3VudCAqIHNpemVvZiAoaW50KSk7Ci0gICAgICBtZW1zZXQgKHNocmlua3MsIDAsIHJlbG9jX2NvdW50ICogc2l6ZW9mIChpbnQpKTsKLQotICAgICAgLyogTG9vcCB1bnRpbCBub3RoaW5nIGNoYW5nZXMgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIGRvIHsKLQlhcmVsZW50ICoqcGFyZW50OwotCXVuc2lnbmVkIGludCBpOwotCWxvbmcgajsKLQotCWFub3RoZXJfcGFzcyA9IDA7Ci0KLQlmb3IgKGkgPSAwLCBwYXJlbnQgPSByZWxvY192ZWN0b3I7ICpwYXJlbnQ7IHBhcmVudCsrLCBpKyspIAotCSAgewotCSAgICAvKiBMZXQgdGhlIHRhcmdldC9tYWNoaW5lIGRlcGVuZGVudCBjb2RlIGV4YW1pbmUgZWFjaCByZWxvYwotCSAgICAgICBpbiB0aGlzIHNlY3Rpb24gYW5kIGF0dGVtcHQgdG8gc2hyaW5rIGl0LiAgKi8KLQkgICAgc2hyaW5rID0gYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgKnBhcmVudCwKLQkJCQkJCXNocmlua3NbaV0sIGxpbmtfaW5mbyk7Ci0KLQkgICAgLyogSWYgaXQgc2hydW5rLCBub3RlIGl0IGluIHRoZSBzaHJpbmtzIGFycmF5IGFuZCBzZXQgdXAgZm9yCi0JICAgICAgIGFub3RoZXIgcGFzcy4gICovCi0JICAgIGlmIChzaHJpbmsgIT0gc2hyaW5rc1tpXSkKLQkgICAgICB7Ci0JICAgICAgICBhbm90aGVyX3Bhc3MgPSAxOwotCQlmb3IgKGogPSBpICsgMTsgaiA8IHJlbG9jX2NvdW50OyBqKyspCi0JCSAgc2hyaW5rc1tqXSArPSBzaHJpbmsgLSBzaHJpbmtzW2ldOwotCSAgICAgIH0KLQkgIH0KLSAgCi0gICAgICB9IHdoaWxlIChhbm90aGVyX3Bhc3MpOwotCi0gICAgICBmcmVlKChjaGFyICopc2hyaW5rcyk7Ci0gICAgfQotCi0gIGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSAtPSBzaHJpbms7ICAKLSAgZnJlZSgoY2hhciAqKXJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1iZmRfYnl0ZSAqCi1iZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyhpbl9hYmZkLAotCQkJCQkJbGlua19pbmZvLAotCQkJCQkJbGlua19vcmRlciwKLQkJCQkJCWRhdGEsCi0JCQkJCQlyZWxvY2F0ZWFibGUsCi0JCQkJCQlzeW1ib2xzKQotICAgICBiZmQgKmluX2FiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvcjsKLSAgbG9uZyByZWxvY19jb3VudDsKLQotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogSWYgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGRvbid0IGJvdGhlciB0byByZWxheC4gICovCi0gIGlmIChyZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoaW5fYWJmZCwgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGxpbmtfb3JkZXIsCi0JCQkJCQkgICAgICAgZGF0YSwgcmVsb2NhdGVhYmxlLAotCQkJCQkJICAgICAgIHN5bWJvbHMpOwotCi0gIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwKLQkJCQkgZGF0YSwKLQkJCQkgMCwKLQkJCQkgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIAotICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYygoc2l6ZV90KSByZWxvY19zaXplKTsKLSAgaWYgKCFyZWxvY192ZWN0b3IgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsIAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQlyZWxvY192ZWN0b3IsCi0JCQkJCXN5bWJvbHMpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgCi0gIGlmIChyZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgYXJlbGVudCAqKnBhcmVudCA9IHJlbG9jX3ZlY3RvcjsKLSAgICAgIGFyZWxlbnQgKnJlbG9jIDsKLSAgICAgIHVuc2lnbmVkIGludCBkc3RfYWRkcmVzcyA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAwOwotICAgICAgdW5zaWduZWQgaW50IHJ1bjsKLSAgICAgIHVuc2lnbmVkIGludCBpZHg7Ci0gICAgCi0gICAgICAvKiBGaW5kIGhvdyBsb25nIGEgcnVuIHdlIGNhbiBkbyAqLwotICAgICAgd2hpbGUgKGRzdF9hZGRyZXNzIDwgbGlua19vcmRlci0+c2l6ZSkgCi0JewotCSAgcmVsb2MgPSAqcGFyZW50OwotCSAgaWYgKHJlbG9jKSAKLQkgICAgewotCSAgICAgIC8qIE5vdGUgdGhhdCB0aGUgcmVsYXhpbmcgZGlkbid0IHRpZSB1cCB0aGUgYWRkcmVzc2VzIGluIHRoZQotCQkgcmVsb2NhdGlvbiwgc28gd2UgdXNlIHRoZSBvcmlnaW5hbCBhZGRyZXNzIHRvIHdvcmsgb3V0IHRoZQotCQkgcnVuIG9mIG5vbi1yZWxvY2F0ZWQgZGF0YSAqLwotCSAgICAgIHJ1biA9IHJlbG9jLT5hZGRyZXNzIC0gc3JjX2FkZHJlc3M7Ci0JICAgICAgcGFyZW50Kys7Ci0JICAgIH0KLQkgIGVsc2UgCi0JICAgIHsKLQkgICAgICBydW4gPSBsaW5rX29yZGVyLT5zaXplIC0gZHN0X2FkZHJlc3M7Ci0JICAgIH0KLQkgIC8qIENvcHkgdGhlIGJ5dGVzICovCi0JICBmb3IgKGlkeCA9IDA7IGlkeCA8IHJ1bjsgaWR4KyspCi0JICAgIHsKLQkgICAgICBkYXRhW2RzdF9hZGRyZXNzKytdID0gZGF0YVtzcmNfYWRkcmVzcysrXTsKLQkgICAgfQotICAgIAotCSAgLyogTm93IGRvIHRoZSByZWxvY2F0aW9uICovCi0gICAgCi0JICBpZiAocmVsb2MpIAotCSAgICB7Ci0JICAgICAgYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyAoaW5wdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSAgICByZWxvYywgZGF0YSwgJnNyY19hZGRyZXNzLAotCQkJCQkgICAgJmRzdF9hZGRyZXNzKTsKLQkgICAgfSAgICAKLQl9Ci0gICAgfQotICBmcmVlKChjaGFyICopcmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIGRhdGE7Ci19Ci0KZGlmZiAtLWdpdCBhL2JmZC9yaXNjaXguYyBiL2JmZC9yaXNjaXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlYjE4Yy4uMDAwMDAwMAotLS0gYS9iZmQvcmlzY2l4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBSSVNDIGlYIChBY29ybiwgYXJtKSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotICAgCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogUklTQyBpWCBvdmVybG9hZHMgdGhlIE1BR0lDIGZpZWxkIHRvIGluZGljYXRlIG1vcmUgdGhhbiBqdXN0IHRoZSB1c3VhbAotICAgW1pOT11NQUdJQyB2YWx1ZXMuICBBbHNvIGluY2x1ZGVkIGFyZSBzcXVlZXppbmcgaW5mb3JtYXRpb24gYW5kCi0gICBzaGFyZWQgbGlicmFyeSB1c2FnZS4gICovCi0KLS8qIFRoZSBmb2xsb3dpbmcgY29tZSBmcm9tIHRoZSBtYW4gcGFnZS4gICovCi0jZGVmaW5lIFNITElCTEVOIDYwCi0KLSNkZWZpbmUgTUZfSU1QVVJFICAgICAgIDAwMjAwCi0jZGVmaW5lIE1GX1NRVUVFWkVEICAgICAwMTAwMAotI2RlZmluZSBNRl9VU0VTX1NMICAgICAgMDIwMDAKLSNkZWZpbmUgTUZfSVNfU0wgICAgICAgIDA0MDAwCi0KLS8qIENvbW1vbiBjb21iaW5hdGlvbnMuICAqLwotI2RlZmluZSBJTUFHSUMgICAgICAgICAgKE1GX0lNUFVSRXxaTUFHSUMpICAgICAgLyogRGVtYW5kIGxvYWQgKGltcHVyZSB0ZXh0KSAqLwotI2RlZmluZSBTUE9NQUdJQyAgICAgICAgKE1GX1VTRVNfU0x8T01BR0lDKSAgICAgLyogT01BR0lDIHdpdGggbGFyZ2UgaGVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLS0gbWF5IGNvbnRhaW4gYSByZWYgdG8gYSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYXJlZCBsaWIgcmVxdWlyZWQgYnkgdGhlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2JqZWN0LiAqLwotI2RlZmluZSBTTE9NQUdJQyAgICAgICAgKE1GX0lTX1NMfE9NQUdJQykgLyogQSByZWZlcmVuY2UgdG8gYSBzaGFyZWQgbGlicmFyeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHRleHQgcG9ydGlvbiBvZiB0aGUgb2JqZWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250YWlucyAib3ZlcmZsb3cgdGV4dCIgZnJvbSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHNoYXJlZCBsaWJyYXJ5IHRvIGJlIGxpbmtlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gd2l0aCBhbiBvYmplY3QgKi8KLSNkZWZpbmUgUU1BR0lDICAgICAgICAgIChNRl9TUVVFRVpFRHxaTUFHSUMpICAgIC8qIFNxZWV6ZWQgZGVtYW5kIHBhZ2VkLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9URTogVGhpcyBpbnRlcnByZXRhdGlvbiBvZiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUU1BR0lDIHNlZW1zIHRvIGJlIGF0IHZhcmlhbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaXRoIHRoYXQgdXNlZCBvbiBvdGhlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJjaGl0ZWN0dXJlcy4gKi8KLSNkZWZpbmUgU1BaTUFHSUMgICAgICAgIChNRl9VU0VTX1NMfFpNQUdJQykgICAgIC8qIHByb2dyYW0gd2hpY2ggdXNlcyBzbCAqLwotI2RlZmluZSBTUFFNQUdJQyAgICAgICAgKE1GX1VTRVNfU0x8UU1BR0lDKSAgICAgLyogc3FlZXplZCBkaXR0byAqLwotI2RlZmluZSBTTFpNQUdJQyAgICAgICAgKE1GX0lTX1NMfFpNQUdJQykgICAgICAgLyogc2hhcmVkIGxpYiBwYXJ0IG9mIHByb2cgKi8KLSNkZWZpbmUgU0xQWk1BR0lDICAgICAgIChNRl9VU0VTX1NMfFNMWk1BR0lDKSAgIC8qIHNsIHdoaWNoIHVzZXMgYW5vdGhlciAqLwotCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAoKHgpLmFfaW5mbyAmIE1GX1VTRVNfU0wpCi0KLS8qIE9ubHkgYSBwdXJlIE9NQUdJQyBmaWxlIGhhcyB0aGUgbWluaW1hbCBoZWFkZXIgKi8KLSNkZWZpbmUgTl9UWFRPRkYoeCkgICAgICAgICAgICAgICAgICAgICBcCi0gKCh4KS5hX2luZm8gPT0gT01BR0lDID8gMzIgICAgICAgICAgICAgXAotICA6IChOX01BR0lDKHgpID09IFpNQUdJQykgPyBUQVJHRVRfUEFHRV9TSVpFICBcCi0gIDogOTk5KQotCi0jZGVmaW5lIE5fVFhUQUREUih4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKE5fTUFHSUMoeCkgIT0gWk1BR0lDID8gMCAvKiBvYmplY3QgZmlsZSBvciBOTUFHSUMgKi8gICAgICAgICAgICAgICAgICAgICAgXAotICAgLyogUHJvZ3JhbXMgd2l0aCBzaGFyZWQgbGlicyBhcmUgbG9hZGVkIGF0IHRoZSBmaXJzdCBwYWdlIGFmdGVyIGFsbCB0aGUgICBcCi0gICAgICB0ZXh0IHNlZ21lbnRzIG9mIHRoZSBzaGFyZWQgbGlicmFyeSBwcm9ncmFtcy4gIFdpdGhvdXQgbG9va2luZyB0aGlzICAgIFwKLSAgICAgIHVwIHdlIGNhbid0IGtub3cgZXhhY3RseSB3aGF0IHRoZSBhZGRyZXNzIHdpbGwgYmUuICBBIHJlYXNvbmFibGUgZ3Vlc3MgXAotICAgICAgaXMgdGhhdCBhX2VudHJ5IHdpbGwgYmUgaW4gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGV4ZWN1dGFibGUuICAqLyAgICAgICBcCi0gICA6IE5fU0hBUkVEX0xJQih4KSA/ICgoeCkuYV9lbnRyeSAmIH4oVEFSR0VUX1BBR0VfU0laRSAtIDEpKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICA6IFRFWFRfU1RBUlRfQUREUikKLQotI2RlZmluZSBOX1NZTU9GRih4KSBcCi0gIChOX1RYVE9GRiAoeCkgKyAoeCkuYV90ZXh0ICsgKHgpLmFfZGF0YSArICh4KS5hX3Ryc2l6ZSArICh4KS5hX2Ryc2l6ZSkKLQotI2RlZmluZSBOX1NUUk9GRih4KSAoTl9TWU1PRkYgKHgpICsgKHgpLmFfc3ltcykKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMzI3NjgKLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAzMjc2OAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfYXJtCi0KLSNkZWZpbmUgTVkoT1ApIENBVChyaXNjaXhfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1yaXNjaXgiCi0jZGVmaW5lIE5fQkFETUFHKHgpICgoKCh4KS5hX2luZm8gJiB+MDA3MjAwKSAhPSBaTUFHSUMpICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICgoKHgpLmFfaW5mbyAmIH4wMDYwMDApICE9IE9NQUdJQykgJiYgXAotICAgICAgICAgICAgICAgICAgICAgKCh4KS5hX2luZm8gIT0gTk1BR0lDKSkKLSNkZWZpbmUgTl9NQUdJQyh4KSAoKHgpLmFfaW5mbyAmIH4wNzIwMCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApCQkJCQkgICBcCi0gIHsJCQkJCQkJCQkgICBcCi0gICAgYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7IC8qIGR1bW15IHZhcnMgKi8JCQkJICAgXAotICAgIGZpbGVfcHRyIHRleHRfZW5kOwkJCQkJCQkgICBcCi0gICAgaWYgKGFkYXRhKGFiZmQpLm1hZ2ljID09IHVuZGVjaWRlZF9tYWdpYykJCQkJICAgXAotICAgICAgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCk7CSAgIFwKLSAgICAJCQkJCQkJCQkgICBcCi0gICAgZXhlY3AtPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogRVhURVJOQUxfTkxJU1RfU0laRTsJICAgXAotICAgIGV4ZWNwLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsJCQkgICBcCi0gICAgCQkJCQkJCQkJICAgXAotICAgIGV4ZWNwLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgXAotCQkgICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCQkgICBcCi0gICAgZXhlY3AtPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCQkgICBcCi0JCSAgICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwkJCSAgIFwKLSAgICBOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9vdXQpIChhYmZkLCBleGVjcCwgJmV4ZWNfYnl0ZXMpOwkJICAgXAotICAgIAkJCQkJCQkJCSAgIFwKLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApIHJldHVybiBmYWxzZTsJICAgXAotICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCQkgICBcCi0JIT0gRVhFQ19CWVRFU19TSVpFKQkJCQkJCSAgIFwKLSAgICAgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAotICAgIC8qIE5vdyB3cml0ZSBvdXQgcmVsb2MgaW5mbywgZm9sbG93ZWQgYnkgc3ltcyBhbmQgc3RyaW5ncyAqLwkgICBcCi0JCQkJCQkJCQkgICBcCi0gICAgaWYgKGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgIT0gKGFzeW1ib2wgKiopIE5VTEwJCQkgICBcCi0JJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkJCQkJICAgXAotICAgICAgewkJCQkJCQkJCSAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9TWU1PRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICBcCi0JCQkJCQkJCQkgICBcCi0JaWYgKCEgTkFNRShhb3V0LHdyaXRlX3N5bXMpKGFiZmQpKSByZXR1cm4gZmFsc2U7CQkgICBcCi0JCQkJCQkJCQkgICBcCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fVFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAotCQkJCQkJCQkJICAgXAotCWlmICghIHJpc2NpeF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkJICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICBcCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fRFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAotCQkJCQkJCQkJICAgXAotCWlmICghTkFNRShhb3V0LHNxdWlydF9vdXRfcmVsb2NzKShhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCkpKQkgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLSAgICAgIH0JCQkJCQkJCQkgICBcCi0gIH0KLQotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yaXNjaXhfZml4X3BjcmVsXzI2X2RvbmUgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkJICBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yaXNjaXhfZml4X3BjcmVsXzI2IFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkJICAgICBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByaXNjaXhfc3RkX3JlbG9jX2hvd3RvW10gPSB7Ci0gIC8qIHR5cGUgICAgICAgICAgICAgIHJzIHNpemUgYnN6ICBwY3JlbCBiaXRwb3Mgb3ZyZiAgICAgICAgICAgICAgICAgICAgIHNmIG5hbWUgICAgIHBhcnRfaW5wbCByZWFkbWFzayAgc2V0bWFzayAgICBwY2RvbmUgKi8KLSAgSE9XVE8oIDAsICAgICAgICAgICAgICAwLCAgMCwgICA4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjgiLCAgICAgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKCAxLCAgICAgICAgICAgICAgMCwgIDEsICAgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIxNiIsICAgICAgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oIDIsICAgICAgICAgICAgICAwLCAgMiwgICAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjMyIiwgICAgICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyggMywgICAgICAgICAgICAgIDIsICAzLCAgIDI2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICByaXNjaXhfZml4X3BjcmVsXzI2ICwgIkFSTTI2IiwgICAgICB0cnVlLCAweDAwZmZmZmZmLDB4MDBmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oIDQsICAgICAgICAgICAgICAwLCAgMCwgICA4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1A4IiwgICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgdHJ1ZSksCi0gIEhPV1RPKCA1LCAgICAgICAgICAgICAgMCwgIDEsICAgMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQMTYiLCAgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIHRydWUpLAotICBIT1dUTyggNiwgICAgICAgICAgICAgIDAsICAyLCAgIDMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDMyIiwgICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCB0cnVlKSwKLSAgSE9XVE8oIDcsICAgICAgICAgICAgICAyLCAgMywgICAyNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIHJpc2NpeF9maXhfcGNyZWxfMjZfZG9uZSwgIkFSTTI2RCIsdHJ1ZSwweDAwZmZmZmZmLDB4MDBmZmZmZmYsIGZhbHNlKSwKLSAgRU1QVFlfSE9XVE8gKC0xKSwKLSAgSE9XVE8oIDksICAgICAgICAgICAgICAwLCAtMSwgICAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIk5FRzE2IiwgICAgICAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyggMTAsICAgICAgICAgICAgICAwLCAtMiwgICAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIk5FRzMyIiwgICAgICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpCi19OwotCi0jZGVmaW5lIFJJU0NJWF9UQUJMRV9TSVpFIFwKLSAgKHNpemVvZiAocmlzY2l4X3N0ZF9yZWxvY19ob3d0bykgLyBzaXplb2YgKHJlbG9jX2hvd3RvX3R5cGUpKQotCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXJpc2NpeF9maXhfcGNyZWxfMjZfZG9uZSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZGF0YSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogVGhpcyBpcyBkZWFkIHNpbXBsZSBhdCBwcmVzZW50LiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmlzY2l4X2ZpeF9wY3JlbF8yNiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+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+ZmlsZXBvcyArIHJlZ29mZnNldCwgU0VFS19TRVQpID09IC0xCi0JfHwgYmZkX3JlYWQobG9jYXRpb24sIHNpemVvZiAobXN0YXR1cy5ncHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKG1zdGF0dXMuZ3ByKSkKLQlyZXR1cm4gKGZhbHNlKTsgLyogb24gZXJyb3IgKi8KLQotICAgICAgLyogaW5jcmVtZW50IGxvY2F0aW9uIHRvIHRoZSBiZWdpbm5pbmcgb2Ygc3BlY2lhbCByZWdpc3RlcnMgaW4gdGhlIHNlY3Rpb24sCi0gICAgICAgICByZXNldCByZWdpc3RlciBvZmZzZXQgdmFsdWUgdG8gdGhlIGJlZ2lubmluZyBvZiBmaXJzdCBzcGVjaWFsIHJlZ2lzdGVyCi0JIGluIG1zdHNhdmUgc3RydWN0dXJlLCBhbmQgcmVhZCBzcGVjaWFsIHJlZ2lzdGVycy4gKi8KLQotICAgICAgbG9jYXRpb24gPSAoUFRSKSAoKGNoYXIqKWxvY2F0aW9uICsgc2l6ZW9mIChtc3RhdHVzLmdwcikpOwotICAgICAgcmVnb2Zmc2V0ID0gKGNoYXIqKSZtc3RhdHVzLmlhciAtIChjaGFyKikmbXN0YXR1czsKLQotICAgICAgaWYgKCBiZmRfc2VlayhhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgcmVnb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEKLQl8fCBiZmRfcmVhZChsb2NhdGlvbiwgNCAqIE5VTV9PRl9TUEVDX1JFR1MsIDEsIGFiZmQpICE9IAotCQkJCQkJCTQgKiBOVU1fT0ZfU1BFQ19SRUdTKQotCXJldHVybiAoZmFsc2UpOyAvKiBvbiBlcnJvciAqLwotICAgICAgCi0gICAgICAvKiBpbmNyZW1lbnQgbG9jYXRpb24gYWRkcmVzcywgYW5kIHJlYWQgdGhlIHNwZWNpYWwgcmVnaXN0ZXJzLi4gKi8KLSAgICAgIC8qIEZJWE1FbWdvICovCi0gICAgICByZXR1cm4gKHRydWUpOwotICAgIH0KLQotICAgIC8qIGVsc2UsIHVzZSBkZWZhdWx0IGJmZCBzZWN0aW9uIGNvbnRlbnQgdHJhbnNmZXIuICovCi0gICAgZWxzZQotICAgICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyAKLSAgICAgIAkJCShhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCk7Ci19Ci0KLSNlbmRpZiAvKiBBSVhfQ09SRSAqLwpkaWZmIC0tZ2l0IGEvYmZkL3NjbzUtY29yZS5jIGIvYmZkL3NjbzUtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmM5N2QyLi4wMDAwMDAwCi0tLSBhL2JmZC9zY281LWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKiBCRkQgYmFjayBlbmQgZm9yIFNDTzUgY29yZSBmaWxlcyAoVS1hcmVhIGFuZCByYXcgc2VjdGlvbnMpCi0gICBDb3B5cmlnaHQgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSm91a2UgTnVtYW4gPGpudW1hbkBoaXNjb20ubmw+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jaW5jbHVkZSA8c3lzL3VzZXIuaD4gICAgICAgICAgIC8qIEFmdGVyIGEub3V0LmggICovCi0jaW5jbHVkZSA8c3lzL3BhY2Nlc3MuaD4KLSNpbmNsdWRlIDxzeXMvcmVnaW9uLmg+Ci0KLXN0cnVjdCBzY281X2NvcmVfc3RydWN0Ci17Ci0gIHN0cnVjdCB1c2VyIHU7Ci19OwotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGJmZF9zaXplX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfdm1hLCBmaWxlX3B0cikpOwotc3RhdGljIGFzeW1ib2wgKnNjbzVfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHN0cnVjdCB1c2VyICpyZWFkX3VhcmVhIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLWNvbnN0IGJmZF90YXJnZXQgKnNjbzVfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1jaGFyICpzY281X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1pbnQgc2NvNV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuIHNjbzVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsCi0JCQkJCQkgICAgIGJmZCAqZXhlY19iZmQpKTsKLXN0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0KLSAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7Ci0gIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotc2NvNV9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0gCi1zdGF0aWMgc3RydWN0IHVzZXIgKgotcmVhZF91YXJlYShhYmZkLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBmaWxlcG9zOwotCi17Ci0gIHN0cnVjdCBzY281X2NvcmVfc3RydWN0ICpyYXdwdHI7Ci0KLSAgcmF3cHRyID0gKChzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCAqKQotCSAgICBiZmRfem1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCkpKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGFiZmQtPnRkYXRhLnNjbzVfY29yZV9kYXRhID0gcmF3cHRyOwotCi0gIGlmICgoYmZkX3NlZWsgKGFiZmQsIGZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgICAgfHwgKGJmZF9yZWFkICgodm9pZCAqKSZyYXdwdHItPnUsIDEsIHNpemVvZiByYXdwdHItPnUsIGFiZmQpCi0JICAhPSBzaXplb2YgcmF3cHRyLT51KSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBTYW5pdHkgY2hlY2sgcGVyaGFwcz8/PyAqLwotICBpZiAocmF3cHRyLT51LnVfZHNpemUgPiAweDEwMDAwMDApICAgIC8qIFJlbWVtYmVyLCBpdCdzIGluIHBhZ2VzLi4uICovCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGlmIChyYXdwdHItPnUudV9zc2l6ZSA+IDB4MTAwMDAwMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyYXdwdHItPnU7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLXNjbzVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGNvZmZzZXRfc2l6LCB2YWwsIG5zZWNzLCBjaGVhZG9mZnM7Ci0gIGludCBjb3Jlc2l6ZTsKLSAgc3RydWN0IHVzZXIgKnU7Ci0gIHN0cnVjdCBjb3Jlb2Zmc2V0cyBjb2Zmc2V0czsKLSAgc3RydWN0IGNvcmVzZWN0aGVhZCBjaGVhZDsKLSAgY2hhciAqc2VjbmFtZTsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgLyogUmVhZCBjb3Jlb2Zmc2V0cyByZWdpb24gYXQgZW5kIG9mIGNvcmUgKHNlZSBjb3JlKEZQKSkgKi8KLQotICB7Ci0gICAgRklMRSAqc3RyZWFtID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoZnN0YXQgKGZpbGVubyAoc3RyZWFtKSwgJnN0YXRidWYpIDwgMCkKLSAgICAgIHsKLSAgICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgY29yZXNpemUgPSBzdGF0YnVmLnN0X3NpemU7Ci0gIH0KLSAgLyogTGFzdCBsb25nIGluIGNvcmUgaXMgc2l6ZW9mIHN0cnVjdCBjb3Jlb2Zmc2V0cywgcmVhZCBpdCAqLwotICBpZiAoKGJmZF9zZWVrIChhYmZkLCBjb3Jlc2l6ZS1zaXplb2YgY29mZnNldF9zaXosIFNFRUtfU0VUKSAhPSAwKQotICAgICAgfHwgKGJmZF9yZWFkICgodm9pZCAqKSZjb2Zmc2V0X3NpeiwgMSwgc2l6ZW9mIGNvZmZzZXRfc2l6LCBhYmZkKQotCSAgIT0gc2l6ZW9mIGNvZmZzZXRfc2l6KSApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7IAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFVzZSBpdCB0byBzZWVrIHN0YXJ0IG9mIGNvcmVvZmZzZXRzIHJlZ2lvbiwgcmVhZCBpdCBhbmQgZGV0ZXJtaW5lCi0gICAgIHZhbGlkaXR5ICovCi0gIGlmICgoYmZkX3NlZWsgKGFiZmQsIGNvcmVzaXplLWNvZmZzZXRfc2l6LCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmY29mZnNldHMsIDEsIHNpemVvZiBjb2Zmc2V0cywgYWJmZCkKLQkgICE9IHNpemVvZiBjb2Zmc2V0cykKLSAgICAgIHx8ICgoY29mZnNldHMudV9pbmZvICE9IDEpICYmIChjb2Zmc2V0cy51X2luZm8gIT0gQ19WRVJTSU9OKSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7IAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0KLSAgaWYgKGNvZmZzZXRzLnVfaW5mbyA9PSAxKSAKLSAgICB7IAotICAgICAgLyogT2xkIHZlcnNpb24sIG5vIHNlY3Rpb24gaGVhZHMsIHJlYWQgaW5mbyBmcm9tIHVzZXIgc3RydWN0ICovCi0KLSAgICAgIHUgPSByZWFkX3VhcmVhKGFiZmQsIGNvZmZzZXRzLnVfdXNlcik7Ci0gICAgICBpZiAoISB1KQotICAgICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsIFNFQ19IQVNfQ09OVEVOVFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF9zaXplX3R5cGUpIGNvZmZzZXRzLnVfdXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gKGJmZF92bWEpIHUtPnVfYXIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVfcHRyKSBjb2Zmc2V0cy51X3VzZXIpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAKLSAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsIAotCQkJICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiZmRfc2l6ZV90eXBlKSB1LT51X2V4ZGF0YS51eF9kc2l6ZQotCQkJICAgICAgICsgdS0+dV9leGRhdGEudXhfYnNpemUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF92bWEpIHUtPnVfZXhkYXRhLnV4X2RhdG9yZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX3B0cikgY29mZnNldHMudV9kYXRhKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnN0YWNrIiwgCi0JCQkgICAgICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF9zaXplX3R5cGUpIHUtPnVfc3NpemUgKiBOQlBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF92bWEpIHUtPnVfc3ViLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVfcHRyKSBjb2Zmc2V0cy51X3N0YWNrKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgIHJldHVybiBhYmZkLT54dmVjOwkJLyogRG9uZSBmb3IgdmVyc2lvbiAxICovCi0gICAgfSAgICAgIAotCi0gIC8qIEltbWVkaWF0ZWx5IGJlZm9yZSBjb3Jlb2Zmc2V0cyByZWdpb24gaXMgYSBsb25nIHdpdGggb2Zmc2V0IGluIGNvcmUKLSAgICAgdG8gZmlyc3QgY29yZXNlY3RoZWFkIChDT1JFU19PRkZTRVRTKSwgdGhlIGxvbmcgYmVmb3JlIHRoaXMgaXMgdGhlCi0gICAgIG51bWJlciBvZiBzZWN0aW9uIGhlYWRzIGluIHRoZSBsaXN0LiBSZWFkIGJvdGggbG9uZ3MgYW5kIHJlYWQgdGhlCi0gICAgIGNvcmVzZWN0aGVhZCBhbmQgY2hlY2sgaXRzIHZhbGlkaXR5ICovCi0gICAgCi0gIGlmICgoYmZkX3NlZWsgKGFiZmQsIAotCQkgY29yZXNpemUgLSBjb2Zmc2V0X3NpeiAtIDIgKiBzaXplb2YgY29mZnNldF9zaXosIAotCQkgU0VFS19TRVQpICE9IDApCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJm5zZWNzLCAxLCBzaXplb2YgbnNlY3MsIGFiZmQpICE9IHNpemVvZiBuc2VjcykKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmY2hlYWRvZmZzLCAxLCBzaXplb2YgY2hlYWRvZmZzLCBhYmZkKQotCSAgIT0gc2l6ZW9mIGNoZWFkb2ZmcykKLSAgICAgIHx8IChiZmRfc2VlayAoYWJmZCwgY2hlYWRvZmZzLCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmY2hlYWQsIDEsIHNpemVvZiBjaGVhZCwgYWJmZCkgIT0gc2l6ZW9mIGNoZWFkKQotICAgICAgfHwgKGNoZWFkLmNzX3N0eXBlICE9IENPUkVTX09GRlNFVFMpCi0gICAgICB8fCAoY2hlYWQuY3NfeC5jc3hfbWFnaWMgIT0gQ09SRU1BR0lDX05VTUJFUikpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgLyogTm93IGxvb3Agb3ZlciBhbGwgcmVnaW9ucyBhbmQgbWFwIHRoZW0gKi8KLSAgbnNlY3MtLTsJCQkJLyogV2UndmUgc2VlbiBDT1JFU19PRkZTRVRTIGFscmVhZHkgKi8KLSAgZm9yICg7IG5zZWNzOyBuc2Vjcy0tKSAKLSAgICB7Ci0gICAgICBpZiAoKGJmZF9zZWVrIChhYmZkLCBjaGVhZC5jc19oc2VlaywgU0VFS19TRVQpICE9IDApCi0JICB8fCBiZmRfcmVhZCAoKHZvaWQgKikmY2hlYWQsIDEsIHNpemVvZiBjaGVhZCwgYWJmZCkgIT0gc2l6ZW9mIGNoZWFkKQotICAgICAgICB7Ci0gICAgICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7IAotICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgIHN3aXRjaCAoY2hlYWQuY3Nfc3R5cGUpIAotCXsKLQljYXNlIENPUkVTX01BR0lDOgkJCS8qIENvcmUgaGVhZGVyLCBjaGVjayBtYWdpYyAqLwotCSAgaWYgKGNoZWFkLmNzX3guY3N4X21hZ2ljICE9IENPUkVNQUdJQ19OVU1CRVIpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgc2VjbmFtZSA9IE5VTEw7Ci0JICBuc2VjcysrOwkJCQkvKiBNQUdJQyBub3QgaW4gc2VjdGlvbiBjbnQhKi8KLQkgIGJyZWFrOwotCWNhc2UgQ09SRVNfVUFSRUE6CQkJLyogVS1hcmVhLCByZWFkIGluIHRkYXRhICovCi0JICB1ID0gcmVhZF91YXJlYShhYmZkLCBjaGVhZC5jc19zc2Vlayk7Ci0JICBpZiAoISB1KQotCSAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICAgIC8qIFRoaXMgaXMgdHJpY2t5LiAgQXMgdGhlICJyZWdpc3RlciBzZWN0aW9uIiwgd2UgZ2l2ZSB0aGVtCi0JICAgICB0aGUgZW50aXJlIHVwYWdlIGFuZCBzdGFjay4gIHUudV9hcjAgcG9pbnRzIHRvIHdoZXJlCi0JICAgICAicmVnaXN0ZXIgMCIgaXMgc3RvcmVkLiAgVGhlcmUgYXJlIHR3byB0cmlja3Mgd2l0aCB0aGlzLAotCSAgICAgdGhvdWdoLiAgT25lIGlzIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIHJlZ2lzdGVycyBtaWdodCBiZQotCSAgICAgYXQgcG9zaXRpdmUgb3IgbmVnYXRpdmUgKG9yIGJvdGgpIGRpc3BsYWNlbWVudHMgZnJvbQotCSAgICAgKnVfYXIwLiAgVGhlIG90aGVyIGlzIHRoYXQgdV9hcjAgaXMgc29tZXRpbWVzIGFuIGFic29sdXRlCi0JICAgICBhZGRyZXNzIGluIGtlcm5lbCBtZW1vcnksIGFuZCBvbiBvdGhlciBzeXN0ZW1zIGl0IGlzIGFuCi0JICAgICBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBgc3RydWN0IHVzZXInLgotCQotCSAgICAgQXMgYSBwcmFjdGljYWwgbWF0dGVyLCB3ZSBkb24ndCBrbm93IHdoZXJlIHRoZSByZWdpc3RlcnMKLQkgICAgIGFjdHVhbGx5IGFyZSwgc28gd2UgaGF2ZSB0byBwYXNzIHRoZSB3aG9sZSBhcmVhIHRvIEdEQi4KLQkgICAgIFdlIGVuY29kZSB0aGUgdmFsdWUgb2YgdV9hcjAgYnkgc2V0dGluZyB0aGUgLnJlZ3Mgc2VjdGlvbgotCSAgICAgdXAgc28gdGhhdCBpdHMgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyAwIGlzIGF0IHRoZSBwbGFjZQotCSAgICAgcG9pbnRlZCB0byBieSB1X2FyMCAoYnkgc2V0dGluZyB0aGUgdm1hIG9mIHRoZSBzdGFydCBvZgotCSAgICAgdGhlIHNlY3Rpb24gdG8gLXVfYXIwKS4gIEdEQiB1c2VzIHRoaXMgaW5mbyB0byBsb2NhdGUgdGhlCi0JICAgICByZWdzLCB1c2luZyBtaW5vciB0cmlja2VyeSB0byBnZXQgYXJvdW5kIHRoZQotCSAgICAgb2Zmc2V0LW9yLWFic29sdXRlLWFkZHIgcHJvYmxlbS4gKi8KLQotCSAgY2hlYWQuY3NfdmFkZHIgPSAwIC0gKGJmZF92bWEpIHUtPnVfYXIwOwotCi0KLSAgICAgICAgICBzZWNuYW1lID0gIi5yZWciOwotICAgICAgICAgIGZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQotICAgICAgICAgIGJyZWFrOwotCWNhc2UgQ09SRVNfUFJFR0lPTjoJCQkvKiBBIHByb2dyYW0gcmVnaW9uLCBtYXAgaXQgKi8KLQkgIHN3aXRjaCAoY2hlYWQuY3NfeC5jc3hfcHJlZy5jc3hwX3J0eXApCi0JICAgIHsKLQkgICAgY2FzZSBQVF9EQVRBOgotCSAgICAgIHNlY25hbWUgPSAiLmRhdGEiOyAgCS8qIERhdGEgcmVnaW9uLiAgICAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX1NUQUNLOgotCSAgICAgIHNlY25hbWUgPSAiLnN0YWNrIjsgCS8qIFN0YWNrIHJlZ2lvbi4gICAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX1NITUVNOgotCSAgICAgIHNlY25hbWUgPSAiLnNobWVtIjsgCS8qIFNoYXJlZCBtZW1vcnkgICAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX0xJQkRBVDoKLQkgICAgICBzZWNuYW1lID0gIi5saWJkYXQiOwkvKiBTaGFyZWQgbGlicmFyeSBkYXRhICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9WODY6Ci0JICAgICAgc2VjbmFtZSA9ICIudmlydDg2IjsJLyogVmlydHVhbCA4MDg2IG1vZGUgICAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUFRfU0hGSUw6Ci0JICAgICAgc2VjbmFtZSA9ICIubW1maWxlIjsJLyogTWVtb3J5IG1hcHBlZCBmaWxlICAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUFRfWERBVEEwOgotCSAgICAgIHNlY25hbWUgPSAiLlhkYXQwIjsgCS8qIFhFTklYIGRhdGEgcmVnaW9uLCB2aXJ0dWFsIDAgKi8KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzZWNuYW1lID0gIiI7Ci0JICAgIH0KLQkgIGZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JFU19QUk9DOgkJCS8qIHN0cnVjdCBwcm9jICovCi0JY2FzZSBDT1JFU19JVElNRVI6CQkJLyogaW50ZXJ2YWwgdGltZXJzICovCi0JY2FzZSBDT1JFU19TQ09VVFNOQU1FOgkJCS8qIHN0cnVjdCBzY291dHNuYW1lICovCi0JICBzZWNuYW1lID0gTlVMTDsJLyogSWdub3JlIHRoZXNlICovCi0JICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJVbmhhbmRsZWQgU0NPIGNvcmUgZmlsZSBzZWN0aW9uIHR5cGUgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVhZC5jc19zdHlwZSk7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKHNlY25hbWUKLQkgICYmICFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgc2VjbmFtZSwgZmxhZ3MsCi0JCQkJIChiZmRfc2l6ZV90eXBlKSBjaGVhZC5jc192c2l6ZSwKLQkJCQkgKGJmZF92bWEpIGNoZWFkLmNzX3ZhZGRyLAotCQkJCSAoZmlsZV9wdHIpIGNoZWFkLmNzX3NzZWVrKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICB9Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLX0KLQotY2hhciAqCi1zY281X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqY29tID0gYWJmZC0+dGRhdGEuc2NvNV9jb3JlX2RhdGEtPnUudV9jb21tOwotICBpZiAoKmNvbSkKLSAgICByZXR1cm4gY29tOwotICBlbHNlCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1pbnQKLXNjbzVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLXsKLSAgcmV0dXJuICgoaWdub3JlX2FiZmQtPnRkYXRhLnNjbzVfY29yZV9kYXRhLT51LnVfc3lzYWJvcnQgIT0gMCkgCi0JICA/IGlnbm9yZV9hYmZkLT50ZGF0YS5zY281X2NvcmVfZGF0YS0+dS51X3N5c2Fib3J0IAotCSAgOiAtMSk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1ib29sZWFuCi1zY281X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsgICAgICAgICAgLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotCi0jZGVmaW5lIHNjbzVfY29yZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgc2NvNV9jb3JlX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBzY281X2NvcmVfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotI2RlZmluZSBzY281X2NvcmVfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBzY281X2NvcmVfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgc2NvNV9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBzY281X2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgc2NvNV9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgc2NvNV9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBzY281X2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUgTk9fR0VUICAoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lIE5PX1BVVCAgKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZSBOT19TSUdORURfR0VUIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBzY281X2NvcmVfdmVjID0KLSAgewotICAgICJzY281LWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fTElUVExFLCAgICAgICAgIC8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9MSVRUTEUsICAgICAgICAgLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfCAgICAgICAvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwgICAgICAgICAvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwgICAgICAgICAvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwgICAgICAgICAvKiBhcmNoaXZlICovCi0gICAgIHNjbzVfY29yZV9maWxlX3AgICAgICAJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLQotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChzY281KSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoc2NvNV9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICBOVUxMLAotICAgIAotICAgIChQVFIpIDAgICAgICAgICAgICAgICAgICAgICAvKiBiYWNrZW5kX2RhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvc2VjdGlvbi5jIGIvYmZkL3NlY3Rpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjYTQ0My4uMDAwMDAwMAotLS0gYS9iZmQvc2VjdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0MSArMCwwIEBACi0vKiBPYmplY3QgZmlsZSAic2VjdGlvbiIgc3VwcG9ydCBmb3IgdGhlIEJGRCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCVNlY3Rpb25zCi0KLQlUaGUgcmF3IGRhdGEgY29udGFpbmVkIHdpdGhpbiBhIEJGRCBpcyBtYWludGFpbmVkIHRocm91Z2ggdGhlCi0Jc2VjdGlvbiBhYnN0cmFjdGlvbi4gIEEgc2luZ2xlIEJGRCBtYXkgaGF2ZSBhbnkgbnVtYmVyIG9mCi0Jc2VjdGlvbnMuICBJdCBrZWVwcyBob2xkIG9mIHRoZW0gYnkgcG9pbnRpbmcgdG8gdGhlIGZpcnN0OwotCWVhY2ggb25lIHBvaW50cyB0byB0aGUgbmV4dCBpbiB0aGUgbGlzdC4KLQotCVNlY3Rpb25zIGFyZSBzdXBwb3J0ZWQgaW4gQkZEIGluIDw8c2VjdGlvbi5jPj4uCi0KLUBtZW51Ci1AKiBTZWN0aW9uIElucHV0OjoKLUAqIFNlY3Rpb24gT3V0cHV0OjoKLUAqIHR5cGVkZWYgYXNlY3Rpb246OgotQCogc2VjdGlvbiBwcm90b3R5cGVzOjoKLUBlbmQgbWVudQotCi1JTk9ERQotU2VjdGlvbiBJbnB1dCwgU2VjdGlvbiBPdXRwdXQsIFNlY3Rpb25zLCBTZWN0aW9ucwotU1VCU0VDVElPTgotCVNlY3Rpb24gaW5wdXQKLQotCVdoZW4gYSBCRkQgaXMgb3BlbmVkIGZvciByZWFkaW5nLCB0aGUgc2VjdGlvbiBzdHJ1Y3R1cmVzIGFyZQotCWNyZWF0ZWQgYW5kIGF0dGFjaGVkIHRvIHRoZSBCRkQuCi0KLQlFYWNoIHNlY3Rpb24gaGFzIGEgbmFtZSB3aGljaCBkZXNjcmliZXMgdGhlIHNlY3Rpb24gaW4gdGhlCi0Jb3V0c2lkZSB3b3JsZC0tLWZvciBleGFtcGxlLCA8PGEub3V0Pj4gd291bGQgY29udGFpbiBhdCBsZWFzdAotCXRocmVlIHNlY3Rpb25zLCBjYWxsZWQgPDwudGV4dD4+LCA8PC5kYXRhPj4gYW5kIDw8LmJzcz4+LgotCi0JTmFtZXMgbmVlZCBub3QgYmUgdW5pcXVlOyBmb3IgZXhhbXBsZSBhIENPRkYgZmlsZSBtYXkgaGF2ZSBzZXZlcmFsCi0Jc2VjdGlvbnMgbmFtZWQgPDwuZGF0YT4+LgotCi0JU29tZXRpbWVzIGEgQkZEIHdpbGwgY29udGFpbiBtb3JlIHRoYW4gdGhlIGBgbmF0dXJhbCcnIG51bWJlciBvZgotCXNlY3Rpb25zLiBBIGJhY2sgZW5kIG1heSBhdHRhY2ggb3RoZXIgc2VjdGlvbnMgY29udGFpbmluZwotCWNvbnN0cnVjdG9yIGRhdGEsIG9yIGFuIGFwcGxpY2F0aW9uIG1heSBhZGQgYSBzZWN0aW9uICh1c2luZwotCTw8YmZkX21ha2Vfc2VjdGlvbj4+KSB0byB0aGUgc2VjdGlvbnMgYXR0YWNoZWQgdG8gYW4gYWxyZWFkeSBvcGVuCi0JQkZELiBGb3IgZXhhbXBsZSwgdGhlIGxpbmtlciBjcmVhdGVzIGFuIGV4dHJhIHNlY3Rpb24KLQk8PENPTU1PTj4+IGZvciBlYWNoIGlucHV0IGZpbGUncyBCRkQgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dAotCWNvbW1vbiBzdG9yYWdlLgotCi0JVGhlIHJhdyBkYXRhIGlzIG5vdCBuZWNlc3NhcmlseSByZWFkIGluIHdoZW4KLQl0aGUgc2VjdGlvbiBkZXNjcmlwdG9yIGlzIGNyZWF0ZWQuIFNvbWUgdGFyZ2V0cyBtYXkgbGVhdmUgdGhlCi0JZGF0YSBpbiBwbGFjZSB1bnRpbCBhIDw8YmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzPj4gY2FsbCBpcwotCW1hZGUuIE90aGVyIGJhY2sgZW5kcyBtYXkgcmVhZCBpbiBhbGwgdGhlIGRhdGEgYXQgb25jZS4gIEZvcgotCWV4YW1wbGUsIGFuIFMtcmVjb3JkIGZpbGUgaGFzIHRvIGJlIHJlYWQgb25jZSB0byBkZXRlcm1pbmUgdGhlCi0Jc2l6ZSBvZiB0aGUgZGF0YS4gQW4gSUVFRS02OTUgZmlsZSBkb2Vzbid0IGNvbnRhaW4gcmF3IGRhdGEgaW4KLQlzZWN0aW9ucywgYnV0IGRhdGEgYW5kIHJlbG9jYXRpb24gZXhwcmVzc2lvbnMgaW50ZXJtaXhlZCwgc28KLQl0aGUgZGF0YSBhcmVhIGhhcyB0byBiZSBwYXJzZWQgdG8gZ2V0IG91dCB0aGUgZGF0YSBhbmQKLQlyZWxvY2F0aW9ucy4KLQotSU5PREUKLVNlY3Rpb24gT3V0cHV0LCB0eXBlZGVmIGFzZWN0aW9uLCBTZWN0aW9uIElucHV0LCBTZWN0aW9ucwotCi1TVUJTRUNUSU9OCi0JU2VjdGlvbiBvdXRwdXQKLQotCVRvIHdyaXRlIGEgbmV3IG9iamVjdCBzdHlsZSBCRkQsIHRoZSB2YXJpb3VzIHNlY3Rpb25zIHRvIGJlCi0Jd3JpdHRlbiBoYXZlIHRvIGJlIGNyZWF0ZWQuIFRoZXkgYXJlIGF0dGFjaGVkIHRvIHRoZSBCRkQgaW4KLQl0aGUgc2FtZSB3YXkgYXMgaW5wdXQgc2VjdGlvbnM7IGRhdGEgaXMgd3JpdHRlbiB0byB0aGUKLQlzZWN0aW9ucyB1c2luZyA8PGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cz4+LgotCi0JQW55IHByb2dyYW0gdGhhdCBjcmVhdGVzIG9yIGNvbWJpbmVzIHNlY3Rpb25zIChlLmcuLCB0aGUgYXNzZW1ibGVyCi0JYW5kIGxpbmtlcikgbXVzdCB1c2UgdGhlIDw8YXNlY3Rpb24+PiBmaWVsZHMgPDxvdXRwdXRfc2VjdGlvbj4+IGFuZAotCTw8b3V0cHV0X29mZnNldD4+IHRvIGluZGljYXRlIHRoZSBmaWxlIHNlY3Rpb25zIHRvIHdoaWNoIGVhY2gKLQlzZWN0aW9uIG11c3QgYmUgd3JpdHRlbi4gIChJZiB0aGUgc2VjdGlvbiBpcyBiZWluZyBjcmVhdGVkIGZyb20KLQlzY3JhdGNoLCA8PG91dHB1dF9zZWN0aW9uPj4gc2hvdWxkIHByb2JhYmx5IHBvaW50IHRvIHRoZSBzZWN0aW9uCi0JaXRzZWxmIGFuZCA8PG91dHB1dF9vZmZzZXQ+PiBzaG91bGQgcHJvYmFibHkgYmUgemVyby4pCi0KLQlUaGUgZGF0YSB0byBiZSB3cml0dGVuIGNvbWVzIGZyb20gaW5wdXQgc2VjdGlvbnMgYXR0YWNoZWQKLQkodmlhIDw8b3V0cHV0X3NlY3Rpb24+PiBwb2ludGVycykgdG8KLQl0aGUgb3V0cHV0IHNlY3Rpb25zLiAgVGhlIG91dHB1dCBzZWN0aW9uIHN0cnVjdHVyZSBjYW4gYmUKLQljb25zaWRlcmVkIGEgZmlsdGVyIGZvciB0aGUgaW5wdXQgc2VjdGlvbjogdGhlIG91dHB1dCBzZWN0aW9uCi0JZGV0ZXJtaW5lcyB0aGUgdm1hIG9mIHRoZSBvdXRwdXQgZGF0YSBhbmQgdGhlIG5hbWUsIGJ1dCB0aGUKLQlpbnB1dCBzZWN0aW9uIGRldGVybWluZXMgdGhlIG9mZnNldCBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiBvZgotCXRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4uCi0KLQlFLmcuLCB0byBjcmVhdGUgYSBzZWN0aW9uICJPIiwgc3RhcnRpbmcgYXQgMHgxMDAsIDB4MTIzIGxvbmcsCi0JY29udGFpbmluZyB0d28gc3Vic2VjdGlvbnMsICJBIiBhdCBvZmZzZXQgMHgwIChpLmUuLCBhdCB2bWEKLQkweDEwMCkgYW5kICJCIiBhdCBvZmZzZXQgMHgyMCAoaS5lLiwgYXQgdm1hIDB4MTIwKSB0aGUgPDxhc2VjdGlvbj4+Ci0Jc3RydWN0dXJlcyB3b3VsZCBsb29rIGxpa2U6Ci0KLXwgICBzZWN0aW9uIG5hbWUgICAgICAgICAgIkEiCi18ICAgICBvdXRwdXRfb2Zmc2V0ICAgMHgwMAotfCAgICAgc2l6ZSAgICAgICAgICAgIDB4MjAKLXwgICAgIG91dHB1dF9zZWN0aW9uIC0tLS0tLS0tLS0tPiAgc2VjdGlvbiBuYW1lICAgICJPIgotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICB2bWEgICAgICAgICAgICAgMHgxMDAKLXwgICBzZWN0aW9uIG5hbWUgICAgICAgICAgIkIiIHwgICAgc2l6ZSAgICAgICAgICAgIDB4MTIzCi18ICAgICBvdXRwdXRfb2Zmc2V0ICAgMHgyMCAgICB8Ci18ICAgICBzaXplICAgICAgICAgICAgMHgxMDMgICB8Ci18ICAgICBvdXRwdXRfc2VjdGlvbiAgLS0tLS0tLS18Ci0KLQotU1VCU0VDVElPTgotCUxpbmsgb3JkZXJzCi0KLQlUaGUgZGF0YSB3aXRoaW4gYSBzZWN0aW9uIGlzIHN0b3JlZCBpbiBhIEBkZm57bGlua19vcmRlcn0uCi0JVGhlc2UgYXJlIG11Y2ggbGlrZSB0aGUgZml4dXBzIGluIDw8Z2FzPj4uICBUaGUgbGlua19vcmRlcgotCWFic3RyYWN0aW9uIGFsbG93cyBhIHNlY3Rpb24gdG8gZ3JvdyBhbmQgc2hyaW5rIHdpdGhpbiBpdHNlbGYuCi0KLQlBIGxpbmtfb3JkZXIga25vd3MgaG93IGJpZyBpdCBpcywgYW5kIHdoaWNoIGlzIHRoZSBuZXh0Ci0JbGlua19vcmRlciBhbmQgd2hlcmUgdGhlIHJhdyBkYXRhIGZvciBpdCBpczsgaXQgYWxzbyBwb2ludHMgdG8KLQlhIGxpc3Qgb2YgcmVsb2NhdGlvbnMgd2hpY2ggYXBwbHkgdG8gaXQuCi0KLQlUaGUgbGlua19vcmRlciBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gcGVyZm9ybSByZWxheGluZyBvbgotCWZpbmFsIGNvZGUuICBUaGUgY29tcGlsZXIgY3JlYXRlcyBjb2RlIHdoaWNoIGlzIGFzIGJpZyBhcwotCW5lY2Vzc2FyeSB0byBtYWtlIGl0IHdvcmsgd2l0aG91dCByZWxheGluZywgYW5kIHRoZSB1c2VyIGNhbgotCXNlbGVjdCB3aGV0aGVyIHRvIHJlbGF4LiAgU29tZXRpbWVzIHJlbGF4aW5nIHRha2VzIGEgbG90IG9mCi0JdGltZS4gIFRoZSBsaW5rZXIgcnVucyBhcm91bmQgdGhlIHJlbG9jYXRpb25zIHRvIHNlZSBpZiBhbnkKLQlhcmUgYXR0YWNoZWQgdG8gZGF0YSB3aGljaCBjYW4gYmUgc2hydW5rLCBpZiBzbyBpdCBkb2VzIGl0IG9uCi0JYSBsaW5rX29yZGVyIGJ5IGxpbmtfb3JkZXIgYmFzaXMuCi0KLSovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotLyoKLURPQ0RECi1JTk9ERQotdHlwZWRlZiBhc2VjdGlvbiwgc2VjdGlvbiBwcm90b3R5cGVzLCBTZWN0aW9uIE91dHB1dCwgU2VjdGlvbnMKLVNVQlNFQ1RJT04KLQl0eXBlZGVmIGFzZWN0aW9uCi0KLQlIZXJlIGlzIHRoZSBzZWN0aW9uIHN0cnVjdHVyZToKLQotQ09ERV9GUkFHTUVOVAotLgotLiB7KiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhIGNvbWRhdCBzZWN0aW9uLCBhcyBpbiBQRS4gIEEgY29tZGF0Ci0uICAgIHNlY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBzeW1ib2wuICBXaGVuIHRoZSBsaW5rZXIKLS4gICAgc2VlcyBhIGNvbWRhdCBzZWN0aW9uLCBpdCBrZWVwcyBvbmx5IG9uZSBvZiB0aGUgc2VjdGlvbnMgd2l0aCBhCi0uICAgIGdpdmVuIG5hbWUgYW5kIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHN5bWJvbC4gKn0KLS4KLS5zdHJ1Y3QgYmZkX2NvbWRhdF9pbmZvCi0uewotLiAgeyogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYSBjb21kYXQgc2VjdGlvbi4gICp9Ci0uICBjb25zdCBjaGFyICpuYW1lOwotLgotLiAgeyogVGhlIGxvY2FsIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBhCi0uICAgICBjb21kYXQgc2VjdGlvbi4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIHRvIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQKLS4gICAgIHNwZWNpZmljIGNvZGU7IGl0IGlzIG5vdCBhbiBpbmRleCBpbnRvIHRoZSBsaXN0IHJldHVybmVkIGJ5Ci0uICAgICBiZmRfY2Fub25pY2FsaXplX3N5bXRhYi4gICp9Ci0uICBsb25nIHN5bWJvbDsKLS4KLS4gIHsqIElmIHRoaXMgc2VjdGlvbiBpcyBiZWluZyBkaXNjYXJkZWQsIHRoZSBsaW5rZXIgdXNlcyB0aGlzIGZpZWxkCi0uICAgICB0byBwb2ludCB0byB0aGUgaW5wdXQgc2VjdGlvbiB3aGljaCBpcyBiZWluZyBrZXB0LiAgKn0KLS4gIHN0cnVjdCBzZWMgKnNlYzsKLS59OwotLgotLnR5cGVkZWYgc3RydWN0IHNlYwotLnsKLS4gICAgICAgIHsqIFRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uOyB0aGUgbmFtZSBpc24ndCBhIGNvcHksIHRoZSBwb2ludGVyIGlzCi0uICAgICAgICB0aGUgc2FtZSBhcyB0aGF0IHBhc3NlZCB0byBiZmRfbWFrZV9zZWN0aW9uLiAqfQotLgotLiAgICBDT05TVCBjaGFyICpuYW1lOwotLgotLiAgICAgICAgeyogV2hpY2ggc2VjdGlvbiBpcyBpdDsgMC4ubnRoLiAgICAgICp9Ci0uCi0uICAgaW50IGluZGV4OwotLgotLiAgICAgICAgeyogVGhlIG5leHQgc2VjdGlvbiBpbiB0aGUgbGlzdCBiZWxvbmdpbmcgdG8gdGhlIEJGRCwgb3IgTlVMTC4gKn0KLS4KLS4gICAgc3RydWN0IHNlYyAqbmV4dDsKLS4KLS4gICAgICAgIHsqIFRoZSBmaWVsZCBmbGFncyBjb250YWlucyBhdHRyaWJ1dGVzIG9mIHRoZSBzZWN0aW9uLiBTb21lCi0uICAgICAgICAgICBmbGFncyBhcmUgcmVhZCBpbiBmcm9tIHRoZSBvYmplY3QgZmlsZSwgYW5kIHNvbWUgYXJlCi0uICAgICAgICAgICBzeW50aGVzaXplZCBmcm9tIG90aGVyIGluZm9ybWF0aW9uLiAgKn0KLS4KLS4gICAgZmxhZ3dvcmQgZmxhZ3M7Ci0uCi0uI2RlZmluZSBTRUNfTk9fRkxBR1MgICAweDAwMAotLgotLiAgICAgICAgeyogVGVsbHMgdGhlIE9TIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB0aGlzIHNlY3Rpb24gd2hlbiBsb2FkaW5nLgotLiAgICAgICAgICAgVGhpcyBpcyBjbGVhciBmb3IgYSBzZWN0aW9uIGNvbnRhaW5pbmcgZGVidWcgaW5mb3JtYXRpb24KLS4gICAgICAgICAgIG9ubHkuICp9Ci0uI2RlZmluZSBTRUNfQUxMT0MgICAgICAweDAwMQotLgotLiAgICAgICAgeyogVGVsbHMgdGhlIE9TIHRvIGxvYWQgdGhlIHNlY3Rpb24gZnJvbSB0aGUgZmlsZSB3aGVuIGxvYWRpbmcuCi0uICAgICAgICAgICBUaGlzIGlzIGNsZWFyIGZvciBhIC5ic3Mgc2VjdGlvbi4gKn0KLS4jZGVmaW5lIFNFQ19MT0FEICAgICAgIDB4MDAyCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBjb250YWlucyBkYXRhIHN0aWxsIHRvIGJlIHJlbG9jYXRlZCwgc28gdGhlcmUgaXMKLS4gICAgICAgICAgIHNvbWUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0b28uICp9Ci0uI2RlZmluZSBTRUNfUkVMT0MgICAgICAweDAwNAotLgotLiNpZiAwICAgeyogT2Jzb2xldGUgPyAqfQotLiNkZWZpbmUgU0VDX0JBTElHTiAgICAgMHgwMDgKLS4jZW5kaWYKLS4KLS4gICAgICAgIHsqIEEgc2lnbmFsIHRvIHRoZSBPUyB0aGF0IHRoZSBzZWN0aW9uIGNvbnRhaW5zIHJlYWQgb25seQotLiAgICAgICAgICBkYXRhLiAqfQotLiNkZWZpbmUgU0VDX1JFQURPTkxZICAgMHgwMTAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvZGUgb25seS4gKn0KLS4jZGVmaW5lIFNFQ19DT0RFICAgICAgIDB4MDIwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBjb250YWlucyBkYXRhIG9ubHkuICp9Ci0uI2RlZmluZSBTRUNfREFUQSAgICAgICAweDA0MAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gd2lsbCByZXNpZGUgaW4gUk9NLiAqfQotLiNkZWZpbmUgU0VDX1JPTSAgICAgICAgMHgwODAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbnN0cnVjdG9yIGluZm9ybWF0aW9uLiBUaGlzIHNlY3Rpb24KLS4gICAgICAgICAgIHR5cGUgaXMgdXNlZCBieSB0aGUgbGlua2VyIHRvIGNyZWF0ZSBsaXN0cyBvZiBjb25zdHJ1Y3RvcnMgYW5kCi0uICAgICAgICAgICBkZXN0cnVjdG9ycyB1c2VkIGJ5IDw8ZysrPj4uIFdoZW4gYSBiYWNrIGVuZCBzZWVzIGEgc3ltYm9sCi0uICAgICAgICAgICB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBhIGNvbnN0cnVjdG9yIGxpc3QsIGl0IGNyZWF0ZXMgYSBuZXcKLS4gICAgICAgICAgIHNlY3Rpb24gZm9yIHRoZSB0eXBlIG9mIG5hbWUgKGUuZy4sIDw8X19DVE9SX0xJU1RfXz4+KSwgYXR0YWNoZXMKLS4gICAgICAgICAgIHRoZSBzeW1ib2wgdG8gaXQsIGFuZCBidWlsZHMgYSByZWxvY2F0aW9uLiBUbyBidWlsZCB0aGUgbGlzdHMKLS4gICAgICAgICAgIG9mIGNvbnN0cnVjdG9ycywgYWxsIHRoZSBsaW5rZXIgaGFzIHRvIGRvIGlzIGNhdGVuYXRlIGFsbCB0aGUKLS4gICAgICAgICAgIHNlY3Rpb25zIGNhbGxlZCA8PF9fQ1RPUl9MSVNUX18+PiBhbmQgcmVsb2NhdGUgdGhlIGRhdGEKLS4gICAgICAgICAgIGNvbnRhaW5lZCB3aXRoaW4gLSBleGFjdGx5IHRoZSBvcGVyYXRpb25zIGl0IHdvdWxkIHBlZm9ybSBvbgotLiAgICAgICAgICAgc3RhbmRhcmQgZGF0YS4gKn0KLS4jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUiAweDEwMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gaXMgYSBjb25zdHJ1Y3RvciwgYW5kIHNob3VsZCBiZSBwbGFjZWQgYXQgdGhlCi0uICAgICAgICAgIGVuZCBvZiB0aGUgdGV4dCwgZGF0YSwgb3IgYnNzIHNlY3Rpb24oPykuICp9Ci0uI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfVEVYVCAweDExMDAKLS4jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9EQVRBIDB4MjEwMAotLiNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX0JTUyAgMHgzMTAwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBoYXMgY29udGVudHMgLSBhIGRhdGEgc2VjdGlvbiBjb3VsZCBiZQotLiAgICAgICAgICAgPDxTRUNfQUxMT0M+PiB8IDw8U0VDX0hBU19DT05URU5UUz4+OyBhIGRlYnVnIHNlY3Rpb24gY291bGQgYmUKLS4gICAgICAgICAgIDw8U0VDX0hBU19DT05URU5UUz4+ICp9Ci0uI2RlZmluZSBTRUNfSEFTX0NPTlRFTlRTIDB4MjAwCi0uCi0uICAgICAgICB7KiBBbiBpbnN0cnVjdGlvbiB0byB0aGUgbGlua2VyIHRvIG5vdCBvdXRwdXQgdGhlIHNlY3Rpb24KLS4gICAgICAgICAgIGV2ZW4gaWYgaXQgaGFzIGluZm9ybWF0aW9uIHdoaWNoIHdvdWxkIG5vcm1hbGx5IGJlIHdyaXR0ZW4uICp9Ci0uI2RlZmluZSBTRUNfTkVWRVJfTE9BRCAweDQwMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gaXMgYSBDT0ZGIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb24uICBUaGlzIGZsYWcgaXMKLS4gICAgICAgICAgIG9ubHkgZm9yIHRoZSBsaW5rZXIuICBJZiB0aGlzIHR5cGUgb2Ygc2VjdGlvbiBhcHBlYXJzIGluCi0uICAgICAgICAgICB0aGUgaW5wdXQgZmlsZSwgdGhlIGxpbmtlciBtdXN0IGNvcHkgaXQgdG8gdGhlIG91dHB1dCBmaWxlCi0uICAgICAgICAgICB3aXRob3V0IGNoYW5naW5nIHRoZSB2bWEgb3Igc2l6ZS4gIEZJWE1FOiBBbHRob3VnaCB0aGlzCi0uICAgICAgICAgICB3YXMgb3JpZ2luYWxseSBpbnRlbmRlZCB0byBiZSBnZW5lcmFsLCBpdCByZWFsbHkgaXMgQ09GRgotLiAgICAgICAgICAgc3BlY2lmaWMgKGFuZCB0aGUgZmxhZyB3YXMgcmVuYW1lZCB0byBpbmRpY2F0ZSB0aGlzKS4gIEl0Ci0uICAgICAgICAgICBtaWdodCBiZSBjbGVhbmVyIHRvIGhhdmUgc29tZSBtb3JlIGdlbmVyYWwgbWVjaGFuaXNtIHRvCi0uICAgICAgICAgICBhbGxvdyB0aGUgYmFjayBlbmQgdG8gY29udHJvbCB3aGF0IHRoZSBsaW5rZXIgZG9lcyB3aXRoCi0uICAgICAgICAgICBzZWN0aW9ucy4gKn0KLS4jZGVmaW5lIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZIDB4ODAwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBjb250YWlucyBjb21tb24gc3ltYm9scyAoc3ltYm9scyBtYXkgYmUgZGVmaW5lZAotLiAgICAgICAgICAgbXVsdGlwbGUgdGltZXMsIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBpcyB0aGUgYW1vdW50IG9mCi0uICAgICAgICAgICBzcGFjZSBpdCByZXF1aXJlcywgYW5kIHRoZSBsYXJnZXN0IHN5bWJvbCB2YWx1ZSBpcyB0aGUgb25lCi0uICAgICAgICAgICB1c2VkKS4gIE1vc3QgdGFyZ2V0cyBoYXZlIGV4YWN0bHkgb25lIG9mIHRoZXNlICh3aGljaCB3ZQotLgkgICAgdHJhbnNsYXRlIHRvIGJmZF9jb21fc2VjdGlvbl9wdHIpLCBidXQgRUNPRkYgaGFzIHR3by4gKn0KLS4jZGVmaW5lIFNFQ19JU19DT01NT04gMHg4MDAwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBjb250YWlucyBvbmx5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEZvcgotLiAgICAgICAgICAgZXhhbXBsZSwgdGhpcyBpcyBzZXQgZm9yIEVMRiAuZGVidWcgYW5kIC5zdGFiIHNlY3Rpb25zLgotLiAgICAgICAgICAgc3RyaXAgdGVzdHMgdGhpcyBmbGFnIHRvIHNlZSBpZiBhIHNlY3Rpb24gY2FuIGJlCi0uICAgICAgICAgICBkaXNjYXJkZWQuICp9Ci0uI2RlZmluZSBTRUNfREVCVUdHSU5HIDB4MTAwMDAKLS4KLS4gICAgICAgIHsqIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIGhlbGQgaW4gbWVtb3J5IHBvaW50ZWQgdG8KLS4gICAgICAgICAgIGJ5IHRoZSBjb250ZW50cyBmaWVsZC4gIFRoaXMgaXMgY2hlY2tlZCBieQotLiAgICAgICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzLCBhbmQgdGhlIGRhdGEgaXMgcmV0cmlldmVkIGZyb20KLS4gICAgICAgICAgIG1lbW9yeSBpZiBhcHByb3ByaWF0ZS4gICp9Ci0uI2RlZmluZSBTRUNfSU5fTUVNT1JZIDB4MjAwMDAKLS4KLS4gICAgICAgIHsqIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIHRvIGJlIGV4Y2x1ZGVkIGJ5IHRoZQotLgkgICAgbGlua2VyIGZvciBleGVjdXRhYmxlIGFuZCBzaGFyZWQgb2JqZWN0cyB1bmxlc3MgdGhvc2UKLS4JICAgIG9iamVjdHMgYXJlIHRvIGJlIGZ1cnRoZXIgcmVsb2NhdGVkLiAgKn0KLS4jZGVmaW5lIFNFQ19FWENMVURFIDB4NDAwMDAKLS4KLS4JeyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgdG8gYmUgc29ydGVkIGJ5IHRoZQotLgkgICBiYXNlZCBvbiB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIGFzc29jaWF0ZWQgc3ltYm9sCi0uCSAgIHRhYmxlLiAgKn0KLS4jZGVmaW5lIFNFQ19TT1JUX0VOVFJJRVMgMHg4MDAwMAotLgotLgl7KiBXaGVuIGxpbmtpbmcsIGR1cGxpY2F0ZSBzZWN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIHNob3VsZCBiZQotLgkgICBkaXNjYXJkZWQsIHJhdGhlciB0aGFuIGJlaW5nIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc2VjdGlvbiBhcwotLgkgICBpcyB1c3VhbGx5IGRvbmUuICBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IGNvbW1vbiBzeW1ib2xzIGFyZQotLgkgICBoYW5kbGVkLiAgU2VlIFNFQ19MSU5LX0RVUExJQ0FURVMgYmVsb3cuICAqfQotLiNkZWZpbmUgU0VDX0xJTktfT05DRSAweDEwMDAwMAotLgotLgl7KiBJZiBTRUNfTElOS19PTkNFIGlzIHNldCwgdGhpcyBiaXRmaWVsZCBkZXNjcmliZXMgaG93IHRoZSBsaW5rZXIKLS4JICAgc2hvdWxkIGhhbmRsZSBkdXBsaWNhdGUgc2VjdGlvbnMuICAqfQotLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFUyAweDYwMDAwMAotLgotLgl7KiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgZHVwbGljYXRlCi0uCSAgIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBzaG91bGQgc2ltcGx5IGJlIGRpc2NhcmRlZC4gKn0KLS4jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRCAweDAKLS4KLS4JeyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IHRoZSBsaW5rZXIKLS4JICAgc2hvdWxkIHdhcm4gaWYgdGhlcmUgYXJlIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMsIGFsdGhvdWdoCi0uCSAgIGl0IHNob3VsZCBzdGlsbCBvbmx5IGxpbmsgb25lIGNvcHkuICAqfQotLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWSAweDIwMDAwMAotLgotLgl7KiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotLgkgICBzaG91bGQgd2FybiBpZiBhbnkgZHVwbGljYXRlIHNlY3Rpb25zIGFyZSBhIGRpZmZlcmVudCBzaXplLiAgKn0KLS4jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFIDB4NDAwMDAwCi0uCi0uCXsqIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0uCSAgIHNob3VsZCB3YXJuIGlmIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMgY29udGFpbiBkaWZmZXJlbnQKLS4JICAgY29udGVudHMuICAqfQotLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTIDB4NjAwMDAwCi0uCi0uCXsqIFRoaXMgc2VjdGlvbiB3YXMgY3JlYXRlZCBieSB0aGUgbGlua2VyIGFzIHBhcnQgb2YgZHluYW1pYwotLgkgICByZWxvY2F0aW9uIG9yIG90aGVyIGFyY2FuZSBwcm9jZXNzaW5nLiAgSXQgaXMgc2tpcHBlZCB3aGVuCi0uCSAgIGdvaW5nIHRocm91Z2ggdGhlIGZpcnN0LXBhc3Mgb3V0cHV0LCB0cnVzdGluZyB0aGF0IHNvbWVvbmUKLS4JICAgZWxzZSB1cCB0aGUgbGluZSB3aWxsIHRha2UgY2FyZSBvZiBpdCBsYXRlci4gICp9Ci0uI2RlZmluZSBTRUNfTElOS0VSX0NSRUFURUQgMHg4MDAwMDAKLS4KLS4JeyogVGhpcyBzZWN0aW9uIHNob3VsZCBub3QgYmUgc3ViamVjdCB0byBnYXJiYWdlIGNvbGxlY3Rpb24uICAqfQotLiNkZWZpbmUgU0VDX0tFRVAgMHgxMDAwMDAwCi0uCi0uCXsqIFRoaXMgc2VjdGlvbiBjb250YWlucyAic2hvcnQiIGRhdGEsIGFuZCBzaG91bGQgYmUgcGxhY2VkCi0uCSAgICJuZWFyIiB0aGUgR1AuICAqfQotLiNkZWZpbmUgU0VDX1NNQUxMX0RBVEEgMHgyMDAwMDAwCi0uCi0uIAl7KiBUaGlzIHNlY3Rpb24gY29udGFpbnMgZGF0YSB3aGljaCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIKLS4JICAgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMuICAqfQotLiNkZWZpbmUgU0VDX1NIQVJFRCAweDQwMDAwMDAKLS4KLS4JeyogIEVuZCBvZiBzZWN0aW9uIGZsYWdzLiAgKn0KLS4KLS4JeyogU29tZSBpbnRlcm5hbCBwYWNrZWQgYm9vbGVhbiBmaWVsZHMuICAqfQotLgotLgl7KiBTZWUgdGhlIHZtYSBmaWVsZC4gICp9Ci0uCXVuc2lnbmVkIGludCB1c2VyX3NldF92bWEgOiAxOwotLgotLgl7KiBXaGV0aGVyIHJlbG9jYXRpb25zIGhhdmUgYmVlbiBwcm9jZXNzZWQuICAqfQotLgl1bnNpZ25lZCBpbnQgcmVsb2NfZG9uZSA6IDE7Ci0uCi0uCXsqIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBvZiB0aGUgbGlua2VyIGJhY2tlbmRzLiAgKn0KLS4JdW5zaWduZWQgaW50IGxpbmtlcl9tYXJrIDogMTsKLS4KLS4JeyogQSBtYXJrIGZsYWcgdXNlZCBieSBzb21lIGxpbmtlciBiYWNrZW5kcyBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKn0KLS4JdW5zaWduZWQgaW50IGdjX21hcmsgOiAxOwotLgotLgl7KiBFbmQgb2YgaW50ZXJuYWwgcGFja2VkIGJvb2xlYW4gZmllbGRzLiAgKn0KLS4KLS4gICAgICAgeyogIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIC0gd2hlcmUgaXQgd2lsbCBiZQotLiAgICAgICAgICAgYXQgcnVuIHRpbWUuICBUaGUgc3ltYm9scyBhcmUgcmVsb2NhdGVkIGFnYWluc3QgdGhpcy4gIFRoZQotLgkgICAgdXNlcl9zZXRfdm1hIGZsYWcgaXMgbWFpbnRhaW5lZCBieSBiZmQ7IGlmIGl0J3Mgbm90IHNldCwgdGhlCi0uCSAgICBiYWNrZW5kIGNhbiBhc3NpZ24gYWRkcmVzc2VzIChmb3IgZXhhbXBsZSwgaW4gPDxhLm91dD4+LCB3aGVyZQotLgkgICAgdGhlIGRlZmF1bHQgYWRkcmVzcyBmb3IgPDwuZGF0YT4+IGlzIGRlcGVuZGVudCBvbiB0aGUgc3BlY2lmaWMKLS4JICAgIHRhcmdldCBhbmQgdmFyaW91cyBmbGFncykuICAqfQotLgotLiAgIGJmZF92bWEgdm1hOwotLgotLiAgICAgICB7KiAgVGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdvdWxkIGJlIGluIGEKLS4gICAgICAgICAgIHJvbSBpbWFnZTsgcmVhbGx5IG9ubHkgdXNlZCBmb3Igd3JpdGluZyBzZWN0aW9uIGhlYWRlcgotLgkgICAgaW5mb3JtYXRpb24uICp9Ci0uCi0uICAgYmZkX3ZtYSBsbWE7Ci0uCi0uICAgICAgICB7KiBUaGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBpbiBieXRlcywgYXMgaXQgd2lsbCBiZSBvdXRwdXQuCi0uICAgICAgICAgICBjb250YWlucyBhIHZhbHVlIGV2ZW4gaWYgdGhlIHNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzIChlLmcuLCB0aGUKLS4gICAgICAgICAgIHNpemUgb2YgPDwuYnNzPj4pLiBUaGlzIHdpbGwgYmUgZmlsbGVkIGluIGFmdGVyIHJlbG9jYXRpb24gKn0KLS4KLS4gICBiZmRfc2l6ZV90eXBlIF9jb29rZWRfc2l6ZTsKLS4KLS4gICAgICAgIHsqIFRoZSBvcmlnaW5hbCBzaXplIG9uIGRpc2sgb2YgdGhlIHNlY3Rpb24sIGluIGJ5dGVzLiAgTm9ybWFsbHkgdGhpcwotLgkgICAgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUsIGJ1dCBpZiBzb21lIHJlbGF4aW5nIGhhcwotLgkgICAgYmVlbiBkb25lLCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBiaWdnZXIuICAqfQotLgotLiAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotLgotLiAgICAgICAgeyogSWYgdGhpcyBzZWN0aW9uIGlzIGdvaW5nIHRvIGJlIG91dHB1dCwgdGhlbiB0aGlzIHZhbHVlIGlzIHRoZQotLiAgICAgICAgICAgb2Zmc2V0IGludG8gdGhlIG91dHB1dCBzZWN0aW9uIG9mIHRoZSBmaXJzdCBieXRlIGluIHRoZSBpbnB1dAotLiAgICAgICAgICAgc2VjdGlvbi4gRS5nLiwgaWYgdGhpcyB3YXMgZ29pbmcgdG8gc3RhcnQgYXQgdGhlIDEwMHRoIGJ5dGUgaW4KLS4gICAgICAgICAgIHRoZSBvdXRwdXQgc2VjdGlvbiwgdGhpcyB2YWx1ZSB3b3VsZCBiZSAxMDAuICp9Ci0uCi0uICAgYmZkX3ZtYSBvdXRwdXRfb2Zmc2V0OwotLgotLiAgICAgICAgeyogVGhlIG91dHB1dCBzZWN0aW9uIHRocm91Z2ggd2hpY2ggdG8gbWFwIG9uIG91dHB1dC4gKn0KLS4KLS4gICBzdHJ1Y3Qgc2VjICpvdXRwdXRfc2VjdGlvbjsKLS4KLS4gICAgICAgIHsqIFRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgdGhlIHNlY3Rpb24sIGFzIGFuIGV4cG9uZW50IG9mIDIgLQotLiAgICAgICAgICAgZS5nLiwgMyBhbGlnbnMgdG8gMl4zIChvciA4KS4gKn0KLS4KLS4gICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwotLgotLiAgICAgICAgeyogSWYgYW4gaW5wdXQgc2VjdGlvbiwgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHJlbG9jYXRpb24KLS4gICAgICAgICAgIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKn0KLS4KLS4gICBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKnJlbG9jYXRpb247Ci0uCi0uICAgICAgICB7KiBJZiBhbiBvdXRwdXQgc2VjdGlvbiwgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHBvaW50ZXJzIHRvCi0uICAgICAgICAgICByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKn0KLS4KLS4gICBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKipvcmVsb2NhdGlvbjsKLS4KLS4gICAgICAgIHsqIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzIGluIG9uZSBvZiB0aGUgYWJvdmUgICp9Ci0uCi0uICAgdW5zaWduZWQgcmVsb2NfY291bnQ7Ci0uCi0uICAgICAgICB7KiBJbmZvcm1hdGlvbiBiZWxvdyBpcyBiYWNrIGVuZCBzcGVjaWZpYyAtIGFuZCBub3QgYWx3YXlzIHVzZWQKLS4gICAgICAgICAgIG9yIHVwZGF0ZWQuICAqfQotLgotLiAgICAgICAgeyogRmlsZSBwb3NpdGlvbiBvZiBzZWN0aW9uIGRhdGEgICAgKn0KLS4KLS4gICBmaWxlX3B0ciBmaWxlcG9zOwotLgotLiAgICAgICAgeyogRmlsZSBwb3NpdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gKn0KLS4KLS4gICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIEZpbGUgcG9zaXRpb24gb2YgbGluZSBkYXRhICAgICAgICp9Ci0uCi0uICAgZmlsZV9wdHIgbGluZV9maWxlcG9zOwotLgotLiAgICAgICAgeyogUG9pbnRlciB0byBkYXRhIGZvciBhcHBsaWNhdGlvbnMgKn0KLS4KLS4gICBQVFIgdXNlcmRhdGE7Ci0uCi0uICAgICAgICB7KiBJZiB0aGUgU0VDX0lOX01FTU9SWSBmbGFnIGlzIHNldCwgdGhpcyBwb2ludHMgdG8gdGhlIGFjdHVhbAotLiAgICAgICAgICAgY29udGVudHMuICAqfQotLiAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotLgotLiAgICAgICAgeyogQXR0YWNoZWQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gKn0KLS4KLS4gICBhbGVudCAqbGluZW5vOwotLgotLiAgICAgICAgeyogTnVtYmVyIG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgICAqfQotLgotLiAgIHVuc2lnbmVkIGludCBsaW5lbm9fY291bnQ7Ci0uCi0uCSB7KiBPcHRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIENPTURBVCBlbnRyeTsgTlVMTCBpZiBub3QgQ09NREFUICp9Ci0uCi0uICAgc3RydWN0IGJmZF9jb21kYXRfaW5mbyAqY29tZGF0OwotLgotLiAgICAgICAgeyogV2hlbiBhIHNlY3Rpb24gaXMgYmVpbmcgb3V0cHV0LCB0aGlzIHZhbHVlIGNoYW5nZXMgYXMgbW9yZQotLiAgICAgICAgICAgbGluZW51bWJlcnMgYXJlIHdyaXR0ZW4gb3V0ICp9Ci0uCi0uICAgZmlsZV9wdHIgbW92aW5nX2xpbmVfZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIFdoYXQgdGhlIHNlY3Rpb24gbnVtYmVyIGlzIGluIHRoZSB0YXJnZXQgd29ybGQgICp9Ci0uCi0uICAgaW50IHRhcmdldF9pbmRleDsKLS4KLS4gICBQVFIgdXNlZF9ieV9iZmQ7Ci0uCi0uICAgICAgICB7KiBJZiB0aGlzIGlzIGEgY29uc3RydWN0b3Igc2VjdGlvbiB0aGVuIGhlcmUgaXMgYSBsaXN0IG9mIHRoZQotLiAgICAgICAgICAgcmVsb2NhdGlvbnMgY3JlYXRlZCB0byByZWxvY2F0ZSBpdGVtcyB3aXRoaW4gaXQuICp9Ci0uCi0uICAgc3RydWN0IHJlbGVudF9jaGFpbiAqY29uc3RydWN0b3JfY2hhaW47Ci0uCi0uICAgICAgICB7KiBUaGUgQkZEIHdoaWNoIG93bnMgdGhlIHNlY3Rpb24uICp9Ci0uCi0uICAgYmZkICpvd25lcjsKLS4KLS4JIHsqIEEgc3ltYm9sIHdoaWNoIHBvaW50cyBhdCB0aGlzIHNlY3Rpb24gb25seSAqfQotLiAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLS4gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9sX3B0cl9wdHI7Ci0uCi0uICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX2hlYWQ7Ci0uICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX3RhaWw7Ci0ufSBhc2VjdGlvbiA7Ci0uCi0uICAgIHsqIFRoZXNlIHNlY3Rpb25zIGFyZSBnbG9iYWwsIGFuZCBhcmUgbWFuYWdlZCBieSBCRkQuICBUaGUgYXBwbGljYXRpb24KLS4gICAgICAgYW5kIHRhcmdldCBiYWNrIGVuZCBhcmUgbm90IHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIHZhbHVlcyBpbgotLgl0aGVzZSBzZWN0aW9ucy4gIE5ldyBjb2RlIHNob3VsZCB1c2UgdGhlIHNlY3Rpb25fcHRyIG1hY3JvcyByYXRoZXIKLS4gICAgICAgdGhhbiByZWZlcnJpbmcgZGlyZWN0bHkgdG8gdGhlIGNvbnN0IHNlY3Rpb25zLiAgVGhlIGNvbnN0IHNlY3Rpb25zCi0uICAgICAgIG1heSBldmVudHVhbGx5IHZhbmlzaC4gICp9Ci0uI2RlZmluZSBCRkRfQUJTX1NFQ1RJT05fTkFNRSAiKkFCUyoiCi0uI2RlZmluZSBCRkRfVU5EX1NFQ1RJT05fTkFNRSAiKlVORCoiCi0uI2RlZmluZSBCRkRfQ09NX1NFQ1RJT05fTkFNRSAiKkNPTSoiCi0uI2RlZmluZSBCRkRfSU5EX1NFQ1RJT05fTkFNRSAiKklORCoiCi0uCi0uICAgIHsqIHRoZSBhYnNvbHV0ZSBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9hYnNfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9hYnNfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2Fic19zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX2Fic19zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0uICAgIHsqIFBvaW50ZXIgdG8gdGhlIHVuZGVmaW5lZCBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF91bmRfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF91bmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX3VuZF9zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX3VuZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF91bmRfc2VjdGlvbl9wdHIpCi0uICAgIHsqIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9jb21fc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9jb21fc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2NvbV9zZWN0aW9uKQotLiAgICB7KiBQb2ludGVyIHRvIHRoZSBpbmRpcmVjdCBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9pbmRfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9pbmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2luZF9zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX2luZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9pbmRfc2VjdGlvbl9wdHIpCi0uCi0uZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfYWJzX3N5bWJvbDsKLS5leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9jb21fc3ltYm9sOwotLmV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX3VuZF9zeW1ib2w7Ci0uZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfaW5kX3N5bWJvbDsKLS4jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyhzZWN0aW9uKSBcCi0uICAgICAoc2VjdGlvbi0+cmVsb2NfZG9uZSA/IChhYm9ydCgpLDEpOiAoc2VjdGlvbiktPl9yYXdfc2l6ZSkKLS4jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jKHNlY3Rpb24pIFwKLS4gICAgICgoc2VjdGlvbi0+cmVsb2NfZG9uZSkgPyAoc2VjdGlvbiktPl9jb29rZWRfc2l6ZTogKGFib3J0KCksMSkpCi0qLwotCi0vKiBXZSB1c2UgYSBtYWNybyB0byBpbml0aWFsaXplIHRoZSBzdGF0aWMgYXN5bWJvbCBzdHJ1Y3R1cmVzIGJlY2F1c2UKLSAgIHRyYWRpdGlvbmFsIEMgZG9lcyBub3QgcGVybWl0IHVzIHRvIGluaXRpYWxpemUgYSB1bmlvbiBtZW1iZXIgd2hpbGUKLSAgIGdjYyB3YXJucyBpZiB3ZSBkb24ndCBpbml0aWFsaXplIGl0LiAgKi8KLSAvKiB0aGVfYmZkLCBuYW1lLCB2YWx1ZSwgYXR0ciwgc2VjdGlvbiBbLCB1ZGF0YV0gKi8KLSNpZmRlZiBfX1NURENfXwotI2RlZmluZSBHTE9CQUxfU1lNX0lOSVQoTkFNRSwgU0VDVElPTikgXAotICB7IDAsIE5BTUUsIDAsIEJTRl9TRUNUSU9OX1NZTSwgKGFzZWN0aW9uICopIFNFQ1RJT04sIHsgMCB9fQotI2Vsc2UKLSNkZWZpbmUgR0xPQkFMX1NZTV9JTklUKE5BTUUsIFNFQ1RJT04pIFwKLSAgeyAwLCBOQU1FLCAwLCBCU0ZfU0VDVElPTl9TWU0sIChhc2VjdGlvbiAqKSBTRUNUSU9OIH0KLSNlbmRpZgotCi0vKiBUaGVzZSBzeW1ib2xzIGFyZSBnbG9iYWwsIG5vdCBzcGVjaWZpYyB0byBhbnkgQkZELiAgVGhlcmVmb3JlLCBhbnl0aGluZwotICAgdGhhdCB0cmllcyB0byBjaGFuZ2UgdGhlbSBpcyBicm9rZW4sIGFuZCBzaG91bGQgYmUgcmVwYWlyZWQuICAqLwotCi1zdGF0aWMgY29uc3QgYXN5bWJvbCBnbG9iYWxfc3ltc1tdID0KLXsKLSAgR0xPQkFMX1NZTV9JTklUIChCRkRfQ09NX1NFQ1RJT05fTkFNRSwgJmJmZF9jb21fc2VjdGlvbiksCi0gIEdMT0JBTF9TWU1fSU5JVCAoQkZEX1VORF9TRUNUSU9OX05BTUUsICZiZmRfdW5kX3NlY3Rpb24pLAotICBHTE9CQUxfU1lNX0lOSVQgKEJGRF9BQlNfU0VDVElPTl9OQU1FLCAmYmZkX2Fic19zZWN0aW9uKSwKLSAgR0xPQkFMX1NZTV9JTklUIChCRkRfSU5EX1NFQ1RJT05fTkFNRSwgJmJmZF9pbmRfc2VjdGlvbikKLX07Ci0KLSNkZWZpbmUgU1REX1NFQ1RJT04oU0VDLCBGTEFHUywgU1lNLCBOQU1FLCBJRFgpCVwKLSAgY29uc3QgYXN5bWJvbCAqIGNvbnN0IFNZTSA9IChhc3ltYm9sICopICZnbG9iYWxfc3ltc1tJRFhdOyBcCi0gIGNvbnN0IGFzZWN0aW9uIFNFQyA9IFwKLSAgICAvKiBuYW1lLCBpbmRleCwgbmV4dCwgZmxhZ3MsIHNldF92bWEsIHJlbG9jX2RvbmUsIGxpbmtlcl9tYXJrLCBnY19tYXJrICovIFwKLSAgICB7IE5BTUUsICAwLCAgICAgMCwgICAgRkxBR1MsIDAsICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgICAwLAkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0gICAgLyogdm1hLCBsbWEsIF9jb29rZWRfc2l6ZSwgX3Jhd19zaXplLCBvdXRwdXRfb2Zmc2V0LCBvdXRwdXRfc2VjdGlvbiwgKi8gICBcCi0gICAgICAgMCwgICAwLCAgIDAsICAgICAgICAgICAgMCwgICAgICAgICAwLCAgICAgICAgICAgICAoc3RydWN0IHNlYyAqKSAmU0VDLCBcCi0JCQkJCQkJCQkgICAgICBcCi0gICAgLyogYWxpZy4uLiwgcmVsb2MuLi4sIG9yZWwuLi4sIHJlbG9jX2NvdW50LCBmaWxlcG9zLCByZWxfLi4uLCBsaW5lXy4uLiAqLyBcCi0gICAgICAgMCwgICAgICAgMCwgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAwLCAgICAgICAwLCAJICAgMCwJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotICAgIC8qIHVzZXJkYXRhLCBjb250ZW50cywgbGluZW5vLCBsaW5lbm9fY291bnQgKi8gCQkJICAgICAgXAotICAgICAgIDAsICAgICAgICAwLCAgICAgICAgMCwgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLSAgICAvKiBjb21kYXRfaW5mbywgbW92aW5nX2xpbmVfZmlsZXBvcywgdGFyZ2V0X2luZGV4LCB1c2VkX2J5X2JmZCwgICovICAgICAgIFwKLSAgICAgICBOVUxMLCAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAwLCAJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLSAgICAvKiBjb25zLi4uLCBvd25lciwgc3ltYm9sICovIAkJCQkJICAgICAgXAotICAgICAgIDAsICAgICAgIDAsICAgICAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKSAmZ2xvYmFsX3N5bXNbSURYXSwgICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotICAgIC8qIHN5bWJvbF9wdHJfcHRyLCAgICAgICAgICAgICAgICAgICAgICBsaW5rX29yZGVyX2hlYWQsIC4uLl90YWlsICovICAgICAgXAotICAgICAgIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSAmU1lNLCAwLCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotU1REX1NFQ1RJT04gKGJmZF9jb21fc2VjdGlvbiwgU0VDX0lTX0NPTU1PTiwgYmZkX2NvbV9zeW1ib2wsCi0JICAgICBCRkRfQ09NX1NFQ1RJT05fTkFNRSwgMCk7Ci1TVERfU0VDVElPTiAoYmZkX3VuZF9zZWN0aW9uLCAwLCBiZmRfdW5kX3N5bWJvbCwgQkZEX1VORF9TRUNUSU9OX05BTUUsIDEpOwotU1REX1NFQ1RJT04gKGJmZF9hYnNfc2VjdGlvbiwgMCwgYmZkX2Fic19zeW1ib2wsIEJGRF9BQlNfU0VDVElPTl9OQU1FLCAyKTsKLVNURF9TRUNUSU9OIChiZmRfaW5kX3NlY3Rpb24sIDAsIGJmZF9pbmRfc3ltYm9sLCBCRkRfSU5EX1NFQ1RJT05fTkFNRSwgMyk7Ci0jdW5kZWYgU1REX1NFQ1RJT04KLQotLyoKLURPQ0RECi1JTk9ERQotc2VjdGlvbiBwcm90b3R5cGVzLCAgLCB0eXBlZGVmIGFzZWN0aW9uLCBTZWN0aW9ucwotU1VCU0VDVElPTgotCVNlY3Rpb24gcHJvdG90eXBlcwotCi1UaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyBleHBvcnRlZCBieSB0aGUgc2VjdGlvbiBoYW5kbGluZyBwYXJ0IG9mIEJGRC4KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0KLVNZTk9QU0lTCi0JYXNlY3Rpb24gKmJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSk7Ci0KLURFU0NSSVBUSU9OCi0JUnVuIHRocm91Z2ggQHZhcnthYmZkfSBhbmQgcmV0dXJuIHRoZSBvbmUgb2YgdGhlCi0JPDxhc2VjdGlvbj4+cyB3aG9zZSBuYW1lIG1hdGNoZXMgQHZhcntuYW1lfSwgb3RoZXJ3aXNlIDw8TlVMTD4+LgotCUB4cmVme1NlY3Rpb25zfSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLQlUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gc3BlY2lhbCBjYXNlczsgdGhlIG5vcm1hbCB3YXkgdG8gcHJvY2VzcwotCWFsbCBzZWN0aW9ucyBvZiBhIGdpdmVuIG5hbWUgaXMgdG8gdXNlIDw8YmZkX21hcF9vdmVyX3NlY3Rpb25zPj4gYW5kCi0JPDxzdHJjbXA+PiBvbiB0aGUgbmFtZSAob3IgYmV0dGVyIHlldCwgYmFzZSBpdCBvbiB0aGUgc2VjdGlvbiBmbGFncwotCW9yIHNvbWV0aGluZyBlbHNlKSBmb3IgZWFjaCBzZWN0aW9uLgotKi8KLQotYXNlY3Rpb24gKgotYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgYXNlY3Rpb24gKnNlY3Q7Ci0KLSAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3QgIT0gTlVMTDsgc2VjdCA9IHNlY3QtPm5leHQpCi0gICAgaWYgKCFzdHJjbXAgKHNlY3QtPm5hbWUsIG5hbWUpKQotICAgICAgcmV0dXJuIHNlY3Q7Ci0gIHJldHVybiBOVUxMOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheQotCi1TWU5PUFNJUwotCWFzZWN0aW9uICpiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlDcmVhdGUgYSBuZXcgZW1wdHkgc2VjdGlvbiBjYWxsZWQgQHZhcntuYW1lfQotCWFuZCBhdHRhY2ggaXQgdG8gdGhlIGVuZCBvZiB0aGUgY2hhaW4gb2Ygc2VjdGlvbnMgZm9yIHRoZQotCUJGRCBAdmFye2FiZmR9LiBBbiBhdHRlbXB0IHRvIGNyZWF0ZSBhIHNlY3Rpb24gd2l0aCBhIG5hbWUgd2hpY2gKLQlpcyBhbHJlYWR5IGluIHVzZSByZXR1cm5zIGl0cyBwb2ludGVyIHdpdGhvdXQgY2hhbmdpbmcgdGhlCi0Jc2VjdGlvbiBjaGFpbi4KLQotCUl0IGhhcyB0aGUgZnVubnkgbmFtZSBzaW5jZSB0aGlzIGlzIHRoZSB3YXkgaXQgdXNlZCB0byBiZQotCWJlZm9yZSBpdCB3YXMgcmV3cml0dGVuLi4uLgotCi0JUG9zc2libGUgZXJyb3JzIGFyZToKLQlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLQotCUlmIG91dHB1dCBoYXMgYWxyZWFkeSBzdGFydGVkIGZvciB0aGlzIEJGRC4KLQlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLQlJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KLQotKi8KLQotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLSAgaWYgKHNlYyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgICB9Ci0gIHJldHVybiBzZWM7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5Ci0KLVNZTk9QU0lTCi0JYXNlY3Rpb24gKmJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSk7Ci0KLURFU0NSSVBUSU9OCi0gICBDcmVhdGUgYSBuZXcgZW1wdHkgc2VjdGlvbiBjYWxsZWQgQHZhcntuYW1lfSBhbmQgYXR0YWNoIGl0IHRvIHRoZSBlbmQgb2YKLSAgIHRoZSBjaGFpbiBvZiBzZWN0aW9ucyBmb3IgQHZhcnthYmZkfS4gIENyZWF0ZSBhIG5ldyBzZWN0aW9uIGV2ZW4gaWYgdGhlcmUKLSAgIGlzIGFscmVhZHkgYSBzZWN0aW9uIHdpdGggdGhhdCBuYW1lLgotCi0gICBSZXR1cm4gPDxOVUxMPj4gYW5kIHNldCA8PGJmZF9lcnJvcj4+IG9uIGVycm9yOyBwb3NzaWJsZSBlcnJvcnMgYXJlOgotICAgbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0gSWYgb3V0cHV0IGhhcyBhbHJlYWR5IHN0YXJ0ZWQgZm9yIEB2YXJ7YWJmZH0uCi0gICBvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0gSWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCi0qLwotCi1zZWNfcHRyCi1iZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLSAgYXNlY3Rpb24gKipwcmV2ID0gJmFiZmQtPnNlY3Rpb25zOwotICBhc2VjdGlvbiAqc2VjdCA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgd2hpbGUgKHNlY3QpCi0gICAgewotICAgICAgcHJldiA9ICZzZWN0LT5uZXh0OwotICAgICAgc2VjdCA9IHNlY3QtPm5leHQ7Ci0gICAgfQotCi0gIG5ld3NlY3QgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAobmV3c2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIG5ld3NlY3QtPm5hbWUgPSBuYW1lOwotICBuZXdzZWN0LT5pbmRleCA9IGFiZmQtPnNlY3Rpb25fY291bnQrKzsKLSAgbmV3c2VjdC0+ZmxhZ3MgPSBTRUNfTk9fRkxBR1M7Ci0KLSAgbmV3c2VjdC0+dXNlcmRhdGEgPSBOVUxMOwotICBuZXdzZWN0LT5jb250ZW50cyA9IE5VTEw7Ci0gIG5ld3NlY3QtPm5leHQgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgbmV3c2VjdC0+cmVsb2NhdGlvbiA9IChhcmVsZW50ICopIE5VTEw7Ci0gIG5ld3NlY3QtPnJlbG9jX2NvdW50ID0gMDsKLSAgbmV3c2VjdC0+bGluZV9maWxlcG9zID0gMDsKLSAgbmV3c2VjdC0+b3duZXIgPSBhYmZkOwotICBuZXdzZWN0LT5jb21kYXQgPSBOVUxMOwotCi0gIC8qIENyZWF0ZSBhIHN5bWJvbCB3aG9zIG9ubHkgam9iIGlzIHRvIHBvaW50IHRvIHRoaXMgc2VjdGlvbi4gVGhpcyBpcwotICAgICB1c2VmdWwgZm9yIHRoaW5ncyBsaWtlIHJlbG9jcyB3aGljaCBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2Ugb2YgYQotICAgICBzZWN0aW9uLiAgKi8KLSAgbmV3c2VjdC0+c3ltYm9sID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgaWYgKG5ld3NlY3QtPnN5bWJvbCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBuZXdzZWN0LT5zeW1ib2wtPm5hbWUgPSBuYW1lOwotICBuZXdzZWN0LT5zeW1ib2wtPnZhbHVlID0gMDsKLSAgbmV3c2VjdC0+c3ltYm9sLT5zZWN0aW9uID0gbmV3c2VjdDsKLSAgbmV3c2VjdC0+c3ltYm9sLT5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQotICBuZXdzZWN0LT5zeW1ib2xfcHRyX3B0ciA9ICZuZXdzZWN0LT5zeW1ib2w7Ci0KLSAgaWYgKEJGRF9TRU5EIChhYmZkLCBfbmV3X3NlY3Rpb25faG9vaywgKGFiZmQsIG5ld3NlY3QpKSAhPSB0cnVlKQotICAgIHsKLSAgICAgIGZyZWUgKG5ld3NlY3QpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICpwcmV2ID0gbmV3c2VjdDsKLSAgcmV0dXJuIG5ld3NlY3Q7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX3NlY3Rpb24KLQotU1lOT1BTSVMKLQlhc2VjdGlvbiAqYmZkX21ha2Vfc2VjdGlvbihiZmQgKiwgQ09OU1QgY2hhciAqbmFtZSk7Ci0KLURFU0NSSVBUSU9OCi0gICBMaWtlIDw8YmZkX21ha2Vfc2VjdGlvbl9hbnl3YXk+PiwgYnV0IHJldHVybiA8PE5VTEw+PiAod2l0aG91dCBjYWxsaW5nCi0gICBiZmRfc2V0X2Vycm9yICgpKSB3aXRob3V0IGNoYW5naW5nIHRoZSBzZWN0aW9uIGNoYWluIGlmIHRoZXJlIGlzIGFscmVhZHkgYQotICAgc2VjdGlvbiBuYW1lZCBAdmFye25hbWV9LiAgSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHJldHVybiA8PE5VTEw+PiBhbmQgc2V0Ci0gICA8PGJmZF9lcnJvcj4+LgotKi8KLQotYXNlY3Rpb24gKgotYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqc2VjdCA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsIEJGRF9BQlNfU0VDVElPTl9OQU1FKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgIH0KLSAgaWYgKHN0cmNtcCAobmFtZSwgQkZEX0NPTV9TRUNUSU9OX05BTUUpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0gICAgfQotICBpZiAoc3RyY21wIChuYW1lLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICB9Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgQkZEX0lORF9TRUNUSU9OX05BTUUpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9pbmRfc2VjdGlvbl9wdHI7Ci0gICAgfQotCi0gIHdoaWxlIChzZWN0KQotICAgIHsKLSAgICAgIGlmICghc3RyY21wIChzZWN0LT5uYW1lLCBuYW1lKSkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIHNlY3QgPSBzZWN0LT5uZXh0OwotICAgIH0KLQotICAvKiBUaGUgbmFtZSBpcyBub3QgYWxyZWFkeSB1c2VkOyBnbyBhaGVhZCBhbmQgbWFrZSBhIG5ldyBzZWN0aW9uLiAgKi8KLSAgcmV0dXJuIGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3NlY3Rpb25fZmxhZ3MKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfc2VjdGlvbl9mbGFncyhiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIGZsYWd3b3JkIGZsYWdzKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHNlY3Rpb24gQHZhcntzZWN9IGluIHRoZSBCRkQKLQlAdmFye2FiZmR9IHRvIHRoZSB2YWx1ZSBAdmFye2ZsYWdzfS4gUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsCi0JPDxmYWxzZT4+IG9uIGVycm9yLiBQb3NzaWJsZSBlcnJvciByZXR1cm5zIGFyZToKLQotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtCi0JVGhlIHNlY3Rpb24gY2Fubm90IGhhdmUgb25lIG9yIG1vcmUgb2YgdGhlIGF0dHJpYnV0ZXMKLQlyZXF1ZXN0ZWQuIEZvciBleGFtcGxlLCBhIC5ic3Mgc2VjdGlvbiBpbiA8PGEub3V0Pj4gbWF5IG5vdAotCWhhdmUgdGhlIDw8U0VDX0hBU19DT05URU5UUz4+IGZpZWxkIHNldC4KLQotKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1iZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24sIGZsYWdzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSNpZiAwCi0gIC8qIElmIHlvdSB0cnkgdG8gY29weSBhIHRleHQgc2VjdGlvbiBmcm9tIGFuIGlucHV0IGZpbGUgKHdoZXJlIGl0Ci0gICAgIGhhcyB0aGUgU0VDX0NPREUgZmxhZyBzZXQpIHRvIGFuIG91dHB1dCBmaWxlLCB0aGlzIGxvc2VzIGJpZyBpZgotICAgICB0aGUgYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoYWJmZCkgZG9lc24ndCBoYXZlIHRoZSBTRUNfQ09ERQotICAgICBzZXQgLSB3aGljaCBpdCBkb2Vzbid0LCBhdCBsZWFzdCBub3QgZm9yIGEub3V0LiAgRklYTUUgKi8KLQotICBpZiAoKGZsYWdzICYgYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoYWJmZCkpICE9IGZsYWdzKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgc2VjdGlvbi0+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+bmV4dDsKLQkgICAgb3MtPm93bmVyLT5zZWN0aW9uX2NvdW50LS07Ci0JICAgIGJyZWFrOwotCSAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JmZC9zb20uYyBiL2JmZC9zb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyYjZjMy4uMDAwMDAwMAotLS0gYS9iZmQvc29tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzA4ICswLDAgQEAKLS8qIGJmZCBiYWNrLWVuZCBmb3IgSFAgUEEtUklTQyBTT00gb2JqZWN0cy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2lmIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpIHx8IGRlZmluZWQgKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKSB8fCBkZWZpbmVkKEhPU1RfSFBQQU1QRUlYKQotCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAic29tLmgiCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogTWFnaWMgbm90IGRlZmluZWQgaW4gc3RhbmRhcmQgSFAtVVggaGVhZGVyIGZpbGVzIHVudGlsIDguMCAqLwotCi0jaWZuZGVmIENQVV9QQV9SSVNDMV8wCi0jZGVmaW5lIENQVV9QQV9SSVNDMV8wIDB4MjBCCi0jZW5kaWYgLyogQ1BVX1BBX1JJU0MxXzAgKi8KLQotI2lmbmRlZiBDUFVfUEFfUklTQzFfMQotI2RlZmluZSBDUFVfUEFfUklTQzFfMSAweDIxMAotI2VuZGlmIC8qIENQVV9QQV9SSVNDMV8xICovCi0KLSNpZm5kZWYgQ1BVX1BBX1JJU0MyXzAKLSNkZWZpbmUgQ1BVX1BBX1JJU0MyXzAgMHgyMTQKLSNlbmRpZiAvKiBDUFVfUEFfUklTQzJfMCAqLwotCi0jaWZuZGVmIF9QQV9SSVNDMV8wX0lECi0jZGVmaW5lIF9QQV9SSVNDMV8wX0lEIENQVV9QQV9SSVNDMV8wCi0jZW5kaWYgLyogX1BBX1JJU0MxXzBfSUQgKi8KLQotI2lmbmRlZiBfUEFfUklTQzFfMV9JRAotI2RlZmluZSBfUEFfUklTQzFfMV9JRCBDUFVfUEFfUklTQzFfMQotI2VuZGlmIC8qIF9QQV9SSVNDMV8xX0lEICovCi0KLSNpZm5kZWYgX1BBX1JJU0MyXzBfSUQKLSNkZWZpbmUgX1BBX1JJU0MyXzBfSUQgQ1BVX1BBX1JJU0MyXzAKLSNlbmRpZiAvKiBfUEFfUklTQzJfMF9JRCAqLwotCi0jaWZuZGVmIF9QQV9SSVNDX01BWElECi0jZGVmaW5lIF9QQV9SSVNDX01BWElECTB4MkZGCi0jZW5kaWYgLyogX1BBX1JJU0NfTUFYSUQgKi8KLQotI2lmbmRlZiBfUEFfUklTQ19JRAotI2RlZmluZSBfUEFfUklTQ19JRChfX21fbnVtKQkJXAotICAgICgoKF9fbV9udW0pID09IF9QQV9SSVNDMV8wX0lEKSB8fAlcCi0gICAgICgoX19tX251bSkgPj0gX1BBX1JJU0MxXzFfSUQgJiYgKF9fbV9udW0pIDw9IF9QQV9SSVNDX01BWElEKSkKLSNlbmRpZiAvKiBfUEFfUklTQ19JRCAqLwotCi0KLS8qIEhJVVggaW4gaXQncyBpbmZpbml0ZSBzdHVwaWRpdHkgY2hhbmdlZCB0aGUgbmFtZXMgZm9yIHNldmVyYWwgIndlbGwKLSAgIGtub3duIiBjb25zdGFudHMuICBXb3JrIGFyb3VuZCBzdWNoIGJyYWluZGFtYWdlLiAgVHJ5IHRoZSBIUFVYIHZlcnNpb24KLSAgIGZpcnN0LCB0aGVuIHRoZSBISVVYIHZlcnNpb24sIGFuZCBmaW5hbGx5IHByb3ZpZGUgYSBkZWZhdWx0LiAgKi8KLSNpZmRlZiBIUFVYX0FVWF9JRAotI2RlZmluZSBFWEVDX0FVWF9JRCBIUFVYX0FVWF9JRAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoRVhFQ19BVVhfSUQpICYmIGRlZmluZWQgKEhJVVhfQVVYX0lEKQotI2RlZmluZSBFWEVDX0FVWF9JRCBISVVYX0FVWF9JRAotI2VuZGlmCi0KLSNpZm5kZWYgRVhFQ19BVVhfSUQKLSNkZWZpbmUgRVhFQ19BVVhfSUQgMAotI2VuZGlmCi0KLS8qIFNpemUgKGluIGNoYXJzKSBvZiB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgdXNlZCBkdXJpbmcgZml4dXAgYW5kIHN0cmluZwotICAgdGFibGUgd3JpdGVzLiAgICovCi0gICAKLSNkZWZpbmUgU09NX1RNUF9CVUZTSVpFIDgxOTIKLQotLyogU2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSBpbiBhcmNoaXZlcy4gICovCi0jZGVmaW5lIFNPTV9MU1RfSEFTSF9TSVpFIDMxCi0KLS8qIE1heCBudW1iZXIgb2YgU09NcyB0byBiZSBmb3VuZCBpbiBhbiBhcmNoaXZlLiAgKi8KLSNkZWZpbmUgU09NX0xTVF9NT0RVTEVfTElNSVQgMTAyNAotCi0vKiBHZW5lcmljIGFsaWdubWVudCBtYWNyby4gICovCi0jZGVmaW5lIFNPTV9BTElHTih2YWwsIGFsaWdubWVudCkgXAotICAoKCh2YWwpICsgKGFsaWdubWVudCkgLSAxKSAmIH4oKGFsaWdubWVudCkgLSAxKSkKLQotLyogU09NIGFsbG93cyBhbnkgb25lIG9mIHRoZSBmb3VyIHByZXZpb3VzIHJlbG9jYXRpb25zIHRvIGJlIHJldXNlZAotICAgd2l0aCBhICJSX1BSRVZfRklYVVAiIHJlbG9jYXRpb24gZW50cnkuICBTaW5jZSBSX1BSRVZfRklYVVAKLSAgIHJlbG9jYXRpb25zIGFyZSBhbHdheXMgYSBzaW5nbGUgYnl0ZSwgdXNpbmcgYSBSX1BSRVZfRklYVVAgaW5zdGVhZAotICAgb2Ygc29tZSBtdWx0aS1ieXRlIHJlbG9jYXRpb24gbWFrZXMgb2JqZWN0IGZpbGVzIHNtYWxsZXIuIAotCi0gICBOb3RlIG9uZSBzaWRlIGVmZmVjdCBvZiB1c2luZyBhIFJfUFJFVl9GSVhVUCBpcyB0aGUgcmVsb2NhdGlvbiB0aGF0Ci0gICBpcyBiZWluZyByZXBlYXRlZCBtb3ZlcyB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLiAgKi8KLXN0cnVjdCByZWxvY19xdWV1ZQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAqcmVsb2M7Ci0gICAgdW5zaWduZWQgaW50IHNpemU7Ci0gIH0gcmVsb2NfcXVldWVbNF07Ci0KLS8qIFRoaXMgZnVsbHkgZGVzY3JpYmVzIHRoZSBzeW1ib2wgdHlwZXMgd2hpY2ggbWF5IGJlIGF0dGFjaGVkIHRvCi0gICBhbiBFWFBPUlQgb3IgSU1QT1JUIGRpcmVjdGl2ZS4gIE9ubHkgU09NIHVzZXMgdGhpcyBmb3JtYXRpb24KLSAgIChFTEYgaGFzIG5vIG5lZWQgZm9yIGl0KS4gICovCi10eXBlZGVmIGVudW0KLXsKLSAgU1lNQk9MX1RZUEVfVU5LTk9XTiwKLSAgU1lNQk9MX1RZUEVfQUJTT0xVVEUsCi0gIFNZTUJPTF9UWVBFX0NPREUsCi0gIFNZTUJPTF9UWVBFX0RBVEEsCi0gIFNZTUJPTF9UWVBFX0VOVFJZLAotICBTWU1CT0xfVFlQRV9NSUxMSUNPREUsCi0gIFNZTUJPTF9UWVBFX1BMQUJFTCwKLSAgU1lNQk9MX1RZUEVfUFJJX1BST0csCi0gIFNZTUJPTF9UWVBFX1NFQ19QUk9HLAotfSBwYV9zeW1ib2xfdHlwZTsKLQotc3RydWN0IHNlY3Rpb25fdG9fdHlwZQotewotICBjaGFyICpzZWN0aW9uOwotICBjaGFyIHR5cGU7Ci19OwotCi0vKiBBc3NvcnRlZCBzeW1ib2wgaW5mb3JtYXRpb24gdGhhdCBuZWVkcyB0byBiZSBkZXJpdmVkIGZyb20gdGhlIEJGRCBzeW1ib2wKLSAgIGFuZC9vciB0aGUgQkZEIGJhY2tlbmQgcHJpdmF0ZSBzeW1ib2wgZGF0YS4gICovCi1zdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8KLXsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF90eXBlOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX3Njb3BlOwotICB1bnNpZ25lZCBpbnQgYXJnX3JlbG9jOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX2luZm87Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfdmFsdWU7Ci0gIHVuc2lnbmVkIGludCBwcml2X2xldmVsOwotfTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIGJvb2xlYW4gc29tX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHNvbV9vYmplY3Rfc2V0dXAgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgc3RydWN0IGhlYWRlciAqLAotCQkJCQkJICAgIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKiwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBzZXR1cF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGhlYWRlciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHNvbV9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NsdXJwX3N0cmluZ190YWJsZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBzb21fc2x1cnBfc3ltYm9sX3RhYmxlIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwKLQkJCQkJICAgIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBsb25nIHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc29tX3NldF9yZWxvY19pbmZvIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQkJYXJlbGVudCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgICAgICBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgbG9uZyBzb21fZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGFzeW1ib2wgKiBzb21fbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNvbV9wcmludF9zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkgICAgICBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc29tX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCQkJICBiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJCQkJICBiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0jZGVmaW5lIHNvbV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgc29tX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NldF9zZWN0aW9uX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsCi0JCQkJCQkgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9nZXRfc2VjdGlvbl9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotCQkJCQkJIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9maW5kX25lYXJlc3RfbGluZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgYXN5bWJvbCAqKiwgYmZkX3ZtYSwKLQkJCQkJICAgICAgQ09OU1QgY2hhciAqKiwKLQkJCQkJICAgICAgQ09OU1QgY2hhciAqKiwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50ICopKTsKLXN0YXRpYyB2b2lkIHNvbV9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGFzZWN0aW9uICogYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCAKLQkJCQkJc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqKSk7Ci1zdGF0aWMgaW50IGxvZzIgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGhwcGFfc29tX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosCi0JCQkJCQkgICAgIGFzeW1ib2wgKiwgUFRSLAotCQkJCQkJICAgICBhc2VjdGlvbiAqLCBiZmQgKiwKLQkJCQkJCSAgICAgY2hhciAqKikpOwotc3RhdGljIHZvaWQgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgUEFSQU1TICgoc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB2b2lkIHNvbV9yZWxvY19xdWV1ZV9pbnNlcnQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOwotc3RhdGljIHZvaWQgc29tX3JlbG9jX3F1ZXVlX2ZpeCBQQVJBTVMgKChzdHJ1Y3QgcmVsb2NfcXVldWUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50IHNvbV9yZWxvY19xdWV1ZV9maW5kIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQkgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogdHJ5X3ByZXZfZml4dXAgUEFSQU1TICgoYmZkICosIGludCAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHNvbV9yZWxvY19za2lwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCAqLAotCQkJCQkgICAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogc29tX3JlbG9jX2FkZGVuZCBQQVJBTVMgKChiZmQgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICAgIHVuc2lnbmVkIGludCAqLAotCQkJCQkJIHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHNvbV9yZWxvY19jYWxsIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKiwKLQkJCQkJICAgICAgIGFyZWxlbnQgKiwgaW50LAotCQkJCQkgICAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNvbV9jb3VudF9zcGFjZXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNvbV9jb3VudF9zdWJzcGFjZXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgY29tcGFyZV9zeW1zIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgaW50IGNvbXBhcmVfc3Vic3BhY2VzIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBzb21fY29tcHV0ZV9jaGVja3N1bSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3ByZXBfaGVhZGVycyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBzb21fc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHNvbV9maW5pc2hfd3JpdGluZyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNvbV9wcmVwX2Zvcl9maXh1cHMgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNvbV93cml0ZV9maXh1cHMgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfc3BhY2Vfc3RyaW5ncyBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywKLQkJCQkJCXVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsCi0JCQkJCQkgYXN5bWJvbCAqKiwgdW5zaWduZWQgaW50LAotCQkJCQkJIHVuc2lnbmVkICosCi0JCQkJCQkgQ09NUFVOSVQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JlZ2luX3dyaXRpbmcgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCVBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBjaGFyIHNvbV9zZWN0aW9uX3R5cGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IHNvbV9kZWNvZGVfc3ltY2xhc3MgUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2NvdW50X2FyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBsc3RfaGVhZGVyICosCi0JCQkJCQkgc3ltaW5kZXggKikpOwotCi1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGxzdF9oZWFkZXIgKiwKLQkJCQkJCSAgIGNhcnN5bSAqKnN5bXMpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwKLQkJCQkJdW5zaWduZWQgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICAgICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50ICosCi0JCQkJCQkgIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHNvbV9iZmRfYXJfc3ltYm9sX2hhc2ggUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LAotCQkJCQkJICAgICAgdW5zaWduZWQgaW50LAotCQkJCQkJICAgICAgc3RydWN0IGxzdF9oZWFkZXIsCi0JCQkJCQkgICAgICB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9pc19zcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21faXNfc3Vic3BhY2UgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2lzX2NvbnRhaW5lciBQQVJBTVMgKChhc2VjdGlvbiAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0JCi0vKiBNYXAgU09NIHNlY3Rpb24gbmFtZXMgdG8gUE9TSVgvQlNEIHNpbmdsZS1jaGFyYWN0ZXIgc3ltYm9sIHR5cGVzLgotCi0gICBUaGlzIHRhYmxlIGluY2x1ZGVzIGFsbCB0aGUgc3RhbmRhcmQgc3Vic3BhY2VzIGFzIGRlZmluZWQgaW4gdGhlIAotICAgY3VycmVudCAiUFJPIEFCSSBmb3IgUEEtUklTQyBTeXN0ZW1zIiwgJFVOV0lORCQgd2hpY2ggZm9yIAotICAgc29tZSByZWFzb24gd2FzIGxlZnQgb3V0LCBhbmQgc2VjdGlvbnMgc3BlY2lmaWMgdG8gZW1iZWRkZWQgc3RhYnMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlY3Rpb25fdG9fdHlwZSBzdHRbXSA9IHsKLSAgeyIkVEVYVCQiLCAndCd9LAotICB7IiRTSExJQl9JTkZPJCIsICd0J30sCi0gIHsiJE1JTExJQ09ERSQiLCAndCd9LAotICB7IiRMSVQkIiwgJ3QnfSwKLSAgeyIkQ09ERSQiLCAndCd9LAotICB7IiRVTldJTkRfU1RBUlQkIiwgJ3QnfSwKLSAgeyIkVU5XSU5EJCIsICd0J30sCi0gIHsiJFBSSVZBVEUkIiwgJ2QnfSwKLSAgeyIkUExUJCIsICdkJ30sCi0gIHsiJFNITElCX0RBVEEkIiwgJ2QnfSwKLSAgeyIkREFUQSQiLCAnZCd9LAotICB7IiRTSE9SVERBVEEkIiwgJ2cnfSwKLSAgeyIkRExUJCIsICdkJ30sCi0gIHsiJEdMT0JBTCQiLCAnZyd9LAotICB7IiRTSE9SVEJTUyQiLCAncyd9LAotICB7IiRCU1MkIiwgJ2InfSwKLSAgeyIkR0RCX1NUUklOR1MkIiwgJ04nfSwKLSAgeyIkR0RCX1NZTUJPTFMkIiwgJ04nfSwKLSAgezAsIDB9Ci19OwotCi0vKiBBYm91dCB0aGUgcmVsb2NhdGlvbiBmb3JtYXR0aW5nIHRhYmxlLi4uCi0KLSAgIFRoZXJlIGFyZSAyNTYgZW50cmllcyBpbiB0aGUgdGFibGUsIG9uZSBmb3IgZWFjaCBwb3NzaWJsZQotICAgcmVsb2NhdGlvbiBvcGNvZGUgYXZhaWxhYmxlIGluIFNPTS4gIFdlIGluZGV4IHRoZSB0YWJsZSBieQotICAgdGhlIHJlbG9jYXRpb24gb3Bjb2RlLiAgVGhlIG5hbWVzIGFuZCBvcGVyYXRpb25zIGFyZSB0aG9zZQotICAgZGVmaW5lZCBieSBhLm91dF84MDAgKDQpLgotCi0gICBSaWdodCBub3cgdGhpcyB0YWJsZSBpcyBvbmx5IHVzZWQgdG8gY291bnQgYW5kIHBlcmZvcm0gbWluaW1hbAotICAgcHJvY2Vzc2luZyBvbiByZWxvY2F0aW9uIHN0cmVhbXMgc28gdGhhdCB0aGV5IGNhbiBiZSBpbnRlcm5hbGl6ZWQKLSAgIGludG8gQkZEIGFuZCBzeW1ib2xpY2FsbHkgcHJpbnRlZCBieSB1dGlsaXRpZXMuICBUbyBtYWtlIGFjdHVhbCB1c2UgCi0gICBvZiB0aGVtIHdvdWxkIGJlIG11Y2ggbW9yZSBkaWZmaWN1bHQsIEJGRCdzIGNvbmNlcHQgb2YgcmVsb2NhdGlvbnMKLSAgIGlzIGZhciB0b28gc2ltcGxlIHRvIGhhbmRsZSBTT00gcmVsb2NhdGlvbnMuICBUaGUgYmFzaWMgYXNzdW1wdGlvbgotICAgdGhhdCBhIHJlbG9jYXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgcHJvY2Vzc2VkIGluZGVwZW5kZW50IG9mIG90aGVyCi0gICByZWxvY2F0aW9ucyBiZWZvcmUgYW4gb2JqZWN0IGZpbGUgaXMgd3JpdHRlbiBpcyBpbnZhbGlkIGZvciBTT00uCi0KLSAgIFRoZSBTT00gcmVsb2NhdGlvbnMgYXJlIG1lYW50IHRvIGJlIHByb2Nlc3NlZCBhcyBhIHN0cmVhbSwgdGhleQotICAgc3BlY2lmeSBjb3B5aW5nIG9mIGRhdGEgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24KLSAgIHdoaWxlIHBvc3NpYmx5IG1vZGlmeWluZyB0aGUgZGF0YSBpbiBzb21lIG1hbm5lci4gIFRoZXkgYWxzbyBjYW4gCi0gICBzcGVjaWZ5IHRoYXQgYSB2YXJpYWJsZSBudW1iZXIgb2YgemVyb3Mgb3IgdW5pbml0aWFsaXplZCBkYXRhIGJlCi0gICBpbnNlcnRlZCBvbiBpbiB0aGUgb3V0cHV0IHNlZ21lbnQgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0LiAgU29tZQotICAgcmVsb2NhdGlvbnMgc3BlY2lmeSB0aGF0IHNvbWUgcHJldmlvdXMgcmVsb2NhdGlvbiBiZSByZS1hcHBsaWVkIGF0Ci0gICB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgaW5wdXQvb3V0cHV0IHNlY3Rpb25zLiAgQW5kIGZpbmFsbHkgYSBudW1iZXIKLSAgIG9mIHJlbG9jYXRpb25zIGhhdmUgZWZmZWN0cyBvbiBvdGhlciBzZWN0aW9ucyAoUl9FTlRSWSwgUl9FWElULAotICAgUl9VTldJTkRfQVVYIGFuZCBhIHZhcmlldHkgb2Ygb3RoZXJzKS4gIFRoZXJlIGlzbid0IGV2ZW4gZW5vdWdoIHJvb20KLSAgIGluIHRoZSBCRkQgcmVsb2NhdGlvbiBkYXRhIHN0cnVjdHVyZSB0byBzdG9yZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8KLSAgIHBlcmZvcm0gYWxsIHRoZSByZWxvY2F0aW9ucy4KLQotICAgRWFjaCBlbnRyeSBpbiB0aGUgdGFibGUgaGFzIHRocmVlIGZpZWxkcy4gCi0KLSAgIFRoZSBmaXJzdCBlbnRyeSBpcyBhbiBpbmRleCBpbnRvIHRoaXMgImNsYXNzIiBvZiByZWxvY2F0aW9ucy4gIFRoaXMKLSAgIGluZGV4IGNhbiB0aGVuIGJlIHVzZWQgYXMgYSB2YXJpYWJsZSB3aXRoaW4gdGhlIHJlbG9jYXRpb24gaXRzZWxmLgotCi0gICBUaGUgc2Vjb25kIGZpZWxkIGlzIGEgZm9ybWF0IHN0cmluZyB3aGljaCBhY3R1YWxseSBjb250cm9scyBwcm9jZXNzaW5nCi0gICBvZiB0aGUgcmVsb2NhdGlvbi4gIEl0IHVzZXMgYSBzaW1wbGUgcG9zdGZpeCBtYWNoaW5lIHRvIGRvIGNhbGN1bGF0aW9ucwotICAgYmFzZWQgb24gdmFyaWFibGVzL2NvbnN0YW50cyBmb3VuZCBpbiB0aGUgc3RyaW5nIGFuZCB0aGUgcmVsb2NhdGlvbgotICAgc3RyZWFtLiAgCi0KLSAgIFRoZSB0aGlyZCBmaWVsZCBzcGVjaWZ5cyB3aGV0aGVyIG9yIG5vdCB0aGlzIHJlbG9jYXRpb24gbWF5IHVzZSAKLSAgIGEgY29uc3RhbnQgKFYpIGZyb20gdGhlIHByZXZpb3VzIFJfREFUQV9PVkVSUklERSByYXRoZXIgdGhhbiBhIGNvbnN0YW50Ci0gICBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLgotCi0gICBWYXJpYWJsZXM6ICAKLSAgCi0gICBMID0gaW5wdXQgc3BhY2UgYnl0ZSBjb3VudAotICAgRCA9IGluZGV4IGludG8gY2xhc3Mgb2YgcmVsb2NhdGlvbnMKLSAgIE0gPSBvdXRwdXQgc3BhY2UgYnl0ZSBjb3VudAotICAgTiA9IHN0YXRlbWVudCBudW1iZXIgKHVudXNlZD8pCi0gICBPID0gc3RhY2sgb3BlcmF0aW9uCi0gICBSID0gcGFyYW1ldGVyIHJlbG9jYXRpb24gYml0cwotICAgUyA9IHN5bWJvbCBpbmRleAotICAgVCA9IGZpcnN0IDMyIGJpdHMgb2Ygc3RhY2sgdW53aW5kIGluZm9ybWF0aW9uCi0gICBVID0gc2Vjb25kIDMyIGJpdHMgb2Ygc3RhY2sgdW53aW5kIGluZm9ybWF0aW9uCi0gICBWID0gYSBsaXRlcmFsIGNvbnN0YW50ICh1c3VhbGx5IHVzZWQgaW4gdGhlIG5leHQgcmVsb2NhdGlvbikKLSAgIFAgPSBhIHByZXZpb3VzIHJlbG9jYXRpb24KLSAgCi0gICBMb3dlciBjYXNlIGxldHRlcnMgKHN0YXJ0aW5nIHdpdGggJ2InKSByZWZlciB0byBmb2xsb3dpbmcgCi0gICBieXRlcyBpbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0uICAnYicgaXMgdGhlIG5leHQgMSBieXRlLAotICAgYyBpcyB0aGUgbmV4dCAyIGJ5dGVzLCBkIGlzIHRoZSBuZXh0IDMgYnl0ZXMsIGV0Yy4uLiAgCi0gICBUaGlzIGlzIHRoZSB2YXJpYWJsZSBwYXJ0IG9mIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgdGhhdAotICAgbWFrZXMgb3VyIGxpZmUgYSBsaXZpbmcgaGVsbC4KLQotICAgbnVtZXJpY2FsIGNvbnN0YW50cyBhcmUgYWxzbyB1c2VkIGluIHRoZSBmb3JtYXQgc3RyaW5nLiAgTm90ZQotICAgdGhlIGNvbnN0YW50cyBhcmUgcmVwcmVzZW50ZWQgaW4gZGVjaW1hbC4gCi0KLSAgICcrJywgIioiIGFuZCAiPSIgcmVwcmVzZW50cyB0aGUgb2J2aW91cyBwb3N0Zml4IG9wZXJhdG9ycy4KLSAgICc8JyByZXByZXNlbnRzIGEgbGVmdCBzaGlmdC4gCi0KLSAgIFN0YWNrIE9wZXJhdGlvbnM6Ci0KLSAgIFBhcmFtZXRlciBSZWxvY2F0aW9uIEJpdHM6Ci0KLSAgIFVud2luZCBFbnRyaWVzOiAgCi0gICAKLSAgIFByZXZpb3VzIFJlbG9jYXRpb25zOiAgVGhlIGluZGV4IGZpZWxkIHJlcHJlc2VudHMgd2hpY2ggaW4gdGhlIHF1ZXVlCi0gICBvZiA0IHByZXZpb3VzIGZpeHVwcyBzaG91bGQgYmUgcmUtYXBwbGllZC4KLQotICAgTGl0ZXJhbCBDb25zdGFudHM6ICBUaGVzZSBhcmUgZ2VuZXJhbGx5IHVzZWQgdG8gcmVwcmVzZW50IGFkZGVuZAotICAgcGFydHMgb2YgcmVsb2NhdGlvbnMgd2hlbiB0aGVzZSBjb25zdGFudHMgYXJlIG5vdCBzdG9yZWQgaW4gdGhlCi0gICBmaWVsZHMgb2YgdGhlIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLiAgRm9yIGV4YW1wbGUgdGhlIGluc3RydWN0aW9uCi0gICBhZGRpbCBmb28tJGdsb2JhbCQtMHgxMjM0IHdvdWxkIHVzZSBhbiBvdmVycmlkZSBmb3IgIjB4MTIzNCIgcmF0aGVyCi0gICB0aGFuIHN0b3JpbmcgaXQgaW50byB0aGUgYWRkaWwgaXRzZWxmLiAgKi8KLQotc3RydWN0IGZpeHVwX2Zvcm1hdAotewotICBpbnQgRDsKLSAgY2hhciAqZm9ybWF0OwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaXh1cF9mb3JtYXQgc29tX2ZpeHVwX2Zvcm1hdHNbMjU2XSA9Ci17Ci0gIC8qIFJfTk9fUkVMT0NBVElPTiAqLwotICAwLCAgICJMRDErNCo9IiwgICAgICAgLyogMHgwMCAqLwotICAxLCAgICJMRDErNCo9IiwJLyogMHgwMSAqLwotICAyLCAgICJMRDErNCo9IiwJLyogMHgwMiAqLwotICAzLCAgICJMRDErNCo9IiwJLyogMHgwMyAqLwotICA0LCAgICJMRDErNCo9IiwJLyogMHgwNCAqLwotICA1LCAgICJMRDErNCo9IiwJLyogMHgwNSAqLwotICA2LCAgICJMRDErNCo9IiwJLyogMHgwNiAqLwotICA3LCAgICJMRDErNCo9IiwJLyogMHgwNyAqLwotICA4LCAgICJMRDErNCo9IiwJLyogMHgwOCAqLwotICA5LCAgICJMRDErNCo9IiwJLyogMHgwOSAqLwotICAxMCwgICJMRDErNCo9IiwJLyogMHgwYSAqLwotICAxMSwgICJMRDErNCo9IiwJLyogMHgwYiAqLwotICAxMiwgICJMRDErNCo9IiwJLyogMHgwYyAqLwotICAxMywgICJMRDErNCo9IiwJLyogMHgwZCAqLwotICAxNCwgICJMRDErNCo9IiwJLyogMHgwZSAqLwotICAxNSwgICJMRDErNCo9IiwJLyogMHgwZiAqLwotICAxNiwgICJMRDErNCo9IiwJLyogMHgxMCAqLwotICAxNywgICJMRDErNCo9IiwJLyogMHgxMSAqLwotICAxOCwgICJMRDErNCo9IiwJLyogMHgxMiAqLwotICAxOSwgICJMRDErNCo9IiwJLyogMHgxMyAqLwotICAyMCwgICJMRDErNCo9IiwJLyogMHgxNCAqLwotICAyMSwgICJMRDErNCo9IiwJLyogMHgxNSAqLwotICAyMiwgICJMRDErNCo9IiwJLyogMHgxNiAqLwotICAyMywgICJMRDErNCo9IiwJLyogMHgxNyAqLwotICAwLCAgICJMRDg8YisxKzQqPSIsCS8qIDB4MTggKi8KLSAgMSwgICAiTEQ4PGIrMSs0Kj0iLAkvKiAweDE5ICovCi0gIDIsICAgIkxEODxiKzErNCo9IiwJLyogMHgxYSAqLwotICAzLCAgICJMRDg8YisxKzQqPSIsCS8qIDB4MWIgKi8KLSAgMCwgICAiTEQxNjxjKzErNCo9IiwJLyogMHgxYyAqLwotICAxLCAgICJMRDE2PGMrMSs0Kj0iLAkvKiAweDFkICovCi0gIDIsICAgIkxEMTY8YysxKzQqPSIsCS8qIDB4MWUgKi8KLSAgMCwgICAiTGQxKz0iLCAgICAgICAgIC8qIDB4MWYgKi8KLSAgLyogUl9aRVJPRVMgKi8KLSAgMCwgICAgIkxiMSs0Kj0iLAkvKiAweDIwICovCi0gIDEsICAgICJMZDErPSIsCS8qIDB4MjEgKi8KLSAgLyogUl9VTklOSVQgKi8KLSAgMCwgICAgIkxiMSs0Kj0iLAkvKiAweDIyICovCi0gIDEsICAgICJMZDErPSIsCS8qIDB4MjMgKi8KLSAgLyogUl9SRUxPQ0FUSU9OICovCi0gIDAsICAgICJMND0iLCAgICAgICAgICAvKiAweDI0ICovCi0gIC8qIFJfREFUQV9PTkVfU1lNQk9MICovCi0gIDAsICAgICJMND1TYj0iLAkvKiAweDI1ICovCi0gIDEsICAgICJMND1TZD0iLAkvKiAweDI2ICovCi0gIC8qIFJfREFUQV9QTEVCRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4MjcgKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4MjggKi8KLSAgLyogUl9TUEFDRV9SRUYgKi8KLSAgMCwgICAgIkw0PSIsICAgICAgICAgIC8qIDB4MjkgKi8KLSAgLyogUl9SRVBFQVRFRF9JTklUICovCi0gIDAsICAgICJMND1NYjErNCo9IiwJLyogMHgyYSAqLwotICAxLCAgICAiTGI0Kj1NYjErTCo9IiwJLyogMHgyYiAqLwotICAyLCAgICAiTGI0Kj1NZDErNCo9IiwJLyogMHgyYyAqLwotICAzLCAgICAiTGQxKz1NZTErPSIsCS8qIDB4MmQgKi8KLSAgMCwgICAJIiIsCSAgICAgICAgLyogMHgyZSAqLwotICAwLCAgIAkiIiwJICAgICAgICAvKiAweDJmICovCi0gIC8qIFJfUENSRUxfQ0FMTCAqLwotICAwLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMCAqLwotICAxLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMSAqLwotICAyLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMiAqLwotICAzLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMyAqLwotICA0LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNCAqLwotICA1LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNSAqLwotICA2LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNiAqLwotICA3LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNyAqLwotICA4LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzOCAqLwotICA5LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzOSAqLwotICAwLCAgICAiTDQ9UkQ4PGIrPVNiPSIsLyogMHgzYSAqLwotICAxLCAgICAiTDQ9UkQ4PGIrPVNiPSIsLyogMHgzYiAqLwotICAwLCAgICAiTDQ9UkQ4PGIrPVNkPSIsLyogMHgzYyAqLwotICAxLCAgICAiTDQ9UkQ4PGIrPVNkPSIsLyogMHgzZCAqLwotICAvKiBSX1NIT1JUX1BDUkVMX01PREUgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHgzZSAqLwotICAvKiBSX0xPTkdfUENSRUxfTU9ERSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDNmICovCi0gIC8qIFJfQUJTX0NBTEwgKi8KLSAgMCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDAgKi8KLSAgMSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDEgKi8KLSAgMiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDIgKi8KLSAgMywgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDMgKi8KLSAgNCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDQgKi8KLSAgNSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDUgKi8KLSAgNiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDYgKi8KLSAgNywgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDcgKi8KLSAgOCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDggKi8KLSAgOSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDkgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4NGEgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4NGIgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4NGMgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4NGQgKi8KLSAgLyogUl9SRVNFUlZFRCAqLwotICAwLCAgICAgIiIsCSAgICAgICAgLyogMHg0ZSAqLwotICAwLCAgICAgIiIsCSAgICAgICAgLyogMHg0ZiAqLwotICAvKiBSX0RQX1JFTEFUSVZFICovCi0gIDAsICAgICJMND1TRD0iLAkvKiAweDUwICovCi0gIDEsICAgICJMND1TRD0iLAkvKiAweDUxICovCi0gIDIsICAgICJMND1TRD0iLAkvKiAweDUyICovCi0gIDMsICAgICJMND1TRD0iLAkvKiAweDUzICovCi0gIDQsICAgICJMND1TRD0iLAkvKiAweDU0ICovCi0gIDUsICAgICJMND1TRD0iLAkvKiAweDU1ICovCi0gIDYsICAgICJMND1TRD0iLAkvKiAweDU2ICovCi0gIDcsICAgICJMND1TRD0iLAkvKiAweDU3ICovCi0gIDgsICAgICJMND1TRD0iLAkvKiAweDU4ICovCi0gIDksICAgICJMND1TRD0iLAkvKiAweDU5ICovCi0gIDEwLCAgICJMND1TRD0iLAkvKiAweDVhICovCi0gIDExLCAgICJMND1TRD0iLAkvKiAweDViICovCi0gIDEyLCAgICJMND1TRD0iLAkvKiAweDVjICovCi0gIDEzLCAgICJMND1TRD0iLAkvKiAweDVkICovCi0gIDE0LCAgICJMND1TRD0iLAkvKiAweDVlICovCi0gIDE1LCAgICJMND1TRD0iLAkvKiAweDVmICovCi0gIDE2LCAgICJMND1TRD0iLAkvKiAweDYwICovCi0gIDE3LCAgICJMND1TRD0iLAkvKiAweDYxICovCi0gIDE4LCAgICJMND1TRD0iLAkvKiAweDYyICovCi0gIDE5LCAgICJMND1TRD0iLAkvKiAweDYzICovCi0gIDIwLCAgICJMND1TRD0iLAkvKiAweDY0ICovCi0gIDIxLCAgICJMND1TRD0iLAkvKiAweDY1ICovCi0gIDIyLCAgICJMND1TRD0iLAkvKiAweDY2ICovCi0gIDIzLCAgICJMND1TRD0iLAkvKiAweDY3ICovCi0gIDI0LCAgICJMND1TRD0iLAkvKiAweDY4ICovCi0gIDI1LCAgICJMND1TRD0iLAkvKiAweDY5ICovCi0gIDI2LCAgICJMND1TRD0iLAkvKiAweDZhICovCi0gIDI3LCAgICJMND1TRD0iLAkvKiAweDZiICovCi0gIDI4LCAgICJMND1TRD0iLAkvKiAweDZjICovCi0gIDI5LCAgICJMND1TRD0iLAkvKiAweDZkICovCi0gIDMwLCAgICJMND1TRD0iLAkvKiAweDZlICovCi0gIDMxLCAgICJMND1TRD0iLAkvKiAweDZmICovCi0gIDMyLCAgICJMND1TYj0iLAkvKiAweDcwICovCi0gIDMzLCAgICJMND1TZD0iLAkvKiAweDcxICovCi0gIC8qIFJfUkVTRVJWRUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3MiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDczICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4NzQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3NSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDc2ICovCi0gIDAsICAgICIiLCAgICAgIAkvKiAweDc3ICovCi0gIC8qIFJfRExUX1JFTCAqLwotICAwLCAgICAiTDQ9U2I9IiwJLyogMHg3OCAqLwotICAxLCAgICAiTDQ9U2Q9IiwJLyogMHg3OSAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsICAgICIiLCAgICAgICAgCS8qIDB4N2EgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3YiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDdjICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4N2QgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3ZSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDdmICovCi0gIC8qIFJfQ09ERV9PTkVfU1lNQk9MICovCi0gIDAsICAgICJMND1TRD0iLAkvKiAweDgwICovCi0gIDEsICAgICJMND1TRD0iLAkvKiAweDgxICovCi0gIDIsICAgICJMND1TRD0iLAkvKiAweDgyICovCi0gIDMsICAgICJMND1TRD0iLAkvKiAweDgzICovCi0gIDQsICAgICJMND1TRD0iLAkvKiAweDg0ICovCi0gIDUsICAgICJMND1TRD0iLAkvKiAweDg1ICovCi0gIDYsICAgICJMND1TRD0iLAkvKiAweDg2ICovCi0gIDcsICAgICJMND1TRD0iLAkvKiAweDg3ICovCi0gIDgsICAgICJMND1TRD0iLAkvKiAweDg4ICovCi0gIDksICAgICJMND1TRD0iLAkvKiAweDg5ICovCi0gIDEwLCAgICJMND1TRD0iLAkvKiAweDhxICovCi0gIDExLCAgICJMND1TRD0iLAkvKiAweDhiICovCi0gIDEyLCAgICJMND1TRD0iLAkvKiAweDhjICovCi0gIDEzLCAgICJMND1TRD0iLAkvKiAweDhkICovCi0gIDE0LCAgICJMND1TRD0iLAkvKiAweDhlICovCi0gIDE1LCAgICJMND1TRD0iLAkvKiAweDhmICovCi0gIDE2LCAgICJMND1TRD0iLAkvKiAweDkwICovCi0gIDE3LCAgICJMND1TRD0iLAkvKiAweDkxICovCi0gIDE4LCAgICJMND1TRD0iLAkvKiAweDkyICovCi0gIDE5LCAgICJMND1TRD0iLAkvKiAweDkzICovCi0gIDIwLCAgICJMND1TRD0iLAkvKiAweDk0ICovCi0gIDIxLCAgICJMND1TRD0iLAkvKiAweDk1ICovCi0gIDIyLCAgICJMND1TRD0iLAkvKiAweDk2ICovCi0gIDIzLCAgICJMND1TRD0iLAkvKiAweDk3ICovCi0gIDI0LCAgICJMND1TRD0iLAkvKiAweDk4ICovCi0gIDI1LCAgICJMND1TRD0iLAkvKiAweDk5ICovCi0gIDI2LCAgICJMND1TRD0iLAkvKiAweDlhICovCi0gIDI3LCAgICJMND1TRD0iLAkvKiAweDliICovCi0gIDI4LCAgICJMND1TRD0iLAkvKiAweDljICovCi0gIDI5LCAgICJMND1TRD0iLAkvKiAweDlkICovCi0gIDMwLCAgICJMND1TRD0iLAkvKiAweDllICovCi0gIDMxLCAgICJMND1TRD0iLAkvKiAweDlmICovCi0gIDMyLCAgICJMND1TYj0iLAkvKiAweGEwICovCi0gIDMzLCAgICJMND1TZD0iLAkvKiAweGExICovCi0gIC8qIFJfUkVTRVJWRUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhMiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGEzICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhNSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE2ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTcgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhOCAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE5ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YWEgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhYiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGFjICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YWQgKi8KLSAgLyogUl9NSUxMSV9SRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4YWUgKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4YWYgKi8KLSAgLyogUl9DT0RFX1BMQUJFTCAqLwotICAwLCAgICAiTDQ9U2I9IiwJLyogMHhiMCAqLwotICAxLCAgICAiTDQ9U2Q9IiwJLyogMHhiMSAqLwotICAvKiBSX0JSRUFLUE9JTlQgKi8KLSAgMCwgICAgIkw0PSIsCSAgICAgICAgLyogMHhiMiAqLwotICAvKiBSX0VOVFJZICovCi0gIDAsICAgICJUZT1VZT0iLCAgICAgICAvKiAweGIzICovCi0gIDEsICAgICJVZj0iLAkgICAgICAgIC8qIDB4YjQgKi8KLSAgLyogUl9BTFRfRU5UUlkgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhiNSAqLwotICAvKiBSX0VYSVQgKi8KLSAgMCwgICAgIiIsCQkvKiAweGI2ICovCi0gIC8qIFJfQkVHSU5fVFJZICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YjcgKi8KLSAgLyogUl9FTkRfVFJZICovCi0gIDAsICAgICJSMD0iLAkgICAgICAgIC8qIDB4YjggKi8KLSAgMSwgICAgIlJiNCo9IiwJLyogMHhiOSAqLwotICAyLCAgICAiUmQ0Kj0iLAkvKiAweGJhICovCi0gIC8qIFJfQkVHSU5fQlJUQUIgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhiYiAqLwotICAvKiBSX0VORF9CUlRBQiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGJjICovCi0gIC8qIFJfU1RBVEVNRU5UICovCi0gIDAsICAgICJOYj0iLAkgICAgICAgIC8qIDB4YmQgKi8KLSAgMSwgICAgIk5jPSIsCSAgICAgICAgLyogMHhiZSAqLwotICAyLCAgICAiTmQ9IiwJICAgICAgICAvKiAweGJmICovCi0gIC8qIFJfREFUQV9FWFBSICovCi0gIDAsICAgICJMND0iLAkgICAgICAgIC8qIDB4YzAgKi8KLSAgLyogUl9DT0RFX0VYUFIgKi8KLSAgMCwgICAgIkw0PSIsCSAgICAgICAgLyogMHhjMSAqLwotICAvKiBSX0ZTRUwgKi8KLSAgMCwgICAgIiIsCQkvKiAweGMyICovCi0gIC8qIFJfTFNFTCAqLwotICAwLCAgICAiIiwJCS8qIDB4YzMgKi8KLSAgLyogUl9SU0VMICovCi0gIDAsICAgICIiLAkJLyogMHhjNCAqLwotICAvKiBSX05fTU9ERSAqLwotICAwLCAgICAiIiwJCS8qIDB4YzUgKi8KLSAgLyogUl9TX01PREUgKi8KLSAgMCwgICAgIiIsCQkvKiAweGM2ICovCi0gIC8qIFJfRF9NT0RFICovCi0gIDAsICAgICIiLAkJLyogMHhjNyAqLwotICAvKiBSX1JfTU9ERSAqLwotICAwLCAgICAiIiwJCS8qIDB4YzggKi8KLSAgLyogUl9EQVRBX09WRVJSSURFICovCi0gIDAsICAgICJWMD0iLAkgICAgICAgIC8qIDB4YzkgKi8KLSAgMSwgICAgIlZiPSIsCSAgICAgICAgLyogMHhjYSAqLwotICAyLCAgICAiVmM9IiwJICAgICAgICAvKiAweGNiICovCi0gIDMsICAgICJWZD0iLAkgICAgICAgIC8qIDB4Y2MgKi8KLSAgNCwgICAgIlZlPSIsCSAgICAgICAgLyogMHhjZCAqLwotICAvKiBSX1RSQU5TTEFURUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhjZSAqLwotICAvKiBSX0FVWF9VTldJTkQgKi8KLSAgMCwgICAgIlNkPVZmPUVmPSIsICAgIC8qIDB4Y2YgKi8KLSAgLyogUl9DT01QMSAqLwotICAwLCAgICAiT2I9IiwJICAgICAgICAvKiAweGQwICovCi0gIC8qIFJfQ09NUDIgKi8KLSAgMCwgICAgIk9iPVNkPSIsCS8qIDB4ZDEgKi8KLSAgLyogUl9DT01QMyAqLwotICAwLCAgICAiT2I9VmU9IiwJLyogMHhkMiAqLwotICAvKiBSX1BSRVZfRklYVVAgKi8KLSAgMCwgICAgIlAiLCAgIAkgICAgICAgIC8qIDB4ZDMgKi8KLSAgMSwgICAgIlAiLAkgICAgICAgIC8qIDB4ZDQgKi8KLSAgMiwgICAgIlAiLAkgICAgICAgIC8qIDB4ZDUgKi8KLSAgMywgICAgIlAiLAkgICAgICAgIC8qIDB4ZDYgKi8KLSAgLyogUl9TRUNfU1RNVCAqLwotICAwLAkiIiwJCS8qIDB4ZDcgKi8KLSAgLyogUl9OMFNFTCAqLwotICAwLAkiIiwJCS8qIDB4ZDggKi8KLSAgLyogUl9OMVNFTCAqLwotICAwLAkiIiwJCS8qIDB4ZDkgKi8KLSAgLyogUl9MSU5FVEFCICovCi0gIDAsCSJFYj1TZD1WZT0iLAkvKiAweGRhICovCi0gIC8qIFJfTElORVRBQl9FU0MgKi8KLSAgMCwJIkViPU1iPSIsCS8qIDB4ZGIgKi8KLSAgLyogUl9MVFBfT1ZFUlJJREUgKi8KLSAgMCwJIiIsCQkvKiAweGRjICovCi0gIC8qIFJfQ09NTUVOVCAqLwotICAwLCAgICAiT2I9VmU9IiwJLyogMHhkZCAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsCSIiLAkJLyogMHhkZSAqLwotICAwLAkiIiwJCS8qIDB4ZGYgKi8KLSAgMCwJIiIsCQkvKiAweGUwICovCi0gIDAsCSIiLAkJLyogMHhlMSAqLwotICAwLAkiIiwJCS8qIDB4ZTIgKi8KLSAgMCwJIiIsCQkvKiAweGUzICovCi0gIDAsCSIiLAkJLyogMHhlNCAqLwotICAwLAkiIiwJCS8qIDB4ZTUgKi8KLSAgMCwJIiIsCQkvKiAweGU2ICovCi0gIDAsCSIiLAkJLyogMHhlNyAqLwotICAwLAkiIiwJCS8qIDB4ZTggKi8KLSAgMCwJIiIsCQkvKiAweGU5ICovCi0gIDAsCSIiLAkJLyogMHhlYSAqLwotICAwLAkiIiwJCS8qIDB4ZWIgKi8KLSAgMCwJIiIsCQkvKiAweGVjICovCi0gIDAsCSIiLAkJLyogMHhlZCAqLwotICAwLAkiIiwJCS8qIDB4ZWUgKi8KLSAgMCwJIiIsCQkvKiAweGVmICovCi0gIDAsCSIiLAkJLyogMHhmMCAqLwotICAwLAkiIiwJCS8qIDB4ZjEgKi8KLSAgMCwJIiIsCQkvKiAweGYyICovCi0gIDAsCSIiLAkJLyogMHhmMyAqLwotICAwLAkiIiwJCS8qIDB4ZjQgKi8KLSAgMCwJIiIsCQkvKiAweGY1ICovCi0gIDAsCSIiLAkJLyogMHhmNiAqLwotICAwLAkiIiwJCS8qIDB4ZjcgKi8KLSAgMCwJIiIsCQkvKiAweGY4ICovCi0gIDAsCSIiLAkJLyogMHhmOSAqLwotICAwLAkiIiwJCS8qIDB4ZmEgKi8KLSAgMCwJIiIsCQkvKiAweGZiICovCi0gIDAsCSIiLAkJLyogMHhmYyAqLwotICAwLAkiIiwJCS8qIDB4ZmQgKi8KLSAgMCwJIiIsCQkvKiAweGZlICovCi0gIDAsCSIiLAkJLyogMHhmZiAqLwotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wMV9vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDQwLAotICAweDQxLAotICAweDQyLAotICAweDQzLAotICAweDQ0LAotICAweDQ1LAotICAweDQ2LAotICAweDQ3LAotICAweDQ4LAotICAweDQ5LAotICAweDRhLAotICAweDRiLAotICAweDYwLAotICAweDgwLAotICAweGEwLAotICAweGMwLAotICAtMQotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wMl9vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDgwLAotICAweDgyLAotICAweGMwLAotICAtMQotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wM19vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDAyLAotICAtMQotfTsKLQotLyogVGhlc2UgYXBwYXJlbnRseSBhcmUgbm90IGluIG9sZGVyIHZlcnNpb25zIG9mIGhwdXggcmVsb2MuaCAoaHB1eDcpLiAgKi8KLSNpZm5kZWYgUl9ETFRfUkVMCi0jZGVmaW5lIFJfRExUX1JFTCAweDc4Ci0jZW5kaWYKLQotI2lmbmRlZiBSX0FVWF9VTldJTkQKLSNkZWZpbmUgUl9BVVhfVU5XSU5EIDB4Y2YKLSNlbmRpZgotCi0jaWZuZGVmIFJfU0VDX1NUTVQKLSNkZWZpbmUgUl9TRUNfU1RNVCAweGQ3Ci0jZW5kaWYKLQotLyogQW5kIHRoZXNlIGZpcnN0IGFwcGVhcmVkIGluIGhwdXgxMC4gICovCi0jaWZuZGVmIFJfU0hPUlRfUENSRUxfTU9ERQotI2RlZmluZSBOT19QQ1JFTF9NT0RFUwotI2RlZmluZSBSX1NIT1JUX1BDUkVMX01PREUgMHgzZQotI2VuZGlmCi0KLSNpZm5kZWYgUl9MT05HX1BDUkVMX01PREUKLSNkZWZpbmUgUl9MT05HX1BDUkVMX01PREUgMHgzZgotI2VuZGlmCi0KLSNpZm5kZWYgUl9OMFNFTAotI2RlZmluZSBSX04wU0VMIDB4ZDgKLSNlbmRpZgotCi0jaWZuZGVmIFJfTjFTRUwKLSNkZWZpbmUgUl9OMVNFTCAweGQ5Ci0jZW5kaWYKLQotI2lmbmRlZiBSX0xJTkVUQUIKLSNkZWZpbmUgUl9MSU5FVEFCIDB4ZGEKLSNlbmRpZgotCi0jaWZuZGVmIFJfTElORVRBQl9FU0MKLSNkZWZpbmUgUl9MSU5FVEFCX0VTQyAweGRiCi0jZW5kaWYKLQotI2lmbmRlZiBSX0xUUF9PVkVSUklERQotI2RlZmluZSBSX0xUUF9PVkVSUklERSAweGRjCi0jZW5kaWYKLQotI2lmbmRlZiBSX0NPTU1FTlQKLSNkZWZpbmUgUl9DT01NRU5UIDB4ZGQKLSNlbmRpZgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBzb21faHBwYV9ob3d0b190YWJsZVtdID0KLXsKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX1pFUk9FUywgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfWkVST0VTIn0sCi0gIHtSX1pFUk9FUywgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfWkVST0VTIn0sCi0gIHtSX1VOSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfVU5JTklUIn0sCi0gIHtSX1VOSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfVU5JTklUIn0sCi0gIHtSX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFTE9DQVRJT04ifSwKLSAge1JfREFUQV9PTkVfU1lNQk9MLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09ORV9TWU1CT0wifSwKLSAge1JfREFUQV9PTkVfU1lNQk9MLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09ORV9TWU1CT0wifSwKLSAge1JfREFUQV9QTEFCRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfUExBQkVMIn0sCi0gIHtSX0RBVEFfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX1BMQUJFTCJ9LAotICB7Ul9TUEFDRV9SRUYsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1NQQUNFX1JFRiJ9LAotICB7Ul9SRVBFQVRFRF9JTklULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUkVQRUFURURfSU5JVCJ9LAotICB7Ul9SRVBFQVRFRF9JTklULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUkVQRUFURURfSU5JVCJ9LAotICB7Ul9SRVBFQVRFRF9JTklULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUkVQRUFURURfSU5JVCJ9LAotICB7Ul9SRVBFQVRFRF9JTklULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUkVQRUFURURfSU5JVCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9TSE9SVF9QQ1JFTF9NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TSE9SVF9QQ1JFTF9NT0RFIn0sCi0gIHtSX0xPTkdfUENSRUxfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTE9OR19QQ1JFTF9NT0RFIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfRExUX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRExUX1JFTCJ9LAotICB7Ul9ETFRfUkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9ETFRfUkVMIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfTUlMTElfUkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9NSUxMSV9SRUwifSwKLSAge1JfTUlMTElfUkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9NSUxMSV9SRUwifSwKLSAge1JfQ09ERV9QTEFCRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfUExBQkVMIn0sCi0gIHtSX0NPREVfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT0RFX1BMQUJFTCJ9LAotICB7Ul9CUkVBS1BPSU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9CUkVBS1BPSU5UIn0sCi0gIHtSX0VOVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTlRSWSJ9LAotICB7Ul9FTlRSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5UUlkifSwKLSAge1JfQUxUX0VOVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BTFRfRU5UUlkifSwKLSAge1JfRVhJVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRVhJVCJ9LAotICB7Ul9CRUdJTl9UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0JFR0lOX1RSWSJ9LAotICB7Ul9FTkRfVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTkRfVFJZIn0sCi0gIHtSX0VORF9UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VORF9UUlkifSwKLSAge1JfRU5EX1RSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5EX1RSWSJ9LAotICB7Ul9CRUdJTl9CUlRBQiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQkVHSU5fQlJUQUIifSwKLSAge1JfRU5EX0JSVEFCLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTkRfQlJUQUIifSwKLSAge1JfU1RBVEVNRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TVEFURU1FTlQifSwKLSAge1JfU1RBVEVNRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TVEFURU1FTlQifSwKLSAge1JfU1RBVEVNRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TVEFURU1FTlQifSwKLSAge1JfREFUQV9FWFBSLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX0VYUFIifSwKLSAge1JfQ09ERV9FWFBSLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT0RFX0VYUFIifSwKLSAge1JfRlNFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRlNFTCJ9LAotICB7Ul9MU0VMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9MU0VMIn0sCi0gIHtSX1JTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JTRUwifSwKLSAge1JfTl9NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OX01PREUifSwKLSAge1JfU19NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TX01PREUifSwKLSAge1JfRF9NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EX01PREUifSwKLSAge1JfUl9NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SX01PREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9EQVRBX09WRVJSSURFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09WRVJSSURFIn0sCi0gIHtSX0RBVEFfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfT1ZFUlJJREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9EQVRBX09WRVJSSURFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09WRVJSSURFIn0sCi0gIHtSX1RSQU5TTEFURUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1RSQU5TTEFURUQifSwKLSAge1JfQVVYX1VOV0lORCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQVVYX1VOV0lORCJ9LAotICB7Ul9DT01QMSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09NUDEifSwKLSAge1JfQ09NUDIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPTVAyIn0sCi0gIHtSX0NPTVAzLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT01QMyJ9LAotICB7Ul9QUkVWX0ZJWFVQLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QUkVWX0ZJWFVQIn0sCi0gIHtSX1BSRVZfRklYVVAsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BSRVZfRklYVVAifSwKLSAge1JfUFJFVl9GSVhVUCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUFJFVl9GSVhVUCJ9LAotICB7Ul9QUkVWX0ZJWFVQLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QUkVWX0ZJWFVQIn0sCi0gIHtSX1NFQ19TVE1ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TRUNfU1RNVCJ9LAotICB7Ul9OMFNFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTjBTRUwifSwKLSAge1JfTjFTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX04xU0VMIn0sCi0gIHtSX0xJTkVUQUIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xJTkVUQUIifSwKLSAge1JfTElORVRBQl9FU0MsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xJTkVUQUJfRVNDIn0sCi0gIHtSX0xUUF9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTFRQX09WRVJSSURFIn0sCi0gIHtSX0NPTU1FTlQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPTU1FTlQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn19OwotICAKLS8qIEluaXRpYWxpemUgdGhlIFNPTSByZWxvY2F0aW9uIHF1ZXVlLiAgQnkgZGVmaW5pdGlvbiB0aGUgcXVldWUgaG9sZHMKLSAgIHRoZSBsYXN0IGZvdXIgbXVsdGlieXRlIGZpeHVwcy4gICovCi0gIAotc3RhdGljIHZvaWQKLXNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIChxdWV1ZSkKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgcXVldWVbMF0ucmVsb2MgPSBOVUxMOwotICBxdWV1ZVswXS5zaXplID0gMDsKLSAgcXVldWVbMV0ucmVsb2MgPSBOVUxMOwotICBxdWV1ZVsxXS5zaXplID0gMDsKLSAgcXVldWVbMl0ucmVsb2MgPSBOVUxMOwotICBxdWV1ZVsyXS5zaXplID0gMDsKLSAgcXVldWVbM10ucmVsb2MgPSBOVUxMOwotICBxdWV1ZVszXS5zaXplID0gMDsKLX0KLQotLyogSW5zZXJ0IGEgbmV3IHJlbG9jYXRpb24gaW50byB0aGUgcmVsb2NhdGlvbiBxdWV1ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1zb21fcmVsb2NfcXVldWVfaW5zZXJ0IChwLCBzaXplLCBxdWV1ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIHF1ZXVlWzNdLnJlbG9jID0gcXVldWVbMl0ucmVsb2M7Ci0gIHF1ZXVlWzNdLnNpemUgPSBxdWV1ZVsyXS5zaXplOwotICBxdWV1ZVsyXS5yZWxvYyA9IHF1ZXVlWzFdLnJlbG9jOwotICBxdWV1ZVsyXS5zaXplID0gcXVldWVbMV0uc2l6ZTsKLSAgcXVldWVbMV0ucmVsb2MgPSBxdWV1ZVswXS5yZWxvYzsKLSAgcXVldWVbMV0uc2l6ZSA9IHF1ZXVlWzBdLnNpemU7Ci0gIHF1ZXVlWzBdLnJlbG9jID0gcDsKLSAgcXVldWVbMF0uc2l6ZSA9IHNpemU7Ci19Ci0KLS8qIFdoZW4gYW4gZW50cnkgaW4gdGhlIHJlbG9jYXRpb24gcXVldWUgaXMgcmV1c2VkLCB0aGUgZW50cnkgbW92ZXMKLSAgIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWUuICAqLwotCi1zdGF0aWMgdm9pZAotc29tX3JlbG9jX3F1ZXVlX2ZpeCAocXVldWUsIGluZGV4KQotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotICAgICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci17Ci0gIGlmIChpbmRleCA9PSAwKQotICAgIHJldHVybjsKLQotICBpZiAoaW5kZXggPT0gMSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICp0bXAxID0gcXVldWVbMF0ucmVsb2M7Ci0gICAgICB1bnNpZ25lZCBpbnQgdG1wMiA9IHF1ZXVlWzBdLnNpemU7Ci0gICAgICBxdWV1ZVswXS5yZWxvYyA9IHF1ZXVlWzFdLnJlbG9jOwotICAgICAgcXVldWVbMF0uc2l6ZSA9IHF1ZXVlWzFdLnNpemU7Ci0gICAgICBxdWV1ZVsxXS5yZWxvYyA9IHRtcDE7Ci0gICAgICBxdWV1ZVsxXS5zaXplID0gdG1wMjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluZGV4ID09IDIpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqdG1wMSA9IHF1ZXVlWzBdLnJlbG9jOwotICAgICAgdW5zaWduZWQgaW50IHRtcDIgPSBxdWV1ZVswXS5zaXplOwotICAgICAgcXVldWVbMF0ucmVsb2MgPSBxdWV1ZVsyXS5yZWxvYzsKLSAgICAgIHF1ZXVlWzBdLnNpemUgPSBxdWV1ZVsyXS5zaXplOwotICAgICAgcXVldWVbMl0ucmVsb2MgPSBxdWV1ZVsxXS5yZWxvYzsKLSAgICAgIHF1ZXVlWzJdLnNpemUgPSBxdWV1ZVsxXS5zaXplOwotICAgICAgcXVldWVbMV0ucmVsb2MgPSB0bXAxOwotICAgICAgcXVldWVbMV0uc2l6ZSA9IHRtcDI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbmRleCA9PSAzKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnRtcDEgPSBxdWV1ZVswXS5yZWxvYzsKLSAgICAgIHVuc2lnbmVkIGludCB0bXAyID0gcXVldWVbMF0uc2l6ZTsKLSAgICAgIHF1ZXVlWzBdLnJlbG9jID0gcXVldWVbM10ucmVsb2M7Ci0gICAgICBxdWV1ZVswXS5zaXplID0gcXVldWVbM10uc2l6ZTsKLSAgICAgIHF1ZXVlWzNdLnJlbG9jID0gcXVldWVbMl0ucmVsb2M7Ci0gICAgICBxdWV1ZVszXS5zaXplID0gcXVldWVbMl0uc2l6ZTsKLSAgICAgIHF1ZXVlWzJdLnJlbG9jID0gcXVldWVbMV0ucmVsb2M7Ci0gICAgICBxdWV1ZVsyXS5zaXplID0gcXVldWVbMV0uc2l6ZTsKLSAgICAgIHF1ZXVlWzFdLnJlbG9jID0gdG1wMTsKLSAgICAgIHF1ZXVlWzFdLnNpemUgPSB0bXAyOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYWJvcnQoKTsKLX0KLQotLyogU2VhcmNoIGZvciBhIHBhcnRpY3VsYXIgcmVsb2NhdGlvbiBpbiB0aGUgcmVsb2NhdGlvbiBxdWV1ZS4gICovCi0KLXN0YXRpYyBpbnQKLXNvbV9yZWxvY19xdWV1ZV9maW5kIChwLCBzaXplLCBxdWV1ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIGlmIChxdWV1ZVswXS5yZWxvYyAmJiAhbWVtY21wIChwLCBxdWV1ZVswXS5yZWxvYywgc2l6ZSkKLSAgICAgICYmIHNpemUgPT0gcXVldWVbMF0uc2l6ZSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKHF1ZXVlWzFdLnJlbG9jICYmICFtZW1jbXAgKHAsIHF1ZXVlWzFdLnJlbG9jLCBzaXplKQotICAgICAgJiYgc2l6ZSA9PSBxdWV1ZVsxXS5zaXplKQotICAgIHJldHVybiAxOwotICBpZiAocXVldWVbMl0ucmVsb2MgJiYgIW1lbWNtcCAocCwgcXVldWVbMl0ucmVsb2MsIHNpemUpCi0gICAgICAmJiBzaXplID09IHF1ZXVlWzJdLnNpemUpCi0gICAgcmV0dXJuIDI7Ci0gIGlmIChxdWV1ZVszXS5yZWxvYyAmJiAhbWVtY21wIChwLCBxdWV1ZVszXS5yZWxvYywgc2l6ZSkKLSAgICAgICYmIHNpemUgPT0gcXVldWVbM10uc2l6ZSkKLSAgICByZXR1cm4gMzsKLSAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi10cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIHNpemUsIHF1ZXVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXA7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBpbnQgcXVldWVfaW5kZXggPSBzb21fcmVsb2NfcXVldWVfZmluZCAocCwgc2l6ZSwgcXVldWUpOwotCi0gIGlmIChxdWV1ZV9pbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICAvKiBGb3VuZCB0aGlzIGluIGEgcHJldmlvdXMgZml4dXAuICBVbmRvIHRoZSBmaXh1cCB3ZQotCSBqdXN0IGJ1aWx0IGFuZCB1c2UgUl9QUkVWX0ZJWFVQIGluc3RlYWQuICBXZSBzYXZlZCAKLQkgYSB0b3RhbCBvZiBzaXplIC0gMSBieXRlcyBpbiB0aGUgZml4dXAgc3RyZWFtLiAgKi8KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgUl9QUkVWX0ZJWFVQICsgcXVldWVfaW5kZXgsIHApOwotICAgICAgcCArPSAxOwotICAgICAgKnN1YnNwYWNlX3JlbG9jX3NpemVwICs9IDE7Ci0gICAgICBzb21fcmVsb2NfcXVldWVfZml4IChxdWV1ZSwgcXVldWVfaW5kZXgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNvbV9yZWxvY19xdWV1ZV9pbnNlcnQgKHAsIHNpemUsIHF1ZXVlKTsKLSAgICAgICpzdWJzcGFjZV9yZWxvY19zaXplcCArPSBzaXplOwotICAgICAgcCArPSBzaXplOwotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEVtaXQgdGhlIHByb3BlciBSX05PX1JFTE9DQVRJT04gZml4dXBzIHRvIG1hcCB0aGUgbmV4dCBTS0lQCi0gICBieXRlcyB3aXRob3V0IGFueSByZWxvY2F0aW9uLiAgVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBzdWJzcGFjZQotICAgcmVsb2NhdGlvbiBzdHJlYW0gdmlhIFNVQlNQQUNFX1JFTE9DX1NJWkVfUDsgYWxzbyByZXR1cm4gdGhlIAotICAgY3VycmVudCBwb2ludGVyIGludG8gdGhlIHJlbG9jYXRpb24gc3RyZWFtLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotc29tX3JlbG9jX3NraXAgKGFiZmQsIHNraXAsIHAsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBxdWV1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2tpcDsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50ICpzdWJzcGFjZV9yZWxvY19zaXplcDsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgLyogVXNlIGEgNCBieXRlIFJfTk9fUkVMT0NBVElPTiBlbnRyeSB3aXRoIGEgbWF4aW1hbCB2YWx1ZQotICAgICB0aGVuIFJfUFJFVl9GSVhVUHMgdG8gZ2V0IHRoZSBkaWZmZXJlbmNlIGRvd24gdG8gYQotICAgICByZWFzb25hYmxlIHNpemUuICAqLwotICBpZiAoc2tpcCA+PSAweDEwMDAwMDApCi0gICAgewotICAgICAgc2tpcCAtPSAweDEwMDAwMDA7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfTk9fUkVMT0NBVElPTiArIDMxLCBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZiwgcCArIDEpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgMHhmZmZmLCBwICsgMik7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA0LCBxdWV1ZSk7Ci0gICAgICB3aGlsZSAoc2tpcCA+PSAweDEwMDAwMDApCi0JewotCSAgc2tpcCAtPSAweDEwMDAwMDA7Ci0JICBiZmRfcHV0XzggKGFiZmQsIFJfUFJFVl9GSVhVUCwgcCk7Ci0JICBwKys7Ci0JICAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXAgKz0gMTsKLQkgIC8qIE5vIG5lZWQgdG8gYWRqdXN0IHF1ZXVlIGhlcmUgc2luY2Ugd2UgYXJlIHJlcGVhdGluZyB0aGUKLQkgICAgIG1vc3QgcmVjZW50IGZpeHVwLiAgKi8KLQl9Ci0gICAgfQotICAKLSAgLyogVGhlIGRpZmZlcmVuY2UgbXVzdCBiZSBsZXNzIHRoYW4gMHgxMDAwMDAwLiAgVXNlIG9uZSAKLSAgICAgbW9yZSBSX05PX1JFTE9DQVRJT04gZW50cnkgdG8gZ2V0IHRvIHRoZSByaWdodCBkaWZmZXJlbmNlLiAgKi8KLSAgaWYgKChza2lwICYgMykgPT0gMCAmJiBza2lwIDw9IDB4YzAwMDAgJiYgc2tpcCA+IDApCi0gICAgewotICAgICAgLyogRGlmZmVyZW5jZSBjYW4gYmUgaGFuZGxlZCBpbiBhIHNpbXBsZSBzaW5nbGUtYnl0ZQotCSBSX05PX1JFTE9DQVRJT04gZW50cnkuICAqLwotICAgICAgaWYgKHNraXAgPD0gMHg2MCkKLQl7Ci0JICBiZmRfcHV0XzggKGFiZmQsIFJfTk9fUkVMT0NBVElPTiArIChza2lwID4+IDIpIC0gMSwgcCk7Ci0JICAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXAgKz0gMTsKLQkgIHArKzsKLQl9Ci0gICAgICAvKiBIYW5kbGUgaXQgd2l0aCBhIHR3byBieXRlIFJfTk9fUkVMT0NBVElPTiBlbnRyeS4gICovCi0gICAgICBlbHNlIGlmIChza2lwIDw9IDB4MTAwMCkKLQl7Ci0JICBiZmRfcHV0XzggKGFiZmQsIFJfTk9fUkVMT0NBVElPTiArIDI0ICsgKCgoc2tpcCA+PiAyKSAtIDEpID4+IDgpLCBwKTsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgKHNraXAgPj4gMikgLSAxLCBwICsgMSk7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAyLCBxdWV1ZSk7Ci0JfQotICAgICAgLyogSGFuZGxlIGl0IHdpdGggYSB0aHJlZSBieXRlIFJfTk9fUkVMT0NBVElPTiBlbnRyeS4gICovCi0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAyOCArICgoKHNraXAgPj4gMikgLSAxKSA+PiAxNiksIHApOwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgKHNraXAgPj4gMikgLSAxLCBwICsgMSk7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAzLCBxdWV1ZSk7Ci0JfQotICAgIH0KLSAgLyogVWdoLiAgUHVudCBhbmQgdXNlIGEgNCBieXRlIGVudHJ5LiAgKi8KLSAgZWxzZSBpZiAoc2tpcCA+IDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAzMSwgcCk7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIChza2lwIC0gMSkgPj4gMTYsIHAgKyAxKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHNraXAgLSAxLCBwICsgMik7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA0LCBxdWV1ZSk7Ci0gICAgfQotICByZXR1cm4gcDsKLX0KLQotLyogRW1pdCB0aGUgcHJvcGVyIFJfREFUQV9PVkVSUklERSBmaXh1cHMgdG8gaGFuZGxlIGEgbm9uemVybyBhZGRlbmQKLSAgIGZyb20gYSBCRkQgcmVsb2NhdGlvbi4gIFVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3Vic3BhY2UgcmVsb2NhdGlvbgotICAgc3RyZWFtIHZpYSBTVUJTUEFDRV9SRUxPQ19TSVpFX1A7IGFsc28gcmV0dXJuIHRoZSBjdXJyZW50IHBvaW50ZXIKLSAgIGludG8gdGhlIHJlbG9jYXRpb24gc3RyZWFtLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotc29tX3JlbG9jX2FkZGVuZCAoYWJmZCwgYWRkZW5kLCBwLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcXVldWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGFkZGVuZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50ICpzdWJzcGFjZV9yZWxvY19zaXplcDsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgaWYgKCh1bnNpZ25lZCkoYWRkZW5kKSArIDB4ODAgPCAweDEwMCkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfREFUQV9PVkVSUklERSArIDEsIHApOwotICAgICAgYmZkX3B1dF84IChhYmZkLCBhZGRlbmQsIHAgKyAxKTsKLSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIDIsIHF1ZXVlKTsgCi0gICAgfQotICBlbHNlIGlmICgodW5zaWduZWQpIChhZGRlbmQpICsgMHg4MDAwIDwgMHgxMDAwMCkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfREFUQV9PVkVSUklERSArIDIsIHApOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgYWRkZW5kLCBwICsgMSk7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAzLCBxdWV1ZSk7Ci0gICAgfQotICBlbHNlIGlmICgodW5zaWduZWQpIChhZGRlbmQpICsgMHg4MDAwMDAgPCAweDEwMDAwMDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyAzLCBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYWRkZW5kID4+IDE2LCBwICsgMSk7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBhZGRlbmQsIHAgKyAyKTsKLSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIDQsIHF1ZXVlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfREFUQV9PVkVSUklERSArIDQsIHApOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgYWRkZW5kLCBwICsgMSk7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA1LCBxdWV1ZSk7Ci0gICAgfQotICByZXR1cm4gcDsKLX0KLQotLyogSGFuZGxlIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGwgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXNvbV9yZWxvY19jYWxsIChhYmZkLCBwLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgYmZkX3JlbG9jLCBzeW1fbnVtLCBxdWV1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpwOwotICAgICB1bnNpZ25lZCBpbnQgKnN1YnNwYWNlX3JlbG9jX3NpemVwOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIGludCBzeW1fbnVtOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBpbnQgYXJnX2JpdHMgPSBIUFBBX1JfQVJHX1JFTE9DIChiZmRfcmVsb2MtPmFkZGVuZCk7Ci0gIGludCBydG5fYml0cyA9IGFyZ19iaXRzICYgMHgzOwotICBpbnQgdHlwZSwgZG9uZSA9IDA7Ci0gIAotICAvKiBZb3UnbGwgbmV2ZXIgYmVsaWV2ZSBhbGwgdGhpcyBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIHJlbG9jYXRpb25zCi0gICAgIGZvciBmdW5jdGlvbiBjYWxscy4gIEhhdmluZyB0byBjb21wdXRlIGFuZCBwYWNrIHRoZSBhcmd1bWVudAotICAgICByZWxvY2F0aW9uIGJpdHMgaXMgdGhlIHJlYWwgbmlnaHRtYXJlLgotICAgICAKLSAgICAgSWYgeW91J3JlIGludGVyZXN0ZWQgaW4gaG93IHRoaXMgd29ya3MsIGp1c3QgZm9yZ2V0IGl0LiAgWW91IHJlYWxseQotICAgICBkbyBub3Qgd2FudCB0byBrbm93IGFib3V0IHRoaXMgYnJhaW5kYW1hZ2UuICAqLwotCi0gIC8qIEZpcnN0IHNlZSBpZiB0aGlzIGNhbiBiZSBkb25lIHdpdGggYSAic2ltcGxlIiByZWxvY2F0aW9uLiAgU2ltcGxlCi0gICAgIHJlbG9jYXRpb25zIGhhdmUgYSBzeW1ib2wgbnVtYmVyIDwgMHgxMDAgYW5kIGhhdmUgc2ltcGxlIGVuY29kaW5ncwotICAgICBvZiBhcmd1bWVudCByZWxvY2F0aW9ucy4gICovCi0KLSAgaWYgKHN5bV9udW0gPCAweDEwMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFyZ19iaXRzKQotCXsKLQljYXNlIDA6Ci0JY2FzZSAxOgotCSAgdHlwZSA9IDA7Ci0JICBicmVhazsKLQljYXNlIDEgPDwgODoKLQljYXNlIDEgPDwgOCB8IDE6Ci0JICB0eXBlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgMSA8PCA4IHwgMSA8PCA2OgotCWNhc2UgMSA8PCA4IHwgMSA8PCA2IHwgMToKLQkgIHR5cGUgPSAyOwotCSAgYnJlYWs7Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQ6Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxOgotCSAgdHlwZSA9IDM7Ci0JICBicmVhazsKLQljYXNlIDEgPDwgOCB8IDEgPDwgNiB8IDEgPDwgNCB8IDEgPDwgMjoKLQljYXNlIDEgPDwgOCB8IDEgPDwgNiB8IDEgPDwgNCB8IDEgPDwgMiB8IDE6Ci0JICB0eXBlID0gNDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAvKiBOb3Qgb25lIG9mIHRoZSBlYXN5IGVuY29kaW5ncy4gIFRoaXMgd2lsbCBoYXZlIHRvIGJlCi0JICAgICBoYW5kbGVkIGJ5IHRoZSBtb3JlIGNvbXBsZXggY29kZSBiZWxvdy4gICovCi0JICB0eXBlID0gLTE7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAodHlwZSAhPSAtMSkKLQl7Ci0JICAvKiBBY2NvdW50IGZvciB0aGUgcmV0dXJuIHZhbHVlIHRvby4gICovCi0JICBpZiAocnRuX2JpdHMpCi0JICAgIHR5cGUgKz0gNTsKLQotCSAgLyogRW1pdCBhIDIgYnl0ZSByZWxvY2F0aW9uLiAgVGhlbiBzZWUgaWYgaXQgY2FuIGJlIGhhbmRsZWQKLQkgICAgIHdpdGggYSByZWxvY2F0aW9uIHdoaWNoIGlzIGFscmVhZHkgaW4gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgdHlwZSwgcCk7Ci0JICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAxKTsKLQkgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIDIsIHF1ZXVlKTsKLQkgIGRvbmUgPSAxOwotCX0KLSAgICB9Ci0gIAotICAvKiBJZiB0aGlzIGNvdWxkIG5vdCBiZSBoYW5kbGVkIHdpdGggYSBzaW1wbGUgcmVsb2NhdGlvbiwgdGhlbiBkbyBhIGhhcmQKLSAgICAgb25lLiAgSGFyZCByZWxvY2F0aW9ucyBvY2N1ciBpZiB0aGUgc3ltYm9sIG51bWJlciB3YXMgdG9vIGhpZ2ggb3IgaWYKLSAgICAgdGhlIGVuY29kaW5nIG9mIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBpcyB0b28gY29tcGxleC4gICovCi0gIGlmICghIGRvbmUpCi0gICAgewotICAgICAgLyogRG9uJ3QgYXNrIGFib3V0IHRoZXNlIG1hZ2ljIHNlcXVlbmNlcy4gIEkgdG9vayB0aGVtIHN0cmFpZ2h0Ci0JIGZyb20gZ2FzLTEuMzYgd2hpY2ggdG9vayB0aGVtIGZyb20gdGhlIGEub3V0IG1hbiBwYWdlLiAgKi8KLSAgICAgIHR5cGUgPSBydG5fYml0czsKLSAgICAgIGlmICgoYXJnX2JpdHMgPj4gNiAmIDB4ZikgPT0gMHhlKQotCXR5cGUgKz0gOSAqIDQwOwotICAgICAgZWxzZQotCXR5cGUgKz0gKDMgKiAoYXJnX2JpdHMgPj4gOCAmIDMpICsgKGFyZ19iaXRzID4+IDYgJiAzKSkgKiA0MDsKLSAgICAgIGlmICgoYXJnX2JpdHMgPj4gMiAmIDB4ZikgPT0gMHhlKQotCXR5cGUgKz0gOSAqIDQ7Ci0gICAgICBlbHNlCi0JdHlwZSArPSAoMyAqIChhcmdfYml0cyA+PiA0ICYgMykgKyAoYXJnX2JpdHMgPj4gMiAmIDMpKSAqIDQ7Ci0gICAgICAKLSAgICAgIC8qIE91dHB1dCB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSByZWxvY2F0aW9uLiAgVGhlc2UgZGVzY3JpYmUKLQkgdGhlIGxlbmd0aCBvZiB0aGUgcmVsb2NhdGlvbiBhbmQgZW5jb2Rpbmcgc3R5bGUuICAqLwotICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMTAKLQkJICsgMiAqIChzeW1fbnVtID49IDB4MTAwKSArICh0eXBlID49IDB4MTAwKSwKLQkJIHApOwotICAgICAgYmZkX3B1dF84IChhYmZkLCB0eXBlLCBwICsgMSk7Ci0gICAgICAKLSAgICAgIC8qIE5vdyBvdXRwdXQgdGhlIHN5bWJvbCBpbmRleCBhbmQgc2VlIGlmIHRoaXMgYml6YXJyZSByZWxvY2F0aW9uCi0JIGp1c3QgaGFwcGVuZWQgdG8gYmUgaW4gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotICAgICAgaWYgKHN5bV9udW0gPCAweDEwMCkKLQl7Ci0JICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAyKTsKLQkgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIDMsIHF1ZXVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtID4+IDE2LCBwICsgMik7Ci0JICBiZmRfcHV0XzE2IChhYmZkLCBzeW1fbnVtLCBwICsgMyk7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA1LCBxdWV1ZSk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLQotLyogUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgWCwgYmFzZSAyLCBjb25zaWRlcmluZyBYIHVuc2lnbmVkLiAKLSAgIEFib3J0IC0xIGlmIFggaXMgbm90IGEgcG93ZXIgb3IgdHdvIG9yIGlzIHplcm8uICAqLwotCi1zdGF0aWMgaW50Ci1sb2cyICh4KQotICAgICB1bnNpZ25lZCBpbnQgeDsKLXsKLSAgaW50IGxvZyA9IDA7Ci0KLSAgLyogVGVzdCBmb3IgMCBvciBhIHBvd2VyIG9mIDIuICAqLwotICBpZiAoeCA9PSAwIHx8IHggIT0gKHggJiAteCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHdoaWxlICgoeCA+Pj0gMSkgIT0gMCkKLSAgICBsb2crKzsKLSAgcmV0dXJuIGxvZzsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaHBwYV9zb21fcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCWlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEdpdmVuIGEgZ2VuZXJpYyBIUFBBIHJlbG9jYXRpb24gdHlwZSwgdGhlIGluc3RydWN0aW9uIGZvcm1hdCwKLSAgIGFuZCBhIGZpZWxkIHNlbGVjdG9yLCByZXR1cm4gb25lIG9yIG1vcmUgYXBwcm9wcmlhdGUgU09NIHJlbG9jYXRpb25zLiAgKi8KLQotaW50ICoqCi1ocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSAoYWJmZCwgYmFzZV90eXBlLCBmb3JtYXQsIGZpZWxkLCBzeW1fZGlmZiwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBiYXNlX3R5cGU7Ci0gICAgIGludCBmb3JtYXQ7Ci0gICAgIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCBmaWVsZDsKLSAgICAgaW50IHN5bV9kaWZmOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGludCAqZmluYWxfdHlwZSwgKipmaW5hbF90eXBlczsKLQotICBmaW5hbF90eXBlcyA9IChpbnQgKiopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQgKikgKiA2KTsKLSAgZmluYWxfdHlwZSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotICBpZiAoIWZpbmFsX3R5cGVzIHx8ICFmaW5hbF90eXBlKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFRoZSBmaWVsZCBzZWxlY3RvciBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIHJlbG9jYXRpb25zIHRvIGJlIAotICAgICBnZW5lcmF0ZWQuICBJdCdzIGltcG9zc2libGUgdG8ga25vdyBhdCB0aGlzIG1vbWVudCBpZiBhZGRpdGlvbmFsCi0gICAgIHJlbG9jYXRpb25zIHdpbGwgYmUgbmVlZGVkLCBzbyB3ZSBtYWtlIHRoZW0uICBUaGUgY29kZSB0byBhY3R1YWxseQotICAgICB3cml0ZSB0aGUgcmVsb2NhdGlvbi9maXh1cCBzdHJlYW0gaXMgcmVzcG9uc2libGUgZm9yIHJlbW92aW5nCi0gICAgIGFueSByZWR1bmRhbnQgcmVsb2NhdGlvbnMuICAqLwotICBzd2l0Y2ggKGZpZWxkKQotICAgIHsKLSAgICAgIGNhc2UgZV9mc2VsOgotICAgICAgY2FzZSBlX3BzZWw6Ci0gICAgICBjYXNlIGVfbHBzZWw6Ci0gICAgICBjYXNlIGVfcnBzZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSBmaW5hbF90eXBlOwotCWZpbmFsX3R5cGVzWzFdID0gTlVMTDsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV90c2VsOgotICAgICAgY2FzZSBlX2x0c2VsOgotICAgICAgY2FzZSBlX3J0c2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCWlmIChmaWVsZCA9PSBlX3RzZWwpCi0JICAqZmluYWxfdHlwZXNbMF0gPSBSX0ZTRUw7Ci0JZWxzZSBpZiAoZmllbGQgPT0gZV9sdHNlbCkKLQkgICpmaW5hbF90eXBlc1swXSA9IFJfTFNFTDsKLQllbHNlCi0JICAqZmluYWxfdHlwZXNbMF0gPSBSX1JTRUw7Ci0JZmluYWxfdHlwZXNbMV0gPSBmaW5hbF90eXBlOwotCWZpbmFsX3R5cGVzWzJdID0gTlVMTDsKLQkqZmluYWxfdHlwZSA9IGJhc2VfdHlwZTsKLQlicmVhazsKLQotICAgICAgY2FzZSBlX2xzc2VsOgotICAgICAgY2FzZSBlX3Jzc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfU19NT0RFOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9sc2VsOgotICAgICAgY2FzZSBlX3JzZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9OX01PREU7Ci0JZmluYWxfdHlwZXNbMV0gPSBmaW5hbF90eXBlOwotCWZpbmFsX3R5cGVzWzJdID0gTlVMTDsKLQkqZmluYWxfdHlwZSA9IGJhc2VfdHlwZTsKLQlicmVhazsKLQotICAgICAgY2FzZSBlX2xkc2VsOgotICAgICAgY2FzZSBlX3Jkc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfRF9NT0RFOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9scnNlbDoKLSAgICAgIGNhc2UgZV9ycnNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX1JfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbnNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX04xU0VMOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9ubHNlbDoKLSAgICAgIGNhc2UgZV9ubHJzZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9OMFNFTDsKLQlmaW5hbF90eXBlc1sxXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMV0pCi0JICByZXR1cm4gTlVMTDsKLQlpZiAoZmllbGQgPT0gZV9ubHNlbCkKLQkgICpmaW5hbF90eXBlc1sxXSA9IFJfTl9NT0RFOwotCWVsc2UKLQkgICpmaW5hbF90eXBlc1sxXSA9IFJfUl9NT0RFOwotCWZpbmFsX3R5cGVzWzJdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1szXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0gICAgfQotICAKLSAgc3dpdGNoIChiYXNlX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9IUFBBOgotICAgICAgLyogVGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgbmVlZHMgKnZlcnkqIHNwZWNpYWwgaGFuZGxpbmcuICAqLwotICAgICAgaWYgKHN5bV9kaWZmKQotCXsKLQkgIGZpbmFsX3R5cGVzWzBdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzFdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzJdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzNdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGlmICghZmluYWxfdHlwZXNbMF0gfHwgIWZpbmFsX3R5cGVzWzFdIHx8ICFmaW5hbF90eXBlc1syXSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgaWYgKGZpZWxkID09IGVfZnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9GU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9yc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX1JTRUw7Ci0JICBlbHNlIGlmIChmaWVsZCA9PSBlX2xzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfTFNFTDsKLQkgICpmaW5hbF90eXBlc1sxXSA9IFJfQ09NUDI7Ci0JICAqZmluYWxfdHlwZXNbMl0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzNdID0gUl9DT01QMTsKLQkgIGZpbmFsX3R5cGVzWzRdID0gZmluYWxfdHlwZTsKLQkgIGlmIChmb3JtYXQgPT0gMzIpCi0JICAgICpmaW5hbF90eXBlc1s0XSA9IFJfREFUQV9FWFBSOwotCSAgZWxzZQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0NPREVfRVhQUjsKLQkgIGZpbmFsX3R5cGVzWzVdID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qIFBMQUJFTHMgZ2V0IHRoZWlyIG93biByZWxvY2F0aW9uIHR5cGUuICAqLwotICAgICAgZWxzZSBpZiAoZmllbGQgPT0gZV9wc2VsCi0JICB8fCBmaWVsZCA9PSBlX2xwc2VsCi0JICB8fCBmaWVsZCA9PSBlX3Jwc2VsKQotCXsKLQkgIC8qIEEgUExBQkVMIHJlbG9jYXRpb24gdGhhdCBoYXMgYSBzaXplIG9mIDMyIGJpdHMgbXVzdAotCSAgICAgYmUgYSBSX0RBVEFfUExBQkVMLiAgQWxsIG90aGVycyBhcmUgUl9DT0RFX1BMQUJFTHMuICAqLwotCSAgaWYgKGZvcm1hdCA9PSAzMikKLQkgICAgKmZpbmFsX3R5cGUgPSBSX0RBVEFfUExBQkVMOwotCSAgZWxzZQotCSAgICAqZmluYWxfdHlwZSA9IFJfQ09ERV9QTEFCRUw7Ci0JfQotICAgICAgLyogUElDIHN0dWZmLiAgKi8KLSAgICAgIGVsc2UgaWYgKGZpZWxkID09IGVfdHNlbAotCSAgfHwgZmllbGQgPT0gZV9sdHNlbAotCSAgfHwgZmllbGQgPT0gZV9ydHNlbCkKLQkqZmluYWxfdHlwZSA9IFJfRExUX1JFTDsKLSAgICAgIC8qIEEgcmVsb2NhdGlvbiBpbiB0aGUgZGF0YSBzcGFjZSBpcyBhbHdheXMgYSBmdWxsIDMyYml0cy4gICovCi0gICAgICBlbHNlIGlmIChmb3JtYXQgPT0gMzIpCi0JewotCSAgKmZpbmFsX3R5cGUgPSBSX0RBVEFfT05FX1NZTUJPTDsKLQotCSAgLyogSWYgdGhlcmUncyBubyBTT00gc3ltYm9sIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQkZECi0JICAgICBzeW1ib2wsIHRoZW4gc2V0IHRoZSBzeW1ib2wgdHlwZSB0byBTVF9EQVRBLgotCi0JICAgICBPbmx5IGRvIHRoaXMgaWYgdGhlIHR5cGUgaXMgZ29pbmcgdG8gZGVmYXVsdCBsYXRlciB3aGVuCi0JICAgICB3ZSB3cml0ZSB0aGUgb2JqZWN0IGZpbGUuCi0KLQkgICAgIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHRoZSBsaW5rZXIgbmV2ZXIgZW5jb3VudGVycyBhbgotCSAgICAgUl9EQVRBX09ORV9TWU1CT0wgcmVsb2MgaW52b2x2aW5nIGFuIFNUX0NPREUgc3ltYm9sLgotCi0JICAgICBUaGlzIGFsbG93cyB0aGUgY29tcGlsZXIgdG8gZ2VuZXJhdGUgZXhjZXB0aW9uIGhhbmRsaW5nCi0JICAgICB0YWJsZXMuCi0KLQkgICAgIE5vdGUgdGhhdCBvbmUgZGF5IHdlIG1heSBuZWVkIHRvIGFsc28gZW1pdCBCRUdJTl9CUlRBQiBhbmQKLQkgICAgIEVORF9CUlRBQiB0byBwcmV2ZW50IHRoZSBsaW5rZXIgZnJvbSBvcHRpbWl6aW5nIGF3YXkgaW5zbnMKLQkgICAgIGluIGV4Y2VwdGlvbiBoYW5kbGluZyByZWdpb25zLiAgKi8KLQkgIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04KLQkgICAgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotCSAgICAgICYmIChzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSA9PSAwCi0JICAgICAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JICAgIHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9EQVRBOwotCX0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSFBQQV9HT1RPRkY6Ci0gICAgICAvKiBNb3JlIFBMQUJFTCBzcGVjaWFsIGNhc2VzLiAgKi8KLSAgICAgIGlmIChmaWVsZCA9PSBlX3BzZWwKLQkgIHx8IGZpZWxkID09IGVfbHBzZWwKLQkgIHx8IGZpZWxkID09IGVfcnBzZWwpCi0JKmZpbmFsX3R5cGUgPSBSX0RBVEFfUExBQkVMOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSFBQQV9DT01QTEVYOgotICAgICAgLyogVGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgbmVlZHMgKnZlcnkqIHNwZWNpYWwgaGFuZGxpbmcuICAqLwotICAgICAgaWYgKHN5bV9kaWZmKQotCXsKLQkgIGZpbmFsX3R5cGVzWzBdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzFdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzJdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzNdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGlmICghZmluYWxfdHlwZXNbMF0gfHwgIWZpbmFsX3R5cGVzWzFdIHx8ICFmaW5hbF90eXBlc1syXSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgaWYgKGZpZWxkID09IGVfZnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9GU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9yc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX1JTRUw7Ci0JICBlbHNlIGlmIChmaWVsZCA9PSBlX2xzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfTFNFTDsKLQkgICpmaW5hbF90eXBlc1sxXSA9IFJfQ09NUDI7Ci0JICAqZmluYWxfdHlwZXNbMl0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzNdID0gUl9DT01QMTsKLQkgIGZpbmFsX3R5cGVzWzRdID0gZmluYWxfdHlwZTsKLQkgIGlmIChmb3JtYXQgPT0gMzIpCi0JICAgICpmaW5hbF90eXBlc1s0XSA9IFJfREFUQV9FWFBSOwotCSAgZWxzZQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0NPREVfRVhQUjsKLQkgIGZpbmFsX3R5cGVzWzVdID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQlicmVhazsKLQotICAgIGNhc2UgUl9IUFBBX05PTkU6Ci0gICAgY2FzZSBSX0hQUEFfQUJTX0NBTEw6Ci0gICAgICAvKiBSaWdodCBub3cgd2UgY2FuIGRlZmF1bHQgYWxsIHRoZXNlLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0hQUEFfUENSRUxfQ0FMTDoKLSAgICAgIHsKLSNpZm5kZWYgTk9fUENSRUxfTU9ERVMKLQkvKiBJZiB3ZSBoYXZlIHNob3J0IGFuZCBsb25nIHBjcmVsIG1vZGVzLCB0aGVuIGdlbmVyYXRlIHRoZSBwcm9wZXIKLQkgICBtb2RlIHNlbGVjdG9yLCB0aGVuIHRoZSBwY3JlbCByZWxvY2F0aW9uLiAgUmVkdW5kYW50IHNlbGVjdG9ycwotCSAgIHdpbGwgYmUgZWxpbWludGVkIGFzIHRoZSByZWxvY3MgYXJlIHNpemVkIGFuZCBlbWl0dGVkLiAgKi8KLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQlpZiAoZm9ybWF0ID09IDE3KQotCSAgKmZpbmFsX3R5cGVzWzBdID0gUl9TSE9SVF9QQ1JFTF9NT0RFOwotCWVsc2UKLQkgICpmaW5hbF90eXBlc1swXSA9IFJfTE9OR19QQ1JFTF9NT0RFOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0jZW5kaWYKLQlicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIHJldHVybiBmaW5hbF90eXBlczsKLX0KLQotLyogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBjb3JyZWN0IGVudHJ5IGluIHRoZSBQQSBTT00gcmVsb2NhdGlvbgotICAgaG93dG8gdGFibGUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXNvbV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGlmICgoaW50KSBjb2RlIDwgKGludCkgUl9OT19SRUxPQ0FUSU9OICsgMjU1KQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKChpbnQpIHNvbV9ocHBhX2hvd3RvX3RhYmxlWyhpbnQpIGNvZGVdLnR5cGUgPT0gKGludCkgY29kZSk7Ci0gICAgICByZXR1cm4gJnNvbV9ocHBhX2hvd3RvX3RhYmxlWyhpbnQpIGNvZGVdOwotICAgIH0KLQotICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgMDsKLX0KLQotLyogUGVyZm9ybSBzb21lIGluaXRpYWxpemF0aW9uIGZvciBhbiBvYmplY3QuICBTYXZlIHJlc3VsdHMgb2YgdGhpcwotICAgaW5pdGlhbGl6YXRpb24gaW4gdGhlIEJGRC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXNvbV9vYmplY3Rfc2V0dXAgKGFiZmQsIGZpbGVfaGRycCwgYXV4X2hkcnAsIGN1cnJlbnRfb2Zmc2V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBoZWFkZXIgKmZpbGVfaGRycDsKLSAgICAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqYXV4X2hkcnA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBpbnQgZm91bmQ7Ci0KLSAgLyogc29tX21rb2JqZWN0IHdpbGwgc2V0IGJmZF9lcnJvciBpZiBzb21fbWtvYmplY3QgZmFpbHMuICAqLwotICBpZiAoc29tX21rb2JqZWN0IChhYmZkKSAhPSB0cnVlKQotICAgIHJldHVybiAwOwotCi0gIC8qIFNldCBCRkQgZmxhZ3MgYmFzZWQgb24gd2hhdCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIFNPTS4gICovCi0gIGFiZmQtPmZsYWdzID0gQkZEX05PX0ZMQUdTOwotICBpZiAoZmlsZV9oZHJwLT5zeW1ib2xfdG90YWwpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUzsKLQotICBzd2l0Y2ggKGZpbGVfaGRycC0+YV9tYWdpYykKLSAgICB7Ci0gICAgY2FzZSBERU1BTkRfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSAoRF9QQUdFRCB8IFdQX1RFWFQgfCBFWEVDX1ApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSEFSRV9NQUdJQzoKLSAgICAgIGFiZmQtPmZsYWdzIHw9IChXUF9URVhUIHwgRVhFQ19QKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRVhFQ19NQUdJQzoKLSAgICAgIGFiZmQtPmZsYWdzIHw9IChFWEVDX1ApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSRUxPQ19NQUdJQzoKLSAgICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLSAgICAgIGJyZWFrOwotI2lmZGVmIFNITF9NQUdJQwotICAgIGNhc2UgU0hMX01BR0lDOgotI2VuZGlmCi0jaWZkZWYgRExfTUFHSUMKLSAgICBjYXNlIERMX01BR0lDOgotI2VuZGlmCi0gICAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIHRvIGhvbGQgdGhlIHNhdmVkIGV4ZWMgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLSAgb2JqX3NvbV9leGVjX2RhdGEgKGFiZmQpID0gKHN0cnVjdCBzb21fZXhlY19kYXRhICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSApKTsKLSAgaWYgKG9ial9zb21fZXhlY19kYXRhIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFRoZSBicmFpbmRhbWFnZWQgT1NGMSBsaW5rZXIgc3dpdGNoZWQgZXhlY19mbGFncyBhbmQgZXhlY19lbnRyeSEKLQotICAgICBXZSB1c2VkIHRvIGlkZW50aWZ5IE9TRjEgYmluYXJpZXMgYmFzZWQgb24gTkVXX1ZFUlNJT05fSUQsIGJ1dAotICAgICBhcHBhcmVudGx5IHRoZSBsYXRlc3QgSFBVWCBsaW5rZXIgaXMgdXNpbmcgTkVXX1ZFUlNJT05fSUQgbm93LgotCi0gICAgIEl0J3MgYWJvdXQgdGltZSwgT1NGIGhhcyB1c2VkIHRoZSBuZXcgaWQgc2luY2UgYXQgbGVhc3QgMTk5MjsKLSAgICAgSFBVWCBkaWRuJ3Qgc3RhcnQgdGlsbCBuZWFybHkgMTk5NSEuCi0gICAgCi0gICAgIFRoZSBuZXcgYXBwcm9hY2ggZXhhbWluZXMgdGhlIGVudHJ5IGZpZWxkLiAgSWYgaXQncyB6ZXJvIG9yIG5vdCA0Ci0gICAgIGJ5dGUgYWxpZ25lZCB0aGVuIGl0J3Mgbm90IGEgcHJvcGVyIGNvZGUgYWRkcmVzcyBhbmQgd2UgZ3Vlc3MgaXQncwotICAgICByZWFsbHkgdGhlIGV4ZWN1dGFibGUgZmxhZ3MuICAqLwotICBmb3VuZCA9IDA7Ci0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpID09IDApCi0JY29udGludWU7Ci0gICAgICBpZiAoYXV4X2hkcnAtPmV4ZWNfZW50cnkgPj0gc2VjdGlvbi0+dm1hCi0JICAmJiBhdXhfaGRycC0+ZXhlY19lbnRyeSA8IHNlY3Rpb24tPnZtYSArIHNlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLQlmb3VuZCA9IDE7Ci0gICAgfQotICBpZiAoYXV4X2hkcnAtPmV4ZWNfZW50cnkgPT0gMAotICAgICAgfHwgKGF1eF9oZHJwLT5leGVjX2VudHJ5ICYgMHgzKSAhPSAwCi0gICAgICB8fCAhIGZvdW5kKQotICAgIHsKLSAgICAgIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBhdXhfaGRycC0+ZXhlY19mbGFnczsKLSAgICAgIG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+ZXhlY19mbGFncyA9IGF1eF9oZHJwLT5leGVjX2VudHJ5OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBhdXhfaGRycC0+ZXhlY19lbnRyeSArIGN1cnJlbnRfb2Zmc2V0OwotICAgICAgb2JqX3NvbV9leGVjX2RhdGEgKGFiZmQpLT5leGVjX2ZsYWdzID0gYXV4X2hkcnAtPmV4ZWNfZmxhZ3M7Ci0gICAgfQotCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2hwcGEsIHBhMTApOwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IGZpbGVfaGRycC0+c3ltYm9sX3RvdGFsOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIHNhdmVkIHN5bWJvbCB0YWJsZSBhbmQgc3RyaW5nIHRhYmxlIHRvIE5VTEwuICAKLSAgICAgU2F2ZSBpbXBvcnRhbnQgb2Zmc2V0cyBhbmQgc2l6ZXMgZnJvbSB0aGUgU09NIGhlYWRlciBpbnRvCi0gICAgIHRoZSBCRkQuICAqLwotICBvYmpfc29tX3N0cmluZ3RhYiAoYWJmZCkgPSAoY2hhciAgKikgTlVMTDsKLSAgb2JqX3NvbV9zeW10YWIgKGFiZmQpID0gKHNvbV9zeW1ib2xfdHlwZSAqKSBOVUxMOwotICBvYmpfc29tX3NvcnRlZF9zeW1zIChhYmZkKSA9IE5VTEw7Ci0gIG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpID0gZmlsZV9oZHJwLT5zeW1ib2xfc3RyaW5nc19zaXplOwotICBvYmpfc29tX3N5bV9maWxlcG9zIChhYmZkKSA9IGZpbGVfaGRycC0+c3ltYm9sX2xvY2F0aW9uICsgY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fc3RyX2ZpbGVwb3MgKGFiZmQpID0gKGZpbGVfaGRycC0+c3ltYm9sX3N0cmluZ3NfbG9jYXRpb24KLQkJCQkrIGN1cnJlbnRfb2Zmc2V0KTsKLSAgb2JqX3NvbV9yZWxvY19maWxlcG9zIChhYmZkKSA9IChmaWxlX2hkcnAtPmZpeHVwX3JlcXVlc3RfbG9jYXRpb24KLQkJCQkgICsgY3VycmVudF9vZmZzZXQpOwotICBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCktPnN5c3RlbV9pZCA9IGZpbGVfaGRycC0+c3lzdGVtX2lkOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0vKiBDb252ZXJ0IGFsbCBvZiB0aGUgc3BhY2UgYW5kIHN1YnNwYWNlIGluZm8gaW50byBCRkQgc2VjdGlvbnMuICBFYWNoIHNwYWNlCi0gICBjb250YWlucyBhIG51bWJlciBvZiBzdWJzcGFjZXMsIHdoaWNoIGluIHR1cm4gZGVzY3JpYmUgdGhlIG1hcHBpbmcgYmV0d2VlbgotICAgcmVnaW9ucyBvZiB0aGUgZXhlYyBmaWxlLCBhbmQgdGhlIGFkZHJlc3Mgc3BhY2UgdGhhdCB0aGUgcHJvZ3JhbSBydW5zIGluLgotICAgQkZEIHNlY3Rpb25zIHdoaWNoIGNvcnJlc3BvbmQgdG8gc3BhY2VzIHdpbGwgb3ZlcmxhcCB0aGUgc2VjdGlvbnMgZm9yIHRoZQotICAgYXNzb2NpYXRlZCBzdWJzcGFjZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2V0dXBfc2VjdGlvbnMgKGFiZmQsIGZpbGVfaGRyLCBjdXJyZW50X29mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcjsKLSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLXsKLSAgY2hhciAqc3BhY2Vfc3RyaW5nczsKLSAgdW5zaWduZWQgaW50IHNwYWNlX2luZGV4LCBpOwotICB1bnNpZ25lZCBpbnQgdG90YWxfc3Vic3BhY2VzID0gMDsKLSAgYXNlY3Rpb24gKipzdWJzcGFjZV9zZWN0aW9ucywgKnNlY3Rpb247Ci0KLSAgLyogRmlyc3QsIHJlYWQgaW4gc3BhY2UgbmFtZXMgKi8KLQotICBzcGFjZV9zdHJpbmdzID0gYmZkX21hbGxvYyAoZmlsZV9oZHItPnNwYWNlX3N0cmluZ3Nfc2l6ZSk7Ci0gIGlmICghc3BhY2Vfc3RyaW5ncyAmJiBmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBjdXJyZW50X29mZnNldCArIGZpbGVfaGRyLT5zcGFjZV9zdHJpbmdzX2xvY2F0aW9uLCAKLSAgCQlTRUVLX1NFVCkgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoYmZkX3JlYWQgKHNwYWNlX3N0cmluZ3MsIDEsIGZpbGVfaGRyLT5zcGFjZV9zdHJpbmdzX3NpemUsIGFiZmQpCi0gICAgICAhPSBmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIExvb3Agb3ZlciBhbGwgb2YgdGhlIHNwYWNlIGRpY3Rpb25hcmllcywgYnVpbGRpbmcgdXAgc2VjdGlvbnMgKi8KLSAgZm9yIChzcGFjZV9pbmRleCA9IDA7IHNwYWNlX2luZGV4IDwgZmlsZV9oZHItPnNwYWNlX3RvdGFsOyBzcGFjZV9pbmRleCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCBzcGFjZTsKLSAgICAgIHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCBzdWJzcGFjZSwgc2F2ZV9zdWJzcGFjZTsKLSAgICAgIGludCBzdWJzcGFjZV9pbmRleDsKLSAgICAgIGFzZWN0aW9uICpzcGFjZV9hc2VjdDsKLSAgICAgIGNoYXIgKm5ld25hbWU7Ci0KLSAgICAgIC8qIFJlYWQgdGhlIHNwYWNlIGRpY3Rpb25hcnkgZWxlbWVudCAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgKGN1cnJlbnRfb2Zmc2V0ICsgZmlsZV9oZHItPnNwYWNlX2xvY2F0aW9uCi0JCSAgICAgKyBzcGFjZV9pbmRleCAqIHNpemVvZiBzcGFjZSksCi0JCSAgICBTRUVLX1NFVCkgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9yZWFkICgmc3BhY2UsIDEsIHNpemVvZiBzcGFjZSwgYWJmZCkgIT0gc2l6ZW9mIHNwYWNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBTZXR1cCB0aGUgc3BhY2UgbmFtZSBzdHJpbmcgKi8KLSAgICAgIHNwYWNlLm5hbWUubl9uYW1lID0gc3BhY2UubmFtZS5uX3N0cnggKyBzcGFjZV9zdHJpbmdzOwotCi0gICAgICAvKiBNYWtlIGEgc2VjdGlvbiBvdXQgb2YgaXQgKi8KLSAgICAgIG5ld25hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoc3BhY2UubmFtZS5uX25hbWUpICsgMSk7Ci0gICAgICBpZiAoIW5ld25hbWUpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBzdHJjcHkgKG5ld25hbWUsIHNwYWNlLm5hbWUubl9uYW1lKTsKLQkJCSAgIAotICAgICAgc3BhY2VfYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmV3bmFtZSk7Ci0gICAgICBpZiAoIXNwYWNlX2FzZWN0KQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAgaWYgKHNwYWNlLmlzX2xvYWRhYmxlID09IDApCi0Jc3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19ERUJVR0dJTkc7Ci0KLSAgICAgIC8qIFNldCB1cCBhbGwgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBzcGFjZS4gICovCi0gICAgICBpZiAoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIChzcGFjZV9hc2VjdCwgc3BhY2UuaXNfZGVmaW5lZCwKLQkJCQkJICBzcGFjZS5pc19wcml2YXRlLCBzcGFjZS5zb3J0X2tleSwKLQkJCQkJICBzcGFjZS5zcGFjZV9udW1iZXIpID09IGZhbHNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBJZiB0aGUgc3BhY2UgaGFzIG5vIHN1YnNwYWNlcywgdGhlbiB3ZSdyZSBkb25lLiAgKi8KLSAgICAgIGlmIChzcGFjZS5zdWJzcGFjZV9xdWFudGl0eSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBOb3csIHJlYWQgaW4gdGhlIGZpcnN0IHN1YnNwYWNlIGZvciB0aGlzIHNwYWNlICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAoY3VycmVudF9vZmZzZXQgKyBmaWxlX2hkci0+c3Vic3BhY2VfbG9jYXRpb24KLQkJICAgICArIHNwYWNlLnN1YnNwYWNlX2luZGV4ICogc2l6ZW9mIHN1YnNwYWNlKSwKLQkJICAgIFNFRUtfU0VUKSA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3JlYWQgKCZzdWJzcGFjZSwgMSwgc2l6ZW9mIHN1YnNwYWNlLCBhYmZkKSAhPSBzaXplb2Ygc3Vic3BhY2UpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAvKiBTZWVrIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdWJzcGFjZXMgZm9yIGxvb3AgYmVsb3cgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChjdXJyZW50X29mZnNldCArIGZpbGVfaGRyLT5zdWJzcGFjZV9sb2NhdGlvbgotCQkgICAgICsgc3BhY2Uuc3Vic3BhY2VfaW5kZXggKiBzaXplb2Ygc3Vic3BhY2UpLAotCQkgICAgU0VFS19TRVQpIDwgMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogU2V0dXAgdGhlIHN0YXJ0IGFkZHJlc3MgYW5kIGZpbGUgbG9jIGZyb20gdGhlIGZpcnN0IHN1YnNwYWNlIHJlY29yZCAqLwotICAgICAgc3BhY2VfYXNlY3QtPnZtYSA9IHN1YnNwYWNlLnN1YnNwYWNlX3N0YXJ0OwotICAgICAgc3BhY2VfYXNlY3QtPmZpbGVwb3MgPSBzdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlICsgY3VycmVudF9vZmZzZXQ7Ci0gICAgICBzcGFjZV9hc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gbG9nMiAoc3Vic3BhY2UuYWxpZ25tZW50KTsKLSAgICAgIGlmIChzcGFjZV9hc2VjdC0+YWxpZ25tZW50X3Bvd2VyID09IC0xKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBJbml0aWFsaXplIHNhdmVfc3Vic3BhY2Ugc28gd2UgY2FuIHJlbGlhYmx5IGRldGVybWluZSBpZiB0aGlzCi0JIGxvb3AgcGxhY2VkIGFueSB1c2VmdWwgdmFsdWVzIGludG8gaXQuICAqLwotICAgICAgbWVtc2V0ICgmc2F2ZV9zdWJzcGFjZSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKTsKLQotICAgICAgLyogTG9vcCBvdmVyIHRoZSByZXN0IG9mIHRoZSBzdWJzcGFjZXMsIGJ1aWxkaW5nIHVwIG1vcmUgc2VjdGlvbnMgKi8KLSAgICAgIGZvciAoc3Vic3BhY2VfaW5kZXggPSAwOyBzdWJzcGFjZV9pbmRleCA8IHNwYWNlLnN1YnNwYWNlX3F1YW50aXR5OwotCSAgIHN1YnNwYWNlX2luZGV4KyspCi0JewotCSAgYXNlY3Rpb24gKnN1YnNwYWNlX2FzZWN0OwotCi0JICAvKiBSZWFkIGluIHRoZSBuZXh0IHN1YnNwYWNlICovCi0JICBpZiAoYmZkX3JlYWQgKCZzdWJzcGFjZSwgMSwgc2l6ZW9mIHN1YnNwYWNlLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiBzdWJzcGFjZSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFNldHVwIHRoZSBzdWJzcGFjZSBuYW1lIHN0cmluZyAqLwotCSAgc3Vic3BhY2UubmFtZS5uX25hbWUgPSBzdWJzcGFjZS5uYW1lLm5fc3RyeCArIHNwYWNlX3N0cmluZ3M7Ci0KLQkgIG5ld25hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoc3Vic3BhY2UubmFtZS5uX25hbWUpICsgMSk7Ci0JICBpZiAoIW5ld25hbWUpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgc3RyY3B5IChuZXduYW1lLCBzdWJzcGFjZS5uYW1lLm5fbmFtZSk7Ci0KLQkgIC8qIE1ha2UgYSBzZWN0aW9uIG91dCBvZiB0aGlzIHN1YnNwYWNlICovCi0JICBzdWJzcGFjZV9hc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuZXduYW1lKTsKLQkgIGlmICghc3Vic3BhY2VfYXNlY3QpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBTdG9yZSBwcml2YXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZWN0aW9uLiAgKi8KLQkgIGlmIChiZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgKHN1YnNwYWNlX2FzZWN0LCBzcGFjZV9hc2VjdCwKLQkJCQkJCSBzdWJzcGFjZS5hY2Nlc3NfY29udHJvbF9iaXRzLAotCQkJCQkJIHN1YnNwYWNlLnNvcnRfa2V5LAotCQkJCQkJIHN1YnNwYWNlLnF1YWRyYW50KSA9PSBmYWxzZSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIEtlZXAgYW4gZWFzeSBtYXBwaW5nIGJldHdlZW4gc3Vic3BhY2VzIGFuZCBzZWN0aW9ucy4gCi0JICAgICBOb3RlIHdlIGRvIG5vdCBuZWNlc3NhcmlseSByZWFkIHRoZSBzdWJzcGFjZXMgaW4gdGhlCi0JICAgICBzYW1lIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoZSBvYmplY3QgZmlsZS4KLQotCSAgICAgU28gdG8gbWFrZSB0aGUgdGFyZ2V0IGluZGV4IGNvbWUgb3V0IGNvcnJlY3RseSwgd2UKLQkgICAgIHN0b3JlIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3Vic3BhY2UgaGVhZGVyIGluIHRhcmdldAotCSAgICAgaW5kZXgsIHRoZW4gc29ydCB1c2luZyB0aGUgbG9jYXRpb24gb2YgdGhlIHN1YnNwYWNlCi0JICAgICBoZWFkZXIgYXMgdGhlIGtleS4gIFRoZW4gd2UgY2FuIGFzc2lnbiBjb3JyZWN0Ci0JICAgICBzdWJzcGFjZSBpbmRpY2VzLiAgKi8KLQkgIHRvdGFsX3N1YnNwYWNlcysrOwotCSAgc3Vic3BhY2VfYXNlY3QtPnRhcmdldF9pbmRleCA9IGJmZF90ZWxsIChhYmZkKSAtIHNpemVvZiAoc3Vic3BhY2UpOwotCi0JICAvKiBTZXQgU0VDX1JFQURPTkxZIGFuZCBTRUNfQ09ERS9TRUNfREFUQSBhcyBzcGVjaWZpZWQKLQkgICAgIGJ5IHRoZSBhY2Nlc3NfY29udHJvbF9iaXRzIGluIHRoZSBzdWJzcGFjZSBoZWFkZXIuICAqLwotCSAgc3dpdGNoIChzdWJzcGFjZS5hY2Nlc3NfY29udHJvbF9iaXRzID4+IDQpCi0JICAgIHsKLQkgICAgLyogUmVhZG9ubHkgZGF0YS4gICovICAKLQkgICAgY2FzZSAweDA6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX1JFQURPTkxZOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIE5vcm1hbCBkYXRhLiAgKi8gIAotCSAgICBjYXNlIDB4MToKLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0RBVEE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogUmVhZG9ubHkgY29kZSBhbmQgdGhlIGdhdGV3YXlzLgotCSAgICAgICBHYXRld2F5cyBoYXZlIG90aGVyIGF0dHJpYnV0ZXMgd2hpY2ggZG8gbm90IG1hcAotCSAgICAgICBpbnRvIGFueXRoaW5nIEJGRCBrbm93cyBhYm91dC4gICovCi0JICAgIGNhc2UgMHgyOgotCSAgICBjYXNlIDB4NDoKLQkgICAgY2FzZSAweDU6Ci0JICAgIGNhc2UgMHg2OgotCSAgICBjYXNlIDB4NzoKLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfUkVBRE9OTFk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogZHluYW1pYyAod3JpdGFibGUpIGNvZGUuICAqLwotCSAgICBjYXNlIDB4MzoKLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIAotCSAgaWYgKHN1YnNwYWNlLmR1cF9jb21tb24gfHwgc3Vic3BhY2UuaXNfY29tbW9uKSAKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0JICBlbHNlIGlmIChzdWJzcGFjZS5zdWJzcGFjZV9sZW5ndGggPiAwKQotCSAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQotCSAgaWYgKHN1YnNwYWNlLmlzX2xvYWRhYmxlKQotCSAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0JICBlbHNlCi0JICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCi0JICBpZiAoc3Vic3BhY2UuY29kZV9vbmx5KQotCSAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0KLQkgIC8qIEJvdGggZmlsZV9sb2NfaW5pdF92YWx1ZSBhbmQgaW5pdGlhbGl6YXRpb25fbGVuZ3RoIHdpbGwKLQkgICAgIGJlIHplcm8gZm9yIGEgQlNTIGxpa2Ugc3Vic3BhY2UuICAqLwotCSAgaWYgKHN1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUgPT0gMAotCSAgICAgICYmIHN1YnNwYWNlLmluaXRpYWxpemF0aW9uX2xlbmd0aCA9PSAwKQotCSAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgJj0gfihTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyk7Ci0KLQkgIC8qIFRoaXMgc3Vic3BhY2UgaGFzIHJlbG9jYXRpb25zLgotCSAgICAgVGhlIGZpeHVwX3JlcXVlc3RfcXVhbnRpdHkgaXMgYSBieXRlIGNvdW50IGZvciB0aGUgbnVtYmVyIG9mCi0JICAgICBlbnRyaWVzIGluIHRoZSByZWxvY2F0aW9uIHN0cmVhbTsgaXQgaXMgbm90IHRoZSBhY3R1YWwgbnVtYmVyCi0JICAgICBvZiByZWxvY2F0aW9ucyBpbiB0aGUgc3Vic3BhY2UuICAqLwotCSAgaWYgKHN1YnNwYWNlLmZpeHVwX3JlcXVlc3RfcXVhbnRpdHkgIT0gMCkKLQkgICAgewotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPnJlbF9maWxlcG9zID0gc3Vic3BhY2UuZml4dXBfcmVxdWVzdF9pbmRleDsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzcGFjZV9hc2VjdCktPnJlbG9jX3NpemUKLQkJPSBzdWJzcGFjZS5maXh1cF9yZXF1ZXN0X3F1YW50aXR5OwotCSAgICAgIC8qIFdlIGNhbiBub3QgZGV0ZXJtaW5lIHRoaXMgeWV0LiAgV2hlbiB3ZSByZWFkIGluIHRoZSAKLQkJIHJlbG9jYXRpb24gdGFibGUgdGhlIGNvcnJlY3QgdmFsdWUgd2lsbCBiZSBmaWxsZWQgaW4uICAqLwotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5yZWxvY19jb3VudCA9IC0xOwotCSAgICB9Ci0KLQkgIC8qIFVwZGF0ZSBzYXZlX3N1YnNwYWNlIGlmIGFwcHJvcHJpYXRlLiAgKi8KLQkgIGlmIChzdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlID4gc2F2ZV9zdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlKQotCSAgICBzYXZlX3N1YnNwYWNlID0gc3Vic3BhY2U7Ci0KLQkgIHN1YnNwYWNlX2FzZWN0LT52bWEgPSBzdWJzcGFjZS5zdWJzcGFjZV9zdGFydDsKLQkgIHN1YnNwYWNlX2FzZWN0LT5fY29va2VkX3NpemUgPSBzdWJzcGFjZS5zdWJzcGFjZV9sZW5ndGg7Ci0JICBzdWJzcGFjZV9hc2VjdC0+X3Jhd19zaXplID0gc3Vic3BhY2Uuc3Vic3BhY2VfbGVuZ3RoOwotCSAgc3Vic3BhY2VfYXNlY3QtPmZpbGVwb3MgPSAoc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZQotCQkJCSAgICAgKyBjdXJyZW50X29mZnNldCk7Ci0JICBzdWJzcGFjZV9hc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gbG9nMiAoc3Vic3BhY2UuYWxpZ25tZW50KTsKLQkgIGlmIChzdWJzcGFjZV9hc2VjdC0+YWxpZ25tZW50X3Bvd2VyID09IC0xKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBmb3IgYSAubyB3aGljaCBkZWZpbmVzIHN5bWJvbHMgaW4gb3RoZXJ3aXNlCi0gICAgICAgICBlbXB0eSBzdWJzcGFjZXMuICAqLwotICAgICAgaWYgKCFzYXZlX3N1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUpCi0JewotCSAgc3BhY2VfYXNlY3QtPl9jb29rZWRfc2l6ZSA9IDA7Ci0JICBzcGFjZV9hc2VjdC0+X3Jhd19zaXplID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogU2V0dXAgdGhlIHNpemVzIGZvciB0aGUgc3BhY2Ugc2VjdGlvbiBiYXNlZCB1cG9uIHRoZSBpbmZvIGluIHRoZQotCSAgICAgbGFzdCBzdWJzcGFjZSBvZiB0aGUgc3BhY2UuICAqLwotCSAgc3BhY2VfYXNlY3QtPl9jb29rZWRfc2l6ZSA9IChzYXZlX3N1YnNwYWNlLnN1YnNwYWNlX3N0YXJ0Ci0JCQkJICAgICAgIC0gc3BhY2VfYXNlY3QtPnZtYQotCQkJCSAgICAgICArIHNhdmVfc3Vic3BhY2Uuc3Vic3BhY2VfbGVuZ3RoKTsKLQkgIHNwYWNlX2FzZWN0LT5fcmF3X3NpemUgPSAoc2F2ZV9zdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlCi0JCQkJICAgIC0gc3BhY2VfYXNlY3QtPmZpbGVwb3MKLQkJCQkgICAgKyBzYXZlX3N1YnNwYWNlLmluaXRpYWxpemF0aW9uX2xlbmd0aCk7Ci0JfQotICAgIH0KLSAgLyogTm93IHRoYXQgd2UndmUgcmVhZCBpbiBhbGwgdGhlIHN1YnNwYWNlIHJlY29yZHMsIHdlIG5lZWQgdG8gYXNzaWduCi0gICAgIGEgdGFyZ2V0IGluZGV4IHRvIGVhY2ggc3Vic3BhY2UuICAqLwotICBzdWJzcGFjZV9zZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAodG90YWxfc3Vic3BhY2VzCi0JCQkJCQkqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBpZiAoc3Vic3BhY2Vfc2VjdGlvbnMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBmb3IgKGkgPSAwLCBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghc29tX2lzX3N1YnNwYWNlIChzZWN0aW9uKSkKLQljb250aW51ZTsKLQotICAgICAgc3Vic3BhY2Vfc2VjdGlvbnNbaV0gPSBzZWN0aW9uOwotICAgICAgaSsrOwotICAgIH0KLSAgcXNvcnQgKHN1YnNwYWNlX3NlY3Rpb25zLCB0b3RhbF9zdWJzcGFjZXMsCi0JIHNpemVvZiAoYXNlY3Rpb24gKiksIGNvbXBhcmVfc3Vic3BhY2VzKTsKLSAgCi0gIC8qIHN1YnNwYWNlX3NlY3Rpb25zIGlzIG5vdyBzb3J0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBzdWJzcGFjZXMKLSAgICAgYXBwZWFyIGluIHRoZSBvYmplY3QgZmlsZS4gIEFzc2lnbiBhbiBpbmRleCB0byBlYWNoIG9uZSBub3cuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgdG90YWxfc3Vic3BhY2VzOyBpKyspCi0gICAgc3Vic3BhY2Vfc2VjdGlvbnNbaV0tPnRhcmdldF9pbmRleCA9IGk7Ci0KLSAgaWYgKHNwYWNlX3N0cmluZ3MgIT0gTlVMTCkKLSAgICBmcmVlIChzcGFjZV9zdHJpbmdzKTsKLQotICBpZiAoc3Vic3BhY2Vfc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzdWJzcGFjZV9zZWN0aW9ucyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzcGFjZV9zdHJpbmdzICE9IE5VTEwpCi0gICAgZnJlZSAoc3BhY2Vfc3RyaW5ncyk7Ci0KLSAgaWYgKHN1YnNwYWNlX3NlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc3Vic3BhY2Vfc2VjdGlvbnMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlYWQgaW4gYSBTT00gb2JqZWN0IGFuZCBtYWtlIGl0IGludG8gYSBCRkQuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1zb21fb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGhlYWRlciBmaWxlX2hkcjsKLSAgc3RydWN0IHNvbV9leGVjX2F1eGhkciBhdXhfaGRyOwotICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0ID0gMDsKLSAgc3RydWN0IGxzdF9oZWFkZXIgbHN0X2hlYWRlcjsKLSAgc3RydWN0IHNvbV9lbnRyeSBzb21fZW50cnk7Ci0jZGVmaW5lIEVOVFJZX1NJWkUgc2l6ZW9mKHN0cnVjdCBzb21fZW50cnkpCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGZpbGVfaGRyLCAxLCBGSUxFX0hEUl9TSVpFLCBhYmZkKSAhPSBGSUxFX0hEUl9TSVpFKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoIV9QQV9SSVNDX0lEIChmaWxlX2hkci5zeXN0ZW1faWQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHN3aXRjaCAoZmlsZV9oZHIuYV9tYWdpYykKLSAgICB7Ci0gICAgY2FzZSBSRUxPQ19NQUdJQzoKLSAgICBjYXNlIEVYRUNfTUFHSUM6Ci0gICAgY2FzZSBTSEFSRV9NQUdJQzoKLSAgICBjYXNlIERFTUFORF9NQUdJQzoKLSNpZmRlZiBETF9NQUdJQwotICAgIGNhc2UgRExfTUFHSUM6Ci0jZW5kaWYKLSNpZmRlZiBTSExfTUFHSUMKLSAgICBjYXNlIFNITF9NQUdJQzoKLSNlbmRpZgotI2lmZGVmIFNIQVJFRF9NQUdJQ19DTlgKLSAgICBjYXNlIFNIQVJFRF9NQUdJQ19DTlg6Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgRVhFQ0xJQk1BR0lDCi0gICAgY2FzZSBFWEVDTElCTUFHSUM6Ci0gICAgICAvKiBSZWFkIHRoZSBsc3QgaGVhZGVyIGFuZCBkZXRlcm1pbmUgd2hlcmUgdGhlIFNPTSBkaXJlY3RvcnkgYmVnaW5zICovCi0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X2hlYWRlciwgMSwgU0xTVEhEUiwgYWJmZCkgIT0gU0xTVEhEUikKLSAgICAgICAgewotICAgICAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgLyogUG9zaXRpb24gdG8gYW5kIHJlYWQgdGhlIGZpcnN0IGRpcmVjdG9yeSBlbnRyeSAqLwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9oZWFkZXIuZGlyX2xvYywgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHNvbV9lbnRyeSwgMSwgRU5UUllfU0laRSwgYWJmZCkgIT0gRU5UUllfU0laRSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgLyogTm93IHBvc2l0aW9uIHRvIHRoZSBmaXJzdCBTT00gKi8KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzb21fZW50cnkubG9jYXRpb24sIFNFRUtfU0VUKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIGN1cnJlbnRfb2Zmc2V0ID0gc29tX2VudHJ5LmxvY2F0aW9uOwotCi0gICAgICAvKiBBbmQgZmluYWxseSwgcmUtcmVhZCB0aGUgc29tIGhlYWRlciAqLwotCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgZmlsZV9oZHIsIDEsIEZJTEVfSERSX1NJWkUsIGFiZmQpICE9IEZJTEVfSERSX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGZpbGVfaGRyLnZlcnNpb25faWQgIT0gVkVSU0lPTl9JRAotICAgICAgJiYgZmlsZV9oZHIudmVyc2lvbl9pZCAhPSBORVdfVkVSU0lPTl9JRCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBJZiB0aGUgYXV4X2hlYWRlcl9zaXplIGZpZWxkIGluIHRoZSBmaWxlIGhlYWRlciBpcyB6ZXJvLCB0aGVuIHRoaXMKLSAgICAgb2JqZWN0IGlzIGFuIGluY29tcGxldGUgZXhlY3V0YWJsZSAoYSAubyBmaWxlKS4gIERvIG5vdCB0cnkgdG8gcmVhZAotICAgICBhIG5vbi1leGlzdGFudCBhdXhpbGlhcnkgaGVhZGVyLiAgKi8KLSAgbWVtc2V0ICgmYXV4X2hkciwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyKSk7Ci0gIGlmIChmaWxlX2hkci5hdXhfaGVhZGVyX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgYXV4X2hkciwgMSwgQVVYX0hEUl9TSVpFLCBhYmZkKSAhPSBBVVhfSERSX1NJWkUpCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0KLSAgaWYgKCFzZXR1cF9zZWN0aW9ucyAoYWJmZCwgJmZpbGVfaGRyLCBjdXJyZW50X29mZnNldCkpCi0gICAgewotICAgICAgLyogc2V0dXBfc2VjdGlvbnMgZG9lcyBub3QgYnViYmxlIHVwIGEgYmZkIGVycm9yIGNvZGUuICAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogVGhpcyBhcHBlYXJzIHRvIGJlIGEgdmFsaWQgU09NIG9iamVjdC4gIERvIHNvbWUgaW5pdGlhbGl6YXRpb24uICAqLwotICByZXR1cm4gc29tX29iamVjdF9zZXR1cCAoYWJmZCwgJmZpbGVfaGRyLCAmYXV4X2hkciwgY3VycmVudF9vZmZzZXQpOwotfQotCi0vKiBDcmVhdGUgYSBTT00gb2JqZWN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCBiYWNrZW5kIGluZm9ybWF0aW9uLiAgKi8KLSAgYWJmZC0+dGRhdGEuc29tX2RhdGEgPSAoc3RydWN0IHNvbV9kYXRhX3N0cnVjdCAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNvbV9kYXRhX3N0cnVjdCkpOwotICBpZiAoYWJmZC0+dGRhdGEuc29tX2RhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbml0aWFsaXplIHNvbWUgaW5mb3JtYXRpb24gaW4gdGhlIGZpbGUgaGVhZGVyLiAgVGhpcyByb3V0aW5lIG1ha2VzCi0gICBub3QgYXR0ZW1wdCBhdCBkb2luZyB0aGUgcmlnaHQgdGhpbmcgZm9yIGEgZnVsbCBleGVjdXRhYmxlOyBpdAotICAgaXMgb25seSBtZWFudCB0byBoYW5kbGUgcmVsb2NhdGFibGUgb2JqZWN0cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fcHJlcF9oZWFkZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBoZWFkZXIgKmZpbGVfaGRyOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICAvKiBNYWtlIGFuZCBhdHRhY2ggYSBmaWxlIGhlYWRlciB0byB0aGUgQkZELiAgKi8KLSAgZmlsZV9oZHIgPSAoc3RydWN0IGhlYWRlciAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBoZWFkZXIpKTsKLSAgaWYgKGZpbGVfaGRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKSA9IGZpbGVfaGRyOwotCi0gIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKLSAgICB7Ci0KLSAgICAgIC8qIE1ha2UgYW5kIGF0dGFjaCBhbiBleGVjIGhlYWRlciB0byB0aGUgQkZELiAgKi8KLSAgICAgIG9ial9zb21fZXhlY19oZHIgKGFiZmQpID0gKHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKikKLQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19hdXhoZHIpKTsKLSAgICAgIGlmIChvYmpfc29tX2V4ZWNfaGRyIChhYmZkKSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkKLQlmaWxlX2hkci0+YV9tYWdpYyA9IERFTUFORF9NQUdJQzsKLSAgICAgIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgV1BfVEVYVCkKLQlmaWxlX2hkci0+YV9tYWdpYyA9IFNIQVJFX01BR0lDOwotI2lmZGVmIFNITF9NQUdJQwotICAgICAgZWxzZSBpZiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKQotCWZpbGVfaGRyLT5hX21hZ2ljID0gU0hMX01BR0lDOwotI2VuZGlmCi0gICAgICBlbHNlCi0JZmlsZV9oZHItPmFfbWFnaWMgPSBFWEVDX01BR0lDOwotICAgIH0KLSAgZWxzZQotICAgIGZpbGVfaGRyLT5hX21hZ2ljID0gUkVMT0NfTUFHSUM7Ci0KLSAgLyogT25seSBuZXcgZm9ybWF0IFNPTSBpcyBzdXBwb3J0ZWQuICAqLwotICBmaWxlX2hkci0+dmVyc2lvbl9pZCA9IE5FV19WRVJTSU9OX0lEOwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgb3B0aW9uYWwsIGFuZCBlbWJlZGRpbmcgdGltZXN0YW1wcyBpcyBub3QgYWx3YXlzCi0gICAgIGEgd2lzZSB0aGluZyB0byBkbywgaXQgbWFrZXMgY29tcGFyaW5nIG9iamVjdHMgZHVyaW5nIGEgbXVsdGktc3RhZ2UKLSAgICAgYm9vdHN0cmFwIGRpZmZpY3VsdC4gICovCi0gIGZpbGVfaGRyLT5maWxlX3RpbWUuc2VjcyA9IDA7Ci0gIGZpbGVfaGRyLT5maWxlX3RpbWUubmFub3NlY3MgPSAwOyAKLQotICBmaWxlX2hkci0+ZW50cnlfc3BhY2UgPSAwOwotICBmaWxlX2hkci0+ZW50cnlfc3Vic3BhY2UgPSAwOwotICBmaWxlX2hkci0+ZW50cnlfb2Zmc2V0ID0gMDsKLSAgZmlsZV9oZHItPnByZXN1bWVkX2RwID0gMDsKLQotICAvKiBOb3cgaXRlcmF0ZSBvdmVyIHRoZSBzZWN0aW9ucyB0cmFuc2xhdGluZyBpbmZvcm1hdGlvbiBmcm9tCi0gICAgIEJGRCBzZWN0aW9ucyB0byBTT00gc3BhY2VzL3N1YnNwYWNlcy4gICovCi0KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgLyogSWdub3JlIGFueXRoaW5nIHdoaWNoIGhhcyBub3QgYmVlbiBtYXJrZWQgYXMgYSBzcGFjZSBvcgotCSBzdWJzcGFjZS4gICovCi0gICAgICBpZiAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikgJiYgIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JY29udGludWU7Ci0gICAgICAKLSAgICAgIGlmIChzb21faXNfc3BhY2UgKHNlY3Rpb24pKQotCXsKLQkgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgc3BhY2UgZGljdGlvbmFyeS4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdAotCSAgICA9IChzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgKikKLQkgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCkpOwotCSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0ID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFNldCBzcGFjZSBhdHRyaWJ1dGVzLiAgTm90ZSBtb3N0IGF0dHJpYnV0ZXMgb2YgU09NIHNwYWNlcwotCSAgICAgYXJlIHNldCBiYXNlZCBvbiB0aGUgc3Vic3BhY2VzIGl0IGNvbnRhaW5zLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5sb2FkZXJfZml4X2luZGV4ID0gLTE7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aW5pdF9wb2ludGVyX2luZGV4ID0gLTE7Ci0KLQkgIC8qIFNldCBtb3JlIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIHN0dWZmZWQgYXdheSBpbiBwcml2YXRlIGRhdGEuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnNvcnRfa2V5ID0gCi0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNvcnRfa2V5OwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPmlzX2RlZmluZWQgPSAKLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+aXNfZGVmaW5lZDsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pc19wcml2YXRlID0gCi0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmlzX3ByaXZhdGU7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3BhY2VfbnVtYmVyID0KLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+c3BhY2VfbnVtYmVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QKLQkgICAgPSAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICopCi0JICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKTsKLQkgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFNldCBzdWJzcGFjZSBhdHRyaWJ1dGVzLiAgQmFzaWMgc3R1ZmYgaXMgZG9uZSBoZXJlLCBhZGRpdGlvbmFsCi0JICAgICBhdHRyaWJ1dGVzIGFyZSBmaWxsZWQgaW4gbGF0ZXIgYXMgbW9yZSBpbmZvcm1hdGlvbiBiZWNvbWVzCi0JICAgICBhdmFpbGFibGUuICAqLwotCSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0lTX0NPTU1PTikKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5kdXBfY29tbW9uID0gMTsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+aXNfY29tbW9uID0gMTsKLQkgICAgfQotCi0JICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpCi0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5pc19sb2FkYWJsZSA9IDE7Ci0KLQkgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Y29kZV9vbmx5ID0gMTsKLQotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPnN1YnNwYWNlX3N0YXJ0ID0gCi0JICAgIHNlY3Rpb24tPnZtYTsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zdWJzcGFjZV9sZW5ndGggPQotCSAgICBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5pbml0aWFsaXphdGlvbl9sZW5ndGggPQotCSAgICBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5hbGlnbm1lbnQgPSAKLQkgICAgMSA8PCBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXI7Ci0KLQkgIC8qIFNldCBtb3JlIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIHN0dWZmZWQgYXdheSBpbiBwcml2YXRlIGRhdGEuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPnNvcnRfa2V5ID0KLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+c29ydF9rZXk7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+YWNjZXNzX2NvbnRyb2xfYml0cyA9Ci0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmFjY2Vzc19jb250cm9sX2JpdHM7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+cXVhZHJhbnQgPQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5xdWFkcmFudDsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNlY3Rpb24gaXMgYSBTT00gc3BhY2UsIGZhbHNlIG90aGVyd2lzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21faXNfc3BhY2UgKHNlY3Rpb24pCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICAvKiBJZiBubyBjb3B5IGRhdGEgaXMgYXZhaWxhYmxlLCB0aGVuIGl0J3MgbmVpdGhlciBhIHNwYWNlIG5vciBhCi0gICAgIHN1YnNwYWNlLiAgKi8KLSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgdGhlIGNvbnRhaW5pbmcgc3BhY2UgaXNuJ3QgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIHNlY3Rpb24sCi0gICAgIHRoZW4gdGhpcyBpc24ndCBhIHNwYWNlLiAgKi8KLSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lciAhPSBzZWN0aW9uCi0gICAgICAmJiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyLT5vdXRwdXRfc2VjdGlvbgotCSAgIT0gc2VjdGlvbikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE9LLiAgTXVzdCBiZSBhIHNwYWNlLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzZWN0aW9uIGlzIGEgU09NIHN1YnNwYWNlLCBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2lzX3N1YnNwYWNlIChzZWN0aW9uKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgLyogSWYgbm8gY29weSBkYXRhIGlzIGF2YWlsYWJsZSwgdGhlbiBpdCdzIG5laXRoZXIgYSBzcGFjZSBub3IgYQotICAgICBzdWJzcGFjZS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoZSBjb250YWluaW5nIHNwYWNlIGlzIHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBzZWN0aW9uLAotICAgICB0aGVuIHRoaXMgaXNuJ3QgYSBzdWJzcGFjZS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXIgPT0gc2VjdGlvbgotICAgICAgfHwgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lci0+b3V0cHV0X3NlY3Rpb24KLQkgID09IHNlY3Rpb24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBPSy4gIE11c3QgYmUgYSBzdWJzcGFjZS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3BhY2UgY29udGFpbmlucyB0aGUgZ2l2ZW4gc3Vic3BhY2UuICBJdAotICAgaXMgc2FmZSB0byBhc3N1bWUgc3BhY2UgcmVhbGx5IGlzIGEgc3BhY2UsIGFuZCBzdWJzcGFjZSByZWFsbHkKLSAgIGlzIGEgc3Vic3BhY2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2lzX2NvbnRhaW5lciAoc3BhY2UsIHN1YnNwYWNlKQotICAgICBhc2VjdGlvbiAqc3BhY2UsICpzdWJzcGFjZTsKLXsKLSAgcmV0dXJuIChzb21fc2VjdGlvbl9kYXRhIChzdWJzcGFjZSktPmNvcHlfZGF0YS0+Y29udGFpbmVyID09IHNwYWNlCi0JICB8fCAoc29tX3NlY3Rpb25fZGF0YSAoc3Vic3BhY2UpLT5jb3B5X2RhdGEtPmNvbnRhaW5lci0+b3V0cHV0X3NlY3Rpb24KLQkgICAgICA9PSBzcGFjZSkpOwotfQotCi0vKiBDb3VudCBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BhY2VzIGF0dGFjaGVkIHRvIHRoZSBnaXZlbiBCRkQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotc29tX2NvdW50X3NwYWNlcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgY291bnQgPSAwOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLSAgICAgIGNvdW50ICs9IHNvbV9pc19zcGFjZSAoc2VjdGlvbik7Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKiBDb3VudCB0aGUgbnVtYmVyIG9mIHN1YnNwYWNlcyBhdHRhY2hlZCB0byB0aGUgZ2l2ZW4gQkZELiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXNvbV9jb3VudF9zdWJzcGFjZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGNvdW50ID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgY291bnQgKz0gc29tX2lzX3N1YnNwYWNlIChzZWN0aW9uKTsKLQotICByZXR1cm4gY291bnQ7Ci19Ci0KLS8qIFJldHVybiAtMSwgMCwgMSBpbmRpY2F0aW5nIHRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiBzeW0xIGFuZCBzeW0yLgotCi0gICBXZSBkZXNpcmUgc3ltYm9scyB0byBiZSBvcmRlcmVkIHN0YXJ0aW5nIHdpdGggdGhlIHN5bWJvbCB3aXRoIHRoZQotICAgaGlnaGVzdCByZWxvY2F0aW9uIGNvdW50IGRvd24gdG8gdGhlIHN5bWJvbCB3aXRoIHRoZSBsb3dlc3QgcmVsb2NhdGlvbgotICAgY291bnQuICBEb2luZyBzbyBjb21wYWN0cyB0aGUgcmVsb2NhdGlvbiBzdHJlYW0uICAqLwotCi1zdGF0aWMgaW50Ci1jb21wYXJlX3N5bXMgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLQotewotICBhc3ltYm9sICoqc3ltMSA9IChhc3ltYm9sICoqKSBhcmcxOwotICBhc3ltYm9sICoqc3ltMiA9IChhc3ltYm9sICoqKSBhcmcyOwotICB1bnNpZ25lZCBpbnQgY291bnQxLCBjb3VudDI7Ci0gIAotICAvKiBHZXQgcmVsb2NhdGlvbiBjb3VudCBmb3IgZWFjaCBzeW1ib2wuICBOb3RlIHRoYXQgdGhlIGNvdW50Ci0gICAgIGlzIHN0b3JlZCBpbiB0aGUgdWRhdGEgcG9pbnRlciBmb3Igc2VjdGlvbiBzeW1ib2xzISAgKi8KLSAgaWYgKCgqc3ltMSktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotICAgIGNvdW50MSA9ICgqc3ltMSktPnVkYXRhLmk7Ci0gIGVsc2UKLSAgICBjb3VudDEgPSBzb21fc3ltYm9sX2RhdGEgKCpzeW0xKS0+cmVsb2NfY291bnQ7Ci0KLSAgaWYgKCgqc3ltMiktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotICAgIGNvdW50MiA9ICgqc3ltMiktPnVkYXRhLmk7Ci0gIGVsc2UKLSAgICBjb3VudDIgPSBzb21fc3ltYm9sX2RhdGEgKCpzeW0yKS0+cmVsb2NfY291bnQ7Ci0KLSAgLyogUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZS4gICovCi0gIGlmIChjb3VudDEgPCBjb3VudDIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKGNvdW50MSA+IGNvdW50MikKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gLTEsIDAsIDEgaW5kaWNhdGluZyB0aGUgcmVsYXRpdmUgb3JkZXJpbmcgb2Ygc3Vic3BhY2UxCi0gICBhbmQgc3Vic3BhY2UuICAqLwotCi1zdGF0aWMgaW50Ci1jb21wYXJlX3N1YnNwYWNlcyAoYXJnMSwgYXJnMikKLSAgICAgY29uc3QgUFRSIGFyZzE7Ci0gICAgIGNvbnN0IFBUUiBhcmcyOwotCi17Ci0gIGFzZWN0aW9uICoqc3Vic3BhY2UxID0gKGFzZWN0aW9uICoqKSBhcmcxOwotICBhc2VjdGlvbiAqKnN1YnNwYWNlMiA9IChhc2VjdGlvbiAqKikgYXJnMjsKLSAgdW5zaWduZWQgaW50IGNvdW50MSwgY291bnQyOwotICAKLSAgaWYgKCgqc3Vic3BhY2UxKS0+dGFyZ2V0X2luZGV4IDwgKCpzdWJzcGFjZTIpLT50YXJnZXRfaW5kZXgpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmICgoKnN1YnNwYWNlMiktPnRhcmdldF9pbmRleCA8ICgqc3Vic3BhY2UxKS0+dGFyZ2V0X2luZGV4KQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFBlcmZvcm0gdmFyaW91cyB3b3JrIGluIHByZXBhcmF0aW9uIGZvciBlbWl0dGluZyB0aGUgZml4dXAgc3RyZWFtLiAgKi8KLQotc3RhdGljIHZvaWQKLXNvbV9wcmVwX2Zvcl9maXh1cHMgKGFiZmQsIHN5bXMsIG51bV9zeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICB1bnNpZ25lZCBsb25nIG51bV9zeW1zOwotewotICBpbnQgaTsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGFzeW1ib2wgKipzb3J0ZWRfc3ltczsKLQotICAvKiBNb3N0IFNPTSByZWxvY2F0aW9ucyBpbnZvbHZpbmcgYSBzeW1ib2wgaGF2ZSBhIGxlbmd0aCB3aGljaCBpcwotICAgICBkZXBlbmRlbnQgb24gdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wuICBTbyBzeW1ib2xzIHdoaWNoIGFyZQotICAgICB1c2VkIG9mdGVuIGluIHJlbG9jYXRpb25zIHNob3VsZCBoYXZlIGEgc21hbGwgaW5kZXguICAqLwotCi0gIC8qIEZpcnN0IGluaXRpYWxpemUgdGhlIGNvdW50ZXJzIGZvciBlYWNoIHN5bWJvbC4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltczsgaSsrKQotICAgIHsKLSAgICAgIC8qIEhhbmRsZSBhIHNlY3Rpb24gc3ltYm9sOyB0aGVzZSBoYXZlIG5vIHBvaW50ZXJzIGJhY2sgdG8gdGhlCi0JIFNPTSBzeW1ib2wgaW5mby4gIFNvIHdlIGp1c3QgdXNlIHRoZSB1ZGF0YSBmaWVsZCB0byBob2xkIHRoZQotCSByZWxvY2F0aW9uIGNvdW50LiAgKi8KLSAgICAgIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bXNbaV0pID09IE5VTEwKLQkgIHx8IHN5bXNbaV0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCXsKLQkgIHN5bXNbaV0tPmZsYWdzIHw9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIHN5bXNbaV0tPnVkYXRhLmkgPSAwOwotCX0KLSAgICAgIGVsc2UKLQlzb21fc3ltYm9sX2RhdGEgKHN5bXNbaV0pLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHRoZSBjb3VudGVycyBhcmUgaW5pdGlhbGl6ZWQsIG1ha2UgYSB3ZWlnaHRlZCBjb3VudAotICAgICBvZiBob3cgb2Z0ZW4gYSBnaXZlbiBzeW1ib2wgaXMgdXNlZCBpbiBhIHJlbG9jYXRpb24uICAqLwotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgLyogRG9lcyB0aGlzIHNlY3Rpb24gaGF2ZSBhbnkgcmVsb2NhdGlvbnM/ICAqLwotICAgICAgaWYgKHNlY3Rpb24tPnJlbG9jX2NvdW50IDw9IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHJlbG9jYXRpb24gZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBmb3IgKGkgPSAxOyBpIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGkrKykKLQl7Ci0JICBhcmVsZW50ICpyZWxvYyA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uW2ldOwotCSAgaW50IHNjYWxlOwotCi0JICAvKiBBIHJlbG9jYXRpb24gYWdhaW5zdCBhIHN5bWJvbCBpbiB0aGUgKkFCUyogc2VjdGlvbiByZWFsbHkKLQkgICAgIGRvZXMgbm90IGhhdmUgYSBzeW1ib2wuICBMaWtld2lzZSBpZiB0aGUgc3ltYm9sIGlzbid0IGFzc29jaWF0ZWQKLQkgICAgIHdpdGggYW55IHNlY3Rpb24uICAqLwotCSAgaWYgKHJlbG9jLT5zeW1fcHRyX3B0ciA9PSBOVUxMCi0JICAgICAgfHwgYmZkX2lzX2Fic19zZWN0aW9uICgoKnJlbG9jLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogU2NhbGluZyB0byBlbmNvdXJhZ2Ugc3ltYm9scyBpbnZvbHZlZCBpbiBSX0RQX1JFTEFUSVZFIAotCSAgICAgYW5kIFJfQ09ERV9PTkVfU1lNQk9MIHJlbG9jYXRpb25zIHRvIGNvbWUgZmlyc3QuICBUaGVzZQotCSAgICAgdHdvIHJlbG9jYXRpb25zIGhhdmUgc2luZ2xlIGJ5dGUgdmVyc2lvbnMgaWYgdGhlIHN5bWJvbAotCSAgICAgaW5kZXggaXMgdmVyeSBzbWFsbC4gICovCi0JICBpZiAocmVsb2MtPmhvd3RvLT50eXBlID09IFJfRFBfUkVMQVRJVkUKLQkgICAgICB8fCByZWxvYy0+aG93dG8tPnR5cGUgPT0gUl9DT0RFX09ORV9TWU1CT0wpCi0JICAgIHNjYWxlID0gMjsKLQkgIGVsc2UKLQkgICAgc2NhbGUgPSAxOwotCi0JICAvKiBIYW5kbGUgc2VjdGlvbiBzeW1ib2xzIGJ5IHN0b3JpbmcgdGhlIGNvdW50IGluIHRoZSB1ZGF0YQotCSAgICAgZmllbGQuICBJdCB3aWxsIG5vdCBiZSB1c2VkIGFuZCB0aGUgY291bnQgaXMgdmVyeSBpbXBvcnRhbnQKLQkgICAgIGZvciB0aGVzZSBzeW1ib2xzLiAgKi8KLQkgIGlmICgoKnJlbG9jLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCSAgICB7Ci0JICAgICAgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLT51ZGF0YS5pID0KLQkJKCpyZWxvYy0+c3ltX3B0cl9wdHIpLT51ZGF0YS5pICsgc2NhbGU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogQSBub3JtYWwgc3ltYm9sLiAgSW5jcmVtZW50IHRoZSBjb3VudC4gICovCi0JICBzb21fc3ltYm9sX2RhdGEgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLT5yZWxvY19jb3VudCArPSBzY2FsZTsKLQl9Ci0gICAgfQotCi0gIC8qIFNvcnQgYSBjb3B5IG9mIHRoZSBzeW1ib2wgdGFibGUsIHJhdGhlciB0aGFuIHRoZSBjYW5vbmljYWwKLSAgICAgb3V0cHV0IHN5bWJvbCB0YWJsZS4gICovCi0gIHNvcnRlZF9zeW1zID0gKGFzeW1ib2wgKiopIGJmZF96YWxsb2MgKGFiZmQsIG51bV9zeW1zICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgbWVtY3B5IChzb3J0ZWRfc3ltcywgc3ltcywgbnVtX3N5bXMgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBxc29ydCAoc29ydGVkX3N5bXMsIG51bV9zeW1zLCBzaXplb2YgKGFzeW1ib2wgKiksIGNvbXBhcmVfc3ltcyk7Ci0gIG9ial9zb21fc29ydGVkX3N5bXMgKGFiZmQpID0gc29ydGVkX3N5bXM7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgc3ltYm9sIGluZGV4ZXMsIHRoZXkgd2lsbCBiZSBuZWVkZWQgYnkgdGhlIHJlbG9jYXRpb24KLSAgICAgY29kZS4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltczsgaSsrKQotICAgIHsKLSAgICAgIC8qIEEgc2VjdGlvbiBzeW1ib2wuICBBZ2FpbiwgdGhlcmUgaXMgbm8gcG9pbnRlciB0byBiYWNrZW5kIHN5bWJvbAotCSBpbmZvcm1hdGlvbiwgc28gd2UgcmV1c2UgdGhlIHVkYXRhIGZpZWxkIGFnYWluLiAgKi8KLSAgICAgIGlmIChzb3J0ZWRfc3ltc1tpXS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0Jc29ydGVkX3N5bXNbaV0tPnVkYXRhLmkgPSBpOwotICAgICAgZWxzZQotICAgICAgICBzb21fc3ltYm9sX2RhdGEgKHNvcnRlZF9zeW1zW2ldKS0+aW5kZXggPSBpOwotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLXNvbV93cml0ZV9maXh1cHMgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCB0b3RhbF9yZWxvY19zaXplcCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotICAgICB1bnNpZ25lZCBpbnQgKnRvdGFsX3JlbG9jX3NpemVwOwotewotICB1bnNpZ25lZCBpbnQgaSwgajsKLSAgLyogQ2h1bmsgb2YgbWVtb3J5IHRoYXQgd2UgY2FuIHVzZSBhcyBidWZmZXIgc3BhY2UsIHRoZW4gdGhyb3cKLSAgICAgYXdheS4gICovCi0gIHVuc2lnbmVkIGNoYXIgdG1wX3NwYWNlW1NPTV9UTVBfQlVGU0laRV07Ci0gIHVuc2lnbmVkIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9yZWxvY19zaXplID0gMDsKLSAgdW5zaWduZWQgaW50IHN1YnNwYWNlX3JlbG9jX3NpemUgPSAwOwotICB1bnNpZ25lZCBpbnQgbnVtX3NwYWNlcyA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zcGFjZV90b3RhbDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQotICBtZW1zZXQgKHRtcF9zcGFjZSwgMCwgU09NX1RNUF9CVUZTSVpFKTsKLSAgcCA9IHRtcF9zcGFjZTsKLQotICAvKiBBbGwgdGhlIGZpeHVwcyBmb3IgYSBwYXJ0aWN1bGFyIHN1YnNwYWNlIGFyZSBlbWl0dGVkIGluIGEgc2luZ2xlCi0gICAgIHN0cmVhbS4gIEFsbCB0aGUgc3Vic3BhY2VzIGZvciBhIHBhcnRpY3VsYXIgc3BhY2UgYXJlIGVtaXR0ZWQKLSAgICAgYXMgYSBzaW5nbGUgc3RyZWFtLgotCi0gICAgIFNvLCB0byBnZXQgYWxsIHRoZSBsb2NhdGlvbnMgY29ycmVjdCBvbmUgbXVzdCBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZQotICAgICBzcGFjZXMsIGZvciBlYWNoIHNwYWNlIGl0ZXJhdGUgdGhyb3VnaCBpdHMgc3Vic3BhY2VzIGFuZCBvdXRwdXQgYQotICAgICBmaXh1cHMgc3RyZWFtLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3Vic2VjdGlvbjsKLQotICAgICAgLyogRmluZCBhIHNwYWNlLiAgKi8KLSAgICAgIHdoaWxlICghc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQlzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLQotICAgICAgLyogTm93IGl0ZXJhdGUgdGhyb3VnaCBlYWNoIG9mIGl0cyBzdWJzcGFjZXMuICAqLwotICAgICAgZm9yIChzdWJzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0JICAgc3Vic2VjdGlvbiAhPSBOVUxMOwotCSAgIHN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uLT5uZXh0KQotCXsKLQkgIGludCByZWxvY19vZmZzZXQsIGN1cnJlbnRfcm91bmRpbmdfbW9kZTsKLSNpZm5kZWYgTk9fUENSRUxfTU9ERVMKLSAJICBpbnQgY3VycmVudF9jYWxsX21vZGU7Ci0jZW5kaWYKLQotCSAgLyogRmluZCBhIHN1YnNwYWNlIG9mIHRoaXMgc3BhY2UuICAqLwotCSAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHN1YnNlY3Rpb24pCi0JICAgICAgfHwgIXNvbV9pc19jb250YWluZXIgKHNlY3Rpb24sIHN1YnNlY3Rpb24pKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgdGhpcyBzdWJzcGFjZSBkb2VzIG5vdCBoYXZlIHJlYWwgZGF0YSwgdGhlbiB3ZSBhcmUKLQkgICAgIGZpbmlzZWQgd2l0aCBpdC4gICovCi0JICBpZiAoKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMCkKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maXh1cF9yZXF1ZXN0X2luZGV4Ci0JCT0gLTE7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogVGhpcyBzdWJzcGFjZSBoYXMgc29tZSByZWxvY2F0aW9ucy4gIFB1dCB0aGUgcmVsb2NhdGlvbiBzdHJlYW0KLQkgICAgIGluZGV4IGludG8gdGhlIHN1YnNwYWNlIHJlY29yZC4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Zml4dXBfcmVxdWVzdF9pbmRleAotCSAgICA9IHRvdGFsX3JlbG9jX3NpemU7Ci0KLQkgIC8qIFRvIG1ha2UgbGlmZSBlYXNpZXIgc3RhcnQgb3ZlciB3aXRoIGEgY2xlYW4gc2xhdGUgZm9yIAotCSAgICAgZWFjaCBzdWJzcGFjZS4gIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSByZWxvY2F0aW9uIHN0cmVhbQotCSAgICAgZm9yIHRoaXMgc3Vic3BhY2UgaW4gcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcgb3V0IGl0cyBmaXh1cAotCSAgICAgc3RyZWFtLiAgKi8KLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudF9vZmZzZXQgKyB0b3RhbF9yZWxvY19zaXplLCBTRUVLX1NFVCkgPCAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIEJ1ZmZlciBzcGFjZSBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZC4gIEp1c3QgcGVyZm9ybSBzb21lCi0JICAgICBpbml0aWFsaXphdGlvbiBoZXJlLiAgKi8KLQkgIHAgPSB0bXBfc3BhY2U7Ci0JICBzdWJzcGFjZV9yZWxvY19zaXplID0gMDsKLQkgIHJlbG9jX29mZnNldCA9IDA7Ci0JICBzb21faW5pdGlhbGl6ZV9yZWxvY19xdWV1ZSAocmVsb2NfcXVldWUpOwotCSAgY3VycmVudF9yb3VuZGluZ19tb2RlID0gUl9OX01PREU7Ci0jaWZuZGVmIE5PX1BDUkVMX01PREVTCi0JICBjdXJyZW50X2NhbGxfbW9kZSA9IFJfU0hPUlRfUENSRUxfTU9ERTsKLSNlbmRpZgotCi0JICAvKiBUcmFuc2xhdGUgZWFjaCBCRkQgcmVsb2NhdGlvbiBpbnRvIG9uZSBvciBtb3JlIFNPTSAKLQkgICAgIHJlbG9jYXRpb25zLiAgKi8KLQkgIGZvciAoaiA9IDA7IGogPCBzdWJzZWN0aW9uLT5yZWxvY19jb3VudDsgaisrKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqYmZkX3JlbG9jID0gc3Vic2VjdGlvbi0+b3JlbG9jYXRpb25bal07Ci0JICAgICAgdW5zaWduZWQgaW50IHNraXA7Ci0JICAgICAgaW50IHN5bV9udW07Ci0KLQkgICAgICAvKiBHZXQgdGhlIHN5bWJvbCBudW1iZXIuICBSZW1lbWJlciBpdCdzIHN0b3JlZCBpbiBhIAotCQkgc3BlY2lhbCBwbGFjZSBmb3Igc2VjdGlvbiBzeW1ib2xzLiAgKi8KLQkgICAgICBpZiAoKCpiZmRfcmVsb2MtPnN5bV9wdHJfcHRyKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0JCXN5bV9udW0gPSAoKmJmZF9yZWxvYy0+c3ltX3B0cl9wdHIpLT51ZGF0YS5pOwotCSAgICAgIGVsc2UKLQkJc3ltX251bSA9IHNvbV9zeW1ib2xfZGF0YSAoKmJmZF9yZWxvYy0+c3ltX3B0cl9wdHIpLT5pbmRleDsKLQkgICAgICAKLQkgICAgICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGNvdXBsZSByZWxvY2F0aW9ucywKLQkJIHRoZW4gZHVtcCB0aGUgY3VycmVudCBidWZmZXIgY29udGVudHMgbm93LiAgQWxzbyByZWluaXRpYWxpemUKLQkJIHRoZSByZWxvY2F0aW9uIHF1ZXVlLiAKLQotCQkgTm8gc2luZ2xlIEJGRCByZWxvY2F0aW9uIGNvdWxkIGV2ZXIgdHJhbnNsYXRlIGludG8gbW9yZQotCQkgdGhhbiAxMDAgYnl0ZXMgb2YgU09NIHJlbG9jYXRpb25zICgyMGJ5dGVzIGlzIHByb2JhYmx5IHRoZQotCQkgdXBwZXIgbGltaXQsIGJ1dCBsZWF2ZSBsb3RzIG9mIHNwYWNlIGZvciBncm93dGgpLiAgKi8KLQkgICAgICBpZiAocCAtIHRtcF9zcGFjZSArIDEwMCA+IFNPTV9UTVBfQlVGU0laRSkKLQkJewotCQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRtcF9zcGFjZSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkJICAgICAgIT0gcCAtIHRtcF9zcGFjZSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIHAgPSB0bXBfc3BhY2U7Ci0JCSAgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgKHJlbG9jX3F1ZXVlKTsKLQkJfQotCi0JICAgICAgLyogRW1pdCBSX05PX1JFTE9DQVRJT04gZml4dXBzIHRvIG1hcCBhbnkgYnl0ZXMgd2hpY2ggd2VyZQotCQkgc2tpcHBlZC4gICovCi0JICAgICAgc2tpcCA9IGJmZF9yZWxvYy0+YWRkcmVzcyAtIHJlbG9jX29mZnNldDsKLQkgICAgICBwID0gc29tX3JlbG9jX3NraXAgKGFiZmQsIHNraXAsIHAsCi0JCQkJICAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcmVsb2NfcXVldWUpOwotCi0JICAgICAgLyogVXBkYXRlIHJlbG9jX29mZnNldCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLgotCi0JCSBNYW55IHJlbG9jYXRpb25zIGRvIG5vdCBjb25zdW1lIGlucHV0IGJ5dGVzLiAgVGhleQotCQkgYXJlIG1hcmtlcnMsIG9yIHNldCBzdGF0ZSBuZWNlc3NhcnkgdG8gcGVyZm9ybSBzb21lCi0JCSBsYXRlciByZWxvY2F0aW9uLiAgKi8KLQkgICAgICBzd2l0Y2ggKGJmZF9yZWxvYy0+aG93dG8tPnR5cGUpCi0JCXsKLQkJY2FzZSBSX0VOVFJZOgotCQljYXNlIFJfQUxUX0VOVFJZOgotCQljYXNlIFJfRVhJVDoKLQkJY2FzZSBSX05fTU9ERToKLQkJY2FzZSBSX1NfTU9ERToKLQkJY2FzZSBSX0RfTU9ERToKLQkJY2FzZSBSX1JfTU9ERToKLQkJY2FzZSBSX0ZTRUw6Ci0JCWNhc2UgUl9MU0VMOgotCQljYXNlIFJfUlNFTDoKLQkJY2FzZSBSX0NPTVAxOgotCQljYXNlIFJfQ09NUDI6Ci0JCWNhc2UgUl9CRUdJTl9CUlRBQjoKLQkJY2FzZSBSX0VORF9CUlRBQjoKLQkJY2FzZSBSX0JFR0lOX1RSWToKLQkJY2FzZSBSX0VORF9UUlk6Ci0JCWNhc2UgUl9OMFNFTDoKLQkJY2FzZSBSX04xU0VMOgotI2lmbmRlZiBOT19QQ1JFTF9NT0RFUwotCQljYXNlIFJfU0hPUlRfUENSRUxfTU9ERToKLQkJY2FzZSBSX0xPTkdfUENSRUxfTU9ERToKLSNlbmRpZgotCQkgIHJlbG9jX29mZnNldCA9IGJmZF9yZWxvYy0+YWRkcmVzczsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIHJlbG9jX29mZnNldCA9IGJmZF9yZWxvYy0+YWRkcmVzcyArIDQ7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIE5vdyB0aGUgYWN0dWFsIHJlbG9jYXRpb24gd2UgY2FyZSBhYm91dC4gICovCi0JICAgICAgc3dpdGNoIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlKQotCQl7Ci0JCWNhc2UgUl9QQ1JFTF9DQUxMOgotCQljYXNlIFJfQUJTX0NBTEw6Ci0JCSAgcCA9IHNvbV9yZWxvY19jYWxsIChhYmZkLCBwLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkgICAgICBiZmRfcmVsb2MsIHN5bV9udW0sIHJlbG9jX3F1ZXVlKTsKLQkJICBicmVhazsKLQotCQljYXNlIFJfQ09ERV9PTkVfU1lNQk9MOgotCQljYXNlIFJfRFBfUkVMQVRJVkU6Ci0JCSAgLyogQWNjb3VudCBmb3IgYW55IGFkZGVuZC4gICovCi0JCSAgaWYgKGJmZF9yZWxvYy0+YWRkZW5kKQotCQkgICAgcCA9IHNvbV9yZWxvY19hZGRlbmQgKGFiZmQsIGJmZF9yZWxvYy0+YWRkZW5kLCBwLCAKLQkJCQkJICAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcmVsb2NfcXVldWUpOwotCi0JCSAgaWYgKHN5bV9udW0gPCAweDIwKQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgKyBzeW1fbnVtLCBwKTsKLQkJICAgICAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOwotCQkgICAgICBwICs9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3ltX251bSA8IDB4MTAwKQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgKyAzMiwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSwgcCArIDEpOwotCQkgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLCBwLAotCQkJCQkgIDIsIHJlbG9jX3F1ZXVlKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzeW1fbnVtIDwgMHgxMDAwMDAwMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMzMsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0gPj4gMTYsIHAgKyAxKTsKLQkJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDIpOyAKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkJICBwLCA0LCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0RBVEFfT05FX1NZTUJPTDoKLQkJY2FzZSBSX0RBVEFfUExBQkVMOgotCQljYXNlIFJfQ09ERV9QTEFCRUw6Ci0JCWNhc2UgUl9ETFRfUkVMOgotCQkgIC8qIEFjY291bnQgZm9yIGFueSBhZGRlbmQgdXNpbmcgUl9EQVRBX09WRVJSSURFLiAgKi8KLQkJICBpZiAoYmZkX3JlbG9jLT5ob3d0by0+dHlwZSAhPSBSX0RBVEFfT05FX1NZTUJPTAotCQkgICAgICAmJiBiZmRfcmVsb2MtPmFkZGVuZCkKLQkJICAgIHAgPSBzb21fcmVsb2NfYWRkZW5kIChhYmZkLCBiZmRfcmVsb2MtPmFkZGVuZCwgcCwgCi0JCQkJCSAgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKLQotCQkgIGlmIChzeW1fbnVtIDwgMHgxMDApCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSwgcCArIDEpOwotCQkgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLCBwLAotCQkJCQkgIDIsIHJlbG9jX3F1ZXVlKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzeW1fbnVtIDwgMHgxMDAwMDAwMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMSwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSA+PiAxNiwgcCArIDEpOwotCQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBzeW1fbnVtLCBwICsgMik7IAotCQkgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLAotCQkJCQkgIHAsIDQsIHJlbG9jX3F1ZXVlKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJICBicmVhazsKLQotCQljYXNlIFJfRU5UUlk6Ci0JCSAgewotCQkgICAgaW50IHRtcDsKLQkJICAgIGFyZWxlbnQgKnRtcF9yZWxvYyA9IE5VTEw7Ci0JCSAgICBiZmRfcHV0XzggKGFiZmQsIFJfRU5UUlksIHApOwotCi0JCSAgICAvKiBSX0VOVFJZIHJlbG9jYXRpb25zIGhhdmUgNjQgYml0cyBvZiBhc3NvY2lhdGVkCi0JCSAgICAgICBkYXRhLiAgVW5mb3J0dW5hdGVseSB0aGUgYWRkZW5kIGZpZWxkIG9mIGEgYmZkCi0JCSAgICAgICByZWxvY2F0aW9uIGlzIG9ubHkgMzIgYml0cy4gIFNvLCB3ZSBzcGxpdCB1cAotCQkgICAgICAgdGhlIDY0Yml0IHVud2luZCBpbmZvcm1hdGlvbiBhbmQgc3RvcmUgcGFydCBpbgotCQkgICAgICAgdGhlIFJfRU5UUlkgcmVsb2NhdGlvbiwgYW5kIHRoZSByZXN0IGluIHRoZSBSX0VYSVQKLQkJICAgICAgIHJlbG9jYXRpb24uICAqLwotCQkgICAgYmZkX3B1dF8zMiAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQsIHAgKyAxKTsKLQkJCi0JCSAgICAvKiBGaW5kIHRoZSBuZXh0IFJfRVhJVCByZWxvY2F0aW9uLiAgKi8KLQkJICAgIGZvciAodG1wID0gajsgdG1wIDwgc3Vic2VjdGlvbi0+cmVsb2NfY291bnQ7IHRtcCsrKQotCQkgICAgICB7Ci0JCSAgICAgICAgdG1wX3JlbG9jID0gc3Vic2VjdGlvbi0+b3JlbG9jYXRpb25bdG1wXTsKLQkJCWlmICh0bXBfcmVsb2MtPmhvd3RvLT50eXBlID09IFJfRVhJVCkKLQkJCSAgYnJlYWs7Ci0JCSAgICAgIH0KLQotCQkgICAgaWYgKHRtcCA9PSBzdWJzZWN0aW9uLT5yZWxvY19jb3VudCkKLQkJICAgICAgYWJvcnQgKCk7Ci0KLQkJICAgIGJmZF9wdXRfMzIgKGFiZmQsIHRtcF9yZWxvYy0+YWRkZW5kLCBwICsgNSk7Ci0JCSAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLAotCQkJCQlwLCA5LCByZWxvY19xdWV1ZSk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCSAgCi0JCWNhc2UgUl9OX01PREU6Ci0JCWNhc2UgUl9TX01PREU6Ci0JCWNhc2UgUl9EX01PREU6Ci0JCWNhc2UgUl9SX01PREU6Ci0JCSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHJlcXVlc3RzIHRoZSBjdXJyZW50IHJvdW5kaW5nCi0JCSAgICAgbW9kZSwgdGhlbiBpdCBpcyByZWR1bmRhbnQuICAqLwotCQkgIGlmIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlICE9IGN1cnJlbnRfcm91bmRpbmdfbW9kZSkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICAgICAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOwotCQkgICAgICBwICs9IDE7Ci0JCSAgICAgIGN1cnJlbnRfcm91bmRpbmdfbW9kZSA9IGJmZF9yZWxvYy0+aG93dG8tPnR5cGU7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLSNpZm5kZWYgTk9fUENSRUxfTU9ERVMKLQkJY2FzZSBSX0xPTkdfUENSRUxfTU9ERToKLQkJY2FzZSBSX1NIT1JUX1BDUkVMX01PREU6Ci0JCSAgaWYgKGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgIT0gY3VycmVudF9jYWxsX21vZGUpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgICAgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKLQkJICAgICAgcCArPSAxOwotCQkgICAgICBjdXJyZW50X2NhbGxfbW9kZSA9IGJmZF9yZWxvYy0+aG93dG8tPnR5cGU7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0jZW5kaWYKLQotCQljYXNlIFJfRVhJVDoKLQkJY2FzZSBSX0FMVF9FTlRSWToKLQkJY2FzZSBSX0ZTRUw6Ci0JCWNhc2UgUl9MU0VMOgotCQljYXNlIFJfUlNFTDoKLQkJY2FzZSBSX0JFR0lOX0JSVEFCOgotCQljYXNlIFJfRU5EX0JSVEFCOgotCQljYXNlIFJfQkVHSU5fVFJZOgotCQljYXNlIFJfTjBTRUw6Ci0JCWNhc2UgUl9OMVNFTDoKLQkJICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKLQkJICBwICs9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0VORF9UUlk6Ci0JCSAgLyogVGhlIGVuZCBvZiBhIGV4Y2VwdGlvbiBoYW5kbGluZyByZWdpb24uICBUaGUgcmVsb2MncwotCQkgICAgIGFkZGVuZCBjb250YWlucyB0aGUgb2Zmc2V0IG9mIHRoZSBleGNlcHRpb24gaGFuZGxpbmcKLQkJICAgICBjb2RlLiAgKi8KLQkJICBpZiAoYmZkX3JlbG9jLT5hZGRlbmQgPT0gMCkKLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgZWxzZSBpZiAoYmZkX3JlbG9jLT5hZGRlbmQgPCAxMDI0KQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgKyAxLCBwKTsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmFkZGVuZCAvIDQsIHAgKyAxKTsKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkJICBwLCAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgKyAyLCBwKTsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCAoYmZkX3JlbG9jLT5hZGRlbmQgLyA0KSA+PiAxNiwgcCArIDEpOwotCQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBiZmRfcmVsb2MtPmFkZGVuZCAvIDQsIHAgKyAyKTsKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkJICBwLCA0LCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCSAgICAgIAotCQljYXNlIFJfQ09NUDE6Ci0JCSAgLyogVGhlIG9ubHkgdGltZSB3ZSBnZW5lcmF0ZSBSX0NPTVAxLCBSX0NPTVAyIGFuZCAKLQkJICAgICBSX0NPREVfRVhQUiByZWxvY3MgaXMgZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3bwotCQkgICAgIHN5bWJvbHMuICBIZW5jZSB3ZSBjYW4gY2hlYXQgaGVyZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4NDQsIHAgKyAxKTsKLQkJICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLAotCQkJCSAgICAgIHAsIDIsIHJlbG9jX3F1ZXVlKTsKLQkJICBicmVhazsKLQotCQljYXNlIFJfQ09NUDI6Ci0JCSAgLyogVGhlIG9ubHkgdGltZSB3ZSBnZW5lcmF0ZSBSX0NPTVAxLCBSX0NPTVAyIGFuZCAKLQkJICAgICBSX0NPREVfRVhQUiByZWxvY3MgaXMgZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3bwotCQkgICAgIHN5bWJvbHMuICBIZW5jZSB3ZSBjYW4gY2hlYXQgaGVyZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ODAsIHAgKyAxKTsKLQkJICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0gPj4gMTYsIHAgKyAyKTsKLQkJICBiZmRfcHV0XzE2IChhYmZkLCBzeW1fbnVtLCBwICsgMyk7Ci0JCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkgICAgICBwLCA1LCByZWxvY19xdWV1ZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0NPREVfRVhQUjoKLQkJY2FzZSBSX0RBVEFfRVhQUjoKLQkJICAvKiBUaGUgb25seSB0aW1lIHdlIGdlbmVyYXRlIFJfQ09NUDEsIFJfQ09NUDIgYW5kIAotCQkgICAgIFJfQ09ERV9FWFBSIHJlbG9jcyBpcyBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvCi0JCSAgICAgc3ltYm9scy4gIEhlbmNlIHdlIGNhbiBjaGVhdCBoZXJlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKLQkJICBwICs9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJLyogUHV0IGEgIlJfUkVTRVJWRUQiIHJlbG9jYXRpb24gaW4gdGhlIHN0cmVhbSBpZgotCQkgICB3ZSBoaXQgc29tZXRoaW5nIHdlIGRvIG5vdCB1bmRlcnN0YW5kLiAgVGhlIGxpbmtlcgotCQkgICB3aWxsIGNvbXBsYWluIGxvdWRseSBpZiB0aGlzIGV2ZXIgaGFwcGVucy4gICovCi0JCWRlZmF1bHQ6Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZmLCBwKTsKLQkJICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgcCArPSAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgLyogTGFzdCBCRkQgcmVsb2NhdGlvbiBmb3IgYSBzdWJzcGFjZSBoYXMgYmVlbiBwcm9jZXNzZWQuCi0JICAgICBNYXAgdGhlIHJlc3Qgb2YgdGhlIHN1YnNwYWNlIHdpdGggUl9OT19SRUxPQ0FUSU9OIGZpeHVwcy4gICovCi0JICBwID0gc29tX3JlbG9jX3NraXAgKGFiZmQsIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN1YnNlY3Rpb24pIAotCQkJICAgICAgICAgICAgICAtIHJlbG9jX29mZnNldCwKLQkJCSAgICAgIHAsICZzdWJzcGFjZV9yZWxvY19zaXplLCByZWxvY19xdWV1ZSk7Ci0KLQkgIC8qIFNjcmliYmxlIG91dCB0aGUgcmVsb2NhdGlvbnMuICAqLwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgdG1wX3NwYWNlLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKQotCSAgICAgICE9IHAgLSB0bXBfc3BhY2UpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHAgPSB0bXBfc3BhY2U7Ci0KLQkgIHRvdGFsX3JlbG9jX3NpemUgKz0gc3Vic3BhY2VfcmVsb2Nfc2l6ZTsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maXh1cF9yZXF1ZXN0X3F1YW50aXR5Ci0JICAgID0gc3Vic3BhY2VfcmVsb2Nfc2l6ZTsKLQl9Ci0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLSAgICB9Ci0gICp0b3RhbF9yZWxvY19zaXplcCA9IHRvdGFsX3JlbG9jX3NpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHNwYWNlL3N1YnNwYWNlIHN0cmluZyB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fd3JpdGVfc3BhY2Vfc3RyaW5ncyAoYWJmZCwgY3VycmVudF9vZmZzZXQsIHN0cmluZ19zaXplcCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotICAgICB1bnNpZ25lZCBpbnQgKnN0cmluZ19zaXplcDsKLXsKLSAgLyogQ2h1bmsgb2YgbWVtb3J5IHRoYXQgd2UgY2FuIHVzZSBhcyBidWZmZXIgc3BhY2UsIHRoZW4gdGhyb3cKLSAgICAgYXdheS4gICovCi0gIHVuc2lnbmVkIGNoYXIgdG1wX3NwYWNlW1NPTV9UTVBfQlVGU0laRV07Ci0gIHVuc2lnbmVkIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzX3NpemUgPSAwOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICBtZW1zZXQgKHRtcF9zcGFjZSwgMCwgU09NX1RNUF9CVUZTSVpFKTsKLSAgcCA9IHRtcF9zcGFjZTsKLQotICAvKiBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3BhY2Ugc3RyaW5ncyBpbiBwcmVwYXJhdGlvbiBmb3Igd3JpdGluZwotICAgICB0aGVtIG91dC4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudF9vZmZzZXQsIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdhbGsgdGhyb3VnaCBhbGwgdGhlIHNwYWNlcyBhbmQgc3Vic3BhY2VzIChvcmRlciBpcyBub3QgaW1wb3J0YW50KQotICAgICBidWlsZGluZyB1cCBhbmQgd3JpdGluZyBzdHJpbmcgdGFibGUgZW50cmllcyBmb3IgdGhlaXIgbmFtZXMuICAqLwotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0gICAgICAvKiBPbmx5IHdvcmsgd2l0aCBzcGFjZS9zdWJzcGFjZXM7IGF2b2lkIGFueSBvdGhlciBzZWN0aW9ucwotCSB3aGljaCBtaWdodCBoYXZlIGJlZW4gbWFkZSAoLnRleHQgZm9yIGV4YW1wbGUpLiAgKi8KLSAgICAgIGlmICghc29tX2lzX3NwYWNlIChzZWN0aW9uKSAmJiAhc29tX2lzX3N1YnNwYWNlIChzZWN0aW9uKSkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIHNwYWNlL3N1YnNwYWNlIG5hbWUuICAqLwotICAgICAgbGVuZ3RoID0gc3RybGVuIChzZWN0aW9uLT5uYW1lKTsKLQotICAgICAgLyogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGZvciB0aGUgbmV4dCBlbnRyeSwgdGhlbiBkdW1wIHRoZQotCSBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBub3cuICBFYWNoIGVudHJ5IHdpbGwgdGFrZSA0IGJ5dGVzIHRvCi0JIGhvbGQgdGhlIHN0cmluZyBsZW5ndGggKyB0aGUgc3RyaW5nIGl0c2VsZiArIG51bGwgdGVybWluYXRvci4gICovCi0gICAgICBpZiAocCAtIHRtcF9zcGFjZSArIDUgKyBsZW5ndGggPiBTT01fVE1QX0JVRlNJWkUpCi0JewotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkgICAgICAhPSBwIC0gdG1wX3NwYWNlKSAKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogUmVzZXQgdG8gYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgc3BhY2UuICAqLwotCSAgcCA9IHRtcF9zcGFjZTsKLQl9Ci0KLSAgICAgIC8qIEZpcnN0IGVsZW1lbnQgaW4gYSBzdHJpbmcgdGFibGUgZW50cnkgaXMgdGhlIGxlbmd0aCBvZiB0aGUKLQkgc3RyaW5nLiAgQWxpZ25tZW50IGlzc3VlcyBhcmUgYWxyZWFkeSBoYW5kbGVkLiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGxlbmd0aCwgcCk7Ci0gICAgICBwICs9IDQ7Ci0gICAgICBzdHJpbmdzX3NpemUgKz0gNDsKLQotICAgICAgLyogUmVjb3JkIHRoZSBpbmRleCBpbiB0aGUgc3BhY2Uvc3Vic3BhY2UgcmVjb3Jkcy4gICovCi0gICAgICBpZiAoc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQlzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+bmFtZS5uX3N0cnggPSBzdHJpbmdzX3NpemU7Ci0gICAgICBlbHNlCi0Jc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPm5hbWUubl9zdHJ4ID0gc3RyaW5nc19zaXplOwotCi0gICAgICAvKiBOZXh0IGNvbWVzIHRoZSBzdHJpbmcgaXRzZWxmICsgYSBudWxsIHRlcm1pbmF0b3IuICAqLwotICAgICAgc3RyY3B5IChwLCBzZWN0aW9uLT5uYW1lKTsKLSAgICAgIHAgKz0gbGVuZ3RoICsgMTsKLSAgICAgIHN0cmluZ3Nfc2l6ZSArPSBsZW5ndGggKyAxOwotCi0gICAgICAvKiBBbHdheXMgYWxpZ24gdXAgdG8gdGhlIG5leHQgd29yZCBib3VuZGFyeS4gICovCi0gICAgICB3aGlsZSAoc3RyaW5nc19zaXplICUgNCkKLQl7Ci0JICBiZmRfcHV0XzggKGFiZmQsIDAsIHApOwotCSAgcCsrOwotCSAgc3RyaW5nc19zaXplKys7Ci0JfQotICAgIH0KLQotICAvKiBEb25lIHdpdGggdGhlIHNwYWNlL3N1YnNwYWNlIHN0cmluZ3MuICBXcml0ZSBvdXQgYW55IGluZm9ybWF0aW9uCi0gICAgIGNvbnRhaW5lZCBpbiBhIHBhcnRpYWwgYmxvY2suICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKSAhPSBwIC0gdG1wX3NwYWNlKQotICAgIHJldHVybiBmYWxzZTsKLSAgKnN0cmluZ19zaXplcCA9IHN0cmluZ3Nfc2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBzeW1zLCBudW1fc3ltcywgc3RyaW5nX3NpemVwLAotCQkJICBjb21waWxhdGlvbl91bml0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICB1bnNpZ25lZCBpbnQgbnVtX3N5bXM7Ci0gICAgIHVuc2lnbmVkIGludCAqc3RyaW5nX3NpemVwOwotICAgICBDT01QVU5JVCAqY29tcGlsYXRpb25fdW5pdDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIAotICAvKiBDaHVuayBvZiBtZW1vcnkgdGhhdCB3ZSBjYW4gdXNlIGFzIGJ1ZmZlciBzcGFjZSwgdGhlbiB0aHJvdwotICAgICBhd2F5LiAgKi8KLSAgdW5zaWduZWQgY2hhciB0bXBfc3BhY2VbU09NX1RNUF9CVUZTSVpFXTsKLSAgdW5zaWduZWQgY2hhciAqcDsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3Nfc2l6ZSA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIgKmNvbXBbNF07Ci0KLSAgLyogVGhpcyBnZXRzIGEgYml0IGdydWVzb21lIGJlY2F1c2Ugb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQuICBUaGUKLSAgICAgc3RyaW5ncyB3aXRoaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgYXJlIHBhcnQgb2YgdGhlIHN5bWJvbAotICAgICBzdHJpbmdzLCBidXQgZG9uJ3QgaGF2ZSBzeW1ib2xfZGljdGlvbmFyeSBlbnRyaWVzLiAgU28sIG1hbnVhbGx5Ci0gICAgIHdyaXRlIHRoZW0gYW5kIHVwZGF0ZSB0aGUgY29tcGxpYXRpb24gdW5pdCBoZWFkZXIuICBPbiBpbnB1dCwgdGhlCi0gICAgIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyIGNvbnRhaW5zIGxvY2FsIGNvcGllcyBvZiB0aGUgc3RyaW5ncy4KLSAgICAgTW92ZSB0aGVtIGFzaWRlLiAgKi8KLSAgaWYgKGNvbXBpbGF0aW9uX3VuaXQpCi0gICAgewotICAgICAgY29tcFswXSA9IGNvbXBpbGF0aW9uX3VuaXQtPm5hbWUubl9uYW1lOwotICAgICAgY29tcFsxXSA9IGNvbXBpbGF0aW9uX3VuaXQtPmxhbmd1YWdlX25hbWUubl9uYW1lOwotICAgICAgY29tcFsyXSA9IGNvbXBpbGF0aW9uX3VuaXQtPnByb2R1Y3RfaWQubl9uYW1lOwotICAgICAgY29tcFszXSA9IGNvbXBpbGF0aW9uX3VuaXQtPnZlcnNpb25faWQubl9uYW1lOwotICAgIH0KLQotICBtZW1zZXQgKHRtcF9zcGFjZSwgMCwgU09NX1RNUF9CVUZTSVpFKTsKLSAgcCA9IHRtcF9zcGFjZTsKLQotICAvKiBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3BhY2Ugc3RyaW5ncyBpbiBwcmVwYXJhdGlvbiBmb3Igd3JpdGluZwotICAgICB0aGVtIG91dC4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudF9vZmZzZXQsIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjb21waWxhdGlvbl91bml0KQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JewotCSAgaW50IGxlbmd0aCA9IHN0cmxlbiAoY29tcFtpXSk7Ci0KLQkgIC8qIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSBmb3IgdGhlIG5leHQgZW50cnksIHRoZW4gZHVtcAotCSAgICAgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5vdy4gICovCi0JICBpZiAocCAtIHRtcF9zcGFjZSArIDUgKyBsZW5ndGggPiBTT01fVE1QX0JVRlNJWkUpCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKQotCQkgICE9IHAgLSB0bXBfc3BhY2UpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAvKiBSZXNldCB0byBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBzcGFjZS4gICovCi0JICAgICAgcCA9IHRtcF9zcGFjZTsKLQkgICAgfQotCi0JICAvKiBGaXJzdCBlbGVtZW50IGluIGEgc3RyaW5nIHRhYmxlIGVudHJ5IGlzIHRoZSBsZW5ndGggb2YKLQkgICAgIHRoZSBzdHJpbmcuICBUaGlzIG11c3QgYWx3YXlzIGJlIDQgYnl0ZSBhbGlnbmVkLiAgVGhpcyBpcwotCSAgICAgYWxzbyBhbiBhcHByb3ByaWF0ZSB0aW1lIHRvIGZpbGwgaW4gdGhlIHN0cmluZyBpbmRleAotCSAgICAgZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZSBlbnRyeS4gICovCi0JICBiZmRfcHV0XzMyIChhYmZkLCBsZW5ndGgsIHApOwotCSAgc3RyaW5nc19zaXplICs9IDQ7Ci0JICBwICs9IDQ7Ci0KLQkgIC8qIE5leHQgY29tZXMgdGhlIHN0cmluZyBpdHNlbGYgKyBhIG51bGwgdGVybWluYXRvci4gICovCi0JICBzdHJjcHkgKHAsIGNvbXBbaV0pOwotCi0JICBzd2l0Y2ggKGkpCi0JICAgIHsKLQkgICAgY2FzZSAwOgkKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT5uYW1lLm5fc3RyeCA9IHN0cmluZ3Nfc2l6ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxOgotCSAgICAgIG9ial9zb21fY29tcGlsYXRpb25fdW5pdCAoYWJmZCktPmxhbmd1YWdlX25hbWUubl9zdHJ4ID0gCi0JCXN0cmluZ3Nfc2l6ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAyOgotCSAgICAgIG9ial9zb21fY29tcGlsYXRpb25fdW5pdCAoYWJmZCktPnByb2R1Y3RfaWQubl9zdHJ4ID0gCi0JCXN0cmluZ3Nfc2l6ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAzOgotCSAgICAgIG9ial9zb21fY29tcGlsYXRpb25fdW5pdCAoYWJmZCktPnZlcnNpb25faWQubl9zdHJ4ID0gCi0JCXN0cmluZ3Nfc2l6ZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBwICs9IGxlbmd0aCArIDE7Ci0JICBzdHJpbmdzX3NpemUgKz0gbGVuZ3RoICsgMTsKLQotCSAgLyogQWx3YXlzIGFsaWduIHVwIHRvIHRoZSBuZXh0IHdvcmQgYm91bmRhcnkuICAqLwotCSAgd2hpbGUgKHN0cmluZ3Nfc2l6ZSAlIDQpCi0JICAgIHsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIDAsIHApOwotCSAgICAgIHN0cmluZ3Nfc2l6ZSsrOwotCSAgICAgIHArKzsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1zOyBpKyspCi0gICAgewotICAgICAgaW50IGxlbmd0aCA9IHN0cmxlbiAoc3ltc1tpXS0+bmFtZSk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSBmb3IgdGhlIG5leHQgZW50cnksIHRoZW4gZHVtcCB0aGUKLQkgY3VycmVudCBidWZmZXIgY29udGVudHMgbm93LiAgKi8KLSAgICAgaWYgKHAgLSB0bXBfc3BhY2UgKyA1ICsgbGVuZ3RoID4gU09NX1RNUF9CVUZTSVpFKQotCXsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0bXBfc3BhY2VbMF0sIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCi0JICAgICAgIT0gcCAtIHRtcF9zcGFjZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogUmVzZXQgdG8gYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgc3BhY2UuICAqLwotCSAgcCA9IHRtcF9zcGFjZTsKLQl9Ci0KLSAgICAgIC8qIEZpcnN0IGVsZW1lbnQgaW4gYSBzdHJpbmcgdGFibGUgZW50cnkgaXMgdGhlIGxlbmd0aCBvZiB0aGUKLQkgc3RyaW5nLiAgVGhpcyBtdXN0IGFsd2F5cyBiZSA0IGJ5dGUgYWxpZ25lZC4gIFRoaXMgaXMgYWxzbwotCSBhbiBhcHByb3ByaWF0ZSB0aW1lIHRvIGZpbGwgaW4gdGhlIHN0cmluZyBpbmRleCBmaWVsZCBpbiB0aGUKLQkgc3ltYm9sIHRhYmxlIGVudHJ5LiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGxlbmd0aCwgcCk7Ci0gICAgICBzdHJpbmdzX3NpemUgKz0gNDsKLSAgICAgIHAgKz0gNDsKLQotICAgICAgLyogTmV4dCBjb21lcyB0aGUgc3RyaW5nIGl0c2VsZiArIGEgbnVsbCB0ZXJtaW5hdG9yLiAgKi8KLSAgICAgIHN0cmNweSAocCwgc3ltc1tpXS0+bmFtZSk7Ci0KLSAgICAgIHNvbV9zeW1ib2xfZGF0YShzeW1zW2ldKS0+c3RyaW5ndGFiX29mZnNldCA9IHN0cmluZ3Nfc2l6ZTsKLSAgICAgIHAgKz0gbGVuZ3RoICsgMTsKLSAgICAgIHN0cmluZ3Nfc2l6ZSArPSBsZW5ndGggKyAxOwotCi0gICAgICAvKiBBbHdheXMgYWxpZ24gdXAgdG8gdGhlIG5leHQgd29yZCBib3VuZGFyeS4gICovCi0gICAgICB3aGlsZSAoc3RyaW5nc19zaXplICUgNCkKLSAgICAgICAgewotCSAgYmZkX3B1dF84IChhYmZkLCAwLCBwKTsKLQkgIHN0cmluZ3Nfc2l6ZSsrOwotCSAgcCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gIC8qIFNjcmliYmxlIG91dCBhbnkgcGFydGlhbCBibG9jay4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0bXBfc3BhY2VbMF0sIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpICE9IHAgLSB0bXBfc3BhY2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpzdHJpbmdfc2l6ZXAgPSBzdHJpbmdzX3NpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb21wdXRlIHZhcmlhYmxlIGluZm9ybWF0aW9uIHRvIGJlIHBsYWNlZCBpbiB0aGUgU09NIGhlYWRlcnMsIAotICAgc3BhY2Uvc3Vic3BhY2UgZGljdGlvbmFyaWVzLCByZWxvY2F0aW9uIHN0cmVhbXMsIGV0Yy4gIEJlZ2luCi0gICB3cml0aW5nIHBhcnRzIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuIAotc29tX2JlZ2luX3dyaXRpbmcgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldCA9IDA7Ci0gIGludCBzdHJpbmdzX3NpemUgPSAwOwotICB1bnNpZ25lZCBpbnQgdG90YWxfcmVsb2Nfc2l6ZSA9IDA7Ci0gIHVuc2lnbmVkIGxvbmcgbnVtX3NwYWNlcywgbnVtX3N1YnNwYWNlcywgaTsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9zdWJzcGFjZXMgPSAwOwotICBzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICpleGVjX2hlYWRlciA9IE5VTEw7Ci0KLSAgLyogVGhlIGZpbGUgaGVhZGVyIHdpbGwgYWx3YXlzIGJlIGZpcnN0IGluIGFuIG9iamVjdCBmaWxlLCAKLSAgICAgZXZlcnl0aGluZyBlbHNlIGNhbiBiZSBpbiByYW5kb20gbG9jYXRpb25zLiAgVG8ga2VlcCB0aGluZ3MKLSAgICAgInNpbXBsZSIgQkZEIHdpbGwgbGF5IG91dCB0aGUgb2JqZWN0IGZpbGUgaW4gdGhlIG1hbm5lciBzdWdnZXN0ZWQKLSAgICAgYnkgdGhlIFBSTyBBQkkgZm9yIFBBLVJJU0MgU3lzdGVtcy4gICovCi0KLSAgLyogQmVmb3JlIGFueSBvdXRwdXQgY2FuIHJlYWxseSBiZWdpbiBvZmZzZXRzIGZvciBhbGwgdGhlIG1ham9yCi0gICAgIHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZSBtdXN0IGJlIGNvbXB1dGVkLiAgU28sIHN0YXJ0aW5nCi0gICAgIHdpdGggdGhlIGluaXRpYWwgZmlsZSBoZWFkZXIgY29tcHV0ZSAoYW5kIHNvbWV0aW1lcyB3cml0ZSkKLSAgICAgZWFjaCBwb3J0aW9uIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0KLSAgLyogTWFrZSByb29tIGZvciB0aGUgZmlsZSBoZWFkZXIsIGl0J3MgY29udGVudHMgYXJlIG5vdCBjb21wbGV0ZQotICAgICB5ZXQsIHNvIGl0IGNhbiBub3QgYmUgd3JpdHRlbiBhdCB0aGlzIHRpbWUuICAqLwotICBjdXJyZW50X29mZnNldCArPSBzaXplb2YgKHN0cnVjdCBoZWFkZXIpOyAgCi0KLSAgLyogQW55IGF1eGlsaWFyeSBoZWFkZXJzIHdpbGwgZm9sbG93IHRoZSBmaWxlIGhlYWRlci4gIFJpZ2h0IG5vdwotICAgICB3ZSBzdXBwb3J0IG9ubHkgdGhlIGNvcHlyaWdodCBhbmQgdmVyc2lvbiBoZWFkZXJzLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfc2l6ZSA9IDA7Ci0gIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKLSAgICB7Ci0gICAgICAvKiBQYXJ0cyBvZiB0aGUgZXhlYyBoZWFkZXIgd2lsbCBiZSBmaWxsZWQgaW4gbGF0ZXIsIHNvCi0JIGRlbGF5IHdyaXRpbmcgdGhlIGhlYWRlciBpdHNlbGYuICBGaWxsIGluIHRoZSBkZWZhdWx0cywKLQkgYW5kIHdyaXRlIGl0IGxhdGVyLiAgKi8KLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2F1eGhkcik7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplCi0JKz0gc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyKTsKLSAgICAgIGV4ZWNfaGVhZGVyID0gb2JqX3NvbV9leGVjX2hkciAoYWJmZCk7Ci0gICAgICBleGVjX2hlYWRlci0+c29tX2F1eGhkci50eXBlID0gRVhFQ19BVVhfSUQ7Ci0gICAgICBleGVjX2hlYWRlci0+c29tX2F1eGhkci5sZW5ndGggPSA0MDsKLSAgICB9Ci0gIGlmIChvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudF9vZmZzZXQsIFNFRUtfU0VUKSA8IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBXcml0ZSB0aGUgYXV4X2lkIHN0cnVjdHVyZSBhbmQgdGhlIHN0cmluZyBsZW5ndGguICAqLwotICAgICAgbGVuID0gc2l6ZW9mIChzdHJ1Y3QgYXV4X2lkKSArIHNpemVvZiAodW5zaWduZWQgaW50KTsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgKz0gbGVuOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gbGVuOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCksIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIHZlcnNpb24gc3RyaW5nLiAgKi8KLSAgICAgIGxlbiA9IG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT5oZWFkZXJfaWQubGVuZ3RoIC0gc2l6ZW9mIChpbnQpOwotICAgICAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfc2l6ZSArPSBsZW47Ci0gICAgICBjdXJyZW50X29mZnNldCArPSBsZW47Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+dXNlcl9zdHJpbmcsCi0JCSAgICAgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAob2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudF9vZmZzZXQsIFNFRUtfU0VUKSA8IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBXcml0ZSB0aGUgYXV4X2lkIHN0cnVjdHVyZSBhbmQgdGhlIHN0cmluZyBsZW5ndGguICAqLwotICAgICAgbGVuID0gc2l6ZW9mIChzdHJ1Y3QgYXV4X2lkKSArIHNpemVvZiAodW5zaWduZWQgaW50KTsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgKz0gbGVuOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gbGVuOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBXcml0ZSB0aGUgY29weXJpZ2h0IHN0cmluZy4gICovCi0gICAgICBsZW4gPSBvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpLT5oZWFkZXJfaWQubGVuZ3RoIC0gc2l6ZW9mIChpbnQpOwotICAgICAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfc2l6ZSArPSBsZW47Ci0gICAgICBjdXJyZW50X29mZnNldCArPSBsZW47Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpLT5jb3B5cmlnaHQsCi0JCSAgICAgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBOZXh0IGNvbWVzIHRoZSBpbml0aWFsaXphdGlvbiBwb2ludGVyczsgd2UgaGF2ZSBubyBpbml0aWFsaXphdGlvbgotICAgICBwb2ludGVycywgc28gY3VycmVudCBvZmZzZXQgZG9lcyBub3QgY2hhbmdlLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmluaXRfYXJyYXlfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmluaXRfYXJyYXlfdG90YWwgPSAwOwotCi0gIC8qIE5leHQgYXJlIHRoZSBzcGFjZSByZWNvcmRzLiAgVGhlc2UgYXJlIGZpeGVkIGxlbmd0aCByZWNvcmRzLgotCi0gICAgIENvdW50IHRoZSBudW1iZXIgb2Ygc3BhY2VzIHRvIGRldGVybWluZSBob3cgbXVjaCByb29tIGlzIG5lZWRlZAotICAgICBpbiB0aGUgb2JqZWN0IGZpbGUgZm9yIHRoZSBzcGFjZSByZWNvcmRzLgotCi0gICAgIFRoZSBuYW1lcyBvZiB0aGUgc3BhY2VzIGFyZSBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBzdHJpbmcgdGFibGUsCi0gICAgIGFuZCB0aGUgaW5kZXggZm9yIGVhY2ggc3BhY2UgaW50byB0aGUgc3RyaW5nIHRhYmxlIGlzIGNvbXB1dGVkCi0gICAgIGJlbG93LiAgVGhlcmVmb3JlLCBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgdGhlIHNwYWNlIGhlYWRlcnMKLSAgICAgYXQgdGhpcyB0aW1lLiAgKi8KLSAgbnVtX3NwYWNlcyA9IHNvbV9jb3VudF9zcGFjZXMgKGFiZmQpOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2VfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX3RvdGFsID0gbnVtX3NwYWNlczsKLSAgY3VycmVudF9vZmZzZXQgKz0gbnVtX3NwYWNlcyAqIHNpemVvZiAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKTsKLQotICAvKiBOZXh0IGFyZSB0aGUgc3Vic3BhY2UgcmVjb3Jkcy4gIFRoZXNlIGFyZSBmaXhlZCBsZW5ndGggcmVjb3Jkcy4KLQotICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHN1YnNwYWVzIHRvIGRldGVybWluZSBob3cgbXVjaCByb29tIGlzIG5lZWRlZAotICAgICBpbiB0aGUgb2JqZWN0IGZpbGUgZm9yIHRoZSBzdWJzcGFjZSByZWNvcmRzLgotCi0gICAgIEEgdmFyaWV0eSBpZiBmaWVsZHMgaW4gdGhlIHN1YnNwYWNlIHJlY29yZCBhcmUgc3RpbGwgdW5rbm93biBhdAotICAgICB0aGlzIHRpbWUgKGluZGV4IGludG8gc3RyaW5nIHRhYmxlLCBmaXh1cCBzdHJlYW0gbG9jYXRpb24vc2l6ZSwgZXRjKS4gICovCi0gIG51bV9zdWJzcGFjZXMgPSBzb21fY291bnRfc3Vic3BhY2VzIChhYmZkKTsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN1YnNwYWNlX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zdWJzcGFjZV90b3RhbCA9IG51bV9zdWJzcGFjZXM7Ci0gIGN1cnJlbnRfb2Zmc2V0ICs9IG51bV9zdWJzcGFjZXMgKiBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCk7Ci0KLSAgLyogTmV4dCBpcyB0aGUgc3RyaW5nIHRhYmxlIGZvciB0aGUgc3BhY2Uvc3Vic3BhY2UgbmFtZXMuICBXZSB3aWxsCi0gICAgIGJ1aWxkIGFuZCB3cml0ZSB0aGUgc3RyaW5nIHRhYmxlIG9uIHRoZSBmbHkuICBBdCB0aGUgc2FtZSB0aW1lCi0gICAgIHdlIHdpbGwgZmlsbCBpbiB0aGUgc3BhY2Uvc3Vic3BhY2UgbmFtZSBpbmRleCBmaWVsZHMuICAqLwotCi0gIC8qIFRoZSBzdHJpbmcgdGFibGUgbmVlZHMgdG8gYmUgYWxpZ25lZCBvbiBhIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAoY3VycmVudF9vZmZzZXQgJSA0KQotICAgIGN1cnJlbnRfb2Zmc2V0ICs9ICg0IC0gKGN1cnJlbnRfb2Zmc2V0ICUgNCkpOwotCi0gIC8qIE1hcmsgdGhlIG9mZnNldCBvZiB0aGUgc3BhY2Uvc3Vic3BhY2Ugc3RyaW5nIHRhYmxlIGluIHRoZSAKLSAgICAgZmlsZSBoZWFkZXIuICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2Vfc3RyaW5nc19sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotCi0gIC8qIFNjcmliYmxlIG91dCB0aGUgc3BhY2Ugc3RyaW5ncy4gICovCi0gIGlmIChzb21fd3JpdGVfc3BhY2Vfc3RyaW5ncyAoYWJmZCwgY3VycmVudF9vZmZzZXQsICZzdHJpbmdzX3NpemUpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWNvcmQgdG90YWwgc3RyaW5nIHRhYmxlIHNpemUgaW4gdGhlIGhlYWRlciBhbmQgdXBkYXRlIHRoZQotICAgICBjdXJyZW50IG9mZnNldC4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zcGFjZV9zdHJpbmdzX3NpemUgPSBzdHJpbmdzX3NpemU7Ci0gIGN1cnJlbnRfb2Zmc2V0ICs9IHN0cmluZ3Nfc2l6ZTsKLQotICAvKiBOZXh0IGlzIHRoZSBjb21waWxhdGlvbiB1bml0LiAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y29tcGlsZXJfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNvbXBpbGVyX3RvdGFsID0gMDsKLSAgaWYgKG9ial9zb21fY29tcGlsYXRpb25fdW5pdCAoYWJmZCkpIAotICAgIHsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5jb21waWxlcl90b3RhbCA9IDE7Ci0gICAgICBjdXJyZW50X29mZnNldCArPSBDT01QVU5JVFNaOyAKLSAgICB9Ci0KLSAgLyogTm93IGNvbXB1dGUgdGhlIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgbG9hZGFibGUgc3Vic3BhY2VzLCB0YWtpbmcKLSAgICAgY2FyZSB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBzdGF5cyBwcm9wZXJseSBhbGlnbmVkLiAgKi8KLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0gICAgICBpbnQgZmlyc3Rfc3Vic3BhY2U7Ci0gICAgICB1bnNpZ25lZCBpbnQgc3Vic3BhY2Vfb2Zmc2V0ID0gMDsKLQotICAgICAgLyogRmluZCBhIHNwYWNlLiAgKi8KLSAgICAgIHdoaWxlICghc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQlzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLQotICAgICAgZmlyc3Rfc3Vic3BhY2UgPSAxOwotICAgICAgLyogTm93IGxvb2sgZm9yIGFsbCBpdHMgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGZvciAoc3Vic2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIHN1YnNlY3Rpb24gIT0gTlVMTDsKLQkgICBzdWJzZWN0aW9uID0gc3Vic2VjdGlvbi0+bmV4dCkKLQl7Ci0KLQkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQotCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKQotCSAgICAgIHx8IChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHN1YnNwYWNlIGluIHRoZSBzcGFjZSwgYW5kIHdlIGFyZQotCSAgICAgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSwgdGhlbiB0YWtlIGNhcmUgdG8gbWFrZSBzdXJlIGFsbAotCSAgICAgdGhlIGFsaWdubWVudHMgYXJlIGNvcnJlY3QgYW5kIHVwZGF0ZSB0aGUgZXhlYyBoZWFkZXIuICAqLwotCSAgaWYgKGZpcnN0X3N1YnNwYWNlCi0JICAgICAgJiYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSkKLQkgICAgewotCSAgICAgIC8qIERlbWFuZCBwYWdlZCBleGVjdXRhYmxlcyBoYXZlIGVhY2ggc3BhY2UgYWxpZ25lZCB0byBhCi0JCSBwYWdlIGJvdW5kYXJ5LiAgU2hhcmFibGUgZXhlY3V0YWJsZXMgKHdyaXRlLXByb3RlY3RlZAotCQkgdGV4dCkgaGF2ZSBqdXN0IHRoZSBwcml2YXRlIChha2EgZGF0YSAmIGJzcykgc3BhY2UgYWxpZ25lZAotCQkgdG8gYSBwYWdlIGJvdW5kYXJ5LiAgVWdoLiAgTm90IHRydWUgZm9yIEhQVVguCi0KLQkJIFRoZSBIUFVYIGtlcm5lbCByZXF1aXJlcyB0aGUgdGV4dCB0byBhbHdheXMgYmUgcGFnZSBhbGlnbmVkCi0JCSB3aXRoaW4gdGhlIGZpbGUgcmVnYXJkbGVzcyBvZiB0aGUgZXhlY3V0YWJsZSdzIHR5cGUuICAqLwotCSAgICAgIGlmIChhYmZkLT5mbGFncyAmIChEX1BBR0VEIHwgRFlOQU1JQykKLQkJICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJICB8fCAoKGFiZmQtPmZsYWdzICYgV1BfVEVYVCkKLQkJICAgICAgJiYgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0RBVEEpKSkKLQkJY3VycmVudF9vZmZzZXQgPSBTT01fQUxJR04gKGN1cnJlbnRfb2Zmc2V0LCBQQV9QQUdFU0laRSk7Ci0KLQkgICAgICAvKiBVcGRhdGUgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLQkgICAgICBpZiAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSAmJiBleGVjX2hlYWRlci0+ZXhlY190ZmlsZSA9PSAwKQotCQl7Ci0JCSAgZXhlY19oZWFkZXItPmV4ZWNfdG1lbSA9IHNlY3Rpb24tPnZtYTsKLQkJICBleGVjX2hlYWRlci0+ZXhlY190ZmlsZSA9IGN1cnJlbnRfb2Zmc2V0OwotCQl9Ci0JICAgICAgaWYgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0RBVEEgJiYgZXhlY19oZWFkZXItPmV4ZWNfZGZpbGUgPT0gMCkKLQkJewotCQkgIGV4ZWNfaGVhZGVyLT5leGVjX2RtZW0gPSBzZWN0aW9uLT52bWE7Ci0JCSAgZXhlY19oZWFkZXItPmV4ZWNfZGZpbGUgPSBjdXJyZW50X29mZnNldDsKLQkJfQotCi0JICAgICAgLyogS2VlcCB0cmFjayBvZiBleGFjdGx5IHdoZXJlIHdlIGFyZSB3aXRoaW4gYSBwYXJ0aWN1bGFyCi0JCSBzcGFjZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IGFzIHRoZSBicmFpbmRhbWFnZWQgSFBVWAotCQkgbG9hZGVyIHdpbGwgY3JlYXRlIGhvbGVzIGJldHdlZW4gc3Vic3BhY2VzICphbmQqIAotCQkgc3Vic3BhY2UgYWxpZ25tZW50cyBhcmUgKk5PVCogcHJlc2VydmVkLiAgV2hhdCBhIGNyb2NrLiAgKi8KLQkgICAgICBzdWJzcGFjZV9vZmZzZXQgPSBzdWJzZWN0aW9uLT52bWE7Ci0KLQkgICAgICAvKiBPbmx5IGRvIHRoaXMgZm9yIHRoZSBmaXJzdCBzdWJzcGFjZSB3aXRoaW4gZWFjaCBzcGFjZS4gICovCi0JICAgICAgZmlyc3Rfc3Vic3BhY2UgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKLQkgICAgewotCSAgICAgIC8qIFRoZSBicmFpbmRhbWFnZWQgSFBVWCBsb2FkZXIgbWF5IGhhdmUgY3JlYXRlZCBhIGhvbGUKLQkJIGJldHdlZW4gdHdvIHN1YnNwYWNlcy4gIEl0IGlzICpub3QqIHN1ZmZpY2llbnQgdG8gdXNlCi0JCSB0aGUgYWxpZ25tZW50IHNwZWNpZmljYXRpb25zIHdpdGhpbiB0aGUgc3Vic3BhY2VzIHRvCi0JCSBhY2NvdW50IGZvciB0aGVzZSBob2xlcyAtLSBJJ3ZlIHJ1biBpbnRvIGF0IGxlYXN0IG9uZQotCQkgY2FzZSB3aGVyZSB0aGUgbG9hZGVyIGxlZnQgb25lIGNvZGUgc3Vic3BhY2UgdW5hbGlnbmVkCi0JCSBpbiBhIGZpbmFsIGV4ZWN1dGFibGUuCi0KLQkJIFRvIGNvbWJhdCB0aGlzIHdlIGtlZXAgYSBjdXJyZW50IG9mZnNldCB3aXRoaW4gZWFjaCBzcGFjZSwKLQkJIGFuZCB1c2UgdGhlIHN1YnNwYWNlIHZtYSBmaWVsZHMgdG8gZGV0ZWN0IGFuZCBwcmVzZXJ2ZQotCQkgaG9sZXMuICBXaGF0IGEgY3JvY2shCi0KLQkJIHBzLiAgVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGZvciB1bmxvYWRhYmxlIHNwYWNlL3N1YnNwYWNlcy4gICovCi0JICAgICAgY3VycmVudF9vZmZzZXQgKz0gc3Vic2VjdGlvbi0+dm1hIC0gc3Vic3BhY2Vfb2Zmc2V0OwotCSAgICAgIGlmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKQotCQlleGVjX2hlYWRlci0+ZXhlY190c2l6ZSArPSBzdWJzZWN0aW9uLT52bWEgLSBzdWJzcGFjZV9vZmZzZXQ7Ci0JICAgICAgZWxzZQotCQlleGVjX2hlYWRlci0+ZXhlY19kc2l6ZSArPSBzdWJzZWN0aW9uLT52bWEgLSBzdWJzcGFjZV9vZmZzZXQ7Ci0JICAgICAgc3Vic3BhY2Vfb2Zmc2V0ICs9IHN1YnNlY3Rpb24tPnZtYSAtIHN1YnNwYWNlX29mZnNldDsKLQkgICAgfQotCi0KLQkgIHN1YnNlY3Rpb24tPnRhcmdldF9pbmRleCA9IHRvdGFsX3N1YnNwYWNlcysrOwotCSAgLyogVGhpcyBpcyByZWFsIGRhdGEgdG8gYmUgbG9hZGVkIGZyb20gdGhlIGZpbGUuICAqLwotCSAgaWYgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpCi0JICAgIHsKLQkgICAgICAvKiBVcGRhdGUgdGhlIHNpemUgb2YgdGhlIGNvZGUgJiBkYXRhLiAgKi8KLQkgICAgICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykKLQkJICAmJiBzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKQotCQlleGVjX2hlYWRlci0+ZXhlY190c2l6ZSArPSBzdWJzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0JICAgICAgZWxzZSBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykKLQkJICAgICAgICYmIHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0RBVEEpCi0JCWV4ZWNfaGVhZGVyLT5leGVjX2RzaXplICs9IHN1YnNlY3Rpb24tPl9jb29rZWRfc2l6ZTsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZQotCQk9IGN1cnJlbnRfb2Zmc2V0OwotCSAgICAgIHN1YnNlY3Rpb24tPmZpbGVwb3MgPSBjdXJyZW50X29mZnNldDsKLQkgICAgICBjdXJyZW50X29mZnNldCArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKTsgCi0JICAgICAgc3Vic3BhY2Vfb2Zmc2V0ICs9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN1YnNlY3Rpb24pOwotCSAgICB9Ci0JICAvKiBMb29rcyBsaWtlIHVuaW5pdGlhbGl6ZWQgZGF0YS4gICovCi0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBVcGRhdGUgdGhlIHNpemUgb2YgdGhlIGJzcyBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0JCWV4ZWNfaGVhZGVyLT5leGVjX2JzaXplICs9IHN1YnNlY3Rpb24tPl9jb29rZWRfc2l6ZTsKLQotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maWxlX2xvY19pbml0X3ZhbHVlCi0JCT0gMDsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Ci0JCWluaXRpYWxpemF0aW9uX2xlbmd0aCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBHb3RvIHRoZSBuZXh0IHNlY3Rpb24uICAqLwotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7IAotICAgIH0KLQotICAvKiBGaW5hbGx5IGNvbXB1dGUgdGhlIGZpbGUgcG9zaXRpb25zIGZvciB1bmxvYWRhYmxlIHN1YnNwYWNlcy4KLSAgICAgSWYgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSwgc3RhcnQgdGhlIHVubG9hZGFibGUgc3R1ZmYgb24gaXRzCi0gICAgIG93biBwYWdlLiAgKi8KLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgY3VycmVudF9vZmZzZXQgPSBTT01fQUxJR04gKGN1cnJlbnRfb2Zmc2V0LCBQQV9QQUdFU0laRSk7Ci0KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnVubG9hZGFibGVfc3BfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLSAgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NwYWNlczsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOwotCi0gICAgICAvKiBGaW5kIGEgc3BhY2UuICAqLwotICAgICAgd2hpbGUgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pKQotCXNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OwotCi0gICAgICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0JY3VycmVudF9vZmZzZXQgPSBTT01fQUxJR04gKGN1cnJlbnRfb2Zmc2V0LCBQQV9QQUdFU0laRSk7Ci0KLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCSAgCi0JICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKLQkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikKLQkgICAgICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBzdWJzZWN0aW9uLT50YXJnZXRfaW5kZXggPSB0b3RhbF9zdWJzcGFjZXMrKzsKLQkgIC8qIFRoaXMgaXMgcmVhbCBkYXRhIHRvIGJlIGxvYWRlZCBmcm9tIHRoZSBmaWxlLiAgKi8KLQkgIGlmICgoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maWxlX2xvY19pbml0X3ZhbHVlCi0JCT0gY3VycmVudF9vZmZzZXQ7Ci0JICAgICAgc3Vic2VjdGlvbi0+ZmlsZXBvcyA9IGN1cnJlbnRfb2Zmc2V0OwotCSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN1YnNlY3Rpb24pOyAKLQkgICAgfQotCSAgLyogTG9va3MgbGlrZSB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJPSAwOwotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT4KLQkJaW5pdGlhbGl6YXRpb25fbGVuZ3RoID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Vic2VjdGlvbik7Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBHb3RvIHRoZSBuZXh0IHNlY3Rpb24uICAqLwotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7IAotICAgIH0KLQotICAvKiBJZiBidWlsZGluZyBhbiBleGVjdXRhYmxlLCB0aGVuIG1ha2Ugc3VyZSB0byBzZWVrIHRvIGFuZCB3cml0ZQotICAgICBvbmUgYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHRvIG1ha2Ugc3VyZSBhbnkgbmVjZXNzYXJ5Ci0gICAgIHplcm9zIGFyZSBmaWxsZWQgaW4uICBVZ2guICAqLwotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgY3VycmVudF9vZmZzZXQgPSBTT01fQUxJR04gKGN1cnJlbnRfb2Zmc2V0LCBQQV9QQUdFU0laRSk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudF9vZmZzZXQgLSAxLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgIiIsIDEsIDEsIGFiZmQpICE9IDEpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT51bmxvYWRhYmxlX3NwX3NpemUKLSAgICA9IGN1cnJlbnRfb2Zmc2V0IC0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnVubG9hZGFibGVfc3BfbG9jYXRpb247Ci0KLSAgLyogTG9hZGVyIGZpeHVwcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBhbnkgd2F5IHNoYXBlIG9yIGZvcm0uICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+bG9hZGVyX2ZpeHVwX2xvY2F0aW9uID0gMDsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmxvYWRlcl9maXh1cF90b3RhbCA9IDA7Ci0KLSAgLyogRG9uZS4gIFN0b3JlIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBTT00gc28gZmFyLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNvbV9sZW5ndGggPSBjdXJyZW50X29mZnNldDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluYWxseSwgc2NyaWJibGUgb3V0IHRoZSB2YXJpb3VzIGhlYWRlcnMgdG8gdGhlIGRpc2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2ZpbmlzaF93cml0aW5nIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBudW1fc3BhY2VzID0gc29tX2NvdW50X3NwYWNlcyAoYWJmZCk7Ci0gIGFzeW1ib2wgKipzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgaW50IGksIG51bV9zeW1zLCBzdHJpbmdzX3NpemU7Ci0gIGludCBzdWJzcGFjZV9pbmRleCA9IDA7Ci0gIGZpbGVfcHRyIGxvY2F0aW9uOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLSAgdW5zaWduZWQgaW50IHRvdGFsX3JlbG9jX3NpemU7Ci0KLSAgLyogTmV4dCBpcyB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlc2UgYXJlIGZpeGVkIGxlbmd0aCByZWNvcmRzLgotCi0gICAgIENvdW50IHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBkZXRlcm1pbmUgaG93IG11Y2ggcm9vbSBpcyBuZWVkZWQKLSAgICAgaW4gdGhlIG9iamVjdCBmaWxlIGZvciB0aGUgc3ltYm9sIHRhYmxlLgotCi0gICAgIFRoZSBuYW1lcyBvZiB0aGUgc3ltYm9scyBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgc3RyaW5nIHRhYmxlLAotICAgICBhbmQgdGhlIGluZGV4IGZvciBlYWNoIHN5bWJvbCBuYW1lIGludG8gdGhlIHN0cmluZyB0YWJsZSBpcyBjb21wdXRlZAotICAgICBiZWxvdy4gIFRoZXJlZm9yZSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIHRoZSBzeW1ib2wgdGFibGUKLSAgICAgYXQgdGhpcyB0aW1lLiAKLQotICAgICBUaGVzZSB1c2VkIHRvIGJlIG91dHB1dCBiZWZvcmUgdGhlIHN1YnNwYWNlIGNvbnRlbnRzLCBidXQgdGhleQotICAgICB3ZXJlIG1vdmVkIGhlcmUgdG8gd29yayBhcm91bmQgYSBzdHVwaWQgYnVnIGluIHRoZSBocHV4IGxpbmtlcgotICAgICAoZml4ZWQgaW4gaHB1eDEwKS4gICovCi0gIGN1cnJlbnRfb2Zmc2V0ID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNvbV9sZW5ndGg7Ci0KLSAgLyogTWFrZSBzdXJlIHdlJ3JlIG9uIGEgd29yZCBib3VuZGFyeS4gICovCi0gIGlmIChjdXJyZW50X29mZnNldCAlIDQpCi0gICAgY3VycmVudF9vZmZzZXQgKz0gKDQgLSAoY3VycmVudF9vZmZzZXQgJSA0KSk7IAotCi0gIG51bV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zeW1ib2xfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN5bWJvbF90b3RhbCA9IG51bV9zeW1zOwotICBjdXJyZW50X29mZnNldCArPSBudW1fc3ltcyAqIHNpemVvZiAoc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCk7Ci0KLSAgLyogTmV4dCBhcmUgdGhlIHN5bWJvbCBzdHJpbmdzLgotICAgICBBbGlnbiB0aGVtIHRvIGEgd29yZCBib3VuZGFyeS4gICovCi0gIGlmIChjdXJyZW50X29mZnNldCAlIDQpCi0gICAgY3VycmVudF9vZmZzZXQgKz0gKDQgLSAoY3VycmVudF9vZmZzZXQgJSA0KSk7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zeW1ib2xfc3RyaW5nc19sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotCi0gIC8qIFNjcmliYmxlIG91dCB0aGUgc3ltYm9sIHN0cmluZ3MuICAqLwotICBpZiAoc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzIChhYmZkLCBjdXJyZW50X29mZnNldCwgc3ltcywKLQkJCQludW1fc3ltcywgJnN0cmluZ3Nfc2l6ZSwKLQkJCQlvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpKQotICAgICAgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlY29yZCB0b3RhbCBzdHJpbmcgdGFibGUgc2l6ZSBpbiBoZWFkZXIgYW5kIHVwZGF0ZSB0aGUKLSAgICAgY3VycmVudCBvZmZzZXQuICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX3N0cmluZ3Nfc2l6ZSA9IHN0cmluZ3Nfc2l6ZTsKLSAgY3VycmVudF9vZmZzZXQgKz0gc3RyaW5nc19zaXplOwotCi0gIC8qIERvIHByZXAgd29yayBiZWZvcmUgaGFuZGxpbmcgZml4dXBzLiAgKi8KLSAgc29tX3ByZXBfZm9yX2ZpeHVwcyAoYWJmZCwKLQkJICAgICAgIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCksCi0JCSAgICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7Ci0KLSAgLyogQXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBpcyB0aGUgZml4dXAgc3RyZWFtIHdoaWNoIHN0YXJ0cyBvbiBhCi0gICAgIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAoY3VycmVudF9vZmZzZXQgJSA0KQotICAgIGN1cnJlbnRfb2Zmc2V0ICs9ICg0IC0gKGN1cnJlbnRfb2Zmc2V0ICUgNCkpOyAKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmZpeHVwX3JlcXVlc3RfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLQotICAvKiBXcml0ZSB0aGUgZml4dXBzIGFuZCB1cGRhdGUgZmllbGRzIGluIHN1YnNwYWNlIGhlYWRlcnMgd2hpY2gKLSAgICAgcmVsYXRlIHRvIHRoZSBmaXh1cCBzdHJlYW0uICAqLwotICBpZiAoc29tX3dyaXRlX2ZpeHVwcyAoYWJmZCwgY3VycmVudF9vZmZzZXQsICZ0b3RhbF9yZWxvY19zaXplKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVjb3JkIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBmaXh1cCBzdHJlYW0gaW4gdGhlIGZpbGUgaGVhZGVyLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmZpeHVwX3JlcXVlc3RfdG90YWwgPSB0b3RhbF9yZWxvY19zaXplOwotCi0gIC8qIERvbmUuICBTdG9yZSB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgU09NLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNvbV9sZW5ndGggPSBjdXJyZW50X29mZnNldCArIHRvdGFsX3JlbG9jX3NpemU7Ci0gCi0gIC8qIE5vdyB0aGF0IHRoZSBzeW1ib2wgdGFibGUgaW5mb3JtYXRpb24gaXMgY29tcGxldGUsIGJ1aWxkIGFuZAotICAgICB3cml0ZSB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKHNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlIChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU3Vic3BhY2VzIGFyZSB3cml0dGVuIGZpcnN0IHNvIHRoYXQgd2UgY2FuIHNldCB1cCBpbmZvcm1hdGlvbgotICAgICBhYm91dCB0aGVtIGluIHRoZWlyIGNvbnRhaW5pbmcgc3BhY2VzIGFzIHRoZSBzdWJzcGFjZSBpcyB3cml0dGVuLiAgKi8KLQotICAvKiBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3Vic3BhY2UgZGljdGlvbmFyeSByZWNvcmRzLiAgKi8KLSAgbG9jYXRpb24gPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3Vic3BhY2VfbG9jYXRpb247Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgbG9jYXRpb24sIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgLyogTm93IGZvciBlYWNoIGxvYWRhYmxlIHNwYWNlIHdyaXRlIG91dCByZWNvcmRzIGZvciBpdHMgc3Vic3BhY2VzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3Vic2VjdGlvbjsKLQotICAgICAgLyogRmluZCBhIHNwYWNlLiAgKi8KLSAgICAgIHdoaWxlICghc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQlzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLQotICAgICAgLyogTm93IGxvb2sgZm9yIGFsbCBpdHMgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGZvciAoc3Vic2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIHN1YnNlY3Rpb24gIT0gTlVMTDsKLQkgICBzdWJzZWN0aW9uID0gc3Vic2VjdGlvbi0+bmV4dCkKLQl7Ci0JICAKLQkgIC8qIFNraXAgYW55IHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHNwYWNlCi0JICAgICBvciBzdWJzcGFjZS4gIE9yIGRvZXMgbm90IGhhdmUgU0VDX0FMTE9DIHNldCAoYW5kIHRoZXJlZm9yZQotCSAgICAgaGFzIG5vIHJlYWwgYml0cyBvbiB0aGUgZGlzaykuICAqLwotCSAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHN1YnNlY3Rpb24pCi0JICAgICAgfHwgIXNvbV9pc19jb250YWluZXIgKHNlY3Rpb24sIHN1YnNlY3Rpb24pCi0JICAgICAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc3Vic3BhY2UgZm9yIHRoaXMgc3BhY2UsIHRoZW4gc2F2ZQotCSAgICAgdGhlIGluZGV4IG9mIHRoZSBzdWJzcGFjZSBpbiBpdHMgY29udGFpbmluZyBzcGFjZS4gIEFsc28KLQkgICAgIHNldCAiaXNfbG9hZGFibGUiIGluIHRoZSBjb250YWluaW5nIHNwYWNlLiAgKi8KLQotCSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zdWJzcGFjZV9xdWFudGl0eSA9PSAwKQotCSAgICB7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPmlzX2xvYWRhYmxlID0gMTsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfaW5kZXgKLQkJPSBzdWJzcGFjZV9pbmRleDsKLQkgICAgfQotCi0JICAvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBzdWJzcGFjZXMgc2VlbiBhbmQgdGhlIG51bWJlciBvZgotCSAgICAgc3Vic3BhY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGN1cnJlbnQgc3BhY2UuICAqLwotCSAgc3Vic3BhY2VfaW5kZXgrKzsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zdWJzcGFjZV9xdWFudGl0eSsrOwotCi0JICAvKiBNYXJrIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzcGFjZSB3aXRoaW4gdGhlIHN1YnNwYWNlJ3MKLQkgICAgIGRpY3Rpb25hcnkgcmVjb3JkLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zcGFjZV9pbmRleCA9IGk7Ci0JICAKLQkgIC8qIER1bXAgdGhlIGN1cnJlbnQgc3Vic3BhY2UgaGVhZGVyLiAgKi8KLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LAotCQkJIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSwgMSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAvKiBHb3RvIHRoZSBuZXh0IHNlY3Rpb24uICAqLwotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7IAotICAgIH0KLQotICAvKiBOb3cgcmVwZWF0IHRoZSBwcm9jZXNzIGZvciB1bmxvYWRhYmxlIHN1YnNwYWNlcy4gICovCi0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgLyogTm93IGZvciBlYWNoIHNwYWNlIHdyaXRlIG91dCByZWNvcmRzIGZvciBpdHMgc3Vic3BhY2VzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3Vic2VjdGlvbjsKLQotICAgICAgLyogRmluZCBhIHNwYWNlLiAgKi8KLSAgICAgIHdoaWxlICghc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQlzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLQotICAgICAgLyogTm93IGxvb2sgZm9yIGFsbCBpdHMgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGZvciAoc3Vic2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIHN1YnNlY3Rpb24gIT0gTlVMTDsKLQkgICBzdWJzZWN0aW9uID0gc3Vic2VjdGlvbi0+bmV4dCkKLQl7Ci0JICAKLQkgIC8qIFNraXAgYW55IHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHNwYWNlIG9yCi0JICAgICBzdWJzcGFjZSwgb3Igd2hpY2ggU0VDX0FMTE9DIHNldCAoYW5kIHRoZXJlZm9yZSBoYW5kbGVkCi0JICAgICBpbiB0aGUgbG9hZGFibGUgc3BhY2VzL3N1YnNwYWNlcyBjb2RlIGFib3ZlKS4gICovCi0KLQkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQotCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKQotCSAgICAgIHx8IChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHN1YnNwYWNlIGZvciB0aGlzIHNwYWNlLCB0aGVuIHNhdmUKLQkgICAgIHRoZSBpbmRleCBvZiB0aGUgc3Vic3BhY2UgaW4gaXRzIGNvbnRhaW5pbmcgc3BhY2UuICBDbGVhcgotCSAgICAgImlzX2xvYWRhYmxlIi4gICovCi0KLQkgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkgPT0gMCkKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pc19sb2FkYWJsZSA9IDA7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX2luZGV4Ci0JCT0gc3Vic3BhY2VfaW5kZXg7Ci0JICAgIH0KLQotCSAgLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygc3Vic3BhY2VzIHNlZW4gYW5kIHRoZSBudW1iZXIgb2YKLQkgICAgIHN1YnNwYWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBjdXJyZW50IHNwYWNlLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zdWJzcGFjZV9xdWFudGl0eSsrOwotCSAgc3Vic3BhY2VfaW5kZXgrKzsgCi0KLQkgIC8qIE1hcmsgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHNwYWNlIHdpdGhpbiB0aGUgc3Vic3BhY2UncwotCSAgICAgZGljdGlvbmFyeSByZWNvcmQuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPnNwYWNlX2luZGV4ID0gaTsKLQkgIAotCSAgLyogRHVtcCB0aGlzIHN1YnNwYWNlIGhlYWRlci4gICovCi0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdCwKLQkJCSBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCksIDEsIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogQWxsIHRoZSBzdWJzcGFjZSBkaWN0aW9uZGFyeSByZWNvcmRzIGFyZSB3cml0dGVuLCBhbmQgYWxsIHRoZQotICAgICBmaWVsZHMgYXJlIHNldCB1cCBpbiB0aGUgc3BhY2UgZGljdGlvbmFyeSByZWNvcmRzLgotCi0gICAgIFNlZWsgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uIGFuZCBzdGFydCB3cml0aW5nIHRoZSBzcGFjZQotICAgICBkaWN0aW9uYXJ5IHJlY29yZHMuICAqLwotICBsb2NhdGlvbiA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zcGFjZV9sb2NhdGlvbjsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBsb2NhdGlvbiwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NwYWNlczsgaSsrKQotICAgIHsKLQotICAgICAgLyogRmluZCBhIHNwYWNlLiAgKi8KLSAgICAgIHdoaWxlICghc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQlzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLQotICAgICAgLyogRHVtcCBpdHMgaGVhZGVyICAqLwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QsCi0JCSAgICAgc2l6ZW9mIChzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OwotICAgIH0KLQotICAvKiBXcml0ZSB0aGUgY29tcGlsYXRpb24gdW5pdCByZWNvcmQgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKG9ial9zb21fY29tcGlsYXRpb25fdW5pdCAoYWJmZCkpCi0gICAgewotICAgICAgbG9jYXRpb24gPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y29tcGlsZXJfbG9jYXRpb247Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxvY2F0aW9uLCBTRUVLX1NFVCkgPCAwKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fY29tcGlsYXRpb25fdW5pdCAoYWJmZCksCi0JCSAgICAgQ09NUFVOSVRTWiwgMSwgYWJmZCkgIT0gQ09NUFVOSVRTWikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTZXR0aW5nIG9mIHRoZSBzeXN0ZW1faWQgaGFzIHRvIGhhcHBlbiB2ZXJ5IGxhdGUgbm93IHRoYXQgY29weWluZyBvZgotICAgICBCRkQgcHJpdmF0ZSBkYXRhIGhhcHBlbnMgKmFmdGVyKiBzZWN0aW9uIGNvbnRlbnRzIGFyZSBzZXQuICAqLwotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgb2JqX3NvbV9maWxlX2hkcihhYmZkKS0+c3lzdGVtX2lkID0gb2JqX3NvbV9leGVjX2RhdGEgKGFiZmQpLT5zeXN0ZW1faWQ7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gcGEyMCkKLSAgICBvYmpfc29tX2ZpbGVfaGRyKGFiZmQpLT5zeXN0ZW1faWQgPSBDUFVfUEFfUklTQzJfMDsKLSAgZWxzZSBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBwYTExKQotICAgIG9ial9zb21fZmlsZV9oZHIoYWJmZCktPnN5c3RlbV9pZCA9IENQVV9QQV9SSVNDMV8xOwotICBlbHNlCi0gICAgb2JqX3NvbV9maWxlX2hkcihhYmZkKS0+c3lzdGVtX2lkID0gQ1BVX1BBX1JJU0MxXzA7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgY2hlY2tzdW0gZm9yIHRoZSBmaWxlIGhlYWRlciBqdXN0IGJlZm9yZSB3cml0aW5nCi0gICAgIHRoZSBoZWFkZXIgdG8gZGlzay4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5jaGVja3N1bSA9IHNvbV9jb21wdXRlX2NoZWNrc3VtIChhYmZkKTsKLQotICAvKiBPbmx5IHRoaW5nIGxlZnQgdG8gZG8gaXMgd3JpdGUgb3V0IHRoZSBmaWxlIGhlYWRlci4gIEl0IGlzIGFsd2F5cwotICAgICBhdCBsb2NhdGlvbiB6ZXJvLiAgU2VlayB0aGVyZSBhbmQgd3JpdGUgaXQuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLAotCQkgc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKSwgMSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGhlYWRlcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3cml0ZSB0aGUgZXhlYyBoZWFkZXIuICAqLwotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgewotICAgICAgbG9uZyB0bXAsIHNvbV9sZW5ndGg7Ci0gICAgICBzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICpleGVjX2hlYWRlcjsKLQotICAgICAgZXhlY19oZWFkZXIgPSBvYmpfc29tX2V4ZWNfaGRyIChhYmZkKTsKLSAgICAgIGV4ZWNfaGVhZGVyLT5leGVjX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgICAgIGV4ZWNfaGVhZGVyLT5leGVjX2ZsYWdzID0gb2JqX3NvbV9leGVjX2RhdGEgKGFiZmQpLT5leGVjX2ZsYWdzOwotCi0gICAgICAvKiBPaCBqb3lzLiAgUmFtIHNvbWUgb2YgdGhlIEJTUyBkYXRhIGludG8gdGhlIERBVEEgc2VjdGlvbgotCSB0byBiZSBjb21wYXRhYmxlIHdpdGggaG93IHRoZSBocCBsaW5rZXIgbWFrZXMgb2JqZWN0cwotCSAoc2F2ZXMgbWVtb3J5IHNwYWNlKS4gICovCi0gICAgICB0bXAgPSBleGVjX2hlYWRlci0+ZXhlY19kc2l6ZTsKLSAgICAgIHRtcCA9IFNPTV9BTElHTiAodG1wLCBQQV9QQUdFU0laRSk7Ci0gICAgICBleGVjX2hlYWRlci0+ZXhlY19ic2l6ZSAtPSAodG1wIC0gZXhlY19oZWFkZXItPmV4ZWNfZHNpemUpOwotICAgICAgaWYgKGV4ZWNfaGVhZGVyLT5leGVjX2JzaXplIDwgMCkKLQlleGVjX2hlYWRlci0+ZXhlY19ic2l6ZSA9IDA7Ci0gICAgICBleGVjX2hlYWRlci0+ZXhlY19kc2l6ZSA9IHRtcDsKLQotICAgICAgLyogTm93IHBlcmZvcm0gc29tZSBzYW5pdHkgY2hlY2tzLiAgVGhlIGlkZWEgaXMgdG8gY2F0Y2ggYm9nb25zIG5vdyBhbmQKLQkgaW5mb3JtIHRoZSB1c2VyLCBpbnN0ZWFkIG9mIHNpbGVudGx5IGdlbmVyYXRpbmcgYSBib2d1cyBmaWxlLiAgKi8KLSAgICAgIHNvbV9sZW5ndGggPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c29tX2xlbmd0aDsKLSAgICAgIGlmIChleGVjX2hlYWRlci0+ZXhlY190ZmlsZSArIGV4ZWNfaGVhZGVyLT5leGVjX3RzaXplID4gc29tX2xlbmd0aAotCSAgfHwgZXhlY19oZWFkZXItPmV4ZWNfZGZpbGUgKyBleGVjX2hlYWRlci0+ZXhlY19kc2l6ZSA+IHNvbV9sZW5ndGgpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX2xvY2F0aW9uLAotCQkgICAgU0VFS19TRVQpIDwgMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGV4ZWNfaGVhZGVyLCBBVVhfSERSX1NJWkUsIDEsIGFiZmQpCi0JICAhPSBBVVhfSERSX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvbXB1dGUgYW5kIHJldHVybiB0aGUgY2hlY2tzdW0gZm9yIGEgU09NIGZpbGUgaGVhZGVyLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXNvbV9jb21wdXRlX2NoZWNrc3VtIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgY2hlY2tzdW0sIGNvdW50LCBpOwotICB1bnNpZ25lZCBsb25nICpidWZmZXIgPSAodW5zaWduZWQgbG9uZyAqKSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKTsKLQotICBjaGVja3N1bSA9IDA7Ci0gIGNvdW50ID0gc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKSAvIHNpemVvZiAodW5zaWduZWQgbG9uZyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIGNoZWNrc3VtIF49ICooYnVmZmVyICsgaSk7Ci0KLSAgcmV0dXJuIGNoZWNrc3VtOwotfQotCi1zdGF0aWMgdm9pZAotc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyAoYWJmZCwgc3ltLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvICppbmZvOwotewotICAvKiBJbml0aWFsaXplLiAgKi8KLSAgbWVtc2V0IChpbmZvLCAwLCBzaXplb2YgKHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbykpOwotCi0gIC8qIFRoZSBIUCBTT00gbGlua2VyIHJlcXVpcmVzIGRldGFpbGVkIHR5cGUgaW5mb3JtYXRpb24gYWJvdXQKLSAgICAgYWxsIHN5bWJvbHMgKGluY2x1ZGluZyB1bmRlZmluZWQgc3ltYm9scyEpLiAgVW5mb3J0dW5hdGVseSwKLSAgICAgdGhlIHR5cGUgc3BlY2lmaWVkIGluIGFuIGltcG9ydC9leHBvcnQgc3RhdGVtZW50IGRvZXMgbm90Ci0gICAgIGFsd2F5cyBtYXRjaCB3aGF0IHRoZSBsaW5rZXIgd2FudHMuICBTZXZlcmUgYnJhaW5kYW1hZ2UuICAqLwotCSAKLSAgLyogU2VjdGlvbiBzeW1ib2xzIHdpbGwgbm90IGhhdmUgYSBTT00gc3ltYm9sIHR5cGUgYXNzaWduZWQgdG8KLSAgICAgdGhlbSB5ZXQuICBBc3NpZ24gYWxsIHNlY3Rpb24gc3ltYm9scyB0eXBlIFNUX0RBVEEuICAqLwotICBpZiAoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0RBVEE7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBDb21tb24gc3ltYm9scyBtdXN0IGhhdmUgc2NvcGUgU1NfVU5TQVQgYW5kIHR5cGUKLQkgU1RfU1RPUkFHRSBvciB0aGUgbGlua2VyIHdpbGwgY2hva2UuICAqLwotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQl7Ci0JICBpbmZvLT5zeW1ib2xfc2NvcGUgPSBTU19VTlNBVDsKLQkgIGluZm8tPnN5bWJvbF90eXBlID0gU1RfU1RPUkFHRTsKLQl9Ci0KLSAgICAgIC8qIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzeW1ib2wgd2l0aG91dCBhbiBhc3NvY2lhdGVkCi0JIHR5cGUuICBUaGlzIGhhcHBlbnMgaWYgdGhlIHVzZXIgaW1wb3J0ZWQgdGhlIHN5bWJvbAotCSB3aXRob3V0IGEgdHlwZSBhbmQgdGhlIHN5bWJvbCB3YXMgbmV2ZXIgZGVmaW5lZAotCSBsb2NhbGx5LiAgSWYgQlNGX0ZVTkNUSU9OIGlzIHNldCBmb3IgdGhpcyBzeW1ib2wsIHRoZW4KLQkgYXNzaWduIGl0IHR5cGUgU1RfQ09ERSAodGhlIEhQIGxpbmtlciByZXF1aXJlcyB1bmRlZmluZWQKLQkgZXh0ZXJuYWwgZnVuY3Rpb25zIHRvIGhhdmUgdHlwZSBTVF9DT0RFIHJhdGhlciB0aGFuIFNUX0VOVFJZKS4gICovCi0gICAgICBlbHNlIGlmICgoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9VTktOT1dOCi0JCXx8IHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQ09ERSkKLQkgICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0JICAgICAgICYmIHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9DT0RFOwotCi0gICAgICAvKiBIYW5kbGUgZnVuY3Rpb24gc3ltYm9scyB3aGljaCB3ZXJlIGRlZmluZWQgaW4gdGhpcyBmaWxlLgotCSBUaGV5IHNob3VsZCBoYXZlIHR5cGUgU1RfRU5UUlkuICBBbHNvIHJldHJpZXZlIHRoZSBhcmd1bWVudAotCSByZWxvY2F0aW9uIGJpdHMgZnJvbSB0aGUgU09NIGJhY2tlbmQgaW5mb3JtYXRpb24uICAqLwotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9FTlRSWQotCSAgICAgICB8fCAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9DT0RFCi0JCSAgICYmIChzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSkKLQkgICAgICAgfHwgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfVU5LTk9XTgotCQkgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikpKQotCXsKLQkgIGluZm8tPnN5bWJvbF90eXBlID0gU1RfRU5UUlk7Ci0JICBpbmZvLT5hcmdfcmVsb2MgPSBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnRjX2RhdGEuYXAuaHBwYV9hcmdfcmVsb2M7Ci0JICBpbmZvLT5wcml2X2xldmVsPSBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnRjX2RhdGEuYXAuaHBwYV9wcml2X2xldmVsOwotCX0KLQotICAgICAgLyogRm9yIHVua25vd24gc3ltYm9scyBzZXQgdGhlIHN5bWJvbCdzIHR5cGUgYmFzZWQgb24gdGhlIHN5bWJvbCdzCi0JIHNlY3Rpb24gKFNUX0RBVEEgZm9yIERBVEEgc2VjdGlvbnMsIFNUX0NPREUgZm9yIENPREUgc2VjdGlvbnMpLiAgKi8KLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfVU5LTk9XTikKLQl7Ci0JICBpZiAoc3ltLT5zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKQotCSAgICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0NPREU7Ci0JICBlbHNlCi0JICAgIGluZm8tPnN5bWJvbF90eXBlID0gU1RfREFUQTsKLQl9Ci0gIAotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9VTktOT1dOKQotCWluZm8tPnN5bWJvbF90eXBlID0gU1RfREFUQTsKLQotICAgICAgLyogRnJvbSBub3cgb24gaXQncyBhIHZlcnkgc2ltcGxlIG1hcHBpbmcuICAqLwotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9BQlNPTFVURSkKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0FCU09MVVRFOwotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9DT0RFKQotCWluZm8tPnN5bWJvbF90eXBlID0gU1RfQ09ERTsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfREFUQSkKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0RBVEE7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX01JTExJQ09ERSkKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX01JTExJQ09ERTsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfUExBQkVMKQotCWluZm8tPnN5bWJvbF90eXBlID0gU1RfUExBQkVMOwotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9QUklfUFJPRykKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX1BSSV9QUk9HOwotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9TRUNfUFJPRykKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX1NFQ19QUk9HOwotICAgIH0KLQkKLSAgLyogTm93IGhhbmRsZSB0aGUgc3ltYm9sJ3Mgc2NvcGUuICBFeHBvcnRlZCBkYXRhIHdoaWNoIGlzIG5vdAotICAgICBpbiB0aGUgY29tbW9uIHNlY3Rpb24gaGFzIHNjb3BlIFNTX1VOSVZFUlNBTC4gIE5vdGUgc2NvcGUKLSAgICAgb2YgY29tbW9uIHN5bWJvbHMgd2FzIGhhbmRsZWQgZWFybGllciEgICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0gICAgaW5mby0+c3ltYm9sX3Njb3BlID0gU1NfVU5TQVQ7Ci0gIGVsc2UgaWYgKHN5bS0+ZmxhZ3MgJiBCU0ZfRVhQT1JUICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotICAgIGluZm8tPnN5bWJvbF9zY29wZSA9IFNTX1VOSVZFUlNBTDsKLSAgLyogQW55dGhpbmcgZWxzZSB3aGljaCBpcyBub3QgaW4gdGhlIGNvbW1vbiBzZWN0aW9uIGhhcyBzY29wZQotICAgICBTU19MT0NBTC4gICovCi0gIGVsc2UgaWYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotICAgIGluZm8tPnN5bWJvbF9zY29wZSA9IFNTX0xPQ0FMOwotCi0gIC8qIE5vdyBzZXQgdGhlIHN5bWJvbF9pbmZvIGZpZWxkLiAgSXQgaGFzIG5vIHJlYWwgbWVhbmluZwotICAgICBmb3IgdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2xzLCBidXQgdGhlIEhQIGxpbmtlciB3aWxsCi0gICAgIGNob2tlIGlmIGl0J3Mgbm90IHNldCB0byBzb21lICJyZWFzb25hYmxlIiB2YWx1ZS4gIFdlCi0gICAgIHVzZSB6ZXJvIGFzIGEgcmVhc29uYWJsZSB2YWx1ZS4gICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotICAgIGluZm8tPnN5bWJvbF9pbmZvID0gMDsKLSAgLyogRm9yIGFsbCBvdGhlciBzeW1ib2xzLCB0aGUgc3ltYm9sX2luZm8gZmllbGQgY29udGFpbnMgdGhlIAotICAgICBzdWJzcGFjZSBpbmRleCBvZiB0aGUgc3BhY2UgdGhpcyBzeW1ib2wgaXMgY29udGFpbmVkIGluLiAgKi8KLSAgZWxzZQotICAgIGluZm8tPnN5bWJvbF9pbmZvID0gc3ltLT5zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0KLSAgLyogU2V0IHRoZSBzeW1ib2wncyB2YWx1ZS4gICovCi0gIGluZm8tPnN5bWJvbF92YWx1ZSA9IHN5bS0+dmFsdWUgKyBzeW0tPnNlY3Rpb24tPnZtYTsKLX0KLQotLyogQnVpbGQgYW5kIHdyaXRlLCBpbiBvbmUgYmlnIGNodW5rLCB0aGUgZW50aXJlIHN5bWJvbCB0YWJsZSBmb3IKLSAgIHRoaXMgQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBudW1fc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBmaWxlX3B0ciBzeW10YWJfbG9jYXRpb24gPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX2xvY2F0aW9uOwotICBhc3ltYm9sICoqYmZkX3N5bXMgPSBvYmpfc29tX3NvcnRlZF9zeW1zIChhYmZkKTsKLSAgc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqc29tX3N5bXRhYiA9IE5VTEw7Ci0gIGludCBpLCBzeW10YWJfc2l6ZTsKLQotICAvKiBDb21wdXRlIHRvdGFsIHN5bWJvbCB0YWJsZSBzaXplIGFuZCBhbGxvY2F0ZSBhIGNodW5rIG9mIG1lbW9yeQotICAgICB0byBob2xkIHRoZSBzeW1ib2wgdGFibGUgYXMgd2UgYnVpbGQgaXQuICAqLwotICBzeW10YWJfc2l6ZSA9IG51bV9zeW1zICogc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkKTsKLSAgc29tX3N5bXRhYiA9IChzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkICopIGJmZF9tYWxsb2MgKHN5bXRhYl9zaXplKTsKLSAgaWYgKHNvbV9zeW10YWIgPT0gTlVMTCAmJiBzeW10YWJfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBtZW1zZXQgKHNvbV9zeW10YWIsIDAsIHN5bXRhYl9zaXplKTsKLQotICAvKiBXYWxrIG92ZXIgZWFjaCBzeW1ib2wuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gaW5mbzsKLQotICAgICAgLyogVGhpcyBpcyByZWFsbHkgYW4gaW5kZXggaW50byB0aGUgc3ltYm9sIHN0cmluZ3MgdGFibGUuICAKLQkgQnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUsIHRoZSBpbmRleCBoYXMgYWxyZWFkeSBiZWVuIAotCSBjb21wdXRlZCBhbmQgc3RvcmVkIGludG8gdGhlIG5hbWUgZmllbGQgaW4gdGhlIEJGRCBzeW1ib2wuICAqLwotICAgICAgc29tX3N5bXRhYltpXS5uYW1lLm5fc3RyeCA9IHNvbV9zeW1ib2xfZGF0YShiZmRfc3ltc1tpXSktPnN0cmluZ3RhYl9vZmZzZXQ7Ci0KLSAgICAgIC8qIERlcml2ZSBTT00gaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIHN5bWJvbC4gICovCi0gICAgICBzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvIChhYmZkLCBiZmRfc3ltc1tpXSwgJmluZm8pOwotCi0gICAgICAvKiBOb3cgdXNlIGl0LiAgKi8KLSAgICAgIHNvbV9zeW10YWJbaV0uc3ltYm9sX3R5cGUgPSBpbmZvLnN5bWJvbF90eXBlOwotICAgICAgc29tX3N5bXRhYltpXS5zeW1ib2xfc2NvcGUgPSBpbmZvLnN5bWJvbF9zY29wZTsKLSAgICAgIHNvbV9zeW10YWJbaV0uYXJnX3JlbG9jID0gaW5mby5hcmdfcmVsb2M7Ci0gICAgICBzb21fc3ltdGFiW2ldLnN5bWJvbF9pbmZvID0gaW5mby5zeW1ib2xfaW5mbzsKLSAgICAgIHNvbV9zeW10YWJbaV0ueGxlYXN0ID0gMzsKLSAgICAgIHNvbV9zeW10YWJbaV0uc3ltYm9sX3ZhbHVlID0gaW5mby5zeW1ib2xfdmFsdWUgfCBpbmZvLnByaXZfbGV2ZWw7Ci0gICAgfQotCi0gIC8qIEV2ZXJ5dGhpbmcgaXMgcmVhZHksIHNlZWsgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uIGFuZAotICAgICBzY3JpYmJsZSBvdXQgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2xvY2F0aW9uLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc29tX3N5bXRhYiwgc3ltdGFiX3NpemUsIDEsIGFiZmQpICE9IHN5bXRhYl9zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChzb21fc3ltdGFiICE9IE5VTEwpCi0gICAgZnJlZSAoc29tX3N5bXRhYik7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHNvbV9zeW10YWIgIT0gTlVMTCkKLSAgICBmcmVlIChzb21fc3ltdGFiKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgaW4gU09NIGZvcm1hdC4gICovICAKLQotc3RhdGljIGJvb2xlYW4KLXNvbV93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCi0gICAgewotICAgICAgLyogU2V0IHVwIGZpeGVkIHBhcnRzIG9mIHRoZSBmaWxlLCBzcGFjZSwgYW5kIHN1YnNwYWNlIGhlYWRlcnMuCi0JIE5vdGlmeSB0aGUgd29ybGQgdGhhdCBvdXRwdXQgaGFzIGJlZ3VuLiAgKi8KLSAgICAgIHNvbV9wcmVwX2hlYWRlcnMgKGFiZmQpOwotICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgICAvKiBTdGFydCB3cml0aW5nIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgaW5jbHVkZSBhbGwgdGhlIHN0cmluZwotCSB0YWJsZXMsIGZpeHVwIHN0cmVhbXMsIGFuZCBvdGhlciBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICAgICAgc29tX2JlZ2luX3dyaXRpbmcgKGFiZmQpOwotICAgIH0KLQotICByZXR1cm4gKHNvbV9maW5pc2hfd3JpdGluZyAoYWJmZCkpOwotfQotCi0MCi0vKiBSZWFkIGFuZCBzYXZlIHRoZSBzdHJpbmcgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBCRkQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3NsdXJwX3N0cmluZ190YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpzdHJpbmd0YWI7Ci0KLSAgLyogVXNlIHRoZSBzYXZlZCB2ZXJzaW9uIGlmIGl0cyBhdmFpbGFibGUuICAqLwotICBpZiAob2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSSBkb24ndCB0aGluayB0aGlzIGNhbiBjdXJyZW50bHkgaGFwcGVuLCBhbmQgSSdtIG5vdCBzdXJlIGl0IHNob3VsZAotICAgICByZWFsbHkgYmUgYW4gZXJyb3IsIGJ1dCBpdCdzIGJldHRlciB0aGFuIGdldHRpbmcgdW5wcmVkaWN0YWJsZSByZXN1bHRzCi0gICAgIGZyb20gdGhlIGhvc3QncyBtYWxsb2Mgd2hlbiBwYXNzZWQgYSBzaXplIG9mIHplcm8uICAqLwotICBpZiAob2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIGFuZCByZWFkIGluIHRoZSBzdHJpbmcgdGFibGUuICAqLwotICBzdHJpbmd0YWIgPSBiZmRfbWFsbG9jIChvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSk7Ci0gIGlmIChzdHJpbmd0YWIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG1lbXNldCAoc3RyaW5ndGFiLCAwLCBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc29tX3N0cl9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICBpZiAoYmZkX3JlYWQgKHN0cmluZ3RhYiwgb2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCksIDEsIGFiZmQpCi0gICAgICAhPSBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU2F2ZSBvdXIgcmVzdWx0cyBhbmQgcmV0dXJuIHN1Y2Nlc3MuICovCi0gIG9ial9zb21fc3RyaW5ndGFiIChhYmZkKSA9IHN0cmluZ3RhYjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIGRhdGEgKGluIGJ5dGVzKSByZXF1aXJlZCB0byBob2xkIHRoZSBzeW1ib2wKLSAgIHRhYmxlIGZvciB0aGlzIG9iamVjdC4gICovCi0KLXN0YXRpYyBsb25nCi1zb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIXNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChhc3ltYm9sICopKTsKLX0KLQotLyogQ29udmVydCBmcm9tIGEgU09NIHN1YnNwYWNlIGluZGV4IHRvIGEgQkZEIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIChhYmZkLCBzeW1ib2wpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqc3ltYm9sOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICAvKiBUaGUgbWVhbmluZyBvZiB0aGUgc3ltYm9sX2luZm8gZmllbGQgY2hhbmdlcyBmb3IgZnVuY3Rpb25zCi0gICAgIHdpdGhpbiBleGVjdXRhYmxlcy4gIFNvIG9ubHkgdXNlIHRoZSBxdWljayBzeW1ib2xfaW5mbyBtYXBwaW5nIGZvcgotICAgICBpbmNvbXBsZXRlIG9iamVjdHMgYW5kIG5vbi1mdW5jdGlvbiBzeW1ib2xzIGluIGV4ZWN1dGFibGVzLiAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMAotICAgICAgfHwgKHN5bWJvbC0+c3ltYm9sX3R5cGUgIT0gU1RfRU5UUlkKLQkgICYmIHN5bWJvbC0+c3ltYm9sX3R5cGUgIT0gU1RfUFJJX1BST0cKLQkgICYmIHN5bWJvbC0+c3ltYm9sX3R5cGUgIT0gU1RfU0VDX1BST0cKLQkgICYmIHN5bWJvbC0+c3ltYm9sX3R5cGUgIT0gU1RfTUlMTElDT0RFKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSBzeW1ib2wtPnN5bWJvbF9pbmZvOwotICAgICAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JaWYgKHNlY3Rpb24tPnRhcmdldF9pbmRleCA9PSBpbmRleCAmJiBzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQotCSAgcmV0dXJuIHNlY3Rpb247Ci0KLSAgICAgIC8qIENvdWxkIGJlIGEgc3ltYm9sIGZyb20gYW4gZXh0ZXJuYWwgbGlicmFyeSAoc3VjaCBhcyBhbiBPTU9TCi0JIHNoYXJlZCBsaWJyYXJ5KS4gIERvbid0IGFib3J0LiAgKi8KLSAgICAgIHJldHVybiBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHZhbHVlID0gc3ltYm9sLT5zeW1ib2xfdmFsdWU7Ci0KLSAgICAgIC8qIEZvciBleGVjdXRhYmxlcyB3ZSB3aWxsIGhhdmUgdG8gdXNlIHRoZSBzeW1ib2wncyBhZGRyZXNzIGFuZAotCSBmaW5kIG91dCB3aGF0IHNlY3Rpb24gd291bGQgY29udGFpbiB0aGF0IGFkZHJlc3MuICAgWXVrLiAgKi8KLSAgICAgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLQl7Ci0JICBpZiAodmFsdWUgPj0gc2VjdGlvbi0+dm1hCi0JICAgICAgJiYgdmFsdWUgPD0gc2VjdGlvbi0+dm1hICsgc2VjdGlvbi0+X2Nvb2tlZF9zaXplCi0JICAgICAgJiYgc29tX2lzX3N1YnNwYWNlIChzZWN0aW9uKSkKLQkgICAgcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0gICAgICAvKiBDb3VsZCBiZSBhIHN5bWJvbCBmcm9tIGFuIGV4dGVybmFsIGxpYnJhcnkgKHN1Y2ggYXMgYW4gT01PUwotCSBzaGFyZWQgbGlicmFyeSkuICBEb24ndCBhYm9ydC4gICovCi0gICAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotICAgIH0KLX0KLQotLyogUmVhZCBhbmQgc2F2ZSB0aGUgc3ltYm9sIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gQkZELiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotc29tX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgc3ltYm9sX2NvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIGludCBzeW1zaXplID0gc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkKTsKLSAgY2hhciAqc3RyaW5ndGFiOwotICBzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkICpidWYgPSBOVUxMLCAqYnVmcCwgKmVuZGJ1ZnA7Ci0gIHNvbV9zeW1ib2xfdHlwZSAqc3ltLCAqc3ltYmFzZTsKLQotICAvKiBSZXR1cm4gc2F2ZWQgdmFsdWUgaWYgaXQgZXhpc3RzLiAgKi8KLSAgaWYgKG9ial9zb21fc3ltdGFiIChhYmZkKSAhPSBOVUxMKQotICAgIGdvdG8gc3VjY2Vzc2Z1bF9yZXR1cm47Ci0KLSAgLyogU3BlY2lhbCBjYXNlLiAgVGhpcyBpcyAqbm90KiBhbiBlcnJvci4gICovCi0gIGlmIChzeW1ib2xfY291bnQgPT0gMCkKLSAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotCi0gIGlmICghc29tX3NsdXJwX3N0cmluZ190YWJsZSAoYWJmZCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3RyaW5ndGFiID0gb2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpOwotCi0gIHN5bWJhc2UgPSAoKHNvbV9zeW1ib2xfdHlwZSAqKQotCSAgICAgYmZkX21hbGxvYyAoc3ltYm9sX2NvdW50ICogc2l6ZW9mIChzb21fc3ltYm9sX3R5cGUpKSk7Ci0gIGlmIChzeW1iYXNlID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG1lbXNldCAoc3ltYmFzZSwgMCwgc3ltYm9sX2NvdW50ICogc2l6ZW9mIChzb21fc3ltYm9sX3R5cGUpKTsKLQotICAvKiBSZWFkIGluIHRoZSBleHRlcm5hbCBTT00gcmVwcmVzZW50YXRpb24uICAqLwotICBidWYgPSBiZmRfbWFsbG9jIChzeW1ib2xfY291bnQgKiBzeW1zaXplKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMICYmIHN5bWJvbF9jb3VudCAqIHN5bXNpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc29tX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKGJmZF9yZWFkIChidWYsIHN5bWJvbF9jb3VudCAqIHN5bXNpemUsIDEsIGFiZmQpIAotICAgICAgIT0gc3ltYm9sX2NvdW50ICogc3ltc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSBzeW1ib2xzIGFuZCBpbnRlcm5hbGl6ZSB0aGVtLiAgKi8KLSAgZW5kYnVmcCA9IGJ1ZiArIHN5bWJvbF9jb3VudDsKLSAgZm9yIChidWZwID0gYnVmLCBzeW0gPSBzeW1iYXNlOyBidWZwIDwgZW5kYnVmcDsgKytidWZwKQotICAgIHsKLQotICAgICAgLyogSSBkb24ndCB0aGluayB3ZSBjYXJlIGFib3V0IHRoZXNlLiAgKi8KLSAgICAgIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9TWU1fRVhUCi0JICB8fCBidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9BUkdfRVhUKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZXQgc29tZSBwcml2YXRlIGRhdGEgd2UgY2FyZSBhYm91dC4gICovCi0gICAgICBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfTlVMTCkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfVU5LTk9XTjsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX0FCU09MVVRFKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9BQlNPTFVURTsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX0RBVEEpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX0RBVEE7Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9DT0RFKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9DT0RFOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfUFJJX1BST0cpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1BSSV9QUk9HOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfU0VDX1BST0cpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1NFQ19QUk9HOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfRU5UUlkpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX0VOVFJZOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfTUlMTElDT0RFKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9NSUxMSUNPREU7Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9QTEFCRUwpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1BMQUJFTDsKLSAgICAgIGVsc2UKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfVU5LTk9XTjsKLSAgICAgIHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYyA9IGJ1ZnAtPmFyZ19yZWxvYzsKLQotICAgICAgLyogU29tZSByZWFzb25hYmxlIGRlZmF1bHRzLiAgKi8KLSAgICAgIHN5bS0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICAgICAgc3ltLT5zeW1ib2wubmFtZSA9IGJ1ZnAtPm5hbWUubl9zdHJ4ICsgc3RyaW5ndGFiOwotICAgICAgc3ltLT5zeW1ib2wudmFsdWUgPSBidWZwLT5zeW1ib2xfdmFsdWU7Ci0gICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gMDsKLSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzID0gMDsKLQotICAgICAgc3dpdGNoIChidWZwLT5zeW1ib2xfdHlwZSkKLQl7Ci0JY2FzZSBTVF9FTlRSWToKLQljYXNlIFNUX01JTExJQ09ERToKLQkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgIHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+dGNfZGF0YS5hcC5ocHBhX3ByaXZfbGV2ZWwgPQotCSAgICBzeW0tPnN5bWJvbC52YWx1ZSAmIDB4MzsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlICY9IH4weDM7Ci0JICBicmVhazsKLQotCWNhc2UgU1RfU1RVQjoKLQljYXNlIFNUX0NPREU6Ci0JY2FzZSBTVF9QUklfUFJPRzoKLQljYXNlIFNUX1NFQ19QUk9HOgotCSAgc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbCA9Ci0JICAgIHN5bS0+c3ltYm9sLnZhbHVlICYgMHgzOwotCSAgc3ltLT5zeW1ib2wudmFsdWUgJj0gfjB4MzsKLQkgIC8qIElmIHRoZSBzeW1ib2wncyBzY29wZSBpcyBTU19VTlNBVCwgdGhlbiB0aGVzZSBhcmUKLQkgICAgIHVuZGVmaW5lZCBmdW5jdGlvbiBzeW1ib2xzLiAgKi8KLQkgIGlmIChidWZwLT5zeW1ib2xfc2NvcGUgPT0gU1NfVU5TQVQpCi0JICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgICAgIAotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogSGFuZGxlIHNjb3BpbmcgYW5kIHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLwotICAgICAgc3dpdGNoIChidWZwLT5zeW1ib2xfc2NvcGUpCi0JewotCS8qIHN5bWJvbF9pbmZvIGZpZWxkIGlzIHVuZGVmaW5lZCBmb3IgU1NfRVhURVJOQUwgYW5kIFNTX1VOU0FUIHN5bWJvbHMsCi0JICAgc28gdGhlIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3ltYm9sIGNhbid0IGJlIGtub3duLiAgKi8KLQljYXNlIFNTX0VYVEVSTkFMOgotCSAgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlICE9IFNUX1NUT1JBR0UpCi0JICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IChCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTCk7Ci0JICBicmVhazsKLQotCWNhc2UgU1NfVU5TQVQ6Ci0JICBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgIT0gU1RfU1RPUkFHRSkKLQkgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFNTX1VOSVZFUlNBTDoKLQkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IChCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTCk7Ci0JICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIChhYmZkLCBidWZwKTsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlIC09IHN5bS0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCi0jaWYgMAotCS8qIFNTX0dMT0JBTCBhbmQgU1NfTE9DQUwgYXJlIHR3byBuYW1lcyBmb3IgdGhlIHNhbWUgdGhpbmcuCi0JICAgU291bmQgZHVtYj8gIEl0IGlzLiAgKi8KLQljYXNlIFNTX0dMT0JBTDoKLSNlbmRpZgotCWNhc2UgU1NfTE9DQUw6Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0JICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIChhYmZkLCBidWZwKTsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlIC09IHN5bS0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogTWFyayBzZWN0aW9uIHN5bWJvbHMgYW5kIHN5bWJvbHMgdXNlZCBieSB0aGUgZGVidWdnZXIuCi0JIE5vdGUgJFNUQVJUJCBpcyBhIG1hZ2ljIGNvZGUgc3ltYm9sLCBOT1QgYSBzZWN0aW9uIHN5bWJvbC4gICovCi0gICAgICBpZiAoc3ltLT5zeW1ib2wubmFtZVswXSA9PSAnJCcKLQkgICYmIHN5bS0+c3ltYm9sLm5hbWVbc3RybGVuIChzeW0tPnN5bWJvbC5uYW1lKSAtIDFdID09ICckJwotCSAgJiYgIXN0cmNtcCAoc3ltLT5zeW1ib2wubmFtZSwgc3ltLT5zeW1ib2wuc2VjdGlvbi0+bmFtZSkpCi0Jc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX1NFQ1RJT05fU1lNOwotICAgICAgZWxzZSBpZiAoIXN0cm5jbXAgKHN5bS0+c3ltYm9sLm5hbWUsICJMJDBcMDAyIiwgNCkpCi0JewotCSAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX1NFQ1RJT05fU1lNOwotCSAgc3ltLT5zeW1ib2wubmFtZSA9IHN5bS0+c3ltYm9sLnNlY3Rpb24tPm5hbWU7Ci0JfQotICAgICAgZWxzZSBpZiAoIXN0cm5jbXAgKHN5bS0+c3ltYm9sLm5hbWUsICJMJDBcMDAxIiwgNCkpCi0Jc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLQotICAgICAgLyogTm90ZSBpbmNyZW1lbnQgYXQgYm90dG9tIG9mIGxvb3AsIHNpbmNlIHdlIHNraXAgc29tZSBzeW1ib2xzCi0gICAgICAgICB3ZSBjYW4gbm90IGluY2x1ZGUgaXQgYXMgcGFydCBvZiB0aGUgZm9yIHN0YXRlbWVudC4gICovCi0gICAgICBzeW0rKzsKLSAgICB9Ci0KLSAgLyogV2UgbW9kaWZ5IHRoZSBzeW1ib2wgY291bnQgdG8gcmVjb3JkIHRoZSBudW1iZXIgb2YgQkZEIHN5bWJvbHMgd2UKLSAgICAgY3JlYXRlZC4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gc3ltIC0gc3ltYmFzZTsKLQotICAvKiBTYXZlIG91ciByZXN1bHRzIGFuZCByZXR1cm4gc3VjY2Vzcy4gICovCi0gIG9ial9zb21fc3ltdGFiIChhYmZkKSA9IHN5bWJhc2U7Ci0gc3VjY2Vzc2Z1bF9yZXR1cm46Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gKHRydWUpOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBDYW5vbmljYWxpemUgYSBTT00gc3ltYm9sIHRhYmxlLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcwotICAgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1zb21fZ2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmxvY2F0aW9uOwotewotICBpbnQgaTsKLSAgc29tX3N5bWJvbF90eXBlICpzeW1iYXNlOwotCi0gIGlmICghc29tX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGkgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgc3ltYmFzZSA9IG9ial9zb21fc3ltdGFiIChhYmZkKTsKLQotICBmb3IgKDsgaSA+IDA7IGktLSwgbG9jYXRpb24rKywgc3ltYmFzZSsrKQotICAgICpsb2NhdGlvbiA9ICZzeW1iYXNlLT5zeW1ib2w7Ci0KLSAgLyogRmluYWwgbnVsbCBwb2ludGVyLiAgKi8KLSAgKmxvY2F0aW9uID0gMDsKLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7Ci19Ci0KLS8qIE1ha2UgYSBTT00gc3ltYm9sLiAgVGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqCi1zb21fbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc29tX3N5bWJvbF90eXBlICpuZXcgPQotICAoc29tX3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc29tX3N5bWJvbF90eXBlKSk7Ci0gIGlmIChuZXcgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0KLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotLyogUHJpbnQgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXNvbV9wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYWZpbGU7Ci0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGZwcmludGYgKGZpbGUsICJzb20gIik7Ci0gICAgICBmcHJpbnRmX3ZtYSAoZmlsZSwgc3ltYm9sLT52YWx1ZSk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICVseCIsIChsb25nKSBzeW1ib2wtPmZsYWdzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICB7Ci0JQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lOwotCXNlY3Rpb25fbmFtZSA9IHN5bWJvbC0+c2VjdGlvbiA/IHN5bWJvbC0+c2VjdGlvbi0+bmFtZSA6ICIoKm5vbmUqKSI7Ci0JYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLQlmcHJpbnRmIChmaWxlLCAiICVzXHQlcyIsIHNlY3Rpb25fbmFtZSwgc3ltYm9sLT5uYW1lKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIChuYW1lWzBdID09ICdMJyAmJiBuYW1lWzFdID09ICckJyk7Ci19Ci0KLS8qIENvdW50IG9yIHByb2Nlc3MgdmFyaWFibGUtbGVuZ3RoIFNPTSBmaXh1cCByZWNvcmRzLgotCi0gICBUbyBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uIHdlIHVzZSB0aGlzIGNvZGUgYm90aCB0byBjb21wdXRlIHRoZSBudW1iZXIKLSAgIG9mIHJlbG9jYXRpb25zIHJlcXVlc3RlZCBieSBhIHN0cmVhbSwgYW5kIHRvIGludGVybmFsaXplIHRoZSBzdHJlYW0uCi0KLSAgIFdoZW4gY29tcHV0aW5nIHRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgcmVxdWVzdGVkIGJ5IGEgc3RyZWFtIHRoZQotICAgdmFyaWFibGVzIHJwdHIsIHNlY3Rpb24sIGFuZCBzeW1ib2xzIGhhdmUgbm8gbWVhbmluZy4KLQotICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgcmVxdWVzdGVkIGJ5IHRoZSBmaXh1cCBzdHJlYW0uICBXaGVuCi0gICBub3QganVzdCBjb3VudGluZyAKLQotICAgVGhpcyBuZWVkcyBhdCBsZWFzdCB0d28gb3IgdGhyZWUgbW9yZSBwYXNzZXMgdG8gZ2V0IGl0IGNsZWFuZWQgdXAuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1zb21fc2V0X3JlbG9jX2luZm8gKGZpeHVwLCBlbmQsIGludGVybmFsX3JlbG9jcywgc2VjdGlvbiwgc3ltYm9scywganVzdF9jb3VudCkKLSAgICAgdW5zaWduZWQgY2hhciAqZml4dXA7Ci0gICAgIHVuc2lnbmVkIGludCBlbmQ7Ci0gICAgIGFyZWxlbnQgKmludGVybmFsX3JlbG9jczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGp1c3RfY291bnQ7Ci17Ci0gIHVuc2lnbmVkIGludCBvcCwgdmFybmFtZSwgZGVhbGxvY2F0ZV9jb250ZW50cyA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIgKmVuZF9maXh1cHMgPSAmZml4dXBbZW5kXTsKLSAgY29uc3Qgc3RydWN0IGZpeHVwX2Zvcm1hdCAqZnA7Ci0gIGNoYXIgKmNwOwotICB1bnNpZ25lZCBjaGFyICpzYXZlX2ZpeHVwOwotICBpbnQgdmFyaWFibGVzWzI2XSwgc3RhY2tbMjBdLCBjLCB2LCBjb3VudCwgcHJldl9maXh1cCwgKnNwLCBzYXZlZF91bndpbmRfYml0czsKLSAgY29uc3QgaW50ICpzdWJvcDsKLSAgYXJlbGVudCAqcnB0cj0gaW50ZXJuYWxfcmVsb2NzOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKLQotI2RlZmluZQl2YXIoYykJCXZhcmlhYmxlc1soYykgLSAnQSddCi0jZGVmaW5lCXB1c2godikJCSgqc3ArKyA9ICh2KSkKLSNkZWZpbmUJcG9wKCkJCSgqLS1zcCkKLSNkZWZpbmUJZW1wdHlzdGFjaygpCShzcCA9PSBzdGFjaykKLQotICBzb21faW5pdGlhbGl6ZV9yZWxvY19xdWV1ZSAocmVsb2NfcXVldWUpOwotICBtZW1zZXQgKHZhcmlhYmxlcywgMCwgc2l6ZW9mICh2YXJpYWJsZXMpKTsKLSAgbWVtc2V0IChzdGFjaywgMCwgc2l6ZW9mIChzdGFjaykpOwotICBjb3VudCA9IDA7Ci0gIHByZXZfZml4dXAgPSAwOwotICBzYXZlZF91bndpbmRfYml0cyA9IDA7Ci0gIHNwID0gc3RhY2s7Ci0KLSAgd2hpbGUgKGZpeHVwIDwgZW5kX2ZpeHVwcykKLSAgICB7Ci0KLSAgICAgIC8qIFNhdmUgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhpcyBmaXh1cC4gIFdlJ2xsIHVzZQotCSBpdCBsYXRlciB0byBkZXRlcm1pbmUgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIHB1dCB0aGlzIGZpeHVwCi0JIG9uIHRoZSBxdWV1ZS4gICovCi0gICAgICBzYXZlX2ZpeHVwID0gZml4dXA7Ci0KLSAgICAgIC8qIEdldCB0aGUgZml4dXAgY29kZSBhbmQgaXRzIGFzc29jaWF0ZWQgZm9ybWF0LiAgKi8KLSAgICAgIG9wID0gKmZpeHVwKys7Ci0gICAgICBmcCA9ICZzb21fZml4dXBfZm9ybWF0c1tvcF07Ci0KLSAgICAgIC8qIEhhbmRsZSBhIHJlcXVlc3QgZm9yIGEgcHJldmlvdXMgZml4dXAuICAqLwotICAgICAgaWYgKCpmcC0+Zm9ybWF0ID09ICdQJykKLQl7Ci0JICAvKiBHZXQgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcmV2IGZpeHVwLCBtb3ZlCi0JICAgICB0aGUgcmVwZWF0ZWQgZml4dXAgdG8gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLiAgKi8KLQkgIGZpeHVwID0gcmVsb2NfcXVldWVbZnAtPkRdLnJlbG9jOwotCSAgc29tX3JlbG9jX3F1ZXVlX2ZpeCAocmVsb2NfcXVldWUsIGZwLT5EKTsKLQkgIHByZXZfZml4dXAgPSAxOwotCi0JICAvKiBHZXQgdGhlIGZpeHVwIGNvZGUgYW5kIGl0cyBhc3NvY2lhdGVkIGZvcm1hdC4gICovCi0JICBvcCA9ICpmaXh1cCsrOwotCSAgZnAgPSAmc29tX2ZpeHVwX2Zvcm1hdHNbb3BdOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBmaXh1cCB3aWxsIGJlIHBhc3NlZCB0byBCRkQsIHNldCBzb21lIHJlYXNvbmFibGUgZGVmYXVsdHMuICAqLwotICAgICAgaWYgKCEganVzdF9jb3VudAotCSAgJiYgc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgIT0gUl9OT19SRUxPQ0FUSU9OCi0JICAmJiBzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSAhPSBSX0RBVEFfT1ZFUlJJREUpCi0JewotCSAgcnB0ci0+YWRkcmVzcyA9IG9mZnNldDsKLQkgIHJwdHItPmhvd3RvID0gJnNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXTsKLQkgIHJwdHItPmFkZGVuZCA9IDA7Ci0JICBycHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCX0KLQotICAgICAgLyogU2V0IGRlZmF1bHQgaW5wdXQgbGVuZ3RoIHRvIDAuICBHZXQgdGhlIG9wY29kZSBjbGFzcyBpbmRleAotCSBpbnRvIEQuICAqLwotICAgICAgdmFyICgnTCcpID0gMDsKLSAgICAgIHZhciAoJ0QnKSA9IGZwLT5EOwotICAgICAgdmFyICgnVScpID0gc2F2ZWRfdW53aW5kX2JpdHM7Ci0KLSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlIGZvcm1hdC4gICovCi0gICAgICBjcCA9IGZwLT5mb3JtYXQ7Ci0KLSAgICAgIC8qIFByb2Nlc3MgdGhlIGZvcm1hdCBzdHJpbmcuICBQYXJzaW5nIGhhcHBlbnMgaW4gdHdvIHBoYXNlcywKLQkgcGFyc2UgUkhTLCB0aGVuIGFzc2lnbiB0byBMSFMuICBSZXBlYXQgdW50aWwgbm8gbW9yZSAKLQkgY2hhcmFjdGVycyBpbiB0aGUgZm9ybWF0IHN0cmluZy4gICovCi0gICAgICB3aGlsZSAoKmNwKQotCXsKLQkgIC8qIFRoZSB2YXJpYWJsZSB0aGlzIHBhc3MgaXMgZ29pbmcgdG8gY29tcHV0ZSBhIHZhbHVlIGZvci4gICovCi0JICB2YXJuYW1lID0gKmNwKys7Ci0KLQkgIC8qIFN0YXJ0IHByb2Nlc3NpbmcgUkhTLiAgQ29udGludWUgdW50aWwgYSBOVUxMIG9yICc9JyBpcyBmb3VuZC4gICovCi0JICBkbwotCSAgICB7Ci0JICAgICAgYyA9ICpjcCsrOwotCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIHZhcmlhYmxlLCBwdXNoIGl0IG9uIHRoZSBzdGFjay4gICovCi0JICAgICAgaWYgKGlzdXBwZXIgKGMpKQotCQlwdXNoICh2YXIgKGMpKTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBsb3dlciBjYXNlIGxldHRlciwgdGhlbiBpdCByZXByZXNlbnRzCi0JCSBhZGRpdGlvbmFsIGRhdGEgZnJvbSB0aGUgZml4dXAgc3RyZWFtIHRvIGJlIHB1c2hlZCBvbnRvCi0JCSB0aGUgc3RhY2suICAqLwotCSAgICAgIGVsc2UgaWYgKGlzbG93ZXIgKGMpKQotCQl7Ci0JCSAgaW50IGJpdHMgPSAoYyAtICdhJykgKiA4OwotCQkgIGZvciAodiA9IDA7IGMgPiAnYSc7IC0tYykKLQkJICAgIHYgPSAodiA8PCA4KSB8ICpmaXh1cCsrOwotCQkgIGlmICh2YXJuYW1lID09ICdWJykKLQkJICAgIHYgPSBzaWduX2V4dGVuZCAodiwgYml0cyk7Ci0JCSAgcHVzaCAodik7Ci0JCX0KLQotCSAgICAgIC8qIEEgZGVjaW1hbCBjb25zdGFudC4gIFB1c2ggaXQgb24gdGhlIHN0YWNrLiAgKi8KLQkgICAgICBlbHNlIGlmIChpc2RpZ2l0IChjKSkKLQkJewotCQkgIHYgPSBjIC0gJzAnOwotCQkgIHdoaWxlIChpc2RpZ2l0ICgqY3ApKQotCQkgICAgdiA9ICh2ICogMTApICsgKCpjcCsrIC0gJzAnKTsKLQkJICBwdXNoICh2KTsKLQkJfQotCSAgICAgIGVsc2UKLQotCQkvKiBBbiBvcGVyYXRvci4gIFBvcCB0d28gdHdvIHZhbHVlcyBmcm9tIHRoZSBzdGFjayBhbmQKLQkJICAgdXNlIHRoZW0gYXMgb3BlcmFuZHMgdG8gdGhlIGdpdmVuIG9wZXJhdGlvbi4gIFB1c2gKLQkJICAgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIGJhY2sgb24gdGhlIHN0YWNrLiAgKi8KLQkJc3dpdGNoIChjKQotCQkgIHsKLQkJICBjYXNlICcrJzoKLQkJICAgIHYgPSBwb3AgKCk7Ci0JCSAgICB2ICs9IHBvcCAoKTsKLQkJICAgIHB1c2ggKHYpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAnKic6Ci0JCSAgICB2ID0gcG9wICgpOwotCQkgICAgdiAqPSBwb3AgKCk7Ci0JCSAgICBwdXNoICh2KTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgJzwnOgotCQkgICAgdiA9IHBvcCAoKTsKLQkJICAgIHYgPSBwb3AgKCkgPDwgdjsKLQkJICAgIHB1c2ggKHYpOwotCQkgICAgYnJlYWs7Ci0JCSAgZGVmYXVsdDoKLQkJICAgIGFib3J0ICgpOwotCQkgIH0KLQkgICAgfQotCSAgd2hpbGUgKCpjcCAmJiAqY3AgIT0gJz0nKTsKLQotCSAgLyogTW92ZSBvdmVyIHRoZSBlcXVhbCBvcGVyYXRvci4gICovCi0JICBjcCsrOwotCi0JICAvKiBQb3AgdGhlIFJIUyBvZmYgdGhlIHN0YWNrLiAgKi8KLQkgIGMgPSBwb3AgKCk7Ci0KLQkgIC8qIFBlcmZvcm0gdGhlIGFzc2lnbm1lbnQuICAqLwotCSAgdmFyICh2YXJuYW1lKSA9IGM7Ci0KLQkgIC8qIEhhbmRsZSBzaWRlIGVmZmVjdHMuIGFuZCBzcGVjaWFsICdPJyBzdGFjayBjYXNlcy4gICovCi0JICBzd2l0Y2ggKHZhcm5hbWUpCi0JICAgIHsKLQkgICAgLyogQ29uc3VtZSBzb21lIGJ5dGVzIGZyb20gdGhlIGlucHV0IHNwYWNlLiAgKi8KLQkgICAgY2FzZSAnTCc6Ci0JICAgICAgb2Zmc2V0ICs9IGM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIC8qIEEgc3ltYm9sIHRvIHVzZSBpbiB0aGUgcmVsb2NhdGlvbi4gIE1ha2UgYSBub3RlCi0JICAgICAgIG9mIHRoaXMgaWYgd2UgYXJlIG5vdCBqdXN0IGNvdW50aW5nLiAgKi8KLQkgICAgY2FzZSAnUyc6Ci0JICAgICAgaWYgKCEganVzdF9jb3VudCkKLQkJcnB0ci0+c3ltX3B0cl9wdHIgPSAmc3ltYm9sc1tjXTsKLQkgICAgICBicmVhazsKLQkgICAgLyogQXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIGZvciBhIGZ1bmN0aW9uIGNhbGwuICAqLwotCSAgICBjYXNlICdSJzoKLQkgICAgICBpZiAoISBqdXN0X2NvdW50KQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IHRtcCA9IHZhciAoJ1InKTsKLQkJICBycHRyLT5hZGRlbmQgPSAwOwotCi0JCSAgaWYgKChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX1BDUkVMX0NBTEwKLQkJICAgICAgICYmIFJfUENSRUxfQ0FMTCArIDEwID4gb3ApCi0JCSAgICAgIHx8IChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX0FCU19DQUxMCi0JCQkgICYmIFJfQUJTX0NBTEwgKyAxMCA+IG9wKSkKLQkJICAgIHsKLQkJICAgICAgLyogU2ltcGxlIGVuY29kaW5nLiAgKi8KLQkJICAgICAgaWYgKHRtcCA+IDQpCi0JCQl7Ci0JCQkgIHRtcCAtPSA1OwotCQkJICBycHRyLT5hZGRlbmQgfD0gMTsKLQkJCX0KLQkJICAgICAgaWYgKHRtcCA9PSA0KQotCQkJcnB0ci0+YWRkZW5kIHw9IDEgPDwgOCB8IDEgPDwgNiB8IDEgPDwgNCB8IDEgPDwgMjsKLQkJICAgICAgZWxzZSBpZiAodG1wID09IDMpCi0JCQlycHRyLT5hZGRlbmQgfD0gMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0OwotCQkgICAgICBlbHNlIGlmICh0bXAgPT0gMikKLQkJCXJwdHItPmFkZGVuZCB8PSAxIDw8IDggfCAxIDw8IDY7Ci0JCSAgICAgIGVsc2UgaWYgKHRtcCA9PSAxKQotCQkJcnB0ci0+YWRkZW5kIHw9IDEgPDwgODsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHVuc2lnbmVkIGludCB0bXAxLCB0bXAyOwotCi0JCSAgICAgIC8qIEZpcnN0IHBhcnQgaXMgZWFzeSAtLSBsb3cgb3JkZXIgdHdvIGJpdHMgYXJlCi0JCQkgZGlyZWN0bHkgY29waWVkLCB0aGVuIHNoaWZ0ZWQgYXdheS4gICovCi0JCSAgICAgIHJwdHItPmFkZGVuZCA9IHRtcCAmIDB4MzsKLQkJICAgICAgdG1wID4+PSAyOwotCi0JCSAgICAgIC8qIERpdmluZyB0aGUgcmVzdWx0IGJ5IDEwIGdpdmVzIHVzIHRoZSBzZWNvbmQKLQkJCSBwYXJ0LiAgSWYgaXQgaXMgOSwgdGhlbiB0aGUgZmlyc3QgdHdvIHdvcmRzCi0JCQkgYXJlIGEgZG91YmxlIHByZWNpc2lvbiBwYXJhbWF0ZXIsIGVsc2UgaXQgaXMKLQkJCSAzICogdGhlIGZpcnN0IGFyZyBiaXRzICsgdGhlIDJuZCBhcmcgYml0cy4gICovCi0JCSAgICAgIHRtcDEgPSB0bXAgLyAxMDsKLQkJICAgICAgdG1wIC09IHRtcDEgKiAxMDsKLQkJICAgICAgaWYgKHRtcDEgPT0gOSkKLQkJCXJwdHItPmFkZGVuZCArPSAoMHhlIDw8IDYpOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIC8qIEdldCB0aGUgdHdvIHBpZWNlcy4gICovCi0JCQkgIHRtcDIgPSB0bXAxIC8gMzsKLQkJCSAgdG1wMSAtPSB0bXAyICogMzsKLQkJCSAgLyogUHV0IHRoZW0gaW4gdGhlIGFkZGVuZC4gICovCi0JCQkgIHJwdHItPmFkZGVuZCArPSAodG1wMiA8PCA4KSArICh0bXAxIDw8IDYpOwotCQkJfQotCi0JCSAgICAgIC8qIFdoYXQncyBsZWZ0IGlzIHRoZSB0aGlyZCBwYXJ0LiAgSXQncyB1bnBhY2tlZAotCQkJIGp1c3QgbGlrZSB0aGUgc2Vjb25kLiAgKi8KLQkJICAgICAgaWYgKHRtcCA9PSA5KQotCQkJcnB0ci0+YWRkZW5kICs9ICgweGUgPDwgMik7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgdG1wMiA9IHRtcCAvIDM7Ci0JCQkgIHRtcCAtPSB0bXAyICogMzsKLQkJCSAgcnB0ci0+YWRkZW5kICs9ICh0bXAyIDw8IDQpICsgKHRtcCA8PCAyKTsKLQkJCX0KLQkJICAgIH0KLQkJICBycHRyLT5hZGRlbmQgPSBIUFBBX1JfQURERU5EIChycHRyLT5hZGRlbmQsIDApOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIC8qIEhhbmRsZSB0aGUgbGlua2VyIGV4cHJlc3Npb24gc3RhY2suICAqLwotCSAgICBjYXNlICdPJzoKLQkgICAgICBzd2l0Y2ggKG9wKQotCQl7Ci0JCWNhc2UgUl9DT01QMToKLQkJICBzdWJvcCA9IGNvbXAxX29wY29kZXM7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUl9DT01QMjoKLQkJICBzdWJvcCA9IGNvbXAyX29wY29kZXM7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUl9DT01QMzoKLQkJICBzdWJvcCA9IGNvbXAzX29wY29kZXM7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICB3aGlsZSAoKnN1Ym9wIDw9ICh1bnNpZ25lZCBjaGFyKSBjKQotCQkrK3N1Ym9wOwotCSAgICAgIC0tc3Vib3A7Ci0JICAgICAgYnJlYWs7Ci0JICAgIC8qIFRoZSBsb3dlciAzMnVud2luZCBiaXRzIG11c3QgYmUgcGVyc2lzdGVudC4gICovCi0JICAgIGNhc2UgJ1UnOgotCSAgICAgIHNhdmVkX3Vud2luZF9iaXRzID0gdmFyICgnVScpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHdlIHVzZWQgYSBwcmV2aW91cyBmaXh1cCwgY2xlYW4gdXAgYWZ0ZXIgaXQuICAqLwotICAgICAgaWYgKHByZXZfZml4dXApCi0JewotCSAgZml4dXAgPSBzYXZlX2ZpeHVwICsgMTsKLQkgIHByZXZfZml4dXAgPSAwOwotCX0KLSAgICAgIC8qIFF1ZXVlIGl0LiAgKi8KLSAgICAgIGVsc2UgaWYgKGZpeHVwID4gc2F2ZV9maXh1cCArIDEpCi0Jc29tX3JlbG9jX3F1ZXVlX2luc2VydCAoc2F2ZV9maXh1cCwgZml4dXAgLSBzYXZlX2ZpeHVwLCByZWxvY19xdWV1ZSk7Ci0KLSAgICAgIC8qIFdlIGRvIG5vdCBwYXNzIFJfREFUQV9PVkVSUklERSBvciBSX05PX1JFTE9DQVRJT04gCi0JIGZpeHVwcyB0byBCRkQuICAqLwotICAgICAgaWYgKHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlICE9IFJfREFUQV9PVkVSUklERQotCSAgJiYgc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgIT0gUl9OT19SRUxPQ0FUSU9OKQotCXsKLQkgIC8qIERvbmUgd2l0aCBhIHNpbmdsZSByZWxvY3Rpb24uIExvb3AgYmFjayB0byB0aGUgdG9wLiAgKi8KLQkgIGlmICghIGp1c3RfY291bnQpCi0JICAgIHsKLQkgICAgICBpZiAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9FTlRSWSkKLQkJcnB0ci0+YWRkZW5kID0gdmFyICgnVCcpOwotCSAgICAgIGVsc2UgaWYgKHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfRVhJVCkKLQkJcnB0ci0+YWRkZW5kID0gdmFyICgnVScpOwotCSAgICAgIGVsc2UgaWYgKHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfUENSRUxfQ0FMTAotCQkgICAgICAgfHwgc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9BQlNfQ0FMTCkKLQkJOwotCSAgICAgIGVsc2UgaWYgKHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfREFUQV9PTkVfU1lNQk9MKQotCQl7Ci0JCSAgdW5zaWduZWQgYWRkZW5kID0gdmFyICgnVicpOwotCi0JCSAgLyogVHJ5IHdoYXQgd2FzIHNwZWNpZmllZCBpbiBSX0RBVEFfT1ZFUlJJREUgZmlyc3QKLQkJICAgICAoaWYgYW55dGhpbmcpLiAgVGhlbiB0aGUgaGFyZCB3YXkgdXNpbmcgdGhlCi0JCSAgICAgc2VjdGlvbiBjb250ZW50cy4gICovCi0JCSAgcnB0ci0+YWRkZW5kID0gdmFyICgnVicpOwotCi0JCSAgaWYgKHJwdHItPmFkZGVuZCA9PSAwICYmICFzZWN0aW9uLT5jb250ZW50cykKLQkJICAgIHsKLQkJICAgICAgLyogR290IHRvIHJlYWQgdGhlIGRhbW4gY29udGVudHMgZmlyc3QuICBXZSBkb24ndAotCQkgICAgICAgICBib3RoZXIgc2F2aW5nIHRoZSBjb250ZW50cyAoeWV0KS4gIEFkZCBpdCBvbmUKLQkJCSBkYXkgaWYgdGhlIG5lZWQgYXJpc2VzLiAgKi8KLQkJICAgICAgc2VjdGlvbi0+Y29udGVudHMgPSBiZmRfbWFsbG9jIChzZWN0aW9uLT5fcmF3X3NpemUpOwotCQkgICAgICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQotCQkgICAgICBkZWFsbG9jYXRlX2NvbnRlbnRzID0gMTsKLQkJICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChzZWN0aW9uLT5vd25lciwKLQkJCQkJCXNlY3Rpb24sCi0JCQkJCQlzZWN0aW9uLT5jb250ZW50cywKLQkJCQkJCTAsCi0JCQkJCQlzZWN0aW9uLT5fcmF3X3NpemUpOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHJwdHItPmFkZGVuZCA9PSAwKQotCQkgICAgcnB0ci0+YWRkZW5kID0gYmZkX2dldF8zMiAoc2VjdGlvbi0+b3duZXIsCi0JCQkJCSAgICAgICAoc2VjdGlvbi0+Y29udGVudHMKLQkJCQkJCSsgb2Zmc2V0IC0gdmFyICgnTCcpKSk7Ci0JCQkKLQkJfQotCSAgICAgIGVsc2UKLQkJcnB0ci0+YWRkZW5kID0gdmFyICgnVicpOwotCSAgICAgIHJwdHIrKzsKLQkgICAgfQotCSAgY291bnQrKzsKLQkgIC8qIE5vdyB0aGF0IHdlJ3ZlIGhhbmRsZWQgYSAiZnVsbCIgcmVsb2NhdGlvbiwgcmVzZXQKLQkgICAgIHNvbWUgc3RhdGUuICAqLwotCSAgbWVtc2V0ICh2YXJpYWJsZXMsIDAsIHNpemVvZiAodmFyaWFibGVzKSk7Ci0JICBtZW1zZXQgKHN0YWNrLCAwLCBzaXplb2YgKHN0YWNrKSk7Ci0JfQotICAgIH0KLSAgaWYgKGRlYWxsb2NhdGVfY29udGVudHMpCi0gICAgZnJlZSAoc2VjdGlvbi0+Y29udGVudHMpOwotCi0gIHJldHVybiBjb3VudDsKLQotI3VuZGVmIHZhcgotI3VuZGVmIHB1c2gKLSN1bmRlZiBwb3AKLSN1bmRlZiBlbXB0eXN0YWNrCi19Ci0KLS8qIFJlYWQgaW4gdGhlIHJlbG9jcyAoYWthIGZpeHVwcyBpbiBTT00gdGVybXMpIGZvciBhIHNlY3Rpb24uIAotCi0gICBzb21fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGNhbGxzIHRoaXMgcm91dGluZSB3aXRoIEpVU1RfQ09VTlQgCi0gICBzZXQgdG8gdHJ1ZSB0byBpbmRpY2F0ZSBpdCBvbmx5IG5lZWRzIGEgY291bnQgb2YgdGhlIG51bWJlcgotICAgb2YgYWN0dWFsIHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywganVzdF9jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4ganVzdF9jb3VudDsKLXsKLSAgY2hhciAqZXh0ZXJuYWxfcmVsb2NzOwotICB1bnNpZ25lZCBpbnQgZml4dXBfc3RyZWFtX3NpemU7Ci0gIGFyZWxlbnQgKmludGVybmFsX3JlbG9jczsKLSAgdW5zaWduZWQgaW50IG51bV9yZWxvY3M7Ci0KLSAgZml4dXBfc3RyZWFtX3NpemUgPSBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2Nfc2l6ZTsKLSAgLyogSWYgdGhlcmUgd2VyZSBubyByZWxvY2F0aW9ucywgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAgKi8KLSAgaWYgKHNlY3Rpb24tPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgcmVsb2NfY291bnQgaXMgLTEsIHRoZW4gdGhlIHJlbG9jYXRpb24gc3RyZWFtIGhhcyBub3QgYmVlbiAKLSAgICAgcGFyc2VkLiAgV2UgbXVzdCBkbyBzbyBub3cgdG8ga25vdyBob3cgbWFueSByZWxvY2F0aW9ucyBleGlzdC4gICovCi0gIGlmIChzZWN0aW9uLT5yZWxvY19jb3VudCA9PSAtMSkKLSAgICB7Ci0gICAgICBleHRlcm5hbF9yZWxvY3MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChmaXh1cF9zdHJlYW1fc2l6ZSk7Ci0gICAgICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IChjaGFyICopIE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgZm9ybXMuICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICBvYmpfc29tX3JlbG9jX2ZpbGVwb3MgKGFiZmQpICsgc2VjdGlvbi0+cmVsX2ZpbGVwb3MsCi0JCSAgICBTRUVLX1NFVCkKLQkgICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIDEsIGZpeHVwX3N0cmVhbV9zaXplLCBhYmZkKQotCSAgIT0gZml4dXBfc3RyZWFtX3NpemUpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBMZXQgY2FsbGVycyBrbm93IGhvdyBtYW55IHJlbG9jYXRpb25zIGZvdW5kLgotCSBhbHNvIHNhdmUgdGhlIHJlbG9jYXRpb24gc3RyZWFtIGFzIHdlIHdpbGwKLQkgbmVlZCBpdCBhZ2Fpbi4gICovCi0gICAgICBzZWN0aW9uLT5yZWxvY19jb3VudCA9IHNvbV9zZXRfcmVsb2NfaW5mbyAoZXh0ZXJuYWxfcmVsb2NzLAotCQkJCQkJIGZpeHVwX3N0cmVhbV9zaXplLAotCQkJCQkJIE5VTEwsIE5VTEwsIE5VTEwsIHRydWUpOwotCi0gICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2Nfc3RyZWFtID0gZXh0ZXJuYWxfcmVsb2NzOwotICAgIH0KLQotICAvKiBJZiB0aGUgY2FsbGVyIG9ubHkgd2FudGVkIGEgY291bnQsIHRoZW4gcmV0dXJuIG5vdy4gICovCi0gIGlmIChqdXN0X2NvdW50KQotICAgIHJldHVybiB0cnVlOwotCi0gIG51bV9yZWxvY3MgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZXh0ZXJuYWxfcmVsb2NzID0gc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jX3N0cmVhbTsKLSAgLyogUmV0dXJuIHNhdmVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWxvY2F0aW9ucyBpZiBpdCBpcyBhdmFpbGFibGUuICAqLwotICBpZiAoc2VjdGlvbi0+cmVsb2NhdGlvbiAhPSAoYXJlbGVudCAqKSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGludGVybmFsX3JlbG9jcyA9IChhcmVsZW50ICopIAotICAgIGJmZF96YWxsb2MgKGFiZmQsIChudW1fcmVsb2NzICogc2l6ZW9mIChhcmVsZW50KSkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IChhcmVsZW50ICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFByb2Nlc3MgYW5kIGludGVybmFsaXplIHRoZSByZWxvY2F0aW9ucy4gICovCi0gIHNvbV9zZXRfcmVsb2NfaW5mbyAoZXh0ZXJuYWxfcmVsb2NzLCBmaXh1cF9zdHJlYW1fc2l6ZSwKLQkJICAgICAgaW50ZXJuYWxfcmVsb2NzLCBzZWN0aW9uLCBzeW1ib2xzLCBmYWxzZSk7Ci0KLSAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBleHRlcm5hbCByZWxvY2F0aW9ucy4gIEZyZWUgdGhlbS4gICovCi0gIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY19zdHJlYW0gPSBOVUxMOwotCi0gIC8qIFNhdmUgb3VyIHJlc3VsdHMgYW5kIHJldHVybiBzdWNjZXNzLiAgKi8KLSAgc2VjdGlvbi0+cmVsb2NhdGlvbiA9IGludGVybmFsX3JlbG9jczsKLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIHJlbG9jYXRpb24KLSAgIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gc2VjdGlvbi4gICovIAotCi1zdGF0aWMgbG9uZwotc29tX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgLyogSWYgc2VjdGlvbiBoYXMgcmVsb2NhdGlvbnMsIHRoZW4gcmVhZCBpbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0KLSAgICAgYW5kIHBhcnNlIGl0IHRvIGRldGVybWluZSBob3cgbWFueSByZWxvY2F0aW9ucyBleGlzdC4gICovCi0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfUkVMT0MpCi0gICAgewotICAgICAgaWYgKCEgc29tX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgTlVMTCwgdHJ1ZSkpCi0JcmV0dXJuIC0xOwotICAgICAgcmV0dXJuIChhc2VjdC0+cmVsb2NfY291bnQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLSAgICB9Ci0gIC8qIFRoZXJlIGFyZSBubyByZWxvY2F0aW9ucy4gICovCi0gIHJldHVybiAwOwotfQotCi0vKiBDb252ZXJ0IHJlbG9jYXRpb25zIGZyb20gU09NIChleHRlcm5hbCkgZm9ybSBpbnRvIEJGRCBpbnRlcm5hbAotICAgZm9ybS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGxvbmcKLXNvbV9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHI7Ci0gIGludCBjb3VudDsKLQotICBpZiAoc29tX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBmYWxzZSkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIC0xOwotCi0gIGNvdW50ID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgd2hpbGUgKGNvdW50LS0pCi0gICAgKnJlbHB0cisrID0gdGJscHRyKys7Ci0KLSAgKnJlbHB0ciA9IChhcmVsZW50ICopIE5VTEw7Ci0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc29tX3ZlYzsKLQotLyogQSBob29rIHRvIHNldCB1cCBvYmplY3QgZmlsZSBkZXBlbmRlbnQgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgbmV3c2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqbmV3c2VjdDsKLXsKLSAgbmV3c2VjdC0+dXNlZF9ieV9iZmQgPQotICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0KSk7Ci0gIGlmICghbmV3c2VjdC0+dXNlZF9ieV9iZmQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBuZXdzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAzOwotCi0gIC8qIFdlIGFsbG93IG1vcmUgdGhhbiB0aHJlZSBzZWN0aW9ucyBpbnRlcm5hbGx5ICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBzeW1ib2wKLSAgIHRvIHRoZSBvdXRwdXQgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIChpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzeW1ib2wgKmlzeW1ib2w7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXN5bWJvbCAqb3N5bWJvbDsKLXsKLSAgc3RydWN0IHNvbV9zeW1ib2wgKmlucHV0X3N5bWJvbCA9IChzdHJ1Y3Qgc29tX3N5bWJvbCAqKSBpc3ltYm9sOwotICBzdHJ1Y3Qgc29tX3N5bWJvbCAqb3V0cHV0X3N5bWJvbCA9IChzdHJ1Y3Qgc29tX3N5bWJvbCAqKSBvc3ltYm9sOwotCi0gIC8qIE9uZSBkYXkgd2UgbWF5IHRyeSB0byBncm9rIG90aGVyIHByaXZhdGUgZGF0YS4gICovCi0gIGlmIChpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIKLSAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIG9ubHkgcHJpdmF0ZSBpbmZvcm1hdGlvbiB3ZSBuZWVkIHRvIGNvcHkgaXMgdGhlIGFyZ3VtZW50IHJlbG9jYXRpb24KLSAgICAgYml0cy4gICovCi0gIG91dHB1dF9zeW1ib2wtPnRjX2RhdGEuYXAuaHBwYV9hcmdfcmVsb2MgPQotICAgIGlucHV0X3N5bWJvbC0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBhbnkgcHJpdmF0ZSBpbmZvIHdlIHVuZGVyc3RhbmQgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbgotICAgdG8gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikKLSAgICAgYmZkICppYmZkOwotICAgICBhc2VjdGlvbiAqaXNlY3Rpb247Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWN0aW9uOwotewotICAvKiBPbmUgZGF5IHdlIG1heSB0cnkgdG8gZ3JvayBvdGhlciBwcml2YXRlIGRhdGEuICAqLwotICBpZiAoaWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIKLSAgICAgIHx8ICghc29tX2lzX3NwYWNlIChpc2VjdGlvbikgJiYgIXNvbV9pc19zdWJzcGFjZSAoaXNlY3Rpb24pKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YQotICAgID0gKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKQotICAgICAgYmZkX3phbGxvYyAob2JmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1lbWNweSAoc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEsCi0JICBzb21fc2VjdGlvbl9kYXRhIChpc2VjdGlvbiktPmNvcHlfZGF0YSwKLQkgIHNpemVvZiAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KSk7Ci0KLSAgLyogUmVwYXJlbnQgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXIpCi0gICAgc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9Ci0gICAgICBzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyLT5vdXRwdXRfc2VjdGlvbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBhbnkgcHJpdmF0ZSBpbmZvIHdlIHVuZGVyc3RhbmQgZnJvbSB0aGUgaW5wdXQgYmZkCi0gICB0byB0aGUgb3V0cHV0IGJmZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkLCAqb2JmZDsKLXsKLSAgLyogT25lIGRheSB3ZSBtYXkgdHJ5IHRvIGdyb2sgb3RoZXIgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgaWYgKGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cgotICAgICAgfHwgb2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEFsbG9jYXRlIHNvbWUgbWVtb3J5IHRvIGhvbGQgdGhlIGRhdGEgd2UgbmVlZC4gICovCi0gIG9ial9zb21fZXhlY19kYXRhIChvYmZkKSA9IChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSAqKQotICAgIGJmZF96YWxsb2MgKG9iZmQsIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2RhdGEpKTsKLSAgaWYgKG9ial9zb21fZXhlY19kYXRhIChvYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgY29weSB0aGUgZGF0YS4gICovCi0gIG1lbWNweSAob2JqX3NvbV9leGVjX2RhdGEgKG9iZmQpLCBvYmpfc29tX2V4ZWNfZGF0YSAoaWJmZCksCi0JICBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19kYXRhKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCBiYWNrZW5kIGluZm8gZm9yIHNlY3Rpb25zIHdoaWNoIGNhbiBub3QgYmUgZGVzY3JpYmVkCi0gICBpbiB0aGUgQkZEIGRhdGEgc3RydWN0dXJlcy4gICovCi0KLWJvb2xlYW4KLWJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyAoc2VjdGlvbiwgZGVmaW5lZCwgcHJpdmF0ZSwgc29ydF9rZXksIHNwbnVtKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgaW50IGRlZmluZWQ7Ci0gICAgIGludCBwcml2YXRlOwotICAgICB1bnNpZ25lZCBpbnQgc29ydF9rZXk7Ci0gICAgIGludCBzcG51bTsKLXsKLSAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIG1hZ2ljIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhCi0JPSAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0ICopCi0JICBiZmRfemFsbG9jIChzZWN0aW9uLT5vd25lciwKLQkJICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpKTsKLSAgICAgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+c29ydF9rZXkgPSBzb3J0X2tleTsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+aXNfZGVmaW5lZCA9IGRlZmluZWQ7Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmlzX3ByaXZhdGUgPSBwcml2YXRlOwotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXIgPSBzZWN0aW9uOwotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zcGFjZV9udW1iZXIgPSBzcG51bTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCBiYWNrZW5kIGluZm8gZm9yIHN1YnNlY3Rpb25zIHdoaWNoIGNhbiBub3QgYmUgZGVzY3JpYmVkIAotICAgaW4gdGhlIEJGRCBkYXRhIHN0cnVjdHVyZXMuICAqLwotCi1ib29sZWFuCi1iZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgKHNlY3Rpb24sIGNvbnRhaW5lciwgYWNjZXNzLAotCQkJCSAgIHNvcnRfa2V5LCBxdWFkcmFudCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzZWN0aW9uICpjb250YWluZXI7Ci0gICAgIGludCBhY2Nlc3M7Ci0gICAgIHVuc2lnbmVkIGludCBzb3J0X2tleTsKLSAgICAgaW50IHF1YWRyYW50OwotewotICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCB0aGUgbWFnaWMgaW5mb3JtYXRpb24uICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEKLQk9IChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKikKLQkgIGJmZF96YWxsb2MgKHNlY3Rpb24tPm93bmVyLAotCQkgICAgICBzaXplb2YgKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCkpOwotICAgICAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zb3J0X2tleSA9IHNvcnRfa2V5OwotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5hY2Nlc3NfY29udHJvbF9iaXRzID0gYWNjZXNzOwotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5xdWFkcmFudCA9IHF1YWRyYW50OwotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXIgPSBjb250YWluZXI7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGZ1bGwgU09NIHN5bWJvbCB0eXBlLiAgU09NIG5lZWRzIGZhciBtb3JlIHN5bWJvbCBpbmZvcm1hdGlvbgotICAgdGhhbiBhbnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0IEknbSBhd2FyZSBvZi4gIEl0IGlzIG1hbmRhdG9yeQotICAgdG8gYmUgYWJsZSB0byBrbm93IGlmIGEgc3ltYm9sIGlzIGFuIGVudHJ5IHBvaW50LCBtaWxsaWNvZGUsIGRhdGEsCi0gICBjb2RlLCBhYnNvbHV0ZSwgc3RvcmFnZSByZXF1ZXN0LCBvciBwcm9jZWR1cmUgbGFiZWwuICBJZiB5b3UgZ2V0Ci0gICB0aGUgc3ltYm9sIHR5cGUgd3JvbmcgeW91ciBwcm9ncmFtIHdpbGwgbm90IGxpbmsuICAqLwotCi12b2lkCi1iZmRfc29tX3NldF9zeW1ib2xfdHlwZSAoc3ltYm9sLCB0eXBlKQotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCB0eXBlOwotewotICBzb21fc3ltYm9sX2RhdGEgKHN5bWJvbCktPnNvbV90eXBlID0gdHlwZTsKLX0KLQotLyogQXR0YWNoIGFuIGF1eGlsaWFyeSBoZWFkZXIgdG8gdGhlIEJGRCBiYWNrZW5kIHNvIHRoYXQgaXQgbWF5IGJlCi0gICB3cml0dGVuIGludG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KLWJvb2xlYW4KLWJmZF9zb21fYXR0YWNoX2F1eF9oZHIgKGFiZmQsIHR5cGUsIHN0cmluZykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqc3RyaW5nOwotewotICBpZiAodHlwZSA9PSBWRVJTSU9OX0FVWF9JRCkKLSAgICB7Ci0gICAgICBpbnQgbGVuID0gc3RybGVuIChzdHJpbmcpOwotICAgICAgaW50IHBhZCA9IDA7Ci0KLSAgICAgIGlmIChsZW4gJSA0KQotCXBhZCA9ICg0IC0gKGxlbiAlIDQpKTsKLSAgICAgIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpID0gKHN0cnVjdCB1c2VyX3N0cmluZ19hdXhfaGRyICopCi0JYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXV4X2lkKQotCQkJICAgICAgKyBzaXplb2YgKHVuc2lnbmVkIGludCkgKyBsZW4gKyBwYWQpOwotICAgICAgaWYgKCFvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+aGVhZGVyX2lkLnR5cGUgPSBWRVJTSU9OX0FVWF9JRDsKLSAgICAgIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT5oZWFkZXJfaWQubGVuZ3RoID0gbGVuICsgcGFkOwotICAgICAgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggKz0gc2l6ZW9mIChpbnQpOwotICAgICAgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPnN0cmluZ19sZW5ndGggPSBsZW47Ci0gICAgICBzdHJuY3B5IChvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+dXNlcl9zdHJpbmcsIHN0cmluZywgbGVuKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHR5cGUgPT0gQ09QWVJJR0hUX0FVWF9JRCkKLSAgICB7Ci0gICAgICBpbnQgbGVuID0gc3RybGVuIChzdHJpbmcpOwotICAgICAgaW50IHBhZCA9IDA7Ci0KLSAgICAgIGlmIChsZW4gJSA0KQotCXBhZCA9ICg0IC0gKGxlbiAlIDQpKTsKLSAgICAgIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCkgPSAoc3RydWN0IGNvcHlyaWdodF9hdXhfaGRyICopCi0JYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXV4X2lkKQotCQkJICAgICsgc2l6ZW9mICh1bnNpZ25lZCBpbnQpICsgbGVuICsgcGFkKTsKLSAgICAgIGlmICghb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpLT5oZWFkZXJfaWQudHlwZSA9IENPUFlSSUdIVF9BVVhfSUQ7Ci0gICAgICBvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpLT5oZWFkZXJfaWQubGVuZ3RoID0gbGVuICsgcGFkOwotICAgICAgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCArPSBzaXplb2YgKGludCk7Ci0gICAgICBvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpLT5zdHJpbmdfbGVuZ3RoID0gbGVuOwotICAgICAgc3RyY3B5IChvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpLT5jb3B5cmlnaHQsIHN0cmluZyk7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXR0YWNoIGFuIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyIHRvIHRoZSBCRkQgYmFja2VuZCBzbyB0aGF0IGl0IG1heSBiZQotICAgd3JpdHRlbiBpbnRvIHRoZSBvYmplY3QgZmlsZS4gICovCi0KLWJvb2xlYW4KLWJmZF9zb21fYXR0YWNoX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQsIG5hbWUsIGxhbmd1YWdlX25hbWUsIHByb2R1Y3RfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uX2lkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmxhbmd1YWdlX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnByb2R1Y3RfaWQ7Ci0gICAgIGNvbnN0IGNoYXIgKnZlcnNpb25faWQ7Ci17Ci0gIENPTVBVTklUICpuID0gKENPTVBVTklUICopIGJmZF96YWxsb2MgKGFiZmQsIENPTVBVTklUU1opOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotI2RlZmluZSBTVFJEVVAoZikgXAotICBpZiAoZiAhPSBOVUxMKSBcCi0gICAgeyBcCi0gICAgICBuLT5mLm5fbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChmKSArIDEpOyBcCi0gICAgICBpZiAobi0+Zi5uX25hbWUgPT0gTlVMTCkgXAotCXJldHVybiBmYWxzZTsgXAotICAgICAgc3RyY3B5IChuLT5mLm5fbmFtZSwgZik7IFwKLSAgICB9Ci0KLSAgU1RSRFVQIChuYW1lKTsKLSAgU1RSRFVQIChsYW5ndWFnZV9uYW1lKTsKLSAgU1RSRFVQIChwcm9kdWN0X2lkKTsKLSAgU1RSRFVQICh2ZXJzaW9uX2lkKTsKLQotI3VuZGVmIFNUUkRVUAotCi0gIG9ial9zb21fY29tcGlsYXRpb25fdW5pdCAoYWJmZCkgPSBuOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc29tX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoY291bnQgPT0gMCB8fCAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoYmZkX3NpemVfdHlwZSkob2Zmc2V0K2NvdW50KSA+IHNlY3Rpb24tPl9yYXdfc2l6ZQotICAgICAgfHwgYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCksIFNFRUtfU0VUKSA9PSAtMQotICAgICAgfHwgYmZkX3JlYWQgKGxvY2F0aW9uLCAoYmZkX3NpemVfdHlwZSkxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIChmYWxzZSk7IC8qIG9uIGVycm9yICovCi0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zb21fc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQotICAgIHsKLSAgICAgIC8qIFNldCB1cCBmaXhlZCBwYXJ0cyBvZiB0aGUgZmlsZSwgc3BhY2UsIGFuZCBzdWJzcGFjZSBoZWFkZXJzLgotCSBOb3RpZnkgdGhlIHdvcmxkIHRoYXQgb3V0cHV0IGhhcyBiZWd1bi4gICovCi0gICAgICBzb21fcHJlcF9oZWFkZXJzIChhYmZkKTsKLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgICAgLyogU3RhcnQgd3JpdGluZyB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIGluY2x1ZGUgYWxsIHRoZSBzdHJpbmcKLQkgdGFibGVzLCBmaXh1cCBzdHJlYW1zLCBhbmQgb3RoZXIgcG9ydGlvbnMgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgICAgIHNvbV9iZWdpbl93cml0aW5nIChhYmZkKTsKLSAgICB9Ci0KLSAgLyogT25seSB3cml0ZSBzdWJzcGFjZXMgd2hpY2ggaGF2ZSAicmVhbCIgY29udGVudHMgKGVnLiB0aGUgY29udGVudHMKLSAgICAgYXJlIG5vdCBnZW5lcmF0ZWQgYXQgcnVuIHRpbWUgYnkgdGhlIE9TKS4gICovCi0gIGlmICghc29tX2lzX3N1YnNwYWNlIChzZWN0aW9uKQotICAgICAgfHwgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlZWsgdG8gdGhlIHByb3BlciBvZmZzZXQgd2l0aGluIHRoZSBvYmplY3QgZmlsZSBhbmQgd3JpdGUgdGhlCi0gICAgIGRhdGEuICAqLwotICBvZmZzZXQgKz0gc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpbGVfbG9jX2luaXRfdmFsdWU7IAotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpID09IC0xKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zb21fc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICAvKiBBbGxvdyBhbnkgYXJjaGl0ZWN0dXJlIHRvIGJlIHN1cHBvcnRlZCBieSB0aGUgU09NIGJhY2tlbmQgKi8KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc29tX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGVuYW1lX3B0ciwKLQkJCWZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICByZXR1cm4gKGZhbHNlKTsKLX0KLQotc3RhdGljIGludAotc29tX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHJlbG9jOwotewotICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oInNvbV9zaXplb2ZfaGVhZGVycyB1bmltcGxlbWVudGVkIikpOwotICBmZmx1c2ggKHN0ZGVycik7Ci0gIGFib3J0ICgpOwotICByZXR1cm4gKDApOwotfQotCi0vKiBSZXR1cm4gdGhlIHNpbmdsZS1jaGFyYWN0ZXIgc3ltYm9sIHR5cGUgY29ycmVzcG9uZGluZyB0bwotICAgU09NIHNlY3Rpb24gUywgb3IgJz8nIGZvciBhbiB1bmtub3duIFNPTSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGNoYXIKLXNvbV9zZWN0aW9uX3R5cGUgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGNvbnN0IHN0cnVjdCBzZWN0aW9uX3RvX3R5cGUgKnQ7Ci0KLSAgZm9yICh0ID0gJnN0dFswXTsgdC0+c2VjdGlvbjsgdCsrKQotICAgIGlmICghc3RyY21wIChzLCB0LT5zZWN0aW9uKSkKLSAgICAgIHJldHVybiB0LT50eXBlOwotICByZXR1cm4gJz8nOwotfQotCi1zdGF0aWMgaW50Ci1zb21fZGVjb2RlX3N5bWNsYXNzIChzeW1ib2wpCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsKLSAgY2hhciBjOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmV0dXJuICdDJzsKLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gJ1UnOwotICBpZiAoYmZkX2lzX2luZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldHVybiAnSSc7Ci0gIGlmICghKHN5bWJvbC0+ZmxhZ3MgJiAoQlNGX0dMT0JBTHxCU0ZfTE9DQUwpKSkKLSAgICByZXR1cm4gJz8nOwotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgIHx8IChzb21fc3ltYm9sX2RhdGEgKHN5bWJvbCkgIT0gTlVMTAotCSAgJiYgc29tX3N5bWJvbF9kYXRhIChzeW1ib2wpLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9BQlNPTFVURSkpCi0gICAgYyA9ICdhJzsKLSAgZWxzZSBpZiAoc3ltYm9sLT5zZWN0aW9uKQotICAgIGMgPSBzb21fc2VjdGlvbl90eXBlIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUpOwotICBlbHNlCi0gICAgcmV0dXJuICc/JzsKLSAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQotICAgIGMgPSB0b3VwcGVyIChjKTsKLSAgcmV0dXJuIGM7Ci19Ci0KLS8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBTT00gc3ltYm9sIFNZTUJPTCBpbiBSRVQuICAqLwotCi1zdGF0aWMgdm9pZAotc29tX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIHJldC0+dHlwZSA9IHNvbV9kZWNvZGVfc3ltY2xhc3MgKHN5bWJvbCk7Ci0gIGlmIChyZXQtPnR5cGUgIT0gJ1UnKQotICAgIHJldC0+dmFsdWUgPSBzeW1ib2wtPnZhbHVlK3N5bWJvbC0+c2VjdGlvbi0+dm1hOwotICBlbHNlCi0gICAgcmV0LT52YWx1ZSA9IDA7Ci0gIHJldC0+bmFtZSA9IHN5bWJvbC0+bmFtZTsKLX0KLQotLyogQ291bnQgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gIE5lY2Vzc2FyeQotICAgc28gdGhhdCB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgZm9yIGFsbCB0aGUgY2Fyc3ltcyBhdCBvbmNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfY291bnRfYXJfc3ltYm9scyAoYWJmZCwgbHN0X2hlYWRlciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGxzdF9oZWFkZXIgKmxzdF9oZWFkZXI7Ci0gICAgIHN5bWluZGV4ICpjb3VudDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCAqaGFzaF90YWJsZSA9IE5VTEw7Ci0gIGZpbGVfcHRyIGxzdF9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7Ci0KLSAgaGFzaF90YWJsZSA9IAotICAgICh1bnNpZ25lZCBpbnQgKikgYmZkX21hbGxvYyAobHN0X2hlYWRlci0+aGFzaF9zaXplCi0JCQkJICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKTsKLSAgaWYgKGhhc2hfdGFibGUgPT0gTlVMTCAmJiBsc3RfaGVhZGVyLT5oYXNoX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBEb24ndCBmb3JnZXQgdG8gaW5pdGlhbGl6ZSB0aGUgY291bnRlciEgICovCi0gICpjb3VudCA9IDA7Ci0KLSAgLyogUmVhZCBpbiB0aGUgaGFzaCB0YWJsZS4gIFRoZSBoYXMgdGFibGUgaXMgYW4gYXJyYXkgb2YgMzJiaXQgZmlsZSBvZmZzZXRzCi0gICAgIHdoaWNoIHBvaW50IHRvIHRoZSBoYXNoIGNoYWlucy4gICovCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgaGFzaF90YWJsZSwgbHN0X2hlYWRlci0+aGFzaF9zaXplLCA0LCBhYmZkKQotICAgICAgIT0gbHN0X2hlYWRlci0+aGFzaF9zaXplICogNCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXYWxrIGVhY2ggY2hhaW4gY291bnRpbmcgdGhlIG51bWJlciBvZiBzeW1ib2xzIGZvdW5kIG9uIHRoYXQgcGFydGljdWxhcgotICAgICBjaGFpbi4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBsc3RfaGVhZGVyLT5oYXNoX3NpemU7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgbHN0X3N5bWJvbDsKLQotICAgICAgLyogQW4gZW1wdHkgY2hhaW4gaGFzIHplcm8gYXMgaXQncyBmaWxlIG9mZnNldC4gICovCi0gICAgICBpZiAoaGFzaF90YWJsZVtpXSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWVrIHRvIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhpcyBoYXNoIGNoYWluLiAgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBoYXNoX3RhYmxlW2ldLCBTRUVLX1NFVCkgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBSZWFkIGluIHRoaXMgc3ltYm9sIGFuZCB1cGRhdGUgdGhlIGNvdW50ZXIuICAqLwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9zeW1ib2wsIDEsIHNpemVvZiAobHN0X3N5bWJvbCksIGFiZmQpCi0JICAhPSBzaXplb2YgKGxzdF9zeW1ib2wpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAoKmNvdW50KSsrOwotCi0gICAgICAvKiBOb3cgaXRlcmF0ZSB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBzeW1ib2xzIG9uIHRoaXMgY2hhaW4uICAqLwotICAgICAgd2hpbGUgKGxzdF9zeW1ib2wubmV4dF9lbnRyeSkKLQl7Ci0KLQkgIC8qIFNlZWsgdG8gdGhlIG5leHQgc3ltYm9sLiAgKi8KLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBsc3Rfc3ltYm9sLm5leHRfZW50cnksIFNFRUtfU0VUKQotCSAgICAgIDwgMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFJlYWQgdGhlIHN5bWJvbCBpbiBhbmQgdXBkYXRlIHRoZSBjb3VudGVyLiAgKi8KLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3Rfc3ltYm9sLCAxLCBzaXplb2YgKGxzdF9zeW1ib2wpLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAobHN0X3N5bWJvbCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAoKmNvdW50KSsrOwotCX0KLSAgICB9Ci0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoaGFzaF90YWJsZSAhPSBOVUxMKQotICAgIGZyZWUgKGhhc2hfdGFibGUpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEZpbGwgaW4gdGhlIGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbHMgKFNZTVMpIGZyb20gdGhlIGFyY2hpdmUgZGVzY3JpYmVkCi0gICBieSBBQkZEIGFuZCBMU1RfSEVBREVSLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzIChhYmZkLCBsc3RfaGVhZGVyLCBzeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBsc3RfaGVhZGVyICpsc3RfaGVhZGVyOwotICAgICBjYXJzeW0gKipzeW1zOwotewotICB1bnNpZ25lZCBpbnQgaSwgbGVuOwotICBjYXJzeW0gKnNldCA9IHN5bXNbMF07Ci0gIHVuc2lnbmVkIGludCAqaGFzaF90YWJsZSA9IE5VTEw7Ci0gIHN0cnVjdCBzb21fZW50cnkgKnNvbV9kaWN0ID0gTlVMTDsKLSAgZmlsZV9wdHIgbHN0X2ZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCkgLSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKLQotICBoYXNoX3RhYmxlID0gCi0gICAgKHVuc2lnbmVkIGludCAqKSBiZmRfbWFsbG9jIChsc3RfaGVhZGVyLT5oYXNoX3NpemUKLQkJCQkgKiBzaXplb2YgKHVuc2lnbmVkIGludCkpOwotICBpZiAoaGFzaF90YWJsZSA9PSBOVUxMICYmIGxzdF9oZWFkZXItPmhhc2hfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHNvbV9kaWN0ID0KLSAgICAoc3RydWN0IHNvbV9lbnRyeSAqKSBiZmRfbWFsbG9jIChsc3RfaGVhZGVyLT5tb2R1bGVfY291bnQKLQkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSk7Ci0gIGlmIChzb21fZGljdCA9PSBOVUxMICYmIGxzdF9oZWFkZXItPm1vZHVsZV9jb3VudCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFJlYWQgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUgaGFzIHRhYmxlIGlzIGFuIGFycmF5IG9mIDMyYml0IGZpbGUgb2Zmc2V0cwotICAgICB3aGljaCBwb2ludCB0byB0aGUgaGFzaCBjaGFpbnMuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpIGhhc2hfdGFibGUsIGxzdF9oZWFkZXItPmhhc2hfc2l6ZSwgNCwgYWJmZCkKLSAgICAgICE9IGxzdF9oZWFkZXItPmhhc2hfc2l6ZSAqIDQpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogU2VlayB0byBhbmQgcmVhZCBpbiB0aGUgU09NIGRpY3Rpb25hcnkuICBXZSB3aWxsIG5lZWQgdGhpcyB0byBmaWxsCi0gICAgIGluIHRoZSBjYXJzeW0ncyBmaWxlcG9zIGZpZWxkLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9oZWFkZXItPmRpcl9sb2MsIFNFRUtfU0VUKSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBzb21fZGljdCwgbHN0X2hlYWRlci0+bW9kdWxlX2NvdW50LCAKLQkJc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSwgYWJmZCkKLSAgICAgICE9IGxzdF9oZWFkZXItPm1vZHVsZV9jb3VudCAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2FsayBlYWNoIGNoYWluIGZpbGxpbmcgaW4gdGhlIGNhcnN5bXMgYXMgd2UgZ28gYWxvbmcuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbHN0X2hlYWRlci0+aGFzaF9zaXplOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkIGxzdF9zeW1ib2w7Ci0KLSAgICAgIC8qIEFuIGVtcHR5IGNoYWluIGhhcyB6ZXJvIGFzIGl0J3MgZmlsZSBvZmZzZXQuICAqLwotICAgICAgaWYgKGhhc2hfdGFibGVbaV0gPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2VlayB0byBhbmQgcmVhZCB0aGUgZmlyc3Qgc3ltYm9sIG9uIHRoZSBjaGFpbi4gICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgaGFzaF90YWJsZVtpXSwgU0VFS19TRVQpIDwgMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9zeW1ib2wsIDEsIHNpemVvZiAobHN0X3N5bWJvbCksIGFiZmQpCi0JICAhPSBzaXplb2YgKGxzdF9zeW1ib2wpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCwgZmlyc3QgZ2V0IHRoZSBsZW5ndGggd2hpY2ggaXMgc3RvcmVkCi0JIGFzIGEgMzJiaXQgaW50ZWdlciBqdXN0IGJlZm9yZSB0aGUgc3ltYm9sLgotCi0JIE9uZSBtaWdodCBhc2sgd2h5IHdlIGRvbid0IGp1c3QgcmVhZCBpbiB0aGUgZW50aXJlIHN0cmluZyB0YWJsZQotCSBhbmQgaW5kZXggaW50byBpdC4gIFdlbGwsIGFjY29yZGluZyB0byB0aGUgU09NIEFCSSB0aGUgc3RyaW5nCi0JIGluZGV4IGNhbiBwb2ludCAqYW55d2hlcmUqIGluIHRoZSBhcmNoaXZlIHRvIHNhdmUgc3BhY2UsIHNvIGp1c3QKLQkgdXNpbmcgdGhlIHN0cmluZyB0YWJsZSB3b3VsZCBub3QgYmUgc2FmZS4gICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgbHN0X2hlYWRlci0+c3RyaW5nX2xvYwotCQkJICAgICsgbHN0X3N5bWJvbC5uYW1lLm5fc3RyeCAtIDQsIFNFRUtfU0VUKSA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoJmxlbiwgMSwgNCwgYWJmZCkgIT0gNCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBuYW1lIGFuZCBudWxsIHRlcm1pbmF0ZSBpdCB0b28uICAqLwotICAgICAgc2V0LT5uYW1lID0gYmZkX3phbGxvYyAoYWJmZCwgbGVuICsgMSk7Ci0gICAgICBpZiAoIXNldC0+bmFtZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfcmVhZCAoc2V0LT5uYW1lLCAxLCBsZW4sIGFiZmQpICE9IGxlbikKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc2V0LT5uYW1lW2xlbl0gPSAwOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBmaWxlIG9mZnNldC4gIE5vdGUgdGhhdCB0aGUgImxvY2F0aW9uIiBmaWVsZCBwb2ludHMKLQkgdG8gdGhlIFNPTSBpdHNlbGYsIG5vdCB0aGUgYXJfaGRyIGluIGZyb250IG9mIGl0LiAgKi8KLSAgICAgIHNldC0+ZmlsZV9vZmZzZXQgPSBzb21fZGljdFtsc3Rfc3ltYm9sLnNvbV9pbmRleF0ubG9jYXRpb24KLQkJCSAgLSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotCi0gICAgICAvKiBHbyB0byB0aGUgbmV4dCBzeW1ib2wuICAqLwotICAgICAgc2V0Kys7Ci0KLSAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgY2hhaW4uICAqLwotICAgICAgd2hpbGUgKGxzdF9zeW1ib2wubmV4dF9lbnRyeSkKLQl7Ci0JICAvKiBTZWVrIHRvIHRoZSBuZXh0IHN5bWJvbCBhbmQgcmVhZCBpdCBpbi4gICovCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgbHN0X3N5bWJvbC5uZXh0X2VudHJ5LCBTRUVLX1NFVCkgPDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X3N5bWJvbCwgMSwgc2l6ZW9mIChsc3Rfc3ltYm9sKSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKGxzdF9zeW1ib2wpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogU2VlayB0byB0aGUgbmFtZSBsZW5ndGggJiBzdHJpbmcgYW5kIHJlYWQgdGhlbSBpbi4gICovCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgbHN0X2hlYWRlci0+c3RyaW5nX2xvYyAKLQkJCQkrIGxzdF9zeW1ib2wubmFtZS5uX3N0cnggLSA0LCBTRUVLX1NFVCkgPCAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKGJmZF9yZWFkICgmbGVuLCAxLCA0LCBhYmZkKSAhPSA0KQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBuYW1lIGFuZCBudWxsIHRlcm1pbmF0ZSBpdCB0b28uICAqLwotCSAgc2V0LT5uYW1lID0gYmZkX3phbGxvYyAoYWJmZCwgbGVuICsgMSk7Ci0JICBpZiAoIXNldC0+bmFtZSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChiZmRfcmVhZCAoc2V0LT5uYW1lLCAxLCBsZW4sIGFiZmQpICE9IGxlbikKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBzZXQtPm5hbWVbbGVuXSA9IDA7Ci0KLQkgIC8qIEZpbGwgaW4gdGhlIGZpbGUgb2Zmc2V0LiAgTm90ZSB0aGF0IHRoZSAibG9jYXRpb24iIGZpZWxkIHBvaW50cwotCSAgICAgdG8gdGhlIFNPTSBpdHNlbGYsIG5vdCB0aGUgYXJfaGRyIGluIGZyb250IG9mIGl0LiAgKi8KLQkgIHNldC0+ZmlsZV9vZmZzZXQgPSBzb21fZGljdFtsc3Rfc3ltYm9sLnNvbV9pbmRleF0ubG9jYXRpb24KLQkJCSAgICAgICAtIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0KLQkgIC8qIEdvIG9uIHRvIHRoZSBuZXh0IHN5bWJvbC4gICovCi0JICBzZXQrKzsKLQl9Ci0gICAgfQotICAvKiBJZiB3ZSBoYXZlbid0IGRpZWQgYnkgbm93LCB0aGVuIHdlIHN1Y2Nlc3NmdWxseSByZWFkIHRoZSBlbnRpcmUgCi0gICAgIGFyY2hpdmUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKGhhc2hfdGFibGUgIT0gTlVMTCkKLSAgICBmcmVlIChoYXNoX3RhYmxlKTsKLSAgaWYgKHNvbV9kaWN0ICE9IE5VTEwpCi0gICAgZnJlZSAoc29tX2RpY3QpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGhhc2hfdGFibGUgIT0gTlVMTCkKLSAgICBmcmVlIChoYXNoX3RhYmxlKTsKLSAgaWYgKHNvbV9kaWN0ICE9IE5VTEwpCi0gICAgZnJlZSAoc29tX2RpY3QpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIExTVCBmcm9tIHRoZSBhcmNoaXZlLiAgKi8KLXN0YXRpYyBib29sZWFuCi1zb21fc2x1cnBfYXJtYXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGxzdF9oZWFkZXIgbHN0X2hlYWRlcjsKLSAgc3RydWN0IGFyX2hkciBhcl9oZWFkZXI7Ci0gIHVuc2lnbmVkIGludCBwYXJzZWRfc2l6ZTsKLSAgc3RydWN0IGFydGRhdGEgKmFyZGF0YSA9IGJmZF9hcmRhdGEgKGFiZmQpOwotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgaW50IGkgPSBiZmRfcmVhZCAoKFBUUikgbmV4dG5hbWUsIDEsIDE2LCBhYmZkKTsKLQotICAvKiBTcGVjaWFsIGNhc2VzLiAgKi8KLSAgaWYgKGkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGkgIT0gMTYpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAtIDE2LCBTRUVLX0NVUikgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBGb3IgYXJjaGl2ZXMgd2l0aG91dCAubyBmaWxlcyB0aGVyZSBpcyBubyBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoc3RybmNtcCAobmV4dG5hbWUsICIvICAgICAgICAgICAgICAgIiwgMTYpKQotICAgIHsKLSAgICAgIGJmZF9oYXNfbWFwIChhYmZkKSA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gYW5kIHNhbml0eSBjaGVjayB0aGUgYXJjaGl2ZSBoZWFkZXIuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpICZhcl9oZWFkZXIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoc3RybmNtcCAoYXJfaGVhZGVyLmFyX2ZtYWcsIEFSRk1BRywgMikpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSG93IGJpZyBpcyB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgZW50cnk/ICAqLwotICBlcnJubyA9IDA7Ci0gIHBhcnNlZF9zaXplID0gc3RydG9sIChhcl9oZWFkZXIuYXJfc2l6ZSwgTlVMTCwgMTApOwotICBpZiAoZXJybm8gIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTYXZlIG9mZiB0aGUgZmlsZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHJlYWwgdXNlciBkYXRhLiAgKi8KLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCkgKyBwYXJzZWRfc2l6ZTsKLQotICAvKiBSZWFkIGluIHRoZSBsaWJyYXJ5IHN5bWJvbCB0YWJsZS4gIFdlJ2xsIG1ha2UgaGVhdnkgdXNlIG9mIHRoaXMKLSAgICAgaW4ganVzdCBhIG1pbnV0ZS4gICovCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3RfaGVhZGVyLCAxLCBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTYW5pdHkgY2hlY2suICAqLwotICBpZiAobHN0X2hlYWRlci5hX21hZ2ljICE9IExJQk1BR0lDKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENvdW50IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiB0aGUgbGlicmFyeSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoc29tX2JmZF9jb3VudF9hcl9zeW1ib2xzIChhYmZkLCAmbHN0X2hlYWRlciwgJmFyZGF0YS0+c3ltZGVmX2NvdW50KQotICAgICAgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdldCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgbGlicmFyeSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zIC0gcGFyc2VkX3NpemUgCi0JCQkrIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbml0aWFsaXphZSB0aGUgY2FjaGUgYW5kIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbGlicmFyeSBzeW1ib2xzLiAgKi8KLSAgYXJkYXRhLT5jYWNoZSA9IDA7Ci0gIGFyZGF0YS0+c3ltZGVmcyA9IChjYXJzeW0gKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgIChhcmRhdGEtPnN5bWRlZl9jb3VudAotCQkJCQkgICAqIHNpemVvZiAoY2Fyc3ltKSkpOwotICBpZiAoIWFyZGF0YS0+c3ltZGVmcykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IGZpbGwgaW4gdGhlIGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbHMuICAqLwotICBpZiAoc29tX2JmZF9maWxsX2luX2FyX3N5bWJvbHMgKGFiZmQsICZsc3RfaGVhZGVyLCAmYXJkYXRhLT5zeW1kZWZzKQotICAgICAgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFNlZWsgYmFjayB0byB0aGUgImZpcnN0IiBmaWxlIGluIHRoZSBhcmNoaXZlLiAgTm90ZSB0aGUgImZpcnN0IgotICAgICBmaWxlIG1heSBiZSB0aGUgZXh0ZW5kZWQgbmFtZSB0YWJsZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MsIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdGlmeSB0aGUgZ2VuZXJpYyBhcmNoaXZlIGNvZGUgdGhhdCB3ZSBoYXZlIGEgc3ltYm9sIG1hcC4gICovCi0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBCZWdpbiBwcmVwYXJpbmcgdG8gd3JpdGUgYSBTT00gbGlicmFyeSBzeW1ib2wgdGFibGUuCi0KLSAgIEFzIHBhcnQgb2YgdGhlIHByZXAgd29yayB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMKLSAgIGFuZCB0aGUgc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZCBzdHJpbmcgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlIChhYmZkLCBudW1fc3ltcywgc3RyaW5nc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgKm51bV9zeW1zLCAqc3RyaW5nc2l6ZTsKLXsKLSAgYmZkICpjdXJyX2JmZCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLQotICAvKiBTb21lIGluaXRpYWxpemF0aW9uLiAgKi8KLSAgKm51bV9zeW1zID0gMDsKLSAgKnN0cmluZ3NpemUgPSAwOwotCi0gIC8qIEl0ZXJhdGUgb3ZlciBlYWNoIEJGRCB3aXRoaW4gdGhpcyBhcmNoaXZlLiAgKi8KLSAgd2hpbGUgKGN1cnJfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGN1cnJfY291bnQsIGk7Ci0gICAgICBzb21fc3ltYm9sX3R5cGUgKnN5bTsKLQotICAgICAgLyogRG9uJ3QgYm90aGVyIGZvciBub24tU09NIG9iamVjdHMuICAqLwotICAgICAgaWYgKGN1cnJfYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdAotCSAgfHwgY3Vycl9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cikKLQl7Ci0JICBjdXJyX2JmZCA9IGN1cnJfYmZkLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIHN5bWJvbCB0YWJsZSBoYXMgYmVlbiByZWFkLCB0aGVuIHNuYWcgYSBwb2ludGVyCi0JIHRvIGl0LiAgSXQncyBhIGxpdHRsZSBzbGltZXkgdG8gZ3JhYiB0aGUgc3ltYm9scyB2aWEgb2JqX3NvbV9zeW10YWIsCi0JIGJ1dCBkb2luZyBzbyBhdm9pZHMgYWxsb2NhdGluZyBsb3RzIG9mIGV4dHJhIG1lbW9yeS4gICovCi0gICAgICBpZiAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSAoY3Vycl9iZmQpID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3ltID0gb2JqX3NvbV9zeW10YWIgKGN1cnJfYmZkKTsKLSAgICAgIGN1cnJfY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChjdXJyX2JmZCk7Ci0KLSAgICAgIC8qIEV4YW1pbmUgZWFjaCBzeW1ib2wgdG8gZGV0ZXJtaW5lIGlmIGl0IGJlbG9uZ3MgaW4gdGhlCi0JIGxpYnJhcnkgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyX2NvdW50OyBpKyssIHN5bSsrKQotCXsKLQkgIHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyBpbmZvOwotCi0JICAvKiBEZXJpdmUgU09NIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBzeW1ib2wuICAqLwotCSAgc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyAoY3Vycl9iZmQsICZzeW0tPnN5bWJvbCwgJmluZm8pOwotCi0JICAvKiBTaG91bGQgd2UgaW5jbHVkZSB0aGlzIHN5bWJvbD8gICovCi0JICBpZiAoaW5mby5zeW1ib2xfdHlwZSA9PSBTVF9OVUxMCi0JICAgICAgfHwgaW5mby5zeW1ib2xfdHlwZSA9PSBTVF9TWU1fRVhUCi0JICAgICAgfHwgaW5mby5zeW1ib2xfdHlwZSA9PSBTVF9BUkdfRVhUKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogT25seSBnbG9iYWwgc3ltYm9scyBhbmQgdW5zYXRpc2ZpZWQgY29tbW9ucy4gICovCi0JICBpZiAoaW5mby5zeW1ib2xfc2NvcGUgIT0gU1NfVU5JVkVSU0FMCi0JICAgICAgJiYgaW5mby5zeW1ib2xfdHlwZSAhPSBTVF9TVE9SQUdFKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogRG8gbm8gaW5jbHVkZSB1bmRlZmluZWQgc3ltYm9scy4gICovCi0JICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnN5bWJvbC5zZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEJ1bXAgdGhlIHZhcmlvdXMgY291bnRlcnMsIGJlaW5nIGNhcmVmdWwgdG8gaG9ub3IKLQkgICAgIGFsaWdubWVudCBjb25zaWRlcmF0aW9ucyBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgICgqbnVtX3N5bXMpKys7Ci0JICAqc3RyaW5nc2l6ZSA9ICpzdHJpbmdzaXplICsgc3RybGVuIChzeW0tPnN5bWJvbC5uYW1lKSArIDU7Ci0JICB3aGlsZSAoKnN0cmluZ3NpemUgJSA0KQotCSAgICAoKnN0cmluZ3NpemUpKys7Ci0JfQotCi0gICAgICBjdXJyX2JmZCA9IGN1cnJfYmZkLT5uZXh0OwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhc2ggYSBzeW1ib2wgbmFtZSBiYXNlZCBvbiB0aGUgaGFzaGluZyBhbGdvcml0aG0gcHJlc2VudGVkIGluIHRoZQotICAgU09NIEFCSS4gICovCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1zb21fYmZkX2FyX3N5bWJvbF9oYXNoIChzeW1ib2wpCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsKLSAgdW5zaWduZWQgaW50IGxlbiA9IHN0cmxlbiAoc3ltYm9sLT5uYW1lKTsKLQotICAvKiBOYW1lcyB3aXRoIGxlbmd0aCAxIGFyZSBzcGVjaWFsLiAgKi8KLSAgaWYgKGxlbiA9PSAxKQotICAgIHJldHVybiAweDEwMDAxMDAgfCAoc3ltYm9sLT5uYW1lWzBdIDw8IDE2KSB8IHN5bWJvbC0+bmFtZVswXTsKLQotICByZXR1cm4gKChsZW4gJiAweDdmKSA8PCAyNCkgfCAoc3ltYm9sLT5uYW1lWzFdIDw8IDE2KQotCSAgfCAoc3ltYm9sLT5uYW1lW2xlbi0yXSA8PCA4KSB8IHN5bWJvbC0+bmFtZVtsZW4tMV07Ci19Ci0KLS8qIERvIHRoZSBidWxrIG9mIHRoZSB3b3JrIHJlcXVpcmVkIHRvIHdyaXRlIHRoZSBTT00gbGlicmFyeQotICAgc3ltYm9sIHRhYmxlLiAgKi8KLSAgIAotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmIChhYmZkLCBuc3ltcywgc3RyaW5nX3NpemUsIGxzdCwgZWxlbmd0aCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgbnN5bXMsIHN0cmluZ19zaXplOwotICAgICBzdHJ1Y3QgbHN0X2hlYWRlciBsc3Q7Ci0gICAgIHVuc2lnbmVkIGVsZW5ndGg7Ci17Ci0gIGZpbGVfcHRyIGxzdF9maWxlcG9zOwotICBjaGFyICpzdHJpbmdzID0gTlVMTCwgKnA7Ci0gIHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCAqbHN0X3N5bXMgPSBOVUxMLCAqY3Vycl9sc3Rfc3ltOwotICBiZmQgKmN1cnJfYmZkOwotICB1bnNpZ25lZCBpbnQgKmhhc2hfdGFibGUgPSBOVUxMOwotICBzdHJ1Y3Qgc29tX2VudHJ5ICpzb21fZGljdCA9IE5VTEw7Ci0gIHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCAqKmxhc3RfaGFzaF9lbnRyeSA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBjdXJyX3NvbV9vZmZzZXQsIHNvbV9pbmRleCA9IDA7Ci0KLSAgaGFzaF90YWJsZSA9Ci0gICAgKHVuc2lnbmVkIGludCAqKSBiZmRfbWFsbG9jIChsc3QuaGFzaF9zaXplICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKTsKLSAgaWYgKGhhc2hfdGFibGUgPT0gTlVMTCAmJiBsc3QuaGFzaF9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIHNvbV9kaWN0ID0KLSAgICAoc3RydWN0IHNvbV9lbnRyeSAqKSBiZmRfbWFsbG9jIChsc3QubW9kdWxlX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkpOwotICBpZiAoc29tX2RpY3QgPT0gTlVMTCAmJiBsc3QubW9kdWxlX2NvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgbGFzdF9oYXNoX2VudHJ5ID0KLSAgICAoKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCAqKikKLSAgICAgYmZkX21hbGxvYyAobHN0Lmhhc2hfc2l6ZSAqIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkICopKSk7Ci0gIGlmIChsYXN0X2hhc2hfZW50cnkgPT0gTlVMTCAmJiBsc3QuaGFzaF9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogTG90cyBvZiBmaWVsZHMgYXJlIGZpbGUgcG9zaXRpb25zIHJlbGF0aXZlIHRvIHRoZSBzdGFydAotICAgICBvZiB0aGUgbHN0IHJlY29yZC4gIFNvIHNhdmUgaXRzIGxvY2F0aW9uLiAgKi8KLSAgbHN0X2ZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCkgLSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKLQotICAvKiBTb21lIGluaXRpYWxpemF0aW9uLiAgKi8KLSAgbWVtc2V0IChoYXNoX3RhYmxlLCAwLCA0ICogbHN0Lmhhc2hfc2l6ZSk7Ci0gIG1lbXNldCAoc29tX2RpY3QsIDAsIGxzdC5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKTsKLSAgbWVtc2V0IChsYXN0X2hhc2hfZW50cnksIDAsIAkKLQkgIGxzdC5oYXNoX3NpemUgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCAqKSk7Ci0KLSAgLyogU3ltYm9scyBoYXZlIHNvbV9pbmRleCBmaWVsZHMsIHNvIHdlIGhhdmUgdG8ga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgaW5kZXggb2YgZWFjaCBTT00gaW4gdGhlIGFyY2hpdmUuCi0KLSAgICAgVGhlIFNPTSBkaWN0aW9uYXJ5IGhhcyAoYW1vbmcgb3RoZXIgdGhpbmdzKSB0aGUgYWJzb2x1dGUgZmlsZQotICAgICBwb3NpdGlvbiBmb3IgdGhlIFNPTSB3aGljaCBhIHBhcnRpY3VsYXIgZGljdGlvbmFyeSBlbnRyeQotICAgICBkZXNjcmliZXMuICBXZSBoYXZlIHRvIGNvbXB1dGUgdGhhdCBpbmZvcm1hdGlvbiBhcyB3ZSBpdGVyYXRlCi0gICAgIHRocm91Z2ggdGhlIFNPTXMvc3ltYm9scy4gICovCi0gIHNvbV9pbmRleCA9IDA7Ci0KLSAgLyogV2UgYWRkIGluIHRoZSBzaXplIG9mIHRoZSBhcmNoaXZlIGhlYWRlciB0d2ljZSBhcyB0aGUgbG9jYXRpb24KLSAgICAgaW4gdGhlIFNPTSBkaWN0aW9uYXJ5IGlzIHRoZSBhY3R1YWwgb2Zmc2V0IG9mIHRoZSBTT00sIG5vdCB0aGUKLSAgICAgYXJjaGl2ZSBoZWFkZXIgYmVmb3JlIHRoZSBTT00uICAqLwotICBjdXJyX3NvbV9vZmZzZXQgPSA4ICsgMiAqIHNpemVvZiAoc3RydWN0IGFyX2hkcikgKyBsc3QuZmlsZV9lbmQ7Ci0KLSAgLyogTWFrZSByb29tIGZvciB0aGUgYXJjaGl2ZSBoZWFkZXIgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUKLSAgICAgZXh0ZW5kZWQgc3RyaW5nIHRhYmxlLiAgTm90ZSB0aGF0IGVsZW5ndGggaW5jbHVkZXMgdGhlIHNpemUKLSAgICAgb2YgdGhlIGFyY2hpdmUgaGVhZGVyIGZvciB0aGUgZXh0ZW5kZWQgbmFtZSB0YWJsZSEgICovCi0gIGlmIChlbGVuZ3RoKQotICAgIGN1cnJfc29tX29mZnNldCArPSBlbGVuZ3RoOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSdyZSBwcm9wZXJseSBhbGlnbmVkLiAgKi8KLSAgY3Vycl9zb21fb2Zmc2V0ID0gKGN1cnJfc29tX29mZnNldCArIDB4MSkgJiB+MHgxOwotCi0gIC8qIEZJWE1FIHNob3VsZCBiZSBkb25lIHdpdGggYnVmZmVycyBqdXN0IGxpa2UgZXZlcnl0aGluZyBlbHNlLi4uICovCi0gIGxzdF9zeW1zID0gYmZkX21hbGxvYyAobnN5bXMgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCkpOwotICBpZiAobHN0X3N5bXMgPT0gTlVMTCAmJiBuc3ltcyAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBzdHJpbmdzID0gYmZkX21hbGxvYyAoc3RyaW5nX3NpemUpOwotICBpZiAoc3RyaW5ncyA9PSBOVUxMICYmIHN0cmluZ19zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgcCA9IHN0cmluZ3M7Ci0gIGN1cnJfbHN0X3N5bSA9IGxzdF9zeW1zOwotCi0gIGN1cnJfYmZkID0gYWJmZC0+YXJjaGl2ZV9oZWFkOwotICB3aGlsZSAoY3Vycl9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY3Vycl9jb3VudCwgaTsKLSAgICAgIHNvbV9zeW1ib2xfdHlwZSAqc3ltOwotCi0gICAgICAvKiBEb24ndCBib3RoZXIgZm9yIG5vbi1TT00gb2JqZWN0cy4gICovCi0gICAgICBpZiAoY3Vycl9iZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0Ci0JICB8fCBjdXJyX2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyKQotCXsKLQkgIGN1cnJfYmZkID0gY3Vycl9iZmQtPm5leHQ7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuIHJlYWQsIHRoZW4gc25hZyBhIHBvaW50ZXIKLQkgdG8gaXQuICBJdCdzIGEgbGl0dGxlIHNsaW1leSB0byBncmFiIHRoZSBzeW1ib2xzIHZpYSBvYmpfc29tX3N5bXRhYiwKLQkgYnV0IGRvaW5nIHNvIGF2b2lkcyBhbGxvY2F0aW5nIGxvdHMgb2YgZXh0cmEgbWVtb3J5LiAgKi8KLSAgICAgIGlmIChzb21fc2x1cnBfc3ltYm9sX3RhYmxlIChjdXJyX2JmZCkgPT0gZmFsc2UpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHN5bSA9IG9ial9zb21fc3ltdGFiIChjdXJyX2JmZCk7Ci0gICAgICBjdXJyX2NvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoY3Vycl9iZmQpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgY3Vycl9jb3VudDsgaSsrLCBzeW0rKykKLQl7Ci0JICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gaW5mbzsKLQotCSAgLyogRGVyaXZlIFNPTSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgc3ltYm9sLiAgKi8KLQkgIHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gKGN1cnJfYmZkLCAmc3ltLT5zeW1ib2wsICZpbmZvKTsKLQotCSAgLyogU2hvdWxkIHdlIGluY2x1ZGUgdGhpcyBzeW1ib2w/ICAqLwotCSAgaWYgKGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfTlVMTAotCSAgICAgIHx8IGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfU1lNX0VYVAotCSAgICAgIHx8IGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfQVJHX0VYVCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE9ubHkgZ2xvYmFsIHN5bWJvbHMgYW5kIHVuc2F0aXNmaWVkIGNvbW1vbnMuICAqLwotCSAgaWYgKGluZm8uc3ltYm9sX3Njb3BlICE9IFNTX1VOSVZFUlNBTAotCSAgICAgICYmIGluZm8uc3ltYm9sX3R5cGUgIT0gU1RfU1RPUkFHRSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIERvIG5vIGluY2x1ZGUgdW5kZWZpbmVkIHN5bWJvbHMuICAqLwotCSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zeW1ib2wuc2VjdGlvbikpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzeW1ib2wgZnJvbSB0aGlzIFNPTSwgdGhlbiB1cGRhdGUKLQkgICAgIHRoZSBTT00gZGljdGlvbmFyeSB0b28uICAqLwotCSAgaWYgKHNvbV9kaWN0W3NvbV9pbmRleF0ubG9jYXRpb24gPT0gMCkKLQkgICAgewotCSAgICAgIHNvbV9kaWN0W3NvbV9pbmRleF0ubG9jYXRpb24gPSBjdXJyX3NvbV9vZmZzZXQ7Ci0JICAgICAgc29tX2RpY3Rbc29tX2luZGV4XS5sZW5ndGggPSBhcmVsdF9zaXplIChjdXJyX2JmZCk7Ci0JICAgIH0KLQotCSAgLyogRmlsbCBpbiB0aGUgbHN0IHN5bWJvbCByZWNvcmQuICAqLwotCSAgY3Vycl9sc3Rfc3ltLT5oaWRkZW4gPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5zZWNvbmRhcnlfZGVmID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX3R5cGUgPSBpbmZvLnN5bWJvbF90eXBlOwotCSAgY3Vycl9sc3Rfc3ltLT5zeW1ib2xfc2NvcGUgPSBpbmZvLnN5bWJvbF9zY29wZTsKLQkgIGN1cnJfbHN0X3N5bS0+Y2hlY2tfbGV2ZWwgPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5tdXN0X3F1YWxpZnkgPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5pbml0aWFsbHlfZnJvemVuID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+bWVtb3J5X3Jlc2lkZW50ID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+aXNfY29tbW9uID0gYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnN5bWJvbC5zZWN0aW9uKTsKLQkgIGN1cnJfbHN0X3N5bS0+ZHVwX2NvbW1vbiA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnhsZWFzdCA9IDM7Ci0JICBjdXJyX2xzdF9zeW0tPmFyZ19yZWxvYyA9IGluZm8uYXJnX3JlbG9jOwotCSAgY3Vycl9sc3Rfc3ltLT5uYW1lLm5fc3RyeCA9IHAgLSBzdHJpbmdzICsgNDsKLQkgIGN1cnJfbHN0X3N5bS0+cXVhbGlmaWVyX25hbWUubl9zdHJ4ID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX2luZm8gPSBpbmZvLnN5bWJvbF9pbmZvOwotCSAgY3Vycl9sc3Rfc3ltLT5zeW1ib2xfdmFsdWUgPSBpbmZvLnN5bWJvbF92YWx1ZSB8IGluZm8ucHJpdl9sZXZlbDsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX2Rlc2NyaXB0b3IgPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5yZXNlcnZlZCA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnNvbV9pbmRleCA9IHNvbV9pbmRleDsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX2tleSA9IHNvbV9iZmRfYXJfc3ltYm9sX2hhc2ggKCZzeW0tPnN5bWJvbCk7Ci0JICBjdXJyX2xzdF9zeW0tPm5leHRfZW50cnkgPSAwOwotCi0JICAvKiBJbnNlcnQgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCi0JICBpZiAoaGFzaF90YWJsZVtjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgJSBsc3QuaGFzaF9zaXplXSkKLQkgICAgewotCSAgICAgIHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCAqdG1wOwotCi0JICAgICAgLyogVGhlcmUgaXMgYWxyZWFkeSBzb21ldGhpbmcgYXQgdGhlIGhlYWQgb2YgdGhpcyBoYXNoIGNoYWluLAotCQkgc28gdGFjayB0aGlzIHN5bWJvbCBvbnRvIHRoZSBlbmQgb2YgdGhlIGNoYWluLiAgKi8KLQkgICAgICB0bXAgPSBsYXN0X2hhc2hfZW50cnlbY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ICUgbHN0Lmhhc2hfc2l6ZV07Ci0JICAgICAgdG1wLT5uZXh0X2VudHJ5Ci0JCT0gKGN1cnJfbHN0X3N5bSAtIGxzdF9zeW1zKSAqIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKQotCQkgICsgbHN0Lmhhc2hfc2l6ZSAqIDQgCi0JCSAgKyBsc3QubW9kdWxlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KQotCQkgICsgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZpcnN0IGVudHJ5IGluIHRoaXMgaGFzaCBjaGFpbi4gICovCi0JICAgICAgaGFzaF90YWJsZVtjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgJSBsc3QuaGFzaF9zaXplXQotCQk9IChjdXJyX2xzdF9zeW0gLSBsc3Rfc3ltcykgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCkKLQkJICArIGxzdC5oYXNoX3NpemUgKiA0IAotCQkgICsgbHN0Lm1vZHVsZV9jb3VudCAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkKLQkJICArIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCSAgICB9Ci0KLQkgIC8qIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3Qgc3ltYm9sIHdlIGFkZGVkIHRvIHRoaXMgY2hhaW4gc28gd2UgY2FuCi0JICAgICBlYXNpbHkgdXBkYXRlIGl0cyBuZXh0X2VudHJ5IHBvaW50ZXIuICAqLwotCSAgbGFzdF9oYXNoX2VudHJ5W2N1cnJfbHN0X3N5bS0+c3ltYm9sX2tleSAlIGxzdC5oYXNoX3NpemVdCi0JICAgID0gY3Vycl9sc3Rfc3ltOwotCi0KLQkgIC8qIFVwZGF0ZSB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgIGJmZF9wdXRfMzIgKGFiZmQsIHN0cmxlbiAoc3ltLT5zeW1ib2wubmFtZSksIHApOwotCSAgcCArPSA0OwotCSAgc3RyY3B5IChwLCBzeW0tPnN5bWJvbC5uYW1lKTsKLQkgIHAgKz0gc3RybGVuIChzeW0tPnN5bWJvbC5uYW1lKSArIDE7Ci0JICB3aGlsZSAoKGludClwICUgNCkKLQkgICAgewotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgMCwgcCk7Ci0JICAgICAgcCsrOwotCSAgICB9Ci0KLQkgIC8qIEhlYWQgdG8gdGhlIG5leHQgc3ltYm9sLiAgKi8KLQkgIGN1cnJfbHN0X3N5bSsrOwotCX0KLQotICAgICAgLyogS2VlcCB0cmFjayBvZiB3aGVyZSBlYWNoIFNPTSB3aWxsIGZpbmFsbHkgcmVzaWRlOyB0aGVuIGxvb2sKLQkgYXQgdGhlIG5leHQgQkZELiAgKi8KLSAgICAgIGN1cnJfc29tX29mZnNldCArPSBhcmVsdF9zaXplIChjdXJyX2JmZCkgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotIAotICAgICAgLyogQSBwYXJ0aWN1bGFyIG9iamVjdCBpbiB0aGUgYXJjaGl2ZSBtYXkgaGF2ZSBhbiBvZGQgbGVuZ3RoOyB0aGUKLQkgbGlua2VyIHJlcXVpcmVzIG9iamVjdHMgYmVnaW4gb24gYW4gZXZlbiBib3VuZGFyeS4gIFNvIHJvdW5kCi0JIHVwIHRoZSBjdXJyZW50IG9mZnNldCBhcyBuZWNlc3NhcnkuICAqLwotICAgICAgY3Vycl9zb21fb2Zmc2V0ID0gKGN1cnJfc29tX29mZnNldCArIDB4MSkgJiB+MHgxOwotICAgICAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKLSAgICAgIHNvbV9pbmRleCsrOwotICAgIH0KLQotICAvKiBOb3cgc2NyaWJibGUgb3V0IHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgaGFzaF90YWJsZSwgbHN0Lmhhc2hfc2l6ZSwgNCwgYWJmZCkKLSAgICAgICE9IGxzdC5oYXNoX3NpemUgKiA0KQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZW4gdGhlIFNPTSBkaWN0aW9uYXJ5LiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc29tX2RpY3QsIGxzdC5tb2R1bGVfY291bnQsCi0JCSBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpLCBhYmZkKQotICAgICAgIT0gbHN0Lm1vZHVsZV9jb3VudCAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogVGhlIGxpYnJhcnkgc3ltYm9scy4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGxzdF9zeW1zLCBuc3ltcywgc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpLCBhYmZkKQotICAgICAgIT0gbnN5bXMgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogQW5kIGZpbmFsbHkgdGhlIHN0cmluZ3MuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzdHJpbmdzLCBzdHJpbmdfc2l6ZSwgMSwgYWJmZCkgIT0gc3RyaW5nX3NpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGhhc2hfdGFibGUgIT0gTlVMTCkKLSAgICBmcmVlIChoYXNoX3RhYmxlKTsKLSAgaWYgKHNvbV9kaWN0ICE9IE5VTEwpCi0gICAgZnJlZSAoc29tX2RpY3QpOwotICBpZiAobGFzdF9oYXNoX2VudHJ5ICE9IE5VTEwpCi0gICAgZnJlZSAobGFzdF9oYXNoX2VudHJ5KTsKLSAgaWYgKGxzdF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAobHN0X3N5bXMpOwotICBpZiAoc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKHN0cmluZ3MpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGhhc2hfdGFibGUgIT0gTlVMTCkKLSAgICBmcmVlIChoYXNoX3RhYmxlKTsKLSAgaWYgKHNvbV9kaWN0ICE9IE5VTEwpCi0gICAgZnJlZSAoc29tX2RpY3QpOwotICBpZiAobGFzdF9oYXNoX2VudHJ5ICE9IE5VTEwpCi0gICAgZnJlZSAobGFzdF9oYXNoX2VudHJ5KTsKLSAgaWYgKGxzdF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAobHN0X3N5bXMpOwotICBpZiAoc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKHN0cmluZ3MpOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBMU1QgZm9yIHRoZSBhcmNoaXZlLgotCi0gICBZb3UnbGwgbmV2ZXIgYmVsaWV2ZSB0aGlzIGlzIHJlYWxseSBob3cgYXJtYXBzIGFyZSBoYW5kbGVkIGluIFNPTS4uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX2FybWFwIChhYmZkLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIGJmZCAqY3Vycl9iZmQ7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIHVuc2lnbmVkIGludCBpLCBsc3Rfc2l6ZSwgbnN5bXMsIHN0cmluZ3NpemU7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICBzdHJ1Y3QgbHN0X2hlYWRlciBsc3Q7Ci0gIGludCAqcDsKLSAKLSAgLyogV2UnbGwgdXNlIHRoaXMgZm9yIHRoZSBhcmNoaXZlJ3MgZGF0ZSBhbmQgbW9kZSBsYXRlci4gICovCi0gIGlmIChzdGF0IChhYmZkLT5maWxlbmFtZSwgJnN0YXRidWYpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIC8qIEZ1ZGdlIGZhY3Rvci4gICovCi0gIGJmZF9hcmRhdGEgKGFiZmQpLT5hcm1hcF90aW1lc3RhbXAgPSBzdGF0YnVmLnN0X210aW1lICsgNjA7Ci0KLSAgLyogQWNjb3VudCBmb3IgdGhlIGxzdCBoZWFkZXIgZmlyc3QuICAqLwotICBsc3Rfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCi0gIC8qIFN0YXJ0IGJ1aWxkaW5nIHRoZSBMU1QgaGVhZGVyLiAgKi8KLSAgLyogRklYTUU6ICBEbyB3ZSBuZWVkIHRvIGV4YW1pbmUgZWFjaCBlbGVtZW50IHRvIGRldGVybWluZSB0aGUKLSAgICAgbGFyZ2VzdCBpZCBudW1iZXI/ICAqLwotICBsc3Quc3lzdGVtX2lkID0gQ1BVX1BBX1JJU0MxXzA7Ci0gIGxzdC5hX21hZ2ljID0gTElCTUFHSUM7Ci0gIGxzdC52ZXJzaW9uX2lkID0gVkVSU0lPTl9JRDsKLSAgbHN0LmZpbGVfdGltZS5zZWNzID0gMDsKLSAgbHN0LmZpbGVfdGltZS5uYW5vc2VjcyA9IDA7Ci0KLSAgbHN0Lmhhc2hfbG9jID0gbHN0X3NpemU7Ci0gIGxzdC5oYXNoX3NpemUgPSBTT01fTFNUX0hBU0hfU0laRTsKLQotICAvKiBIYXNoIHRhYmxlIGlzIGEgU09NX0xTVF9IQVNIX1NJWkUgMzJiaXQgb2Zmc2V0cy4gICovCi0gIGxzdF9zaXplICs9IDQgKiBTT01fTFNUX0hBU0hfU0laRTsKLQotICAvKiBXZSBuZWVkIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgU09NcyBpbiB0aGlzIGFyY2hpdmUuICAqLwotICBjdXJyX2JmZCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgbHN0Lm1vZHVsZV9jb3VudCA9IDA7Ci0gIHdoaWxlIChjdXJyX2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE9ubHkgdHJ1ZSBTT00gb2JqZWN0cyBjb3VudC4gICovCi0gICAgICBpZiAoY3Vycl9iZmQtPmZvcm1hdCA9PSBiZmRfb2JqZWN0Ci0JICAmJiBjdXJyX2JmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyKQotCWxzdC5tb2R1bGVfY291bnQrKzsKLSAgICAgIGN1cnJfYmZkID0gY3Vycl9iZmQtPm5leHQ7Ci0gICAgfQotICBsc3QubW9kdWxlX2xpbWl0ID0gbHN0Lm1vZHVsZV9jb3VudDsKLSAgbHN0LmRpcl9sb2MgPSBsc3Rfc2l6ZTsKLSAgbHN0X3NpemUgKz0gc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSAqIGxzdC5tb2R1bGVfY291bnQ7Ci0KLSAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBpbXBvcnQvZXhwb3J0IHRhYmxlcywgYXV4aWxpYXJ5IGhlYWRlcnMsCi0gICAgIG9yIGZyZWUgbGlzdHMgeWV0LiAgTWFrZSB0aGUgbGlua2VyIHdvcmsgYSBsaXR0bGUgaGFyZGVyCi0gICAgIHRvIG1ha2Ugb3VyIGxpZmUgZWFzaWVyLiAgKi8KLQotICBsc3QuZXhwb3J0X2xvYyA9IDA7Ci0gIGxzdC5leHBvcnRfY291bnQgPSAwOwotICBsc3QuaW1wb3J0X2xvYyA9IDA7Ci0gIGxzdC5hdXhfbG9jID0gMDsKLSAgbHN0LmF1eF9zaXplID0gMDsKLQotICAvKiBDb3VudCBob3cgbWFueSBzeW1ib2xzIHdlIHdpbGwgaGF2ZSBvbiB0aGUgaGFzaCBjaGFpbnMgYW5kIHRoZQotICAgICBzaXplIG9mIHRoZSBhc3NvY2lhdGVkIHN0cmluZyB0YWJsZS4gICovCi0gIGlmIChzb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlIChhYmZkLCAmbnN5bXMsICZzdHJpbmdzaXplKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbHN0X3NpemUgKz0gc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpICogbnN5bXM7Ci0KLSAgLyogRm9yIHRoZSBzdHJpbmcgdGFibGUuICBPbmUgZGF5IHdlIG1pZ2h0IGFjdHVhbGx5IHVzZSB0aGlzIGluZm8KLSAgICAgdG8gYXZvaWQgc21hbGwgc2Vla3MvcmVhZHMgd2hlbiByZWFkaW5nIGFyY2hpdmVzLiAgKi8KLSAgbHN0LnN0cmluZ19sb2MgPSBsc3Rfc2l6ZTsKLSAgbHN0LnN0cmluZ19zaXplID0gc3RyaW5nc2l6ZTsKLSAgbHN0X3NpemUgKz0gc3RyaW5nc2l6ZTsKLQotICAvKiBTT00gQUJJIHNheXMgdGhpcyBtdXN0IGJlIHplcm8uICAqLwotICBsc3QuZnJlZV9saXN0ID0gMDsKLSAgbHN0LmZpbGVfZW5kID0gbHN0X3NpemU7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgY2hlY2tzdW0uICBNdXN0IGhhcHBlbiBhZnRlciB0aGUgZW50aXJlIGxzdCBoZWFkZXIKLSAgICAgaGFzIGZpbGxlZCBpbi4gICovCi0gIHAgPSAoaW50ICopJmxzdDsKLSAgbHN0LmNoZWNrc3VtID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpL3NpemVvZiAoaW50KSAtIDE7IGkrKykKLSAgICBsc3QuY2hlY2tzdW0gXj0gKnArKzsKLQotICBzcHJpbnRmIChoZHIuYXJfbmFtZSwgIi8gICAgICAgICAgICAgICAiKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCBiZmRfYXJkYXRhIChhYmZkKS0+YXJtYXBfdGltZXN0YW1wKTsKLSAgc3ByaW50ZiAoaGRyLmFyX3VpZCwgIiVsZCIsIChsb25nKSBnZXR1aWQgKCkpOwotICBzcHJpbnRmIChoZHIuYXJfZ2lkLCAiJWxkIiwgKGxvbmcpIGdldGdpZCAoKSk7Ci0gIHNwcmludGYgKGhkci5hcl9tb2RlLCAiJS04byIsICh1bnNpZ25lZCBpbnQpIHN0YXRidWYuc3RfbW9kZSk7Ci0gIHNwcmludGYgKGhkci5hcl9zaXplLCAiJS0xMGQiLCAoaW50KSBsc3Rfc2l6ZSk7Ci0gIGhkci5hcl9mbWFnWzBdID0gJ2AnOwotICBoZHIuYXJfZm1hZ1sxXSA9ICdcMDEyJzsKLQotICAvKiBUdXJuIGFueSBudWxscyBpbnRvIHNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCi0gICAgaWYgKCgoY2hhciAqKSAoJmhkcikpW2ldID09ICdcMCcpCi0gICAgICAoKChjaGFyICopICgmaGRyKSlbaV0pID0gJyAnOwotCi0gIC8qIFNjcmliYmxlIG91dCB0aGUgYXIgaGVhZGVyLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyBzY3JpYmJsZSBvdXQgdGhlIGxzdCBoZWFkZXIuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmbHN0LCAxLCBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBCdWlsZCBhbmQgd3JpdGUgdGhlIGFybWFwLiAgKi8KLSAgaWYgKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmIChhYmZkLCBuc3ltcywgc3RyaW5nc2l6ZSwgbHN0LCBlbGVuZ3RoKQotICAgICAgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyogRG9uZS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGcmVlIGFsbCBpbmZvcm1hdGlvbiB3ZSBoYXZlIGNhY2hlZCBmb3IgdGhpcyBCRkQuICBXZSBjYW4gYWx3YXlzCi0gICByZWFkIGl0IGFnYWluIGxhdGVyIGlmIHdlIG5lZWQgaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpvOwotCi0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotI2RlZmluZSBGUkVFKHgpIGlmICh4ICE9IE5VTEwpIHsgZnJlZSAoeCk7IHggPSBOVUxMOyB9Ci0gIC8qIEZyZWUgdGhlIG5hdGl2ZSBzdHJpbmcgYW5kIHN5bWJvbCB0YWJsZXMuICAqLwotICBGUkVFIChvYmpfc29tX3N5bXRhYiAoYWJmZCkpOwotICBGUkVFIChvYmpfc29tX3N0cmluZ3RhYiAoYWJmZCkpOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgLyogRnJlZSB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gLTE7Ci0gICAgICBGUkVFIChzb21fc2VjdGlvbl9kYXRhIChvKS0+cmVsb2Nfc3RyZWFtKTsKLSAgICAgIC8qIEZyZWUgdGhlIGdlbmVyaWMgcmVsb2NhdGlvbnMuICAqLwotICAgICAgRlJFRSAoby0+cmVsb2NhdGlvbik7Ci0gICAgfQotI3VuZGVmIEZSRUUKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRW5kIG9mIG1pc2NlbGxhbmVvdXMgc3VwcG9ydCBmdW5jdGlvbnMuICovCi0KLS8qIExpbmtlciBzdXBwb3J0IGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZXR1cm4gKHNvbV9pc19zdWJzcGFjZSAoc2VjKSAmJiBzZWMtPl9yYXdfc2l6ZSA+IDI0MDAwMCk7Ci19Ci0KLSNkZWZpbmUJc29tX2Nsb3NlX2FuZF9jbGVhbnVwCQlzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBzb21fcmVhZF9hcl9oZHIJCQlfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNkZWZpbmUgc29tX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQliZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgc29tX2dldF9lbHRfYXRfaW5kZXgJCV9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIHNvbV9nZW5lcmljX3N0YXRfYXJjaF9lbHQJYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBzb21fdHJ1bmNhdGVfYXJuYW1lCQliZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBzb21fc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQlfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgc29tX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgc29tX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAJYmZkX3RydWUKLSNkZWZpbmUgc29tX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhICBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBzb21fZ2V0X2xpbmVubyAgICAgICAgICAgICAgICAgIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgc29tX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAlfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgc29tX3JlYWRfbWluaXN5bWJvbHMJCV9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIHNvbV9taW5pc3ltYm9sX3RvX3N5bWJvbAlfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgc29tX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2RlZmluZSBzb21fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIHNvbV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIHNvbV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBzb21fYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgc29tX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0KLSNkZWZpbmUgc29tX2JmZF9nY19zZWN0aW9ucwkJYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQotCi1jb25zdCBiZmRfdGFyZ2V0IHNvbV92ZWMgPQotewotICAic29tIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfc29tX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEIHwgRFlOQU1JQyksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkJLyogc2VjdGlvbiBmbGFncyAqLwotCi0vKiBsZWFkaW5nX3N5bWJvbF9jaGFyOiBpcyB0aGUgZmlyc3QgY2hhciBvZiBhIHVzZXIgc3ltYm9sCi0gICBwcmVkaWN0YWJsZSwgYW5kIGlmIHNvIHdoYXQgaXMgaXQgKi8KLSAgMCwKLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNCwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0gIHtfYmZkX2R1bW15X3RhcmdldCwKLSAgIHNvbV9vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwKLSAgIF9iZmRfZHVtbXlfdGFyZ2V0Ci0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgc29tX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgc29tX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotI3VuZGVmIHNvbQotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIE5VTEwsCi0gIAotICAoUFRSKSAwCi19OwotCi0jZW5kaWYgLyogSE9TVF9IUFBBSFBVWCB8fCBIT1NUX0hQUEFCU0QgfHwgSE9TVF9IUFBBT1NGICovCmRpZmYgLS1naXQgYS9iZmQvc29tLmggYi9iZmQvc29tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzc4MDQuLjAwMDAwMDAKLS0tIGEvYmZkL3NvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qIEhQIFBBLVJJU0MgU09NIG9iamVjdCBmaWxlIGZvcm1hdDogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfU09NX0gKLSNkZWZpbmUgX1NPTV9ICi0KLSNpbmNsdWRlICJsaWJocHBhLmgiCi0KLSNpbmNsdWRlIDxhLm91dC5oPgotI2luY2x1ZGUgPGxzdC5oPgotI2luY2x1ZGUgPGFyLmg+Ci0KLS8qIFRoZSBTT00gQkZEIGJhY2tlbmQgZG9lc24ndCBjdXJyZW50bHkgdXNlIGFueXRoaW5nIGZyb20gdGhlc2UKLSAgIHR3byBpbmNsdWRlIGZpbGVzLCBidXQgaXQncyBsaWtlbHkgdG8gbmVlZCB0aGVtIGluIHRoZSBmdXR1cmUuICAqLwotI2lmZGVmIFJfRExUX1JFTAotI2luY2x1ZGUgPHNobC5oPgotI2luY2x1ZGUgPGRsLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpCi0vKiBCU0QgdXNlcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNjaGVtZSBmb3Igb2JqZWN0IGZpbGUgaWRlbnRpZmljYXRpb24uCi0gICBzbyBmb3Igbm93LCBkZWZpbmUgX1BBX1JJU0NfSUQgdG8gYWNjZXB0IGFueSByYW5kb20gdmFsdWUgZm9yIGEgbW9kZWwKLSAgIG51bWJlci4gICovCi0jdW5kZWYgX1BBX1JJU0NfSUQKLSNkZWZpbmUgX1BBX1JJU0NfSUQoX19tX251bSkgMQotI2VuZGlmIC8qIEhPU1RfSFBQQUJTRCAqLwotCi0jZGVmaW5lIEZJTEVfSERSX1NJWkUgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpCi0jZGVmaW5lIEFVWF9IRFJfU0laRSBzaXplb2Yoc3RydWN0IHNvbV9leGVjX2F1eGhkcikKLQotdHlwZWRlZiBzdHJ1Y3Qgc29tX3N5bWJvbAotICB7Ci0gICAgYXN5bWJvbCBzeW1ib2w7Ci0gICAgdW5zaWduZWQgaW50IHNvbV90eXBlOwotCi0gICAgLyogU3RydWN0dXJlZCBsaWtlIHRoZSBFTEYgdGNfZGF0YSB1bmlvbi4gIEFsbG93cyBtb3JlIGNvZGUgc2hhcmluZwotICAgICAgIGluIEdBUyB0aGlzIHdheS4gICovCi0gICAgdW5pb24KLSAgICAgIHsKLQlzdHJ1Y3QKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaHBwYV9hcmdfcmVsb2M7Ci0JICB1bnNpZ25lZCBpbnQgaHBwYV9wcml2X2xldmVsOwotCX0gYXA7Ci0JUFRSIGFueTsKLSAgICAgIH0KLSAgICB0Y19kYXRhOwotCi0gICAgLyogSW5kZXggb2YgdGhpcyBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIE9ubHkgdXNlZCB3aGVuCi0gICAgICAgYnVpbGRpbmcgcmVsb2NhdGlvbiBzdHJlYW1zIGZvciBpbmNvbXBsZXRlIG9iamVjdHMuICAqLwotICAgIGludCBpbmRleDsKLQotICAgIC8qIEhvdyBtYW55IHRpbWVzIHRoaXMgc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uLiAgQnkgc29ydGluZwotICAgICAgIHRoZSBzeW1ib2xzIGZyb20gbW9zdCB1c2VkIHRvIGxlYXN0IHVzZWQgd2UgY2FuIHNpZ25pZmljYW50bHkKLSAgICAgICByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHJlbG9jYXRpb24gc3RyZWFtIGZvciBpbmNvbXBsZXRlIG9iamVjdHMuICAqLwotICAgIGludCByZWxvY19jb3VudDsKLQotICAgIC8qIER1cmluZyBvYmplY3QgZmlsZSB3cml0aW5nLCB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lIG9mIHRoaXMgc3ltYm9sCi0gICAgICAgaW4gdGhlIFNPTSBzdHJpbmcgdGFibGUuICovCi0gICAgaW50IHN0cmluZ3RhYl9vZmZzZXQ7Ci0gIH0KLXNvbV9zeW1ib2xfdHlwZTsKLQotLyogQSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhbGwgdGhlIG1hZ2ljIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBhIEJGRCdzCi0gICBwcml2YXRlIGRhdGEgd2hpY2ggbmVlZHMgdG8gYmUgY29waWVkIGR1cmluZyBhbiBvYmpjb3B5L3N0cmlwIHJ1bi4gICovCi1zdHJ1Y3Qgc29tX2V4ZWNfZGF0YQotICB7Ci0gICAgLyogU29ydC1vZiBhIG1hZ2ljIG51bWJlci4gIEJTRCB1c2VzIGl0IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KLSAgICAgICBuYXRpdmUgZXhlY3V0YWJsZXMgYW5kIGhwdXggZXhlY3V0YWJsZXMuICAqLwotICAgIHNob3J0IHN5c3RlbV9pZDsKLQotICAgIC8qIE1hZ2ljIGV4ZWMgZmxhZ3MuICBUaGVzZSBjb250cm9sIHRoaW5ncyBsaWtlIHdoZXRoZXIgb3Igbm90Ci0gICAgICAgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNpbmcgaXMgYWxsb3dlZCBhbmQgdGhlIGxpa2UuICAqLwotICAgIGxvbmcgZXhlY19mbGFnczsKLQotICAgIC8qIEFkZCBtb3JlIHN0dWZmIGhlcmUgYXMgbmVlZGVkLiAgR29vZCBleGFtcGxlcyBvZiBpbmZvcm1hdGlvbgotICAgICAgIHdlIG1pZ2h0IHdhbnQgdG8gcGFzcyB3b3VsZCBiZSBwcmVzdW1lZF9kcCwgZW50cnlfKiBhbmQgbWF5YmUKLSAgICAgICBvdGhlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXIuICAqLwotICB9OwotCi1zdHJ1Y3Qgc29tZGF0YQotICB7Ci0gICAgLyogQWxsIHRoZSBtYWdpYyBpbmZvcm1hdGlvbiBhYm91dCBhbiBleGVjdXRhYmxlIHdoaWNoIGxpdmVzCi0gICAgICAgaW4gdGhlIHByaXZhdGUgQkZEIHN0cnVjdHVyZSBhbmQgbmVlZHMgdG8gYmUgY29waWVkIGZyb20KLSAgICAgICB0aGUgaW5wdXQgYmZkIHRvIHRoZSBvdXRwdXQgYmZkIGR1cmluZyBhIG9iamNvcHkvc3RyaXAuICAqLwotICAgIHN0cnVjdCBzb21fZXhlY19kYXRhICpleGVjX2RhdGE7Ci0KLSAgICAvKiBUaGVzZSB0aHJlZSBmaWVsZHMgYXJlIG9ubHkgdXNlZCB3aGVuIHdyaXRpbmcgZmlsZXMgYW5kIGFyZQotICAgICAgIGdlbmVyYXRlZCBmcm9tIHNjcmF0Y2guICBUaGV5IG5lZWQgbm90IGJlIGNvcGllZCBmb3Igb2JqY29weQotICAgICAgIG9yIHN0cmlwIHRvIHdvcmsuICAqLwotICAgIHN0cnVjdCBoZWFkZXIgKmZpbGVfaGRyOwotICAgIHN0cnVjdCBjb3B5cmlnaHRfYXV4X2hkciAqY29weXJpZ2h0X2F1eF9oZHI7Ci0gICAgc3RydWN0IHVzZXJfc3RyaW5nX2F1eF9oZHIgKnZlcnNpb25fYXV4X2hkcjsKLSAgICBzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICpleGVjX2hkcjsKLSAgICBDT01QVU5JVCAqY29tcF91bml0OwotCi0gICAgLyogUG9pbnRlcnMgdG8gYSBzYXZlZCBjb3B5IG9mIHRoZSBzeW1ib2wgYW5kIHN0cmluZyB0YWJsZXMuICBUaGVzZQotICAgICAgIG5lZWQgbm90IGJlIGNvcGllZCBmb3Igb2JqY29weSBvciBzdHJpcCB0byB3b3JrLiAgKi8KLSAgICBzb21fc3ltYm9sX3R5cGUgKnN5bXRhYjsKLSAgICBjaGFyICpzdHJpbmd0YWI7Ci0gICAgYXN5bWJvbCAqKnNvcnRlZF9zeW1zOwotCi0gICAgLyogV2UgcmVtZW1iZXIgdGhlc2Ugb2Zmc2V0cyBzbyB0aGF0IGFmdGVyIGNoZWNrX2ZpbGVfZm9ybWF0LCB3ZSBoYXZlCi0gICAgICAgbm8gZGVwZW5kZW5jaWVzIG9uIHRoZSBwYXJ0aWN1bGFyIGZvcm1hdCBvZiB0aGUgZXhlY19oZHIuCi0gICAgICAgVGhlc2Ugb2Zmc2V0cyBuZWVkIG5vdCBiZSBjb3BpZWQgZm9yIG9iamNvcHkgb3Igc3RyaXAgdG8gd29yay4gICovCi0KLSAgICBmaWxlX3B0ciBzeW1fZmlsZXBvczsKLSAgICBmaWxlX3B0ciBzdHJfZmlsZXBvczsKLSAgICBmaWxlX3B0ciByZWxvY19maWxlcG9zOwotICAgIHVuc2lnbmVkIHN0cmluZ3RhYl9zaXplOwotICB9OwotCi1zdHJ1Y3Qgc29tX2RhdGFfc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3Qgc29tZGF0YSBhOwotICB9OwotCi0vKiBTdWJzdHJ1Y3R1cmUgb2Ygc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uCi0gICB3aGljaCBjYW4ndCBiZSByZXByZXNlbnRlZCBieSB0aGUgZ2VuZXJpYyBCRkQgc2VjdGlvbiBzdHJ1Y3R1cmUsCi0gICBidXQgd2hpY2ggbXVzdCBiZSBjb3BpZWQgZHVyaW5nIG9iamNvcHkgb3Igc3RyaXAuICAqLwotc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0Ci0gIHsKLSAgICAvKiBWYXJpb3VzIGZpZWxkcyBpbiBzcGFjZSBhbmQgc3Vic3BhY2UgaGVhZGVycyB0aGF0IHdlIG5lZWQKLSAgICAgICB0byBwYXNzIGFyb3VuZC4gICovCi0gICAgdW5zaWduZWQgaW50IHNvcnRfa2V5IDogODsKLSAgICB1bnNpZ25lZCBpbnQgYWNjZXNzX2NvbnRyb2xfYml0cyA6IDc7Ci0gICAgdW5zaWduZWQgaW50IGlzX2RlZmluZWQgOiAxOwotICAgIHVuc2lnbmVkIGludCBpc19wcml2YXRlIDogMTsKLSAgICB1bnNpZ25lZCBpbnQgcXVhZHJhbnQgOiAyOwotCi0gICAgLyogRm9yIHN1YnNwYWNlcywgdGhpcyBwb2ludHMgdG8gdGhlIHNlY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUKLSAgICAgICBzcGFjZSBpbiB3aGljaCB0aGUgc3Vic3BhY2UgaXMgY29udGFpbmVkLiAgRm9yIHNwYWNlcyBpdCBwb2ludHMKLSAgICAgICBiYWNrIHRvIHRoZSBzZWN0aW9uIGZvciB0aGlzIHNwYWNlLiAgKi8KLSAgICBhc2VjdGlvbiAqY29udGFpbmVyOwotCi0gICAgLyogVGhlIHVzZXItc3BlY2lmaWVkIHNwYWNlIG51bWJlci4gIEl0IGlzIHdyb25nIHRvIHVzZSB0aGlzIGFzCi0gICAgICAgYW4gaW5kZXggc2luY2UgZHVwbGljYXRlcyBhbmQgaG9sZXMgYXJlIGFsbG93ZWQuICAqLwotICAgIGludCBzcGFjZV9udW1iZXI7Ci0KLSAgICAvKiBBZGQgbW9yZSBzdHVmZiBoZXJlIGFzIG5lZWRlZC4gIEdvb2QgZXhhbXBsZXMgb2YgaW5mb3JtYXRpb24KLSAgICAgICB3ZSBtaWdodCB3YW50IHRvIHBhc3Mgd291bGQgYmUgaW5pdGlhbGl6YXRpb24gcG9pbnRlcnMsIAotICAgICAgIGFuZCB0aGUgbWFueSBzdWJzcGFjZSBmbGFncyB3ZSBkbyBub3QgcmVwcmVzZW50IHlldC4gICovCi0gIH07Ci0KLS8qIFVzZWQgdG8ga2VlcCBleHRyYSBTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gc2VjdGlvbi4KLQotICAgcmVsb2Nfc2l6ZSBob2xkcyB0aGUgc2l6ZSBvZiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0sIG5vdGUgdGhpcwotICAgaXMgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIGFzIFNPTSByZWxvY2F0aW9ucwotICAgYXJlIHZhcmlhYmxlIGxlbmd0aC4gCi0KLSAgIHJlbG9jX3N0cmVhbSBpcyB0aGUgYWN0dWFsIHN0cmVhbSBvZiByZWxvY2F0aW9uIGVudHJpZXMuICAqLwotCi1zdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCAqY29weV9kYXRhOwotICAgIHVuc2lnbmVkIGludCByZWxvY19zaXplOwotICAgIGNoYXIgKnJlbG9jX3N0cmVhbTsKLSAgICBzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgKnNwYWNlX2RpY3Q7Ci0gICAgc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICpzdWJzcGFjZV9kaWN0OwotICB9OwotCi0jZGVmaW5lIHNvbWRhdGEoYmZkKQkJCSgoYmZkKS0+dGRhdGEuc29tX2RhdGEtPmEpCi0jZGVmaW5lIG9ial9zb21fZXhlY19kYXRhKGJmZCkJCShzb21kYXRhKGJmZCkuZXhlY19kYXRhKQotI2RlZmluZSBvYmpfc29tX2ZpbGVfaGRyKGJmZCkJCShzb21kYXRhKGJmZCkuZmlsZV9oZHIpCi0jZGVmaW5lIG9ial9zb21fZXhlY19oZHIoYmZkKQkJKHNvbWRhdGEoYmZkKS5leGVjX2hkcikKLSNkZWZpbmUgb2JqX3NvbV9jb3B5cmlnaHRfaGRyKGJmZCkJKHNvbWRhdGEoYmZkKS5jb3B5cmlnaHRfYXV4X2hkcikKLSNkZWZpbmUgb2JqX3NvbV92ZXJzaW9uX2hkcihiZmQpCShzb21kYXRhKGJmZCkudmVyc2lvbl9hdXhfaGRyKQotI2RlZmluZSBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQoYmZkKQkoc29tZGF0YShiZmQpLmNvbXBfdW5pdCkKLSNkZWZpbmUgb2JqX3NvbV9zeW10YWIoYmZkKQkJKHNvbWRhdGEoYmZkKS5zeW10YWIpCi0jZGVmaW5lIG9ial9zb21fc3RyaW5ndGFiKGJmZCkJCShzb21kYXRhKGJmZCkuc3RyaW5ndGFiKQotI2RlZmluZSBvYmpfc29tX3N5bV9maWxlcG9zKGJmZCkJKHNvbWRhdGEoYmZkKS5zeW1fZmlsZXBvcykKLSNkZWZpbmUgb2JqX3NvbV9zdHJfZmlsZXBvcyhiZmQpCShzb21kYXRhKGJmZCkuc3RyX2ZpbGVwb3MpCi0jZGVmaW5lIG9ial9zb21fc3RyaW5ndGFiX3NpemUoYmZkKQkoc29tZGF0YShiZmQpLnN0cmluZ3RhYl9zaXplKQotI2RlZmluZSBvYmpfc29tX3JlbG9jX2ZpbGVwb3MoYmZkKQkoc29tZGF0YShiZmQpLnJlbG9jX2ZpbGVwb3MpCi0jZGVmaW5lIG9ial9zb21fc29ydGVkX3N5bXMoYmZkKQkoc29tZGF0YShiZmQpLnNvcnRlZF9zeW1zKQotI2RlZmluZSBzb21fc2VjdGlvbl9kYXRhKHNlYykgXAotICAoKHN0cnVjdCBzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCAqKXNlYy0+dXNlZF9ieV9iZmQpCi0jZGVmaW5lIHNvbV9zeW1ib2xfZGF0YShzeW1ib2wpCQkoKHNvbV9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpCi0KLQotLyogRGVmaW5lcyBncm91cHMgb2YgYmFzaWMgcmVsb2NhdGlvbnMuICBGSVhNRTogIFRoZXNlIHNob3VsZAotICAgYmUgdGhlIG9ubHkgYmFzaWMgcmVsb2NhdGlvbnMgY3JlYXRlZCBieSBHQVMuICBUaGUgcmVzdAotICAgc2hvdWxkIGJlIGludGVybmFsIHRvIHRoZSBCRkQgYmFja2VuZC4KLQotICAgVGhlIGlkZWEgaXMgYm90aCBTT00gYW5kIEVMRiBkZWZpbmUgdGhlc2UgYmFzaWMgcmVsb2NhdGlvbgotICAgdHlwZXMgc28gdGhleSBtYXAgaW50byBhIFNPTSBvciBFTEYgc3BlY2lmaWMgcmVsb2F0aW9uIGFzCi0gICBhcHByb3ByaWF0ZS4gIFRoaXMgYWxsb3dzIEdBUyB0byBzaGFyZSBtdWNoIG1vcmUgY29kZSAKLSAgIGJldHdlZW4gdGhlIHR3byBvYmplY3QgZm9ybWF0cy4gICovCi0KLSNkZWZpbmUgUl9IUFBBX05PTkUJCQlSX05PX1JFTE9DQVRJT04KLSNkZWZpbmUJUl9IUFBBCQkJCVJfQ09ERV9PTkVfU1lNQk9MCi0jZGVmaW5lCVJfSFBQQV9QQ1JFTF9DQUxMCQlSX1BDUkVMX0NBTEwKLSNkZWZpbmUgUl9IUFBBX0FCU19DQUxMCQkJUl9BQlNfQ0FMTAotI2RlZmluZQlSX0hQUEFfR09UT0ZGCQkJUl9EUF9SRUxBVElWRQotI2RlZmluZSBSX0hQUEFfRU5UUlkJCQlSX0VOVFJZCi0jZGVmaW5lIFJfSFBQQV9FWElUCQkJUl9FWElUCi0jZGVmaW5lIFJfSFBQQV9DT01QTEVYCQkJUl9DT01QMQotI2RlZmluZSBSX0hQUEFfQkVHSU5fQlJUQUIJCVJfQkVHSU5fQlJUQUIKLSNkZWZpbmUgUl9IUFBBX0VORF9CUlRBQgkJUl9FTkRfQlJUQUIKLSNkZWZpbmUgUl9IUFBBX0JFR0lOX1RSWQkJUl9CRUdJTl9UUlkKLSNkZWZpbmUgUl9IUFBBX0VORF9UUlkJCQlSX0VORF9UUlkKLQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zLCBtb3N0bHkgZm9yIHVzZSBieSBHQVMuICAqLwotYm9vbGVhbiBiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgUEFSQU1TICgoYXNlY3Rpb24gKiwgaW50LCBpbnQsCi0JCQkJCQl1bnNpZ25lZCBpbnQsIGludCkpOwotYm9vbGVhbiBiZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgUEFSQU1TICgoYXNlY3Rpb24gKiwgYXNlY3Rpb24gKiwKLQkJCQkJCSAgIGludCwgdW5zaWduZWQgaW50LCBpbnQpKTsKLXZvaWQgYmZkX3NvbV9zZXRfc3ltYm9sX3R5cGUgUEFSQU1TICgoYXN5bWJvbCAqLCB1bnNpZ25lZCBpbnQpKTsKLWJvb2xlYW4gYmZkX3NvbV9hdHRhY2hfYXV4X2hkciBQQVJBTVMgKChiZmQgKiwgaW50LCBjaGFyICopKTsKLWludCAqKiBocHBhX3NvbV9nZW5fcmVsb2NfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgaW50LCBpbnQsIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCwKLQkgICBpbnQsIGFzeW1ib2wgKikpOwotYm9vbGVhbiBiZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQotI2VuZGlmIC8qIF9TT01fSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL3NwYXJjbGludXguYyBiL2JmZC9zcGFyY2xpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYTI5YjMuLjAwMDAwMDAKLS0tIGEvYmZkL3NwYXJjbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDc3MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGxpbnV4IGZsYXZvcmVkIHNwYXJjIGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFICAgICAgICA0MDk2Ci0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgMTAyNAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgICAgICAgIDB4MAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9TUEFSQyB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX3NwYXJjCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3BhcmNsaW51eF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXNwYXJjLWxpbnV4IgotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBNWSh2ZWMpOwotCi0vKiBXZSBhbHdheXMgZ2VuZXJhdGUgUU1BR0lDIGZpbGVzIGluIHByZWZlcmVuY2UgdG8gWk1BR0lDIGZpbGVzLiAgSXQKLSAgIHdvdWxkIGJlIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBhIGxpbmtlciBvcHRpb24sIGlmIHRoYXQgZXZlcgotICAgYmVjb21lcyBpbXBvcnRhbnQuICAqLwotCi1zdGF0aWMgdm9pZCBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNwYXJjbGludXhfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmNsaW51eF9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IHFfbWFnaWNfZm9ybWF0OwotICByZXR1cm4gTkFNRShhb3V0LGZpbmFsX2xpbmspIChhYmZkLCBpbmZvLCBNWV9maW5hbF9saW5rX2NhbGxiYWNrKTsKLX0KLQotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBzcGFyY2xpbnV4X2JmZF9maW5hbF9saW5rCi0KLS8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuIHNwYXJjbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmNsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fU1BBUkMpOwotCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBzcGFyY2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cwotLyogQ29kZSB0byBsaW5rIGFnYWluc3QgTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotI2lmbmRlZiBHT1RfUkVGX1BSRUZJWAotI2RlZmluZSAgICAgICAgR09UX1JFRl9QUkVGSVggICJfX0dPVF8iCi0jZW5kaWYKLQotI2RlZmluZSBJU19HT1RfU1lNKG5hbWUpIFwKLSAgKHN0cm5jbXAgKG5hbWUsIEdPVF9SRUZfUFJFRklYLCBzaXplb2YgR09UX1JFRl9QUkVGSVggLSAxKSA9PSAwKQotCi0vKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICovCi0KLSNpZm5kZWYgUExUX1JFRl9QUkVGSVgKLSNkZWZpbmUgICAgICAgIFBMVF9SRUZfUFJFRklYICAiX19QTFRfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfUExUX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBQTFRfUkVGX1BSRUZJWCwgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogVGhpcyBzdHJpbmcgaXMgdXNlZCB0byBnZW5lcmF0ZSBzcGVjaWFsaXplZCBlcnJvciBtZXNzYWdlcy4gICovCi0KLSNpZm5kZWYgTkVFRFNfU0hSTElCCi0jZGVmaW5lIE5FRURTX1NIUkxJQiAiX19ORUVEU19TSFJMSUJfIgotI2VuZGlmCi0KLS8qIFRoaXMgc3BlY2lhbCBzeW1ib2wgaXMgYSBzZXQgdmVjdG9yIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mCi0gICBwb2ludGVycyB0byBmaXh1cCB0YWJsZXMuICBJdCB3aWxsIGJlIHByZXNlbnQgaW4gYW55IGR5bmFtaWNseQotICAgbGlua2VkIGZpbGUuICBUaGUgbGlua2VyIGdlbmVyYXRlZCBmaXh1cCB0YWJsZSBzaG91bGQgYWxzbyBiZSBhZGRlZAotICAgdG8gdGhlIGxpc3QsIGFuZCBpdCBzaG91bGQgYWx3YXlzIGFwcGVhciBpbiB0aGUgc2Vjb25kIHNsb3QgKHRoZQotICAgZmlyc3Qgb25lIGlzIGEgZHVtbXkgd2l0aCBhIG1hZ2ljIG51bWJlciB0aGF0IGlzIGRlZmluZWQgaW4KLSAgIGNydDAubykuICAqLwotCi0jaWZuZGVmIFNIQVJBQkxFX0NPTkZMSUNUUwotI2RlZmluZSBTSEFSQUJMRV9DT05GTElDVFMgIl9fU0hBUkFCTEVfQ09ORkxJQ1RTX18iCi0jZW5kaWYKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgVGhlIHRlcm1pbm9sb2d5IGlzIGEgYml0IHN0cmFuZ2UsIGJ1dAotICAgZWFjaCBmaXh1cCBjb250YWlucyB0d28gMzIgYml0IG51bWJlcnMuICBBIHJlZ3VsYXIgZml4dXAgY29udGFpbnMKLSAgIGFuIGFkZHJlc3MgYW5kIGEgcG9pbnRlciwgYW5kIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkIHN0b3JlIHRoZQotICAgYWRkcmVzcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci4gIEEgYnVpbHRpbiBmaXh1cAotICAgY29udGFpbnMgdHdvIHBvaW50ZXJzLCBhbmQgd2Ugc2hvdWxkIHJlYWQgdGhlIGFkZHJlc3MgdXNpbmcgb25lCi0gICBwb2ludGVyIGFuZCBzdG9yZSBpdCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgb3RoZXIKLSAgIHBvaW50ZXIuICBCdWlsdGluIGZpeHVwcyBjb21lIGludG8gcGxheSB3aGVuIHdlIGhhdmUgZHVwbGljYXRlCi0gICBfX0dPVF9fIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlLiAgVGhlIGJ1aWx0aW4gZml4dXAgd2lsbCBjb3B5Ci0gICB0aGUgR09UIHBvaW50ZXIgZnJvbSBvbmUgb3ZlciBpbnRvIHRoZSBvdGhlci4gICovCi0KLXN0cnVjdCBmaXh1cAotewotICBzdHJ1Y3QgZml4dXAgKm5leHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEganVtcCBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLAotICAgICB6ZXJvIGlmIHRoaXMgaXMganVzdCBhIHBvaW50ZXIgKi8KLSAgY2hhciBqdW1wOwotCi0gIGNoYXIgYnVpbHRpbjsKLX07Ci0KLS8qIFdlIGRvbid0IG5lZWQgYSBzcGVjaWFsIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCBidXQgd2UgZG8gbmVlZAotICAgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGJldHdlZW4gbGlua2VyIHBhc3Nlcywgc28gd2UgdXNlIGEgc3BlY2lhbAotICAgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIGxpbmsuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBOdW1iZXIgb2YgZml4dXBzLiAgKi8KLSAgc2l6ZV90IGZpeHVwX2NvdW50OwotCi0gIC8qIE51bWJlciBvZiBidWlsdGluIGZpeHVwcy4gICovCi0gIHNpemVfdCBsb2NhbF9idWlsdGluczsKLQotICAvKiBMaXN0IG9mIGZpeHVwcy4gICovCi0gIHN0cnVjdCBmaXh1cCAqZml4dXBfbGlzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKm5ld19maXh1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosCi0gICAgICAgICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLSAgICAgICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0gICAgICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X3RhbGx5X3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1saW51eF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotICAgICAgICBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkczsgdGhlcmUgYXJlbid0IGFueS4gICovCi0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKQotICAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eF9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5keW5vYmogPSBOVUxMOwotICByZXQtPmZpeHVwX2NvdW50ID0gMDsKLSAgcmV0LT5sb2NhbF9idWlsdGlucyA9IDA7Ci0gIHJldC0+Zml4dXBfbGlzdCA9IE5VTEw7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbGludXhfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYW91dF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksXAotICAgICAgICAgICAgICAgICAgICAgICAgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykgICAgICAgICAgICAgICAgICAgIFwKLSAgKGFvdXRfbGlua19oYXNoX3RyYXZlcnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgKCYodGFibGUpLT5yb290LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLCBcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBMaW51eCBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCi0gICBqdXN0IGEgY2FzdC4gICovCi0KLSNkZWZpbmUgbGludXhfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIFN0b3JlIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBuZXcgZml4dXAuICAqLwotCi1zdGF0aWMgc3RydWN0IGZpeHVwICoKLW5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsIGJ1aWx0aW4pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBpbnQgYnVpbHRpbjsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotCi0gIGYgPSAoc3RydWN0IGZpeHVwICopIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGZpeHVwKSk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgcmV0dXJuIGY7Ci0gIGYtPm5leHQgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3QgPSBmOwotICBmLT5oID0gaDsKLSAgZi0+dmFsdWUgPSB2YWx1ZTsKLSAgZi0+YnVpbHRpbiA9IGJ1aWx0aW47Ci0gIGYtPmp1bXAgPSAwOwotICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIHJlYWxpemUgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbGluayB0byBhIHNoYXJlZAotICAgbGlicmFyeS4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0gICBmaXh1cCB0YWJsZSwgYW5kIHdlIHVsdGltYXRlbHkgbmVlZCB0byBhZGQgYSBwb2ludGVyIHRvIHRoaXMgaW50bwotICAgdGhlIHNldCB2ZWN0b3IgZm9yIFNIQVJBQkxFX0NPTkZMSUNUUy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90Ci0gICBrbm93IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBidXQgdGhhdCdzIE9LIC0gd2UganVzdCBuZWVkIHRvCi0gICBjcmVhdGUgaXQgZm9yIG5vdy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLQotICAvKiBOb3RlIHRoYXQgd2Ugc2V0IHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcuICAqLwotICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0KLSAgLyogV2UgY2hvb3NlIHRvIHVzZSB0aGUgbmFtZSAiLmxpbnV4LWR5bmFtaWMiIGZvciB0aGUgZml4dXAgdGFibGUuCi0gICAgIFdoeSBub3Q/ICovCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHMtPl9yYXdfc2l6ZSA9IDA7Ci0gIHMtPmNvbnRlbnRzID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gYWRkIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBUaGlzIGlzCi0gICBhIHdyYXBwZXIgYXJvdW5kIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIHdoaWNoIGhhbmRsZXMgdGhlCi0gICB0d2Vha2luZyBuZWVkZWQgZm9yIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxpbnV4X2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gaW5zZXJ0OwotCi0gIC8qIExvb2sgdXAgYW5kIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuCi0gICAgIElmIHdlIGRvLCBhbmQgdGhlIGRlZmluaW5nIGVudHJ5IGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgd2UKLSAgICAgbmVlZCB0byBjcmVhdGUgdGhlIGR5bmFtaWMgc2VjdGlvbnMuCi0KLSAgICAgRklYTUU6IFdoYXQgaWYgYWJmZC0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yPyAgV2UgbWF5IHdhbnQgdG8KLSAgICAgYmUgYWJsZSB0byBsaW5rIExpbnV4IGEub3V0IGFuZCBFTEYgb2JqZWN0cyB0b2dldGhlciwgYnV0IHNlcmlvdXMKLSAgICAgY29uZnVzaW9uIGlzIHBvc3NpYmxlLiAgKi8KLQotICBpbnNlcnQgPSBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBTSEFSQUJMRV9DT05GTElDVFMpID09IDAKLSAgICAgICYmIChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIGlmICghIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotICAgICAgaW5zZXJ0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLSAgICAgICAgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgICAgIHsKLSAgICAgICAgIHN0cnVjdCBmaXh1cCAqZjsKLQotICAgICAgICAgaWYgKGhhc2hwICE9IE5VTEwpCi0gICAgICAgICAgICpoYXNocCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0gICAgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgISBJU19QTFRfU1lNIChuYW1lKSk7Ci0gICAgICAgICBpZiAoZiA9PSBOVUxMKQotICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICBmLT5qdW1wID0gSVNfUExUX1NZTSAobmFtZSk7Ci0KLSAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgIH0KLSAgICB9Ci0KLSAgLyogRG8gdGhlIHVzdWFsIHByb2NlZHVyZSBmb3IgYWRkaW5nIGEgc3ltYm9sLiAgKi8KLSAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNocCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEluc2VydCBhIHBvaW50ZXIgdG8gb3VyIHRhYmxlIGluIHRoZSBzZXQgdmVjdG9yLiAgVGhlIGR5bmFtaWMKLSAgICAgbGlua2VyIHJlcXVpcmVzIHRoaXMgaW5mb3JtYXRpb24gKi8KLSAgaWYgKGluc2VydCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgLyogSGVyZSB3ZSBkbyBvdXIgc3BlY2lhbCB0aGluZyB0byBhZGQgdGhlIHBvaW50ZXIgdG8gdGhlCi0gICAgICAgIGR5bmFtaWMgc2VjdGlvbiBpbiB0aGUgU0hBUkFCTEVfQ09ORkxJQ1RTIHNldCB2ZWN0b3IuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIubGludXgtZHluYW1pYyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0gICAgICAgICAgICAoaW5mbywgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgU0hBUkFCTEVfQ09ORkxJQ1RTLAotICAgICAgICAgICAgIEJTRl9HTE9CQUwgfCBCU0ZfQ09OU1RSVUNUT1IsIHMsIDAsIE5VTEwsIGZhbHNlLCBmYWxzZSwgTlVMTCkpKQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIHdpbGwgY3Jhd2wgdGhlIGhhc2ggdGFibGUgYW5kIGNvbWUgaGVyZSBmb3IgZXZlcnkgZ2xvYmFsIHN5bWJvbC4KLSAgIFdlIHdpbGwgZXhhbWluZSBlYWNoIGVudHJ5IGFuZCBzZWUgaWYgdGhlcmUgYXJlIGluZGljYXRpb25zIHRoYXQgd2UKLSAgIG5lZWQgdG8gYWRkIGEgZml4dXAuICBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGNhc2VzIC0gb25lIGlzIHdoZXJlCi0gICB5b3UgaGF2ZSBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgb2YgUExUIG9yIEdPVCBzeW1ib2xzIC0gdGhlc2Ugd2lsbAotICAgaGF2ZSBhbHJlYWR5IGJlZW4gY2F1Z2h0IGFuZCBhZGRlZCBhcyAiYnVpbHRpbiIgZml4dXBzLiAgSWYgd2UgZmluZAotICAgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBub24gUExUL0dPVCBzeW1ib2wgaXMgYWxzbyBwcmVzZW50LCB3ZQotICAgY29udmVydCBpdCB0byBhIHJlZ3VsYXIgZml4dXAgaW5zdGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF90YWxseV9zeW1ib2xzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgZGF0YTsKLSAgc3RydWN0IGZpeHVwICpmLCAqZjE7Ci0gIGludCBpc19wbHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmgxLCAqaDI7Ci0gIGJvb2xlYW4gZXhpc3RzOwotCi0gIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgc3RybmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBORUVEU19TSFJMSUIsCi0gICAgICAgICAgICAgICAgIHNpemVvZiBORUVEU19TSFJMSUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyICpwOwotICAgICAgY2hhciAqYWxsb2MgPSBOVUxMOwotCi0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nICsgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDE7Ci0gICAgICBwID0gc3RycmNociAobmFtZSwgJ18nKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0gICAgICAgYWxsb2MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0KLSAgICAgIGlmIChwID09IE5VTEwgfHwgYWxsb2MgPT0gTlVMTCkKLSAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcydcbiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgc3RyY3B5IChhbGxvYywgbmFtZSk7Ci0gICAgICAgICBwID0gc3RycmNociAoYWxsb2MsICdfJyk7Ci0gICAgICAgICAqcCsrID0gJ1wwJzsKLSAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAoXygiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzLnNvLiVzJ1xuIiksCi0gICAgICAgICAgICBhbGxvYywgcCk7Ci0gICAgICAgICBmcmVlIChhbGxvYyk7Ci0gICAgICAgfQotCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGEgUExUL0dPVCwgd2UgZG8gbm90IGV2ZW4gbmVlZCB0byBsb29rIGF0Ci0gICAgIGl0LiAgKi8KLSAgaXNfcGx0ID0gSVNfUExUX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQotICBpZiAoaXNfcGx0IHx8IElTX0dPVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZykpCi0gICAgewotICAgICAgLyogTG9vayB1cCB0aGlzIHN5bWJvbCB0d2ljZS4gIE9uY2UganVzdCBhcyBhIHJlZ3VsYXIgbG9va3VwLAotICAgICAgICBhbmQgdGhlbiBhZ2FpbiBmb2xsb3dpbmcgYWxsIG9mIHRoZSBpbmRpcmVjdCBsaW5rcyB1bnRpbCB3ZQotICAgICAgICByZWFjaCBhIHJlYWwgc3ltYm9sLiAgKi8KLSAgICAgIGgxID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAvKiBoMiBkb2VzIG5vdCBmb2xsb3cgaW5kaXJlY3Qgc3ltYm9scy4gKi8KLSAgICAgIGgyID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAvKiBUaGUgcmVhbCBzeW1ib2wgbXVzdCBleGlzdCBidXQgaWYgaXQgaXMgYWxzbyBhbiBBQlMgc3ltYm9sLAotICAgICAgICB0aGVyZSBpcyBubyBuZWVkIHRvIGhhdmUgYSBmaXh1cC4gIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGJvdGgKLSAgICAgICAgY2FtZSBmcm9tIHRoZSBzYW1lIGxpYnJhcnkuICBJZiBvbiB0aGUgb3RoZXIgaGFuZCwgd2UgaGFkIHRvCi0gICAgICAgIHVzZSBhbiBpbmRpcmVjdCBzeW1ib2wgdG8gZ2V0IHRvIHRoZSByZWFsIHN5bWJvbCwgd2UgYWRkIHRoZQotICAgICAgICBmaXh1cCBhbnl3YXksIHNpbmNlIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGVzZSBzeW1ib2xzIGNvbWUKLSAgICAgICAgZnJvbSBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcmllcyAqLwotICAgICAgaWYgKGgxICE9IE5VTEwKLSAgICAgICAgICYmICgoKGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICAgICAgICAgIHx8IGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAgICAgICAgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoMS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotICAgICAgICAgICAgIHx8IGgyLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KSkKLSAgICAgICB7Ci0gICAgICAgICAvKiBTZWUgaWYgdGhlcmUgaXMgYSAiYnVpbHRpbiIgZml4dXAgYWxyZWFkeSBwcmVzZW50Ci0gICAgICAgICAgICBpbnZvbHZpbmcgdGhpcyBzeW1ib2wuICBJZiBzbywgY29udmVydCBpdCB0byBhIHJlZ3VsYXIKLSAgICAgICAgICAgIGZpeHVwLiAgSW4gdGhlIGVuZCwgdGhpcyByZWxheGVzIHNvbWUgb2YgdGhlIHJlcXVpcmVtZW50cwotICAgICAgICAgICAgYWJvdXQgdGhlIG9yZGVyIG9mIHBlcmZvcm1pbmcgZml4dXBzLiAgKi8KLSAgICAgICAgIGV4aXN0cyA9IGZhbHNlOwotICAgICAgICAgZm9yIChmMSA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OwotICAgICAgICAgICAgICBmMSAhPSBOVUxMOwotICAgICAgICAgICAgICBmMSA9IGYxLT5uZXh0KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgaWYgKChmMS0+aCAhPSBoICYmIGYxLT5oICE9IGgxKQotICAgICAgICAgICAgICAgICB8fCAoISBmMS0+YnVpbHRpbiAmJiAhIGYxLT5qdW1wKSkKLSAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgIGlmIChmMS0+aCA9PSBoMSkKLSAgICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICBpZiAoISBleGlzdHMKLSAgICAgICAgICAgICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBmMS0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLSAgICAgICAgICAgICAgICAgZi0+anVtcCA9IGlzX3BsdDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBmMS0+aCA9IGgxOwotICAgICAgICAgICAgIGYxLT5qdW1wID0gaXNfcGx0OwotICAgICAgICAgICAgIGYxLT5idWlsdGluID0gMDsKLSAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOwotICAgICAgICAgICB9Ci0gICAgICAgICBpZiAoISBleGlzdHMKLSAgICAgICAgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBoLT5yb290LnJvb3QudS5kZWYudmFsdWUsIDApOwotICAgICAgICAgICAgIGlmIChmID09IE5VTEwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBObyB3YXkgdG8gcmV0dXJuIGVycm9yLiAgKi8KLSAgICAgICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZi0+anVtcCA9IGlzX3BsdDsKLSAgICAgICAgICAgfQotICAgICAgIH0KLQotICAgICAgLyogUXVpY2sgYW5kIGRpcnR5IHdheSBvZiBzdHJpcHBpbmcgdGhlc2Ugc3ltYm9scyBmcm9tIHRoZQotICAgICAgICBzeW10YWIuICovCi0gICAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0gICAgICAgaC0+cm9vdC53cml0dGVuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgLmxpbnV4LWR5bmFtaWMgc2VjdGlvbiBpcy4KLSAgIEl0IGlzIGNhbGxlZCBieSB0aGUgTGludXggbGlua2VyIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbgotICAgcm91dGluZS4gIFdlIGhhdmUgZmluaXNoZWQgcmVhZGluZyBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLCBhbmQgbm93Ci0gICB3ZSBqdXN0IHNjYW4gdGhlIGhhc2ggdGFibGVzIHRvIGZpbmQgb3V0IGhvdyBtYW55IGFkZGl0aW9uYWwgZml4dXBzCi0gICBhcmUgcmVxdWlyZWQuICAqLwotCi1ib29sZWFuCi1iZmRfc3BhcmNsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRmlyc3QgZmluZCB0aGUgZml4dXBzLi4uICovCi0gIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eF90YWxseV9zeW1ib2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBUUikgaW5mbyk7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIGJ1aWx0aW4gZml4dXBzLCBsZWF2ZSByb29tIGZvciBhIG1hcmtlci4gIFRoaXMgaXMKLSAgICAgdXNlZCBieSB0aGUgZHluYW1pYyBsaW5rZXIgc28gdGhhdCBpdCBrbm93cyB0aGF0IGFsbCB0aGF0IGZvbGxvdwotICAgICBhcmUgYnVpbHRpbiBmaXh1cHMgaW5zdGVhZCBvZiByZWd1bGFyIGZpeHVwcy4gICovCi0gIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmLT5idWlsdGluKQotICAgICAgIHsKLSAgICAgICAgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50OwotICAgICAgICAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnM7Ci0gICAgICAgICBicmVhazsKLSAgICAgICB9Ci0gICAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IDApCi0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBmaXh1cCB0YWJsZS4gIFdlIHdpbGwgZmlsbCBpdCBpbiBsYXRlci4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBpZiAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IDggKyBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgKiA4OwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIGFyZSByZWFkeSB0byBhY3R1YWxseSB3cml0ZSB0aGUgZml4dXAgdGFibGUgdG8KLSAgIHRoZSBvdXRwdXQgZmlsZS4gIFNjYW4gdGhlIGZpeHVwIHRhYmxlcyBhbmQgc28gZm9ydGggYW5kIGdlbmVyYXRlCi0gICB0aGUgc3R1ZmYgd2UgbmVlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9maW5pc2hfZHluYW1pY19saW5rIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqcywgKm9zLCAqaXM7Ci0gIGJmZF9ieXRlICpmaXh1cF90YWJsZTsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGZpeHVwICpmOwotICB1bnNpZ25lZCBpbnQgbmV3X2FkZHI7Ci0gIGludCBzZWN0aW9uX29mZnNldDsKLSAgdW5zaWduZWQgaW50IGZpeHVwc193cml0dGVuOwotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5saW51eC1keW5hbWljIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIG9zID0gcy0+b3V0cHV0X3NlY3Rpb247Ci0gIGZpeHVwc193cml0dGVuID0gMDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgcHJpbnRmICgiRml4dXAgdGFibGUgZmlsZSBvZmZzZXQ6ICV4ICBWTUE6ICV4XG4iLAotICAgICAgICAgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotICAgICAgICAgb3MtPnZtYSArIHMtPm91dHB1dF9vZmZzZXQpOwotI2VuZGlmCi0KLSAgZml4dXBfdGFibGUgPSBzLT5jb250ZW50czsKLSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50LCBmaXh1cF90YWJsZSk7Ci0gIGZpeHVwX3RhYmxlICs9IDQ7Ci0KLSAgLyogRmlsbCBpbiBmaXh1cCB0YWJsZS4gICovCi0gIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmLT5idWlsdGluKQotICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAgewotICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgICAgIChfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCi0gICAgICAgICAgICBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotICAgICAgICAgY29udGludWU7Ci0gICAgICAgfQotCi0gICAgICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgIHByaW50ZiAoIkZpeHVwKCVkKSAlczogJXggJXhcbiIsZi0+anVtcCwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLSAgICAgICAgICAgICBuZXdfYWRkciwgZi0+dmFsdWUpOwotI2VuZGlmCi0KLSAgICAgIGlmIChmLT5qdW1wKQotICAgICAgIHsKLSAgICAgICAgIC8qIFJlbGF0aXZlIGFkZHJlc3MgKi8KLSAgICAgICAgIG5ld19hZGRyID0gbmV3X2FkZHIgLSAoZi0+dmFsdWUgKyA1KTsKLQkgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLSAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSArIDEsIGZpeHVwX3RhYmxlKTsKLSAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICAgfQotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLSAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICAgfQotICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5sb2NhbF9idWlsdGlucyAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNwZWNpYWwgbWFya2VyIHNvIHdlIGtub3cgdG8gc3dpdGNoIHRvIHRoZSBvdGhlciB0eXBlIG9mIGZpeHVwICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICAgICB7Ci0gICAgICAgICBpZiAoISBmLT5idWlsdGluKQotICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgICAgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICAgICAgewotICAgICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAgICAgKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLSAgICAgICAgICAgICAgICBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICAgICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgICAgcHJpbnRmICgiRml4dXAoQikgJXM6ICV4ICV4XG4iLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotICAgICAgICAgICAgICAgICBuZXdfYWRkciwgZi0+dmFsdWUpOwotI2VuZGlmCi0KLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLSAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICAgICArK2ZpeHVwc193cml0dGVuOwotICAgICAgIH0KLSAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgIT0gZml4dXBzX3dyaXR0ZW4pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJXYXJuaW5nOiBmaXh1cCBjb3VudCBtaXNtYXRjaFxuIikpOwotICAgICAgd2hpbGUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IGZpeHVwc193cml0dGVuKQotICAgICAgIHsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICAgICB9Ci0gICAgfQotCi0gIGggPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fQlVJTFRJTl9GSVhVUFNfXyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gIGlmIChoICE9IE5VTEwKLSAgICAgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgewotICAgICAgaXMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJCdWlsdGluIGZpeHVwIHRhYmxlIGF0ICV4XG4iLCBuZXdfYWRkcik7Ci0jZW5kaWYKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLCBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLT5jb250ZW50cywgMSwgcy0+X3Jhd19zaXplLCBvdXRwdXRfYmZkKQotICAgICAgIT0gcy0+X3Jhd19zaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIGxpbnV4X2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgbGludXhfZmluaXNoX2R5bmFtaWNfbGluawotCi0jZGVmaW5lIE1ZX3ptYWdpY19jb250aWd1b3VzIDEKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvc3BhcmNseW54LmMgYi9iZmQvc3BhcmNseW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZmNhZTUuLjAwMDAwMDAKLS0tIGEvYmZkL3NwYXJjbHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciBTcGFyYyBiaW5hcmllcyB1bmRlciBMeW54T1MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZiAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfc3BhcmMKLQotI2VuZGlmCi0KLSNkZWZpbmUgTVkoT1ApIENBVChzcGFyY2x5bnhfYW91dF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXNwYXJjLWx5bngiCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImFvdXQvc3VuNC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIJCS8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLQotLyogVGhpcyBpcyBuZWVkZWQgdG8gcmVqZWN0IGEgTmV3c09TIGZpbGUsIGUuZy4gaW4KLSAgIGdkYi90ZXN0c3VpdGUvZ2RiLnQxMC9jcm9zc2xvYWQuZXhwLiA8a2luZ2RvbkBjeWdudXMuY29tPgotICAgSSBuZWVkZWQgdG8gYWRkIE1fVU5LTk9XTiB0byByZWNvZ25pemUgYSA2ODAwMCBvYmplY3QsIHNvIHRoaXMgd2lsbAotICAgcHJvYmFibHkgbm8gbG9uZ2VyIHJlamVjdCBhIE5ld3NPUyBvYmplY3QuICA8aWFuQGN5Z251cy5jb20+LiAqLwotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9VTktOT1dOIFwKLQkJCSAgICB8fCAobXR5cGUpID09IE1fNjgwMTAgXAotCQkJICAgIHx8IChtdHlwZSkgPT0gTV82ODAyMCBcCi0JCQkgICAgfHwgKG10eXBlKSA9PSBNX1NQQVJDKQotCi0vKgotVGhlIGZpbGUgQGNvZGV7YW91dGYxLmh9IGNvbnRhaW5zIHRoZSBjb2RlIGZvciBCRkQncwotYS5vdXQgYmFjayBlbmQuIENvbnRyb2wgb3ZlciB0aGUgZ2VuZXJhdGVkIGJhY2sgZW5kIGlzIGdpdmVuIGJ5IHRoZXNlCi10d28gcHJlcHJvY2Vzc29yIG5hbWVzOgotQHRhYmxlIEBjb2RlCi1AaXRlbSBBUkNIX1NJWkUKLVRoaXMgdmFsdWUgc2hvdWxkIGJlIGVpdGhlciAzMiBvciA2NCwgZGVwZW5kaW5nIHVwb24gdGhlIHNpemUgb2YgYW4KLWludCBpbiB0aGUgdGFyZ2V0IGZvcm1hdC4gSXQgY2hhbmdlcyB0aGUgc2l6ZXMgb2YgdGhlIHN0cnVjdHMgd2hpY2gKLXBlcmZvcm0gdGhlIG1lbW9yeS9kaXNrIG1hcHBpbmcgb2Ygc3RydWN0dXJlcy4KLQotVGhlIDY0IGJpdCBiYWNrZW5kIG1heSBvbmx5IGJlIHVzZWQgaWYgdGhlIGhvc3QgY29tcGlsZXIgc3VwcG9ydHMgNjQKLWludHMgKGVnIGxvbmcgbG9uZyB3aXRoIGdjYyksIGJ5IGRlZmluaW5nIHRoZSBuYW1lIEBjb2Rle0JGRF9IT1NUXzY0X0JJVH0gaW4gQGNvZGV7YmZkLmh9LgotV2l0aCB0aGlzIG5hbWUgZGVmaW5lZCwgQGVtcGh7YWxsfSBiZmQgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIHdpdGggNjRiaXQKLWFyaXRobWV0aWMsIG5vdCBqdXN0IHRob3NlIHRvIGEgNjRiaXQgdGFyZ2V0LgotCi1AaXRlbSBUQVJHRVROQU1FCi1UaGUgbmFtZSBwdXQgaW50byB0aGUgdGFyZ2V0IHZlY3Rvci4KLUBpdGVtCi1AZW5kIHRhYmxlCi0KLSovCi0KLS8qU1VQUFJFU1M1NTgqLwotLypTVVBQUkVTUzUyOSovCi0KLXZvaWQKLU5BTUUobHlueCxzZXRfYXJjaF9tYWNoKSAoYWJmZCwgbWFjaHR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG1hY2h0eXBlOwotewotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICBsb25nIG1hY2hpbmU7Ci0gIHN3aXRjaCAobWFjaHR5cGUpCi0gICAgewotCi0gICAgY2FzZSBNX1VOS05PV046Ci0gICAgICAvKiBTb21lIFN1bjNzIG1ha2UgbWFnaWMgbnVtYmVycyB3aXRob3V0IGNwdSB0eXBlcyBpbiB0aGVtLCBzbwotCSB3ZSdsbCBkZWZhdWx0IHRvIHRoZSA2ODAwMC4gKi8KLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNXzY4MDEwOgotICAgIGNhc2UgTV9IUDIwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNXzY4MDIwOgotICAgIGNhc2UgTV9IUDMwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAyMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NQQVJDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3NwYXJjOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV8zODY6Ci0gICAgY2FzZSBNXzM4Nl9EWU5JWDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9pMzg2OwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV8yOUs6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfYTI5azsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fSFBVWDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLSNkZWZpbmUgU0VUX0FSQ0hfTUFDSChBQkZELCBFWEVDKSBcCi0gIE5BTUUobHlueCxzZXRfYXJjaF9tYWNoKShBQkZELCBOX01BQ0hUWVBFIChFWEVDKSk7IFwKLSAgY2hvb3NlX3JlbG9jX3NpemUoQUJGRCk7Ci0KLS8qIERldGVybWluZSB0aGUgc2l6ZSBvZiBhIHJlbG9jYXRpb24gZW50cnksIGJhc2VkIG9uIHRoZSBhcmNoaXRlY3R1cmUgKi8KLXN0YXRpYyB2b2lkCi1jaG9vc2VfcmVsb2Nfc2l6ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfRVhUX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlIGluIEx5bnhPUyBmb3JtYXQuCi0gIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotTkFNRShhb3V0LHNwYXJjbHlueF93cml0ZV9vYmplY3RfY29udGVudHMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAvKiBNYWdpYyBudW1iZXIsIG1hZXN0cm8sIHBsZWFzZSEgICovCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX202ODAxMDoKLQkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fNjgwMTApOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9tYWNoX202ODAyMDoKLQkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fNjgwMjApOwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fU1BBUkMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV8zODYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV8yOUspOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fVU5LTk9XTik7Ci0gICAgfQotCi0gIGNob29zZV9yZWxvY19zaXplIChhYmZkKTsKLQotICBOX1NFVF9GTEFHUyAoKmV4ZWNwLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLQotICBXUklURV9IRUFERVJTIChhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfc2V0X3NpemVzIHNwYXJjbHlueF9zZXRfc2l6ZXMKLXN0YXRpYyBib29sZWFuCi1zcGFyY2x5bnhfc2V0X3NpemVzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSA9IDB4MjAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSA9IDB4MjAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSAweDIwMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KLQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBzcGFyY2x5bnhfYW91dF9iYWNrZW5kID0KLXsKLSAgMCwgMSwgMCwgMSwgMCwgc3BhcmNseW54X3NldF9zaXplcywgMCwKLSAgMCwJCQkJLyogYWRkX2R5bmFtaWNfc3ltYm9scyAqLwotICAwLAkJCQkvKiBhZGRfb25lX3N5bWJvbCAqLwotICAwLAkJCQkvKiBsaW5rX2R5bmFtaWNfb2JqZWN0ICovCi0gIDAsCQkJCS8qIHdyaXRlX2R5bmFtaWNfc3ltYm9sICovCi0gIDAsCQkJCS8qIGNoZWNrX2R5bmFtaWNfcmVsb2MgKi8KLSAgMAkJCQkvKiBmaW5pc2hfZHluYW1pY19saW5rICovCi19OwotDAotCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CQliZmRfdm9pZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19lbmQJCWJmZF92b2lkCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAotCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMJTkFNRShhb3V0LHNwYXJjbHlueF93cml0ZV9vYmplY3RfY29udGVudHMpCi0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YQkJCSZzcGFyY2x5bnhfYW91dF9iYWNrZW5kCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLWNoYXIgKmx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoKTsKLWludCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoKTsKLWJvb2xlYW4gbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKCk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpseW54X2NvcmVfZmlsZV9wICgpOwotCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUJTVlfY29yZV9maWxlX3AgbHlueF9jb3JlX2ZpbGVfcAotCi0jZW5kaWYgLyogTFlOWF9DT1JFICovCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL3NwYXJjbmV0YnNkLmMgYi9iZmQvc3BhcmNuZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3N2JiOC4uMDAwMDAwMAotLS0gYS9iZmQvc3BhcmNuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNEL3NwYXJjIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQllURVNfSU5fV09SRAk0Ci0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotLyogU1BBUkMgY2hpcHMgdXNlIGVpdGhlciA0SyBvciA4SyBwYWdlcywgYnV0IG9iamVjdCBmaWxlcyBhbHdheXMKLSAgIGFzc3VtZSA4SyBwYWdlIGFsaWdubWVudCBzbyB0aGV5IHdpbGwgd29yayBvbiBlaXRoZXIgb25lLiAqLwotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDB4MjAwMAotCi0jZGVmaW5lIERFRkFVTFRfQVJDSAliZmRfYXJjaF9zcGFyYwotI2RlZmluZSBERUZBVUxUX01JRCAJTV9TUEFSQ19ORVRCU0QKLQotI2RlZmluZSBNWShPUCkgQ0FUKHNwYXJjbmV0YnNkXyxPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXNwYXJjLW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL3NyZWMuYyBiL2JmZC9zcmVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZmRjNjQuLjAwMDAwMDAKLS0tIGEvYmZkL3NyZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzODEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBzLXJlY29yZCBvYmplY3RzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNVQlNFQ1RJT04KLQlTLVJlY29yZCBoYW5kbGluZwotCi1ERVNDUklQVElPTgotCQotCU9yZGluYXJ5IFMtUmVjb3JkcyBjYW5ub3QgaG9sZCBhbnl0aGluZyBidXQgYWRkcmVzc2VzIGFuZAotCWRhdGEsIHNvIHRoYXQncyBhbGwgdGhhdCB3ZSBpbXBsZW1lbnQuCi0KLQlUaGUgb25seSBpbnRlcmVzdGluZyB0aGluZyBpcyB0aGF0IFMtUmVjb3JkcyBtYXkgY29tZSBvdXQgb2YKLQlvcmRlciBhbmQgdGhlcmUgaXMgbm8gaGVhZGVyLCBzbyBhbiBpbml0aWFsIHNjYW4gaXMgcmVxdWlyZWQKLQl0byBkaXNjb3ZlciB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBhZGRyZXNzZXMgdXNlZCB0byBjcmVhdGUKLQl0aGUgdm1hIGFuZCBzaXplIG9mIHRoZSBvbmx5IHNlY3Rpb24gd2UgY3JlYXRlLiAgV2UKLQlhcmJpdHJhcmlseSBjYWxsIHRoaXMgc2VjdGlvbiAiLnRleHQiLgotCi0JV2hlbiBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgaXMgY2FsbGVkIHRoZSBmaWxlIGlzIHJlYWQKLQlhZ2FpbiwgYW5kIHRoaXMgdGltZSB0aGUgZGF0YSBpcyBwbGFjZWQgaW50byBhIGJmZF9hbGxvYydkCi0JYXJlYS4KLQotCUFueSBudW1iZXIgb2Ygc2VjdGlvbnMgbWF5IGJlIGNyZWF0ZWQgZm9yIG91dHB1dCwgd2Ugc2F2ZSB0aGVtCi0JdXAgYW5kIG91dHB1dCB0aGVtIHdoZW4gaXQncyB0aW1lIHRvIGNsb3NlIHRoZSBiZmQuCi0KLQlBbiBzIHJlY29yZCBsb29rcyBsaWtlOgotCQotRVhBTVBMRQotCVM8dHlwZT48bGVuZ3RoPjxhZGRyZXNzPjxkYXRhPjxjaGVja3N1bT4KLQkKLURFU0NSSVBUSU9OCi0JV2hlcmUKLQlvIGxlbmd0aAotCWlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9sbG93aW5nIHVwdG8gdGhlIGNoZWNrc3VtLiBOb3RlIHRoYXQKLQl0aGlzIGlzIG5vdCB0aGUgbnVtYmVyIG9mIGNoYXJzIGZvbGxvd2luZywgc2luY2UgaXQgdGFrZXMgdHdvCi0JY2hhcnMgdG8gcmVwcmVzZW50IGEgYnl0ZS4KLQlvIHR5cGUKLQlpcyBvbmUgb2Y6Ci0JMCkgaGVhZGVyIHJlY29yZAotCTEpIHR3byBieXRlIGFkZHJlc3MgZGF0YSByZWNvcmQKLQkyKSB0aHJlZSBieXRlIGFkZHJlc3MgZGF0YSByZWNvcmQKLQkzKSBmb3VyIGJ5dGUgYWRkcmVzcyBkYXRhIHJlY29yZAotCTcpIGZvdXIgYnl0ZSBhZGRyZXNzIHRlcm1pbmF0aW9uIHJlY29yZAotCTgpIHRocmVlIGJ5dGUgYWRkcmVzcyB0ZXJtaW5hdGlvbiByZWNvcmQKLQk5KSB0d28gYnl0ZSBhZGRyZXNzIHRlcm1pbmF0aW9uIHJlY29yZAotCQotCW8gYWRkcmVzcwotCWlzIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBkYXRhIGZvbGxvd2luZywgb3IgaW4gdGhlIGNhc2Ugb2YKLQlhIHRlcm1pbmF0aW9uIHJlY29yZCwgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGltYWdlCi0JbyBkYXRhCi0JaXMgdGhlIGRhdGEuCi0JbyBjaGVja3N1bQotCWlzIHRoZSBzdW0gb2YgYWxsIHRoZSByYXcgYnl0ZSBkYXRhIGluIHRoZSByZWNvcmQsIGZyb20gdGhlIGxlbmd0aAotCXVwd2FyZHMsIG1vZHVsbyAyNTYgYW5kIHN1YnRyYWN0ZWQgZnJvbSAyNTUuCi0KLQotU1VCU0VDVElPTgotCVN5bWJvbCBTLVJlY29yZCBoYW5kbGluZwotCi1ERVNDUklQVElPTgotCVNvbWUgSUNFIGVxdWlwbWVudCB1bmRlcnN0YW5kcyBhbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQKLQlTLVJlY29yZCBmb3JtYXQ7IHN5bWJvbHMgYW5kIHRoZWlyIGFkZHJlc3NlcyBjYW4gYmUgc2VudAotCWJlZm9yZSB0aGUgZGF0YS4KLQotCVRoZSBmb3JtYXQgb2YgdGhpcyBpczoKLQkoJCQgPG1vZHVsZW5hbWU+Ci0JCSg8c3BhY2U+IDxzeW1ib2w+IDxhZGRyZXNzPikqKQotCSQkCi0KLQlzbyBhIHNob3J0IHN5bWJvbCB0YWJsZSBjb3VsZCBsb29rIGxpa2U6Ci0KLUVYQU1QTEUKLQkkJCBmbGFzaC54Ci0JJCQgZmxhc2guYwotCSAgX3BvcnQ2ICQwCi0JICBfZGVsYXkgJDQKLQkgIF9zdGFydCAkMTQKLQkgIF9ldGV4dCAkODAzNgotCSAgX2VkYXRhICQ4MDM2Ci0gCSAgX2VuZCAkODAzNgotCSQkCi0KLURFU0NSSVBUSU9OCi0JV2UgYWxsb3cgc3ltYm9scyB0byBiZSBhbnl3aGVyZSBpbiB0aGUgZGF0YSBzdHJlYW0gLSB0aGUgbW9kdWxlIG5hbWVzCi0JYXJlIGFsd2F5cyBpZ25vcmVkLgotCQkKLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1zdGF0aWMgdm9pZCBzcmVjX2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCBzcmVjX3ByaW50X3N5bWJvbAotIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBzcmVjX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gc3JlY19ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBzcmVjX2dldF9ieXRlIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuICopKTsKLXN0YXRpYyB2b2lkIHNyZWNfYmFkX2J5dGUgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3NjYW4gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpzcmVjX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqc3ltYm9sc3JlY19vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3JlY19yZWFkX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICopKTsKLQotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9yZWNvcmQgUEFSQU1TICgoYmZkICosIGludCwgYmZkX3ZtYSwKLQkJCQkJICBjb25zdCBiZmRfYnl0ZSAqLAotCQkJCQkgIGNvbnN0IGJmZF9ieXRlICopKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfaGVhZGVyIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfbmV3X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN5bWJvbHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IHNyZWNfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBhc3ltYm9sICpzcmVjX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHNyZWNfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotCi0vKiBNYWNyb3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBoZXggYW5kIGJpbmFyeS4gKi8KLQotc3RhdGljIENPTlNUIGNoYXIgZGlnc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOwotCi0jZGVmaW5lIE5JQkJMRSh4KSBoZXhfdmFsdWUoeCkKLSNkZWZpbmUgSEVYKGJ1ZmZlcikgKChOSUJCTEUoKGJ1ZmZlcilbMF0pPDw0KSArIE5JQkJMRSgoYnVmZmVyKVsxXSkpCi0jZGVmaW5lIFRPSEVYKGQsIHgsIGNoKSBcCi0JZFsxXSA9IGRpZ3NbKHgpICYgMHhmXTsgXAotCWRbMF0gPSBkaWdzWygoeCk+PjQpJjB4Zl07IFwKLQljaCArPSAoKHgpICYgMHhmZik7Ci0jZGVmaW5lCUlTSEVYKHgpICBoZXhfcCh4KQotCi0vKiBJbml0aWFsaXplIGJ5IGZpbGxpbmcgaW4gdGhlIGhleCBjb252ZXJzaW9uIGFycmF5LiAqLwotCi1zdGF0aWMgdm9pZAotc3JlY19pbml0ICgpCi17Ci0gIHN0YXRpYyBib29sZWFuIGluaXRlZCA9IGZhbHNlOwotCi0gIGlmIChpbml0ZWQgPT0gZmFsc2UpCi0gICAgewotICAgICAgaW5pdGVkID0gdHJ1ZTsKLSAgICAgIGhleF9pbml0ICgpOwotICAgIH0KLX0KLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9uIGEgbGluZSBpcyBGRiAqLwotI2RlZmluZSBNQVhDSFVOSyAweGZmCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGZpdCBvbnRvIGEgbGluZSBvbiBvdXRwdXQgKi8KLSNkZWZpbmUgQ0hVTksgMjEKLQotLyogV2hlbiB3cml0aW5nIGFuIFMtcmVjb3JkIGZpbGUsIHRoZSBTLXJlY29yZHMgY2FuIG5vdCBiZSBvdXRwdXQgYXMKLSAgIHRoZXkgYXJlIHNlZW4uICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgdGhlbSBpbiBtZW1vcnkuICAqLwotCi1zdHJ1Y3Qgc3JlY19kYXRhX2xpc3Rfc3RydWN0Ci17Ci0gIHN0cnVjdCBzcmVjX2RhdGFfbGlzdF9zdHJ1Y3QgKm5leHQ7Ci0gIGJmZF9ieXRlICpkYXRhOwotICBiZmRfdm1hIHdoZXJlOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBzcmVjX2RhdGFfbGlzdF9zdHJ1Y3Qgc3JlY19kYXRhX2xpc3RfdHlwZTsKLQotLyogV2hlbiBzY2FubmluZyB0aGUgUy1yZWNvcmQgZmlsZSwgYSBsaW5rZWQgbGlzdCBvZiBzcmVjX3N5bWJvbAotICAgc3RydWN0dXJlcyBpcyBidWlsdCB0byByZXByZXNlbnQgdGhlIHN5bWJvbCB0YWJsZSAoaWYgdGhlcmUgaXMKLSAgIG9uZSkuICAqLwotCi1zdHJ1Y3Qgc3JlY19zeW1ib2wKLXsKLSAgc3RydWN0IHNyZWNfc3ltYm9sICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotICBiZmRfdm1hIHZhbDsKLX07Ci0KLS8qIFRoZSBTLXJlY29yZCB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHNyZWNfZGF0YV9zdHJ1Y3QKLSAgewotICAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKmhlYWQ7Ci0gICAgc3JlY19kYXRhX2xpc3RfdHlwZSAqdGFpbDsKLSAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgICBzdHJ1Y3Qgc3JlY19zeW1ib2wgKnN5bWJvbHM7Ci0gICAgc3RydWN0IHNyZWNfc3ltYm9sICpzeW10YWlsOwotICAgIGFzeW1ib2wgKmNzeW1ib2xzOwotICB9Ci10ZGF0YV90eXBlOwotCi1zdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIHRkYXRhX3R5cGUgKiwKLQkJCQkJICAgc3JlY19kYXRhX2xpc3RfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX3Rlcm1pbmF0b3IgUEFSQU1TICgoYmZkICosIHRkYXRhX3R5cGUgKikpOwotCi0vKiBTZXQgdXAgdGhlIFMtcmVjb3JkIHRkYXRhIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3JlY19pbml0ICgpOwotCi0gIGlmIChhYmZkLT50ZGF0YS5zcmVjX2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB0ZGF0YV90eXBlICp0ZGF0YSA9ICh0ZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICh0ZGF0YV90eXBlKSk7Ci0gICAgICBpZiAodGRhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEgPSB0ZGF0YTsKLSAgICAgIHRkYXRhLT50eXBlID0gMTsKLSAgICAgIHRkYXRhLT5oZWFkID0gTlVMTDsKLSAgICAgIHRkYXRhLT50YWlsID0gTlVMTDsKLSAgICAgIHRkYXRhLT5zeW1ib2xzID0gTlVMTDsKLSAgICAgIHRkYXRhLT5zeW10YWlsID0gTlVMTDsKLSAgICAgIHRkYXRhLT5jc3ltYm9scyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgYnl0ZSBmcm9tIGFuIFMgcmVjb3JkIGZpbGUuICBTZXQgKkVSUk9SUFRSIGlmIGFuIGVycm9yCi0gICBvY2N1cnJlZC4gIFJldHVybiBFT0Ygb24gZXJyb3Igb3IgZW5kIG9mIGZpbGUuICAqLwotCi1zdGF0aWMgaW50Ci1zcmVjX2dldF9ieXRlIChhYmZkLCBlcnJvcnB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuICplcnJvcnB0cjsKLXsKLSAgYmZkX2J5dGUgYzsKLQotICBpZiAoYmZkX3JlYWQgKCZjLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKLQkqZXJyb3JwdHIgPSB0cnVlOwotICAgICAgcmV0dXJuIEVPRjsKLSAgICB9Ci0KLSAgcmV0dXJuIChpbnQpIChjICYgMHhmZik7Ci19Ci0KLS8qIFJlcG9ydCBhIHByb2JsZW0gaW4gYW4gUyByZWNvcmQgZmlsZS4gIEZJWE1FOiBUaGlzIHByb2JhYmx5IHNob3VsZAotICAgbm90IGNhbGwgZnByaW50ZiwgYnV0IHdlIHJlYWxseSBkbyBuZWVkIHNvbWUgbWVjaGFuaXNtIGZvciBwcmludGluZwotICAgZXJyb3IgbWVzc2FnZXMuICAqLwotCi1zdGF0aWMgdm9pZAotc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcikKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgbGluZW5vOwotICAgICBpbnQgYzsKLSAgICAgYm9vbGVhbiBlcnJvcjsKLXsKLSAgaWYgKGMgPT0gRU9GKQotICAgIHsKLSAgICAgIGlmICghIGVycm9yKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciBidWZbMTBdOwotCi0gICAgICBpZiAoISBpc3ByaW50IChjKSkKLQlzcHJpbnRmIChidWYsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSBjKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBidWZbMF0gPSBjOwotCSAgYnVmWzFdID0gJ1wwJzsKLQl9Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6JWQ6IFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGAlcycgaW4gUy1yZWNvcmQgZmlsZVxuIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8sIGJ1Zik7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICB9Ci19Ci0KLS8qIEFkZCBhIG5ldyBzeW1ib2wgZm91bmQgaW4gYW4gUy1yZWNvcmQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX25ld19zeW1ib2wgKGFiZmQsIG5hbWUsIHZhbCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHNyZWNfc3ltYm9sICpuOwotCi0gIG4gPSAoc3RydWN0IHNyZWNfc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3JlY19zeW1ib2wpKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbi0+bmFtZSA9IG5hbWU7Ci0gIG4tPnZhbCA9IHZhbDsKLQotICBpZiAoYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5zeW1ib2xzID09IE5VTEwpCi0gICAgYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5zeW1ib2xzID0gbjsKLSAgZWxzZQotICAgIGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltdGFpbC0+bmV4dCA9IG47Ci0gIGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltdGFpbCA9IG47Ci0gIG4tPm5leHQgPSBOVUxMOwotCi0gICsrYWJmZC0+c3ltY291bnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgdGhlIFMgcmVjb3JkIGZpbGUgYW5kIHR1cm4gaXQgaW50byBzZWN0aW9ucy4gIFdlIGNyZWF0ZSBhIG5ldwotICAgc2VjdGlvbiBmb3IgZWFjaCBjb250aWd1b3VzIHNldCBvZiBieXRlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3NjYW4gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGM7Ci0gIHVuc2lnbmVkIGludCBsaW5lbm8gPSAxOwotICBib29sZWFuIGVycm9yID0gZmFsc2U7Ci0gIGJmZF9ieXRlICpidWYgPSBOVUxMOwotICBzaXplX3QgYnVmc2l6ZSA9IDA7Ci0gIGFzZWN0aW9uICpzZWMgPSBOVUxMOwotICBjaGFyICpzeW1idWYgPSBOVUxMOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YpCi0gICAgewotICAgICAgLyogV2Ugb25seSBidWlsZCBzZWN0aW9ucyBmcm9tIGNvbnRpZ3VvdXMgUy1yZWNvcmRzLCBzbyBpZiB0aGlzCi0gICAgICAgICBpcyBub3QgYW4gUy1yZWNvcmQsIHRoZW4gc3RvcCBidWlsZGluZyBhIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGMgIT0gJ1MnICYmIGMgIT0gJ1xyJyAmJiBjICE9ICdcbicpCi0Jc2VjID0gTlVMTDsKLQotICAgICAgc3dpdGNoIChjKQotCXsKLQlkZWZhdWx0OgotCSAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQotCWNhc2UgJ1xuJzoKLQkgICsrbGluZW5vOwotCSAgYnJlYWs7Ci0KLQljYXNlICdccic6Ci0JICBicmVhazsKLQotCWNhc2UgJyQnOgotCSAgLyogU3RhcnRpbmcgYSBtb2R1bGUgbmFtZSwgd2hpY2ggd2UgaWdub3JlLiAgKi8KLQkgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9ICdcbicKLQkJICYmIGMgIT0gRU9GKQotCSAgICA7Ci0JICBpZiAoYyA9PSBFT0YpCi0JICAgIHsKLQkgICAgICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICArK2xpbmVubzsKLQotCSAgYnJlYWs7Ci0KLQljYXNlICcgJzoKLQkgIGRvCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgYWxjOwotCSAgICAgIGNoYXIgKnAsICpzeW1uYW1lOwotCSAgICAgIGJmZF92bWEgc3ltdmFsOwotCi0JICAgICAgLyogU3RhcnRpbmcgYSBzeW1ib2wgZGVmaW5pdGlvbi4gICovCi0JICAgICAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GCi0JCSAgICAgJiYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykpCi0JCTsKLQotCSAgICAgIGlmIChjID09ICdcbicgfHwgYyA9PSAnXHInKQotCQlicmVhazsKLQotCSAgICAgIGlmIChjID09IEVPRikKLQkJewotCQkgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBhbGMgPSAxMDsKLQkgICAgICBzeW1idWYgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChhbGMgKyAxKTsKLQkgICAgICBpZiAoc3ltYnVmID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgcCA9IHN5bWJ1ZjsKLQotCSAgICAgICpwKysgPSBjOwotCSAgICAgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRgotCQkgICAgICYmICEgaXNzcGFjZSAoYykpCi0JCXsKLQkJICBpZiAoKHVuc2lnbmVkIGludCkgKHAgLSBzeW1idWYpID49IGFsYykKLQkJICAgIHsKLQkJICAgICAgY2hhciAqbjsKLQotCQkgICAgICBhbGMgKj0gMjsKLQkJICAgICAgbiA9IChjaGFyICopIGJmZF9yZWFsbG9jIChzeW1idWYsIGFsYyArIDEpOwotCQkgICAgICBpZiAobiA9PSBOVUxMKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICAgIHAgPSBuICsgKHAgLSBzeW1idWYpOwotCQkgICAgICBzeW1idWYgPSBuOwotCQkgICAgfQotCi0JCSAgKnArKyA9IGM7Ci0JCX0KLQotCSAgICAgIGlmIChjID09IEVPRikKLQkJewotCQkgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICAqcCsrID0gJ1wwJzsKLQkgICAgICBzeW1uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBwIC0gc3ltYnVmKTsKLQkgICAgICBpZiAoc3ltbmFtZSA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBzdHJjcHkgKHN5bW5hbWUsIHN5bWJ1Zik7Ci0JICAgICAgZnJlZSAoc3ltYnVmKTsKLQkgICAgICBzeW1idWYgPSBOVUxMOwotCi0JICAgICAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GCi0JCSAgICAgJiYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykpCi0JCTsKLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXsKLQkJICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgLyogU2tpcCBhIGRvbGxhciBzaWduIGJlZm9yZSB0aGUgaGV4IHZhbHVlLiAgKi8KLQkgICAgICBpZiAoYyA9PSAnJCcpCi0JCXsKLQkJICBjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKTsKLQkJICBpZiAoYyA9PSBFT0YpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3ltdmFsID0gMDsKLQkgICAgICB3aGlsZSAoSVNIRVggKGMpKQotCQl7Ci0JCSAgc3ltdmFsIDw8PSA0OwotCQkgIHN5bXZhbCArPSBOSUJCTEUgKGMpOwotCQkgIGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpOwotCQl9Ci0KLQkgICAgICBpZiAoISBzcmVjX25ld19zeW1ib2wgKGFiZmQsIHN5bW5hbWUsIHN5bXZhbCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICB3aGlsZSAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKTsKLQotCSAgaWYgKGMgPT0gJ1xuJykKLQkgICAgKytsaW5lbm87Ci0JICBlbHNlIGlmIChjICE9ICdccicpCi0JICAgIHsKLQkgICAgICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICBicmVhazsKLSAgICAKLQljYXNlICdTJzoKLQkgIHsKLQkgICAgZmlsZV9wdHIgcG9zOwotCSAgICBjaGFyIGhkclszXTsKLQkgICAgdW5zaWduZWQgaW50IGJ5dGVzOwotCSAgICBiZmRfdm1hIGFkZHJlc3M7Ci0JICAgIGJmZF9ieXRlICpkYXRhOwotCi0JICAgIC8qIFN0YXJ0aW5nIGFuIFMtcmVjb3JkLiAgKi8KLQotCSAgICBwb3MgPSBiZmRfdGVsbCAoYWJmZCkgLSAxOwotCi0JICAgIGlmIChiZmRfcmVhZCAoaGRyLCAxLCAzLCBhYmZkKSAhPSAzKQotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgIGlmICghIElTSEVYIChoZHJbMV0pIHx8ICEgSVNIRVggKGhkclsyXSkpCi0JICAgICAgewotCQlpZiAoISBJU0hFWCAoaGRyWzFdKSkKLQkJICBjID0gaGRyWzFdOwotCQllbHNlCi0JCSAgYyA9IGhkclsyXTsKLQkJc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIH0KLQotCSAgICBieXRlcyA9IEhFWCAoaGRyICsgMSk7Ci0JICAgIGlmIChieXRlcyAqIDIgPiBidWZzaXplKQotCSAgICAgIHsKLQkJaWYgKGJ1ZiAhPSBOVUxMKQotCQkgIGZyZWUgKGJ1Zik7Ci0JCWJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChieXRlcyAqIDIpOwotCQlpZiAoYnVmID09IE5VTEwpCi0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCWJ1ZnNpemUgPSBieXRlcyAqIDI7Ci0JICAgICAgfQotCi0JICAgIGlmIChiZmRfcmVhZCAoYnVmLCAxLCBieXRlcyAqIDIsIGFiZmQpICE9IGJ5dGVzICogMikKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAvKiBJZ25vcmUgdGhlIGNoZWNrc3VtIGJ5dGUuICAqLwotCSAgICAtLWJ5dGVzOwotCi0JICAgIGFkZHJlc3MgPSAwOwotCSAgICBkYXRhID0gYnVmOwotCSAgICBzd2l0Y2ggKGhkclswXSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSAnMCc6Ci0JICAgICAgY2FzZSAnNSc6Ci0JCS8qIFByb2xvZ3VlLS1pZ25vcmUgdGhlIGZpbGUgbmFtZSwgYnV0IHN0b3AgYnVpbGRpbmcgYQotICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gYXQgdGhpcyBwb2ludC4gICovCi0JCXNlYyA9IE5VTEw7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnMyc6Ci0JCWFkZHJlc3MgPSBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCS0tYnl0ZXM7Ci0JCS8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnMic6Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJLS1ieXRlczsKLQkJLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgICBjYXNlICcxJzoKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCWJ5dGVzIC09IDI7Ci0KLQkJaWYgKHNlYyAhPSBOVUxMCi0JCSAgICAmJiBzZWMtPnZtYSArIHNlYy0+X3Jhd19zaXplID09IGFkZHJlc3MpCi0JCSAgewotCQkgICAgLyogVGhpcyBkYXRhIGdvZXMgYXQgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbiB3ZSBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGJ1aWxkaW5nLiAgKi8KLQkJICAgIHNlYy0+X3Jhd19zaXplICs9IGJ5dGVzOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGNoYXIgc2VjYnVmWzIwXTsKLQkJICAgIGNoYXIgKnNlY25hbWU7Ci0KLQkJICAgIHNwcmludGYgKHNlY2J1ZiwgIi5zZWMlZCIsIGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkgKyAxKTsKLQkJICAgIHNlY25hbWUgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoc2VjYnVmKSArIDEpOwotCQkgICAgc3RyY3B5IChzZWNuYW1lLCBzZWNidWYpOwotCQkgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgc2VjbmFtZSk7Ci0JCSAgICBpZiAoc2VjID09IE5VTEwpCi0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgc2VjLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLQkJICAgIHNlYy0+dm1hID0gYWRkcmVzczsKLQkJICAgIHNlYy0+bG1hID0gYWRkcmVzczsKLQkJICAgIHNlYy0+X3Jhd19zaXplID0gYnl0ZXM7Ci0JCSAgICBzZWMtPmZpbGVwb3MgPSBwb3M7Ci0JCSAgfQotCi0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnNyc6Ci0JCWFkZHJlc3MgPSBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCS8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnOCc6Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgICBjYXNlICc5JzoKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0KLQkJLyogVGhpcyBpcyBhIHRlcm1pbmF0aW9uIHJlY29yZC4gICovCi0JCWFiZmQtPnN0YXJ0X2FkZHJlc3MgPSBhZGRyZXNzOwotCi0JCWlmIChidWYgIT0gTlVMTCkKLQkJICBmcmVlIChidWYpOwotCi0JCXJldHVybiB0cnVlOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGVycm9yKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3ltYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoc3ltYnVmKTsKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQ2hlY2sgd2hldGhlciBhbiBleGlzdGluZyBmaWxlIGlzIGFuIFMtcmVjb3JkIGZpbGUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1zcmVjX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9ieXRlIGJbNF07Ci0KLSAgc3JlY19pbml0ICgpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGIsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJbMF0gIT0gJ1MnIHx8ICFJU0hFWCAoYlsxXSkgfHwgIUlTSEVYIChiWzJdKSB8fCAhSVNIRVggKGJbM10pKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghIHNyZWNfbWtvYmplY3QgKGFiZmQpCi0gICAgICB8fCAhIHNyZWNfc2NhbiAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGFiZmQtPnN5bWNvdW50ID4gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogQ2hlY2sgd2hldGhlciBhbiBleGlzdGluZyBmaWxlIGlzIGFuIFMtcmVjb3JkIGZpbGUgd2l0aCBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotc3ltYm9sc3JlY19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIGJbMl07Ci0KLSAgc3JlY19pbml0ICgpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGIsIDEsIDIsIGFiZmQpICE9IDIpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJbMF0gIT0gJyQnIHx8IGJbMV0gIT0gJyQnKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghIHNyZWNfbWtvYmplY3QgKGFiZmQpCi0gICAgICB8fCAhIHNyZWNfc2NhbiAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGFiZmQtPnN5bWNvdW50ID4gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogUmVhZCBpbiB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGluIGFuIFMtcmVjb3JkIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19yZWFkX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGNvbnRlbnRzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci17Ci0gIGludCBjOwotICBiZmRfc2l6ZV90eXBlIHNvZmFyID0gMDsKLSAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKLSAgc2l6ZV90IGJ1ZnNpemUgPSAwOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGhkclszXTsKLSAgICAgIHVuc2lnbmVkIGludCBieXRlczsKLSAgICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgIGJmZF9ieXRlICpkYXRhOwotCi0gICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKLQljb250aW51ZTsKLQotICAgICAgLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgc3JlY19zY2FuIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLCBzbyB3ZQotICAgICAgICAgb3VnaHQgdG8ga25vdyB0aGUgZXhhY3QgZm9ybWF0LiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKGMgPT0gJ1MnKTsKLQotICAgICAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDMsIGFiZmQpICE9IDMpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIEJGRF9BU1NFUlQgKElTSEVYIChoZHJbMV0pICYmIElTSEVYIChoZHJbMl0pKTsKLQotICAgICAgYnl0ZXMgPSBIRVggKGhkciArIDEpOwotCi0gICAgICBpZiAoYnl0ZXMgKiAyID4gYnVmc2l6ZSkKLQl7Ci0JICBpZiAoYnVmICE9IE5VTEwpCi0JICAgIGZyZWUgKGJ1Zik7Ci0JICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoYnl0ZXMgKiAyKTsKLQkgIGlmIChidWYgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBidWZzaXplID0gYnl0ZXMgKiAyOwotCX0KLQotICAgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGJ5dGVzICogMiwgYWJmZCkgIT0gYnl0ZXMgKiAyKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBhZGRyZXNzID0gMDsKLSAgICAgIGRhdGEgPSBidWY7Ci0gICAgICBzd2l0Y2ggKGhkclswXSkKLQl7Ci0JZGVmYXVsdDoKLQkgIEJGRF9BU1NFUlQgKHNvZmFyID09IHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JICBpZiAoYnVmICE9IE5VTEwpCi0JICAgIGZyZWUgKGJ1Zik7Ci0JICByZXR1cm4gdHJ1ZTsKLQotCWNhc2UgJzMnOgotCSAgYWRkcmVzcyA9IEhFWCAoZGF0YSk7Ci0JICBkYXRhICs9IDI7Ci0JICAtLWJ5dGVzOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlICcyJzoKLQkgIGFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JICBkYXRhICs9IDI7Ci0JICAtLWJ5dGVzOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlICcxJzoKLQkgIGFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JICBkYXRhICs9IDI7Ci0JICBhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgYnl0ZXMgLT0gMjsKLQotCSAgaWYgKGFkZHJlc3MgIT0gc2VjdGlvbi0+dm1hICsgc29mYXIpCi0JICAgIHsKLQkgICAgICAvKiBXZSd2ZSBjb21lIHRvIHRoZSBlbmQgb2YgdGhpcyBzZWN0aW9uLiAgKi8KLQkgICAgICBCRkRfQVNTRVJUIChzb2ZhciA9PSBzZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChidWYgIT0gTlVMTCkKLQkJZnJlZSAoYnVmKTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCi0JICAvKiBEb24ndCBjb25zaWRlciBjaGVja3N1bS4gICovCi0JICAtLWJ5dGVzOwotCi0JICB3aGlsZSAoYnl0ZXMtLSAhPSAwKQotCSAgICB7Ci0JICAgICAgY29udGVudHNbc29mYXJdID0gSEVYIChkYXRhKTsKLQkgICAgICBkYXRhICs9IDI7Ci0JICAgICAgKytzb2ZhcjsKLQkgICAgfQotCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChlcnJvcikKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBCRkRfQVNTRVJUIChzb2ZhciA9PSBzZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBHZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBTLXJlY29yZCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCi0gICAgewotICAgICAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPSBiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoc2VjdGlvbi0+dXNlZF9ieV9iZmQgPT0gTlVMTAotCSAgJiYgc2VjdGlvbi0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBzcmVjX3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgc2VjdGlvbi0+dXNlZF9ieV9iZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgbWVtY3B5IChsb2NhdGlvbiwgKGJmZF9ieXRlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkICsgb2Zmc2V0LAotCSAgKHNpemVfdCkgY291bnQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZS4gIFdlIGFjY2VwdCBhbiB1bmtub3duIGFyY2hpdGVjdHVyZSBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoOwotewotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQotICAgIHsKLSAgICAgIGFiZmQtPmFyY2hfaW5mbyA9ICZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpOwotfQotCi0vKiB3ZSBoYXZlIHRvIHNhdmUgdXAgYWxsIHRoZSBTcmVjb3JkcyBmb3IgYSBzcGx1cmdlIGJlZm9yZSBvdXRwdXQgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGJ5dGVzX3RvX2RvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgYnl0ZXNfdG9fZG87Ci17Ci0gIHRkYXRhX3R5cGUgKnRkYXRhID0gYWJmZC0+dGRhdGEuc3JlY19kYXRhOwotICByZWdpc3RlciBzcmVjX2RhdGFfbGlzdF90eXBlICplbnRyeTsKLQotICBlbnRyeSA9ICgoc3JlY19kYXRhX2xpc3RfdHlwZSAqKQotCSAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzcmVjX2RhdGFfbGlzdF90eXBlKSkpOwotICBpZiAoZW50cnkgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJ5dGVzX3RvX2RvCi0gICAgICAmJiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpCi0gICAgICAmJiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBieXRlc190b19kbyk7Ci0gICAgICBpZiAoZGF0YSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG1lbWNweSAoKFBUUikgZGF0YSwgbG9jYXRpb24sIChzaXplX3QpIGJ5dGVzX3RvX2RvKTsKLQotICAgICAgaWYgKChzZWN0aW9uLT5sbWEgKyBvZmZzZXQgKyBieXRlc190b19kbyAtIDEpIDw9IDB4ZmZmZikKLQl7Ci0KLQl9Ci0gICAgICBlbHNlIGlmICgoc2VjdGlvbi0+bG1hICsgb2Zmc2V0ICsgYnl0ZXNfdG9fZG8gLSAxKSA8PSAweGZmZmZmZgotCSAgICAgICAmJiB0ZGF0YS0+dHlwZSA8PSAyKQotCXsKLQkgIHRkYXRhLT50eXBlID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdGRhdGEtPnR5cGUgPSAzOwotCX0KLQotICAgICAgZW50cnktPmRhdGEgPSBkYXRhOwotICAgICAgZW50cnktPndoZXJlID0gc2VjdGlvbi0+bG1hICsgb2Zmc2V0OwotICAgICAgZW50cnktPnNpemUgPSBieXRlc190b19kbzsKLQotICAgICAgLyogU29ydCB0aGUgcmVjb3JkcyBieSBhZGRyZXNzLiAgT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSBvZgotICAgICAgICAgYWRkaW5nIGEgcmVjb3JkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICAqLwotICAgICAgaWYgKHRkYXRhLT50YWlsICE9IE5VTEwKLQkgICYmIGVudHJ5LT53aGVyZSA+PSB0ZGF0YS0+dGFpbC0+d2hlcmUpCi0JewotCSAgdGRhdGEtPnRhaWwtPm5leHQgPSBlbnRyeTsKLQkgIGVudHJ5LT5uZXh0ID0gTlVMTDsKLQkgIHRkYXRhLT50YWlsID0gZW50cnk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJlZ2lzdGVyIHNyZWNfZGF0YV9saXN0X3R5cGUgKipsb29rOwotCi0JICBmb3IgKGxvb2sgPSAmdGRhdGEtPmhlYWQ7Ci0JICAgICAgICpsb29rICE9IE5VTEwgJiYgKCpsb29rKS0+d2hlcmUgPCBlbnRyeS0+d2hlcmU7Ci0JICAgICAgIGxvb2sgPSAmKCpsb29rKS0+bmV4dCkKLQkgICAgOwotCSAgZW50cnktPm5leHQgPSAqbG9vazsKLQkgICpsb29rID0gZW50cnk7Ci0JICBpZiAoZW50cnktPm5leHQgPT0gTlVMTCkKLQkgICAgdGRhdGEtPnRhaWwgPSBlbnRyeTsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgYSByZWNvcmQgb2YgdHlwZSwgb2YgdGhlIHN1cHBsaWVkIG51bWJlciBvZiBieXRlcy4gVGhlCi0gICBzdXBwbGllZCBieXRlcyBhbmQgbGVuZ3RoIGRvbid0IGhhdmUgYSBjaGVja3N1bS4gVGhhdCdzIHdvcmtlZCBvdXQKLSAgIGhlcmUKLSovCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9yZWNvcmQgKGFiZmQsIHR5cGUsIGFkZHJlc3MsIGRhdGEsIGVuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdHlwZTsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICBjb25zdCBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgY29uc3QgYmZkX2J5dGUgKmVuZDsKLXsKLSAgY2hhciBidWZmZXJbTUFYQ0hVTktdOwotICB1bnNpZ25lZCBpbnQgY2hlY2tfc3VtID0gMDsKLSAgQ09OU1QgYmZkX2J5dGUgKnNyYyA9IGRhdGE7Ci0gIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKLSAgY2hhciAqbGVuZ3RoOwotICBiZmRfc2l6ZV90eXBlIHdybGVuOwotCi0gICpkc3QrKyA9ICdTJzsKLSAgKmRzdCsrID0gJzAnICsgdHlwZTsKLQotICBsZW5ndGggPSBkc3Q7Ci0gIGRzdCArPSAyOwkJCS8qIGxlYXZlIHJvb20gZm9yIGRzdCovCi0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIDM6Ci0gICAgY2FzZSA3OgotICAgICAgVE9IRVggKGRzdCwgKGFkZHJlc3MgPj4gMjQpLCBjaGVja19zdW0pOwotICAgICAgZHN0ICs9IDI7Ci0gICAgY2FzZSA4OgotICAgIGNhc2UgMjoKLSAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzID4+IDE2KSwgY2hlY2tfc3VtKTsKLSAgICAgIGRzdCArPSAyOwotICAgIGNhc2UgOToKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAwOgotICAgICAgVE9IRVggKGRzdCwgKGFkZHJlc3MgPj4gOCksIGNoZWNrX3N1bSk7Ci0gICAgICBkc3QgKz0gMjsKLSAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzKSwgY2hlY2tfc3VtKTsKLSAgICAgIGRzdCArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gIGZvciAoc3JjID0gZGF0YTsgc3JjIDwgZW5kOyBzcmMrKykKLSAgICB7Ci0gICAgICBUT0hFWCAoZHN0LCAqc3JjLCBjaGVja19zdW0pOwotICAgICAgZHN0ICs9IDI7Ci0gICAgfQotCi0gIC8qIEZpbGwgaW4gdGhlIGxlbmd0aCAqLwotICBUT0hFWCAobGVuZ3RoLCAoZHN0IC0gbGVuZ3RoKSAvIDIsIGNoZWNrX3N1bSk7Ci0gIGNoZWNrX3N1bSAmPSAweGZmOwotICBjaGVja19zdW0gPSAyNTUgLSBjaGVja19zdW07Ci0gIFRPSEVYIChkc3QsIGNoZWNrX3N1bSwgY2hlY2tfc3VtKTsKLSAgZHN0ICs9IDI7Ci0KLSAgKmRzdCsrID0gJ1xyJzsKLSAgKmRzdCsrID0gJ1xuJzsKLSAgd3JsZW4gPSBkc3QgLSBidWZmZXI7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmZlciwgMSwgd3JsZW4sIGFiZmQpICE9IHdybGVuKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9oZWFkZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyW01BWENIVU5LXTsKLSAgYmZkX2J5dGUgKmRzdCA9IGJ1ZmZlcjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogSSdsbCBwdXQgYW4gYXJiaXRhcnkgNDAgY2hhciBsaW1pdCBvbiBoZWFkZXIgc2l6ZSAqLwotICBmb3IgKGkgPSAwOyBpIDwgNDAgJiYgYWJmZC0+ZmlsZW5hbWVbaV07IGkrKykKLSAgICB7Ci0gICAgICAqZHN0KysgPSBhYmZkLT5maWxlbmFtZVtpXTsKLSAgICB9Ci0gIHJldHVybiBzcmVjX3dyaXRlX3JlY29yZCAoYWJmZCwgMCwgMCwgYnVmZmVyLCBkc3QpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9zZWN0aW9uIChhYmZkLCB0ZGF0YSwgbGlzdCkKLSAgICAgYmZkICphYmZkOwotICAgICB0ZGF0YV90eXBlICp0ZGF0YTsKLSAgICAgc3JlY19kYXRhX2xpc3RfdHlwZSAqbGlzdDsKLXsKLSAgdW5zaWduZWQgaW50IGJ5dGVzX3dyaXR0ZW4gPSAwOwotICBiZmRfYnl0ZSAqbG9jYXRpb24gPSBsaXN0LT5kYXRhOwotCi0gIHdoaWxlIChieXRlc193cml0dGVuIDwgbGlzdC0+c2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0KLSAgICAgIHVuc2lnbmVkIGludCBieXRlc190aGlzX2NodW5rID0gbGlzdC0+c2l6ZSAtIGJ5dGVzX3dyaXR0ZW47Ci0KLSAgICAgIGlmIChieXRlc190aGlzX2NodW5rID4gQ0hVTkspCi0JewotCSAgYnl0ZXNfdGhpc19jaHVuayA9IENIVU5LOwotCX0KLQotICAgICAgYWRkcmVzcyA9IGxpc3QtPndoZXJlICsgYnl0ZXNfd3JpdHRlbjsKLQotICAgICAgaWYgKCEgc3JlY193cml0ZV9yZWNvcmQgKGFiZmQsCi0JCQkgICAgICAgdGRhdGEtPnR5cGUsCi0JCQkgICAgICAgYWRkcmVzcywKLQkJCSAgICAgICBsb2NhdGlvbiwKLQkJCSAgICAgICBsb2NhdGlvbiArIGJ5dGVzX3RoaXNfY2h1bmspKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgYnl0ZXNfd3JpdHRlbiArPSBieXRlc190aGlzX2NodW5rOwotICAgICAgbG9jYXRpb24gKz0gYnl0ZXNfdGhpc19jaHVuazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3dyaXRlX3Rlcm1pbmF0b3IgKGFiZmQsIHRkYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHRkYXRhX3R5cGUgKnRkYXRhOwotewotICBiZmRfYnl0ZSBidWZmZXJbMl07Ci0KLSAgcmV0dXJuIHNyZWNfd3JpdGVfcmVjb3JkIChhYmZkLCAxMCAtIHRkYXRhLT50eXBlLAotCQkJICAgIGFiZmQtPnN0YXJ0X2FkZHJlc3MsIGJ1ZmZlciwgYnVmZmVyKTsKLX0KLQotCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3dyaXRlX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBidWZmZXJbTUFYQ0hVTktdOwotICAvKiBEdW1wIG91dCB0aGUgc3ltYm9scyBvZiBhIGJmZCAqLwotICBpbnQgaTsKLSAgaW50IGNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0KLSAgaWYgKGNvdW50KQotICAgIHsKLSAgICAgIHNpemVfdCBsZW47Ci0gICAgICBhc3ltYm9sICoqdGFibGUgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiJCQgJXNcclxuIiwgYWJmZC0+ZmlsZW5hbWUpOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKGJ1ZmZlcik7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChidWZmZXIsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JewotCSAgYXN5bWJvbCAqcyA9IHRhYmxlW2ldOwotCSAgaWYgKCEgYmZkX2lzX2xvY2FsX2xhYmVsIChhYmZkLCBzKQotCSAgICAgICYmIChzLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBKdXN0IGR1bXAgb3V0IG5vbiBkZWJ1ZyBzeW1ib2xzICovCi0JICAgICAgYmZkX3NpemVfdHlwZSBsOwotCSAgICAgIGNoYXIgYnVmMls0MF0sICpwOwotCi0JICAgICAgc3ByaW50Zl92bWEgKGJ1ZjIsCi0JCQkgICBzLT52YWx1ZSArIHMtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5sbWEKLQkJCSAgICsgcy0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgcCA9IGJ1ZjI7Ci0JICAgICAgd2hpbGUgKHBbMF0gPT0gJzAnICYmIHBbMV0gIT0gMCkKLQkJcCsrOwotCSAgICAgIHNwcmludGYgKGJ1ZmZlciwgIiAgJXMgJCVzXHJcbiIsIHMtPm5hbWUsIHApOwotCSAgICAgIGwgPSBzdHJsZW4gKGJ1ZmZlcik7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoYnVmZmVyLCBsLCAxLCBhYmZkKSAhPSBsKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBzcHJpbnRmIChidWZmZXIsICIkJCBcclxuIik7Ci0gICAgICBsZW4gPSBzdHJsZW4gKGJ1ZmZlcik7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChidWZmZXIsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgc3ltYm9sczsKLXsKLSAgdGRhdGFfdHlwZSAqdGRhdGEgPSBhYmZkLT50ZGF0YS5zcmVjX2RhdGE7Ci0gIHNyZWNfZGF0YV9saXN0X3R5cGUgKmxpc3Q7Ci0KLSAgaWYgKHN5bWJvbHMpCi0gICAgewotICAgICAgaWYgKCEgc3JlY193cml0ZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIHNyZWNfd3JpdGVfaGVhZGVyIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdhbmRlciB0aG91Z2ggYWxsIHRoZSBzZWN0aW9ucyBwcm92aWRlZCBhbmQgb3V0cHV0IHRoZW0gKi8KLSAgbGlzdCA9IHRkYXRhLT5oZWFkOwotCi0gIHdoaWxlIChsaXN0ICE9IChzcmVjX2RhdGFfbGlzdF90eXBlICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgc3JlY193cml0ZV9zZWN0aW9uIChhYmZkLCB0ZGF0YSwgbGlzdCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gc3JlY193cml0ZV90ZXJtaW5hdG9yIChhYmZkLCB0ZGF0YSk7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQsIDApOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc3ltYm9sc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkLCAxKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgaW50Ci1zcmVjX3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBleGVjIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi1zcmVjX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXNyZWNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXNyZWNfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIHVuc2lnbmVkIGludCBzeW1jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBhc3ltYm9sICpjc3ltYm9sczsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgY3N5bWJvbHMgPSBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPmNzeW1ib2xzOwotICBpZiAoY3N5bWJvbHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpjOwotICAgICAgc3RydWN0IHNyZWNfc3ltYm9sICpzOwotCi0gICAgICBjc3ltYm9scyA9IChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc3ltY291bnQgKiBzaXplb2YgKGFzeW1ib2wpKTsKLSAgICAgIGlmIChjc3ltYm9scyA9PSBOVUxMICYmIHN5bWNvdW50ICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5jc3ltYm9scyA9IGNzeW1ib2xzOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPnN5bWJvbHMsIGMgPSBjc3ltYm9sczsKLQkgICBzICE9IE5VTEw7Ci0JICAgcyA9IHMtPm5leHQsICsrYykKLQl7Ci0JICBjLT50aGVfYmZkID0gYWJmZDsKLQkgIGMtPm5hbWUgPSBzLT5uYW1lOwotCSAgYy0+dmFsdWUgPSBzLT52YWw7Ci0JICBjLT5mbGFncyA9IEJTRl9HTE9CQUw7Ci0JICBjLT5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGMtPnVkYXRhLnAgPSBOVUxMOwotCX0KLSAgICB9Ci0JCi0gIGZvciAoaSA9IDA7IGkgPCBzeW1jb3VudDsgaSsrKQotICAgICphbG9jYXRpb24rKyA9IGNzeW1ib2xzKys7Ci0gICphbG9jYXRpb24gPSBOVUxMOwotCi0gIHJldHVybiBzeW1jb3VudDsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotc3JlY19nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1zcmVjX3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICUtNXMgJXMiLAotCSAgICAgICBzeW1ib2wtPnNlY3Rpb24tPm5hbWUsCi0JICAgICAgIHN5bWJvbC0+bmFtZSk7Ci0KLSAgICB9Ci19Ci0KLSNkZWZpbmUJc3JlY19jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgc3JlY19iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgc3JlY19uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCi0KLSNkZWZpbmUgc3JlY19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHNyZWNfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHNyZWNfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgc3JlY19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHNyZWNfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBzcmVjX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIHNyZWNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfMGwpCi0jZGVmaW5lIHNyZWNfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBiZmRfMGwpCi0jZGVmaW5lIHNyZWNfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgc3JlY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgc3JlY19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIHNyZWNfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBzcmVjX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBzcmVjX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIHNyZWNfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgc3JlY19iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBzcmVjX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi1jb25zdCBiZmRfdGFyZ2V0IHNyZWNfdmVjID0KLXsKLSAgInNyZWMiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9zcmVjX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIHNyZWNfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgc3JlY19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgc3JlY193cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07Ci0KLQotCi1jb25zdCBiZmRfdGFyZ2V0IHN5bWJvbHNyZWNfdmVjID0KLXsKLSAgInN5bWJvbHNyZWMiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9zcmVjX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIHN5bWJvbHNyZWNfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBzcmVjX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBzeW1ib2xzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9zdGFiLXN5bXMuYyBiL2JmZC9zdGFiLXN5bXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmZTZjOC4uMDAwMDAwMAotLS0gYS9iZmQvc3RhYi1zeW1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKiBUYWJsZSBvZiBzdGFiIG5hbWVzIGZvciB0aGUgQkZEIGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgkJLyogVmFsdWUgZG9lc24ndCBtYXR0ZXIuICovCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLS8qIElnbm9yZSBkdXBsaWNhdGUgc3RhYiBjb2RlczsganVzdCByZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIGZpcnN0Ci0gICBvbmUuICAqLwotI2RlZmluZSBfX2RlZmluZV9zdGFiKE5BTUUsIENPREUsIFNUUklORykgX19kZWZpbmVfbmFtZShDT0RFLCBTVFJJTkcpCi0jZGVmaW5lIF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlKE5BTUUsIENPREUsIFNUUklORykKLQotLyogVGhlc2UgYXJlIG5vdCByZWFsbHkgc3RhYiBzeW1ib2xzLCBidXQgaXQgaXMKLSAgIGNvbnZlbmllbnQgdG8gaGF2ZSB0aGVtIGhlcmUgZm9yIHRoZSBzYWtlIG9mIG5tLgotICAgRm9yIGNvbXBsZXRlbmVzcywgd2UgY291bGQgYWxzbyBhZGQgTl9URVhUIGV0YywgYnV0IHRob3NlCi0gICBhcmUgbmV2ZXIgbmVlZGVkLCBzaW5jZSBubSB0cmVhdHMgdGhvc2Ugc3BlY2lhbGx5LiAqLwotI2RlZmluZSBFWFRSQV9TWU1CT0xTIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9TRVRBLCAiU0VUQSIpLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sICovIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9TRVRULCAiU0VUVCIpLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8gXAotICBfX2RlZmluZV9uYW1lIChOX1NFVEQsICJTRVREIikvKiBEYXRhIHNldCBlbGVtZW50IHN5bWJvbCAqLyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fU0VUQiwgIlNFVEIiKS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wgKi8gXAotICBfX2RlZmluZV9uYW1lIChOX1NFVFYsICJTRVRWIikvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAqLyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fSU5EUiwgIklORFIiKSBcCi0gIF9fZGVmaW5lX25hbWUgKE5fV0FSTklORywgIldBUk5JTkciKQotCi1jb25zdCBjaGFyICoKLWJmZF9nZXRfc3RhYl9uYW1lIChjb2RlKQotICAgICBpbnQgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSNkZWZpbmUgX19kZWZpbmVfbmFtZSh2YWwsIHN0cikgY2FzZSB2YWw6IHJldHVybiBzdHI7Ci0jaW5jbHVkZSAiYW91dC9zdGFiLmRlZiIKLSAgICAgIEVYVFJBX1NZTUJPTFMKLSAgICB9Ci0KLSAgcmV0dXJuIChjb25zdCBjaGFyICopIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvc3RhYnMuYyBiL2JmZC9zdGFicy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWFjMTY3Li4wMDAwMDAwCi0tLSBhL2JmZC9zdGFicy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUzICswLDAgQEAKLS8qIFN0YWJzIGluIHNlY3Rpb25zIGxpbmtpbmcgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgc3VwcG9ydCBmb3IgbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucywgYXMgdXNlZAotICAgb24gQ09GRiBhbmQgRUxGLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLS8qIFN0YWJzIGVudHJpZXMgdXNlIGEgMTIgYnl0ZSBmb3JtYXQ6Ci0gICAgIDQgYnl0ZSBzdHJpbmcgdGFibGUgaW5kZXgKLSAgICAgMSBieXRlIHN0YWIgdHlwZQotICAgICAxIGJ5dGUgc3RhYiBvdGhlciBmaWVsZAotICAgICAyIGJ5dGUgc3RhYiBkZXNjIGZpZWxkCi0gICAgIDQgYnl0ZSBzdGFiIHZhbHVlCi0gICBGSVhNRTogVGhpcyB3aWxsIGhhdmUgdG8gY2hhbmdlIGZvciBhIDY0IGJpdCBvYmplY3QgZm9ybWF0LgotCi0gICBUaGUgc3RhYnMgc3ltYm9scyBhcmUgZGl2aWRlZCBpbnRvIGNvbXBpbGF0aW9uIHVuaXRzLiAgRm9yIHRoZQotICAgZmlyc3QgZW50cnkgaW4gZWFjaCB1bml0LCB0aGUgdHlwZSBvZiAwLCB0aGUgdmFsdWUgaXMgdGhlIGxlbmd0aCBvZgotICAgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhpcyB1bml0LCBhbmQgdGhlIGRlc2MgZmllbGQgaXMgdGhlIG51bWJlciBvZgotICAgc3RhYnMgc3ltYm9scyBmb3IgdGhpcyB1bml0LiAgKi8KLQotI2RlZmluZSBTVFJEWE9GRiAoMCkKLSNkZWZpbmUgVFlQRU9GRiAoNCkKLSNkZWZpbmUgT1RIRVJPRkYgKDUpCi0jZGVmaW5lIERFU0NPRkYgKDYpCi0jZGVmaW5lIFZBTE9GRiAoOCkKLSNkZWZpbmUgU1RBQlNJWkUgKDEyKQotCi0vKiBBIGhhc2ggdGFibGUgdXNlZCBmb3IgaGVhZGVyIGZpbGVzIHdpdGggTl9CSU5DTCBlbnRyaWVzLiAgKi8KLQotc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIEEgbGlua2VkIGxpc3Qgb2YgdG90YWxzIHRoYXQgd2UgaGF2ZSBmb3VuZCBmb3IgYSBwYXJ0aWN1bGFyIGhlYWRlcgotICAgZmlsZS4gICovCi0KLXN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdG90YWxzCi17Ci0gIHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdG90YWxzICpuZXh0OwotICBiZmRfdm1hIHRvdGFsOwotfTsKLQotLyogQW4gZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBMaXN0IG9mIHRvdGFscyB3ZSBoYXZlIGZvdW5kIGZvciB0aGlzIGZpbGUuICAqLwotICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscyAqdG90YWxzOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgc3RhYl9saW5rX2luY2x1ZGVzX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIGEgbGlzdCBvZiBOX0JJTkNMIHN5bWJvbHMsIHNvbWUgb2YKLSAgIHdoaWNoIG1pZ2h0IGJlIGNvbnZlcnRlZCBpbnRvIE5fRVhDTCBzeW1ib2xzLiAgKi8KLQotc3RydWN0IHN0YWJfZXhjbF9saXN0Ci17Ci0gIC8qIFRoZSBuZXh0IHN5bWJvbCB0byBjb252ZXJ0LiAgKi8KLSAgc3RydWN0IHN0YWJfZXhjbF9saXN0ICpuZXh0OwotICAvKiBUaGUgb2Zmc2V0IHRvIHRoaXMgc3ltYm9sIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBvZmZzZXQ7Ci0gIC8qIFRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBzeW1ib2wuICAqLwotICBiZmRfdm1hIHZhbDsKLSAgLyogVGhlIHR5cGUgb2YgdGhpcyBzeW1ib2wgKE5fQklOQ0wgb3IgTl9FWENMKS4gICovCi0gIGludCB0eXBlOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgc3RvcmVkIHdpdGggZWFjaCAuc3RhYiBzZWN0aW9uLiAgKi8KLQotc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvCi17Ci0gIC8qIFRoaXMgaXMgYSBsaW5rZWQgbGlzdCBvZiBOX0JJTkNMIHN5bWJvbHMgd2hpY2ggc2hvdWxkIGJlCi0gICAgIGNvbnZlcnRlZCBpbnRvIE5fRVhDTCBzeW1ib2xzLiAgKi8KLSAgc3RydWN0IHN0YWJfZXhjbF9saXN0ICpleGNsczsKLQotICAvKiBUaGlzIGlzIHVzZWQgdG8gbWFwIGlucHV0IHN0YWIgb2Zmc2V0cyB3aXRoaW4gdGhlaXIgc2VjdGlvbnMKLSAgICAgdG8gb3V0cHV0IHN0YWIgb2Zmc2V0cywgdG8gdGFrZSBpbnRvIGFjY291bnQgc3RhYnMgdGhhdCBoYXZlCi0gICAgIGJlZW4gZGVsZXRlZC4gIElmIGl0IGlzIE5VTEwsIHRoZSBvdXRwdXQgb2Zmc2V0cyBhcmUgdGhlIHNhbWUKLSAgICAgYXMgdGhlIGlucHV0IG9mZnNldHMsIGJlY2F1c2Ugbm8gc3RhYnMgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbQotICAgICB0aGlzIHNlY3Rpb24uICBPdGhlcndpc2UgdGhlIGkndGggZW50cnkgaXMgdGhlIG51bWJlciBvZgotICAgICBieXRlcyBvZiBzdGFicyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkIHByaW9yIHRvIHRoZSBpJ3RoCi0gICAgIHN0YWIuICovCi0gIGJmZF9zaXplX3R5cGUgKmN1bXVsYXRpdmVfc2tpcHM7Ci0KLSAgLyogVGhpcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgaW5kaWNlcy4gIEZvciBlYWNoIHN0YWIgc3ltYm9sLCB3ZQotICAgICBzdG9yZSB0aGUgc3RyaW5nIGluZGV4IGhlcmUuICBJZiBhIHN0YWIgc3ltYm9sIHNob3VsZCBub3QgYmUKLSAgICAgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIG91dHB1dCwgdGhlIHN0cmluZyBpbmRleCBpcyAtMS4gICovCi0gIGJmZF9zaXplX3R5cGUgc3RyaWR4c1sxXTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBzdGFicyBpbiBzZWN0aW9ucwotICAgaW5mb3JtYXRpb24gd2hpbGUgbGlua2luZy4gICovCi0KLXN0cnVjdCBzdGFiX2luZm8KLXsKLSAgLyogQSBoYXNoIHRhYmxlIHVzZWQgdG8gaG9sZCBzdGFicyBzdHJpbmdzLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RyaW5nczsKLSAgLyogVGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RhYmxlIGluY2x1ZGVzOwotICAvKiBUaGUgZmlyc3QgLnN0YWJzdHIgc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpzdGFic3RyOwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3RhYl9saW5rX2luY2x1ZGVzX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQwKLS8qIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXN0YWJfbGlua19pbmNsdWRlc19uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPnRvdGFscyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIGlucHV0IGZpbGUgZnJvbSB0aGUgYWRkX3N5bWJvbHMKLSAgIHBhc3Mgb2YgdGhlIGxpbmtlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfbGlua19zZWN0aW9uX3N0YWJzIChhYmZkLCBwc2luZm8sIHN0YWJzZWMsIHN0YWJzdHJzZWMsIHBzZWNpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiAqcHNpbmZvOwotICAgICBhc2VjdGlvbiAqc3RhYnNlYzsKLSAgICAgYXNlY3Rpb24gKnN0YWJzdHJzZWM7Ci0gICAgIFBUUiAqcHNlY2luZm87Ci17Ci0gIGJvb2xlYW4gZmlyc3Q7Ci0gIHN0cnVjdCBzdGFiX2luZm8gKnNpbmZvOwotICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICBzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKnNlY2luZm87Ci0gIGJmZF9ieXRlICpzdGFiYnVmID0gTlVMTDsKLSAgYmZkX2J5dGUgKnN0YWJzdHJidWYgPSBOVUxMOwotICBiZmRfYnl0ZSAqc3ltLCAqc3ltZW5kOwotICBiZmRfc2l6ZV90eXBlIHN0cm9mZiwgbmV4dF9zdHJvZmYsIHNraXA7Ci0gIGJmZF9zaXplX3R5cGUgKnBzdHJpZHg7Ci0KLSAgaWYgKHN0YWJzZWMtPl9yYXdfc2l6ZSA9PSAwCi0gICAgICB8fCBzdGFic3Ryc2VjLT5fcmF3X3NpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGZpbGUgZG9lcyBub3QgY29udGFpbiBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChzdGFic2VjLT5fcmF3X3NpemUgJSBTVEFCU0laRSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBmb3JtYXQgb2YgdGhlc2Ugc3RhYiBzeW1ib2xzLgotICAgICAgICAgRG9uJ3QgdHJ5IHRvIG9wdGltaXplIHRoZW0uICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICgoc3RhYnN0cnNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0gICAgewotICAgICAgLyogV2Ugc2hvdWxkbid0IHNlZSByZWxvY2F0aW9ucyBpbiB0aGUgc3RyaW5ncywgYW5kIHdlIGFyZW4ndAotICAgICAgICAgcHJlcGFyZWQgdG8gaGFuZGxlIHRoZW0uICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICgoc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAotICAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24pKQotICAgICAgfHwgKHN0YWJzdHJzZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc3RhYnN0cnNlYy0+b3V0cHV0X3NlY3Rpb24pKSkKLSAgICB7Ci0gICAgICAvKiBBdCBsZWFzdCBvbmUgb2YgdGhlIHNlY3Rpb25zIGlzIGJlaW5nIGRpc2NhcmRlZCBmcm9tIHRoZQotICAgICAgICAgbGluaywgc28gd2Ugc2hvdWxkIGp1c3QgaWdub3JlIHRoZW0uICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGZpcnN0ID0gZmFsc2U7Ci0KLSAgaWYgKCpwc2luZm8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBzdGFicyBpbmZvcm1hdGlvbiB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YuICAqLwotICAgICAgZmlyc3QgPSB0cnVlOwotICAgICAgKnBzaW5mbyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3RhYl9pbmZvKSk7Ci0gICAgICBpZiAoKnBzaW5mbyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgc2luZm8gPSAoc3RydWN0IHN0YWJfaW5mbyAqKSAqcHNpbmZvOwotICAgICAgc2luZm8tPnN0cmluZ3MgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICAgICAgaWYgKHNpbmZvLT5zdHJpbmdzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICAvKiBNYWtlIHN1cmUgdGhlIGZpcnN0IGJ5dGUgaXMgemVyby4gICovCi0gICAgICAodm9pZCkgX2JmZF9zdHJpbmd0YWJfYWRkIChzaW5mby0+c3RyaW5ncywgIiIsIHRydWUsIHRydWUpOwotICAgICAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uICgmc2luZm8tPmluY2x1ZGVzLnJvb3QsCi0JCQkJICAgc3RhYl9saW5rX2luY2x1ZGVzX25ld2Z1bmMsCi0JCQkJICAgMjUxKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHNpbmZvLT5zdGFic3RyID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuc3RhYnN0ciIpOwotICAgICAgc2luZm8tPnN0YWJzdHItPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREVCVUdHSU5HOwotICAgIH0KLQotICBzaW5mbyA9IChzdHJ1Y3Qgc3RhYl9pbmZvICopICpwc2luZm87Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgaW5mb3JtYXRpb24gd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGZvciB0aGlzIC5zdGFiCi0gICAgIHNlY3Rpb24uICAqLwotCi0gIGNvdW50ID0gc3RhYnNlYy0+X3Jhd19zaXplIC8gU1RBQlNJWkU7Ci0KLSAgKnBzZWNpbmZvID0gYmZkX2FsbG9jIChhYmZkLAotCQkJIChzaXplb2YgKHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbykKLQkJCSAgKyAoY291bnQgLSAxKSAqIHNpemVvZiAoYmZkX3NpemVfdHlwZSkpKTsKLSAgaWYgKCpwc2VjaW5mbyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHNlY2luZm8gPSAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICopICpwc2VjaW5mbzsKLSAgc2VjaW5mby0+ZXhjbHMgPSBOVUxMOwotICBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzID0gTlVMTDsKLSAgbWVtc2V0IChzZWNpbmZvLT5zdHJpZHhzLCAwLCBjb3VudCAqIHNpemVvZiAoYmZkX3NpemVfdHlwZSkpOwotCi0gIC8qIFJlYWQgdGhlIHN0YWJzIGluZm9ybWF0aW9uIGZyb20gYWJmZC4gICovCi0KLSAgc3RhYmJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzdGFic2VjLT5fcmF3X3NpemUpOwotICBzdGFic3RyYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHN0YWJzdHJzZWMtPl9yYXdfc2l6ZSk7Ci0gIGlmIChzdGFiYnVmID09IE5VTEwgfHwgc3RhYnN0cmJ1ZiA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc3RhYnNlYywgc3RhYmJ1ZiwgMCwKLQkJCQkgIHN0YWJzZWMtPl9yYXdfc2l6ZSkKLSAgICAgIHx8ICEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzdGFic3Ryc2VjLCBzdGFic3RyYnVmLCAwLAotCQkJCSAgICAgc3RhYnN0cnNlYy0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHN0YWJzIHN5bWJvbHMsIHdvcmsgb3V0IHRoZSBuZXcgc3RyaW5nIGluZGljZXMsCi0gICAgIGFuZCBpZGVudGlmeSBOX0JJTkNMIHN5bWJvbHMgd2hpY2ggY2FuIGJlIGVsaW1pbmF0ZWQuICAqLwotCi0gIHN0cm9mZiA9IDA7Ci0gIG5leHRfc3Ryb2ZmID0gMDsKLSAgc2tpcCA9IDA7Ci0KLSAgc3ltZW5kID0gc3RhYmJ1ZiArIHN0YWJzZWMtPl9yYXdfc2l6ZTsKLSAgZm9yIChzeW0gPSBzdGFiYnVmLCBwc3RyaWR4ID0gc2VjaW5mby0+c3RyaWR4czsKLSAgICAgICBzeW0gPCBzeW1lbmQ7Ci0gICAgICAgc3ltICs9IFNUQUJTSVpFLCArK3BzdHJpZHgpCi0gICAgewotICAgICAgaW50IHR5cGU7Ci0gICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0KLSAgICAgIGlmICgqcHN0cmlkeCAhPSAwKQotCXsKLQkgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCBieSBhbiBOX0JJTkNMIHBhc3MuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICB0eXBlID0gc3ltW1RZUEVPRkZdOwotCi0gICAgICBpZiAodHlwZSA9PSAwKQotCXsKLQkgIC8qIFNwZWNpYWwgdHlwZSAwIHN0YWJzIGluZGljYXRlIHRoZSBvZmZzZXQgdG8gdGhlIG5leHQKLSAgICAgICAgICAgICBzdHJpbmcgdGFibGUuICBXZSBvbmx5IGNvcHkgdGhlIHZlcnkgZmlyc3Qgb25lLiAgKi8KLQkgIHN0cm9mZiA9IG5leHRfc3Ryb2ZmOwotCSAgbmV4dF9zdHJvZmYgKz0gYmZkX2dldF8zMiAoYWJmZCwgc3ltICsgOCk7Ci0JICBpZiAoISBmaXJzdCkKLQkgICAgewotCSAgICAgICpwc3RyaWR4ID0gKGJmZF9zaXplX3R5cGUpIC0xOwotCSAgICAgICsrc2tpcDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgZmlyc3QgPSBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIFN0b3JlIHRoZSBzdHJpbmcgaW4gdGhlIGhhc2ggdGFibGUsIGFuZCByZWNvcmQgdGhlIGluZGV4LiAgKi8KLSAgICAgIHN0cmluZyA9ICgoY2hhciAqKSBzdGFic3RyYnVmCi0JCSsgc3Ryb2ZmCi0JCSsgYmZkX2dldF8zMiAoYWJmZCwgc3ltICsgU1RSRFhPRkYpKTsKLSAgICAgICpwc3RyaWR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChzaW5mby0+c3RyaW5ncywgc3RyaW5nLCB0cnVlLCB0cnVlKTsKLQotICAgICAgLyogQW4gTl9CSU5DTCBzeW1ib2wgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiB0aGUgc3RhYnMgZW50cmllcwotCSBmb3IgYSBoZWFkZXIgZmlsZS4gIFdlIG5lZWQgdG8gc2NhbiBhaGVhZCB0byB0aGUgbmV4dCBOX0VJTkNMCi0JIHN5bWJvbCwgaWdub3JpbmcgbmVzdGluZywgYWRkaW5nIHVwIGFsbCB0aGUgY2hhcmFjdGVycyBpbiB0aGUKLQkgc3ltYm9sIG5hbWVzLCBub3QgaW5jbHVkaW5nIHRoZSBmaWxlIG51bWJlcnMgaW4gdHlwZXMgKHRoZQotCSBmaXJzdCBudW1iZXIgYWZ0ZXIgYW4gb3BlbiBwYXJlbnRoZXNpcykuICAqLwotICAgICAgaWYgKHR5cGUgPT0gTl9CSU5DTCkKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQkgIGludCBuZXN0OwotCSAgYmZkX2J5dGUgKmluY2xfc3ltOwotCSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc19lbnRyeSAqaW5jbF9lbnRyeTsKLQkgIHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdG90YWxzICp0OwotCSAgc3RydWN0IHN0YWJfZXhjbF9saXN0ICpuZTsKLQotCSAgdmFsID0gMDsKLQkgIG5lc3QgPSAwOwotCSAgZm9yIChpbmNsX3N5bSA9IHN5bSArIFNUQUJTSVpFOwotCSAgICAgICBpbmNsX3N5bSA8IHN5bWVuZDsKLQkgICAgICAgaW5jbF9zeW0gKz0gU1RBQlNJWkUpCi0JICAgIHsKLQkgICAgICBpbnQgaW5jbF90eXBlOwotCi0JICAgICAgaW5jbF90eXBlID0gaW5jbF9zeW1bVFlQRU9GRl07Ci0JICAgICAgaWYgKGluY2xfdHlwZSA9PSAwKQotCQlicmVhazsKLQkgICAgICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9FSU5DTCkKLQkJewotCQkgIGlmIChuZXN0ID09IDApCi0JCSAgICBicmVhazsKLQkJICAtLW5lc3Q7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKLQkJKytuZXN0OwotCSAgICAgIGVsc2UgaWYgKG5lc3QgPT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKnN0cjsKLQotCQkgIHN0ciA9ICgoY2hhciAqKSBzdGFic3RyYnVmCi0JCQkgKyBzdHJvZmYKLQkJCSArIGJmZF9nZXRfMzIgKGFiZmQsIGluY2xfc3ltICsgU1RSRFhPRkYpKTsKLQkJICBmb3IgKDsgKnN0ciAhPSAnXDAnOyBzdHIrKykKLQkJICAgIHsKLQkJICAgICAgdmFsICs9ICpzdHI7Ci0JCSAgICAgIGlmICgqc3RyID09ICcoJykKLQkJCXsKLQkJCSAgLyogU2tpcCB0aGUgZmlsZSBudW1iZXIuICAqLwotCQkJICArK3N0cjsKLQkJCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqc3RyKSkKLQkJCSAgICArK3N0cjsKLQkJCSAgLS1zdHI7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgYSBoZWFkZXIgZmlsZSB3aXRoIHRoZSBzYW1lCi0JICAgICB2YWx1ZSwgdGhlbiByZXBsYWNlZCB0aGlzIG9uZSB3aXRoIGFuIE5fRVhDTCBzeW1ib2wuICAqLwotCSAgaW5jbF9lbnRyeSA9IHN0YWJfbGlua19pbmNsdWRlc19sb29rdXAgKCZzaW5mby0+aW5jbHVkZXMsIHN0cmluZywKLQkJCQkJCSAgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAoaW5jbF9lbnRyeSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgZm9yICh0ID0gaW5jbF9lbnRyeS0+dG90YWxzOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotCSAgICBpZiAodC0+dG90YWwgPT0gdmFsKQotCSAgICAgIGJyZWFrOwotCi0JICAvKiBSZWNvcmQgdGhpcyBzeW1ib2wsIHNvIHRoYXQgd2UgY2FuIHNldCB0aGUgdmFsdWUKLSAgICAgICAgICAgICBjb3JyZWN0bHkuICAqLwotCSAgbmUgPSAoc3RydWN0IHN0YWJfZXhjbF9saXN0ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICpuZSk7Ci0JICBpZiAobmUgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBuZS0+b2Zmc2V0ID0gc3ltIC0gc3RhYmJ1ZjsKLQkgIG5lLT52YWwgPSB2YWw7Ci0JICBuZS0+dHlwZSA9IE5fQklOQ0w7Ci0JICBuZS0+bmV4dCA9IHNlY2luZm8tPmV4Y2xzOwotCSAgc2VjaW5mby0+ZXhjbHMgPSBuZTsKLQotCSAgaWYgKHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBzZWVuIHRoaXMgaGVhZGVyIGZpbGUKLQkJIHdpdGggdGhpcyBzZXQgb2Ygc3RhYnMgc3RyaW5ncy4gICovCi0JICAgICAgdCA9ICgoc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190b3RhbHMgKikKLQkJICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZzaW5mby0+aW5jbHVkZXMucm9vdCwgc2l6ZW9mICp0KSk7Ci0JICAgICAgaWYgKHQgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgdC0+dG90YWwgPSB2YWw7Ci0JICAgICAgdC0+bmV4dCA9IGluY2xfZW50cnktPnRvdGFsczsKLQkgICAgICBpbmNsX2VudHJ5LT50b3RhbHMgPSB0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfc2l6ZV90eXBlICppbmNsX3BzdHJpZHg7Ci0KLQkgICAgICAvKiBXZSBoYXZlIHNlZW4gdGhpcyBoZWFkZXIgZmlsZSBiZWZvcmUuICBUZWxsIHRoZSBmaW5hbAotCQkgcGFzcyB0byBjaGFuZ2UgdGhlIHR5cGUgdG8gTl9FWENMLiAgKi8KLQkgICAgICBuZS0+dHlwZSA9IE5fRVhDTDsKLQotCSAgICAgIC8qIE1hcmsgdGhlIHNraXBwZWQgc3ltYm9scy4gICovCi0KLQkgICAgICBuZXN0ID0gMDsKLQkgICAgICBmb3IgKGluY2xfc3ltID0gc3ltICsgU1RBQlNJWkUsIGluY2xfcHN0cmlkeCA9IHBzdHJpZHggKyAxOwotCQkgICBpbmNsX3N5bSA8IHN5bWVuZDsKLQkJICAgaW5jbF9zeW0gKz0gU1RBQlNJWkUsICsraW5jbF9wc3RyaWR4KQotCQl7Ci0JCSAgaW50IGluY2xfdHlwZTsKLQotCQkgIGluY2xfdHlwZSA9IGluY2xfc3ltW1RZUEVPRkZdOwotCi0JCSAgaWYgKGluY2xfdHlwZSA9PSBOX0VJTkNMKQotCQkgICAgewotCQkgICAgICBpZiAobmVzdCA9PSAwKQotCQkJewotCQkJICAqaW5jbF9wc3RyaWR4ID0gKGJmZF9zaXplX3R5cGUpIC0xOwotCQkJICArK3NraXA7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICAtLW5lc3Q7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoaW5jbF90eXBlID09IE5fQklOQ0wpCi0JCSAgICArK25lc3Q7Ci0JCSAgZWxzZSBpZiAobmVzdCA9PSAwKQotCQkgICAgewotCQkgICAgICAqaW5jbF9wc3RyaWR4ID0gKGJmZF9zaXplX3R5cGUpIC0xOwotCQkgICAgICArK3NraXA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZnJlZSAoc3RhYmJ1Zik7Ci0gIHN0YWJidWYgPSBOVUxMOwotICBmcmVlIChzdGFic3RyYnVmKTsKLSAgc3RhYnN0cmJ1ZiA9IE5VTEw7Ci0KLSAgLyogV2UgbmVlZCB0byBzZXQgdGhlIHNlY3Rpb24gc2l6ZXMgc3VjaCB0aGF0IHRoZSBsaW5rZXIgd2lsbAotICAgICBjb21wdXRlIHRoZSBvdXRwdXQgc2VjdGlvbiBzaXplcyBjb3JyZWN0bHkuICBXZSBzZXQgdGhlIC5zdGFiCi0gICAgIHNpemUgdG8gbm90IGluY2x1ZGUgdGhlIGVudHJpZXMgd2UgZG9uJ3Qgd2FudC4gIFdlIHNldAotICAgICBTRUNfRVhDTFVERSBmb3IgdGhlIC5zdGFic3RyIHNlY3Rpb24sIHNvIHRoYXQgaXQgd2lsbCBiZSBkcm9wcGVkCi0gICAgIGZyb20gdGhlIGxpbmsuICBXZSByZWNvcmQgdGhlIHNpemUgb2YgdGhlIHN0cnRhYiBpbiB0aGUgZmlyc3QKLSAgICAgLnN0YWJzdHIgc2VjdGlvbiB3ZSBzYXcsIGFuZCBtYWtlIHN1cmUgd2UgZG9uJ3Qgc2V0IFNFQ19FWENMVURFCi0gICAgIGZvciB0aGF0IHNlY3Rpb24uICAqLwotICBzdGFic2VjLT5fY29va2VkX3NpemUgPSAoY291bnQgLSBza2lwKSAqIFNUQUJTSVpFOwotICBpZiAoc3RhYnNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc3RhYnNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0gIHN0YWJzdHJzZWMtPmZsYWdzIHw9IFNFQ19FWENMVURFOwotICBzaW5mby0+c3RhYnN0ci0+X2Nvb2tlZF9zaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoc2luZm8tPnN0cmluZ3MpOwotCi0gIC8qIENhbGN1bGF0ZSB0aGUgYGN1bXVsYXRpdmVfc2tpcHMnIGFycmF5IG5vdyB0aGF0IHN0YWJzIGhhdmUgYmVlbgotICAgICBkZWxldGVkIGZvciB0aGlzIHNlY3Rpb24uICovCi0KLSAgaWYgKHNraXAgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGksIG9mZnNldDsKLSAgICAgIGJmZF9zaXplX3R5cGUgKnBza2lwczsKLQotICAgICAgc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwcyA9Ci0JKGJmZF9zaXplX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBjb3VudCAqIHNpemVvZiAoYmZkX3NpemVfdHlwZSkpOwotICAgICAgaWYgKHNlY2luZm8tPmN1bXVsYXRpdmVfc2tpcHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgcHNraXBzID0gc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwczsKLSAgICAgIHBzdHJpZHggPSBzZWNpbmZvLT5zdHJpZHhzOwotICAgICAgb2Zmc2V0ID0gMDsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHBza2lwcysrLCBwc3RyaWR4KyspCi0JewotCSAgKnBza2lwcyA9IG9mZnNldDsKLQkgIGlmICgqcHN0cmlkeCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JICAgIG9mZnNldCArPSBTVEFCU0laRTsKLQl9Ci0KLSAgICAgIEJGRF9BU1NFUlQgKG9mZnNldCAhPSAwKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzdGFiYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoc3RhYmJ1Zik7Ci0gIGlmIChzdGFic3RyYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoc3RhYnN0cmJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBzdGFiIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCB3aXRoIHRoZSByZWxvY2F0ZWQKLSAgIGNvbnRlbnRzLiAgKi8KLQotYm9vbGVhbgotX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzIChvdXRwdXRfYmZkLCBwc2luZm8sIHN0YWJzZWMsIHBzZWNpbmZvLCBjb250ZW50cykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBQVFIgKnBzaW5mbzsKLSAgICAgYXNlY3Rpb24gKnN0YWJzZWM7Ci0gICAgIFBUUiAqcHNlY2luZm87Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLXsKLSAgc3RydWN0IHN0YWJfaW5mbyAqc2luZm87Ci0gIHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyAqc2VjaW5mbzsKLSAgc3RydWN0IHN0YWJfZXhjbF9saXN0ICplOwotICBiZmRfYnl0ZSAqc3ltLCAqdG9zeW0sICpzeW1lbmQ7Ci0gIGJmZF9zaXplX3R5cGUgKnBzdHJpZHg7Ci0KLSAgc2luZm8gPSAoc3RydWN0IHN0YWJfaW5mbyAqKSAqcHNpbmZvOwotICBzZWNpbmZvID0gKHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyAqKSAqcHNlY2luZm87Ci0KLSAgaWYgKHNlY2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBzdGFic2VjLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkgICAgIGNvbnRlbnRzLCBzdGFic2VjLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgICAgc3RhYnNlYy0+X3Jhd19zaXplKTsKLQotICAvKiBIYW5kbGUgZWFjaCBOX0JJTkNMIGVudHJ5LiAgKi8KLSAgZm9yIChlID0gc2VjaW5mby0+ZXhjbHM7IGUgIT0gTlVMTDsgZSA9IGUtPm5leHQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmV4Y2xfc3ltOwotCi0gICAgICBCRkRfQVNTRVJUIChlLT5vZmZzZXQgPCBzdGFic2VjLT5fcmF3X3NpemUpOwotICAgICAgZXhjbF9zeW0gPSBjb250ZW50cyArIGUtPm9mZnNldDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGUtPnZhbCwgZXhjbF9zeW0gKyBWQUxPRkYpOwotICAgICAgZXhjbF9zeW1bVFlQRU9GRl0gPSBlLT50eXBlOwotICAgIH0KLQotICAvKiBDb3B5IG92ZXIgYWxsIHRoZSBzdGFicyBzeW1ib2xzLCBvbWl0dGluZyB0aGUgb25lcyB3ZSBkb24ndCB3YW50LAotICAgICBhbmQgY29ycmVjdGluZyB0aGUgc3RyaW5nIGluZGljZXMgZm9yIHRob3NlIHdlIGRvIHdhbnQuICAqLwotICB0b3N5bSA9IGNvbnRlbnRzOwotICBzeW1lbmQgPSBjb250ZW50cyArIHN0YWJzZWMtPl9yYXdfc2l6ZTsKLSAgZm9yIChzeW0gPSBjb250ZW50cywgcHN0cmlkeCA9IHNlY2luZm8tPnN0cmlkeHM7Ci0gICAgICAgc3ltIDwgc3ltZW5kOwotICAgICAgIHN5bSArPSBTVEFCU0laRSwgKytwc3RyaWR4KQotICAgIHsKLSAgICAgIGlmICgqcHN0cmlkeCAhPSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JewotCSAgaWYgKHRvc3ltICE9IHN5bSkKLQkgICAgbWVtY3B5ICh0b3N5bSwgc3ltLCBTVEFCU0laRSk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAqcHN0cmlkeCwgdG9zeW0gKyBTVFJEWE9GRik7Ci0KLQkgIGlmIChzeW1bVFlQRU9GRl0gPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgdGhlIGhlYWRlciBzeW1ib2wgZm9yIHRoZSBzdGFicyBzZWN0aW9uLiAgV2UKLSAgICAgICAgICAgICAgICAgZG9uJ3QgcmVhbGx5IG5lZWQgb25lLCBzaW5jZSB3ZSBoYXZlIG1lcmdlZCBhbGwgdGhlCi0gICAgICAgICAgICAgICAgIGlucHV0IHN0YWJzIHNlY3Rpb25zIGludG8gb25lLCBidXQgd2UgZ2VuZXJhdGUgb25lCi0gICAgICAgICAgICAgICAgIGZvciB0aGUgYmVuZWZpdCBvZiByZWFkZXJzIHdoaWNoIGV4cGVjdCB0byBzZWUgb25lLiAgKi8KLQkgICAgICBCRkRfQVNTRVJUIChzeW0gPT0gY29udGVudHMpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIF9iZmRfc3RyaW5ndGFiX3NpemUgKHNpbmZvLT5zdHJpbmdzKSwKLQkJCSAgdG9zeW0gKyBWQUxPRkYpOwotCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsCi0JCQkgIHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uLT5fcmF3X3NpemUgLyBTVEFCU0laRSAtIDEsCi0JCQkgIHRvc3ltICsgREVTQ09GRik7Ci0JICAgIH0KLQotCSAgdG9zeW0gKz0gU1RBQlNJWkU7Ci0JfQotICAgIH0KLQotICBCRkRfQVNTRVJUICgoYmZkX3NpemVfdHlwZSkgKHRvc3ltIC0gY29udGVudHMpID09IHN0YWJzZWMtPl9jb29rZWRfc2l6ZSk7Ci0KLSAgcmV0dXJuIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJICAgY29udGVudHMsIHN0YWJzZWMtPm91dHB1dF9vZmZzZXQsCi0JCQkJICAgc3RhYnNlYy0+X2Nvb2tlZF9zaXplKTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSAuc3RhYnN0ciBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MgKG91dHB1dF9iZmQsIHBzaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBQVFIgKnBzaW5mbzsKLXsKLSAgc3RydWN0IHN0YWJfaW5mbyAqc2luZm87Ci0KLSAgc2luZm8gPSAoc3RydWN0IHN0YWJfaW5mbyAqKSAqcHNpbmZvOwotCi0gIGlmIChzaW5mbyA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNpbmZvLT5zdGFic3RyLT5vdXRwdXRfc2VjdGlvbikpCi0gICAgewotICAgICAgLyogVGhlIHNlY3Rpb24gd2FzIGRpc2NhcmRlZCBmcm9tIHRoZSBsaW5rLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBCRkRfQVNTRVJUICgoc2luZm8tPnN0YWJzdHItPm91dHB1dF9vZmZzZXQKLQkgICAgICAgKyBfYmZkX3N0cmluZ3RhYl9zaXplIChzaW5mby0+c3RyaW5ncykpCi0JICAgICAgPD0gc2luZm8tPnN0YWJzdHItPm91dHB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJKHNpbmZvLT5zdGFic3RyLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcwotCQkgKyBzaW5mby0+c3RhYnN0ci0+b3V0cHV0X29mZnNldCksCi0JCVNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBfYmZkX3N0cmluZ3RhYl9lbWl0IChvdXRwdXRfYmZkLCBzaW5mby0+c3RyaW5ncykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIG5vIGxvbmdlciBuZWVkIHRoZSBzdGFicyBpbmZvcm1hdGlvbi4gICovCi0gIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKHNpbmZvLT5zdHJpbmdzKTsKLSAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJnNpbmZvLT5pbmNsdWRlcy5yb290KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGFuIGFkZHJlc3MgaW4gdGhlIC5zdGFiIHNlY3Rpb24uICBHaXZlbiBPRkZTRVQgd2l0aGluCi0gICBTVEFCU0VDLCB0aGlzIHJldHVybnMgdGhlIG5ldyBvZmZzZXQgaW4gdGhlIGFkanVzdGVkIHN0YWIgc2VjdGlvbiwKLSAgIG9yIC0xIGlmIHRoZSBhZGRyZXNzIHJlZmVycyB0byBhIHN0YWIgd2hpY2ggaGFzIGJlZW4gcmVtb3ZlZC4gICovCi0KLWJmZF92bWEKLV9iZmRfc3RhYl9zZWN0aW9uX29mZnNldCAob3V0cHV0X2JmZCwgcHNpbmZvLCBzdGFic2VjLCBwc2VjaW5mbywgb2Zmc2V0KQotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSICpwc2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnN0YWJzZWM7Ci0gICAgIFBUUiAqcHNlY2luZm87Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotewotICBzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKnNlY2luZm87Ci0KLSAgc2VjaW5mbyA9IChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKikgKnBzZWNpbmZvOwotCi0gIGlmIChzZWNpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuIG9mZnNldDsKLQotICBpZiAob2Zmc2V0ID49IHN0YWJzZWMtPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gb2Zmc2V0IC0gKHN0YWJzZWMtPl9jb29rZWRfc2l6ZSAtIHN0YWJzZWMtPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKHNlY2luZm8tPmN1bXVsYXRpdmVfc2tpcHMpCi0gICAgewotICAgICAgYmZkX3ZtYSBpOwotCi0gICAgICBpID0gb2Zmc2V0IC8gU1RBQlNJWkU7Ci0KLSAgICAgIGlmIChzZWNpbmZvLT5zdHJpZHhzIFtpXSA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JcmV0dXJuIChiZmRfdm1hKSAtMTsKLQotICAgICAgcmV0dXJuIG9mZnNldCAtIHNlY2luZm8tPmN1bXVsYXRpdmVfc2tpcHMgW2ldOwotICAgIH0KLQotICByZXR1cm4gb2Zmc2V0OwotfQpkaWZmIC0tZ2l0IGEvYmZkL3N0YW1wLWguaW4gYi9iZmQvc3RhbXAtaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4OGY3MC4uMDAwMDAwMAotLS0gYS9iZmQvc3RhbXAtaC5pbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRpbWVzdGFtcApkaWZmIC0tZ2l0IGEvYmZkL3N1bm9zLmMgYi9iZmQvc3Vub3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRhNjg1Ny4uMDAwMDAwMAotLS0gYS9iZmQvc3Vub3MuYworKysgL2Rldi9udWxsCkBAIC0xLDI5NDggKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIFN1bk9TIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXN1bm9zLWJpZyIKLSNkZWZpbmUgTVkoT1ApIENBVChzdW5vc19iaWdfLE9QKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotLyogU3RhdGljIHJvdXRpbmVzIGRlZmluZWQgaW4gdGhpcyBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gc3Vub3NfcmVhZF9keW5hbWljX2luZm8gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHN1bm9zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2x1cnBfZHluYW1pY19zeW10YWIgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGxvbmcgc3Vub3NfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpzdW5vc19saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGV4dGVybmFsX25saXN0ICoqLAotCSAgIGJmZF9zaXplX3R5cGUgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAotCSAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19zY2FuX3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2Nhbl9leHRfcmVsb2NzCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfbGlua19keW5hbWljX29iamVjdAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19jaGVja19keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIsIGJmZF9ieXRlICosIGJvb2xlYW4gKiwKLQkgICBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotI2RlZmluZSBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgc3Vub3NfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgc3Vub3NfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2Mgc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgc3Vub3NfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfbGlua19keW5hbWljX29iamVjdCBzdW5vc19saW5rX2R5bmFtaWNfb2JqZWN0Ci0jZGVmaW5lIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sIHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2Mgc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIHN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmsKLQotLyogPz8/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+ZHluaW5keCA9IC0yOwotCX0KLQotICAgICAgaWYgKChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotCSAgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLQloLT5mbGFncyB8PSBTVU5PU19DT05TVFJVQ1RPUjsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgbGlzdCBvZiBvYmplY3RzIG5lZWRlZCBieSBCRkQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqCi1iZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0IChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yICE9ICZNWSh2ZWMpKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPm5lZWRlZDsKLX0KLQotLyogUmVjb3JkIGFuIGFzc2lnbm1lbnQgbWFkZSB0byBhIHN5bWJvbCBieSBhIGxpbmtlciBzY3JpcHQuICBXZSBuZWVkCi0gICB0aGlzIGluIGNhc2Ugc29tZSBkeW5hbWljIG9iamVjdCByZWZlcnMgdG8gdGhpcyBzeW1ib2wuICAqLwotCi1ib29sZWFuCi1iZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgaW5mbywgbmFtZSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBpZiAob3V0cHV0X2JmZC0+eHZlYyAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB3ZSBoYXZlIGV4YW1pbmVkIGFsbCB0aGUgaW5wdXQgb2JqZWN0cy4gIElmCi0gICAgIHRoZSBzeW1ib2wgZG9lcyBub3QgZXhpc3QsIGl0IG1lcmVseSBtZWFucyB0aGF0IG5vIG9iamVjdCByZWZlcnMKLSAgICAgdG8gaXQsIGFuZCB3ZSBjYW4ganVzdCBpZ25vcmUgaXQgYXQgdGhpcyBwb2ludC4gICovCi0gIGggPSBzdW5vc19saW5rX2hhc2hfbG9va3VwIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwKLQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEluIGEgc2hhcmVkIGxpYnJhcnksIHRoZSBfX0RZTkFNSUMgc3ltYm9sIGRvZXMgbm90IGFwcGVhciBpbiB0aGUKLSAgICAgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoISBpbmZvLT5zaGFyZWQgfHwgc3RyY21wIChuYW1lLCAiX19EWU5BTUlDIikgIT0gMCkKLSAgICB7Ci0gICAgICBoLT5mbGFncyB8PSBTVU5PU19ERUZfUkVHVUxBUjsKLQotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgKytzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0JICBoLT5keW5pbmR4ID0gLTI7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHVwIHRoZSBzaXplcyBhbmQgY29udGVudHMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMgY3JlYXRlZCBpbgotICAgc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scy4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBTdW5PUyBsaW5rZXIKLSAgIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lLiAgV2UgbXVzdCBzZXQgdGhlIHNpemVzIG9mIHRoZQotICAgc2VjdGlvbnMgYmVmb3JlIHRoZSBsaW5rZXIgc2V0cyB0aGUgYWRkcmVzc2VzIG9mIHRoZSB2YXJpb3VzCi0gICBzZWN0aW9ucy4gIFRoaXMgdW5mb3J0dW5hdGVseSByZXF1aXJlcyByZWFkaW5nIGFsbCB0aGUgcmVsb2NzIHNvCi0gICB0aGF0IHdlIGNhbiB3b3JrIG91dCB3aGljaCBvbmVzIG5lZWQgdG8gYmVjb21lIGR5bmFtaWMgcmVsb2NzLiAgSWYKLSAgIGluZm8tPmtlZXBfbWVtb3J5IGlzIHRydWUsIHdlIGtlZXAgdGhlIHJlbG9jcyBpbiBtZW1vcnk7IG90aGVyd2lzZSwKLSAgIHdlIGRpc2NhcmQgdGhlbSwgYW5kIHdpbGwgcmVhZCB0aGVtIGFnYWluIGxhdGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbywgc2R5bnB0ciwgc25lZWRwdHIsCi0JCQkJIHNydWxlc3B0cikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKipzZHlucHRyOwotICAgICBhc2VjdGlvbiAqKnNuZWVkcHRyOwotICAgICBhc2VjdGlvbiAqKnNydWxlc3B0cjsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIHNpemVfdCBkeW5zeW1jb3VudDsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYXNlY3Rpb24gKnM7Ci0gIHNpemVfdCBidWNrZXRjb3VudDsKLSAgc2l6ZV90IGhhc2hhbGxvYzsKLSAgc2l6ZV90IGk7Ci0gIGJmZCAqc3ViOwotCi0gICpzZHlucHRyID0gTlVMTDsKLSAgKnNuZWVkcHRyID0gTlVMTDsKLSAgKnNydWxlc3B0ciA9IE5VTEw7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAob3V0cHV0X2JmZC0+eHZlYyAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBpbnB1dCBCRkQncyBhbmQgcmVhZCB0aGVpciByZWxvY3MuICBJdCB3b3VsZAotICAgICBiZSBiZXR0ZXIgaWYgd2UgZGlkbid0IGhhdmUgdG8gZG8gdGhpcywgYnV0IHRoZXJlIGlzIG5vIG90aGVyIHdheQotICAgICB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkeW5hbWljIHJlbG9jcyB3ZSBuZWVkLCBhbmQsIG1vcmUKLSAgICAgaW1wb3J0YW50bHksIHRoZXJlIGlzIG5vIG90aGVyIHdheSB0byBrbm93IHdoaWNoIHN5bWJvbHMgc2hvdWxkCi0gICAgIGdldCBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKHN1Yi0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwCi0JICAmJiBzdWItPnh2ZWMgPT0gb3V0cHV0X2JmZC0+eHZlYykKLQl7Ci0JICBpZiAoISBzdW5vc19zY2FuX3JlbG9jcyAoaW5mbywgc3ViLCBvYmpfdGV4dHNlYyAoc3ViKSwKLQkJCQkgICBleGVjX2hkciAoc3ViKS0+YV90cnNpemUpCi0JICAgICAgfHwgISBzdW5vc19zY2FuX3JlbG9jcyAoaW5mbywgc3ViLCBvYmpfZGF0YXNlYyAoc3ViKSwKLQkJCQkgICAgICBleGVjX2hkciAoc3ViKS0+YV9kcnNpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBkeW5zeW1jb3VudCA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLQotICAvKiBJZiB0aGVyZSB3ZXJlIG5vIGR5bmFtaWMgb2JqZWN0cyBpbiB0aGUgbGluaywgYW5kIHdlIGRvbid0IG5lZWQKLSAgICAgdG8gYnVpbGQgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUuICAqLwotICBpZiAoISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQKLSAgICAgICYmICEgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9uZWVkZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyB3YXMgbWVudGlvbmVkLCBkZWZpbmUgaXQuICAqLwotICBoID0gc3Vub3NfbGlua19oYXNoX2xvb2t1cCAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICAiX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICBpZiAoaCAhPSBOVUxMICYmIChoLT5mbGFncyAmIFNVTk9TX1JFRl9SRUdVTEFSKSAhPSAwKQotICAgIHsKLSAgICAgIGgtPmZsYWdzIHw9IFNVTk9TX0RFRl9SRUdVTEFSOwotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgKytzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0JICBoLT5keW5pbmR4ID0gLTI7Ci0JfQotICAgICAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0gICAgICBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0KLSAgICAgIC8qIElmIHRoZSAuZ290IHNlY3Rpb24gaXMgbW9yZSB0aGFuIDB4MTAwMCBieXRlcywgd2Ugc2V0Ci0gICAgICAgICBfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHRvIGJlIDB4MTAwMCBieXRlcyBpbnRvIHRoZSBzZWN0aW9uLAotICAgICAgICAgc28gdGhhdCAxMyBiaXQgcmVsb2NhdGlvbnMgaGF2ZSBhIGdyZWF0ZXIgY2hhbmNlIG9mIHdvcmtpbmcuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA+PSAweDEwMDApCi0JaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlID0gMHgxMDAwOwotICAgICAgZWxzZQotCWgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9IDA7Ci0KLSAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfYmFzZSA9IGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgYXJlIGFueSBzaGFyZWQgb2JqZWN0cyBpbiB0aGUgbGluaywgdGhlbiB3ZSBuZWVkIHRvIHNldAotICAgICB1cCB0aGUgZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX25lZWRlZCkKLSAgICB7Ci0gICAgICAqc2R5bnB0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOwotCi0gICAgICAvKiBUaGUgLmR5bmFtaWMgc2VjdGlvbiBpcyBhbHdheXMgdGhlIHNhbWUgc2l6ZS4gICovCi0gICAgICBzID0gKnNkeW5wdHI7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplID0gKHNpemVvZiAoc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pYykKLQkJICAgICAgKyBFWFRFUk5BTF9TVU40X0RZTkFNSUNfREVCVUdHRVJfU0laRQotCQkgICAgICArIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pY19saW5rKSk7Ci0KLSAgICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgLmR5bnN5bSBhbmQgLmhhc2ggc2VjdGlvbnMuICBXZSBjb3VudGVkCi0JIHRoZSBudW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzIGFzIHdlIHJlYWQgdGhlIGlucHV0IGZpbGVzLiAgV2UKLQkgd2lsbCBidWlsZCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgKC5keW5zeW0pIGFuZCB0aGUgaGFzaAotCSB0YWJsZSAoLmhhc2gpIHdoZW4gd2UgYnVpbGQgdGhlIGZpbmFsIHN5bWJvbCB0YWJsZSwgYmVjYXVzZQotCSB1bnRpbCB0aGVuIHdlIGRvIG5vdCBrbm93IHRoZSBjb3JyZWN0IHZhbHVlIHRvIGdpdmUgdGhlCi0JIHN5bWJvbHMuICBXZSBidWlsZCB0aGUgZHluYW1pYyBzeW1ib2wgc3RyaW5nIHRhYmxlICguZHluc3RyKQotCSBpbiBhIHRyYXZlcnNhbCBvZiB0aGUgc3ltYm9sIHRhYmxlIHVzaW5nCi0JIHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplID0gZHluc3ltY291bnQgKiBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7Ci0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIC8qIFRoZSBudW1iZXIgb2YgYnVja2V0cyBpcyBqdXN0IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBkaXZpZGVkCi0JIGJ5IGZvdXIuICBUbyBjb21wdXRlIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBoYXNoIHRhYmxlLCB3ZQotCSBtdXN0IGFjdHVhbGx5IGNvbXB1dGUgdGhlIGhhc2ggdGFibGUuICBOb3JtYWxseSB3ZSBuZWVkCi0JIGV4YWN0bHkgYXMgbWFueSBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlIGFzIHRoZXJlIGFyZQotCSBkeW5hbWljIHN5bWJvbHMsIGJ1dCBpZiBzb21lIG9mIHRoZSBidWNrZXRzIGFyZSBub3QgdXNlZCB3ZQotCSB3aWxsIG5lZWQgYWRkaXRpb25hbCBlbnRyaWVzLiAgSW4gdGhlIHdvcnN0IGNhc2UsIGV2ZXJ5Ci0JIHN5bWJvbCB3aWxsIGhhc2ggdG8gdGhlIHNhbWUgYnVja2V0LCBhbmQgd2Ugd2lsbCBuZWVkCi0JIEJVQ0tFVENPVU5UIC0gMSBleHRyYSBlbnRyaWVzLiAgKi8KLSAgICAgIGlmIChkeW5zeW1jb3VudCA+PSA0KQotCWJ1Y2tldGNvdW50ID0gZHluc3ltY291bnQgLyA0OwotICAgICAgZWxzZSBpZiAoZHluc3ltY291bnQgPiAwKQotCWJ1Y2tldGNvdW50ID0gZHluc3ltY291bnQ7Ci0gICAgICBlbHNlCi0JYnVja2V0Y291bnQgPSAxOwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGhhc2hhbGxvYyA9IChkeW5zeW1jb3VudCArIGJ1Y2tldGNvdW50IC0gMSkgKiBIQVNIX0VOVFJZX1NJWkU7Ci0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgaGFzaGFsbG9jKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIGR5bnN5bWNvdW50ID4gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBtZW1zZXQgKHMtPmNvbnRlbnRzLCAwLCBoYXNoYWxsb2MpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Y2tldGNvdW50OyBpKyspCi0JUFVUX1dPUkQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAtMSwgcy0+Y29udGVudHMgKyBpICogSEFTSF9FTlRSWV9TSVpFKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IGJ1Y2tldGNvdW50ICogSEFTSF9FTlRSWV9TSVpFOwotCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+YnVja2V0Y291bnQgPSBidWNrZXRjb3VudDsKLQotICAgICAgLyogU2NhbiBhbGwgdGhlIHN5bWJvbHMsIHBsYWNlIHRoZW0gaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLAotCSBhbmQgYnVpbGQgdGhlIGR5bmFtaWMgaGFzaCB0YWJsZS4gIFdlIHJldXNlIGR5bnN5bWNvdW50IGFzIGEKLQkgY291bnRlciBmb3IgdGhlIG51bWJlciBvZiBzeW1ib2xzIHdlIGhhdmUgYWRkZWQgc28gZmFyLiAgKi8KLSAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCA9IDA7Ci0gICAgICBzdW5vc19saW5rX2hhc2hfdHJhdmVyc2UgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCXN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wsCi0JCQkJKFBUUikgaW5mbyk7Ci0gICAgICBCRkRfQVNTRVJUIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgPT0gZHluc3ltY291bnQpOwotCi0gICAgICAvKiBUaGUgU3VuT1MgbmF0aXZlIGxpbmtlciBzZWVtcyB0byBhbGlnbiB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKLQkgc3ltYm9sIHN0cmluZ3MgdG8gYSBtdWx0aXBsZSBvZiA4LiAgSSBkb24ndCBrbm93IGlmIHRoaXMgaXMKLQkgaW1wb3J0YW50LCBidXQgaXQgY2FuJ3QgaHVydCBtdWNoLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN0ciIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGlmICgocy0+X3Jhd19zaXplICYgNykgIT0gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGFkZDsKLQkgIGJmZF9ieXRlICpjb250ZW50czsKLQotCSAgYWRkID0gOCAtIChzLT5fcmF3X3NpemUgJiA3KTsKLQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChzLT5jb250ZW50cywKLQkJCQkJICAgICAgIChzaXplX3QpIChzLT5fcmF3X3NpemUgKyBhZGQpKTsKLQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBtZW1zZXQgKGNvbnRlbnRzICsgcy0+X3Jhd19zaXplLCAwLCAoc2l6ZV90KSBhZGQpOwotCSAgcy0+Y29udGVudHMgPSBjb250ZW50czsKLQkgIHMtPl9yYXdfc2l6ZSArPSBhZGQ7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHdvcmtlZCBvdXQgdGhlIHNpemVzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZQotICAgICB0YWJsZSBhbmQgdGhlIGR5bmFtaWMgcmVsb2NzLCBhbGxvY2F0ZSBzdG9yYWdlIGZvciB0aGVtLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIGlmIChzLT5fcmF3X3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHRhYmxlLiAgKi8KLSAgICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoIChkeW5vYmopKQotCXsKLQljYXNlIGJmZF9hcmNoX3NwYXJjOgotCSAgbWVtY3B5IChzLT5jb250ZW50cywgc3BhcmNfcGx0X2ZpcnN0X2VudHJ5LCBTUEFSQ19QTFRfRU5UUllfU0laRSk7Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX2FyY2hfbTY4azoKLQkgIG1lbWNweSAocy0+Y29udGVudHMsIG02OGtfcGx0X2ZpcnN0X2VudHJ5LCBNNjhLX1BMVF9FTlRSWV9TSVpFKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0gIGlmIChzLT5fcmF3X3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgdG8ga2VlcCB0cmFjayBvZiBob3cgbWFueSBvZiB0aGUKLSAgICAgcmVsb2NzIHdlIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCi0gIHMtPnJlbG9jX2NvdW50ID0gMDsKLQotICAvKiBNYWtlIHNwYWNlIGZvciB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpzbmVlZHB0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIubmVlZCIpOwotICAqc3J1bGVzcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5ydWxlcyIpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTY2FuIHRoZSByZWxvY3MgZm9yIGFuIGlucHV0IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3Nfc2Nhbl9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywgcmVsX3NpemUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemU7Ci17Ci0gIFBUUiByZWxvY3M7Ci0gIFBUUiBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLSAgaWYgKHJlbF9zaXplID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgcmVsb2NzID0gZnJlZV9yZWxvY3MgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxfc2l6ZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0ICpuOwotCi0gICAgICBuID0gKChzdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0ICopCi0JICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhb3V0X3NlY3Rpb25fZGF0YV9zdHJ1Y3QpKSk7Ci0gICAgICBpZiAobiA9PSBOVUxMKQotCXJlbG9jcyA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgc2V0X2FvdXRfc2VjdGlvbl9kYXRhIChzZWMsIG4pOwotCSAgcmVsb2NzID0gYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsX3NpemUpOwotCSAgYW91dF9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IHJlbG9jczsKLQl9Ci0gICAgfQotICBpZiAocmVsb2NzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChyZWxvY3MsIDEsIHJlbF9zaXplLCBhYmZkKSAhPSByZWxfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID09IFJFTE9DX1NURF9TSVpFKQotICAgIHsKLSAgICAgIGlmICghIHN1bm9zX3NjYW5fc3RkX3JlbG9jcyAoaW5mbywgYWJmZCwgc2VjLAotCQkJCSAgIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIHJlbG9jcywKLQkJCQkgICByZWxfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgc3Vub3Nfc2Nhbl9leHRfcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsCi0JCQkJICAgKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcmVsb2NzLAotCQkJCSAgIHJlbF9zaXplKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU2NhbiB0aGUgcmVsb2NzIGZvciBhbiBpbnB1dCBzZWN0aW9uIHVzaW5nIHN0YW5kYXJkIHJlbG9jcy4gIFdlCi0gICBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyBmb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZHluYW1pYwotICAgc3ltYm9sLiAgSWYgdGhlIHN5bWJvbCBpcyBpbiB0aGUgLnRleHQgc2VjdGlvbiwgYW4gZW50cnkgaXMgbWFkZSBpbgotICAgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgTm90ZSB0aGF0IHRoaXMgd2lsbCBkbyB0aGUgd3JvbmcKLSAgIHRoaW5nIGlmIHRoZSBzeW1ib2wgaXMgYWN0dWFsbHkgZGF0YTsgSSBkb24ndCB0aGluayB0aGUgU3VuIDMKLSAgIG5hdGl2ZSBsaW5rZXIgaGFuZGxlcyB0aGlzIGNhc2UgY29ycmVjdGx5IGVpdGhlci4gIElmIHRoZSBzeW1ib2wgaXMKLSAgIG5vdCBpbiB0aGUgLnRleHQgc2VjdGlvbiwgd2UgbXVzdCBwcmVzZXJ2ZSB0aGUgcmVsb2MgYXMgYSBkeW5hbWljCi0gICByZWxvYy4gIEZJWE1FOiBXZSBzaG91bGQgYWxzbyBoYW5kbGUgdGhlIFBJQyByZWxvY3MgaGVyZSBieQotICAgYnVpbGRpbmcgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3NjYW5fc3RkX3JlbG9jcyAoaW5mbywgYWJmZCwgc2VjLCByZWxvY3MsIHJlbF9zaXplKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jczsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzcGx0ID0gTlVMTDsKLSAgYXNlY3Rpb24gKnNyZWwgPSBOVUxMOwotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgY29uc3Qgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsLCAqcmVsZW5kOwotCi0gIC8qIFdlIG9ubHkga25vdyBob3cgdG8gaGFuZGxlIG02OGsgcGx0IGVudHJpZXMuICAqLwotICBpZiAoYmZkX2dldF9hcmNoIChhYmZkKSAhPSBiZmRfYXJjaF9tNjhrKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGR5bm9iaiA9IE5VTEw7Ci0KLSAgc3ltX2hhc2hlcyA9IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICoqKSBvYmpfYW91dF9zeW1faGFzaGVzIChhYmZkKTsKLQotICByZWxlbmQgPSByZWxvY3MgKyByZWxfc2l6ZSAvIFJFTE9DX1NURF9TSVpFOwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl9pbmRleDsKLSAgICAgIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIFdlIG9ubHkgd2FudCByZWxvY3MgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCXsKLQkgIGlmICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHKSA9PSAwKQotCSAgICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpID09IDApCi0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBzeW1ib2wgaW5kZXguICAqLwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0Jcl9pbmRleCA9ICgocmVsLT5yX2luZGV4WzBdIDw8IDE2KQotCQkgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgfCByZWwtPnJfaW5kZXhbMl0pOwotICAgICAgZWxzZQotCXJfaW5kZXggPSAoKHJlbC0+cl9pbmRleFsyXSA8PCAxNikKLQkJICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCSAgIHwgcmVsLT5yX2luZGV4WzBdKTsKLQotICAgICAgLyogR2V0IHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgICAgIGggPSBzeW1faGFzaGVzW3JfaW5kZXhdOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICAvKiBUaGlzIHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuLCBidXQgaXQgd2lsbCBpbiBhbnkgY2FzZQotCSAgICAgYmUgY2F1Z2h0IGluIHRoZSByZWxvY2F0aW9uIHBoYXNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQXQgdGhpcyBwb2ludCBjb21tb24gc3ltYm9scyBoYXZlIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIHNvCi0JIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlbS4gIFdlIG5lZWQgdG8gY29uc2lkZXIgdGhhdAotCSB3ZSBtYXkgaGF2ZSBhbHJlYWR5IHNlZW4gdGhpcyBzeW1ib2wgYW5kIG1hcmtlZCBpdCB1bmRlZmluZWQ7Ci0JIGlmIHRoZSBzeW1ib2wgaXMgcmVhbGx5IHVuZGVmaW5lZCwgdGhlbiBTVU5PU19ERUZfRFlOQU1JQwotCSB3aWxsIGJlIHplcm8uICAqLwotICAgICAgaWYgKGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSA9PSAwCi0JICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZ290OwotCi0JICBpZiAoISBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbywgZmFsc2UpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCSAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0JICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLQkgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0JICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICBpZiAoc2dvdC0+X3Jhd19zaXplID09IDApCi0JICAgIHNnb3QtPl9yYXdfc2l6ZSA9IEJZVEVTX0lOX1dPUkQ7Ci0JICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCA9IHRydWU7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUICgoaC0+ZmxhZ3MgJiBTVU5PU19SRUZfUkVHVUxBUikgIT0gMCk7Ci0gICAgICBCRkRfQVNTRVJUIChoLT5wbHRfb2Zmc2V0ICE9IDAKLQkJICB8fCAoKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgICA/IChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzCi0JCQkgJiBEWU5BTUlDKSAhPSAwCi0JCSAgICAgIDogKGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkpOwotCi0gICAgICAvKiBUaGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBvbmx5IGJ5IGEgZHluYW1pYwotCSBvYmplY3QuICAqLwotCi0gICAgICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JewotCSAgLyogUHJlc3VtYWJseSB0aGlzIHN5bWJvbCB3YXMgbWFya2VkIGFzIGJlaW5nIHVuZGVmaW5lZCBieQotCSAgICAgYW4gZWFybGllciByZWxvYy4gICovCi0JICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfU1REX1NJWkU7Ci0JfQotICAgICAgZWxzZSBpZiAoKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCXsKLQkgIGJmZCAqc3ViOwotCi0JICAvKiBUaGlzIHJlbG9jIGlzIG5vdCBpbiB0aGUgLnRleHQgc2VjdGlvbi4gIEl0IG11c3QgYmUKLQkgICAgIGNvcGllZCBpbnRvIHRoZSBkeW5hbWljIHJlbG9jcy4gIFdlIG1hcmsgdGhlIHN5bWJvbCBhcwotCSAgICAgYmVpbmcgdW5kZWZpbmVkLiAgKi8KLQkgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19TVERfU0laRTsKLQkgIHN1YiA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT5yb290LnJvb3QudS51bmRlZi5hYmZkID0gc3ViOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBpcyBpbiB0aGUgLnRleHQgc2VjdGlvbi4gIFdlIG11c3QgZ2l2ZSBpdCBhbgotCSAgICAgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBpZiB3ZSBoYXZlIG5vdAotCSAgICAgYWxyZWFkeSBkb25lIHNvLiAgV2UgY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wKLQkgICAgIHRvIHRoZSAucGx0IHNlY3Rpb247IHRoaXMgd2lsbCBjYXVzZSByZWxvY3MgYWdhaW5zdCBpdCB0bwotCSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotCSAgaWYgKGgtPnBsdF9vZmZzZXQgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPT0gMCkKLQkJc3BsdC0+X3Jhd19zaXplID0gTTY4S19QTFRfRU5UUllfU0laRTsKLQkgICAgICBoLT5wbHRfb2Zmc2V0ID0gc3BsdC0+X3Jhd19zaXplOwotCi0JICAgICAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCQl7Ci0JCSAgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPSBzcGx0OwotCQkgIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9IHNwbHQtPl9yYXdfc2l6ZTsKLQkJfQotCi0JICAgICAgc3BsdC0+X3Jhd19zaXplICs9IE02OEtfUExUX0VOVFJZX1NJWkU7Ci0KLQkgICAgICAvKiBXZSBtYXkgYWxzbyBuZWVkIGEgZHluYW1pYyByZWxvYyBlbnRyeS4gICovCi0JICAgICAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCQlzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfU1REX1NJWkU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTY2FuIHRoZSByZWxvY3MgZm9yIGFuIGlucHV0IHNlY3Rpb24gdXNpbmcgZXh0ZW5kZWQgcmVsb2NzLiAgV2UKLSAgIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvIGZvciBlYWNoIHJlbG9jIGFnYWluc3QgYSBkeW5hbWljCi0gICBzeW1ib2wuICBJZiB0aGUgcmVsb2MgaXMgYSBXRElTUDMwLCBhbmQgdGhlIHN5bWJvbCBpcyBpbiB0aGUgLnRleHQKLSAgIHNlY3Rpb24sIGFuIGVudHJ5IGlzIG1hZGUgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLgotICAgT3RoZXJ3aXNlLCB3ZSBtdXN0IHByZXNlcnZlIHRoZSByZWxvYyBhcyBhIGR5bmFtaWMgcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3Nfc2Nhbl9leHRfcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsIHJlbG9jcywgcmVsX3NpemUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3Qgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcmVsb2NzOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotewotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGNvbnN0IHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJlbCwgKnJlbGVuZDsKLSAgYXNlY3Rpb24gKnNwbHQgPSBOVUxMOwotICBhc2VjdGlvbiAqc2dvdCA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzcmVsID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IGtub3cgaG93IHRvIGhhbmRsZSBTUEFSQyBwbHQgZW50cmllcy4gICovCi0gIGlmIChiZmRfZ2V0X2FyY2ggKGFiZmQpICE9IGJmZF9hcmNoX3NwYXJjKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGR5bm9iaiA9IE5VTEw7Ci0KLSAgc3ltX2hhc2hlcyA9IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICoqKSBvYmpfYW91dF9zeW1faGFzaGVzIChhYmZkKTsKLQotICByZWxlbmQgPSByZWxvY3MgKyByZWxfc2l6ZSAvIFJFTE9DX0VYVF9TSVpFOwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgcl9pbmRleDsKLSAgICAgIGludCByX2V4dGVybjsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLQotICAgICAgLyogU3dhcCBpbiB0aGUgcmVsb2MgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JewotCSAgcl9pbmRleCA9ICgocmVsLT5yX2luZGV4WzBdIDw8IDE2KQotCQkgICAgIHwgKHJlbC0+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+X3Jhd19zaXplICsgQllURVNfSU5fV09SRCk7Ci0JICBzLT5fcmF3X3NpemUgKz0gSEFTSF9FTlRSWV9TSVpFOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExpbmsgYSBkeW5hbWljIG9iamVjdC4gIFdlIGFjdHVhbGx5IGRvbid0IGhhdmUgYW55dGhpbmcgdG8gZG8gYXQKLSAgIHRoaXMgcG9pbnQuICBUaGlzIGVudHJ5IHBvaW50IGV4aXN0cyB0byBwcmV2ZW50IHRoZSByZWd1bGFyIGxpbmtlcgotICAgY29kZSBmcm9tIGRvaW5nIGFueXRoaW5nIHdpdGggdGhlIG9iamVjdC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXN1bm9zX2xpbmtfZHluYW1pY19vYmplY3QgKGluZm8sIGFiZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgZHluYW1pYyBzeW1ib2wuICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgZmluYWwgdHJhdmVyc2FsCi0gICBvdmVyIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGhhcmcpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaGFyZzsKLXsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0gIGludCB0eXBlOwotICBiZmRfdm1hIHZhbDsKLSAgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqb3V0c3ltOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgZmlsbCBpbiB0aGUKLSAgICAgdGFibGUgZW50cnkuICAqLwotICBpZiAoaC0+cGx0X29mZnNldCAhPSAwKQotICAgIHsKLSAgICAgIGJmZCAqZHlub2JqOwotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBiZmRfYnl0ZSAqcDsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgYmZkX3ZtYSByX2FkZHJlc3M7Ci0KLSAgICAgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHAgPSBzcGx0LT5jb250ZW50cyArIGgtPnBsdF9vZmZzZXQ7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotCi0gICAgICByX2FkZHJlc3MgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBoLT5wbHRfb2Zmc2V0KTsKLQotICAgICAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKG91dHB1dF9iZmQpKQotCXsKLQljYXNlIGJmZF9hcmNoX3NwYXJjOgotCSAgaWYgKGluZm8tPnNoYXJlZCB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkgICAgewotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX1BMVF9FTlRSWV9XT1JEMCwgcCk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCSAgKFNQQVJDX1BMVF9FTlRSWV9XT1JEMQotCQkJICAgKyAoKCgtIChoLT5wbHRfb2Zmc2V0ICsgNCkgPj4gMikKLQkJCSAgICAgICAmIDB4M2ZmZmZmZmYpKSksCi0JCQkgIHAgKyA0KTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTUEFSQ19QTFRfRU5UUllfV09SRDIgKyBzLT5yZWxvY19jb3VudCwKLQkJCSAgcCArIDgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHZhbDsKLQotCSAgICAgIHZhbCA9IChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgICArIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCSAgU1BBUkNfUExUX1BJQ19XT1JEMCArICgodmFsID4+IDEwKSAmIDB4M2ZmZmZmKSwKLQkJCSAgcCk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCSAgU1BBUkNfUExUX1BJQ19XT1JEMSArICh2YWwgJiAweDNmZiksCi0JCQkgIHAgKyA0KTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTUEFSQ19QTFRfUElDX1dPUkQyLCBwICsgOCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfYXJjaF9tNjhrOgotCSAgaWYgKCEgaW5mby0+c2hhcmVkICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSAhPSAwKQotCSAgICBhYm9ydCAoKTsKLQkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIE02OEtfUExUX0VOVFJZX1dPUkQwLCBwKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsICgtIChoLT5wbHRfb2Zmc2V0ICsgMikpLCBwICsgMik7Ci0JICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCBzLT5yZWxvY19jb3VudCwgcCArIDYpOwotCSAgcl9hZGRyZXNzICs9IDI7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBhZGQgYSBqdW1wIHRhYmxlIHJlbG9jLCB1bmxlc3MgdGhpcyBpcyB0aGUKLSAgICAgICAgIHJlc3VsdCBvZiBhIEpNUF9UQkwgcmVsb2MgZnJvbSBQSUMgY29tcGlsZWQgY29kZS4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggPj0gMCk7Ci0JICBCRkRfQVNTRVJUIChzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopCi0JCSAgICAgIDwgcy0+X3Jhd19zaXplKTsKLQkgIHAgPSBzLT5jb250ZW50cyArIHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKG91dHB1dF9iZmQpOwotCSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChvdXRwdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKLQkgICAgewotCSAgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnNyZWw7Ci0KLQkgICAgICBzcmVsID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcDsKLQkgICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgcl9hZGRyZXNzLCBzcmVsLT5yX2FkZHJlc3MpOwotCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQotCQl7Ci0JCSAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiAxNik7Ci0JCSAgc3JlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiA4KTsKLQkJICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4KTsKLQkJICBzcmVsLT5yX3R5cGVbMF0gPSAoUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwotCQkJCSAgICAgfCBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3JlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiAxNik7Ci0JCSAgc3JlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiA4KTsKLQkJICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKWgtPmR5bmluZHg7Ci0JCSAgc3JlbC0+cl90eXBlWzBdID0gKFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUKLQkJCQkgICAgIHwgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICplcmVsOwotCi0JICAgICAgZXJlbCA9IChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHA7Ci0JICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHJfYWRkcmVzcywgZXJlbC0+cl9hZGRyZXNzKTsKLQkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJewotCQkgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gMTYpOwotCQkgIGVyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gOCk7Ci0JCSAgZXJlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSloLT5keW5pbmR4OwotCQkgIGVyZWwtPnJfdHlwZVswXSA9Ci0JCSAgICAoUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRwotCQkgICAgIHwgKFJFTE9DX0pNUF9TTE9UIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDE2KTsKLQkJICBlcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDgpOwotCQkgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpaC0+ZHluaW5keDsKLQkJICBlcmVsLT5yX3R5cGVbMF0gPQotCQkgICAgKFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUKLQkJICAgICB8IChSRUxPQ19KTVBfU0xPVCA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSkpOwotCQl9Ci0JICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBlcmVsLT5yX2FkZGVuZCk7Ci0JICAgIH0KLQotCSAgKytzLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgbm90IGEgZHluYW1pYyBzeW1ib2wsIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcKLSAgICAgZWxzZS4gIFdlIG9ubHkgY2hlY2sgdGhpcyBhZnRlciBoYW5kbGluZyB0aGUgUExUIGVudHJ5LCBiZWNhdXNlCi0gICAgIHdlIGNhbiBoYXZlIGEgUExUIGVudHJ5IGZvciBhIG5vbmR5bmFtaWMgc3ltYm9sIHdoZW4gbGlua2luZyBQSUMKLSAgICAgY29tcGlsZWQgY29kZSBmcm9tIGEgcmVndWxhciBvYmplY3QuICAqLwotICBpZiAoaC0+ZHluaW5keCA8IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3dpdGNoIChoLT5yb290LnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICAvKiBBdm9pZCB2YXJpYWJsZSBub3QgaW5pdGlhbGl6ZWQgd2FybmluZ3MuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKLSAgICAgIHZhbCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHsKLQlhc2VjdGlvbiAqc2VjOwotCWFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQotCXNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCW91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQlCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotCQkgICAgfHwgb3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOwotCWlmIChoLT5wbHRfb2Zmc2V0ICE9IDAKLQkgICAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JICB7Ci0JICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKLQkgICAgdmFsID0gMDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfdGV4dHNlYyAob3V0cHV0X2JmZCkpCi0JICAgICAgdHlwZSA9IChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgPyBOX1RFWFQKLQkJICAgICAgOiBOX1dFQUtUKTsKLQkgICAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2RhdGFzZWMgKG91dHB1dF9iZmQpKQotCSAgICAgIHR5cGUgPSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgID8gTl9EQVRBCi0JCSAgICAgIDogTl9XRUFLRCk7Ci0JICAgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9ic3NzZWMgKG91dHB1dF9iZmQpKQotCSAgICAgIHR5cGUgPSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgID8gTl9CU1MKLQkJICAgICAgOiBOX1dFQUtCKTsKLQkgICAgZWxzZQotCSAgICAgIHR5cGUgPSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgID8gTl9BQlMKLQkJICAgICAgOiBOX1dFQUtBKTsKLQkgICAgdHlwZSB8PSBOX0VYVDsKLQkgICAgdmFsID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQotCQkgICArIG91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKLSAgICAgIHZhbCA9IGgtPnJvb3Qucm9vdC51LmMuc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICB0eXBlID0gTl9XRUFLVTsKLSAgICAgIHZhbCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3dhcm5pbmc6Ci0gICAgICAvKiBGSVhNRTogSWdub3JlIHRoZXNlIGZvciBub3cuICBUaGUgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaAotCSB0aGV5IHNob3VsZCBiZSB3cml0dGVuIG91dCBhcmUgbm90IGNsZWFyIHRvIG1lLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosICIuZHluc3ltIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIG91dHN5bSA9ICgoc3RydWN0IGV4dGVybmFsX25saXN0ICopCi0JICAgIChzLT5jb250ZW50cyArIGgtPmR5bmluZHggKiBFWFRFUk5BTF9OTElTVF9TSVpFKSk7Ci0KLSAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIHR5cGUsIG91dHN5bS0+ZV90eXBlKTsKLSAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIDAsIG91dHN5bS0+ZV9vdGhlcik7Ci0KLSAgLyogRklYTUU6IFRoZSBuYXRpdmUgbGlua2VyIGRvZXNuJ3QgdXNlIDAgZm9yIGRlc2MuICBJdCBzZWVtcyB0byB1c2UKLSAgICAgb25lIGxlc3MgdGhhbiB0aGUgZGVzYyB2YWx1ZSBpbiB0aGUgc2hhcmVkIGxpYnJhcnksIGFsdGhvdWdoIHRoYXQKLSAgICAgc2VlbXMgdW5saWtlbHkuICAqLwotICBiZmRfaF9wdXRfMTYgKG91dHB1dF9iZmQsIDAsIG91dHN5bS0+ZV9kZXNjKTsKLQotICBQVVRfV09SRCAob3V0cHV0X2JmZCwgaC0+ZHluc3RyX2luZGV4LCBvdXRzeW0tPmVfc3RyeCk7Ci0gIFBVVF9XT1JEIChvdXRwdXRfYmZkLCB2YWwsIG91dHN5bS0+ZV92YWx1ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIHJlbG9jIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgSWYgdGhpcwotICAgaXMgYSByZWxvYyB3aGljaCBhcmUgYXJlIGdvaW5nIHRvIGNvcHkgYXMgYSBkeW5hbWljIHJlbG9jLCB0aGVuCi0gICBjb3B5IGl0IG92ZXIsIGFuZCB0ZWxsIHRoZSBjYWxsZXIgdG8gbm90IGJvdGhlciBwcm9jZXNzaW5nIHRoaXMKLSAgIHJlbG9jLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYyAoaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBoYXJnLCByZWxvYywKLQkJCSAgIGNvbnRlbnRzLCBza2lwLCByZWxvY2F0aW9ucCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoYXJnOwotICAgICBQVFIgcmVsb2M7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50cyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBib29sZWFuICpza2lwOwotICAgICBiZmRfdm1hICpyZWxvY2F0aW9ucDsKLXsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0gIGJmZCAqZHlub2JqOwotICBib29sZWFuIGJhc2VyZWw7Ci0gIGJvb2xlYW4gam1wdGJsOwotICBib29sZWFuIHBjcmVsOwotICBhc2VjdGlvbiAqczsKLSAgYmZkX2J5dGUgKnA7Ci0gIGxvbmcgaW5keDsKLQotICAqc2tpcCA9IGZhbHNlOwotCi0gIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgaWYgKGggIT0gTlVMTAotICAgICAgJiYgaC0+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+X3Jhd19zaXplLCBlc2RsLmxkX3N5bWJfc2l6ZSk7Ci0KLSAgICAgIC8qIFRoZSBzaXplIG9mIHRoZSB0ZXh0IGFyZWEgaXMgdGhlIHNpemUgb2YgdGhlIC50ZXh0IHNlY3Rpb24KLQkgcm91bmRlZCB1cCB0byBhIHBhZ2UgYm91bmRhcnkuICBGSVhNRTogU2hvdWxkIHRoZSBwYWdlIHNpemUgYmUKLQkgY29uZGl0aW9uYWwgb24gc29tZXRoaW5nPyAgKi8KLSAgICAgIFBVVF9XT1JEIChkeW5vYmosCi0JCUJGRF9BTElHTiAob2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUsIDB4MjAwMCksCi0JCWVzZGwubGRfdGV4dCk7Ci0gIAotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZHluLT5vdXRwdXRfc2VjdGlvbiwgJmVzZGwsCi0JCQkJICAgICAgKHNkeW4tPm91dHB1dF9vZmZzZXQKLQkJCQkgICAgICAgKyBzaXplb2YgZXNkCi0JCQkJICAgICAgICsgRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUpLAotCQkJCSAgICAgIHNpemVvZiBlc2RsKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3N5bXMuYyBiL2JmZC9zeW1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NmYwNjcuLjAwMDAwMDAKLS0tIGEvYmZkL3N5bXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNzAgKzAsMCBAQAotLyogR2VuZXJpYyBzeW1ib2wtdGFibGUgc3VwcG9ydCBmb3IgdGhlIEJGRCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCVN5bWJvbHMKLQotCUJGRCB0cmllcyB0byBtYWludGFpbiBhcyBtdWNoIHN5bWJvbCBpbmZvcm1hdGlvbiBhcyBpdCBjYW4gd2hlbgotCWl0IG1vdmVzIGluZm9ybWF0aW9uIGZyb20gZmlsZSB0byBmaWxlLiBCRkQgcGFzc2VzIGluZm9ybWF0aW9uCi0JdG8gYXBwbGljYXRpb25zIHRob3VnaCB0aGUgPDxhc3ltYm9sPj4gc3RydWN0dXJlLiBXaGVuIHRoZQotCWFwcGxpY2F0aW9uIHJlcXVlc3RzIHRoZSBzeW1ib2wgdGFibGUsIEJGRCByZWFkcyB0aGUgdGFibGUgaW4KLQl0aGUgbmF0aXZlIGZvcm0gYW5kIHRyYW5zbGF0ZXMgcGFydHMgb2YgaXQgaW50byB0aGUgaW50ZXJuYWwKLQlmb3JtYXQuIFRvIG1haW50YWluIG1vcmUgdGhhbiB0aGUgaW5mb3JtYXRpb24gcGFzc2VkIHRvCi0JYXBwbGljYXRpb25zLCBzb21lIHRhcmdldHMga2VlcCBzb21lIGluZm9ybWF0aW9uIGBgYmVoaW5kIHRoZQotCXNjZW5lcycnIGluIGEgc3RydWN0dXJlIG9ubHkgdGhlIHBhcnRpY3VsYXIgYmFjayBlbmQga25vd3MKLQlhYm91dC4gRm9yIGV4YW1wbGUsIHRoZSBjb2ZmIGJhY2sgZW5kIGtlZXBzIHRoZSBvcmlnaW5hbAotCXN5bWJvbCB0YWJsZSBzdHJ1Y3R1cmUgYXMgd2VsbCBhcyB0aGUgY2Fub25pY2FsIHN0cnVjdHVyZSB3aGVuCi0JYSBCRkQgaXMgcmVhZCBpbi4gT24gb3V0cHV0LCB0aGUgY29mZiBiYWNrIGVuZCBjYW4gcmVjb25zdHJ1Y3QKLQl0aGUgb3V0cHV0IHN5bWJvbCB0YWJsZSBzbyB0aGF0IG5vIGluZm9ybWF0aW9uIGlzIGxvc3QsIGV2ZW4KLQlpbmZvcm1hdGlvbiB1bmlxdWUgdG8gY29mZiB3aGljaCBCRkQgZG9lc24ndCBrbm93IG9yCi0JdW5kZXJzdGFuZC4gSWYgYSBjb2ZmIHN5bWJvbCB0YWJsZSB3ZXJlIHJlYWQsIGJ1dCB3ZXJlIHdyaXR0ZW4KLQl0aHJvdWdoIGFuIGEub3V0IGJhY2sgZW5kLCBhbGwgdGhlIGNvZmYgc3BlY2lmaWMgaW5mb3JtYXRpb24KLQl3b3VsZCBiZSBsb3N0LiBUaGUgc3ltYm9sIHRhYmxlIG9mIGEgQkZECi0JaXMgbm90IG5lY2Vzc2FyaWx5IHJlYWQgaW4gdW50aWwgYSBjYW5vbmljYWxpemUgcmVxdWVzdCBpcwotCW1hZGUuIFRoZW4gdGhlIEJGRCBiYWNrIGVuZCBmaWxscyBpbiBhIHRhYmxlIHByb3ZpZGVkIGJ5IHRoZQotCWFwcGxpY2F0aW9uIHdpdGggcG9pbnRlcnMgdG8gdGhlIGNhbm9uaWNhbCBpbmZvcm1hdGlvbi4gIFRvCi0Jb3V0cHV0IHN5bWJvbHMsIHRoZSBhcHBsaWNhdGlvbiBwcm92aWRlcyBCRkQgd2l0aCBhIHRhYmxlIG9mCi0JcG9pbnRlcnMgdG8gcG9pbnRlcnMgdG8gPDxhc3ltYm9sPj5zLiBUaGlzIGFsbG93cyBhcHBsaWNhdGlvbnMKLQlsaWtlIHRoZSBsaW5rZXIgdG8gb3V0cHV0IGEgc3ltYm9sIGFzIGl0IHdhcyByZWFkLCBzaW5jZSB0aGUgYGBiZWhpbmQKLQl0aGUgc2NlbmVzJycgaW5mb3JtYXRpb24gd2lsbCBiZSBzdGlsbCBhdmFpbGFibGUuCi1AbWVudQotQCogUmVhZGluZyBTeW1ib2xzOjoKLUAqIFdyaXRpbmcgU3ltYm9sczo6Ci1AKiBNaW5pIFN5bWJvbHM6OgotQCogdHlwZWRlZiBhc3ltYm9sOjoKLUAqIHN5bWJvbCBoYW5kbGluZyBmdW5jdGlvbnM6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1SZWFkaW5nIFN5bWJvbHMsIFdyaXRpbmcgU3ltYm9scywgU3ltYm9scywgU3ltYm9scwotU1VCU0VDVElPTgotCVJlYWRpbmcgc3ltYm9scwotCi0JVGhlcmUgYXJlIHR3byBzdGFnZXMgdG8gcmVhZGluZyBhIHN5bWJvbCB0YWJsZSBmcm9tIGEgQkZEOgotCWFsbG9jYXRpbmcgc3RvcmFnZSwgYW5kIHRoZSBhY3R1YWwgcmVhZGluZyBwcm9jZXNzLiBUaGlzIGlzIGFuCi0JZXhjZXJwdCBmcm9tIGFuIGFwcGxpY2F0aW9uIHdoaWNoIHJlYWRzIHRoZSBzeW1ib2wgdGFibGU6Ci0KLXwJICBsb25nIHN0b3JhZ2VfbmVlZGVkOwotfAkgIGFzeW1ib2wgKipzeW1ib2xfdGFibGU7Ci18CSAgbG9uZyBudW1iZXJfb2Zfc3ltYm9sczsKLXwJICBsb25nIGk7Ci18Ci18CSAgc3RvcmFnZV9uZWVkZWQgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci18Ci18ICAgICAgICAgaWYgKHN0b3JhZ2VfbmVlZGVkIDwgMCkKLXwgICAgICAgICAgIEZBSUwKLXwKLXwJICBpZiAoc3RvcmFnZV9uZWVkZWQgPT0gMCkgewotfAkgICAgIHJldHVybiA7Ci18CSAgfQotfAkgIHN5bWJvbF90YWJsZSA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzdG9yYWdlX25lZWRlZCk7Ci18CSAgICAuLi4KLXwJICBudW1iZXJfb2Zfc3ltYm9scyA9Ci18CSAgICAgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIHN5bWJvbF90YWJsZSk7Ci18Ci18ICAgICAgICAgaWYgKG51bWJlcl9vZl9zeW1ib2xzIDwgMCkKLXwgICAgICAgICAgIEZBSUwKLXwKLXwJICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyX29mX3N5bWJvbHM7IGkrKykgewotfAkgICAgIHByb2Nlc3Nfc3ltYm9sIChzeW1ib2xfdGFibGVbaV0pOwotfAkgIH0KLQotCUFsbCBzdG9yYWdlIGZvciB0aGUgc3ltYm9scyB0aGVtc2VsdmVzIGlzIGluIGFuIG9iamFsbG9jCi0JY29ubmVjdGVkIHRvIHRoZSBCRkQ7IGl0IGlzIGZyZWVkIHdoZW4gdGhlIEJGRCBpcyBjbG9zZWQuCi0KLQotSU5PREUKLVdyaXRpbmcgU3ltYm9scywgTWluaSBTeW1ib2xzLCBSZWFkaW5nIFN5bWJvbHMsIFN5bWJvbHMKLVNVQlNFQ1RJT04KLQlXcml0aW5nIHN5bWJvbHMKLQotCVdyaXRpbmcgb2YgYSBzeW1ib2wgdGFibGUgaXMgYXV0b21hdGljIHdoZW4gYSBCRkQgb3BlbiBmb3IKLQl3cml0aW5nIGlzIGNsb3NlZC4gVGhlIGFwcGxpY2F0aW9uIGF0dGFjaGVzIGEgdmVjdG9yIG9mCi0JcG9pbnRlcnMgdG8gcG9pbnRlcnMgdG8gc3ltYm9scyB0byB0aGUgQkZEIGJlaW5nIHdyaXR0ZW4sIGFuZAotCWZpbGxzIGluIHRoZSBzeW1ib2wgY291bnQuIFRoZSBjbG9zZSBhbmQgY2xlYW51cCBjb2RlIHJlYWRzCi0JdGhyb3VnaCB0aGUgdGFibGUgcHJvdmlkZWQgYW5kIHBlcmZvcm1zIGFsbCB0aGUgbmVjZXNzYXJ5Ci0Jb3BlcmF0aW9ucy4gVGhlIEJGRCBvdXRwdXQgY29kZSBtdXN0IGFsd2F5cyBiZSBwcm92aWRlZCB3aXRoIGFuCi0JYGBvd25lZCcnIHN5bWJvbDogb25lIHdoaWNoIGhhcyBjb21lIGZyb20gYW5vdGhlciBCRkQsIG9yIG9uZQotCXdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgdXNpbmcgPDxiZmRfbWFrZV9lbXB0eV9zeW1ib2w+Pi4gIEhlcmUgaXMgYW4KLQlleGFtcGxlIHNob3dpbmcgdGhlIGNyZWF0aW9uIG9mIGEgc3ltYm9sIHRhYmxlIHdpdGggb25seSBvbmUgZWxlbWVudDoKLQotfAkjaW5jbHVkZSAiYmZkLmgiCi18CW1haW4oKQotfAl7Ci18CSAgYmZkICphYmZkOwotfAkgIGFzeW1ib2wgKnB0cnNbMl07Ci18CSAgYXN5bWJvbCAqbmV3OwotfAotfAkgIGFiZmQgPSBiZmRfb3BlbncoImZvbyIsImEub3V0LXN1bm9zLWJpZyIpOwotfAkgIGJmZF9zZXRfZm9ybWF0KGFiZmQsIGJmZF9vYmplY3QpOwotfAkgIG5ldyA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKTsKLXwJICBuZXctPm5hbWUgPSAiZHVtbXlfc3ltYm9sIjsKLXwJICBuZXctPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkoYWJmZCwgIi50ZXh0Iik7Ci18CSAgbmV3LT5mbGFncyA9IEJTRl9HTE9CQUw7Ci18CSAgbmV3LT52YWx1ZSA9IDB4MTIzNDU7Ci18Ci18CSAgcHRyc1swXSA9IG5ldzsKLXwJICBwdHJzWzFdID0gKGFzeW1ib2wgKikwOwotfAotfAkgIGJmZF9zZXRfc3ltdGFiKGFiZmQsIHB0cnMsIDEpOwotfAkgIGJmZF9jbG9zZShhYmZkKTsKLXwJfQotfAotfAkuL21ha2VzeW0KLXwJbm0gZm9vCi18CTAwMDEyMzQ1IEEgZHVtbXlfc3ltYm9sCi0KLQlNYW55IGZvcm1hdHMgY2Fubm90IHJlcHJlc2VudCBhcmJpdGFyeSBzeW1ib2wgaW5mb3JtYXRpb247IGZvcgotIAlpbnN0YW5jZSwgdGhlIDw8YS5vdXQ+PiBvYmplY3QgZm9ybWF0IGRvZXMgbm90IGFsbG93IGFuCi0JYXJiaXRhcnkgbnVtYmVyIG9mIHNlY3Rpb25zLiBBIHN5bWJvbCBwb2ludGluZyB0byBhIHNlY3Rpb24KLQl3aGljaCBpcyBub3Qgb25lICBvZiA8PC50ZXh0Pj4sIDw8LmRhdGE+PiBvciA8PC5ic3M+PiBjYW5ub3QKLQliZSBkZXNjcmliZWQuCi0KLUlOT0RFCi1NaW5pIFN5bWJvbHMsIHR5cGVkZWYgYXN5bWJvbCwgV3JpdGluZyBTeW1ib2xzLCBTeW1ib2xzCi1TVUJTRUNUSU9OCi0JTWluaSBTeW1ib2xzCi0KLQlNaW5pIHN5bWJvbHMgcHJvdmlkZSByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSBzeW1ib2wgdGFibGUuCi0JVGhleSB1c2UgbGVzcyBtZW1vcnkgc3BhY2UsIGJ1dCByZXF1aXJlIG1vcmUgdGltZSB0byBhY2Nlc3MuCi0JVGhleSBjYW4gYmUgdXNlZnVsIGZvciB0b29scyBsaWtlIG5tIG9yIG9iamR1bXAsIHdoaWNoIG1heQotCWhhdmUgdG8gaGFuZGxlIHN5bWJvbCB0YWJsZXMgb2YgZXh0cmVtZWx5IGxhcmdlIGV4ZWN1dGFibGVzLgotCi0JVGhlIDw8YmZkX3JlYWRfbWluaXN5bWJvbHM+PiBmdW5jdGlvbiB3aWxsIHJlYWQgdGhlIHN5bWJvbHMKLQlpbnRvIG1lbW9yeSBpbiBhbiBpbnRlcm5hbCBmb3JtLiAgSXQgd2lsbCByZXR1cm4gYSA8PHZvaWQgKj4+Ci0JcG9pbnRlciB0byBhIGJsb2NrIG9mIG1lbW9yeSwgYSBzeW1ib2wgY291bnQsIGFuZCB0aGUgc2l6ZSBvZgotCWVhY2ggc3ltYm9sLiAgVGhlIHBvaW50ZXIgaXMgYWxsb2NhdGVkIHVzaW5nIDw8bWFsbG9jPj4sIGFuZAotCXNob3VsZCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQotCVRoZSBmdW5jdGlvbiA8PGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbD4+IHdpbGwgdGFrZSBhIHBvaW50ZXIKLQl0byBhIG1pbmlzeW1ib2wsIGFuZCBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkKLQk8PGJmZF9tYWtlX2VtcHR5X3N5bWJvbD4+LCBhbmQgcmV0dXJuIGEgPDxhc3ltYm9sPj4gc3RydWN0dXJlLgotCVRoZSByZXR1cm4gdmFsdWUgbWF5IG9yIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIHZhbHVlIGZyb20KLQk8PGJmZF9tYWtlX2VtcHR5X3N5bWJvbD4+IHdoaWNoIHdhcyBwYXNzZWQgaW4uCi0KLSovCi0KLQotCi0vKgotRE9DREQKLUlOT0RFCi10eXBlZGVmIGFzeW1ib2wsIHN5bWJvbCBoYW5kbGluZyBmdW5jdGlvbnMsIE1pbmkgU3ltYm9scywgU3ltYm9scwotCi0qLwotLyoKLVNVQlNFQ1RJT04KLQl0eXBlZGVmIGFzeW1ib2wKLQotCUFuIDw8YXN5bWJvbD4+IGhhcyB0aGUgZm9ybToKLQotKi8KLQotLyoKLUNPREVfRlJBR01FTlQKLQotLgotLnR5cGVkZWYgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeQotLnsKLS4JeyogQSBwb2ludGVyIHRvIHRoZSBCRkQgd2hpY2ggb3ducyB0aGUgc3ltYm9sLiBUaGlzIGluZm9ybWF0aW9uCi0uCSAgIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IGEgYmFjayBlbmQgY2FuIHdvcmsgb3V0IHdoYXQgYWRkaXRpb25hbAotLiAgIAkgICBpbmZvcm1hdGlvbiAoaW52aXNpYmxlIHRvIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIpIGlzIGNhcnJpZWQKLS4JICAgd2l0aCB0aGUgc3ltYm9sLgotLgotLgkgICBUaGlzIGZpZWxkIGlzICphbG1vc3QqIHJlZHVuZGFudCwgc2luY2UgeW91IGNhbiB1c2Ugc2VjdGlvbi0+b3duZXIKLS4JICAgaW5zdGVhZCwgZXhjZXB0IHRoYXQgc29tZSBzeW1ib2xzIHBvaW50IHRvIHRoZSBnbG9iYWwgc2VjdGlvbnMKLS4JICAgYmZkX3thYnMsY29tLHVuZH1fc2VjdGlvbi4gIFRoaXMgY291bGQgYmUgZml4ZWQgYnkgbWFraW5nCi0uCSAgIHRoZXNlIGdsb2JhbHMgYmUgcGVyLWJmZCAob3IgcGVyLXRhcmdldC1mbGF2b3IpLiAgRklYTUUuICp9Ci0uCi0uICBzdHJ1Y3QgX2JmZCAqdGhlX2JmZDsgeyogVXNlIGJmZF9hc3ltYm9sX2JmZChzeW0pIHRvIGFjY2VzcyB0aGlzIGZpZWxkLiAqfQotLgotLgl7KiBUaGUgdGV4dCBvZiB0aGUgc3ltYm9sLiBUaGUgbmFtZSBpcyBsZWZ0IGFsb25lLCBhbmQgbm90IGNvcGllZDsgdGhlCi0uCSAgIGFwcGxpY2F0aW9uIG1heSBub3QgYWx0ZXIgaXQuICp9Ci0uICBDT05TVCBjaGFyICpuYW1lOwotLgotLgl7KiBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFRoaXMgcmVhbGx5IHNob3VsZCBiZSBhIHVuaW9uIG9mIGEKLS4gICAgICAgICAgbnVtZXJpYyB2YWx1ZSB3aXRoIGEgcG9pbnRlciwgc2luY2Ugc29tZSBmbGFncyBpbmRpY2F0ZSB0aGF0Ci0uICAgICAgICAgIGEgcG9pbnRlciB0byBhbm90aGVyIHN5bWJvbCBpcyBzdG9yZWQgaGVyZS4gICp9Ci0uICBzeW12YWx1ZSB2YWx1ZTsKLS4KLS4JeyogQXR0cmlidXRlcyBvZiBhIHN5bWJvbDogKn0KLS4KLS4jZGVmaW5lIEJTRl9OT19GTEFHUyAgICAweDAwCi0uCi0uCXsqIFRoZSBzeW1ib2wgaGFzIGxvY2FsIHNjb3BlOyA8PHN0YXRpYz4+IGluIDw8Qz4+LiBUaGUgdmFsdWUKLS4gCSAgIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKn0KLS4jZGVmaW5lIEJTRl9MT0NBTAkweDAxCi0uCi0uCXsqIFRoZSBzeW1ib2wgaGFzIGdsb2JhbCBzY29wZTsgaW5pdGlhbGl6ZWQgZGF0YSBpbiA8PEM+Pi4gVGhlCi0uCSAgIHZhbHVlIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKn0KLS4jZGVmaW5lIEJTRl9HTE9CQUwJMHgwMgotLgotLgl7KiBUaGUgc3ltYm9sIGhhcyBnbG9iYWwgc2NvcGUgYW5kIGlzIGV4cG9ydGVkLiBUaGUgdmFsdWUgaXMKLS4JICAgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqfQotLiNkZWZpbmUgQlNGX0VYUE9SVAlCU0ZfR0xPQkFMIHsqIG5vIHJlYWwgZGlmZmVyZW5jZSAqfQotLgotLgl7KiBBIG5vcm1hbCBDIHN5bWJvbCB3b3VsZCBiZSBvbmUgb2Y6Ci0uCSAgIDw8QlNGX0xPQ0FMPj4sIDw8QlNGX0ZPUlRfQ09NTT4+LCAgPDxCU0ZfVU5ERUZJTkVEPj4gb3IKLS4JICAgPDxCU0ZfR0xPQkFMPj4gKn0KLS4KLS4JeyogVGhlIHN5bWJvbCBpcyBhIGRlYnVnZ2luZyByZWNvcmQuIFRoZSB2YWx1ZSBoYXMgYW4gYXJiaXRhcnkKLS4JICAgbWVhbmluZywgdW5sZXNzIEJTRl9ERUJVR0dJTkdfUkVMT0MgaXMgYWxzbyBzZXQuICAqfQotLiNkZWZpbmUgQlNGX0RFQlVHR0lORwkweDA4Ci0uCi0uCXsqIFRoZSBzeW1ib2wgZGVub3RlcyBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50LiAgVXNlZCBpbiBFTEYsCi0uCSAgIHBlcmhhcHMgb3RoZXJzIHNvbWVkYXkuICAqfQotLiNkZWZpbmUgQlNGX0ZVTkNUSU9OICAgIDB4MTAKLS4KLS4JeyogVXNlZCBieSB0aGUgbGlua2VyLiAqfQotLiNkZWZpbmUgQlNGX0tFRVAgICAgICAgIDB4MjAKLS4jZGVmaW5lIEJTRl9LRUVQX0cgICAgICAweDQwCi0uCi0uCXsqIEEgd2VhayBnbG9iYWwgc3ltYm9sLCBvdmVycmlkYWJsZSB3aXRob3V0IHdhcm5pbmdzIGJ5Ci0uCSAgIGEgcmVndWxhciBnbG9iYWwgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUuICAqfQotLiNkZWZpbmUgQlNGX1dFQUsgICAgICAgIDB4ODAKLS4KLS4gICAgICAgeyogVGhpcyBzeW1ib2wgd2FzIGNyZWF0ZWQgdG8gcG9pbnQgdG8gYSBzZWN0aW9uLCBlLmcuIEVMRidzCi0uCSAgIFNUVF9TRUNUSU9OIHN5bWJvbHMuICAqfQotLiNkZWZpbmUgQlNGX1NFQ1RJT05fU1lNIDB4MTAwCi0uCi0uCXsqIFRoZSBzeW1ib2wgdXNlZCB0byBiZSBhIGNvbW1vbiBzeW1ib2wsIGJ1dCBub3cgaXQgaXMKLS4JICAgYWxsb2NhdGVkLiAqfQotLiNkZWZpbmUgQlNGX09MRF9DT01NT04gIDB4MjAwCi0uCi0uCXsqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBjb21tb24gZGF0YS4gKn0KLS4jZGVmaW5lIEJGRF9GT1JUX0NPTU1fREVGQVVMVF9WQUxVRSAwCi0uCi0uCXsqIEluIHNvbWUgZmlsZXMgdGhlIHR5cGUgb2YgYSBzeW1ib2wgc29tZXRpbWVzIGFsdGVycyBpdHMKLS4JICAgbG9jYXRpb24gaW4gYW4gb3V0cHV0IGZpbGUgLSBpZSBpbiBjb2ZmIGEgPDxJU0ZDTj4+IHN5bWJvbAotLgkgICB3aGljaCBpcyBhbHNvIDw8Q19FWFQ+PiBzeW1ib2wgYXBwZWFycyB3aGVyZSBpdCB3YXMKLS4JICAgZGVjbGFyZWQgYW5kIG5vdCBhdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gIFRoaXMgYml0IGlzIHNldAotLiAgCSAgIGJ5IHRoZSB0YXJnZXQgQkZEIHBhcnQgdG8gY29udmV5IHRoaXMgaW5mb3JtYXRpb24uICp9Ci0uCi0uI2RlZmluZSBCU0ZfTk9UX0FUX0VORCAgICAweDQwMAotLgotLgl7KiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIHRoZSBsYWJlbCBvZiBjb25zdHJ1Y3RvciBzZWN0aW9uLiAqfQotLiNkZWZpbmUgQlNGX0NPTlNUUlVDVE9SICAgMHg4MDAKLS4KLS4JeyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBhIHdhcm5pbmcgc3ltYm9sLiAgVGhlIG5hbWUgaXMgYQotLgkgICB3YXJuaW5nLiAgVGhlIG5hbWUgb2YgdGhlIG5leHQgc3ltYm9sIGlzIHRoZSBvbmUgdG8gd2FybiBhYm91dDsKLS4JICAgaWYgYSByZWZlcmVuY2UgaXMgbWFkZSB0byBhIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG5leHQKLS4JICAgc3ltYm9sLCBhIHdhcm5pbmcgaXMgaXNzdWVkIGJ5IHRoZSBsaW5rZXIuICp9Ci0uI2RlZmluZSBCU0ZfV0FSTklORyAgICAgICAweDEwMDAKLS4KLS4JeyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBpbmRpcmVjdC4gIFRoaXMgc3ltYm9sIGlzIGFuIGluZGlyZWN0Ci0uCSAgIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG5leHQgc3ltYm9sLiAqfQotLiNkZWZpbmUgQlNGX0lORElSRUNUICAgICAgMHgyMDAwCi0uCi0uCXsqIEJTRl9GSUxFIG1hcmtzIHN5bWJvbHMgdGhhdCBjb250YWluIGEgZmlsZSBuYW1lLiAgVGhpcyBpcyB1c2VkCi0uCSAgIGZvciBFTEYgU1RUX0ZJTEUgc3ltYm9scy4gICp9Ci0uI2RlZmluZSBCU0ZfRklMRSAgICAgICAgICAweDQwMDAKLS4KLS4JeyogU3ltYm9sIGlzIGZyb20gZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKn0KLS4jZGVmaW5lIEJTRl9EWU5BTUlDCSAgIDB4ODAwMAotLgotLiAgICAgICB7KiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBkYXRhIG9iamVjdC4gIFVzZWQgaW4gRUxGLCBhbmQgcGVyaGFwcwotLiAgICAgICAgICBvdGhlcnMgc29tZWRheS4gICp9Ci0uI2RlZmluZSBCU0ZfT0JKRUNUCSAgIDB4MTAwMDAKLS4KLS4gICAgICAgeyogVGhpcyBzeW1ib2wgaXMgYSBkZWJ1Z2dpbmcgc3ltYm9sLiAgVGhlIHZhbHVlIGlzIHRoZSBvZmZzZXQKLS4gICAgICAgICAgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gIEJTRl9ERUJVR0dJTkcgc2hvdWxkIGJlIHNldAotLiAgICAgICAgICBhcyB3ZWxsLiAgKn0KLS4jZGVmaW5lIEJTRl9ERUJVR0dJTkdfUkVMT0MgMHgyMDAwMAotLgotLiAgZmxhZ3dvcmQgZmxhZ3M7Ci0uCi0uCXsqIEEgcG9pbnRlciB0byB0aGUgc2VjdGlvbiB0byB3aGljaCB0aGlzIHN5bWJvbCBpcwotLgkgICByZWxhdGl2ZS4gIFRoaXMgd2lsbCBhbHdheXMgYmUgbm9uIE5VTEwsIHRoZXJlIGFyZSBzcGVjaWFsCi0uICAgICAgICAgIHNlY3Rpb25zIGZvciB1bmRlZmluZWQgYW5kIGFic29sdXRlIHN5bWJvbHMuICAqfQotLiAgc3RydWN0IHNlYyAqc2VjdGlvbjsKLS4KLS4JeyogQmFjayBlbmQgc3BlY2lhbCBkYXRhLiAgKn0KLS4gIHVuaW9uCi0uICAgIHsKLS4gICAgICBQVFIgcDsKLS4gICAgICBiZmRfdm1hIGk7Ci0uICAgIH0gdWRhdGE7Ci0uCi0ufSBhc3ltYm9sOwotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLXN0YXRpYyBjaGFyIGNvZmZfc2VjdGlvbl90eXBlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKgotRE9DREQKLUlOT0RFCi1zeW1ib2wgaGFuZGxpbmcgZnVuY3Rpb25zLCAgLCB0eXBlZGVmIGFzeW1ib2wsIFN5bWJvbHMKLVNVQlNFQ1RJT04KLQlTeW1ib2wgaGFuZGxpbmcgZnVuY3Rpb25zCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIGEgdmVjdG9yIG9mIHBvaW50ZXJzCi0JdG8gPDxhc3ltYm9scz4+IGZvciBhbGwgdGhlIHN5bWJvbHMgaW4gdGhlIEJGRCBAdmFye2FiZmR9LAotCWluY2x1ZGluZyBhIHRlcm1pbmFsIE5VTEwgcG9pbnRlci4gSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMgaW4KLQl0aGUgQkZELCB0aGVuIHJldHVybiAwLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gLTEuCi0KLS4jZGVmaW5lIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKGFiZmQpIFwKLS4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIChhYmZkKSkKLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2lzX2xvY2FsX2xhYmVsCi0KLVNZTk9QU0lTCi0gICAgICAgIGJvb2xlYW4gYmZkX2lzX2xvY2FsX2xhYmVsKGJmZCAqYWJmZCwgYXN5bWJvbCAqc3ltKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3ltYm9sIEB2YXJ7c3ltfSBpbiB0aGUgQkZEIEB2YXJ7YWJmZH0gaXMKLQlhIGNvbXBpbGVyIGdlbmVyYXRlZCBsb2NhbCBsYWJlbCwgZWxzZSByZXR1cm4gZmFsc2UuCi0qLwotCi1ib29sZWFuCi1iZmRfaXNfbG9jYWxfbGFiZWwgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX1dFQUspKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHN5bS0+bmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBzeW0tPm5hbWUpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotCi1TWU5PUFNJUwotICAgICAgICBib29sZWFuIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lKGJmZCAqYWJmZCwgY29uc3QgY2hhciAqbmFtZSk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRydWUgaWYgYSBzeW1ib2wgd2l0aCB0aGUgbmFtZSBAdmFye25hbWV9IGluIHRoZSBCRkQKLQlAdmFye2FiZmR9IGlzIGEgY29tcGlsZXIgZ2VuZXJhdGVkIGxvY2FsIGxhYmVsLCBlbHNlIHJldHVybgotCWZhbHNlLiAgVGhpcyBqdXN0IGNoZWNrcyB3aGV0aGVyIHRoZSBuYW1lIGhhcyB0aGUgZm9ybSBvZiBhCi0JbG9jYWwgbGFiZWwuCi0KLS4jZGVmaW5lIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lKGFiZmQsIG5hbWUpIFwKLS4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUsIChhYmZkLCBuYW1lKSkKLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiCi0KLURFU0NSSVBUSU9OCi0JUmVhZCB0aGUgc3ltYm9scyBmcm9tIHRoZSBCRkQgQHZhcnthYmZkfSwgYW5kIGZpbGxzIGluCi0JdGhlIHZlY3RvciBAdmFye2xvY2F0aW9ufSB3aXRoIHBvaW50ZXJzIHRvIHRoZSBzeW1ib2xzIGFuZAotCWEgdHJhaWxpbmcgTlVMTC4KLQlSZXR1cm4gdGhlIGFjdHVhbCBudW1iZXIgb2Ygc3ltYm9sIHBvaW50ZXJzLCBub3QKLQlpbmNsdWRpbmcgdGhlIE5VTEwuCi0KLQotLiNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIoYWJmZCwgbG9jYXRpb24pIFwKLS4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIsXAotLiAgICAgICAgICAgICAgICAgIChhYmZkLCBsb2NhdGlvbikpCi0KLSovCi0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9zeW10YWIKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfc3ltdGFiIChiZmQgKmFiZmQsIGFzeW1ib2wgKipsb2NhdGlvbiwgdW5zaWduZWQgaW50IGNvdW50KTsKLQotREVTQ1JJUFRJT04KLQlBcnJhbmdlIHRoYXQgd2hlbiB0aGUgb3V0cHV0IEJGRCBAdmFye2FiZmR9IGlzIGNsb3NlZCwKLQl0aGUgdGFibGUgQHZhcntsb2NhdGlvbn0gb2YgQHZhcntjb3VudH0gcG9pbnRlcnMgdG8gc3ltYm9scwotCXdpbGwgYmUgd3JpdHRlbi4KLSovCi0KLWJvb2xlYW4KLWJmZF9zZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbiwgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmxvY2F0aW9uOwotICAgICB1bnNpZ25lZCBpbnQgc3ltY291bnQ7Ci17Ci0gIGlmICgoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpIHx8IChiZmRfcmVhZF9wIChhYmZkKSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSA9IGxvY2F0aW9uOwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IHN5bWNvdW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3ByaW50X3N5bWJvbF92YW5kZgotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3ByaW50X3N5bWJvbF92YW5kZihQVFIgZmlsZSwgYXN5bWJvbCAqc3ltYm9sKTsKLQotREVTQ1JJUFRJT04KLQlQcmludCB0aGUgdmFsdWUgYW5kIGZsYWdzIG9mIHRoZSBAdmFye3N5bWJvbH0gc3VwcGxpZWQgdG8gdGhlCi0Jc3RyZWFtIEB2YXJ7ZmlsZX0uCi0qLwotdm9pZAotYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoYXJnLCBzeW1ib2wpCi0gICAgIFBUUiBhcmc7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFyZzsKLSAgZmxhZ3dvcmQgdHlwZSA9IHN5bWJvbC0+ZmxhZ3M7Ci0gIGlmIChzeW1ib2wtPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIHN5bWJvbC0+dmFsdWUgKyBzeW1ib2wtPnNlY3Rpb24tPnZtYSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIHN5bWJvbC0+dmFsdWUpOwotICAgIH0KLQotICAvKiBUaGlzIHByZXN1bWVzIHRoYXQgYSBzeW1ib2wgY2FuIG5vdCBiZSBib3RoIEJTRl9ERUJVR0dJTkcgYW5kCi0gICAgIEJTRl9EWU5BTUlDLCBub3IgbW9yZSB0aGFuIG9uZSBvZiBCU0ZfRlVOQ1RJT04sIEJTRl9GSUxFLCBhbmQKLSAgICAgQlNGX09CSkVDVC4gICovCi0gIGZwcmludGYgKGZpbGUsICIgJWMlYyVjJWMlYyVjJWMiLAotCSAgICgodHlwZSAmIEJTRl9MT0NBTCkKLQkgICAgPyAodHlwZSAmIEJTRl9HTE9CQUwpID8gJyEnIDogJ2wnCi0JICAgIDogKHR5cGUgJiBCU0ZfR0xPQkFMKSA/ICdnJyA6ICcgJyksCi0JICAgKHR5cGUgJiBCU0ZfV0VBSykgPyAndycgOiAnICcsCi0JICAgKHR5cGUgJiBCU0ZfQ09OU1RSVUNUT1IpID8gJ0MnIDogJyAnLAotCSAgICh0eXBlICYgQlNGX1dBUk5JTkcpID8gJ1cnIDogJyAnLAotCSAgICh0eXBlICYgQlNGX0lORElSRUNUKSA/ICdJJyA6ICcgJywKLQkgICAodHlwZSAmIEJTRl9ERUJVR0dJTkcpID8gJ2QnIDogKHR5cGUgJiBCU0ZfRFlOQU1JQykgPyAnRCcgOiAnICcsCi0JICAgKCh0eXBlICYgQlNGX0ZVTkNUSU9OKQotCSAgICA/ICdGJwotCSAgICA6ICgodHlwZSAmIEJTRl9GSUxFKQotCSAgICAgICA/ICdmJwotCSAgICAgICA6ICgodHlwZSAmIEJTRl9PQkpFQ1QpID8gJ08nIDogJyAnKSkpKTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfbWFrZV9lbXB0eV9zeW1ib2wKLQotREVTQ1JJUFRJT04KLQlDcmVhdGUgYSBuZXcgPDxhc3ltYm9sPj4gc3RydWN0dXJlIGZvciB0aGUgQkZEIEB2YXJ7YWJmZH0KLQlhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4KLQotCVRoaXMgcm91dGluZSBpcyBuZWNlc3NhcnkgYmVjYXVzZSBlYWNoIGJhY2sgZW5kIGhhcyBwcml2YXRlCi0JaW5mb3JtYXRpb24gc3Vycm91bmRpbmcgdGhlIDw8YXN5bWJvbD4+LiBCdWlsZGluZyB5b3VyIG93bgotCTw8YXN5bWJvbD4+IGFuZCBwb2ludGluZyB0byBpdCB3aWxsIG5vdCBjcmVhdGUgdGhlIHByaXZhdGUKLQlpbmZvcm1hdGlvbiwgYW5kIHdpbGwgY2F1c2UgcHJvYmxlbXMgbGF0ZXIgb24uCi0KLS4jZGVmaW5lIGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9tYWtlX2VtcHR5X3N5bWJvbCwgKGFiZmQpKQotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2VfZGVidWdfc3ltYm9sCi0KLURFU0NSSVBUSU9OCi0JQ3JlYXRlIGEgbmV3IDw8YXN5bWJvbD4+IHN0cnVjdHVyZSBmb3IgdGhlIEJGRCBAdmFye2FiZmR9LAotCXRvIGJlIHVzZWQgYXMgYSBkZWJ1Z2dpbmcgc3ltYm9sLiAgRnVydGhlciBkZXRhaWxzIG9mIGl0cyB1c2UgaGF2ZQotCXlldCB0byBiZSB3b3JrZWQgb3V0LgotCi0uI2RlZmluZSBiZmRfbWFrZV9kZWJ1Z19zeW1ib2woYWJmZCxwdHIsc2l6ZSkgXAotLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wsIChhYmZkLCBwdHIsIHNpemUpKQotKi8KLQotc3RydWN0IHNlY3Rpb25fdG9fdHlwZQotewotICBDT05TVCBjaGFyICpzZWN0aW9uOwotICBjaGFyIHR5cGU7Ci19OwotCi0vKiBNYXAgc2VjdGlvbiBuYW1lcyB0byBQT1NJWC9CU0Qgc2luZ2xlLWNoYXJhY3RlciBzeW1ib2wgdHlwZXMuCi0gICBUaGlzIHRhYmxlIGlzIHByb2JhYmx5IGluY29tcGxldGUuICBJdCBpcyBzb3J0ZWQgZm9yIGNvbnZlbmllbmNlIG9mCi0gICBhZGRpbmcgZW50cmllcy4gIFNpbmNlIGl0IGlzIHNvIHNob3J0LCBhIGxpbmVhciBzZWFyY2ggaXMgdXNlZC4gICovCi1zdGF0aWMgQ09OU1Qgc3RydWN0IHNlY3Rpb25fdG9fdHlwZSBzdHRbXSA9Ci17Ci0gIHsiKkRFQlVHKiIsICdOJ30sCi0gIHsiLmJzcyIsICdiJ30sCi0gIHsiemVyb3ZhcnMiLCAnYid9LAkJLyogTVJJIC5ic3MgKi8KLSAgeyIuZGF0YSIsICdkJ30sCi0gIHsidmFycyIsICdkJ30sCQkvKiBNUkkgLmRhdGEgKi8KLSAgeyIucmRhdGEiLCAncid9LAkJLyogUmVhZCBvbmx5IGRhdGEuICAqLwotICB7Ii5yb2RhdGEiLCAncid9LAkJLyogUmVhZCBvbmx5IGRhdGEuICAqLwotICB7Ii5zYnNzIiwgJ3MnfSwJCS8qIFNtYWxsIEJTUyAodW5pbml0aWFsaXplZCBkYXRhKS4gICovCi0gIHsiLnNjb21tb24iLCAnYyd9LAkJLyogU21hbGwgY29tbW9uLiAgKi8KLSAgeyIuc2RhdGEiLCAnZyd9LAkJLyogU21hbGwgaW5pdGlhbGl6ZWQgZGF0YS4gICovCi0gIHsiLnRleHQiLCAndCd9LAotICB7ImNvZGUiLCAndCd9LAkJLyogTVJJIC50ZXh0ICovCi0gIHsiLmRyZWN0dmUiLCAnaSd9LCAgICAgICAgICAgIC8qIE1TVkMncyAuZHJlY3RpdmUgc2VjdGlvbiAqLwotICB7Ii5pZGF0YSIsICdpJ30sICAgICAgICAgICAgICAvKiBNU1ZDJ3MgLmlkYXRhIChpbXBvcnQpIHNlY3Rpb24gKi8KLSAgeyIuZWRhdGEiLCAnZSd9LCAgICAgICAgICAgICAgLyogTVNWQydzIC5lZGF0YSAoZXhwb3J0KSBzZWN0aW9uICovCi0gIHsiLnBkYXRhIiwgJ3AnfSwgICAgICAgICAgICAgIC8qIE1TVkMncyAucGRhdGEgKHN0YWNrIHVud2luZCkgc2VjdGlvbiAqLwotICB7Ii5kZWJ1ZyIsICdOJ30sICAgICAgICAgICAgICAvKiBNU1ZDJ3MgLmRlYnVnIChub24tc3RhbmRhcmQgZGVidWcgc3ltcykgKi8KLSAgezAsIDB9Ci19OwotCi0vKiBSZXR1cm4gdGhlIHNpbmdsZS1jaGFyYWN0ZXIgc3ltYm9sIHR5cGUgY29ycmVzcG9uZGluZyB0bwotICAgc2VjdGlvbiBTLCBvciAnPycgZm9yIGFuIHVua25vd24gQ09GRiBzZWN0aW9uLiAgCi0KLSAgIENoZWNrIGZvciBhbnkgbGVhZGluZyBzdHJpbmcgd2hpY2ggbWF0Y2hlcywgc28gLnRleHQ1IHJldHVybnMKLSAgICd0JyBhcyB3ZWxsIGFzIC50ZXh0ICovCi0KLXN0YXRpYyBjaGFyCi1jb2ZmX3NlY3Rpb25fdHlwZSAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgQ09OU1Qgc3RydWN0IHNlY3Rpb25fdG9fdHlwZSAqdDsKLQotICBmb3IgKHQgPSAmc3R0WzBdOyB0LT5zZWN0aW9uOyB0KyspIAotICAgIGlmICghc3RybmNtcCAocywgdC0+c2VjdGlvbiwgc3RybGVuICh0LT5zZWN0aW9uKSkpCi0gICAgICByZXR1cm4gdC0+dHlwZTsKLQotICByZXR1cm4gJz8nOwotfQotCi0jaWZuZGVmIGlzbG93ZXIKLSNkZWZpbmUgaXNsb3dlcihjKSAoKGMpID49ICdhJyAmJiAoYykgPD0gJ3onKQotI2VuZGlmCi0jaWZuZGVmIHRvdXBwZXIKLSNkZWZpbmUgdG91cHBlcihjKSAoaXNsb3dlcihjKSA/ICgoYykgJiB+MHgyMCkgOiAoYykpCi0jZW5kaWYKLQotLyoKLUZVTkNUSU9OCi0JYmZkX2RlY29kZV9zeW1jbGFzcwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIGNoYXJhY3RlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzeW1ib2wKLQljbGFzcyBvZiBAdmFye3N5bWJvbH0sIG9yICc/JyBmb3IgYW4gdW5rbm93biBjbGFzcy4KLQotU1lOT1BTSVMKLQlpbnQgYmZkX2RlY29kZV9zeW1jbGFzcyhhc3ltYm9sICpzeW1ib2wpOwotKi8KLWludAotYmZkX2RlY29kZV9zeW1jbGFzcyAoc3ltYm9sKQotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIGNoYXIgYzsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldHVybiAnQyc7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykKLQlyZXR1cm4gJ3cnOwotICAgICAgZWxzZQotCXJldHVybiAnVSc7Ci0gICAgfQotICBpZiAoYmZkX2lzX2luZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldHVybiAnSSc7Ci0gIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspCi0gICAgcmV0dXJuICdXJzsKLSAgaWYgKCEoc3ltYm9sLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX0xPQ0FMKSkpCi0gICAgcmV0dXJuICc/JzsKLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIGMgPSAnYSc7Ci0gIGVsc2UgaWYgKHN5bWJvbC0+c2VjdGlvbikKLSAgICBjID0gY29mZl9zZWN0aW9uX3R5cGUgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gJz8nOwotICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9HTE9CQUwpCi0gICAgYyA9IHRvdXBwZXIgKGMpOwotICByZXR1cm4gYzsKLQotICAvKiBXZSBkb24ndCBoYXZlIHRvIGhhbmRsZSB0aGVzZSBjYXNlcyBqdXN0IHlldCwgYnV0IHdlIHdpbGwgc29vbjoKLSAgICAgTl9TRVRWOiAndic7Ci0gICAgIE5fU0VUQTogJ2wnOwotICAgICBOX1NFVFQ6ICd4JzsKLSAgICAgTl9TRVREOiAneic7Ci0gICAgIE5fU0VUQjogJ3MnOwotICAgICBOX0lORFI6ICdpJzsKLSAgICAgKi8KLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3N5bWJvbF9pbmZvCi0KLURFU0NSSVBUSU9OCi0JRmlsbCBpbiB0aGUgYmFzaWMgaW5mbyBhYm91dCBzeW1ib2wgdGhhdCBubSBuZWVkcy4KLQlBZGRpdGlvbmFsIGluZm8gbWF5IGJlIGFkZGVkIGJ5IHRoZSBiYWNrLWVuZHMgYWZ0ZXIKLQljYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc3ltYm9sX2luZm8oYXN5bWJvbCAqc3ltYm9sLCBzeW1ib2xfaW5mbyAqcmV0KTsKLSovCi0KLXZvaWQKLWJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgcmV0LT50eXBlID0gYmZkX2RlY29kZV9zeW1jbGFzcyAoc3ltYm9sKTsKLSAgaWYgKHJldC0+dHlwZSAhPSAnVScgJiYgcmV0LT50eXBlICE9ICd3JykKLSAgICByZXQtPnZhbHVlID0gc3ltYm9sLT52YWx1ZSArIHN5bWJvbC0+c2VjdGlvbi0+dm1hOwotICBlbHNlCi0gICAgcmV0LT52YWx1ZSA9IDA7Ci0gIHJldC0+bmFtZSA9IHN5bWJvbC0+bmFtZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YShiZmQgKmliZmQsIGFzeW1ib2wgKmlzeW0sIGJmZCAqb2JmZCwgYXN5bWJvbCAqb3N5bSk7Ci0KLURFU0NSSVBUSU9OCi0JQ29weSBwcml2YXRlIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIEB2YXJ7aXN5bX0gaW4gdGhlIEJGRAotCUB2YXJ7aWJmZH0gdG8gdGhlIHN5bWJvbCBAdmFye29zeW19IGluIHRoZSBCRkQgQHZhcntvYmZkfS4KLQlSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IKLQlyZXR1cm5zIGFyZToKLQotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29zZWN9LgotCi0uI2RlZmluZSBiZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKGliZmQsIGlzeW1ib2wsIG9iZmQsIG9zeW1ib2wpIFwKLS4gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSwgXAotLgkJKGliZmQsIGlzeW1ib2wsIG9iZmQsIG9zeW1ib2wpKQotCi0qLwotCi0vKiBUaGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIG1pbmkgc3ltYm9scy4KLSAgIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBiYWNrZW5kIGRvZXMgbm90IHByb3ZpZGUgYSBtb3JlIGVmZmljaWVudAotICAgdmVyc2lvbi4gIEl0IGp1c3QgdXNlcyBCRkQgYXN5bWJvbCBzdHJ1Y3R1cmVzIGFzIG1pbmkgc3ltYm9scy4gICovCi0KLWxvbmcKLV9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgUFRSICptaW5pc3ltc3A7Ci0gICAgIHVuc2lnbmVkIGludCAqc2l6ZXA7Ci17Ci0gIGxvbmcgc3RvcmFnZTsKLSAgYXN5bWJvbCAqKnN5bXMgPSBOVUxMOwotICBsb25nIHN5bWNvdW50OwotCi0gIGlmIChkeW5hbWljKQotICAgIHN0b3JhZ2UgPSBiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgZWxzZQotICAgIHN0b3JhZ2UgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmIChzdG9yYWdlIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzeW1zID0gKGFzeW1ib2wgKiopIGJmZF9tYWxsb2MgKChzaXplX3QpIHN0b3JhZ2UpOwotICBpZiAoc3ltcyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChkeW5hbWljKQotICAgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0gIGVsc2UKLSAgICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBzeW1zKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAqbWluaXN5bXNwID0gKFBUUikgc3ltczsKLSAgKnNpemVwID0gc2l6ZW9mIChhc3ltYm9sICopOwotICByZXR1cm4gc3ltY291bnQ7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoc3ltcyk7Ci0gIHJldHVybiAtMTsKLX0KLQotLyogVGhlIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gd2hpY2ggY29udmVydHMgYSBtaW5pc3ltYm9sIHRvCi0gICBhbiBhc3ltYm9sLiAgV2UgZG9uJ3Qgd29ycnkgYWJvdXQgdGhlIHN5bSBhcmd1bWVudCB3ZSBhcmUgcGFzc2VkOwotICAgd2UganVzdCByZXR1cm4gdGhlIGFzeW1ib2wgdGhlIG1pbmlzeW1ib2wgcG9pbnRzIHRvLiAgKi8KLQotLypBUkdTVVNFRCovCi1hc3ltYm9sICoKLV9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiBkeW5hbWljIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IFBUUiBtaW5pc3ltOwotICAgICBhc3ltYm9sICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuICooYXN5bWJvbCAqKikgbWluaXN5bTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiAuc3RhYiBhbmQgLnN0YWJzdHIKLSAgIHNlY3Rpb25zIHRvIGZpbmQgdGhlIHNvdXJjZSBmaWxlIGFuZCBsaW5lIGNsb3Nlc3QgdG8gYSBkZXNpcmVkCi0gICBsb2NhdGlvbi4gIFRoaXMgaXMgdXNlZCBieSBDT0ZGIGFuZCBFTEYgdGFyZ2V0cy4gIEl0IHNldHMgKnBmb3VuZAotICAgdG8gdHJ1ZSBpZiBpdCBmaW5kcyBzb21lIGluZm9ybWF0aW9uLiAgVGhlICpwaW5mbyBmaWVsZCBpcyB1c2VkIHRvCi0gICBwYXNzIGNhY2hlZCBpbmZvcm1hdGlvbiBpbiBhbmQgb3V0IG9mIHRoaXMgcm91dGluZTsgdGhpcyBmaXJzdCB0aW1lCi0gICB0aGUgcm91dGluZSBpcyBjYWxsZWQgZm9yIGEgQkZELCAqcGluZm8gc2hvdWxkIGJlIE5VTEwuICBUaGUgdmFsdWUKLSAgIHBsYWNlZCBpbiAqcGluZm8gc2hvdWxkIGJlIHNhdmVkIHdpdGggdGhlIEJGRCwgYW5kIHBhc3NlZCBiYWNrIGVhY2gKLSAgIHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuICAqLwotCi0vKiBXZSB1c2UgYSBjYWNoZSBieSBkZWZhdWx0LiAgKi8KLQotI2RlZmluZSBFTkFCTEVfQ0FDSElORwotCi0vKiBXZSBrZWVwIGFuIGFycmF5IG9mIGluZGV4ZW50cnkgc3RydWN0dXJlcyB0byByZWNvcmQgd2hlcmUgaW4gdGhlCi0gICBzdGFicyBzZWN0aW9uIHdlIHNob3VsZCBsb29rIHRvIGZpbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGEKLSAgIHBhcnRpY3VsYXIgYWRkcmVzcy4gICovCi0KLXN0cnVjdCBpbmRleGVudHJ5Ci17Ci0gIGJmZF92bWEgdmFsOwotICBiZmRfYnl0ZSAqc3RhYjsKLSAgYmZkX2J5dGUgKnN0cjsKLSAgY2hhciAqZGlyZWN0b3J5X25hbWU7Ci0gIGNoYXIgKmZpbGVfbmFtZTsKLSAgY2hhciAqZnVuY3Rpb25fbmFtZTsKLX07Ci0KLS8qIENvbXBhcmUgdHdvIGluZGV4ZW50cnkgc3RydWN0dXJlcy4gIFRoaXMgaXMgY2FsbGVkIHZpYSBxc29ydC4gICovCi0KLXN0YXRpYyBpbnQKLWNtcGluZGV4ZW50cnkgKGEsIGIpCi0gICAgIGNvbnN0IFBUUiAqYTsKLSAgICAgY29uc3QgUFRSICpiOwotewotICBjb25zdCBzdHJ1Y3QgaW5kZXhlbnRyeSAqY29udGVzdGFudEEgPSAoY29uc3Qgc3RydWN0IGluZGV4ZW50cnkgKikgYTsKLSAgY29uc3Qgc3RydWN0IGluZGV4ZW50cnkgKmNvbnRlc3RhbnRCID0gKGNvbnN0IHN0cnVjdCBpbmRleGVudHJ5ICopIGI7Ci0KLSAgaWYgKGNvbnRlc3RhbnRBLT52YWwgPCBjb250ZXN0YW50Qi0+dmFsKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoY29udGVzdGFudEEtPnZhbCA+IGNvbnRlc3RhbnRCLT52YWwpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlIGlzIHN0b3JlZCBpbiAqcGluZm8uICAqLwotCi1zdHJ1Y3Qgc3RhYl9maW5kX2luZm8KLXsKLSAgLyogVGhlIC5zdGFiIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqc3RhYnNlYzsKLSAgLyogVGhlIC5zdGFic3RyIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqc3Ryc2VjOwotICAvKiBUaGUgY29udGVudHMgb2YgdGhlIC5zdGFiIHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqc3RhYnM7Ci0gIC8qIFRoZSBjb250ZW50cyBvZiB0aGUgLnN0YWJzdHIgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpzdHJzOwotCi0gIC8qIEEgdGFibGUgdGhhdCBpbmRleGVzIHN0YWJzIGJ5IG1lbW9yeSBhZGRyZXNzLiAgKi8KLSAgc3RydWN0IGluZGV4ZW50cnkgKmluZGV4dGFibGU7Ci0gIC8qIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBpbmRleHRhYmxlLiAgKi8KLSAgaW50IGluZGV4dGFibGVzaXplOwotCi0jaWZkZWYgRU5BQkxFX0NBQ0hJTkcKLSAgLyogQ2FjaGVkIHZhbHVlcyB0byByZXN0YXJ0IHF1aWNrbHkuICAqLwotICBzdHJ1Y3QgaW5kZXhlbnRyeSAqY2FjaGVkX2luZGV4ZW50cnk7Ci0gIGJmZF92bWEgY2FjaGVkX29mZnNldDsKLSAgYmZkX2J5dGUgKmNhY2hlZF9zdGFiOwotICBjaGFyICpjYWNoZWRfZmlsZV9uYW1lOwotI2VuZGlmCi0KLSAgLyogU2F2ZWQgcHRyIHRvIG1hbGxvYydlZCBmaWxlbmFtZS4gICovCi0gIGNoYXIgKmZpbGVuYW1lOwotfTsKLQotYm9vbGVhbgotX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHN5bWJvbHMsIHNlY3Rpb24sIG9mZnNldCwgcGZvdW5kLAotCQkJCSAgICAgcGZpbGVuYW1lLCBwZm5uYW1lLCBwbGluZSwgcGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYm9vbGVhbiAqcGZvdW5kOwotICAgICBjb25zdCBjaGFyICoqcGZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICoqcGZubmFtZTsKLSAgICAgdW5zaWduZWQgaW50ICpwbGluZTsKLSAgICAgUFRSICpwaW5mbzsKLXsKLSAgc3RydWN0IHN0YWJfZmluZF9pbmZvICppbmZvOwotICBiZmRfc2l6ZV90eXBlIHN0YWJzaXplLCBzdHJzaXplOwotICBiZmRfYnl0ZSAqc3RhYiwgKnN0cjsKLSAgYmZkX2J5dGUgKmxhc3Rfc3RhYiA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgc3Ryb2ZmOwotICBzdHJ1Y3QgaW5kZXhlbnRyeSAqaW5kZXhlbnRyeTsKLSAgY2hhciAqZGlyZWN0b3J5X25hbWUsICpmaWxlX25hbWU7Ci0gIGludCBzYXdfZnVuOwotCi0gICpwZm91bmQgPSBmYWxzZTsKLSAgKnBmaWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAqcGZubmFtZSA9IE5VTEw7Ci0gICpwbGluZSA9IDA7Ci0KLSAgLyogU3RhYnMgZW50cmllcyB1c2UgYSAxMiBieXRlIGZvcm1hdDoKLSAgICAgICA0IGJ5dGUgc3RyaW5nIHRhYmxlIGluZGV4Ci0gICAgICAgMSBieXRlIHN0YWIgdHlwZQotICAgICAgIDEgYnl0ZSBzdGFiIG90aGVyIGZpZWxkCi0gICAgICAgMiBieXRlIHN0YWIgZGVzYyBmaWVsZAotICAgICAgIDQgYnl0ZSBzdGFiIHZhbHVlCi0gICAgIEZJWE1FOiBUaGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UgZm9yIGEgNjQgYml0IG9iamVjdCBmb3JtYXQuCi0KLSAgICAgVGhlIHN0YWJzIHN5bWJvbHMgYXJlIGRpdmlkZWQgaW50byBjb21waWxhdGlvbiB1bml0cy4gIEZvciB0aGUKLSAgICAgZmlyc3QgZW50cnkgaW4gZWFjaCB1bml0LCB0aGUgdHlwZSBvZiAwLCB0aGUgdmFsdWUgaXMgdGhlIGxlbmd0aAotICAgICBvZiB0aGUgc3RyaW5nIHRhYmxlIGZvciB0aGlzIHVuaXQsIGFuZCB0aGUgZGVzYyBmaWVsZCBpcyB0aGUKLSAgICAgbnVtYmVyIG9mIHN0YWJzIHN5bWJvbHMgZm9yIHRoaXMgdW5pdC4gICovCi0KLSNkZWZpbmUgU1RSRFhPRkYgKDApCi0jZGVmaW5lIFRZUEVPRkYgKDQpCi0jZGVmaW5lIE9USEVST0ZGICg1KQotI2RlZmluZSBERVNDT0ZGICg2KQotI2RlZmluZSBWQUxPRkYgKDgpCi0jZGVmaW5lIFNUQUJTSVpFICgxMikKLQotICBpbmZvID0gKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyAqKSAqcGluZm87Ci0gIGlmIChpbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGluZm8tPnN0YWJzZWMgPT0gTlVMTCB8fCBpbmZvLT5zdHJzZWMgPT0gTlVMTCkKLQl7Ci0JICAvKiBObyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzdGFic2l6ZSA9IGluZm8tPnN0YWJzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIHN0cnNpemUgPSBpbmZvLT5zdHJzZWMtPl9yYXdfc2l6ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIHJlbG9jX3NpemUsIHJlbG9jX2NvdW50OwotICAgICAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvcjsKLSAgICAgIGludCBpOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgKmZpbGVfbmFtZTsKLSAgICAgIGNoYXIgKmRpcmVjdG9yeV9uYW1lOwotICAgICAgY2hhciAqZnVuY3Rpb25fbmFtZTsKLQotICAgICAgaW5mbyA9IChzdHJ1Y3Qgc3RhYl9maW5kX2luZm8gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICppbmZvKTsKLSAgICAgIGlmIChpbmZvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGSVhNRTogV2hlbiB1c2luZyB0aGUgbGlua2VyIC0tc3BsaXQtYnktZmlsZSBvcgotCSAtLXNwbGl0LWJ5LXJlbG9jIG9wdGlvbnMsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgLnN0YWIgYW5kCi0JIC5zdGFic3RyIHNlY3Rpb25zIHRvIGJlIHNwbGl0LiAgV2Ugc2hvdWxkIGhhbmRsZSB0aGF0LiAgKi8KLQotICAgICAgaW5mby0+c3RhYnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWIiKTsKLSAgICAgIGluZm8tPnN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWJzdHIiKTsKLQotICAgICAgaWYgKGluZm8tPnN0YWJzZWMgPT0gTlVMTCB8fCBpbmZvLT5zdHJzZWMgPT0gTlVMTCkKLQl7Ci0JICAvKiBObyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBTZXQgKnBpbmZvIHNvIHRoYXQgd2UKLSAgICAgICAgICAgICBjYW4gcmV0dXJuIHF1aWNrbHkgaW4gdGhlIGluZm8gIT0gTlVMTCBjYXNlIGFib3ZlLiAgKi8KLQkgICpwaW5mbyA9IChQVFIpIGluZm87Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIHN0YWJzaXplID0gaW5mby0+c3RhYnNlYy0+X3Jhd19zaXplOwotICAgICAgc3Ryc2l6ZSA9IGluZm8tPnN0cnNlYy0+X3Jhd19zaXplOwotCi0gICAgICBpbmZvLT5zdGFicyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHN0YWJzaXplKTsKLSAgICAgIGluZm8tPnN0cnMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJzaXplKTsKLSAgICAgIGlmIChpbmZvLT5zdGFicyA9PSBOVUxMIHx8IGluZm8tPnN0cnMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaW5mby0+c3RhYnNlYywgaW5mby0+c3RhYnMsIDAsCi0JCQkJICAgICAgc3RhYnNpemUpCi0JICB8fCAhIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaW5mby0+c3Ryc2VjLCBpbmZvLT5zdHJzLCAwLAotCQkJCQkgc3Ryc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlLCB3ZSBoYXZlIHRvIHJlbG9jYXRlCi0JIHRoZSBlbnRyaWVzIGluIC5zdGFiLiAgVGhpcyBzaG91bGQgYWx3YXlzIGJlIHNpbXBsZSAzMiBiaXQKLQkgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBvYmplY3QgZmlsZSwgc28KLQkgdGhpcyBzaG91bGQgYmUgbm8gYmlnIGRlYWwuICAqLwotICAgICAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGluZm8tPnN0YWJzZWMpOwotICAgICAgaWYgKHJlbG9jX3NpemUgPCAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChyZWxvY19zaXplKTsKLSAgICAgIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBpbmZvLT5zdGFic2VjLCByZWxvY192ZWN0b3IsCi0JCQkJCSAgICBzeW1ib2xzKTsKLSAgICAgIGlmIChyZWxvY19jb3VudCA8IDApCi0JewotCSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotCSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChyZWxvY19jb3VudCA+IDApCi0JewotCSAgYXJlbGVudCAqKnByOwotCi0JICBmb3IgKHByID0gcmVsb2NfdmVjdG9yOyAqcHIgIT0gTlVMTDsgcHIrKykKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKnI7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICAgICAgYXN5bWJvbCAqc3ltOwotCi0JICAgICAgciA9ICpwcjsKLQkgICAgICBpZiAoci0+aG93dG8tPnJpZ2h0c2hpZnQgIT0gMAotCQkgIHx8IHItPmhvd3RvLT5zaXplICE9IDIKLQkJICB8fCByLT5ob3d0by0+Yml0c2l6ZSAhPSAzMgotCQkgIHx8IHItPmhvd3RvLT5wY19yZWxhdGl2ZQotCQkgIHx8IHItPmhvd3RvLT5iaXRwb3MgIT0gMAotCQkgIHx8IHItPmhvd3RvLT5kc3RfbWFzayAhPSAweGZmZmZmZmZmKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiVW5zdXBwb3J0ZWQgLnN0YWIgcmVsb2NhdGlvbiIpKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCQkgIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLQkJICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBpbmZvLT5zdGFicyArIHItPmFkZHJlc3MpOwotCSAgICAgIHZhbCAmPSByLT5ob3d0by0+c3JjX21hc2s7Ci0JICAgICAgc3ltID0gKnItPnN5bV9wdHJfcHRyOwotCSAgICAgIHZhbCArPSBzeW0tPnZhbHVlICsgc3ltLT5zZWN0aW9uLT52bWEgKyByLT5hZGRlbmQ7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCBpbmZvLT5zdGFicyArIHItPmFkZHJlc3MpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0JZnJlZSAocmVsb2NfdmVjdG9yKTsKLQotICAgICAgLyogRmlyc3QgdGltZSB0aHJvdWdoIHRoaXMgZnVuY3Rpb24sIGJ1aWxkIGEgdGFibGUgbWF0Y2hpbmcKLQkgZnVuY3Rpb24gVk0gYWRkcmVzc2VzIHRvIHN0YWJzLCB0aGVuIHNvcnQgYmFzZWQgb24gc3RhcnRpbmcKLQkgVk0gYWRkcmVzcy4gIERvIHRoaXMgaW4gdHdvIHBhc3Nlczogb25jZSB0byBjb3VudCBob3cgbWFueQotCSB0YWJsZSBlbnRyaWVzIHdlJ2xsIG5lZWQsIGFuZCBhIHNlY29uZCB0byBhY3R1YWxseSBidWlsZCB0aGUKLQkgdGFibGUuICAqLwotCi0gICAgICBpbmZvLT5pbmRleHRhYmxlc2l6ZSA9IDA7Ci0gICAgICBzYXdfZnVuID0gMTsKLSAgICAgIGZvciAoc3RhYiA9IGluZm8tPnN0YWJzOyBzdGFiIDwgaW5mby0+c3RhYnMgKyBzdGFic2l6ZTsgc3RhYiArPSBTVEFCU0laRSkKLQl7Ci0JICBpZiAoc3RhYltUWVBFT0ZGXSA9PSBOX1NPKQotCSAgICB7Ci0JICAgICAgLyogTl9TTyB3aXRoIG51bGwgbmFtZSBpbmRpY2F0ZXMgRU9GICovCi0JICAgICAgaWYgKGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBTVFJEWE9GRikgPT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBpZiB3ZSBkaWQgbm90IHNlZSBhIGZ1bmN0aW9uIGRlZiwgbGVhdmUgc3BhY2UgZm9yIG9uZS4gKi8KLQkgICAgICBpZiAoc2F3X2Z1biA9PSAwKQotCQkrK2luZm8tPmluZGV4dGFibGVzaXplOwotCi0JICAgICAgc2F3X2Z1biA9IDA7Ci0KLQkgICAgICAvKiB0d28gTl9TTydzIGluIGEgcm93IGlzIGEgZmlsZW5hbWUgYW5kIGRpcmVjdG9yeS4gU2tpcCAqLwotCSAgICAgIGlmIChzdGFiICsgU1RBQlNJWkUgPCBpbmZvLT5zdGFicyArIHN0YWJzaXplCi0JCSAgJiYgKihzdGFiICsgU1RBQlNJWkUgKyBUWVBFT0ZGKSA9PSBOX1NPKQotCQl7Ci0JCSAgc3RhYiArPSBTVEFCU0laRTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChzdGFiW1RZUEVPRkZdID09IE5fRlVOKQotCSAgICB7Ci0JICAgICAgc2F3X2Z1biA9IDE7Ci0JICAgICAgKytpbmZvLT5pbmRleHRhYmxlc2l6ZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHNhd19mdW4gPT0gMCkKLQkrK2luZm8tPmluZGV4dGFibGVzaXplOwotICAgICAgCi0gICAgICBpZiAoaW5mby0+aW5kZXh0YWJsZXNpemUgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgICsraW5mby0+aW5kZXh0YWJsZXNpemU7Ci0KLSAgICAgIGluZm8tPmluZGV4dGFibGUgPSAoKHN0cnVjdCBpbmRleGVudHJ5ICopCi0JCQkgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICAgIChzaXplb2YgKHN0cnVjdCBpbmRleGVudHJ5KQotCQkJCSAgICAgICogaW5mby0+aW5kZXh0YWJsZXNpemUpKSk7Ci0gICAgICBpZiAoaW5mby0+aW5kZXh0YWJsZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLSAgICAgIHNhd19mdW4gPSAxOwotCi0gICAgICBmb3IgKGkgPSAwLCBzdHJvZmYgPSAwLCBzdGFiID0gaW5mby0+c3RhYnMsIHN0ciA9IGluZm8tPnN0cnM7Ci0JICAgaSA8IGluZm8tPmluZGV4dGFibGVzaXplICYmIHN0YWIgPCBpbmZvLT5zdGFicyArIHN0YWJzaXplOwotCSAgIHN0YWIgKz0gU1RBQlNJWkUpCi0JewotCSAgc3dpdGNoIChzdGFiW1RZUEVPRkZdKQotCSAgICB7Ci0JICAgIGNhc2UgMDoKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBlbnRyeSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCSAgICAgIGlmICgoYmZkX3NpemVfdHlwZSkgKChpbmZvLT5zdHJzICsgc3Ryc2l6ZSkgLSBzdHIpIDwgc3Ryb2ZmKQotCQlicmVhazsKLQkgICAgICBzdHIgKz0gc3Ryb2ZmOwotCSAgICAgIHN0cm9mZiA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9TTzoKLQkgICAgICAvKiBUaGUgbWFpbiBmaWxlIG5hbWUuICAqLwotCi0JICAgICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGNyZWF0ZXMgYSBuZXcgaW5kZXh0YWJsZSBlbnRyeSB3aXRoCi0JICAgICAgICAgYSBOVUxMIGZ1bmN0aW9uIG5hbWUgaWYgdGhlcmUgd2VyZSBubyBOX0ZVTnMgaW4gYSBmaWxlLgotCSAgICAgICAgIE5vdGUgdGhhdCBhIE5fU08gd2l0aG91dCBhIGZpbGUgbmFtZSBpcyBhbiBFT0YgYW5kCi0JICAgICAgICAgdGhlcmUgY291bGQgYmUgMiBOX1NPIGZvbGxvd2luZyBpdCB3aXRoIHRoZSBuZXcgZmlsZW5hbWUgCi0JICAgICAgICAgYW5kIGRpcmVjdG9yeS4gKi8KLQkgICAgICBpZiAoc2F3X2Z1biA9PSAwKQotCQl7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS52YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBsYXN0X3N0YWIgKyBWQUxPRkYpOwotCQkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IGxhc3Rfc3RhYjsKLQkJICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0ciA9IHN0cjsKLQkJICBpbmZvLT5pbmRleHRhYmxlW2ldLmRpcmVjdG9yeV9uYW1lID0gZGlyZWN0b3J5X25hbWU7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5mdW5jdGlvbl9uYW1lID0gTlVMTDsKLQkJICArK2k7Ci0JCX0KLQkgICAgICBzYXdfZnVuID0gMDsKLQkgICAgICAKLQkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOwotCSAgICAgIGlmICgqZmlsZV9uYW1lID09ICdcMCcpCi0JCXsKLQkJICBkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0JCSAgZmlsZV9uYW1lID0gTlVMTDsKLQkJICBzYXdfZnVuID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGxhc3Rfc3RhYiA9IHN0YWI7Ci0JCSAgaWYgKHN0YWIgKyBTVEFCU0laRSA+PSBpbmZvLT5zdGFicyArIHN0YWJzaXplCi0JCSAgICAgIHx8ICooc3RhYiArIFNUQUJTSVpFICsgVFlQRU9GRikgIT0gTl9TTykKLQkJICAgIHsKLQkJICAgICAgZGlyZWN0b3J5X25hbWUgPSBOVUxMOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogVHdvIGNvbnNlY3V0aXZlIE5fU09zIGFyZSBhIGRpcmVjdG9yeSBhbmQgYQotCQkJIGZpbGUgbmFtZS4gICovCi0JCSAgICAgIHN0YWIgKz0gU1RBQlNJWkU7Ci0JCSAgICAgIGRpcmVjdG9yeV9uYW1lID0gZmlsZV9uYW1lOwotCQkgICAgICBmaWxlX25hbWUgPSAoKGNoYXIgKikgc3RyCi0JCQkJICAgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9TT0w6Ci0JICAgICAgLyogVGhlIG5hbWUgb2YgYW4gaW5jbHVkZSBmaWxlLiAgKi8KLQkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9GVU46Ci0JICAgICAgLyogQSBmdW5jdGlvbiBuYW1lLiAgKi8KLQkgICAgICBzYXdfZnVuID0gMTsKLQkgICAgICBuYW1lID0gKGNoYXIgKikgc3RyICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKTsKLQotCSAgICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gTlVMTDsKLQotCSAgICAgIGZ1bmN0aW9uX25hbWUgPSBuYW1lOwotCi0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJY29udGludWU7Ci0KLQkgICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLnZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IHN0YWI7Ci0JICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdHIgPSBzdHI7Ci0JICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZnVuY3Rpb25fbmFtZSA9IGZ1bmN0aW9uX25hbWU7Ci0JICAgICAgKytpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc2F3X2Z1biA9PSAwKQotCXsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0udmFsID0gYmZkX2dldF8zMiAoYWJmZCwgbGFzdF9zdGFiICsgVkFMT0ZGKTsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IGxhc3Rfc3RhYjsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RyID0gc3RyOwotCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOwotCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0JICBpbmZvLT5pbmRleHRhYmxlW2ldLmZ1bmN0aW9uX25hbWUgPSBOVUxMOwotCSAgKytpOwotCX0KLQotICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS52YWwgPSAoYmZkX3ZtYSkgLTE7Ci0gICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0YWIgPSBpbmZvLT5zdGFicyArIHN0YWJzaXplOwotICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdHIgPSBzdHI7Ci0gICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLmRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZnVuY3Rpb25fbmFtZSA9IE5VTEw7Ci0gICAgICArK2k7Ci0KLSAgICAgIGluZm8tPmluZGV4dGFibGVzaXplID0gaTsKLSAgICAgIHFzb3J0IChpbmZvLT5pbmRleHRhYmxlLCBpLCBzaXplb2YgKHN0cnVjdCBpbmRleGVudHJ5KSwgY21waW5kZXhlbnRyeSk7Ci0KLSAgICAgICpwaW5mbyA9IChQVFIpIGluZm87Ci0gICAgfQotCi0gIC8qIFdlIGFyZSBwYXNzZWQgYSBzZWN0aW9uIHJlbGF0aXZlIG9mZnNldC4gIFRoZSBvZmZzZXRzIGluIHRoZQotICAgICBzdGFicyBpbmZvcm1hdGlvbiBhcmUgYWJzb2x1dGUuICAqLwotICBvZmZzZXQgKz0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0KLSNpZmRlZiBFTkFCTEVfQ0FDSElORwotICBpZiAoaW5mby0+Y2FjaGVkX2luZGV4ZW50cnkgIT0gTlVMTAotICAgICAgJiYgb2Zmc2V0ID49IGluZm8tPmNhY2hlZF9vZmZzZXQKLSAgICAgICYmIG9mZnNldCA8IChpbmZvLT5jYWNoZWRfaW5kZXhlbnRyeSArIDEpLT52YWwpCi0gICAgewotICAgICAgc3RhYiA9IGluZm8tPmNhY2hlZF9zdGFiOwotICAgICAgaW5kZXhlbnRyeSA9IGluZm8tPmNhY2hlZF9pbmRleGVudHJ5OwotICAgICAgZmlsZV9uYW1lID0gaW5mby0+Y2FjaGVkX2ZpbGVfbmFtZTsKLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIC8qIENhY2hlIG5vbi1leGlzdGFudCBvciBpbnZhbGlkLiAgRG8gYmluYXJ5IHNlYXJjaCBvbgotICAgICAgICAgaW5kZXh0YWJsZS4gICovCi0KLSAgICAgIGxvbmcgbG93LCBoaWdoOwotICAgICAgbG9uZyBtaWQgPSAtMTsKLQotICAgICAgaW5kZXhlbnRyeSA9IE5VTEw7Ci0KLSAgICAgIGxvdyA9IDA7Ci0gICAgICBoaWdoID0gaW5mby0+aW5kZXh0YWJsZXNpemUgLSAxOwotICAgICAgd2hpbGUgKGxvdyAhPSBoaWdoKQotCXsKLQkgIG1pZCA9IChoaWdoICsgbG93KSAvIDI7Ci0JICBpZiAob2Zmc2V0ID49IGluZm8tPmluZGV4dGFibGVbbWlkXS52YWwKLQkgICAgICAmJiBvZmZzZXQgPCBpbmZvLT5pbmRleHRhYmxlW21pZCArIDFdLnZhbCkKLQkgICAgewotCSAgICAgIGluZGV4ZW50cnkgPSAmaW5mby0+aW5kZXh0YWJsZVttaWRdOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChpbmZvLT5pbmRleHRhYmxlW21pZF0udmFsID4gb2Zmc2V0KQotCSAgICBoaWdoID0gbWlkOwotCSAgZWxzZQotCSAgICBsb3cgPSBtaWQgKyAxOwotCX0KLQotICAgICAgaWYgKGluZGV4ZW50cnkgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgc3RhYiA9IGluZGV4ZW50cnktPnN0YWIgKyBTVEFCU0laRTsKLSAgICAgIGZpbGVfbmFtZSA9IGluZGV4ZW50cnktPmZpbGVfbmFtZTsKLSAgICB9Ci0KLSAgZGlyZWN0b3J5X25hbWUgPSBpbmRleGVudHJ5LT5kaXJlY3RvcnlfbmFtZTsKLSAgc3RyID0gaW5kZXhlbnRyeS0+c3RyOwotCi0gIGZvciAoOyBzdGFiIDwgKGluZGV4ZW50cnkrMSktPnN0YWI7IHN0YWIgKz0gU1RBQlNJWkUpCi0gICAgewotICAgICAgYm9vbGVhbiBkb25lOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0KLSAgICAgIGRvbmUgPSBmYWxzZTsKLQotICAgICAgc3dpdGNoIChzdGFiW1RZUEVPRkZdKQotCXsKLQljYXNlIE5fU09MOgotCSAgLyogVGhlIG5hbWUgb2YgYW4gaW5jbHVkZSBmaWxlLiAgKi8KLQkgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgaWYgKHZhbCA8PSBvZmZzZXQpCi0JICAgIHsKLQkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOwotCSAgICAgICpwbGluZSA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBOX1NMSU5FOgotCWNhc2UgTl9EU0xJTkU6Ci0JY2FzZSBOX0JTTElORToKLQkgIC8qIEEgbGluZSBudW1iZXIuICBUaGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQotICAgICAgICAgICAgIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotCSAgdmFsID0gaW5kZXhlbnRyeS0+dmFsICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFZBTE9GRik7Ci0JICBpZiAodmFsIDw9IG9mZnNldCkKLQkgICAgewotCSAgICAgICpwbGluZSA9IGJmZF9nZXRfMTYgKGFiZmQsIHN0YWIgKyBERVNDT0ZGKTsKLQotI2lmZGVmIEVOQUJMRV9DQUNISU5HCi0JICAgICAgaW5mby0+Y2FjaGVkX3N0YWIgPSBzdGFiOwotCSAgICAgIGluZm8tPmNhY2hlZF9vZmZzZXQgPSB2YWw7Ci0JICAgICAgaW5mby0+Y2FjaGVkX2ZpbGVfbmFtZSA9IGZpbGVfbmFtZTsKLQkgICAgICBpbmZvLT5jYWNoZWRfaW5kZXhlbnRyeSA9IGluZGV4ZW50cnk7Ci0jZW5kaWYKLQkgICAgfQotCSAgaWYgKHZhbCA+IG9mZnNldCkKLQkgICAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgTl9GVU46Ci0JY2FzZSBOX1NPOgotCSAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChkb25lKQotCWJyZWFrOwotICAgIH0KLQotICAqcGZvdW5kID0gdHJ1ZTsKLQotICBpZiAoZmlsZV9uYW1lWzBdID09ICcvJyB8fCBkaXJlY3RvcnlfbmFtZSA9PSBOVUxMKQotICAgICpwZmlsZW5hbWUgPSBmaWxlX25hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplX3QgZGlybGVuOwotCi0gICAgICBkaXJsZW4gPSBzdHJsZW4gKGRpcmVjdG9yeV9uYW1lKTsKLSAgICAgIGlmIChpbmZvLT5maWxlbmFtZSA9PSBOVUxMCi0JICB8fCBzdHJuY21wIChpbmZvLT5maWxlbmFtZSwgZGlyZWN0b3J5X25hbWUsIGRpcmxlbikgIT0gMAotCSAgfHwgc3RyY21wIChpbmZvLT5maWxlbmFtZSArIGRpcmxlbiwgZmlsZV9uYW1lKSAhPSAwKQotCXsKLQkgIGlmIChpbmZvLT5maWxlbmFtZSAhPSBOVUxMKQotCSAgICBmcmVlIChpbmZvLT5maWxlbmFtZSk7Ci0JICBpbmZvLT5maWxlbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKGRpcmxlbiArCi0JCQkJCQlzdHJsZW4gKGZpbGVfbmFtZSkKLQkJCQkJCSsgMSk7Ci0JICBpZiAoaW5mby0+ZmlsZW5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3RyY3B5IChpbmZvLT5maWxlbmFtZSwgZGlyZWN0b3J5X25hbWUpOwotCSAgc3RyY3B5IChpbmZvLT5maWxlbmFtZSArIGRpcmxlbiwgZmlsZV9uYW1lKTsKLQl9Ci0KLSAgICAgICpwZmlsZW5hbWUgPSBpbmZvLT5maWxlbmFtZTsKLSAgICB9Ci0KLSAgaWYgKGluZGV4ZW50cnktPmZ1bmN0aW9uX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpzOwotCi0gICAgICAvKiBUaGlzIHdpbGwgdHlwaWNhbGx5IGJlIHNvbWV0aGluZyBsaWtlIG1haW46RigwLDEpLCBzbyB3ZSB3YW50Ci0gICAgICAgICB0byBjbG9iYmVyIHRoZSBjb2xvbi4gIEl0J3MgT0sgdG8gY2hhbmdlIHRoZSBuYW1lLCBzaW5jZSB0aGUKLSAgICAgICAgIHN0cmluZyBpcyBpbiBvdXIgb3duIGxvY2FsIHN0b3JhZ2UgYW55aG93LiAgKi8KLQotICAgICAgcyA9IHN0cmNociAoaW5kZXhlbnRyeS0+ZnVuY3Rpb25fbmFtZSwgJzonKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JKnMgPSAnXDAnOwotCi0gICAgICAqcGZubmFtZSA9IGluZGV4ZW50cnktPmZ1bmN0aW9uX25hbWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3N5c2RlcC5oIGIvYmZkL3N5c2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTU4OTgzLi4wMDAwMDAwCi0tLSBhL2JmZC9zeXNkZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKiBzeXNkZXAuaCAtLSBoYW5kbGUgaG9zdCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBCRkQgbGlicmFyeQotICAgQ29weXJpZ2h0IDE5OTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgQkZEX1NZU0RFUF9ICi0jZGVmaW5lIEJGRF9TWVNERVBfSAotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgSEFWRV9TVERERUZfSAotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmICEoZGVmaW5lZChlcnJubykgfHwgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfSU5DX0VSUk5PKSkKLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZWxzZQotZXh0ZXJuIGNoYXIgKnN0cmNociAoKTsKLWV4dGVybiBjaGFyICpzdHJyY2hyICgpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgVElNRV9XSVRIX1NZU19USU1FCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9CSU5BUllfRk9QRU4KLSNpbmNsdWRlICJmb3Blbi1iaW4uaCIKLSNlbHNlCi0jaW5jbHVkZSAiZm9wZW4tc2FtZS5oIgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0ZDTlRMX0gKLSNpbmNsdWRlIDxmY250bC5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NZU19GSUxFX0gKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBPX1JET05MWQotI2RlZmluZSBPX1JET05MWSAwCi0jZW5kaWYKLSNpZm5kZWYgT19XUk9OTFkKLSNkZWZpbmUgT19XUk9OTFkgMQotI2VuZGlmCi0jaWZuZGVmIE9fUkRXUgotI2RlZmluZSBPX1JEV1IgMgotI2VuZGlmCi0jaWZuZGVmIE9fQUNDTU9ERQotI2RlZmluZSBPX0FDQ01PREUgKE9fUkRPTkxZIHwgT19XUk9OTFkgfCBPX1JEV1IpCi0jZW5kaWYKLQotI2lmbmRlZiBTRUVLX1NFVAotI2RlZmluZSBTRUVLX1NFVCAwCi0jZW5kaWYKLSNpZm5kZWYgU0VFS19DVVIKLSNkZWZpbmUgU0VFS19DVVIgMQotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotZXh0ZXJuIGNoYXIgKnN0cnN0ciAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLWV4dGVybiBQVFIgbWFsbG9jICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MKLWV4dGVybiBQVFIgcmVhbGxvYyAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi1leHRlcm4gdm9pZCBmcmVlICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotZXh0ZXJuIGNoYXIgKmdldGVudiAoKTsKLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX05MUwotI2luY2x1ZGUgPGxpYmludGwuaD4KLSNkZWZpbmUgXyhTdHJpbmcpIGRnZXR0ZXh0IChQQUNLQUdFLCBTdHJpbmcpCi0jaWZkZWYgZ2V0dGV4dF9ub29wCi0jZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jZWxzZQotI2RlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKLSNlbHNlCi0vKiBTdHVicyB0aGF0IGRvIHNvbWV0aGluZyBjbG9zZSBlbm91Z2guICAqLwotI2RlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKLSNkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCi0jZGVmaW5lIGRnZXR0ZXh0KERvbWFpbixNZXNzYWdlKSAoTWVzc2FnZSkKLSNkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQotI2RlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQotI2RlZmluZSBfKFN0cmluZykgKFN0cmluZykKLSNkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9TWVNERVBfSCkgKi8KZGlmZiAtLWdpdCBhL2JmZC90YXJnZXRzLmMgYi9iZmQvdGFyZ2V0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTBjYzU5Li4wMDAwMDAwCi0tLSBhL2JmZC90YXJnZXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI5ICswLDAgQEAKLS8qIEdlbmVyaWMgdGFyZ2V0LWZpbGUtdHlwZSBzdXBwb3J0IGZvciB0aGUgQkZEIGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImZubWF0Y2guaCIKLQotLyoKLVNFQ1RJT04gCi0JVGFyZ2V0cwotCi1ERVNDUklQVElPTgotCUVhY2ggcG9ydCBvZiBCRkQgdG8gYSBkaWZmZXJlbnQgbWFjaGluZSByZXF1cmllcyB0aGUgY3JlYXRpb24KLQlvZiBhIHRhcmdldCBiYWNrIGVuZC4gQWxsIHRoZSBiYWNrIGVuZCBwcm92aWRlcyB0byB0aGUgcm9vdAotCXBhcnQgb2YgQkZEIGlzIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gZnVuY3Rpb25zCi0Jd2hpY2ggcGVyZm9ybSBjZXJ0YWluIGxvdyBsZXZlbCBvcGVyYXRpb25zIG9uIGZpbGVzLiBCRkQKLQl0cmFuc2xhdGVzIHRoZSBhcHBsaWNhdGlvbnMncyByZXF1ZXN0cyB0aHJvdWdoIGEgcG9pbnRlciBpbnRvCi0JY2FsbHMgdG8gdGhlIGJhY2sgZW5kIHJvdXRpbmVzLiAKLQotCVdoZW4gYSBmaWxlIGlzIG9wZW5lZCB3aXRoIDw8YmZkX29wZW5yPj4sIGl0cyBmb3JtYXQgYW5kCi0JdGFyZ2V0IGFyZSB1bmtub3duLiBCRkQgdXNlcyB2YXJpb3VzIG1lY2hhbmlzbXMgdG8gZGV0ZXJtaW5lCi0JaG93IHRvIGludGVycHJldCB0aGUgZmlsZS4gVGhlIG9wZXJhdGlvbnMgcGVyZm9ybWVkIGFyZToKLQotCW8gQ3JlYXRlIGEgQkZEIGJ5IGNhbGxpbmcgdGhlIGludGVybmFsIHJvdXRpbmUKLQk8PF9iZmRfbmV3X2JmZD4+LCB0aGVuIGNhbGwgPDxiZmRfZmluZF90YXJnZXQ+PiB3aXRoIHRoZQotCXRhcmdldCBzdHJpbmcgc3VwcGxpZWQgdG8gPDxiZmRfb3BlbnI+PiBhbmQgdGhlIG5ldyBCRkQgcG9pbnRlci4gCi0KLQlvIElmIGEgbnVsbCB0YXJnZXQgc3RyaW5nIHdhcyBwcm92aWRlZCB0byA8PGJmZF9maW5kX3RhcmdldD4+LAotCWxvb2sgdXAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDw8R05VVEFSR0VUPj4gYW5kIHVzZQotCXRoYXQgYXMgdGhlIHRhcmdldCBzdHJpbmcuIAotCi0JbyBJZiB0aGUgdGFyZ2V0IHN0cmluZyBpcyBzdGlsbCA8PE5VTEw+Piwgb3IgdGhlIHRhcmdldCBzdHJpbmcgaXMKLQk8PGRlZmF1bHQ+PiwgdGhlbiB1c2UgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHRhcmdldCB2ZWN0b3IKLQlhcyB0aGUgdGFyZ2V0IHR5cGUsIGFuZCBzZXQgPDx0YXJnZXRfZGVmYXVsdGVkPj4gaW4gdGhlIEJGRCB0bwotCWNhdXNlIDw8YmZkX2NoZWNrX2Zvcm1hdD4+IHRvIGxvb3AgdGhyb3VnaCBhbGwgdGhlIHRhcmdldHMuCi0JQHhyZWZ7YmZkX3RhcmdldH0uICBAeHJlZntGb3JtYXRzfS4KLQotCW8gT3RoZXJ3aXNlLCBpbnNwZWN0IHRoZSBlbGVtZW50cyBpbiB0aGUgdGFyZ2V0IHZlY3RvcgotCW9uZSBieSBvbmUsIHVudGlsIGEgbWF0Y2ggb24gdGFyZ2V0IG5hbWUgaXMgZm91bmQuIFdoZW4gZm91bmQsCi0JdXNlIGl0LiAKLQotCW8gT3RoZXJ3aXNlIHJldHVybiB0aGUgZXJyb3IgPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+PiB0bwotCTw8YmZkX29wZW5yPj4uCi0KLQlvIDw8YmZkX29wZW5yPj4gYXR0ZW1wdHMgdG8gb3BlbiB0aGUgZmlsZSB1c2luZwotCTw8YmZkX29wZW5fZmlsZT4+LCBhbmQgcmV0dXJucyB0aGUgQkZELgotCi0JT25jZSB0aGUgQkZEIGhhcyBiZWVuIG9wZW5lZCBhbmQgdGhlIHRhcmdldCBzZWxlY3RlZCwgdGhlIGZpbGUKLQlmb3JtYXQgbWF5IGJlIGRldGVybWluZWQuIFRoaXMgaXMgZG9uZSBieSBjYWxsaW5nCi0JPDxiZmRfY2hlY2tfZm9ybWF0Pj4gb24gdGhlIEJGRCB3aXRoIGEgc3VnZ2VzdGVkIGZvcm1hdC4gCi0JSWYgPDx0YXJnZXRfZGVmYXVsdGVkPj4gaGFzIGJlZW4gc2V0LCBlYWNoIHBvc3NpYmxlIHRhcmdldAotCXR5cGUgaXMgdHJpZWQgdG8gc2VlIGlmIGl0IHJlY29nbml6ZXMgdGhlIHNwZWNpZmllZCBmb3JtYXQuCi0JPDxiZmRfY2hlY2tfZm9ybWF0Pj4gcmV0dXJucyA8PHRydWU+PiB3aGVuIHRoZSBjYWxsZXIgZ3Vlc3NlcyByaWdodC4KLUBtZW51Ci1AKiBiZmRfdGFyZ2V0OjoKLUBlbmQgbWVudQotKi8KLQotCi0vKgotCi1JTk9ERQotCWJmZF90YXJnZXQsICAsIFRhcmdldHMsIFRhcmdldHMKLURPQ0RECi1TVUJTRUNUSU9OCi0JYmZkX3RhcmdldAotCi1ERVNDUklQVElPTgotCVRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBCRkQga25vd3MgYWJvdXQgYQotCXRhcmdldC4gSXQgaW5jbHVkZXMgdGhpbmdzIGxpa2UgaXRzIGJ5dGUgb3JkZXIsIG5hbWUsIGFuZCB3aGljaAotCXJvdXRpbmVzIHRvIGNhbGwgdG8gZG8gdmFyaW91cyBvcGVyYXRpb25zLiAgIAotCi0JRXZlcnkgQkZEIHBvaW50cyB0byBhIHRhcmdldCBzdHJ1Y3R1cmUgd2l0aCBpdHMgPDx4dmVjPj4KLQltZW1iZXIuIAotCi0JVGhlIG1hY3JvcyBiZWxvdyBhcmUgdXNlZCB0byBkaXNwYXRjaCB0byBmdW5jdGlvbnMgdGhyb3VnaCB0aGUKLQk8PGJmZF90YXJnZXQ+PiB2ZWN0b3IuIFRoZXkgYXJlIHVzZWQgaW4gYSBudW1iZXIgb2YgbWFjcm9zIGZ1cnRoZXIKLQlkb3duIGluIEBmaWxle2JmZC5ofSwgYW5kIGFyZSBhbHNvIHVzZWQgd2hlbiBjYWxsaW5nIHZhcmlvdXMKLQlyb3V0aW5lcyBieSBoYW5kIGluc2lkZSB0aGUgQkZEIGltcGxlbWVudGF0aW9uLiAgVGhlIEB2YXJ7YXJnbGlzdH0KLQlhcmd1bWVudCBtdXN0IGJlIHBhcmVudGhlc2l6ZWQ7IGl0IGNvbnRhaW5zIGFsbCB0aGUgYXJndW1lbnRzCi0JdG8gdGhlIGNhbGxlZCBmdW5jdGlvbi4gCi0KLQlUaGV5IG1ha2UgdGhlIGRvY3VtZW50YXRpb24gKG1vcmUpIHVucGxlYXNhbnQgdG8gcmVhZCwgc28gaWYKLQlzb21lb25lIHdhbnRzIHRvIGZpeCB0aGlzIGFuZCBub3QgYnJlYWsgdGhlIGFib3ZlLCBwbGVhc2UgZG8uCi0KLS4jZGVmaW5lIEJGRF9TRU5EKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotLiAgICAgICAgICAgICAgICgoKigoYmZkKS0+eHZlYy0+bWVzc2FnZSkpIGFyZ2xpc3QpCi0uCi0uI2lmZGVmIERFQlVHX0JGRF9TRU5ECi0uI3VuZGVmIEJGRF9TRU5ECi0uI2RlZmluZSBCRkRfU0VORChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLS4gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAotLiAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KSA6IFwKLS4gICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCi0uI2VuZGlmCi0KLQlGb3Igb3BlcmF0aW9ucyB3aGljaCBpbmRleCBvbiB0aGUgQkZEIGZvcm1hdDoKLQotLiNkZWZpbmUgQkZEX1NFTkRfRk1UKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotLiAgICAgICAgICAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KQotLgotLiNpZmRlZiBERUJVR19CRkRfU0VORAotLiN1bmRlZiBCRkRfU0VORF9GTVQKLS4jZGVmaW5lIEJGRF9TRU5EX0ZNVChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLS4gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAotLiAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KSA6IFwKLS4gICAoYmZkX2Fzc2VydCAoX19GSUxFX18sX19MSU5FX18pLCBOVUxMKSkKLS4jZW5kaWYKLQotCVRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3aGljaCBkZWZpbmVzIHRoZSB0eXBlIG9mIEJGRCB0aGlzIGlzLiAgVGhlCi0JPDx4dmVjPj4gbWVtYmVyIG9mIHRoZSBzdHJ1Y3QgPDxiZmQ+PiBpdHNlbGYgcG9pbnRzIGhlcmUuICBFYWNoCi0JbW9kdWxlIHRoYXQgaW1wbGVtZW50cyBhY2Nlc3MgdG8gYSBkaWZmZXJlbnQgdGFyZ2V0IHVuZGVyIEJGRCwKLQlkZWZpbmVzIG9uZSBvZiB0aGVzZS4KLQotCi0JRklYTUUsIHRoZXNlIG5hbWVzIHNob3VsZCBiZSByYXRpb25hbGlzZWQgd2l0aCB0aGUgbmFtZXMgb2YKLQl0aGUgZW50cnkgcG9pbnRzIHdoaWNoIGNhbGwgdGhlbS4gVG9vIGJhZCB3ZSBjYW4ndCBoYXZlIG9uZQotCW1hY3JvIHRvIGRlZmluZSB0aGVtIGJvdGghIAotCi0uZW51bSBiZmRfZmxhdm91ciB7Ci0uICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF90ZWtoZXhfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9paGV4X2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9vczlrX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X292YXhfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyCi0ufTsKLS4KLS5lbnVtIGJmZF9lbmRpYW4geyBCRkRfRU5ESUFOX0JJRywgQkZEX0VORElBTl9MSVRUTEUsIEJGRF9FTkRJQU5fVU5LTk9XTiB9OwotLgotLnsqIEZvcndhcmQgZGVjbGFyYXRpb24uICAqfQotLnR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2luZm8gX2JmZF9saW5rX2luZm87Ci0uCi0udHlwZWRlZiBzdHJ1Y3QgYmZkX3RhcmdldAotLnsKLQotSWRlbnRpZmllcyB0aGUga2luZCBvZiB0YXJnZXQsIGUuZy4sIFN1bk9TNCwgVWx0cml4LCBldGMuCi0KLS4gIGNoYXIgKm5hbWU7Ci0KLVRoZSAiZmxhdm91ciIgb2YgYSBiYWNrIGVuZCBpcyBhIGdlbmVyYWwgaW5kaWNhdGlvbiBhYm91dCB0aGUgY29udGVudHMKLW9mIGEgZmlsZS4KLQotLiAgZW51bSBiZmRfZmxhdm91ciBmbGF2b3VyOwotCi1UaGUgb3JkZXIgb2YgYnl0ZXMgd2l0aGluIHRoZSBkYXRhIGFyZWEgb2YgYSBmaWxlLgotCi0uICBlbnVtIGJmZF9lbmRpYW4gYnl0ZW9yZGVyOwotCi1UaGUgb3JkZXIgb2YgYnl0ZXMgd2l0aGluIHRoZSBoZWFkZXIgcGFydHMgb2YgYSBmaWxlLgotCi0uICBlbnVtIGJmZF9lbmRpYW4gaGVhZGVyX2J5dGVvcmRlcjsKLQotQSBtYXNrIG9mIGFsbCB0aGUgZmxhZ3Mgd2hpY2ggYW4gZXhlY3V0YWJsZSBtYXkgaGF2ZSBzZXQgLQotZnJvbSB0aGUgc2V0IDw8QkZEX05PX0ZMQUdTPj4sIDw8SEFTX1JFTE9DPj4sIC4uLjw8RF9QQUdFRD4+LgotCi0uICBmbGFnd29yZCBvYmplY3RfZmxhZ3M7ICAgICAgIAotCi1BIG1hc2sgb2YgYWxsIHRoZSBmbGFncyB3aGljaCBhIHNlY3Rpb24gbWF5IGhhdmUgc2V0IC0gZnJvbQotdGhlIHNldCA8PFNFQ19OT19GTEFHUz4+LCA8PFNFQ19BTExPQz4+LCAuLi48PFNFVF9ORVZFUl9MT0FEPj4uCi0KLS4gIGZsYWd3b3JkIHNlY3Rpb25fZmxhZ3M7Ci0KLVRoZSBjaGFyYWN0ZXIgbm9ybWFsbHkgZm91bmQgYXQgdGhlIGZyb250IG9mIGEgc3ltYm9sIAotKGlmIGFueSksIHBlcmhhcHMgYF8nLgotCi0uICBjaGFyIHN5bWJvbF9sZWFkaW5nX2NoYXI7Ci0KLVRoZSBwYWQgY2hhcmFjdGVyIGZvciBmaWxlIG5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlci4KLQotLiAgY2hhciBhcl9wYWRfY2hhcjsgICAgICAgICAgICAKLQotVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIuCi0KLS4gIHVuc2lnbmVkIHNob3J0IGFyX21heF9uYW1lbGVuOwotCi1FbnRyaWVzIGZvciBieXRlIHN3YXBwaW5nIGZvciBkYXRhLiBUaGVzZSBhcmUgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyCi1lbnRyeSBwb2ludHMsIHNpbmNlIHRoZXkgZG9uJ3QgdGFrZSBhIEJGRCBhc3RoZSBmaXJzdCBhcmd1bWVudC4KLUNlcnRhaW4gb3RoZXIgaGFuZGxlcnMgY291bGQgZG8gdGhlIHNhbWUuCi0KLS4gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4NjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHgxNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLQotQnl0ZSBzd2FwcGluZyBmb3IgdGhlIGhlYWRlcnMKLQotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4NjQpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLS4gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHgzMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDMyKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4MTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHgxNikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotCi1Gb3JtYXQgZGVwZW5kZW50IHJvdXRpbmVzOiB0aGVzZSBhcmUgdmVjdG9ycyBvZiBlbnRyeSBwb2ludHMKLXdpdGhpbiB0aGUgdGFyZ2V0IHZlY3RvciBzdHJ1Y3R1cmUsIG9uZSBmb3IgZWFjaCBmb3JtYXQgdG8gY2hlY2suCi0KLUNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQuICBSZXR1cm4gYSA8PGJmZF90YXJnZXQgKj4+IG9yIHplcm8uIAotCi0uICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqKCpfYmZkX2NoZWNrX2Zvcm1hdFtiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotCi1TZXQgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgd3JpdHRlbi4gIAotCi0uICBib29sZWFuICAgICAgICAgICAgICgqX2JmZF9zZXRfZm9ybWF0W2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLVdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuLCBhdCA8PGJmZF9jbG9zZT4+LiAKLQotLiAgYm9vbGVhbiAgICAgICAgICAgICAoKl9iZmRfd3JpdGVfY29udGVudHNbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLQotVGhlIGdlbmVyYWwgdGFyZ2V0IHZlY3Rvci4gIFRoZXNlIHZlY3RvcnMgYXJlIGluaXRpYWxpemVkIHVzaW5nIHRoZQotQkZEX0pVTVBfVEFCTEUgbWFjcm9zLgotCi0uCi0uICB7KiBHZW5lcmljIGVudHJ5IHBvaW50cy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9HRU5FUklDKE5BTUUpXAotLkNBVChOQU1FLF9jbG9zZV9hbmRfY2xlYW51cCksXAotLkNBVChOQU1FLF9iZmRfZnJlZV9jYWNoZWRfaW5mbyksXAotLkNBVChOQU1FLF9uZXdfc2VjdGlvbl9ob29rKSxcCi0uQ0FUKE5BTUUsX2dldF9zZWN0aW9uX2NvbnRlbnRzKSxcCi0uQ0FUKE5BTUUsX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykKLS4KLS4gIHsqIENhbGxlZCB3aGVuIHRoZSBCRkQgaXMgYmVpbmcgY2xvc2VkIHRvIGRvIGFueSBuZWNlc3NhcnkgY2xlYW51cC4gICp9Ci0uICBib29sZWFuICAgICAgICgqX2Nsb3NlX2FuZF9jbGVhbnVwKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogQXNrIHRoZSBCRkQgdG8gZnJlZSBhbGwgY2FjaGVkIGluZm9ybWF0aW9uLiAgKn0KLS4gIGJvb2xlYW4gKCpfYmZkX2ZyZWVfY2FjaGVkX2luZm8pIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICB7KiBDYWxsZWQgd2hlbiBhIG5ldyBzZWN0aW9uIGlzIGNyZWF0ZWQuICAqfQotLiAgYm9vbGVhbiAgICAgICAoKl9uZXdfc2VjdGlvbl9ob29rKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOwotLiAgeyogUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLCAKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpCi0uICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgYmZkX3dpbmRvdyAqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLS4KLS4gIHsqIEVudHJ5IHBvaW50cyB0byBjb3B5IHByaXZhdGUgZGF0YS4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9DT1BZKE5BTUUpXAotLkNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKSxcCi0uQ0FUKE5BTUUsX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKSxcCi0uQ0FUKE5BTUUsX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKSxcCi0uQ0FUKE5BTUUsX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpLFwKLS5DQVQoTkFNRSxfYmZkX3NldF9wcml2YXRlX2ZsYWdzKSxcCi0uQ0FUKE5BTUUsX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKVwKLS4gIHsqIENhbGxlZCB0byBjb3B5IEJGRCBnZW5lcmFsIHByaXZhdGUgZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotLiAgICAgdG8gYW5vdGhlci4gICp9Ci0uICBib29sZWFuCSAoKl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLS4gIHsqIENhbGxlZCB0byBtZXJnZSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLS4gICAgIHRvIGEgY29tbW9uIG91dHB1dCBmaWxlIHdoZW4gbGlua2luZy4gICp9Ci0uICBib29sZWFuCSAoKl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0uICB7KiBDYWxsZWQgdG8gY29weSBCRkQgcHJpdmF0ZSBzZWN0aW9uIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLS4gICAgIHRvIGFub3RoZXIuICAqfQotLiAgYm9vbGVhbiAgICAgICAoKl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSkgUEFSQU1TICgoYmZkICosIHNlY19wdHIsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqLCBzZWNfcHRyKSk7Ci0uICB7KiBDYWxsZWQgdG8gY29weSBCRkQgcHJpdmF0ZSBzeW1ib2wgZGF0YSBmcm9tIG9uZSBzeW1ib2wgCi0uICAgICB0byBhbm90aGVyLiAgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSkgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLS4JCQkJCQkJICAgYmZkICosIGFzeW1ib2wgKikpOwotLiAgeyogQ2FsbGVkIHRvIHNldCBwcml2YXRlIGJhY2tlbmQgZmxhZ3MgKn0KLS4gIGJvb2xlYW4JICgqX2JmZF9zZXRfcHJpdmF0ZV9mbGFncykgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci0uCi0uICB7KiBDYWxsZWQgdG8gcHJpbnQgcHJpdmF0ZSBCRkQgZGF0YSAqfQotLiAgYm9vbGVhbiAgICAgICAoKl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIFBUUikpOwotLgotLiAgeyogQ29yZSBmaWxlIGVudHJ5IHBvaW50cy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9DT1JFKE5BTUUpXAotLkNBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKSxcCi0uQ0FUKE5BTUUsX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCksXAotLkNBVChOQU1FLF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0uICBjaGFyICogICAoKl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKSBQQVJBTVMgKChiZmQgKikpOwotLiAgaW50ICAgICAgKCpfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKSBQQVJBTVMgKChiZmQgKikpOwotLiAgYm9vbGVhbiAgKCpfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLS4KLS4gIHsqIEFyY2hpdmUgZW50cnkgcG9pbnRzLiAgKn0KLS4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUoTkFNRSlcCi0uQ0FUKE5BTUUsX3NsdXJwX2FybWFwKSxcCi0uQ0FUKE5BTUUsX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpLFwKLS5DQVQoTkFNRSxfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpLFwKLS5DQVQoTkFNRSxfdHJ1bmNhdGVfYXJuYW1lKSxcCi0uQ0FUKE5BTUUsX3dyaXRlX2FybWFwKSxcCi0uQ0FUKE5BTUUsX3JlYWRfYXJfaGRyKSxcCi0uQ0FUKE5BTUUsX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSksXAotLkNBVChOQU1FLF9nZXRfZWx0X2F0X2luZGV4KSxcCi0uQ0FUKE5BTUUsX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCksXAotLkNBVChOQU1FLF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKQotLiAgYm9vbGVhbiAgKCpfYmZkX3NsdXJwX2FybWFwKSBQQVJBTVMgKChiZmQgKikpOwotLiAgYm9vbGVhbiAgKCpfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBib29sZWFuICAoKl9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpCi0uICAgICAgICAgICAgIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKLS4gIHZvaWQgICAgICgqX2JmZF90cnVuY2F0ZV9hcm5hbWUpIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosIGNoYXIgKikpOwotLiAgYm9vbGVhbiAgKCp3cml0ZV9hcm1hcCkgUEFSQU1TICgoYmZkICphcmNoLCAKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3JsICptYXAsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkeCkpOwotLiAgUFRSICgqX2JmZF9yZWFkX2FyX2hkcl9mbikgUEFSQU1TICgoYmZkICopKTsKLS4gIGJmZCAqICAgICgqb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKSBQQVJBTVMgKChiZmQgKmFyY2gsIGJmZCAqcHJldikpOwotLiNkZWZpbmUgYmZkX2dldF9lbHRfYXRfaW5kZXgoYixpKSBCRkRfU0VORChiLCBfYmZkX2dldF9lbHRfYXRfaW5kZXgsIChiLGkpKQotLiAgYmZkICogICAgKCpfYmZkX2dldF9lbHRfYXRfaW5kZXgpIFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpOwotLiAgaW50ICAgICAgKCpfYmZkX3N0YXRfYXJjaF9lbHQpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0uICBib29sZWFuICAoKl9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkgUEFSQU1TICgoYmZkICopKTsKLS4KLS4gIHsqIEVudHJ5IHBvaW50cyB1c2VkIGZvciBzeW1ib2xzLiAgKn0KLS4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMoTkFNRSlcCi0uQ0FUKE5BTUUsX2dldF9zeW10YWJfdXBwZXJfYm91bmQpLFwKLS5DQVQoTkFNRSxfZ2V0X3N5bXRhYiksXAotLkNBVChOQU1FLF9tYWtlX2VtcHR5X3N5bWJvbCksXAotLkNBVChOQU1FLF9wcmludF9zeW1ib2wpLFwKLS5DQVQoTkFNRSxfZ2V0X3N5bWJvbF9pbmZvKSxcCi0uQ0FUKE5BTUUsX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKSxcCi0uQ0FUKE5BTUUsX2dldF9saW5lbm8pLFwKLS5DQVQoTkFNRSxfZmluZF9uZWFyZXN0X2xpbmUpLFwKLS5DQVQoTkFNRSxfYmZkX21ha2VfZGVidWdfc3ltYm9sKSxcCi0uQ0FUKE5BTUUsX3JlYWRfbWluaXN5bWJvbHMpLFwKLS5DQVQoTkFNRSxfbWluaXN5bWJvbF90b19zeW1ib2wpCi0uICBsb25nICAoKl9iZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiKSBQQVJBTVMgKChiZmQgKiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0uICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICAqCi0uICAgICAgICAgICAgICAgICgqX2JmZF9tYWtlX2VtcHR5X3N5bWJvbCkgUEFSQU1TICgoYmZkICopKTsKLS4gIHZvaWQgICAgICAgICAgKCpfYmZkX3ByaW50X3N5bWJvbCkgUEFSQU1TICgoYmZkICosIFBUUiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotLiNkZWZpbmUgYmZkX3ByaW50X3N5bWJvbChiLHAscyxlKSBCRkRfU0VORChiLCBfYmZkX3ByaW50X3N5bWJvbCwgKGIscCxzLGUpKQotLiAgdm9pZCAgICAgICAgICAoKl9iZmRfZ2V0X3N5bWJvbF9pbmZvKSBQQVJBTVMgKChiZmQgKiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9pbmZvICopKTsKLS4jZGVmaW5lIGJmZF9nZXRfc3ltYm9sX2luZm8oYixwLGUpIEJGRF9TRU5EKGIsIF9iZmRfZ2V0X3N5bWJvbF9pbmZvLCAoYixwLGUpKQotLiAgYm9vbGVhbgkgKCpfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLS4KLS4gIGFsZW50ICogICAgKCpfZ2V0X2xpbmVubykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKikpOwotLiAgYm9vbGVhbiAgICAoKl9iZmRfZmluZF9uZWFyZXN0X2xpbmUpIFBBUkFNUyAoKGJmZCAqYWJmZCwKLS4gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZWMgKnNlY3Rpb24sIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1ib2xzLAotLiAgICAgICAgICAgICAgICAgICAgYmZkX3ZtYSBvZmZzZXQsIENPTlNUIGNoYXIgKipmaWxlLCBDT05TVCBjaGFyICoqZnVuYywKLS4gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbGluZSkpOwotLiB7KiBCYWNrLWRvb3IgdG8gYWxsb3cgZm9ybWF0LWF3YXJlIGFwcGxpY2F0aW9ucyB0byBjcmVhdGUgZGVidWcgc3ltYm9scwotLiAgICB3aGlsZSB1c2luZyBCRkQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4gIEN1cnJlbnRseSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIKLS4gICAgd2hlbiBjcmVhdGluZyBDT0ZGIGZpbGVzLiAgKn0KLS4gIGFzeW1ib2wgKiAgKCpfYmZkX21ha2VfZGVidWdfc3ltYm9sKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICB2b2lkICpwdHIsCi0uICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkpOwotLiNkZWZpbmUgYmZkX3JlYWRfbWluaXN5bWJvbHMoYiwgZCwgbSwgcykgXAotLiAgQkZEX1NFTkQgKGIsIF9yZWFkX21pbmlzeW1ib2xzLCAoYiwgZCwgbSwgcykpCi0uICBsb25nICAoKl9yZWFkX21pbmlzeW1ib2xzKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKikpOwotLiNkZWZpbmUgYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sKGIsIGQsIG0sIGYpIFwKLS4gIEJGRF9TRU5EIChiLCBfbWluaXN5bWJvbF90b19zeW1ib2wsIChiLCBkLCBtLCBmKSkKLS4gIGFzeW1ib2wgKigqX21pbmlzeW1ib2xfdG9fc3ltYm9sKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY29uc3QgUFRSLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW1ib2wgKikpOwotLgotLiAgeyogUm91dGluZXMgZm9yIHJlbG9jcy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MoTkFNRSlcCi0uQ0FUKE5BTUUsX2dldF9yZWxvY191cHBlcl9ib3VuZCksXAotLkNBVChOQU1FLF9jYW5vbmljYWxpemVfcmVsb2MpLFwKLS5DQVQoTkFNRSxfYmZkX3JlbG9jX3R5cGVfbG9va3VwKQotLiAgbG9uZyAgKCpfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOwotLiAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIGFyZWxlbnQgKiosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0uICB7KiBTZWUgZG9jdW1lbnRhdGlvbiBvbiByZWxvYyB0eXBlcy4gICp9Ci0uICByZWxvY19ob3d0b190eXBlICoKLS4gICAgICAgKCpyZWxvY190eXBlX2xvb2t1cCkgUEFSQU1TICgoYmZkICphYmZkLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotLgotLiAgeyogUm91dGluZXMgdXNlZCB3aGVuIHdyaXRpbmcgYW4gb2JqZWN0IGZpbGUuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfV1JJVEUoTkFNRSlcCi0uQ0FUKE5BTUUsX3NldF9hcmNoX21hY2gpLFwKLS5DQVQoTkFNRSxfc2V0X3NlY3Rpb25fY29udGVudHMpCi0uICBib29sZWFuICAgICgqX2JmZF9zZXRfYXJjaF9tYWNoKSBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotLiAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZykpOwotLiAgYm9vbGVhbiAgICAgICAoKl9iZmRfc2V0X3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotLgotLiAgeyogUm91dGluZXMgdXNlZCBieSB0aGUgbGlua2VyLiAgKn0KLS4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0xJTksoTkFNRSlcCi0uQ0FUKE5BTUUsX3NpemVvZl9oZWFkZXJzKSxcCi0uQ0FUKE5BTUUsX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpLFwKLS5DQVQoTkFNRSxfYmZkX3JlbGF4X3NlY3Rpb24pLFwKLS5DQVQoTkFNRSxfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpLFwKLS5DQVQoTkFNRSxfYmZkX2xpbmtfYWRkX3N5bWJvbHMpLFwKLS5DQVQoTkFNRSxfYmZkX2ZpbmFsX2xpbmspLFwKLS5DQVQoTkFNRSxfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiksXAotLkNBVChOQU1FLF9iZmRfZ2Nfc2VjdGlvbnMpCi0uICBpbnQgICAgICAgICgqX2JmZF9zaXplb2ZfaGVhZGVycykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLS4gIGJmZF9ieXRlICogKCpfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosCi0uICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLS4gICAgICAgICAgICAgICAgICAgIGJmZF9ieXRlICpkYXRhLCBib29sZWFuIHJlbG9jYXRlYWJsZSwKLS4gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLS4KLS4gIGJvb2xlYW4gICAgKCpfYmZkX3JlbGF4X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICosCi0uICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICphZ2FpbikpOwotLgotLiAgeyogQ3JlYXRlIGEgaGFzaCB0YWJsZSBmb3IgdGhlIGxpbmtlci4gIERpZmZlcmVudCBiYWNrZW5kcyBzdG9yZQotLiAgICAgZGlmZmVyZW50IGluZm9ybWF0aW9uIGluIHRoaXMgdGFibGUuICAqfQotLiAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKigqX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKSBQQVJBTVMgKChiZmQgKikpOwotLgotLiAgeyogQWRkIHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCBmaWxlIGludG8gdGhlIGhhc2ggdGFibGUuICAqfQotLiAgYm9vbGVhbiAoKl9iZmRfbGlua19hZGRfc3ltYm9scykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLS4KLS4gIHsqIERvIGEgbGluayBiYXNlZCBvbiB0aGUgbGlua19vcmRlciBzdHJ1Y3R1cmVzIGF0dGFjaGVkIHRvIGVhY2gKLS4gICAgIHNlY3Rpb24gb2YgdGhlIEJGRC4gICp9Ci0uICBib29sZWFuICgqX2JmZF9maW5hbF9saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotLgotLiAgeyogU2hvdWxkIHRoaXMgc2VjdGlvbiBiZSBzcGxpdCB1cCBpbnRvIHNtYWxsZXIgcGllY2VzIGR1cmluZyBsaW5raW5nLiAgKn0KLS4gIGJvb2xlYW4gKCpfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpOwotLgotLiAgeyogUmVtb3ZlIHNlY3Rpb25zIHRoYXQgYXJlIG5vdCByZWZlcmVuY2VkIGZyb20gdGhlIG91dHB1dC4gICp9Ci0uICBib29sZWFuICgqX2JmZF9nY19zZWN0aW9ucykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLS4KLS4gIHsqIFJvdXRpbmVzIHRvIGhhbmRsZSBkeW5hbWljIHN5bWJvbHMgYW5kIHJlbG9jcy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDKE5BTUUpXAotLkNBVChOQU1FLF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpLFwKLS5DQVQoTkFNRSxfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKSxcCi0uQ0FUKE5BTUUsX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSxcCi0uQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKQotLiAgeyogR2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgc3ltYm9scy4gKn0KLS4gIGxvbmcgICgqX2JmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICB7KiBSZWFkIGluIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqfQotLiAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYikKLS4gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLS4gIHsqIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHJlbG9jcy4gICp9Ci0uICBsb25nICAoKl9iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICB7KiBSZWFkIGluIHRoZSBkeW5hbWljIHJlbG9jcy4gICp9Ci0uICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpCi0uICAgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0uCi0KLUEgcG9pbnRlciB0byBhbiBhbHRlcm5hdGl2ZSBiZmRfdGFyZ2V0IGluIGNhc2UgdGhlIGN1cnJlbnQgb25lIGlzIG5vdAotc2F0aXNmYWN0b3J5LiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIHRhcmdldCBjcHUgc3VwcG9ydHMgYm90aCBiaWcKLWFuZCBsaXR0bGUgZW5kaWFuIGNvZGUsIGFuZCB0YXJnZXQgY2hvc2VuIGJ5IHRoZSBsaW5rZXIgaGFzIHRoZSB3cm9uZwotZW5kaWFubmVzcy4gIFRoZSBmdW5jdGlvbiBvcGVuX291dHB1dCgpIGluIGxkL2xkbGFuZy5jIHVzZXMgdGhpcyBmaWVsZAotdG8gZmluZCBhbiBhbHRlcm5hdGl2ZSBvdXRwdXQgZm9ybWF0IHRoYXQgaXMgc3VpdGFibGUuCi0KLS4geyogT3Bwb3NpdGUgZW5kaWFuIHZlcnNpb24gb2YgdGhpcyB0YXJnZXQuICAqfSAgCi0uIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICogYWx0ZXJuYXRpdmVfdGFyZ2V0OwotLiAKLQotRGF0YSBmb3IgdXNlIGJ5IGJhY2stZW5kIHJvdXRpbmVzLCB3aGljaCBpc24ndCBnZW5lcmljIGVub3VnaCB0byBiZWxvbmcKLWluIHRoaXMgc3RydWN0dXJlLgotCi0uIFBUUiBiYWNrZW5kX2RhdGE7Ci0uIAotLn0gYmZkX3RhcmdldDsKLQotKi8KLQotLyogQWxsIGtub3duIHh2ZWNzIChldmVuIHRob3NlIHRoYXQgZG9uJ3QgY29tcGlsZSBvbiBhbGwgc3lzdGVtcykuCi0gICBBbHBoYWJldGl6ZWQgZm9yIGVhc3kgcmVmZXJlbmNlLgotICAgVGhleSBhcmUgbGlzdGVkIGEgc2Vjb25kIHRpbWUgYmVsb3csIHNpbmNlCi0gICB3ZSBjYW4ndCBpbnRlcm1peCBleHRlcm4ncyBhbmQgaW5pdGlhbGl6ZXJzLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGEyOWtjb2ZmX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhX291dF9hZG9iZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhb3V0X2FybV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfbWlwc19iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9taXBzX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhb3V0MF9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXBvbGxvY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1jb2ZmX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1jb2ZmX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1uZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtcGVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybXBlX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1wZWlfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybXBlaV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybV9lcG9jX3BlX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybV9lcG9jX3BlaV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2JpZ19ob3N0OwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2xpdHRsZV9ob3N0OwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2FscGhhX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9iaWdhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ2FybV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZWFyY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ21pcHNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2QxMHZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2QzMHZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2hwcGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2kzODZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2k4NjBfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2k5NjBfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tMzJyX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tNjhrX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tODhrX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tbjEwMjAwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tbjEwMzAwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wal92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfcGpsX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wb3dlcnBjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3NoX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9zaGxfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3NwYXJjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl92ODUwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9mcjMwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9zcGFyY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBkZW1vXzY0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBlY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZWNvZmZfYmlnbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGg4MzAwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBoODUwMGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaG9zdF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwMzAwYnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwMzAwaHB1eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzb21fdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmFvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2ZHluaXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmZyZWVic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm9zOWtfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNfcGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNsZV9wZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfcG93ZXJwY19wZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNsZV9wZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NnBlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZwZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZ28zMmNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZ28zMnN0dWJiZWRjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZsaW51eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bHlueF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZseW54X2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm1hY2gzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZtc2Rvc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bmV0YnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGk4NjBjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGljb2ZmX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWVlZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrYXV4X2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2NvZmZ1bl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbGludXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2x5bnhfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbHlueF9jb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a3N5c3Zjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGs0a25ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtODhrYmNzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG04OGttYWNoM192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtY29yZV9wZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG1jb3JlX3BlaV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVpX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBuZXdzb3MzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG5sbTMyX2kzODZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfc3BhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfYWxwaGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfcG93ZXJwY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwYzUzMm5ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBvYXN5c192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwYzUzMm1hY2hhb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBwY2Jvb3RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcmlzY2l4X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBtYWNfeGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcnM2MDAwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfc21hbGxfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2xlX2FvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNsaW51eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2x5bnhfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2x5bnhfY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY25ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3Vub3NfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRla2hleF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0aWMzMF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRpYzMwX2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdGljODBjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHZheG5ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB2ZXJzYWRvc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB2bXNfYWxwaGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdm1zX3ZheF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB3ZTMya2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdzY1X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHo4a2NvZmZfdmVjOwotCi0vKiBzcmVjIGlzIGFsd2F5cyBpbmNsdWRlZC4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcmVjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHN5bWJvbHNyZWNfdmVjOwotCi0vKiBiaW5hcnkgaXMgYWx3YXlzIGluY2x1ZGVkLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJpbmFyeV92ZWM7Ci0KLS8qIGloZXggaXMgYWx3YXlzIGluY2x1ZGVkLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGloZXhfdmVjOwotCi0vKiBBbGwgb2YgdGhlIHh2ZWNzIGZvciBjb3JlIGZpbGVzLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFpeDM4Nl9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGNpc2NvX2NvcmVfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGNpc2NvX2NvcmVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwdXhfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBocHBhYnNkX2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaXJpeF9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG5ldGJzZF9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG9zZl9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHNjbzVfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0cmFkX2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcHRyYWNlX2NvcmVfdmVjOwotCi1jb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgYmZkX3RhcmdldF92ZWN0b3JbXSA9IHsKLQotI2lmZGVmIFNFTEVDVF9WRUNTCi0KLQlTRUxFQ1RfVkVDUywKLQotI2Vsc2UgLyogbm90IFNFTEVDVF9WRUNTICovCi0KLSNpZmRlZiBERUZBVUxUX1ZFQ1RPUgotCSZERUZBVUxUX1ZFQ1RPUiwKLSNlbmRpZgotCS8qIFRoaXMgbGlzdCBpcyBhbHBoYWJldGl6ZWQgdG8gbWFrZSBpdCBlYXN5IHRvIGNvbXBhcmUKLQkgICB3aXRoIG90aGVyIHZlY3RvciBsaXN0cyAtLSB0aGUgZGVjbHMgYWJvdmUgYW5kCi0JICAgdGhlIGNhc2Ugc3RhdGVtZW50IGluIGNvbmZpZ3VyZS5pbi4KLQkgICBWZWN0b3JzIHRoYXQgZG9uJ3QgY29tcGlsZSBvbiBhbGwgc3lzdGVtcywgb3IgYXJlbid0IGZpbmlzaGVkLAotCSAgIHNob3VsZCBoYXZlIGFuIGVudHJ5IGhlcmUgd2l0aCAjaWYgMCBhcm91bmQgaXQsIHRvIHNob3cgdGhhdAotCSAgIGl0IHdhc24ndCBvbWl0dGVkIGJ5IG1pc3Rha2UuICAqLwotCSZhMjlrY29mZl9iaWdfdmVjLAotCSZhX291dF9hZG9iZV92ZWMsCi0jaWYgMAkJCQkvKiBObyBvbmUgc2VlbXMgdG8gdXNlIHRoaXMuICAqLwotCSZhb3V0X21pcHNfYmlnX3ZlYywKLSNlbmRpZgotCSZhb3V0X21pcHNfbGl0dGxlX3ZlYywKLQkmYl9vdXRfdmVjX2JpZ19ob3N0LAotCSZiX291dF92ZWNfbGl0dGxlX2hvc3QsCi0KLQkvKiBUaGlzLCBhbmQgb3RoZXIgdmVjdG9ycywgbWF5IG5vdCBiZSB1c2VkIGluIGFueSAqLm10IGNvbmZpZ3VyYXRpb24uCi0JICAgQnV0IHRoYXQgZG9lcyBub3QgbWVhbiB0aGV5IGFyZSB1bm5lY2Vzc2FyeS4gIElmIGNvbmZpZ3VyZWQgd2l0aAotCSAgIC0tZW5hYmxlLXRhcmdldHM9YWxsLCBvYmpkdW1wIG9yIGdkYiBzaG91bGQgYmUgYWJsZSB0byBleGFtaW5lCi0JICAgdGhlIGZpbGUgZXZlbiBpZiB3ZSBkb24ndCByZWNvZ25pemUgdGhlIG1hY2hpbmUgdHlwZS4gICovCi0JJmJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMsCi0jaWZkZWYgQkZENjQKLQkmYmZkX2VsZjY0X2FscGhhX3ZlYywKLSNlbmRpZgotCSZiZmRfZWxmMzJfYmlnYXJjX3ZlYywKLSAgICAgICAgJmJmZF9lbGYzMl9iaWdhcm1fdmVjLAotICAgICAgICAmYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYywKLQkmYmZkX2VsZjMyX2JpZ21pcHNfdmVjLAotI2lmZGVmIEJGRDY0Ci0JJmJmZF9lbGY2NF9iaWdtaXBzX3ZlYywKLSNlbmRpZgotCSZiZmRfZWxmMzJfZDEwdl92ZWMsCi0JJmJmZF9lbGYzMl9kMzB2X3ZlYywKLQkmYmZkX2VsZjMyX2hwcGFfdmVjLAotCSZiZmRfZWxmMzJfaTM4Nl92ZWMsCi0JJmJmZF9lbGYzMl9pODYwX3ZlYywKLQkmYmZkX2VsZjMyX2k5NjBfdmVjLAotCSZiZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjLAotCSZiZmRfZWxmMzJfbGl0dGxlYXJjX3ZlYywKLSAgICAgICAgJmJmZF9lbGYzMl9saXR0bGVhcm1fdmVjLAotICAgICAgICAmYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYywKLQkmYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjLAotI2lmZGVmIEJGRDY0Ci0JJmJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYywKLSNlbmRpZgotCSZiZmRfZWxmMzJfbTMycl92ZWMsCi0JJmJmZF9lbGYzMl9tbjEwMjAwX3ZlYywKLQkmYmZkX2VsZjMyX21uMTAzMDBfdmVjLAotCSZiZmRfZWxmMzJfbTY4a192ZWMsCi0JJmJmZF9lbGYzMl9tODhrX3ZlYywKLQkmYmZkX2VsZjMyX3NwYXJjX3ZlYywKLQkmYmZkX2VsZjMyX3BqX3ZlYywKLQkmYmZkX2VsZjMyX3BqbF92ZWMsCi0JJmJmZF9lbGYzMl9wb3dlcnBjX3ZlYywKLQkmYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMsCi0JJmJmZF9lbGYzMl92ODUwX3ZlYywKLQkmYmZkX2VsZjMyX2ZyMzBfdmVjLAotCSZiZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYywKLQkmYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMsCi0jaWZkZWYgQkZENjQJCQkvKiBObyBvbmUgc2VlbXMgdG8gdXNlIHRoaXMuICAqLwotCSZiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjLAotCSZiZmRfZWxmNjRfbGl0dGxlX2dlbmVyaWNfdmVjLAotI2VuZGlmCi0jaWYgMAotCSZiZmRfZWxmNjRfc3BhcmNfdmVjLAotI2VuZGlmCi0JLyogV2UgZG9uJ3QgaW5jbHVkZSBjaXNjb19jb3JlXypfdmVjLiAgQWx0aG91Z2ggaXQgaGFzIGEgbWFnaWMgbnVtYmVyLAotCSAgIHRoZSBtYWdpYyBudW1iZXIgaXNuJ3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSwgYW5kIHRodXMKLQkgICBtaWdodCBzcHVyaW91c2x5IG1hdGNoIG90aGVyIGtpbmRzIG9mIGZpbGVzLiAgKi8KLSNpZmRlZiBCRkQ2NAotCSZkZW1vXzY0X3ZlYywJLyogT25seSBjb21waWxlZCBpZiBob3N0IGhhcyBsb25nLWxvbmcgc3VwcG9ydCAqLwotI2VuZGlmCi0JJmVjb2ZmX2JpZ192ZWMsCi0JJmVjb2ZmX2xpdHRsZV92ZWMsCi0JJmVjb2ZmX2JpZ2xpdHRsZV92ZWMsCi0jaWZkZWYgQkZENjQKLQkmZWNvZmZhbHBoYV9saXR0bGVfdmVjLAotI2VuZGlmCi0JJmg4MzAwY29mZl92ZWMsCi0JJmg4NTAwY29mZl92ZWMsCi0jaWYgMAotCS8qIFNpbmNlIGEub3V0IGZpbGVzIGxhY2sgZGVjZW50IG1hZ2ljIG51bWJlcnMsIG5vIHdheSB0byByZWNvZ25pemUKLQkgICB3aGljaCBraW5kIG9mIGEub3V0IGZpbGUgaXQgaXMuICAqLwotCSZob3N0X2FvdXRfdmVjLAotI2VuZGlmCi0jaWYgMAkJCQkvKiBDbGFzaGVzIHdpdGggc3Vub3NfYmlnX3ZlYyBtYWdpYyBuby4gICovCi0JJmhwMzAwYnNkX3ZlYywKLSNlbmRpZgotCSZocDMwMGhwdXhfdmVjLAotI2lmIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpIHx8IGRlZmluZWQgKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKQotICAgICAgICAmc29tX3ZlYywKLSNlbmRpZgotCSZpMzg2YW91dF92ZWMsCi0JJmkzODZic2RfdmVjLAotCSZpMzg2Y29mZl92ZWMsCi0JJmkzODZmcmVlYnNkX3ZlYywKLQkmaTg2MGNvZmZfdmVjLAotCSZiZmRfcG93ZXJwY19wZV92ZWMsCi0JJmJmZF9wb3dlcnBjbGVfcGVfdmVjLAotCSZiZmRfcG93ZXJwY19wZWlfdmVjLAotCSZiZmRfcG93ZXJwY2xlX3BlaV92ZWMsCi0JJmdvMzJjb2ZmX3ZlYywKLQkmZ28zMnN0dWJiZWRjb2ZmX3ZlYywKLSNpZiAwCi0JLyogU2luY2UgYS5vdXQgZmlsZXMgbGFjayBkZWNlbnQgbWFnaWMgbnVtYmVycywgbm8gd2F5IHRvIHJlY29nbml6ZQotCSAgIHdoaWNoIGtpbmQgb2YgYS5vdXQgZmlsZSBpdCBpcy4gICovCi0JJmkzODZsaW51eF92ZWMsCi0jZW5kaWYKLQkmaTM4Nmx5bnhfYW91dF92ZWMsCi0JJmkzODZseW54X2NvZmZfdmVjLAotI2lmIDAKLQkvKiBObyBkaXN0aW5ndWlzaGluZyBmZWF0dXJlcyBmb3IgTWFjaCAzIGV4ZWN1dGFibGVzLiAgKi8KLQkmaTM4Nm1hY2gzX3ZlYywKLSNlbmRpZgotCSZpMzg2bXNkb3NfdmVjLAotCSZpMzg2bmV0YnNkX3ZlYywKLQkmaTM4Nm9zOWtfdmVjLAotCSZpMzg2cGVfdmVjLAotCSZpMzg2cGVpX3ZlYywKLQkmYXJtY29mZl9saXR0bGVfdmVjLAotCSZhcm1jb2ZmX2JpZ192ZWMsCi0JJmFybW5ldGJzZF92ZWMsCi0JJmFybXBlX2xpdHRsZV92ZWMsCi0JJmFybXBlX2JpZ192ZWMsCi0JJmFybXBlaV9saXR0bGVfdmVjLAotCSZhcm1wZWlfYmlnX3ZlYywKLQkmYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYywKLQkmYXJtX2Vwb2NfcGVfYmlnX3ZlYywKLQkmYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMsCi0JJmFybV9lcG9jX3BlaV9iaWdfdmVjLAotCSZpY29mZl9iaWdfdmVjLAotCSZpY29mZl9saXR0bGVfdmVjLAotCSZpZWVlX3ZlYywKLQkmbTY4a2NvZmZfdmVjLAotCSZtNjhrY29mZnVuX3ZlYywKLSNpZiAwCi0JLyogU2luY2UgYS5vdXQgZmlsZXMgbGFjayBkZWNlbnQgbWFnaWMgbnVtYmVycywgbm8gd2F5IHRvIHJlY29nbml6ZQotCSAgIHdoaWNoIGtpbmQgb2YgYS5vdXQgZmlsZSBpdCBpcy4gICovCi0JJm02OGtsaW51eF92ZWMsCi0jZW5kaWYKLQkmbTY4a2x5bnhfYW91dF92ZWMsCi0JJm02OGtseW54X2NvZmZfdmVjLAotCSZtNjhrbmV0YnNkX3ZlYywKLQkmbTY4a3N5c3Zjb2ZmX3ZlYywKLQkmbTg4a2Jjc192ZWMsCi0JJm04OGttYWNoM192ZWMsCi0JJm1jb3JlX3BlX2JpZ192ZWMsCi0JJm1jb3JlX3BlX2xpdHRsZV92ZWMsCi0JJm1jb3JlX3BlaV9iaWdfdmVjLAotCSZtY29yZV9wZWlfbGl0dGxlX3ZlYywKLQkmbmV3c29zM192ZWMsCi0JJm5sbTMyX2kzODZfdmVjLAotCSZubG0zMl9zcGFyY192ZWMsCi0jaWZkZWYgQkZENjQKLQkmbmxtMzJfYWxwaGFfdmVjLAotI2VuZGlmCi0JJnBjNTMybmV0YnNkX3ZlYywKLSNpZiAwCi0JLyogV2UgaGF2ZSBubyBvYXN5cyB0b29scyBhbnltb3JlLCBzbyB3ZSBjYW4ndCB0ZXN0IGFueSBvZiB0aGlzCi0JICAgYW55bW9yZS4gSWYgeW91IHdhbnQgdG8gdGVzdCB0aGUgc3R1ZmYgeW91cnNlbGYsIGdvIGFoZWFkLi4uCi0JICAgc3RldmVAY3lnbnVzLmNvbQotCSAgIFdvcnNlLCBzaW5jZSB0aGVyZSBpcyBubyBtYWdpYyBudW1iZXIgZm9yIGFyY2hpdmVzLCB0aGVyZQotCSAgIGNhbiBiZSBhbm5veWluZyB0YXJnZXQgbWlzLW1hdGNoZXMuICAqLwotCSZvYXN5c192ZWMsCi0jZW5kaWYKLQkmcGM1MzJtYWNoYW91dF92ZWMsCi0jaWYgMAotCS8qIFdlIGhhdmUgbm8gd2F5IG9mIGRpc3Rpbmd1aXNoaW5nIHRoZXNlIGZyb20gb3RoZXIgYS5vdXQgdmFyaWFudHMgKi8KLQkmYW91dF9hcm1fYmlnX3ZlYywKLQkmYW91dF9hcm1fbGl0dGxlX3ZlYywKLQkmcmlzY2l4X3ZlYywKLSNlbmRpZgotI2lmIDAKLQkvKiBUaGlzIGhhcyB0aGUgc2FtZSBtYWdpYyBudW1iZXIgYXMgUlMvNjAwMC4gKi8KLQkmcG1hY194Y29mZl92ZWMsCi0jZW5kaWYKLQkmcnM2MDAwY29mZl92ZWMsCi0JJnBwY2Jvb3RfdmVjLAotCSZzaGNvZmZfdmVjLAotCSZzaGxjb2ZmX3ZlYywKLQkmc2hjb2ZmX3NtYWxsX3ZlYywKLQkmc2hsY29mZl9zbWFsbF92ZWMsCi0JJnNwYXJjbGVfYW91dF92ZWMsCi0JJnNwYXJjbGludXhfdmVjLAotCSZzcGFyY2x5bnhfYW91dF92ZWMsCi0JJnNwYXJjbHlueF9jb2ZmX3ZlYywKLQkmc3BhcmNuZXRic2RfdmVjLAotCSZzdW5vc19iaWdfdmVjLAotCSZhb3V0MF9iaWdfdmVjLAotCSZ0aWMzMF9hb3V0X3ZlYywKLQkmdGljMzBfY29mZl92ZWMsCi0JJnRpYzgwY29mZl92ZWMsCi0JJnZheG5ldGJzZF92ZWMsCi0JJnZlcnNhZG9zX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZ2bXNfYWxwaGFfdmVjLAotI2VuZGlmCi0JJnZtc192YXhfdmVjLAotCSZ3ZTMya2NvZmZfdmVjLAotCSZ6OGtjb2ZmX3ZlYywKLQotI2VuZGlmIC8qIG5vdCBTRUxFQ1RfVkVDUyAqLwotCi0vKiBBbHdheXMgc3VwcG9ydCBTLXJlY29yZHMsIGZvciBjb252ZW5pZW5jZS4gICovCi0JJnNyZWNfdmVjLAotCSZzeW1ib2xzcmVjX3ZlYywKLS8qIEFuZCB0ZWtoZXggKi8KLQkmdGVraGV4X3ZlYywKLS8qIExpa2V3aXNlIGZvciBiaW5hcnkgb3V0cHV0LiAgKi8KLQkmYmluYXJ5X3ZlYywKLS8qIExpa2V3aXNlIGZvciBpaGV4LiAgKi8KLQkmaWhleF92ZWMsCi0KLS8qIEFkZCBhbnkgcmVxdWlyZWQgdHJhZGl0aW9uYWwtY29yZS1maWxlLWhhbmRsZXIuICAqLwotCi0jaWZkZWYgQUlYMzg2X0NPUkUKLQkmYWl4Mzg2X2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgSFBVWF9DT1JFCi0JJmhwdXhfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZiBIUFBBQlNEX0NPUkUKLQkmaHBwYWJzZF9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmIElSSVhfQ09SRQotCSZpcml4X2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgTkVUQlNEX0NPUkUKLQkmbmV0YnNkX2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgT1NGX0NPUkUKLQkmb3NmX2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgU0NPNV9DT1JFCi0JJnNjbzVfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZglUUkFEX0NPUkUKLQkmdHJhZF9jb3JlX3ZlYywKLSNlbmRpZgotCi0jaWZkZWYJUFRSQUNFX0NPUkUKLQkmcHRyYWNlX2NvcmVfdmVjLAotI2VuZGlmCi0KLQlOVUxMIC8qIGVuZCBvZiBsaXN0IG1hcmtlciAqLwotfTsKLQotLyogYmZkX2RlZmF1bHRfdmVjdG9yWzBdIGNvbnRhaW5zIGVpdGhlciB0aGUgYWRkcmVzcyBvZiB0aGUgZGVmYXVsdCB2ZWN0b3IsCi0gICBpZiB0aGVyZSBpcyBvbmUsIG9yIHplcm8gaWYgdGhlcmUgaXNuJ3QuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICpiZmRfZGVmYXVsdF92ZWN0b3JbXSA9IHsKLSNpZmRlZiBERUZBVUxUX1ZFQ1RPUgotCSZERUZBVUxUX1ZFQ1RPUiwKLSNlbmRpZgotCU5VTEwKLX07Ci0KLS8qIFdoZW4gdGhlcmUgaXMgYW4gYW1iaWd1b3VzIG1hdGNoLCBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgcHV0cyB0aGUKLSAgIG5hbWVzIG9mIHRoZSBtYXRjaGluZyB0YXJnZXRzIGluIGFuIGFycmF5LiAgVGhpcyB2YXJpYWJsZSBpcyB0aGUgbWF4aW11bQotICAgbnVtYmVyIG9mIGVudHJpZXMgdGhhdCB0aGUgYXJyYXkgY291bGQgcG9zc2libHkgbmVlZC4gICovCi1jb25zdCBzaXplX3QgX2JmZF90YXJnZXRfdmVjdG9yX2VudHJpZXMgPSBzaXplb2YoYmZkX3RhcmdldF92ZWN0b3IpL3NpemVvZigqYmZkX3RhcmdldF92ZWN0b3IpOwotDAotLyogVGhpcyBhcnJheSBtYXBzIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgb250byBCRkQgdmVjdG9ycy4gICovCi0KLXN0cnVjdCB0YXJnbWF0Y2gKLXsKLSAgLyogVGhlIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4gICovCi0gIGNvbnN0IGNoYXIgKnRyaXBsZXQ7Ci0gIC8qIFRoZSBCRkQgdmVjdG9yLiAgSWYgdGhpcyBpcyBOVUxMLCB0aGVuIHRoZSB2ZWN0b3IgaXMgZm91bmQgYnkKLSAgICAgc2VhcmNoaW5nIGZvcndhcmQgZm9yIHRoZSBuZXh0IHN0cnVjdHVyZSB3aXRoIGEgbm9uIE5VTEwgdmVjdG9yCi0gICAgIGZpZWxkLiAgKi8KLSAgY29uc3QgYmZkX3RhcmdldCAqdmVjdG9yOwotfTsKLQotLyogdGFyZ21hdGNoLmggaXMgYnVpbHQgYnkgTWFrZWZpbGUgb3V0IG9mIGNvbmZpZy5iZmQuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB0YXJnbWF0Y2ggYmZkX3RhcmdldF9tYXRjaFtdID0gewotI2luY2x1ZGUgInRhcmdtYXRjaC5oIgotICB7IE5VTEwsIE5VTEwgfQotfTsKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmZpbmRfdGFyZ2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBGaW5kIGEgdGFyZ2V0IHZlY3RvciwgZ2l2ZW4gYSBuYW1lIG9yIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWZpbmRfdGFyZ2V0IChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldDsKLSAgY29uc3Qgc3RydWN0IHRhcmdtYXRjaCAqbWF0Y2g7Ci0KLSAgZm9yICh0YXJnZXQgPSAmYmZkX3RhcmdldF92ZWN0b3JbMF07ICp0YXJnZXQgIT0gTlVMTDsgdGFyZ2V0KyspCi0gICAgaWYgKHN0cmNtcCAobmFtZSwgKCp0YXJnZXQpLT5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuICp0YXJnZXQ7Ci0KLSAgLyogSWYgd2UgY291bGRuJ3QgbWF0Y2ggb24gdGhlIGV4YWN0IG5hbWUsIHRyeSBtYXRjaGluZyBvbiB0aGUKLSAgICAgY29uZmlndXJhdGlvbiB0cmlwbGV0LiAgRklYTUU6IFdlIHNob3VsZCBydW4gdGhlIHRyaXBsZXQgdGhyb3VnaAotICAgICBjb25maWcuc3ViIGZpcnN0LCBidXQgdGhhdCBpcyBoYXJkLiAgKi8KLSAgZm9yIChtYXRjaCA9ICZiZmRfdGFyZ2V0X21hdGNoWzBdOyBtYXRjaC0+dHJpcGxldCAhPSBOVUxMOyBtYXRjaCsrKQotICAgIHsKLSAgICAgIGlmIChmbm1hdGNoIChtYXRjaC0+dHJpcGxldCwgbmFtZSwgMCkgPT0gMCkKLQl7Ci0JICB3aGlsZSAobWF0Y2gtPnZlY3RvciA9PSBOVUxMKQotCSAgICArK21hdGNoOwotCSAgcmV0dXJuIG1hdGNoLT52ZWN0b3I7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2RlZmF1bHRfdGFyZ2V0Ci0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0IChjb25zdCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIGRlZmF1bHQgdGFyZ2V0IHZlY3RvciB0byB1c2Ugd2hlbiByZWNvZ25pemluZyBhIEJGRC4KLQlUaGlzIHRha2VzIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQsIHdoaWNoIG1heSBiZSBhIEJGRCB0YXJnZXQKLQluYW1lIG9yIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0LgotKi8KLQotYm9vbGVhbgotYmZkX3NldF9kZWZhdWx0X3RhcmdldCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OwotCi0gIGlmIChiZmRfZGVmYXVsdF92ZWN0b3JbMF0gIT0gTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBiZmRfZGVmYXVsdF92ZWN0b3JbMF0tPm5hbWUpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgdGFyZ2V0ID0gZmluZF90YXJnZXQgKG5hbWUpOwotICBpZiAodGFyZ2V0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9kZWZhdWx0X3ZlY3RvclswXSA9IHRhcmdldDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9maW5kX3RhcmdldAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF90YXJnZXQgKmJmZF9maW5kX3RhcmdldChDT05TVCBjaGFyICp0YXJnZXRfbmFtZSwgYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB0cmFuc2ZlciB2ZWN0b3IgZm9yIHRoZSBvYmplY3QgdGFyZ2V0Ci0JbmFtZWQgQHZhcnt0YXJnZXRfbmFtZX0uICBJZiBAdmFye3RhcmdldF9uYW1lfSBpcyA8PE5VTEw+PiwgY2hvb3NlIHRoZQotCW9uZSBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgPDxHTlVUQVJHRVQ+PjsgaWYgdGhhdCBpcyBudWxsIG9yIG5vdAotCWRlZmluZWQsIHRoZW4gY2hvb3NlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFyZ2V0IGxpc3QuCi0JUGFzc2luZyBpbiB0aGUgc3RyaW5nICJkZWZhdWx0IiBvciBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudAotCXZhcmlhYmxlIHRvICJkZWZhdWx0IiB3aWxsIGNhdXNlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFyZ2V0Ci0JbGlzdCB0byBiZSByZXR1cm5lZCwgYW5kICJ0YXJnZXRfZGVmYXVsdGVkIiB3aWxsIGJlIHNldCBpbiB0aGUKLQlCRkQuICBUaGlzIGNhdXNlcyA8PGJmZF9jaGVja19mb3JtYXQ+PiB0byBsb29wIG92ZXIgYWxsIHRoZQotCXRhcmdldHMgdG8gZmluZCB0aGUgb25lIHRoYXQgbWF0Y2hlcyB0aGUgZmlsZSBiZWluZyByZWFkLiAgIAotKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1iZmRfZmluZF90YXJnZXQgKHRhcmdldF9uYW1lLCBhYmZkKQotICAgICBjb25zdCBjaGFyICp0YXJnZXRfbmFtZTsKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBjaGFyICp0YXJnbmFtZTsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OwotCi0gIGlmICh0YXJnZXRfbmFtZSAhPSBOVUxMKQotICAgIHRhcmduYW1lID0gdGFyZ2V0X25hbWU7Ci0gIGVsc2UKLSAgICB0YXJnbmFtZSA9IGdldGVudiAoIkdOVVRBUkdFVCIpOwotCi0gIC8qIFRoaXMgaXMgc2FmZTsgdGhlIHZlY3RvciBjYW5ub3QgYmUgbnVsbCAqLwotICBpZiAodGFyZ25hbWUgPT0gTlVMTCB8fCBzdHJjbXAgKHRhcmduYW1lLCAiZGVmYXVsdCIpID09IDApCi0gICAgewotICAgICAgYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IHRydWU7Ci0gICAgICBpZiAoYmZkX2RlZmF1bHRfdmVjdG9yWzBdICE9IE5VTEwpCi0JYWJmZC0+eHZlYyA9IGJmZF9kZWZhdWx0X3ZlY3RvclswXTsKLSAgICAgIGVsc2UKLQlhYmZkLT54dmVjID0gYmZkX3RhcmdldF92ZWN0b3JbMF07Ci0gICAgICByZXR1cm4gYWJmZC0+eHZlYzsKLSAgICB9Ci0KLSAgYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IGZhbHNlOwotCi0gIHRhcmdldCA9IGZpbmRfdGFyZ2V0ICh0YXJnbmFtZSk7Ci0gIGlmICh0YXJnZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhYmZkLT54dmVjID0gdGFyZ2V0OwotICByZXR1cm4gdGFyZ2V0OwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfdGFyZ2V0X2xpc3QKLQotU1lOT1BTSVMKLQljb25zdCBjaGFyICoqYmZkX3RhcmdldF9saXN0KHZvaWQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIGZyZXNobHkgbWFsbG9jZWQgTlVMTC10ZXJtaW5hdGVkCi0JdmVjdG9yIG9mIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHZhbGlkIEJGRCB0YXJnZXRzLiBEbyBub3QKLQltb2RpZnkgdGhlIG5hbWVzLgotCi0qLwotCi1jb25zdCBjaGFyICoqCi1iZmRfdGFyZ2V0X2xpc3QgKCkKLXsKLSAgaW50IHZlY19sZW5ndGg9IDA7Ci0jaWYgZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgJiYgISBkZWZpbmVkIChfX1NURENfXykKLSAgLyogVGhlIG5hdGl2ZSBjb21waWxlciBvbiB0aGUgSFA5MDAwLzcwMCBoYXMgYSBidWcgd2hpY2ggY2F1c2VzIGl0Ci0gICAgIHRvIGxvb3AgZW5kbGVzc2x5IHdoZW4gY29tcGlsaW5nIHRoaXMgZmlsZS4gIFRoaXMgYXZvaWRzIGl0LiAgKi8KLSAgdm9sYXRpbGUKLSNlbmRpZgotICAgIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0OwotICBDT05TVCAgY2hhciAqKm5hbWVfbGlzdCwgKipuYW1lX3B0cjsKLQotICBmb3IgKHRhcmdldCA9ICZiZmRfdGFyZ2V0X3ZlY3RvclswXTsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykKLSAgICB2ZWNfbGVuZ3RoKys7Ci0KLSAgbmFtZV9wdHIgPSBuYW1lX2xpc3QgPSAoQ09OU1QgY2hhciAqKikKLSAgICBiZmRfem1hbGxvYyAoKHZlY19sZW5ndGggKyAxKSAqIHNpemVvZiAoY2hhciAqKikpOwotCi0gIGlmIChuYW1lX2xpc3QgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKHRhcmdldCA9ICZiZmRfdGFyZ2V0X3ZlY3RvclswXTsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykKLSAgICAqKG5hbWVfcHRyKyspID0gKCp0YXJnZXQpLT5uYW1lOwotCi0gIHJldHVybiBuYW1lX2xpc3Q7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZWFjaF9mb3JfdGFyZ2V0Ci0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX3RhcmdldCAqIGJmZF9zZWFyY2hfZm9yX3RhcmdldCAoaW50ICgqIHNlYXJjaF9mdW5jKShjb25zdCBiZmRfdGFyZ2V0ICosIHZvaWQgKiksIHZvaWQgKik7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgdHJhbnNmZXIgdmVjdG9yIGluIHRoZSBsaXN0IG9mCi0JdHJhbnNmZXIgdmVjdG9ycyBtYWludGFpbmVkIGJ5IEJGRCB0aGF0IHByb2R1Y2VzIGEgbm9uLXplcm8KLQlyZXN1bHQgd2hlbiBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIEB2YXJ7c2VhcmNoX2Z1bmN9LiAgVGhlCi0JcGFyYW1ldGVyIEB2YXJ7ZGF0YX0gaXMgcGFzc2VkLCB1bmV4YW1pbmVkLCB0byB0aGUgc2VhcmNoCi0JZnVuY3Rpb24uCi0qLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWJmZF9zZWFyY2hfZm9yX3RhcmdldCAoc2VhcmNoX2Z1bmMsIGRhdGEpCi0gICAgIGludCAoKiBzZWFyY2hfZnVuYykgUEFSQU1TICgoY29uc3QgYmZkX3RhcmdldCAqIHRhcmdldCwgdm9pZCAqIGRhdGEpKTsKLSAgICAgdm9pZCAqIGRhdGE7Ci17Ci0gIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqIHRhcmdldDsKLQotICBmb3IgKHRhcmdldCA9IGJmZF90YXJnZXRfdmVjdG9yOyAqIHRhcmdldCAhPSBOVUxMOyB0YXJnZXQgKyspCi0gICAgaWYgKHNlYXJjaF9mdW5jICgqIHRhcmdldCwgZGF0YSkpCi0gICAgICByZXR1cm4gKiB0YXJnZXQ7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9iZmQvdGFyZ21hdGNoLnNlZCBiL2JmZC90YXJnbWF0Y2guc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjQwZTcyLi4wMDAwMDAwCi0tLSBhL2JmZC90YXJnbWF0Y2guc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotMSwvU1RBUlQgT0YgdGFyZ21hdGNoLmgvCWQKLS9FTkQgT0YgdGFyZ21hdGNoLmgvLCQJCWQKLXMvXiNpZi9LRUVQICNpZi8KLXMvXiNlbmRpZi9LRUVQICNlbmRpZi8KLXMvXlsgCV0qIy4qJC8vCi1zL15LRUVQICMvIy8KLXMvWyAJXSpcXCQvLwotdCBsYWIxCi0JOmxhYjEKLXMvW3wgCV1bfCAJXSpcKFtefCgpIAldW158KCkgCV0qXClbIAldKnwveyAiXDEiLCBOVUxMIH0sL2cKLXMvW3wgCV1bfCAJXSpcKFtefCgpIAldW158KCkgCV0qXClbIAldKikveyAiXDEiLC9nCi10IGxhYjIKLXMvXlsgCV0qdGFyZ19kZWZ2ZWM9XChbXiAJXSpcKS8jaWYgIWRlZmluZWQgKFNFTEVDVF9WRUNTKSB8fCBkZWZpbmVkIChIQVZFX1wxKS8KLXQgbGFiMwotcy8uKj0uKi8vCi1zLzs7Ly8KLWIKLQk6bGFiMgotSAotZAotCTpsYWIzCi1HCi1zL1xuLyVFT0wlL2cKLXMvXChkZWZpbmVkIChIQVZFX1wpXChbXildKlwpXCguKlwpL1wxXDJcM1wKLVwmXDIgfSxcCi0jZW5kaWYvCi1zLyVFT0wlL1wKLS9nCi1wCi1zLy4qLy9nCi1zL1xuLy9nCi1oCmRpZmYgLS1naXQgYS9iZmQvdGVraGV4LmMgYi9iZmQvdGVraGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZmZlNzUuLjAwMDAwMDAKLS0tIGEvYmZkL3Rla2hleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2OCArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgRXh0ZW5kZWQgVGVrdHJvbml4IEhleCBGb3JtYXQgIG9iamVjdHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TVUJTRUNUSU9OCi0JVGVrdHJvbml4IEhleCBGb3JtYXQgaGFuZGxpbmcKLQotREVTQ1JJUFRJT04KLQkKLQlUZWsgSGV4IHJlY29yZHMgY2FuIGhvbGQgc3ltYm9scyBhbmQgZGF0YSwgYnV0IG5vdAotCXJlbG9jYXRpb25zLiBUaGVpciBtYWluIGFwcGxpY2F0aW9uIGlzIGNvbW11bmljYXRpb24gd2l0aAotCWRldmljZXMgbGlrZSBQUk9NIHByb2dyYW1tZXJzIGFuZCBJQ0UgZXF1aXBtZW50LgotCQotCUl0IHNlZW1zIHRoYXQgdGhlIHNlY3Rpb25zIGFyZSBkZXNjaWJlZCBhcyBiZWluZyByZWFsbHkgYmlnLAotICAgICAgICB0aGUgZXhhbXBsZSBJIGhhdmUgc2F5cyB0aGF0IHRoZSB0ZXh0IHNlY3Rpb24gaXMgMC4uZmZmZmZmZmYuCi0JQkZEIHdvdWxkIGJhcmYgd2l0aCB0aGlzLCBtYW55IGFwcHMgd291bGQgdHJ5IHRvIGFsbG9jIDRHQiB0bwotCXJlYWQgaW4gdGhlIGZpbGUuCi0KLQlUZXggSGV4IG1heSBjb250YWluIG1hbnkgc2VjdGlvbnMsIGJ1dCB0aGUgZGF0YSB3aGljaCBjb21lcyBpbgotCWhhcyBubyB0YWcgc2F5aW5nIHdoaWNoIHNlY3Rpb24gaXQgYmVsb25ncyB0bywgc28gd2UgY3JlYXRlCi0Jb25lIHNlY3Rpb24gZm9yIGVhY2ggYmxvY2sgb2YgZGF0YSwgY2FsbGVkICJibGtubm5uIiB3aGljaCB3ZQotCXN0aWNrIGFsbCB0aGUgZGF0YSBpbnRvLgotCi0JVGVrSGV4IG1heSBjb21lIG91dCBvZiAJb3JkZXIgYW5kIHRoZXJlIGlzIG5vIGhlYWRlciwgc28gYW4KLQlpbml0aWFsIHNjYW4gaXMgcmVxdWlyZWQgIHRvIGRpc2NvdmVyIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtCi0JYWRkcmVzc2VzIHVzZWQgdG8gY3JlYXRlIHRoZSB2bWEgYW5kIHNpemUgb2YgdGhlIHNlY3Rpb25zIHdlCi0JY3JlYXRlLgotCVdlIHJlYWQgaW4gdGhlIGRhdGEgaW50byBwYWdlcyBvZiBDSFVOS19NQVNLKzEgc2l6ZSBhbmQgcmVhZAotCXRoZW0gb3V0IGZyb20gdGhhdCB3aGVuZXZlciB3ZSBuZWVkIHRvLgotCi0JQW55IG51bWJlciBvZiBzZWN0aW9ucyBtYXkgYmUgY3JlYXRlZCBmb3Igb3V0cHV0LCB3ZSBzYXZlIHRoZW0KLQl1cCBhbmQgb3V0cHV0IHRoZW0gd2hlbiBpdCdzIHRpbWUgdG8gY2xvc2UgdGhlIGJmZC4KLQotCi0JQSBUZWtIZXggcmVjb3JkIGxvb2tzIGxpa2U6Ci1FWEFNUExFCi0JJTxibG9jayBsZW5ndGg+PHR5cGU+PGNoZWNrc3VtPjxzdHVmZj48Y3I+Ci0JCi1ERVNDUklQVElPTgotCVdoZXJlCi0JbyBsZW5ndGgKLQlpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZWNvcmQgbm90IGluY2x1ZGluZyB0aGUgJSBzaWduLgotCW8gdHlwZQotCWlzIG9uZSBvZjoKLQkzKSBzeW1ib2wgcmVjb3JkCi0JNikgZGF0YSByZWNvcmQKLQk4KSB0ZXJtaW5hdGlvbiByZWNvcmQKLQkKLQotVGhlIGRhdGEgY2FuIGNvbWUgb3V0IG9mIG9yZGVyLCBhbmQgbWF5IGJlIGRpc2NvbnRpZ291cy4gVGhpcyBpcyBhCi1zZXJpYWwgcHJvdG9jb2wsIHNvIGJpZyBmaWxlcyBhcmUgdW5saWtlbHksIHNvIHdlIGtlZXAgYSBsaXN0IG9mIDhrIGNodW5rcwotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgYmZkX3ZtYSBsb3c7Ci0gICAgYmZkX3ZtYSBoaWdoOwotICB9IGFkZHJfcmFuZ2VfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QKLSAgewotCi0gICAgYXN5bWJvbCBzeW1ib2w7Ci0gICAgc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0ICpwcmV2OwotCi0gIH0gdGVraGV4X3N5bWJvbF90eXBlOwotCi1zdGF0aWMgY29uc3QgY2hhciBkaWdzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0KLXN0YXRpYyBjaGFyIHN1bV9ibG9ja1syNTZdOwotCi0jZGVmaW5lIE5PVF9IRVggMjAKLSNkZWZpbmUgTklCQkxFKHgpIGhleF92YWx1ZSh4KQotI2RlZmluZSBIRVgoYnVmZmVyKSAoKE5JQkJMRSgoYnVmZmVyKVswXSk8PDQpICsgTklCQkxFKChidWZmZXIpWzFdKSkKLSNkZWZpbmUgVE9IRVgoZCx4KSBcCi0oZClbMV0gPSBkaWdzWyh4KSAmIDB4Zl07IFwKLShkKVswXSA9IGRpZ3NbKCh4KT4+NCkmMHhmXTsKLSNkZWZpbmUJSVNIRVgoeCkgIGhleF9wKHgpCi0KLXN0YXRpYyB2b2lkIHRla2hleF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBiZmRfdm1hIGdldHZhbHVlIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHRla2hleF9wcmludF9zeW1ib2wKLSBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotc3RhdGljIHZvaWQgdGVraGV4X2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqdGVraGV4X21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IHRla2hleF9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gdGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgb3V0IFBBUkFNUyAoKGJmZCAqLCBpbnQsIGNoYXIgKiwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZXN5bSBQQVJBTVMgKChjaGFyICoqLCBDT05TVCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHdyaXRldmFsdWUgUEFSQU1TICgoY2hhciAqKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gdGVraGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkKiwgc2VjX3B0ciwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gdGVraGV4X3NldF9hcmNoX21hY2gKLSBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiB0ZWtoZXhfZ2V0X3NlY3Rpb25fY29udGVudHMKLSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIHZvaWQgbW92ZV9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGJvb2xlYW4pKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp0ZWtoZXhfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHRla2hleF9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgdGVraGV4X2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHRla2hleF9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgdm9pZCBwYXNzX292ZXIgUEFSQU1TICgoYmZkICosIHZvaWQgKCopKGJmZCosIGludCwgY2hhciAqKSkpOwotc3RhdGljIHZvaWQgZmlyc3RfcGhhc2UgUEFSQU1TICgoYmZkICosIGludCwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgaW50LCBiZmRfdm1hKSk7Ci1zdGF0aWMgc3RydWN0IGRhdGFfc3RydWN0ICpmaW5kX2NodW5rIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGdldHN5bSBQQVJBTVMgKChjaGFyICosIGNoYXIgKiopKTsKLQotLyoKLUhlcmUncyBhbiBleGFtcGxlCi0lM0E2QzY0ODAwMDRFNTZGRkZDNEU3MTcwNjNCMEFFRkZGQzZEMDY1MkFFRkZGQzYwRjI0RTVFNEU3NQotJTFCMzcwOVRfU0VHTUVOVDExMDhGRkZGRkZGRgotJTJCM0FCOVRfU0VHTUVOVDdEZ2NjX2NvbXBpbGVkJDEwODdoZWxsbyRjMTAKLSUzNzM4MjlUX1NFR01FTlQ4MGludCR0MSRyMSQkMjE0NzQxMDgwY2hhciR0MiRyMiQwJDEyNzEwCi0lMzczNzY5VF9TRUdNRU5UODBsb25nJGludCR0MyRyMSQkMTA4MHVuc2lnbmVkJGludCR0NCQxMAotJTM3M0NBOVRfU0VHTUVOVDgwbG9uZyR1bnNpZ25lZCRpbjEwODBzaG9ydCRpbnQkdDYkcjEkMTAKLSUzNzMwNDlUX1NFR01FTlQ4MGxvbmckbG9uZyRpbnQkdDcxMDgwc2hvcnQkdW5zaWduZWQkaTEwCi0lMzczQTI5VF9TRUdNRU5UODBsb25nJGxvbmckdW5zaWduMTA4MHNpZ25lZCRjaGFyJHQxMCQxMAotJTM3M0Q2OVRfU0VHTUVOVDgwdW5zaWduZWQkY2hhciR0MTEwODBmbG9hdCR0MTIkcjEkNCQwMTAKLSUzNzNEMTlUX1NFR01FTlQ4MGRvdWJsZSR0MTMkcjEkOCQxMDgwbG9uZyRkb3VibGUkdDE0JDEwCi0lMjczNEQ5VF9TRUdNRU5UOEJ2b2lkJHQxNSQxNTEwMzVfbWFpbjEwCi0lMkYzQ0E5VF9TRUdNRU5UODEkMTA4MSQxNjgxJDFFODEkMjE0ODdtYWluJEYxMTAKLSUyODMyRjlUX1NFR01FTlQ4M2kkMThGRkZGRkZGQzgxJDE0ODEkMjE0Ci0lMDcgOCAxMCAxMAotCi1leHBsYW5hdGlvbjoKLSUzQTZDNjQ4MDAwNEU1NkZGRkM0RTcxNzA2M0IwQUVGRkZDNkQwNjUyQUVGRkZDNjBGMjRFNUU0RTc1Ci0gXiBeXiBeICAgICBeLWRhdGEKLSB8IHx8ICstLS0tLS0gNCBjaGFyIGludGVnZXIgMHg4MDAwCi0gfCB8Ky0tLS0tLS0tIGNoZWNrc3VtCi0gfCArLS0tLS0tLS0tIHR5cGUgNiAoZGF0YSByZWNvcmQpCi0gKy0tLS0tLS0tLS0tIGxlbmd0aCAzYSBjaGFycwotIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDNhICg1OCBjaGFycykgLS0tLS0tLS0tLS0tLS0tLS0tLT4KLQotJTFCMzcwOVRfU0VHTUVOVDExMDhGRkZGRkZGRgotICAgICAgXiAgICAgICAgIF5eIF4tIDggY2hhcmFjdGVyIGludGVnZXIgMHhmZmZmZmZmZgotICAgICAgfCAgICAgICAgIHwrLSAgIDEgY2hhcmFjdGVyIGludGVnZXIgMAotICAgICAgfCAgICAgICAgICstLSAgIHR5cGUgMSBzeW1ib2wgKHNlY3Rpb24gZGVmaW5pdGlvbikKLSAgICAgICstLS0tLS0tLS0tLS0gICA5IGNoYXIgc3ltYm9sIFRfU0VHTUVOVAotCi0lMkIzQUI5VF9TRUdNRU5UN0RnY2NfY29tcGlsZWQkMTA4N2hlbGxvJGMxMAotJTM3MzgyOVRfU0VHTUVOVDgwaW50JHQxJHIxJCQyMTQ3NDEwODBjaGFyJHQyJHIyJDAkMTI3MTAKLSUzNzM3NjlUX1NFR01FTlQ4MGxvbmckaW50JHQzJHIxJCQxMDgwdW5zaWduZWQkaW50JHQ0JDEwCi0lMzczQ0E5VF9TRUdNRU5UODBsb25nJHVuc2lnbmVkJGluMTA4MHNob3J0JGludCR0NiRyMSQxMAotJTM3MzA0OVRfU0VHTUVOVDgwbG9uZyRsb25nJGludCR0NzEwODBzaG9ydCR1bnNpZ25lZCRpMTAKLSUzNzNBMjlUX1NFR01FTlQ4MGxvbmckbG9uZyR1bnNpZ24xMDgwc2lnbmVkJGNoYXIkdDEwJDEwCi0lMzczRDY5VF9TRUdNRU5UODB1bnNpZ25lZCRjaGFyJHQxMTA4MGZsb2F0JHQxMiRyMSQ0JDAxMAotJTM3M0QxOVRfU0VHTUVOVDgwZG91YmxlJHQxMyRyMSQ4JDEwODBsb25nJGRvdWJsZSR0MTQkMTAKLSUyNzM0RDlUX1NFR01FTlQ4QnZvaWQkdDE1JDE1MTAzNV9tYWluMTAKLSUyRjNDQTlUX1NFR01FTlQ4MSQxMDgxJDE2ODEkMUU4MSQyMTQ4N21haW4kRjExMAotJTI4MzJGOVRfU0VHTUVOVDgzaSQxOEZGRkZGRkZDODEkMTQ4MSQyMTQKLSUwNzgxMDEwCi0KLVR1cm5zIGludG8KLXNhY0B0aGVwdWIkIC4vb2JqZHVtcCAtZHggLW0gbTY4ayBmCi0KLWY6ICAgICBmaWxlIGZvcm1hdCB0ZWtoZXgKLS0tLS0teC0tLSA5LzU1NzI4IC0xMzQyMTk0MTYgU2VwIDI5IDE1OjEzIDE5OTUgZgotYXJjaGl0ZWN0dXJlOiBVTktOT1dOISwgZmxhZ3MgMHgwMDAwMDAxMDoKLUhBU19TWU1TCi1zdGFydCBhZGRyZXNzIDB4MDAwMDAwMDAKLVNFQ1RJT04gMCBbRDAwMDAwMDAwXQk6IHNpemUgMDAwMjAwMDAgdm1hIDAwMDAwMDAwIGFsaWduIDIqKjAKLSBBTExPQywgTE9BRAotU0VDVElPTiAxIFtEMDAwMDgwMDBdCTogc2l6ZSAwMDAwMjAwMSB2bWEgMDAwMDgwMDAgYWxpZ24gMioqMAotCi1TRUNUSU9OIDIgW1RfU0VHTUVOVF0JOiBzaXplIGZmZmZmZmZmIHZtYSAwMDAwMDAwMCBhbGlnbiAyKiowCi0KLVNZTUJPTCBUQUJMRToKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBnY2NfY29tcGlsZWQkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgaGVsbG8kYwotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGludCR0MSRyMSQkMjE0NzQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBjaGFyJHQyJHIyJDAkMTI3Ci0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyRpbnQkdDMkcjEkJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHVuc2lnbmVkJGludCR0NCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBsb25nJHVuc2lnbmVkJGluCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgc2hvcnQkaW50JHQ2JHIxJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGxvbmckbG9uZyRpbnQkdDcKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBzaG9ydCR1bnNpZ25lZCRpCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyRsb25nJHVuc2lnbgotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHNpZ25lZCRjaGFyJHQxMCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCB1bnNpZ25lZCRjaGFyJHQxCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgZmxvYXQkdDEyJHIxJDQkMAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGRvdWJsZSR0MTMkcjEkOCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBsb25nJGRvdWJsZSR0MTQkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgdm9pZCR0MTUkMTUKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBfbWFpbgotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UICQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCAkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgJAotMDAwMDAwMTAgIGcgICAgICAgVF9TRUdNRU5UICQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBtYWluJEYxCi1mY2ZmZmZmZiAgZyAgICAgICBUX1NFR01FTlQgaSQxCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgJAotMDAwMDAwMTAgIGcgICAgICAgVF9TRUdNRU5UICQKLQotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFtEMDAwMDAwMDBdOiAobm9uZSkKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbRDAwMDA4MDAwXTogKG5vbmUpCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgW1RfU0VHTUVOVF06IChub25lKQotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIEQwMDAwMDAwMDoKLS4uLgotMDAwMDgwMDAgKCQrKTdmZjAgbGlua3cgZnAsIy00Ci0wMDAwODAwNCAoJCspN2ZmNCBub3AKLTAwMDA4MDA2ICgkKyk3ZmY2IG1vdmVsICM5OSxkMAotMDAwMDgwMDggKCQrKTdmZjggY21wbCBmcEAoLTQpLGQwCi0wMDAwODAwYyAoJCspN2ZmYyBibHRzIDAwMDA4MDE0ICgkKyk4MDA0Ci0wMDAwODAwZSAoJCspN2ZmZSBhZGRxbCAjMSxmcEAoLTQpCi0wMDAwODAxMiAoJCspODAwMiBicmFzIDAwMDA4MDA2ICgkKyk3ZmY2Ci0wMDAwODAxNCAoJCspODAwNCB1bmxrIGZwCi0wMDAwODAxNiAoJCspODAwNiBydHMKLS4uLgotCi0qLwotCi1zdGF0aWMgdm9pZAotdGVraGV4X2luaXQgKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHN0YXRpYyBib29sZWFuIGluaXRlZCA9IGZhbHNlOwotICBpbnQgdmFsOwotCi0gIGlmIChpbml0ZWQgPT0gZmFsc2UpCi0gICAgewotICAgICAgaW5pdGVkID0gdHJ1ZTsKLSAgICAgIGhleF9pbml0ICgpOwotICAgICAgdmFsID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQotCXsKLQkgIHN1bV9ibG9ja1tpICsgJzAnXSA9IHZhbCsrOwotCX0KLSAgICAgIGZvciAoaSA9ICdBJzsgaSA8PSAnWic7IGkrKykKLQl7Ci0JICBzdW1fYmxvY2tbaV0gPSB2YWwrKzsKLQl9Ci0gICAgICBzdW1fYmxvY2tbJyQnXSA9IHZhbCsrOwotICAgICAgc3VtX2Jsb2NrWyclJ10gPSB2YWwrKzsKLSAgICAgIHN1bV9ibG9ja1snLiddID0gdmFsKys7Ci0gICAgICBzdW1fYmxvY2tbJ18nXSA9IHZhbCsrOwotICAgICAgZm9yIChpID0gJ2EnOyBpIDw9ICd6JzsgaSsrKQotCXsKLQkgIHN1bV9ibG9ja1tpXSA9IHZhbCsrOwotCX0KLSAgICB9Ci19Ci0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvbiBhIGxpbmUgaXMgRkYgKi8KLSNkZWZpbmUgTUFYQ0hVTksgMHhmZgotLyogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBmaXQgb250byBhIGxpbmUgb24gb3V0cHV0ICovCi0jZGVmaW5lIENIVU5LIDIxCi0KLS8qIFdlIGNhbm5vdCBvdXRwdXQgb3VyIHRla2hleG9yZHMgYXMgd2Ugc2VlIHRoZW0sIHdlIGhhdmUgdG8gZ2x1ZSB0aGVtCi0gICB0b2dldGhlciwgdGhpcyBpcyBkb25lIGluIHRoaXMgc3RydWN0dXJlIDogKi8KLQotc3RydWN0IHRla2hleF9kYXRhX2xpc3Rfc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gIGJmZF92bWEgd2hlcmU7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgc3RydWN0IHRla2hleF9kYXRhX2xpc3Rfc3RydWN0ICpuZXh0OwotCi19OwotdHlwZWRlZiBzdHJ1Y3QgdGVraGV4X2RhdGFfbGlzdF9zdHJ1Y3QgdGVraGV4X2RhdGFfbGlzdF90eXBlOwotCi0jZGVmaW5lIENIVU5LX01BU0sgMHgxZmZmCi0KLXN0cnVjdCBkYXRhX3N0cnVjdAotICB7Ci0gICAgY2hhciBjaHVua19kYXRhW0NIVU5LX01BU0sgKyAxXTsKLSAgICBjaGFyIGNodW5rX2luaXRbQ0hVTktfTUFTSyArIDFdOwotICAgIGJmZF92bWEgdm1hOwotICAgIHN0cnVjdCBkYXRhX3N0cnVjdCAqbmV4dDsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgdGVraGV4X2RhdGFfc3RydWN0Ci17Ci0gIHRla2hleF9kYXRhX2xpc3RfdHlwZSAqaGVhZDsKLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0gIHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCAqc3ltYm9sczsKLSAgc3RydWN0IGRhdGFfc3RydWN0ICpkYXRhOwotfSB0ZGF0YV90eXBlOwotCi0jZGVmaW5lIGVuZGEoeCkgKHgtPnZtYSArIHgtPnNpemUpCi0KLXN0YXRpYyBiZmRfdm1hCi1nZXR2YWx1ZSAoc3JjcCkKLSAgICAgY2hhciAqKnNyY3A7Ci17Ci0gIGNoYXIgKnNyYyA9ICpzcmNwOwotICBiZmRfdm1hIHZhbHVlID0gMDsKLSAgdW5zaWduZWQgaW50IGxlbiA9IGhleF92YWx1ZSgqc3JjKyspOwotCi0gIGlmIChsZW4gPT0gMCkKLSAgICBsZW4gPSAxNjsKLSAgd2hpbGUgKGxlbi0tKQotICAgIHsKLSAgICAgIHZhbHVlID0gdmFsdWUgPDwgNCB8IGhleF92YWx1ZSgqc3JjKyspOwotICAgIH0KLSAgKnNyY3AgPSBzcmM7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotZ2V0c3ltIChkc3RwLCBzcmNwKQotICAgICBjaGFyICpkc3RwOwotICAgICBjaGFyICoqc3JjcDsKLXsKLSAgY2hhciAqc3JjID0gKnNyY3A7Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgbGVuID0gaGV4X3ZhbHVlKCpzcmMrKyk7Ci0KLSAgaWYgKGxlbiA9PSAwKQotICAgIGxlbiA9IDE2OwotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgZHN0cFtpXSA9IHNyY1tpXTsKLSAgZHN0cFtpXSA9IDA7Ci0gICpzcmNwID0gc3JjICsgaTsKLSAgcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHN0cnVjdCBkYXRhX3N0cnVjdCAqCi1maW5kX2NodW5rIChhYmZkLCB2bWEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSB2bWE7Ci17Ci0gIHN0cnVjdCBkYXRhX3N0cnVjdCAqZCA9IGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5kYXRhOwotCi0gIHZtYSAmPSB+Q0hVTktfTUFTSzsKLSAgd2hpbGUgKGQgJiYgKGQtPnZtYSkgIT0gdm1hKQotICAgIHsKLSAgICAgIGQgPSBkLT5uZXh0OwotICAgIH0KLSAgaWYgKCFkKQotICAgIHsKLSAgICAgIGNoYXIgKnNuYW1lID0gYmZkX2FsbG9jIChhYmZkLCAxMik7Ci0KLSAgICAgIC8qIE5vIGNodW5rIGZvciB0aGlzIGFkZHJlc3MsIHNvIG1ha2Ugb25lIHVwICovCi0gICAgICBkID0gKHN0cnVjdCBkYXRhX3N0cnVjdCAqKQotCWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZGF0YV9zdHJ1Y3QpKTsKLQotICAgICAgaWYgKCFzbmFtZSB8fCAhZCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgbWVtc2V0IChkLT5jaHVua19pbml0LCAwLCBDSFVOS19NQVNLICsgMSk7Ci0gICAgICBtZW1zZXQgKGQtPmNodW5rX2RhdGEsIDAsIENIVU5LX01BU0sgKyAxKTsKLSAgICAgIGQtPm5leHQgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+ZGF0YTsKLSAgICAgIGQtPnZtYSA9IHZtYTsKLSAgICAgIGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5kYXRhID0gZDsKLSAgICB9Ci0gIHJldHVybiBkOwotfQotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X2J5dGUgKGFiZmQsIHZhbHVlLCBhZGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICAvKiBGaW5kIHRoZSBjaHVuayB0aGF0IHRoaXMgYnl0ZSBuZWVkcyBhbmQgcHV0IGl0IGluICovCi0gIHN0cnVjdCBkYXRhX3N0cnVjdCAqZCA9IGZpbmRfY2h1bmsgKGFiZmQsIGFkZHIpOwotCi0gIGQtPmNodW5rX2RhdGFbYWRkciAmIENIVU5LX01BU0tdID0gdmFsdWU7Ci0gIGQtPmNodW5rX2luaXRbYWRkciAmIENIVU5LX01BU0tdID0gMTsKLX0KLQotLyogVGhlIGZpcnN0IHBhc3MgaXMgdG8gZmluZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBzZWN0aW9ucywgYW5kIHNlZQotICBob3cgYmlnIHRoZSBkYXRhIGlzICovCi1zdGF0aWMgdm9pZAotZmlyc3RfcGhhc2UgKGFiZmQsIHR5cGUsIHNyYykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqc3JjOwotewotICBhc2VjdGlvbiAqc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIGludCBsZW47Ci0gIGNoYXIgc3ltWzE3XTsJCQkvKiBBIHN5bWJvbCBjYW4gb25seSBiZSAxNmNoYXJzIGxvbmcgKi8KLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJzYnOgotICAgICAgLyogRGF0YSByZWNvcmQgLSByZWFkIGl0IGFuZCBzdG9yZSBpdCAqLwotICAgICAgewotCWJmZF92bWEgYWRkciA9IGdldHZhbHVlICgmc3JjKTsKLQotCXdoaWxlICgqc3JjKQotCSAgewotCSAgICBpbnNlcnRfYnl0ZSAoYWJmZCwgSEVYIChzcmMpLCBhZGRyKTsKLQkgICAgc3JjICs9IDI7Ci0JICAgIGFkZHIrKzsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuOwotICAgIGNhc2UgJzMnOgotICAgICAgLyogU3ltYm9sIHJlY29yZCwgcmVhZCB0aGUgc2VnbWVudCAqLwotICAgICAgbGVuID0gZ2V0c3ltIChzeW0sICZzcmMpOwotICAgICAgc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzeW0pOwotICAgICAgaWYgKHNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgY2hhciAqbiA9IGJmZF9hbGxvYyAoYWJmZCwgbGVuICsgMSk7Ci0KLQkgIGlmICghbikKLQkgICAgYWJvcnQoKTsJCS8qIEZJWE1FICovCi0JICBtZW1jcHkgKG4sIHN5bSwgbGVuICsgMSk7Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbik7Ci0JfQotICAgICAgd2hpbGUgKCpzcmMpCi0JewotCSAgc3dpdGNoICgqc3JjKQotCSAgICB7Ci0JICAgIGNhc2UgJzEnOgkJLyogc2VjdGlvbiByYW5nZSAqLwotCSAgICAgIHNyYysrOwotCSAgICAgIHNlY3Rpb24tPnZtYSA9IGdldHZhbHVlICgmc3JjKTsKLQkgICAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBnZXR2YWx1ZSAoJnNyYykgLSBzZWN0aW9uLT52bWE7Ci0JICAgICAgc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJzAnOgotCSAgICBjYXNlICcyJzoKLQkgICAgY2FzZSAnMyc6Ci0JICAgIGNhc2UgJzQnOgotCSAgICBjYXNlICc2JzoKLQkgICAgY2FzZSAnNyc6Ci0JICAgIGNhc2UgJzgnOgotCSAgICAgIC8qIFN5bWJvbHMsIGFkZCB0byBzZWN0aW9uICovCi0JICAgICAgewotCQl0ZWtoZXhfc3ltYm9sX3R5cGUgKm5ldyA9Ci0JCSh0ZWtoZXhfc3ltYm9sX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAgICAgc2l6ZW9mICh0ZWtoZXhfc3ltYm9sX3R5cGUpKTsKLQkJY2hhciB0eXBlID0gKCpzcmMpOwotCi0JCWlmICghbmV3KQotCQkgIGFib3J0KCk7CS8qIEZJWE1FICovCi0JCW5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCQlzcmMrKzsKLQkJYWJmZC0+c3ltY291bnQrKzsKLQkJYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0JCW5ldy0+cHJldiA9IGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5zeW1ib2xzOwotCQlhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+c3ltYm9scyA9IG5ldzsKLQkJbGVuID0gZ2V0c3ltIChzeW0sICZzcmMpOwotCQluZXctPnN5bWJvbC5uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBsZW4gKyAxKTsKLQkJaWYgKCFuZXctPnN5bWJvbC5uYW1lKQotCQkgIGFib3J0KCk7CS8qIEZJWE1FICovCi0JCW1lbWNweSAoKGNoYXIgKikgKG5ldy0+c3ltYm9sLm5hbWUpLCBzeW0sIGxlbiArIDEpOwotCQluZXctPnN5bWJvbC5zZWN0aW9uID0gc2VjdGlvbjsKLQkJaWYgKHR5cGUgPD0gJzQnKQotCQkgIG5ldy0+c3ltYm9sLmZsYWdzID0gKEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUKTsKLQkJZWxzZQotCQkgIG5ldy0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotCQluZXctPnN5bWJvbC52YWx1ZSA9IGdldHZhbHVlICgmc3JjKSAtIHNlY3Rpb24tPnZtYTsKLQkgICAgICB9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBQYXNzIG92ZXIgYW4gdGVraGV4LCBjYWxsaW5nIG9uZSBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zIG9uIGVhY2gKLSAgIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYXNzX292ZXIgKGFiZmQsIGZ1bmMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGNoYXIgKikpOwotewotICB1bnNpZ25lZCBpbnQgY2hhcnNfb25fbGluZTsKLSAgYm9vbGVhbiBlb2YgPSBmYWxzZTsKLQotICAvKiBUbyB0aGUgZnJvbnQgb2YgdGhlIGZpbGUgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGFib3J0ICgpOwotICB3aGlsZSAoZW9mID09IGZhbHNlKQotICAgIHsKLSAgICAgIGNoYXIgYnVmZmVyW01BWENIVU5LXTsKLSAgICAgIGNoYXIgKnNyYyA9IGJ1ZmZlcjsKLSAgICAgIGNoYXIgdHlwZTsKLQotICAgICAgLyogRmluZCBmaXJzdCAnJScgKi8KLSAgICAgIGVvZiA9IChib29sZWFuKSAoYmZkX3JlYWQgKHNyYywgMSwgMSwgYWJmZCkgIT0gMSk7Ci0gICAgICB3aGlsZSAoKnNyYyAhPSAnJScgJiYgIWVvZikKLQl7Ci0JICBlb2YgPSAoYm9vbGVhbikgKGJmZF9yZWFkIChzcmMsIDEsIDEsIGFiZmQpICE9IDEpOwotCX0KLSAgICAgIGlmIChlb2YpCi0JYnJlYWs7Ci0gICAgICBzcmMrKzsKLQotICAgICAgLyogRmV0Y2ggdGhlIHR5cGUgYW5kIHRoZSBsZW5ndGggYW5kIHRoZSBjaGVja3N1bSAqLwotICAgICAgaWYgKGJmZF9yZWFkIChzcmMsIDEsIDUsIGFiZmQpICE9IDUpCi0JYWJvcnQgKCk7IC8qIEZJWE1FICovCi0KLSAgICAgIHR5cGUgPSBzcmNbMl07Ci0KLSAgICAgIGlmICghSVNIRVggKHNyY1swXSkgfHwgIUlTSEVYIChzcmNbMV0pKQotCWJyZWFrOwotCi0gICAgICBjaGFyc19vbl9saW5lID0gSEVYIChzcmMpIC0gNTsJLyogQWxyZWFkeSByZWFkIGZpdmUgY2hhciAqLwotCi0gICAgICBpZiAoYmZkX3JlYWQgKHNyYywgMSwgY2hhcnNfb25fbGluZSwgYWJmZCkgIT0gY2hhcnNfb25fbGluZSkKLQlhYm9ydCAoKTsgLyogRklYTUUgKi8KLSAgICAgIHNyY1tjaGFyc19vbl9saW5lXSA9IDA7CS8qIHB1dCBhIG51bGwgYXQgdGhlIGVuZCAqLwotCi0gICAgICBmdW5jIChhYmZkLCB0eXBlLCBzcmMpOwotICAgIH0KLQotfQotCi1zdGF0aWMgbG9uZwotdGVraGV4X2dldF9zeW10YWIgKGFiZmQsIHRhYmxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKip0YWJsZTsKLXsKLSAgdGVraGV4X3N5bWJvbF90eXBlICpwID0gYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPnN5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBjID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0KLSAgdGFibGVbY10gPSAwOwotICB3aGlsZSAocCkKLSAgICB7Ci0gICAgICB0YWJsZVstLWNdID0gJihwLT5zeW1ib2wpOwotICAgICAgcCA9IHAtPnByZXY7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotc3RhdGljIGxvbmcKLXRla2hleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiAoYWJmZC0+c3ltY291bnQgKyAxKSAqIChzaXplb2YgKHN0cnVjdCB0ZWtoZXhfYXN5bWJvbF9zdHJ1Y3QgKikpOwotCi19Ci0KLXN0YXRpYyBib29sZWFuCi10ZWtoZXhfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdGRhdGFfdHlwZSAqdGRhdGEgPSAodGRhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAodGRhdGFfdHlwZSkpOwotCi0gIGlmICghdGRhdGEpCi0gICAgcmV0dXJuIGZhbHNlOwotICBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YSA9IHRkYXRhOwotICB0ZGF0YS0+dHlwZSA9IDE7Ci0gIHRkYXRhLT5oZWFkID0gKHRla2hleF9kYXRhX2xpc3RfdHlwZSAqKSBOVUxMOwotICB0ZGF0YS0+c3ltYm9scyA9IChzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QgKikgTlVMTDsKLSAgdGRhdGEtPmRhdGEgPSAoc3RydWN0IGRhdGFfc3RydWN0ICopIE5VTEw7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBsb29rcyBsaWtlIGl0J3MgaW4gVGVrSGV4IGZvcm1hdC4gSnVzdCBsb29rCi0gIGZvciBhIHBlcmNlbnQgc2lnbiBhbmQgc29tZSBoZXggZGlnaXRzICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXRla2hleF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIGJbNF07Ci0KLSAgdGVraGV4X2luaXQgKCk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoYiwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYlswXSAhPSAnJScgfHwgIUlTSEVYIChiWzFdKSB8fCAhSVNIRVggKGJbMl0pIHx8ICFJU0hFWCAoYlszXSkpCi0gICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0KLSAgdGVraGV4X21rb2JqZWN0IChhYmZkKTsKLQotICBwYXNzX292ZXIgKGFiZmQsIGZpcnN0X3BoYXNlKTsKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tb3ZlX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9ucCwgb2Zmc2V0LCBjb3VudCwgZ2V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb25wOwotICAgICBmaWxlX3B0ciBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYm9vbGVhbiBnZXQ7Ci17Ci0gIGJmZF92bWEgYWRkcjsKLSAgY2hhciAqbG9jYXRpb24gPSAoY2hhciAqKSBsb2NhdGlvbnA7Ci0gIGJmZF92bWEgcHJldl9udW1iZXIgPSAxOwkvKiBOb3RoaW5nIGNhbiBoYXZlIHRoaXMgYXMgYSBoaWdoIGJpdCovCi0gIHN0cnVjdCBkYXRhX3N0cnVjdCAqZCA9IChzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKikgTlVMTDsKLQotICBmb3IgKGFkZHIgPSBzZWN0aW9uLT52bWE7IGNvdW50ICE9IDA7IGNvdW50LS0sIGFkZHIrKykKLSAgICB7Ci0KLSAgICAgIGJmZF92bWEgY2h1bmtfbnVtYmVyID0gYWRkciAmIH5DSFVOS19NQVNLOwkvKiBHZXQgaGlnaCBiaXRzIG9mIGFkZHJlc3MgKi8KLSAgICAgIGJmZF92bWEgbG93X2JpdHMgPSBhZGRyICYgQ0hVTktfTUFTSzsKLQotICAgICAgaWYgKGNodW5rX251bWJlciAhPSBwcmV2X251bWJlcikKLQl7Ci0JICAvKiBEaWZmZXJlbnQgY2h1bmssIHNvIG1vdmUgcG9pbnRlciAqLwotCSAgZCA9IGZpbmRfY2h1bmsgKGFiZmQsIGNodW5rX251bWJlcik7Ci0JfQotCi0gICAgICBpZiAoZ2V0KQotCXsKLQkgIGlmIChkLT5jaHVua19pbml0W2xvd19iaXRzXSkKLQkgICAgewotCSAgICAgICpsb2NhdGlvbiA9IGQtPmNodW5rX2RhdGFbbG93X2JpdHNdOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGQtPmNodW5rX2RhdGFbbG93X2JpdHNdID0gKmxvY2F0aW9uOwotCSAgZC0+Y2h1bmtfaW5pdFtsb3dfYml0c10gPSAoKmxvY2F0aW9uICE9IDApOwotCX0KLQotICAgICAgbG9jYXRpb24rKzsKLQotICAgIH0KLQotfQotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbnA7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKLSAgICB7Ci0gICAgICBtb3ZlX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9ucCwgb2Zmc2V0LCBjb3VudCwgdHJ1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi10ZWtoZXhfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLS8qIHdlIGhhdmUgdG8gc2F2ZSB1cCBhbGwgdGhlIFRla2hleG9yZHMgZm9yIGEgc3BsdXJnZSBiZWZvcmUgb3V0cHV0LAotICAgICovCi0KLXN0YXRpYyBib29sZWFuCi10ZWtoZXhfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9ucCwgb2Zmc2V0LCBieXRlc190b19kbykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbnA7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBieXRlc190b19kbzsKLXsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICAvKiBUaGUgZmlyc3QgdGltZSBhcm91bmQsIGFsbG9jYXRlIGVub3VnaCBzZWN0aW9ucyB0byBob2xkIGFsbCB0aGUgY2h1bmtzICovCi0gICAgICBhc2VjdGlvbiAqcyA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgYmZkX3ZtYSB2bWE7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkKLQkgICAgewotCSAgICAgIGZvciAodm1hID0gcy0+dm1hICYgfkNIVU5LX01BU0s7Ci0JCSAgIHZtYSA8IHMtPnZtYSArIHMtPl9yYXdfc2l6ZTsKLQkJICAgdm1hICs9IENIVU5LX01BU0spCi0JCWZpbmRfY2h1bmsgKGFiZmQsIHZtYSk7Ci0JICAgIH0KLQl9Ci0KLSAgICB9Ci0gIGlmIChzZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0gICAgewotICAgICAgbW92ZV9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgYnl0ZXNfdG9fZG8sIGZhbHNlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLQotfQotCi1zdGF0aWMgdm9pZAotd3JpdGV2YWx1ZSAoZHN0LCB2YWx1ZSkKLSAgICAgY2hhciAqKmRzdDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgY2hhciAqcCA9ICpkc3Q7Ci0gIGludCBsZW47Ci0gIGludCBzaGlmdDsKLQotICBmb3IgKGxlbiA9IDgsIHNoaWZ0ID0gMjg7IHNoaWZ0OyBzaGlmdCAtPSA0LCBsZW4tLSkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlID4+IHNoaWZ0KSAmIDB4ZikKLQl7Ci0JICAqcCsrID0gbGVuICsgJzAnOwotCSAgd2hpbGUgKGxlbikKLQkgICAgewotCSAgICAgICpwKysgPSBkaWdzWyh2YWx1ZSA+PiBzaGlmdCkgJiAweGZdOwotCSAgICAgIHNoaWZ0IC09IDQ7Ci0JICAgICAgbGVuLS07Ci0JICAgIH0KLQkgICpkc3QgPSBwOwotCSAgcmV0dXJuOwotCi0JfQotICAgIH0KLSAgKnArKyA9ICcxJzsKLSAgKnArKyA9ICcwJzsKLSAgKmRzdCA9IHA7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZXN5bSAoZHN0LCBzeW0pCi0gICAgIGNoYXIgKipkc3Q7Ci0gICAgIENPTlNUIGNoYXIgKnN5bTsKLXsKLSAgY2hhciAqcCA9ICpkc3Q7Ci0gIGludCBsZW4gPSAoc3ltID8gc3RybGVuIChzeW0pIDogMCk7Ci0KLSAgaWYgKGxlbiA+PSAxNikKLSAgICB7Ci0gICAgICAqcCsrID0gJzAnOwotICAgICAgbGVuID0gMTY7Ci0gICAgfQotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGVuID09IDApCi0JewotCSAgKnArKyA9ICcxJzsKLQkgIHN5bSA9ICIkIjsKLQkgIGxlbiA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICpwKysgPSBkaWdzW2xlbl07Ci0JfQotICAgIH0KLQotICB3aGlsZSAobGVuLS0pCi0gICAgewotICAgICAgKnArKyA9ICpzeW0rKzsKLSAgICB9Ci0gICpkc3QgPSBwOwotfQotCi1zdGF0aWMgdm9pZAotb3V0IChhYmZkLCB0eXBlLCBzdGFydCwgZW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpzdGFydDsKLSAgICAgY2hhciAqZW5kOwotewotICBpbnQgc3VtID0gMDsKLSAgY2hhciAqczsKLSAgY2hhciBmcm9udFs2XTsKLSAgYmZkX3NpemVfdHlwZSB3cmxlbjsKLQotICBmcm9udFswXSA9ICclJzsKLSAgVE9IRVggKGZyb250ICsgMSwgZW5kIC0gc3RhcnQgKyA1KTsKLSAgZnJvbnRbM10gPSB0eXBlOwotCi0gIGZvciAocyA9IHN0YXJ0OyBzIDwgZW5kOyBzKyspCi0gICAgewotICAgICAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgKnNdOwotICAgIH0KLQotICBzdW0gKz0gc3VtX2Jsb2NrWyh1bnNpZ25lZCBjaGFyKSBmcm9udFsxXV07CS8qICBsZW5ndGggKi8KLSAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgZnJvbnRbMl1dOwotICBzdW0gKz0gc3VtX2Jsb2NrWyh1bnNpZ25lZCBjaGFyKSBmcm9udFszXV07CS8qIHR5cGUgKi8KLSAgVE9IRVggKGZyb250ICsgNCwgc3VtKTsKLSAgaWYgKGJmZF93cml0ZSAoZnJvbnQsIDEsIDYsIGFiZmQpICE9IDYpCi0gICAgYWJvcnQgKCk7Ci0gIGVuZFswXSA9ICdcbic7Ci0gIHdybGVuID0gZW5kIC0gc3RhcnQgKyAxOwotICBpZiAoYmZkX3dyaXRlIChzdGFydCwgMSwgd3JsZW4sIGFiZmQpICE9IHdybGVuKQotICAgIGFib3J0ICgpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgYnl0ZXNfd3JpdHRlbjsKLSAgY2hhciBidWZmZXJbMTAwXTsKLSAgYXN5bWJvbCAqKnA7Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmQ7Ci0KLSAgdGVraGV4X2luaXQgKCk7Ci0KLSAgYnl0ZXNfd3JpdHRlbiA9IDA7Ci0KLSAgLyogQW5kIHRoZSByYXcgZGF0YSAqLwotICBmb3IgKGQgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+ZGF0YTsKLSAgICAgICBkICE9IChzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKikgTlVMTDsKLSAgICAgICBkID0gZC0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgbG93OwotCi0gICAgICBDT05TVCBpbnQgc3BhbiA9IDMyOwotICAgICAgaW50IGFkZHI7Ci0KLSAgICAgIC8qIFdyaXRlIGl0IGluIGJsb2NrcyBvZiAzMiBieXRlcyAqLwotCi0gICAgICBmb3IgKGFkZHIgPSAwOyBhZGRyIDwgQ0hVTktfTUFTSyArIDE7IGFkZHIgKz0gc3BhbikKLQl7Ci0JICBpbnQgbmVlZCA9IDA7Ci0KLQkgIC8qIENoZWNrIHRvIHNlZSBpZiBuZWNlc3NhcnkgKi8KLQkgIGZvciAobG93ID0gMDsgIW5lZWQgJiYgbG93IDwgc3BhbjsgbG93KyspCi0JICAgIHsKLQkgICAgICBpZiAoZC0+Y2h1bmtfaW5pdFthZGRyICsgbG93XSkKLQkJbmVlZCA9IDE7Ci0JICAgIH0KLQkgIGlmIChuZWVkKQotCSAgICB7Ci0JICAgICAgY2hhciAqZHN0ID0gYnVmZmVyOwotCi0JICAgICAgd3JpdGV2YWx1ZSAoJmRzdCwgYWRkciArIGQtPnZtYSk7Ci0JICAgICAgZm9yIChsb3cgPSAwOyBsb3cgPCBzcGFuOyBsb3crKykKLQkJewotCQkgIFRPSEVYIChkc3QsIGQtPmNodW5rX2RhdGFbYWRkciArIGxvd10pOwotCQkgIGRzdCArPSAyOwotCQl9Ci0JICAgICAgb3V0IChhYmZkLCAnNicsIGJ1ZmZlciwgZHN0KTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIC8qIHdyaXRlIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzIGZvciB0aGUgc2VjdGlvbnMgKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKLQotICAgICAgd3JpdGVzeW0gKCZkc3QsIHMtPm5hbWUpOwotICAgICAgKmRzdCsrID0gJzEnOwotICAgICAgd3JpdGV2YWx1ZSAoJmRzdCwgcy0+dm1hKTsKLSAgICAgIHdyaXRldmFsdWUgKCZkc3QsIHMtPnZtYSArIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBvdXQgKGFiZmQsICczJywgYnVmZmVyLCBkc3QpOwotICAgIH0KLQotICAvKiBBbmQgdGhlIHN5bWJvbHMgKi8KLSAgaWYgKGFiZmQtPm91dHN5bWJvbHMpCi0gICAgewotICAgICAgZm9yIChwID0gYWJmZC0+b3V0c3ltYm9sczsgKnA7IHArKykKLQl7Ci0JICBpbnQgc2VjdGlvbl9jb2RlID0gYmZkX2RlY29kZV9zeW1jbGFzcyAoKnApOwotCi0JICBpZiAoc2VjdGlvbl9jb2RlICE9ICc/JykKLQkgICAgewkJCS8qIGRvIG5vdCBpbmNsdWRlIGRlYnVnIHN5bWJvbHMgKi8KLQkgICAgICBhc3ltYm9sICpzID0gKnA7Ci0JICAgICAgY2hhciAqZHN0ID0gYnVmZmVyOwotCi0JICAgICAgd3JpdGVzeW0gKCZkc3QsIHMtPnNlY3Rpb24tPm5hbWUpOwotCi0JICAgICAgc3dpdGNoIChzZWN0aW9uX2NvZGUpCi0JCXsKLQkJY2FzZSAnQSc6Ci0JCSAgKmRzdCsrID0gJzInOwotCQkgIGJyZWFrOwotCQljYXNlICdhJzoKLQkJICAqZHN0KysgPSAnNic7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0QnOgotCQljYXNlICdCJzoKLQkJY2FzZSAnTyc6Ci0JCSAgKmRzdCsrID0gJzQnOwotCQkgIGJyZWFrOwotCQljYXNlICdkJzoKLQkJY2FzZSAnYic6Ci0JCWNhc2UgJ28nOgotCQkgICpkc3QrKyA9ICc4JzsKLQkJICBicmVhazsKLQkJY2FzZSAnVCc6Ci0JCSAgKmRzdCsrID0gJzMnOwotCQkgIGJyZWFrOwotCQljYXNlICd0JzoKLQkJICAqZHN0KysgPSAnNyc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0MnOgotCQljYXNlICdVJzoKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHdyaXRlc3ltICgmZHN0LCBzLT5uYW1lKTsKLQkgICAgICB3cml0ZXZhbHVlICgmZHN0LCBzLT52YWx1ZSArIHMtPnNlY3Rpb24tPnZtYSk7Ci0JICAgICAgb3V0IChhYmZkLCAnMycsIGJ1ZmZlciwgZHN0KTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQW5kIHRoZSB0ZXJtaW5hdG9yICovCi0gIGlmIChiZmRfd3JpdGUgKCIlMDc4MTAxMFxuIiwgMSwgOSwgYWJmZCkgIT0gOSkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQKLXRla2hleF9zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZXhlYyBBVFRSSUJVVEVfVU5VU0VEOwotCi17Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi10ZWtoZXhfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdGVraGV4X3N5bWJvbF90eXBlICpuZXcgPQotICAodGVraGV4X3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0KSk7Ci0KLSAgaWYgKCFuZXcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICBuZXctPnByZXYgPSAoc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0ICopIE5VTEw7Ci0gIHJldHVybiAmKG5ldy0+c3ltYm9sKTsKLX0KLQotc3RhdGljIHZvaWQKLXRla2hleF9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi1zdGF0aWMgdm9pZAotdGVraGV4X3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGZpbGVwOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIHsKLQlDT05TVCBjaGFyICpzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQliZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCi0JZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzIiwKLQkJIHNlY3Rpb25fbmFtZSwKLQkJIHN5bWJvbC0+bmFtZSk7Ci0gICAgICB9Ci0gICAgfQotfQotCi0jZGVmaW5lCXRla2hleF9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgdGVraGV4X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSB0ZWtoZXhfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vawotCi0jZGVmaW5lIHRla2hleF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHRla2hleF9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgdGVraGV4X2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIHRla2hleF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHRla2hleF9yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIHRla2hleF9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSB0ZWtoZXhfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSB0ZWtoZXhfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSB0ZWtoZXhfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIHRla2hleF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSB0ZWtoZXhfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgdGVraGV4X2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIHRla2hleF9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotI2RlZmluZSB0ZWtoZXhfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi1jb25zdCBiZmRfdGFyZ2V0IHRla2hleF92ZWMgPQotewotICAidGVraGV4IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEVYRUNfUCB8CQkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfU1lNUyB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfUkVMT0MgfCBIQVNfTE9DQUxTIHwKLSAgIFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICB0ZWtoZXhfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgdGVraGV4X21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICB0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAodGVraGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHRla2hleCksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFICh0ZWtoZXgpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LICh0ZWtoZXgpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvdHJhZC1jb3JlLmMgYi9iZmQvdHJhZC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNmY2OWIuLjAwMDAwMDAKLS0tIGEvYmZkL3RyYWQtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qIEJGRCBiYWNrIGVuZCBmb3IgdHJhZGl0aW9uYWwgVW5peCBjb3JlIGZpbGVzIChVLWFyZWEgYW5kIHJhdyBzZWN0aW9ucykKLSAgIENvcHlyaWdodCAxOTg4LCA4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKb2huIEdpbG1vcmUgb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2luY2x1ZGUgPHN5cy91c2VyLmg+CQkvKiBBZnRlciBhLm91dC5oICAqLwotCi0jaWZkZWYgVFJBRF9IRUFERVIKLSNpbmNsdWRlIFRSQURfSEVBREVSCi0jZW5kaWYKLQotICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqZGF0YV9zZWN0aW9uOwotICAgICAgYXNlY3Rpb24gKnN0YWNrX3NlY3Rpb247Ci0gICAgICBhc2VjdGlvbiAqcmVnX3NlY3Rpb247Ci0gICAgICBzdHJ1Y3QgdXNlciB1OwotICAgIH07Ci0KLSNkZWZpbmUgY29yZV91cGFnZShiZmQpICgmKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dSkpCi0jZGVmaW5lIGNvcmVfZGF0YXNlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPmRhdGFfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9zdGFja3NlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnN0YWNrX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfcmVnc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+cmVnX3NlY3Rpb24pCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKnRyYWRfdW5peF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWNoYXIgKgkJdHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1pbnQJCXRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuCQl0cmFkX3VuaXhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0JCQkgUEFSQU1TICgoYmZkICpjb3JlX2JmZCwgYmZkICpleGVjX2JmZCkpOwotc3RhdGljIHZvaWQJc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEhhbmRsZSA0LjItc3R5bGUgKGFuZCBwZXJoYXBzIGFsc28gc3lzVi1zdHlsZSkgY29yZSBkdW1wIGZpbGUuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotY29uc3QgYmZkX3RhcmdldCAqCi10cmFkX3VuaXhfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLQotewotICBpbnQgdmFsOwotICBzdHJ1Y3QgdXNlciB1OwotICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqcmF3cHRyOwotCi0jaWZkZWYgVFJBRF9DT1JFX1VTRVJfT0ZGU0VUCi0gIC8qIElmIGRlZmluZWQsIHRoaXMgbWFjcm8gaXMgdGhlIGZpbGUgcG9zaXRpb24gb2YgdGhlIHVzZXIgc3RydWN0LiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBUUkFEX0NPUkVfVVNFUl9PRkZTRVQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiAwOwotI2VuZGlmCi0gICAgCi0gIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSZ1LCAxLCBzaXplb2YgdSwgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIHUpCi0gICAgewotICAgICAgLyogVG9vIHNtYWxsIHRvIGJlIGEgY29yZSBmaWxlICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBTYW5pdHkgY2hlY2sgcGVyaGFwcz8/PyAqLwotICBpZiAodS51X2RzaXplID4gMHgxMDAwMDAwKQkvKiBSZW1lbWJlciwgaXQncyBpbiBwYWdlcy4uLiAqLwotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAodS51X3NzaXplID4gMHgxMDAwMDAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoYXQgdGhlIHNpemUgY2xhaW1lZCBpcyBubyBncmVhdGVyIHRoYW4gdGhlIGZpbGUgc2l6ZS4gICovCi0gIHsKLSAgICBGSUxFICpzdHJlYW0gPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLSAgICAgIHJldHVybiAwOwotICAgIGlmIChmc3RhdCAoZmlsZW5vIChzdHJlYW0pLCAmc3RhdGJ1ZikgPCAwKQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgaWYgKCh1bnNpZ25lZCBsb25nKSAoTkJQRyAqIChVUEFHRVMgKyB1LnVfZHNpemUKLSNpZmRlZiBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUKLQkJCQkgLSB1LnVfdHNpemUKLSNlbmRpZgotCQkJCSArIHUudV9zc2l6ZSkpCi0JPiAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF9zaXplKQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0jaWZuZGVmIFRSQURfQ09SRV9BTExPV19BTllfRVhUUkFfU0laRQotICAgIGlmICgodW5zaWduZWQgbG9uZykgKE5CUEcgKiAoVVBBR0VTICsgdS51X2RzaXplICsgdS51X3NzaXplKQotI2lmZGVmIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQKLQkvKiBTb21lIHN5c3RlbXMgd3JpdGUgdGhlIGZpbGUgdG9vIGJpZy4gICovCi0JCQkgKyBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VECi0jZW5kaWYKLQkJCSApCi0JPCAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF9zaXplKQotICAgICAgewotCS8qIFRoZSBmaWxlIGlzIHRvbyBiaWcuICBNYXliZSBpdCdzIG5vdCBhIGNvcmUgZmlsZQotCSAgIG9yIHdlIG90aGVyd2lzZSBoYXZlIGJhZCB2YWx1ZXMgZm9yIHVfZHNpemUgYW5kIHVfc3NpemUpLiAgKi8KLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSNlbmRpZgotICB9Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgLyogQWxsb2NhdGUgYm90aCB0aGUgdXBhZ2UgYW5kIHRoZSBzdHJ1Y3QgY29yZV9kYXRhIGF0IG9uY2UsIHNvCi0gICAgIGEgc2luZ2xlIGZyZWUoKSB3aWxsIGZyZWUgdGhlbSBib3RoLiAgKi8KLSAgcmF3cHRyID0gKHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICopCi0JCWJmZF96bWFsbG9jIChzaXplb2YgKHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0KSk7Ci0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgCi0gIGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhID0gcmF3cHRyOwotCi0gIHJhd3B0ci0+dSA9IHU7IC8qQ29weSB0aGUgdWFyZWEgaW50byB0aGUgdGRhdGEgcGFydCBvZiB0aGUgYmZkICovCi0KLSAgLyogQ3JlYXRlIHRoZSBzZWN0aW9ucy4gIFRoaXMgaXMgcmF1bmNoeSwgYnV0IGJmZF9jbG9zZSB3YW50cyB0byBmcmVlCi0gICAgIHRoZW0gc2VwYXJhdGVseS4gICovCi0KLSAgY29yZV9zdGFja3NlYyhhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3N0YWNrc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfZGF0YXNlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgY29yZV9yZWdzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfcmVnc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uYW1lID0gIi5zdGFjayI7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5hbWUgPSAiLmRhdGEiOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5hbWUgPSAiLnJlZyI7Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplID0gIE5CUEcgKiB1LnVfZHNpemUKLSNpZmRlZiBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUKLSAgICAtIE5CUEcgKiB1LnVfdHNpemUKLSNlbmRpZgotICAgICAgOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+X3Jhd19zaXplID0gTkJQRyAqIHUudV9zc2l6ZTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOQlBHICogVVBBR0VTOyAvKiBMYXJnZXIgdGhhbiBzaXplb2Ygc3RydWN0IHUgKi8KLQotICAvKiBXaGF0IGEgaGFjay4uLiB3ZSdkIGxpa2UgdG8gc3RlYWwgaXQgZnJvbSB0aGUgZXhlYyBmaWxlLAotICAgICBzaW5jZSB0aGUgdXBhZ2UgZG9lcyBub3Qgc2VlbSB0byBwcm92aWRlIGl0LiAgRklYTUUuICAqLwotI2lmZGVmIEhPU1RfREFUQV9TVEFSVF9BRERSCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEhPU1RfREFUQV9TVEFSVF9BRERSOwotI2Vsc2UKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+dm1hID0gSE9TVF9URVhUX1NUQVJUX0FERFIgKyAoTkJQRyAqIHUudV90c2l6ZSk7Ci0jZW5kaWYKLQotI2lmZGVmIEhPU1RfU1RBQ0tfU1RBUlRfQUREUgotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+dm1hID0gSE9TVF9TVEFDS19TVEFSVF9BRERSOwotI2Vsc2UKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPnZtYSA9IEhPU1RfU1RBQ0tfRU5EX0FERFIgLSAoTkJQRyAqIHUudV9zc2l6ZSk7Ci0jZW5kaWYKLQotICAvKiBUaGlzIGlzIHRyaWNreS4gIEFzIHRoZSAicmVnaXN0ZXIgc2VjdGlvbiIsIHdlIGdpdmUgdGhlbSB0aGUgZW50aXJlCi0gICAgIHVwYWdlIGFuZCBzdGFjay4gIHUudV9hcjAgcG9pbnRzIHRvIHdoZXJlICJyZWdpc3RlciAwIiBpcyBzdG9yZWQuCi0gICAgIFRoZXJlIGFyZSB0d28gdHJpY2tzIHdpdGggdGhpcywgdGhvdWdoLiAgT25lIGlzIHRoYXQgdGhlIHJlc3Qgb2YgdGhlCi0gICAgIHJlZ2lzdGVycyBtaWdodCBiZSBhdCBwb3NpdGl2ZSBvciBuZWdhdGl2ZSAob3IgYm90aCkgZGlzcGxhY2VtZW50cwotICAgICBmcm9tICp1X2FyMC4gIFRoZSBvdGhlciBpcyB0aGF0IHVfYXIwIGlzIHNvbWV0aW1lcyBhbiBhYnNvbHV0ZSBhZGRyZXNzCi0gICAgIGluIGtlcm5lbCBtZW1vcnksIGFuZCBvbiBvdGhlciBzeXN0ZW1zIGl0IGlzIGFuIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIGBzdHJ1Y3QgdXNlcicuCi0gICAgIAotICAgICBBcyBhIHByYWN0aWNhbCBtYXR0ZXIsIHdlIGRvbid0IGtub3cgd2hlcmUgdGhlIHJlZ2lzdGVycyBhY3R1YWxseSBhcmUsCi0gICAgIHNvIHdlIGhhdmUgdG8gcGFzcyB0aGUgd2hvbGUgYXJlYSB0byBHREIuICBXZSBlbmNvZGUgdGhlIHZhbHVlIG9mIHVfYXIwCi0gICAgIGJ5IHNldHRpbmcgdGhlIC5yZWdzIHNlY3Rpb24gdXAgc28gdGhhdCBpdHMgdmlydHVhbCBtZW1vcnkgYWRkcmVzcwotICAgICAwIGlzIGF0IHRoZSBwbGFjZSBwb2ludGVkIHRvIGJ5IHVfYXIwIChieSBzZXR0aW5nIHRoZSB2bWEgb2YgdGhlIHN0YXJ0Ci0gICAgIG9mIHRoZSBzZWN0aW9uIHRvIC11X2FyMCkuICBHREIgdXNlcyB0aGlzIGluZm8gdG8gbG9jYXRlIHRoZSByZWdzLAotICAgICB1c2luZyBtaW5vciB0cmlja2VyeSB0byBnZXQgYXJvdW5kIHRoZSBvZmZzZXQtb3ItYWJzb2x1dGUtYWRkciBwcm9ibGVtLiAqLwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPnZtYSA9IDAgLSAoYmZkX3ZtYSkgdS51X2FyMDsKLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTkJQRyAqIFVQQUdFUzsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZpbGVwb3MgPSAoTkJQRyAqIFVQQUdFUykgKyBOQlBHICogdS51X2RzaXplCi0jaWZkZWYgVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFCi0gICAgLSBOQlBHICogdS51X3RzaXplCi0jZW5kaWYKLSAgICAgIDsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5maWxlcG9zID0gMDsgLyogUmVnaXN0ZXIgc2VnbWVudCBpcyB0aGUgdXBhZ2UgKi8KLQotICAvKiBBbGlnbiB0byB3b3JkIGF0IGxlYXN0ICovCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgYWJmZC0+c2VjdGlvbnMgPSBjb3JlX3N0YWNrc2VjIChhYmZkKTsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5leHQgPSBjb3JlX2RhdGFzZWMgKGFiZmQpOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9yZWdzZWMgKGFiZmQpOwotICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gMzsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotY2hhciAqCi10cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmbmRlZiBOT19DT1JFX0NPTU1BTkQKLSAgY2hhciAqY29tID0gYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9jb21tOwotICBpZiAoKmNvbSkKLSAgICByZXR1cm4gY29tOwotICBlbHNlCi0jZW5kaWYKLSAgICByZXR1cm4gMDsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWludAotdHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoaWdub3JlX2FiZmQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZmRlZiBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMCi0gIHJldHVybiBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGlnbm9yZV9hYmZkKTsKLSNlbHNlCi0gIHJldHVybiAtMTsJCS8qIEZJWE1FLCB3aGVyZSBpcyBpdD8gKi8KLSNlbmRpZgotfQotCi0vKiBBUkdTVVNFRCAqLwotYm9vbGVhbgotdHJhZF91bml4X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKmV4ZWNfYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgdHJhZF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAidHJhZC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgdHJhZF91bml4X2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAodHJhZF91bml4KSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIE5VTEwsCi0gICAgCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC92YXhuZXRic2QuYyBiL2JmZC92YXhuZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzN2QwOS4uMDAwMDAwMAotLS0gYS9iZmQvdmF4bmV0YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC9WQVggYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZQlCWVRFU19JTl9XT1JECTQKLSN1bmRlZiBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQkxMDI0Ci0jZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0KLSNkZWZpbmUJREVGQVVMVF9BUkNICWJmZF9hcmNoX3ZheAotI2RlZmluZQlERUZBVUxUX01JRCAJTV9WQVhfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVCh2YXhuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtdmF4LW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL3ZlcnNhZG9zLmMgYi9iZmQvdmVyc2Fkb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmNGY4OC4uMDAwMDAwMAotLS0gYS9iZmQvdmVyc2Fkb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDkyNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFZFUlNBZG9zLUUgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCA8c2FjQGN5Z251cy5jb20+LgotCi0gICBWZXJzYWRvcyBpcyBhIE1vdG9yb2xhIHRyYWRlbWFyay4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICAgU1VCU0VDVElPTgotICAgVkVSU0Fkb3MtRSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUgZm9ybWF0Ci0KLSAgIERFU0NSSVBUSU9OCi0KLSAgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIHJlYWRpbmcgb2YgVkVSU0Fkb3MgcmVsb2NhdGVhYmxlCi0gICBvYmplY3QgZmlsZXMuCi0KLSAgIEEgVkVSU0Fkb3MgZmlsZSBsb29rcyBsaWtlIGNvbnRhaW5zCi0KLSAgIG8gSW5kZW50aWZpY2F0aW9uIFJlY29yZAotICAgbyBFeHRlcm5hbCBTeW1ib2wgRGVmaW5pdGlvbiBSZWNvcmQKLSAgIG8gT2JqZWN0IFRleHQgUmVjcm9kCi0gICBvIEVuZCBSZWNvcmQKLQotCi0gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0KLXN0YXRpYyBib29sZWFuIHZlcnNhZG9zX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ZXJzYWRvc19zY2FuIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqdmVyc2Fkb3Nfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLQotCi0jZGVmaW5lIFZIRUFERVIgJzEnCi0jZGVmaW5lIFZFU1RERUYgJzInCi0jZGVmaW5lIFZPVFIgJzMnCi0jZGVmaW5lIFZFTkQgJzQnCi0KLQotI2RlZmluZSBFU19CQVNFIDE3CQkvKiBmaXJzdCBzeW1ib2wgaGFzIGVzZGlkIDE3ICovCi0KLS8qIFBlciBmaWxlIHRhcmdldCBkZXBlbmRlbnQgaW5mb3JtYXRpb24gKi8KLQotLyogb25lIGZvciBlYWNoIHNlY3Rpb24gKi8KLXN0cnVjdCBlc2RpZAotICB7Ci0gICAgYXNlY3Rpb24gKnNlY3Rpb247CQkvKiBwdHIgdG8gYmZkIHZlcnNpb24gKi8KLSAgICB1bnNpZ25lZCBjaGFyICpjb250ZW50czsJLyogdXNlZCB0byBidWlsZCBpbWFnZSAqLwotICAgIGludCBwYzsKLSAgICBpbnQgcmVsb2NzOwkJCS8qIHJlbG9jIGNvdW50LCB2YWxpZCBlbmQgb2YgcGFzcyAxICovCi0gICAgaW50IGRvbmVyZWw7CQkvKiBoYXZlIHJlbG9jcyBiZWVuIHRyYW5zbGF0ZWQgKi8KLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QgdmVyc2Fkb3NfZGF0YV9zdHJ1Y3QKLSAgewotICAgIGludCBlc19kb25lOwkJLyogY291bnQgb2Ygc3ltYm9sIGluZGV4LCBzdGFydHMgYXQgRVNfQkFTRSAqLwotICAgIGFzeW1ib2wgKnN5bWJvbHM7CQkvKiBwb2ludGVyIHRvIGxvY2FsIHN5bWJvbHMgKi8KLSAgICBjaGFyICpzdHJpbmdzOwkJLyogc3RyaW5ncyBvZiBhbGwgdGhlIGFib3ZlICovCi0gICAgaW50IHN0cmluZ2xlbjsJCS8qIGxlbiBvZiBzdHJpbmcgdGFibGUgKHZhbGlkIGVuZCBvZiBwYXNzMSkgKi8KLSAgICBpbnQgbnNlY3N5bXM7CQkvKiBudW1iZXIgb2Ygc2VjdGlvbnMgKi8KLQotICAgIGludCBuZGVmczsJCQkvKiBudW1iZXIgb2YgZXhwb3J0ZWQgc3ltYm9scyAodGhleSBkb250IGdldCBlc2RpZHMpICovCi0gICAgaW50IG5yZWZzOwkJCS8qIG51bWJlciBvZiBpbXBvcnRlZCBzeW1ib2xzICAodmFsaWQgZW5kIG9mIHBhc3MxKSAqLwotCi0gICAgaW50IHJlZl9pZHg7CQkvKiBjdXJyZW50IHByb2Nlc3NlZCB2YWx1ZSBvZiB0aGUgYWJvdmUgKi8KLSAgICBpbnQgZGVmX2lkeDsKLQotICAgIGludCBwYXNzXzJfZG9uZTsKLQotICAgIHN0cnVjdCBlc2RpZCBlWzE2XTsJCS8qIHBlciBzZWN0aW9uIGluZm8gKi8KLSAgICBpbnQgYWxlcnQ7CQkJLyogdG8gc2VlIGlmIHdlJ3JlIHRyYW1wbGluZyAqLwotICAgIGFzeW1ib2wgKnJlc3RbMjU2IC0gMTZdOwkvKiBwZXIgc3ltYm9sIGluZm8gKi8KLQotICB9Ci10ZGF0YV90eXBlOwotCi0jZGVmaW5lIFZEQVRBKGFiZmQpICAgICAgIChhYmZkLT50ZGF0YS52ZXJzYWRvc19kYXRhKQotI2RlZmluZSBFREFUQShhYmZkLCBuKSAgICAoYWJmZC0+dGRhdGEudmVyc2Fkb3NfZGF0YS0+ZVtuXSkKLSNkZWZpbmUgUkRBVEEoYWJmZCwgbikgICAgKGFiZmQtPnRkYXRhLnZlcnNhZG9zX2RhdGEtPnJlc3Rbbl0pCi0KLXN0cnVjdCBleHRfb3RyCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIHNpemU7Ci0gICAgY2hhciB0eXBlOwotICAgIHVuc2lnbmVkIGNoYXIgbWFwWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgZXNkaWQ7Ci0gICAgdW5zaWduZWQgY2hhciBkYXRhWzIwMF07Ci0gIH07Ci0KLXN0cnVjdCBleHRfdmhlYWRlcgotICB7Ci0gICAgdW5zaWduZWQgY2hhciBzaXplOwotICAgIGNoYXIgdHlwZTsJCQkvKiByZWNvcmQgdHlwZSAqLwotICAgIGNoYXIgbmFtZVsxMF07CQkvKiBtb2R1bGUgbmFtZSAqLwotICAgIGNoYXIgcmV2OwkJCS8qIG1vZHVsZSByZXYgbnVtYmVyICovCi0gICAgY2hhciBsYW5nOwotICAgIGNoYXIgdm9sWzRdOwotICAgIGNoYXIgdXNlclsyXTsKLSAgICBjaGFyIGNhdFs4XTsKLSAgICBjaGFyIGZuYW1lWzhdOwotICAgIGNoYXIgZXh0WzJdOwotICAgIGNoYXIgdGltZVszXTsKLSAgICBjaGFyIGRhdGVbM107Ci0gICAgY2hhciByZXN0WzIxMV07Ci0gIH07Ci0KLXN0cnVjdCBleHRfZXNkCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIHNpemU7Ci0gICAgY2hhciB0eXBlOwotICAgIHVuc2lnbmVkIGNoYXIgZXNkX2VudHJpZXNbMV07Ci0gIH07Ci0jZGVmaW5lIEVTRF9BQlMgCTAKLSNkZWZpbmUgRVNEX0NPTU1PTiAJMQotI2RlZmluZSBFU0RfU1REX1JFTF9TRUMgMgotI2RlZmluZSBFU0RfU0hSVF9SRUxfU0VDIDMKLSNkZWZpbmUgRVNEX1hERUZfSU5fU0VDIDQKLSNkZWZpbmUgRVNEX1hSRUZfU1lNICAgIDcKLSNkZWZpbmUgRVNEX1hSRUZfU0VDCTYKLSNkZWZpbmUgRVNEX1hERUZfSU5fQUJTIDUKLXVuaW9uIGV4dF9hbnkKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLSAgICBzdHJ1Y3QgZXh0X3ZoZWFkZXIgaGVhZGVyOwotICAgIHN0cnVjdCBleHRfZXNkIGVzZDsKLSAgICBzdHJ1Y3QgZXh0X290ciBvdHI7Ci0gIH07Ci0KLS8qIEluaXRpYWxpemUgYnkgZmlsbGluZyBpbiB0aGUgaGV4IGNvbnZlcnNpb24gYXJyYXkuICovCi0KLQotCi0KLQotLyogU2V0IHVwIHRoZSB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi12ZXJzYWRvc19ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+dGRhdGEudmVyc2Fkb3NfZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHRkYXRhX3R5cGUgKnRkYXRhID0gKHRkYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHRkYXRhX3R5cGUpKTsKLSAgICAgIGlmICh0ZGF0YSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGFiZmQtPnRkYXRhLnZlcnNhZG9zX2RhdGEgPSB0ZGF0YTsKLSAgICAgIHRkYXRhLT5zeW1ib2xzID0gTlVMTDsKLSAgICAgIFZEQVRBIChhYmZkKS0+YWxlcnQgPSAweDEyMzQ1Njc4OwotICAgIH0KLQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9tNjhrLCAwKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogUmVwb3J0IGEgcHJvYmxlbSBpbiBhbiBTIHJlY29yZCBmaWxlLiAgRklYTUU6IFRoaXMgcHJvYmFibHkgc2hvdWxkCi0gICBub3QgY2FsbCBmcHJpbnRmLCBidXQgd2UgcmVhbGx5IGRvIG5lZWQgc29tZSBtZWNoYW5pc20gZm9yIHByaW50aW5nCi0gICBlcnJvciBtZXNzYWdlcy4gICovCi0KLQotCi1zdGF0aWMgYXN5bWJvbCAqCi12ZXJzYWRvc19uZXdfc3ltYm9sIChhYmZkLCBzbnVtLCBuYW1lLCB2YWwsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgc251bTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIGFzeW1ib2wgKm4gPSBWREFUQSAoYWJmZCktPnN5bWJvbHMgKyBzbnVtOwotICBuLT5uYW1lID0gbmFtZTsKLSAgbi0+dmFsdWUgPSB2YWw7Ci0gIG4tPnNlY3Rpb24gPSBzZWM7Ci0gIG4tPnRoZV9iZmQgPSBhYmZkOwotICBuLT5mbGFncyA9IDA7Ci0gIHJldHVybiBuOwotfQotCi0KLXN0YXRpYyBpbnQKLWdldF9yZWNvcmQgKGFiZmQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICB1bmlvbiBleHRfYW55ICpwdHI7Ci17Ci0gIGJmZF9yZWFkICgmcHRyLT5zaXplLCAxLCAxLCBhYmZkKTsKLSAgaWYgKGJmZF9yZWFkICgoY2hhciAqKSBwdHIgKyAxLCAxLCBwdHItPnNpemUsIGFiZmQpICE9IHB0ci0+c2l6ZSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotZ2V0XzQgKHBwKQotICAgICB1bnNpZ25lZCBjaGFyICoqcHA7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnAgPSAqcHA7Ci0gICpwcCArPSA0OwotICByZXR1cm4gKHBbMF0gPDwgMjQpIHwgKHBbMV0gPDwgMTYpIHwgKHBbMl0gPDwgOCkgfCAocFszXSA8PCAwKTsKLX0KLQotdm9pZAotZ2V0XzEwIChwcCwgbmFtZSkKLSAgICAgdW5zaWduZWQgY2hhciAqKnBwOwotICAgICBjaGFyICpuYW1lOwotewotICBjaGFyICpwID0gKGNoYXIgKikgKnBwOwotICBpbnQgbGVuID0gMTA7Ci0gICpwcCArPSBsZW47Ci0gIHdoaWxlICgqcCAhPSAnICcKLQkgJiYgbGVuKQotICAgIHsKLSAgICAgICpuYW1lKysgPSAqcCsrOwotICAgICAgbGVuLS07Ci0gICAgfQotICAqbmFtZSA9IDA7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLW5ld19zeW1ib2xfc3RyaW5nIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKm4gPSBWREFUQSAoYWJmZCktPnN0cmluZ3M7Ci0gIHN0cmNweSAoVkRBVEEgKGFiZmQpLT5zdHJpbmdzLCBuYW1lKTsKLSAgVkRBVEEgKGFiZmQpLT5zdHJpbmdzICs9IHN0cmxlbiAoVkRBVEEgKGFiZmQpLT5zdHJpbmdzKSArIDE7Ci0gIHJldHVybiBuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2VzZCAoYWJmZCwgZXNkLCBwYXNzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBleHRfZXNkICplc2Q7Ci0gICAgIGludCBwYXNzOwotewotICAvKiBSZWFkIHRocm91Z2ggdGhlIGV4dCBkZWYgZm9yIHRoZSBlc3QgZW50cmllcyAqLwotICBpbnQgdG9nbyA9IGVzZC0+c2l6ZSAtIDI7Ci0gIGJmZF92bWEgc2l6ZTsKLSAgYmZkX3ZtYSBzdGFydDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgY2hhciBuYW1lWzExXTsKLSAgdW5zaWduZWQgY2hhciAqcHRyID0gZXNkLT5lc2RfZW50cmllczsKLSAgdW5zaWduZWQgY2hhciAqZW5kID0gcHRyICsgdG9nbzsKLSAgd2hpbGUgKHB0ciA8IGVuZCkKLSAgICB7Ci0gICAgICBpbnQgc2NuID0gKnB0ciAmIDB4ZjsKLSAgICAgIGludCB0eXAgPSAoKnB0ciA+PiA0KSAmIDB4ZjsKLQotICAgICAgLyogRGVjbGFyZSB0aGlzIHNlY3Rpb24gKi8KLSAgICAgIHNwcmludGYgKG5hbWUsICIlZCIsIHNjbik7Ci0gICAgICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsIHN0cmR1cCAobmFtZSkpOwotICAgICAgc2VjLT50YXJnZXRfaW5kZXggPSBzY247Ci0gICAgICBFREFUQSAoYWJmZCwgc2NuKS5zZWN0aW9uID0gc2VjOwotICAgICAgcHRyKys7Ci0gICAgICBzd2l0Y2ggKHR5cCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgRVNEX1hSRUZfU0VDOgotCWNhc2UgRVNEX1hSRUZfU1lNOgotCSAgewotCSAgICBpbnQgc251bSA9IFZEQVRBIChhYmZkKS0+cmVmX2lkeCsrOwotCSAgICBnZXRfMTAgKCZwdHIsIG5hbWUpOwotCSAgICBpZiAocGFzcyA9PSAxKQotCSAgICAgIHsKLQkJVkRBVEEgKGFiZmQpLT5zdHJpbmdsZW4gKz0gc3RybGVuIChuYW1lKSArIDE7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpbnQgZXNpZHg7Ci0JCWFzeW1ib2wgKnM7Ci0JCWNoYXIgKm4gPSBuZXdfc3ltYm9sX3N0cmluZyAoYWJmZCwgbmFtZSk7Ci0JCXMgPSB2ZXJzYWRvc19uZXdfc3ltYm9sIChhYmZkLCBzbnVtLCBuLCAwLAotCQkJCQkgJmJmZF91bmRfc2VjdGlvbiwgc2NuKTsKLQkJZXNpZHggPSBWREFUQSAoYWJmZCktPmVzX2RvbmUrKzsKLQkJUkRBVEEgKGFiZmQsIGVzaWR4IC0gRVNfQkFTRSkgPSBzOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0KLQljYXNlIEVTRF9BQlM6Ci0JICBzaXplID0gZ2V0XzQgKCZwdHIpOwotCSAgc3RhcnQgPSBnZXRfNCAoJnB0cik7Ci0JICBicmVhazsKLQljYXNlIEVTRF9TVERfUkVMX1NFQzoKLQljYXNlIEVTRF9TSFJUX1JFTF9TRUM6Ci0JICB7Ci0JICAgIHNlYy0+X3Jhd19zaXplID0gZ2V0XzQgKCZwdHIpOwotCSAgICBzZWMtPmZsYWdzIHw9IFNFQ19BTExPQzsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgRVNEX1hERUZfSU5fQUJTOgotCSAgc2VjID0gKGFzZWN0aW9uICopICYgYmZkX2Fic19zZWN0aW9uOwotCWNhc2UgRVNEX1hERUZfSU5fU0VDOgotCSAgewotCSAgICBpbnQgc251bSA9IFZEQVRBIChhYmZkKS0+ZGVmX2lkeCsrOwotCSAgICBsb25nIHZhbDsKLQkgICAgZ2V0XzEwICgmcHRyLCBuYW1lKTsKLQkgICAgdmFsID0gZ2V0XzQgKCZwdHIpOwotCSAgICBpZiAocGFzcyA9PSAxKQotCSAgICAgIHsKLQkJLyogSnVzdCByZW1lbWJlciB0aGUgc3ltYm9sICovCi0JCVZEQVRBIChhYmZkKS0+c3RyaW5nbGVuICs9IHN0cmxlbiAobmFtZSkgKyAxOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYXN5bWJvbCAqczsKLQkJY2hhciAqbiA9IG5ld19zeW1ib2xfc3RyaW5nIChhYmZkLCBuYW1lKTsKLQkJcyA9IHZlcnNhZG9zX25ld19zeW1ib2wgKGFiZmQsIHNudW0gKyBWREFUQSAoYWJmZCktPm5yZWZzLCBuLCB2YWwsIHNlYywgc2NuKTsKLQkJcy0+ZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0jZGVmaW5lIFJfUkVMV09SRCAxCi0jZGVmaW5lIFJfUkVMTE9ORyAyCi0jZGVmaW5lIFJfUkVMV09SRF9ORUcgMwotI2RlZmluZSBSX1JFTExPTkdfTkVHIDQKLQotcmVsb2NfaG93dG9fdHlwZSB2ZXJzYWRvc19ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8gKFJfUkVMV09SRCwgMCwgMSwgMTYsIGZhbHNlLAotCSAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLAotCSAiK3YxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfUkVMTE9ORywgMCwgMiwgMzIsIGZhbHNlLAotCSAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLAotCSAiK3YzMiIsIHRydWUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLQotICBIT1dUTyAoUl9SRUxXT1JEX05FRywgMCwgLTEsIDE2LCBmYWxzZSwKLQkgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwKLQkgIi12MTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1JFTExPTkdfTkVHLCAwLCAtMiwgMzIsIGZhbHNlLAotCSAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLAotCSAiLXYzMiIsIHRydWUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKSwKLX07Ci0KLQotc3RhdGljIGludAotZ2V0X29mZnNldCAobGVuLCBwdHIpCi0gICAgIGludCBsZW47Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLSAgaW50IHZhbCA9IDA7Ci0gIGlmIChsZW4pCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICB2YWwgPSAqcHRyKys7Ci0gICAgICBpZiAodmFsICYgMHg4MCkKLQl2YWwgfD0gfjB4ZmY7Ci0gICAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspCi0JdmFsID0gKHZhbCA8PCA4KSB8ICpwdHIrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3Nfb3RyIChhYmZkLCBvdHIsIHBhc3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dF9vdHIgKm90cjsKLSAgICAgaW50IHBhc3M7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgc2hpZnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKnNyY3AgPSBvdHItPmRhdGE7Ci0gIHVuc2lnbmVkIGNoYXIgKmVuZHAgPSAodW5zaWduZWQgY2hhciAqKSBvdHIgKyBvdHItPnNpemU7Ci0gIHVuc2lnbmVkIGludCBiaXRzID0gKG90ci0+bWFwWzBdIDw8IDI0KQotICB8IChvdHItPm1hcFsxXSA8PCAxNikKLSAgfCAob3RyLT5tYXBbMl0gPDwgOCkKLSAgfCAob3RyLT5tYXBbM10gPDwgMCk7Ci0KLSAgc3RydWN0IGVzZGlkICplc2RpZCA9ICZFREFUQSAoYWJmZCwgb3RyLT5lc2RpZCAtIDEpOwotICB1bnNpZ25lZCBjaGFyICpjb250ZW50cyA9IGVzZGlkLT5jb250ZW50czsKLSAgaW50IG5lZWRfY29udGVudHMgPSAwOwotICB1bnNpZ25lZCBpbnQgZHN0X2lkeCA9IGVzZGlkLT5wYzsKLQotICBmb3IgKHNoaWZ0ID0gKDEgPDwgMzEpOyBzaGlmdCAmJiBzcmNwIDwgZW5kcDsgc2hpZnQgPj49IDEpCi0gICAgewotICAgICAgaWYgKGJpdHMgJiBzaGlmdCkKLQl7Ci0JICBpbnQgZmxhZyA9ICpzcmNwKys7Ci0JICBpbnQgZXNkaWRzID0gKGZsYWcgPj4gNSkgJiAweDc7Ci0JICBpbnQgc2l6ZWlud29yZHMgPSAoKGZsYWcgPj4gMykgJiAxKSA/IDIgOiAxOwotCSAgaW50IG9mZnNldGxlbiA9IGZsYWcgJiAweDc7Ci0JICBpbnQgajsKLQotCi0JICBpZiAoZXNkaWRzID09IDApCi0JICAgIHsKLQkgICAgICAvKiBBIHplcm8gZXNkaWQgbWVhbnMgdGhlIG5ldyBwYyBpcyB0aGUgb2Zmc2V0IGdpdmVuICovCi0JICAgICAgZHN0X2lkeCArPSBnZXRfb2Zmc2V0IChvZmZzZXRsZW4sIHNyY3ApOwotCSAgICAgIHNyY3AgKz0gb2Zmc2V0bGVuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgdmFsID0gZ2V0X29mZnNldCAob2Zmc2V0bGVuLCBzcmNwICsgZXNkaWRzKTsKLQkgICAgICBpZiAocGFzcyA9PSAxKQotCQluZWVkX2NvbnRlbnRzID0gMTsKLQkgICAgICBlbHNlCi0JCWZvciAoaiA9IDA7IGogPCBzaXplaW53b3JkcyAqIDI7IGorKykKLQkJICB7Ci0JCSAgICBjb250ZW50c1tkc3RfaWR4ICsgKHNpemVpbndvcmRzICogMikgLSBqIC0gMV0gPSB2YWw7Ci0JCSAgICB2YWwgPj49IDg7Ci0JCSAgfQotCi0JICAgICAgZm9yIChqID0gMDsgaiA8IGVzZGlkczsgaisrKQotCQl7Ci0JCSAgaW50IGVzZGlkID0gKnNyY3ArKzsKLQotCQkgIGlmIChlc2RpZCkKLQkJICAgIHsKLQkJICAgICAgaW50IHJuID0gRURBVEEgKGFiZmQsIG90ci0+ZXNkaWQgLSAxKS5yZWxvY3MrKzsKLQkJICAgICAgaWYgKHBhc3MgPT0gMSkKLQkJCXsKLQkJCSAgLyogdGhpcyBpcyB0aGUgZmlyc3QgcGFzcyBvdmVyIHRoZSBkYXRhLCAKLQkJCSAgICAganVzdCByZW1lbWJlciB0aGF0IHdlIG5lZWQgYSByZWxvYyAqLwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGFyZWxlbnQgKm4gPQotCQkJICBFREFUQSAoYWJmZCwgb3RyLT5lc2RpZCAtIDEpLnNlY3Rpb24tPnJlbG9jYXRpb24gKyBybjsKLQkJCSAgbi0+YWRkcmVzcyA9IGRzdF9pZHg7Ci0KLQkJCSAgbi0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgZXNkaWQ7Ci0JCQkgIG4tPmFkZGVuZCA9IDA7Ci0JCQkgIG4tPmhvd3RvID0gdmVyc2Fkb3NfaG93dG9fdGFibGUgKyAoKGogJiAxKSAqIDIpICsgKHNpemVpbndvcmRzIC0gMSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBzcmNwICs9IG9mZnNldGxlbjsKLQkgICAgICBkc3RfaWR4ICs9IHNpemVpbndvcmRzICogMjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBuZWVkX2NvbnRlbnRzID0gMTsKLQkgIGlmIChkc3RfaWR4IDwgZXNkaWQtPnNlY3Rpb24tPl9yYXdfc2l6ZSkKLQkgICAgaWYgKHBhc3MgPT0gMikKLQkgICAgICB7Ci0JCS8qIGFic29sdXRlIGNvZGUsIGNvbWVzIGluIDE2IGJpdCBsdW1wcyAqLwotCQljb250ZW50c1tkc3RfaWR4XSA9IHNyY3BbMF07Ci0JCWNvbnRlbnRzW2RzdF9pZHggKyAxXSA9IHNyY3BbMV07Ci0JICAgICAgfQotCSAgZHN0X2lkeCArPSAyOwotCSAgc3JjcCArPSAyOwotCX0KLSAgICB9Ci0gIEVEQVRBIChhYmZkLCBvdHItPmVzZGlkIC0gMSkucGMgPSBkc3RfaWR4OwotCi0gIGlmICghY29udGVudHMgJiYgbmVlZF9jb250ZW50cykKLSAgICBlc2RpZC0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIGVzZGlkLT5zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0KLX0KLQotc3RhdGljIGJvb2xlYW4KLXZlcnNhZG9zX3NjYW4gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGxvb3AgPSAxOwotICBpbnQgaTsKLSAgaW50IGo7Ci0gIGludCBuc2VjcyA9IDA7Ci0KLSAgVkRBVEEgKGFiZmQpLT5ucmVmcyA9IDA7Ci0gIFZEQVRBIChhYmZkKS0+bmRlZnMgPSAwOwotICBWREFUQSAoYWJmZCktPnJlZl9pZHggPSAwOwotICBWREFUQSAoYWJmZCktPmRlZl9pZHggPSAwOwotCi0gIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIHVuaW9uIGV4dF9hbnkgYW55OwotICAgICAgaWYgKCFnZXRfcmVjb3JkIChhYmZkLCAmYW55KSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIHN3aXRjaCAoYW55LmhlYWRlci50eXBlKQotCXsKLQljYXNlIFZIRUFERVI6Ci0JICBicmVhazsKLQljYXNlIFZFTkQ6Ci0JICBsb29wID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgVkVTVERFRjoKLQkgIHByb2Nlc3NfZXNkIChhYmZkLCAmYW55LmVzZCwgMSk7Ci0JICBicmVhazsKLQljYXNlIFZPVFI6Ci0JICBwcm9jZXNzX290ciAoYWJmZCwgJmFueS5vdHIsIDEpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSByZWxvY3MgYW5kIHNlY3Rpb25zICovCi0KLSAgVkRBVEEgKGFiZmQpLT5ucmVmcyA9IFZEQVRBIChhYmZkKS0+cmVmX2lkeDsKLSAgVkRBVEEgKGFiZmQpLT5uZGVmcyA9IFZEQVRBIChhYmZkKS0+ZGVmX2lkeDsKLSAgVkRBVEEgKGFiZmQpLT5yZWZfaWR4ID0gMDsKLSAgVkRBVEEgKGFiZmQpLT5kZWZfaWR4ID0gMDsKLQotICBhYmZkLT5zeW1jb3VudCA9IFZEQVRBIChhYmZkKS0+bnJlZnMgKyBWREFUQSAoYWJmZCktPm5kZWZzOwotCi0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlc2RpZCAqZXNkaWQgPSAmRURBVEEgKGFiZmQsIGkpOwotICAgICAgaWYgKGVzZGlkLT5zZWN0aW9uKQotCXsKLQkgIGVzZGlkLT5zZWN0aW9uLT5yZWxvY2F0aW9uCi0JICAgID0gKGFyZWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFyZWxlbnQpICogZXNkaWQtPnJlbG9jcyk7Ci0KLQkgIGVzZGlkLT5wYyA9IDA7Ci0KLQkgIGlmIChlc2RpZC0+Y29udGVudHMpCi0JICAgIGVzZGlkLT5zZWN0aW9uLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQ7Ci0KLQkgIGVzZGlkLT5zZWN0aW9uLT5yZWxvY19jb3VudCA9IGVzZGlkLT5yZWxvY3M7Ci0JICBpZiAoZXNkaWQtPnJlbG9jcykKLQkgICAgZXNkaWQtPnNlY3Rpb24tPmZsYWdzIHw9IFNFQ19SRUxPQzsKLQotCSAgZXNkaWQtPnJlbG9jcyA9IDA7Ci0KLQkgIC8qIEFkZCBhbiBlbnRyeSBpbnRvIHRoZSBzeW1ib2wgdGFibGUgZm9yIGl0ICovCi0JICBuc2VjcysrOwotCSAgVkRBVEEgKGFiZmQpLT5zdHJpbmdsZW4gKz0gc3RybGVuIChlc2RpZC0+c2VjdGlvbi0+bmFtZSkgKyAxOwotCX0KLSAgICB9Ci0KLSAgYWJmZC0+c3ltY291bnQgKz0gbnNlY3M7Ci0KLSAgVkRBVEEgKGFiZmQpLT5zeW1ib2xzID0gKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgICAgICBzaXplb2YgKGFzeW1ib2wpICogKGFiZmQtPnN5bWNvdW50KSk7Ci0KLSAgVkRBVEEgKGFiZmQpLT5zdHJpbmdzID0gYmZkX2FsbG9jIChhYmZkLCBWREFUQSAoYWJmZCktPnN0cmluZ2xlbik7Ci0KLSAgaWYgKChWREFUQSAoYWJmZCktPnN5bWJvbHMgPT0gTlVMTCAmJiBhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgICB8fCAoVkRBVEEgKGFiZmQpLT5zdHJpbmdzID09IE5VTEwgJiYgVkRBVEEgKGFiZmQpLT5zdHJpbmdsZW4gPiAwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQWN0dWFsbHkgZmlsbCBpbiB0aGUgc2VjdGlvbiBzeW1ib2xzLAotICAgICB3ZSBzdGljayB0aGVtIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlICovCi0KLSAgZm9yIChqID0gVkRBVEEgKGFiZmQpLT5ucmVmcyArIFZEQVRBIChhYmZkKS0+bmRlZnMsIGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZXNkaWQgKmVzZGlkID0gJkVEQVRBIChhYmZkLCBpKTsKLSAgICAgIGFzZWN0aW9uICpzZWMgPSBlc2RpZC0+c2VjdGlvbjsKLSAgICAgIGlmIChzZWMpCi0JewotCSAgYXN5bWJvbCAqcyA9IFZEQVRBIChhYmZkKS0+c3ltYm9scyArIGo7Ci0JICBzLT5uYW1lID0gbmV3X3N5bWJvbF9zdHJpbmcgKGFiZmQsIHNlYy0+bmFtZSk7Ci0JICBzLT5zZWN0aW9uID0gc2VjOwotCSAgcy0+ZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JICBzLT52YWx1ZSA9IDA7Ci0JICBzLT50aGVfYmZkID0gYWJmZDsKLQkgIGorKzsKLQl9Ci0gICAgfQotICBpZiAoYWJmZC0+c3ltY291bnQpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgLyogU2V0IHRoaXMgdG8gbnNlY3MgLSBzaW5jZSB3ZSd2ZSBhbHJlYWR5IHBsYW50ZWQgdGhlIHNlY3Rpb24KLSAgICAgc3ltYm9scyAqLwotICBWREFUQSAoYWJmZCktPm5zZWNzeW1zID0gbnNlY3M7Ci0KLSAgVkRBVEEgKGFiZmQpLT5yZWZfaWR4ID0gMDsKLQotICByZXR1cm4gMTsKLX0KLQotCi0KLS8qIENoZWNrIHdoZXRoZXIgYW4gZXhpc3RpbmcgZmlsZSBpcyBhIHZlcnNhZG9zICBmaWxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotdmVyc2Fkb3Nfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dF92aGVhZGVyIGV4dDsKLSAgdW5zaWduZWQgY2hhciBsZW47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiZmRfcmVhZCAoJmxlbiwgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9yZWFkICgmZXh0LnR5cGUsIDEsIGxlbiwgYWJmZCkgIT0gbGVuKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBndWVzcyB0aGF0IHRoZSBsYW5ndWFnZSBmaWVsZCB3aWxsIG5ldmVyIGJlIGxhcmdlciB0aGFuIDEwLgotICAgICBJbiBzYW1wbGUgZmlsZXMsIGl0IGlzIGFsd2F5cyBlaXRoZXIgMCBvciAxLiAgQ2hlY2tpbmcgZm9yIHRoaXMKLSAgICAgcHJldmVudHMgY29uZnVzaW9uIHdpdGggSW50ZWwgSGV4IGZpbGVzLiAgKi8KLSAgaWYgKGV4dC50eXBlICE9IFZIRUFERVIKLSAgICAgIHx8IGV4dC5sYW5nID4gMTApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogT0ssIGxvb2tzIGxpa2UgYSByZWNvcmQsIGJ1aWxkIHRoZSB0ZGF0YSBhbmQgcmVhZCBpbi4gICovCi0KLSAgaWYgKCF2ZXJzYWRvc19ta29iamVjdCAoYWJmZCkKLSAgICAgIHx8ICF2ZXJzYWRvc19zY2FuIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotdmVyc2Fkb3NfcGFzc18yIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuaW9uIGV4dF9hbnkgYW55OwotCi0gIGlmIChWREFUQSAoYWJmZCktPnBhc3NfMl9kb25lKQotICAgIHJldHVybiAxOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgVkRBVEEgKGFiZmQpLT5lc19kb25lID0gRVNfQkFTRTsKLQotCi0gIC8qIHJlYWQgcmVjb3JkcyB0aWxsIHdlIGdldCB0byB3aGVyZSB3ZSB3YW50IHRvIGJlICovCi0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgZ2V0X3JlY29yZCAoYWJmZCwgJmFueSk7Ci0gICAgICBzd2l0Y2ggKGFueS5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBWRU5EOgotCSAgVkRBVEEgKGFiZmQpLT5wYXNzXzJfZG9uZSA9IDE7Ci0JICByZXR1cm4gMTsKLQljYXNlIFZFU1RERUY6Ci0JICBwcm9jZXNzX2VzZCAoYWJmZCwgJmFueS5lc2QsIDIpOwotCSAgYnJlYWs7Ci0JY2FzZSBWT1RSOgotCSAgcHJvY2Vzc19vdHIgKGFiZmQsICZhbnkub3RyLCAyKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12ZXJzYWRvc19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoIXZlcnNhZG9zX3Bhc3NfMiAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1lbWNweSAobG9jYXRpb24sCi0JICBFREFUQSAoYWJmZCwgc2VjdGlvbi0+dGFyZ2V0X2luZGV4KS5jb250ZW50cyArIG9mZnNldCwKLQkgIChzaXplX3QpIGNvdW50KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSB2ZXJzYWRvc19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLXN0YXRpYyBib29sZWFuCi12ZXJzYWRvc19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgYnl0ZXNfdG9fZG8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIHNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGxvY2F0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZpbGVfcHRyIG9mZnNldCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfc2l6ZV90eXBlIGJ5dGVzX3RvX2RvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKkFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci12ZXJzYWRvc19zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZXhlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotdmVyc2Fkb3NfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotdmVyc2Fkb3NfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXZlcnNhZG9zX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgc3ltY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGFzeW1ib2wgKnM7Ci0KLSAgdmVyc2Fkb3NfcGFzc18yIChhYmZkKTsKLQotICBmb3IgKGkgPSAwLCBzID0gVkRBVEEgKGFiZmQpLT5zeW1ib2xzOwotICAgICAgIGkgPCBzeW1jb3VudDsKLSAgICAgICBzKyssIGkrKykKLSAgICB7Ci0gICAgICAqYWxvY2F0aW9uKysgPSBzOwotICAgIH0KLQotICAqYWxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0KLS8qQVJHU1VTRUQgKi8KLXZvaWQKLXZlcnNhZG9zX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qQVJHU1VTRUQgKi8KLXZvaWQKLXZlcnNhZG9zX3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICUtNXMgJXMiLAotCSAgICAgICBzeW1ib2wtPnNlY3Rpb24tPm5hbWUsCi0JICAgICAgIHN5bWJvbC0+bmFtZSk7Ci0KLSAgICB9Ci19Ci0KLWxvbmcKLXZlcnNhZG9zX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi0KLWxvbmcKLXZlcnNhZG9zX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYXJlbGVudCAqc3JjOwotCi0gIHZlcnNhZG9zX3Bhc3NfMiAoYWJmZCk7Ci0gIHNyYyA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIGlmICghRURBVEEgKGFiZmQsIHNlY3Rpb24tPnRhcmdldF9pbmRleCkuZG9uZXJlbCkKLSAgICB7Ci0gICAgICBFREFUQSAoYWJmZCwgc2VjdGlvbi0+dGFyZ2V0X2luZGV4KS5kb25lcmVsID0gMTsKLSAgICAgIC8qIHRyYW5zbGF0ZSBmcm9tIGluZGV4ZXMgdG8gc3ltcHRyIHB0cnMgKi8KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgIGludCBlc2RpZCA9IChpbnQpIHNyY1tjb3VudF0uc3ltX3B0cl9wdHI7Ci0KLQkgIGlmIChlc2RpZCA9PSAwKQotCSAgICB7Ci0JICAgICAgc3JjW2NvdW50XS5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbi5zeW1ib2xfcHRyX3B0cjsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXNkaWQgPCBFU19CQVNFKQkvKiBTZWN0aW9uIHJlbGF0aXZlIHRoaW5nICovCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZXNkaWQgKmUgPSAmRURBVEEgKGFiZmQsIGVzZGlkIC0gMSk7Ci0JICAgICAgaWYgKCFzZWN0aW9uKQotCQl7Ci0JCSAvKiogcmVsb2NhdGlvbiByZWxhdGl2ZSB0byBzZWN0aW9uIHdoaWNoIHdhcwotCQkgICBuZXZlciBkZWNsYXJlZCAhICovCi0JCX0KLQkgICAgICBzcmNbY291bnRdLnN5bV9wdHJfcHRyID0gZS0+c2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNyY1tjb3VudF0uc3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgZXNkaWQgLSBFU19CQVNFOwotCSAgICB9Ci0KLQl9Ci0gICAgfQotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgICpyZWxwdHIrKyA9IHNyYysrOwotICAgIH0KLSAgKnJlbHB0ciA9IDA7Ci0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotI2RlZmluZQl2ZXJzYWRvc19jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIHZlcnNhZG9zX25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotI2RlZmluZSB2ZXJzYWRvc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHZlcnNhZG9zX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSB2ZXJzYWRvc19maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSB2ZXJzYWRvc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHZlcnNhZG9zX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgdmVyc2Fkb3NfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgdmVyc2Fkb3Nfc2V0X2FyY2hfbWFjaCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSB2ZXJzYWRvc19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIHZlcnNhZG9zX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSB2ZXJzYWRvc19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSB2ZXJzYWRvc19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSB2ZXJzYWRvc19iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSB2ZXJzYWRvc19iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotY29uc3QgYmZkX3RhcmdldCB2ZXJzYWRvc192ZWMgPQotewotICAidmVyc2Fkb3MiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF92ZXJzYWRvc19mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIHZlcnNhZG9zX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHZlcnNhZG9zX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfZmFsc2UsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDICh2ZXJzYWRvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTICh2ZXJzYWRvcyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LICh2ZXJzYWRvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC92bXMtZ3NkLmMgYi9iZmQvdm1zLWdzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzNmZTY5Li4wMDAwMDAwCi0tLSBhL2JmZC92bXMtZ3NkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MjcgKzAsMCBAQAotLyogdm1zLWdzZC5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVkFYIChvcGVuVk1TL1ZBWCkgYW5kCi0gICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBJbmMuCi0KLSAgIGdvIGFuZCByZWFkIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgKGVzcC4gYXBwZW5kaXggQikKLSAgIGlmIHlvdSBkb24ndCBrbm93IHdoYXQncyBnb2luZyBvbiBoZXJlIDotKQotCi0gICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJ2bXMuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHR5cGljYWwgc2VjdGlvbnMgZm9yIHZheCBvYmplY3QgZmlsZXMgICovCi0KLSNkZWZpbmUgVkFYX0NPREVfTkFNRQkJIiRDT0RFIgotI2RlZmluZSBWQVhfREFUQV9OQU1FCQkiJERBVEEiCi0jZGVmaW5lIFZBWF9BRERSRVNTX0RBVEFfTkFNRQkiJEFERFJFU1NfREFUQSIKLQotLyogdHlwaWNhbCBzZWN0aW9ucyBmb3IgZXZheCBvYmplY3QgZmlsZXMgICovCi0KLSNkZWZpbmUgRVZBWF9BQlNfTkFNRQkJIiRBQlMkIgotI2RlZmluZSBFVkFYX0NPREVfTkFNRQkJIiRDT0RFJCIKLSNkZWZpbmUgRVZBWF9MSU5LX05BTUUJCSIkTElOSyQiCi0jZGVmaW5lIEVWQVhfREFUQV9OQU1FCQkiJERBVEEkIgotI2RlZmluZSBFVkFYX0JTU19OQU1FCQkiJEJTUyQiCi0jZGVmaW5lIEVWQVhfUkVBRE9OTFlBRERSX05BTUUJIiRSRUFET05MWV9BRERSJCIKLSNkZWZpbmUgRVZBWF9SRUFET05MWV9OQU1FCSIkUkVBRE9OTFkkIgotI2RlZmluZSBFVkFYX0xJVEVSQUxfTkFNRQkiJExJVEVSQUwkIgotI2RlZmluZSBFVkFYX0NPTU1PTl9OQU1FCSIkQ09NTU9OJCIKLSNkZWZpbmUgRVZBWF9MT0NBTF9OQU1FCQkiJExPQ0FMJCIKLQotc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgewotICBjaGFyICpuYW1lOwkJCS8qIG5hbWUgb2Ygc2VjdGlvbiAqLwotICBpbnQgdmZsYWdzX2Fsd2F5czsKLSAgZmxhZ3dvcmQgZmxhZ3NfYWx3YXlzOwkvKiBmbGFncyB3ZSBzZXQgYWx3YXlzICovCi0gIGludCB2ZmxhZ3NfaGFzc2l6ZTsKLSAgZmxhZ3dvcmQgZmxhZ3NfaGFzc2l6ZTsJLyogZmxhZ3Mgd2Ugc2V0IGlmIHRoZSBzZWN0aW9uIGhhcyBhIHNpemUgPiAwICovCi19OwotCi0vKiBUaGVzZSBmbGFncyBhcmUgZGVjY3J0bC92YXhjcnRsIChvcGVuVk1TIDYuMiBWQVgpIGNvbXBhdGlibGUgICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCB2YXhfc2VjdGlvbl9mbGFnc1tdID0gewotICB7IFZBWF9DT0RFX05BTUUsCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fU0hSfEdQU19TX01fRVhFfEdQU19TX01fUkQpLAotCShTRUNfQ09ERSksCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fU0hSfEdQU19TX01fRVhFfEdQU19TX01fUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19DT0RFfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IFZBWF9EQVRBX05BTUUsCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpLAotCShTRUNfREFUQSksCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IFZBWF9BRERSRVNTX0RBVEFfTkFNRSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9SRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKLSAgeyBOVUxMLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKSwKLQkoU0VDX0RBVEEpLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfQotfTsKLQotCi0vKiBUaGVzZSBmbGFncyBhcmUgZGVjY3J0bC92YXhjcnRsIChvcGVuVk1TIDYuMiBBbHBoYSkgY29tcGF0aWJsZSAgKi8KLQotc3RhdGljIHN0cnVjdCBzZWNfZmxhZ3Nfc3RydWN0IGV2YXhfc2VjdGlvbl9mbGFnc1tdID0gewotICB7IEVWQVhfQUJTX05BTUUsCi0JKEVHUFNfU19WX1NIUiksCi0JKFNFQ19EQVRBKSwKLQkoRUdQU19TX1ZfU0hSKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0NPREVfTkFNRSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfRVhFKSwKLQkoU0VDX0NPREUpLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9FWEUpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19DT0RFfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfTElURVJBTF9OQU1FLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9SRHxFR1BTX1NfVl9OT01PRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX1JEKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfUkVBRE9OTFl8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9MSU5LX05BTUUsCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX1JFQURPTkxZfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfREFUQV9OQU1FLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUfEVHUFNfU19WX05PTU9EKSwKLQkoU0VDX0RBVEEpLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0JTU19OQU1FLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUfEVHUFNfU19WX05PTU9EKSwKLQkoU0VDX05PX0ZMQUdTKSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVHxFR1BTX1NfVl9OT01PRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9SRUFET05MWUFERFJfTkFNRSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCi0JKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX1JFQURPTkxZX05BTUUsCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX1JEfEVHUFNfU19WX05PTU9EKSwKLQkoU0VDX0RBVEF8U0VDX1JFQURPTkxZKSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0xPQ0FMX05BTUUsCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfREFUQSksCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IE5VTEwsCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfREFUQSksCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9Ci19OwotCi0vKiBSZXRyaWV2ZSBiZmQgc2VjdGlvbiBmbGFncyBieSBuYW1lIGFuZCBzaXplICAqLwotCi1zdGF0aWMgZmxhZ3dvcmQKLXZtc19zZWNmbGFnX2J5X25hbWUgKGFiZmQsIHNlY3Rpb25fZmxhZ3MsIG5hbWUsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgKnNlY3Rpb25fZmxhZ3M7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaSA9IDA7Ci0KLSAgd2hpbGUgKHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICgoUFJJVihpc192YXgpPwotCSAgICBzdHJjYXNlY21wIChuYW1lLCBzZWN0aW9uX2ZsYWdzW2ldLm5hbWUpOgotCSAgICBzdHJjbXAgKG5hbWUsIHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSkpID09IDApCi0JewotCSAgaWYgKHNpemUgPiAwKQotCSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS5mbGFnc19oYXNzaXplOwotCSAgZWxzZQotCSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS5mbGFnc19hbHdheXM7Ci0JfQotICAgICAgaSsrOwotICAgIH0KLSAgaWYgKHNpemUgPiAwKQotICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLmZsYWdzX2hhc3NpemU7Ci0gIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLmZsYWdzX2Fsd2F5czsKLX0KLQotCi0vKiBSZXRyaWV2ZSB2bXMgc2VjdGlvbiBmbGFncyBieSBuYW1lIGFuZCBzaXplICAqLwotCi1zdGF0aWMgZmxhZ3dvcmQKLXZtc19lc2VjZmxhZ19ieV9uYW1lIChzZWN0aW9uX2ZsYWdzLCBuYW1lLCBzaXplKQotICAgICBzdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCAqc2VjdGlvbl9mbGFnczsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBpID0gMDsKLQotICB3aGlsZSAoc2VjdGlvbl9mbGFnc1tpXS5uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgc2VjdGlvbl9mbGFnc1tpXS5uYW1lKSA9PSAwKQotCXsKLQkgIGlmIChzaXplID4gMCkKLQkgICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0udmZsYWdzX2hhc3NpemU7Ci0JICBlbHNlCi0JICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLnZmbGFnc19hbHdheXM7Ci0JfQotICAgICAgaSsrOwotICAgIH0KLSAgaWYgKHNpemUgPiAwKQotICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLnZmbGFnc19oYXNzaXplOwotICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS52ZmxhZ3NfYWx3YXlzOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiBWTVNfREVCVUcKLS8qIGRlYnVnICovCi0KLXN0cnVjdCBmbGFnZGVzY3N0cnVjdCB7IGNoYXIgKm5hbWU7IGZsYWd3b3JkIHZhbHVlOyB9OwotCi0vKiBDb252ZXJ0IGZsYWcgdG8gcHJpbnRhYmxlIHN0cmluZyAgKi8KLQotc3RhdGljIGNoYXIgKgotZmxhZzJzdHIoZmxhZ2Rlc2MsIGZsYWdzKQotICAgICBzdHJ1Y3QgZmxhZ2Rlc2NzdHJ1Y3QgKmZsYWdkZXNjOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLQotICBzdGF0aWMgY2hhciByZXNbNjRdOwotICBpbnQgbmV4dCA9IDA7Ci0KLSAgcmVzWzBdID0gMDsKLSAgd2hpbGUgKGZsYWdkZXNjLT5uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKChmbGFncyAmIGZsYWdkZXNjLT52YWx1ZSkgIT0gMCkKLQl7Ci0JICBpZiAobmV4dCkKLQkgICAgc3RyY2F0KHJlcywgIiwiKTsKLQkgIGVsc2UKLQkgICAgbmV4dCA9IDE7Ci0JICBzdHJjYXQgKHJlcywgZmxhZ2Rlc2MtPm5hbWUpOwotCX0KLSAgICAgIGZsYWdkZXNjKys7Ci0gICAgfQotICByZXR1cm4gcmVzOwotfQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogaW5wdXQgcm91dGluZXMgKi8KLQotLyogUHJvY2VzcyBHU0QvRUdTRCByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2dzZCAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgc3RhdGljIHN0cnVjdCBmbGFnZGVzY3N0cnVjdCBncHNmbGFnZGVzY1tdID0KLSAgewotICAgIHsgIlBJQyIsIDB4MDAwMSB9LAotICAgIHsgIkxJQiIsIDB4MDAwMiB9LAotICAgIHsgIk9WUiIsIDB4MDAwNCB9LAotICAgIHsgIlJFTCIsIDB4MDAwOCB9LAotICAgIHsgIkdCTCIsIDB4MDAxMCB9LAotICAgIHsgIlNIUiIsIDB4MDAyMCB9LAotICAgIHsgIkVYRSIsIDB4MDA0MCB9LAotICAgIHsgIlJEIiwgIDB4MDA4MCB9LAotICAgIHsgIldSVCIsIDB4MDEwMCB9LAotICAgIHsgIlZFQyIsIDB4MDIwMCB9LAotICAgIHsgIk5PTU9EIiwgMHgwNDAwIH0sCi0gICAgeyAiQ09NIiwgMHgwODAwIH0sCi0gICAgeyBOVUxMLCAwIH0KLSAgfTsKLQotICBzdGF0aWMgc3RydWN0IGZsYWdkZXNjc3RydWN0IGdzeWZsYWdkZXNjW10gPQotICB7Ci0gICAgeyAiV0VBSyIsIDB4MDAwMSB9LAotICAgIHsgIkRFRiIsICAweDAwMDIgfSwKLSAgICB7ICJVTkkiLCAgMHgwMDA0IH0sCi0gICAgeyAiUkVMIiwgIDB4MDAwOCB9LAotICAgIHsgIkNPTU0iLCAweDAwMTAgfSwKLSAgICB7ICJWRUNFUCIsIDB4MDAyMCB9LAotICAgIHsgIk5PUk0iLCAweDAwNDAgfSwKLSAgICB7IE5VTEwsIDAgfQotICB9OwotI2VuZGlmCi0KLSAgaW50IGdzZF90eXBlLCBnc2Rfc2l6ZTsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7Ci0gIGZsYWd3b3JkIG5ld19mbGFncywgb2xkX2ZsYWdzOwotICBjaGFyICpuYW1lOwotICBhc3ltYm9sICpzeW1ib2w7Ci0gIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotICB1bnNpZ25lZCBsb25nIGJhc2VfYWRkcjsKLSAgdW5zaWduZWQgbG9uZyBhbGlnbl9hZGRyOwotICBzdGF0aWMgdW5zaWduZWQgaW50IHBzZWN0X2lkeCA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgyLCAiR1NEL0VHU0QgKCVkLyV4KVxuIiwgb2JqdHlwZSwgb2JqdHlwZSk7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKG9ianR5cGUpCi0gICAgewotICAgICAgY2FzZSBFT0JKX1NfQ19FR1NEOgotIAlQUklWKHZtc19yZWMpICs9IDg7CS8qIHNraXAgdHlwZSwgc2l6ZSwgbF90ZW1wICovCi0JUFJJVihyZWNfc2l6ZSkgLT0gODsKLQlicmVhazsKLSAgICAgIGNhc2UgT0JKX1NfQ19HU0Q6Ci0JUFJJVih2bXNfcmVjKSArPSAxOwotCVBSSVYocmVjX3NpemUpIC09IDE7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogY2FsY3VsYXRlIGJhc2UgYWRkcmVzcyBmb3IgZWFjaCBzZWN0aW9uICAqLwotICBiYXNlX2FkZHIgPSAwTDsKLQotICBhYmZkLT5zeW1jb3VudCA9IDA7Ci0KLSAgd2hpbGUgKFBSSVYocmVjX3NpemUpID4gMCkKLSAgICB7Ci0gICAgICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKLQotICAgICAgaWYgKG9ianR5cGUgPT0gT0JKX1NfQ19HU0QpCi0JewotCSAgZ3NkX3R5cGUgPSAqdm1zX3JlYzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgX2JmZF92bXNfZ2V0X2hlYWRlcl92YWx1ZXMgKGFiZmQsIHZtc19yZWMsICZnc2RfdHlwZSwgJmdzZF9zaXplKTsKLQkgIGdzZF90eXBlICs9IEVWQVhfT0ZGU0VUOwotCX0KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDMsICJnc2RfdHlwZSAlZFxuIiwgZ3NkX3R5cGUpOwotI2VuZGlmCi0KLSAgICAgIHN3aXRjaCAoZ3NkX3R5cGUpCi0JewotCSAgY2FzZSBHU0RfU19DX1BTQzoKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogcHJvZ3JhbSBzZWN0aW9uIGRlZmluaXRpb24KLQkgICAgICAgKi8KLQotCSAgICAgIGFzZWN0aW9uICpvbGRfc2VjdGlvbiA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg0LCAiR1NEX1NfQ19QU0NcbiIpOwotI2VuZGlmCi0JICAgICAgLyogSWYgdGhpcyBzZWN0aW9uIGlzbid0IGEgYmZkIHNlY3Rpb24uICAqLwotCi0JICAgICAgaWYgKFBSSVYoaXNfdmF4KSAmJiAocHNlY3RfaWR4IDwgKGFiZmQtPnNlY3Rpb25fY291bnQtMSkpKQotCQl7Ci0JCSAgLyogY2hlY2sgZm9yIHRlbXBvcmFyeSBzZWN0aW9uIGZyb20gVElSIHJlY29yZC4gICovCi0KLQkJICBpZiAocHNlY3RfaWR4IDwgUFJJVihzZWN0aW9uX2NvdW50KSkKLQkJICAgIG9sZF9zZWN0aW9uID0gUFJJVihzZWN0aW9ucylbcHNlY3RfaWR4XTsKLQkJICBlbHNlCi0JCSAgICBvbGRfc2VjdGlvbiA9IDA7Ci0JCX0KLQotCSAgICAgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgOCk7Ci0JICAgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotCSAgICAgIGlmICghc2VjdGlvbikKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiYmZkX21ha2Vfc2VjdGlvbiAoJXMpIGZhaWxlZCIpLAotCQkJCQkgbmFtZSk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgICAgb2xkX2ZsYWdzID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDIpOwotCSAgICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IGJmZF9nZXRsMzIodm1zX3JlYyArIDQpOwkvKiBhbGxvY2F0aW9uICovCi0JICAgICAgbmV3X2ZsYWdzID0gdm1zX3NlY2ZsYWdfYnlfbmFtZSAoYWJmZCwgdmF4X3NlY3Rpb25fZmxhZ3MsIG5hbWUsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKG9sZF9mbGFncyAmIEVHUFNfU19WX1JFTCkKLQkJbmV3X2ZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgICAgICBpZiAob2xkX2ZsYWdzICYgR1BTX1NfTV9PVlIpCi0JCW5ld19mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgICAgIGlmICghYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0aW9uLCBuZXdfZmxhZ3MpKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiYmZkX3NldF9zZWN0aW9uX2ZsYWdzICglcywgJXgpIGZhaWxlZCIpLAotCQkgICAgIG5hbWUsIG5ld19mbGFncyk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gdm1zX3JlY1sxXTsKLQkgICAgICBhbGlnbl9hZGRyID0gKDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgICAgICBpZiAoKGJhc2VfYWRkciAlIGFsaWduX2FkZHIpICE9IDApCi0JCWJhc2VfYWRkciArPSAoYWxpZ25fYWRkciAtIChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSk7Ci0JICAgICAgc2VjdGlvbi0+dm1hID0gKGJmZF92bWEpYmFzZV9hZGRyOwotCSAgICAgIGJhc2VfYWRkciArPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0KLQkgICAgICAvKiBnbG9iYWwgc2VjdGlvbiBpcyBjb21tb24gc3ltYm9sICAqLwotCi0JICAgICAgaWYgKG9sZF9mbGFncyAmIEdQU19TX01fR0JMKQotCQl7Ci0JCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQkgICAgICByZXR1cm4gLTE7Ci0JCSAgICB9Ci0JCSAgc3ltYm9sID0gZW50cnktPnN5bWJvbDsKLQotCQkgIHN5bWJvbC0+dmFsdWUgPSAwOwotCQkgIHN5bWJvbC0+c2VjdGlvbiA9IHNlY3Rpb247Ci0JCSAgc3ltYm9sLT5mbGFncyA9IChCU0ZfR0xPQkFMfEJTRl9TRUNUSU9OX1NZTXxCU0ZfT0xEX0NPTU1PTik7Ci0JCX0KLQotCSAgICAgIC8qIGNvcHkgc2F2ZWQgY29udGVudHMgaWYgb2xkX3NlY3Rpb24gc2V0ICAqLwotCi0JICAgICAgaWYgKG9sZF9zZWN0aW9uICE9IDApCi0JCXsKLQkJICBzZWN0aW9uLT5jb250ZW50cyA9IG9sZF9zZWN0aW9uLT5jb250ZW50czsKLQkJICBpZiAoc2VjdGlvbi0+X3Jhd19zaXplIDwgb2xkX3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQkJICAgIHsKLQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiU2l6ZSBtaXNtYXRjaCBzZWN0aW9uICVzPSVseCwgJXM9JWx4IiksCi0JCQkgb2xkX3NlY3Rpb24tPm5hbWUsCi0JCQkgKHVuc2lnbmVkIGxvbmcpIG9sZF9zZWN0aW9uLT5fcmF3X3NpemUsCi0JCQkgc2VjdGlvbi0+bmFtZSwKLQkJCSAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+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+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogb3V0cHV0IHJvdXRpbmVzICovCi0KLS8qIFdyaXRlIHNlY3Rpb24gYW5kIHN5bWJvbCBkaXJlY3Rvcnkgb2YgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfZ3NkIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBhc3ltYm9sICpzeW1ib2w7Ci0gIHVuc2lnbmVkIGludCBzeW1udW07Ci0gIGludCBsYXN0X2luZGV4ID0gLTE7Ci0gIGNoYXIgZHVtbXlfbmFtZVsxMF07Ci0gIGNoYXIgKnNuYW1lOwotICBmbGFnd29yZCBuZXdfZmxhZ3MsIG9sZF9mbGFnczsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfZ3NkICglcCwgJWQpXG4iLCBhYmZkLCBvYmp0eXBlKTsKLSNlbmRpZgotCi0gIC8qIG91dHB1dCBzZWN0aW9ucyAgKi8KLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMywgIiVkIHNlY3Rpb25zIGZvdW5kXG4iLCBhYmZkLT5zZWN0aW9uX2NvdW50KTsKLSNlbmRpZgotCi0gIC8qIGVnc2QgaXMgcXVhZHdvcmQgYWxpZ25lZCAgKi8KLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCA4KTsKLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VHU0QsIC0xKTsKLSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7CQkvKiBwcmVwYXJlIG91dHB1dCBmb3Igc3VicmVjb3JkcyAqLwotCi0gIHdoaWxlIChzZWN0aW9uICE9IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDMsICJTZWN0aW9uICMlZCAlcywgJWQgYnl0ZXNcbiIsIHNlY3Rpb24tPmluZGV4LCBzZWN0aW9uLT5uYW1lLCAoaW50KXNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0jZW5kaWYKLQotCS8qIDEzIGJ5dGVzIGVnc2QsIG1heCAzMSBjaGFycyBuYW1lIC0+IHNob3VsZCBiZSA0NCBieXRlcyAqLwotICAgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgNjQpIDwgMCkKLQl7Ci0JICBfYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKTsKLQkgIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOwotCSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FR1NELCAtMSk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7CQkvKiBwcmVwYXJlIG91dHB1dCBmb3Igc3VicmVjb3JkcyAqLwotCX0KLQotCS8qIENyZWF0ZSBkdW1teSBzZWN0aW9ucyB0byBrZWVwIGNvbnNlY3V0aXZlIGluZGljZXMgKi8KLQotICAgICAgd2hpbGUgKHNlY3Rpb24tPmluZGV4IC0gbGFzdF9pbmRleCA+IDEpCi0JewotI2lmIFZNU19ERUJVRwotCSAgdm1zX2RlYnVnICgzLCAiaW5kZXggJWQsIGxhc3QgJWRcbiIsIHNlY3Rpb24tPmluZGV4LCBsYXN0X2luZGV4KTsKLSNlbmRpZgotCSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFR1NEX1NfQ19QU0MsIC0xKTsKLQkgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOwotCSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotCSAgc3ByaW50ZiAoZHVtbXlfbmFtZSwgIi5EVU1NWSUwMmQiLCBsYXN0X2luZGV4KTsKLQkgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBkdW1teV9uYW1lKTsKLQkgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JICBsYXN0X2luZGV4Kys7Ci0JfQotCi0gICAgICAvKiBEb24ndCBrbm93IGlmIHRoaXMgaXMgbmVjY2VzYXJ5IGZvciB0aGUgbGlua2VyIGJ1dCBmb3Igbm93IGl0IGtlZXBzCi0JIHZtc19zbHVycF9nc2QgaGFwcHkgICovCi0KLSAgICAgIHNuYW1lID0gKGNoYXIgKilzZWN0aW9uLT5uYW1lOwotICAgICAgaWYgKCpzbmFtZSA9PSAnLicpCi0JewotCSAgc25hbWUrKzsKLQkgIGlmICgoKnNuYW1lID09ICd0JykgJiYgKHN0cmNtcCAoc25hbWUsICJ0ZXh0IikgPT0gMCkpCi0JICAgIHNuYW1lID0gUFJJVihpc192YXgpP1ZBWF9DT0RFX05BTUU6RVZBWF9DT0RFX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdkJykgJiYgKHN0cmNtcCAoc25hbWUsICJkYXRhIikgPT0gMCkpCi0JICAgIHNuYW1lID0gUFJJVihpc192YXgpP1ZBWF9EQVRBX05BTUU6RVZBWF9EQVRBX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdiJykgJiYgKHN0cmNtcCAoc25hbWUsICJic3MiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX0JTU19OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnbCcpICYmIChzdHJjbXAgKHNuYW1lLCAibGluayIpID09IDApKQotCSAgICBzbmFtZSA9IEVWQVhfTElOS19OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAncicpICYmIChzdHJjbXAgKHNuYW1lLCAicmRhdGEiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX1JFQURPTkxZX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdsJykgJiYgKHN0cmNtcCAoc25hbWUsICJsaXRlcmFsIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9MSVRFUkFMX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdjJykgJiYgKHN0cmNtcCAoc25hbWUsICJjb21tIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9DT01NT05fTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2wnKSAmJiAoc3RyY21wIChzbmFtZSwgImxjb21tIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9MT0NBTF9OQU1FOwotCX0KLSAgICAgIGVsc2UKLQlzbmFtZSA9IF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc25hbWUsIEVPQkpfU19DX1NFQ1NJWik7Ci0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRUdTRF9TX0NfUFNDLCAtMSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciAmIDB4ZmYpOwotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0JewotCSAgbmV3X2ZsYWdzID0gKEVHUFNfU19WX09WUnxFR1BTX1NfVl9SRUx8RUdQU19TX1ZfR0JMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVHxFR1BTX1NfVl9OT01PRHxFR1BTX1NfVl9DT00pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBuZXdfZmxhZ3MgPSB2bXNfZXNlY2ZsYWdfYnlfbmFtZSAoZXZheF9zZWN0aW9uX2ZsYWdzLCBzbmFtZSwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQl9Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIG5ld19mbGFncyk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBzbmFtZSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gICAgICBsYXN0X2luZGV4ID0gc2VjdGlvbi0+aW5kZXg7Ci0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLSAgICB9Ci0KLSAgLyogb3V0cHV0IHN5bWJvbHMgICovCi0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgzLCAiJWQgc3ltYm9scyBmb3VuZFxuIiwgYWJmZC0+c3ltY291bnQpOwotI2VuZGlmCi0KLSAgYmZkX3NldF9zdGFydF9hZGRyZXNzIChhYmZkLCAoYmZkX3ZtYSktMSk7Ci0KLSAgZm9yIChzeW1udW0gPSAwOyBzeW1udW0gPCBhYmZkLT5zeW1jb3VudDsgc3ltbnVtKyspCi0gICAgewotCi0gICAgICBzeW1ib2wgPSBhYmZkLT5vdXRzeW1ib2xzW3N5bW51bV07Ci0gICAgICBpZiAoKihzeW1ib2wtPm5hbWUpID09ICdfJykKLQl7Ci0JICBpZiAoc3RyY21wIChzeW1ib2wtPm5hbWUsICJfX21haW4iKSA9PSAwKQotCSAgICBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQsIChiZmRfdm1hKXN5bWJvbC0+dmFsdWUpOwotCX0KLSAgICAgIG9sZF9mbGFncyA9IHN5bWJvbC0+ZmxhZ3M7Ci0KLSAgICAgIGlmIChvbGRfZmxhZ3MgJiBCU0ZfRklMRSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKCgob2xkX2ZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX1dFQUspKSA9PSAwKQkvKiBub3QgeGRlZiAqLwotCSAgJiYgKCFiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpKQkvKiBhbmQgbm90IHhyZWYgKi8KLQljb250aW51ZTsJCQkJCS8qIGRvbnQgb3V0cHV0ICovCi0KLSAgICAgIC8qIDEzIGJ5dGVzIGVnc2QsIG1heCA2NCBjaGFycyBuYW1lIC0+IHNob3VsZCBiZSA3NyBieXRlcyAgKi8KLQotICAgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgODApIDwgMCkKLQl7Ci0JICBfYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKTsKLQkgIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOwotCSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FR1NELCAtMSk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7CQkvKiBwcmVwYXJlIG91dHB1dCBmb3Igc3VicmVjb3JkcyAqLwotCX0KLQotICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFR1NEX1NfQ19TWU0sIC0xKTsKLQotICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsJCQkvKiBkYXRhIHR5cGUsIGFsaWdubWVudCAqLwotCi0gICAgICBuZXdfZmxhZ3MgPSAwOwotCi0gICAgICBpZiAob2xkX2ZsYWdzICYgQlNGX1dFQUspCi0JbmV3X2ZsYWdzIHw9IEVHU1lfU19WX1dFQUs7Ci0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQkJLyogLmNvbW0gICovCi0JbmV3X2ZsYWdzIHw9IChFR1NZX1NfVl9XRUFLfEVHU1lfU19WX0NPTU0pOwotCi0gICAgICBpZiAob2xkX2ZsYWdzICYgQlNGX0ZVTkNUSU9OKQotCXsKLQkgIG5ld19mbGFncyB8PSBFR1NZX1NfVl9OT1JNOwotCSAgbmV3X2ZsYWdzIHw9IEVHU1lfU19WX1JFTDsKLQl9Ci0gICAgICBpZiAob2xkX2ZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX1dFQUspKQotCXsKLQkgIG5ld19mbGFncyB8PSBFR1NZX1NfVl9ERUY7Ci0JICBpZiAoIWJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgbmV3X2ZsYWdzIHw9IEVHU1lfU19WX1JFTDsKLQl9Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIG5ld19mbGFncyk7Ci0KLSAgICAgIGlmIChvbGRfZmxhZ3MgJiAoQlNGX0dMT0JBTHxCU0ZfV0VBSykpCQkvKiBzeW1ib2wgZGVmaW5pdGlvbiAqLwotCXsKLQkgIGlmIChvbGRfZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pCi0JICAgIHsKLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgc3ltYm9sLT52YWx1ZSk7Ci0JICAgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCi0JCQkJICAgICAoKGFzeW1ib2wgKikoc3ltYm9sLT51ZGF0YS5wKSktPnZhbHVlKTsKLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKLQkJCQkgICAgICgoKGFzeW1ib2wgKikoc3ltYm9sLT51ZGF0YS5wKSkKLQkJCQkgICAgICAtPnNlY3Rpb24tPmluZGV4KSk7Ci0JICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIHN5bWJvbC0+c2VjdGlvbi0+aW5kZXgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgc3ltYm9sLT52YWx1ZSk7CS8qIExfVkFMVUUgKi8KLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgMCk7CQkJLyogTF9DT0RFX0FERFJFU1MgKi8KLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CQkJLyogTF9DQV9QU0lORFggKi8KLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgc3ltYm9sLT5zZWN0aW9uLT5pbmRleCk7LyogTF9QU0lORFggKi8KLQkgICAgfQotCX0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bWJvbC0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7Ci0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgICB9Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgOCk7Ci0gIF9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpOwotICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsgCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvdm1zLWhkci5jIGIvYmZkL3Ztcy1oZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzNmIzMi4uMDAwMDAwMAotLS0gYS9iZmQvdm1zLWhkci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU5ICswLDAgQEAKLS8qIHZtcy1oZHIuYyAtLSBCRkQgYmFjay1lbmQgZm9yIFZNUy9WQVggKG9wZW5WTVMvVkFYKSBhbmQKLSAgIEVWQVggKG9wZW5WTVMvQWxwaGEpIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIEhEUiByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCi0gICBFTUggcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotICAgYW5kCi0gICBFT00gcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotICAgRUVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJ2bXMuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qIFJlYWQgJiBwcm9jZXNzIGVtaCByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2hkciAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSAgdW5zaWduZWQgY2hhciAqcHRyOwotICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwotICBpbnQgc3VidHlwZTsKLQotICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcoMiwgIkhEUi9FTUhcbiIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChvYmp0eXBlKQotICAgIHsKLSAgICAgIGNhc2UgT0JKX1NfQ19IRFI6Ci0Jc3VidHlwZSA9IHZtc19yZWNbMV07Ci0JYnJlYWs7Ci0gICAgICBjYXNlIEVPQkpfU19DX0VNSDoKLQlzdWJ0eXBlID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDQpICsgRVZBWF9PRkZTRVQ7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXN1YnR5cGUgPSAtMTsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDMsICJzdWJ0eXBlICVkXG4iLCBzdWJ0eXBlKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoc3VidHlwZSkKLSAgICB7Ci0KLSAgICAgIGNhc2UgTUhEX1NfQ19NSEQ6Ci0JLyoKLQkgKiBtb2R1bGUgaGVhZGVyCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2Jfc3RybHZsID0gdm1zX3JlY1syXTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfbF9yZWNzaXogPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgMyk7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyA1KTsKLQlwdHIgPSB2bXNfcmVjICsgNSArIHZtc19yZWNbNV0gKyAxOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCXB0ciArPSAqcHRyICsgMTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF9kYXRlID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgMTcpOwotCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX0xOTToKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2NfbG5tID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX1NSQzoKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2Nfc3JjID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX1RUTDoKLQkvKgotCSAqCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2NfdHRsID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX0NQUjoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX01UQzoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBNSERfU19DX0dUWDoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX01IRCArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICogbW9kdWxlIGhlYWRlcgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9iX3N0cmx2bCA9IHZtc19yZWNbNl07Ci0JUFJJVihoZHJfZGF0YSkuaGRyX2xfYXJjaDEgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgOCk7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX2xfYXJjaDIgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTIpOwotCVBSSVYoaGRyX2RhdGEpLmhkcl9sX3JlY3NpeiA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxNik7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfbmFtZSA9Ci0JICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgMjApOwotCXB0ciA9IHZtc19yZWMgKyAyMCArIHZtc19yZWNbMjBdICsgMTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF92ZXJzaW9uID0KLQkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JcHRyICs9ICpwdHIgKyAxOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X2RhdGUgPQotCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgMTcpOwotCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX0xOTSArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY19sbm0gPQotCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX1NSQyArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY19zcmMgPQotCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX1RUTCArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY190dGwgPQotCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX0NQUiArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfTVRDICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKgotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19HVFggKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAtMTsKLQotICAgIH0gLyogc3dpdGNoICovCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBPdXRwdXQgcm91dGluZXMuICAqLwotCi0KLS8qIE1hbnVmYWN1cmUgYSBWTVMgbGlrZSB0aW1lIG9uIGEgdW5peCBiYXNlZCBzeXN0ZW0uCi0gICBzdG9sZW4gZnJvbSBvYmotdm1zLmMgICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLWdldF92bXNfdGltZV9zdHJpbmcgKCkKLXsKLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdGJ1ZlsxOF07Ci0jaWZuZGVmIFZNUwotI2luY2x1ZGUgPHRpbWUuaD4KLQotICBjaGFyICpwbnQ7Ci0gIHRpbWVfdCB0aW1lYjsKLSAgdGltZSAoJnRpbWViKTsKLSAgcG50ID0gY3RpbWUgKCZ0aW1lYik7Ci0gIHBudFszXSA9IDA7Ci0gIHBudFs3XSA9IDA7Ci0gIHBudFsxMF0gPSAwOwotICBwbnRbMTZdID0gMDsKLSAgcG50WzI0XSA9IDA7Ci0gIHNwcmludGYgKHRidWYsICIlMnMtJTNzLSVzICVzIiwgcG50ICsgOCwgcG50ICsgNCwgcG50ICsgMjAsIHBudCArIDExKTsKLSNlbHNlCi0jaW5jbHVkZSA8c3RhcmxldC5oPgotICBzdHJ1Y3QKLSAgewotICAgIGludCBTaXplOwotICAgIHVuc2lnbmVkIGNoYXIgKlB0cjsKLSAgfSBEZXNjcmlwdG9yOwotICBEZXNjcmlwdG9yLlNpemUgPSAxNzsKLSAgRGVzY3JpcHRvci5QdHIgPSB0YnVmOwotICBTWVMkQVNDVElNICgwLCAmRGVzY3JpcHRvciwgMCwgMCk7Ci0jZW5kaWYgLyogbm90IFZNUyAqLwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgInZtc3RpbWVzdHJpbmc6JyVzJ1xuIiwgdGJ1Zik7Ci0jZW5kaWYKLQotICByZXR1cm4gdGJ1ZjsKLX0KLQotCi0vKiB3cml0ZSBvYmplY3QgaGVhZGVyIGZvciBiZmQgYWJmZCAgKi8KLQotaW50Ci1fYmZkX3Ztc193cml0ZV9oZHIgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLSAgdW5zaWduZWQgaW50IHN5bW51bTsKLSAgaW50IGhhZF9jYXNlID0gMDsKLSAgaW50IGhhZF9maWxlID0gMDsKLQotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9oZHIgKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCAyKTsKLQotICAvKiBNSEQgKi8KLQotICBpZiAob2JqdHlwZSA9PSBPQkpfU19DX0hEUikKLSAgICB7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfTUhEKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgRU9CSl9TX0NfU1RSTFZMKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBNQVhfT1VUUkVDX1NJWkUpOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBzdHJpcCBwYXRoIGFuZCBzdWZmaXggaW5mb3JtYXRpb24gKi8KLQotICAgICAgY2hhciAqZm5hbWUsICpmb3V0LCAqZnB0cjsKLQotICAgICAgZnB0ciA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgICAgZm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoZnB0cikgKyAxKTsKLSAgICAgIHN0cmNweSAoZm5hbWUsIGZwdHIpOwotICAgICAgZm91dCA9IHN0cnJjaHIgKGZuYW1lLCAnXScpOwotICAgICAgaWYgKGZvdXQgPT0gMCkKLQlmb3V0ID0gc3RyY2hyIChmbmFtZSwgJzonKTsKLSAgICAgIGlmIChmb3V0ICE9IDApCi0JZm91dCsrOwotICAgICAgZWxzZQotCWZvdXQgPSBmbmFtZTsKLQotICAgICAgLyogc3RyaXAgLm9iaiBzdWZmaXggICovCi0KLSAgICAgIGZwdHIgPSBzdHJyY2hyIChmbmFtZSwgJy4nKTsKLSAgICAgIGlmICgoZnB0ciAhPSAwKQotCSAgJiYgKHN0cmNhc2VjbXAgKGZwdHIsICIuT0JKIikgPT0gMCkpCi0JKmZwdHIgPSAwOwotCi0gICAgICBmcHRyID0gZm91dDsKLSAgICAgIHdoaWxlICgqZnB0ciAhPSAwKQotCXsKLQkgIGlmIChpc2xvd2VyICgqZnB0cikpCi0JICAgICpmcHRyID0gdG91cHBlciAoKmZwdHIpOwotCSAgZnB0cisrOwotCSAgaWYgKCgqZnB0ciA9PSAnOycpCi0JICAgICB8fCAoKGZwdHIgLSBmb3V0KSA+IDMxKSkKLQkgICAgKmZwdHIgPSAwOwotCX0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBmb3V0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgIk5PTkFNRSIpOwotCi0gIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBCRkRfVkVSU0lPTik7Ci0gIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCBnZXRfdm1zX3RpbWVfc3RyaW5nICgpLCAxNyk7Ci0gIF9iZmRfdm1zX291dHB1dF9maWxsIChhYmZkLCAwLCAxNyk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgLyogTE1OICovCi0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfTE5NKTsKLSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIkdBUyBwcm9HSVMiLCAxMCk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgLyogU1JDICovCi0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfU1JDKTsKLQotICBmb3IgKHN5bW51bSA9IDA7IHN5bW51bSA8IGFiZmQtPnN5bWNvdW50OyBzeW1udW0rKykKLSAgICB7Ci0gICAgICBzeW1ib2wgPSBhYmZkLT5vdXRzeW1ib2xzW3N5bW51bV07Ci0KLSAgICAgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0ZJTEUpCi0JewotCSAgaWYgKHN0cm5jbXAgKChjaGFyICopc3ltYm9sLT5uYW1lLCAiPENBU0U6IiwgNikgPT0gMCkKLQkgICAgewotCSAgICAgIFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpID0gc3ltYm9sLT5uYW1lWzZdIC0gJzAnOwotCSAgICAgIFBSSVYoZmxhZ19zaG93X2FmdGVyX3RydW5jKSA9IHN5bWJvbC0+bmFtZVs3XSAtICcwJzsKLQotCSAgICAgIGlmIChoYWRfZmlsZSkKLQkJYnJlYWs7Ci0JICAgICAgaGFkX2Nhc2UgPSAxOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKXN5bWJvbC0+bmFtZSwgc3RybGVuIChzeW1ib2wtPm5hbWUpKTsKLQkgIGlmIChoYWRfY2FzZSkKLQkgICAgYnJlYWs7Ci0JICBoYWRfZmlsZSA9IDE7Ci0JfQotICAgIH0KLQotICBpZiAoc3ltbnVtID09IGFiZmQtPnN5bWNvdW50KQotICAgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJub25hbWUiLCA2KTsKLQotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIC8qIFRUTCAqLwotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1RUTCk7Ci0gIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJUVEwiLCAzKTsKLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICAvKiBDUFIgKi8KLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19DUFIpOwotICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwKLQkJCSAodW5zaWduZWQgY2hhciAqKSJHTlUgQkZEIHBvcnRlZCBieSBLbGF1cyBL5G1wZiAxOTk0LTE5OTYiLAotCQkJIDM5KTsKLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFByb2Nlc3MgRU9NL0VFT00gcmVjb3JkCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF9lb20gKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDIsICJFT00vRUVPTVxuIik7Ci0jZW5kaWYKLQotICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKLQotICBpZiAoKG9ianR5cGUgPT0gT0JKX1NfQ19FT00pIAotICAgICB8fCAob2JqdHlwZSA9PSBPQkpfU19DX0VPTVcpKQotICAgIHsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQUklWKGVvbV9kYXRhKS5lb21fbF90b3RhbF9scHMgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgNCk7Ci0gICAgICBQUklWKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPSAqKHZtc19yZWMgKyA4KTsKLSAgICAgIGlmIChQUklWKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPiAxKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT2JqZWN0IG1vZHVsZSBOT1QgZXJyb3ItZnJlZSAhXG4iKSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBQUklWKGVvbV9kYXRhKS5lb21faGFzX3RyYW5zZmVyID0gZmFsc2U7Ci0gICAgICBpZiAoUFJJVihyZWNfc2l6ZSkgPiAxMCkKLQl7Ci0JICAgUFJJVihlb21fZGF0YSkuZW9tX2hhc190cmFuc2ZlciA9IHRydWU7Ci0JICAgUFJJVihlb21fZGF0YSkuZW9tX2JfdGZyZmxnID0gKih2bXNfcmVjICsgOSk7Ci0JICAgUFJJVihlb21fZGF0YSkuZW9tX2xfcHNpbmR4ID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDEyKTsKLQkgICBQUklWKGVvbV9kYXRhKS5lb21fbF90ZnJhZHIgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTYpOwotCi0JICAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RmcmFkcjsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBXcml0ZSBlb20gcmVjb3JkIGZvciBiZmQgYWJmZCAgKi8KLQotaW50Ci1fYmZkX3Ztc193cml0ZV9lb20gKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9lb20gKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBvYmp0eXBlLCAtMSk7Ci0gIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZykoUFJJVih2bXNfbGlua2FnZV9pbmRleCkgPj4gMSkpOwotICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7CS8qIGNvbXBsZXRpb24gY29kZSAqLwotICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7CS8qIGZpbGwgYnl0ZSAqLwotCi0gIGlmIChiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpICE9IChiZmRfdm1hKS0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gICAgICBzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubGluayIpOwotICAgICAgaWYgKHNlY3Rpb24gPT0gMCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKShzZWN0aW9uLT5pbmRleCkpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCi0JCQkgICAgICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLSAgICB9Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy1taXNjLmMgYi9iZmQvdm1zLW1pc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExMTkyYy4uMDAwMDAwMAotLS0gYS9iZmQvdm1zLW1pc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDExNDYgKzAsMCBAQAotLyogdm1zLW1pc2MuYyAtLSBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyBmb3IgVkFYIChvcGVuVk1TL1ZBWCkgYW5kCi0gICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2lmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgInZtcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiBWTVNfREVCVUcKLS8qIGRlYnVnIGZ1bmN0aW9ucyAqLwotCi0vKiBkZWJ1ZyBmdW5jdGlvbiBmb3IgYWxsIHZtcyBleHRlbnNpb25zCi0gICBldmFsdWF0ZXMgZW52aXJvbm1lbnQgdmFyaWFibGUgVk1TX0RFQlVHIGZvciBhCi0gICBudW1lcmljYWwgdmFsdWUgb24gdGhlIGZpcnN0IGNhbGwKLSAgIGFsbCBlcnJvciBsZXZlbHMgYmVsb3cgdGhpcyB2YWx1ZSBhcmUgcHJpbnRlZAotICAKLSAgIGxldmVsczoKLSAgIDEJdG9wbGV2ZWwgYmZkIGNhbGxzIChmdW5jdGlvbnMgZnJvbSB0aGUgYmZkIHZlY3RvcikKLSAgIDIJZnVuY3Rpb25zIGNhbGxlZCBieSBiZmQgY2FsbHMKLSAgIC4uLgotICAgOQlhbG1vc3QgZXZlcnl0aGluZwotCi0gICBsZXZlbCBpcyBhbHNvIGlkZW50YXRpb24gbGV2ZWwuIEluZGVudGF0aW9uIGlzIHBlcmZvcm1lZAotICAgaWYgbGV2ZWwgPiAwCi0JKi8KLQotI2lmIF9fU1REQ19fCi12b2lkCi1fYmZkX3Ztc19kZWJ1ZyAoaW50IGxldmVsLCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLSAgc3RhdGljIGludCBtaW5fbGV2ZWwgPSAtMTsKLSAgc3RhdGljIEZJTEUgKm91dHB1dCA9IE5VTEw7Ci0gIGNoYXIgKmVwdHI7Ci0gIHZhX2xpc3QgYXJnczsKLSAgaW50IGFic2x2bCA9IChsZXZlbCA+IDApP2xldmVsOi1sZXZlbDsKLQotICBpZiAobWluX2xldmVsID09IC0xKQotICAgIHsKLSAgICAgIGlmICgoZXB0ciA9IGdldGVudigiVk1TX0RFQlVHIikpICE9IE5VTEwpCi0JewotCSAgbWluX2xldmVsID0gYXRvaShlcHRyKTsKLQkgIG91dHB1dCA9IHN0ZGVycjsKLQl9Ci0gICAgICBlbHNlCi0JbWluX2xldmVsID0gMDsKLSAgICB9Ci0gIGlmIChvdXRwdXQgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIGlmIChhYnNsdmwgPiBtaW5fbGV2ZWwpCi0gICAgcmV0dXJuOwotCi0gIHdoaWxlKC0tbGV2ZWw+MCkKLSAgICBmcHJpbnRmKG91dHB1dCwgIiAiKTsKLSAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLSAgdmZwcmludGYob3V0cHV0LCBmb3JtYXQsIGFyZ3MpOwotICBmZmx1c2gob3V0cHV0KTsKLSAgdmFfZW5kKGFyZ3MpOwotCi0gIHJldHVybjsKLX0KLQotI2Vsc2UgLyogbm90IF9fU1REQ19fICovCi0KLXZvaWQKLV9iZmRfdm1zX2RlYnVnIChsZXZlbCwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KQotICAgICBpbnQgbGV2ZWw7Ci0gICAgIGNoYXIgKmZvcm1hdDsKLSAgICAgbG9uZyBhMTsgbG9uZyBhMjsgbG9uZyBhMzsKLSAgICAgbG9uZyBhNDsgbG9uZyBhNTsgbG9uZyBhNjsKLXsKLSAgc3RhdGljIGludCBtaW5fbGV2ZWwgPSAtMTsKLSAgc3RhdGljIEZJTEUgKm91dHB1dCA9IE5VTEw7Ci0gIGNoYXIgKmVwdHI7Ci0KLSAgaWYgKG1pbl9sZXZlbCA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAoKGVwdHIgPSBnZXRlbnYoIlZNU19ERUJVRyIpKSAhPSBOVUxMKQotCXsKLQkgIG1pbl9sZXZlbCA9IGF0b2koZXB0cik7Ci0JICBvdXRwdXQgPSBzdGRlcnI7Ci0JfQotICAgICAgZWxzZQotCW1pbl9sZXZlbCA9IDA7Ci0gICAgfQotICBpZiAob3V0cHV0ID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBpZiAobGV2ZWwgPiBtaW5fbGV2ZWwpCi0gICAgcmV0dXJuOwotCi0gIHdoaWxlKC0tbGV2ZWw+MCkKLSAgICBmcHJpbnRmKG91dHB1dCwgIiAiKTsKLSAgZnByaW50ZihvdXRwdXQsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7Ci0gIGZmbHVzaChvdXRwdXQpOwotCi0gIHJldHVybjsKLX0KLSNlbmRpZiAvKiBfX1NURENfXyAqLwotCi0KLS8qIGEgZGVidWcgZnVuY3Rpb24KLSAgIGhleCBkdW1wICdzaXplJyBieXRlcyBzdGFydGluZyBhdCAncHRyJyAgKi8KLQotdm9pZAotX2JmZF9oZXhkdW1wIChsZXZlbCwgcHRyLCBzaXplLCBvZmZzZXQpCi0gICAgIGludCBsZXZlbDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IG9mZnNldDsKLXsKLSAgdW5zaWduZWQgY2hhciAqbHB0ciA9IHB0cjsKLSAgaW50IGNvdW50ID0gMDsKLSAgbG9uZyBzdGFydCA9IG9mZnNldDsKLQotICB3aGlsZSAoc2l6ZS0tID4gMCkKLSAgICB7Ci0gICAgICBpZiAoKGNvdW50JTE2KSA9PSAwKQotCXZtc19kZWJ1ZyAobGV2ZWwsICIlMDhseDoiLCBzdGFydCk7Ci0gICAgICB2bXNfZGVidWcgKC1sZXZlbCwgIiAlMDJ4IiwgKnB0cisrKTsKLSAgICAgIGNvdW50Kys7Ci0gICAgICBzdGFydCsrOwotICAgICAgaWYgKHNpemUgPT0gMCkKLQl7Ci0JICB3aGlsZSAoKGNvdW50JTE2KSAhPSAwKQotCSAgICB7Ci0JICAgICAgdm1zX2RlYnVnICgtbGV2ZWwsICIgICAiKTsKLQkgICAgICBjb3VudCsrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKChjb3VudCUxNikgPT0gMCkKLQl7Ci0JICB2bXNfZGVidWcgKC1sZXZlbCwgIiAiKTsKLQkgIHdoaWxlIChscHRyIDwgcHRyKQotCSAgICB7Ci0JICAgICAgdm1zX2RlYnVnICgtbGV2ZWwsICIlYyIsICgqbHB0ciA8IDMyKT8nLic6KmxwdHIpOwotCSAgICAgIGxwdHIrKzsKLQkgICAgfQotCSAgdm1zX2RlYnVnICgtbGV2ZWwsICJcbiIpOwotCX0KLSAgICB9Ci0gIGlmICgoY291bnQlMTYpICE9IDApCi0gICAgdm1zX2RlYnVnICgtbGV2ZWwsICJcbiIpOwotCi0gIHJldHVybjsKLX0KLSNlbmRpZgotCi0MCi0vKiBoYXNoIGZ1bmN0aW9ucwotCi0gICBUaGVzZSBhcmUgbmVlZGVkIHdoZW4gcmVhZGluZyBhbiBvYmplY3QgZmlsZS4gICovCi0KLS8qIGFsbG9jYXRlIG5ldyB2bXNfaGFzaF9lbnRyeQotICAga2VlcCB0aGUgc3ltYm9sIG5hbWUgYW5kIGEgcG9pbnRlciB0byB0aGUgYmZkIHN5bWJvbCBpbiB0aGUgdGFibGUgICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX3Ztc19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHZtc19zeW1ib2xfZW50cnkgKnJldDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDUsICJfYmZkX3Ztc19oYXNoX25ld2Z1bmMoJXAsICVwLCAlcylcbiIsIGVudHJ5LCB0YWJsZSwgc3RyaW5nKTsKLSNlbmRpZgotCi0gIGlmIChlbnRyeSA9PSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopTlVMTCkKLSAgICB7Ci0gICAgICByZXQgPSAodm1zX3N5bWJvbF9lbnRyeSAqKQotCSAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mICh2bXNfc3ltYm9sX2VudHJ5KSk7Ci0gICAgICBpZiAocmV0ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopIE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKU5VTEw7Ci0JfQotICAgICAgZW50cnkgPSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLSAgICB9Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIGJhc2UgY2xhc3MuICAqLwotCi0gIHJldCA9ICh2bXNfc3ltYm9sX2VudHJ5ICopIGJmZF9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKTsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfaGFzaF9uZXdmdW5jIHJldCAlcFxuIiwgcmV0KTsKLSNlbmRpZgotCi0gIHJldC0+c3ltYm9sID0gKGFzeW1ib2wgKilOVUxMOwotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopcmV0OwotfQotCi0MCi0vKiBvYmplY3QgZmlsZSBpbnB1dCBmdW5jdGlvbnMgKi8KLQotLyogUmV0dXJuIHR5cGUgYW5kIGxlbmd0aCBmcm9tIHJlY29yZCBoZWFkZXIgKGJ1Zikgb24gQWxwaGEuICAqLwotCi12b2lkCi1fYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyAoYWJmZCwgYnVmLCB0eXBlLCBsZW5ndGgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIGludCAqdHlwZTsKLSAgICAgaW50ICpsZW5ndGg7Ci17Ci0gIGlmICh0eXBlICE9IDApCi0gICAgKnR5cGUgPSBiZmRfZ2V0bDE2IChidWYpOwotICBidWYgKz0gMjsKLSAgaWYgKGxlbmd0aCAhPSAwKQotICAgICpsZW5ndGggPSBiZmRfZ2V0bDE2IChidWYpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMTAsICJfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyB0eXBlICV4LCBsZW5ndGggJXhcbiIsICh0eXBlPyp0eXBlOjApLCAobGVuZ3RoPypsZW5ndGg6MCkpOwotI2VuZGlmCi0KLQotICByZXR1cm47Ci19Ci0KLQotLyogR2V0IG5leHQgcmVjb3JkIGZyb20gb2JqZWN0IGZpbGUgdG8gdm1zX2J1ZgotICAgc2V0IFBSSVYoYnVmX3NpemUpIGFuZCByZXR1cm4gaXQKLSAgCi0gICB0aGlzIGlzIGEgbGl0dGxlIHRyaWNreSBzaW5jZSBpdCBzaG91bGQgYmUgcG9ydGFibGUuCi0gIAotICAgdGhlIG9wZW5WTVMgb2JqZWN0IGZpbGUgaGFzICd2YXJpYWJsZSBsZW5ndGgnIHdoaWNoIG1lYW5zIHRoYXQKLSAgIHJlYWQoKSByZXR1cm5zIGRhdGEgaW4gY2h1bmtzIG9mIChob3BlZnVsbHkpIGNvcnJlY3QgYW5kIGV4cGVjdGVkCi0gICBzaXplLiBUaGUgbGlua2VyIChhbmQgb3RoZXIgdG9vbHMgb24gdm1zKSBkZXBlbmQgb24gdGhhdC4gVW5peCBkb2Vzbid0Ci0gICBrbm93IGFib3V0ICdmb3JtYXR0ZWQnIGZpbGVzLCBzbyByZWFkaW5nIGFuZCB3cml0aW5nIHN1Y2ggYW4gb2JqZWN0Ci0gICBmaWxlIGluIGEgdW5peCBlbnZpcm9ubWVudCBpcyBub3QgdHJpdmlhbC4KLSAgCi0gICBXaXRoIHRoZSB0b29sICdmaWxlJyAoYXZhaWxhYmxlIG9uIGFsbCB2bXMgZnRwIHNpdGVzKSwgb25lCi0gICBjYW4gdmlldyBhbmQgY2hhbmdlIHRoZSBhdHRyaWJ1dGVzIG9mIGEgZmlsZS4gQ2hhbmdpbmcgZnJvbQotICAgJ3ZhcmlhYmxlIGxlbmd0aCcgdG8gJ2ZpeGVkIGxlbmd0aCwgNTEyIGJ5dGVzJyByZXZlYWxzIHRoZQotICAgcmVjb3JkIGxlbmd0aCBhdCB0aGUgZmlyc3QgMiBieXRlcyBvZiBldmVyeSByZWNvcmQuIFRoZSBzYW1lCi0gICBoYXBwZW5zIGR1cmluZyB0aGUgdHJhbnNmZXIgb2Ygb2JqZWN0IGZpbGVzIGZyb20gdm1zIHRvIHVuaXgsCi0gICBhdCBsZWFzdCB3aXRoIHVjeCwgZGVjJ3MgaW1wbGVtZW50YXRpb24gb2YgdGNwL2lwLgotICAKLSAgIFRoZSB2bXMgZm9ybWF0IHJlcGVhdHMgdGhlIGxlbmd0aCBhdCBieXRlcyAyICYgMyBvZiBldmVyeSByZWNvcmQuCi0gIAotICAgT24gdGhlIGZpcnN0IGNhbGwgKGZpbGVfZm9ybWF0ID09IEZGX1VOS05PV04pIHdlIGNoZWNrIGlmCi0gICB0aGUgZmlyc3QgYW5kIHRoZSB0aGlyZCBieXRlIHBhaXIgKCEpIG9mIHRoZSByZWNvcmQgbWF0Y2guCi0gICBJZiB0aGV5IGRvIGl0J3MgYW4gb2JqZWN0IGZpbGUgaW4gYW4gdW5peCBlbnZpcm9ubWVudCBvciB3aXRoCi0gICB3cm9uZyBhdHRyaWJ1dGVzIChGRl9GT1JFSUdOKSwgZWxzZSB3ZSBzaG91bGQgYmUgaW4gYSB2bXMKLSAgIGVudmlyb25tZW50IHdoZXJlIHJlYWQoKSByZXR1cm5zIHRoZSByZWNvcmQgc2l6ZSAoRkZfTkFUSVZFKS4KLSAgCi0gICByZWFkaW5nIGlzIGFsd2F5cyBkb25lIGluIDIgc3RlcHMuCi0gICBmaXJzdCBqdXN0IHRoZSByZWNvcmQgaGVhZGVyIGlzIHJlYWQgYW5kIHRoZSBsZW5ndGggZXh0cmFjdGVkCi0gICBieSBnZXRfaGVhZGVyX3ZhbHVlcwotICAgdGhlbiB0aGUgcmVhZCBidWZmZXIgaXMgYWRqdXN0ZWQgYW5kIHRoZSByZW1haW5pbmcgYnl0ZXMgYXJlCi0gICByZWFkIGluLgotICAKLSAgIGFsbCBmaWxlIGkvbyBpcyBhbHdheXMgZG9uZSBvbiBldmVuIGZpbGUgcG9zaXRpb25zICAqLwotCi1pbnQKLV9iZmRfdm1zX2dldF9yZWNvcmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHRlc3RfbGVuLCB0ZXN0X3N0YXJ0LCByZW1haW5pbmc7Ci0gIHVuc2lnbmVkIGNoYXIgKnZtc19idWY7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg4LCAiX2JmZF92bXNfZ2V0X3JlY29yZFxuIik7Ci0jZW5kaWYKLQotICAvKiBtaW5pbXVtIGlzIDYgYnl0ZXMgb24gQWxwaGEKLSAgICAgKDIgYnl0ZXMgbGVuZ3RoLCAyIGJ5dGVzIHJlY29yZCBpZCwgMiBieXRlcyBsZW5ndGggcmVwZWF0ZWQpCi0KLSAgICAgb24gVkFYIHRoZXJlJ3Mgbm8gbGVuZ3RoIGluZm9ybWF0aW9uIGluIHRoZSByZWNvcmQKLSAgICAgc28gc3RhcnQgd2l0aCBPQkpfU19DX01BWFJFQ1NJWiAgKi8KLQotICBpZiAoUFJJVihidWZfc2l6ZSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoUFJJVihpc192YXgpKQotCXsKLQkgIFBSSVYodm1zX2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKE9CSl9TX0NfTUFYUkVDU0laKTsKLQkgIFBSSVYoYnVmX3NpemUpID0gT0JKX1NfQ19NQVhSRUNTSVo7Ci0JICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX1ZBWDsKLQl9Ci0gICAgICBlbHNlCi0JUFJJVih2bXNfYnVmKSA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyAoNik7Ci0gICAgfQotCi0gIHZtc19idWYgPSBQUklWKHZtc19idWYpOwotCi0gIGlmICh2bXNfYnVmID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHN3aXRjaCAoUFJJVihmaWxlX2Zvcm1hdCkpCi0gICAgewotICAgICAgY2FzZSBGRl9VTktOT1dOOgotICAgICAgY2FzZSBGRl9GT1JFSUdOOgotCXRlc3RfbGVuID0gNjsJCQkvKiBwcm9iZSA2IGJ5dGVzICovCi0JdGVzdF9zdGFydCA9IDI7CQkJLyogd2hlcmUgdGhlIHJlY29yZCBzdGFydHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEZGX05BVElWRToKLQl0ZXN0X2xlbiA9IDQ7Ci0JdGVzdF9zdGFydCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBGRl9WQVg6Ci0JdGVzdF9sZW4gPSAwOwotCXRlc3Rfc3RhcnQgPSAwOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvKiBza2lwIG9kZCBhbGlnbm1lbnQgYnl0ZSAgKi8KLQotICBpZiAoYmZkX3RlbGwgKGFiZmQpICYgMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3JlYWQgKFBSSVYodm1zX2J1ZiksIDEsIDEsIGFiZmQpICE9IDEpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0KLSAgLyogcmVhZCB0aGUgcmVjb3JkIGhlYWRlciBvbiBBbHBoYS4gICovCi0KLSAgaWYgKCh0ZXN0X2xlbiAhPSAwKQotICAgICAgJiYgKGJmZF9yZWFkIChQUklWKHZtc19idWYpLCAxLCB0ZXN0X2xlbiwgYWJmZCkKLQkgICE9IChiZmRfc2l6ZV90eXBlKSB0ZXN0X2xlbikpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBjaGVjayBmaWxlIGZvcm1hdCBvbiBmaXJzdCBjYWxsICAqLwotCi0gIGlmIChQUklWKGZpbGVfZm9ybWF0KSA9PSBGRl9VTktOT1dOKQotICAgIHsJCQkJCQkvKiByZWNvcmQgbGVuZ3RoIHJlcGVhdHMgPyAqLwotICAgICAgaWYgKCAodm1zX2J1ZlswXSA9PSB2bXNfYnVmWzRdKQotICAgICAgICAmJiAodm1zX2J1ZlsxXSA9PSB2bXNfYnVmWzVdKSkKLQl7Ci0JICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX0ZPUkVJR047CS8qIFk6IGZvcmVpZ24gZW52aXJvbm1lbnQgKi8KLQkgIHRlc3Rfc3RhcnQgPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX05BVElWRTsJLyogTjogbmF0aXZlIGVudmlyb25tZW50ICovCi0JICB0ZXN0X3N0YXJ0ID0gMDsKLQl9Ci0gICAgfQotCi0gIGlmIChQUklWKGlzX3ZheCkpCi0gICAgewotICAgICAgUFJJVihyZWNfbGVuZ3RoKSA9IGJmZF9yZWFkICh2bXNfYnVmLCAxLCBQUklWKGJ1Zl9zaXplKSwgYWJmZCk7Ci0gICAgICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA8PSAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBQUklWKHZtc19yZWMpID0gdm1zX2J1ZjsKLSAgICB9Ci0gIGVsc2UJCS8qIEFscGhhICAqLwotICAgIHsKLSAgICAgIC8qIGV4dHJhY3Qgdm1zIHJlY29yZCBsZW5ndGggICovCi0KLSAgICAgIF9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzIChhYmZkLCB2bXNfYnVmK3Rlc3Rfc3RhcnQsIE5VTEwsCi0JCQkJICAmUFJJVihyZWNfbGVuZ3RoKSk7Ci0KLSAgICAgIGlmIChQUklWKHJlY19sZW5ndGgpIDw9IDApCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogdGhhdCdzIHdoYXQgdGhlIGxpbmtlciBtYW51YWwgc2F5cyAgKi8KLQotICAgICAgaWYgKFBSSVYocmVjX2xlbmd0aCkgPiBFT0JKX1NfQ19NQVhSRUNTSVopCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogYWRqdXN0IHRoZSBidWZmZXIgICovCi0KLSAgICAgIGlmIChQUklWKHJlY19sZW5ndGgpID4gUFJJVihidWZfc2l6ZSkpCi0JewotCSAgUFJJVih2bXNfYnVmKSA9ICh1bnNpZ25lZCBjaGFyICopIHJlYWxsb2MgKHZtc19idWYsIFBSSVYocmVjX2xlbmd0aCkpOwotCSAgdm1zX2J1ZiA9IFBSSVYodm1zX2J1Zik7Ci0JICBpZiAodm1zX2J1ZiA9PSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICBQUklWKGJ1Zl9zaXplKSA9IFBSSVYocmVjX2xlbmd0aCk7Ci0JfQotCi0gICAgICAvKiByZWFkIHRoZSByZW1haW5pbmcgcmVjb3JkICAqLwotCi0gICAgICByZW1haW5pbmcgPSBQUklWKHJlY19sZW5ndGgpIC0gdGVzdF9sZW4gKyB0ZXN0X3N0YXJ0OwotCi0jaWYgVk1TX0RFQlVHCi0gICAgICB2bXNfZGVidWcgKDEwLCAiYmZkX3JlYWQgcmVtYWluaW5nICVkXG4iLCByZW1haW5pbmcpOwotI2VuZGlmCi0gICAgICBpZiAoYmZkX3JlYWQgKHZtc19idWYgKyB0ZXN0X2xlbiwgMSwgcmVtYWluaW5nLCBhYmZkKSAhPQotCSAgKGJmZF9zaXplX3R5cGUpIHJlbWFpbmluZykKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgUFJJVih2bXNfcmVjKSA9IHZtc19idWYgKyB0ZXN0X3N0YXJ0OwotICAgIH0KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDExLCAiYmZkX3JlYWQgcmVjX2xlbmd0aCAlZFxuIiwgUFJJVihyZWNfbGVuZ3RoKSk7Ci0jZW5kaWYKLQotICByZXR1cm4gUFJJVihyZWNfbGVuZ3RoKTsKLX0KLQotCi0vKiBnZXQgbmV4dCB2bXMgcmVjb3JkIGZyb20gZmlsZQotICAgdXBkYXRlIHZtc19yZWMgYW5kIHJlY19sZW5ndGggdG8gbmV3IChyZW1haW5pbmcpIHZhbHVlcyAgKi8KLQotaW50Ci1fYmZkX3Ztc19uZXh0X3JlY29yZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDgsICJfYmZkX3Ztc19uZXh0X3JlY29yZCAobGVuICVkLCBzaXplICVkKVxuIiwKLQkgICAgICBQUklWKHJlY19sZW5ndGgpLCBQUklWKHJlY19zaXplKSk7Ci0jZW5kaWYKLQotICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA+IDApCi0gICAgewotICAgICAgUFJJVih2bXNfcmVjKSArPSBQUklWKHJlY19zaXplKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoX2JmZF92bXNfZ2V0X3JlY29yZCAoYWJmZCkgPD0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChQUklWKGlzX3ZheCkpCi0gICAgewotICAgICAgUFJJVihyZWNfdHlwZSkgPSAqKFBSSVYodm1zX3JlYykpOwotICAgICAgUFJJVihyZWNfc2l6ZSkgPSBQUklWKHJlY19sZW5ndGgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIF9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzIChhYmZkLCBQUklWKHZtc19yZWMpLCAmUFJJVihyZWNfdHlwZSksCi0JCQkJICAmUFJJVihyZWNfc2l6ZSkpOwotICAgIH0KLSAgUFJJVihyZWNfbGVuZ3RoKSAtPSBQUklWKHJlY19zaXplKTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDgsICJfYmZkX3Ztc19uZXh0X3JlY29yZDogcmVjICVwLCBzaXplICVkLCBsZW5ndGggJWQsIHR5cGUgJWRcbiIsCi0JICAgICAgUFJJVih2bXNfcmVjKSwgUFJJVihyZWNfc2l6ZSksIFBSSVYocmVjX2xlbmd0aCksCi0JICAgICAgUFJJVihyZWNfdHlwZSkpOwotI2VuZGlmCi0KLSAgcmV0dXJuIFBSSVYocmVjX3R5cGUpOwotfQotCi0KLQwKLS8qIENvcHkgc2l6ZWQgc3RyaW5nIChzdHJpbmcgd2l0aCBmaXhlZCBsZW5ndGgpIHRvIG5ldyBhbGxvY2F0ZWQgYXJlYQotICAgc2l6ZSBpcyBzdHJpbmcgbGVuZ3RoIChzaXplIG9mIHJlY29yZCkgICovCi0KLWNoYXIgKgotX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHN0ciwgc2l6ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqc3RyOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgY2hhciAqbmV3c3RyID0gYmZkX21hbGxvYyAoc2l6ZSArIDEpOwotCi0gIGlmIChuZXdzdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgc3RybmNweSAobmV3c3RyLCAoY2hhciAqKXN0ciwgc2l6ZSk7Ci0gIG5ld3N0cltzaXplXSA9IDA7Ci0KLSAgcmV0dXJuIG5ld3N0cjsKLX0KLQotLyogQ29weSBjb3VudGVkIHN0cmluZyAoc3RyaW5nIHdpdGggbGVuZ3RoIGF0IGZpcnN0IGJ5dGUpIHRvIG5ldyBhbGxvY2F0ZWQgYXJlYQotICAgcHRyIHBvaW50cyB0byBsZW5ndGggYnl0ZSBvbiBlbnRyeSAgKi8KLQotY2hhciAqCi1fYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLSAgaW50IGxlbiA9ICpwdHIrKzsKLQotICByZXR1cm4gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgbGVuKTsKLX0KLQotDAotLyogc3RhY2sgcm91dGluZXMgZm9yIHZtcyBFVElSIGNvbW1hbmRzICovCi0KLS8qIFB1c2ggdmFsdWUgYW5kIHNlY3Rpb24gaW5kZXggICovCi0KLXZvaWQKLV9iZmRfdm1zX3B1c2ggKGFiZmQsIHZhbCwgcHNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdXF1YWQgdmFsOwotICAgICBpbnQgcHNlY3Q7Ci17Ci0gIHN0YXRpYyBpbnQgbGFzdF9wc2VjdDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDQsICI8cHVzaCAlMDE2bHgoJWQpIGF0ICVkPlxuIiwgdmFsLCBwc2VjdCwgUFJJVihzdGFja3B0cikpOwotI2VuZGlmCi0KLSAgaWYgKHBzZWN0ID49IDApCi0gICAgbGFzdF9wc2VjdCA9IHBzZWN0OwotCi0gIFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS52YWx1ZSA9IHZhbDsKLSAgUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnBzZWN0ID0gbGFzdF9wc2VjdDsKLSAgUFJJVihzdGFja3B0cikrKzsKLSAgaWYgKFBSSVYoc3RhY2twdHIpID49IFNUQUNLU0laRSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU3RhY2sgb3ZlcmZsb3cgKCVkKSBpbiBfYmZkX3Ztc19wdXNoIiksIFBSSVYoc3RhY2twdHIpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFBvcCB2YWx1ZSBhbmQgc2VjdGlvbiBpbmRleCAgKi8KLQotdXF1YWQKLV9iZmRfdm1zX3BvcCAoYWJmZCwgcHNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50ICpwc2VjdDsKLXsKLSAgdXF1YWQgdmFsdWU7Ci0KLSAgaWYgKFBSSVYoc3RhY2twdHIpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrIHVuZGVyZmxvdyBpbiBfYmZkX3Ztc19wb3AiKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIFBSSVYoc3RhY2twdHIpLS07Ci0gIHZhbHVlID0gUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnZhbHVlOwotICBpZiAoKHBzZWN0ICE9IE5VTEwpICYmIChQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkucHNlY3QgPj0gMCkpCi0gICAgKnBzZWN0ID0gUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnBzZWN0OwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNCwgIjxwb3AgJTAxNmx4KCVkKT5cbiIsIHZhbHVlLCBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkucHNlY3QpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0MCi0vKiBvYmplY3QgZmlsZSBvdXRwdXQgZnVuY3Rpb25zICovCi0KLS8qIEdBUyB0ZW5kcyB0byB3cml0ZSBzZWN0aW9ucyBpbiBsaXR0bGUgY2h1bmtzIChiZmRfc2V0X3NlY3Rpb25fY29udGVudHMpCi0gICB3aGljaCB3ZSBjYW4ndCB1c2UgZGlyZWN0bHkuIFNvIHdlIHNhdmUgdGhlIGxpdHRsZSBjaHVua3MgaW4gbGlua2VkCi0gICBsaXN0cyAob25lIHBlciBzZWN0aW9uKSBhbmQgd3JpdGUgdGhlbSBsYXRlci4gICovCi0KLS8qIEFkZCBhIG5ldyB2bXNfc2VjdGlvbiBzdHJ1Y3R1cmUgdG8gdm1zX3NlY3Rpb25fdGFibGUKLSAgIC0gZm9yd2FyZCBjaGFpbmluZyAtICAqLwotCi1zdGF0aWMgdm1zX3NlY3Rpb24gKgotYWRkX25ld19jb250ZW50cyAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci17Ci0gIHZtc19zZWN0aW9uICpzcHRyLCAqbmV3cHRyOwotCi0gIHNwdHIgPSBQUklWKHZtc19zZWN0aW9uX3RhYmxlKVtzZWN0aW9uLT5pbmRleF07Ci0gIGlmIChzcHRyICE9IE5VTEwpCi0gICAgcmV0dXJuIHNwdHI7Ci0KLSAgbmV3cHRyID0gKHZtc19zZWN0aW9uICopIGJmZF9tYWxsb2MgKHNpemVvZiAodm1zX3NlY3Rpb24pKTsKLSAgaWYgKG5ld3B0ciA9PSAodm1zX3NlY3Rpb24gKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgbmV3cHRyLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgKGludClzZWN0aW9uLT5fcmF3X3NpemUpOwotICBpZiAobmV3cHRyLT5jb250ZW50cyA9PSAodW5zaWduZWQgY2hhciAqKU5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ld3B0ci0+b2Zmc2V0ID0gMDsKLSAgbmV3cHRyLT5zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotICBuZXdwdHItPm5leHQgPSAwOwotICBQUklWKHZtc19zZWN0aW9uX3RhYmxlKVtzZWN0aW9uLT5pbmRleF0gPSBuZXdwdHI7Ci0gIHJldHVybiBuZXdwdHI7Ci19Ci0KLQotLyogU2F2ZSBzZWN0aW9uIGRhdGEgJiBvZmZzZXQgdG8gYW4gdm1zX3NlY3Rpb24gc3RydWN0dXJlCi0gICB2bXNfc2VjdGlvbl90YWJsZVtdIGhvbGRzIHRoZSB2bXNfc2VjdGlvbiBjaGFpbiAgKi8KLQotYm9vbGVhbgotX2JmZF9zYXZlX3Ztc19zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBkYXRhLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgdm1zX3NlY3Rpb24gKnNwdHI7Ci0KLSAgaWYgKHNlY3Rpb24tPmluZGV4ID49IFZNU19TRUNUSU9OX0NPVU5UKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKGNvdW50ID09IChiZmRfc2l6ZV90eXBlKTApCi0gICAgcmV0dXJuIHRydWU7Ci0gIHNwdHIgPSBhZGRfbmV3X2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uKTsKLSAgaWYgKHNwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG1lbWNweSAoc3B0ci0+Y29udGVudHMgKyBvZmZzZXQsIGRhdGEsIChzaXplX3QpIGNvdW50KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBHZXQgdm1zX3NlY3Rpb24gcG9pbnRlciB0byBzYXZlZCBjb250ZW50cyBmb3Igc2VjdGlvbiAjIGluZGV4ICAqLwotCi12bXNfc2VjdGlvbiAqCi1fYmZkX2dldF92bXNfc2VjdGlvbiAoYWJmZCwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGluZGV4OwotewotICBpZiAoaW5kZXggPj0gIFZNU19TRUNUSU9OX0NPVU5UKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXR1cm4gUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbaW5kZXhdOwotfQotCi0MCi0vKiBPYmplY3Qgb3V0cHV0IHJvdXRpbmVzICAqLwotCi0vKiBCZWdpbiBuZXcgcmVjb3JkIG9yIHJlY29yZCBoZWFkZXIKLSAgIHdyaXRlIDIgYnl0ZXMgcmVjdHlwZQotICAgd3JpdGUgMiBieXRlcyByZWNvcmQgbGVuZ3RoIChmaWxsZWQgaW4gYXQgZmx1c2gpCi0gICB3cml0ZSAyIGJ5dGVzIGhlYWRlciB0eXBlIChvbW1pdHRlZCBpZiByZWNoZWFkID09IC0xKSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCByZWN0eXBlLCByZWNoZWFkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCByZWN0eXBlOwotICAgICBpbnQgcmVjaGVhZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2JlZ2luKHR5cGUgJWQsIGhlYWQgJWQpXG4iLCByZWN0eXBlLAotCSAgICAgIHJlY2hlYWQpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLHJlY3R5cGUpOwotCi0gIC8qIHNhdmUgY3VycmVudCBvdXRwdXQgcG9zaXRpb24gdG8gZmlsbCBpbiBsZW5naHQgbGF0ZXIgICovCi0KLSAgaWYgKFBSSVYocHVzaF9sZXZlbCkgPiAwKQotICAgIFBSSVYobGVuZ3RoX3BvcykgPSBQUklWKG91dHB1dF9zaXplKTsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfYmVnaW46IGxlbmd0aF9wb3MgPSAlZFxuIiwKLQkgICAgICBQUklWKGxlbmd0aF9wb3MpKTsKLSNlbmRpZgotCi0gIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwwKTsJCS8qIHBsYWNlaG9sZGVyIGZvciBsZW5ndGggKi8KLQotICBpZiAocmVjaGVhZCAhPSAtMSkKLSAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQscmVjaGVhZCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFNldCByZWNvcmQvc3VicmVjb3JkIGFsaWdubWVudCAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgYWxpZ250bykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgYWxpZ250bzsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCglZClcbiIsIGFsaWdudG8pOwotI2VuZGlmCi0KLSAgUFJJVihvdXRwdXRfYWxpZ25tZW50KSA9IGFsaWdudG87Ci0gIHJldHVybjsKLX0KLQotCi0vKiBQcmVwYXJlIGZvciBzdWJyZWNvcmQgZmllbGRzICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJ2bXNfb3V0cHV0X3B1c2gocHVzaGVkX3NpemUgPSAlZClcbiIsIFBSSVYob3V0cHV0X3NpemUpKTsKLSNlbmRpZgotCi0gIFBSSVYocHVzaF9sZXZlbCkrKzsKLSAgUFJJVihwdXNoZWRfc2l6ZSkgPSBQUklWKG91dHB1dF9zaXplKTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIEVuZCBvZiBzdWJyZWNvcmQgZmllbGRzICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgInZtc19vdXRwdXRfcG9wKHB1c2hlZF9zaXplID0gJWQpXG4iLCBQUklWKHB1c2hlZF9zaXplKSk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotICBQUklWKGxlbmd0aF9wb3MpID0gMjsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJ2bXNfb3V0cHV0X3BvcDogbGVuZ3RoX3BvcyA9ICVkXG4iLCBQUklWKGxlbmd0aF9wb3MpKTsKLSNlbmRpZgotCi0gIFBSSVYocHVzaGVkX3NpemUpID0gMDsKLSAgUFJJVihwdXNoX2xldmVsKS0tOwotICByZXR1cm47Ci19Ci0KLQotLyogRmx1c2ggdW53cml0dGVuIG91dHB1dCwgZW5kcyBjdXJyZW50IHJlY29yZCAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCByZWFsX3NpemUgPSBQUklWKG91dHB1dF9zaXplKTsKLSAgaW50IGFsaWduY291bnQ7Ci0gIGludCBsZW5ndGg7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2ZsdXNoKHJlYWxfc2l6ZSA9ICVkLCBwdXNoZWRfc2l6ZSAlZCBhdCBsZW5wb3MgJWQpXG4iLAotCSAgICAgIHJlYWxfc2l6ZSwgUFJJVihwdXNoZWRfc2l6ZSksIFBSSVYobGVuZ3RoX3BvcykpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYocHVzaF9sZXZlbCkgPiAwKQotICAgIGxlbmd0aCA9IHJlYWxfc2l6ZSAtIFBSSVYocHVzaGVkX3NpemUpOwotICBlbHNlCi0gICAgbGVuZ3RoID0gcmVhbF9zaXplOwotCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICByZXR1cm47Ci0gIGFsaWduY291bnQgPSAoUFJJVihvdXRwdXRfYWxpZ25tZW50KQotCQktIChsZW5ndGggJSBQUklWKG91dHB1dF9hbGlnbm1lbnQpKSkgJSBQUklWKG91dHB1dF9hbGlnbm1lbnQpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgImFsaWduOiBhZGRpbmcgJWQgYnl0ZXNcbiIsIGFsaWduY291bnQpOwotI2VuZGlmCi0KLSAgd2hpbGUoYWxpZ25jb3VudC0tID4gMCkKLSAgICB7Ci0gICAgICBQUklWKG91dHB1dF9idWYpW3JlYWxfc2l6ZSsrXSA9IDA7Ci0jaWYgMAotICAgICAgLyogdGhpcyBpcyB3aHkgSSAqbG92ZSogdm1zOiBpbmNvbnNpc3RlbmN5IDotfQotCSBhbGlnbm1lbnQgaXMgYWRkZWQgdG8gdGhlIHN1YnJlY29yZCBsZW5ndGgKLQkgYnV0IG5vdCB0byB0aGUgcmVjb3JkIGxlbmd0aCAgKi8KLSAgICAgIGlmIChQUklWKHB1c2hfbGV2ZWwpID4gMCkKLSNlbmRpZgotCWxlbmd0aCsrOwotICAgIH0KLQotICAvKiBwdXQgbGVuZ3RoIHRvIGJ1ZmZlciAgKi8KLSAgUFJJVihvdXRwdXRfc2l6ZSkgPSBQUklWKGxlbmd0aF9wb3MpOwotICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsICh1bnNpZ25lZCBpbnQpbGVuZ3RoKTsKLQotICBpZiAoUFJJVihwdXNoX2xldmVsKSA9PSAwKQotICAgIHsKLSNpZm5kZWYgVk1TCi0JLyogd3JpdGUgbGVuZ3RoIGZpcnN0LCBzZWUgRkZfRk9SRUlHTiBpbiB0aGUgaW5wdXQgcm91dGluZXMgKi8KLSAgICAgIGZ3cml0ZSAoUFJJVihvdXRwdXRfYnVmKSsyLCAyLCAxLCAoRklMRSAqKWFiZmQtPmlvc3RyZWFtKTsKLSNlbmRpZgotICAgICAgZndyaXRlIChQUklWKG91dHB1dF9idWYpLCByZWFsX3NpemUsIDEsIChGSUxFICopYWJmZC0+aW9zdHJlYW0pOwotCi0gICAgICBQUklWKG91dHB1dF9zaXplKSA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgUFJJVihvdXRwdXRfc2l6ZSkgPSByZWFsX3NpemU7Ci0gICAgICBQUklWKHB1c2hlZF9zaXplKSA9IFBSSVYob3V0cHV0X3NpemUpOwotICAgIH0KLQotICByZXR1cm47Ci19Ci0KLQotLyogRW5kIHJlY29yZCBvdXRwdXQgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2VuZFxuIik7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBjaGVjayByZW1haW5pbmcgYnVmZmVyIHNpemUKLQotICAgcmV0dXJuIHdoYXQncyBsZWZ0LiAgKi8KLQotaW50Ci1fYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIHNpemUpCi0gICAgYmZkICphYmZkOwotICAgIGludCBzaXplOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfY2hlY2soJWQpXG4iLCBzaXplKTsKLSNlbmRpZgotCi0gIHJldHVybiAoTUFYX09VVFJFQ19TSVpFIC0gKFBSSVYob3V0cHV0X3NpemUpICsgc2l6ZSArIE1JTl9PVVRSRUNfTFVGVCkpOwotfQotCi0KLS8qIE91dHB1dCBieXRlICg4IGJpdCkgdmFsdWUgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9ieXRlKCUwMngpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpKTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gMTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIE91dHB1dCBzaG9ydCAoMTYgYml0KSB2YWx1ZSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9zaG9ydCAoJTA0eClcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGJmZF9wdXRfMTYgKGFiZmQsIHZhbHVlICYgMHhmZmZmLCBQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSkpOwotICBQUklWKG91dHB1dF9zaXplKSArPSAyOwotICByZXR1cm47Ci19Ci0KLQotLyogT3V0cHV0IGxvbmcgKDMyIGJpdCkgdmFsdWUgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfbG9uZyAoJTA4bHgpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBiZmRfcHV0XzMyIChhYmZkLCB2YWx1ZSwgUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpKTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gNDsKLSAgcmV0dXJuOwotfQotCi0KLS8qIE91dHB1dCBxdWFkICg2NCBiaXQpIHZhbHVlICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdXF1YWQgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9xdWFkKCUwMTZseClcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGJmZF9wdXRfNjQoYWJmZCwgdmFsdWUsIFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IDg7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBPdXRwdXQgYy1zdHJpbmcgYXMgY291bnRlZCBzdHJpbmcgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICp2YWx1ZTsKLXsKLWludCBsZW47Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQoJXMpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBsZW4gPSBzdHJsZW4gKHZhbHVlKTsKLSAgaWYgKGxlbiA9PSAwKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgY2FsbGVkIHdpdGggemVybyBieXRlcyIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChsZW4gPiAyNTUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBjYWxsZWQgd2l0aCB0b28gbWFueSBieXRlcyIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCBsZW4gJiAweGZmKTsKLSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopdmFsdWUsIGxlbik7Ci19Ci0KLQotLyogT3V0cHV0IGNoYXJhY3RlciBhcmVhICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgZGF0YSwgbGVuZ3RoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9kdW1wKCVkKVxuIiwgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgbWVtY3B5IChQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSksIGRhdGEsIGxlbmd0aCk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IGxlbmd0aDsKLQotICByZXR1cm47Ci19Ci0KLQotLyogT3V0cHV0IGNvdW50IGJ5dGVzIG9mIHZhbHVlICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfZmlsbCAoYWJmZCwgdmFsdWUsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgaW50IGNvdW50OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfZmlsbCh2YWwgJTAyeCB0aW1lcyAlZClcbiIsIHZhbHVlLCBjb3VudCk7Ci0jZW5kaWYKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm47Ci0gIG1lbXNldCAoUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpLCB2YWx1ZSwgY291bnQpOwotICBQUklWKG91dHB1dF9zaXplKSArPSBjb3VudDsKLQotICByZXR1cm47Ci19Ci0KLS8qIHRoaXMgaGFzaCByb3V0aW5lIGJvcnJvd2VkIGZyb20gR05VLUVNQUNTLCBhbmQgc3RyZW5ndGhlbmVkIHNsaWdodGx5ICBFUlkqLwotCi1zdGF0aWMgaW50Ci1oYXNoX3N0cmluZyAocHRyKQotICAgICBjb25zdCBjaGFyICpwdHI7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSBwdHI7Ci0gIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCA9IHAgKyBzdHJsZW4gKHB0cik7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgYzsKLSAgcmVnaXN0ZXIgaW50IGhhc2ggPSAwOwotCi0gIHdoaWxlIChwICE9IGVuZCkKLSAgICB7Ci0gICAgICBjID0gKnArKzsKLSAgICAgIGhhc2ggPSAoKGhhc2ggPDwgMykgKyAoaGFzaCA8PCAxNSkgKyAoaGFzaCA+PiAyOCkgKyBjKTsKLSAgICB9Ci0gIHJldHVybiBoYXNoOwotfQotCi0vKiBHZW5lcmF0ZSBhIGxlbmd0aC1oYXNoZWQgVk1TIHN5bWJvbCBuYW1lIChsaW1pdGVkIHRvIG1heGxlbiBjaGFycykuICAqLwotCi1jaGFyICoKLV9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgaW4sIG1heGxlbikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICppbjsKLSAgICAgaW50IG1heGxlbjsKLXsKLSAgbG9uZyBpbnQgcmVzdWx0OwotICBpbnQgaW5fbGVuOwotICBjaGFyICpuZXdfbmFtZTsKLSAgY29uc3QgY2hhciAqb2xkX25hbWU7Ci0gIGludCBpOwotICBzdGF0aWMgY2hhciBvdXRidWZbRU9CSl9TX0NfU1lNU0laKzFdOwotICBjaGFyICpvdXQgPSBvdXRidWY7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDQsICJfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgXCIlc1wiXG4iLCBpbik7Ci0jZW5kaWYKLQotICBpZiAobWF4bGVuID4gRU9CSl9TX0NfU1lNU0laKQotICAgIG1heGxlbiA9IEVPQkpfU19DX1NZTVNJWjsKLQotICBuZXdfbmFtZSA9IG91dDsJCS8qIHNhdmUgdGhpcyBmb3IgbGF0ZXIuICAqLwotCi0gIC8qIFdlIG1heSBuZWVkIHRvIHRydW5jYXRlIHRoZSBzeW1ib2wsIHNhdmUgdGhlIGhhc2ggZm9yIGxhdGVyLiAgKi8KLQotICBpbl9sZW4gPSBzdHJsZW4gKGluKTsKLQotICByZXN1bHQgPSAoaW5fbGVuID4gbWF4bGVuKSA/IGhhc2hfc3RyaW5nIChpbikgOiAwOwotCi0gIG9sZF9uYW1lID0gaW47Ci0KLSAgLyogRG8gdGhlIGxlbmd0aCBjaGVja2luZy4gICovCi0KLSAgaWYgKGluX2xlbiA8PSBtYXhsZW4pCi0gICAgewotICAgICAgaSA9IGluX2xlbjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoUFJJVihmbGFnX2hhc2hfbG9uZ19uYW1lcykpCi0JaSA9IG1heGxlbi05OwotICAgICAgZWxzZQotCWkgPSBtYXhsZW47Ci0gICAgfQotCi0gIHN0cm5jcHkgKG91dCwgaW4sIGkpOwotICBpbiArPSBpOwotICBvdXQgKz0gaTsKLQotICBpZiAoKGluX2xlbiA+IG1heGxlbikKLSAgICAgICYmIFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpKQotICAgIHNwcmludGYgKG91dCwgIl8lMDhseCIsIHJlc3VsdCk7Ci0gIGVsc2UKLSAgICAqb3V0ID0gMDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcoNCwgIi0tPiBbJWRdXCIlc1wiXG4iLCBzdHJsZW4gKG91dGJ1ZiksIG91dGJ1Zik7Ci0jZW5kaWYKLQotICBpZiAoaW5fbGVuID4gbWF4bGVuCi0JJiYgUFJJVihmbGFnX2hhc2hfbG9uZ19uYW1lcykKLQkmJiBQUklWKGZsYWdfc2hvd19hZnRlcl90cnVuYykpCi0gICAgcHJpbnRmIChfKCJTeW1ib2wgJXMgcmVwbGFjZWQgYnkgJXNcbiIpLCBvbGRfbmFtZSwgbmV3X25hbWUpOwotCi0gIHJldHVybiBvdXRidWY7Ci19Ci0KLQotLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgc3ltYm9sLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotbmV3X3N5bWJvbCAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotewotICBhc3ltYm9sICpzeW1ib2w7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDcsICAibmV3X3N5bWJvbCAlc1xuIiwgbmFtZSk7Ci0jZW5kaWYKLQotICBzeW1ib2wgPSBfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzeW1ib2wgPT0gMCkKLSAgICByZXR1cm4gc3ltYm9sOwotICBzeW1ib2wtPm5hbWUgPSBuYW1lOwotICBzeW1ib2wtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSk7Ci0KLSAgcmV0dXJuIHN5bWJvbDsKLX0KLQotCi0vKiBBbGxvY2F0ZSBhbmQgZW50ZXIgYSBuZXcgcHJpdmF0ZSBzeW1ib2wuICAqLwotCi12bXNfc3ltYm9sX2VudHJ5ICoKLV9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotewotICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgICJfYmZkX3Ztc19lbnRlcl9zeW1ib2wgJXNcbiIsIG5hbWUpOwotI2VuZGlmCi0KLSAgZW50cnkgPSAodm1zX3N5bWJvbF9lbnRyeSAqKQotCSAgYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotICBpZiAoZW50cnkgPT0gMCkKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICBfYmZkX3Ztc19kZWJ1ZyAoOCwgICJjcmVhdGluZyBoYXNoIGVudHJ5IGZvciAlc1xuIiwgbmFtZSk7Ci0jZW5kaWYKLSAgICAgIGVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKiliZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIHRydWUsIGZhbHNlKTsKLSAgICAgIGlmIChlbnRyeSAhPSAwKQotCXsKLQkgIGFzeW1ib2wgKnN5bWJvbDsKLQkgIHN5bWJvbCA9IG5ld19zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKHN5bWJvbCAhPSAwKQotCSAgICB7Ci0JICAgICAgZW50cnktPnN5bWJvbCA9IHN5bWJvbDsKLQkgICAgICBQUklWKGdzZF9zeW1fY291bnQpKys7Ci0JICAgICAgYWJmZC0+c3ltY291bnQrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBlbnRyeSA9IDA7Ci0JfQotICAgICAgZWxzZQotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiZmFpbGVkIHRvIGVudGVyICVzIiksIG5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZiBWTVNfREVCVUcKLSAgICAgIF9iZmRfdm1zX2RlYnVnICg4LCAgImZvdW5kIGhhc2ggZW50cnkgZm9yICVzXG4iLCBuYW1lKTsKLSNlbmRpZgotICAgIH0KLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNywgIi0+IGVudHJ5ICVwLCBlbnRyeS0+c3ltYm9sICVwXG4iLCBlbnRyeSwgZW50cnktPnN5bWJvbCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGVudHJ5OwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy10aXIuYyBiL2JmZC92bXMtdGlyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNGIxYjMuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy10aXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI0ODcgKzAsMCBAQAotLyogdm1zLXRpci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVkFYIChvcGVuVk1TL1ZBWCkgYW5kCi0gICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUSVIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotICAgRVRJUiByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCi0KLSAgIGdvIGFuZCByZWFkIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgKGVzcC4gYXBwZW5kaXggQikKLSAgIGlmIHlvdSBkb24ndCBrbm93IHdoYXQncyBnb2luZyBvbiBoZXJlIDotKQotCi0gICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhlIGZvbGxvd2luZyB0eXBlIGFiYnJldmlhdGlvbnMgYXJlIHVzZWQ6Ci0KLQljcwljb3VudGVkIHN0cmluZyAoYXNjaWkgc3RyaW5nIHdpdGggbGVuZ3RoIGJ5dGUpCi0JYnkJYnl0ZSAoMSBieXRlKQotCXNoCXNob3J0ICgyIGJ5dGUsIDE2IGJpdCkKLQlsdwlsb25nd29yZCAoNCBieXRlLCAzMiBiaXQpCi0JcXcJcXVhZHdvcmQgKDggYnl0ZSwgNjQgYml0KQotCWRhCWRhdGEgc3RyZWFtICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgInZtcy5oIgotCi1zdGF0aWMgdm9pZCBpbWFnZV9zZXRfcHRyIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IHBzZWN0LCB1cXVhZCBvZmZzZXQpKTsKLXN0YXRpYyB2b2lkIGltYWdlX2luY19wdHIgUEFSQU1TICgoYmZkICphYmZkLCB1cXVhZCBvZmZzZXQpKTsKLXN0YXRpYyB2b2lkIGltYWdlX2R1bXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIsIGludCBzaXplLCBpbnQgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV93cml0ZV9iIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHZhbHVlKSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV93cml0ZV93IFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHZhbHVlKSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV93cml0ZV9sIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfcSBQQVJBTVMgKChiZmQgKmFiZmQsIHVxdWFkIHZhbHVlKSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50Ci1jaGVja19zZWN0aW9uIChhYmZkLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgb2Zmc2V0OwotCi0gIG9mZnNldCA9IFBSSVYoaW1hZ2VfcHRyKSAtIFBSSVYoaW1hZ2Vfc2VjdGlvbiktPmNvbnRlbnRzOwotICBpZiAoKGJmZF9zaXplX3R5cGUpIChvZmZzZXQgKyBzaXplKSA+IFBSSVYoaW1hZ2Vfc2VjdGlvbiktPl9yYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cyA9IGJmZF9yZWFsbG9jIChQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cywgb2Zmc2V0ICsgc2l6ZSk7Ci0gICAgICBpZiAoUFJJVihpbWFnZV9zZWN0aW9uKS0+Y29udGVudHMgPT0gMCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk5vIE1lbSAhIikpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIFBSSVYoaW1hZ2Vfc2VjdGlvbiktPl9yYXdfc2l6ZSA9IG9mZnNldCArIHNpemU7Ci0gICAgICBQUklWKGltYWdlX3B0cikgPSBQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cyArIG9mZnNldDsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIHJvdXRpbmVzIHRvIGZpbGwgc2VjdGlvbnMgY29udGVudHMgZHVyaW5nIHRpci9ldGlyIHJlYWQgKi8KLQotLyogSW5pdGlhbGl6ZSBpbWFnZSBidWZmZXIgcG9pbnRlciB0byBiZSBmaWxsZWQgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV9zZXRfcHRyIChhYmZkLCBwc2VjdCwgb2Zmc2V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBwc2VjdDsKLSAgICAgdXF1YWQgb2Zmc2V0OwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNCwgImltYWdlX3NldF9wdHIgKCVkPSVzLCAlZClcbiIsCi0JCXBzZWN0LCBQUklWKHNlY3Rpb25zKVtwc2VjdF0tPm5hbWUsIG9mZnNldCk7Ci0jZW5kaWYKLQotICBQUklWKGltYWdlX3B0cikgPSBQUklWKHNlY3Rpb25zKVtwc2VjdF0tPmNvbnRlbnRzICsgb2Zmc2V0OwotICBQUklWKGltYWdlX3NlY3Rpb24pID0gUFJJVihzZWN0aW9ucylbcHNlY3RdOwotICByZXR1cm47Ci19Ci0KLQotLyogSW5jcmVtZW50IGltYWdlIGJ1ZmZlciBwb2ludGVyIGJ5IG9mZnNldCAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX2luY19wdHIgKGFiZmQsIG9mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICB1cXVhZCBvZmZzZXQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAiaW1hZ2VfaW5jX3B0ciAoJWQpXG4iLCBvZmZzZXQpOwotI2VuZGlmCi0KLSAgUFJJVihpbWFnZV9wdHIpICs9IG9mZnNldDsKLQotICByZXR1cm47Ci19Ci0KLQotLyogRHVtcCBtdWx0aXBsZSBieXRlcyB0byBzZWN0aW9uIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2VfZHVtcCAoYWJmZCwgcHRyLCBzaXplLCBvZmZzZXQpCi0gICAgYmZkICphYmZkOwotICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICBpbnQgc2l6ZTsKLSAgICBpbnQgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg4LCAiaW1hZ2VfZHVtcCBmcm9tICglcCwgJWQpIHRvICglcClcbiIsIHB0ciwgc2l6ZSwgUFJJVihpbWFnZV9wdHIpKTsKLSAgX2JmZF9oZXhkdW1wICg5LCBwdHIsIHNpemUsIG9mZnNldCk7Ci0jZW5kaWYKLQotICBpZiAoUFJJVihpc192YXgpICYmIGNoZWNrX3NlY3Rpb24gKGFiZmQsIHNpemUpKQotICAgIHJldHVybjsKLQotICB3aGlsZSAoc2l6ZS0tID4gMCkKLSAgICAqUFJJVihpbWFnZV9wdHIpKysgPSAqcHRyKys7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSBieXRlIHRvIHNlY3Rpb24gaW1hZ2UgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV93cml0ZV9iIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg2LCAiaW1hZ2Vfd3JpdGVfYiglMDJ4KVxuIiwgKGludCl2YWx1ZSk7Ci0jZW5kaWYKLQotICBpZiAoUFJJVihpc192YXgpICYmIGNoZWNrX3NlY3Rpb24gKGFiZmQsIDEpKQotICAgIHJldHVybjsKLQotICAqUFJJVihpbWFnZV9wdHIpKysgPSAodmFsdWUgJiAweGZmKTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIFdyaXRlIDItYnl0ZSB3b3JkIHRvIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX3coJTA0eClcbiIsIChpbnQpdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCAyKSkKLSAgICByZXR1cm47Ci0KLSAgYmZkX3B1dGwxNiAodmFsdWUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIFBSSVYoaW1hZ2VfcHRyKSArPSAyOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSA0LWJ5dGUgbG9uZyB0byBpbWFnZSAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX3dyaXRlX2wgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg2LCAiaW1hZ2Vfd3JpdGVfbCAoJTA4bHgpXG4iLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBpZiAoUFJJVihpc192YXgpICYmIGNoZWNrX3NlY3Rpb24gKGFiZmQsIDQpKQotICAgIHJldHVybjsKLQotICBiZmRfcHV0bDMyICh2YWx1ZSwgUFJJVihpbWFnZV9wdHIpKTsKLSAgUFJJVihpbWFnZV9wdHIpICs9IDQ7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFdyaXRlIDgtYnl0ZSBxdWFkIHRvIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdXF1YWQgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg2LCAiaW1hZ2Vfd3JpdGVfcSAoJTAxNmx4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCA4KSkKLSAgICByZXR1cm47Ci0KLSAgYmZkX3B1dGw2NCAodmFsdWUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIFBSSVYoaW1hZ2VfcHRyKSArPSA4OwotCi0gIHJldHVybjsKLX0KLQwKLQotI2RlZmluZSBISUdIQklUKG9wKSAoKG9wICYgMHg4MDAwMDAwMEwpID09IDB4ODAwMDAwMDBMKQotCi0vKiBldGlyX3N0YQotICAKLSAgIHZtcyBzdGFjayBjb21tYW5kcwotICAKLSAgIGhhbmRsZSBzdGFfeHh4IGNvbW1hbmRzIGluIGV0aXIgc2VjdGlvbgotICAgcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCi0gIAotICAgc2VlIHRhYmxlIEItOCBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZXRpcl9zdGEgKGFiZmQsIGNtZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjbWQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RhICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAgICAgLyogc3RhY2sgKi8KLQotICAgICAgLyogc3RhY2sgZ2xvYmFsCi0JICAgYXJnOiBjcwlzeW1ib2wgbmFtZQotCi0JICAgc3RhY2sgMzIgYml0IHZhbHVlIG9mIHN5bWJvbCAoaGlnaCBiaXRzIHNldCB0byAwKSAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfR0JMOgotCXsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JICBlbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopCi0JCSAgYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgewotI2lmIFZNU19ERUJVRwotCSAgICAgIF9iZmRfdm1zX2RlYnVnICgzLCAiRVRJUl9TX0NfU1RBX0dCTDogbm8gc3ltYm9sIFwiJXNcIlxuIiwgbmFtZSk7Ci0jZW5kaWYKLQkgICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpMCwgLTEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSwgLTEpOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLQkvKiBzdGFjayBsb25nd29yZAotCSAgIGFyZzogbHcJdmFsdWUKLQotCSAgIHN0YWNrIDMyIGJpdCB2YWx1ZSwgc2lnbiBleHRlbmQgdG8gNjQgYml0ICAqLwotCi0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9MVzoKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpYmZkX2dldGwzMiAocHRyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLQkvKiBzdGFjayBnbG9iYWwKLQkgICBhcmc6IHF3CXZhbHVlCi0KLQkgICBzdGFjayA2NCBiaXQgdmFsdWUgb2Ygc3ltYm9sCSAqLwotCi0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9RVzoKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpYmZkX2dldGw2NChwdHIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotCS8qIHN0YWNrIHBzZWN0IGJhc2UgcGx1cyBxdWFkd29yZCBvZmZzZXQKLQkgICBhcmc6IGx3CXNlY3Rpb24gaW5kZXgKLQkgIAlxdwlzaWduZWQgcXVhZHdvcmQgb2Zmc2V0IChsb3cgMzIgYml0cykKLQotCSAgIHN0YWNrIHF3IGFyZ3VtZW50IGFuZCBzZWN0aW9uIGluZGV4Ci0JICAgKHNlZSBFVElSX1NfQ19TVE9fT0ZGLCBFVElSX1NfQ19DVExfU0VUUkIpICAqLwotCi0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9QUToKLSAgCXsKLQkgIHVxdWFkIGR1bW15OwotCSAgdW5zaWduZWQgaW50IHBzZWN0OwotCi0JICBwc2VjdCA9IGJmZF9nZXRsMzIgKHB0cik7Ci0JICBpZiAocHNlY3QgPj0gUFJJVihzZWN0aW9uX2NvdW50KSkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiQmFkIHNlY3Rpb24gaW5kZXggaW4gRVRJUl9TX0NfU1RBX1BRIikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZHVtbXkgPSBiZmRfZ2V0bDY0IChwdHIrNCk7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCBkdW1teSwgcHNlY3QpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLQotCS8qIGFsbCBub3Qgc3VwcG9ydGVkICAqLwotCi0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9MSToKLSAgICAgIGNhc2UgRVRJUl9TX0NfU1RBX01PRDoKLSAgICAgIGNhc2UgRVRJUl9TX0NfU1RBX0NLQVJHOgotCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJVbnN1cHBvcnRlZCBTVEEgY21kICVkIiksIGNtZCk7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVEEgY21kICVkIiksIGNtZCk7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RhIHRydWVcbiIpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qCi0gICBldGlyX3N0bwotICAKLSAgIHZtcyBzdG9yZSBjb21tYW5kcwotICAKLSAgIGhhbmRsZSBzdG9feHh4IGNvbW1hbmRzIGluIGV0aXIgc2VjdGlvbgotICAgcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCi0gIAotICAgc2VlIHRhYmxlIEItOSBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZXRpcl9zdG8gKGFiZmQsIGNtZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjbWQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLSAgdXF1YWQgZHVtbXk7Ci0gIGludCBwc2VjdDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RvICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotCi0gICAgICAvKiBzdG9yZSBieXRlOiBwb3Agc3RhY2ssIHdyaXRlIGJ5dGUKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fQjoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotI2lmIDAKLSAgICAgIGlmIChpc19zaGFyZSkJCS8qIEZJWE1FICovCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiRVRJUl9TX0NfU1RPX0I6IGJ5dGUgZml4dXBzIG5vdCBzdXBwb3J0ZWQiKTsKLSNlbmRpZgotICAgICAgaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgd29yZDogcG9wIHN0YWNrLCB3cml0ZSB3b3JkCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX1c6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSNpZiAwCi0gICAgICBpZiAoaXNfc2hhcmUpCQkvKiBGSVhNRSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkVUSVJfU19DX1NUT19COiB3b3JkIGZpeHVwcyBub3Qgc3VwcG9ydGVkIik7Ci0jZW5kaWYKLSAgICAgIGltYWdlX3dyaXRlX3cgKGFiZmQsIGR1bW15ICYgMHhmZmZmKTsJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgbG9uZ3dvcmQ6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fTFc6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSAgICAgIGR1bW15ICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7Ci0gICAgICBpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIHF1YWR3b3JkOiBwb3Agc3RhY2ssIHdyaXRlIHF1YWR3b3JkCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX1FXOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotICAgICAgaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgZHVtbXkpOwkJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgaW1tZWRpYXRlIHJlcGVhdGVkOiBwb3Agc3RhY2sgZm9yIHJlcGVhdCBjb3VudAotCSBhcmc6IGx3CWJ5dGUgY291bnQKLQkgZGEJZGF0YSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0lNTVI6Ci0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCi0Jc2l6ZSA9IGJmZF9nZXRsMzIgKHB0cik7Ci0JZHVtbXkgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCXdoaWxlIChkdW1teS0tID4gMEwpCi0JICBpbWFnZV9kdW1wIChhYmZkLCBwdHIrNCwgc2l6ZSwgMCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgZ2xvYmFsOiB3cml0ZSBzeW1ib2wgdmFsdWUKLQkgYXJnOiBjcwlnbG9iYWwgc3ltYm9sIG5hbWUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19HQkw6Ci0gICAgICB7Ci0Jdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0JY2hhciAqbmFtZTsKLQotCW5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCWVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKiliZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0JaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgIHsKLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fR0JMOiBubyBzeW1ib2wgXCIlc1wiIiksCi0JCQkJICAgbmFtZSk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQllbHNlCi0JICBpbWFnZV93cml0ZV9xIChhYmZkLCAodXF1YWQpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSk7CS8qIEZJWE1FLCByZWxvYyAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGNvZGUgYWRkcmVzczogd3JpdGUgYWRkcmVzcyBvZiBlbnRyeSBwb2ludAotCSBhcmc6IGNzCWdsb2JhbCBzeW1ib2wgbmFtZSAocHJvY2VkdXJlKSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0NBOgotICAgICAgewotCXZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCWNoYXIgKm5hbWU7Ci0KLQluYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQllbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQlpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCSAgewotCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19DQTogbm8gc3ltYm9sIFwiJXNcIiIpLAotCQkJCSAgIG5hbWUpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JZWxzZQotCSAgaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgKHVxdWFkKShlbnRyeS0+c3ltYm9sLT52YWx1ZSkpOwkvKiBGSVhNRSwgcmVsb2MgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBub3Qgc3VwcG9ydGVkICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fUkI6Ci0gICAgY2FzZSBFVElSX1NfQ19TVE9fQUI6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19SQi9BQjogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogc3RvcmUgb2Zmc2V0IHRvIHBzZWN0OiBwb3Agc3RhY2ssIGFkZCBsb3cgMzIgYml0cyB0byBiYXNlIG9mIHBzZWN0Ci0gICAgICAgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fT0ZGOgotICAgICAgewotCXVxdWFkIHE7Ci0JaW50IHBzZWN0OwotCi0JcSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlxICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7Ci0JaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgcSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogc3RvcmUgaW1tZWRpYXRlCi0JIGFyZzogbHcJY291bnQgb2YgYnl0ZXMKLQkgZGEJZGF0YSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0lNTToKLSAgICAgIHsKLQlpbnQgc2l6ZTsKLQotCXNpemUgPSBiZmRfZ2V0bDMyIChwdHIpOwotCWltYWdlX2R1bXAgKGFiZmQsIHB0cis0LCBzaXplLCAwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiB0aGlzIGNvZGUgaXMgJ3Jlc2VydmVkIHRvIGRpZ2l0YWwnIGFjY29yZGluZyB0byB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsLAotCSBob3dldmVyIGl0IGlzIGdlbmVyYXRlZCBieSB0aGUgREVDIEMgY29tcGlsZXIgYW5kIGRlZmluZWQgaW4gdGhlIGluY2x1ZGUgZmlsZS4KLQkgRklYTUUsIHNpbmNlIHRoZSBmb2xsb3dpbmcgaXMganVzdCBhIGd1ZXNzCi0JIHN0b3JlIGdsb2JhbCBsb25nd29yZDogc3RvcmUgMzJiaXQgdmFsdWUgb2Ygc3ltYm9sCi0JIGFyZzogY3MJc3ltYm9sIG5hbWUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19HQkxfTFc6Ci0gICAgICB7Ci0Jdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0JY2hhciAqbmFtZTsKLQotCW5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCWVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKiliZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0JaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgIHsKLSNpZiBWTVNfREVCVUcKLQkgICAgX2JmZF92bXNfZGVidWcgKDMsICJFVElSX1NfQ19TVE9fR0JMX0xXOiBubyBzeW1ib2wgXCIlc1wiXG4iLCBuYW1lKTsKLSNlbmRpZgotCSAgICBpbWFnZV93cml0ZV9sIChhYmZkLCAodW5zaWduZWQgbG9uZykwKTsJLyogRklYTUUsIHJlbG9jICovCi0JICB9Ci0JZWxzZQotCSAgaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSk7CS8qIEZJWE1FLCByZWxvYyAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19MUF9QU0I6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19MUF9QU0I6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19ISU5UX0dCTDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RPX0hJTlRfR0JMOiBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19ISU5UX1BTOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fSElOVF9QUzogbm90IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVE8gY21kICVkIiksIGNtZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIHN0YWNrIG9wZXJhdG9yIGNvbW1hbmRzCi0gICBhbGwgMzIgYml0IHNpZ25lZCBhcml0aG1ldGljCi0gICBhbGwgd29yZCBqdXN0IGxpa2UgYSBzdGFjayBjYWxjdWxhdG9yCi0gICBhcmd1bWVudHMgYXJlIHBvcHBlZCBmcm9tIHN0YWNrLCByZXN1bHRzIGFyZSBwdXNoZWQgb24gc3RhY2sKLSAgCi0gICBzZWUgdGFibGUgQi0xMCBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZXRpcl9vcHIgKGFiZmQsIGNtZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjbWQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0ciBBVFRSSUJVVEVfVU5VU0VEOwotewotICBsb25nIG9wMSwgb3AyOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAiZXRpcl9vcHIgJWQvJXhcbiIsIGNtZCwgY21kKTsKLSAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGNtZCkKLSAgICB7Ci0gICAgICAvKiBvcGVyYXRpb24gKi8KLQotICAgICAgLyogbm8tb3AgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9OT1A6Ci0gICAgICBicmVhazsKLQotICAgICAgLyogYWRkICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfQUREOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSArIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzdWJ0cmFjdCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX1NVQjoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDIgLSBvcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbXVsdGlwbHkgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9NVUw6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxICogb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGRpdmlkZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0RJVjoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgaWYgKG9wMiA9PSAwKQotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkwTCwgLTEpOwotICAgICAgZWxzZQotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AyIC8gb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGxvZ2ljYWwgYW5kICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfQU5EOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSAmIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBsb2dpY2FsIGluY2x1c2l2ZSBvcgkgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0lPUjoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgfCBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbG9naWNhbCBleGNsdXNpdmUgb3IgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9FT1I6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxIF4gb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIG5lZ2F0ZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX05FRzoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKC1vcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogY29tcGxlbWVudCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0NPTToKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSBeIC0xTCksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBpbnNlcnQgZmllbGQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9JTlNWOgotICAgICAgKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfT1BSX0lOU1Y6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qIGFyaXRobWV0aWMgc2hpZnQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9BU0g6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIGlmIChvcDIgPCAwKQkJLyogc2hpZnQgcmlnaHQgKi8KLQlvcDEgPj49IC1vcDI7Ci0gICAgICBlbHNlCQkJLyogc2hpZnQgbGVmdCAqLwotCW9wMSA8PD0gb3AyOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKW9wMSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHVuc2lnbmVkIHNoaWZ0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfVVNIOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfVVNIOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHJvdGF0ZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX1JPVDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfT1BSX1JPVDogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzZWxlY3QgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9TRUw6Ci0gICAgICBpZiAoKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKSAmIDB4MDFMKQotCSh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBlbHNlCi0JewotCSAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkgICh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpb3AxLCAtMSk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHJlZGVmaW5lIHN5bWJvbCB0byBjdXJyZW50IGxvY2F0aW9uICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfUkVERUY6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9SRURFRjogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBkZWZpbmUgYSBsaXRlcmFsICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfREZMSVQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9ERkxJVDogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgT1BSIGNtZCAlZCIpLCBjbWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIGNvbnRyb2wgY29tbWFuZHMKLSAgCi0gICBzZWUgdGFibGUgQi0xMSBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZXRpcl9jdGwgKGFiZmQsIGNtZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjbWQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLSAgdXF1YWQJIGR1bW15OwotICBpbnQgcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX2N0bCAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgICAgIC8qIHNldCByZWxvY2F0aW9uIGJhc2U6IHBvcCBzdGFjaywgc2V0IGltYWdlIGxvY2F0aW9uIGNvdW50ZXIKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19DVExfU0VUUkI6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSAgICAgIGltYWdlX3NldF9wdHIgKGFiZmQsIHBzZWN0LCBkdW1teSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogYXVnbWVudCByZWxvY2F0aW9uIGJhc2U6IGluY3JlbWVudCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyIGJ5IG9mZnNldAotCSBhcmc6IGx3CW9mZnNldCB2YWx1ZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfQ1RMX0FVR1JCOgotICAgICAgZHVtbXkgPSBiZmRfZ2V0bDMyIChwdHIpOwotICAgICAgaW1hZ2VfaW5jX3B0ciAoYWJmZCwgZHVtbXkpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGRlZmluZSBsb2NhdGlvbjogcG9wIGluZGV4LCBzYXZlIGxvY2F0aW9uIGNvdW50ZXIgdW5kZXIgaW5kZXgKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19DVExfREZMT0M6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICAvKiBGSVhNRSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHNldCBsb2NhdGlvbjogcG9wIGluZGV4LCByZXN0b3JlIGxvY2F0aW9uIGNvdW50ZXIgZnJvbSBpbmRleAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX0NUTF9TVExPQzoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotICAgICAgLyogRklYTUUgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzdGFjayBkZWZpbmVkIGxvY2F0aW9uOiBwb3AgaW5kZXgsIHB1c2ggbG9jYXRpb24gY291bnRlciBmcm9tIGluZGV4Ci0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfQ1RMX1NUS0RMOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICAvKiBGSVhNRSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBDVEwgY21kICVkIiksIGNtZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIHN0b3JlIGNvbmRpdGlvbmFsIGNvbW1hbmRzCi0gIAotICAgc2VlIHRhYmxlIEItMTIgYW5kIEItMTMgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfc3RjIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RjICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAgICAgLyogMjAwIFN0b3JlLWNvbmRpdGlvbmFsIExpbmthZ2UgUGFpcgotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTFA6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUQ19MUDogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDEgU3RvcmUtY29uZGl0aW9uYWwgTGlua2FnZSBQYWlyIHdpdGggUHJvY2VkdXJlIFNpZ25hdHVyZQotCSBhcmc6CWx3CWxpbmthZ2UgaW5kZXgKLQkgY3MJcHJvY2VkdXJlIG5hbWUKLQkgYnkJc2lnbmF0dXJlIGxlbmd0aAotCSBkYQlzaWduYXR1cmUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19MUF9QU0I6Ci0gICAgICBpbWFnZV9pbmNfcHRyIChhYmZkLCAxNik7CS8qIHNraXAgZW50cnkscHJvY3ZhbCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIDIwMiBTdG9yZS1jb25kaXRpb25hbCBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzoJbHcJbGlua2FnZSBpbmRleAotCSBjcwlnbG9iYWwgbmFtZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0dCTDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RDX0dCTDogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDMgU3RvcmUtY29uZGl0aW9uYWwgQ29kZSBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzoJbHcJbGlua2FnZSBpbmRleAotCSBjcwlwcm9jZWR1cmUgbmFtZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0dDQToKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RDX0dDQTogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDQgU3RvcmUtY29uZGl0aW9uYWwgQWRkcmVzcyBhdCBwc2VjdCArIG9mZnNldAotCSBhcmc6CWx3CWxpbmthZ2UgaW5kZXgKLQkgbHcJcHNlY3QgaW5kZXgKLQkgcXcJb2Zmc2V0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfUFM6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUQ19QUzogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDUgU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IGFkZHJlc3Mgb2YgZ2xvYmFsCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OT1BfR0JMOgotCi0gICAgICAvKiAyMDYgU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IHBlY3QgKyBvZmZzZXQKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX05PUF9QUzoKLQotICAgICAgLyogMjA3IFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBnbG9iYWwgYWRkcmVzcwotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfQlNSX0dCTDoKLQotICAgICAgLyogMjA4IFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBwZWN0ICsgb2Zmc2V0Ci0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19CU1JfUFM6Ci0KLSAgICAgIC8qIDIwOSBTdG9yZS1jb25kaXRpb25hbCBMREEgYXQgZ2xvYmFsIGFkZHJlc3MKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0xEQV9HQkw6Ci0KLSAgICAgIC8qIDIxMCBTdG9yZS1jb25kaXRpb25hbCBMREEgYXQgcHNlY3QgKyBvZmZzZXQKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0xEQV9QUzoKLQotICAgICAgLyogMjExIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBvciBIaW50IGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19CT0hfR0JMOgotCi0gICAgICAvKiAyMTIgU3RvcmUtY29uZGl0aW9uYWwgQlNSIG9yIEhpbnQgYXQgcGVjdCArIG9mZnNldAotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfQk9IX1BTOgotCi0gICAgICAvKiAyMTMgU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OQkhfR0JMOgotCi0gICAgICAvKiAyMTQgU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IHBzZWN0ICsgb2Zmc2V0Ci0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OQkhfUFM6Ci0vKiBGSVhNRSAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiRVRJUl9TX0NfU1RDX3h4OiAoJWQpIG5vdCBzdXBwb3J0ZWQiLCBjbWQpOyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDMsICAiUmVzZXJ2ZWQgU1RDIGNtZCAlZCIsIGNtZCk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGFzZWN0aW9uICoKLW5ld19zZWN0aW9uIChhYmZkLCBpZHgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgaWR4OwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgY2hhciBzbmFtZVsxNl07Ci0gIGNoYXIgKm5hbWU7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICAibmV3X3NlY3Rpb24gJWRcbiIsIGlkeCk7Ci0jZW5kaWYKLSAgc3ByaW50ZiAoc25hbWUsIFNFQ1RJT05fTkFNRV9URU1QTEFURSwgaWR4KTsKLQotICBuYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzbmFtZSkgKyAxKTsKLSAgaWYgKG5hbWUgPT0gMCkKLSAgICByZXR1cm4gMDsKLSAgc3RyY3B5IChuYW1lLCBzbmFtZSk7Ci0KLSAgc2VjdGlvbiA9IGJmZF9tYWxsb2MgKHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKHNlY3Rpb24gPT0gMCkKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICBfYmZkX3Ztc19kZWJ1ZyAoNiwgICJiZmRfbWFrZV9zZWN0aW9uICglcykgZmFpbGVkIiwgbmFtZSk7Ci0jZW5kaWYKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzZWN0aW9uLT5fcmF3X3NpemUgPSAwOwotICBzZWN0aW9uLT52bWEgPSAwOwotICBzZWN0aW9uLT5jb250ZW50cyA9IDA7Ci0gIHNlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IDA7Ci0gIHNlY3Rpb24tPm5hbWUgPSBuYW1lOwotICBzZWN0aW9uLT5pbmRleCA9IGlkeDsKLQotICByZXR1cm4gc2VjdGlvbjsKLX0KLQotCi1zdGF0aWMgaW50Ci1hbGxvY19zZWN0aW9uIChhYmZkLCBpZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGlkeDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICAiYWxsb2Nfc2VjdGlvbiAlZFxuIiwgaWR4KTsKLSNlbmRpZgotCi0gIFBSSVYoc2VjdGlvbnMpID0gKChhc2VjdGlvbiAqKikKLQkJICAgIGJmZF9yZWFsbG9jIChQUklWKHNlY3Rpb25zKSwgKGlkeCsxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgaWYgKFBSSVYoc2VjdGlvbnMpID09IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIHdoaWxlIChQUklWKHNlY3Rpb25fY291bnQpIDw9IGlkeCkKLSAgICB7Ci0gICAgICBQUklWKHNlY3Rpb25zKVtQUklWKHNlY3Rpb25fY291bnQpXSA9IG5ld19zZWN0aW9uIChhYmZkLCBQUklWKHNlY3Rpb25fY291bnQpKTsKLSAgICAgIGlmIChQUklWKHNlY3Rpb25zKVtQUklWKHNlY3Rpb25fY291bnQpXSA9PSAwKQotCXJldHVybiAtMTsKLSAgICAgIFBSSVYoc2VjdGlvbl9jb3VudCkrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIHRpcl9zdGEKLSAqCi0gKiB2YXggc3RhY2sgY29tbWFuZHMKLSAqCi0gKiBoYW5kbGUgc3RhX3h4eCBjb21tYW5kcyBpbiB0aXIgc2VjdGlvbgotICogcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCi0gKgotICogc2VlIHRhYmxlIDctMyBvZiB0aGUgVkFYL1ZNUyBsaW5rZXIgbWFudWFsCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX3N0YSAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi17Ci0gIGludCBjbWQgPSAqcHRyKys7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfc3RhICVkXG4iLCBjbWQpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAvKiBzdGFjayAqLwotICAgICAgY2FzZSBUSVJfU19DX1NUQV9HQkw6Ci0JLyoKLQkgKiBzdGFjayBnbG9iYWwKLQkgKiBhcmc6IGNzCXN5bWJvbCBuYW1lCi0JICoKLQkgKiBzdGFjayAzMiBiaXQgdmFsdWUgb2Ygc3ltYm9sIChoaWdoIGJpdHMgc2V0IHRvIDApCi0JICovCi0JewotCSAgY2hhciAqbmFtZTsKLQkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCi0JICBuYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQotICAgICAgICAgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLCBuYW1lKTsKLQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgIHJldHVybiAwOwotCi0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykoZW50cnktPnN5bWJvbC0+dmFsdWUpLCAtMSk7Ci0JICBwdHIgKz0gKnB0ciArIDE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfU0I6Ci0JLyoKLQkgKiBzdGFjayBzaWduZWQgYnl0ZQotCSAqIGFyZzogYnkJdmFsdWUKLQkgKgotCSAqIHN0YWNrIGJ5dGUgdmFsdWUsIHNpZ24gZXh0ZW5kIHRvIDMyIGJpdAotCSAqLwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIChsb25nKSpwdHIrKywgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfU1c6Ci0JLyoKLQkgKiBzdGFjayBzaWduZWQgc2hvcnQgd29yZAotCSAqIGFyZzogc2gJdmFsdWUKLQkgKgotCSAqIHN0YWNrIDE2IGJpdCB2YWx1ZSwgc2lnbiBleHRlbmQgdG8gMzIgYml0Ci0JICovCi0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKGxvbmcpYmZkX2dldGwxNihwdHIpLCAtMSk7Ci0JcHRyICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MVzoKLQkvKgotCSAqIHN0YWNrIHNpZ25lZCBsb25nd29yZAotCSAqIGFyZzogbHcJdmFsdWUKLQkgKgotCSAqIHN0YWNrIDMyIGJpdCB2YWx1ZQotCSAqLwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIChsb25nKWJmZF9nZXRsMzIgKHB0ciksIC0xKTsKLQlwdHIgKz0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1BCOgotICAgICAgY2FzZSBUSVJfU19DX1NUQV9XUEI6Ci0JLyoKLQkgKiBzdGFjayBwc2VjdCBiYXNlIHBsdXMgYnl0ZSBvZmZzZXQgKHdvcmQgaW5kZXgpCi0JICogYXJnOiBieQlzZWN0aW9uIGluZGV4Ci0JICoJKHNoCXNlY3Rpb24gaW5kZXgpCi0JICoJYnkJc2lnbmVkIGJ5dGUgb2Zmc2V0Ci0JICoKLQkgKi8KLSAgCXsKLQkgIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0JICB1bnNpZ25lZCBpbnQgcHNlY3Q7Ci0KLQkgIGlmIChjbWQgPT0gVElSX1NfQ19TVEFfUEIpCi0JICAgIHBzZWN0ID0gKnB0cisrOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHNlY3QgPSBiZmRfZ2V0bDE2KHB0cik7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICBhbGxvY19zZWN0aW9uIChhYmZkLCBwc2VjdCk7Ci0JICAgIH0KLQotCSAgZHVtbXkgPSAobG9uZykqcHRyKys7Ci0JICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgZHVtbXksIHBzZWN0KTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfUFc6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1dQVzoKLQkvKgotCSAqIHN0YWNrIHBzZWN0IGJhc2UgcGx1cyB3b3JkIG9mZnNldCAod29yZCBpbmRleCkKLQkgKiBhcmc6IGJ5CXNlY3Rpb24gaW5kZXgKLQkgKgkoc2gJc2VjdGlvbiBpbmRleCkKLQkgKglzaAlzaWduZWQgc2hvcnQgb2Zmc2V0Ci0JICoKLQkgKi8KLSAgCXsKLQkgIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0JICB1bnNpZ25lZCBpbnQgcHNlY3Q7Ci0KLQkgIGlmIChjbWQgPT0gVElSX1NfQ19TVEFfUFcpCi0JICAgIHBzZWN0ID0gKnB0cisrOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHNlY3QgPSBiZmRfZ2V0bDE2KHB0cik7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICBhbGxvY19zZWN0aW9uIChhYmZkLCBwc2VjdCk7Ci0JICAgIH0KLQotCSAgZHVtbXkgPSBiZmRfZ2V0bDE2KHB0cik7IHB0cis9MjsKLQkgIGR1bW15ICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCBkdW1teSwgcHNlY3QpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9QTDoKLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfV1BMOgotCS8qCi0JICogc3RhY2sgcHNlY3QgYmFzZSBwbHVzIGxvbmcgb2Zmc2V0ICh3b3JkIGluZGV4KQotCSAqIGFyZzogYnkJc2VjdGlvbiBpbmRleAotCSAqCShzaAlzZWN0aW9uIGluZGV4KQotCSAqCWx3CXNpZ25lZCBsb25nd29yZCBvZmZzZXQKLQkgKgotCSAqLwotICAJewotCSAgdW5zaWduZWQgbG9uZyBkdW1teTsKLQkgIHVuc2lnbmVkIGludCBwc2VjdDsKLQotCSAgaWYgKGNtZCA9PSBUSVJfU19DX1NUQV9QTCkKLQkgICAgcHNlY3QgPSAqcHRyKys7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwc2VjdCA9IGJmZF9nZXRsMTYocHRyKTsKLQkgICAgICBwdHIgKz0gMjsKLQkgICAgfQotCi0JICBpZiAocHNlY3QgPj0gUFJJVihzZWN0aW9uX2NvdW50KSkKLQkgICAgewotCSAgICAgIGFsbG9jX3NlY3Rpb24gKGFiZmQsIHBzZWN0KTsKLQkgICAgfQotCi0JICBkdW1teSA9IGJmZF9nZXRsMzIgKHB0cik7IHB0ciArPSA0OwotCSAgZHVtbXkgKz0gKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIGR1bW15LCBwc2VjdCk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1VCOgotCS8qCi0JICogc3RhY2sgdW5zaWduZWQgYnl0ZQotCSAqIGFyZzogYnkJdmFsdWUKLQkgKgotCSAqIHN0YWNrIGJ5dGUgdmFsdWUKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykqcHRyKyssIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1VXOgotCS8qCi0JICogc3RhY2sgdW5zaWduZWQgc2hvcnQgd29yZAotCSAqIGFyZzogc2gJdmFsdWUKLQkgKgotCSAqIHN0YWNrIDE2IGJpdCB2YWx1ZQotCSAqLwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKWJmZF9nZXRsMTYocHRyKSwgLTEpOwotCXB0ciArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfQkZJOgotCS8qCi0JICogc3RhY2sgYnl0ZSBmcm9tIGltYWdlCi0JICogYXJnOiAtCi0JICoKLQkgKi8KLQkvKkZBTExUSFJVKi8KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfV0ZJOgotCS8qCi0JICogc3RhY2sgYnl0ZSBmcm9tIGltYWdlCi0JICogYXJnOiAtCi0JICoKLQkgKi8KLQkvKkZBTExUSFJVKi8KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfTEZJOgotCS8qCi0JICogc3RhY2sgYnl0ZSBmcm9tIGltYWdlCi0JICogYXJnOiAtCi0JICoKLQkgKi8KLSAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1mcm9tLWltYWdlIG5vdCBpbXBsZW1lbnRlZCIpKTsKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9FUE06Ci0JLyoKLQkgKiBzdGFjayBlbnRyeSBwb2ludCBtYXNrCi0JICogYXJnOiBjcwlzeW1ib2wgbmFtZQotCSAqCi0JICogc3RhY2sgKHVuc2lnbmVkKSBlbnRyeSBwb2ludCBtYXNrIG9mIHN5bWJvbAotCSAqIGVyciBpZiBzeW1ib2wgaXMgbm8gZW50cnkgcG9pbnQKLQkgKi8KLQl7Ci0JICBjaGFyICpuYW1lOwotCSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0KLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWVudHJ5LW1hc2sgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKLQkgIHB0ciArPSAqcHRyICsgMTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9DS0FSRzoKLQkvKgotCSAqIGNvbXBhcmUgcHJvY2VkdXJlIGFyZ3VtZW50Ci0JICogYXJnOiBjcwlzeW1ib2wgbmFtZQotCSAqCWJ5CWFyZ3VtZW50IGluZGV4Ci0JICoJZGEJYXJndW1lbnQgZGVzY3JpcHRvcgotCSAqCi0JICogY29tcGFyZSBhcmd1bWVudCBkZXNjcmlwdG9yIHdpdGggc3ltYm9sIGFyZ3VtZW50IChBUkckVl9QQVNTTUVDSCkKLQkgKiBhbmQgc3RhY2sgVFJVRSAoYXJncyBtYXRjaCkgb3IgRkFMU0UgKGFyZ3MgZG9udCBtYXRjaCkgdmFsdWUKLQkgKi8KLSAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJQQVNTTUVDSCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgMUwsIC0xKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MU1k6Ci0JLyoKLQkgKiBzdGFjayBsb2NhbCBzeW1ib2wgdmFsdWUKLQkgKiBhcmc6CXNoCWVudmlyb25tZW50IGluZGV4Ci0JICoJY3MJc3ltYm9sIG5hbWUKLQkgKi8KLQl7Ci0JICBpbnQgZW52aWR4OwotCSAgY2hhciAqbmFtZTsKLQkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCi0JICBlbnZpZHggPSBiZmRfZ2V0bDE2KHB0cik7IHB0ciArPSAyOwotCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7Ci0JICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCSAgICByZXR1cm4gMDsKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWxvY2FsLXN5bWJvbCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCAwTCwgLTEpOwotCSAgcHRyICs9ICpwdHIgKyAxOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0xJVDoKLQkvKgotCSAqIHN0YWNrIGxpdGVyYWwKLSAJICogYXJnOglieQlsaXRlcmFsIGluZGV4Ci0JICoKLQkgKiBzdGFjayBsaXRlcmFsCi0JICovCi0JcHRyKys7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWxpdGVyYWwgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCWJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0xFUE06Ci0JLyoKLQkgKiBzdGFjayBsb2NhbCBzeW1ib2wgZW50cnkgcG9pbnQgbWFzawotCSAqIGFyZzoJc2gJZW52aXJvbm1lbnQgaW5kZXgKLQkgKgljcwlzeW1ib2wgbmFtZQotCSAqCi0JICogc3RhY2sgKHVuc2lnbmVkKSBlbnRyeSBwb2ludCBtYXNrIG9mIHN5bWJvbAotCSAqIGVyciBpZiBzeW1ib2wgaXMgbm8gZW50cnkgcG9pbnQKLQkgKi8KLQl7Ci0JICBpbnQgZW52aWR4OwotCSAgY2hhciAqbmFtZTsKLQkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCi0JICBlbnZpZHggPSBiZmRfZ2V0bDE2KHB0cik7IHB0ciArPSAyOwotCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7Ci0JICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCSAgICByZXR1cm4gMDsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU3RhY2stbG9jYWwtc3ltYm9sLWVudHJ5LXBvaW50LW1hc2sgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKLQkgIHB0ciArPSAqcHRyICsgMTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIFNUQSBjbWQgJWQiKSwgcHRyWy0xXSk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0KLQotLyoKLSAqIHRpcl9zdG8KLSAqCi0gKiB2YXggc3RvcmUgY29tbWFuZHMKLSAqCi0gKiBoYW5kbGUgc3RvX3h4eCBjb21tYW5kcyBpbiB0aXIgc2VjdGlvbgotICogcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCi0gKgotICogc2VlIHRhYmxlIDctNCBvZiB0aGUgVkFYL1ZNUyBsaW5rZXIgbWFudWFsCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX3N0byAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi17Ci0gIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0gIGludCBzaXplOwotICBpbnQgcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfc3RvICVkXG4iLCAqcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoKnB0cisrKQotICAgIHsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fU0I6Ci0JLyoKLQkgKiBzdG9yZSBzaWduZWQgYnl0ZTogcG9wIHN0YWNrLCB3cml0ZSBieXRlCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUT19TVzoKLQkvKgotCSAqIHN0b3JlIHNpZ25lZCB3b3JkOiBwb3Agc3RhY2ssIHdyaXRlIHdvcmQKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fTFc6Ci0JLyoKLQkgKiBzdG9yZSBsb25nd29yZDogcG9wIHN0YWNrLCB3cml0ZSBsb25nd29yZAotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWltYWdlX3dyaXRlX2wgKGFiZmQsIGR1bW15ICYgMHhmZmZmZmZmZik7LyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUT19CRDoKLQkvKgotCSAqIHN0b3JlIGJ5dGUgZGlzcGxhY2VkOiBwb3Agc3RhY2ssIHN1YiBsYysxLCB3cml0ZSBieXRlCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JZHVtbXkgLT0gKChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWEgKyAxKTsKLQlpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fV0Q6Ci0JLyoKLQkgKiBzdG9yZSB3b3JkIGRpc3BsYWNlZDogcG9wIHN0YWNrLCBzdWIgbGMrMiwgd3JpdGUgd29yZAotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWR1bW15IC09ICgoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hICsgMik7Ci0JaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgZHVtbXkgJiAweGZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX0xEOgotCS8qCi0JICogc3RvcmUgbG9uZyBkaXNwbGFjZWQ6IHBvcCBzdGFjaywgc3ViIGxjKzQsIHdyaXRlIGxvbmcKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlkdW1teSAtPSAoKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYSArIDQpOwotCWltYWdlX3dyaXRlX2wgKGFiZmQsIGR1bW15ICYgMHhmZmZmZmZmZik7LyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCi0gICAgICBicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fTEk6Ci0JLyoKLQkgKiBzdG9yZSBzaG9ydCBsaXRlcmFsOiBwb3Agc3RhY2ssIHdyaXRlIGJ5dGUKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1BJRFI6Ci0JLyoKLQkgKiBzdG9yZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBkYXRhIHJlZmVyZW5jZTogcG9wIHN0YWNrLCB3cml0ZSBsb25nd29yZAotCSAqIGFyZzogLQotCSAqIEZJWE1FOiBpbmNvbXBsZXRlICEKLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1BJQ1I6Ci0JLyoKLQkgKiBzdG9yZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHJlZmVyZW5jZTogcG9wIHN0YWNrLCB3cml0ZSBsb25nd29yZAotCSAqIGFyZzogLQotCSAqIEZJWE1FOiBpbmNvbXBsZXRlICEKLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV9iIChhYmZkLCAweDlmKTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JJVkI6Ci0JLyoKLQkgKiBzdG9yZSByZXBlYXRlZCBpbW1lZGlhdGUgdmFyaWFibGUgYnl0ZXMKLQkgKiAxLWJ5dGUgY291bnQgbiBmaWVsZCBmb2xsb3dlZCBieSBuIGJ5dGVzIG9mIGRhdGEKLQkgKiBwb3Agc3RhY2ssIHdyaXRlIG4gYnl0ZXMgPHN0YWNrPiB0aW1lcwotCSAqLwotCXNpemUgPSAqcHRyKys7Ci0JZHVtbXkgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCXdoaWxlIChkdW1teS0tID4gMEwpCi0JICBpbWFnZV9kdW1wIChhYmZkLCBwdHIsIHNpemUsIDApOwotCXB0ciArPSBzaXplOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19COgotCS8qCi0JICogc3RvcmUgYnl0ZSBmcm9tIHRvcCBsb25nd29yZAotCSAqLwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19XOgotCS8qCi0JICogc3RvcmUgd29yZCBmcm9tIHRvcCBsb25nd29yZAotCSAqLwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JCOgotCS8qCi0JICogc3RvcmUgcmVwZWF0ZWQgYnl0ZSBmcm9tIHRvcCBsb25nd29yZAotCSAqLwotCXNpemUgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoc2l6ZS0tID4gMCkKLQkgIGltYWdlX3dyaXRlX2IgKGFiZmQsIGR1bW15ICYgMHhmZik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JXOgotCS8qCi0JICogc3RvcmUgcmVwZWF0ZWQgd29yZCBmcm9tIHRvcCBsb25nd29yZAotCSAqLwotCXNpemUgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoc2l6ZS0tID4gMCkKLQkgIGltYWdlX3dyaXRlX3cgKGFiZmQsIGR1bW15ICYgMHhmZmZmKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUT19SU0I6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JTVzoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUkw6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1ZQUzoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fVVNCOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19VU1c6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JVQjoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUlVXOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19QSVJSOgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5pbXBsZW1lbnRlZCBTVE8gY21kICVkIiksIHB0clstMV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVE8gY21kICVkIiksIHB0clstMV0pOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qCi0gKiBzdGFjayBvcGVyYXRvciBjb21tYW5kcwotICogYWxsIDMyIGJpdCBzaWduZWQgYXJpdGhtZXRpYwotICogYWxsIHdvcmQganVzdCBsaWtlIGEgc3RhY2sgY2FsY3VsYXRvcgotICogYXJndW1lbnRzIGFyZSBwb3BwZWQgZnJvbSBzdGFjaywgcmVzdWx0cyBhcmUgcHVzaGVkIG9uIHN0YWNrCi0gKgotICogc2VlIHRhYmxlIDctNSBvZiB0aGUgVkFYL1ZNUyBsaW5rZXIgbWFudWFsCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX29wciAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi17Ci0gIGxvbmcgb3AxLCBvcDI7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfb3ByICVkXG4iLCAqcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoKnB0cisrKQotICAgIHsKLSAgLyogb3BlcmF0aW9uICovCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX05PUDoKLQkvKgotCSAqIG5vLW9wCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9BREQ6Ci0JLyoKLQkgKiBhZGQKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSArIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX1NVQjoKLQkvKgotCSAqIHN1YnRyYWN0Ci0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDIgLSBvcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9NVUw6Ci0JLyoKLQkgKiBtdWx0aXBseQotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxICogb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfRElWOgotCS8qCi0JICogZGl2aWRlCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWlmIChvcDIgPT0gMCkKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKTBMLCAtMSk7Ci0JZWxzZQotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMiAvIG9wMSksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0FORDoKLQkvKgotCSAqIGxvZ2ljYWwgYW5kCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDEgJiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9JT1I6Ci0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkvKgotCSAqIGxvZ2ljYWwgaW5jbHVzaXZlIG9yCi0JICovCi0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxIHwgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfRU9SOgotCS8qCi0JICogbG9naWNhbCBleGNsdXNpdmUgb3IKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSBeIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX05FRzoKLQkvKgotCSAqIG5lZ2F0ZQotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKC1vcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9DT006Ci0JLyoKLQkgKiBjb21wbGVtZW50Ci0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxIF4gLTFMKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfSU5TVjoKLQkvKgotCSAqIGluc2VydCBmaWVsZAotCSAqLwotCSh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpICAoIlRJUl9TX0NfT1BSX0lOU1YgaW5jb21wbGV0ZSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfQVNIOgotCS8qCi0JICogYXJpdGhtZXRpYyBzaGlmdAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpZiAoSElHSEJJVChvcDEpKQkJLyogc2hpZnQgcmlnaHQgKi8KLQkgIG9wMiA+Pj0gb3AxOwotCWVsc2UJCQkvKiBzaGlmdCBsZWZ0ICovCi0JICBvcDIgPDw9IG9wMTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZylvcDIsIC0xKTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfT1BSX0FTSCBpbmNvbXBsZXRlIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfVVNIOgotCS8qCi0JICogdW5zaWduZWQgc2hpZnQKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaWYgKEhJR0hCSVQob3AxKSkJCS8qIHNoaWZ0IHJpZ2h0ICovCi0JICBvcDIgPj49IG9wMTsKLQllbHNlCQkJLyogc2hpZnQgbGVmdCAqLwotCSAgb3AyIDw8PSBvcDE7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AyLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9VU0ggaW5jb21wbGV0ZSIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX1JPVDoKLQkvKgotCSAqIHJvdGF0ZQotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpZiAoSElHSEJJVCgwKSkJCS8qIHNoaWZ0IHJpZ2h0ICovCi0JICBvcDIgPj49IG9wMTsKLQllbHNlCQkJLyogc2hpZnQgbGVmdCAqLwotCSAgb3AyIDw8PSBvcDE7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AyLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9ST1QgaW5jb21wbGV0ZSIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX1NFTDoKLQkvKgotCSAqIHNlbGVjdAotCSAqLwotCWlmICgobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpICYgMHgwMUwpCi0JICAodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWVsc2UKLQkgIHsKLQkgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkgICAgKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AxLCAtMSk7Ci0JICB9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9SRURFRjoKLQkvKgotCSAqIHJlZGVmaW5lIHN5bWJvbCB0byBjdXJyZW50IGxvY2F0aW9uCi0JICovCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9SRURFRiBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfREZMSVQ6Ci0JLyoKLQkgKiBkZWZpbmUgYSBsaXRlcmFsCi0JICovCi0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9ERkxJVCBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBPUFIgY21kICVkIiksIHB0clstMV0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX2N0bCAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi0vKgotICogY29udHJvbCBjb21tYW5kcwotICoKLSAqIHNlZSB0YWJsZSA3LTYgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi17Ci0gIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0gIHVuc2lnbmVkIGludCBwc2VjdDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgInRpcl9jdGwgJWRcbiIsICpwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoICgqcHRyKyspCi0gICAgewotICAgICAgY2FzZSBUSVJfU19DX0NUTF9TRVRSQjoKLQkvKgotCSAqIHNldCByZWxvY2F0aW9uIGJhc2U6IHBvcCBzdGFjaywgc2V0IGltYWdlIGxvY2F0aW9uIGNvdW50ZXIKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpZiAocHNlY3QgPj0gUFJJVihzZWN0aW9uX2NvdW50KSkKLQkgIHsKLQkgICAgYWxsb2Nfc2VjdGlvbiAoYWJmZCwgcHNlY3QpOwotCSAgfQotCWltYWdlX3NldF9wdHIgKGFiZmQsIHBzZWN0LCBkdW1teSk7Ci0gICAgICBicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19DVExfQVVHUkI6Ci0JLyoKLQkgKiBhdWdtZW50IHJlbG9jYXRpb24gYmFzZTogaW5jcmVtZW50IGltYWdlIGxvY2F0aW9uIGNvdW50ZXIgYnkgb2Zmc2V0Ci0JICogYXJnOiBsdwlvZmZzZXQgdmFsdWUKLQkgKi8KLQlkdW1teSA9IGJmZF9nZXRsMzIgKHB0cik7Ci0JaW1hZ2VfaW5jX3B0ciAoYWJmZCwgZHVtbXkpOwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfQ1RMX0RGTE9DOgotCS8qCi0JICogZGVmaW5lIGxvY2F0aW9uOiBwb3AgaW5kZXgsIHNhdmUgbG9jYXRpb24gY291bnRlciB1bmRlciBpbmRleAotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfQ1RMX0RGTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX0NUTF9TVExPQzoKLQkvKgotCSAqIHNldCBsb2NhdGlvbjogcG9wIGluZGV4LCByZXN0b3JlIGxvY2F0aW9uIGNvdW50ZXIgZnJvbSBpbmRleAotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19DVExfU1RMT0Mgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUSVJfU19DX0NUTF9TVEtETDoKLQkvKgotCSAqIHN0YWNrIGRlZmluZWQgbG9jYXRpb246IHBvcCBpbmRleCwgcHVzaCBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfQ1RMX1NUS0RMIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgQ1RMIGNtZCAlZCIpLCBwdHJbLTFdKTsKLQlicmVhazsKLSAgfQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qCi0gKiBoYW5kbGUgY29tbWFuZCBmcm9tIFRJUiBzZWN0aW9uCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotdGlyX2NtZCAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCi17Ci0gIHN0cnVjdCB7Ci0gICAgaW50IG1pbmNvZDsKLSAgICBpbnQgbWF4Y29kOwotICAgIHVuc2lnbmVkIGNoYXIgKiAoKmV4cGxhaW4pKGJmZCAqLCB1bnNpZ25lZCBjaGFyICopOwotICB9IHRpcl90YWJsZVtdID0gewotICAgIHsgMCwJCSBUSVJfU19DX01BWFNUQUNPRCwgdGlyX3N0YSB9Ci0gICAseyBUSVJfU19DX01JTlNUT0NPRCwgVElSX1NfQ19NQVhTVE9DT0QsIHRpcl9zdG8gfQotICAgLHsgVElSX1NfQ19NSU5PUFJDT0QsIFRJUl9TX0NfTUFYT1BSQ09ELCB0aXJfb3ByIH0KLSAgICx7IFRJUl9TX0NfTUlOQ1RMQ09ELCBUSVJfU19DX01BWENUTENPRCwgdGlyX2N0bCB9Ci0gICAseyAtMSwgLTEsIE5VTEwgfQotICB9OwotICBpbnQgaSA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICJ0aXJfY21kICVkLyV4XG4iLCAqcHRyLCAqcHRyKTsKLSAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7Ci0jZW5kaWYKLQotICBpZiAoKnB0ciAmIDB4ODApCQkJCS8qIHN0b3JlIGltbWVkaWF0ZSAqLwotICAgIHsKLSAgICAgIGkgPSAxMjggLSAoKnB0cisrICYgMHg3Zik7Ci0gICAgICBpbWFnZV9kdW1wIChhYmZkLCBwdHIsIGksIDApOwotICAgICAgcHRyICs9IGk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKHRpcl90YWJsZVtpXS5taW5jb2QgPj0gMCkKLQl7Ci0JICBpZiAoICh0aXJfdGFibGVbaV0ubWluY29kIDw9ICpwdHIpIAotCSAgICAmJiAoKnB0ciA8PSB0aXJfdGFibGVbaV0ubWF4Y29kKSkKLQkgICAgewotCSAgICAgIHB0ciA9IHRpcl90YWJsZVtpXS5leHBsYWluIChhYmZkLCBwdHIpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpKys7Ci0JfQotICAgICAgaWYgKHRpcl90YWJsZVtpXS5taW5jb2QgPCAwKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT2JqIGNvZGUgJWQgbm90IGZvdW5kIiksICpwdHIpOwotCSAgcHRyID0gMDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0KLQotLyogaGFuZGxlIGNvbW1hbmQgZnJvbSBFVElSIHNlY3Rpb24gICovCi0KLXN0YXRpYyBpbnQKLWV0aXJfY21kIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIHN0YXRpYyBzdHJ1Y3QgewotICAgIGludCBtaW5jb2Q7Ci0gICAgaW50IG1heGNvZDsKLSAgICBib29sZWFuICgqZXhwbGFpbikgUEFSQU1TKChiZmQgKiwgaW50LCB1bnNpZ25lZCBjaGFyICopKTsKLSAgfSBldGlyX3RhYmxlW10gPSB7Ci0gICAgeyBFVElSX1NfQ19NSU5TVEFDT0QsIEVUSVJfU19DX01BWFNUQUNPRCwgZXRpcl9zdGEgfSwKLSAgICB7IEVUSVJfU19DX01JTlNUT0NPRCwgRVRJUl9TX0NfTUFYU1RPQ09ELCBldGlyX3N0byB9LAotICAgIHsgRVRJUl9TX0NfTUlOT1BSQ09ELCBFVElSX1NfQ19NQVhPUFJDT0QsIGV0aXJfb3ByIH0sCi0gICAgeyBFVElSX1NfQ19NSU5DVExDT0QsIEVUSVJfU19DX01BWENUTENPRCwgZXRpcl9jdGwgfSwKLSAgICB7IEVUSVJfU19DX01JTlNUQ0NPRCwgRVRJUl9TX0NfTUFYU1RDQ09ELCBldGlyX3N0YyB9LAotICAgIHsgLTEsIC0xLCBOVUxMIH0KLSAgfTsKLQotICBpbnQgaSA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICJldGlyX2NtZCAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHdoaWxlIChldGlyX3RhYmxlW2ldLm1pbmNvZCA+PSAwKQotICAgIHsKLSAgICAgIGlmICggKGV0aXJfdGFibGVbaV0ubWluY29kIDw9IGNtZCkgCi0JJiYgKGNtZCA8PSBldGlyX3RhYmxlW2ldLm1heGNvZCkpCi0JewotCSAgaWYgKCFldGlyX3RhYmxlW2ldLmV4cGxhaW4gKGFiZmQsIGNtZCwgcHRyKSkKLQkgICAgcmV0dXJuIC0xOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaSsrOwotICAgIH0KLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNCwgImV0aXJfY21kOiA9IDBcbiIpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFRleHQgSW5mb3JtYXRpb24gYW5kIFJlbG9jYXRpb24gUmVjb3JkcyAoT0JKJENfVElSKQotICAgaGFuZGxlIHRpciByZWNvcmQgICovCi0KLXN0YXRpYyBpbnQKLWFuYWx5emVfdGlyIChhYmZkLCBwdHIsIGxlbmd0aCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKm1heHB0cjsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMywgImFuYWx5emVfdGlyOiAlZCBieXRlc1xuIiwgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIG1heHB0ciA9IHB0ciArIGxlbmd0aDsKLQotICB3aGlsZSAocHRyIDwgbWF4cHRyKQotICAgIHsKLSAgICAgIHB0ciA9IHRpcl9jbWQgKGFiZmQsIHB0cik7Ci0gICAgICBpZiAocHRyID09IDApCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUZXh0IEluZm9ybWF0aW9uIGFuZCBSZWxvY2F0aW9uIFJlY29yZHMgKEVPQkokQ19FVElSKQotICAgaGFuZGxlIGV0aXIgcmVjb3JkICAqLwotCi1zdGF0aWMgaW50Ci1hbmFseXplX2V0aXIgKGFiZmQsIHB0ciwgbGVuZ3RoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICAgdW5zaWduZWQgaW50IGxlbmd0aDsKLXsKLSAgaW50IGNtZDsKLSAgdW5zaWduZWQgY2hhciAqbWF4cHRyOwotICBpbnQgcmVzdWx0ID0gMDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMywgImFuYWx5emVfZXRpcjogJWQgYnl0ZXNcbiIsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICBtYXhwdHIgPSBwdHIgKyBsZW5ndGg7Ci0KLSAgd2hpbGUgKHB0ciA8IG1heHB0cikKLSAgICB7Ci0gICAgICBjbWQgPSBiZmRfZ2V0bDE2IChwdHIpOwotICAgICAgbGVuZ3RoID0gYmZkX2dldGwxNiAocHRyICsgMik7Ci0gICAgICByZXN1bHQgPSBldGlyX2NtZCAoYWJmZCwgY21kLCBwdHIrNCk7Ci0gICAgICBpZiAocmVzdWx0ICE9IDApCi0JYnJlYWs7Ci0gICAgICBwdHIgKz0gbGVuZ3RoOwotICAgIH0KLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMywgImFuYWx5emVfZXRpcjogPSAlZFxuIiwgcmVzdWx0KTsKLSNlbmRpZgotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogcHJvY2VzcyBFVElSIHJlY29yZAotICAKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX3RpciAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSAgaW50IHJlc3VsdDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgIlRJUi9FVElSXG4iKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAob2JqdHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIEVPQkpfU19DX0VUSVI6Ci0JUFJJVih2bXNfcmVjKSArPSA0OwkvKiBza2lwIHR5cGUsIHNpemUgKi8KLQlQUklWKHJlY19zaXplKSAtPSA0OwotCXJlc3VsdCA9IGFuYWx5emVfZXRpciAoYWJmZCwgUFJJVih2bXNfcmVjKSwgUFJJVihyZWNfc2l6ZSkpOwotCWJyZWFrOwotICAgICAgY2FzZSBPQkpfU19DX1RJUjoKLQlQUklWKHZtc19yZWMpICs9IDE7CS8qIHNraXAgdHlwZSAqLwotCVBSSVYocmVjX3NpemUpIC09IDE7Ci0JcmVzdWx0ID0gYW5hbHl6ZV90aXIgKGFiZmQsIFBSSVYodm1zX3JlYyksIFBSSVYocmVjX3NpemUpKTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JcmVzdWx0ID0gLTE7Ci0JYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogcHJvY2VzcyBFREJHIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSAgCi0gICBub3QgaW1wbGVtZW50ZWQgeWV0ICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2RiZyAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgIkRCRy9FREJHXG4iKTsKLSNlbmRpZgotCi0gIGFiZmQtPmZsYWdzIHw9IChIQVNfREVCVUcgfCBIQVNfTElORU5PKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogcHJvY2VzcyBFVEJUIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSAgCi0gICBub3QgaW1wbGVtZW50ZWQgeWV0ICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX3RidCAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBvYmp0eXBlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICgyLCAiVEJUL0VUQlRcbiIpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogcHJvY2VzcyBMTksgcmVjb3JkCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgotICAKLSAgIG5vdCBpbXBsZW1lbnRlZCB5ZXQgICovCi0KLWludAotX2JmZF92bXNfc2x1cnBfbG5rIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG9ianR5cGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJMTktcbiIpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoJCQkJCQkJCQkqLwotLyoJV1JJVEUgRVRJUiBTRUNUSU9OCQkJCQkJKi8KLS8qCQkJCQkJCQkJKi8KLS8qCXRoaXMgaXMgc3RpbGwgdW5kZXIgY29uc3RydWN0aW9uIGFuZCB0aGVyZWZvcmUgbm90IGRvY3VtZW50ZWQJKi8KLS8qCQkJCQkJCQkJKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIHN0YXJ0X2V0aXJfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IGluZGV4LCB1cXVhZCBvZmZzZXQsIGJvb2xlYW4ganVzdG9mZnNldCkpOwotc3RhdGljIHZvaWQgc3RvX2ltbSBQQVJBTVMgKChiZmQgKmFiZmQsIHZtc19zZWN0aW9uICpzcHRyLCBiZmRfdm1hIHZhZGRyLCBpbnQgaW5kZXgpKTsKLXN0YXRpYyB2b2lkIGVuZF9ldGlyX3JlY29yZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIHZvaWQKLXN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICB2bXNfc2VjdGlvbiAqc3B0cjsKLSAgICAgYmZkX3ZtYSB2YWRkcjsKLSAgICAgaW50IGluZGV4OwotewotICBpbnQgc2l6ZTsKLSAgaW50IHNzaXplOwotICB1bnNpZ25lZCBjaGFyICpjcHRyOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg4LCAic3RvX2ltbSAlZCBieXRlc1xuIiwgc3B0ci0+c2l6ZSk7Ci0gIF9iZmRfaGV4ZHVtcCAoOSwgc3B0ci0+Y29udGVudHMsIChpbnQpc3B0ci0+c2l6ZSwgKGludCl2YWRkcik7Ci0jZW5kaWYKLQotICBzc2l6ZSA9IHNwdHItPnNpemU7Ci0gIGNwdHIgPSBzcHRyLT5jb250ZW50czsKLQotICB3aGlsZSAoc3NpemUgPiAwKQotICAgIHsKLQotICAgICAgc2l6ZSA9IHNzaXplOwkJCQkvKiB0cnkgYWxsIHRoZSByZXN0ICovCi0KLSAgICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIHNpemUpIDwgMCkKLQl7CQkJCQkvKiBkb2Vzbid0IGZpdCwgc3BsaXQgISAqLwotCSAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBpbmRleCwgdmFkZHIsIGZhbHNlKTsKLQkgIHNpemUgPSBfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDApOwkvKiBnZXQgbWF4IHNpemUgKi8KLQkgIGlmIChzaXplID4gc3NpemUpCQkJLyogbW9yZSB0aGFuIHdoYXQncyBsZWZ0ID8gKi8KLQkgICAgc2l6ZSA9IHNzaXplOwotCX0KLQotICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFVElSX1NfQ19TVE9fSU1NLCAtMSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKHNpemUpKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCBjcHRyLCBzaXplKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgICAgIF9iZmRfdm1zX2RlYnVnICgxMCwgImR1bXBlZCAlZCBieXRlc1xuIiwgc2l6ZSk7Ci0gICAgICBfYmZkX2hleGR1bXAgKDEwLCBjcHRyLCAoaW50KXNpemUsIChpbnQpdmFkZHIpOwotI2VuZGlmCi0KLSAgICAgIHZhZGRyICs9IHNpemU7Ci0gICAgICBzc2l6ZSAtPSBzaXplOwotICAgICAgY3B0ciArPSBzaXplOwotICAgIH0KLQotICByZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHN0YXJ0IEVUSVIgcmVjb3JkIGZvciBzZWN0aW9uICNpbmRleCBhdCB2aXJ0dWFsIGFkZHIgb2Zmc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBpbmRleCwgb2Zmc2V0LCBqdXN0b2Zmc2V0KQotICAgIGJmZCAqYWJmZDsKLSAgICBpbnQgaW5kZXg7Ci0gICAgdXF1YWQgb2Zmc2V0OwotICAgIGJvb2xlYW4ganVzdG9mZnNldDsKLXsKLSAgaWYgKCFqdXN0b2Zmc2V0KQotICAgIHsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRVRJUiwgLTEpOwkvKiBvbmUgRVRJUiBwZXIgc2VjdGlvbiAqLwotICAgICAgX2JmZF92bXNfb3V0cHV0X3B1c2ggKGFiZmQpOwotICAgIH0KLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVUSVJfU19DX1NUQV9QUSwgLTEpOwkvKiBwdXNoIHN0YXJ0IG9mZnNldCAqLwotICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpaW5kZXgpOwotICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgKHVxdWFkKW9mZnNldCk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFVElSX1NfQ19DVExfU0VUUkIsIC0xKTsJLyogc3RhcnQgPSBwb3AgKCkgKi8KLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogZW5kIGV0aXIgcmVjb3JkICAqLwotc3RhdGljIHZvaWQKLWVuZF9ldGlyX3JlY29yZCAoYWJmZCkKLSAgICBiZmQgKmFiZmQ7Ci17Ci0gIF9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpOwotICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsgCi19Ci0KLS8qIHdyaXRlIHNlY3Rpb24gY29udGVudHMgZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX3RpciAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgdm1zX3NlY3Rpb24gKnNwdHI7Ci0gIGludCBuZXh0b2Zmc2V0OwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX3RpciAoJXAsICVkKVxuIiwgYWJmZCwgb2JqdHlwZSk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCA0KTsKLQotICBuZXh0b2Zmc2V0ID0gMDsKLSAgUFJJVih2bXNfbGlua2FnZV9pbmRleCkgPSAxOwotCi0gIC8qIGR1bXAgYWxsIG90aGVyIHNlY3Rpb25zICAqLwotCi0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQotICB3aGlsZSAoc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLQotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDQsICJ3cml0aW5nICVkLiBzZWN0aW9uICclcycgKCVkIGJ5dGVzKVxuIiwgc2VjdGlvbi0+aW5kZXgsIHNlY3Rpb24tPm5hbWUsIChpbnQpKHNlY3Rpb24tPl9yYXdfc2l6ZSkpOw0KLSNlbmRpZgotCi0gICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpCi0JewotCSAgaW50IGk7Ci0KLQkgIGlmICgoaSA9IHNlY3Rpb24tPnJlbG9jX2NvdW50KSA8PSAwKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTRUNfUkVMT0Mgd2l0aCBubyByZWxvY3MgaW4gc2VjdGlvbiAlcyIpLAotCQkJCSAgICAgc2VjdGlvbi0+bmFtZSk7Ci0JICAgIH0KLSNpZiBWTVNfREVCVUcKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKipycHRyOwotCSAgICAgIF9iZmRfdm1zX2RlYnVnICg0LCAiJWQgcmVsb2NhdGlvbnM6XG4iLCBpKTsKLQkgICAgICBycHRyID0gc2VjdGlvbi0+b3JlbG9jYXRpb247Ci0JICAgICAgd2hpbGUgKGktLSA+IDApCi0JCXsKLQkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgInN5bSAlcyBpbiBzZWMgJXMsIHZhbHVlICUwOGx4LCBhZGRyICUwOGx4LCBvZmYgJTA4bHgsIGxlbiAlZDogJXNcbiIsCi0JCQkgICAgICAoKigqcnB0ciktPnN5bV9wdHJfcHRyKS0+bmFtZSwKLQkJCSAgICAgICgqKCpycHRyKS0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uLT5uYW1lLAotCQkJICAgICAgKGxvbmcpKCooKnJwdHIpLT5zeW1fcHRyX3B0ciktPnZhbHVlLAotCQkJICAgICAgKCpycHRyKS0+YWRkcmVzcywgKCpycHRyKS0+YWRkZW5kLAotCQkJICAgICAgYmZkX2dldF9yZWxvY19zaXplKCgqcnB0ciktPmhvd3RvKSwKLQkJCSAgICAgICgqcnB0ciktPmhvd3RvLT5uYW1lKTsKLQkJICBycHRyKys7Ci0JCX0KLQkgICAgfQotI2VuZGlmCi0JfQotCi0gICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykKLQkmJiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKSkKLQl7Ci0JICBiZmRfdm1hIHZhZGRyOwkJLyogdmlydHVhbCBhZGRyIGluIHNlY3Rpb24gKi8KLQotCSAgc3B0ciA9IF9iZmRfZ2V0X3Ztc19zZWN0aW9uIChhYmZkLCBzZWN0aW9uLT5pbmRleCk7Ci0JICBpZiAoc3B0ciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2NvbnRlbnRzKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQotCSAgdmFkZHIgPSAoYmZkX3ZtYSkoc3B0ci0+b2Zmc2V0KTsKLQotCSAgc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsIHNlY3Rpb24tPmluZGV4LCAodXF1YWQpIHNwdHItPm9mZnNldCwKLQkJCSAgICAgZmFsc2UpOwotCi0JICB3aGlsZSAoc3B0ciAhPSBOVUxMKQkJCQkvKiBvbmUgU1RBX1BRLCBDVExfU0VUUkIgcGVyIHZtc19zZWN0aW9uICovCi0JICAgIHsKLQotCSAgICAgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykJCQkvKiBjaGVjayBmb3IgcmVsb2NzICovCi0JCXsKLQkJICBhcmVsZW50ICoqcnB0ciA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCQkgIGludCBpID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JCSAgZm9yICg7OykKLQkJICAgIHsKLQkJICAgICAgYmZkX3NpemVfdHlwZSBhZGRyID0gKCpycHRyKS0+YWRkcmVzczsKLQkJICAgICAgYmZkX3NpemVfdHlwZSBsZW4gPSBiZmRfZ2V0X3JlbG9jX3NpemUgKCgqcnB0ciktPmhvd3RvKTsKLQkJICAgICAgaWYgKHNwdHItPm9mZnNldCA8IGFkZHIpCQkvKiBzcHRyIHN0YXJ0cyBiZWZvcmUgcmVsb2MgKi8KLQkJCXsKLQkJCSAgYmZkX3NpemVfdHlwZSBiZWZvcmUgPSBhZGRyIC0gc3B0ci0+b2Zmc2V0OwotCQkJICBpZiAoc3B0ci0+c2l6ZSA8PSBiZWZvcmUpCQkvKiBjb21wbGV0ZSBiZWZvcmUgKi8KLQkJCSAgICB7Ci0JCQkgICAgICBzdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgc2VjdGlvbi0+aW5kZXgpOwotCQkJICAgICAgdmFkZHIgKz0gc3B0ci0+c2l6ZTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCSAgZWxzZQkJCQkvKiBwYXJ0bHkgYmVmb3JlICovCi0JCQkgICAgewotCQkJICAgICAgaW50IGFmdGVyID0gc3B0ci0+c2l6ZSAtIGJlZm9yZTsKLQkJCSAgICAgIHNwdHItPnNpemUgPSBiZWZvcmU7Ci0JCQkgICAgICBzdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgc2VjdGlvbi0+aW5kZXgpOwotCQkJICAgICAgdmFkZHIgKz0gc3B0ci0+c2l6ZTsKLQkJCSAgICAgIHNwdHItPmNvbnRlbnRzICs9IGJlZm9yZTsKLQkJCSAgICAgIHNwdHItPm9mZnNldCArPSBiZWZvcmU7Ci0JCQkgICAgICBzcHRyLT5zaXplID0gYWZ0ZXI7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlIGlmIChzcHRyLT5vZmZzZXQgPT0gYWRkcikJLyogc3B0ciBzdGFydHMgYXQgcmVsb2MgKi8KLQkJCXsKLQkJCSAgYXN5bWJvbCAqc3ltID0gKigqcnB0ciktPnN5bV9wdHJfcHRyOwotCQkJICBhc2VjdGlvbiAqc2VjID0gc3ltLT5zZWN0aW9uOwotCi0JCQkgIHN3aXRjaCAoKCpycHRyKS0+aG93dG8tPnR5cGUpCi0JCQkgICAgewotCQkJICAgIGNhc2UgQUxQSEFfUl9JR05PUkU6Ci0JCQkgICAgICBicmVhazsKLQotCQkJICAgIGNhc2UgQUxQSEFfUl9SRUZMT05HOgotCQkJICAgICAgewotCQkJCWlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsCi0JCQkJCQkJCXN0cmxlbigoY2hhciAqKXN5bS0+bmFtZSkpCi0JCQkJCTwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19HQkxfTFcsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsCi0JCQkJCQkJICAgICAgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJCWVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMTYpIDwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUQV9MVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKLQkJCQkJCQkgICAodXF1YWQpc3ltLT52YWx1ZSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX0xXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkJZWxzZQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCAzMikgPCAwKQotCQkJCSAgICAgIHsKLQkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RBX1BRLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAotCQkJCQkJCSAgICh1bnNpZ25lZCBsb25nKShzZWMtPmluZGV4KSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLAotCQkJCQkJCSAgICgodXF1YWQpKCpycHRyKS0+YWRkZW5kCi0JCQkJCQkJICAgICsgKHVxdWFkKXN5bS0+dmFsdWUpKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fTFcsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgIH0KLQkJCSAgICAgIH0KLQkJCSAgICAgIGJyZWFrOwotCi0JCQkgICAgY2FzZSBBTFBIQV9SX1JFRlFVQUQ6Ci0JCQkgICAgICB7Ci0JCQkJaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwKLQkJCQkJCQkJc3RybGVuKChjaGFyICopc3ltLT5uYW1lKSkKLQkJCQkJPCAwKQotCQkJCSAgICAgIHsKLQkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX0dCTCwKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwKLQkJCQkJCQkgICAgICBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bS0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkJZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCAxNikgPCAwKQotCQkJCSAgICAgIHsKLQkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RBX1FXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLAotCQkJCQkJCSAgICh1cXVhZClzeW0tPnZhbHVlKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fUVcsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgIH0KLQkJCQllbHNlCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDMyKSA8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVEFfUFEsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCi0JCQkJCQkJICAgKHVuc2lnbmVkIGxvbmcpKHNlYy0+aW5kZXgpKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCi0JCQkJCQkJICAgKCh1cXVhZCkoKnJwdHIpLT5hZGRlbmQKLQkJCQkJCQkgICAgKyAodXF1YWQpc3ltLT52YWx1ZSkpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19PRkYsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgIH0KLQkJCSAgICAgIH0KLQkJCSAgICAgIGJyZWFrOwotCi0JCQkgICAgY2FzZSBBTFBIQV9SX0hJTlQ6Ci0JCQkgICAgICB7Ci0JCQkJaW50IGhpbnRfc2l6ZTsKLQotCQkJCWhpbnRfc2l6ZSA9IHNwdHItPnNpemU7Ci0JCQkJc3B0ci0+c2l6ZSA9IGxlbjsKLQkJCQlzdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgc2VjdGlvbi0+aW5kZXgpOwotCQkJCXNwdHItPnNpemUgPSBoaW50X3NpemU7Ci0jaWYgMAotCQkJCXZtc19vdXRwdXRfYmVnaW4oYWJmZCwgRVRJUl9TX0NfU1RPX0hJTlRfR0JMLCAtMSk7Ci0JCQkJdm1zX291dHB1dF9sb25nKGFiZmQsICh1bnNpZ25lZCBsb25nKShzZWMtPmluZGV4KSk7Ci0JCQkJdm1zX291dHB1dF9xdWFkKGFiZmQsICh1cXVhZClhZGRyKTsKLQotCQkJCXZtc19vdXRwdXRfY291bnRlZChhYmZkLCBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bS0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7Ci0JCQkJdm1zX291dHB1dF9mbHVzaChhYmZkKTsKLSNlbmRpZgotCQkJICAgICAgfQotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSBBTFBIQV9SX0xJTktBR0U6Ci0JCQkgICAgICB7Ci0JCQkJaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgNjQpIDwgMCkKLQkJCQkgIHsKLQkJCQkgICAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkgICAgc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJICAgICAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICB9Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCUVUSVJfU19DX1NUQ19MUF9QU0IsCi0JCQkJCQkJLTEpOwotCQkJCV9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAotCQkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKVBSSVYodm1zX2xpbmthZ2VfaW5kZXgpKTsKLQkJCQlQUklWKHZtc19saW5rYWdlX2luZGV4KSArPSAyOwotCQkJCV9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLAotCQkJCQkJCSAgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCQkJCV9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsKLQkJCQlfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJICAgICAgfQotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBjYXNlIEFMUEhBX1JfQ09ERUFERFI6Ci0JCQkgICAgICB7Ci0JCQkJaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwKLQkJCQkJCQkgICAgc3RybGVuKChjaGFyICopc3ltLT5uYW1lKSkKLQkJCQkgICAgPCAwKQotCQkJCSAgewotCQkJCSAgICBlbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCSAgICBzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCSAgICAgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCSAgICAgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgfQotCQkJCV9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQlFVElSX1NfQ19TVE9fQ0EsCi0JCQkJCQkJLTEpOwotCQkJCV9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLAotCQkJCQkJCSAgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOwotCQkJCV9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkgICAgICB9Ci0JCQkgICAgICBicmVhazsKLQotCQkJICAgIGRlZmF1bHQ6Ci0JCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlVuaGFuZGxlZCByZWxvY2F0aW9uICVzIiksCi0JCQkJCQkgICAgICgqcnB0ciktPmhvd3RvLT5uYW1lKTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQotCQkJICB2YWRkciArPSBsZW47Ci0KLQkJCSAgaWYgKGxlbiA9PSBzcHRyLT5zaXplKQotCQkJICAgIHsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIHNwdHItPmNvbnRlbnRzICs9IGxlbjsKLQkJCSAgICAgIHNwdHItPm9mZnNldCArPSBsZW47Ci0JCQkgICAgICBzcHRyLT5zaXplIC09IGxlbjsKLQkJCSAgICAgIGktLTsKLQkJCSAgICAgIHJwdHIrKzsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UJCQkJCS8qIHNwdHIgc3RhcnRzIGFmdGVyIHJlbG9jICovCi0JCQl7Ci0JCQkgIGktLTsJCQkJLyogY2hlY2sgbmV4dCByZWxvYyAqLwotCQkJICBycHRyKys7Ci0JCQl9Ci0KLQkJICAgICAgaWYgKGk9PTApCQkJCS8qIGFsbCByZWxvYyBjaGVja2VkICovCi0JCQl7Ci0JCQkgIGlmIChzcHRyLT5zaXplID4gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBzdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgc2VjdGlvbi0+aW5kZXgpOwkvKiBkdW1wIHJlc3QgKi8KLQkJCSAgICAgIHZhZGRyICs9IHNwdHItPnNpemU7Ci0JCQkgICAgfQotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0gLyogZm9yICg7OykgKi8KLQkJfSAvKiBpZiBTRUNfUkVMT0MgKi8KLQkgICAgICBlbHNlCQkJCQkJLyogbm8gcmVsb2NzLCBqdXN0IGR1bXAgKi8KLQkJewotCQkgIHN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBzZWN0aW9uLT5pbmRleCk7Ci0JCSAgdmFkZHIgKz0gc3B0ci0+c2l6ZTsKLQkJfQotCi0JICAgICAgc3B0ciA9IHNwdHItPm5leHQ7Ci0KLQkgICAgfSAvKiB3aGlsZSAoc3B0ciAhPSAwKSAqLwotCi0JICBlbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCi0JfSAvKiBoYXNfY29udGVudHMgKi8KLQotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0gICAgfQotCi0gIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQoYWJmZCwgMik7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIHdyaXRlIHRyYWNlYmFjayBkYXRhIGZvciBiZmQgYWJmZCAgKi8KLQotaW50Ci1fYmZkX3Ztc193cml0ZV90YnQgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgb2JqdHlwZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgInZtc193cml0ZV90YnQgKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogd3JpdGUgZGVidWcgaW5mbyBmb3IgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfZGJnIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG9ianR5cGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfZGJnICglcCwgb2JqdHlwZSlcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvdm1zLmMgYi9iZmQvdm1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZWE2M2YuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0NiArMCwwIEBACi0vKiB2bXMuYyAtLSBCRkQgYmFjay1lbmQgZm9yIFZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAidm1zLmgiCi0KLXN0YXRpYyBib29sZWFuIHZtc19pbml0aWFsaXplIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHByaXZfc2VjdGlvbl9jb3VudDsKLXN0YXRpYyBib29sZWFuIGZpbGxfc2VjdGlvbl9wdHIgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gdm1zX2ZpeHVwX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb3B5X3N5bWJvbHMgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZWxvY19uaWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnZtc19vYmplY3RfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqdm1zX2FyY2hpdmVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19ta29iamVjdCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc193cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfY2xvc2VfYW5kX2NsZWFudXAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfbmV3X3NlY3Rpb25faG9vayBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIHgxLCBmaWxlX3B0ciB4MiwKLQkgICBiZmRfc2l6ZV90eXBlIHgzKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIGJmZF93aW5kb3cgKncsIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKnNyYywgYmZkICpkZXN0KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSAgUEFSQU1TICgoYmZkICpzcmNiZmQsIGFzZWN0aW9uICpzcmNzZWMsIGJmZCAqZHN0YmZkLCBhc2VjdGlvbiAqZHN0c2VjKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotICBQQVJBTVMgKChiZmQgKmliZmQsIGFzeW1ib2wgKmlzeW0sIGJmZCAqb2JmZCwgYXN5bWJvbCAqb3N5bSkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm9pZCAqZmlsZSkpOwotc3RhdGljIGNoYXIgKnZtc19jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGludCB2bXNfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZCAqYmJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICoqdGFibG9jLCBiZmRfc2l6ZV90eXBlICp0YWJsZW4sCi0JICAgY29uc3QgY2hhciAqKm5hbWUpKTsKLXN0YXRpYyB2b2lkIHZtc190cnVuY2F0ZV9hcm5hbWUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpwYXRobmFtZSwgY2hhciAqYXJoZHIpKTsKLXN0YXRpYyBib29sZWFuIHZtc193cml0ZV9hcm1hcAotICBQQVJBTVMgKChiZmQgKmFyY2gsIHVuc2lnbmVkIGludCBlbGVuZ3RoLCBzdHJ1Y3Qgb3JsICptYXAsCi0JICAgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOwotc3RhdGljIFBUUiB2bXNfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYmZkICp2bXNfZ2V0X2VsdF9hdF9pbmRleCBQQVJBTVMgKChiZmQgKmFiZmQsIHN5bWluZGV4IGluZGV4KSk7Ci1zdGF0aWMgYmZkICp2bXNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqYXJjaCwgYmZkICpwcmV2KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBpbnQgdm1zX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBzdGF0ICpzdGF0KSk7Ci1zdGF0aWMgbG9uZyB2bXNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBsb25nIHZtc19nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLXN0YXRpYyB2b2lkIHZtc19wcmludF9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgZmlsZSwgYXN5bWJvbCAqc3ltYm9sLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93KSk7Ci1zdGF0aWMgdm9pZCB2bXNfZ2V0X3N5bWJvbF9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqc3ltYm9sLCBzeW1ib2xfaW5mbyAqcmV0KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICphYmZkLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBhbGVudCAqdm1zX2dldF9saW5lbm8gUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICpzeW1ib2wpKTsKLXN0YXRpYyBib29sZWFuIHZtc19maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBhc3ltYm9sICoqc3ltYm9scywgYmZkX3ZtYSBvZmZzZXQsCi0JICAgY29uc3QgY2hhciAqKmZpbGUsIGNvbnN0IGNoYXIgKipmdW5jLCB1bnNpZ25lZCBpbnQgKmxpbmUpKTsKLXN0YXRpYyBhc3ltYm9sICp2bXNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIHNpemUpKTsKLXN0YXRpYyBsb25nIHZtc19yZWFkX21pbmlzeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYm9vbGVhbiBkeW5hbWljLCBQVFIgKm1pbmlzeW1zcCwgdW5zaWduZWQgaW50ICpzaXplcCkpOwotc3RhdGljIGFzeW1ib2wgKnZtc19taW5pc3ltYm9sX3RvX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gZHluYW1pYywgY29uc3QgUFRSIG1pbmlzeW0sIGFzeW1ib2wgKnN5bSkpOwotc3RhdGljIGxvbmcgdm1zX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0KSk7Ci1zdGF0aWMgbG9uZyB2bXNfY2Fub25pY2FsaXplX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNyY3NlYywgYXJlbGVudCAqKmxvY2F0aW9uLAotCSAgIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqdm1zX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfc2V0X2FyY2hfbWFjaAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLCB1bnNpZ25lZCBsb25nIG1hY2gpKTsKLXN0YXRpYyBib29sZWFuIHZtc19zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1zdGF0aWMgaW50IHZtc19zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gcmVsb2MpKTsKLXN0YXRpYyBiZmRfYnl0ZSAqdm1zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwgYmZkX2J5dGUgKmRhdGEsCi0JICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLQkgICBib29sZWFuICphZ2FpbikpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9nY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqdm1zX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbikpOwotc3RhdGljIGxvbmcgdm1zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBsb25nIHZtc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGxvbmcgdm1zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGxvbmcgdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqKmFyZWwsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBiZmQgKm9iZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncykpOwotCi0jZGVmaW5lIHZtc19tYWtlX2VtcHR5X3N5bWJvbCBfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbAotDAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1jb25zdCBiZmRfdGFyZ2V0IHZtc19hbHBoYV92ZWMgPQotewotICAidm1zLWFscGhhIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgSEFTX1NZTVMKLSAgIHwgV1BfVEVYVCB8IERfUEFHRUQpLAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0gICB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKLSAgIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkpLAkJLyogc2VjdCBmbGFncyAqLwotICAwLAkJCQkvKiBzeW1ib2xfbGVhZGluZ19jaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCB2bXNfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICB2bXNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIHZtc19ta29iamVjdCwJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgdm1zX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAodm1zKSwKLQotICBOVUxMLAotICAKLSAgKFBUUikgMAotfTsKLQotY29uc3QgYmZkX3RhcmdldCB2bXNfdmF4X3ZlYyA9Ci17Ci0gICJ2bXMtdmF4IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfb3ZheF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgSEFTX1NZTVMgCS8qIG9iamVjdCBmbGFncyAqLwotICAgfCBXUF9URVhUIHwgRF9QQUdFRAotICAgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX0xPQ0FMUyksCi0KLSAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0gICB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKLSAgIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkpLAkJLyogc2VjdCBmbGFncyAqLwotICAwLAkJCQkvKiBzeW1ib2xfbGVhZGluZ19jaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgdm1zX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgdm1zX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCB2bXNfbWtvYmplY3QsCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIHZtc193cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKHZtcyksCi0KLSAgTlVMTCwKLSAgCi0gIChQVFIpIDAKLX07Ci0MCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qIEluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2luaXRpYWxpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKGFiZmQtPnRkYXRhLmFueSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCwgKGJmZF92bWEpLTEpOwotCi0gIGFiZmQtPnRkYXRhLmFueSA9ICgoc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0KikKLQkJICAgICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmFueSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotI2lmZGVmIF9fQUxQSEEKLSAgUFJJVihpc192YXgpID0gMDsKLSNlbHNlCi0gIFBSSVYoaXNfdmF4KSA9IDE7Ci0jZW5kaWYKLSAgUFJJVih2bXNfYnVmKSA9IDA7Ci0gIFBSSVYoYnVmX3NpemUpID0gMDsKLSAgUFJJVihyZWNfbGVuZ3RoKSA9IDA7Ci0gIFBSSVYoZmlsZV9mb3JtYXQpID0gRkZfVU5LTk9XTjsKLSAgUFJJVihmaXh1cF9kb25lKSA9IGZhbHNlOwotICBQUklWKHNlY3Rpb25zKSA9IE5VTEw7Ci0KLSAgUFJJVihzdGFjaykgPSAoKHN0cnVjdCBzdGFja19zdHJ1Y3QgKikKLQkJIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0YWNrX3N0cnVjdCkgKiBTVEFDS1NJWkUpKTsKLSAgaWYgKFBSSVYoc3RhY2spID09IDApCi0gICAgewotICAgICB2bXNfaW5pdF9ub19tZW0xOgotICAgICAgZnJlZSAoYWJmZC0+dGRhdGEuYW55KTsKLSAgICAgIGFiZmQtPnRkYXRhLmFueSA9IDA7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBQUklWKHN0YWNrcHRyKSA9IDA7Ci0KLSAgUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9ICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopCi0JCQkgICAgIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX3RhYmxlKSkpOwotICBpZiAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9PSAwKQotICAgIHsKLSAgICAgdm1zX2luaXRfbm9fbWVtMjoKLSAgICAgIGZyZWUgKFBSSVYoc3RhY2spKTsKLSAgICAgIFBSSVYoc3RhY2spID0gMDsKLSAgICAgIGdvdG8gdm1zX2luaXRfbm9fbWVtMTsKLSAgICB9Ci0KLSAgaWYgKCFiZmRfaGFzaF90YWJsZV9pbml0IChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBfYmZkX3Ztc19oYXNoX25ld2Z1bmMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBQUklWKGxvY2F0aW9uX3N0YWNrKSA9ICgoc3RydWN0IGxvY2F0aW9uX3N0cnVjdCAqKQotCQkJICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsb2NhdGlvbl9zdHJ1Y3QpCi0JCQkJICAgICAgKiBMT0NBVElPTl9TQVZFX1NJWkUpKTsKLSAgaWYgKFBSSVYobG9jYXRpb25fc3RhY2spID09IDApCi0gICAgewotICAgICB2bXNfaW5pdF9ub19tZW0zOgotICAgICAgZnJlZSAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSk7Ci0gICAgICBQUklWKHZtc19zeW1ib2xfdGFibGUpID0gMDsKLSAgICAgIGdvdG8gdm1zX2luaXRfbm9fbWVtMjsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IFZNU19TRUNUSU9OX0NPVU5UOyBpKyspCi0gICAgUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbaV0gPSBOVUxMOwotCi0gIFBSSVYob3V0cHV0X2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKE1BWF9PVVRSRUNfU0laRSk7Ci0gIGlmIChQUklWKG91dHB1dF9idWYpID09IDApCi0gICAgewotICAgICAgZnJlZSAoUFJJVihsb2NhdGlvbl9zdGFjaykpOwotICAgICAgUFJJVihsb2NhdGlvbl9zdGFjaykgPSAwOwotICAgICAgZ290byB2bXNfaW5pdF9ub19tZW0zOwotICAgIH0KLSAgUFJJVihwdXNoX2xldmVsKSA9IDA7Ci0gIFBSSVYocHVzaGVkX3NpemUpID0gMDsKLSAgUFJJVihsZW5ndGhfcG9zKSA9IDI7Ci0gIFBSSVYob3V0cHV0X3NpemUpID0gMDsKLSAgUFJJVihvdXRwdXRfYWxpZ25tZW50KSA9IDE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogRmlsbCBzeW1ib2wtPnNlY3Rpb24gd2l0aCBzZWN0aW9uIHB0cgotICAgc3ltYm9sLT5zZWN0aW9uIGlzIGZpbGxlZCB3aXRoIHRoZSBzZWN0aW9uIGluZGV4IGZvciBkZWZpbmVkIHN5bWJvbHMKLSAgIGR1cmluZyByZWFkaW5nIHRoZSBHU0QvRUdTRCBzZWN0aW9uLiBCdXQgd2UgbmVlZCB0aGUgcG9pbnRlciB0byB0aGUKLSAgIGJmZCBzZWN0aW9uIGxhdGVyLgotCi0gICBJdCBoYXMgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHJlZmVyZW5jZWQgKHVuZGVmaW5lZCBzZWN0aW9uKSBzeW1ib2xzCi0KLSAgIGNhbGxlZCBmcm9tIGJmZF9oYXNoX3RyYXZlcnNlIGluIHZtc19maXh1cF9zZWN0aW9ucyAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWZpbGxfc2VjdGlvbl9wdHIgKGVudHJ5LCBzZWN0aW9ucykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgUFRSIHNlY3Rpb25zOwotewotICBhc2VjdGlvbiAqc2VjOwotICBhc3ltYm9sICpzeW07Ci0KLSAgc3ltID0gICgodm1zX3N5bWJvbF9lbnRyeSAqKWVudHJ5KS0+c3ltYm9sOwotICBzZWMgPSBzeW0tPnNlY3Rpb247Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiZmlsbF9zZWN0aW9uX3B0cjogc3ltICVwLCBzZWMgJXBcbiIsIHN5bSwgc2VjKTsKLSNlbmRpZgotCi0gIC8qIGZpbGwgZm9yd2FyZCByZWZlcmVuY2VzICh0aGVzZSBjb250YWluIHNlY3Rpb24gbnVtYmVyLCBub3Qgc2VjdGlvbiBwdHIpLiAgKi8KLQotICBpZiAoKHVuc2lnbmVkIGludCkgc2VjIDwgcHJpdl9zZWN0aW9uX2NvdW50KQotICAgIHsKLSAgICAgIHNlYyA9ICgodm1zX3N5bWJvbF9lbnRyeSAqKWVudHJ5KS0+c3ltYm9sLT5zZWN0aW9uID0KLQkoKGFzZWN0aW9uICoqKXNlY3Rpb25zKVsoaW50KXNlY107Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKHN5bS0+bmFtZSwgc2VjLT5uYW1lKSA9PSAwKQotICAgIHN5bS0+ZmxhZ3MgfD0gQlNGX1NFQ1RJT05fU1lNOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEZpeHVwIHNlY3Rpb25zCi0gICBzZXQgdXAgYWxsIHBvaW50ZXJzIGFuZCBhcnJheXMsIGNvdW50ZXJzIGFuZCBzaXplcyBhcmUgZml4ZWQgbm93Ci0KLSAgIHdlIGJ1aWxkIGEgcHJpdmF0ZSBzZWN0aW9ucyB2ZWN0b3IgZm9yIGVhc3kgYWNjZXNzIHNpbmNlIHNlY3Rpb25zCi0gICBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgYnkgYW4gaW5kZXggbnVtYmVyLgotCi0gICBhbGxvYyBQUklWKHNlY3Rpb25zKSBhY2NvcmRpbmcgdG8gYWJmZC0+c2VjdGlvbl9jb3VudAotCWNvcHkgYWJmZC0+c2VjdGlvbnMgdG8gUFJJVihzZWN0aW9ucykgICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZml4dXBfc2VjdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKFBSSVYoZml4dXBfZG9uZSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyoKLSAgICogdHJhdmVyc2Ugc3ltYm9sIHRhYmxlIGFuZCBmaWxsIGluIGFsbCBzZWN0aW9uIHBvaW50ZXJzCi0gICAqLwotCi0gIC8qIGNhbid0IHByb3ZpZGUgc2VjdGlvbiBjb3VudCBhcyBhcmd1bWVudCB0byBmaWxsX3NlY3Rpb25fcHRyKCkuICAqLwotICBwcml2X3NlY3Rpb25fY291bnQgPSBQUklWKHNlY3Rpb25fY291bnQpOwotICBiZmRfaGFzaF90cmF2ZXJzZSAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgZmlsbF9zZWN0aW9uX3B0ciwKLQkJICAgIChQVFIpKFBSSVYoc2VjdGlvbnMpKSk7Ci0KLSAgUFJJVihmaXh1cF9kb25lKSA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyogQ2hlY2sgdGhlIGZvcm1hdCBmb3IgYSBmaWxlIGJlaW5nIHJlYWQuCi0gICBSZXR1cm4gYSAoYmZkX3RhcmdldCAqKSBpZiBpdCdzIGFuIG9iamVjdCBmaWxlIG9yIHplcm8gaWYgbm90LiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICoKLXZtc19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgZXJyID0gMDsKLSAgaW50IHByZXZfdHlwZTsKLSAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnRhcmdldF92ZWN0b3IgPSAwOwotICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2ggPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19vYmplY3RfcCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgaWYgKCF2bXNfaW5pdGlhbGl6ZSAoYWJmZCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAidm1zX2luaXRpYWxpemUgKCkgZmFpbGVkICEhXG4iKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDBMLCBTRUVLX1NFVCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBwcmV2X3R5cGUgPSAtMTsKLQotICBkbwotICAgIHsKLSNpZiBWTVNfREVCVUcKLSAgICAgIHZtc19kZWJ1ZyAoNywgInJlYWRpbmcgYXQgJTA4bHhcbiIsIGJmZF90ZWxsKGFiZmQpKTsKLSNlbmRpZgotICAgICAgaWYgKF9iZmRfdm1zX25leHRfcmVjb3JkIChhYmZkKSA8IDApCi0JewotI2lmIFZNU19ERUJVRwotCSAgdm1zX2RlYnVnICgyLCAibmV4dF9yZWNvcmQgZmFpbGVkXG4iKTsgICAgICAKLSNlbmRpZgotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGlmICgocHJldl90eXBlID09IEVPQkpfU19DX0VHU0QpCi0JICAgJiYgKFBSSVYocmVjX3R5cGUpICE9IEVPQkpfU19DX0VHU0QpKQotCXsKLQkgIGlmICh2bXNfZml4dXBfc2VjdGlvbnMgKGFiZmQpID09IGZhbHNlKQotCSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0JICAgICAgdm1zX2RlYnVnICgyLCAidm1zX2ZpeHVwX3NlY3Rpb25zIGZhaWxlZFxuIik7Ci0jZW5kaWYKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLQotICAgICAgcHJldl90eXBlID0gUFJJVihyZWNfdHlwZSk7Ci0KLSAgICAgIGlmICh0YXJnZXRfdmVjdG9yID09IDApCi0JewotCSAgaWYgKHByZXZfdHlwZSA8PSBPQkpfU19DX01BWFJFQ1RZUCkKLQkgICAgdGFyZ2V0X3ZlY3RvciA9ICZ2bXNfdmF4X3ZlYzsKLQkgIGVsc2UKLQkgICAgdGFyZ2V0X3ZlY3RvciA9ICZ2bXNfYWxwaGFfdmVjOwotCX0KLQotICAgICAgc3dpdGNoIChwcmV2X3R5cGUpCi0JewotCSAgY2FzZSBPQkpfU19DX0hEUjoKLQkgIGNhc2UgRU9CSl9TX0NfRU1IOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9oZHIgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBPQkpfU19DX0VPTToKLQkgIGNhc2UgT0JKX1NfQ19FT01XOgotCSAgY2FzZSBFT0JKX1NfQ19FRU9NOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9lb20gKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBPQkpfU19DX0dTRDoKLQkgIGNhc2UgRU9CSl9TX0NfRUdTRDoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfZ3NkIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19USVI6Ci0JICBjYXNlIEVPQkpfU19DX0VUSVI6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX3RpciAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfREJHOgotCSAgY2FzZSBFT0JKX1NfQ19FREJHOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9kYmcgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBPQkpfU19DX1RCVDoKLQkgIGNhc2UgRU9CSl9TX0NfRVRCVDoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfdGJ0IChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19MTks6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX2xuayAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBlcnIgPSAtMTsKLQl9Ci0gICAgICBpZiAoZXJyICE9IDApCi0JewotI2lmIFZNU19ERUJVRwotCSAgdm1zX2RlYnVnICgyLCAic2x1cnAgdHlwZSAlZCBmYWlsZWQgd2l0aCAlZFxuIiwgcHJldl90eXBlLCBlcnIpOwotI2VuZGlmCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gIHdoaWxlICgocHJldl90eXBlICE9IEVPQkpfU19DX0VFT00pICYmIChwcmV2X3R5cGUgIT0gT0JKX1NfQ19FT00pICYmIChwcmV2X3R5cGUgIT0gT0JKX1NfQ19FT01XKSk7Ci0KLSAgaWYgKHRhcmdldF92ZWN0b3IgPT0gJnZtc192YXhfdmVjKQotICAgIHsKLSAgICAgIGlmICh2bXNfZml4dXBfc2VjdGlvbnMgKGFiZmQpID09IGZhbHNlKQotCXsKLSNpZiBWTVNfREVCVUcKLQkgIHZtc19kZWJ1ZyAoMiwgInZtc19maXh1cF9zZWN0aW9ucyBmYWlsZWRcbiIpOwotI2VuZGlmCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogc2V0IGFyY2hfaW5mbyB0byB2YXggICovCi0gCi0gICAgICBhcmNoID0gYmZkX3NjYW5fYXJjaCAoInZheCIpOwotICAgICAgUFJJViAoaXNfdmF4KSA9IDE7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICB2bXNfZGVidWcgKDIsICJhcmNoIGlzIHZheFxuIik7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UgaWYgKHRhcmdldF92ZWN0b3IgPT0gJnZtc19hbHBoYV92ZWMpCi0gICAgewotICAgICAgLyogc2V0IGFyY2hfaW5mbyB0byBhbHBoYSAgKi8KLSAKLSAgICAgIGFyY2ggPSBiZmRfc2Nhbl9hcmNoICgiYWxwaGEiKTsKLSAgICAgIFBSSVYgKGlzX3ZheCkgPSAwOwotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICgyLCAiYXJjaCBpcyBhbHBoYVxuIik7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKGFyY2ggPT0gMCkKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICB2bXNfZGVidWcgKDIsICJhcmNoIG5vdCBmb3VuZFxuIik7Ci0jZW5kaWYKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBhYmZkLT5hcmNoX2luZm8gPSBhcmNoOwotCi0gIHJldHVybiB0YXJnZXRfdmVjdG9yOwotfQotCi0KLS8qIENoZWNrIHRoZSBmb3JtYXQgZm9yIGEgZmlsZSBiZWluZyByZWFkLgotICAgUmV0dXJuIGEgKGJmZF90YXJnZXQgKikgaWYgaXQncyBhbiBhcmNoaXZlIGZpbGUgb3IgemVyby4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqCi12bXNfYXJjaGl2ZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2FyY2hpdmVfcCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogU2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19ta29iamVjdCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgaWYgKCF2bXNfaW5pdGlhbGl6ZSAoYWJmZCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAidm1zX2luaXRpYWxpemUgKCkgZmFpbGVkICEhXG4iKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICB7Ci0jaWZkZWYgX19WQVgKLSAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2ggPSBiZmRfc2Nhbl9hcmNoICgidmF4Iik7Ci0jZWxzZQotICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaCA9IGJmZF9zY2FuX2FyY2ggKCJhbHBoYSIpOwotI2VuZGlmCi0gICAgaWYgKGFyY2ggPT0gMCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiAwOwotICAgICAgfQotICAgIGFiZmQtPmFyY2hfaW5mbyA9IGFyY2g7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBXcml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiwgYXQgYmZkX2Nsb3NlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3dyaXRlX29iamVjdF9jb250ZW50cyglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgaWYgKGFiZmQtPnNlY3Rpb25fY291bnQgPiAwKQkJCS8qIHdlIGhhdmUgc2VjdGlvbnMgKi8KLSAgICB7Ci0gICAgICBpZiAoUFJJVihpc192YXgpKQotCXsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9oZHIgKGFiZmQsIE9CSl9TX0NfSERSKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZ3NkIChhYmZkLCBPQkpfU19DX0dTRCkgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX3RpciAoYWJmZCwgT0JKX1NfQ19USVIpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90YnQgKGFiZmQsIE9CSl9TX0NfVEJUKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZGJnIChhYmZkLCBPQkpfU19DX0RCRykgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGFiZmQtPnNlY3Rpb25fY291bnQgPiAyNTUpCi0JICAgIHsKLQkgICAgICBpZiAoX2JmZF92bXNfd3JpdGVfZW9tIChhYmZkLCBPQkpfU19DX0VPTVcpICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKF9iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgT0JKX1NfQ19FT00pICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfaGRyIChhYmZkLCBFT0JKX1NfQ19FTUgpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9nc2QgKGFiZmQsIEVPQkpfU19DX0VHU0QpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90aXIgKGFiZmQsIEVPQkpfU19DX0VUSVIpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90YnQgKGFiZmQsIEVPQkpfU19DX0VUQlQpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9kYmcgKGFiZmQsIEVPQkpfU19DX0VEQkcpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9lb20gKGFiZmQsIEVPQkpfU19DX0VFT00pICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyotLSA0LjEsIGdlbmVyaWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBDYWxsZWQgd2hlbiB0aGUgQkZEIGlzIGJlaW5nIGNsb3NlZCB0byBkbyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2Nsb3NlX2FuZF9jbGVhbnVwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHZtc19zZWN0aW9uICplcywgKmVzMTsKLSAgaW50IGk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2Nsb3NlX2FuZF9jbGVhbnVwKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgaWYgKGFiZmQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoUFJJVih2bXNfYnVmKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKFBSSVYodm1zX2J1ZikpOwotICAgICAgUFJJVih2bXNfYnVmKSA9IE5VTEw7Ci0gICAgfQotICBQUklWKGJ1Zl9zaXplKSA9IDA7Ci0KLSAgaWYgKFBSSVYob3V0cHV0X2J1ZikgIT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKG91dHB1dF9idWYpKTsKLSAgICAgIFBSSVYob3V0cHV0X2J1ZikgPSAwOwotICAgIH0KLQotICBzZWMgPSBhYmZkLT5zZWN0aW9uczsKLSAgd2hpbGUgKHNlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzZWMtPmNvbnRlbnRzKQotCWZyZWUgKHNlYy0+Y29udGVudHMpOwotICAgICAgc2VjID0gc2VjLT5uZXh0OwotICAgIH0KLQotICBpZiAoUFJJVihzZWN0aW9ucykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKHNlY3Rpb25zKSk7Ci0gICAgICBQUklWKHNlY3Rpb25zKSA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChQUklWKHZtc19zeW1ib2xfdGFibGUpKQotICAgIHsKLSAgICAgIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKFBSSVYodm1zX3N5bWJvbF90YWJsZSkpOwotICAgICAgUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9IDA7Ci0gICAgfQotCi0gIGlmIChQUklWKHN0YWNrKSkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKHN0YWNrKSk7Ci0gICAgICBQUklWKHN0YWNrKSA9IDA7Ci0gICAgfQotCi0gIGlmIChQUklWKGxvY2F0aW9uX3N0YWNrKSkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKGxvY2F0aW9uX3N0YWNrKSk7Ci0gICAgICBQUklWKGxvY2F0aW9uX3N0YWNrKSA9IDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBWTVNfU0VDVElPTl9DT1VOVDsgaSsrKQotICAgIHsKLSAgICAgIGVzID0gUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbaV07Ci0gICAgICB3aGlsZSAoZXMgIT0gTlVMTCkKLQl7Ci0JICBlczEgPSBlcy0+bmV4dDsKLQkgIGZyZWUgKGVzKTsKLQkgIGVzID0gZXMxOwotCX0KLSAgICAgIFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW2ldID0gTlVMTDsKLSAgIH0KLQotICBmcmVlIChhYmZkLT50ZGF0YS5hbnkpOwotICBhYmZkLT50ZGF0YS5hbnkgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9mcmVlX2NhY2hlZF9pbmZvIChhYmZkKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9mcmVlX2NhY2hlZF9pbmZvKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ2FsbGVkIHdoZW4gYSBuZXcgc2VjdGlvbiBpcyBjcmVhdGVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfbmV3X3NlY3Rpb25faG9vayAoJXAsIFslZF0lcyksIGNvdW50ICVkXG4iLCBhYmZkLCBzZWN0aW9uLT5pbmRleCwgc2VjdGlvbi0+bmFtZSwgYWJmZC0+c2VjdGlvbl9jb3VudCk7Ci0jZW5kaWYKLSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChhYmZkLCBzZWN0aW9uLCA0KTsKLQotICBpZiAoYWJmZC0+c2VjdGlvbl9jb3VudCA+IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0gICAgewotICAgICAgUFJJVihzZWN0aW9ucykgPSAoKGFzZWN0aW9uICoqKQotCQkJICAgIGJmZF9yZWFsbG9jIChQUklWKHNlY3Rpb25zKSwgYWJmZC0+c2VjdGlvbl9jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgICAgIGlmIChQUklWKHNlY3Rpb25zKSA9PSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIFBSSVYoc2VjdGlvbl9jb3VudCkgPSBhYmZkLT5zZWN0aW9uX2NvdW50OwotICAgIH0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAic2VjdGlvbl9jb3VudDogJWRcbiIsIFBSSVYoc2VjdGlvbl9jb3VudCkpOwotI2VuZGlmCi0gIFBSSVYoc2VjdGlvbnMpW3NlY3Rpb24tPmluZGV4XSA9IHNlY3Rpb247Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNywgIiVkOiAlc1xuIiwgc2VjdGlvbi0+aW5kZXgsIHNlY3Rpb24tPm5hbWUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLgotICAgYnVmIHBvaW50cyB0byBhIGJ1ZmZlciBvZiBidWZfc2l6ZSBieXRlcyB0byBiZSBmaWxsZWQgd2l0aAotICAgc2VjdGlvbiBkYXRhIChzdGFydGluZyBhdCBvZmZzZXQgaW50byBzZWN0aW9uKSAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgYnVmLCBvZmZzZXQsIGJ1Zl9zaXplKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGJ1ZiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmaWxlX3B0ciBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSBidWZfc2l6ZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3NlY3Rpb25fY29udGVudHMoJXAsICVzLCAlcCwgb2ZmICVsZCwgc2l6ZSAlZClcbiIsCi0JCSBhYmZkLCBzZWN0aW9uLT5uYW1lLCBidWYsIG9mZnNldCwgKGludClidWZfc2l6ZSk7Ci0jZW5kaWYKLQotICAvKiBzaG91bGRuJ3QgYmUgY2FsbGVkLCBzaW5jZSBhbGwgc2VjdGlvbnMgYXJlIElOX01FTU9SWSAgKi8KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4KLSAgIGJ1ZiBwb2ludHMgdG8gYSBidWZmZXIgb2YgYnVmX3NpemUgYnl0ZXMgdG8gYmUgZmlsbGVkIHdpdGgKLSAgIHNlY3Rpb24gZGF0YSAoc3RhcnRpbmcgYXQgb2Zmc2V0IGludG8gc2VjdGlvbikgICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IChhYmZkLCBzZWN0aW9uLCB3LCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3dpbmRvdyAqdyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmaWxlX3B0ciBvZmZzZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KCVwLCAlcywgJXAsIG9mZiAlbGQsIGNvdW50ICVkKVxuIiwKLQkJIGFiZmQsIHNlY3Rpb24tPm5hbWUsIHcsIG9mZnNldCwgKGludCljb3VudCk7Ci0jZW5kaWYKLQotICAvKiBzaG91bGRuJ3QgYmUgY2FsbGVkLCBzaW5jZSBhbGwgc2VjdGlvbnMgYXJlIElOX01FTU9SWSAgKi8KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qLS0gUGFydCA0LjIsIGNvcHkgcHJpdmF0ZSBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogQ2FsbGVkIHRvIGNvcHkgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICB0byBhbm90aGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIChzcmMsIGRlc3QpCi0gICAgIGJmZCAqc3JjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqZGVzdCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSglcCwgJXApXG4iLCBzcmMsIGRlc3QpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIE1lcmdlIHByaXZhdGUgQkZEIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBAdmFye2liZmR9IHRvIHRoZQotICAgdGhlIG91dHB1dCBmaWxlIEJGRCBAdmFye29iZmR9IHdoZW4gbGlua2luZy4gIFJldHVybiA8PHRydWU+PgotICAgb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IgcmV0dXJucyBhcmU6Ci0KLSAgIG8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotICAgICBOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvYmZkfS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCJ2bXNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoJXAsICVwKVxuIiwgaWJmZCwgb2JmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogU2V0IHByaXZhdGUgQkZEIGZsYWcgaW5mb3JtYXRpb24gaW4gdGhlIEJGRCBAdmFye2FiZmR9LgotICAgUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yCi0gICByZXR1cm5zIGFyZToKLQotICAgbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0gICAgIE5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3MgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCJ2bXNfYmZkX3NldF9wcml2YXRlX2ZsYWdzKCVwLCAlbHgpXG4iLCBhYmZkLCAobG9uZylmbGFncyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc2VjdGlvbiBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICB0byBhbm90aGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoc3JjYmZkLCBzcmNzZWMsIGRzdGJmZCwgZHN0c2VjKQotICAgICBiZmQgKnNyY2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc3Jjc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqZHN0YmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpkc3RzZWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKCVwLCAlcywgJXAsICVzKVxuIiwKLQkJIHNyY2JmZCwgc3Jjc2VjLT5uYW1lLCBkc3RiZmQsIGRzdHNlYy0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENhbGxlZCB0byBjb3B5IEJGRCBwcml2YXRlIHN5bWJvbCBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICB0byBhbm90aGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi12bXNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAoaWJmZCwgaXN5bSwgb2JmZCwgb3N5bSkKLSAgICAgYmZkICppYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKmlzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkICpvYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKm9zeW0gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEoJXAsICVzLCAlcCwgJXMpXG4iLAotCQkgaWJmZCwgaXN5bS0+bmFtZSwgb2JmZCwgb3N5bS0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qLS0gUGFydCA0LjMsIGNvcmUgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUmV0dXJuIGEgcmVhZC1vbmx5IHN0cmluZyBleHBsYWluaW5nIHdoaWNoIHByb2dyYW0gd2FzIHJ1bm5pbmcKLSAgIHdoZW4gaXQgZmFpbGVkIGFuZCBwcm9kdWNlZCB0aGUgY29yZSBmaWxlIGFiZmQuICAqLwotCi1zdGF0aWMgY2hhciAqCi12bXNfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUmV0dXJucyB0aGUgc2lnbmFsIG51bWJlciB3aGljaCBjYXVzZWQgdGhlIGNvcmUgZHVtcCB3aGljaAotICAgZ2VuZXJhdGVkIHRoZSBmaWxlIHRoZSBCRkQgYWJmZCBpcyBhdHRhY2hlZCB0by4gICovCi0KLXN0YXRpYyBpbnQKLXZtc19jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGNvcmUgZmlsZSBhdHRhY2hlZCB0byBjb3JlX2JmZCB3YXMgZ2VuZXJhdGVkCi0gICBieSBhIHJ1biBvZiB0aGUgZXhlY3V0YWJsZSBmaWxlIGF0dGFjaGVkIHRvIGV4ZWNfYmZkLCBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoYWJmZCwgYmJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqYmJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKCVwLCAlcClcbiIsIGFiZmQsIGJiZmQpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyotLSBQYXJ0IDQuNCwgYXJjaGl2ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiA/Pz8JZG8gc29tZXRoaW5nIHdpdGggYW4gYXJjaGl2ZSBtYXAuCi0gICBSZXR1cm4gZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19zbHVycF9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19zbHVycF9hcm1hcCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiA/Pz8JZG8gc29tZXRoaW5nIHdpdGggYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLSAgIFJldHVybiBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiA/Pz8JZG8gc29tZXRoaW5nIHdpdGggYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLSAgIFJldHVybiBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0YWJsb2MsIHRhYmxlbiwgbmFtZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKip0YWJsb2MgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBUcnVuY2F0ZSB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIHRvIG1hdGNoIHN5c3RlbS1kZXBlbmRlbnQgcmVzdHJpY3Rpb25zICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgQ09OU1QgY2hhciAqcGF0aG5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqYXJoZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3RydW5jYXRlX2FybmFtZSglcCwgJXMsICVzKVxuIiwgYWJmZCwgcGF0aG5hbWUsIGFyaGRyKTsKLSNlbmRpZgotICByZXR1cm47Ci19Ci0KLQotLyogPz8/CXdyaXRlIGFyY2hpdmUgbWFwICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFyY2ggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IG9ybCAqbWFwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHN0cmlkeCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfd3JpdGVfYXJtYXAoJXAsICVkLCAlcCwgJWQgJWQpXG4iLAotCWFyY2gsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGFyY2hpdmUgaGVhZGVyID8/PyAgKi8KLQotc3RhdGljIFBUUgotdm1zX3JlYWRfYXJfaGRyIChhYmZkKQotICAgIGJmZCAqIGFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3JlYWRfYXJfaGRyKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIChQVFIpMDsKLX0KLQotCi0vKiBQcm92aWRlZCBhIEJGRCwgQHZhcnthcmNoaXZlfSwgY29udGFpbmluZyBhbiBhcmNoaXZlIGFuZCBOVUxMLCBvcGVuCi0gICBhbiBpbnB1dCBCRkQgb24gdGhlIGZpcnN0IGNvbnRhaW5lZCBlbGVtZW50IGFuZCByZXR1cm5zIHRoYXQuCi0gICBTdWJzZXF1ZW50IGNhbGxzIHNob3VsZCBwYXNzIHRoZSBhcmNoaXZlIGFuZCB0aGUgcHJldmlvdXMgcmV0dXJuIHZhbHVlCi0gICB0byByZXR1cm4gYSBjcmVhdGVkIEJGRCB0byB0aGUgbmV4dCBjb250YWluZWQgZWxlbWVudC4KLSAgIE5VTEwgaXMgcmV0dXJuZWQgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZS4gICovCi0KLXN0YXRpYyBiZmQgKgotdm1zX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaCwgcHJldikKLSAgICAgYmZkICphcmNoIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqcHJldiBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKCVwLCAlcClcbiIsIGFyY2gsIHByZXYpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBSZXR1cm4gdGhlIEJGRCB3aGljaCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBzeW1ib2wgaW4gQUJGRCBpbmRleGVkIGJ5Ci0gICBJTkRFWC4gIElOREVYIHNob3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgYmZkX2dldF9uZXh0X21hcGVudC4gICovCi0KLXN0YXRpYyBiZmQgKgotdm1zX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN5bWluZGV4IGluZGV4OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2VsdF9hdF9pbmRleCglcCwgJXApXG4iLCBhYmZkLCBpbmRleCk7Ci0jZW5kaWYKLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4KGFiZmQsIGluZGV4KTsKLX0KLQotCi0vKiA/Pz8KLSAgIC0+IGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgICovCi0KLXN0YXRpYyBpbnQKLXZtc19nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIHN0YXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKnN0YXQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZW5lcmljX3N0YXRfYXJjaF9lbHQoJXAsICVwKVxuIiwgYWJmZCwgc3RhdCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQoYWJmZCwgc3RhdCk7Ci19Ci0KLQotLyogVGhpcyBpcyBhIG5ldyBmdW5jdGlvbiBpbiBiZmQgMi41ICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKi0tIFBhcnQgNC41LCBzeW1ib2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYSB2ZWN0b3Igb2YgcG9pbnRlcnMKLSAgIHRvIGFzeW1ib2xzIGZvciBhbGwgdGhlIHN5bWJvbHMgaW4gdGhlIEJGRCBhYmZkLCBpbmNsdWRpbmcgYQotICAgdGVybWluYWwgTlVMTCBwb2ludGVyLiBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scyBpbiB0aGUgQkZELAotICAgdGhlbiByZXR1cm4gMC4gIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIC0xLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKCVwKSwgJWQgc3ltYm9sc1xuIiwgYWJmZCwgUFJJVihnc2Rfc3ltX2NvdW50KSk7Ci0jZW5kaWYKLSAgcmV0dXJuIChQUklWKGdzZF9zeW1fY291bnQpKzEpICogc2l6ZW9mKGFzeW1ib2wgKik7Ci19Ci0KLQotLyogQ29weSBzeW1ib2xzIGZyb20gaGFzaCB0YWJsZSB0byBzeW1ib2wgdmVjdG9yCi0KLSAgIGNhbGxlZCBmcm9tIGJmZF9oYXNoX3RyYXZlcnNlIGluIHZtc19nZXRfc3ltdGFiCi0gICBpbml0IGNvdW50ZXIgdG8gMCBpZiBlbnRyeSA9PSAwICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29weV9zeW1ib2xzIChlbnRyeSwgYXJnKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBQVFIgYXJnOwotewotICBiZmQgKmFiZmQgPSAoYmZkICopIGFyZzsKLQotICBpZiAoZW50cnkgPT0gTlVMTCkJLyogaW5pdCBjb3VudGVyICovCi0gICAgUFJJVihzeW1udW0pID0gMDsKLSAgZWxzZQkJCS8qIGZpbGwgdmVjdG9yLCBpbmMgY291bnRlciAqLwotICAgIFBSSVYoc3ltY2FjaGUpW1BSSVYoc3ltbnVtKSsrXSA9ICgodm1zX3N5bWJvbF9lbnRyeSAqKWVudHJ5KS0+c3ltYm9sOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFJlYWQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZEIGFiZmQsIGFuZCBmaWxscyBpbiB0aGUgdmVjdG9yCi0gICBsb2NhdGlvbiB3aXRoIHBvaW50ZXJzIHRvIHRoZSBzeW1ib2xzIGFuZCBhIHRyYWlsaW5nIE5VTEwuCi0KLSAgIHJldHVybiAjIG9mIHN5bWJvbHMgcmVhZCAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfc3ltdGFiIChhYmZkLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3N5bXRhYiglcCwgPHJldD4pXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0JLyogaW5pdCBjb3VudGVyICovCi0gICh2b2lkKWNvcHlfc3ltYm9scygoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopMCwgYWJmZCk7Ci0KLQkvKiB0cmF2ZXJzZSB0YWJsZSBhbmQgZmlsbCBzeW1ib2xzIHZlY3RvciAqLwotCi0gIFBSSVYoc3ltY2FjaGUpID0gc3ltYm9sczsKLSAgYmZkX2hhc2hfdHJhdmVyc2UoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgY29weV9zeW1ib2xzLCAoUFRSKWFiZmQpOwotCi0gIHN5bWJvbHNbUFJJVihnc2Rfc3ltX2NvdW50KV0gPSBOVUxMOwotCi0gIHJldHVybiBQUklWKGdzZF9zeW1fY291bnQpOwotfQotCi0KLS8qIENyZWF0ZSBhIG5ldyBhc3ltYm9sIHN0cnVjdHVyZSBmb3IgdGhlIEJGRCBhYmZkIGFuZCByZXR1cm4gYSBwb2ludGVyCi0gICB0byBpdC4KLSAgIFRoaXMgcm91dGluZSBpcyBuZWNlc3NhcnkgYmVjYXVzZSBlYWNoIGJhY2sgZW5kIGhhcyBwcml2YXRlIGluZm9ybWF0aW9uCi0gICBzdXJyb3VuZGluZyB0aGUgYXN5bWJvbC4gQnVpbGRpbmcgeW91ciBvd24gYXN5bWJvbCBhbmQgcG9pbnRpbmcgdG8gaXQKLSAgIHdpbGwgbm90IGNyZWF0ZSB0aGUgcHJpdmF0ZSBpbmZvcm1hdGlvbiwgYW5kIHdpbGwgY2F1c2UgcHJvYmxlbXMgbGF0ZXIgb24uICAqLwotCi1hc3ltYm9sICoKLV9iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKnN5bWJvbCA9IChhc3ltYm9sICopYmZkX3phbGxvYyhhYmZkLCBzaXplb2YoYXN5bWJvbCkpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgIl9iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLQotICBpZiAoc3ltYm9sID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHN5bWJvbC0+dGhlX2JmZCA9IGFiZmQ7Ci0KLSAgcmV0dXJuIHN5bWJvbDsKLX0KLQotCi0vKiBQcmludCBzeW1ib2wgdG8gZmlsZSBhY2NvcmRpbmcgdG8gaG93LiBob3cgaXMgb25lIG9mCi0gICBiZmRfcHJpbnRfc3ltYm9sX25hbWUJanVzdCBwcmludCB0aGUgbmFtZQotICAgYmZkX3ByaW50X3N5bWJvbF9tb3JlCXByaW50IG1vcmUgKD8/PykKLSAgIGJmZF9wcmludF9zeW1ib2xfYWxsCXByaW50IGFsbCB3ZSBrbm93LCB3aGljaCBpcyBub3QgbXVjaCByaWdodCBub3cgOi0pICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX3ByaW50X3N5bWJvbCAoYWJmZCwgZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfcHJpbnRfc3ltYm9sKCVwLCAlcCwgJXAsICVkKVxuIiwgYWJmZCwgZmlsZSwgc3ltYm9sLCBob3cpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLQlmcHJpbnRmKChGSUxFICopZmlsZSwiICVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLQl7Ci0JICBDT05TVCBjaGFyICpzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQkgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYoKFBUUilmaWxlLHN5bWJvbCk7Ci0KLQkgIGZwcmludGYoKEZJTEUgKilmaWxlLCIgJS04cyAlcyIsIHNlY3Rpb25fbmFtZSwgc3ltYm9sLT5uYW1lKTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm47Ci19Ci0KLQotLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHN5bWJvbCBpbiByZXQuCi0KLSAgIGZpbGwgdHlwZSwgdmFsdWUgYW5kIG5hbWUKLSAgIHR5cGU6Ci0JQQlhYnNvbHV0ZQotCUIJYnNzIHNlZ21lbnQgc3ltYm9sCi0JQwljb21tb24gc3ltYm9sCi0JRAlkYXRhIHNlZ21lbnQgc3ltYm9sCi0JZglmaWxlbmFtZQotCXQJYSBzdGF0aWMgZnVuY3Rpb24gc3ltYm9sCi0JVAl0ZXh0IHNlZ21lbnQgc3ltYm9sCi0JVQl1bmRlZmluZWQKLQktCWRlYnVnICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zeW1ib2xfaW5mbyglcCwgJXAsICVwKVxuIiwgYWJmZCwgc3ltYm9sLCByZXQpOwotI2VuZGlmCi0KLSAgc2VjID0gc3ltYm9sLT5zZWN0aW9uOwotCi0gIGlmIChyZXQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnQyc7Ci0gIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnQSc7Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnVSc7Ci0gIGVsc2UgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc2VjKSkKLSAgICByZXQtPnR5cGUgPSAnSSc7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19DT0RFKQotICAgIHJldC0+dHlwZSA9ICdUJzsKLSAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0RBVEEpCi0gICAgcmV0LT50eXBlID0gJ0QnOwotICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQUxMT0MpCi0gICAgcmV0LT50eXBlID0gJ0InOwotICBlbHNlCi0gICAgcmV0LT50eXBlID0gJy0nOwotCi0gIGlmIChyZXQtPnR5cGUgIT0gJ1UnKQotICAgIHJldC0+dmFsdWUgPSBzeW1ib2wtPnZhbHVlICsgc3ltYm9sLT5zZWN0aW9uLT52bWE7Ci0gIGVsc2UKLSAgICByZXQtPnZhbHVlID0gMDsKLSAgcmV0LT5uYW1lID0gc3ltYm9sLT5uYW1lOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3ltYm9sIHN5bSBpbiB0aGUgQkZEIGFiZmQgaXMKLSAgIGEgY29tcGlsZXIgZ2VuZXJhdGVkIGxvY2FsIGxhYmVsLCBlbHNlIHJldHVybiBmYWxzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUoJXAsICVzKVxuIiwgYWJmZCwgbmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIG5hbWVbMF0gPT0gJyQnOwotfQotCi0KLS8qIEdldCBzb3VyY2UgbGluZSBudW1iZXIgZm9yIHN5bWJvbCAgKi8KLQotc3RhdGljIGFsZW50ICoKLXZtc19nZXRfbGluZW5vIChhYmZkLCBzeW1ib2wpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW1ib2wgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9saW5lbm8oJXAsICVwKVxuIiwgYWJmZCwgc3ltYm9sKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlIGFuZAotICAgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUgd2FudGVkCi0gICBsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZSwgZnVuYywgbGluZSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZF92bWEgb2Zmc2V0IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZmluZF9uZWFyZXN0X2xpbmUoJXAsICVzLCAlcCwgJWxkLCA8cmV0PiwgPHJldD4sIDxyZXQ+KVxuIiwKLQkgICAgICBhYmZkLCBzZWN0aW9uLT5uYW1lLCBzeW1ib2xzLCAobG9uZyBpbnQpb2Zmc2V0KTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogQmFjay1kb29yIHRvIGFsbG93IGZvcm1hdC1hd2FyZSBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGRlYnVnIHN5bWJvbHMKLSAgIHdoaWxlIHVzaW5nIEJGRCBmb3IgZXZlcnl0aGluZyBlbHNlLiAgQ3VycmVudGx5IHVzZWQgYnkgdGhlIGFzc2VtYmxlcgotICAgd2hlbiBjcmVhdGluZyBDT0ZGIGZpbGVzLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotdm1zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCAoYWJmZCwgcHRyLCBzaXplKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdm9pZCAqcHRyIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX21ha2VfZGVidWdfc3ltYm9sKCVwLCAlcCwgJWxkKVxuIiwgYWJmZCwgcHRyLCBzaXplKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBSZWFkIG1pbmlzeW1ib2xzLiAgRm9yIG1pbmlzeW1ib2xzLCB3ZSB1c2UgdGhlIHVubW9kaWZpZWQgYS5vdXQKLSAgIHN5bWJvbHMuICBUaGUgbWluaXN5bWJvbF90b19zeW1ib2wgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGVzZSBpbnRvCi0gICBCRkQgYXN5bWJvbCBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgUFRSICptaW5pc3ltc3A7Ci0gICAgIHVuc2lnbmVkIGludCAqc2l6ZXA7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19yZWFkX21pbmlzeW1ib2xzKCVwLCAlZCwgJXAsICVkKVxuIiwgYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCAqc2l6ZXApOwotI2VuZGlmCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCk7Ci19Ci0KLS8qIENvbnZlcnQgYSBtaW5pc3ltYm9sIHRvIGEgQkZEIGFzeW1ib2wuICBBIG1pbmlzeW1ib2wgaXMganVzdCBhbgotICAgdW5tb2RpZmllZCBhLm91dCBzeW1ib2wuICBUaGUgU1lNIGFyZ3VtZW50IGlzIGEgc3RydWN0dXJlIHJldHVybmVkCi0gICBieSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wsIHdoaWNoIHdlIGZpbGwgaW4gaGVyZS4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLXZtc19taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgY29uc3QgUFRSIG1pbmlzeW07Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX21pbmlzeW1ib2xfdG9fc3ltYm9sKCVwLCAlZCwgJXAsICVwKVxuIiwgYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKTsKLSNlbmRpZgotICByZXR1cm4gX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pOwotfQotCi0vKi0tIFBhcnQgNC42LCByZWxvY2F0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uCi0gICBhc3NvY2lhdGVkIHdpdGggc2VjdGlvbiBzZWN0IGF0dGFjaGVkIHRvIGJmZCBhYmZkLgotICAgSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gLTEuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfcmVsb2NfdXBwZXJfYm91bmQoJXAsICVzKVxuIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIC0xTDsKLX0KLQotCi0vKiBDYWxsIHRoZSBiYWNrIGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZW4gQkZEIGFiZmQgYW5kIHRyYW5zbGF0ZSB0aGUKLSAgIGV4dGVybmFsIGZvcm0gb2YgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gc2VjIGludG8gdGhlCi0gICBpbnRlcm5hbCBjYW5vbmljYWwgZm9ybS4gIFBsYWNlIHRoZSB0YWJsZSBpbnRvIG1lbW9yeSBhdCBsb2MsIHdoaWNoIGhhcwotICAgYmVlbiBwcmVhbGxvY2F0ZWQsIHVzdWFsbHkgYnkgYSBjYWxsIHRvIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQuCi0gICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVsb2NzLCBvciAtMSBvbiBlcnJvci4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgc3ltYm9scykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFyZWxlbnQgKipsb2NhdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICoqc3ltYm9scyBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY2Fub25pY2FsaXplX3JlbG9jKCVwLCAlcywgPHJldD4sIDxyZXQ+KVxuIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiB0aGlzIGlzIGp1c3QgY29waWVkIGZyb20gZWNvZmYtYWxwaGEsIG5lZWRzIHRvIGJlIGZpeGVkIHByb2JhYmx5ICovCi0KLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmVsb2NfbmlsIChhYmZkLCByZWxvYywgc3ltLCBkYXRhLCBzZWMsIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhcmVsZW50ICpyZWxvYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc3ltYm9sICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmQgKm91dHB1dF9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAicmVsb2NfbmlsKGFiZmQgJXAsIG91dHB1dF9iZmQgJXApXG4iLCBhYmZkLCBvdXRwdXRfYmZkKTsKLSAgdm1zX2RlYnVnICgyLCAiSW4gc2VjdGlvbiAlcywgc3ltYm9sICVzXG4iLAotCXNlYy0+bmFtZSwgc3ltLT5uYW1lKTsKLSAgdm1zX2RlYnVnICgyLCAicmVsb2Mgc3ltICVzLCBhZGRyICUwOGx4LCBhZGRlbmQgJTA4bHgsIHJlbG9jIGlzIGEgJXNcbiIsCi0JCXJlbG9jLT5zeW1fcHRyX3B0clswXS0+bmFtZSwKLQkJKHVuc2lnbmVkIGxvbmcpcmVsb2MtPmFkZHJlc3MsCi0JCSh1bnNpZ25lZCBsb25nKXJlbG9jLT5hZGRlbmQsIHJlbG9jLT5ob3d0by0+bmFtZSk7Ci0gIHZtc19kZWJ1ZyAoMiwgImRhdGEgYXQgJXBcbiIsIGRhdGEpOwotLyogIF9iZmRfaGV4ZHVtcCAoMiwgZGF0YSwgYmZkX2dldF9yZWxvY19zaXplKHJlbG9jLT5ob3d0byksMCk7ICovCi0jZW5kaWYKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWxwaGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChBTFBIQV9SX0lHTk9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRlFVQUQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIxIGJpdCBicmFuY2guICBUaGUgbmF0aXZlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhlc2UgZm9yCi0gICAgIGJyYW5jaGVzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhbmQgYWxzbyBmaWxscyBpbiB0aGUgUEMKLSAgICAgcmVsYXRpdmUgb2Zmc2V0IGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiQlJBRERSIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgaGludCBmb3IgYSBqdW1wIHRvIGEgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoQUxQSEFfUl9ISU5ULAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkhJTlQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUw2NCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFVTSCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfU1RPUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdWJ0cmFjdCB0aGUgcmVsb2MgYWRkcmVzcyBmcm9tIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZQotICAgICByZWxvY2F0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFNVQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BTVUIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSByZWxvY2F0aW9uIHN0YWNrIHJpZ2h0IGJ5IHRoZQotICAgICBnaXZlbiB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BSU0hJRlQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIYWNrLiBMaW5rYWdlIGlzIGRvbmUgYnkgbGlua2VyLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElOS0FHRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgOCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjU2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElOS0FHRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfUkVGTE9ORywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGTE9ORyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgcHJvY2VkdXJlLCB3cml0dGVuIGFzIDMyIGJpdCB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX0NPREVBRERSLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJDT0RFQUREUiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgaG93dG8gc3RydWN0dXJlIHdoaWNoLCB3aGVuIGludm9rZWQsIHdpbGwgcGVyZm9ybQotICAgdGhlIHJlbG9jYXRpb24gY29kZSBvbiBkYXRhIGZyb20gdGhlIGFyY2hpdGVjdHVyZSBub3RlZC4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICoKLXZtc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaW50IGFscGhhX3R5cGU7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9yZWxvY190eXBlX2xvb2t1cCglcCwgJWQpXHQiLCBhYmZkLCBjb2RlKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18xNjoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwxNjsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1JFRkxPTkc7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfNjQ6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZRVUFEOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZRVUFEOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DXzIzX1BDUkVMX1MyOglhbHBoYV90eXBlID0gQUxQSEFfUl9CUkFERFI7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfSElOVDoJYWxwaGFfdHlwZSA9IEFMUEhBX1JfSElOVDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwxNjsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwzMjsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ182NF9QQ1JFTDoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUw2NDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOglhbHBoYV90eXBlID0gQUxQSEFfUl9MSU5LQUdFOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOglhbHBoYV90eXBlID0gQUxQSEFfUl9DT0RFQUREUjsJYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoInJlbG9jICglZCkgaXMgKlVOS05PV04qIiwgY29kZSk7Ci0JcmV0dXJuIChjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICopIE5VTEw7Ci0gICAgfQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDIsICJyZWxvYyBpcyAlc1xuIiwgYWxwaGFfaG93dG9fdGFibGVbYWxwaGFfdHlwZV0ubmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuICZhbHBoYV9ob3d0b190YWJsZVthbHBoYV90eXBlXTsKLX0KLQotCi0vKi0tIFBhcnQgNC43LCB3cml0aW5nIGFuIG9iamVjdCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgaW4gQkZEIGFiZmQgdG8gYXJjaCBhbmQgbWFjaC4KLSAgIEZpbmQgdGhlIGNvcnJlY3QgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIGFyY2hfaW5mbwotICAgcG9pbnRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2ggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NldF9hcmNoX21hY2goJXAsICVkLCAlbGQpXG4iLCBhYmZkLCBhcmNoLCBtYWNoKTsKLSNlbmRpZgotICBhYmZkLT5hcmNoX2luZm8gPSBiZmRfc2Nhbl9hcmNoKCJhbHBoYSIpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHNlY3Rpb24gaW4gQkZEIGFiZmQgdG8gdGhlIGRhdGEgc3RhcnRpbmcKLSAgIGluIG1lbW9yeSBhdCBkYXRhLiBUaGUgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiBzdGFydGluZyBhdAotICAgb2Zmc2V0IG9mZnNldCBmb3IgY291bnQgYnl0ZXMuCi0KLSAgIE5vcm1hbGx5IHRydWUgaXMgcmV0dXJuZWQsIGVsc2UgZmFsc2UuIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotICAgbyBiZmRfZXJyb3Jfbm9fY29udGVudHMgLSBUaGUgb3V0cHV0IHNlY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUKLQlTRUNfSEFTX0NPTlRFTlRTIGF0dHJpYnV0ZSwgc28gbm90aGluZyBjYW4gYmUgd3JpdHRlbiB0byBpdC4KLSAgIG8gYW5kIHNvbWUgbW9yZSB0b28gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NldF9zZWN0aW9uX2NvbnRlbnRzKCVwLCBzZWMgJXMsIGxvYyAlcCwgb2ZmICVsZCwgY291bnQgJWQpXG4iLAotCQkJCQlhYmZkLCBzZWN0aW9uLT5uYW1lLCBsb2NhdGlvbiwgKGxvbmcgaW50KW9mZnNldCwgKGludCljb3VudCk7Ci0gIHZtc19kZWJ1ZyAoMiwgInNlY3JhdyAlZCwgc2VjY29va2VkICVkXG4iLCAoaW50KXNlY3Rpb24tPl9yYXdfc2l6ZSwgKGludClzZWN0aW9uLT5fY29va2VkX3NpemUpOwotI2VuZGlmCi0gIHJldHVybiBfYmZkX3NhdmVfdm1zX3NlY3Rpb24oYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpOwotfQotCi0KLS8qLS0gUGFydCA0LjgsIGxpbmtlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2V0IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgaW50Ci12bXNfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiByZWxvYyBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfc2l6ZW9mX2hlYWRlcnMoJXAsICVzKVxuIiwgYWJmZCwgKHJlbG9jKT8iVHJ1ZSI6IkZhbHNlIik7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUHJvdmlkZXMgZGVmYXVsdCBoYW5kbGluZyBvZiByZWxvY2F0aW9uIGVmZm9ydCBmb3IgYmFjayBlbmRzCi0gICB3aGljaCBjYW4ndCBiZSBib3RoZXJlZCB0byBkbyBpdCBlZmZpY2llbnRseS4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi12bXNfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX2J5dGUgKmRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMoJXAsICVwLCAlcCwgJXAsICVzLCAlcClcbiIsCi0JCQlhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsIChyZWxvY2F0ZWFibGUpPyJUcnVlIjoiRmFsc2UiLCBzeW1ib2xzKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiA/Pz8gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gKmFnYWluIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfcmVsYXhfc2VjdGlvbiglcCwgJXMsICVwLCA8cmV0PilcbiIsCi0JCQkJCWFiZmQsIHNlY3Rpb24tPm5hbWUsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2djX3NlY3Rpb25zIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfZ2Nfc2VjdGlvbnMoJXAsICVwKVxuIiwgYWJmZCwgbGlua19pbmZvKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBDcmVhdGUgYSBoYXNoIHRhYmxlIGZvciB0aGUgbGlua2VyLiAgRGlmZmVyZW50IGJhY2tlbmRzIHN0b3JlCi0gICBkaWZmZXJlbnQgaW5mb3JtYXRpb24gaW4gdGhpcyB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi12bXNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0IGZpbGUgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9saW5rX2FkZF9zeW1ib2xzKCVwLCAlcClcbiIsIGFiZmQsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIERvIGEgbGluayBiYXNlZCBvbiB0aGUgbGlua19vcmRlciBzdHJ1Y3R1cmVzIGF0dGFjaGVkIHRvIGVhY2gKLSAgIHNlY3Rpb24gb2YgdGhlIEJGRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9maW5hbF9saW5rKCVwLCAlcClcbiIsIGFiZmQsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNob3VsZCB0aGlzIHNlY3Rpb24gYmUgc3BsaXQgdXAgaW50byBzbWFsbGVyIHBpZWNlcyBkdXJpbmcgbGlua2luZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfbGlua19zcGxpdF9zZWN0aW9uKCVwLCAlcylcbiIsIGFiZmQsIHNlY3Rpb24tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyotLSBQYXJ0IDQuOSwgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY2F0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIGZpbGUpCi0gICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgdm9pZCAqZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBSZWFkIGluIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIoJXAsIDxyZXQ+KVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDBMOwotfQotCi0KLS8qIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMEw7Ci19Ci0KLQotLyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBhcmVsLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXJlbGVudCAqKmFyZWwgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDBMOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy5oIGIvYmZkL3Ztcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTQzOTg2Li4wMDAwMDAwCi0tLSBhL2JmZC92bXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0jdW5kZWYgdm1zCi0vKiB2bXMuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVk1TIChBbHBoYSBhbmQgVmF4KSBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFZNU19ICi0jZGVmaW5lIFZNU19ICi0KLQotLyogQ29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggJ0V4eHhfJyBhcmUgZm9yIG9wZW5WTVMvQWxwaGEgKEVWQVggb2JqZWN0IGxhbmd1YWdlKSAgKi8KLQotLyogVk1TIFRleHQsIGluZm9ybWF0aW9uIGFuZCByZWxvY2F0aW9uIHJlY29yZCAoVElSL0VUSVIpIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBUSVJfU19DX1NUQV9HQkwJCTAKLSNkZWZpbmUgVElSX1NfQ19TVEFfU0IJCTEKLSNkZWZpbmUgVElSX1NfQ19TVEFfU1cJCTIKLSNkZWZpbmUgVElSX1NfQ19TVEFfTFcJCTMKLSNkZWZpbmUgVElSX1NfQ19TVEFfUEIJCTQKLSNkZWZpbmUgVElSX1NfQ19TVEFfUFcJCTUKLSNkZWZpbmUgVElSX1NfQ19TVEFfUEwJCTYKLSNkZWZpbmUgVElSX1NfQ19TVEFfVUIgIAk3Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1VXICAJOAotI2RlZmluZSBUSVJfU19DX1NUQV9CRkkgCTkKLSNkZWZpbmUgVElSX1NfQ19TVEFfV0ZJIAkxMAotI2RlZmluZSBUSVJfU19DX1NUQV9MRkkgCTExCi0jZGVmaW5lIFRJUl9TX0NfU1RBX0VQTSAJMTIKLSNkZWZpbmUgVElSX1NfQ19TVEFfQ0tBUkcgICAgICAgMTMKLSNkZWZpbmUgVElSX1NfQ19TVEFfV1BCIAkxNAotI2RlZmluZSBUSVJfU19DX1NUQV9XUFcgCTE1Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1dQTCAJMTYKLSNkZWZpbmUgVElSX1NfQ19TVEFfTFNZIAkxNwotI2RlZmluZSBUSVJfU19DX1NUQV9MSVQgCTE4Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX0xFUE0gICAgICAgIDE5Ci0jZGVmaW5lIFRJUl9TX0NfTUFYU1RBQ09EICAgICAgIDE5Ci0jZGVmaW5lIFRJUl9TX0NfTUlOU1RPQ09EICAgICAgIDIwCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1NCICAJMjAKLSNkZWZpbmUgVElSX1NfQ19TVE9fU1cgIAkyMQotI2RlZmluZSBUSVJfU19DX1NUT19MICAgCTIyCi0jZGVmaW5lIFRJUl9TX0NfU1RPX0xXICAJMjIKLSNkZWZpbmUgVElSX1NfQ19TVE9fQkQgIAkyMwotI2RlZmluZSBUSVJfU19DX1NUT19XRCAgCTI0Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX0xEICAJMjUKLSNkZWZpbmUgVElSX1NfQ19TVE9fTEkgIAkyNgotI2RlZmluZSBUSVJfU19DX1NUT19QSURSICAgICAgICAyNwotI2RlZmluZSBUSVJfU19DX1NUT19QSUNSICAgICAgICAyOAotI2RlZmluZSBUSVJfU19DX1NUT19SU0IgCTI5Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JTVyAJMzAKLSNkZWZpbmUgVElSX1NfQ19TVE9fUkwgIAkzMQotI2RlZmluZSBUSVJfU19DX1NUT19WUFMgCTMyCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1VTQiAJMzMKLSNkZWZpbmUgVElSX1NfQ19TVE9fVVNXIAkzNAotI2RlZmluZSBUSVJfU19DX1NUT19SVUIgCTM1Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JVVyAJMzYKLSNkZWZpbmUgVElSX1NfQ19TVE9fQiAgIAkzNwotI2RlZmluZSBUSVJfU19DX1NUT19XICAgCTM4Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JCICAJMzkKLSNkZWZpbmUgVElSX1NfQ19TVE9fUlcgIAk0MAotI2RlZmluZSBUSVJfU19DX1NUT19SSVZCICAgICAgICA0MQotI2RlZmluZSBUSVJfU19DX1NUT19QSVJSICAgICAgICA0MgotI2RlZmluZSBUSVJfU19DX01BWFNUT0NPRCAgICAgICA0MgotI2RlZmluZSBUSVJfU19DX01JTk9QUkNPRCAgICAgICA1MAotI2RlZmluZSBUSVJfU19DX09QUl9OT1AgCTUwCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0FERCAJNTEKLSNkZWZpbmUgVElSX1NfQ19PUFJfU1VCIAk1MgotI2RlZmluZSBUSVJfU19DX09QUl9NVUwgCTUzCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0RJViAJNTQKLSNkZWZpbmUgVElSX1NfQ19PUFJfQU5EIAk1NQotI2RlZmluZSBUSVJfU19DX09QUl9JT1IgCTU2Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0VPUiAJNTcKLSNkZWZpbmUgVElSX1NfQ19PUFJfTkVHIAk1OAotI2RlZmluZSBUSVJfU19DX09QUl9DT00gCTU5Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0lOU1YgICAgICAgIDYwCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0FTSCAJNjEKLSNkZWZpbmUgVElSX1NfQ19PUFJfVVNIIAk2MgotI2RlZmluZSBUSVJfU19DX09QUl9ST1QgCTYzCi0jZGVmaW5lIFRJUl9TX0NfT1BSX1NFTCAJNjQKLSNkZWZpbmUgVElSX1NfQ19PUFJfUkVERUYgICAgICAgNjUKLSNkZWZpbmUgVElSX1NfQ19PUFJfREZMSVQgICAgICAgNjYKLSNkZWZpbmUgVElSX1NfQ19NQVhPUFJDT0QgICAgICAgNjYKLSNkZWZpbmUgVElSX1NfQ19NSU5DVExDT0QgICAgICAgODAKLSNkZWZpbmUgVElSX1NfQ19DVExfU0VUUkIgICAgICAgODAKLSNkZWZpbmUgVElSX1NfQ19DVExfQVVHUkIgICAgICAgODEKLSNkZWZpbmUgVElSX1NfQ19DVExfREZMT0MgICAgICAgODIKLSNkZWZpbmUgVElSX1NfQ19DVExfU1RMT0MgICAgICAgODMKLSNkZWZpbmUgVElSX1NfQ19DVExfU1RLREwgICAgICAgODQKLSNkZWZpbmUgVElSX1NfQ19NQVhDVExDT0QgICAgICAgODQKLQotI2RlZmluZSBFVElSX1NfQ19NSU5TVEFDT0QgMAkJLyogTWluaW11bSBzdG9yZSBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfR0JMIDAJCS8qIFN0YWNrIGdsb2JhbCBzeW1ib2wgdmFsdWUJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX0xXIDEJCS8qIFN0YWNrIGxvbmd3b3JkCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfUVcgMgkJLyogU3RhY2sgcXVhZHdvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUQV9QUSAzCQkvKiBTdGFjayBwc2VjdCBiYXNlIHBsdXMgcXVhZHdvcmQgb2Zmc2V0ICAqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfTEkgNAkJLyogU3RhY2sgbGl0ZXJhbAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX01PRCA1CQkvKiBTdGFjayBtb2R1bGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfQ0tBUkcgNgkJLyogQ2hlY2sgQXJndW1lbnRzCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhTVEFDT0QgNgkJLyogTWF4aW11bSBzdGFjayBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19NSU5TVE9DT0QgNTAJCS8qIE1pbmltdW0gc3RvcmUgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0IgNTAJCS8qIFN0b3JlIGJ5dGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fVyA1MQkJLyogU3RvcmUgd29yZAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19MVyA1MgkJLyogU3RvcmUgbG9uZ3dvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19RVyA1MwkJLyogU3RvcmUgcXVhZHdvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19JTU1SIDU0CQkvKiBTdG9yZSBpbW1lZGlhdGUgUmVwZWF0ZWQJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0dCTCA1NQkJLyogU3RvcmUgZ2xvYmFsCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0NBIDU2CQkvKiBTdG9yZSBjb2RlIGFkZHJlc3MJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19SQiA1NwkJLyogU3RvcmUgcmVsYXRpdmUgYnJhbmNoCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19BQiA1OAkJLyogU3RvcmUgYWJzb2x1dGUgYnJhbmNoCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19PRkYgNTkJCS8qIFN0b3JlIG9mZnNldCB3aXRoaW4gcHNlY3QJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0lNTSA2MQkJLyogU3RvcmUgaW1tZWRpYXRlCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fR0JMX0xXIDYyCQkvKiBTdG9yZSBnbG9iYWwgTG9uZ3dvcmQJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0xQX1BTQiA2MwkJLyogU1RPX0xQX1BTQiBub3QgdmFsaWQgaW4gbGV2ZWwgMiB1c2UgU1RDX0xQX1BTQgkJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19ISU5UX0dCTCA2NAkvKiBTdG9yZSAxNCBiaXQgSElOVCBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fSElOVF9QUyA2NQkJLyogU3RvcmUgMTQgYml0IEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUFYU1RPQ09EIDY1CQkvKiBNYXhpbXVtIHN0b3JlIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX01JTk9QUkNPRCAxMDAJCS8qIE1pbmltdW0gb3BlcmF0ZSBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfTk9QIDEwMAkJLyogTm8tb3AJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQUREIDEwMQkJLyogQWRkCQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9TVUIgMTAyCQkvKiBTdWJ0cmFjdAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9NVUwgMTAzCQkvKiBNdWx0aXBseQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9ESVYgMTA0CQkvKiBEaXZpZGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQU5EIDEwNQkJLyogTG9naWNhbCBBTkQJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfSU9SIDEwNgkJLyogTG9naWNhbCBpbmNsdXNpdmUgT1IJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9FT1IgMTA3CQkvKiBMb2dpY2FsIGV4Y2x1c2l2ZSBPUgkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX05FRyAxMDgJCS8qIE5lZ2F0ZQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9DT00gMTA5CQkvKiBDb21wbGVtZW50CQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX0lOU1YgMTEwCQkvKiBJbnNlcnQgYml0IGZpZWxkCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQVNIIDExMQkJLyogQXJpdGhtZXRpYyBzaGlmdAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1VTSCAxMTIJCS8qIFVuc2lnbmVkIHNoaWZ0CQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfUk9UIDExMwkJLyogUm90YXRlCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1NFTCAxMTQJCS8qIFNlbGVjdCBvbmUgb2YgdGhyZWUgbG9uZ3dvcmRzIG9uIHRvcCBvZiBzdGFjayAgKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1JFREVGIDExNQkJLyogUmVkZWZpbmUgdGhpcyBzeW1ib2wgYWZ0ZXIgcGFzcyAyICAqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfREZMSVQgMTE2CQkvKiBEZWZpbmUgYSBsaXRlcmFsCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhPUFJDT0QgMTE2CQkvKiBNYXhpbXVtIG9wZXJhdGUgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUlOQ1RMQ09EIDE1MAkJLyogTWluaW11bSBjb250cm9sIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9TRVRSQiAxNTAJCS8qIFNldCByZWxvY2F0aW9uIGJhc2UJCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9BVUdSQiAxNTEJCS8qIEF1Z21lbnQgcmVsb2NhdGlvbiBiYXNlCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9ERkxPQyAxNTIJCS8qIERlZmluZSBkZWJ1ZyBsb2NhdGlvbgkqLwotI2RlZmluZSBFVElSX1NfQ19DVExfU1RMT0MgMTUzCQkvKiBTZXQgZGVidWcgbG9jYXRpb24JCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9TVEtETCAxNTQJCS8qIFN0YWNrIGRlYnVnIGxvY2F0aW9uCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhDVExDT0QgMTU0CQkvKiBNYXhpbXVtIGNvbnRyb2wgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUlOU1RDQ09EIDIwMAkJLyogTWluaW11bSBzdG9yZS1jb25kaXRpb25hbCBjb2RlICAgICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19MUCAyMDAJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIExpbmthZ2UgUGFpciAgICAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTFBfUFNCIDIwMQkJLyogU3RvcmUtY29uZGl0aW9uYWwgTGlua2FnZSBQYWlyIHdpdGggUHJvY2VkdXJlIFNpZ25hdHVyZSAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfR0JMIDIwMgkJLyogU3RvcmUtY29uZGl0aW9uYWwgQWRkcmVzcyBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfR0NBIDIwMwkJLyogU3RvcmUtY29uZGl0aW9uYWwgQ29kZSBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19QUyAyMDQJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIEFkZHJlc3MgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX05PUF9HQkwgMjA1CS8qIFN0b3JlLWNvbmRpdGlvbmFsIE5PUCBhdCBhZGRyZXNzIG9mIGdsb2JhbCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTk9QX1BTIDIwNgkJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IHBlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0JTUl9HQkwgMjA3CS8qIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfQlNSX1BTIDIwOAkJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIGF0IHBlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0xEQV9HQkwgMjA5CS8qIFN0b3JlLWNvbmRpdGlvbmFsIExEQSBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTERBX1BTIDIxMAkJLyogU3RvcmUtY29uZGl0aW9uYWwgTERBIGF0IHBzZWN0ICsgb2Zmc2V0ICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19CT0hfR0JMIDIxMQkvKiBTdG9yZS1jb25kaXRpb25hbCBCU1Igb3IgSGludCBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfQk9IX1BTIDIxMgkJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIG9yIEhpbnQgYXQgcGVjdCArIG9mZnNldCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTkJIX0dCTCAyMTMJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19OQkhfUFMgMjE0CQkvKiBTdG9yZS1jb25kaXRpb25hbCBOT1AsQlNSIG9yIEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUFYU1RDQ09EIDIxNAkJLyogTWF4aW11bSBzdG9yZS1jb25kaXRpb25hbCBjb2RlICAgICovCi0KLS8qIFZNUyBHbG9iYWwgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkIChHU0QvRUdTRCkuICAqLwotCi0jZGVmaW5lIEdTRF9TX0tfRU5UUklFUyAxCi0jZGVmaW5lIEdTRF9TX0NfRU5UUklFUyAxCi0jZGVmaW5lIEdTRF9TX0NfUFNDICAgICAwCi0jZGVmaW5lIEdTRF9TX0NfU1lNICAgICAxCi0jZGVmaW5lIEdTRF9TX0NfRVBNICAgICAyCi0jZGVmaW5lIEdTRF9TX0NfUFJPICAgICAzCi0jZGVmaW5lIEdTRF9TX0NfU1lNVyAgICA0Ci0jZGVmaW5lIEdTRF9TX0NfRVBNVyAgICA1Ci0jZGVmaW5lIEdTRF9TX0NfUFJPVyAgICA2Ci0jZGVmaW5lIEdTRF9TX0NfSURDICAgICA3Ci0jZGVmaW5lIEdTRF9TX0NfRU5WICAgICA4Ci0jZGVmaW5lIEdTRF9TX0NfTFNZICAgICA5Ci0jZGVmaW5lIEdTRF9TX0NfTEVQTSAgICAxMAotI2RlZmluZSBHU0RfU19DX0xQUk8gICAgMTEKLSNkZWZpbmUgR1NEX1NfQ19TUFNDICAgIDEyCi0jZGVmaW5lIEdTRF9TX0NfU1lNViAgICAxMwotI2RlZmluZSBHU0RfU19DX0VQTVYgICAgMTQKLSNkZWZpbmUgR1NEX1NfQ19QUk9WICAgIDE1Ci0jZGVmaW5lIEdTRF9TX0NfTUFYUkVDVFlQICAgICAgIDE1Ci0KLSNkZWZpbmUgRUdTRF9TX0tfRU5UUklFUyAyCS8qIE9mZnNldCB0byBmaXJzdCBlbnRyeSBpbiByZWNvcmQJKi8KLSNkZWZpbmUgRUdTRF9TX0NfRU5UUklFUyAyCS8qIE9mZnNldCB0byBmaXJzdCBlbnRyeSBpbiByZWNvcmQJKi8KLSNkZWZpbmUgRUdTRF9TX0NfUFNDIDAJCS8qIFBzZWN0IGRlZmluaXRpb24JCQkqLwotI2RlZmluZSBFR1NEX1NfQ19TWU0gMQkJLyogU3ltYm9sIHNwZWNpZmljYXRpb24JCQkqLwotI2RlZmluZSBFR1NEX1NfQ19JREMgMgkJLyogUmFuZG9tIGVudGl0eSBjaGVjawkJCSovCi0jZGVmaW5lIEVHU0RfU19DX1NQU0MgNQkJLyogU2hhcmVhYmxlIGltYWdlIHBzZWN0IGRlZmluaXRpb24JKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNViA2CQkvKiBWZWN0b3JlZCAoZHVhbC12YWx1ZWQpIHZlcnNpb25zIG9mIFNZTSwgKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNTSA3CQkvKiBNYXNrZWQgdmVyc2lvbnMgb2YgU1lNLAkJKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNRyA4CQkvKiBFR1NUIC0gZ3N0IHZlcnNpb24gb2YgU1lNCQkqLwotI2RlZmluZSBFR1NEX1NfQ19NQVhSRUNUWVAgOAkvKiBNYXhpbXVtIGVudHJ5IHR5cGUgZGVmaW5lZAkJKi8KLQotI2RlZmluZSBHUFNfU19NX1BJQyAgICAgMQotI2RlZmluZSBHUFNfU19NX0xJQiAgICAgMgotI2RlZmluZSBHUFNfU19NX09WUiAgICAgNAotI2RlZmluZSBHUFNfU19NX1JFTCAgICAgOAotI2RlZmluZSBHUFNfU19NX0dCTCAgICAgMTYKLSNkZWZpbmUgR1BTX1NfTV9TSFIgICAgIDMyCi0jZGVmaW5lIEdQU19TX01fRVhFICAgICA2NAotI2RlZmluZSBHUFNfU19NX1JEICAgICAgMTI4Ci0jZGVmaW5lIEdQU19TX01fV1JUICAgICAyNTYKLSNkZWZpbmUgR1BTX1NfTV9WRUMgICAgIDUxMgotI2RlZmluZSBHUFNfU19LX05BTUUgICAgOQotI2RlZmluZSBHUFNfU19DX05BTUUgICAgOQotCi0jZGVmaW5lIEVHUFNfU19WX1BJQwkweDAwMDEKLSNkZWZpbmUgRUdQU19TX1ZfTElCCTB4MDAwMgotI2RlZmluZSBFR1BTX1NfVl9PVlIJMHgwMDA0Ci0jZGVmaW5lIEVHUFNfU19WX1JFTAkweDAwMDgKLSNkZWZpbmUgRUdQU19TX1ZfR0JMCTB4MDAxMAotI2RlZmluZSBFR1BTX1NfVl9TSFIJMHgwMDIwCi0jZGVmaW5lIEVHUFNfU19WX0VYRQkweDAwNDAKLSNkZWZpbmUgRUdQU19TX1ZfUkQJMHgwMDgwCi0jZGVmaW5lIEVHUFNfU19WX1dSVAkweDAxMDAKLSNkZWZpbmUgRUdQU19TX1ZfVkVDCTB4MDIwMAotI2RlZmluZSBFR1BTX1NfVl9OT01PRAkweDA0MDAKLSNkZWZpbmUgRUdQU19TX1ZfQ09NCTB4MDgwMAotCi0jZGVmaW5lIEdTWV9TX01fV0VBSyAgICAxCi0jZGVmaW5lIEdTWV9TX01fREVGICAgICAyCi0jZGVmaW5lIEdTWV9TX01fVU5JICAgICA0Ci0jZGVmaW5lIEdTWV9TX01fUkVMICAgICA4Ci0KLSNkZWZpbmUgRUdTWV9TX1ZfV0VBSwkweDAwMDEKLSNkZWZpbmUgRUdTWV9TX1ZfREVGCTB4MDAwMgotI2RlZmluZSBFR1NZX1NfVl9VTkkJMHgwMDA0Ci0jZGVmaW5lIEVHU1lfU19WX1JFTAkweDAwMDgKLSNkZWZpbmUgRUdTWV9TX1ZfQ09NTQkweDAwMTAKLSNkZWZpbmUgRUdTWV9TX1ZfVkVDRVAJMHgwMDIwCi0jZGVmaW5lIEVHU1lfU19WX05PUk0JMHgwMDQwCi0KLSNkZWZpbmUgTFNZX1NfTV9ERUYgICAgIDIKLSNkZWZpbmUgTFNZX1NfTV9SRUwgICAgIDgKLQotI2RlZmluZSBFTlZfU19NX0RFRiAgICAgMQotI2RlZmluZSBFTlZfU19NX05FU1RFRCAgMgotCi0vKgotICoJRGVidWdnZXIgc3ltYm9sIGRlZmluaXRpb25zOiAgVGhlc2UgYXJlIGRvbmUgYnkgaGFuZCwgYXMgbm8KLSAqCQkJCQltYWNoaW5lLXJlYWRhYmxlIHZlcnNpb24gc2VlbXMKLSAqCQkJCQl0byBiZSBhdmFpbGFibGUuCi0gKi8KLSNkZWZpbmUgRFNUX1NfQ19DCQkgIDcJLyogTGFuZ3VhZ2UgPT0gIkMiCSovCi0jZGVmaW5lIERTVF9TX0NfQ1hYCQkgMTUJLyogTGFuZ3VhZ2UgPT0gIkMrKyIJKi8KLSNkZWZpbmUgRFNUX1NfQ19WRVJTSU9OCQkxNTMKLSNkZWZpbmUJRFNUX1NfQ19TT1VSQ0UJCTE1NQkvKiBTb3VyY2UgZmlsZQkJKi8KLSNkZWZpbmUgRFNUX1NfQ19QUk9MT0cJCTE2MgotI2RlZmluZQlEU1RfU19DX0JMS0JFRwkJMTc2CS8qIEJlZ2lubmluZyBvZiBibG9jawkqLwotI2RlZmluZQlEU1RfU19DX0JMS0VORAkJMTc3CS8qIEVuZCBvZiBibG9jawkqLwotI2RlZmluZSBEU1RfU19DX0VOVFJZCQkxODEKLSNkZWZpbmUgRFNUX1NfQ19QU0VDVAkJMTg0Ci0jZGVmaW5lCURTVF9TX0NfTElORV9OVU0JMTg1CS8qIExpbmUgTnVtYmVyCQkqLwotI2RlZmluZSBEU1RfU19DX0xCTE9STElUCTE4NgotI2RlZmluZSBEU1RfU19DX0xBQkVMCQkxODcKLSNkZWZpbmUJRFNUX1NfQ19NT0RCRUcJCTE4OAkvKiBCZWdpbm5pbmcgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfTU9ERU5ECQkxODkJLyogRW5kIG9mIG1vZHVsZQkqLwotI2RlZmluZQlEU1RfU19DX1JUTkJFRwkJMTkwCS8qIEJlZ2lubmluZyBvZiByb3V0aW5lCSovCi0jZGVmaW5lCURTVF9TX0NfUlRORU5ECQkxOTEJLyogRW5kIG9mIHJvdXRpbmUJKi8KLSNkZWZpbmUJRFNUX1NfQ19ERUxUQV9QQ19XCTEJLyogSW5jciBQQwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU0JMgkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU1fVwkzCS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0lOQ1IJNAotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSX1cgNQotI2RlZmluZSBEU1RfU19DX1JFU0VUX0xJTlVNX0lOQ1IgNgotI2RlZmluZSBEU1RfU19DX0JFR19TVE1UX01PREUJNwotI2RlZmluZSBEU1RfU19DX0VORF9TVE1UX01PREUJOAotI2RlZmluZQlEU1RfU19DX1NFVF9MSU5FX05VTQk5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfUEMJCTEwCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX1cJMTEKLSNkZWZpbmUgRFNUX1NfQ19TRVRfUENfTAkxMgotI2RlZmluZSBEU1RfU19DX1NFVF9TVE1UTlVNCTEzCi0jZGVmaW5lIERTVF9TX0NfVEVSTQkJMTQJLyogRW5kIG9mIGxpbmVzCSovCi0jZGVmaW5lIERTVF9TX0NfVEVSTV9XCQkxNQkvKiBFbmQgb2YgbGluZXMJKi8KLSNkZWZpbmUJRFNUX1NfQ19TRVRfQUJTX1BDCTE2CS8qIFNldCBQQwkqLwotI2RlZmluZQlEU1RfU19DX0RFTFRBX1BDX0wJMTcJLyogSW5jciBQQwkqLwotI2RlZmluZSBEU1RfU19DX0lOQ1JfTElOVU1fTAkxOAkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9CCTE5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfTElOVU1fTAkyMAkvKiBTZXQgTGluZSAjCSovCi0jZGVmaW5lCURTVF9TX0NfVEVSTV9MCQkyMQkvKiBFbmQgb2YgbGluZXMJKi8KLS8qIHRoZXNlIGFyZSB1c2VkIHdpdGggRFNUX1NfQ19TT1VSQ0UgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVDTEZJTEUJIDEJLyogRGVjbGFyZSBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRGSUxFCSAyCS8qIFNldCBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfTAkgMwkvKiBTZXQgcmVjb3JkLCBsb25nd29yZCB2YWx1ZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfVwkgNAkvKiBTZXQgcmVjb3JkLCB3b3JkIHZhbHVlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0RFRkxJTkVTX1cJMTAJLyogIyBvZiBsaW5lLCB3b3JkIGNvdW50ZXIgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfQgkxMQkvKiAjIG9mIGxpbmUsIGJ5dGUgY291bnRlciAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19GT1JNRkVFRAkxNgkvKiBeTCBjb3VudHMgYXMgYSByZWNvcmQgKi8KLS8qIHRoZSBmb2xsb3dpbmcgYXJlIHRoZSBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgZGF0YSB0eXBlcy4gIEFueXRoaW5nIG5vdCBvbgotICogdGhlIGxpc3QgaXMgaW5jbHVkZWQgdW5kZXIgJ2FkdmFuY2VkX3R5cGUnCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQ0hBUgkJMHgwMgotI2RlZmluZSBEQkdfU19DX1VTSU5UCQkweDAzCi0jZGVmaW5lIERCR19TX0NfVUxJTlQJCTB4MDQKLSNkZWZpbmUgREJHX1NfQ19VUVVBRAkJMHgwNQotI2RlZmluZSBEQkdfU19DX1NDSEFSCQkweDA2Ci0jZGVmaW5lIERCR19TX0NfU1NJTlQJCTB4MDcKLSNkZWZpbmUgREJHX1NfQ19TTElOVAkJMHgwOAotI2RlZmluZSBEQkdfU19DX1NRVUFECQkweDA5Ci0jZGVmaW5lIERCR19TX0NfUkVBTDQJCTB4MGEKLSNkZWZpbmUgREJHX1NfQ19SRUFMOAkJMHgwYgkJLyogRF9mbG9hdCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19DT01QTFg0CQkweDBjCQkvKiAyeEZfZmxvYXQgY29tcGxleCBmbG9hdCAqLwotI2RlZmluZSBEQkdfU19DX0NPTVBMWDgJCTB4MGQJCS8qIDJ4RF9mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX1JFQUw4X0cJCTB4MWIJCS8qIEdfZmxvYXQgZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfQ09NUExYOF9HCTB4MWQJCS8qIDJ4R19mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX0ZVTkNUSU9OX0FERFIJMHgxNwotI2RlZmluZSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUJMHhhMwotLyogIFNvbWUgb2YgdGhlc2UgYXJlIGp1c3QgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICBbcHJdCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUQQkJMHgwMQkvKiB1bnNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUVQkJMHgyMgkvKiB1bnNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1NCSVRBCQkweDI5CS8qIHNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19TQklUVQkJMHgyYQkvKiBzaWduZWQsIHVuYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19DU1RSSU5HCQkweDJlCS8qIGFzY2l6ICgnXDAnIHRlcm1pbmF0ZWQpIHN0cmluZyAqLwotI2RlZmluZSBEQkdfU19DX1dDSEFSCQkweDM4CS8qIHdjaGFyX3QgKi8KLS8qICBUaGVzZSBhcmUgZGVzY3JpcHRvciBjbGFzcyBjb2Rlcy4KLSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19TCQkweDAxCS8qIHN0YXRpYyAoZml4ZWQgbGVuZ3RoKSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19ECQkweDAyCS8qIGR5bmFtaWMgc3RyaW5nIChub3QgdmlhIG1hbGxvYyEpICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX0EJCTB4MDQJLyogYXJyYXkgKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfVUJTCQkweDBkCS8qIHVuYWxpZ25lZCBiaXQgc3RyaW5nICovCi0vKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkZWZpbml0aW9ucyBvZiBzdHJ1Y3QKLSAqICB1bmlvbiBhbmQgZW51bSByZWNvcmRzCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19FTlVNX0lURU0JCTB4YTQKLSNkZWZpbmUgREJHX1NfQ19FTlVNX1NUQVJUCQkweGE1Ci0jZGVmaW5lIERCR19TX0NfRU5VTV9FTkQJCTB4YTYKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1RfSVRFTQkJRFNUX0tfVkZMQUdTX0JJVE9GRlMJLyogMHhmZiAqLwotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9TVEFSVAkJMHhhYgotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9FTkQJCTB4YWMKLSNkZWZpbmUgRFNUX0tfVFlQU1BFQwkJCTB4YWYJCS8qIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotLyogVGhlc2UgY29kZXMgYXJlIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZHMKLSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfTk9WQUwJCTB4ODAJLyogc3RydWN0IGRlZmluaXRpb24gb25seSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfRFNDCQkweGZhCS8qIGRlc2NyaXB0b3IgdXNlZCAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfVFZTCQkweGZiCS8qIHRyYWlsaW5nIHZhbHVlIHNwZWNpZmllZCAqLwotI2RlZmluZSBEU1RfS19WU19GT0xMT1dTCQkweGZkCS8qIHZhbHVlIHNwZWMgZm9sbG93cyAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfQklUT0ZGUwkJMHhmZgkvKiB2YWx1ZSBjb250YWlucyBiaXQgb2Zmc2V0ICovCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfTElURVJBTAkwCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfQUREUgkxCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfREVTQwkyCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfUkVHCTMKLSNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9BUAkweDBjCS8qIFIxMiAqLwotI2RlZmluZSBEU1RfS19SRUdfVkFYX0ZQCTB4MGQJLyogUjEzICovCi0jZGVmaW5lIERTVF9LX1JFR19WQVhfU1AJMHgwZQkvKiBSMTQgKi8KLSNkZWZpbmUgRFNUX1ZfVkFMS0lORAkJMAkvKiBvZmZzZXQgb2YgdmFsa2luZCBmaWVsZCAqLwotI2RlZmluZSBEU1RfVl9JTkRJUkVDVAkJMgkvKiBvZmZzZXQgdG8gaW5kaXJlY3QgYml0ICovCi0jZGVmaW5lIERTVF9WX0RJU1AJCTMJLyogb2Zmc2V0IHRvIGRpc3BsYWNlbWVudCBiaXQgKi8KLSNkZWZpbmUgRFNUX1ZfUkVHTlVNCQk0CS8qIG9mZnNldCB0byByZWdpc3RlciBudW1iZXIgKi8KLSNkZWZpbmUgRFNUX01fSU5ESVJFQ1QJCSgxPDxEU1RfVl9JTkRJUkVDVCkKLSNkZWZpbmUgRFNUX01fRElTUAkJKDE8PERTVF9WX0RJU1ApCi0jZGVmaW5lIERCR19DX0ZVTkNUSU9OX1BBUkFNCS8qIDB4YzkgKi8JXAotCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9BUDw8RFNUX1ZfUkVHTlVNKSkKLSNkZWZpbmUgREJHX0NfTE9DQUxfU1lNCQkvKiAweGQ5ICovCVwKLQkoRFNUX0tfVkFMS0lORF9BRERSfERTVF9NX0RJU1B8KERTVF9LX1JFR19WQVhfRlA8PERTVF9WX1JFR05VTSkpCi0vKiBLaW5kcyBvZiB2YWx1ZSBzcGVjaWZpY2F0aW9ucwotICovCi0jZGVmaW5lIERTVF9LX1ZTX0FMTE9DX1NQTElUCTMJLyogc3BsaXQgbGlmZXRpbWUgKi8KLS8qIEtpbmRzIG9mIHR5cGUgc3BlY2lmaWNhdGlvbnMKLSAqLwotI2RlZmluZSBEU1RfS19UU19BVE9NCQkweDAxCS8qIGF0b21pYyB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfRFNDCQkweDAyCS8qIGRlc2NyaXB0b3IgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX0lORAkJMHgwMwkvKiBpbmRpcmVjdCB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfVFBUUgkJMHgwNAkvKiB0eXBlZCBwb2ludGVyIHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19QVFIJCTB4MDUJLyogcG9pbnRlciB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfQVJSQVkJCTB4MDcJLyogYXJyYXkgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX05PVl9MRU5HCTB4MGUJLyogbm92ZWwgbGVuZ3RoIHR5cGUgc3BlYyAqLwotLyogIFRoZXNlIGFyZSB0aGUgY29kZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgc3VmZml4IHJlY29yZHMgdG8gZGV0ZXJtaW5lIHRoZQotICogIGFjdHVhbCBkYXRhIHR5cGUKLSAqLwotI2RlZmluZSBEQkdfU19DX0JBU0lDCQkJRFNUX0tfVFNfQVRPTQotI2RlZmluZSBEQkdfU19DX0JBU0lDX0FSUkFZCQlEU1RfS19UU19EU0MKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1QJCQlEU1RfS19UU19JTkQKLSNkZWZpbmUgREJHX1NfQ19QT0lOVEVSCQkJRFNUX0tfVFNfVFBUUgotI2RlZmluZSBEQkdfU19DX1ZPSUQJCQlEU1RfS19UU19QVFIKLSNkZWZpbmUgREJHX1NfQ19DT01QTEVYX0FSUkFZCQlEU1RfS19UU19BUlJBWQotCi0vKiBWTVMgTW9kdWxlIGhlYWRlciByZWNvcmQgKEVNSCkgZGVmaW5pdGlvbnMuICAqLwotCi0jZGVmaW5lIE1IRF9TX0NfTUhEIDAKLSNkZWZpbmUgTUhEX1NfQ19MTk0gMQotI2RlZmluZSBNSERfU19DX1NSQyAyCi0jZGVmaW5lIE1IRF9TX0NfVFRMIDMKLSNkZWZpbmUgTUhEX1NfQ19DUFIgNAotI2RlZmluZSBNSERfU19DX01UQyA1Ci0jZGVmaW5lIE1IRF9TX0NfR1RYIDYKLSNkZWZpbmUgTUhEX1NfQ19NQVhIRFJUWVAgNgotCi0jZGVmaW5lIEVNSF9TX0NfTUhEIDAJCS8qIE1haW4gaGVhZGVyIHJlY29yZAkJKi8KLSNkZWZpbmUgRU1IX1NfQ19MTk0gMQkJLyogTGFuZ3VhZ2UgbmFtZSBhbmQgdmVyc2lvbgkqLwotI2RlZmluZSBFTUhfU19DX1NSQyAyCQkvKiBTb3VyY2UgZmlsZSBzcGVjaWZpY2F0aW9uCSovCi0jZGVmaW5lIEVNSF9TX0NfVFRMIDMJCS8qIFRpdGxlIHRleHQgb2YgbW9kdWxlCQkqLwotI2RlZmluZSBFTUhfU19DX0NQUiA0CQkvKiBDb3B5cmlnaHQgbm90aWNlCQkqLwotI2RlZmluZSBFTUhfU19DX01UQyA1CQkvKiBNYWludGVuYW5jZSBzdGF0dXMJCSovCi0jZGVmaW5lIEVNSF9TX0NfR1RYIDYJCS8qIEdlbmVyYWwgdGV4dAkJCSovCi0jZGVmaW5lIEVNSF9TX0NfTUFYSERSVFlQIDYJLyogTWF4aW11bSBhbGxvd2FibGUgdHlwZQkqLwotCi0vKiB2bXMuYy4gICovCi0KLWV4dGVybiBhc3ltYm9sICpfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogdm1zLWdzZC5jLiAgKi8KLQotZXh0ZXJuIGludCBfYmZkX3Ztc19zbHVycF9nc2QgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9nc2QgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotCi0vKiB2bXMtbWhkLmMuICAqLwotCi1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2hkciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2hkciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2VvbSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2VvbSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci0KLS8qIHZtcy10aXIuYy4gICovCi0KLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfdGlyIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfZGJnIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfdGJ0IFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfbG5rIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLQotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV90aXIgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV90YnQgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9kYmcgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotCi0vKiBUaGUgcl90eXBlIGZpZWxkIGluIGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JR05PUkUJCTAKLSNkZWZpbmUgQUxQSEFfUl9SRUZRVUFECQkxCi0jZGVmaW5lIEFMUEhBX1JfQlJBRERSCQkyCi0jZGVmaW5lIEFMUEhBX1JfSElOVAkJMwotI2RlZmluZSBBTFBIQV9SX1NSRUwxNgkJNAotI2RlZmluZSBBTFBIQV9SX1NSRUwzMgkJNQotI2RlZmluZSBBTFBIQV9SX1NSRUw2NAkJNgotI2RlZmluZSBBTFBIQV9SX09QX1BVU0gJCTcKLSNkZWZpbmUgQUxQSEFfUl9PUF9TVE9SRQk4Ci0jZGVmaW5lIEFMUEhBX1JfT1BfUFNVQgkJOQotI2RlZmluZSBBTFBIQV9SX09QX1BSU0hJRlQJMTAKLSNkZWZpbmUgQUxQSEFfUl9MSU5LQUdFCQkxMQotI2RlZmluZSBBTFBIQV9SX1JFRkxPTkcJCTEyCi0jZGVmaW5lIEFMUEhBX1JfQ09ERUFERFIJMTMKLQotLyogT2JqZWN0IGxhbmd1YWdlIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBPQkpfU19DX0hEUiAwCQkvKlZBWCBtb2R1bGUgaGVhZGVyIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19HU0QgMQkJLypWQVggZ2xvYmFsIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZAkqLwotI2RlZmluZSBPQkpfU19DX1RJUiAyCQkvKlZBWCB0ZXh0IGluZm9ybWF0aW9uIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19FT00gMwkJLypWQVggZW5kIG9mIG1vZHVsZSByZWNvcmQJCSovCi0jZGVmaW5lIE9CSl9TX0NfREJHIDQJCS8qVkFYIERlYnVnZ2VyIGluZm9ybWF0aW9uIHJlY29yZAkqLwotI2RlZmluZSBPQkpfU19DX1RCVCA1CQkvKlZBWCBUcmFjZWJhY2sgaW5mb3JtYXRpb24gcmVjb3JkCSovCi0jZGVmaW5lIE9CSl9TX0NfTE5LIDYJCS8qVkFYIGxpbmtlciBvcHRpb25zIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19FT01XIDcJCS8qVkFYIGVuZCBvZiBtb2R1bGUgd29yZC1wc2VjdCByZWNvcmQJKi8KLSNkZWZpbmUgT0JKX1NfQ19NQVhSRUNUWVAgNwkvKlZBWCBMYXN0IGFzc2lnbmVkIHJlY29yZCB0eXBlCQkqLwotI2RlZmluZSBFT0JKX1NfQ19FTUggOAkJLypFVkFYIG1vZHVsZSBoZWFkZXIgcmVjb3JkCQkqLwotI2RlZmluZSBFT0JKX1NfQ19FRU9NIDkJCS8qRVZBWCBlbmQgb2YgbW9kdWxlIHJlY29yZAkJKi8KLSNkZWZpbmUgRU9CSl9TX0NfRUdTRCAxMAkvKkVWQVggZ2xvYmFsIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZCAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfRVRJUiAxMQkvKkVWQVggdGV4dCBpbmZvcm1hdGlvbiByZWNvcmQJCSovCi0jZGVmaW5lIEVPQkpfU19DX0VEQkcgMTIJLypFVkFYIERlYnVnZ2VyIGluZm9ybWF0aW9uIHJlY29yZAkqLwotI2RlZmluZSBFT0JKX1NfQ19FVEJUIDEzCS8qRVZBWCBUcmFjZWJhY2sgaW5mb3JtYXRpb24gcmVjb3JkCSovCi0jZGVmaW5lIEVPQkpfU19DX01BWFJFQ1RZUCAxMwkvKkVWQVggTGFzdCBhc3NpZ25lZCByZWNvcmQgdHlwZQkqLwotI2RlZmluZSBPQkpfU19LX1NVQlRZUCAxCi0jZGVmaW5lIE9CSl9TX0NfU1VCVFlQIDEKLSNkZWZpbmUgRU9CSl9TX0tfU1VCVFlQIDQKLSNkZWZpbmUgRU9CSl9TX0NfU1VCVFlQIDQKLSNkZWZpbmUgT0JKX1NfQ19NQVhSRUNTSVogMjA0OAkvKk1heGltdW0gbGVnYWwgcmVjb3JkIHNpemUgICAgICAgICAqLwotI2RlZmluZSBFT0JKX1NfQ19NQVhSRUNTSVogODE5MiAvKk1heGltdW0gbGVnYWwgcmVjb3JkIHNpemUgICAgICAgICAqLwotI2RlZmluZSBPQkpfU19DX1NUUkxWTCAwCS8qU3RydWN0dXJlIGxldmVsICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEVPQkpfU19DX1NUUkxWTCAyCS8qU3RydWN0dXJlIGxldmVsICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9CSl9TX0NfU1lNU0laIDMxCS8qTWF4aW11bSBzeW1ib2wgbGVuZ3RoCQkqLwotI2RlZmluZSBFT0JKX1NfQ19TWU1TSVogNjQJLypNYXhpbXVtIHN5bWJvbCBsZW5ndGgJCSovCi0jZGVmaW5lIEVPQkpfU19DX1NFQ1NJWiAzMQkvKk1heGltdW0gc2VjdGlvbiBuYW1lIGxlbmd0aAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19TVE9SRVBMSU0gLTEJLypNYXhpbXVtIHJlcGVhdCBjb3VudCBvbiBzdG9yZSBjb21tYW5kcyAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfU1RPUkVQTElNIC0xCS8qTWF4aW11bSByZXBlYXQgY291bnQgb24gc3RvcmUgY29tbWFuZHMgICovCi0jZGVmaW5lIE9CSl9TX0NfUFNDQUxJTElNIDkJLypNYXhpbXVtIHAtc2VjdCBhbGlnbm1lbnQgICAgICAgICAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfUFNDQUxJTElNIDE2CS8qTWF4aW11bSBwLXNlY3QgYWxpZ25tZW50ICAgICAgICAgICovCi0KLSNkZWZpbmUgRVZBWF9PRkZTRVQJMjU2CS8qdHlwZSBvZmZzZXQgZm9yIEVWQVggY29kZXMgaW4gc3dpdGNoICAqLwotLyogTWlzY2VsbGFuZW91cyBkZWZpbml0aW9ucy4gICovCi0KLSNpZiBfX0dOVUNfXwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdXF1YWQ7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVxdWFkOwotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX09VVFJFQ19TSVpFIDQwOTYKLSNkZWZpbmUgTUlOX09VVFJFQ19MVUZUIDY0Ci0KLXR5cGVkZWYgc3RydWN0IF92bXNfc2VjdGlvbiB7Ci0gIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBzdHJ1Y3QgX3Ztc19zZWN0aW9uICpuZXh0OwotfSB2bXNfc2VjdGlvbjsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zYXZlX3Ztc19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiBkYXRhLCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotZXh0ZXJuIHZtc19zZWN0aW9uICpfYmZkX2dldF92bXNfc2VjdGlvbiBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBpbmRleCkpOwotCi10eXBlZGVmIHN0cnVjdCBfdm1zX3JlbG9jIHsKLSAgc3RydWN0IF92bXNfcmVsb2MgKm5leHQ7Ci0gIGFyZWxlbnQgKnJlbG9jOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLX0gdm1zX3JlbG9jOwotCi0vKiB2bXMgbW9kdWxlIGhlYWRlciAgKi8KLQotc3RydWN0IGhkcl9zdHJ1YyB7Ci0gIGludCBoZHJfYl9zdHJsdmw7Ci0gIGxvbmcgaGRyX2xfYXJjaDE7Ci0gIGxvbmcgaGRyX2xfYXJjaDI7Ci0gIGxvbmcgaGRyX2xfcmVjc2l6OwotICBjaGFyICpoZHJfdF9uYW1lOwotICBjaGFyICpoZHJfdF92ZXJzaW9uOwotICBjaGFyICpoZHJfdF9kYXRlOwotICBjaGFyICpoZHJfY19sbm07Ci0gIGNoYXIgKmhkcl9jX3NyYzsKLSAgY2hhciAqaGRyX2NfdHRsOwotfTsKLQotCi0vKiB2bXMgZW5kIG9mIG1vZHVsZSAgKi8KLQotc3RydWN0IGVvbV9zdHJ1YyB7Ci0gIGxvbmcgZW9tX2xfdG90YWxfbHBzOwotICB1bnNpZ25lZCBjaGFyIGVvbV9iX2NvbWNvZDsKLSAgYm9vbGVhbiBlb21faGFzX3RyYW5zZmVyOwotICB1bnNpZ25lZCBjaGFyIGVvbV9iX3RmcmZsZzsKLSAgbG9uZyBlb21fbF9wc2luZHg7Ci0gIGxvbmcgZW9tX2xfdGZyYWRyOwotfTsKLQotZW51bSBmaWxlX2Zvcm1hdF9lbnVtIHsgRkZfVU5LTk9XTiwgRkZfRk9SRUlHTiwgRkZfTkFUSVZFLCBGRl9WQVggfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgdm1zX3N5bWJvbF9zdHJ1Y3QgewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgYmZkX2hhc2g7Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLX0gdm1zX3N5bWJvbF9lbnRyeTsKLQotLyogc3RhY2sgdmFsdWUgZm9yIHB1c2gvcG9wIGNvbW1hbmRzICAqLwotCi1zdHJ1Y3Qgc3RhY2tfc3RydWN0IHsKLSAgdXF1YWQgdmFsdWU7Ci0gIGludCBwc2VjdDsKLX07Ci0jZGVmaW5lIFNUQUNLU0laRSA4MTkyCi0KLS8qIGxvY2F0aW9uIHN0YWNrIGRlZmluaXRpb25zIGZvciBDVExfREZMT0MsIENUTF9TVExPQywgYW5kIENUTF9TVEtETCAgKi8KLQotc3RydWN0IGxvY2F0aW9uX3N0cnVjdCB7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIGludCBwc2VjdDsKLX07Ci0jZGVmaW5lIExPQ0FUSU9OX1NBVkVfU0laRSAzMgotCi0jZGVmaW5lIFZNU19TRUNUSU9OX0NPVU5UIDEwMjQKLQotc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0IHsKLSAgaW50IGlzX3ZheDsKLSAgYm9vbGVhbiBmaXh1cF9kb25lOwkJCS8qIEZsYWcgdG8gaW5kaWNhdGUgaWYgYWxsCi0JCQkJCSAgIHNlY3Rpb24gcG9pbnRlcnMgYW5kIFBSSVYoc2VjdGlvbnMpCi0JCQkJCSAgIGFyZSBzZXQgdXAgY29ycmVjdGx5ICAqLwotICB1bnNpZ25lZCBjaGFyICp2bXNfYnVmOwkJLyogYnVmZmVyIHRvIHJlY29yZCAgKi8KLSAgaW50IGJ1Zl9zaXplOwkJCQkvKiBtYXggc2l6ZSBvZiBidWZmZXIgICovCi0gIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CQkvKiBhY3R1YWwgcmVjb3JkIHB0ciAgKi8KLSAgaW50IHJlY19sZW5ndGg7CQkJLyogcmVtYWluaW5nIHJlY29yZCBsZW5ndGggICovCi0gIGludCByZWNfc2l6ZTsJCQkJLyogYWN0dWFsIHJlY29yZCBzaXplICAqLwotICBpbnQgcmVjX3R5cGU7CQkJCS8qIGFjdHVhbCByZWNvcmQgdHlwZSAgKi8KLSAgZW51bSBmaWxlX2Zvcm1hdF9lbnVtIGZpbGVfZm9ybWF0OwotCi0gIHN0cnVjdCBoZHJfc3RydWMgaGRyX2RhdGE7CQkvKiBkYXRhIGZyb20gSERSL0VNSCByZWNvcmQgICovCi0gIHN0cnVjdCBlb21fc3RydWMgZW9tX2RhdGE7CQkvKiBkYXRhIGZyb20gRU9NL0VFT00gcmVjb3JkICAqLwotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudDsJCS8qICMgb2Ygc2VjdGlvbnMgaW4gZm9sbG93aW5nIGFycmF5ICAqLwotICBhc2VjdGlvbiAqKnNlY3Rpb25zOwkJCS8qIGFycmF5IG9mIEdTRC9FR1NEIHNlY3Rpb25zICAqLwotICBpbnQgZ3NkX3N5bV9jb3VudDsJCQkvKiAjIG9mIEdTRC9FR1NEIHN5bWJvbHMgICovCi0gIGFzeW1ib2wgKipzeW1ib2xzOwkJCS8qIHZlY3RvciBvZiBHU0QvRUdTRCBzeW1ib2xzICAqLwotICBzdHJ1Y3QgcHJvY192YWx1ZSAqcHJvY2VkdXJlOwotCi0gIHN0cnVjdCBzdGFja19zdHJ1Y3QgKnN0YWNrOwotICBpbnQgc3RhY2twdHI7Ci0KLSAgdm1zX3NlY3Rpb24gKnZtc19zZWN0aW9uX3RhYmxlW1ZNU19TRUNUSU9OX0NPVU5UXTsKLQotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnZtc19zeW1ib2xfdGFibGU7Ci0gIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1jYWNoZTsKLSAgaW50IHN5bW51bTsKLQotICBzdHJ1Y3QgbG9jYXRpb25fc3RydWN0ICpsb2NhdGlvbl9zdGFjazsKLQotICBhc2VjdGlvbiAqaW1hZ2Vfc2VjdGlvbjsJCS8qIHNlY3Rpb24gZm9yIGltYWdlX3B0ciAgKi8KLSAgdW5zaWduZWQgY2hhciAqaW1hZ2VfcHRyOwkJLyogYSBwb2ludGVyIHRvIHNlY3Rpb24tPmNvbnRlbnRzICovCi0KLSAgdW5zaWduZWQgY2hhciBwZHNjWzhdOwkJLyogcHJvY2VkdXJlIGRlc2NyaXB0b3IgKi8KLQotICAvKiBPdXRwdXQgcm91dGluZSBzdG9yYWdlICAqLwotCi0gIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9idWY7CQkvKiBvdXRwdXQgZGF0YSAgKi8KLSAgaW50IHB1c2hfbGV2ZWw7Ci0gIGludCBwdXNoZWRfc2l6ZTsKLSAgaW50IGxlbmd0aF9wb3M7Ci0gIGludCBvdXRwdXRfc2l6ZTsKLSAgaW50IG91dHB1dF9hbGlnbm1lbnQ7Ci0KLSAgLyogbGlua2FnZSBpbmRleCBjb3VudGVyCi0gICB1c2VkIGJ5IGNvbmRpdGlvbmFsIHN0b3JlIGNvbW1hbmRzIChFVElSX1NfQ19TVENfKSAgKi8KLQotICBpbnQgdm1zX2xpbmthZ2VfaW5kZXg7Ci0KLSAgLyogc2VlIHRjLWFscGhhLmMgb2YgZ2FzIGZvciBhIGRlc2NyaXB0aW9uLiAgKi8KLSAgaW50IGZsYWdfaGFzaF9sb25nX25hbWVzOwkvKiAtKywgaGFzaCBpbnN0ZWFkIG9mIHRydW5jYXRlICovCi0gIGludCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmM7CS8qIC1ILCBzaG93IGhhc2hpbmcvdHJ1bmNhdGlvbiAqLwotfTsKLQotI2RlZmluZSBQUklWKG5hbWUpCSgoc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0ICopYWJmZC0+dGRhdGEuYW55KS0+bmFtZQotCi0jZGVmaW5lIFNFQ1RJT05fTkFNRV9URU1QTEFURSAiX19TRUNfXyVkIgotCi0jaWYgVk1TX0RFQlVHCi1leHRlcm4gdm9pZCBfYmZkX3Ztc19kZWJ1ZyBQQVJBTVMoKGludCBsZXZlbCwgY2hhciAqZm9ybWF0LCAuLi4pKTsKLWV4dGVybiB2b2lkIF9iZmRfaGV4ZHVtcAotICBQQVJBTVMgKChpbnQgbGV2ZWwsIHVuc2lnbmVkIGNoYXIgKnB0ciwgaW50IHNpemUsIGludCBvZmZzZXQpKTsKLQotI2RlZmluZSB2bXNfZGVidWcgX2JmZF92bXNfZGVidWcKLSNlbmRpZgotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX3Ztc19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZSwKLQkgICBjb25zdCBjaGFyICpzdHJpbmcpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgKnR5cGUsIGludCAqbGVuZ3RoKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX2dldF9yZWNvcmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX25leHRfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1leHRlcm4gY2hhciAqX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgUEFSQU1TICgodW5zaWduZWQgY2hhciAqc3RyLCBpbnQgc2l6ZSkpOwotZXh0ZXJuIGNoYXIgKl9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgUEFSQU1TICgodW5zaWduZWQgY2hhciAqcHRyKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19wdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCwgdXF1YWQgdmFsLCBpbnQgcHNlY3QpKTsKLWV4dGVybiB1cXVhZCBfYmZkX3Ztc19wb3AgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgKnBzZWN0KSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfc2F2ZV92bXNfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgZGF0YSwgZmlsZV9wdHIgb2Zmc2V0LAotCSAgIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9iZWdpbgotICBQQVJBTVMgKChiZmQgKmFiZmQsIGludCByZWN0eXBlLCBpbnQgcmVjaGVhZCkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBhbGlnbnRvKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfcHVzaCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9wb3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19vdXRwdXRfY2hlY2sgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgc2l6ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2J5dGUgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgdmFsdWUpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9zaG9ydCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCB2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2xvbmcgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBsb25nIHZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfcXVhZCBQQVJBTVMgKChiZmQgKmFiZmQsIHVxdWFkIHZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBQQVJBTVMgKChiZmQgKmFiZmQsIGNoYXIgKnZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZHVtcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCi0JCQkJCSAgIGludCBsZW5ndGgpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9maWxsIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IHZhbHVlLCBpbnQgbGVuZ3RoKSk7Ci1leHRlcm4gY2hhciAqX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgY2hhciAqaW4sIGludCBtYXhsZW4pKTsKLQotZXh0ZXJuIHZtc19zeW1ib2xfZW50cnkgKl9iZmRfdm1zX2VudGVyX3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQsIGNoYXIgKm5hbWUpKTsKLQotI2VuZGlmIC8qIFZNU19IICovCmRpZmYgLS1naXQgYS9iZmQveGNvZmZsaW5rLmMgYi9iZmQveGNvZmZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYzc1YmQuLjAwMDAwMDAKLS0tIGEvYmZkL3hjb2ZmbGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjY0MCArMCwwIEBACi0vKiBQT1dFUi9Qb3dlclBDIFhDT0ZGIGxpbmtlciBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPiwgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0vKiBUaGlzIGZpbGUgaG9sZHMgdGhlIFhDT0ZGIGxpbmtlciBjb2RlLiAgKi8KLQotI2RlZmluZSBTVFJJTkdfU0laRV9TSVpFICg0KQotCi0vKiBJbiBvcmRlciB0byBzdXBwb3J0IGxpbmtpbmcgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMgaW50byBhbgotICAgWENPRkYgZm9ybWF0LCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwYXJ0aWN1bGFyCi0gICBiZmRfdGFyZ2V0IGlzIGFuIFhDT0ZGIHZlY3Rvci4gIEZJWE1FOiBXZSBuZWVkIHRvIHJldGhpbmsgdGhpcwotICAgd2hvbGUgYXBwcm9hY2guICAqLwotI2RlZmluZSBYQ09GRl9YVkVDUCh4dikgXAotICAoc3RyY21wICgoeHYpLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSA9PSAwIFwKLSAgIHx8IHN0cmNtcCAoKHh2KS0+bmFtZSwgInhjb2ZmLXBvd2VybWFjIikgPT0gMCkKLQotLyogR2V0IHRoZSBYQ09GRiBoYXNoIHRhYmxlIGVudHJpZXMgZm9yIGEgQkZELiAgKi8KLSNkZWZpbmUgb2JqX3hjb2ZmX3N5bV9oYXNoZXMoYmZkKSBcCi0gICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikgb2JqX2NvZmZfc3ltX2hhc2hlcyAoYmZkKSkKLQotLyogWENPRkYgcmVsb2NhdGlvbiB0eXBlcy4gIFRoZXNlIHByb2JhYmx5IGJlbG9uZyBpbiBhIGhlYWRlciBmaWxlCi0gICBzb21ld2hlcmUuICBUaGUgcmVsb2NhdGlvbnMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgZnVuY3Rpb24KLSAgIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gaW4gdGhpcyBmaWxlLiAgKi8KLQotI2RlZmluZSBSX1BPUyAgICgweDAwKQotI2RlZmluZSBSX05FRyAgICgweDAxKQotI2RlZmluZSBSX1JFTCAgICgweDAyKQotI2RlZmluZSBSX1RPQyAgICgweDAzKQotI2RlZmluZSBSX1JUQiAgICgweDA0KQotI2RlZmluZSBSX0dMICAgICgweDA1KQotI2RlZmluZSBSX1RDTCAgICgweDA2KQotI2RlZmluZSBSX0JBICAgICgweDA4KQotI2RlZmluZSBSX0JSICAgICgweDBhKQotI2RlZmluZSBSX1JMICAgICgweDBjKQotI2RlZmluZSBSX1JMQSAgICgweDBkKQotI2RlZmluZSBSX1JFRiAgICgweDBmKQotI2RlZmluZSBSX1RSTCAgICgweDEyKQotI2RlZmluZSBSX1RSTEEgICgweDEzKQotI2RlZmluZSBSX1JSVEJJICgweDE0KQotI2RlZmluZSBSX1JSVEJBICgweDE1KQotI2RlZmluZSBSX0NBSSAgICgweDE2KQotI2RlZmluZSBSX0NSRUwgICgweDE3KQotI2RlZmluZSBSX1JCQSAgICgweDE4KQotI2RlZmluZSBSX1JCQUMgICgweDE5KQotI2RlZmluZSBSX1JCUiAgICgweDFhKQotI2RlZmluZSBSX1JCUkMgICgweDFiKQotCi0vKiBUaGUgZmlyc3Qgd29yZCBvZiBnbG9iYWwgbGlua2FnZSBjb2RlLiAgVGhpcyBtdXN0IGJlIG1vZGlmaWVkIGJ5Ci0gICBmaWxsaW5nIGluIHRoZSBjb3JyZWN0IFRPQyBvZmZzZXQuICAqLwotCi0jZGVmaW5lIFhDT0ZGX0dMSU5LX0ZJUlNUICgweDgxODIwMDAwKQkvKiBsd3ogcjEyLDAocjIpICovCi0KLS8qIFRoZSByZW1haW5pbmcgd29yZHMgb2YgZ2xvYmFsIGxpbmthZ2UgY29kZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHhjb2ZmX2dsaW5rX2NvZGVbXSA9Ci17Ci0gIDB4OTA0MTAwMTQsCS8qIHN0dyByMiwyMChyMSkgKi8KLSAgMHg4MDBjMDAwMCwJLyogbHd6IHIwLDAocjEyKSAqLwotICAweDgwNGMwMDA0LAkvKiBsd3ogcjIsNChyMTIpICovCi0gIDB4N2MwOTAzYTYsCS8qIG10Y3RyIHIwICovCi0gIDB4NGU4MDA0MjAsCS8qIGJjdHIgKi8KLSAgMHgwLAkJLyogc3RhcnQgb2YgdHJhY2ViYWNrIHRhYmxlICovCi0gIDB4MDAwYzgwMDAsCS8qIHRyYWNlYmFjayB0YWJsZSAqLwotICAweDAJCS8qIHRyYWNlYmFjayB0YWJsZSAqLwotfTsKLQotI2RlZmluZSBYQ09GRl9HTElOS19TSVpFIFwKLSAgKCgoc2l6ZW9mIHhjb2ZmX2dsaW5rX2NvZGUgLyBzaXplb2YgeGNvZmZfZ2xpbmtfY29kZVswXSkgKiA0KSArIDQpCi0KLS8qIFdlIHJldXNlIHRoZSBTRUNfUk9NIGZsYWcgYXMgYSBtYXJrIGZsYWcgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4KLSAgIFRoaXMgZmxhZyB3aWxsIG9ubHkgYmUgdXNlZCBvbiBpbnB1dCBzZWN0aW9ucy4gICovCi0KLSNkZWZpbmUgU0VDX01BUksgKFNFQ19ST00pCi0KLS8qIFRoZSBsZGhkciBzdHJ1Y3R1cmUuICBUaGlzIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSAubG9hZGVyCi0gICBzZWN0aW9uLiAgKi8KLQotc3RydWN0IGludGVybmFsX2xkaGRyCi17Ci0gIC8qIFRoZSB2ZXJzaW9uIG51bWJlcjogY3VycmVudGx5IGFsd2F5cyAxLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsX3ZlcnNpb247Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc3ltYm9sIHRhYmxlIGVudHJpZXMuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfbnN5bXM7Ci0gIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiB0YWJsZSBlbnRyaWVzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX25yZWxvYzsKLSAgLyogVGhlIGxlbmd0aCBvZiB0aGUgaW1wb3J0IGZpbGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX2lzdGxlbjsKLSAgLyogVGhlIG51bWJlciBvZiBpbXBvcnQgZmlsZXMuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfbmltcGlkOwotICAvKiBUaGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSAubG9hZGVyIHNlY3Rpb24gdG8gdGhlIGZpcnN0Ci0gICAgIGVudHJ5IGluIHRoZSBpbXBvcnQgZmlsZSB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9pbXBvZmY7Ci0gIC8qIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9zdGxlbjsKLSAgLyogVGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgLmxvYWRlciBzZWN0aW9uIHRvIHRoZSBmaXJzdAotICAgICBlbnRyeSBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX3N0b2ZmOwotfTsKLQotc3RydWN0IGV4dGVybmFsX2xkaGRyCi17Ci0gIGJmZF9ieXRlIGxfdmVyc2lvbls0XTsKLSAgYmZkX2J5dGUgbF9uc3ltc1s0XTsKLSAgYmZkX2J5dGUgbF9ucmVsb2NbNF07Ci0gIGJmZF9ieXRlIGxfaXN0bGVuWzRdOwotICBiZmRfYnl0ZSBsX25pbXBpZFs0XTsKLSAgYmZkX2J5dGUgbF9pbXBvZmZbNF07Ci0gIGJmZF9ieXRlIGxfc3RsZW5bNF07Ci0gIGJmZF9ieXRlIGxfc3RvZmZbNF07Ci19OwotCi0jZGVmaW5lIExESERSU1ogKDggKiA0KQotCi0vKiBUaGUgbGRzeW0gc3RydWN0dXJlLiAgVGhpcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHN5bWJvbCBpbiB0aGUKLSAgIC5sb2FkZXIgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9sZHN5bQotewotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgbmFtZSBpZiA8PSBTWU1OTUxFTiBjaGFyYWN0ZXJzLiAgKi8KLSAgICAgIGNoYXIgX2xfbmFtZVtTWU1OTUxFTl07Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICAvKiBaZXJvIGlmIHRoZSBzeW1ib2wgbmFtZSBpcyBtb3JlIHRoYW4gU1lNTk1MRU4gY2hhcmFjdGVycy4gICovCi0JICBsb25nIF9sX3plcm9lczsKLQkgIC8qIFRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSBpZiB0aGUgc3ltYm9sIG5hbWUgaXMgbW9yZQotICAgICAgICAgICAgIHRoYW4gU1lNTk1MRU4gY2hhcmFjdGVycy4gICovCi0JICBsb25nIF9sX29mZnNldDsKLQl9IF9sX2w7Ci0gICAgfSBfbDsKLSAgLyogVGhlIHN5bWJvbCB2YWx1ZS4gICovCi0gIGJmZF92bWEgbF92YWx1ZTsKLSAgLyogVGhlIHN5bWJvbCBzZWN0aW9uIG51bWJlci4gICovCi0gIHNob3J0IGxfc2NudW07Ci0gIC8qIFRoZSBzeW1ib2wgdHlwZSBhbmQgZmxhZ3MuICAqLwotICBjaGFyIGxfc210eXBlOwotICAvKiBUaGUgc3ltYm9sIHN0b3JhZ2UgY2xhc3MuICAqLwotICBjaGFyIGxfc21jbGFzOwotICAvKiBUaGUgaW1wb3J0IGZpbGUgSUQuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfaWZpbGU7Ci0gIC8qIE9mZnNldCB0byB0aGUgcGFyYW1ldGVyIHR5cGUgY2hlY2sgc3RyaW5nLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX3Bhcm07Ci19OwotCi1zdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0KLXsKLSAgdW5pb24KLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBfbF9uYW1lW1NZTU5NTEVOXTsKLSAgICAgIHN0cnVjdAotCXsKLQkgIGJmZF9ieXRlIF9sX3plcm9lc1s0XTsKLQkgIGJmZF9ieXRlIF9sX29mZnNldFs0XTsKLQl9IF9sX2w7Ci0gICAgfSBfbDsKLSAgYmZkX2J5dGUgbF92YWx1ZVs0XTsKLSAgYmZkX2J5dGUgbF9zY251bVsyXTsKLSAgYmZkX2J5dGUgbF9zbXR5cGVbMV07Ci0gIGJmZF9ieXRlIGxfc21jbGFzWzFdOwotICBiZmRfYnl0ZSBsX2lmaWxlWzRdOwotICBiZmRfYnl0ZSBsX3Bhcm1bNF07Ci19OwotCi0jZGVmaW5lIExEU1lNU1ogKDggKyAzICogNCArIDIgKyAyKQotCi0vKiBUaGVzZSBmbGFncyBhcmUgZm9yIHRoZSBsX3NtdHlwZSBmaWVsZCAodGhlIGxvd2VyIHRocmVlIGJpdHMgYXJlIGFuCi0gICBYVFlfKiB2YWx1ZSkuICAqLwotCi0vKiBJbXBvcnRlZCBzeW1ib2wuICAqLwotI2RlZmluZSBMX0lNUE9SVCAoMHg0MCkKLS8qIEVudHJ5IHBvaW50LiAgKi8KLSNkZWZpbmUgTF9FTlRSWSAoMHgyMCkKLS8qIEV4cG9ydGVkIHN5bWJvbC4gICovCi0jZGVmaW5lIExfRVhQT1JUICgweDEwKQotCi0vKiBUaGUgbGRyZWwgc3RydWN0dXJlLiAgVGhpcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHJlbG9jIGluIHRoZQotICAgLmxvYWRlciBzZWN0aW9uLiAgKi8KLQotc3RydWN0IGludGVybmFsX2xkcmVsCi17Ci0gIC8qIFRoZSByZWxvYyBhZGRyZXNzLiAgKi8KLSAgYmZkX3ZtYSBsX3ZhZGRyOwotICAvKiBUaGUgc3ltYm9sIHRhYmxlIGluZGV4IGluIHRoZSAubG9hZGVyIHNlY3Rpb24gc3ltYm9sIHRhYmxlLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX3N5bW5keDsKLSAgLyogVGhlIHJlbG9jYXRpb24gdHlwZSBhbmQgc2l6ZS4gICovCi0gIHNob3J0IGxfcnR5cGU7Ci0gIC8qIFRoZSBzZWN0aW9uIG51bWJlciB0aGlzIHJlbG9jYXRpb24gYXBwbGllcyB0by4gICovCi0gIHNob3J0IGxfcnNlY25tOwotfTsKLQotc3RydWN0IGV4dGVybmFsX2xkcmVsCi17Ci0gIGJmZF9ieXRlIGxfdmFkZHJbNF07Ci0gIGJmZF9ieXRlIGxfc3ltbmR4WzRdOwotICBiZmRfYnl0ZSBsX3J0eXBlWzJdOwotICBiZmRfYnl0ZSBsX3JzZWNubVsyXTsKLX07Ci0KLSNkZWZpbmUgTERSRUxTWiAoMiAqIDQgKyAyICogMikKLQotLyogVGhlIGxpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKi8KLQotc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlCi17Ci0gIC8qIFRoZSBuZXh0IGVudHJ5IGluIHRoZSBsaXN0LiAgKi8KLSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICpuZXh0OwotICAvKiBUaGUgcGF0aC4gICovCi0gIGNvbnN0IGNoYXIgKnBhdGg7Ci0gIC8qIFRoZSBmaWxlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpmaWxlOwotICAvKiBUaGUgbWVtYmVyIG5hbWUuICAqLwotICBjb25zdCBjaGFyICptZW1iZXI7Ci19OwotCi0vKiBBbiBlbnRyeSBpbiB0aGUgWENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgU2V0IHRvIC0xIGluaXRpYWxseS4gIFNldCB0byAtMiBpZgotICAgICB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgdGhpcyBzeW1ib2wuICAqLwotICBsb25nIGluZHg7Ci0KLSAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGEgVE9DIGVudHJ5IGZvciB0aGlzIHN5bWJvbCwgdGhpcyBpcyB0aGUgLnRjCi0gICAgIHNlY3Rpb24gd2hpY2ggaG9sZHMgaXQuICAqLwotICBhc2VjdGlvbiAqdG9jX3NlY3Rpb247Ci0KLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGNyZWF0ZWQgYSBUT0MgZW50cnkgKHRoZSBYQ09GRl9TRVRfVE9DIGZsYWcgaXMKLQkgc2V0KSwgdGhpcyBpcyB0aGUgb2Zmc2V0IGluIHRvY19zZWN0aW9uLiAgKi8KLSAgICAgIGJmZF92bWEgdG9jX29mZnNldDsKLSAgICAgIC8qIElmIHRoZSBUT0MgZW50cnkgY29tZXMgZnJvbSBhbiBpbnB1dCBmaWxlLCB0aGlzIGlzIHNldCB0byB0aGUKLSAgICAgICAgIHN5bWJvbCBpbmRleCBvZiB0aGUgQ19ISURFWFQgWE1DX1RDIG9yIFhNQ19URCBzeW1ib2wuICAqLwotICAgICAgbG9uZyB0b2NfaW5keDsKLSAgICB9IHU7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludCB3aGljaCBpcyBjYWxsZWQsIHRoaXMKLSAgICAgZmllbGQgaG9sZHMgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgSWYgdGhpcyBzeW1ib2wKLSAgICAgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLCB0aGlzIGZpZWxkIGhvbGRzIGEgcG9pbnRlciB0byB0aGUKLSAgICAgZnVuY3Rpb24gZW50cnkgcG9pbnQuICAqLwotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpkZXNjcmlwdG9yOwotCi0gIC8qIFRoZSAubG9hZGVyIHN5bWJvbCB0YWJsZSBlbnRyeSwgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgc3RydWN0IGludGVybmFsX2xkc3ltICpsZHN5bTsKLQotICAvKiBJZiBYQ09GRl9CVUlMVF9MRFNZTSBpcyBzZXQsIHRoaXMgaXMgdGhlIC5sb2FkZXIgc3ltYm9sIHRhYmxlCi0gICAgIGluZGV4LiAgSWYgWENPRkZfQlVJTERfTERTWU0gaXMgY2xlYXIsIGFuZCBYQ09GRl9JTVBPUlQgaXMgc2V0LAotICAgICB0aGlzIGlzIHRoZSBsX2lmaWxlIHZhbHVlLiAgKi8KLSAgbG9uZyBsZGluZHg7Ci0KLSAgLyogU29tZSBsaW5rZXIgZmxhZ3MuICAqLwotICB1bnNpZ25lZCBzaG9ydCBmbGFnczsKLSAgLyogU3ltYm9sIGlzIHJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gICovCi0jZGVmaW5lIFhDT0ZGX1JFRl9SRUdVTEFSICgwMSkKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gICovCi0jZGVmaW5lIFhDT0ZGX0RFRl9SRUdVTEFSICgwMikKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdC4gICovCi0jZGVmaW5lIFhDT0ZGX0RFRl9EWU5BTUlDICgwNCkKLSAgLyogU3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvYyBiZWluZyBjb3BpZWQgaW50byB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgWENPRkZfTERSRUwgKDAxMCkKLSAgLyogU3ltYm9sIGlzIHRoZSBlbnRyeSBwb2ludC4gICovCi0jZGVmaW5lIFhDT0ZGX0VOVFJZICgwMjApCi0gIC8qIFN5bWJvbCBpcyBjYWxsZWQ7IHRoaXMgaXMsIGl0IGFwcGVhcnMgaW4gYSBSX0JSIHJlbG9jLiAgKi8KLSNkZWZpbmUgWENPRkZfQ0FMTEVEICgwNDApCi0gIC8qIFN5bWJvbCBuZWVkcyB0aGUgVE9DIGVudHJ5IGZpbGxlZCBpbi4gICovCi0jZGVmaW5lIFhDT0ZGX1NFVF9UT0MgKDAxMDApCi0gIC8qIFN5bWJvbCBpcyBleHBsaWNpdGx5IGltcG9ydGVkLiAgKi8KLSNkZWZpbmUgWENPRkZfSU1QT1JUICgwMjAwKQotICAvKiBTeW1ib2wgaXMgZXhwbGljaXRseSBleHBvcnRlZC4gICovCi0jZGVmaW5lIFhDT0ZGX0VYUE9SVCAoMDQwMCkKLSAgLyogU3ltYm9sIGhhcyBiZWVuIHByb2Nlc3NlZCBieSB4Y29mZl9idWlsZF9sZHN5bXMuICAqLwotI2RlZmluZSBYQ09GRl9CVUlMVF9MRFNZTSAoMDEwMDApCi0gIC8qIFN5bWJvbCBpcyBtZW50aW9uZWQgYnkgYSBzZWN0aW9uIHdoaWNoIHdhcyBub3QgZ2FyYmFnZSBjb2xsZWN0ZWQuICAqLwotI2RlZmluZSBYQ09GRl9NQVJLICgwMjAwMCkKLSAgLyogU3ltYm9sIHNpemUgaXMgcmVjb3JkZWQgaW4gc2l6ZV9saXN0IGxpc3QgZnJvbSBoYXNoIHRhYmxlLiAgKi8KLSNkZWZpbmUgWENPRkZfSEFTX1NJWkUgKDA0MDAwKQotICAvKiBTeW1ib2wgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgWENPRkZfREVTQ1JJUFRPUiAoMDEwMDAwKQotICAvKiBNdWx0aXBsZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gZm9yIHRoZSBzeW1ib2wuICAqLwotI2RlZmluZSBYQ09GRl9NVUxUSVBMWV9ERUZJTkVEICgwMjAwMDApCi0KLSAgLyogVGhlIHN0b3JhZ2UgbWFwcGluZyBjbGFzcy4gICovCi0gIHVuc2lnbmVkIGNoYXIgc21jbGFzOwotfTsKLQotLyogVGhlIFhDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFRoZSAuZGVidWcgc3RyaW5nIGhhc2ggdGFibGUuICBXZSBuZWVkIHRvIGNvbXB1dGUgdGhpcyB3aGlsZQotICAgICByZWFkaW5nIHRoZSBpbnB1dCBmaWxlcywgc28gdGhhdCB3ZSBrbm93IGhvdyBsYXJnZSB0aGUgLmRlYnVnCi0gICAgIHNlY3Rpb24gd2lsbCBiZSBiZWZvcmUgd2UgYXNzaWduIHNlY3Rpb24gcG9zaXRpb25zLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZGVidWdfc3RydGFiOwotCi0gIC8qIFRoZSAuZGVidWcgc2VjdGlvbiB3ZSB3aWxsIHVzZSBmb3IgdGhlIGZpbmFsIG91dHB1dC4gICovCi0gIGFzZWN0aW9uICpkZWJ1Z19zZWN0aW9uOwotCi0gIC8qIFRoZSAubG9hZGVyIHNlY3Rpb24gd2Ugd2lsbCB1c2UgZm9yIHRoZSBmaW5hbCBvdXRwdXQuICAqLwotICBhc2VjdGlvbiAqbG9hZGVyX3NlY3Rpb247Ci0KLSAgLyogQSBjb3VudCBvZiBub24gVE9DIHJlbGF0aXZlIHJlbG9jcyB3aGljaCB3aWxsIG5lZWQgdG8gYmUKLSAgICAgYWxsb2NhdGVkIGluIHRoZSAubG9hZGVyIHNlY3Rpb24uICAqLwotICBzaXplX3QgbGRyZWxfY291bnQ7Ci0KLSAgLyogVGhlIC5sb2FkZXIgc2VjdGlvbiBoZWFkZXIuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0KLSAgLyogVGhlIC5nbCBzZWN0aW9uIHdlIHVzZSB0byBob2xkIGdsb2JhbCBsaW5rYWdlIGNvZGUuICAqLwotICBhc2VjdGlvbiAqbGlua2FnZV9zZWN0aW9uOwotCi0gIC8qIFRoZSAudGMgc2VjdGlvbiB3ZSB1c2UgdG8gaG9sZCB0b2MgZW50cmllcyB3ZSBidWlsZCBmb3IgZ2xvYmFsCi0gICAgIGxpbmthZ2UgY29kZS4gICovCi0gIGFzZWN0aW9uICp0b2Nfc2VjdGlvbjsKLQotICAvKiBUaGUgLmRzIHNlY3Rpb24gd2UgdXNlIHRvIGhvbGQgZnVuY3Rpb24gZGVzY3JpcHRvcnMgd2hpY2ggd2UKLSAgICAgY3JlYXRlIGZvciBleHBvcnRlZCBzeW1ib2xzLiAgKi8KLSAgYXNlY3Rpb24gKmRlc2NyaXB0b3Jfc2VjdGlvbjsKLQotICAvKiBUaGUgbGlzdCBvZiBpbXBvcnQgZmlsZXMuICAqLwotICBzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKmltcG9ydHM7Ci0KLSAgLyogUmVxdWlyZWQgYWxpZ25tZW50IG9mIHNlY3Rpb25zIHdpdGhpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfYWxpZ247Ci0KLSAgLyogV2hldGhlciB0aGUgLnRleHQgc2VjdGlvbiBtdXN0IGJlIHJlYWQtb25seS4gICovCi0gIGJvb2xlYW4gdGV4dHJvOwotCi0gIC8qIFdoZXRoZXIgZ2FyYmFnZSBjb2xsZWN0aW9uIHdhcyBkb25lLiAgKi8KLSAgYm9vbGVhbiBnYzsKLQotICAvKiBBIGxpbmtlZCBsaXN0IG9mIHN5bWJvbHMgZm9yIHdoaWNoIHdlIGhhdmUgc2l6ZSBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdAotICAgIHsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdCAqbmV4dDsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgfSAqc2l6ZV9saXN0OwotCi0gIC8qIE1hZ2ljIHNlY3Rpb25zOiBfdGV4dCwgX2V0ZXh0LCBfZGF0YSwgX2VkYXRhLCBfZW5kLCBlbmQuICAqLwotICBhc2VjdGlvbiAqc3BlY2lhbF9zZWN0aW9uc1s2XTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgZHVyaW5nIHRoZQotICAgZmluYWwgbGluayBwaGFzZS4gICovCi0KLXN0cnVjdCB4Y29mZl9saW5rX3NlY3Rpb25faW5mbwotewotICAvKiBUaGUgcmVsb2NzIHRvIGJlIG91dHB1dC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBGb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aG9zZSBpbmRleCB3YXMgbm90IGtub3duCi0gICAgIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLCB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hlczsKLSAgLyogSWYgdGhlcmUgaXMgYSBUT0MgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIGFuZCB0aGUKLSAgICAgaW5kZXggb2YgdGhlIFRPQyBzeW1ib2wgaXMgbm90IGtub3duIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLAotICAgICBhbiBlbnRyeSBpcyBhZGRlZCB0byB0aGlzIGxpbmtlZCBsaXN0LiAgVGhpcyBpcyBub3QgYW4gYXJyYXksCi0gICAgIGxpa2UgcmVsX2hhc2hlcywgYmVjYXVzZSB0aGlzIGNhc2UgaXMgcXVpdGUgdW5jb21tb24uICAqLwotICBzdHJ1Y3QgeGNvZmZfdG9jX3JlbF9oYXNoCi0gICAgewotICAgICAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCAqbmV4dDsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICB9ICp0b2NfcmVsX2hhc2hlczsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHRoYXQgd2UgcGFzcyBhcm91bmQgd2hpbGUgZG9pbmcgdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLXN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIEhhc2ggdGFibGUgZm9yIGxvbmcgc3ltYm9sIG5hbWVzLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotICAvKiBBcnJheSBvZiBpbmZvcm1hdGlvbiBrZXB0IGZvciBlYWNoIG91dHB1dCBzZWN0aW9uLCBpbmRleGVkIGJ5IHRoZQotICAgICB0YXJnZXRfaW5kZXggZmllbGQuICAqLwotICBzdHJ1Y3QgeGNvZmZfbGlua19zZWN0aW9uX2luZm8gKnNlY3Rpb25faW5mbzsKLSAgLyogU3ltYm9sIGluZGV4IG9mIGxhc3QgQ19GSUxFIHN5bWJvbCAoLTEgaWYgbm9uZSkuICAqLwotICBsb25nIGxhc3RfZmlsZV9pbmRleDsKLSAgLyogQ29udGVudHMgb2YgbGFzdCBDX0ZJTEUgc3ltYm9sLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCBsYXN0X2ZpbGU7Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBUT0Mgc3ltYm9sLiAgKi8KLSAgbG9uZyB0b2Nfc3ltaW5keDsKLSAgLyogU3RhcnQgb2YgLmxvYWRlciBzeW1ib2xzLiAgKi8KLSAgc3RydWN0IGV4dGVybmFsX2xkc3ltICpsZHN5bTsKLSAgLyogTmV4dCAubG9hZGVyIHJlbG9jIHRvIHN3YXAgb3V0LiAgKi8KLSAgc3RydWN0IGV4dGVybmFsX2xkcmVsICpsZHJlbDsKLSAgLyogRmlsZSBwb3NpdGlvbiBvZiBzdGFydCBvZiBsaW5lIG51bWJlcnMuICAqLwotICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IGluZGljZXMgb2Ygc3ltYm9scyBvZiBhbnkKLSAgICAgaW5wdXQgZmlsZS4gICovCi0gIGxvbmcgKnN5bV9pbmRpY2VzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IHN5bWJvbHMgZm9yIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgYmZkX2J5dGUgKm91dHN5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCBsaW5lIG51bWJlcnMgZm9yIGFueSBpbnB1dAotICAgICBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmxpbmVub3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci19OwotCi1zdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkaGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKiwgc3RydWN0IGludGVybmFsX2xkaGRyICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgKiwgc3RydWN0IGV4dGVybmFsX2xkaGRyICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRzeW1faW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqLCBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKikpOwotc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZHN5bV9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqLCBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikpOwotc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZHJlbF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkcmVsICosIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkcmVsX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX2xkcmVsICosIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICp4Y29mZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnhjb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBib29sZWFuLCBiZmRfYnl0ZSAqLCBib29sZWFuLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIHhjb2ZmX2ZpbmRfcmVsb2MKLSAgUEFSQU1TICgoc3RydWN0IGludGVybmFsX3JlbG9jICosIGJmZF9zaXplX3R5cGUsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbWFya19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9tYXJrIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3ZWVwIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2J1aWxkX2xkc3ltcwotICBQQVJBTVMgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19pbnB1dF9iZmQKLSAgUEFSQU1TICgoc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci1zdGF0aWMgaW50IHhjb2ZmX3NvcnRfcmVsb2NzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0MCi0vKiBSb3V0aW5lcyB0byBzd2FwIGluZm9ybWF0aW9uIGluIHRoZSBYQ09GRiAubG9hZGVyIHNlY3Rpb24uICBJZiB3ZQotICAgZXZlciBuZWVkIHRvIHdyaXRlIGFuIFhDT0ZGIGxvYWRlciwgdGhpcyBzdHVmZiB3aWxsIG5lZWQgdG8gYmUKLSAgIG1vdmVkIHRvIGFub3RoZXIgZmlsZSBzaGFyZWQgYnkgdGhlIGxpbmtlciAod2hpY2ggWENPRkYgY2FsbHMgdGhlCi0gICBgYGJpbmRlcicnKSBhbmQgdGhlIGxvYWRlci4gICovCi0KLS8qIFN3YXAgaW4gdGhlIGxkaGRyIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi14Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKnNyYzsKLSAgICAgc3RydWN0IGludGVybmFsX2xkaGRyICpkc3Q7Ci17Ci0gIGRzdC0+bF92ZXJzaW9uID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3ZlcnNpb24pOwotICBkc3QtPmxfbnN5bXMgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfbnN5bXMpOwotICBkc3QtPmxfbnJlbG9jID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX25yZWxvYyk7Ci0gIGRzdC0+bF9pc3RsZW4gPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfaXN0bGVuKTsKLSAgZHN0LT5sX25pbXBpZCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9uaW1waWQpOwotICBkc3QtPmxfaW1wb2ZmID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX2ltcG9mZik7Ci0gIGRzdC0+bF9zdGxlbiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9zdGxlbik7Ci0gIGRzdC0+bF9zdG9mZiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9zdG9mZik7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBsZGhkciBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZGhkcl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZGhkciAqc3JjOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKmRzdDsKLXsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3ZlcnNpb24sIGRzdC0+bF92ZXJzaW9uKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX25zeW1zLCBkc3QtPmxfbnN5bXMpOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfbnJlbG9jLCBkc3QtPmxfbnJlbG9jKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX2lzdGxlbiwgZHN0LT5sX2lzdGxlbik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9uaW1waWQsIGRzdC0+bF9uaW1waWQpOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfaW1wb2ZmLCBkc3QtPmxfaW1wb2ZmKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3N0bGVuLCBkc3QtPmxfc3RsZW4pOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfc3RvZmYsIGRzdC0+bF9zdG9mZik7Ci19Ci0KLS8qIFN3YXAgaW4gdGhlIGxkc3ltIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi14Y29mZl9zd2FwX2xkc3ltX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKnNyYzsKLSAgICAgc3RydWN0IGludGVybmFsX2xkc3ltICpkc3Q7Ci17Ci0gIGlmIChiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPl9sLl9sX2wuX2xfemVyb2VzKSAhPSAwKQotICAgIG1lbWNweSAoZHN0LT5fbC5fbF9uYW1lLCBzcmMtPl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGRzdC0+X2wuX2xfbC5fbF96ZXJvZXMgPSAwOwotICAgICAgZHN0LT5fbC5fbF9sLl9sX29mZnNldCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+X2wuX2xfbC5fbF9vZmZzZXQpOwotICAgIH0KLSAgZHN0LT5sX3ZhbHVlID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3ZhbHVlKTsKLSAgZHN0LT5sX3NjbnVtID0gYmZkX2dldF8xNiAoYWJmZCwgc3JjLT5sX3NjbnVtKTsKLSAgZHN0LT5sX3NtdHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgc3JjLT5sX3NtdHlwZSk7Ci0gIGRzdC0+bF9zbWNsYXMgPSBiZmRfZ2V0XzggKGFiZmQsIHNyYy0+bF9zbWNsYXMpOwotICBkc3QtPmxfaWZpbGUgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfaWZpbGUpOwotICBkc3QtPmxfcGFybSA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9wYXJtKTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIGxkc3ltIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi14Y29mZl9zd2FwX2xkc3ltX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX2xkc3ltICpzcmM7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqZHN0OwotewotICBpZiAoc3JjLT5fbC5fbF9sLl9sX3plcm9lcyAhPSAwKQotICAgIG1lbWNweSAoZHN0LT5fbC5fbF9uYW1lLCBzcmMtPl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIDAsIGRzdC0+X2wuX2xfbC5fbF96ZXJvZXMpOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5fbC5fbF9sLl9sX29mZnNldCwgZHN0LT5fbC5fbF9sLl9sX29mZnNldCk7Ci0gICAgfQotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfdmFsdWUsIGRzdC0+bF92YWx1ZSk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHNyYy0+bF9zY251bSwgZHN0LT5sX3NjbnVtKTsKLSAgYmZkX3B1dF84IChhYmZkLCBzcmMtPmxfc210eXBlLCBkc3QtPmxfc210eXBlKTsKLSAgYmZkX3B1dF84IChhYmZkLCBzcmMtPmxfc21jbGFzLCBkc3QtPmxfc21jbGFzKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX2lmaWxlLCBkc3QtPmxfaWZpbGUpOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfcGFybSwgZHN0LT5sX3Bhcm0pOwotfQotCi0vKiBTd2FwIGluIHRoZSBsZHJlbCBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZHJlbF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkcmVsICpzcmM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqZHN0OwotewotICBkc3QtPmxfdmFkZHIgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfdmFkZHIpOwotICBkc3QtPmxfc3ltbmR4ID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3N5bW5keCk7Ci0gIGRzdC0+bF9ydHlwZSA9IGJmZF9nZXRfMTYgKGFiZmQsIHNyYy0+bF9ydHlwZSk7Ci0gIGRzdC0+bF9yc2Vjbm0gPSBiZmRfZ2V0XzE2IChhYmZkLCBzcmMtPmxfcnNlY25tKTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIGxkcmVsIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi14Y29mZl9zd2FwX2xkcmVsX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX2xkcmVsICpzcmM7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqZHN0OwotewotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfdmFkZHIsIGRzdC0+bF92YWRkcik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9zeW1uZHgsIGRzdC0+bF9zeW1uZHgpOwotICBiZmRfcHV0XzE2IChhYmZkLCBzcmMtPmxfcnR5cGUsIGRzdC0+bF9ydHlwZSk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHNyYy0+bF9yc2Vjbm0sIGRzdC0+bF9yc2Vjbm0pOwotfQotDAotLyogUm91dGluZXMgdG8gcmVhZCBYQ09GRiBkeW5hbWljIGluZm9ybWF0aW9uLiAgVGhpcyBkb24ndCByZWFsbHkKLSAgIGJlbG9uZyBoZXJlLCBidXQgd2UgYWxyZWFkeSBoYXZlIHRoZSBsZHN5bSBtYW5pcHVsYXRpb24gcm91dGluZXMKLSAgIGhlcmUuICAqLwotCi0vKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWMtPnVzZWRfYnlfYmZkID0gYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPQotCShiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywKLQkJCQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBzaXplIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0KLWxvbmcKLV9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpsc2VjOwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIC0xOwotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBjb250ZW50cywgJmxkaGRyKTsKLQotICByZXR1cm4gKGxkaGRyLmxfbnN5bXMgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKLX0KLQotLyogR2V0IHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgcHN5bXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnBzeW1zOwotewotICBhc2VjdGlvbiAqbHNlYzsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ3M7Ci0gIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqZWxzeW0sICplbHN5bWVuZDsKLSAgY29mZl9zeW1ib2xfdHlwZSAqc3ltYnVmOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgaWYgKGxzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gLTE7Ci0gIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKLQotICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmtlZXBfY29udGVudHMgPSB0cnVlOwotCi0gIHhjb2ZmX3N3YXBfbGRoZHJfaW4gKGFiZmQsIChzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKikgY29udGVudHMsICZsZGhkcik7Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGNvbnRlbnRzICsgbGRoZHIubF9zdG9mZjsKLQotICBzeW1idWYgPSAoKGNvZmZfc3ltYm9sX3R5cGUgKikKLQkgICAgYmZkX3phbGxvYyAoYWJmZCwgbGRoZHIubF9uc3ltcyAqIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpKTsKLSAgaWYgKHN5bWJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBlbHN5bSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikgKGNvbnRlbnRzICsgTERIRFJTWik7Ci0gIGVsc3ltZW5kID0gZWxzeW0gKyBsZGhkci5sX25zeW1zOwotICBmb3IgKDsgZWxzeW0gPCBlbHN5bWVuZDsgZWxzeW0rKywgc3ltYnVmKyssIHBzeW1zKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltIGxkc3ltOwotCi0gICAgICB4Y29mZl9zd2FwX2xkc3ltX2luIChhYmZkLCBlbHN5bSwgJmxkc3ltKTsKLQotICAgICAgc3ltYnVmLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0KLSAgICAgIGlmIChsZHN5bS5fbC5fbF9sLl9sX3plcm9lcyA9PSAwKQotCXN5bWJ1Zi0+c3ltYm9sLm5hbWUgPSBzdHJpbmdzICsgbGRzeW0uX2wuX2xfbC5fbF9vZmZzZXQ7Ci0gICAgICBlbHNlCi0JewotCSAgaW50IGk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBTWU1OTUxFTjsgaSsrKQotCSAgICBpZiAobGRzeW0uX2wuX2xfbmFtZVtpXSA9PSAnXDAnKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKGkgPCBTWU1OTUxFTikKLQkgICAgc3ltYnVmLT5zeW1ib2wubmFtZSA9IChjaGFyICopIGVsc3ltLT5fbC5fbF9uYW1lOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqYzsKLQotCSAgICAgIGMgPSBiZmRfYWxsb2MgKGFiZmQsIFNZTU5NTEVOICsgMSk7Ci0JICAgICAgaWYgKGMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCSAgICAgIG1lbWNweSAoYywgbGRzeW0uX2wuX2xfbmFtZSwgU1lNTk1MRU4pOwotCSAgICAgIGNbU1lNTk1MRU5dID0gJ1wwJzsKLQkgICAgICBzeW1idWYtPnN5bWJvbC5uYW1lID0gYzsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGxkc3ltLmxfc21jbGFzID09IFhNQ19YTykKLQlzeW1idWYtPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UKLQlzeW1idWYtPnN5bWJvbC5zZWN0aW9uID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLAotCQkJCQkJCSAgICAgIGxkc3ltLmxfc2NudW0pOwotICAgICAgc3ltYnVmLT5zeW1ib2wudmFsdWUgPSBsZHN5bS5sX3ZhbHVlIC0gc3ltYnVmLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotCi0gICAgICBzeW1idWYtPnN5bWJvbC5mbGFncyA9IEJTRl9OT19GTEFHUzsKLSAgICAgIGlmICgobGRzeW0ubF9zbXR5cGUgJiBMX0VYUE9SVCkgIT0gMCkKLQlzeW1idWYtPnN5bWJvbC5mbGFncyB8PSBCU0ZfR0xPQkFMOwotCi0gICAgICAvKiBGSVhNRTogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBvdGhlciBpbmZvcm1hdGlvbiBzdG9yZWQKLSAgICAgICAgIHdpdGggdGhlIGxvYWRlciBzeW1ib2wuICAqLwotCi0gICAgICAqcHN5bXMgPSAoYXN5bWJvbCAqKSBzeW1idWY7Ci0gICAgfQotCi0gICpwc3ltcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIGxkaGRyLmxfbnN5bXM7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgaWYgKGxzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gLTE7Ci0gIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGNvbnRlbnRzLCAmbGRoZHIpOwotCi0gIHJldHVybiAobGRoZHIubF9ucmVsb2MgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotLyogVGhlIHR5cGljYWwgZHluYW1pYyByZWxvYy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHhjb2ZmX2R5bmFtaWNfcmVsb2MgPQotICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpOyAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogR2V0IHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgKGFiZmQsIHByZWxvY3MsIHN5bXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqKnByZWxvY3M7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotewotICBhc2VjdGlvbiAqbHNlYzsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0gIGFyZWxlbnQgKnJlbGJ1ZjsKLSAgc3RydWN0IGV4dGVybmFsX2xkcmVsICplbHJlbCwgKmVscmVsZW5kOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgaWYgKGxzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gLTE7Ci0gIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGNvbnRlbnRzLCAmbGRoZHIpOwotCi0gIHJlbGJ1ZiA9IChhcmVsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwgbGRoZHIubF9ucmVsb2MgKiBzaXplb2YgKGFyZWxlbnQpKTsKLSAgaWYgKHJlbGJ1ZiA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICBlbHJlbCA9ICgoc3RydWN0IGV4dGVybmFsX2xkcmVsICopCi0JICAgKGNvbnRlbnRzICsgTERIRFJTWiArIGxkaGRyLmxfbnN5bXMgKiBMRFNZTVNaKSk7Ci0gIGVscmVsZW5kID0gZWxyZWwgKyBsZGhkci5sX25yZWxvYzsKLSAgZm9yICg7IGVscmVsIDwgZWxyZWxlbmQ7IGVscmVsKyssIHJlbGJ1ZisrLCBwcmVsb2NzKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOwotCi0gICAgICB4Y29mZl9zd2FwX2xkcmVsX2luIChhYmZkLCBlbHJlbCwgJmxkcmVsKTsKLQotICAgICAgaWYgKGxkcmVsLmxfc3ltbmR4ID49IDMpCi0JcmVsYnVmLT5zeW1fcHRyX3B0ciA9IHN5bXMgKyAobGRyZWwubF9zeW1uZHggLSAzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgc3dpdGNoIChsZHJlbC5sX3N5bW5keCkKLQkgICAgewotCSAgICBjYXNlIDA6Ci0JICAgICAgbmFtZSA9ICIudGV4dCI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkgICAgICBuYW1lID0gIi5kYXRhIjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAyOgotCSAgICAgIG5hbWUgPSAiLmJzcyI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCSAgaWYgKHNlYyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgIHJlbGJ1Zi0+c3ltX3B0cl9wdHIgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOwotCX0KLQotICAgICAgcmVsYnVmLT5hZGRyZXNzID0gbGRyZWwubF92YWRkcjsKLSAgICAgIHJlbGJ1Zi0+YWRkZW5kID0gMDsKLQotICAgICAgLyogTW9zdCBkeW5hbWljIHJlbG9jcyBoYXZlIHRoZSBzYW1lIHR5cGUuICBGSVhNRTogVGhpcyBpcyBvbmx5Ci0gICAgICAgICBjb3JyZWN0IGlmIGxkcmVsLmxfcnR5cGUgPT0gMC4gIEluIG90aGVyIGNhc2VzLCB3ZSBzaG91bGQgdXNlCi0gICAgICAgICBhIGRpZmZlcmVudCBob3d0by4gICovCi0gICAgICByZWxidWYtPmhvd3RvID0gJnhjb2ZmX2R5bmFtaWNfcmVsb2M7Ci0KLSAgICAgIC8qIEZJWE1FOiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIGxfcnNlY25tIGZpZWxkLiAgKi8KLQotICAgICAgKnByZWxvY3MgPSByZWxidWY7Ci0gICAgfQotCi0gICpwcmVsb2NzID0gTlVMTDsKLQotICByZXR1cm4gbGRoZHIubF9ucmVsb2M7Ci19Ci0MCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBYQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXhjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgICAgcmV0LT50b2Nfc2VjdGlvbiA9IE5VTEw7Ci0gICAgICByZXQtPnUudG9jX2luZHggPSAtMTsKLSAgICAgIHJldC0+ZGVzY3JpcHRvciA9IE5VTEw7Ci0gICAgICByZXQtPmxkc3ltID0gTlVMTDsKLSAgICAgIHJldC0+bGRpbmR4ID0gLTE7Ci0gICAgICByZXQtPmZsYWdzID0gMDsKLSAgICAgIHJldC0+c21jbGFzID0gWE1DX1VBOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLV9iZmRfeGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwgeGNvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmRlYnVnX3N0cnRhYiA9IF9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIHJldC0+ZGVidWdfc2VjdGlvbiA9IE5VTEw7Ci0gIHJldC0+bG9hZGVyX3NlY3Rpb24gPSBOVUxMOwotICByZXQtPmxkcmVsX2NvdW50ID0gMDsKLSAgbWVtc2V0ICgmcmV0LT5sZGhkciwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIpKTsKLSAgcmV0LT5saW5rYWdlX3NlY3Rpb24gPSBOVUxMOwotICByZXQtPnRvY19zZWN0aW9uID0gTlVMTDsKLSAgcmV0LT5kZXNjcmlwdG9yX3NlY3Rpb24gPSBOVUxMOwotICByZXQtPmltcG9ydHMgPSBOVUxMOwotICByZXQtPmZpbGVfYWxpZ24gPSAwOwotICByZXQtPnRleHRybyA9IGZhbHNlOwotICByZXQtPmdjID0gZmFsc2U7Ci0gIG1lbXNldCAocmV0LT5zcGVjaWFsX3NlY3Rpb25zLCAwLCBzaXplb2YgcmV0LT5zcGVjaWFsX3NlY3Rpb25zKTsKLQotICAvKiBUaGUgbGlua2VyIHdpbGwgYWx3YXlzIGdlbmVyYXRlIGEgZnVsbCBhLm91dCBoZWFkZXIuICBXZSBuZWVkIHRvCi0gICAgIHJlY29yZCB0aGF0IGZhY3Qgbm93LCBiZWZvcmUgdGhlIHNpemVvZl9oZWFkZXJzIHJvdXRpbmUgY291bGQgYmUKLSAgICAgY2FsbGVkLiAgKi8KLSAgeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkciA9IHRydWU7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Q7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gWENPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSB4Y29mZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLFwKLQkJCSAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGFuIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgWENPRkYgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIHhjb2ZmX2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotDAotLyogUmVhZCBpbnRlcm5hbCByZWxvY3MgZm9yIGFuIFhDT0ZGIGNzZWN0LiAgVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kCi0gICBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3Mgd2hpY2ggdHJpZXMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgYW55Ci0gICByZWxvY3Mgd2hpY2ggbWF5IGhhdmUgYmVlbiBjYWNoZWQgZm9yIHRoZSBlbmNsb3Npbmcgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKgoteGNvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIHNlYywgY2FjaGUsIGV4dGVybmFsX3JlbG9jcywKLQkJCSAgICByZXF1aXJlX2ludGVybmFsLCBpbnRlcm5hbF9yZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYm9vbGVhbiBjYWNoZTsKLSAgICAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jczsKLSAgICAgYm9vbGVhbiByZXF1aXJlX2ludGVybmFsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLXsKLSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwKLSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPT0gTlVMTAotICAgICAgJiYgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwpCi0gICAgewotICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLQotICAgICAgZW5jbG9zaW5nID0geGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5lbmNsb3Npbmc7Ci0KLSAgICAgIGlmIChlbmNsb3NpbmcgIT0gTlVMTAotCSAgJiYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpID09IE5VTEwKLQkgICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzID09IE5VTEwpCi0JICAmJiBjYWNoZQotCSAgJiYgZW5jbG9zaW5nLT5yZWxvY19jb3VudCA+IDApCi0JewotCSAgaWYgKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoYWJmZCwgZW5jbG9zaW5nLCB0cnVlLAotCQkJCQkgICAgICBleHRlcm5hbF9yZWxvY3MsIGZhbHNlLAotCQkJCQkgICAgICAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpCi0JICAgICAgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICBpZiAoZW5jbG9zaW5nICE9IE5VTEwKLQkgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpICE9IE5VTEwKLQkgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpLT5yZWxvY3MgIT0gTlVMTCkKLQl7Ci0JICBzaXplX3Qgb2ZmOwotCi0JICBvZmYgPSAoKHNlYy0+cmVsX2ZpbGVwb3MgLSBlbmNsb3NpbmctPnJlbF9maWxlcG9zKQotCQkgLyBiZmRfY29mZl9yZWxzeiAoYWJmZCkpOwotCSAgaWYgKCEgcmVxdWlyZV9pbnRlcm5hbCkKLQkgICAgcmV0dXJuIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpLT5yZWxvY3MgKyBvZmY7Ci0JICBtZW1jcHkgKGludGVybmFsX3JlbG9jcywKLQkJICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzICsgb2ZmLAotCQkgIHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpOwotCSAgcmV0dXJuIGludGVybmFsX3JlbG9jczsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIHNlYywgY2FjaGUsIGV4dGVybmFsX3JlbG9jcywKLQkJCQkJIHJlcXVpcmVfaW50ZXJuYWwsIGludGVybmFsX3JlbG9jcyk7Ci19Ci0MCi0vKiBHaXZlbiBhbiBYQ09GRiBCRkQsIGFkZCBzeW1ib2xzIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBhcwotICAgYXBwcm9wcmlhdGUuICAqLwotCi1ib29sZWFuCi1fYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0dXJuIHhjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLQotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICAvKiBJZiB0aGUgYXJjaGl2ZSBoYXMgYSBtYXAsIGRvIHRoZSB1c3VhbCBzZWFyY2guICBXZSB0aGVuIG5lZWQKLSAgICAgICAgIHRvIGNoZWNrIHRoZSBhcmNoaXZlIGZvciBzdHJpcHBlZCBkeW5hbWljIG9iamVjdHMsIGJlY2F1c2UKLSAgICAgICAgIHRoZXkgd2lsbCBub3QgYXBwZWFyIGluIHRoZSBhcmNoaXZlIG1hcCBldmVuIHRob3VnaCB0aGV5Ci0gICAgICAgICBzaG91bGQsIHBlcmhhcHMsIGJlIGluY2x1ZGVkLiAgSWYgdGhlIGFyY2hpdmUgaGFzIG5vIG1hcCwgd2UKLSAgICAgICAgIGp1c3QgY29uc2lkZXIgZWFjaCBvYmplY3QgZmlsZSBpbiB0dXJuLCBzaW5jZSB0aGF0IGFwcGFyZW50bHkKLSAgICAgICAgIGlzIHdoYXQgdGhlIEFJWCBuYXRpdmUgbGlua2VyIGRvZXMuICAqLwotICAgICAgaWYgKGJmZF9oYXNfbWFwIChhYmZkKSkKLQl7Ci0JICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCQkgKGFiZmQsIGluZm8sIHhjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHsKLQliZmQgKm1lbWJlcjsKLQotCW1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCk7Ci0Jd2hpbGUgKG1lbWJlciAhPSBOVUxMKQotCSAgewotCSAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAobWVtYmVyLCBiZmRfb2JqZWN0KQotCQkmJiAoISBiZmRfaGFzX21hcCAoYWJmZCkKLQkJICAgIHx8ICgobWVtYmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLQkJCSYmIChtZW1iZXItPmZsYWdzICYgSEFTX1NZTVMpID09IDApKSkKLQkgICAgICB7Ci0JCWJvb2xlYW4gbmVlZGVkOwotCi0JCWlmICghIHhjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChtZW1iZXIsIGluZm8sICZuZWVkZWQpKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaWYgKG5lZWRlZCkKLQkJICBtZW1iZXItPmFyY2hpdmVfcGFzcyA9IC0xOwotCSAgICAgIH0KLQkgICAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgbWVtYmVyKTsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIFhDT0ZGIG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgeGNvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2hlY2sgYSBzaW5nbGUgYXJjaGl2ZSBlbGVtZW50IHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGluY2x1ZGUgaXQgaW4KLSAgIHRoZSBsaW5rLiAgKlBORUVERUQgaXMgc2V0IGFjY29yZGluZyB0byB3aGV0aGVyIHRoaXMgZWxlbWVudCBpcwotICAgbmVlZGVkIGluIHRoZSBsaW5rIG9yIG5vdC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotICAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgeGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCpwbmVlZGVkKQotICAgIHsKLSAgICAgIGlmICghIHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkgfHwgISAqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHN5bWJvbHMgdG8gc2VlIGlmIHRoaXMgb2JqZWN0IGZpbGUgc2hvdWxkIGJlCi0gICBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBiZmRfYnl0ZSAqZXN5bTsKLSAgYmZkX2J5dGUgKmVzeW1fZW5kOwotCi0gICpwbmVlZGVkID0gZmFsc2U7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmICEgaW5mby0+c3RhdGljX2xpbmsKLSAgICAgICYmIGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKLSAgICByZXR1cm4geGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzejsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0gICAgICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUICYmIHN5bS5uX3NjbnVtICE9IE5fVU5ERUYpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogVGhpcyBzeW1ib2wgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLCBhbmQgaXMgZGVmaW5lZCBieSB0aGlzCi0gICAgICAgICAgICAgb2JqZWN0IGZpbGUuICAqLwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0JICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgdGhhdCBhcmUgY3VycmVudGx5Ci0JICAgICB1bmRlZmluZWQuICBJZiBhIHN5bWJvbCBpcyBjdXJyZW50bHkga25vd24gdG8gYmUgY29tbW9uLAotCSAgICAgWENPRkYgbGlua2VycyBkbyBub3QgYnJpbmcgaW4gYW4gb2JqZWN0IGZpbGUgd2hpY2gKLQkgICAgIGRlZmluZXMgaXQuICBXZSBhbHNvIGRvbid0IGJyaW5nIGluIHN5bWJvbHMgdG8gc2F0aXNmeQotCSAgICAgdW5kZWZpbmVkIHJlZmVyZW5jZXMgaW4gc2hhcmVkIG9iamVjdHMuICAqLwotCSAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgJiYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYwotCQkgIHx8ICgoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgaCktPmZsYWdzCi0JCSAgICAgICYgWENPRkZfREVGX0RZTkFNSUMpID09IDApKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgICpwbmVlZGVkID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0gICAgfQotCi0gIC8qIFdlIGRvIG5vdCBuZWVkIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSBsb2FkZXIgc3ltYm9scyB0byBzZWUgaWYgdGhpcyBkeW5hbWljIG9iamVjdAotICAgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgVGhlIG5hdGl2ZSBsaW5rZXIgdXNlcyB0aGUgbG9hZGVyCi0gICBzeW1ib2xzLCBub3QgdGhlIG5vcm1hbCBzeW1ib2wgdGFibGUsIHNvIHdlIGRvIHRvby4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpidWY7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKLSAgY29uc3QgY2hhciAqc3RyaW5nczsKLSAgc3RydWN0IGV4dGVybmFsX2xkc3ltICplbHN5bSwgKmVsc3ltZW5kOwotCi0gICpwbmVlZGVkID0gZmFsc2U7Ci0KLSAgbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxvYWRlciIpOwotICBpZiAobHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGFyZSBubyBzeW1ib2xzLCBzbyBkb24ndCB0cnkgdG8gaW5jbHVkZSBpdC4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCEgeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxzZWMpKQotICAgIHJldHVybiBmYWxzZTsKLSAgYnVmID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGJ1ZiwgJmxkaGRyKTsKLQotICBzdHJpbmdzID0gKGNoYXIgKikgYnVmICsgbGRoZHIubF9zdG9mZjsKLQotICBlbHN5bSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikgKGJ1ZiArIExESERSU1opOwotICBlbHN5bWVuZCA9IGVsc3ltICsgbGRoZHIubF9uc3ltczsKLSAgZm9yICg7IGVsc3ltIDwgZWxzeW1lbmQ7IGVsc3ltKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltIGxkc3ltOwotICAgICAgY2hhciBuYW1idWZbU1lNTk1MRU4gKyAxXTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgeGNvZmZfc3dhcF9sZHN5bV9pbiAoYWJmZCwgZWxzeW0sICZsZHN5bSk7Ci0KLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZXhwb3J0ZWQgc3ltYm9scy4gICovCi0gICAgICBpZiAoKGxkc3ltLmxfc210eXBlICYgTF9FWFBPUlQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChsZHN5bS5fbC5fbF9sLl9sX3plcm9lcyA9PSAwKQotCW5hbWUgPSBzdHJpbmdzICsgbGRzeW0uX2wuX2xfbC5fbF9vZmZzZXQ7Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5IChuYW1idWYsIGxkc3ltLl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKLQkgIG5hbWJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotCSAgbmFtZSA9IG5hbWJ1ZjsKLQl9Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzeW1ib2xzIHRoYXQgYXJlIGN1cnJlbnRseQotICAgICAgICAgdW5kZWZpbmVkLiAgQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgd2UgYXJlIHVzaW5nIGFuIFhDT0ZGCi0gICAgICAgICBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICYmICgoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgaCktPmZsYWdzCi0JICAgICAgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMCkKLQl7Ci0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsIG5hbWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAqcG5lZWRlZCA9IHRydWU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIGRvIG5vdCBuZWVkIHRoaXMgc2hhcmVkIG9iamVjdC4gICovCi0KLSAgaWYgKGJ1ZiAhPSBOVUxMICYmICEgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5rZWVwX2NvbnRlbnRzKQotICAgIHsKLSAgICAgIGZyZWUgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHMpOwotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm5zIHRoZSBpbmRleCBvZiByZWxvYyBpbiBSRUxPQ1Mgd2l0aCB0aGUgbGVhc3QgYWRkcmVzcyBncmVhdGVyCi0gICB0aGFuIG9yIGVxdWFsIHRvIEFERFJFU1MuICBUaGUgcmVsb2NzIGFyZSBzb3J0ZWQgYnkgYWRkcmVzcy4gICovCi0KLXN0YXRpYyBiZmRfc2l6ZV90eXBlCi14Y29mZl9maW5kX3JlbG9jIChyZWxvY3MsIGNvdW50LCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBiZmRfc2l6ZV90eXBlIG1pbiwgbWF4LCB0aGlzOwotCi0gIGlmIChjb3VudCA8IDIpCi0gICAgewotICAgICAgaWYgKGNvdW50ID09IDEgJiYgcmVsb2NzWzBdLnJfdmFkZHIgPCBhZGRyZXNzKQotCXJldHVybiAxOwotICAgICAgZWxzZQotCXJldHVybiAwOwotICAgIH0KLQotICBtaW4gPSAwOwotICBtYXggPSBjb3VudDsKLQotICAvKiBEbyBhIGJpbmFyeSBzZWFyY2ggb3ZlciAobWluLG1heF0uICAqLwotICB3aGlsZSAobWluICsgMSA8IG1heCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHJhZGRyOwotCi0gICAgICB0aGlzID0gKG1heCArIG1pbikgLyAyOwotICAgICAgcmFkZHIgPSByZWxvY3NbdGhpc10ucl92YWRkcjsKLSAgICAgIGlmIChyYWRkciA+IGFkZHJlc3MpCi0JbWF4ID0gdGhpczsKLSAgICAgIGVsc2UgaWYgKHJhZGRyIDwgYWRkcmVzcykKLQltaW4gPSB0aGlzOwotICAgICAgZWxzZQotCXsKLQkgIG1pbiA9IHRoaXM7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChyZWxvY3NbbWluXS5yX3ZhZGRyIDwgYWRkcmVzcykKLSAgICByZXR1cm4gbWluICsgMTsKLQotICB3aGlsZSAobWluID4gMAotCSAmJiByZWxvY3NbbWluIC0gMV0ucl92YWRkciA9PSBhZGRyZXNzKQotICAgIC0tbWluOwotCi0gIHJldHVybiBtaW47Ci19Ci0KLS8qIEFkZCBhbGwgdGhlIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4KLQotICAgWENPRkYgaXMgYSB3ZWlyZCBmb3JtYXQuICBBIG5vcm1hbCBYQ09GRiAubyBmaWxlcyB3aWxsIGhhdmUgdGhyZWUKLSAgIENPRkYgc2VjdGlvbnMtLS50ZXh0LCAuZGF0YSwgYW5kIC5ic3MtLWJ1dCBlYWNoIENPRkYgc2VjdGlvbiB3aWxsCi0gICBjb250YWluIG1hbnkgY3NlY3RzLiAgVGhlc2UgY3NlY3RzIGFyZSBkZXNjcmliZWQgaW4gdGhlIHN5bWJvbAotICAgdGFibGUuICBGcm9tIHRoZSBsaW5rZXIncyBwb2ludCBvZiB2aWV3LCBlYWNoIGNzZWN0IG11c3QgYmUKLSAgIGNvbnNpZGVyZWQgYSBzZWN0aW9uIGluIGl0cyBvd24gcmlnaHQuICBGb3IgZXhhbXBsZSwgYSBUT0MgZW50cnkgaXMKLSAgIGhhbmRsZWQgYXMgYSBzbWFsbCBYTUNfVEMgY3NlY3QuICBUaGUgbGlua2VyIG11c3QgYmUgYWJsZSB0byBtZXJnZQotICAgZGlmZmVyZW50IFRPQyBlbnRyaWVzIHRvZ2V0aGVyLCB3aGljaCBtZWFucyB0aGF0IGl0IG11c3QgYmUgYWJsZSB0bwotICAgZXh0cmFjdCB0aGUgWE1DX1RDIGNzZWN0cyBmcm9tIHRoZSAuZGF0YSBzZWN0aW9uIG9mIHRoZSBpbnB1dCAubwotICAgZmlsZS4KLQotICAgRnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiBvdXIgbGlua2VyLCB0aGlzIGlzLCBvZiBjb3Vyc2UsIGEgaGlkZW91cwotICAgbmlnaHRtYXJlLiAgV2UgY29wZSBieSBhY3R1YWxseSBjcmVhdGluZyBzZWN0aW9ucyBmb3IgZWFjaCBjc2VjdCwKLSAgIGFuZCBkaXNjYXJkaW5nIHRoZSBvcmlnaW5hbCBzZWN0aW9ucy4gIFdlIHRoZW4gaGF2ZSB0byBoYW5kbGUgdGhlCi0gICByZWxvY2F0aW9uIGVudHJpZXMgY2FyZWZ1bGx5LCBzaW5jZSB0aGUgb25seSB3YXkgdG8gdGVsbCB3aGljaAotICAgY3NlY3QgdGhleSBiZWxvbmcgdG8gaXMgdG8gZXhhbWluZSB0aGUgYWRkcmVzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBpbnQgbl90bWFzazsKLSAgdW5zaWduZWQgaW50IG5fYnRzaGZ0OwotICBib29sZWFuIGRlZmF1bHRfY29weTsKLSAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBhc2VjdGlvbiAqKmNzZWN0X2NhY2hlOwotICBiZmRfc2l6ZV90eXBlIGxpbmVzejsKLSAgYXNlY3Rpb24gKm87Ci0gIGFzZWN0aW9uICpsYXN0X3JlYWw7Ci0gIGJvb2xlYW4ga2VlcF9zeW1zOwotICBhc2VjdGlvbiAqY3NlY3Q7Ci0gIHVuc2lnbmVkIGludCBjc2VjdF9pbmRleDsKLSAgYXNlY3Rpb24gKmZpcnN0X2NzZWN0OwotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgYmZkX2J5dGUgKmVzeW07Ci0gIGJmZF9ieXRlICplc3ltX2VuZDsKLSAgc3RydWN0IHJlbG9jX2luZm9fc3RydWN0Ci0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgICBhc2VjdGlvbiAqKmNzZWN0czsKLSAgICAgIGJmZF9ieXRlICpsaW5lbm9zOwotICAgIH0gKnJlbG9jX2luZm8gPSBOVUxMOwotCi0gIGtlZXBfc3ltcyA9IG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCk7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmICEgaW5mby0+c3RhdGljX2xpbmspCi0gICAgewotICAgICAgaWYgKCEgeGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byBidWlsZCBhIC5sb2FkZXIgc2VjdGlvbiwgc28gd2UgZG8gaXQgaGVyZS4gIFRoaXMKLQkgd29uJ3Qgd29yayBpZiB3ZSdyZSBwcm9kdWNpbmcgYW4gWENPRkYgb3V0cHV0IGZpbGUgd2l0aCBubwotCSBYQ09GRiBpbnB1dCBmaWxlcy4gIEZJWE1FLiAgKi8KLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqbHNlYzsKLQotCSAgbHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmxvYWRlciIpOwotCSAgaWYgKGxzZWMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24gPSBsc2VjOwotCSAgbHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0JfQotICAgICAgLyogTGlrZXdpc2UgZm9yIHRoZSBsaW5rYWdlIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqbHNlYzsKLQotCSAgbHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmdsIik7Ci0JICBpZiAobHNlYyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb24gPSBsc2VjOwotCSAgbHNlYy0+ZmxhZ3MgfD0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkJICB8IFNFQ19JTl9NRU1PUlkpOwotCSAgbHNlYy0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQl9Ci0gICAgICAvKiBMaWtld2lzZSBmb3IgdGhlIFRPQyBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dG9jX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqdHNlYzsKLQotCSAgdHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLnRjIik7Ci0JICBpZiAodHNlYyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50b2Nfc2VjdGlvbiA9IHRzZWM7Ci0JICB0c2VjLT5mbGFncyB8PSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgIHwgU0VDX0lOX01FTU9SWSk7Ci0JICB0c2VjLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCX0KLSAgICAgIC8qIExpa2V3aXNlIGZvciB0aGUgZGVzY3JpcHRvciBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKmRzZWM7Ci0KLQkgIGRzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5kcyIpOwotCSAgaWYgKGRzZWMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uID0gZHNlYzsKLQkgIGRzZWMtPmZsYWdzIHw9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCSAgfCBTRUNfSU5fTUVNT1JZKTsKLQkgIGRzZWMtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JfQotICAgICAgLyogTGlrZXdpc2UgZm9yIHRoZSAuZGVidWcgc2VjdGlvbi4gICovCi0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3NlY3Rpb24gPT0gTlVMTAotCSAgJiYgaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQotCXsKLQkgIGFzZWN0aW9uICpkc2VjOwotCi0JICBkc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuZGVidWciKTsKLQkgIGlmIChkc2VjID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3NlY3Rpb24gPSBkc2VjOwotCSAgZHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0JfQotICAgIH0KLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgISBpbmZvLT5zdGF0aWNfbGluaykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuX3RtYXNrID0gY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzazsKLSAgbl9idHNoZnQgPSBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0c2hmdDsKLQotICAvKiBEZWZpbmUgbWFjcm9zIHNvIHRoYXQgSVNGQ04sIGV0LiBhbC4sIG1hY3JvcyB3b3JrIGNvcnJlY3RseS4gICovCi0jZGVmaW5lIE5fVE1BU0sgbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBuX2J0c2hmdAotCi0gIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBkZWZhdWx0X2NvcHkgPSBmYWxzZTsKLSAgZWxzZQotICAgIGRlZmF1bHRfY29weSA9IHRydWU7Ci0KLSAgc3ltY291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0KLSAgLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kCi0gICAgIHRvIGVhY2ggZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLSAgc3ltX2hhc2ggPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJIChzeW1jb3VudAotCQkJICAqIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSkpKTsKLSAgaWYgKHN5bV9oYXNoID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlcyA9IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoOwotICBtZW1zZXQgKHN5bV9oYXNoLCAwLAotCSAgKHNpemVfdCkgc3ltY291bnQgKiBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotCi0gIC8qIEJlY2F1c2Ugb2YgdGhlIHdlaXJkIHN0dWZmIHdlIGFyZSBkb2luZyB3aXRoIFhDT0ZGIGNzZWN0cywgd2UgY2FuCi0gICAgIG5vdCBlYXNpbHkgZGV0ZXJtaW5lIHdoaWNoIHNlY3Rpb24gYSBzeW1ib2wgaXMgaW4sIHNvIHdlIHN0b3JlCi0gICAgIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdGRhdGEgZm9yIHRoZSBpbnB1dCBmaWxlLiAgKi8KLSAgY3NlY3RfY2FjaGUgPSAoKGFzZWN0aW9uICoqKQotCQkgYmZkX2FsbG9jIChhYmZkLCBzeW1jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLSAgaWYgKGNzZWN0X2NhY2hlID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgeGNvZmZfZGF0YSAoYWJmZCktPmNzZWN0cyA9IGNzZWN0X2NhY2hlOwotICBtZW1zZXQgKGNzZWN0X2NhY2hlLCAwLCAoc2l6ZV90KSBzeW1jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotCi0gIC8qIFdoaWxlIHNwbGl0dGluZyBzZWN0aW9ucyBpbnRvIGNzZWN0cywgd2UgbmVlZCB0byBhc3NpZ24gdGhlCi0gICAgIHJlbG9jcyBjb3JyZWN0bHkuICBUaGUgcmVsb2NzIGFuZCB0aGUgY3NlY3RzIG11c3QgYm90aCBiZSBpbgotICAgICBvcmRlciBieSBWTUEgd2l0aGluIGEgZ2l2ZW4gc2VjdGlvbiwgc28gd2UgaGFuZGxlIHRoaXMgYnkKLSAgICAgc2Nhbm5pbmcgYWxvbmcgdGhlIHJlbG9jcyBhcyB3ZSBwcm9jZXNzIHRoZSBjc2VjdHMuICBXZSBpbmRleAotICAgICBpbnRvIHJlbG9jX2luZm8gdXNpbmcgdGhlIHNlY3Rpb24gdGFyZ2V0X2luZGV4LiAgKi8KLSAgcmVsb2NfaW5mbyA9ICgoc3RydWN0IHJlbG9jX2luZm9fc3RydWN0ICopCi0JCWJmZF9tYWxsb2MgKChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSkKLQkJCSAgICAqIHNpemVvZiAoc3RydWN0IHJlbG9jX2luZm9fc3RydWN0KSkpOwotICBpZiAocmVsb2NfaW5mbyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBtZW1zZXQgKChQVFIpIHJlbG9jX2luZm8sIDAsCi0JICAoYWJmZC0+c2VjdGlvbl9jb3VudCArIDEpICogc2l6ZW9mIChzdHJ1Y3QgcmVsb2NfaW5mb19zdHJ1Y3QpKTsKLQotICAvKiBSZWFkIGluIHRoZSByZWxvY3MgYW5kIGxpbmUgbnVtYmVycyBmb3IgZWFjaCBzZWN0aW9uLiAgKi8KLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLSAgbGFzdF9yZWFsID0gTlVMTDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgbGFzdF9yZWFsID0gbzsKLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9Ci0JICAgIHhjb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBvLCB0cnVlLCAoYmZkX2J5dGUgKikgTlVMTCwKLQkJCQkJZmFsc2UsIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgTlVMTCk7Ci0JICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzID0KLQkgICAgKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotCSAgaWYgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBtZW1zZXQgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMsIDAsCi0JCSAgby0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQl9Ci0KLSAgICAgIGlmICgoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZSB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQotCSAgJiYgby0+bGluZW5vX2NvdW50ID4gMCkKLQl7Ci0JICBiZmRfYnl0ZSAqbGluZW5vczsKLQotCSAgbGluZW5vcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChvLT5saW5lbm9fY291bnQgKiBsaW5lc3opOwotCSAgaWYgKGxpbmVub3MgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyA9IGxpbmVub3M7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGxpbmVub3MsIGxpbmVzeiwgby0+bGluZW5vX2NvdW50LCBhYmZkKQotCQkgICE9IGxpbmVzeiAqIG8tPmxpbmVub19jb3VudCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogRG9uJ3QgbGV0IHRoZSBsaW5rZXIgcmVsb2NhdGlvbiByb3V0aW5lcyBkaXNjYXJkIHRoZSBzeW1ib2xzLiAgKi8KLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IHRydWU7Ci0KLSAgY3NlY3QgPSBOVUxMOwotICBjc2VjdF9pbmRleCA9IDA7Ci0gIGZpcnN0X2NzZWN0ID0gTlVMTDsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBCRkRfQVNTRVJUIChzeW1lc3ogPT0gYmZkX2NvZmZfYXV4ZXN6IChhYmZkKSk7Ci0gIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIHN5bWNvdW50ICogc3ltZXN6OwotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotICAgICAgaW50IHNtdHlwOwotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpzZXRfdG9jOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJnN5bSk7Ci0KLSAgICAgIC8qIEluIHRoaXMgcGFzcyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgd2l0aCBjc2VjdAotICAgICAgICAgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVCAmJiBzeW0ubl9zY2xhc3MgIT0gQ19ISURFWFQpCi0JewotCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUgJiYgY3NlY3QgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5sYXN0X3N5bW5keCA9Ci0JCSgoZXN5bQotCQkgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkgLyBzeW1lc3opOwotCSAgICAgIGNzZWN0ID0gTlVMTDsKLQkgICAgfQotCi0JICBpZiAoY3NlY3QgIT0gTlVMTCkKLQkgICAgKmNzZWN0X2NhY2hlID0gY3NlY3Q7Ci0JICBlbHNlIGlmIChmaXJzdF9jc2VjdCA9PSBOVUxMIHx8IHN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JICAgICpjc2VjdF9jYWNoZSA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOwotCSAgZWxzZQotCSAgICAqY3NlY3RfY2FjaGUgPSBOVUxMOwotCSAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0JICBzeW1faGFzaCArPSBzeW0ubl9udW1hdXggKyAxOwotCSAgY3NlY3RfY2FjaGUgKz0gc3ltLm5fbnVtYXV4ICsgMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoYWJmZCwgJnN5bSwgYnVmKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byBpdCwKLSAgICAgICAgIGFuZCB3ZSdyZSBub3Qgc3RyaXBwaW5nIGl0LCBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kCi0gICAgICAgICBhZGQgdGhlbSB0byB0aGUgY291bnQgZm9yIHRoaXMgY3NlY3QuICBJbiB0aGUgZmluYWwgbGluayBwYXNzCi0gICAgICAgICB3ZSBhcmUgZ29pbmcgdG8gYXR0YWNoIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGJ5IHN5bWJvbCwKLSAgICAgICAgIHJhdGhlciB0aGFuIGJ5IHNlY3Rpb24sIGluIG9yZGVyIHRvIG1vcmUgZWFzaWx5IGhhbmRsZQotICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgICAgIGlmICgoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZSB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQotCSAgJiYgc3ltLm5fbnVtYXV4ID4gMQotCSAgJiYgY3NlY3QgIT0gTlVMTAotCSAgJiYgSVNGQ04gKHN5bS5uX3R5cGUpKQotCXsKLQkgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhsaW47Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCAoUFRSKSAoZXN5bSArIHN5bWVzeiksCi0JCQkJc3ltLm5fdHlwZSwgc3ltLm5fc2NsYXNzLAotCQkJCTAsIHN5bS5uX251bWF1eCwgKFBUUikgJmF1eGxpbik7Ci0JICBpZiAoYXV4bGluLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciAhPSAwKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGxpbm9mZjsKLQotCSAgICAgIGVuY2xvc2luZyA9IHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5lbmNsb3Npbmc7Ci0JICAgICAgaWYgKGVuY2xvc2luZyA9PSBOVUxMKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IGAlcycgaGFzIGxpbmUgbnVtYmVycyBidXQgbm8gZW5jbG9zaW5nIHNlY3Rpb24iKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgICBsaW5vZmYgPSAoYXV4bGluLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cgotCQkJLSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcyk7Ci0JICAgICAgaWYgKGxpbm9mZiA8IGVuY2xvc2luZy0+bGluZW5vX2NvdW50ICogbGluZXN6KQotCQl7Ci0JCSAgc3RydWN0IGludGVybmFsX2xpbmVubyBsaW47Ci0JCSAgYmZkX2J5dGUgKmxpbnBzdGFydDsKLQotCQkgIGxpbnBzdGFydCA9IChyZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5saW5lbm9zCi0JCQkgICAgICAgKyBsaW5vZmYpOwotCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCAoUFRSKSBsaW5wc3RhcnQsIChQVFIpICZsaW4pOwotCQkgIGlmIChsaW4ubF9sbm5vID09IDAKLQkJICAgICAgJiYgKChiZmRfc2l6ZV90eXBlKSBsaW4ubF9hZGRyLmxfc3ltbmR4Ci0JCQkgID09ICgoZXN5bQotCQkJICAgICAgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkJICAgICAgLyBzeW1lc3opKSkKLQkJICAgIHsKLQkJICAgICAgYmZkX2J5dGUgKmxpbnBlbmQsICpsaW5wOwotCi0JCSAgICAgIGxpbnBlbmQgPSAocmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0ubGluZW5vcwotCQkJCSArIGVuY2xvc2luZy0+bGluZW5vX2NvdW50ICogbGluZXN6KTsKLQkJICAgICAgZm9yIChsaW5wID0gbGlucHN0YXJ0ICsgbGluZXN6OwotCQkJICAgbGlucCA8IGxpbnBlbmQ7Ci0JCQkgICBsaW5wICs9IGxpbmVzeikKLQkJCXsKLQkJCSAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGFiZmQsIChQVFIpIGxpbnAsCi0JCQkJCQkgICAoUFRSKSAmbGluKTsKLQkJCSAgaWYgKGxpbi5sX2xubm8gPT0gMCkKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJICAgICAgY3NlY3QtPmxpbmVub19jb3VudCArPSAobGlucCAtIGxpbnBzdGFydCkgLyBsaW5lc3o7Ci0JCSAgICAgIC8qIFRoZSBzZXR0aW5nIG9mIGxpbmVfZmlsZXBvcyB3aWxsIG9ubHkgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2VmdWwgaWYgYWxsIHRoZSBsaW5lIG51bWJlciBlbnRyaWVzIGZvciBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3NlY3QgYXJlIGNvbnRpZ3VvdXM7IHRoaXMgb25seSBtYXR0ZXJzIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIHJlcG9ydGluZy4gICovCi0JCSAgICAgIGlmIChjc2VjdC0+bGluZV9maWxlcG9zID09IDApCi0JCQljc2VjdC0+bGluZV9maWxlcG9zID0KLQkJCSAgYXV4bGluLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cjsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBQaWNrIHVwIHRoZSBjc2VjdCBhdXhpbGlhcnkgaW5mb3JtYXRpb24uICAqLwotCi0gICAgICBpZiAoc3ltLm5fbnVtYXV4ID09IDApCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogY2xhc3MgJWQgc3ltYm9sIGAlcycgaGFzIG5vIGF1eCBlbnRyaWVzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3ltLm5fc2NsYXNzLCBuYW1lKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwKLQkJCSAgICAoUFRSKSAoZXN5bSArIHN5bWVzeiAqIHN5bS5uX251bWF1eCksCi0JCQkgICAgc3ltLm5fdHlwZSwgc3ltLm5fc2NsYXNzLAotCQkJICAgIHN5bS5uX251bWF1eCAtIDEsIHN5bS5uX251bWF1eCwKLQkJCSAgICAoUFRSKSAmYXV4KTsKLQotICAgICAgc210eXAgPSBTTVRZUF9TTVRZUCAoYXV4LnhfY3NlY3QueF9zbXR5cCk7Ci0KLSAgICAgIGZsYWdzID0gQlNGX0dMT0JBTDsKLSAgICAgIHNlY3Rpb24gPSBOVUxMOwotICAgICAgdmFsdWUgPSAwOwotICAgICAgc2V0X3RvYyA9IE5VTEw7Ci0KLSAgICAgIHN3aXRjaCAoc210eXApCi0JewotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBzeW1ib2wgYCVzJyBoYXMgdW5yZWNvZ25pemVkIGNzZWN0IHR5cGUgJWQiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCBzbXR5cCk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JY2FzZSBYVFlfRVI6Ci0JICAvKiBUaGlzIGlzIGFuIGV4dGVybmFsIHJlZmVyZW5jZS4gICovCi0JICBpZiAoc3ltLm5fc2NsYXNzID09IENfSElERVhUCi0JICAgICAgfHwgc3ltLm5fc2NudW0gIT0gTl9VTkRFRgotCSAgICAgIHx8IGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgIT0gMCkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiJXM6IGJhZCBYVFlfRVIgc3ltYm9sIGAlcyc6IGNsYXNzICVkIHNjbnVtICVkIHNjbmxlbiAlZCIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIHN5bS5uX3NjbGFzcywgc3ltLm5fc2NudW0sCi0JCSBhdXgueF9jc2VjdC54X3Njbmxlbi5sKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICAvKiBBbiBYTUNfWE8gZXh0ZXJuYWwgcmVmZXJlbmNlIGlzIGFjdHVhbGx5IGEgcmVmZXJlbmNlIHRvCi0gICAgICAgICAgICAgYW4gYWJzb2x1dGUgbG9jYXRpb24uICAqLwotCSAgaWYgKGF1eC54X2NzZWN0Lnhfc21jbGFzICE9IFhNQ19YTykKLQkgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWx1ZSA9IHN5bS5uX3ZhbHVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgWFRZX1NEOgotCSAgLyogVGhpcyBpcyBhIGNzZWN0IGRlZmluaXRpb24uICAqLwotCi0JICBpZiAoY3NlY3QgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5sYXN0X3N5bW5keCA9Ci0JCSgoZXN5bQotCQkgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkgLyBzeW1lc3opOwotCSAgICB9Ci0KLQkgIGNzZWN0ID0gTlVMTDsKLQkgIGNzZWN0X2luZGV4ID0gLTE7Ci0KLQkgIC8qIFdoZW4gd2Ugc2VlIGEgVE9DIGFuY2hvciwgd2UgcmVjb3JkIHRoZSBUT0MgdmFsdWUuICAqLwotCSAgaWYgKGF1eC54X2NzZWN0Lnhfc21jbGFzID09IFhNQ19UQzApCi0JICAgIHsKLQkgICAgICBpZiAoc3ltLm5fc2NsYXNzICE9IENfSElERVhUCi0JCSAgfHwgYXV4LnhfY3NlY3QueF9zY25sZW4ubCAhPSAwKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IFhNQ19UQzAgc3ltYm9sIGAlcycgaXMgY2xhc3MgJWQgc2NubGVuICVkIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIHN5bS5uX3NjbGFzcywKLQkJICAgICBhdXgueF9jc2VjdC54X3Njbmxlbi5sKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICAgIHhjb2ZmX2RhdGEgKGFiZmQpLT50b2MgPSBzeW0ubl92YWx1ZTsKLQkgICAgfQotCi0JICAvKiBXZSBtdXN0IG1lcmdlIFRPQyBlbnRyaWVzIGZvciB0aGUgc2FtZSBzeW1ib2wuICBXZSBjYW4KLQkgICAgIG1lcmdlIHR3byBUT0MgZW50cmllcyBpZiB0aGV5IGFyZSBib3RoIENfSElERVhULCB0aGV5Ci0JICAgICBib3RoIGhhdmUgdGhlIHNhbWUgbmFtZSwgdGhleSBhcmUgYm90aCA0IGJ5dGVzIGxvbmcsIGFuZAotCSAgICAgdGhleSBib3RoIGhhdmUgYSByZWxvY2F0aW9uIHRhYmxlIGVudHJ5IGZvciBhbiBleHRlcm5hbAotCSAgICAgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMKLQkgICAgIHRoYXQgd2UgbXVzdCBsb29rIHRocm91Z2ggdGhlIHJlbG9jYXRpb25zLiAgSWNrLiAgKi8KLQkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMKLQkgICAgICAmJiBzeW0ubl9zY2xhc3MgPT0gQ19ISURFWFQKLQkgICAgICAmJiBhdXgueF9jc2VjdC54X3Njbmxlbi5sID09IDQKLQkgICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotCSAgICAgIGJmZF9zaXplX3R5cGUgcmVsaW5keDsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLQotCSAgICAgIGVuY2xvc2luZyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOwotCSAgICAgIGlmIChlbmNsb3NpbmcgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICByZWxvY3MgPSByZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICAgICAgcmVsaW5keCA9IHhjb2ZmX2ZpbmRfcmVsb2MgKHJlbG9jcywgZW5jbG9zaW5nLT5yZWxvY19jb3VudCwKLQkJCQkJICBzeW0ubl92YWx1ZSk7Ci0JICAgICAgcmVsID0gcmVsb2NzICsgcmVsaW5keDsKLQkgICAgICBpZiAocmVsaW5keCA8IGVuY2xvc2luZy0+cmVsb2NfY291bnQKLQkJICAmJiByZWwtPnJfdmFkZHIgPT0gKGJmZF92bWEpIHN5bS5uX3ZhbHVlCi0JCSAgJiYgcmVsLT5yX3NpemUgPT0gMzEKLQkJICAmJiByZWwtPnJfdHlwZSA9PSBSX1BPUykKLQkJewotCQkgIGJmZF9ieXRlICplcmVsc3ltOwotCQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgcmVsc3ltOwotCi0JCSAgZXJlbHN5bSA9ICgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKLQkJCSAgICAgKyByZWwtPnJfc3ltbmR4ICogc3ltZXN6KTsKLQkJICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXJlbHN5bSwgKFBUUikgJnJlbHN5bSk7Ci0JCSAgaWYgKHJlbHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqcmVsbmFtZTsKLQkJICAgICAgY2hhciByZWxidWZbU1lNTk1MRU4gKyAxXTsKLQkJICAgICAgYm9vbGVhbiBjb3B5OwotCQkgICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgICAgIC8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHRoZSBUT0MgZW50cnkgaXMKLQkJCSBmb3IgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbC4gICovCi0JCSAgICAgIHJlbG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZyZWxzeW0sCi0JCQkJCQkJCXJlbGJ1Zik7Ci0JCSAgICAgIGlmIChyZWxuYW1lID09IE5VTEwpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgICAvKiBXZSBvbmx5IG1lcmdlIFRPQyBlbnRyaWVzIGlmIHRoZSBUQyBuYW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgYXMgdGhlIHN5bWJvbCBuYW1lLiAgVGhpcyBoYW5kbGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5vcm1hbCBjYXNlLCBidXQgbm90IGNvbW1vbiBjYXNlcyBsaWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgU1lNLlA0IHdoaWNoIGdjYyBnZW5lcmF0ZXMgdG8gc3RvcmUgU1lNICsgNAotICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBUT0MuICBGSVhNRS4gICovCi0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHJlbG5hbWUpID09IDApCi0JCQl7Ci0JCQkgIGNvcHkgPSAoISBpbmZvLT5rZWVwX21lbW9yeQotCQkJCSAgfHwgcmVsc3ltLl9uLl9uX24uX25femVyb2VzICE9IDAKLQkJCQkgIHx8IHJlbHN5bS5fbi5fbl9uLl9uX29mZnNldCA9PSAwKTsKLQkJCSAgaCA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgICAgcmVsbmFtZSwgdHJ1ZSwgY29weSwKLQkJCQkJCSAgICAgIGZhbHNlKTsKLQkJCSAgaWYgKGggPT0gTlVMTCkKLQkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkJICAvKiBBdCB0aGlzIHBvaW50IGgtPnJvb3QudHlwZSBjb3VsZCBiZQotCQkJICAgICBiZmRfbGlua19oYXNoX25ldy4gIFRoYXQgc2hvdWxkIGJlIE9LLAotCQkJICAgICBzaW5jZSB3ZSBrbm93IGZvciBzdXJlIHRoYXQgd2Ugd2lsbCBjb21lCi0JCQkgICAgIGFjcm9zcyB0aGlzIHN5bWJvbCBhcyB3ZSBzdGVwIHRocm91Z2ggdGhlCi0JCQkgICAgIGZpbGUuICAqLwotCi0JCQkgIC8qIFdlIHN0b3JlIGggaW4gKnN5bV9oYXNoIGZvciB0aGUKLQkJCSAgICAgY29udmVuaWVuY2Ugb2YgdGhlIHJlbG9jYXRlX3NlY3Rpb24KLQkJCSAgICAgZnVuY3Rpb24uICAqLwotCQkJICAqc3ltX2hhc2ggPSBoOwotCi0JCQkgIGlmIChoLT50b2Nfc2VjdGlvbiAhPSBOVUxMKQotCQkJICAgIHsKLQkJCSAgICAgIGFzZWN0aW9uICoqcmVsX2NzZWN0czsKLQotCQkJICAgICAgLyogV2UgYWxyZWFkeSBoYXZlIGEgVE9DIGVudHJ5IGZvciB0aGlzCi0JCQkJIHN5bWJvbCwgc28gd2UgY2FuIGp1c3QgaWdub3JlIHRoaXMKLQkJCQkgb25lLiAgKi8KLQkJCSAgICAgIHJlbF9jc2VjdHMgPQotCQkJCXJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLmNzZWN0czsKLQkJCSAgICAgIHJlbF9jc2VjdHNbcmVsaW5keF0gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCi0JCQkgIC8qIFdlIGFyZSBhYm91dCB0byBjcmVhdGUgYSBUT0MgZW50cnkgZm9yCi0JCQkgICAgIHRoaXMgc3ltYm9sLiAgKi8KLQkJCSAgc2V0X3RvYyA9IGg7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBzZWN0aW9uLiAgV2UgZ2V0IHRoZSBuYW1lIGZyb20KLQkgICAgIHRoZSBjc2VjdCBzdG9yYWdlIG1hcHBpbmcgY2xhc3MsIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4KLQkgICAgIGFjY3VtdWxhdGUgc2ltaWxhciBjc2VjdHMgdG9nZXRoZXIuICAqLwotCSAgewotCSAgICBzdGF0aWMgY29uc3QgY2hhciAqY3NlY3RfbmFtZV9ieV9jbGFzc1tdID0KLQkgICAgICB7Ci0JCSIucHIiLCAiLnJvIiwgIi5kYiIsICIudGMiLCAiLnVhIiwgIi5ydyIsICIuZ2wiLCAiLnhvIiwKLQkJIi5zdiIsICIuYnMiLCAiLmRzIiwgIi51YyIsICIudGkiLCAiLnRiIiwgTlVMTCwgIi50YzAiLAotCQkiLnRkIgotCSAgICAgIH07Ci0JICAgIGNvbnN0IGNoYXIgKmNzZWN0X25hbWU7Ci0JICAgIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0KLQkgICAgaWYgKChhdXgueF9jc2VjdC54X3NtY2xhcyA+PQotCQkgc2l6ZW9mIGNzZWN0X25hbWVfYnlfY2xhc3MgLyBzaXplb2YgY3NlY3RfbmFtZV9ieV9jbGFzc1swXSkKLQkJfHwgY3NlY3RfbmFtZV9ieV9jbGFzc1thdXgueF9jc2VjdC54X3NtY2xhc10gPT0gTlVMTCkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogc3ltYm9sIGAlcycgaGFzIHVucmVjb2duaXplZCBzbWNsYXMgJWQiKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIGF1eC54X2NzZWN0Lnhfc21jbGFzKTsKLQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIH0KLQotCSAgICBjc2VjdF9uYW1lID0gY3NlY3RfbmFtZV9ieV9jbGFzc1thdXgueF9jc2VjdC54X3NtY2xhc107Ci0JICAgIGNzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIGNzZWN0X25hbWUpOwotCSAgICBpZiAoY3NlY3QgPT0gTlVMTCkKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgZW5jbG9zaW5nID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLCBzeW0ubl9zY251bSk7Ci0JICAgIGlmIChlbmNsb3NpbmcgPT0gTlVMTCkKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChlbmNsb3NpbmcpCi0JCSYmICgoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPCBlbmNsb3NpbmctPnZtYQotCQkgICAgfHwgKChiZmRfdm1hKSBzeW0ubl92YWx1ZSArIGF1eC54X2NzZWN0Lnhfc2NubGVuLmwKLQkJCT4gZW5jbG9zaW5nLT52bWEgKyBlbmNsb3NpbmctPl9yYXdfc2l6ZSkpKQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIiVzOiBjc2VjdCBgJXMnIG5vdCBpbiBlbmNsb3Npbmcgc2VjdGlvbiIpLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSk7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB9Ci0JICAgIGNzZWN0LT52bWEgPSBzeW0ubl92YWx1ZTsKLQkgICAgY3NlY3QtPmZpbGVwb3MgPSAoZW5jbG9zaW5nLT5maWxlcG9zCi0JCQkgICAgICArIHN5bS5uX3ZhbHVlCi0JCQkgICAgICAtIGVuY2xvc2luZy0+dm1hKTsKLQkgICAgY3NlY3QtPl9yYXdfc2l6ZSA9IGF1eC54X2NzZWN0Lnhfc2NubGVuLmw7Ci0JICAgIGNzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIGNzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBTTVRZUF9BTElHTiAoYXV4LnhfY3NlY3QueF9zbXR5cCk7Ci0KLQkgICAgLyogUmVjb3JkIHRoZSBlbmNsb3Npbmcgc2VjdGlvbiBpbiB0aGUgdGRhdGEgZm9yIHRoaXMgbmV3Ci0JICAgICAgIHNlY3Rpb24uICAqLwotCSAgICBjc2VjdC0+dXNlZF9ieV9iZmQgPQotCSAgICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgICBpZiAoY3NlY3QtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPnRkYXRhID0KLQkgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKSk7Ci0JICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT50ZGF0YSA9PSBOVUxMKQotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+ZW5jbG9zaW5nID0gZW5jbG9zaW5nOwotCSAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+bGluZW5vX2NvdW50ID0KLQkgICAgICBlbmNsb3NpbmctPmxpbmVub19jb3VudDsKLQotCSAgICBpZiAoZW5jbG9zaW5nLT5vd25lciA9PSBhYmZkKQotCSAgICAgIHsKLQkJc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0JCWJmZF9zaXplX3R5cGUgcmVsaW5keDsKLQkJc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0JCWFzZWN0aW9uICoqcmVsX2NzZWN0OwotCi0JCXJlbG9jcyA9IHJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKLQkJcmVsaW5keCA9IHhjb2ZmX2ZpbmRfcmVsb2MgKHJlbG9jcywgZW5jbG9zaW5nLT5yZWxvY19jb3VudCwKLQkJCQkJICAgIGNzZWN0LT52bWEpOwotCQlyZWwgPSByZWxvY3MgKyByZWxpbmR4OwotCQlyZWxfY3NlY3QgPSAocmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0uY3NlY3RzCi0JCQkgICAgICsgcmVsaW5keCk7Ci0JCWNzZWN0LT5yZWxfZmlsZXBvcyA9IChlbmNsb3NpbmctPnJlbF9maWxlcG9zCi0JCQkJICAgICAgKyByZWxpbmR4ICogYmZkX2NvZmZfcmVsc3ogKGFiZmQpKTsKLQkJd2hpbGUgKHJlbGluZHggPCBlbmNsb3NpbmctPnJlbG9jX2NvdW50Ci0JCSAgICAgICAmJiAqcmVsX2NzZWN0ID09IE5VTEwKLQkJICAgICAgICYmIHJlbC0+cl92YWRkciA8IGNzZWN0LT52bWEgKyBjc2VjdC0+X3Jhd19zaXplKQotCQkgIHsKLQkJICAgICpyZWxfY3NlY3QgPSBjc2VjdDsKLQkJICAgIGNzZWN0LT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0JCSAgICArK2NzZWN0LT5yZWxvY19jb3VudDsKLQkJICAgICsrcmVsaW5keDsKLQkJICAgICsrcmVsOwotCQkgICAgKytyZWxfY3NlY3Q7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAvKiBUaGVyZSBhcmUgYSBudW1iZXIgb2Ygb3RoZXIgZmllbGRzIGFuZCBzZWN0aW9uIGZsYWdzCi0JICAgICAgIHdoaWNoIHdlIGRvIG5vdCBib3RoZXIgdG8gc2V0LiAgKi8KLQotCSAgICBjc2VjdF9pbmRleCA9ICgoZXN5bQotCQkJICAgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkJICAgLyBzeW1lc3opOwotCi0JICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5maXJzdF9zeW1uZHggPSBjc2VjdF9pbmRleDsKLQotCSAgICBpZiAoZmlyc3RfY3NlY3QgPT0gTlVMTCkKLQkgICAgICBmaXJzdF9jc2VjdCA9IGNzZWN0OwotCi0JICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIENfRVhULCB3ZSB0cmVhdCBpdCBhcyBzdGFydGluZyBhdCB0aGUKLQkgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBuZXdseSBjcmVhdGVkIHNlY3Rpb24uICAqLwotCSAgICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUKQotCSAgICAgIHsKLQkJc2VjdGlvbiA9IGNzZWN0OwotCQl2YWx1ZSA9IDA7Ci0JICAgICAgfQotCi0JICAgIC8qIElmIHRoaXMgaXMgYSBUT0Mgc2VjdGlvbiBmb3IgYSBzeW1ib2wsIHJlY29yZCBpdC4gICovCi0JICAgIGlmIChzZXRfdG9jICE9IE5VTEwpCi0JICAgICAgc2V0X3RvYy0+dG9jX3NlY3Rpb24gPSBjc2VjdDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBYVFlfTEQ6Ci0JICAvKiBUaGlzIGlzIGEgbGFiZWwgZGVmaW5pdGlvbi4gIFRoZSB4X3NjbmxlbiBmaWVsZCBpcyB0aGUKLSAgICAgICAgICAgICBzeW1ib2wgaW5kZXggb2YgdGhlIGNzZWN0LiAgSSBiZWxpZXZlIHRoYXQgdGhpcyBtdXN0Ci0gICAgICAgICAgICAgYWx3YXlzIGZvbGxvdyB0aGUgYXBwcm9wcmlhdGUgWFRZX1NEIHN5bWJvbCwgc28gSSB3aWxsCi0gICAgICAgICAgICAgaW5zaXN0IG9uIGl0LiAgKi8KLQkgIHsKLQkgICAgYm9vbGVhbiBiYWQ7Ci0KLQkgICAgYmFkID0gZmFsc2U7Ci0JICAgIGlmIChhdXgueF9jc2VjdC54X3Njbmxlbi5sIDwgMAotCQl8fCAoYXV4LnhfY3NlY3QueF9zY25sZW4ubAotCQkgICAgPj0gZXN5bSAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkpCi0JICAgICAgYmFkID0gdHJ1ZTsKLQkgICAgaWYgKCEgYmFkKQotCSAgICAgIHsKLQkJc2VjdGlvbiA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5jc2VjdHNbYXV4LnhfY3NlY3QueF9zY25sZW4ubF07Ci0JCWlmIChzZWN0aW9uID09IE5VTEwKLQkJICAgIHx8IChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0JCSAgYmFkID0gdHJ1ZTsKLQkgICAgICB9Ci0JICAgIGlmIChiYWQpCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiJXM6IG1pc3BsYWNlZCBYVFlfTEQgYCVzJyIpLAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSk7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB9Ci0KLQkgICAgdmFsdWUgPSBzeW0ubl92YWx1ZSAtIGNzZWN0LT52bWE7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgWFRZX0NNOgotCSAgLyogVGhpcyBpcyBhbiB1bml0aWFsaXplZCBjc2VjdC4gIFdlIGNvdWxkIGJhc2UgdGhlIG5hbWUgb24KLSAgICAgICAgICAgICB0aGUgc3RvcmFnZSBtYXBwaW5nIGNsYXNzLCBidXQgd2UgZG9uJ3QgYm90aGVyIGV4Y2VwdCBmb3IKLSAgICAgICAgICAgICBhbiBYTUNfVEQgc3ltYm9sLiAgSWYgdGhpcyBjc2VjdCBpcyBleHRlcm5hbGx5IHZpc2libGUsCi0gICAgICAgICAgICAgaXQgaXMgYSBjb21tb24gc3ltYm9sLiAgV2UgcHV0IFhNQ19URCBzeW1ib2xzIGluIHNlY3Rpb25zCi0gICAgICAgICAgICAgbmFtZWQgLnRvY2JzcywgYW5kIHJlbHkgb24gdGhlIGxpbmtlciBzY3JpcHQgdG8gcHV0IHRoYXQKLSAgICAgICAgICAgICBpbiB0aGUgVE9DIGFyZWEuICAqLwotCi0JICBpZiAoY3NlY3QgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5sYXN0X3N5bW5keCA9Ci0JCSgoZXN5bQotCQkgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQotCQkgLyBzeW1lc3opOwotCSAgICB9Ci0KLQkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEQpCi0JICAgIGNzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIudG9jYnNzIik7Ci0JICBlbHNlCi0JICAgIGNzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuYnNzIik7Ci0JICBpZiAoY3NlY3QgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBjc2VjdC0+dm1hID0gc3ltLm5fdmFsdWU7Ci0JICBjc2VjdC0+X3Jhd19zaXplID0gYXV4LnhfY3NlY3QueF9zY25sZW4ubDsKLQkgIGNzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0JICBjc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gU01UWVBfQUxJR04gKGF1eC54X2NzZWN0Lnhfc210eXApOwotCSAgLyogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG90aGVyIGZpZWxkcyBhbmQgc2VjdGlvbiBmbGFncwotCSAgICAgd2hpY2ggd2UgZG8gbm90IGJvdGhlciB0byBzZXQuICAqLwotCi0JICBjc2VjdF9pbmRleCA9ICgoZXN5bQotCQkJICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJCSAvIHN5bWVzeik7Ci0KLQkgIGNzZWN0LT51c2VkX2J5X2JmZCA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGNzZWN0LT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPnRkYXRhID0KLQkgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPnRkYXRhID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPmZpcnN0X3N5bW5keCA9IGNzZWN0X2luZGV4OwotCi0JICBpZiAoZmlyc3RfY3NlY3QgPT0gTlVMTCkKLQkgICAgZmlyc3RfY3NlY3QgPSBjc2VjdDsKLQotCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkgICAgewotCSAgICAgIGNzZWN0LT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgICAgIGNzZWN0LT5fcmF3X3NpemUgPSAwOwotCSAgICAgIHNlY3Rpb24gPSBjc2VjdDsKLQkgICAgICB2YWx1ZSA9IGF1eC54X2NzZWN0Lnhfc2NubGVuLmw7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBDaGVjayBmb3IgbWFnaWMgc3ltYm9sIG5hbWVzLiAgKi8KLSAgICAgIGlmICgoc210eXAgPT0gWFRZX1NEIHx8IHNtdHlwID09IFhUWV9DTSkKLQkgICYmIGF1eC54X2NzZWN0Lnhfc21jbGFzICE9IFhNQ19UQwotCSAgJiYgYXV4LnhfY3NlY3QueF9zbWNsYXMgIT0gWE1DX1REKQotCXsKLQkgIGludCBpOwotCi0JICBpID0gLTE7Ci0JICBpZiAobmFtZVswXSA9PSAnXycpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiX3RleHQiKSA9PSAwKQotCQlpID0gMDsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZXRleHQiKSA9PSAwKQotCQlpID0gMTsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZGF0YSIpID09IDApCi0JCWkgPSAyOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9lZGF0YSIpID09IDApCi0JCWkgPSAzOwotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9lbmQiKSA9PSAwKQotCQlpID0gNDsKLQkgICAgfQotCSAgZWxzZSBpZiAobmFtZVswXSA9PSAnZScgJiYgc3RyY21wIChuYW1lLCAiZW5kIikgPT0gMCkKLQkgICAgaSA9IDU7Ci0KLQkgIGlmIChpICE9IC0xKQotCSAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3BlY2lhbF9zZWN0aW9uc1tpXSA9IGNzZWN0OwotCX0KLQotICAgICAgLyogTm93IHdlIGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGFkZCB0aGUgc3ltYm9sIHRvIHRoZQotICAgICAgICAgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0gICAgICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUKQotCXsKLQkgIGJvb2xlYW4gY29weTsKLQotCSAgQkZEX0FTU0VSVCAoc2VjdGlvbiAhPSBOVUxMKTsKLQotCSAgLyogV2UgbXVzdCBjb3B5IHRoZSBuYW1lIGludG8gbWVtb3J5IGlmIHdlIGdvdCBpdCBmcm9tIHRoZQotICAgICAgICAgICAgIHN5bWVudCBpdHNlbGYsIHJhdGhlciB0aGFuIHRoZSBzdHJpbmcgdGFibGUuICAqLwotCSAgY29weSA9IGRlZmF1bHRfY29weTsKLQkgIGlmIChzeW0uX24uX25fbi5fbl96ZXJvZXMgIT0gMAotCSAgICAgIHx8IHN5bS5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQotCSAgICBjb3B5ID0gdHJ1ZTsKLQotCSAgLyogVGhlIEFJWCBsaW5rZXIgYXBwZWFycyB0byBvbmx5IGRldGVjdCBtdWx0aXBsZSBzeW1ib2wKLQkgICAgIGRlZmluaXRpb25zIHdoZW4gdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbC4gIElmCi0JICAgICBhIHN5bWJvbCBpcyBkZWZpbmVkIG11bHRpcGxlIHRpbWVzLCBhbmQgdGhlIG9ubHkKLQkgICAgIHJlZmVyZW5jZXMgYXJlIGZyb20gdGhlIHNhbWUgb2JqZWN0IGZpbGUsIHRoZSBBSVggbGlua2VyCi0JICAgICBhcHBlYXJzIHRvIHBlcm1pdCBpdC4gIEl0IGRvZXMgbm90IG1lcmdlIHRoZSBkaWZmZXJlbnQKLQkgICAgIGRlZmluaXRpb25zLCBidXQgaGFuZGxlcyB0aGVtIGluZGVwZW5kZW50bHkuICBPbiB0aGUKLQkgICAgIG90aGVyIGhhbmQsIGlmIHRoZXJlIGlzIGEgcmVmZXJlbmNlLCB0aGUgbGlua2VyIHJlcG9ydHMKLQkgICAgIGFuIGVycm9yLgotCi0JICAgICBUaGlzIG1hdHRlcnMgYmVjYXVzZSB0aGUgQUlYIDxuZXQvbmV0X2dsb2JhbHMuaD4gaGVhZGVyCi0JICAgICBmaWxlIGFjdHVhbGx5IGRlZmluZXMgYW4gaW5pdGlhbGl6ZWQgYXJyYXksIHNvIHdlIGhhdmUgdG8KLQkgICAgIGFjdHVhbGx5IHBlcm1pdCB0aGF0IHRvIHdvcmsuCi0KLQkgICAgIEp1c3QgdG8gbWFrZSBtYXR0ZXJzIGV2ZW4gbW9yZSBjb25mdXNpbmcsIHRoZSBBSVggbGlua2VyCi0JICAgICBhcHBlYXJzIHRvIHBlcm1pdCBtdWx0aXBsZSBzeW1ib2wgZGVmaW5pdGlvbnMgd2hlbmV2ZXIKLQkgICAgIHRoZSBzZWNvbmQgZGVmaW5pdGlvbiBpcyBpbiBhbiBhcmNoaXZlIHJhdGhlciB0aGFuIGFuCi0JICAgICBvYmplY3QgZmlsZS4gIFRoaXMgbWF5IGJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIG1hbm5lciBpbgotCSAgICAgd2hpY2ggaXQgaGFuZGxlcyBhcmNoaXZlczogSSB0aGluayBpdCBtYXkgbG9hZCB0aGUgZW50aXJlCi0JICAgICBhcmNoaXZlIGluIGFzIHNlcGFyYXRlIGNzZWN0cywgYW5kIHRoZW4gbGV0IGdhcmJhZ2UKLQkgICAgIGNvbGxlY3Rpb24gZGlzY2FyZCBzeW1ib2xzLgotCi0JICAgICBXZSBhbHNvIGhhdmUgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHN0YXRpY2FsbHkgbGlua2luZyBhCi0JICAgICBzaGFyZWQgb2JqZWN0LCB3aGljaCB3aWxsIGNhdXNlIHN5bWJvbCByZWRlZmluaXRpb25zLAotCSAgICAgYWx0aG91Z2ggdGhpcyBpcyBhbiBlYXNpZXIgY2FzZSB0byBkZXRlY3QuICAqLwotCi0JICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLQkJKnN5bV9oYXNoID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgICAgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpOwotCSAgICAgIGVsc2UKLQkJKnN5bV9oYXNoID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JCQkgICAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIG5hbWUsCi0JCQkJCQkJICAgdHJ1ZSwgY29weSwgZmFsc2UpKTsKLQkgICAgICBpZiAoKnN5bV9oYXNoID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGlmICgoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgfHwgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCSAgJiYgISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0JCSAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhIHNlY29uZCBkZWZpbml0aW9uIG9mIGEgZGVmaW5lZCBzeW1ib2wuICAqLwotCQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmICgoKnN5bV9oYXNoKS0+c21jbGFzICE9IFhNQ19HTAotCQkJICB8fCBhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfR0wKLQkJCSAgfHwgKCgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncwotCQkJICAgICAgJiBEWU5BTUlDKSA9PSAwKSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIG5ldyBzeW1ib2wgaXMgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgdGhlIGV4aXN0aW5nIHN5bWJvbCBpcyBub3QgZ2xvYmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZSBjb2RlIG9yIHRoaXMgc3ltYm9sIGlzIGdsb2JhbCBsaW5rYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29kZS4gIElmIHRoZSBleGlzdGluZyBzeW1ib2wgaXMgZ2xvYmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZSBjb2RlIGFuZCB0aGUgbmV3IHN5bWJvbCBpcyBub3QsIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICB3ZSB3YW50IHRvIHVzZSB0aGUgbmV3IHN5bWJvbC4gICovCi0JCSAgICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkgICAgICB2YWx1ZSA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKCgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncwotCQkJICAgICYgRFlOQU1JQykgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGV4aXN0aW5nIHN5bWJvbCBpcyBmcm9tIGEgc2hhcmVkIGxpYnJhcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZSBpdC4gICovCi0JCSAgICAgICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkJICAgICAgKCpzeW1faGFzaCktPnJvb3QudS51bmRlZi5hYmZkID0KLQkJCSgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIHJlZGVmaW5pdGlvbiBpbiBhbiBvYmplY3QgY29udGFpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW4gYW4gYXJjaGl2ZS4gIEp1c3QgaWdub3JlIGl0LiAgU2VlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgYWJvdmUuICAqLwotCQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICAgICAgdmFsdWUgPSAwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCgqc3ltX2hhc2gpLT5yb290Lm5leHQgIT0gTlVMTAotCQkJICAgfHwgaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwgPT0gJigqc3ltX2hhc2gpLT5yb290KQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkLiAgSW4gdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UsIHdlIGp1c3QgY29udGludWUgYW5kIHBlcm1pdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yLiAgU2VlIHRoZSBjb21tZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUgYWJvdXQgdGhlIGJlaGF2aW91ciBvZiB0aGUgQUlYIGxpbmtlci4gICovCi0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKCpzeW1faGFzaCktPnNtY2xhcyA9PSBhdXgueF9jc2VjdC54X3NtY2xhcykKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIHN5bWJvbHMgYXJlIGJvdGggY3NlY3RzIG9mIHRoZSBzYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MuICBUaGVyZSBpcyBhdCBsZWFzdCBhIGNoYW5jZSB0aGF0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhIHNlbWktbGVnaXRpbWF0ZSByZWRlZmluaXRpb24uICAqLwotCQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICAgICAgdmFsdWUgPSAwOwotCQkgICAgICAoKnN5bV9oYXNoKS0+ZmxhZ3MgfD0gWENPRkZfTVVMVElQTFlfREVGSU5FRDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKCgoKnN5bV9oYXNoKS0+ZmxhZ3MgJiBYQ09GRl9NVUxUSVBMWV9ERUZJTkVEKSAhPSAwCi0JCSAgICAgICAmJiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgICAgJiYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikKLQkJCSAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIG11bHRpcGx5IGRlZmluZWQgc3ltYm9sLgotCQkgICAgIFJlcG9ydCB0aGUgZXJyb3Igbm93LiAgU2VlIHRoZSBjb21tZW50IGFib3ZlCi0JCSAgICAgYWJvdXQgdGhlIGJlaGF2aW91ciBvZiB0aGUgQUlYIGxpbmtlci4gIFdlIGNvdWxkCi0JCSAgICAgYWxzbyBkbyB0aGlzIHdpdGggd2FybmluZyBzeW1ib2xzLCBidXQgSSdtIG5vdAotCQkgICAgIHN1cmUgdGhlIFhDT0ZGIGxpbmtlciBpcyB3aG9sbHkgcHJlcGFyZWQgdG8KLQkJICAgICBoYW5kbGUgdGhlbSwgYW5kIHRoYXQgd291bGQgb25seSBiZSBhIHdhcm5pbmcsCi0JCSAgICAgbm90IGFuIGVycm9yLiAgKi8KLQkJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2RlZmluaXRpb24pCi0JCQkgKGluZm8sICgqc3ltX2hhc2gpLT5yb290LnJvb3Quc3RyaW5nLAotCQkJICAoYmZkICopIE5VTEwsIChhc2VjdGlvbiAqKSBOVUxMLCAwLAotCQkJICAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCSAgKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiwKLQkJCSAgKCpzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIC8qIFRyeSBub3QgdG8gZ2l2ZSB0aGlzIGVycm9yIHRvbyBtYW55IHRpbWVzLiAgKi8KLQkJICAoKnN5bV9oYXNoKS0+ZmxhZ3MgJj0gflhDT0ZGX01VTFRJUExZX0RFRklORUQ7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCBtYXkgY2FsbCB0aGUgbGlua2VyIHRvCi0JICAgICBnZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlLCBhbmQgdGhlIGxpbmtlciBtYXkgdHJ5IHRvIHJlYWQKLQkgICAgIHRoZSBzeW1ib2wgdGFibGUgdG8gZ2l2ZSBhIGdvb2QgZXJyb3IuICBSaWdodCBub3csIHRoZQotCSAgICAgbGluZSBudW1iZXJzIGFyZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUsIHNpbmNlIHRoZXkgYXJlCi0JICAgICBjb3VudGVkIGJvdGggaW4gdGhlIHJlYWwgc2VjdGlvbnMgYW5kIGluIHRoZSBuZXcgY3NlY3RzLgotCSAgICAgV2UgbmVlZCB0byBsZWF2ZSB0aGUgY291bnQgaW4gdGhlIHJlYWwgc2VjdGlvbnMgc28gdGhhdAotCSAgICAgdGhlIGxpbmtlciBjYW4gcmVwb3J0IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXJyb3IKLQkgICAgIGNvcnJlY3RseSwgc28gdGVtcG9yYXJpbHkgY2xvYmJlciB0aGUgbGluayB0byB0aGUgY3NlY3RzCi0JICAgICBzbyB0aGF0IHRoZSBsaW5rZXIgd2lsbCBub3QgdHJ5IHRvIHJlYWQgdGhlIGxpbmUgbnVtYmVycwotCSAgICAgYSBzZWNvbmQgdGltZSBmcm9tIHRoZSBjc2VjdHMuICAqLwotCSAgQkZEX0FTU0VSVCAobGFzdF9yZWFsLT5uZXh0ID09IGZpcnN0X2NzZWN0KTsKLQkgIGxhc3RfcmVhbC0+bmV4dCA9IE5VTEw7Ci0JICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCi0JCSAgKGNvbnN0IGNoYXIgKikgTlVMTCwgY29weSwgdHJ1ZSwKLQkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoKSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbGFzdF9yZWFsLT5uZXh0ID0gZmlyc3RfY3NlY3Q7Ci0KLQkgIGlmIChzbXR5cCA9PSBYVFlfQ00pCi0JICAgIHsKLQkgICAgICBpZiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbgotCQkgIHx8ICgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5zZWN0aW9uICE9IGNzZWN0KQotCQl7Ci0JCSAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgY29tbW9uIGNzZWN0IHdlIGp1c3QgY3JlYXRlZC4gICovCi0JCSAgY3NlY3QtPl9yYXdfc2l6ZSA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyCi0JCSAgICAgPSBjc2VjdC0+YWxpZ25tZW50X3Bvd2VyOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgIGludCBmbGFnOwotCi0JICAgICAgaWYgKHNtdHlwID09IFhUWV9FUiB8fCBzbXR5cCA9PSBYVFlfQ00pCi0JCWZsYWcgPSBYQ09GRl9SRUZfUkVHVUxBUjsKLQkgICAgICBlbHNlCi0JCWZsYWcgPSBYQ09GRl9ERUZfUkVHVUxBUjsKLQkgICAgICAoKnN5bV9oYXNoKS0+ZmxhZ3MgfD0gZmxhZzsKLQotCSAgICAgIGlmICgoKnN5bV9oYXNoKS0+c21jbGFzID09IFhNQ19VQQotCQkgIHx8IGZsYWcgPT0gWENPRkZfREVGX1JFR1VMQVIpCi0JCSgqc3ltX2hhc2gpLT5zbWNsYXMgPSBhdXgueF9jc2VjdC54X3NtY2xhczsKLQkgICAgfQotCX0KLQotICAgICAgKmNzZWN0X2NhY2hlID0gY3NlY3Q7Ci0KLSAgICAgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotICAgICAgc3ltX2hhc2ggKz0gc3ltLm5fbnVtYXV4ICsgMTsKLSAgICAgIGNzZWN0X2NhY2hlICs9IHN5bS5uX251bWF1eCArIDE7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKGxhc3RfcmVhbCA9PSBOVUxMIHx8IGxhc3RfcmVhbC0+bmV4dCA9PSBmaXJzdF9jc2VjdCk7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBzZWVuIGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gZmlyc3RfY3NlY3Q7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIC8qIFJlc2V0IHRoZSBzZWN0aW9uIHNpemUgYW5kIHRoZSBsaW5lIG51bWJlciBjb3VudCwgc2luY2UgdGhlCi0JIGRhdGEgaXMgbm93IGF0dGFjaGVkIHRvIHRoZSBjc2VjdHMuICBEb24ndCByZXNldCB0aGUgc2l6ZSBvZgotCSB0aGUgLmRlYnVnIHNlY3Rpb24sIHNpbmNlIHdlIG5lZWQgdG8gcmVhZCBpdCBiZWxvdyBpbgotCSBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgIi5kZWJ1ZyIpICE9IDApCi0Jby0+X3Jhd19zaXplID0gMDsKLSAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBpOwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0JICBhc2VjdGlvbiAqKnJlbF9jc2VjdDsKLQotCSAgcmVsID0gcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKLQkgIHJlbF9jc2VjdCA9IHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHM7Ci0JICBmb3IgKGkgPSAwOyBpIDwgby0+cmVsb2NfY291bnQ7IGkrKywgcmVsKyssIHJlbF9jc2VjdCsrKQotCSAgICB7Ci0JICAgICAgaWYgKCpyZWxfY3NlY3QgPT0gTlVMTCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiByZWxvYyAlczolZCBub3QgaW4gY3NlY3QiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgby0+bmFtZSwgaSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIC8qIFdlIGlkZW50aWZ5IGFsbCBzeW1ib2xzIHdoaWNoIGFyZSBjYWxsZWQsIHNvIHRoYXQgd2UKLQkJIGNhbiBjcmVhdGUgZ2x1ZSBjb2RlIGZvciBjYWxscyB0byBmdW5jdGlvbnMgaW1wb3J0ZWQKLQkJIGZyb20gZHluYW1pYyBvYmplY3RzLiAgKi8KLQkgICAgICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjCi0JCSAgJiYgKnJlbF9jc2VjdCAhPSBiZmRfdW5kX3NlY3Rpb25fcHRyCi0JCSAgJiYgKHJlbC0+cl90eXBlID09IFJfQlIKLQkJICAgICAgfHwgcmVsLT5yX3R5cGUgPT0gUl9SQlIpCi0JCSAgJiYgb2JqX3hjb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW3JlbC0+cl9zeW1uZHhdICE9IE5VTEwpCi0JCXsKLQkJICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChhYmZkKVtyZWwtPnJfc3ltbmR4XTsKLQkJICBoLT5mbGFncyB8PSBYQ09GRl9DQUxMRUQ7Ci0JCSAgLyogSWYgdGhlIHN5bWJvbCBuYW1lIHN0YXJ0cyB3aXRoIGEgcGVyaW9kLCBpdCBpcwotICAgICAgICAgICAgICAgICAgICAgdGhlIGNvZGUgb2YgYSBmdW5jdGlvbi4gIElmIHRoZSBzeW1ib2wgaXMKLSAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSB1bmRlZmluZWQsIHRoZW4gYWRkIGFuIHVuZGVmaW5lZCBzeW1ib2wKLSAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvci4gIFRoaXMgc2hvdWxkIGRvIG5vCi0gICAgICAgICAgICAgICAgICAgICBoYXJtLCBiZWNhdXNlIGFueSByZWd1bGFyIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgYWxzbyBkZWZpbmUgdGhlIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLiAgSXQgaGVscHMsIGJlY2F1c2UgaXQgbWVhbnMgdGhhdCB3ZQotICAgICAgICAgICAgICAgICAgICAgd2lsbCBpZGVudGlmeSB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciB3aXRoIGEKLSAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgb2JqZWN0IGlmIGEgZHluYW1pYyBvYmplY3QgZGVmaW5lcyBpdC4gICovCi0JCSAgaWYgKGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gPT0gJy4nCi0JCSAgICAgICYmIGgtPmRlc2NyaXB0b3IgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGRzOwotCi0JCSAgICAgIGhkcyA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcgKyAxLAotCQkJCQkJICAgIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJICAgICAgaWYgKGhkcyA9PSBOVUxMKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICAgIGlmIChoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkJCXsKLQkJCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCQkJIChpbmZvLCBhYmZkLCBoZHMtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICAoZmxhZ3dvcmQpIDAsIGJmZF91bmRfc2VjdGlvbl9wdHIsCi0JCQkJICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JCQkJICB0cnVlLAotCQkJCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaGRzKSkpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCQl9Ci0JCSAgICAgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfREVTQ1JJUFRPUjsKLQkJICAgICAgQkZEX0FTU0VSVCAoKGhkcy0+ZmxhZ3MgJiBYQ09GRl9DQUxMRUQpID09IDAKLQkJCQkgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpID09IDApOwotCQkgICAgICBoZHMtPmRlc2NyaXB0b3IgPSBoOwotCQkgICAgICBoLT5kZXNjcmlwdG9yID0gaGRzOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgZnJlZSAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmNzZWN0cyk7Ci0JICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzID0gTlVMTDsKLQotCSAgLyogUmVzZXQgU0VDX1JFTE9DIGFuZCB0aGUgcmVsb2NfY291bnQsIHNpbmNlIHRoZSByZWxvYwotCSAgICAgaW5mb3JtYXRpb24gaXMgbm93IGF0dGFjaGVkIHRvIHRoZSBjc2VjdHMuICAqLwotCSAgby0+ZmxhZ3MgJj1+IFNFQ19SRUxPQzsKLQkgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQotCSAgLyogSWYgd2UgYXJlIG5vdCBrZWVwaW5nIG1lbW9yeSwgZnJlZSB0aGUgcmVsb2MgaW5mb3JtYXRpb24uICAqLwotCSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbykgIT0gTlVMTAotCSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+cmVsb2NzICE9IE5VTEwKLQkgICAgICAmJiAhIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+a2VlcF9yZWxvY3MpCi0JICAgIHsKLQkgICAgICBmcmVlIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPnJlbG9jcyk7Ci0JICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5yZWxvY3MgPSBOVUxMOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGcmVlIHVwIHRoZSBsaW5lIG51bWJlcnMuICBGSVhNRTogV2UgY291bGQgY2FjaGUgdGhlc2UKLSAgICAgICAgIHNvbWV3aGVyZSBmb3IgdGhlIGZpbmFsIGxpbmssIHRvIGF2b2lkIHJlYWRpbmcgdGhlbSBhZ2Fpbi4gICovCi0gICAgICBpZiAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmxpbmVub3MgIT0gTlVMTCkKLQl7Ci0JICBmcmVlIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyk7Ci0JICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBmcmVlIChyZWxvY19pbmZvKTsKLQotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGlmIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzICE9IE5VTEwpCi0JICAgIGZyZWUgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMpOwotCSAgaWYgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5saW5lbm9zICE9IE5VTEwpCi0JICAgIGZyZWUgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5saW5lbm9zKTsKLQl9Ci0gICAgZnJlZSAocmVsb2NfaW5mbyk7Ci0gICAgfQotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLSN1bmRlZiBOX1RNQVNLCi0jdW5kZWYgTl9CVFNIRlQKLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCBzeW1ib2xzIGZyb20gYSBkeW5hbWljIG9iamVjdCB0byB0aGUKLSAgIGdsb2JhbCBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqbHNlYzsKLSAgYmZkX2J5dGUgKmJ1ZjsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotICBjb25zdCBjaGFyICpzdHJpbmdzOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKmVsc3ltLCAqZWxzeW1lbmQ7Ci0gIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqbjsKLSAgY29uc3QgY2hhciAqYm5hbWU7Ci0gIGNvbnN0IGNoYXIgKm1uYW1lOwotICBjb25zdCBjaGFyICpzOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICoqcHA7Ci0KLSAgLyogV2UgY2FuIG9ubHkgaGFuZGxlIGEgZHluYW1pYyBvYmplY3QgaWYgd2UgYXJlIGdlbmVyYXRpbmcgYW4gWENPRkYKLSAgICAgb3V0cHV0IGZpbGUuICAqLwotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBhYmZkLT54dmVjKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogWENPRkYgc2hhcmVkIG9iamVjdCB3aGVuIG5vdCBwcm9kdWNpbmcgWENPRkYgb3V0cHV0IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzeW1ib2xzIHdlIHVzZSBmcm9tIGEgZHluYW1pYyBvYmplY3QgYXJlIG5vdCB0aGUgc3ltYm9scyBpbgotICAgICB0aGUgbm9ybWFsIHN5bWJvbCB0YWJsZSwgYnV0LCByYXRoZXIsIHRoZSBzeW1ib2xzIGluIHRoZSBleHBvcnQKLSAgICAgdGFibGUuICBJZiB0aGVyZSBpcyBhIGdsb2JhbCBzeW1ib2wgaW4gYSBkeW5hbWljIG9iamVjdCB3aGljaCBpcwotICAgICBub3QgaW4gdGhlIGV4cG9ydCB0YWJsZSwgdGhlIGxvYWRlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQgaXQsCi0gICAgIHNvIHdlIGRvbid0IHdhbnQgdG8gZmluZCBpdCBlaXRoZXIuICBBbHNvLCBvbiBBSVggNC4xLjMsIHNoci5vIGluCi0gICAgIGxpYmMuYSBoYXMgc3ltYm9scyBpbiB0aGUgZXhwb3J0IHRhYmxlIHdoaWNoIGFyZSBub3QgaW4gdGhlCi0gICAgIHN5bWJvbCB0YWJsZS4gICovCi0KLSAgLyogUmVhZCBpbiB0aGUgLmxvYWRlciBzZWN0aW9uLiAgRklYTUU6IFdlIHNob3VsZCByZWFsbHkgdXNlIHRoZQotICAgICBvX3NubG9hZGVyIGZpZWxkIGluIHRoZSBhLm91dCBoZWFkZXIsIHJhdGhlciB0aGFuIGdyYWJiaW5nIHRoZQotICAgICBzZWN0aW9uIGJ5IG5hbWUuICAqLwotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBkeW5hbWljIG9iamVjdCB3aXRoIG5vIC5sb2FkZXIgc2VjdGlvbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJ1ZiA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgLyogUmVtb3ZlIHRoZSBzZWN0aW9ucyBmcm9tIHRoaXMgb2JqZWN0LCBzbyB0aGF0IHRoZXkgZG8gbm90IGdldAotICAgICBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCi0gIGFiZmQtPnNlY3Rpb25zID0gTlVMTDsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGJ1ZiwgJmxkaGRyKTsKLQotICBzdHJpbmdzID0gKGNoYXIgKikgYnVmICsgbGRoZHIubF9zdG9mZjsKLQotICBlbHN5bSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikgKGJ1ZiArIExESERSU1opOwotICBlbHN5bWVuZCA9IGVsc3ltICsgbGRoZHIubF9uc3ltczsKLSAgQkZEX0FTU0VSVCAoc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0pID09IExEU1lNU1opOwotICBmb3IgKDsgZWxzeW0gPCBlbHN5bWVuZDsgZWxzeW0rKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gbGRzeW07Ci0gICAgICBjaGFyIG5hbWJ1ZltTWU1OTUxFTiArIDFdOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHhjb2ZmX3N3YXBfbGRzeW1faW4gKGFiZmQsIGVsc3ltLCAmbGRzeW0pOwotCi0gICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGV4cG9ydGVkIHN5bWJvbHMuICAqLwotICAgICAgaWYgKChsZHN5bS5sX3NtdHlwZSAmIExfRVhQT1JUKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAobGRzeW0uX2wuX2xfbC5fbF96ZXJvZXMgPT0gMCkKLQluYW1lID0gc3RyaW5ncyArIGxkc3ltLl9sLl9sX2wuX2xfb2Zmc2V0OwotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAobmFtYnVmLCBsZHN5bS5fbC5fbF9uYW1lLCBTWU1OTUxFTik7Ci0JICBuYW1idWZbU1lNTk1MRU5dID0gJ1wwJzsKLQkgIG5hbWUgPSBuYW1idWY7Ci0JfQotCi0gICAgICAvKiBOb3JtYWxseSB3ZSBjb3VsZCBub3QgY2FsbCB4Y29mZl9saW5rX2hhc2hfbG9va3VwIGluIGFuIGFkZAotCSBzeW1ib2xzIHJvdXRpbmUsIHNpbmNlIHdlIG1pZ2h0IG5vdCBiZSB1c2luZyBhbiBYQ09GRiBoYXNoCi0JIHRhYmxlLiAgSG93ZXZlciwgd2UgdmVyaWZpZWQgYWJvdmUgdGhhdCB3ZSBhcmUgdXNpbmcgYW4gWENPRkYKLQkgaGFzaCB0YWJsZS4gICovCi0KLSAgICAgIGggPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwKLQkJCQkgIHRydWUsIHRydWUpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGgtPmZsYWdzIHw9IFhDT0ZGX0RFRl9EWU5BTUlDOwotCi0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgYW5kIHRoZSBCRkQgaXQgd2FzIGZvdW5kIGluIGlzCi0JIG5vdCBhIGR5bmFtaWMgb2JqZWN0LCBjaGFuZ2UgdGhlIEJGRCB0byB0aGlzIGR5bmFtaWMgb2JqZWN0LAotCSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIGNvcnJlY3QgaW1wb3J0IGZpbGUgSUQuICAqLwotICAgICAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAmJiAoaC0+cm9vdC51LnVuZGVmLmFiZmQgPT0gTlVMTAotCSAgICAgIHx8IChoLT5yb290LnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKSkKLQloLT5yb290LnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0KLSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JewotCSAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT5yb290LnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0JICAvKiBXZSBkbyBub3Qgd2FudCB0byBhZGQgdGhpcyB0byB0aGUgdW5kZWZpbmVkIHN5bWJvbCBsaXN0LiAgKi8KLQl9Ci0KLSAgICAgIGlmIChoLT5zbWNsYXMgPT0gWE1DX1VBCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQloLT5zbWNsYXMgPSBsZHN5bS5sX3NtY2xhczsKLQotICAgICAgLyogVW5sZXNzIHRoaXMgaXMgYW4gWE1DX1hPIHN5bWJvbCwgd2UgZG9uJ3QgYm90aGVyIHRvIGFjdHVhbGx5Ci0gICAgICAgICBkZWZpbmUgaXQsIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBzZWN0aW9uIHRvIHB1dCBpdCBpbiBhbnlob3cuCi0gICAgICAgICBJbnN0ZWFkLCB0aGUgcmVsb2NhdGlvbiByb3V0aW5lcyBoYW5kbGUgdGhlIERFRl9EWU5BTUlDIGZsYWcKLSAgICAgICAgIGNvcnJlY3RseS4gICovCi0KLSAgICAgIGlmIChoLT5zbWNsYXMgPT0gWE1DX1hPCi0JICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKLQl7Ci0JICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gYWJzb2x1dGUgdmFsdWUuICAqLwotCSAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBsZHN5bS5sX3ZhbHVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgZGVmaW5lcyBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IsIHRoZW4gaXQKLQkgaW1wbGljaXRseSBkZWZpbmVzIHRoZSBmdW5jdGlvbiBjb2RlIGFzIHdlbGwuICAqLwotICAgICAgaWYgKGgtPnNtY2xhcyA9PSBYTUNfRFMKLQkgIHx8IChoLT5zbWNsYXMgPT0gWE1DX1hPICYmIG5hbWVbMF0gIT0gJy4nKSkKLQloLT5mbGFncyB8PSBYQ09GRl9ERVNDUklQVE9SOwotICAgICAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpICE9IDApCi0JewotCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGRzOwotCi0JICBoZHMgPSBoLT5kZXNjcmlwdG9yOwotCSAgaWYgKGhkcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqZHNubTsKLQotCSAgICAgIGRzbm0gPSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMik7Ci0JICAgICAgaWYgKGRzbm0gPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGRzbm1bMF0gPSAnLic7Ci0JICAgICAgc3RyY3B5IChkc25tICsgMSwgbmFtZSk7Ci0JICAgICAgaGRzID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIGRzbm0sCi0JCQkJCSAgICB0cnVlLCB0cnVlLCB0cnVlKTsKLQkgICAgICBmcmVlIChkc25tKTsKLQkgICAgICBpZiAoaGRzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmIChoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkJewotCQkgIGhkcy0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JCSAgaGRzLT5yb290LnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0JCSAgLyogV2UgZG8gbm90IHdhbnQgdG8gYWRkIHRoaXMgdG8gdGhlIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgc3ltYm9sIGxpc3QuICAqLwotCQl9Ci0KLQkgICAgICBoZHMtPmRlc2NyaXB0b3IgPSBoOwotCSAgICAgIGgtPmRlc2NyaXB0b3IgPSBoZHM7Ci0JICAgIH0KLQotCSAgaGRzLT5mbGFncyB8PSBYQ09GRl9ERUZfRFlOQU1JQzsKLQkgIGlmIChoZHMtPnNtY2xhcyA9PSBYTUNfVUEpCi0JICAgIGhkcy0+c21jbGFzID0gWE1DX1BSOwotCi0JICAvKiBBbiBhYnNvbHV0ZSBzeW1ib2wgYXBwZWFycyB0byBhY3R1YWxseSBkZWZpbmUgY29kZSwgbm90IGEKLQkgICAgIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICBUaGlzIGlzIGhvdyBzb21lIG1hdGggZnVuY3Rpb25zIGFyZQotCSAgICAgaW1wbGVtZW50ZWQgb24gQUlYIDQuMS4gICovCi0JICBpZiAoaC0+c21jbGFzID09IFhNQ19YTwotCSAgICAgICYmIChoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCQkgIHx8IGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKLQkgICAgewotCSAgICAgIGhkcy0+c21jbGFzID0gWE1DX1hPOwotCSAgICAgIGhkcy0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgICAgIGhkcy0+cm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICBoZHMtPnJvb3QudS5kZWYudmFsdWUgPSBsZHN5bS5sX3ZhbHVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoYnVmICE9IE5VTEwgJiYgISBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmtlZXBfY29udGVudHMpCi0gICAgewotICAgICAgZnJlZSAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50cyk7Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogUmVjb3JkIHRoaXMgZmlsZSBpbiB0aGUgaW1wb3J0IGZpbGVzLiAgKi8KLQotICBuID0gKChzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKikKLSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlKSkpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbi0+bmV4dCA9IE5VTEw7Ci0KLSAgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgcGF0aCBlbnRyeSBpbiB0aGUgaW1wb3J0IGZpbGUgbGlzdCBmb3IgYQotICAgICBzaGFyZWQgb2JqZWN0IGFwcGVhcnMgdG8gYWx3YXlzIGJlIGVtcHR5LiAgVGhlIGZpbGUgbmFtZSBpcyB0aGUKLSAgICAgYmFzZSBuYW1lLiAgKi8KLSAgbi0+cGF0aCA9ICIiOwotICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0gICAgICBtbmFtZSA9ICIiOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZC0+bXlfYXJjaGl2ZSk7Ci0gICAgICBtbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgIH0KLSAgcyA9IHN0cnJjaHIgKGJuYW1lLCAnLycpOwotICBpZiAocyAhPSBOVUxMKQotICAgIGJuYW1lID0gcyArIDE7Ci0gIG4tPmZpbGUgPSBibmFtZTsKLSAgbi0+bWVtYmVyID0gbW5hbWU7Ci0KLSAgLyogV2Ugc3RhcnQgYyBhdCAxIGJlY2F1c2UgdGhlIGZpcnN0IGltcG9ydCBmaWxlIG51bWJlciBpcyByZXNlcnZlZAotICAgICBmb3IgTElCUEFUSC4gICovCi0gIGZvciAocHAgPSAmeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmltcG9ydHMsIGMgPSAxOwotICAgICAgICpwcCAhPSBOVUxMOwotICAgICAgIHBwID0gJigqcHApLT5uZXh0LCArK2MpCi0gICAgOwotICAqcHAgPSBuOwotCi0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5pbXBvcnRfZmlsZV9pZCA9IGM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBSb3V0aW5lcyB0aGF0IGFyZSBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4KLSAgIGhhbmRsZWQsIGJ1dCBiZWZvcmUgdGhlIHNlY3Rpb25zIGFyZSBsYWlkIG91dCBpbiBtZW1vcnkuICAqLwotCi0vKiBNYXJrIGEgc3ltYm9sIGFzIG5vdCBiZWluZyBnYXJiYWdlLCBpbmNsdWRpbmcgdGhlIHNlY3Rpb24gaW4gd2hpY2gKLSAgIGl0IGlzIGRlZmluZWQuICAqLwotCi1zdGF0aWMgSU5MSU5FIGJvb2xlYW4KLXhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX01BUkspICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfTUFSSzsKLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0KLSAgICAgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKGhzZWMpCi0JICAmJiAoaHNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKLQl7Ci0JICBpZiAoISB4Y29mZl9tYXJrIChpbmZvLCBoc2VjKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPnRvY19zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmIChoLT50b2Nfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISB4Y29mZl9tYXJrIChpbmZvLCBoLT50b2Nfc2VjdGlvbikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIG1hcmsgcGhhc2Ugb2YgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgRm9yIGEgZ2l2ZW4gc2VjdGlvbiwgbWFyawotICAgaXQsIGFuZCBhbGwgdGhlIHNlY3Rpb25zIHdoaWNoIGRlZmluZSBzeW1ib2xzIHRvIHdoaWNoIGl0IHJlZmVycy4KLSAgIEJlY2F1c2UgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBsb29rIGF0IHRoZSByZWxvY3MsIHdlIGFsc28gY291bnQKLSAgIHRoZSBudW1iZXIgb2YgcmVsb2NzIHdoaWNoIG5lZWQgdG8gYmUgY29waWVkIGludG8gdGhlIC5sb2FkZXIKLSAgIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbWFyayAoaW5mbywgc2VjKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWMtPmZsYWdzIHw9IFNFQ19NQVJLOwotCi0gIGlmIChzZWMtPm93bmVyLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IKLSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpICE9IE5VTEwKLSAgICAgICYmIHhjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipocCwgKipocGVuZDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsLCAqcmVsZW5kOwotCi0gICAgICAvKiBNYXJrIGFsbCB0aGUgc3ltYm9scyBpbiB0aGlzIHNlY3Rpb24uICAqLwotCi0gICAgICBocCA9IChvYmpfeGNvZmZfc3ltX2hhc2hlcyAoc2VjLT5vd25lcikKLQkgICAgKyB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmZpcnN0X3N5bW5keCk7Ci0gICAgICBocGVuZCA9IChvYmpfeGNvZmZfc3ltX2hhc2hlcyAoc2VjLT5vd25lcikKLQkgICAgICAgKyB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmxhc3Rfc3ltbmR4KTsKLSAgICAgIGZvciAoOyBocCA8IGhwZW5kOyBocCsrKQotCXsKLQkgIHJlZ2lzdGVyIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSAqaHA7Ci0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIHNlY3Rpb24gcmVsb2NzLiAgKi8KLQotICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0JICAmJiBzZWMtPnJlbG9jX2NvdW50ID4gMCkKLQl7Ci0JICByZWwgPSB4Y29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoc2VjLT5vd25lciwgc2VjLCB0cnVlLAotCQkJCQkgICAgKGJmZF9ieXRlICopIE5VTEwsIGZhbHNlLAotCQkJCQkgICAgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKTsKLQkgIGlmIChyZWwgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgcmVsZW5kID0gcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLQkgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnJzZWM7Ci0JICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIGlmICgodW5zaWduZWQgaW50KSByZWwtPnJfc3ltbmR4Ci0JCSAgPiBvYmpfcmF3X3N5bWVudF9jb3VudCAoc2VjLT5vd25lcikpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChzZWMtPm93bmVyKVtyZWwtPnJfc3ltbmR4XTsKLQkgICAgICBpZiAoaCAhPSBOVUxMCi0JCSAgJiYgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgPT0gMCkKLQkJewotCQkgIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgcnNlYyA9IHhjb2ZmX2RhdGEgKHNlYy0+b3duZXIpLT5jc2VjdHNbcmVsLT5yX3N5bW5keF07Ci0JICAgICAgaWYgKHJzZWMgIT0gTlVMTAotCQkgICYmIChyc2VjLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwKQotCQl7Ci0JCSAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgcnNlYykpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIC8qIFNlZSBpZiB0aGlzIHJlbG9jIG5lZWRzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSAubG9hZGVyCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24uICAqLwotCSAgICAgIHN3aXRjaCAocmVsLT5yX3R5cGUpCi0JCXsKLQkJZGVmYXVsdDoKLQkJICBpZiAoaCA9PSBOVUxMCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkJICAgICAgfHwgKChoLT5mbGFncyAmIFhDT0ZGX0NBTExFRCkgIT0gMAotCQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCQkgICYmIGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gPT0gJy4nCi0JCQkgICYmIGgtPmRlc2NyaXB0b3IgIT0gTlVMTAotCQkJICAmJiAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDAKLQkJCSAgICAgIHx8ICgoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDAKLQkJCQkgICYmIChoLT5kZXNjcmlwdG9yLT5mbGFncwotCQkJCSAgICAgICYgWENPRkZfREVGX1JFR1VMQVIpID09IDApKSkpCi0JCSAgICBicmVhazsKLQkJICAvKiBGYWxsIHRocm91Z2guICAqLwotCQljYXNlIFJfUE9TOgotCQljYXNlIFJfTkVHOgotCQljYXNlIFJfUkw6Ci0JCWNhc2UgUl9STEE6Ci0JCSAgKyt4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGRyZWxfY291bnQ7Ci0JCSAgaWYgKGggIT0gTlVMTCkKLQkJICAgIGgtPmZsYWdzIHw9IFhDT0ZGX0xEUkVMOwotCQkgIGJyZWFrOwotCQljYXNlIFJfVE9DOgotCQljYXNlIFJfR0w6Ci0JCWNhc2UgUl9UQ0w6Ci0JCWNhc2UgUl9UUkw6Ci0JCWNhc2UgUl9UUkxBOgotCQkgIC8qIFdlIHNob3VsZCBuZXZlciBuZWVkIGEgLmxvYWRlciByZWxvYyBmb3IgYSBUT0MKLQkJICAgICByZWxhdGl2ZSByZWxvYy4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeQotCSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpICE9IE5VTEwKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+cmVsb2NzICE9IE5VTEwKLQkgICAgICAmJiAhIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5rZWVwX3JlbG9jcykKLQkgICAgewotCSAgICAgIGZyZWUgKGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5yZWxvY3MpOwotCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5yZWxvY3MgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIHN3ZWVwIHBoYXNlIG9mIGdhcmJhZ2UgY29sbGVjdGlvbi4gIFJlbW92ZSBhbGwgZ2FyYmFnZQotICAgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dlZXAgKGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKnN1YjsKLQotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLQotICAgICAgZm9yIChvID0gc3ViLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBpZiAoKG8tPmZsYWdzICYgU0VDX01BUkspID09IDApCi0JICAgIHsKLQkgICAgICAvKiBLZWVwIGFsbCBzZWN0aW9ucyBmcm9tIG5vbi1YQ09GRiBpbnB1dCBmaWxlcy4gIEtlZXAKLSAgICAgICAgICAgICAgICAgc3BlY2lhbCBzZWN0aW9ucy4gIEtlZXAgLmRlYnVnIHNlY3Rpb25zIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgbW9tZW50LiAgKi8KLQkgICAgICBpZiAoc3ViLT54dmVjICE9IGluZm8tPmhhc2gtPmNyZWF0b3IKLQkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uCi0JCSAgfHwgbyA9PSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24KLQkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb24KLQkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50b2Nfc2VjdGlvbgotCQkgIHx8IG8gPT0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbgotCQkgIHx8IHN0cmNtcCAoby0+bmFtZSwgIi5kZWJ1ZyIpID09IDApCi0JCW8tPmZsYWdzIHw9IFNFQ19NQVJLOwotCSAgICAgIGVsc2UKLQkJewotCQkgIG8tPl9yYXdfc2l6ZSA9IDA7Ci0JCSAgby0+cmVsb2NfY291bnQgPSAwOwotCQkgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFJlY29yZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgc2V0LiAgVGhpcyBpcyB1c2VkIHRvIG91dHB1dCB0aGUKLSAgIGNvcnJlY3QgY3NlY3QgbGVuZ3RoLiAgKi8KLQotYm9vbGVhbgotYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCAob3V0cHV0X2JmZCwgaW5mbywgaGFyZywgc2l6ZSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhhcmc7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0gIHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdCAqbjsKLQotICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhpcyB3aWxsIGhhcmRseSBldmVyIGJlIGNhbGxlZC4gIEkgZG9uJ3Qgd2FudCB0byBidXJuIGZvdXIgYnl0ZXMKLSAgICAgcGVyIGdsb2JhbCBzeW1ib2wsIHNvIGluc3RlYWQgdGhlIHNpemUgaXMga2VwdCBvbiBhIGxpbmtlZCBsaXN0Ci0gICAgIGF0dGFjaGVkIHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotICBuID0gKChzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QgKikKLSAgICAgICBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfc2l6ZV9saXN0KSkpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbi0+bmV4dCA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zaXplX2xpc3Q7Ci0gIG4tPmggPSBoOwotICBuLT5zaXplID0gc2l6ZTsKLSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnNpemVfbGlzdCA9IG47Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfSEFTX1NJWkU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEltcG9ydCBhIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9pbXBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoYXJnLCB2YWwsIGltcHBhdGgsIGltcGZpbGUsCi0JCQkgaW1wbWVtYmVyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGFyZzsKLSAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgIGNvbnN0IGNoYXIgKmltcHBhdGg7Ci0gICAgIGNvbnN0IGNoYXIgKmltcGZpbGU7Ci0gICAgIGNvbnN0IGNoYXIgKmltcG1lbWJlcjsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEEgc3ltYm9sIG5hbWUgd2hpY2ggc3RhcnRzIHdpdGggYSBwZXJpb2QgaXMgdGhlIGNvZGUgZm9yIGEKLSAgICAgZnVuY3Rpb24uICBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgdGhlbiBhZGQgYW4gdW5kZWZpbmVkCi0gICAgIHN5bWJvbCBmb3IgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IsIGFuZCBpbXBvcnQgdGhhdCBpbnN0ZWFkLiAgKi8KLSAgaWYgKGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gPT0gJy4nCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHZhbCA9PSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGRzOwotCi0gICAgICBoZHMgPSBoLT5kZXNjcmlwdG9yOwotICAgICAgaWYgKGhkcyA9PSBOVUxMKQotCXsKLQkgIGhkcyA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQloLT5yb290LnJvb3Quc3RyaW5nICsgMSwKLQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUpOwotCSAgaWYgKGhkcyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgIHsKLQkgICAgICBoZHMtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgICAgIGhkcy0+cm9vdC51LnVuZGVmLmFiZmQgPSBoLT5yb290LnUudW5kZWYuYWJmZDsKLQkgICAgfQotCSAgaGRzLT5mbGFncyB8PSBYQ09GRl9ERVNDUklQVE9SOwotCSAgQkZEX0FTU0VSVCAoKGhkcy0+ZmxhZ3MgJiBYQ09GRl9DQUxMRUQpID09IDAKLQkJICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgPT0gMCk7Ci0JICBoZHMtPmRlc2NyaXB0b3IgPSBoOwotCSAgaC0+ZGVzY3JpcHRvciA9IGhkczsKLQl9Ci0KLSAgICAgIC8qIE5vdywgaWYgdGhlIGRlc2NyaXB0b3IgaXMgdW5kZWZpbmVkLCBpbXBvcnQgdGhlIGRlc2NyaXB0b3IKLSAgICAgICAgIHJhdGhlciB0aGFuIHRoZSBzeW1ib2wgd2Ugd2VyZSB0b2xkIHRvIGltcG9ydC4gIEZJWE1FOiBJcwotICAgICAgICAgdGhpcyBjb3JyZWN0IGluIGFsbCBjYXNlcz8gICovCi0gICAgICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JaCA9IGhkczsKLSAgICB9Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfSU1QT1JUOwotCi0gIGlmICh2YWwgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3QudS5kZWYuc2VjdGlvbikKLQkgICAgICB8fCBoLT5yb290LnUuZGVmLnZhbHVlICE9IHZhbCkpCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9kZWZpbml0aW9uKQotCQkgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uLCBoLT5yb290LnUuZGVmLnZhbHVlLAotCQkgIG91dHB1dF9iZmQsIGJmZF9hYnNfc2VjdGlvbl9wdHIsIHZhbCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHZhbDsKLSAgICB9Ci0KLSAgLyogV2Ugb3ZlcmxvYWQgdGhlIGxkaW5keCBmaWVsZCB0byBob2xkIHRoZSBsX2lmaWxlIHZhbHVlIGZvciB0aGlzCi0gICAgIHN5bWJvbC4gICovCi0gIEJGRF9BU1NFUlQgKGgtPmxkc3ltID09IE5VTEwpOwotICBCRkRfQVNTRVJUICgoaC0+ZmxhZ3MgJiBYQ09GRl9CVUlMVF9MRFNZTSkgPT0gMCk7Ci0gIGlmIChpbXBwYXRoID09IE5VTEwpCi0gICAgaC0+bGRpbmR4ID0gLTE7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYzsKLSAgICAgIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqKnBwOwotCi0gICAgICAvKiBXZSBzdGFydCBjIGF0IDEgYmVjYXVzZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGltcG9ydCBsaXN0IGlzCi0gICAgICAgICByZXNlcnZlZCBmb3IgdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGguICAqLwotICAgICAgZm9yIChwcCA9ICZ4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+aW1wb3J0cywgYyA9IDE7Ci0JICAgKnBwICE9IE5VTEw7Ci0JICAgcHAgPSAmKCpwcCktPm5leHQsICsrYykKLQl7Ci0JICBpZiAoc3RyY21wICgoKnBwKS0+cGF0aCwgaW1wcGF0aCkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoKCpwcCktPmZpbGUsIGltcGZpbGUpID09IDAKLQkgICAgICAmJiBzdHJjbXAgKCgqcHApLT5tZW1iZXIsIGltcG1lbWJlcikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoKnBwID09IE5VTEwpCi0JewotCSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICpuOwotCi0JICBuID0gKChzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKikKLQkgICAgICAgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSkpKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIG4tPm5leHQgPSBOVUxMOwotCSAgbi0+cGF0aCA9IGltcHBhdGg7Ci0JICBuLT5maWxlID0gaW1wZmlsZTsKLQkgIG4tPm1lbWJlciA9IGltcG1lbWJlcjsKLQkgICpwcCA9IG47Ci0JfQotCi0gICAgICBoLT5sZGluZHggPSBjOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRXhwb3J0IGEgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGhhcmcsIHN5c2NhbGwpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoYXJnOwotICAgICBib29sZWFuIHN5c2NhbGwgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0VYUE9SVDsKLQotICAvKiBGSVhNRTogSSdtIG5vdCBhdCBhbGwgc3VyZSB3aGF0IHN5c2NhbGwgaXMgc3VwcG9zZWQgdG8gbWVhbiwgc28KLSAgICAgSSdtIGp1c3QgZ29pbmcgdG8gaWdub3JlIGl0IHVudGlsIHNvbWVib2R5IGV4cGxhaW5zIGl0LiAgKi8KLQotICAvKiBTZWUgaWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICBJdCBtYXkgYmUgb25lIGV2ZW4gdGhvdWdoCi0gICAgIGl0IGlzIG5vdCBzbyBtYXJrZWQuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgPT0gMAotICAgICAgJiYgaC0+cm9vdC5yb290LnN0cmluZ1swXSAhPSAnLicpCi0gICAgewotICAgICAgY2hhciAqZm5uYW1lOwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGZuOwotCi0gICAgICBmbm5hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpICsgMik7Ci0gICAgICBpZiAoZm5uYW1lID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZm5uYW1lWzBdID0gJy4nOwotICAgICAgc3RyY3B5IChmbm5hbWUgKyAxLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgIGhmbiA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgICBmbm5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBmcmVlIChmbm5hbWUpOwotICAgICAgaWYgKGhmbiAhPSBOVUxMCi0JICAmJiBoZm4tPnNtY2xhcyA9PSBYTUNfUFIKLQkgICYmIChoZm4tPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoZm4tPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIGgtPmZsYWdzIHw9IFhDT0ZGX0RFU0NSSVBUT1I7Ci0JICBoLT5kZXNjcmlwdG9yID0gaGZuOwotCSAgaGZuLT5kZXNjcmlwdG9yID0gaDsKLQl9Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnYXJiYWdlIGNvbGxlY3QgdGhpcyBzeW1ib2wuICAqLwotICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLCBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2FyYmFnZQotICAgICBjb2xsZWN0IHRoZSBhc3NvY2lhdGVkIGZ1bmN0aW9uIGNvZGUuICBXZSBub3JtYWxseSBkb24ndCBoYXZlIHRvCi0gICAgIHdvcnJ5IGFib3V0IHRoaXMsIGJlY2F1c2UgdGhlIGRlc2NyaXB0b3Igd2lsbCBiZSBhdHRhY2hlZCB0byBhCi0gICAgIHNlY3Rpb24gd2l0aCByZWxvY3MsIGJ1dCBpZiB3ZSBhcmUgY3JlYXRpbmcgdGhlIGRlc2NyaXB0b3IKLSAgICAgb3Vyc2VsdmVzIHRob3NlIHJlbG9jcyB3aWxsIG5vdCBiZSB2aXNpYmxlIHRvIHRoZSBtYXJrIGNvZGUuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaC0+ZGVzY3JpcHRvcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ291bnQgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQgZm9yIHJlbG9jcwotICAgZ2VuZXJhdGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LCB0eXBpY2FsbHkgZm9yIGdsb2JhbCBjb25zdHJ1Y3RvcnMKLSAgIGFuZCBkZXN0cnVjdG9ycy4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jIChvdXRwdXRfYmZkLCBpbmZvLCBuYW1lKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGlmICghIFhDT0ZGX1hWRUNQIChvdXRwdXRfYmZkLT54dmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0gICAgICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgaW5mbywgbmFtZSwgZmFsc2UsIGZhbHNlLAotCQkJCSAgICAgZmFsc2UpKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBubyBzdWNoIHN5bWJvbCIpLCBuYW1lKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfUkVGX1JFR1VMQVIgfCBYQ09GRl9MRFJFTDsKLSAgKyt4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGRyZWxfY291bnQ7Ci0gIAotICAvKiBNYXJrIHRoZSBzeW1ib2wgdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgaWYgKCEgeGNvZmZfbWFya19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggc3ltYm9sIHRvIHdoaWNoIHRoZSBsaW5rZXIgc2NyaXB0Ci0gICBhc3NpZ25zIGEgdmFsdWUuICAqLwotCi1ib29sZWFuCi1iZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgaW5mbywgbmFtZSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaCA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCB0cnVlLCB0cnVlLAotCQkJICAgICAgZmFsc2UpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBoLT5mbGFncyB8PSBYQ09GRl9ERUZfUkVHVUxBUjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRocm91Z2gKLSAgIHhjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0cnVjdCB4Y29mZl9sb2FkZXJfaW5mbwotewotICAvKiBTZXQgaWYgYSBwcm9ibGVtIG9jY3VycmVkLiAgKi8KLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIExpbmsgaW5mb3JtYXRpb24gc3RydWN0dXJlLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIFdoZXRoZXIgYWxsIGRlZmluZWQgc3ltYm9scyBzaG91bGQgYmUgZXhwb3J0ZWQuICAqLwotICBib29sZWFuIGV4cG9ydF9kZWZpbmVkczsKLSAgLyogTnVtYmVyIG9mIGxkc3ltIHN0cnVjdHVyZXMuICAqLwotICBzaXplX3QgbGRzeW1fY291bnQ7Ci0gIC8qIFNpemUgb2Ygc3RyaW5nIHRhYmxlLiAgKi8KLSAgc2l6ZV90IHN0cmluZ19zaXplOwotICAvKiBTdHJpbmcgdGFibGUuICAqLwotICBiZmRfYnl0ZSAqc3RyaW5nczsKLSAgLyogQWxsb2NhdGVkIHNpemUgb2Ygc3RyaW5nIHRhYmxlLiAgKi8KLSAgc2l6ZV90IHN0cmluZ19hbGM7Ci19OwotCi0vKiBCdWlsZCB0aGUgLmxvYWRlciBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIFhDT0ZGIGxpbmtlcgotICAgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUuICBXZSBtdXN0IHNldCB0aGUgc2l6ZSBvZiB0aGUKLSAgIC5sb2FkZXIgc2VjdGlvbiBiZWZvcmUgdGhlIGxpbmtlciBsYXlzIG91dCB0aGUgb3V0cHV0IGZpbGUuCi0gICBMSUJQQVRIIGlzIHRoZSBsaWJyYXJ5IHBhdGggdG8gc2VhcmNoIGZvciBzaGFyZWQgb2JqZWN0czsgdGhpcyBpcwotICAgbm9ybWFsbHkgYnVpbHQgZnJvbSB0aGUgLUwgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgbGlua2VyLiAgRU5UUlkKLSAgIGlzIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSBwb2ludCBzeW1ib2wgKHRoZSAtZSBsaW5rZXIgb3B0aW9uKS4KLSAgIEZJTEVfQUxJR04gaXMgdGhlIGFsaWdubWVudCB0byB1c2UgZm9yIHNlY3Rpb25zIHdpdGhpbiB0aGUgZmlsZQotICAgKHRoZSAtSCBsaW5rZXIgb3B0aW9uKS4gIE1BWFNUQUNLIGlzIHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgKHRoZQotICAgLWJtYXhzdGFjayBsaW5rZXIgb3B0aW9uKS4gIE1BWERBVEEgaXMgdGhlIG1heGltdW0gZGF0YSBzaXplICh0aGUKLSAgIC1ibWF4ZGF0YSBsaW5rZXIgb3B0aW9uKS4gIEdDIGlzIHdoZXRoZXIgdG8gZG8gZ2FyYmFnZSBjb2xsZWN0aW9uCi0gICAodGhlIC1iZ2MgbGlua2VyIG9wdGlvbikuICBNT0RUWVBFIGlzIHRoZSBtb2R1bGUgdHlwZSAodGhlCi0gICAtYm1vZHR5cGUgbGlua2VyIG9wdGlvbikuICBURVhUUk8gaXMgd2hldGhlciB0aGUgdGV4dCBzZWN0aW9uIG11c3QKLSAgIGJlIHJlYWQgb25seSAodGhlIC1idGV4dHJvIGxpbmtlciBvcHRpb24pLiAgRVhQT1JUX0RFRklORURTIGlzCi0gICB3aGV0aGVyIGFsbCBkZWZpbmVkIHN5bWJvbHMgc2hvdWxkIGJlIGV4cG9ydGVkICh0aGUgLXVuaXggbGlua2VyCi0gICBvcHRpb24pLiAgU1BFQ0lBTF9TRUNUSU9OUyBpcyBzZXQgYnkgdGhpcyByb3V0aW5lIHRvIGNzZWN0cyB3aXRoCi0gICBtYWdpYyBuYW1lcyBsaWtlIF9lbmQuICAqLwotCi1ib29sZWFuCi1iZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvLCBsaWJwYXRoLCBlbnRyeSwKLQkJCQkgZmlsZV9hbGlnbiwgbWF4c3RhY2ssIG1heGRhdGEsIGdjLAotCQkJCSBtb2R0eXBlLCB0ZXh0cm8sIGV4cG9ydF9kZWZpbmVkcywKLQkJCQkgc3BlY2lhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbGlicGF0aDsKLSAgICAgY29uc3QgY2hhciAqZW50cnk7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmlsZV9hbGlnbjsKLSAgICAgdW5zaWduZWQgbG9uZyBtYXhzdGFjazsKLSAgICAgdW5zaWduZWQgbG9uZyBtYXhkYXRhOwotICAgICBib29sZWFuIGdjOwotICAgICBpbnQgbW9kdHlwZTsKLSAgICAgYm9vbGVhbiB0ZXh0cm87Ci0gICAgIGJvb2xlYW4gZXhwb3J0X2RlZmluZWRzOwotICAgICBhc2VjdGlvbiAqKnNwZWNpYWxfc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhlbnRyeTsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIHN0cnVjdCB4Y29mZl9sb2FkZXJfaW5mbyBsZGluZm87Ci0gIGludCBpOwotICBzaXplX3QgaW1wc2l6ZSwgaW1wY291bnQ7Ci0gIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqZmw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciAqbGRoZHI7Ci0gIGJmZF9zaXplX3R5cGUgc3RvZmY7Ci0gIHJlZ2lzdGVyIGNoYXIgKm91dDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkICpzdWI7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmRlYnVnX3N0cnRhYjsKLSAgYmZkX2J5dGUgKmRlYnVnX2NvbnRlbnRzID0gTlVMTDsKLQotICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQlzcGVjaWFsX3NlY3Rpb25zW2ldID0gTlVMTDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBsZGluZm8uZmFpbGVkID0gZmFsc2U7Ci0gIGxkaW5mby5vdXRwdXRfYmZkID0gb3V0cHV0X2JmZDsKLSAgbGRpbmZvLmluZm8gPSBpbmZvOwotICBsZGluZm8uZXhwb3J0X2RlZmluZWRzID0gZXhwb3J0X2RlZmluZWRzOwotICBsZGluZm8ubGRzeW1fY291bnQgPSAwOwotICBsZGluZm8uc3RyaW5nX3NpemUgPSAwOwotICBsZGluZm8uc3RyaW5ncyA9IE5VTEw7Ci0gIGxkaW5mby5zdHJpbmdfYWxjID0gMDsKLQotICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+bWF4c3RhY2sgPSBtYXhzdGFjazsKLSAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPm1heGRhdGEgPSBtYXhkYXRhOwotICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+bW9kdHlwZSA9IG1vZHR5cGU7Ci0KLSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZpbGVfYWxpZ24gPSBmaWxlX2FsaWduOwotICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dGV4dHJvID0gdGV4dHJvOwotCi0gIGlmIChlbnRyeSA9PSBOVUxMKQotICAgIGhlbnRyeSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoZW50cnkgPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgZW50cnksCi0JCQkJICAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaGVudHJ5ICE9IE5VTEwpCi0JaGVudHJ5LT5mbGFncyB8PSBYQ09GRl9FTlRSWTsKLSAgICB9Ci0KLSAgLyogR2FyYmFnZSBjb2xsZWN0IHVudXNlZCBzZWN0aW9ucy4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8ICEgZ2MKLSAgICAgIHx8IGhlbnRyeSA9PSBOVUxMCi0gICAgICB8fCAoaGVudHJ5LT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoZW50cnktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHsKLSAgICAgIGdjID0gZmFsc2U7Ci0gICAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+Z2MgPSBmYWxzZTsKLQotICAgICAgLyogV2Ugc3RpbGwgbmVlZCB0byBjYWxsIHhjb2ZmX21hcmssIGluIG9yZGVyIHRvIHNldCBsZHJlbF9jb3VudAotICAgICAgICAgY29ycmVjdGx5LiAgKi8KLSAgICAgIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpvOwotCi0JICBmb3IgKG8gPSBzdWItPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwKQotCQl7Ci0JCSAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgbykpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHhjb2ZmX21hcmsgKGluZm8sIGhlbnRyeS0+cm9vdC51LmRlZi5zZWN0aW9uKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHhjb2ZmX3N3ZWVwIChpbmZvKTsKLSAgICAgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5nYyA9IHRydWU7Ci0gICAgfQotCi0gIC8qIFJldHVybiBzcGVjaWFsIHNlY3Rpb25zIHRvIHRoZSBjYWxsZXIuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zcGVjaWFsX3NlY3Rpb25zW2ldOwotICAgICAgaWYgKHNlYyAhPSBOVUxMCi0JICAmJiBnYwotCSAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKLQlzZWMgPSBOVUxMOwotICAgICAgc3BlY2lhbF9zZWN0aW9uc1tpXSA9IHNlYzsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmlucHV0X2JmZHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBJJ20gbm90IHN1cmUgd2hhdCB0byBkbyBpbiB0aGlzIGJpemFycmUgY2FzZS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgeGNvZmZfYnVpbGRfbGRzeW1zLAotCQkJICAgIChQVFIpICZsZGluZm8pOwotICBpZiAobGRpbmZvLmZhaWxlZCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgaW1wb3J0IGZpbGUgbmFtZXMuICBFYWNoIGltcG9ydCBmaWxlIElECi0gICAgIGNvbnNpc3RzIG9mIHRocmVlIG51bGwgdGVybWluYXRlZCBzdHJpbmdzOiB0aGUgcGF0aCwgdGhlIGZpbGUKLSAgICAgbmFtZSwgYW5kIHRoZSBhcmNoaXZlIG1lbWJlciBuYW1lLiAgVGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsaXN0Ci0gICAgIG9mIG5hbWVzIGlzIHRoZSBwYXRoIHRvIHVzZSB0byBmaW5kIG9iamVjdHMsIHdoaWNoIHRoZSBsaW5rZXIgaGFzCi0gICAgIHBhc3NlZCBpbiBhcyB0aGUgbGlicGF0aCBhcmd1bWVudC4gIEZvciBzb21lIHJlYXNvbiwgdGhlIHBhdGgKLSAgICAgZW50cnkgaW4gdGhlIG90aGVyIGltcG9ydCBmaWxlIG5hbWVzIGFwcGVhcnMgdG8gYWx3YXlzIGJlIGVtcHR5LiAgKi8KLSAgaW1wc2l6ZSA9IHN0cmxlbiAobGlicGF0aCkgKyAzOwotICBpbXBjb3VudCA9IDE7Ci0gIGZvciAoZmwgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+aW1wb3J0czsgZmwgIT0gTlVMTDsgZmwgPSBmbC0+bmV4dCkKLSAgICB7Ci0gICAgICArK2ltcGNvdW50OwotICAgICAgaW1wc2l6ZSArPSAoc3RybGVuIChmbC0+cGF0aCkKLQkJICArIHN0cmxlbiAoZmwtPmZpbGUpCi0JCSAgKyBzdHJsZW4gKGZsLT5tZW1iZXIpCi0JCSAgKyAzKTsKLSAgICB9Ci0KLSAgLyogU2V0IHVwIHRoZSAubG9hZGVyIHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgbGRoZHIgPSAmeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkaGRyOwotICBsZGhkci0+bF92ZXJzaW9uID0gMTsKLSAgbGRoZHItPmxfbnN5bXMgPSBsZGluZm8ubGRzeW1fY291bnQ7Ci0gIGxkaGRyLT5sX25yZWxvYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sZHJlbF9jb3VudDsKLSAgbGRoZHItPmxfaXN0bGVuID0gaW1wc2l6ZTsKLSAgbGRoZHItPmxfbmltcGlkID0gaW1wY291bnQ7Ci0gIGxkaGRyLT5sX2ltcG9mZiA9IChMREhEUlNaCi0JCSAgICAgKyBsZGhkci0+bF9uc3ltcyAqIExEU1lNU1oKLQkJICAgICArIGxkaGRyLT5sX25yZWxvYyAqIExEUkVMU1opOwotICBsZGhkci0+bF9zdGxlbiA9IGxkaW5mby5zdHJpbmdfc2l6ZTsKLSAgc3RvZmYgPSBsZGhkci0+bF9pbXBvZmYgKyBpbXBzaXplOwotICBpZiAobGRpbmZvLnN0cmluZ19zaXplID09IDApCi0gICAgbGRoZHItPmxfc3RvZmYgPSAwOwotICBlbHNlCi0gICAgbGRoZHItPmxfc3RvZmYgPSBzdG9mZjsKLQotICAvKiBXZSBub3cga25vdyB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgLmxvYWRlciBzZWN0aW9uLiAgQWxsb2NhdGUKLSAgICAgc3BhY2UgZm9yIGl0LiAgKi8KLSAgbHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sb2FkZXJfc2VjdGlvbjsKLSAgbHNlYy0+X3Jhd19zaXplID0gc3RvZmYgKyBsZGhkci0+bF9zdGxlbjsKLSAgbHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgbHNlYy0+X3Jhd19zaXplKTsKLSAgaWYgKGxzZWMtPmNvbnRlbnRzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogU2V0IHVwIHRoZSBoZWFkZXIuICAqLwotICB4Y29mZl9zd2FwX2xkaGRyX291dCAob3V0cHV0X2JmZCwgbGRoZHIsCi0JCQkoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGxzZWMtPmNvbnRlbnRzKTsKLQotICAvKiBTZXQgdXAgdGhlIGltcG9ydCBmaWxlIG5hbWVzLiAgKi8KLSAgb3V0ID0gKGNoYXIgKikgbHNlYy0+Y29udGVudHMgKyBsZGhkci0+bF9pbXBvZmY7Ci0gIHN0cmNweSAob3V0LCBsaWJwYXRoKTsKLSAgb3V0ICs9IHN0cmxlbiAobGlicGF0aCkgKyAxOwotICAqb3V0KysgPSAnXDAnOwotICAqb3V0KysgPSAnXDAnOwotICBmb3IgKGZsID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmltcG9ydHM7IGZsICE9IE5VTEw7IGZsID0gZmwtPm5leHQpCi0gICAgewotICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKLQotICAgICAgcyA9IGZsLT5wYXRoOwotICAgICAgd2hpbGUgKCgqb3V0KysgPSAqcysrKSAhPSAnXDAnKQotCTsKLSAgICAgIHMgPSBmbC0+ZmlsZTsKLSAgICAgIHdoaWxlICgoKm91dCsrID0gKnMrKykgIT0gJ1wwJykKLQk7Ci0gICAgICBzID0gZmwtPm1lbWJlcjsKLSAgICAgIHdoaWxlICgoKm91dCsrID0gKnMrKykgIT0gJ1wwJykKLQk7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKChiZmRfc2l6ZV90eXBlKSAoKGJmZF9ieXRlICopIG91dCAtIGxzZWMtPmNvbnRlbnRzKSA9PSBzdG9mZik7Ci0KLSAgLyogU2V0IHVwIHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaWYgKGxkaW5mby5zdHJpbmdfc2l6ZSA+IDApCi0gICAgewotICAgICAgbWVtY3B5IChvdXQsIGxkaW5mby5zdHJpbmdzLCBsZGluZm8uc3RyaW5nX3NpemUpOwotICAgICAgZnJlZSAobGRpbmZvLnN0cmluZ3MpOwotICAgICAgbGRpbmZvLnN0cmluZ3MgPSBOVUxMOwotICAgIH0KLQotICAvKiBXZSBjYW4ndCBzZXQgdXAgdGhlIHN5bWJvbCB0YWJsZSBvciB0aGUgcmVsb2NzIHlldCwgYmVjYXVzZSB3ZQotICAgICBkb24ndCB5ZXQga25vdyB0aGUgZmluYWwgcG9zaXRpb24gb2YgdGhlIHZhcmlvdXMgc2VjdGlvbnMuICBUaGUKLSAgICAgLmxvYWRlciBzeW1ib2xzIGFyZSB3cml0dGVuIG91dCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG5vcm1hbAotICAgICBzeW1ib2xzIGFyZSB3cml0dGVuIG91dCBpbiB4Y29mZl9saW5rX2lucHV0X2JmZCBvcgotICAgICB4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sLiAgVGhlIC5sb2FkZXIgcmVsb2NzIGFyZSB3cml0dGVuIG91dAotICAgICB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG5vcm1hbCByZWxvY3MgYXJlIGhhbmRsZWQgaW4KLSAgICAgeGNvZmZfbGlua19pbnB1dF9iZmQuICAqLwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbWFnaWMgc2VjdGlvbnMuICAqLwotICBzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uOwotICBpZiAoc2VjLT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgc2VjLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50b2Nfc2VjdGlvbjsKLSAgaWYgKHNlYy0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKG91dHB1dF9iZmQsIHNlYy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzZWMtPmNvbnRlbnRzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotICBzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uOwotICBpZiAoc2VjLT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgc2VjLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2UndmUgZG9uZSBnYXJiYWdlIGNvbGxlY3Rpb24sIGZpZ3VyZSBvdXQgdGhlIGNvbnRlbnRzCi0gICAgIG9mIHRoZSAuZGVidWcgc2VjdGlvbi4gICovCi0gIGRlYnVnX3N0cnRhYiA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zdHJ0YWI7Ci0KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YmRlYjsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci0gICAgICB1bnNpZ25lZCBsb25nICpkZWJ1Z19pbmRleDsKLSAgICAgIGFzZWN0aW9uICoqY3NlY3RwcDsKLSAgICAgIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotCi0gICAgICBpZiAoc3ViLT54dmVjICE9IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0JY29udGludWU7Ci0gICAgICBzdWJkZWIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3ViLCAiLmRlYnVnIik7Ci0gICAgICBpZiAoc3ViZGViID09IE5VTEwgfHwgc3ViZGViLT5fcmF3X3NpemUgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfZGVidWdnZXIKLQkgIHx8IGluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwpCi0JewotCSAgc3ViZGViLT5fcmF3X3NpemUgPSAwOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKHN1YikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHN5bWNvdW50ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKHN1Yik7Ci0gICAgICBkZWJ1Z19pbmRleCA9ICgodW5zaWduZWQgbG9uZyAqKQotCQkgICAgIGJmZF96YWxsb2MgKHN1Yiwgc3ltY291bnQgKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKSk7Ci0gICAgICBpZiAoZGVidWdfaW5kZXggPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIHhjb2ZmX2RhdGEgKHN1YiktPmRlYnVnX2luZGljZXMgPSBkZWJ1Z19pbmRleDsKLQotICAgICAgLyogR3JhYiB0aGUgY29udGVudHMgb2YgdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgV2UgdXNlIG1hbGxvYyBhbmQKLQkgY29weSB0aGUgbmFtZXMgaW50byB0aGUgZGVidWcgc3RyaW5ndGFiLCByYXRoZXIgdGhhbgotCSBiZmRfYWxsb2MsIGJlY2F1c2UgSSBleHBlY3QgdGhhdCwgd2hlbiBsaW5raW5nIG1hbnkgZmlsZXMKLQkgdG9nZXRoZXIsIG1hbnkgb2YgdGhlIHN0cmluZ3Mgd2lsbCBiZSB0aGUgc2FtZS4gIFN0b3JpbmcgdGhlCi0JIHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgc2hvdWxkIHNhdmUgc3BhY2UgaW4gdGhpcyBjYXNlLiAgKi8KLSAgICAgIGRlYnVnX2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHN1YmRlYi0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChkZWJ1Z19jb250ZW50cyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChzdWIsIHN1YmRlYiwgKFBUUikgZGVidWdfY29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzdWJkZWItPl9yYXdfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGNzZWN0cHAgPSB4Y29mZl9kYXRhIChzdWIpLT5jc2VjdHM7Ci0KLSAgICAgIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoc3ViKTsKLSAgICAgIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoc3ViKTsKLSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltY291bnQgKiBzeW1lc3o7Ci0gICAgICB3aGlsZSAoZXN5bSA8IGVzeW1lbmQpCi0JewotCSAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChzdWIsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0JICAqZGVidWdfaW5kZXggPSAodW5zaWduZWQgbG9uZykgLTE7Ci0KLQkgIGlmIChzeW0uX24uX25fbi5fbl96ZXJvZXMgPT0gMAotCSAgICAgICYmICpjc2VjdHBwICE9IE5VTEwKLQkgICAgICAmJiAoISBnYwotCQkgIHx8ICgoKmNzZWN0cHApLT5mbGFncyAmIFNFQ19NQVJLKSAhPSAwCi0JCSAgfHwgKmNzZWN0cHAgPT0gYmZkX2Fic19zZWN0aW9uX3B0cikKLQkgICAgICAmJiBiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnIChzdWIsICZzeW0pKQotCSAgICB7Ci0JICAgICAgY2hhciAqbmFtZTsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgICAgICBuYW1lID0gKGNoYXIgKikgZGVidWdfY29udGVudHMgKyBzeW0uX24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZGVidWdfc3RydGFiLCBuYW1lLCB0cnVlLCB0cnVlKTsKLQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgICpkZWJ1Z19pbmRleCA9IGluZHg7Ci0JICAgIH0KLQotCSAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0JICBjc2VjdHBwICs9IHN5bS5uX251bWF1eCArIDE7Ci0JICBkZWJ1Z19pbmRleCArPSBzeW0ubl9udW1hdXggKyAxOwotCX0KLQotICAgICAgZnJlZSAoZGVidWdfY29udGVudHMpOwotICAgICAgZGVidWdfY29udGVudHMgPSBOVUxMOwotCi0gICAgICAvKiBDbGVhciB0aGUgc2l6ZSBvZiBzdWJkZWIsIHNvIHRoYXQgaXQgaXMgbm90IGluY2x1ZGVkIGRpcmVjdGx5Ci0JIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gICAgICBzdWJkZWItPl9yYXdfc2l6ZSA9IDA7Ci0KLSAgICAgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotCXsKLQkgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKHN1YikpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKLSAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVidWdfc2VjdGlvbi0+X3Jhd19zaXplID0KLSAgICAgIF9iZmRfc3RyaW5ndGFiX3NpemUgKGRlYnVnX3N0cnRhYik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChsZGluZm8uc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKGxkaW5mby5zdHJpbmdzKTsKLSAgaWYgKGRlYnVnX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWdfY29udGVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgLmxvYWRlciBzeW1ib2xzLCBpZiBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfYnVpbGRfbGRzeW1zIChoLCBwKQotICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvICpsZGluZm8gPSAoc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvICopIHA7Ci0gIHNpemVfdCBsZW47Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIGFuZCB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGFzIGEgY29tbW9uCi0gICAgIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIGFuZCB0aGVyZSB3YXMgbm8gZGVmaW5pdGlvbiBpbgotICAgICBhbnkgZHluYW1pYyBvYmplY3QsIHRoZW4gdGhlIGxpbmtlciB3aWxsIGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvcgotICAgICB0aGUgc3ltYm9sIGluIGEgY29tbW9uIHNlY3Rpb24gYnV0IHRoZSBYQ09GRl9ERUZfUkVHVUxBUiBmbGFnCi0gICAgIHdpbGwgbm90IGhhdmUgYmVlbiBzZXQuICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX1JFRl9SRUdVTEFSKSAhPSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMAotICAgICAgJiYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uKQotCSAgfHwgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgPT0gMCkpCi0gICAgaC0+ZmxhZ3MgfD0gWENPRkZfREVGX1JFR1VMQVI7Ci0KLSAgLyogSWYgYWxsIGRlZmluZWQgc3ltYm9scyBzaG91bGQgYmUgZXhwb3J0ZWQsIG1hcmsgdGhlbSBub3cuICBXZQotICAgICBkb24ndCB3YW50IHRvIGV4cG9ydCB0aGUgYWN0dWFsIGZ1bmN0aW9ucywganVzdCB0aGUgZnVuY3Rpb24KLSAgICAgZGVzY3JpcHRvcnMuICAqLwotICBpZiAobGRpbmZvLT5leHBvcnRfZGVmaW5lZHMKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSAhPSAwCi0gICAgICAmJiBoLT5yb290LnJvb3Quc3RyaW5nWzBdICE9ICcuJykKLSAgICB7Ci0gICAgICBib29sZWFuIGV4cG9ydDsKLQotICAgICAgLyogV2UgZG9uJ3QgZXhwb3J0IGEgc3ltYm9sIHdoaWNoIGlzIGJlaW5nIGRlZmluZWQgYnkgYW4gb2JqZWN0Ci0JIGluY2x1ZGVkIGZyb20gYW4gYXJjaGl2ZSB3aGljaCBjb250YWlucyBhIHNoYXJlZCBvYmplY3QuICBUaGUKLQkgcmF0aW9uYWxlIGlzIHRoYXQgaWYgYW4gYXJjaGl2ZSBjb250YWlucyBib3RoIGFuIHVuc2hhcmVkIGFuZAotCSBhIHNoYXJlZCBvYmplY3QsIHRoZW4gdGhlcmUgbXVzdCBiZSBzb21lIHJlYXNvbiB0aGF0IHRoZQotCSB1bnNoYXJlZCBvYmplY3QgaXMgdW5zaGFyZWQsIGFuZCB3ZSBkb24ndCB3YW50IHRvIHN0YXJ0Ci0JIHByb3ZpZGluZyBhIHNoYXJlZCB2ZXJzaW9uIG9mIGl0LiAgSW4gcGFydGljdWxhciwgdGhpcyBzb2x2ZXMKLQkgYSBidWcgaW52b2x2aW5nIHRoZSBfc2F2ZWZOTiBzZXQgb2YgZnVuY3Rpb25zLiAgZ2NjIHdpbGwgY2FsbAotCSB0aG9zZSBmdW5jdGlvbnMgd2l0aG91dCBwcm92aWRpbmcgYSBzbG90IHRvIHJlc3RvcmUgdGhlIFRPQywKLQkgc28gaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGJlIGxpbmtlZCBpbiBkaXJlY3RseQotCSBhbmQgbm90IGZyb20gYSBzaGFyZWQgb2JqZWN0LCB3aGljaCBtZWFucyB0aGF0IGEgc2hhcmVkCi0JIG9iamVjdCB3aGljaCBhbHNvIGhhcHBlbnMgdG8gbGluayB0aGVtIGluIG11c3Qgbm90IGV4cG9ydAotCSB0aGVtLiAgVGhpcyBpcyBjb25mdXNpbmcsIGJ1dCBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRoaW5rIG9mCi0JIGEgZGlmZmVyZW50IGFwcHJvYWNoLiAgTm90ZSB0aGF0IHRoZSBzeW1ib2xzIGNhbiwgb2YgY291cnNlLAotCSBiZSBleHBvcnRlZCBleHBsaWNpdGx5LiAgKi8KLSAgICAgIGV4cG9ydCA9IHRydWU7Ci0gICAgICBpZiAoKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5teV9hcmNoaXZlICE9IE5VTEwpCi0JewotCSAgYmZkICphcmJmZCwgKm1lbWJlcjsKLQotCSAgYXJiZmQgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5teV9hcmNoaXZlOwotCSAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJiZmQsIChiZmQgKikgTlVMTCk7Ci0JICB3aGlsZSAobWVtYmVyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoKG1lbWJlci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCQl7Ci0JCSAgZXhwb3J0ID0gZmFsc2U7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBtZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmJmZCwgbWVtYmVyKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGV4cG9ydCkKLQloLT5mbGFncyB8PSBYQ09GRl9FWFBPUlQ7Ci0gICAgfQotCi0gIC8qIFdlIGRvbid0IHdhbnQgdG8gZ2FyYmFnZSBjb2xsZWN0IHN5bWJvbHMgd2hpY2ggYXJlIG5vdCBkZWZpbmVkIGluCi0gICAgIFhDT0ZGIGZpbGVzLiAgVGhpcyBpcyBhIGNvbnZlbmllbnQgcGxhY2UgdG8gbWFyayB0aGVtLiAgKi8KLSAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmdjCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9NQVJLKSA9PSAwCi0gICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyID09IE5VTEwKLQkgIHx8IChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT54dmVjCi0JICAgICAgIT0gbGRpbmZvLT5pbmZvLT5oYXNoLT5jcmVhdG9yKSkpCi0gICAgaC0+ZmxhZ3MgfD0gWENPRkZfTUFSSzsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBjYWxsZWQgYW5kIGRlZmluZWQgaW4gYSBkeW5hbWljIG9iamVjdCwgb3IgaXQKLSAgICAgaXMgaW1wb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBzZXQgdXAgZ2xvYmFsIGxpbmthZ2UgY29kZSBmb3IgaXQuCi0gICAgIChVbmxlc3Mgd2UgZGlkIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgd2UgZGlkbid0IG5lZWQgdGhpcwotICAgICBzeW1ib2wuKSAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0NBTExFRCkgIT0gMAotICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotICAgICAgJiYgaC0+cm9vdC5yb290LnN0cmluZ1swXSA9PSAnLicKLSAgICAgICYmIGgtPmRlc2NyaXB0b3IgIT0gTlVMTAotICAgICAgJiYgKChoLT5kZXNjcmlwdG9yLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwCi0JICB8fCAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwCi0JICAgICAgJiYgKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDApKQotICAgICAgJiYgKCEgeGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+Z2MKLQkgIHx8IChoLT5mbGFncyAmIFhDT0ZGX01BUkspICE9IDApKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoZHM7Ci0KLSAgICAgIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmxpbmthZ2Vfc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHNlYzsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIGgtPnNtY2xhcyA9IFhNQ19HTDsKLSAgICAgIGgtPmZsYWdzIHw9IFhDT0ZGX0RFRl9SRUdVTEFSOwotICAgICAgc2VjLT5fcmF3X3NpemUgKz0gWENPRkZfR0xJTktfU0laRTsKLQotICAgICAgLyogVGhlIGdsb2JhbCBsaW5rYWdlIGNvZGUgcmVxdWlyZXMgYSBUT0MgZW50cnkgZm9yIHRoZQotICAgICAgICAgZGVzY3JpcHRvci4gICovCi0gICAgICBoZHMgPSBoLT5kZXNjcmlwdG9yOwotICAgICAgQkZEX0FTU0VSVCAoKGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JCSAgIHx8IGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQkgICYmIChoZHMtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDApOwotICAgICAgaGRzLT5mbGFncyB8PSBYQ09GRl9NQVJLOwotICAgICAgaWYgKGhkcy0+dG9jX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBoZHMtPnRvY19zZWN0aW9uID0geGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+dG9jX3NlY3Rpb247Ci0JICBoZHMtPnUudG9jX29mZnNldCA9IGhkcy0+dG9jX3NlY3Rpb24tPl9yYXdfc2l6ZTsKLQkgIGhkcy0+dG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSArPSA0OwotCSAgKyt4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5sZHJlbF9jb3VudDsKLQkgICsraGRzLT50b2Nfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JICBoZHMtPmluZHggPSAtMjsKLQkgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfU0VUX1RPQyB8IFhDT0ZGX0xEUkVMOwotCi0JICAvKiBXZSBuZWVkIHRvIGNhbGwgeGNvZmZfYnVpbGRfbGRzeW1zIHJlY3Vyc2l2ZWx5IGhlcmUsCi0gICAgICAgICAgICAgYmVjYXVzZSB3ZSBtYXkgYWxyZWFkeSBoYXZlIHBhc3NlZCBoZHMgb24gdGhlIHRyYXZlcnNhbC4gICovCi0JICB4Y29mZl9idWlsZF9sZHN5bXMgKGhkcywgcCk7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBleHBvcnRlZCwgYnV0IG5vdCBkZWZpbmVkLCB3ZSBuZWVkIHRvIHRyeSB0bwotICAgICBkZWZpbmUgaXQuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfRVhQT1JUKSAhPSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpID09IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMAotICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKLSAgICB7Ci0gICAgICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgIT0gMAotCSAgJiYgKGgtPmRlc2NyaXB0b3ItPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5kZXNjcmlwdG9yLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICAvKiBUaGlzIGlzIGFuIHVuZGVmaW5lZCBmdW5jdGlvbiBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aAotICAgICAgICAgICAgIGEgZGVmaW5lZCBlbnRyeSBwb2ludC4gIFdlIGNhbiBidWlsZCB1cCBhIGZ1bmN0aW9uCi0gICAgICAgICAgICAgZGVzY3JpcHRvciBvdXJzZWx2ZXMuICBCZWxpZXZlIGl0IG9yIG5vdCwgdGhlIEFJWCBsaW5rZXIKLSAgICAgICAgICAgICBhY3R1YWxseSBkb2VzIHRoaXMsIGFuZCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgd2UgbmVlZCB0bwotICAgICAgICAgICAgIGRvIGl0IGFzIHdlbGwuICAqLwotCSAgc2VjID0geGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uOwotCSAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gc2VjOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgaC0+c21jbGFzID0gWE1DX0RTOwotCSAgaC0+ZmxhZ3MgfD0gWENPRkZfREVGX1JFR1VMQVI7Ci0JICBzZWMtPl9yYXdfc2l6ZSArPSAxMjsKLQotCSAgLyogQSBmdW5jdGlvbiBkZXNjcmlwdG9yIHVzZXMgdHdvIHJlbG9jczogb25lIGZvciB0aGUKLSAgICAgICAgICAgICBhc3NvY2lhdGVkIGNvZGUsIGFuZCBvbmUgZm9yIHRoZSBUT0MgYWRkcmVzcy4gICovCi0JICB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5sZHJlbF9jb3VudCArPSAyOwotCSAgc2VjLT5yZWxvY19jb3VudCArPSAyOwotCi0JICAvKiBXZSBoYW5kbGUgd3JpdGluZyBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkZXNjcmlwdG9yIGluCi0gICAgICAgICAgICAgeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbC4gICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygid2FybmluZzogYXR0ZW1wdCB0byBleHBvcnQgdW5kZWZpbmVkIHN5bWJvbCBgJXMnIiksCi0JICAgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkgIGgtPmxkc3ltID0gTlVMTDsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBzdGlsbCBhIGNvbW1vbiBzeW1ib2wsIGFuZCBpdCB3YXNuJ3QgZ2FyYmFnZQotICAgICBjb2xsZWN0ZWQsIHdlIG5lZWQgdG8gYWN0dWFsbHkgYWxsb2NhdGUgc3BhY2UgZm9yIGl0IGluIHRoZSAuYnNzCi0gICAgIHNlY3Rpb24uICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0gICAgICAmJiAoISB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5nYwotCSAgfHwgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgIT0gMCkKLSAgICAgICYmIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPl9yYXdfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGJmZF9pc19jb21fc2VjdGlvbiAoaC0+cm9vdC51LmMucC0+c2VjdGlvbikpOwotICAgICAgaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+X3Jhd19zaXplID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBhZGQgYSBzeW1ib2wgdG8gdGhlIC5sb2FkZXIgc2VjdGlvbiBpZiBpdCBpcyBtZW50aW9uZWQKLSAgICAgaW4gYSByZWxvYyB3aGljaCB3ZSBhcmUgY29weWluZyB0byB0aGUgLmxvYWRlciBzZWN0aW9uIGFuZCBpdCB3YXMKLSAgICAgbm90IGRlZmluZWQgb3IgY29tbW9uLCBvciBpZiBpdCBpcyB0aGUgZW50cnkgcG9pbnQsIG9yIGlmIGl0IGlzCi0gICAgIGJlaW5nIGV4cG9ydGVkLiAgKi8KLQotICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0xEUkVMKSA9PSAwCi0gICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9FTlRSWSkgPT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfRVhQT1JUKSA9PSAwKQotICAgIHsKLSAgICAgIGgtPmxkc3ltID0gTlVMTDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBXZSBkb24ndCBuZWVkIHRvIGFkZCB0aGlzIHN5bWJvbCBpZiB3ZSBkaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZAotICAgICB3ZSBkaWQgbm90IG1hcmsgdGhpcyBzeW1ib2wuICAqLwotICBpZiAoeGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+Z2MKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCi0gICAgewotICAgICAgaC0+bGRzeW0gPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFdlIG1heSBoYXZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgc3ltYm9sIGR1ZSB0byB0aGUgcmVjdXJzaXZlCi0gICAgIGNhbGwgYWJvdmUuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfQlVJTFRfTERTWU0pICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbmVlZCB0byBhZGQgdGhpcyBzeW1ib2wgdG8gdGhlIC5sb2FkZXIgc3ltYm9scy4gICovCi0KLSAgQkZEX0FTU0VSVCAoaC0+bGRzeW0gPT0gTlVMTCk7Ci0gIGgtPmxkc3ltID0gKChzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKikKLQkgICAgICBiZmRfemFsbG9jIChsZGluZm8tPm91dHB1dF9iZmQsCi0JCQkgIHNpemVvZiAoc3RydWN0IGludGVybmFsX2xkc3ltKSkpOwotICBpZiAoaC0+bGRzeW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsZGluZm8tPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDApCi0gICAgaC0+bGRzeW0tPmxfaWZpbGUgPSBoLT5sZGluZHg7Ci0KLSAgLyogVGhlIGZpcnN0IDMgc3ltYm9sIHRhYmxlIGluZGljZXMgYXJlIHJlc2VydmVkIHRvIGluZGljYXRlIHRoZQotICAgICBzZWN0aW9ucy4gICovCi0gIGgtPmxkaW5keCA9IGxkaW5mby0+bGRzeW1fY291bnQgKyAzOwotCi0gICsrbGRpbmZvLT5sZHN5bV9jb3VudDsKLQotICBsZW4gPSBzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotICBpZiAobGVuIDw9IFNZTU5NTEVOKQotICAgIHN0cm5jcHkgKGgtPmxkc3ltLT5fbC5fbF9uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBTWU1OTUxFTik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGRpbmZvLT5zdHJpbmdfc2l6ZSArIGxlbiArIDMgPiBsZGluZm8tPnN0cmluZ19hbGMpCi0JewotCSAgc2l6ZV90IG5ld2FsYzsKLQkgIGJmZF9ieXRlICpuZXdzdHJpbmdzOwotCi0JICBuZXdhbGMgPSBsZGluZm8tPnN0cmluZ19hbGMgKiAyOwotCSAgaWYgKG5ld2FsYyA9PSAwKQotCSAgICBuZXdhbGMgPSAzMjsKLQkgIHdoaWxlIChsZGluZm8tPnN0cmluZ19zaXplICsgbGVuICsgMyA+IG5ld2FsYykKLQkgICAgbmV3YWxjICo9IDI7Ci0KLQkgIG5ld3N0cmluZ3MgPSAoKGJmZF9ieXRlICopCi0JCQliZmRfcmVhbGxvYyAoKFBUUikgbGRpbmZvLT5zdHJpbmdzLCBuZXdhbGMpKTsKLQkgIGlmIChuZXdzdHJpbmdzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBsZGluZm8tPmZhaWxlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBsZGluZm8tPnN0cmluZ19hbGMgPSBuZXdhbGM7Ci0JICBsZGluZm8tPnN0cmluZ3MgPSBuZXdzdHJpbmdzOwotCX0KLQotICAgICAgYmZkX3B1dF8xNiAobGRpbmZvLT5vdXRwdXRfYmZkLCBsZW4gKyAxLAotCQkgIGxkaW5mby0+c3RyaW5ncyArIGxkaW5mby0+c3RyaW5nX3NpemUpOwotICAgICAgc3RyY3B5IChsZGluZm8tPnN0cmluZ3MgKyBsZGluZm8tPnN0cmluZ19zaXplICsgMiwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0gICAgICBoLT5sZHN5bS0+X2wuX2xfbC5fbF96ZXJvZXMgPSAwOwotICAgICAgaC0+bGRzeW0tPl9sLl9sX2wuX2xfb2Zmc2V0ID0gbGRpbmZvLT5zdHJpbmdfc2l6ZSArIDI7Ci0gICAgICBsZGluZm8tPnN0cmluZ19zaXplICs9IGxlbiArIDM7Ci0gICAgfQotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0JVSUxUX0xEU1lNOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCi0KLWJvb2xlYW4KLV9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvIGZpbmZvOwotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBzaXplX3QgbWF4X2NvbnRlbnRzX3NpemU7Ci0gIHNpemVfdCBtYXhfc3ltX2NvdW50OwotICBzaXplX3QgbWF4X2xpbmVub19jb3VudDsKLSAgc2l6ZV90IG1heF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9vdXRwdXRfcmVsb2NfY291bnQ7Ci0gIGZpbGVfcHRyIHJlbF9maWxlcG9zOwotICB1bnNpZ25lZCBpbnQgcmVsc3o7Ci0gIGZpbGVfcHRyIGxpbmVfZmlsZXBvczsKLSAgdW5zaWduZWQgaW50IGxpbmVzejsKLSAgYmZkICpzdWI7Ci0gIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBjaGFyIHN0cmJ1ZltTVFJJTkdfU0laRV9TSVpFXTsKLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN0cnRhYiA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gIGZpbmZvLmxhc3RfZmlsZV9pbmRleCA9IC0xOwotICBmaW5mby50b2Nfc3ltaW5keCA9IC0xOwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZmluZm8uc3ltX2luZGljZXMgPSBOVUxMOwotICBmaW5mby5vdXRzeW1zID0gTlVMTDsKLSAgZmluZm8ubGluZW5vcyA9IE5VTEw7Ci0gIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLQotICBmaW5mby5sZHN5bSA9ICgoc3RydWN0IGV4dGVybmFsX2xkc3ltICopCi0JCSAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uLT5jb250ZW50cwotCQkgICsgTERIRFJTWikpOwotICBmaW5mby5sZHJlbCA9ICgoc3RydWN0IGV4dGVybmFsX2xkcmVsICopCi0JCSAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uLT5jb250ZW50cwotCQkgICsgTERIRFJTWgotCQkgICsgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkaGRyLmxfbnN5bXMgKiBMRFNZTVNaKSk7Ci0KLSAgeGNvZmZfZGF0YSAoYWJmZCktPmNvZmYubGlua19pbmZvID0gaW5mbzsKLQotICBmaW5mby5zdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoZmluZm8uc3RydGFiID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogQ291bnQgdGhlIGxpbmUgbnVtYmVyIGFuZCByZWxvY2F0aW9uIGVudHJpZXMgcmVxdWlyZWQgZm9yIHRoZQotICAgICBvdXRwdXQgZmlsZS4gIERldGVybWluZSBhIGZldyBtYXhpbXVtIHNpemVzLiAgKi8KLSAgbWF4X2NvbnRlbnRzX3NpemUgPSAwOwotICBtYXhfbGluZW5vX2NvdW50ID0gMDsKLSAgbWF4X3JlbG9jX2NvdW50ID0gMDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkgICAgICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi0JCSBsaW5rLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGV2ZXJ5IHNlY3Rpb24uICBXZSBuZWVkCi0JCSB0byBkbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGlkZW50aWZ5IGFueSBzZWN0aW9ucyB3aGljaAotCQkgdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QgaW5jbHVkZS4gICovCi0JICAgICAgc2VjLT5saW5rZXJfbWFyayA9IHRydWU7Ci0KLQkgICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZQotCQkgIHx8IGluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUpCi0JCW8tPmxpbmVub19jb3VudCArPSBzZWMtPmxpbmVub19jb3VudDsKLQotCSAgICAgIG8tPnJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICBpZiAoc2VjLT5fcmF3X3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKLQkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQkgICAgICBpZiAoc2VjLT5saW5lbm9fY291bnQgPiBtYXhfbGluZW5vX2NvdW50KQotCQltYXhfbGluZW5vX2NvdW50ID0gc2VjLT5saW5lbm9fY291bnQ7Ci0JICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpICE9IE5VTEwKLQkJICAmJiB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYykgIT0gTlVMTAotCQkgICYmICh4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmxpbmVub19jb3VudAotCQkgICAgICA+IG1heF9saW5lbm9fY291bnQpKQotCQltYXhfbGluZW5vX2NvdW50ID0KLQkJICB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmxpbmVub19jb3VudDsKLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9yZWxvY19jb3VudCkKLQkJbWF4X3JlbG9jX2NvdW50ID0gc2VjLT5yZWxvY19jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICArK28tPnJlbG9jX2NvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogQ29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIGFsbCB0aGUgc2VjdGlvbnMuICAqLwotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZpbGVfYWxpZ24gIT0gMCkKLQlhYm9ydCAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfdm1hIGZpbGVfYWxpZ247Ci0KLSAgICAgIGZpbGVfYWxpZ24gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZmlsZV9hbGlnbjsKLSAgICAgIGlmIChmaWxlX2FsaWduICE9IDApCi0JewotCSAgYm9vbGVhbiBzYXdfY29udGVudHM7Ci0JICBpbnQgaW5keDsKLQkgIGFzZWN0aW9uICoqb3A7Ci0JICBmaWxlX3B0ciBzb2ZhcjsKLQotCSAgLyogSW5zZXJ0IC5wYWQgc2VjdGlvbnMgYmVmb3JlIGV2ZXJ5IHNlY3Rpb24gd2hpY2ggaGFzCi0gICAgICAgICAgICAgY29udGVudHMgYW5kIGlzIGxvYWRlZCwgaWYgaXQgaXMgcHJlY2VkZWQgYnkgc29tZSBvdGhlcgotICAgICAgICAgICAgIHNlY3Rpb24gd2hpY2ggaGFzIGNvbnRlbnRzIGFuZCBpcyBsb2FkZWQuICAqLwotCSAgc2F3X2NvbnRlbnRzID0gdHJ1ZTsKLQkgIGZvciAob3AgPSAmYWJmZC0+c2VjdGlvbnM7ICpvcCAhPSBOVUxMOyBvcCA9ICYoKm9wKS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKCgqb3ApLT5uYW1lLCAiLnBhZCIpID09IDApCi0JCXNhd19jb250ZW50cyA9IGZhbHNlOwotCSAgICAgIGVsc2UgaWYgKCgoKm9wKS0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCi0JCSAgICAgICAmJiAoKCpvcCktPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXsKLQkJICBpZiAoISBzYXdfY29udGVudHMpCi0JCSAgICBzYXdfY29udGVudHMgPSB0cnVlOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKm4sICpob2xkOwotCi0JCSAgICAgIGhvbGQgPSAqb3A7Ci0JCSAgICAgICpvcCA9IE5VTEw7Ci0JCSAgICAgIG4gPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5wYWQiKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoKm9wID09IG4pOwotCQkgICAgICBuLT5uZXh0ID0gaG9sZDsKLQkJICAgICAgbi0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCQkgICAgICBuLT5hbGlnbm1lbnRfcG93ZXIgPSAwOwotCQkgICAgICBzYXdfY29udGVudHMgPSBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIC8qIFJlc2V0IHRoZSBzZWN0aW9uIGluZGljZXMgYWZ0ZXIgaW5zZXJ0aW5nIHRoZSBuZXcKLSAgICAgICAgICAgICBzZWN0aW9ucy4gICovCi0JICBpbmR4ID0gMDsKLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICB7Ci0JICAgICAgKytpbmR4OwotCSAgICAgIG8tPnRhcmdldF9pbmRleCA9IGluZHg7Ci0JICAgIH0KLQkgIEJGRF9BU1NFUlQgKCh1bnNpZ25lZCBpbnQpIGluZHggPT0gYWJmZC0+c2VjdGlvbl9jb3VudCk7Ci0KLQkgIC8qIFdvcmsgb3V0IGFwcHJvcHJpYXRlIHNpemVzIGZvciB0aGUgLnBhZCBzZWN0aW9ucyB0byBmb3JjZQotICAgICAgICAgICAgIGVhY2ggc2VjdGlvbiB0byBsYW5kIG9uIGEgcGFnZSBib3VuZGFyeS4gIFRoaXMgYml0IG9mCi0gICAgICAgICAgICAgY29kZSBrbm93cyB3aGF0IGNvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBpcyBnb2luZwotICAgICAgICAgICAgIHRvIGRvLiAgKi8KLQkgIHNvZmFyID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLQkgIHNvZmFyICs9IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCk7Ci0JICBzb2ZhciArPSBhYmZkLT5zZWN0aW9uX2NvdW50ICogYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICBpZiAoby0+cmVsb2NfY291bnQgPj0gMHhmZmZmIHx8IG8tPmxpbmVub19jb3VudCA+PSAweGZmZmYpCi0JICAgICAgc29mYXIgKz0gYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKLQotCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChvLT5uYW1lLCAiLnBhZCIpID09IDApCi0JCXsKLQkJICBiZmRfdm1hIHBhZ2VvZmY7Ci0KLQkJICBCRkRfQVNTRVJUIChvLT5fcmF3X3NpemUgPT0gMCk7Ci0JCSAgcGFnZW9mZiA9IHNvZmFyICYgKGZpbGVfYWxpZ24gLSAxKTsKLQkJICBpZiAocGFnZW9mZiAhPSAwKQotCQkgICAgewotCQkgICAgICBvLT5fcmF3X3NpemUgPSBmaWxlX2FsaWduIC0gcGFnZW9mZjsKLQkJICAgICAgc29mYXIgKz0gZmlsZV9hbGlnbiAtIHBhZ2VvZmY7Ci0JCSAgICAgIG8tPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQkJICAgIHNvZmFyICs9IEJGRF9BTElHTiAoby0+X3Jhd19zaXplLAotCQkJCQkxIDw8IG8tPmFsaWdubWVudF9wb3dlcik7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwb2ludGVycyB3ZSBuZWVkIHRvIGtlZXAgZm9yIHRoZSByZWxvY3MuICAqLwotICB7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAvKiBXZSB1c2Ugc2VjdGlvbl9jb3VudCArIDEsIHJhdGhlciB0aGFuIHNlY3Rpb25fY291bnQsIGJlY2F1c2UKLSAgICAgICB0aGUgdGFyZ2V0X2luZGV4IGZpZWxkcyBhcmUgMSBiYXNlZC4gICovCi0gICAgZmluZm8uc2VjdGlvbl9pbmZvID0KLSAgICAgICgoc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICopCi0gICAgICAgYmZkX21hbGxvYyAoKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKQotCQkgICAqIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvKSkpOwotICAgIGlmIChmaW5mby5zZWN0aW9uX2luZm8gPT0gTlVMTCkKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIGZvciAoaSA9IDA7IGkgPD0gYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotICAgICAgewotCWZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgPSBOVUxMOwotCWZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzID0gTlVMTDsKLQlmaW5mby5zZWN0aW9uX2luZm9baV0udG9jX3JlbF9oYXNoZXMgPSBOVUxMOwotICAgICAgfQotICB9Ci0KLSAgLyogU2V0IHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIHJlbG9jcy4gICovCi0gIHJlbF9maWxlcG9zID0gb2JqX3JlbG9jYmFzZSAoYWJmZCk7Ci0gIHJlbHN6ID0gYmZkX2NvZmZfcmVsc3ogKGFiZmQpOwotICBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID0gMDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0Jby0+cmVsX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEEgc3RyaXBwZWQgZmlsZSBoYXMgbm8gcmVsb2NzLiAgSG93ZXZlciwgd2Ugc3RpbGwKLSAgICAgICAgICAgICBhbGxvY2F0ZSB0aGUgYnVmZmVycywgc28gdGhhdCBsYXRlciBjb2RlIGRvZXNuJ3QgaGF2ZSB0bwotICAgICAgICAgICAgIHdvcnJ5IGFib3V0IHdoZXRoZXIgd2UgYXJlIHN0cmlwcGluZyBvciBub3QuICAqLwotCSAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKLQkgICAgby0+cmVsX2ZpbGVwb3MgPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgICAgIG8tPnJlbF9maWxlcG9zID0gcmVsX2ZpbGVwb3M7Ci0JICAgICAgcmVsX2ZpbGVwb3MgKz0gby0+cmVsb2NfY291bnQgKiByZWxzejsKLQkgICAgfQotCi0JICAvKiBXZSBkb24ndCBrbm93IHRoZSBpbmRpY2VzIG9mIGdsb2JhbCBzeW1ib2xzIHVudGlsIHdlIGhhdmUKLSAgICAgICAgICAgICB3cml0dGVuIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGb3IgZWFjaCBzZWN0aW9uIGluCi0gICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlLCB3ZSBrZWVwIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhhc2gKLSAgICAgICAgICAgICB0YWJsZSBlbnRyaWVzLiAgRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYQotICAgICAgICAgICAgIHJlbG9jLiAgV2hlbiB3ZSBmaW5kIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIHdlCi0gICAgICAgICAgICAgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4KLSAgICAgICAgICAgICBmaXggdXAgdGhlIHN5bWJvbCBpbmRleCBhZnRlciB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUKLSAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLgotCi0JICAgICBCZWNhdXNlIG9mIHRoaXMgcHJvYmxlbSwgd2UgYWxzbyBrZWVwIHRoZSByZWxvY3MgaW4KLQkgICAgIG1lbW9yeSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5rLiAgVGhpcyB3YXN0ZXMgbWVtb3J5LgotCSAgICAgV2UgY291bGQgYmFja3BhdGNoIHRoZSBmaWxlIGxhdGVyLCBJIHN1cHBvc2UsIGFsdGhvdWdoIGl0Ci0JICAgICB3b3VsZCBiZSBzbG93LiAgKi8KLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9Ci0JICAgICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCi0JICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudCAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSkpOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcyA9Ci0JICAgICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50Ci0JCSAgICAgKiBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPT0gTlVMTAotCSAgICAgIHx8IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChvLT5yZWxvY19jb3VudCA+IG1heF9vdXRwdXRfcmVsb2NfY291bnQpCi0JICAgIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSBvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBzaXplIG9mIHRoZSByZWxvY3MsIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbGUKLSAgICAgcG9zaXRpb25zIG9mIHRoZSBsaW5lIG51bWJlcnMuICAqLwotICBsaW5lX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLSAgZmluZm8ubGluZV9maWxlcG9zID0gbGluZV9maWxlcG9zOwotICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoby0+bGluZW5vX2NvdW50ID09IDApCi0Jby0+bGluZV9maWxlcG9zID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvLT5saW5lX2ZpbGVwb3MgPSBsaW5lX2ZpbGVwb3M7Ci0JICBsaW5lX2ZpbGVwb3MgKz0gby0+bGluZW5vX2NvdW50ICogbGluZXN6OwotCX0KLQotICAgICAgLyogUmVzZXQgdGhlIHJlbG9jIGFuZCBsaW5lbm8gY291bnRzLCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSB0bwotCSBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd2UgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0gICAgfQotCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBsaW5lX2ZpbGVwb3M7Ci0KLSAgLyogRmlndXJlIG91dCB0aGUgbGFyZ2VzdCBudW1iZXIgb2Ygc3ltYm9scyBpbiBhbiBpbnB1dCBCRkQuICBUYWtlCi0gICAgIHRoZSBvcHBvcnR1bml0eSB0byBjbGVhciB0aGUgb3V0cHV0X2hhc19iZWd1biBmaWVsZHMgb2YgYWxsIHRoZQotICAgICBpbnB1dCBCRkQncy4gIFdlIHdhbnQgYXQgbGVhc3QgNiBzeW1ib2xzLCBzaW5jZSB0aGF0IGlzIHRoZQotICAgICBudW1iZXIgd2hpY2ggeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCBtYXkgbmVlZC4gICovCi0gIG1heF9zeW1fY291bnQgPSA2OwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzaXplX3Qgc3o7Ci0KLSAgICAgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotICAgICAgc3ogPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoc3ViKTsKLSAgICAgIGlmIChzeiA+IG1heF9zeW1fY291bnQpCi0JbWF4X3N5bV9jb3VudCA9IHN6OwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzb21lIGJ1ZmZlcnMgdXNlZCB3aGlsZSBsaW5raW5nLiAgKi8KLSAgZmluZm8uaW50ZXJuYWxfc3ltcyA9ICgoc3RydWN0IGludGVybmFsX3N5bWVudCAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50KSkpOwotICBmaW5mby5zeW1faW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKLSAgZmluZm8ub3V0c3ltcyA9ICgoYmZkX2J5dGUgKikKLQkJICAgYmZkX21hbGxvYyAoKHNpemVfdCkgKChtYXhfc3ltX2NvdW50ICsgMSkgKiBzeW1lc3opKSk7Ci0gIGZpbmZvLmxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2xpbmVub19jb3VudAotCQkJCQkgICAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkpOwotICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQgKiByZWxzeik7Ci0gIGlmICgoZmluZm8uaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLnN5bV9pbmRpY2VzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCBmaW5mby5vdXRzeW1zID09IE5VTEwKLSAgICAgIHx8IChmaW5mby5saW5lbm9zID09IE5VTEwgJiYgbWF4X2xpbmVub19jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uY29udGVudHMgPT0gTlVMTCAmJiBtYXhfY29udGVudHNfc2l6ZSA+IDApCi0gICAgICB8fCAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0gMDsKLSAgeGNvZmZfZGF0YSAoYWJmZCktPnRvYyA9IChiZmRfdm1hKSAtMTsKLQotICAvKiBXZSBub3cga25vdyB0aGUgcG9zaXRpb24gb2YgZXZlcnl0aGluZyBpbiB0aGUgZmlsZSwgZXhjZXB0IHRoYXQKLSAgICAgd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlIGFuZCB0aGVyZWZvcmUgd2UgZG9uJ3QKLSAgICAga25vdyB3aGVyZSB0aGUgc3RyaW5nIHRhYmxlIHN0YXJ0cy4gIFdlIGp1c3QgYnVpbGQgdGhlIHN0cmluZwotICAgICB0YWJsZSBpbiBtZW1vcnkgYXMgd2UgZ28gYWxvbmcuICBXZSBwcm9jZXNzIGFsbCB0aGUgcmVsb2NhdGlvbnMKLSAgICAgZm9yIGEgc2luZ2xlIGlucHV0IGZpbGUgYXQgb25jZS4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSAgICAgICYmIHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXItPnh2ZWMgPT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgIHN1YiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0JICAgICAgaWYgKCEgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuKQotCQl7Ci0JCSAgaWYgKCEgeGNvZmZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgeGNvZmZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgJmZpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEZyZWUgdXAgdGhlIGJ1ZmZlcnMgdXNlZCBieSB4Y29mZl9saW5rX2lucHV0X2JmZC4gICovCi0KLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgICAgIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOwotICAgICAgZmluZm8uc3ltX2luZGljZXMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLmxpbmVub3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5saW5lbm9zKTsKLSAgICAgIGZpbmZvLmxpbmVub3MgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uY29udGVudHMpOwotICAgICAgZmluZm8uY29udGVudHMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gICAgICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICAvKiBUaGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFIHN5bWJvbCBpcyBzdXBwb3NlZCB0byBiZSAtMS4gIFdyaXRlCi0gICAgIGl0IG91dCBhZ2Fpbi4gICovCi0gIGlmIChmaW5mby5sYXN0X2ZpbGVfaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgZmluZm8ubGFzdF9maWxlLm5fdmFsdWUgPSAtMTsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmZpbmZvLmxhc3RfZmlsZSwKLQkJCSAgICAgKFBUUikgZmluZm8ub3V0c3ltcyk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgZmluZm8ubGFzdF9maWxlX2luZGV4ICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGZpbmZvLm91dHN5bXMsIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scyB3aGljaCBkbyBub3QgY29tZSBmcm9tIFhDT0ZGCi0gICAgIGlucHV0IGZpbGVzLiAgKi8KLSAgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICB4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sLAotCQkJICAgIChQVFIpICZmaW5mbyk7Ci0KLSAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKLSAgICAgIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUgZ2xvYmFsIHN5bWJvbHMsIHdlIGtub3cgdGhlCi0gICAgIHN5bWJvbCBpbmRpY2VzIHRvIHVzZSBmb3IgcmVsb2NzIGFnYWluc3QgdGhlbSwgYW5kIHdlIGNhbiBmaW5hbGx5Ci0gICAgIHdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KLSAgZXh0ZXJuYWxfcmVsb2NzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9vdXRwdXRfcmVsb2NfY291bnQgKiByZWxzeik7Ci0gIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOwotICAgICAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCAqdG9jX3JlbF9oYXNoOwotICAgICAgYmZkX2J5dGUgKmVyZWw7Ci0KLSAgICAgIC8qIEEgc3RyaXBwZWQgZmlsZSBoYXMgbm8gcmVsb2NzLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0JewotCSAgby0+cmVsb2NfY291bnQgPSAwOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaXJlbCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKLSAgICAgIGlyZWxlbmQgPSBpcmVsICsgby0+cmVsb2NfY291bnQ7Ci0gICAgICByZWxfaGFzaCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXM7Ci0gICAgICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKywgcmVsX2hhc2grKywgZXJlbCArPSByZWxzeikKLQl7Ci0JICBpZiAoKnJlbF9oYXNoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoKCpyZWxfaGFzaCktPmluZHggPCAwKQotCQl7Ci0JCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkJIChpbmZvLCAoKnJlbF9oYXNoKS0+cm9vdC5yb290LnN0cmluZywKLQkJCSAgKGJmZCAqKSBOVUxMLCBvLCBpcmVsLT5yX3ZhZGRyKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAoKnJlbF9oYXNoKS0+aW5keCA9IDA7Ci0JCX0KLQkgICAgICBpcmVsLT5yX3N5bW5keCA9ICgqcmVsX2hhc2gpLT5pbmR4OwotCSAgICB9Ci0JfQotCi0gICAgICBmb3IgKHRvY19yZWxfaGFzaCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnRvY19yZWxfaGFzaGVzOwotCSAgIHRvY19yZWxfaGFzaCAhPSBOVUxMOwotCSAgIHRvY19yZWxfaGFzaCA9IHRvY19yZWxfaGFzaC0+bmV4dCkKLQl7Ci0JICBpZiAodG9jX3JlbF9oYXNoLT5oLT51LnRvY19pbmR4IDwgMCkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJICAgICAoaW5mbywgdG9jX3JlbF9oYXNoLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCQkgICAgICAoYmZkICopIE5VTEwsIG8sIHRvY19yZWxfaGFzaC0+cmVsLT5yX3ZhZGRyKSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIHRvY19yZWxfaGFzaC0+aC0+dS50b2NfaW5keCA9IDA7Ci0JICAgIH0KLQkgIHRvY19yZWxfaGFzaC0+cmVsLT5yX3N5bW5keCA9IHRvY19yZWxfaGFzaC0+aC0+dS50b2NfaW5keDsKLQl9Ci0KLSAgICAgIC8qIFhDT0ZGIHJlcXVpcmVzIHRoYXQgdGhlIHJlbG9jcyBiZSBzb3J0ZWQgYnkgYWRkcmVzcy4gIFdlIHRlbmQKLSAgICAgICAgIHRvIHByb2R1Y2UgdGhlbSBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlaXIgY29udGFpbmluZyBjc2VjdHMKLSAgICAgICAgIGFwcGVhciBpbiB0aGUgc3ltYm9sIHRhYmxlLCB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgYnkKLSAgICAgICAgIGFkZHJlc3MuICBTbyB3ZSBzb3J0IHRoZW0gaGVyZS4gIFRoZXJlIG1heSBiZSBhIGJldHRlciB3YXkgdG8KLSAgICAgICAgIGRvIHRoaXMuICAqLwotICAgICAgcXNvcnQgKChQVFIpIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcywKLQkgICAgIG8tPnJlbG9jX2NvdW50LCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyksCi0JICAgICB4Y29mZl9zb3J0X3JlbG9jcyk7Ci0KLSAgICAgIGlyZWwgPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0gICAgICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotICAgICAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKLSAgICAgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQotCWJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAoUFRSKSBpcmVsLCAoUFRSKSBlcmVsKTsKLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgby0+cmVsb2NfY291bnQsCi0JCQlhYmZkKSAhPSByZWxzeiAqIG8tPnJlbG9jX2NvdW50KQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIEZyZWUgdXAgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLwotICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyk7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMpOwotCX0KLSAgICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mbyk7Ci0gICAgICBmaW5mby5zZWN0aW9uX2luZm8gPSBOVUxMOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGxvYWRlciBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgQkZEX0FTU0VSVCAoKGJmZF9ieXRlICopIGZpbmZvLmxkcmVsCi0JICAgICAgPT0gKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sb2FkZXJfc2VjdGlvbi0+Y29udGVudHMKLQkJICArIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sZGhkci5sX2ltcG9mZikpOwotICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uOwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgby0+Y29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCi0JCQkJICBvLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgbWFnaWMgc2VjdGlvbnMuICAqLwotICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxpbmthZ2Vfc2VjdGlvbjsKLSAgaWYgKG8tPl9yYXdfc2l6ZSA+IDAKLSAgICAgICYmICEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwgby0+Y29udGVudHMsCi0JCQkJICAgICBvLT5vdXRwdXRfb2Zmc2V0LCBvLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnRvY19zZWN0aW9uOwotICBpZiAoby0+X3Jhd19zaXplID4gMAotICAgICAgJiYgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLCBvLT5jb250ZW50cywKLQkJCQkgICAgIG8tPm91dHB1dF9vZmZzZXQsIG8tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG8gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uOwotICBpZiAoby0+X3Jhd19zaXplID4gMAotICAgICAgJiYgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLCBvLT5jb250ZW50cywKLQkJCQkgICAgIG8tPm91dHB1dF9vZmZzZXQsIG8tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzdHJpbmcgdGFibGUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCShvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzeiksCi0JCVNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsCi0JCV9iZmRfc3RyaW5ndGFiX3NpemUgKGZpbmZvLnN0cnRhYikgKyBTVFJJTkdfU0laRV9TSVpFLAotCQkoYmZkX2J5dGUgKikgc3RyYnVmKTsKLSAgaWYgKGJmZF93cml0ZSAoc3RyYnVmLCAxLCBTVFJJTkdfU0laRV9TSVpFLCBhYmZkKSAhPSBTVFJJTkdfU0laRV9TSVpFKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAoISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBmaW5mby5zdHJ0YWIpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN0cnRhYik7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBkZWJ1Z2dpbmcgc3RyaW5nIHRhYmxlLiAgKi8KLSAgbyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uOwotICBpZiAobyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmRlYnVnX3N0cnRhYjsKLQotICAgICAgZGVidWdfc3RydGFiID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3N0cnRhYjsKLSAgICAgIEJGRF9BU1NFUlQgKG8tPm91dHB1dF9zZWN0aW9uLT5fcmF3X3NpemUgLSBvLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgPj0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZGVidWdfc3RydGFiKSk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICBvLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIG8tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBTRUVLX1NFVCkgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGRlYnVnX3N0cnRhYikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIFNldHRpbmcgYmZkX2dldF9zeW1jb3VudCB0byAwIHdpbGwgY2F1c2Ugd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHRvCi0gICAgIG5vdCB0cnkgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZmluZm8uc3RydGFiICE9IE5VTEwpCi0gICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzICE9IE5VTEwpCi0JICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzKTsKLQl9Ci0gICAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm8pOwotICAgIH0KLSAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKLSAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOwotICBpZiAoZmluZm8ub3V0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLm91dHN5bXMpOwotICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOwotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBMaW5rIGFuIGlucHV0IGZpbGUgaW50byB0aGUgbGlua2VyIG91dHB1dCBmaWxlLiAgVGhpcyBmdW5jdGlvbgotICAgaGFuZGxlcyBhbGwgdGhlIHNlY3Rpb25zIGFuZCByZWxvY2F0aW9ucyBvZiB0aGUgaW5wdXQgZmlsZSBhdCBvbmNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2xpbmtfaW5wdXRfYmZkIChmaW5mbywgaW5wdXRfYmZkKQotICAgICBzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgY29uc3QgY2hhciAqc3RyaW5nczsKLSAgYmZkX3NpemVfdHlwZSBzeW1lbnRfYmFzZTsKLSAgdW5zaWduZWQgaW50IG5fdG1hc2s7Ci0gIHVuc2lnbmVkIGludCBuX2J0c2hmdDsKLSAgYm9vbGVhbiBjb3B5LCBoYXNoOwotICBiZmRfc2l6ZV90eXBlIGlzeW1lc3o7Ci0gIGJmZF9zaXplX3R5cGUgb3N5bWVzejsKLSAgYmZkX3NpemVfdHlwZSBsaW5lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXN5bXA7Ci0gIGFzZWN0aW9uICoqY3NlY3RwcDsKLSAgdW5zaWduZWQgbG9uZyAqZGVidWdfaW5kZXg7Ci0gIGxvbmcgKmluZGV4cDsKLSAgdW5zaWduZWQgbG9uZyBvdXRwdXRfaW5kZXg7Ci0gIGJmZF9ieXRlICpvdXRzeW07Ci0gIHVuc2lnbmVkIGludCBpbmNsczsKLSAgYXNlY3Rpb24gKm9saW5lOwotICBib29sZWFuIGtlZXBfc3ltczsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgLyogV2UgY2FuIGp1c3Qgc2tpcCBEWU5BTUlDIGZpbGVzLCB1bmxlc3MgdGhpcyBpcyBhIHN0YXRpYyBsaW5rLiAgKi8KLSAgaWYgKChpbnB1dF9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgISBmaW5mby0+aW5mby0+c3RhdGljX2xpbmspCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTW92ZSBhbGwgdGhlIHN5bWJvbHMgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIHN0cmluZ3MgPSBOVUxMOwotICBzeW1lbnRfYmFzZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLSAgaXN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLSAgb3N5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoaW5wdXRfYmZkKTsKLSAgQkZEX0FTU0VSVCAobGluZXN6ID09IGJmZF9jb2ZmX2xpbmVzeiAob3V0cHV0X2JmZCkpOwotCi0gIG5fdG1hc2sgPSBjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmxvY2FsX25fdG1hc2s7Ci0gIG5fYnRzaGZ0ID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX2J0c2hmdDsKLQotICAvKiBEZWZpbmUgbWFjcm9zIHNvIHRoYXQgSVNGQ04sIGV0LiBhbC4sIG1hY3JvcyB3b3JrIGNvcnJlY3RseS4gICovCi0jZGVmaW5lIE5fVE1BU0sgbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBuX2J0c2hmdAotCi0gIGNvcHkgPSBmYWxzZTsKLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIGNvcHkgPSB0cnVlOwotICBoYXNoID0gdHJ1ZTsKLSAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0gICAgaGFzaCA9IGZhbHNlOwotCi0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoaW5wdXRfYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIGlzeW1lc3o7Ci0gIHN5bV9oYXNoID0gb2JqX3hjb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGNzZWN0cHAgPSB4Y29mZl9kYXRhIChpbnB1dF9iZmQpLT5jc2VjdHM7Ci0gIGRlYnVnX2luZGV4ID0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5kaWNlczsKLSAgaXN5bXAgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLSAgaW5kZXhwID0gZmluZm8tPnN5bV9pbmRpY2VzOwotICBvdXRwdXRfaW5kZXggPSBzeW1lbnRfYmFzZTsKLSAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0gIGluY2xzID0gMDsKLSAgb2xpbmUgPSBOVUxMOwotCi0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLSAgICAgIGludCBzbXR5cCA9IDA7Ci0gICAgICBib29sZWFuIHNraXA7Ci0gICAgICBib29sZWFuIHJlcXVpcmU7Ci0gICAgICBpbnQgYWRkOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSBpc3ltcCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBDX0VYVCBvciBDX0hJREVYVCBzeW1ib2wsIHdlIG5lZWQgdGhlIGNzZWN0Ci0gICAgICAgICBpbmZvcm1hdGlvbi4gICovCi0gICAgICBpZiAoaXN5bXAtPm5fc2NsYXNzID09IENfRVhUIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVCkKLQl7Ci0JICBCRkRfQVNTRVJUIChpc3ltcC0+bl9udW1hdXggPiAwKTsKLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsCi0JCQkJKFBUUikgKGVzeW0gKyBpc3ltZXN6ICogaXN5bXAtPm5fbnVtYXV4KSwKLQkJCQlpc3ltcC0+bl90eXBlLCBpc3ltcC0+bl9zY2xhc3MsCi0JCQkJaXN5bXAtPm5fbnVtYXV4IC0gMSwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCShQVFIpICZhdXgpOwotCSAgc210eXAgPSBTTVRZUF9TTVRZUCAoYXV4LnhfY3NlY3QueF9zbXR5cCk7Ci0JfQotCi0gICAgICAvKiBNYWtlIGEgY29weSBvZiAqaXN5bXAgc28gdGhhdCB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbgotCSBhbHdheXMgc2VlcyB0aGUgb3JpZ2luYWwgdmFsdWVzLiAgVGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4KLQkgYWx3YXlzIHJlY29tcHV0aW5nIHRoZSBzeW1ib2wgdmFsdWUgZXZlbiBpZiB3ZSBhcmUgc3RyaXBwaW5nCi0JIHRoZSBzeW1ib2wuICAqLwotICAgICAgaXN5bSA9ICppc3ltcDsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgaW4gdGhlIC5sb2FkZXIgc2VjdGlvbiwgc3dhcCBvdXQgdGhlCi0gICAgICAgICAubG9hZGVyIHN5bWJvbCBpbmZvcm1hdGlvbi4gIElmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sCi0gICAgICAgICByZWZlcmVuY2UgdG8gYSBkZWZpbmVkIHN5bWJvbCwgdGhvdWdoLCB0aGVuIHdhaXQgdW50aWwgd2UgZ2V0Ci0gICAgICAgICB0byB0aGUgZGVmaW5pdGlvbi4gICovCi0gICAgICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VYVAotCSAgJiYgKnN5bV9oYXNoICE9IE5VTEwKLQkgICYmICgqc3ltX2hhc2gpLT5sZHN5bSAhPSBOVUxMCi0JICAmJiAoc210eXAgIT0gWFRZX0VSCi0JICAgICAgfHwgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkpCi0JewotCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQkgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqbGRzeW07Ci0KLQkgIGggPSAqc3ltX2hhc2g7Ci0JICBsZHN5bSA9IGgtPmxkc3ltOwotCSAgaWYgKGlzeW0ubl9zY251bSA+IDApCi0JICAgIHsKLQkgICAgICBsZHN5bS0+bF9zY251bSA9ICgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICAgICAgbGRzeW0tPmxfdmFsdWUgPSAoaXN5bS5uX3ZhbHVlCi0JCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJLSAoKmNzZWN0cHApLT52bWEpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsZHN5bS0+bF9zY251bSA9IGlzeW0ubl9zY251bTsKLQkgICAgICBsZHN5bS0+bF92YWx1ZSA9IGlzeW0ubl92YWx1ZTsKLQkgICAgfQotCi0JICBsZHN5bS0+bF9zbXR5cGUgPSBzbXR5cDsKLQkgIGlmICgoKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKLQkgICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDApCi0JICAgICAgfHwgKGgtPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwKQotCSAgICBsZHN5bS0+bF9zbXR5cGUgfD0gTF9JTVBPUlQ7Ci0JICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSAhPSAwCi0JICAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwKQotCSAgICAgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0VYUE9SVCkgIT0gMCkKLQkgICAgbGRzeW0tPmxfc210eXBlIHw9IExfRVhQT1JUOwotCSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSAhPSAwKQotCSAgICBsZHN5bS0+bF9zbXR5cGUgfD0gTF9FTlRSWTsKLQotCSAgbGRzeW0tPmxfc21jbGFzID0gYXV4LnhfY3NlY3QueF9zbWNsYXM7Ci0KLQkgIGlmIChsZHN5bS0+bF9pZmlsZSA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JICAgIGxkc3ltLT5sX2lmaWxlID0gMDsKLQkgIGVsc2UgaWYgKGxkc3ltLT5sX2lmaWxlID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoKGxkc3ltLT5sX3NtdHlwZSAmIExfSU1QT1JUKSA9PSAwKQotCQlsZHN5bS0+bF9pZmlsZSA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkICppbXBiZmQ7Ci0KLQkJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgaW1wYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkJICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkJCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJICAgIGltcGJmZCA9IGgtPnJvb3QudS51bmRlZi5hYmZkOwotCQkgIGVsc2UKLQkJICAgIGltcGJmZCA9IE5VTEw7Ci0KLQkJICBpZiAoaW1wYmZkID09IE5VTEwpCi0JCSAgICBsZHN5bS0+bF9pZmlsZSA9IDA7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChpbXBiZmQtPnh2ZWMgPT0gZmluZm8tPm91dHB1dF9iZmQtPnh2ZWMpOwotCQkgICAgICBsZHN5bS0+bF9pZmlsZSA9IHhjb2ZmX2RhdGEgKGltcGJmZCktPmltcG9ydF9maWxlX2lkOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgbGRzeW0tPmxfcGFybSA9IDA7Ci0KLQkgIEJGRF9BU1NFUlQgKGgtPmxkaW5keCA+PSAwKTsKLQkgIEJGRF9BU1NFUlQgKExEU1lNU1ogPT0gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0pKTsKLQkgIHhjb2ZmX3N3YXBfbGRzeW1fb3V0IChmaW5mby0+b3V0cHV0X2JmZCwgbGRzeW0sCi0JCQkJZmluZm8tPmxkc3ltICsgaC0+bGRpbmR4IC0gMyk7Ci0JICBoLT5sZHN5bSA9IE5VTEw7Ci0KLQkgIC8qIEZpbGwgaW4gc25lbnRyeSBub3cgdGhhdCB3ZSBrbm93IHRoZSB0YXJnZXRfaW5kZXguICAqLwotCSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSAhPSAwCi0JICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkgICAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnNuZW50cnkgPQotCSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQl9Ci0KLSAgICAgICppbmRleHAgPSAtMTsKLQotICAgICAgc2tpcCA9IGZhbHNlOwotICAgICAgcmVxdWlyZSA9IGZhbHNlOwotICAgICAgYWRkID0gMSArIGlzeW0ubl9udW1hdXg7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBza2lwcGluZyB0aGlzIGNzZWN0LCB3ZSB3YW50IHRvIHNraXAgdGhpcyBzeW1ib2wuICAqLwotICAgICAgaWYgKCpjc2VjdHBwID09IE5VTEwpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIElmIHdlIGdhcmJhZ2UgY29sbGVjdGVkIHRoaXMgY3NlY3QsIHdlIHdhbnQgdG8gc2tpcCB0aGlzCi0gICAgICAgICBzeW1ib2wuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgeGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5nYwotCSAgJiYgKCgqY3NlY3RwcCktPmZsYWdzICYgU0VDX01BUkspID09IDAKLQkgICYmICpjc2VjdHBwICE9IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIEFuIFhDT0ZGIGxpbmtlciBhbHdheXMgc2tpcHMgQ19TVEFUIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgaXN5bXAtPm5fc2NsYXNzID09IENfU1RBVCkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogV2Ugc2tpcCBhbGwgYnV0IHRoZSBmaXJzdCBUT0MgYW5jaG9yLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVAotCSAgJiYgYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1RDMCkKLQl7Ci0JICBpZiAoZmluZm8tPnRvY19zeW1pbmR4ICE9IC0xKQotCSAgICBza2lwID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgdG9jdmFsLCB0b2NlbmQ7Ci0KLQkgICAgICB0b2N2YWwgPSAoKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIGlzeW0ubl92YWx1ZQotCQkJLSAoKmNzZWN0cHApLT52bWEpOwotCSAgICAgIC8qIFdlIHdhbnQgdG8gZmluZCBvdXQgaWYgdG9jdmFsIGlzIGEgZ29vZCB2YWx1ZSB0byB1c2UKLSAgICAgICAgICAgICAgICAgYXMgdGhlIFRPQyBhbmNob3ItLXRoYXQgaXMsIHdoZXRoZXIgd2UgY2FuIGFjY2VzcyBhbGwKLSAgICAgICAgICAgICAgICAgb2YgdGhlIFRPQyB1c2luZyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0b2N2YWwuICBUaGlzCi0gICAgICAgICAgICAgICAgIHRlc3QgYXNzdW1lcyB0aGF0IHRoZSBUT0MgY29tZXMgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgb3V0cHV0IHNlY3Rpb24sIGFzIGl0IGRvZXMgaW4gdGhlIGRlZmF1bHQgbGlua2VyCi0gICAgICAgICAgICAgICAgIHNjcmlwdC4gIEZJWE1FOiBUaGlzIGRvZXNuJ3QgaGFuZGxlIC50b2Nic3Mgc2VjdGlvbnMKLSAgICAgICAgICAgICAgICAgY3JlYXRlZCBmcm9tIFhNQ19URCBjb21tb24gc3ltYm9scyBjb3JyZWN0bHkuICAqLwotCi0JICAgICAgdG9jZW5kID0gKCgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLQkgICAgICBpZiAodG9jdmFsICsgMHgxMDAwMCA8IHRvY2VuZCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIlRPQyBvdmVyZmxvdzogMHglbHggPiAweDEwMDAwOyB0cnkgLW1taW5pbWFsLXRvYyB3aGVuIGNvbXBpbGluZyIpLAotCQkgICAgICh1bnNpZ25lZCBsb25nKSAodG9jZW5kIC0gdG9jdmFsKSk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAodG9jdmFsICsgMHg4MDAwIDwgdG9jZW5kKQotCQl7Ci0JCSAgYmZkX3ZtYSB0b2NhZGQ7Ci0KLQkJICB0b2NhZGQgPSB0b2NlbmQgLSAodG9jdmFsICsgMHg4MDAwKTsKLQkJICB0b2N2YWwgKz0gdG9jYWRkOwotCQkgIGlzeW0ubl92YWx1ZSArPSB0b2NhZGQ7Ci0JCX0KLQotCSAgICAgIGZpbmZvLT50b2Nfc3ltaW5keCA9IG91dHB1dF9pbmRleDsKLQkgICAgICB4Y29mZl9kYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPnRvYyA9IHRvY3ZhbDsKLQkgICAgICB4Y29mZl9kYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPnNudG9jID0KLQkJKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgICAgICByZXF1aXJlID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIHN0cmlwcGluZyBhbGwgc3ltYm9scywgd2Ugd2FudCB0byBza2lwIHRoaXMgb25lLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIFdlIGNhbiBza2lwIHJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgaXN5bS5uX3NjbGFzcyA9PSBDX0VYVAotCSAgJiYgc210eXAgPT0gWFRZX0VSCi0JICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBXZSBjYW4gc2tpcCBjb21tb24gc3ltYm9scyBpZiB0aGV5IGdvdCBkZWZpbmVkIHNvbWV3aGVyZQotICAgICAgICAgZWxzZS4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBpc3ltLm5fc2NsYXNzID09IENfRVhUCi0JICAmJiBzbXR5cCA9PSBYVFlfQ00KLQkgICYmICgoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgfHwgKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPnNlY3Rpb24gIT0gKmNzZWN0cHApCi0JICAmJiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uICE9ICpjc2VjdHBwKSkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogU2tpcCBsb2NhbCBzeW1ib2xzIGlmIHdlIGFyZSBkaXNjYXJkaW5nIHRoZW0uICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwKLQkgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19FWFQKLQkgICYmIChpc3ltLm5fc2NsYXNzICE9IENfSElERVhUCi0JICAgICAgfHwgc210eXAgIT0gWFRZX1NEKSkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogSWYgd2Ugc3RyaXBwaW5nIGRlYnVnZ2luZyBzeW1ib2xzLCBhbmQgdGhpcyBpcyBhIGRlYnVnZ2luZwotICAgICAgICAgc3ltYm9sLCB0aGVuIHNraXAgaXQuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2RlYnVnZ2VyCi0JICAmJiBpc3ltLm5fc2NudW0gPT0gTl9ERUJVRykKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogSWYgc29tZSBzeW1ib2xzIGFyZSBzdHJpcHBlZCBiYXNlZCBvbiB0aGUgbmFtZSwgd29yayBvdXQgdGhlCi0JIG5hbWUgYW5kIGRlY2lkZSB3aGV0aGVyIHRvIHNraXAgdGhpcyBzeW1ib2wuICBXZSBkb24ndCBoYW5kbGUKLQkgdGhpcyBjb3JyZWN0bHkgZm9yIHN5bWJvbHMgd2hvc2UgbmFtZXMgYXJlIGluIHRoZSAuZGVidWcKLQkgc2VjdGlvbjsgdG8gZ2V0IGl0IHJpZ2h0IHdlIHdvdWxkIG5lZWQgYSBuZXcgYmZkX3N0cnRhYl9oYXNoCi0JIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgc3RyaW5nIGdpdmVuIHRoZSBpbmRleC4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICB8fCBmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wpCi0JICAmJiAoZGVidWdfaW5kZXggPT0gTlVMTCB8fCAqZGVidWdfaW5kZXggPT0gKHVuc2lnbmVkIGxvbmcpIC0xKSkKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwgYnVmKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICAmJiAoYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBuYW1lLCBmYWxzZSwKLQkJCQkgICAgZmFsc2UpID09IE5VTEwpKQotCSAgICAgIHx8IChmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wKLQkJICAmJiAoaXN5bS5uX3NjbGFzcyAhPSBDX0VYVAotCQkgICAgICAmJiAoaXN5bS5uX3NjbGFzcyAhPSBDX0hJREVYVAotCQkJICB8fCBzbXR5cCAhPSBYVFlfU0QpKQotCQkgICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChpbnB1dF9iZmQsIG5hbWUpKSkKLQkgICAgc2tpcCA9IHRydWU7Ci0JfQotCi0gICAgICAvKiBXZSBjYW4gbm90IHNraXAgdGhlIGZpcnN0IFRPQyBhbmNob3IuICAqLwotICAgICAgaWYgKHNraXAKLQkgICYmIHJlcXVpcmUKLQkgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwpCi0Jc2tpcCA9IGZhbHNlOwotCi0gICAgICAvKiBXZSBub3cga25vdyB3aGV0aGVyIHdlIGFyZSB0byBza2lwIHRoaXMgc3ltYm9sIG9yIG5vdC4gICovCi0gICAgICBpZiAoISBza2lwKQotCXsKLQkgIC8qIEFkanVzdCB0aGUgc3ltYm9sIGluIG9yZGVyIHRvIG91dHB1dCBpdC4gICovCi0KLQkgIGlmIChpc3ltLl9uLl9uX24uX25femVyb2VzID09IDAKLQkgICAgICAmJiBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYSBsb25nIG5hbWUuICBFbnRlciBpdCBpbiB0aGUgc3RyaW5nCi0JCSB0YWJsZSB3ZSBhcmUgYnVpbGRpbmcuICBJZiAqZGVidWdfaW5kZXggIT0gLTEsIHRoZQotCQkgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGVudGVyZWQgaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoZGVidWdfaW5kZXggIT0gTlVMTCAmJiAqZGVidWdfaW5kZXggIT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotCQlpc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gKmRlYnVnX2luZGV4OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JCSAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwKLQkJCQkJCQkgKGNoYXIgKikgTlVMTCk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBuYW1lLCBoYXNoLCBjb3B5KTsKLQkJICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGlzeW0ubl9zY2xhc3MgIT0gQ19CU1RBVAotCSAgICAgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19FU1RBVAotCSAgICAgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19ERUNMCi0JICAgICAgJiYgaXN5bS5uX3NjbnVtID4gMCkKLQkgICAgewotCSAgICAgIGlzeW0ubl9zY251bSA9ICgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICAgICAgaXN5bS5uX3ZhbHVlICs9ICgoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICAgKyAoKmNzZWN0cHApLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICAgLSAoKmNzZWN0cHApLT52bWEpOwotCSAgICB9Ci0KLQkgIC8qIFRoZSB2YWx1ZSBvZiBhIENfRklMRSBzeW1ib2wgaXMgdGhlIHN5bWJvbCBpbmRleCBvZiB0aGUKLQkgICAgIG5leHQgQ19GSUxFIHN5bWJvbC4gIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgc3ltYm9sCi0JICAgICBpcyAtMS4gIFdlIHRyeSB0byBnZXQgdGhpcyByaWdodCwgYmVsb3csIGp1c3QgYmVmb3JlIHdlCi0JICAgICB3cml0ZSB0aGUgc3ltYm9scyBvdXQsIGJ1dCBpbiB0aGUgZ2VuZXJhbCBjYXNlIHdlIG1heQotCSAgICAgaGF2ZSB0byB3cml0ZSB0aGUgc3ltYm9sIG91dCB0d2ljZS4gICovCi0JICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JICAgIHsKLQkgICAgICBpZiAoZmluZm8tPmxhc3RfZmlsZV9pbmRleCAhPSAtMQotCQkgICYmIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSAhPSAobG9uZykgb3V0cHV0X2luZGV4KQotCQl7Ci0JCSAgLyogV2UgbXVzdCBjb3JyZWN0IHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgZW50cnkuICAqLwotCQkgIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSA9IG91dHB1dF9pbmRleDsKLQkJICBpZiAoKGJmZF9zaXplX3R5cGUpIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggPj0gc3ltZW50X2Jhc2UpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgaW4gdGhpcyBpbnB1dCBmaWxlLiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIChmaW5mby0+b3V0c3ltcwotCQkJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4Ci0JCQkJCQkJLSBzeW1lbnRfYmFzZSkKLQkJCQkJCSAgICAgICAqIG9zeW1lc3opKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgdGhlIGxhc3QgQ19GSUxFCi0JCQkgc3ltYm9sLiAgV2UgbmVlZCB0byB3cml0ZSBpdCBvdXQgYWdhaW4uICBXZQotCQkJIGJvcnJvdyAqb3V0c3ltIHRlbXBvcmFyaWx5LiAgKi8KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJCQkgICAgIChQVFIpIG91dHN5bSk7Ci0JCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCQkgICAgKG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkKLQkJCQkgICAgICsgZmluZm8tPmxhc3RfZmlsZV9pbmRleCAqIG9zeW1lc3opLAotCQkJCSAgICBTRUVLX1NFVCkgIT0gMAotCQkJICB8fCAoYmZkX3dyaXRlIChvdXRzeW0sIG9zeW1lc3osIDEsIG91dHB1dF9iZmQpCi0JCQkgICAgICAhPSBvc3ltZXN6KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA9IG91dHB1dF9pbmRleDsKLQkgICAgICBmaW5mby0+bGFzdF9maWxlID0gaXN5bTsKLQkgICAgfQotCi0JICAvKiBUaGUgdmFsdWUgb2YgYSBDX0JJTkNMIG9yIENfRUlOQ0wgc3ltYm9sIGlzIGEgZmlsZSBvZmZzZXQKLSAgICAgICAgICAgICBpbnRvIHRoZSBsaW5lIG51bWJlcnMuICBXZSB1cGRhdGUgdGhlIHN5bWJvbCB2YWx1ZXMgd2hlbgotICAgICAgICAgICAgIHdlIGhhbmRsZSB0aGUgbGluZSBudW1iZXJzLiAgKi8KLQkgIGlmIChpc3ltLm5fc2NsYXNzID09IENfQklOQ0wKLQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfRUlOQ0wpCi0JICAgIHsKLQkgICAgICBpc3ltLm5fdmFsdWUgPSBmaW5mby0+bGluZV9maWxlcG9zOwotCSAgICAgICsraW5jbHM7Ci0JICAgIH0KLQotCSAgLyogT3V0cHV0IHRoZSBzeW1ib2wuICAqLwotCi0JICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLCAoUFRSKSBvdXRzeW0pOwotCi0JICAqaW5kZXhwID0gb3V0cHV0X2luZGV4OwotCi0JICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkgICAgewotCSAgICAgIGxvbmcgaW5keDsKLQkgICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAgICAgaW5keCA9ICgoZXN5bSAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpKQotCQkgICAgICAvIGlzeW1lc3opOwotCSAgICAgIGggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKLQkgICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCSAgICAgIGgtPmluZHggPSBvdXRwdXRfaW5kZXg7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhpcyBpcyBhIHN5bWJvbCBpbiB0aGUgVE9DIHdoaWNoIHdlIG1heSBoYXZlIG1lcmdlZAotICAgICAgICAgICAgIChjbGFzcyBYTUNfVEMpLCByZW1lbWJlciB0aGUgc3ltYm9sIGluZGV4IG9mIHRoZSBUT0MKLSAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19ISURFWFQKLQkgICAgICAmJiBhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMKLQkgICAgICAmJiAqc3ltX2hhc2ggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKCgoKnN5bV9oYXNoKS0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSA9PSAwKTsKLQkgICAgICBCRkRfQVNTRVJUICgoKnN5bV9oYXNoKS0+dG9jX3NlY3Rpb24gIT0gTlVMTCk7Ci0JICAgICAgKCpzeW1faGFzaCktPnUudG9jX2luZHggPSBvdXRwdXRfaW5kZXg7Ci0JICAgIH0KLQotCSAgb3V0cHV0X2luZGV4ICs9IGFkZDsKLQkgIG91dHN5bSArPSBhZGQgKiBvc3ltZXN6OwotCX0KLQotICAgICAgZXN5bSArPSBhZGQgKiBpc3ltZXN6OwotICAgICAgaXN5bXAgKz0gYWRkOwotICAgICAgY3NlY3RwcCArPSBhZGQ7Ci0gICAgICBzeW1faGFzaCArPSBhZGQ7Ci0gICAgICBpZiAoZGVidWdfaW5kZXggIT0gTlVMTCkKLQlkZWJ1Z19pbmRleCArPSBhZGQ7Ci0gICAgICArK2luZGV4cDsKLSAgICAgIGZvciAoLS1hZGQ7IGFkZCA+IDA7IC0tYWRkKQotCSppbmRleHArKyA9IC0xOwotICAgIH0KLQotICAvKiBGaXggdXAgdGhlIGF1eCBlbnRyaWVzIGFuZCB0aGUgQ19CU1RBVCBzeW1ib2xzLiAgVGhpcyBtdXN0IGJlCi0gICAgIGRvbmUgaW4gYSBzZXBhcmF0ZSBwYXNzLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGNvcnJlY3Qgc3ltYm9sCi0gICAgIGluZGljZXMgdW50aWwgd2UgaGF2ZSBhbHJlYWR5IGRlY2lkZWQgd2hpY2ggc3ltYm9scyB3ZSBhcmUgZ29pbmcKLSAgICAgdG8ga2VlcC4gICovCi0KLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIGlzeW1lc3o7Ci0gIGlzeW1wID0gZmluZm8tPmludGVybmFsX3N5bXM7Ci0gIGluZGV4cCA9IGZpbmZvLT5zeW1faW5kaWNlczsKLSAgY3NlY3RwcCA9IHhjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNzZWN0czsKLSAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgaW50IGFkZDsKLQotICAgICAgYWRkID0gMSArIGlzeW1wLT5uX251bWF1eDsKLQotICAgICAgaWYgKCppbmRleHAgPCAwKQotCWVzeW0gKz0gYWRkICogaXN5bWVzejsKLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgaTsKLQotCSAgaWYgKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0JTVEFUKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQotCSAgICAgIC8qIFRoZSB2YWx1ZSBvZiBhIENfQlNUQVQgc3ltYm9sIGlzIHRoZSBzeW1ib2wgdGFibGUKLSAgICAgICAgICAgICAgICAgaW5kZXggb2YgdGhlIGNvbnRhaW5pbmcgY3NlY3QuICAqLwotCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChvdXRwdXRfYmZkLCAoUFRSKSBvdXRzeW0sIChQVFIpICZpc3ltKTsKLQkgICAgICBpbmR4ID0gaXN5bS5uX3ZhbHVlOwotCSAgICAgIGlmIChpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCXsKLQkJICBsb25nIHN5bWluZHg7Ci0KLQkJICBzeW1pbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkgIGlmIChzeW1pbmR4IDwgMCkKLQkJICAgIGlzeW0ubl92YWx1ZSA9IDA7Ci0JCSAgZWxzZQotCQkgICAgaXN5bS5uX3ZhbHVlID0gc3ltaW5keDsKLQkJICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLAotCQkJCQkgKFBUUikgb3V0c3ltKTsKLQkJfQotCSAgICB9Ci0KLQkgIGVzeW0gKz0gaXN5bWVzejsKLQkgIG91dHN5bSArPSBvc3ltZXN6OwotCi0JICBmb3IgKGkgPSAwOyBpIDwgaXN5bXAtPm5fbnVtYXV4ICYmIGVzeW0gPCBlc3ltX2VuZDsgaSsrKQotCSAgICB7Ci0JICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW0sIGlzeW1wLT5uX3R5cGUsCi0JCQkJICAgIGlzeW1wLT5uX3NjbGFzcywgaSwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCSAgICAoUFRSKSAmYXV4KTsKLQotCSAgICAgIGlmIChpc3ltcC0+bl9zY2xhc3MgPT0gQ19GSUxFKQotCQl7Ci0JCSAgLyogVGhpcyBpcyB0aGUgZmlsZSBuYW1lIChvciBzb21lIGNvbW1lbnQgcHV0IGluIGJ5Ci0JCSAgICAgdGhlIGNvbXBpbGVyKS4gIElmIGl0IGlzIGxvbmcsIHdlIG11c3QgcHV0IGl0IGluCi0JCSAgICAgdGhlIHN0cmluZyB0YWJsZS4gICovCi0JCSAgaWYgKGF1eC54X2ZpbGUueF9uLnhfemVyb2VzID09IDAKLQkJICAgICAgJiYgYXV4LnhfZmlsZS54X24ueF9vZmZzZXQgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0JCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCQkgICAgICBCRkRfQVNTRVJUIChhdXgueF9maWxlLnhfbi54X29mZnNldAotCQkJCSAgPj0gU1RSSU5HX1NJWkVfU0laRSk7Ci0JCSAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JCQl7Ci0JCQkgIHN0cmluZ3MgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGlucHV0X2JmZCk7Ci0JCQkgIGlmIChzdHJpbmdzID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBmaWxlbmFtZSA9IHN0cmluZ3MgKyBhdXgueF9maWxlLnhfbi54X29mZnNldDsKLQkJICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgZmlsZW5hbWUsCi0JCQkJCQkgaGFzaCwgY29weSk7Ci0JCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgYXV4LnhfZmlsZS54X24ueF9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKChpc3ltcC0+bl9zY2xhc3MgPT0gQ19FWFQKLQkJCXx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVCkKLQkJICAgICAgICYmIGkgKyAxID09IGlzeW1wLT5uX251bWF1eCkKLQkJewotCQkgIC8qIFdlIGRvbid0IHN1cHBvcnQgdHlwZSBjaGVja2luZy4gIEkgZG9uJ3Qga25vdyBpZgotICAgICAgICAgICAgICAgICAgICAgYW55Ym9keSBkb2VzLiAgKi8KLQkJICBhdXgueF9jc2VjdC54X3Bhcm1oYXNoID0gMDsKLQkJICAvKiBJIGRvbid0IHRoaW5rIGFueWJvZHkgdXNlcyB0aGVzZSBmaWVsZHMsIGJ1dCB3ZSdkCi0gICAgICAgICAgICAgICAgICAgICBiZXR0ZXIgY2xvYmJlciB0aGVtIGp1c3QgaW4gY2FzZS4gICovCi0JCSAgYXV4LnhfY3NlY3QueF9zdGFiID0gMDsKLQkJICBhdXgueF9jc2VjdC54X3Nuc3RhYiA9IDA7Ci0JCSAgaWYgKFNNVFlQX1NNVFlQIChhdXgueF9jc2VjdC54X3NtdHlwKSA9PSBYVFlfTEQpCi0JCSAgICB7Ci0JCSAgICAgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQotCQkgICAgICBpbmR4ID0gYXV4LnhfY3NlY3QueF9zY25sZW4ubDsKLQkJICAgICAgaWYgKGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCXsKLQkJCSAgbG9uZyBzeW1pbmR4OwotCi0JCQkgIHN5bWluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCQkgIGlmIChzeW1pbmR4IDwgMCkKLQkJCSAgICBhdXgueF9zeW0ueF90YWduZHgubCA9IDA7Ci0JCQkgIGVsc2UKLQkJCSAgICBhdXgueF9zeW0ueF90YWduZHgubCA9IHN5bWluZHg7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpc3ltcC0+bl9zY2xhc3MgIT0gQ19TVEFUIHx8IGlzeW1wLT5uX3R5cGUgIT0gVF9OVUxMKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCi0JCSAgaWYgKElTRkNOIChpc3ltcC0+bl90eXBlKQotCQkgICAgICB8fCBJU1RBRyAoaXN5bXAtPm5fc2NsYXNzKQotCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19CTE9DSwotCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19GQ04pCi0JCSAgICB7Ci0JCSAgICAgIGluZHggPSBhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubDsKLQkJICAgICAgaWYgKGluZHggPiAwCi0JCQkgICYmIGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCXsKLQkJCSAgLyogV2UgbG9vayBmb3J3YXJkIHRocm91Z2ggdGhlIHN5bWJvbCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHN5bWJvbCB3ZSBhcmUgZ29pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5jbHVkZS4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGlyZWx5IHJpZ2h0LiAgKi8KLQkJCSAgd2hpbGUgKGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XSA8IDAKLQkJCQkgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJICAgICsraW5keDsKLQkJCSAgaWYgKGluZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCQkgICAgaW5keCA9IG91dHB1dF9pbmRleDsKLQkJCSAgZWxzZQotCQkJICAgIGluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCQkgIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0gaW5keDsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGluZHggPSBhdXgueF9zeW0ueF90YWduZHgubDsKLQkJICBpZiAoaW5keCA+IDAgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkgICAgewotCQkgICAgICBsb25nIHN5bWluZHg7Ci0KLQkJICAgICAgc3ltaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJICAgICAgaWYgKHN5bWluZHggPCAwKQotCQkJYXV4Lnhfc3ltLnhfdGFnbmR4LmwgPSAwOwotCQkgICAgICBlbHNlCi0JCQlhdXgueF9zeW0ueF90YWduZHgubCA9IHN5bWluZHg7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIENvcHkgb3ZlciB0aGUgbGluZSBudW1iZXJzLCB1bmxlc3Mgd2UgYXJlIHN0cmlwcGluZwotCQkgdGhlbS4gIFdlIGRvIHRoaXMgb24gYSBzeW1ib2wgYnkgc3ltYm9sIGJhc2lzIGluCi0JCSBvcmRlciB0byBtb3JlIGVhc2lseSBoYW5kbGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLQkgICAgICBpZiAoKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0VYVAotCQkgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19ISURFWFQpCi0JCSAgJiYgaSA9PSAwCi0JCSAgJiYgaXN5bXAtPm5fbnVtYXV4ID4gMQotCQkgICYmIElTRkNOIChpc3ltcC0+bl90eXBlKQotCQkgICYmIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgIT0gMCkKLQkJewotCQkgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfbm9uZQotCQkgICAgICAmJiBmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfc29tZSkKLQkJICAgIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPSAwOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLQkJICAgICAgdW5zaWduZWQgaW50IGVuY19jb3VudDsKLQkJICAgICAgYmZkX3NpemVfdHlwZSBsaW5vZmY7Ci0JCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gbGluOwotCi0JCSAgICAgIG8gPSAqY3NlY3RwcDsKLQkJICAgICAgZW5jbG9zaW5nID0geGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+ZW5jbG9zaW5nOwotCQkgICAgICBlbmNfY291bnQgPSB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5saW5lbm9fY291bnQ7Ci0JCSAgICAgIGlmIChvbGluZSAhPSBlbmNsb3NpbmcpCi0JCQl7Ci0JCQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLAotCQkJCQllbmNsb3NpbmctPmxpbmVfZmlsZXBvcywKLQkJCQkJU0VFS19TRVQpICE9IDAKLQkJCSAgICAgIHx8IChiZmRfcmVhZCAoZmluZm8tPmxpbmVub3MsIGxpbmVzeiwKLQkJCQkJICAgIGVuY19jb3VudCwgaW5wdXRfYmZkKQotCQkJCSAgIT0gbGluZXN6ICogZW5jX2NvdW50KSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIG9saW5lID0gZW5jbG9zaW5nOwotCQkJfQotCi0JCSAgICAgIGxpbm9mZiA9IChhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyCi0JCQkJLSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcyk7Ci0KLQkJICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGlucHV0X2JmZCwKLQkJCQkJICAgICAgIChQVFIpIChmaW5mby0+bGluZW5vcyArIGxpbm9mZiksCi0JCQkJCSAgICAgICAoUFRSKSAmbGluKTsKLQkJICAgICAgaWYgKGxpbi5sX2xubm8gIT0gMAotCQkJICB8fCAoKGJmZF9zaXplX3R5cGUpIGxpbi5sX2FkZHIubF9zeW1uZHgKLQkJCSAgICAgICE9ICgoZXN5bQotCQkJCSAgIC0gaXN5bWVzegotCQkJCSAgIC0gKChiZmRfYnl0ZSAqKQotCQkJCSAgICAgIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkpKQotCQkJCSAgLyBpc3ltZXN6KSkpCi0JCQlhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gMDsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBiZmRfYnl0ZSAqbGlucGVuZCwgKmxpbnA7Ci0JCQkgIGJmZF92bWEgb2Zmc2V0OwotCQkJICBiZmRfc2l6ZV90eXBlIGNvdW50OwotCi0JCQkgIGxpbi5sX2FkZHIubF9zeW1uZHggPSAqaW5kZXhwOwotCQkJICBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKG91dHB1dF9iZmQsIChQVFIpICZsaW4sCi0JCQkJCQkgICAgKFBUUikgKGZpbmZvLT5saW5lbm9zCi0JCQkJCQkJICAgKyBsaW5vZmYpKTsKLQotCQkJICBsaW5wZW5kID0gKGZpbmZvLT5saW5lbm9zCi0JCQkJICAgICArIGVuY19jb3VudCAqIGxpbmVzeik7Ci0JCQkgIG9mZnNldCA9IChvLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICsgby0+b3V0cHV0X29mZnNldAotCQkJCSAgICAtIG8tPnZtYSk7Ci0JCQkgIGZvciAobGlucCA9IGZpbmZvLT5saW5lbm9zICsgbGlub2ZmICsgbGluZXN6OwotCQkJICAgICAgIGxpbnAgPCBsaW5wZW5kOwotCQkJICAgICAgIGxpbnAgKz0gbGluZXN6KQotCQkJICAgIHsKLQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChpbnB1dF9iZmQsIChQVFIpIGxpbnAsCi0JCQkJCQkgICAgICAgKFBUUikgJmxpbik7Ci0JCQkgICAgICBpZiAobGluLmxfbG5ubyA9PSAwKQotCQkJCWJyZWFrOwotCQkJICAgICAgbGluLmxfYWRkci5sX3BhZGRyICs9IG9mZnNldDsKLQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAob3V0cHV0X2JmZCwKLQkJCQkJCQkoUFRSKSAmbGluLAotCQkJCQkJCShQVFIpIGxpbnApOwotCQkJICAgIH0KLQotCQkJICBjb3VudCA9IChsaW5wIC0gKGZpbmZvLT5saW5lbm9zICsgbGlub2ZmKSkgLyBsaW5lc3o7Ci0KLQkJCSAgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9Ci0JCQkgICAgKG8tPm91dHB1dF9zZWN0aW9uLT5saW5lX2ZpbGVwb3MKLQkJCSAgICAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICogbGluZXN6KTsKLQotCQkJICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCQkJCWF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsCi0JCQkJCVNFRUtfU0VUKSAhPSAwCi0JCQkgICAgICB8fCAoYmZkX3dyaXRlIChmaW5mby0+bGluZW5vcyArIGxpbm9mZiwKLQkJCQkJICAgICBsaW5lc3osIGNvdW50LCBvdXRwdXRfYmZkKQotCQkJCSAgIT0gbGluZXN6ICogY291bnQpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkJICBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICs9IGNvdW50OwotCi0JCQkgIGlmIChpbmNscyA+IDApCi0JCQkgICAgewotCQkJICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaWlzcCwgKmlpc3BlbmQ7Ci0JCQkgICAgICBsb25nICppaW5kcDsKLQkJCSAgICAgIGJmZF9ieXRlICpvb3M7Ci0JCQkgICAgICBpbnQgaWlhZGQ7Ci0KLQkJCSAgICAgIC8qIFVwZGF0ZSBhbnkgQ19CSU5DTCBvciBDX0VJTkNMIHN5bWJvbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcmVmZXIgdG8gYSBsaW5lIG51bWJlciBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIHdlIGp1c3Qgb3V0cHV0LiAgKi8KLQkJCSAgICAgIGlpc3AgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLQkJCSAgICAgIGlpc3BlbmQgPSAoaWlzcAotCQkJCQkgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSk7Ci0JCQkgICAgICBpaW5kcCA9IGZpbmZvLT5zeW1faW5kaWNlczsKLQkJCSAgICAgIG9vcyA9IGZpbmZvLT5vdXRzeW1zOwotCQkJICAgICAgd2hpbGUgKGlpc3AgPCBpaXNwZW5kKQotCQkJCXsKLQkJCQkgIGlmICgqaWluZHAgPj0gMAotCQkJCSAgICAgICYmIChpaXNwLT5uX3NjbGFzcyA9PSBDX0JJTkNMCi0JCQkJCSAgfHwgaWlzcC0+bl9zY2xhc3MgPT0gQ19FSU5DTCkKLQkJCQkgICAgICAmJiAoKGJmZF9zaXplX3R5cGUpIGlpc3AtPm5fdmFsdWUKLQkJCQkJICA+PSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcyArIGxpbm9mZikKLQkJCQkgICAgICAmJiAoKGJmZF9zaXplX3R5cGUpIGlpc3AtPm5fdmFsdWUKLQkJCQkJICA8IChlbmNsb3NpbmctPmxpbmVfZmlsZXBvcwotCQkJCQkgICAgICsgZW5jX2NvdW50ICogbGluZXN6KSkpCi0JCQkJICAgIHsKLQkJCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlpczsKLQotCQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChvdXRwdXRfYmZkLAotCQkJCQkJCSAgICAoUFRSKSBvb3MsCi0JCQkJCQkJICAgIChQVFIpICZpaXMpOwotCQkJCSAgICAgIGlpcy5uX3ZhbHVlID0KLQkJCQkJKGlpc3AtPm5fdmFsdWUKLQkJCQkJIC0gZW5jbG9zaW5nLT5saW5lX2ZpbGVwb3MKLQkJCQkJIC0gbGlub2ZmCi0JCQkJCSArIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpOwotCQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwKLQkJCQkJCQkgICAgIChQVFIpICZpaXMsCi0JCQkJCQkJICAgICAoUFRSKSBvb3MpOwotCQkJCSAgICAgIC0taW5jbHM7Ci0JCQkJICAgIH0KLQotCQkJCSAgaWlhZGQgPSAxICsgaWlzcC0+bl9udW1hdXg7Ci0JCQkJICBpZiAoKmlpbmRwID49IDApCi0JCQkJICAgIG9vcyArPSBpaWFkZCAqIG9zeW1lc3o7Ci0JCQkJICBpaXNwICs9IGlpYWRkOwotCQkJCSAgaWluZHAgKz0gaWlhZGQ7Ci0JCQkJfQotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmYXV4LCBpc3ltcC0+bl90eXBlLAotCQkJCSAgICAgaXN5bXAtPm5fc2NsYXNzLCBpLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJICAgICAoUFRSKSBvdXRzeW0pOwotCSAgICAgIG91dHN5bSArPSBvc3ltZXN6OwotCSAgICAgIGVzeW0gKz0gaXN5bWVzejsKLQkgICAgfQotCX0KLQotICAgICAgaW5kZXhwICs9IGFkZDsKLSAgICAgIGlzeW1wICs9IGFkZDsKLSAgICAgIGNzZWN0cHAgKz0gYWRkOwotICAgIH0KLQotICAvKiBJZiB3ZSBzd2FwcGVkIG91dCBhIENfRklMRSBzeW1ib2wsIGd1ZXNzIHRoYXQgdGhlIG5leHQgQ19GSUxFCi0gICAgIHN5bWJvbCB3aWxsIGJlIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIG5leHQgaW5wdXQgZmlsZS4gIEluIHRoZQotICAgICBub3JtYWwgY2FzZSwgdGhpcyB3aWxsIHNhdmUgdXMgZnJvbSB3cml0aW5nIG91dCB0aGUgQ19GSUxFIHN5bWJvbAotICAgICBhZ2Fpbi4gICovCi0gIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCi0gICAgICAmJiAoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA+PSBzeW1lbnRfYmFzZSkKLSAgICB7Ci0gICAgICBmaW5mby0+bGFzdF9maWxlLm5fdmFsdWUgPSBvdXRwdXRfaW5kZXg7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJICAgICAoUFRSKSAoZmluZm8tPm91dHN5bXMKLSAJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4IC0gc3ltZW50X2Jhc2UpCi0gCQkJCSAgICAgICAqIG9zeW1lc3opKSk7Ci0gICAgfQotCi0gIC8qIFdyaXRlIHRoZSBtb2RpZmllZCBzeW1ib2xzIHRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChvdXRzeW0gPiBmaW5mby0+b3V0c3ltcykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCSAgICBvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpICsgc3ltZW50X2Jhc2UgKiBvc3ltZXN6LAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBvdXRzeW0gLSBmaW5mby0+b3V0c3ltcywgMSwKLQkJCW91dHB1dF9iZmQpCi0JICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgQkZEX0FTU0VSVCAoKG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKQotCQkgICArIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykgLyBvc3ltZXN6KQotCQkgID09IG91dHB1dF9pbmRleCk7Ci0KLSAgICAgIG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKSA9IG91dHB1dF9pbmRleDsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgbGV0IHRoZSBsaW5rZXIgcmVsb2NhdGlvbiByb3V0aW5lcyBkaXNjYXJkIHRoZSBzeW1ib2xzLiAgKi8KLSAga2VlcF9zeW1zID0gb2JqX2NvZmZfa2VlcF9zeW1zIChpbnB1dF9iZmQpOwotICBvYmpfY29mZl9rZWVwX3N5bXMgKGlucHV0X2JmZCkgPSB0cnVlOwotCi0gIC8qIFJlbG9jYXRlIHRoZSBjb250ZW50cyBvZiBlYWNoIHNlY3Rpb24uICAqLwotICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50czsKLQotICAgICAgaWYgKCEgby0+bGlua2VyX21hcmspCi0JewotCSAgLyogVGhpcyBzZWN0aW9uIHdhcyBvbWl0dGVkIGZyb20gdGhlIGxpbmsuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgfHwgby0+X3Jhd19zaXplID09IDAKLQkgIHx8IChvLT5mbGFncyAmIFNFQ19JTl9NRU1PUlkpICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGhhdmUgc2V0IGZpbGVwb3MgY29ycmVjdGx5IGZvciB0aGUgc2VjdGlvbnMgd2UgY3JlYXRlZCB0bwotICAgICAgICAgcmVwcmVzZW50IGNzZWN0cywgc28gYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIHNob3VsZCB3b3JrLiAgKi8KLSAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBvKSAhPSBOVUxMCi0JICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBvKS0+Y29udGVudHMgIT0gTlVMTCkKLQljb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIG8pLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgbywgZmluZm8tPmNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwgby0+X3Jhd19zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgY29udGVudHMgPSBmaW5mby0+Y29udGVudHM7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIGludCB0YXJnZXRfaW5kZXg7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLQkgIGJmZF92bWEgb2Zmc2V0OwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOwotCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOwotCSAgbG9uZyByX3N5bW5keDsKLQotCSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzLiAgKi8KLQkgIHRhcmdldF9pbmRleCA9IG8tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICBpbnRlcm5hbF9yZWxvY3MgPSAoeGNvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLQkJCSAgICAgKGlucHV0X2JmZCwgbywgZmFsc2UsIGZpbmZvLT5leHRlcm5hbF9yZWxvY3MsCi0JCQkgICAgICB0cnVlLAotCQkJICAgICAgKGZpbmZvLT5zZWN0aW9uX2luZm9bdGFyZ2V0X2luZGV4XS5yZWxvY3MKLQkJCSAgICAgICArIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCkpKTsKLQkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBDYWxsIHByb2Nlc3NvciBzcGVjaWZpYyBjb2RlIHRvIHJlbG9jYXRlIHRoZSBzZWN0aW9uCi0gICAgICAgICAgICAgY29udGVudHMuICAqLwotCSAgaWYgKCEgYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJCSAgIGlucHV0X2JmZCwgbywKLQkJCQkJICAgY29udGVudHMsCi0JCQkJCSAgIGludGVybmFsX3JlbG9jcywKLQkJCQkJICAgZmluZm8tPmludGVybmFsX3N5bXMsCi0JCQkJCSAgIHhjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNzZWN0cykpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgb2Zmc2V0ID0gby0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIG8tPm91dHB1dF9vZmZzZXQgLSBvLT52bWE7Ci0JICBpcmVsID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgaXJlbGVuZCA9IGlyZWwgKyBvLT5yZWxvY19jb3VudDsKLQkgIHJlbF9oYXNoID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bdGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzCi0JCSAgICAgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQkgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrKQotCSAgICB7Ci0JICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0JICAgICAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOwotCSAgICAgIGJvb2xlYW4gcXVpZXQ7Ci0KLQkgICAgICAqcmVsX2hhc2ggPSBOVUxMOwotCi0JICAgICAgLyogQWRqdXN0IHRoZSByZWxvYyBhZGRyZXNzIGFuZCBzeW1ib2wgaW5kZXguICAqLwotCi0JICAgICAgaXJlbC0+cl92YWRkciArPSBvZmZzZXQ7Ci0KLQkgICAgICByX3N5bW5keCA9IGlyZWwtPnJfc3ltbmR4OwotCi0JICAgICAgaWYgKHJfc3ltbmR4ID09IC0xKQotCQloID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCWggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtyX3N5bW5keF07Ci0KLQkgICAgICBpZiAocl9zeW1uZHggIT0gLTEgJiYgZmluZm8tPmluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKLQkJewotCQkgIGlmIChoICE9IE5VTEwKLQkJICAgICAgJiYgaC0+c21jbGFzICE9IFhNQ19URAotCQkgICAgICAmJiAoaXJlbC0+cl90eXBlID09IFJfVE9DCi0JCQkgIHx8IGlyZWwtPnJfdHlwZSA9PSBSX0dMCi0JCQkgIHx8IGlyZWwtPnJfdHlwZSA9PSBSX1RDTAotCQkJICB8fCBpcmVsLT5yX3R5cGUgPT0gUl9UUkwKLQkJCSAgfHwgaXJlbC0+cl90eXBlID09IFJfVFJMQSkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSBUT0MgcmVsYXRpdmUgcmVsb2Mgd2l0aCBhIHN5bWJvbAotICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkLiAgVGhlIHN5bWJvbCBzaG91bGQgYmUgdGhlIG9uZSB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmVsb2MgaXMgZm9yLiAgV2Ugd2FudCB0byBtYWtlIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWxvYyBhZ2FpbnN0IHRoZSBUT0MgYWRkcmVzcyBvZiB0aGUgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCB0aGUgc3ltYm9sIGl0c2VsZi4gICovCi0JCSAgICAgIEJGRF9BU1NFUlQgKGgtPnRvY19zZWN0aW9uICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUICgoaC0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSA9PSAwKTsKLQkJICAgICAgaWYgKGgtPnUudG9jX2luZHggIT0gLTEpCi0JCQlpcmVsLT5yX3N5bW5keCA9IGgtPnUudG9jX2luZHg7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCAqbjsKLQkJCSAgc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzaTsKLQotCQkJICBuID0gKChzdHJ1Y3QgeGNvZmZfdG9jX3JlbF9oYXNoICopCi0JCQkgICAgICAgYmZkX2FsbG9jIChmaW5mby0+b3V0cHV0X2JmZCwKLQkJCQkJICBzaXplb2YgKHN0cnVjdCB4Y29mZl90b2NfcmVsX2hhc2gpKSk7Ci0JCQkgIGlmIChuID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICBzaSA9IGZpbmZvLT5zZWN0aW9uX2luZm8gKyB0YXJnZXRfaW5kZXg7Ci0JCQkgIG4tPm5leHQgPSBzaS0+dG9jX3JlbF9oYXNoZXM7Ci0JCQkgIG4tPmggPSBoOwotCQkJICBuLT5yZWwgPSBpcmVsOwotCQkJICBzaS0+dG9jX3JlbF9oYXNoZXMgPSBuOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBzeW1ib2wuICAqLwotCQkgICAgICBpZiAoaC0+aW5keCA+PSAwKQotCQkJaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGJlaW5nIHdyaXR0ZW4gYXQgdGhlIGVuZAotCQkJICAgICBvZiB0aGUgZmlsZSwgYW5kIHdlIGRvIG5vdCB5ZXQga25vdyB0aGUKLQkJCSAgICAgc3ltYm9sIGluZGV4LiAgV2Ugc2F2ZSB0aGUgcG9pbnRlciB0byB0aGUKLQkJCSAgICAgaGFzaCB0YWJsZSBlbnRyeSBpbiB0aGUgcmVsX2hhc2ggbGlzdC4KLQkJCSAgICAgV2Ugc2V0IHRoZSBpbmR4IGZpZWxkIHRvIC0yIHRvIGluZGljYXRlCi0JCQkgICAgIHRoYXQgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgc3RyaXBwZWQuICAqLwotCQkJICAqcmVsX2hhc2ggPSBoOwotCQkJICBoLT5pbmR4ID0gLTI7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb25nIGluZHg7Ci0KLQkJICAgICAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tyX3N5bW5keF07Ci0KLQkJICAgICAgaWYgKGluZHggPT0gLTEpCi0JCQl7Ci0JCQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzOwotCi0JCQkgIC8qIFJlbG9jYXRpb25zIGFnYWluc3QgYSBUQzAgVE9DIGFuY2hvciBhcmUKLQkJCSAgICAgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCB0byBiZSBhZ2FpbnN0Ci0JCQkgICAgIHRoZSBUT0MgYW5jaG9yIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JCQkgIGlzID0gZmluZm8tPmludGVybmFsX3N5bXMgKyByX3N5bW5keDsKLQkJCSAgaWYgKGlzLT5uX3NjbGFzcyA9PSBDX0hJREVYVAotCQkJICAgICAgJiYgaXMtPm5fbnVtYXV4ID4gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBQVFIgYXV4cHRyOwotCQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQotCQkJICAgICAgYXV4cHRyID0gKChQVFIpCi0JCQkJCSgoKGJmZF9ieXRlICopCi0JCQkJCSAgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkKLQkJCQkJICsgKChyX3N5bW5keCArIGlzLT5uX251bWF1eCkKLQkJCQkJICAgICogaXN5bWVzeikpKTsKLQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIGF1eHB0ciwKLQkJCQkJCSAgICBpcy0+bl90eXBlLCBpcy0+bl9zY2xhc3MsCi0JCQkJCQkgICAgaXMtPm5fbnVtYXV4IC0gMSwKLQkJCQkJCSAgICBpcy0+bl9udW1hdXgsCi0JCQkJCQkgICAgKFBUUikgJmF1eCk7Ci0JCQkgICAgICBpZiAoU01UWVBfU01UWVAgKGF1eC54X2NzZWN0Lnhfc210eXApID09IFhUWV9TRAotCQkJCSAgJiYgYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1RDMCkKLQkJCQlpbmR4ID0gZmluZm8tPnRvY19zeW1pbmR4OwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBpZiAoaW5keCAhPSAtMSkKLQkJCWlyZWwtPnJfc3ltbmR4ID0gaW5keDsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppczsKLQkJCSAgY29uc3QgY2hhciAqbmFtZTsKLQkJCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCQkJICAvKiBUaGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgd2UgYXJlCi0JCQkgICAgIHN0cmlwcGluZy4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGhhbmRsZQotCQkJICAgICB0aGlzIGNhc2UsIGJ1dCBJIGRvbid0IHRoaW5rIGl0J3Mgd29ydGggaXQuICAqLwotCQkJICBpcyA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zICsgcl9zeW1uZHg7Ci0KLQkJCSAgbmFtZSA9IChfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUKLQkJCQkgIChpbnB1dF9iZmQsIGlzLCBidWYpKTsKLQkJCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCQkgKGZpbmZvLT5pbmZvLCBuYW1lLCBpbnB1dF9iZmQsIG8sCi0JCQkJICBpcmVsLT5yX3ZhZGRyKSkpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBxdWlldCA9IGZhbHNlOwotCSAgICAgIHN3aXRjaCAoaXJlbC0+cl90eXBlKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCSAgaWYgKGggPT0gTlVMTAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCQkgICAgYnJlYWs7Ci0JCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkJY2FzZSBSX1BPUzoKLQkJY2FzZSBSX05FRzoKLQkJY2FzZSBSX1JMOgotCQljYXNlIFJfUkxBOgotCQkgIC8qIFRoaXMgcmVsb2MgbmVlZHMgdG8gYmUgY29waWVkIGludG8gdGhlIC5sb2FkZXIKLQkJICAgICBzZWN0aW9uLiAgKi8KLQkJICBsZHJlbC5sX3ZhZGRyID0gaXJlbC0+cl92YWRkcjsKLQkJICBpZiAocl9zeW1uZHggPT0gLTEpCi0JCSAgICBsZHJlbC5sX3N5bW5keCA9IC0xOwotCQkgIGVsc2UgaWYgKGggPT0gTlVMTAotCQkJICAgfHwgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCQkgICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSkKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc2VjID0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3NlY3RzW3Jfc3ltbmR4XTsKLQkJICAgICAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCQkJc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQkJICAgICAgZWxzZQotCQkJc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgICBzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCi0JCSAgICAgIGlmIChzdHJjbXAgKHNlYy0+bmFtZSwgIi50ZXh0IikgPT0gMCkKLQkJCWxkcmVsLmxfc3ltbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc3RyY21wIChzZWMtPm5hbWUsICIuZGF0YSIpID09IDApCi0JCQlsZHJlbC5sX3N5bW5keCA9IDE7Ci0JCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLmJzcyIpID09IDApCi0JCQlsZHJlbC5sX3N5bW5keCA9IDI7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgICAgKF8oIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJICAgICBzZWMtPm5hbWUpOwotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZQotCQkJICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMAotCQkJICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpID09IDApCi0JCQl7Ci0JCQkgIC8qIFdlIGFscmVhZHkgY2FsbGVkIHRoZSB1bmRlZmluZWRfc3ltYm9sCi0JCQkgICAgIGNhbGxiYWNrIGZvciB0aGlzIHJlbG9jYXRpb24sIGluCi0JCQkgICAgIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24uICBEb24ndAotCQkJICAgICBpc3N1ZSBhbnkgbW9yZSB3YXJuaW5ncy4gICovCi0JCQkgIHF1aWV0ID0gdHJ1ZTsKLQkJCX0KLQkJICAgICAgaWYgKGgtPmxkaW5keCA8IDAgJiYgISBxdWlldCkKLQkJCXsKLQkJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgICAgKF8oIiVzOiBgJXMnIGluIGxvYWRlciByZWxvYyBidXQgbm90IGxvYWRlciBzeW0iKSwKLQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSAgICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGxkcmVsLmxfc3ltbmR4ID0gaC0+bGRpbmR4OwotCQkgICAgfQotCQkgIGxkcmVsLmxfcnR5cGUgPSAoaXJlbC0+cl9zaXplIDw8IDgpIHwgaXJlbC0+cl90eXBlOwotCQkgIGxkcmVsLmxfcnNlY25tID0gby0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkJICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT50ZXh0cm8KLQkJICAgICAgJiYgc3RyY21wIChvLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi50ZXh0IikgPT0gMAotCQkgICAgICAmJiAhIHF1aWV0KQotCQkgICAgewotCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCIlczogbG9hZGVyIHJlbG9jIGluIHJlYWQtb25seSBzZWN0aW9uICVzIiksCi0JCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZmluZm8tPm91dHB1dF9iZmQsCi0JCQkJCSAgICAgICBvLT5vdXRwdXRfc2VjdGlvbikpOwotCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCSAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwKLQkJCQkJZmluZm8tPmxkcmVsKTsKLQkJICBCRkRfQVNTRVJUIChzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9sZHJlbCkgPT0gTERSRUxTWik7Ci0JCSAgKytmaW5mby0+bGRyZWw7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX1RPQzoKLQkJY2FzZSBSX0dMOgotCQljYXNlIFJfVENMOgotCQljYXNlIFJfVFJMOgotCQljYXNlIFJfVFJMQToKLQkJICAvKiBXZSBzaG91bGQgbmV2ZXIgbmVlZCBhIC5sb2FkZXIgcmVsb2MgZm9yIGEgVE9DCi0JCSAgICAgcmVsYXRpdmUgcmVsb2MuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICs9IG8tPnJlbG9jX2NvdW50OwotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBtb2RpZmllZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgby0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJICAgICAgY29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCi0JCQkJICAgICAgKG8tPl9jb29rZWRfc2l6ZSAhPSAwCi0JCQkJICAgICAgID8gby0+X2Nvb2tlZF9zaXplCi0JCQkJICAgICAgIDogby0+X3Jhd19zaXplKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBvYmpfY29mZl9rZWVwX3N5bXMgKGlucHV0X2JmZCkgPSBrZWVwX3N5bXM7Ci0KLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI3VuZGVmIE5fVE1BU0sKLSN1bmRlZiBOX0JUU0hGVAotCi0vKiBXcml0ZSBvdXQgYSBub24tWENPRkYgZ2xvYmFsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sIChoLCBwKQotICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm8gPSAoc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSBwOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGJmZF9ieXRlICpvdXRzeW07Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIG91dHN5bSA9IGZpbmZvLT5vdXRzeW1zOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIHdhcyBnYXJiYWdlIGNvbGxlY3RlZCwganVzdCBza2lwIGl0LiAgKi8KLSAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+Z2MKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgd2UgbmVlZCBhIC5sb2FkZXIgc2VjdGlvbiBlbnRyeSwgd3JpdGUgaXQgb3V0LiAgKi8KLSAgaWYgKGgtPmxkc3ltICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltICpsZHN5bTsKLSAgICAgIGJmZCAqaW1wYmZkOwotCi0gICAgICBsZHN5bSA9IGgtPmxkc3ltOwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JewotCSAgbGRzeW0tPmxfdmFsdWUgPSAwOwotCSAgbGRzeW0tPmxfc2NudW0gPSBOX1VOREVGOwotCSAgbGRzeW0tPmxfc210eXBlID0gWFRZX0VSOwotCSAgaW1wYmZkID0gaC0+cm9vdC51LnVuZGVmLmFiZmQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIGxkc3ltLT5sX3ZhbHVlID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgKyBoLT5yb290LnUuZGVmLnZhbHVlKTsKLQkgIGxkc3ltLT5sX3NjbnVtID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgbGRzeW0tPmxfc210eXBlID0gWFRZX1NEOwotCSAgaW1wYmZkID0gc2VjLT5vd25lcjsKLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmICgoKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKLQkgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgIT0gMCkKLQkgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgIT0gMCkKLQlsZHN5bS0+bF9zbXR5cGUgfD0gTF9JTVBPUlQ7Ci0gICAgICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSAhPSAwCi0JICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDApCi0JICB8fCAoaC0+ZmxhZ3MgJiBYQ09GRl9FWFBPUlQpICE9IDApCi0JbGRzeW0tPmxfc210eXBlIHw9IExfRVhQT1JUOwotICAgICAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSAhPSAwKQotCWxkc3ltLT5sX3NtdHlwZSB8PSBMX0VOVFJZOwotCi0gICAgICBsZHN5bS0+bF9zbWNsYXMgPSBoLT5zbWNsYXM7Ci0KLSAgICAgIGlmIChsZHN5bS0+bF9pZmlsZSA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JbGRzeW0tPmxfaWZpbGUgPSAwOwotICAgICAgZWxzZSBpZiAobGRzeW0tPmxfaWZpbGUgPT0gMCkKLQl7Ci0JICBpZiAoKGxkc3ltLT5sX3NtdHlwZSAmIExfSU1QT1JUKSA9PSAwKQotCSAgICBsZHN5bS0+bF9pZmlsZSA9IDA7Ci0JICBlbHNlIGlmIChpbXBiZmQgPT0gTlVMTCkKLQkgICAgbGRzeW0tPmxfaWZpbGUgPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAoaW1wYmZkLT54dmVjID09IG91dHB1dF9iZmQtPnh2ZWMpOwotCSAgICAgIGxkc3ltLT5sX2lmaWxlID0geGNvZmZfZGF0YSAoaW1wYmZkKS0+aW1wb3J0X2ZpbGVfaWQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGxkc3ltLT5sX3Bhcm0gPSAwOwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5sZGluZHggPj0gMCk7Ci0gICAgICBCRkRfQVNTRVJUIChMRFNZTVNaID09IHNpemVvZiAoc3RydWN0IGV4dGVybmFsX2xkc3ltKSk7Ci0gICAgICB4Y29mZl9zd2FwX2xkc3ltX291dCAob3V0cHV0X2JmZCwgbGRzeW0sIGZpbmZvLT5sZHN5bSArIGgtPmxkaW5keCAtIDMpOwotICAgICAgaC0+bGRzeW0gPSBOVUxMOwotICAgIH0KLQotICAvKiBJZiB0aGlzIHN5bWJvbCBuZWVkcyBnbG9iYWwgbGlua2FnZSBjb2RlLCB3cml0ZSBpdCBvdXQuICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbgotCSAgPT0geGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5saW5rYWdlX3NlY3Rpb24pKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYmZkX3ZtYSB0b2NvZmY7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgcCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+Y29udGVudHMgKyBoLT5yb290LnUuZGVmLnZhbHVlOwotCi0gICAgICAvKiBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIGdsb2JhbCBsaW5rYWdlIGNvZGUgbG9hZHMgYQotICAgICAgICAgc3BlY2lmaWMgVE9DIGVsZW1lbnQuICAqLwotICAgICAgdG9jb2ZmID0gKGgtPmRlc2NyaXB0b3ItPnRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaC0+ZGVzY3JpcHRvci0+dG9jX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJLSB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jKTsKLSAgICAgIGlmICgoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSAhPSAwKQotCXRvY29mZiArPSBoLT5kZXNjcmlwdG9yLT51LnRvY19vZmZzZXQ7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBYQ09GRl9HTElOS19GSVJTVCB8ICh0b2NvZmYgJiAweGZmZmYpLCBwKTsKLSAgICAgIGZvciAoaSA9IDAsIHAgKz0gNDsKLQkgICBpIDwgc2l6ZW9mIHhjb2ZmX2dsaW5rX2NvZGUgLyBzaXplb2YgeGNvZmZfZ2xpbmtfY29kZVswXTsKLQkgICBpKyssIHAgKz0gNCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB4Y29mZl9nbGlua19jb2RlW2ldLCBwKTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgY3JlYXRlZCBhIFRPQyBlbnRyeSBmb3IgdGhpcyBzeW1ib2wsIHdyaXRlIG91dCB0aGUgcmVxdWlyZWQKLSAgICAgcmVsb2NzLiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX1NFVF9UT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnRvY3NlYzsKLSAgICAgIGFzZWN0aW9uICpvc2VjOwotICAgICAgaW50IG9pbmR4OwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICAgICAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpcnN5bTsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBpcmF1eDsKLQotICAgICAgdG9jc2VjID0gaC0+dG9jX3NlY3Rpb247Ci0gICAgICBvc2VjID0gdG9jc2VjLT5vdXRwdXRfc2VjdGlvbjsKLSAgICAgIG9pbmR4ID0gb3NlYy0+dGFyZ2V0X2luZGV4OwotICAgICAgaXJlbCA9IGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbG9jcyArIG9zZWMtPnJlbG9jX2NvdW50OwotICAgICAgaXJlbC0+cl92YWRkciA9IChvc2VjLT52bWEKLQkJICAgICAgICsgdG9jc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGgtPnUudG9jX29mZnNldCk7Ci0gICAgICBpZiAoaC0+aW5keCA+PSAwKQotCWlyZWwtPnJfc3ltbmR4ID0gaC0+aW5keDsKLSAgICAgIGVsc2UKLQl7Ci0JICBoLT5pbmR4ID0gLTI7Ci0JICBpcmVsLT5yX3N5bW5keCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQl9Ci0gICAgICBpcmVsLT5yX3R5cGUgPSBSX1BPUzsKLSAgICAgIGlyZWwtPnJfc2l6ZSA9IDMxOwotICAgICAgZmluZm8tPnNlY3Rpb25faW5mb1tvaW5keF0ucmVsX2hhc2hlc1tvc2VjLT5yZWxvY19jb3VudF0gPSBOVUxMOwotICAgICAgKytvc2VjLT5yZWxvY19jb3VudDsKLQotICAgICAgQkZEX0FTU0VSVCAoaC0+bGRpbmR4ID49IDApOwotICAgICAgbGRyZWwubF92YWRkciA9IGlyZWwtPnJfdmFkZHI7Ci0gICAgICBsZHJlbC5sX3N5bW5keCA9IGgtPmxkaW5keDsKLSAgICAgIGxkcmVsLmxfcnR5cGUgPSAoMzEgPDwgOCkgfCBSX1BPUzsKLSAgICAgIGxkcmVsLmxfcnNlY25tID0gb2luZHg7Ci0gICAgICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLCBmaW5mby0+bGRyZWwpOwotICAgICAgKytmaW5mby0+bGRyZWw7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gZW1pdCBhIHN5bWJvbCB0byBkZWZpbmUgYSBjc2VjdCB3aGljaCBob2xkcyB0aGUKLSAgICAgICAgIHJlbG9jLiAgKi8KLSAgICAgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQotCXsKLQkgIGlmIChzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpIDw9IFNZTU5NTEVOKQotCSAgICBzdHJuY3B5IChpcnN5bS5fbi5fbl9uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBTWU1OTUxFTik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBib29sZWFuIGhhc2g7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICAgICAgaGFzaCA9IHRydWU7Ci0JICAgICAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0JCWhhc2ggPSBmYWxzZTsKLQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkgaGFzaCwgZmFsc2UpOwotCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlyc3ltLl9uLl9uX24uX25femVyb2VzID0gMDsKLQkgICAgICBpcnN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotCSAgICB9Ci0KLQkgIGlyc3ltLm5fdmFsdWUgPSBpcmVsLT5yX3ZhZGRyOwotCSAgaXJzeW0ubl9zY251bSA9IG9zZWMtPnRhcmdldF9pbmRleDsKLQkgIGlyc3ltLm5fc2NsYXNzID0gQ19ISURFWFQ7Ci0JICBpcnN5bS5uX3R5cGUgPSBUX05VTEw7Ci0JICBpcnN5bS5uX251bWF1eCA9IDE7Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlyc3ltLCAoUFRSKSBvdXRzeW0pOwotCSAgb3V0c3ltICs9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLQkgIG1lbXNldCAoJmlyYXV4LCAwLCBzaXplb2YgaXJhdXgpOwotCSAgaXJhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX1NEOwotCSAgaXJhdXgueF9jc2VjdC54X3Njbmxlbi5sID0gNDsKLQkgIGlyYXV4LnhfY3NlY3QueF9zbWNsYXMgPSBYTUNfVEM7Ci0KLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlyYXV4LCBUX05VTEwsIENfSElERVhULAotCQkJCSAwLCAxLCAoUFRSKSBvdXRzeW0pOwotCSAgb3V0c3ltICs9IGJmZF9jb2ZmX2F1eGVzeiAob3V0cHV0X2JmZCk7Ci0KLQkgIGlmIChoLT5pbmR4ID49IDApCi0JICAgIHsKLQkgICAgICAvKiBXZSBhcmVuJ3QgZ29pbmcgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzIGJlbG93LCBzbyB3ZQotCQkgbmVlZCB0byB3cml0ZSB0aGVtIG91dCBub3cuICAqLwotCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCSAgICAob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQotCQkJICAgICArIChvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkKLQkJCQkqIGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCkpKSwKLQkJCSAgICBTRUVLX1NFVCkgIT0gMAotCQkgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBvdXRzeW0gLSBmaW5mby0+b3V0c3ltcywgMSwKLQkJCQkgb3V0cHV0X2JmZCkKLQkJICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpICs9Ci0JCShvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykgLyBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpOwotCi0JICAgICAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGEgc3BlY2lhbGx5IGRlZmluZWQgZnVuY3Rpb24gZGVzY3JpcHRvciwgd3JpdGUKLSAgICAgaXQgb3V0LiAgVGhlIGZpcnN0IHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGNvZGUKLSAgICAgaXRzZWxmLCB0aGUgc2Vjb25kIHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFRPQywgYW5kIHRoZSB0aGlyZAotICAgICB3b3JkIGlzIHplcm8uICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgIT0gMAotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbgotCSAgPT0geGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5kZXNjcmlwdG9yX3NlY3Rpb24pKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBhc2VjdGlvbiAqb3NlYzsKLSAgICAgIGludCBvaW5keDsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGVudHJ5OwotICAgICAgYXNlY3Rpb24gKmVzZWM7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgbGRyZWw7Ci0gICAgICBhc2VjdGlvbiAqdHNlYzsKLQotICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gICAgICBvaW5keCA9IG9zZWMtPnRhcmdldF9pbmRleDsKLSAgICAgIHAgPSBzZWMtPmNvbnRlbnRzICsgaC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICAgICAgaGVudHJ5ID0gaC0+ZGVzY3JpcHRvcjsKLSAgICAgIEJGRF9BU1NFUlQgKGhlbnRyeSAhPSBOVUxMCi0JCSAgJiYgKGhlbnRyeS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoZW50cnktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLSAgICAgIGVzZWMgPSBoZW50cnktPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgKGVzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBlc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaGVudHJ5LT5yb290LnUuZGVmLnZhbHVlKSwKLQkJICBwKTsKLQotICAgICAgaXJlbCA9IGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbG9jcyArIG9zZWMtPnJlbG9jX2NvdW50OwotICAgICAgaXJlbC0+cl92YWRkciA9IChvc2VjLT52bWEKLQkJICAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIGgtPnJvb3QudS5kZWYudmFsdWUpOwotICAgICAgaXJlbC0+cl9zeW1uZHggPSBlc2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgaXJlbC0+cl90eXBlID0gUl9QT1M7Ci0gICAgICBpcmVsLT5yX3NpemUgPSAzMTsKLSAgICAgIGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbF9oYXNoZXNbb3NlYy0+cmVsb2NfY291bnRdID0gTlVMTDsKLSAgICAgICsrb3NlYy0+cmVsb2NfY291bnQ7Ci0KLSAgICAgIGxkcmVsLmxfdmFkZHIgPSBpcmVsLT5yX3ZhZGRyOwotICAgICAgaWYgKHN0cmNtcCAoZXNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIudGV4dCIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAwOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChlc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGVzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLmJzcyIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAyOwotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGxvYWRlciByZWxvYyBpbiB1bnJlY29nbml6ZWQgc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvdXRwdXRfYmZkKSwKLQkgICAgIGVzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGxkcmVsLmxfcnR5cGUgPSAoMzEgPDwgOCkgfCBSX1BPUzsKLSAgICAgIGxkcmVsLmxfcnNlY25tID0gb2luZHg7Ci0gICAgICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLCBmaW5mby0+bGRyZWwpOwotICAgICAgKytmaW5mby0+bGRyZWw7Ci0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT50b2MsIHAgKyA0KTsKLQotICAgICAgdHNlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAob3V0cHV0X2JmZCwKLQkJCQkJICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+c250b2MpOwotCi0gICAgICArK2lyZWw7Ci0gICAgICBpcmVsLT5yX3ZhZGRyID0gKG9zZWMtPnZtYQotCQkgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICAgKyA0KTsKLSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gdHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIGlyZWwtPnJfdHlwZSA9IFJfUE9TOwotICAgICAgaXJlbC0+cl9zaXplID0gMzE7Ci0gICAgICBmaW5mby0+c2VjdGlvbl9pbmZvW29pbmR4XS5yZWxfaGFzaGVzW29zZWMtPnJlbG9jX2NvdW50XSA9IE5VTEw7Ci0gICAgICArK29zZWMtPnJlbG9jX2NvdW50OwotCi0gICAgICBsZHJlbC5sX3ZhZGRyID0gaXJlbC0+cl92YWRkcjsKLSAgICAgIGlmIChzdHJjbXAgKHRzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAodHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIuZGF0YSIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAxOwotICAgICAgZWxzZSBpZiAoc3RyY21wICh0c2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi5ic3MiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMjsKLSAgICAgIGVsc2UKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCksCi0JICAgICB0c2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBsZHJlbC5sX3J0eXBlID0gKDMxIDw8IDgpIHwgUl9QT1M7Ci0gICAgICBsZHJlbC5sX3JzZWNubSA9IG9pbmR4OwotICAgICAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwgZmluZm8tPmxkcmVsKTsKLSAgICAgICsrZmluZm8tPmxkcmVsOwotICAgIH0KLQotICBpZiAoaC0+aW5keCA+PSAwIHx8IGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAob3V0c3ltID09IGZpbmZvLT5vdXRzeW1zKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaC0+aW5keCAhPSAtMgotICAgICAgJiYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgIHx8IChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICYmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0JCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywgZmFsc2UsIGZhbHNlKQotCQkgID09IE5VTEwpKSkpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAob3V0c3ltID09IGZpbmZvLT5vdXRzeW1zKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaC0+aW5keCAhPSAtMgotICAgICAgJiYgKGgtPmZsYWdzICYgKFhDT0ZGX1JFRl9SRUdVTEFSIHwgWENPRkZfREVGX1JFR1VMQVIpKSA9PSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKG91dHN5bSA9PSBmaW5mby0+b3V0c3ltcyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbWVtc2V0ICgmYXV4LCAwLCBzaXplb2YgYXV4KTsKLQotICBoLT5pbmR4ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOwotCi0gIGlmIChzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpIDw9IFNZTU5NTEVOKQotICAgIHN0cm5jcHkgKGlzeW0uX24uX25fbmFtZSwgaC0+cm9vdC5yb290LnN0cmluZywgU1lNTk1MRU4pOwotICBlbHNlCi0gICAgewotICAgICAgYm9vbGVhbiBoYXNoOwotICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0gICAgICBoYXNoID0gdHJ1ZTsKLSAgICAgIGlmICgob3V0cHV0X2JmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQotCWhhc2ggPSBmYWxzZTsKLSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGhhc2gsCi0JCQkJIGZhbHNlKTsKLSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpc3ltLl9uLl9uX24uX25femVyb2VzID0gMDsKLSAgICAgIGlzeW0uX24uX25fbi5fbl9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKLSAgICB9Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IDA7Ci0gICAgICBpc3ltLm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgaXN5bS5uX3NjbGFzcyA9IENfRVhUOwotICAgICAgYXV4LnhfY3NlY3QueF9zbXR5cCA9IFhUWV9FUjsKLSAgICB9Ci0gIGVsc2UgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgJiYgaC0+c21jbGFzID09IFhNQ19YTykKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3QudS5kZWYuc2VjdGlvbikpOwotICAgICAgaXN5bS5uX3ZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIGlzeW0ubl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBpc3ltLm5fc2NsYXNzID0gQ19FWFQ7Ci0gICAgICBhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX0VSOwotICAgIH0KLSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfc2l6ZV9saXN0ICpsOwotCi0gICAgICBpc3ltLm5fdmFsdWUgPSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgaC0+cm9vdC51LmRlZi52YWx1ZSk7Ci0gICAgICBpc3ltLm5fc2NudW0gPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBpc3ltLm5fc2NsYXNzID0gQ19ISURFWFQ7Ci0gICAgICBhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX1NEOwotCi0gICAgICBpZiAoKGgtPmZsYWdzICYgWENPRkZfSEFTX1NJWkUpICE9IDApCi0JewotCSAgZm9yIChsID0geGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5zaXplX2xpc3Q7Ci0JICAgICAgIGwgIT0gTlVMTDsKLQkgICAgICAgbCA9IGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAobC0+aCA9PSBoKQotCQl7Ci0JCSAgYXV4LnhfY3NlY3QueF9zY25sZW4ubCA9IGwtPnNpemU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICB7Ci0gICAgICBpc3ltLm5fdmFsdWUgPSAoaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaXN5bS5uX3NjbnVtID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX0VYVDsKLSAgICAgIGF1eC54X2NzZWN0Lnhfc210eXAgPSBYVFlfQ007Ci0gICAgICBhdXgueF9jc2VjdC54X3Njbmxlbi5sID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLQotICBpc3ltLm5fdHlwZSA9IFRfTlVMTDsKLSAgaXN5bS5uX251bWF1eCA9IDE7Ci0KLSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgb3V0c3ltKTsKLSAgb3V0c3ltICs9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLSAgYXV4LnhfY3NlY3QueF9zbWNsYXMgPSBoLT5zbWNsYXM7Ci0KLSAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmYXV4LCBUX05VTEwsIGlzeW0ubl9zY2xhc3MsIDAsIDEsCi0JCQkgKFBUUikgb3V0c3ltKTsKLSAgb3V0c3ltICs9IGJmZF9jb2ZmX2F1eGVzeiAob3V0cHV0X2JmZCk7Ci0KLSAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICYmIGgtPnNtY2xhcyAhPSBYTUNfWE8pCi0gICAgewotICAgICAgLyogV2UganVzdCBvdXRwdXQgYW4gU0Qgc3ltYm9sLiAgTm93IG91dHB1dCBhbiBMRCBzeW1ib2wuICAqLwotCi0gICAgICBoLT5pbmR4ICs9IDI7Ci0KLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX0VYVDsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlzeW0sIChQVFIpIG91dHN5bSk7Ci0gICAgICBvdXRzeW0gKz0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLQotICAgICAgYXV4LnhfY3NlY3QueF9zbXR5cCA9IFhUWV9MRDsKLSAgICAgIGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgJmF1eCwgVF9OVUxMLCBDX0VYVCwgMCwgMSwKLQkJCSAgICAgKFBUUikgb3V0c3ltKTsKLSAgICAgIG91dHN5bSArPSBiZmRfY29mZl9hdXhlc3ogKG91dHB1dF9iZmQpOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCShvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCi0JCSArIChvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkKLQkJICAgICogYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKSkpLAotCQlTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoZmluZm8tPm91dHN5bXMsIG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zLCAxLCBvdXRwdXRfYmZkKQotCSAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQotICAgIHJldHVybiBmYWxzZTsKLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpICs9Ci0gICAgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSAvIGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhIGxpbmsgb3JkZXIgd2hpY2ggaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgYSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBmaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgYXNlY3Rpb24gKmhzZWM7Ci0gIGJmZF92bWEgaHZhbDsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoX3B0cjsKLSAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOwotCi0gIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byBzb21laG93IGxvY2F0ZSBhIHN5bWJvbCBpbiB0aGUgcmlnaHQgc2VjdGlvbi4gIFRoZQotICAgICAgICAgc3ltYm9sIG11c3QgZWl0aGVyIGhhdmUgYSB2YWx1ZSBvZiB6ZXJvLCBvciB3ZSBtdXN0IGFkanVzdAotICAgICAgICAgdGhlIGFkZGVuZCBieSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIEZJWE1FOiBXcml0ZSB0aGlzCi0gICAgICAgICB3aGVuIHdlIG5lZWQgaXQuICBUaGUgb2xkIGxpbmtlciBjb3VsZG4ndCBoYW5kbGUgdGhpcyBhbnlob3cuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnJlbG9jKTsKLSAgaWYgKGhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGggPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkgICAgIChmaW5mby0+aW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKLQkgICAgICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICB7Ci0gICAgICBoc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLSAgICAgIGh2YWwgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgaHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGh2YWwgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGhzZWMgPSBOVUxMOwotICAgICAgaHZhbCA9IDA7Ci0gICAgfQotCi0gIGFkZGVuZCA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kOwotICBpZiAoaHNlYyAhPSBOVUxMKQotICAgIGFkZGVuZCArPSAoaHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICArIGhzZWMtPm91dHB1dF9vZmZzZXQKLQkgICAgICAgKyBodmFsKTsKLQotICBpZiAoYWRkZW5kICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfem1hbGxvYyAoc2l6ZSk7Ci0gICAgICBpZiAoYnVmID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBvdXRwdXRfYmZkLCBhZGRlbmQsIGJ1Zik7Ci0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoZmluZm8tPmluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkgIGhvd3RvLT5uYW1lLCBhZGRlbmQsIChiZmQgKikgTlVMTCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCSAgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sIChQVFIpIGJ1ZiwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBpZiAoISBvaykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFN0b3JlIHRoZSByZWxvYyBpbmZvcm1hdGlvbiBpbiB0aGUgcmlnaHQgcGxhY2UuICBJdCB3aWxsIGdldAotICAgICBzd2FwcGVkIGFuZCB3cml0dGVuIG91dCBhdCB0aGUgZW5kIG9mIHRoZSBmaW5hbF9saW5rIHJvdXRpbmUuICAqLwotCi0gIGlyZWwgPSAoZmluZm8tPnNlY3Rpb25faW5mb1tvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4XS5yZWxvY3MKLQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLSAgcmVsX2hhc2hfcHRyID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcwotCQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQotICBtZW1zZXQgKGlyZWwsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSk7Ci0gICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotCi0gIGlyZWwtPnJfdmFkZHIgPSBvdXRwdXRfc2VjdGlvbi0+dm1hICsgbGlua19vcmRlci0+b2Zmc2V0OwotCi0gIGlmIChoLT5pbmR4ID49IDApCi0gICAgaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OwotICBlbHNlCi0gICAgewotICAgICAgLyogU2V0IHRoZSBpbmRleCB0byAtMiB0byBmb3JjZSB0aGlzIHN5bWJvbCB0byBnZXQgd3JpdHRlbiBvdXQuICAqLwotICAgICAgaC0+aW5keCA9IC0yOwotICAgICAgKnJlbF9oYXNoX3B0ciA9IGg7Ci0gICAgICBpcmVsLT5yX3N5bW5keCA9IDA7Ci0gICAgfQotCi0gIGlyZWwtPnJfdHlwZSA9IGhvd3RvLT50eXBlOwotICBpcmVsLT5yX3NpemUgPSBob3d0by0+Yml0c2l6ZSAtIDE7Ci0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKQotICAgIGlyZWwtPnJfc2l6ZSB8PSAweDgwOwotCi0gICsrb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIC8qIE5vdyBvdXRwdXQgdGhlIHJlbG9jIHRvIHRoZSAubG9hZGVyIHNlY3Rpb24uICAqLwotCi0gIGxkcmVsLmxfdmFkZHIgPSBpcmVsLT5yX3ZhZGRyOwotCi0gIGlmIChoc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLQotICAgICAgc2VjbmFtZSA9IGhzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lOwotCi0gICAgICBpZiAoc3RyY21wIChzZWNuYW1lLCAiLnRleHQiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc2VjbmFtZSwgIi5kYXRhIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHNlY25hbWUsICIuYnNzIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDI7Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogbG9hZGVyIHJlbG9jIGluIHVucmVjb2duaXplZCBzZWN0aW9uIGAlcyciKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLCBzZWNuYW1lKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaC0+bGRpbmR4IDwgMCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBgJXMnIGluIGxvYWRlciByZWxvYyBidXQgbm90IGxvYWRlciBzeW0iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLAotCSAgICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBsZHJlbC5sX3N5bW5keCA9IGgtPmxkaW5keDsKLSAgICB9Ci0KLSAgbGRyZWwubF9ydHlwZSA9IChpcmVsLT5yX3NpemUgPDwgOCkgfCBpcmVsLT5yX3R5cGU7Ci0gIGxkcmVsLmxfcnNlY25tID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwgZmluZm8tPmxkcmVsKTsKLSAgKytmaW5mby0+bGRyZWw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNvcnQgcmVsb2NzIGJ5IFZNQS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBxc29ydC4gICovCi0KLXN0YXRpYyBpbnQKLXhjb2ZmX3NvcnRfcmVsb2NzIChwMSwgcDIpCi0gICAgIGNvbnN0IFBUUiBwMTsKLSAgICAgY29uc3QgUFRSIHAyOwotewotICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnIxID0gKGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBwMTsKLSAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICpyMiA9IChjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgcDI7Ci0KLSAgaWYgKHIxLT5yX3ZhZGRyID4gcjItPnJfdmFkZHIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKHIxLT5yX3ZhZGRyIDwgcjItPnJfdmFkZHIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIHJlbG9jYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBSUy82MDAwL1BPV0VSL1Bvd2VyUEMuCi0gICBUaGlzIGlzIGN1cnJlbnRseSB0aGUgb25seSBwcm9jZXNzb3Igd2hpY2ggdXNlcyBYQ09GRjsgSSBob3BlIHRoYXQKLSAgIHdpbGwgbmV2ZXIgY2hhbmdlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsb2NzLCBzeW1zLAotCQkJCSBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0KLSAgICAgIC8qIFJlbG9jYXRpb24gdHlwZSBSX1JFRiBpcyBhIHNwZWNpYWwgcmVsb2NhdGlvbiB0eXBlIHdoaWNoIGlzCi0gICAgICAgICBtZXJlbHkgdXNlZCB0byBwcmV2ZW50IGdhcmJhZ2UgY29sbGVjdGlvbiBmcm9tIG9jY3VycmluZyBmb3IKLSAgICAgICAgIHRoZSBjc2VjdCBpbmNsdWRpbmcgdGhlIHN5bWJvbCB3aGljaCBpdCByZWZlcmVuY2VzLiAgKi8KLSAgICAgIGlmIChyZWwtPnJfdHlwZSA9PSBSX1JFRikKLQljb250aW51ZTsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JICBhZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCSAgYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0JfQotCi0gICAgICAvKiBXZSBidWlsZCB0aGUgaG93dG8gaW5mb3JtYXRpb24gb24gdGhlIGZseS4gICovCi0KLSAgICAgIGhvd3RvLnR5cGUgPSByZWwtPnJfdHlwZTsKLSAgICAgIGhvd3RvLnJpZ2h0c2hpZnQgPSAwOwotICAgICAgaG93dG8uc2l6ZSA9IDI7Ci0gICAgICBob3d0by5iaXRzaXplID0gKHJlbC0+cl9zaXplICYgMHgxZikgKyAxOwotICAgICAgaG93dG8ucGNfcmVsYXRpdmUgPSBmYWxzZTsKLSAgICAgIGhvd3RvLmJpdHBvcyA9IDA7Ci0gICAgICBpZiAoKHJlbC0+cl9zaXplICYgMHg4MCkgIT0gMCkKLQlob3d0by5jb21wbGFpbl9vbl9vdmVyZmxvdyA9IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDsKLSAgICAgIGVsc2UKLQlob3d0by5jb21wbGFpbl9vbl9vdmVyZmxvdyA9IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOwotICAgICAgaG93dG8uc3BlY2lhbF9mdW5jdGlvbiA9IE5VTEw7Ci0gICAgICBob3d0by5uYW1lID0gImludGVybmFsIjsKLSAgICAgIGhvd3RvLnBhcnRpYWxfaW5wbGFjZSA9IHRydWU7Ci0gICAgICBpZiAoaG93dG8uYml0c2l6ZSA9PSAzMikKLQlob3d0by5zcmNfbWFzayA9IGhvd3RvLmRzdF9tYXNrID0gMHhmZmZmZmZmZjsKLSAgICAgIGVsc2UKLQl7Ci0JICBob3d0by5zcmNfbWFzayA9IGhvd3RvLmRzdF9tYXNrID0gKDEgPDwgaG93dG8uYml0c2l6ZSkgLSAxOwotCSAgaWYgKGhvd3RvLmJpdHNpemUgPT0gMTYpCi0JICAgIGhvd3RvLnNpemUgPSAxOwotCX0KLSAgICAgIGhvd3RvLnBjcmVsX29mZnNldCA9IGZhbHNlOwotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JICAgICAgLyogSGFjayB0byBtYWtlIHN1cmUgd2UgdXNlIHRoZSByaWdodCBUT0MgYW5jaG9yIHZhbHVlCi0gICAgICAgICAgICAgICAgIGlmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCB0aGUgVE9DIGFuY2hvci4gICovCi0JICAgICAgaWYgKHNlYy0+bmFtZVszXSA9PSAnMCcKLQkJICAmJiBzdHJjbXAgKHNlYy0+bmFtZSwgIi50YzAiKSA9PSAwKQotCQl2YWwgPSB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jOwotCSAgICAgIGVsc2UKLQkJdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgc3ltLT5uX3ZhbHVlCi0JCSAgICAgICAtIHNlYy0+dm1hKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCSAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIEV2ZXJ5IHN5bWJvbCBpbiBhIHNoYXJlZCBvYmplY3QgaXMgZGVmaW5lZCBzb21ld2hlcmUuICAqLwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBEb24ndCB0cnkgdG8gcHJvY2VzcyB0aGUgcmVsb2MuICBJdCBjYW4ndCBoZWxwLCBhbmQKLSAgICAgICAgICAgICAgICAgaXQgbWF5IGdlbmVyYXRlIGFub3RoZXIgZXJyb3IuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJIHRvb2sgdGhlIHJlbG9jYXRpb24gdHlwZSBkZWZpbml0aW9ucyBmcm9tIHR3byBkb2N1bWVudHM6Ci0JIHRoZSBQb3dlclBDIEFJWCBWZXJzaW9uIDQgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSwgRmlyc3QKLQkgRWRpdGlvbiAoQXByaWwgMTk5MiksIGFuZCB0aGUgUG93ZXJPcGVuIEFCSSwgQmlnLUVuZGlhbgotCSAzMi1CaXQgSGFyZHdhcmUgSW1wbGVtZW50YXRpb24gKEp1bmUgMzAsIDE5OTQpLiAgRGlmZmVyZW5jZXMKLQkgYmV0d2VlbiB0aGUgZG9jdW1lbnRzIGFyZSBub3RlZCBiZWxvdy4gICovCi0KLSAgICAgIHN3aXRjaCAocmVsLT5yX3R5cGUpCi0JewotCWNhc2UgUl9SVEI6Ci0JY2FzZSBSX1JSVEJJOgotCWNhc2UgUl9SUlRCQToKLQkgIC8qIFRoZXNlIHJlbG9jcyBhcmUgZGVmaW5lZCBieSB0aGUgUG93ZXJQQyBBQkkgdG8gYmUKLSAgICAgICAgICAgICByZWxhdGl2ZSBicmFuY2hlcyB3aGljaCB1c2UgaGFsZiBvZiB0aGUgZGlmZmVyZW5jZQotICAgICAgICAgICAgIGJldHdlZW4gdGhlIHN5bWJvbCBhbmQgdGhlIHByb2dyYW0gY291bnRlci4gIEkgY2FuJ3QKLSAgICAgICAgICAgICBxdWl0ZSBmaWd1cmUgb3V0IHdoZW4gdGhpcyBpcyB1c2VmdWwuICBUaGVzZSByZWxvY3MgYXJlCi0gICAgICAgICAgICAgbm90IGRlZmluZWQgYnkgdGhlIFBvd2VyT3BlbiBBQkkuICAqLwotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgMHglMDJ4IiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCAodW5zaWduZWQgaW50KSByZWwtPnJfdHlwZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIFJfUE9TOgotCSAgLyogU2ltcGxlIHBvc2l0aXZlIHJlbG9jYXRpb24uICAqLwotCSAgYnJlYWs7Ci0JY2FzZSBSX05FRzoKLQkgIC8qIFNpbXBsZSBuZWdhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLQkgIHZhbCA9IC0gdmFsOwotCSAgYnJlYWs7Ci0JY2FzZSBSX1JFTDoKLQkgIC8qIFNpbXBsZSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLQkgIGhvd3RvLnBjX3JlbGF0aXZlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgUl9UT0M6Ci0JICAvKiBUT0MgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFRoZSB2YWx1ZSBpbiB0aGUgaW5zdHJ1Y3Rpb24gaW4KLSAgICAgICAgICAgICB0aGUgaW5wdXQgZmlsZSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGlucHV0IGZpbGUgVE9DIHRvCi0gICAgICAgICAgICAgdGhlIGRlc2lyZWQgbG9jYXRpb24uICBXZSB3YW50IHRoZSBvZmZzZXQgZnJvbSB0aGUgZmluYWwKLSAgICAgICAgICAgICBUT0MgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24uICBXZSBoYXZlOgotCSAgICAgICAgIGlzeW0gPSBpVE9DICsgaW4KLQkJIGlpbnNuID0gaW4gKyBvCi0JCSBvc3ltID0gb1RPQyArIG9uCi0JCSBvaW5zbiA9IG9uICsgbwotCSAgICAgc28gd2UgbXVzdCBjaGFuZ2UgaW5zbiBieSBvbiAtIGluLgotCSAgICAgKi8KLQljYXNlIFJfR0w6Ci0JICAvKiBHbG9iYWwgbGlua2FnZSByZWxvY2F0aW9uLiAgVGhlIHZhbHVlIG9mIHRoaXMgcmVsb2NhdGlvbgotICAgICAgICAgICAgIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSBpbiB0aGUgVE9DIHNlY3Rpb24uICAqLwotCWNhc2UgUl9UQ0w6Ci0JICAvKiBMb2NhbCBvYmplY3QgVE9DIGFkZHJlc3MuICBJIGNhbid0IGZpZ3VyZSBvdXQgdGhlCi0gICAgICAgICAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGNhc2UgUl9HTC4gICovCi0JY2FzZSBSX1RSTDoKLQkgIC8qIFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgQSBUT0MgcmVsYXRpdmUgbG9hZCBpbnN0cnVjdGlvbgotICAgICAgICAgICAgIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvIGEgbG9hZCBhZGRyZXNzIGluc3RydWN0aW9uLgotICAgICAgICAgICAgIEZJWE1FOiBXZSBkb24ndCBjdXJyZW50bHkgaW1wbGVtZW50IHRoaXMgb3B0aW1pemF0aW9uLiAgKi8KLQljYXNlIFJfVFJMQToKLQkgIC8qIFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIFRPQyByZWxhdGl2ZSBsb2FkCi0gICAgICAgICAgICAgYWRkcmVzcyBpbnN0cnVjdGlvbiB3aGljaCBtYXkgYmUgY2hhbmdlZCB0byBhIGxvYWQKLSAgICAgICAgICAgICBpbnN0cnVjdGlvbi4gIEZJWE1FOiBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyB0aGUgY29ycmVjdAotICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLiAgKi8KLQkgIGlmIChoICE9IE5VTEwgJiYgaC0+c21jbGFzICE9IFhNQ19URCkKLQkgICAgewotCSAgICAgIGlmIChoLT50b2Nfc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6IFRPQyByZWxvYyBhdCAweCV4IHRvIHN5bWJvbCBgJXMnIHdpdGggbm8gVE9DIGVudHJ5IiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgcmVsLT5yX3ZhZGRyLAotCQkgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgQkZEX0FTU0VSVCAoKGgtPmZsYWdzICYgWENPRkZfU0VUX1RPQykgPT0gMCk7Ci0JICAgICAgdmFsID0gKGgtPnRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBoLT50b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQotCSAgdmFsID0gKCh2YWwgLSB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jKQotCQkgLSAoc3ltLT5uX3ZhbHVlIC0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+dG9jKSk7Ci0JICBhZGRlbmQgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSBSX0JBOgotCSAgLyogQWJzb2x1dGUgYnJhbmNoLiAgV2UgZG9uJ3Qgd2FudCB0byBtZXNzIHdpdGggdGhlIGxvd2VyCi0gICAgICAgICAgICAgdHdvIGJpdHMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLQljYXNlIFJfQ0FJOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBjYWxsIHdoaWNoCi0gICAgICAgICAgICAgbWF5IGJlIG1vZGlmaWVkIHRvIGJlY29tZSBhIHJlbGF0aXZlIGNhbGwuICBUaGUgUG93ZXJPcGVuCi0gICAgICAgICAgICAgQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCi0JY2FzZSBSX1JCQToKLQkgIC8qIEFic29sdXRlIGJyYW5jaCB3aGljaCBtYXkgYmUgbW9kaWZpZWQgdG8gYmVjb21lIGEKLSAgICAgICAgICAgICByZWxhdGl2ZSBicmFuY2guICAqLwotCWNhc2UgUl9SQkFDOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBicmFuY2ggdG8gYQotICAgICAgICAgICAgIGZpeGVkIGFkZHJlc3Mgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIHRvIGFuIGFic29sdXRlIGJyYW5jaAotICAgICAgICAgICAgIHRvIGEgc3ltYm9sLiAgVGhlIFBvd2VyT3BlbiBBQkkgZG9lcyBub3QgZGVmaW5lIHRoaXMKLSAgICAgICAgICAgICByZWxvY2F0aW9uIHR5cGUuICAqLwotCWNhc2UgUl9SQlJDOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBicmFuY2ggdG8gYQotICAgICAgICAgICAgIGZpeGVkIGFkZHJlc3Mgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIHRvIGEgcmVsYXRpdmUgYnJhbmNoLgotICAgICAgICAgICAgIFRoZSBQb3dlck9wZW4gQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCi0JICBob3d0by5zcmNfbWFzayAmPSB+MzsKLQkgIGhvd3RvLmRzdF9tYXNrID0gaG93dG8uc3JjX21hc2s7Ci0JICBicmVhazsKLQljYXNlIFJfQlI6Ci0JICAvKiBSZWxhdGl2ZSBicmFuY2guICBXZSBkb24ndCB3YW50IHRvIG1lc3Mgd2l0aCB0aGUgbG93ZXIKLSAgICAgICAgICAgICB0d28gYml0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCWNhc2UgUl9DUkVMOgotCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhIHJlbGF0aXZlIGNhbGwgd2hpY2ggbWF5Ci0gICAgICAgICAgICAgYmUgbW9kaWZpZWQgdG8gYmVjb21lIGFuIGFic29sdXRlIGNhbGwuICBUaGUgUG93ZXJPcGVuCi0gICAgICAgICAgICAgQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCi0JY2FzZSBSX1JCUjoKLQkgIC8qIEEgcmVsYXRpdmUgYnJhbmNoIHdoaWNoIG1heSBiZSBtb2RpZmllZCB0byBiZWNvbWUgYW4KLSAgICAgICAgICAgICBhYnNvbHV0ZSBicmFuY2guICBGSVhNRTogV2UgZG9uJ3QgaW1wbGVtZW50IHRoaXMsCi0gICAgICAgICAgICAgYWx0aG91Z2ggd2Ugc2hvdWxkIGZvciBzeW1ib2xzIG9mIHN0b3JhZ2UgbWFwcGluZyBjbGFzcwotICAgICAgICAgICAgIFhNQ19YTy4gICovCi0JICBob3d0by5wY19yZWxhdGl2ZSA9IHRydWU7Ci0JICBob3d0by5zcmNfbWFzayAmPSB+MzsKLQkgIGhvd3RvLmRzdF9tYXNrID0gaG93dG8uc3JjX21hc2s7Ci0JICBicmVhazsKLQljYXNlIFJfUkw6Ci0JICAvKiBUaGUgUG93ZXJQQyBBSVggQUJJIGRlc2NyaWJlcyB0aGlzIGFzIGEgbG9hZCB3aGljaCBtYXkgYmUKLSAgICAgICAgICAgICBjaGFuZ2VkIHRvIGEgbG9hZCBhZGRyZXNzLiAgVGhlIFBvd2VyT3BlbiBBQkkgc2F5cyB0aGlzCi0gICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgY2FzZSBSX1BPUy4gICovCi0JICBicmVhazsKLQljYXNlIFJfUkxBOgotCSAgLyogVGhlIFBvd2VyUEMgQUlYIEFCSSBkZXNjcmliZXMgdGhpcyBhcyBhIGxvYWQgYWRkcmVzcwotICAgICAgICAgICAgIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvIGEgbG9hZC4gIFRoZSBQb3dlck9wZW4gQUJJIHNheXMKLSAgICAgICAgICAgICB0aGlzIGlzIHRoZSBzYW1lIGFzIFJfUE9TLiAgKi8KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogSWYgd2Ugc2VlIGFuIFJfQlIgb3IgUl9SQlIgcmVsb2Mgd2hpY2ggaXMganVtcGluZyB0byBnbG9iYWwKLSAgICAgICAgIGxpbmthZ2UgY29kZSwgYW5kIGl0IGlzIGZvbGxvd2VkIGJ5IGFuIGFwcHJvcHJpYXRlIGNyb3Igbm9wCi0gICAgICAgICBpbnN0cnVjdGlvbiwgd2UgcmVwbGFjZSB0aGUgY3JvciB3aXRoIGx3eiByMiwyMChyMSkuICBUaGlzCi0gICAgICAgICByZXN0b3JlcyB0aGUgVE9DIGFmdGVyIHRoZSBnbGluayBjb2RlLiAgQ29udHJhcml3aXNlLCBpZiB0aGUKLSAgICAgICAgIGNhbGwgaXMgZm9sbG93ZWQgYnkgYSBsd3ogcjIsMjAocjEpLCBidXQgdGhlIGNhbGwgaXMgbm90Ci0gICAgICAgICBnb2luZyB0byBnbG9iYWwgbGlua2FnZSBjb2RlLCB3ZSBjYW4gcmVwbGFjZSB0aGUgbG9hZCB3aXRoIGEKLSAgICAgICAgIGNyb3IuICAqLwotICAgICAgaWYgKChyZWwtPnJfdHlwZSA9PSBSX0JSIHx8IHJlbC0+cl90eXBlID09IFJfUkJSKQotCSAgJiYgaCAhPSBOVUxMCi0JICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hICsgOAotCSAgICAgIDw9IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkpCi0JewotCSAgYmZkX2J5dGUgKnBuZXh0OwotCSAgdW5zaWduZWQgbG9uZyBuZXh0OwotCi0JICBwbmV4dCA9IGNvbnRlbnRzICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkgKyA0OwotCSAgbmV4dCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgcG5leHQpOwotCi0JICAvKiBUaGUgX3B0cmdsIGZ1bmN0aW9uIGlzIG1hZ2ljLiAgSXQgaXMgdXNlZCBieSB0aGUgQUlYCi0gICAgICAgICAgICAgY29tcGlsZXIgdG8gY2FsbCBhIGZ1bmN0aW9uIHRocm91Z2ggYSBwb2ludGVyLiAgKi8KLQkgIGlmIChoLT5zbWNsYXMgPT0gWE1DX0dMCi0JICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiLl9wdHJnbCIpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAobmV4dCA9PSAweDRkZWY3YjgyCQkvKiBjcm9yIDE1LDE1LDE1ICovCi0JCSAgfHwgbmV4dCA9PSAweDRmZmZmYjgyKQkvKiBjcm9yIDMxLDMxLDMxICovCi0JCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgMHg4MDQxMDAxNCwgcG5leHQpOyAvKiBsd3ogcjEsMjAocjEpICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChuZXh0ID09IDB4ODA0MTAwMTQpCQkvKiBsd3ogcjEsMjAocjEpICovCi0JCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgMHg0ZmZmZmI4MiwgcG5leHQpOyAvKiBjcm9yIDMxLDMxLDMxICovCi0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEEgUEMgcmVsYXRpdmUgcmVsb2MgaW5jbHVkZXMgdGhlIHNlY3Rpb24gYWRkcmVzcy4gICovCi0gICAgICBpZiAoaG93dG8ucGNfcmVsYXRpdmUpCi0JYWRkZW5kICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKLQotICAgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKCZob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywKLQkJCQkJcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCQkJCQl2YWwsIGFkZGVuZCk7Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgICBjaGFyIGhvd3RvX25hbWVbMTBdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgc3ByaW50ZiAoaG93dG9fbmFtZSwgIjB4JTAyeCIsIHJlbC0+cl90eXBlKTsKLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG9fbmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvQ2hhbmdlTG9nIGIvYmludXRpbHMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzU0OGVmLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDcwNzUgKzAsMCBAQAotMTk5OS0xMi0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcmludF92bWEpOiBTdXBwb3J0IG5hdGl2ZSA2NGJpdCBFTEYgc3lzdGVtcy4KLQotMTk5OS0xMi0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtdGFibGUpOiBBZGQgZXBvYy1hcm0gc3BlY2lmaWMgZW50cnkuCi0JTWFrZSBkZWZhdWx0IGFybSBlbnRyeSBwYXNzIC1tcGFjcy0yNiB0byBhc3NlbWJsZXIuCi0JKGZsdXNoX3BhZ2UpOiBEbyBub3QgbWFuZ2xlIG51bGwgZW50cmllcy4KLQkKLTE5OTktMTItMDcgIEggLiBKIC4gTHUgIGhqbEB2YWxpbnV4LmNvbQotCi0JKiByZWFkZWxmLmM6IEZpeCBjb21waWxlIHRpbWUgd2FybmluZ3MuICBTdXBwb3J0IG1vcmUgdGhhbiA5OTkKLQlzeW1ib2xzLgotCi0xOTk5LTEyLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGVudW0gcHJpbnRfbW9kZSk6IE5ldyB0eXBlLgotCShwcmludF92bWEpOiBOZXcgZnVuY3Rpb24uCi0JKGR1bXBfcmVsb2NhdGlvbnMpOiBVc2UgcHJpbnRfdm1hIHRvIGRpc3BsYXkgYmZkX3ZtYSB2YWx1ZXMuCi0JKHByb2Nlc3NfZmlsZV9oZWFkZXIpOiBVc2UgcHJpbnRfdm1hIHRvIGRpc3BsYXkgYmZkX3ZtYSB2YWx1ZXMuCi0JKHByb2Nlc3NfcHJvZ3JhbV9oZWFkZXJzKTogVXNlIHByaW50X3ZtYSB0byBkaXNwbGF5IGJmZF92bWEgdmFsdWVzLgotCShwcm9jZXNzX3NlY3Rpb25faGVhZGVycyk6IFVzZSBwcmludF92bWEgdG8gZGlzcGxheSBiZmRfdm1hIHZhbHVlcy4KLQkoZHluYW1pY19zZWdtZW50X3BhcmlzY192YWwpOiBVc2UgcHJpbnRfdm1hIHRvIGRpc3BsYXkgYmZkX3ZtYSB2YWx1ZXMuCi0JKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogVXNlIHByaW50X3ZtYSB0byBkaXNwbGF5IGJmZF92bWEgdmFsdWVzLgotCShwcm9jZXNzX3N5bWJvbF90YWJsZSk6IFVzZSBwcmludF92bWEgdG8gZGlzcGxheSBiZmRfdm1hIHZhbHVlcy4KLQkocHJvY2Vzc19taXBzX3NwZWNpZmljKTogVXNlIHByaW50X3ZtYSB0byBkaXNwbGF5IGJmZF92bWEgdmFsdWVzLgotCi0xOTk5LTExLTI1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX25vdGUpOiBDaGFuZ2UgYXJnIGZyb20gRWxmX0V4dGVybmFsX05vdGUKLQl0byBFbGYzMl9JbnRlcm5hbF9Ob3RlLCB3aGljaCBhbHNvIHR1cm5zIHRoZSBmdW5jdGlvbiBib2R5Ci0JaW50byBsaXR0bGUgbW9yZSB0aGFuIGEgY2FsbCB0byBwcmludGYuCi0JKHByb2Nlc3NfY29yZWZpbGVfbm90ZV9zZWdtZW50KTogIFN1YnN0YW50aWFsbHkgcmV3cml0dGVuCi0JdG8gcHJvcGVybHkgaGFuZGxlIGNhc2Ugd2hlcmUgdGFyZ2V0IGFuZCBob3N0IGFyZSBkaWZmZXJlbnQKLQllbmRpYW5uZXNzLCBoYW5kbGUgbm90ZSBzZWN0aW9ucyB3aXRoIHBhZGRpbmcsIGFuZCBhZGQgc29tZQotCWNydWZ0IHRvIGhhbmRsZSBub3RlcyB3aXRoIHVudGVybWluYXRlZCBuYW1lIGRhdGEuCi0KLTE5OTktMTEtMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV91c2FnZSk6IFJlZm9ybWF0LgotCShzdHJpcF91c2FnZSk6IFJlZm9ybWF0LgotCi0xOTk5LTExLTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogT3ZlcmhhdWwgb3V0cHV0OiAgT25lIGxpbmUgcGVyIHN3aXRjaC4KLQlUZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGVhY2ggc3dpdGNoLiAgRGlzdGluZ3Vpc2ggYmV0d2VlbgotCW9wdGlvbmFsIHN3aXRjaGVzIGFuZCByZXF1aXJlZCBzd2l0Y2hlcy4KLQkobG9uZ19vcHRpb25zKTogQWRkICdnJywgJ0cnIGFuZCAneicgc2hvcnQgb3B0aW9ucy4KLQkobWFpbik6IERpc3Rpbmd1aXNoIGJldHdlZW4gb3B0aW9uYWwgc3dpdGNoZXMgYW5kIHJlcXVpcmVkCi0Jc3dpdGNoZXMuCi0KLQkqIGJpbnV0aWxzLnRleGk6IEFkZCAtZyAtRyBhbmQgLXogc2hvcnQgb3B0aW9ucyBmb3IKLQktLWRlYnVnZ2luZywgLS1zdGFicyBhbmQgLS1kaXNhc3NlbWJsZS16ZXJvZXMuCi0KLTE5OTktMTEtMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZmx1c2hfcGFnZSk6IENsaXAgc2hvcnQgdmFsdWVzIHRvIHByZXZlbnQgd2FybmluZ3MKLQlmcm9tIHRoZSBhc3NlbWJsZXIuCi0JQ2hhbmdlIGRlZmF1bHQgbWNvcmUgbWFjaGluZSBuYW1lIHRvICdtY29yZS1sZScgYW5kIHJlbmFtZQotCWJpZy1lbmRpYW4gdmVyc2lvbiB0byAnbWNvcmUtYmUnLiAKLQotMTk5OS0xMC0yNyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9iZmQpOiBCcmVhayBpbnRvIHR3byBmdW5jdGlvbnMuICBUaGUKLQlhY3R1YWwgZHVtcGluZyBjb2RlIG1vdmVzIHRvIGR1bXBfYmZkLiAgSWYgYmZkIGlzIG5vdAotCXVuYW1iaWd1b3VzbHkgcmVjb2duaXplZCBhcyBhIGJmZF9vYmplY3QsIGF0dGVtcHQgdG8gZHVtcAotCWl0IGFzIGEgYmZkX2NvcmUuCi0JKGR1bXBfYmZkKTogTmV3IGZ1bmN0aW9uLgotCi0xOTk5LTEwLTI2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGFzc2VtYmxlX2ZpbGUpOiBSZW1vdmUgc3B1cmlvdXMgdGVzdCBvZiBleHBfbmFtZS4KLQotMTk5OS0xMC0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChzdHJ1Y3QgbWFjKTogQWRkIG5ldyBmaWVsZCAnaG93X2RlZmF1bHRfYXNfc3dpdGNoZXMnLgotCShtdGFibGUpOiBJbml0aWFsaXNlIG5ldyBmaWVsZC4gIFNvbWUgbWFjaGluZXMgaGF2ZSBhIG5vbiBlbXB0eQotCXN0cmluZyBmb3IgdGhpcyBmaWVsZC4KLQkoSE9XX0JGRF9UQVJHRVQpOiBVbmRlZmluZSBhbmQgcmVwbGFjZSB3aXRoLi4uCi0JKEhPV19CRkRfUkVBRF9UQVJHRVQpOiBOZXcgbWFjcm86IGJmZCB0YXJnZXQgdG8gdXNlIHdoZW4gb3BlbmluZyBhCi0JZmlsZSBmb3IgcmVhZGluZy4gIFRoaXMgaXMgc2V0IHRvIDAgc28gdGhhdCBhbnkgcmVjb2duaXNhYmxlIGJmZAotCWZvcm1hdCBjYW4gYmUgcmVhZC4KLQkoSE9XX0JGRF9XUklURV9UQVJHRVQpOiBOZXcgbWFjcm86IGJmZCB0YXJnZXQgdG8gdXNlIHdoZW4gb3BlbmluZwotCWEgZmlsZSBmb3Igd3JpdGluZy4gIFRoaXMgaXMgc2V0IHRvIHRoZSB0YXJnZXQgbWFjaGluZSB0eXBlLgotCShBU01fU1dJVENIRVMpOiBOZXcgbWFjcm86IGRlZmF1bHQgc3dpdGNoZXMgdG8gdXNlIHdoZW4gYXNzZW1ibGluZwotCWEgZmlsZS4KLQkoYXNzZW1ibGVfZmlsZSk6IE5ldyBmdW5jdGlvbjogQXNzZW1ibGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEKLQlkZXN0aW5hdGlvbiBvYmplY3QgZmlsZS4KLQkoZ2VuX2V4cF9maWxlKTogVXNlIGFzc2VtYmxlX2ZpbGUgdG8gY3JlYXRlIHRoZSBleHAgZmlsZS4KLQkobWFrZV9vbmVfbGliX2ZpbGUpOiBVc2UgYXNzZW1ibGVfZmlsZSB0byBjcmVhdGUgdGhlIGxpYiBmaWxlLgotCU9wZW4gb3V0cHV0IGZpbGUgdXNlIEhPV19CRkRfV1JJVEVfVEFSR0VUIGFuZCBpbnB1dCBmaWxlcyB1c2luZwotCUhPV19CRkRfUkVBRF9UQVJHRVQuCi0JKG1ha2VfaGVhZCk6IFVzZSBhc3NlbWJsZV9maWxlIHRvIGNyZWF0ZSB0aGUgaGVhZCBmaWxlLgotCShtYWtlX3RhaWwpOiBVc2UgYXNzZW1ibGVfZmlsZSB0byBjcmVhdGUgdGhlIHRhaWwgZmlsZS4KLQkoZ2VuX2xpYl9maWxlKTogT3BlbiBvdXRwdXQgZmlsZSB1c2UgSE9XX0JGRF9XUklURV9UQVJHRVQuCi0KLTE5OTktMTAtMTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBhci5jIChub3JtYWxpemUpOiBGaXggZnVsbF9wYXRobmFtZSBjb2RlLgotCi0xOTk5LTEwLTA4ICBCZW4gRWxsaXN0b24gIDxiamVAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGJpbnV0aWxzLnRleGk6IFNvbWUgcmV3b3JkaW5nIGFuZCBjbGFyaWZpY2F0aW9ucy4KLQotMTk5OS0wOS0xNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHluYW1pY19zZWdtZW50X3BhcmlzY192YWwpOiBQcmludCAwIGZvciBETERfRkxBR1MgaWYKLQl0aGUgdmFsdWUgaXMgemVyby4KLQkocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBEb24ndCBwcmludCBoaXN0b2dyYW0gaWYgaGFzaCB0YWJsZSBpcyBlbXB0eS4KLQotMTk5OS0wOS0xNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X3BhcmlzY19keW5hbWljX3R5cGUpOiBIYW5kbGUgRFRfSFBfR1NUXyogdmFsdWVzLgotCi0xOTk5LTA5LTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfc3ltYm9sX3R5cGUpOiBBZGQgc3VwcG9ydCBmb3IgSFBVWCBhbmQgUEFSSVNDCi0Jc3BlY2lmaWMgc3ltYm9sIHR5cGVzLgotCi0JKiByZWFkZWxmLmM6IEFkZCBIUFVYIGFuZCBQQVJJU0MgZXh0ZW5zaW9ucyB0byBkeW5hbWljIGFuZCBwcm9ncmFtCi0JaGVhZGVyIHRhYmxlIHByaW50aW5nLgotCi0JKiByZWFkZWxmLmMgKGdldF9tYWNoaW5lX2ZsYWdzKTogQWRkIGhhbmRsaW5nIG9mIFBBUklTQy4KLQotMTk5OS0wOS0yOSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGRsbHRvb2wuYyAoc2Nhbl9kcmVjdHZlX3N5bWJvbHMpOiBIYW5kbGUgdHlwZSB0YWdzIGluIGV4cG9ydGVkCi0Jc3ltYm9scy4KLQkoc2Nhbl9maWx0ZXJlZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLTE5OTktMDktMTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiByZXNyYy5jICh3cml0ZV9yY19yY2RhdGEpOiBGaXggbG9jYWwgdmFyaWFibGUgc2hhZG93aW5nCi0JcHJvYmxlbS4gIElmIFJDREFUQV9CVUZGRVIgZGF0YSBjYW4gYmUgcmVhZCBhcyBzdHJpbmdzLCBtb2RpZnkKLQljb2RlIHRvIHByaW50IHRoZSBzdHJpbmdzIGFzIGNvbW1lbnRzLgotCSogcmVzcmVzLmM6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkod3JpdGVfcmVzX2RhdGEsIHJlYWRfcmVzX2RhdGEpOiBEb24ndCBwdXQgdGhlIHByb2dyYW0gbmFtZSBpbiB0aGUKLQllcnJvciBtZXNzYWdlOyBmYXRhbCBhbHJlYWR5IHB1dHMgaXQgdGhlcmUuCi0KLTE5OTktMDktMTQgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKENhbm9uaWNhbGl6YXRpb24gb2YgdGFyZ2V0IG5hbWVzKTogUmVtb3ZlIGFkZGluZwotCSR7Q09ORklHX1NIRUxMfSBpbiBmcm9udCBvZiAkYWNfY29uZmlnX3N1Yiwgc2luY2UgYXV0b2NvbmZpZyAyLjE0Ci0JZ2VuZXJhdGVzICRhY19jb25maWdfc3ViIHdpdGggYSAke0NPTkZJR19TSEVMTH0gYWxyZWFkeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMTk5OS0wOS0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFyLmMgKG1haW4pOiBDbGVhciBvdXRwdXRfZmlsZSBpZiB3ZSBkb24ndCBjaGFuZ2UgdGhlIGFyY2hpdmUuCi0JKGRlbGV0ZV9tZW1iZXJzLCByZXBsYWNlX21lbWJlcnMpOiBMaWtld2lzZS4KLQotMTk5OS0wOS0xMiAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9oZWFkZXJzKTogSWYgd2lkZV9vdXRwdXQsIHByaW50IEZsYWdzIGhlYWRlci4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogUHJpbnQgYW55IGNvbWRhdCBpbmZvcm1hdGlvbi4KLQotCSogb2JqY29weS5jIChwYXJzZV9mbGFncyk6IEhhbmRsZSAibm9sb2FkIiwgImRlYnVnIiwgYW5kICJzaGFyZSIuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IG5ldyBmbGFncy4KLQotCSogYXIuYyAoY291bnRlZF9uYW1lX21vZGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjb3VudGVkX25hbWVfY291bnRlcik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1hcF9vdmVyX21lbWJlcnMpOiBIYW5kbGUgY291bnRlZCBtb2RlLgotCSh1c2FnZSk6IE1lbnRpb24gTiBtb2RpZmllci4KLQkobWFpbik6IEhhbmRsZSBOIG1vZGlmaWVyLgotCShkZWxldGVfbWVtYmVycyk6IEhhbmRsZSBjb3VudGVkIG1vZGUuCi0JKiBiaW51dGlscy50ZXhpLCBhci4xOiBEb2N1bWVudCBOIG1vZGlmaWVyLgotCi0JKiBhci5jIChwcmludF9jb250ZW50cyk6IENoYW5nZSBwcmludGluZyBvZiBtZW1iZXIgbmFtZSBmb3IKLQlQT1NJWC4yIGNvbmZvcm1hbmNlLgotCi0JKiBhci5jIChvdXRwdXRfZmlsZW5hbWUpOiBNYWtlIGNvbnN0LgotCShvcGVuX2luYXJjaCk6IElmIGNyZWF0aW5nIGEgbmV3IGVtcHR5IGFyY2hpdmUsIHNldAotCW91dHB1dF9maWxlbmFtZS4KLQotMTk5OS0wOS0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFyLmMgKGZ1bGxfcGF0aG5hbWUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtYXBfb3Zlcl9tZW1iZXJzKTogQ2FsbCBub3JtYWxpemUgb24gY29tbWFuZCBsaW5lIHBhcmFtZXRlci4KLQkodXNhZ2UpOiBNZW50aW9uIFAgbW9kaWZpZXIuCi0JKG5vcm1hbGl6ZSk6IElmIGZ1bGxfcGF0aG5hbWUgaXMgdHJ1ZSwgZG9uJ3QgZG8gYW55dGhpbmcuCi0JKG1haW4pOiBBY2NlcHQgUCBtb2RpZmllci4KLQkoZGVsZXRlX21lbWJlcnMpOiBDYWxsIG5vcm1hbGl6ZSBvbiBjb21tYW5kIGxpbmUgcGFyYW1ldGVyLgotCSogYmludXRpbHMudGV4aSwgYXIuMTogRG9jdW1lbnQgUCBtb2RpZmllci4KLQotMTk5OS0wOS0wOSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KLQotCSogYmludXRpbHMudGV4aTogQWRkIGluZm8gZGlyIGVudHJpZXMgZm9yIGFsbCBwcm9ncmFtcyBkZXNjcmliZWQKLQloZXJlLiAgRml4IGFyZ3VtZW50cyBvZiBAdmFyIHRvIG5vdCBjb250YWluIHB1bmN0dWF0aW9uLgotCi0xOTk5LTA5LTA2ICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogbm0uYyAocHJpbnRfc3ltYm9sX2luZm9fYnNkKTogQ2hlY2sgZm9yICd3JyBhcyB3ZWxsIGFzICdVJy4KLQkocHJpbnRfc3ltYm9sX2luZm9fc3lzdik6IExpa2V3aXNlLgotCShwcmludF9zeW1ib2xfaW5mb19wb3NpeCk6IExpa2V3aXNlLgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIHJlYWRlbGYuYzogSW5jbHVkZSAiZWxmL3BqLmgiLgotCShkdW1wX3JlbG9jYXRpb25zKTogSGFuZGxlIEVNX1BKLgotCShnZXRfbWFjaGluZV9uYW1lKTogTGlrZXdpc2UuCi0JKGdldF9tYWNoaW5lX2ZsYWdzKTogTGlrZXdpc2UuCi0KLTE5OTktMDgtMzEgIFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQG5ldHdpbmRlci5vcmc+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X25vdGVfdHlwZSk6IE5ldyBmdW5jdGlvbjogIERlY29kZSB0aGUgZV90eXBlCi0JdmFsdWUgb2YgYSBub3RlLgotCShwcm9jZXNzX25vdGUpOiBOZXcgZnVuY3Rpb246IERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIGEgY29yZSBub3RlLgotCShwcm9jZXNzX2NvcmVmaWxlX25vdGVfc2VnbWVudCk6IE5ldyBmdW5jdGlvbi4KLQkocHJvY2Vzc19jb3JlZmlsZV9ub3RlX3NlZ21lbnRzKTogTmV3IGZ1bmN0aW9uLgotCShwcm9jZXNzX2NvcmVmaWxlX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLgotCShwcm9jZXNzX2ZpbGUpOiBBZGQgY2FsbCB0byBwcm9jZXNzX2NvcmVmaWxlX2NvbnRlbnRzLgotCShwYXJzZV9hcmdzKTogQWRkIHBhcnNpbmcgb2YgLW4vLS1ub3RlcyBjb21tYW5kIGxpbmUgc3dpdGNoLgotCSh1c2FnZSk6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoLgotCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVtbnQgbmV3IGNvbW1hbmQgbGluZSBzd2l0Y2ggdG8gcmVhZGVsZi4KLQotMTk5OS0wOC0zMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGkgKEJ1ZyBSZXBvcnRpbmcpOiBDbGFyaWZ5IHRoYXQgbGFyZ2UgZmlsZXMgc2hvdWxkCi0Jbm90IGJlIHNlbnQgdG8gYnVnLWdudS11dGlscy4KLQotMTk5OS0wOC0yOCAgU3RlcGhhbmUgQ2FycmV6ICA8c3RjYXJyZXpAd29ybGRuZXQuZnI+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19leHRlbmRlZF9saW5lX29wKTogTmV3IHBhcmFtZXRlciBwb2ludGVyX3NpemUsCi0JcmVhZCB0aGUgYWRkcmVzcyBhY2NvcmRpbmcgdG8gcG9pbnRlcl9zaXplLgotCShkZWJ1Z19saW5lX3BvaW50ZXJfc2l6ZSk6IE5ldyBnbG9iYWwgdG8gaW5kaWNhdGUgdGhlCi0Jc2l6ZSBvZiBhZGRyZXNzIGluIC5kZWJ1Z19saW5lIHNlY3Rpb24uCi0JKGRlYnVnX2Rpc3BsYXlzLCBwcmVzY2FuX2RlYnVnX2luZm8pOiBQcmVzY2FuIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uCi0JdG8gcmVjb3JkIHRoZSBzaXplIG9mIGFkZHJlc3MgaW4gYGRlYnVnX2xpbmVfcG9pbnRlcl9zaXplJy4KLQkocHJvY2Vzc19zZWN0aW9uX2NvbnRlbnRzKTogQmVmb3JlIGR1bXBpbmcgYW55IHNlY3Rpb24sIGV4ZWN1dGUKLQl0aGUgcHJlLXNjYW4gb3BlcmF0aW9uIGRlZmluZWQgZm9yIHNvbWUgZGVidWcgc2VjdGlvbnMuCi0KLTE5OTktMDgtMjcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkaXNwbGF5X2RlYnVnX2xpbmVzKTogVXNlIGktMSBub3QgaSBpbiBzdGFuZGFyZF9vcGNvZGVzCi0JYWNjZXNzLgotCShkaXNwbGF5X2RlYnVnX2FyYW5nZXMpOiBOZXcgbG9jYWwgZXhjZXNzLiAgVXNlIGZvciBjYWxjdWxhdGluZyBwYWRkaW5nCi0JYW5kIGFkZCB0aGF0IGludG8gcmFuZ2VzLiAgQnJlYWsgZnJvbSBsb29wIG9ubHkgaWYgbGVuZ3RoIGlzIGFsc28gMC4KLQotMTk5OS0wOC0yNyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGRpc3BsYXlfZGVidWdfbGluZXMsIGNhc2UgRFdfTE5TX2NvbnN0X2FkZF9wYyk6IE11bHRpcGx5Ci0JYWR2IGJ5IGluZm8ubGlfbWluX2luc25fbGVuZ3RoLgotCi0xOTk5LTA4LTI2ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X3NwYXJjNjRfZHluYW1pY190eXBlKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfZHluYW1pY190eXBlKTogVXNlIGl0LgotCi0xOTk5LTA4LTI2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZGlzcGxheV9kZWJ1Z19saW5lcywgY2FzZSBkZWZhdWx0KTogQ2hhbmdlIHNlY29uZCBsaW5lCi0Jc2V0dGluZwlhZHYgdG8gdXNlID0gbm90ICs9LgotCi0xOTk5LTA4LTE5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmM6IEFkZGVkIG1vcmUgZXhhbXBsZXMgdG8gdGhlIGNvbW1lbnQgYXQgdGhlIHN0YXJ0LgotCi0xOTk5LTA4LTE4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1ha2VfaGVhZCk6IE9ubHkgZW1pdCBpbnRlcndvcmtpbmcgZGlyZWN0aXZlIGlmCi0JbmVjZXNzYXJ5LgotCi1UaHUgSnVsIDE1IDIyOjQ0OjIxIDE5OTkgIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGJpdHJhbmdlLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX2FiYnJldl9zZWN0aW9uKTogSGFuZGxlIHN0YW5kYXJkLWNvbmZvcm1pbmcKLQlzaW5nbGUgemVybyBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uLgotCi0xOTk5LTA4LTA5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogb2JqZHVtcC5jIChleGl0X3N0YXR1cyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG5vbmZhdGFsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBleGl0X3N0YXR1cyBvbiBlcnJvci4KLQkocmVhZF9zZWN0aW9uX3N0YWJzKTogTGlrZXdpc2UuCi0JKGRpc3BsYXlfYmZkKTogTGlrZXdpc2UuICBDYWxsIG5vbmZhdGFsIHJhdGhlciB0aGFuIGJmZF9ub25mYXRhbC4KLQkoZGlzcGxheV9maWxlKTogQ2FsbCBub25mYXRhbCByYXRoZXIgdGhhbiBiZmRfbm9uZmF0YWwuCi0JKGRpc3BsYXlfdGFyZ2V0X2xpc3QsIGRpc3BsYXlfaW5mb190YWJsZSk6IExpa2V3aXNlLgotCShtYWluKTogUmV0dXJuIGV4aXRfc3RhdHVzIHJhdGhlciB0aGFuIDAuCi0KLTE5OTktMDgtMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBVcGRhdGUgZm9yIHJlbmFtaW5nIG9mCi0JU0VDX1NIT1JUIHRvIFNFQ19TTUFMTF9EQVRBLiAgUHJpbnQgU0VDX1NIQVJFRCBmbGFnLgotCi0JRnJvbSBFbGkgWmFyZXRza2lpIDxlbGl6QGdudS5vcmc+OgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgY3h4ZmlsdCBhcyBNUy1ET1MgbmFtZSBmb3IgYysrZmlsdC4KLQotCSogY29uZmlndXJlLmluOiBEZWZpbmUgYW5kIHN1YnN0aXR1dGUgREVNQU5HTEVSX05BTUUuCi0JKiBNYWtlZmlsZS5hbSAoREVNQU5HTEVSX1BST0cpOiBTZXQgdG8gY3h4ZmlsdC4KLQkobWFuX01BTlMpOiBVc2UgREVNQU5HTEVSX05BTUUgcmF0aGVyIHRoYW4gREVNQU5HTEVSX1BST0cuCi0JKGJpbl9QUk9HUkFNUyk6IFJlbW92ZSAkKERFTUFOR0xFUl9QUk9HKS4KLQkobm9pbnN0X1BST0dSQU1TKTogQWRkICQoREVNQU5HTEVSX1BST0cpLgotCShjeHhmaWx0X1NPVVJDRVMpOiBSZW5hbWUgZnJvbSBjX19maWx0X1NPVVJDRVMuCi0JKGN4eGZpbHRfTERBREQpOiBSZW5hbWUgZnJvbSBjX19maWx0X0xEQURELgotCSgkKERFTUFOR0xFUl9OQU1FKS4xKTogUmVuYW1lIGZyb20gJChERU1BTkdMRVJfUFJPRykuMS4gIFVzZQotCURFTUFOR0xFUl9OQU1FIHJhdGhlciB0aGFuIERFTUFOR0xFUl9QUk9HIGluIHN1YnN0aXR1dGlvbi4KLQkoTU9TVExZQ0xFQU5GSUxFUyk6IFVzZSBERU1BTkdMRVJfTkFNRSByYXRoZXIgdGhhbgotCURFTUFOR0xFUl9QUk9HLgotCShpbnN0YWxsLWV4ZWMtbG9jYWwpOiBXaGVuIGluc3RhbGxpbmcgbm9pbnN0X1BST0dSQU1TLCBjaGFuZ2UKLQljeHhmaWx0IHRvICQoREVNQU5HTEVSX05BTUUpLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW06IFJlbmFtZSAuZGVwKiBmaWxlcyB0byBERVAqLiAgQ2hhbmdlIERFUCB2YXJpYWJsZSB0bwotCU1LREVQLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDgtMDUgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoWUFDQyk6IElmIGJpc29uIGlzIG5vdCBpbiB0aGUgc291cmNlIHRyZWUsIHVzZQotCUBZQUNDQCByYXRoZXIgdGhhbiBiaXNvbiAteS4KLQkoTEVYKTogSWYgZmxleCBpcyBub3QgaW4gdGhlIHNvdXJjZSB0cmVlLCB1c2UgQExFWEAgcmF0aGVyIHRoYW4KLQlmbGV4LgotCSogY29uZmlndXJlLmluOiBCdWlsZCBkbGx0b29sIGZvciBpWzMtNl04Ni0qLWludGVyaXguCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA3LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gTWFyayBFbGJyZWNodDoKLQkqIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZTsgb2Jzb2xldGUuCi0KLTE5OTktMDctMTYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogcmVhZGVsZi5jIChnZXRfbWFjaGluZV9mbGFncyk6IFByaW50IEVGX1NQQVJDX1NVTl9VUzMuCi0KLTE5OTktMDctMTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEJ1bXAgdmVyc2lvbiBudW1iZXIgdG8gMi45LjUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDctMTQgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX2hlYWRlcik6IFByaW50IFNFQ19TSE9SVC4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IENoYW5nZXMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzOiBBZGQgQVRUUklCVVRFX1VOVVNFRAotCWFzIGFwcHJvcHJpYXRlLiAgQWRkIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucy4gIEFkZCBjYXN0cy4KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBDaGFuZ2UgaiB0byBiZmRfdm1hLgotCSogcmVhZGVsZi5jIChwcm9jZXNzX3N5bWluZm8pOiBDaGFuZ2UgaSB0byB1bnNpZ25lZCBpbnQuCi0JKGRpc3BsYXlfZGVidWdfaW5mbyk6IENoYW5nZSBhYmJyZXZfbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmcuCi0JKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IENoYW5nZSBmY250IHRvIHNpemVfdC4KLQotMTk5OS0wNy0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBPbmx5IHN1cHBvcnQgZGVjb2RpbmcgNjRiaXQgRUxGIGZpbGVzIGlmIHRoZSBjb21waWxlcgotCXN1cHBvcnRzIGEgNjQgYml0IGRhdGEgdHlwZS4KLQlBZGQgLUkgZXF1aXZhbGVudCBmb3IgLS1oaXN0b2dyYW0uCi0JQWRkIC1BIGNvbW1hbmQtbGluZSBvcHRpb24gdG8gZGlzcGxheSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0KLTE5OTktMDctMDggIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogcmVhZGVsZi5jIChndWVzc19pc19yZWxhKTogU3BhcmN2OSBhbmQgdjhwbHVzIHVzZSByZWxhLgotCShkdW1wX3JlbG9jYXRpb25zKTogVXNlIEVMRjY0X1JfVFlQRV9JRCBmb3IgU3BhcmMsIGZvciBSX1NQQVJDX09MTzEwCi0JcHJpbnQgdGhlIHNlY29uZGFyeSBhZGRlbmQuCi0JKGdldF9tYWNoaW5lX2ZsYWdzKTogUHJpbnQgU3BhcmMgbWFjaGluZSBmbGFncy4KLQkoZ2V0X3N5bWJvbF90eXBlKTogUHJpbnQgU1RUX1JFR0lTVEVSLgotCi0xOTk5LTA3LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl90eXBlKTogRml4IGhhbmRsaW5nIG9mIHRlbXBsYXRlIG5hbWVzIHdpdGgKLQl0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGNvbnRhaW5pbmcgYDo6Jy4KLQkoc3RhYl9kZW1hbmdsZV90eXBlKTogSGFuZGxlIGEgcXVhbGlmaWVkIG5hbWUgaW4gYSBwb2ludGVyIHRvCi0JbWVtYmVyLgotCi0xOTk5LTA2LTIzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGRsbHRvb2xfU09VUkNFUyk6IEFkZCBkeW4tc3RyaW5nLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wNi0yMyAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoSEFWRV9FWEVDVVRBQkxFX1NVRkZJWCk6IERlZmluZS4KLQkqIGRsbHRvb2wuYyAobG9va19mb3JfcHJvZyk6IFVzZSBIQVZFX0VYRUNVVEFCTEVfU1VGRklYLgotCSogZGxsd3JhcC5jIChsb29rX2Zvcl9wcm9nKTogTGlrZXdpc2UuCi0JKiByZXNyYy5jIChsb29rX2Zvcl9kZWZhdWx0KTogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wNi0yMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gTXVtaXQgS2hhbiA8a2hhbkB4cmF5bGl0aC53aXNjLkVEVT46Ci0JKiBjb25maWd1cmUuaW46IERlZmluZSBFWEVDVVRBQkxFX1NVRkZJWC4KLQkqIGRsbHRvb2wuYzogSW5jbHVkZSAiZHluLXN0cmluZy5oIi4gIEluY2x1ZGUgPHN0ZGFyZy5oPiBiYXNlZCBvbgotCUFOU0lfUFJPVE9UWVBFUywgbm90IF9fU1REQ19fLgotCShvdXRmaWxlKTogUmVtb3ZlLgotCShnZW5fZXhwX2ZpbGUpOiBDaGFuZ2UgdXNlcyBvZiBvdXRmaWxlIHRvIHVzZSBhbGxvY2EuCi0JKG1ha2Vfb25lX2xpYl9maWxlLCBtYWtlX2hlYWQsIG1ha2VfdGFpbCk6IExpa2V3aXNlLgotCShnZW5fbGliX2ZpbGUpOiBMaWtld2lzZS4KLQkobG9va19mb3JfcHJvZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGRlZHVjZV9uYW1lKTogUmV3cml0ZSB0byB1c2UgbG9va19mb3JfcHJvZy4KLQkobWNvcmVfZWxmX2dlbl9vdXRfZmlsZSk6IFVzZSBkeW5fc3RyaW5nX3QgcmF0aGVyIHRoYW4gb3V0ZmlsZS4KLQkqIGRsbHdyYXAuYzogRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4sIDxlcnJuby5oPiwgPHN0cmluZy5oPiwKLQk8c3RkbGliLmg+LCBvciA8dW5pc3RkLmg+LiAgSW5jbHVkZSA8c3lzL3N0YXQuaD4gYW5kIGVpdGhlcgotCTxzdGRhcmcuaD4gb3IgPHZhcmFyZ3MuaD4uCi0JKGRyaXZlcl9uYW1lKTogSW5pdGlhbGl6ZSB0byBOVUxMLCBub3QgImdjYyIuCi0JKGRsbHRvb2xfbmFtZSk6IEluaXRpYWxpemUgdG8gTlVMTCwgbm90ICJkbGx0b29sIi4KLQkoZGlzcGxheSwgaW5mb3JtLCBsb29rX2Zvcl9wcm9nLCBkZWR1Y2VfbmFtZSk6IE5ldyBzdGF0aWMKLQlmdW5jdGlvbnMuCi0JKHVzYWdlKTogTWVudGlvbiAtbW5vLWN5Z3dpbi4KLQkoT1BUSU9OX01OT19DWUdXSU4pOiBEZWZpbmUuCi0JKG1haW4pOiBIYW5kbGUgLW1uby1jeWd3aW4uICBEZWR1Y2UgZHJpdmVyX25hbWUgYW5kIGRsbHRvb2xfbmFtZS4KLQkqIHJlc3JjLmMgKGxvb2tfZm9yX2RlZmF1bHQpOiBNYWtlIHN0YXRpYy4gIFJlbW92ZSB1bnVzZWQgbG9jYWwKLQlwYXRoLiAgQ2hlY2sgdXNpbmcgRVhFQ1VUQUJMRV9TVUZGSVguCi0JKHJlYWRfcmNfZmlsZSk6IEFsbG9jYXRlIGVub3VnaCBzcGFjZSB0byBob2xkIEVYRUNVVEFCTEVfU1VGRklYLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShkbGx3cmFwX0xEQUREKTogQWRkICQoSU5UTExJQlMpLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi1Nb24gSnVuIDIxIDE2OjQ5OjExIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IFVzZSBlbGZfaHBwYV9yZWxvY190eXBlIGluc3RlYWQgb2YKLSAgICAgICAgZWxmMzJfaHBwYV9yZWxvY190eXBlLgotCi0xOTk5LTA2LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUpOiBMaW5rIG9iamVjdCBmaWxlcyB3aXRoIHRoZQotCS5leHAgZmlsZSwgbm90IHRoZSAubGliIGZpbGUuCi0KLUZyaSBKdW4gMTggMjA6MTc6NTEgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGRlZmxleC5sOiBBY2NlcHQgc2luZ2xlLWNoYXJhY3RlciBzeW1ib2wgbmFtZXMuCi0KLTE5OTktMDYtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X3N5bWJvbF90eXBlKTogRGV0ZWN0IEFSTSBzeW1ib2xzIHR5cGVkIGFzIFRodW1iCi0JZnVuY3Rpb25zLgotCi0xOTk5LTA2LTE0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlcl9vcHRpb25zKTogTmV3IHZhcmlhYmxlLgotCSh1c2FnZSk6IERvY3VtZW50IG5ldyAtTS8tLWRpc2Fzc2VtYmxlci1vcHRpb25zIG9wdGlvbi4KLQkobG9uZ19vcHRpb25zKTogQWRkIC0tZGlzYXNzZW1ibGVyLW9wdGlvbnMuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBJbml0aWFsaXNlIGRpc2Fzc2VtYmxlcl9vcHRpb25zIGZpZWxkIG9mCi0JZGlzYXNzZW1ibGVyX2luZm8gc3RydWN0dXJlLgotCShtYWluKTogQWRkIHBhcnNpbmcgb2YgLU0gb3B0aW9uLgotCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCBuZXcgY29tbWFuZCBsaW5lIHN3aXRjaCB0byBvYmpkdW1wLgotCi0JKiBORVdTOiBEZXNjcmliZSBuZXcgY29tbWFuZCBsaW5lIHN3aXRjaCB0byBvYmpkdW1wLgotCi0KLU1vbiBKdW4gMTQgMTA6Mjc6NTQgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBiaW51dGlscy50ZXhpOiBGaXggdHlwb3MuCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogSWYgdGhlIGRpc2Fzc2VtYmxlciByZXR1cm5zIGFuCi0JZXJyb3IsIHByaW50IG91dCBhbnl0aGluZyBpdCBtYXkgaGF2ZSBwcmludGVkIHRvIHRoZSBidWZmZXIuICBGcm9tCi0JSC5KLiBMdSA8aGpsQGdudS5vcmc+LgotCi0JKiBkZWZwYXJzZS55IChleHBsaXN0KTogUmVtb3ZlIHNlcGFyYXRlIGV4cGxpbmUgdG8gZWxpbWluYXRlCi0Jc2hpZnQvcmVkdWNlIGNvbmZsaWN0LgotCi0JRnJvbSBLYWktVXdlIFJvbW1lbCA8cm9tbWVsQGFycy5kZT46Ci0JKiBkZWZwYXJzZS55OiBBZGQgdG9rZW5zIE5PTlNIQVJFRCwgU0lOR0xFLCBNVUxUSVBMRSwKLQlJTklUSU5TVEFOQ0UsIElOSVRHTE9CQUwsIFRFUk1JTlNUQU5DRSwgYW5kIFRFUk1HTE9CQUwuCi0JKGNvbW1hbmQpOiBBZGQgb3B0aW9uX2xpc3QgYWZ0ZXIgTElCUkFSWS4KLQkoYXR0cik6IEFjY2VwdCBhbmQgaWdub3JlIE5PTlNIQVJFRCwgU0lOR0xFLCBhbmQgTVVMVElQTEUuCi0JKG9wdGlvbl9saXN0LCBvcHRpb24pOiBOZXcgbm9udGVybWluYWxzLgotCSogZGVmbGV4Lmw6IFJlY29nbml6ZSBOT05TSEFSRUQsIFNJTkdMRSwgTVVMVElQTEUsIElOSVRJTlNUQU5DRSwKLQlJTklUR0xPQkFMLCBURVJNSU5TVEFOQ0UsIGFuZCBURVJNR0xPQkFMLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYXIuYyAoT19CSU5BUlkpOiBEZWZpbmUgYXMgMCBpZiBub3QgZGVmaW5lZC4KLQkocmFubGliX3RvdWNoKTogT3BlbiBmaWxlIHdpdGggT19CSU5BUlkuCi0KLQkqIHJlbmFtZS5jIChPX0JJTkFSWSk6IERlZmluZSBhcyAwIGlmIG5vdCBkZWZpbmVkLgotCShzaW1wbGVfY29weSk6IE9wZW4gZmlsZXMgd2l0aCBPX0JJTkFSWS4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC4gUGV0ZXIgQW52aW4gPGhwYUB0cmFuc21ldGEuY29tPjoKLQkqIG9iamNvcHkuYyAoc3RydWN0IHNlY3Rpb25fbGlzdCk6IEFkZCBjb3B5IGZpZWxkLgotCShzZWN0aW9uc19jb3BpZWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjb3B5X29wdGlvbnMpOiBBZGQgIm9ubHktc2VjdGlvbiIuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC1qIGFuZCAtLW9ubHktc2VjdGlvbi4KLQkoZmluZF9zZWN0aW9uX2xpc3QpOiBJbml0aWFsaXplIGNvcHkgZmllbGQuCi0JKGlzX3N0cmlwX3NlY3Rpb24pOiBDaGVjayBmb3IgY29weWluZyBzZWN0aW9ucy4KLQkoY29weV9vYmplY3QpOiBDaGVjayBzZWN0aW9uc19jb3BpZWQgd2hlbiBjYWxsaW5nIGZpbHRlcl9zeW1ib2xzLgotCShzZXR1cF9zZWN0aW9uKTogQ2hlY2sgZm9yIGNvcHlpbmcgc2VjdGlvbnMuCi0JKGNvcHlfc2VjdGlvbik6IExpa2V3aXNlLgotCShjb3B5X21haW4pOiBIYW5kbGUgLWovLS1vbmx5LXNlY3Rpb24uCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC1qLy0tb25seS1zZWN0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IElmIGZyZXhwIGlzIG5vdCBhdmFpbGFibGUsIGNoZWNrIGluIC1sbS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogcmVhZGVsZi5jIChnZXRfZWxmX2NsYXNzKTogVXNlIGNvcnJlY3QgcHJpbnRmIGZvcm1hdCBmb3IgdHlwZS4KLQkoZ2V0X2RhdGFfZW5jb2RpbmcpOiBMaWtld2lzZS4KLQkoZ2V0X29zYWJpX25hbWUpOiBMaWtld2lzZS4KLQkocHJvY2Vzc19maWxlX2hlYWRlcik6IERvbid0IHBhc3MgYW4gZXh0cmEgYXJndW1lbnQgdG8gcHJpbnRmLgotCShwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IENhc3QgZHluYW1pY19zaXplIHRvIGxvbmcgYmVmb3JlCi0JcHJpbnRpbmcuCi0JKGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uKTogQ2FzdCBieXRlX2dldCB0byBsb25nIGJlZm9yZQotCXByaW50aW5nLgotCi1XZWQgSnVuICA5IDExOjQwOjE2IDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3NlY3Rpb24pOiBDYXN0IHZhbHVlcyBmcm9tIGJ5dGVfZ2V0IHRvCi0gCVt1bnNpZ25lZF0gbG9uZyBmb3IgcHJpbnRpbmcsIGluIGNhc2UgaXQgaXMgd2lkZXIgdGhhbiBsb25nLgotCShkaXNwbGF5X2Jsb2NrKTogTGlrZXdpc2UuCi0JKHJlYWRfYW5kX2Rpc3BsYXlfYXR0cik6IExpa2V3aXNlLgotCShkZWNvZGVfbG9jYXRpb25fZXhwcmVzc2lvbik6IExpa2V3aXNlLiAgRG9uJ3QgZGVwZW5kIG9uCi0gCWV2YWx1YXRpb24gb3JkZXIuCi0KLU1vbiBKdW4gIDcgMTI6MTQ6NTcgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiB3aW5kcmVzLmMgKHVzYWdlKTogRml4IHR5cG8uCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogVXNlIDY0Yml0IHdpZGUgZmllbGRzIGluIGludGVybmFsIHN0cmN1dHVyZXMgZXZlbiBpZgotCXRhcmdldHRpbmcgYSAzMmJpdCBhcmNoaXRlY3R1cmUuCi0JKGR1bXBfcmVsb2NhdGlvbnMpOiBUYWtlIGEgbmV3IHBhcmFtZXRlciAtIHRoZSBudW1iZXIgb2Ygc3ltYm9scwotCWluIHRoZSBzeW1ib2wgdGFibGUuCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogQWRkIHN1cHBvcnQgZm9yIDY0Yml0IEVMRiBmaWxlcy4KLQotMTk5OS0wNi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtY29yZV9lbGZfZ2VuX291dF9maWxlKTogVXNlIGNvbnN0YW50cyBmb3IgdGVtcG9yYXJ5Ci0JZmlsZSBuYW1lcy4KLQotV2VkIEp1biAgMiAxMjozNDozNiAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGdlbl9leHBfZmlsZSk6IFJldmVydCAxOTk5MDQxMSBjaGFuZ2UuCi0KLU1vbiBNYXkgMzEgMDk6NTY6MjIgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfcmVsb2NzKTogRGV0ZXJtaW5lIHR5cGUgb2YgcmVsb2MgZnJvbQotCURUX1BMVFJFTCBhbmQgZnJvbSBzZWN0aW9uIHR5cGUuCi0KLTE5OTktMDUtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X2VsZl9jbGFzcyk6IERpc3BsYXkgdW5rbm93biBjbGFzcyBudW1iZXIuCi0JKGdldF9kYXRhX2VuY29kaW5nKTogRGlzcGxheSB1bmtub3duIGVuY29kaW5nIG51bWJlci4KLQkoZ2V0X29zYWJpX25hbWUpOiBEaXNwbGF5IHVua25vd24gQUJJIG51bWJlci4KLQkocHJvY2Vzc19maWxlX2hlYWRlcik6IERpc3BsYXkgdW5rbm93biB2ZXJzaW9uIG51bWJlci4KLQotMTk5OS0wNS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogRml4IHR5cG8uCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IEFkZCBleHRyYSBwYXJhbWV0ZXI6IGlzX3JlbGEgdG8KLQlzcGVjaWZ5IHRoZSBraW5kIG9mIHJlbG9jYXRpb25zIHRvIGJlIGR1bXBlZC4gIENhbGwgZ3Vlc3NfaXNfcmVsYQotCWlmIHRoaXMgcGFyYW1ldGVyIGhhcyBhIHZhbHVlIG9mIFVOS05PV04uCi0JKGd1ZXNzX2lzX3JlbGEpOiBOZXcgZnVuY3Rpb246ICBHdWVzcyB0aGUga2luZCBvZiByZWxvYyBiZWluZyB1c2VkCi0JYmFjZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLgotCShwcm9jZXNzX3JlbG9jcyk6IERldGVybWluZSB0eXBlIG9mIHJlbG9jIGJlZm9yZSBjYWxsaW5nCi0JZHVtcF9yZWxvY2F0aW9ucy4KLQotMTk5OS0wNS0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHJlYWRlbGYuYzogSW5jbHVkZSAiZWxmL2k5NjAuaCIuCi0JKGR1bXBfcmVsb2NhdGlvbnMpOiBIYW5kbGUgRU1fOTYwLgotCi1UaHUgTWF5IDI3IDExOjU4OjMzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogb2JqY29weS5jIChjb3B5X2FyY2hpdmUpOiBQcmVzZXJ2ZSBkYXRlcyBvZiBhcmNoaXZlIG1lbWJlcnMgaWYKLQlyZXF1ZXN0ZWQuCi0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IEFsd2F5cyBwcmludCB0aGUgYWRkZW5kIG9uIFJFTEEKLQlzeXN0ZW1zIGV2ZW4gaWYgdGhlcmUgaXMgbm8gc3ltYm9sLgotCShwcm9jZXNzX3Byb2dyYW1faGVhZGVycyk6IFJlc2V0IGR5bmFtaWNfc2l6ZSBiZWZvcmUgbG9vcGluZwotCXRocm91Z2ggdGhlIHByb2dyYW0gaGVhZGVycy4KLQkocHJvY2Vzc192ZXJzaW9uX3NlY3Rpb25zKTogQ2FzdCBzaF9vZmZzZXQgdG8gdW5zaWduZWQgbG9uZyBmb3IKLQlwcmludGluZyBpbiBjYXNlIGJmZF92bWEgaXMgd2lkZXIuCi0JKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogVXNlIGdldF9zeW1ib2xfaW5kZXhfdHlwZSB3aGVuIHByaW50aW5nCi0Jc3Rfc2huZHguCi0KLTE5OTktMDUtMTcgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiB3aW5kcmVzLmM6IGFkZCB2ZXJib3NlIG9wdGlvbgotCShtYWluKTogcHJvY2VzcyB2ZXJib3NlIG9wdGlvbgotCSogcmVzcmMuYyAobG9va19mb3JfZGVmYXVsdCk6IG5ldy4gIExvb2sgZm9yIHRoZSBkZWZhdWx0Ci0JcHJlcHJvY2Vzc29yIGluIGEgZ2l2ZW4gbG9jYXRpb24uCi0JKHJlYWRfcmNfZmlsZSk6IGZvciBmb28vYmFyLXdpbmRyZXMsIGxvb2sgZm9yIGZvby9iYXItZ2NjLAotCWZvby9nY2MgKGluIGNhc2Ugb2YgZm9vL3dpbmRyZXMpLCBhbmQgdGhlbiBnY2MgKHRoZSBvbGQgZGVmYXVsdCkuCi0KLTE5OTktMDUtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZGVkdWNlX25hbWUpOiBOZXcgZnVuY3Rpb246IERlZHVjZSBuYW1lIG9mIHByb2dyYW0gdG8KLQlydW4uCi0JKG1jb3JlX2VsZl9vdXRfZmlsZSk6IE5ldyB2YXJpYWJsZTogTmFtZSBvZiBtY29yZS1lbGYgb3V0cHV0IGZpbGUuCi0JKG1jb3JlX2VsZl9saW5rZXIpOiBOZXcgdmFyaWFibGU6IE5hbWUgb2YgbGlua2VyIHRvIHVzZS4KLQkobWNvcmVfZWxmX2xpbmtlcl9mbGFncyk6IE5ldyB2YXJpYWJsZTogTGlua2VyIGZsYWdzIHRvIHBhc3MuCi0JKHNjYW5fb2JqX2ZpbGUpOiBDYWNoZSBmaWxlbmFtZXMgaWYgbmVjZXNzYXJ5LgotCSh1c2FnZSk6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQkobWFpbik6IFN1cHBvcnQgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zOiAtTSAoZ2VuZXJhdGUgYW4KLQltY29yZS1lbGYgb3V0cHV0IGZpbGUpIC1MIChuYW1lIG9mIGxpbmtlciB0byB1c2UpIC1GIChmbGFncyB0bwotCXBhc3MgdG8gbGlua2VyKS4KLQkobWNvcmVfZWxmX2NhY2hlX2ZpbGVuYW1lKTogU3RvcmUgYSBmaWxlbmFtZSBpbiBhIGNhY2hlLgotCShtY29yZV9lbGZfZ2VuX291dF9maWxlKTogTmV3IGZ1bmN0aW9uOiBHZW5lcmF0ZSBhbiBvdXRwdXQgZmlsZQotCXBlciB0aGUgbWNvcmUtZWxmIHNwZWMuCi0KLTE5OTktMDUtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQlVJTERfTUlTQyk6IEJ1aWxkIGRsbHRvb2wgZm9yIG1jb3JlCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBkbGx0b29sLmM6IFVwZGF0ZSBleGFtcGxlIGluIGNvbW1lbnQuCi0JKERMTFRPT0xfTUNPUkUpOiBEZWZpbmUuCi0JKERMTFRPT0xfTUNPUkVfRUxGKTogRGVmaW5lLgotCShEUkVDVFZFX1NFQ1RJT05fTkFNRSk6IERlZmluZS4KLQkobWNvcmVfYmVfanRhYiwgbWNvcmVfbGVfanRhYik6IEJpbmFyeSBmb3IgcGVyZm9ybWluZyBhbiBtY29yZQotCWp1bXAgdG8gYWRkcmVzcy4KLQkobXRhYmxlKTogQWRkIGVudHJpZXMgZm9yIG1jb3JlIHZhcmlhbnRzLgotCShydmFhZnRlciwgcnZhYmVmb3JlLCBhc21fcHJlZml4KTogQWRkIG1jb3JlIHN1cHBwb3J0LgotCShzY2FuX2RyZWN0dmVfc3ltYm9scyk6IFVzZSBEUkVDVFZFX1NFQ1RJT05fTkFNRS4KLQkobWFrZV9oZWFkLCBtYWtlX3RhaWwpOiBDb3BlIGlmIGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQuCi0JKHVzYWdlKTogSW1wcm92ZSBsYXlvdXQuCi0KLTE5OTktMDUtMTMgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiByY2xleC5sOiBhZGQgY29kZSB0byBzdXBwcmVzcyBjZXJ0YWluIG91dHB1dCBmcm9tIGNwcCwgcmVwbGFjZQotCWFsbCByZXR1cm5zIHdpdGggTUFZQkVfUkVUVVJOCi0JKE1BWUJFX1JFVFVSTik6IG5ldywgaW1wbGVtZW50IHRoZSBzdXBwcmVzc2lvbiBieSByZXR1cm5pbmcKLQlJR05PUkVEX1RPS0VOIGFzIG5lZWRlZC4KLQkoY3BwX2xpbmUpOiByZW1lbWJlciB3aGljaCBmaWxlIHdlJ3JlIGluLCBtYXJrIGRhdGEgZnJvbSBpbmNsdWRlZAotCSouaCBmaWxlcyBmb3Igc3VwcHJlc3Npb24uCi0JKiByY3BhcnNlLnkgKGlucHV0KTogYWxsb3cgSUdOT1JFRF9UT0tFTiBvdXRzaWRlIG9mIGtub3duIGNvbnN0cnVjdHMKLQotMTk5OS0wNS0xMCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHdpbmRyZXMuYyAocXVvdCk6IFF1b3RlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIGluIGEgc3RyaW5nCi0JKG1haW4pOiBxdW90ZSBwYXJhbWV0ZXJzIHRvIGNwcCB0aGF0IG1pZ2h0IGhhdmUgbWV0YWNoYXJhY3RlcnMgaW4KLQl0aGVtLiAgQWxsb3cgLUQgYXMgYW4gYWxpYXMgZm9yIC0tZGVmaW5lIHRvIGFsbG93IGZvciBzaGFyaW5nIG1ha2UKLQltYWNyb3Mgd2l0aCBnY2MuCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9yZWxvY19zZXQpOiBkb24ndCBjb3JlIGlmIGhvd3RvLT5uYW1lIGlzIE5VTEwKLQotCSogTWFrZWZpbGUuYW06IEdpdmUgcmVzY29mZi5jIGEgY3B1LXNwZWNpZmljIC1EIHNvIGl0IGNhbiBzZXQKLQl0aGUgY29ycmVjdCBCRkQuCi0JKiBNYWtlZmlsZS5pbjogZGl0dG8KLQkqIHJlc2NvZmYuYyAod3JpdGVfY29mZl9maWxlKTogU2V0IHRoZSBjb3JyZWN0IEJGRAotCi0xOTk5LTA1LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogcmVuYW1lLmMgKHNtYXJ0X3JlbmFtZSk6IEZpeCB0ZXN0IG9mIHdoZXRoZXIgZmlsZSBleGlzdHMuCi0KLTE5OTktMDUtMDYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBkaXNwbGF5X2VuZGlhbiBiYXNlZCBvbiB0YXJnZXQKLQllbmRpYW5pc20uCi0KLTE5OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGludGVyd29yayk6IFJlbW92ZS4KLQkoYXJtX2ludGVyd29ya19qdGFiKTogVXNlIGJ4IGluc24uCi0JKHRodW1iX2p0YWIpOiBMaWtld2lzZS4KLQkoTUFSTV9JTlRFUldPUkspOiBOZXcgbWFjaGluZSB0eXBlLgotCShydmFhZnRlcik6IEhhbmRsZSBpdC4KLQkocnZhYmVmb3JlKSBMaWtld2lzZS4KLQkoYXNtX3ByZWZpeCk6IExpa2V3aXNlLgotCShnZW5fZXhwX3R5cGUpOiBDaGVjayBtYWNoaW5lIHR5cGUgaW5zdGVhZCBvZgotCWludGVyd29yayBmbGFnLgotCShtYWtlX29uZV9saWJfZmlsZSk6IExpa2V3aXNlLgotCShtYWtlX2hlYWQpOiBMaWtld2lzZS4KLQkobWFrZV90YWlsKTogTGlrZXdpc2UuCi0JKHVzYWdlKTogVXBkYXRlIG1hY2hpbmUgdHlwZXMuCi0JKG1haW4pOiBSZW1vdmUgLWludGVyd29yayBzdXBwb3J0LgotCi0xOTk5LTA1LTA1ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHJlYWRlbGYuYyAoZ2V0X21hY2hpbmVfZmxhZ3MpOiAgQ2hlY2sgZm9yIEVGX0NQVTMyLgotICAgICAgICAoZ2V0X2RhdGFfZW5jb2RpbmcpOiBGaXggdHlwby4KLQotMTk5OS0wNC0yNiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFVwZGF0ZWQgZm9yIG5ldyB2ZXJzaW9uIG9mIGxpYnRvb2wuCi0KLTE5OTktMDQtMTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX3JhbmdlX3R5cGUpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24gaW4KLQlCRkQ2NCBjYXNlLgotCi0JKiByZWFkZWxmLmMgKGdldF9zZWN0aW9uX3R5cGVfbmFtZSk6IFVzZSBjb3JyZWN0IHR5cGVzIGluIHByaW50ZgotCWZvcm1hdHMuCi0JKHByb2Nlc3NfcmVsb2NzKTogTGlrZXdpc2UuCi0JKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogTGlrZXdpc2UuCi0JKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0JKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IExpa2V3aXNlLgotCi1UdWUgQXByIDEzIDIxOjIyOjAwIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1ha2Vfb25lX2xpYl9maWxlKTogTWFyayB0aHVtYiBmdW5jdGlvbnMgYXMKLQlDX1RIVU1CRVhURlVOQy4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmggKGVudmlyb24pOiBEZWNsYXJlIGl0LCBpZiBuZWVkZWQuCi0JKGFsbG9jYSkgW0NfQUxMT0NBXTogRG9uJ3QgdXNlIGdjYydzIGJ1aWx0aW4gb3IgPGFsbG9jYS5oPi4KLQkqIGNvbmZpZ3VyZS5pbiAoZW52aXJvbik6IERldGVjdCBkZWNsYXJhdGlvbi4KLQkqIG5tLmMgKG1haW4pOiBEb24ndCBkZWNsYXJlIGVudmlyb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotCSogZGxsdG9vbC5jIChnZW5fZXhwX2ZpbGUpOiBQYWQgb3V0IHRoZSAucmVsb2Mgc2VjdGlvbiB0byBhCi0JMzItYnl0ZSBib3VuZGFyeSB3aXRoIGR1bW15IHJlbG9jYXRpb25zLCB0byBtYWtlIHRoZSBCZU9TIGxvYWRlcgotCWhhcHB5LiAgUGF0Y2ggZnJvbSBCb2IgTWFuc29uIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPi4KLQotMTk5OS0wNC0wOCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy50ZXhpIChjKytmaWx0KTogVXBkYXRlZCBmb3IgLWovLS1qYXZhLCBhbmQgaHAvZWRnCi0JZm9ybWF0cy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBBZGQgYWJpbGl0eSB0byBkZWNvZGUgbmV3IGNvbnN0YW50cyBmb3VuZCBpbiBBcHJpbCAyNQotCTE5OTggRHJhZnQgb2YgU3lzdGVtIFYgQUJJIHNwZWMuCi0KLTE5OTktMDQtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBidWNvbW0uaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCi0JKiBhZGRyMmxpbmUuYyAobWFpbik6IERvbid0IHBhc3MgTENfTUVTU0FHRVMgdG8gc2V0bG9jYWxlIGlmIHRoZQotCXN5c3RlbSBkb2VzIG5vdCBkZWZpbmUgaXQuCi0JKiBhci5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBjb2ZmZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBkbGx0b29sLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG5sbWNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogbm0uYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHNpemUuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3Jjb252LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN0cmluZ3MuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3lzZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiB3aW5kcmVzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHJlYWRlbGYuYyAobWFpbik6IENhbGwgbG9jYWxlIHNldHRpbmcgZnVuY3Rpb25zLgotCi0xOTk5LTA0LTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uKTogRml4IERXX09QX2NvbnN0OHtzfHV9Ci0JZGVjb2Rlcy4KLQotMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHJlbmFtZS5jOiBOZXcgZmlsZSwgY29waWVkIG91dCBvZiBvYmpjb3B5LmMgd2l0aCBhIGZldyBjaGFuZ2VzLgotCSogYnVjb21tLmggKHNldF90aW1lcywgc21hcnRfcmVuYW1lKTogRGVjbGFyZS4KLQkqIGFyLmM6IERvbid0IGluY2x1ZGUgPHV0aW1lLmg+LgotCShleHRyYWN0X2ZpbGUpOiBDYWxsIHNldF90aW1lcyByYXRoZXIgdGhhbiB1dGltZS4KLQkod3JpdGVfYXJjaGl2ZSk6IENhbGwgc21hcnRfcmVuYW1lIHJhdGhlciB0aGFuIHVubGluayBhbmQgcmVuYW1lLgotCSogb2JqY29weS5jOiBEb24ndCBpbmNsdWRlIDx1dGltZS5oPi4KLQkoc2ltcGxlX2NvcHksIHNtYXJ0X3JlbmFtZSwgc2V0X3RpbWVzKTogTW92ZSB0byByZW5hbWUuYy4KLQkoc3RyaXBfbWFpbik6IFVwZGF0ZSBzbWFydF9yZW5hbWUgY2FsbCBmb3IgbmV3IHBhcmFtZXRlci4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZCByZW5hbWUuYy4KLQkob2JqY29weV9TT1VSQ0VTLCBzdHJpcF9uZXdfU09VUkNFUyk6IEFkZCByZW5hbWUuYy4KLQkoYXJfU09VUkNFUywgcmFubGliX1NPVVJDRVMpOiBBZGQgcmVuYW1lLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShFWFRSQV9QUk9HUkFNUyk6IFJlbW92ZSBiYWNrc2xhc2ggd2hpY2ggdHJvdWJsZXMgY3VycmVudCB2ZXJzaW9uCi0Jb2YgYXV0b21ha2UuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogZGxsd3JhcC5jIChtYWluKTogRXhwZWN0IGNvcnJlY3QgdHlwZSBpbiBmb3JtYXQgc3RyaW5nLgotCSogcmVzcmVzLmM6IEluY2x1ZGUgImJmZC5oIiwgImJ1Y29tbS5oIiwgImxpYmliZXJ0eS5oIiwgYW5kCi0JPHRpbWUuaD4uICBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiBhbmQgPGVycm5vLmg+LgotCSh3cml0ZV9yZXNfZmlsZSk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIGUgYW5kIGkuCi0JKHJlYWRfcmVzb3VyY2VfZW50cnkpOiBSZW1vdmUgdW51c2VkIGxvY2FscyBydHlwZSBhbmQgbi4KLQkocmVhZF91bmlzdHJpbmcpOiBSZW1vdmUgdW51c2VkIGxvY2FsIG4uCi0KLTE5OTktMDQtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBhcnBhcnNlLnk6IERlY2xhcmUgeXlsZXguCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogSW5pdGlhbGl6ZSBieXRlcy4gIEFkZCBjb21tZW50Ci0JZm9yIGluY29ycmVjdCB1c2Ugb2YgYnl0ZXMuCi0JKiByZWFkZWxmLmM6IENoYW5nZSBtYW55IGZvcm1hdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0KLTE5OTktMDQtMDEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocmVzZXRfc3RhdGVfbWFjaGluZSk6IE5ldyBmdW5jdGlvbi4gIFJlc2V0cyB0aGUKLQlyZWdpc3RlcnMgb2YgdGhlIHNvdXJjZSBsaW5lIG51bWJlciBzdGF0ZSBtYWNoaW5lLgotCShwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3ApOiBVc2Ugc3RhdGUgbWFjaGluZS4KLQkoZGlzcGxheV9kZWJ1Z19saW5lcyk6IFVzZSBzdGF0ZSBtYWNoaW5lLiAgSGFuZGxlIG11bHRpcGxlIGxpbmUKLQludW1iZXIgYmxvY2tzIHdpdGhpbiB0aGUgc2FtZSBzZWN0aW9uLgotCi0xOTk5LTAzLTI5ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19leHRlbmRlZF9saW5lX29wKTogZW5kX3NlcXVlbmNlIGFsc28gcmVzZXRzCi0JdGhlIGxpbmUgbnVtYmVyLgotCShkaXNwbGF5X2RlYnVnX2xpbmVzKTogYWR2YW5jZV9saW5lIHRha2VzIGEgc2lnbmVkIG9wZXJhbmQuCi0JKHJlYWRfYW5kX2Rpc3BsYXlfYXR0cik6IFByaW50IHJlZnMgYXMgPCV4PiwgYWRkcmVzc2VzIGFzICUjeCwKLQlvdGhlcnMgYXMgJWQuICBIYW5kbGUgb3RoZXIgbG9jYXRpb24gZXhwcmVzc2lvbiBhdHRyaWJ1dGVzLgotCShkaXNwbGF5X2RlYnVnX2luZm8pOiBIYW5kbGUgbmVzdGluZy4gIEFsd2F5cyBwcmludCB0aGUJb2Zmc2V0LgotCi0xOTk5LTAzLTIzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IFdoZW4gY2hlY2tpbmcgd2hldGhlciB0byBrZWVwIGEKLQlzeW1ib2wsIGNoZWNrIHRoZSBCRkQgc2VjdGlvbiBzeW1ib2wgZm9yIGEgc3ltYm9sIHdpdGgKLQlCU0ZfU0VDVElPTl9TWU0gc2V0LgotCi0xOTk5LTAzLTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IFByaW50IG5ldyBTb2xhcmlzIGR5bmFtaWMKLQlzZWN0aW9uIGVudHJpZXMuICBDb3JyZWN0IHByaW50aW5nIG9mIERUX1BPU0ZMQUdfMSBhbmQgRFRfRkxBR1NfMS4KLQotMTk5OS0wMy0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChyZXF1ZXN0X2R1bXApOiBOZXcgZnVuY3Rpb24uCi0JUmVtb3ZlZCBhcmJpdGFyeSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zIHRoYXQgY2FuIGJlCi0JZHVtcGVkLgotCi1XZWQgTWFyIDEwIDE1OjEwOjE0IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1ha2Vfb25lX2xpYl9maWxlKTogVXNlICUwNWQgdG8gb3V0cHV0IHRoZSBzdHViIG5hbWUgc28KLQlvcmRlciBpbiB0aGUgaW1wb3J0IGxpYnJhcnkgaXMgcHJlc2VydmVkLgotCi0xOTk5LTAyLTE5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEZpeCBjb21waWxlIHRpbWUgd2FyaW5ncy4KLQotMTk5OS0wMi0xNyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiByZXNiaW4uYyAocmVzX3RvX2Jpbl92ZXJzaW9uaW5mbyk6IEluc3RlYWQgb2YgZW50ZXJpbmcgYSB2YWx1ZQotCWxlbmd0aCBvZiB6ZXJvIGluIGEgdmVyc2lvbiBpbmZvIHN0cmluZywgZW50ZXIgdGhlIGFwcHJvcHJpYXRlCi0JbGVuZ3RoLgotCi1UdWUgRmViIDE2IDE2OjAwOjMzIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTMuICBDaGFuZ2UgQU1fUFJPR19JTlNUQUxMIHRvCi0JQUNfUFJPR19JTlNUQUxMLiAgQWRkIGNvbW1lbnRzIGZvciBBQ19ERUZJTkUgY2FsbHMuCi0JKiBhY2NvbmZpZy5oOiBSZW1vdmUuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBjb25maWcuaW46IFJlYnVpbGQuCi0KLTE5OTktMDItMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocmVhZF9hbmRfZGlzcGxheV9hdHRyKTogQWRkIGRpc3BsYXkgb2YgYmFzaWMgdHlwZQotCWVuY29kaW5ncy4KLQkoZGlzcGxheV9kZWJ1Z19hcmFuZ2VzKTogTmV3IGZ1bmN0aW9uOiBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiBhCi0JLmRlYnVnX2FyYW5nZXMgc2VjdGlvbi4KLQkoZGlzcGxheV9kZWJ1Z19pbmZvKTogRHVtcCB0YWdzIGZvdW5kIGFmdGVyIGNvbXB1bml0IGVudHJ5LgotCi0JKiBiaW51dGlscy50ZXhpOiBGaXhlZCBidWcgaW4gcmVhZGVsZiBkb2N1bWVudGF0aW9uLgotCi1Nb24gRmViICAxIDEyOjM4OjAxIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogIEhhbmRsZSBFTV9BUk0gYXMgUkVMLgotCi0xOTk5LTAxLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogRG8gbm90IHByb2R1Y2UgYSBoaXN0b2dyYW0gb2YKLQlidWNrZXQgY2hhaW5zIGlmIG5vbmUgd2VyZSBmb3VuZC4KLQotMTk5OS0wMS0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdmVyc2lvbi5jOiBBZGQgMTk5OSBjb3B5cmlnaHQuCi0KLQkqIGJpbnV0aWxzLnRleGkgKHJlYWRlbGYpOiBEb2N1bWVudCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMKLQktLWRlYnVnLWR1bXAgYW5kIC0taGlzdG9ncmFtLgotCi0JKiByZWFkZWxmLmM6IEFkZCBhYmlsaXR5IHRvIGRpc3BsYXkgY29udGVudHMgb2Ygc29tZSBvciBhbGwgb2YgdGhlCi0JRHdhcmYyIGRlYnVnIHNlY3Rpb25zLiAge1dvcmsgb25seSBwYXJ0aWFsbHkgY29tcGxldGVkfS4KLQkoZGlzcGxheV9kZWJ1Z19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShkaXNwbGF5X2RlYnVnX2luZm8pOiBOZXcgZnVuY3Rpb24uCi0JKGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCk6IE5ldyBmdW5jdGlvbi4KLQkoZGlzcGxheV9kZWJ1Z19saW5lKTogTmV3IGZ1bmN0aW9uLgotCShkaXNwbGF5X2RlYnVnX2FiYnJldik6IE5ldyBmdW5jdGlvbi4KLQkocHJvY2Vzc19hYmJyZXZfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkocmVhZF9sZWIxMjgpOiBOZXcgZnVuY3Rpb24uCi0JKHByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCk6IE5ldyBmdW5jdGlvbi4KLQkoZ2V0X1RBR19uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfQVRfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZ2V0X0ZPUk1fbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZnJlZV9hYmJyZXZzKTogTmV3IGZ1bmN0aW9uLgotCShhZGRfYWJicmV2KTogTmV3IGZ1bmN0aW9uLgotCShhZGRfYWJicmV2X2F0dHIpOiBOZXcgZnVuY3Rpb24uCi0JKHJlYWRfYW5kX2Rpc3BsYXlfYXR0cik6IE5ldyBmdW5jdGlvbi4KLQkoZGlzcGxheV9ibG9jayk6IE5ldyBmdW5jdGlvbi4KLQotVGh1IEphbiAxNCAyMzozNjoxMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmZkdW1wLmMgKHhjYWxsb2MpOiBSZW1vdmUsIGluIGxpYmliZXJ0eSBub3cuCi0JKiBzcmNvbnYuYyAoeGNhbGxvYyk6IExpa2V3aXNlLgotCSogc3lzZHVtcC5jICh4Y2FsbG9jKTogTGlrZXdpc2UuCi0KLTE5OTktMDEtMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19zZWN0aW9uX2hlYWRlcnMpOiBPbWl0IHRyYWlsaW5nIHNwYWNlIGF0IGVuZAotCW9mIHNlY3Rpb24gaGVhZGVyIGNvbnRlbnRzIGxpbmUuCi0KLVdlZCBEZWMgMTYgMTc6MjA6MDUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogUmVnZW5lcmF0ZS4KLQotTW9uIERlYyAxNCAxMjo1NTozNiAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGRsbHdyYXAuYzogSW5jbHVkZSBiZmQuaCBhbmQgYnVjb21tLmguICBNb3ZlIGdldG9wdC5oIGluY2x1ZGUKLQlhZnRlciBsaWJpYmVydHkuaCBpbmNsdWRlLgotCi1UdWUgRGVjICA4IDE2OjI5OjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC4xOiBGaXggdHlwbyAoLWQgdG8gLUQpLiAgRnJvbSBOb2t1YmkgSGlyb3Rha2EKLQk8aG5va3ViaUB5eXkub3IuanA+LgotCi1TdW4gRGVjICA2IDEzOjI4OjA5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChTRklMRSk6IEFkZCBzaXplIGZpZWxkLgotCShvYmpkdW1wX3NwcmludGYpOiBNZXJnZSBib3RoIHZlcnNpb25zIGludG8gb25lLiAgSW5jcmVhc2UgYnVmZmVyCi0Jc2l6ZSBhcyBuZWVkZWQgdG8gYXZvaWQgb3ZlcmZsb3cuCi0JKGRpc2Fzc2VtYmxlX2J5dGVzKTogQ2hhbmdlIGJ1ZiBmcm9tIDEwMDAgYnl0ZXMgdG8gNTAuICBDaGFuZ2UKLQlpbml0aWFsaXphdGlvbiBhbmQgdXNlIG9mIHNmaWxlIHRvIG1hdGNoIGNoYW5nZXMgdG8KLQlvYmpkdW1wX3NwcmludGYuCi0KLQkqIHN0cmlwLjE6IEZpeCB0eXBvICgtViB0byAtdikuICBGcm9tIElzc2VpIEhpcmF5YW1hCi0JPGlzc0BtYWlsLndicy5vci5qcD4uCi0KLTE5OTgtMTItMDMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogSW1wcm92ZSBvdXRwdXQgZm9ybWF0IGZvcgotCXZhcmlvdXMgRFRfKiB2YWx1ZXMuCi0KLTE5OTgtMTItMDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IFByaW50IC5jb25mbGljdCBzZWN0aW9uCi0JY29udGVudC4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX21pcHNfc3BlY2lmaWMpOiBQcmludCBsX2ZsYWdzIGluIGxpYmxpc3QgaW4KLQl0ZXh0dWFsIGZvcm0uCi0KLTE5OTgtMTEtMzAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKGV4dHJhY3RfZmlsZSk6IEFkZCBzb21lIHBhcmFub2lhIGNoZWNrcyBmb3IgbmVnYXRpdmVseQotCXNpemVkIGZpbGVzLgotCi1UdWUgTm92IDI0IDA5OjM5OjI0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKERJUl9TRVBBUkFUT1IpOiBEZWZpbmUgYXMgJ1xcJyBpZiBXSU4zMiBpcyBkZWZpbmVkLgotCi1UdWUgTm92IDE3IDEwOjI1OjI2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi1Nb24gTm92IDE2IDE5OjE3OjIzIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vYmludXRpbHMucG90OiBSZWdlbmVyYXRlLgotCi1Nb24gTm92IDE2IDEwOjE4OjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWdlcm5hdGVkIGRlcGVuZGVuY2llcy4KLQkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotU2F0IE5vdiAxNCAxNDo1MDo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRlYnVnLmMgKGRlYnVnX25hbWVfdHlwZSk6IENvcnJlY3QgcmV0dXJuIHR5cGUgZnJvbSBmYWxzZSB0bwotCURFQlVHX1RZUEVfTlVMTC4KLQotU2F0IE5vdiAxNCAxNDo0ODoyMSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFNraXAgb3ZlciByZWxvY3MgYmVsb3cgc3RhcnQKLQlhZGRyZXNzLgotCi1UdWUgTm92IDEwIDE1OjMxOjUyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgZGVwZW5kZW5jeSBvZiByZWFkZWxmLmMgb24gZWxmL2ZyMzAuaAotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLVdlZCBOb3YgIDQgMTY6MjU6NTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBBZGQgc3VwcG9ydCBmb3IgdGhlIEZSMzAuCi0KLU1vbiBOb3YgIDIgMTQ6NTk6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKLSAgICAgICAgKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotRnJpIE9jdCAzMCAxNToxNDo0OSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogZGxsd3JhcC5jOiBjaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gY3lnd2luMzJfIHRvIGN5Z3dpbl8sCi0JY2hhbmdlIEN5Z3dpbiB0YXJnZXQgZGVmIHRvIENZR1dJTi4KLQotV2VkIE9jdCAyOCAxMDozMToxOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBSZXBsYWNlICd1bnNpZ25lZCBsb25nJyB3aXRoCi0JJ2JmZF92bWEnLgotCi1UdWUgT2N0IDI3IDE0OjM5OjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBBcHBsaWVkIHRoaXMgcGF0Y2ggZnJvbSBQaGlsaXAKLQlCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+OiAgTWFrZSBhZGRyZXNzIHZhcmlhYmxlcyB1bnNpZ25lZCB0bwotCWF2b2lkIHByb2JsZW1zIHdoZW4gZGlzYXNzZW1ibGluZyBjb2RlIGF0IGhpZ2gtYml0LXNldCBhZGRyZXNzZXMuCi0KLU1vbiBPY3QgMjYgMTQ6MDc6NTkgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLSAgICAgICAgKiBkbGx3cmFwLmMgKHN0cmhhc2gpOiBOZXcgZnVuY3Rpb24uCi0gICAgICAgIChtYWluKTogVXNlIGl0IHRvIHN1cHBseSBpbWFnZSBiYXNlIGlmIG5vdCBzdXBwbGllZCBieSB1c2VyLgotICAgICAgICAocHJvZ3JhbV92ZXJzaW9uKTogVXAgdG8gMC4yLjQuCi0KLU1vbiBPY3QgMjYgMTQ6MDc6NTkgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLSAgICAgICAgKiBkbGx0b29sLmMgKGFkZF9zdGRjYWxsX2FsaWFzKTogTmV3IGdsb2JhbC4KLSAgICAgICAgKGxvbmdfb3B0aW9ucyk6IEFkZCAtLWFkZC1zdGRjYWxsLWFsaWFzIG9wdGlvbi4KLSAgICAgICAgKG1haW4pOiBIYW5kbGUgaXQuCi0gICAgICAgIChzY2FuX2RyZWN0dmVfc3ltYm9scyk6IEFkZCBhbGlhcyBpZiAtLWFkZC1zdGRjYWxsLWFsaWFzIGlzCi0gICAgICAgIHNwZWNpZmllZC4KLSAgICAgICAgKHNjYW5fZmlsdGVyZWRfc3ltYm9scyk6IExpa2V3aXNlLgotICAgICAgICAoZ2VuX2RlZl9maWxlKTogT3V0cHV0IGFsaWFzIGZvciBzdGRjYWxsIHN5bXMgaWYgYXBwcm9wcmlhdGUuCi0KLSAgICAgICAgKiBiaW51dGlscy50ZXhpIChkbGx0b29sKTogRG9jdW1lbnQgLS1hZGQtc3RkY2FsbC1hbGlhcyBvcHRpb24uCi0KLSAgICAgICAgKiBkbGx3cmFwLmMgKGxvbmdfb3B0aW9ucyk6IEFkZCAtLWFkZC1zdGRjYWxsLWFsaWFzIG9wdGlvbi4KLSAgICAgICAgKG1haW4pOiBIYW5kbGUgaXQuCi0KLSAgICAgICAgKiBkZWZwYXJzZS55IChvcHRfbmFtZSk6IEFsbG93ICIuIiBpbiBuYW1lLgotICAgICAgICAqIGRsbHRvb2wuYyAoZGVmX25hbWUpOiBTZXQgZGxsX25hbWUgZnJvbSBOQU1FIGVudHJ5IGluIGRlZiBmaWxlLgotICAgICAgICAoZGVmX2xpYnJhcnkpOiBTZXQgZGxsX25hbWUgZnJvbSBMSUJSQVJZIGVudHJ5IGluIGRlZiBmaWxlLgotCi1Nb24gT2N0IDI2IDE0OjA3OjU5IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0gICAgICAgICogZGxsd3JhcC5jIChsb25nX29wdGlvbnMpOiAtLWltcGxpYiBzeW5vbnltIGZvciAtLW91dHB1dC1saWIuCi0gICAgICAgIChtYWluKTogUGFzcyAtLWV4cG9ydC1hbGwgdG8gZGxsdG9vbCBvbmx5IGlmIHNwZWNpZmllZC4KLSAgICAgICAgKHByb2dyYW1fdmVyc2lvbik6IFVwIHRvIDAuMi4zLgotCi1Nb24gT2N0IDI2IDE0OjA3OjU5IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0gICAgICAgICogZGxsd3JhcC5jIChteWJhc2VuYW1lKTogTmV3IGZ1bmN0aW9uLgotICAgICAgICAobWFpbik6IFJ1biBkbGx0b29sIHRvIGNyZWF0ZSBleHBvcnQgZGVmaW5pdGlvbiBmaWxlIGFuZCBpbXBvcnQKLSAgICAgICAgbGlicmFyeSBmaWxlIGlmIG5lY2Vzc2FyeS4KLSAgICAgICAgQ2hhbmdlIGV4cF9maWxlX25hbWUgc28gdGhhdCBpdCdzIGJhc2VkIG9uIHRoZSBkbGwgbmFtZS4KLQotU3VuIE9jdCAyNSAxMDozNzo0NSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotICAgICAgICAqIGRsbHRvb2wuYyAoc2Nhbl9hbGxfc3ltYm9scyk6IEZpeCBwYXRjaCBlcnJvci4KLQotRnJpIE9jdCAxNiAyMjo1NjoyMCAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKGRpc3BsYXlfcmVsX2ZpbGUpOiBmaXggIm5vIHN5bWJvbHMiIG1lc3NhZ2VzLgotCSogb2JqZHVtcC5jIChzbHVycF9zeW10YWIpOiBkaXR0by4KLQkqIHBvL1BPVEZJTEVTLmluLCBwby9iaW51dGlscy5wb3Q6IHJlYnVpbHQKLQotTW9uIE9jdCAxMiAxNDoyODowMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKGR1bXBfcmVsb2NhdGlvbnMpOiBSZW5hbWUgZmllbGQgZnJvbSBWYWx1ZSB0byBJbmZvIHRvCi0JbWF0Y2ggbmFtZSBvZiBmaWVsZCBpbiBFTEYgc3RydWN0dXJlcy4KLQotVGh1IE9jdCAgOCAxNTozMzowOCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGNhbGwgQUNfRVhFRVhUIGluc3RlYWQgb2YgQU1fRVhFRVhUIGFuZAotCUFNX0NZR1dJTjMyLgotCSogYWNsb2NhbC5tNDogcmVtb3ZlIGxvY2FsIEFNX0VYRUVYVC9BTV9DWUdXSU4zMiBtYWNyb3MuCi0JKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotVGh1IE9jdCAgOCAxNTozMzowOCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JRnJvbSBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT46Ci0gICAgICAgICogZGxsdG9vbC5jIChzY2FuX2FsbF9zeW1ib2xzKTogRG9uJ3QgcmUtZXhwb3J0IHN5bWJvbHMgZXhwb3J0ZWQKLSAgICAgICAgYnkgb3RoZXIgRExMcy4KLQotVGh1IE9jdCAgOCAxNTozMzowOCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQlVJTERfRExMV1JBUCk6IEFkZC4KLQkoQlVJTERfRExMV1JBUCwgRExMV1JBUF9QUk9HKTogQWRkLgotCShiaW5fUFJPR1JBTVMpOiBBZGQgZGxsd3JhcC4KLQkqIE1ha2VmaWxlLmluOiByZWdlbmVyYXRlIHdpdGggYXV0b21ha2UKLQotCUZyb20gTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+OgotICAgICAgICAqIGRsbHdyYXAuYzogTmV3IGZpbGUgZnJvbSBkbGxoZWxwZXJzIHYwLjIuMS4KLQkocHJpbnRfdmVyc2lvbik6IE5ldyBmdW5jdGlvbi4KLQkobG9uZ19vcHRpb25zKTogQWRkIC0tdmVyc2lvbi4KLQkobWFpbik6IEhhbmRsZS4KLSAgICAgICAgKiBkeW4tc3RyaW5nLmgsIGR5bi1zdHJpbmcuYzogTmV3IGZpbGVzIGZyb20gZWdjcy0xLjEvZ2NjLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQlVJTERfRExMV1JBUCk6IEFkZC4KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBPY3QgIDYgMTg6MjA6MTAgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKHdpbmRyZXNfU09VUkNFUyk6IEFkZCByZXNyZXMuYy4KLQkod2luZHJlc19PQkpFQ1RTKTogQWRkIHJlc3Jlcy5vLgotCSogTWFrZWZpbGUuaW46IHJlZ2VuZXJhdGUgd2l0aCBhdXRvbWFrZQotCi0gICAgICAgIEZyb20gQW5kZXJzIE5vcmxhbmRlciA8YW5vcmxhbmRAaGVtMi5wYXNzYWdlbi5zZT4uCi0gICAgICAgICogcmVzcmVzLmM6IE5ldyBmaWxlLiAgSW1wbGVtZW50YXRpb24gb2YgcmVhZF9yZXNfZmlsZSBhbmQKLSAgICAgICAgd3JpdGVfcmVzX2ZpbGUgZnVuY3Rpb25zIGZvciB3aW5kcmVzLgotICAgICAgICAqIHJjcGFyc2UueTogSGFuZGxlIENPTlRST0wncyB3aXRoIG5hbWVkIGNsYXNzZXMuCi0gICAgICAgICogcmVzYmluLmM6IEJ1ZyBpbiByZXNfdG9fYmluX2RpYWxvZyBhbmQgYmluX3RvX3Jlc19kaWFsb2cKLSAgICAgICAgd2hlbiBkaWFsb2cgaXMgZXh0ZW5kZWQ6IFRoZSB2ZXJzaW9uIGFuZCBzaWduYXR1cmUgZmllbGRzIHNob3VsZAotICAgICAgICBiZSByZXZlcnNlZCAoZGVzcGl0ZSB3aGF0IHRoZSBkb2NzIHNheSkuIElkIGlzIDMyIGJpdHMgbG9uZyBpbgotICAgICAgICBleHRlbmRlZCBkaWFsb2dzLgotICAgICAgICAqIHJlc3JjLmMgKHdyaXRlX3JjX2RpYWxvZyk6IHByb3Blcmx5IHByaW50IGNvbnRyb2xzIHdpdGggbmFtZWQKLSAgICAgICAgY2xhc3Nlcy4KLSAgICAgICAgKiB3aW5kcmVzLmMgKHJlYWRfcmVzX2ZpbGUsIHdyaXRlX3Jlc19maWxlKTogUmVtb3ZlIHN0dWJzLgotICAgICAgICAqIHJlc3Jlcy5jICh3cml0ZV9yZXMpOiBSZW5hbWUgUlRfQUNDRUxFUkFUT1JTIHRvIFJUX0FDQ0VMRVJBVE9SLgotCi1TdW4gT2N0ICA0IDIwOjM0OjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gTm9rdWJpIEhpcm90YWthIDxobm9rdWJpQHl5eS5vci5qcD46Ci0JKiBvYmpjb3B5LjE6IEZpeCB0eXBvIGluIC0tcmVtb3ZlLWxlYWRpbmctY2hhciBkb2NzLgotCSogb2JqZHVtcC4xOiBGaXggZm9ybWF0dGluZyBpbiAtLXN0YWJzIGRvY3MuCi0KLVNhdCBTZXAgMTkgMjM6MzM6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByY3BhcnNlLnkgKG1lbWZsYWdzX21vdmUpOiBDb3JyZWN0IHJlY3Vyc2lvbi4KLQotMTk5OC0wOS0xMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBQcmludCBpbiBoaXN0b2dyYW0gaG93IG1hbnkKLQlzeW1ib2xzIGFyZSBjb3ZlcmVkIGJ5IHRoZSBjdXJyZW50IGNoYWluIGxlbmd0aC4KLQotU3VuIFNlcCAgNiAxNjoxNTo0NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyk6IERvIG5vdCB0cnkgdG8gZHVtcCBlbXB0eQotCXNlY3Rpb25zLgotCi1TYXQgU2VwICA1IDE5OjE3OjEwIDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBkbGx0b29sLmMgKHNjYW5fYWxsX3N5bWJvbHMpOiBEb24ndCByZS1leHBvcnQgc3ltYm9scyBleHBvcnRlZAotCWJ5IG90aGVyIERMTHMuCi0KLTE5OTgtMDktMDIgMTQ6NTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogUHJpbnQgRFRfKiB2YWx1ZSBvbmx5IGlmCi0JZG9fZHluYW1pYy4KLQkoZG9faGlzdG9ncmFtKTogTmV3IHZhcmlhYmxlLgotCShvcHRpb25zKTogTmV3IGxvbmcgb3B0aW9uIGhpc3RvZ3JhbS4gIFNldCBkb19oaXN0b2dyYW0gaWYgdGhpcwotCW9wdGlvbiBpcyB1c2VkLgotCSh1c2FnZSk6IERvY3VtZW50IC0taGlzdG9ncmFtLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIDAgcmV0dXJuIHZhbHVlIGZyb20gZ2V0b3B0X2xvbmcuICBFbmFibGUKLQlkb19oaXN0b2dyYW0gZm9yIC1hLgotCShwcm9jZXNzX3N5bWJvbF90YWJsZSk6IFJlYWQgaGFzaCB0YWJsZSBhbHNvIGlmIG9ubHkgZG9faGlzdG9ncmFtLgotCUFkZCBjb2RlIHRvIHByaW50IGhhc2ggdGFibGUgaGlzdG9ncmFtLgotCi0xOTk4LTA4LTI1IDE2OjQ1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IFJlYWQgc3ltaW5mbyBzZWN0aW9uIGlmCi0JYXZhaWxhYmxlLgotCShwcm9jZXNzX3N5bWluZm8pOiBOZXcgZnVuY3Rpb24uICBQcmludCBzeW1pbmZvIGluZm9ybWF0aW9uLgotCShwcm9jZXNzX2ZpbGUpOiBDYWxsIHByb2Nlc3Nfc3ltaW5mbyBhbmQgZnJlZSBzeW1pbmZvIGRhdGEgYXQgdGhlIGVuZC4KLQotV2VkIEF1ZyAxOSAxNjoxOTo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAodXNhZ2UpOiBBZGQgZmlsZSBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKG1haW4pOiBEb24ndCB0cmVhdCAnPycgYXMgYSBzcGVjaWFsIGNhc2UgaW4gZ2V0b3B0IHJldHVybi4KLQotCSogYmludXRpbHMudGV4aSAoZGxsdG9vbCk6IERvY3VtZW50IG5ldyBvcHRpb25zLiAgQWRkIHNvbWUgdXNlcyBvZgotCUB2YXIuCi0KLVdlZCBBdWcgMTkgMTY6MTk6MDcgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGRsbHRvb2wuYyAoZ2VuX2RlZl9maWxlKTogUGx1ZyBtZW1vcnkgbGVhay4gIERvbid0IHByaW50Ci0JZGVtYW5nbGVkIG5hbWUgaWYgaXQgaXMgTlVMTC4KLQotCVN1cHBvcnQgZm9yIGV4cG9ydGluZyBhbGwgc3ltYm9scyB0byBhbiBvdXRwdXQgZXhwb3J0IGRlZiBmaWxlOgotCSogZGxsdG9vbC5jICh7ZXhwb3J0X2FsbF9zeW1ib2xzLCBub19kZWZhdWx0X2V4Y2x1ZGVzLAotCW5vX2RlZmF1bHRfZXhjbHVkZXMsIGV4Y2x1ZGVzfSk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZXMuCi0JKHN0cnVjdCBzdHJpbmdfbGlzdCk6IFR5cGUgdG8gaG9sZCBsaXN0IG9mIHN5bWJvbHMgdG8gZXhjbHVkZS4KLQkoc2Nhbl9kcmVjdHZlX3N5bWJvbHMpOiBSZW5hbWVkIGZyb20gc2Nhbl9vcGVuX29ial9maWxlLgotCShzY2FuX2ZpbHRlcmVkX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhZGRfZXhjbHVkZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtYXRjaF9leGNsdWRlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2V0X2RlZmF1bHRfZXhjbHVkZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShmaWx0ZXJfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNjYW5fYWxsX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzY2FuX29wZW5fb2JqX2ZpbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh1c2FnZSk6IERvY3VtZW50IG5ldyBvcHRpb25zLgotCShsb25nX29wdGlvbnMpOiBBZGQgbmV3IG9wdGlvbnMuCi0JKG1haW4pOiBIYW5kbGUgbmV3IG9wdGlvbnMuCi0KLTE5OTgtMDctMzEgMjE6MjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfcHJvZ3JhbV9oZWFkZXJzKTogUHJpbnQgcF9vZmZzZXQgdmFsdWUgd2l0aAotCXNpeCBoZXggZGlnaXRzLgotCShkeW5hbWljX3NlZ21lbnRfbWlwc192YWwpOiBBZGQgc3VwcG9ydCBmb3IgRFRfTUlQU19GTEFHUywKLQlEVF9NSVBTX0lWRVJTSU9OLCBhbmQgRFRfTUlQU19USU1FX1NUQU1QLgotCShwcm9jZXNzX21pcHNfc3BlY2lmaWMpOiBBbHNvIHByaW50IHNlY29uZHMgb2YgdGltZSBzdGFtcC4KLQotRnJpIEp1bCAzMSAxMDowNDoyMyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6ICBFTV9BUk0gdXNlcyByZWxhIHJlbG9jcy4KLQotMTk5OC0wNy0zMCAxNjoyNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X2R5bmFtaWNfdHlwZSk6IERvbid0IHVzZWQgZ2V0dGV4dCBvbiB0aGUgbmFtZXMuCi0JQWRkIG5ldyBEVF8qIHZhbHVlcyBmcm9tIFNvbGFyaXMuICBEb24ndCBwcmludCBudWVtcmljIHZhbHVlIGluCi0JY2FzZSBvZiBhbiB1bmtub3duIGVudHJ5LgotCShwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IEhhbmRsZSBuZXcgRFRfKiBlbnRyaWVzLiAgUHJpbnQgbnVtZXJpYwotCXZhbHVlcyBpbiBkZWNpbWFsLCBub3QgaGV4LgotCi1GcmkgSnVsIDI0IDE2OjI4OjU3IDE5OTggIEplZmYgSG9sY29tYiAgPGplZmZoQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X2R5bmFtaWNfdHlwZSk6IFJlbW92ZSBlbXB0eSBkZWZhdWx0IGZyb20gc3dpdGNoCi0Jc3RhdGVtZW50LgotCi1GcmkgSnVsIDI0IDE2OjI4OjEyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IERvbid0IHJlbW92ZSB0aGUgZmlsZSBiZWZvcmUKLQljaGVja2luZyB3aGV0aGVyICQoYmluZGlyKSA9PSAkKHRvb2xkaXIpL2Jpbi4gIEZyb20gTWFjaWVqCi0JVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEp1bCAyNCAwOTozODo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmM6IFJlbW92ZWQgc3B1cmlvdXMgaW5jbHVzaW9uIG9mIGVsZi9pbnRlcm5hbC5oIGFuZAotCWVsZi1iZmQuaC4KLQotMTk5OC0wNy0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogQ29uc2lzdGFudGx5IHVzZSBlbGZfIHByZWZpeCBmb3IgKl9yZWxvY190eXBlCi0JZnVuY3Rpb25zLgotCi1XZWQgSnVsIDIyIDE2OjI5OjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IEFkZCBkdW1wcyBvZiBIUFBBIGFuZCBBUkMKLQlyZWxvY2F0aW9ucy4KLQotCShwcm9jZXNzX3JlbG9jcyk6IERvIG5vdCBhYm9ydCBpZiBubyBzdHJpbmcgdGFibGUgY2FuIGJlIGZvdW5kLgotCi0xOTk4LTA3LTIyIDE0OjU4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBSZW1vdmUgZGVmaW5pdGlvbiBvZiBmdW5jdGlvbnMgdG8gcmV0dXJuIHJlbG9jYXRpb24KLQlzeW1ib2wgc3RyaW5ncy4gIFRoZXkgbm93IGdldCBpbXBsaWNpdGx5IGRlZmluZWQgd2hlbiBpbmNsdWRlIHRoZQotCXN5c3RlbSBzcGVjaWZpYyBFTEYgaGVhZGVyLgotCi0xOTk4LTA3LTIyIDEzOjUxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBCZWZvcmUgaW5jbHVkZSBzeXN0ZW0gc3BlY2lmaWMgRUxGIGhlYWRlciBkZWZpbmUKLQlTVEFSVF9SRUxPQ19OVU1CRVJTLCBSRUxPQ19OVU1CRVIsIGFuZCBFTkRfUkVMT0NfTlVNQkVSUy4gIEZvciBub3cKLQl1c2VkIGZvciBwcGMsIG1pcHMsIGFuZCBtbjEwMzAwLgotCi1XZWQgSnVsIDIyIDEwOjI2OjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IERpc3BsYXkgbnVtYmVyIG9mIHVucmVjb2duaXNlZAotCXJlbG9jYXRpb25zLgotCi0xOTk4LTA3LTIxIDEzOjEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBVc2Ugc3ltYm9saWMgbmFtZXMgb2YgcmVsb2NhdGlvbiBlbnRyaWVzIGZvciB0aGUgdmFyaW91cwotCWFyY2hpdGVjdHVyZXMuICBDb3JyZWN0IG1vcmUgbGF5b3V0IGRldGFpbHMuCi0JUHJpbnQgbmFtZXMgb2YgTUlQUyBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgUHJpbnQgQWxwaGEsIEFSTSwgYW5kCi0JTUlQUyByZWxvY2F0aW9uIHR5cGUgbmFtZXMuCi0KLTE5OTgtMDctMjAgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogQWRkIGNvZGUgZm9yIHN0cmlwIGFsbCBzeW1ib2xzIGNhc2UuCi0gICAgICAgIChjb3B5X29iamVjdHMpOiBTdHJpcCBhbGwgY2FzZSBpcyBub3cgcHJvY2Vzc2VkIGFsc28gdGhyb3VnaAotCWZpbHRlcl9zeW1ib2xzLiAgTm8gbWFya2luZyBzeW1ib2xzIHVzZWQgaW4gcmVsb2NhdGlvbnMgd2hlbiBzdHJpcAotCWFsbCBzeW1ib2xzIGNhc2UuCi0JKGNvcHlfc2VjdGlvbik6IFdoZW4gc3RyaXAgYWxsIHN5bWJvbHMgY2FzZSwgcmVtb3ZlIHJlbG9jYXRpb25zCi0Jd2hpY2ggYXJlIG5vdCBpbiBrZWVwIHN0cmlwIHNwZWNpZmljIGxpc3QuCi0JKHN0cmlwX21haW4pOiBSZW1vdmUgZ3VhcmQgYHN0cmlwX3NwZWNpZmljX2xpc3QgPT0gTlVMTCcgZm9yCi0Jc2V0dGluZyB1cCBzdHJpcCBhbGwgc3ltYm9scyBieSBkZWZhdWx0LgotCi1Nb24gSnVsIDIwIDEyOjUxOjE2IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBhZGRyMmxpbmUuYyAoZmluZF9hZGRyZXNzX2luX3NlY3Rpb24pOiBPbmx5IGNvbnNpZGVyIGEgc2VjdGlvbgotCWlmIHRoZSBwYyB2YWx1ZSBpcyBjb21wbGV0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gaXQuCi0JKHRyYW5zbGF0ZV9hZGRyZXNzZXMpOiBEb24ndCBjcmFzaCBpZiBmdW5jdGlvbm5hbWUgb3IgZmlsZW5hbWUgYXJlCi0JbnVsbC4KLQotMTk5OC0wNy0yMCAwNzo0NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBGaXggbGl0dGxlIGFsaWdubWVudCBwcm9ibGVtCi0JaW4gcHJpbnRlZCB0YWJsZSBoZWFkZXIuCi0KLTE5OTgtMDctMjAgMDc6MTQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IENvcnJlY3QgcmVhZGluZyBvZiAuZHluYW1pYyBzZWN0aW9uLgotCShkeW5hbWljX3NlY3Rpb24pOiBOb3cgYSBnbG9iYWwgdmFyaWFibGUuCi0JKHByb2Nlc3NfbWlwc19mcGVfZXhjZXB0aW9uLCBwcm9jZXNzX21pcHNfc3BlY2lmaWMsCi0JcHJvY2Vzc19hcmNoX3NwZWNpZmljKTogTmV3IGZ1bmN0aW9ucy4KLQkoZ2V0X2ZpbGVfaGVhZGVyKTogQ2FsbCBwcm9jZXNzX2FyY2hfc3BlY2lmaWMuCi0KLTE5OTgtMDctMTkgMTU6MTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEZpeCBzZXZlcmFsIHZlcnNpb25pbmcgcmVsYXRlZCBidWdzLiAgUHJvZHVjZSBuaWNlcgotCW91dHB1dC4KLQlBZGQgc3VwcG9ydCBmb3IgcHJvY2Vzc29yIHNwZWNpZmljIGluZm9ybWF0aW9uIG9uIE1JUFMuCi0KLUZyaSBKdWwgMTAgMTU6NTc6NTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBTd2l0Y2ggcHJvdG90eXBlcyBmcm9tIHVuc2lnbmVkIHNob3J0IHRvIHVuc2lnbmVkCi0JaW50LgotCi1GcmkgSnVsIDEwIDE2OjE3OjUwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gQ2hyaXN0aWFuIEhvbGxhbmQgPENIb2xsYW5kQGRlLmx1Y2VudC5jb20+OgotCSogaWVlZS5jIChwYXJzZV9pZWVlKTogSW5pdGlhbGl6ZSBpbmZvLmdsb2JhbF92YXJzIGFuZAotCWluZm8uZ2xvYmFsX3R5cGVzLgotCShwYXJzZV9pZWVlX2F0bik6IElnbm9yZSByZWdpc3RlciBsaWZldGltZSBpbmZvcm1hdGlvbiByZXBvcnRlZGx5Ci0JZW1pdHRlZCBieSBNUkkgY29tcGlsZXIuCi0KLVRodSBKdWwgIDkgMTM6MDg6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoTUFJTlRBSU5FUkNMRUFORklMRVMpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEp1bCAgNyAyMTo0ODo1NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHJlYWRlbGYuYyAoYnl0ZV9nZXQpOiBVc2UgUEFSQU1TIGluIHByb3RvdHlwZS4KLQkoZXJyb3IpOiBNYWtlIGl0IHdvcmsgd2l0aCBub24tQU5TSSBjb21waWxlcnMuCi0JKHdhcm4pOiBMaWtld2lzZS4KLQkoZ2V0X3Zlcl9mbGFncyk6IERvbid0IHVzZSBhbiBBTlNJIHByb3RvdHlwZSBpbiB0aGUgZGVmaW5pdGlvbi4KLQotVHVlIEp1bCAgNyAxMzoyNjoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX2J5dGVzKTogU2V0IHNpemUgY29ycmVjdGx5IGlmIHRoZSBzaXplIG9mIHRoZQotCXNlY3Rpb24gaXMgbm90IGFuIGV2ZW4gbXVsdGlwbGUgb2YgdGhlIGludGVybGVhdmUuICBCYXNlZCBvbiBwYXRjaAotCWZyb20gQnJpb24gU3RvbmUgPEJyaW9uLlN0b25lQGF0dHdzLmNvbT4uCi0KLVRodSBKdWwgIDIgMTQ6MDE6MzQgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBybWkuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb206IEFkZCB2YXgvdm1zIHN1cHBvcnQuCi0JKiBtYWtlZmlsZS52bXMtaW46IFJlbmFtZWQgZnJvbSBtYWtlZmlsZS52bXMuICBBZGQgc3Vic3RpdHV0aW9ucwotCW5vdyBkb25lIGJ5IGNvbmZpZ3VyZS5jb20uCi0KLVdlZCBKdWwgIDEgMjA6NDM6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX3JhbmdlX3R5cGUpOiBIYW5kbGUgNCBhbmQgOCBieXRlIHNpZ25lZAotIAlpbnRlZ2VycyB3aXRoIHJlYWwgdXBwZXIgYm91bmRzLiAgSGFuZGxlIGEgbG93ZXIgYm91bmQgb25lIGxhcmdlcgotIAl0aGFuIHRoZSB1cHBlciBib3VuZCBhcyBhIHNpZ25lZCBpbnRlZ2VyLiAgSGFuZGxlIDggYnl0ZSBzaWduZWQKLQlpbnRlZ2Vycy4KLQkoc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSk6IE9wdGlvbmFsbHkgcmV0dXJuIHRoZSBkZW1hbmdsZWQgbmFtZSBvZgotCXRoZSB0ZW1wbGF0ZS4KLQkoc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQpOiBUcmVhdCBhIHRlbXBsYXRlIG5hbWUgYXMgYSB0YWdnZWQKLQl0eXBlLgotCShzdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZSk6IExpa2V3aXNlLgotCi1XZWQgSnVsICAxIDE2OjI5OjUwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYzogTWlub3IgZm9ybWF0dGluZyBpbXByb3ZlbWVudHMuCi0JKiByZWFkZWxmLmM6IE1pbm9yIG91dHB1dCBmb3JtYXR0aW5nIGltcHJvdmVtZW50LgotCi1XZWQgSnVsICAxIDE0OjIzOjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmNsZXgubDogQWRkIGNhc3RzIGFuZCBjaGFuZ2UgdHlwZXMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiByY3BhcnNlLnk6IExpa2V3aXNlLgotCSogcmVzYmluLmM6IExpa2V3aXNlLgotCSogcmVzY29mZi5jOiBMaWtld2lzZS4KLQkqIHJlc3JjLmM6IExpa2V3aXNlLgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShIRklMRVMpOiBSZW1vdmUgcmVhZGVsZi5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gQW5kcmV3IEtvemluCi0JPEFuZHJldy5Lb3ppbkBwMTQuZjk2MC5uNTAyMC56Mi5maWRvbmV0Lm9yZz46Ci0JKiB3aW5kdW5pLmg6IE5ldyBmaWxlLCBmcm9tIHdpbmRyZXMuaC4KLQkqIHdpbmR1bmkuYzogTmV3IGZpbGUsIGZyb20gd2luZHJlcy5jLgotCSogd2luZHJlcy5jOiBNb3ZlIFVuaWNvZGUgZnVuY3Rpb25zIGludG8gd2luZHVuaS5jLgotCSogd2luZHJlcy5oOiBNb3ZlIFVuaWNvZGUgZGVjbGFyYXRpb25zIGludG8gd2luZHVuaS5oLiAgSW5jbHVkZQotCXdpbmR1bmkuaC4KLSAJKFJUX0FDQ0VMRVJBVE9SKTogUmVuYW1lIGZyb20gUlRfQUNDRUxFUkFUT1JTIHRvIG1hdGNoIFdpbmRvd3MKLQltYWNyby4gIENoYW5nZSBhbGwgdXNlcy4KLQkoUlRfUExVR1BMQVksIFJUX1ZYRCk6IENvcnJlY3QgdmFsdWVzLgotCSogTWFrZWZpbGUuYW0gKEhGSUxFUyk6IEFkZCB3aW5kcmVzLmguCi0JKENGSUxFUyk6IEFkZCB3aW5kdW5pLmMuCi0JKHdpbmRyZXNfU09VUkNFUyk6IEFkZCB3aW5kdW5pLmMuCi0KLU1vbiBKdW4gMjkgMTc6MDE6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBVc2UgQkZEIEludGVybmFsIGFuZCBFeHRlcm5hbCBFbGYgc3RydWN0dXJlcy4KLQkqIHJlYWRlbGYuaDogUmVtb3ZlZCAtIG5vIGxvbmdlciBuZWVkZWQuCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHJlYWRlbGYuYydzIGRlcGVuZGVuY3kgdXBvbiByZWFkZWxmLmguCi0KLTE5OTgtMDYtMjYgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHN0cmlwX21haW4pOiBrZWVwX3NwZWNpZmljX2xpc3QgPT0gTlVMTCBhcyBhZGRpdGlvbmFsCi0JY29uZGl0aW9uIHRvIHNldCB1cCBzdHJpcCBhbGwgc3ltYm9scyBieSBkZWZhdWx0LgotCShjb3B5X2FyY2hpdmUpOiBkb24ndCBjaGFuZ2UgYXJjaGl2ZSB3aGVuIGVycm9yIGluIG9iamVjdCBmaWxlcyBvZgotCXRoZSBhcmNoaXZlLgotCi1XZWQgSnVuIDI0IDE3OjUzOjQ3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAocGFyc2VfbnVtYmVyKTogU2lnbiBleHRlbmQgbmVnYXRpdmUgdmFsdWVzIGNvcnJlY3RseSBpZgotCWJmZF92bWEgaXMgbGFyZ2VyIHRoYW4gdW5zaWduZWQgbG9uZy4KLQotVHVlIEp1biAyMyAxNDo1NTowNSAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCBsZXQgRVhFRVhUIGludGVyZmVyZQotCXdpdGggdGhlIHByb2dyYW0gdHJhbnNmb3JtIG5hbWUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEp1biAyMyAxMTowODo1MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFJld3JpdGUgdG8gdXNlIGZvcGVuL2ZyZWFkIHJhdGVociB0aGFuIG1tYXAuCi0KLQlBZGQgLS1zZWN0aW9uLWhlYWRlcnMgY29tbWFuZCBsaW5lIHN3aXRjaCwgd2hpY2ggaXMgYW4gYWxpYXMgZm9yCi0JLS1zZWN0aW9ucy4KLQotCUluY29ycG9yYXRlIGltcHJvdmVtbnRzIG1hZGUgYnkgQW5kcmVhcyBTY2h3YWIKLQk8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPiBpbmNsdWRpbmcgb3V0cHV0Ci0JZm9ybWF0dGluZyBhbmQgdmVyc2lvbiBpbmZvIGRpc3BsYXkuCi0KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IC0tc2VjdGlvbi1oZWFkZXJzIHN3aXRjaCB0byByZWFkZWxmLgotCi1Nb24gSnVuIDIyIDE4OjI4OjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBJbmNsdWRlIGJmZC5oIGFuZCBidWNvbW0uaCBiZWZvcmUgc3lzdGVtIGhlYWRlcgotCWZpbGVzLgotCShwYXJzZV9hcmdzKTogQ2hhbmdlIHR5cGUgb2YgYyBmcm9tIGNoYXIgdG8gaW50LgotCi1TdW4gSnVuIDE0IDE0OjI2OjI4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAodXNhZ2UpOiBXcml0ZSB0byBzdGRvdXQsIG5vdCBzdGRlcnIuCi0KLUZyaSBKdW4gMTIgMTM6MzM6NTEgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogRGVwZW5kIG9uIC5wb3QgZmlsZSBpZiBtYWludGFpbmVyIG1vZGUKLQllbmFibGVkLgotCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCi0KLUZyaSBKdW4gMTIgMTY6MDY6MTUgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X3BwY19yZWxfdHlwZSk6IE5ldyBQb3dlclBDIHN1cHBvcnQuCi0JKGR1bXBfcmVsb2NhdGlvbnMpOiBQb3dlclBDIHVzZXMgUkVMQSByZWxvY2F0aW9ucy4KLQkoZ2V0X21hY2hpbmVfbmFtZSk6IFNwZWxsIFBvd2VyUEMgY29ycmVjdGx5LgotCShnZXRfZmlsZV90eXBlKTogQ2hhbmdlIHVuc2lnbmVkIHNob3J0IHBhcmFtZXRlciB0byB1bnNpZ25lZC4KLQkoZ2V0X21hY2hpbmVfbmFtZSk6IERpdHRvLgotCShnZXRfbWFjaGluZV9kYXRhKTogUmV0dXJuIHdoZXRoZXIgYmlnIGVuZGlhbiBvciBsaXR0bGUgZW5kaWFuLgotCShnZXRfbWFjaGluZV9mbGFncyk6IEludGVycHJldCBQb3dlclBDLCBNMzJSLCBhbmQgTUlQUyBmbGFncy4KLQkocHJvY2Vzc19lbGZfaGVhZGVyKTogUHJpbnQgZW5kaWFuLWVzcy4gIENvbnZlcnQgYWxsIG51bWVyaWMKLQlmb3JtYXRzIHRvIGxvbmcgb3IgdW5zaWduZWQgbG9uZy4gIFByaW50IG91dCBtYWNoaW5lIHNwZWNpZmljIGZsYWcKLQliaXRzLgotCShwcm9jZXNzX3NlY3Rpb25faGVhZGVycyk6IEluY3JlYXNlIG5hbWUgYnkgMyBjb2x1bW5zIGFuZCBkZWNyZWFzZQotCXR5cGUgYnkgdGhlIHNhbWUgc28gdGhhdCAuZ2NjX2V4Y2VwdF90YWJsZSBmaXRzIGluIHRoZSBzcGFjZS4KLQotCSogcmVhZGVsZi5oOiBJbmNsdWRlIGVsZi9wcGMuaCwgZWxmL21pcHMuaCwgYW5kIGVsZi9tMzJyLmggdG8gZ2V0Ci0JbWFjaGluZSBzcGVjaWZpYyBmbGFnIGJpdHMuCi0KLVRodSBKdW4gMTEgMTc6NTQ6MjYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBSZW1vdmUgZXh0cmFuZW91cyAjaW5jbHVkZXMuICBGaXggd2FybmluZ3MgcHJvZHVjZWQKLQlieSAtV2FsbCB3aGVuIGNvbXBpbGluZyB1bmRlciBMaW51eC4KLQotCSogTWFrZWZpbGUuYW0gKHJlYWRlbGZfTERBREQpOiBBZGQgJChMSUJJQkVSVFkpLgotCi1UaHUgSnVuIDExIDE4OjMwOjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfaGFuZGxlKTogQWRkIHNlbGZfY3Jvc3NyZWYgZmllbGQuCi0JKHBhcnNlX3N0YWJfc3RyaW5nKTogSWYgYSB0YWcgaXMgYSBjcm9zcyByZWZlcmVuY2UgdG8gaXRzZWxmLAotCWRvbid0IGRlZmluZSBpdCBpbiB0aGUgdGFncyBsaXN0LgotCShwYXJzZV9zdGFiX3R5cGUpOiBTZXQgaW5mby0+c2VsZl9jcm9zc3JlZi4KLQotCSogZGVidWcuYyAoc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0KTogRGVmaW5lLgotCShkZWJ1Z19nZXRfcmVhbF90eXBlKTogQWRkIGxpc3QgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCUNoZWNrIGZvciBjaXJjdWxhcml0eSB0byBhdm9pZCBjcmFzaGluZyB3aGVuIGl0IG9jY3Vycy4KLQotVGh1IEp1biAxMSAxNDo0ODozMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IE5ldyBmaWxlOiBEaXNwbGF5IGNvbnRlbnRzIG9mIEVMRiBmb3JtYXQgZmlsZS4KLQkqIHJlYWRlbGYuaDogTmV3IGZpbGU6IEhlYWRlciBmaWxlIGZvciByZWFkZWxmLmMKLQkqIE1ha2VmaWxlLmFtOiBBZGQgcnVsZXMgdG8gYnVpbGQgcmVhZGVsZi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgcmVhZGVsZi4KLQkqIE5FV1M6IE1lbnRpb24gaW5jbHVzaW9uIG9mIHJlYWRlbGYgaW50byBiaW51dGlscy4KLQkqIHBvL1BPVEZJTEVTLmluOyBSZWJ1aWx0LgotCi1GcmkgSnVuICA1IDE4OjQzOjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChzZXR1cF9zZWN0aW9uKTogQWRqdXN0IHRoZSBzZWN0aW9uIHNpemUgaWYgY29weV9ieXRlCi0JaXMgPj0gMC4KLQkoY29weV9zZWN0aW9uKTogRG8gbm90IGNhbGwgYmZkX3NldF9zZWN0aW9uX3NpemUuCi0KLVRodSBKdW4gIDQgMDk6MTI6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X3VzYWdlKTogQWRkIG1pc3NpbmcgXG5cIGZyb20gaGVscCBkZXNjcmlwdGlvbi4KLQotV2VkIEp1biAgMyAxOTozMTozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChZQUNDKTogQ29ycmVjdCBiaXNvbiAtTCBvcHRpb24uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtcC8tLXByaXZhdGUtaGVhZGVycy4KLQotV2VkIEp1biAgMyAxMjowOTo0MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmM6IEFkZCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnM6IC0tY2hhbmdlLXNlY3Rpb24tbG1hCi0JYW5kIC0tY2hhbmdlLXNlY3Rpb24tdm1hLiAgUmVuYW1lIG9sZCBjb21tYW5kIGxpbmUgb3B0aW9uCi0JLS1hZGp1c3Qtc2VjdGlvbi12bWEgdG8gLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzLiAgUmVuYW1lCi0JLS1hZGp1c3Qtdm1hIHRvIC0tY2hhbmdlLWFkZHJlc3NlcyBhbmQgLS1hZGp1c3Qtc3RhcnQgdG8KLQktLWNoYW5nZS1zdGFydC4gIFByb3ZpZGUgYWxpYXNlcyB0byBzdXBwb3J0IHRoZSBvbGQgdmVyc2lvbnMgb2YKLQl0aGVzZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQotCUNoYW5nZSB0aGUgbmFtZXMgb2YgbWFjcm9zIGFuZCBlbnVtIGVsZW1lbnRzIHRvIHVwcGVyIGNhc2UgdG8KLQltYXRjaCB0aGUgR05VIGNvZGluZyBzdGFuZGFyZC4KLQotCVJlcGxhY2UgY2FsbHMgdG8gZnByaW50ZiAoc3RkZXJyLC4uLikgd2l0aCBjYWxscyB0byBmYXRhbCAoKSBvcgotCW5vbl9mYXRhbCAoKSBhcyBhcHByb3ByaWF0ZS4KLQotCSogb2JqY29weS4xOiBEb2N1bWVudCBjb21tYW5kIGxpbmUgb3B0aW9uIGNoYW5nZXMuCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCBjb21tYW5kIGxpbmUgb3B0aW9uIGNoYW5nZXMuCi0KLQkqIGJ1Y29tbS5oOiBOZXcgZXhwb3J0ZWQgZnVudGlvbiBmcm9tIGJ1Y29tbS5jOiBub25fZmF0YWwoKS4KLQkqIGJ1Y29tbS5jIChub25fZmF0YWwpOiBOZXcgZXhwb3J0ZWQgZnVuY3Rpb24uICBKdXN0IGxpa2UgZmF0YWwoKQotCWV4Y2VwdCB0aGF0IGl0IHJldHVybnMgcmF0aGVyIHRoYW4gY2FsbGluZyB4ZXhpdCgpLgotCi0JKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IENhbGwgZmF0YWwoKSByYXRoZXIgdGhhbiBiZmRfZmF0YWwoKS4KLQotCShjaGVja19tYXRjaGluZ19mb3JtYXRzKTogRml4IEMgZm9ybWF0aW5nLgotCi0JKHBhcnNlX3ZtYSk6IENhbGwgZmF0YWwoKS4KLQotTW9uIEp1biAgMSAxODoyNjo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFl1bGkgQmFyY29oZW4gPHl1bGkuYmFyY29oZW5AdGVscmFkLmNvLmlsPjoKLQkqIGRlYnVnLmMgKGRlYnVnX3R5cGVfc2FtZXApOiBBdm9pZCBlbmRsZXNzIGxvb3BzIGNvbXBhcmluZwotCWZ1bmN0aW9uIGFuZCBtZXRob2QgcGFyYW1ldGVyIHR5cGVzLgotCi1GcmkgTWF5IDIyIDE0OjAyOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChkdW1wX2lhdCk6IENvbW1lbnQgb3V0OyBub3QgdXNlZC4KLQkoZGlzcGxheSk6IFJlbmFtZSBmcm9tIHRlbGwuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0KLVRodSBNYXkgMTQgMTQ6MDA6NTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jOiBBZGQgc3VwcG9ydCBmb3IgVGh1bWIgRExMcy4gIEFkZCBzdXBwb3J0IGZvcgotCWludGVyd29ya2luZyBiZXR3ZWVuIEFSTSBhbmQgVGh1bWIgcHJvZ3JhbXMgYW5kIERMTHMuICBUaWR5IHRoZQotCWNvZGUuCi0KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IGRsbHRvb2wuCi0KLQkqIGNvbmZpZ3VyZTogQnVpbGQgZGxsdG9vbCBmb3IgdGh1bWItcGUgdGFyZ2V0cy4KLQotCSogdmVyc2lvbi5jIChwcmludF92ZXJzaW9uKTogSW5jbHVkZSAxOTk4IGluIGNvcHlyaWdodCBzdHJpbmdzLgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiKTogU3VwcG9ydCBXaW4zMiBzdHlsZSBkaXJlY3Rvcnkgc2VwYXJhdG9ycy4KLQotU3VuIE1heSAxMCAyMjozNDo0NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHBvL01ha2UtaW4gKGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXQuCi0KLUZyaSBNYXkgIDggMTA6MzM6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXIuYyAodXNhZ2UpOiBFeHRlbmQgaW5mb3JtYXRpb24gcHJvdmlkZWQgYWJvdXQgY29tbWFuZCBsaW5lCi0Jb3B0aW9ucy4KLQotV2VkIE1heSAgNiAxNToyODo1MSAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBSdW4gZGVjIGMgd2l0aCAvbm9kZWJ1Zy4gIFBhc3MgQ0MgdmFsdWUgd2hlbgotCWNhbGxpbmcgbWFrZS4KLQotVHVlIE1heSAgNSAxNToxOTowMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEJ1aWxkIGRsbHRvb2wgZm9yIHRodW1iLXBlIHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgZGxsdG9vbCBmb3IgdGh1bWItcGUgdGFyZ2V0LgotCi1TdW4gTWF5ICAzIDIyOjA0OjQ5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX1BST0dSQU1TKTogQ2hhbmdlICQoU1JDT05WX1BST0cpIHRvIHN5c2NvbmYKLQlzeXNkdW1wIGNvZmZkdW1wIHRvIGF2b2lkIGV4dHJhICQoRVhFRVhUKS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgQXByIDI5IDIyOjIyOjU1IDE5OTggIEdlb2ZmcmV5IE5vZXIgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTdG9wIGFwcGVuZGluZyBFWEVFWFQgdG8gdGhlIGVuZCBvZgotCVNSQ09OVl9QUk9HICh3cm9uZyBiZWNhdXNlIHRoYXQgdmFyaWFibGUgbWF5IGNvbnRhaW4gbXVsdGlwbGUKLQlwcm9ncmFtcykKLQkqIE1ha2VmaWxlLmFtOiBpbnN0ZWFkLCBhZGQgRVhFRVhUcyB0byBlYWNoIFNSQ09OVl9QUk9HCi0JcHJvZ3JhbQotCSogTWFrZWZpbGUuaW46IHJlZ2VuZXJhdGUKLQkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UdWUgQXByIDI4IDE5OjE0OjM0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWRkcjJsaW5lLmMgKG1haW4pOiBDb25kaXRpb25hbGx5IGNhbGwgc2V0bG9jYWxlLgotCSogd2luZHJlcy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzeXNkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN0cmluZ3MuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3Jjb252LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHNpemUuYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG5tLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG5sbWNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogZGxsdG9vbC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBjb2ZmZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBhci5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBidWNvbW0uaDogSW5jbHVkZSA8bG9jYWxlLmg+IGlmIEhBVkVfTE9DQUxFX0guCi0JKExDX01FU1NBR0VTKTogTm93IGNhbiBiZSBkZWZpbmVkIGV2ZW4gd2hlbiBFTkFCTEVfTkxTLgotCi1UdWUgQXByIDI4IDEwOjMzOjA3IDE5OTggIEJpbGwgTW95ZXIgIDx0dGtAY3lnbnVzLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBJTVBPUlRTOgotCSogZGVmcGFyc2UueSAoaW1wbGluZSk6IEFkZCBJTVBPUlRTIHN5bnRheGVzLgotCSogZGxsdG9vbC5jIChpZnVuY3R5cGUsIGloZWFkdHlwZSk6IE5ldyB0eXBlZGVmcy4KLQkoaW1wb3J0X2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShhcHBlbmRfaW1wb3J0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGVmX2ltcG9ydCk6IEFkZCBhbiBlbnRyeSB0byBpbXBvcnRfbGlzdC4KLQkoZ2VuZXJhdGVfaWRhdGFfb2ZpbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnZW5fZXhwX2ZpbGUpOiBDYWxsIGdlbmVyYXRlX2lkYXRhX29maWxlLgotCSogZGxsdG9vbC5oIChkZWZfaW1wb3J0KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi1Nb24gQXByIDI3IDE2OjM5OjIyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEFwciAyMiAxNjowMDozNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKE1LSU5TVEFMTERJUlMpOiBEb24ndCBsb29rIGluICQodG9wX3NyY2RpcikuCi0KLVdlZCBBcHIgMjIgMDA6MzM6NTYgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBzY3JpYmJsZXMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogU2VhcmNoIGludGwgZGlycyBmb3IgaGVhZGVyczsgZGVmaW5lCi0JTE9DQUxFRElSLgotCSogYWRkcjJsaW5lLmMgKG1haW4pOiBDYWxsIHNldGxvY2FsZSwgYmluZHRleHRkb21haW4sIHRleHRkb21haW4uCi0JKiBhci5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBjb2ZmZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBkbGx0b29sLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG5sbWNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogbm0uYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHNpemUuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3Jjb252LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN0cmluZ3MuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3lzZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiB3aW5kcmVzLmMgKG1haW4pOiBMaWtld2lzZS4KLQotVHVlIEFwciAyMSAyMjoxMzowOCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgotCi0JKiBNYW55IGZpbGVzOiBBZGRlZCBnZXR0ZXh0IGludm9jYXRpb25zIGFyb3VuZCB1c2VyLXZpc2libGUKLQlzdHJpbmdzLgotCSogYnVjb21tLmg6IEFkZGVkIGdldHRleHQtcmVsYXRlZCBpbmNsdWRlcyBhbmQgZGVmaW5lcy4KLQkqIGFjY29uZmlnLmggKEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRURVhULCBIQVZFX1NUUENQWSwKLQlIQVZFX0xDX01FU1NBR0VTKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluOiBDYWxsIENZX0dOVV9HRVRURVhULiAgQ3JlYXRlIHBvL01ha2VmaWxlLmluIGFuZAotCXBvL01ha2VmaWxlLiAgVXNlIEFNX1BST0dfTEVYLgotCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBOZXcgbWFjcm8uCi0JKFBPVEZJTEVTKTogTGlrZXdpc2UuCi0JKHBvL1BPVEZJTEVTLmluKTogTmV3IHRhcmdldC4KLQkoTERBREQpOiBBZGRlZCBJTlRMTElCUy4KLQkob2JqZHVtcF9MREFERCk6IExpa2V3aXNlLgotCShjX19maWx0X0xEQUREKTogTGlrZXdpc2UuCi0JKGFyX0xEQUREKTogTGlrZXdpc2UuCi0JKHJhbmxpYl9MREFERCk6IExpa2V3aXNlLgotCShkbGx0b29sX0xEQUREKTogTGlrZXdpc2UuCi0JKHdpbmRyZXNfTERBREQpOiBMaWtld2lzZS4KLQkqIHBvL01ha2UtaW4sIHBvL1BPVEZJTEVTLmluLCBwby9iaW51dGlscy5wb3Q6IE5ldyBmaWxlcy4KLQotVHVlIEFwciAyMSAxNjowNzoxOCAxOTk4ICBTdGFuaXNsYXYgQnJhYmVjICA8dXR4QGszMzIuZmVsZC5jdnV0LmN6PgotCi0JKiBvYmpjb3B5LmMgKHByZXNlcnZlX2RhdGVzKTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlLgotCShzbWFydF9yZW5hbWUpOiBJZiBwcmVzZXJ2ZV9kYXRlcywgY2FsbCBzZXRfdGltZXMgd2hlbiBjb3B5aW5nLgotCShzdHJpcF9tYWluKTogUmVtb3ZlIHByZXNlcnZlX2RhdGVzIGxvY2FsIHZhcmlhYmxlLgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQotVHVlIEFwciAgNyAxNTo0MToxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChESVNUU1RVRkYpOiBBZGQgZGVmcGFyc2UuaCwgZGVmcGFyc2UuYywgcmNsZXguYywKLQlyY3BhcnNlLmgsIGFuZCByY3BhcnNlLmMKLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gQXByICA2IDE2OjI0OjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFBST0dTKTogTW92ZSAkKEFERFIyTElORV9QUk9HKSB0byBlbmQsIHNvIHRoYXQKLQlNYWtlZmlsZS5pbiBkb2Vzbid0IGhhdmUgYW4gZW1wdHkgY29udGludWF0aW9uIGxpbmUuCi0JKGJpbl9QUk9HUkFNUyk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBcHIgIDMgMTQ6NDg6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBBZGQgc2l0ZS5leHAgYW5kIHNpdGUuYmFrLgotCShNT1NUTFlDTEVBTkZJTEVTKTogQWRkIGJpbnV0aWxzLmxvZywgYmludXRpbHMuc3VtLCBhbmQgYWJjZGVmZ2gqLgotCShtb3N0bHljbGVhbi1sb2NhbCk6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEFwciAgMSAxNTo1NDoxNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFphY2sgV2VpbmJlcmcgPHphY2tAcmFiaS5waHlzLmNvbHVtYmlhLmVkdT4gYW5kIEguSi4gTHUKLQk8aGpsQGdudS5vcmc+OgotCSogYXIuYyAodXNhZ2UpOiBNZW50aW9uIFMgbW9kaWZpZXIuCi0JKG1haW4pOiBBZGQgUyBtb2RpZmllci4KLQkqIGFyLjEsIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IFMgbW9kaWZpZXIuCi0KLVdlZCBBcHIgIDEgMTM6MTE6MjMgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGJpbnV0aWxzLnRleGk6IFVzZSBAaXRlbXggZm9yIGEgc2Vjb25kYXJ5IGl0ZW0gaW4gYSB0YWJsZS4KLQotVHVlIE1hciAzMSAxODo0NDoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRlcC1pbi5zZWQ6IEFkZCBydWxlIHRvIHJlbW92ZSBAT0JKRElSQC4KLQkqIE1ha2VmaWxlLmFtIChkZXAuc2VkKTogU3Vic3RpdHV0ZSBmb3IgQE9CSkRJUkAuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIE1hciAzMCAxMjo0NzoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IHZlcnNpb24gdG8gMi45LjEuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KLQotCSogTWFrZWZpbGUuYW0gKERJU1RDTEVBTkZJTEVTKTogUmVtb3ZlIGRlZnBhcnNlLmgsIGFycGFyc2UuaCwKLQlyY3BhcnNlLmgsIGFuZCBubG1oZWFkZXIuaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1TYXQgTWFyIDI4IDE3OjM5OjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKE1PU1RMWUNMRUFORklMRVMpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCUZpeCBzb21lIGdjYyAtV2FsbCB3YXJuaW5nczoKLQkqIG5sbWNvbnYuYyAobWFpbik6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkoYWxwaGFfbWFuZ2xlX3JlbG9jcyk6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25fc3RhYnMpOiBMaWtld2lzZS4KLQkqIHNpemUuYyAocHJpbnRfc3lzdl9mb3JtYXQpOiBMaWtld2lzZS4KLQkqIHNyY2NvbnYuYyAod3Jfb2IpOiBMaWtld2lzZS4KLQkqIHdyc3RhYnMuYyAoc3RhYl9tb2RpZnlfdHlwZSk6IExpa2V3aXNlLgotCShzdGFiX3ZhcmlhYmxlKTogTGlrZXdpc2UuCi0JKiBubG1jb252LmMgKG1haW4pOiBJbml0aWFsaXplIHZhcmlhYmxlcyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIG5tLmMgKHNvcnRfc3ltYm9sc19ieV9zaXplKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogTGlrZXdpc2UuCi0JKiB3cnN0YWJzLmMgKHN0YWJfZW5kX2NsYXNzX3R5cGUpOiBMaWtld2lzZS4KLQkqIGNvZmZncm9rLmMgKGRvX3NlY3Rpb25zX3AyKTogQ2hhbmdlIGogdG8gdW5zaWduZWQgaW50LgotCShkb19saW5lcyk6IENoYW5nZSBsIHRvIHVuc2lnbmVkIGludC4KLQkqIG5sbWhlYWRlci55ICh5eWxleCk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KLQkqIG5tLmMgKHByaW50X3N5bWJvbCk6IENoYW5nZSBqIHRvIGxvbmcuCi0JKiBzaXplLmMgKGxwcmludF9udW1iZXIpOiBDb21tZW50IG91dC4KLQkqIHNyY29udi5jICh3cl9vYik6IENoYW5nZSBpIHRvIGJmZF9zaXplX3R5cGUuCi0JKiBzeXNkdW1wLmMgKHVuaXRfaW5mb19saXN0KTogQ29tbWVudCBvdXQuCi0JKG9iamVjdF9ib2R5X2xpc3QsIHByb2dyYW1fc3RydWN0dXJlLCBkZWJ1Z19saXN0KTogTGlrZXdpc2UuCi0JKiBzeXNpbmZvLnkgKHl5ZXJyb3IpOiBSZXR1cm4gdmFsdWUuCi0KLVRodSBNYXIgMjYgMTc6MDY6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZGVmcGFyc2UueSAoZXhwbGlzdCk6IEFsbG93IGVwc2lsb24uCi0JU3VnZ2VzdGlvbiBmcm9tIEpvbmF0aGFuLUhhcnJpc0Bwc2lvbi5jb20uCi0KLVRodSBNYXIgMjYgMTY6NTk6MDkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29mZmdyb2suYyAoZG9fc2VjdGlvbnNfcDEpOiBVc2UgdGhlIHNlY3Rpb24ncyBsbWEgaW5zdGVhZCBvZiB2bWEKLQlmb3IgdGhlIGJlbmVmaXQgb2YgcHJvbSBsb2FkZXJzLgotCi1XZWQgTWFyIDI1IDEzOjA1OjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSAgPGhqbEBnbnUub3JnPjoKLQkqIE1ha2VmaWxlLmFtIChESVNUU1RVRkYpOiBOZXcgdmFyaWFibGUuCi0JKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCi0JKERJU1RDTEVBTkZJTEVTKTogTmV3IHZhcmlhYmxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBNYXIgMjQgMTk6MzM6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByY2xleC5sOiBBY2NlcHQgeyBhbmQgfSBhcyBzeW5vbnltcyBmb3IgQkVHSU4gYW5kIEVORC4KLQotRnJpIE1hciAyMCAxOToxODowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxpYnRvb2wgMS4yLgotCi1UdWUgRmViIDI0IDEzOjA3OjUwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IERlbGV0ZSAiKytwbGFjZSIgYWZ0ZXIgY2FsbCB0bwotCWZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzLiAgU2V0IGRpc2FzbV9pbmZvLnN5bWJvbHMgdG8gYXJyYXkgb2YKLQlzeW1ib2xzIGF0IHRoZSBjdXJyZW50IGFkZHJlc3MuCi0KLVdlZCBGZWIgMTggMjM6Mzk6NDYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IEluc3RhbGwgcHJvcGVybHkgd2hlbiBsbgotCWZhaWxzIG9yIHRvb2xkaXIgPT0gcHJlZml4LgotCi1UdWUgRmViIDE3IDE4OjQwOjU1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29tcGFyZV9zZWN0aW9uX2xtYSk6IFJlbmFtZSBmcm9tIF92bWEuCi0gICAgICAgIChjb3B5X29iamVjdCk6IEdhcCBmaWxsIGJhc2VkIG9uIExNQSBub3QgVk1BLgotCSogYmludXRpbHMudGV4aTogVXBkYXRlIGFuZCBjbGFyaWZ5LgotCSogb2JqY29weS4xOiBMaWtld2lzZS4KLQotVHVlIEZlYiAxNyAyMDozNDoxMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZ2VuX2V4cF9maWxlKTogR2VuZXJhdGUgX2ltcF9fJXMgYXMgd2VsbCBhcyBfX2ltcF8lcywKLQlmb3IgTWljcm9zb2Z0IGNvbXBhdGliaWxpdHkuCi0JKG1ha2Vfb25lX2xpYl9maWxlKTogTGlrZXdpc2UuCi0KLQkqIGRsbHRvb2wuYyAobWFrZV9vbmVfbGliX2ZpbGUpOiBEb24ndCBhZGQgMSB0byBoaW50LgotCi1GcmkgRmViIDEzIDE2OjM3OjQ0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KLQotVGh1IEZlYiAxMiAxNDoxMzo0NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRlZmxleC5sOiBBY2NlcHQgJz8nIGluIHN5bWJvbCBuYW1lcywgZm9yIFZDKysgbWFuZ2xlZCBuYW1lcy4KLQlGcm9tIE1pa2V5IDxqZWZmZGJAbmV0em9uZS5jb20+LgotCi0JKiBhZGRyMmxpbmUuYyAodXNhZ2UpOiBVcGRhdGUgYnVnLWdudS11dGlscyBhZGRyZXNzLgotCSogYXIuYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIG5sbWNvbnYuYyAoc2hvd191c2FnZSk6IExpa2V3aXNlLgotCSogbm0uYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAoY29weV91c2FnZSk6IExpa2V3aXNlLgotCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogc2l6ZS5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogd2luZHJlcy5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogYmludXRpbHMudGV4aSAoQnVnIFJlcG9ydGluZyk6IExpa2V3aXNlLgotCi1TYXQgRmViICA3IDE1OjM2OjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVRodSBGZWIgIDUgMTI6MjE6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLUZyaSBKYW4gMzAgMTk6MTY6MjggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENDX0ZPUl9UQVJHRVQsbmxtY29tdi5vKTogQ2hhbmdlIHByb2dyYW1fdHJhbnNmb3JtX25hbWUKLQl0byB0cmFuc2Zvcm0uCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotVGh1IEphbiAyOSAxNjoyNDowNCAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogZGxsdG9vbC5jOiBEZWZpbmUgZXhpdCBzdGF0dXMgbWFjcm9zIGZvciBfV0lOMzIgYnV0IG5vdAotCV9fQ1lHV0lOMzJfXy4KLQkoZ2VuX2xpYl9maWxlKTogQ2hlY2sgZm9yIGV4aXQgc3RhdHVzIG9mIHVubGluay4KLQkqIHJlc3JjLmM6IERlZmluZSBwb3BlbiBhbmQgcGNsb3NlIGlmIF9XSU4zMiBidXQgbm90Ci0JX19DWUdXSU4zMl9fLgotCi1XZWQgSmFuIDI4IDE3OjQ1OjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgdmZvcmsgY2hlY2suCi0JKiBubG1jb252LmM6IE5ldmVyIGluY2x1ZGUgdmZvcmsuaC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGNvbmZpZy5pbjogUmVidWlsZC4KLQotV2VkIEphbiAyOCAxNzo0MzowMiAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiA8Si5KLnZhbmRlckhlaWpkZW5Ac3R1ZGVudC51dHdlbnRlLm5sPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IE9ubHkgcGFzcyBvbmUgYXJndW1lbnQgdG8gbWtkaXIgaWYKLQlfV0lOMzIgYnV0IG5vdCBfX0NZR1dJTjMyX18uCi0JKHNtYXJ0X3JlbmFtZSk6IEFkZCBjb2RlIGZvciBfV0lOMzIgKG5vdCBfX0NZR1dJTjMyX18pLCB0byBjb3BlCi0Jd2l0aCBkaWZmZXJlbnQgcmVuYW1lIGJlaGF2aW91ciBhbmQgbGFjayBvZiBjaG93bi4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgbWluZ3czMiB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gYnVpbGQKLQlkbGx0b29sLgotCSogZGxsdG9vbC5jOiBOZXZlciBpbmNsdWRlIHZmb3JrLmguCi0JKHJ1bik6IFVzZSBwZXhlY3V0ZSByYXRoZXIgdGhhbiB2Zm9yay4KLQkoZ2VuX2xpYl9maWxlKTogQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGJmZF9zZXRfYXJjaGl2ZV9oZWFkIGFuZAotCWJmZF9jbG9zZS4gIENsb3NlIGFsbCB0aGUgQkZEcyBpbiB0aGUgYXJjaGl2ZSBiZWZvcmUgZGVsZXRpbmcgdGhlCi0JdGVtcG9yYXJ5IGZpbGVzLgotCi1UaHUgSmFuIDIyIDE2OjIyOjU1IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogQWRkIGZsYWcgSU5TTl9IQVNfUkVMT0MgdG8gdGVsbAotCWRpc2Fzc2VtYmx5IGZ1bmN0aW9uIHRoZXJlIGlzIGEgcmVsb2Mgb24gdGhpcyBsaW5lLgotCi1XZWQgSmFuIDE0IDE1OjI5OjQzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jIChzaCwgaDgzMDApOiBEZWxldGUgdmFyaWFibGVzLgotCShhZGRyc2l6ZSwgdG9vbG5hbWUsIHJuYW1lcyk6IE5ldyB2YXJpYWJsZXMuCi0JKHdyaXRlSU5UKTogVXNlIGFkZHJzaXplLgotCSh3cl91bik6IFVzZSB0b29sbmFtZS4KLQkod3JfaGQpOiBTZXQgdXAgYWRkcnNpemUgZXQgYWwgcHJvcGVybHkgZm9yIGg4MzAwW2hzXS4KLQkod2Fsa190cmVlX3N5bWJvbCk6IFplcm8gZHN5LiAgVXNlIHJuYW1lcy4KLQkod3JfdW4sIHdyX2hkLCB3cl9vYiwgd3JfZHUpOiBVc2UgcHJvcGVyIGJmZCBhY2Nlc3MgbWFjcm9zLgotCSogc3lzZHVtcC5jIChzaCwgaDgzMDApOiBEZWxldGUgdmFyaWFibGVzLgotCShhZGRyc2l6ZSk6IE5ldyB2YXJpYWJsZS4KLQkoZ2V0SU5UKTogVXNlIGl0LgotCShnZXRvbmUpOiBJbml0aWFsaXplIGl0LgotCShnZXRCSVRTKTogUmFuZ2UgY2hlY2sgb24gTUFYLgotCi1Nb24gRGVjIDI5IDE2OjU4OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gTWF0dGhldyBCZWxsYW50b25pIDxtYXR0aGV3QGNocnlzYWxpcy5jb20+OgotCSogYXIuYyAoZ2V0X3Bvc19iZmQpOiBBZGQgZGVmYXVsdF9wb3NuYW1lIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShyZXBsYWNlX21lbWJlcnMpOiBEZWZhdWx0IHRvIHJlcGxhY2luZyBpbiB0aGUgc2FtZSBwb3NpdGlvbi4KLQotTW9uIERlYyAyMiAxMToyNzoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJjbGV4Lmw6IERvbid0IHBlcm1pdCBhIGNvbW1hIGluIGEgU1RSSU5HLgotCSogcmNwYXJzZS55IChhY2NfZW50cnkpOiBXYXJuIGlmIGFuIGluYXBwcm9wcmlhdGUgbW9kaWZpZXIgaXMgdXNlZAotCXdpdGggYSBub24gVklSVEtFWS4KLQkoYWNjX2V2ZW50KTogRm9yIGEgY29udHJvbCBjaGFyYWN0ZXIsIHNldCBWSVJUS0VZLCBhbmQgZm9yY2UgdGhlCi0JY2hhcmFjdGVyIHRvIHVwcGVyY2FzZS4KLQkoYWNjX29wdGlvbnMpOiBEb24ndCByZXF1aXJlIGEgY29tbWEgc2VwYXJhdG9yLgotCi1UdWUgRGVjICA5IDEzOjI1OjQyIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzaXplLmMgKHNpemVfbnVtYmVyKTogTmV3IGZ1bmN0aW9uIHRvIHByb3ZpZGUgc2l6ZSBvZiBmaWVsZC4KLQkoe2wscn1wcmludF9udW1iZXIpOiBGb3Igb2N0YWwgYW5kIGhleCBmaWVsZHMsIHByaW50IGZpZWxkIHVzaW5nCi0JJzAnIGFuZCAnMHgnIHN1ZmZpeGVzLiAgRG8gbm90IGluY2x1ZGUgZm9sbG93aW5nIHRhYi4KLQkoc3lzdl9pbnRlcm5hbF9zaXplcik6IFNpemUgc2VjdGlvbiBuYW1lLCBzZWN0aW9uIHNpemUsIGFuZCB2bWEKLQlhZGRyZXNzIGZpZWxkcy4KLQkoc3lzdl9pbnRlcm5hbF9wcmludGVyKTogVXNlIGNhbGN1bGF0ZWQgc2l6ZXMgZm9yIHRoZSBjb2x1bW5zLgotCShwcmludF9zeXN2X2Zvcm1hdCk6IFNpemUgY29sdW1ucyBiZWZvcmUgcHJpbnRpbmcuCi0JKHByaW50X2JlcmtlbGV5X2Zvcm1hdCk6IFByaW50IHRhYnMgYmV0d2VlbiBudW1iZXJzIG5vdyB0aGF0Ci0Je2wscn1wcmludF9udW1iZXIgZG9lc24ndC4gIFByaW50IGZpZWxkcyByaWdodCBqdXN0aWZpZWQuCi0KLU1vbiBEZWMgIDggMTE6MjI6MDQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0pOiBSZW1vdmUgY2FsbCB0bwotCWRpc2FzbV9zeW1hZGRyKCkgYXMgdGhpcyBmdW5jdGlvbiBubyBsb25nZXIgZXhpc3RzLgotCi1UdWUgRGVjICAyIDEwOjIzOjUwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogQ2FsbCBkaXNhc21fc3ltYWRkcigpCi0JdG8gYWxsb3cgYmFja2VuZCB0byBrbm93IHdoaWNoIHN5bWJvbCBoYXMganVzdCBiZWVuIGRpc3BsYXllZC4KLQotVHVlIERlYyAgMiAxMzowNjo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdpbmRyZXMuaCAoRVNDQVBFXyopOiBEZWZpbmUgc3RhbmRhcmQgZXNjYXBlIHNlcXVlbmNlcy4KLQkqIHJjbGV4LmwgKGhhbmRsZV9xdW90ZXMpOiBIYW5kbGUgc3RhbmRhcmQgZXNjYXBlIHNlcXVlbmNlcy4gIFdhcm4KLQlhYm91dCBhbiB1bnJlY29nbml6ZWQgZXNjYXBlIGNoYXJhY3Rlci4KLQkqIHdpbmRyZXMuYyAodW5pY29kZV9wcmludCk6IFByaW50IHN0YW5kYXJkIGVzY2FwZSBzZXF1ZW5jZXMuCi0JKiByY3BhcnNlLnkgKGFjY19ldmVudCk6IEluaXRpYWxpemUgJCQubmV4dC4KLQkqIHJlc2Jpbi5jIChiaW5fdG9fcmVzX21lbnVpdGVtcyk6IERvbid0IHNldCBNRU5VSVRFTV9QT1BVUCBvcgotCU1FTlVJVEVNX0VORE1FTlUgaW4gdGhlIG1lbnUgaXRlbSBmbGFncy4KLQkoYmluX3RvX3Jlc19hY2NlbGVyYXRvcnMpOiBBbGxvY2F0ZSBhIHN0cnVjdHVyZSAodGhlIG9sZCBjb2RlCi0JbmV2ZXIgd29ya2VkKS4KLQkocmVzX3RvX2Jpbl9hY2NlbGVyYXRvcik6IENvcnJlY3QgdGhlIHRlc3QgZm9yIHNldHRpbmcgQUNDX0xBU1QuCi0JKHJlc190b19iaW5fZGlhbG9nKTogU2F2ZSB0aGUgZXh0ZW5kZWQgc3R5bGUgcmF0aGVyIHRoYW4gc2F2aW5nCi0JdGhlIHN0eWxlIHR3aWNlLiAgUmVtb3ZlIHVzZWxlc3Mgc2hhZG93aW5nIGxlbmd0aCB2YXJpYWJsZS4gIFNldAotCXRoZSBsZW5ndGggb2YgY29udHJvbCBkYXRhIGNvcnJlY3RseS4KLQkqIHJlc3JjLmMgKHdyaXRlX3JjX2RpYWxvZyk6IERvbid0IHByaW50IHRoZSBjbGFzcyBvciBtZW51IGlmIHRoZQotCXN0cmluZyBsZW5ndGggaXMgemVyby4KLQotTW9uIE5vdiAyNCAxODo1Mjo0MyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9hcmd0eXBlcyk6IERvbid0IHRyeSB0byBwYXJzZSB0aGUgbmFtZSBvZiBhCi0JZGVzdHJ1Y3RvciBhcyBtYW5nbGVkIGFyZ3VtZW50IHR5cGVzLgotCi1Nb24gTm92IDEwIDE3OjUxOjQxIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBhZGRyMmxpbmUuYyAodHJhbnNsYXRlX2FkZHJlc3Nlcyk6IFVzZSBiZmRfc2Nhbl92bWEgcmF0aGVyCi0JdGhhbiBzdHJ0b2wgdG8gc2NhbiBhZGRyZXNzZXMuCi0KLVN1biBOb3YgIDkgMTE6MDE6MzEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogRG9uJ3QgdXNlIGxpbmUgY29udGludWF0aW9ucyBoZXJlLgotCi1UdWUgTm92ICA0IDExOjU2OjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X3NlY3Rpb24pOiBEb24ndCBjcmFzaCBpZiB0aGVyZSBpcyBubyBwYXJ0aWN1bGFyCi0JaW5mb3JtYXRpb24gZm9yIGEgc2VjdGlvbi4KLQotTW9uIE5vdiAgMyAxMjozNjoxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAocGFyc2VfZmxhZ3MpOiBNYWtlIGZsYWcgY2hlY2sgY2FzZSBpbnNlbnNpdGl2ZS4KLQlDaGVjayBmb3IgYGNvbnRlbnRzJyBmbGFnLiAgR2l2ZSBhbiBlcnJvciBmb3IgdW5yZWNvZ25pemVkIGZsYWdzLgotCShjb3B5X3NlY3Rpb24pOiBJZiB0aGUgY29udGVudHMgZmxhZyB3YXMgc2V0IGZvciBhIHNlY3Rpb24gdGhhdAotCWhhZCBubyBjb250ZW50cywgemVybyBvdXQgdGhlIG5ldyBjb250ZW50cy4KLQkqIGJpbnV0aWxzLnRleGkgKG9iamNvcHkpOiBEb2N1bWVudCBjb250ZW50cyBzZWN0aW9uIGZsYWcuCi0KLVN1biBOb3YgIDIgMTQ6NDk6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmM6IE1vdmUgbmV3IHN0cnVjdCBhbmQgdmFyaWFibGUgZGVmaW5pdGlvbnMgdG8gdG9wIG9mCi0JZmlsZS4gIFJlbW92ZSBvYnNvbGV0ZSBhZGRfc3RyaXBfc3ltYm9sIGFuZCBpc19zdHJpcF9zeW1ib2wKLQlkZWNsYXJhdGlvbnMuICBBZGQgcHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgYWRkX3NwZWNpZmljX3N5bWJvbAotCWFuZCBpc19zcGVjaWZpZWRfc3ltYm9sLgotCi1Nb24gT2N0IDIwIDE1OjMxOjQzIDE5OTcgIEtsYXVzIEsiYW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWd1cmUuY29tIChIQVZFX1NCUkspOiBVbmRlZmluZS4KLQotVHVlIE9jdCAxNCAxNjoxNDozNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfc3ltYm9sX2F0X2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uICBSZXR1cm5zCi0JdHJ1ZSBpZiBhIHN5bWJvbCBjYW4gYmUgZm91bmQgYXQgdGhlIGFkZHJlc3MgcGFzc2VkIGluLgotCShkaXNhc3NlbWJsZV9kYXRhKTogU2V0IHRoZSBzeW1ib2xfYXRfYWRkcmVzc19mdW5jIGZpZWxkIHRvIHBvaW50Ci0JdG8gb2JqZHVtcF9zeW1ib2xfYXRfYWRkcmVzcy4KLQotRnJpIE9jdCAxMCAxNDoxMzowOSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMsIG9iamNvcHkuMSwgYmludXRpbHMudGV4aTogImxvY2FsaXplIiBpcyBhIGJldHRlciBuYW1lCi0JdGhhbiAicHJpdmF0aXplIi4gIFVwZGF0ZSBhbGwgcmVmZXJlbmNlcy4KLQotVGh1IE9jdCAgOSAxNTo1NzoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGkgKHN0cmlwKTogUmVtb3ZlIGR1cGxpY2F0ZSAtLXRhcmdldC4gIEZyb20gTWFydHkKLQlMZWlzbmVyIDxsZWlzbmVyQHNkc3AubWMueGVyb3guY29tPi4KLQotCSogbm0uYyAobGluZW5vX2NhY2hlX2JmZCk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZS4KLQkobGluZW5vX2NhY2hlX3JlbF9iZmQpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCi0JKGRpc3BsYXlfYXJjaGl2ZSk6IENsZWFyIGxpbmVub19jYWNoZV9iZmQgYW5kIGxpbmVub19jYWNoZV9yZWxfYmZkCi0Jd2hlbiBjbG9zaW5nIGEgQkZELgotCShkaXNwbGF5X2ZpbGUpOiBMaWtld2lzZS4KLQkocHJpbnRfc3ltYm9sKTogVXNlIGxpbmVub19jYWNoZV9iZmQgYW5kIGxpbmVub19jYWNoZV9yZWxfYmZkCi0JaW5zdGVhZCBvZiBjYWNoZV9iZmQgYW5kIGNhY2hlX3JlbF9iZmQuICBNYWtlIHNlY2NvdW50IHN0YXRpYywgYW5kCi0Jb25seSBzZXQgaXQgd2hlbiBzZXR0aW5nIHJlbG9jcy4KLQotV2VkIE9jdCAgOCAyMToxOToxMSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGtlZXBfc3BlY2lmaWNfbGlzdCwgcHJpdmF0aXplX3NwZWNpZmljX2xpc3QsCi0Jd2Vha2VuX3NwZWNpZmljX2xpc3QpOiBOZXcgdmFyaWFibGVzLgotCShrZWVwX3N5bWJvbHMpOiBSZW1vdmVkLgotCShhZGRfc3BlY2lmaWNfc3ltYm9sKTogTmV3IGZ1bmN0aW9uIGZyb20gdGhlIGNhcmNhcyBvZgotCWFkZF9zdHJpcF9zeW1ib2wuICBUYWtlcyBhIGxpc3QgYXMgYW4gYXJndW1lbnQuCi0JKGlzX3NwZWNpZmllZF9zeW1ib2wpOiBMaWtld2lzZSBmcm9tIGlzX3N0cmlwX3N5bWJvbC4KLQkoZmlsdGVyX3N5bWJvbHMpOiBIb25vciB0aGUgbmV3IHByaXZhdGl6ZSBhbmQgd2Vha2VuIGxpc3RzLgotCU9wdGltaXplIGJmZF9hc3ltYm9sX25hbWUgaGFuZGxpbmcuCi0JKGNvcHlfb2JqZWN0LCBjb3B5X29wdGlvbnMsIGNvcHlfdXNhZ2UpOiBBZGQgcHJpdmF0aXplLXN5bWJvbCAmCi0Jd2Vha2VuLXN5bWJvbCBvcHRpb25zLgotCi0JKiBvYmpjb3B5LjEsIGJpbnV0aWxzLnRleGk6IFVwZGF0ZSBkb2NzLgotCi1TdW4gT2N0ICA1IDA5OjA1OjQ0IDE5OTcgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IE1ha2UgIi0tcHJlZml4LWFkZHJlc3NlcyIKLSAJZGlzYXNzZW1ibHkgYWRqdXN0IHRvIG1peGVkLWxlbmd0aCBpbnN0cnVjdGlvbnMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IEFkZCAiMHgiIHByZWZpeCBmb3IgaGV4YWRlY2ltYWwKLSAJc3ltYm9sLW9mZnNldHMgaW4gZGlzYXNzZW1ibHkuCi0KLUZyaSBPY3QgIDMgMTI6MDQ6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHNldF90aW1lcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIHJlcGxhY2luZwotCW1ha2Vfc2FtZV9kYXRlcy4KLQkoc3RyaXBfbWFpbik6IElmIHByZXNlcnZlX2RhdGVzLCBzdGF0IHRoZSBpbnB1dCBmaWxlIGJlZm9yZQotCWNvcHlpbmcgaXQsIGFuZCBjYWxsIHNldF90aW1lcyBhZnRlcndhcmQuCi0JKGNvcHlfbWFpbik6IExpa2V3aXNlLgotCi0JKiB3cnN0YWJzLmMgKHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvKTogQ2FzdCBwIHRvCi0JY2hhciAqIHdoZW4gY2FsbGluZyBzdHJjcHkgYW5kIHN0cmxlbi4KLQotV2VkIFNlcCAyNCAxMTozNDowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGkJKGFyIGNtZGxpbmUpOiBEb2N1bWVudCB0aGF0IHEgbm93IHdvcmtzIGxpa2Ugci4KLQlGcm9tIE1hcnR5IExlaXNuZXIgPGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20+LgotCi0JKiBiaW51dGlscy50ZXhpIChzaXplKTogVGhlIG9iamVjdCBmaWxlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLgotCUZyb20gTWFydHkgTGVpc25lciA8bGVpc25lckBzZHNwLm1jLnhlcm94LmNvbT4uCi0KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEF1ZyAyNiAxNzo0ODozNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChFWEVFWFRfRk9SX0JVSUxEKTogTmV3IHZhcmlhYmxlLiAgVXNlIGl0IGluIGFsbAotCXJlZmVyZW5jZXMgdG8gdGhlIHN5c2luZm8gcHJvZ3JhbS4KLQkqIGNvbmZpZ3VyZS5pbjogUmVidWlsZCB3aXRoIG5ldyBiZmQvYWNpbmNsdWRlLm00LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBdWcgIDggMTU6MzI6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3aW5kcmVzLmM6IEluY2x1ZGUgPHRpbWUuaD4uCi0JKGRlZmluZV9yZXNvdXJjZSk6IFNldCBhIHRpbWVzdGFtcCBmb3IgdGhlIHJlc291cmNlLgotCi1XZWQgQXVnICA2IDEzOjM3OjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEZWZpbmUgVEFSR0VUIGluIGhlYWRlciBmaWxlLgotCSogYWNjb25maWcuaCAoVEFSR0VUKTogQWRkICN1bmRlZi4KLQkqIE1ha2VmaWxlLmFtICh2ZXJzaW9uLm8sIGJ1Y29tbS5vKTogUmVtb3ZlIHNwZWNpYWwgdGFyZ2V0cy4KLQkqIGJ1Y29tbS5jICh0YXJnZXQpOiBSZW1vdmUuCi0JKiBubS5jIChwcm9ncmFtX25hbWUpOiBEb24ndCBkZWNsYXJlLgotCSh0YXJnZXQpOiBNYWtlIHN0YXRpYy4KLQkqIHNpemUuYyAodGFyZ2V0KTogTWFrZSBzdGF0aWMuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbiwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBBdWcgIDUgMDA6MDE6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2stREVKQUdOVSk6IEV4cG9ydCByLgotCSguZGVwMSk6IFVzZSAkKElOQ0xVREVTKSByYXRoZXIgdGhhbiAkKEFMTF9DRkxBR1MpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIG5sbWhlYWRlci55OiBVc2UgVkVSU0lPTksgcmF0aGVyIHRoYW4gVkVSU0lPTi4KLQotCSogTWFrZWZpbGUuYW0gKFNUUklQX1BST0cpOiBDaGFuZ2UgZnJvbSBzdHJpcC5uZXcgdG8gc3RyaXAtbmV3LgotCShOTV9QUk9HKTogQ2hhbmdlIGZyb20gbm0ubmV3IHRvIG5tLW5ldy4KLQkoVE9PTF9QUk9HUywgaW5zdGFsbC1leGVjLWxvY2FsKTogQWRqdXN0IGFjY29yZGluZ2x5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBBdWcgIDQgMTE6NDc6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBBQ19BUkdfUFJPR1JBTTsgaXQncyBpbnZva2VkIGJ5Ci0JQU1fSU5JVF9BVVRPTUFLRS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IENyZWF0ZSAkKHRvb2xkaXIpL2JpbiBiZWZvcmUKLQl0cnlpbmcgdG8gaW5zdGFsbCBhbnl0aGluZyBpbnRvIGl0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmFtIChUT09MX1BST0dTKTogVXNlIGFuIGV4cGxpY2l0ICQoRVhFRVhUKS4KLQkoaW5zdGFsbC1leGVjLWxvY2FsKTogV2hlbiBoYW5kbGluZyAkKG5vaW5zdF9QUk9HUkFNUyksIG9ubHkgdXNlCi0JJChFWEVFWFQpIG9uIHRoZSBpbnN0YWxsZWQgZmlsZS4gIFdoZW4gaGFuZGxpbmcgJChUT09MX1BST0dTKSwKLQloYW5kbGUgJChFWEVFWFQpIGNvcnJlY3RseS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGFuIGV4cGxpY2l0ICQoRVhFRVhUKSB3aGVuIHN1YnN0aXR1dGluZyBmb3IKLQl0aGUgbmFtZSBvZiBhIHByb2dyYW0gdG8gYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggbmV3IGF1dG9tYWtlCi0JcGF0Y2hlcy4KLQotCSogZGVmbGV4LmwsIGRlZnBhcnNlLnk6IFVzZSBWRVJTSU9OSyByYXRoZXIgdGhhbiBWRVJTSU9OLgotCSogcmNsZXgubCwgcmNwYXJzZS55OiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmFtICh3aW5kcmVzX1NPVVJDRVMpOiBBZGQgJChCVUxJQlMpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBdWcgIDEgMTM6MDg6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IEluY2x1ZGUgYmZkL2FjaW5jbHVkZS5tNCwgbm90IGJmZC9hY21hY3Jvcy5tNC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1UaHUgSnVsIDMxIDExOjUxOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgTWFrZWZpbGUuaW4uCi0JKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLCBmcm9tIG9sZCBhY2xvY2FsLm00LgotCSogY29uZmlndXJlLmluOiBDYWxsIEFNX0lOSVRfQVVUT01BS0UgYW5kIEFNX1BST0dfTElCVE9PTC4gIFJlbW92ZQotCXNoYXJlZCBsaWJyYXJ5IGhhbmRsaW5nOyBub3cgaGFuZGxlZCBieSBsaWJ0b29sLiAgUmVwbGFjZQotCUFDX0NPTkZJR19IRUFERVIgd2l0aCBBTV9DT05GSUdfSEVBREVSLiAgQ2FsbCBBQ19QUk9HX1lBQ0MsCi0JQUNfUFJPR19MRVgsIEFDX0RFQ0xfWVlURVNULCBBTV9NQUlOVEFJTkVSX01PREUsIEFNX0NZR1dJTjMyLCBhbmQKLQlBTV9FWEVFWFQuICBSZXBsYWNlIEFDX1BST0dfSU5TVEFMTCB3aXRoIEFNX1BST0dfSU5TVEFMTC4gIFJlbW92ZQotCXN0YW1wLWggaGFuZGxpbmcgaW4gQUNfT1VUUFVULgotCSogYWNjb25maWcuaDogTWVudGlvbiBQQUNLQUdFIGFuZCBWRVJTSU9OLgotCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBOb3cgYnVpbHQgd2l0aCBhY2xvY2FsLgotCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQlGcm9tIFRvbiB2YW4gT3ZlcmJlZWsgPHR2b3ZlcmJlQHdrLmVzdGVjLmVzYS5ubD46Ci0JKiByY3BhcnNlLnkgKGRpYWxvZyk6IERlZmF1bHQgbWVudSBhbmQgY2xhc3MgdG8gYmUgbmFtZWQuCi0JKHN0eWxlcyk6IElmIEZPTlQgaXMgc2Vlbiwgc2V0IERTX1NFVEZPTlQgaW4gZGlhbG9nIHN0eWxlLgotCSogcmVzYmluLmMgKHJlc190b19iaW5fZGlhbG9nKTogQ29ycmVjdCBjb21wdXRhdGlvbiBvZiBmb250Ci0JaW5mb3JtYXRpb24gbGVuZ3RoLgotCi1XZWQgSnVsIDMwIDExOjIxOjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gVG9uIHZhbiBPdmVyYmVlayA8dHZvdmVyYmVAd2suZXN0ZWMuZXNhLm5sPjoKLQkqIHJlc2Jpbi5jIChyZXNfdG9fYmluX21lbnUpOiBDb3JyZWN0IGNvbXB1dGF0aW9uIG9mIG1lbnUKLQl2cy4gbWVudWV4IGxlbmd0aC4KLQkqIHJlc3JjLmMgKGRlZmluZV9zdHJpbmd0YWJsZSk6IEFkZCAxIHRvIHJlc291cmNlIElELgotCi1UdWUgSnVsIDI5IDExOjA2OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVzYmluLmMgKGJpbl90b19yZXNfc3RyaW5nKTogQ29ycmVjdCBhZGp1c3RtZW50IG9mIGRhdGEgYW5kCi0JbGVuZ3RoLiAgRnJvbSBUb24gdmFuIE92ZXJiZWVrIDx0dm92ZXJiZUB3ay5lc3RlYy5lc2Eubmw+LgotCi1UdWUgSnVsIDIyIDE4OjAxOjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbmxtY29udi5jIChsaW5rX2lucHV0cyk6IENhbGwgbGliaWJlcnR5IHBleGVjdXRlIGZ1bmN0aW9uLgotCShwZXhlY3V0ZSkgW211bHRpcGxlIHZlcnNpb25zXTogUmVtb3ZlLgotCi1UdWUgSnVsIDIyIDE2OjE5OjM0IDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogYnVjb21tLmMgKG1ha2VfdGVtcG5hbWUpOiBJZiB3ZSBtaWdodCBiZSB1c2luZyBhIERPUyBmaWxlc3lzdGVtLAotCWNoZWNrIGZvciBhIGJhY2tzbGFzaCBhcyB3ZWxsIGFzIGEgc2xhc2guCi0KLVRodSBKdW4gMjYgMTM6NTM6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3aW5kcmVzLmMgKG1haW4pOiBRdWl0IGlmIHdlIGRpZG4ndCBnZXQgYW55IHJlc291cmNlcy4KLQkodXNhZ2UpOiBGaXggLS15eWRlYnVnIHVzYWdlIG1lc3NhZ2UuCi0JKiByZXNjb2ZmLmMgKHdyaXRlX2NvZmZfZmlsZSk6IERvbid0IGZyZWUgdGhlIHJlbG9jYXRpb24gYXJyYXkKLQl1bnRpbCBhZnRlciB3ZSd2ZSBjbG9zZWQgdGhlIEJGRC4KLQkocmVhZF9jb2ZmX3JzcmMpOiBRdWl0IHJhdGhlciB0aGFuIHRyeSB0byByZWFkIHN0YW5kYXJkIGlucHV0LgotCSh3cml0ZV9jb2ZmX2ZpbGUpOiBRdWl0IHJhdGhlciB0aGFuIHRyeSB0byB3cml0ZSB0byBzdGFuZGFyZAotCW91dHB1dC4KLQkqIHJjcGFyc2UueTogQWRkIGEgY291cGxlIG9mIG1pc3Npbmcgc2VtaWNvbG9ucyAoYWNjZXB0ZWQgYnkgYmlzb24KLQlidXQgbm90IGJ5YWNjKS4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IHdpbmRyZXMuCi0KLVdlZCBKdW4gMjUgMjA6NTc6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZXNiaW4uYzogTmV3IGZpbGUuCi0JKiByY2xleC5sLCByY3BhcnNlLnksIHJlc2NvZmYuYywgcmVzcmMuYywgd2luZHJlcy5jLCB3aW5kcmVzLmg6Ci0JTnVtZXJvdXMgZml4ZXMgYW5kIGltcHJvdmVtZW50cy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKENGSUxFUyk6IEFkZCByZXNiaW4uYy4KLQkoV0lORFJFU19PQkpTKTogQWRkIHJlc2Jpbi5vLgotCi1TdW4gSnVuIDIyIDE3OjI5OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZpcnN0IHN0YWIgYXQgV2luZG93cyByZXNvdXJjZSBjb21waWxlcjoKLQkqIHdpbmRyZXMuaDogTmV3IGZpbGUuCi0JKiB3aW5kcmVzLmM6IE5ldyBmaWxlLgotCSogcmVzcmMuYzogTmV3IGZpbGUuCi0JKiByY3BhcnNlLnk6IE5ldyBmaWxlLgotCSogcmNsZXgubDogTmV3IGZpbGUuCi0JKiByZXNjb2ZmLmM6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBEZWZpbmUgYW5kIHN1YnN0aXR1dGUgQlVJTERfV0lORFJFUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKFdJTkRSRVNfUFJPRyk6IE5ldyB2YXJpYWJsZS4KLQkoUFJPR1MpOiBBZGQgQEJVSUxEX1dJTkRSRVNALgotCShIRklMRVMpOiBBZGQgZGxsdG9vbC5oIGFuZCB3aW5kcmVzLmguCi0JKENGSUxFUyk6IEFkZCB3aW5kcmVzLmMgYW5kIHJlc3JjLmMuCi0JKEdFTkVSQVRFRF9DRklMRVMpOiBBZGQgcmNwYXJzZS5jIGFuZCByY2xleC5jLgotCShXSU5EUkVTX09CSlMpOiBOZXcgdmFyaWFibGUuCi0JJChXSU5EUkVTX1BST0cpOiBOZXcgdGFyZ2V0LgotCShyY3BhcnNlLmMsIHJjcGFyc2UuaCwgcmNsZXguYyk6IE5ldyB0YXJnZXRzLgotCi1UaHUgSnVuIDEyIDEyOjI3OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChleHBvcnRfdHlwZSk6IEFkZCBkYXRhIGZpZWxkLgotCShkZWZfZXhwb3J0cyk6IEFkZCBkYXRhIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZHVtcF9kZWZfaW5mbyk6IFByaW50IGRhdGEgZmllbGQuCi0JKGdlbl9kZWZfZmlsZSk6IExpa2V3aXNlLgotCShtYWtlX29uZV9saWJfZmlsZSk6IEhhbmRsZSBkYXRhIGZpZWxkIGJ5IG5vdCBlbWl0dGluZyBzaW1wbGUKLQlsYWJlbCBhbmQgbm90IGVtaXR0aW5nIGFueXRoaW5nIGluIFNFQ19URVhULgotCShkdGFiKTogUHJpbnQgZGF0YSBmaWVsZC4KLQkocHJvY2Vzc19kdXBsaWNhdGVzKTogTWVyZ2UgZGF0YSBmaWVsZC4KLQkqIGRsbHRvb2wuaCAoZGVmX2V4cG9ydHMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBkZWZwYXJzZS55IChleHBsaW5lKTogQWNjZXB0IG9wdF9EQVRBLiAgUGFzcyBpdCB0byBkZWZfZXhwb3J0cy4KLQkob3B0X0RBVEEpOiBOZXcgbm9uLXRlcm1pbmFsLgotCi1XZWQgSnVuIDExIDE3OjE1OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5oOiBOZXcgZmlsZS4KLQkqIGRlZmxleC5sOiBJbmNsdWRlIGRsbHRvb2wuaCBhbmQgbGliaWJlcnR5LmguICBEb24ndCBkZWNsYXJlCi0Jc3RyZHVwLiAgVXNlIHhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgotCSogZGVmcGFyc2UueTogSW5jbHVkZSBiZmQuaCwgYnVjb21tLmgsIGFuZCBkbGx0b29sLmguCi0JKiBkbGx0b29sLmM6IEluY2x1ZGUgZGxsdG9vbC5oIGFuZCB0aW1lLmguICBNYWtlIGEgbG90IG9mCi0JdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgc3RhdGljLiAgTWFrZSBhIGxvdCBvZiBjaGFyICogdmFyaWFibGVzCi0JYW5kIHBhcmFtZXRlcnMgY29uc3QuICBBZGQgZGVjbGFyYXRpb25zIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgRG8KLQlzb21lIHJlaW5kZW50aW5nLiAgSGlkZSBtb3JlIFBvd2VyUEMgc3R1ZmYgaW5zaWRlIERMTFRPT0xfUFBDLgotCi1XZWQgSnVuIDExIDEyOjA1OjUyIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGFyLmMgKGJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlKTogQWRkIGNvbnN0LgotCi1Nb24gTWF5IDEyIDIyOjA5OjM1IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBQYXNzIENDX0ZPUl9UQVJHRVQgYW5kIENGTEFHU19GT1JfVEFSR0VUCi0JdG8gcnVudGVzdC4KLQotTW9uIE1heSAxMiAxMzoxNDoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2xlYXIgT1BDT0RFUyB3aGVuIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiBpcwotCXVzZWQgb24gSFAvVVguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgMjUgMTQ6MjI6MDggMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogQ2hhbmdlICouaW5mbyoKLQl0byBiaW51dGlscy5pbmZvKiB0byBzYXZlIHN5c3JvZmYuaW5mby4KLQotVHVlIEFwciAxNSAxMzo0MjoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogU2V0IHRvIEBJTlNUQUxMQC4KLQkoSU5TVEFMTF9YRk9STSwgSU5TVEFMTF9YRk9STTEpOiBSZW1vdmUuCi0JKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4gIFVzZSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi0JZGlyZWN0bHksIHJhdGhlciB0aGFuIHVzaW5nICQoSU5TVEFMTF9YRk9STSkgYW5kCi0JJChJTlNUQUxMX1hGT1JNMSkuCi0JKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbC1pbmZvKTogUnVuIG1raW5zdGFsbGRpcnMuCi0KLU1vbiBBcHIgMTQgMTE6NTI6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IENoYW5nZSBpbnN0YWxsLnNoIHRvIGluc3RhbGwtc2guCi0KLQlGcm9tIFRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT46Ci0JKiBNYWtlZmlsZS5pbjogQWx3YXlzIHVzZSAkKFNIRUxMKSB3aGVuIHJ1bm5pbmcgbW92ZS1pZi1jaGFuZ2UuCi0JKiBjb25maWd1cmUuaW46IFVzZSAke0NPTkZJR19TSEVMTH0gd2hlbiBydW5uaW5nICRhY19jb25maWdfc3ViLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByICA0IDEzOjI4OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQUNfRlVOQ19BTExPQ0EuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGJ1Y29tbS5oOiBBZGQgYWxsb2NhIGhhbmRsaW5nLCBjb3BpZWQgZnJvbSBnYXMvYXMuaC4KLQkqIGRsbHRvb2wuYzogQWRkICNwcmFnbWEgYWxsb2NhIGZvciBBSVggdG8gc3RhcnQgb2YgZmlsZS4KLQkqIG5sbWNvbnYuYzogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgc2l0ZS5leHAgYW5kIHNpdGUuYmFrLiAgUmVtb3ZlCi0JZXZlcnl0aGluZyB0aGF0IGNsZWFuIHJlbW92ZXMuCi0KLVRodSBBcHIgIDMgMTM6MTg6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFNldCB0byAyLjguMS4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgotCi1UdWUgQXByICAxIDE2OjIxOjQ0IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWd1cmUuY29tOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5oLXZtczogUmVtb3ZlIGZpbGUuCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSBmb3IgbmV3IGNvbmZpZ3VyZSBzY2hlbWUuCi0KLU1vbiBNYXIgMzEgMTU6MzA6NDMgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogb2JqY29weS5jIChtYWtlX3NhbWVfZGF0ZXMpOiBVc2Ugc3RhdGJ1Ziwgbm90IGJ1ZiwgaWYgbm90Ci0JSEFWRV9HT09EX1VUSU1FX0guCi0KLUZyaSBNYXIgMjggMTc6NTc6NTMgMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBNYWtlZmlsZS5pbiAoJChPQkpEVU1QX1BST0cpKTogRG9uJ3QgbGluayBhZ2FpbnN0IEJGRExJQiB0d2ljZS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0FSR19FTkFCTEUgZm9yIGNvbW1vbmJmZGxpYi4gIElmIGl0IGlzIHNldCwKLQlzZXQgT1BDT0RFUyB0byBlbXB0eS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE1hciAyNyAxNjowMzowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIE1hcnR5IExlaXNuZXIgPGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20+OgotCSogb2JqY29weS5jOiBJbmNsdWRlIDx1dGltZS5oPiBvciA8c3lzL3RpbWUuaD4uCi0JKHN0cmlwX29wdGlvbnMpOiBBZGQgInByZXNlcnZlLWRhdGVzIi4KLQkoY29weV9vcHRpb25zKTogTGlrZXdpc2UuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC1wIGFuZCAtLXByZXNlcnZlLWRhdGVzLgotCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCShtYWtlX3NhbWVfZGF0ZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJpcF9tYWluKTogSGFuZGxlIC1wLgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQkqIGJpbnV0aWxzLnRleGksIHN0cmlwLjEsIG9iamNvcHkuMTogRG9jdW1lbnQgbmV3IG9wdGlvbi4KLQotCWFkZHIybGluZS5jIGNvbnRyaWJ1dGVkIGJ5IFVscmljaCBMYXV0aGVyCi0JPFVscmljaC5MYXV0aGVyQHpmZS5zaWVtZW5zLmRlPjoKLQkqIGFkZHIybGluZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEFERFIyTElORV9QUk9HKTogTmV3IHZhcmlhYmxlLgotCShNQU5QQUdFUyk6IEFkZCBhZGRyMmxpbmUuCi0JKFBST0dTKTogQWRkICQoQUREUjJMSU5FX1BST0cpLgotCShDRklMRVMpOiBBZGQgYWRkcjJsaW5lLmMuCi0JKCQoQUREUjJMSU5FX1BST0cpKTogTmV3IHRhcmdldC4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IGFkZHIybGluZS4KLQkqIGFkZHIybGluZS4xOiBOZXcgZmlsZS4KLQotCSogdmVyc2lvbi5jIChwcmludF92ZXJzaW9uKTogVXBkYXRlIGNvcHlyaWdodCBkYXRlLgotCi1Nb24gTWFyIDI0IDEwOjUyOjQ1IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCBleGl0IGlmIGEgZmlsZSBjYW5ub3QgYmUKLQlkaXNhc3NlbWJsZWQsIGluc3RlYWQganVzdCByZXR1cm4uCi0KLVRodSBNYXIgMjAgMjE6MTY6NTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzaXplLmMgKHVzYWdlKTogTWFrZSBkZWZpbml0aW9uIG1hdGNoIGl0cyBwcm90b3R5cGUuCi0JKGRpc3BsYXlfYmZkLCBscHJpbnRfbnVtYmVyLCBycHJpbnRfbnVtYmVyKTogTGlrZXdpc2UuCi0JKHByaW50X2JlcmtlbGV5X2Zvcm1hdCwgc3lzdl9pbnRlcm5hbF9wcmludGVyKTogTGlrZXdpc2UuCi0JKHByaW50X3N5c3ZfZm9ybWF0KTogTGlrZXdpc2UuCi0JKiBubS5jIChzZXRfcHJpbnRfcmFkaXgsIHNldF9vdXRwdXRfZm9ybWF0KTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9ieXRlcyk6IExpa2V3aXNlLgotCi1UdWUgTWFyIDE4IDE2OjM5OjU1IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBNYW55IGZpbGVzOiBBZGQgZnVuY3Rpb24gcHJvdG90eXBlcy4KLQkqIGFyLmMgKG1yaV9lbXVsLCBnZXRfcG9zX2JmZCk6IE1ha2Ugc3RhdGljLgotCSogYXJsZXgubDogSW5jbHVkZSAibGliaWJlcnR5LmgiLiAgRG9uJ3QgZGVjbGFyZSBzdHJkdXAuICBVc2UKLQl4c3RyZHVwIHJhdGhlciB0aGFuIHN0cmR1cC4KLQkqIGFycGFyc2UueSAoeXllcnJvcik6IE1ha2UgYXJndW1lbnQgY29uc3QuICBDb3JyZWN0IHR5cG8uCi0JKiBhcnN1cC5jIChzdHJkdXApOiBEb24ndCBkZWNsYXJlLgotCShhcl9zYXZlKTogVXNlIHhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgotCSogZmlsZW1vZGUuYzogSW5jbHVkZSAiYnVjb21tLmgiLgotCSogbm0uYyAodXNhZ2UpOiBNYWtlIHN0YXRpYy4KLQkocHJpbnRfc3ltbmFtZSk6IE1ha2UgZm9ybWF0IGFuZCBuYW1lIGNvbnN0LgotCSogb2JqY29weS5jIChjYXQpOiBSZW1vdmUuCi0JKGNvcHlfYXJjaGl2ZSk6IE1ha2Ugb3V0cHV0X3RhcmdldCBjb25zdC4gIFVzZSBjb25jYXQsIG5vdCBjYXQuCi0JKGNvcHlfZmlsZSwgc2ltcGxlX2NvcHksIHNtYXJ0X3JlbmFtZSk6IE1ha2UgYXJndW1lbnRzIGNvbnN0LgotCSogb2JqZHVtcC5jIChyZWFkX3NlY3Rpb25fc3RhYnMpOiBMaWtld2lzZS4KLQkocHJpbnRfc2VjdGlvbl9zdGFicyk6IExpa2V3aXNlLgotCShkaXNwbGF5X3RhcmdldF90YWJsZXMpOiBEb24ndCBkZWNsYXJlIGdldGVudi4KLQkqIHN0cmluZ3MuYyAoc3RyaW5nc19vYmplY3RfZmlsZSk6IENoYW5nZSBmaWxlIHRvIGNvbnN0LgotCShwcmludF9zdHJpbmdzKTogQ2hhbmdlIGZpbGVuYW1lIHRvIGNvbnN0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1UdWUgTWFyIDE4IDExOjM3OjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQkZEX05FRURfREVDTEFSQVRJT04oZ2V0ZW52KS4KLQkqIGFjY29uZmlnLmg6IEFkZCBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVi4KLQkqIGJ1Y29tbS5oIChnZXRlbnYpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fR0VURU5WLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBubG1jb252LmMgKGdldGVudik6IERvbid0IGRlY2xhcmUuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotU2F0IE1hciAxNSAxNTozNTo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gSmFtaWUgTG9raWVyIDxqYW1pZUByZWJlbGxpb24uY28udWs+OgotCSogb2JqZHVtcC5jOiBJbmNsdWRlICJkZW1hbmdsZS5oIi4KLQkoZG9fZGVtYW5nbGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCSh1c2FnZSk6IE1lbnRpb24gLUMvLS1kZW1hbmdsZS4KLQkobG9uZ19vcHRpb25zKTogQWRkICJkZW1hbmdsZSIuCi0JKG9iamR1bXBfcHJpbnRfc3ltbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IFVzZSBvYmpkdW1wX3ByaW50X3N5bW5hbWUuCi0JKGRpc2Fzc2VtYmxlX2J5dGVzKTogTGlrZXdpc2UuCi0JKGR1bXBfcmVsb2Nfc2V0KTogTGlrZXdpc2UuCi0JKGR1bXBfc3ltYm9scyk6IERlbWFuZ2xlIHN5bWJvbCBuYW1lLgotCShtYWluKTogSGFuZGxlIC1DLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtQy8tLWRlbWFuZ2xlLgotCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogTWVudGlvbiAtLW5vLXNob3ctcmF3LWluc24uCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAibm8tc2hvdy1yYXctaW5zbiIuCi0JKGRpc2Fzc2VtYmxlX2J5dGVzKTogSGFuZGxlIC0tbm8tc2hvdy1yYXctaW5zbi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLS1uby1zaG93LXJhdy1pbnNuLgotCi1XZWQgTWFyIDEyIDExOjQyOjAwIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiByZGRiZy5jIChmcmVlX3NhdmVkX3N0YWJzKTogU2V0IHRoZSBzdHJpbmdzIHRvIE5VTEwgYWZ0ZXIgYmVpbmcKLQlmcmVlZC4KLQotRnJpIEZlYiAyOCAxNzoxODo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJ1Y29tbS5jIChzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0KTogTmV3IGZ1bmN0aW9uLgotCSogYnVjb21tLmggKHNldF9kZWZhdWx0X2JmZF90YXJnZXQpOiBEZWNsYXJlLgotCSogYXIuYyAobWFpbik6IENhbGwgc2V0X2RlZmF1bHRfYmZkX3RhcmdldC4KLQkqIG5sbWNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogbm0uYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHNpemUuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbiAoYnVjb21tLm8pOiBOZXcgdGFyZ2V0LCB0byBkZWZpbmUgVEFSR0VULgotCi1UdWUgRmViIDI1IDIxOjI4OjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChhZGp1c3Rfc2VjdGlvbl92bWEpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCSh1c2FnZSk6IE1lbnRpb24gLS1hZGp1c3Qtc2VjdGlvbi12bWEuCi0JKE9QVElPTl9BREpVU1RfVk1BKTogRGVmaW5lLgotCShsb25nX29wdGlvbnMpOiBBZGQgImFkZGp1c3Qtdm1hIi4KLQkoZGlzcGxheV9iZmQpOiBJZiBhZGp1c3Rfc2VjdGlvbl92bWEgaXMgbm90IDAsIGFkZCBpdCB0byBhbGwgdGhlCi0Jc2VjdGlvbiBhZGRyZXNzZXMuCi0JKG1haW4pOiBIYW5kbGUgT1BUSU9OX0FESlVTVF9WTUEuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC0tYWRqdXN0LXZtYS4KLQotRnJpIEZlYiAxNCAxODo0Njo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKHByaW50X3N5bWJvbCk6IENhY2hlIHRoZSBCRkQgYXMgd2VsbCBhcyB0aGUgc3ltYm9scyBhbmQKLSAJcmVsb2NzLCBhbmQgZG9uJ3QgdHJ5IHRvIHVzZSB0aGUgc3ltYm9scyBvciByZWxvY3Mgd2l0aCBhCi0gCWRpZmZlcmVudCBCRkQuCi0KLVRodSBGZWIgMTMgMjE6MzQ6NDMgMTk5NyAgS2xhdXMgS2FlbXBmICAoa2thZW1wZkBwcm9naXMuZGUpCi0KLQkqIGNvbmZpZy5oLXZtczogc2JyaygpIGlzIHByb3ZpZGVkIG9uIG9wZW5WTVMvQWxwaGEuCi0JKiBtYWtlZmlsZS52bXM6IGFsbG93IGNvbXBpbGluZyB3aXRoIGN1cnJlbnQgZ2NjIHNuYXBzaG90LgotCi1UaHUgRmViIDEzIDIwOjE0OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJzdXAuYywgY29mZmdyb2suYywgZGxsdG9vbC5jLCBubG1jb252LmM6IFVzZSB4bWFsbG9jIHJhdGhlcgotCXRoYW4gbWFsbG9jLgotCi1XZWQgRmViIDEyIDE2OjEyOjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogQ29ycmVjdCBWTUEgYXJndW1lbnQgdG8KLQlmaW5kX3N5bWJvbF9mb3JfYWRkcmVzcy4gIEltcHJvdmUgaGFuZGxpbmcgb2YgY29kZSB3aXRoIG5vIHN5bWJvbAotCWZvbGxvd2VkIGJ5IGNvZGUgd2l0aCBhIHN5bWJvbC4KLQotV2VkIEZlYiAxMiAxMjoxNjo0NyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IE1ha2Ugb3V0cHV0IG9mIHJhdyBpbnN0cnVjdGlvbnMKLQl3b3JrIGJldHRlciBmb3Igbm9uLXN0YW5kYXJkIHZhbHVlcyBvZiBieXRlc19wZXJfY2h1bmsgYW5kCi0JYnl0ZXNfcGVyX2xpbmUuCi0KLVRodSBGZWIgIDYgMTQ6MTQ6NTkgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBBZGRlZCBjb2RlIHRvIGFsbG93IHNvbWUgY29udHJvbAotIAlvdmVyIHRoZSB3YXkgcmF3IGluc3RydWN0aW9ucyBhcmUgZGlzcGxheWVkLgotCi1UaHUgRmViICA2IDEyOjM2OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc3RydWN0IGJpbmNsX2ZpbGUpOiBBZGQgbmV4dF9zdGFjayBmaWVsZC4KLQkocHVzaF9iaW5jbCk6IFB1dCB0aGUgbmV3IGZpbGUgb24gYm90aCBiaW5jbF9saXN0IGFuZAotCWJpbmNsX3N0YWNrLiAgQ2xlYXIgdGhlIGZpbGVfdHlwZXMgZmllbGQuCi0JKHBvcF9iaW5jbCk6IFVzZSB0aGUgbmV4dF9zdGFjayBmaWVsZCB3aGVuIHBvcHBpbmcgdGhlIHN0YWNrLgotCURvbid0IHB1dCB0aGUgZmlsZSBvbiBiaW5jbF9saXN0LgotCShmaW5kX2V4Y2wpOiBJbmNsdWRlIHRoZSBmaWxlIG5hbWUgd2hlbiB3YXJuaW5nIGFib3V0IGFuIHVuZm91bmQKLQlOX0VYQ0wuCi0KLQkqIGRlYnVnLmMgKGRlYnVnX3R5cGVfc2FtZXApOiBEb24ndCBjcmFzaCBpZiB3ZSBhcmUgcGFzc2VkIE5VTEwuCi0KLVRodSBGZWIgIDYgMTE6NTQ6MjQgMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBvYmpjb3B5LjE6IEFkZCBtaXNzaW5nIHNwYWNlIGFmdGVyIC5CLgotCi1GcmkgSmFuIDMxIDEwOjMzOjA3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBJbml0aWFsaXplIGBhdXgucmVxdWlyZV9zZWMnLgotCi1XZWQgSmFuIDI5IDEzOjIxOjIxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X3ZhbHVlKTogQWRkIHNraXBfemVyb2VzIHBhcmFtZXRlci4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IExpa2V3aXNlLiAgQ2FsbCBvYmpkdW1wX3ByaW50X3ZhbHVlCi0JdG8gcHJpbnQgYWRkcmVzcy4KLQkob2JqZHVtcF9wcmludF9hZGRyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogSnVzdCBjYWxsIG9iamR1bXBfcHJpbnRfYWRkci4KLQkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBQcmludCByZWFsIGFkZHJlc3MsIG5vdCBmdW5jdGlvbiBvZmZzZXQuCi0JU2tpcCBhIGNlcnRhaW4gbnVtYmVyIG9mIGxlYWRpbmcgemVyb2VzLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX3plcm9lcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtLWRpc2Fzc2VtYmxlLXplcm9lcy4KLQkobG9uZ19vcHRpb25zKTogQWRkICJkaXNhc3NlbWJsZS16ZXJvZXMiLgotCShkaXNhc3NlbWJsZV9ieXRlcyk6IENoZWNrIGRpc2Fzc2VtYmxlX3plcm9lcy4KLQotVHVlIEphbiAyOCAxNjo0NzoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBEb24ndCBza2lwIHplcm9lcyBpZiB0aGUKLQlkaXNhc3NlbWJsZXIgaGFzIHRvbGQgdXMgdGhhdCB3ZSBhcmUgaW4gYSBicmFuY2ggZGVsYXkgc2xvdC4KLQotTW9uIEphbiAyMCAxNDoyNDowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNpemUuYyAoYmVya2VsZXlfc3VtKTogUmV3cml0ZS4gIFNraXAgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdAotCVNFQ19BTExPQy4gIENvdW50IFNFQ19SRUFET05MWSBzZWN0aW9ucyBhcyB0ZXh0LgotCi1UdWUgSmFuIDE0IDE1OjE0OjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogUmVtb3ZlICouaW5mbyosIG5vdAotCWp1c3QgKi5pbmZvLiAgRnJvbSBILkouIEx1IDxoamxAbHVjb24ub3JnPi4KLQotVHVlIERlYyAzMSAxNTo0Mjo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogQWRkIC1EX0dOVV9TT1VSQ0UuCi0KLUZyaSBEZWMgMjcgMTE6MTk6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFdvcmsgYXJvdW5kIGJ1ZyBpbiBBQ19GVU5DX1ZGT1JLIGluIGF1dG9jb25mIDIuMTIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBEZWMgMTkgMTM6MTE6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBBbmRyZXcgSiBLbG9zc25lciA8YW5kcmV3QHBvZ28ud3YudGVrLmNvbT46Ci0JKiBvYmpjb3B5LmMgKE9QVElPTl9XRUFLRU4pOiBEZWZpbmUuCi0JKGNvcHlfb3B0aW9ucyk6IEFkZCAid2Vha2VuIi4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS13ZWFrZW4uCi0JKHdlYWtlbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGZpbHRlcl9zeW1ib2xzKTogSGFuZGxlIHdlYWtlbi4KLQkoY29weV9vYmplY3QpOiBDYWxsIGZpbHRlcl9zeW1ib2xzIGlmIHdlYWtlbi4KLQkoY29weV9tYWluKTogSGFuZGxlIE9QVElPTl9XRUFLRU4uCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0td2Vha2VuLgotCi1XZWQgRGVjIDE4IDIyOjQ5OjEzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBVc2UgTmV3Rm9sZGVyUmVjdXJzaXZlIGZvciBpbnN0YWxsYXRpb24uCi0KLVNhdCBEZWMgIDcgMTA6MTc6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEFkZCAiZWxzZSB0cnVlIiBjbGF1c2UgdG8gY2F0ZXIgdG8KLQlicm9rZW4gIm1ha2UiIG9uIHNvbWUgc3lzdGVtcy4KLQotRnJpIERlYyAgNiAxNzoyMTo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAocGFyc2VfaWVlZV9iYik6IEFsd2F5cyBpbml0aWFsaXplIG5hbWNvcHkgdG8gYXZvaWQgZ2NjCi0Jd2FybmluZyBhYm91dCB1bmluaXRpYWxpemVkIHZhcmlhYmxlLgotCShpZWVlX3JlYWRfY3h4X2NsYXNzKTogTGlrZXdpc2UsIGZvciBwZi4KLQkoaWVlZV9lbnVtX3R5cGUpOiBMaWtld2lzZSwgZm9yIGkuCi0KLVR1ZSBOb3YgMjYgMTc6MDE6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cnN0YWJzLmMgKHN0YWJfYXJyYXlfdHlwZSk6IEFkZCBjYXN0cyB3aGVuIHByaW50aW5nCi0JYmZkX3NpZ25lZF92bWEgdmFsdWVzLgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgotCi1Nb24gTm92IDI1IDE2OjUzOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgY3Jhc2ggaWYgdGhlcmUgaXMgbm8KLQlzeW1ib2wuCi0KLUZyaSBOb3YgMjIgMTc6Mjk6MTQgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGFyLmMgKG9wZW5faW5hcmNoKTogRG9uJ3QgY2FsbCBiZmRfb3BlbnIgd2l0aCBhIG51bGwgbmFtZS4KLQotRnJpIE5vdiAgMSAxMjowODoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGk6IEFkZCBzZWN0aW9uIG9uIHJlcG9ydGluZyBidWdzLgotCi1UaHUgT2N0IDMxIDE4OjIwOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfaGFuZGxlKTogQWRkIGJpbmNsX2xpc3QgZmllbGQuCi0JKHBhcnNlX3N0YWIpOiBQYXNzIHZhbHVlIHRvIHB1c2hfYmluY2wuICBDYWxsIGZpbmRfZXhjbCBmb3IKLQlOX0VYQ0wuCi0JKHN0cnVjdCBiaW5jbF9maWxlKTogQWRkIGhhc2gsIGZpbGUgYW5kIGZpbGVfdHlwZXMgZmllbGRzLgotCShwdXNoX2JpbmNsKTogQWRkIGhhc2ggcGFyYW1ldGVyLiAgU2F2ZSBpdCBpbiB0aGUgbmV3IGhhc2ggZmllbGQuCi0JU2F2ZSB0aGUgZmlsZSBudW1iZXIgaW4gdGhlIG5ldyBmaWxlIGZpZWxkLgotCShwb3BfYmluY2wpOiBQdXQgdGhlIGJpbmNsX2ZpbGUgb24gYmluY2xfbGlzdCwgcmF0aGVyIHRoYW4gZnJlZWluZwotCWl0LiAgU2F2ZSB0aGUgZmlsZSB0eXBlcyBpbiB0aGUgbmV3IGZpbGVfdHlwZXMgZmllbGQuCi0JKGZpbmRfZXhjbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGllZWUuYyAoaWVlZV9saW5lbm8pOiBEb24ndCBjb21wYXJlIGxpbmUgbnVtYmVyIGFkZHJlc3NlcyB0bwotCWluZm8tPmhpZ2hhZGRyICh1bmRvIHBhcnQgb2YgT2N0b2JlciAyOCBwYXRjaCkuCi0KLVR1ZSBPY3QgMjkgMTY6NDA6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfdmFsdWUpOiBEb24ndCBwcmludCB0aGUgZW1wdHkgc3RyaW5nCi0JZm9yIHplcm8uCi0KLU1vbiBPY3QgMjggMTY6NTg6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBBZGQgZnVuY3Rpb25fZW5kIGZpZWxkLgotCShzdGFydF9zdGFiKTogSW5pdGlhbGl6ZSBmdW5jdGlvbl9lbmQuCi0JKGZpbmlzaF9zdGFiKTogUGFzcyBpbmZvLT5mdW5jdGlvbl9lbmQgdG8gZGVidWdfZW5kX2Z1bmN0aW9uLgotCShwYXJzZV9zdGFiKTogSWYgaW5mby0+ZnVuY3Rpb25fZW5kIGlzIHNldCwgdXNlIGl0IGFzIHRoZSBhZGRyZXNzCi0Jd2hpY2ggZW5kcyBhIGZ1bmN0aW9uLgotCi0JKiBpZWVlLmMgKGllZWVfYXJyYXlfdHlwZSk6IFJlbWVtYmVyIHRoZSBjb3JyZWN0IHNpemUuCi0KLQkqIGllZWUuYyAoaWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCk6IFBlcm1pdCBjb2FsZXNjaW5nIHJhbmdlcwotCXRoYXQgYXJlIHVwIHRvIDB4MTAwMCBieXRlcyBhcGFydCwgbm90IGp1c3QgNjQuCi0JKGllZWVfYWRkX2JiMTFfYmxvY2tzKTogRG9uJ3QgYm90aGVyIHRvIGVtaXQgYSBCQjExIHRoYXQgaXMgbGVzcwotCXRoYW4gMHgxMDAgYnl0ZXMuCi0JKGllZWVfbGluZW5vKTogT25seSBlbWl0IGxpbmUgbnVtYmVycyB0aGF0IGFyZSBsZXNzIHRoYW4KLQlpbmZvLT5oaWdoYWRkci4KLQotRnJpIE9jdCAyNSAxMjoxMjoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtKTogQWRkIGRlZmluZWQgZmllbGQuCi0JKGllZWVfZW51bV90eXBlKTogSWYgdGhlIGVudW0gdGFnIGhhcyBiZWVuIHNlZW4gYmVmb3JlIGJ1dCBub3QKLQlkZWZpbmVkLCByZXVzZSB0aGUgc2FtZSB0eXBlIGluZGV4LCBhbmQgZGVmaW5lIGl0LgotCShpZWVlX3RhZ190eXBlKTogSWYgdGhpcyBlbnVtIGhhcyBub3QgYmVlbiBkZWZpbmVkLCBhZGQgYW4KLQl1bmRlZmluZWQgZW50cnkgdG8gdGhlIGxpc3Qgb2YgZW51bXMuCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBMZXQgdGhlIGRpc2Fzc2VtYmxlciBvdmVycmlkZSB0aGUKLQludW1iZXIgb2YgYnl0ZXMgcHJpbnRlZCBvbiBhIGxpbmUuCi0KLVRodSBPY3QgMjQgMTY6NDI6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHByZWZpeF9hZGRyZXNzZXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsb25nX29wdGlvbnMpOiBBZGQgInByZWZpeC1hZGRyZXNzZXMiLgotCShjb21wYXJlX3N5bWJvbHMpOiBTb3J0IEJTRl9GVU5DVElPTiBzeW1ib2xzIGJlZm9yZSBvdGhlcgotCXN5bWJvbHMuCi0JKGZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCW9iamR1bXBfcHJpbnRfYWRkcmVzcy4KLQkob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCW9iamR1bXBfcHJpbnRfYWRkcmVzcy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogQ2FsbCBuZXcgZnVuY3Rpb25zLgotCShkaXNhc3NlbWJsZV9ieXRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlkaXNhc3NlbWJsZV9kYXRhLiAgQ2hhbmdlIGRpc2Fzc2VtYmx5IGZvcm1hdCwgdW5sZXNzCi0JcHJlZml4X2FkZHJlc3NlcyBpcyBzZXQuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYWxsIGRpc2Fzc2VtYmxlX2J5dGVzLiAgVW5sZXNzCi0JcHJlZml4X2FkZHJlc3NlcyBpcyBzZXQsIGRpc2Fzc2VtYmxlIGluIGNodW5rcyBoZWFkZWQgYnkgYQotCXN5bWJvbC4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLS1wcmVmaXgtYWRkcmVzc2VzLgotCi0JKiByZGRiZy5jIChyZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8pOiBQcmVzZXJ2ZSB0aGUKLQliYWNrc2xhc2ggd2hlbiBjb25jYXRlbmF0aW5nIG11bHRpcGxlIHN0YWJzIHN0cmluZ3MuCi0KLVRodSBPY3QgMTAgMTE6MzY6MzEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChzY2FuX29wZW5fb2JqX2ZpbGUpOiBGaXggbG9vcCBleGl0IHRlc3QuCi0JQWRkIG1pc3NpbmcgcGFyYW1ldGVyIHRvIGRlZl9leHBvcnRzLgotCi1UdWUgT2N0ICA4IDEyOjA2OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKExFWF9PUFRJT05TKTogU2V0IHRvIGVtcHR5IHN0cmluZy4gIC1JIC1DZW0gaXMgdGhlCi0JZGVmYXVsdCBmb3IgZmxleCwgYW5kIGlzIG5vdCByZWNvZ25pemVkIGJ5IGxleC4KLQotVGh1IE9jdCAgMyAxNzo0MToyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGkgKFRhcmdldCBTZWxlY3Rpb24pOiBEb2N1bWVudCB0aGF0IHlvdSBjYW4gbm93Ci0Jc3BlY2lmeSB0YXJnZXRzIHVzaW5nIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMuCi0KLQkqIGFyLmMgKHVzYWdlKTogRGVjbGFyZS4gIE1ha2Ugc3VyZSBhbGwgY2FsbGVycyBwYXNzIGFuIGFyZ3VtZW50LgotCi1UaHUgT2N0ICAzIDE1OjM5OjQyIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgotCi1XZWQgT2N0ICAyIDE1OjQ5OjE2IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IEJ1bXAgdmVyc2lvbiBkYXRlLgotCi1UdWUgT2N0ICAxIDE1OjAwOjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdmVyc2lvbi5jIChwcmludF92ZXJzaW9uKTogTmV3IGZ1bmN0aW9uLgotCSogYnVjb21tLmggKHByaW50X3ZlcnNpb24pOiBEZWNsYXJlLgotCSogYXIuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkoZG9fc2hvd192ZXJzaW9uKTogUmVtb3ZlLgotCSh1c2FnZSk6IEFkZCBoZWxwIHBhcmFtZXRlci4gIFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkobWFpbik6IFNldCBpc19yYW5saWIgYXQgc3RhcnQuICBDaGVjayBmb3IgLS1oZWxwIGFuZCAtLXZlcnNpb24uCi0JQ2FsbCBwcmludF92ZXJzaW9uLCBub3QgZG9fc2hvd192ZXJzaW9uLgotCSogbmxtY29udi5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCShtYWluKTogQ2FsbCBwcmludF92ZXJzaW9uLgotCShzaG93X3VzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCSogbm0uYyAocHJvZ3JhbV92ZXJzaW9uLCBwcmludF92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkodXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKG1haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCi0JKiBvYmpjb3B5LmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCi0JKGNvcHlfdXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0JKHN0cmlwX21haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCi0JKGNvcHlfbWFpbik6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCSh1c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkobWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkqIHNpemUuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkodXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKG1haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCi0JKiBzdHJpbmdzLmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCi0JKG1haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCi0JKHVzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0KLVRodSBTZXAgMTkgMTQ6NTM6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IFJldmVydCBNb25kYXkncyByZWZsb2NhbHAgcGF0Y2gsIGFuZCBhcHBseSB0aGlzIHBhdGNoCi0JaW5zdGVhZDoKLSAJKHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8pOiBXcml0ZSBhIGR1bW15IHR5cGUgYXQgdGhlIGVuZCBvZiB0aGUKLQlnbG9iYWwgdHlwZSBibG9jay4KLQotTW9uIFNlcCAxNiAxNTozMDo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfd3JpdGVfdHlwZSk6IEFkZCByZWZsb2NhbHAgZmllbGQuCi0JKGllZWVfcG9pbnRlcl90eXBlKTogU2V0IHJlZmxvY2FscCBhZnRlciBwdXNoaW5nIHR5cGUuCi0JKGllZWVfZnVuY3Rpb25fdHlwZSk6IElmIHJlZmxvY2FscCBpcyBzZXQsIG1ha2UgdGhpcyB0eXBlIGxvY2FsLgotCShpZWVlX3JhbmdlX3R5cGUsIGllZWVfYXJyYXlfdHlwZSwgaWVlZV9zZXRfdHlwZSk6IExpa2V3aXNlLgotCShpZWVlX2NvbnN0X3R5cGUsIGllZWVfdm9sYXRpbGVfdHlwZSk6IExpa2V3aXNlLgotCShpZWVlX3N0cnVjdF9maWVsZCwgaWVlZV9jbGFzc19iYXNlY2xhc3MpOiBMaWtld2lzZS4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV9pbmZvKTogQWRkIGdsb2JhbF90eXBlcyBmaWVsZC4KLQkocGFyc2VfaWVlZV9iYik6IFdoZW4gc3RhcnRpbmcgYSBCQjEsIGluaXRpYWxpemUgdGhlIHR5cGVzIGZpZWxkCi0JdG8gdGhlIGdsb2JhbF90eXBlcyBmaWVsZC4KLQkocGFyc2VfaWVlZV9iZSk6IFdoZW4gZW5kaW5nIGEgQkIyLCBjb3B5IHRoZSB0eXBlcyBmaWVsZCB0byB0aGUKLQlnbG9iYWxfdHlwZXMgZmllbGQuCi0KLUZyaSBTZXAgMTMgMTc6MzI6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNoYW5nZV9sZWFkaW5nX2NoYXIpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUik6IERlZmluZS4KLQkoY29weV9vcHRpb25zKTogQWRkICJjaGFuZ2UtbGVhZGluZy1jaGFyIi4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1jaGFuZ2UtbGVhZGluZy1jaGFyLgotCShmaWx0ZXJfc3ltYm9scyk6IEFkZCBvYmZkIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQlJbXBsZW1lbnQgY2hhbmdlX2xlYWRpbmdfY2hhci4KLQkoY29weV9vYmplY3QpOiBDYWxsIGZpbHRlcl9zeW1ib2xzIGlmIGNoYW5nZV9sZWFkaW5nX2NoYXIuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSBPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1jaGFuZ2UtbGVhZGluZy1jaGFyLgotCi1UdWUgU2VwICAzIDE0OjA1OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX2VudW1fdHlwZSk6IERvbid0IGNoZWNrIGluZGV4IGludG8gYSBOVUxMIG5hbWVzCi0JYXJyYXkuCi0JKiBubS5jIChzb3J0X3N5bWJvbHNfYnlfc2l6ZSk6IEFsd2F5cyBpbml0aWFsaXplIG5leHQuCi0JKiByZGNvZmYuYyAocGFyc2VfY29mZl90eXBlKTogV2FybiBhYm91dCBhbiBpbmNvbXByZWhlbnNpYmxlCi0JdHlwZSByYXRoZXIgdGhhbiBjcmFzaGluZy4KLQkqIHJkZGJnLmMgKHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogSW5pdGlhbGl6ZSBmLgotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9tZW1iZXJzKTogU2V0IGNvbnRleHQgaW4gYWxsIGNhc2VzLgotCi1UaHUgQXVnIDI5IDE2OjU2OjUyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLSopOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVRodSBBdWcgMjkgMTE6Mjk6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKExfdG1wbmFtKTogTmV2ZXIgZGVmaW5lLgotCShkaXNwbGF5X3RhcmdldF9saXN0KTogVXNlIGNob29zZV90ZW1wX2Jhc2UgaW5zdGVhZCBvZiB0bXBuYW0uCi0JKGRpc3BsYXlfaW5mb190YWJsZSk6IExpa2V3aXNlLgotCi1UdWUgQXVnIDI3IDE4OjE1OjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYik6IEFuIE5fRlVOIHN5bWJvbCB3aXRoIGFuIGVtcHR5IHN0cmluZwotCWluZGljYXRlcyB0aGUgZW5kIG9mIGEgZnVuY3Rpb24uCi0KLVRodSBBdWcgMjIgMTc6MDg6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cnN0YWJzLmMgKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSk6IEFkZCBuZXh0IGZpZWxkLgotCShzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUpOiBDaGFuZ2Ugc3RyaW5ncyB0byBhIHBvaW50ZXIgdG8KLQlzdHJpbmdfaGFzaF9lbnRyeS4gIEFkZCBsYXN0X3N0cmluZ3MgZmllbGQuICBSZW1vdmUgc3RyaW5nc19hbGxvYwotCWZpZWxkLgotCShzdHJpbmdfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBuZXh0IGZpZWxkLgotCShzdGFiX3dyaXRlX3N5bWJvbCk6IENvcHkgc3RyaW5nIGludG8gaGFzaCB0YWJsZSByYXRoZXIgdGhhbiBpbnRvCi0JYnVmZmVyLiAgS2VlcCBhIGxpc3Qgb2YgaGFzaCB0YWJsZSBlbnRyaWVzLgotCSh3cml0ZV9zdGFic19pbl9zZWN0aW9uc19kZWJ1Z2dpbmdfaW5mbyk6IEluaXRpYWxpemUgbGFzdF9zdHJpbmcuCi0JQ29weSBzdHJpbmdzIGZyb20gbGlzdCBvZiBoYXNoIHRhYmxlIGVudHJpZXMgaW4gbWVtb3J5LgotCShzdGFiX21vZGlmeV90eXBlKTogSWYgdGhlIGVudHJ5IG9uIHRoZSBzdGFjayBpcyBhIGRlZmluaXRpb24sCi0JbWFrZSBhIG5ldyBkZWZpbml0aW9uIHJhdGhlciB0aGFuIGZhaWxpbmcgYW4gYXNzZXJ0LgotCShzdGFiX2FycmF5X3R5cGUpOiBUaGUgc2l6ZSBpcyBvbmx5IHplcm8gaWYgaGlnaCBpcyBzdHJpY3RseSBsZXNzCi0JdGhhbiBsb3cuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfaW5mbyk6IEFkZCBzYXdfZmlsZW5hbWUgZmllbGQuCi0JKHBhcnNlX2llZWUpOiBJbml0aWFsaXplIHNhd19maWxlbmFtZS4KLQkocGFyc2VfaWVlZV9iYik6IFNldCBzYXdfZmlsZW5hbWUgZm9yIGEgQkIxIG9yIEJCMi4gIEluIGEgQkIxLAotCWRpc2NhcmQgdGhlIGN1cnJlbnQgdmFyaWFibGVzIGFuZCB0eXBlcy4gIEluIGEgQkIxMCwgaWYgbm8KLQlmaWxlbmFtZSBoYXMgYmVlbiBzZWVuLCBjYWxsIGRlYnVnX3NldF9maWxlbmFtZS4KLQkocGFyc2VfaWVlZV90eSk6IEluIGNhc2UgJ2cnLCB0aGUgdHlwZSBpcyBvcHRpb25hbC4KLQotCSogcHJkYmcuYyAocHJfZml4X3Zpc2liaWxpdHkpOiBEb24ndCBhYm9ydCBvbgotCURFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFLgotCi0JKiBkZWJ1Zy5jIChkZWJ1Z19uYW1lX3R5cGUpOiBDb3JyZWN0IGVycm9yIG1lc3NhZ2UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBITERFTlYuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSExERU5WKTogTmV3IHZhcmlhYmxlLiAgVXNlIGl0IHdoZW5ldmVyIGxpbmtpbmcgYQotCXByb2dyYW0uCi0KLVRodSBBdWcgMTUgMTk6MzA6NDEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEFkZCBzeW1ib2xpYyBkb3VibGVxdW90ZXMgYXJvdW5kIHRoZSB2ZXJzaW9uCi0JbnVtYmVyLgotCi1UaHUgQXVnICA4IDEyOjI3OjUyIDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IEFkZCBiZXR0ZXIgc3VwcG9ydCBmb3IgREVDIEMgY29tcGlsYXRpb24uCi0JQWRkIG5ldyBtYWNyb3MgYXMgaW4gTWFrZWZpbGUuaW4uCi0KLVdlZCBBdWcgIDcgMTQ6Mjc6MzMgMTk5NiAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEJGRF9ORUVEX0RFQ0xBUkFUSU9OIG9uIHN0cnN0ciBhbmQgc2Jyay4KLQkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fU1RSU1RSKTogTmV3IG1hY3JvLgotCShORUVEX0RFQ0xBUkFUSU9OX1NCUkspOiBOZXcgbWFjcm8uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGJ1Y29tbS5oIChzdHJzdHIpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSLgotCShzYnJrKTogRGVjbGFyZSBpZiBIQVZFX1NCUksgYW5kIE5FRURfREVDTEFSQVRJT05fU0JSSy4KLQotCSogcHJkYmcuYyAocHJfZW5kX3N0cnVjdF90eXBlKTogQXZvaWQgdXNpbmcgYSBzdHJpbmcgY29uc3RhbnQgaW4KLQlhc3NlcnQsIGZvciB0aGUgYmVuZWZpdCBvZiBicm9rZW4gYXNzZXJ0IG1hY3Jvcy4KLQotRnJpIEp1bCAyNiAxNDowNjo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBkaXNhc21faW5mby5mbGF2b3VyIGZyb20KLQlhYmZkLgotCi1UdWUgSnVsIDIzIDEzOjU5OjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChzZWNkYXRhKTogSW4gbm9uIERMTFRPT0xfUFBDIGNhc2UsIGNoYW5nZSBhbGlnbm1lbnQKLQlvZiAudGV4dCBzZWN0aW9uIHRvIDIuCi0KLU1vbiBKdWwgMjIgMDg6NDY6MTUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9zdGFicyk6ICBGaXggdGVzdCBmb3Igc3RhYnMgc2VjdGlvbnMKLQllbmRpbmcgd2l0aCBudW1iZXJzLiAgVGhpcyBmaXhlcyBhIHByb2JsZW0gd2l0aCAuc3RhYiBiZWluZwotCWNvbmZ1c2VkIHdpdGggLnN0YWIuaW5kZXguCi0KLVdlZCBKdWwgMTAgMTM6MzI6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZSk6IFJldHVybiBhIHZvaWQgKiBmb3IgYQotCXRlbXBsYXRlLCByYXRoZXIgdGhhbiBzaW1wbHkgYWJvcnRpbmcuCi0KLU1vbiBKdWwgIDggMTU6Mjg6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhci5jIChvcGVuX2luYXJjaCk6IEFkZCBmaWxlIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4gIElmCi0JdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgYXJjaGl2ZSwgc2V0IHRoZSB0YXJnZXQgYmFzZWQgb24gdGhlCi0JZmlsZS4KLQkqIGFyc3VwLmggKG9wZW5faW5hcmNoKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi1UaHUgSnVsICA0IDEyOjAwOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBTZXQgdG8gY3lnbnVzLTIuNy4xLgotCi0JKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCi0KLQkqIHJkY29mZi5jIChwYXJzZV9jb2ZmKTogR2V0IGFkZHJlc3MgdG8gcGFzcyB0byBkZWJ1Z19lbmRfZnVuY3Rpb24KLQlmcm9tIGZ1bmN0aW9uIHNpemUsIG5vdCB2YWx1ZSBvZiAuZWYgc3ltYm9sLiAgRnJvbSBOaW5nCi0JTW9zYmVyZ2VyLVRhbmcgPG5pbmdAQVpTdGFyTmV0LmNvbT4uCi0KLVNhdCBKdW4gMjkgMjE6MTg6MDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHN0cmlwX21haW4pOiBBZGQgLW8gb3B0aW9uLCBhbmQgaGFuZGxlIGl0LgotCShzdHJpcF91c2FnZSk6IE1lbnRpb24gLW8uCi0JKiBiaW51dGlscy50ZXhpLCBzdHJpcC4xOiBNZW50aW9uIC1vLgotCi1Nb24gSnVuIDI0IDE3OjE5OjAyIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLAotCUlOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mIHNldCB2YWx1ZXMuCi0JKGRvY2Rpcik6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IEF1dG9jb25mIDIuNSBvciBoaWdoZXIuCi0KLU1vbiBKdW4gMjQgMTE6NTk6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGVuZGlhbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtRUIvLUVMLy0tZW5kaWFuLgotCShsb25nX29wdGlvbnMpOiBBZGQgImVuZGlhbiIuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBJZiBlbmRpYW5uZXNzIHdhcyBzcGVjaWZpZWQsIHJlcGxhY2UKLQlhYmZkLT54dmVjIHdpdGggYSBjb3B5IG9mIGl0c2VsZiB3aXRoIHRoZSBnaXZlbiBlbmRpYW5uZXNzLgotCShtYWluKTogSGFuZGxlIC1FQi8tRUwvLS1lbmRpYW4uCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IE1lbnRpb24gLUVCLy1FTC8tLWVuZGlhbi4KLQotCSogb2JqZHVtcC5jOiBNYWtlIG1vc3QgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgc3RhdGljLgotCi0JKiBjb25maWd1cmUuaW46IE9uIGFscGhhKi0qLW9zZiosIGxpbmsgYWdhaW5zdCBsaWJiZmQuYSBpZiBub3QKLQl1c2luZyBzaGFyZWQgbGlicmFyaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KLQotU3VuIEp1biAyMyAxNDo0NzozNiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChzZWNkYXRhKTogQ2hhbmdlZCAucmRhdGEgdG8gLnJlbGRhdGEgc28gLnJlbG9jIHdpbGwgd29yay4KLQkobWFrZV9vbmVfbGliX2ZpbGUpOiBSZW1vdmVkIGNydWZ0LiAoI2lmIDEpCi0KLVdlZCBKdW4gMTkgMTQ6NDY6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHN0YWJzKTogQ2hhbmdlIGZyb20gc3RydWN0IGludGVybmFsX25saXN0ICogdG8KLQliZmRfYnl0ZSAqLgotCShwcmludF9zZWN0aW9uX3N0YWJzKTogRmV0Y2ggc3RhYnMgaW5mb3JtYXRpb24gZGlyZWN0bHksIHJhdGhlcgotCXRoYW4gYXNzdW1pbmcgdGhhdCBzdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgaXMgdGhlIHJpZ2h0IHNpemUuCi0KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IGNoYW5nZSB0byBiaW5hcnkgZm9ybWF0OiBmaWxlIHBvc2l0aW9uCi0JYmFzZWQgb24gbG9hZCBhZGRyZXNzLCBub3Qgc2VjdGlvbiBWTUEuCi0KLQkqIGJ1Y29tbS5oOiBEZWZpbmUgU0VFS19TRVQsIFNFRUtfQ1VSLCBhbmQgU0VFS19FTkQgaWYgdGhleSBhcmUKLQlub3QgYWxyZWFkeSBkZWZpbmVkLgotCi1UdWUgSnVuIDE4IDE4OjI1OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IEFkZCBkZWZsZXguYy4KLQotVHVlIEp1biAxOCAxNTowMzo0NCAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlnLmgtdm1zLCBtYWtlZmlsZS52bXM6IE5ldyBmaWxlcy4KLQotTW9uIEp1biAxNyAwOTo0NzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobWFrZV9vbmVfbGliX2ZpbGUpOiBVc2UgQkZEX1JFTE9DX1JWQSByYXRoZXIgdGhhbgotCUJGRF9SRUxPQ18zMiBpbiBJREFUQTcuCi0KLVdlZCBKdW4gMTIgMTE6NTI6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubS5jIChzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvKTogRGVmaW5lLgotCShsaW5lX251bWJlcnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsb25nX29wdGlvbnMpOiBBZGQgImxpbmUtbnVtYmVycyIuCi0JKHVzYWdlKTogTWVudGlvbiAtbCBhbmQgLS1saW5lLW51bWJlcnMuCi0JKG1haW4pOiBIYW5kbGUgLWwuCi0JKHByaW50X3N5bWJvbCk6IFByaW50IGxpbmUgbnVtYmVycyBpZiByZXF1ZXN0ZWQuCi0JKGdldF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogYmludXRpbHMudGV4aSwgbm0uMTogRG9jdW1lbnQgLWwvLS1saW5lLW51bWJlcnMuCi0KLVR1ZSBKdW4gMTEgMjA6MTI6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfcmVsb2Nfc2V0KTogQWRkIHNlYyBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIElmIHdpdGhfbGluZV9udW1iZXJzIGlzIHNldCwgZGlzcGxheSBsaW5lIG51bWJlcnMgb2YKLQlyZWxvY2F0aW9uIGVudHJpZXMuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC1sIHdpdGggLXIuCi0KLU1vbiBKdW4gMTAgMjM6NDI6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhci5jIChvcGVuX2luYXJjaCk6IFJlcG9ydCBCRkQgZXJyb3IgbWVzc2FnZSBpZiBhbiBhcmNoaXZlIGNhbgotCW5vdCBiZSByZWNvZ25pemVkLiAgTGlzdCBtYXRjaGluZyBmb3JtYXRzIGlmIHRoZSBmaWxlIGlzCi0JYW1iaWd1b3VzbHkgcmVjb2duaXplZC4KLQkocmFubGliX3RvdWNoKTogTGlrZXdpc2UuCi0KLVRodSBKdW4gIDYgMTM6NTY6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBSRUFETUU6IEFkZCBub3RlcyBvbiBob3cgdG8gYnVpbGQgaWYgeW91IGRvbid0IGhhdmUgYXIuCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgb2xkIGluY29ycmVjdCBzZXR0aW5nIG9mIENDLgotCi1UdWUgSnVuICA0IDEwOjUyOjQ5IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3NrMy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGNoZWNrIHRvIHNlZSBpZiB0b29sZGlyIGV4aXN0cy4KLQlNYWtlICQodG9vbGRpcikgYW5kICQodG9vbGRpcikvYmluLgotCi1Nb24gSnVuICAzIDE3OjQwOjIzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc3RyaW5ncy5jIChtYWluKTogTWFrZSBtYWluIGFuIGludCBmdW5jdGlvbiwgbm90IHZvaWQuCi0KLUZyaSBNYXkgMzEgMTM6NTk6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubS5jIChmaWx0ZXJfc3ltYm9scyk6IENoZWNrIGZvciBCU0ZfV0VBSyBhcyB3ZWxsIGFzCi0JQlNGX0dMT0JBTC4KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQotV2VkIE1heSAgOCAxNjo1NzoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBNYWtlIGNsZWFyIHRoYXQgaXQgaXMgb25seSBhIHdhcm5pbmcKLQl3aGVuIHRoZSBvdXRwdXQgZmlsZSBjYW4gbm90IHJlcHJlc2VudCB0aGUgYXJjaGl0ZWN0dXJlLgotCi1GcmkgTWF5ICAzIDExOjMwOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgcmVmZXIgdG8gYnl0ZXMgcGFzdCB0aGUgZW5kCi0Jb2YgZGF0YS4KLQotV2VkIEFwciAyNCAxNDoxMDoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJkZGJnLmMgKHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogTW92ZSBjYWxsIHRvCi0JZnJlZV9zYXZlZF9zdGFicyBvdXRzaWRlIHRoZSBsb29wIG92ZXIgdGhlIHN5bWJvbHMuCi0KLVR1ZSBBcHIgMjMgMTI6NTY6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGNvbXBhcmVfc3ltYm9scyk6IFNvcnQgc3ltYm9scyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoCi0gCWAuJyBhZnRlciBvdGhlciBzeW1ib2xzLiAgSWYgbm8gb3RoZXIgZGVjaXNpb24gY2FuIGJlIG1hZGUsIHNvcnQKLQlzeW1ib2xzIGJ5IG5hbWUuCi0KLVRodSBBcHIgMTggMTY6MDI6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkZXAtaW4uc2VkOiBTdWJzdGl0dXRlICQoQkZERElSKSBmb3IgQEJGRERJUkAuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKGRlcC5zZWQpOiBTdWJzdGl0dXRlICQoQkZERElSKSBmb3IgQEJGRERJUkAuCi0KLVR1ZSBBcHIgMTYgMTM6NTA6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZGNvZmYuYzogTmV3IGZpbGUuCi0JKiByZGRiZy5jIChyZWFkX2RlYnVnZ2luZ19pbmZvKTogUmVhZCBDT0ZGIHN5bWJvbHMgaWYgQ09GRiBmbGF2b3VyCi0JYW5kIG5vIHN0YWJzIHdlcmUgZm91bmQuCi0JKiBidWRiZy5oIChwYXJzZV9jb2ZmKTogRGVjbGFyZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIHJkY29mZi5jLgotCShERUJVR19PQkpTKTogQWRkIHJkY29mZi5vLgotCi1Nb24gQXByIDE1IDE1OjU1OjAxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG5sbWNvbnYuYyAoY2hvb3NlX3RlbXBfYmFzZXssX3RyeX0pOiBEZWxldGUsIGluIGxpYmliZXJ0eSBub3cuCi0JKGxpbmtfaW5wdXRzKTogVXBkYXRlIGNhbGwgdG8gY2hvb3NlX3RlbXBfYmFzZS4KLQotTW9uIEFwciAgOCAxNDo0MDowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgotCWRpcmVjdG9yaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI5IDE2OjExOjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogUHJpbnQgdGhlIFNFQ19MSU5LX09OQ0UgZmxhZwotCWFuZCB0aGUgU0VDX0xJTktfRFVQTElDQVRFUyBmaWVsZC4KLQotRnJpIE1hciAyOSAxMTozNTo1NSAxOTk2ICBKLlQuIENvbmtsaW4gIChqdGNAbGlzYS5jeWdudXMuY29tKQotCi0JKiBubG1jb252LjE6IENoYW5nZWQgdG8gYmUgcmVjb2duaXplZCBieSBjYXRtYW4gLXcgb24gU29sYXJpcy4KLQotVGh1IE1hciAyOCAxNDoxNzowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyc3RhYnMuYyAoc3RhYl9lbnVtX3R5cGUpOiBTZXQgYnVmIGJlZm9yZSB1c2luZyBpdC4KLQotRnJpIE1hciAyMiAxNTo0OTowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IEFkZCBmaWVsZCBhYmZkLgotCShzdGFydF9zdGFiKTogQWRkIGFiZmQgcGFyYW1ldGVyLgotCShwYXJzZV9zdGFiX3N0cmluZyk6IFNraXAgdGhlIHN5bWJvbCBsZWFkaW5nIGNoYXIgd2hlbiBzZWFyY2hpbmcKLQlmb3IgdGhlIHZhbHVlIG9mIGEgZ2xvYmFsIHN5bWJvbC4KLQkqIGJ1ZGJnLmggKHN0YXJ0X3N0YWIpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiByZGRiZy5jIChyZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8pOiBQYXNzIGFiZmQgdG8KLQlzdGFydF9zdGFiLgotCShyZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IExpa2V3aXNlLgotCi1UaHUgTWFyIDIxIDEyOjQwOjQ4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JzdGFicy5jIChzdGFiX2Z1bmN0aW9uX3R5cGUpOiBPdXRwdXQgYW4gZW1wdHkgdHlwZWRlZiBmb3IgYW4KLQl1bnVzZWQgYXJndW1lbnQsIHJhdGhlciB0aGFuIG1ha2luZyB1cCBhIG1lYW5pbmdsZXNzIG5hbWUuCi0JKHN0YWJfdmFyaWFibGUpOiBVc2UgTl9SU1lNIGZvciBhIERFQlVHX1JFR0lTVEVSIHZhcmlhYmxlLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2luZm8pOiBBZGQgZ2xvYmFsX3ZhcnMgZmllbGQuCi0JKHBhcnNlX2llZWVfYmUpOiBXaGVuIGVuZGluZyB0aGUgZ2xvYmFsIHR5cGVkZWYgYmxvY2ssIGNvcHkgdGhlCi0JdmFyaWFibGVzIGludG8gaW5mby0+Z2xvYmFsX3ZhcnMuCi0JKHBhcnNlX2llZWVfYXRuKTogRG9uJ3QgcmVxdWlyZSBhbiBOTiByZWNvcmQgZm9yIGEgcG1pc2MgQVROLgotCShpZWVlX3JlYWRfcmVmZXJlbmNlKTogU2VhcmNoIHRoZSBnbG9iYWwgdmFyaWFibGVzIGFmdGVyIHRoZSBsb2NhbAotCXZhcmlhYmxlcy4KLQotV2VkIE1hciAyMCAxODowODoxOSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogTWFrZSBzdXJlIHN5bV9uYW1lIGlzIGFsd2F5cyBzZXQuCi0JKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBBbHdheXMgcHV0IGEgc3BhY2UgYWZ0ZXIgdGhlIHNlY3Rpb24gbmFtZS4KLQkoZHVtcF9iZmRfaGVhZGVyKTogVGVybWluYXRlIG91dHB1dCB3aXRoIG5ld2xpbmUuCi0KLVdlZCBNYXIgMjAgMTY6MzU6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cnN0YWJzLmM6IE5ldyBmaWxlLgotCSogYnVkYmcuaCAod3JpdGVfc3RhYnNfaW5fc2VjdGlvbnNfZGVidWdnaW5nX2luZm8pOiBEZWNsYXJlLgotCSogb2JqY29weS5jICh3cml0ZV9kZWJ1Z2dpbmdfaW5mbyk6IEZvciBDT0ZGIG9yIEVMRiwgb3V0cHV0IHN0YWJzCi0JaW4gc2VjdGlvbnMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZCB3cnN0YWJzLmMuCi0JKFdSSVRFX0RFQlVHX09CSlMpOiBOZXcgdmFyaWFibGUuCi0JKCQoT0JKQ09QWV9QUk9HKSk6IFVzZSAkKFdSSVRFX0RFQlVHX09CSlMpLCBub3QgJChERUJVR19PQkpTKS4KLQkoJChTVFJJUF9QUk9HKSk6IExpa2V3aXNlLgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX21lbWJlcnMpOiBNYWtlIHR5cGUgc3R1YiBkZXRlY3Rpb24gbW9yZSBsaWtlCi0JZ2RiLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2hhbmRsZSk6IEFkZCBmaWVsZHMgY29tcGxleF9mbG9hdF9pbmRleCBhbmQKLQljb21wbGV4X2RvdWJsZV9pbmRleC4KLQkoaWVlZV9jb21wbGV4X3R5cGUpOiBDYWNoZSB0eXBlIGluZGV4IGluIGNvbXBsZXhfZmxvYXRfaW5kZXggYW5kCi0JY29tcGxleF9kb3VibGVfaW5kZXgsIGRlcGVuZGluZyB1cG9uIHNpemUuICBTZXQgc2l6ZSBvbiB0eXBlIHN0YWNrCi0JdG8gc2l6ZSAqIDIuCi0KLQkqIGllZWUuYyAoaWVlZV9lbXB0eV90eXBlKTogVXNlIGJ1aWx0aW5fdW5rbm93biwgbm90IDAuCi0JKGllZWVfdm9pZF90eXBlKTogVXNlIGJ1aWx0aW5fdm9pZCwgbm90IDEuCi0KLQkqIGllZWUuYyAocGFyc2VfaWVlZV90eSk6IEhhbmRsZSAnVicgdHlwZSBjb2RlLgotCShwYXJzZV9pZWVlX2F0bik6IERvbid0IHJlcXVpcmUgdHdvIG51bWJlcnMgZm9yIHR5cGUgMTAuCi0KLQkqIGllZWUuYyAocGFyc2VfaWVlZV9iZSk6IEFkZCBvbmUgdG8gb2Zmc2V0IGF0IGVuZCBvZiBmdW5jdGlvbiBvcgotCWJsb2NrLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2Jsb2NrKTogQWRkIGZpZWxkIHNraXAuCi0JKHBhcnNlX2llZWVfYmIpOiBEb24ndCBjYWxsIGRlYnVnX3JlY29yZF9mdW5jdGlvbiBmb3IgX19YUllDUFAKLQlmdW5jdGlvbiwgYW5kIHNldCBza2lwIGZpZWxkLgotCShwYXJzZV9pZWVlX2JlKTogRG9uJ3QgY2FsbCBkZWJ1Z19lbmRfZnVuY3Rpb24gaWYgc2tpcCBpcyBzZXQuCi0KLQkqIGRlYnVnLmMgKHN0cnVjdCBkZWJ1Z19oYW5kbGUpOiBBZGQgZmllbGRzIGN1cnJlbnRfd3JpdGVfbGluZW5vCi0JYW5kIGN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4LgotCShkZWJ1Z193cml0ZSk6IEluaXRpYWxpemUgY3VycmVudF93cml0ZV9saW5lbm8gYW5kCi0JY3VycmVudF93cml0ZV9saW5lbm9faW5kZXggZm9yIGVhY2ggdW5pdC4gIENhbGwKLQlkZWJ1Z193cml0ZV9saW5lbm9zIHJhdGhlciB0aGFuIHdyaXRpbmcgb3V0IHRoZSBsaW5lIG51bWJlcnMKLQlkaXJlY3RseS4KLQkoZGVidWdfd3JpdGVfZnVuY3Rpb24pOiBDYWxsIGRlYnVnX3dyaXRlX2xpbmVub3MuCi0JKGRlYnVnX3dyaXRlX2Jsb2NrKTogTGlrZXdpc2UuCi0JKGRlYnVnX3dyaXRlX2xpbmVub3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBkZWJ1Zy5jIChkZWJ1Z193cml0ZV90eXBlKTogRm9yIERFQlVHX0tJTkRfRlVOQ1RJT04sIHB1c2ggcmV0dXJuCi0JdHlwZSBiZWZvcmUgYXJndW1lbnRzLgotCi1Nb24gTWFyIDE4IDE4OjA1OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQUNfRlVOQ19WRk9SSy4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogZGxsdG9vbC5jLCBubG1jb252LmM6IEluY2x1ZGUgPHZmb3JrLmg+IGlmIEhBVkVfVkZPUktfSCBpcwotCWRlZmluZWQuCi0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfcmFuZ2VfdHlwZSk6IEEgY29tcGxleCB0eXBlIGlzIGRlZmluZWQgYXMgYQotCXN1YnJhbmdlIG9mIGl0c2VsZiB3aXRoIHRoZSBoaWdoIGJvdW5kIHplcm8uCi0JKiBpZWVlLmMgKGllZWVfY29tcGxleF90eXBlKTogRG9uJ3QgY3Jhc2ggb24gc2l6ZXMgb2YgMTIgb3IgMTYuCi0KLVR1ZSBNYXIgMTIgMTI6MDk6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfdW5kZWZpbmVkX3RhZyk6IFN3aXRjaCB0byBnbG9iYWxfdHlwZXMgZXZlbgotCWlmIGl0IGlzIG5vdCBlbXB0eS4KLQkoaWVlZV90YWdfdHlwZSk6IEZvciBhbiBlbnVtLCBsb29rIHRocm91Z2ggaW5mby0+ZW51bXMuCi0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KLQotCSogZGVidWcuYyAoZGVidWdfdHlwZV9zYW1lcCk6IERvbid0IGxvb3AgZW5kbGVzc2x5IGluCi0JREVCVUdfS0lORF9FTlVNIGNhc2UuICBGcm9tIEVyaWMgQmF1ciA8ZWNiQG5leGVuLmNvbT4uCi0KLU1vbiBNYXIgMTEgMTI6MzU6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZGRiZy5jIChyZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8pOiBDYWxsIHNhdmVfc3RhYiBmb3IKLQllYWNoIHN0YWIgZW50cnksIGNhbGwgc3RhYl9jb250ZXh0IG9uIGFuIGVycm9yLCBhbmQgY2FsbAotCWZyZWVfc2F2ZWRfc3RhYnMgYmVmb3JlIHJ0dXJuaW5nLgotCShyZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IExpa2V3aXNlLgotCShTQVZFX1NUQUJTX0NPVU5UKTogRGVmaW5lLgotCShzdHJ1Y3Qgc2F2ZWRfc3RhYik6IERlZmluZS4KLQkoc2F2ZWRfc3RhYnMsIHNhdmVkX3N0YWJzX2luZGV4KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHNhdmVfc3RhYiwgc3RhYl9jb250ZXh0LCBmcmVlX3NhdmVkX3N0YWJzKTogTmV3IHN0YXRpYyBmdW5jdGlvcy4KLQotCSogb2JqZHVtcC5jIChzdGFiX25hbWUpOiBSZW1vdmUuCi0JKHN0cnVjdCBzdGFiX3ByaW50KTogUmVtb3ZlLgotCShzdGFiX3ByaW50KTogUmVtb3ZlLgotCShkdW1wX3N0YWJzKTogRG9uJ3QgaW5pdGlhbGl6ZSBzdGFiX25hbWUuCi0JKHByaW50X3NlY3Rpb25fc3RhYnMpOiBDYWxsIGJmZF9nZXRfc3RhYl9uYW1lIHJhdGhlciB0aGFuIHVzaW5nCi0JdGhlIHN0YWJfbmFtZSBhcnJheS4KLQotVHVlIEZlYiAyNyAxOTo1MjowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHByZGJnLmMgKHByX2ludF9jb25zdGFudCk6IEluaXRpYWxpemUgaW5mbyBjb3JyZWN0bHkuCi0JKHByX2Zsb2F0X2NvbnN0YW50KTogTGlrZXdpc2UuCi0KLU1vbiBGZWIgMjYgMTg6MTE6MzcgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IFVwZGF0ZSB0byBoYW5kbGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4KLQotU2F0IEZlYiAyNCAxMToyMTo0OSAxOTk2ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCi0JKiBNYWtlZmlsZS5pbiAoJChPQkpEVU1QX1BST0cpKTogU2VhcmNoICQoQkZETElCKSBiZWZvcmUKLQkkKE9QQ09ERVMpLgotCi1UaHUgRmViIDE1IDEyOjQ0OjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCB0YW1wZXIgd2l0aCBMREZMQUdTLiAgQ2FsbCBBQ19QUk9HX0NDIGJlZm9yZQotCWNvbmZpZ3VyZS5ob3N0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgUlBBVEhfRU5WVkFSLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKFJQQVRIX0VOVlZBUik6IE5ldyB2YXJpYWJsZS4KLQkoY2hlY2spOiBVc2UgJChSUEFUSF9FTlZWQVIpIHJhdGhlciB0aGFuIExEX0xJQlJBUllfUEFUSC4KLQotCSogb2JqY29weS5jIChzbWFydF9yZW5hbWUpOiBSYXRoZXIgdGhhbiBkb2luZyBjaG1vZCB0aGVuIGNob3duLCBkbwotCWNobW9kIHdpdGhvdXQgc2V0dWlkLCB0aGVuIGNob3duLCB0aGVuIGNobW9kIHdpdGggc2V0dWlkLgotCi1XZWQgRmViIDE0IDE2OjQ2OjQyIDE5OTYgIE1hcnRpbiBBbmFudGhhcmFtYW4gIDxtYXJ0aW5AbWFpbC5pbWVjaC51bmktZHVpc2J1cmcuZGU+Ci0KLQkqIGFyc3VwLmMgKG1hcF9vdmVyX2xpc3QpOiBSZWluZGVudC4gIERvbid0IGFzc3VtZSB0aGF0IHRoZQotCWZ1bmN0aW9uIGRvZXMgbm90IGRlbGV0ZSB0aGUgQkZELgotCShhcl9hZGRsaWJfZG9lcik6IERvbid0IHNldCBwcmV2LT5uZXh0IGlmIHByZXYgaXMgTlVMTC4KLQotV2VkIEZlYiAxNCAxNToxMjoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9yZWdub190b19nZW5yZWcpOiBDb252ZXJ0IHJlZ2lzdGVyIG51bWJlcnMgZm9yIG02OGsKLQlhbmQgaTk2MC4KLQkoaWVlZV9nZW5yZWdfdG9fcmVnbm8pOiBMaWtld2lzZS4KLQotTW9uIEZlYiAxMiAxNDoxOTo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYzogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gd3JpdGUgY29kZSB0byBwdXQgdHlwZXMgaW4gdGhlCi0JZ2xvYmFsIHR5cGUgYmxvY2sgd2hlbiBwb3NzaWJsZSwgdG8gb3V0cHV0IHJhbmdlcyBmb3IgYWxsIG1lbW9yeQotCW9jY3VwaWVkIGJ5IHRoZSBtb2R1bGUsIGFuZCB0byBpbXByb3ZlIGVmZmljaWVuY3kuCi0KLQkqIGRlYnVnLmMgKHN0cnVjdCBkZWJ1Z19oYW5kbGUpOiBSZW1vdmUgY2xhc3NfbWFyayBmaWVsZC4gIEFkZAotCWlkX2xpc3QgYW5kIGNvbXBhcmVfbGlzdCBmaWVsZHMuCi0JKHN0cnVjdCBkZWJ1Z19jbGFzc19pZCk6IERlZmluZS4KLQkoc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0KTogRGVmaW5lLgotCShkZWJ1Z193cml0ZSk6IEluaXRpYWxpemUgaW5mby0+aWRfbGlzdAotCShkZWJ1Z193cml0ZV9uYW1lKTogUmVtb3ZlIHJlZmVyZW5jZSB0byBpbmZvLT5jbGFzc19tYXJrLgotCShkZWJ1Z193cml0ZV90eXBlKTogR2V0IGlkIGZvciBhbGwgc3RydWN0cyBhbmQgY2xhc3Nlcy4gIFNpbXBsaWZ5Ci0JdGVzdCBmb3Igd2hldGhlciBzdHJ1Y3QgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLgotCShkZWJ1Z193cml0ZV9jbGFzc190eXBlKTogR2V0IGlkIGZvciBhbGwgY2xhc3Nlcy4gIFNpbXBsaWZ5IHRlc3QKLQlmb3Igd2hldGhlciBjbGFzcyBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uCi0JKGRlYnVnX3dyaXRlX2Jsb2NrKTogRG9uJ3Qgd3JpdGUgb3V0IGJsb2NrcyBvdGhlciB0aGFuIHRoZSB0b3AKLQlsZXZlbCBibG9jayBpZiB0aGV5IGhhdmUgbm8gbG9jYWwgdmFyaWFibGVzLgotCShkZWJ1Z19zZXRfY2xhc3NfaWQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkZWJ1Z190eXBlX3NhbWVwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGVidWdfY2xhc3NfdHlwZV9zYW1lcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBwcmRiZy5jIChwcl9zdGFydF9zdHJ1Y3RfdHlwZSk6IEFsd2F5cyBwcmludCBpZC4KLQkocHJfc3RhcnRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCShwcl90YWdfdHlwZSk6IExpa2V3aXNlLgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBBZGQgc3ltcyBhbmQgc3ltY291bnQgZmllbGRzLgotCShzdGFydF9zdGFiKTogQWRkIHN5bXMgYW5kIHN5bWNvdW50IHBhcmFtZXRlcnMuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkocGFyc2Vfc3RhYl9zdHJpbmcpOiBMb29rIHVwIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlIHN5bWJvbCB0YWJsZQotCXRvIGdldCB0aGUgcmlnaHQgdmFsdWUuCi0JKiBidWRiZy5oIChzdGFydF9zdGFiKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogcmRkYmcuYyAocmVhZF9zZWN0aW9uX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogQWRkIHN5bXMgYW5kCi0Jc3ltY291bnQgcGFyYW1ldGVycy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9hcnJheV90eXBlKTogSWYgdGhlIGluZGV4IHR5cGUgaXMgMCwgdXNlCi0JaW50LgotCi1XZWQgRmViICA3IDE0OjE3OjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQpOiBDbGVhciBtb2RpZmllZCBhbmQKLQltb2RpZmllZF9hbGxvYyBmaWVsZHMgb2YgaW5mby4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgLS1lbmFibGUtc2hhcmVkLiAgU3Vic3RpdHV0ZSBuZXcKLQl2YXJpYWJsZXMgQkZETElCIGFuZCBPUENPREVTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEJGRExJQik6IFNldCB0byBAQkZETElCQC4KLQkoT1BDT0RFUyk6IFNldCB0byBAT1BDT0RFU0AuCi0KLU1vbiBGZWIgIDUgMTY6MTg6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JU3VwcG9ydCBmb3IgYnVpbGRpbmcgYmZkIGFuZCBvcGNvZGVzIGFzIHNoYXJlZCBsaWJyYXJpZXMsIGJhc2VkIG9uCi0JcGF0Y2hlcyBmcm9tIEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIGNvbmZpZ3VyZS5pbiAoSExERkxBR1MpOiBOZXcgc3Vic3RpdHV0aW9uLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEhMREZMQUdTKTogTmV3IHZhcmlhYmxlLiAgTWFrZSBhbGwgbGlua3MgdXNlCi0JJChITERGTEFHUykgYmVmb3JlICQoQ0ZMQUdTKSBhbmQgJChMREZMQUdTKS4KLQkoQkZETElCX0RFUCk6IE5ldyB2YXJpYWJsZS4gIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mICQoQkZEKSBhcwotCWEgZGVwZW5kZW5jeSB3aXRoICQoQkZETElCX0RFUCkuICBSZW1vdmUgJChCRkQpIGFzIGEgZGVwZW5kZW5jeSBpZgotCXRoZXJlIGlzIGFsc28gYSBkZXBlbmRlbmN5IG9uICQoQURETF9ERVBTKS4KLQkoQkZETElCKTogUmVuYW1lIGZyb20gQkZEOyBjaGFuZ2UgYWxsIHVzZXM7IHNldCB0byAtTC4uL2JmZCAtbGJmZC4KLQkoT1BDT0RFU19ERVApOiBOZXcgdmFyaWFibGUuICBSZXBsYWNlIGFsbCBvY2N1cnJlbmRzIG9mICQoT1BDT0RFUykKLQlhcyBhIGRlcGVuZGVuY3kgd2l0aCAkKE9QQ09ERVNfREVQKS4KLQkoT1BDT0RFUyk6IFNldCB0byAtTC4uL29wY29kZXMgLWxvcGNvZGVzLgotCShBRERMX0RFUFMpOiBOZXcgdmFyaWFibGUuICBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZgotCSQoQURETF9MSUJTKSBhcyBhIGRlcGVuZGVuY3kgd2l0aCAkKEFERExfREVQUykuCi0JKGNoZWNrKTogU2V0IExEX0xJQlJBUllfUEFUSCBpbiB0aGUgZW52aXJvbm1lbnQuCi0JKGNvbmZpZy5zdGF0dXMpOiBEZXBlbmQgdXBvbiBCRkQgY29uZmlndXJlLmhvc3QgYW5kIGNvbmZpZy5iZmQuCi0KLUZyaSBGZWIgIDIgMTc6MDI6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYzogI2luY2x1ZGUgc3RkYXJnLmggb3IgdmFyYXJncy5oLgotCShvYmpkdW1wX3ByaW50X3ZhbHVlKTogQ2hhbmdlIEZJTEUqIGFyZyB0byBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyouCi0JQWxsIGNhbGxlcnMgdXBkYXRlZC4gIFVzZSBmcHJpbnRmX2Z1bmMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IENvbnNpc3RlbnRseSB1c2UgZnByaW50Zl9mdW5jLgotCShvYmpkdW1wX3NwcmludGYpOiBOZXcgZnVuY3Rpb24uCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBQcmludCBpbnNuIGludG8gYSBidWZmZXIsIHByaW50IHJhdyBpbnNuIG91cnNlbHZlcywKLQl0aGVuIHByaW50IGluc24gbW5lbW9uaWMuCi0KLUZyaSBGZWIgIDIgMTY6NDg6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVRodSBGZWIgIDEgMDk6Mzg6MTggMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzMtNl04Ni0qLXdpbjMyKTogQmVjb21lcyBpWzMtNl04Ni0qLWN5Z3dpbjMyLgotCShwb3dlcnBjKi0qLWN5Z3dpbjMyKTogTmV3LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotV2VkIEphbiAzMSAxMzoyMjowMyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSAkKERFTUFOR0xFUl9QUk9HKS4xLgotCi1Nb24gSmFuIDI5IDE3OjM2OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBIIEogTHUgPGhqbEB6b29tLmNvbT46Ci0JKiBvYmpjb3B5LmMgKHJlbW92ZV9sZWFkaW5nX2NoYXIpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShPUFRJT05fUkVNT1ZFX0xFQURJTkdfQ0hBUik6IERlZmluZS4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1yZW1vdmUtbGVhZGluZy1jaGFyLgotCShmaWx0ZXJfc3ltYm9scyk6IElmIHJlbW92ZV9sZWFkaW5nX2NoYXIsIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyCi0Jb2YgYSBnbG9iYWwgc3ltYm9sIG1hdGNoZXMgdGhlIHN5bWJvbCBsZWFkaW5nIGNoYXIgb2YgdGhlIEJGRCwKLQlyZW1vdmUgdGhlIGZpcnN0IGNoYXJhY3Rlci4KLQkoY29weV9vYmplY3QpOiBGaWx0ZXIgdGhlIHN5bWJvbHMgaWYgcmVtb3ZlX2xlYWRpbmdfY2hhciBpcyBzZXQuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSAtLXJlbW92ZS1sZWFkaW5nLWNoYXIuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tcmVtb3ZlLWxlYWRpbmctY2hhci4KLQotU2F0IEphbiAyNyAxNTo0MDoxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZnByaW50Zik6IEFkZCBwcm90b3R5cGUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZyBvbgotCVN1bk9TLgotCi1GcmkgSmFuIDI2IDExOjUzOjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aSAobm0pOiBJbXByb3ZlIGRvY3VtZW50YXRpb24gb24gc3ltYm9sIHR5cGVzLgotCShvYmpkdW1wKTogUmVmZXJlbmNlIHRoZSBzdGFicyBtYW51YWwgZnJvbSB0aGUgZGlzY3Vzc2lvbiBvZiB0aGUKLQktLXN0YWJzIG9wdGlvbi4KLQotVGh1IEphbiAyNSAxMToyMTo0NiAxOTk2ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEFkZCBhICJzdGFtcHMiIHRhcmdldC4KLQotVGh1IEphbiAyNSAxMzo1MTo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9oZWFkZXJzLCBkdW1wX3NlY3Rpb25faGVhZGVyKTogQ2hhbmdlIG9iamR1bXAgLWgKLQlvdXRwdXQgdG8gYmUgc2ltcGxlciBhbmQgdG8gaW5jbHVkZSBzZWN0aW9uIGZpbGUgb2Zmc2V0cy4KLQotV2VkIEphbiAyNCAxMjowNjowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfbWVtYmVycyk6IERvbid0IGFkanVzdCB2b2Zmc2V0LgotCi0JKiBpZWVlLmMgKGllZWVfcmVhZF9jeHhfY2xhc3MpOiBEb24ndCBtdWx0aXBseSB2b2Zmc2V0IGJ5IDQuCi0JKHN0cnVjdCBpZWVlX3dyaXRlX3R5cGUpOiBBZGQgbmFtZSBmaWVsZC4KLQkoc3RydWN0IGllZWVfdHlwZV9jbGFzcyk6IFJlbW92ZSBuYW1lIGZpZWxkLiAgQ2hhbmdlIGFsbCB1c2VzIHRvCi0JdXNlIG5ldyBuYW1lIGZpZWxkIGluIHR5cGUgaW5zdGVhZC4KLQkoc3RydWN0IGllZWVfbmFtZV90eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfc3RhcnRfc3RydWN0X3R5cGUpOiBJbml0aWFsaXplIG5hbWUgZmllbGQgb2YgdHlwZS4KLQkoaWVlZV9zdGFydF9jbGFzc190eXBlKTogRG9uJ3QgaW5pdGlhbGl6ZSBjbGFzc2RlZiBlbnRyeSBvZiB0YWcuCi0JKGllZWVfY2xhc3NfbWV0aG9kX3Zhcik6IERvbid0IGFkanVzdCB2b2Zmc2V0LgotCShpZWVlX2VuZF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfdGFnX3R5cGUpOiBJbml0aWFsaXplIG5ldyBuYW1lIGZpZWxkIG9mIHR5cGUuCi0JKGllZWVfdHlwZGVmKTogU2V0IG5hbWUgYWZ0ZXIgY29weWluZyBpbiB0eXBlIGluZm9ybWF0aW9uLgotCi0JKiBkZWJ1Zy5jIChWT0ZGU0VUX1NUQVRJQ19NRVRIT0QpOiBEZWZpbmUgYXMgLTEsIG5vdCAxLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUpOiBEZWZpbmUuCi0JKHN0cnVjdCBpZWVlX2hhbmRsZSk6IEFkZCBtb2RpZmllZCBhbmQgbW9kaWZpZWRfYWxsb2MgZmllbGRzLgotCShpZWVlX2dldF9tb2RpZmllZF9pbmZvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaWVlZV9wb2ludGVyX3R5cGUpOiBDYWNoZSB0eXBlIGluZGV4LgotCShpZWVlX2NvbnN0X3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV92b2xhdGlsZV90eXBlKTogTGlrZXdpc2UuCi0KLQkqIGllZWUuYyAoaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSk6IFdoZW4gY3JlYXRpbmcgYSB0YWcgZm9yIGFuCi0JYW5vbnltb3VzIHN0cnVjdCwgY29weSB0aGUgbmFtZSBpbnRvIG1lbW9yeS4KLQkoaWVlZV90YWdfdHlwZSk6IExpa2V3aXNlLgotCSogZGVidWcuYyAoZGVidWdfd3JpdGVfdHlwZSk6IE9ubHkgY2hlY2sgYW5kIHNldCBpZCBmaWVsZCBmb3IgYW4KLQl1bm5hbWVkIG9iamVjdC4KLQkoZGVidWdfd3JpdGVfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCi0JKiBpZWVlLmM6IFZhcmlvdXMgY2hhbmdlcyB0byB3cml0ZSBvdXQgdHlwZXMgZm9yIGZ1bmN0aW9ucyBhbmQKLQlyZWZlcmVuY2VzLCBhbmQgdG8gbm90IHdyaXRlIG91dCB1bm5lY2Vzc2FyeSBmdW5jdGlvbiB0eXBlcy4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV92YXIpOiBSZW1vdmUgdmFyaWFibGUgZmllbGQuICBBZGQga2luZAotCWZpZWxkLCBhbmQgZGVmaW5lIHNvbWUgZW51bSBjb25zdGFudHMgZm9yIGl0LgotCShwYXJzZV9pZWVlX3R5KTogU2V0IGtpbmQgZmllbGQgb2YgdmFyaWFibGUgZm9yICd4JyBhbmQgJ1gnIHR5cGVzLgotCShwYXJzZV9pZWVlX2F0bik6IE1ha2UgYW4gaW5kaXJlY3Qgc2xvdCBmb3IgYW4gZXh0ZXJuYWwgdmFyaWFibGUsCi0JYWx0aG91Z2ggd2Ugb3RoZXJ3aXNlIGRvbid0IHJlY29yZCBpdC4gIFNldCBraW5kIGZpZWxkIHJhdGhlciB0aGFuCi0JdmFyaWFibGUgZmllbGQgb2YgcHZhci4KLQkoaWVlZV9yZWFkX2N4eF9jbGFzcyk6IFRyeSB0byBnZXQgdGhlIHR5cGUgb2YgYSBzdGF0aWMgbWVtYmVyLgotCShpZWVlX3JlYWRfcmVmZXJlbmNlKTogQ2hlY2sga2luZCBmaWVsZCByYXRoZXIgdGhhbiB2YXJpYWJsZQotCWZpZWxkLgotCi1UdWUgSmFuIDIzIDE1OjU0OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jOiBWYXJpb3VzIGNoYW5nZXMgdG8gaGFuZGxlIHJlYWRpbmcgQysrIHJlZmVyZW5jZSB0eXBlCi0JaW5mb3JtYXRpb24uCi0KLQkqIGRlYnVnLmggKGVudW0gZGVidWdfdmFyX2tpbmQpOiBBZGQgREVCVUdfVkFSX0lMTEVHQUwuCi0JKGVudW0gZGVidWdfcGFybV9raW5kKTogQWRkIERFQlVHX1BBUk1fSUxMRUdBTC4KLQkqIGRlYnVnLmMgKGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMpOiBIYW5kbGUgREVCVUdfS0lORF9GVU5DVElPTi4KLQotCSogaWVlZS5jOiBWYXJpb3VzIGNoYW5nZXMgdG8gd3JpdGUgb3V0IGRlZmluaXRpb25zIG9mIEMrKyBjbGFzc2VzLgotCi0JKiBkZWJ1Zy5jIChkZWJ1Z19hcHBlbmRfZmlsZW5hbWUpOiBSZW1vdmUuCi0JKiBkZWJ1Zy5oIChkZWJ1Z19hcHBlbmRfZmlsZW5hbWUpOiBEb24ndCBkZWNsYXJlLgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBSZW1vdmUgbGFzdF90eXBlIGZpZWxkLiAgQWRkCi0Jc29fc3RyaW5nIGFuZCBzb192YWx1ZSBmaWVsZHMuCi0JKGZpbmlzaF9zdGFiKTogQ2FsbCBzdGFiX2VtaXRfcGVuZGluZ192YXJzIGJlZm9yZSBjYWxsaW5nCi0JZGVidWdfZW5kX2Z1bmN0aW9uLiAgRG9uJ3Qgd2FybiBhYm91dCBwZW5kaW5nIHZhcmlhYmxlcy4KLQkocGFyc2Vfc3RhYik6IEFjY3VtdWxhdGUgTl9TTyBzdHJpbmdzIHVudGlsIGEgbm9uIE5fU08gc3ltYm9sIGlzCi0Jc2VlbiwgcmF0aGVyIHRoYW4gY2FsbGluZyBkZWJ1Z19hcHBlbmRfZmlsZW5hbWUuICBDYWxsCi0Jc3RhYl9lbWl0X3BlbmRpbmdfdmFycyBiZWZvcmUgY2FsbGluZyBkZWJ1Z19lbmRfZnVuY3Rpb24uICBEb24ndAotCXNldCBpbmZvLT5sYXN0X3R5cGUuCi0KLVR1ZSBKYW4gMjMgMDk6NTM6NTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEhhbmRsZSB1bmtub3duIGVuZGlhbm5lc3MuCi0JUGFzcyBmcHJpbnRmIHRvIElOSVRfRElTQVNTRU1CTEVfSU5GTy4KLQotTW9uIEphbiAyMiAxNjo0Njo0MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCUFkZCBuZXcgb3B0aW9uIC0tc2hvdy1yYXctaW5zbi4KLQkqIG9iamR1bXAuYyAoc2hvd19yYXdfaW5zbik6IE5ldyBnbG9iYWwuCi0JKHVzYWdlKTogVXBkYXRlLgotCShsb25nX29wdGlvbnMpOiBVcGRhdGUuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgZGlzYXNtX2luZm8uZmxhZ3MgaWYgLS1zaG93LXJhdy1pbnNuLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgbmV3IGFyY2gsbWFjaCxlbmRpYW4gZmllbGRzIGluCi0JZGlzYXNtX2luZm8uCi0KLU1vbiBKYW4gMjIgMTk6Mjk6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHBhc3MgYSBzaW5nbGUgaW5mbyBhcmd1bWVudCBhcm91bmQKLQlpbiB0aGUgcmVhZGluZyByb3V0aW5lcywgcmF0aGVyIHRoYW4gc2V2ZXJhbCBhcmd1bWVudHMuICBBZGQgY29kZQotCXRvIHJlYWQgQysrIGRlYnVnZ2luZyByZWNvcmRzLgotCi0JKiBkZWJ1Zy5oIChkZWJ1Z19nZXRfdHlwZV9zaXplKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X2ZpZWxkX25hbWUpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfYml0cG9zKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfdmlzaWJpbGl0eSk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZF9waHlzbmFtZSk6IERlY2xhcmUuCi0JKiBkZWJ1Zy5jIChkZWJ1Z19nZXRfcmVhbF90eXBlKTogSGFuZGxlIERFQlVHX0tJTkRfVEFHR0VELgotCShkZWJ1Z19nZXRfdHlwZV9zaXplKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X2ZpZWxkX2JpdHBvcyk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9maWVsZF92aXNpYmlsaXR5KTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfcGh5c25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX3dyaXRlX3R5cGUpOiBNYWtlIHN1cmUgd2UgcGFzcyB0aGUgcmVhbCBraW5kLCBub3QgSU5ESVJFQ1QsCi0JdG8gdGFnX3R5cGUuICBQYXNzIHRoZSBuYW1lIHJlY3Vyc2l2ZWx5IGZvciBJTkRJUkVDVC4KLQotRnJpIEphbiAxOSAxMjozMTo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRlYnVnLmggKHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMpOiBSZW1vdmUgZWxsaXBzaXNfdHlwZS4gIEFkZCBpbnQKLQlhbmQgYm9vbGVhbiBwYXJhbWV0ZXJzIHRvIGZ1bmN0aW9uX3R5cGUuICBBZGQgYm9vbGVhbiBwYXJhbWV0ZXIgdG8KLQltZXRob2RfdHlwZS4KLQkoZGVidWdfbWFrZV9lbGxpcHNpc190eXBlKTogRG9uJ3QgZGVjbGFyZS4KLQkoZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlKTogQWRkIGRlYnVnX3R5cGUgKiBhbmQgYm9vbGVhbgotCXBhcmFtZXRlcnMuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGRlYnVnX21ha2VfbWV0aG9kX3R5cGUpOiBBZGQgYm9vbGVhbiBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IEFkZCBib29sZWFuICogcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKGRlYnVnX2dldF90YXJnZXRfdHlwZSk6IERlY2xhcmUuCi0JKiBkZWJ1Zy5jIChzdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZSk6IEFkZCBmaWVsZHMgYXJnX3R5cGVzIGFuZAotCXZhcmFyZ3MuCi0JKHN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZSk6IEFkZCBmaWVsZCB2YXJhcmdzLgotCShkZWJ1Z19lbGxpcHNpc190eXBlLCBFTExJUFNJU19QKTogUmVtb3ZlLgotCShkZWJ1Z19tYWtlX2VsbGlwc2lzX3R5cGUpOiBSZW1vdmUuCi0JKGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSk6IEFkZCBhcmdfdHlwZXMgYW5kIHZhcmFyZ3MgcGFyYW1ldGVycy4KLQkoZGVidWdfbWFrZV9tZXRob2RfdHlwZSk6IEFkZCB2YXJhcmdzIHBhcmFtZXRlci4KLQkoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IEFkZCBwdmFyYXJncyBwYXJhbWV0ZXIuCi0JKGRlYnVnX2dldF90YXJnZXRfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfd3JpdGVfdHlwZSk6IEluIGNhc2UgREVCVUdfS0lORF9GVU5DVElPTiwgcHVzaCBhcmd1bWVudAotCXR5cGVzIGFuZCBwYXNzIGNvdW50IHRvIGZ1bmN0aW9uX3R5cGUuICBJbiBERUJVR19LSU5EX01FVEhPRCwgdXNlCi0JYSBzaWduZWQgaW50IGZvciB0aGUgY291bnQsIGRvbid0IGNhbGwgZWxsaXBzaXNfdHlwZSwgYW5kIHBhc3MKLQl2YXJhcmdzIHRvIG1ldGhvZF90eXBlLgotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyk6IEFkZCB2YXJhcmdzIGZpZWxkLgotCShzdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzKTogQWRkIHB2YXJhcmdzIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShzdGFiX2RlbWFuZ2xlX2FyZ3MpOiBMaWtld2lzZS4KLQkoc3RhYl9kZW1hbmdsZV90eXBlKTogSW4gY2FzZSAnRicsIHBpY2sgdXAgYXJndW1lbnQgdHlwZXMuCi0JKiBwcmRiZy5jIChwcl9lbGxpcHNpc190eXBlKTogUmVtb3ZlLgotCShwcl9mdW5jdGlvbl90eXBlKTogQWRkIGFyZ2NvdW50IGFuZCB2YXJhcmdzIHBhcmFtZXRlcnMuCi0JKHByX21ldGhvZF90eXBlKTogQWRkIHZhcmFyZ3MgcGFyYW1ldGVyLgotCSogaWVlZS5jIChpZWVlX2VsbGlwc2lzX3R5cGUpOiBSZW1vdmUuCi0JKGllZWVfZnVuY3Rpb25fdHlwZSk6IEFkZCBhcmdjb3VudCBhbmQgdmFyYXJncyBwYXJhbWV0ZXJzLgotCShpZWVlX21ldGhvZF90eXBlKTogQWRkIHZhcmFyZ3MgcGFyYW1ldGVyLiAgUmVtb3ZlIG1vc3Qgb2YKLQlmdW5jdGlvbiBib2R5LCBhbmQganVzdCBjYWxsIGllZWVfZnVuY3Rpb25fdHlwZS4KLQotCSogc3RhYnMuYzogSW5jbHVkZSAiZGVtYW5nbGUuaCIuICBBZGRlZCBzZXZlcmFsIG5ldyBzdGF0aWMKLQlmdW5jdGlvbnMgbm90IGxpc3RlZCBiZWxvdyB0byBkZW1hbmdsZSBhcmd1bWVudCB0eXBlczsgdGhleSBhcmUKLQlhbGwgY2FsbGVkIHZpYSBzdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzLgotCShmaW5pc2hfc3RhYik6IElmIHRoZSBraW5kIG9mIGFuIHVuZGVmaW5lZCB0YWcgaXMKLQlERUJVR19LSU5EX0lMTEVHQUwsIHVzZSBERUJVR19LSU5EX1NUUlVDVCBpbnN0ZWFkLiAgV2FybiBpZiB0aGVyZQotCWFyZSBhbnkgcGVuZGluZyB2YXJpYWJsZS4KLQkocGFyc2Vfc3RhYik6IERvbid0IGNsb3NlIHRoZSBmdW5jdGlvbiB3aGVuIHRoZSBibG9jayBkZXB0aCBnb2VzCi0JdG8gemVyby4gIFBhc3MgdmFsdWUgdG8gZGVidWdfZW5kX2Z1bmN0aW9uLgotCShwYXJzZV9zdGFiX3N0cmluZyk6IEluIGNhc2UgJ1QnLCBwYXNzIHRoZSBuYW1lIHRvCi0JcGFyc2Vfc3RhYl90eXBlLgotCShwYXJzZV9zdGFiX3R5cGUpOiBJbiBjYXNlICd4JywgdXNlIHN0YWJfZmluZF90YWdnZWRfdHlwZS4gIEluCi0JY2FzZSAnIycsIGhhbmRsZSBmdW5jdGlvbnMgd2l0aCB2YXJpYWJsZSBudW1iZXJzIG9mIGFyZ3VtZW50cy4KLQkocGFyc2Vfc3RhYl9zdHJ1Y3RfdHlwZSk6IEFkZCB0YWduYW1lIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShwYXJzZV9zdGFiX21lbWJlcnMpOiBBZGQgdGFnbmFtZSBhbmQgdHlwZW51bXMgcGFyYW1ldGVycy4gIENoYW5nZQotCWFsbCBjYWxsZXJzLiAgSWYgdGhlIHR5cGUgb2YgYSBtZXRob2QgaXMgYSBzdHViLCBjYWxsCi0JcGFyc2Vfc3RhYl9hcmd0eXBlcyB0byBkZW1hbmdsZSB0aGUgYXJndW1lbnQgdHlwZXMgYW5kIGdldCB0aGUKLQlwaHlzaWNhbCBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KLQkocGFyc2Vfc3RhYl9hcmd0eXBlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0YWJfcmVjb3JkX3ZhcmlhYmxlKTogRm9yIGEgREVCVUdfR0xPQkFMIG9yIERFQlVHX1NUQVRJQwotCXZhcmlhYmxlLCBjYWxsIGRlYnVnX3JlY29yZF92YXJpYWJsZSBpbW1lZGlhdGVseS4KLQkoc3RhYl9maW5kX3RhZ2dlZF90eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogZGVidWcuaCAoZW51bSBkZWJ1Z190eXBlX2tpbmQpOiBBZGQgREVCVUdfS0lORF9JTExFR0FMLgotCShzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zKTogQWRkIGZpZWxkIGVsbGlwc2lzX3R5cGUuICBBZGQgaWQKLQlwYXJhbWV0ZXIgdG8gc3RhcnRfc3RydWN0X3R5cGUsIHN0YXJ0X2NsYXNzX3R5cGUsIGFuZCB0YWdfdHlwZS4KLQkoZGVidWdfbWFrZV9lbGxpcHNpc190eXBlKTogRGVjbGFyZS4KLQkoZGVidWdfZmluZF9uYW1lZF90eXBlKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X3R5cGVfa2luZCk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9yZXR1cm5fdHlwZSk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRzKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X2ZpZWxkX3R5cGUpOiBEZWNsYXJlLgotCSogZGVidWcuYyAoc3RydWN0IGRlYnVnX2hhbmRsZSk6IEFkZCBmaWVsZHMgY2xhc3NfaWQgYW5kIGJhc2VfaWQuCi0JKHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlKTogQWRkIGZpZWxkIGlkLgotCShzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQpOiBSZW5hbWUgYXJndHlwZXMgdG8gcGh5c25hbWUuCi0JQ2hhbmdlIGFsbCB1c2VzLgotCShkZWJ1Z19lbGxpcHNpc190eXBlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoRUxMSVBTSVNfUCk6IE5ldyBtYWNyby4KLQkoZGVidWdfbWFrZV9lbGxpcHNpc190eXBlKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19tYWtlX21ldGhvZF92YXJpYW50KTogUmVuYW1lIGFyZ3R5cGVzIHRvIHBoeXNuYW1lLgotCShkZWJ1Z19tYWtlX3N0YXRpY19tZXRob2RfdmFyaWFudCk6IExpa2V3aXNlLgotCShkZWJ1Z19uYW1lX3R5cGUpOiBBbHdheXMgcHV0IHR5cGVzIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgotCShkZWJ1Z19maW5kX25hbWVkX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUpOiBUcmVhdCBERUJVR19LSU5EX0lMTEVHQUwgc3BlY2lhbGx5LAotCXJhdGhlciB0aGFuIERFQlVHX0tJTkRfVk9JRC4KLQkoZGVidWdfZ2V0X3JlYWxfdHlwZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF90eXBlX2tpbmQpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9yZXR1cm5fdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X2ZpZWxkcyk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X2ZpZWxkX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX3dyaXRlKTogSW5pdGlhbGl6ZSBiYXNlX2lkLgotCShkZWJ1Z193cml0ZV90eXBlKTogUGFzcyBuZXcgaWQgYXJndW1lbnQgdG8gdGFnX3R5cGUuICBIYW5kbGUKLQlERUJVR19LSU5EX0lMTEVHQUwuICBVc2UgaWQgZm9yCURFQlVHX0tJTkRfU1RSVUNUIGFuZAotCURFQlVHX0tJTkRfVU5JT04uICBIYW5kbGUgZWxsaXBzaXMgZm9yIG1ldGhvZCBhcmd1bWVudHMuCi0JKGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUpOiBEb24ndCBkZXJlZmVyZW5jZSBrY2xhc3MgaWYgaXQgaXMgTlVMTC4KLQlVc2UgaWQuCi0JKiBwcmRiZy5jIChwcl9mbnMpOiBBZGQgcHJfZWxsaXBzaXNfdHlwZS4KLQkocHJfZWxsaXBzaXNfdHlwZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHByX3BvaW50ZXJfdHlwZSk6IElmIHRoaXMgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5LCBwYXJlbnRoZXNpemUKLQlpdCBjb3JyZWN0bHkuCi0JKHByX3N0YXJ0X3N0cnVjdF90eXBlKTogQWRkIGlkIHBhcmFtZXRlci4KLQkocHJfc3RhcnRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCShwcl90YWdfdHlwZSk6IExpa2V3aXNlLgotCShwcl9maXhfdmlzaWJpbGl0eSk6IEFkZCB0aGUgdmlzaWJpbGl0eSB0byB0aGUgdG9wIG9mIHRoZSBzdGFjaywKLQlub3QgdGhlIHNlY29uZCBlbGVtZW50IG9uIHRoZSBzdGFjay4KLQkocHJfc3RydWN0X2ZpZWxkKTogUG9wIHRoZSBzdGFjayBiZWZvcmUgY2FsbGluZyBwcl9maXhfdmlzaWJpbGl0eS4KLQkocHJfY2xhc3Nfc3RhdGljX21lbWJlcik6IExpa2V3aXNlLgotCShwcl9jbGFzc19zdGFydF9tZXRob2QpOiBEb24ndCBwdXNoIGEgdHlwZSwganVzdCBzZXQgdGhlIG1ldGhvZAotCW5hbWUgaW4gdGhlIHR5cGUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JKHByX2NsYXNzX2VuZF9tZXRob2QpOiBEb24ndCBwb3AgdGhlIHN0YWNrLgotCShwcl9jbGFzc19tZXRob2RfdmFyaWFudCk6IFJlbmFtZSBhcmd0eXBlcyBwYXJhbWV0ZXIgdG8gcGh5c25hbWUuCi0JQXBwZW5kIGNvbnN0IGFuZCB2b2xhdGlsZSByYXRoZXIgdGhhbiBwcmVwZW5kaW5nIHRoZW0uICBBZGQgYQotCXNwYWNlIGFmdGVyIHRoZSBwaHlzbmFtZS4KLQkocHJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50KTogTGlrZXdpc2UuCi0JKiBpZWVlLmMgKGllZWVfZm5zKTogQWRkIGllZWVfZWxsaXBzaXNfdHlwZS4KLQkoaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSk6IFVzZSBERUJVR19LSU5EX0lMTEVHQUwgcmF0aGVyIHRoYW4KLQlERUJVR19LSU5EX1ZPSUQuCi0JKHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8pOiBMaWtld2lzZS4KLQkoaWVlZV90eXBkZWYpOiBMaWtld2lzZS4KLQkoaWVlZV9lbGxpcHNpc190eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaWVlZV9zdGFydF9zdHJ1Y3RfdHlwZSk6IEFkZCBpZCBwYXJhbWV0ZXIuCi0JKGllZWVfc3RhcnRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCShpZWVlX3RhZ190eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfY2xhc3NfbWV0aG9kX3ZhcmlhbnQpOiBSZW5hbWUgbmFtZSB0byBwaHlzbmFtZS4KLQkoaWVlZV9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQpOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW4gKERFQlVHX09CSlMpOiBSZW1vdmUgcHJkYmcuby4KLQkoJChPQkpEVU1QX1BST0cpKTogRGVwZW5kIHVwb24sIGFuZCBsaW5rIGFnYWluc3QsIHByZGJnLm8uCi0KLVRodSBKYW4gMTggMTc6MzU6MDYgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobWFrZV90YWlsKTogQ2hhbmdlZCB0aGUgb3JkZXIgb2YgdGhlIHNlY3Rpb25zIHRvIGF2b2lkCi0JYW4gYWxpZ25tZW50IHByb2JsZW0uCi0KLVdlZCBKYW4gMTcgMTQ6MjM6MDAgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzcmNvbnYuYyAod3JfZHUpOiBTZXQgZHUuc3RhY2tmcm10IHRvIDAuCi0JKHdyX3VuLCB3cl9zYyk6IEVtaXQgYWxsIHNlY3Rpb25zLCBldmVuIHRob3NlIHdpdGggMCBzaXplLgotCi1UdWUgSmFuIDE2IDE2OjE1OjQ5IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3Jjb252LmMgKHdyX2hkKTogU3BhY2Ugc2l6ZSB3aXRoaW4gc2VnbWVudCB3YXMgYmVpbmcKLQlzdG9yZWQgaW4gc2VnbWVudCBpZGVudGlmaWVyIGZpZWxkLgotCi1UdWUgSmFuIDE2IDEyOjA3OjI1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbiAoQlVJTERfTkxNQ09OViwgQlVJTERfU1JDT05WLCBTWVNJTkZPX1BST0csCi0JQlVJTERfRExMVE9PTCk6IFB1dCBkZWZpbml0aW9ucyBmb3IgdGhlc2UgaW50byBtYWtlZmlsZSB3aGVuCi0JY29uZmlndXJpbmcsIGluc3RlYWQgb2YgYWx3YXlzIGNsZWFyaW5nIGluIG1wdy1tYWtlLnNlZC4KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBvdXQgYW55IGhvc3RfYWxpYXMgb3IgdGFyZ2V0X2FsaWFzIHNldHRpbmdzLAotCWZpeCBwYXRobmFtZSB0byBCRkQgaW50ZXJuYWwgaW5jbHVkZSBmaWxlcywgcmVtb3ZlIGRlcGVuZGVuY3kKLQljYWxjdWxhdGlvbiBydWxlcy4KLQotVGh1IEphbiAxMSAxNzozMTozOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX2hlYWRlcik6IEFkZCBuZXcgc2VjdGlvbiBmbGFncwotCVNFQ197RVhDTFVERSxTT1JUX0VOVFJJRVN9LgotCi1UaHUgSmFuIDExIDExOjQ1OjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IE5VTEwgdGVybWluYXRlIHRoZSBvdXRwdXQgc3ltYm9scy4KLQkoY29weV9vYmplY3QpOiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBwb3NzaWJsZSBleHRyYSBOVUxMIHBvaW50ZXIuCi0KLQkqIGRlYnVnLmMgKGRlYnVnX21ha2VfdW5kZWZpbmVkX3RhZ2dlZF90eXBlKTogTWFrZSBzdXJlIHdlIGFyZQotCWdpdmVuIGEga2luZCBvZiB0eXBlIHdlIGNhbiBoYW5kbGUuCi0JKGRlYnVnX3dyaXRlX3R5cGUpOiBIYW5kbGUgdW5kZWZpbmVkIGVudW1zIGFuZCBzdHJ1Y3RzLgotCShkZWJ1Z193cml0ZV9jbGFzc190eXBlKTogSGFuZGxlIHVuZGVmaW5lZCBjbGFzc2VzLgotCSogcHJkYmcuYyAocHJfZW51bV90eXBlKTogSGFuZGxlIGFuIHVuZGVmaW5lZCBlbnVtLgotCSogaWVlZS5jIChpZWVlX2VudW1fdHlwZSk6IExpa2V3aXNlLgotCi1XZWQgSmFuIDEwIDE1OjMzOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgZGVwZW5kZW5jaWVzLgotCShBTExPQ0EsIE1BTExPQyk6IFJlbW92ZSB2YXJpYWJsZXMuCi0JKEFERExfTElCUyk6IFJlbW92ZSAkKE1BTExPQykgZnJvbSBkZWZpbml0aW9uLgotCSogYWxsb2NhLmMsIGdtYWxsb2MuYzogUmVtb3ZlLgotCi1Nb24gSmFuICA4IDE4OjAyOjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jOiBBZGQgZ2xvYmFsIGZ1bmN0aW9uIHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8gYW5kIGEKLQlidW5jaCBvZiBzdGF0aWMgZnVuY3Rpb25zIGFuZCBzdHJ1Y3RzIHVzZWQgdG8gd3JpdGUgb3V0IElFRUUKLQlkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0JKiBidWRiZy5oICh3cml0ZV9pZWVlX2RlYnVnZ2luZ19pbmZvKTogRGVjbGFyZS4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV90eXBlKTogQWRkIHBzbG90IGZpZWxkLgotCShlbnVtIGJ1aWx0aW5fdHlwZXMpOiBEZWZpbmUuCi0JKGllZWVfYnVpbHRpbl90eXBlKTogRm9yIGEgcG9pbnRlciwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbmFtZWQKLQl0eXBlLiAgVXNlIGVudW0gdmFsdWVzIHJhdGhlciB0aGFuIG51bWJlcnMuCi0JKGllZWVfYWxsb2NfdHlwZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGllZWVfcmVhZF90eXBlX2luZGV4KTogVXNlIGllZWVfYWxsb2NfdHlwZS4KLQkocGFyc2VfaWVlZV9iYik6IExpa2V3aXNlLgotCShwYXJzZV9pZWVlX3R5KTogTGlrZXdpc2UuICBVc2UgaWVlZV9idWlsdGluX3R5cGUgZm9yIGFycmF5IHJhbmdlLAotCXJhdGhlciB0aGFuIG1ha2luZyBhIG5ldyBpbnRlZ2VyIHR5cGUuICBTdG9yZSB0aGUgbmV3IHR5cGUgaW4gdGhlCi0Jc2xvdCwgaWYgdGhlcmUgaXMgb25lLgotCShwYXJzZV9pZWVlX2F0bik6IFRyZWF0IEFUTjEwIGFzIGRlZmluaW5nIGEgcmVnaXN0ZXIgdmFyaWFibGUuCi0JKGllZWVfcmVnbm9fdG9fZ2VucmVnKTogUmVuYW1lIGZyb20gaWVlZV9yZWdub190b19nZW4uICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkoaWVlZV9nZW5yZWdfdG9fcmVnbm8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX3R5cGUpOiBBZGQgbmV3IHR5cGVuYW1lIHBhcmFtZXRlci4gIENoYW5nZQotCWFsbCBjYWxsZXJzLgotCShwYXJzZV9zdGFiX3JhbmdlX3R5cGUpOiBBZGQgbmV3IHR5cGVuYW1lIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCi0JKiBkZWJ1Zy5oIChzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zKTogQWRkIHRhZyBwYXJhbWV0ZXIgdG8KLQllbnVtX3R5cGUsIHN0YXJ0X3N0cnVjdF90eXBlLCBhbmQgc3RhcnRfY2xhc3NfdHlwZS4KLQkqIGRlYnVnLmMgKGRlYnVnX3dyaXRlX3R5cGUpOiBQYXNzIGFueSB0YWcgbmFtZSB0bwotCXN0YXJ0X3N0cnVjdF90eXBlLCBkZWJ1Z193cml0ZV9jbGFzc190eXBlLCBhbmQgZW51bV90eXBlLiAgSWYKLQlERUJVR19LSU5EX1RBR0dFRCwgcGFzcyB0aGUgbmFtZSBpbiB0aGUgcmVjdXJzaXZlIGNhbGwuCi0JKGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUpOiBBY2NlcHQgYSBuZXcgdGFnIHBhcmFtZXRlciwgYW5kIHBhc3MgaXQKLQl0byBzdGFydF9jbGFzc190eXBlLgotCSogcHJkYmcuYyAocG9wX3R5cGUpOiBEb24ndCByZW1vdmUgJysnIGNoYXJhY3Rlci4KLQkocHJfZW51bV90eXBlKTogQWNjZXB0IGFuZCB1c2UgdGFnIHBhcmFtZXRlci4KLQkocHJfc3RhcnRfc3RydWN0X3R5cGUpOiBMaWtld2lzZS4KLQkocHJfc3RhcnRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCShwcl9jbGFzc19iYXNlY2xhc3MpOiBBZGp1c3QgYWxnb3JpdGhtIHVzZWQgdG8gZmluZCB3aGVyZSB0byBwdXQKLQl0aGUgYmFzZWNsYXNzIG5hbWUuCi0JKHByX3RhZyk6IERvbid0IGJvdGhlciB0byBpbnNlcnQgdGhlIHRhZyBuYW1lLgotCi0JKiBvYmpjb3B5LmM6IEluY2x1ZGUgYnVkYmcuaC4KLQkoY29udmVydF9kZWJ1Z2dpbmcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShPUFRJT05fREVCVUdHSU5HKTogRGVmaW5lLgotCShjb3B5X29wdGlvbnMpOiBBZGQgImRlYnVnZ2luZyIuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tZGVidWdnaW5nLgotCShpc19zdHJpcF9zZWN0aW9uKTogU2tpcCBkZWJ1Z2dpbmcgc2VjdGlvbnMgaWYgY29udmVydF9kZWJ1Z2dpbmcuCi0JKHNldHVwX3NlY3Rpb24sIGNvcHlfc2VjdGlvbik6IExpa2V3aXNlLgotCShmaWx0ZXJfc3ltYm9scyk6IFNraXAgZGVidWdnaW5nIHN5bWJvbHMgaWYgY29udmVydF9kZWJ1Z2dpbmcuCi0JKGNvcHlfb2JqZWN0KTogSWYgY29udmVydF9kZWJ1Z2dpbmcsIHJlYWQgYW5kIHdyaXRlIGRlYnVnZ2luZwotCWluZm9ybWF0aW9uLgotCSh3cml0ZV9kZWJ1Z2dpbmdfaW5mbyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvcHlfbWFpbik6IEhhbmRsZSAtLWRlYnVnZ2luZy4KLQkqIE1ha2VmaWxlLmluIChERUJVR19PQkpTKTogTmV3IHZhcmlhYmxlLgotCSgkKE9CSkNPUFlfUFJPRykpOiBEZXBlbmQgdXBvbiBhbmQgbGluayBhZ2FpbnN0ICQoREVCVUdfT0JKUykuCi0JKCQoU1RSSVBfUFJPRykpOiBMaWtld2lzZS4KLQkoT0JKRFVNUF9PQkpTKTogUmVtb3ZlIHZhcmlhYmxlLgotCSgkKE9CSkRVTVBfUFJPRykpOiBVc2Ugb2JqZHVtcC5vICQoREVCVUdfT0JKUykgcmF0aGVyIHRoYW4KLQkkKE9CSkRVTVBfT0JKUykuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tZGVidWdnaW5nLgotCi1UaHUgSmFuICA0IDE2OjMxOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jOiBOZXcgZmlsZSB3aXRoIGNvZGUgdG8gcmVhZCBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQkqIGJ1ZGJnLmggKHBhcnNlX2llZWUpOiBEZWNsYXJlLgotCSogcmRkYmcuYyAocmVhZF9kZWJ1Z2dpbmdfaW5mbyk6IEhhbmRsZSBJRUVFIGZsYXZvdXIgZmlsZXMuCi0JKHJlYWRfaWVlZV9kZWJ1Z2dpbmdfaW5mbyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZCBpZWVlLmMuCi0JKE9CSkRVTVBfT0JKUyk6IEFkZCBpZWVlLm8uCi0KLQkqIGJ1Y29tbS5oICh4cmVhbGxvYyk6IENoYW5nZSB0eXBlIG9mIGZpcnN0IHBhcmFtZXRlciBmcm9tIGNoYXIgKgotCXRvIFBUUi4KLQotVHVlIEphbiAgMiAxNzo0NDowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgdGFyZ2V0cyB0byBhdXRvbWF0aWNhbGx5IHJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCVJlbW92ZSB0YXJnZXRzIHdoaWNoIGp1c3QgbGlzdGVkIGRlcGVuZGVuY2llcyBvZiAubyBmaWxlcy4KLQkoREVQKTogTmV3IHZhcmlhYmxlLgotCShIRklMRVMsIEdFTkVSQVRFRF9IRklMRVMpOiBOZXcgdmFyaWFibGVzLgotCShDRklMRVMsIEdFTkVSQVRFRF9DRklMRVMpOiBOZXcgdmFyaWFibGVzLgotCSh1bmRlcnNjb3JlLmMpOiBEb24ndCBkbyBhbnl0aGluZywganVzdCBkZXBlbmQgdXBvbiBzdGFtcC11bmRlci4KLQkoc3RhbXAtdW5kZXIpOiBOZXcgdGFyZ2V0OyBkbyB3aGF0IHVuZGVyc2NvcmUuYyB1c2VkIHRvIGRvLgotCShubG1jb252Lm8pOiBEZXBlbmQgdXBvbiBzeW0uaCBhbmQgZWNvZmYuaC4KLQkoLmRlcCwgLmRlcDEsIGRlcC5zZWQsIGRlcCwgZGVwLWluKTogTmV3IHRhcmdldHMuCi0JKHN0YWdlMSwgc3RhZ2UyLCBzdGFnZTMsIGFnYWluc3QsIGNvbXBhcmlzb24pOiBSZW1vdmUuCi0JKGRlLXN0YWdlMSwgZGUtc3RhZ2UyLCBkZS1zdGFnZTMpOiBSZW1vdmUuCi0JKGNsZWFuLCBkaXN0Y2xlYW4pOiBSZW1vdmUgc3RhbXAtdW5kZXIgYW5kIGRlcC5zZWQuCi0JKiBkZXAtaW4uc2VkOiBOZXcgZmlsZS4KLQotCUltcGxlbWVudCBnZW5lcmljIGRlYnVnZ2luZyBzdXBwb3J0LiAgSW1wbGVtZW50IGEgc3RhYnMgcmVhZGVyIGFuZAotCWEgZ2VuZXJpYyBwcmludGVyLgotCSogYnVkYmcuaCwgZGVidWcuYywgZGVidWcuaCwgcHJkYmcuYywgcmRkYmcuYywgc3RhYnMuYzogTmV3IGZpbGVzLgotCSogb2JqZHVtcC5jOiBJbmNsdWRlICJkZWJ1Zy5oIiBhbmQgImJ1ZGJnLmgiLgotCShkdW1wX2RlYnVnZ2luZyk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtLWRlYnVnZ2luZy4KLQkobG9uZ19vcHRpb25zKTogQWRkICJkZWJ1Z2dpbmciLgotCShkaXNwbGF5X2JmZCk6IEhhbmRsZSAtLWRlYnVnZ2luZy4KLQkqIE1ha2VmaWxlLmluIChPQkpEVU1QX09CSlMpOiBOZXcgdmFyaWFibGUuCi0JKCQoT0JKRFVNUF9QUk9HKSk6IFVzZSAkKE9CSkRVTVBfT0JKUykuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC0tZGVidWdnaW5nLgotCi1TYXQgRGVjIDMwIDA5OjU5OjUxIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbm0uYyAoIGxvbmdfb3B0aW9ucyk6IEFkZCAiLS1kZWZpbmVkLW9ubHkiIG9wdGlvbi4KLQkodXNhZ2UpOiBVcGRhdGUgZm9yIG5ldyAiLS1kZWZpbmVkLW9ubHkiIG9wdGlvbi4KLQkoZmlsdGVyX3N5bWJvbHMpOiBIYW5kbGUgIi0tZGVmaW5lZC1vbmx5Ii4KLQotRnJpIERlYyAyOSAxNjowNDo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFycGFyc2UueTogSW5jbHVkZSAiYnVjb21tLmgiLCBub3QgPHN5c2RlcC5oPi4KLQkqIG5sbWhlYWRlci55OiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuCi0KLVR1ZSBEZWMgMjYgMTg6MjM6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubS5jIChwcmludF9zeW1kZWZfZW50cnkpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfZ2V0X2VsdF9hdF9pbmRleC4KLQotU2F0IERlYyAyMyAxMTowMzoxNiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmNneW5zdS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoRExMVE9PTF9ERUZTKTogQnVpbGQgZGxsdG9vbCBmb3IgUG93ZXJQQyBpZiB0YXJnZXQKLQlpcyBwb3dlcnBjKi0qLXdpbiogaW4gYWRkaXRpb24gdG8gcG93ZXJwYyotKi0qcGUqLgotCi1GcmkgRGVjIDE1IDE2OjMwOjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChlbmRpYW5fc3RyaW5nKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGlzcGxheV90YXJnZXRfbGlzdCk6IFVzZSBpdC4KLQkqIG5sbWNvbnYuYyAobWFpbik6IFVzZSBuZXcgYmZkX2JpZ19lbmRpYW4gbWFjcm8uCi0KLUZyaSBEZWMgMTUgMDc6NTE6MzQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChmaWxsX29yZGluYWxzKTogU3RhcnQgZnJvbSAxIGlmIG5vIG90aGVyIGluc3RydWN0aW9ucwotIAlnaXZlbi4KLQotVHVlIERlYyAxMiAxMjowNToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSAkKERFTUFOR0xFUl9QUk9HKS4xLiAgRnJvbSBSb25hbGQKLQlGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT4uCi0KLU1vbiBEZWMgMTEgMTQ6MzM6MDUgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtYWMtYmludXRpbHMucjogRml4IGNvcHlyaWdodCBhbmQgdmVyc2lvbiBzdHJpbmdzLgotCi0JKiBNYWtlZmlsZS5pbiAodmVyc2lvbik6IFJlbW92ZSwgbm8gbG9uZ2VyIHVzZWQuCi0KLUZyaSBEZWMgIDEgMTQ6NDE6NTYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQgKGluc3RhbGwsIGluc3RhbGwtb25seSk6IEVkaXQgaW4gTWFjLXNwZWNpZmljCi0JaW5zdGFsbCBwcm9jZWR1cmUuCi0KLVRodSBOb3YgMzAgMjA6MjY6MDIgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAocHBjX2p0YWIpOiBUaGUgYmluYXJ5IGdsdWUgZm9yIFBvd2VyUEMgZGxsIGxpbmthZ2UsCi0JaW5jbHVkaW5nIHRoZSByZXR1cm4gaW5zdHJ1Y3Rpb24uCi0Jc2luZm86IGFkZGVkIGEgcHJlZmVycmVkIGFsaWdubWVudCBmaWVsZC4KLQkoc2VjZGF0YSk6IHNlY3Rpb24gZGF0YSBmb3IgdGhlIFBvd2VyUEMgdmVyc2lvbi4KLQkobWFrZV9vbmVfbGliX2ZpbGUpOiBNb3JlIHN5bWJvbHMsIE1vcmUgc2VjdGlvbnMgKHBkYXRhLCByZGF0YSkKLQkobWFrZV90YWlsKTogVXNlIGlkYXRhJDYgaW5zdGVhZCBvZiBpZGF0YSQ3IGZvciBwcGMuIEFsc28gYWRkZWQgYQotCU5VTEwgaWRhdGEkMyBkZXNjcmlwdG9yICh0ZW1wb3JhcnkpLgotCi1UdWUgTm92IDI4IDE3OjIzOjQ0IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZmlsbF9vcmRpbmFscyk6IERvbid0IHJlZmVyZW5jZSBkX2V4cG9ydF92ZWMgaWYKLQl0aGVyZSBhcmUgbm8gZXhwb3J0ZWQgZnVuY3Rpb25zLgotCi1Nb24gTm92IDI3IDEzOjA1OjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi43LgotCi1XZWQgTm92IDIyIDEzOjE3OjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChmaWxsX29yZGluYWxzKTogU3RhcnQgYXNzaWduaW5nIG9yZGluYWxzIGF0IDEuCi0KLQkqIE1ha2VmaWxlLmluIChFWFBFQ1QpOiBVc2UgJCRyLCBub3QgJCR7cm9vdG1lfS4KLQkoY2hlY2spOiBTZXQgciwgbm90IHJvb3RtZS4KLQotVHVlIE5vdiAyMSAxODowNDowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEJGRF9ORUVEX0RFQ0xBUkFUSU9OLgotCSogYWNjb25maWcuaDogUHV0IE5FRURfREVDTEFSQVRJT05fRlBSSU5URiBpbiBAVE9QQCBzZWN0aW9uLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjYuCi0KLUZyaSBOb3YgMTcgMTA6MzQ6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IFVzZSBAaG9zdEAgYW5kIEB0YXJnZXRALCBub3QKLQkkKGhvc3RfY2Fub25pY2FsKSBhbmQgJCh0YXJnZXRfY2Fub25pY2FsKS4KLQotVGh1IE5vdiAxNiAwMzozOToyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCVZlcnNpb24gMi42IHJlbGVhc2VkLgotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGUgdG8gMi42LgotCi1XZWQgTm92IDE1IDEyOjE0OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBEZWZpbmUuCi0JKGNoZWNrKTogUGFzcyBDQyBhbmQgQ0ZMQUdTIHRvIHJ1bnRlc3QuCi0KLQkqIG5tLmMgKGRpc3BsYXlfcmVsX2ZpbGUpOiBEb24ndCByZXF1aXJlIGEgRFlOQU1JQyBvYmplY3Qgd2hlbgotCWR1bXBpbmcgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotCi0JKiBvYmpkdW1wLmMgKGNvbXBhcmVfc3ltYm9scyk6IFNvcnQgZ2xvYmFsIHN5bWJvbHMgYmVmb3JlIGxvY2FsCi0Jc3ltYm9scyBiZWZvcmUgZGVidWdnaW5nIHN5bWJvbHMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IERvbid0IGZ1dHogYXJvdW5kIGxvb2tpbmcgZm9yIGEgZ2xvYmFsCi0Jc3ltYm9sIHdpdGggdGhlIHNhbWUgdmFsdWUuCi0KLVR1ZSBOb3YgMTQgMTc6MTk6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmM6IFVzZSBGT1BFTl8qIG1hY3JvcyByYXRoZXIgdGhhbiAiciIgb3IgInciLgotCi0JKiBkbGx0b29sLmMgKGZpbGxfb3JkaW5hbHMpOiBDb3JyZWN0IG1lbXNldCBjYWxsLgotCi1TdW4gTm92IDEyIDEyOjU2OjA1IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkIChERU1BTkdMRVJfUFJPRyk6IEVkaXQgb3V0IGF0dGVtcHRzIHRvIGRvIGFueXRoaW5nCi0gCXdpdGggdGhlIG1hbiBwYWdlLgotCi1GcmkgTm92IDEwIDExOjQxOjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChzZXR1cF9zZWN0aW9uKTogQ29weSB0aGUgc2VjdGlvbiBsbWEgaW5kZXBlbmRlbnRseSBvZgotCXRoZSB2bWEuCi0KLVdlZCBOb3YgIDggMTE6MzM6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcnN1cC5jIChhcl9vcGVuKTogQ2FzdCBtYWxsb2MgcmV0dXJuIHZhbHVlLgotCi1UdWUgTm92ICA3IDA5OjAxOjI2IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZSAoRExMVE9PTF9ERUZTKTogQWRkZWQgcHBjIHRhcmdldC4KLQkqIGRsbHRvb2wuYyAoTVBQQyk6IEFkZGVkIGJhc2ljIFBQQyBkZWZpbml0aW9ucy4KLQotVHVlIE5vdiAgNyAxNDowMjo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdHJlYXQgcnM2MDAwLSotbHlueCogc3BlY2lhbGx5LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3JzbHlueDogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBAdGFyZ2V0X21ha2VmaWxlX2ZyYWdtZW50QC4KLQotTW9uIE5vdiAgNiAxNTowMDo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJ1Y29tbS5oOiBJbmNsdWRlIDxzeXMvdHlwZXMuaD4uCi0JKiBhci5jOiBEb24ndCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gb3IgPHN0ZGlvLmg+LgotCSogYnVjb21tLmMsIGRsbHRvb2wuYywgbmxtY29udi5jLCBvYmpjb3B5LmMsIG9iamR1bXAuYzogTGlrZXdpc2UuCi0KLUZyaSBOb3YgIDMgMTI6Mzg6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmM6IEluY2x1ZGUgPHN5cy90eXBlcy5oPi4KLQotCVBlcm1pdCB1c2VyIHRvIG92ZXJyaWRlIERFTUFOR0xFUl9QUk9HIGZyb20gY29tbWFuZCBsaW5lLiAgRnJvbQotCU1hbmZyZWQgSG9sbHN0ZWluIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4uCi0JKiBNYWtlZmlsZS5pbiAoJChERU1BTkdMRVJfUFJPRykpOiBEZXBlbmQgdXBvbgotCSQoREVNQU5HTEVSX1BST0cpLjEuCi0JKGluc3RhbGwpOiBEb24ndCBkZXBlbmQgdXBvbiAkKERFTUFOR0xFUl9QUk9HKS4xLiAgT25seSBpbnN0YWxsCi0JJChERU1BTkdMRVJfUFJPRykuMSBpZiAkKERFTUFOR0xFUl9QUk9HKSBpcyBub3QgZW1wdHkuCi0KLVdlZCBOb3YgIDEgMTU6MDQ6NTcgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChzeXNsZXgubyk6IGFkZCAtSSQoc3JjZGlyKSBpZiBjb21waWxpbmcgaW4gYQotCXNlcGFyYXRlIGRpcmVjdG9yeS4KLQotTW9uIE9jdCAzMCAxNDoyNDoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF92YWx1ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IFVzZSBpdC4gIElmIHdlIG5lZWQgdGhlIHJpZ2h0IHNlY3Rpb24gZm9yCi0JdGhlIHN5bWJvbCwgYW5kIHdlIGNhbid0IGZpbmQgaXQsIHByaW50IGFuIG9mZnNldCBmcm9tIHRoZSBzZWN0aW9uCi0JcmF0aGVyIHRoYW4gdXNpbmcgYSBzeW1ib2wgZnJvbSBzb21lIG90aGVyIHNlY3Rpb24uCi0KLVRodSBPY3QgMjYgMTA6MjM6MTQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChub19pZGF0YTQsIG5vX2lkYXRhNSk6IE5ldy4KLQkoYXJtX2p0YWIpOiBVc2UgY29ycmVjdCBlbmNvZGluZyBvZiBqdW1wIGluc3RydWN0aW9uLgotCSh1c2FnZSwgbWFpbiwgbWFrZV9oZWFkLCBtYWtlX3RhaWwpOiBBY3Qgb24gbm9faWRhdGE0LCBub19pZGF0YTUuCi0KLVdlZCBPY3QgMjUgMTI6MTA6MDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEVkaXQgcGF0aHMgdG8gZ2VuZXJhdGVkIHkudGFiLltjaF0gZmlsZXMuCi0KLUZyaSBPY3QgMjAgMTg6NDA6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy50ZXhpOiBDaGFuZ2UgLS13aXRoLXRhcmdldHMgdG8gLS1lbmFibGUtdGFyZ2V0cy4KLQotVGh1IE9jdCAxOSAxNzo0Nzo0MSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgZXh0cmFuZW91cyB0YWIgb24gb3RoZXJ3aXNlIGVtcHR5IGxpbmUsCi0Jd2hpY2ggY29uZnVzZXMgbWFueSBub24tR05VIHZlcnNpb25zIG9mICJtYWtlIi4KLQotV2VkIE9jdCAxOCAxNjozMTo1OCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGkzODZfanRhYiwgYXJtX2p0YWIpOiBOZXcKLQkoZ2VuX2xpYl9maWxlKTogUmV3cml0dGVuIHRvIHVzZSBiZmQuCi0KLUZyaSBPY3QgMTMgMTY6MTA6MDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGdpdmUgZXJyb3IgbWVzc2FnZSBpZiBkbGx0b29sCi0Jd2Fzbid0IGJ1aWx0LgotCi1GcmkgT2N0IDEzIDExOjA0OjM3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRlZmxleC5sOiBBbGxvdyBxdW90aW5nIG9mIElEcy4KLQkqIGRlZnBhcnNlLnkgKCV1bmlvbik6IHN0cmluZyBkZWxldGVkLgotCShjb21tYW5kKTogREVTQ1JJUFRJT04gdGFrZXMgSUQuCi0JKiBkbGx0b29sLmMgKGdlbl9kZWZfZmlsZSk6IFF1b3RlIG91dGdvaW5nIG5hbWUgaWYKLQluZWNlc3NhcnkuICBQcmVzZXJ2ZSBOT05BTUUuCi0JKGdlbl9saWJfZmlsZSk6IFJ1biByYW5saWIuCi0JKHdvcmtvdXRfcHJlZml4KTogRGVsZXRlZC4KLQkobWFpbiwgdXNhZ2UsIGxvbmdfb3B0aW9ucyk6IEFkZCAtLWFzLCAtLXJhbmxpYiwgLS1hciBvcHRpb25zLgotCi1XZWQgT2N0IDExIDEzOjM2OjEzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobXRhYmxlKTogSE9XX0FMSUdOX0xPTkcsIG5ldy4KLQkoZF9vcmQpOiBEZWxldGVkLgotCShkX2xvd19vcmQsIGRfaGlnaF9vcmQsIGRfbmFtZWRfZnVuY3MpOiBOZXcuCi0JKGdlbl9leHBfZmlsZSk6IENyZWF0ZSBub25hbWUgZW50cmllcyBjb3JyZWN0bHkuCi0JKGdlbl9saWJfZmlsZSk6IER1bXAgZXhwb3J0cyBhbHBoYWJldGljYWxseS4KLQkocHJvY2Vzc19kdXBsaWNhdGVzKTogIENvdW50IG5vbmFtZWQgZnVuY3Rpb25zLgotCShmaWxsX29yZGluYWxzKTogS2VlcCB0cmFjayBvZiBoaWdoZXN0IG9yZCB0b28uCi0JKG1hbmdsZV9kZWZzKTogQ3JlYXRlIGFscGhhYmV0aWNhbGx5IG9yZGVyZWQgbGlzdCBvZiBuYW1lcy4KLQotVHVlIE9jdCAxMCAwOTozOTowOSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVE9PTF9QUk9HUyk6IEluY2x1ZGUgRExMVE9PTF9QUk9HLgotCi1Nb24gT2N0ICA5IDEzOjA2OjMxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoYWRkX3VuZGVyc2NvcmUpOiBOZXcuCi0JKHhsYXRlKTogVXNlIG5ldyBuYW1lLgotCShtYWluLCB1c2FnZSk6IFVwZGF0ZS4KLQotRnJpIE9jdCAgNiAxNDowODo1MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogc3lzaW5mby55OiBFbGltaW5hdGUgdW51c2VkIHRlcm1pbmFscyAiWyIgYW5kICJdIiBhbmQgdW51c2VkCi0Jbm9udGVybWluYWwgIm5hbWUiLiAgT25lIHMvciBjb25mbGljdCByZW1haW5zLgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbm0uYyAocHJpbnRfc3ltbmFtZSk6IERvbid0IHRyeSB0byBkZW1hbmdsZSBhbiBlbXB0eQotCW5hbWUuCi0JKiBvYmpkdW1wLmMgKHNsdXJwX3N5bXRhYik6IFJlc2V0IHN5bWNvdW50IGlmIHRoZXJlIGFyZQotCW5vIHN5bWJvbHMuCi0JKHNsdXJwX2R5bmFtaWNfc3ltdGFiKTogTGlrZXdpc2UsIGZvciBkeW5zeW1jb3VudC4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IEZpeCBtZW1vcnkgbGVhazogZnJlZSBzb3J0ZWRfc3ltcyB3aGVuIGRvbmUuCi0JKGRpc3BsYXlfYmZkKTogTGlrZXdpc2UsIGZvciBzeW1zIGFuZCBkeW5zeW1zLgotCShkdW1wX3JlbG9jcyk6IERvbid0IHByaW50IGhlYWRlciBiZWZvcmUgcG9zc2libHkgZ2VuZXJhdGluZyBhbgotCWVycm9yIG1lc3NhZ2UuCi0JKGR1bXBfZHluYW1pY19yZWxvY3MpOiBMaWtld2lzZS4KLQotCSogYXIuMSwgbm0uMSwgb2JqZHVtcC4xLCBzaXplLjEsIHN0cmluZ3MuMSwgc3RyaXAuMTogRml4IHR5cG9zIGFuZAotCWZvcm1hdHRpbmcgYnVncy4KLQotRnJpIE9jdCAgNiAxMjowMDoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKGRvX3F1aWNrX2FwcGVuZCk6IENvbW1lbnQgb3V0LgotCShyZXBsYWNlX21lbWJlcnMpOiBBZGQgcXVpY2sgYXJndW1lbnQuCi0JKG1haW4pOiBEb24ndCBjYWxsIGRvX3F1aWNrX2FwcGVuZC4KLQkob3Blbl9pbmFyY2gpOiBEb24ndCBjYWxsIHF1aWNrX2FwcGVuZCB0byBjcmVhdGUgYW4gZW1wdHkgYXJjaGl2ZS4KLQlJbnN0ZWFkIGNhbGwgYmZkX29wZW53L2JmZF9zZXRfZm9ybWF0L2JmZF9jbG9zZS4KLQotVGh1IE9jdCAgNSAyMDo1MzowOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmM6IEFsd2F5cyBpbmNsdWRlIHRpbWUuaC4KLQotVGh1IE9jdCAgNSAxNzoyNToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoY29tcGFyZV9zeW1ib2xzKTogU29ydCBnbnVfY29tcGlsZWQgYW5kIGdjYzJfY29tcGlsZWQKLQlzeW1ib2xzIGFmdGVyIG90aGVyIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZS4gIExpa2V3aXNlIGZvcgotCXN5bWJvbHMgd2hpY2ggbG9vayBsaWtlIGZpbGUgbmFtZXMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IEFsd2F5cyBjaG9zZSB0aGUgZmlyc3QgcmVhc29uYWJsZSBzeW1ib2wKLQl3aXRoIGEgZ2l2ZW4gdmFsdWUuCi0KLVR1ZSBPY3QgIDMgMjI6Mzg6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcnN1cC5jIChhcl9zYXZlKTogVXNlIHJlbmFtZSwgbm90IHVubGluay9saW5rL3VubGluay4KLQotTW9uIE9jdCAgMiAxMjoxMDoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cmluZ3MuYyAobWFpbik6IEV4aXQgd2l0aCB6ZXJvIHN0YXR1cyBpZiBubyBmaWxlcyBhcmUgZ2l2ZW4KLQlhbmQgc3RhbmRhcmQgaW5wdXQgaXMgcmVhZC4KLQotVGh1IFNlcCAyOCAyMDowMzowNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IENhbGN1bGF0ZSB1bmRlcnNjb3JlIGFuZCBwdXQgaW50byBtYWtlZmlsZQotCWZyYWdtZW50LCBnZW5lcmF0ZSBjb25maWcuaC4KLQkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIHNlZCBjb21tYW5kcyB0byBlZGl0IFVuaXggbWFrZWZpbGUKLQlpbnRvIE1QVyBzeW50YXguCi0JKiBtcHctbWFrZS5pbjogUmVtb3ZlLgotCSogbWFjLWJpbnV0aWxzLnI6IE5ldyBmaWxlLCBNYWMgcmVzb3VyY2VzLgotCi1UaHUgU2VwIDI4IDE1OjQ5OjAwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYzogKGdlbl9leHBfZmlsZSk6IEFsd2F5cyBlbWl0IGEgLnJlbG9jIHNlY3Rpb24gaWYKLQlyZWxvY2F0YWJsZS4KLQkoaW1wX25hbWVfbGFiKTogTmV3LgotCShnZW5fZGVmX2ZpbGUpOiBOZXcuCi0JKGdlbl9saWJfZmlsZSk6IFVzZSBpbXBfbmFtZV9sYWIuCi0JKG1haW4pOiBJbml0aWFsaXplIGltcF9uYW1lX2xhYi4KLQotTW9uIFNlcCAyNSAxMjowNTozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19IRUFERVJfU1lTX1dBSVQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBkbGx0b29sLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIiBhbmQgImJ1Y29tbS5oIi4gIERvbid0IGluY2x1ZGUKLQk8c3RkaW8uaD4sIDxzdGRsaWIuaD4sIG9yIDxzdHJpbmcuaD4uICBEb24ndCBpbmNsdWRlIDx3YWl0Lmg+LgotCUluY2x1ZGUgPHN5cy90eXBlcy5oPi4gIFVzZSBIQVZFX1NZU19XQUlUX0ggdG8gY29udHJvbCB3aGV0aGVyIHRvCi0JaW5jbHVkZSA8c3lzL3dhaXQuaD4gb3IgZGVmaW5lIHRoZSB3YWl0IG1hY3JvcyBieSBoYW5kLiAgRG9uJ3QKLQlkZWNsYXJlIHhtYWxsb2MuCi0JKGdlbl9saWJfZmlsZSk6IERvbid0IGFzc3VtZSB0aGF0IHNwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mCi0JY2hhcmFjdGVyczsgdXNlIHN0cmxlbiBpbnN0ZWFkLgotCi1GcmkgU2VwIDIyIDE3OjE2OjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgdXNlIHRoZSBvbGQgQkZEIGJhc2VkCi0JZGlzYXNzZW1ibGVyIGludGVyZmFjZS4gIE1ha2UgaW5mbyBhIGNvbnN0IHBvaW50ZXIuCi0KLVdlZCBTZXAgMTMgMTg6MzM6NDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHN0YXJ0X2FkZHJlc3MpOiBOZXcgdmFyaWFibGUuCi0JKHN0b3BfYWRkcmVzcyk6IE5ldyB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC0tc3RhcnQtYWRkcmVzcyBhbmQgLS1zdG9wLWFkZHJlc3MuCi0JKE9QVElPTl9TVEFSVF9BRERSRVNTLCBPUFRJT05fU1RPUF9BRERSRVNTKTogRGVmaW5lLgotCShsb25nX29wdGlvbnMpOiBBZGQgInN0YXJ0LWFkZHJlc3MiIGFuZCAic3RvcC1hZGRyZXNzIi4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IEhhbmRsZSBzdGFydF9hZGRyZXNzIGFuZCBzdG9wX2FkZHJlc3MuCi0JKGR1bXBfZGF0YSwgZHVtcF9yZWxvY19zZXQpOiBMaWtld2lzZS4KLQkobWFpbik6IERvbid0IHNldCBzZWVuZmxhZyBmb3IgLWwuICBIYW5kbGUgT1BUSU9OX1NUQVJUX0FERFJFU1MKLQlhbmQgT1BUSU9OX1NUT1BfQUREUkVTUy4KLQkqIG9iamNvcHkuYyAocGFyc2Vfdm1hKTogTW92ZSB0byBidWNvbW0uYy4KLQkqIGJ1Y29tbS5jIChwYXJzZV92bWEpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGluIGZyb20gb2JqY29weS5jLgotCSogYnVjb21tLmggKHBhcnNlX3ZtYSk6IERlY2xhcmUuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IG5ldyBvYmpkdW1wIG9wdGlvbnMuCi0KLVR1ZSBTZXAgMTIgMTI6Mzc6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQuCi0KLQkqIGFyLmMgKHJlcGxhY2VfbWVtYmVycyk6IERvbid0IGNhbGwgd3JpdGVfYXJjaGl2ZSBpZiBub3RoaW5nCi0JY2hhbmdlZC4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogQWRkIGNhc3RzIHRvIGF2b2lkIGdjYyB3YXJuaW5ncy4KLQotVGh1IFNlcCAgNyAxMjoxMjoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5pbjogUmVuYW1lIGZyb20gY29uZmlnLmguaW4uCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUiB3aXRoIGNvbmZpZy5oOmNvbmZpZy5pbi4KLQlDaGVjayBmb3IgY29uZmlnLmg6Y29uZmlnLmluIHdoZW4gY3JlYXRpbmcgc3RhbXAtaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1oKTogRGVwZW5kIHVwb24gY29uZmlnLmluIHJhdGhlciB0aGFuCi0JY29uZmlnLmguaW4uICBTZXQgQ09ORklHX0hFQURFUlMgdG8gY29uZmlnLmg6Y29uZmlnLmluIHdoZW4KLQljYWxsaW5nIGNvbmZpZy5zdGF0dXMuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmgsIHN0YW1wLWgsIGFuZAotICAgICAgICBjb25maWcubG9nLgotCi0JKiBubS5jICh2YWx1ZV9mb3JtYXQpOiBJbml0aWFsaXplIGJhc2VkIG9uIEJGRDY0IGFuZAotCUJGRF9IT1NUXzY0QklUX0xPTkcuCi0JKHByaW50X3JhZGl4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc2V0X3ByaW50X3JhZGl4KTogU2V0IHByaW50X3JhZGl4LiAgQWRqdXN0IGNoYW5nZXMgdG8KLQl2YWx1ZV9mb3JtYXQuCi0JKHByaW50X3ZhbHVlKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgdG8gcHJpbnQgNjQgYml0IG9jdGFsIGFuZAotCWRlY2ltYWwgdmFsdWVzIGNvcnJlY3RseS4KLQkocHJpbnRfc3ltYm9sX2luZm9fYnNkKTogQ2hlY2sgQkZENjQsIG5vdCBCRkRfSE9TVF82NF9CSVQuICBVc2UKLQlwcmludF92YWx1ZS4KLQkocHJpbnRfc3ltYm9sX2luZm9fc3lzdik6IFVzZSBwcmludF92YWx1ZS4KLQkocHJpbnRfc3ltYm9sX2luZm9fcG9zaXgpOiBMaWtld2lzZS4KLQotV2VkIFNlcCAgNiAxNTowMjo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgqLm8pOiBSZW1vdmUgaW5jb3JyZWN0IGRlcGVuZGVuY2llcyBvbgotCSQoQkZERElSKS9ob3N0cy9zdGQtaG9zdC5oLgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9EQVRBKTogQWRkIC1tIDY0NC4KLQkoSU5TVEFMTF9YRk9STTEpOiBMaWtld2lzZS4KLQkoQ0NfRk9SX0JVSUxEKTogU2V0IHRvIEBDQ19GT1JfQlVJTERAIHJhdGhlciB0aGFuICQoQ0MpLgotCShtb3N0bHljbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgotCShkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmNhY2hlLgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQkZEX0NDX0ZPUl9CVUlMRCBhbmQgQkZEX0JJTkFSWV9GT1BFTi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIFNlcCAgNSAyMDoyMjo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmV3cml0ZSB0byB1c2UgYXV0b2NvbmYuCi0JKiBhY2xvY2FsLm00OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9jb25mLgotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWcuaC5pbjogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9oZWFkZXIuCi0JKiBNYWtlZmlsZS5pbjogVmFyaW91cyBjaGFuZ2VzIGZvciBuZXcgY29uZmlndXJlIHNjcmlwdC4gIEFsc286Ci0JKFBST0dTKTogUmVtb3ZlICQoU1lTSU5GT19QUk9HKS4KLQkoQUxMX0NGTEFHUyk6IFJlbW92ZSAkKFRERUZJTkVTKS4KLQkodmVyc2lvbi5vKTogVXNlICQoQUxMX0NGTEFHUykuCi0JKGNwbHVzLWRlbS5vLCBkbGx0b29sLm8sIG5sbWNvbnYubyk6IExpa2V3aXNlLgotCShzeXNkdW1wLm8pOiBEZXBlbmQgdXBvbiBidWNvbW0uaCBhbmQgY29uZmlnLmguCi0JKHNyY29udi5vLCBhcnN1cC5vLCBzdHJpbmdzLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KLQkoZmlsZW1vZGUubyk6IERvbid0IGRlcGVuZCB1cG9uIC4uL2JmZC9zeXNkZXAuaC4KLQkoYnVjb21tLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaCwgbm90IC4uL2JmZC9zeXNkZXAuaC4KLQkoc2l6ZS5vLCBvYmpkdW1wLm8sIG5tLm8sIGFyLm8sIG9iamNvcHkubyk6IExpa2V3aXNlLgotCShubG1oZWFkZXIubywgbmxtY29udi5vKTogTGlrZXdpc2UuCi0JKGRpc3RjbGVhbik6IERvbid0IHJlbW92ZSBzeXNkZXAuaC4KLQkqIGJ1Y29tbS5oOiBJbmNsdWRlICJhbnNpZGVjbC5oIiwgPHN0ZGlvLmg+LCBhbmQgImNvbmZpZy5oIi4KLSAgCUluY2x1ZGUgImZvcGVuLXNhbWUuaCIgb3IgImZvcGVuLWJpbi5oIiwgYmFzZWQgb24KLSAJVVNFX0JJTkFSWV9GT1BFTi4gIEluY2x1ZGUgPGVycm5vLmg+LCBhbmQgZGVjbGFyZSBlcnJubyBpZiBpdCBpcwotIAlub3QgYSBtYWNyby4gIEluY2x1ZGUgPHVuaXN0ZC5oPiwgPHN0cmluZy5oPiwgPHN0cmluZ3MuaD4sCi0gCTxzdGRsaWIuaD4sIGFuZCA8ZmNudGwuaD4gaWYgdGhleSBhcmUgcHJlc2VudC4gIERlY2xhcmUgc3RyY2hyLAotIAlzdHJyY2hyLCBhbmQgc3Ryc3RyIGlmIG5vIHN0cmluZyBoZWFkZXIgZmlsZSBleGlzdHMuICBJbmNsdWRlCi0JPHN5cy9maWxlLmg+IGlmIGl0IGV4aXN0cyBhbmQgPGZjbnRsLmg+IGRvZXMgbm90LiAgRGVmaW5lCi0JT19SRE9OTFkgYW5kIE9fUkRXUiBpZiBuZWNlc3NhcnkuCi0JKiBhci5jOiAgRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLiAgRG8gaW5jbHVkZSA8c3lzL3R5cGVzLmg+IGFuZAotCTxzeXMvc3RhdC5oPi4gIFVzZSBIQVZFX0dPT0RfVVRJTUVfSCByYXRoZXIgdGhhbiBQT1NJWF9VVElNRS4gIFVzZQotCUhBVkVfVVRJTUVTIHJhdGhlciB0aGFuICFVU0VfVVRJTUUuICBEb24ndCBpbmNsdWRlIDxlcnJuby5oPiwgYW5kCi0JZG9uJ3QgZGVjbGFyZSBlcnJuby4KLQkqIGFyc3VwLmM6IERvbid0IGluY2x1ZGUgPHN5c2RlcC5oPi4KLQkqIGJ1Y29tbS5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBJbmNsdWRlIDxzdGRpby5oPiwKLQk8c3lzL3R5cGVzLmg+LCBhbmQgPHN5cy9zdGF0Lmg+LiAgSW5jbHVkZSA8dGltZS5oPiBpZiBpdCBkZWZpbmVzCi0JdGltZV90LiAgRGVmaW5lIHRpbWVfdCBpZiBuZWNlc3NhcnkuCi0JKiBjb2ZmZHVtcC5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuCi0JKiBjb2ZmZ3Jvay5jLCBmaWxlbW9kZS5jLCBubG1jb252LmMsIHNpemUuYzogTGlrZXdpc2UuCi0JKiBzcmNvbnYuYywgc3RyaW5ncy5jOiBMaWtld2lzZS4KLQkqIG5tLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4gIERvbid0IHRyeSB0byBkZWZpbmUgSEFWRV9TQlJLLgotCSogb2JqY29weS5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBJbmNsdWRlIDxzeXMvdHlwZXMuaD4gYW5kCi0JPHN5cy9zdGF0Lmg+LgotCShzaW1wbGVfY29weSk6IFVzZSBjcmVhdCByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGF0IE9fQ1JFQVQgaXMKLQlkZWZpbmVkLgotCSogb2JqZHVtcC5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBVc2UKLQlORUVEX0RFQ0xBUkFUSU9OX1BSSU5URiByYXRoZXIgdGhhbiAhRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVELgotCSogc3lzZHVtcC5jOiBJbmNsdWRlICJiZmQuaCIgYW5kICJidWNvbW0uaCIuICBEb24ndCBpbmNsdWRlCi0JInN5c2RlcC5oIiBvciA8c3RkbGliLmg+LgotCShkdW1wX3N5bWJvbF9pbmZvKTogUmVuYW1lIGZyb20gc3ltYm9sX2luZm8uICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0KLU1vbiBTZXAgIDQgMTQ6MzA6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfbWFrZWZpbGVfZnJhZyk6IERvbid0IHNldC4gIFN1YnN0aXR1dGUgZm9yCi0JQENDQCwgQENGTEFHU0AsIEBIREVGSU5FU0AgYW5kIEBMREZMQUdTQCBpbiBNYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6IFNldCB0byByYyByYXRoZXIgdGhhbiBxdi4KLQkoQ0MpOiBEZWZpbmUgYXMgQENDQC4KLQkoQ0ZMQUdTKTogU2V0IHRvIEBDRkxBR1NALgotCShMREZMQUdTKTogRGVmaW5lIGFzIEBMREZMQUdTQC4KLQkoQUxMX0NGTEFHUyk6IFVzZSBASERFRklORVNAIHJhdGhlciB0aGFuICQoSERFRklORVMpLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJvdGhlciB0byBjYWxsIGNvbmZpZy5iZmQgZm9yIGVhY2ggdGFyZ2V0LgotCUp1c3QgY2FsbCBpdCBmb3IgdGhlIGRlZmF1bHQgdGFyZ2V0LCBhbmQgdXNlIHRoZSBzaGVsbCB2YXJpYWJsZSB0bwotCWRlY2lkZSB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZSB1c2VkLgotCi1UaHUgQXVnIDMxIDE5OjIxOjQ4IDE5OTUgIEphc29uIE1vbGVuZGEgICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogbWF0Y2ggaVszLTZdODYtKi13aW4zMiwgbm90IGp1c3QgaTM4Ni0qLXdpbjMyLgotCi1UaHUgQXVnIDMxIDE2OjMwOjIyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoYWRkX2luZGlyZWN0KTogTmV3LgotCShhc21fcHJlZml4KTogTmV3Ci0JKGdlbl9leHBfZmlsZSk6IFRpbWVzdGFtcCBzaG91bGQgYmUgMC4gSW5zZXJ0IHByZWZpeCB3aGVuCi0JbmVlZGVkLiBOZXcgY29kZSBmb3IgaW5kaXJlY3Rpb24uCi0JKGdlbl9saWJfZmlsZSk6IFRpbWVzdGFtcCBzaG91bGQgYmUgMC4gSW5zZXJ0IHByZWZpeAotCXdoZW4gbmVlZGVkLgotCSh1c2FnZSk6IERvY3VtZW50IC0tYWRkLWluZGlyZWN0LgotCShtYWluKTogQ29wZSB3aXRoIG5ldyBvcHRpb24uCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9wcml2YXRlX2hlYWRlcnMpOiBOZXcuCi0JKHVzYWdlKTogRG9jdW1lbnQgbmV3IG9wdGlvbi4KLQkobG9uZ19vcHRpb24pOiBBZGQgcHJpdmF0ZS1oZWFkZXJzLgotCShkdW1wX2JmZF9wcml2YXRlX2hlYWRlcik6IE5ldy4KLQkobWFpbik6IENvcGUgd2l0aCBuZXcgb3B0aW9uLgotCi1UaHUgQXVnIDMxIDA0OjA5OjE2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAocnVuKTogQWRkIG1pc3NpbmcgM3JkIGFyZyB0byB3YWl0cGlkLgotCi1XZWQgQXVnIDMwIDExOjAyOjExIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChUT09MX1BST0dTKTogSW5jbHVkZSBkbGx0b29sIGlmIG5lZWRlZC4KLQotVHVlIEF1ZyAyOSAxMzoyNToyMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHJ2YSk6IERlbGV0ZWQuCi0JKHJ2YWFmdGVyLCBydmFfYmVmb3JlKTogVXNlIG5ldyBhc3NlbWJsZXIgcHNldWRvLgotCShmbHVzaF9wYWdlLCBnZW5fZXhwX2ZpbGUsIGdlbl9saWJfZmlsZSk6IFVzZSBuZXcgd2F5IG9mIFJWQWluZy4KLQkoZ2VuX2V4cF9maWxlKTogRG9uJ3QgZ2VuZXJhdGUgLmVkYXRhIGlmIG5vIG5lZWQuCi0JKGdlbl9saWJfZmlsZSk6IERvbid0IG1ha2UgdGltZXN0YW1wLgotCVB1dCBfaW5hbWUgaW4gaWRhdGEkNy4KLQkod29ya291dF9wcmVmaXgpOiBGaXggbWVtb3J5IGluaXRpYWxpemF0aW9uIGJ1Zy4KLQkodXNhZ2UpOiBUaWR5IHVwLCBkZWxldGUgbWFueSBzaW5nbGUgY2hhciBvcHRpb25zLgotCShtYWluKTogcnZhIG9wdGlvbiBpcyBnb25lLgotCi1Nb24gQXVnIDIxIDE4OjQxOjI4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAob3B0aW9ucyk6IGltYWdlLWJhc2UgaXMgYSBzeW5vbnltIGZvciBydmEuCi0JKGdlbl9saWJfZmlsZSk6IFB1dCBkbGwgbmFtZSBpbnRvIGliYXNlJDcuCi0KLVN1biBBdWcgMjAgMDk6NTk6MDAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCU1vZGlmaWVkIHRvIGdlbmVyYXRlIGFyY2hpdmVzIGFuZCBvYmplY3RzIHJhdGhlciB0aGFuIC5zIGZpbGVzLgotCSogZGxsdG9vbC5jIChydW4pIE5ldyBmdW5jdGlvbi4KLSAJKGdlbl9leHBfZmlsZSwgZ2VuX2xpYl9maWxlKTogVXNlIHJ1bi4KLQkod29ya291dF9wcmVmaXgpOiBOZXcuCi0JKHVzYWdlKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0JKG1haW4pOiBQYXJzZSBuZXcgb3B0aW9ucy4KLQotV2VkIEF1ZyAxNiAxNjoyNjo1MiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGdlbl9leHBfZmlsZSk6IEZpeCBSVkEgaGFuZGxpbmcuCi0JKHJ2YV9zLCBydmFfbik6IERlbGV0ZS4KLQotRnJpIEF1ZyAxMSAxODoyNzoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKG1haW4pOiBJZ25vcmUgLWUuCi0KLVRodSBBdWcgMTAgMTc6MzU6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjb25maWcudGV4aSk6IE5ldyB0YXJnZXQuICBXcml0ZSBvdXQgYSBzZXR0aW5nIGZvcgotCXRleGluZm8gdmFyaWFibGUgVkVSU0lPTi4KLQkoYmludXRpbHMuZHZpLCBiaW51dGlscy5pbmZvKTogRGVwZW5kIG9uIGl0LgotCSogYmludXRpbHMudGV4aTogSW5jbHVkZSBpdCwgYW5kIHJlZmVyZW5jZSBAdmFsdWV7VkVSU0lPTn0gaW5zdGVhZAotCW9mIGV4cGxpY2l0bHkgc3BlY2lmeWluZyAyLjIoISkuCi0KLVRodSBBdWcgMTAgMTY6MDc6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ3Jvay5jIChkb190eXBlKTogSGFuZGxlIGFycmF5IGRpbWVuc2lvbnMgdGhlIHNhbWUgd2F5IGdkYgotCWRvZXMuCi0KLVR1ZSBBdWcgIDggMTc6MTA6NDIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtdGFibGUpOiBOZXcgZmllbGRzLgotCShBU01fUlZBX0JFRk9SRSwgQVNNX1JWQV9BRlRFUik6IE5ldy4KLQkoZmx1c2hfcGFnZSk6IFVzZSBuZXcgbWFjcm9zLgotCi1TYXQgQXVnICA1IDAwOjE2OjM3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBvYmpjb3B5LmMgKG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zKTogSGFuZGxlIHNlY3Rpb25zCi0Jd2l0aCBubyByZWxvY2F0aW9ucy4KLQkqIGNvZmZncm9rLmMgKGRvX3NlY3Rpb25zX3AxKTogTGlrZXdpc2UuCi0KLU1vbiBKdWwgMzEgMTI6NTE6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdHJpbmdzLmMgKHByaW50X3N0cmluZ3MpOiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nCi0Jc3RyaW5ncyBwcm9ncmFtcywgcHJpbnQgc3RyaW5ncyB3aGljaCBhcmUgbm90IHRlcm1pbmF0ZWQgd2l0aCBhCi0JbnVsbCBieXRlIG9yIGEgbmV3bGluZS4KLQkqIGJpbnV0aWxzLnRleGksIHN0cmluZ3MuMTogVXBkYXRlIGRvY3VtZW50YXRpb24gYWNjb3JkaW5nbHkuCi0KLQkqIGFyLmMgKHJlcGxhY2VfbWVtYmVycyk6IEZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgYXIKLQlwcm9ncmFtcywgcGVybWl0IHVzZXJzIHRvIGFkZCB0aGUgc2FtZSBmaWxlIG11bHRpcGxlIHRpbWVzLgotCi1UdWUgSnVsIDI1IDExOjIxOjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RyaW5ncy5jIChEQVRBX0ZMQUdTKTogUmVtb3ZlIFNFQ19EQVRBLgotCShtYWluKTogSWYgbm8gZmlsZSBuYW1lcyBhcmUgZ2l2ZW4sIHNjYW4gc3RhbmRhcmQgaW5wdXQuCi0JKiBiaW51dGlscy50ZXhpLCBzdHJpbmdzLjE6IHN0cmluZ3Mgbm93IHNjYW5zIG5vbi1kYXRhIHNlY3Rpb25zIGJ5Ci0JZGVmYXVsdC4KLQotTW9uIEp1bCAyNCAxMzo1MjoyOCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jICh3cl9oZCk6IFNldCBhZmwgZmllbGQgdG8gNCBmb3IgYmZkX2FyY2hfc2guCi0JKHdyaXRlSU5UKTogV2hlbiBzaXplID09IC0yLCB1c2UgMiBieXRlcyBmb3IgdGhlIGg4MzAwIGFuZCA0IGJ5dGVzCi0JZm9yIHRoZQlzaC4KLQotCSogc3lzZHVtcC5jIChmaWxsdXApOiBSZXR1cm4gc2l6ZSAtIDEsIHRoZSBsYXN0IGJ5dGUgaXMgYSBjaGVja3N1bQotCWFuZCBzaG91bGRuJ3QgYmUgY291bnRlZC4KLQkqIHN5c3JvZmYuaW5mbyAoaGQpOiBDaGFuZ2VkIHNlZ21lbnQgaWRlbnRpZmllciBmcm9tIGEgYnl0ZSB0byBhIDEKLQliaXQgZmllbGQuICBUaGUgc3lzcm9mZiAyLjAtMDEgc3BlY2lmaWNhdGlvbiBzZWVtcyB0byBiZSBpbiBlcnJvcgotCWhlcmUuICBSZWR1Y2Ugd2lkdGggb2YgZm9sbG93aW5nICJzcGFyZSIgZmllbGQgZnJvbSA0IHRvIDMgYml0cy4KLQkocmwpOiBDaGFuZ2VkIG9yZGVyIGFuZCB3aWR0aCBvZiBmaXJzdCA0IGJpdGZpZWxkcyB0byBjb3JyZXNwb25kCi0JdG8gc3lzcm9mZiBzcGVjaWZpY2F0aW9uLgotCShkbG5faGVhZCwgZGxuX2luc2lkZSwgZGxuX3RhaWwpOiBSZW1vdmVkLgotCi1UdWUgSnVsIDE4IDIzOjAwOjAzIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBubS5jIChzb3J0X3N5bWJvbHNfYnlfc2l6ZSk6ICBFbmNsb3NlIGV4cHJlc3Npb24gYmVpbmcgY2FzdGVkCi0JaW4gcGFyZW5zIHNvIHJlc3VsdCBpcyBjYXN0ZWQsIG5vdCBqdXN0IGZpcnN0IG9wZXJhbmQuICBDYW4ndAotCWRvIHBvaW50ZXIgYXJpdGhtZXRpYyBvbiB2b2lkKiBwb2ludGVycy4KLQotRnJpIEp1bCAxNCAxMzo0Mjo0MiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHN5c2R1bXAuYyAoZGgpOiBDaGFuZ2VkIGZvcm1hdCBvZiBvdXRwdXQgdG8gYmUgMTYgaGV4IGRpZ2l0cwotCWZvbGxvd2VkIGJ5IDE2IGFzY2lpIGNoYXJhY3RlcnMsIHNpbWlsYXIgdG8gRW1hY3MnIGhleGwtbW9kZSwKLQl0byBtYWtlIGl0IGVhc2llciB0byByZWFkLgotCSh4Y2FsbG9jKTogZml4IHR5cG8uCi0KLVRodSBKdWwgMTMgMTU6Mjc6NDQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzcmNvbnYuYyAod3JfdHIpOiBXcml0ZSBvdXQgaGFuZGNyYWZ0ZWQgdHIgYmxvY2suCi0JKHdhbGtfdHJlZV9zeW1ib2wpOiBVc2UgZXZhbGxlbiBhbmQgZXZhbHVlIGluc3RlYWQgb2YKLQl2YWxsZW4gJiB2YWx1ZSBiZWNhdXNlIG9mIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyBpbgotCXN5c3JvZmYuaW5mby4KLQotCSogc3lzZHVtcC5jIChzeXNyb2ZmX3N3YXBfdHJfaW4sIHN5c3JvZmZfcHJpbnRfdHJfb3V0KTogTmV3Ci0JZnVuY3Rpb25zLgotCi0JKiBzeXNyb2ZmLmluZm8gKHRyKTogdGhlIHRyIGJsb2NrIGlzIGEgc3BlY2lhbCBjYXNlIC0tLSBhIGJsb2NrCi0Jd2l0aG91dCBjb250ZW50cyAtLS0gd2hpY2ggY2FuJ3QgYmUgaGFuZGxlZCBieSBnZW5lcmF0ZWQgY29kZS4KLQkoZGVuLCBkcHApOiBvbmx5IGZpcnN0IGJ5dGUgaXMgcHJlc2VudCBmb3IgREVOZW5kLCBEUFBlbmQuCi0JKGRzeSk6IGRlc2NyaWJlIGEgY29uZGl0aW9uYWwgcG9ydGlvbiBvZiBibG9jaywgcmVuYW1lIHNvbWUgZmllbGRzLgotCShkcHMpOiBkZXNjcmliZSBhIGNvbmRpdGlvbmFsIHBvcnRpb24gb2YgYmxvY2suCi0JKGRmbCk6IHJlbW92ZWQuCi0KLQkqIHN5c2luZm8ueSAoeXllcnJvcik6IHdyaXRlIGVycm9yIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IuCi0KLVRodSBKdWwgMTMgMTA6NDM6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIGFycGFyc2UuaCBhbmQgc3lzaW5mby5oLgotCShtb3N0bHljbGVhbik6IFJlbW92ZSB5Lm91dHB1dC4KLQkoY2xlYW4pOiBSZW1vdmUgc3lzcm9mZiwgc3lzcm9mZi5jLCBzeXNyb2ZmLmgsIGFuZCBzeXNpbmZvLgotCi0JKiBubG1jb252LmMgKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IENhc3QgbWVtc2V0IGFyZyB0byBzaXplX3QuCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogTGlrZXdpc2UuCi0KLQkqIG5tLmMgKEhBVkVfU0JSSyk6IERlZmluZSBleGVjcHQgb24gYW1pZ2Fkb3MgYW5kIFdJTkRPV1NfTlQuCi0JKHN0cnVjdCBzaXplX3N5bSk6IERlZmluZS4KLQkoc2hvd19zdGF0cyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCB1bmRvY3VtZW50ZWQgb3B0aW9uICJzdGF0cyIuCi0JKG1haW4pOiBQcmludCBtZW1vcnkgc3RhdHMgaWYgcmVxdWVzdGVkLgotCShzb3J0X2JmZCwgc29ydF9keW5hbWljLCBzb3J0X3gsIHNvcnRfeSk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShudW1lcmljX2ZvcndhcmQpOiBVc2UgbWluaXN5bWJvbHMgcmF0aGVyIHRoYW4gYXN5bWJvbHMuCi0JKG5vbl9udW1lcmljX2ZvcndhcmQpOiBMaWtld2lzZS4KLQkoc2l6ZV9mb3J3YXJkMSk6IFJlbmFtZSBmcm9tIHNpemVfZm9yd2FyZC4gIFVzZSBtaW5pc3ltYm9scy4KLQkoc2l6ZV9mb3J3YXJkMik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNvcnRfc3ltYm9sc19ieV9zaXplKTogVGFrZSBuZXcgYXJndW1lbnRzIGR5bmFtaWMsIHNpemUsIGFuZAotCXN5bXNpemVwLiAgVXNlIG1pbmlzeW1ib2xzLiAgRG9uJ3Qgc3RvcmUgdGhlIHNpemUgYmFjayBpbiB0aGUKLQlzeW1ib2w7IHN0b3JlIGluIGEgbmV3bHkgYWxsb2NhdGUgc3RydWN0IHNpemVfc3ltIGFycmF5LgotCShkaXNwbGF5X3JlbF9maWxlKTogUmVhZCBtaW5pc3ltYm9scyByYXRoZXIgdGhhbiBhc3ltYm9scy4gIFNldAotCXNvcnRfKiB2YXJpYWJsZXMuICBDYWxsIHByaW50X3NpemVfc3ltYm9scyBpZiBzb3J0aW5nIGJ5IHNpemUuCi0JKGZpbHRlcl9zeW1ib2xzKTogVGFrZSBuZXcgYXJndW1lbnRzIGR5bmFtaWMgYW5kIHNpemUuICBVc2UKLQltaW5pc3ltYm9scy4KLQkocHJpbnRfc3ltYm9scyk6IExpa2V3aXNlLiAgQ2FsbCBwcmludF9zeW1ib2wgZm9yIGFjdHVhbCBwcmludGluZy4KLQkocHJpbnRfc2l6ZV9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHJpbnRfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotV2VkIEp1bCAxMiAxMDo0MzowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX3N0YWJzKTogT25seSBwcmludCBlYWNoIHN0YWJzIHNlY3Rpb24KLQlvbmNlLgotCShjb21wYXJlX3JlbG9jcyk6IE1ha2UgaXQgY2xlYXIgdG8gZ2NjIHRoYXQgdGhpcyBhbHdheXMgcmV0dXJucyBhCi0JdmFsdWUuCi0KLVdlZCBKdWwgMTIgMTA6NDA6MjMgMTk5NSAgSC5KLiBMdSAgPGhqbEBueW5leHN0LmNvbT4KLQotCSogb2JqY29weS5jIChzaW1wbGVfY29weSk6IFByZXNlcnZlIGVycm5vIG9uIGZhaWx1cmUuCi0JKHNtYXJ0X3JlbmFtZSk6IFByaW50IGVycm9yIG1lc2FnZSBpZiBzaW1wbGVfY29weSBmYWlscy4KLQotVHVlIEp1bCAxMSAxMzoxMDo1MiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHN5c2R1bXAuYzogcmUtaW5kZW50ZWQgZmlsZS4KLQkobW9kdWxlKTogcmVhZCBibG9ja3Mgc2VxdWVudGlhbGx5IGluc3RlYWQgb2YgdHJ5aW5nIHRvIHBhcnNlCi0JdGhlbSwgYXMgdGhhdCB3b3VsZCByZXF1aXJlIGNoYW5naW5nIHRoZSBwYXJzZXIgcmVjb2duaXplIHRoZQotCWRpZmZlcmVuY2UgYmV0d2VlbiBhIERQU3N0YXJ0IGFuZCBEUFNlbmQgYmxvY2suCi0JKGdldG9uZSk6IEFkZCBicmVhaydzIGJldHdlZW4gc3dpdGNoIGJsb2NrcyBhcyBhcHByb3ByaWF0ZS4KLQkob2JqZWN0X2JvZHlfbGlzdCk6IHBhcnNlIGJsb2NrcyBhY2NvcmRpbmcgdG8gc3lzcm9mZiBzcGVjLgotCi1Nb24gSnVsIDEwIDEyOjM3OjI1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0Bwb3NlaWRvbi5jeWdudXMuY29tPgotCi0JKiBzeXNyb2ZmLmluZm86IHJlLWluZGVudGVkIGZpbGUsIHByaW9yIGZvcm1hdHRpbmcgd2FzIGNvbmZ1c2luZwotCWJlY2F1c2UgaXQgd2FzIGluZGVudGF0aW9uIGRpZCBub3QgcmVmbGVjdCBuZXN0aW5nIG9mIGNvbmRpdGlvbmFsCi0JcmVjb3Jkcy4gIENoYW5nZSAic3BhY2Ugc2l6ZSB3aXRoaW4gc2VnbWVudCIgcmVjb3JkIGluIGhkIHJlY29yZAotCWZyb20gYml0IHRvIGJ5dGUuCi0KLQkqIHN5c2luZm8ueSAoY29uZF9pdF9maWVsZCk6IFVzZSB4Y2FsbG9jIGluc3RlYWQgb2YgY2FsbG9jLgotCi0JKiBzcmNvbnYuYyAod3JfY3MpOiBSZWZvcm1hdHRlZCBjcyBoZWFkZXIgYXJyYXksIHRhZyBlYWNoIGJ5dGUKLQl3aXRoIGEgY29tbWVudCBkZXNjcmliaW5nIHRoZSBmaWVsZC4KLQkod3JfdW5pdF9pbmZvKTogVXNlIFNFRUtfU0VUIG1hY3JvIGluc3RlYWQgb2YgY29uc3RhbnQgMC4KLQkobWFpbik6IFVzZSBGT1BFTl9XQiBtYWNybyBpbnN0ZWFkIG9mIGxpdGVyYWwgIndiIi4KLQkqIHN5c3JvZmYuaW5mbzogUmVtb3ZlIGZkbCAoZGZsKSBmaWVsZCBmcm9tIGNzIGJsb2NrLiAgQ29tcGFyZQotCXB0ci0+dHlwZSB3aXRoIEVEX1RZUEVfQ09OU1QgaW5zdGVhZCBvZiBjb25zdGFudCAyIGluIGVkIGJsb2NrLgotCi1UdWUgSnVsICA0IDE0OjQ4OjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbm0uYyAoc2l6ZV9mb3J3YXJkKTogQ2hlY2sgeWYgYWdhaW5zdCB5biwgbm90IHhuLgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IFJlY29yZCBhbGwgb3V0cHV0IEJGRCdzLCBhbmQgY2xvc2UKLQl0aGVtIGJlZm9yZSB1bmxpbmtpbmcgdGhlbSBhbmQgcmVtb3ZpbmcgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnksCi0JdG8gYXZvaWQgTkZTIHByb2JsZW1zLgotCi0JKiBhci5jIChyZXBsYWNlX21lbWJlcnMpOiBJbiB2ZXJib3NlIG1lc3NhZ2VzLCB1c2UgJ3InIHdoZW4KLSAgICAgICAgcmVwbGFjaW5nIGEgbWVtYmVyLCBhbmQgJ2EnIHdoZW4gYWRkaW5nIG9uZS4KLQotCSogYXIuYyAoYXJfdHJ1bmNhdGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShub3JtYWxpemUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gY29uc3QgY2hhciAqLiAgQWRkIGFiZmQKLQlhcmd1bWVudC4gIENoYW5nZSBhbGwgY2FsbGVycy4gIElmIGFyX3RydW5jYXRlLCBjaG9wIHRoZSBmaWxlbmFtZQotCXRvIGFiZmQtPmFyX21heF9uYW1lbGVuLgotCShtYWluKTogRm9yIHRoZSAnZicgbW9kaWZpZXIsIHNldCBhcl90cnVuY2F0ZSB0byB0cnVlLiAgRG9uJ3QKLQljaGFuZ2UgcXVpY2tfYXBwZW5kIHRvIHJlcGxhY2UgaWYgYXJfdHJ1bmNhdGUgaXMgdHJ1ZS4KLQkoZG9fcXVpY2tfYXBwZW5kKTogSWYgYXJfdHJ1bmNhdGUsIHNldCBCRkRfVFJBRElUSU9OQUxfRk9STUFULgotCSh3cml0ZV9hcmNoaXZlKTogTGlrZXdpc2UuCi0JKiBiaW51dGlscy50ZXhpLCBhci4xOiBEb2N1bWVudCAnZicgbW9kaWZpZXIuCi0KLQkqIG9iamNvcHkuYyAoZW51bSBzdHJpcF9hY3Rpb24pOiBEZWZpbmUgc3RyaXBfdW5uZWVkZWQuCi0JKE9QVElPTl9TVFJJUF9VTk5FRURFRCk6IERlZmluZS4KLQkoc3RyaXBfb3B0aW9ucyk6IEFkZCAic3RyaXAtdW5uZWVkZWQiLgotCShjb3B5X29wdGlvbnMpOiBMaWtld2lzZS4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1zdHJpcC11bm5lZWRlZC4KLQkoc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KLQkoaXNfc3RyaXBfc2VjdGlvbik6IFN0cmlwIGRlYnVnZ2luZyBzZWN0aW9ucyBpZiBzdHJpcF91bm5lZWRlZC4KLQkoZmlsdGVyX3N5bWJvbHMpOiBJZiBzdHJpcF91bm5lZWRlZCwgb25seSBrZWVwIEJTRl9LRUVQIHN5bWJvbHMuCi0JKGNvcHlfb2JqZWN0KTogSWYgc3RyaXBfYWxsLCBkaXNjYXJkIHN5bWJvbHMgd2l0aG91dCBjaGVja2luZwotCWRpc2NhcmRfbG9jYWxzLgotCShjb3B5X29iamVjdCk6IENhbGwgZmlsdGVyX3N5bWJvbHMgaWYgc3RyaXBfdW5uZWVkZWQuCi0JKHNldHVwX3NlY3Rpb24pOiBTdHJpcCBkZWJ1Z2dpbmcgc2VjdGlvbnMgaWYgc3RyaXBfdW5uZWVkZWQuCi0JKGNvcHlfc2VjdGlvbik6IExpa2V3aXNlLgotCShzdHJpcF9tYWluKTogSGFuZGxlIE9QVElPTl9TVFJJUF9VTk5FRURFRC4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjEsIHN0cmlwLjE6IERvY3VtZW50IC0tc3RyaXAtdW5uZWVkZWQuCi0KLU1vbiBKdWwgIDMgMTQ6MTY6NDcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotd2luMzIpOiBOZXcgY29uZmlndXJhdGlvbi4KLQkqIGRsbHRvb2wuYyAoa2lsbGF0LCB4bGF0ZSwgdXNhZ2UsIGxvbmdfb3B0aW9ucywgbWFpbik6Ci0JVW5kZXJzdGFuZCBhbmQgY29wZSB3aXRoIC1rIG9wdGlvbi4KLQotU2F0IEp1bCAgMSAxMjoyNToxNSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogYXIuYzogKGV4dHJhY3RfZmlsZSk6ICBDaGFuZ2UgIiNpZiBQT1NJWF9VVElNRSIgdG8KLQkiI2lmZGVmIFBPU0lYX1VUSU1FIiB0byBtYXRjaCBvdGhlciB0ZXN0cyBvZiBQT1NJWF9VVElNRQotCWFuZCBhdm9pZCBsb3NzYWdlIHdoZW4gUE9TSVhfVVRJTUUgaXMgbm90IGRlZmluZWQgYXQgYWxsLgotCi1XZWQgSnVuIDI4IDE3OjUxOjI0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGFyLmM6IChwcmludF9jb250ZW50cy5jLCBleHRyYWN0X2ZpbGUsIGRvX3F1aWNrX2FwcGVuZCk6Ci0JTWFsbG9jIGJ1ZmZlcnMgcmF0aGVyIHRoYW4gYWxsb2NhdGUgb24gc3RhY2sgKHNvIGl0IHdvcmtzCi0Jb24gTlQpLgotCSogZGVmbGV4Lmw6IE5hbWVzIGNhbiBoYXZlIGFuIEAgaW4gdGhlbS4KLQkqIGRsbHRvb2wuYzogTG9hZHMgb2Ygc3R1ZmYuIENhbiBub3cgZ2VuZXJhdGUgLmltcCBmaWxlcyB3aGljaAotCXdvcmsgd2l0aCBOVCAuZGxscy4KLQotVGh1IEp1biAyMiAxOToxMDo1MCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLmluIChkZW1hbmdsZS5jLm8pOiBSZW1vdmUuCi0JKGFycGFyc2UuaCk6IERlcGVuZCBvbiBhcnBhcnNlLmMgaW5zdGVhZCBvZiBhcnBhcnNlLnkuCi0KLVdlZCBKdW4gMjEgMTc6MzI6NDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IERvbid0IGluY2x1ZGUgaW5mbyBoZXJlLgotCShkaXN0c3R1ZmYpOiBJbmNsdWRlIGl0IGhlcmUuCi0JKHJlYWxjbGVhbik6IFJlbW92ZSAqLmluZm8uCi0KLQkqIG9iamR1bXAuYyAoY29tcGFyZV9yZWxvY3MpOiBJZiByZWxvY2F0aW9uIGVudHJpZXMgaGF2ZSB0aGUgc2FtZQotCWFkZHJlc3MsIGtlZXAgdGhlbSBpbiBmaWxlIG9yZGVyLgotCi1Nb24gSnVuIDE5IDA5OjA2OjQ5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYzogQ2hhbmdlIG5hbWVzIG9mIGdlbmVyYXRlZCBmaWxlcy4gLioucy0+IC0qLnMKLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25fc3RhYnMpOiAgQ2hlY2sgZm9yIG5hbWVzCi0Jd2hpY2ggYXJlIHN1cGVyc2V0cyBvZiBzZWxlY3RlZCBuYW1lcy4KLQotV2VkIEp1biAxNCAxOTo0Mzo1MiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG10YWJsZSwgQVJNIGp1bXApOiBNdXN0IHJlZGlyZWN0IHZpYSBwYyBvZmZzZXRhYmxlIHB0ci4KLQotV2VkIEp1biAxNCAxMzoyNzoyMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkZWZsZXgubCwgZGVmcGFyc2UueSwgZGxsdG9vbC5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBTdXBwb3J0IGZvciB0aGVtLgotCi1Nb24gSnVuIDEyIDExOjI3OjU0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHN5c2R1bXAuYzogSW5jbHVkZSBzeXNkZXAuaAotCShtYWluKTogT3BlbiBpbnB1dCB3aXRoIEZPUEVOX1JCLgotCi1GcmkgSnVuICA5IDE3OjI2OjExIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jICh3aWRlX291dHB1dCk6IE5ldyBmbGFnIHZhcmlhYmxlLgotCSh1c2FnZSk6IFByaW50IG5ldyAtdywgLS13aWRlIG9wdGlvbnMuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAtLXdpZGUgc3VwcG9ydC4KLQkoZHVtcF9zZWN0aW9uX2hlYWRlcik6IElmIC0td2lkZSwgZG9uJ3QgcHJpbnQgYSBuZXdsaW5lIGJldHdlZW4KLQl0aGUgc2VjdGlvbidzIGZpcnN0IGxpbmUgYW5kIHRoZSBmbGFncy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogVXNlIHVuc2lnbmVkIGNvbXBhcmlzb25zIGZvciB0aGUgYmluYXJ5Ci0Jc2VhcmNoLCBub3Qgc2lnbmVkLgotCShkaXNhc3NlbWJsZV9kYXRhKTogSWYgLS13aWRlLCBkb24ndCBwdXQgYSBcbiBiZXR3ZWVuIHRoZQotCWRpc2Fzc2VtYmx5IG91dHB1dCBhbmQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLQkobWFpbik6IFN1cHBvcnQgLXcgb3B0aW9uIGJlaW5nIHRoZSBzYW1lIGFzIC0td2lkZS4KLQotVGh1IEp1biAgMSAxNzowOToyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU2F0IE1heSAgNiAwODo1MjoyNCAxOTk1ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCi0KLQkqIG9iamNvcHkuYyAoc21hcnRfcmVuYW1lKTogbWFrZSBpdCBzbWFydGVyLCBjbGVhbiB1cAotCSAgaWYgcmVuYW1lICgpIGZhaWxzLgotCi1UdWUgTWF5IDMwIDE0OjI0OjE1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBEZWxldGUgbGluZXMgd2l0aCBsb3RzIG9mICMjIyMgYmVjYXVzZSBmb3VyIG9yIG1vcmUKLQlpbmRpY2F0ZSBhIHBvaW50IGZvciBtYWtlZmlsZSBmcmFnbWVudCBzdWJzdGl0dXRpb24uCi0KLVR1ZSBNYXkgIDkgMTc6MTc6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIG5sbWNvbnYgb24gUG93ZXJQQyBlYWJpIGFueSBtb3JlLCBpdAotCWlzIG5vdCBuZWVkZWQuCi0KLVRodSBBcHIgMjcgMjA6MjE6MjQgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYUEVDVCk6IERlZmluZS4KLQkoUlVOVEVTVCk6IFVzZSBvbmUgaW4gc291cmNlIHRyZWUgaWYgcHJlc2VudC4KLQkoY2hlY2spOiBTZXQgYHJvb3RtZScgZm9yICQoRVhQRUNUKS4KLQotV2VkIEFwciAyNiAxODoyNjoyMSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzcmNvbnYuYyAobWFpbik6IEFkZCBzdXBwb3J0IGZvciAtbiBvcHRpb24gd2hpY2ggZGlzYWJsZXMKLQlwcmVzY2FuIG9mIGNvbW1vbiBzeW1ib2xzLgotCSh3cl9vYik6IElmIHJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIGEgc2VjdGlvbiwgZmlsbCB3aXRoIHplcm9zLgotCi1UdWUgQXByIDI1IDE5OjE0OjM3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX2hlYWRlcik6IERpc3BsYXkgbG9hZCBhZGRyZXNzIGFmdGVyCi0JdmlydHVhbCBtZW1vcnkgKHJ1bi10aW1lKSBhZGRyZXNzLgotCi1XZWQgQXByIDE5IDA5OjQ0OjA2IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY3BsdXMtZGVtLm8pOiBQYXNzIC1EVkVSU0lPTj0nIiQoVkVSU0lPTikiJyB0byB0aGUKLSAgICAgICAgY29tcGlsZS4KLQkoREVNQU5HTEVSX1BST0cpOiBObyBsb25nZXIgdXNlcyB2ZXJzaW9uLm8uCi0KLU1vbiBBcHIgMTAgMTM6Mjk6NDkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JTWVyZ2UgaW4gc3VwcG9ydCBmb3IgTWFjIE1QVyBhcyBhIGhvc3QuCi0JKE9sZCBjaGFuZ2UgZGVzY3JpcHRpb25zIHJldGFpbmVkIGZvciBpbmZvcm1hdGlvbmFsIHZhbHVlLikKLQotCSogbXB3LWNvbmZpZy5pbiAoVERFRklORVMpOiBEZWZpbmUgYXMgZW1wdHkgaW4gbWFrZWZpbGUgZnJhZy4KLQotCSogbXB3LWNvbmZpZy5pbjogQ3JlYXRlIG1rLnRtcCwgZGVmaW5lIEFSQ0hERUZTIGluIGl0LgotCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIGNvbmZpZ3VyZSBmcmFnbWVudCBmb3IgYmludXRpbHMuCi0JKiBtcHctbWFrZS5pbiAoaW5zdGFsbC1vbmx5KTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbCk6IEFsc28gZGVwZW5kIG9uIGluc3RhbGwtb25seS4KLQotCSogbXB3LW1ha2UuaW4gKGNwbHVzZmlsdCk6IFJlbmFtZWQgZnJvbSBjKytmaWx0LgotCShJTkNMVURFUyk6IEFkZCBtb3JlIHBhdGhzLgotCi0JKiBtcHctbWFrZS5pbjogTmV3IGZpbGUsIE1QVyBtYWtlZmlsZSBmcmFnbWVudCBmb3IgYmludXRpbHMuCi0JKE5vcm1hbGx5IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gTWFrZWZpbGUuaW4uKQotCi1Nb24gTWFyIDI3IDExOjUyOjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXIuYyAod3JpdGVfYXJjaGl2ZSk6IENhbGwgbWFrZV90ZW1wbmFtZSB0byBnZXQgb3V0cHV0IGZpbGUKLQluYW1lLCByYXRoZXIgdGhhbiB1c2luZyBhIGZpeGVkIG5hbWUgYmFzZWQgb24gdGhlIGlucHV0IGZpbGUuCi0KLQkqIG9iamNvcHkuYyAobWFrZV90ZW1wbmFtZSk6IENvcHkgZnJvbSBoZXJlLi4uCi0JKiBidWNvbW0uYyAobWFrZV90ZW1wbmFtZSk6IC4uLnRvIGhlcmUsIGFuZCBtYWtlIGdsb2JhbC4KLQkqIGJ1Y29tbS5oIChtYWtlX3RlbXBuYW1lKTogRGVjbGFyZS4KLQotRnJpIE1hciAyNCAxMTo0Nzo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cmluZ3MuYzogSW5jbHVkZSAiYmZkLmgiIGJlZm9yZSBvdGhlciBoZWFkZXJzLiAgSW5jbHVkZQotCSJzeXNkZXAuaCIuCi0JKiBidWNvbW0uYyAocHJpbnRfYXJlbHRfZGVzY3IpOiBDYXN0IHN0X3VpZCBhbmQgc3RfZ2lkIHRvIGxvbmcsCi0JYW5kIHByaW50IHRoZW0gd2l0aCAlbGQuCi0KLUZyaSBNYXIgMTAgMTM6MDk6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHN0cmlwX29wdGlvbnMpOiBBZGQgLS1rZWVwLXN5bWJvbC4KLQkoY29weV9vcHRpb25zKTogTGlrZXdpc2UuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0ta2VlcC1zeW1ib2wgYW5kIC1LLgotCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCShrZWVwX3N5bWJvbHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShpc19zdHJpcF9zeW1ib2wpOiBBZGp1c3QgdGhlIHJldHVybiB2YWx1ZSBhY2NvcmRpbmcgdG8KLQlrZWVwX3N5bWJvbHMuCi0JKHN0cmlwX21haW4pOiBIYW5kbGUgLUsuICBGb3IgLU4sIGNoZWNrIHRoYXQgLUsgd2FzIG5vdCBnaXZlbi4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjEsIHN0cmlwLjE6IERvY3VtZW50IC1LLgotCi1Nb24gTWFyICA2IDEzOjMzOjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X2FyY2hpdmUpOiBDaGVjayByZXN1bHQgb2YgbWtkaXIuCi0JKGNvcHlfbWFpbik6IENhc3QgYW4geG1hbGxvYyByZXN1bHQuCi0KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBCcmVhayBsb25nIGZvcm1hdCBzdHJpbmcgaW50byBzaG9ydGVyIG9uZXMuCi0KLU1vbiBNYXIgIDYgMTM6NDY6MTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBidWNvbW0uYyAobGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyk6IE5ldyBmdW5jdGlvbi4KLQkqIGJ1Y29tbS5oIChsaXN0X3N1cHBvcnRlZF90YXJnZXRzKTogRGVjbGFyZS4KLQkqIGFyLmMgKHVzYWdlKTogQ2FsbCBsaXN0X3N1cHBvcnRlZF90YXJnZXRzLgotCSogbm0uYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAoY29weV91c2FnZSwgc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIHNpemUuYyAodXNhZ2UpOiBMaWtld2lzZS4KLQkqIHN0cmluZ3MuYyAodXNhZ2UpOiBMaWtld2lzZS4KLQotVHVlIEZlYiAyOCAxNToxMzo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJ1Y29tbS5jIChwcmludF9hcmVsdF9kZXNjcik6IENhc3Qgc3Rfc2l6ZSB0byBsb25nIGJlZm9yZQotCXBhc3NpbmcgaXQgdG8gZnByaW50Zi4KLQotRnJpIEZlYiAxNyAxMzozNjo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc3RydWN0IHNlY3Rpb25fbGlzdCk6IEFkZCBmaWVsZHMgcmVtb3ZlLCBzZXRfZmxhZ3MsCi0JYW5kIGZsYWdzLiAgQ2hhbmdlIGFkanVzdCBmcm9tIGJvb2xlYW4gdG8gZW51bS4KLQkocmVtb3ZlX3NlY3Rpb25zKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZS4KLQkoc2VjdGlvbnNfcmVtb3ZlZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGNvcHlfb3B0aW9ucyk6IEFkZCAtLXNldC1zZWN0aW9uLWZsYWdzLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXNldC1zZWN0aW9uLWZsYWdzLgotCShwYXJzZV9mbGFncyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZpbmRfc2VjdGlvbl9saXN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaXNfc3RyaXBfc3ltYm9sKTogQ2hhbmdlIHJldHVybiB0eXBlIGZyb20gaW50IHRvIGJvb2xlYW4uCi0JKGlzX3N0cmlwX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShmaWx0ZXJfc3ltYm9scyk6IENhbGwgaXNfc3RyaXBfc2VjdGlvbi4KLQkoY29weV9vYmplY3QpOiBXaGVuIGFkZGluZyBzZWN0aW9ucywgY2hlY2sgZm9yIHNwZWNpZmllZCBmbGFncyBvcgotCVZNQS4gIENhbGwgZmlsdGVyX3N5bWJvbHMgaWYgYW55IHNlY3Rpb25zIGFyZSBiZWluZyByZW1vdmVkLgotCShzZXR1cF9zZWN0aW9uKTogVXNlIGZpbmRfc2VjdGlvbl9saXN0IGZ1bmN0aW9uIHJhdGhlciB0aGFuCi0JbG9va2luZyB0aHJvdWdoIHJlbW92ZV9zZWN0aW9ucyBhbmQgYWRqdXN0X3NlY3Rpb25zLiAgSGFuZGxlCi0JLS1zZXQtc2VjdGlvbi1mbGFncy4KLQkoY29weV9zZWN0aW9uKTogVXNlIGZpbmRfc2VjdGlvbl9saXN0IHJhdGhlciB0aGFuIGxvb2tpbmcgdGhyb3VnaAotCXJlbW92ZV9zZWN0aW9ucy4KLQkoc3RyaXBfbWFpbik6IFVzZSBmaW5kX3NlY3Rpb25fbGlzdCBpbnN0ZWFkIG9mIGFkZGluZyBpdGVtcyB0bwotCXNlY3Rpb25zX3JlbW92ZWQuCi0JKGNvcHlfbWFpbik6IFVzZSBmaW5kX3NlY3Rpb25fbGlzdCBpbnN0ZWFkIG9mIGFkZGluZyBpdGVtcyB0bwotCXNlY3Rpb25zX3JlbW92ZWQgYW5kIGFkanVzdF9zZWN0aW9ucy4gIEhhbmRsZSAtLXNldC1zZWN0aW9uLWZsYWdzLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLXNldC1zZWN0aW9uLWZsYWdzLgotCi1UdWUgRmViIDE0IDE4OjAzOjAzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jICh3aXRoX3NvdXJjZV9jb2RlKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC1TLy0tc291cmNlLgotCShsb25nX29wdGlvbnMpOiBBZGQgLS1zb3VyY2UuCi0JKHByZXZfZnVuY3Rpb25uYW1lLCBwcmV2X2xpbmUpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoc3RydWN0IHByaW50X2ZpbGVfbGlzdCk6IERlZmluZS4KLQkocHJpbnRfZmlsZXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShza2lwX3RvX2xpbmUsIHNob3dfbGluZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShkaXNhc3NlbWJsZV9kYXRhKTogQ2FsbCBzaG93X2xpbmUgdG8gaGFuZGxlIC1sIGFuZCAtUy4KLQkobWFpbik6IEhhbmRsZSAtUy4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLVMvLS1zb3VyY2UuCi0KLVRodSBGZWIgIDkgMTY6MTE6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfdXNhZ2UpOiBSZW5hbWUgcGFyYW1ldGVyIHRvIGF2b2lkIHNoYWRvd2luZy4KLQkoc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KLQotCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9hZGQpOiBEZWZpbmUuCi0JKGFkZF9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGNvcHlfb3B0aW9ucyk6IEFjY2VwdCAtLWFkZC1zZWN0aW9uLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLWFkZC1zZWN0aW9uLgotCShjb3B5X29iamVjdCk6IEFkZCBzZWN0aW9ucyBmcm9tIHRoZSBhZGRfc2VjdGlvbnMgbGlzdC4KLQkoY29weV9tYWluKTogSGFuZGxlIC0tYWRkLXNlY3Rpb24uCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tYWRkLXNlY3Rpb24uCi0KLVdlZCBGZWIgIDEgMTU6MDQ6NTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogUGFzcyBzZWN0aW9uIG9mZnNldCwgbm90IGFic29sdXRlCi0JYWRkcmVzcywgdG8gYmZkX2ZpbmRfbmVhcmVzdF9saW5lLgotCi0JKiBubG1jb252LmMgKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IERvbid0IHVzZSBjb25zdCB3aXRoCi0JcmVsb2NfaG93dG9fdHlwZS4KLQotVGh1IEphbiAyNiAxODo1MDowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoY29tcGFyZV9zeW1ib2xzKTogVXNlIGJmZF9hc3ltYm9sX3ZhbHVlIChWQVIpIHJhdGhlcgotCXRoYW4gVkFSLT52YWx1ZS4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogTGlrZXdpc2UuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCBjaGFuZ2UgdGhlIHN5bWJvbCB2YWx1ZXMuICBJdCBjYW4KLQljb25mdXNlIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0KLVRodSBKYW4gMjYgMTI6MDM6NTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBwb3dlcnBjLSotZWJhaS4KLQotV2VkIEphbiAxOCAxMDowMjoxMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogY29mZmR1bXAuYzogSW5jbHVkZSBzeXNkZXAuaC4KLQkoZHVtcF9jb2ZmX3R5cGUpOiBIYW5kbGUgY29mZl9zZWNkZWZfdHlwZS4KLQkqIGNvZmZncm9rLmMgOiBJbmNsdWRlIHN5c2RlcC5oLgotCSogc3Jjb252LmM6IEluY2x1ZGUgbGliaWJlcnR5LmgKLQkoYWJzb2x1dGVfcCwgZHR5X3N0YXJ0LCBkdHlfZW5kLCBkdW1wX3RyZWVfc3RydWN0dXJlKTogUmVtb3ZlLgotCi1XZWQgSmFuIDE4IDEyOjI0OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29mZmR1bXAuYyAoZHVtcF9jb2ZmX3Njb3BlKTogQ2FzdCBwb2ludGVyIHRvIHVuc2lnbmVkIGxvbmcgZm9yCi0JcHJpbnRmLgotCSogY29mZmdyb2suYzogSW5jbHVkZSBidWNvbW0uaC4gIERvbid0IGRlY2xhcmUgeG1hbGxvYy4KLQkocHVzaF9zY29wZSk6IERlY2xhcmUgdHlwZSBvZiBwYXJhbWV0ZXIgbGluay4KLQkqIHNpemUuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkqIHNyY29udi5jOiBJbmNsdWRlIGJ1Y29tbS5oLgotCShmaW5kX2Jhc2UpOiBEZWNsYXJlIGF0IHRvcCBvZiBmaWxlLgotCSh3cl9oZCk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gYXJjaGl0ZWN0dXJlIHN3aXRjaC4KLQkod3JfZHBzX3N0YXJ0KTogRGVjbGFyZSB0eXBlIG9mIHBhcmFtZXRlciBuZXN0LgotCSh3cl9kdSk6IENvbW1lbnQgb3V0IHZhcmlhYmxlcyB1c2VkIG9ubHkgaW4gY29tbWVudGVkIG91dCBibG9ja3MuCi0JKHdyX2R1cyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgaS4KLQkod3Jfc2MpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyBteWluZm8sIGxvdywgYW5kIGhpZ2guCi0JKiBzdHJpbmdzLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKiBzeXNkdW1wLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCi1UdWUgRGVjIDIwIDE5OjEzOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXIuYyAobWFpbik6IElnbm9yZSAnZicgbW9kaWZpZXIgdXNlZCBvbiBIUC9VWCA5LgotCi1UaHUgRGVjIDE1IDE3OjM0OjEyIDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogYXIuYywgbm0uYywgb2JqY29weS5jLCBvYmpkdW1wLmM6IEluY2x1ZGUgcHJvZ3Jlc3MuaC4KLQkqIGFyLmMsIG5tLmMsIG9iamNvcHkuYywgb2JqZHVtcC5jIChtYWluKTogQWRkIFNUQVJUX1BST0dSRVNTCi0JYW5kIEVORF9QUk9HUkVTUy4KLQkqIGFyLmMgKG1hcF9vdmVyX21lbWJlcnMsIG9wZW5faW5hcmNoKTogQ2FsbCBQUk9HUkVTUy4KLQkqIG5tLmMgKG1haW4sIGRpc3BsYXlfYXJjaGl2ZSwgZmlsdGVyX3N5bWJvbHMsIHByaW50X3N5bWJvbHMpOgotCUNhbGwgUFJPR1JFU1MuCi0KLQkqIG9iamNvcHkuYyAoY29weV91c2FnZSk6IEJyZWFrIHVwIGxvbmcgdXNhZ2Ugc3RyaW5nLgotCi1XZWQgRGVjIDE0IDE1OjUxOjU2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBEb24ndCBib3RoZXIgc2V0dGluZyBzdGF0dXMgYWZ0ZXIKLQlub25mYXRhbCgpICJjYWxsIiwgYmVjYXVzZSBpdCB3b24ndCByZXR1cm4uCi0KLUZyaSBEZWMgIDkgMDA6MjI6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IERvbid0IHN3aXRjaCBhIHJlbG9jIHRvIHVzZQotCXRoZSBzZWN0aW9uIHN5bWJvbCBpZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4KLQotVGh1IERlYyAgOCAxNDo0NTo1MCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGFkZF9zdHJpcF9zeW1ib2wpOiBDYXN0IHJldHVybiB2YWx1ZSBvZiB4bWFsbG9jLgotCi1XZWQgTm92IDMwIDExOjA1OjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AcnRsLmN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKHJlcGxhY2VfbWVtYmVycyk6IFBhc3MgY3VycmVudC0+ZmlsZW5hbWUgdG8gbm9ybWFsaXplIHdoZW4KLQljaGVja2luZyBmb3IgZHVwbGljYXRlcywgYmVjYXVzZSB0aGUgZmlsZW5hbWUgb2YgYSBuZXdseSBhZGRlZAotCWZpbGUgd2lsbCBub3QgaGF2ZSBiZWVuIG5vcm1hbGl6ZWQgeWV0LgotCi1UaHUgTm92IDE3IDE1OjAwOjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXIuYyAobWFpbik6IERvbid0IGNhbGwgZG9fcXVpY2tfYXBwZW5kIGlmIGFueSBvZiB0aGUgYXJjaGl2ZQotCW5hbWVzIGFyZSBsb25nZXIgdGhhbiAxNCBjaGFyYWN0ZXJzLgotCi0JKiBvYmpjb3B5LmMgKG1haW4pOiBGaXggaXNfc3RyaXAgdGVzdC4gIEZyb20KLQlwaXJrZXJAZWl1bml4LnR1d2llbi5hYy5hdCAoTWFydGluIFBpcmtlcikuCi0KLVRodSBOb3YgMTcgMTU6Mzc6MTkgMTk5NCAgTWFyayBXLiBFaWNoaW4gIDxlaWNoaW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChhZGRfc3RyaXBfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLCBhZGRzIGEgbmFtZSB0byBhbgotCWV4cGxpY2l0IGxpc3Qgb2Ygc3ltYm9scyB0byBzdHJpcC4KLQkoaXNfc3RyaXBfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLCByZXBvcnRzIHdoZXRoZXIgdGhlIG5hbWUgYXJndW1lbnQKLQlpcyBpbiB0aGUgZXhwbGljaXQgbGlzdC4KLQkoZmlsdGVyX3N5bWJvbHMpOiBDaGVjayBhZ2FpbnN0IGlzX3N0cmlwX3N5bWJvbCBhYm92ZSBhbGwuCi0JKHN0cmlwX21haW4pOiBSZWNvZ25pemUgLU4gb3B0aW9uLiBJZiB1c2VkLCBkb24ndCBkZWZhdWx0IHRvCi0Jc3RyaXBfYWxsLgotCShjb3B5X21haW4pOiBSZWNvZ25pemUgLU4gb3B0aW9uLgotCShzdHJpcF91c2FnZSk6IERvY3VtZW50IC1OIGFuZCAtLXN0cmlwLXN5bWJvbCBvcHRpb25zLgotCShjb3B5X3VzYWdlKTogRGl0dG8uCi0JKiBvYmpjb3B5LjEsIHN0cmlwLjEsIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IC1OIGFuZAotCS0tc3RyaXAtc3ltYm9sIG9wdGlvbnMuCi0KLVR1ZSBOb3YgIDggMTM6MTI6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfdGFyZ2V0X2xpc3QsIGRpc3BsYXlfaW5mb190YWJsZSk6IFBhc3MgYW4KLQlhcnJheSB0byB0bXBhcmcsIHJhdGhlciB0aGFuIE5VTEwsIHNpbmNlIHNvbWUgc3lzdGVtcyBjYW4ndCBoYW5kbGUKLQlOVUxMLgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IEtlZXAgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUKLSAgICAgICAgdGVtcG9yYXJ5IGZpbGVzIHdlIGNyZWF0ZWQuICBDbG9zZSBlYWNoIGlucHV0IEJGRCBhZnRlciB3ZSBvcGVuCi0gICAgICAgIGl0cyBzdWNjZXNzb3IuCi0KLU1vbiBOb3YgIDcgMTU6NDg6MzkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBCdW1wIHRvIDIuNS4zLgotCi1UaHUgTm92ICAzIDE5OjA0OjM0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBJbnN0YWxsIGluZm8gZmlsZXMgZnJvbSB3aGF0ZXZlcgotCWRpcmVjdG9yeSB0aGV5IHdlcmUgZm91bmQgaW4uCi0KLQlQYXRjaCBmcm9tIERKIERlbG9yaWU6Ci0JKiBjb25maWd1cmUuYmF0OiBkbyBjKytmaWx0IC0+IGN4eGZpbHQgcmlnaHQKLQotCSogc3lzaW5mby55OiBJbmNsdWRlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZWFybHksIHNvIGFueSBwb3RlbnRpYWwKLQlkZWNsYXJhdGlvbiBvZiBhYm9ydCgpIG9jY3VycyBiZWZvcmUgaXRzIHVzZS4KLQotCSogc3RyaW5ncy5jIChzdHJpbmdzX2ZpbGUpOiBUcnkgb3BlbmluZyB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZQotCWZpcnN0LgotCi1XZWQgTm92ICAyIDE1OjQ0OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXIuYyAobWFpbik6IFRyZWF0IGFyIHFzIGxpa2UgYXIgcnMuCi0KLVR1ZSBPY3QgMjUgMTY6MTk6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGdhcF9maWxsKTogRXhwbGljaXRseSBpbml0aWFsaXplLCBmb3IgY2xhcml0eS4KLQkocGFkX3RvX3NldCwgcGFkX3RvKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGNvcHlfb3B0aW9ucyk6IEFjY2VwdCAtLXBhZC10by4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1wYWQtdG8uCi0JKGNvcHlfb2JqZWN0KTogU3VwcG9ydCAtLXBhZC10by4KLQkoY29tcGFyZV9zZWN0aW9uX3ZtYSk6IFNvcnQgbm9uIGxvYWRhYmxlIHNlY3Rpb25zIHRvIHRoZSBmcm9udC4KLQlTb3J0IHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgVk1BIGJ5IHNpemUuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSAtLXBhZC10by4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1wYWQtdG8uCi0KLVRodSBPY3QgMjAgMTM6NTE6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGdhcF9maWxsX3NldCwgZ2FwX2ZpbGwpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoY29weV9vcHRpb25zKTogQWNjZXB0IC0tZ2FwLWZpbGwuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tZ2FwLWZpbGwuCi0JKGNvcHlfb2JqZWN0KTogU3VwcG9ydCAtLWdhcC1maWxsLgotCShnZXRfc2VjdGlvbnMsIGNvbXBhcmVfc2VjdGlvbl92bWEpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoY29weV9tYWluKTogSGFuZGxlIC0tZ2FwLWZpbGwuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tZ2FwLWZpbGwuCi0KLVdlZCBPY3QgMTkgMTQ6MDk6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBBZGQgYSBkdW1teSBlbHNlIGNsYXVzZSB0byB0aGUgaWYKLQlzdGF0ZW1lbnQuCi0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBSZW1vdmUgc3BlY2lhbCBtZW50aW9uIG9mIC0tc2V0LXN0YXJ0Ci0JYW5kIGBiaW5hcnknIG91dHB1dCBmb3JtYXQuCi0KLVR1ZSBPY3QgMTggMTE6MTI6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogSWYgdGhlIG91dHB1dCBmaWxlIGZvcm1hdCBpcyBgYmluYXJ5JywKLQlhbmQgdGhlIHN0YXJ0IGFkZHJlc3Mgd2FzIG5vdCBzZXQgdXNpbmcgLS1zZXQtc3RhcnQsIGRlZmF1bHQgdGhlCi0Jc3RhcnQgYWRkcmVzcyB0byB6ZXJvLiAgVGhpcyBoYWNrIGlzIGJlY2F1c2UgdGhlIGBiaW5hcnknIG91dHB1dAotCWZpbGUgZm9ybWF0IHVzZXMgdGhlIHN0YXJ0IGFkZHJlc3MgdG8gc2V0IHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YKLQl0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgZmlsZS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogQWRkIHNvbWUgbm90ZXMgb24gZ2VuZXJhdGluZyBTLXJlY29yZHMKLQlhbmQgYmluYXJ5IGZpbGVzLgotCi0JKiBubS5jIChwcmludF9zeW1kZWZfZW50cnkpOiBDYWxsIHByaW50X3N5bW5hbWUgdG8gcHJpbnQgdGhlCi0Jc3ltYm9sIG5hbWUsIHNvIHRoYXQgLS1kZW1hbmdsZSB3b3Jrcy4KLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIHRtcGRpci4KLQotCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KTogQWRkIGZpZWxkcyB1c2VkLCBhZGp1c3QsIHZhbC4KLQkoYWRqdXN0X3N0YXJ0LCBzZXRfc3RhcnRfc2V0LCBzZXRfc3RhcnQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoYWRqdXN0X3NlY3Rpb25fdm1hLCBhZGp1c3Rfc2VjdGlvbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoY29weV9vcHRpb25zKTogQWRkIC0tYWRqdXN0LXN0YXJ0LCAtLWFkanVzdC12bWEsCi0JLS1hZGp1c3Qtc2VjdGlvbi12bWEsIC0tYWRqdXN0LXdhcm5pbmdzLCAtLW5vLWFkanVzdC13YXJuaW5ncywKLQktLXNldC1zdGFydC4KLQkocGFyc2Vfdm1hKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gbmV3IG9wdGlvbnMuCi0JKGNvcHlfb2JqZWN0KTogSGFuZGxlIC0tc2V0LXN0YXJ0IGFuZCAtLWFkanVzdC1zdGFydC4KLQkoc2V0dXBfc2VjdGlvbik6IENvcnJlY3QgdHlwZSBvZiBsYXN0IGFyZ3VtZW50IHRvIFBUUi4gIFNldCB1c2VkCi0JZmllbGQgaWYgc2VjdGlvbiBpcyByZW1vdmVkLiAgSGFuZGxlIC0tYWRqdXN0LXZtYSBhbmQKLQktLWFkanVzdC1zZWN0aW9uLXZtYS4KLQkoY29weV9zZWN0aW9uKTogQ29ycmVjdCB0eXBlIG9mIGxhc3QgYXJndW1lbnQgdG8gUFRSLgotCShtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyk6IExpa2V3aXNlLgotCShzdHJpcF9tYWluKTogQ2xlYXIgdXNlZCBmaWVsZCB3aGVuIGhhbmRsaW5nIC1SLgotCShjb3B5X21haW4pOiBIYW5kbGUgbmV3IG9wdGlvbnMuCi0JKiBiaW51dGlscy50ZXhpIChvYmpjb3B5KTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0JKiBvYmpjb3B5LjE6IERvY3VtZW50IG5ldyBvcHRpb25zLgotCi1GcmkgT2N0IDE0IDE0OjM4OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChjb25maWdkaXJzKTogUmVtb3ZlIGRlZmluaXRpb24tLXRlc3RzdWl0ZSBpcyBubwotCWxvbmdlciBjb25maWd1cmVkLgotCSogTWFrZWZpbGUuaW4gKHRlc3RzdWl0ZSk6IFJlbW92ZSB0YXJnZXQuCi0JKHNpdGUuZXhwKTogTmV3IHRhcmdldC4KLQkoY2hlY2spOiBSZXdyaXRlLgotCShjbGVhbiwgZGlzdGNsZWFuKTogRG9uJ3QgcmVjdXIgaW50byB0ZXN0c3VpdGUgZGlyZWN0b3J5LgotCi1UaHUgT2N0IDEzIDE5OjI0OjA5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCB0byAyLjUuCi0JKiBWZXJzaW9uIDIuNSByZWxlYXNlZC4KLQotVHVlIE9jdCAxMSAxNToyNjo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChzeXNkdW1wLm8pOiBEZXBlbmRzIHVwb24gc3lzcm9mZi5jLgotCi1Nb24gT2N0IDEwIDEzOjUwOjMwIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChsaW5rX2lucHV0cyk6IFBhc3MgLVVyIGZsYWcgdG8gbGQgc28gdGhhdCB0aGUKLQkgIGN0b3IvZHRvciB0YWJsZXMgbmVlZGVkIGJ5IEMrKyBwcm9ncmFtcyBhcmUgYnVpbHQuCi0KLVN1biBPY3QgIDkgMTg6MDQ6MDAgMTk5NCAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3Jjb252Lm8pOiBBZGQgZGVwZW5kZW5jZSBvbiBzeXNyb2ZmLmMuCi0KLVR1ZSBPY3QgIDQgMTI6MTk6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAke2NvbmZpZ19zaGVsbH0gd2hlbiBydW5uaW5nIGNvbmZpZy5iZmQuCi0KLQkqIE1ha2VmaWxlLmluIChzeXNyb2ZmLmgpOiBTcGxpdCB0YXJnZXQgYXdheSBmcm9tIHN5c3JvZmYuYy4KLQkoc3Jjb252Lm8sIHN5c2R1bXAubyk6IE5ldyB0YXJnZXRzLgotCShzcmNvbnYsIHN5c2R1bXApOiBEb24ndCBkZXBlbmQgdXBvbiBzeXNyb2ZmLmMuCi0KLVdlZCBTZXAgMjggMTM6MDQ6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYXJwYXJzZS5jKTogRG9uJ3QgaWdub3JlIGVycm9ycyBmcm9tIG12LgotCShzeXNpbmZvLmMpOiBMaWtld2lzZS4gIEFsc28sIGRlcGVuZCB1cG9uIGFycGFyc2UuYywgdG8gcHJldmVudCBhCi0JcGFyYWxsZWwgbWFrZSBmcm9tIHRyeWluZyB0byBidWlsZCBib3RoIGFycGFyc2UuYyBhbmQgc3lzaW5mby5jCi0Jc2ltdWx0YW5lb3VzbHkuCi0JKG5sbWhlYWRlci5jKTogU2ltaWxhciBjaGFuZ2UuCi0JKGFycGFyc2UuaCk6IFNlcGFyYXRlIHRhcmdldCBmcm9tIGFycGFyc2UuYywgc28gdGhhdCBhIHBhcmFsbGVsCi0JbWFrZSBkb2VzIG5vdCB0cnkgdG8gYnVpbGQgYm90aCBhdCBvbmNlLiAgRGVwZW5kIHVwb24gYXJwYXJzZS5jLgotCShzeXNpbmZvLmgpOiBTaW1pbGFyIGNoYW5nZS4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogUGFzcyB0aGUgcmVsb2MgYnVmZmVyIHRvIGZyZWUsIG5vdAotCXRoZSBwb2ludGVyIHVzZWQgdG8gbG9vcCBvdmVyIHRoZSByZWxvY3MuCi0KLVNhdCBTZXAgMjQgMTY6MTY6NTcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYXN0IHJlc3VsdCBvZiB4bWFsbG9jLgotCi1XZWQgU2VwIDIxIDE5OjMwOjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzb3J0ZWRfc3ltcywgc29ydGVkX3N5bWNvdW50KTogTmV3IGdsb2JhbCB2YXJpYWJsZXMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IFVzZSBzb3J0ZWRfc3ltcyBhbmQgc29ydGVkX3N5bWNvdW50Ci0JaW5zdGVhZCBvZiBzeW1zIGFuZCBzeW1jb3VudC4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IERvbid0IGJvdGhlciB0byBnZXQgdGhlIHJlbG9jcyBiZWZvcmUgbG9vcGluZwotCW92ZXIgdGhlIHNlY3Rpb25zLiAgQmVmb3JlIGZpbHRlcmluZyBhbmQgc29ydGluZyB0aGUgc3ltYm9sIHRhYmxlLAotCWNvcHkgaXQgaW50byBzb3J0ZWRfc3ltcy4KLQotRnJpIFNlcCAxNiAxMToyNzozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8pOiBBZGQgZmllbGQgcmVxdWlyZV9zZWMuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IElmIGF1eC0+cmVxdWlyZV9zZWMsIHJlcXVpcmUgdGhhdCB0aGUKLQlzeW1ib2wgYmUgaW4gYXV4LT5zZWMgZXZlbiBpZiBIQVNfUkVMT0MgaXMgbm90IHNldC4gIElmIHdlIGNhbid0Ci0JZmluZCBhIHNtYWxsZXIgc3ltYm9sIGluIHRoZSByaWdodCBzZWN0aW9uLCBsb29rIGZvciBhIGxhcmdlciBvbmUuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgYXV4LnJlcXVpcmVfc2VjIGFyb3VuZCB0aGUKLQlvYmpkdW1wX3ByaW50X2FkZHJlc3MgY2FsbCBmb3IgdGhlIGluc3RydWN0aW9uIGFkZHJlc3MuCi0KLVRodSBTZXAgMTUgMjE6NDM6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhci5jOiBDYWxsIHhleGl0IHJhdGhlciB0aGFuIGV4aXQuCi0JKG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X2ZpbGUsIG91dHB1dF9iZmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkocmVtb3ZlX291dHB1dCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1haW4pOiBDYWxsIHhhdGV4aXQgKHJlbW92ZV9vdXRwdXQpLiAgQ2FsbCB4ZXhpdCByYXRoZXIgdGhhbgotCXJldHVybmluZy4KLQkoZXh0cmFjdF9maWxlKTogU2V0IG91dHB1dF9maWxlbmFtZSBhbmQgb3V0cHV0X2ZpbGUgd2hpbGUgb3V0cHV0Ci0JZmlsZSBpcyBvcGVuLgotCSh3cml0ZV9hcmNoaXZlKTogTGlrZXdpc2UsIGJ1dCB1c2Ugb3V0cHV0X2JmZCwgbm90IG91dHB1dF9maWxlLgotCSogYXJzdXAuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4gIENhbGwgeGV4aXQgcmF0aGVyIHRoYW4gZXhpdC4KLQkqIGJ1Y29tbS5jOiBMaWtld2lzZS4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9hbGwpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCSh1c2FnZSk6IERvY3VtZW50IC0tZGlzYXNzZW1ibGUtYWxsLgotCShsb25nX29wdGlvbnMpOiBBZGQgZGlzYXNzZW1ibGUtYWxsIGFzIGEgc3lub255bSBmb3IgLUQuCi0JKGNvbXBhcmVfc3ltYm9scyk6IE1ha2UgcG9pbnRlcnMgY29uc3QuCi0JKGNvbXBhcmVfcmVsb2NzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFJlbmFtZSBkaXNhc3NlbWJsZSB0byBkaXNhc3NlbWJsZV9mbiB0byBhdm9pZAotCXNoYWRvd2luZy4gIElmIGR1bXBfcmVsb2NfaW5mbywgcHJpbnQgcmVsb2NzIGFsb25nIHdpdGgKLQlkaXNhc3NlbWJseS4gIFNraXAgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCBTRUNfQ09ERSB1bmxlc3MKLQlkaXNhc3NlbWJsZV9hbGwgb3Igb25seSBpcyBzZXQuCi0JKGRpc3BsYXlfYmZkKTogRG9uJ3QgY2FsbCBkdW1wX3JlbG9jcyBpZiBkaXNhc3NlbWJsZSBpcyBzZXQuCi0JKG1haW4pOiBBY2NlcHQgYW5kIGhhbmRsZSAtRC4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IC1ELy0tZGlzYXNzZW1ibGUtYWxsLgotCSogb2JqZHVtcC4xOiBMaWtld2lzZS4KLQotV2VkIFNlcCAxNCAxMjoxOTowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEluaXRpYWxpemUgcHJldmxpbmUgdG8gMC4gIE1ha2UKLQlwcmV2X2Z1bmN0aW9uIG5vbiBjb25zdC4gIENvcHkgZnVuY3Rpb25uYW1lIGludG8gYW4gbWFsbG9jIGJ1ZmZlcgotCXdoZW4gc2V0dGluZyBwcmV2X2Z1bmN0aW9uLCBpbnN0ZWFkIG9mIGFzc3VtaW5nIHRoYXQgdGhlIHN0cmluZwotCXdpbGwgbGFzdCBmb3JldmVyLgotCi0JKiBubS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShzb3J0X2J5X3NpemUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsb25nX29wdGlvbnMpOiBBZGQgLS1zaXplLXNvcnQuCi0JKHVzYWdlKTogTWVudGlvbiAtLXNpemUtc29ydC4KLQkobnVtZXJpY19mb3J3YXJkKTogTWFrZSBzdGF0aWMuICBDaGFuZ2UgZnJvbSB2b2lkICogdG8gUFRSLgotCShudW1lcmljX3JldmVyc2UpOiBMaWtld2lzZS4KLQkobm9uX251bWVyaWNfZm9yd2FyZCwgbm9uX251bWVyaWNfcmV2ZXJzZSk6IExpa2V3aXNlLgotCShzb3J0ZXJzKTogQ2hhbmdlIGRlY2xhcmF0aW9uIGZyb20gdm9pZCAqIHRvIFBUUi4KLQkoc2l6ZV9mb3J3YXJkLCBzb3J0X3N5bWJvbF9ieV9zaXplKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGRpc3BsYXlfcmVsX2ZpbGUpOiBIYW5kbGUgc29ydF9ieV9zaXplLgotCShmaWx0ZXJfc3ltYm9scyk6IElmIHNvcnRfYnlfc2l6ZSwgZGlzY2FyZCBhYnNvbHV0ZSBhbmQgdW5kZWZpbmVkCi0Jc3ltYm9scy4KLQkqIGJpbnV0aWxzLnRleGkgKG5tKTogRG9jdW1lbnQgLS1zaXplLXNvcnQuCi0JKiBubS4xOiBEb2N1bWVudCAtLXNpemUtc29ydC4KLQotVHVlIFNlcCAxMyAyMTowNjowNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogb2JqY29weS5jIChjb3B5X21haW4pOiBJbml0aWFsaXplIGlucHV0X2ZpbGVuYW1lIGFuZAotCW91dHB1dF9maWxlbmFtZSB0byBOVUxMLgotCi1UdWUgU2VwIDEzIDE0OjE3OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHZlcnNpb24ubyk6IERlcGVuZCB1cG9uIE1ha2VmaWxlLCBzbyB0aGF0IHZlcnNpb24ubwotCWdldHMgcmVidWlsdCB3aGVuIG1ha2UgdmFyaWFibGUgVkVSU0lPTiBpcyBjaGFuZ2VkLgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBQcmludCB0aGUgU0VDX05FVkVSX0xPQUQgZmxhZy4KLQotV2VkIEF1ZyAyNCAxMjo0MDowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCi0KLVR1ZSBBdWcgMjMgMTE6MDA6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhci5jIChyYW5saWJfdG91Y2gpOiBEb24ndCB1cGRhdGUgdGhlIGFyY2hpdmUgbWFwIGlmIHRoZXJlIGlzbid0Ci0Jb25lLgotCi1Nb24gQXVnIDIyIDE2OjAyOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYXIuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoaW5hcmNoKTogUmVtb3ZlIHZhcmlhYmxlLgotCShtYXBfb3Zlcl9tZW1iZXJzKTogTWFrZSBzdGF0aWMuICBBZGQgYXJjaCBhcmd1bWVudCwgYW5kIHVzZSBpdAotCWluc3RlYWQgb2YgaW5hcmNoLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShtYWluKTogVHJlYXQgLS12ZXJzaW9uIGFzIC12LiAgQWNjZXB0IC10IGFyZ3VtZW50LiAgQWNjZXB0IGFueQotCW51bWJlciBvZiBhcmNoaXZlIGFyZ3VtZW50cy4gIENhdGNoIGFuZCB1c2Ugb3Blbl9pbmFyY2ggcmV0dXJuCi0JdmFsdWUsIHJhdGhlciB0aGFuIHVzaW5nIGluYXJjaC4KLQkob3Blbl9pbmFyY2gpOiBSZXR1cm4gbmV3bHkgb3BlbmVkIEJGRCwgcmF0aGVyIHRoYW4gdXNpbmcgaW5hcmNoLgotCShkb19xdWlja19hcHBlbmQpOiBNYWtlIGFyY2hpdmVfZmlsZW5hbWUgY29uc3QuCi0JKHdyaXRlX2FyY2hpdmUpOiBBZGQgaWFyY2ggYXJndW1lbnQsIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBpbmFyY2guCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShkZWxldGVfbWVtYmVycywgbW92ZV9tZW1iZXJzLCByZXBsYWNlX21lbWJlcnMpOiBMaWtld2lzZS4KLQkocmFubGliX29ubHkpOiBEb24ndCBleGl0IG9uIHN1Y2Nlc3MuICBDYXRjaCBhbmQgdXNlIG9wZW5faW5hcmNoCi0JcmV0dXJuIHZhbHVlLgotCShyYW5saWJfdG91Y2gpOiBOZXcgZnVuY3Rpb24uCi0JKiBhcnN1cC5oIChtYXBfb3Zlcl9tZW1iZXJzKTogRG9uJ3QgZGVjbGFyZS4KLQkoYXJfZW5kLCBhcl9leHRyYWN0KTogRGVjbGFyZS4KLQkob3Blbl9pbmFyY2gpOiBDaGFuZ2UgcmV0dXJuIHZhbHVlIGluIGRlY2xhcmF0aW9uIHRvIGJmZCAqLgotCSogYXJzdXAuYyAobWFwX292ZXJfbGlzdCk6IE1ha2Ugc3RhdGljLiBBbHdheXMgcGFzcyB0d28gYXJndW1lbnRzCi0JdG8gZnVuY3Rpb24uICBBZGQgYXJjaCBhcmd1bWVudCwgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIGluYXJjaC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGFyX2RpcmVjdG9yeV9kb2VyKTogTWFrZSBzdGF0aWMuICBBZGQgaWdub3JlZCBzZWNvbmQgYXJndW1lbnQuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShhcl9kaXJlY3RvcnkpOiBVc2Ugb3Blbl9pbmFyY2ggcmV0dXJuIHZhbHVlIHJhdGhlciB0aGFuIGluYXJjaC4KLQkoYXJfYWRkbGliX2RvZXIpOiBNYWtlIHN0YXRpYy4KLQkoYXJfYWRkbGliKTogVXNlIG9wZW5faW5hcmNoIHJldHVybiB2YWx1ZSByYXRoZXIgdGhhbiBpbmFyY2guCi0JKGFyX2V4dHJhY3QpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGFiZmQuCi0KLVRodSBBdWcgMTEgMTQ6NTU6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JQWRkIHN1cHBvcnQgZm9yIHJlbW92aW5nIG5hbWVkIHNlY3Rpb25zIHRvIG9iamNvcHkgYW5kIHN0cmlwLgotCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KTogRGVmaW5lLgotCShyZW1vdmVfc2VjdGlvbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzdHJpcF9vcHRpb25zLCBjb3B5X29wdGlvbnMpOiBBZGQgcmVtb3ZlLXNlY3Rpb24uCi0JKGNvcHlfdXNhZ2UsIHN0cmlwX3VzYWdlKTogTWVudGlvbiAtUiBhbmQgLS1yZW1vdmUtc2VjdGlvbi4KLQkoc2V0dXBfc2VjdGlvbik6IElmIHNlY3Rpb24gaXMgaW4gcmVtb3ZlX3NlY3Rpb25zIGxpc3QsIGlnbm9yZSBpdC4KLQkoY29weV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHN0cmlwX21haW4sIGNvcHlfbWFpbik6IEhhbmRsZSAtUi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMSwgc3RyaXAuMTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLVdlZCBBdWcgMTAgMTA6MTk6NTUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IFJlbmFtZSBzeW12YWx1ZSB0byBzeW1fdmFsdWUsCi0Jc28gYXMgbm90IHRvIGNvbmZsaWN0IHdpdGggdGhlIHN5bXZhbHVlIHR5cGVkZWYgaW4gYmZkLmguCi0KLU1vbiBBdWcgIDEgMTM6MTk6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBubG1oZWFkZXIueTogUGVyIGN1cnJlbnQgTmV0V2FyZSBkb2NzLCBhY2NlcHQgYSByZXZpc2lvbiBudW1iZXIKLQlvZiAwIGFuZCB0cmVhdCBhIHJldmlzaW9uIG51bWJlciBncmVhdGVyIHRoYW4gMjYgYXMgMC4KLQotTW9uIEp1bCAyNSAxMjo1ODozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogQ29ycmVjdCBoYW5kbGluZyBvZiBlbmQgb2YKLQlzeW1ib2xzIHdoZW4gbG9va2luZyBmb3IgbmV4dCBzeW1ib2wgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZS4KLQotRnJpIEp1bCAyMiAxNjo0ODozNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBubS5jIChudW1lcmljX2ZvcndhcmQpOiBUcmVhdCB1bmRlZmluZWQgc3ltYm9scyBhcyAibGVzcyB0aGFuIgotCWRlZmluZWQgc3ltYm9scyB3aXRoIHplcm8gdmFsdWVzLiAgSWYgbnVtZXJpYyB2YWx1ZXMgYXJlIGVxdWFsLCBvcgotCWJvdGggc3ltYm9scyBhcmUgdW5kZWZpbmVkLCBzb3J0IGFscGhhYmV0aWNhbGx5LiAgRG9uJ3QgYXNzdW1lCi0JdGhhdCB0aGUgZGlmZmVyZW5jZSBvZiB0d28gYmZkX3ZtYSB2YWx1ZXMgd2lsbCB0cnVuY2F0ZSB0byAiaW50IgotCWFuZCBzdGlsbCBoYXZlIHRoZSBzYW1lIHNpZ24uCi0JKG51bWVyaWNfcmV2ZXJzZSk6IENhbGwgbnVtZXJpY19mb3J3YXJkIGFuZCBuZWdhdGUgdGhlIHJlc3VsdC4KLQkocHJpbnRfc3ltYm9sX2luZm9fYnNkKTogRm9yIHVuZGVmaW5lZCBzeW1ib2xzLCBwcmludCBsZWFkaW5nCi0Jc3BhY2VzIGVxdWl2YWxlbnQgdG8gdGhlIHdpZHRoIG9mIGEgcHJpbnRlZCBiZmRfdm1hLCByYXRoZXIgdGhhbgotCWFzc3VtaW5nIHRoYXQgOCB3aWxsIGxvb2sgcmlnaHQuCi0KLUZyaSBKdWwgMjIgMTA6MzY6NTAgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZmdyb2suYyAoZG9pdCk6ICBaZXJvIGFsbCBmaWVsZHMgb2YgbmV3IHN0cnVjdHVyZS4KLQkqIHNyY29udi5jIChzeXNyb2ZmX3N3YXBfKl9vdXQpOiBSZW1vdmUgcmVkdW5kYW50IHRyYWlsaW5nIGFyZy4KLQkqIHN5c2luZm8ueTogR2VuZXJhdGUgc3lzcm9mZl9zd2FwXypfb3V0IHdpdGhvdXQgcmVxdWlyaW5nIGV4dHJhCi0JYXJnLgotCi1GcmkgSnVsIDIyIDEwOjA5OjUzIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogbmxtaGVhZGVyLnk6IE1ha2UgInN0YWNrIiBhbmQgInN0YWNrc2l6ZSIgc3lub255bXMgaW4gdGhlIGxleGVyCi0JICByYXRoZXIgdGhhbiB0aGUgcGFyc2VyLgotCi1UaHUgSnVsIDIxIDEwOjI1OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWFscGhhb3NmLCBjb25maWcvbWgtYXBvbGxvNjh2LCBjb25maWcvbWgtZGVsdGE4ODoKLQlSZW1vdmU7IG9ic29sZXRlLgotCi1TYXQgSnVsIDE2IDIyOjM0OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzbHVycF9keW5hbWljX3N5bXRhYik6IFRyeSB0byBnZXQgdGhlIGR5bmFtaWMgc3ltYm9scwotCWV2ZW4gaWYgdGhlIGJmZCBpcyBub3QgbWFya2VkIERZTkFNSUMuICBFTEYgZXhlY3V0YWJsZXMgYXJlIG5vdAotCW1hcmtlZCBEWU5BTUlDLCBidXQgZG8gaGF2ZSBkeW5hbWljIHN5bWJvbHMuCi0KLUZyaSBKdWwgMTUgMDE6NDE6MzUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZmdyb2suYyAoZG9fd2hlcmUpOiBNYWtlIGRhdGEgd2l0aCBubyB0eXBlICdpbnQnLgotCShkb19kZWZpbmUpOiAgS2VlcCBpbmZvIG9uIHNvdXJjZSBmaWxlIG9mIGEgc3ltYm9sLgotCSogY29mZmdyb2suaCAoY29mZl9zeW1ib2wpOiBOZXcgZmllbGQuCi0JKiBzcmNvbnYuYyAoUFJPR1JBTV9WRVJTSU9OKTogTm93IDEuMwotCSh3cl9ybCk6IFVzZSBleHRlcm5hbCByZWYgbnVtYmVyIGZvciBzeW1ib2wuCi0JKHdyX2R1cyk6IE9ubHkga2VlcCBvbmUgc291cmNlIGZpbGUgcGVyIGRlYnVnIHVuaXQuCi0JKHdyX2Rsbik6IEFsd2F5cyBlbWl0IGxpbmUgbnVtYmVycyBmb3IgZmlyc3Qgc291cmNlIGZpbGUsCi0JKHdyX2dsb2JhbHMpOiAgRW1pdCBnbG9iYWxzIGluIHRoZSBkdSBvZiB0aGVpciBvd25pbmcgc291cmNlIGZpbGUuCi0KLU1vbiBKdWwgMTEgMTU6NTk6MDMgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBubG1oZWFkZXIueTogTnVsbCB0ZXJtaW5hdGUgdmFyX2hkci0+dGhyZWFkTmFtZS4KLQotRnJpIEp1bCAgOCAxNzozMzoyMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3lzbGV4Lm8sIHN5c2luZm8ubyk6IFBlcm1pdCBDIHNvdXJjZSBmaWxlcyB0byBiZQotCWluICQoc3JjZGlyKSwgYXMgdGhleSB3aWxsIGJlIGZvciBGU0YgcmVsZWFzZXMuCi0KLVdlZCBKdWwgIDYgMDE6MTM6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHNldHVwX3NlY3Rpb25zKTogUHJlc2VydmUgZXhpc3Rpbmcgc2VjdGlvbiBmbGFncyB3aGVuCi0JY29weWluZyBpbiBmbGFncyBmcm9tIGEgbmV3IHNlY3Rpb24uCi0KLVR1ZSBKdWwgIDUgMTU6NTY6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKGNvcHlfZmlsZSk6IElmIG91dHB1dF90YXJnZXQgaXMgTlVMTCwgc2V0IGl0IHRvIHRoZSB0YXJnZXQgb2YgdGhlCi0JaW5wdXQgZmlsZS4KLQotV2VkIEp1biAyOSAxNzoxNzoxNCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobGlua19pbnB1dHMpOiBGaXhlZCBtZW1vcnkgYWxsb2NhdGlvbiBidWcuCi0KLVRodSBKdW4gMjMgMTI6NTI6NDYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSAtLXdpdGgtdGFyZ2V0cyB0byAtLWVuYWJsZS10YXJnZXRzLgotCi1UdWUgSnVuIDIxIDEyOjUzOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN5c2luZm8pOiBEb2VzIG5vdCBkZXBlbmQgdXBvbiAkKEFERExfTElCUykuCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19idWlsZF9zdHVicyk6IERvbid0IGdlbmVyYXRlIHRoZSBQb3dlclBDCi0JTmV0V2FyZSBjdXN0b20gaGVhZGVyOyBubyBsb25nZXIgbmVlZGVkLgotCShwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBDb252ZXJ0IHJlbG9jcyBhZ2FpbnN0IHRoZSB1bmluaXRpYWxpemVkCi0JZGF0YSBzZWN0aW9uIGludG8gcmVsb2NzIGFnYWluc3QgdGhlIGRhdGEgc2VjdGlvbi4KLQotCSogY29uZmlndXJlLmluOiBTZXQgbmxtY29udl9kZWZzIHRvIC1ETkxNQ09OVl9jcHV0eXBlIGZvciBhbGwgdGhlCi0JbmV0d2FyZSB0YXJnZXRzLiAgV3JpdGUgaXQgaW50byBNYWtlZmlsZSBhcyBOTE1DT05WX0RFRlMuCi0JKiBNYWtlZmlsZS5pbiAobmxtY29udi5vKTogUGFzcyAkKE5MTUNPTlZfREVGUykgdG8gJChDQykuCi0JKiBubG1jb252LmM6IE9ubHkgY29tcGlsZSBjb2RlIGZvciBzcGVjaWZpYyBDUFUgdHlwZXMgaWYKLQlOTE1DT05WX2NwdXR5cGUgaXMgZGVmaW5lZC4KLQotCSogbmxtY29udi5jIChtYWluKTogQ2hhbmdlIHVzZXMgb2YgYmZkX2Fic19zZWN0aW9uLCBldGMuLCB0byB1c2UKLQliZmRfYWJzX3NlY3Rpb25fcHRyIG9yIGJmZF9pc19hYnNfc2VjdGlvbiwgZXRjLgotCShpMzg2X21hbmdsZV9yZWxvY3MsIGFscGhhX21hbmdsZV9yZWxvY3MpOiBMaWtld2lzZS4KLQkocG93ZXJwY19idWlsZF9zdHVicyk6IExpa2V3aXNlLgotCSogbm0uYyAoZmlsdGVyX3N5bWJvbHMsIHByaW50X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkobWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMpOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAocmVtb3ZlX3VzZWxlc3Nfc3ltYm9scywgZHVtcF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIHNpemUuYyAoc3lzdl9pbnRlcm5hbF9wcmludGVyKTogTGlrZXdpc2UuCi0KLU1vbiBKdW4gMjAgMTY6NDM6MDMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1BTlBBR0VTKTogUmVtb3ZlICQoREVNQU5HTEVSX1BST0cpLgotCShpbnN0YWxsKTogSW5zdGFsbCBpdCBleHBsaWNpdGx5LCBmcm9tIGJ1aWxkIGRpciwgbm90IHNyY2Rpci4KLQotTW9uIEp1biAyMCAxNjoyOTo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYzogRG9uJ3QgaW5jbHVkZSBlbGYvaW50ZXJuYWwuaC4KLQkoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiBEb24ndCBkZWNsYXJlLgotCShyZWFkX3NlY3Rpb25fc3RhYnMpOiBObyBzcGVjaWFsIGhhbmRsaW5nIGZvciBFTEYuICBBbHdheXMgcmVhZAotCXVzaW5nIEJGRCBzZWN0aW9ucy4KLQotVGh1IEp1biAxNiAxNzoyNToyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IFVOREVSU0NPUkUgaW4gTWFrZWZpbGUgYmFzZWQgb24gcmVzdWx0IG9mCi0JaW52b2tpbmcgY29uZmlnLmJmZCB3aXRoIGEgc2Vjb25kIGFyZ3VtZW50IG9mIGBgXycnLgotCSogTWFrZWZpbGUuaW4gKHVuZGVyc2NvcmUuYyk6IERlcGVuZCB1cG9uIE1ha2VmaWxlLiAgRG9uJ3QgdHJ5IHRvCi0JcnVuICQoQ0MpIGFuZCAkKE5NKSwganVzdCB1c2UgJChVTkRFUlNDT1JFKS4gIENyZWF0ZSB2aWEgdGVtcG9yYXJ5Ci0JZmlsZS4KLQkoZGVtYW5nbGUubyk6IFJlbW92ZSB0YXJnZXQuCi0JKCQoTk1fUFJPRykpOiBEb24ndCBkZXBlbmQgdXBvbiBkZW1hbmdsZS5vLCBhbmQJZG9uJ3QgbGluayBhZ2FpbnN0Ci0JZGVtYW5nbGUuby4gIEl0J3MgaW4gbGliaWJlcnR5IGFueWhvdy4KLQkoY3BsdXMtZGVtLm8pOiBEb24ndCBkZXBlbmQgdXBvbiBkZW1hbmdsZS5vLgotCSogYmludXRpbHMudGV4aTogTWVudGlvbiAtbiBhbmQgLS1uby1zdHJpcC11bmRlcnNjb3JlcyBhcmd1bWVudHMKLQl0byBjKytmaWx0LgotCi1XZWQgSnVuIDE1IDEyOjEwOjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbm0uYyAobG9uZ19vcHRpb25zKTogQWRkIC0tbm8tZGVtYW5nbGUgdG8gdHVybiBvZmYgLS1kZW1hbmdsZSwKLQlhbmQgLS1uby1jcGx1cyBmb3IgTGludXggY29tcGF0aWJpbGl0eS4KLQkodXNhZ2UpOiBNZW50aW9uIC0tbm8tZGVtYW5nbGUuCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCAtLW5vLWRlbWFuZ2xlLgotCi1GcmkgSnVuIDEwIDE1OjQxOjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbm0uYzogSE9TVF82NF9CSVQgd2FzIHJlbmFtZWQgdG8gQkZEX0hPU1RfNjRfQklULgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IE1ha2UgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gdGhlCi0Jc2FtZSBkaXJlY3RvcnkgYXMgdGhlIG91dHB1dCBCRkQsIHNpbmNlIHdlIG1heSBub3QgaGF2ZSB3cml0ZQotCXBlcm1pc3Npb24gb24gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgU2V0IHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUKLQluZXcgZGlyZWN0b3J5IHRvIDA3MDAsIG5vdCAwNzc3LgotCi1Nb24gSnVuICA2IDIxOjM2OjQzIDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBpZiB0aGlzIGlzIGFuIHJzNjAwMCAoYW5kIHdlJ3JlIG5vdCBidWlsZGluZyBmb3IKLQlhbnkgb3RoZXIgYmZkIHRhcmdldHMpIHRoZW4gYnVpbGQgb25seSBubSAoY29sbGVjdCBuZWVkcyBpdCBvbgotCXJzNjAwMC1seW54KS4KLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSBUT09MX1BST0dTIHdoaWNoIHRoZSBsaXN0IG9mIHByb2dyYW1lcyB0bwotCWluc3RhbGwgaW4gJHRvb2xkaXIgLS0gcmVwbGFjZXMgYSBoYXJkLWNvZGVkIGxpc3QuCi0KLUZyaSBKdW4gIDMgMTA6NTk6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfdGFyZ2V0X2xpc3QpOiBSZW1vdmUgdW51c2VkIGxvY2FsIG9rLgotCi1UaHUgTWF5IDI2IDE4OjA1OjUyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1hbHBoYW9zZiAoQ0ZMQUdTKTogRG9uJ3Qgc3BlY2lmeSBib3RoIC1nIGFuZCAtTzsKLQl0aGV5J3JlIG5vdCBjb21wYXRpYmxlIHVuZGVyIG5hdGl2ZSBjYy4gIFVzZSAtTzEgaW5zdGVhZC4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIHRvIGN5Z251cy0yLjQuMS4KLQotCUNoYW5nZXMgZnJvbSBiaW51dGlscy0yLjQgbmV0IHJlbGVhc2U6Ci0KLQkqIE1ha2VmaWxlLmluIChNQU5QQUdFUyk6IFVzZSAkKERFTUFOR0xFUl9QUk9HKS4KLQkoJChERU1BTkdMRVJfUFJPRykuMSk6IEJ1aWxkIGZyb20gY3h4ZmlsdC5tYW4sIHVzaW5nIHNlZC4KLQkqIGN4eGZpbHQubWFuOiBSZW5hbWVkIGZyb20gYysrZmlsdC4xLCByZXBsYWNlZCAiYysrZmlsdCIgd2l0aAotCW1hZ2ljIHRva2VuIHRvIGJlIHJlcGxhY2VkIGJ5IHNlZC4KLQotCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgZm9yIGxhdGVzdCBtYWtlZmlsZS5pbgotCi1GcmkgTWF5IDEzIDIzOjI1OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYnVjb21tLmM6IENoZWNrIEFOU0lfUFJPVE9UWVBFUyByYXRoZXIgdGhhbiBfX1NURENfXy4KLQotVHVlIE1heSAxMCAxODoyMjowNiAxOTk0ICBKYXNvbiBNb2xlbmRhICAgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChjb3B5X3NlY3Rpb24pOiBTZXQgc2VjdGlvbiBzaXplIGNvcnJlY3RseSBpZiB1c2luZwotCWludGVybGVhdmUuCi0KLVNhdCBNYXkgIDcgMTY6NDk6MzYgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBydWxlIGZvciBzeXNpbmZvLmgKLQotRnJpIE1heSAgNiAxMjoxODozMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoU1JDT05WX1BST0cpOiBEZWZpbmUuCi0JKFBST0dTKTogVXNlICQoU1JDT05WX1BST0cpIHRvby4KLQotVGh1IE1heSAgNSAxOTo0MTo0MyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIHN5c2luZm8uYywgc3lzbGV4LmMsIGluIGNhc2UKLQlzb21lb25lIGNvbmZpZ3VyZXMgd2l0aCBgdGFyZ2V0cz1hbGwnLgotCShkaXN0Y2xlYW4pOiBSZW1vdmUgeS4qLgotCShzeXNsZXgubyk6IERlcGVuZCBvbiBzeXNpbmZvLmguCi0JKHN5c2luZm8uYyk6IFJlbmFtZSB5LnRhYi5oIHRvIHN5c2luZm8uaC4KLQkoaW5zdGFsbC1pbmZvKTogRG9uJ3QgdHJ5IHRvIGluc3RhbGwgaW50byAkKGluZm9kaXIpLyQoc3JjZGlyKS4KLQkqIHN5c2xleC5sOiBJbmNsdWRlIHN5c2luZm8uaCwgbm90IHkudGFiLmguCi0KLVRodSBNYXkgIDUgMTE6NTA6NTUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIHN5c2xleC5sICh5eXdyYXApOiBEZWZpbmUgYXMgZnVuY3Rpb24gaWYgbm90IGRlZmluZWQgYXMgYSBtYWNyby4KLQotCSogTWFrZWZpbGUuaW4gKG9iamR1bXAubyk6IERlbGV0ZWQgc3BlY2lhbCBydWxlLgotCSogY29uZmlndXJlLmluOiBEb24ndCBib3RoZXIgYnVpbGRpbmcgQVJDSERFRlMgdmFyaWFibGUgZm9yCi0JTWFrZWZpbGUuCi0JKiBvYmpkdW1wLmMgKEFSQ0hfKik6IERlbGV0ZWQgaGFuZGxpbmcuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYWxsIGBkaXNhc3NlbWJsZXInIGZyb20gb3Bjb2RlcyBsaWJyYXJ5LgotCi1UaHUgTWF5ICA1IDEzOjI4OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBDb3JyZWN0IGhhbmRsaW5nIG9mICQodG9vbGRpcikgYW5kCi0JJChiaW5kaXIpIGJlaW5nIG9uIGRpZmZlcmVudCBkZXZpY2VzLgotCi1GcmkgQXByIDI5IDA5OjUwOjM4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIHN5c2R1bXAuYyAoaDgzMDAsIHNoKTogQWRkIGRlY2xhcmF0aW9ucy4KLQotV2VkIEFwciAyNyAxMToyNToxOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3lzbGV4LCBzeXNpbmZvKTogVXNlIENDX0ZPUl9CVUlMRC4KLQkqIGNvZmZkdW1wLmMsIGNvZmZncm9jLmMsIGNvZmZncm9nLmgsIHNyY29udi5jLCBzeXNkdW1wLmMsCi0Jc3lzcm9mZi5pbmZvOiBNYWpvciBjaGFuZ2VzLgotCi1UdWUgQXByIDI2IDE4OjE4OjI0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChwcmludF9zZWN0aW9uX3N0YWJzKTogSW5kaWNhdGUgdGhlIHN0YWIgaGVhZGVyIHN5bWJvbAotCW1vcmUgY2xlYXJseSwgcHJpbnQgbnVtYmVycyBvZiB1bnJlY29nbml6ZWQgc3RhYiBuX3R5cGUgdmFsdWVzLgotCi1UdWUgQXByIDI2IDE2OjIyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChjb3B5X3NlY3Rpb25zKTogQ29weSBhcmVsZW50IHBvaW50ZXJzLCBub3QgYXJlbGVudHMuCi0KLU1vbiBBcHIgMjUgMTY6MTQ6MzIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlICQoUFJPR1MpIGFuZCB1bmRlcnNjb3JlLmMuCi0KLUZyaSBBcHIgMjIgMTE6MTQ6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHNldHVwX3NlY3Rpb25zKTogUmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb2YgLnJlZ2luZm8KLQlzZWN0aW9uLgotCShjb3B5X3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGFscGhhX21hbmdsZV9yZWxvY3MpOiBVc2UgYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSByYXRoZXIgdGhhbiB0aGUKLQlzcGVjaWFsIEVDT0ZGIC5yZWdpbmZvIHNlY3Rpb24uCi0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBDYWxsIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgYWZ0ZXIKLQljb3B5aW5nIGV2ZXJ5dGhpbmcgZWxzZSwgdG8gbGV0IGl0IGZpZGRsZSB3aXRoIHRoZSBmaWxlIGluIGl0cwotCWZpbmFsIHN0YXRlLgotCi0JKiBvYmpkdW1wLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKGRpc3BsYXlfdGFyZ2V0X2xpc3QpOiBJZiBhIGZvcm1hdCBmYWlscywganVzdCBnbyBvbiB0byB0aGUgbmV4dAotCW9uZS4gIENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfc2V0X2Zvcm1hdC4KLQkoZGlzcGxheV9pbmZvX3RhYmxlKTogTGlrZXdpc2UuICBEb24ndCBpbmNyZW1lbnQgbG9vcCB2YXJpYWJsZSBpbgotCWZvciBsb29wIHRlc3QsIHNpbmNlIHRoYXQgc2tpcHMgdGhlIGZpcnN0IGVsZW1lbnQuCi0JKGRpc3BsYXlfdGFyZ2V0X3RhYmxlcyk6IFJld3JpdGUgbG9vcCBmb3IgY2xhcml0eS4gIEVuc3VyZSB0aGF0IGl0Ci0JYWx3YXlzIHByaW50cyBhdCBsZWFzdCBvbmUgZWxlbWVudC4KLQotCSogbmxtY29udi5jIChtYWluKTogVXNlIEN5R25Vc0V4IHJhdGhlciB0aGFuIEN5R25Vc1NlQ3MgZm9yCi0Jc2VjdGlvbnMgaGVhZGVyLiAgUmVuYW1lIGZyb20gY3lnbnVzX3NlY3Rpb25zIHRvIGN5Z251c19leHQuCi0KLVRodSBBcHIgMjEgMTI6MTI6MjYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKF9EVU1NWV9OQU1FXyk6IERvbid0IGRlZmluZS4KLQkoZGlzcGxheV90YXJnZXRfbGlzdCk6IFVzZSB0bXBuYW0gdG8gZ2V0IGEgZmlsZSBuYW1lIHJhdGhlciB0aGFuCi0JdXNpbmcgX0RVTU1ZX05BTUVfLiAgVW5saW5rIGl0IHdoZW4gZG9uZS4KLQkoZGlzcGxheV9pbmZvX3RhYmxlKTogTGlrZXdpc2UuCi0KLQkqIG5sbWNvbnYuYyAoc2Vjc2VjKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWFpbik6IENyZWF0ZSAubmxtc2VjdGlvbnMgc2VjdGlvbiBpbiBvdXRwdXQgQkZELiAgU3RvcmUKLQlpbmZvcm1hdGlvbiBhYm91dCBpdCBpbiBzZWN0aW9ucyBoZWFkZXIuCi0JKHNldHVwX3NlY3Rpb25zKTogQWxsb2NhdGUgc3BhY2UgaW4gc2VjdGlvbnMgaGVhZGVyLgotCShjb3B5X3NlY3Rpb25zKTogQ29weSB6ZXJvIHNpemVkIHNlY3Rpb25zLiAgUHV0IGluZm9ybWF0aW9uIGFib3V0Ci0JZWFjaCBzZWN0aW9uIGluIHRoZSBzZWN0aW9ucyBoZWFkZXIuCi0KLVdlZCBBcHIgMjAgMTQ6MzQ6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHBvd2VycGNfYnVpbGRfc3R1YnMpOiBUYWtlIG5ldyBvdXRiZmQgYXJndW1lbnQuCi0JQ2hhbmdlIGNhbGxlci4gIENyZWF0ZSBjdXN0b20gaGVhZGVyIGZvciBuZXcgUG93ZXJQQyBOZXRXYXJlCi0JZm9ybWF0LgotCi0JKiBNYWtlZmlsZS5pbiAobmxtaGVhZGVyLm8sIG5sbWNvbnYubyk6IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBubG1jb252LmM6IEluY2x1ZGUgYmZkLmggYW5kIGxpYmliZXJ0eS5oIHdpdGggIiIsIG5vdCA8Pi4KLQkqIG5sbWhlYWRlci55OiBJbmNsdWRlIGJmZC5oIHdpdGggIiIsIG5vdCA8Pi4KLQotV2VkIEFwciAxMyAxMDo1Mjo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYzogRG8gYW4gaWZkZWYgb24gX19HTzMyX18sIG5vdCB1bml4LgotCi1XZWQgQXByICA2IDIxOjU0OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZGVkIC1EICgtLWR5bmFtaWMpIG9wdGlvbiB0byBubSBhbmQgLVQgKC0tZHluYW1pYy1zeW1zKSBhbmQgLVIKLQkoLS1keW5hbWljLXJlbG9jKSBhcmd1bWVudHMgdG8gb2JqZHVtcC4KLQkqIG5tLmMgKGR5bmFtaWMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsb25nX29wdGlvbnMpOiBBZGRlZCAiZHluYW1pYyIuCi0JKHVzYWdlKTogTWVudGlvbiAtRCBhbmQgLS1keW5hbWljLgotCShtYWluKTogQWRkIEQgdG8gZ2V0b3B0IHN0cmluZy4gIEhhbmRsZSAtRCBieSBzZXR0aW5nIGR5bmFtaWMuCi0JKGRpc3BsYXlfcmVsX2ZpbGUpOiBJZiBkeW5hbWljIGlzIG5vbi16ZXJvLCByZWFkIGR5bmFtaWMgc3ltYm9scwotCXJhdGhlciB0aGFuIG5vcm1hbCBzeW1ib2xzLgotCSogbm0uMTogVXBkYXRlZCBmb3IgLUQgKC0tZHluYW1pYykgb3B0aW9uLgotCSogb2JqZHVtcC5jIChkdW1wX2R5bmFtaWNfc3ltdGFiKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoZHVtcF9keW5hbWljX3JlbG9jX2luZm8pOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShkeW5zeW1zLCBkeW5zeW1jb3VudCk6IE5ldyBnbG9iYWwgdmFyaWFibGVzLgotCSh1c2FnZSk6IE1lbnRpb24gLVIsIC1ULCAtLWR5bmFtaWMtc3ltcyBhbmQgLS1keW5hbWljLXJlbG9jLgotCShsb25nX29wdGlvbnMpOiBBZGRlZCAiZHluYW1pYy1yZWxvYyIgYW5kICJkeW5hbWljLXN5bXMiLgotCShzbHVycF9zeW10YWIpOiBJZiBubyBzeW1ib2xzLCByZXR1cm4gcmF0aGVyIHRoYW4gZXhpdC4KLQkoc2x1cnBfZHluYW1pY19zeW10YWIpOiBOZXcgZnVuY3Rpb24uCi0JKGRpc3BsYXlfYmZkKTogSGFuZGxlIGR1bXBfZHluYW1pY19zeW10YWIgYW5kCi0JZHVtcF9keW5hbWljX3JlbG9jX2luZm8uCi0JKGR1bXBfc3ltYm9scyk6IFRha2UgbmV3IGR5bmFtaWMgYXJndW1lbnQsIGluZGljYXRpbmcgd2hldGhlciB0bwotCWRpc3BsYXkgZHluYW1pYyBzeW1ib2xzLgotCShkdW1wX3JlbG9jcyk6IE1vdmUgbW9zdCBwcmludGluZyBpbnRvIGR1bXBfcmVsb2Nfc2V0LgotCShkdW1wX2R5bmFtaWNfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShkdW1wX3JlbG9jX3NldCk6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkIGZyb20gZHVtcF9yZWxvY3MuCi0JKG1haW4pOiBBZGQgUiBhbmQgVCB0byBnZXRvcHQgc3RyaW5nLiAgSGFuZGxlIC1UIGJ5IHNldHRpbmcKLQlkdW1wX2R5bmFtaWNfc3ltdGFiIGFuZCAtUiBieSBzZXR0aW5nIGR1bXBfZHluYW1pY19yZWxvY19pbmZvLgotCSogb2JqZHVtcC4xOiBVcGRhdGVkIGZvciAtUiAoLS1keW5hbWljLXJlbG9jKSBhbmQgLVQKLQkoLS1keW5hbWljLXN5bXMpIG9wdGlvbnMuCi0JKiBiaW51dGlscy50ZXhpOiBVcGRhdGVkIGZvciBuZXcgbm0gYW5kIG9iamR1bXAgb3B0aW9ucy4KLQotV2VkIE1hciAzMCAxNTo1Mjo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlVcGRhdGUgZm9yIHJlY2VudCBCRkQgY2hhbmdlcyB0byBzeW1ib2wgYW5kIHJlbG9jIHJlYWRpbmcuICBSZW5hbWUKLQlhbGwgdXNlcyBvZiBnZXRfc3ltdGFiX3VwcGVyX2JvdW5kIHRvIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLgotCUFsc286Ci0JKiBjb2ZmZ3Jvay5jIChzeW1jb3VudCk6IENoYW5nZSB0byBsb25nLgotCShkb19zZWN0aW9uc19wMSk6IENoZWNrIGZvciBlcnJvciByZXR1cm4gZnJvbQotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQuICBDaGFuZ2UgcmVsY291bnQgdG8gbG9uZywgYW5kIGNoZWNrIGZvcgotCWVycm9yIGZyb20gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkoY29mZl9ncm9rKTogQ2hhbmdlIHN0b3JhZ2UgdG8gbG9uZy4gIENoZWNrIGZvciBlcnJvciBmcm9tCi0JYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCSogbmxtY29udi5jIChtYWluKTogQ2hhbmdlIHN5bWNvdW50LCBuZXdzeW1hbGxvYywgbmV3c3ltY291bnQsIGFuZAotCWkgdG8gbG9uZy4gIENoZWNrIGZvciBlcnJvciBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCShjb3B5X3NlY3Rpb25zKTogQ2hhbmdlIHJlbG9jX3NpemUgYW5kIHJlbG9jX2NvdW50IHRvIGxvbmcuICBDaGVjawotCWZvciBlcnJvciBmcm9tIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkobWFuZ2xlX3JlbG9jcywgaTM4Nl9tYW5nbGVfcmVsb2NzLCBhbHBoYV9tYW5nbGVfcmVsb2NzKTogQ2hhbmdlCi0JcmVsb2NfY291bnRfcHRyIGFyZ3VtZW50IHRvIGxvbmcgKi4gIE1ha2UgY29ycmVzcG9uZGluZyBjaGFuZ2VzIHRvCi0JdmFyaWFibGVzIGxvYWRlZCBmcm9tICpyZWxvY19jb3VudF9wdHIuCi0JKiBubS5jIChkaXNwbGF5X3JlbF9maWxlKTogQ2hhbmdlIHN0b3JhZ2UgYW5kIHN5bWNvdW50IHRvIGxvbmcuCi0JQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IENoYW5nZSBzeW1jb3VudCwgc3JjX2NvdW50IGFuZAotCWRzdF9jb3VudCB0byBsb25nLgotCShjb3B5X29iamVjdCk6IENoYW5nZSBzeW1jb3VudCB0byBsb25nLiAgUGFzcyBhbm90aGVyIGFyZ3VtZW50IHRvCi0JZnByaW50Zi4gIENoZWNrIGZvciBlcnJvcnMgZnJvbSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KLQkoY29weV9zZWN0aW9uKTogQ2hhbmdlIHJlbGNvdW50IHRvIGxvbmcuICBDaGVjayBmb3IgZXJyb3JzIGZyb20KLQliZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCShtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyk6IENoYW5nZSByZWxjb3VudCBhbmQgaSB0byBsb25nLgotCUNoZWNrIGZvciBlcnJvcnMgZm9ybSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKiBvYmpkdW1wLmMgKHN0b3JhZ2UpOiBSZW1vdmUgZ2xvYmFsIHZhcmlhYmxlLgotCShzeW1jb3VudCk6IENoYW5nZWQgdG8gbG9uZy4KLQkoc2x1cnBfc3ltdGFiKTogTmV3IGxvY2FsIHZhcmlhYmxlIHN0b3JhZ2UuICBDaGVjayBmb3IgZXJyb3JzIGZyb20KLQliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKHJlbW92ZV91c2VsZXNzX3N5bWJvbHMpOiBDaGFuZ2UgcmV0dXJuIHZhbHVlIGFuZCBjb3VudCB0byBsb25nLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBDaGFuZ2UgbWluLCBtYXgsIHRoaXNwbGFjZSBhbmQgaSB0byBsb25nLgotCShkaXNhc3NlbWJsZV9kYXRhKTogQ2hhbmdlIGkgdG8gbG9uZy4KLQkoZHVtcF9zeW1ib2xzKTogQ2hhbmdlIGNvdW50IHRvIGxvbmcuCi0JKGR1bXBfcmVsb2NzKTogQ2hhbmdlIHJlbGNvdW50IHRvIGxvbmcuICBDaGVjayBmb3IgZXJyb3JzIGZyb20KLQliZmRfcmV0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCShkaXNwbGF5X2luZm9fdGFibGUpOiBBZGQgY2FzdHMgd2hlbiBwYXNzaW5nIExPTkdFU1RfQVJDSCBmb3IKLQlwcmludGYgJSogYXJndW1lbnQuCi0KLVR1ZSBNYXIgMjkgMTQ6NTk6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubS5jIChkaXNwbGF5X2FyY2hpdmUpOiBDbG9zZSBlYWNoIGFyY2hpdmUgZWxlbWVudCBhZnRlciBpdCBoYXMKLQliZWVuIGRpc3BsYXllZC4KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9maWxlKTogTGlrZXdpc2UuCi0KLU1vbiBNYXIgMjggMTM6MDQ6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBlcnJvciBtZXNzYWdlIHRvIHJlZmVyIHRvIGJmZC9jb25maWcuYmZkCi0JcmF0aGVyIHRoYW4gYmZkL2NvbmZpZ3VyZS5pbi4KLQotU3VuIE1hciAyNyAxNjoyMzozOSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTW9yZSBmaXhlcyBmb3Igb2JqZWN0IGZvcm1hdHMgd2hpY2ggYWxsb3cgbXVsdGlwbGUgc2VjdGlvbnMKLQl3aXRoIHRoZSBzYW1lIG5hbWU6Ci0JKiBvYmpjb3B5LmMgKHNldHVwX3NlY3Rpb24pOiBNYWtlIGEgbmV3IG91dHB1dCBzZWN0aW9uIGV2ZW4gaWYKLQlvbmUgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkoY29weV9zZWN0aW9uKTogVXNlIGlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiByYXRoZXIgdGhhbiB0cnlpbmcKLQl0byBsb29rIHRoZSBvdXRwdXQgc2VjdGlvbiB1cCBieSBpdHMgKHBvc3NpYmx5IG5vbi11bmlxdWUpIG5hbWUuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBMb29rIGZvciBiaW51dGlscy5pbmZvIGluIHRoZQotCWN1cnJlbnQgZGlyZWN0b3J5LCB0aGVuIGluICQoc3JjZGlyKS4gIERvbid0IHVzZSAkPC4KLQotTW9uIE1hciAyMSAxMjo1NTo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogTWFrZSBzdGF0aWMuICBEZWNsYXJlIHdpdGgKLQlwcm90b3R5cGUuICBDaGFuZ2UgdmFyZGlmZiBmcm9tIGludCB0byBiZmRfc2lnbmVkX3ZtYS4gIENvcnJlY3QKLQliaW5hcnkgc2VhcmNoIHRlcm1pbmF0aW9uIGNvbmRpdGlvbi4gIFdoZW4gbG9va2luZyBmb3Igc2FtZQotCXNlY3Rpb24gc3ltYm9sIGluIHJlbG9jYXRhYmxlIGZpbGUsIGhhbmRsZSBmaW5hbCBzeW1ib2wgY29ycmVjdGx5LgotCi1TdW4gTWFyIDIwIDExOjI2OjM2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbjogQXZvaWQgYnVnIGluIGhwdXggc2VkLgotCi0JKiBvYmpjb3B5LmM6IENoYW5nZXMgdG8ga2VlcCBpdCBmcm9tIHN0cmlwcGluZyBzeW1ib2xzIHVzZWQKLQlpbiBvdXRwdXQgcmVsb2NhdGlvbnMuCi0JKG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zKTogTmV3IGZ1bmN0aW9uLiAgTWFyayBzeW1ib2xzCi0JdXNlZCBpbiBvdXRwdXQgcmVsb2NhdGlvbnMgd2l0aCBCU0ZfS0VFUC4KLQkoZmlsdGVyX3N5bWJvbHMpOiBEbyBub3Qgc3RyaXAgc3ltYm9scyBtYXJrZWQgd2l0aCBCU0ZfS0VFUC4KLQkoY29weV9vYmplY3QpOiBSZW9yZGVyIGFjdGlvbnMuICBGaXJzdCBzZXR1cCBzZWN0aW9ucywgdGhlbgotCWJ1aWxkIHRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlLCB0aGVuIGNvcHkgdGhlIHNlY3Rpb24gY29udGVudHMuCi0KLUZyaSBNYXIgMTggMTA6NTM6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhci5jICh3cml0ZV9hcmNoaXZlKTogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBudWxsIGJ5dGUuICBGcm9tCi0JUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KLQotVGh1IE1hciAxNyAxNjoyMDoyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBCdWlsdCBubS5uZXcgYW5kIHN0cmlwLm5ldyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCi0JY29sbGVjdCB3aGVuIC4gaXMgaW4gUEFUSC4KLQkoU1RSSVBfUFJPRyk6IENoYW5nZSBmcm9tIHN0cmlwIHRvIHN0cmlwLm5ldy4KLQkoTk1fUFJPRyk6IENoYW5nZSBmcm9tIG5tIHRvIG5tLm5ldy4KLQkoaW5zdGFsbCk6IFJlbW92ZSB0aGUgLm5ldyB3aGVuIGluc3RhbGxpbmcuCi0KLVdlZCBNYXIgMTYgMTY6Mjc6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKHBvd2VycGNfYnVpbGRfc3R1YnMpOiBTZXQgQlNGX0RZTkFNSUMgZmxhZyBmb3IgZWFjaAotCXN5bWJvbCBmb3Igd2hpY2ggd2UgYnVpbGQgYSBzdHViLgotCShwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBPbmx5IHJlc2V0IFRPQyBwb2ludGVyIGZvciBhIGNhbGwgdG8gYQotCXN5bWJvbCB3aXRoIEJTRl9EWU5BTUlDIGZsYWcgc2V0LgotCi1UdWUgTWFyIDE1IDIzOjA0OjEzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogVXNlIGJmZF9pc19sb2NhbF9sYWJlbCB0byBkZXRlcm1pbmUKLQlpZiBhIHN5bWJvbCByZXByZXNlbnRzIGEgY29tcGlsZXItZ2VuZXJhdGVkIGxvY2FsIGxhYmVsLgotCShjb3B5X29iamVjdCk6IEdpdmUgdGhlIEJGRCBiYWNrZW5kcyBhIGNoYW5jZSB0byBjb3B5IGFueSBwcml2YXRlCi0JYmZkIGRhdGEgZnJvbSB0aGUgaW5wdXQgQkZEIHRvIHRoZSBvdXRwdXQgQkZELgotCShzZXR1cF9zZWN0aW9uKTogR2l2ZSB0aGUgQkZEIGJhY2tlbmRzIGEgY2hhbmNlIHRvIGNvcHkgYW55IHByaXZhdGUKLQlzZWN0aW9uIGRhdGEgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24uCi0KLU1vbiBNYXIgMTQgMTE6MTU6NTggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG9iamNvcHkuYyAobWFuZ2xlX3NlY3Rpb24pOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgotCShzZXR1cF9zZWN0aW9uKTogU2V0IG9zZWN0aW9uIGhlcmUgaW5zdGVhZCBvZiBjYWxsaW5nCi0JbWFuZ2xlIHNlY3Rpb24gdG8gZG8gaXQuCi0KLU1vbiBNYXIgMTQgMTI6MTE6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhci5jICh3cml0ZV9hcmNoaXZlKTogQ2xvc2UgaW5hcmNoIGJlZm9yZSB1bmxpbmtpbmcgaXQuCi0KLUZyaSBNYXIgMTEgMjI6MjA6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKG1haW4pOiBGb3IgUG93ZXJQQywgY2FsbCBwb3dlcnBjX2J1aWxkX3N0dWJzIGFuZAotCXBvd2VycGNfcmVzb2x2ZV9zdHVicy4gIFVzZSBfX0dPVDAsIG5vdCBfX3RvY19zdGFydC4gIEhhbmRsZSBpdCBpZgotCXRoZSBzdGFydCBhbmQgZW5kIHN5bWJvbHMgYXJlIG5vdCBpbiB0aGUgdGV4dCBzZWN0aW9uLgotCShzdHJ1Y3QgcG93ZXJwY19zdHViKTogTmV3IHN0cnVjdCBkZWZpbml0aW9uLgotCShwb3dlcnBjX3N0dWJzLCBwb3dlcnBjX3N0dWJfaW5zbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkocG93ZXJwY19pbml0aWFsX2dvdF9zaXplKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocG93ZXJwY19idWlsZF9zdHVicyk6IE5ldyBmdW5jdGlvbi4KLQkocG93ZXJwY19yZXNvbHZlX3N0dWJzKTogTmV3IGZ1bmN0aW9uLgotCShwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBDbGVhciBleHRyYW5lb3VzIGRhdGEgaW4gLmdvdCBzZWN0aW9uLgotCVJlYXJyYW5nZSByZWxvYyBoYW5kbGluZyB0byBoYW5kbGUgRUxGIHJlbG9jcyB0aGF0IGFyZSBub3QKLQlwYXJ0aWFsX2lucGxhY2UuICBSZXNvbHZlIFBDIHJlbGF0aXZlIHJlbG9jcy4KLQotV2VkIE1hciAgOSAxMzo0ODoxMSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBhci5jIChtb3ZlX21lbWJlcnMpOiBGaXggaXQgc28gdGhhdCB0aGUgYWJpIHBvc2l0aW9uYWwgbW9kaWZpZXJzCi0JZG9uJ3QgZGVsZXRlIGFsbCBhcmNoaXZlIG1lbWJlcnMgZm9sbG93aW5nIHRoZSBpbnNlcnQgcG9pbnQuCi0KLVR1ZSBNYXIgIDggMTM6MTQ6NDMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29mZmdyb2suW2NoXTogTmV3IGZpbGVzLCB1bmRlcnN0YW5kIGNvZmYgb2JqZWN0cy4KLQkqIGNvZmZkdW1wLmM6IFVzZXMgY29mZmdyb2sgdG8gZHVtcCBvdXQgdGhlIGRlYnVnIGluZm8gb2YgYSBjb2ZmCi0JZmlsZS4KLQkqIHN5c3JvZmYuaW5mbzogRGVzY3JpcHRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlLgotCSogc3lzaW5mby55LCBzeXNsZXgubDogUGFyc2UgaW5mbyBmaWxlLCBnZW5lcmF0ZSBhIHJlYWRlciwgd3JpdGVyLAotCWhlYWRlciBmaWxlcyBhbmQgYSBwcmludGVyLgotCSogc3Jjb252LmM6IFVzZXMgY29mZmdyb2suYyBhbmQgc3lzcm9mZi5pbmZvIHRvIGNvbnZlcnQgYSBjb2ZmCi0JZmlsZSB0byBhIFNZU1JPRkYgZmlsZS4KLQotU2F0IEZlYiAyNiAxMzozNToyNiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKGRvX3F1aWNrX2FwcGVuZCk6IFBhZCB3aXRoIGEgZ2VudWluZSBjaGFyYWN0ZXIgMTAsCi0JcmF0aGVyIHRoYW4gd2hhdGV2ZXIgJ1xuJyBtaWdodCBoYXBwZW4gdG8gYmUuCi0KLVR1ZSBGZWIgMjIgMTg6MjU6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKG1haW4pOiBJZ25vcmUgZGVidWdnaW5nIHN5bWJvbHMgd2hlbiBsb29raW5nIGZvcgotCXNwZWNpYWwgc3ltYm9scyBieSBuYW1lLgotCi1TdW4gRmViIDIwIDE4OjQ3OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0KLQlTdXBwb3J0IGZvciBQb3dlclBDIE5ldFdhcmUuCi0JKiBubG1jb252LmMgKG1haW4pOiBGb3IgUG93ZXJQQyBOZXRXYXJlLCBhdXRvbWF0aWNhbGx5IGRlZmluZSB0aGUKLQlzcGVjaWFsIHN5bWJvbHMgX190b2Nfc3RhcnQuCi0JKHNlbGVjdF9vdXRwdXRfZm9ybWF0KTogSGFuZGxlIGJmZF9hcmNoX3Bvd2VycGMuCi0JKG1hbmdsZV9yZWxvY3MpOiBMaWtld2lzZS4KLQkocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgRmViIDE3IDA5OjI4OjIzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXIuYywgYnVjb21tLmMsIG5sbWNvbnYuYywgbm0uYywgb2JqY29weS5jLCBvYmpkdW1wLmMsCi0Jc2l6ZS5jOiBVc2UgYmZkX2dldF9lcnJvciBhbmQgYmZkX3NldF9lcnJvciBhbmQgbmV3IGVycm9yIG5hbWVzLgotCi1GcmkgRmViIDExIDE1OjU0OjUxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChzdHJpcF9tYWluLCBjb3B5X21haW4pOiBBZGQgbWlzc2luZyAnYnJlYWsnIGluIHN3aXRjaC4KLQotTW9uIEZlYiAgNyAxOTo0NTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEhhbmRsZSBiZmRfYXJjaF9wb3dlcnBjLgotCi1TdW4gRmViICA2IDIyOjA4OjIwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3RyaW5ncy5jIG9iamR1bXAuYyBubG1jb252LmMgb2JqY29weS5jIG5tLmMgYXIuYyBzaXplLmMgKG1haW4pOgotCUNhbGwgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lLgotCi1GcmkgRmViICA0IDEwOjQ2OjAxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChmaWx0ZXJfYnl0ZXMpOiBNYWtlIE1FTUhVTksgYSBjaGFyICosIG5vdCBQVFIsIHNvIHdlCi0JY2FuIGRvIGFyaXRobWV0aWMgb24gaXQuCi0KLVRodSBGZWIgIDMgMTQ6MDY6NDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9zdGFicywgcmVhZF9zZWN0aW9uX3N0YWJzLAotCXByaW50X3NlY3Rpb25fc3RhYnMpOiBGdW5jdGlvbnMgYnJva2VuIG91dCBvZiBkdW1wX3N0YWJzXzEuCi0JRnJlZSB0aGUgc3RhYnMgYW5kIHN0cmluZ3Mgd2hlbiBkb25lIHdpdGggdGhlbS4KLQotV2VkIEZlYiAgMiAxMzo0MjoyMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IFVzZSBiZmRfZ2V0X2ZsYXZvdXIgaW5zdGVhZCBvZiBzdHJ1Y3QgbWVtYmVyLgotCSogYXIuYyAocHJpbnRfY29udGVudHMsIGV4dHJhY3RfZmlsZSksIHNpemUuYwotCShwcmludF9iZXJrZWxleV9mb3JtYXQsIHByaW50X3N5c3ZfZm9ybWF0KTogVXNlIGJmZF9nZXRfZmlsZW5hbWUgYW5kCi0JYmZkX215X2FyY2hpdmUgaW5zdGVhZCBvZiBkZXJlZmVyZW5jaW5nIHRoZSBzdHJ1Y3RzIGRpcmVjdGx5LgotCi0JKiBhci5jOiBVc2UgYmZkX2ZhdGFsIGFuZCBiZmRfbm9uZmF0YWwgaW5zdGVhZCBvZiBiZmRfcGVycm9yIGFuZCBleGl0LgotCUluZGVudC4gIFJlbW92ZSBERUZVTnMuCi0KLQkqIG5sbWNvbnYuYyAobWFpbiksIG9iamNvcHkuYyAoY29weV9maWxlKTogUHJpbnQgbWF0Y2hpbmcgZm9ybWF0cwotCWlmIGFtYmlndW91cyBtYXRjaC4KLQkqIG5tLmMgKGRpc3BsYXlfZmlsZSwgZGlzcGxheV9hcmNoaXZlKSwgc2l6ZS5jIChkaXNwbGF5X2JmZCk6Ci0JRWxpbWluYXRlIGdvdG9zLgotCVByaW50IG1hdGNoaW5nIGZvcm1hdHMgaWYgdGhlcmUgaXMgYW4gYW1iaWd1b3VzIG1hdGNoLiAgVXNlCi0JYmZkX25vbmZhdGFsIGluc3RlYWQgb2YgaGFyZGNvZGVkIGVycm9yIG1lc3NhZ2UgaWYgbm90aGluZyBtYXRjaGVzLgotCi0JKiBhcnN1cC5jLCBhci5jLCBvYmpkdW1wLmM6IFVzZSBiZmRfZ2V0X2ZpbGVuYW1lIGluc3RlYWQgb2YKLQlhYmZkLT5maWxlbmFtZS4KLQotCSogbm0uYyAoZGlzcGxheV9hcmNoaXZlKTogTmV3IGZ1bmN0aW9uLCBmcm9tIGNvZGUgaW4gZGlzcGxheV9maWxlLgotCShkaXNwbGF5X3JlbF9maWxlKTogUmVuYW1lZCBmcm9tIGRvX29uZV9yZWxfZmlsZS4KLQotCSogc2l6ZS5jOiBJbmRlbnQuCi0JKGRpc3BsYXlfYXJjaGl2ZSk6IE5ldyBmdW5jdGlvbiBmcm9tIGNvZGUgaW4gZGlzcGxheV9maWxlLgotCShkaXNwbGF5X2ZpbGUpOiBDaGVjayBiZmRfY2xvc2UgZXJyb3IgcmV0dXJuLgotCi0JKiBzdHJpbmdzLmMgKHN0cmluZ3Nfb2JqZWN0X2ZpbGUpOiBDaGVjayBiZmRfY2hlY2tfZm9ybWF0Ci0JZXJyb3IgcmV0dXJuLgotCi0JKiBzdHJpbmdzLmMsIG9iamR1bXAuYywgc2l6ZS5jOiBVc2UgYmZkX25vbmZhdGFsIGluc3RlYWQgb2YgYmZkX3BlcnJvci4KLQotCSogYnVjb21tLmM6IERlbGV0ZSByZWZlcmVuY2VzIHRvIGV4aXRfaGFuZGxlci4gIEl0IHdhc24ndCBzZXQKLQlhbnl3aGVyZSwgYW5kIG5vdyB0aGF0IHdlJ3JlIHVzaW5nIHRoZSBsaWJpYmVydHkgeG1hbGxvYywgaXQKLQl3b3VsZG4ndCBhbHdheXMgZ2V0IGNhbGxlZCBiZWZvcmUgZXhpdGluZy4KLQkobGlzdF9tYXRjaGluZ19mb3JtYXRzKTogRnVuY3Rpb24gbW92ZWQgZnJvbSBvYmpkdW1wLmMuCi0JKiBidWNvbW0uaDogRGVjbGFyZSBpdC4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogTW92ZSBzb21lIHZhcmlhYmxlIGRlY2xzIGNsb3NlciB0bwotCXRoZWlyIHVzZS4gIEFkZCBzb21lIGNvbW1lbnRzLiAgUmVwbGFjZSBhIG5lc3RlZCBibG9jayB3aXRoIGEKLQlyZXR1cm4uCi0KLU1vbiBKYW4gMzEgMTg6NTA6NDEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfdGFyZ2V0X2xpc3QsIGRpc3BsYXlfaW5mb190YWJsZSk6IENoZWNrIHRoYXQKLQl0aGUgYmZkIG9mIHRoZSBkdW1teSBvdXRwdXQgZmlsZSBpcyBub3QgbnVsbC4KLQotV2VkIEphbiAyNiAxMzoxMzoxOCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX2J5dGVzKTogTmV3IGZ1bmN0aW9uLgotCShjb3B5X3NlY3Rpb24pOiBDYWxsIGl0LgotCShjb3B5X29wdGlvbnMsIGNvcHlfdXNhZ2UsIGNvcHlfbWFpbik6IEFkZCAtLWJ5dGUgb3B0aW9uIHRvCi0JYWN0aXZhdGUgaXQuICBBcHByb3ByaWF0ZSB0aGUgLWIgb3B0aW9uICh3aGljaCB3YXMgYW4gdW5kb2N1bWVudGVkCi0Jc3lub255bSBmb3IgLUYpIGZvciBpdCwgYWxzby4gIEFkZCAtLWludGVybGVhdmUsIC1pIG9wdGlvbiBmb3IKLQlhZGRpdGlvbmFsIGNvbnRyb2wuCi0JKHNldHVwX3NlY3Rpb24sIGNvcHlfc2VjdGlvbiwgbWFuZ2xlX3NlY3Rpb24pOiBSZW5hbWVkIHdpdGggbm8gYHMnCi0Jb24gdGhlIGVuZC4KLQkqIG9iamNvcHkuMSwgYmludXRpbHMudGV4aTogRG9jdW1lbnQgdGhlIG5ldyBvcHRpb25zLgotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfdGFyZ2V0X3RhYmxlcywgZGlzcGxheV90YXJnZXRfbGlzdCk6Ci0JTmV3IGZ1bmN0aW9ucyBicm9rZW4gb3V0IG9mIGRpc3BsYXlfaW5mby4KLQlFbGltaW5hdGUgc29tZSBtYWdpYyBjb25zdGFudHMuICBVc2UgbW9yZSBtZWFuaW5nZnVsIHZhcmlhYmxlIG5hbWVzLgotCShkdW1wX2JmZF9oZWFkZXIpOiBOZXcgZnVuY3Rpb24gYnJva2VuIG91dCBvZiBkaXNwbGF5X2JmZC4KLQkoZHVtcF9zZWN0aW9uX2hlYWRlcik6IE5ldyBmdW5jdGlvbiBicm9rZW4gb3V0IG9mIGR1bXBfaGVhZGVycy4KLQkocmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyk6IERvbid0IHNoYWRvdyBnbG9iYWwgdmFyaWFibGUgbmFtZSB3aXRoCi0JcGFyYW1ldGVyLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBGaXggYmFja3dhcmQgdGVzdC4KLQotVHVlIEphbiAyNSAxOTo0MDo1NCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGJ1Y29tbS5jIChwcmludF9hcmVsdF9kZXNjcik6IENoYW5nZSBkZWNsIG9mIGB3aGVuJyB0byB0aW1lX3QuCi0JKiBvYmpkdW1wLmg6IFJlbW92ZWQuCi0KLU1vbiBKYW4gMjQgMTM6Mjk6MDIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfZmlsZSk6IFJlbW92ZSBjYWxsIHRvIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cy4KLQlJdCB3b3VsZCBuZXZlciBiZSBjYWxsZWQuCi0JKGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyk6IFRha2UgYW4gYXJnIGdpdmluZyB0aGUgbGlzdCBvZiBtYXRjaGluZwotCWZvcm1hdHMuCi0JKGRpc3BsYXlfYmZkKTogUGFzcyB0aGUgYXJnLCBhbmQgZ2V0IGl0IGZpbGxlZCBpbiBieSBjYWxsaW5nCi0JYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIGluc3RlYWQgb2YgYmZkX2NoZWNrX2Zvcm1hdC4KLQkoZGlzcGxheV9pbmZvLCBkaXNwbGF5X2luZm9fdGFibGUpOiB0YXJnZXRfdmVjdG9yIHdhcyByZW5hbWVkIHRvCi0JYmZkX3RhcmdldF92ZWN0b3IuCi0KLQkqIGJpbnV0aWxzLnRleGkgKG9iamR1bXApOiBOb3RlIHNvbWUgbGltaXRhdGlvbnMgb2YgLWggc2VjdGlvbgotCWFkZHJlc3MgcHJpbnRpbmcuCi0KLVNhdCBKYW4gMjIgMTY6MjA6NDYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUFMTE9DKTogU2V0IHRvIGVtcHRpbmVzcyBieSBkZWZhdWx0LgotCShBTExfQ0ZMQUdTKTogQWRkIGFuZCB1c2UuCi0JKGFycGFyc2UuaCk6IE1ha2UgaXQgZGVwZW5kIG9uIGFycGFyc2UueS4KLQkqIGFyLmMgKGxpYmJmZC5oKTogRG9uJ3QgcmVxdWlyZSB0byBiZSBpbiAuLi9iZmQuCi0JKiBvYmpkdW1wLmMgKGNvbXApOiBSZW5hbWUgdG8gY29tcGFyZV9zeW1ib2xzLgotCi1GcmkgSmFuIDIxIDIwOjIyOjMwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChsaXN0X21hdGNoaW5nX2Zvcm1hdHMpOiBJZiB0aGUgZmlsZSBmb3JtYXQgaXMgYW1iaWd1b3VzLAotCXByaW50IHRoZSBtYXRjaGluZyBuYW1lcyBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIG9uZS4KLQkoZGlzcGxheV9iZmQpOiBDYWxsIGl0LgotCShkaXNwbGF5X2ZpbGUpOiBDYWxsIGl0LgotCi1GcmkgSmFuIDIxIDE5OjE3OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogU3VwcG9ydCBiZmRfYXJjaF9yczYwMDAuCi0KLU1vbiBKYW4gMTcgMTM6NTc6MjUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHN0YWJfbmFtZSk6IEFsbG9jYXRlIGR5bmFtaWNhbGx5LgotCShzdGFiX3ByaW50KTogVXNlIHBvaW50ZXJzIHRvIHN0cmluZ3MgaW5zdGVhZCBvZiBjaGFyIGFycmF5cy4KLQkoZHVtcF9zdGFicyk6IENoYW5nZSBhbGxvYyBhbmQgaW5pdCBvZiBhcnJheXMgYXBwcm9wcmlhdGVseS4KLQkoZHVtcF9zdGFic18xKTogQWx3YXlzIGRlY2lkZSB3aGV0aGVyIHRvIHByaW50IHN0YWJfbmFtZSBvcgotCXRoZSBzdGFiJ3MgdHlwZSBudW1iZXIsIGlmIHVubmFtZWQuCi0KLUZyaSBKYW4gMTQgMTQ6NDI6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKHN0cmlwX21haW4sIGNvcHlfbWFpbik6IERvbid0IGNsb2JiZXIgdGhlIGlucHV0IGZpbGUKLQlpZiBjb3B5X2ZpbGUgZmFpbHMuCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IFdhcm4gYWJvdXQgYW4gYXR0ZW1wdCB0byB1c2UgYSBzaGFyZWQgbGlicmFyeQotCXdpdGggdW5pbml0aWFsaXplZCBkYXRhLgotCi0JKiBubG1jb252LmMgKHNldHVwX3NlY3Rpb25zKTogTWFrZSBzdXJlIHRoYXQgd2UgYWxpZ24gdGhlCi0Jb3V0cHV0X29mZnNldCBvZiBlYWNoIGlucHV0IHNlY3Rpb24gYXBwcm9wcmlhdGVseS4KLQotVGh1IEphbiAxMyAxNzozMjo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9yZWxvY3MpOiBEb24ndCBjcmFzaCBpZiBzZWN0aW9uIG5hbWUgaXMgTlVMTC4KLQotVHVlIEphbiAxMSAxOTo0NjozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGZpbGVtb2RlLmMgKGZpbGVtb2Rlc3RyaW5nKTogQ29tbWVudGVkIG91dDsgbm90IHVzZWQuCi0JKG1vZGVfc3RyaW5nKTogVXNlIFBPU0lYIGRlZmluaXRpb25zLgotCShmdHlwZWxldCk6IExpa2V3aXNlLgotCShyd3gpOiBSZW1vdmVkOyBubyBsb25nZXIgdXNlZC4KLQkqIGJ1Y29tbS5jOiBJbmNsdWRlIGJ1Y29tbS5oLgotCShiZmRfbm9uZmF0YWwsIGJmZF9mYXRhbCk6IEFyZ3VtZW50IGlzIGNvbnN0LgotCShmYXRhbCk6IE1ha2UgX19TVERDX18gdmVyc2lvbi4KLQkqIGJ1Y29tbS5oIChtb2RlX3N0cmluZyk6IERlY2xhcmUuCi0JKiBNYWtlZmlsZS5pbiAoYnVjb21tLm8pOiBEZXBlbmQgdXBvbiBidWNvbW0uaAotCi1TdW4gSmFuICA5IDEyOjAzOjIwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogYnVjb21tLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogRGVsZXRlZC4KLQkqIGJ1Y29tbS5oICh4bWFsbG9jLCB4cmVhbGxvYyk6IEZpeCBwcm90b3R5cGVzLCB0byBjb3JyZXNwb25kIHRvCi0JbGliaWJlcnR5IHZlcnNpb24gb2YgZnVuY3Rpb25zLgotCi1UaHUgSmFuICA2IDA2OjE4OjE1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aTogQWRkIGEgY2hhcHRlciBzdW1tYXJpemluZyB0aGUgd2F5cyB0byBzZWxlY3QKLQlhc3BlY3RzIG9mIHRoZSB0YXJnZXQgZm9yIGVhY2ggcHJvZ3JhbS4KLQotCSogb2JqZHVtcC5jIChsb25nX29wdGlvbnMsIHVzYWdlKTogQWRkIGxvbmcgZXF1aXZhbGVudHMgZm9yIGFsbAotCXJlbWFpbmluZyBzaG9ydCBvcHRpb25zIHRoYXQgbGFja2VkIHRoZW0uCi0JKiBiaW51dGlscy50ZXhpIG9iamR1bXAuMTogRG9jdW1lbnQgdGhlbS4KLQotCSogc2l6ZS5jICh1c2FnZSk6IFR3ZWFrIHVzYWdlIG1lc3NhZ2UuCi0JKiBzaXplLjE6IEFkZCBtaXNzaW5nIGA9JyBpbiBleGFtcGxlcy4KLQotCSogYmludXRpbHMudGV4aSBzdHJpcC4xIG9iamNvcHkuMSBubG1jb252LjEgb2JqY29weS5jIG5sbWNvbnYuYzoKLQlVc2UgIi0tdGFyZ2V0PWJmZG5hbWUiIGFzIHRoZSBvcHRpb24gdG8gc2VsZWN0IHRoZSBCRkQgdGFyZ2V0LAotCWxpa2Ugbm0gYW5kIHNpemUgYWxyZWFkeSBkby4KLQlSZXNlcnZlICItLWZvcm1hdD1mb3JtYXQiIGZvciB0ZXh0dWFsIG91dHB1dCBzZWxlY3Rpb24gb3B0aW9ucywgYnV0Ci0JZm9yIG5vdyBrZWVwIG9sZCBvcHRpb24gbmFtZXMgYXMgb2Jzb2xldGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0KLQkqIHN0cmluZ3MuYyAobWFpbiwgc3RyaW5nc19vYmplY3RfZmlsZSwgdXNhZ2UpOiBBZGQgLS10YXJnZXQgb3B0aW9uLgotCSogYmludXRpbHMudGV4aSBzdHJpbmdzLjE6IERvY3VtZW50IGl0LgotCi1TYXQgSmFuICAxIDEzOjU4OjI0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAobWFpbik6IEFkZCBcbiBpbiBlcnJvciBtZXNzYWdlLgotCi1UaHUgRGVjIDIzIDEyOjIzOjExIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCWdjYyAtV2FsbCBsaW50OgotCSogYXIuYyAobWFpbik6IFB1dCBwYXJlbnMgYXJvdW5kIGFzc2lnbm1lbnQgdXNlZCBhcyB0cnV0aCB2YWx1ZS4KLQkqIG9iamNvcHkuYyAoc3RyaXBfbWFpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgUmV0dXJuIDAuCi0JKGNvcHlfbWFpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgUmV0dXJuIDAuCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfYmZkKTogRGVjbGFyZSByZXR1cm4gdmFsdWUgYXMgdm9pZC4KLQkoc3RhYl9wcmludCk6IFVzZSAiIiBpbnN0ZWFkIG9mIDAgdG8gaW5pdGlhbGl6ZSBhcnJheS4KLQkoZHVtcF9zdGFic18xKTogUHJpbnQgdm1hIHVzaW5nIHByaW50Zl92bWEuCi0JKGRpc3BsYXlfaW5mbyk6IFB1dCBwYXJlbnMgYXJvdW5kIGFzc2lnbm1lbnQgdXNlZCBhcyB0cnV0aCB2YWx1ZS4KLQkqIHN0cmluZ3MuYyAocHJpbnRfc3RyaW5ncyk6IENhc3QgcHJpbnRmIGFyZ3VtZW50cy4KLQotCSogb2JqY29weS5jIChjb3B5X21haW4pOiBVc2UgY29weV9vcHRpb25zLCBub3Qgc3RyaXBfb3B0aW9ucy4KLQotCSogbmxtaGVhZGVyLnkgKGNvbW1hbmQpOiBXYXJuIGFib3V0IGlsbGVnYWwgZGF0ZSB2YWx1ZXMuCi0KLVdlZCBEZWMgMTUgMTE6MTg6MDMgMTk5MyAgRGF2aWQgSi4gTWFjS2VuemllICAoZGptQGZyb3N0eS5lbmcudW1kLmVkdSkKLQotCSogYnVjb21tLmMgYnVjb21tLmg6IFJ1biB0aHJvdWdoIGluZGVudC4gIERlLWFuc2lkZWNsLWlmeS4KLQkoYmZkX25vbmZhdGFsKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZmF0YWwpOiBDYWxsIGl0LgotCi0JKiBvYmpjb3B5LmMgKHNtYXJ0X3JlbmFtZSk6IERvIGEgY29weSBpZiB0aGUgZGVzdCBmaWxlIGhhcwotCW11bHRpcGxlIGhhcmQgbGlua3MuICBSZW1vdmUgc291cmNlIGZpbGUgb24gc3VjY2Vzc2Z1bCBjb3B5LgotCVRyeSB0byBwcmVzZXJ2ZSBtb2RlIGFuZCBvd25lciBvbiBzdWNjZXNzZnVsIHJlbmFtZS4KLQotCSogb2JqY29weS5jOiBSdW4gdGhyb3VnaCBpbmRlbnQuICBDbGVhbiB1cCBhIGJpdC4KLQlNYWtlIGdsb2JhbCB2YXJpYWJsZXMgc3RhdGljLgotCU1ha2Uge2lucHV0LG91dHB1dH1fe3RhcmdldCxmaWxlbmFtZX0sIHNob3dfdmVyc2lvbiBsb2NhbAotCXRvIHZhcmlvdXMgZnVuY3Rpb25zLgotCU5ldyBnbG9iYWwgdmFyaWFibGUgYHN0YXR1cycgZm9yIGV4aXQgc3RhdHVzLgotCShzdHJpcF9tYWluLCBjb3B5X21haW4pOiBOZXcgZnVuY3Rpb25zIHdpdGggY29kZSBmcm9tIG1haW4uCi0JKG5vbmZhdGFsKTogTmV3IG1hY3JvLiAgVXNlIGl0IGdsb2JhbGx5IGluc3RlYWQgb2YgYmZkX3BlcnJvciBhbmQKLQliZmRfZmF0YWwuCi0KLQkoY29weV9vYmplY3QpOiBDYWxsIG1hbmdsZV9zZWN0aW9ucyB3aXRoIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4KLQkobWFuZ2xlX3NlY3Rpb25zKTogQWRqdXN0IGZvciBuZXcgY2FsbGluZyBjb252ZW50aW9uLgotCi1GcmkgRGVjIDEwIDExOjI4OjExIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtaGVhZGVyLnkgKGNvbW1hbmQpOiBBY2NlcHQgTUFQIGFuZCBGVUxMTUFQIHdpdGhvdXQgYXJndW1lbnRzLgotCSogbmxtY29udi5jIChtYWluKTogQ2hhbmdlIGVycm9yIG1lc3NhZ2UgZm9yIE1BUCBhbmQgRlVMTE1BUC4KLQotVGh1IERlYyAgOSAxNzo0NzoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IFdhcm4gYWJvdXQgaW1wb3J0ZWQgc3ltYm9scyB0aGF0IGFyZSBub3QgaW4KLQl0aGUgSU1QT1JUIGxpc3QgZXZlbiBpZiB0aGUgSU1QT1JUIGtleXdvcmQgaXMgbm90IHVzZWQuCi0KLQkqIG5sbWNvbnYuYyAoZGVidWcsIHVubGlua19vbl9leGl0KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiZGVidWciIGFuZCAibGlua2VyIi4KLQkobWFpbik6IEhhbmRsZSAtZCBhbmQgLWwgYXJndW1lbnRzLiAgTWFrZSBjb21tYW5kIGxpbmUgaW5wdXQgYW5kCi0Jb3V0cHV0IGZpbGVzIG9wdGlvbmFsLiAgUGFyc2UgdGhlIGNvbW1hbmQgZmlsZSBiZWZvcmUgb3BlbmluZyB0aGUKLQlCRkQncywgd2hpY2ggcmVxdWlyZXMgc3RvcmluZyBtb3JlIGluZm9ybWF0aW9uIGluIGxvY2FsIHZhcmlhYmxlcy4KLQlJZiBJTlBVVCBuYW1lcyBtdWx0aXBsZSBmaWxlcywgbGluayB0aGVtIHRvZ2V0aGVyLiAgVXNlIE9VVFBVVCBmb3IKLQl0aGUgb3V0cHV0IGZpbGUgbmFtZSBpZiBub3QgbmFtZWQgb24gY29tbWFuZCBsaW5lLgotCShzaG93X3VzYWdlKTogQ2hhbmdlZCBmb3IgbmV3IG9wdGlvbnMuCi0JKGxpbmtfaW5wdXRzKTogTmV3IGZ1bmN0aW9uIHRvIGF1dG9tYXRpY2FsbHkgaW52b2tlIGxpbmtlciB0bwotCWhhbmRsZSBtdWx0aXBsZSBJTlBVVCBmaWxlcy4KLQkoY2hvb3NlX3RlbXBfYmFzZV90cnksIGNob29zZV90ZW1wX2Jhc2UsIHBleGVjdXRlKTogTmV3IGZ1bmN0aW9ucywKLQltb3N0bHkgY29waWVkIGZyb20gZ2NjL2djYy5jLgotCSogbmxtY29udi5oIChpbnB1dF9maWxlcywgb3V0cHV0X2ZpbGUpOiBEZWNsYXJlLgotCSogbmxtaGVhZGVyLnkgKGlucHV0X2ZpbGVzLCBvdXRwdXRfZmlsZSk6IERlZmluZS4KLQkoY29tbWFuZCk6IFN1cHBvcnQgSU5QVVQgd2l0aCBhIHN0cmluZ19saXN0IGFyZ3VtZW50LiAgU3VwcG9ydAotCU9VVFBVVC4KLQkoc3RyaW5nX2xpc3QpOiBSZW5hbWVkIGZyb20gbW9kdWxlX2xpc3QuCi0JKiBNYWtlZmlsZS5pbiAobmxtY29udi5vKTogRGVmaW5lIExEX05BTUUgYmFzZWQgb24KLQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lLgotCi1XZWQgRGVjICA4IDEwOjA5OjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtaGVhZGVyLnkgKG5sbWhlYWRlcl9pZGVudGlmeSk6IE5ldyBmdW5jdGlvbi4gIFVzZSBpdCB0byBwcmludAotCXRoZSBwcm9ncmFtIG5hbWUganVzdCBvbmNlLCBpbnN0ZWFkIG9mIHdpdGggZXZlcnkgZXJyb3IgbWVzc2FnZS4KLQotTW9uIERlYyAgNiAxNjoxMTozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobG9uZ19vcHRpb25zKTogQ2hhbmdlZCAtLWhlYWRlci1pbmZvIHRvIC0taGVhZGVyLWZpbGUKLQl0byBtYXRjaCBkb2N1bWVudGF0aW9uIGFuZCB1c2FnZSBtZXNzYWdlLgotCi1TdW4gRGVjICA1IDAxOjMxOjAxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfcmVsb2NzKTogQXZvaWQgZGVyZWZlcmVuY2luZyBhIE5VTEwgc3ltX3B0cl9wdHIKLQlpbiBhIHJlbG9jYXRpb24uCi0KLVRodSBEZWMgIDIgMTY6MDA6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKG1haW4pOiBDaGFuZ2UgdmFyaW91cyB0eXBlcyBmcm9tIGJmZF9zaXplX3R5cGUgdG8KLQlzaXplX3QsIHNpbmNlIHRoZXkgaGF2ZSB0byBiZSBhcmd1bWVudHMgdG8gZnJlYWQgYW5kIGZ3cml0ZS4KLQlDaGFuZ2Ugc2V0IGZyb20gY2hhciAqIHRvIHVuc2lnbmVkIGNoYXIgKi4KLQkoc2VsZWN0X291dHB1dF9mb3JtYXQpOiBNYWtlIG1hY2ggYXJndW1lbnQgdW5zaWduZWQuICBIYW5kbGUKLQliZmRfYXJjaF9hbHBoYS4KLQkoc2V0dXBfc2VjdGlvbnMpOiBEb24ndCBjb3B5IHRoZSAucmVnaW5mbyBzZWN0aW9uIG9mIGFuIEVDT0ZGCi0JZmlsZS4gIENhbGwgYmZkX3NldF9yZWxvYyB0byBpbml0aWFsaXplIHRoZSByZWxvY2F0aW9uIGZpZWxkcy4KLQkoY29weV9zZWN0aW9ucyk6IERvbid0IGNvcHkgdGhlIC5yZWdpbmZvIHNlY3Rpb24gb2YgYW4gRUNPRkYgZmlsZS4KLQlDb21iaW5lIGFsbCByZWxvY3MgZm9yIGEgc2VjdGlvbi4KLQkobWFuZ2xlX3JlbG9jcyk6IENoYW5nZSB0eXBlIG9mIHJlbG9jcyB0byBwZXJtaXQgc3BlY2lmaWMKLQlmdW5jdGlvbnMgdG8gY2hhbmdlIGl0LiAgQ2FsbCBhbHBoYV9tYW5nbGVfcmVsb2NzIGZvciBhbHBoYSwKLQlkZWZhdWx0X21hbmdsZV9yZWxvY3MgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMuCi0JKGRlZmF1bHRfbWFuZ2xlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4gIEFkanVzdCB0aGUgYWRkcmVzcyBvZiBhbGwKLQlyZWxvY3MgYnkgdGhlIG91dHB1dF9vZmZzZXQuCi0JKGkzODZfbWFuZ2xlX3JlbG9jcyk6IENoYW5nZSB0eXBlIG9mIHJlbG9jcyBhcmd1bWVudC4gIENhc3QgbGVuZ3RoCi0JYXJndW1lbnQgdG8gbWVtbW92ZSB0byBzaXplX3QuCi0JKGFscGhhX21hbmdsZV9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0KLVdlZCBOb3YgMTcgMTc6Mzg6NTggMTk5MyAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoc2VsZWN0X291dHB1dF9mb3JtYXQpOiBVc2UgbmxtMzItc3BhcmMgZm9yCi0JYmZkX2FyY2hfc3BhcmMuCi0KLVdlZCBOb3YgMTcgMTQ6NDE6MzUgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAdGhlcHViLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBubG1jb252LjE6ICAgYWRkZWQgbWFuIHBhZ2UKLQkqIG9iamNvcHkuMTogICBmaXhlZCBmb3JtYXQgZXJyb3JzCi0KLVdlZCBOb3YgMTcgMTI6MDM6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogVXNlIENGTEFHUyBhcyB3ZWxsIGFzIExERkxBR1Mgd2hlbiBsaW5raW5nLgotCi1XZWQgTm92IDE3IDA0OjUwOjU1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3RyaW5ncy4xOiBGaXggdHlwby4KLQotTW9uIE5vdiAxNSAxMjowMzoyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBCdWlsZCAiaW5mbyIuCi0JKFZFUlNJT04pOiBVcGRhdGVkIHRvIGN5Z251cy0yLjMuMTsgMi4zIGhhcyBnb25lIG91dC4KLQotU3VuIE5vdiAxNCAwMDoyNzoyNCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogb2JqZHVtcC5jIChkdW1wX3N0YWJzKTogSGFuZGxlIHN0YWJzLWluLXNvbSBhcyBpbXBsZW1lbnRlZAotCWJ5IHRoZSBuZXcgQkZEIFNPTSBhc3NlbWJsZXIuCi0KLVNhdCBOb3YgMTMgMDc6MTQ6MDUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhci4xIGMrK2ZpbHQuMSBubS4xIG9iamNvcHkuMSBvYmpkdW1wLjEgcmFubGliLjEgc2l6ZS4xCi0Jc3RyaW5ncy4xIHN0cmlwLjE6IFJlcGxhY2UgXChlbSBpbiBOQU1FIHNlY3Rpb24gd2l0aCBcLSBzbwotCW1ha2V3aGF0aXMgY2FuIGdyb2sgaXQuCi0KLVR1ZSBOb3YgIDkgMTU6MjI6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKGkzODZfbWFuZ2xlX3JlbG9jcyk6IEFkanVzdCByZWxvYyBhZGRyZXNzIGJ5Ci0Jc2VjdGlvbiBvdXRwdXRfb2Zmc2V0LgotCi1GcmkgTm92ICA1IDEyOjExOjUyIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpOiAgYWRkZWQgbmxtY29udiBjaGFwdGVyCi0KLVdlZCBOb3YgIDMgMTY6MTA6NTAgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBSVU5URVNURkxBR1MgdG8gUlVOVEVTVF9GTEFHUwotCi1XZWQgTm92ICAzIDE1OjA5OjIzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRG9uJ3QgZ2V0IHJpZCBvZiBkdmkgb3IgaW5mbyBmaWxlcy4KLQotVHVlIE5vdiAgMiAxMzoyOTo1OSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoU19JU0xOSyk6IERlZmluZSBhcyAwIGlmIHRoZXJlJ3Mgbm8gU19JRkxOSy4KLQotRnJpIE9jdCAyOSAxNjowMjozNCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGk6IE1vdmUgb2JqY29weSBkb2NzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLgotCi0JKiBvYmpkdW1wLmM6IFVzZSB4bWFsbG9jIGluc3RlYWQgb2YgbWFsbG9jLgotCi1GcmkgT2N0IDI5IDExOjExOjE0IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChpbmZvKTogUmVuYW1lIHRvIGZvcm1hdHNfaW5mby4KLQkoZHVtcF9zdGFic18xKTogQmV0dGVyIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nLgotCi1UaHUgT2N0IDI4IDE5OjQzOjE2IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAobWFpbik6IEFsd2F5cyBjcmVhdGUgdGhlIGFyY2hpdmUgd2hlbiBxdWljayBhcHBlbmRpbmcsCi0JZXZlbiBpZiBubyBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gZ2l2ZW4uCi0KLVdlZCBPY3QgMjcgMTI6MDM6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKG1haW4pOiBTZXQgc2hhcmVkRGVidWdSZWNvcmRPZmZzZXQgYW5kCi0Jc2hhcmVkRGVidWdSZWNvcmRDb3VudCBmaWVsZHMgaW4gZXh0ZW5kZWQgaGVhZGVyLgotCi0JKiBubG1jb252LmMgKG1haW4pOiBGb3JjZSBtb2R1bGVOYW1lIGZpZWxkIHRvIHVwcGVyIGNhc2UuCi0KLU1vbiBPY3QgMjUgMTY6NDU6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKG1haW4pOiBHaXZlIGEgdXNhZ2UgbWVzc2FnZSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkKLQlhcmd1bWVudHMuCi0KLU1vbiBPY3QgMjUgMTA6Mzc6MDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBSZXdyaXRlIHRvIHRha2UgYWR2YW50YWdlIG9mIFZQQVRILAotCXNvIEZTRiBkaXN0cmlidXRpb25zICh3aXRoIGluZm8gZmlsZXMgaW4gJChzcmNkaXIpKSBpbnN0YWxsCi0JcHJvcGVybHkuCi0JKERJU1RTVFVGRik6IEJ1aWxkIG5sbWhlYWRlci5jIHRvby4KLQotRnJpIE9jdCAyMiAxMTo0MzoyMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAocHJvZ3JhbV9uYW1lKTogRG9uJ3QgZGVmaW5lIGhlcmUuCi0JKiBvYmpkdW1wLmM6IEluY2x1ZGUgImJ1Y29tbS5oIi4KLQkoeG1hbGxvYyk6IERvbid0IGRlY2xhcmUgaGVyZS4KLQkocHJvZ3JhbV9uYW1lKTogRG9uJ3QgZGVmaW5lIGhlcmUuCi0JKHByb2dyYW1fdmVyc2lvbik6IEZpeGVkIHR5cGUgaW4gZGVjbGFyYXRpb24uCi0JKiBzaXplLmM6IEluY2x1ZGUgImJ1Y29tbS5oIi4KLQkocHJvZ3JhbV9uYW1lKTogRG9uJ3QgZGVjbGFyZSBoZXJlLgotCi1GcmkgT2N0IDIyIDE0OjEwOjQxIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZnByaW50Zik6IGhpZGUgZGVjbGFyYXRpb24gaW4gRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVECi0KLUZyaSBPY3QgIDEgMTI6NDM6MDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKGkzODZfbWFuZ2xlX3JlbG9jcyk6IFJlc29sdmUgYW5kIHJlbW92ZSBQQyByZWxhdGl2ZQotCXJlbG9jcyBhZ2FpbnN0IGRlZmluZWQgc3ltYm9scyBpbiB0aGUgc2FtZSBzZWN0aW9uLgotCi1UaHUgU2VwIDMwIDE2OjQ2OjI2IDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChiaW51dGlscy5kdmkpOiB1c2UgVEVYSURJUiB0byBmaW5kIHRleGluZm8udGV4Ci0KLVNhdCBTZXAgMjUgMTg6MDk6MjkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKHNpbXBsZV9jb3B5LCBzbWFydF9yZW5hbWUpOiBOZXcgZnVuY3Rpb25zLgotCShtYWluKTogVXNlIHRoZW0uCi0KLUZyaSBTZXAgMjQgMTU6Mzg6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4sIGRpc3RjbGVhbik6IFJlY3Vyc2UgaW50byB0ZXN0c3VpdGUuCi0KLVRodSBTZXAgMjMgMDE6MDU6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKHNldHVwX3NlY3Rpb25zLCBjb3B5X3NlY3Rpb25zKTogSWYgc3RyaXBwaW5nLCBkb24ndAotCWNvcHkgU0VDX0RFQlVHR0lORyBzZWN0aW9ucy4KLQkqIG9iamR1bXAuYyAoZHVtcF9oZWFkZXJzKTogUHJpbnQgU0VDX0RFQlVHR0lORyBmbGFnLgotCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogTWVudGlvbiAtLXN0YWJzLgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogQ29weSBhbGwgYXBwbGljYWJsZSBmaWxlIGZsYWdzLgotCShjb3B5X2ZpbGUpOiBEb24ndCBjb3B5IEVYRUNfUCBzcGVjaWFsbHkgaGVyZS4KLQotTW9uIFNlcCAyMCAxOToyODo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IEFkanVzdCBkYXRhIHNlY3Rpb24gc2l6ZSB0byBjb3JyZXNwb25kIHRvIGJzcwotCWFsaWdubWVudCBhZGp1c3RtZW50LiAgQ2xlYXIgQlNGX1NFQ1RJT05fU1lNIGlmIHN5bWJvbCBpcyBtb3ZlZCB0bwotCWEgZGlmZmVyZW50IHNlY3Rpb24uICBVc2UgdGltZV90IGZvciB0aW1lIHZhcmlhYmxlLgotCShzZXR1cF9zZWN0aW9ucyk6IE9ubHkgcHV0IHNlY3Rpb25zIHdpdGggY29udGVudHMgaW4gb3V0cHV0IE5MTS4KLQkoaTM4Nl9tYW5nbGVfcmVsb2NzKTogTm8gc3ltYm9scyBhcmUgY29tbW9uIGF0IHRoaXMgcG9pbnQuICBBZGQKLQljYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQotRnJpIFNlcCAxMCAxMTowMDo0MCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYzogTWFkZSB0aGUgLS1zdGFicyBvcHRpb24gd29yayBmb3Igc3RhYnMtaW4tY29mZi4KLQkoRUxGX1NUQUJfRElTUExBWSk6IFJlbW92ZWQuCi0JKGR1bXBfZWxmX3N0YWJzKTogUmVuYW1lZCB0byBkdW1wX3N0YWJzLCBjaGFuZ2VkIHRvIHJ1biBmb3IKLQlhbnkgb2JqZWN0IGZpbGUgZm9ybWF0LgotCShkdW1wX2VsZl9zdGFic18xKTogUmVuYW1lZCB0byBkdW1wX3N0YWJzXzEsIGFkZGVkIGNhbGxzIHRvCi0JZ2VuZXJpYyBCRkQgcm91dGluZXMgZm9yIG5vbi1FTEYgY2FzZSwgY2hhbmdlZCBmb3JtYXQgb2YgbWVzc2FnZQotCWZvciBuby1zZWN0aW9uLWZvdW5kIGNhc2UuCi0JKGRpc3BsYXlfYmZkKTogQWx3YXlzIGNhbGwgZHVtcF9zdGFicyBpZiByZXF1ZXN0ZWQuCi0JKGR1bXBfZGF0YSk6IENhbGwgYmZkX3NlY3Rpb25fc2l6ZSB0byBnZXQgc2VjdGlvbiBzaXplLgotCi1GcmkgU2VwIDEwIDA4OjEyOjIzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBwdXQgc3RyaW5ncyBpbiB0b29sZGlyL2Jpbi4KLQotTW9uIFNlcCAgNiAxNTozOTowNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAodG90YWxfYnNzX3NpemUpOiBSZW1vdmVkLgotCShtYWluKTogU2V0IHRoZSBic3Mgdm1hIHRvIGFsd2F5cyBmb2xsb3cgdGhlIGRhdGEgc2VjdGlvbi4gIE1vdmUKLQlzeW1ib2xzIGludG8gbmV3IHNlY3Rpb25zLCBhbmQgYWRqdXN0IHZhbHVlcyBieSBvdXRwdXRfb2Zmc2V0LgotCShzZXR1cF9zZWN0aW9ucyk6IERvbid0IGNvcHkgYWxsIHNlY3Rpb25zLCBidXQgaW5zdGVhZCBwb2ludCBhbGwKLQl0ZXh0IHNlY3Rpb25zIHRvIC50ZXh0LCBhbGwgZGF0YSBzZWN0aW9ucyB0byAuZGF0YSwgYW5kIGFsbCBic3MKLQlzZWN0aW9ucyB0byAuYnNzLgotCShjb3B5X3NlY3Rpb25zKTogQWRqdXN0IGFjY29yZGluZ2x5LgotCi1UaHUgU2VwICAyIDEyOjM0OjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCU9ubHkgYnVpbGQgbmxtY29udiBpZiBjb25maWd1cmVkIGZvciBhIE5ldFdhcmUgdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBJZiB3ZSBoYXZlIHNvbWUgKi0qLW5ldHdhcmUqIHRhcmdldCwgb3IgYXJlIHVzaW5nCi0JYWxsIHRhcmdldHMsIHNldCBCVUlMRF9OTE1DT05WIHRvICQoTkxNQ09OVl9QUk9HKSBpbiBNYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmluIChQUk9HUyk6IFVzZSAkKEJVSUxEX05MTUNPTlYpIHJhdGhlciB0aGFuCi0JJChOTE1DT05WX1BST0cpLgotCi1UdWUgQXVnIDMxIDE0OjEzOjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChBUkNIX2FsbCk6IERlZmluZSBBUkNIX2hwcGEgdG9vLgotCShkdW1wX2hlYWRlcnMpOiBEb24ndCB0ZXN0IGZvciBTRUNfQkFMSUdOIGlmIGl0J3Mgbm90IGRlZmluZWQgYnkKLQliZmQuaC4KLQotVHVlIEF1ZyAzMSAxMzoyOToxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IEZvcmNlIGNyZWF0aW9uIG9mIC5ic3Mgc2VjdGlvbi4gIFNldCB1cCB0aGUKLQlzZWN0aW9ucyBiZWZvcmUgbG9va2luZyBhdCB0aGUgc3ltYm9scy4gIE1vdmUgYWxsIGNvbW1vbiBzeW1ib2xzCi0JaW50byAuYnNzIHNlY3Rpb24uICBBdXRvbWF0aWNhbGx5IGRlZmluZSBfZWRhdGEgYW5kIF9lbmQuICBPbmx5Ci0JZXhwb3J0IHN5bWJvbHMgaW4gdGhlIGV4cG9ydCBsaXN0LCB3aXRoIG11bHRpcGxlIHByZWZpeGVzIGlmCi0JbmVjZXNzYXJ5LiAgV2FybiBpZiBubyB2ZXJzaW9uLiAgQWx3YXlzIGNyZWF0ZSBleHRlbmRlZCBoZWFkZXIuCi0JU2V0IGRhdGUgYXV0b21hdGljYWxseSBpZiBub3QgYWxyZWFkeSBzZXQuCi0JKHNldHVwX3NlY3Rpb25zKTogQ291bnQgc2l6ZSBvZiBic3Mgc2VjdGlvbnMuCi0JKG1hbmdsZV9yZWxvY3MsIGkzODZfbWFuZ2xlX3JlbG9jcyk6IEFjY2VwdCBzZWN0aW9uIGFyZ3VtZW50LCBhbmQKLQl0YWtlIHJlbG9jX2NvdW50IGFzIGEgY2hhbmdlYWJsZSBwb2ludGVyOyBjaGFuZ2VkIGNhbGxlcnMuCi0JKGkzODZfbWFuZ2xlX3JlbG9jcyk6IFJlbW92ZSBQQyByZWxhdGl2ZSByZWxvY3Mgd2l0aGluIGEgc2VjdGlvbiwKLQlhcyB0aGV5IHJlcXVpcmUgbm8gYWRqdXN0bWVudC4KLQkqIG5sbWhlYWRlci55OiBGaXhlZCBtZW1vcnkgYWxsb2NhdGlvbiB0aHJvdWdob3V0OiB0b2tlbiBTVFJJTkcgaXMKLQlub3cgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCBhbmQgZnJlZWQgaWYgbm90IG5lZWRlZC4gIE51bGwKLQl0ZXJtaW5hdGVkIGNvcHlyaWdodCBtZXNzYWdlLiAgQWNjZXB0IHZlcnNpb24gd2l0aCBvbmx5IHR3bwotCXN0cmluZ3MuCi0JKHN5bWJvbF9saXN0X29wdCk6IE5ldyBub250ZXJtaW5hbCwgZWl0aGVyIHN5bWJvbF9saXN0IG9yIGVtcHR5LgotCShzeW1ib2xfbGlzdCk6IFVzZSBsZWZ0IHJlY3Vyc2lvbiB0byBhdm9pZCBvdmVyZmxvd2luZyBwYXJzZXIKLQlzdGFjay4KLQkoeXlsZXgpOiBSZWFycmFuZ2VkIGJlZ2lubmluZyBvZiBsaW5lIGNoZWNrLiAgQWNjZXB0IHF1b3RlZAotCXN0cmluZ3MgdXNpbmcgc2luZ2xlIHF1b3Rlcy4gIEVuZCBnZW5lcmljIGFyZ3VtZW50IGF0IGNvbW1lbnQKLQljaGFyYWN0ZXIgb3IgcGFyZW50aGVzZXMuCi0JKHN0cmluZ19saXN0X2FwcGVuZCk6IEZpeGVkLgotCShzdHJpbmdfbGlzdF9hcHBlbmQxKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBidWNvbW0uaDogVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHhyZWFsbG9jIGlzIFBUUiwgbm90IGNoYXIgKi4KLQkqIGJ1Y29tbS5jICh4cmVhbGxvYyk6IFVzZSBQVFIgcmF0aGVyIHRoYW4gY2hhciAqLgotCSogTWFrZWZpbGUuaW4gKG9iamR1bXAubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5zdGF0dXMgdG8gbm90aWNlCi0JLS13aXRoLXRhcmdldHMgY2hhbmdlcy4KLQkobmxtY29udi5vKTogRGVwZW5kIHVwb24gYnVjb21tLmguCi0KLVR1ZSBBdWcgMTcgMDk6NDY6MDEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHBhc3MgY3B1IHRvIGNvbmZpZy5iZmQuCi0KLVRodSBBdWcgMTIgMTY6NDM6MDQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoJChOTV9QUk9HKSk6IERlcGVuZCBvbiBkZW1hbmdsZS5vLgotCShkZW1hbmdsZS5vKTogTmV3IHRhcmdldC4KLQkoY3BsdXMtZGVtLm8pOiBEZXBlbmQgb24gaXQsIHRvIGZvcmNlIGNvbXBpbGF0aW9uIG9yZGVyIHdoZW4gZG9pbmcKLQlwYXJhbGxlbCBjb21waWxlcy4KLQotCSogbm0uYyAocHJpbnRfc3ltYm9sX2luZm9fe2JzZCxzeXN2LHBvc2l4fSk6IFRha2UgYSBiZmQgYXJnLgotCShzdHJ1Y3Qgb3V0cHV0X2ZucyBwcmludF9zeW1ib2xfaW5mbyk6IERpdHRvLgotCShsb25nX29wdGlvbnMsIHVzYWdlLCBtYWluKTogQWRkIC1DIC0tZGVtYW5nbGUgb3B0aW9uLgotCShwcmludF9zeW1uYW1lKTogTmV3IGZ1bmN0aW9uLCBkZW1hbmdsaW5nIGlmIHJlcXVlc3RlZC4KLQkocHJpbnRfc3ltYm9scywgcHJpbnRfc3ltYm9sX2luZm9fe2JzZCxzeXN2LHBvc2l4fSk6IFVzZSBpdC4KLQotV2VkIEF1ZyAxMSAyMjo1NzoyMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBQdXQgQ0ZMQUdTIGxhc3QgaW4gY29tcGlsYXRpb24gcnVsZXMgYW5kIG9taXQgZnJvbQotCWxpbmtpbmcgcnVsZXMuICBVc2UgQVJDSERFRlMgdG8gY29tcGlsZSBvYmpkdW1wLmMuCi0JVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIGNvbmZpZ3VyZS5pbjogQ29uc3RydWN0IEFSQ0hERUZTIGJhc2VkIG9uIHRoZSBCRkQgdGFyZ2V0IG1ha2VmaWxlCi0JZnJhZ21lbnRzLgotCSogb2JqZHVtcC5jOiBDb25kaXRpb25hbGl6ZSBjYWxscyB0byB0aGUgcHJpbnRfaW5zbl9BUkNIIGZ1bmN0aW9ucwotCWFjY29yZGluZyB0byBBUkNIREVGUy4KLQotVGh1IEF1ZyAxMiAwODowNjoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFyLmM6IFJlbW92ZWQgb2Jzb2xldGUgYW5kIG5vbi1mdW5jdGlvbmFsIEdOVTk2MCBjb2RlLgotCi1XZWQgQXVnIDExIDEzOjA4OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2l6ZS5jIChiZXJrZWxleV9zdW0pOiBOZXcgZnVuY3Rpb24uCi0JKGJzc3NpemUsIGRhdGFzaXplLCB0ZXh0c2l6ZSk6IE5ldyBnbG9iYWwgdmFyaWFibGVzLgotCShic3Nfc2VjdGlvbl9uYW1lLCBkYXRhX3NlY3Rpb25fbmFtZSwgdGV4dF9zZWN0aW9uX25hbWUpOiBSZW1vdmVkLgotCShwcmludF9iZXJrZWxleV9mb3JtYXQpOiBNYXAgYmVya2VsZXlfc3VtIG92ZXIgYWxsIHRoZSBzZWN0aW9ucywKLQlyYXRoZXIgdGhhbiBvbmx5IHJlcG9ydGluZyBzaXplcyBvZiBzcGVjaWZpY2FsbHkgbmFtZWQgc2VjdGlvbnMuCi0JKiBNYWtlZmlsZS5pbiAoJChPQkpEVU1QX1BST0cpKTogUmVtb3ZlZCBkZXBlbmRlbmN5IG9uIHNpemUuby4KLQotVHVlIEF1ZyAxMCAxMDo0NjowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYywgbmxtY29udi5oLCBubG1oZWFkZXIueTogTmV3IGZpbGVzIGZvciBwcm9ncmFtIHRvCi0JY29udmVydCBvYmplY3QgZmlsZXMgaW50byBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZXMuCi0JKiBNYWtlZmlsZS5pbiAoTkxNQ09OVl9QUk9HKTogTmV3IG1hY3JvLCBkZWZpbmUgdG8gYmUgbmxtY29udi4KLQkoUFJPR1MpOiBBZGQgTkxNQ09OVl9QUk9HLgotCShubG1oZWFkZXIuYywgbmxtaGVhZGVyLm8sIG5sbWNvbnYubywgJChOTE1DT05WX1BST0cpKTogTmV3Ci0JdGFyZ2V0cy4KLQotVGh1IEF1ZyAgNSAxNTo0ODozMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgTUFLRU9WRVJSSURFUyB0byBhbiBlbXB0eSBzdHJpbmcKLQotV2VkIEF1ZyAgNCAxNzowODowOCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoY29weV9maWxlKTogTWFrZSBmYWlsdXJlcyB0byBwcm9jZXNzIGEgZmlsZSBub25mYXRhbC4KLQotTW9uIEF1ZyAgMiAxMToyODoyMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG5tLmM6IEFkZCAtQiBvcHRpb24sIGxpa2UgLS1mb3JtYXQ9YnNkLgotCi1UdWUgSnVsIDI3IDE2OjI5OjU0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChjb3B5X2ZpbGUpOiBJZiB0aGUgZmlsZSBpcyBuZWl0aGVyIGFuIG9iamVjdCBub3IgYW4KLQlhcmNoaXZlLCBnaXZlIGFuIGVycm9yIHJhdGhlciB0aGFuIHJldHVybmluZyBzdWNjZXNzLgotCi1Nb24gSnVsIDE5IDE2OjEzOjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBQcmVmZXIgbm9uLWxvY2FsIHN5bWJvbHMgb3ZlcgotCWxvY2FsIG9uZXMsIGFuZCBlc3BlY2lhbGx5IGRpc2NyaW1pbmF0ZSBhZ2FpbnN0IGRlYnVnZ2luZyBzeW1ib2xzLgotCUFsc28sIGZvciByZWxvY2F0ZWFibGUgZmlsZXMsIHRyeSB0byBmaW5kIGEgc3ltYm9sIGluIHRoZSBjdXJyZW50Ci0Jc2VjdGlvbiwgaW5zdGVhZCBvZiBwaWNraW5nIG9uZSBmcm9tIHNvbWUgcmFuZG9tIHNlY3Rpb24gd2l0aCBhCi0JY29udmVuaWVudCB2YWx1ZSAocmVhZCwgc2VjdGlvbiBvZmZzZXQpLgotCShkaXNhc3NlbWJsZV9kYXRhKTogQ2FzdCBhcmd1bWVudCB0byBtYWxsb2MgdG8gc2l6ZV90IGZpcnN0LgotCShkdW1wX2RhdGEpOiBMaWtld2lzZS4KLQkoZHVtcF9yZWxvY3MpOiBJZiBhIHNpbmdsZSBzZWN0aW9uIG5hbWUgaXMgc3BlY2lmaWVkLCBzaG93IHJlbG9jcwotCW9ubHkgZm9yIHRoYXQgc2VjdGlvbi4gIE90aGVyd2lzZSwgc2lsZW50bHkgb21pdCBzZWN0aW9ucyB3aXRob3V0Ci0JcmVsb2NzLiAgRm9ybWF0IHRhYmxlIG5pY2VseSBldmVuIGlmIHZhbHVlcyBhcmUgcHJpbnRlZCB1c2luZyAxNgotCWRpZ2l0cyBpbnN0ZWFkIG9mIDguCi0KLUZyaSBKdWwgMTYgMTU6MTk6NTkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBubS5jOiBDaGFuZ2VzIGZvciBmaW5hbCB2ZXJzaW9uIG9mIFBPU0lYLjIuCi0JKHByaW50X3N5bWJvbF9maWxlbmFtZV97YnNkLHN5c3YscG9zaXh9KTogTmV3IGZ1bmN0aW9ucy4KLQkoZm9ybWF0cyk6IEFkZCBhbiBlbGVtZW50IGZvciBhIHBvaW50ZXIgdG8gdGhlbS4KLQkocHJpbnRfc3ltYm9scyk6IENhbGwgaXQuCi0JKHByaW50X29iamVjdF9maWxlbmFtZV9wb3NpeCwgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfcG9zaXgpOiBQcm9kdWNlCi0Jb3V0cHV0IGFjY29yZGluZyB0byBuZXcgUE9TSVguMiBzcGVjLgotCi0JKiBzdHJpbmdzLmMgKHByaW50X3N0cmluZ3MpOiBIYW5kbGUgU1RSRUFNIGJlaW5nIE5VTEwuCi0JKHN0cmluZ3NfYV9zZWN0aW9uKTogUGFzcyBhIE5VTEwuCi0JKG1haW4pOiBEb24ndCBvcGVuIC9kZXYvbnVsbC4KLQotVGh1IEp1bCAxNSAxMjo0NDowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEhhbmRsZSB0aGUgbTg4ay4KLQkoZGlzcGxheV9iZmQpOiBVc2UgYmZkX2Vycm1zZywgcmF0aGVyIHRoYW4ganVzdCBjbGFpbWluZyB0aGF0IHRoZQotCWJmZCBpcyBub3QgYW4gb2JqZWN0IGZpbGUuCi0KLU1vbiBKdWwgMTIgMTc6NTU6MzQgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQUdTKTogbWFrZSB3b3JrIGFnYWluIGJ5IG5hbWluZyBkaXJlY3RvcmllcwotCSAgZXhwbGljaXRseSByYXRoZXIgdGhhbiBkZXBlbmRpbmcgb24gdW5kZWZpbmVkIG1hY3Jvcy4KLQkgIChJTlNUQUxMX1hGT1JNKTogY29ycmVjdCBiYWQgaW5zdGFsbCB0YXJnZXQuCi0KLUZyaSBKdWwgIDIgMTY6NTg6MzQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdHJpbmdzLmM6IERvYyBmaXhlcy4KLQotU3VuIEp1biAyNyAxMzozNToyNCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBOb3RlIGRlcGVuZGVuY2llcyBvbiBidWNvbW0uaC4KLQkoY3BsdXMtZGVtLm8pOiBMaW5rIGMrK2ZpbHQgd2l0aCB2ZXJzaW9uLm8uCi0KLQkqIHN0cmluZ3MuYzogSW5jbHVkZSBidWNvbW0uaCBhbmQgYWRkIHByb3RvdHlwZXMgdG8gb3RoZXIgZGVjbHMuCi0JUmVtb3ZlIC1oIG9wdGlvbi4KLQotCSogYnVjb21tLmg6IERlY2xhcmUgeHJlYWxsb2MuCi0KLQkqIG5tLmMsIG9iamNvcHkuYywgb2JqZHVtcC5jLCBzaXplLmMsIHN0cmluZ3MuYyAobWFpbiwgdXNhZ2UpOiBBZGQKLQktLWhlbHAgb3B0aW9uLiAgUHV0ICJHTlUiIGluIHRoZSB2ZXJzaW9uIG1lc3NhZ2UuCi0JKHVzYWdlKTogVGFrZSBzdHJlYW0gYW5kIGV4aXQgc3RhdHVzIGFzIGFyZ3MuCi0JKG1haW4pOiBQYXNzIG5ldyBhcmdzIHRvIHVzYWdlLgotCi1GcmkgSnVuIDI1IDIzOjEyOjEyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3RyaW5ncy5jLCBzdHJpbmdzLjE6IE5ldyBmaWxlcy4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IHN0cmluZ3MuCi0JKiBNYWtlZmlsZS5pbjogQWRkIHJ1bGVzIGZvciBpdC4KLQotRnJpIEp1biAyNSAyMDo0NDo0MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiBVc2Ugc2l6ZS1pbmRlcGVuZGVudCBiZmQgZWxmIHNlY3Rpb24gbmFtZXMuCi0KLVN1biBKdW4gMjAgMjM6MDk6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogSGFuZGxlIHdpZGUgb2Zmc2V0cyBieQotCWNhbGxpbmcgc3ByaW50Zl92bWEuCi0KLUZyaSBKdW4gMTggMTQ6Mjk6MTIgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoc3ltczIpOiAgUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUuCi0JKiBvYmpkdW1wLmMgKHJlbW92ZV91c2VsZXNzX3N5bWJvbHMpOiAgTmV3IGZ1bmN0aW9uLgotCSogb2JqZHVtcC5jIChjb21wKTogIFNpbXBsaWZ5LgotCSogb2JqZHVtcC5jIChkaXMtYXNzZW1ibGVfZGF0YSk6ICBNYWtlIHNpbXBsZXIgYW5kIG1vcmUKLQllZmZpY2llbnQgaG93IHdlIGZpbHRlciBvdXQgdXNlbGVzcyBzeW1ib2xzOiAgSnVzdCBmaWx0ZXIKLQlCRUZPUkUgdGhlIHNvcnQgKHVzaW5nIHJlbW92ZV91c2VsZXNzX3N5bWJvbHMpLgotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiAgU2ltcGxpZnkuCi0JQ2hhbmdlIG91dHB1dCBzeW50YXggdG8gbWF0Y2ggZ2RiLgotCi1UaHUgSnVuIDE3IDE2OjUzOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjYW5vbmljYWxpemUgaW5zdGFsbC5zaDsgZm9yIHVzZSB3aXRoaW4KLQl0aGlzIGRpcmVjdG9yeSAoYW5kIHN1YmRpcnMpCi0KLU1vbiBKdW4gMTQgMTI6MTM6MjIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCwgaW5zdGFsbC1pbmZvKTogcmVtb3ZlIHBhcmVudGRpciBzdXBwb3J0LAotCXVzZSBJTlNUQUxMX1hGT1JNOyBkZWZpbmUgSU5TVEFMTF9YRk9STQotCi1UaHUgSnVuIDEwIDE3OjI5OjIxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogIEZpeCBiYWQgc2l6ZSBwYXNzZWQgdG8geG1hbGxvYygpLgotCi1Nb24gSnVuICA3IDEyOjQxOjEyIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogIEFkZCAtSS4uL2JmZCBmb3Igc3lzZGVwLmggYW5kIGJmZC5oLgotCSogY29uZmlndXJlLmluOiAgTm8gbG9uZ2VyIG5lZWQgdG8gY29uZmlndXJlIHRvIGdldCBzeXNkZXAuaC4KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiAgRml4IHN5bWJvbCB0YWJsZSBoYW5kbGluZy4KLQotRnJpIEp1biAgNCAxNzoyMDowMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6ICBDYW5ub3QgZmlsdGVyIHRoZSBzeW1ib2xzCi0JaW4gcGxhY2UsIGJlY2F1c2UgdGhhdCBjb25mdXNlcyB0aGUgcmVsb2NzLCBzbyB0YWtlIHNlcGFyYXRlCi0JcGFyYW1ldGVyIGZvciBvdXRwdXQgYXJyYXkuCi0JKiBvYmpjb3B5LmMgKHN5bXBwKTogIE1ha2UgdHdvIHZhcmlhYmxlczogaXN5bXBwIGFuZCBvc3ltcHAuCi0JKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogIEFsbG9jYXRlIHNlcGFyYXRlIGFycmF5IChvc3ltcHApCi0JZm9yIGZpbHRlcmVkIHN5bWJvbHMuCi0KLUZyaSBKdW4gIDQgMTA6NTE6NDQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2hhbmdlIHJlY3Vyc2lvbiB0ZXN0IHRvIHByZXNlbmNlIG9mIGEgY29uZmlndXJlZAotCXRlc3RzdWl0ZSBkaXJlY3RvcnkKLQotVGh1IEp1biAgMyAxNDowNTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh1bmRlcnNjb3JlLmMpOiBIYWNrIHRoZSBiYWNrcXVvdGVkIGNvbW1hbmQgc28gaXQKLQlkb2Vzbid0IGNhdXNlIFNvbGFyaXMgbWFrZSB0byBib21iLgotCi1UaHUgSnVuICAzIDEwOjQwOjE5IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgYWRkZWQgYysrZmlsdCBhbmQgb2JqY29weSB0byBNQU5QQUdFUyB2YXJpYWJsZQotCi1UaHUgSnVuICAzIDAwOjMyOjUyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbmFtZSBMT0FETElCRVMgdG8gRVhUUkFMSUJTCi0KLVdlZCBKdW4gIDIgMTg6MzA6MjQgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogYysrZmlsdC4xLCBvYmpjb3B5LjE6ICBuZXcgbWFuIHBhZ2VzCi0KLUZyaSBNYXkgMjggMTU6MDE6MjQgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6ICBBbHNvIGluc3RhbGwgYXIgYW5kIHJhbmxpYiBpbgotCSQodG9vbGRpcikvYmluOyAgbmVlZGVkIGZvciBidWlsZGluZyBsaWJnY2MuYS4KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogIEZpeCB0aGUgY2hlY2sKLQkiY29pbmNpZGVudGFsIiBsYWJlbCBtYXRjaGVzIGJ5IGRpcy1hbGxvd2luZyB1bmRlZmluZWQKLQlvciBjb20gc3ltYm9scy4KLQotVGh1IE1heSAyNyAxNjo1ODozMSAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0gICAgICAgICogYml1dGlscy50ZXhpOiAgcmV2aXNlZCBjKytmaWx0IGNoYXB0ZXIKLQotV2VkIE1heSAyNiAxNzoyNDoxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIENDIGFuZCBDRkxBR1MuCi0KLVR1ZSBNYXkgMjUgMDA6MjY6NDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoc2x1cnBfc3ltdGFiKTogUHJpbnQgd2FybmluZyBmb3IgYmFkIHN5bWJvbCB0YWJsZS4KLQkoYmZkX2VsZjMyX2ZpbmRfc2VjdGlvbiwgRWxmMzJfSW50ZXJuYWxfU2hkcik6IFVwZGF0ZWQKLQlkZWNsYXJhdGlvbnMgYW5kIHVzZXMuCi0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBEb24ndCBidWlsZCBiaW51dGlscy5tbS4KLQotRnJpIE1heSAyMSAxMDo1MToxOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIG5tLmM6IEFkZCAtZi8tLWZvcm1hdCwgLVAvLS1wb3J0YWJpbGl0eSwgLXQvLS1yYWRpeCBvcHRpb25zLgotCU1ha2UgZ2xvYmFsIHZhcmlhYmxlcyBzdGF0aWMuCi0JKG1haW4pOiBNYWtlIC12IGxpa2UgLW4sIG5vdCAtViwgYW5kIG1ha2UgLUEgbGlrZSAtbywgZm9yIFBPU0lYLjIuCi0JKHNldF9wcmludF9yYWRpeCwgc2V0X291dHB1dF9mb3JtYXQsCi0JcHJpbnRfe29iamVjdF9maWxlbmFtZSxhcmNoaXZlX2ZpbGVuYW1lLGFyY2hpdmVfbWVtYmVyLHN5bWJvbF9pbmZvfQotCXtic2Qsc3lzdixwb3NpeH0pOiBOZXcgZnVuY3Rpb25zLgotCShkaXNwbGF5X2ZpbGUsIHByaW50X3N5bWJvbHMpOiBDYWxsIHRoZW0uCi0KLQkqIGFyLmM6IEltcHJvdmUgZXJyb3IgbWVzc2FnZXMuCi0KLQkqIG5tLmMgKG1haW4pOiBIYW5kbGUgbG9uZyBvcHRpb25zIHRoYXQganVzdCBzZXQgYSBmbGFnLgotCi0JKiBubS5jIChtYWluKSwgYXIuYyAoZG9fc2hvd192ZXJzaW9uKSwgb2JqY29weS5jIChtYWluKSwgc2l6ZS5jCi0JKG1haW4pOiBFeGl0IGFmdGVyIHByaW50aW5nIHRoZSB2ZXJzaW9uIG51bWJlciwgcGVyIHRoZSBHTlUgY29kaW5nCi0Jc3RhbmRhcmRzLgotCi1Nb24gTWF5IDE3IDEzOjIwOjI1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBSRUFETUUsIE1ha2VmaWxlLmluOiAgTWlub3IgdXBkYXRlcyBmb3IgMi4yLgotCi1GcmkgTWF5IDE0IDExOjEyOjI2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodW5kZXJzY29yZS5jKTogIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUKLQkodXNpbmcgbm0pIGEgZmlsZSB3aXRoIHRoZSB2YXJpYWJsZSBwcmVwZW5kc191bmRlcnNjb3JlLgotCSogTWFrZWZpbGUuaW4gKGMrK2ZpbHQpOiAgTGluayB1bmRlcnNjb3JlLm8gd2l0aCBjcGx1cy1kZW0ubwotCXNvIHRoYXQgaW5pdGlhbCB1bmRlcnNjb3JlcyBnZXQgcmVtb3ZlZCBpZmYgYXBwcm9wcmlhdGUuCi0JKiBiaW51dGlscy50ZXhpOiAgUHJlbGltaW5hcnkgZG9jdW1lbnRhdGlvbiBmb3IgYysrZmlsdC4KLQkqIE1ha2VmaWxlLmluLCBiaW51dGlscy50ZXhpOiAgU2V0IHRvIHZlcnNpb24gMi4yLgotCi0JKiBORVdTOiAgTWVudGlvbiBjb3B5LT5vYmpjb3B5IHJlbmFtaW5nIGFuZCBuZXcgYysrZmlsdCBwcm9ncmFtLgotCi1XZWQgTWF5IDEyIDEyOjA1OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNwbHVzLWRlbS5vLCAkKERFTUFOR0xFUl9QUk9HKSk6IEJ1aWxkIHRoZQotCWRlbWFuZ2xlciB2aWEgY3BsdXMtZGVtLm8sIHJhdGhlciB0aGFuIGRpcmVjdGx5IGZyb20gdGhlIC5jIGZpbGUuCi0KLQkqIG9iamNvcHkuYzogUmVuYW1lZCBmcm9tIGNvcHkuYywgdXBkYXRlZCBjb21tZW50cyBhY2NvcmRpbmdseS4KLQkqIE1ha2VmaWxlLmluLCBiaW51dGlscy50ZXhpOiBSZW5hbWVkIGNvcHkgdG8gb2JqY29weS4KLQkqIGlzLXN0cmlwLmMsIG1heWJlLXN0cmlwLmMsIG5vdC1zdHJpcC5jOiBVcGRhdGVkIGNvbW1lbnRzIGZvcgotCXJlbmFtZSBvZiBjb3B5IHRvIG9iamNvcHkuCi0KLU1vbiBNYXkgMTAgMTc6MjA6MTggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGkgKHN0cmlwLCAtdiBvcHRpb24pOiAgRml4IHR5cG8uCi0KLUZyaSBNYXkgIDcgMTM6NTc6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoUlVOVEVTVCk6IERlZmluZS4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBSVU5URVNULgotCi1UdWUgTWF5ICA0IDEwOjA2OjUwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERFTUFOR0xFUl9QUk9HKTogTmFtZSBpdCBjKytmaWx0LgotCShQUk9HKTogQWxzbyBidWlsZCBhbmQgaW5zdGFsbCBDT1BZX1BST0cuCi0KLU1vbiBNYXkgIDMgMTk6MTE6NDggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlIGRlZmluaXRpb24gb2YgJCh0b29sZGlyKSB0byBtYXRjaCBGU0YuCi0KLVdlZCBBcHIgMjggMjM6NDE6MzIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzaXplLmMgKHVzYWdlKTogQWRkIG1pc3Npbmcgb3B0aW9ucy4KLQkobWFpbik6IENsZWFuIHVwIG9wdGlvbiBwYXJzZXIuCi0KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBBZGQgbWlzc2luZyBvcHRpb25zLgotCShkaXNwbGF5X2ZpbGUpOiBQcmludCBwcm9ncmFtIG5hbWUgYmVmb3JlIGNhbGxpbmcKLQliZGZfcGVycm9yLgotCi0JKiBubS5jICh1c2FnZSk6IEFkZCBtaXNzaW5nIG9wdGlvbnMuCi0JKG1haW4pOiBDbGVhbiB1cCBvcHRpb24gcGFyc2VyLgotCShkaXNwbGF5X2ZpbGUpOiBQcmludCBwcm9ncmFtIG5hbWUgYmVmb3JlIGNhbGxpbmcKLQliZGZfcGVycm9yLgotCi0JKiBjb3B5LmMgKGNvcHlfdXNhZ2UsIHN0cmlwX3VzYWdlKTogQWRkIG1pc3Npbmcgb3B0aW9ucy4KLQotCSogYXIuYyAodXNhZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKG1haW4pOiBDYWxsIGl0LgotCShvcGVuX2luYXJjaCwgZG9fcXVpY2tfYXBwZW5kKTogUHJpbnQgcHJvZ3JhbSBuYW1lIGJlZm9yZSBjYWxsaW5nCi0JYmRmX3BlcnJvci4KLQotVGh1IEFwciAyMiAxNTowMTozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG5tLmMgKG1haW4pOiBBY2NlcHQgYW5kIGlnbm9yZSAtQSBhbmQgLUIgZm9yIE1JUFMgY29tcGF0aWJpbGl0eS4KLQotTW9uIEFwciAxOSAxNDowNjo1OSAxOTkzICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBGTEFHU19UT19QQVNTIHNvIHRlc3RzIGdldCBydW4gb24gZnJlc2hseQotCWJ1aWx0IGJpbmFyaWVzIGlmIHRoZXkgZXhpc3QuIChvdGhlcndpc2UgdGhlIHBhdGgpCi0KLVdlZCBBcHIgIDcgMjI6MjI6NTAgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBjaGVjayB0YXJnZXQgdG8gdXNlIERlamFHbnUuCi0KLVRodSBBcHIgIDEgMTI6Mzc6MTMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgYW0yOWstcGluc24uYywgaTk2MC1waW5zbi5jLgotCW9iamR1bXAuYzogYTI5ayBhbmQgaTk2MCBhcmUgYGRpc2Fzc2VtYmxlJyBub3QgYHByaW50Jy4KLQotCSogb2JqZHVtcC5jOiBSZW5hbWUgcHJpbnRfYWRkcmVzcyB0byBvYmpkdW1wX3ByaW50X2FkZHJlc3MKLQlhbmQgY2hhbmdlIHBhcmFtZXRlcnMuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBVc2Ugb2JqZHVtcF9wcmludF9hZGRyZXNzLgotCi1XZWQgTWFyIDMxIDEwOjI1OjI5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBwcmludF9pbnNuX3NwYXJjIGlzIG5vdyBhCi0JYGRpc2Fzc2VtYmxlJyBub3QgYSBgcHJpbnQnLgotCU1ha2VmaWxlLmluOiBSZW1vdmUgc3BhcmMtcGluc24uYyAobm93IGluIGxpYm9wY29kZXMuYSkuCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFVzZSBuZXcgcmVhZF9tZW1vcnlfZnVuYyBzdHVmZi4KLQotVGh1IE1hciAyNSAxMDozODoxMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZnByaW50Zik6IERlY2xhcmF0aW9uIG9mIHZhcmlhZGljIGZ1bmN0aW9uIGhhZCBiZXR0ZXIKLQliZSBhIHByb3RvdHlwZSBmb3IgQU5TSSBDIHN5c3RlbXMuCi0KLU1vbiBNYXIgMjIgMjM6MTk6NDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVuYW1lIHRlc3QtaW5zdGFsbCB0byBpbnN0YWxsLWNoZWNrCi0KLUZyaSBNYXIgMTkgMTQ6NDA6MDggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEFkZCBIODUwMC4KLQotRnJpIE1hciAxOSAxMDo1Njo1MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jICh1c2FnZSk6IE1lbnRpb24gbG9uZyBvcHRpb25zLgotCi1UaHUgTWFyIDE4IDE0OjIyOjE3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbm0uYzogIE1vZGlmeSBiZWhhdmlvciBvZiAtbyBmbGFnIGZvciBhcmNoaXZlcyB0byBtYXRjaAotCUJTRDQuNCBhbmQgU3Vub3MgNDogIFByZWZpeCBhcmNoaXZlIG5hbWUgYmVmb3JlIGVhY2ggbGluZS4KLQotCSogbTY4ay1waW5zbi5jOiAgUmVtb3ZlZC4gIFN1YnN1bWVkIGJ5IC4uL29wY29kZXMvbTY4ay1kaXMuYy4KLQkqIGkzODYtcGluc24uYzogIFJlbW92ZWQuICBTdWJzdW1lZCBieSAuLi9vcGNvZGVzL2kzODYtZGlzLmMuCi0JKiBNYWtlZmlsZS5pbjogIEFkanVzdCBhY2NvcmRpbmdseS4KLQkqIG9iamR1bXAuYzogIFN1cHBvcnQgbmV3LXN0eWxlIGRpc2Fzc2VtYmxlcnMgKG9uZXMgdGhhdCB1c2UKLQl0aGUgaW50ZXJmYWNlIG9mIC4uL2luY2x1ZGUvZGlzLWFzbS5oKS4KLQotVGh1IEZlYiAyNSAxNTo1NzowMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgV2hlbiBtYWtpbmcgdGFyIGZpbGUsIHJlbW92ZSB0ZXhpbmZvLyosCi0JZXhjZXB0IGZvciB0ZXhpbmZvL3RleGluZm8udGV4LgotCSogYXJkdXAuYzogIEFkZCBleHRlcm4gZGVjbGFyYXRpb24gb2Ygc3RyZHVwLgotCSogTWFrZWZpbGUuaW4gKHRlc3RzdWl0ZSk6ICBBZGQgJ2Vsc2UgdHJ1ZScgc2luY2Ugb3RoZXJ3aXNlCi0JVWx0cml4IC9iaW4vc2ggY29tcGxhaW5zLgotCi1XZWQgRmViIDI0IDE5OjQ0OjE4IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBTZXQgVkVSU0lPTiB0byAyLjEuCi0JKiBSRUFETUUsIE5FV1M6IFVwZGF0ZXMuCi0JKiBubS5jOiAgQWRkIC12IGFzIGEgc3lub255bSBmb3IgLVYuCi0KLVR1ZSBGZWIgMjMgMTk6MDA6NTAgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGRlZCB0ZXN0c3VpdGUgdG8gY29uZmlnZGlycy4KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdXBwb3J0IGZvciBidWlsZGluZyB0ZXN0c3VpdGUuCi0KLU1vbiBGZWIgMjIgMjI6NTI6MTAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiAgUHJpbnQgZnVuY3Rpb24gbmFtZXMgd2hlbgotCWdpdmVuIGJ5IGJmZF9maW5kX25lYXJlc3RfbGluZS4gIElmIG5vdCAtIHN0aWxsIHByaW50Ci0JbGluZSBudW1iZXJzLgotCi1Nb24gRmViIDIyIDA3OjU0OjAzIDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzL3Rlc3RzdWl0ZTogbWFkZSBtb2RpZmljYXRpb25zIHRvIHRlc3RjYXNlcywgZXRjLiwgdG8gYWxsb3cKLSAgICAgICAgdGhlbSB0byB3b3JrIHByb3Blcmx5ICBnaXZlbiB0aGUgcmVvcmdhbml6YXRpb24gb2YgZGVqYS1nbnUgYW5kIHRoZQotCXJlbG9jYXRpb24gb2YgdGhlIHRlc3RjYXNlcyBmcm9tIGRlamEtZ251IHRvIGEgInRvb2wiIHN1YmRpcmVjdG9yeS4KLQotTW9uIEZlYiAyMiAxMDoyNzoyNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9kYXRhKTogRnJlZSB1cCBzZWN0aW9uIGNvbnRlbnRzIGVhY2ggdGltZQotCXRocm91Z2ggdGhlIGxvb3AuICBSZXBvcnRlZCBieSBtaW55YXJkQGJuci5jYS4KLQotU3VuIEZlYiAyMSAxMDo1NTo1NSAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy90ZXN0c3VpdGU6IEluaXRpYWwgY3JlYXRpb24gb2YgYmludXRpbHMvdGVzdHN1aXRlLgotCU1pZ3JhdGVkIGRlamFnbnUgdGVzdGNhc2VzIGFuZCBzdXBwb3J0IGZpbGVzIGZvciB0ZXN0aW5nIG5tIHRvCi0JYmludXRpbHMvdGVzdHN1aXRlIGZyb20gZGVqYS1nbnUuICBUaGVzZSBmaWxlcyB3ZXJlIG1vdmVkICJhcyBpcyIKLQl3aXRoIG5vIG1vZGlmaWNhdGlvbnMuCVRoaXMgbWlncmF0aW9uIGlzIHBhcnQgb2YgYSBtYWpvciBvdmVyaGF1bAotCW9mIGRlamFnbnUuICBUaGUgbW9kaWZpY2F0aW9ucyB0byB0aGVzZSB0ZXN0Y2FzZXMsIGV0Yy4sIHdoaWNoCi0Jd2lsbCBhbGxvdyB0aGVtIHRvIHdvcmsgd2l0aCB0aGUgbmV3IHZlcnNpb24gb2YgZGVqYWdudSB3aWxsIGJlCi0JbWFkZSBpbiBhIGZ1dHVyZSB1cGRhdGUuCi0KLUZyaSBGZWIgMTIgMTA6MDU6MjAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChMSUJJQkVSVFlfU1JDX0RJUiwgTElCSUJFUlRZX0JJTl9ESVIpOiBOZXcgbWFjcm9zLgotCSogTWFrZWZpbGUuaW4gKExJQklCRVJUWSk6ICBVc2UgTElCSUJFUlRZX0JJTl9ESVIuCi0JKiBNYWtlZmlsZS5pbiAoREVNQU5HTEVSX1BST0cpOiAgTmV3IHByb2dyYW0gdG8gYnVpbGQuICBBZGQgbWFjcm8KLQlhbmQgcnVsZS4KLQkqIE1ha2VmaWxlLmluIChQUk9HUyk6ICBBZGQgREVNQU5HTEVSX1BST0cuCi0KLVR1ZSBKYW4gMjYgMTE6NTY6MzMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb3B5LmMsIG5tLmMsIG9iamR1bXAuYywgc2l6ZS5jOiBVc2UgbmV3IGJmZF9pc19jb21fc2VjdGlvbgotCW1hY3JvIHJhdGhlciB0aGFuIGNoZWNraW5nIGZvciBlcXVhbGl0eSB0byBiZmRfY29tX3NlY3Rpb24uCi0KLUZyaSBKYW4gIDggMTU6NTA6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBGaXggY29kZSB0byBmaW5kIGZpcnN0IHVzZWxlc3MKLQlzeW1ib2wuCi0KLVRodSBKYW4gIDcgMTM6MTM6MzEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBVc2UgbWlwc19wcmludF9pbnNuIGZvciBNSVBTLgotCURvbid0IGNvcmUgZHVtcCBpZiBiZmRfZmluZF9uZWFyZXN0X2xpbmUgcmV0dXJucyBmYWxzZS4KLQotV2VkIEphbiAgNiAxNzoxNDowMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKToga25vdyBob3cgdG8gZGlzYXNzZW1ibGUgejgwMDBzCi0JdG9vLgotCi1XZWQgSmFuICA2IDE1OjE2OjI3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhcnN1cC5oIChpbnRlcmFjdGl2ZSksIGJ1Y29tbS5oIChwcm9ncmFtX25hbWUpOiAgUHJlZml4Ci0Jd2l0aCAnZXh0ZXJuJywgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBzb21lIGNvbXBpbGVycy4KLQotV2VkIEphbiAgNiAxNToxNDoxMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGFycGFyc2UueTogZml4IHVubmVjZXNzYXJ5IHNoaWZ0L3JlZHVjZQotCi1UdWUgRGVjIDIyIDE1OjQ2OjU2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBNYWtlIGNoZWNrIGRlcGVuZCBvbiBhbGwuCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIHN5c2RlcC5oLgotCSogc2l6ZS5jOiAgVXNlICV1IGZvcm1hdCB3aGVyZSBhcHByb3ByaWF0ZS4KLQkqIG9iamR1bXAuYzogIFN0YW5kYXJkaXplOiAgTF9TRVQgLT4gU0VFS19TRVQuCi0JKiBvYmpkdW1wLmM6ICBVc2UgbmV3IG1hY3JvIGJmZF9hc3ltYm9sX2JmZC4KLQkqIGNvbmZpZ3VyZS5pbjogIEFsbG93IHN0ZC1ob3N0IGFzIHRoZSBkZWZhdWx0ICR7bXlzX2hvc3R9LgotCi1UaHUgRGVjIDE3IDE5OjM4OjE5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGR2aSB0YXJnZXQsIGRlZmluZSBhbmQgdXNlIFRFWEkyRFZJCi0KLVR1ZSBEZWMgMTUgMTg6MDU6MDcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0KTogIEZpeCBwZXJtaXNzaW9ucyBiZWZvcmUgcmVsZWFzZS4KLQkqIHNpemUuYzogIFVzZSBiZmRfc2l6ZV90eXBlIChhbmQgbG9uZykgd2hlcmUgYXBwcm9wcmlhdGUuCi0JKiBhci5jOiAgTWFrZSB3cml0aW5nIGEgbWFwIHRoZSBkZWZhdWx0LCB0byBiZSBjb21wYXRpYmxlCi0Jd2l0aCBTWVNWIGFuZCBQb3NpeC4yLiAgUmVtb3ZlIHNvbWUgYm9ndXMga2x1ZGdlcyB0aGF0Ci0JaGFuZGxlZCBfXy5TWU1ERUYgZGlyZWN0bHkuCi0JKiBORVdTOiAgTmV3IGZpbGUuCi0KLU1vbiBOb3YgIDkgMTM6MzY6NTMgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZmxleCBubyBsb25nZXIgbmVlZHMgdGhlIC1TIGZsYWcKLQotU2F0IE5vdiAgNyAxNTowNjoxMyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBhci5jIChleHRyYWN0X2ZpbGUpOiB1dGltZSBuZWVkcyBhIHBvaW50ZXIgdG8gYSB1dGltYnVmCi0KLQkqIE1ha2VmaWxlLmluOiBoYW5kbGUgLUkgaW5jbHVkZXMgYmV0dGVyLCBhZGRpbmcgJChCQVNFRElSKS9iZmQgdG8KLQl0aGUgbGlzdCAoc2luY2Ugc29tZSBvZiB0aGUgYmZkL2hvc3RzLyouaCBmaWxlcyBpbmNsdWRlIG90aGVyCi0JZmlsZXMgZnJvbSB0aGF0IGRpcmVjdG9yeSkKLQotRnJpIE5vdiAgNiAwMDoxMjo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogaTk2MC1waW5zbi5jIChNRU1fTUFYLCBNRU1fU0laKTogIFNldCB1cHBlciBib3VuZCBwcm9wZXJseS4KLQotVGh1IE5vdiAgNSAwMzozNzoxNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUNsZWFuIHVwIHNvbWUgb2xkIEJGRCBhbnNpZmljYXRpb24gbWFjcm9zLgotCi0JKiBhcnN1cC5oLCBidWNvbW0uaCwgb2JqZHVtcC5oOiAgUmVtb3ZlIEVYRlVOIGZyb20gYmludXRpbHMuCi0JSXQgc3RpbGwgcmVtYWlucyBhcyBhIGxvY2FsIG1hY3JvIGluIGdtYWxsb2MuYywgd2hpY2ggaXMgZGVyaXZlZAotCWZyb20gc29tZSBvdGhlciBjb3B5IG9mIEdOVSBNYWxsb2Mgc29tZXdoZXJlIChGSVhNRSkuCi0KLQkqIGFyLmMsIG9iamR1bXAuYywgc2l6ZS5jOiAgUmVwbGFjZSBFWEZVTiB3aXRoIFBST1RPLiAgTWFrZSBzdGF0aWMKLQlmbnMgcmVhbGx5IHN0YXRpYy4KLQkqIGFyc3VwLmg6ICBEZWNsYXJlIGV4dHJhY3RfZmlsZXMuCi0KLU1vbiBOb3YgIDIgMTI6NDI6MTEgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhci5jIChleHRyYWN0X2ZpbGUpOiBpbnN0ZWFkIG9mIGNoZWNraW5nIFVTRzogaWYgUE9TSVhfVVRJTUUsCi0JdXNlIHV0aW1lIGFuZCB1dGltYnVmIHN0cnVjdHVyZSwgb3RoZXJ3aXNlIGlmIFVTRV9VVElNRSB1c2UgdXRpbWUKLQlhbmQgYXJyYXkgb2YgdHdvIGxvbmdzLCBvdGhlcndpc2UgdXNlIHV0aW1lcy4KLQotVGh1IE9jdCAxNSAxMzo1NzozNSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4OiAgRG9jdW1lbnQgeWVzdGVyZGF5J3MgY2hhbmdlcyB0byBzdHJpcCBhbmQgY29weS4KLQotV2VkIE9jdCAxNCAxMzoyMjoxNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29weS5jOiAgUmUtZG8gY29tbWFuZC1saW5lIHBhcnNpbmcgdG8gdXNlIGdldG9wdF9sb25nKCkuCi0JQWRkIGxvbmcgb3B0aW9uIG5hbWVzLiAgUmUtdGhpbmsgb3B0aW9uIGxldHRlcnMgdG8gYmUgbW9yZQotCWNvbnNpc3RlbnQuCi0JKiBjb3B5LmM6ICBOZXcgZnVuY3Rpb24gZmlsdGVyX3N5bWJvbHMoKSBmb3Igc3RyaXBwaW5nIG9ubHkKLQlkZWJ1Zy1zeW1ib2xzIGFuZC9vciBsb2NhbCBzeW1ib2xzLiAgVXNlIHRoZXNlIHRvIHN1cHBvcnQKLQl0aGUgcHJldmlvdXNseS1taXNzaW5nIG9wdGlvbnMgb2YgdGhlIG9sZCBGU0Ygc3RyaXAuCi0KLVR1ZSBPY3QgMTMgMDE6MjQ6MjAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdCk6ICBVc2UgJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdCByYXRoZXIKLQl0aGFuIHJlcGVhdGluZyBhIGNvcHkgb2YgaXQgaGVyZS4KLQotV2VkIE9jdCAgNyAxMjo1Mzo1MiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29weS5jIChtYWluKTogRXZlbiBpZiBpc19zdHJpcCwgYWNjZXB0IC1kIGFyZ3VtZW50IGluZGljYXRpbmcKLQlhbHRlcm5hdGUgb3V0cHV0IGZvcm1hdC4gIE5lZWRlZCBieSBnZGIgZm9yIE5pbmR5LgotCi0JKiBtNjhrLXBpbnNuLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlIG5ldyAiYCIgb3BlcmFuZCB0eXBlLgotCi1UdWUgT2N0ICA2IDE2OjMzOjU2IDE5OTIgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGk6ICBhZGRlZCBkb2N1bWVudGF0aW9uIGZvciAiY29weSIKLQotVHVlIE9jdCAgNiAxNDoyMjo1NiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgUGVyc1NvbnkpCi0KLQkqIE1ha2VmaWxlLmluICgqY2xlYW4gcnVsZXMpOiBTb21lIGNsZWFuaW5nIHVwLgotCSogTWFrZWZpbGUuaW4gKGRpc3QpOiBNYWtlIGRpc3RzdHVmZiBpbiBncHJvZiBmb3IgYSBkaXN0LgotCi0JKiBhci5jIChkb19zaG93X3ZlcnNpb24pOiAgTmV3IGZ1bmN0aW9uLgotCSogYXIuYyAobWFpbik6ICBGaXggc28gImFyIC1WIiB3b3Jrcy4KLQotVGh1IE9jdCAgMSAyMjo0NDo0NSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogbm93IHVzZXMgdGhlIGNwdS12ZW5kb3Itb3MgdHJpcGxlIGluc3RlYWQgb2YKLQluZXN0ZWQgY2FzZXMuCi0KLUZyaSBTZXAgMjUgMjI6NDE6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGk5NjAtcGluc24uYzogIENoYW5nZSBiemVybyB0byBtZW1zZXQuCi0JKiBzcGFyYy1waW5zbi5jOiAgQ2hhbmdlIGluZGV4IHRvIHN0cmNoci4KLQotTW9uIFNlcCAyMSAxNDozOTo1NiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGstcGluc24gKHByaW50X2luc25fYXJnLCBmZXRjaF9hcmcpOiBhZGRlZCBzdXBwb3J0IGZvcgotCW9wZXJhbmRzIHRvIG1lbW9yeSBtYW5hZ2VtZW50IGluc3RydWN0aW9ucywgZnJvbSBXUlMuCi0KLVR1ZSBTZXAgMTUgMTU6MjY6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGlmICQodG9vbGRpcikgZXhpc3RzLCBpbnN0YWxsIG5tIGFuZAotCXN0cmlwIGluICQodG9vbGRpcikvYmluLgotCi1UaHUgU2VwICAzIDExOjU3OjQwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBMZXQncyBjYWxsIGl0IHZlcnNpb24gMi4wLgotCi1XZWQgU2VwICAyIDAwOjI1OjEzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb24gMC45OC4KLQkqIFRPRE8sIFJFQURNRTogIE1pbm9yIHVwZGF0ZXMuCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkZWQgbW9zdGx5Y2xlYW4sIGRpc3RjbGVhbiBydWxlcywKLQlhbmQgY2xlYW5lZCB1cCBjbGVhbiwgcmVhbGNsZWFuLgotCi1TdW4gQXVnIDMwIDIxOjE4OjU5IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1hcCBwcm9ncmFtIG5hbWVzIHRocm91Z2ggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQotCXdoZW4gaW5zdGFsbGluZy4KLQotU3VuIEF1ZyAzMCAxODowOTowMyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9ucyAxLjk3LjkwLgotCSogY3BsdXMtZGVtLmM6ICBSZW1vdmVkLiAgV2FzIG5vd2hlcmUgdXNlZCAtIGFuZCBpZiBzb21lCi0JcHJvZ3JhbXMgYXJlIGNoYW5nZWQgdG8gdG8gZGVtYW5nbGluZyBzaG91bGQgbm93IHVzZSB0aGUKLQl2ZXJzaW9ucyBpbiBsaWJpYmVydHkuCi0KLVRodSBBdWcgMjcgMTI6NTg6MDkgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGQgd2UzMmsKLQotTW9uIEF1ZyAyNCAxNDo1Mzo0MiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAobWFwX292ZXJfbWVtYmVycyk6IGlmIHRoZSBlbGVtZW50IG9mIHRoZSBhcmNoaXZlIGhhcyBhCi0JbnVsbCBuYW1lLCBmaWxsIGl0IGluLgotCi0JKiBubS5jIChkb19vbmVfcmVsX2ZpbGUpOiBvbmx5IHdhcm4gaWYgYSBiZmQncyBmbGFncyBzYXkgdGhlcmUKLQl3aWxsIGJlIHN5bWJvbHMgYW5kIHRoZXJlIGFyZW4ndCBhbnkuCi0KLVdlZCBBdWcgMTkgMTE6MjA6MjUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtNjhrLXBpbnNuLmM6IGhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlICdyJywgaW50cm9kdWNlZCBmb3IgY2FzMi4KLQotVHVlIEF1ZyAxOCAyMDo0NTo0OCAxOTkyICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCi0KLQkqIG5tLmMgb2JqZHVtcC5jOiBBZGRlZCBzdXBwb3J0IGZvciBhICt2ZXJzaW9uICgtVikKLQl0byBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIuCi0KLQkqIGFyLmMsIGNvcHkuYzogQWRkZWQgc3VwcG9ydCBmb3IgYSAtViBvcHRpb24gdG8gcHJpbnQKLQl0aGUgdmVyc2lvbiBudW1iZXIuCi0KLVR1ZSBBdWcgMTggMTM6Mjg6NDQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtYXBvbGxvNjh2OiByZW1vdmVkIC1nIGZyb20gQ0MgZGVmaW5pdGlvbi4KLQotCSogTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgotCi1Nb24gQXVnIDE3IDE4OjMzOjQxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbTY4ay1waW5zbi5jOiAgTWlub3IgZml4IGluIHN0eWxlIG9mIG91dHB1dCAoZG9uJ3QgdXNlCi0JcmFuZ2UgdG8gaW5kaWNhdGUgZmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlcnMpLgotCi1UdWUgQXVnIDExIDIzOjQyOjIxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhci5jIChtYWluKTogIERvbid0ICphbHdheXMqIHNldCB0aGUgdmVyYm9zZSBmbGFnIQotCi1XZWQgQXVnICA1IDExOjI1OjI3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29weS5jOiAgV2hlbiBpc19zdHJpcCAoYmVjYXVzZSBpdCBpcyBpbnZva2VkIGFzIHRoZSBzdHJpcAotCXByb2dyYW0pLCBmb2xsb3cgdHJhZGl0aW9uYWwgYXJndiBwcm9jZXNzaW5nOgotCSdzdHJpcCBmaWxlMSBmaWxlMicgbm93IHN0cmlwcyBmaWxlMSBhbmQgZmlsZTIsIHJhdGhlcgotCXRoYW4gc3RyaXBwaW5nIGZpbGUxIChhcyBpbnB1dCksIGxlYXZpbmcgb3V0cHV0IGluIGZpbGUyLgotCi1Nb24gSnVsIDI3IDE2OjI4OjA4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X2luZm8sIGRpc3BsYXlfaW5mb190YWJsZSk6ICBDYWxsCi0JYmZkX3NldF9mb3JtYXQoKSBvbiBkdW1teSBiZmQgYmVmb3JlIHVzaW5nIGl0ICh0d2ljZSkuCi0JKiBhci5jOiAgTWFrZSBzdXJlIGFyY2hpdmUgaXMgY3JlYXRlZCBvbiBjb21tYW5kICdyJwotCWV2ZW4gd2hlbiBubyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQuICAoQ2xlYW4gdXAgYW5kCi0Jc2ltcGxpZnkgc29tZSBub24td29ya2luZyByZWxhdGVkIGNvZGUuKQotCi1Nb24gSnVsIDIwIDAyOjQ4OjM4IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBocHBhIHN1cHBvcnQgZG9lc24ndCBhc3N1bWUgaHAgT1MgKGZyb20gc2VmKS4KLQotU2F0IEp1bCAxOCAxNDozNToyMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGhwcGEgaG9zdHMgKGJzZCAmIGhwdXgpLCBlcnJvciBtZXNzYWdlcwotCXRvIHN0ZGVyciwgbm90IHN0ZG91dAotCi1GcmkgSnVsIDE3IDE4OjM5OjQ0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogYXIuMSwgYmludXRpbHMudGV4aSwgaTk2MC1waW5zbi5jLCBubS4xLCBvYmpkdW1wLjEsIHJhbmxpYi4xLAotCSAgc2l6ZS4xLCBzcGFyYy1waW5zbi5jLCBzdHJpcC4xOiByZW1vdmVkIHJjc2lkJ3MuCi0KLVRodSBKdWwgMTYgMTY6NTU6MjQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5kb3M6IHJlbW92ZWQgcmNzaWQuCi0KLVRodSBKdWwgMTYgMDg6MjM6MDcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9iZmQpOiBwcmludCBzdGF0ZSBvZiBCRkRfSVNfUkVMQVhBQkxFIHRvbwotCi1UdWUgSnVuIDMwIDIwOjI2OjE1IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBwcm9ncmFtX3N1ZmZpeCAocGFyYWxsZWwgdG8gcHJvZ3JhbV9wcmVmaXgpCi0KLVRodSBKdW4gMjUgMDQ6NTI6NDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIG5tLmMgKHNvcnRlcnMpOiAgTGludC4gIFJlbW92ZSBleGNlc3Mgd2hpdGVzcGFjZS4KLQotV2VkIEp1biAyNCAxMzo0ODowNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogbm0uYyAodmFsdWVvZiBtYWNybyk6ICBBZGQgbWlzc2luZyBwYXJlbnRoZXNlcy4KLQkoVGhlaXIgbGFjayBzY3Jld2VkIHVwIG51bWVyaWNfZm9yd2FyZCgpLikKLQotU3VuIEp1biAxNCAxMDozMzoyNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkdW1wX2VsZl9zdGFicyk6ICBBbHNvIGR1bXAgLnN0YWIuaW5kZXggYW5kCi0JLnN0YWIuZXhjbCBzZWN0aW9ucy4KLQkoZHVtcF9lbGZfc3RhYnNfMSk6ICBTcGxpdCBvdXQgbWFpbiBib2R5IG9mIG9sZCBkdW1wX2VsZl9zdGFicy4KLQkqIG9iamR1bXAuMSwgYmludXRpbHMudGV4aTogIERvY3VtZW50IG5ldyBzZWN0aW9ucyBkdW1wZWQuCi0KLUZyaSBKdW4gMTIgMjI6MjM6MzUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNpemUuYywgb2JqZHVtcC5jLCBidWNvbW0uYzogIExpbnQuCi0KLVRodSBKdW4gMTEgMDE6MTk6MDYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9lbGZfc3RhYnMpOiBOZXcgZmVhdHVyZTogLS1zdGFicyBwcmludHMgb3V0IGEKLQkuc3RhYiBzZWN0aW9uIGZyb20gYW4gRUxGIGZpbGUuICBJbnN0YWxsZWQgdW5kZXIgI2lmZGVmCi0JRUxGX1NUQUJfRElTUExBWSBzbyBpdCBjYW4gYmUgZWFzaWx5IGRpc2FibGVkLCBzaW5jZSBpdCByZXF1aXJlcwotCWJmZC1pbnRlcm5hbHMgaGVhZGVyIGZpbGVzIGFuZCBzdWNoLgotCSogb2JqZHVtcC4xLCBiaW51dGlscy50ZXhpOiAgVXBkYXRlIGZvciAtLXN0YWJzLiAgQWxzbyBmaXgKLQlvYmpkdW1wJ3MgZG9jIHRvIHVzZSAtLSByYXRoZXIgdGhhbiArIGZvciBsb25nIG9wdGlvbnMuCi0JKEZJWE1FOiAgTm90IHlldCBmaXhlZCBldmVyeXdoZXJlIGluIGJpbnV0aWxzLnRleGluZm8uKQotCi1XZWQgSnVuIDEwIDA3OjUzOjI0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMoZGlzcGxheV9pbmZvKSwgcGF0Y2hlcyBmcm9tCi0JbW9ocmluZ0BpbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlIHRvIHByaW50IHRoZSB0YWJsZSBtdWNoIG1vcmUKLQluaWNlbHkuCi0KLVRodSBNYXkgMjggMTM6MzY6MTYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmM6ICBBZGQgYW5vdGhlciBlbnVtLT5pbnQgY2FzdCwgZm9yIHRoZSBzYWtlIG9mCi0Jb2xkIGNvbXBpbGVycyAoc3VjaCBhcyBQQ0MpLgotCi1XZWQgTWF5IDI3IDEzOjAxOjQ0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogYXJsZXgubDogIERvbid0IGluY2x1ZGUgPHN5c2RlcC5oPiAodW5uZWVkZWQgY29uZmxpY3RzKS4KLQlBZGQgZGVjbGFyYXRpb24gb2Ygc3RyZHVwKCkuCi0KLUZyaSBNYXkgMjIgMTM6NDA6MzcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgVXNlIHNyY2RpciBpbnN0ZWFkIG9mIFZQQVRIIGluIGxkZ3JhbS9sZGxleAotCXJ1bGVzLCBzaW5jZSB0aGVzZSBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgZGlzdHJpYnV0aW9uLgotCSogTWFrZWZpbGUuaW4gKGFybGV4LmMpOiAgRG9uJ3QgcmUtZGlyZWN0IG91dHB1dCwgc2luY2UgdGhhdAotCWxlYXZlcyBhIGJvZ3VzIG91dHB1dCBmaWxlcyBpZiBpdCBmYWlscy4KLQotCSogYXJsZXgubDogIE1ha2Ugd29yayB3aXRoIGxleCwgZm9yIHdoYXQgaXQncyB3b3J0aC4KLQkqIE1ha2VmaWxlLmluOiAgQmV0dGVyIGxleCBzdXBwb3J0LgotCSogTWFrZWZpbGUuaW4gKGRpc3QpOiAgR2VuZXJhdGUgZmxleCBhbmQgYmlzb24gb3V0cHV0cwotCWZvciBkaXN0cmlidXRpb24uCi0KLVRodSBNYXkgMTQgMTc6MTc6NTkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZ2V0IEJJU09OIGRlZmluaXRpb24gcmlnaHQuCi0KLUZyaSBNYXkgIDggMDc6NDc6MDggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIHNhbml0eS5zaDogZGVmYXVsdCBUTVBESVIgdG8gIi4iLgotCi1UaHUgTWF5ICA3IDEyOjM0OjUwIDE5OTIgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGk6IGFkZCBkb2MgZm9yIGFyIGNvbW1hbmQgbGFuZ3VhZ2UuCi0KLVdlZCBNYXkgIDYgMTg6MDU6MzYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFycGFyc2UueTogbWFrZSBFTkQgY2FsbCBhcl9lbmQKLQkqIGFyc3VwLmMgKGFyX2VuZCk6IGFkZGVkLCBkZWxldGVzIHRlbXAgZmlsZSBpZiBhcmNoaXZlIHNlc3Npb24KLQlhYm9ydGVkLgotCi0KLVdlZCBNYXkgIDYgMTE6MDg6NTMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogdXNlIGJpc29uICYgZmxleCBmcm9tIC4uLyBpZiB0aGV5IGV4aXN0LiAgQWxzbywKLQkgIEZMRVgtPkxFWC4KLQotCSogc2FuaXR5LnNoOiByZW1vdmUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aGVuIGZpbmlzaGVkLgotCi1UdWUgTWF5ICA1IDEyOjAwOjU4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb24gMS45Ny4KLQkqIGFyLmM6ICBEZWNsYXJlIGVycm5vIGZvciBtYWNoaW5lcyB0aGF0IG5lZWQgaXQuCi0KLU1vbiBNYXkgIDQgMjM6Mjk6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9pbmZvKTogIEhhbmRsZSBlcnJvciBjYXNlcyB3aXRob3V0IGNvcmVkdW1wLgotCUNsb3NlIHRoZSBkdW1teSB0ZW1wb3JhcnkgZmlsZSB3ZSBvcGVuIGluIHRoZSBsb29wLgotCSogTWFrZWZpbGUuaW4gKGFyc3VwLm8pOiAgQWRkIGtsdWRnZSB0byBidWlsZCB3aXRoIFN1biBNYWtlLgotCi1GcmkgTWF5ICAxIDE2OjIwOjIzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgdGVzdC1pbnN0YWxsIHRhcmdldC4KLQotCSogc2FuaXR5LnNoOiBuZXcgZmlsZS4KLQotCSogTWFrZWZpbGUuaW46IHVzZSBzYW5pdHkgdGVzdCBvbiBtYWtlIGNoZWNrLgotCi1UdWUgQXByIDIxIDEzOjM4OjM3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmV3b3JrIENGTEFHUyBzbyB0aGF0IHRoZXkgY2FuIGJlIHBhc3NlZCBvbiB0aGUKLQkgIGNvbW1hbmQgbGluZSB0byBtYWtlLiAgUmVtb3ZlIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KLQotV2VkIEFwciAxNSAxNDozMzowNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXJzdXAuYywgYXJzdXAuaCwgYXJwYXJzZS55LCBhcmxleC5sOiBzdXBwb3J0IGZvciBhcmNoaXZlCi0Jc2NyaXB0aW5nIGxhbmd1YWdlLgotCi1GcmkgTWFyICA2IDIxOjU0OjUzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgotCi1UaHUgTWFyICA1IDIxOjM1OjQ5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2xlYW4taW5mbyB0YXJnZXQuCi0KLVR1ZSBNYXIgIDMgMTU6MzY6MzcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlICQoQ09QWV9QUk9HKSBmcm9tIFBST0dTLiAgSXQgc2hvdWxkbid0IGJlCi0JICBpbnN0YWxsZWQuIGFkZGVkIHRvb2xkaXIgYW5kIHByb2dyYW1fcHJlZml4LgotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotU3VuIEZlYiAxNiAxMjo1MzowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHZlcnNpb24gdG8gMS45NiwgYW5kIHJlbW92ZSAtYmV0YQotCXN1ZmZpeCBmcm9tIGRpc3RyaWJ1dGlvbiBuYW1lLgotCSogbTY4ay1waW5zbi5jOiAgTmV3IG1hY3JvIENPRVJDRV9TSUdORURfQ0hBUiB0byBleHRyYWN0Ci0JdGhlIHNpZ25lZCB2YWx1ZSBvZiBhIGNoYXJhY3RlciAoZXZlbiBpZiBjaGFycyBhcmUgdW5zaWduZWQpLgotCSogc3BhcmMtcGluc24uYzogIEFkZCBuZXcgb3BlcmFuZCB0eXBlcy4KLQotVGh1IEZlYiAgNiAxMjoxNDoxOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogZG9uJ3QgcHJpbnQgYSBzZWN0aW9uJ3MgY29udGVudHMKLQlpZiBpdCdzIG5vdCBsb2FkYWJsZSAoZWcgYnNzKQotCi1UdWUgSmFuIDI4IDExOjExOjA2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBtNjhrLXBpbnNuLmMgKHByaW50X2luc25fYXJnKTogZml4ZWQgc28gdGhhdCAtdmUgYnJhbmNoCi0JZGlzcGxhY2VtZW50cyBkb24ndCBnZXQgcHJpbnRlZCBhcyBsYXJnZSArdmUgb25lcy4KLQotRnJpIEphbiAyNCAxNDo0Nzo1MyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29weS5jLCBubS5jLCBvYmpkdW1wLmMsIHNpemUuYyA6IGNoYW5nZWQgdG8gdXNlIHRoZQotCW5ldyByZWxvYyBzY2hlbWUuCi0KLQotTW9uIERlYyAzMCAxODozNDo0MSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYnVjb21tLmMgKHByaW50X2FyZWx0X2Rlc2NyKTogIFR3ZWVrIHRoZSBvdXRwdXQgZm9ybWF0Ci0Jc28gdGhhdCAnYXIgdHYnIG91dHB1dCBmb2xsb3dzIFBvc2l4IDEwMDMuMi9EMTEuCi0JT3V0cHV0IGlzIG5vdyBhbHNvIGlkZW50aWNhbCB0byBTdW4ncyAoZXhjZXB0IF9fLlNZTURFRikuCi0KLU1vbiBEZWMgMzAgMDY6MDk6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgTWFrZSBgbWFrZScgb3V0cHV0IG1vcmUgcmVhZGFibGUuCi0KLVdlZCBEZWMgMTggMTU6MDQ6NDUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTQuCi0KLVdlZCBEZWMgMTEgMTY6NDg6MDkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogYXIuYzogYWRkZWQgImIiIHRvIGZvcGVucyBmb3IgZG9zCi0JKiBjb25maWdkai5iYXQsIG1ha2VmaWxlLmRvcyBuZXcgZmlsZXMgZnJvbSBESgotCi1UdWUgRGVjIDEwIDA0OjA3OjI2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCi1TYXQgRGVjICA3IDE3OjA5OjM3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBidWNvbW0uaDogY3JlYXRlZCB0byBob2xkIHByb3RvdHlwZXMgb2YgYnVjb21tLmMKLQkqIG9iamR1bXAuaDogY3JlYXRlZCB0byBob2xkIHByb3RvdHllcyBvZiBvYmpkdW1wLmMKLQkqIGFtMjlrLXBpbnNuLmM6IGluY2x1ZGUgb2JqZHVtcC5oCi0JKiBhci5jOiBpbmNsdWRlIGJ1Y29tbS5oLCBnZXQgYXIuaCBmcm9tIHRoZSByaWdodCBwbGFjZSBhbmQKLQlpbmNsdWRlIGxpYmJmZC5oCi0JKiBidWNvbW0uYzogZGVmdW5pemUgYmZkX2ZhdGFsCi0JKiBjb3B5LmM6IGluY2x1ZGUgYnVjb21tLmgsIGxpbnQuCi0JKiBpOTYwLXBpbnNuLmg6IGluY2x1ZGUgYnVjb21tLmgKLQkqIG02OGstcGluc24uaDogbGludAotCSogbm0uYzogaW5jbHVkZSBidWNvbW0uaCwgbGludAotCSogb2JqZHVtcC5jOiBsaW50Ci0JKiBzcGFyYy1waW5zbi5jOiBpbmNsdWRlIG9iamR1bXAuaAotCi0KLQotRnJpIERlYyAgNiAyMzowMjoxNCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdGFuZGFyZHMudGV4dCBzdXBwb3J0LiAgaW5zdGFsbCB1c2luZwotCSAgSU5TVEFMTF9QUk9HUkFNIGFuZCBJTlNUQUxMX0RBVEEuCi0KLQkqIGNvbmZpZ3VyZS5pbjogY29uZmlndXJlIG5vdyBkb2VzIGFsbCBvZiBpdCdzIHdvcmsgZnJvbSBvYmpkaXIgc28KLQkgIG1ha2UgZmlsZSBleGlzdGVuY2UgdGVzdHMgYWdhaW5zdCAke3NyY2Rpcn0uCi0KLVRodSBEZWMgIDUgMjI6NDY6MjIgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCi0JICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCi0JICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgotCi1XZWQgRGVjICA0IDIyOjQyOjAzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbiAxLjkzLgotCSogTWFrZWZpbGUuaW46ICBBZGQgbWFrZS1zdHJpcC5vOm1heWJlLXN0cmlwLmMgZGVwZW5kZW5jeQotCWZvciBtYWtlIHZlcnNpb25zIHRoYXQgcHJvdmlkZSBoYWxmLWJha2VkIFZQQVRILXN1cHBvcnQgKGUuZy4gU3VuJ3MpLgotCSogc2l6ZS5jOiAgSW1wcm92ZW1lbnRzIHN1Z2dlc3RlZCBieQotCSJkYXZpZCBkIFt6b29dIHp1aG4iIDx6b29AYXBzMS5zcGEudW1uLmVkdT46Ci0JLSBEb24ndCBlbWl0IChCZXJrZWxleSkgaGVhZGVycyBpZiBubyBmaWxlcyB3ZXJlIGZvdW5kLgotCS0gUmV0dXJuIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUgb24gZmFpbHVyZS4KLQotU2F0IE5vdiAzMCAyMTozNDoxOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgZHVlIHRvIGluY2x1ZGUgZmlsZSByZW5hbWluZzoKLQkqIGFtMjlrLXBpbnNuLmM6IGEyOWstb3Bjb2RlLmgJLT4gb3Bjb2RlL2EyOWsuaAotCSogc3BhcmMtcGluc24uYzogc3BhcmMtb3Bjb2RlLmgJLT4gb3Bjb2RlL3NwYXJjLmgKLQkqIG02OGstcGluc24uYzoJIG02OGstb3Bjb2RlLmgJLT4gb3Bjb2RlL202OGsuaAotCSogbm0uYzoJCSBzdGFiLmdudS5oCS0+IGFvdXQvc3RhYl9nbnUuaAotCi1UdWUgTm92IDE5IDE5OjIwOjQzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBNZW50aW9uIE1JTklNSVpFIGZsYWcgZm9yIGJmZCdzIG1ha2UuCi0KLU1vbiBOb3YgMTggMTI6MDU6MzcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogIFZhcmlvdXMgaW1wcm92ZW1lbnRzLgotCi1TdW4gTm92IDE3IDIzOjQwOjU5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbiAxLjkyLgotCSogdmVyc2lvbi5jLCBNYWtlZmlsZS5pbjogIEdldCB2ZXJzaW9uIHN0cmluZyBmcm9tIE1ha2VmaWxlLgotCSogY29weS5jLCBpcy1zdHJpcC5jLCBub3Qtc3RyaXAuYywgbWF5YmUtc3RyaXAuYywgTWFrZWZpbGUuaW46Ci0JTWFrZSB0aGUgc2FtZSBjaGFuZ2UgdGhhdCB3ZSBlYXJsaWVyIGRpZCBmb3IgYXIvcmFubGliOgotCUdlbmVyYXRlIHR3byBkaWZmZXJlbnQgYmluYXJpZXMgZm9yIHN0cmlwIGFuZCBjb3B5IGFuZCB1c2UKLQlhIGdsb2JhbCB2YXJpYWJsZSB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgdG8gZGlzdGluZ3Vpc2gKLQlvc3RyaXAgZnJvbSBjb3B5LiAgKC0xIG1lYW5zIHRvIHVzZSBhcmd2WzBdIHRvIGRlY2lkZSwKLQlzbyB5b3UgY2FuIGdldCB0aGUgb2xkIGJlaGF2aW9yLCBidXQgaXQgaXMgbm8gbG9uZ2VyIHRoZSBkZWZhdWx0KS4KLQkqIGNvcHkuYyAoY29weV9maWxlKTogIFNldCBFWEVDX1Agb2Ygb3V0cHV0IGJmZCBpZiBpbnB1dCBpcyBzby4KLQkqIGNvcHkuYyAobWFpbik6ICBJZiBpc19zdHJpcD09LTEsIGNvbXBhcmUgbGFzdCA1IGNoYXJzCi0Jb2YgYXJndlswXSwgbm90IHRoZSB3aG9sZSBwYXRoLgotCSogY29weS5jIChtYWluKTogUmV0dXJuIDAsIG5vdCAxLgotCSogY29weS5jIChzZXR1cF9zZWN0aW9ucyk6ICBGaXggZHVlIHRvIGNoYW5nZSBpbiBiZmRfbWFrZV9zZWN0aW9uCi0Jbm93IGZhaWxpbmcgaWYgYXNrZWQgZm9yIGEgZHVwbGljYXRlIHNlY3Rpb24uCi0JKiBzdHJpcC5jLCBvc3RyaXAuYzogIFJlbW92ZWQgb2Jzb2xldGUgZmlsZXMuCi0JKiBhci5jLCBub3QtcmFubGliLmMsIG1heWJlLXJhbmxpYi5jOgotCUNoYW5nZSBlbmNvZGluZyBvZiBpc19yYW5saWIgdmFyaWFibGUgdG8gYmUgY29uc2lzdGVudAotCXdpdGggaXNfc3RyaXAgZm9yIHN0cmlwLmNvcHkgKGkuZSAtMSB0byBtZWFucyB1c2UgYXJndlswXSkuCi0KLVRodSBOb3YgMTQgMjA6MTE6MDIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHZlcnNpb24uYyAocHJvZ3JhbV92ZXJzaW9uKTogVXBkYXRlIHRvIHZlcnNpb24gMS45Mi4KLQotVHVlIE5vdiAxMiAxNjoxNzo1MyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYXIuYyAoZ2V0X3Bvc19iZmQpOiAgUHJldmlvdXMgZml4IHdhcyBtaXNzaW5nIGEgImJyZWFrIi4KLQotVGh1IE5vdiAgNyAwODo1NTo1NiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBhbTI5ay1waW5zbi5jOiBGaXhlZCBidWcgaW4gbXRhY2MsIGRtYWMgYW5kIGZtYWMgaW5zdHJ1Y3Rpb24KLQllbmNvZGluZ3MuIChUaGFrcyB0byBEYXZpZCBXb29kKQotCi1TdW4gTm92ICAzIDE0OjUwOjIzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoJChESVNUX05BTUUpLnRhci5aKSwgVE9ETzogIFZhcmlvdXMgZml4ZXMuCi0JKiBhci5jIChnZXRfcG9zX2JmZCk6IEZpeCB0byBoYW5kbGluZyBvZiBiZWZvcmUvYWZ0ZXIKLQlwb3NpdGlvbmluZyBvcHRpb25zLgotCSogYnVjb21tLmMgKGZhdGFsKTogIE1JU1NJTkdfVkZQUklOVEYgaXMgbm8gbG9uZ2VyIGFuIGlzc3VlLAotCXNpbmNlIGxpYmliZXJ0eSBjb250YWlucyB2ZnByaW50ZiBldGMgaWYgb3RoZXJ3aXNlIG1pc3NpbmcuCi0JKiBtNjhrLXBpbnNuLmMgKHByaW50X2luc25fYXJnKTogIFN1cHBvcnQgQkIvQlcvQkwKLQl0eXBlIG9wZXJhbmRzLCBhcyB1c2VkIGJ5IGJyYW5jaCBpbnN0cnVjdGlvbnMuCi0JKiBubS5jOiAgRGVsZWdhdGUgcHJpbnRpbmcgb2Ygc3ltYm9scyB0byBCRkQsCi0JYnkgdXNpbmcgYmZkX3ByaW50X3N5bWJvbCB0byBkbyB0aGUgZm9ybWF0dGluZy4KLQotTW9uIE9jdCAyOCAxMToyMDo0NyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyLmMgKHdyaXRlX2FyY2hpdmUuYyk6IGFkZGVkIHVubGluayBiZWZvcmUgcmVuYW1lIHNpbmNlIHNvbWUKLQlzeXN0ZW1zIGNhbid0IHJlbmFtZSBvbnRvIGFuIGV4aXN0YW50IGZpbGUuCi0KLU1vbiBPY3QgMjEgMDk6NDc6MjMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogbm0uYzogbm93IGRvZXNuJ3QgY3Jhc2ggaWYgYSBzeW1ib2wgd2l0aCBubyBzZWN0aW9uIGFuZCBubwotCVNFQ19BQlMgYXBwZWFycy4KLQotVGh1IE9jdCAxNyAxNToyNTo1MCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIHZlcnNpb24uYzogIEJ1bXAgdG8gdmVyc2lvbiAxLjkxLgotCi1XZWQgT2N0IDE2IDExOjQ1OjM2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgYXIuYywgYnVjb21tLmMsIGNvcHkuYywgY3BsdXMtZGVtLmMsIGZpbGVtb2RlLmMsCi0JaTk2MC1waW5zbi5jLCBtNjhrLXBpbnNuLmMsIG5tLmMsIG9iamR1bXAuYywgc2l6ZS5jLCBzcGFyYy1waW5zbi5jLAotCSogc3RyaXAuYzogQWRkIG9yIHVwZGF0ZSBDb3B5cmlnaHQgbm90aWNlLgotCSogVE9ETzogIEFkZCBub3RlIG9uICdubSAtYScuCi0JKiB2ZXJzaW9uLmM6IFVwZGF0ZSB2ZXJzaW9uIG51bWJlciB0byAxLjkwLgotCSogTWFrZWZpbGUuaW46IEZpeCBtYWtpbmcgb2YgZG9jdW1lbnRhdGlvbiBmb3IgZGlzdC4KLQotVHVlIE9jdCAxNSAwMDoxNzoxNyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBOZXcga2x1ZGd5IHJ1bGVzIGZvciBtYWtpbmcgYSB0YXJmaWxlLgotCSogTWFrZWZpbGUuaW46IEZpeCBiaW5kaXIgcGF0aC4KLQotTW9uIE9jdCAxNCAxNzozNDoyOSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIHRhcmdldHMgYmludXRpbHMubW0sIGJpbnV0aWxzLm1lCi0KLUZyaSBPY3QgMTEgMjI6NDQ6MjEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQXZvaWQgU3VuIE1ha2UgVlBBVEggYnVncyBieSBhZGRpbmcgZGVwZW5kZW5jaWVzLgotCi1GcmkgT2N0IDExIDEyOjUxOjMzIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgdGFyZ2V0ICJiaW51dGlscy5tcyIKLQotCSogYmludXRpbHMudGV4aW5mbzogbWlub3IgcmVzdHJ1Y3R1cmluZyBmb3IgdGV4aTJyb2ZmIGNvbWZvcnQuCi0KLUZyaSBPY3QgMTEgMDQ6MTI6MjggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQlSZXN0cnVjdHVyZSBjb25maWd1cmF0aW9uIHNjaGVtZSBmb3IgYmZkLCBiaW51dGlscywgbGQuCi0KLQkqIGluY2x1ZGUvc3lzL2gtKi5oOiAgTW92ZSB0byBiZmQvaG9zdHMvaC0qLmguCi0JKiBjb25maWd1cmUuaW46ICBSZXZpc2UgdG8gc3ltbGluayBzeXNkZXAuaCB0byAuLi9iZmQvaG9zdHMvaC14eHguaC4KLQlDaGFuZ2Ugc29tZSBjb25maWcgbmFtZXMgdG8gbWF0Y2ggb3RoZXIgZGlycy4KLQkqICouYzogIEluY2x1ZGUgYmZkLmggYmVmb3JlIHN5c2RlcC5oLCBzbyBhbnNpZGVjbCBhbmQgUFJPVE8oKQotCWdldCBkZWZpbmVkIGZpcnN0LgotCSogTWFrZWZpbGUuaW46ICBVc2UgLUkuIHRvIGdldCBzeXNkZXAuaC4KLQotV2VkIE9jdCAgOSAyMjo0Mjo1NiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbm0uYyAocHJpbnRfc3ltYm9scyk6ICBIYW5kbGUgTlVMTCBuYW1lIGZpZWxkIG9mIHN5bWJvbC4KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmVkIHNwdXJpb3VzIGNvbW1lbnQuCi0KLVR1ZSBPY3QgIDggMTY6NTU6MDMgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aW5mbzogbWlub3IgdHlwb3MsIHBocmFzaW5nLCBmb3JtYXR0aW5nIGZpeGVzLgotCi1UdWUgT2N0ICA4IDE1OjEzOjIwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEdldCBob3N0IGZpbGUgZnJvbSAuLi9iZmQvY29uZmlnLCBub3QgY29uZmlnLgotCSogY29uZmlnLyo6IFJlbW92ZSBjb25maWcgZGlyZWN0b3J5IGFuZCBpdHMgZmlsZXMuCi0KLVR1ZSBPY3QgIDggMTM6NTg6NTkgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG5ldyB0YXJnZXRzIGJpbnV0aWxzLmR2aSwgYmludXRpbHMuaW5mbwotCi0JKiBiaW51dGlscy50ZXhpbmZvOiByZW1vdmUgbW9zdCByZW1haW5pbmcgRklYTUUncywgZGVsZXRlCi0JcmVmZXJlbmNlcyB0byBfXy5TWU1ERUYgYnkgbmFtZQotCi0KLVR1ZSBPY3QgIDggMTA6MjM6NDQgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHByaW50X2FkZHJlc3MpIFByaW50IGFkZHJlc3NlcyBuaWNlbHkuCi0KLU1vbiBPY3QgIDcgMTE6MzE6MDUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyLmMsIE1ha2VmaWxlLmluLCBuZXcgZmlsZXMge2lzLG5vdCxtYXliZX0tcmFubGliLmM6Ci0JTWFrZSB0d28gZGlmZmVyZW50IGJpbmFyaWVzIGZvciBhciBhbmQgcmFubGliLCBpbnN0ZWFkIG9mCi0JZGlzdGluZ3Vpc2hpbmcgdGhlbSBhdCBydW4gdGltZSB1c2luZyBhcmd2WzBdLgotCShPbGQgYmVoYXZpb3IgaXMgc3RpbGwgYXZhaWxhYmxlIGlmIHlvdSAibWFrZSBhcl93aXRoX3JhbmxpYiIsCi0JYnV0IGl0IGlzIG5vdCB0aGUgZGVmYXVsdC4pCi0JKiByYW5saWIuc2ggKG5ldyk6ICBBbiBhbHRlcm5hdGl2ZSBvbmUtbGluZQotCXNoZWxsIGltcGxlbWVudGF0aW9uIG9mIHJhbmxpYi4KLQotRnJpIE9jdCAgNCAyMTo0OTo0NCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiAgQ29wZSB3aXRoIHJlbmFtZXMgb2YgYSBmZXcgQkZEIHR5cGVzICYgZW51bXMuCi0KLUZyaSBPY3QgIDQgMTk6MDg6MDkgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aW5mbzogYWRkIG5ldyBmaWxlIChydWRpbWVudGFyeSBkb2NuKQotCi1Nb24gU2VwIDMwIDEyOjMwOjM5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvaG1ha2UtbmV3czogQWRkIG5ldyBmaWxlIChmb3IgU29ueSBORVdTT1MzKS4KLQkqIGJ1Y29tbS5jIChmYXRhbCk6ICBDb25kaXRpb25hbGx5IGNvbXBpbGUgZmF0YWwoKSBkZXBlbmRpbmcgb24KLQlNSVNTSU5HX1ZGUFJJTlRGLCBhbmQgZG9uJ3QgY29uZnVzZSB0aGUgaXNzdWUgd2l0aCBOT19WQVJBUkdTLgotCSogb2JqZHVtcC5jIChkdW1wX2hlYWRlcnMpOiAgVHJpdmlhbCBvdXRwdXQgZm9ybWF0IGNoYW5nZS4KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9pbmZvKTogTG9vcCBvdmVyIGludGVnZXJzLCBub3QgZW51bXMsCi0JdG8gYXBwZWFzZSBvbGQgY29tcGlsZXJzLgotCi1Nb24gTWF5IDIwIDE2OjE0OjA3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLSAgICAgICAgKm9iamR1bXAuYyAqbm0uYyAqY29weS5jIDpoYW5nZWQgc29tZSB0eXBlcyB0byB3b3JrIHdpdGggNjQgYml0IG9iamVjdCBmaWxlcwotCi1UaHUgTWF5IDE2IDE2OjA2OjU1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0gICAgIGZyb20gYm90aGVyCi0JKiBvYmpkdW1wLmMgKHByaW50X2FkZHJlc3MpOiBNYWtlIGRpc2FzZW1ibGVkIG91dHB1dCBtb3JlCi0JY29uc2lzdGVudCB3aXRoIGdkYiBhbmQgYXM6IEFkZCAweCB3aGVuIHByaW50aW5nIGhleC4KLQlEb24ndCBwcmludCBleHRyYSBsZWFkaW5nIHplcm9zLgotCUF0dGVtcHQgdG8gbm90IHByaW50ICJmaWxlbmFtZS5vIi4KLQkqIG9iamR1bXAuYzogQWRkIHNvbWUgZW51bS10by1pbnQgY2FzdHMgdG8gYWNjb21vZGF0ZSBvbGQgY29tcGlsZXJzLgotCi0KLUZyaSBNYXkgIDMgMjI6MjE6NDQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBjb3B5LmM6ICBDaGFuZ2UgPSYgY29uc3RydWN0cyB0byA9ICYsIHNpbmNlIHRoZXkgY29uZnVzZSBvbGRlcgotCUMgY29tcGlsZXJzLgotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9iaW51dGlscy9NYWtlZmlsZS5hbSBiL2JpbnV0aWxzL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2JkNmI3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsNTAwICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotIyMgRklYTUU6IFdvcmsgYXJvdW5kIGFwcGFyZW50IGJ1ZyBpbiBhdXRvbWFrZS4KLUlOVExMSUJTID0gQElOVExMSUJTQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzIGRlamFnbnUKLQotU1VCRElSUyA9IHBvCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKLQotIyMgVGhlc2UgYXJlbid0IHNldCBieSBhdXRvbWFrZSwgYmVjYXVzZSB0aGV5IGFwcGVhciBpbgotIyMgYmZkL2FjaW5jbHVkZS5tNCwgd2hpY2ggaXMgaW5jbHVkZWQgYnkgYmludXRpbHMvYWNpbmNsdWRlLm00LCBhbmQKLSMjIHRodXMgaXMgbm90IHNlZW4gYnkgYXV0b21ha2UuCi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotCi1ZQUNDID0gYGlmIFsgLWYgLi4vYmlzb24vYmlzb24gXTsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLzsgZWxzZSBlY2hvIEBZQUNDQDsgZmlgCi1ZRkxBR1MgPSAtZAotTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF07IHRoZW4gZWNobyAuLi9mbGV4L2ZsZXg7IGVsc2UgZWNobyBATEVYQDsgZmlgCi0KLSMgdGhlc2UgdHdvIGFyZSBhbG1vc3QgdGhlIHNhbWUgcHJvZ3JhbQotQVJfUFJPRz1hcgotUkFOTElCX1BST0c9cmFubGliCi0KLSMgb2JqY29weSBhbmQgc3RyaXAgc2hvdWxkIGJlIHRoZSBzYW1lIHByb2dyYW0KLU9CSkNPUFlfUFJPRz1vYmpjb3B5Ci1TVFJJUF9QUk9HPXN0cmlwLW5ldwotCi1TVFJJTkdTX1BST0c9c3RyaW5ncwotCi1SRUFERUxGX1BST0c9cmVhZGVsZgotCi0jIFRoZXNlIHNob3VsZCBhbGwgYmUgdGhlIHNhbWUgcHJvZ3JhbSB0b28uCi1TSVpFX1BST0c9c2l6ZQotTk1fUFJPRz1ubS1uZXcKLU9CSkRVTVBfUFJPRz1vYmpkdW1wCi0KLSMgVGhpcyBpcyB0aGUgZGVtYW5nbGVyLCBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLSMgTm90ZTogVGhpcyBvbmUgaXMgdXNlZCBhcyB0aGUgaW5zdGFsbGVkIG5hbWUgdG9vLCB1bmxpa2UgdGhlIGFib3ZlLgotREVNQU5HTEVSX1BST0c9Y3h4ZmlsdAotCi1BRERSMkxJTkVfUFJPRz1hZGRyMmxpbmUKLQotTkxNQ09OVl9QUk9HPW5sbWNvbnYKLURMTFRPT0xfUFJPRz1kbGx0b29sCi1XSU5EUkVTX1BST0c9d2luZHJlcwotRExMV1JBUF9QUk9HPWRsbHdyYXAKLQotU1JDT05WX1BST0c9c3Jjb252JChFWEVFWFQpIHN5c2R1bXAkKEVYRUVYVCkgY29mZmR1bXAkKEVYRUVYVCkgCi0KLW1hbl9NQU5TID0gYXIuMSBubS4xIG9iamR1bXAuMSByYW5saWIuMSBzaXplLjEgc3RyaW5ncy4xIHN0cmlwLjEgb2JqY29weS4xIFwKLQlhZGRyMmxpbmUuMSBubG1jb252LjEgJChERU1BTkdMRVJfTkFNRSkuMQotCi1QUk9HUyA9ICQoU0laRV9QUk9HKSAkKE9CSkRVTVBfUFJPRykgJChOTV9QUk9HKSAkKEFSX1BST0cpICQoU1RSSU5HU19QUk9HKSAkKFNUUklQX1BST0cpICQoUkFOTElCX1BST0cpICQoREVNQU5HTEVSX1BST0cpICQoT0JKQ09QWV9QUk9HKSBAQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCAkKEFERFIyTElORV9QUk9HKSAkKFJFQURFTEZfUFJPRykgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAotCi1iaW5fUFJPR1JBTVMgPSAkKFNJWkVfUFJPRykgJChPQkpEVU1QX1BST0cpICQoQVJfUFJPRykgJChTVFJJTkdTX1BST0cpICQoUkFOTElCX1BST0cpICQoT0JKQ09QWV9QUk9HKSBAQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCAkKEFERFIyTElORV9QUk9HKSAkKFJFQURFTEZfUFJPRykgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAotCi0jIyBXZSBuZWVkIGEgc3BlY2lhbCBydWxlIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIHdoaWNoIGFyZSBidWlsdCB3aXRoCi0jIyAtbmV3LCBhbmQgdG8gcmVuYW1lIGN4eGZpbHQgdG8gYysrZmlsdC4KLW5vaW5zdF9QUk9HUkFNUyA9ICQoTk1fUFJPRykgJChTVFJJUF9QUk9HKSAkKERFTUFOR0xFUl9QUk9HKQotCi1FWFRSQV9QUk9HUkFNUyA9ICQoTkxNQ09OVl9QUk9HKSBzcmNvbnYgc3lzZHVtcCBjb2ZmZHVtcCAkKERMTFRPT0xfUFJPRykgJChXSU5EUkVTX1BST0cpICQoRExMV1JBUF9QUk9HKQotCi0jIFN0dWZmIHRoYXQgZ29lcyBpbiB0b29sZGlyLyBpZiBhcHByb3ByaWF0ZQotVE9PTF9QUk9HUyA9IG5tLW5ldyBzdHJpcC1uZXcgYXIgcmFubGliIGRsbHRvb2wKLQotQkFTRURJUiA9ICQoc3JjZGlyKS8uLgotQkZERElSID0gJChCQVNFRElSKS9iZmQKLUlOQ0RJUgk9ICQoQkFTRURJUikvaW5jbHVkZQotCi1NS0RFUCA9IG1rZGVwCi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKEJGRERJUikgLUkkKElOQ0RJUikgQEhERUZJTkVTQCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLUhGSUxFUyA9IGFyc3VwLmggYnVjb21tLmggYnVkYmcuaCBjb2ZmZ3Jvay5oIGRlYnVnLmggbmxtY29udi5oIGRsbHRvb2wuaCBcCi0Jd2luZHJlcy5oIHdpbmR1bmkuaCBkeW4tc3RyaW5nLmgKLQotR0VORVJBVEVEX0hGSUxFUyA9IGFycGFyc2UuaCBzeXNyb2ZmLmggc3lzaW5mby5oIGRlZnBhcnNlLmgKLQotQ0ZJTEVTID0gYWRkcjJsaW5lLmMgYXIuYyBhcnN1cC5jIGJ1Y29tbS5jIGNvZmZkdW1wLmMgY29mZmdyb2suYyBkZWJ1Zy5jIFwKLQlkbGx0b29sLmMgZmlsZW1vZGUuYyBpZWVlLmMgaXMtcmFubGliLmMgaXMtc3RyaXAuYyBtYXliZS1yYW5saWIuYyBcCi0JbWF5YmUtc3RyaXAuYyBubG1jb252LmMgbm0uYyBub3QtcmFubGliLmMgbm90LXN0cmlwLmMgXAotCW9iamNvcHkuYyBvYmpkdW1wLmMgcHJkYmcuYyByZGNvZmYuYyByZGRiZy5jIHNpemUuYyBzcmNvbnYuYyBcCi0Jc3RhYnMuYyBzdHJpbmdzLmMgc3lzZHVtcC5jIHZlcnNpb24uYyB3cnN0YWJzLmMgXAotCXdpbmRyZXMuYyByZXNyYy5jIHJlc2NvZmYuYyByZXNiaW4uYyB3aW5kdW5pLmMgcmVhZGVsZi5jIFwKLQlyZXNyZXMuYyBkeW4tc3RyaW5nLmMgZGxsd3JhcC5jIHJlbmFtZS5jCi0KLUdFTkVSQVRFRF9DRklMRVMgPSBcCi0JdW5kZXJzY29yZS5jIGFycGFyc2UuYyBhcmxleC5jIHN5c3JvZmYuYyBzeXNpbmZvLmMgc3lzbGV4LmMgXAotCWRlZnBhcnNlLmMgZGVmbGV4LmMgbmxtaGVhZGVyLmMgcmNwYXJzZS5jIHJjbGV4LmMKLQotREVCVUdfU1JDUyA9IHJkZGJnLmMgZGVidWcuYyBzdGFicy5jIGllZWUuYyByZGNvZmYuYwotV1JJVEVfREVCVUdfU1JDUyA9ICQoREVCVUdfU1JDUykgd3JzdGFicy5jCi0KLSMgQ29kZSBzaGFyZWQgYnkgYWxsIHRoZSBiaW51dGlscy4KLUJVTElCUyA9IGJ1Y29tbS5jIHZlcnNpb24uYyBmaWxlbW9kZS5jCi0KLUJGRExJQiA9IC4uL2JmZC9saWJiZmQubGEKLQotT1BDT0RFUyA9IC4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYQotCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotUE9URklMRVMgPSAkKENGSUxFUykgJChERUJVR19TUkNTKSAkKEhGSUxFUykKLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLUVYUEVDVCA9IGBpZiBbIC1mICQkci8uLi9leHBlY3QvZXhwZWN0IF0gOyB0aGVuIFwKLSAgICAgICAgICBlY2hvICQkci8uLi9leHBlY3QvZXhwZWN0IDsgXAotICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKLVJVTlRFU1QgPSBgaWYgWyAtZiAke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyB0aGVuIFwKLSAgICAgICAgICAgZWNobyAke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgXAotICAgICAgICAgICBlbHNlIGVjaG8gcnVudGVzdCA7ICBmaWAKLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvLi4vbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy8gLWlkaXJhZnRlciAkJHIvLi4vbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQke3NyY3Jvb3R9Ly4uL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiQGhvc3RAIiA9ICJAdGFyZ2V0QCIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyBnY2MgfCBzZWQgJyQodHJhbnNmb3JtKSc7IFwKLSAgICBmaTsgXAotICBmaWAKLQotY2hlY2stREVKQUdOVTogc2l0ZS5leHAKLQlzcmNkaXI9YGNkICQoc3JjZGlyKSAmJiBwd2RgOyBleHBvcnQgc3JjZGlyOyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlFWFBFQ1Q9JChFWFBFQ1QpOyBleHBvcnQgRVhQRUNUOyBcCi0JaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdOyB0aGVuIFwKLQkgIFRDTF9MSUJSQVJZPWBjZCAkKHRvcF9zcmNkaXIpLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKLQkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAotCWZpOyBcCi0JcnVudGVzdD0kKFJVTlRFU1QpOyBcCi0JaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgJCRydW50ZXN0IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHtzcmNkaXJ9L3Rlc3RzdWl0ZSBcCi0JCUNDX0ZPUl9UQVJHRVQ9IiQoQ0NfRk9SX1RBUkdFVCkiIFwKLQkJQ0ZMQUdTX0ZPUl9UQVJHRVQ9IiQoQ0ZMQUdTKSIgJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi1pbnN0YWxsY2hlY2s6Ci0JL2Jpbi9zaCAkKHNyY2Rpcikvc2FuaXR5LnNoICQoYmluZGlyKQotCi1pbmZvX1RFWElORk9TID0gYmludXRpbHMudGV4aQotCi1MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotc2l6ZV9TT1VSQ0VTID0gc2l6ZS5jICQoQlVMSUJTKQotCi1vYmpjb3B5X1NPVVJDRVMgPSBvYmpjb3B5LmMgbm90LXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKLQotc3RyaW5nc19TT1VSQ0VTID0gc3RyaW5ncy5jICQoQlVMSUJTKQotCi1yZWFkZWxmX1NPVVJDRVMgPSByZWFkZWxmLmMgdmVyc2lvbi5jCi1yZWFkZWxmX0xEQUREICAgPSAkKElOVExMSUJTKSAkKExJQklCRVJUWSkKLQotc3RyaXBfbmV3X1NPVVJDRVMgPSBvYmpjb3B5LmMgaXMtc3RyaXAuYyByZW5hbWUuYyAkKFdSSVRFX0RFQlVHX1NSQ1MpICQoQlVMSUJTKQotCi1ubV9uZXdfU09VUkNFUyA9IG5tLmMgJChCVUxJQlMpCi0KLW9iamR1bXBfU09VUkNFUyA9IG9iamR1bXAuYyBwcmRiZy5jICQoREVCVUdfU1JDUykgJChCVUxJQlMpCi1vYmpkdW1wX0xEQUREID0gJChPUENPREVTKSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLXVuZGVyc2NvcmUuYzogc3RhbXAtdW5kZXIgOyBAdHJ1ZQotCi1zdGFtcC11bmRlcjogTWFrZWZpbGUKLQllY2hvICcvKldBUk5JTkc6IFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCEqLycgPnVuZGVyc2NvcmUudAotCWVjaG8gImludCBwcmVwZW5kc191bmRlcnNjb3JlID0gQFVOREVSU0NPUkVAOyIgPj51bmRlcnNjb3JlLnQKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdW5kZXJzY29yZS50IHVuZGVyc2NvcmUuYwotCXRvdWNoIHN0YW1wLXVuZGVyCi0KLWNwbHVzLWRlbS5vOiAkKEJBU0VESVIpL2xpYmliZXJ0eS9jcGx1cy1kZW0uYyAkKElOQ0RJUikvZ2V0b3B0LmgKLQkkKENPTVBJTEUpIC1jIC1ETUFJTiAtRFZFUlNJT049JyIkKFZFUlNJT04pIicgJChCQVNFRElSKS9saWJpYmVydHkvY3BsdXMtZGVtLmMKLQotY3h4ZmlsdF9TT1VSQ0VTID0KLWN4eGZpbHRfTERBREQgPSBjcGx1cy1kZW0ubyB1bmRlcnNjb3JlLm8gJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLWFyX1NPVVJDRVMgPSBhcnBhcnNlLnkgYXJsZXgubCBhci5jIG5vdC1yYW5saWIuYyBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQotYXJfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLXJhbmxpYl9TT1VSQ0VTID0gYXIuYyBpcy1yYW5saWIuYyBhcnBhcnNlLnkgYXJsZXgubCBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQotcmFubGliX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1hZGRyMmxpbmVfU09VUkNFUyA9IGFkZHIybGluZS5jICQoQlVMSUJTKQotCi0jIFRoZSBmb2xsb3dpbmcgaXMgY29tbWVudGVkIG91dCBmb3IgdGhlIGNvbnZlcnRpb24gdG8gYXV0b21ha2UuCi0jIFRoaXMgcnVsZSBjcmVhdGVzIGEgc2luZ2xlIGJpbmFyeSB0aGF0IHN3aXRjaGVzIGJldHdlZW4gYXIgYW5kIHJhbmxpYgotIyBieSBsb29raW5nIGF0IGFyZ3ZbMF0uICBVc2UgdGhpcyBrbHVkZ2UgdG8gc2F2ZSBzb21lIGRpc2sgc3BhY2UuCi0jIEhvd2V2ZXIsIHlvdSBoYXZlIHRvIGluc3RhbGwgdGhpbmdzIGJ5IGhhbmQuCi0jIChUaGF0IGlzIGFmdGVyICdtYWtlIGluc3RhbGwnLCByZXBsYWNlIHRoZSBpbnN0YWxsZWQgcmFubGliIGJ5IGEgbGluayB0byBhci4pCi0jIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gaW5zdGFsbCByYW5saWIuc2ggYXMgcmFubGliLgotIyBhcl93aXRoX3JhbmxpYjogJChBRERMX0RFUFMpIGFyLm8gbWF5YmUtcmFubGliLm8KLSMJJChITERFTlYpICQoQ0MpICQoSExERkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICQoQVJfUFJPRykgYXIubyBtYXliZS1yYW5saWIubyAkKEFERExfTElCUykgJChFWFRSQUxJQlMpCi0jCS1ybSAtZiAkKFJBTkxJQl9QUk9HKQotIwktbG4gJChBUl9QUk9HKSAkKFJBTkxJQl9QUk9HKQotIwotIyBvYmpjb3B5IGFuZCBzdHJpcCBpbiBvbmUgYmluYXJ5IHRoYXQgdXNlcyBhcmd2WzBdIHRvIGRlY2lkZSBpdHMgYWN0aW9uLgotIwotI29iamNvcHlfd2l0aF9zdHJpcDogJChBRERMX0RFUFMpIG9iamNvcHkubyBtYXliZS1zdHJpcC5vCi0jCSQoSExERU5WKSAkKENDKSAkKEhMREZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkKE9CSkNPUFlfUFJPRykgb2JqY29weS5vIG1heWJlLXN0cmlwLm8gJChBRERMX0xJQlMpICQoRVhUUkFMSUJTKQotIwktcm0gLWYgJChTVFJJUF9QUk9HKQotIwktbG4gJChPQkpDT1BZX1BST0cpICQoU1RSSVBfUFJPRykKLQotc3lzcm9mZi5jOiBzeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSBzeXNyb2ZmLmluZm8gCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtYyA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+c3lzcm9mZi5jCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtaSA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+PnN5c3JvZmYuYwotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWcgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPj5zeXNyb2ZmLmMKLQotc3lzcm9mZi5oOiBzeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSBzeXNyb2ZmLmluZm8KLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1kIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID5zeXNyb2ZmLmgKLQotc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCk6IHN5c2luZm8ubyBzeXNsZXgubwotCSQoQ0NfRk9SX0JVSUxEKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQCBzeXNpbmZvLm8gc3lzbGV4Lm8gCi0KLXN5c2xleC5vOiBzeXNsZXguYyBzeXNpbmZvLmgKLQlpZiBbIC1yIHN5c2xleC5jIF07IHRoZW4gXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgIHN5c2xleC5jICA7IFwKLQllbHNlIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gLUkkKHNyY2RpcikgJChDRkxBR1MpICQoc3JjZGlyKS9zeXNsZXguYyA7XAotCWZpCi0KLXN5c2luZm8ubzogc3lzaW5mby5jCi0JaWYgWyAtciBzeXNpbmZvLmMgXTsgdGhlbiBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAgc3lzaW5mby5jICA7IFwKLQllbHNlIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICQoc3JjZGlyKS9zeXNpbmZvLmMgOyBcCi0JZmkKLQotc3Jjb252X1NPVVJDRVMgPSBzcmNvbnYuYyBjb2ZmZ3Jvay5jICQoQlVMSUJTKQotCi1kbGx0b29sX1NPVVJDRVMgPSBkbGx0b29sLmMgZGVmcGFyc2UueSBkZWZsZXgubCBkeW4tc3RyaW5nLmMgJChCVUxJQlMpCi1kbGx0b29sX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1kbGx0b29sLm86ZGxsdG9vbC5jCi0JJChDT01QSUxFKSAtYyAkKERMTFRPT0xfREVGUykgJChzcmNkaXIpL2RsbHRvb2wuYwotCi1yZXNjb2ZmLm86cmVzY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKERMTFRPT0xfREVGUykgJChzcmNkaXIpL3Jlc2NvZmYuYwotCi1jb2ZmZHVtcF9TT1VSQ0VTID0gY29mZmR1bXAuYyBjb2ZmZ3Jvay5jICQoQlVMSUJTKQotCi1zeXNkdW1wX1NPVVJDRVMgPSBzeXNkdW1wLmMgJChCVUxJQlMpCi0KLSMgY29mZi9zeW0uaCBhbmQgY29mZi9lY29mZi5oIHdvbid0IGJlIGZvdW5kIGJ5IHRoZSBhdXRvbWF0aWMgZGVwZW5kZW5jeQotIyBzY3JpcHRzLCBzaW5jZSB0aGV5IGFyZSBvbmx5IGluY2x1ZGVkIGNvbmRpdGlvbmFsbHkuCi1ubG1jb252Lm86IG5sbWNvbnYuYyAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0JbGRuYW1lPWBlY2hvIGxkIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCSQoQ09NUElMRSkgLWMgLURMRF9OQU1FPSJcIiQke2xkbmFtZX1cIiIgQE5MTUNPTlZfREVGU0AgJChzcmNkaXIpL25sbWNvbnYuYwotCi1ubG1jb252X1NPVVJDRVMgPSBubG1jb252LmMgbmxtaGVhZGVyLnkgJChCVUxJQlMpCi0KLXdpbmRyZXNfU09VUkNFUyA9IHdpbmRyZXMuYyByZXNyYy5jIHJlc2NvZmYuYyByZXNiaW4uYyByY3BhcnNlLnkgcmNsZXgubCBcCi0Jd2luZHVuaS5jIHJlc3Jlcy5jICQoQlVMSUJTKQotd2luZHJlc19MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotZGxsd3JhcF9TT1VSQ0VTID0gZGxsd3JhcC5jIGR5bi1zdHJpbmcuYyAKLWRsbHdyYXBfTERBREQgPSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotCi1ESVNUU1RVRkYgPSBhcnBhcnNlLmMgYXJwYXJzZS5oIGFybGV4LmMgbmxtaGVhZGVyLmMgc3lzaW5mby5jIHN5c2luZm8uaCBcCi0Jc3lzbGV4LmMgZGVmbGV4LmMgZGVmcGFyc2UuaCBkZWZwYXJzZS5jIHJjbGV4LmMgcmNwYXJzZS5oIHJjcGFyc2UuYwotCi1kaXN0c3R1ZmY6ICQoRElTVFNUVUZGKSBpbmZvCi0KLURJU1RDTEVBTkZJTEVTID0gc3RhbXAtdW5kZXIgc3lzaW5mbyB1bmRlcnNjb3JlLmMgc3lzcm9mZi5jIHN5c3JvZmYuaCBcCi0Jc2l0ZS5leHAgc2l0ZS5iYWsKLQotIyBUYXJnZXRzIHRvIHJlYnVpbGQgZGVwZW5kZW5jaWVzIGluIHRoaXMgTWFrZWZpbGUuCi0jIEhhdmUgdG8gZ2V0IHJpZCBvZiBERVAxIGhlcmUgc28gdGhhdCAiJD8iIGxhdGVyIGluY2x1ZGVzIGFsbCBvZiAkKENGSUxFUykuCi1ERVA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykgY29uZmlnLmgKLQlybSAtZiBERVAxCi0JJChNQUtFKSBNS0RFUD0kKE1LREVQKSBERVAxCi0Jc2VkIC1mIGRlcC5zZWQgPERFUDEgPkRFUAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotREVQMTogJChDRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykKLQlybSAtZiBERVAyCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVAyCi0JJChNS0RFUCkgLWYgREVQMiAkKElOQ0xVREVTKSAkPwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBERVAyIERFUDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jb2JqZGlyPWBwd2RgOyBcCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQEJGRERJUkAhJChCRkRESVIpIScJXAotCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwlcCi0JCS1lICJzIUBPQkpESVJAISQke29iamRpcn0hIgotCi1kZXA6IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgTWFrZWZpbGUgPiB0bXAtTWFrZWZpbGUKLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlLmluCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLQotZGVwLWFtOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIyMKLSMgRE9DVU1FTlRBVElPTiBUQVJHRVRTCi1jb25maWcudGV4aTogTWFrZWZpbGUKLQlybSAtZiBjb25maWcudGV4aQotCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+IGNvbmZpZy50ZXhpCi0KLWJpbnV0aWxzLmR2aTogJChzcmNkaXIpL2JpbnV0aWxzLnRleGkgY29uZmlnLnRleGkKLQotYmludXRpbHMuaW5mbzogJChzcmNkaXIpL2JpbnV0aWxzLnRleGkgY29uZmlnLnRleGkKLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBjb25maWcudGV4aQotCi0kKERFTUFOR0xFUl9OQU1FKS4xOiBjeHhmaWx0Lm1hbiBNYWtlZmlsZQotCXNlZCAtZSAncy9AUFJPR1JBTUAvJChERU1BTkdMRVJfTkFNRSkvJyA8ICQoc3JjZGlyKS9jeHhmaWx0Lm1hbiBcCi0JCT4gJChERU1BTkdMRVJfTkFNRSkuMQotCi1NT1NUTFlDTEVBTkZJTEVTID0gc3lzaW5mbyAkKERFTUFOR0xFUl9OQU1FKS4xIGJpbnV0aWxzLmxvZyBiaW51dGlscy5zdW0gXAotCWFiY2RlZmdoKgotbW9zdGx5Y2xlYW4tbG9jYWw6Ci0JLXJtIC1yZiB0bXBkaXIKLQotQ0xFQU5GSUxFUyA9IGRlcC5zZWQgREVQIERFUDEKLQotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtbG9jYWwKLQotaW5zdGFsbC1leGVjLWxvY2FsOiAkKGJpbl9QUk9HUkFNUykgJChub2luc3RfUFJPR1JBTVMpCi0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nIC1lICdzL2N4eGZpbHQvJChERU1BTkdMRVJfTkFNRSkvJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nIC1lICdzL2N4eGZpbHQvJChERU1BTkdMRVJfTkFNRSkvJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQkkKG1raW5zdGFsbGRpcnMpICQodG9vbGRpcikvYmluCi0JZm9yIGkgaW4gJChUT09MX1BST0dTKTsgZG8gXAotCSAgaWYgWyAtZiAkJGkkKEVYRUVYVCkgXTsgdGhlbiBcCi0JICAgIGo9YGVjaG8gJCRpIHwgc2VkIC1lICdzLy1uZXcvLydgOyBcCi0JICAgIGs9YGVjaG8gJCRqIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCSAgICBpZiBbICIkKGJpbmRpcikvJCRrJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgICAgICBybSAtZiAkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCk7IFwKLQkgICAgICBsbiAkKGJpbmRpcikvJCRrJChFWEVFWFQpICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsIFwKLQkJfHwgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRpJChFWEVFWFQpICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKTsgXAotCSAgICBmaTsgXAotCSAgZWxzZSB0cnVlOyBcCi0JICBmaTsgXAotCWRvbmUKLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLQotYWRkcjJsaW5lLm86IGFkZHIybGluZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2RlbWFuZ2xlLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi1hci5vOiBhci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaCAkKEJGRERJUikvbGliYmZkLmggYXJzdXAuaAotYXJzdXAubzogYXJzdXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBhcnN1cC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi1idWNvbW0ubzogYnVjb21tLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWNvZmZkdW1wLm86IGNvZmZkdW1wLmMgY29mZmdyb2suaCBidWNvbW0uaCBjb25maWcuaCBcCi0gICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWNvZmZncm9rLm86IGNvZmZncm9rLmMgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmdyb2suaAotZGVidWcubzogZGVidWcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmgKLWRsbHRvb2wubzogZGxsdG9vbC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9kZW1hbmdsZS5oIGR5bi1zdHJpbmcuaCBcCi0gIGRsbHRvb2wuaAotZmlsZW1vZGUubzogZmlsZW1vZGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi1pZWVlLm86IGllZWUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2llZWUuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaCBidWRiZy5oCi1pcy1yYW5saWIubzogaXMtcmFubGliLmMKLWlzLXN0cmlwLm86IGlzLXN0cmlwLmMKLW1heWJlLXJhbmxpYi5vOiBtYXliZS1yYW5saWIuYwotbWF5YmUtc3RyaXAubzogbWF5YmUtc3RyaXAuYwotbmxtY29udi5vOiBubG1jb252LmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKEJGRERJUikvbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtY29udi5oCi1ubS5vOiBubS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2dldG9wdC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9yYW5saWIuaCBcCi0gICQoSU5DRElSKS9kZW1hbmdsZS5oICQoSU5DRElSKS9saWJpYmVydHkuaAotbm90LXJhbmxpYi5vOiBub3QtcmFubGliLmMKLW5vdC1zdHJpcC5vOiBub3Qtc3RyaXAuYwotb2JqY29weS5vOiBvYmpjb3B5LmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL3Byb2dyZXNzLmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVkYmcuaAotb2JqZHVtcC5vOiBvYmpkdW1wLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9wcm9ncmVzcy5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKLSAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotcHJkYmcubzogcHJkYmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaAotcmRjb2ZmLm86IHJkY29mZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvZGVtYW5nbGUuaCBkZWJ1Zy5oIFwKLSAgYnVkYmcuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLXJkZGJnLm86IHJkZGJnLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmgKLXNpemUubzogc2l6ZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvZ2V0b3B0LmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaAotc3Jjb252Lm86IHNyY29udi5jIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICBzeXNyb2ZmLmggY29mZmdyb2suaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN5c3JvZmYuYwotc3RhYnMubzogc3RhYnMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXN0cmluZ3Mubzogc3RyaW5ncy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zeXNkdW1wLm86IHN5c2R1bXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIHN5c3JvZmYuaCBcCi0gIHN5c3JvZmYuYwotdmVyc2lvbi5vOiB2ZXJzaW9uLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotd3JzdGFicy5vOiB3cnN0YWJzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi13aW5kcmVzLm86IHdpbmRyZXMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvb2JzdGFjay5oIHdpbmRyZXMuaCBcCi0gIHdpbmR1bmkuaAotcmVzcmMubzogcmVzcmMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLXJlc2NvZmYubzogcmVzY29mZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1yZXNiaW4ubzogcmVzYmluLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oCi13aW5kdW5pLm86IHdpbmR1bmkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIHdpbmR1bmkuaAotcmVhZGVsZi5vOiByZWFkZWxmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9kd2FyZjIuaCAkKElOQ0RJUikvZWxmL2kzODYuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2VsZi92ODUwLmggJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL21pcHMuaCBcCi0gICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2VsZi9zcGFyYy5oICQoSU5DRElSKS9lbGYvbTMyci5oICQoSU5DRElSKS9lbGYvZDEwdi5oIFwKLSAgJChJTkNESVIpL2VsZi9kMzB2LmggJChJTkNESVIpL2VsZi9zaC5oICQoSU5DRElSKS9lbGYvbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2VsZi9tbjEwMzAwLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9hcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvZnIzMC5oICQoSU5DRElSKS9lbGYvbWNvcmUuaCAkKElOQ0RJUikvZWxmL2k5NjAuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2dldG9wdC5oCi1yZXNyZXMubzogcmVzcmVzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oCi1keW4tc3RyaW5nLm86IGR5bi1zdHJpbmcuYyBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGR5bi1zdHJpbmcuaAotZGxsd3JhcC5vOiBkbGx3cmFwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggZHluLXN0cmluZy5oCi1yZW5hbWUubzogcmVuYW1lLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotdW5kZXJzY29yZS5vOiB1bmRlcnNjb3JlLmMKLWFycGFyc2UubzogYXJwYXJzZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggYXJzdXAuaAotYXJsZXgubzogYXJsZXguYyAkKElOQ0RJUikvbGliaWJlcnR5LmggYXJwYXJzZS5oCi1zeXNyb2ZmLm86IHN5c3JvZmYuYwotc3lzaW5mby5vOiBzeXNpbmZvLmMKLXN5c2xleC5vOiBzeXNsZXguYyBzeXNpbmZvLmgKLWRlZnBhcnNlLm86IGRlZnBhcnNlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBkbGx0b29sLmgKLWRlZmxleC5vOiBkZWZsZXguYyAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBkZWZwYXJzZS5oIGRsbHRvb2wuaAotbmxtaGVhZGVyLm86IG5sbWhlYWRlci5jIC4uL2JmZC9iZmQuaCBidWNvbW0uaCBjb25maWcuaCBcCi0gICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICBubG1jb252LmgKLXJjcGFyc2UubzogcmNwYXJzZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotcmNsZXgubzogcmNsZXguYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmggcmNwYXJzZS5oCi0KLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvTWFrZWZpbGUuaW4gYi9iaW51dGlscy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkZDBjMC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEzNjIgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQVIgPSBAQVJACi1BUyA9IEBBU0AKLUJVSUxEX0RMTFRPT0wgPSBAQlVJTERfRExMVE9PTEAKLUJVSUxEX0RMTFdSQVAgPSBAQlVJTERfRExMV1JBUEAKLUJVSUxEX01JU0MgPSBAQlVJTERfTUlTQ0AKLUJVSUxEX05MTUNPTlYgPSBAQlVJTERfTkxNQ09OVkAKLUJVSUxEX1NSQ09OViA9IEBCVUlMRF9TUkNPTlZACi1CVUlMRF9XSU5EUkVTID0gQEJVSUxEX1dJTkRSRVNACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotREVNQU5HTEVSX05BTUUgPSBAREVNQU5HTEVSX05BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1ETExUT09MX0RFRlMgPSBARExMVE9PTF9ERUZTQAotRVhFRVhUID0gQEVYRUVYVEAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSERFRklORVMgPSBASERFRklORVNACi1JTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTEQgPSBATERACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5MTUNPTlZfREVGUyA9IEBOTE1DT05WX0RFRlNACi1OTSA9IEBOTUAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVVOREVSU0NPUkUgPSBAVU5ERVJTQ09SRUAKLVVTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotVVNFX05MUyA9IEBVU0VfTkxTQAotVVNFX1NZTUJPTF9VTkRFUlNDT1JFID0gQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLWwgPSBAbEAKLQotSU5UTExJQlMgPSBASU5UTExJQlNACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQotCi1TVUJESVJTID0gcG8KLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKQotCi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotCi1ZQUNDID0gYGlmIFsgLWYgLi4vYmlzb24vYmlzb24gXTsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLzsgZWxzZSBlY2hvIEBZQUNDQDsgZmlgCi1ZRkxBR1MgPSAtZAotTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF07IHRoZW4gZWNobyAuLi9mbGV4L2ZsZXg7IGVsc2UgZWNobyBATEVYQDsgZmlgCi0KLSMgdGhlc2UgdHdvIGFyZSBhbG1vc3QgdGhlIHNhbWUgcHJvZ3JhbQotQVJfUFJPRyA9IGFyCi1SQU5MSUJfUFJPRyA9IHJhbmxpYgotCi0jIG9iamNvcHkgYW5kIHN0cmlwIHNob3VsZCBiZSB0aGUgc2FtZSBwcm9ncmFtCi1PQkpDT1BZX1BST0cgPSBvYmpjb3B5Ci1TVFJJUF9QUk9HID0gc3RyaXAtbmV3Ci0KLVNUUklOR1NfUFJPRyA9IHN0cmluZ3MKLQotUkVBREVMRl9QUk9HID0gcmVhZGVsZgotCi0jIFRoZXNlIHNob3VsZCBhbGwgYmUgdGhlIHNhbWUgcHJvZ3JhbSB0b28uCi1TSVpFX1BST0cgPSBzaXplCi1OTV9QUk9HID0gbm0tbmV3Ci1PQkpEVU1QX1BST0cgPSBvYmpkdW1wCi0KLSMgVGhpcyBpcyB0aGUgZGVtYW5nbGVyLCBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLSMgTm90ZTogVGhpcyBvbmUgaXMgdXNlZCBhcyB0aGUgaW5zdGFsbGVkIG5hbWUgdG9vLCB1bmxpa2UgdGhlIGFib3ZlLgotREVNQU5HTEVSX1BST0cgPSBjeHhmaWx0Ci0KLUFERFIyTElORV9QUk9HID0gYWRkcjJsaW5lCi0KLU5MTUNPTlZfUFJPRyA9IG5sbWNvbnYKLURMTFRPT0xfUFJPRyA9IGRsbHRvb2wKLVdJTkRSRVNfUFJPRyA9IHdpbmRyZXMKLURMTFdSQVBfUFJPRyA9IGRsbHdyYXAKLQotU1JDT05WX1BST0cgPSBzcmNvbnYkKEVYRUVYVCkgc3lzZHVtcCQoRVhFRVhUKSBjb2ZmZHVtcCQoRVhFRVhUKSAKLQotbWFuX01BTlMgPSBhci4xIG5tLjEgb2JqZHVtcC4xIHJhbmxpYi4xIHNpemUuMSBzdHJpbmdzLjEgc3RyaXAuMSBvYmpjb3B5LjEgXAotCWFkZHIybGluZS4xIG5sbWNvbnYuMSAkKERFTUFOR0xFUl9OQU1FKS4xCi0KLQotUFJPR1MgPSAkKFNJWkVfUFJPRykgJChPQkpEVU1QX1BST0cpICQoTk1fUFJPRykgJChBUl9QUk9HKSAkKFNUUklOR1NfUFJPRykgJChTVFJJUF9QUk9HKSAkKFJBTkxJQl9QUk9HKSAkKERFTUFOR0xFUl9QUk9HKSAkKE9CSkNPUFlfUFJPRykgQEJVSUxEX05MTUNPTlZAIEBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgJChBRERSMkxJTkVfUFJPRykgJChSRUFERUxGX1BST0cpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKLQotYmluX1BST0dSQU1TID0gJChTSVpFX1BST0cpICQoT0JKRFVNUF9QUk9HKSAkKEFSX1BST0cpICQoU1RSSU5HU19QUk9HKSAkKFJBTkxJQl9QUk9HKSAkKE9CSkNPUFlfUFJPRykgQEJVSUxEX05MTUNPTlZAIEBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgJChBRERSMkxJTkVfUFJPRykgJChSRUFERUxGX1BST0cpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKLQotbm9pbnN0X1BST0dSQU1TID0gJChOTV9QUk9HKSAkKFNUUklQX1BST0cpICQoREVNQU5HTEVSX1BST0cpCi0KLUVYVFJBX1BST0dSQU1TID0gJChOTE1DT05WX1BST0cpIHNyY29udiBzeXNkdW1wIGNvZmZkdW1wICQoRExMVE9PTF9QUk9HKSAkKFdJTkRSRVNfUFJPRykgJChETExXUkFQX1BST0cpCi0KLSMgU3R1ZmYgdGhhdCBnb2VzIGluIHRvb2xkaXIvIGlmIGFwcHJvcHJpYXRlCi1UT09MX1BST0dTID0gbm0tbmV3IHN0cmlwLW5ldyBhciByYW5saWIgZGxsdG9vbAotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCi0KLU1LREVQID0gbWtkZXAKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoQkZERElSKSAtSSQoSU5DRElSKSBASERFRklORVNAIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotSEZJTEVTID0gYXJzdXAuaCBidWNvbW0uaCBidWRiZy5oIGNvZmZncm9rLmggZGVidWcuaCBubG1jb252LmggZGxsdG9vbC5oIFwKLQl3aW5kcmVzLmggd2luZHVuaS5oIGR5bi1zdHJpbmcuaAotCi0KLUdFTkVSQVRFRF9IRklMRVMgPSBhcnBhcnNlLmggc3lzcm9mZi5oIHN5c2luZm8uaCBkZWZwYXJzZS5oCi0KLUNGSUxFUyA9IGFkZHIybGluZS5jIGFyLmMgYXJzdXAuYyBidWNvbW0uYyBjb2ZmZHVtcC5jIGNvZmZncm9rLmMgZGVidWcuYyBcCi0JZGxsdG9vbC5jIGZpbGVtb2RlLmMgaWVlZS5jIGlzLXJhbmxpYi5jIGlzLXN0cmlwLmMgbWF5YmUtcmFubGliLmMgXAotCW1heWJlLXN0cmlwLmMgbmxtY29udi5jIG5tLmMgbm90LXJhbmxpYi5jIG5vdC1zdHJpcC5jIFwKLQlvYmpjb3B5LmMgb2JqZHVtcC5jIHByZGJnLmMgcmRjb2ZmLmMgcmRkYmcuYyBzaXplLmMgc3Jjb252LmMgXAotCXN0YWJzLmMgc3RyaW5ncy5jIHN5c2R1bXAuYyB2ZXJzaW9uLmMgd3JzdGFicy5jIFwKLQl3aW5kcmVzLmMgcmVzcmMuYyByZXNjb2ZmLmMgcmVzYmluLmMgd2luZHVuaS5jIHJlYWRlbGYuYyBcCi0JcmVzcmVzLmMgZHluLXN0cmluZy5jIGRsbHdyYXAuYyByZW5hbWUuYwotCi0KLUdFTkVSQVRFRF9DRklMRVMgPSBcCi0JdW5kZXJzY29yZS5jIGFycGFyc2UuYyBhcmxleC5jIHN5c3JvZmYuYyBzeXNpbmZvLmMgc3lzbGV4LmMgXAotCWRlZnBhcnNlLmMgZGVmbGV4LmMgbmxtaGVhZGVyLmMgcmNwYXJzZS5jIHJjbGV4LmMKLQotCi1ERUJVR19TUkNTID0gcmRkYmcuYyBkZWJ1Zy5jIHN0YWJzLmMgaWVlZS5jIHJkY29mZi5jCi1XUklURV9ERUJVR19TUkNTID0gJChERUJVR19TUkNTKSB3cnN0YWJzLmMKLQotIyBDb2RlIHNoYXJlZCBieSBhbGwgdGhlIGJpbnV0aWxzLgotQlVMSUJTID0gYnVjb21tLmMgdmVyc2lvbi5jIGZpbGVtb2RlLmMKLQotQkZETElCID0gLi4vYmZkL2xpYmJmZC5sYQotCi1PUENPREVTID0gLi4vb3Bjb2Rlcy9saWJvcGNvZGVzLmxhCi0KLUxJQklCRVJUWSA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotCi1QT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKERFQlVHX1NSQ1MpICQoSEZJTEVTKQotCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHIvLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCi0gICAgICAgICAgZWNobyAkJHIvLi4vZXhwZWN0L2V4cGVjdCA7IFwKLSAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLVJVTlRFU1QgPSBgaWYgWyAtZiAke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyB0aGVuIFwKLSAgICAgICAgICAgZWNobyAke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgXAotICAgICAgICAgICBlbHNlIGVjaG8gcnVudGVzdCA7ICBmaWAKLQotCi1DQ19GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0KLWluZm9fVEVYSU5GT1MgPSBiaW51dGlscy50ZXhpCi0KLUxEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi1zaXplX1NPVVJDRVMgPSBzaXplLmMgJChCVUxJQlMpCi0KLW9iamNvcHlfU09VUkNFUyA9IG9iamNvcHkuYyBub3Qtc3RyaXAuYyByZW5hbWUuYyAkKFdSSVRFX0RFQlVHX1NSQ1MpICQoQlVMSUJTKQotCi1zdHJpbmdzX1NPVVJDRVMgPSBzdHJpbmdzLmMgJChCVUxJQlMpCi0KLXJlYWRlbGZfU09VUkNFUyA9IHJlYWRlbGYuYyB2ZXJzaW9uLmMKLXJlYWRlbGZfTERBREQgPSAkKElOVExMSUJTKSAkKExJQklCRVJUWSkKLQotc3RyaXBfbmV3X1NPVVJDRVMgPSBvYmpjb3B5LmMgaXMtc3RyaXAuYyByZW5hbWUuYyAkKFdSSVRFX0RFQlVHX1NSQ1MpICQoQlVMSUJTKQotCi1ubV9uZXdfU09VUkNFUyA9IG5tLmMgJChCVUxJQlMpCi0KLW9iamR1bXBfU09VUkNFUyA9IG9iamR1bXAuYyBwcmRiZy5jICQoREVCVUdfU1JDUykgJChCVUxJQlMpCi1vYmpkdW1wX0xEQUREID0gJChPUENPREVTKSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLWN4eGZpbHRfU09VUkNFUyA9IAotY3h4ZmlsdF9MREFERCA9IGNwbHVzLWRlbS5vIHVuZGVyc2NvcmUubyAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotYXJfU09VUkNFUyA9IGFycGFyc2UueSBhcmxleC5sIGFyLmMgbm90LXJhbmxpYi5jIGFyc3VwLmMgcmVuYW1lLmMgJChCVUxJQlMpCi1hcl9MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotcmFubGliX1NPVVJDRVMgPSBhci5jIGlzLXJhbmxpYi5jIGFycGFyc2UueSBhcmxleC5sIGFyc3VwLmMgcmVuYW1lLmMgJChCVUxJQlMpCi1yYW5saWJfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLWFkZHIybGluZV9TT1VSQ0VTID0gYWRkcjJsaW5lLmMgJChCVUxJQlMpCi0KLXNyY29udl9TT1VSQ0VTID0gc3Jjb252LmMgY29mZmdyb2suYyAkKEJVTElCUykKLQotZGxsdG9vbF9TT1VSQ0VTID0gZGxsdG9vbC5jIGRlZnBhcnNlLnkgZGVmbGV4LmwgZHluLXN0cmluZy5jICQoQlVMSUJTKQotZGxsdG9vbF9MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotY29mZmR1bXBfU09VUkNFUyA9IGNvZmZkdW1wLmMgY29mZmdyb2suYyAkKEJVTElCUykKLQotc3lzZHVtcF9TT1VSQ0VTID0gc3lzZHVtcC5jICQoQlVMSUJTKQotCi1ubG1jb252X1NPVVJDRVMgPSBubG1jb252LmMgbmxtaGVhZGVyLnkgJChCVUxJQlMpCi0KLXdpbmRyZXNfU09VUkNFUyA9IHdpbmRyZXMuYyByZXNyYy5jIHJlc2NvZmYuYyByZXNiaW4uYyByY3BhcnNlLnkgcmNsZXgubCBcCi0Jd2luZHVuaS5jIHJlc3Jlcy5jICQoQlVMSUJTKQotCi13aW5kcmVzX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1kbGx3cmFwX1NPVVJDRVMgPSBkbGx3cmFwLmMgZHluLXN0cmluZy5jIAotZGxsd3JhcF9MREFERCA9ICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi1ESVNUU1RVRkYgPSBhcnBhcnNlLmMgYXJwYXJzZS5oIGFybGV4LmMgbmxtaGVhZGVyLmMgc3lzaW5mby5jIHN5c2luZm8uaCBcCi0Jc3lzbGV4LmMgZGVmbGV4LmMgZGVmcGFyc2UuaCBkZWZwYXJzZS5jIHJjbGV4LmMgcmNwYXJzZS5oIHJjcGFyc2UuYwotCi0KLURJU1RDTEVBTkZJTEVTID0gc3RhbXAtdW5kZXIgc3lzaW5mbyB1bmRlcnNjb3JlLmMgc3lzcm9mZi5jIHN5c3JvZmYuaCBcCi0Jc2l0ZS5leHAgc2l0ZS5iYWsKLQotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IGNvbmZpZy50ZXhpCi0KLU1PU1RMWUNMRUFORklMRVMgPSBzeXNpbmZvICQoREVNQU5HTEVSX05BTUUpLjEgYmludXRpbHMubG9nIGJpbnV0aWxzLnN1bSBcCi0JYWJjZGVmZ2gqCi0KLQotQ0xFQU5GSUxFUyA9IGRlcC5zZWQgREVQIERFUDEKLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1iaW5fUFJPR1JBTVMgPSAgc2l6ZSQoRVhFRVhUKSBvYmpkdW1wJChFWEVFWFQpIGFyJChFWEVFWFQpIFwKLXN0cmluZ3MkKEVYRUVYVCkgcmFubGliJChFWEVFWFQpIG9iamNvcHkkKEVYRUVYVCkgQEJVSUxEX05MTUNPTlZAIFwKLUBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgYWRkcjJsaW5lJChFWEVFWFQpIFwKLXJlYWRlbGYkKEVYRUVYVCkgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAotbm9pbnN0X1BST0dSQU1TID0gIG5tLW5ldyQoRVhFRVhUKSBzdHJpcC1uZXckKEVYRUVYVCkgY3h4ZmlsdCQoRVhFRVhUKQotUFJPR1JBTVMgPSAgJChiaW5fUFJPR1JBTVMpICQobm9pbnN0X1BST0dSQU1TKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1ubG1jb252X09CSkVDVFMgPSAgbmxtY29udi5vIG5sbWhlYWRlci5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1ubG1jb252X0xEQUREID0gJChMREFERCkKLW5sbWNvbnZfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1ubG1jb252X0xERkxBR1MgPSAKLXNyY29udl9PQkpFQ1RTID0gIHNyY29udi5vIGNvZmZncm9rLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLXNyY29udl9MREFERCA9ICQoTERBREQpCi1zcmNvbnZfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1zcmNvbnZfTERGTEFHUyA9IAotc3lzZHVtcF9PQkpFQ1RTID0gIHN5c2R1bXAubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotc3lzZHVtcF9MREFERCA9ICQoTERBREQpCi1zeXNkdW1wX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotc3lzZHVtcF9MREZMQUdTID0gCi1jb2ZmZHVtcF9PQkpFQ1RTID0gIGNvZmZkdW1wLm8gY29mZmdyb2subyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotY29mZmR1bXBfTERBREQgPSAkKExEQUREKQotY29mZmR1bXBfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1jb2ZmZHVtcF9MREZMQUdTID0gCi1kbGx0b29sX09CSkVDVFMgPSAgZGxsdG9vbC5vIGRlZnBhcnNlLm8gZGVmbGV4Lm8gZHluLXN0cmluZy5vIGJ1Y29tbS5vIFwKLXZlcnNpb24ubyBmaWxlbW9kZS5vCi1kbGx0b29sX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotZGxsdG9vbF9MREZMQUdTID0gCi13aW5kcmVzX09CSkVDVFMgPSAgd2luZHJlcy5vIHJlc3JjLm8gcmVzY29mZi5vIHJlc2Jpbi5vIHJjcGFyc2UubyBcCi1yY2xleC5vIHdpbmR1bmkubyByZXNyZXMubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotd2luZHJlc19ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXdpbmRyZXNfTERGTEFHUyA9IAotZGxsd3JhcF9PQkpFQ1RTID0gIGRsbHdyYXAubyBkeW4tc3RyaW5nLm8KLWRsbHdyYXBfREVQRU5ERU5DSUVTID0gIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotZGxsd3JhcF9MREZMQUdTID0gCi1zaXplX09CSkVDVFMgPSAgc2l6ZS5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1zaXplX0xEQUREID0gJChMREFERCkKLXNpemVfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1zaXplX0xERkxBR1MgPSAKLW9iamR1bXBfT0JKRUNUUyA9ICBvYmpkdW1wLm8gcHJkYmcubyByZGRiZy5vIGRlYnVnLm8gc3RhYnMubyBpZWVlLm8gXAotcmRjb2ZmLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLW9iamR1bXBfREVQRU5ERU5DSUVTID0gIC4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYSAuLi9iZmQvbGliYmZkLmxhIFwKLS4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotb2JqZHVtcF9MREZMQUdTID0gCi1hcl9PQkpFQ1RTID0gIGFycGFyc2UubyBhcmxleC5vIGFyLm8gbm90LXJhbmxpYi5vIGFyc3VwLm8gcmVuYW1lLm8gXAotYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLWFyX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotYXJfTERGTEFHUyA9IAotc3RyaW5nc19PQkpFQ1RTID0gIHN0cmluZ3MubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotc3RyaW5nc19MREFERCA9ICQoTERBREQpCi1zdHJpbmdzX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotc3RyaW5nc19MREZMQUdTID0gCi1yYW5saWJfT0JKRUNUUyA9ICBhci5vIGlzLXJhbmxpYi5vIGFycGFyc2UubyBhcmxleC5vIGFyc3VwLm8gcmVuYW1lLm8gXAotYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLXJhbmxpYl9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXJhbmxpYl9MREZMQUdTID0gCi1vYmpjb3B5X09CSkVDVFMgPSAgb2JqY29weS5vIG5vdC1zdHJpcC5vIHJlbmFtZS5vIHJkZGJnLm8gZGVidWcubyBcCi1zdGFicy5vIGllZWUubyByZGNvZmYubyB3cnN0YWJzLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLW9iamNvcHlfTERBREQgPSAkKExEQUREKQotb2JqY29weV9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLW9iamNvcHlfTERGTEFHUyA9IAotYWRkcjJsaW5lX09CSkVDVFMgPSAgYWRkcjJsaW5lLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLWFkZHIybGluZV9MREFERCA9ICQoTERBREQpCi1hZGRyMmxpbmVfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1hZGRyMmxpbmVfTERGTEFHUyA9IAotcmVhZGVsZl9PQkpFQ1RTID0gIHJlYWRlbGYubyB2ZXJzaW9uLm8KLXJlYWRlbGZfREVQRU5ERU5DSUVTID0gIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotcmVhZGVsZl9MREZMQUdTID0gCi1ubV9uZXdfT0JKRUNUUyA9ICBubS5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1ubV9uZXdfTERBREQgPSAkKExEQUREKQotbm1fbmV3X0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotbm1fbmV3X0xERkxBR1MgPSAKLXN0cmlwX25ld19PQkpFQ1RTID0gIG9iamNvcHkubyBpcy1zdHJpcC5vIHJlbmFtZS5vIHJkZGJnLm8gZGVidWcubyBcCi1zdGFicy5vIGllZWUubyByZGNvZmYubyB3cnN0YWJzLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLXN0cmlwX25ld19MREFERCA9ICQoTERBREQpCi1zdHJpcF9uZXdfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1zdHJpcF9uZXdfTERGTEFHUyA9IAotY3h4ZmlsdF9PQkpFQ1RTID0gCi1jeHhmaWx0X0RFUEVOREVOQ0lFUyA9ICBjcGx1cy1kZW0ubyB1bmRlcnNjb3JlLm8gXAotLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1jeHhmaWx0X0xERkxBR1MgPSAKLUxFWF9PVVRQVVRfUk9PVCA9IEBMRVhfT1VUUFVUX1JPT1RACi1MRVhMSUIgPSBATEVYTElCQAotWUxXUkFQID0gJCh0b3Bfc3JjZGlyKS8uLi95bHdyYXAKLUNGTEFHUyA9IEBDRkxBR1NACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGJpbnV0aWxzLmluZm8KLURWSVMgPSBiaW51dGlscy5kdmkKLVRFWElORk9TID0gYmludXRpbHMudGV4aQotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1NQU5TID0gJChtYW5fTUFOUykKLQotTlJPRkYgPSBucm9mZgotRElTVF9DT01NT04gPSAgUkVBRE1FIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gXAotTkVXUyBhY2luY2x1ZGUubTQgYWNsb2NhbC5tNCBhcmxleC5jIGFycGFyc2UuYyBjb25maWcuaW4gY29uZmlndXJlIFwKLWNvbmZpZ3VyZS5pbiBkZWZsZXguYyBkZWZwYXJzZS5jIG5sbWhlYWRlci5jIHJjbGV4LmMgcmNwYXJzZS5jCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKG5sbWNvbnZfU09VUkNFUykgJChzcmNvbnZfU09VUkNFUykgJChzeXNkdW1wX1NPVVJDRVMpICQoY29mZmR1bXBfU09VUkNFUykgJChkbGx0b29sX1NPVVJDRVMpICQod2luZHJlc19TT1VSQ0VTKSAkKGRsbHdyYXBfU09VUkNFUykgJChzaXplX1NPVVJDRVMpICQob2JqZHVtcF9TT1VSQ0VTKSAkKGFyX1NPVVJDRVMpICQoc3RyaW5nc19TT1VSQ0VTKSAkKHJhbmxpYl9TT1VSQ0VTKSAkKG9iamNvcHlfU09VUkNFUykgJChhZGRyMmxpbmVfU09VUkNFUykgJChyZWFkZWxmX1NPVVJDRVMpICQobm1fbmV3X1NPVVJDRVMpICQoc3RyaXBfbmV3X1NPVVJDRVMpICQoY3h4ZmlsdF9TT1VSQ0VTKQotT0JKRUNUUyA9ICQobmxtY29udl9PQkpFQ1RTKSAkKHNyY29udl9PQkpFQ1RTKSAkKHN5c2R1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9PQkpFQ1RTKSAkKGRsbHRvb2xfT0JKRUNUUykgJCh3aW5kcmVzX09CSkVDVFMpICQoZGxsd3JhcF9PQkpFQ1RTKSAkKHNpemVfT0JKRUNUUykgJChvYmpkdW1wX09CSkVDVFMpICQoYXJfT0JKRUNUUykgJChzdHJpbmdzX09CSkVDVFMpICQocmFubGliX09CSkVDVFMpICQob2JqY29weV9PQkpFQ1RTKSAkKGFkZHIybGluZV9PQkpFQ1RTKSAkKHJlYWRlbGZfT0JKRUNUUykgJChubV9uZXdfT0JKRUNUUykgJChzdHJpcF9uZXdfT0JKRUNUUykgJChjeHhmaWx0X09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5kdmkgLmluZm8gLmwgLmxvIC5vIC5wcyAucyAudGV4aSAudGV4aW5mbyAudHhpIC55Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotCi1tb3N0bHljbGVhbi1iaW5QUk9HUkFNUzoKLQotY2xlYW4tYmluUFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQoYmluX1BST0dSQU1TKSIgfHwgcm0gLWYgJChiaW5fUFJPR1JBTVMpCi0KLWRpc3RjbGVhbi1iaW5QUk9HUkFNUzoKLQotbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUzoKLQotaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtYmluUFJPR1JBTVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJtIC1mICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCS10ZXN0IC16ICIkKG5vaW5zdF9QUk9HUkFNUykiIHx8IHJtIC1mICQobm9pbnN0X1BST0dSQU1TKQotCi1kaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLW5sbWNvbnYkKEVYRUVYVCk6ICQobmxtY29udl9PQkpFQ1RTKSAkKG5sbWNvbnZfREVQRU5ERU5DSUVTKQotCUBybSAtZiBubG1jb252JChFWEVFWFQpCi0JJChMSU5LKSAkKG5sbWNvbnZfTERGTEFHUykgJChubG1jb252X09CSkVDVFMpICQobmxtY29udl9MREFERCkgJChMSUJTKQotCi1zcmNvbnYkKEVYRUVYVCk6ICQoc3Jjb252X09CSkVDVFMpICQoc3Jjb252X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc3Jjb252JChFWEVFWFQpCi0JJChMSU5LKSAkKHNyY29udl9MREZMQUdTKSAkKHNyY29udl9PQkpFQ1RTKSAkKHNyY29udl9MREFERCkgJChMSUJTKQotCi1zeXNkdW1wJChFWEVFWFQpOiAkKHN5c2R1bXBfT0JKRUNUUykgJChzeXNkdW1wX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc3lzZHVtcCQoRVhFRVhUKQotCSQoTElOSykgJChzeXNkdW1wX0xERkxBR1MpICQoc3lzZHVtcF9PQkpFQ1RTKSAkKHN5c2R1bXBfTERBREQpICQoTElCUykKLQotY29mZmR1bXAkKEVYRUVYVCk6ICQoY29mZmR1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGNvZmZkdW1wJChFWEVFWFQpCi0JJChMSU5LKSAkKGNvZmZkdW1wX0xERkxBR1MpICQoY29mZmR1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9MREFERCkgJChMSUJTKQotCi1kbGx0b29sJChFWEVFWFQpOiAkKGRsbHRvb2xfT0JKRUNUUykgJChkbGx0b29sX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgZGxsdG9vbCQoRVhFRVhUKQotCSQoTElOSykgJChkbGx0b29sX0xERkxBR1MpICQoZGxsdG9vbF9PQkpFQ1RTKSAkKGRsbHRvb2xfTERBREQpICQoTElCUykKLQotd2luZHJlcyQoRVhFRVhUKTogJCh3aW5kcmVzX09CSkVDVFMpICQod2luZHJlc19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHdpbmRyZXMkKEVYRUVYVCkKLQkkKExJTkspICQod2luZHJlc19MREZMQUdTKSAkKHdpbmRyZXNfT0JKRUNUUykgJCh3aW5kcmVzX0xEQUREKSAkKExJQlMpCi0KLWRsbHdyYXAkKEVYRUVYVCk6ICQoZGxsd3JhcF9PQkpFQ1RTKSAkKGRsbHdyYXBfREVQRU5ERU5DSUVTKQotCUBybSAtZiBkbGx3cmFwJChFWEVFWFQpCi0JJChMSU5LKSAkKGRsbHdyYXBfTERGTEFHUykgJChkbGx3cmFwX09CSkVDVFMpICQoZGxsd3JhcF9MREFERCkgJChMSUJTKQotCi1zaXplJChFWEVFWFQpOiAkKHNpemVfT0JKRUNUUykgJChzaXplX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc2l6ZSQoRVhFRVhUKQotCSQoTElOSykgJChzaXplX0xERkxBR1MpICQoc2l6ZV9PQkpFQ1RTKSAkKHNpemVfTERBREQpICQoTElCUykKLQotb2JqZHVtcCQoRVhFRVhUKTogJChvYmpkdW1wX09CSkVDVFMpICQob2JqZHVtcF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIG9iamR1bXAkKEVYRUVYVCkKLQkkKExJTkspICQob2JqZHVtcF9MREZMQUdTKSAkKG9iamR1bXBfT0JKRUNUUykgJChvYmpkdW1wX0xEQUREKSAkKExJQlMpCi0KLWFyJChFWEVFWFQpOiAkKGFyX09CSkVDVFMpICQoYXJfREVQRU5ERU5DSUVTKQotCUBybSAtZiBhciQoRVhFRVhUKQotCSQoTElOSykgJChhcl9MREZMQUdTKSAkKGFyX09CSkVDVFMpICQoYXJfTERBREQpICQoTElCUykKLQotc3RyaW5ncyQoRVhFRVhUKTogJChzdHJpbmdzX09CSkVDVFMpICQoc3RyaW5nc19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHN0cmluZ3MkKEVYRUVYVCkKLQkkKExJTkspICQoc3RyaW5nc19MREZMQUdTKSAkKHN0cmluZ3NfT0JKRUNUUykgJChzdHJpbmdzX0xEQUREKSAkKExJQlMpCi0KLXJhbmxpYiQoRVhFRVhUKTogJChyYW5saWJfT0JKRUNUUykgJChyYW5saWJfREVQRU5ERU5DSUVTKQotCUBybSAtZiByYW5saWIkKEVYRUVYVCkKLQkkKExJTkspICQocmFubGliX0xERkxBR1MpICQocmFubGliX09CSkVDVFMpICQocmFubGliX0xEQUREKSAkKExJQlMpCi0KLW9iamNvcHkkKEVYRUVYVCk6ICQob2JqY29weV9PQkpFQ1RTKSAkKG9iamNvcHlfREVQRU5ERU5DSUVTKQotCUBybSAtZiBvYmpjb3B5JChFWEVFWFQpCi0JJChMSU5LKSAkKG9iamNvcHlfTERGTEFHUykgJChvYmpjb3B5X09CSkVDVFMpICQob2JqY29weV9MREFERCkgJChMSUJTKQotCi1hZGRyMmxpbmUkKEVYRUVYVCk6ICQoYWRkcjJsaW5lX09CSkVDVFMpICQoYWRkcjJsaW5lX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgYWRkcjJsaW5lJChFWEVFWFQpCi0JJChMSU5LKSAkKGFkZHIybGluZV9MREZMQUdTKSAkKGFkZHIybGluZV9PQkpFQ1RTKSAkKGFkZHIybGluZV9MREFERCkgJChMSUJTKQotCi1yZWFkZWxmJChFWEVFWFQpOiAkKHJlYWRlbGZfT0JKRUNUUykgJChyZWFkZWxmX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgcmVhZGVsZiQoRVhFRVhUKQotCSQoTElOSykgJChyZWFkZWxmX0xERkxBR1MpICQocmVhZGVsZl9PQkpFQ1RTKSAkKHJlYWRlbGZfTERBREQpICQoTElCUykKLQotbm0tbmV3JChFWEVFWFQpOiAkKG5tX25ld19PQkpFQ1RTKSAkKG5tX25ld19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIG5tLW5ldyQoRVhFRVhUKQotCSQoTElOSykgJChubV9uZXdfTERGTEFHUykgJChubV9uZXdfT0JKRUNUUykgJChubV9uZXdfTERBREQpICQoTElCUykKLQotc3RyaXAtbmV3JChFWEVFWFQpOiAkKHN0cmlwX25ld19PQkpFQ1RTKSAkKHN0cmlwX25ld19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHN0cmlwLW5ldyQoRVhFRVhUKQotCSQoTElOSykgJChzdHJpcF9uZXdfTERGTEFHUykgJChzdHJpcF9uZXdfT0JKRUNUUykgJChzdHJpcF9uZXdfTERBREQpICQoTElCUykKLQotY3h4ZmlsdCQoRVhFRVhUKTogJChjeHhmaWx0X09CSkVDVFMpICQoY3h4ZmlsdF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGN4eGZpbHQkKEVYRUVYVCkKLQkkKExJTkspICQoY3h4ZmlsdF9MREZMQUdTKSAkKGN4eGZpbHRfT0JKRUNUUykgJChjeHhmaWx0X0xEQUREKSAkKExJQlMpCi0ubC5jOgotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChMRVgpIiAkPCAkKExFWF9PVVRQVVRfUk9PVCkuYyAkQCAtLSAkKEFNX0xGTEFHUykgJChMRkxBR1MpCi0ueS5jOgotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJDwgeS50YWIuYyAkKi5jIHkudGFiLmggJCouaCAtLSAkKEFNX1lGTEFHUykgJChZRkxBR1MpCi1hcnBhcnNlLmg6IGFycGFyc2UuYwotZGVmcGFyc2UuaDogZGVmcGFyc2UuYwotbmxtaGVhZGVyLmg6IG5sbWhlYWRlci5jCi1yY3BhcnNlLmg6IHJjcGFyc2UuYwotCi0KLWJpbnV0aWxzLmluZm86IGJpbnV0aWxzLnRleGkKLWJpbnV0aWxzLmR2aTogYmludXRpbHMudGV4aQotCi0KLURWSVBTID0gZHZpcHMKLQotLnRleGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udGV4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udHhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLS5kdmkucHM6Ci0JJChEVklQUykgJDwgLW8gJEAKLQotaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCi0JQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCi0JICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCi0JICAgIGVsc2UgOiA7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCUAkKFBPU1RfSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBsaXN0PSckKElORk9fREVQUyknOyBcCi0JICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAotCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCi0JICBkb25lOyBcCi0JZWxzZSA6IDsgZmkKLQotdW5pbnN0YWxsLWluZm86Ci0JJChQUkVfVU5JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlpPXllczsgXAotCWVsc2UgaWk9OyBmaTsgXAotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgLXogIiRpaSIgXAotCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKLQlkb25lCi0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKLQlkb25lCi0KLWRpc3QtaW5mbzogJChJTkZPX0RFUFMpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tYW1pbmZvOgotCS1ybSAtZiBiaW51dGlscy5hdXggYmludXRpbHMuY3AgYmludXRpbHMuY3BzIGJpbnV0aWxzLmR2aSBiaW51dGlscy5mbiBcCi0JICBiaW51dGlscy5mbnMgYmludXRpbHMua3kgYmludXRpbHMua3lzIGJpbnV0aWxzLnBzIFwKLQkgIGJpbnV0aWxzLmxvZyBiaW51dGlscy5wZyBiaW51dGlscy50b2MgYmludXRpbHMudHAgXAotCSAgYmludXRpbHMudHBzIGJpbnV0aWxzLnZyIGJpbnV0aWxzLnZycyBiaW51dGlscy5vcCBiaW51dGlscy50ciBcCi0JICBiaW51dGlscy5jdiBiaW51dGlscy5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLQotaW5zdGFsbC1tYW4xOgotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobWFuMWRpcikKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAotCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotCi11bmluc3RhbGwtbWFuMToKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLWluc3RhbGwtbWFuOiAkKE1BTlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1tYW4xCi11bmluc3RhbGwtbWFuOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLW1hbjEKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCi0KLVJVTlRFU1RGTEFHUyA9Ci0KLURFSkFUT09MID0gJChQQUNLQUdFKQotCi1SVU5URVNUREVGQVVMVEZMQUdTID0gLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQkc3JjZGlyCi1zaXRlLmV4cDogTWFrZWZpbGUKLQlAZWNobyAnTWFraW5nIGEgbmV3IHNpdGUuZXhwIGZpbGUuLi4nCi0JQHRlc3QgISAtZiBzaXRlLmJhayB8fCBybSAtZiBzaXRlLmJhawotCUBlY2hvICcjIyB0aGVzZSB2YXJpYWJsZXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IG1ha2UgIyMnID4gJEAtdAotCUBlY2hvICcjIERvIG5vdCBlZGl0IGhlcmUuICBJZiB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGVzZSB2YWx1ZXMnID4+ICRALXQKLQlAZWNobyAnIyBlZGl0IHRoZSBsYXN0IHNlY3Rpb24nID4+ICRALXQKLQlAZWNobyAnc2V0IHRvb2wgJChERUpBVE9PTCknID4+ICRALXQKLQlAZWNobyAnc2V0IHNyY2RpciAkKHNyY2RpciknID4+ICRALXQKLQlAZWNobyAnc2V0IG9iamRpcicgYHB3ZGAgPj4gJEAtdAotCUBlY2hvICdzZXQgaG9zdF9hbGlhcyAkKGhvc3RfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBob3N0X3RyaXBsZXQgJChob3N0X3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0YXJnZXRfYWxpYXMgJCh0YXJnZXRfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0YXJnZXRfdHJpcGxldCAkKHRhcmdldF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfYWxpYXMgJChidWlsZF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IGJ1aWxkX3RyaXBsZXQgJChidWlsZF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICcjIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBEbyBOb3QgRWRpdCAjIycgPj4gJEAtdAotCUB0ZXN0ICEgLWYgc2l0ZS5leHAgfHwgc2VkICcxLC9eIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUuKiMjLyBkJyBzaXRlLmV4cCA+PiAkQC10Ci0JQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBtdiBzaXRlLmV4cCBzaXRlLmJhawotCUBtdiAkQC10IHNpdGUuZXhwCi1pbmZvLWFtOiAkKElORk9fREVQUykKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06ICQoRFZJUykKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stREVKQUdOVQotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbGNoZWNrLWFtOgotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi1hbGwtcmVjdXJzaXZlLWFtOiBjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtZXhlYy1sb2NhbAotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi0KLWluc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1tYW4KLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWJpblBST0dSQU1TIHVuaW5zdGFsbC1tYW4KLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKSAkKE1BTlMpIGNvbmZpZy5oCi1hbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotCSQobWtpbnN0YWxsZGlycykgICQoREVTVERJUikkKGJpbmRpcikgJChERVNURElSKSQobWFuZGlyKS9tYW4xCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNT1NUTFlDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNT1NUTFlDTEVBTkZJTEVTKQotCi1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCi0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0JLXRlc3QgLXogIiQoRElTVENMRUFORklMRVMpIiB8fCBybSAtZiAkKERJU1RDTEVBTkZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogImFybGV4bGRlZmxleGxyY2xleGxhcnBhcnNlaGFycGFyc2VjZGVmcGFyc2VoZGVmcGFyc2VjbmxtaGVhZGVyaG5sbWhlYWRlcmNyY3BhcnNlaHJjcGFyc2VjJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mIGFybGV4bCBkZWZsZXhsIHJjbGV4bCBhcnBhcnNlaCBhcnBhcnNlYyBkZWZwYXJzZWggZGVmcGFyc2VjIG5sbWhlYWRlcmggbmxtaGVhZGVyYyByY3BhcnNlaCByY3BhcnNlYyAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1oZHIgbW9zdGx5Y2xlYW4tYmluUFJPR1JBTVMgXAotCQltb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBtb3N0bHljbGVhbi1jb21waWxlIFwKLQkJbW9zdGx5Y2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbWluZm8gbW9zdGx5Y2xlYW4tdGFncyBcCi0JCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbG9jYWwKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogIGNsZWFuLWhkciBjbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JCWNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBjbGVhbi1hbWluZm8gY2xlYW4tdGFncyBcCi0JCWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1iaW5QUk9HUkFNUyBcCi0JCWRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1hbWluZm8gZGlzdGNsZWFuLXRhZ3MgXAotCQlkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1hbQotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWJpblBST0dSQU1TIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JCW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgXAotCQltYWludGFpbmVyLWNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tYmluUFJPR1JBTVMgZGlzdGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWJpblBST0dSQU1TIFwKLW1haW50YWluZXItY2xlYW4tYmluUFJPR1JBTVMgdW5pbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtYmluUFJPR1JBTVMgXAotbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVMgZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLWNsZWFuLW5vaW5zdFBST0dSQU1TIG1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotbW9zdGx5Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tY29tcGlsZSBjbGVhbi1jb21waWxlIFwKLW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJ0b29sIFwKLWNsZWFuLWxpYnRvb2wgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIGluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtaW5mbyBcCi1tb3N0bHljbGVhbi1hbWluZm8gZGlzdGNsZWFuLWFtaW5mbyBjbGVhbi1hbWluZm8gXAotbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gaW5zdGFsbC1tYW4xIHVuaW5zdGFsbC1tYW4xIGluc3RhbGwtbWFuIFwKLXVuaW5zdGFsbC1tYW4gaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAotaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIFwKLWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi10YWdzIFwKLWRpc3RjbGVhbi10YWdzIGNsZWFuLXRhZ3MgbWFpbnRhaW5lci1jbGVhbi10YWdzIGRpc3RkaXIgY2hlY2stREVKQUdOVSBcCi1pbmZvLWFtIGluZm8gZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIFwKLWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtbG9jYWwgXAotaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gXAotaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIGFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIFwKLWluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBcCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotY2hlY2stREVKQUdOVTogc2l0ZS5leHAKLQlzcmNkaXI9YGNkICQoc3JjZGlyKSAmJiBwd2RgOyBleHBvcnQgc3JjZGlyOyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlFWFBFQ1Q9JChFWFBFQ1QpOyBleHBvcnQgRVhQRUNUOyBcCi0JaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdOyB0aGVuIFwKLQkgIFRDTF9MSUJSQVJZPWBjZCAkKHRvcF9zcmNkaXIpLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKLQkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAotCWZpOyBcCi0JcnVudGVzdD0kKFJVTlRFU1QpOyBcCi0JaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgJCRydW50ZXN0IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHtzcmNkaXJ9L3Rlc3RzdWl0ZSBcCi0JCUNDX0ZPUl9UQVJHRVQ9IiQoQ0NfRk9SX1RBUkdFVCkiIFwKLQkJQ0ZMQUdTX0ZPUl9UQVJHRVQ9IiQoQ0ZMQUdTKSIgJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi1pbnN0YWxsY2hlY2s6Ci0JL2Jpbi9zaCAkKHNyY2Rpcikvc2FuaXR5LnNoICQoYmluZGlyKQotCi11bmRlcnNjb3JlLmM6IHN0YW1wLXVuZGVyIDsgQHRydWUKLQotc3RhbXAtdW5kZXI6IE1ha2VmaWxlCi0JZWNobyAnLypXQVJOSU5HOiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQhKi8nID51bmRlcnNjb3JlLnQKLQllY2hvICJpbnQgcHJlcGVuZHNfdW5kZXJzY29yZSA9IEBVTkRFUlNDT1JFQDsiID4+dW5kZXJzY29yZS50Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHVuZGVyc2NvcmUudCB1bmRlcnNjb3JlLmMKLQl0b3VjaCBzdGFtcC11bmRlcgotCi1jcGx1cy1kZW0ubzogJChCQVNFRElSKS9saWJpYmVydHkvY3BsdXMtZGVtLmMgJChJTkNESVIpL2dldG9wdC5oCi0JJChDT01QSUxFKSAtYyAtRE1BSU4gLURWRVJTSU9OPSciJChWRVJTSU9OKSInICQoQkFTRURJUikvbGliaWJlcnR5L2NwbHVzLWRlbS5jCi0KLSMgVGhlIGZvbGxvd2luZyBpcyBjb21tZW50ZWQgb3V0IGZvciB0aGUgY29udmVydGlvbiB0byBhdXRvbWFrZS4KLSMgVGhpcyBydWxlIGNyZWF0ZXMgYSBzaW5nbGUgYmluYXJ5IHRoYXQgc3dpdGNoZXMgYmV0d2VlbiBhciBhbmQgcmFubGliCi0jIGJ5IGxvb2tpbmcgYXQgYXJndlswXS4gIFVzZSB0aGlzIGtsdWRnZSB0byBzYXZlIHNvbWUgZGlzayBzcGFjZS4KLSMgSG93ZXZlciwgeW91IGhhdmUgdG8gaW5zdGFsbCB0aGluZ3MgYnkgaGFuZC4KLSMgKFRoYXQgaXMgYWZ0ZXIgJ21ha2UgaW5zdGFsbCcsIHJlcGxhY2UgdGhlIGluc3RhbGxlZCByYW5saWIgYnkgYSBsaW5rIHRvIGFyLikKLSMgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBpbnN0YWxsIHJhbmxpYi5zaCBhcyByYW5saWIuCi0jIGFyX3dpdGhfcmFubGliOiAkKEFERExfREVQUykgYXIubyBtYXliZS1yYW5saWIubwotIwkkKEhMREVOVikgJChDQykgJChITERGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJChBUl9QUk9HKSBhci5vIG1heWJlLXJhbmxpYi5vICQoQURETF9MSUJTKSAkKEVYVFJBTElCUykKLSMJLXJtIC1mICQoUkFOTElCX1BST0cpCi0jCS1sbiAkKEFSX1BST0cpICQoUkFOTElCX1BST0cpCi0jCi0jIG9iamNvcHkgYW5kIHN0cmlwIGluIG9uZSBiaW5hcnkgdGhhdCB1c2VzIGFyZ3ZbMF0gdG8gZGVjaWRlIGl0cyBhY3Rpb24uCi0jCi0jb2JqY29weV93aXRoX3N0cmlwOiAkKEFERExfREVQUykgb2JqY29weS5vIG1heWJlLXN0cmlwLm8KLSMJJChITERFTlYpICQoQ0MpICQoSExERkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICQoT0JKQ09QWV9QUk9HKSBvYmpjb3B5Lm8gbWF5YmUtc3RyaXAubyAkKEFERExfTElCUykgJChFWFRSQUxJQlMpCi0jCS1ybSAtZiAkKFNUUklQX1BST0cpCi0jCS1sbiAkKE9CSkNPUFlfUFJPRykgJChTVFJJUF9QUk9HKQotCi1zeXNyb2ZmLmM6IHN5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIHN5c3JvZmYuaW5mbyAKLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1jIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID5zeXNyb2ZmLmMKLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1pIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID4+c3lzcm9mZi5jCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtZyA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+PnN5c3JvZmYuYwotCi1zeXNyb2ZmLmg6IHN5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIHN5c3JvZmYuaW5mbwotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWQgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPnN5c3JvZmYuaAotCi1zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKTogc3lzaW5mby5vIHN5c2xleC5vCi0JJChDQ19GT1JfQlVJTEQpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAIHN5c2luZm8ubyBzeXNsZXgubyAKLQotc3lzbGV4Lm86IHN5c2xleC5jIHN5c2luZm8uaAotCWlmIFsgLXIgc3lzbGV4LmMgXTsgdGhlbiBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAgc3lzbGV4LmMgIDsgXAotCWVsc2UgXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAtSSQoc3JjZGlyKSAkKENGTEFHUykgJChzcmNkaXIpL3N5c2xleC5jIDtcCi0JZmkKLQotc3lzaW5mby5vOiBzeXNpbmZvLmMKLQlpZiBbIC1yIHN5c2luZm8uYyBdOyB0aGVuIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICBzeXNpbmZvLmMgIDsgXAotCWVsc2UgXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgJChzcmNkaXIpL3N5c2luZm8uYyA7IFwKLQlmaQotCi1kbGx0b29sLm86ZGxsdG9vbC5jCi0JJChDT01QSUxFKSAtYyAkKERMTFRPT0xfREVGUykgJChzcmNkaXIpL2RsbHRvb2wuYwotCi1yZXNjb2ZmLm86cmVzY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKERMTFRPT0xfREVGUykgJChzcmNkaXIpL3Jlc2NvZmYuYwotCi0jIGNvZmYvc3ltLmggYW5kIGNvZmYvZWNvZmYuaCB3b24ndCBiZSBmb3VuZCBieSB0aGUgYXV0b21hdGljIGRlcGVuZGVuY3kKLSMgc2NyaXB0cywgc2luY2UgdGhleSBhcmUgb25seSBpbmNsdWRlZCBjb25kaXRpb25hbGx5LgotbmxtY29udi5vOiBubG1jb252LmMgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotCWxkbmFtZT1gZWNobyBsZCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQkkKENPTVBJTEUpIC1jIC1ETERfTkFNRT0iXCIkJHtsZG5hbWV9XCIiIEBOTE1DT05WX0RFRlNAICQoc3JjZGlyKS9ubG1jb252LmMKLQotZGlzdHN0dWZmOiAkKERJU1RTVFVGRikgaW5mbwotCi0jIFRhcmdldHMgdG8gcmVidWlsZCBkZXBlbmRlbmNpZXMgaW4gdGhpcyBNYWtlZmlsZS4KLSMgSGF2ZSB0byBnZXQgcmlkIG9mIERFUDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLURFUDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykgJChHRU5FUkFURURfSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIERFUDEKLQkkKE1BS0UpIE1LREVQPSQoTUtERVApIERFUDEKLQlzZWQgLWYgZGVwLnNlZCA8REVQMSA+REVQCi0KLSMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi1ERVAxOiAkKENGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKQotCXJtIC1mIERFUDIKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDIKLQkkKE1LREVQKSAtZiBERVAyICQoSU5DTFVERVMpICQ/Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIERFUDIgREVQMQotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlvYmpkaXI9YHB3ZGA7IFwKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKLQkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAotCQktZSAncyFAQkZERElSQCEkKEJGRERJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCVwKLQkJLWUgInMhQE9CSkRJUkAhJCR7b2JqZGlyfSEiCi0KLWRlcDogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi0uUEhPTlk6IGRlcCBkZXAtaW4gZGVwLWFtCi0KLSMjIwotIyBET0NVTUVOVEFUSU9OIFRBUkdFVFMKLWNvbmZpZy50ZXhpOiBNYWtlZmlsZQotCXJtIC1mIGNvbmZpZy50ZXhpCi0JZWNobyAnQHNldCBWRVJTSU9OICQoVkVSU0lPTiknID4gY29uZmlnLnRleGkKLQotYmludXRpbHMuZHZpOiAkKHNyY2RpcikvYmludXRpbHMudGV4aSBjb25maWcudGV4aQotCi1iaW51dGlscy5pbmZvOiAkKHNyY2RpcikvYmludXRpbHMudGV4aSBjb25maWcudGV4aQotCi0kKERFTUFOR0xFUl9OQU1FKS4xOiBjeHhmaWx0Lm1hbiBNYWtlZmlsZQotCXNlZCAtZSAncy9AUFJPR1JBTUAvJChERU1BTkdMRVJfTkFNRSkvJyA8ICQoc3JjZGlyKS9jeHhmaWx0Lm1hbiBcCi0JCT4gJChERU1BTkdMRVJfTkFNRSkuMQotbW9zdGx5Y2xlYW4tbG9jYWw6Ci0JLXJtIC1yZiB0bXBkaXIKLQotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtbG9jYWwKLQotaW5zdGFsbC1leGVjLWxvY2FsOiAkKGJpbl9QUk9HUkFNUykgJChub2luc3RfUFJPR1JBTVMpCi0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nIC1lICdzL2N4eGZpbHQvJChERU1BTkdMRVJfTkFNRSkvJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nIC1lICdzL2N4eGZpbHQvJChERU1BTkdMRVJfTkFNRSkvJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQkkKG1raW5zdGFsbGRpcnMpICQodG9vbGRpcikvYmluCi0JZm9yIGkgaW4gJChUT09MX1BST0dTKTsgZG8gXAotCSAgaWYgWyAtZiAkJGkkKEVYRUVYVCkgXTsgdGhlbiBcCi0JICAgIGo9YGVjaG8gJCRpIHwgc2VkIC1lICdzLy1uZXcvLydgOyBcCi0JICAgIGs9YGVjaG8gJCRqIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCSAgICBpZiBbICIkKGJpbmRpcikvJCRrJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgICAgICBybSAtZiAkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCk7IFwKLQkgICAgICBsbiAkKGJpbmRpcikvJCRrJChFWEVFWFQpICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKSA+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+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYWRkcjJsaW5lLjEgYi9iaW51dGlscy9hZGRyMmxpbmUuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjZTEwMy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hZGRyMmxpbmUuMQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIGFkZHIybGluZSAxICIyNyBNYXJjaCAxOTk3IiAiQ3lnbnVzIFNvbHV0aW9ucyIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1hZGRyMmxpbmUgXC0gY29udmVydCBhZGRyZXNzZXMgaW50byBmaWxlIG5hbWVzIGFuZCBsaW5lIG51bWJlcnMKLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIGFkZHIybGluZQotLlJCICJbXHwiICJcLWJcICJcYwotLkkgYmZkbmFtZVxjCi0uUkIgIiB8ICIgIlwtXC10YXJnZXQ9IlxjCi0uSSBiZmRuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1DIHwgXC1cLWRlbWFuZ2xlICJcfF0iCi0uUkIgIltcfCIgIlwtZVwgIlxjCi0uSSBmaWxlbmFtZVxjCi0uUkIgIiB8ICIgIlwtXC1leGU9IlxjCi0uSSBmaWxlbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiIFwtZiB8IFwtXC1mdW5jdGlvbnMgIlx8XSIKLS5SQiAiW1x8IiBcLXMgfCBcLVwtYmFzZW5hbWVzICJcfF0iCi0uUkIgIltcfCIgXC1IIHwgXC1cLWhlbHAgIlx8XSIKLS5SQiAiW1x8IiBcLVYgfCBcLVwtdmVyc2lvbiAiXHxdIgotLlJCICJbXHwiIGFkZHIgYWRkciAuLi4gICJcfF0iCi0uYWQgYgotLmh5IDEKLS5TSCBERVNDUklQVElPTgotXGMKLS5CIGFkZHIybGluZQotdHJhbnNsYXRlcyBwcm9ncmFtIGFkZHJlc3NlcyBpbnRvIGZpbGUgbmFtZXMgYW5kIGxpbmUgbnVtYmVycy4gIEdpdmVuCi1hbiBhZGRyZXNzIGFuZCBhbiBleGVjdXRhYmxlLCBpdCB1c2VzIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi1leGVjdXRhYmxlIHRvIGZpZ3VyZSBvdXQgd2hpY2ggZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBhcmUKLWFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGFkZHJlc3MuCi0KLVRoZSBleGVjdXRhYmxlIHRvIHVzZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKLS5CIFwtZQotb3B0aW9uLiAgVGhlIGRlZmF1bHQgaXMKLS5CIGEub3V0XGMKLVwmLgotCi0uQiBhZGRyMmxpbmUKLWhhcyB0d28gbW9kZXMgb2Ygb3BlcmF0aW9uLgotCi1JbiB0aGUgZmlyc3QsIGhleGFkZWNpbWFsIGFkZHJlc3NlcyBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsCi1hbmQKLS5CIGFkZHIybGluZQotZGlzcGxheXMgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgZm9yIGVhY2ggYWRkcmVzcy4KLQotSW4gdGhlIHNlY29uZCwKLS5CIGFkZHIybGluZQotcmVhZHMgaGV4YWRlY2ltYWwgYWRkcmVzc2VzIGZyb20gc3RhbmRhcmQgaW5wdXQsIGFuZCBwcmludHMgdGhlIGZpbGUKLW5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBlYWNoIGFkZHJlc3Mgb24gc3RhbmRhcmQgb3V0cHV0LiAgSW4gdGhpcwotbW9kZSwKLS5CIGFkZHIybGluZQotbWF5IGJlIHVzZWQgaW4gYSBwaXBlIHRvIGNvbnZlcnQgZHluYW1pY2FsbHkgY2hvc2VuIGFkZHJlc3Nlcy4KLQotVGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGlzIEZJTEVOQU1FOkxJTkVOTy4gIFRoZSBmaWxlIG5hbWUgYW5kIGxpbmUKLW51bWJlciBmb3IgZWFjaCBhZGRyZXNzIGlzIHByaW50ZWQgb24gYSBzZXBhcmF0ZSBsaW5lLiAgSWYgdGhlCi0uQiBcLWYKLW9wdGlvbiBpcyB1c2VkLCB0aGVuIGVhY2ggRklMRU5BTUU6TElORU5PIGxpbmUgaXMgcHJlY2VkZWQgYnkgYQotRlVOQ1RJT05OQU1FIGxpbmUgd2hpY2ggaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlCi1hZGRyZXNzLgotCi1JZiB0aGUgZmlsZSBuYW1lIG9yIGZ1bmN0aW9uIG5hbWUgY2FuIG5vdCBiZSBkZXRlcm1pbmVkLAotLkIgYWRkcjJsaW5lCi13aWxsIHByaW50IHR3byBxdWVzdGlvbiBtYXJrcyBpbiB0aGVpciBwbGFjZS4gIElmIHRoZSBsaW5lIG51bWJlciBjYW4KLW5vdCBiZSBkZXRlcm1pbmVkLAotLkIgYWRkcjJsaW5lCi13aWxsIHByaW50IDAuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CSSAiXC1iICIgImJmZG5hbWUiXGMKLS5UUAotLkJJICJcLVwtdGFyZ2V0PSIgImJmZG5hbWUiCi1TcGVjaWZ5IHRoZSBvYmplY3QtY29kZSBmb3JtYXQgZm9yIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUKLVxjCi0uSSBiZmRuYW1lXGMKLVwmLgotCi0uVFAKLS5CIFwtQwotLlRQCi0uQiBcLVwtZGVtYW5nbGUKLURlY29kZSAoXGZJZGVtYW5nbGVcZlApIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgotQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCi1tYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuCi0KLS5UUAotLkJJICJcLWUgIiAiZmlsZW5hbWUiXGMKLS5UUAotLkJJICJcLVwtZXhlPSIgImZpbGVuYW1lIgotU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSBmb3Igd2hpY2ggYWRkcmVzc2VzIHNob3VsZCBiZQotdHJhbnNsYXRlZC4gIFRoZSBkZWZhdWx0IGZpbGUgaXMKLS5CIGEub3V0XGMKLVwmLgotCi0uVFAKLS5CIFwtZgotLlRQCi0uQiBcLVwtZnVuY3Rpb25zCi1EaXNwbGF5IGZ1bmN0aW9uIG5hbWVzIGFzIHdlbGwgYXMgZmlsZSBhbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1iYXNlbmFtZXMKLURpc3BsYXkgb25seSB0aGUgYmFzZSBvZiBlYWNoIGZpbGUgbmFtZS4KLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSkuCmRpZmYgLS1naXQgYS9iaW51dGlscy9hZGRyMmxpbmUuYyBiL2JpbnV0aWxzL2FkZHIybGluZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjcwN2MyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FkZHIybGluZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qIGFkZHIybGluZS5jIC0tIGNvbnZlcnQgYWRkcmVzc2VzIHRvIGxpbmUgbnVtYmVyIGFuZCBmdW5jdGlvbiBuYW1lCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBMYXV0aGVyIDxVbHJpY2guTGF1dGhlckB6ZmUuc2llbWVucy5kZT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBEZXJpdmVkIGZyb20gb2JqZHVtcC5jIGFuZCBubS5jIGJ5IFVscmljaC5MYXV0aGVyQHpmZS5zaWVtZW5zLmRlCi0KLSAgIFVzYWdlOiAKLSAgIGFkZHIybGluZSBbb3B0aW9uc10gYWRkciBhZGRyIC4uLgotICAgb3IKLSAgIGFkZHIybGluZSBbb3B0aW9uc10gCi0KLSAgIGJvdGggZm9ybXMgd3JpdGUgcmVzdWx0cyB0byBzdGRvdXQsIHRoZSBzZWNvbmQgZm9ybSByZWFkcyBhZGRyZXNzZXMKLSAgIHRvIGJlIGNvbnZlcnRlZCBmcm9tIHN0ZGluLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi1leHRlcm4gY2hhciAqcHJvZ3JhbV92ZXJzaW9uOwotCi1zdGF0aWMgYm9vbGVhbiB3aXRoX2Z1bmN0aW9uczsJLyogLWYsIHNob3cgZnVuY3Rpb24gbmFtZXMuICAqLwotc3RhdGljIGJvb2xlYW4gZG9fZGVtYW5nbGU7CS8qIC1DLCBkZW1hbmdsZSBuYW1lcy4gICovCi1zdGF0aWMgYm9vbGVhbiBiYXNlX25hbWVzOwkvKiAtcywgc3RyaXAgZGlyZWN0b3J5IG5hbWVzLiAgKi8KLQotc3RhdGljIGludCBuYWRkcjsJCS8qIE51bWJlciBvZiBhZGRyZXNzZXMgdG8gcHJvY2Vzcy4gICovCi1zdGF0aWMgY2hhciAqKmFkZHI7CQkvKiBIZXggYWRkcmVzc2VzIHRvIHByb2Nlc3MuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqKnN5bXM7CQkvKiBTeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiYmFzZW5hbWVzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCi0gIHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ0MnfSwKLSAgeyJleGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2UnfSwKLSAgeyJmdW5jdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2YnfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2InfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdIJ30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVid9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgc2x1cnBfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBmaW5kX2FkZHJlc3NfaW5fc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCB0cmFuc2xhdGVfYWRkcmVzc2VzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQwKLS8qIFByaW50IGEgdXNhZ2UgbWVzc2FnZSB0byBTVFJFQU0gYW5kIGV4aXQgd2l0aCBTVEFUVVMuICAqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVXNhZ2U6ICVzIFstQ2ZzSFZdIFstYiBiZmRuYW1lXSBbLS10YXJnZXQ9YmZkbmFtZV1cblwKLSAgICAgICBbLWUgZXhlY3V0YWJsZV0gWy0tZXhlPWV4ZWN1dGFibGVdIFstLWRlbWFuZ2xlXVxuXAotICAgICAgIFstLWJhc2VuYW1lc10gWy0tZnVuY3Rpb25zXSBbYWRkciBhZGRyIC4uLl1cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0MCi0vKiBSZWFkIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotc2x1cnBfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgc3RvcmFnZTsKLSAgbG9uZyBzeW1jb3VudDsKLQotICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBIQVNfU1lNUykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgc3RvcmFnZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgaWYgKHN0b3JhZ2UgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7Ci0KLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci19Ci0MCi0vKiBUaGVzZSBnbG9iYWwgdmFyaWFibGVzIGFyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmV0d2VlbgotICAgdHJhbnNsYXRlX2FkZHJlc3NlcyBhbmQgZmluZF9hZGRyZXNzX2luX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYSBwYzsKLXN0YXRpYyBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXN0YXRpYyBjb25zdCBjaGFyICpmdW5jdGlvbm5hbWU7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGxpbmU7Ci1zdGF0aWMgYm9vbGVhbiBmb3VuZDsKLQotLyogTG9vayBmb3IgYW4gYWRkcmVzcyBpbiBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCB2aWEKLSAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1maW5kX2FkZHJlc3NfaW5fc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSB2bWE7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICBpZiAoZm91bmQpCi0gICAgcmV0dXJuOwotCi0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0aW9uKSAmIFNFQ19BTExPQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0gIGlmIChwYyA8IHZtYSkKLSAgICByZXR1cm47Ci0KLSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdGlvbik7Ci0gIGlmIChwYyA+PSB2bWEgKyBzaXplKQotICAgIHJldHVybjsKLQotICBmb3VuZCA9IGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltcywgcGMgLSB2bWEsCi0JCQkJICZmaWxlbmFtZSwgJmZ1bmN0aW9ubmFtZSwgJmxpbmUpOwotfQotCi0vKiBSZWFkIGhleGFkZWNpbWFsIGFkZHJlc3NlcyBmcm9tIHN0ZGluLCB0cmFuc2xhdGUgaW50bwotICAgZmlsZV9uYW1lOmxpbmVfbnVtYmVyIGFuZCBvcHRpb25hbGx5IGZ1bmN0aW9uIG5hbWUuICAqLwotCi1zdGF0aWMgdm9pZAotdHJhbnNsYXRlX2FkZHJlc3NlcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgcmVhZF9zdGRpbiA9IChuYWRkciA9PSAwKTsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGlmIChyZWFkX3N0ZGluKQotCXsKLQkgIGNoYXIgYWRkcl9oZXhbMTAwXTsKLQotCSAgaWYgKGZnZXRzIChhZGRyX2hleCwgc2l6ZW9mIGFkZHJfaGV4LCBzdGRpbikgPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JICBwYyA9IGJmZF9zY2FuX3ZtYSAoYWRkcl9oZXgsIE5VTEwsIDE2KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG5hZGRyIDw9IDApCi0JICAgIGJyZWFrOwotCSAgLS1uYWRkcjsKLQkgIHBjID0gYmZkX3NjYW5fdm1hICgqYWRkcisrLCBOVUxMLCAxNik7Ci0JfQotCi0gICAgICBmb3VuZCA9IGZhbHNlOwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBmaW5kX2FkZHJlc3NfaW5fc2VjdGlvbiwgKFBUUikgTlVMTCk7Ci0KLSAgICAgIGlmICghIGZvdW5kKQotCXsKLQkgIGlmICh3aXRoX2Z1bmN0aW9ucykKLQkgICAgcHJpbnRmICgiPz9cbiIpOwotCSAgcHJpbnRmICgiPz86MFxuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICh3aXRoX2Z1bmN0aW9ucykKLQkgICAgewotCSAgICAgIGlmIChmdW5jdGlvbm5hbWUgPT0gTlVMTCB8fCAqZnVuY3Rpb25uYW1lID09ICdcMCcpCi0JCXByaW50ZiAoIj8/XG4iKTsKLQkgICAgICBlbHNlIGlmICghIGRvX2RlbWFuZ2xlKQotCQlwcmludGYgKCIlc1xuIiwgZnVuY3Rpb25uYW1lKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBjaGFyICpyZXM7Ci0KLQkJICByZXMgPSBjcGx1c19kZW1hbmdsZSAoZnVuY3Rpb25uYW1lLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7Ci0JCSAgaWYgKHJlcyA9PSBOVUxMKQotCQkgICAgcHJpbnRmICgiJXNcbiIsIGZ1bmN0aW9ubmFtZSk7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIlc1xuIiwgcmVzKTsKLQkJICAgICAgZnJlZSAocmVzKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChiYXNlX25hbWVzICYmIGZpbGVuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBjaGFyICpoOwotCi0JICAgICAgaCA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLycpOwotCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCWZpbGVuYW1lID0gaCArIDE7Ci0JICAgIH0KLQotCSAgcHJpbnRmICgiJXM6JXVcbiIsIGZpbGVuYW1lID8gZmlsZW5hbWUgOiAiPz8iLCBsaW5lKTsKLQl9Ci0KLSAgICAgIC8qIGZmbHVzaCgpIGlzIGVzc2VudGlhbCBmb3IgdXNpbmcgdGhpcyBjb21tYW5kIGFzIGEgc2VydmVyCi0gICAgICAgICBjaGlsZCBwcm9jZXNzIHRoYXQgcmVhZHMgYWRkcmVzc2VzIGZyb20gYSBwaXBlIGFuZCByZXNwb25kcwotICAgICAgICAgd2l0aCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiwgcHJvY2Vzc2luZyBvbmUgYWRkcmVzcyBhdCBhCi0gICAgICAgICB0aW1lLiAgKi8KLSAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKLSAgICB9Ci19Ci0KLS8qIFByb2Nlc3MgYSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZmlsZSAoZmlsZW5hbWUsIHRhcmdldCkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRhcmdldDsKLXsKLSAgYmZkICphYmZkOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgYWJmZCA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIHRhcmdldCk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChmaWxlbmFtZSk7Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9hcmNoaXZlKSkKLSAgICBmYXRhbCAoXygiJXM6IGNhbiBub3QgZ2V0IGFkZHJlc3NlcyBmcm9tIGFyY2hpdmUiKSwgZmlsZW5hbWUpOwotCi0gIGlmICghIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICBzbHVycF9zeW10YWIgKGFiZmQpOwotCi0gIHRyYW5zbGF0ZV9hZGRyZXNzZXMgKGFiZmQpOwotCi0gIGlmIChzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoc3ltcyk7Ci0gICAgICBzeW1zID0gTlVMTDsKLSAgICB9Ci0KLSAgYmZkX2Nsb3NlIChhYmZkKTsKLX0KLQwKLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBjaGFyICpmaWxlbmFtZTsKLSAgY2hhciAqdGFyZ2V0OwotICBpbnQgYzsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9ICphcmd2OwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgZmlsZW5hbWUgPSBOVUxMOwotICB0YXJnZXQgPSBOVUxMOwotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImI6Q2U6c2ZIViIsIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAwOgotCSAgYnJlYWs7CQkvKiB3ZSd2ZSBiZWVuIGdpdmVuIGEgbG9uZyBvcHRpb24gKi8KLQljYXNlICdiJzoKLQkgIHRhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0MnOgotCSAgZG9fZGVtYW5nbGUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnZSc6Ci0JICBmaWxlbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgYmFzZV9uYW1lcyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIHdpdGhfZnVuY3Rpb25zID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgcHJpbnRfdmVyc2lvbiAoImFkZHIybGluZSIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnSCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0gICAgZmlsZW5hbWUgPSAiYS5vdXQiOwotCi0gIGFkZHIgPSBhcmd2ICsgb3B0aW5kOwotICBuYWRkciA9IGFyZ2MgLSBvcHRpbmQ7Ci0KLSAgcHJvY2Vzc19maWxlIChmaWxlbmFtZSwgdGFyZ2V0KTsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FyLjEgYi9iaW51dGlscy9hci4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDcxYTQwLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FyLjEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzMgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NSwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIGFyIDEgIjE5OTkiICJDeWdudXMgU29sdXRpb25zIiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLWFyIFwtIGNyZWF0ZSwgbW9kaWZ5LCBhbmQgZXh0cmFjdCBmcm9tIGFyY2hpdmVzLgotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5CUiBhciAiIFtcfCIgIi0iICJcfF0iXGMKLS5JIHtkbXBxcnR4fVthYmNmaWxOb1BzU3V2Vl0gXGMKLVtcfFxjCi0uSSBtZW1iZXJuYW1lXGMKLVwmXHxdIFxjCi1bXHxcYwotLkkgY291bnRcYwotXCZcfF0gXGMKLS5JIGFyY2hpdmVcYwotXCYgXGMKLS5JIGZpbGVzXGMKLVwmLlx8Llx8LgotCi0uYWQgYgotLmh5IDEKLS5TSCBERVNDUklQVElPTgotVGhlIEdOVSBcYwotLkIgYXJcYwotXCYgcHJvZ3JhbSBjcmVhdGVzLCBtb2RpZmllcywgYW5kIGV4dHJhY3RzIGZyb20KLWFyY2hpdmVzLiAgQW4gXGMKLS5JIGFyY2hpdmVcYwotXCYgaXMgYSBzaW5nbGUgZmlsZSBob2xkaW5nIGEgY29sbGVjdGlvbiBvZgotb3RoZXIgZmlsZXMgaW4gYSBzdHJ1Y3R1cmUgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0byByZXRyaWV2ZQotdGhlIG9yaWdpbmFsIGluZGl2aWR1YWwgZmlsZXMgKGNhbGxlZCBcYwotLkkgbWVtYmVyc1xjCi1cJiBvZiB0aGUgYXJjaGl2ZSkuCi0KLVRoZSBvcmlnaW5hbCBmaWxlcycgY29udGVudHMsIG1vZGUgKHBlcm1pc3Npb25zKSwgdGltZXN0YW1wLCBvd25lciwgYW5kCi1ncm91cCBhcmUgcHJlc2VydmVkIGluIHRoZSBhcmNoaXZlLCBhbmQgbWF5IGJlIHJlY29uc3RpdHV0ZWQgb24KLWV4dHJhY3Rpb24uICAKLQotR05VIFxjCi0uQiBhclxjCi1cJiBjYW4gbWFpbnRhaW4gYXJjaGl2ZXMgd2hvc2UgbWVtYmVycyBoYXZlIG5hbWVzIG9mIGFueQotbGVuZ3RoOyBob3dldmVyLCBkZXBlbmRpbmcgb24gaG93IFxjCi0uQiBhclxjCi1cJiBpcyBjb25maWd1cmVkIG9uIHlvdXIKLXN5c3RlbSwgYSBsaW1pdCBvbiBtZW1iZXItbmFtZSBsZW5ndGggbWF5IGJlIGltcG9zZWQgKGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIGFyY2hpdmUgZm9ybWF0cyBtYWludGFpbmVkIHdpdGggb3RoZXIgdG9vbHMpLiAgSWYgaXQgZXhpc3RzLCB0aGUKLWxpbWl0IGlzIG9mdGVuIDE1IGNoYXJhY3RlcnMgKHR5cGljYWwgb2YgZm9ybWF0cyByZWxhdGVkIHRvIGEub3V0KSBvciAxNgotY2hhcmFjdGVycyAodHlwaWNhbCBvZiBmb3JtYXRzIHJlbGF0ZWQgdG8gY29mZikuCi0KLVxjCi0uQiBhclxjCi1cJiBpcyBjb25zaWRlcmVkIGEgYmluYXJ5IHV0aWxpdHkgYmVjYXVzZSBhcmNoaXZlcyBvZiB0aGlzIHNvcnQKLWFyZSBtb3N0IG9mdGVuIHVzZWQgYXMgXGMKLS5JIGxpYnJhcmllc1xjCi1cJiBob2xkaW5nIGNvbW1vbmx5IG5lZWRlZAotc3Vicm91dGluZXMuCi0KLVxjCi0uQiBhclxjCi1cJiB3aWxsIGNyZWF0ZSBhbiBpbmRleCB0byB0aGUgc3ltYm9scyBkZWZpbmVkIGluIHJlbG9jYXRhYmxlCi1vYmplY3QgbW9kdWxlcyBpbiB0aGUgYXJjaGl2ZSB3aGVuIHlvdSBzcGVjaWZ5IHRoZSBtb2RpZmllciBgXHxcYwotLkIgc1xjCi1cfCcuCi1PbmNlIGNyZWF0ZWQsIHRoaXMgaW5kZXggaXMgdXBkYXRlZCBpbiB0aGUgYXJjaGl2ZSB3aGVuZXZlciBcYwotLkIgYXJcYwotXCYKLW1ha2VzIGEgY2hhbmdlIHRvIGl0cyBjb250ZW50cyAoc2F2ZSBmb3IgdGhlIGBcfFxjCi0uQiBxXGMKLVx8JyB1cGRhdGUgb3BlcmF0aW9uKS4KLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBhbmQKLWFsbG93cyByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0byBjYWxsIGVhY2ggb3RoZXIgd2l0aG91dCByZWdhcmQgdG8KLXRoZWlyIHBsYWNlbWVudCBpbiB0aGUgYXJjaGl2ZS4KLQotWW91IG1heSB1c2UgYFx8XGMKLS5CIG5tIFwtc1xjCi1cfCcgb3IgYFx8XGMKLS5CIG5tIFwtXC1wcmludFwtYXJtYXBcYwotXHwnIHRvIGxpc3QgdGhpcyBpbmRleAotdGFibGUuICBJZiBhbiBhcmNoaXZlIGxhY2tzIHRoZSB0YWJsZSwgYW5vdGhlciBmb3JtIG9mIFxjCi0uQiBhclxjCi1cJiBjYWxsZWQKLVxjCi0uQiByYW5saWJcYwotXCYgY2FuIGJlIHVzZWQgdG8gYWRkIGp1c3QgdGhlIHRhYmxlLgotCi1cYwotLkIgYXJcYwotXCYgaW5zaXN0cyBvbiBhdCBsZWFzdCB0d28gYXJndW1lbnRzIHRvIGV4ZWN1dGU6IG9uZQota2V5bGV0dGVyIHNwZWNpZnlpbmcgdGhlIFxjCi0uSSBvcGVyYXRpb25cYwotXCYgKG9wdGlvbmFsbHkgYWNjb21wYW5pZWQgYnkgb3RoZXIKLWtleWxldHRlcnMgc3BlY2lmeWluZyBcYwotLkkgbW9kaWZpZXJzXGMKLVwmKSwgYW5kIHRoZSBhcmNoaXZlIG5hbWUgdG8gYWN0IG9uLgotCi1Nb3N0IG9wZXJhdGlvbnMgY2FuIGFsc28gYWNjZXB0IGZ1cnRoZXIgXGMKLS5JIGZpbGVzXGMKLVwmIGFyZ3VtZW50cywKLXNwZWNpZnlpbmcgcGFydGljdWxhciBmaWxlcyB0byBvcGVyYXRlIG9uLgotCi0uU0ggT1BUSU9OUwotR05VIFxjCi0uQiBhclxjCi1cJiBhbGxvd3MgeW91IHRvIG1peCB0aGUgb3BlcmF0aW9uIGNvZGUgXGMKLS5JIHBcYwotXCYgYW5kIG1vZGlmaWVyCi1mbGFncyBcYwotLkkgbW9kXGMKLVwmIGluIGFueSBvcmRlciwgd2l0aGluIHRoZSBmaXJzdCBjb21tYW5kLWxpbmUgYXJndW1lbnQuCi0KLUlmIHlvdSB3aXNoLCB5b3UgbWF5IGJlZ2luIHRoZSBmaXJzdCBjb21tYW5kLWxpbmUgYXJndW1lbnQgd2l0aCBhCi1kYXNoLgotCi1UaGUgXGMKLS5JIHBcYwotXCYga2V5bGV0dGVyIHNwZWNpZmllcyB3aGF0IG9wZXJhdGlvbiB0byBleGVjdXRlOyBpdCBtYXkgYmUKLWFueSBvZiB0aGUgZm9sbG93aW5nLCBidXQgeW91IG11c3Qgc3BlY2lmeSBvbmx5IG9uZSBvZiB0aGVtOgotCi0uVFAKLS5CIGQKLVxjCi0uSSBEZWxldGVcYwotXCYgbW9kdWxlcyBmcm9tIHRoZSBhcmNoaXZlLiAgU3BlY2lmeSB0aGUgbmFtZXMgb2YgbW9kdWxlcyB0bwotYmUgZGVsZXRlZCBhcyBcYwotLkkgZmlsZXNcYwotXCY7IHRoZSBhcmNoaXZlIGlzIHVudG91Y2hlZCBpZiB5b3UKLXNwZWNpZnkgbm8gZmlsZXMgdG8gZGVsZXRlLgotCi1JZiB5b3Ugc3BlY2lmeSB0aGUgYFx8XGMKLS5CIHZcYwotXHwnIG1vZGlmaWVyLCBcYwotLkIgYXJcYwotXCYgd2lsbCBsaXN0IGVhY2ggbW9kdWxlCi1hcyBpdCBpcyBkZWxldGVkLgotCi0uVFAKLS5CIG0KLVVzZSB0aGlzIG9wZXJhdGlvbiB0byBcYwotLkkgbW92ZVxjCi1cJiBtZW1iZXJzIGluIGFuIGFyY2hpdmUuCi0KLVRoZSBvcmRlcmluZyBvZiBtZW1iZXJzIGluIGFuIGFyY2hpdmUgY2FuIG1ha2UgYSBkaWZmZXJlbmNlIGluIGhvdwotcHJvZ3JhbXMgYXJlIGxpbmtlZCB1c2luZyB0aGUgbGlicmFyeSwgaWYgYSBzeW1ib2wgaXMgZGVmaW5lZCBpbiBtb3JlCi10aGFuIG9uZSBtZW1iZXIuICAKLQotSWYgbm8gbW9kaWZpZXJzIGFyZSB1c2VkIHdpdGggXGMKLS5CIG1cYwotXCYsIGFueSBtZW1iZXJzIHlvdSBuYW1lIGluIHRoZQotXGMKLS5JIGZpbGVzXGMKLVwmIGFyZ3VtZW50cyBhcmUgbW92ZWQgdG8gdGhlIFxjCi0uSSBlbmRcYwotXCYgb2YgdGhlIGFyY2hpdmU7Ci15b3UgY2FuIHVzZSB0aGUgYFx8XGMKLS5CIGFcYwotXHwnLCBgXHxcYwotLkIgYlxjCi1cfCcsIG9yIGBcfFxjCi0uQiBpXGMKLVx8JyBtb2RpZmllcnMgdG8gbW92ZSB0aGVtIHRvIGEKLXNwZWNpZmllZCBwbGFjZSBpbnN0ZWFkLgotCi0uVFAKLS5CIHAKLVxjCi0uSSBQcmludFxjCi1cJiB0aGUgc3BlY2lmaWVkIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUsIHRvIHRoZSBzdGFuZGFyZAotb3V0cHV0IGZpbGUuICBJZiB0aGUgYFx8XGMKLS5CIHZcYwotXHwnIG1vZGlmaWVyIGlzIHNwZWNpZmllZCwgc2hvdyB0aGUgbWVtYmVyCi1uYW1lIGJlZm9yZSBjb3B5aW5nIGl0cyBjb250ZW50cyB0byBzdGFuZGFyZCBvdXRwdXQuCi0KLUlmIHlvdSBzcGVjaWZ5IG5vIFxjCi0uSSBmaWxlc1xjCi1cJiwgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZSBhcmUgcHJpbnRlZC4KLQotLlRQCi0uQiBxCi1cYwotLkkgUXVpY2sgYXBwZW5kXGMKLVwmOyBhZGQgXGMKLS5JIGZpbGVzXGMKLVwmIHRvIHRoZSBlbmQgb2YgXGMKLS5JIGFyY2hpdmVcYwotXCYsCi13aXRob3V0IGNoZWNraW5nIGZvciByZXBsYWNlbWVudC4gIAotCi1UaGUgbW9kaWZpZXJzIGBcfFxjCi0uQiBhXGMKLVx8JywgYFx8XGMKLS5CIGJcYwotXHwnLCBhbmQgYFx8XGMKLS5CIGlcYwotXHwnIGRvIFxjCi0uSSBub3RcYwotXCYgYWZmZWN0IHRoaXMKLW9wZXJhdGlvbjsgbmV3IG1lbWJlcnMgYXJlIGFsd2F5cyBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4KLQotVGhlIG1vZGlmaWVyIGBcfFxjCi0uQiB2XGMKLVx8JyBtYWtlcyBcYwotLkIgYXJcYwotXCYgbGlzdCBlYWNoIGZpbGUgYXMgaXQgaXMgYXBwZW5kZWQuCi0KLVNpbmNlIHRoZSBwb2ludCBvZiB0aGlzIG9wZXJhdGlvbiBpcyBzcGVlZCwgdGhlIGFyY2hpdmUncyBzeW1ib2wgdGFibGUKLWluZGV4IGlzIG5vdCB1cGRhdGVkLCBldmVuIGlmIGl0IGFscmVhZHkgZXhpc3RlZDsgeW91IGNhbiB1c2UgYFx8XGMKLS5CIGFyIHNcYwotXHwnIG9yCi1cYwotLkIgcmFubGliXGMKLVwmIGV4cGxpY2l0bHkgdG8gdXBkYXRlIHRoZSBzeW1ib2wgdGFibGUgaW5kZXguCi0KLUhvd2V2ZXIsIHRvbyBtYW55IGRpZmZlcmVudCBzeXN0ZW1zIGFzc3VtZSBxdWljayBhcHBlbmQgcmVidWlsZHMgdGhlCi1pbmRleCwgc28gR05VCi0uQiBhcgotaW1wbGVtZW50cyBgXHxcYwotLkIgcVxjCi1cfCcgYXMgYSBzeW5vbnltIGZvciBgXHxcYwotLkIgclxjCi1cfCcuCi0KLS5UUAotLkIgcgotSW5zZXJ0IFxjCi0uSSBmaWxlc1xjCi1cJiBpbnRvIFxjCi0uSSBhcmNoaXZlXGMKLVwmICh3aXRoIFxjCi0uSSByZXBsYWNlbWVudFxjCi1cJikuIFRoaXMKLW9wZXJhdGlvbiBkaWZmZXJzIGZyb20gYFx8XGMKLS5CIHFcYwotXHwnIGluIHRoYXQgYW55IHByZXZpb3VzbHkgZXhpc3RpbmcgbWVtYmVycwotYXJlIGRlbGV0ZWQgaWYgdGhlaXIgbmFtZXMgbWF0Y2ggdGhvc2UgYmVpbmcgYWRkZWQuCi0KLUlmIG9uZSBvZiB0aGUgZmlsZXMgbmFtZWQgaW4gXGMKLS5JIGZpbGVzXGMKLVwmIGRvZXNuJ3QgZXhpc3QsIFxjCi0uQiBhclxjCi1cJgotZGlzcGxheXMgYW4gZXJyb3IgbWVzc2FnZSwgYW5kIGxlYXZlcyB1bmRpc3R1cmJlZCBhbnkgZXhpc3RpbmcgbWVtYmVycwotb2YgdGhlIGFyY2hpdmUgbWF0Y2hpbmcgdGhhdCBuYW1lLgotCi1CeSBkZWZhdWx0LCBuZXcgbWVtYmVycyBhcmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZTsgYnV0IHlvdSBtYXkKLXVzZSBvbmUgb2YgdGhlIG1vZGlmaWVycyBgXHxcYwotLkIgYVxjCi1cfCcsIGBcfFxjCi0uQiBiXGMKLVx8Jywgb3IgYFx8XGMKLS5CIGlcYwotXHwnIHRvIHJlcXVlc3QKLXBsYWNlbWVudCByZWxhdGl2ZSB0byBzb21lIGV4aXN0aW5nIG1lbWJlci4KLQotVGhlIG1vZGlmaWVyIGBcfFxjCi0uQiB2XGMKLVx8JyB1c2VkIHdpdGggdGhpcyBvcGVyYXRpb24gZWxpY2l0cyBhIGxpbmUgb2YKLW91dHB1dCBmb3IgZWFjaCBmaWxlIGluc2VydGVkLCBhbG9uZyB3aXRoIG9uZSBvZiB0aGUgbGV0dGVycyBgXHxcYwotLkIgYVxjCi1cfCcgb3IKLWBcfFxjCi0uQiByXGMKLVx8JyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBmaWxlIHdhcyBhcHBlbmRlZCAobm8gb2xkIG1lbWJlcgotZGVsZXRlZCkgb3IgcmVwbGFjZWQuCi0KLS5UUAotLkIgdAotRGlzcGxheSBhIFxjCi0uSSB0YWJsZVxjCi1cJiBsaXN0aW5nIHRoZSBjb250ZW50cyBvZiBcYwotLkkgYXJjaGl2ZVxjCi1cJiwgb3IgdGhvc2UKLW9mIHRoZSBmaWxlcyBsaXN0ZWQgaW4gXGMKLS5JIGZpbGVzXGMKLVwmIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlCi1hcmNoaXZlLiAgTm9ybWFsbHkgb25seSB0aGUgbWVtYmVyIG5hbWUgaXMgc2hvd247IGlmIHlvdSBhbHNvIHdhbnQgdG8KLXNlZSB0aGUgbW9kZXMgKHBlcm1pc3Npb25zKSwgdGltZXN0YW1wLCBvd25lciwgZ3JvdXAsIGFuZCBzaXplLCB5b3UgY2FuCi1yZXF1ZXN0IHRoYXQgYnkgYWxzbyBzcGVjaWZ5aW5nIHRoZSBgXHxcYwotLkIgdlxjCi1cfCcgbW9kaWZpZXIuCi0KLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhbnkgXGMKLS5JIGZpbGVzXGMKLVwmLCBhbGwgZmlsZXMgaW4gdGhlIGFyY2hpdmUKLWFyZSBsaXN0ZWQuCi0KLUlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgKHNheSwgYFx8XGMKLS5CIGZpZVxjCi1cfCcpIGluCi1hbiBhcmNoaXZlIChzYXkgYFx8XGMKLS5CIGIuYVxjCi1cfCcpLCBgXHxcYwotLkIgYXIgdCBiLmEgZmllXGMKLVx8JyB3aWxsIGxpc3Qgb25seSB0aGUKLWZpcnN0IGluc3RhbmNlOyB0byBzZWUgdGhlbSBhbGwsIHlvdSBtdXN0IGFzayBmb3IgYSBjb21wbGV0ZQotbGlzdGluZ1woZW1cJmluIG91ciBleGFtcGxlLCBgXHxcYwotLkIgYXIgdCBiLmFcYwotXHwnLgotCi0uVFAKLS5CIHgKLVxjCi0uSSBFeHRyYWN0XGMKLVwmIG1lbWJlcnMgKG5hbWVkIFxjCi0uSSBmaWxlc1xjCi1cJikgZnJvbSB0aGUgYXJjaGl2ZS4gIFlvdSBjYW4KLXVzZSB0aGUgYFx8XGMKLS5CIHZcYwotXHwnIG1vZGlmaWVyIHdpdGggdGhpcyBvcGVyYXRpb24sIHRvIHJlcXVlc3QgdGhhdAotXGMKLS5CIGFyXGMKLVwmIGxpc3QgZWFjaCBuYW1lIGFzIGl0IGV4dHJhY3RzIGl0LgotCi1JZiB5b3UgZG8gbm90IHNwZWNpZnkgYW55IFxjCi0uSSBmaWxlc1xjCi1cJiwgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlCi1hcmUgZXh0cmFjdGVkLgotCi0uUFAKLQotQSBudW1iZXIgb2YgbW9kaWZpZXJzIChcYwotLkkgbW9kXGMKLVwmKSBtYXkgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBcYwotLkkgcFxjCi1cJgota2V5bGV0dGVyLCB0byBzcGVjaWZ5IHZhcmlhdGlvbnMgb24gYW4gb3BlcmF0aW9uJ3MgYmVoYXZpb3I6Ci0KLS5UUAotLkIgYQotQWRkIG5ldyBmaWxlcyBcYwotLkkgYWZ0ZXJcYwotXCYgYW4gZXhpc3RpbmcgbWVtYmVyIG9mIHRoZQotYXJjaGl2ZS4gIElmIHlvdSB1c2UgdGhlIG1vZGlmaWVyIFxjCi0uQiBhXGMKLVwmLCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBhcmNoaXZlCi1tZW1iZXIgbXVzdCBiZSBwcmVzZW50IGFzIHRoZSBcYwotLkkgbWVtYmVybmFtZVxjCi1cJiBhcmd1bWVudCwgYmVmb3JlIHRoZQotXGMKLS5JIGFyY2hpdmVcYwotXCYgc3BlY2lmaWNhdGlvbi4KLQotLlRQCi0uQiBiCi1BZGQgbmV3IGZpbGVzIFxjCi0uSSBiZWZvcmVcYwotXCYgYW4gZXhpc3RpbmcgbWVtYmVyIG9mIHRoZQotYXJjaGl2ZS4gIElmIHlvdSB1c2UgdGhlIG1vZGlmaWVyIFxjCi0uQiBiXGMKLVwmLCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBhcmNoaXZlCi1tZW1iZXIgbXVzdCBiZSBwcmVzZW50IGFzIHRoZSBcYwotLkkgbWVtYmVybmFtZVxjCi1cJiBhcmd1bWVudCwgYmVmb3JlIHRoZQotXGMKLS5JIGFyY2hpdmVcYwotXCYgc3BlY2lmaWNhdGlvbi4gIChzYW1lIGFzIGBcfFxjCi0uQiBpXGMKLVx8JykuCi0KLS5UUAotLkIgYwotXGMKLS5JIENyZWF0ZVxjCi1cJiB0aGUgYXJjaGl2ZS4gIFRoZSBzcGVjaWZpZWQgXGMKLS5JIGFyY2hpdmVcYwotXCYgaXMgYWx3YXlzCi1jcmVhdGVkIGlmIGl0IGRpZG4ndCBleGlzdCwgd2hlbiB5b3UgcmVxdWVzdCBhbiB1cGRhdGUuICBCdXQgYSB3YXJuaW5nIGlzCi1pc3N1ZWQgdW5sZXNzIHlvdSBzcGVjaWZ5IGluIGFkdmFuY2UgdGhhdCB5b3UgZXhwZWN0IHRvIGNyZWF0ZSBpdCwgYnkKLXVzaW5nIHRoaXMgbW9kaWZpZXIuCi0KLS5UUAotLkIgZgotVHJ1bmNhdGUgbmFtZXMgaW4gdGhlIGFyY2hpdmUuICAKLS5CIGFyCi13aWxsIG5vcm1hbGx5IHBlcm1pdCBmaWxlIG5hbWVzIG9mIGFueSBsZW5ndGguICBUaGlzIHdpbGwgY2F1c2UgaXQgdG8KLWNyZWF0ZSBhcmNoaXZlcyB3aGljaCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgbmF0aXZlIAotLkIgYXIKLXByb2dyYW0gb24gc29tZSBzeXN0ZW1zLiAgSWYgdGhpcyBpcyBhIGNvbmNlcm4sIHRoZSAKLS5CIGYKLW1vZGlmaWVyIG1heSBiZSB1c2VkIHRvIHRydW5jYXRlIGZpbGUgbmFtZXMgd2hlbiBwdXR0aW5nIHRoZW0gaW4gdGhlCi1hcmNoaXZlLgotCi0uVFAKLS5CIGkKLUluc2VydCBuZXcgZmlsZXMgXGMKLS5JIGJlZm9yZVxjCi1cJiBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgXGMKLS5CIGlcYwotXCYsIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIFxjCi0uSSBtZW1iZXJuYW1lXGMKLVwmIGFyZ3VtZW50LCBiZWZvcmUgdGhlCi1cYwotLkkgYXJjaGl2ZVxjCi1cJiBzcGVjaWZpY2F0aW9uLiAgKHNhbWUgYXMgYFx8XGMKLS5CIGJcYwotXHwnKS4KLQotLlRQCi0uQiBsCi1UaGlzIG1vZGlmaWVyIGlzIGFjY2VwdGVkIGJ1dCBub3QgdXNlZC4KLQotLlRQCi0uQiBOCi1Vc2VzIHRoZQotLkkgY291bnQKLXBhcmFtZXRlci4gIFRoaXMgaXMgdXNlZCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZW50cmllcyBpbiB0aGUgYXJjaGl2ZQotd2l0aCB0aGUgc2FtZSBuYW1lLiAgRXh0cmFjdCBvciBkZWxldGUgaW5zdGFuY2UKLS5JIGNvdW50Ci1vZiB0aGUgZ2l2ZW4gbmFtZSBmcm9tIHRoZSBhcmNoaXZlLgotCi0uVFAKLS5CIG8KLVByZXNlcnZlIHRoZSBcYwotLkkgb3JpZ2luYWxcYwotXCYgZGF0ZXMgb2YgbWVtYmVycyB3aGVuIGV4dHJhY3RpbmcgdGhlbS4gIElmCi15b3UgZG8gbm90IHNwZWNpZnkgdGhpcyBtb2RpZmllciwgZmlsZXMgZXh0cmFjdGVkIGZyb20gdGhlIGFyY2hpdmUKLXdpbGwgYmUgc3RhbXBlZCB3aXRoIHRoZSB0aW1lIG9mIGV4dHJhY3Rpb24uCi0KLS5UUAotLkIgUAotVXNlIHRoZSBmdWxsIHBhdGggbmFtZSB3aGVuIG1hdGNoaW5nIG5hbWVzIGluIHRoZSBhcmNoaXZlLgotLkIgYXIKLWNhbiBub3QgY3JlYXRlIGFuIGFyY2hpdmUgd2l0aCBhIGZ1bGwgcGF0aCBuYW1lIChzdWNoIGFyY2hpdmVzIGFyZSBub3QKLVBPU0lYIGNvbXBsYWludCksIGJ1dCBvdGhlciBhcmNoaXZlIGNyZWF0b3JzIGNhbi4gIFRoaXMgb3B0aW9uIHdpbGwKLWNhdXNlCi0uQiBhcgotdG8gbWF0Y2ggZmlsZSBuYW1lcyB1c2luZyBhIGNvbXBsZXRlIHBhdGggbmFtZSwgd2hpY2ggY2FuIGJlCi1jb252ZW5pZW50IHdoZW4gZXh0cmFjdGluZyBhIHNpbmdsZSBmaWxlIGZyb20gYW4gYXJjaGl2ZSBjcmVhdGVkIGJ5Ci1hbm90aGVyIHRvb2wuCi0KLS5UUAotLkIgcwotV3JpdGUgYW4gb2JqZWN0LWZpbGUgaW5kZXggaW50byB0aGUgYXJjaGl2ZSwgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIG9uZSwKLWV2ZW4gaWYgbm8gb3RoZXIgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIGFyY2hpdmUuICBZb3UgbWF5IHVzZSB0aGlzIG1vZGlmaWVyCi1mbGFnIGVpdGhlciB3aXRoIGFueSBvcGVyYXRpb24sIG9yIGFsb25lLiAgUnVubmluZyBgXHxcYwotLkIgYXIgc1xjCi1cfCcgb24gYW4KLWFyY2hpdmUgaXMgZXF1aXZhbGVudCB0byBydW5uaW5nIGBcfFxjCi0uQiByYW5saWJcYwotXHwnIG9uIGl0LgotCi0uVFAKLS5CIFMKLURvIG5vdCBnZW5lcmF0ZSBhbiBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gIFRoaXMgY2FuIHNwZWVkIHVwIGJ1aWxkaW5nIGEKLWxhcmdlIGxpYnJhcnkgaW4gc2V2ZXJhbCBzdGVwcy4gIFRoZSByZXN1bHRpbmcgYXJjaGl2ZSBjYW4gbm90IGJlIHVzZWQKLXdpdGggdGhlIGxpbmtlci4gIEluIG9yZGVyIHRvIGJ1aWxkIGEgc3ltYm9sIHRhYmxlLCB5b3UgbXVzdCBvbWl0IHRoZQotYFx8XGMKLS5CIFNcYwotXHwnIG1vZGlmaWVyIG9uIHRoZSBsYXN0IGV4ZWN1dGlvbiBvZiBgXHxcYwotLkIgYXJcYwotXHwnLCBvciB5b3UgbXVzdCBydW4gYFx8XGMKLS5CIHJhbmxpYlxjCi1cfCcgb24gdGhlIGFyY2hpdmUuCi0KLS5UUAotLkIgdQotTm9ybWFsbHksIFxjCi0uQiBhciByXGMKLVwmLlx8Llx8LiBpbnNlcnRzIGFsbCBmaWxlcwotbGlzdGVkIGludG8gdGhlIGFyY2hpdmUuICBJZiB5b3Ugd291bGQgbGlrZSB0byBpbnNlcnQgXGMKLS5JIG9ubHlcYwotXCYgdGhvc2UKLW9mIHRoZSBmaWxlcyB5b3UgbGlzdCB0aGF0IGFyZSBuZXdlciB0aGFuIGV4aXN0aW5nIG1lbWJlcnMgb2YgdGhlIHNhbWUKLW5hbWVzLCB1c2UgdGhpcyBtb2RpZmllci4gIFRoZSBgXHxcYwotLkIgdVxjCi1cfCcgbW9kaWZpZXIgaXMgYWxsb3dlZCBvbmx5IGZvciB0aGUKLW9wZXJhdGlvbiBgXHxcYwotLkIgclxjCi1cfCcgKHJlcGxhY2UpLiAgSW4gcGFydGljdWxhciwgdGhlIGNvbWJpbmF0aW9uIGBcfFxjCi0uQiBxdVxjCi1cfCcgaXMKLW5vdCBhbGxvd2VkLCBzaW5jZSBjaGVja2luZyB0aGUgdGltZXN0YW1wcyB3b3VsZCBsb3NlIGFueSBzcGVlZAotYWR2YW50YWdlIGZyb20gdGhlIG9wZXJhdGlvbiBgXHxcYwotLkIgcVxjCi1cfCcuCi0KLS5UUAotLkIgdgotVGhpcyBtb2RpZmllciByZXF1ZXN0cyB0aGUgXGMKLS5JIHZlcmJvc2VcYwotXCYgdmVyc2lvbiBvZiBhbiBvcGVyYXRpb24uICBNYW55Ci1vcGVyYXRpb25zIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgc3VjaCBhcyBmaWxlbmFtZXMgcHJvY2Vzc2VkLAotd2hlbiB0aGUgbW9kaWZpZXIgYFx8XGMKLS5CIHZcYwotXHwnIGlzIGFwcGVuZGVkLgotCi0uVFAKLS5CIFYKLVRoaXMgbW9kaWZpZXIgc2hvd3MgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQlIgYXIgLgotCi0uUFAKLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLSwgUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpLgotLkJSIG5tICggMSApXGMKLVwmLAotLkJSIHJhbmxpYiAoIDEgKVxjCi1cJi4KLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NSwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYXIuYyBiL2JpbnV0aWxzL2FyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOWU1OWQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MTEgKzAsMCBAQAotLyogYXIuYyAtIEFyY2hpdmUgbW9kaWZ5IGFuZCBleHRyYWN0LgotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyoKLSAgIEJ1Z3M6IHNob3VsZCB1c2UgZ2V0b3B0IHRoZSB3YXkgdGFyIGRvZXMgKGNvbXBsZXRlIHcvb3B0aW9uYWwgLSkgYW5kCi0gICBzaG91bGQgaGF2ZSBsb25nIG9wdGlvbnMgdG9vLiBHTlUgYXIgdXNlZCB0byBjaGVjayBmaWxlIGFnYWluc3QgZmlsZXN5c3RlbQotICAgaW4gcXVpY2tfdXBkYXRlIGFuZCByZXBsYWNlIG9wZXJhdGlvbnMgKHdvdWxkIGNoZWNrIG10aW1lKS4gRG9lc24ndCB3YXJuCi0gICB3aGVuIG5hbWUgdHJ1bmNhdGVkLiBObyB3YXkgdG8gc3BlY2lmeSBwb3NfZW5kLiBFcnJvciBtZXNzYWdlcyBzaG91bGQgYmUKLSAgIG1vcmUgY29uc2lzdGFudC4KLSovCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYXJzdXAuaCIKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWZkZWYgX19HTzMyX19fCi0jZGVmaW5lIEVYVF9OQU1FX0xFTiAzCQkvKiBidWZmbGVuIG9mIGFkZGl0aW9uIHRvIG5hbWUgaWYgaXQncyBNUy1ET1MgKi8KLSNlbHNlCi0jZGVmaW5lIEVYVF9OQU1FX0xFTiA2CQkvKiBkaXR0byBmb3IgKk5JWCAqLwotI2VuZGlmCi0KLS8qIFdlIG5lZWQgdG8gb3BlbiBmaWxlcyBpbiBiaW5hcnkgbW9kZXMgb24gc3lzdGVtIHdoZXJlIHRoYXQgbWFrZXMgYQotICAgZGlmZmVyZW5jZS4gICovCi0jaWZuZGVmIE9fQklOQVJZCi0jZGVmaW5lIE9fQklOQVJZIDAKLSNlbmRpZgotCi0jZGVmaW5lIEJVRlNJWkUgODE5MgotCi0vKiBLbHVkZ2UgZGVjbGFyYXRpb24gZnJvbSBCRkQhICBUaGlzIGlzIHVnbHkhICBGSVhNRSEgIFhYWCAqLwotCi1zdHJ1Y3QgYXJfaGRyICoKLSAgYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUgUEFSQU1TICgoYmZkICogYWJmZCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLQotLyogU3RhdGljIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgdm9pZAotbXJpX2VtdWwgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotcmVtb3ZlX291dHB1dCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi1tYXBfb3Zlcl9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCB2b2lkICgqKShiZmQgKiksIGNoYXIgKiosIGludCkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfY29udGVudHMgUEFSQU1TICgoYmZkICogbWVtYmVyKSk7Ci0KLXN0YXRpYyB2b2lkCi1kZWxldGVfbWVtYmVycyBQQVJBTVMgKChiZmQgKiwgY2hhciAqKmZpbGVzX3RvX2RlbGV0ZSkpOwotCi0jaWYgMAotc3RhdGljIHZvaWQKLWRvX3F1aWNrX2FwcGVuZCBQQVJBTVMgKChjb25zdCBjaGFyICphcmNoaXZlX2ZpbGVuYW1lLAotCQkJIGNoYXIgKipmaWxlc190b19hcHBlbmQpKTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotbW92ZV9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqZmlsZXNfdG9fbW92ZSkpOwotCi1zdGF0aWMgdm9pZAotcmVwbGFjZV9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqZmlsZXNfdG9fcmVwbGFjZSwgYm9vbGVhbiBxdWljaykpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfZGVzY3IgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotd3JpdGVfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotcmFubGliX29ubHkgUEFSQU1TICgoY29uc3QgY2hhciAqYXJjaG5hbWUpKTsKLQotc3RhdGljIHZvaWQKLXJhbmxpYl90b3VjaCBQQVJBTVMgKChjb25zdCBjaGFyICphcmNobmFtZSkpOwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgUEFSQU1TICgoaW50KSk7Ci0MCi0vKiogR2xvYmFscyBhbmQgZmxhZ3MgKi8KLQotaW50IG1yaV9tb2RlOwotCi0vKiBUaGlzIGZsYWcgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFyIGFuZCByYW5saWI6Ci0gICAxIG1lYW5zIHRoaXMgaXMgJ3JhbmxpYic7IDAgbWVhbnMgdGhpcyBpcyAnYXInLgotICAgLTEgbWVhbnMgaWYgd2Ugc2hvdWxkIHVzZSBhcmd2WzBdIHRvIGRlY2lkZS4gICovCi1leHRlcm4gaW50IGlzX3JhbmxpYjsKLQotLyogTm9uemVybyBtZWFucyBkb24ndCB3YXJuIGFib3V0IGNyZWF0aW5nIHRoZSBhcmNoaXZlIGZpbGUgaWYgbmVjZXNzYXJ5LiAgKi8KLWludCBzaWxlbnRfY3JlYXRlID0gMDsKLQotLyogTm9uemVybyBtZWFucyBkZXNjcmliZSBlYWNoIGFjdGlvbiBwZXJmb3JtZWQuICAqLwotaW50IHZlcmJvc2UgPSAwOwotCi0vKiBOb256ZXJvIG1lYW5zIHByZXNlcnZlIGRhdGVzIG9mIG1lbWJlcnMgd2hlbiBleHRyYWN0aW5nIHRoZW0uICAqLwotaW50IHByZXNlcnZlX2RhdGVzID0gMDsKLQotLyogTm9uemVybyBtZWFucyBkb24ndCByZXBsYWNlIGV4aXN0aW5nIG1lbWJlcnMgd2hvc2UgZGF0ZXMgYXJlIG1vcmUgcmVjZW50Ci0gICB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVzLiAgKi8KLWludCBuZXdlcl9vbmx5ID0gMDsKLQotLyogQ29udHJvbHMgdGhlIHdyaXRpbmcgb2YgYW4gYXJjaGl2ZSBzeW1ib2wgdGFibGUgKGluIEJTRDogYSBfXy5TWU1ERUYKLSAgIG1lbWJlcikuICAtMSBtZWFucyB3ZSd2ZSBiZWVuIGV4cGxpY2l0bHkgYXNrZWQgdG8gbm90IHdyaXRlIGEgc3ltYm9sIHRhYmxlOwotICAgKzEgbWVhbnMgd2UndmUgYmVlbiBleHBsaWN0bHkgYXNrZWQgdG8gd3JpdGUgaXQ7Ci0gICAwIGlzIHRoZSBkZWZhdWx0LgotICAgVHJhZGl0aW9uYWxseSwgdGhlIGRlZmF1bHQgaW4gQlNEIGhhcyBiZWVuIHRvIG5vdCB3cml0ZSB0aGUgdGFibGUuCi0gICBIb3dldmVyLCBmb3IgUE9TSVguMiBjb21wbGlhbmNlIHRoZSBkZWZhdWx0IGlzIG5vdyB0byB3cml0ZSBhIHN5bWJvbCB0YWJsZQotICAgaWYgYW55IG9mIHRoZSBtZW1iZXJzIGFyZSBvYmplY3QgZmlsZXMuICAqLwotaW50IHdyaXRlX2FybWFwID0gMDsKLQotLyogTm9uemVybyBtZWFucyBpdCdzIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIG1lbWJlcjsgcG9zaXRpb24gbmV3IG9yIG1vdmVkCi0gICBmaWxlcyB3aXRoIHJlc3BlY3QgdG8gdGhpcyBvbmUuICAqLwotY2hhciAqcG9zbmFtZSA9IE5VTEw7Ci0KLS8qIFNleiBob3cgdG8gdXNlIGBwb3NuYW1lJzogcG9zX2JlZm9yZSBtZWFucyBwb3NpdGlvbiBiZWZvcmUgdGhhdCBtZW1iZXIuCi0gICBwb3NfYWZ0ZXIgbWVhbnMgcG9zaXRpb24gYWZ0ZXIgdGhhdCBtZW1iZXIuIHBvc19lbmQgbWVhbnMgYWx3YXlzIGF0IGVuZC4KLSAgIHBvc19kZWZhdWx0IG1lYW5zIGRlZmF1bHQgYXBwcm9wcmlhdGVseS4gRm9yIHRoZSBsYXR0ZXIgdHdvLCBgcG9zbmFtZScKLSAgIHNob3VsZCBhbHNvIGJlIHplcm8uICAqLwotZW51bSBwb3MKLSAgewotICAgIHBvc19kZWZhdWx0LCBwb3NfYmVmb3JlLCBwb3NfYWZ0ZXIsIHBvc19lbmQKLSAgfSBwb3N0eXBlID0gcG9zX2RlZmF1bHQ7Ci0KLXN0YXRpYyBiZmQgKioKLWdldF9wb3NfYmZkIFBBUkFNUyAoKGJmZCAqKiwgZW51bSBwb3MsIGNvbnN0IGNoYXIgKikpOwotCi0vKiBGb3IgZXh0cmFjdC9kZWxldGUgb25seS4gIElmIENPVU5URURfTkFNRV9NT0RFIGlzIHRydWUsIHdlIG9ubHkKLSAgIGV4dHJhY3QgdGhlIENPVU5URURfTkFNRV9DT1VOVEVSIGluc3RhbmNlIG9mIHRoYXQgbmFtZS4gICovCi1zdGF0aWMgYm9vbGVhbiBjb3VudGVkX25hbWVfbW9kZSA9IDA7Ci1zdGF0aWMgaW50IGNvdW50ZWRfbmFtZV9jb3VudGVyID0gMDsKLQotLyogV2hldGhlciB0byB0cnVuY2F0ZSBuYW1lcyBvZiBmaWxlcyBzdG9yZWQgaW4gdGhlIGFyY2hpdmUuICAqLwotc3RhdGljIGJvb2xlYW4gYXJfdHJ1bmNhdGUgPSBmYWxzZTsKLQotLyogV2hldGhlciB0byB1c2UgYSBmdWxsIGZpbGUgbmFtZSBtYXRjaCB3aGVuIHNlYXJjaGluZyBhbiBhcmNoaXZlLgotICAgVGhpcyBpcyBjb252ZW5pZW50IGZvciBhcmNoaXZlcyBjcmVhdGVkIGJ5IHRoZSBNaWNyb3NvZnQgbGliCi0gICBwcm9ncmFtLiAgKi8KLXN0YXRpYyBib29sZWFuIGZ1bGxfcGF0aG5hbWUgPSBmYWxzZTsKLQotaW50IGludGVyYWN0aXZlID0gMDsKLQotc3RhdGljIHZvaWQKLW1yaV9lbXVsICgpCi17Ci0gIGludGVyYWN0aXZlID0gaXNhdHR5IChmaWxlbm8gKHN0ZGluKSk7Ci0gIHl5cGFyc2UgKCk7Ci19Ci0KLS8qIElmIENPVU5UIGlzIDAsIHRoZW4gRlVOQ1RJT04gaXMgY2FsbGVkIG9uY2Ugb24gZWFjaCBlbnRyeS4gIElmIG5vbnplcm8sCi0gICBDT1VOVCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBGSUxFUyBjaGFpbjsgRlVOQ1RJT04gaXMgY2FsbGVkIG9uIGVhY2ggZW50cnkKLSAgIHdob3NlIG5hbWUgbWF0Y2hlcyBvbmUgaW4gRklMRVMuICAqLwotCi1zdGF0aWMgdm9pZAotbWFwX292ZXJfbWVtYmVycyAoYXJjaCwgZnVuY3Rpb24sIGZpbGVzLCBjb3VudCkKLSAgICAgYmZkICphcmNoOwotICAgICB2b2lkICgqZnVuY3Rpb24pIFBBUkFNUyAoKGJmZCAqKSk7Ci0gICAgIGNoYXIgKipmaWxlczsKLSAgICAgaW50IGNvdW50OwotewotICBiZmQgKmhlYWQ7Ci0gIGludCBtYXRjaF9jb3VudDsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKGhlYWQgPSBhcmNoLT5uZXh0OyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkKLQl7Ci0JICBQUk9HUkVTUyAoMSk7Ci0JICBmdW5jdGlvbiAoaGVhZCk7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGlzIG1heSBhcHBlYXIgdG8gYmUgYSBiYXJvcXVlIHdheSBvZiBhY2NvbXBsaXNoaW5nIHdoYXQgd2Ugd2FudC4KLSAgICAgSG93ZXZlciB3ZSBoYXZlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZmlsZW5hbWVzIGluIG9yZGVyIHRvIG5vdGljZSB3aGVyZQotICAgICBhIGZpbGVuYW1lIGlzIHJlcXVlc3RlZCBidXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFyY2hpdmUuICBEaXR0bwotICAgICBtYXBwaW5nIG92ZXIgZWFjaCBmaWxlIGVhY2ggdGltZSAtLSB3ZSB3YW50IHRvIGhhY2sgbXVsdGlwbGUKLSAgICAgcmVmZXJlbmNlcy4gICovCi0KLSAgZm9yICg7IGNvdW50ID4gMDsgZmlsZXMrKywgY291bnQtLSkKLSAgICB7Ci0gICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIG1hdGNoX2NvdW50ID0gMDsKLSAgICAgIGZvciAoaGVhZCA9IGFyY2gtPm5leHQ7IGhlYWQ7IGhlYWQgPSBoZWFkLT5uZXh0KQotCXsKLQkgIFBST0dSRVNTICgxKTsKLQkgIGlmIChoZWFkLT5maWxlbmFtZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogU29tZSBhcmNoaXZlIGZvcm1hdHMgZG9uJ3QgZ2V0IHRoZSBmaWxlbmFtZXMgZmlsbGVkIGluCi0JCSB1bnRpbCB0aGUgZWxlbWVudHMgYXJlIG9wZW5lZC4gICovCi0JICAgICAgc3RydWN0IHN0YXQgYnVmOwotCSAgICAgIGJmZF9zdGF0X2FyY2hfZWx0IChoZWFkLCAmYnVmKTsKLQkgICAgfQotCSAgaWYgKChoZWFkLT5maWxlbmFtZSAhPSBOVUxMKSAmJgotCSAgICAgICghc3RyY21wIChub3JtYWxpemUgKCpmaWxlcywgYXJjaCksIGhlYWQtPmZpbGVuYW1lKSkpCi0JICAgIHsKLQkgICAgICArK21hdGNoX2NvdW50OwotCSAgICAgIGlmIChjb3VudGVkX25hbWVfbW9kZQotCQkgICYmIG1hdGNoX2NvdW50ICE9IGNvdW50ZWRfbmFtZV9jb3VudGVyKSAKLQkJewotCQkgIC8qIENvdW50aW5nLCBhbmQgZGlkbid0IG1hdGNoIG9uIGNvdW50OyBnbyBvbiB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgIG5leHQgb25lLiAgKi8KLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICAgIGZ1bmN0aW9uIChoZWFkKTsKLQkgICAgfQotCX0KLSAgICAgIGlmICghZm91bmQpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlmcHJpbnRmIChzdGRlcnIsIF8oIm5vIGVudHJ5ICVzIGluIGFyY2hpdmVcbiIpLCAqZmlsZXMpOwotICAgIH0KLX0KLQwKLWJvb2xlYW4gb3BlcmF0aW9uX2FsdGVyc19hcmNoID0gZmFsc2U7Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSAoaGVscCkKLSAgICAgaW50IGhlbHA7Ci17Ci0gIEZJTEUgKnM7Ci0KLSAgcyA9IGhlbHAgPyBzdGRvdXQgOiBzdGRlcnI7Ci0gIAotICBpZiAoISBpc19yYW5saWIpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHMsIF8oIlVzYWdlOiAlcyBbLV17ZG1wcXJzdHh9W2FiY2ZpbE5vUHNTdXZWXSBbbWVtYmVyLW5hbWVdIFtjb3VudF0gYXJjaGl2ZS1maWxlIGZpbGUuLi5cbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHMsIF8oIiAgICAgICAlcyAtTSBbPG1yaS1zY3JpcHRdXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiBjb21tYW5kczpcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgZCAgICAgICAgICAgIC0gZGVsZXRlIGZpbGUocykgZnJvbSB0aGUgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBtW2FiXSAgICAgICAgLSBtb3ZlIGZpbGUocykgaW4gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgcCAgICAgICAgICAgIC0gcHJpbnQgZmlsZShzKSBmb3VuZCBpbiB0aGUgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBxW2ZdICAgICAgICAgLSBxdWljayBhcHBlbmQgZmlsZShzKSB0byB0aGUgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICByW2FiXVtmXVt1XSAgLSByZXBsYWNlIGV4aXN0aW5nIG9yIGluc2VydCBuZXcgZmlsZShzKSBpbnRvIHRoZSBhcmNoaXZlXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIHQgICAgICAgICAgICAtIGRpc3BsYXkgY29udGVudHMgb2YgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICB4W29dICAgICAgICAgLSBleHRyYWN0IGZpbGUocykgZnJvbSB0aGUgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiIGNvbW1hbmQgc3BlY2lmaWMgbW9kaWZpZXJzOlxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbYV0gICAgICAgICAgLSBwdXQgZmlsZShzKSBhZnRlciBbbWVtYmVyLW5hbWVdXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtiXSAgICAgICAgICAtIHB1dCBmaWxlKHMpIGJlZm9yZSBbbWVtYmVyLW5hbWVdIChzYW1lIGFzIFtpXSlcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW05dICAgICAgICAgIC0gdXNlIGluc3RhbmNlIFtjb3VudF0gb2YgbmFtZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbZl0gICAgICAgICAgLSB0cnVuY2F0ZSBpbnNlcnRlZCBmaWxlIG5hbWVzXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtQXSAgICAgICAgICAtIHVzZSBmdWxsIHBhdGggbmFtZXMgd2hlbiBtYXRjaGluZ1xuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbb10gICAgICAgICAgLSBwcmVzZXJ2ZSBvcmlnaW5hbCBkYXRlc1xuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbdV0gICAgICAgICAgLSBvbmx5IHJlcGxhY2UgZmlsZXMgdGhhdCBhcmUgbmV3ZXIgdGhhbiBjdXJyZW50IGFyY2hpdmUgY29udGVudHNcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiBnZW5lcmljIG1vZGlmaWVyczpcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW2NdICAgICAgICAgIC0gZG8gbm90IHdhcm4gaWYgdGhlIGxpYnJhcnkgaGFkIHRvIGJlIGNyZWF0ZWRcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW3NdICAgICAgICAgIC0gY3JlYXRlIGFuIGFyY2hpdmUgaW5kZXggKGNmLiByYW5saWIpXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtTXSAgICAgICAgICAtIGRvIG5vdCBidWlsZCBhIHN5bWJvbCB0YWJsZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbdl0gICAgICAgICAgLSBiZSB2ZXJib3NlXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtWXSAgICAgICAgICAtIGRpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyXG4iKSk7Ci0gICAgfQotICBlbHNlCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmcHJpbnRmIChzLCBfKCJVc2FnZTogJXMgWy12Vl0gYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSk7Ci0KLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdGRlcnIpOwotCi0gIGlmIChoZWxwKQotICAgIGZwcmludGYgKHMsIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotCi0gIHhleGl0IChoZWxwID8gMCA6IDEpOwotfQotCi0vKiBOb3JtYWxpemUgYSBmaWxlIG5hbWUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgaW50byBhIGZpbGUKLSAgIG5hbWUgd2hpY2ggd2Ugd2lsbCB1c2UgaW4gYW4gYXJjaGl2ZS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW5vcm1hbGl6ZSAoZmlsZSwgYWJmZCkKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLQotICBpZiAoZnVsbF9wYXRobmFtZSkKLSAgICByZXR1cm4gZmlsZTsKLQotICBmaWxlbmFtZSA9IHN0cnJjaHIgKGZpbGUsICcvJyk7Ci0gIGlmIChmaWxlbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIGZpbGVuYW1lKys7Ci0gIGVsc2UKLSAgICBmaWxlbmFtZSA9IGZpbGU7Ci0KLSAgaWYgKGFyX3RydW5jYXRlCi0gICAgICAmJiBhYmZkICE9IE5VTEwKLSAgICAgICYmIHN0cmxlbiAoZmlsZW5hbWUpID4gYWJmZC0+eHZlYy0+YXJfbWF4X25hbWVsZW4pCi0gICAgewotICAgICAgY2hhciAqczsKLQotICAgICAgLyogU3BhY2UgbGVhay4gICovCi0gICAgICBzID0gKGNoYXIgKikgeG1hbGxvYyAoYWJmZC0+eHZlYy0+YXJfbWF4X25hbWVsZW4gKyAxKTsKLSAgICAgIG1lbWNweSAocywgZmlsZW5hbWUsIGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuKTsKLSAgICAgIHNbYWJmZC0+eHZlYy0+YXJfbWF4X25hbWVsZW5dID0gJ1wwJzsKLSAgICAgIGZpbGVuYW1lID0gczsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpbGVuYW1lOwotfQotCi0vKiBSZW1vdmUgYW55IG91dHB1dCBmaWxlLiAgVGhpcyBpcyBvbmx5IGNhbGxlZCB2aWEgeGF0ZXhpdC4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotc3RhdGljIEZJTEUgKm91dHB1dF9maWxlID0gTlVMTDsKLXN0YXRpYyBiZmQgKm91dHB1dF9iZmQgPSBOVUxMOwotCi1zdGF0aWMgdm9pZAotcmVtb3ZlX291dHB1dCAoKQotewotICBpZiAob3V0cHV0X2ZpbGVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCAmJiBvdXRwdXRfYmZkLT5pb3N0cmVhbSAhPSBOVUxMKQotCWZjbG9zZSAoKEZJTEUgKikgKG91dHB1dF9iZmQtPmlvc3RyZWFtKSk7Ci0gICAgICBpZiAob3V0cHV0X2ZpbGUgIT0gTlVMTCkKLQlmY2xvc2UgKG91dHB1dF9maWxlKTsKLSAgICAgIHVubGluayAob3V0cHV0X2ZpbGVuYW1lKTsKLSAgICB9Ci19Ci0KLS8qIFRoZSBvcHRpb24gcGFyc2luZyBzaG91bGQgYmUgaW4gaXRzIG93biBmdW5jdGlvbi4KLSAgIEl0IHdpbGwgYmUgd2hlbiBJIGhhdmUgZ2V0b3B0IHdvcmtpbmcuICAqLwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciAqYXJnX3B0cjsKLSAgY2hhciBjOwotICBlbnVtCi0gICAgewotICAgICAgbm9uZSA9IDAsIGRlbGV0ZSwgcmVwbGFjZSwgcHJpbnRfdGFibGUsCi0gICAgICBwcmludF9maWxlcywgZXh0cmFjdCwgbW92ZSwgcXVpY2tfYXBwZW5kCi0gICAgfSBvcGVyYXRpb24gPSBub25lOwotICBpbnQgYXJnX2luZGV4OwotICBjaGFyICoqZmlsZXM7Ci0gIGludCBmaWxlX2NvdW50OwotICBjaGFyICppbmFyY2hfZmlsZW5hbWU7Ci0gIGludCBzaG93X3ZlcnNpb247Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgaWYgKGlzX3JhbmxpYiA8IDApCi0gICAgewotICAgICAgY2hhciAqdGVtcDsKLQotICAgICAgdGVtcCA9IHN0cnJjaHIgKHByb2dyYW1fbmFtZSwgJy8nKTsKLSAgICAgIGlmICh0ZW1wID09IE5VTEwpCi0JdGVtcCA9IHByb2dyYW1fbmFtZTsKLSAgICAgIGVsc2UKLQkrK3RlbXA7Ci0gICAgICBpZiAoc3RybGVuICh0ZW1wKSA+PSA2Ci0JICAmJiBzdHJjbXAgKHRlbXAgKyBzdHJsZW4gKHRlbXApIC0gNiwgInJhbmxpYiIpID09IDApCi0JaXNfcmFubGliID0gMTsKLSAgICAgIGVsc2UKLQlpc19yYW5saWIgPSAwOwotICAgIH0KLQotICBpZiAoYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAnLScpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi0taGVscCIpID09IDApCi0JdXNhZ2UgKDEpOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmd2WzFdLCAiLS12ZXJzaW9uIikgPT0gMCkKLQl7Ci0JICBpZiAoaXNfcmFubGliKQotCSAgICBwcmludF92ZXJzaW9uICgicmFubGliIik7Ci0JICBlbHNlCi0JICAgIHByaW50X3ZlcnNpb24gKCJhciIpOwotCX0KLSAgICB9Ci0KLSAgU1RBUlRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSwgMCk7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgc2hvd192ZXJzaW9uID0gMDsKLQotICB4YXRleGl0IChyZW1vdmVfb3V0cHV0KTsKLQotICBpZiAoaXNfcmFubGliKQotICAgIHsKLSAgICAgIGJvb2xlYW4gdG91Y2ggPSBmYWxzZTsKLQotICAgICAgaWYgKGFyZ2MgPCAyIHx8IHN0cmNtcCAoYXJndlsxXSwgIi0taGVscCIpID09IDApCi0JdXNhZ2UgKDApOwotICAgICAgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi1WIikgPT0gMAotCSAgfHwgc3RyY21wIChhcmd2WzFdLCAiLXYiKSA9PSAwCi0JICB8fCBzdHJuY21wIChhcmd2WzFdLCAiLS12IiwgMykgPT0gMCkKLQlwcmludF92ZXJzaW9uICgicmFubGliIik7Ci0gICAgICBhcmdfaW5kZXggPSAxOwotICAgICAgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi10IikgPT0gMCkKLQl7Ci0JICArK2FyZ19pbmRleDsKLQkgIHRvdWNoID0gdHJ1ZTsKLQl9Ci0gICAgICB3aGlsZSAoYXJnX2luZGV4IDwgYXJnYykKLQl7Ci0JICBpZiAoISB0b3VjaCkKLQkgICAgcmFubGliX29ubHkgKGFyZ3ZbYXJnX2luZGV4XSk7Ci0JICBlbHNlCi0JICAgIHJhbmxpYl90b3VjaCAoYXJndlthcmdfaW5kZXhdKTsKLQkgICsrYXJnX2luZGV4OwotCX0KLSAgICAgIHhleGl0ICgwKTsKLSAgICB9Ci0KLSAgaWYgKGFyZ2MgPT0gMiAmJiBzdHJjbXAgKGFyZ3ZbMV0sICItTSIpID09IDApCi0gICAgewotICAgICAgbXJpX2VtdWwgKCk7Ci0gICAgICB4ZXhpdCAoMCk7Ci0gICAgfQotCi0gIGlmIChhcmdjIDwgMikKLSAgICB1c2FnZSAoMCk7Ci0KLSAgYXJnX3B0ciA9IGFyZ3ZbMV07Ci0KLSAgaWYgKCphcmdfcHRyID09ICctJykKLSAgICArK2FyZ19wdHI7CQkJLyogY29tcGF0aWJpbGl0eSAqLwotCi0gIHdoaWxlICgoYyA9ICphcmdfcHRyKyspICE9ICdcMCcpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdkJzoKLQljYXNlICdtJzoKLQljYXNlICdwJzoKLQljYXNlICdxJzoKLQljYXNlICdyJzoKLQljYXNlICd0JzoKLQljYXNlICd4JzoKLQkgIGlmIChvcGVyYXRpb24gIT0gbm9uZSkKLQkgICAgZmF0YWwgKF8oInR3byBkaWZmZXJlbnQgb3BlcmF0aW9uIG9wdGlvbnMgc3BlY2lmaWVkIikpOwotCSAgc3dpdGNoIChjKQotCSAgICB7Ci0JICAgIGNhc2UgJ2QnOgotCSAgICAgIG9wZXJhdGlvbiA9IGRlbGV0ZTsKLQkgICAgICBvcGVyYXRpb25fYWx0ZXJzX2FyY2ggPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdtJzoKLQkgICAgICBvcGVyYXRpb24gPSBtb3ZlOwotCSAgICAgIG9wZXJhdGlvbl9hbHRlcnNfYXJjaCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3AnOgotCSAgICAgIG9wZXJhdGlvbiA9IHByaW50X2ZpbGVzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdxJzoKLQkgICAgICBvcGVyYXRpb24gPSBxdWlja19hcHBlbmQ7Ci0JICAgICAgb3BlcmF0aW9uX2FsdGVyc19hcmNoID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncic6Ci0JICAgICAgb3BlcmF0aW9uID0gcmVwbGFjZTsKLQkgICAgICBvcGVyYXRpb25fYWx0ZXJzX2FyY2ggPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd0JzoKLQkgICAgICBvcGVyYXRpb24gPSBwcmludF90YWJsZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAneCc6Ci0JICAgICAgb3BlcmF0aW9uID0gZXh0cmFjdDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCWNhc2UgJ2wnOgotCSAgYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JICBzaWxlbnRfY3JlYXRlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgcHJlc2VydmVfZGF0ZXMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBzaG93X3ZlcnNpb24gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICB3cml0ZV9hcm1hcCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIHdyaXRlX2FybWFwID0gLTE7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQkgIG5ld2VyX29ubHkgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICB2ZXJib3NlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2EnOgotCSAgcG9zdHlwZSA9IHBvc19hZnRlcjsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgcG9zdHlwZSA9IHBvc19iZWZvcmU7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIHBvc3R5cGUgPSBwb3NfYmVmb3JlOwotCSAgYnJlYWs7Ci0JY2FzZSAnTSc6Ci0JICBtcmlfbW9kZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIGNvdW50ZWRfbmFtZV9tb2RlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgYXJfdHJ1bmNhdGUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnUCc6Ci0JICBmdWxsX3BhdGhuYW1lID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaWxsZWdhbCBvcHRpb24gLS0gJWNcbiIpLCBwcm9ncmFtX25hbWUsIGMpOwotCSAgdXNhZ2UgKDApOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNob3dfdmVyc2lvbikKLSAgICBwcmludF92ZXJzaW9uICgiYXIiKTsKLQotICBpZiAoYXJnYyA8IDMpCi0gICAgdXNhZ2UgKDApOwotCi0gIGlmIChtcmlfbW9kZSkKLSAgICB7Ci0gICAgICBtcmlfZW11bCAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmQgKmFyY2g7Ci0KLSAgICAgIC8qIFdlIGNhbid0IHdyaXRlIGFuIGFybWFwIHdoZW4gdXNpbmcgYXIgcSwgc28ganVzdCBkbyBhciByCi0gICAgICAgICBpbnN0ZWFkLiAgKi8KLSAgICAgIGlmIChvcGVyYXRpb24gPT0gcXVpY2tfYXBwZW5kICYmIHdyaXRlX2FybWFwKQotCW9wZXJhdGlvbiA9IHJlcGxhY2U7Ci0KLSAgICAgIGlmICgob3BlcmF0aW9uID09IG5vbmUgfHwgb3BlcmF0aW9uID09IHByaW50X3RhYmxlKQotCSAgJiYgd3JpdGVfYXJtYXAgPT0gMSkKLQl7Ci0JICByYW5saWJfb25seSAoYXJndlsyXSk7Ci0JICB4ZXhpdCAoMCk7Ci0JfQotCi0gICAgICBpZiAob3BlcmF0aW9uID09IG5vbmUpCi0JZmF0YWwgKF8oIm5vIG9wZXJhdGlvbiBzcGVjaWZpZWQiKSk7Ci0KLSAgICAgIGlmIChuZXdlcl9vbmx5ICYmIG9wZXJhdGlvbiAhPSByZXBsYWNlKQotCWZhdGFsIChfKCJgdScgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlIGByJyBvcHRpb24uIikpOwotCi0gICAgICBhcmdfaW5kZXggPSAyOwotCi0gICAgICBpZiAocG9zdHlwZSAhPSBwb3NfZGVmYXVsdCkKLQlwb3NuYW1lID0gYXJndlthcmdfaW5kZXgrK107Ci0KLSAgICAgIGlmIChjb3VudGVkX25hbWVfbW9kZSkgCi0JewotICAgICAgICAgIGlmIChvcGVyYXRpb24gIT0gZXh0cmFjdCAmJiBvcGVyYXRpb24gIT0gZGVsZXRlKSAKLQkgICAgIGZhdGFsIChfKCJgTicgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlIGB4JyBhbmQgJ2QnIG9wdGlvbnMuIikpOwotCSAgY291bnRlZF9uYW1lX2NvdW50ZXIgPSBhdG9pIChhcmd2W2FyZ19pbmRleCsrXSk7Ci0gICAgICAgICAgaWYgKGNvdW50ZWRfbmFtZV9jb3VudGVyIDw9IDApCi0JICAgIGZhdGFsIChfKCJWYWx1ZSBmb3IgYE4nIG11c3QgYmUgcG9zaXRpdmUuIikpOwotCX0KLQotICAgICAgaW5hcmNoX2ZpbGVuYW1lID0gYXJndlthcmdfaW5kZXgrK107Ci0KLSAgICAgIGZpbGVzID0gYXJnX2luZGV4IDwgYXJnYyA/IGFyZ3YgKyBhcmdfaW5kZXggOiBOVUxMOwotICAgICAgZmlsZV9jb3VudCA9IGFyZ2MgLSBhcmdfaW5kZXg7Ci0KLSNpZiAwCi0gICAgICAvKiBXZSBkb24ndCB1c2UgZG9fcXVpY2tfYXBwZW5kIGFueSBtb3JlLiAgVG9vIG1hbnkgc3lzdGVtcwotICAgICAgICAgZXhwZWN0IGFyIHRvIGFsd2F5cyByZWJ1aWxkIHRoZSBzeW1ib2wgdGFibGUgZXZlbiB3aGVuIHEgaXMKLSAgICAgICAgIHVzZWQuICAqLwotCi0gICAgICAvKiBXZSBjYW4ndCBkbyBhIHF1aWNrIGFwcGVuZCBpZiB3ZSBuZWVkIHRvIGNvbnN0cnVjdCBhbgotCSBleHRlbmRlZCBuYW1lIHRhYmxlLCBiZWNhdXNlIGRvX3F1aWNrX2FwcGVuZCB3b24ndCBiZSBhYmxlIHRvCi0JIHJlYnVpbGQgdGhlIG5hbWUgdGFibGUuICBVbmZvcnR1bmF0ZWx5LCBhdCB0aGlzIHBvaW50IHdlCi0JIGRvbid0IGFjdHVhbGx5IGtub3cgdGhlIG1heGltdW0gbmFtZSBsZW5ndGggcGVybWl0dGVkIGJ5IHRoaXMKLQkgb2JqZWN0IGZpbGUgZm9ybWF0LiAgU28sIHdlIGd1ZXNzLiAgRklYTUUuICAqLwotICAgICAgaWYgKG9wZXJhdGlvbiA9PSBxdWlja19hcHBlbmQgJiYgISBhcl90cnVuY2F0ZSkKLQl7Ci0JICBjaGFyICoqY2hrOwotCi0JICBmb3IgKGNoayA9IGZpbGVzOyBjaGsgIT0gTlVMTCAmJiAqY2hrICE9ICdcMCc7IGNoaysrKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmxlbiAobm9ybWFsaXplICgqY2hrLCAoYmZkICopIE5VTEwpKSA+IDE0KQotCQl7Ci0JCSAgb3BlcmF0aW9uID0gcmVwbGFjZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAob3BlcmF0aW9uID09IHF1aWNrX2FwcGVuZCkKLQl7Ci0JICAvKiBOb3RlIHRoYXQgcXVpY2sgYXBwZW5kaW5nIHRvIGEgbm9uLWV4aXN0ZW50IGFyY2hpdmUgY3JlYXRlcyBpdCwKLQkgICAgIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGZpbGVzIHRvIGFwcGVuZC4gKi8KLQkgIGRvX3F1aWNrX2FwcGVuZCAoaW5hcmNoX2ZpbGVuYW1lLCBmaWxlcyk7Ci0JICB4ZXhpdCAoMCk7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGFyY2ggPSBvcGVuX2luYXJjaCAoaW5hcmNoX2ZpbGVuYW1lLAotCQkJICBmaWxlcyA9PSBOVUxMID8gKGNoYXIgKikgTlVMTCA6IGZpbGVzWzBdKTsKLQotICAgICAgc3dpdGNoIChvcGVyYXRpb24pCi0JewotCWNhc2UgcHJpbnRfdGFibGU6Ci0JICBtYXBfb3Zlcl9tZW1iZXJzIChhcmNoLCBwcmludF9kZXNjciwgZmlsZXMsIGZpbGVfY291bnQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIHByaW50X2ZpbGVzOgotCSAgbWFwX292ZXJfbWVtYmVycyAoYXJjaCwgcHJpbnRfY29udGVudHMsIGZpbGVzLCBmaWxlX2NvdW50KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBleHRyYWN0OgotCSAgbWFwX292ZXJfbWVtYmVycyAoYXJjaCwgZXh0cmFjdF9maWxlLCBmaWxlcywgZmlsZV9jb3VudCk7Ci0JICBicmVhazsKLQotCWNhc2UgZGVsZXRlOgotCSAgaWYgKGZpbGVzICE9IE5VTEwpCi0JICAgIGRlbGV0ZV9tZW1iZXJzIChhcmNoLCBmaWxlcyk7Ci0JICBlbHNlCi0JICAgIG91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgbW92ZToKLQkgIGlmIChmaWxlcyAhPSBOVUxMKQotCSAgICBtb3ZlX21lbWJlcnMgKGFyY2gsIGZpbGVzKTsKLQkgIGVsc2UKLQkgICAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSByZXBsYWNlOgotCWNhc2UgcXVpY2tfYXBwZW5kOgotCSAgaWYgKGZpbGVzICE9IE5VTEwgfHwgd3JpdGVfYXJtYXAgPiAwKQotCSAgICByZXBsYWNlX21lbWJlcnMgKGFyY2gsIGZpbGVzLCBvcGVyYXRpb24gPT0gcXVpY2tfYXBwZW5kKTsKLQkgIGVsc2UKLQkgICAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JICAvKiBTaG91bGRuJ3QgaGFwcGVuISAqLwotCWRlZmF1bHQ6Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaW50ZXJuYWwgZXJyb3IgLS0gdGhpcyBvcHRpb24gbm90IGltcGxlbWVudGVkXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lKTsKLQkgIHhleGl0ICgxKTsKLQl9Ci0gICAgfQotCi0gIEVORF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lKTsKLQotICB4ZXhpdCAoMCk7Ci0gIHJldHVybiAwOwotfQotCi1iZmQgKgotb3Blbl9pbmFyY2ggKGFyY2hpdmVfZmlsZW5hbWUsIGZpbGUpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2hpdmVfZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIGNvbnN0IGNoYXIgKnRhcmdldDsKLSAgYmZkICoqbGFzdF9vbmU7Ci0gIGJmZCAqbmV4dF9vbmU7Ci0gIHN0cnVjdCBzdGF0IHNidWY7Ci0gIGJmZCAqYXJjaDsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0KLSAgdGFyZ2V0ID0gTlVMTDsKLQotICBpZiAoc3RhdCAoYXJjaGl2ZV9maWxlbmFtZSwgJnNidWYpICE9IDApCi0gICAgewotI2lmbmRlZiBfX0dPMzJfXwotCi0vKiBLTFVER0UgQUxFUlQhIFRlbXBvcmFyeSBmaXggdW50aWwgSSBmaWdnZXIgd2h5Ci0gKiBzdGF0KCkgaXMgd3JvbmcgLi4uIHRoaW5rIGl0J3MgYnVyaWVkIGluIEdPMzIncyBJRFQKLSAqIC0gSmF4Ci0gKi8KLSAgICAgIGlmIChlcnJubyAhPSBFTk9FTlQpCi0JYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKLSNlbmRpZgotCi0gICAgICBpZiAoIW9wZXJhdGlvbl9hbHRlcnNfYXJjaCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLQkgIHBlcnJvciAoYXJjaGl2ZV9maWxlbmFtZSk7Ci0JICBtYXliZXF1aXQgKCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIFRyeSB0byBmaWd1cmUgb3V0IHRoZSB0YXJnZXQgdG8gdXNlIGZvciB0aGUgYXJjaGl2ZSBmcm9tIHRoZQotICAgICAgICAgZmlyc3Qgb2JqZWN0IG9uIHRoZSBsaXN0LiAgKi8KLSAgICAgIGlmIChmaWxlICE9IE5VTEwpCi0JewotCSAgYmZkICpvYmo7Ci0KLQkgIG9iaiA9IGJmZF9vcGVuciAoZmlsZSwgTlVMTCk7Ci0JICBpZiAob2JqICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAob2JqLCBiZmRfb2JqZWN0KSkKLQkJdGFyZ2V0ID0gYmZkX2dldF90YXJnZXQgKG9iaik7Ci0JICAgICAgKHZvaWQpIGJmZF9jbG9zZSAob2JqKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogQ3JlYXRlIGFuIGVtcHR5IGFyY2hpdmUuICAqLwotICAgICAgYXJjaCA9IGJmZF9vcGVudyAoYXJjaGl2ZV9maWxlbmFtZSwgdGFyZ2V0KTsKLSAgICAgIGlmIChhcmNoID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9mb3JtYXQgKGFyY2gsIGJmZF9hcmNoaXZlKQotCSAgfHwgISBiZmRfY2xvc2UgKGFyY2gpKQotCWJmZF9mYXRhbCAoYXJjaGl2ZV9maWxlbmFtZSk7Ci0KLSAgICAgIC8qIElmIHdlIGRpZSBjcmVhdGluZyBhIG5ldyBhcmNoaXZlLCBkb24ndCBsZWF2ZSBpdCBhcm91bmQuICAqLwotICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gYXJjaGl2ZV9maWxlbmFtZTsKLSAgICB9Ci0KLSAgYXJjaCA9IGJmZF9vcGVuciAoYXJjaGl2ZV9maWxlbmFtZSwgdGFyZ2V0KTsKLSAgaWYgKGFyY2ggPT0gTlVMTCkKLSAgICB7Ci0gICAgYmxvc2VyOgotICAgICAgYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhcmNoLCBiZmRfYXJjaGl2ZSwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIGxhc3Rfb25lID0gJihhcmNoLT5uZXh0KTsKLSAgLyogUmVhZCBhbGwgdGhlIGNvbnRlbnRzIHJpZ2h0IGF3YXksIHJlZ2FyZGxlc3MuICAqLwotICBmb3IgKG5leHRfb25lID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaCwgTlVMTCk7Ci0gICAgICAgbmV4dF9vbmU7Ci0gICAgICAgbmV4dF9vbmUgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBuZXh0X29uZSkpCi0gICAgewotICAgICAgUFJPR1JFU1MgKDEpOwotICAgICAgKmxhc3Rfb25lID0gbmV4dF9vbmU7Ci0gICAgICBsYXN0X29uZSA9ICZuZXh0X29uZS0+bmV4dDsKLSAgICB9Ci0gICpsYXN0X29uZSA9IChiZmQgKikgTlVMTDsKLSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpCi0gICAgZ290byBibG9zZXI7Ci0gIHJldHVybiBhcmNoOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IG5jb3BpZWQgPSAwOwotICBjaGFyICpjYnVmID0geG1hbGxvYyAoQlVGU0laRSk7Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgbG9uZyBzaXplOwotICBpZiAoYmZkX3N0YXRfYXJjaF9lbHQgKGFiZmQsICZidWYpICE9IDApCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiaW50ZXJuYWwgc3RhdCBlcnJvciBvbiAlcyIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgcHJpbnRmICgiXG48JXM+XG5cbiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpOwotCi0gIHNpemUgPSBidWYuc3Rfc2l6ZTsKLSAgd2hpbGUgKG5jb3BpZWQgPCBzaXplKQotICAgIHsKLQotICAgICAgaW50IG5yZWFkOwotICAgICAgaW50IHRvY29weSA9IHNpemUgLSBuY29waWVkOwotICAgICAgaWYgKHRvY29weSA+IEJVRlNJWkUpCi0JdG9jb3B5ID0gQlVGU0laRTsKLQotICAgICAgbnJlYWQgPSBiZmRfcmVhZCAoY2J1ZiwgMSwgdG9jb3B5LCBhYmZkKTsJLyogb29wcyAtLSBicm9rZQotCQkJCQkJCSAgIGFic3RyYWN0aW9uISAgKi8KLSAgICAgIGlmIChucmVhZCAhPSB0b2NvcHkpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlmYXRhbCAoXygiJXMgaXMgbm90IGEgdmFsaWQgYXJjaGl2ZSIpLAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpKTsKLSAgICAgIGZ3cml0ZSAoY2J1ZiwgMSwgbnJlYWQsIHN0ZG91dCk7Ci0gICAgICBuY29waWVkICs9IHRvY29weTsKLSAgICB9Ci0gIGZyZWUgKGNidWYpOwotfQotCi0vKiBFeHRyYWN0IGEgbWVtYmVyIG9mIHRoZSBhcmNoaXZlIGludG8gaXRzIG93biBmaWxlLgotCi0gICBXZSBkZWZlciBvcGVuaW5nIHRoZSBuZXcgZmlsZSB1bnRpbCBhZnRlciB3ZSBoYXZlIHJlYWQgYSBCVUZTSVogY2h1bmsgb2YgdGhlCi0gICBvbGQgb25lLCBzaW5jZSB3ZSBrbm93IHdlIGhhdmUganVzdCByZWFkIHRoZSBhcmNoaXZlIGhlYWRlciBmb3IgdGhlIG9sZAotICAgb25lLiAgU2luY2UgbW9zdCBtZW1iZXJzIGFyZSBzaG9ydGVyIHRoYW4gQlVGU0laLCB0aGlzIG1lYW5zIHdlIHdpbGwgcmVhZAotICAgdGhlIG9sZCBoZWFkZXIsIHJlYWQgdGhlIG9sZCBkYXRhLCB3cml0ZSBhIG5ldyBpbm9kZSBmb3IgdGhlIG5ldyBmaWxlLCBhbmQKLSAgIHdyaXRlIHRoZSBuZXcgZGF0YSwgYW5kIGJlIGRvbmUuIFRoaXMgJ29wdGltaXphdGlvbicgaXMgd2hhdCBjb21lcyBmcm9tCi0gICBzaXR0aW5nIG5leHQgdG8gYSBiYXJlIGRpc2sgYW5kIGhlYXJpbmcgaXQgZXZlcnkgdGltZSBpdCBzZWVrcy4gIC0tIEdudQotICAgR2lsbW9yZSAgKi8KLQotdm9pZAotZXh0cmFjdF9maWxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEZJTEUgKm9zdHJlYW07Ci0gIGNoYXIgKmNidWYgPSB4bWFsbG9jIChCVUZTSVpFKTsKLSAgaW50IG5yZWFkLCB0b2NvcHk7Ci0gIGxvbmcgbmNvcGllZCA9IDA7Ci0gIGxvbmcgc2l6ZTsKLSAgc3RydWN0IHN0YXQgYnVmOwotICAKLSAgaWYgKGJmZF9zdGF0X2FyY2hfZWx0IChhYmZkLCAmYnVmKSAhPSAwKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oImludGVybmFsIHN0YXQgZXJyb3Igb24gJXMiKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICBzaXplID0gYnVmLnN0X3NpemU7Ci0KLSAgaWYgKHNpemUgPCAwKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oInN0YXQgcmV0dXJucyBuZWdhdGl2ZSBzaXplIGZvciAlcyIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gIAotICBpZiAodmVyYm9zZSkKLSAgICBwcmludGYgKCJ4IC0gJXNcbiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpOwotCi0gIG9zdHJlYW0gPSBOVUxMOwotICBpZiAoc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFNlZW1zIGxpa2UgYW4gYWJzdHJhY3Rpb24gdmlvbGF0aW9uLCBlaD8gIFdlbGwgaXQncyBPSyEgKi8KLSAgICAgIG91dHB1dF9maWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotCi0gICAgICBvc3RyZWFtID0gZm9wZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBGT1BFTl9XQik7Ci0gICAgICBpZiAob3N0cmVhbSA9PSBOVUxMKQotCXsKLQkgIHBlcnJvciAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgeGV4aXQgKDEpOwotCX0KLQotICAgICAgb3V0cHV0X2ZpbGUgPSBvc3RyZWFtOwotICAgIH0KLSAgZWxzZQotICAgIHdoaWxlIChuY29waWVkIDwgc2l6ZSkKLSAgICAgIHsKLQl0b2NvcHkgPSBzaXplIC0gbmNvcGllZDsKLQlpZiAodG9jb3B5ID4gQlVGU0laRSkKLQkgIHRvY29weSA9IEJVRlNJWkU7Ci0KLQlucmVhZCA9IGJmZF9yZWFkIChjYnVmLCAxLCB0b2NvcHksIGFiZmQpOwotCWlmIChucmVhZCAhPSB0b2NvcHkpCi0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZmF0YWwgKF8oIiVzIGlzIG5vdCBhIHZhbGlkIGFyY2hpdmUiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChhYmZkKSkpOwotCi0JLyogU2VlIGNvbW1lbnQgYWJvdmU7IHRoaXMgc2F2ZXMgZGlzayBhcm0gbW90aW9uICovCi0JaWYgKG9zdHJlYW0gPT0gTlVMTCkKLQkgIHsKLQkgICAgLyogU2VlbXMgbGlrZSBhbiBhYnN0cmFjdGlvbiB2aW9sYXRpb24sIGVoPyAgV2VsbCBpdCdzIE9LISAqLwotCSAgICBvdXRwdXRfZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLQotCSAgICBvc3RyZWFtID0gZm9wZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBGT1BFTl9XQik7Ci0JICAgIGlmIChvc3RyZWFtID09IE5VTEwpCi0JICAgICAgewotCQlwZXJyb3IgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkJeGV4aXQgKDEpOwotCSAgICAgIH0KLQotCSAgICBvdXRwdXRfZmlsZSA9IG9zdHJlYW07Ci0JICB9Ci0JZndyaXRlIChjYnVmLCAxLCBucmVhZCwgb3N0cmVhbSk7Ci0JbmNvcGllZCArPSB0b2NvcHk7Ci0gICAgICB9Ci0KLSAgaWYgKG9zdHJlYW0gIT0gTlVMTCkKLSAgICBmY2xvc2UgKG9zdHJlYW0pOwotCi0gIG91dHB1dF9maWxlID0gTlVMTDsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLQotICBjaG1vZCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGJ1Zi5zdF9tb2RlKTsKLQotICBpZiAocHJlc2VydmVfZGF0ZXMpCi0gICAgc2V0X3RpbWVzIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgJmJ1Zik7Ci0KLSAgZnJlZSAoY2J1Zik7Ci19Ci0KLSNpZiAwCi0KLS8qIFdlIGRvbid0IHVzZSB0aGlzIGFueW1vcmUuICBUb28gbWFueSBzeXN0ZW1zIGV4cGVjdCBhciB0byByZWJ1aWxkCi0gICB0aGUgc3ltYm9sIHRhYmxlIGV2ZW4gd2hlbiBxIGlzIHVzZWQuICAqLwotCi0vKiBKdXN0IGRvIGl0IHF1aWNrbHk7IGRvbid0IHdvcnJ5IGFib3V0IGR1cHMsIGFybWFwLCBvciBhbnl0aGluZyBsaWtlIHRoYXQgKi8KLQotc3RhdGljIHZvaWQKLWRvX3F1aWNrX2FwcGVuZCAoYXJjaGl2ZV9maWxlbmFtZSwgZmlsZXNfdG9fYXBwZW5kKQotICAgICBjb25zdCBjaGFyICphcmNoaXZlX2ZpbGVuYW1lOwotICAgICBjaGFyICoqZmlsZXNfdG9fYXBwZW5kOwotewotICBGSUxFICpvZmlsZSwgKmlmaWxlOwotICBjaGFyICpidWYgPSB4bWFsbG9jIChCVUZTSVpFKTsKLSAgbG9uZyB0b2NvcHksIHRoaXN0aW1lOwotICBiZmQgKnRlbXA7Ci0gIHN0cnVjdCBzdGF0IHNidWY7Ci0gIGJvb2xlYW4gbmV3ZmlsZSA9IGZhbHNlOwotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOwotCi0gIGlmIChzdGF0IChhcmNoaXZlX2ZpbGVuYW1lLCAmc2J1ZikgIT0gMCkKLSAgICB7Ci0KLSNpZm5kZWYgX19HTzMyX18KLQotLyogS0xVREdFIEFMRVJUISBUZW1wb3JhcnkgZml4IHVudGlsIEkgZmlnZ2VyIHdoeQotICogc3RhdCgpIGlzIHdyb25nIC4uLiB0aGluayBpdCdzIGJ1cmllZCBpbiBHTzMyJ3MgSURUCi0gKiAtIEpheAotICovCi0KLSAgICAgIGlmIChlcnJubyAhPSBFTk9FTlQpCi0JYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKLSNlbmRpZgotCi0gICAgICBuZXdmaWxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgb2ZpbGUgPSBmb3BlbiAoYXJjaGl2ZV9maWxlbmFtZSwgRk9QRU5fQVVCKTsKLSAgaWYgKG9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgcGVycm9yIChwcm9ncmFtX25hbWUpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICB0ZW1wID0gYmZkX29wZW5yIChhcmNoaXZlX2ZpbGVuYW1lLCBOVUxMKTsKLSAgaWYgKHRlbXAgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotICAgIH0KLSAgaWYgKG5ld2ZpbGUgPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKHRlbXAsIGJmZF9hcmNoaXZlKSAhPSB0cnVlKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JZmF0YWwgKF8oIiVzIGlzIG5vdCBhbiBhcmNoaXZlIiksIGFyY2hpdmVfZmlsZW5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZ3cml0ZSAoQVJNQUcsIDEsIFNBUk1BRywgb2ZpbGUpOwotICAgICAgaWYgKCFzaWxlbnRfY3JlYXRlKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY3JlYXRpbmcgJXNcbiIpLAotCQkgcHJvZ3JhbV9uYW1lLCBhcmNoaXZlX2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGFyX3RydW5jYXRlKQotICAgIHRlbXAtPmZsYWdzIHw9IEJGRF9UUkFESVRJT05BTF9GT1JNQVQ7Ci0KLSAgLyogYXNzdW1lIGl0J3MgYW4gYWNoaXZlLCBnbyBzdHJhaWdodCB0byB0aGUgZW5kLCBzYW5zICQyMDAgKi8KLSAgZnNlZWsgKG9maWxlLCAwLCAyKTsKLQotICBmb3IgKDsgZmlsZXNfdG9fYXBwZW5kICYmICpmaWxlc190b19hcHBlbmQ7ICsrZmlsZXNfdG9fYXBwZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlICh0ZW1wLCAqZmlsZXNfdG9fYXBwZW5kKTsKLSAgICAgIGlmIChoZHIgPT0gTlVMTCkKLQl7Ci0JICBiZmRfZmF0YWwgKCpmaWxlc190b19hcHBlbmQpOwotCX0KLQotICAgICAgQkZEX1NFTkQgKHRlbXAsIF9iZmRfdHJ1bmNhdGVfYXJuYW1lLCAodGVtcCwgKmZpbGVzX3RvX2FwcGVuZCwgKGNoYXIgKikgaGRyKSk7Ci0KLSAgICAgIGlmaWxlID0gZm9wZW4gKCpmaWxlc190b19hcHBlbmQsIEZPUEVOX1JCKTsKLSAgICAgIGlmIChpZmlsZSA9PSBOVUxMKQotCXsKLQkgIGJmZF9ub25mYXRhbCAoKmZpbGVzX3RvX2FwcGVuZCk7Ci0JfQotCi0gICAgICBpZiAoc3RhdCAoKmZpbGVzX3RvX2FwcGVuZCwgJnNidWYpICE9IDApCi0JewotCSAgYmZkX25vbmZhdGFsICgqZmlsZXNfdG9fYXBwZW5kKTsKLQl9Ci0KLSAgICAgIHRvY29weSA9IHNidWYuc3Rfc2l6ZTsKLQotICAgICAgLyogWFhYIHNob3VsZCBkbyBlcnJvci1jaGVja2luZyEgKi8KLSAgICAgIGZ3cml0ZSAoaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBvZmlsZSk7Ci0KLSAgICAgIHdoaWxlICh0b2NvcHkgPiAwKQotCXsKLQkgIHRoaXN0aW1lID0gdG9jb3B5OwotCSAgaWYgKHRoaXN0aW1lID4gQlVGU0laRSkKLQkgICAgdGhpc3RpbWUgPSBCVUZTSVpFOwotCSAgZnJlYWQgKGJ1ZiwgMSwgdGhpc3RpbWUsIGlmaWxlKTsKLQkgIGZ3cml0ZSAoYnVmLCAxLCB0aGlzdGltZSwgb2ZpbGUpOwotCSAgdG9jb3B5IC09IHRoaXN0aW1lOwotCX0KLSAgICAgIGZjbG9zZSAoaWZpbGUpOwotICAgICAgaWYgKChzYnVmLnN0X3NpemUgJSAyKSA9PSAxKQotCXB1dGMgKCdcMDEyJywgb2ZpbGUpOwotICAgIH0KLSAgZmNsb3NlIChvZmlsZSk7Ci0gIGJmZF9jbG9zZSAodGVtcCk7Ci0gIGZyZWUgKGJ1Zik7Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9hcmNoaXZlIChpYXJjaCkKLSAgICAgYmZkICppYXJjaDsKLXsKLSAgYmZkICpvYmZkOwotICBjaGFyICpvbGRfbmFtZSwgKm5ld19uYW1lOwotICBiZmQgKmNvbnRlbnRzX2hlYWQgPSBpYXJjaC0+bmV4dDsKLQotICBvbGRfbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoaWFyY2gpKSArIDEpOwotICBzdHJjcHkgKG9sZF9uYW1lLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYXJjaCkpOwotICBuZXdfbmFtZSA9IG1ha2VfdGVtcG5hbWUgKG9sZF9uYW1lKTsKLQotICBvdXRwdXRfZmlsZW5hbWUgPSBuZXdfbmFtZTsKLQotICBvYmZkID0gYmZkX29wZW53IChuZXdfbmFtZSwgYmZkX2dldF90YXJnZXQgKGlhcmNoKSk7Ci0KLSAgaWYgKG9iZmQgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKG9sZF9uYW1lKTsKLQotICBvdXRwdXRfYmZkID0gb2JmZDsKLQotICBiZmRfc2V0X2Zvcm1hdCAob2JmZCwgYmZkX2FyY2hpdmUpOwotCi0gIC8qIFJlcXVlc3Qgd3JpdGluZyB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgdW5sZXNzIHdlJ3ZlCi0gICAgIGJlZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgbm90IHRvLiAgKi8KLSAgb2JmZC0+aGFzX2FybWFwID0gd3JpdGVfYXJtYXAgPj0gMDsKLQotICBpZiAoYXJfdHJ1bmNhdGUpCi0gICAgewotICAgICAgLyogVGhpcyBzaG91bGQgcmVhbGx5IHVzZSBiZmRfc2V0X2ZpbGVfZmxhZ3MsIGJ1dCB0aGF0IHJlamVjdHMKLSAgICAgICAgIGFyY2hpdmVzLiAgKi8KLSAgICAgIG9iZmQtPmZsYWdzIHw9IEJGRF9UUkFESVRJT05BTF9GT1JNQVQ7Ci0gICAgfQotCi0gIGlmIChiZmRfc2V0X2FyY2hpdmVfaGVhZCAob2JmZCwgY29udGVudHNfaGVhZCkgIT0gdHJ1ZSkKLSAgICBiZmRfZmF0YWwgKG9sZF9uYW1lKTsKLQotICBpZiAoIWJmZF9jbG9zZSAob2JmZCkpCi0gICAgYmZkX2ZhdGFsIChvbGRfbmFtZSk7Ci0KLSAgb3V0cHV0X2JmZCA9IE5VTEw7Ci0gIG91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci0KLSAgLyogV2UgZG9uJ3QgY2FyZSBpZiB0aGlzIGZhaWxzOyB3ZSBtaWdodCBiZSBjcmVhdGluZyB0aGUgYXJjaGl2ZS4gICovCi0gIGJmZF9jbG9zZSAoaWFyY2gpOwotCi0gIGlmIChzbWFydF9yZW5hbWUgKG5ld19uYW1lLCBvbGRfbmFtZSwgMCkgIT0gMCkKLSAgICB4ZXhpdCAoMSk7Ci19Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGVudHJ5IHdoaWNoIHNob3VsZCBiZSBycGxhY2QnZAotICAgaW50byB3aGVuIGFsdGVyaW5nLiAgREVGQVVMVF9QT1Mgc2hvdWxkIGJlIGhvdyB0byBpbnRlcnByZXQgcG9zX2RlZmF1bHQsCi0gICBhbmQgc2hvdWxkIGJlIGEgcG9zIHZhbHVlLiAgKi8KLQotc3RhdGljIGJmZCAqKgotZ2V0X3Bvc19iZmQgKGNvbnRlbnRzLCBkZWZhdWx0X3BvcywgZGVmYXVsdF9wb3NuYW1lKQotICAgICBiZmQgKipjb250ZW50czsKLSAgICAgZW51bSBwb3MgZGVmYXVsdF9wb3M7Ci0gICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfcG9zbmFtZTsKLXsKLSAgYmZkICoqYWZ0ZXJfYmZkID0gY29udGVudHM7Ci0gIGVudW0gcG9zIHJlYWxwb3M7Ci0gIGNvbnN0IGNoYXIgKnJlYWxwb3NuYW1lOwotCi0gIGlmIChwb3N0eXBlID09IHBvc19kZWZhdWx0KQotICAgIHsKLSAgICAgIHJlYWxwb3MgPSBkZWZhdWx0X3BvczsKLSAgICAgIHJlYWxwb3NuYW1lID0gZGVmYXVsdF9wb3NuYW1lOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlYWxwb3MgPSBwb3N0eXBlOwotICAgICAgcmVhbHBvc25hbWUgPSBwb3NuYW1lOwotICAgIH0KLQotICBpZiAocmVhbHBvcyA9PSBwb3NfZW5kKQotICAgIHsKLSAgICAgIHdoaWxlICgqYWZ0ZXJfYmZkKQotCWFmdGVyX2JmZCA9ICYoKCphZnRlcl9iZmQpLT5uZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKDsgKmFmdGVyX2JmZDsgYWZ0ZXJfYmZkID0gJigqYWZ0ZXJfYmZkKS0+bmV4dCkKLQlpZiAoc3RyY21wICgoKmFmdGVyX2JmZCktPmZpbGVuYW1lLCByZWFscG9zbmFtZSkgPT0gMCkKLQkgIHsKLQkgICAgaWYgKHJlYWxwb3MgPT0gcG9zX2FmdGVyKQotCSAgICAgIGFmdGVyX2JmZCA9ICYoKmFmdGVyX2JmZCktPm5leHQ7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgIH0KLSAgcmV0dXJuIGFmdGVyX2JmZDsKLX0KLQotc3RhdGljIHZvaWQKLWRlbGV0ZV9tZW1iZXJzIChhcmNoLCBmaWxlc190b19kZWxldGUpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgY2hhciAqKmZpbGVzX3RvX2RlbGV0ZTsKLXsKLSAgYmZkICoqY3VycmVudF9wdHJfcHRyOwotICBib29sZWFuIGZvdW5kOwotICBib29sZWFuIHNvbWV0aGluZ19jaGFuZ2VkID0gZmFsc2U7Ci0gIGludCBtYXRjaF9jb3VudDsKLQotICBmb3IgKDsgKmZpbGVzX3RvX2RlbGV0ZSAhPSBOVUxMOyArK2ZpbGVzX3RvX2RlbGV0ZSkKLSAgICB7Ci0gICAgICAvKiBJbiBhLm91dCBzeXN0ZW1zLCB0aGUgYXJtYXAgaXMgb3B0aW9uYWwuICBJdCdzIGFsc28gY2FsbGVkCi0JIF9fLlNZTURFRi4gIFNvIGlmIHRoZSB1c2VyIGFza2VkIHRvIGRlbGV0ZSBpdCwgd2Ugc2hvdWxkIHJlbWVtYmVyCi0JIHRoYXQgZmFjdC4gVGhpcyBpc24ndCBxdWl0ZSByaWdodCBmb3IgQ09GRiBzeXN0ZW1zICh3aGVyZQotCSBfXy5TWU1ERUYgbWlnaHQgYmUgcmVndWxhciBtZW1iZXIpLCBidXQgaXQncyB2ZXJ5IHVubGlrZWx5Ci0JIHRvIGJlIGEgcHJvYmxlbS4gIEZJWE1FICovCi0KLSAgICAgIGlmICghc3RyY21wICgqZmlsZXNfdG9fZGVsZXRlLCAiX18uU1lNREVGIikpCi0JewotCSAgYXJjaC0+aGFzX2FybWFwID0gZmFsc2U7Ci0JICB3cml0ZV9hcm1hcCA9IC0xOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBmb3VuZCA9IGZhbHNlOwotICAgICAgbWF0Y2hfY291bnQgPSAwOwotICAgICAgY3VycmVudF9wdHJfcHRyID0gJihhcmNoLT5uZXh0KTsKLSAgICAgIHdoaWxlICgqY3VycmVudF9wdHJfcHRyKQotCXsKLQkgIGlmIChzdHJjbXAgKG5vcm1hbGl6ZSAoKmZpbGVzX3RvX2RlbGV0ZSwgYXJjaCksCi0JCSAgICAgICgqY3VycmVudF9wdHJfcHRyKS0+ZmlsZW5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICArK21hdGNoX2NvdW50OwotCSAgICAgIGlmIChjb3VudGVkX25hbWVfbW9kZQotCQkgICYmIG1hdGNoX2NvdW50ICE9IGNvdW50ZWRfbmFtZV9jb3VudGVyKSAKLQkJewotCQkgIC8qIENvdW50aW5nLCBhbmQgZGlkbid0IG1hdGNoIG9uIGNvdW50OyBnbyBvbiB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgIG5leHQgb25lLiAgKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZvdW5kID0gdHJ1ZTsKLQkJICBzb21ldGhpbmdfY2hhbmdlZCA9IHRydWU7Ci0JCSAgaWYgKHZlcmJvc2UpCi0JCSAgICBwcmludGYgKCJkIC0gJXNcbiIsCi0JCQkgICAgKmZpbGVzX3RvX2RlbGV0ZSk7Ci0JCSAgKmN1cnJlbnRfcHRyX3B0ciA9ICgoKmN1cnJlbnRfcHRyX3B0ciktPm5leHQpOwotCQkgIGdvdG8gbmV4dF9maWxlOwotCQl9Ci0JICAgIH0KLQotCSAgY3VycmVudF9wdHJfcHRyID0gJigoKmN1cnJlbnRfcHRyX3B0ciktPm5leHQpOwotCX0KLQotICAgICAgaWYgKHZlcmJvc2UgJiYgZm91bmQgPT0gZmFsc2UpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIHByaW50ZiAoXygiTm8gbWVtYmVyIG5hbWVkIGAlcydcbiIpLCAqZmlsZXNfdG9fZGVsZXRlKTsKLQl9Ci0gICAgbmV4dF9maWxlOgotICAgICAgOwotICAgIH0KLQotICBpZiAoc29tZXRoaW5nX2NoYW5nZWQgPT0gdHJ1ZSkKLSAgICB3cml0ZV9hcmNoaXZlIChhcmNoKTsKLSAgZWxzZQotICAgIG91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci19Ci0KLQotLyogUmVwb3NpdGlvbiBleGlzdGluZyBtZW1iZXJzIHdpdGhpbiBhbiBhcmNoaXZlICovCi0KLXN0YXRpYyB2b2lkCi1tb3ZlX21lbWJlcnMgKGFyY2gsIGZpbGVzX3RvX21vdmUpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgY2hhciAqKmZpbGVzX3RvX21vdmU7Ci17Ci0gIGJmZCAqKmFmdGVyX2JmZDsJCS8qIE5ldyBlbnRyaWVzIGdvIGFmdGVyIHRoaXMgb25lICovCi0gIGJmZCAqKmN1cnJlbnRfcHRyX3B0cjsJLyogY2RyIHBvaW50ZXIgaW50byBjb250ZW50cyAqLwotCi0gIGZvciAoOyAqZmlsZXNfdG9fbW92ZTsgKytmaWxlc190b19tb3ZlKQotICAgIHsKLSAgICAgIGN1cnJlbnRfcHRyX3B0ciA9ICYoYXJjaC0+bmV4dCk7Ci0gICAgICB3aGlsZSAoKmN1cnJlbnRfcHRyX3B0cikKLQl7Ci0JICBiZmQgKmN1cnJlbnRfcHRyID0gKmN1cnJlbnRfcHRyX3B0cjsKLQkgIGlmIChzdHJjbXAgKG5vcm1hbGl6ZSAoKmZpbGVzX3RvX21vdmUsIGFyY2gpLAotCQkgICAgICBjdXJyZW50X3B0ci0+ZmlsZW5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBNb3ZlIHRoaXMgZmlsZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IC0gZmlyc3QgY3V0IGZyb20KLQkJIHdoZXJlIGl0IGlzLiAgKi8KLQkgICAgICBiZmQgKmxpbms7Ci0JICAgICAgKmN1cnJlbnRfcHRyX3B0ciA9IGN1cnJlbnRfcHRyLT5uZXh0OwotCi0JICAgICAgLyogTm93IGdsdWUgdG8gZW5kICovCi0JICAgICAgYWZ0ZXJfYmZkID0gZ2V0X3Bvc19iZmQgKCZhcmNoLT5uZXh0LCBwb3NfZW5kLCBOVUxMKTsKLQkgICAgICBsaW5rID0gKmFmdGVyX2JmZDsKLQkgICAgICAqYWZ0ZXJfYmZkID0gY3VycmVudF9wdHI7Ci0JICAgICAgY3VycmVudF9wdHItPm5leHQgPSBsaW5rOwotCi0JICAgICAgaWYgKHZlcmJvc2UpCi0JCXByaW50ZiAoIm0gLSAlc1xuIiwgKmZpbGVzX3RvX21vdmUpOwotCi0JICAgICAgZ290byBuZXh0X2ZpbGU7Ci0JICAgIH0KLQotCSAgY3VycmVudF9wdHJfcHRyID0gJigoKmN1cnJlbnRfcHRyX3B0ciktPm5leHQpOwotCX0KLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBlbnRyeSAlcyBpbiBhcmNoaXZlICVzIVxuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwgKmZpbGVzX3RvX21vdmUsIGFyY2gtPmZpbGVuYW1lKTsKLSAgICAgIHhleGl0ICgxKTsKLSAgICBuZXh0X2ZpbGU6OwotICAgIH0KLQotICB3cml0ZV9hcmNoaXZlIChhcmNoKTsKLX0KLQotLyogT3VnaHQgdG8gZGVmYXVsdCB0byByZXBsYWNpbmcgaW4gcGxhY2UsIGJ1dCB0aGlzIGlzIGV4aXN0aW5nIHByYWN0aWNlISAgKi8KLQotc3RhdGljIHZvaWQKLXJlcGxhY2VfbWVtYmVycyAoYXJjaCwgZmlsZXNfdG9fbW92ZSwgcXVpY2spCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgY2hhciAqKmZpbGVzX3RvX21vdmU7Ci0gICAgIGJvb2xlYW4gcXVpY2s7Ci17Ci0gIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICBiZmQgKiphZnRlcl9iZmQ7CQkvKiBOZXcgZW50cmllcyBnbyBhZnRlciB0aGlzIG9uZSAqLwotICBiZmQgKmN1cnJlbnQ7Ci0gIGJmZCAqKmN1cnJlbnRfcHRyOwotICBiZmQgKnRlbXA7Ci0KLSAgd2hpbGUgKGZpbGVzX3RvX21vdmUgJiYgKmZpbGVzX3RvX21vdmUpCi0gICAgewotICAgICAgaWYgKCEgcXVpY2spCi0JewotCSAgY3VycmVudF9wdHIgPSAmYXJjaC0+bmV4dDsKLQkgIHdoaWxlICgqY3VycmVudF9wdHIpCi0JICAgIHsKLQkgICAgICBjdXJyZW50ID0gKmN1cnJlbnRfcHRyOwotCi0JICAgICAgLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBhciBwcm9ncmFtcywgd2UKLQkJIHBlcm1pdCB0aGUgc2FtZSBmaWxlIHRvIGJlIGFkZGVkIG11bHRpcGxlIHRpbWVzLiAgKi8KLQkgICAgICBpZiAoc3RyY21wIChub3JtYWxpemUgKCpmaWxlc190b19tb3ZlLCBhcmNoKSwKLQkJCSAgbm9ybWFsaXplIChjdXJyZW50LT5maWxlbmFtZSwgYXJjaCkpID09IDAKLQkJICAmJiBjdXJyZW50LT5hcmVsdF9kYXRhICE9IE5VTEwpCi0JCXsKLQkJICBpZiAobmV3ZXJfb25seSkKLQkJICAgIHsKLQkJICAgICAgc3RydWN0IHN0YXQgZnNidWYsIGFzYnVmOwotCi0JCSAgICAgIGlmIChzdGF0ICgqZmlsZXNfdG9fbW92ZSwgJmZzYnVmKSAhPSAwKQotCQkJewotCQkJICBpZiAoZXJybm8gIT0gRU5PRU5UKQotCQkJICAgIGJmZF9mYXRhbCAoKmZpbGVzX3RvX21vdmUpOwotCQkJICBnb3RvIG5leHRfZmlsZTsKLQkJCX0KLQkJICAgICAgaWYgKGJmZF9zdGF0X2FyY2hfZWx0IChjdXJyZW50LCAmYXNidWYpICE9IDApCi0JCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJZmF0YWwgKF8oImludGVybmFsIHN0YXQgZXJyb3Igb24gJXMiKSwgY3VycmVudC0+ZmlsZW5hbWUpOwotCi0JCSAgICAgIGlmIChmc2J1Zi5zdF9tdGltZSA8PSBhc2J1Zi5zdF9tdGltZSkKLQkJCWdvdG8gbmV4dF9maWxlOwotCQkgICAgfQotCi0JCSAgYWZ0ZXJfYmZkID0gZ2V0X3Bvc19iZmQgKCZhcmNoLT5uZXh0LCBwb3NfYWZ0ZXIsCi0JCQkJCSAgIGN1cnJlbnQtPmZpbGVuYW1lKTsKLQkJICB0ZW1wID0gKmFmdGVyX2JmZDsKLQotCQkgICphZnRlcl9iZmQgPSBiZmRfb3BlbnIgKCpmaWxlc190b19tb3ZlLCBOVUxMKTsKLQkJICBpZiAoKmFmdGVyX2JmZCA9PSAoYmZkICopIE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9mYXRhbCAoKmZpbGVzX3RvX21vdmUpOwotCQkgICAgfQotCQkgICgqYWZ0ZXJfYmZkKS0+bmV4dCA9IHRlbXA7Ci0KLQkJICAvKiBzbmlwIG91dCB0aGlzIGVudHJ5IGZyb20gdGhlIGNoYWluICovCi0JCSAgKmN1cnJlbnRfcHRyID0gKCpjdXJyZW50X3B0ciktPm5leHQ7Ci0KLQkJICBpZiAodmVyYm9zZSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiciAtICVzXG4iLCAqZmlsZXNfdG9fbW92ZSk7Ci0JCSAgICB9Ci0KLQkJICBjaGFuZ2VkID0gdHJ1ZTsKLQotCQkgIGdvdG8gbmV4dF9maWxlOwotCQl9Ci0JICAgICAgY3VycmVudF9wdHIgPSAmKGN1cnJlbnQtPm5leHQpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBZGQgdG8gdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4gICovCi0KLSAgICAgIGFmdGVyX2JmZCA9IGdldF9wb3NfYmZkICgmYXJjaC0+bmV4dCwgcG9zX2VuZCwgTlVMTCk7Ci0gICAgICB0ZW1wID0gKmFmdGVyX2JmZDsKLSAgICAgICphZnRlcl9iZmQgPSBiZmRfb3BlbnIgKCpmaWxlc190b19tb3ZlLCBOVUxMKTsKLSAgICAgIGlmICgqYWZ0ZXJfYmZkID09IChiZmQgKikgTlVMTCkKLQl7Ci0JICBiZmRfZmF0YWwgKCpmaWxlc190b19tb3ZlKTsKLQl9Ci0gICAgICBpZiAodmVyYm9zZSkKLQl7Ci0JICBwcmludGYgKCJhIC0gJXNcbiIsICpmaWxlc190b19tb3ZlKTsKLQl9Ci0KLSAgICAgICgqYWZ0ZXJfYmZkKS0+bmV4dCA9IHRlbXA7Ci0KLSAgICAgIGNoYW5nZWQgPSB0cnVlOwotCi0gICAgbmV4dF9maWxlOjsKLQotICAgICAgZmlsZXNfdG9fbW92ZSsrOwotICAgIH0KLQotICBpZiAoY2hhbmdlZCkKLSAgICB3cml0ZV9hcmNoaXZlIChhcmNoKTsKLSAgZWxzZQotICAgIG91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yYW5saWJfb25seSAoYXJjaG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2huYW1lOwotewotICBiZmQgKmFyY2g7Ci0KLSAgd3JpdGVfYXJtYXAgPSAxOwotICBhcmNoID0gb3Blbl9pbmFyY2ggKGFyY2huYW1lLCAoY2hhciAqKSBOVUxMKTsKLSAgaWYgKGFyY2ggPT0gTlVMTCkKLSAgICB4ZXhpdCAoMSk7Ci0gIHdyaXRlX2FyY2hpdmUgKGFyY2gpOwotfQotCi0vKiBVcGRhdGUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgc3ltYm9sIG1hcCBvZiBhbiBhcmNoaXZlLiAgKi8KLQotc3RhdGljIHZvaWQKLXJhbmxpYl90b3VjaCAoYXJjaG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2huYW1lOwotewotI2lmZGVmIF9fR08zMl9fCi0gIC8qIEkgZG9uJ3QgdGhpbmsgdXBkYXRpbmcgd29ya3Mgb24gZ28zMi4gICovCi0gIHJhbmxpYl9vbmx5IChhcmNobmFtZSk7Ci0jZWxzZQotICBpbnQgZjsKLSAgYmZkICphcmNoOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgZiA9IG9wZW4gKGFyY2huYW1lLCBPX1JEV1IgfCBPX0JJTkFSWSwgMCk7Ci0gIGlmIChmIDwgMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgYmZkX2ZhdGFsIChhcmNobmFtZSk7Ci0gICAgfQotCi0gIGFyY2ggPSBiZmRfZmRvcGVuciAoYXJjaG5hbWUsIChjb25zdCBjaGFyICopIE5VTEwsIGYpOwotICBpZiAoYXJjaCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYXJjaG5hbWUpOwotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFyY2gsIGJmZF9hcmNoaXZlLCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoYXJjaG5hbWUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmICghIGJmZF9oYXNfbWFwIChhcmNoKSkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCIlczogbm8gYXJjaGl2ZSBtYXAgdG8gdXBkYXRlIiksIGFyY2huYW1lKTsKLQotICBiZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCAoYXJjaCk7Ci0KLSAgaWYgKCEgYmZkX2Nsb3NlIChhcmNoKSkKLSAgICBiZmRfZmF0YWwgKGFyY2huYW1lKTsKLSNlbmRpZgotfQotCi0vKiBUaGluZ3Mgd2hpY2ggYXJlIGludGVyZXN0aW5nIHRvIG1hcCBvdmVyIGFsbCBvciBzb21lIG9mIHRoZSBmaWxlczogKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2Rlc2NyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHByaW50X2FyZWx0X2Rlc2NyIChzdGRvdXQsIGFiZmQsIHZlcmJvc2UpOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYXJsZXgubCBiL2JpbnV0aWxzL2FybGV4LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZTEzZDEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYXJsZXgubAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLSV7Ci0vKiBhcmxleC5sIC0gU3RyYW5nZSBzY3JpcHQgbGFuZ3VhZ2UgbGV4ZXIgKi8KLQotLyogICBDb3B5cmlnaHQgKEMpIDE5OTIsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgIAkJICBzYWNAY3lnbnVzLmNvbQotCi0qLwotI2RlZmluZSBET05UREVDTEFSRV9NQUxMT0MKLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImFycGFyc2UuaCIKLQotaW50IGxpbmVudW1iZXI7Ci0lfQotJSUKLQotIkFERExJQiIgICAJeyByZXR1cm4gQURETElCOyB9Ci0iQURETU9EIiAgIAl7IHJldHVybiBBRERNT0Q7IH0KLSJDTEVBUiIgICAJeyByZXR1cm4gQ0xFQVI7IH0KLSJDUkVBVEUiICAgCXsgcmV0dXJuIENSRUFURTsgfQotIkRFTEVURSIgICAJeyByZXR1cm4gREVMRVRFOyB9Ci0iRElSRUNUT1JZIiAgIAl7IHJldHVybiBESVJFQ1RPUlk7IH0KLSJFTkQiICAgCXsgcmV0dXJuIEVORDsgfQotIkVYVFJBQ1QiICAgCXsgcmV0dXJuIEVYVFJBQ1Q7IH0KLSJGVUxMRElSIiAgIAl7IHJldHVybiBGVUxMRElSOyB9Ci0iSEVMUCIgICAJeyByZXR1cm4gSEVMUDsgfQotIkxJU1QiCQl7IHJldHVybiBMSVNUOyB9Ci0iT1BFTiIgICAJeyByZXR1cm4gT1BFTjsgfQotIlJFUExBQ0UiICAgCXsgcmV0dXJuIFJFUExBQ0U7IH0KLSJWRVJCT1NFIiAgIAl7IHJldHVybiBWRVJCT1NFOyB9Ci0iU0FWRSIgICAJeyByZXR1cm4gU0FWRTsgfQotImFkZGxpYiIgICAJeyByZXR1cm4gQURETElCOyB9Ci0iYWRkbW9kIiAgIAl7IHJldHVybiBBRERNT0Q7IH0KLSJjbGVhciIgICAJeyByZXR1cm4gQ0xFQVI7IH0KLSJjcmVhdGUiICAgCXsgcmV0dXJuIENSRUFURTsgfQotImRlbGV0ZSIgICAJeyByZXR1cm4gREVMRVRFOyB9Ci0iZGlyZWN0b3J5IiAgIAl7IHJldHVybiBESVJFQ1RPUlk7IH0KLSJlbmQiICAgCXsgcmV0dXJuIEVORDsgfQotImV4dHJhY3QiICAgCXsgcmV0dXJuIEVYVFJBQ1Q7IH0KLSJmdWxsZGlyIiAgIAl7IHJldHVybiBGVUxMRElSOyB9Ci0iaGVscCIgICAJeyByZXR1cm4gSEVMUDsgfQotImxpc3QiCQl7IHJldHVybiBMSVNUOyB9Ci0ib3BlbiIgICAJeyByZXR1cm4gT1BFTjsgfQotInJlcGxhY2UiICAgCXsgcmV0dXJuIFJFUExBQ0U7IH0KLSJ2ZXJib3NlIiAgIAl7IHJldHVybiBWRVJCT1NFOyB9Ci0ic2F2ZSIgICAJeyByZXR1cm4gU0FWRTsgfQotIitcbiIgICAgICAgICAgIHsgbGluZW51bWJlciArKzsgfQotIigiICAgICAgICAgICAgIHsgcmV0dXJuICcoJzsgfQotIikiICAgICAgICAgICAgIHsgcmV0dXJuICcpJzsgfQotIiwiICAgICAgICAgICAgIHsgcmV0dXJuICcsJzsgfQotW0EtWmEtejAtOS8kOi5cLVxfXSsgIHsgCQotCQl5eWx2YWwubmFtZSA9ICB4c3RyZHVwICh5eXRleHQpOwotCQlyZXR1cm4gRklMRU5BTUU7Ci0JCX0KLSIqIi4qIAkJeyB9Ci0iOyIuKiAJCXsgfQotIiAiCQl7IH0KLSJcbiIJIAkgeyBsaW5lbnVtYmVyICsrOyByZXR1cm4gTkVXTElORTsgfQkKLQotJSUKLSNpZm5kZWYgeXl3cmFwCi0vKiBOZWVkZWQgZm9yIGxleCwgdGhvdWdoIG5vdCBmbGV4LiAqLwotaW50IHl5d3JhcCgpIHsgcmV0dXJuIDE7IH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYXJwYXJzZS55IGIvYmludXRpbHMvYXJwYXJzZS55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWU5MGZhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FycGFyc2UueQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0lewotLyogYXJwYXJzZS55IC0gU3RhbmdlIHNjcmlwdCBsYW5ndWFnZSBwYXJzZXIgKi8KLQotLyogICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NSwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgIAkJICBzYWNAY3lnbnVzLmNvbQotCi0qLwotI2RlZmluZSBET05UREVDTEFSRV9NQUxMT0MKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJhcnN1cC5oIgotZXh0ZXJuIGludCB2ZXJib3NlOwotZXh0ZXJuIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHl5ZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0lfQotCi0ldW5pb24gewotICBjaGFyICpuYW1lOwotc3RydWN0IGxpc3QgKmxpc3QgOwotCi19OwotCi0ldG9rZW4gTkVXTElORQotJXRva2VuIFZFUkJPU0UKLSV0b2tlbiA8bmFtZT4gRklMRU5BTUUKLSV0b2tlbiBBRERMSUIKLSV0b2tlbiBMSVNUCi0ldG9rZW4gQURETU9ECi0ldG9rZW4gQ0xFQVIKLSV0b2tlbiBDUkVBVEUKLSV0b2tlbiBERUxFVEUKLSV0b2tlbiBESVJFQ1RPUlkKLSV0b2tlbiBFTkQKLSV0b2tlbiBFWFRSQUNUCi0ldG9rZW4gRlVMTERJUgotJXRva2VuIEhFTFAKLSV0b2tlbiBRVUlUCi0ldG9rZW4gUkVQTEFDRQotJXRva2VuIFNBVkUKLSV0b2tlbiBPUEVOCi0KLSV0eXBlIDxsaXN0PiBtb2R1bGVsaXN0IAotJXR5cGUgPGxpc3Q+IG1vZHVsZW5hbWUKLSV0eXBlIDxuYW1lPiBvcHRpb25hbF9maWxlbmFtZQotJSUKLQotc3RhcnQ6Ci0JeyBwcm9tcHQoKTsgfSBzZXNzaW9uCi0JOwotCi1zZXNzaW9uOgotCSAgICBzZXNzaW9uIGNvbW1hbmRfbGluZQotCXwKLQk7Ci0KLWNvbW1hbmRfbGluZToKLQkJY29tbWFuZCBORVdMSU5FIHsgcHJvbXB0KCk7IH0KLQotY29tbWFuZDoKLQkJb3Blbl9jb21tYW5kCQotCXwJY3JlYXRlX2NvbW1hbmQJCi0JfCAJdmVyYm9zZV9jb21tYW5kCi0JfAlkaXJlY3RvcnlfY29tbWFuZAotCXwJYWRkbGliX2NvbW1hbmQKLQl8CWNsZWFyX2NvbW1hbmQKLQl8CWFkZG1vZF9jb21tYW5kCi0JfCAJc2F2ZV9jb21tYW5kCi0gICAgICAgIHwgICAgICAgZXh0cmFjdF9jb21tYW5kCi0JfAlyZXBsYWNlX2NvbW1hbmQKLQl8CWRlbGV0ZV9jb21tYW5kCi0JfAlsaXN0X2NvbW1hbmQKLQl8IAlFTkQJIHsgYXJfZW5kKCk7IHJldHVybiAwOyB9Ci0JfCAJZXJyb3IKLQl8ICAgICAgIEZJTEVOQU1FIHsgeXllcnJvcigiZm9vIik7IH0KLQl8Ci0JOwotCi0KLWV4dHJhY3RfY29tbWFuZDoKLSAgICAgICAgICAgICAgICBFWFRSQUNUIG1vZHVsZW5hbWUKLQkJeyBhcl9leHRyYWN0KCQyKTsgfQotCTsKLQotcmVwbGFjZV9jb21tYW5kOgkKLQkJUkVQTEFDRSBtb2R1bGVuYW1lCi0JCXsgYXJfcmVwbGFjZSgkMik7IH0KLQk7Ci0JCi1jbGVhcl9jb21tYW5kOgotCQlDTEVBUgotCQl7IGFyX2NsZWFyKCk7IH0KLQk7Ci0KLWRlbGV0ZV9jb21tYW5kOgotCQlERUxFVEUgbW9kdWxlbmFtZQotCQl7IGFyX2RlbGV0ZSgkMik7IH0KLQk7Ci1hZGRtb2RfY29tbWFuZDoKLQlBRERNT0QgbW9kdWxlbmFtZQotCQl7IGFyX2FkZG1vZCgkMik7IH0KLQk7Ci0KLWxpc3RfY29tbWFuZDoJCi0JCUxJU1QKLQkJeyBhcl9saXN0KCk7IH0KLQk7Ci0KLXNhdmVfY29tbWFuZDoJCi0JCVNBVkUKLQkJeyBhcl9zYXZlKCk7IH0KLQk7Ci0KLQotCi1vcGVuX2NvbW1hbmQ6Ci0JCU9QRU4gRklMRU5BTUUgCi0JCXsgYXJfb3BlbigkMiwwKTsgfQotCTsKLQotY3JlYXRlX2NvbW1hbmQ6Ci0JCUNSRUFURSBGSUxFTkFNRSAKLQkJeyBhcl9vcGVuKCQyLDEpOyB9Ci0JOwotCi0KLWFkZGxpYl9jb21tYW5kOgotCQlBRERMSUIgRklMRU5BTUUgbW9kdWxlbGlzdAotCQl7IGFyX2FkZGxpYigkMiwkMyk7IH0KLQk7Ci1kaXJlY3RvcnlfY29tbWFuZDoKLQkJRElSRUNUT1JZIEZJTEVOQU1FIG1vZHVsZWxpc3Qgb3B0aW9uYWxfZmlsZW5hbWUKLQkJeyBhcl9kaXJlY3RvcnkoJDIsICQzLCAkNCk7IH0KLQk7Ci0KLQotCi1vcHRpb25hbF9maWxlbmFtZToKLQkJRklMRU5BTUUKLQkJeyAkJCA9ICQxOyB9Ci0JfAl7ICQkID0gMDsgfQotCTsKLQotbW9kdWxlbGlzdDoKLQknKCcgbW9kdWxlbmFtZSAnKScgCi0JCXsgJCQgPSAkMjsgfQotCXwKLQkJeyAkJCA9IDA7IH0KLQk7Ci0KLW1vZHVsZW5hbWU6Ci0JCW1vZHVsZW5hbWUgb3B0Y29tbWEgRklMRU5BTUUKLQkJeyAJc3RydWN0IGxpc3QgKm4gID0gKHN0cnVjdCBsaXN0ICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3QpKTsKLQkJCW4tPm5leHQgPSAkMTsgCi0JCQluLT5uYW1lID0gJDM7Ci0JCQkkJCA9IG47Ci0JCSB9Ci0JfAl7ICQkID0gMDsgfQotCTsKLQkKLQotb3B0Y29tbWE6Ci0JCScsJwotCXwKLQk7Ci0JCi0JCQotdmVyYm9zZV9jb21tYW5kOgotCVZFUkJPU0UgCi0JCXsgdmVyYm9zZSA9ICF2ZXJib3NlOyB9Ci0JOwotCi0KLSUlCi0KLXN0YXRpYyBpbnQKLXl5ZXJyb3IgKHgpCi0gICAgIGNvbnN0IGNoYXIgKnggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZXh0ZXJuIGludCBsaW5lbnVtYmVyOwotCi0gIHByaW50ZiAoXygiU3ludGF4IGVycm9yIGluIGFyY2hpdmUgc2NyaXB0LCBsaW5lICVkXG4iKSwgbGluZW51bWJlciArIDEpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2Fyc3VwLmMgYi9iaW51dGlscy9hcnN1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjgwOWZjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2Fyc3VwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotLyogYXJzdXAuYyAtIEFyY2hpdmUgc3VwcG9ydCBmb3IgTVJJIGNvbXBhdGliaWxpdHkKLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbgotICAgCQkgIHNhY0BjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBsb29rcyBhZnRlciByZXF1ZXN0cyBmcm9tIGFycGFyc2UueSwgdG8gcHJvdmlkZSB0aGUgTVJJCi1zdHlsZSBsaWJyYXJpYW4gY29tbWFuZCBzeW50YXggKyAxIHdvcmQgTElTVAotCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYXJzdXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLQotc3RhdGljIHZvaWQgbWFwX292ZXJfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgdm9pZCAoKmZ1bmN0aW9uKSAoYmZkICosIGJmZCAqKSwgc3RydWN0IGxpc3QgKikpOwotc3RhdGljIHZvaWQgYXJfZGlyZWN0b3J5X2RvZXIgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBhcl9hZGRsaWJfZG9lciBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLQotZXh0ZXJuIGludCB2ZXJib3NlOwotCi1zdGF0aWMgdm9pZAotbWFwX292ZXJfbGlzdCAoYXJjaCwgZnVuY3Rpb24sIGxpc3QpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgdm9pZCAoKmZ1bmN0aW9uKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLSAgICAgc3RydWN0IGxpc3QgKmxpc3Q7Ci17Ci0gIGJmZCAqaGVhZDsKLQotICBpZiAobGlzdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZCAqbmV4dDsKLQotICAgICAgaGVhZCA9IGFyY2gtPm5leHQ7Ci0gICAgICB3aGlsZSAoaGVhZCAhPSBOVUxMKQotCXsKLQkgIG5leHQgPSBoZWFkLT5uZXh0OwotCSAgZnVuY3Rpb24gKGhlYWQsIChiZmQgKikgTlVMTCk7Ci0JICBoZWFkID0gbmV4dDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGxpc3QgKnB0cjsKLQotICAgICAgLyogVGhpcyBtYXkgYXBwZWFyIHRvIGJlIGEgYmFyb3F1ZSB3YXkgb2YgYWNjb21wbGlzaGluZyB3aGF0IHdlCi0JIHdhbnQuICBob3dldmVyIHdlIGhhdmUgdG8gaXRlcmF0ZSBvdmVyIHRoZSBmaWxlbmFtZXMgaW4gb3JkZXIKLQkgdG8gbm90aWNlIHdoZXJlIGEgZmlsZW5hbWUgaXMgcmVxdWVzdGVkIGJ1dCBkb2VzIG5vdCBleGlzdCBpbgotCSB0aGUgYXJjaGl2ZS4gIERpdHRvIG1hcHBpbmcgb3ZlciBlYWNoIGZpbGUgZWFjaCB0aW1lIC0tIHdlCi0JIHdhbnQgdG8gaGFjayBtdWx0aXBsZSByZWZlcmVuY2VzLiAgKi8KLSAgICAgIGZvciAocHRyID0gbGlzdDsgcHRyOyBwdHIgPSBwdHItPm5leHQpCi0JewotCSAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCSAgYmZkICpwcmV2ID0gYXJjaDsKLQotCSAgZm9yIChoZWFkID0gYXJjaC0+bmV4dDsgaGVhZDsgaGVhZCA9IGhlYWQtPm5leHQpIAotCSAgICB7Ci0JICAgICAgaWYgKGhlYWQtPmZpbGVuYW1lICE9IE5VTEwKLQkJICAmJiBzdHJjbXAgKHB0ci0+bmFtZSwgaGVhZC0+ZmlsZW5hbWUpID09IDApCi0JCXsKLQkJICBmb3VuZCA9IHRydWU7Ci0JCSAgZnVuY3Rpb24gKGhlYWQsIHByZXYpOwotCQl9Ci0JICAgICAgcHJldiA9IGhlYWQ7Ci0JICAgIH0KLQkgIGlmICghIGZvdW5kKQotCSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIk5vIGVudHJ5ICVzIGluIGFyY2hpdmUuXG4iKSwgcHRyLT5uYW1lKTsKLQl9Ci0gICAgfQotfQotCi0KLUZJTEUgKm91dGZpbGU7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWFyX2RpcmVjdG9yeV9kb2VyIChhYmZkLCBpZ25vcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkICppZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgICBwcmludF9hcmVsdF9kZXNjcihvdXRmaWxlLCBhYmZkLCB2ZXJib3NlKTsKLX0KLQotdm9pZAotYXJfZGlyZWN0b3J5IChhcl9uYW1lLCBsaXN0LCBvdXRwdXQpCi0gICAgIGNoYXIgKmFyX25hbWU7Ci0gICAgIHN0cnVjdCBsaXN0ICpsaXN0OwotICAgICBjaGFyICpvdXRwdXQ7Ci17Ci0gIGJmZCAqYXJjaDsKLQotICBhcmNoID0gb3Blbl9pbmFyY2ggKGFyX25hbWUsIChjaGFyICopIE5VTEwpOwotICBpZiAob3V0cHV0KQotICAgIHsKLSAgICAgIG91dGZpbGUgPSBmb3BlbihvdXRwdXQsInciKTsKLSAgICAgIGlmIChvdXRmaWxlID09IDApCi0JewotCSAgb3V0ZmlsZSA9IHN0ZG91dDsKLQkgIGZwcmludGYgKHN0ZGVycixfKCJDYW4ndCBvcGVuIGZpbGUgJXNcbiIpLCBvdXRwdXQpOwotCSAgb3V0cHV0ID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIAotICAgIG91dGZpbGUgPSBzdGRvdXQ7Ci0KLSAgbWFwX292ZXJfbGlzdCAoYXJjaCwgYXJfZGlyZWN0b3J5X2RvZXIsIGxpc3QpOwotCi0gIGJmZF9jbG9zZSAoYXJjaCk7Ci0KLSAgaWYgKG91dHB1dCkKLSAgIGZjbG9zZSAob3V0ZmlsZSk7Ci19Ci0KLXZvaWQKLURFRlVOX1ZPSUQocHJvbXB0KQotewotICBleHRlcm4gaW50IGludGVyYWN0aXZlOwotICBpZiAoaW50ZXJhY3RpdmUpIAotICB7Ci0gICAgcHJpbnRmKCJBUiA+Iik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7IAotICB9Ci19Ci0KLXZvaWQKLW1heWJlcXVpdCAoKQotewotICBpZiAoISBpbnRlcmFjdGl2ZSkgCi0gICAgeGV4aXQgKDkpOwotfQotCi0KLWJmZCAqb2JmZDsKLWNoYXIgKnJlYWxfbmFtZSA7IAotdm9pZAotREVGVU4oYXJfb3BlbiwobmFtZSwgdCksCi0gICAgICBjaGFyICpuYW1lIEFORAotICAgICAgaW50IHQpCi0KLXsKLSAgY2hhciAqdG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMTApOwotICByZWFsX25hbWUgPSBuYW1lOwotICBzcHJpbnRmKHRuYW1lLCAiJXMtdG1wIiwgbmFtZSk7Ci0gIG9iZmQgPSBiZmRfb3BlbncodG5hbWUsIE5VTEwpOwotCi0gIGlmICghb2JmZCkgewotICAgIGZwcmludGYoc3RkZXJyLF8oIiVzOiBDYW4ndCBvcGVuIG91dHB1dCBhcmNoaXZlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCSAgICB0bmFtZSk7Ci0KLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIHsKLSAgICBpZiAoIXQpIHsKLSAgICAgIGJmZCAqKnB0cjsKLSAgICAgIGJmZCAqZWxlbWVudDsKLSAgICAgIGJmZCAqaWJmZDsKLSAgICAgIGliZmQgPSBiZmRfb3BlbnIobmFtZSwgTlVMTCk7Ci0gICAgICBpZiAoIWliZmQpIHsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogQ2FuJ3Qgb3BlbiBpbnB1dCBhcmNoaXZlICVzXG4iKSwKLQkJcHJvZ3JhbV9uYW1lLCBuYW1lKTsKLQltYXliZXF1aXQoKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdChpYmZkLCBiZmRfYXJjaGl2ZSkgIT0gdHJ1ZSkgewotCWZwcmludGYoc3RkZXJyLF8oIiVzOiBmaWxlICVzIGlzIG5vdCBhbiBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQluYW1lKTsKLQltYXliZXF1aXQoKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgICBwdHIgPSAmKG9iZmQtPmFyY2hpdmVfaGVhZCk7Ci0gICAgICBlbGVtZW50ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZShpYmZkLCBOVUxMKTsKLQotICAgICAgd2hpbGUgKGVsZW1lbnQpIHsKLQkqcHRyID0gZWxlbWVudDsKLQlwdHIgPSAmZWxlbWVudC0+bmV4dDsKLQllbGVtZW50ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZShpYmZkLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBiZmRfc2V0X2Zvcm1hdChvYmZkLCBiZmRfYXJjaGl2ZSk7Ci0KLSAgICBvYmZkLT5oYXNfYXJtYXAgPSAxOwotICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWFyX2FkZGxpYl9kb2VyIChhYmZkLCBwcmV2KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZCAqcHJldjsKLXsKLSAgLyogQWRkIHRoaXMgbW9kdWxlIHRvIHRoZSBvdXRwdXQgYmZkICovCi0gIGlmIChwcmV2ICE9IE5VTEwpCi0gICAgcHJldi0+bmV4dCA9IGFiZmQtPm5leHQ7Ci0gIGFiZmQtPm5leHQgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gIG9iZmQtPmFyY2hpdmVfaGVhZCA9IGFiZmQ7Ci19Ci0KLXZvaWQKLWFyX2FkZGxpYiAobmFtZSwgbGlzdCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IGxpc3QgKmxpc3Q7Ci17Ci0gIGlmIChvYmZkID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gb3V0cHV0IGFyY2hpdmUgc3BlY2lmaWVkIHlldFxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgICBtYXliZXF1aXQgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkICphcmNoOwotCi0gICAgICBhcmNoID0gb3Blbl9pbmFyY2ggKG5hbWUsIChjaGFyICopIE5VTEwpOwotICAgICAgaWYgKGFyY2ggIT0gTlVMTCkKLQltYXBfb3Zlcl9saXN0IChhcmNoLCBhcl9hZGRsaWJfZG9lciwgbGlzdCk7Ci0KLSAgICAgIC8qIERvbid0IGNsb3NlIHRoZSBiZmQsIHNpbmNlIGl0IHdpbGwgbWFrZSB0aGUgZWxlbWVudHMgZGlzYXNwcGVhciAqLwotICAgIH0KLX0KLQotdm9pZAotREVGVU4oYXJfYWRkbW9kLCAobGlzdCksCi0gICAgICBzdHJ1Y3QgbGlzdCAqbGlzdCkKLXsKLSAgaWYgKCFvYmZkKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgd2hpbGUgKGxpc3QpIHsKLSAgICAgIGJmZCAqYWJmZCA9IGJmZF9vcGVucihsaXN0LT5uYW1lLCBOVUxMKTsKLSAgICAgIGlmICghYWJmZCkgIHsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogY2FuJ3Qgb3BlbiBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQlsaXN0LT5uYW1lKTsKLQltYXliZXF1aXQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCWFiZmQtPm5leHQgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0Jb2JmZC0+YXJjaGl2ZV9oZWFkID0gYWJmZDsKLSAgICAgIH0KLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgfQotfQotCi0KLQotdm9pZAotREVGVU5fVk9JRChhcl9jbGVhcikKLXsKLWlmIChvYmZkKSAKLSBvYmZkLT5hcmNoaXZlX2hlYWQgPSAwOwotfQotCi12b2lkCi1ERUZVTihhcl9kZWxldGUsIChsaXN0KSwKLSAgICAgIHN0cnVjdCBsaXN0ICpsaXN0KQotewotICBpZiAoIW9iZmQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICB3aGlsZSAobGlzdCkgewotICAgICAgLyogRmluZCB0aGlzIG5hbWUgaW4gdGhlIGFyY2hpdmUgKi8KLSAgICAgIGJmZCAqbWVtYmVyID0gb2JmZC0+YXJjaGl2ZV9oZWFkOwotICAgICAgYmZkICoqcHJldiA9ICYob2JmZC0+YXJjaGl2ZV9oZWFkKTsKLSAgICAgIGludCBmb3VuZCA9IDA7Ci0gICAgICB3aGlsZSAobWVtYmVyKSB7Ci0JaWYgKHN0cmNtcChtZW1iZXItPmZpbGVuYW1lLCBsaXN0LT5uYW1lKSA9PSAwKSB7Ci0JICAqcHJldiA9IG1lbWJlci0+bmV4dDsKLQkgIGZvdW5kID0gMTsKLQl9Ci0JZWxzZSB7Ci0JICBwcmV2ID0gJihtZW1iZXItPm5leHQpOwotCX0KLQkgIG1lbWJlciA9IG1lbWJlci0+bmV4dDsKLSAgICAgIH0KLSAgICAgIGlmICghZm91bmQpICB7Ci0JZnByaW50ZihzdGRlcnIsXygiJXM6IGNhbid0IGZpbmQgbW9kdWxlIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsCi0JCWxpc3QtPm5hbWUpOwotCW1heWJlcXVpdCgpOwotICAgICAgfQotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICB9Ci19Ci0KLQotdm9pZAotREVGVU5fVk9JRChhcl9zYXZlKQotewotCi0gIGlmICghb2JmZCkgewotICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogbm8gb3BlbiBvdXRwdXQgYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgbWF5YmVxdWl0KCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY2hhciAqb2ZpbGVuYW1lID0geHN0cmR1cCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotICAgIGJmZF9jbG9zZShvYmZkKTsKLSAgICAKLSAgICByZW5hbWUgKG9maWxlbmFtZSwgcmVhbF9uYW1lKTsKLSAgICBvYmZkID0gMDsKLSAgICBmcmVlKG9maWxlbmFtZSk7Ci0gIH0KLX0KLQotCi0KLXZvaWQKLURFRlVOKGFyX3JlcGxhY2UsIChsaXN0KSwKLSAgICAgIHN0cnVjdCBsaXN0ICpsaXN0KQotewotICBpZiAoIW9iZmQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICB3aGlsZSAobGlzdCkgewotICAgICAgLyogRmluZCB0aGlzIG5hbWUgaW4gdGhlIGFyY2hpdmUgKi8KLSAgICAgIGJmZCAqbWVtYmVyID0gb2JmZC0+YXJjaGl2ZV9oZWFkOwotICAgICAgYmZkICoqcHJldiA9ICYob2JmZC0+YXJjaGl2ZV9oZWFkKTsKLSAgICAgIGludCBmb3VuZCA9IDA7Ci0gICAgICB3aGlsZSAobWVtYmVyKSAKLSAgICAgIHsKLQlpZiAoc3RyY21wKG1lbWJlci0+ZmlsZW5hbWUsIGxpc3QtPm5hbWUpID09IDApIAotCXsKLQkgIC8qIEZvdW5kIHRoZSBvbmUgdG8gcmVwbGFjZSAqLwotCSAgYmZkICphYmZkID0gYmZkX29wZW5yKGxpc3QtPm5hbWUsIDApOwotCSAgaWYgKCFhYmZkKSAKLQkgIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBjYW4ndCBvcGVuIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsIGxpc3QtPm5hbWUpOwotCSAgICBtYXliZXF1aXQoKTsKLQkgIH0KLQkgIGVsc2UgewotCSAgICAqcHJldiA9IGFiZmQ7Ci0JICAgIGFiZmQtPm5leHQgPSBtZW1iZXItPm5leHQ7Ci0JICAgIGZvdW5kID0gMTsKLQkgIH0KLQl9Ci0JZWxzZSB7Ci0JICBwcmV2ID0gJihtZW1iZXItPm5leHQpOwotCX0KLQltZW1iZXIgPSBtZW1iZXItPm5leHQ7Ci0gICAgICB9Ci0gICAgICBpZiAoIWZvdW5kKSAgewotCWJmZCAqYWJmZCA9IGJmZF9vcGVucihsaXN0LT5uYW1lLCAwKTsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogY2FuJ3QgZmluZCBtb2R1bGUgZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwKLQkJbGlzdC0+bmFtZSk7Ci0JaWYgKCFhYmZkKSAKLQl7Ci0JICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IGNhbid0IG9wZW4gZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwgbGlzdC0+bmFtZSk7Ci0JICBtYXliZXF1aXQoKTsKLQl9Ci0JZWxzZSAKLQl7Ci0JICAqcHJldiA9IGFiZmQ7Ci0JfQotICAgICAgfQotCi0gICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICB9Ci19Ci0KLS8qIEFuZCBJIGFkZGVkIHRoaXMgb25lICovCi12b2lkCi1ERUZVTl9WT0lEKGFyX2xpc3QpCi17Ci0gIGlmICghb2JmZCkgCi0gIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgewotICAgIGJmZCAqYWJmZDsKLSAgICBvdXRmaWxlID0gc3Rkb3V0OwotICAgIHZlcmJvc2UgPTEgOwotICAgIHByaW50ZihfKCJDdXJyZW50IG9wZW4gYXJjaGl2ZSBpcyAlc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLSAgICBmb3IgKGFiZmQgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0JIGFiZmQgIT0gKGJmZCAqKU5VTEw7Ci0JIGFiZmQgPSBhYmZkLT5uZXh0KSAKLSAgICB7Ci0gICAgICBhcl9kaXJlY3RvcnlfZG9lciAoYWJmZCwgKGJmZCAqKSBOVUxMKTsKLSAgICB9Ci0gIH0KLX0KLQotCi12b2lkIAotREVGVU5fVk9JRChhcl9lbmQpCi17Ci0gIGlmIChvYmZkKQotICB7Ci0gICAgZmNsb3NlKChGSUxFICopKG9iZmQtPmlvc3RyZWFtKSk7Ci0gICAgdW5saW5rKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLSAgfQotfQotdm9pZAotREVGVU4oYXJfZXh0cmFjdCwobGlzdCksCi0gICAgICBzdHJ1Y3QgbGlzdCAqbGlzdCkKLXsKLSAgaWYgKCFvYmZkKSAKLSAgewotCi0gICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuICBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgd2hpbGUgKGxpc3QpIHsKLSAgICAgIC8qIEZpbmQgdGhpcyBuYW1lIGluIHRoZSBhcmNoaXZlICovCi0gICAgICBiZmQgKm1lbWJlciA9IG9iZmQtPmFyY2hpdmVfaGVhZDsKLSAgICAgIGludCBmb3VuZCA9IDA7Ci0gICAgICB3aGlsZSAobWVtYmVyICYmICFmb3VuZCkgCi0gICAgICB7Ci0JaWYgKHN0cmNtcChtZW1iZXItPmZpbGVuYW1lLCBsaXN0LT5uYW1lKSA9PSAwKSAKLQl7Ci0JICBleHRyYWN0X2ZpbGUobWVtYmVyKTsKLQkgIGZvdW5kID0gMTsKLQkgIH0KLQotCW1lbWJlciA9IG1lbWJlci0+bmV4dDsKLSAgICAgIH0KLSAgICAgIGlmICghZm91bmQpICB7Ci0JYmZkX29wZW5yKGxpc3QtPm5hbWUsIDApOwotCWZwcmludGYoc3RkZXJyLF8oIiVzOiBjYW4ndCBmaW5kIG1vZHVsZSBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQlsaXN0LT5uYW1lKTsKLQotICAgICAgfQotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9hcnN1cC5oIGIvYmludXRpbHMvYXJzdXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0YTM0Yi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hcnN1cC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyogYXJzdXAuaCAtIGFyY2hpdmUgc3VwcG9ydCBoZWFkZXIgZmlsZQotICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotc3RydWN0IGxpc3QgewotCWNoYXIgKm5hbWU7CQotCXN0cnVjdCBsaXN0ICpuZXh0OwotfTsKLQotdm9pZAotbWF5YmVxdWl0IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAotcHJvbXB0IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAotYXJfY2xlYXIgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9yZXBsYWNlIFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKLQotdm9pZAotYXJfZGVsZXRlIFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKLQotdm9pZAotYXJfc2F2ZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLWFyX2xpc3QgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9vcGVuIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLXZvaWQKLWFyX2RpcmVjdG9yeSBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBsaXN0ICosIGNoYXIgKikpOwotCi12b2lkCi1hcl9hZGRtb2QgUEFSQU1TICgoc3RydWN0IGxpc3QgKikpOwotCi12b2lkCi1hcl9hZGRsaWIgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3QgbGlzdCAqKSk7Ci0KLXZvaWQgCi1hcl9lbmQgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9leHRyYWN0IFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKLQotYmZkICoKLW9wZW5faW5hcmNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2hpdmVfZmlsZW5hbWUsIGNvbnN0IGNoYXIgKikpOwotCi1pbnQKLXl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotCi0vKiBGdW5jdGlvbnMgZnJvbSBhci5jICovCi0KLXZvaWQKLWV4dHJhY3RfZmlsZSBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLWV4dGVybiBpbnQgaW50ZXJhY3RpdmU7CmRpZmYgLS1naXQgYS9iaW51dGlscy9iaW51dGlscy50ZXhpIGIvYmludXRpbHMvYmludXRpbHMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxZjBkYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9iaW51dGlscy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjk4OSArMCwwIEBACi1caW5wdXQgdGV4aW5mbyAgICAgICBAYyAgICAgICAgICAgICAgICAgICAgLSotIFRleGluZm8gLSotCi1Ac2V0ZmlsZW5hbWUgYmludXRpbHMuaW5mbwotQGluY2x1ZGUgY29uZmlnLnRleGkKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogQmludXRpbHM6IChiaW51dGlscykuICAgICAgICAgVGhlIEdOVSBiaW5hcnkgdXRpbGl0aWVzLgotKiBhcjogKGJpbnV0aWxzKWFyLiAgICAgICAgICAgICAgIENyZWF0ZSwgbW9kaWZ5LCBhbmQgZXh0cmFjdCBmcm9tIGFyY2hpdmVzCi0qIG5tOiAoYmludXRpbHMpbm0uICAgICAgICAgICAgICAgTGlzdCBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzCi0qIG9iamNvcHk6IChiaW51dGlscylvYmpjb3B5LgkgIENvcHkgYW5kIHRyYW5zbGF0ZSBvYmplY3QgZmlsZXMKLSogb2JqZHVtcDogKGJpbnV0aWxzKW9iamR1bXAuICAgICBEaXNwbGF5IGluZm9ybWF0aW9uIGZyb20gb2JqZWN0IGZpbGVzCi0qIHJhbmxpYjogKGJpbnV0aWxzKXJhbmxpYi4gICAgICAgR2VuZXJhdGUgaW5kZXggdG8gYXJjaGl2ZSBjb250ZW50cwotKiByZWFkZWxmOiAoYmludXRpbHMpcmVhZGVsZi4JICBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiBFTEYgZm9ybWF0IGZpbGVzLgotKiBzaXplOiAoYmludXRpbHMpc2l6ZS4gICAgICAgICAgIExpc3Qgc2VjdGlvbiBzaXplcyBhbmQgdG90YWwgc2l6ZQotKiBzdHJpbmdzOiAoYmludXRpbHMpc3RyaW5ncy4gICAgIExpc3QgcHJpbnRhYmxlIHN0cmluZ3MgZnJvbSBmaWxlcwotKiBzdHJpcDogKGJpbnV0aWxzKXN0cmlwLiAgICAgICAgIERpc2NhcmQgc3ltYm9scwotKiBjKytmaWx0OiAoYmludXRpbHMpYysrZmlsdC4JICBGaWx0ZXIgdG8gZGVtYW5nbGUgZW5jb2RlZCBDKysgc3ltYm9scwotKiBjeHhmaWx0OiAoYmludXRpbHMpYysrZmlsdC4gICAgIE1TLURPUyBuYW1lIGZvciBjKytmaWx0Ci0qIGFkZHIybGluZTogKGJpbnV0aWxzKWFkZHIybGluZS4gQ29udmVydCBhZGRyZXNzZXMgdG8gZmlsZSBhbmQgbGluZQotKiBubG1jb252OiAoYmludXRpbHMpbmxtY29udi4gICAgIENvbnZlcnRzIG9iamVjdCBjb2RlIGludG8gYW4gTkxNCi0qIHdpbmRyZXM6IChiaW51dGlscyl3aW5kcmVzLgkgIE1hbmlwdWxhdGUgV2luZG93cyByZXNvdXJjZXMKLSogZGxsdG9vbDogKGJpbnV0aWxzKWRsbHRvb2wuCSAgQ3JlYXRlIGZpbGVzIG5lZWRlZCB0byBidWlsZCBhbmQgdXNlIERMTHMKLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgYSBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotCi1AZW5kIGlnbm9yZQotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdAotdGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIGlmaW5mbwotCi1Ac3luaW5kZXgga3kgY3AKLUBjCi1AYyBUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBHTlUgYmluYXJ5IHV0aWxpdGllcyAiYXIiLCAibGQiLCAib2JqY29weSIsCi1AYyAgIm9iamR1bXAiLCAibm0iLCAic2l6ZSIsICJzdHJpbmdzIiwgInN0cmlwIiwgInJlYWRlbGYiIGFuZCAicmFubGliIi4KLUBjCi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgCi1AYyBUaGlzIHRleHQgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQotQGMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLUBjCi0KLUBzZXRjaGFwdGVybmV3cGFnZSBvZGQKLUBzZXR0aXRsZSBAc2N7Z251fSBCaW5hcnkgVXRpbGl0aWVzCi1AdGl0bGVwYWdlCi1AZmluYWxvdXQKLUB0aXRsZSBUaGUgQHNje2dudX0gQmluYXJ5IFV0aWxpdGllcwotQHN1YnRpdGxlIFZlcnNpb24gQHZhbHVle1ZFUlNJT059Ci1Ac3AgMQotQHN1YnRpdGxlIE1heSAxOTkzCi1AYXV0aG9yIFJvbGFuZCBILiBQZXNjaAotQGF1dGhvciBKZWZmcmV5IE0uIE9zaWVyCi1AYXV0aG9yIEN5Z251cyBTdXBwb3J0Ci1AcGFnZQotCi1AdGV4Ci17XHBhcnNraXA9MHB0IFxoZmlsbCBDeWdudXMgU3VwcG9ydFxwYXIgXGhmaWxsCi1cVGVYe31pbmZvIFx0ZXhpbmZvdmVyc2lvblxwYXIgfQotQGVuZCB0ZXgKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Ci10aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgdGl0bGVwYWdlCi0KLUBub2RlIFRvcAotQHRvcCBJbnRyb2R1Y3Rpb24KLQotQGNpbmRleCB2ZXJzaW9uCi1UaGlzIGJyaWVmIG1hbnVhbCBjb250YWlucyBwcmVsaW1pbmFyeSBkb2N1bWVudGF0aW9uIGZvciB0aGUgQHNje2dudX0gYmluYXJ5Ci11dGlsaXRpZXMgKGNvbGxlY3RpdmVseSB2ZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfSk6IAotCi1AaWZ0ZXgKLUB0YWJsZSBAY29kZQotQGl0ZW0gYXIKLUNyZWF0ZSwgbW9kaWZ5LCBhbmQgZXh0cmFjdCBmcm9tIGFyY2hpdmVzCi0KLUBpdGVtIG5tCi1MaXN0IHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMKLQotQGl0ZW0gb2JqY29weQotQ29weSBhbmQgdHJhbnNsYXRlIG9iamVjdCBmaWxlcwotCi1AaXRlbSBvYmpkdW1wCi1EaXNwbGF5IGluZm9ybWF0aW9uIGZyb20gb2JqZWN0IGZpbGVzCi0KLUBpdGVtIHJhbmxpYgotR2VuZXJhdGUgaW5kZXggdG8gYXJjaGl2ZSBjb250ZW50cwotCi1AaXRlbSByZWFkZWxmCi1EaXNwbGF5IHRoZSBjb250ZW50cyBvZiBFTEYgZm9ybWF0IGZpbGVzLgotCi1AaXRlbSBzaXplCi1MaXN0IGZpbGUgc2VjdGlvbiBzaXplcyBhbmQgdG90YWwgc2l6ZQotCi1AaXRlbSBzdHJpbmdzCi1MaXN0IHByaW50YWJsZSBzdHJpbmdzIGZyb20gZmlsZXMKLQotQGl0ZW0gc3RyaXAKLURpc2NhcmQgc3ltYm9scwotCi1AaXRlbSBjKytmaWx0Ci1EZW1hbmdsZSBlbmNvZGVkIEMrKyBzeW1ib2xzIChvbiBNUy1ET1MsIHRoaXMgcHJvZ3JhbSBpcyBuYW1lZAotQGNvZGV7Y3h4ZmlsdH0pCi0KLUBpdGVtIGFkZHIybGluZQotQ29udmVydCBhZGRyZXNzZXMgaW50byBmaWxlIG5hbWVzIGFuZCBsaW5lIG51bWJlcnMKLQotQGl0ZW0gbmxtY29udgotQ29udmVydCBvYmplY3QgY29kZSBpbnRvIGEgTmV0d2FyZSBMb2FkYWJsZSBNb2R1bGUKLQotQGl0ZW0gd2luZHJlcwotTWFuaXB1bGF0ZSBXaW5kb3dzIHJlc291cmNlcwotCi1AaXRlbSBkbGx0b29sCi1DcmVhdGUgdGhlIGZpbGVzIG5lZWRlZCB0byBidWlsZCBhbmQgdXNlIER5bmFtaWMgTGluayBMaWJyYXJpZXMKLUBlbmQgdGFibGUKLUBlbmQgaWZ0ZXgKLQotQG1lbnUKLSogYXI6OiAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMKLSogbm06OiAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzCi0qIG9iamNvcHk6OgkJCUNvcHkgYW5kIHRyYW5zbGF0ZSBvYmplY3QgZmlsZXMKLSogb2JqZHVtcDo6ICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSBpbmZvcm1hdGlvbiBmcm9tIG9iamVjdCBmaWxlcwotKiByYW5saWI6OiAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBpbmRleCB0byBhcmNoaXZlIGNvbnRlbnRzCi0qIHJlYWRlbGY6OgkJCURpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIEVMRiBmb3JtYXQgZmlsZXMuCi0qIHNpemU6OiAgICAgICAgICAgICAgICAgICAgICAgIExpc3Qgc2VjdGlvbiBzaXplcyBhbmQgdG90YWwgc2l6ZQotKiBzdHJpbmdzOjogICAgICAgICAgICAgICAgICAgICBMaXN0IHByaW50YWJsZSBzdHJpbmdzIGZyb20gZmlsZXMKLSogc3RyaXA6OiAgICAgICAgICAgICAgICAgICAgICAgRGlzY2FyZCBzeW1ib2xzCi0qIGMrK2ZpbHQ6OgkJCUZpbHRlciB0byBkZW1hbmdsZSBlbmNvZGVkIEMrKyBzeW1ib2xzCi0qIGN4eGZpbHQ6IGMrK2ZpbHQuICAgICAgICAgICAgIE1TLURPUyBuYW1lIGZvciBjKytmaWx0Ci0qIGFkZHIybGluZTo6CQkJQ29udmVydCBhZGRyZXNzZXMgdG8gZmlsZSBhbmQgbGluZQotKiBubG1jb252OjogICAgICAgICAgICAgICAgICAgICBDb252ZXJ0cyBvYmplY3QgY29kZSBpbnRvIGFuIE5MTQotKiB3aW5kcmVzOjoJCQlNYW5pcHVsYXRlIFdpbmRvd3MgcmVzb3VyY2VzCi0qIGRsbHRvb2w6OgkJCUNyZWF0ZSBmaWxlcyBuZWVkZWQgdG8gYnVpbGQgYW5kIHVzZSBETExzCi0qIFNlbGVjdGluZyBUaGUgVGFyZ2V0IFN5c3RlbTo6IEhvdyB0aGVzZSB1dGlsaXRpZXMgZGV0ZXJtaW5lIHRoZSB0YXJnZXQuCi0qIFJlcG9ydGluZyBCdWdzOjogICAgICAgICAgICAgIFJlcG9ydGluZyBCdWdzCi0qIEluZGV4OjogICAgICAgICAgICAgICAgICAgICAgIEluZGV4Ci1AZW5kIG1lbnUKLQotQG5vZGUgYXIKLUBjaGFwdGVyIGFyCi0KLUBraW5kZXggYXIKLUBjaW5kZXggYXJjaGl2ZXMKLUBjaW5kZXggY29sbGVjdGlvbnMgb2YgZmlsZXMKLUBzbWFsbGV4YW1wbGUKLWFyIFstXUB2YXJ7cH1bQHZhcnttb2R9IFtAdmFye3JlbHBvc31dIFtAdmFye2NvdW50fV1dIEB2YXJ7YXJjaGl2ZX0gW0B2YXJ7bWVtYmVyfUBkb3Rze31dCi1hciAtTSBbIDxtcmktc2NyaXB0IF0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAc2N7Z251fSBAY29kZXthcn0gcHJvZ3JhbSBjcmVhdGVzLCBtb2RpZmllcywgYW5kIGV4dHJhY3RzIGZyb20KLWFyY2hpdmVzLiAgQW4gQGRmbnthcmNoaXZlfSBpcyBhIHNpbmdsZSBmaWxlIGhvbGRpbmcgYSBjb2xsZWN0aW9uIG9mCi1vdGhlciBmaWxlcyBpbiBhIHN0cnVjdHVyZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJldHJpZXZlCi10aGUgb3JpZ2luYWwgaW5kaXZpZHVhbCBmaWxlcyAoY2FsbGVkIEBkZm57bWVtYmVyc30gb2YgdGhlIGFyY2hpdmUpLgotCi1UaGUgb3JpZ2luYWwgZmlsZXMnIGNvbnRlbnRzLCBtb2RlIChwZXJtaXNzaW9ucyksIHRpbWVzdGFtcCwgb3duZXIsIGFuZAotZ3JvdXAgYXJlIHByZXNlcnZlZCBpbiB0aGUgYXJjaGl2ZSwgYW5kIGNhbiBiZSByZXN0b3JlZCBvbgotZXh0cmFjdGlvbi4gIAotCi1AY2luZGV4IG5hbWUgbGVuZ3RoCi1Ac2N7Z251fSBAY29kZXthcn0gY2FuIG1haW50YWluIGFyY2hpdmVzIHdob3NlIG1lbWJlcnMgaGF2ZSBuYW1lcyBvZiBhbnkKLWxlbmd0aDsgaG93ZXZlciwgZGVwZW5kaW5nIG9uIGhvdyBAY29kZXthcn0gaXMgY29uZmlndXJlZCBvbiB5b3VyCi1zeXN0ZW0sIGEgbGltaXQgb24gbWVtYmVyLW5hbWUgbGVuZ3RoIG1heSBiZSBpbXBvc2VkIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIGFyY2hpdmUgZm9ybWF0cyBtYWludGFpbmVkIHdpdGggb3RoZXIgdG9vbHMuICBJZiBpdCBleGlzdHMsIHRoZQotbGltaXQgaXMgb2Z0ZW4gMTUgY2hhcmFjdGVycyAodHlwaWNhbCBvZiBmb3JtYXRzIHJlbGF0ZWQgdG8gYS5vdXQpIG9yIDE2Ci1jaGFyYWN0ZXJzICh0eXBpY2FsIG9mIGZvcm1hdHMgcmVsYXRlZCB0byBjb2ZmKS4KLQotQGNpbmRleCBsaWJyYXJpZXMKLUBjb2Rle2FyfSBpcyBjb25zaWRlcmVkIGEgYmluYXJ5IHV0aWxpdHkgYmVjYXVzZSBhcmNoaXZlcyBvZiB0aGlzIHNvcnQKLWFyZSBtb3N0IG9mdGVuIHVzZWQgYXMgQGRmbntsaWJyYXJpZXN9IGhvbGRpbmcgY29tbW9ubHkgbmVlZGVkCi1zdWJyb3V0aW5lcy4KLQotQGNpbmRleCBzeW1ib2wgaW5kZXgKLUBjb2Rle2FyfSBjcmVhdGVzIGFuIGluZGV4IHRvIHRoZSBzeW1ib2xzIGRlZmluZWQgaW4gcmVsb2NhdGFibGUKLW9iamVjdCBtb2R1bGVzIGluIHRoZSBhcmNoaXZlIHdoZW4geW91IHNwZWNpZnkgdGhlIG1vZGlmaWVyIEBzYW1we3N9LgotT25jZSBjcmVhdGVkLCB0aGlzIGluZGV4IGlzIHVwZGF0ZWQgaW4gdGhlIGFyY2hpdmUgd2hlbmV2ZXIgQGNvZGV7YXJ9Ci1tYWtlcyBhIGNoYW5nZSB0byBpdHMgY29udGVudHMgKHNhdmUgZm9yIHRoZSBAc2FtcHtxfSB1cGRhdGUgb3BlcmF0aW9uKS4KLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBhbmQKLWFsbG93cyByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0byBjYWxsIGVhY2ggb3RoZXIgd2l0aG91dCByZWdhcmQgdG8KLXRoZWlyIHBsYWNlbWVudCBpbiB0aGUgYXJjaGl2ZS4KLQotWW91IG1heSB1c2UgQHNhbXB7bm0gLXN9IG9yIEBzYW1we25tIC0tcHJpbnQtYXJtYXB9IHRvIGxpc3QgdGhpcyBpbmRleAotdGFibGUuICBJZiBhbiBhcmNoaXZlIGxhY2tzIHRoZSB0YWJsZSwgYW5vdGhlciBmb3JtIG9mIEBjb2Rle2FyfSBjYWxsZWQKLUBjb2Rle3JhbmxpYn0gY2FuIGJlIHVzZWQgdG8gYWRkIGp1c3QgdGhlIHRhYmxlLgotCi1AY2luZGV4IGNvbXBhdGliaWxpdHksIEBjb2Rle2FyfQotQGNpbmRleCBAY29kZXthcn0gY29tcGF0aWJpbGl0eQotQHNje2dudX0gQGNvZGV7YXJ9IGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0d28gZGlmZmVyZW50Ci1mYWNpbGl0aWVzLiAgWW91IGNhbiBjb250cm9sIGl0cyBhY3Rpdml0eSB1c2luZyBjb21tYW5kLWxpbmUgb3B0aW9ucywKLWxpa2UgdGhlIGRpZmZlcmVudCB2YXJpZXRpZXMgb2YgQGNvZGV7YXJ9IG9uIFVuaXggc3lzdGVtczsgb3IsIGlmIHlvdQotc3BlY2lmeSB0aGUgc2luZ2xlIGNvbW1hbmQtbGluZSBvcHRpb24gQHNhbXB7LU19LCB5b3UgY2FuIGNvbnRyb2wgaXQKLXdpdGggYSBzY3JpcHQgc3VwcGxpZWQgdmlhIHN0YW5kYXJkIGlucHV0LCBsaWtlIHRoZSBNUkkgYGBsaWJyYXJpYW4nJwotcHJvZ3JhbS4KLQotQG1lbnUKLSogYXIgY21kbGluZTo6ICAgICAgICAgICAgICAgICAgQ29udHJvbGxpbmcgQGNvZGV7YXJ9IG9uIHRoZSBjb21tYW5kIGxpbmUKLSogYXIgc2NyaXB0czo6ICAgICAgICAgICAgICAgICAgQ29udHJvbGxpbmcgQGNvZGV7YXJ9IHdpdGggYSBzY3JpcHQKLUBlbmQgbWVudQotCi1AcGFnZQotQG5vZGUgYXIgY21kbGluZQotQHNlY3Rpb24gQ29udHJvbGxpbmcgQGNvZGV7YXJ9IG9uIHRoZSBjb21tYW5kIGxpbmUKLQotQHNtYWxsZXhhbXBsZQotYXIgWy1dQHZhcntwfVtAdmFye21vZH0gW0B2YXJ7cmVscG9zfV0gW0B2YXJ7Y291bnR9XV0gQHZhcnthcmNoaXZlfSBbQHZhcnttZW1iZXJ9QGRvdHN7fV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjaW5kZXggVW5peCBjb21wYXRpYmlsaXR5LCBAY29kZXthcn0KLVdoZW4geW91IHVzZSBAY29kZXthcn0gaW4gdGhlIFVuaXggc3R5bGUsIEBjb2Rle2FyfSBpbnNpc3RzIG9uIGF0IGxlYXN0IHR3bwotYXJndW1lbnRzIHRvIGV4ZWN1dGU6IG9uZSBrZXlsZXR0ZXIgc3BlY2lmeWluZyB0aGUgQGVtcGh7b3BlcmF0aW9ufQotKG9wdGlvbmFsbHkgYWNjb21wYW5pZWQgYnkgb3RoZXIga2V5bGV0dGVycyBzcGVjaWZ5aW5nCi1AZW1waHttb2RpZmllcnN9KSwgYW5kIHRoZSBhcmNoaXZlIG5hbWUgdG8gYWN0IG9uLgotCi1Nb3N0IG9wZXJhdGlvbnMgY2FuIGFsc28gYWNjZXB0IGZ1cnRoZXIgQHZhcnttZW1iZXJ9IGFyZ3VtZW50cywKLXNwZWNpZnlpbmcgcGFydGljdWxhciBmaWxlcyB0byBvcGVyYXRlIG9uLgotCi1Ac2N7Z251fSBAY29kZXthcn0gYWxsb3dzIHlvdSB0byBtaXggdGhlIG9wZXJhdGlvbiBjb2RlIEB2YXJ7cH0gYW5kIG1vZGlmaWVyCi1mbGFncyBAdmFye21vZH0gaW4gYW55IG9yZGVyLCB3aXRoaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudC4KLQotSWYgeW91IHdpc2gsIHlvdSBtYXkgYmVnaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudCB3aXRoIGEKLWRhc2guCi0KLUBjaW5kZXggb3BlcmF0aW9ucyBvbiBhcmNoaXZlCi1UaGUgQHZhcntwfSBrZXlsZXR0ZXIgc3BlY2lmaWVzIHdoYXQgb3BlcmF0aW9uIHRvIGV4ZWN1dGU7IGl0IG1heSBiZQotYW55IG9mIHRoZSBmb2xsb3dpbmcsIGJ1dCB5b3UgbXVzdCBzcGVjaWZ5IG9ubHkgb25lIG9mIHRoZW06Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gZAotQGNpbmRleCBkZWxldGluZyBmcm9tIGFyY2hpdmUKLUBlbXBoe0RlbGV0ZX0gbW9kdWxlcyBmcm9tIHRoZSBhcmNoaXZlLiAgU3BlY2lmeSB0aGUgbmFtZXMgb2YgbW9kdWxlcyB0bwotYmUgZGVsZXRlZCBhcyBAdmFye21lbWJlcn1AZG90c3t9OyB0aGUgYXJjaGl2ZSBpcyB1bnRvdWNoZWQgaWYgeW91Ci1zcGVjaWZ5IG5vIGZpbGVzIHRvIGRlbGV0ZS4KLQotSWYgeW91IHNwZWNpZnkgdGhlIEBzYW1we3Z9IG1vZGlmaWVyLCBAY29kZXthcn0gbGlzdHMgZWFjaCBtb2R1bGUKLWFzIGl0IGlzIGRlbGV0ZWQuCi0KLUBpdGVtIG0KLUBjaW5kZXggbW92aW5nIGluIGFyY2hpdmUKLVVzZSB0aGlzIG9wZXJhdGlvbiB0byBAZW1waHttb3ZlfSBtZW1iZXJzIGluIGFuIGFyY2hpdmUuCi0KLVRoZSBvcmRlcmluZyBvZiBtZW1iZXJzIGluIGFuIGFyY2hpdmUgY2FuIG1ha2UgYSBkaWZmZXJlbmNlIGluIGhvdwotcHJvZ3JhbXMgYXJlIGxpbmtlZCB1c2luZyB0aGUgbGlicmFyeSwgaWYgYSBzeW1ib2wgaXMgZGVmaW5lZCBpbiBtb3JlCi10aGFuIG9uZSBtZW1iZXIuICAKLQotSWYgbm8gbW9kaWZpZXJzIGFyZSB1c2VkIHdpdGggQGNvZGV7bX0sIGFueSBtZW1iZXJzIHlvdSBuYW1lIGluIHRoZQotQHZhcnttZW1iZXJ9IGFyZ3VtZW50cyBhcmUgbW92ZWQgdG8gdGhlIEBlbXBoe2VuZH0gb2YgdGhlIGFyY2hpdmU7Ci15b3UgY2FuIHVzZSB0aGUgQHNhbXB7YX0sIEBzYW1we2J9LCBvciBAc2FtcHtpfSBtb2RpZmllcnMgdG8gbW92ZSB0aGVtIHRvIGEKLXNwZWNpZmllZCBwbGFjZSBpbnN0ZWFkLgotCi1AaXRlbSBwCi1AY2luZGV4IHByaW50aW5nIGZyb20gYXJjaGl2ZQotQGVtcGh7UHJpbnR9IHRoZSBzcGVjaWZpZWQgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSwgdG8gdGhlIHN0YW5kYXJkCi1vdXRwdXQgZmlsZS4gIElmIHRoZSBAc2FtcHt2fSBtb2RpZmllciBpcyBzcGVjaWZpZWQsIHNob3cgdGhlIG1lbWJlcgotbmFtZSBiZWZvcmUgY29weWluZyBpdHMgY29udGVudHMgdG8gc3RhbmRhcmQgb3V0cHV0LgotCi1JZiB5b3Ugc3BlY2lmeSBubyBAdmFye21lbWJlcn0gYXJndW1lbnRzLCBhbGwgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlIGFyZQotcHJpbnRlZC4KLQotQGl0ZW0gcQotQGNpbmRleCBxdWljayBhcHBlbmQgdG8gYXJjaGl2ZQotQGVtcGh7UXVpY2sgYXBwZW5kfTsgSGlzdG9yaWNhbGx5LCBhZGQgdGhlIGZpbGVzIEB2YXJ7bWVtYmVyfUBkb3Rze30gdG8gdGhlIGVuZCBvZgotQHZhcnthcmNoaXZlfSwgd2l0aG91dCBjaGVja2luZyBmb3IgcmVwbGFjZW1lbnQuCi0KLVRoZSBtb2RpZmllcnMgQHNhbXB7YX0sIEBzYW1we2J9LCBhbmQgQHNhbXB7aX0gZG8gQGVtcGh7bm90fSBhZmZlY3QgdGhpcwotb3BlcmF0aW9uOyBuZXcgbWVtYmVycyBhcmUgYWx3YXlzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLgotCi1UaGUgbW9kaWZpZXIgQHNhbXB7dn0gbWFrZXMgQGNvZGV7YXJ9IGxpc3QgZWFjaCBmaWxlIGFzIGl0IGlzIGFwcGVuZGVkLgotCi1TaW5jZSB0aGUgcG9pbnQgb2YgdGhpcyBvcGVyYXRpb24gaXMgc3BlZWQsIHRoZSBhcmNoaXZlJ3Mgc3ltYm9sIHRhYmxlCi1pbmRleCBpcyBub3QgdXBkYXRlZCwgZXZlbiBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQ7IHlvdSBjYW4gdXNlIEBzYW1we2FyIHN9IG9yCi1AY29kZXtyYW5saWJ9IGV4cGxpY2l0bHkgdG8gdXBkYXRlIHRoZSBzeW1ib2wgdGFibGUgaW5kZXguCi0KLUhvd2V2ZXIsIHRvbyBtYW55IGRpZmZlcmVudCBzeXN0ZW1zIGFzc3VtZSBxdWljayBhcHBlbmQgcmVidWlsZHMgdGhlCi1pbmRleCwgc28gR05VIGFyIGltcGxlbWVudHMgQGNvZGV7cX0gYXMgYSBzeW5vbnltIGZvciBAY29kZXtyfS4KLQotQGl0ZW0gcgotQGNpbmRleCByZXBsYWNlbWVudCBpbiBhcmNoaXZlCi1JbnNlcnQgdGhlIGZpbGVzIEB2YXJ7bWVtYmVyfUBkb3Rze30gaW50byBAdmFye2FyY2hpdmV9ICh3aXRoCi1AZW1waHtyZXBsYWNlbWVudH0pLiBUaGlzIG9wZXJhdGlvbiBkaWZmZXJzIGZyb20gQHNhbXB7cX0gaW4gdGhhdCBhbnkKLXByZXZpb3VzbHkgZXhpc3RpbmcgbWVtYmVycyBhcmUgZGVsZXRlZCBpZiB0aGVpciBuYW1lcyBtYXRjaCB0aG9zZSBiZWluZwotYWRkZWQuCi0KLUlmIG9uZSBvZiB0aGUgZmlsZXMgbmFtZWQgaW4gQHZhcnttZW1iZXJ9QGRvdHN7fSBkb2VzIG5vdCBleGlzdCwgQGNvZGV7YXJ9Ci1kaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlLCBhbmQgbGVhdmVzIHVuZGlzdHVyYmVkIGFueSBleGlzdGluZyBtZW1iZXJzCi1vZiB0aGUgYXJjaGl2ZSBtYXRjaGluZyB0aGF0IG5hbWUuCi0KLUJ5IGRlZmF1bHQsIG5ldyBtZW1iZXJzIGFyZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlOyBidXQgeW91IG1heQotdXNlIG9uZSBvZiB0aGUgbW9kaWZpZXJzIEBzYW1we2F9LCBAc2FtcHtifSwgb3IgQHNhbXB7aX0gdG8gcmVxdWVzdAotcGxhY2VtZW50IHJlbGF0aXZlIHRvIHNvbWUgZXhpc3RpbmcgbWVtYmVyLgotCi1UaGUgbW9kaWZpZXIgQHNhbXB7dn0gdXNlZCB3aXRoIHRoaXMgb3BlcmF0aW9uIGVsaWNpdHMgYSBsaW5lIG9mCi1vdXRwdXQgZm9yIGVhY2ggZmlsZSBpbnNlcnRlZCwgYWxvbmcgd2l0aCBvbmUgb2YgdGhlIGxldHRlcnMgQHNhbXB7YX0gb3IKLUBzYW1we3J9IHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGZpbGUgd2FzIGFwcGVuZGVkIChubyBvbGQgbWVtYmVyCi1kZWxldGVkKSBvciByZXBsYWNlZC4KLQotQGl0ZW0gdAotQGNpbmRleCBjb250ZW50cyBvZiBhcmNoaXZlCi1EaXNwbGF5IGEgQGVtcGh7dGFibGV9IGxpc3RpbmcgdGhlIGNvbnRlbnRzIG9mIEB2YXJ7YXJjaGl2ZX0sIG9yIHRob3NlCi1vZiB0aGUgZmlsZXMgbGlzdGVkIGluIEB2YXJ7bWVtYmVyfUBkb3Rze30gdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUKLWFyY2hpdmUuICBOb3JtYWxseSBvbmx5IHRoZSBtZW1iZXIgbmFtZSBpcyBzaG93bjsgaWYgeW91IGFsc28gd2FudCB0bwotc2VlIHRoZSBtb2RlcyAocGVybWlzc2lvbnMpLCB0aW1lc3RhbXAsIG93bmVyLCBncm91cCwgYW5kIHNpemUsIHlvdSBjYW4KLXJlcXVlc3QgdGhhdCBieSBhbHNvIHNwZWNpZnlpbmcgdGhlIEBzYW1we3Z9IG1vZGlmaWVyLgotCi1JZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBAdmFye21lbWJlcn0sIGFsbCBmaWxlcyBpbiB0aGUgYXJjaGl2ZQotYXJlIGxpc3RlZC4KLQotQGNpbmRleCByZXBlYXRlZCBuYW1lcyBpbiBhcmNoaXZlCi1AY2luZGV4IG5hbWUgZHVwbGljYXRpb24gaW4gYXJjaGl2ZQotSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSAoc2F5LCBAc2FtcHtmaWV9KSBpbgotYW4gYXJjaGl2ZSAoc2F5IEBzYW1we2IuYX0pLCBAc2FtcHthciB0IGIuYSBmaWV9IGxpc3RzIG9ubHkgdGhlCi1maXJzdCBpbnN0YW5jZTsgdG8gc2VlIHRoZW0gYWxsLCB5b3UgbXVzdCBhc2sgZm9yIGEgY29tcGxldGUKLWxpc3RpbmctLS1pbiBvdXIgZXhhbXBsZSwgQHNhbXB7YXIgdCBiLmF9LgotQGMgV1JTIG9ubHk7IHBlciBHdW1ieSwgdGhpcyBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQsIGFuZCBpbiBhIG1vcmUKLUBjIHJlY2VudCBjYXNlIGluIGZhY3Qgd29ya3MgdGhlIG90aGVyIHdheS4KLQotQGl0ZW0geAotQGNpbmRleCBleHRyYWN0IGZyb20gYXJjaGl2ZQotQGVtcGh7RXh0cmFjdH0gbWVtYmVycyAobmFtZWQgQHZhcnttZW1iZXJ9KSBmcm9tIHRoZSBhcmNoaXZlLiAgWW91IGNhbgotdXNlIHRoZSBAc2FtcHt2fSBtb2RpZmllciB3aXRoIHRoaXMgb3BlcmF0aW9uLCB0byByZXF1ZXN0IHRoYXQKLUBjb2Rle2FyfSBsaXN0IGVhY2ggbmFtZSBhcyBpdCBleHRyYWN0cyBpdC4KLQotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgQHZhcnttZW1iZXJ9LCBhbGwgZmlsZXMgaW4gdGhlIGFyY2hpdmUKLWFyZSBleHRyYWN0ZWQuCi0KLUBlbmQgdGFibGUKLQotQSBudW1iZXIgb2YgbW9kaWZpZXJzIChAdmFye21vZH0pIG1heSBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIEB2YXJ7cH0KLWtleWxldHRlciwgdG8gc3BlY2lmeSB2YXJpYXRpb25zIG9uIGFuIG9wZXJhdGlvbidzIGJlaGF2aW9yOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGEKLUBjaW5kZXggcmVsYXRpdmUgcGxhY2VtZW50IGluIGFyY2hpdmUKLUFkZCBuZXcgZmlsZXMgQGVtcGh7YWZ0ZXJ9IGFuIGV4aXN0aW5nIG1lbWJlciBvZiB0aGUKLWFyY2hpdmUuICBJZiB5b3UgdXNlIHRoZSBtb2RpZmllciBAc2FtcHthfSwgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZQotbWVtYmVyIG11c3QgYmUgcHJlc2VudCBhcyB0aGUgQHZhcntyZWxwb3N9IGFyZ3VtZW50LCBiZWZvcmUgdGhlCi1AdmFye2FyY2hpdmV9IHNwZWNpZmljYXRpb24uCi0KLUBpdGVtIGIKLUFkZCBuZXcgZmlsZXMgQGVtcGh7YmVmb3JlfSBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgQHNhbXB7Yn0sIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIEB2YXJ7cmVscG9zfSBhcmd1bWVudCwgYmVmb3JlIHRoZQotQHZhcnthcmNoaXZlfSBzcGVjaWZpY2F0aW9uLiAgKHNhbWUgYXMgQHNhbXB7aX0pLgotCi1AaXRlbSBjCi1AY2luZGV4IGNyZWF0aW5nIGFyY2hpdmVzCi1AZW1waHtDcmVhdGV9IHRoZSBhcmNoaXZlLiAgVGhlIHNwZWNpZmllZCBAdmFye2FyY2hpdmV9IGlzIGFsd2F5cwotY3JlYXRlZCBpZiBpdCBkaWQgbm90IGV4aXN0LCB3aGVuIHlvdSByZXF1ZXN0IGFuIHVwZGF0ZS4gIEJ1dCBhIHdhcm5pbmcgaXMKLWlzc3VlZCB1bmxlc3MgeW91IHNwZWNpZnkgaW4gYWR2YW5jZSB0aGF0IHlvdSBleHBlY3QgdG8gY3JlYXRlIGl0LCBieQotdXNpbmcgdGhpcyBtb2RpZmllci4KLQotQGl0ZW0gZgotVHJ1bmNhdGUgbmFtZXMgaW4gdGhlIGFyY2hpdmUuICBAc2N7Z251fSBAY29kZXthcn0gd2lsbCBub3JtYWxseSBwZXJtaXQgZmlsZQotbmFtZXMgb2YgYW55IGxlbmd0aC4gIFRoaXMgd2lsbCBjYXVzZSBpdCB0byBjcmVhdGUgYXJjaGl2ZXMgd2hpY2ggYXJlCi1ub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBuYXRpdmUgQGNvZGV7YXJ9IHByb2dyYW0gb24gc29tZSBzeXN0ZW1zLiAgSWYKLXRoaXMgaXMgYSBjb25jZXJuLCB0aGUgQHNhbXB7Zn0gbW9kaWZpZXIgbWF5IGJlIHVzZWQgdG8gdHJ1bmNhdGUgZmlsZQotbmFtZXMgd2hlbiBwdXR0aW5nIHRoZW0gaW4gdGhlIGFyY2hpdmUuCi0KLUBpdGVtIGkKLUluc2VydCBuZXcgZmlsZXMgQGVtcGh7YmVmb3JlfSBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgQHNhbXB7aX0sIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIEB2YXJ7cmVscG9zfSBhcmd1bWVudCwgYmVmb3JlIHRoZQotQHZhcnthcmNoaXZlfSBzcGVjaWZpY2F0aW9uLiAgKHNhbWUgYXMgQHNhbXB7Yn0pLgotCi1AaXRlbSBsCi1UaGlzIG1vZGlmaWVyIGlzIGFjY2VwdGVkIGJ1dCBub3QgdXNlZC4KLUBjIHdoYWZmb3IgYXIgbCBtb2RpZmllcj8/PyBwcmVzdW1hYmx5IGNvbXBhdDsgd2l0aAotQGMgd2hhdD8/Py0tLWRvY0BAY3lnbnVzLmNvbSwgMjVqYW45MSAKLQotQGl0ZW0gTgotVXNlcyB0aGUgQHZhcntjb3VudH0gcGFyYW1ldGVyLiAgVGhpcyBpcyB1c2VkIGlmIHRoZXJlIGFyZSBtdWx0aXBsZQotZW50cmllcyBpbiB0aGUgYXJjaGl2ZSB3aXRoIHRoZSBzYW1lIG5hbWUuICBFeHRyYWN0IG9yIGRlbGV0ZSBpbnN0YW5jZQotQHZhcntjb3VudH0gb2YgdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGUgYXJjaGl2ZS4KLQotQGl0ZW0gbwotQGNpbmRleCBkYXRlcyBpbiBhcmNoaXZlCi1QcmVzZXJ2ZSB0aGUgQGVtcGh7b3JpZ2luYWx9IGRhdGVzIG9mIG1lbWJlcnMgd2hlbiBleHRyYWN0aW5nIHRoZW0uICBJZgoteW91IGRvIG5vdCBzcGVjaWZ5IHRoaXMgbW9kaWZpZXIsIGZpbGVzIGV4dHJhY3RlZCBmcm9tIHRoZSBhcmNoaXZlCi1hcmUgc3RhbXBlZCB3aXRoIHRoZSB0aW1lIG9mIGV4dHJhY3Rpb24uCi0KLUBpdGVtIFAKLVVzZSB0aGUgZnVsbCBwYXRoIG5hbWUgd2hlbiBtYXRjaGluZyBuYW1lcyBpbiB0aGUgYXJjaGl2ZS4gIEBzY3tnbnV9Ci1AY29kZXthcn0gY2FuIG5vdCBjcmVhdGUgYW4gYXJjaGl2ZSB3aXRoIGEgZnVsbCBwYXRoIG5hbWUgKHN1Y2ggYXJjaGl2ZXMKLWFyZSBub3QgUE9TSVggY29tcGxhaW50KSwgYnV0IG90aGVyIGFyY2hpdmUgY3JlYXRvcnMgY2FuLiAgVGhpcyBvcHRpb24KLXdpbGwgY2F1c2UgQHNje2dudX0gQGNvZGV7YXJ9IHRvIG1hdGNoIGZpbGUgbmFtZXMgdXNpbmcgYSBjb21wbGV0ZSBwYXRoCi1uYW1lLCB3aGljaCBjYW4gYmUgY29udmVuaWVudCB3aGVuIGV4dHJhY3RpbmcgYSBzaW5nbGUgZmlsZSBmcm9tIGFuCi1hcmNoaXZlIGNyZWF0ZWQgYnkgYW5vdGhlciB0b29sLgotCi1AaXRlbSBzCi1AY2luZGV4IHdyaXRpbmcgYXJjaGl2ZSBpbmRleAotV3JpdGUgYW4gb2JqZWN0LWZpbGUgaW5kZXggaW50byB0aGUgYXJjaGl2ZSwgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIG9uZSwKLWV2ZW4gaWYgbm8gb3RoZXIgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIGFyY2hpdmUuICBZb3UgbWF5IHVzZSB0aGlzIG1vZGlmaWVyCi1mbGFnIGVpdGhlciB3aXRoIGFueSBvcGVyYXRpb24sIG9yIGFsb25lLiAgUnVubmluZyBAc2FtcHthciBzfSBvbiBhbgotYXJjaGl2ZSBpcyBlcXVpdmFsZW50IHRvIHJ1bm5pbmcgQHNhbXB7cmFubGlifSBvbiBpdC4KLQotQGl0ZW0gUwotQGNpbmRleCBub3Qgd3JpdGluZyBhcmNoaXZlIGluZGV4Ci1EbyBub3QgZ2VuZXJhdGUgYW4gYXJjaGl2ZSBzeW1ib2wgdGFibGUuICBUaGlzIGNhbiBzcGVlZCB1cCBidWlsZGluZyBhCi1sYXJnZSBsaWJyYXJ5IGluIHNldmVyYWwgc3RlcHMuICBUaGUgcmVzdWx0aW5nIGFyY2hpdmUgY2FuIG5vdCBiZSB1c2VkCi13aXRoIHRoZSBsaW5rZXIuICBJbiBvcmRlciB0byBidWlsZCBhIHN5bWJvbCB0YWJsZSwgeW91IG11c3Qgb21pdCB0aGUKLUBzYW1we1N9IG1vZGlmaWVyIG9uIHRoZSBsYXN0IGV4ZWN1dGlvbiBvZiBAc2FtcHthcn0sIG9yIHlvdSBtdXN0IHJ1bgotQHNhbXB7cmFubGlifSBvbiB0aGUgYXJjaGl2ZS4KLQotQGl0ZW0gdQotQGNpbmRleCB1cGRhdGluZyBhbiBhcmNoaXZlCi1Ob3JtYWxseSwgQHNhbXB7YXIgcn1AZG90c3t9IGluc2VydHMgYWxsIGZpbGVzCi1saXN0ZWQgaW50byB0aGUgYXJjaGl2ZS4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluc2VydCBAZW1waHtvbmx5fSB0aG9zZQotb2YgdGhlIGZpbGVzIHlvdSBsaXN0IHRoYXQgYXJlIG5ld2VyIHRoYW4gZXhpc3RpbmcgbWVtYmVycyBvZiB0aGUgc2FtZQotbmFtZXMsIHVzZSB0aGlzIG1vZGlmaWVyLiAgVGhlIEBzYW1we3V9IG1vZGlmaWVyIGlzIGFsbG93ZWQgb25seSBmb3IgdGhlCi1vcGVyYXRpb24gQHNhbXB7cn0gKHJlcGxhY2UpLiAgSW4gcGFydGljdWxhciwgdGhlIGNvbWJpbmF0aW9uIEBzYW1we3F1fSBpcwotbm90IGFsbG93ZWQsIHNpbmNlIGNoZWNraW5nIHRoZSB0aW1lc3RhbXBzIHdvdWxkIGxvc2UgYW55IHNwZWVkCi1hZHZhbnRhZ2UgZnJvbSB0aGUgb3BlcmF0aW9uIEBzYW1we3F9LgotCi1AaXRlbSB2Ci1UaGlzIG1vZGlmaWVyIHJlcXVlc3RzIHRoZSBAZW1waHt2ZXJib3NlfSB2ZXJzaW9uIG9mIGFuIG9wZXJhdGlvbi4gIE1hbnkKLW9wZXJhdGlvbnMgZGlzcGxheSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBzdWNoIGFzIGZpbGVuYW1lcyBwcm9jZXNzZWQsCi13aGVuIHRoZSBtb2RpZmllciBAc2FtcHt2fSBpcyBhcHBlbmRlZC4KLQotQGl0ZW0gVgotVGhpcyBtb2RpZmllciBzaG93cyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7YXJ9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBhciBzY3JpcHRzCi1Ac2VjdGlvbiBDb250cm9sbGluZyBAY29kZXthcn0gd2l0aCBhIHNjcmlwdAotCi1Ac21hbGxleGFtcGxlCi1hciAtTSBbIDxAdmFye3NjcmlwdH0gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBNUkkgY29tcGF0aWJpbGl0eSwgQGNvZGV7YXJ9Ci1AY2luZGV4IHNjcmlwdHMsIEBjb2Rle2FyfQotSWYgeW91IHVzZSB0aGUgc2luZ2xlIGNvbW1hbmQtbGluZSBvcHRpb24gQHNhbXB7LU19IHdpdGggQGNvZGV7YXJ9LCB5b3UKLWNhbiBjb250cm9sIGl0cyBvcGVyYXRpb24gd2l0aCBhIHJ1ZGltZW50YXJ5IGNvbW1hbmQgbGFuZ3VhZ2UuICBUaGlzCi1mb3JtIG9mIEBjb2Rle2FyfSBvcGVyYXRlcyBpbnRlcmFjdGl2ZWx5IGlmIHN0YW5kYXJkIGlucHV0IGlzIGNvbWluZwotZGlyZWN0bHkgZnJvbSBhIHRlcm1pbmFsLiAgRHVyaW5nIGludGVyYWN0aXZlIHVzZSwgQGNvZGV7YXJ9IHByb21wdHMgZm9yCi1pbnB1dCAodGhlIHByb21wdCBpcyBAc2FtcHtBUiA+fSksIGFuZCBjb250aW51ZXMgZXhlY3V0aW5nIGV2ZW4gYWZ0ZXIKLWVycm9ycy4gIElmIHlvdSByZWRpcmVjdCBzdGFuZGFyZCBpbnB1dCB0byBhIHNjcmlwdCBmaWxlLCBubyBwcm9tcHRzIGFyZQotaXNzdWVkLCBhbmQgQGNvZGV7YXJ9IGFiYW5kb25zIGV4ZWN1dGlvbiAod2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlKQotb24gYW55IGVycm9yLgotCi1UaGUgQGNvZGV7YXJ9IGNvbW1hbmQgbGFuZ3VhZ2UgaXMgQGVtcGh7bm90fSBkZXNpZ25lZCB0byBiZSBlcXVpdmFsZW50Ci10byB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnM7IGluIGZhY3QsIGl0IHByb3ZpZGVzIHNvbWV3aGF0IGxlc3MgY29udHJvbAotb3ZlciBhcmNoaXZlcy4gIFRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhlIGNvbW1hbmQgbGFuZ3VhZ2UgaXMgdG8gZWFzZSB0aGUKLXRyYW5zaXRpb24gdG8gQHNje2dudX0gQGNvZGV7YXJ9IGZvciBkZXZlbG9wZXJzIHdobyBhbHJlYWR5IGhhdmUgc2NyaXB0cwotd3JpdHRlbiBmb3IgdGhlIE1SSSBgYGxpYnJhcmlhbicnIHByb2dyYW0uCi0KLVRoZSBzeW50YXggZm9yIHRoZSBAY29kZXthcn0gY29tbWFuZCBsYW5ndWFnZSBpcyBzdHJhaWdodGZvcndhcmQ6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotY29tbWFuZHMgYXJlIHJlY29nbml6ZWQgaW4gdXBwZXIgb3IgbG93ZXIgY2FzZTsgZm9yIGV4YW1wbGUsIEBjb2Rle0xJU1R9Ci1pcyB0aGUgc2FtZSBhcyBAY29kZXtsaXN0fS4gIEluIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb25zLCBjb21tYW5kcyBhcmUKLXNob3duIGluIHVwcGVyIGNhc2UgZm9yIGNsYXJpdHkuCi0KLUBpdGVtCi1hIHNpbmdsZSBjb21tYW5kIG1heSBhcHBlYXIgb24gZWFjaCBsaW5lOyBpdCBpcyB0aGUgZmlyc3Qgd29yZCBvbiB0aGUKLWxpbmUuCi0KLUBpdGVtCi1lbXB0eSBsaW5lcyBhcmUgYWxsb3dlZCwgYW5kIGhhdmUgbm8gZWZmZWN0LgotCi1AaXRlbQotY29tbWVudHMgYXJlIGFsbG93ZWQ7IHRleHQgYWZ0ZXIgZWl0aGVyIG9mIHRoZSBjaGFyYWN0ZXJzIEBzYW1weyp9Ci1vciBAc2FtcHs7fSBpcyBpZ25vcmVkLgotCi1AaXRlbQotV2hlbmV2ZXIgeW91IHVzZSBhIGxpc3Qgb2YgbmFtZXMgYXMgcGFydCBvZiB0aGUgYXJndW1lbnQgdG8gYW4gQGNvZGV7YXJ9Ci1jb21tYW5kLCB5b3UgY2FuIHNlcGFyYXRlIHRoZSBpbmRpdmlkdWFsIG5hbWVzIHdpdGggZWl0aGVyIGNvbW1hcyBvcgotYmxhbmtzLiAgQ29tbWFzIGFyZSBzaG93biBpbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LCBmb3IgY2xhcml0eS4KLQotQGl0ZW0KLUBzYW1weyt9IGlzIHVzZWQgYXMgYSBsaW5lIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXI7IGlmIEBzYW1weyt9IGFwcGVhcnMKLWF0IHRoZSBlbmQgb2YgYSBsaW5lLCB0aGUgdGV4dCBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXMgY29uc2lkZXJlZCBwYXJ0Ci1vZiB0aGUgY3VycmVudCBjb21tYW5kLgotQGVuZCBpdGVtaXplCi0KLUhlcmUgYXJlIHRoZSBjb21tYW5kcyB5b3UgY2FuIHVzZSBpbiBAY29kZXthcn0gc2NyaXB0cywgb3Igd2hlbiB1c2luZwotQGNvZGV7YXJ9IGludGVyYWN0aXZlbHkuICBUaHJlZSBvZiB0aGVtIGhhdmUgc3BlY2lhbCBzaWduaWZpY2FuY2U6Ci0KLUBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0gc3BlY2lmeSBhIEBkZm57Y3VycmVudCBhcmNoaXZlfSwgd2hpY2ggaXMKLWEgdGVtcG9yYXJ5IGZpbGUgcmVxdWlyZWQgZm9yIG1vc3Qgb2YgdGhlIG90aGVyIGNvbW1hbmRzLgotCi1AY29kZXtTQVZFfSBjb21taXRzIHRoZSBjaGFuZ2VzIHNvIGZhciBzcGVjaWZpZWQgYnkgdGhlIHNjcmlwdC4gIFByaW9yCi10byBAY29kZXtTQVZFfSwgY29tbWFuZHMgYWZmZWN0IG9ubHkgdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBjdXJyZW50Ci1hcmNoaXZlLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEFERExJQiBAdmFye2FyY2hpdmV9IAotQGl0ZW14IEFERExJQiBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEB2YXJ7bW9kdWxlfSwgQGRvdHN7fSBAdmFye21vZHVsZX0pCi1BZGQgYWxsIHRoZSBjb250ZW50cyBvZiBAdmFye2FyY2hpdmV9IChvciwgaWYgc3BlY2lmaWVkLCBlYWNoIG5hbWVkCi1AdmFye21vZHVsZX0gZnJvbSBAdmFye2FyY2hpdmV9KSB0byB0aGUgY3VycmVudCBhcmNoaXZlLgotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gQURETU9EIEB2YXJ7bWVtYmVyfSwgQHZhcnttZW1iZXJ9LCBAZG90c3t9IEB2YXJ7bWVtYmVyfQotQGMgRklYTUUhIHcvUmVwbGFjZW1lbnQ/PyAgSWYgc28sIGxpa2UgImFyIHIgQHZhcnthcmNoaXZlfSBAdmFye25hbWVzfSIKLUBjICAgICAgICBlbHNlIGxpa2UgImFyIHEuLi4iCi1BZGQgZWFjaCBuYW1lZCBAdmFye21lbWJlcn0gYXMgYSBtb2R1bGUgaW4gdGhlIGN1cnJlbnQgYXJjaGl2ZS4KLQotUmVxdWlyZXMgcHJpb3IgdXNlIG9mIEBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0uCi0KLUBpdGVtIENMRUFSCi1EaXNjYXJkIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcmNoaXZlLCBjYW5jZWxpbmcgdGhlIGVmZmVjdCBvZgotYW55IG9wZXJhdGlvbnMgc2luY2UgdGhlIGxhc3QgQGNvZGV7U0FWRX0uICBNYXkgYmUgZXhlY3V0ZWQgKHdpdGggbm8KLWVmZmVjdCkgZXZlbiBpZiAgbm8gY3VycmVudCBhcmNoaXZlIGlzIHNwZWNpZmllZC4KLQotQGl0ZW0gQ1JFQVRFIEB2YXJ7YXJjaGl2ZX0KLUNyZWF0ZXMgYW4gYXJjaGl2ZSwgYW5kIG1ha2VzIGl0IHRoZSBjdXJyZW50IGFyY2hpdmUgKHJlcXVpcmVkIGZvciBtYW55Ci1vdGhlciBjb21tYW5kcykuICBUaGUgbmV3IGFyY2hpdmUgaXMgY3JlYXRlZCB3aXRoIGEgdGVtcG9yYXJ5IG5hbWU7IGl0Ci1pcyBub3QgYWN0dWFsbHkgc2F2ZWQgYXMgQHZhcnthcmNoaXZlfSB1bnRpbCB5b3UgdXNlIEBjb2Rle1NBVkV9LgotWW91IGNhbiBvdmVyd3JpdGUgZXhpc3RpbmcgYXJjaGl2ZXM7IHNpbWlsYXJseSwgdGhlIGNvbnRlbnRzIG9mIGFueQotZXhpc3RpbmcgZmlsZSBuYW1lZCBAdmFye2FyY2hpdmV9IHdpbGwgbm90IGJlIGRlc3Ryb3llZCB1bnRpbCBAY29kZXtTQVZFfS4KLQotQGl0ZW0gREVMRVRFIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotRGVsZXRlIGVhY2ggbGlzdGVkIEB2YXJ7bW9kdWxlfSBmcm9tIHRoZSBjdXJyZW50IGFyY2hpdmU7IGVxdWl2YWxlbnQgdG8KLUBzYW1we2FyIC1kIEB2YXJ7YXJjaGl2ZX0gQHZhcnttb2R1bGV9IEBkb3Rze30gQHZhcnttb2R1bGV9fS4KLQotUmVxdWlyZXMgcHJpb3IgdXNlIG9mIEBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0uCi0KLUBpdGVtIERJUkVDVE9SWSBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9KQotQGl0ZW14IERJUkVDVE9SWSBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9KSBAdmFye291dHB1dGZpbGV9Ci1MaXN0IGVhY2ggbmFtZWQgQHZhcnttb2R1bGV9IHByZXNlbnQgaW4gQHZhcnthcmNoaXZlfS4gIFRoZSBzZXBhcmF0ZQotY29tbWFuZCBAY29kZXtWRVJCT1NFfSBzcGVjaWZpZXMgdGhlIGZvcm0gb2YgdGhlIG91dHB1dDogd2hlbiB2ZXJib3NlCi1vdXRwdXQgaXMgb2ZmLCBvdXRwdXQgaXMgbGlrZSB0aGF0IG9mIEBzYW1we2FyIC10IEB2YXJ7YXJjaGl2ZX0KLUB2YXJ7bW9kdWxlfUBkb3Rze319LiAgV2hlbiB2ZXJib3NlIG91dHB1dCBpcyBvbiwgdGhlIGxpc3RpbmcgaXMgbGlrZQotQHNhbXB7YXIgLXR2IEB2YXJ7YXJjaGl2ZX0gQHZhcnttb2R1bGV9QGRvdHN7fX0uCi0KLU91dHB1dCBub3JtYWxseSBnb2VzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtOyBob3dldmVyLCBpZiB5b3UKLXNwZWNpZnkgQHZhcntvdXRwdXRmaWxlfSBhcyBhIGZpbmFsIGFyZ3VtZW50LCBAY29kZXthcn0gZGlyZWN0cyB0aGUKLW91dHB1dCB0byB0aGF0IGZpbGUuCi0KLUBpdGVtIEVORAotRXhpdCBmcm9tIEBjb2Rle2FyfSwgd2l0aCBhIEBjb2RlezB9IGV4aXQgY29kZSB0byBpbmRpY2F0ZSBzdWNjZXNzZnVsCi1jb21wbGV0aW9uLiAgVGhpcyBjb21tYW5kIGRvZXMgbm90IHNhdmUgdGhlIG91dHB1dCBmaWxlOyBpZiB5b3UgaGF2ZQotY2hhbmdlZCB0aGUgY3VycmVudCBhcmNoaXZlIHNpbmNlIHRoZSBsYXN0IEBjb2Rle1NBVkV9IGNvbW1hbmQsIHRob3NlCi1jaGFuZ2VzIGFyZSBsb3N0LgotCi1AaXRlbSBFWFRSQUNUIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotRXh0cmFjdCBlYWNoIG5hbWVkIEB2YXJ7bW9kdWxlfSBmcm9tIHRoZSBjdXJyZW50IGFyY2hpdmUsIHdyaXRpbmcgdGhlbQotaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXMgc2VwYXJhdGUgZmlsZXMuICBFcXVpdmFsZW50IHRvIEBzYW1we2FyIC14Ci1AdmFye2FyY2hpdmV9IEB2YXJ7bW9kdWxlfUBkb3Rze319LgotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGlnbm9yZQotQGMgRklYTUUgVG9rZW5zIGJ1dCBubyBjb21tYW5kcz8/PwotQGl0ZW0gRlVMTERJUgotCi1AaXRlbSBIRUxQCi1AZW5kIGlnbm9yZQotCi1AaXRlbSBMSVNUCi1EaXNwbGF5IGZ1bGwgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYXJjaGl2ZSwgaW4gYGB2ZXJib3NlJycgc3R5bGUKLXJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIEBjb2Rle1ZFUkJPU0V9LiAgVGhlIGVmZmVjdCBpcyBsaWtlIEBzYW1we2FyCi10diBAdmFye2FyY2hpdmV9fS4gIChUaGlzIHNpbmdsZSBjb21tYW5kIGlzIGEgQHNje2dudX0gQGNvZGV7YXJ9Ci1lbmhhbmNlbWVudCwgcmF0aGVyIHRoYW4gcHJlc2VudCBmb3IgTVJJIGNvbXBhdGliaWxpdHkuKQotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gT1BFTiBAdmFye2FyY2hpdmV9Ci1PcGVucyBhbiBleGlzdGluZyBhcmNoaXZlIGZvciB1c2UgYXMgdGhlIGN1cnJlbnQgYXJjaGl2ZSAocmVxdWlyZWQgZm9yCi1tYW55IG90aGVyIGNvbW1hbmRzKS4gIEFueSBjaGFuZ2VzIGFzIHRoZSByZXN1bHQgb2Ygc3Vic2VxdWVudCBjb21tYW5kcwotd2lsbCBub3QgYWN0dWFsbHkgYWZmZWN0IEB2YXJ7YXJjaGl2ZX0gdW50aWwgeW91IG5leHQgdXNlIEBjb2Rle1NBVkV9LgotCi1AaXRlbSBSRVBMQUNFIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotSW4gdGhlIGN1cnJlbnQgYXJjaGl2ZSwgcmVwbGFjZSBlYWNoIGV4aXN0aW5nIEB2YXJ7bW9kdWxlfSAobmFtZWQgaW4KLXRoZSBAY29kZXtSRVBMQUNFfSBhcmd1bWVudHMpIGZyb20gZmlsZXMgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi1UbyBleGVjdXRlIHRoaXMgY29tbWFuZCB3aXRob3V0IGVycm9ycywgYm90aCB0aGUgZmlsZSwgYW5kIHRoZSBtb2R1bGUgaW4KLXRoZSBjdXJyZW50IGFyY2hpdmUsIG11c3QgZXhpc3QuIAotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gVkVSQk9TRQotVG9nZ2xlIGFuIGludGVybmFsIGZsYWcgZ292ZXJuaW5nIHRoZSBvdXRwdXQgZnJvbSBAY29kZXtESVJFQ1RPUll9LgotV2hlbiB0aGUgZmxhZyBpcyBvbiwgQGNvZGV7RElSRUNUT1JZfSBvdXRwdXQgbWF0Y2hlcyBvdXRwdXQgZnJvbQotQHNhbXB7YXIgLXR2IH1AZG90c3t9LgotCi1AaXRlbSBTQVZFCi1Db21taXQgeW91ciBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGFyY2hpdmUsIGFuZCBhY3R1YWxseSBzYXZlIGl0IGFzIGEKLWZpbGUgd2l0aCB0aGUgbmFtZSBzcGVjaWZpZWQgaW4gdGhlIGxhc3QgQGNvZGV7Q1JFQVRFfSBvciBAY29kZXtPUEVOfQotY29tbWFuZC4gCi0KLVJlcXVpcmVzIHByaW9yIHVzZSBvZiBAY29kZXtPUEVOfSBvciBAY29kZXtDUkVBVEV9LgotCi1AZW5kIHRhYmxlCi0KLUBpZnRleAotQG5vZGUgbGQKLUBjaGFwdGVyIGxkCi1AY2luZGV4IGxpbmtlcgotQGtpbmRleCBsZAotVGhlIEBzY3tnbnV9IGxpbmtlciBAY29kZXtsZH0gaXMgbm93IGRlc2NyaWJlZCBpbiBhIHNlcGFyYXRlIG1hbnVhbC4KLUB4cmVme1RvcCwsIE92ZXJ2aWV3LCwgVXNpbmcgTEQ6IHRoZSBAc2N7Z251fSBsaW5rZXJ9LgotQGVuZCBpZnRleAotCi1Abm9kZSBubQotQGNoYXB0ZXIgbm0KLUBjaW5kZXggc3ltYm9scwotQGtpbmRleCBubQotCi1Ac21hbGxleGFtcGxlCi1ubSBbIC1hIHwgLS1kZWJ1Zy1zeW1zIF0gIFsgLWcgfCAtLWV4dGVybi1vbmx5IF0KLSAgIFsgLUIgXSAgWyAtQyB8IC0tZGVtYW5nbGUgXSBbIC1EIHwgLS1keW5hbWljIF0KLSAgIFsgLXMgfCAtLXByaW50LWFybWFwIF0gIFsgLUEgfCAtbyB8IC0tcHJpbnQtZmlsZS1uYW1lIF0KLSAgIFsgLW4gfCAtdiB8IC0tbnVtZXJpYy1zb3J0IF0gIFsgLXAgfCAtLW5vLXNvcnQgXQotICAgWyAtciB8IC0tcmV2ZXJzZS1zb3J0IF0gIFsgLS1zaXplLXNvcnQgXSBbIC11IHwgLS11bmRlZmluZWQtb25seSBdCi0gICBbIC10IEB2YXJ7cmFkaXh9IHwgLS1yYWRpeD1AdmFye3JhZGl4fSBdIFsgLVAgfCAtLXBvcnRhYmlsaXR5IF0KLSAgIFsgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdIFsgLWYgQHZhcntmb3JtYXR9IHwgLS1mb3JtYXQ9QHZhcntmb3JtYXR9IF0KLSAgIFsgLS1kZWZpbmVkLW9ubHkgXSBbLWwgfCAtLWxpbmUtbnVtYmVycyBdCi0gICBbIC0tbm8tZGVtYW5nbGUgXSBbIC1WIHwgLS12ZXJzaW9uIF0gIFsgLS1oZWxwIF0gIFsgQHZhcntvYmpmaWxlfUBkb3Rze30gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQHNje2dudX0gQGNvZGV7bm19IGxpc3RzIHRoZSBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzIEB2YXJ7b2JqZmlsZX1AZG90c3t9LgotSWYgbm8gb2JqZWN0IGZpbGVzIGFyZSBsaXN0ZWQgYXMgYXJndW1lbnRzLCBAY29kZXtubX0gYXNzdW1lcyB0aGUgZmlsZQotQGZpbGV7YS5vdXR9LgotCi1Gb3IgZWFjaCBzeW1ib2wsIEBjb2Rle25tfSBzaG93czoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSBzeW1ib2wgdmFsdWUsIGluIHRoZSByYWRpeCBzZWxlY3RlZCBieSBvcHRpb25zIChzZWUgYmVsb3cpLCBvcgotaGV4YWRlY2ltYWwgYnkgZGVmYXVsdC4KLQotQGl0ZW0KLVRoZSBzeW1ib2wgdHlwZS4gIEF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIHVzZWQ7IG90aGVycyBhcmUsIGFzCi13ZWxsLCBkZXBlbmRpbmcgb24gdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gIElmIGxvd2VyY2FzZSwgdGhlIHN5bWJvbCBpcwotbG9jYWw7IGlmIHVwcGVyY2FzZSwgdGhlIHN5bWJvbCBpcyBnbG9iYWwgKGV4dGVybmFsKS4KLQotQGMgU29tZSBtb3JlIGRldGFpbCBvbiBleGFjdGx5IHdoYXQgdGhlc2Ugc3ltYm9sIHR5cGVzIGFyZSB1c2VkIGZvcgotQGMgd291bGQgYmUgbmljZS4KLUB0YWJsZSBAY29kZQotQGl0ZW0gQQotVGhlIHN5bWJvbCdzIHZhbHVlIGlzIGFic29sdXRlLCBhbmQgd2lsbCBub3QgYmUgY2hhbmdlZCBieSBmdXJ0aGVyCi1saW5raW5nLgotCi1AaXRlbSBCCi1UaGUgc3ltYm9sIGlzIGluIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiAoa25vd24gYXMgQlNTKS4KLQotQGl0ZW0gQwotVGhlIHN5bWJvbCBpcyBjb21tb24uICBDb21tb24gc3ltYm9scyBhcmUgdW5pbml0aWFsaXplZCBkYXRhLiAgV2hlbgotbGlua2luZywgbXVsdGlwbGUgY29tbW9uIHN5bWJvbHMgbWF5IGFwcGVhciB3aXRoIHRoZSBzYW1lIG5hbWUuICBJZiB0aGUKLXN5bWJvbCBpcyBkZWZpbmVkIGFueXdoZXJlLCB0aGUgY29tbW9uIHN5bWJvbHMgYXJlIHRyZWF0ZWQgYXMgdW5kZWZpbmVkCi1yZWZlcmVuY2VzLiAgRm9yIG1vcmUgZGV0YWlscyBvbiBjb21tb24gc3ltYm9scywgc2VlIHRoZSBkaXNjdXNzaW9uIG9mCi0tLXdhcm4tY29tbW9uIGluIEByZWZ7T3B0aW9ucywsTGlua2VyIG9wdGlvbnMsbGQuaW5mbyxUaGUgR05VIGxpbmtlcn0uCi0KLUBpdGVtIEQKLVRoZSBzeW1ib2wgaXMgaW4gdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbi4KLQotQGl0ZW0gRwotVGhlIHN5bWJvbCBpcyBpbiBhbiBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24gZm9yIHNtYWxsIG9iamVjdHMuICBTb21lCi1vYmplY3QgZmlsZSBmb3JtYXRzIHBlcm1pdCBtb3JlIGVmZmljaWVudCBhY2Nlc3MgdG8gc21hbGwgZGF0YSBvYmplY3RzLAotc3VjaCBhcyBhIGdsb2JhbCBpbnQgdmFyaWFibGUgYXMgb3Bwb3NlZCB0byBhIGxhcmdlIGdsb2JhbCBhcnJheS4KLQotQGl0ZW0gSQotVGhlIHN5bWJvbCBpcyBhbiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gYW5vdGhlciBzeW1ib2wuICBUaGlzIGlzIGEgR05VCi1leHRlbnNpb24gdG8gdGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCB3aGljaCBpcyByYXJlbHkgdXNlZC4KLQotQGl0ZW0gTgotVGhlIHN5bWJvbCBpcyBhIGRlYnVnZ2luZyBzeW1ib2wuCi0KLUBpdGVtIFIKLVRoZSBzeW1ib2wgaXMgaW4gYSByZWFkIG9ubHkgZGF0YSBzZWN0aW9uLgotCi1AaXRlbSBTCi1UaGUgc3ltYm9sIGlzIGluIGFuIHVuaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIGZvciBzbWFsbCBvYmplY3RzLgotCi1AaXRlbSBUCi1UaGUgc3ltYm9sIGlzIGluIHRoZSB0ZXh0IChjb2RlKSBzZWN0aW9uLgotCi1AaXRlbSBVCi1UaGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4KLQotQGl0ZW0gVwotVGhlIHN5bWJvbCBpcyB3ZWFrLiAgV2hlbiBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgaXMgbGlua2VkIHdpdGggYSBub3JtYWwKLWRlZmluZWQgc3ltYm9sLCB0aGUgbm9ybWFsIGRlZmluZWQgc3ltYm9sIGlzIHVzZWQgd2l0aCBubyBlcnJvci4gIFdoZW4gYQotd2VhayB1bmRlZmluZWQgc3ltYm9sIGlzIGxpbmtlZCBhbmQgdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZCwgdGhlIHZhbHVlCi1vZiB0aGUgd2VhayBzeW1ib2wgYmVjb21lcyB6ZXJvIHdpdGggbm8gZXJyb3IuCi0KLUBpdGVtIC0KLVRoZSBzeW1ib2wgaXMgYSBzdGFicyBzeW1ib2wgaW4gYW4gYS5vdXQgb2JqZWN0IGZpbGUuICBJbiB0aGlzIGNhc2UsIHRoZQotbmV4dCB2YWx1ZXMgcHJpbnRlZCBhcmUgdGhlIHN0YWJzIG90aGVyIGZpZWxkLCB0aGUgc3RhYnMgZGVzYyBmaWVsZCwgYW5kCi10aGUgc3RhYiB0eXBlLiAgU3RhYnMgc3ltYm9scyBhcmUgdXNlZCB0byBob2xkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbjsKLWZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQHJlZntUb3AsU3RhYnMsU3RhYnMgT3ZlcnZpZXcsc3RhYnMuaW5mbywgVGhlCi1gYHN0YWJzJycgZGVidWcgZm9ybWF0fS4KLQotQGl0ZW0gPwotVGhlIHN5bWJvbCB0eXBlIGlzIHVua25vd24sIG9yIG9iamVjdCBmaWxlIGZvcm1hdCBzcGVjaWZpYy4KLUBlbmQgdGFibGUKLQotQGl0ZW0KLVRoZSBzeW1ib2wgbmFtZS4KLUBlbmQgaXRlbWl6ZQotCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtQQotQGl0ZW14IC1vCi1AaXRlbXggLS1wcmludC1maWxlLW5hbWUgCi1AY2luZGV4IGlucHV0IGZpbGUgbmFtZQotQGNpbmRleCBmaWxlIG5hbWUKLUBjaW5kZXggc291cmNlIGZpbGUgbmFtZQotUHJlY2VkZSBlYWNoIHN5bWJvbCBieSB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSAob3IgYXJjaGl2ZSBtZW1iZXIpCi1pbiB3aGljaCBpdCB3YXMgZm91bmQsIHJhdGhlciB0aGFuIGlkZW50aWZ5aW5nIHRoZSBpbnB1dCBmaWxlIG9uY2Ugb25seSwKLWJlZm9yZSBhbGwgb2YgaXRzIHN5bWJvbHMuCi0KLUBpdGVtIC1hCi1AaXRlbXggLS1kZWJ1Zy1zeW1zIAotQGNpbmRleCBkZWJ1Z2dpbmcgc3ltYm9scwotRGlzcGxheSBhbGwgc3ltYm9scywgZXZlbiBkZWJ1Z2dlci1vbmx5IHN5bWJvbHM7IG5vcm1hbGx5IHRoZXNlIGFyZSBub3QKLWxpc3RlZC4KLQotQGl0ZW0gLUIKLUBjaW5kZXggQGNvZGV7bm19IGZvcm1hdAotQGNpbmRleCBAY29kZXtubX0gY29tcGF0aWJpbGl0eQotVGhlIHNhbWUgYXMgQHNhbXB7LS1mb3JtYXQ9YnNkfSAoZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTUlQUyBAY29kZXtubX0pLgotCi1AaXRlbSAtQwotQGl0ZW14IC0tZGVtYW5nbGUKLUBjaW5kZXggZGVtYW5nbGluZyBpbiBubQotRGVjb2RlIChAZGZue2RlbWFuZ2xlfSkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCi1CZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKLW1ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4gIEB4cmVme2MrK2ZpbHR9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotb24gZGVtYW5nbGluZy4KLQotQGl0ZW0gLS1uby1kZW1hbmdsZQotRG8gbm90IGRlbWFuZ2xlIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMuICBUaGlzIGlzIHRoZSBkZWZhdWx0LgotCi1AaXRlbSAtRAotQGl0ZW14IC0tZHluYW1pYwotQGNpbmRleCBkeW5hbWljIHN5bWJvbHMKLURpc3BsYXkgdGhlIGR5bmFtaWMgc3ltYm9scyByYXRoZXIgdGhhbiB0aGUgbm9ybWFsIHN5bWJvbHMuICBUaGlzIGlzCi1vbmx5IG1lYW5pbmdmdWwgZm9yIGR5bmFtaWMgb2JqZWN0cywgc3VjaCBhcyBjZXJ0YWluIHR5cGVzIG9mIHNoYXJlZAotbGlicmFyaWVzLgotCi1AaXRlbSAtZiBAdmFye2Zvcm1hdH0KLUBpdGVteCAtLWZvcm1hdD1AdmFye2Zvcm1hdH0KLUBjaW5kZXggQGNvZGV7bm19IGZvcm1hdAotQGNpbmRleCBAY29kZXtubX0gY29tcGF0aWJpbGl0eQotVXNlIHRoZSBvdXRwdXQgZm9ybWF0IEB2YXJ7Zm9ybWF0fSwgd2hpY2ggY2FuIGJlIEBjb2Rle2JzZH0sCi1AY29kZXtzeXN2fSwgb3IgQGNvZGV7cG9zaXh9LiAgVGhlIGRlZmF1bHQgaXMgQGNvZGV7YnNkfS4KLU9ubHkgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBAdmFye2Zvcm1hdH0gaXMgc2lnbmlmaWNhbnQ7IGl0IGNhbiBiZQotZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UuCi0KLUBpdGVtIC1nCi1AaXRlbXggLS1leHRlcm4tb25seSAKLUBjaW5kZXggZXh0ZXJuYWwgc3ltYm9scwotRGlzcGxheSBvbmx5IGV4dGVybmFsIHN5bWJvbHMuCi0KLUBpdGVtIC1sCi1AaXRlbXggLS1saW5lLW51bWJlcnMKLUBjaW5kZXggc3ltYm9sIGxpbmUgbnVtYmVycwotRm9yIGVhY2ggc3ltYm9sLCB1c2UgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIHRyeSB0byBmaW5kIGEgZmlsZW5hbWUgYW5kCi1saW5lIG51bWJlci4gIEZvciBhIGRlZmluZWQgc3ltYm9sLCBsb29rIGZvciB0aGUgbGluZSBudW1iZXIgb2YgdGhlCi1hZGRyZXNzIG9mIHRoZSBzeW1ib2wuICBGb3IgYW4gdW5kZWZpbmVkIHN5bWJvbCwgbG9vayBmb3IgdGhlIGxpbmUKLW51bWJlciBvZiBhIHJlbG9jYXRpb24gZW50cnkgd2hpY2ggcmVmZXJzIHRvIHRoZSBzeW1ib2wuICBJZiBsaW5lIG51bWJlcgotaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kLCBwcmludCBpdCBhZnRlciB0aGUgb3RoZXIgc3ltYm9sIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtbgotQGl0ZW14IC12Ci1AaXRlbXggLS1udW1lcmljLXNvcnQgCi1Tb3J0IHN5bWJvbHMgbnVtZXJpY2FsbHkgYnkgdGhlaXIgYWRkcmVzc2VzLCByYXRoZXIgdGhhbiBhbHBoYWJldGljYWxseQotYnkgdGhlaXIgbmFtZXMuIAotCi1AaXRlbSAtcAotQGl0ZW14IC0tbm8tc29ydCAKLUBjaW5kZXggc29ydGluZyBzeW1ib2xzCi1EbyBub3QgYm90aGVyIHRvIHNvcnQgdGhlIHN5bWJvbHMgaW4gYW55IG9yZGVyOyBwcmludCB0aGVtIGluIHRoZSBvcmRlcgotZW5jb3VudGVyZWQuCi0KLUBpdGVtIC1QCi1AaXRlbXggLS1wb3J0YWJpbGl0eQotVXNlIHRoZSBQT1NJWC4yIHN0YW5kYXJkIG91dHB1dCBmb3JtYXQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBmb3JtYXQuCi1FcXVpdmFsZW50IHRvIEBzYW1wey1mIHBvc2l4fS4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLXByaW50LWFybWFwCi1AY2luZGV4IHN5bWJvbCBpbmRleCwgbGlzdGluZwotV2hlbiBsaXN0aW5nIHN5bWJvbHMgZnJvbSBhcmNoaXZlIG1lbWJlcnMsIGluY2x1ZGUgdGhlIGluZGV4OiBhIG1hcHBpbmcKLShzdG9yZWQgaW4gdGhlIGFyY2hpdmUgYnkgQGNvZGV7YXJ9IG9yIEBjb2Rle3JhbmxpYn0pIG9mIHdoaWNoIG1vZHVsZXMKLWNvbnRhaW4gZGVmaW5pdGlvbnMgZm9yIHdoaWNoIG5hbWVzLgotCi1AaXRlbSAtcgotQGl0ZW14IC0tcmV2ZXJzZS1zb3J0IAotUmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIHNvcnQgKHdoZXRoZXIgbnVtZXJpYyBvciBhbHBoYWJldGljKTsgbGV0IHRoZQotbGFzdCBjb21lIGZpcnN0LgotCi1AaXRlbSAtLXNpemUtc29ydAotU29ydCBzeW1ib2xzIGJ5IHNpemUuICBUaGUgc2l6ZSBpcyBjb21wdXRlZCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi10aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgd2l0aCB0aGUgbmV4dCBoaWdoZXIKLXZhbHVlLiAgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBpcyBwcmludGVkLCByYXRoZXIgdGhhbiB0aGUgdmFsdWUuCi0KLUBpdGVtIC10IEB2YXJ7cmFkaXh9Ci1AaXRlbXggLS1yYWRpeD1AdmFye3JhZGl4fQotVXNlIEB2YXJ7cmFkaXh9IGFzIHRoZSByYWRpeCBmb3IgcHJpbnRpbmcgdGhlIHN5bWJvbCB2YWx1ZXMuICBJdCBtdXN0IGJlCi1Ac2FtcHtkfSBmb3IgZGVjaW1hbCwgQHNhbXB7b30gZm9yIG9jdGFsLCBvciBAc2FtcHt4fSBmb3IgaGV4YWRlY2ltYWwuCi0KLUBpdGVtIC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUBjaW5kZXggb2JqZWN0IGNvZGUgZm9ybWF0Ci1TcGVjaWZ5IGFuIG9iamVjdCBjb2RlIGZvcm1hdCBvdGhlciB0aGFuIHlvdXIgc3lzdGVtJ3MgZGVmYXVsdCBmb3JtYXQuCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC11Ci1AaXRlbXggLS11bmRlZmluZWQtb25seSAKLUBjaW5kZXggZXh0ZXJuYWwgc3ltYm9scwotQGNpbmRleCB1bmRlZmluZWQgc3ltYm9scwotRGlzcGxheSBvbmx5IHVuZGVmaW5lZCBzeW1ib2xzICh0aG9zZSBleHRlcm5hbCB0byBlYWNoIG9iamVjdCBmaWxlKS4KLQotQGl0ZW0gLS1kZWZpbmVkLW9ubHkKLUBjaW5kZXggZXh0ZXJuYWwgc3ltYm9scwotQGNpbmRleCB1bmRlZmluZWQgc3ltYm9scwotRGlzcGxheSBvbmx5IGRlZmluZWQgc3ltYm9scyBmb3IgZWFjaCBvYmplY3QgZmlsZS4KLQotQGl0ZW0gLVYKLUBpdGVteCAtLXZlcnNpb24KLVNob3cgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEBjb2Rle25tfSBhbmQgZXhpdC4KLQotQGl0ZW0gLS1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0byBAY29kZXtubX0gYW5kIGV4aXQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIG9iamNvcHkKLUBjaGFwdGVyIG9iamNvcHkKLQotQHNtYWxsZXhhbXBsZQotb2JqY29weSBbIC1GIEB2YXJ7YmZkbmFtZX0gfCAtLXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgICAgWyAtSSBAdmFye2JmZG5hbWV9IHwgLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICAgIFsgLU8gQHZhcntiZmRuYW1lfSB8IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgICAgWyAtUyB8IC0tc3RyaXAtYWxsIF0gIFsgLWcgfCAtLXN0cmlwLWRlYnVnIF0KLSAgICAgICAgWyAtSyBAdmFye3N5bWJvbG5hbWV9IHwgLS1rZWVwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgICAgWyAtTiBAdmFye3N5bWJvbG5hbWV9IHwgLS1zdHJpcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfSBdCi0gICAgICAgIFsgLUwgQHZhcntzeW1ib2xuYW1lfSB8IC0tbG9jYWxpemUtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0gXQotICAgICAgICBbIC1XIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLXdlYWtlbi1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfSBdCi0gICAgICAgIFsgLXggfCAtLWRpc2NhcmQtYWxsIF0gIFsgLVggfCAtLWRpc2NhcmQtbG9jYWxzIF0KLSAgICAgICAgWyAtYiBAdmFye2J5dGV9IHwgLS1ieXRlPUB2YXJ7Ynl0ZX0gXQotICAgICAgICBbIC1pIEB2YXJ7aW50ZXJsZWF2ZX0gfCAtLWludGVybGVhdmU9QHZhcntpbnRlcmxlYXZlfSBdCi0gICAgICAgIFsgLWogQHZhcntzZWN0aW9ubmFtZX0gfCAtLW9ubHktc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfSBdCi0gICAgICAgIFsgLVIgQHZhcntzZWN0aW9ubmFtZX0gfCAtLXJlbW92ZS1zZWN0aW9uPUB2YXJ7c2VjdGlvbm5hbWV9IF0KLSAgICAgICAgWyAtcCB8IC0tcHJlc2VydmUtZGF0ZXMgXSBbIC0tZGVidWdnaW5nIF0KLSAgICAgICAgWyAtLWdhcC1maWxsPUB2YXJ7dmFsfSBdIFsgLS1wYWQtdG89QHZhcnthZGRyZXNzfSBdCi0gICAgICAgIFsgLS1zZXQtc3RhcnQ9QHZhcnt2YWx9IF0gWyAtLWFkanVzdC1zdGFydD1AdmFye2luY3J9IF0KLSAgICAgICAgWyAtLWNoYW5nZS1hZGRyZXNzZXM9QHZhcntpbmNyfSBdCi0gICAgICAgIFsgLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzPUB2YXJ7c2VjdGlvbn1Aez0sKywtQH1AdmFye3ZhbH0gXQotICAgICAgICBbIC0tY2hhbmdlLXNlY3Rpb24tbG1hPUB2YXJ7c2VjdGlvbn1Aez0sKywtQH1AdmFye3ZhbH0gXQotICAgICAgICBbIC0tY2hhbmdlLXNlY3Rpb24tdm1hPUB2YXJ7c2VjdGlvbn1Aez0sKywtQH1AdmFye3ZhbH0gXQotICAgICAgICBbIC0tY2hhbmdlLXdhcm5pbmdzIF0gWyAtLW5vLWNoYW5nZS13YXJuaW5ncyBdCi0gICAgICAgIFsgLS1zZXQtc2VjdGlvbi1mbGFncz1AdmFye3NlY3Rpb259PUB2YXJ7ZmxhZ3N9IF0KLSAgICAgICAgWyAtLWFkZC1zZWN0aW9uPUB2YXJ7c2VjdGlvbm5hbWV9PUB2YXJ7ZmlsZW5hbWV9IF0KLSAgICAgICAgWyAtLWNoYW5nZS1sZWFkaW5nLWNoYXIgXSBbIC0tcmVtb3ZlLWxlYWRpbmctY2hhciBdCi0gICAgICAgIFsgLS13ZWFrZW4gXQotICAgICAgICBbIC12IHwgLS12ZXJib3NlIF0gWyAtViB8IC0tdmVyc2lvbiBdICBbIC0taGVscCBdCi0gICAgICAgIEB2YXJ7aW5maWxlfSBbQHZhcntvdXRmaWxlfV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAc2N7Z251fSBAY29kZXtvYmpjb3B5fSB1dGlsaXR5IGNvcGllcyB0aGUgY29udGVudHMgb2YgYW4gb2JqZWN0Ci1maWxlIHRvIGFub3RoZXIuICBAY29kZXtvYmpjb3B5fSB1c2VzIHRoZSBAc2N7Z251fSBAc2N7YmZkfSBMaWJyYXJ5IHRvCi1yZWFkIGFuZCB3cml0ZSB0aGUgb2JqZWN0IGZpbGVzLiAgSXQgY2FuIHdyaXRlIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QKLWZpbGUgaW4gYSBmb3JtYXQgZGlmZmVyZW50IGZyb20gdGhhdCBvZiB0aGUgc291cmNlIG9iamVjdCBmaWxlLiAgVGhlCi1leGFjdCBiZWhhdmlvciBvZiBAY29kZXtvYmpjb3B5fSBpcyBjb250cm9sbGVkIGJ5IGNvbW1hbmQtbGluZSBvcHRpb25zLgotCi1AY29kZXtvYmpjb3B5fSBjcmVhdGVzIHRlbXBvcmFyeSBmaWxlcyB0byBkbyBpdHMgdHJhbnNsYXRpb25zIGFuZAotZGVsZXRlcyB0aGVtIGFmdGVyd2FyZC4gIEBjb2Rle29iamNvcHl9IHVzZXMgQHNje2JmZH0gdG8gZG8gYWxsIGl0cwotdHJhbnNsYXRpb24gd29yazsgaXQgaGFzIGFjY2VzcyB0byBhbGwgdGhlIGZvcm1hdHMgZGVzY3JpYmVkIGluIEBzY3tiZmR9Ci1hbmQgdGh1cyBpcyBhYmxlIHRvIHJlY29nbml6ZSBtb3N0IGZvcm1hdHMgd2l0aG91dCBiZWluZyB0b2xkCi1leHBsaWNpdGx5LiAgQHhyZWZ7QkZELCxCRkQsbGQuaW5mbyxVc2luZyBMRH0uCi0KLUBjb2Rle29iamNvcHl9IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFMtcmVjb3JkcyBieSB1c2luZyBhbiBvdXRwdXQKLXRhcmdldCBvZiBAc2FtcHtzcmVjfSAoZS5nLiwgdXNlIEBzYW1wey1PIHNyZWN9KS4KLQotQGNvZGV7b2JqY29weX0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSByYXcgYmluYXJ5IGZpbGUgYnkgdXNpbmcgYW4KLW91dHB1dCB0YXJnZXQgb2YgQHNhbXB7YmluYXJ5fSAoZS5nLiwgdXNlIEBzYW1wey1PIGJpbmFyeX0pLiAgV2hlbgotQGNvZGV7b2JqY29weX0gZ2VuZXJhdGVzIGEgcmF3IGJpbmFyeSBmaWxlLCBpdCB3aWxsIGVzc2VudGlhbGx5IHByb2R1Y2UKLWEgbWVtb3J5IGR1bXAgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBvYmplY3QgZmlsZS4gIEFsbCBzeW1ib2xzIGFuZAotcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB3aWxsIGJlIGRpc2NhcmRlZC4gIFRoZSBtZW1vcnkgZHVtcCB3aWxsIHN0YXJ0IGF0Ci10aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBsb3dlc3Qgc2VjdGlvbiBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuCi0KLVdoZW4gZ2VuZXJhdGluZyBhbiBTLXJlY29yZCBvciBhIHJhdyBiaW5hcnkgZmlsZSwgaXQgbWF5IGJlIGhlbHBmdWwgdG8KLXVzZSBAc2FtcHstU30gdG8gcmVtb3ZlIHNlY3Rpb25zIGNvbnRhaW5pbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgSW4KLXNvbWUgY2FzZXMgQHNhbXB7LVJ9IHdpbGwgYmUgdXNlZnVsIHRvIHJlbW92ZSBzZWN0aW9ucyB3aGljaCBjb250YWluCi1pbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCBuZWVkZWQgYnkgdGhlIGJpbmFyeSBmaWxlLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEB2YXJ7aW5maWxlfQotQGl0ZW14IEB2YXJ7b3V0ZmlsZX0KLVRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLCByZXNwZWN0aXZlbHkuCi1JZiB5b3UgZG8gbm90IHNwZWNpZnkgQHZhcntvdXRmaWxlfSwgQGNvZGV7b2JqY29weX0gY3JlYXRlcyBhCi10ZW1wb3JhcnkgZmlsZSBhbmQgZGVzdHJ1Y3RpdmVseSByZW5hbWVzIHRoZSByZXN1bHQgd2l0aAotdGhlIG5hbWUgb2YgQHZhcntpbmZpbGV9LgotCi1AaXRlbSAtSSBAdmFye2JmZG5hbWV9CQotQGl0ZW14IC0taW5wdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUNvbnNpZGVyIHRoZSBzb3VyY2UgZmlsZSdzIG9iamVjdCBmb3JtYXQgdG8gYmUgQHZhcntiZmRuYW1lfSwgcmF0aGVyIHRoYW4KLWF0dGVtcHRpbmcgdG8gZGVkdWNlIGl0LiAgQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtTyBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLVdyaXRlIHRoZSBvdXRwdXQgZmlsZSB1c2luZyB0aGUgb2JqZWN0IGZvcm1hdCBAdmFye2JmZG5hbWV9LgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtRiBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotVXNlIEB2YXJ7YmZkbmFtZX0gYXMgdGhlIG9iamVjdCBmb3JtYXQgZm9yIGJvdGggdGhlIGlucHV0IGFuZCB0aGUgb3V0cHV0Ci1maWxlOyBpLmUuLCBzaW1wbHkgdHJhbnNmZXIgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aXRoIG5vCi10cmFuc2xhdGlvbi4gIEB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLWogQHZhcntzZWN0aW9ubmFtZX0KLUBpdGVteCAtLW9ubHktc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfQotQ29weSBvbmx5IHRoZSBuYW1lZCBzZWN0aW9uIGZyb20gdGhlIGlucHV0IGZpbGUgdG8gdGhlIG91dHB1dCBmaWxlLgotVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uCi1pbmFwcHJvcHJpYXRlbHkgbWF5IG1ha2UgdGhlIG91dHB1dCBmaWxlIHVudXNhYmxlLgotCi1AaXRlbSAtUiBAdmFye3NlY3Rpb25uYW1lfQotQGl0ZW14IC0tcmVtb3ZlLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0KLVJlbW92ZSBhbnkgc2VjdGlvbiBuYW1lZCBAdmFye3NlY3Rpb25uYW1lfSBmcm9tIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMKLW9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24KLWluYXBwcm9wcmlhdGVseSBtYXkgbWFrZSB0aGUgb3V0cHV0IGZpbGUgdW51c2FibGUuCi0KLUBpdGVtIC1TCi1AaXRlbXggLS1zdHJpcC1hbGwKLURvIG5vdCBjb3B5IHJlbG9jYXRpb24gYW5kIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLQotQGl0ZW0gLWcKLUBpdGVteCAtLXN0cmlwLWRlYnVnCi1EbyBub3QgY29weSBkZWJ1Z2dpbmcgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLQotQGl0ZW0gLS1zdHJpcC11bm5lZWRlZAotU3RyaXAgYWxsIHN5bWJvbHMgdGhhdCBhcmUgbm90IG5lZWRlZCBmb3IgcmVsb2NhdGlvbiBwcm9jZXNzaW5nLgotCi1AaXRlbSAtSyBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS1rZWVwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1Db3B5IG9ubHkgc3ltYm9sIEB2YXJ7c3ltYm9sbmFtZX0gZnJvbSB0aGUgc291cmNlIGZpbGUuICBUaGlzIG9wdGlvbiBtYXkKLWJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAtTiBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS1zdHJpcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQotRG8gbm90IGNvcHkgc3ltYm9sIEB2YXJ7c3ltYm9sbmFtZX0gZnJvbSB0aGUgc291cmNlIGZpbGUuICBUaGlzIG9wdGlvbgotbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAtTCBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS1sb2NhbGl6ZS1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQotTWFrZSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBsb2NhbCB0byB0aGUgZmlsZSwgc28gdGhhdCBpdCBpcyBub3QKLXZpc2libGUgZXh0ZXJuYWxseS4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLQotQGl0ZW0gLVcgQHZhcntzeW1ib2xuYW1lfQotQGl0ZW14IC0td2Vha2VuLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1NYWtlIHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IHdlYWsuIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLQotQGl0ZW0gLXgKLUBpdGVteCAtLWRpc2NhcmQtYWxsCi1EbyBub3QgY29weSBub24tZ2xvYmFsIHN5bWJvbHMgZnJvbSB0aGUgc291cmNlIGZpbGUuCi1AYyBGSVhNRSBhbnkgcmVhc29uIHRvIHByZWZlciAibm9uLWdsb2JhbCIgdG8gImxvY2FsIiBoZXJlPwotCi1AaXRlbSAtWAotQGl0ZW14IC0tZGlzY2FyZC1sb2NhbHMKLURvIG5vdCBjb3B5IGNvbXBpbGVyLWdlbmVyYXRlZCBsb2NhbCBzeW1ib2xzLgotKFRoZXNlIHVzdWFsbHkgc3RhcnQgd2l0aCBAc2FtcHtMfSBvciBAc2FtcHsufS4pCi0KLUBpdGVtIC1iIEB2YXJ7Ynl0ZX0KLUBpdGVteCAtLWJ5dGU9QHZhcntieXRlfQotS2VlcCBvbmx5IGV2ZXJ5IEB2YXJ7Ynl0ZX10aCBieXRlIG9mIHRoZSBpbnB1dCBmaWxlIChoZWFkZXIgZGF0YSBpcyBub3QKLWFmZmVjdGVkKS4gIEB2YXJ7Ynl0ZX0gY2FuIGJlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gQHZhcntpbnRlcmxlYXZlfS0xLAotd2hlcmUgQHZhcntpbnRlcmxlYXZlfSBpcyBnaXZlbiBieSB0aGUgQHNhbXB7LWl9IG9yIEBzYW1wey0taW50ZXJsZWF2ZX0KLW9wdGlvbiwgb3IgdGhlIGRlZmF1bHQgb2YgNC4gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgZmlsZXMKLXRvIHByb2dyYW0gQHNje3JvbX0uICBJdCBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIGFuIEBjb2Rle3NyZWN9IG91dHB1dAotdGFyZ2V0LgotCi1AaXRlbSAtaSBAdmFye2ludGVybGVhdmV9Ci1AaXRlbXggLS1pbnRlcmxlYXZlPUB2YXJ7aW50ZXJsZWF2ZX0KLU9ubHkgY29weSBvbmUgb3V0IG9mIGV2ZXJ5IEB2YXJ7aW50ZXJsZWF2ZX0gYnl0ZXMuICBTZWxlY3Qgd2hpY2ggYnl0ZSB0bwotY29weSB3aXRoIHRoZSBAdmFyey1ifSBvciBAc2FtcHstLWJ5dGV9IG9wdGlvbi4gIFRoZSBkZWZhdWx0IGlzIDQuCi1AY29kZXtvYmpjb3B5fSBpZ25vcmVzIHRoaXMgb3B0aW9uIGlmIHlvdSBkbyBub3Qgc3BlY2lmeSBlaXRoZXIgQHNhbXB7LWJ9IG9yCi1Ac2FtcHstLWJ5dGV9LgotCi1AaXRlbSAtcAotQGl0ZW14IC0tcHJlc2VydmUtZGF0ZXMKLVNldCB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZXMgb2YgdGhlIG91dHB1dCBmaWxlIHRvIGJlIHRoZSBzYW1lCi1hcyB0aG9zZSBvZiB0aGUgaW5wdXQgZmlsZS4KLQotQGl0ZW0gLS1kZWJ1Z2dpbmcKLUNvbnZlcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBpZiBwb3NzaWJsZS4gIFRoaXMgaXMgbm90IHRoZSBkZWZhdWx0Ci1iZWNhdXNlIG9ubHkgY2VydGFpbiBkZWJ1Z2dpbmcgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLCBhbmQgdGhlCi1jb252ZXJzaW9uIHByb2Nlc3MgY2FuIGJlIHRpbWUgY29uc3VtaW5nLgotCi1AaXRlbSAtLWdhcC1maWxsIEB2YXJ7dmFsfQotRmlsbCBnYXBzIGJldHdlZW4gc2VjdGlvbnMgd2l0aCBAdmFye3ZhbH0uICBUaGlzIG9wZXJhdGlvbiBhcHBsaWVzIHRvCi10aGUgQGVtcGh7bG9hZCBhZGRyZXNzfSAoTE1BKSBvZiB0aGUgc2VjdGlvbnMuICBJdCBpcyBkb25lIGJ5IGluY3JlYXNpbmcKLXRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIHdpdGggdGhlIGxvd2VyIGFkZHJlc3MsIGFuZCBmaWxsaW5nIGluIHRoZSBleHRyYQotc3BhY2UgY3JlYXRlZCB3aXRoIEB2YXJ7dmFsfS4KLQotQGl0ZW0gLS1wYWQtdG8gQHZhcnthZGRyZXNzfQotUGFkIHRoZSBvdXRwdXQgZmlsZSB1cCB0byB0aGUgbG9hZCBhZGRyZXNzIEB2YXJ7YWRkcmVzc30uICBUaGlzIGlzCi1kb25lIGJ5IGluY3JlYXNpbmcgdGhlIHNpemUgb2YgdGhlIGxhc3Qgc2VjdGlvbi4gIFRoZSBleHRyYSBzcGFjZSBpcwotZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlIHNwZWNpZmllZCBieSBAc2FtcHstLWdhcC1maWxsfSAoZGVmYXVsdCB6ZXJvKS4KLQotQGl0ZW0gLS1zZXQtc3RhcnQgQHZhcnt2YWx9Ci1TZXQgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5ldyBmaWxlIHRvIEB2YXJ7dmFsfS4gIE5vdCBhbGwgb2JqZWN0IGZpbGUKLWZvcm1hdHMgc3VwcG9ydCBzZXR0aW5nIHRoZSBzdGFydCBhZGRyZXNzLgotCi1AaXRlbSAtLWNoYW5nZS1zdGFydCBAdmFye2luY3J9Ci1AaXRlbXggLS1hZGp1c3Qtc3RhcnQgQHZhcntpbmNyfQotQGNpbmRleCBjaGFuZ2luZyBzdGFydCBhZGRyZXNzCi1DaGFuZ2UgdGhlIHN0YXJ0IGFkZHJlc3MgYnkgYWRkaW5nIEB2YXJ7aW5jcn0uICBOb3QgYWxsIG9iamVjdCBmaWxlCi1mb3JtYXRzIHN1cHBvcnQgc2V0dGluZyB0aGUgc3RhcnQgYWRkcmVzcy4KLQotQGl0ZW0gLS1jaGFuZ2UtYWRkcmVzc2VzIEB2YXJ7aW5jcn0KLUBpdGVteCAtLWFkanVzdC12bWEgQHZhcntpbmNyfQotQGNpbmRleCBjaGFuZ2luZyBvYmplY3QgYWRkcmVzc2VzCi1DaGFuZ2UgdGhlIFZNQSBhbmQgTE1BIGFkZHJlc3NlcyBvZiBhbGwgc2VjdGlvbnMsIGFzIHdlbGwgYXMgdGhlIHN0YXJ0Ci1hZGRyZXNzLCBieSBhZGRpbmcgQHZhcntpbmNyfS4gIFNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyBkbyBub3QgcGVybWl0Ci1zZWN0aW9uIGFkZHJlc3NlcyB0byBiZSBjaGFuZ2VkIGFyYml0cmFyaWx5LiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKLXJlbG9jYXRlIHRoZSBzZWN0aW9uczsgaWYgdGhlIHByb2dyYW0gZXhwZWN0cyBzZWN0aW9ucyB0byBiZSBsb2FkZWQgYXQgYQotY2VydGFpbiBhZGRyZXNzLCBhbmQgdGhpcyBvcHRpb24gaXMgdXNlZCB0byBjaGFuZ2UgdGhlIHNlY3Rpb25zIHN1Y2gKLXRoYXQgdGhleSBhcmUgbG9hZGVkIGF0IGEgZGlmZmVyZW50IGFkZHJlc3MsIHRoZSBwcm9ncmFtIG1heSBmYWlsLiAKLQotQGl0ZW0gLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzIEB2YXJ7c2VjdGlvbn1Aez0sKywtQH1AdmFye3ZhbH0KLUBpdGVteCAtLWFkanVzdC1zZWN0aW9uLXZtYSBAdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9Ci1AY2luZGV4IGNoYW5naW5nIHNlY3Rpb24gYWRkcmVzcwotU2V0IG9yIGNoYW5nZSBib3RoIHRoZSBWTUEgYWRkcmVzcyBhbmQgdGhlIExNQSBhZGRyZXNzIG9mIHRoZSBuYW1lZAotQHZhcntzZWN0aW9ufS4gIElmIEBzYW1wez19IGlzIHVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvCi1AdmFye3ZhbH0uICBPdGhlcndpc2UsIEB2YXJ7dmFsfSBpcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlCi1zZWN0aW9uIGFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzIHVuZGVyIEBzYW1wey0tY2hhbmdlLWFkZHJlc3Nlc30sCi1hYm92ZS4gSWYgQHZhcntzZWN0aW9ufSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nIHdpbGwKLWJlIGlzc3VlZCwgdW5sZXNzIEBzYW1wey0tbm8tY2hhbmdlLXdhcm5pbmdzfSBpcyB1c2VkLgotCi1AaXRlbSAtLWNoYW5nZS1zZWN0aW9uLWxtYSBAdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9Ci1AY2luZGV4IGNoYW5naW5nIHNlY3Rpb24gTE1BCi1TZXQgb3IgY2hhbmdlIHRoZSBMTUEgYWRkcmVzcyBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufS4gIFRoZSBMTUEKLWFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHNlY3Rpb24gd2lsbCBiZSBsb2FkZWQgaW50byBtZW1vcnkgYXQKLXByb2dyYW0gbG9hZCB0aW1lLiAgTm9ybWFsbHkgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgVk1BIGFkZHJlc3MsIHdoaWNoCi1pcyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBhdCBwcm9ncmFtIHJ1biB0aW1lLCBidXQgb24gc29tZSBzeXN0ZW1zLAotZXNwZWNpYWxseSB0aG9zZSB3aGVyZSBhIHByb2dyYW0gaXMgaGVsZCBpbiBST00sIHRoZSB0d28gY2FuIGJlCi1kaWZmZXJlbnQuICBJZiBAc2FtcHs9fSBpcyB1c2VkLCB0aGUgc2VjdGlvbiBhZGRyZXNzIGlzIHNldCB0bwotQHZhcnt2YWx9LiAgT3RoZXJ3aXNlLCBAdmFye3ZhbH0gaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZCBmcm9tIHRoZQotc2VjdGlvbiBhZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cyB1bmRlciBAc2FtcHstLWNoYW5nZS1hZGRyZXNzZXN9LAotYWJvdmUuICBJZiBAdmFye3NlY3Rpb259IGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcKLXdpbGwgYmUgaXNzdWVkLCB1bmxlc3MgQHNhbXB7LS1uby1jaGFuZ2Utd2FybmluZ3N9IGlzIHVzZWQuICAKLQotQGl0ZW0gLS1jaGFuZ2Utc2VjdGlvbi12bWEgQHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfQotQGNpbmRleCBjaGFuZ2luZyBzZWN0aW9uIFZNQQotU2V0IG9yIGNoYW5nZSB0aGUgVk1BIGFkZHJlc3Mgb2YgdGhlIG5hbWVkIEB2YXJ7c2VjdGlvbn0uICBUaGUgVk1BCi1hZGRyZXNzIGlzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBzZWN0aW9uIHdpbGwgYmUgbG9jYXRlZCBvbmNlIHRoZQotcHJvZ3JhbSBoYXMgc3RhcnRlZCBleGVjdXRpbmcuICBOb3JtYWxseSB0aGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBMTUEKLWFkZHJlc3MsIHdoaWNoIGlzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBzZWN0aW9uIHdpbGwgYmUgbG9hZGVkIGludG8KLW1lbW9yeSwgYnV0IG9uIHNvbWUgc3lzdGVtcywgZXNwZWNpYWxseSB0aG9zZSB3aGVyZSBhIHByb2dyYW0gaXMgaGVsZCBpbgotUk9NLCB0aGUgdHdvIGNhbiBiZSBkaWZmZXJlbnQuICBJZiBAc2FtcHs9fSBpcyB1c2VkLCB0aGUgc2VjdGlvbiBhZGRyZXNzCi1pcyBzZXQgdG8gQHZhcnt2YWx9LiAgT3RoZXJ3aXNlLCBAdmFye3ZhbH0gaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZAotZnJvbSB0aGUgc2VjdGlvbiBhZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cyB1bmRlcgotQHNhbXB7LS1jaGFuZ2UtYWRkcmVzc2VzfSwgYWJvdmUuICBJZiBAdmFye3NlY3Rpb259IGRvZXMgbm90IGV4aXN0IGluCi10aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkLCB1bmxlc3MKLUBzYW1wey0tbm8tY2hhbmdlLXdhcm5pbmdzfSBpcyB1c2VkLiAgIAotCi1AaXRlbSAtLWNoYW5nZS13YXJuaW5ncwotQGl0ZW14IC0tYWRqdXN0LXdhcm5pbmdzCi1JZiBAc2FtcHstLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3N9IG9yIEBzYW1wey0tY2hhbmdlLXNlY3Rpb24tbG1hfSBvcgotQHNhbXB7LS1jaGFuZ2Utc2VjdGlvbi12bWF9IGlzIHVzZWQsIGFuZCB0aGUgbmFtZWQgc2VjdGlvbiBkb2VzIG5vdAotZXhpc3QsIGlzc3VlIGEgd2FybmluZy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuIAotCi1AaXRlbSAtLW5vLWNoYW5nZS13YXJuaW5ncwotQGl0ZW14IC0tbm8tYWRqdXN0LXdhcm5pbmdzCi1EbyBub3QgaXNzdWUgYSB3YXJuaW5nIGlmIEBzYW1wey0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzc30gb3IKLUBzYW1wey0tYWRqdXN0LXNlY3Rpb24tbG1hfSBvciBAc2FtcHstLWFkanVzdC1zZWN0aW9uLXZtYX0gaXMgdXNlZCwgZXZlbgotaWYgdGhlIG5hbWVkIHNlY3Rpb24gZG9lcyBub3QgZXhpc3QuIAotCi1AaXRlbSAtLXNldC1zZWN0aW9uLWZsYWdzIEB2YXJ7c2VjdGlvbn09QHZhcntmbGFnc30KLVNldCB0aGUgZmxhZ3MgZm9yIHRoZSBuYW1lZCBzZWN0aW9uLiAgVGhlIEB2YXJ7ZmxhZ3N9IGFyZ3VtZW50IGlzIGEKLWNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2YgZmxhZyBuYW1lcy4gIFRoZSByZWNvZ25pemVkIG5hbWVzIGFyZQotQHNhbXB7YWxsb2N9LCBAc2FtcHtjb250ZW50c30sIEBzYW1we2xvYWR9LCBAc2FtcHtub2xvYWR9LAotQHNhbXB7cmVhZG9ubHl9LCBAc2FtcHtjb2RlfSwgQHNhbXB7ZGF0YX0sIEBzYW1we3JvbX0sIEBzYW1we3NoYXJlfSwgYW5kCi1Ac2FtcHtkZWJ1Z30uICBZb3UgY2FuIHNldCB0aGUgQHNhbXB7Y29udGVudHN9IGZsYWcgZm9yIGEgc2VjdGlvbiB3aGljaAotZG9lcyBub3QgaGF2ZSBjb250ZW50cywgYnV0IGl0IGlzIG5vdCBtZWFuaW5nZnVsIHRvIGNsZWFyIHRoZQotQHNhbXB7Y29udGVudHN9IGZsYWcgb2YgYSBzZWN0aW9uIHdoaWNoIGRvZXMgaGF2ZSBjb250ZW50cy0tanVzdCByZW1vdmUKLXRoZSBzZWN0aW9uIGluc3RlYWQuICBOb3QgYWxsIGZsYWdzIGFyZSBtZWFuaW5nZnVsIGZvciBhbGwgb2JqZWN0IGZpbGUKLWZvcm1hdHMuCi0KLUBpdGVtIC0tYWRkLXNlY3Rpb24gQHZhcntzZWN0aW9ubmFtZX09QHZhcntmaWxlbmFtZX0KLUFkZCBhIG5ldyBzZWN0aW9uIG5hbWVkIEB2YXJ7c2VjdGlvbm5hbWV9IHdoaWxlIGNvcHlpbmcgdGhlIGZpbGUuICBUaGUKLWNvbnRlbnRzIG9mIHRoZSBuZXcgc2VjdGlvbiBhcmUgdGFrZW4gZnJvbSB0aGUgZmlsZSBAdmFye2ZpbGVuYW1lfS4gIFRoZQotc2l6ZSBvZiB0aGUgc2VjdGlvbiB3aWxsIGJlIHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgVGhpcyBvcHRpb24gb25seQotd29ya3Mgb24gZmlsZSBmb3JtYXRzIHdoaWNoIGNhbiBzdXBwb3J0IHNlY3Rpb25zIHdpdGggYXJiaXRyYXJ5IG5hbWVzLgotCi1AaXRlbSAtLWNoYW5nZS1sZWFkaW5nLWNoYXIKLVNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyB1c2Ugc3BlY2lhbCBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydCBvZgotc3ltYm9scy4gIFRoZSBtb3N0IGNvbW1vbiBzdWNoIGNoYXJhY3RlciBpcyB1bmRlcnNjb3JlLCB3aGljaCBjb21waWxlcnMKLW9mdGVuIGFkZCBiZWZvcmUgZXZlcnkgc3ltYm9sLiAgVGhpcyBvcHRpb24gdGVsbHMgQGNvZGV7b2JqY29weX0gdG8KLWNoYW5nZSB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgb2YgZXZlcnkgc3ltYm9sIHdoZW4gaXQgY29udmVydHMgYmV0d2Vlbgotb2JqZWN0IGZpbGUgZm9ybWF0cy4gIElmIHRoZSBvYmplY3QgZmlsZSBmb3JtYXRzIHVzZSB0aGUgc2FtZSBsZWFkaW5nCi1jaGFyYWN0ZXIsIHRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QuICBPdGhlcndpc2UsIGl0IHdpbGwgYWRkIGEKLWNoYXJhY3Rlciwgb3IgcmVtb3ZlIGEgY2hhcmFjdGVyLCBvciBjaGFuZ2UgYSBjaGFyYWN0ZXIsIGFzCi1hcHByb3ByaWF0ZS4KLQotQGl0ZW0gLS1yZW1vdmUtbGVhZGluZy1jaGFyCi1JZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgZ2xvYmFsIHN5bWJvbCBpcyBhIHNwZWNpYWwgc3ltYm9sIGxlYWRpbmcKLWNoYXJhY3RlciB1c2VkIGJ5IHRoZSBvYmplY3QgZmlsZSBmb3JtYXQsIHJlbW92ZSB0aGUgY2hhcmFjdGVyLiAgVGhlCi1tb3N0IGNvbW1vbiBzeW1ib2wgbGVhZGluZyBjaGFyYWN0ZXIgaXMgdW5kZXJzY29yZS4gIFRoaXMgb3B0aW9uIHdpbGwKLXJlbW92ZSBhIGxlYWRpbmcgdW5kZXJzY29yZSBmcm9tIGFsbCBnbG9iYWwgc3ltYm9scy4gIFRoaXMgY2FuIGJlIHVzZWZ1bAotaWYgeW91IHdhbnQgdG8gbGluayB0b2dldGhlciBvYmplY3RzIG9mIGRpZmZlcmVudCBmaWxlIGZvcm1hdHMgd2l0aAotZGlmZmVyZW50IGNvbnZlbnRpb25zIGZvciBzeW1ib2wgbmFtZXMuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tCi1AY29kZXstLWNoYW5nZS1sZWFkaW5nLWNoYXJ9IGJlY2F1c2UgaXQgYWx3YXlzIGNoYW5nZXMgdGhlIHN5bWJvbCBuYW1lCi13aGVuIGFwcHJvcHJpYXRlLCByZWdhcmRsZXNzIG9mIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgb2YgdGhlIG91dHB1dAotZmlsZS4KLQotQGl0ZW0gLS13ZWFrZW4KLUNoYW5nZSBhbGwgZ2xvYmFsIHN5bWJvbHMgaW4gdGhlIGZpbGUgdG8gYmUgd2Vhay4gIFRoaXMgY2FuIGJlIHVzZWZ1bAotd2hlbiBidWlsZGluZyBhbiBvYmplY3Qgd2hpY2ggd2lsbCBiZSBsaW5rZWQgYWdhaW5zdCBvdGhlciBvYmplY3RzIHVzaW5nCi10aGUgQGNvZGV7LVJ9IG9wdGlvbiB0byB0aGUgbGlua2VyLiAgVGhpcyBvcHRpb24gaXMgb25seSBlZmZlY3RpdmUgd2hlbgotdXNpbmcgYW4gb2JqZWN0IGZpbGUgZm9ybWF0IHdoaWNoIHN1cHBvcnRzIHdlYWsgc3ltYm9scy4KLQotQGl0ZW0gLVYKLUBpdGVteCAtLXZlcnNpb24KLVNob3cgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEBjb2Rle29iamNvcHl9LgotCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyYm9zZQotVmVyYm9zZSBvdXRwdXQ6IGxpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZC4gIEluIHRoZSBjYXNlIG9mCi1hcmNoaXZlcywgQHNhbXB7b2JqY29weSAtVn0gbGlzdHMgYWxsIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUuCi0KLUBpdGVtIC0taGVscAotU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gQGNvZGV7b2JqY29weX0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIG9iamR1bXAKLUBjaGFwdGVyIG9iamR1bXAKLQotQGNpbmRleCBvYmplY3QgZmlsZSBpbmZvcm1hdGlvbgotQGtpbmRleCBvYmpkdW1wCi0KLUBzbWFsbGV4YW1wbGUKLW9iamR1bXAgWyAtYSB8IC0tYXJjaGl2ZS1oZWFkZXJzIF0gCi0gICAgICAgIFsgLWIgQHZhcntiZmRuYW1lfSB8IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXSAKLSAgICAgICAgWyAtQyB8IC0tZGVtYW5nbGUgXQotICAgICAgICBbIC1kIHwgLS1kaXNhc3NlbWJsZSBdCi0gICAgICAgIFsgLUQgfCAtLWRpc2Fzc2VtYmxlLWFsbCBdCi0gICAgICAgIFsgLXogfCAtLWRpc2Fzc2VtYmxlLXplcm9lcyBdCi0gICAgICAgIFsgLUVCIHwgLUVMIHwgLS1lbmRpYW49QHtiaWcgfCBsaXR0bGUgQH0gXQotICAgICAgICBbIC1mIHwgLS1maWxlLWhlYWRlcnMgXQotICAgICAgICBbIC1nIHwgLS1kZWJ1Z2dpbmcgXQotICAgICAgICBbIC1oIHwgLS1zZWN0aW9uLWhlYWRlcnMgfCAtLWhlYWRlcnMgXQotICAgICAgICBbIC1pIHwgLS1pbmZvIF0KLSAgICAgICAgWyAtaiBAdmFye3NlY3Rpb259IHwgLS1zZWN0aW9uPUB2YXJ7c2VjdGlvbn0gXQotICAgICAgICBbIC1sIHwgLS1saW5lLW51bWJlcnMgXQotICAgICAgICBbIC1TIHwgLS1zb3VyY2UgXQotICAgICAgICBbIC1tIEB2YXJ7bWFjaGluZX0gfCAtLWFyY2hpdGVjdHVyZT1AdmFye21hY2hpbmV9IF0KLSAgICAgICAgWyAtTSBAdmFye29wdGlvbnN9IHwgLS1kaXNhc3NlbWJsZXItb3B0aW9ucz1AdmFye29wdGlvbnN9XQotICAgICAgICBbIC1wIHwgLS1wcml2YXRlLWhlYWRlcnMgXQotICAgICAgICBbIC1yIHwgLS1yZWxvYyBdCi0gICAgICAgIFsgLVIgfCAtLWR5bmFtaWMtcmVsb2MgXQotICAgICAgICBbIC1zIHwgLS1mdWxsLWNvbnRlbnRzIF0KLSAgICAgICAgWyAtRyB8IC0tc3RhYnMgXQotICAgICAgICBbIC10IHwgLS1zeW1zIF0KLSAgICAgICAgWyAtVCB8IC0tZHluYW1pYy1zeW1zIF0KLSAgICAgICAgWyAteCB8IC0tYWxsLWhlYWRlcnMgXQotICAgICAgICBbIC13IHwgLS13aWRlIF0KLSAgICAgICAgWyAtLXN0YXJ0LWFkZHJlc3M9QHZhcnthZGRyZXNzfSBdCi0gICAgICAgIFsgLS1zdG9wLWFkZHJlc3M9QHZhcnthZGRyZXNzfSBdCi0gICAgICAgIFsgLS1wcmVmaXgtYWRkcmVzc2VzXQotICAgICAgICBbIC0tW25vLV1zaG93LXJhdy1pbnNuIF0KLSAgICAgICAgWyAtLWFkanVzdC12bWE9QHZhcntvZmZzZXR9IF0KLSAgICAgICAgWyAtViB8IC0tdmVyc2lvbiBdCi0gICAgICAgIFsgLUggfCAtLWhlbHAgXQotICAgICAgICBAdmFye29iamZpbGV9QGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7b2JqZHVtcH0gZGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgb2JqZWN0IGZpbGVzLgotVGhlIG9wdGlvbnMgY29udHJvbCB3aGF0IHBhcnRpY3VsYXIgaW5mb3JtYXRpb24gdG8gZGlzcGxheS4gIFRoaXMKLWluZm9ybWF0aW9uIGlzIG1vc3RseSB1c2VmdWwgdG8gcHJvZ3JhbW1lcnMgd2hvIGFyZSB3b3JraW5nIG9uIHRoZQotY29tcGlsYXRpb24gdG9vbHMsIGFzIG9wcG9zZWQgdG8gcHJvZ3JhbW1lcnMgd2hvIGp1c3Qgd2FudCB0aGVpcgotcHJvZ3JhbSB0byBjb21waWxlIGFuZCB3b3JrLgotCi1AdmFye29iamZpbGV9QGRvdHN7fSBhcmUgdGhlIG9iamVjdCBmaWxlcyB0byBiZSBleGFtaW5lZC4gIFdoZW4geW91Ci1zcGVjaWZ5IGFyY2hpdmVzLCBAY29kZXtvYmpkdW1wfSBzaG93cyBpbmZvcm1hdGlvbiBvbiBlYWNoIG9mIHRoZSBtZW1iZXIKLW9iamVjdCBmaWxlcy4KLQotVGhlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIG9wdGlvbnMsIHNob3duIGhlcmUgYXMgYWx0ZXJuYXRpdmVzLCBhcmUKLWVxdWl2YWxlbnQuICBBdCBsZWFzdCBvbmUgb3B0aW9uIGZyb20gdGhlIGxpc3QKLUBzYW1wey1hLC1kLC1ELC1mLC1nLC1HLC1oLC1ILC1wLC1yLC1SLC1TLC10LC1ULC1WLC14fSBtdXN0IGJlIGdpdmVuLiAKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYQotQGl0ZW14IC0tYXJjaGl2ZS1oZWFkZXIKLUBjaW5kZXggYXJjaGl2ZSBoZWFkZXJzCi1JZiBhbnkgb2YgdGhlIEB2YXJ7b2JqZmlsZX0gZmlsZXMgYXJlIGFyY2hpdmVzLCBkaXNwbGF5IHRoZSBhcmNoaXZlCi1oZWFkZXIgaW5mb3JtYXRpb24gKGluIGEgZm9ybWF0IHNpbWlsYXIgdG8gQHNhbXB7bHMgLWx9KS4gIEJlc2lkZXMgdGhlCi1pbmZvcm1hdGlvbiB5b3UgY291bGQgbGlzdCB3aXRoIEBzYW1we2FyIHR2fSwgQHNhbXB7b2JqZHVtcCAtYX0gc2hvd3MKLXRoZSBvYmplY3QgZmlsZSBmb3JtYXQgb2YgZWFjaCBhcmNoaXZlIG1lbWJlci4KLQotQGl0ZW0gLS1hZGp1c3Qtdm1hPUB2YXJ7b2Zmc2V0fQotQGNpbmRleCBzZWN0aW9uIGFkZHJlc3NlcyBpbiBvYmpkdW1wCi1AY2luZGV4IFZNQSBpbiBvYmpkdW1wCi1XaGVuIGR1bXBpbmcgaW5mb3JtYXRpb24sIGZpcnN0IGFkZCBAdmFye29mZnNldH0gdG8gYWxsIHRoZSBzZWN0aW9uCi1hZGRyZXNzZXMuICBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgZG8gbm90IGNvcnJlc3BvbmQgdG8KLXRoZSBzeW1ib2wgdGFibGUsIHdoaWNoIGNhbiBoYXBwZW4gd2hlbiBwdXR0aW5nIHNlY3Rpb25zIGF0IHBhcnRpY3VsYXIKLWFkZHJlc3NlcyB3aGVuIHVzaW5nIGEgZm9ybWF0IHdoaWNoIGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gYWRkcmVzc2VzLAotc3VjaCBhcyBhLm91dC4KLQotQGl0ZW0gLWIgQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUBjaW5kZXggb2JqZWN0IGNvZGUgZm9ybWF0Ci1TcGVjaWZ5IHRoYXQgdGhlIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgdGhlIG9iamVjdCBmaWxlcyBpcwotQHZhcntiZmRuYW1lfS4gIFRoaXMgb3B0aW9uIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBAdmFye29iamR1bXB9IGNhbgotYXV0b21hdGljYWxseSByZWNvZ25pemUgbWFueSBmb3JtYXRzLgotCi1Gb3IgZXhhbXBsZSwKLUBleGFtcGxlCi1vYmpkdW1wIC1iIG9hc3lzIC1tIHZheCAtaCBmdS5vCi1AZW5kIGV4YW1wbGUKLUBub2luZGVudAotZGlzcGxheXMgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgKEBzYW1wey1ofSkgb2YKLUBmaWxle2Z1Lm99LCB3aGljaCBpcyBleHBsaWNpdGx5IGlkZW50aWZpZWQgKEBzYW1wey1tfSkgYXMgYSBWQVggb2JqZWN0Ci1maWxlIGluIHRoZSBmb3JtYXQgcHJvZHVjZWQgYnkgT2FzeXMgY29tcGlsZXJzLiAgWW91IGNhbiBsaXN0IHRoZQotZm9ybWF0cyBhdmFpbGFibGUgd2l0aCB0aGUgQHNhbXB7LWl9IG9wdGlvbi4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLUMKLUBpdGVteCAtLWRlbWFuZ2xlCi1AY2luZGV4IGRlbWFuZ2xpbmcgaW4gb2JqZHVtcAotRGVjb2RlIChAZGZue2RlbWFuZ2xlfSkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCi1CZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKLW1ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4gIEB4cmVme2MrK2ZpbHR9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotb24gZGVtYW5nbGluZy4KLQotQGl0ZW0gLUcKLUBpdGVtIC0tZGVidWdnaW5nCi1EaXNwbGF5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgYXR0ZW1wdHMgdG8gcGFyc2UgZGVidWdnaW5nCi1pbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGZpbGUgYW5kIHByaW50IGl0IG91dCB1c2luZyBhIEMgbGlrZSBzeW50YXguCi1Pbmx5IGNlcnRhaW4gdHlwZXMgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIGhhdmUgYmVlbiBpbXBsZW1lbnRlZC4KLQotQGl0ZW0gLWQKLUBpdGVteCAtLWRpc2Fzc2VtYmxlCi1AY2luZGV4IGRpc2Fzc2VtYmxpbmcgb2JqZWN0IGNvZGUKLUBjaW5kZXggbWFjaGluZSBpbnN0cnVjdGlvbnMKLURpc3BsYXkgdGhlIGFzc2VtYmxlciBtbmVtb25pY3MgZm9yIHRoZSBtYWNoaW5lIGluc3RydWN0aW9ucyBmcm9tCi1AdmFye29iamZpbGV9LiAgVGhpcyBvcHRpb24gb25seSBkaXNhc3NlbWJsZXMgdGhvc2Ugc2VjdGlvbnMgd2hpY2ggYXJlCi1leHBlY3RlZCB0byBjb250YWluIGluc3RydWN0aW9ucy4KLQotQGl0ZW0gLUQKLUBpdGVteCAtLWRpc2Fzc2VtYmxlLWFsbAotTGlrZSBAc2FtcHstZH0sIGJ1dCBkaXNhc3NlbWJsZSB0aGUgY29udGVudHMgb2YgYWxsIHNlY3Rpb25zLCBub3QganVzdAotdGhvc2UgZXhwZWN0ZWQgdG8gY29udGFpbiBpbnN0cnVjdGlvbnMuCi0KLUBpdGVtIC0tcHJlZml4LWFkZHJlc3NlcwotV2hlbiBkaXNhc3NlbWJsaW5nLCBwcmludCB0aGUgY29tcGxldGUgYWRkcmVzcyBvbiBlYWNoIGxpbmUuICBUaGlzIGlzCi10aGUgb2xkZXIgZGlzYXNzZW1ibHkgZm9ybWF0LgotCi1AaXRlbSAtLWRpc2Fzc2VtYmxlLXplcm9lcwotTm9ybWFsbHkgdGhlIGRpc2Fzc2VtYmx5IG91dHB1dCB3aWxsIHNraXAgYmxvY2tzIG9mIHplcm9lcy4gIFRoaXMKLW9wdGlvbiBkaXJlY3RzIHRoZSBkaXNhc3NlbWJsZXIgdG8gZGlzYXNzZW1ibGUgdGhvc2UgYmxvY2tzLCBqdXN0IGxpa2UKLWFueSBvdGhlciBkYXRhLgotCi1AaXRlbSAtRUIKLUBpdGVteCAtRUwKLUBpdGVteCAtLWVuZGlhbj1Ae2JpZ3xsaXR0bGVAfQotQGNpbmRleCBlbmRpYW5uZXNzCi1AY2luZGV4IGRpc2Fzc2VtYmx5IGVuZGlhbm5lc3MKLVNwZWNpZnkgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIG9iamVjdCBmaWxlcy4gIFRoaXMgb25seSBhZmZlY3RzCi1kaXNhc3NlbWJseS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGRpc2Fzc2VtYmxpbmcgYSBmaWxlIGZvcm1hdCB3aGljaAotZG9lcyBub3QgZGVzY3JpYmUgZW5kaWFubmVzcyBpbmZvcm1hdGlvbiwgc3VjaCBhcyBTLXJlY29yZHMuCi0KLUBpdGVtIC1mCi1AaXRlbXggLS1maWxlLWhlYWRlcgotQGNpbmRleCBvYmplY3QgZmlsZSBoZWFkZXIKLURpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvdmVyYWxsIGhlYWRlciBvZgotZWFjaCBvZiB0aGUgQHZhcntvYmpmaWxlfSBmaWxlcy4KLQotQGl0ZW0gLWgKLUBpdGVteCAtLXNlY3Rpb24taGVhZGVyCi1AaXRlbXggLS1oZWFkZXIKLUBjaW5kZXggc2VjdGlvbiBoZWFkZXJzCi1EaXNwbGF5IHN1bW1hcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VjdGlvbiBoZWFkZXJzIG9mIHRoZQotb2JqZWN0IGZpbGUuCi0KLUZpbGUgc2VnbWVudHMgbWF5IGJlIHJlbG9jYXRlZCB0byBub25zdGFuZGFyZCBhZGRyZXNzZXMsIGZvciBleGFtcGxlIGJ5Ci11c2luZyB0aGUgQHNhbXB7LVR0ZXh0fSwgQHNhbXB7LVRkYXRhfSwgb3IgQHNhbXB7LVRic3N9IG9wdGlvbnMgdG8KLUBjb2Rle2xkfS4gIEhvd2V2ZXIsIHNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cywgc3VjaCBhcyBhLm91dCwgZG8gbm90Ci1zdG9yZSB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgZmlsZSBzZWdtZW50cy4gIEluIHRob3NlIHNpdHVhdGlvbnMsCi1hbHRob3VnaCBAY29kZXtsZH0gcmVsb2NhdGVzIHRoZSBzZWN0aW9ucyBjb3JyZWN0bHksIHVzaW5nIEBzYW1we29iamR1bXAKLS1ofSB0byBsaXN0IHRoZSBmaWxlIHNlY3Rpb24gaGVhZGVycyBjYW5ub3Qgc2hvdyB0aGUgY29ycmVjdCBhZGRyZXNzZXMuCi1JbnN0ZWFkLCBpdCBzaG93cyB0aGUgdXN1YWwgYWRkcmVzc2VzLCB3aGljaCBhcmUgaW1wbGljaXQgZm9yIHRoZQotdGFyZ2V0LgotCi1AaXRlbSAtLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0byBAY29kZXtvYmpkdW1wfSBhbmQgZXhpdC4KLQotQGl0ZW0gLWkKLUBpdGVteCAtLWluZm8KLUBjaW5kZXggYXJjaGl0ZWN0dXJlcyBhdmFpbGFibGUKLUBjaW5kZXggb2JqZWN0IGZvcm1hdHMgYXZhaWxhYmxlCi1EaXNwbGF5IGEgbGlzdCBzaG93aW5nIGFsbCBhcmNoaXRlY3R1cmVzIGFuZCBvYmplY3QgZm9ybWF0cyBhdmFpbGFibGUKLWZvciBzcGVjaWZpY2F0aW9uIHdpdGggQHNhbXB7LWJ9IG9yIEBzYW1wey1tfS4KLQotQGl0ZW0gLWogQHZhcntuYW1lfQotQGl0ZW14IC0tc2VjdGlvbj1AdmFye25hbWV9Ci1AY2luZGV4IHNlY3Rpb24gaW5mb3JtYXRpb24KLURpc3BsYXkgaW5mb3JtYXRpb24gb25seSBmb3Igc2VjdGlvbiBAdmFye25hbWV9LgotCi1AaXRlbSAtbAotQGl0ZW14IC0tbGluZS1udW1iZXJzCi1AY2luZGV4IHNvdXJjZSBmaWxlbmFtZXMgZm9yIG9iamVjdCBmaWxlcwotTGFiZWwgdGhlIGRpc3BsYXkgKHVzaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbikgd2l0aCB0aGUgZmlsZW5hbWUgYW5kCi1zb3VyY2UgbGluZSBudW1iZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9iamVjdCBjb2RlIG9yIHJlbG9jcyBzaG93bi4KLU9ubHkgdXNlZnVsIHdpdGggQHNhbXB7LWR9LCBAc2FtcHstRH0sIG9yIEBzYW1wey1yfS4KLQotQGl0ZW0gLW0gQHZhcnttYWNoaW5lfQotQGl0ZW14IC0tYXJjaGl0ZWN0dXJlPUB2YXJ7bWFjaGluZX0KLUBjaW5kZXggYXJjaGl0ZWN0dXJlCi1AY2luZGV4IGRpc2Fzc2VtYmx5IGFyY2hpdGVjdHVyZQotU3BlY2lmeSB0aGUgYXJjaGl0ZWN0dXJlIHRvIHVzZSB3aGVuIGRpc2Fzc2VtYmxpbmcgb2JqZWN0IGZpbGVzLiAgVGhpcwotY2FuIGJlIHVzZWZ1bCB3aGVuIGRpc2Fzc2VtYmxpbmcgb2JqZWN0IGZpbGVzIHdoaWNoIGRvIG5vdCBkZXNjcmliZQotYXJjaGl0ZWN0dXJlIGluZm9ybWF0aW9uLCBzdWNoIGFzIFMtcmVjb3Jkcy4gIFlvdSBjYW4gbGlzdCB0aGUgYXZhaWxhYmxlCi1hcmNoaXRlY3R1cmVzIHdpdGggdGhlIEBzYW1wey1pfSBvcHRpb24uCi0KLUBpdGVtIC1NIEB2YXJ7b3B0aW9uc30KLUBpdGVteCAtLWRpc2Fzc2VtYmxlci1vcHRpb25zPUB2YXJ7b3B0aW9uc30KLVBhc3MgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIHRvIHRoZSBkaXNhc3NlbWJsZXIuICBPbmx5IHN1cHBvcnRlZCBvbgotc29tZSB0YXJnZXRzLgotCi1JZiB0aGUgdGFyZ2V0IGlzIGFuIEFSTSBhcmNoaXRlY3R1cmUgdGhlbiB0aGlzIHN3aXRjaCBjYW4gYmUgdXNlZCB0bwotc2VsZWN0IHdoaWNoIHJlZ2lzdGVyIG5hbWUgc2V0IGlzIHVzZWQgZHVyaW5nIGRpc2Fzc2VtYmxlci4gIFNwZWNpZnlpbmcKLUBzYW1wey0tZGlzYXNzZW1ibGVyLW9wdGlvbnM9cmVnLW5hbWUtc3RkfSAodGhlIGRlZmF1bHQpIHdpbGwgc2VsZWN0IHRoZQotcmVnaXN0ZXIgbmFtZXMgYXMgdXNlZCBpbiBBUk0ncyBpbnN0cnVjdGlvbiBzZXQgZG9jdW1lbnRhdGlvbiwgYnV0IHdpdGgKLXJlZ2lzdGVyIDEzIGNhbGxlZCAnc3AnLCByZWdpc3RlciAxNCBjYWxsZWQgJ2xyJyBhbmQgcmVnaXN0ZXIgMTUgY2FsbGVkCi0ncGMnLiAgU3BlY2lmeWluZyBAc2FtcHstLWRpc2Fzc2VtYmxlci1vcHRpb25zPXJlZy1uYW1lcy1hcGNzfSB3aWxsCi1zZWxlY3QgdGhlIG5hbWUgc2V0IHVzZWQgYnkgdGhlIEFSTSBQcm9jZWR1cmUgQ2FsbCBTdGFuZGFyZCwgd2hpbHN0Ci1zcGVjaWZ5aW5nIEBzYW1wey0tZGlzYXNzZW1ibGVyLW9wdGlvbnM9cmVnLW5hbWVzLXJhd30gd2lsbCBqdXN0IHVzZQotQHNhbXB7cn0gZm9sbG93ZWQgYnkgdGhlIHJlZ2lzdGVyIG51bWJlci4KLQotQGl0ZW0gLXAKLUBpdGVteCAtLXByaXZhdGUtaGVhZGVycwotUHJpbnQgaW5mb3JtYXRpb24gdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlIGV4YWN0Ci1pbmZvcm1hdGlvbiBwcmludGVkIGRlcGVuZHMgdXBvbiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgRm9yIHNvbWUKLW9iamVjdCBmaWxlIGZvcm1hdHMsIG5vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgcHJpbnRlZC4KLQotQGl0ZW0gLXIKLUBpdGVteCAtLXJlbG9jCi1AY2luZGV4IHJlbG9jYXRpb24gZW50cmllcywgaW4gb2JqZWN0IGZpbGUKLVByaW50IHRoZSByZWxvY2F0aW9uIGVudHJpZXMgb2YgdGhlIGZpbGUuICBJZiB1c2VkIHdpdGggQHNhbXB7LWR9IG9yCi1Ac2FtcHstRH0sIHRoZSByZWxvY2F0aW9ucyBhcmUgcHJpbnRlZCBpbnRlcnNwZXJzZWQgd2l0aCB0aGUKLWRpc2Fzc2VtYmx5LgotCi1AaXRlbSAtUgotQGl0ZW14IC0tZHluYW1pYy1yZWxvYwotQGNpbmRleCBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcywgaW4gb2JqZWN0IGZpbGUKLVByaW50IHRoZSBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcyBvZiB0aGUgZmlsZS4gIFRoaXMgaXMgb25seQotbWVhbmluZ2Z1bCBmb3IgZHluYW1pYyBvYmplY3RzLCBzdWNoIGFzIGNlcnRhaW4gdHlwZXMgb2Ygc2hhcmVkCi1saWJyYXJpZXMuCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1mdWxsLWNvbnRlbnRzCi1AY2luZGV4IHNlY3Rpb25zLCBmdWxsIGNvbnRlbnRzCi1AY2luZGV4IG9iamVjdCBmaWxlIHNlY3Rpb25zCi1EaXNwbGF5IHRoZSBmdWxsIGNvbnRlbnRzIG9mIGFueSBzZWN0aW9ucyByZXF1ZXN0ZWQuCi0KLUBpdGVtIC1TCi1AaXRlbXggLS1zb3VyY2UKLUBjaW5kZXggc291cmNlIGRpc2Fzc2VtYmx5Ci1AY2luZGV4IGRpc2Fzc2VtYmx5LCB3aXRoIHNvdXJjZQotRGlzcGxheSBzb3VyY2UgY29kZSBpbnRlcm1peGVkIHdpdGggZGlzYXNzZW1ibHksIGlmIHBvc3NpYmxlLiAgSW1wbGllcwotQHNhbXB7LWR9LgotCi1AaXRlbSAtLXNob3ctcmF3LWluc24KLVdoZW4gZGlzYXNzZW1ibGluZyBpbnN0cnVjdGlvbnMsIHByaW50IHRoZSBpbnN0cnVjdGlvbiBpbiBoZXggYXMgd2VsbCBhcwotaW4gc3ltYm9saWMgZm9ybS4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgZXhjZXB0IHdoZW4KLUBjb2Rley0tcHJlZml4LWFkZHJlc3Nlc30gaXMgdXNlZC4KLQotQGl0ZW0gLS1uby1zaG93LXJhdy1pbnNuCi1XaGVuIGRpc2Fzc2VtYmxpbmcgaW5zdHJ1Y3Rpb25zLCBkbyBub3QgcHJpbnQgdGhlIGluc3RydWN0aW9uIGJ5dGVzLgotVGhpcyBpcyB0aGUgZGVmYXVsdCB3aGVuIEBjb2Rley0tcHJlZml4LWFkZHJlc3Nlc30gaXMgdXNlZC4KLQotQGl0ZW0gLUcKLUBpdGVtIC0tc3RhYnMKLUBjaW5kZXggc3RhYgotQGNpbmRleCAuc3RhYgotQGNpbmRleCBkZWJ1ZyBzeW1ib2xzCi1AY2luZGV4IEVMRiBvYmplY3QgZmlsZSBmb3JtYXQKLURpc3BsYXkgdGhlIGZ1bGwgY29udGVudHMgb2YgYW55IHNlY3Rpb25zIHJlcXVlc3RlZC4gIERpc3BsYXkgdGhlCi1jb250ZW50cyBvZiB0aGUgLnN0YWIgYW5kIC5zdGFiLmluZGV4IGFuZCAuc3RhYi5leGNsIHNlY3Rpb25zIGZyb20gYW4KLUVMRiBmaWxlLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBvbiBzeXN0ZW1zIChzdWNoIGFzIFNvbGFyaXMgMi4wKSBpbiB3aGljaAotQGNvZGV7LnN0YWJ9IGRlYnVnZ2luZyBzeW1ib2wtdGFibGUgZW50cmllcyBhcmUgY2FycmllZCBpbiBhbiBFTEYKLXNlY3Rpb24uICBJbiBtb3N0IG90aGVyIGZpbGUgZm9ybWF0cywgZGVidWdnaW5nIHN5bWJvbC10YWJsZSBlbnRyaWVzIGFyZQotaW50ZXJsZWF2ZWQgd2l0aCBsaW5rYWdlIHN5bWJvbHMsIGFuZCBhcmUgdmlzaWJsZSBpbiB0aGUgQHNhbXB7LS1zeW1zfQotb3V0cHV0LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3RhYnMgc3ltYm9scywgc2VlIEByZWZ7VG9wLFN0YWJzLFN0YWJzCi1PdmVydmlldyxzdGFicy5pbmZvLCBUaGUgYGBzdGFicycnIGRlYnVnIGZvcm1hdH0uCi0KLUBpdGVtIC0tc3RhcnQtYWRkcmVzcz1AdmFye2FkZHJlc3N9Ci1AY2luZGV4IHN0YXJ0LWFkZHJlc3MKLVN0YXJ0IGRpc3BsYXlpbmcgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuICBUaGlzIGFmZmVjdHMgdGhlIG91dHB1dAotb2YgdGhlIEBjb2Rley1kfSwgQGNvZGV7LXJ9IGFuZCBAY29kZXstc30gb3B0aW9ucy4KLQotQGl0ZW0gLS1zdG9wLWFkZHJlc3M9QHZhcnthZGRyZXNzfQotQGNpbmRleCBzdG9wLWFkZHJlc3MKLVN0b3AgZGlzcGxheWluZyBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gIFRoaXMgYWZmZWN0cyB0aGUgb3V0cHV0Ci1vZiB0aGUgQGNvZGV7LWR9LCBAY29kZXstcn0gYW5kIEBjb2Rley1zfSBvcHRpb25zLgotCi1AaXRlbSAtdAotQGl0ZW14IC0tc3ltcwotQGNpbmRleCBzeW1ib2wgdGFibGUgZW50cmllcywgcHJpbnRpbmcKLVByaW50IHRoZSBzeW1ib2wgdGFibGUgZW50cmllcyBvZiB0aGUgZmlsZS4KLVRoaXMgaXMgc2ltaWxhciB0byB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIEBzYW1we25tfSBwcm9ncmFtLgotCi1AaXRlbSAtVAotQGl0ZW14IC0tZHluYW1pYy1zeW1zCi1AY2luZGV4IGR5bmFtaWMgc3ltYm9sIHRhYmxlIGVudHJpZXMsIHByaW50aW5nCi1QcmludCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgZW50cmllcyBvZiB0aGUgZmlsZS4gIFRoaXMgaXMgb25seQotbWVhbmluZ2Z1bCBmb3IgZHluYW1pYyBvYmplY3RzLCBzdWNoIGFzIGNlcnRhaW4gdHlwZXMgb2Ygc2hhcmVkCi1saWJyYXJpZXMuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBAc2FtcHtubX0KLXByb2dyYW0gd2hlbiBnaXZlbiB0aGUgQHNhbXB7LUR9IChAc2FtcHstLWR5bmFtaWN9KSBvcHRpb24uCi0KLUBpdGVtIC0tdmVyc2lvbgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEBjb2Rle29iamR1bXB9IGFuZCBleGl0LgotCi1AaXRlbSAteAotQGl0ZW14IC0tYWxsLWhlYWRlcgotQGNpbmRleCBhbGwgaGVhZGVyIGluZm9ybWF0aW9uLCBvYmplY3QgZmlsZQotQGNpbmRleCBoZWFkZXIgaW5mb3JtYXRpb24sIGFsbAotRGlzcGxheSBhbGwgYXZhaWxhYmxlIGhlYWRlciBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHRoZSBzeW1ib2wgdGFibGUgYW5kCi1yZWxvY2F0aW9uIGVudHJpZXMuICBVc2luZyBAc2FtcHsteH0gaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIGFsbCBvZgotQHNhbXB7LWEgLWYgLWggLXIgLXR9LgotCi1AaXRlbSAtdwotQGl0ZW14IC0td2lkZQotQGNpbmRleCB3aWRlIG91dHB1dCwgcHJpbnRpbmcKLUZvcm1hdCBzb21lIGxpbmVzIGZvciBvdXRwdXQgZGV2aWNlcyB0aGF0IGhhdmUgbW9yZSB0aGFuIDgwIGNvbHVtbnMuCi1AZW5kIHRhYmxlCi0KLUBub2RlIHJhbmxpYgotQGNoYXB0ZXIgcmFubGliCi0KLUBraW5kZXggcmFubGliCi1AY2luZGV4IGFyY2hpdmUgY29udGVudHMKLUBjaW5kZXggc3ltYm9sIGluZGV4Ci0KLUBzbWFsbGV4YW1wbGUKLXJhbmxpYiBbLXZWXSBAdmFye2FyY2hpdmV9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtyYW5saWJ9IGdlbmVyYXRlcyBhbiBpbmRleCB0byB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBhbmQKLXN0b3JlcyBpdCBpbiB0aGUgYXJjaGl2ZS4gIFRoZSBpbmRleCBsaXN0cyBlYWNoIHN5bWJvbCBkZWZpbmVkIGJ5IGEKLW1lbWJlciBvZiBhbiBhcmNoaXZlIHRoYXQgaXMgYSByZWxvY2F0YWJsZSBvYmplY3QgZmlsZS4gIAotCi1Zb3UgbWF5IHVzZSBAc2FtcHtubSAtc30gb3IgQHNhbXB7bm0gLS1wcmludC1hcm1hcH0gdG8gbGlzdCB0aGlzIGluZGV4LgotCi1BbiBhcmNoaXZlIHdpdGggc3VjaCBhbiBpbmRleCBzcGVlZHMgdXAgbGlua2luZyB0byB0aGUgbGlicmFyeSBhbmQKLWFsbG93cyByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0byBjYWxsIGVhY2ggb3RoZXIgd2l0aG91dCByZWdhcmQgdG8KLXRoZWlyIHBsYWNlbWVudCBpbiB0aGUgYXJjaGl2ZS4KLQotVGhlIEBzY3tnbnV9IEBjb2Rle3JhbmxpYn0gcHJvZ3JhbSBpcyBhbm90aGVyIGZvcm0gb2YgQHNje2dudX0gQGNvZGV7YXJ9OyBydW5uaW5nCi1AY29kZXtyYW5saWJ9IGlzIGNvbXBsZXRlbHkgZXF1aXZhbGVudCB0byBleGVjdXRpbmcgQHNhbXB7YXIgLXN9LgotQHhyZWZ7YXJ9LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC12Ci1AaXRlbXggLVYKLUBpdGVteCAtLXZlcnNpb24KLVNob3cgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEBjb2Rle3JhbmxpYn0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIHNpemUKLUBjaGFwdGVyIHNpemUKLQotQGtpbmRleCBzaXplCi1AY2luZGV4IHNlY3Rpb24gc2l6ZXMKLQotQHNtYWxsZXhhbXBsZQotc2l6ZSBbIC1BIHwgLUIgfCAtLWZvcm1hdD1AdmFye2NvbXBhdGliaWxpdHl9IF0KLSAgICAgWyAtLWhlbHAgXSAgWyAtZCB8IC1vIHwgLXggfCAtLXJhZGl4PUB2YXJ7bnVtYmVyfSBdCi0gICAgIFsgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdICBbIC1WIHwgLS12ZXJzaW9uIF0gIAotICAgICBbIEB2YXJ7b2JqZmlsZX1AZG90c3t9IF0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAc2N7Z251fSBAY29kZXtzaXplfSB1dGlsaXR5IGxpc3RzIHRoZSBzZWN0aW9uIHNpemVzLS0tYW5kIHRoZSB0b3RhbAotc2l6ZS0tLWZvciBlYWNoIG9mIHRoZSBvYmplY3Qgb3IgYXJjaGl2ZSBmaWxlcyBAdmFye29iamZpbGV9IGluIGl0cwotYXJndW1lbnQgbGlzdC4gIEJ5IGRlZmF1bHQsIG9uZSBsaW5lIG9mIG91dHB1dCBpcyBnZW5lcmF0ZWQgZm9yIGVhY2gKLW9iamVjdCBmaWxlIG9yIGVhY2ggbW9kdWxlIGluIGFuIGFyY2hpdmUuCi0KLUB2YXJ7b2JqZmlsZX1AZG90c3t9IGFyZSB0aGUgb2JqZWN0IGZpbGVzIHRvIGJlIGV4YW1pbmVkLgotSWYgbm9uZSBhcmUgc3BlY2lmaWVkLCB0aGUgZmlsZSBAY29kZXthLm91dH0gd2lsbCBiZSB1c2VkLgotCi1UaGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1BCi1AaXRlbXggLUIKLUBpdGVteCAtLWZvcm1hdD1AdmFye2NvbXBhdGliaWxpdHl9Ci1AY2luZGV4IEBjb2Rle3NpemV9IGRpc3BsYXkgZm9ybWF0Ci1Vc2luZyBvbmUgb2YgdGhlc2Ugb3B0aW9ucywgeW91IGNhbiBjaG9vc2Ugd2hldGhlciB0aGUgb3V0cHV0IGZyb20gQHNje2dudX0KLUBjb2Rle3NpemV9IHJlc2VtYmxlcyBvdXRwdXQgZnJvbSBTeXN0ZW0gViBAY29kZXtzaXplfSAodXNpbmcgQHNhbXB7LUF9LAotb3IgQHNhbXB7LS1mb3JtYXQ9c3lzdn0pLCBvciBCZXJrZWxleSBAY29kZXtzaXplfSAodXNpbmcgQHNhbXB7LUJ9LCBvcgotQHNhbXB7LS1mb3JtYXQ9YmVya2VsZXl9KS4gIFRoZSBkZWZhdWx0IGlzIHRoZSBvbmUtbGluZSBmb3JtYXQgc2ltaWxhciB0bwotQmVya2VsZXkncy4gIAotQGMgQm9udXMgZm9yIGRvYy1zb3VyY2UgcmVhZGVyczogeW91IGNhbiBhbHNvIHNheSAtLWZvcm1hdD1zdHJhbmdlIChvcgotQGMgYW55dGhpbmcgZWxzZSB0aGF0IHN0YXJ0cyB3aXRoICdzJykgZm9yIHN5c3YsIGFuZCAtLWZvcm1hdD1ib3JpbmcgKG9yCi1AYyBhbnl0aGluZyBlbHNlIHRoYXQgc3RhcnRzIHdpdGggJ2InKSBmb3IgQmVya2VsZXkuCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiB0aGUgQmVya2VsZXkgKGRlZmF1bHQpIGZvcm1hdCBvZiBvdXRwdXQgZnJvbQotQGNvZGV7c2l6ZX06IAotQHNtYWxsZXhhbXBsZQotJCBzaXplIC0tZm9ybWF0PUJlcmtlbGV5IHJhbmxpYiBzaXplCi10ZXh0ICAgIGRhdGEgICAgYnNzICAgICBkZWMgICAgIGhleCAgICAgZmlsZW5hbWUKLTI5NDg4MCAgODE5MjAgICAxMTU5MiAgIDM4ODM5MiAgNWVkMjggICByYW5saWIKLTI5NDg4MCAgODE5MjAgICAxMTg4OCAgIDM4ODY4OCAgNWVlNTAgICBzaXplCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoaXMgaXMgdGhlIHNhbWUgZGF0YSwgYnV0IGRpc3BsYXllZCBjbG9zZXIgdG8gU3lzdGVtIFYgY29udmVudGlvbnM6Ci0KLUBzbWFsbGV4YW1wbGUKLSQgc2l6ZSAtLWZvcm1hdD1TeXNWIHJhbmxpYiBzaXplCi1yYW5saWIgIDoKLXNlY3Rpb24gICAgICAgICBzaXplICAgICAgICAgYWRkcgotLnRleHQgICAgICAgICAyOTQ4ODAgICAgICAgICA4MTkyICAgICAgIAotLmRhdGEgICAgICAgICAgODE5MjAgICAgICAgMzAzMTA0ICAgICAgIAotLmJzcyAgICAgICAgICAgMTE1OTIgICAgICAgMzg1MDI0ICAgICAgIAotVG90YWwgICAgICAgICAzODgzOTIgICAgCi0KLQotc2l6ZSAgOgotc2VjdGlvbiAgICAgICAgIHNpemUgICAgICAgICBhZGRyCi0udGV4dCAgICAgICAgIDI5NDg4MCAgICAgICAgIDgxOTIgICAgICAgCi0uZGF0YSAgICAgICAgICA4MTkyMCAgICAgICAzMDMxMDQgICAgICAgCi0uYnNzICAgICAgICAgICAxMTg4OCAgICAgICAzODUwMjQgICAgICAgCi1Ub3RhbCAgICAgICAgIDM4ODY4OCAgICAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIC0taGVscAotU2hvdyBhIHN1bW1hcnkgb2YgYWNjZXB0YWJsZSBhcmd1bWVudHMgYW5kIG9wdGlvbnMuCi0KLUBpdGVtIC1kCi1AaXRlbXggLW8KLUBpdGVteCAteAotQGl0ZW14IC0tcmFkaXg9QHZhcntudW1iZXJ9Ci1AY2luZGV4IEBjb2Rle3NpemV9IG51bWJlciBmb3JtYXQKLUBjaW5kZXggcmFkaXggZm9yIHNlY3Rpb24gc2l6ZXMKLVVzaW5nIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGNvbnRyb2wgd2hldGhlciB0aGUgc2l6ZSBvZiBlYWNoCi1zZWN0aW9uIGlzIGdpdmVuIGluIGRlY2ltYWwgKEBzYW1wey1kfSwgb3IgQHNhbXB7LS1yYWRpeD0xMH0pOyBvY3RhbAotKEBzYW1wey1vfSwgb3IgQHNhbXB7LS1yYWRpeD04fSk7IG9yIGhleGFkZWNpbWFsIChAc2FtcHsteH0sIG9yCi1Ac2FtcHstLXJhZGl4PTE2fSkuICBJbiBAc2FtcHstLXJhZGl4PUB2YXJ7bnVtYmVyfX0sIG9ubHkgdGhlIHRocmVlCi12YWx1ZXMgKDgsIDEwLCAxNikgYXJlIHN1cHBvcnRlZC4gIFRoZSB0b3RhbCBzaXplIGlzIGFsd2F5cyBnaXZlbiBpbiB0d28KLXJhZGljZXM7IGRlY2ltYWwgYW5kIGhleGFkZWNpbWFsIGZvciBAc2FtcHstZH0gb3IgQHNhbXB7LXh9IG91dHB1dCwgb3IKLW9jdGFsIGFuZCBoZXhhZGVjaW1hbCBpZiB5b3UncmUgdXNpbmcgQHNhbXB7LW99LgotCi1AaXRlbSAtLXRhcmdldD1AdmFye2JmZG5hbWV9Ci1AY2luZGV4IG9iamVjdCBjb2RlIGZvcm1hdAotU3BlY2lmeSB0aGF0IHRoZSBvYmplY3QtY29kZSBmb3JtYXQgZm9yIEB2YXJ7b2JqZmlsZX0gaXMKLUB2YXJ7YmZkbmFtZX0uICBUaGlzIG9wdGlvbiBtYXkgbm90IGJlIG5lY2Vzc2FyeTsgQGNvZGV7c2l6ZX0gY2FuCi1hdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBtYW55IGZvcm1hdHMuCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtzaXplfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgc3RyaW5ncwotQGNoYXB0ZXIgc3RyaW5ncwotQGtpbmRleCBzdHJpbmdzCi1AY2luZGV4IGxpc3RpbmdzIHN0cmluZ3MKLUBjaW5kZXggcHJpbnRpbmcgc3RyaW5ncwotQGNpbmRleCBzdHJpbmdzLCBwcmludGluZwotCi1Ac21hbGxleGFtcGxlCi1zdHJpbmdzIFstYWZvdl0gWy1AdmFye21pbi1sZW59XSBbLW4gQHZhcnttaW4tbGVufV0gWy10IEB2YXJ7cmFkaXh9XSBbLV0KLSAgICAgICAgWy0tYWxsXSBbLS1wcmludC1maWxlLW5hbWVdIFstLWJ5dGVzPUB2YXJ7bWluLWxlbn1dCi0gICAgICAgIFstLXJhZGl4PUB2YXJ7cmFkaXh9XSBbLS10YXJnZXQ9QHZhcntiZmRuYW1lfV0KLSAgICAgICAgWy0taGVscF0gWy0tdmVyc2lvbl0gQHZhcntmaWxlfUBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi0KLUZvciBlYWNoIEB2YXJ7ZmlsZX0gZ2l2ZW4sIEBzY3tnbnV9IEBjb2Rle3N0cmluZ3N9IHByaW50cyB0aGUgcHJpbnRhYmxlCi1jaGFyYWN0ZXIgc2VxdWVuY2VzIHRoYXQgYXJlIGF0IGxlYXN0IDQgY2hhcmFjdGVycyBsb25nIChvciB0aGUgbnVtYmVyCi1naXZlbiB3aXRoIHRoZSBvcHRpb25zIGJlbG93KSBhbmQgYXJlIGZvbGxvd2VkIGJ5IGFuIHVucHJpbnRhYmxlCi1jaGFyYWN0ZXIuICBCeSBkZWZhdWx0LCBpdCBvbmx5IHByaW50cyB0aGUgc3RyaW5ncyBmcm9tIHRoZSBpbml0aWFsaXplZAotYW5kIGxvYWRlZCBzZWN0aW9ucyBvZiBvYmplY3QgZmlsZXM7IGZvciBvdGhlciB0eXBlcyBvZiBmaWxlcywgaXQgcHJpbnRzCi10aGUgc3RyaW5ncyBmcm9tIHRoZSB3aG9sZSBmaWxlLgotCi1AY29kZXtzdHJpbmdzfSBpcyBtYWlubHkgdXNlZnVsIGZvciBkZXRlcm1pbmluZyB0aGUgY29udGVudHMgb2Ygbm9uLXRleHQKLWZpbGVzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1hCi1AaXRlbXggLS1hbGwKLUBpdGVteCAtCi1EbyBub3Qgc2NhbiBvbmx5IHRoZSBpbml0aWFsaXplZCBhbmQgbG9hZGVkIHNlY3Rpb25zIG9mIG9iamVjdCBmaWxlczsKLXNjYW4gdGhlIHdob2xlIGZpbGVzLgotCi1AaXRlbSAtZgotQGl0ZW14IC0tcHJpbnQtZmlsZS1uYW1lCi1QcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcuCi0KLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBwcm9ncmFtIHVzYWdlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCi0KLUBpdGVtIC1AdmFye21pbi1sZW59Ci1AaXRlbXggLW4gQHZhcnttaW4tbGVufQotQGl0ZW14IC0tYnl0ZXM9QHZhcnttaW4tbGVufQotUHJpbnQgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYXQgbGVhc3QgQHZhcnttaW4tbGVufSBjaGFyYWN0ZXJzCi1sb25nLCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDQuCi0KLUBpdGVtIC1vCi1MaWtlIEBzYW1wey10IG99LiAgU29tZSBvdGhlciB2ZXJzaW9ucyBvZiBAY29kZXtzdHJpbmdzfSBoYXZlIEBzYW1wey1vfQotYWN0IGxpa2UgQHNhbXB7LXQgZH0gaW5zdGVhZC4gIFNpbmNlIHdlIGNhbiBub3QgYmUgY29tcGF0aWJsZSB3aXRoIGJvdGgKLXdheXMsIHdlIHNpbXBseSBjaG9zZSBvbmUuCi0KLUBpdGVtIC10IEB2YXJ7cmFkaXh9Ci1AaXRlbXggLS1yYWRpeD1AdmFye3JhZGl4fQotUHJpbnQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLiAgVGhlIHNpbmdsZQotY2hhcmFjdGVyIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgcmFkaXggb2YgdGhlIG9mZnNldC0tLUBzYW1we299IGZvcgotb2N0YWwsIEBzYW1we3h9IGZvciBoZXhhZGVjaW1hbCwgb3IgQHNhbXB7ZH0gZm9yIGRlY2ltYWwuCi0KLUBpdGVtIC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUBjaW5kZXggb2JqZWN0IGNvZGUgZm9ybWF0Ci1TcGVjaWZ5IGFuIG9iamVjdCBjb2RlIGZvcm1hdCBvdGhlciB0aGFuIHlvdXIgc3lzdGVtJ3MgZGVmYXVsdCBmb3JtYXQuCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1QcmludCB0aGUgcHJvZ3JhbSB2ZXJzaW9uIG51bWJlciBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotQGVuZCB0YWJsZQotCi1Abm9kZSBzdHJpcAotQGNoYXB0ZXIgc3RyaXAKLQotQGtpbmRleCBzdHJpcAotQGNpbmRleCByZW1vdmluZyBzeW1ib2xzCi1AY2luZGV4IGRpc2NhcmRpbmcgc3ltYm9scwotQGNpbmRleCBzeW1ib2xzLCBkaXNjYXJkaW5nCi0KLUBzbWFsbGV4YW1wbGUKLXN0cmlwIFsgLUYgQHZhcntiZmRuYW1lfSB8IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgWyAtSSBAdmFye2JmZG5hbWV9IHwgLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICBbIC1PIEB2YXJ7YmZkbmFtZX0gfCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICBbIC1zIHwgLS1zdHJpcC1hbGwgXSBbIC1TIHwgLWcgfCAtLXN0cmlwLWRlYnVnIF0KLSAgICAgIFsgLUsgQHZhcntzeW1ib2xuYW1lfSB8IC0ta2VlcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfSBdCi0gICAgICBbIC1OIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLXN0cmlwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgIFsgLXggfCAtLWRpc2NhcmQtYWxsIF0gWyAtWCB8IC0tZGlzY2FyZC1sb2NhbHMgXQotICAgICAgWyAtUiBAdmFye3NlY3Rpb25uYW1lfSB8IC0tcmVtb3ZlLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0gXQotICAgICAgWyAtbyBAdmFye2ZpbGV9IF0gWyAtcCB8IC0tcHJlc2VydmUtZGF0ZXMgXQotICAgICAgWyAtdiB8IC0tdmVyYm9zZSBdICBbIC1WIHwgLS12ZXJzaW9uIF0gIFsgLS1oZWxwIF0KLSAgICAgIEB2YXJ7b2JqZmlsZX1AZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1Ac2N7Z251fSBAY29kZXtzdHJpcH0gZGlzY2FyZHMgYWxsIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMKLUB2YXJ7b2JqZmlsZX0uICBUaGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgbWF5IGluY2x1ZGUgYXJjaGl2ZXMuCi1BdCBsZWFzdCBvbmUgb2JqZWN0IGZpbGUgbXVzdCBiZSBnaXZlbi4KLQotQGNvZGV7c3RyaXB9IG1vZGlmaWVzIHRoZSBmaWxlcyBuYW1lZCBpbiBpdHMgYXJndW1lbnQsCi1yYXRoZXIgdGhhbiB3cml0aW5nIG1vZGlmaWVkIGNvcGllcyB1bmRlciBkaWZmZXJlbnQgbmFtZXMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUYgQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLVRyZWF0IHRoZSBvcmlnaW5hbCBAdmFye29iamZpbGV9IGFzIGEgZmlsZSB3aXRoIHRoZSBvYmplY3QKLWNvZGUgZm9ybWF0IEB2YXJ7YmZkbmFtZX0sIGFuZCByZXdyaXRlIGl0IGluIHRoZSBzYW1lIGZvcm1hdC4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLS1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0byBAY29kZXtzdHJpcH0gYW5kIGV4aXQuCi0KLUBpdGVtIC1JIEB2YXJ7YmZkbmFtZX0JCi1AaXRlbXggLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQotVHJlYXQgdGhlIG9yaWdpbmFsIEB2YXJ7b2JqZmlsZX0gYXMgYSBmaWxlIHdpdGggdGhlIG9iamVjdAotY29kZSBmb3JtYXQgQHZhcntiZmRuYW1lfS4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLU8gQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9Ci1SZXBsYWNlIEB2YXJ7b2JqZmlsZX0gd2l0aCBhIGZpbGUgaW4gdGhlIG91dHB1dCBmb3JtYXQgQHZhcntiZmRuYW1lfS4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLVIgQHZhcntzZWN0aW9ubmFtZX0KLUBpdGVteCAtLXJlbW92ZS1zZWN0aW9uPUB2YXJ7c2VjdGlvbm5hbWV9Ci1SZW1vdmUgYW55IHNlY3Rpb24gbmFtZWQgQHZhcntzZWN0aW9ubmFtZX0gZnJvbSB0aGUgb3V0cHV0IGZpbGUuICBUaGlzCi1vcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uCi1pbmFwcHJvcHJpYXRlbHkgbWF5IG1ha2UgdGhlIG91dHB1dCBmaWxlIHVudXNhYmxlLgotCi1AaXRlbSAtcwotQGl0ZW14IC0tc3RyaXAtYWxsCi1SZW1vdmUgYWxsIHN5bWJvbHMuCi0KLUBpdGVtIC1nCi1AaXRlbXggLVMKLUBpdGVteCAtLXN0cmlwLWRlYnVnCi1SZW1vdmUgZGVidWdnaW5nIHN5bWJvbHMgb25seS4KLQotQGl0ZW0gLS1zdHJpcC11bm5lZWRlZAotUmVtb3ZlIGFsbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBuZWVkZWQgZm9yIHJlbG9jYXRpb24gcHJvY2Vzc2luZy4KLQotQGl0ZW0gLUsgQHZhcntzeW1ib2xuYW1lfQotQGl0ZW14IC0ta2VlcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQotS2VlcCBvbmx5IHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IGZyb20gdGhlIHNvdXJjZSBmaWxlLiAgVGhpcyBvcHRpb24gbWF5Ci1iZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLQotQGl0ZW0gLU4gQHZhcntzeW1ib2xuYW1lfQotQGl0ZW14IC0tc3RyaXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0KLVJlbW92ZSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24gbWF5IGJlCi1naXZlbiBtb3JlIHRoYW4gb25jZSwgYW5kIG1heSBiZSBjb21iaW5lZCB3aXRoIHN0cmlwIG9wdGlvbnMgb3RoZXIgdGhhbgotQGNvZGV7LUt9LgotCi1AaXRlbSAtbyBAdmFye2ZpbGV9Ci1QdXQgdGhlIHN0cmlwcGVkIG91dHB1dCBpbiBAdmFye2ZpbGV9LCByYXRoZXIgdGhhbiByZXBsYWNpbmcgdGhlCi1leGlzdGluZyBmaWxlLiAgV2hlbiB0aGlzIGFyZ3VtZW50IGlzIHVzZWQsIG9ubHkgb25lIEB2YXJ7b2JqZmlsZX0KLWFyZ3VtZW50IG1heSBiZSBzcGVjaWZpZWQuCi0KLUBpdGVtIC1wCi1AaXRlbXggLS1wcmVzZXJ2ZS1kYXRlcwotUHJlc2VydmUgdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGVzIG9mIHRoZSBmaWxlLgotCi1AaXRlbSAteAotQGl0ZW14IC0tZGlzY2FyZC1hbGwKLVJlbW92ZSBub24tZ2xvYmFsIHN5bWJvbHMuCi0KLUBpdGVtIC1YCi1AaXRlbXggLS1kaXNjYXJkLWxvY2FscwotUmVtb3ZlIGNvbXBpbGVyLWdlbmVyYXRlZCBsb2NhbCBzeW1ib2xzLgotKFRoZXNlIHVzdWFsbHkgc3RhcnQgd2l0aCBAc2FtcHtMfSBvciBAc2FtcHsufS4pCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgQGNvZGV7c3RyaXB9LgotCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyYm9zZQotVmVyYm9zZSBvdXRwdXQ6IGxpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZC4gIEluIHRoZSBjYXNlIG9mCi1hcmNoaXZlcywgQHNhbXB7c3RyaXAgLXZ9IGxpc3RzIGFsbCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBjKytmaWx0LCBhZGRyMmxpbmUsIHN0cmlwLCBUb3AKLUBjaGFwdGVyIGMrK2ZpbHQKLQotQGtpbmRleCBjKytmaWx0Ci1AY2luZGV4IGRlbWFuZ2xpbmcgQysrIHN5bWJvbHMKLQotQHNtYWxsZXhhbXBsZQotYysrZmlsdCBbIC1fIHwgLS1zdHJpcC11bmRlcnNjb3JlcyBdCi0gICAgICAgIFsgLWogfCAtLWphdmEgXQotCVsgLW4gfCAtLW5vLXN0cmlwLXVuZGVyc2NvcmVzIF0KLSAgICAgICAgWyAtcyBAdmFye2Zvcm1hdH0gfCAtLWZvcm1hdD1AdmFye2Zvcm1hdH0gXQotICAgICAgICBbIC0taGVscCBdICBbIC0tdmVyc2lvbiBdICBbIEB2YXJ7c3ltYm9sfUBkb3Rze30gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGtpbmRleCBjeHhmaWx0Ci1UaGUgQysrIGFuZCBKYXZhIGxhbmd1YWdlcyBwcm92aWRlcyBmdW5jdGlvbiBvdmVybG9hZGluZywgd2hpY2ggbWVhbnMKLXRoYXQgeW91IGNhbiB3cml0ZSBtYW55IGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgKHByb3ZpZGluZyBlYWNoCi10YWtlcyBwYXJhbWV0ZXJzIG9mIGRpZmZlcmVudCB0eXBlcykuICBBbGwgQysrIGFuZCBKYXZhIGZ1bmN0aW9uIG5hbWVzCi1hcmUgZW5jb2RlZCBpbnRvIGEgbG93LWxldmVsIGFzc2VtYmx5IGxhYmVsICh0aGlzIHByb2Nlc3MgaXMga25vd24gYXMKLUBkZm57bWFuZ2xpbmd9KS4gVGhlIEBjb2Rle2MrK2ZpbHR9Ci1AZm9vdG5vdGV7TVMtRE9TIGRvZXMgbm90IGFsbG93IEBrYmR7K30gY2hhcmFjdGVycyBpbiBmaWxlIG5hbWVzLCBzbyBvbgotTVMtRE9TIHRoaXMgcHJvZ3JhbSBpcyBuYW1lZCBAY29kZXtjeHhmaWx0fS59Ci1wcm9ncmFtIGRvZXMgdGhlIGludmVyc2UgbWFwcGluZzogaXQgZGVjb2RlcyAoQGRmbntkZW1hbmdsZXN9KSBsb3ctbGV2ZWwKLW5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcyBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuIGtlZXAgdGhlc2Ugb3ZlcmxvYWRlZAotZnVuY3Rpb25zIGZyb20gY2xhc2hpbmcuCi0KLUV2ZXJ5IGFscGhhbnVtZXJpYyB3b3JkIChjb25zaXN0aW5nIG9mIGxldHRlcnMsIGRpZ2l0cywgdW5kZXJzY29yZXMsCi1kb2xsYXJzLCBvciBwZXJpb2RzKSBzZWVuIGluIHRoZSBpbnB1dCBpcyBhIHBvdGVudGlhbCBsYWJlbC4gIElmIHRoZQotbGFiZWwgZGVjb2RlcyBpbnRvIGEgQysrIG5hbWUsIHRoZSBDKysgbmFtZSByZXBsYWNlcyB0aGUgbG93LWxldmVsCi1uYW1lIGluIHRoZSBvdXRwdXQuCi0KLVlvdSBjYW4gdXNlIEBjb2Rle2MrK2ZpbHR9IHRvIGRlY2lwaGVyIGluZGl2aWR1YWwgc3ltYm9sczoKLQotQGV4YW1wbGUKLWMrK2ZpbHQgQHZhcntzeW1ib2x9Ci1AZW5kIGV4YW1wbGUKLQotSWYgbm8gQHZhcntzeW1ib2x9IGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIEBjb2Rle2MrK2ZpbHR9IHJlYWRzIHN5bWJvbAotbmFtZXMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlcyB0aGUgZGVtYW5nbGVkIG5hbWVzIHRvIHRoZQotc3RhbmRhcmQgb3V0cHV0LiAgQWxsIHJlc3VsdHMgYXJlIHByaW50ZWQgb24gdGhlIHN0YW5kYXJkIG91dHB1dC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtXwotQGl0ZW14IC0tc3RyaXAtdW5kZXJzY29yZXMKLU9uIHNvbWUgc3lzdGVtcywgYm90aCB0aGUgQyBhbmQgQysrIGNvbXBpbGVycyBwdXQgYW4gdW5kZXJzY29yZSBpbiBmcm9udAotb2YgZXZlcnkgbmFtZS4gIEZvciBleGFtcGxlLCB0aGUgQyBuYW1lIEBjb2Rle2Zvb30gZ2V0cyB0aGUgbG93LWxldmVsCi1uYW1lIEBjb2Rle19mb299LiAgVGhpcyBvcHRpb24gcmVtb3ZlcyB0aGUgaW5pdGlhbCB1bmRlcnNjb3JlLiAgV2hldGhlcgotQGNvZGV7YysrZmlsdH0gcmVtb3ZlcyB0aGUgdW5kZXJzY29yZSBieSBkZWZhdWx0IGlzIHRhcmdldCBkZXBlbmRlbnQuCi0KLUBpdGVtIC1qCi1AaXRlbXggLS1qYXZhCi1QcmludHMgZGVtYW5nbGVkIG5hbWVzIHVzaW5nIEphdmEgc3ludGF4LiAgVGhlIGRlZmF1bHQgaXMgdG8gdXNlIEMrKwotc3ludGF4LgotCi1AaXRlbSAtbgotQGl0ZW14IC0tbm8tc3RyaXAtdW5kZXJzY29yZXMKLURvIG5vdCByZW1vdmUgdGhlIGluaXRpYWwgdW5kZXJzY29yZS4KLQotQGl0ZW0gLXMgQHZhcntmb3JtYXR9Ci1AaXRlbXggLS1mb3JtYXQ9QHZhcntmb3JtYXR9Ci1Ac2N7Z251fSBAY29kZXtubX0gY2FuIGRlY29kZSB0aHJlZSBkaWZmZXJlbnQgbWV0aG9kcyBvZiBtYW5nbGluZywgdXNlZCBieQotZGlmZmVyZW50IEMrKyBjb21waWxlcnMuICBUaGUgYXJndW1lbnQgdG8gdGhpcyBvcHRpb24gc2VsZWN0cyB3aGljaAotbWV0aG9kIGl0IHVzZXM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gZ251Ci10aGUgb25lIHVzZWQgYnkgdGhlIEBzY3tnbnV9IGNvbXBpbGVyICh0aGUgZGVmYXVsdCBtZXRob2QpCi1AaXRlbSBsdWNpZAotdGhlIG9uZSB1c2VkIGJ5IHRoZSBMdWNpZCBjb21waWxlcgotQGl0ZW0gYXJtCi10aGUgb25lIHNwZWNpZmllZCBieSB0aGUgQysrIEFubm90YXRlZCBSZWZlcmVuY2UgTWFudWFsCi1AaXRlbSBocAotdGhlIG9uZSB1c2VkIGJ5IHRoZSBIUCBjb21waWxlcgotQGl0ZW0gZWRnCi10aGUgb25lIHVzZWQgYnkgdGhlIEVERyBjb21waWxlcgotQGVuZCB0YWJsZQotCi1AaXRlbSAtLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0byBAY29kZXtjKytmaWx0fSBhbmQgZXhpdC4KLQotQGl0ZW0gLS12ZXJzaW9uCi1QcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7YysrZmlsdH0gYW5kIGV4aXQuCi1AZW5kIHRhYmxlCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBAY29kZXtjKytmaWx0fSBpcyBhIG5ldyB1dGlsaXR5LCBhbmQgdGhlIGRldGFpbHMgb2YgaXRzCi11c2VyIGludGVyZmFjZSBhcmUgc3ViamVjdCB0byBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLiAgSW4gcGFydGljdWxhciwKLWEgY29tbWFuZC1saW5lIG9wdGlvbiBtYXkgYmUgcmVxdWlyZWQgaW4gdGhlIHRoZSBmdXR1cmUgdG8gZGVjb2RlIGEgbmFtZQotcGFzc2VkIGFzIGFuIGFyZ3VtZW50IG9uIHRoZSBjb21tYW5kIGxpbmU7IGluIG90aGVyIHdvcmRzLCAKLQotQGV4YW1wbGUKLWMrK2ZpbHQgQHZhcntzeW1ib2x9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1tYXkgaW4gYSBmdXR1cmUgcmVsZWFzZSBiZWNvbWUKLQotQGV4YW1wbGUKLWMrK2ZpbHQgQHZhcntvcHRpb259IEB2YXJ7c3ltYm9sfQotQGVuZCBleGFtcGxlCi1AZW5kIHF1b3RhdGlvbgotCi1Abm9kZSBhZGRyMmxpbmUKLUBjaGFwdGVyIGFkZHIybGluZQotCi1Aa2luZGV4IGFkZHIybGluZQotQGNpbmRleCBhZGRyZXNzIHRvIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIKLQotQHNtYWxsZXhhbXBsZQotYWRkcjJsaW5lIFsgLWIgQHZhcntiZmRuYW1lfSB8IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgICAgIFsgLUMgfCAtLWRlbWFuZ2xlIF0KLSAgICAgICAgICBbIC1lIEB2YXJ7ZmlsZW5hbWV9IHwgLS1leGU9QHZhcntmaWxlbmFtZX0gXQotICAgICAgICAgIFsgLWYgfCAtLWZ1bmN0aW9ucyBdIFsgLXMgfCAtLWJhc2VuYW1lIF0KLSAgICAgICAgICBbIC1IIHwgLS1oZWxwIF0gWyAtViB8IC0tdmVyc2lvbiBdCi0gICAgICAgICAgWyBhZGRyIGFkZHIgLi4uIF0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle2FkZHIybGluZX0gdHJhbnNsYXRlcyBwcm9ncmFtIGFkZHJlc3NlcyBpbnRvIGZpbGUgbmFtZXMgYW5kIGxpbmUKLW51bWJlcnMuICBHaXZlbiBhbiBhZGRyZXNzIGFuZCBhbiBleGVjdXRhYmxlLCBpdCB1c2VzIHRoZSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIGluIHRoZSBleGVjdXRhYmxlIHRvIGZpZ3VyZSBvdXQgd2hpY2ggZmlsZSBuYW1lIGFuZCBsaW5lCi1udW1iZXIgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGFkZHJlc3MuCi0KLVRoZSBleGVjdXRhYmxlIHRvIHVzZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgQGNvZGV7LWV9IG9wdGlvbi4gIFRoZQotZGVmYXVsdCBpcyB0aGUgZmlsZSBAZmlsZXthLm91dH0uCi0KLUBjb2Rle2FkZHIybGluZX0gaGFzIHR3byBtb2RlcyBvZiBvcGVyYXRpb24uCi0KLUluIHRoZSBmaXJzdCwgaGV4YWRlY2ltYWwgYWRkcmVzc2VzIGFyZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwKLWFuZCBAY29kZXthZGRyMmxpbmV9IGRpc3BsYXlzIHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBlYWNoCi1hZGRyZXNzLgotCi1JbiB0aGUgc2Vjb25kLCBAY29kZXthZGRyMmxpbmV9IHJlYWRzIGhleGFkZWNpbWFsIGFkZHJlc3NlcyBmcm9tCi1zdGFuZGFyZCBpbnB1dCwgYW5kIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBmb3IgZWFjaAotYWRkcmVzcyBvbiBzdGFuZGFyZCBvdXRwdXQuICBJbiB0aGlzIG1vZGUsIEBjb2Rle2FkZHIybGluZX0gbWF5IGJlIHVzZWQKLWluIGEgcGlwZSB0byBjb252ZXJ0IGR5bmFtaWNhbGx5IGNob3NlbiBhZGRyZXNzZXMuCi0KLVRoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBpcyBAc2FtcHtGSUxFTkFNRTpMSU5FTk99LiAgVGhlIGZpbGUgbmFtZSBhbmQKLWxpbmUgbnVtYmVyIGZvciBlYWNoIGFkZHJlc3MgaXMgcHJpbnRlZCBvbiBhIHNlcGFyYXRlIGxpbmUuICBJZiB0aGUKLUBjb2Rley1mfSBvcHRpb24gaXMgdXNlZCwgdGhlbiBlYWNoIEBzYW1we0ZJTEVOQU1FOkxJTkVOT30gbGluZSBpcwotcHJlY2VkZWQgYnkgYSBAc2FtcHtGVU5DVElPTk5BTUV9IGxpbmUgd2hpY2ggaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCi1jb250YWluaW5nIHRoZSBhZGRyZXNzLgotCi1JZiB0aGUgZmlsZSBuYW1lIG9yIGZ1bmN0aW9uIG5hbWUgY2FuIG5vdCBiZSBkZXRlcm1pbmVkLAotQGNvZGV7YWRkcjJsaW5lfSB3aWxsIHByaW50IHR3byBxdWVzdGlvbiBtYXJrcyBpbiB0aGVpciBwbGFjZS4gIElmIHRoZQotbGluZSBudW1iZXIgY2FuIG5vdCBiZSBkZXRlcm1pbmVkLCBAY29kZXthZGRyMmxpbmV9IHdpbGwgcHJpbnQgMC4KLQotVGhlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIG9wdGlvbnMsIHNob3duIGhlcmUgYXMgYWx0ZXJuYXRpdmVzLCBhcmUKLWVxdWl2YWxlbnQuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWIgQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUBjaW5kZXggb2JqZWN0IGNvZGUgZm9ybWF0Ci1TcGVjaWZ5IHRoYXQgdGhlIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgdGhlIG9iamVjdCBmaWxlcyBpcwotQHZhcntiZmRuYW1lfS4KLQotQGl0ZW0gLUMKLUBpdGVteCAtLWRlbWFuZ2xlCi1AY2luZGV4IGRlbWFuZ2xpbmcgaW4gb2JqZHVtcAotRGVjb2RlIChAZGZue2RlbWFuZ2xlfSkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCi1CZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKLW1ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4gIEB4cmVme2MrK2ZpbHR9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotb24gZGVtYW5nbGluZy4KLQotQGl0ZW0gLWUgQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLWV4ZT1AdmFye2ZpbGVuYW1lfQotU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSBmb3Igd2hpY2ggYWRkcmVzc2VzIHNob3VsZCBiZQotdHJhbnNsYXRlZC4gIFRoZSBkZWZhdWx0IGZpbGUgaXMgQGZpbGV7YS5vdXR9LgotCi1AaXRlbSAtZgotQGl0ZW14IC0tZnVuY3Rpb25zCi1EaXNwbGF5IGZ1bmN0aW9uIG5hbWVzIGFzIHdlbGwgYXMgZmlsZSBhbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1iYXNlbmFtZXMKLURpc3BsYXkgb25seSB0aGUgYmFzZSBvZiBlYWNoIGZpbGUgbmFtZS4KLUBlbmQgdGFibGUKLQotQG5vZGUgbmxtY29udgotQGNoYXB0ZXIgbmxtY29udgotCi1AY29kZXtubG1jb252fSBjb252ZXJ0cyBhIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlIGludG8gYSBOZXRXYXJlCi1Mb2FkYWJsZSBNb2R1bGUuCi0KLUBpZ25vcmUKLUBjb2Rle25sbWNvbnZ9IGN1cnJlbnRseSB3b3JrcyB3aXRoIEBzYW1we2kzODZ9IG9iamVjdAotZmlsZXMgaW4gQGNvZGV7Y29mZn0sIEBzY3tlbGZ9LCBvciBAY29kZXthLm91dH0gZm9ybWF0LCBhbmQgQHNje1NQQVJDfQotb2JqZWN0IGZpbGVzIGluIEBzY3tlbGZ9LCBvciBAY29kZXthLm91dH0gZm9ybWF0QGZvb3Rub3RlewotQGNvZGV7bmxtY29udn0gc2hvdWxkIHdvcmsgd2l0aCBhbnkgQHNhbXB7aTM4Nn0gb3IgQHNje3NwYXJjfSBvYmplY3QKLWZvcm1hdCBpbiB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LiAgSXQgaGFzIG9ubHkgYmVlbiB0ZXN0ZWQKLXdpdGggdGhlIGFib3ZlIGZvcm1hdHMufS4KLUBlbmQgaWdub3JlCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBAY29kZXtubG1jb252fSBpcyBub3QgYWx3YXlzIGJ1aWx0IGFzIHBhcnQgb2YgdGhlIGJpbmFyeQotdXRpbGl0aWVzLCBzaW5jZSBpdCBpcyBvbmx5IHVzZWZ1bCBmb3IgTkxNIHRhcmdldHMuCi1AZW5kIHF1b3RhdGlvbgotCi1Ac21hbGxleGFtcGxlCi1ubG1jb252IFsgLUkgQHZhcntiZmRuYW1lfSB8IC0taW5wdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgICBbIC1PIEB2YXJ7YmZkbmFtZX0gfCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICAgIFsgLVQgQHZhcntoZWFkZXJmaWxlfSB8IC0taGVhZGVyLWZpbGU9QHZhcntoZWFkZXJmaWxlfSBdCi0gICAgICAgIFsgLWQgfCAtLWRlYnVnXSAgWyAtbCBAdmFye2xpbmtlcn0gfCAtLWxpbmtlcj1AdmFye2xpbmtlcn0gXQotICAgICAgICBbIC1oIHwgLS1oZWxwIF0gIFsgLVYgfCAtLXZlcnNpb24gXQotICAgICAgICBAdmFye2luZmlsZX0gQHZhcntvdXRmaWxlfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7bmxtY29udn0gY29udmVydHMgdGhlIHJlbG9jYXRhYmxlIEBzYW1we2kzODZ9IG9iamVjdCBmaWxlCi1AdmFye2luZmlsZX0gaW50byB0aGUgTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUgQHZhcntvdXRmaWxlfSwgb3B0aW9uYWxseQotcmVhZGluZyBAdmFye2hlYWRlcmZpbGV9IGZvciBOTE0gaGVhZGVyIGluZm9ybWF0aW9uLiAgRm9yIGluc3RydWN0aW9ucwotb24gd3JpdGluZyB0aGUgTkxNIGNvbW1hbmQgZmlsZSBsYW5ndWFnZSB1c2VkIGluIGhlYWRlciBmaWxlcywgc2VlIHRoZQotQHNhbXB7bGlua2Vyc30gc2VjdGlvbiwgQHNhbXB7TkxNTElOS30gaW4gcGFydGljdWxhciwgb2YgdGhlIEBjaXRle05MTQotRGV2ZWxvcG1lbnQgYW5kIFRvb2xzIE92ZXJ2aWV3fSwgd2hpY2ggaXMgcGFydCBvZiB0aGUgTkxNIFNvZnR3YXJlCi1EZXZlbG9wZXIncyBLaXQgKGBgTkxNIFNESycnKSwgYXZhaWxhYmxlIGZyb20gTm92ZWxsLCBJbmMuCi1AY29kZXtubG1jb252fSB1c2VzIHRoZSBAc2N7Z251fSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkgdG8gcmVhZAotQHZhcntpbmZpbGV9OyBzZWUgQHJlZntCRkQsLEJGRCxsZC5pbmZvLFVzaW5nIExEfSwgZm9yCi1tb3JlIGluZm9ybWF0aW9uLgotCi1AY29kZXtubG1jb252fSBjYW4gcGVyZm9ybSBhIGxpbmsgc3RlcC4gIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuIGxpc3QKLW1vcmUgdGhhbiBvbmUgb2JqZWN0IGZpbGUgZm9yIGlucHV0IGlmIHlvdSBsaXN0IHRoZW0gaW4gdGhlIGRlZmluaXRpb25zCi1maWxlIChyYXRoZXIgdGhhbiBzaW1wbHkgc3BlY2lmeWluZyBvbmUgaW5wdXQgZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lKS4KLUluIHRoaXMgY2FzZSwgQGNvZGV7bmxtY29udn0gY2FsbHMgdGhlIGxpbmtlciBmb3IgeW91LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1JIEB2YXJ7YmZkbmFtZX0KLUBpdGVteCAtLWlucHV0LXRhcmdldD1AdmFye2JmZG5hbWV9Ci1PYmplY3QgZm9ybWF0IG9mIHRoZSBpbnB1dCBmaWxlLiAgQGNvZGV7bmxtY29udn0gY2FuIHVzdWFsbHkgZGV0ZXJtaW5lCi10aGUgZm9ybWF0IG9mIGEgZ2l2ZW4gZmlsZSAoc28gbm8gZGVmYXVsdCBpcyBuZWNlc3NhcnkpLgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtTyBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLU9iamVjdCBmb3JtYXQgb2YgdGhlIG91dHB1dCBmaWxlLiAgQGNvZGV7bmxtY29udn0gaW5mZXJzIHRoZSBvdXRwdXQKLWZvcm1hdCBiYXNlZCBvbiB0aGUgaW5wdXQgZm9ybWF0LCBlLmcuIGZvciBhIEBzYW1we2kzODZ9IGlucHV0IGZpbGUgdGhlCi1vdXRwdXQgZm9ybWF0IGlzIEBzYW1we25sbTMyLWkzODZ9LgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtVCBAdmFye2hlYWRlcmZpbGV9Ci1AaXRlbXggLS1oZWFkZXItZmlsZT1AdmFye2hlYWRlcmZpbGV9Ci1SZWFkcyBAdmFye2hlYWRlcmZpbGV9IGZvciBOTE0gaGVhZGVyIGluZm9ybWF0aW9uLiAgRm9yIGluc3RydWN0aW9ucyBvbgotd3JpdGluZyB0aGUgTkxNIGNvbW1hbmQgZmlsZSBsYW5ndWFnZSB1c2VkIGluIGhlYWRlciBmaWxlcywgc2VlQCBzZWUgdGhlCi1Ac2FtcHtsaW5rZXJzfSBzZWN0aW9uLCBvZiB0aGUgQGNpdGV7TkxNIERldmVsb3BtZW50IGFuZCBUb29scwotT3ZlcnZpZXd9LCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBOTE0gU29mdHdhcmUgRGV2ZWxvcGVyJ3MgS2l0LCBhdmFpbGFibGUKLWZyb20gTm92ZWxsLCBJbmMuCi0KLUBpdGVtIC1kCi1AaXRlbXggLS1kZWJ1ZwotRGlzcGxheXMgKG9uIHN0YW5kYXJkIGVycm9yKSB0aGUgbGlua2VyIGNvbW1hbmQgbGluZSB1c2VkIGJ5IEBjb2Rle25sbWNvbnZ9LgotCi1AaXRlbSAtbCBAdmFye2xpbmtlcn0KLUBpdGVteCAtLWxpbmtlcj1AdmFye2xpbmtlcn0KLVVzZSBAdmFye2xpbmtlcn0gZm9yIGFueSBsaW5raW5nLiAgQHZhcntsaW5rZXJ9IGNhbiBiZSBhbiBhYnNvbHV0ZSBvciBhCi1yZWxhdGl2ZSBwYXRobmFtZS4KLQotQGl0ZW0gLWgKLUBpdGVteCAtLWhlbHAKLVByaW50cyBhIHVzYWdlIHN1bW1hcnkuCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uCi1QcmludHMgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBAY29kZXtubG1jb252fS4KLUBlbmQgdGFibGUKLQotQG5vZGUgd2luZHJlcwotQGNoYXB0ZXIgd2luZHJlcwotCi1AY29kZXt3aW5kcmVzfSBtYXkgYmUgdXNlZCB0byBtYW5pcHVsYXRlIFdpbmRvd3MgcmVzb3VyY2VzLgotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gQGNvZGV7d2luZHJlc30gaXMgbm90IGFsd2F5cyBidWlsdCBhcyBwYXJ0IG9mIHRoZSBiaW5hcnkKLXV0aWxpdGllcywgc2luY2UgaXQgaXMgb25seSB1c2VmdWwgZm9yIFdpbmRvd3MgdGFyZ2V0cy4KLUBlbmQgcXVvdGF0aW9uCi0KLUBzbWFsbGV4YW1wbGUKLXdpbmRyZXMgW29wdGlvbnNdIFtpbnB1dC1maWxlXSBbb3V0cHV0LWZpbGVdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXt3aW5kcmVzfSByZWFkcyByZXNvdXJjZXMgZnJvbSBhbiBpbnB1dCBmaWxlIGFuZCBjb3BpZXMgdGhlbSBpbnRvCi1hbiBvdXRwdXQgZmlsZS4gIEVpdGhlciBmaWxlIG1heSBiZSBpbiBvbmUgb2YgdGhyZWUgZm9ybWF0czoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSByYwotQSB0ZXh0IGZvcm1hdCByZWFkIGJ5IHRoZSBSZXNvdXJjZSBDb21waWxlci4KLQotQGl0ZW0gcmVzCi1BIGJpbmFyeSBmb3JtYXQgZ2VuZXJhdGVkIGJ5IHRoZSBSZXNvdXJjZSBDb21waWxlci4KLQotQGl0ZW0gY29mZgotQSBDT0ZGIG9iamVjdCBvciBleGVjdXRhYmxlLgotQGVuZCB0YWJsZQotCi1UaGUgZXhhY3QgZGVzY3JpcHRpb24gb2YgdGhlc2UgZGlmZmVyZW50IGZvcm1hdHMgaXMgYXZhaWxhYmxlIGluCi1kb2N1bWVudGF0aW9uIGZyb20gTWljcm9zb2Z0LgotCi1XaGVuIEBjb2Rle3dpbmRyZXN9IGNvbnZlcnRzIGZyb20gdGhlIEBjb2Rle3JjfSBmb3JtYXQgdG8gdGhlIEBjb2Rle3Jlc30KLWZvcm1hdCwgaXQgaXMgYWN0aW5nIGxpa2UgdGhlIFdpbmRvd3MgUmVzb3VyY2UgQ29tcGlsZXIuICBXaGVuCi1AY29kZXt3aW5kcmVzfSBjb252ZXJ0cyBmcm9tIHRoZSBAY29kZXtyZXN9IGZvcm1hdCB0byB0aGUgQGNvZGV7Y29mZn0KLWZvcm1hdCwgaXQgaXMgYWN0aW5nIGxpa2UgdGhlIFdpbmRvd3MgQGNvZGV7Q1ZUUkVTfSBwcm9ncmFtLgotCi1XaGVuIEBjb2Rle3dpbmRyZXN9IGdlbmVyYXRlcyBhbiBAY29kZXtyY30gZmlsZSwgdGhlIG91dHB1dCBpcyBzaW1pbGFyCi1idXQgbm90IGlkZW50aWNhbCB0byB0aGUgZm9ybWF0IGV4cGVjdGVkIGZvciB0aGUgaW5wdXQuICBXaGVuIGFuIGlucHV0Ci1AY29kZXtyY30gZmlsZSByZWZlcnMgdG8gYW4gZXh0ZXJuYWwgZmlsZW5hbWUsIGFuIG91dHB1dCBAY29kZXtyY30gZmlsZQotd2lsbCBpbnN0ZWFkIGluY2x1ZGUgdGhlIGZpbGUgY29udGVudHMuCi0KLUlmIHRoZSBpbnB1dCBvciBvdXRwdXQgZm9ybWF0IGlzIG5vdCBzcGVjaWZpZWQsIEBjb2Rle3dpbmRyZXN9IHdpbGwKLWd1ZXNzIGJhc2VkIG9uIHRoZSBmaWxlIG5hbWUsIG9yLCBmb3IgdGhlIGlucHV0IGZpbGUsIHRoZSBmaWxlIGNvbnRlbnRzLgotQSBmaWxlIHdpdGggYW4gZXh0ZW5zaW9uIG9mIEBmaWxley5yY30gd2lsbCBiZSB0cmVhdGVkIGFzIGFuIEBjb2Rle3JjfQotZmlsZSwgYSBmaWxlIHdpdGggYW4gZXh0ZW5zaW9uIG9mIEBmaWxley5yZXN9IHdpbGwgYmUgdHJlYXRlZCBhcyBhCi1AY29kZXtyZXN9IGZpbGUsIGFuZCBhIGZpbGUgd2l0aCBhbiBleHRlbnNpb24gb2YgQGZpbGV7Lm99IG9yCi1AZmlsZXsuZXhlfSB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBAY29kZXtjb2ZmfSBmaWxlLgotCi1JZiBubyBvdXRwdXQgZmlsZSBpcyBzcGVjaWZpZWQsIEBjb2Rle3dpbmRyZXN9IHdpbGwgcHJpbnQgdGhlIHJlc291cmNlcwotaW4gQGNvZGV7cmN9IGZvcm1hdCB0byBzdGFuZGFyZCBvdXRwdXQuCi0KLVRoZSBub3JtYWwgdXNlIGlzIGZvciB5b3UgdG8gd3JpdGUgYW4gQGNvZGV7cmN9IGZpbGUsIHVzZSBAY29kZXt3aW5kcmVzfQotdG8gY29udmVydCBpdCB0byBhIENPRkYgb2JqZWN0IGZpbGUsIGFuZCB0aGVuIGxpbmsgdGhlIENPRkYgZmlsZSBpbnRvCi15b3VyIGFwcGxpY2F0aW9uLiAgVGhpcyB3aWxsIG1ha2UgdGhlIHJlc291cmNlcyBkZXNjcmliZWQgaW4gdGhlCi1AY29kZXtyY30gZmlsZSBhdmFpbGFibGUgdG8gV2luZG93cy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtaSBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0taW5wdXQgQHZhcntmaWxlbmFtZX0KLVRoZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlLiAgSWYgdGhpcyBvcHRpb24gaXMgbm90IHVzZWQsIHRoZW4KLUBjb2Rle3dpbmRyZXN9IHdpbGwgdXNlIHRoZSBmaXJzdCBub24tb3B0aW9uIGFyZ3VtZW50IGFzIHRoZSBpbnB1dCBmaWxlCi1uYW1lLiAgSWYgdGhlcmUgYXJlIG5vIG5vbi1vcHRpb24gYXJndW1lbnRzLCB0aGVuIEBjb2Rle3dpbmRyZXN9IHdpbGwKLXJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIEBjb2Rle3dpbmRyZXN9IGNhbiBub3QgcmVhZCBhIENPRkYgZmlsZSBmcm9tCi1zdGFuZGFyZCBpbnB1dC4KLQotQGl0ZW0gLW8gQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLW91dHB1dCBAdmFye2ZpbGVuYW1lfQotVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlLiAgSWYgdGhpcyBvcHRpb24gaXMgbm90IHVzZWQsIHRoZW4KLUBjb2Rle3dpbmRyZXN9IHdpbGwgdXNlIHRoZSBmaXJzdCBub24tb3B0aW9uIGFyZ3VtZW50LCBhZnRlciBhbnkgdXNlZAotZm9yIHRoZSBpbnB1dCBmaWxlIG5hbWUsIGFzIHRoZSBvdXRwdXQgZmlsZSBuYW1lLiAgSWYgdGhlcmUgaXMgbm8KLW5vbi1vcHRpb24gYXJndW1lbnQsIHRoZW4gQGNvZGV7d2luZHJlc30gd2lsbCB3cml0ZSB0byBzdGFuZGFyZCBvdXRwdXQuCi1AY29kZXt3aW5kcmVzfSBjYW4gbm90IHdyaXRlIGEgQ09GRiBmaWxlIHRvIHN0YW5kYXJkIG91dHB1dC4KLQotQGl0ZW0gLUkgQHZhcntmb3JtYXR9Ci1AaXRlbXggLS1pbnB1dC1mb3JtYXQgQHZhcntmb3JtYXR9Ci1UaGUgaW5wdXQgZm9ybWF0IHRvIHJlYWQuICBAdmFye2Zvcm1hdH0gbWF5IGJlIEBzYW1we3Jlc30sIEBzYW1we3JjfSwgb3IKLUBzYW1we2NvZmZ9LiAgSWYgbm8gaW5wdXQgZm9ybWF0IGlzIHNwZWNpZmllZCwgQGNvZGV7d2luZHJlc30gd2lsbAotZ3Vlc3MsIGFzIGRlc2NyaWJlZCBhYm92ZS4KLQotQGl0ZW0gLU8gQHZhcntmb3JtYXR9Ci1AaXRlbXggLS1vdXRwdXQtZm9ybWF0IEB2YXJ7Zm9ybWF0fQotVGhlIG91dHB1dCBmb3JtYXQgdG8gZ2VuZXJhdGUuICBAdmFye2Zvcm1hdH0gbWF5IGJlIEBzYW1we3Jlc30sCi1Ac2FtcHtyY30sIG9yIEBzYW1we2NvZmZ9LiAgSWYgbm8gb3V0cHV0IGZvcm1hdCBpcyBzcGVjaWZpZWQsCi1AY29kZXt3aW5kcmVzfSB3aWxsIGd1ZXNzLCBhcyBkZXNjcmliZWQgYWJvdmUuCi0KLUBpdGVtIC1GIEB2YXJ7dGFyZ2V0fQotQGl0ZW14IC0tdGFyZ2V0IEB2YXJ7dGFyZ2V0fQotU3BlY2lmeSB0aGUgQkZEIGZvcm1hdCB0byB1c2UgZm9yIGEgQ09GRiBmaWxlIGFzIGlucHV0IG9yIG91dHB1dC4gIFRoaXMKLWlzIGEgQkZEIHRhcmdldCBuYW1lOyB5b3UgY2FuIHVzZSB0aGUgQGNvZGV7LS1oZWxwfSBvcHRpb24gdG8gc2VlIGEgbGlzdAotb2Ygc3VwcG9ydGVkIHRhcmdldHMuICBOb3JtYWxseSBAY29kZXt3aW5kcmVzfSB3aWxsIHVzZSB0aGUgZGVmYXVsdAotZm9ybWF0LCB3aGljaCBpcyB0aGUgZmlyc3Qgb25lIGxpc3RlZCBieSB0aGUgQGNvZGV7LS1oZWxwfSBvcHRpb24uCi1AcmVme1RhcmdldCBTZWxlY3Rpb259LgotCi1AaXRlbSAtLXByZXByb2Nlc3NvciBAdmFye3Byb2dyYW19Ci1XaGVuIEBjb2Rle3dpbmRyZXN9IHJlYWRzIGFuIEBjb2Rle3JjfSBmaWxlLCBpdCBydW5zIGl0IHRocm91Z2ggdGhlIEMKLXByZXByb2Nlc3NvciBmaXJzdC4gIFRoaXMgb3B0aW9uIG1heSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHByZXByb2Nlc3NvcgotdG8gdXNlLCBpbmNsdWRpbmcgYW55IGxlYWRpbmcgYXJndW1lbnRzLiAgVGhlIGRlZmF1bHQgcHJlcHJvY2Vzc29yCi1hcmd1bWVudCBpcyBAY29kZXtnY2MgLUUgLXhjLWhlYWRlciAtRFJDX0lOVk9LRUR9LgotCi1AaXRlbSAtLWluY2x1ZGUtZGlyIEB2YXJ7ZGlyZWN0b3J5fQotU3BlY2lmeSBhbiBpbmNsdWRlIGRpcmVjdG9yeSB0byB1c2Ugd2hlbiByZWFkaW5nIGFuIEBjb2Rle3JjfSBmaWxlLgotQGNvZGV7d2luZHJlc30gd2lsbCBwYXNzIHRoaXMgdG8gdGhlIHByZXByb2Nlc3NvciBhcyBhbiBAY29kZXstSX0KLW9wdGlvbi4gIEBjb2Rle3dpbmRyZXN9IHdpbGwgYWxzbyBzZWFyY2ggdGhpcyBkaXJlY3Rvcnkgd2hlbiBsb29raW5nIGZvcgotZmlsZXMgbmFtZWQgaW4gdGhlIEBjb2Rle3JjfSBmaWxlLgotCi1AaXRlbSAtRCBAdmFye3RhcmdldH0KLUBpdGVteCAtLWRlZmluZSBAdmFye3N5bX1bPUB2YXJ7dmFsfV0KLVNwZWNpZnkgYSBAY29kZXstRH0gb3B0aW9uIHRvIHBhc3MgdG8gdGhlIHByZXByb2Nlc3NvciB3aGVuIHJlYWRpbmcgYW4KLUBjb2Rle3JjfSBmaWxlLgotCi1AaXRlbSAtdgotRW5hYmxlIHZlcmJvc2UgbW9kZS4gIFRoaXMgdGVsbHMgeW91IHdoYXQgdGhlIHByZXByb2Nlc3NvciBpcyBpZiB5b3UKLWRpZG4ndCBzcGVjaWZ5IG9uZS4KLQotQGl0ZW0gLS1sYW5ndWFnZSBAdmFye3ZhbH0KLVNwZWNpZnkgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgdG8gdXNlIHdoZW4gcmVhZGluZyBhbiBAY29kZXtyY30gZmlsZS4KLUB2YXJ7dmFsfSBzaG91bGQgYmUgYSBoZXhhZGVjaW1hbCBsYW5ndWFnZSBjb2RlLiAgVGhlIGxvdyBlaWdodCBiaXRzIGFyZQotdGhlIGxhbmd1YWdlLCBhbmQgdGhlIGhpZ2ggZWlnaHQgYml0cyBhcmUgdGhlIHN1Ymxhbmd1YWdlLgotCi1AaXRlbSAtLWhlbHAKLVByaW50cyBhIHVzYWdlIHN1bW1hcnkuCi0KLUBpdGVtIC0tdmVyc2lvbgotUHJpbnRzIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgQGNvZGV7d2luZHJlc30uCi0KLUBpdGVtIC0teXlkZWJ1ZwotSWYgQGNvZGV7d2luZHJlc30gaXMgY29tcGlsZWQgd2l0aCBAY29kZXtZWURFQlVHfSBkZWZpbmVkIGFzIEBjb2RlezF9LAotdGhpcyB3aWxsIHR1cm4gb24gcGFyc2VyIGRlYnVnZ2luZy4KLUBlbmQgdGFibGUKLQotCi1Abm9kZSBkbGx0b29sCi1AY2hhcHRlciBDcmVhdGUgZmlsZXMgbmVlZGVkIHRvIGJ1aWxkIGFuZCB1c2UgRExMcwotQGNpbmRleCBETEwKLUBraW5kZXggZGxsdG9vbAotCi1AY29kZXtkbGx0b29sfSBtYXkgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGZpbGVzIG5lZWRlZCB0byBidWlsZCBhbmQgdXNlCi1keW5hbWljIGxpbmsgbGlicmFyaWVzIChETExzKS4KLQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IEBjb2Rle2RsbHRvb2x9IGlzIG5vdCBhbHdheXMgYnVpbHQgYXMgcGFydCBvZiB0aGUgYmluYXJ5Ci11dGlsaXRpZXMsIHNpbmNlIGl0IGlzIG9ubHkgdXNlZnVsIGZvciB0aG9zZSB0YXJnZXRzIHdoaWNoIHN1cHBvcnQgRExMcy4KLUBlbmQgcXVvdGF0aW9uCi0KLUBzbWFsbGV4YW1wbGUKLWRsbHRvb2wgWy1kfC0taW5wdXQtZGVmIEB2YXJ7ZGVmLWZpbGUtbmFtZX1dCi0gICAgICAgIFstYnwtLWJhc2UtZmlsZSBAdmFye2Jhc2UtZmlsZS1uYW1lfV0KLSAgICAgICAgWy1lfC0tb3V0cHV0LWV4cCBAdmFye2V4cG9ydHMtZmlsZS1uYW1lfV0KLSAgICAgICAgWy16fC0tb3V0cHV0LWRlZiBAdmFye2RlZi1maWxlLW5hbWV9XQotICAgICAgICBbLWx8LS1vdXRwdXQtbGliIEB2YXJ7bGlicmFyeS1maWxlLW5hbWV9XSAgICAgICAgCi0gICAgICAgIFstLWV4cG9ydC1hbGwtc3ltYm9sc10gWy0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzXQotICAgICAgICBbLS1leGNsdWRlLXN5bWJvbHMgQHZhcntsaXN0fV0KLSAgICAgICAgWy0tbm8tZGVmYXVsdC1leGNsdWRlc10KLSAgICAgICAgWy1TfC0tYXMgQHZhcntwYXRoLXRvLWFzc2VtYmxlcn1dIFstZnwtLWFzLWZsYWdzIEB2YXJ7b3B0aW9uc31dCi0gICAgICAgIFstRHwtLWRsbG5hbWUgQHZhcntuYW1lfV0gWy1tfC0tbWFjaGluZSBAdmFye21hY2hpbmV9XQotICAgICAgICBbLWF8LS1hZGQtaW5kaXJlY3RdIFstVXwtLWFkZC11bmRlcnNjb3JlXSBbLWt8LS1raWxsLWF0XQotICAgICAgICBbLUF8LS1hZGQtc3RkY2FsbC1hbGlhc10KLSAgICAgICAgWy14fC0tbm8taWRhdGE0XSBbLWN8LS1uby1pZGF0YTVdIFstaXwtLWludGVyd29ya10KLSAgICAgICAgWy1ufC0tbm9kZWxldGVdIFstdnwtLXZlcmJvc2VdIFstaHwtLWhlbHBdIFstVnwtLXZlcnNpb25dCi0gICAgICAgIFtvYmplY3QtZmlsZSBAZG90c3t9XQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7ZGxsdG9vbH0gcmVhZHMgaXRzIGlucHV0cywgd2hpY2ggY2FuIGNvbWUgZnJvbSB0aGUgQHNhbXB7LWR9IGFuZAotQHNhbXB7LWJ9IG9wdGlvbnMgYXMgd2VsbCBhcyBvYmplY3QgZmlsZXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kCi1saW5lLiAgSXQgdGhlbiBwcm9jZXNzZXMgdGhlc2UgaW5wdXRzIGFuZCBpZiB0aGUgQHNhbXB7LWV9IG9wdGlvbiBoYXMKLWJlZW4gc3BlY2lmaWVkIGl0IGNyZWF0ZXMgYSBleHBvcnRzIGZpbGUuICBJZiB0aGUgQHNhbXB7LWx9IG9wdGlvbgotaGFzIGJlZW4gc3BlY2lmaWVkIGl0IGNyZWF0ZXMgYSBsaWJyYXJ5IGZpbGUgYW5kIGlmIHRoZSBAc2FtcHsten0gb3B0aW9uCi1oYXMgYmVlbiBzcGVjaWZpZWQgaXQgY3JlYXRlcyBhIGRlZiBmaWxlLiAgQW55IG9yIGFsbCBvZiB0aGUgLWUsIC1sCi1hbmQgLXogb3B0aW9ucyBjYW4gYmUgcHJlc2VudCBpbiBvbmUgaW52b2NhdGlvbiBvZiBkbGx0b29sLgotCi1XaGVuIGNyZWF0aW5nIGEgRExMLCBhbG9uZyB3aXRoIHRoZSBzb3VyY2UgZm9yIHRoZSBETEwsIGl0IGlzIG5lY2Vzc2FyeQotdG8gaGF2ZSB0aHJlZSBvdGhlciBmaWxlcy4gIEBjb2Rle2RsbHRvb2x9IGNhbiBoZWxwIHdpdGggdGhlIGNyZWF0aW9uIG9mCi10aGVzZSBmaWxlcy4KLQotVGhlIGZpcnN0IGZpbGUgaXMgYSBAc2FtcHsuZGVmfSBmaWxlIHdoaWNoIHNwZWNpZmllcyB3aGljaCBmdW5jdGlvbnMgYXJlCi1leHBvcnRlZCBmcm9tIHRoZSBETEwsIHdoaWNoIGZ1bmN0aW9ucyB0aGUgRExMIGltcG9ydHMsIGFuZCBzbyBvbi4gIFRoaXMKLWlzIGEgdGV4dCBmaWxlIGFuZCBjYW4gYmUgY3JlYXRlZCBieSBoYW5kLCBvciBAY29kZXtkbGx0b29sfSBjYW4gYmUgdXNlZAotdG8gY3JlYXRlIGl0IHVzaW5nIHRoZSBAc2FtcHsten0gb3B0aW9uLiAgSW4gdGhpcyBjYXNlIEBjb2Rle2RsbHRvb2x9Ci13aWxsIHNjYW4gdGhlIG9iamVjdCBmaWxlcyBzcGVjaWZpZWQgb24gaXRzIGNvbW1hbmQgbGluZSBsb29raW5nIGZvcgotdGhvc2UgZnVuY3Rpb25zIHdoaWNoIGhhdmUgYmVlbiBzcGVjaWFsbHkgbWFya2VkIGFzIGJlaW5nIGV4cG9ydGVkIGFuZAotcHV0IGVudHJpZXMgZm9yIHRoZW0gaW4gdGhlIC5kZWYgZmlsZSBpdCBjcmVhdGVzLgotCi1JbiBvcmRlciB0byBtYXJrIGEgZnVuY3Rpb24gYXMgYmVpbmcgZXhwb3J0ZWQgZnJvbSBhIERMTCwgaXQgbmVlZHMgdG8KLWhhdmUgYW4gQHNhbXB7LWV4cG9ydDo8bmFtZV9vZl9mdW5jdGlvbj59IGVudHJ5IGluIHRoZSBAc2FtcHsuZHJlY3R2ZX0KLXNlY3Rpb24gb2YgdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBjYW4gYmUgZG9uZSBpbiBDIGJ5IHVzaW5nIHRoZQotYXNtKCkgb3BlcmF0b3I6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgYXNtICgiLnNlY3Rpb24gLmRyZWN0dmUiKTsgIAotICBhc20gKCIuYXNjaWkgXCItZXhwb3J0Om15X2Z1bmNcIiIpOwotCi0gIGludCBteV9mdW5jICh2b2lkKSBAeyBAZG90c3t9IEB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgc2Vjb25kIGZpbGUgbmVlZGVkIGZvciBETEwgY3JlYXRpb24gaXMgYW4gZXhwb3J0cyBmaWxlLiAgVGhpcyBmaWxlCi1pcyBsaW5rZWQgd2l0aCB0aGUgb2JqZWN0IGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUgYm9keSBvZiB0aGUgRExMIGFuZCBpdAotaGFuZGxlcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIERMTCBhbmQgdGhlIG91dHNpZGUgd29ybGQuICBUaGlzIGlzIGEKLWJpbmFyeSBmaWxlIGFuZCBpdCBjYW4gYmUgY3JlYXRlZCBieSBnaXZpbmcgdGhlIEBzYW1wey1lfSBvcHRpb24gdG8KLUBjb2Rle2RsbHRvb2x9IHdoZW4gaXQgaXMgY3JlYXRpbmcgb3IgcmVhZGluZyBpbiBhIC5kZWYgZmlsZS4gCi0KLVRoZSB0aGlyZCBmaWxlIG5lZWRlZCBmb3IgRExMIGNyZWF0aW9uIGlzIHRoZSBsaWJyYXJ5IGZpbGUgdGhhdCBwcm9ncmFtcwotd2lsbCBsaW5rIHdpdGggaW4gb3JkZXIgdG8gYWNjZXNzIHRoZSBmdW5jdGlvbnMgaW4gdGhlIERMTC4gIFRoaXMgZmlsZQotY2FuIGJlIGNyZWF0ZWQgYnkgZ2l2aW5nIHRoZSBAc2FtcHstbH0gb3B0aW9uIHRvIGRsbHRvb2wgd2hlbiBpdAotaXMgY3JlYXRpbmcgb3IgcmVhZGluZyBpbiBhIC5kZWYgZmlsZS4KLQotQGNvZGV7ZGxsdG9vbH0gYnVpbGRzIHRoZSBsaWJyYXJ5IGZpbGUgYnkgaGFuZCwgYnV0IGl0IGJ1aWxkcyB0aGUKLWV4cG9ydHMgZmlsZSBieSBjcmVhdGluZyB0ZW1wb3JhcnkgZmlsZXMgY29udGFpbmluZyBhc3NlbWJsZXIgc3RhdGVtZW50cwotYW5kIHRoZW4gYXNzZW1ibGluZyB0aGVzZS4gIFRoZSBAc2FtcHstU30gY29tbWFuZCBsaW5lIG9wdGlvbiBjYW4gYmUKLXVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgYXNzZW1ibGVyIHRoYXQgZGxsdG9vbCB3aWxsIHVzZSwKLWFuZCB0aGUgQHNhbXB7LWZ9IG9wdGlvbiBjYW4gYmUgdXNlZCB0byBwYXNzIHNwZWNpZmljIGZsYWdzIHRvIHRoYXQKLWFzc2VtYmxlci4gIFRoZSBAc2FtcHstbn0gY2FuIGJlIHVzZWQgdG8gcHJldmVudCBkbGx0b29sIGZyb20gZGVsZXRpbmcKLXRoZXNlIHRlbXBvcmFyeSBhc3NlbWJsZXIgZmlsZXMgd2hlbiBpdCBpcyBkb25lLCBhbmQgaWYgQHNhbXB7LW59IGlzCi1zcGVjaWZpZWQgdHdpY2UgdGhlbiB0aGlzIHdpbGwgcHJldmVudCBkbGx0b29sIGZyb20gZGVsZXRpbmcgdGhlCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGVzIGl0IHVzZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkuCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBjcmVhdGluZyBhIERMTCBmcm9tIGEgc291cmNlIGZpbGUgQHNhbXB7ZGxsLmN9IGFuZAotYWxzbyBjcmVhdGluZyBhIHByb2dyYW0gKGZyb20gYW4gb2JqZWN0IGZpbGUgY2FsbGVkIEBzYW1we3Byb2dyYW0ub30pCi10aGF0IHVzZXMgdGhhdCBETEw6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgZ2NjIC1jIGRsbC5jCi0gIGRsbHRvb2wgLWUgZXhwb3J0cy5vIC1sIGRsbC5saWIgZGxsLm8KLSAgZ2NjIGRsbC5vIGV4cG9ydHMubyAtbyBkbGwuZGxsCi0gIGdjYyBwcm9ncmFtLm8gZGxsLmxpYiAtbyBwcm9ncmFtCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gLWQgQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLWlucHV0LWRlZiBAdmFye2ZpbGVuYW1lfQotQGNpbmRleCBpbnB1dCAuZGVmIGZpbGUKLVNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIC5kZWYgZmlsZSB0byBiZSByZWFkIGluIGFuZCBwcm9jZXNzZWQuCi0KLUBpdGVtIC1iIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1iYXNlLWZpbGUgQHZhcntmaWxlbmFtZX0KLUBjaW5kZXggYmFzZSBmaWxlcwotU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgYmFzZSBmaWxlIHRvIGJlIHJlYWQgaW4gYW5kIHByb2Nlc3NlZC4gIFRoZQotY29udGVudHMgb2YgdGhpcyBmaWxlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlbG9jYXRpb24gc2VjdGlvbiBpbiB0aGUKLWV4cG9ydHMgZmlsZSBnZW5lcmF0ZWQgYnkgZGxsdG9vbC4KLQotQGl0ZW0gLWUgQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLW91dHB1dC1leHAgQHZhcntmaWxlbmFtZX0KLVNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZXhwb3J0IGZpbGUgdG8gYmUgY3JlYXRlZCBieSBkbGx0b29sLgotCi1AaXRlbSAteiBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tb3V0cHV0LWRlZiBAdmFye2ZpbGVuYW1lfQotU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSAuZGVmIGZpbGUgdG8gYmUgY3JlYXRlZCBieSBkbGx0b29sLgotCi1AaXRlbSAtbCBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tb3V0cHV0LWxpYiBAdmFye2ZpbGVuYW1lfQotU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IGZpbGUgdG8gYmUgY3JlYXRlZCBieSBkbGx0b29sLgotCi1AaXRlbSAtLWV4cG9ydC1hbGwtc3ltYm9scwotVHJlYXQgYWxsIGdsb2JhbCBhbmQgd2VhayBkZWZpbmVkIHN5bWJvbHMgZm91bmQgaW4gdGhlIGlucHV0IG9iamVjdAotZmlsZXMgYXMgc3ltYm9scyB0byBiZSBleHBvcnRlZC4gIFRoZXJlIGlzIGEgc21hbGwgbGlzdCBvZiBzeW1ib2xzIHdoaWNoCi1hcmUgbm90IGV4cG9ydGVkIGJ5IGRlZmF1bHQ7IHNlZSB0aGUgQGNvZGV7LS1uby1kZWZhdWx0LWV4Y2x1ZGVzfQotb3B0aW9uLiAgWW91IG1heSBhZGQgdG8gdGhlIGxpc3Qgb2Ygc3ltYm9scyB0byBub3QgZXhwb3J0IGJ5IHVzaW5nIHRoZQotQGNvZGV7LS1leGNsdWRlLXN5bWJvbHN9IG9wdGlvbi4KLQotQGl0ZW0gLS1uby1leHBvcnQtYWxsLXN5bWJvbHMKLU9ubHkgZXhwb3J0IHN5bWJvbHMgZXhwbGljaXRseSBsaXN0ZWQgaW4gYW4gaW5wdXQgLmRlZiBmaWxlIG9yIGluCi1Ac2FtcHsuZHJlY3R2ZX0gc2VjdGlvbnMgaW4gdGhlIGlucHV0IG9iamVjdCBmaWxlcy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQKLWJlaGF2aW91ci4gIFRoZSBAc2FtcHsuZHJlY3R2ZX0gc2VjdGlvbnMgYXJlIGNyZWF0ZWQgYnkgQHNhbXB7ZGxsZXhwb3J0fQotYXR0cmlidXRlcyBpbiB0aGUgc291cmNlIGNvZGUuCi0KLUBpdGVtIC0tZXhjbHVkZS1zeW1ib2xzIEB2YXJ7bGlzdH0KLURvIG5vdCBleHBvcnQgdGhlIHN5bWJvbHMgaW4gQHZhcntsaXN0fS4gIFRoaXMgaXMgYSBsaXN0IG9mIHN5bWJvbCBuYW1lcwotc2VwYXJhdGVkIGJ5IGNvbW1hIG9yIGNvbG9uIGNoYXJhY3RlcnMuICBUaGUgc3ltYm9sIG5hbWVzIHNob3VsZCBub3QKLWNvbnRhaW4gYSBsZWFkaW5nIHVuZGVyc2NvcmUuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuCi1AY29kZXstLWV4cG9ydC1hbGwtc3ltYm9sc30gaXMgdXNlZC4KLQotQGl0ZW0gLS1uby1kZWZhdWx0LWV4Y2x1ZGVzCi1XaGVuIEBjb2Rley0tZXhwb3J0LWFsbC1zeW1ib2xzfSBpcyB1c2VkLCBpdCB3aWxsIGJ5IGRlZmF1bHQgYXZvaWQKLWV4cG9ydGluZyBjZXJ0YWluIHNwZWNpYWwgc3ltYm9scy4gIFRoZSBjdXJyZW50IGxpc3Qgb2Ygc3ltYm9scyB0byBhdm9pZAotZXhwb3J0aW5nIGlzIEBzYW1we0RsbE1haW5AQDEyfSwgQHNhbXB7RGxsRW50cnlQb2ludEBAMH0sCi1Ac2FtcHtpbXB1cmVfcHRyfS4gIFlvdSBtYXkgdXNlIHRoZSBAY29kZXstLW5vLWRlZmF1bHQtZXhjbHVkZXN9IG9wdGlvbgotdG8gZ28gYWhlYWQgYW5kIGV4cG9ydCB0aGVzZSBzcGVjaWFsIHN5bWJvbHMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bAotd2hlbiBAY29kZXstLWV4cG9ydC1hbGwtc3ltYm9sc30gaXMgdXNlZC4KLQotQGl0ZW0gLVMgQHZhcntwYXRofQotQGl0ZW14IC0tYXMgQHZhcntwYXRofQotU3BlY2lmaWVzIHRoZSBwYXRoLCBpbmNsdWRpbmcgdGhlIGZpbGVuYW1lLCBvZiB0aGUgYXNzZW1ibGVyIHRvIGJlIHVzZWQKLXRvIGNyZWF0ZSB0aGUgZXhwb3J0cyBmaWxlLgotCi1AaXRlbSAtZiBAdmFye3N3aXRjaGVzfQotQGl0ZW14IC0tYXMtZmxhZ3MgQHZhcntzd2l0Y2hlc30KLVNwZWNpZmllcyBhbnkgc3BlY2lmaWMgY29tbWFuZCBsaW5lIHN3aXRjaGVzIHRvIGJlIHBhc3NlZCB0byB0aGUKLWFzc2VtYmxlciB3aGVuIGJ1aWxkaW5nIHRoZSBleHBvcnRzIGZpbGUuICBUaGlzIG9wdGlvbiB3aWxsIHdvcmsgZXZlbiBpZgotdGhlIEBzYW1wey1TfSBvcHRpb24gaXMgbm90IHVzZWQuICBUaGlzIG9wdGlvbiBvbmx5IHRha2VzIG9uZSBhcmd1bWVudCwKLWFuZCBpZiBpdCBvY2N1cnMgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlbiBsYXRlcgotb2NjdXJyZW5jZXMgd2lsbCBvdmVycmlkZSBlYXJsaWVyIG9jY3VycmVuY2VzLiAgU28gaWYgaXQgaXMgbmVjZXNzYXJ5IHRvCi1wYXNzIG11bHRpcGxlIHN3aXRjaGVzIHRvIHRoZSBhc3NlbWJsZXIgdGhleSBzaG91bGQgYmUgZW5jbG9zZWQgaW4KLWRvdWJsZSBxdW90ZXMuCi0KLUBpdGVtIC1EIEB2YXJ7bmFtZX0KLUBpdGVteCAtLWRsbC1uYW1lIEB2YXJ7bmFtZX0KLVNwZWNpZmllcyB0aGUgbmFtZSB0byBiZSBzdG9yZWQgaW4gdGhlIC5kZWYgZmlsZSBhcyB0aGUgbmFtZSBvZiB0aGUgRExMCi13aGVuIHRoZSBAc2FtcHstZX0gb3B0aW9uIGlzIHVzZWQuICBJZiB0aGlzIG9wdGlvbiBpcyBub3QgcHJlc2VudCwgdGhlbgotdGhlIGZpbGVuYW1lIGdpdmVuIHRvIHRoZSBAc2FtcHstZX0gb3B0aW9uIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZgotdGhlIERMTC4KLQotQGl0ZW0gLW0gQHZhcnttYWNoaW5lfQotQGl0ZW14IC1tYWNoaW5lIEB2YXJ7bWFjaGluZX0KLVNwZWNpZmllcyB0aGUgdHlwZSBvZiBtYWNoaW5lIGZvciB3aGljaCB0aGUgbGlicmFyeSBmaWxlIHNob3VsZCBiZQotYnVpbHQuICBAY29kZXtkbGx0b29sfSBoYXMgYSBidWlsdCBpbiBkZWZhdWx0IHR5cGUsIGRlcGVuZGluZyB1cG9uIGhvdwotaXQgd2FzIGNyZWF0ZWQsIGJ1dCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGF0LiAgVGhpcyBpcwotbm9ybWFsbHkgb25seSB1c2VmdWwgd2hlbiBjcmVhdGluZyBETExzIGZvciBhbiBBUk0gcHJvY2Vzc29yLCB3aGVuIHRoZQotY29udGVudHMgb2YgdGhlIERMTCBhcmUgYWN0dWFsbHkgZW5jb2RlIHVzaW5nIFRIVU1CIGluc3RydWN0aW9ucy4KLQotQGl0ZW0gLWEKLUBpdGVteCAtLWFkZC1pbmRpcmVjdAotU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBmaWxlIGl0Ci1zaG91bGQgYWRkIGEgc2VjdGlvbiB3aGljaCBhbGxvd3MgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucyB0byBiZQotcmVmZXJlbmNlZCB3aXRob3V0IHVzaW5nIHRoZSBpbXBvcnQgbGlicmFyeS4gIFdoYXRldmVyIHRoZSBoZWxsIHRoYXQKLW1lYW5zISAKLQotQGl0ZW0gLVUKLUBpdGVteCAtLWFkZC11bmRlcnNjb3JlCi1TcGVjaWZpZXMgdGhhdCB3aGVuIEBjb2Rle2RsbHRvb2x9IGlzIGNyZWF0aW5nIHRoZSBleHBvcnRzIGZpbGUgaXQKLXNob3VsZCBwcmVwZW5kIGFuIHVuZGVyc2NvcmUgdG8gdGhlIG5hbWVzIG9mIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMuIAotCi1AaXRlbSAtawotQGl0ZW14IC0ta2lsbC1hdAotU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBmaWxlIGl0Ci1zaG91bGQgbm90IGFwcGVuZCB0aGUgc3RyaW5nIEBzYW1we0BAIDxudW1iZXI+fS4gIFRoZXNlIG51bWJlcnMgYXJlCi1jYWxsZWQgb3JkaW5hbCBudW1iZXJzIGFuZCB0aGV5IHJlcHJlc2VudCBhbm90aGVyIHdheSBvZiBhY2Nlc3NpbmcgdGhlCi1mdW5jdGlvbiBpbiBhIERMTCwgb3RoZXIgdGhhbiBieSBuYW1lLgotCi1AaXRlbSAtQQotQGl0ZW14IC0tYWRkLXN0ZGNhbGwtYWxpYXMKLVNwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgZmlsZSBpdAotc2hvdWxkIGFkZCBhbGlhc2VzIGZvciBzdGRjYWxsIHN5bWJvbHMgd2l0aG91dCBAc2FtcHtAQCA8bnVtYmVyPn0KLWluIGFkZGl0aW9uIHRvIHRoZSBzeW1ib2xzIHdpdGggQHNhbXB7QEAgPG51bWJlcj59LgotCi1AaXRlbSAteAotQGl0ZW14IC0tbm8taWRhdGE0Ci1TcGVjaWZpZXMgdGhhdCB3aGVuIEBjb2Rle2RsbHRvb2x9IGlzIGNyZWF0aW5nIHRoZSBleHBvcnRzIGFuZCBsaWJyYXJ5Ci1maWxlcyBpdCBzaG91bGQgb21pdCB0aGUgLmlkYXRhNCBzZWN0aW9uLiAgVGhpcyBpcyBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgotCi1AaXRlbSAtYwotQGl0ZW14IC0tbm8taWRhdGE1Ci1TcGVjaWZpZXMgdGhhdCB3aGVuIEBjb2Rle2RsbHRvb2x9IGlzIGNyZWF0aW5nIHRoZSBleHBvcnRzIGFuZCBsaWJyYXJ5Ci1maWxlcyBpdCBzaG91bGQgb21pdCB0aGUgLmlkYXRhNSBzZWN0aW9uLiAgVGhpcyBpcyBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgotCi1AaXRlbSAtaQotQGl0ZW14IC0taW50ZXJ3b3JrCi1TcGVjaWZpZXMgdGhhdCBAY29kZXtkbGx0b29sfSBzaG91bGQgbWFyayB0aGUgb2JqZWN0cyBpbiB0aGUgbGlicmFyeQotZmlsZSBhbmQgZXhwb3J0cyBmaWxlIHRoYXQgaXQgcHJvZHVjZXMgYXMgc3VwcG9ydGluZyBpbnRlcndvcmtpbmcKLWJldHdlZW4gQVJNIGFuZCBUSFVNQiBjb2RlLgotCi1AaXRlbSAtbgotQGl0ZW14IC0tbm9kZWxldGUKLU1ha2VzIEBjb2Rle2RsbHRvb2x9IHByZXNlcnZlIHRoZSB0ZW1wb3JhcnkgYXNzZW1ibGVyIGZpbGVzIGl0IHVzZWQgdG8KLWNyZWF0ZSB0aGUgZXhwb3J0cyBmaWxlLiAgSWYgdGhpcyBvcHRpb24gaXMgcmVwZWF0ZWQgdGhlbiBkbGx0b29sIHdpbGwKLWFsc28gcHJlc2VydmUgdGhlIHRlbXBvcmFyeSBvYmplY3QgZmlsZXMgaXQgdXNlcyB0byBjcmVhdGUgdGhlIGxpYnJhcnkKLWZpbGUuIAotCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyYm9zZQotTWFrZSBkbGx0b29sIGRlc2NyaWJlIHdoYXQgaXQgaXMgZG9pbmcuCi0KLUBpdGVtIC1oCi1AaXRlbXggLS1oZWxwCi1EaXNwbGF5cyBhIGxpc3Qgb2YgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHRoZW4gZXhpdHMuCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uCi1EaXNwbGF5cyBkbGx0b29sJ3MgdmVyc2lvbiBudW1iZXIgYW5kIHRoZW4gZXhpdHMuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgcmVhZGVsZgotQGNoYXB0ZXIgcmVhZGVsZgotCi1AY2luZGV4IEVMRiBmaWxlIGluZm9ybWF0aW9uCi1Aa2luZGV4IHJlYWRlbGYKLQotQHNtYWxsZXhhbXBsZQotcmVhZGVsZiBbIC1hIHwgLS1hbGwgXSAKLSAgICAgICAgWyAtaCB8IC0tZmlsZS1oZWFkZXJdCi0gICAgICAgIFsgLWwgfCAtLXByb2dyYW0taGVhZGVycyB8IC0tc2VnbWVudHNdCi0gICAgICAgIFsgLVMgfCAtLXNlY3Rpb24taGVhZGVycyB8IC0tc2VjdGlvbnNdCi0gICAgICAgIFsgLWUgfCAtLWhlYWRlcnNdCi0gICAgICAgIFsgLXMgfCAtLXN5bXMgfCAtLXN5bWJvbHNdCi0gICAgICAgIFsgLW4gfCAtLW5vdGVzXQotICAgICAgICBbIC1yIHwgLS1yZWxvY3NdCi0gICAgICAgIFsgLWQgfCAtLWR5bmFtaWNdCi0gICAgICAgIFsgLVYgfCAtLXZlcnNpb24taW5mb10KLSAgICAgICAgWyAtRCB8IC0tdXNlLWR5bmFtaWNdCi0gICAgICAgIFsgLXggPG51bWJlcj4gfCAtLWhleC1kdW1wPTxudW1iZXI+XQotICAgICAgICBbIC13W2xpYXByXSB8IC0tZGVidWctZHVtcFs9aW5mbyw9bGluZSw9YWJicmV2LD1wdWJuYW1lcyw9cmFuZ2VzXV0KLSAgICAgICAgWyAgICAgIC0taGlzdG9ncmFtXQotICAgICAgICBbIC12IHwgLS12ZXJzaW9uXQotICAgICAgICBbIC1IIHwgLS1oZWxwXQotICAgICAgICBAdmFye2VsZmZpbGV9QGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7cmVhZGVsZn0gZGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgRUxGIGZvcm1hdCBvYmplY3QKLWZpbGVzLiAgVGhlIG9wdGlvbnMgY29udHJvbCB3aGF0IHBhcnRpY3VsYXIgaW5mb3JtYXRpb24gdG8gZGlzcGxheS4KLQotQHZhcntlbGZmaWxlfUBkb3Rze30gYXJlIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUgZXhhbWluZWQuICBBdCB0aGUKLW1vbWVudCwgQGNvZGV7cmVhZGVsZn0gZG9lcyBub3Qgc3VwcG9ydCBleGFtaW5pbmcgYXJjaGl2ZXMsIG5vciBkb2VzIGl0Ci1zdXBwb3J0IGV4YW1pbmcgNjQgYml0IEVMRiBmaWxlcy4KLQotVGhlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIG9wdGlvbnMsIHNob3duIGhlcmUgYXMgYWx0ZXJuYXRpdmVzLCBhcmUKLWVxdWl2YWxlbnQuICBBdCBsZWFzdCBvbmUgb3B0aW9uIGJlc2lkZXMgQHNhbXB7LXZ9IG9yIEBzYW1wey1IfSBtdXN0IGJlCi1naXZlbi4gCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWEKLUBpdGVteCAtLWFsbAotRXF1aXZhbGVudCB0byBzcGVjaWZpeWluZyBAc2FtcHstLWZpbGUtaGVhZGVyfSwKLUBzYW1wey0tcHJvZ3JhbS1oZWFkZXJzfSwgQHNhbXB7LS1zZWN0aW9uc30sIEBzYW1wey0tc3ltYm9sc30sCi1Ac2FtcHstLXJlbG9jc30sIEBzYW1wey0tZHluYW1pY30sIEBzYW1wey0tbm90ZXN9IGFuZAotQHNhbXB7LS12ZXJzaW9uLWluZm99LiAKLQotQGl0ZW0gLWgKLUBpdGVteCAtLWZpbGUtaGVhZGVyCi1AY2luZGV4IEVMRiBmaWxlIGhlYWRlciBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgRUxGIGhlYWRlciBhdCB0aGUgc3RhcnQgb2YgdGhlCi1maWxlLgotCi1AaXRlbSAtbAotQGl0ZW14IC0tcHJvZ3JhbS1oZWFkZXJzCi1AaXRlbXggLS1zZWdtZW50cwotQGNpbmRleCBFTEYgcHJvZ3JhbSBoZWFkZXIgaW5mb3JtYXRpb24KLUBjaW5kZXggRUxGIHNlZ21lbnQgaW5mb3JtYXRpb24KLURpc3BsYXlzIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIGZpbGUncyBzZWdtZW50IGhlYWRlcnMsIGlmIGl0Ci1oYXMgYW55LgotCi1AaXRlbSAtUwotQGl0ZW14IC0tc2VjdGlvbnMKLUBpdGVteCAtLXNlY3Rpb24taGVhZGVycwotQGNpbmRleCBFTEYgc2VjdGlvbiBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSdzIHNlY3Rpb24gaGVhZGVycywgaWYgaXQKLWhhcyBhbnkuCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1zeW1ib2xzCi1AaXRlbXggLS1zeW1zCi1AY2luZGV4IEVMRiBzeW1ib2wgdGFibGUgaW5mb3JtYXRpb24KLURpc3BsYXlzIHRoZSBlbnRyaWVzIGluIHN5bWJvbCB0YWJsZSBzZWN0aW9uIG9mIHRoZSBmaWxlLCBpZiBpdCBoYXMgb25lLgotCi1AaXRlbSAtZQotQGl0ZW14IC0taGVhZGVycwotRGlzcGxheSBhbGwgdGhlIGhlYWRlcnMgaW4gdGhlIGZpbGUuICBFcXVpdmFsZW50IHRvIEBzYW1wey1oIC1sIC1TfS4KLQotQGl0ZW0gLW4KLUBpdGVteCAtLW5vdGVzCi1AY2luZGV4IEVMRiBjb3JlIG5vdGVzCi1EaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIE5PVEUgc2VnbWVudCwgaWYgaXQgZXhpc3RzLgotCi1AaXRlbSAtcgotQGl0ZW14IC0tcmVsb2NzCi1AY2luZGV4IEVMRiByZWxvYyBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlJ3MgcmVsb2NhdGlvbiBzZWN0aW9uLCBpZiBpdCBoYSBvbmUuCi0KLUBpdGVtIC1kCi1AaXRlbXggLS1keW5hbWljCi1AY2luZGV4IEVMRiBkeW5hbWljIHNlY3Rpb24gaW5mb3JtYXRpb24KLURpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSdzIGR5bmFtaWMgc2VjdGlvbiwgaWYgaXQgaGFzIG9uZS4KLQotQGl0ZW0gLVYKLUBpdGVteCAtLXZlcnNpb24taW5mbwotQGNpbmRleCBFTEYgdmVyc2lvbiBzZWN0aW9ucyBpbmZvcm1hdGlvbnMKLURpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgdmVyc2lvbiBzZWN0aW9ucyBpbiB0aGUgZmlsZSwgaXQgdGhleQotZXhpc3QuCi0KLUBpdGVtIC1ECi1AaXRlbXggLS11c2UtZHluYW1pYwotV2hlbiBkaXNwbGF5aW5nIHN5bWJvbHMsIHRoaXMgb3B0aW9uIG1ha2VzIEBjb2Rle3JlYWRlbGZ9IHVzZSB0aGUKLXN5bWJsb2wgdGFibGUgaW4gdGhlIGZpbGUncyBkeW5hbWljIHNlY3Rpb24sIHJhdGhlciB0aGFuIHRoZSBvbmUgaW4gdGhlCi1zeW1ib2xzIHNlY3Rpb24uCi0KLUBpdGVtIC14IDxudW1iZXI+Ci1AaXRlbXggLS1oZXgtZHVtcD08bnVtYmVyPgotRGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbmRpY2F0ZWQgc2VjdGlvbiBhcyBhIGhleGFkZWNpbWFsIGR1bXAuCi0KLUBpdGVtIC13W2xpYXByXQotQGl0ZW14IC0tZGVidWctZHVtcFs9bGluZSw9aW5mbyw9YWJicmV2LD1wdWJuYW1lcyw9cmFuZ2VzXQotRGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBkZWJ1ZyBzZWN0aW9ucyBpbiB0aGUgZmlsZSwgaWYgYW55IGFyZQotcHJlc2VudC4gIElmIG9uZSBvZiB0aGUgb3B0aW9uYWwgbGV0dGVycyBvciB3b3JkcyBmb2xsb3dzIHRoZSBzd2l0Y2gKLXRoZW4gb25seSBkYXRhIGZvdW5kIGluIHRob3NlIHNwZWNpZmljIHNlY3Rpb25zIHdpbGwgYmUgZHVtcGVkLgotCi1AaXRlbSAtLWhpc3RvZ3JhbQotRGlzcGxheSBhIGhpc3RvZ3JhbSBvZiBidWNrZXQgbGlzdCBsZW5ndGhzIHdoZW4gZGlzcGxheWluZyB0aGUgY29udGVudHMKLW9mIHRoZSBzeW1ib2wgdGFibGVzLgotCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyc2lvbgotRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgb2YgcmVhZGVsZi4KLQotQGl0ZW0gLUgKLUBpdGVteCAtLWhlbHAKLURpc3BsYXkgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIHVuZGVyc3Rvb2QgYnkgQGNvZGV7cmVhZGVsZn0uCi0KLUBlbmQgdGFibGUKLQotCi1Abm9kZSBTZWxlY3RpbmcgVGhlIFRhcmdldCBTeXN0ZW0KLUBjaGFwdGVyIFNlbGVjdGluZyB0aGUgdGFyZ2V0IHN5c3RlbQotCi1Zb3UgY2FuIHNwZWNpZnkgdGhyZWUgYXNwZWN0cyBvZiB0aGUgdGFyZ2V0IHN5c3RlbSB0byB0aGUgQHNje2dudX0KLWJpbmFyeSBmaWxlIHV0aWxpdGllcywgZWFjaCBpbiBzZXZlcmFsIHdheXM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi10aGUgdGFyZ2V0Ci0KLUBpdGVtCi10aGUgYXJjaGl0ZWN0dXJlCi0KLUBpdGVtCi10aGUgbGlua2VyIGVtdWxhdGlvbiAod2hpY2ggYXBwbGllcyB0byB0aGUgbGlua2VyIG9ubHkpCi1AZW5kIGl0ZW1pemUKLQotSW4gdGhlIGZvbGxvd2luZyBzdW1tYXJpZXMsIHRoZSBsaXN0cyBvZiB3YXlzIHRvIHNwZWNpZnkgdmFsdWVzIGFyZSBpbgotb3JkZXIgb2YgZGVjcmVhc2luZyBwcmVjZWRlbmNlLiAgVGhlIHdheXMgbGlzdGVkIGZpcnN0IG92ZXJyaWRlIHRob3NlCi1saXN0ZWQgbGF0ZXIuCi0KLVRoZSBjb21tYW5kcyB0byBsaXN0IHZhbGlkIHZhbHVlcyBvbmx5IGxpc3QgdGhlIHZhbHVlcyBmb3Igd2hpY2ggdGhlCi1wcm9ncmFtcyB5b3UgYXJlIHJ1bm5pbmcgd2VyZSBjb25maWd1cmVkLiAgSWYgdGhleSB3ZXJlIGNvbmZpZ3VyZWQgd2l0aAotQHNhbXB7LS1lbmFibGUtdGFyZ2V0cz1hbGx9LCB0aGUgY29tbWFuZHMgbGlzdCBtb3N0IG9mIHRoZSBhdmFpbGFibGUKLXZhbHVlcywgYnV0IGEgZmV3IGFyZSBsZWZ0IG91dDsgbm90IGFsbCB0YXJnZXRzIGNhbiBiZSBjb25maWd1cmVkIGluIGF0Ci1vbmNlIGJlY2F1c2Ugc29tZSBvZiB0aGVtIGNhbiBvbmx5IGJlIGNvbmZpZ3VyZWQgQGRmbntuYXRpdmV9IChvbiBob3N0cwotd2l0aCB0aGUgc2FtZSB0eXBlIGFzIHRoZSB0YXJnZXQgc3lzdGVtKS4KLQotQG1lbnUKLSogVGFyZ2V0IFNlbGVjdGlvbjo6ICAgICAgICAgICAgCi0qIEFyY2hpdGVjdHVyZSBTZWxlY3Rpb246OiAgICAgIAotKiBMaW5rZXIgRW11bGF0aW9uIFNlbGVjdGlvbjo6ICAKLUBlbmQgbWVudQotCi1Abm9kZSBUYXJnZXQgU2VsZWN0aW9uCi1Ac2VjdGlvbiBUYXJnZXQgU2VsZWN0aW9uCi0KLUEgQGRmbnt0YXJnZXR9IGlzIGFuIG9iamVjdCBmaWxlIGZvcm1hdC4gIEEgZ2l2ZW4gdGFyZ2V0IG1heSBiZQotc3VwcG9ydGVkIGZvciBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzIChAcHhyZWZ7QXJjaGl0ZWN0dXJlIFNlbGVjdGlvbn0pLgotQSB0YXJnZXQgc2VsZWN0aW9uIG1heSBhbHNvIGhhdmUgdmFyaWF0aW9ucyBmb3IgZGlmZmVyZW50IG9wZXJhdGluZwotc3lzdGVtcyBvciBhcmNoaXRlY3R1cmVzLgotCi1UaGUgY29tbWFuZCB0byBsaXN0IHZhbGlkIHRhcmdldCB2YWx1ZXMgaXMgQHNhbXB7b2JqZHVtcCAtaX0KLSh0aGUgZmlyc3QgY29sdW1uIG9mIG91dHB1dCBjb250YWlucyB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24pLgotCi1Tb21lIHNhbXBsZSB2YWx1ZXMgYXJlOiBAc2FtcHthLm91dC1ocDMwMGJzZH0sIEBzYW1we2Vjb2ZmLWxpdHRsZW1pcHN9LAotQHNhbXB7YS5vdXQtc3Vub3MtYmlnfS4KLQotWW91IGNhbiBhbHNvIHNwZWNpZnkgYSB0YXJnZXQgdXNpbmcgYSBjb25maWd1cmF0aW9uIHRyaXBsZXQuICBUaGlzIGlzCi10aGUgc2FtZSBzb3J0IG9mIG5hbWUgdGhhdCBpcyBwYXNzZWQgdG8gQGZpbGV7Y29uZmlndXJlfSB0byBzcGVjaWZ5IGEKLXRhcmdldC4gIFdoZW4geW91IHVzZSBhIGNvbmZpZ3VyYXRpb24gdHJpcGxldCBhcyBhbiBhcmd1bWVudCwgaXQgbXVzdCBiZQotZnVsbHkgY2Fub25pY2FsaXplZC4gIFlvdSBjYW4gc2VlIHRoZSBjYW5vbmljYWwgdmVyc2lvbiBvZiBhIHRyaXBsZXQgYnkKLXJ1bm5pbmcgdGhlIHNoZWxsIHNjcmlwdCBAZmlsZXtjb25maWcuc3VifSB3aGljaCBpcyBpbmNsdWRlZCB3aXRoIHRoZQotc291cmNlcy4KLQotU29tZSBzYW1wbGUgY29uZmlndXJhdGlvbiB0cmlwbGV0cyBhcmU6IEBzYW1we202OGstaHAtYnNkfSwKLUBzYW1we21pcHMtZGVjLXVsdHJpeH0sIEBzYW1we3NwYXJjLXN1bi1zdW5vc30uCi0KLUBzdWJoZWFkaW5nIEBjb2Rle29iamR1bXB9IFRhcmdldAotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstYn0gb3IgQHNhbXB7LS10YXJnZXR9Ci0KLUBpdGVtCi1lbnZpcm9ubWVudCB2YXJpYWJsZSBAY29kZXtHTlVUQVJHRVR9Ci0KLUBpdGVtCi1kZWR1Y2VkIGZyb20gdGhlIGlucHV0IGZpbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBzdWJoZWFkaW5nIEBjb2Rle29iamNvcHl9IGFuZCBAY29kZXtzdHJpcH0gSW5wdXQgVGFyZ2V0Ci0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWNvbW1hbmQgbGluZSBvcHRpb25zOiBAc2FtcHstSX0gb3IgQHNhbXB7LS1pbnB1dC10YXJnZXR9LCBvciBAc2FtcHstRn0gb3IgQHNhbXB7LS10YXJnZXR9Ci0KLUBpdGVtCi1lbnZpcm9ubWVudCB2YXJpYWJsZSBAY29kZXtHTlVUQVJHRVR9Ci0KLUBpdGVtCi1kZWR1Y2VkIGZyb20gdGhlIGlucHV0IGZpbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBzdWJoZWFkaW5nIEBjb2Rle29iamNvcHl9IGFuZCBAY29kZXtzdHJpcH0gT3V0cHV0IFRhcmdldAotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uczogQHNhbXB7LU99IG9yIEBzYW1wey0tb3V0cHV0LXRhcmdldH0sIG9yIEBzYW1wey1GfSBvciBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLXRoZSBpbnB1dCB0YXJnZXQgKHNlZSBgYEBjb2Rle29iamNvcHl9IGFuZCBAY29kZXtzdHJpcH0gSW5wdXQgVGFyZ2V0JycgYWJvdmUpCi0KLUBpdGVtCi1lbnZpcm9ubWVudCB2YXJpYWJsZSBAY29kZXtHTlVUQVJHRVR9Ci0KLUBpdGVtCi1kZWR1Y2VkIGZyb20gdGhlIGlucHV0IGZpbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBzdWJoZWFkaW5nIEBjb2Rle25tfSwgQGNvZGV7c2l6ZX0sIGFuZCBAY29kZXtzdHJpbmdzfSBUYXJnZXQKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbjogQHNhbXB7LS10YXJnZXR9Ci0KLUBpdGVtCi1lbnZpcm9ubWVudCB2YXJpYWJsZSBAY29kZXtHTlVUQVJHRVR9Ci0KLUBpdGVtCi1kZWR1Y2VkIGZyb20gdGhlIGlucHV0IGZpbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBzdWJoZWFkaW5nIExpbmtlciBJbnB1dCBUYXJnZXQKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbjogQHNhbXB7LWJ9IG9yIEBzYW1wey0tZm9ybWF0fQotKEBweHJlZntPcHRpb25zLCxPcHRpb25zLGxkLmluZm8sVXNpbmcgTER9KQotCi1AaXRlbQotc2NyaXB0IGNvbW1hbmQgQGNvZGV7VEFSR0VUfQotKEBweHJlZntPcHRpb24gQ29tbWFuZHMsLE9wdGlvbiBDb21tYW5kcyxsZC5pbmZvLFVzaW5nIExEfSkKLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLShAcHhyZWZ7RW52aXJvbm1lbnQsLEVudmlyb25tZW50LGxkLmluZm8sVXNpbmcgTER9KQotCi1AaXRlbQotdGhlIGRlZmF1bHQgdGFyZ2V0IG9mIHRoZSBzZWxlY3RlZCBsaW5rZXIgZW11bGF0aW9uCi0oQHB4cmVme0xpbmtlciBFbXVsYXRpb24gU2VsZWN0aW9ufSkKLUBlbmQgZW51bWVyYXRlCi0KLUBzdWJoZWFkaW5nIExpbmtlciBPdXRwdXQgVGFyZ2V0Ci0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWNvbW1hbmQgbGluZSBvcHRpb246IEBzYW1wey1vZm9ybWF0fQotKEBweHJlZntPcHRpb25zLCxPcHRpb25zLGxkLmluZm8sVXNpbmcgTER9KQotCi1AaXRlbQotc2NyaXB0IGNvbW1hbmQgQGNvZGV7T1VUUFVUX0ZPUk1BVH0KLShAcHhyZWZ7T3B0aW9uIENvbW1hbmRzLCxPcHRpb24gQ29tbWFuZHMsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi10aGUgbGlua2VyIGlucHV0IHRhcmdldCAoc2VlIGBgTGlua2VyIElucHV0IFRhcmdldCcnIGFib3ZlKQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgQXJjaGl0ZWN0dXJlIFNlbGVjdGlvbgotQHNlY3Rpb24gQXJjaGl0ZWN0dXJlIHNlbGVjdGlvbgotCi1BbiBAZGZue2FyY2hpdGVjdHVyZX0gaXMgYSB0eXBlIG9mIEBzY3tjcHV9IG9uIHdoaWNoIGFuIG9iamVjdCBmaWxlIGlzCi10byBydW4uICBJdHMgbmFtZSBtYXkgY29udGFpbiBhIGNvbG9uLCBzZXBhcmF0aW5nIHRoZSBuYW1lIG9mIHRoZQotcHJvY2Vzc29yIGZhbWlseSBmcm9tIHRoZSBuYW1lIG9mIHRoZSBwYXJ0aWN1bGFyIEBzY3tjcHV9LgotCi1UaGUgY29tbWFuZCB0byBsaXN0IHZhbGlkIGFyY2hpdGVjdHVyZSB2YWx1ZXMgaXMgQHNhbXB7b2JqZHVtcCAtaX0gKHRoZQotc2Vjb25kIGNvbHVtbiBjb250YWlucyB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24pLgotCi1TYW1wbGUgdmFsdWVzOiBAc2FtcHttNjhrOjY4MDIwfSwgQHNhbXB7bWlwczozMDAwfSwgQHNhbXB7c3BhcmN9LgotCi1Ac3ViaGVhZGluZyBAY29kZXtvYmpkdW1wfSBBcmNoaXRlY3R1cmUKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbjogQHNhbXB7LW19IG9yIEBzYW1wey0tYXJjaGl0ZWN0dXJlfQotCi1AaXRlbQotZGVkdWNlZCBmcm9tIHRoZSBpbnB1dCBmaWxlCi1AZW5kIGVudW1lcmF0ZQotCi1Ac3ViaGVhZGluZyBAY29kZXtvYmpjb3B5fSwgQGNvZGV7bm19LCBAY29kZXtzaXplfSwgQGNvZGV7c3RyaW5nc30gQXJjaGl0ZWN0dXJlCi0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIElucHV0IEFyY2hpdGVjdHVyZQotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1kZWR1Y2VkIGZyb20gdGhlIGlucHV0IGZpbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBzdWJoZWFkaW5nIExpbmtlciBPdXRwdXQgQXJjaGl0ZWN0dXJlCi0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLXNjcmlwdCBjb21tYW5kIEBjb2Rle09VVFBVVF9BUkNIfQotKEBweHJlZntPcHRpb24gQ29tbWFuZHMsLE9wdGlvbiBDb21tYW5kcyxsZC5pbmZvLFVzaW5nIExEfSkKLQotQGl0ZW0KLXRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSBmcm9tIHRoZSBsaW5rZXIgb3V0cHV0IHRhcmdldAotKEBweHJlZntUYXJnZXQgU2VsZWN0aW9ufSkKLUBlbmQgZW51bWVyYXRlCi0KLUBub2RlIExpbmtlciBFbXVsYXRpb24gU2VsZWN0aW9uCi1Ac2VjdGlvbiBMaW5rZXIgZW11bGF0aW9uIHNlbGVjdGlvbgotCi1BIGxpbmtlciBAZGZue2VtdWxhdGlvbn0gaXMgYSBgYHBlcnNvbmFsaXR5Jycgb2YgdGhlIGxpbmtlciwgd2hpY2ggZ2l2ZXMKLXRoZSBsaW5rZXIgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBvdGhlciBhc3BlY3RzIG9mIHRoZSB0YXJnZXQgc3lzdGVtLgotSW4gcGFydGljdWxhciwgaXQgY29uc2lzdHMgb2YKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLXRoZSBsaW5rZXIgc2NyaXB0Ci0KLUBpdGVtCi10aGUgdGFyZ2V0Ci0KLUBpdGVtCi1zZXZlcmFsIGBgaG9vaycnIGZ1bmN0aW9ucyB0aGF0IGFyZSBydW4gYXQgY2VydGFpbiBzdGFnZXMgb2YgdGhlIGxpbmtpbmcKLXByb2Nlc3MgdG8gZG8gc3BlY2lhbCB0aGluZ3MgdGhhdCBzb21lIHRhcmdldHMgcmVxdWlyZQotQGVuZCBpdGVtaXplCi0KLVRoZSBjb21tYW5kIHRvIGxpc3QgdmFsaWQgbGlua2VyIGVtdWxhdGlvbiB2YWx1ZXMgaXMgQHNhbXB7bGQgLVZ9LgotCi1TYW1wbGUgdmFsdWVzOiBAc2FtcHtocDMwMGJzZH0sIEBzYW1we21pcHNsaXR9LCBAc2FtcHtzdW40fS4KLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbjogQHNhbXB7LW19Ci0oQHB4cmVme09wdGlvbnMsLE9wdGlvbnMsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi1lbnZpcm9ubWVudCB2YXJpYWJsZSBAY29kZXtMREVNVUxBVElPTn0KLQotQGl0ZW0KLWNvbXBpbGVkLWluIEBjb2Rle0RFRkFVTFRfRU1VTEFUSU9OfSBmcm9tIEBmaWxle01ha2VmaWxlfSwKLXdoaWNoIGNvbWVzIGZyb20gQGNvZGV7RU1VTH0gaW4gQGZpbGV7Y29uZmlnL0B2YXJ7dGFyZ2V0fS5tdH0KLUBlbmQgZW51bWVyYXRlCi0KLUBub2RlIFJlcG9ydGluZyBCdWdzCi1AY2hhcHRlciBSZXBvcnRpbmcgQnVncwotQGNpbmRleCBidWdzCi1AY2luZGV4IHJlcG9ydGluZyBidWdzCi0KLVlvdXIgYnVnIHJlcG9ydHMgcGxheSBhbiBlc3NlbnRpYWwgcm9sZSBpbiBtYWtpbmcgdGhlIGJpbmFyeSB1dGlsaXRpZXMKLXJlbGlhYmxlLgotCi1SZXBvcnRpbmcgYSBidWcgbWF5IGhlbHAgeW91IGJ5IGJyaW5naW5nIGEgc29sdXRpb24gdG8geW91ciBwcm9ibGVtLCBvcgotaXQgbWF5IG5vdC4gIEJ1dCBpbiBhbnkgY2FzZSB0aGUgcHJpbmNpcGFsIGZ1bmN0aW9uIG9mIGEgYnVnIHJlcG9ydCBpcwotdG8gaGVscCB0aGUgZW50aXJlIGNvbW11bml0eSBieSBtYWtpbmcgdGhlIG5leHQgdmVyc2lvbiBvZiB0aGUgYmluYXJ5Ci11dGlsaXRpZXMgd29yayBiZXR0ZXIuICBCdWcgcmVwb3J0cyBhcmUgeW91ciBjb250cmlidXRpb24gdG8gdGhlaXIKLW1haW50ZW5hbmNlLgotCi1JbiBvcmRlciBmb3IgYSBidWcgcmVwb3J0IHRvIHNlcnZlIGl0cyBwdXJwb3NlLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotaW5mb3JtYXRpb24gdGhhdCBlbmFibGVzIHVzIHRvIGZpeCB0aGUgYnVnLgotCi1AbWVudQotKiBCdWcgQ3JpdGVyaWE6OiAgICAgICAgICAgICAgICBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLSogQnVnIFJlcG9ydGluZzo6ICAgICAgICAgICAgICAgSG93IHRvIHJlcG9ydCBidWdzCi1AZW5kIG1lbnUKLQotQG5vZGUgQnVnIENyaXRlcmlhCi1Ac2VjdGlvbiBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLUBjaW5kZXggYnVnIGNyaXRlcmlhCi0KLUlmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB5b3UgaGF2ZSBmb3VuZCBhIGJ1ZywgaGVyZSBhcmUgc29tZSBndWlkZWxpbmVzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AY2luZGV4IGZhdGFsIHNpZ25hbAotQGNpbmRleCBjcmFzaAotQGl0ZW0KLUlmIGEgYmluYXJ5IHV0aWxpdHkgZ2V0cyBhIGZhdGFsIHNpZ25hbCwgZm9yIGFueSBpbnB1dCB3aGF0ZXZlciwgdGhhdCBpcwotYSBidWcuICBSZWxpYWJsZSB1dGlsaXRpZXMgbmV2ZXIgY3Jhc2guCi0KLUBjaW5kZXggZXJyb3Igb24gdmFsaWQgaW5wdXQKLUBpdGVtCi1JZiBhIGJpbmFyeSB1dGlsaXR5IHByb2R1Y2VzIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHZhbGlkIGlucHV0LCB0aGF0IGlzIGEKLWJ1Zy4KLQotQGl0ZW0KLUlmIHlvdSBhcmUgYW4gZXhwZXJpZW5jZWQgdXNlciBvZiBiaW5hcnkgdXRpbGl0aWVzLCB5b3VyIHN1Z2dlc3Rpb25zIGZvcgotaW1wcm92ZW1lbnQgYXJlIHdlbGNvbWUgaW4gYW55IGNhc2UuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgQnVnIFJlcG9ydGluZwotQHNlY3Rpb24gSG93IHRvIHJlcG9ydCBidWdzCi1AY2luZGV4IGJ1ZyByZXBvcnRzCi1AY2luZGV4IGJ1Z3MsIHJlcG9ydGluZwotCi1BIG51bWJlciBvZiBjb21wYW5pZXMgYW5kIGluZGl2aWR1YWxzIG9mZmVyIHN1cHBvcnQgZm9yIEBzY3tnbnV9Ci1wcm9kdWN0cy4gIElmIHlvdSBvYnRhaW5lZCB0aGUgYmluYXJ5IHV0aWxpdGllcyBmcm9tIGEgc3VwcG9ydAotb3JnYW5pemF0aW9uLCB3ZSByZWNvbW1lbmQgeW91IGNvbnRhY3QgdGhhdCBvcmdhbml6YXRpb24gZmlyc3QuCi0KLVlvdSBjYW4gZmluZCBjb250YWN0IGluZm9ybWF0aW9uIGZvciBtYW55IHN1cHBvcnQgY29tcGFuaWVzIGFuZAotaW5kaXZpZHVhbHMgaW4gdGhlIGZpbGUgQGZpbGV7ZXRjL1NFUlZJQ0V9IGluIHRoZSBAc2N7Z251fSBFbWFjcwotZGlzdHJpYnV0aW9uLgotCi1JbiBhbnkgZXZlbnQsIHdlIGFsc28gcmVjb21tZW5kIHRoYXQgeW91IHNlbmQgYnVnIHJlcG9ydHMgZm9yIHRoZSBiaW5hcnkKLXV0aWxpdGllcyB0byBAc2FtcHtidWctZ251LXV0aWxzQEBnbnUub3JnfS4KLQotVGhlIGZ1bmRhbWVudGFsIHByaW5jaXBsZSBvZiByZXBvcnRpbmcgYnVncyB1c2VmdWxseSBpcyB0aGlzOgotQHN0cm9uZ3tyZXBvcnQgYWxsIHRoZSBmYWN0c30uICBJZiB5b3UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgdG8gc3RhdGUgYQotZmFjdCBvciBsZWF2ZSBpdCBvdXQsIHN0YXRlIGl0IQotCi1PZnRlbiBwZW9wbGUgb21pdCBmYWN0cyBiZWNhdXNlIHRoZXkgdGhpbmsgdGhleSBrbm93IHdoYXQgY2F1c2VzIHRoZQotcHJvYmxlbSBhbmQgYXNzdW1lIHRoYXQgc29tZSBkZXRhaWxzIGRvIG5vdCBtYXR0ZXIuICBUaHVzLCB5b3UgbWlnaHQKLWFzc3VtZSB0aGF0IHRoZSBuYW1lIG9mIGEgZmlsZSB5b3UgdXNlIGluIGFuIGV4YW1wbGUgZG9lcyBub3QgbWF0dGVyLgotV2VsbCwgcHJvYmFibHkgaXQgZG9lcyBub3QsIGJ1dCBvbmUgY2Fubm90IGJlIHN1cmUuICBQZXJoYXBzIHRoZSBidWcgaXMKLWEgc3RyYXkgbWVtb3J5IHJlZmVyZW5jZSB3aGljaCBoYXBwZW5zIHRvIGZldGNoIGZyb20gdGhlIGxvY2F0aW9uIHdoZXJlCi10aGF0IHBhdGhuYW1lIGlzIHN0b3JlZCBpbiBtZW1vcnk7IHBlcmhhcHMsIGlmIHRoZSBwYXRobmFtZSB3ZXJlCi1kaWZmZXJlbnQsIHRoZSBjb250ZW50cyBvZiB0aGF0IGxvY2F0aW9uIHdvdWxkIGZvb2wgdGhlIHV0aWxpdHkgaW50bwotZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIGRlc3BpdGUgdGhlIGJ1Zy4gIFBsYXkgaXQgc2FmZSBhbmQgZ2l2ZSBhCi1zcGVjaWZpYywgY29tcGxldGUgZXhhbXBsZS4gIFRoYXQgaXMgdGhlIGVhc2llc3QgdGhpbmcgZm9yIHlvdSB0byBkbywKLWFuZCB0aGUgbW9zdCBoZWxwZnVsLgotCi1LZWVwIGluIG1pbmQgdGhhdCB0aGUgcHVycG9zZSBvZiBhIGJ1ZyByZXBvcnQgaXMgdG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnIGlmCi1pdCBpcyBuZXcgdG8gdXMuICBUaGVyZWZvcmUsIGFsd2F5cyB3cml0ZSB5b3VyIGJ1ZyByZXBvcnRzIG9uIHRoZSBhc3N1bXB0aW9uCi10aGF0IHRoZSBidWcgaGFzIG5vdCBiZWVuIHJlcG9ydGVkIHByZXZpb3VzbHkuCi0KLVNvbWV0aW1lcyBwZW9wbGUgZ2l2ZSBhIGZldyBza2V0Y2h5IGZhY3RzIGFuZCBhc2ssIGBgRG9lcyB0aGlzIHJpbmcgYQotYmVsbD8nJyAgVGhvc2UgYnVnIHJlcG9ydHMgYXJlIHVzZWxlc3MsIGFuZCB3ZSB1cmdlIGV2ZXJ5b25lIHRvCi1AZW1waHtyZWZ1c2UgdG8gcmVzcG9uZCB0byB0aGVtfSBleGNlcHQgdG8gY2hpZGUgdGhlIHNlbmRlciB0byByZXBvcnQKLWJ1Z3MgcHJvcGVybHkuCi0KLVRvIGVuYWJsZSB1cyB0byBmaXggdGhlIGJ1ZywgeW91IHNob3VsZCBpbmNsdWRlIGFsbCB0aGVzZSB0aGluZ3M6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1UaGUgdmVyc2lvbiBvZiB0aGUgdXRpbGl0eS4gIEVhY2ggdXRpbGl0eSBhbm5vdW5jZXMgaXQgaWYgeW91IHN0YXJ0IGl0Ci13aXRoIHRoZSBAc2FtcHstLXZlcnNpb259IGFyZ3VtZW50LgotCi1XaXRob3V0IHRoaXMsIHdlIHdpbGwgbm90IGtub3cgd2hldGhlciB0aGVyZSBpcyBhbnkgcG9pbnQgaW4gbG9va2luZyBmb3IKLXRoZSBidWcgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgYmluYXJ5IHV0aWxpdGllcy4KLQotQGl0ZW0KLUFueSBwYXRjaGVzIHlvdSBtYXkgaGF2ZSBhcHBsaWVkIHRvIHRoZSBzb3VyY2UsIGluY2x1ZGluZyBhbnkgcGF0Y2hlcwotbWFkZSB0byB0aGUgQGNvZGV7QkZEfSBsaWJyYXJ5LgotCi1AaXRlbQotVGhlIHR5cGUgb2YgbWFjaGluZSB5b3UgYXJlIHVzaW5nLCBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gbmFtZSBhbmQKLXZlcnNpb24gbnVtYmVyLgotCi1AaXRlbQotV2hhdCBjb21waWxlciAoYW5kIGl0cyB2ZXJzaW9uKSB3YXMgdXNlZCB0byBjb21waWxlIHRoZSB1dGlsaXRpZXMtLS1lLmcuCi1gYEBjb2Rle2djYy0yLjd9JycuCi0KLUBpdGVtCi1UaGUgY29tbWFuZCBhcmd1bWVudHMgeW91IGdhdmUgdGhlIHV0aWxpdHkgdG8gb2JzZXJ2ZSB0aGUgYnVnLiAgVG8KLWd1YXJhbnRlZSB5b3Ugd2lsbCBub3Qgb21pdCBzb21ldGhpbmcgaW1wb3J0YW50LCBsaXN0IHRoZW0gYWxsLiAgQSBjb3B5Ci1vZiB0aGUgTWFrZWZpbGUgKG9yIHRoZSBvdXRwdXQgZnJvbSBtYWtlKSBpcyBzdWZmaWNpZW50LgotCi1JZiB3ZSB3ZXJlIHRvIHRyeSB0byBndWVzcyB0aGUgYXJndW1lbnRzLCB3ZSB3b3VsZCBwcm9iYWJseSBndWVzcyB3cm9uZwotYW5kIHRoZW4gd2UgbWlnaHQgbm90IGVuY291bnRlciB0aGUgYnVnLgotCi1AaXRlbQotQSBjb21wbGV0ZSBpbnB1dCBmaWxlLCBvciBzZXQgb2YgaW5wdXQgZmlsZXMsIHRoYXQgd2lsbCByZXByb2R1Y2UgdGhlCi1idWcuICBJZiB0aGUgdXRpbGl0eSBpcyByZWFkaW5nIGFuIG9iamVjdCBmaWxlIG9yIGZpbGVzLCB0aGVuIGl0IGlzCi1nZW5lcmFsbHkgbW9zdCBoZWxwZnVsIHRvIHNlbmQgdGhlIGFjdHVhbCBvYmplY3QgZmlsZXMsIHV1ZW5jb2RlZCBpZgotbmVjZXNzYXJ5IHRvIGdldCB0aGVtIHRocm91Z2ggdGhlIG1haWwgc3lzdGVtLiAgTm90ZSB0aGF0Ci1Ac2FtcHtidWctZ251LXV0aWxzQEBnbnUub3JnfSBpcyBhIG1haWxpbmcgbGlzdCwgc28geW91IHNob3VsZCBhdm9pZAotc2VuZGluZyB2ZXJ5IGxhcmdlIGZpbGVzIHRvIGl0LiAgTWFraW5nIHRoZSBmaWxlcyBhdmFpbGFibGUgZm9yCi1hbm9ueW1vdXMgRlRQIGlzIE9LLgotCi1JZiB0aGUgc291cmNlIGZpbGVzIHdlcmUgcHJvZHVjZWQgZXhjbHVzaXZlbHkgdXNpbmcgQHNje2dudX0gcHJvZ3JhbXMKLShlLmcuLCBAY29kZXtnY2N9LCBAY29kZXtnYXN9LCBhbmQvb3IgdGhlIEBzY3tnbnV9IEBjb2Rle2xkfSksIHRoZW4gaXQKLW1heSBiZSBPSyB0byBzZW5kIHRoZSBzb3VyY2UgZmlsZXMgcmF0aGVyIHRoYW4gdGhlIG9iamVjdCBmaWxlcy4gIEluCi10aGlzIGNhc2UsIGJlIHN1cmUgdG8gc2F5IGV4YWN0bHkgd2hhdCB2ZXJzaW9uIG9mIEBjb2Rle2djY30sIG9yCi13aGF0ZXZlciwgd2FzIHVzZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0IGZpbGVzLiAgQWxzbyBzYXkgaG93Ci1AY29kZXtnY2N9LCBvciB3aGF0ZXZlciwgd2FzIGNvbmZpZ3VyZWQuCi0KLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHdoYXQgYmVoYXZpb3IgeW91IG9ic2VydmUgdGhhdCB5b3UgYmVsaWV2ZSBpcwotaW5jb3JyZWN0LiAgRm9yIGV4YW1wbGUsIGBgSXQgZ2V0cyBhIGZhdGFsIHNpZ25hbC4nJwotCi1PZiBjb3Vyc2UsIGlmIHRoZSBidWcgaXMgdGhhdCB0aGUgdXRpbGl0eSBnZXRzIGEgZmF0YWwgc2lnbmFsLCB0aGVuIHdlCi13aWxsIGNlcnRhaW5seSBub3RpY2UgaXQuICBCdXQgaWYgdGhlIGJ1ZyBpcyBpbmNvcnJlY3Qgb3V0cHV0LCB3ZSBtaWdodAotbm90IG5vdGljZSB1bmxlc3MgaXQgaXMgZ2xhcmluZ2x5IHdyb25nLiAgWW91IG1pZ2h0IGFzIHdlbGwgbm90IGdpdmUgdXMKLWEgY2hhbmNlIHRvIG1ha2UgYSBtaXN0YWtlLgotCi1FdmVuIGlmIHRoZSBwcm9ibGVtIHlvdSBleHBlcmllbmNlIGlzIGEgZmF0YWwgc2lnbmFsLCB5b3Ugc2hvdWxkIHN0aWxsCi1zYXkgc28gZXhwbGljaXRseS4gIFN1cHBvc2Ugc29tZXRoaW5nIHN0cmFuZ2UgaXMgZ29pbmcgb24sIHN1Y2ggYXMgeW91cgotY29weSBvZiB0aGUgdXRpbGl0eSBpcyBvdXQgb2Ygc3luY2gsIG9yIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnIGluCi10aGUgQyBsaWJyYXJ5IG9uIHlvdXIgc3lzdGVtLiAgKFRoaXMgaGFzIGhhcHBlbmVkISkgIFlvdXIgY29weSBtaWdodAotY3Jhc2ggYW5kIG91cnMgd291bGQgbm90LiAgSWYgeW91IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2hlbgotb3VycyBmYWlscyB0byBjcmFzaCwgd2Ugd291bGQga25vdyB0aGF0IHRoZSBidWcgd2FzIG5vdCBoYXBwZW5pbmcgZm9yCi11cy4gIElmIHlvdSBoYWQgbm90IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2Ugd291bGQgbm90IGJlIGFibGUKLXRvIGRyYXcgYW55IGNvbmNsdXNpb24gZnJvbSBvdXIgb2JzZXJ2YXRpb25zLgotCi1AaXRlbQotSWYgeW91IHdpc2ggdG8gc3VnZ2VzdCBjaGFuZ2VzIHRvIHRoZSBzb3VyY2UsIHNlbmQgdXMgY29udGV4dCBkaWZmcywgYXMKLWdlbmVyYXRlZCBieSBAY29kZXtkaWZmfSB3aXRoIHRoZSBAc2FtcHstdX0sIEBzYW1wey1jfSwgb3IgQHNhbXB7LXB9Ci1vcHRpb24uICBBbHdheXMgc2VuZCBkaWZmcyBmcm9tIHRoZSBvbGQgZmlsZSB0byB0aGUgbmV3IGZpbGUuICBJZiB5b3UKLXdpc2ggdG8gZGlzY3VzcyBzb21ldGhpbmcgaW4gdGhlIEBjb2Rle2xkfSBzb3VyY2UsIHJlZmVyIHRvIGl0IGJ5Ci1jb250ZXh0LCBub3QgYnkgbGluZSBudW1iZXIuCi0KLVRoZSBsaW5lIG51bWJlcnMgaW4gb3VyIGRldmVsb3BtZW50IHNvdXJjZXMgd2lsbCBub3QgbWF0Y2ggdGhvc2UgaW4geW91cgotc291cmNlcy4gIFlvdXIgbGluZSBudW1iZXJzIHdvdWxkIGNvbnZleSBubyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gdXMuCi1AZW5kIGl0ZW1pemUKLQotSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeToKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUEgZGVzY3JpcHRpb24gb2YgdGhlIGVudmVsb3BlIG9mIHRoZSBidWcuCi0KLU9mdGVuIHBlb3BsZSB3aG8gZW5jb3VudGVyIGEgYnVnIHNwZW5kIGEgbG90IG9mIHRpbWUgaW52ZXN0aWdhdGluZwotd2hpY2ggY2hhbmdlcyB0byB0aGUgaW5wdXQgZmlsZSB3aWxsIG1ha2UgdGhlIGJ1ZyBnbyBhd2F5IGFuZCB3aGljaAotY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgaXQuCi0KLVRoaXMgaXMgb2Z0ZW4gdGltZSBjb25zdW1pbmcgYW5kIG5vdCB2ZXJ5IHVzZWZ1bCwgYmVjYXVzZSB0aGUgd2F5IHdlCi13aWxsIGZpbmQgdGhlIGJ1ZyBpcyBieSBydW5uaW5nIGEgc2luZ2xlIGV4YW1wbGUgdW5kZXIgdGhlIGRlYnVnZ2VyCi13aXRoIGJyZWFrcG9pbnRzLCBub3QgYnkgcHVyZSBkZWR1Y3Rpb24gZnJvbSBhIHNlcmllcyBvZiBleGFtcGxlcy4KLVdlIHJlY29tbWVuZCB0aGF0IHlvdSBzYXZlIHlvdXIgdGltZSBmb3Igc29tZXRoaW5nIGVsc2UuCi0KLU9mIGNvdXJzZSwgaWYgeW91IGNhbiBmaW5kIGEgc2ltcGxlciBleGFtcGxlIHRvIHJlcG9ydCBAZW1waHtpbnN0ZWFkfQotb2YgdGhlIG9yaWdpbmFsIG9uZSwgdGhhdCBpcyBhIGNvbnZlbmllbmNlIGZvciB1cy4gIEVycm9ycyBpbiB0aGUKLW91dHB1dCB3aWxsIGJlIGVhc2llciB0byBzcG90LCBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciB3aWxsIHRha2UKLWxlc3MgdGltZSwgYW5kIHNvIG9uLgotCi1Ib3dldmVyLCBzaW1wbGlmaWNhdGlvbiBpcyBub3Qgdml0YWw7IGlmIHlvdSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLAotcmVwb3J0IHRoZSBidWcgYW55d2F5IGFuZCBzZW5kIHVzIHRoZSBlbnRpcmUgdGVzdCBjYXNlIHlvdSB1c2VkLgotCi1AaXRlbQotQSBwYXRjaCBmb3IgdGhlIGJ1Zy4KLQotQSBwYXRjaCBmb3IgdGhlIGJ1ZyBkb2VzIGhlbHAgdXMgaWYgaXQgaXMgYSBnb29kIG9uZS4gIEJ1dCBkbyBub3Qgb21pdAotdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdGVzdCBjYXNlLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0Ci1hIHBhdGNoIGlzIGFsbCB3ZSBuZWVkLiAgV2UgbWlnaHQgc2VlIHByb2JsZW1zIHdpdGggeW91ciBwYXRjaCBhbmQgZGVjaWRlCi10byBmaXggdGhlIHByb2JsZW0gYW5vdGhlciB3YXksIG9yIHdlIG1pZ2h0IG5vdCB1bmRlcnN0YW5kIGl0IGF0IGFsbC4KLQotU29tZXRpbWVzIHdpdGggcHJvZ3JhbXMgYXMgY29tcGxpY2F0ZWQgYXMgdGhlIGJpbmFyeSB1dGlsaXRpZXMgaXQgaXMKLXZlcnkgaGFyZCB0byBjb25zdHJ1Y3QgYW4gZXhhbXBsZSB0aGF0IHdpbGwgbWFrZSB0aGUgcHJvZ3JhbSBmb2xsb3cgYQotY2VydGFpbiBwYXRoIHRocm91Z2ggdGhlIGNvZGUuICBJZiB5b3UgZG8gbm90IHNlbmQgdXMgdGhlIGV4YW1wbGUsIHdlCi13aWxsIG5vdCBiZSBhYmxlIHRvIGNvbnN0cnVjdCBvbmUsIHNvIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gdmVyaWZ5IHRoYXQKLXRoZSBidWcgaXMgZml4ZWQuCi0KLUFuZCBpZiB3ZSBjYW5ub3QgdW5kZXJzdGFuZCB3aGF0IGJ1ZyB5b3UgYXJlIHRyeWluZyB0byBmaXgsIG9yIHdoeSB5b3VyCi1wYXRjaCBzaG91bGQgYmUgYW4gaW1wcm92ZW1lbnQsIHdlIHdpbGwgbm90IGluc3RhbGwgaXQuICBBIHRlc3QgY2FzZSB3aWxsCi1oZWxwIHVzIHRvIHVuZGVyc3RhbmQuCi0KLUBpdGVtCi1BIGd1ZXNzIGFib3V0IHdoYXQgdGhlIGJ1ZyBpcyBvciB3aGF0IGl0IGRlcGVuZHMgb24uCi0KLVN1Y2ggZ3Vlc3NlcyBhcmUgdXN1YWxseSB3cm9uZy4gIEV2ZW4gd2UgY2Fubm90IGd1ZXNzIHJpZ2h0IGFib3V0IHN1Y2gKLXRoaW5ncyB3aXRob3V0IGZpcnN0IHVzaW5nIHRoZSBkZWJ1Z2dlciB0byBmaW5kIHRoZSBmYWN0cy4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBJbmRleAotQHVubnVtYmVyZWQgSW5kZXgKLQotQHByaW50aW5kZXggY3AKLQotQGNvbnRlbnRzCi1AYnllCmRpZmYgLS1naXQgYS9iaW51dGlscy9idWNvbW0uYyBiL2JpbnV0aWxzL2J1Y29tbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWIwMDU0Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2J1Y29tbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qIGJ1Y29tbS5jIC0tIEJpbiBVdGlscyBDT01tb24gY29kZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0vKiBXZSBtaWdodCBwdXQgdGhpcyBpbiBhIGxpYnJhcnkgc29tZWRheSBzbyBpdCBjb3VsZCBiZSBkeW5hbWljYWxseQotICAgbG9hZGVkLCBidXQgZm9yIG5vdyBpdCdzIG5vdCBuZWNlc3NhcnkuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHRpbWUuaD4JCS8qIGN0aW1lLCBtYXliZSB0aW1lX3QgKi8KLQotI2lmbmRlZiBIQVZFX1RJTUVfVF9JTl9USU1FX0gKLSNpZm5kZWYgSEFWRV9USU1FX1RfSU5fVFlQRVNfSAotdHlwZWRlZiBsb25nIHRpbWVfdDsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0MCi0vKiBFcnJvciByZXBvcnRpbmcgKi8KLQotY2hhciAqcHJvZ3JhbV9uYW1lOwotCi12b2lkCi1iZmRfbm9uZmF0YWwgKHN0cmluZykKLSAgICAgQ09OU1QgY2hhciAqc3RyaW5nOwotewotICBDT05TVCBjaGFyICplcnJtc2cgPSBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKTsKLQotICBpZiAoc3RyaW5nKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsIHByb2dyYW1fbmFtZSwgc3RyaW5nLCBlcnJtc2cpOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIGVycm1zZyk7Ci19Ci0KLXZvaWQKLWJmZF9mYXRhbCAoc3RyaW5nKQotICAgICBDT05TVCBjaGFyICpzdHJpbmc7Ci17Ci0gIGJmZF9ub25mYXRhbCAoc3RyaW5nKTsKLSAgeGV4aXQgKDEpOwotfQotCi1zdGF0aWMgdm9pZAotcmVwb3J0IChmb3JtYXQsIGFyZ3MpCi0gICAgIGNvbnN0IGNoYXIgKiBmb3JtYXQ7Ci0gICAgIHZhX2xpc3QgYXJnczsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJncyk7Ci0gIHB1dGMgKCdcbicsIHN0ZGVycik7Ci19Ci0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXZvaWQKLWZhdGFsIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICByZXBvcnQgKGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHhleGl0ICgxKTsKLX0KLQotdm9pZAotbm9uX2ZhdGFsIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICByZXBvcnQgKGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci19Ci0jZWxzZQotdm9pZCAKLWZhdGFsICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi17Ci0gIGNoYXIgKkZvcm1hdDsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgRm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotICByZXBvcnQgKEZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHhleGl0ICgxKTsKLX0KLQotdm9pZCAKLW5vbl9mYXRhbCAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotewotICBjaGFyICpGb3JtYXQ7Ci0gIHZhX2xpc3QgYXJnczsKLQotICB2YV9zdGFydCAoYXJncyk7Ci0gIEZvcm1hdCA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKLSAgcmVwb3J0IChGb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotfQotI2VuZGlmCi0KLS8qIFNldCB0aGUgZGVmYXVsdCBCRkQgdGFyZ2V0IGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIHRhcmdldC4gIERvaW5nCi0gICB0aGlzIHBlcm1pdHMgdGhlIGJpbnV0aWxzIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIGEgcGFydGljdWxhciB0YXJnZXQsCi0gICBhbmQgbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgQkZEIGxpYnJhcnkgd2hpY2ggd2FzIGNvbmZpZ3VyZWQgZm9yIGEKLSAgIGRpZmZlcmVudCB0YXJnZXQuICAqLwotCi12b2lkCi1zZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpCi17Ci0gIC8qIFRoZSBtYWNybyBUQVJHRVQgaXMgZGVmaW5lZCBieSBNYWtlZmlsZS4gICovCi0gIGNvbnN0IGNoYXIgKnRhcmdldCA9IFRBUkdFVDsKLQotICBpZiAoISBiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0ICh0YXJnZXQpKQotICAgIGZhdGFsIChfKCJjYW4ndCBzZXQgQkZEIGRlZmF1bHQgdGFyZ2V0IHRvIGAlcyc6ICVzIiksCi0JICAgdGFyZ2V0LCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci19Ci0KLS8qIEFmdGVyIGEgZmFsc2UgcmV0dXJuIGZyb20gYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIHdpdGgKLSAgIGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCwgcHJpbnQKLSAgIHRoZSBwb3NzaWJsZSBtYXRjaGluZyB0YXJnZXRzLiAgKi8KLQotdm9pZAotbGlzdF9tYXRjaGluZ19mb3JtYXRzIChwKQotICAgICBjaGFyICoqcDsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogTWF0Y2hpbmcgZm9ybWF0czoiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgd2hpbGUgKCpwKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiAlcyIsICpwKyspOwotICBmcHV0YyAoJ1xuJywgc3RkZXJyKTsKLX0KLQotLyogTGlzdCB0aGUgc3VwcG9ydGVkIHRhcmdldHMuICAqLwotCi12b2lkCi1saXN0X3N1cHBvcnRlZF90YXJnZXRzIChuYW1lLCBmKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBGSUxFICpmOwotewotICBleHRlcm4gYmZkX3RhcmdldCAqYmZkX3RhcmdldF92ZWN0b3JbXTsKLSAgaW50IHQ7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICBmcHJpbnRmIChmLCBfKCJTdXBwb3J0ZWQgdGFyZ2V0czoiKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmLCBfKCIlczogc3VwcG9ydGVkIHRhcmdldHM6IiksIG5hbWUpOwotICBmb3IgKHQgPSAwOyBiZmRfdGFyZ2V0X3ZlY3Rvclt0XSAhPSBOVUxMOyB0KyspCi0gICAgZnByaW50ZiAoZiwgIiAlcyIsIGJmZF90YXJnZXRfdmVjdG9yW3RdLT5uYW1lKTsKLSAgZnByaW50ZiAoZiwgIlxuIik7Ci19Ci0MCi0vKiBEaXNwbGF5IHRoZSBhcmNoaXZlIGhlYWRlciBmb3IgYW4gZWxlbWVudCBhcyBpZiBpdCB3ZXJlIGFuIGxzIC1sIGxpc3Rpbmc6Ci0KLSAgIE1vZGUgICAgICAgVXNlclx0R3JvdXBcdFNpemVcdERhdGUgICAgICAgICAgICAgICBOYW1lICovCi0KLXZvaWQKLXByaW50X2FyZWx0X2Rlc2NyIChmaWxlLCBhYmZkLCB2ZXJib3NlKQotICAgICBGSUxFICpmaWxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gdmVyYm9zZTsKLXsKLSAgc3RydWN0IHN0YXQgYnVmOwotCi0gIGlmICh2ZXJib3NlKQotICAgIHsKLSAgICAgIGlmIChiZmRfc3RhdF9hcmNoX2VsdCAoYWJmZCwgJmJ1ZikgPT0gMCkKLQl7Ci0JICBjaGFyIG1vZGVidWZbMTFdOwotCSAgY2hhciB0aW1lYnVmWzQwXTsKLQkgIHRpbWVfdCB3aGVuID0gYnVmLnN0X210aW1lOwotCSAgQ09OU1QgY2hhciAqY3RpbWVfcmVzdWx0ID0gKENPTlNUIGNoYXIgKikgY3RpbWUgKCZ3aGVuKTsKLQotCSAgLyogUE9TSVggZm9ybWF0OiAgc2tpcCB3ZWVrZGF5IGFuZCBzZWNvbmRzIGZyb20gY3RpbWUgb3V0cHV0LiAgKi8KLQkgIHNwcmludGYgKHRpbWVidWYsICIlLjEycyAlLjRzIiwgY3RpbWVfcmVzdWx0ICsgNCwgY3RpbWVfcmVzdWx0ICsgMjApOwotCi0JICBtb2RlX3N0cmluZyAoYnVmLnN0X21vZGUsIG1vZGVidWYpOwotCSAgbW9kZWJ1ZlsxMF0gPSAnXDAnOwotCSAgLyogUE9TSVggMTAwMy4yL0QxMSBzYXlzIHRvIHNraXAgZmlyc3QgY2hhcmFjdGVyIChlbnRyeSB0eXBlKS4gICovCi0JICBmcHJpbnRmIChmaWxlLCAiJXMgJWxkLyVsZCAlNmxkICVzICIsIG1vZGVidWYgKyAxLAotCQkgICAobG9uZykgYnVmLnN0X3VpZCwgKGxvbmcpIGJ1Zi5zdF9naWQsCi0JCSAgIChsb25nKSBidWYuc3Rfc2l6ZSwgdGltZWJ1Zik7Ci0JfQotICAgIH0KLQotICBmcHJpbnRmIChmaWxlLCAiJXNcbiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLX0KLQotLyogUmV0dXJuIHRoZSBuYW1lIG9mIGEgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIEZJTEVOQU1FLiAgKi8KLQotY2hhciAqCi1tYWtlX3RlbXBuYW1lIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN0YXRpYyBjaGFyIHRlbXBsYXRlW10gPSAic3RYWFhYWFgiOwotICBjaGFyICp0bXBuYW1lOwotICBjaGFyICpzbGFzaCA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLycpOwotCi0jaWYgZGVmaW5lZCAoX19ESkdQUF9fKSB8fCBkZWZpbmVkIChfX0dPMzJfXykgfHwgZGVmaW5lZCAoX1dJTjMyKQotICBpZiAoc2xhc2ggPT0gTlVMTCkKLSAgICBzbGFzaCA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnXFwnKTsKLSNlbmRpZgotCi0gIGlmIChzbGFzaCAhPSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgYzsKLQotICAgICAgYyA9ICpzbGFzaDsKLSAgICAgICpzbGFzaCA9IDA7Ci0gICAgICB0bXBuYW1lID0geG1hbGxvYyAoc3RybGVuIChmaWxlbmFtZSkgKyBzaXplb2YgKHRlbXBsYXRlKSArIDEpOwotICAgICAgc3RyY3B5ICh0bXBuYW1lLCBmaWxlbmFtZSk7Ci0gICAgICBzdHJjYXQgKHRtcG5hbWUsICIvIik7Ci0gICAgICBzdHJjYXQgKHRtcG5hbWUsIHRlbXBsYXRlKTsKLSAgICAgIG1rdGVtcCAodG1wbmFtZSk7Ci0gICAgICAqc2xhc2ggPSBjOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRtcG5hbWUgPSB4bWFsbG9jIChzaXplb2YgKHRlbXBsYXRlKSk7Ci0gICAgICBzdHJjcHkgKHRtcG5hbWUsIHRlbXBsYXRlKTsKLSAgICAgIG1rdGVtcCAodG1wbmFtZSk7Ci0gICAgfQotICByZXR1cm4gdG1wbmFtZTsKLX0KLQotLyogUGFyc2UgYSBzdHJpbmcgaW50byBhIFZNQSwgd2l0aCBhIGZhdGFsIGVycm9yIGlmIGl0IGNhbid0IGJlCi0gICBwYXJzZWQuICAqLwotCi1iZmRfdm1hCi1wYXJzZV92bWEgKHMsIGFyZykKLSAgICAgY29uc3QgY2hhciAqczsKLSAgICAgY29uc3QgY2hhciAqYXJnOwotewotICBiZmRfdm1hIHJldDsKLSAgY29uc3QgY2hhciAqZW5kOwotCi0gIHJldCA9IGJmZF9zY2FuX3ZtYSAocywgJmVuZCwgMCk7Ci0gIAotICBpZiAoKmVuZCAhPSAnXDAnKQotICAgIGZhdGFsIChfKCIlczogYmFkIG51bWJlcjogJXMiKSwgYXJnLCBzKTsKLQotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYnVjb21tLmggYi9iaW51dGlscy9idWNvbW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZlNmE3OS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9idWNvbW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKiBidWNvbW0uaCAtLSBiaW51dGlscyBjb21tb24gaW5jbHVkZSBmaWxlLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotI2lmbmRlZiBfQlVDT01NX0gKLSNkZWZpbmUgX0JVQ09NTV9ICi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIFVTRV9CSU5BUllfRk9QRU4KLSNpbmNsdWRlICJmb3Blbi1iaW4uaCIKLSNlbHNlCi0jaW5jbHVkZSAiZm9wZW4tc2FtZS5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmbmRlZiBlcnJubwotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2Vsc2UKLWV4dGVybiBjaGFyICpzdHJjaHIgKCk7Ci1leHRlcm4gY2hhciAqc3RycmNociAoKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfRkNOVExfSAotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1lTX0ZJTEVfSAotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLWV4dGVybiBjaGFyICpzdHJzdHIgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU0JSSwotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSwotZXh0ZXJuIGNoYXIgKnNicmsgKCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKLWV4dGVybiBjaGFyICpnZXRlbnYgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgotZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotI2VuZGlmCi0KLSNpZm5kZWYgT19SRE9OTFkKLSNkZWZpbmUgT19SRE9OTFkgMAotI2VuZGlmCi0KLSNpZm5kZWYgT19SRFdSCi0jZGVmaW5lIE9fUkRXUiAyCi0jZW5kaWYKLQotI2lmbmRlZiBTRUVLX1NFVAotI2RlZmluZSBTRUVLX1NFVCAwCi0jZW5kaWYKLSNpZm5kZWYgU0VFS19DVVIKLSNkZWZpbmUgU0VFS19DVVIgMQotI2VuZGlmCi0jaWZuZGVmIFNFRUtfRU5ECi0jZGVmaW5lIFNFRUtfRU5EIDIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoQ19BTExPQ0EpCi0jIHVuZGVmIGFsbG9jYQotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmIGRlZmluZWQoSEFWRV9BTExPQ0FfSCkgJiYgIWRlZmluZWQoQ19BTExPQ0EpCi0jICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgZWxzZQotIyAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLSMgICBpZiAhZGVmaW5lZCAoX19TVERDX18pICYmICFkZWZpbmVkIChfX2hwdXgpCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgZWxzZQotdm9pZCAqYWxsb2NhICgpOwotIyAgIGVuZGlmIC8qIF9fU1REQ19fLCBfX2hwdXggKi8KLSMgIGVuZGlmIC8qIGFsbG9jYSAqLwotIyBlbmRpZiAvKiBIQVZFX0FMTE9DQV9IICovCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTE9DQUxFX0gKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEVOQUJMRV9OTFMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotIyBkZWZpbmUgXyhTdHJpbmcpIGdldHRleHQgKFN0cmluZykKLSMgaWZkZWYgZ2V0dGV4dF9ub29wCi0jICBkZWZpbmUgTl8oU3RyaW5nKSBnZXR0ZXh0X25vb3AgKFN0cmluZykKLSMgZWxzZQotIyAgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSMgZW5kaWYKLSNlbHNlCi0vKiBTdHVicyB0aGF0IGRvIHNvbWV0aGluZyBjbG9zZSBlbm91Z2guICAqLwotIyBkZWZpbmUgdGV4dGRvbWFpbihTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBnZXR0ZXh0KFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbixNZXNzYWdlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW4sTWVzc2FnZSxUeXBlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbixEaXJlY3RvcnkpIChEb21haW4pCi0jIGRlZmluZSBfKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSNlbmRpZgotCi0vKiBidWNvbW0uYyAqLwotdm9pZCBiZmRfbm9uZmF0YWwgUEFSQU1TICgoQ09OU1QgY2hhciAqKSk7Ci0KLXZvaWQgYmZkX2ZhdGFsIFBBUkFNUyAoKENPTlNUIGNoYXIgKikpOwotCi12b2lkIGZhdGFsIFBBUkFNUyAoKENPTlNUIGNoYXIgKiwgLi4uKSk7Ci0KLXZvaWQgbm9uX2ZhdGFsIFBBUkFNUyAoKENPTlNUIGNoYXIgKiwgLi4uKSk7Ci0KLXZvaWQgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQgbGlzdF9tYXRjaGluZ19mb3JtYXRzIFBBUkFNUyAoKGNoYXIgKipwKSk7Ci0KLXZvaWQgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyBQQVJBTVMgKChjb25zdCBjaGFyICosIEZJTEUgKikpOwotCi12b2lkIHByaW50X2FyZWx0X2Rlc2NyIFBBUkFNUyAoKEZJTEUgKmZpbGUsIGJmZCAqYWJmZCwgYm9vbGVhbiB2ZXJib3NlKSk7Ci0KLWNoYXIgKm1ha2VfdGVtcG5hbWUgUEFSQU1TICgoY2hhciAqKSk7Ci0KLWJmZF92bWEgcGFyc2Vfdm1hIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0KLWV4dGVybiBjaGFyICpwcm9ncmFtX25hbWU7Ci0KLS8qIGZpbGVtb2RlLmMgKi8KLXZvaWQgbW9kZV9zdHJpbmcgUEFSQU1TICgodW5zaWduZWQgbG9uZyBtb2RlLCBjaGFyICpidWYpKTsKLQotLyogdmVyc2lvbi5jICovCi1leHRlcm4gdm9pZCBwcmludF92ZXJzaW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiByZW5hbWUuYyAqLwotZXh0ZXJuIHZvaWQgc2V0X3RpbWVzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHN0YXQgKikpOwotCi1leHRlcm4gaW50IHNtYXJ0X3JlbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLS8qIGxpYmliZXJ0eSAqLwotUFRSIHhtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLVBUUiB4cmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotCi0jZW5kaWYgLyogX0JVQ09NTV9IICovCmRpZmYgLS1naXQgYS9iaW51dGlscy9idWRiZy5oIGIvYmludXRpbHMvYnVkYmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlZTg4OS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9idWRiZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyogYnVkYmcuYyAtLSBJbnRlcmZhY2VzIHRvIHRoZSBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiByb3V0aW5lcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEJVREJHX0gKLSNkZWZpbmUgQlVEQkdfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyogUm91dGluZSB1c2VkIHRvIHJlYWQgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1leHRlcm4gUFRSIHJlYWRfZGVidWdnaW5nX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGxvbmcpKTsKLQotLyogUm91dGluZSB1c2VkIHRvIHByaW50IGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gcHJpbnRfZGVidWdnaW5nX2luZm8gUEFSQU1TICgoRklMRSAqLCBQVFIpKTsKLQotLyogUm91dGluZXMgdXNlZCB0byByZWFkIGFuZCB3cml0ZSBzdGFicyBpbmZvcm1hdGlvbi4gICovCi0KLWV4dGVybiBQVFIgc3RhcnRfc3RhYiBQQVJBTVMgKChQVFIsIGJmZCAqLCBib29sZWFuLCBhc3ltYm9sICoqLCBsb25nKSk7Ci0KLWV4dGVybiBib29sZWFuIGZpbmlzaF9zdGFiIFBBUkFNUyAoKFBUUiwgUFRSKSk7Ci0KLWV4dGVybiBib29sZWFuIHBhcnNlX3N0YWIgUEFSQU1TICgoUFRSLCBQVFIsIGludCwgaW50LCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gd3JpdGVfc3RhYnNfaW5fc2VjdGlvbnNfZGVidWdnaW5nX2luZm8KLSAgUEFSQU1TICgoYmZkICosIFBUUiwgYmZkX2J5dGUgKiosIGJmZF9zaXplX3R5cGUgKiwgYmZkX2J5dGUgKiosCi0JICAgYmZkX3NpemVfdHlwZSAqKSk7Ci0KLS8qIFJvdXRpbmVzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1leHRlcm4gYm9vbGVhbiBwYXJzZV9pZWVlCi0gIFBBUkFNUyAoKFBUUiwgYmZkICosIGNvbnN0IGJmZF9ieXRlICosIGJmZF9zaXplX3R5cGUpKTsKLQotZXh0ZXJuIGJvb2xlYW4gd3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci0KLS8qIFJvdXRpbmUgdXNlZCB0byByZWFkIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gcGFyc2VfY29mZiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgbG9uZywgUFRSKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29mZmR1bXAuYyBiL2JpbnV0aWxzL2NvZmZkdW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjODRkNTAuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29mZmR1bXAuYworKysgL2Rldi9udWxsCkBAIC0xLDU0MSArMCwwIEBACi0vKiBDb2ZmIGZpbGUgZHVtcGVyLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgotCi0gICBUaGlzIG1vZHVsZSByZWFkcyBhIHR5cGUgdHJlZSBnZW5lcmF0ZWQgYnkgY29mZmdyb2sgYW5kIHByaW50cwotICAgaXQgb3V0IHNvIHdlIGNhbiB0ZXN0IHRoZSBncm9ra2VyLgotKi8KLQotI2luY2x1ZGUgPGJmZC5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgotCi0jaW5jbHVkZSAiY29mZmdyb2suaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLQotI2RlZmluZSBQUk9HUkFNX1ZFUlNJT04gIjEuMCIKLQotc3RhdGljIGludCBhdG5sOwotc3RhdGljIHZvaWQgZHVtcF9jb2ZmX3Njb3BlICgpOwotCi1zdGF0aWMgdm9pZAotdGFiICh4KQotaW50IHg7Ci17Ci0gIHN0YXRpYyBpbnQgaW5kZW50OwotICBpbnQgaTsKLQotICBpZiAoYXRubCkKLSAgICB7Ci0gICAgICBpZiAoeCA8IDApCi0JewotCSAgcHJpbnRmICgiKSIpOwotCSAgaW5kZW50ICs9IHg7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGF0bmwgPSAwOwotCX0KLSAgICB9Ci0KLSAgaWYgKHggPT0gLTEpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGluZGVudDsgaSsrKQotCXByaW50ZiAoIiAgICIpOwotCi0gICAgICBpbmRlbnQgKz0geDsKLSAgICAgIHByaW50ZiAoIikiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5kZW50ICs9IHg7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGluZGVudDsgaSsrKQotICAgIHByaW50ZiAoIiAgICIpOwotCi0gIGlmICh4KQotICAgIHsKLSAgICAgIHByaW50ZiAoIigiKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIG5sICgpCi17Ci0gIGF0bmwgPSAxOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2ZmX2xpbmVzIChwKQotICAgICBzdHJ1Y3QgY29mZl9saW5lICpwOwotewotICBpbnQgaTsKLSAgaW50IG9ubGluZSA9IDA7Ci0gIHRhYigxKTsKLSAgcHJpbnRmKF8oIiNsaW5lcyAlZCAiKSxwLT5ubGluZXMpOwotICBmb3IgKGkgPSAwOyBpIDwgcC0+bmxpbmVzOyBpKyspIAotICAgIHsKLSAgICAgIHByaW50ZigiKCVkIDB4JXgpIiwgcC0+bGluZXNbaV0sIHAtPmFkZHJlc3Nlc1tpXSk7Ci0gICAgICBvbmxpbmUrKzsKLSAgICAgIGlmIChvbmxpbmUgPiA2KQotCXsKLQkgIG5sKCk7Ci0JICB0YWIoMCk7Ci0JICBvbmxpbmUgPSAwOwotCX0KLSAgICB9Ci0gIG5sKCk7Ci0gIHRhYigtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfdHlwZSAocCkKLSAgICAgc3RydWN0IGNvZmZfdHlwZSAqcDsKLXsKLSAgdGFiICgxKTsKLSAgcHJpbnRmICgic2l6ZSAlZCAiLCBwLT5zaXplKTsKLSAgc3dpdGNoIChwLT50eXBlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfc2VjZGVmX3R5cGU6Ci0gICAgICBwcmludGYgKCJzZWN0aW9uIGRlZmluaXRpb24gYXQgJXggc2l6ZSAleFxuIiwgCi0JICAgICAgcC0+dS5hc2VjZGVmLmFkZHJlc3MsCi0JICAgICAgcC0+dS5hc2VjZGVmLnNpemUpOwotICAgICAgbmwoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9wb2ludGVyX3R5cGU6Ci0gICAgICBwcmludGYgKCJwb2ludGVyIHRvIik7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl90eXBlIChwLT51LnBvaW50ZXIucG9pbnRzX3RvKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9hcnJheV90eXBlOgotICAgICAgcHJpbnRmICgiYXJyYXkgWyVkXSBvZiIsIHAtPnUuYXJyYXkuZGltKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3R5cGUgKHAtPnUuYXJyYXkuYXJyYXlfb2YpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2Z1bmN0aW9uX3R5cGU6Ci0gICAgICBwcmludGYgKCJmdW5jdGlvbiByZXR1cm5pbmciKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3R5cGUgKHAtPnUuZnVuY3Rpb24uZnVuY3Rpb25fcmV0dXJucyk7Ci0gICAgICBkdW1wX2NvZmZfbGluZXMgKHAtPnUuZnVuY3Rpb24ubGluZXMpOwotICAgICAgcHJpbnRmICgiYXJndW1lbnRzIik7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl9zY29wZSAocC0+dS5mdW5jdGlvbi5wYXJhbWV0ZXJzKTsKLSAgICAgIHRhYiAoMCk7Ci0gICAgICBwcmludGYgKCJjb2RlIik7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl9zY29wZSAocC0+dS5mdW5jdGlvbi5jb2RlKTsKLSAgICAgIHRhYigwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9zdHJ1Y3RkZWZfdHlwZToKLSAgICAgIHByaW50ZiAoInN0cnVjdHVyZSBkZWZpbml0aW9uIik7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl9zY29wZSAocC0+dS5hc3RydWN0ZGVmLmVsZW1lbnRzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9zdHJ1Y3RyZWZfdHlwZToKLSAgICAgIGlmICghcC0+dS5hZW51bXJlZi5yZWYpCi0JcHJpbnRmICgic3RydWN0dXJlIHJlZiB0byBVTktOT1dOIHN0cnVjdCIpOwotICAgICAgZWxzZQotCXByaW50ZiAoInN0cnVjdHVyZSByZWYgdG8gJXMiLCBwLT51LmFlbnVtcmVmLnJlZi0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfZW51bXJlZl90eXBlOgotICAgICAgcHJpbnRmICgiZW51bSByZWYgdG8gJXMiLCBwLT51LmFzdHJ1Y3RyZWYucmVmLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9lbnVtZGVmX3R5cGU6Ci0gICAgICBwcmludGYgKCJlbnVtIGRlZmluaXRpb24iKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT51LmFlbnVtZGVmLmVsZW1lbnRzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9iYXNpY190eXBlOgotICAgICAgc3dpdGNoIChwLT51LmJhc2ljKQotCXsKLQljYXNlIFRfTlVMTDoKLQkgIHByaW50ZiAoIk5VTEwiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9WT0lEOgotCSAgcHJpbnRmICgiVk9JRCIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX0NIQVI6Ci0JICBwcmludGYgKCJDSEFSIik7Ci0JICBicmVhazsKLQljYXNlIFRfU0hPUlQ6Ci0JICBwcmludGYgKCJTSE9SVCIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX0lOVDoKLQkgIHByaW50ZiAoIklOVCAiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9MT05HOgotCSAgcHJpbnRmICgiTE9ORyIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX0ZMT0FUOgotCSAgcHJpbnRmICgiRkxPQVQiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9ET1VCTEU6Ci0JICBwcmludGYgKCJET1VCTEUiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9TVFJVQ1Q6Ci0JICBwcmludGYgKCJTVFJVQ1QiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9VTklPTjoKLQkgIHByaW50ZiAoIlVOSU9OIik7Ci0JICBicmVhazsKLQljYXNlIFRfRU5VTToKLQkgIHByaW50ZiAoIkVOVU0iKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9NT0U6Ci0JICBwcmludGYgKCJNT0UgIik7Ci0JICBicmVhazsKLQljYXNlIFRfVUNIQVI6Ci0JICBwcmludGYgKCJVQ0hBUiIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1VTSE9SVDoKLQkgIHByaW50ZiAoIlVTSE9SVCIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1VJTlQ6Ci0JICBwcmludGYgKCJVSU5UIik7Ci0JICBicmVhazsKLQljYXNlIFRfVUxPTkc6Ci0JICBwcmludGYgKCJVTE9ORyIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX0xOR0RCTDoKLQkgIHByaW50ZiAoIkxOR0RCTCIpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIG5sICgpOwotICB0YWIgKC0xKTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl93aGVyZSAocCkKLSAgICAgc3RydWN0IGNvZmZfd2hlcmUgKnA7Ci17Ci0gIHRhYiAoMSk7Ci0gIHN3aXRjaCAocC0+d2hlcmUpCi0gICAgewotICAgIGNhc2UgY29mZl93aGVyZV9zdGFjazoKLSAgICAgIHByaW50ZiAoIlN0YWNrIG9mZnNldCAleCIsIHAtPm9mZnNldCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfbWVtb3J5OgotICAgICAgcHJpbnRmICgiTWVtb3J5IHNlY3Rpb24gJXMrJXgiLCBwLT5zZWN0aW9uLT5uYW1lLCBwLT5vZmZzZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3JlZ2lzdGVyOgotICAgICAgcHJpbnRmICgiUmVnaXN0ZXIgJWQiLCBwLT5vZmZzZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbWJlcl9vZl9zdHJ1Y3Q6Ci0gICAgICBwcmludGYgKCJTdHJ1Y3QgTWVtYmVyIG9mZnNldCAleCIsIHAtPm9mZnNldCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfbWVtYmVyX29mX2VudW06Ci0gICAgICBwcmludGYgKCJFbnVtIE1lbWJlciBvZmZzZXQgJXgiLCBwLT5vZmZzZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3Vua25vd246Ci0gICAgICBwcmludGYgKCJVbmRlZmluZWQgc3ltYm9sIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfc3RydGFnOgotICAgICAgcHJpbnRmICgiU1RSVEFHIik7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX2VudGFnOgotICAgICAgcHJpbnRmICgiRU5UQUciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV90eXBlZGVmOgotICAgICAgcHJpbnRmICgiVFlQRURFRiIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgbmwgKCk7Ci0gIHRhYiAoLTEpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2ZmX3Zpc2libGUgKHApCi0gICAgIHN0cnVjdCBjb2ZmX3Zpc2libGUgKnA7Ci17Ci0gIHRhYiAoMSk7Ci0gIHN3aXRjaCAocC0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX3Zpc19leHRfZGVmOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfZXh0X2RlZiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19leHRfcmVmOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfZXh0X3JlZiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19pbnRfZGVmOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfaW50X2RlZiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19jb21tb246Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19jb21tb24iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfYXV0bzoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2F1dG8iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfYXV0b3BhcmFtOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfYXV0b3BhcmFtIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX3JlZ3BhcmFtOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfcmVncGFyYW0iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfcmVnaXN0ZXI6Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19yZWdpc3RlciIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc190YWc6Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc190YWciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfbWVtYmVyX29mX3N0cnVjdDoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX21lbWJlcl9vZl9zdHJ1Y3QiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfbWVtYmVyX29mX2VudW06Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19tZW1iZXJfb2ZfZW51bSIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgbmwgKCk7Ci0gIHRhYiAoLTEpOwotfQotCi0KLXZvaWQKLWR1bXBfY29mZl9zeW1ib2wgKHApCi0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqcDsKLXsKLSAgdGFiICgxKTsKLSAgcHJpbnRmICgiTGlzdCBvZiBzeW1ib2xzIik7Ci0gIG5sICgpOwotICB3aGlsZSAocCkKLSAgICB7Ci0gICAgICB0YWIgKDEpOwotICAgICAgdGFiICgxKTsKLSAgICAgIHByaW50ZiAoIlN5bWJvbCAgJXMsIHRhZyAlZCwgbnVtYmVyICVkIiwgcC0+bmFtZSwgcC0+dGFnLCBwLT5udW1iZXIpOwotICAgICAgbmwgKCk7Ci0gICAgICB0YWIgKC0xKTsKLSAgICAgIHRhYiAoMSk7Ci0gICAgICBwcmludGYgKCJUeXBlIik7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl90eXBlIChwLT50eXBlKTsKLSAgICAgIHRhYiAoLTEpOwotICAgICAgdGFiICgxKTsKLSAgICAgIHByaW50ZiAoIldoZXJlIik7Ci0gICAgICBkdW1wX2NvZmZfd2hlcmUgKHAtPndoZXJlKTsKLSAgICAgIHRhYiAoLTEpOwotICAgICAgdGFiICgxKTsKLSAgICAgIHByaW50ZiAoIlZpc2libGUiKTsKLSAgICAgIGR1bXBfY29mZl92aXNpYmxlIChwLT52aXNpYmxlKTsKLSAgICAgIHRhYiAoLTEpOwotICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgICB0YWIgKC0xKTsKLSAgICB9Ci0gIHRhYiAoLTEpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2ZmX3Njb3BlIChwKQotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqcDsKLXsKLWlmIChwKSB7Ci0gIHRhYiAoMSk7Ci0gIHByaW50ZiAoIkxpc3Qgb2YgYmxvY2tzICVseCAiLCh1bnNpZ25lZCBsb25nKSBwKTsKLQotICBpZiAocC0+c2VjKSB7Ci0gICAgcHJpbnRmKCAiICAlcyAleC4uJXgiLCAgcC0+c2VjLT5uYW1lLHAtPm9mZnNldCwgcC0+b2Zmc2V0ICsgcC0+c2l6ZSAtMSk7Ci0gIH0KLSAgbmwgKCk7Ci0gIHRhYiAoMCk7Ci0gIHByaW50ZiAoIioqKioqKioqKioqKioqKioqIik7Ci0gIG5sICgpOwotICB3aGlsZSAocCkKLSAgICB7Ci0gICAgICB0YWIgKDApOwotICAgICAgcHJpbnRmICgidmFycyAlZCIsIHAtPm52YXJzKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3N5bWJvbCAocC0+dmFyc19oZWFkKTsKLSAgICAgIHByaW50ZiAoImJsb2NrcyIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPmxpc3RfaGVhZCk7Ci0gICAgICBubCAoKTsKLSAgICAgIHAgPSBwLT5uZXh0OwotICAgIH0KLQotICB0YWIgKDApOwotICBwcmludGYgKCIqKioqKioqKioqKioqKioqKiIpOwotICBubCAoKTsKLSAgdGFiICgtMSk7Ci19Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfc2ZpbGUgKHApCi0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpwOwotewotICB0YWIgKDEpOwotICBwcmludGYgKCJMaXN0IG9mIHNvdXJjZSBmaWxlcyIpOwotICBubCAoKTsKLSAgd2hpbGUgKHApCi0gICAgewotICAgICAgdGFiICgwKTsKLSAgICAgIHByaW50ZiAoIlNvdXJjZSBmaWxlICVzIiwgcC0+bmFtZSk7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl9zY29wZSAocC0+c2NvcGUpOwotICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotICB0YWIgKC0xKTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl9zZWN0aW9uKHB0cikKLXN0cnVjdCBjb2ZmX3NlY3Rpb24gKnB0cjsKLXsKLSAgaW50IGk7Ci0gIHRhYigxKTsKLSAgcHJpbnRmKCJzZWN0aW9uICVzICVkICVkIGFkZHJlc3MgJXggc2l6ZSAleCBudW1iZXIgJWQgbnJlbG9jcyAlZCIsIAotCSBwdHItPm5hbWUsIHB0ci0+Y29kZSwgcHRyLT5kYXRhLCBwdHItPmFkZHJlc3MscHRyLT5zaXplLCBwdHItPm51bWJlciwgcHRyLT5ucmVsb2NzKTsKLSAgbmwoKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgcHRyLT5ucmVsb2NzOyBpKyspIAotICAgIHsKLSAgICAgIHRhYigwKTsgICAgCi0gICAgICBwcmludGYoIigleCAlcyAleCkiLAotCSAgICAgcHRyLT5yZWxvY3NbaV0ub2Zmc2V0LAotCSAgICAgcHRyLT5yZWxvY3NbaV0uc3ltYm9sLT5uYW1lLAotCSAgICAgcHRyLT5yZWxvY3NbaV0uYWRkZW5kKTsKLSAgICAgIG5sKCk7Ci0gICAgfQotICB0YWIoLTEpOwotCi19Ci0KLXZvaWQKLWNvZmZfZHVtcCAocHRyKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOwotewotICBpbnQgaTsKLSAgcHJpbnRmICgiQ29mZiBkdW1wIik7Ci0gIG5sICgpOwotICBwcmludGYgKCIjc291Y2VzICVkIiwgcHRyLT5uc291cmNlcyk7Ci0gIG5sICgpOwotICBkdW1wX2NvZmZfc2ZpbGUgKHB0ci0+c291cmNlX2hlYWQpOwotICBmb3IgKGkgPSAwOyBpIDwgcHRyLT5uc2VjdGlvbnM7IGkrKykKLSAgICBkdW1wX2NvZmZfc2VjdGlvbihwdHItPnNlY3Rpb25zICsgaSk7Ci19Ci0KLQotCi1jaGFyICogcHJvZ3JhbV9uYW1lOwotCi1zdGF0aWMgdm9pZAotc2hvd191c2FnZSAoZmlsZSwgc3RhdHVzKQotICAgICBGSUxFICpmaWxlOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChmaWxlLCAiVXNhZ2U6ICVzIFstaFZdIGluLWZpbGVcbiIsICAgcHJvZ3JhbV9uYW1lKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQKLXNob3dfaGVscCAoKQotewotICBwcmludGYgKF8oIiVzOiBQcmludCBhIGh1bWFuIHJlYWRhYmxlIGludGVycHJldGF0aW9uIG9mIGEgU1lTUk9GRiBvYmplY3QgZmlsZVxuIiksCi0JICBwcm9ncmFtX25hbWUpOwotICBzaG93X3VzYWdlIChzdGRvdXQsIDApOwotfQotCi0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKmF2W107Ci17Ci0gIGJmZCAqYWJmZDsKLSAgc3RydWN0IGNvZmZfb2ZpbGUgKnRyZWU7Ci0gIGNoYXIgKiptYXRjaGluZzsKLSAgY2hhciAqaW5wdXRfZmlsZSA9IE5VTEw7Ci0gIGludCBvcHQ7Ci0gIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLSAgICB7Ci0gICAgICB7ICJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJyB9LAotICAgICAgeyAidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVicgfSwKLSAgICAgIHsgTlVMTCwgbm9fYXJndW1lbnQsIDAsIDAgfQotICAgIH07Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhdlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcgKGFjLCBhdiwgImhWIiwgbG9uZ19vcHRpb25zLAotCQkJICAgICAoaW50ICopIE5VTEwpKQotCSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChvcHQpCi0JewotCWNhc2UgJ2gnOgotCSAgc2hvd19oZWxwICgpOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlICdWJzoKLQkgIHByaW50ZiAoXygiR05VICVzIHZlcnNpb24gJXNcbiIpLCBwcm9ncmFtX25hbWUsIFBST0dSQU1fVkVSU0lPTik7Ci0JICBleGl0ICgwKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAwOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wdGluZCA8IGFjKQotICAgIHsKLSAgICAgIGlucHV0X2ZpbGUgPSBhdltvcHRpbmRdOwotICAgIH0KLQotICBpZiAoIWlucHV0X2ZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLF8oIiVzOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZFxuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSk7Ci0gICAgICBleGl0KDEpOwotICAgIH0KLSAgYWJmZCA9IGJmZF9vcGVuciAoaW5wdXRfZmlsZSwgMCk7Ci0KLSAgaWYgKCFhYmZkKQotICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7Ci0KLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoaW5wdXRfZmlsZSk7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCXsKLQkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotCSAgZnJlZSAobWF0Y2hpbmcpOwotCX0KLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICB0cmVlID0gY29mZl9ncm9rIChhYmZkKTsKLQotICBjb2ZmX2R1bXAodHJlZSk7Ci0gIHByaW50ZigiXG4iKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9jb2ZmZ3Jvay5jIGIvYmludXRpbHMvY29mZmdyb2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0ZTZjOS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb2ZmZ3Jvay5jCisrKyAvZGV2L251bGwKQEAgLTEsNzM3ICswLDAgQEAKLS8qIGNvZmZncm9rLmMKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gKHNhY0BjeWdudXMuY29tKQotCi0gICBUaGlzIG1vZHVsZSByZWFkcyBhIGNvZmYgZmlsZSBhbmQgYnVpbGRzIGEgcmVhbGx5IHNpbXBsZSB0eXBlIHRyZWUKLSAgIHdoaWNoIGNhbiBiZSByZWFkIGJ5IG90aGVyIHByb2dyYW1zLiAgVGhlIGZpcnN0IGFwcGxpY2F0aW9uIGlzIGEKLSAgIGNvZmYtPnN5c3JvZmYgY29udmVydGVyLiAgSXQgY2FuIGJlIHRlc3RlZCB3aXRoIGNvZmZkdW1wLmMuCi0KLSovCi0KLSNpbmNsdWRlIDxiZmQuaD4KLSNpbmNsdWRlICJidWNvbW0uaCIKLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICIuLi9iZmQvbGliY29mZi5oIgotI2luY2x1ZGUgImNvZmZncm9rLmgiCi1pbnQgbG9maWxlID0gMTsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9zY29wZSAqdG9wX3Njb3BlOwotc3RhdGljIHN0cnVjdCBjb2ZmX3Njb3BlICpmaWxlX3Njb3BlOwotc3RhdGljIHN0cnVjdCBjb2ZmX29maWxlICpvZmlsZTsKLQotc3RydWN0IGNvZmZfc3ltYm9sICpsYXN0X2Z1bmN0aW9uX3N5bWJvbDsKLXN0cnVjdCBjb2ZmX3R5cGUgKmxhc3RfZnVuY3Rpb25fdHlwZTsKLXN0cnVjdCBjb2ZmX3R5cGUgKmxhc3Rfc3RydWN0Owotc3RydWN0IGNvZmZfdHlwZSAqbGFzdF9lbnVtOwotc3RydWN0IGNvZmZfc2ZpbGUgKmN1cl9zZmlsZTsKLQotc3RhdGljIHN0cnVjdCBjb2ZmX3N5bWJvbCAqKnRpbmRleDsKLQotCi1zdGF0aWMgYXN5bWJvbCAqKnN5bXM7Ci1zdGF0aWMgbG9uZyBzeW1jb3VudDsKLQotI2RlZmluZSBOKHgpICgoeCktPl9uLl9uX25wdHJbMV0pCi0KLXN0YXRpYyBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpyYXdzeW1zOwotc3RhdGljIGludCByYXdjb3VudDsKLXN0YXRpYyBiZmQgKmFiZmQ7Ci1leHRlcm4gY2hhciAqeGNhbGxvYyAoKTsKLSNkZWZpbmUgUFRSX1NJWkUgCTQKLSNkZWZpbmUgU0hPUlRfU0laRSAJMgotI2RlZmluZSBJTlRfU0laRSAJNAotI2RlZmluZSBMT05HX1NJWkUgCTQKLSNkZWZpbmUgRkxPQVRfU0laRSAJNAotI2RlZmluZSBET1VCTEVfU0laRSAJOAotCi0jZGVmaW5lIElOREVYT0YocCkgICgoc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqKShwKS0ocmF3c3ltcykpCi0KLXN0YXRpYyBzdHJ1Y3QgY29mZl9zY29wZSAqCi1lbXB0eV9zY29wZSAoKQotewotICBzdHJ1Y3QgY29mZl9zY29wZSAqbDsKLSAgbCA9IChzdHJ1Y3QgY29mZl9zY29wZSAqKSAoeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9zY29wZSksIDEpKTsKLSAgcmV0dXJuIGw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY29mZl9zeW1ib2wgKgotZW1wdHlfc3ltYm9sICgpCi17Ci0gIHJldHVybiAoc3RydWN0IGNvZmZfc3ltYm9sICopICh4Y2FsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3N5bWJvbCksIDEpKTsKLX0KLQotLyppbnQgbDsqLwotc3RhdGljIHZvaWQKLXB1c2hfc2NvcGUgKGxpbmspCi0gICAgIGludCBsaW5rOwotewotICBzdHJ1Y3QgY29mZl9zY29wZSAqbiA9IGVtcHR5X3Njb3BlICgpOwotICBpZiAobGluaykKLSAgICB7Ci0gICAgICBpZiAodG9wX3Njb3BlKQotCXsKLQkgIGlmICh0b3Bfc2NvcGUtPmxpc3RfdGFpbCkKLQkgICAgewotCSAgICAgIHRvcF9zY29wZS0+bGlzdF90YWlsLT5uZXh0ID0gbjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdG9wX3Njb3BlLT5saXN0X2hlYWQgPSBuOwotCSAgICB9Ci0JICB0b3Bfc2NvcGUtPmxpc3RfdGFpbCA9IG47Ci0JfQotICAgIH0KLSAgbi0+cGFyZW50ID0gdG9wX3Njb3BlOwotCi0gIHRvcF9zY29wZSA9IG47Ci19Ci0KLXN0YXRpYyB2b2lkCi1wb3Bfc2NvcGUgKCkKLXsKLSAgdG9wX3Njb3BlID0gdG9wX3Njb3BlLT5wYXJlbnQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19zZWN0aW9uc19wMSAoaGVhZCkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKmhlYWQ7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBpbnQgaWR4OwotICBzdHJ1Y3QgY29mZl9zZWN0aW9uICphbGwgPSAoc3RydWN0IGNvZmZfc2VjdGlvbiAqKSAoeGNhbGxvYyAoYWJmZC0+c2VjdGlvbl9jb3VudCArIDEsCi0JCQkJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uKSkpOwotICBoZWFkLT5uc2VjdGlvbnMgPSBhYmZkLT5zZWN0aW9uX2NvdW50ICsgMTsKLSAgaGVhZC0+c2VjdGlvbnMgPSBhbGw7Ci0KLSAgZm9yIChpZHggPSAwLCBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0LCBpZHgrKykKLSAgICB7Ci0gICAgICBsb25nIHJlbHNpemU7Ci0gICAgICBpbnQgaSA9IHNlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIGFyZWxlbnQgKipyZWxwcDsKLSAgICAgIGxvbmcgcmVsY291bnQ7Ci0KLSAgICAgIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWN0aW9uKTsKLSAgICAgIGlmIChyZWxzaXplIDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGlmIChyZWxzaXplID09IDApCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0gICAgICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHBwLCBzeW1zKTsKLSAgICAgIGlmIChyZWxjb3VudCA8IDApCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLm5hbWUgPSAoY2hhciAqKSAoc2VjdGlvbi0+bmFtZSk7Ci0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5jb2RlID0gc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERTsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLmRhdGEgPSBzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBOwotICAgICAgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5ic3MiKSA9PSAwKQotCWhlYWQtPnNlY3Rpb25zW2ldLmRhdGEgPSAxOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0uYWRkcmVzcyA9IHNlY3Rpb24tPmxtYTsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLnNpemUgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5udW1iZXIgPSBpZHg7Ci0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5ucmVsb2NzID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5yZWxvY3MgPQotCShzdHJ1Y3QgY29mZl9yZWxvYyAqKSAoeGNhbGxvYyAoc2VjdGlvbi0+cmVsb2NfY291bnQsCi0JCQkJCXNpemVvZiAoc3RydWN0IGNvZmZfcmVsb2MpKSk7Ci0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5iZmRfc2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgfQotICBoZWFkLT5zZWN0aW9uc1swXS5uYW1lID0gIkFCU09MVVRFIjsKLSAgaGVhZC0+c2VjdGlvbnNbMF0uY29kZSA9IDA7Ci0gIGhlYWQtPnNlY3Rpb25zWzBdLmRhdGEgPSAwOwotICBoZWFkLT5zZWN0aW9uc1swXS5hZGRyZXNzID0gMDsKLSAgaGVhZC0+c2VjdGlvbnNbMF0uc2l6ZSA9IDA7Ci0gIGhlYWQtPnNlY3Rpb25zWzBdLm51bWJlciA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19zZWN0aW9uc19wMiAoaGVhZCkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKmhlYWQ7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGo7Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgaisrKQotCXsKLQkgIGludCBpZHg7Ci0JICBpbnQgaSA9IHNlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgIHN0cnVjdCBjb2ZmX3JlbG9jICpyID0gaGVhZC0+c2VjdGlvbnNbaV0ucmVsb2NzICsgajsKLQkgIGFyZWxlbnQgKnNyID0gc2VjdGlvbi0+cmVsb2NhdGlvbiArIGo7Ci0JICByLT5vZmZzZXQgPSBzci0+YWRkcmVzczsKLQkgIHItPmFkZGVuZCA9IHNyLT5hZGRlbmQ7Ci0JICBpZHggPSAoKGNvZmZfc3ltYm9sX3R5cGUgKikgKHNyLT5zeW1fcHRyX3B0clswXSkpLT5uYXRpdmUgLSByYXdzeW1zOwotCSAgci0+c3ltYm9sID0gdGluZGV4W2lkeF07Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHN0cnVjdCBjb2ZmX3doZXJlICoKLWRvX3doZXJlIChpKQotICAgICBpbnQgaTsKLXsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltID0gJnJhd3N5bXNbaV0udS5zeW1lbnQ7Ci0gIHN0cnVjdCBjb2ZmX3doZXJlICp3aGVyZSA9Ci0gICAgKHN0cnVjdCBjb2ZmX3doZXJlICopICh4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3doZXJlKSkpOwotICB3aGVyZS0+b2Zmc2V0ID0gc3ltLT5uX3ZhbHVlOwotCi0gIGlmIChzeW0tPm5fc2NudW0gPT0gLTEpCi0gICAgc3ltLT5uX3NjbnVtID0gMDsKLQotICBzd2l0Y2ggKHN5bS0+bl9zY2xhc3MpCi0gICAgewotICAgIGNhc2UgQ19GSUVMRDoKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdDsKLSAgICAgIHdoZXJlLT5vZmZzZXQgPSBzeW0tPm5fdmFsdWUgLyA4OwotICAgICAgd2hlcmUtPmJpdG9mZnNldCA9IHN5bS0+bl92YWx1ZSAlIDg7Ci0gICAgICB3aGVyZS0+Yml0c2l6ZSA9IHJhd3N5bXNbaSArIDFdLnUuYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX01PRToKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfbWVtYmVyX29mX2VudW07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfTU9TOgotICAgIGNhc2UgQ19NT1U6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX21lbWJlcl9vZl9zdHJ1Y3Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfQVVUTzoKLSAgICBjYXNlIENfQVJHOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9zdGFjazsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19FWFQ6Ci0gICAgY2FzZSBDX1NUQVQ6Ci0gICAgY2FzZSBDX0VYVERFRjoKLSAgICBjYXNlIENfTEFCRUw6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX21lbW9yeTsKLSAgICAgIHdoZXJlLT5zZWN0aW9uID0gJm9maWxlLT5zZWN0aW9uc1tzeW0tPm5fc2NudW1dOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX1JFRzoKLSAgICBjYXNlIENfUkVHUEFSTToKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfcmVnaXN0ZXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfRU5UQUc6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX2VudGFnOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX1NUUlRBRzoKLSAgICBjYXNlIENfVU5UQUc6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX3N0cnRhZzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19UUERFRjoKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfdHlwZWRlZjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHdoZXJlOwotfQotCi1zdGF0aWMKLXN0cnVjdCBjb2ZmX2xpbmUgKgotZG9fbGluZXMgKGksIG5hbWUpCi0gICAgIGludCBpOwotICAgICBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgY29mZl9saW5lICpyZXMgPSAoc3RydWN0IGNvZmZfbGluZSAqKSB4Y2FsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmUpLCAxKTsKLSAgYXNlY3Rpb24gKnM7Ci0gIHVuc2lnbmVkIGludCBsOwotCi0gIC8qIEZpbmQgb3V0IGlmIHRoaXMgZnVuY3Rpb24gaGFzIGFueSBsaW5lIG51bWJlcnMgaW4gdGhlIHRhYmxlICovCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKGwgPSAwOyBsIDwgcy0+bGluZW5vX2NvdW50OyBsKyspCi0JewotCSAgaWYgKHMtPmxpbmVub1tsXS5saW5lX251bWJlciA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHJhd3N5bXMgKyBpID09ICgoY29mZl9zeW1ib2xfdHlwZSAqKSAoJihzLT5saW5lbm9bbF0udS5zeW1bMF0pKSktPm5hdGl2ZSkKLQkJewotCQkgIC8qIFRoZXNlIGxpbmVzIGFyZSBmb3IgdGhpcyBmdW5jdGlvbiAtIHNvIGNvdW50IHRoZW0gYW5kIHN0aWNrIHRoZW0gb24gKi8KLQkJICBpbnQgYyA9IDA7Ci0JCSAgLyogRmluZCB0aGUgbGluZW51bWJlciBvZiB0aGUgdG9wIG9mIHRoZSBmdW5jdGlvbiwgc2luY2UgY29mZiBsaW5lbnVtYmVycwotCQkgICAgIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLiAqLwotCQkgIGludCBzdGFydF9saW5lID0gcmF3c3ltc1tpICsgM10udS5hdXhlbnQueF9zeW0ueF9taXNjLnhfbG5zei54X2xubm87Ci0KLQkJICBsKys7Ci0JCSAgZm9yIChjID0gMDsgcy0+bGluZW5vW2wgKyBjICsgMV0ubGluZV9udW1iZXI7IGMrKykKLQkJICAgIDsKLQotCQkgIC8qIEFkZCB0d28gZXh0cmEgcmVjb3Jkcywgb25lIGZvciB0aGUgcHJvbG9ndWUgYW5kIG9uZSBmb3IgdGhlIGVwaWxvZ3VlICovCi0JCSAgYyArPSAxOwotCQkgIHJlcy0+bmxpbmVzID0gYzsKLQkJICByZXMtPmxpbmVzID0gKGludCAqKSAoeGNhbGxvYyAoc2l6ZW9mIChpbnQpLCBjKSk7Ci0JCSAgcmVzLT5hZGRyZXNzZXMgPSAoaW50ICopICh4Y2FsbG9jIChzaXplb2YgKGludCksIGMpKTsKLQkJICByZXMtPmxpbmVzWzBdID0gc3RhcnRfbGluZTsKLQkJICByZXMtPmFkZHJlc3Nlc1swXSA9IHJhd3N5bXNbaV0udS5zeW1lbnQubl92YWx1ZSAtIHMtPnZtYTsKLQkJICBmb3IgKGMgPSAwOyBzLT5saW5lbm9bbCArIGMgKyAxXS5saW5lX251bWJlcjsgYysrKQotCQkgICAgewotCQkgICAgICByZXMtPmxpbmVzW2MgKyAxXSA9IHMtPmxpbmVub1tsICsgY10ubGluZV9udW1iZXIgKyBzdGFydF9saW5lIC0gMTsKLQkJICAgICAgcmVzLT5hZGRyZXNzZXNbYyArIDFdID0gcy0+bGluZW5vW2wgKyBjXS51Lm9mZnNldDsKLQkJICAgIH0KLQkJICByZXR1cm4gcmVzOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMKLXN0cnVjdCBjb2ZmX3R5cGUgKgotZG9fdHlwZSAoaSkKLSAgICAgaW50IGk7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSA9ICZyYXdzeW1zW2ldLnUuc3ltZW50OwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eCA9ICZyYXdzeW1zW2kgKyAxXS51LmF1eGVudDsKLSAgc3RydWN0IGNvZmZfdHlwZSAqcmVzID0KLSAgICAoc3RydWN0IGNvZmZfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3R5cGUpKTsKLSAgaW50IHR5cGUgPSBzeW0tPm5fdHlwZTsKLSAgaW50IHdoaWNoX2R0ID0gMDsKLSAgaW50IGRpbWluZCA9IDA7Ci0KLSAgcmVzLT50eXBlID0gY29mZl9iYXNpY190eXBlOwotICByZXMtPnUuYmFzaWMgPSB0eXBlICYgMHhmOwotCi0gIHN3aXRjaCAodHlwZSAmIDB4ZikKLSAgICB7Ci0gICAgY2FzZSBUX05VTEw6Ci0gICAgY2FzZSBUX1ZPSUQ6Ci0gICAgICBpZiAoc3ltLT5uX251bWF1eCAmJiBzeW0tPm5fc2NsYXNzID09IENfU1RBVCkKLQl7Ci0JICAvKiBUaGlzIGlzIHByb2JhYmx5IGEgc2VjdGlvbiBkZWZpbml0aW9uICovCi0JICByZXMtPnR5cGUgPSBjb2ZmX3NlY2RlZl90eXBlOwotCSAgcmVzLT5zaXplID0gYXV4LT54X3Njbi54X3NjbmxlbjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHR5cGUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIERvbid0IGtub3cgd2hhdCB0aGlzIGlzLCBsZXQncyBtYWtlIGl0IGEgc2ltcGxlIGludCAqLwotCSAgICAgIHJlcy0+c2l6ZSA9IElOVF9TSVpFOwotCSAgICAgIHJlcy0+dS5iYXNpYyA9IFRfVUlOVDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRWxzZSBpdCBjb3VsZCBiZSBhIGZ1bmN0aW9uIG9yIHBvaW50ZXIgdG8gdm9pZCAqLwotCSAgICAgIHJlcy0+c2l6ZSA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLQotCi0gICAgICBicmVhazsKLSAgICBjYXNlIFRfVUNIQVI6Ci0gICAgY2FzZSBUX0NIQVI6Ci0gICAgICByZXMtPnNpemUgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX1VTSE9SVDoKLSAgICBjYXNlIFRfU0hPUlQ6Ci0gICAgICByZXMtPnNpemUgPSBTSE9SVF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX1VJTlQ6Ci0gICAgY2FzZSBUX0lOVDoKLSAgICAgIHJlcy0+c2l6ZSA9IElOVF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX1VMT05HOgotICAgIGNhc2UgVF9MT05HOgotICAgICAgcmVzLT5zaXplID0gTE9OR19TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX0ZMT0FUOgotICAgICAgcmVzLT5zaXplID0gRkxPQVRfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9ET1VCTEU6Ci0gICAgICByZXMtPnNpemUgPSBET1VCTEVfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9TVFJVQ1Q6Ci0gICAgY2FzZSBUX1VOSU9OOgotICAgICAgaWYgKHN5bS0+bl9udW1hdXgpCi0JewotCSAgaWYgKGF1eC0+eF9zeW0ueF90YWduZHgucCkKLQkgICAgewotCSAgICAgIC8qIFJlZmVyaW5nIHRvIGEgc3RydWN0IGRlZmluZWQgZWxzZXdoZXJlICovCi0JICAgICAgcmVzLT50eXBlID0gY29mZl9zdHJ1Y3RyZWZfdHlwZTsKLQkgICAgICByZXMtPnUuYXN0cnVjdHJlZi5yZWYgPSB0aW5kZXhbSU5ERVhPRiAoYXV4LT54X3N5bS54X3RhZ25keC5wKV07Ci0JICAgICAgcmVzLT5zaXplID0gcmVzLT51LmFzdHJ1Y3RyZWYucmVmID8KLQkJcmVzLT51LmFzdHJ1Y3RyZWYucmVmLT50eXBlLT5zaXplIDogMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogQSBkZWZpbml0aW9uIG9mIGEgc3RydWN0ICovCi0JICAgICAgbGFzdF9zdHJ1Y3QgPSByZXM7Ci0JICAgICAgcmVzLT50eXBlID0gY29mZl9zdHJ1Y3RkZWZfdHlwZTsKLQkgICAgICByZXMtPnUuYXN0cnVjdGRlZi5lbGVtZW50cyA9IGVtcHR5X3Njb3BlICgpOwotCSAgICAgIHJlcy0+dS5hc3RydWN0ZGVmLmlkeCA9IDA7Ci0JICAgICAgcmVzLT51LmFzdHJ1Y3RkZWYuaXNzdHJ1Y3QgPSAodHlwZSAmIDB4ZikgPT0gVF9TVFJVQ1Q7Ci0JICAgICAgcmVzLT5zaXplID0gYXV4LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBObyBhdXhlbnRzIC0gaXQncyBhbm9ueW5tb3VzICovCi0JICByZXMtPnR5cGUgPSBjb2ZmX3N0cnVjdHJlZl90eXBlOwotCSAgcmVzLT51LmFzdHJ1Y3RyZWYucmVmID0gMDsKLQkgIHJlcy0+c2l6ZSA9IDA7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX0VOVU06Ci0gICAgICBpZiAoYXV4LT54X3N5bS54X3RhZ25keC5wKQotCXsKLQkgIC8qIFJlZmVyaW5nIHRvIGEgZW51bSBkZWZpbmVkIGVsc2V3aGVyZSAqLwotCSAgcmVzLT50eXBlID0gY29mZl9lbnVtcmVmX3R5cGU7Ci0JICByZXMtPnUuYWVudW1yZWYucmVmID0gdGluZGV4W0lOREVYT0YgKGF1eC0+eF9zeW0ueF90YWduZHgucCldOwotCSAgcmVzLT5zaXplID0gcmVzLT51LmFlbnVtcmVmLnJlZi0+dHlwZS0+c2l6ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQSBkZWZpbml0aW9uIG9mIGFuIGVudW0gKi8KLQkgIGxhc3RfZW51bSA9IHJlczsKLQkgIHJlcy0+dHlwZSA9IGNvZmZfZW51bWRlZl90eXBlOwotCSAgcmVzLT51LmFlbnVtZGVmLmVsZW1lbnRzID0gZW1wdHlfc2NvcGUgKCk7Ci0JICByZXMtPnNpemUgPSBhdXgtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9NT0U6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgZm9yICh3aGljaF9kdCA9IDU7IHdoaWNoX2R0ID49IDA7IHdoaWNoX2R0LS0pCi0gICAgewotICAgICAgc3dpdGNoICgodHlwZSA+PiAoKHdoaWNoX2R0ICogMikgKyA0KSkgJiAweDMpCi0JewotCWNhc2UgMDoKLQkgIGJyZWFrOwotCWNhc2UgRFRfQVJZOgotCSAgewotCSAgICBzdHJ1Y3QgY29mZl90eXBlICpwdHIgPSAoKHN0cnVjdCBjb2ZmX3R5cGUgKikKLQkJCQkgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfdHlwZSkpKTsKLQkgICAgaW50IGVscyA9IChkaW1pbmQgPCBESU1OVU0KLQkJICAgICAgID8gYXV4LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuW2RpbWluZF0KLQkJICAgICAgIDogMCk7Ci0JICAgICsrZGltaW5kOwotCSAgICBwdHItPnR5cGUgPSBjb2ZmX2FycmF5X3R5cGU7Ci0JICAgIHB0ci0+c2l6ZSA9IGVscyAqIHJlcy0+c2l6ZTsKLQkgICAgcHRyLT51LmFycmF5LmRpbSA9IGVsczsKLQkgICAgcHRyLT51LmFycmF5LmFycmF5X29mID0gcmVzOwotCSAgICByZXMgPSBwdHI7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgRFRfUFRSOgotCSAgewotCSAgICBzdHJ1Y3QgY29mZl90eXBlICpwdHIgPQotCSAgICAgIChzdHJ1Y3QgY29mZl90eXBlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfdHlwZSkpOwotCSAgICBwdHItPnNpemUgPSBQVFJfU0laRTsKLQkgICAgcHRyLT50eXBlID0gY29mZl9wb2ludGVyX3R5cGU7Ci0JICAgIHB0ci0+dS5wb2ludGVyLnBvaW50c190byA9IHJlczsKLQkgICAgcmVzID0gcHRyOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIERUX0ZDTjoKLQkgIHsKLQkgICAgc3RydWN0IGNvZmZfdHlwZSAqcHRyCi0JICAgICAgPSAoc3RydWN0IGNvZmZfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3R5cGUpKTsKLQkgICAgcHRyLT5zaXplID0gMDsKLQkgICAgcHRyLT50eXBlID0gY29mZl9mdW5jdGlvbl90eXBlOwotCSAgICBwdHItPnUuZnVuY3Rpb24uZnVuY3Rpb25fcmV0dXJucyA9IHJlczsKLQkgICAgcHRyLT51LmZ1bmN0aW9uLnBhcmFtZXRlcnMgPSBlbXB0eV9zY29wZSAoKTsKLQkgICAgcHRyLT51LmZ1bmN0aW9uLmxpbmVzID0gZG9fbGluZXMgKGksIHN5bS0+X24uX25fbnB0clsxXSk7Ci0JICAgIHB0ci0+dS5mdW5jdGlvbi5jb2RlID0gMDsKLQkgICAgbGFzdF9mdW5jdGlvbl90eXBlID0gcHRyOwotCSAgICByZXMgPSBwdHI7Ci0JICAgIGJyZWFrOwotCSAgfQotCX0KLSAgICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY29mZl92aXNpYmxlICoKLWRvX3Zpc2libGUgKGkpCi0gICAgIGludCBpOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gPSAmcmF3c3ltc1tpXS51LnN5bWVudDsKLSAgc3RydWN0IGNvZmZfdmlzaWJsZSAqdmlzaWJsZSA9Ci0gICAgKHN0cnVjdCBjb2ZmX3Zpc2libGUgKikgKHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfdmlzaWJsZSkpKTsKLSAgZW51bSBjb2ZmX3Zpc190eXBlIHQ7Ci0gIHN3aXRjaCAoc3ltLT5uX3NjbGFzcykKLSAgICB7Ci0gICAgY2FzZSBDX01PUzoKLSAgICBjYXNlIENfTU9VOgotICAgIGNhc2UgQ19GSUVMRDoKLSAgICAgIHQgPSBjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX01PRToKLSAgICAgIHQgPSBjb2ZmX3Zpc19tZW1iZXJfb2ZfZW51bTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX1JFR1BBUk06Ci0gICAgICB0ID0gY29mZl92aXNfcmVncGFyYW07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19SRUc6Ci0gICAgICB0ID0gY29mZl92aXNfcmVnaXN0ZXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfU1RSVEFHOgotICAgIGNhc2UgQ19VTlRBRzoKLSAgICBjYXNlIENfRU5UQUc6Ci0gICAgY2FzZSBDX1RQREVGOgotICAgICAgdCA9IGNvZmZfdmlzX3RhZzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19BVVRPQVJHOgotICAgIGNhc2UgQ19BUkc6Ci0gICAgICB0ID0gY29mZl92aXNfYXV0b3BhcmFtOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0FVVE86Ci0KLQotICAgICAgdCA9IGNvZmZfdmlzX2F1dG87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfTEFCRUw6Ci0gICAgY2FzZSBDX1NUQVQ6Ci0gICAgICB0ID0gY29mZl92aXNfaW50X2RlZjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19FWFQ6Ci0gICAgICBpZiAoc3ltLT5uX3NjbnVtID09IE5fVU5ERUYpCi0JewotCSAgaWYgKHN5bS0+bl92YWx1ZSkKLQkgICAgdCA9IGNvZmZfdmlzX2NvbW1vbjsKLQkgIGVsc2UKLQkgICAgdCA9IGNvZmZfdmlzX2V4dF9yZWY7Ci0JfQotICAgICAgZWxzZQotCXQgPSBjb2ZmX3Zpc19leHRfZGVmOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gIHZpc2libGUtPnR5cGUgPSB0OwotICByZXR1cm4gdmlzaWJsZTsKLX0KLQotc3RhdGljIGludAotZG9fZGVmaW5lIChpLCBiKQotICAgICBpbnQgaTsKLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKmI7Ci17Ci0gIHN0YXRpYyBpbnQgc3ltYm9sX2luZGV4OwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gPSAmcmF3c3ltc1tpXS51LnN5bWVudDsKLQotICAvKiBEZWZpbmUgYSBzeW1ib2wgYW5kIGF0dGFjaCB0byBibG9jayBiICovCi0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqcyA9IGVtcHR5X3N5bWJvbCAoKTsKLQotICBzLT5udW1iZXIgPSArK3N5bWJvbF9pbmRleDsKLSAgcy0+bmFtZSA9IHN5bS0+X24uX25fbnB0clsxXTsKLSAgcy0+c2ZpbGUgPSBjdXJfc2ZpbGU7Ci0gIC8qIEdsdWUgb250byB0aGUgb2ZpbGUgbGlzdCAqLwotICBpZiAobG9maWxlID49IDApCi0gICAgewotICAgICAgaWYgKG9maWxlLT5zeW1ib2xfbGlzdF90YWlsKQotCW9maWxlLT5zeW1ib2xfbGlzdF90YWlsLT5uZXh0X2luX29maWxlX2xpc3QgPSBzOwotICAgICAgZWxzZQotCW9maWxlLT5zeW1ib2xfbGlzdF9oZWFkID0gczsKLSAgICAgIG9maWxlLT5zeW1ib2xfbGlzdF90YWlsID0gczsKLSAgICAgIC8qIEFuZCB0aGUgYmxvY2sgbGlzdCAqLwotICAgIH0KLSAgaWYgKGItPnZhcnNfdGFpbCkKLSAgICBiLT52YXJzX3RhaWwtPm5leHQgPSBzOwotICBlbHNlCi0gICAgYi0+dmFyc19oZWFkID0gczsKLQotICBiLT52YXJzX3RhaWwgPSBzOwotICBiLT5udmFycysrOwotICBzLT50eXBlID0gZG9fdHlwZSAoaSk7Ci0gIHMtPndoZXJlID0gZG9fd2hlcmUgKGkpOwotICBzLT52aXNpYmxlID0gZG9fdmlzaWJsZSAoaSk7Ci0KLSAgdGluZGV4W2ldID0gczsKLQotICAvKiBXZSByZW1lbWJlciB0aGUgbG93ZXN0IGFkZHJlc3MgaW4gZWFjaCBzZWN0aW9uIGZvciBlYWNoIHNvdXJjZSBmaWxlICovCi0KLSAgaWYgKHMtPndoZXJlLT53aGVyZSA9PSBjb2ZmX3doZXJlX21lbW9yeQotICAgICAgJiYgcy0+dHlwZS0+dHlwZSA9PSBjb2ZmX3NlY2RlZl90eXBlKQotICAgIHsKLSAgICAgIHN0cnVjdCBjb2ZmX2lzZWN0aW9uICppcyA9IGN1cl9zZmlsZS0+c2VjdGlvbiArIHMtPndoZXJlLT5zZWN0aW9uLT5udW1iZXI7Ci0KLSAgICAgIGlmICghaXMtPmluaXQpCi0JewotCSAgaXMtPmxvdyA9IHMtPndoZXJlLT5vZmZzZXQ7Ci0JICBpcy0+aGlnaCA9IHMtPndoZXJlLT5vZmZzZXQgKyBzLT50eXBlLT5zaXplOwotCSAgaXMtPmluaXQgPSAxOwotCSAgaXMtPnBhcmVudCA9IHMtPndoZXJlLT5zZWN0aW9uOwotCX0KLQotICAgIH0KLQotICBpZiAocy0+dHlwZS0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCi0gICAgbGFzdF9mdW5jdGlvbl9zeW1ib2wgPSBzOwotCi0gIHJldHVybiBpICsgc3ltLT5uX251bWF1eCArIDE7Ci19Ci0KLQotc3RhdGljCi1zdHJ1Y3QgY29mZl9vZmlsZSAqCi1kb2l0ICgpCi17Ci0gIGludCBpOwotICBpbnQgaW5maWxlID0gMDsKLSAgc3RydWN0IGNvZmZfb2ZpbGUgKmhlYWQgPQotICAoc3RydWN0IGNvZmZfb2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9vZmlsZSkpOwotICBvZmlsZSA9IGhlYWQ7Ci0gIGhlYWQtPnNvdXJjZV9oZWFkID0gMDsKLSAgaGVhZC0+c291cmNlX3RhaWwgPSAwOwotICBoZWFkLT5uc291cmNlcyA9IDA7Ci0gIGhlYWQtPnN5bWJvbF9saXN0X3RhaWwgPSAwOwotICBoZWFkLT5zeW1ib2xfbGlzdF9oZWFkID0gMDsKLSAgZG9fc2VjdGlvbnNfcDEgKGhlYWQpOwotICBwdXNoX3Njb3BlICgxKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgcmF3Y291bnQ7KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSA9ICZyYXdzeW1zW2ldLnUuc3ltZW50OwotICAgICAgc3dpdGNoIChzeW0tPm5fc2NsYXNzKQotCXsKLQljYXNlIENfRklMRToKLQkgIHsKLQkgICAgLyogbmV3IHNvdXJjZSBmaWxlIGFubm91bmNlZCAqLwotCSAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqbiA9Ci0JICAgICAgKHN0cnVjdCBjb2ZmX3NmaWxlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfc2ZpbGUpKTsKLQkgICAgbi0+c2VjdGlvbiA9IChzdHJ1Y3QgY29mZl9pc2VjdGlvbiAqKSB4Y2FsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX2lzZWN0aW9uKSwgYWJmZC0+c2VjdGlvbl9jb3VudCArIDEpOwotCSAgICBjdXJfc2ZpbGUgPSBuOwotCSAgICBuLT5uYW1lID0gc3ltLT5fbi5fbl9ucHRyWzFdOwotCSAgICBuLT5uZXh0ID0gMDsKLQotCSAgICBpZiAoaW5maWxlKQotCSAgICAgIHsKLQkJcG9wX3Njb3BlICgpOwotCSAgICAgIH0KLQkgICAgaW5maWxlID0gMTsKLQkgICAgcHVzaF9zY29wZSAoMSk7Ci0JICAgIGZpbGVfc2NvcGUgPSBuLT5zY29wZSA9IHRvcF9zY29wZTsKLQotCSAgICBpZiAoaGVhZC0+c291cmNlX3RhaWwpCi0JICAgICAgaGVhZC0+c291cmNlX3RhaWwtPm5leHQgPSBuOwotCSAgICBlbHNlCi0JICAgICAgaGVhZC0+c291cmNlX2hlYWQgPSBuOwotCSAgICBoZWFkLT5zb3VyY2VfdGFpbCA9IG47Ci0JICAgIGhlYWQtPm5zb3VyY2VzKys7Ci0JICAgIGkgKz0gc3ltLT5uX251bWF1eCArIDE7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIENfRkNOOgotCSAgewotCSAgICBjaGFyICpuYW1lID0gc3ltLT5fbi5fbl9ucHRyWzFdOwotCSAgICBpZiAobmFtZVsxXSA9PSAnYicpCi0JICAgICAgewotCQkvKiBGdW5jdGlvbiBzdGFydCAqLwotCQlwdXNoX3Njb3BlICgwKTsKLQkJbGFzdF9mdW5jdGlvbl90eXBlLT51LmZ1bmN0aW9uLmNvZGUgPSB0b3Bfc2NvcGU7Ci0JCXRvcF9zY29wZS0+c2VjID0gb2ZpbGUtPnNlY3Rpb25zICsgc3ltLT5uX3NjbnVtOwotCQl0b3Bfc2NvcGUtPm9mZnNldCA9IHN5bS0+bl92YWx1ZTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXRvcF9zY29wZS0+c2l6ZSA9IHN5bS0+bl92YWx1ZSAtIHRvcF9zY29wZS0+b2Zmc2V0ICsgMTsKLQkJcG9wX3Njb3BlICgpOwotCi0JICAgICAgfQotCSAgICBpICs9IHN5bS0+bl9udW1hdXggKyAxOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIENfQkxPQ0s6Ci0JICB7Ci0JICAgIGNoYXIgKm5hbWUgPSBzeW0tPl9uLl9uX25wdHJbMV07Ci0JICAgIGlmIChuYW1lWzFdID09ICdiJykKLQkgICAgICB7Ci0JCS8qIEJsb2NrIHN0YXJ0ICovCi0JCXB1c2hfc2NvcGUgKDEpOwotCQl0b3Bfc2NvcGUtPnNlYyA9IG9maWxlLT5zZWN0aW9ucyArIHN5bS0+bl9zY251bTsKLQkJdG9wX3Njb3BlLT5vZmZzZXQgPSBzeW0tPm5fdmFsdWU7Ci0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXRvcF9zY29wZS0+c2l6ZSA9IHN5bS0+bl92YWx1ZSAtIHRvcF9zY29wZS0+b2Zmc2V0ICsgMTsKLQkJcG9wX3Njb3BlICgpOwotCSAgICAgIH0KLQkgICAgaSArPSBzeW0tPm5fbnVtYXV4ICsgMTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgQ19SRUdQQVJNOgotCWNhc2UgQ19BUkc6Ci0JICBpID0gZG9fZGVmaW5lIChpLCBsYXN0X2Z1bmN0aW9uX3N5bWJvbC0+dHlwZS0+dS5mdW5jdGlvbi5wYXJhbWV0ZXJzKTsKLQkgIGJyZWFrOwotCWNhc2UgQ19NT1M6Ci0JY2FzZSBDX01PVToKLQljYXNlIENfRklFTEQ6Ci0JICBpID0gZG9fZGVmaW5lIChpLCBsYXN0X3N0cnVjdC0+dS5hc3RydWN0ZGVmLmVsZW1lbnRzKTsKLQkgIGJyZWFrOwotCWNhc2UgQ19NT0U6Ci0JICBpID0gZG9fZGVmaW5lIChpLCBsYXN0X2VudW0tPnUuYWVudW1kZWYuZWxlbWVudHMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDX1NUUlRBRzoKLQljYXNlIENfRU5UQUc6Ci0JY2FzZSBDX1VOVEFHOgotCSAgLyogVmFyaW91cyBkZWZpbml0aW9uICovCi0JICBpID0gZG9fZGVmaW5lIChpLCB0b3Bfc2NvcGUpOwotCSAgYnJlYWs7Ci0JY2FzZSBDX0VYVDoKLQljYXNlIENfTEFCRUw6Ci0JICBpID0gZG9fZGVmaW5lIChpLCBmaWxlX3Njb3BlKTsKLQkgIGJyZWFrOwotCWNhc2UgQ19TVEFUOgotCWNhc2UgQ19UUERFRjoKLQljYXNlIENfQVVUTzoKLQljYXNlIENfUkVHOgotCSAgaSA9IGRvX2RlZmluZSAoaSwgdG9wX3Njb3BlKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIENfRU9TOgotCSAgaSArPSBzeW0tPm5fbnVtYXV4ICsgMTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGRvX3NlY3Rpb25zX3AyIChoZWFkKTsKLSAgcmV0dXJuIGhlYWQ7Ci19Ci0KLXN0cnVjdCBjb2ZmX29maWxlICoKLWNvZmZfZ3JvayAoaW5hYmZkKQotICAgICBiZmQgKmluYWJmZDsKLXsKLSAgbG9uZyBzdG9yYWdlOwotICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLSAgYWJmZCA9IGluYWJmZDsKLSAgc3RvcmFnZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLQotICBpZiAoc3RvcmFnZSA8IDApCi0gICAgYmZkX2ZhdGFsIChhYmZkLT5maWxlbmFtZSk7Ci0KLSAgc3ltcyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzdG9yYWdlKTsKLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChhYmZkLT5maWxlbmFtZSk7Ci0gIHJhd3N5bXMgPSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpOwotICByYXdjb3VudCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTs7Ci0gIHRpbmRleCA9IChzdHJ1Y3QgY29mZl9zeW1ib2wgKiopICh4Y2FsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3N5bWJvbCAqKSwgcmF3Y291bnQpKTsKLQotICBwID0gZG9pdCAoKTsKLSAgcmV0dXJuIHA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9jb2ZmZ3Jvay5oIGIvYmludXRpbHMvY29mZmdyb2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhZGU0Mi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb2ZmZ3Jvay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLSNkZWZpbmUgVF9OVUxMCQkwCi0jZGVmaW5lIFRfVk9JRAkJMQkvKiBmdW5jdGlvbiBhcmd1bWVudCAob25seSB1c2VkIGJ5IGNvbXBpbGVyKSAqLwotI2RlZmluZSBUX0NIQVIJCTIJLyogY2hhcmFjdGVyCQkqLwotI2RlZmluZSBUX1NIT1JUCQkzCS8qIHNob3J0IGludGVnZXIJKi8KLSNkZWZpbmUgVF9JTlQJCTQJLyogaW50ZWdlcgkJKi8KLSNkZWZpbmUgVF9MT05HCQk1CS8qIGxvbmcgaW50ZWdlcgkJKi8KLSNkZWZpbmUgVF9GTE9BVAkJNgkvKiBmbG9hdGluZyBwb2ludAkqLwotI2RlZmluZSBUX0RPVUJMRQk3CS8qIGRvdWJsZSB3b3JkCQkqLwotI2RlZmluZSBUX1NUUlVDVAk4CS8qIHN0cnVjdHVyZSAJCSovCi0jZGVmaW5lIFRfVU5JT04JCTkJLyogdW5pb24gCQkqLwotI2RlZmluZSBUX0VOVU0JCTEwCS8qIGVudW1lcmF0aW9uIAkJKi8KLSNkZWZpbmUgVF9NT0UJCTExCS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbiovCi0jZGVmaW5lIFRfVUNIQVIJCTEyCS8qIHVuc2lnbmVkIGNoYXJhY3RlcgkqLwotI2RlZmluZSBUX1VTSE9SVAkxMwkvKiB1bnNpZ25lZCBzaG9ydAkqLwotI2RlZmluZSBUX1VJTlQJCTE0CS8qIHVuc2lnbmVkIGludGVnZXIJKi8KLSNkZWZpbmUgVF9VTE9ORwkJMTUJLyogdW5zaWduZWQgbG9uZwkqLwotI2RlZmluZSBUX0xOR0RCTAkxNgkvKiBsb25nIGRvdWJsZQkJKi8KLQotCi0gc3RydWN0IGNvZmZfcmVsb2MKLSB7Ci0gICBpbnQgb2Zmc2V0OwotICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7Ci0gICBpbnQgYWRkZW5kOwotIH07Ci0KLSBzdHJ1Y3QgY29mZl9zZWN0aW9uIAotIHsKLSAgIGNoYXIgKm5hbWU7Ci0gICBpbnQgY29kZTsKLSAgIGludCBkYXRhOwotICAgaW50IGFkZHJlc3M7Ci0gICBpbnQgbnVtYmVyOyAgLyogMC4ubiwgLnRleHQgPSAwICovCi0gICBpbnQgbnJlbG9jczsKLSAgIGludCBzaXplOwotICAgc3RydWN0IGNvZmZfcmVsb2MgKnJlbG9jczsKLSAgIHN0cnVjdCBzZWMgKmJmZF9zZWN0aW9uOwotIH07Ci0KLXN0cnVjdCBjb2ZmX29maWxlCi17Ci0gIGludCBuc291cmNlczsKLSAgc3RydWN0IGNvZmZfc2ZpbGUgKnNvdXJjZV9oZWFkOwotICBzdHJ1Y3QgY29mZl9zZmlsZSAqc291cmNlX3RhaWw7Ci0gIGludCBuc2VjdGlvbnM7Ci0gIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb25zOwotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbF9saXN0X2hlYWQ7Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sX2xpc3RfdGFpbDsKLX07Ci0KLXN0cnVjdCBjb2ZmX2lzZWN0aW9uIHsKLSAgaW50IGxvdzsKLSAgaW50IGhpZ2g7Ci0gIGludCBpbml0OwotICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpwYXJlbnQ7Ci19OwotCi1zdHJ1Y3QgY29mZl9zZmlsZQotewotICBjaGFyICpuYW1lOwotICBzdHJ1Y3QgY29mZl9zY29wZSAqc2NvcGU7Ci0gIHN0cnVjdCBjb2ZmX3NmaWxlICpuZXh0OwotCi0gIC8qIFZlY3RvciB3aGljaCBtYXBzIHdoZXJlIGluIGVhY2ggb3V0cHV0IHNlY3Rpb24KLSAgICAgdGhlIGlucHV0IGZpbGUgaGFzIGl0J3MgZGF0YSAqLwotICBzdHJ1Y3QgY29mZl9pc2VjdGlvbiAqc2VjdGlvbjsgCi0KLX07Ci0KLQotIHN0cnVjdCBjb2ZmX3R5cGUKLXsKLSAgaW50IHNpemU7Ci0gIGVudW0KLSAgICB7Ci0gICAgICBjb2ZmX3BvaW50ZXJfdHlwZSwgY29mZl9mdW5jdGlvbl90eXBlLCBjb2ZmX2FycmF5X3R5cGUsIGNvZmZfc3RydWN0ZGVmX3R5cGUsIGNvZmZfYmFzaWNfdHlwZSwKLSAgICAgIGNvZmZfc3RydWN0cmVmX3R5cGUsIGNvZmZfZW51bXJlZl90eXBlLCBjb2ZmX2VudW1kZWZfdHlwZSwgY29mZl9zZWNkZWZfdHlwZQotICAgICAgfSB0eXBlOwotICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdCAKLQl7Ci0JaW50IGFkZHJlc3M7Ci0JaW50IHNpemU7Ci0gICAgICB9IGFzZWNkZWY7Ci0KLSAgICAgIHN0cnVjdAotCXsKLQkgIGludCBpc3N0cnVjdDsKLQkgIHN0cnVjdCBjb2ZmX3Njb3BlICplbGVtZW50czsKLQkgIGludCBpZHg7Ci0JfQotICAgICAgYXN0cnVjdGRlZjsKLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqcmVmOwotCX0gYXN0cnVjdHJlZjsKLQotICAgICAgc3RydWN0Ci0JewotCSAgc3RydWN0IGNvZmZfc2NvcGUgKmVsZW1lbnRzOwotCSAgaW50IGlkeDsKLQl9IGFlbnVtZGVmOwotICAgICAgc3RydWN0Ci0JewotCSAgc3RydWN0IGNvZmZfc3ltYm9sICpyZWY7Ci0JfSBhZW51bXJlZjsKLQotICAgICAgc3RydWN0Ci0JewotCSAgc3RydWN0IGNvZmZfdHlwZSAqcG9pbnRzX3RvOwotCX0gcG9pbnRlcjsKLSAgICAgIHN0cnVjdAotCXsKLQkgIGludCBkaW07Ci0JICBzdHJ1Y3QgY29mZl90eXBlICphcnJheV9vZjsKLQl9IGFycmF5OwotCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBzdHJ1Y3QgY29mZl90eXBlICpmdW5jdGlvbl9yZXR1cm5zOwotCSAgc3RydWN0IGNvZmZfc2NvcGUgKnBhcmFtZXRlcnM7Ci0JICBzdHJ1Y3QgY29mZl9zY29wZSAqY29kZTsKLQkgIHN0cnVjdCBjb2ZmX2xpbmUgKmxpbmVzOwotCX0gZnVuY3Rpb247Ci0gICAgICBpbnQgYmFzaWM7CQkvKiBPbmUgb2YgVF9WT0lELi4gVF9VSU5UICovCi0gICAgfSAgdTsKLX07Ci0KLQotIHN0cnVjdCBjb2ZmX2xpbmUgCi0gewotICAgaW50IG5saW5lczsKLSAgIGludCAqbGluZXM7Ci0gICBpbnQgKmFkZHJlc3NlczsKLSB9OwotCi0KLSBzdHJ1Y3QgY29mZl9zY29wZQotICAgewotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWM7IC8qIFdoYXQgc2VjdGlvbiAqLwotICAgICBpbnQgb2Zmc2V0OyAvKiB3aGVyZSAqLwotICAgICBpbnQgc2l6ZTsgLyogSG93IGJpZyAqLwotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqcGFyZW50OwkvKiBvbmUgdXAgKi8KLQotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqbmV4dDsJLypuZXh0IGFsb25nICovCi0KLSAgICAgaW50IG52YXJzOwotCi0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqdmFyc19oZWFkOwkvKiBzeW1ib2xzICovCi0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqdmFyc190YWlsOwotCi0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpsaXN0X2hlYWQ7CS8qIGNoaWxkcmVuICovCi0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpsaXN0X3RhaWw7Ci0KLSAgIH07Ci0KLQotIHN0cnVjdCBjb2ZmX3Zpc2libGUKLSAgIHsKLSAgICAgZW51bSBjb2ZmX3Zpc190eXBlCi0gICAgICAgewotCSBjb2ZmX3Zpc19leHRfZGVmLAotCSBjb2ZmX3Zpc19leHRfcmVmLAotCSBjb2ZmX3Zpc19pbnRfZGVmLAotCSBjb2ZmX3Zpc19jb21tb24sCi0JIGNvZmZfdmlzX2F1dG8sCi0JIGNvZmZfdmlzX3JlZ2lzdGVyLAotCSBjb2ZmX3Zpc190YWcsCi0JIGNvZmZfdmlzX21lbWJlcl9vZl9zdHJ1Y3QsCi0JIGNvZmZfdmlzX21lbWJlcl9vZl9lbnVtLAotCSBjb2ZmX3Zpc19hdXRvcGFyYW0sCQotCSBjb2ZmX3Zpc19yZWdwYXJhbSwKLSAgICAgICB9IHR5cGU7Ci0gICB9OwotCi0gc3RydWN0IGNvZmZfd2hlcmUKLSAgIHsKLSAgICAgZW51bQotICAgICAgIHsKLQkgY29mZl93aGVyZV9zdGFjaywgY29mZl93aGVyZV9tZW1vcnksIGNvZmZfd2hlcmVfcmVnaXN0ZXIsIGNvZmZfd2hlcmVfdW5rbm93biwKLQkgY29mZl93aGVyZV9zdHJ0YWcsIGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdCwKLQkgY29mZl93aGVyZV9tZW1iZXJfb2ZfZW51bSwgY29mZl93aGVyZV9lbnRhZywgY29mZl93aGVyZV90eXBlZGVmCi0KLSAgICAgICB9IHdoZXJlOwotICAgICBpbnQgb2Zmc2V0OwotICAgICBpbnQgYml0b2Zmc2V0OwotICAgICBpbnQgYml0c2l6ZTsKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKLSAgIH07Ci0KLSBzdHJ1Y3QgY29mZl9zeW1ib2wKLSAgIHsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IHRhZzsKLSAgICAgc3RydWN0IGNvZmZfdHlwZSAqdHlwZTsKLSAgICAgc3RydWN0IGNvZmZfd2hlcmUgKndoZXJlOwotICAgICBzdHJ1Y3QgY29mZl92aXNpYmxlICp2aXNpYmxlOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKm5leHQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqbmV4dF9pbl9vZmlsZV9saXN0OyAvKiBGb3IgdGhlIG9maWxlIGxpc3QgKi8KLSAgICAgaW50IG51bWJlcjsKLSAgICAgaW50IGVyX251bWJlcjsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICB9OwotCi1zdHJ1Y3QgY29mZl9vZmlsZSAqY29mZl9ncm9rKCk7CmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWcuaW4gYi9iaW51dGlscy9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjZjNWMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPHN5cy93YWl0Lmg+IHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19XQUlUX0gKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSBpZiBsZXggZGVjbGFyZXMgeXl0ZXh0IGFzIGEgY2hhciAqIGJ5IGRlZmF1bHQsIG5vdCBhIGNoYXJbXS4gICovCi0jdW5kZWYgWVlURVhUX1BPSU5URVIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NCUksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdXRpbWVzIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1VUSU1FUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRklMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIERvZXMgdGhlIHBsYXRmb3JtIHVzZSBhbiBleGVjdXRhYmxlIHN1ZmZpeD8gKi8KLSN1bmRlZiBIQVZFX0VYRUNVVEFCTEVfU1VGRklYCi0KLS8qIFN1ZmZpeCB1c2VkIGZvciBleGVjdXRhYmxlcywgaWYgYW55LiAqLwotI3VuZGVmIEVYRUNVVEFCTEVfU1VGRklYCi0KLS8qIElzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDx0aW1lLmg+PyAqLwotI3VuZGVmIEhBVkVfVElNRV9UX0lOX1RJTUVfSAotCi0vKiBJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8c3lzL3R5cGVzLmg+PyAqLwotI3VuZGVmIEhBVkVfVElNRV9UX0lOX1RZUEVTX0gKLQotLyogRG9lcyA8dXRpbWUuaD4gZGVmaW5lIHN0cnVjdCB1dGltYnVmPyAqLwotI3VuZGVmIEhBVkVfR09PRF9VVElNRV9ICi0KLS8qIERlZmluZSBpZiBmcHJpbnRmIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlBSSU5URgotCi0vKiBEZWZpbmUgaWYgc3Ryc3RyIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi0KLS8qIERlZmluZSBpZiBzYnJrIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSwotCi0vKiBEZWZpbmUgaWYgZ2V0ZW52IGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fR0VURU5WCi0KLS8qIERlZmluZSBpZiBlbnZpcm9uIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgotCi0vKiBVc2UgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzPyAqLwotI3VuZGVmIFVTRV9CSU5BUllfRk9QRU4KLQotLyogQ29uZmlndXJlZCB0YXJnZXQgbmFtZS4gKi8KLSN1bmRlZiBUQVJHRVQKLQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29uZmlndXJlIGIvYmludXRpbHMvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YzJlMDNkLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDU2NzYgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiAgIGJ1aWxkIHNoYXJlZCBCRkQvb3Bjb2Rlcy9saWJpYmVydHkgbGlicmFyeSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9YXIuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MDU6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjI2OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NDQ6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njc5OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjczMjogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODk6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPWJpbnV0aWxzCi0KLVZFUlNJT049Mi45LjUKLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotY2F0ID4+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+Li9jb25maWcubG9nCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRhcmdldHMgb3IgLS1kaXNhYmxlLXRhcmdldHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfdGFyZ2V0cytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfdGFyZ2V0cyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJyIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiBvciAtLWRpc2FibGUtY29tbW9uYmZkbGliIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2NvbW1vbmJmZGxpYitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfY29tbW9uYmZkbGliIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIEJGRCBjb21tb25iZmRsaWIgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLWZpCi0KLQotCi0KLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWlmIHRlc3QgLXogIiRob3N0IiA7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCBob3N0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTE3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQ3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk5ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAzMDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMjA0MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA3MjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNzc6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwODY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEwNTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotCi1mb3IgYWNfcHJvZyBpbiAnYmlzb24gLXknIGJ5YWNjCi1kbwotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE0MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1lBQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ZQUNDPSIkWUFDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfWUFDQz0iJGFjX3Byb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVlBQ0M9IiRhY19jdl9wcm9nX1lBQ0MiCi1pZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRZQUNDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotdGVzdCAtbiAiJFlBQ0MiICYmIGJyZWFrCi1kb25lCi10ZXN0IC1uICIkWUFDQyIgfHwgWUFDQz0ieWFjYyIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNzM6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE4OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE5NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIxMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIyMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIyODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZm9yIGFjX3Byb2cgaW4gZmxleCBsZXgKLWRvCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjU4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTEVYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19MRVg9IiRMRVgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0xFWD0iJGFjX3Byb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUxFWD0iJGFjX2N2X3Byb2dfTEVYIgotaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRVgiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi10ZXN0IC1uICIkTEVYIiAmJiBicmVhawotZG9uZQotdGVzdCAtbiAiJExFWCIgfHwgTEVYPSIiJG1pc3NpbmdfZGlyL21pc3NpbmcgZmxleCIiCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZmxleCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZmxleDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjkxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTEVYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19MRVg9IiRMRVgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0xFWD0iZmxleCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfTEVYIiAmJiBhY19jdl9wcm9nX0xFWD0ibGV4IgotZmkKLWZpCi1MRVg9IiRhY19jdl9wcm9nX0xFWCIKLWlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEVYIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJExFWExJQiIKLXRoZW4KLSAgY2FzZSAiJExFWCIgaW4KLSAgZmxleCopIGFjX2xpYj1mbCA7OwotICAqKSBhY19saWI9bCA7OwotICBlc2FjCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzI1OiBjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIgPiY1Ci1hY19saWJfdmFyPWBlY2hvICRhY19saWInXyd5eXdyYXAgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sJGFjX2xpYiAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzMzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgeXl3cmFwKCk7Ci0KLWludCBtYWluKCkgewoteXl3cmFwKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMRVhMSUI9Ii1sJGFjX2xpYiIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBsZXggb3V0cHV0IGZpbGUgcm9vdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM2NzogY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbGV4X3Jvb3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZSBtaW5pbWFsIGxleCBwcm9ncmFtIGlzIGp1c3QgYSBzaW5nbGUgbGluZTogJSUuICBCdXQgc29tZSBicm9rZW4gbGV4ZXMKLSMgKFNvbGFyaXMsIEkgdGhpbmsgaXQgd2FzKSB3YW50IHR3byAlJSBsaW5lcywgc28gYWNjb21tb2RhdGUgdGhlbS4KLWVjaG8gJyUlCi0lJScgfCAkTEVYCi1pZiB0ZXN0IC1mIGxleC55eS5jOyB0aGVuCi0gIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4Lnl5Ci1lbGlmIHRlc3QgLWYgbGV4eXkuYzsgdGhlbgotICBhY19jdl9wcm9nX2xleF9yb290PWxleHl5Ci1lbHNlCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2Fubm90IGZpbmQgb3V0cHV0IGZyb20gJExFWDsgZ2l2aW5nIHVwIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3Jvb3QiIDE+JjYKLUxFWF9PVVRQVVRfUk9PVD0kYWNfY3ZfcHJvZ19sZXhfcm9vdAotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzODg6IGNoZWNraW5nIHdoZXRoZXIgeXl0ZXh0IGlzIGEgcG9pbnRlciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFBPU0lYIHNheXMgbGV4IGNhbiBkZWNsYXJlIHl5dGV4dCBlaXRoZXIgYXMgYSBwb2ludGVyIG9yIGFuIGFycmF5OyB0aGUKLSMgZGVmYXVsdCBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuIEZpZ3VyZSBvdXQgd2hpY2ggaXQgaXMsIHNpbmNlCi0jIG5vdCBhbGwgaW1wbGVtZW50YXRpb25zIHByb3ZpZGUgdGhlICVwb2ludGVyIGFuZCAlYXJyYXkgZGVjbGFyYXRpb25zLgotYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9bm8KLWVjaG8gJ2V4dGVybiBjaGFyICp5eXRleHQ7JyA+PiRMRVhfT1VUUFVUX1JPT1QuYwotYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9IiRMSUJTICRMRVhMSUIiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDAwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWBjYXQgJExFWF9PVVRQVVRfUk9PVC5jYAotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDA3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotcm0gLWYgIiR7TEVYX09VVFBVVF9ST09UfS5jIgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgWVlURVhUX1BPSU5URVIgMQotRU9GCi0KLWZpCi0KLQotQUxMX0xJTkdVQVM9Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQzMTogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ1MjogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ1NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ2NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDgyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUyMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1NTY6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU2MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjEwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2MzE6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjYzOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NDU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjcxOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjc2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MDQ6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjcwOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjczOTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc1MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3NzI6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc3NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODA1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgzNzogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODY3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4OTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjkyMjogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5MzAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk0OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTc0OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk4NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDEzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDE4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwNjY6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjQyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI1MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyODI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyODcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMxMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzMzOTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM0NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzY3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MDE6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQwNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDM0OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NTQ6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ3MzogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQ3OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDgzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUwMDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTA1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTEyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1Mjg6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTM2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU0NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU2MzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTY4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU3NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2Mzc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2NDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY2NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY5MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3Mjg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzc2MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODM0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg3MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk2MDogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk4ODogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzk5MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTk4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwNjE6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKLSAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi1maQotCi0gIGVjaG8gIiRhY190IiIkVVNFX01BSU5UQUlORVJfTU9ERSIgMT4mNgotICAKLQotaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgotICBNQUlOVEFJTkVSX01PREVfVFJVRT0KLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJwotZWxzZQotICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQotZmkKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDg0OiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MDg5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTAwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTE3OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxMjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTI5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxNDg6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxNTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi1pZiB0ZXN0IC1uICIkRVhFRVhUIjsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWCAxCi1FT0YKLQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIEVYRUNVVEFCTEVfU1VGRklYICIke0VYRUVYVH0iCi1FT0YKLQotCi0jIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6Ci0KLUhERUZJTkVTPQotCi0uICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmhvc3QKLQotCi1BUj0ke0FSLWFyfQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyMDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyNDA6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAteiAiJENDX0ZPUl9CVUlMRCI7IHRoZW4KLSAgaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJwotICBlbHNlCi0gICAgQ0NfRk9SX0JVSUxEPWdjYwotICBmaQotZmkKLQotIyBBbHNvIHNldCBFWEVFWFRfRk9SX0JVSUxELgotaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgRVhFRVhUX0ZPUl9CVUlMRD0nJChFWEVFWFQpJwotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYnVpbGQgc3lzdGVtIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzA3OiBjaGVja2luZyBmb3IgYnVpbGQgc3lzdGVtIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfYnVpbGRfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gICAgIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuYwotICAgICBiZmRfY3ZfYnVpbGRfZXhlZXh0PQotICAgICAke0NDX0ZPUl9CVUlMRH0gLW8gY29uZnRlc3QgY29uZnRlc3QuYyAxPiY1IDI+JjUKLSAgICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgICBjYXNlICRmaWxlIGluCi0gICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgICopIGJmZF9jdl9idWlsZF9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgIGVzYWMKLSAgICAgZG9uZQotICAgICBybSAtZiBjb25mdGVzdCoKLSAgICAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iID0geCAmJiBiZmRfY3ZfYnVpbGRfZXhlZXh0PW5vCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9idWlsZF9leGVleHQiIDE+JjYKLSAgRVhFRVhUX0ZPUl9CVUlMRD0iIgotICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVF9GT1JfQlVJTEQ9JHtiZmRfY3ZfYnVpbGRfZXhlZXh0fQotZmkKLQotCi1ERU1BTkdMRVJfTkFNRT1jKytmaWx0Ci1jYXNlICIke2hvc3R9IiBpbgotICAqLSotZ28zMiogfCAqLSotbXNkb3MqKQotICAgIERFTUFOR0xFUl9OQU1FPWN4eGZpbHQKLWVzYWMKLQotCi1mb3IgYWNfaGRyIGluIHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB1bmlzdGQuaCBmY250bC5oIHN5cy9maWxlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzQyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDM0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM1MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0Mzc5OiBjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N5c193YWl0X2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0Mzg0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2lmbmRlZiBXRVhJVFNUQVRVUwotI2RlZmluZSBXRVhJVFNUQVRVUyhzdGF0X3ZhbCkgKCh1bnNpZ25lZCkoc3RhdF92YWwpID4+IDgpCi0jZW5kaWYKLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRChzdGF0X3ZhbCkgKCgoc3RhdF92YWwpICYgMjU1KSA9PSAwKQotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWludCBzOwotd2FpdCAoJnMpOwotcyA9IFdJRkVYSVRFRCAocykgPyBXRVhJVFNUQVRVUyAocykgOiAxOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MDA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N5c193YWl0X2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0MjM6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDU2OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0NjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQ4OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1MjE6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDU1MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDU1NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTc5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2MDY6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjE0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2MzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfZnVuYyBpbiBzYnJrIHV0aW1lcwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDY1NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDY2MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Njg1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgU29tZSBzeXN0ZW1zIGhhdmUgZnJleHAgb25seSBpbiAtbG0sIG5vdCBpbiAtbGMuCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZnJleHAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3MTM6IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZnJleHAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3NlYXJjaF9mcmV4cCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0iJExJQlMiCi1hY19jdl9zZWFyY2hfZnJleHA9Im5vIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDcyMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGZyZXhwKCk7Ci0KLWludCBtYWluKCkgewotZnJleHAoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3MzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3NlYXJjaF9mcmV4cD0ibm9uZSByZXF1aXJlZCIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi10ZXN0ICIkYWNfY3Zfc2VhcmNoX2ZyZXhwIiA9ICJubyIgJiYgZm9yIGkgaW4gLWxtOyBkbwotTElCUz0iLWwkaSAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3NDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBmcmV4cCgpOwotCi1pbnQgbWFpbigpIHsKLWZyZXhwKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzUzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9zZWFyY2hfZnJleHA9Ii1sJGkiCi1icmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLUxJQlM9IiRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3NlYXJjaF9mcmV4cCIgMT4mNgotaWYgdGVzdCAiJGFjX2N2X3NlYXJjaF9mcmV4cCIgIT0gIm5vIjsgdGhlbgotICB0ZXN0ICIkYWNfY3Zfc2VhcmNoX2ZyZXhwIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfY3Zfc2VhcmNoX2ZyZXhwICRMSUJTIgotICAKLWVsc2UgOgotICAKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0aW1lX3QgaW4gdGltZS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0Nzc1OiBjaGVja2luZyBmb3IgdGltZV90IGluIHRpbWUuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDc4MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8dGltZS5oPgotaW50IG1haW4oKSB7Ci10aW1lX3QgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Nzg3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBidV9jdl9kZWNsX3RpbWVfdF90aW1lX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oIiAxPiY2Ci1pZiB0ZXN0ICRidV9jdl9kZWNsX3RpbWVfdF90aW1lX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfVElNRV9UX0lOX1RJTUVfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRpbWVfdCBpbiBzeXMvdHlwZXMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDgwODogY2hlY2tpbmcgZm9yIHRpbWVfdCBpbiBzeXMvdHlwZXMuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4MTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotaW50IG1haW4oKSB7Ci10aW1lX3QgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODIwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oIiAxPiY2Ci1pZiB0ZXN0ICRidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1RJTUVfVF9JTl9UWVBFU19IIDEKLUVPRgotCi1maQotCi0jIFVuZGVyIE5leHQgMy4yIDx1dGltZS5oPiBhcHBhcmVudGx5IGRvZXMgbm90IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1ZgotIyBieSBkZWZhdWx0LgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHV0aW1lLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4NDM6IGNoZWNraW5nIGZvciB1dGltZS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydidV9jdl9oZWFkZXJfdXRpbWVfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4NDggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfVElNRV9ICi0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dXRpbWUuaD4KLWludCBtYWluKCkgewotc3RydWN0IHV0aW1idWYgczsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODU5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfaGVhZGVyX3V0aW1lX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJ1X2N2X2hlYWRlcl91dGltZV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJ1X2N2X2hlYWRlcl91dGltZV9oIiAxPiY2Ci1pZiB0ZXN0ICRidV9jdl9oZWFkZXJfdXRpbWVfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HT09EX1VUSU1FX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZnByaW50ZiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODgwOiBjaGVja2luZyB3aGV0aGVyIGZwcmludGYgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0ODg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGZwcmludGYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTA2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGY9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGY9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9mcHJpbnRmIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZnByaW50ZiA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTI3OiBjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDkzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzdHJzdHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTUzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUiAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzYnJrIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5NzQ6IGNoZWNraW5nIHdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ5NzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc2JyawotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwMDA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NCUksgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwMjE6IGNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGdldGVudgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwNDc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnY9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fR0VURU5WIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGVudmlyb24gbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTA2ODogY2hlY2tpbmcgd2hldGhlciBlbnZpcm9uIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTA3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBlbnZpcm9uCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA5NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24gPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTiAxCi1FT0YKLQotZmkKLQotCi0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotbXNkb3MqIHwgKi0qLWdvMzIqIHwgKi0qLW1pbmd3MzIqIHwgKi0qLWN5Z3dpbiogfCAqLSotd2luZG93cyopCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOIDEKLUVPRgotIDs7Ci1lc2FjCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyI7IHRoZW4KLSAgICBmb3IgdGFyZyBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotICAgIGRvCi0JcmVzdWx0PWAkYWNfY29uZmlnX3N1YiAkdGFyZyAyPi9kZXYvbnVsbGAKLQlpZiB0ZXN0IC1uICIkcmVzdWx0IjsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotQlVJTERfTkxNQ09OVj0KLU5MTUNPTlZfREVGUz0KLUJVSUxEX1NSQ09OVj0KLUJVSUxEX0RMTFRPT0w9Ci1ETExUT09MX0RFRlM9Ci1CVUlMRF9XSU5EUkVTPQotQlVJTERfRExMV1JBUD0KLUJVSUxEX01JU0M9Ci0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIjsgdGhlbgotICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCi0JQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCUJVSUxEX1NSQ09OVj0nJChTUkNPTlZfUFJPRyknCi0JTkxNQ09OVl9ERUZTPSItRE5MTUNPTlZfSTM4NiAtRE5MTUNPTlZfQUxQSEEgLUROTE1DT05WX1BPV0VSUEMgLUROTE1DT05WX1NQQVJDIgotICAgIGVsc2UKLQljYXNlICR0YXJnIGluCi0JaVszNDU2XTg2Ki0qLW5ldHdhcmUqKSAKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfSTM4NiIKLQkgIDs7Ci0JYWxwaGEqLSotbmV0d2FyZSopCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX0FMUEhBIgotCSAgOzsKLQlwb3dlcnBjKi0qLW5ldHdhcmUqKQotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9QT1dFUlBDIgotCSAgOzsKLQlzcGFyYyotKi1uZXR3YXJlKikKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfU1BBUkMiCi0JICA7OwotCWVzYWMKLQljYXNlICR0YXJnIGluCi0JKi0qLWhtcyopIEJVSUxEX1NSQ09OVj0nJChTUkNPTlZfUFJPRyknIDs7Ci0JZXNhYwotCWNhc2UgJHRhcmcgaW4KLQlhcm0tKnBlKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9BUk0iCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCXRodW1iLSpwZSopCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfQVJNIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSAgOzsKLQlpWzMtNl04Ni0qcGUqIHwgaVszLTZdODYtKi1jeWd3aW4qIHwgaVszLTZdODYtKi1taW5ndzMyKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9JMzg2IgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSAgQlVJTERfRExMV1JBUD0nJChETExXUkFQX1BST0cpJChFWEVFWFQpJwotCSAgOzsKLQlpMy02ODYtKi1pbnRlcml4KQotCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9JMzg2IgotCSAgOzsKLQlwb3dlcnBjKi0qLSpwZSogfCBwb3dlcnBjKi0qLWN5Z3dpbiopCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfUFBDIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSAgOzsKLQltY29yZS0qcGUpCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfTUNPUkUiCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCW1jb3JlLSplbGYpCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfTUNPUkVfRUxGIgotCSAgOzsKLQllc2FjCi0gICAgZmkKLWRvbmUKLQotCi0KLQotCi0KLQotCi0KLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVEFSR0VUICIke3RhcmdldH0iCi1FT0YKLQotCi10YXJnPSR0YXJnZXQKLS4gJHNyY2Rpci8uLi9iZmQvY29uZmlnLmJmZAotaWYgdGVzdCAieCR0YXJnX3VuZGVyc2NvcmUiID0gInh5ZXMiOyB0aGVuCi0gICAgVU5ERVJTQ09SRT0xCi1lbHNlCi0gICAgVU5ERVJTQ09SRT0wCi1maQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENDQCUkQ0MlZwotcyVATERAJSRMRCVnCi1zJUBOTUAlJE5NJWcKLXMlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBETExUT09MQCUkRExMVE9PTCVnCi1zJUBBU0AlJEFTJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQFlBQ0NAJSRZQUNDJWcKLXMlQExFWEAlJExFWCVnCi1zJUBMRVhMSUJAJSRMRVhMSUIlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQExFWF9PVVRQVVRfUk9PVEAlJExFWF9PVVRQVVRfUk9PVCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEFSQCUkQVIlZwotcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKLXMlQEVYRUVYVF9GT1JfQlVJTERAJSRFWEVFWFRfRk9SX0JVSUxEJWcKLXMlQERFTUFOR0xFUl9OQU1FQCUkREVNQU5HTEVSX05BTUUlZwotcyVATkxNQ09OVl9ERUZTQCUkTkxNQ09OVl9ERUZTJWcKLXMlQEJVSUxEX05MTUNPTlZAJSRCVUlMRF9OTE1DT05WJWcKLXMlQEJVSUxEX1NSQ09OVkAlJEJVSUxEX1NSQ09OViVnCi1zJUBCVUlMRF9ETExUT09MQCUkQlVJTERfRExMVE9PTCVnCi1zJUBETExUT09MX0RFRlNAJSRETExUT09MX0RFRlMlZwotcyVAQlVJTERfV0lORFJFU0AlJEJVSUxEX1dJTkRSRVMlZwotcyVAQlVJTERfRExMV1JBUEAlJEJVSUxEX0RMTFdSQVAlZwotcyVAQlVJTERfTUlTQ0AlJEJVSUxEX01JU0MlZwotcyVAVU5ERVJTQ09SRUAlJFVOREVSU0NPUkUlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi0KLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotKikgc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlIDs7Ci1lc2FjCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWd1cmUuY29tIGIvYmludXRpbHMvY29uZmlndXJlLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk0NjNkNS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb25maWd1cmUuY29tCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotJCEKLSQhIFRoaXMgZmlsZSBjb25maWd1cmVzIGJpbnV0aWxzIGZvciB1c2Ugd2l0aCBvcGVuVk1TL0FscGhhCi0kISBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZSBkbyBub3QgaGF2ZSAvYmluL3NoCi0kISB0byBleGVjdXRlIGl0LgotJCEKLSQhIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLSQhCi0kYXJjaF9pbmR4ID0gMSArICgoZiRnZXRzeWkoIkNQVSIpLmdlLjEyOCkuYW5kLjEpICAgICAgISB2YXg9PTEsIGFscGhhPT0yCi0kYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCi0kIQotJCEKLSQhIEdlbmVyYXRlIGNvbmZpZy5oCi0kIQotJCBjcmVhdGUgW11jb25maWcuaAotLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLwotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0vKiBJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8dGltZS5oPj8gICovCi0jZGVmaW5lIEhBVkVfVElNRV9UX0lOX1RJTUVfSCAxCi0vKiBJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8c3lzL3R5cGVzLmg+PyAgKi8KLSNkZWZpbmUgSEFWRV9USU1FX1RfSU5fVFlQRVNfSCAxCi0vKiBEb2VzIDx1dGltZS5oPiBkZWZpbmUgc3RydWN0IHV0aW1idWY/ICAqLwotI2RlZmluZSBIQVZFX0dPT0RfVVRJTUVfSCAxCi0vKiBXaGV0aGVyIGZwcmludGYgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRpby5oPiBpcyBpbmNsdWRlZC4gICovCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlBSSU5URiAxCi0vKiBXaGV0aGVyIHNicmsgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDx1bmlzdGQuaD4gaXMgaW5jbHVkZWQuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSwotLyogRG8gd2UgbmVlZCB0byB1c2UgdGhlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gICovCi0vKiAjdW5kZWYgVVNFX0JJTkFSWV9GT1BFTiAqLwotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KLS8qICN1bmRlZiBIQVZFX1NCUksgMSAqLwotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1dGltZXMgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX1VUSU1FUyAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfRkNOVExfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TWVNfRklMRV9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfVU5JU1REX0ggMQotJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZWQgYGNvbmZpZy5oJyIKLSQhCi0kIQotJCEgRWRpdCBWRVJTSU9OIGluIG1ha2VmaWxlLnZtcy1pbgotJCEKLSQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zeXMkaW5wdXQgLQotICAgICAgICBbXW1ha2VmaWxlLnZtcy1pbiAvb3V0cHV0PVtdbWFrZWZpbGUudm1zCi0kREVDSwotIQotISBHZXQgVkVSU0lPTiBmcm9tIGNvbmZpZ3VyZS5pbgotIQotICAgbWZpbGUgOj0gQ1JFQVRFX0JVRkZFUigibWZpbGUiLCAiQ09ORklHVVJFLklOIik7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YobWZpbGUpLCBFTkRfT0YobWZpbGUpKTsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQU1fSU5JVF9BVVRPTUFLRShiaW51dGlscywgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7Ci0gICBFTFNFOwotICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKLSAgIEVORElGOwotCi0gICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BWRVJTSU9OQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICBDT1BZX1RFWFQodmVycyk7Ci0gICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwotICAgUVVJVAotJCAgRU9ECi0kIHdyaXRlIHN5cyRvdXRwdXQgIkNyZWF0ZWQgYG1ha2VmaWxlLnZtcyciCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWd1cmUuaW4gYi9iaW51dGlscy9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNWViNzAuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi1BQ19QUkVSRVEoMi4xMykKLUFDX0lOSVQoYXIuYykKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotCi1BTV9JTklUX0FVVE9NQUtFKGJpbnV0aWxzLCAyLjkuNSkKLQotQU1fUFJPR19MSUJUT09MCi0KLUFDX0FSR19FTkFCTEUodGFyZ2V0cywKLVsgIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9uc10sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgQUNfRVJST1IoZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCcpCi0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19FTkFCTEUoY29tbW9uYmZkbGliLAotWyAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5XSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICBBQ19NU0dfRVJST1IoW2JhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIEJGRCBjb21tb25iZmRsaWIgb3B0aW9uXSkgOzsKLWVzYWNdKWRubAotCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi1pZiB0ZXN0IC16ICIkaG9zdCIgOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCBob3N0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4pCi1maQotCi1BQ19QUk9HX0NDCi0KLUFDX1BST0dfWUFDQwotQU1fUFJPR19MRVgKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi1BTV9NQUlOVEFJTkVSX01PREUKLUFDX0VYRUVYVAotaWYgdGVzdCAtbiAiJEVYRUVYVCI7IHRoZW4KLSAgQUNfREVGSU5FKEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgsIDEsCi0JICAgIFtEb2VzIHRoZSBwbGF0Zm9ybSB1c2UgYW4gZXhlY3V0YWJsZSBzdWZmaXg/XSkKLWZpCi1BQ19ERUZJTkVfVU5RVU9URUQoRVhFQ1VUQUJMRV9TVUZGSVgsICIke0VYRUVYVH0iLAotCQkgICBbU3VmZml4IHVzZWQgZm9yIGV4ZWN1dGFibGVzLCBpZiBhbnkuXSkKLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi1IREVGSU5FUz0KLQotLiAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLUFDX1NVQlNUKEhERUZJTkVTKQotQVI9JHtBUi1hcn0KLUFDX1NVQlNUKEFSKQotQUNfUFJPR19SQU5MSUIKLUFDX1BST0dfSU5TVEFMTAotCi1CRkRfQ0NfRk9SX0JVSUxECi0KLURFTUFOR0xFUl9OQU1FPWMrK2ZpbHQKLWNhc2UgIiR7aG9zdH0iIGluCi0gICotKi1nbzMyKiB8ICotKi1tc2RvcyopCi0gICAgREVNQU5HTEVSX05BTUU9Y3h4ZmlsdAotZXNhYwotQUNfU1VCU1QoREVNQU5HTEVSX05BTUUpCi0KLUFDX0NIRUNLX0hFQURFUlMoc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHVuaXN0ZC5oIGZjbnRsLmggc3lzL2ZpbGUuaCkKLUFDX0hFQURFUl9TWVNfV0FJVAotQUNfRlVOQ19BTExPQ0EKLUFDX0NIRUNLX0ZVTkNTKHNicmsgdXRpbWVzKQotCi0jIFNvbWUgc3lzdGVtcyBoYXZlIGZyZXhwIG9ubHkgaW4gLWxtLCBub3QgaW4gLWxjLgotQUNfU0VBUkNIX0xJQlMoZnJleHAsIC1sbSkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aW1lX3QgaW4gdGltZS5oKQotQUNfQ0FDSEVfVkFMKGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaCwKLVtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHRpbWUuaD5dLCBbdGltZV90IGk7XSwKLWJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaD15ZXMsIGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaD1ubyldKQotQUNfTVNHX1JFU1VMVCgkYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oKQotaWYgdGVzdCAkYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oID0geWVzOyB0aGVuCi0gIEFDX0RFRklORShbSEFWRV9USU1FX1RfSU5fVElNRV9IXSwgMSwKLQkgICAgW0lzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDx0aW1lLmg+P10pCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRpbWVfdCBpbiBzeXMvdHlwZXMuaCkKLUFDX0NBQ0hFX1ZBTChidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oLAotW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+XSwgW3RpbWVfdCBpO10sCi1idV9jdl9kZWNsX3RpbWVfdF90eXBlc19oPXllcywgYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaD1ubyldKQotQUNfTVNHX1JFU1VMVCgkYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCkKLWlmIHRlc3QgJGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2ggPSB5ZXM7IHRoZW4KLSAgQUNfREVGSU5FKFtIQVZFX1RJTUVfVF9JTl9UWVBFU19IXSwgMSwKLQkgICAgW0lzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDxzeXMvdHlwZXMuaD4/XSkKLWZpCi0KLSMgVW5kZXIgTmV4dCAzLjIgPHV0aW1lLmg+IGFwcGFyZW50bHkgZG9lcyBub3QgZGVmaW5lIHN0cnVjdCB1dGltYnVmCi0jIGJ5IGRlZmF1bHQuCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciB1dGltZS5oXSkKLUFDX0NBQ0hFX1ZBTChidV9jdl9oZWFkZXJfdXRpbWVfaCwKLVtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfVElNRV9ICi0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dXRpbWUuaD5dLAotW3N0cnVjdCB1dGltYnVmIHM7XSwKLWJ1X2N2X2hlYWRlcl91dGltZV9oPXllcywgYnVfY3ZfaGVhZGVyX3V0aW1lX2g9bm8pXSkKLUFDX01TR19SRVNVTFQoJGJ1X2N2X2hlYWRlcl91dGltZV9oKQotaWYgdGVzdCAkYnVfY3ZfaGVhZGVyX3V0aW1lX2ggPSB5ZXM7IHRoZW4KLSAgQUNfREVGSU5FKEhBVkVfR09PRF9VVElNRV9ILCAxLCBbRG9lcyA8dXRpbWUuaD4gZGVmaW5lIHN0cnVjdCB1dGltYnVmP10pCi1maQotCi1CRkRfTkVFRF9ERUNMQVJBVElPTihmcHJpbnRmKQotQkZEX05FRURfREVDTEFSQVRJT04oc3Ryc3RyKQotQkZEX05FRURfREVDTEFSQVRJT04oc2JyaykKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGdldGVudikKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGVudmlyb24pCi0KLUJGRF9CSU5BUllfRk9QRU4KLQotIyB0YXJnZXQtc3BlY2lmaWMgc3R1ZmY6Ci0KLSMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotaWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIjsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1CVUlMRF9OTE1DT05WPQotTkxNQ09OVl9ERUZTPQotQlVJTERfU1JDT05WPQotQlVJTERfRExMVE9PTD0KLURMTFRPT0xfREVGUz0KLUJVSUxEX1dJTkRSRVM9Ci1CVUlMRF9ETExXUkFQPQotQlVJTERfTUlTQz0KLQotZm9yIHRhcmcgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cwotZG8KLSAgICBpZiB0ZXN0ICJ4JHRhcmciID0gInhhbGwiOyB0aGVuCi0gICAgICAgIGFsbF90YXJnZXRzPXRydWUKLQlCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JQlVJTERfU1JDT05WPSckKFNSQ09OVl9QUk9HKScKLQlOTE1DT05WX0RFRlM9Ii1ETkxNQ09OVl9JMzg2IC1ETkxNQ09OVl9BTFBIQSAtRE5MTUNPTlZfUE9XRVJQQyAtRE5MTUNPTlZfU1BBUkMiCi0gICAgZWxzZQotCWNhc2UgJHRhcmcgaW4KLWNoYW5nZXF1b3RlKCwpZG5sCi0JaVszNDU2XTg2Ki0qLW5ldHdhcmUqKSAKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfSTM4NiIKLQkgIDs7Ci0JYWxwaGEqLSotbmV0d2FyZSopCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX0FMUEhBIgotCSAgOzsKLQlwb3dlcnBjKi0qLW5ldHdhcmUqKQotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9QT1dFUlBDIgotCSAgOzsKLQlzcGFyYyotKi1uZXR3YXJlKikKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfU1BBUkMiCi0JICA7OwotCWVzYWMKLQljYXNlICR0YXJnIGluCi0JKi0qLWhtcyopIEJVSUxEX1NSQ09OVj0nJChTUkNPTlZfUFJPRyknIDs7Ci0JZXNhYwotCWNhc2UgJHRhcmcgaW4KLQlhcm0tKnBlKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9BUk0iCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCXRodW1iLSpwZSopCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfQVJNIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSAgOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0JaVszLTZdODYtKnBlKiB8IGlbMy02XTg2LSotY3lnd2luKiB8IGlbMy02XTg2LSotbWluZ3czMiopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfSTM4NiIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgIEJVSUxEX0RMTFdSQVA9JyQoRExMV1JBUF9QUk9HKSQoRVhFRVhUKScKLQkgIDs7Ci0JaVszLTZdODYtKi1pbnRlcml4KQotCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9JMzg2IgotCSAgOzsKLQlwb3dlcnBjKi0qLSpwZSogfCBwb3dlcnBjKi0qLWN5Z3dpbiopCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfUFBDIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSAgOzsKLQltY29yZS0qcGUpCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfTUNPUkUiCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JICA7OwotCW1jb3JlLSplbGYpCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfTUNPUkVfRUxGIgotCSAgOzsKLQllc2FjCi0gICAgZmkKLWRvbmUKLQotQUNfU1VCU1QoTkxNQ09OVl9ERUZTKQotQUNfU1VCU1QoQlVJTERfTkxNQ09OVikKLUFDX1NVQlNUKEJVSUxEX1NSQ09OVikKLUFDX1NVQlNUKEJVSUxEX0RMTFRPT0wpCi1BQ19TVUJTVChETExUT09MX0RFRlMpCi1BQ19TVUJTVChCVUlMRF9XSU5EUkVTKQotQUNfU1VCU1QoQlVJTERfRExMV1JBUCkKLUFDX1NVQlNUKEJVSUxEX01JU0MpCi0KLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVQsICIke3RhcmdldH0iLCBbQ29uZmlndXJlZCB0YXJnZXQgbmFtZS5dKQotCi10YXJnPSR0YXJnZXQKLS4gJHNyY2Rpci8uLi9iZmQvY29uZmlnLmJmZAotaWYgdGVzdCAieCR0YXJnX3VuZGVyc2NvcmUiID0gInh5ZXMiOyB0aGVuCi0gICAgVU5ERVJTQ09SRT0xCi1lbHNlCi0gICAgVU5ERVJTQ09SRT0wCi1maQotQUNfU1VCU1QoVU5ERVJTQ09SRSkKLQotQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bCi1jYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KLSopIHNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZSA7OwotZXNhYwotXSkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2N4eGZpbHQubWFuIGIvYmludXRpbHMvY3h4ZmlsdC5tYW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDVkNDUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY3h4ZmlsdC5tYW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIEBQUk9HUkFNQCAxICJKdW5lIDE5OTMiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1AUFJPR1JBTUAgXC0gZGVtYW5nbGUgQysrIHN5bWJvbHMKLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIEBQUk9HUkFNQAotLlJCICJbXHwiIFwtXyB8IFwtXC1zdHJpcC11bmRlcnNjb3JlcyAiXHxdIgotLlJCICJbXHwiICJcLXMge2dudSxsdWNpZCxhcm19ICIgfCAiIFwtXC1mb3JtYXQ9e2dudSxsdWNpZCxhcm19IiAiXHxdIgotLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iCi0uUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIKLS5SQiAiW1x8IiBzeW1ib2wgIi4uLlx8XSIKLS5TSCBERVNDUklQVElPTgotVGhlIEMrKyBsYW5ndWFnZSBwcm92aWRlcyBmdW5jdGlvbiBvdmVybG9hZGluZywgd2hpY2ggbWVhbnMgdGhhdCB5b3UgY2FuCi13cml0ZSBtYW55IGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgKHByb3ZpZGluZyBlYWNoIHRha2VzIHBhcmFtZXRlcnMKLW9mIGRpZmZlcmVudCB0eXBlcykuICBBbGwgQysrIGZ1bmN0aW9uIG5hbWVzIGFyZSBlbmNvZGVkIGludG8gYQotbG93LWxldmVsIGFzc2VtYmx5IGxhYmVsICh0aGlzIHByb2Nlc3MgaXMga25vd24gYXMKLS5JIG1hbmdsaW5nXGMKLSkuICBUaGUgCi0uQiBAUFJPR1JBTUAKLXByb2dyYW0gZG9lcyB0aGUgaW52ZXJzZSBtYXBwaW5nOiBpdCBkZWNvZGVzIChcZklkZW1hbmdsZXNcZlIpCi1sb3ctbGV2ZWwgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4ga2VlcAotdGhlc2Ugb3ZlcmxvYWRlZCBmdW5jdGlvbnMgZnJvbSBjbGFzaGluZy4KLS5QUAotRXZlcnkgYWxwaGFudW1lcmljIHdvcmQgKGNvbnNpc3Rpbmcgb2YgbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywKLWRvbGxhcnMsIG9yIHBlcmlvZHMpIHNlZW4gaW4gdGhlIGlucHV0IGlzIGEgcG90ZW50aWFsIGxhYmVsLiAgSWYgdGhlCi1sYWJlbCBkZWNvZGVzIGludG8gYSBDKysgbmFtZSwgdGhlIEMrKyBuYW1lIHJlcGxhY2VzIHRoZSBsb3ctbGV2ZWwKLW5hbWUgaW4gdGhlIG91dHB1dC4KLS5QUAotWW91IGNhbiB1c2UKLS5CIEBQUk9HUkFNQAotdG8gZGVjaXBoZXIgaW5kaXZpZHVhbCBzeW1ib2xzIGJ5IHNwZWNpZnlpbmcgdGhlc2Ugc3ltYm9scyBvbiB0aGUKLWNvbW1hbmQgbGluZS4KLS5QUAotSWYgbm8KLS5CIHN5bWJvbAotYXJndW1lbnRzIGFyZSBnaXZlbiwKLS5CIEBQUk9HUkFNQAotcmVhZHMgc3ltYm9sIG5hbWVzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0IGFuZCB3cml0ZXMgdGhlIGRlbWFuZ2xlZAotbmFtZXMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gIEFsbCByZXN1bHRzIGFyZSBwcmludGVkIG9uIHRoZSBzdGFuZGFyZAotb3V0cHV0LgotLlNIIE9QVElPTlMKLS5UUAotLkIgXC1fCi0uVFAKLS5CIFwtXC1zdHJpcFwtdW5kZXJzY29yZXMKLU9uIHNvbWUgc3lzdGVtcywgYm90aCB0aGUgQyBhbmQgQysrIGNvbXBpbGVycyBwdXQgYW4KLXVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgZXZlcnkgbmFtZS4gIEZvciBleGFtcGxlLCB0aGUgQyBuYW1lIAotLkIgZm9vCi1nZXRzIHRoZSBsb3ctbGV2ZWwgbmFtZSAKLS5CUiBfZm9vIC4KLVRoaXMgb3B0aW9uIHJlbW92ZXMgdGhlIGxlYWRpbmcgdW5kZXJzY29yZS4KLQotLlRQCi0uQiAiXC1zIHtnbnUsbHVjaWQsYXJtfSIKLS5UUAotLkIgXC1cLWZvcm1hdD17Z251LGx1Y2lkLGFybX0KLUdOVQotLkIgbm0KLWNhbiBkZWNvZGUgdGhyZWUgZGlmZmVyZW50IG1ldGhvZHMgb2YgbWFuZ2xpbmcsIHVzZWQgYnkgZGlmZmVyZW50IEMrKwotY29tcGlsZXJzLiAgVGhpcyBvcHRpb24gc2VsZWN0cyB3aGljaCBtZXRob2QgaXQgdXNlczogdGhlIG9uZSB1c2VkIGJ5Ci10aGUgR05VIGNvbXBpbGVyLCB0aGUgb25lIHVzZWQgYnkgdGhlIEx1Y2lkIGNvbXBpbGVyLCBvciB0aGUgb25lCi1zcGVjaWZpZWQgYnkgdGhlIEMrKyBBbm5vdGF0ZWQgUmVmZXJlbmNlIE1hbnVhbC4gIFRoZSBkZWZhdWx0IGlzIHRoZQotR05VIHN0eWxlLgotCi0uVFAKLS5CIFwtXC1oZWxwCi1QcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KLS5CIEBQUk9HUkFNQAotYW5kIGV4aXQuCi0KLS5UUAotLkIgXC1cLXZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgQFBST0dSQU1ACi1hbmQgZXhpdC4KLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIiAKLWVudHJ5IGluIAotLkIKLWluZm9cYwotXCY7IAotLkkKLVRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCi1cJiwgUm9sYW5kIEguIFBlc2NoIChKdW5lIDE5OTMpLgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9kZWJ1Zy5jIGIvYmludXRpbHMvZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkNDU1OS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU2NyArMCwwIEBACi0vKiBkZWJ1Zy5jIC0tIEhhbmRsZSBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIGdlbmVyaWMgZGVidWdnaW5nIGZvcm1hdC4gIFdlIG1heSBldmVudHVhbGx5Ci0gICBoYXZlIHJlYWRlcnMgd2hpY2ggY29udmVydCBkaWZmZXJlbnQgZm9ybWF0cyBpbnRvIHRoaXMgZ2VuZXJpYwotICAgZm9ybWF0LCBhbmQgd3JpdGVycyB3aGljaCB3cml0ZSBpdCBvdXQuICBUaGUgaW5pdGlhbCBpbXBldHVzIGZvcgotICAgdGhpcyB3YXMgd3JpdGluZyBhIGNvbnZlcnRvciBmcm9tIHN0YWJzIHRvIEhQIElFRUUtNjk1IGRlYnVnZ2luZwotICAgZm9ybWF0LiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi0vKiBHbG9iYWwgaW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZGVidWdnaW5nLiAgQSBwb2ludGVyIHRvIHRoaXMKLSAgIHN0cnVjdHVyZSBpcyB0aGUgZGVidWdnaW5nIGhhbmRsZSBwYXNzZWQgdG8gYWxsIHRoZSByb3V0aW5lcy4gICovCi0KLXN0cnVjdCBkZWJ1Z19oYW5kbGUKLXsKLSAgLyogQSBsaW5rZWQgbGlzdCBvZiBjb21waWxhdGlvbiB1bml0cy4gICovCi0gIHN0cnVjdCBkZWJ1Z191bml0ICp1bml0czsKLSAgLyogVGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBkZWJ1Z191bml0ICpjdXJyZW50X3VuaXQ7Ci0gIC8qIFRoZSBjdXJyZW50IHNvdXJjZSBmaWxlLiAgKi8KLSAgc3RydWN0IGRlYnVnX2ZpbGUgKmN1cnJlbnRfZmlsZTsKLSAgLyogVGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKmN1cnJlbnRfZnVuY3Rpb247Ci0gIC8qIFRoZSBjdXJyZW50IGJsb2NrLiAgKi8KLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpjdXJyZW50X2Jsb2NrOwotICAvKiBUaGUgY3VycmVudCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgdW5pdC4gICovCi0gIHN0cnVjdCBkZWJ1Z19saW5lbm8gKmN1cnJlbnRfbGluZW5vOwotICAvKiBNYXJrLiAgVGhpcyBpcyB1c2VkIGJ5IGRlYnVnX3dyaXRlLiAgKi8KLSAgdW5zaWduZWQgaW50IG1hcms7Ci0gIC8qIEEgc3RydWN0L2NsYXNzIElEIHVzZWQgYnkgZGVidWdfd3JpdGUuICAqLwotICB1bnNpZ25lZCBpbnQgY2xhc3NfaWQ7Ci0gIC8qIFRoZSBiYXNlIGZvciBjbGFzc19pZCBmb3IgdGhpcyBjYWxsIHRvIGRlYnVnX3dyaXRlLiAgKi8KLSAgdW5zaWduZWQgaW50IGJhc2VfaWQ7Ci0gIC8qIFRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGluIGRlYnVnX3dyaXRlLiAgKi8KLSAgc3RydWN0IGRlYnVnX2xpbmVubyAqY3VycmVudF93cml0ZV9saW5lbm87Ci0gIHVuc2lnbmVkIGludCBjdXJyZW50X3dyaXRlX2xpbmVub19pbmRleDsKLSAgLyogQSBsaXN0IG9mIGNsYXNzZXMgd2hpY2ggaGF2ZSBhc3NpZ25lZCBJRCdzIGR1cmluZyBkZWJ1Z193cml0ZS4KLSAgICAgVGhpcyBpcyBsaW5rZWQgdGhyb3VnaCB0aGUgbmV4dF9pZCBmaWVsZCBvZiBkZWJ1Z19jbGFzc190eXBlLiAgKi8KLSAgc3RydWN0IGRlYnVnX2NsYXNzX2lkICppZF9saXN0OwotICAvKiBBIGxpc3QgdXNlZCB0byBhdm9pZCByZWN1cnNpb24gZHVyaW5nIGRlYnVnX3R5cGVfc2FtZXAuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QgKmNvbXBhcmVfbGlzdDsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgc2luZ2xlIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdHJ1Y3QgZGVidWdfdW5pdAotewotICAvKiBUaGUgbmV4dCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGRlYnVnX3VuaXQgKm5leHQ7Ci0gIC8qIEEgbGlzdCBvZiBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuICBUaGUgZmlyc3QKLSAgICAgZmlsZSBpcyBhbHdheXMgdGhlIG1haW4gb25lLCBhbmQgdGhhdCBpcyB3aGVyZSB0aGUgbWFpbiBmaWxlIG5hbWUKLSAgICAgaXMgc3RvcmVkLiAgKi8KLSAgc3RydWN0IGRlYnVnX2ZpbGUgKmZpbGVzOwotICAvKiBMaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0LiAgVGhpcyBpcyBub3QKLSAgICAgc3RvcmVkIGJ5IGZ1bmN0aW9uLCBiZWNhdXNlIGFzc2VtYmxlciBjb2RlIG1heSBoYXZlIGxpbmUgbnVtYmVyCi0gICAgIGluZm9ybWF0aW9uIHdpdGhvdXQgZnVuY3Rpb24gaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZGVidWdfbGluZW5vICpsaW5lbm9zOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBzaW5nbGUgc291cmNlIGZpbGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfZmlsZQotewotICAvKiBUaGUgbmV4dCBzb3VyY2UgZmlsZSBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqbmV4dDsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlLiAgKi8KLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIC8qIEdsb2JhbCBmdW5jdGlvbnMsIHZhcmlhYmxlcywgdHlwZXMsIGV0Yy4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKmdsb2JhbHM7Ci19OwotCi0vKiBBIHR5cGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfdHlwZQotewotICAvKiBLaW5kIG9mIHR5cGUuICAqLwotICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotICAvKiBTaXplIG9mIHR5cGUgKDAgaWYgbm90IGtub3duKS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotICAvKiBUeXBlIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGlzIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHBvaW50ZXI7Ci0gIC8qIFRhZ2dlZCB1bmlvbiB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIERFQlVHX0tJTkRfSU5ESVJFQ1QuICAqLwotICAgICAgc3RydWN0IGRlYnVnX2luZGlyZWN0X3R5cGUgKmtpbmRpcmVjdDsKLSAgICAgIC8qIERFQlVHX0tJTkRfSU5ULiAgKi8KLSAgICAgIC8qIFdoZXRoZXIgdGhlIGludGVnZXIgaXMgdW5zaWduZWQuICAqLwotICAgICAgYm9vbGVhbiBraW50OwotICAgICAgLyogREVCVUdfS0lORF9TVFJVQ1QsIERFQlVHX0tJTkRfVU5JT04sIERFQlVHX0tJTkRfQ0xBU1MsCi0gICAgICAgICBERUJVR19LSU5EX1VOSU9OX0NMQVNTLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICprY2xhc3M7Ci0gICAgICAvKiBERUJVR19LSU5EX0VOVU0uICAqLwotICAgICAgc3RydWN0IGRlYnVnX2VudW1fdHlwZSAqa2VudW07Ci0gICAgICAvKiBERUJVR19LSU5EX1BPSU5URVIuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKmtwb2ludGVyOwotICAgICAgLyogREVCVUdfS0lORF9GVU5DVElPTi4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZSAqa2Z1bmN0aW9uOwotICAgICAgLyogREVCVUdfS0lORF9SRUZFUkVOQ0UuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKmtyZWZlcmVuY2U7Ci0gICAgICAvKiBERUJVR19LSU5EX1JBTkdFLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19yYW5nZV90eXBlICprcmFuZ2U7Ci0gICAgICAvKiBERUJVR19LSU5EX0FSUkFZLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19hcnJheV90eXBlICprYXJyYXk7Ci0gICAgICAvKiBERUJVR19LSU5EX1NFVC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfc2V0X3R5cGUgKmtzZXQ7Ci0gICAgICAvKiBERUJVR19LSU5EX09GRlNFVC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfb2Zmc2V0X3R5cGUgKmtvZmZzZXQ7Ci0gICAgICAvKiBERUJVR19LSU5EX01FVEhPRC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3R5cGUgKmttZXRob2Q7Ci0gICAgICAvKiBERUJVR19LSU5EX0NPTlNULiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICprY29uc3Q7Ci0gICAgICAvKiBERUJVR19LSU5EX1ZPTEFUSUxFLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICprdm9sYXRpbGU7Ci0gICAgICAvKiBERUJVR19LSU5EX05BTUVELCBERUJVR19LSU5EX1RBR0dFRC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZSAqa25hbWVkOwotICAgIH0gdTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGFuIGluZGlyZWN0IHR5cGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfaW5kaXJlY3RfdHlwZQotewotICAvKiBTbG90IHdoZXJlIHRoZSBmaW5hbCB0eXBlIHdpbGwgYXBwZWFyLiAgKi8KLSAgZGVidWdfdHlwZSAqc2xvdDsKLSAgLyogVGFnLiAgKi8KLSAgY29uc3QgY2hhciAqdGFnOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBzdHJ1Y3QsIHVuaW9uLCBvciBjbGFzcy4gICovCi0KLXN0cnVjdCBkZWJ1Z19jbGFzc190eXBlCi17Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmaWVsZHMuICAqLwotICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICAvKiBBIG1hcmsgZmllbGQgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cnVjdCBoYXMgYWxyZWFkeSBiZWVuCi0gICAgIHByaW50ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgbWFyazsKLSAgLyogVGhpcyBpcyB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHVubmFtZWQgc3RydWN0cyB3aGVuIHByaW50aW5nLiAgKi8KLSAgdW5zaWduZWQgaW50IGlkOwotICAvKiBUaGUgcmVtYWluaW5nIGZpZWxkcyBhcmUgb25seSB1c2VkIGZvciBERUJVR19LSU5EX0NMQVNTIGFuZAotICAgICBERUJVR19LSU5EX1VOSU9OX0NMQVNTLiAgKi8KLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGJhc2UgY2xhc3Nlcy4gICovCi0gIGRlYnVnX2Jhc2VjbGFzcyAqYmFzZWNsYXNzZXM7Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBtZXRob2RzLiAgKi8KLSAgZGVidWdfbWV0aG9kICptZXRob2RzOwotICAvKiBUaGUgdHlwZSBvZiB0aGUgY2xhc3MgcHJvdmlkaW5nIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGZvcgotICAgICB0aGlzIGNsYXNzLiAgVGhpcyBtYXkgcG9pbnQgdG8gdGhlIHR5cGUgaXRzZWxmLiAgKi8KLSAgZGVidWdfdHlwZSB2cHRyYmFzZTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGFuIGVudW0uICAqLwotCi1zdHJ1Y3QgZGVidWdfZW51bV90eXBlCi17Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBuYW1lcy4gICovCi0gIGNvbnN0IGNoYXIgKipuYW1lczsKLSAgLyogQXJyYXkgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuICAqLwotICBiZmRfc2lnbmVkX3ZtYSAqdmFsdWVzOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBmdW5jdGlvbi4gIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0bwotICAgcmVjb3JkIHRoZSBwYXJhbWV0ZXIgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZQotewotICAvKiBSZXR1cm4gdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudCB0eXBlcy4gICovCi0gIGRlYnVnX3R5cGUgKmFyZ190eXBlczsKLSAgLyogV2hldGhlciB0aGUgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLSAgYm9vbGVhbiB2YXJhcmdzOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSByYW5nZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19yYW5nZV90eXBlCi17Ci0gIC8qIFJhbmdlIGJhc2UgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogTG93ZXIgYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgLyogVXBwZXIgYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSB1cHBlcjsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGFuIGFycmF5LiAgKi8KLQotc3RydWN0IGRlYnVnX2FycmF5X3R5cGUKLXsKLSAgLyogRWxlbWVudCB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSBlbGVtZW50X3R5cGU7Ci0gIC8qIFJhbmdlIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHJhbmdlX3R5cGU7Ci0gIC8qIExvd2VyIGJvdW5kLiAgKi8KLSAgYmZkX3NpZ25lZF92bWEgbG93ZXI7Ci0gIC8qIFVwcGVyIGJvdW5kLiAgKi8KLSAgYmZkX3NpZ25lZF92bWEgdXBwZXI7Ci0gIC8qIFdoZXRoZXIgdGhpcyBhcnJheSBpcyByZWFsbHkgYSBzdHJpbmcuICAqLwotICBib29sZWFuIHN0cmluZ3A7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIHNldC4gICovCi0KLXN0cnVjdCBkZWJ1Z19zZXRfdHlwZQotewotICAvKiBCYXNlIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFdoZXRoZXIgdGhpcyBzZXQgaXMgcmVhbGx5IGEgYml0c3RyaW5nLiAgKi8KLSAgYm9vbGVhbiBiaXRzdHJpbmdwOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYW4gb2Zmc2V0IHR5cGUgKGEgYmFzZWQgcG9pbnRlcikuICAqLwotCi1zdHJ1Y3QgZGVidWdfb2Zmc2V0X3R5cGUKLXsKLSAgLyogVGhlIHR5cGUgdGhlIHBvaW50ZXIgaXMgYW4gb2Zmc2V0IGZyb20uICAqLwotICBkZWJ1Z190eXBlIGJhc2VfdHlwZTsKLSAgLyogVGhlIHR5cGUgdGhlIHBvaW50ZXIgcG9pbnRzIHRvLiAgKi8KLSAgZGVidWdfdHlwZSB0YXJnZXRfdHlwZTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGEgbWV0aG9kIHR5cGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfbWV0aG9kX3R5cGUKLXsKLSAgLyogVGhlIHJldHVybiB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgLyogVGhlIG9iamVjdCB0eXBlIHdoaWNoIHRoaXMgbWV0aG9kIGlzIGZvci4gICovCi0gIGRlYnVnX3R5cGUgZG9tYWluX3R5cGU7Ci0gIC8qIEEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgKi8KLSAgZGVidWdfdHlwZSAqYXJnX3R5cGVzOwotICAvKiBXaGV0aGVyIHRoZSBtZXRob2QgdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLSAgYm9vbGVhbiB2YXJhcmdzOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBuYW1lZCB0eXBlLiAgKi8KLQotc3RydWN0IGRlYnVnX25hbWVkX3R5cGUKLXsKLSAgLyogTmFtZS4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuYW1lOwotICAvKiBSZWFsIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci19OwotCi0vKiBBIGZpZWxkIGluIGEgc3RydWN0IG9yIHVuaW9uLiAgKi8KLQotc3RydWN0IGRlYnVnX2ZpZWxkCi17Ci0gIC8qIE5hbWUgb2YgdGhlIGZpZWxkLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVHlwZSBvZiB0aGUgZmllbGQuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgLyogVmlzaWJpbGl0eSBvZiB0aGUgZmllbGQuICAqLwotICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgLyogV2hldGhlciB0aGlzIGlzIGEgc3RhdGljIG1lbWJlci4gICovCi0gIGJvb2xlYW4gc3RhdGljX21lbWJlcjsKLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBJZiBzdGF0aWNfbWVtYmVyIGlzIGZhbHNlLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIEJpdCBwb3NpdGlvbiBvZiB0aGUgZmllbGQgaW4gdGhlIHN0cnVjdC4gICovCi0JICB1bnNpZ25lZCBpbnQgYml0cG9zOwotCSAgLyogU2l6ZSBvZiB0aGUgZmllbGQgaW4gYml0cy4gICovCi0JICB1bnNpZ25lZCBpbnQgYml0c2l6ZTsKLQl9IGY7Ci0gICAgICAvKiBJZiBzdGF0aWNfbWVtYmVyIGlzIHRydWUuICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0JfSBzOwotICAgIH0gdTsKLX07Ci0KLS8qIEEgYmFzZSBjbGFzcyBmb3IgYW4gb2JqZWN0LiAgKi8KLQotc3RydWN0IGRlYnVnX2Jhc2VjbGFzcwotewotICAvKiBUeXBlIG9mIHRoZSBiYXNlIGNsYXNzLiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gIC8qIEJpdCBwb3NpdGlvbiBvZiB0aGUgYmFzZSBjbGFzcyBpbiB0aGUgb2JqZWN0LiAgKi8KLSAgdW5zaWduZWQgaW50IGJpdHBvczsKLSAgLyogV2hldGhlciB0aGUgYmFzZSBjbGFzcyBpcyB2aXJ0dWFsLiAgKi8KLSAgYm9vbGVhbiB2aXJ0dWFsOwotICAvKiBWaXNpYmlsaXR5IG9mIHRoZSBiYXNlIGNsYXNzLiAgKi8KLSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci19OwotCi0vKiBBIG1ldGhvZCBvZiBhbiBvYmplY3QuICAqLwotCi1zdHJ1Y3QgZGVidWdfbWV0aG9kCi17Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBBIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFudHMuICAqLwotICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKip2YXJpYW50czsKLX07Ci0KLS8qIFRoZSB2YXJpYW50cyBvZiBhIG1ldGhvZCBmdW5jdGlvbiBvZiBhbiBvYmplY3QuICBUaGVzZSBpbmRpY2F0ZQotICAgd2hpY2ggbWV0aG9kIHRvIHJ1bi4gICovCi0KLXN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudAotewotICAvKiBUaGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICAqLwotICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgLyogVGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gIC8qIFRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAvKiBXaGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBjb25zdC4gICovCi0gIGJvb2xlYW4gY29uc3RwOwotICAvKiBXaGV0aGVyIHRoZSBmdW5jdGlvbiBpcyB2b2xhdGlsZS4gICovCi0gIGJvb2xlYW4gdm9sYXRpbGVwOwotICAvKiBUaGUgb2Zmc2V0IHRvIHRoZSBmdW5jdGlvbiBpbiB0aGUgdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gICovCi0gIGJmZF92bWEgdm9mZnNldDsKLSAgLyogSWYgdm9mZnNldCBpcyBWT0ZGU0VUX1NUQVRJQ19NRVRIT0QsIHRoaXMgaXMgYSBzdGF0aWMgbWV0aG9kLiAgKi8KLSNkZWZpbmUgVk9GRlNFVF9TVEFUSUNfTUVUSE9EICgoYmZkX3ZtYSkgLTEpCi0gIC8qIENvbnRleHQgb2YgYSB2aXJ0dWFsIG1ldGhvZCBmdW5jdGlvbi4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlICpjb250ZXh0OwotfTsKLQotLyogQSB2YXJpYWJsZS4gIFRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgdmFyaWFibGUgb2JqZWN0LgotICAgVGhpcyBoYXMgbm8gbmFtZTsgYSBuYW1lIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHZhcmlhYmxlIGluIGEKLSAgIGRlYnVnX25hbWUgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGRlYnVnX3ZhcmlhYmxlCi17Ci0gIC8qIEtpbmQgb2YgdmFyaWFibGUuICAqLwotICBlbnVtIGRlYnVnX3Zhcl9raW5kIGtpbmQ7Ci0gIC8qIFR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFZhbHVlLiAgVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIHVwb24ga2luZC4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogQSBmdW5jdGlvbi4gIFRoaXMgaGFzIG5vIG5hbWU7IGEgbmFtZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBmdW5jdGlvbgotICAgaW4gYSBkZWJ1Z19uYW1lIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19mdW5jdGlvbgotewotICAvKiBSZXR1cm4gdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0gIC8qIFBhcmFtZXRlciBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIgKnBhcmFtZXRlcnM7Ci0gIC8qIEJsb2NrIGluZm9ybWF0aW9uLiAgVGhlIGZpcnN0IHN0cnVjdHVyZSBvbiB0aGUgbGlzdCBpcyB0aGUgbWFpbgotICAgICBibG9jayBvZiB0aGUgZnVuY3Rpb24sIGFuZCBkZXNjcmliZXMgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGVzLiAgKi8KLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpibG9ja3M7Ci19OwotCi0vKiBBIGZ1bmN0aW9uIHBhcmFtZXRlci4gICovCi0KLXN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIKLXsKLSAgLyogTmV4dCBwYXJhbWV0ZXIuICAqLwotICBzdHJ1Y3QgZGVidWdfcGFyYW1ldGVyICpuZXh0OwotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogS2luZC4gICovCi0gIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7Ci0gIC8qIFZhbHVlIChtZWFuaW5nIGRlcGVuZHMgdXBvbiBraW5kKS4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogQSB0eXBlZCBjb25zdGFudC4gICovCi0KLXN0cnVjdCBkZWJ1Z190eXBlZF9jb25zdGFudAotewotICAvKiBUeXBlLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBWYWx1ZS4gIEZJWE1FOiBXZSBtYXkgZXZlbnR1YWxseSBuZWVkIHRvIHN1cHBvcnQgbm9uLWludGVncmFsCi0gICAgIHZhbHVlcy4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogSW5mb3JtYXRpb24gYWJvdXQgYSBibG9jayB3aXRoaW4gYSBmdW5jdGlvbi4gICovCi0KLXN0cnVjdCBkZWJ1Z19ibG9jawotewotICAvKiBOZXh0IGJsb2NrIHdpdGggdGhlIHNhbWUgcGFyZW50LiAgKi8KLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpuZXh0OwotICAvKiBQYXJlbnQgYmxvY2suICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKnBhcmVudDsKLSAgLyogTGlzdCBvZiBjaGlsZCBibG9ja3MuICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmNoaWxkcmVuOwotICAvKiBTdGFydCBhZGRyZXNzIG9mIHRoZSBibG9jay4gICovCi0gIGJmZF92bWEgc3RhcnQ7Ci0gIC8qIEVuZCBhZGRyZXNzIG9mIHRoZSBibG9jay4gICovCi0gIGJmZF92bWEgZW5kOwotICAvKiBMb2NhbCB2YXJpYWJsZXMuICAqLwotICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICpsb2NhbHM7Ci19OwotCi0vKiBMaW5lIG51bWJlciBpbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQuICBGSVhNRToKLSAgIFRoaXMgc3RydWN0dXJlIGlzIGVhc3kgdG8gY3JlYXRlLCBidXQgY2FuIGJlIHZlcnkgc3BhY2UKLSAgIGluZWZmaWNpZW50LiAgKi8KLQotc3RydWN0IGRlYnVnX2xpbmVubwotewotICAvKiBNb3JlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIGJsb2NrLiAgKi8KLSAgc3RydWN0IGRlYnVnX2xpbmVubyAqbmV4dDsKLSAgLyogU291cmNlIGZpbGUuICAqLwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqZmlsZTsKLSAgLyogTGluZSBudW1iZXJzLCB0ZXJtaW5hdGVkIGJ5IGEgLTEgb3IgdGhlIGVuZCBvZiB0aGUgYXJyYXkuICAqLwotI2RlZmluZSBERUJVR19MSU5FTk9fQ09VTlQgMTAKLSAgdW5zaWduZWQgbG9uZyBsaW5lbm9zW0RFQlVHX0xJTkVOT19DT1VOVF07Ci0gIC8qIEFkZHJlc3NlcyBmb3IgdGhlIGxpbmUgbnVtYmVycy4gICovCi0gIGJmZF92bWEgYWRkcnNbREVCVUdfTElORU5PX0NPVU5UXTsKLX07Ci0KLS8qIEEgbmFtZXNwYWNlLiAgVGhpcyBpcyBhIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBvYmplY3RzLiAgRklYTUU6IFRoaXMKLSAgIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBhIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfbmFtZXNwYWNlCi17Ci0gIC8qIExpc3Qgb2YgaXRlbXMgaW4gdGhpcyBuYW1lc3BhY2UuICAqLwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbGlzdDsKLSAgLyogUG9pbnRlciB0byB3aGVyZSB0aGUgbmV4dCBpdGVtIGluIHRoaXMgbmFtZXNwYWNlIHNob3VsZCBnby4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lICoqdGFpbDsKLX07Ci0KLS8qIEtpbmRzIG9mIG9iamVjdHMgdGhhdCBhcHBlYXIgaW4gYSBuYW1lc3BhY2UuICAqLwotCi1lbnVtIGRlYnVnX29iamVjdF9raW5kCi17Ci0gIC8qIEEgdHlwZS4gICovCi0gIERFQlVHX09CSkVDVF9UWVBFLAotICAvKiBBIHRhZ2dlZCB0eXBlIChyZWFsbHkgYSBkaWZmZXJlbnQgc29ydCBvZiBuYW1lc3BhY2UpLiAgKi8KLSAgREVCVUdfT0JKRUNUX1RBRywKLSAgLyogQSB2YXJpYWJsZS4gICovCi0gIERFQlVHX09CSkVDVF9WQVJJQUJMRSwKLSAgLyogQSBmdW5jdGlvbi4gICovCi0gIERFQlVHX09CSkVDVF9GVU5DVElPTiwKLSAgLyogQW4gaW50ZWdlciBjb25zdGFudC4gICovCi0gIERFQlVHX09CSkVDVF9JTlRfQ09OU1RBTlQsCi0gIC8qIEEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotICBERUJVR19PQkpFQ1RfRkxPQVRfQ09OU1RBTlQsCi0gIC8qIEEgdHlwZWQgY29uc3RhbnQuICAqLwotICBERUJVR19PQkpFQ1RfVFlQRURfQ09OU1RBTlQKLX07Ci0KLS8qIExpbmthZ2Ugb2YgYW4gb2JqZWN0IHRoYXQgYXBwZWFycyBpbiBhIG5hbWVzcGFjZS4gICovCi0KLWVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UKLXsKLSAgLyogTG9jYWwgdmFyaWFibGUuICAqLwotICBERUJVR19MSU5LQUdFX0FVVE9NQVRJQywKLSAgLyogU3RhdGljLS1laXRoZXIgZmlsZSBzdGF0aWMgb3IgZnVuY3Rpb24gc3RhdGljLCBkZXBlbmRpbmcgdXBvbiB0aGUKLSAgICAgbmFtZXNwYWNlIGlzLiAgKi8KLSAgREVCVUdfTElOS0FHRV9TVEFUSUMsCi0gIC8qIEdsb2JhbC4gICovCi0gIERFQlVHX0xJTktBR0VfR0xPQkFMLAotICAvKiBObyBsaW5rYWdlLiAgKi8KLSAgREVCVUdfTElOS0FHRV9OT05FCi19OwotCi0vKiBBIG5hbWUgaW4gYSBuYW1lc3BhY2UuICAqLwotCi1zdHJ1Y3QgZGVidWdfbmFtZQotewotICAvKiBOZXh0IG5hbWUgaW4gdGhpcyBuYW1lc3BhY2UuICAqLwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbmV4dDsKLSAgLyogTmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIE1hcmsuICBUaGlzIGlzIHVzZWQgYnkgZGVidWdfd3JpdGUuICAqLwotICB1bnNpZ25lZCBpbnQgbWFyazsKLSAgLyogS2luZCBvZiBvYmplY3QuICAqLwotICBlbnVtIGRlYnVnX29iamVjdF9raW5kIGtpbmQ7Ci0gIC8qIExpbmthZ2Ugb2Ygb2JqZWN0LiAgKi8KLSAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSBsaW5rYWdlOwotICAvKiBUYWdnZWQgdW5pb24gd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIERFQlVHX09CSkVDVF9UWVBFLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOwotICAgICAgLyogREVCVUdfT0JKRUNUX1RBRy4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdGFnOwotICAgICAgLyogREVCVUdfT0JKRUNUX1ZBUklBQkxFLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z192YXJpYWJsZSAqdmFyaWFibGU7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfRlVOQ1RJT04uICAqLwotICAgICAgc3RydWN0IGRlYnVnX2Z1bmN0aW9uICpmdW5jdGlvbjsKLSAgICAgIC8qIERFQlVHX09CSkVDVF9JTlRfQ09OU1RBTlQuICAqLwotICAgICAgYmZkX3ZtYSBpbnRfY29uc3RhbnQ7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfRkxPQVRfQ09OU1RBTlQuICAqLwotICAgICAgZG91YmxlIGZsb2F0X2NvbnN0YW50OwotICAgICAgLyogREVCVUdfT0JKRUNUX1RZUEVEX0NPTlNUQU5ULiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlZF9jb25zdGFudCAqdHlwZWRfY29uc3RhbnQ7Ci0gICAgfSB1OwotfTsKLQotLyogRHVyaW5nIGRlYnVnX3dyaXRlLCBhIGxpbmtlZCBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgdXNlZCB0bwotICAga2VlcCB0cmFjayBvZiBJRCBudW1iZXJzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGNsYXNzZXMuICAqLwotCi1zdHJ1Y3QgZGVidWdfY2xhc3NfaWQKLXsKLSAgLyogTmV4dCBJRCBudW1iZXIuICAqLwotICBzdHJ1Y3QgZGVidWdfY2xhc3NfaWQgKm5leHQ7Ci0gIC8qIFRoZSB0eXBlIHdpdGggdGhlIElELiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gIC8qIFRoZSB0YWc7IE5VTEwgaWYgbm8gdGFnLiAgKi8KLSAgY29uc3QgY2hhciAqdGFnOwotfTsKLQotLyogRHVyaW5nIGRlYnVnX3R5cGVfc2FtZXAsIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyBrZXB0Ci0gICBvbiB0aGUgc3RhY2sgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uLiAgKi8KLQotc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0Ci17Ci0gIC8qIE5leHQgdHlwZSBvbiBsaXN0LiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0ICpuZXh0OwotICAvKiBUaGUgdHlwZXMgd2UgYXJlIGNvbXBhcmluZy4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlICp0MTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQyOwotfTsKLQotLyogRHVyaW5nIGRlYnVnX2dldF9yZWFsX3R5cGUsIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcwotICAga2VwdCBvbiB0aGUgc3RhY2sgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uLiAgKi8KLQotc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0Ci17Ci0gIC8qIE5leHQgdHlwZSBvbiBsaXN0LiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0ICpuZXh0OwotICAvKiBUaGUgdHlwZSB3ZSBhcmUgY2hlY2tpbmcuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLX07Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIGRlYnVnX2Vycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBkZWJ1Z19uYW1lICpkZWJ1Z19hZGRfdG9fbmFtZXNwYWNlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqKiwgY29uc3QgY2hhciAqLAotCSAgIGVudW0gZGVidWdfb2JqZWN0X2tpbmQsIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UpKTsKLXN0YXRpYyBzdHJ1Y3QgZGVidWdfbmFtZSAqZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX29iamVjdF9raW5kLAotCSAgIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UpKTsKLXN0YXRpYyBzdHJ1Y3QgZGVidWdfdHlwZSAqZGVidWdfbWFrZV90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgZW51bSBkZWJ1Z190eXBlX2tpbmQsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHN0cnVjdCBkZWJ1Z190eXBlICpkZWJ1Z19nZXRfcmVhbF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX25hbWUKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKLQkgICBzdHJ1Y3QgZGVidWdfbmFtZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCi0JICAgc3RydWN0IGRlYnVnX3R5cGUgKiwgc3RydWN0IGRlYnVnX25hbWUgKikpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfd3JpdGVfY2xhc3NfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAotCSAgIHN0cnVjdCBkZWJ1Z190eXBlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfd3JpdGVfZnVuY3Rpb24KLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKLQkgICBjb25zdCBjaGFyICosIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UsIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV9ibG9jawotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAotCSAgIHN0cnVjdCBkZWJ1Z19ibG9jayAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV9saW5lbm9zCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCi0JICAgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfc2V0X2NsYXNzX2lkCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGVidWdfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z190eXBlX3NhbWVwCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgc3RydWN0IGRlYnVnX3R5cGUgKiwgc3RydWN0IGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfY2xhc3NfdHlwZV9zYW1lcAotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIHN0cnVjdCBkZWJ1Z190eXBlICosIHN0cnVjdCBkZWJ1Z190eXBlICopKTsKLQwKLS8qIElzc3VlIGFuIGVycm9yIG1lc3NhZ2UuICAqLwotCi1zdGF0aWMgdm9pZAotZGVidWdfZXJyb3IgKG1lc3NhZ2UpCi0gICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBtZXNzYWdlKTsKLX0KLQotLyogQWRkIGFuIG9iamVjdCB0byBhIG5hbWVzcGFjZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZGVidWdfbmFtZSAqCi1kZWJ1Z19hZGRfdG9fbmFtZXNwYWNlIChpbmZvLCBuc3AsIG5hbWUsIGtpbmQsIGxpbmthZ2UpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqKm5zcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z19vYmplY3Rfa2luZCBraW5kOwotICAgICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICpuczsKLQotICBuID0gKHN0cnVjdCBkZWJ1Z19uYW1lICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG1lbXNldCAobiwgMCwgc2l6ZW9mICpuKTsKLQotICBuLT5uYW1lID0gbmFtZTsKLSAgbi0+a2luZCA9IGtpbmQ7Ci0gIG4tPmxpbmthZ2UgPSBsaW5rYWdlOwotCi0gIG5zID0gKm5zcDsKLSAgaWYgKG5zID09IE5VTEwpCi0gICAgewotICAgICAgbnMgPSAoc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqKSB4bWFsbG9jIChzaXplb2YgKm5zKTsKLSAgICAgIG1lbXNldCAobnMsIDAsIHNpemVvZiAqbnMpOwotCi0gICAgICBucy0+dGFpbCA9ICZucy0+bGlzdDsKLQotICAgICAgKm5zcCA9IG5zOwotICAgIH0KLQotICAqbnMtPnRhaWwgPSBuOwotICBucy0+dGFpbCA9ICZuLT5uZXh0OwotCi0gIHJldHVybiBuOwotfQotCi0vKiBBZGQgYW4gb2JqZWN0IHRvIHRoZSBjdXJyZW50IG5hbWVzcGFjZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZGVidWdfbmFtZSAqCi1kZWJ1Z19hZGRfdG9fY3VycmVudF9uYW1lc3BhY2UgKGluZm8sIG5hbWUsIGtpbmQsIGxpbmthZ2UpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfb2JqZWN0X2tpbmQga2luZDsKLSAgICAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSBsaW5rYWdlOwotewotICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICoqbnNwOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZTogbm8gY3VycmVudCBmaWxlIikpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5jdXJyZW50X2Jsb2NrICE9IE5VTEwpCi0gICAgbnNwID0gJmluZm8tPmN1cnJlbnRfYmxvY2stPmxvY2FsczsKLSAgZWxzZQotICAgIG5zcCA9ICZpbmZvLT5jdXJyZW50X2ZpbGUtPmdsb2JhbHM7Ci0KLSAgcmV0dXJuIGRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sIG5zcCwgbmFtZSwga2luZCwgbGlua2FnZSk7Ci19Ci0MCi0vKiBSZXR1cm4gYSBoYW5kbGUgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLVBUUgotZGVidWdfaW5pdCAoKQotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICpyZXQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpyZXQpOwotICBtZW1zZXQgKHJldCwgMCwgc2l6ZW9mICpyZXQpOwotICByZXR1cm4gKFBUUikgcmV0OwotfQotCi0vKiBTZXQgdGhlIHNvdXJjZSBmaWxlbmFtZS4gIFRoaXMgaW1wbGljaXRseSBzdGFydHMgYSBuZXcgY29tcGlsYXRpb24KLSAgIHVuaXQuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19zZXRfZmlsZW5hbWUgKGhhbmRsZSwgbmFtZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX2ZpbGUgKm5maWxlOwotICBzdHJ1Y3QgZGVidWdfdW5pdCAqbnVuaXQ7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICBuYW1lID0gIiI7Ci0KLSAgbmZpbGUgPSAoc3RydWN0IGRlYnVnX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpuZmlsZSk7Ci0gIG1lbXNldCAobmZpbGUsIDAsIHNpemVvZiAqbmZpbGUpOwotCi0gIG5maWxlLT5maWxlbmFtZSA9IG5hbWU7Ci0KLSAgbnVuaXQgPSAoc3RydWN0IGRlYnVnX3VuaXQgKikgeG1hbGxvYyAoc2l6ZW9mICpudW5pdCk7Ci0gIG1lbXNldCAobnVuaXQsIDAsIHNpemVvZiAqbnVuaXQpOwotCi0gIG51bml0LT5maWxlcyA9IG5maWxlOwotICBpbmZvLT5jdXJyZW50X2ZpbGUgPSBuZmlsZTsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ICE9IE5VTEwpCi0gICAgaW5mby0+Y3VycmVudF91bml0LT5uZXh0ID0gbnVuaXQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc3NlcnQgKGluZm8tPnVuaXRzID09IE5VTEwpOwotICAgICAgaW5mby0+dW5pdHMgPSBudW5pdDsKLSAgICB9Ci0KLSAgaW5mby0+Y3VycmVudF91bml0ID0gbnVuaXQ7Ci0KLSAgaW5mby0+Y3VycmVudF9mdW5jdGlvbiA9IE5VTEw7Ci0gIGluZm8tPmN1cnJlbnRfYmxvY2sgPSBOVUxMOwotICBpbmZvLT5jdXJyZW50X2xpbmVubyA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoYW5nZSBzb3VyY2UgZmlsZXMgdG8gdGhlIGdpdmVuIGZpbGUgbmFtZS4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIGluY2x1ZGUgZmlsZXMgaW4gYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3N0YXJ0X3NvdXJjZSAoaGFuZGxlLCBuYW1lKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqZiwgKipwZjsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIG5hbWUgPSAiIjsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3N0YXJ0X3NvdXJjZTogbm8gZGVidWdfc2V0X2ZpbGVuYW1lIGNhbGwiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGZvciAoZiA9IGluZm8tPmN1cnJlbnRfdW5pdC0+ZmlsZXM7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmZpbGVuYW1lWzBdID09IG5hbWVbMF0KLQkgICYmIGYtPmZpbGVuYW1lWzFdID09IG5hbWVbMV0KLQkgICYmIHN0cmNtcCAoZi0+ZmlsZW5hbWUsIG5hbWUpID09IDApCi0JewotCSAgaW5mby0+Y3VycmVudF9maWxlID0gZjsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgZiA9IChzdHJ1Y3QgZGVidWdfZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKmYpOwotICBtZW1zZXQgKGYsIDAsIHNpemVvZiAqZik7Ci0KLSAgZi0+ZmlsZW5hbWUgPSBuYW1lOwotCi0gIGZvciAocGYgPSAmaW5mby0+Y3VycmVudF9maWxlLT5uZXh0OwotICAgICAgICpwZiAhPSBOVUxMOwotICAgICAgIHBmID0gJigqcGYpLT5uZXh0KQotICAgIDsKLSAgKnBmID0gZjsKLQotICBpbmZvLT5jdXJyZW50X2ZpbGUgPSBmOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhpcyBpbXBsaWNpdGx5IHN0YXJ0cyBhIGZ1bmN0aW9uCi0gICBibG9jay4gIFRoZSBkZWJ1Z190eXBlIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUuCi0gICBUaGUgYm9vbGVhbiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZnVuY3Rpb24gaXMgZ2xvYmFsbHkgdmlzaWJsZS4KLSAgIFRoZSBiZmRfdm1hIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICBDdXJyZW50bHkKLSAgIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIHNwZWNpZmllZCBieSBjYWxscyB0bwotICAgZGVidWdfcmVjb3JkX3BhcmFtZXRlci4gIEZJWE1FOiBUaGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSBuZXN0ZWQKLSAgIGZ1bmN0aW9ucy4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9mdW5jdGlvbiAoaGFuZGxlLCBuYW1lLCByZXR1cm5fdHlwZSwgZ2xvYmFsLCBhZGRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHJldHVybl90eXBlOwotICAgICBib29sZWFuIGdsb2JhbDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKmY7Ci0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqYjsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICBuYW1lID0gIiI7Ci0gIGlmIChyZXR1cm5fdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF9mdW5jdGlvbjogbm8gZGVidWdfc2V0X2ZpbGVuYW1lIGNhbGwiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGYgPSAoc3RydWN0IGRlYnVnX2Z1bmN0aW9uICopIHhtYWxsb2MgKHNpemVvZiAqZik7Ci0gIG1lbXNldCAoZiwgMCwgc2l6ZW9mICpmKTsKLQotICBmLT5yZXR1cm5fdHlwZSA9IHJldHVybl90eXBlOwotCi0gIGIgPSAoc3RydWN0IGRlYnVnX2Jsb2NrICopIHhtYWxsb2MgKHNpemVvZiAqYik7Ci0gIG1lbXNldCAoYiwgMCwgc2l6ZW9mICpiKTsKLQotICBiLT5zdGFydCA9IGFkZHI7Ci0gIGItPmVuZCA9IChiZmRfdm1hKSAtMTsKLQotICBmLT5ibG9ja3MgPSBiOwotCi0gIGluZm8tPmN1cnJlbnRfZnVuY3Rpb24gPSBmOwotICBpbmZvLT5jdXJyZW50X2Jsb2NrID0gYjsKLQotICAvKiBGSVhNRTogSWYgd2UgY291bGQgaGFuZGxlIG5lc3RlZCBmdW5jdGlvbnMsIHRoaXMgd291bGQgYmUgdGhlCi0gICAgIHBsYWNlOiB3ZSB3b3VsZCB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBuYW1lc3BhY2UuICAqLwotICBuID0gZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywKLQkJCSAgICAgICZpbmZvLT5jdXJyZW50X2ZpbGUtPmdsb2JhbHMsCi0JCQkgICAgICBuYW1lLAotCQkJICAgICAgREVCVUdfT0JKRUNUX0ZVTkNUSU9OLAotCQkJICAgICAgKGdsb2JhbAotCQkJICAgICAgID8gREVCVUdfTElOS0FHRV9HTE9CQUwKLQkJCSAgICAgICA6IERFQlVHX0xJTktBR0VfU1RBVElDKSk7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG4tPnUuZnVuY3Rpb24gPSBmOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSBwYXJhbWV0ZXIgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLQotYm9vbGVhbgotZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoaGFuZGxlLCBuYW1lLCB0eXBlLCBraW5kLCB2YWwpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgZW51bSBkZWJ1Z19wYXJtX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIgKnAsICoqcHA7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9mdW5jdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyOiBubyBjdXJyZW50IGZ1bmN0aW9uIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBwID0gKHN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIgKikgeG1hbGxvYyAoc2l6ZW9mICpwKTsKLSAgbWVtc2V0IChwLCAwLCBzaXplb2YgKnApOwotCi0gIHAtPm5hbWUgPSBuYW1lOwotICBwLT50eXBlID0gdHlwZTsKLSAgcC0+a2luZCA9IGtpbmQ7Ci0gIHAtPnZhbCA9IHZhbDsKLQotICBmb3IgKHBwID0gJmluZm8tPmN1cnJlbnRfZnVuY3Rpb24tPnBhcmFtZXRlcnM7Ci0gICAgICAgKnBwICE9IE5VTEw7Ci0gICAgICAgcHAgPSAmKCpwcCktPm5leHQpCi0gICAgOwotICAqcHAgPSBwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBFbmQgYSBmdW5jdGlvbi4gIEZJWE1FOiBUaGlzIHNob3VsZCBoYW5kbGUgZnVuY3Rpb24gbmVzdGluZy4gICovCi0KLWJvb2xlYW4KLWRlYnVnX2VuZF9mdW5jdGlvbiAoaGFuZGxlLCBhZGRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2Jsb2NrID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfZnVuY3Rpb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZW5kX2Z1bmN0aW9uOiBubyBjdXJyZW50IGZ1bmN0aW9uIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoaW5mby0+Y3VycmVudF9ibG9jay0+cGFyZW50ICE9IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX2VuZF9mdW5jdGlvbjogc29tZSBibG9ja3Mgd2VyZSBub3QgY2xvc2VkIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLT5jdXJyZW50X2Jsb2NrLT5lbmQgPSBhZGRyOwotCi0gIGluZm8tPmN1cnJlbnRfZnVuY3Rpb24gPSBOVUxMOwotICBpbmZvLT5jdXJyZW50X2Jsb2NrID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYSBibG9jayBpbiBhIGZ1bmN0aW9uLiAgQWxsIGxvY2FsIGluZm9ybWF0aW9uIHdpbGwgYmUKLSAgIHJlY29yZGVkIGluIHRoaXMgYmxvY2ssIHVudGlsIHRoZSBtYXRjaGluZyBjYWxsIHRvIGRlYnVnX2VuZF9ibG9jay4KLSAgIGRlYnVnX3N0YXJ0X2Jsb2NrIGFuZCBkZWJ1Z19lbmRfYmxvY2sgbWF5IGJlIG5lc3RlZC4gIFRoZSBiZmRfdm1hCi0gICBhcmd1bWVudCBpcyB0aGUgYWRkcmVzcyBhdCB3aGljaCB0aGlzIGJsb2NrIHN0YXJ0cy4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3N0YXJ0X2Jsb2NrIChoYW5kbGUsIGFkZHIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpiLCAqKnBiOwotCi0gIC8qIFdlIG11c3QgYWx3YXlzIGhhdmUgYSBjdXJyZW50IGJsb2NrOiBkZWJ1Z19yZWNvcmRfZnVuY3Rpb24gc2V0cwotICAgICBvbmUgdXAuICAqLwotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfYmxvY2sgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfc3RhcnRfYmxvY2s6IG5vIGN1cnJlbnQgYmxvY2siKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGIgPSAoc3RydWN0IGRlYnVnX2Jsb2NrICopIHhtYWxsb2MgKHNpemVvZiAqYik7Ci0gIG1lbXNldCAoYiwgMCwgc2l6ZW9mICpiKTsKLQotICBiLT5wYXJlbnQgPSBpbmZvLT5jdXJyZW50X2Jsb2NrOwotICBiLT5zdGFydCA9IGFkZHI7Ci0gIGItPmVuZCA9IChiZmRfdm1hKSAtMTsKLQotICAvKiBUaGlzIG5ldyBibG9jayBpcyBhIGNoaWxkIG9mIHRoZSBjdXJyZW50IGJsb2NrLiAgKi8KLSAgZm9yIChwYiA9ICZpbmZvLT5jdXJyZW50X2Jsb2NrLT5jaGlsZHJlbjsKLSAgICAgICAqcGIgIT0gTlVMTDsKLSAgICAgICBwYiA9ICYoKnBiKS0+bmV4dCkKLSAgICA7Ci0gICpwYiA9IGI7Ci0KLSAgaW5mby0+Y3VycmVudF9ibG9jayA9IGI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCBhIGJsb2NrIGluIGEgZnVuY3Rpb24uICBUaGlzIG1hdGNoZXMgdGhlIGNhbGwgdG8KLSAgIGRlYnVnX3N0YXJ0X2Jsb2NrLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoaXMgYmxvY2sKLSAgIGVuZHMuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19lbmRfYmxvY2sgKGhhbmRsZSwgYWRkcikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKnBhcmVudDsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfYmxvY2sgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZW5kX2Jsb2NrOiBubyBjdXJyZW50IGJsb2NrIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBwYXJlbnQgPSBpbmZvLT5jdXJyZW50X2Jsb2NrLT5wYXJlbnQ7Ci0gIGlmIChwYXJlbnQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZW5kX2Jsb2NrOiBhdHRlbXB0IHRvIGNsb3NlIHRvcCBsZXZlbCBibG9jayIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mby0+Y3VycmVudF9ibG9jay0+ZW5kID0gYWRkcjsKLQotICBpbmZvLT5jdXJyZW50X2Jsb2NrID0gcGFyZW50OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBc3NvY2lhdGUgYSBsaW5lIG51bWJlciBpbiB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSBhbmQgZnVuY3Rpb24KLSAgIHdpdGggYSBnaXZlbiBhZGRyZXNzLiAgKi8KLQotYm9vbGVhbgotZGVidWdfcmVjb3JkX2xpbmUgKGhhbmRsZSwgbGluZW5vLCBhZGRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICB1bnNpZ25lZCBsb25nIGxpbmVubzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfbGluZW5vICpsOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF9saW5lOiBubyBjdXJyZW50IHVuaXQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGwgPSBpbmZvLT5jdXJyZW50X2xpbmVubzsKLSAgaWYgKGwgIT0gTlVMTCAmJiBsLT5maWxlID09IGluZm8tPmN1cnJlbnRfZmlsZSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgREVCVUdfTElORU5PX0NPVU5UOyBpKyspCi0JewotCSAgaWYgKGwtPmxpbmVub3NbaV0gPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotCSAgICB7Ci0JICAgICAgbC0+bGluZW5vc1tpXSA9IGxpbmVubzsKLQkgICAgICBsLT5hZGRyc1tpXSA9IGFkZHI7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGdldCBoZXJlLCB0aGVuIGVpdGhlciAxKSB0aGVyZSBpcyBubyBjdXJyZW50X2xpbmVubwotICAgICBzdHJ1Y3R1cmUsIHdoaWNoIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0IGxpbmUgbnVtYmVyIGluIHRoaXMKLSAgICAgY29tcGlsYXRpb24gdW5pdCwgMikgdGhlIGN1cnJlbnRfbGluZW5vIHN0cnVjdHVyZSBpcyBmb3IgYQotICAgICBkaWZmZXJlbnQgZmlsZSwgb3IgMykgdGhlIGN1cnJlbnRfbGluZW5vIHN0cnVjdHVyZSBpcyBmdWxsLgotICAgICBSZWdhcmRsZXNzLCB3ZSB3YW50IHRvIGFsbG9jYXRlIGEgbmV3IGRlYnVnX2xpbmVubyBzdHJ1Y3R1cmUsIHB1dAotICAgICBpdCBpbiB0aGUgcmlnaHQgcGxhY2UsIGFuZCBtYWtlIGl0IHRoZSBuZXcgY3VycmVudF9saW5lbm8KLSAgICAgc3RydWN0dXJlLiAgKi8KLQotICBsID0gKHN0cnVjdCBkZWJ1Z19saW5lbm8gKikgeG1hbGxvYyAoc2l6ZW9mICpsKTsKLSAgbWVtc2V0IChsLCAwLCBzaXplb2YgKmwpOwotCi0gIGwtPmZpbGUgPSBpbmZvLT5jdXJyZW50X2ZpbGU7Ci0gIGwtPmxpbmVub3NbMF0gPSBsaW5lbm87Ci0gIGwtPmFkZHJzWzBdID0gYWRkcjsKLSAgZm9yIChpID0gMTsgaSA8IERFQlVHX0xJTkVOT19DT1VOVDsgaSsrKQotICAgIGwtPmxpbmVub3NbaV0gPSAodW5zaWduZWQgbG9uZykgLTE7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfbGluZW5vICE9IE5VTEwpCi0gICAgaW5mby0+Y3VycmVudF9saW5lbm8tPm5leHQgPSBsOwotICBlbHNlCi0gICAgaW5mby0+Y3VycmVudF91bml0LT5saW5lbm9zID0gbDsKLQotICBpbmZvLT5jdXJyZW50X2xpbmVubyA9IGw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgbmFtZWQgY29tbW9uIGJsb2NrLiAgVGhpcyBpcyBhIGJsb2NrIG9mIHZhcmlhYmxlcyB0aGF0IG1heQotICAgbW92ZSBpbiBtZW1vcnkuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19zdGFydF9jb21tb25fYmxvY2sgKGhhbmRsZSwgbmFtZSkKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qIEZJWE1FICovCi0gIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19zdGFydF9jb21tb25fYmxvY2s6IG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBFbmQgYSBuYW1lZCBjb21tb24gYmxvY2suICAqLwotCi1ib29sZWFuCi1kZWJ1Z19lbmRfY29tbW9uX2Jsb2NrIChoYW5kbGUsIG5hbWUpCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBGSVhNRSAqLwotICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZW5kX2NvbW1vbl9ibG9jazogbm90IGltcGxlbWVudGVkIikpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlY29yZCBhIG5hbWVkIGludGVnZXIgY29uc3RhbnQuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfaW50X2NvbnN0IChoYW5kbGUsIG5hbWUsIHZhbCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG4gPSBkZWJ1Z19hZGRfdG9fY3VycmVudF9uYW1lc3BhY2UgKGluZm8sIG5hbWUsIERFQlVHX09CSkVDVF9JTlRfQ09OU1RBTlQsCi0JCQkJICAgICAgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbi0+dS5pbnRfY29uc3RhbnQgPSB2YWw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlY29yZCBhIG5hbWVkIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLQotYm9vbGVhbgotZGVidWdfcmVjb3JkX2Zsb2F0X2NvbnN0IChoYW5kbGUsIG5hbWUsIHZhbCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZG91YmxlIHZhbDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbiA9IGRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZSAoaW5mbywgbmFtZSwgREVCVUdfT0JKRUNUX0ZMT0FUX0NPTlNUQU5ULAotCQkJCSAgICAgIERFQlVHX0xJTktBR0VfTk9ORSk7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG4tPnUuZmxvYXRfY29uc3RhbnQgPSB2YWw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlY29yZCBhIHR5cGVkIGNvbnN0YW50IHdpdGggYW4gaW50ZWdyYWwgdmFsdWUuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfdHlwZWRfY29uc3QgKGhhbmRsZSwgbmFtZSwgdHlwZSwgdmFsKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLSAgc3RydWN0IGRlYnVnX3R5cGVkX2NvbnN0YW50ICp0YzsKLQotICBpZiAobmFtZSA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbiA9IGRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZSAoaW5mbywgbmFtZSwgREVCVUdfT0JKRUNUX1RZUEVEX0NPTlNUQU5ULAotCQkJCSAgICAgIERFQlVHX0xJTktBR0VfTk9ORSk7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHRjID0gKHN0cnVjdCBkZWJ1Z190eXBlZF9jb25zdGFudCAqKSB4bWFsbG9jIChzaXplb2YgKnRjKTsKLSAgbWVtc2V0ICh0YywgMCwgc2l6ZW9mICp0Yyk7Ci0KLSAgdGMtPnR5cGUgPSB0eXBlOwotICB0Yy0+dmFsID0gdmFsOwotCi0gIG4tPnUudHlwZWRfY29uc3RhbnQgPSB0YzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgbGFiZWwuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfbGFiZWwgKGhhbmRsZSwgbmFtZSwgdHlwZSwgYWRkcikKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIGFkZHIgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogRklYTUUuICAqLwotICBkZWJ1Z19lcnJvciAoXygiZGVidWdfcmVjb3JkX2xhYmVsIG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWNvcmQgYSB2YXJpYWJsZS4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF92YXJpYWJsZSAoaGFuZGxlLCBuYW1lLCB0eXBlLCBraW5kLCB2YWwpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqKm5zcDsKLSAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSBsaW5rYWdlOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLSAgc3RydWN0IGRlYnVnX3ZhcmlhYmxlICp2OwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfdmFyaWFibGU6IG5vIGN1cnJlbnQgZmlsZSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGtpbmQgPT0gREVCVUdfR0xPQkFMIHx8IGtpbmQgPT0gREVCVUdfU1RBVElDKQotICAgIHsKLSAgICAgIG5zcCA9ICZpbmZvLT5jdXJyZW50X2ZpbGUtPmdsb2JhbHM7Ci0gICAgICBpZiAoa2luZCA9PSBERUJVR19HTE9CQUwpCi0JbGlua2FnZSA9IERFQlVHX0xJTktBR0VfR0xPQkFMOwotICAgICAgZWxzZQotCWxpbmthZ2UgPSBERUJVR19MSU5LQUdFX1NUQVRJQzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaW5mby0+Y3VycmVudF9ibG9jayA9PSBOVUxMKQotCXsKLQkgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfdmFyaWFibGU6IG5vIGN1cnJlbnQgYmxvY2siKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbnNwID0gJmluZm8tPmN1cnJlbnRfYmxvY2stPmxvY2FsczsKLSAgICAgIGxpbmthZ2UgPSBERUJVR19MSU5LQUdFX0FVVE9NQVRJQzsKLSAgICB9Ci0KLSAgbiA9IGRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sIG5zcCwgbmFtZSwgREVCVUdfT0JKRUNUX1ZBUklBQkxFLCBsaW5rYWdlKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdiA9IChzdHJ1Y3QgZGVidWdfdmFyaWFibGUgKikgeG1hbGxvYyAoc2l6ZW9mICp2KTsKLSAgbWVtc2V0ICh2LCAwLCBzaXplb2YgKnYpOwotCi0gIHYtPmtpbmQgPSBraW5kOwotICB2LT50eXBlID0gdHlwZTsKLSAgdi0+dmFsID0gdmFsOwotCi0gIG4tPnUudmFyaWFibGUgPSB2OwotCi0gIHJldHVybiB0cnVlOyAgCi19Ci0KLS8qIE1ha2UgYSB0eXBlIHdpdGggYSBnaXZlbiBraW5kIGFuZCBzaXplLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgc3RydWN0IGRlYnVnX3R5cGUgKgotZGVidWdfbWFrZV90eXBlIChpbmZvLCBraW5kLCBzaXplKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICB0ID0gKHN0cnVjdCBkZWJ1Z190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqdCk7Ci0gIG1lbXNldCAodCwgMCwgc2l6ZW9mICp0KTsKLQotICB0LT5raW5kID0ga2luZDsKLSAgdC0+c2l6ZSA9IHNpemU7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYW4gaW5kaXJlY3QgdHlwZSB3aGljaCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBhIHR5cGUKLSAgIHdoaWNoIGlzIHJlZmVyZW5jZWQgYmVmb3JlIGl0IGlzIGRlZmluZWQuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGhhbmRsZSwgc2xvdCwgdGFnKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlICpzbG90OwotICAgICBjb25zdCBjaGFyICp0YWc7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfaW5kaXJlY3RfdHlwZSAqaTsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0lORElSRUNULCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGkgPSAoc3RydWN0IGRlYnVnX2luZGlyZWN0X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICppKTsKLSAgbWVtc2V0IChpLCAwLCBzaXplb2YgKmkpOwotCi0gIGktPnNsb3QgPSBzbG90OwotICBpLT50YWcgPSB0YWc7Ci0KLSAgdC0+dS5raW5kaXJlY3QgPSBpOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgdm9pZCB0eXBlLiAgVGhlcmUgaXMgb25seSBvbmUgb2YgdGhlc2UuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoaGFuZGxlKQotICAgICBQVFIgaGFuZGxlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfVk9JRCwgMCk7Ci19Ci0KLS8qIE1ha2UgYW4gaW50ZWdlciB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gIFRoZSBib29sZWFuIGFyZ3VtZW50IGlzIHRydWUKLSAgIGlmIHRoZSBpbnRlZ2VyIGlzIHVuc2lnbmVkLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9pbnRfdHlwZSAoaGFuZGxlLCBzaXplLCB1bnNpZ25lZHApCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHVuc2lnbmVkcDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9JTlQsIHNpemUpOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdC0+dS5raW50ID0gdW5zaWduZWRwOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgZmxvYXRpbmcgcG9pbnQgdHlwZSBvZiBhIGdpdmVuIHNpemUuICBGSVhNRTogT24gc29tZQotICAgcGxhdGZvcm1zLCBsaWtlIGFuIEFscGhhLCB5b3UgcHJvYmFibHkgbmVlZCB0byBiZSBhYmxlIHRvIHNwZWNpZnkKLSAgIHRoZSBmb3JtYXQuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGhhbmRsZSwgc2l6ZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9GTE9BVCwgc2l6ZSk7Ci19Ci0KLS8qIE1ha2UgYSBib29sZWFuIHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9ib29sX3R5cGUgKGhhbmRsZSwgc2l6ZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9CT09MLCBzaXplKTsKLX0KLQotLyogTWFrZSBhIGNvbXBsZXggdHlwZSBvZiBhIGdpdmVuIHNpemUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSAoaGFuZGxlLCBzaXplKQotICAgICBQVFIgaGFuZGxlOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLQotICByZXR1cm4gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0NPTVBMRVgsIHNpemUpOwotfQotCi0vKiBNYWtlIGEgc3RydWN0dXJlIHR5cGUuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRydWUgZm9yIGEgc3RydWN0LAotICAgZmFsc2UgZm9yIGEgdW5pb24uICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHNpemUgb2YgdGhlIHN0cnVjdC4KLSAgIFRoZSBmb3VydGggYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoaGFuZGxlLCBzdHJ1Y3RwLCBzaXplLCBmaWVsZHMpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgYmZkX3ZtYSBzaXplOwotICAgICBkZWJ1Z19maWVsZCAqZmllbGRzOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKmM7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywKLQkJICAgICAgIHN0cnVjdHAgPyBERUJVR19LSU5EX1NUUlVDVCA6IERFQlVHX0tJTkRfVU5JT04sCi0JCSAgICAgICBzaXplKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGMgPSAoc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpjKTsKLSAgbWVtc2V0IChjLCAwLCBzaXplb2YgKmMpOwotCi0gIGMtPmZpZWxkcyA9IGZpZWxkczsKLQotICB0LT51LmtjbGFzcyA9IGM7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYW4gb2JqZWN0IHR5cGUuICBUaGUgZmlyc3QgdGhyZWUgYXJndW1lbnRzIGFmdGVyIHRoZSBoYW5kbGUKLSAgIGFyZSB0aGUgc2FtZSBhcyBmb3IgZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZS4gIFRoZSBuZXh0IGFyZ3VtZW50cyBhcmUKLSAgIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGJhc2UgY2xhc3NlcywgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YKLSAgIG1ldGhvZHMsIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgaG9sZGluZyB0aGUgdmlydHVhbCBmdW5jdGlvbiB0YWJsZQotICAgaWYgaXQgaXMgbm90IHRoaXMgb2JqZWN0LCBhbmQgYSBib29sZWFuIHdoaWNoIGlzIHRydWUgaWYgdGhpcwotICAgb2JqZWN0IGhhcyBpdHMgb3duIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX29iamVjdF90eXBlIChoYW5kbGUsIHN0cnVjdHAsIHNpemUsIGZpZWxkcywgYmFzZWNsYXNzZXMsCi0JCQltZXRob2RzLCB2cHRyYmFzZSwgb3dudnB0cikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICBiZmRfdm1hIHNpemU7Ci0gICAgIGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0gICAgIGRlYnVnX2Jhc2VjbGFzcyAqYmFzZWNsYXNzZXM7Ci0gICAgIGRlYnVnX21ldGhvZCAqbWV0aG9kczsKLSAgICAgZGVidWdfdHlwZSB2cHRyYmFzZTsKLSAgICAgYm9vbGVhbiBvd252cHRyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKmM7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywKLQkJICAgICAgIHN0cnVjdHAgPyBERUJVR19LSU5EX0NMQVNTIDogREVCVUdfS0lORF9VTklPTl9DTEFTUywKLQkJICAgICAgIHNpemUpOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgYyA9IChzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmMpOwotICBtZW1zZXQgKGMsIDAsIHNpemVvZiAqYyk7Ci0KLSAgYy0+ZmllbGRzID0gZmllbGRzOwotICBjLT5iYXNlY2xhc3NlcyA9IGJhc2VjbGFzc2VzOwotICBjLT5tZXRob2RzID0gbWV0aG9kczsKLSAgaWYgKG93bnZwdHIpCi0gICAgYy0+dnB0cmJhc2UgPSB0OwotICBlbHNlCi0gICAgYy0+dnB0cmJhc2UgPSB2cHRyYmFzZTsKLQotICB0LT51LmtjbGFzcyA9IGM7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYW4gZW51bWVyYXRpb24gdHlwZS4gIFRoZSBhcmd1bWVudHMgYXJlIGEgbnVsbCB0ZXJtaW5hdGVkCi0gICBhcnJheSBvZiBzdHJpbmdzLCBhbmQgYW4gYXJyYXkgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2VudW1fdHlwZSAoaGFuZGxlLCBuYW1lcywgdmFsdWVzKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gICAgIGJmZF9zaWduZWRfdm1hICp2YWx1ZXM7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfZW51bV90eXBlICplOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfRU5VTSwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBlID0gKHN0cnVjdCBkZWJ1Z19lbnVtX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICplKTsKLSAgbWVtc2V0IChlLCAwLCBzaXplb2YgKmUpOwotCi0gIGUtPm5hbWVzID0gbmFtZXM7Ci0gIGUtPnZhbHVlcyA9IHZhbHVlczsKLQotICB0LT51LmtlbnVtID0gZTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHBvaW50ZXIgdG8gYSBnaXZlbiB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKHR5cGUtPnBvaW50ZXIgIT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiB0eXBlLT5wb2ludGVyOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfUE9JTlRFUiwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0LT51Lmtwb2ludGVyID0gdHlwZTsKLQotICB0eXBlLT5wb2ludGVyID0gdDsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIGZ1bmN0aW9uIHJldHVybmluZyBhIGdpdmVuIHR5cGUuICBGSVhNRTogV2Ugc2hvdWxkIGJlIGFibGUKLSAgIHRvIHJlY29yZCB0aGUgcGFyYW1ldGVyIHR5cGVzLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlIChoYW5kbGUsIHR5cGUsIGFyZ190eXBlcywgdmFyYXJncykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBkZWJ1Z190eXBlICphcmdfdHlwZXM7Ci0gICAgIGJvb2xlYW4gdmFyYXJnczsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbl90eXBlICpmOwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0ZVTkNUSU9OLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGYgPSAoc3RydWN0IGRlYnVnX2Z1bmN0aW9uX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpmKTsKLSAgbWVtc2V0IChmLCAwLCBzaXplb2YgKmYpOwotCi0gIGYtPnJldHVybl90eXBlID0gdHlwZTsKLSAgZi0+YXJnX3R5cGVzID0gYXJnX3R5cGVzOwotICBmLT52YXJhcmdzID0gdmFyYXJnczsKLQotICB0LT51LmtmdW5jdGlvbiA9IGY7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSByZWZlcmVuY2UgdG8gYSBnaXZlbiB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1JFRkVSRU5DRSwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0LT51LmtyZWZlcmVuY2UgPSB0eXBlOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgcmFuZ2Ugb2YgYSBnaXZlbiB0eXBlIGZyb20gYSBsb3dlciB0byBhbiB1cHBlciBib3VuZC4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfcmFuZ2VfdHlwZSAoaGFuZGxlLCB0eXBlLCBsb3dlciwgdXBwZXIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93ZXI7Ci0gICAgIGJmZF9zaWduZWRfdm1hIHVwcGVyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX3JhbmdlX3R5cGUgKnI7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfUkFOR0UsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgciA9IChzdHJ1Y3QgZGVidWdfcmFuZ2VfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnIpOwotICBtZW1zZXQgKHIsIDAsIHNpemVvZiAqcik7Ci0KLSAgci0+dHlwZSA9IHR5cGU7Ci0gIHItPmxvd2VyID0gbG93ZXI7Ci0gIHItPnVwcGVyID0gdXBwZXI7Ci0KLSAgdC0+dS5rcmFuZ2UgPSByOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGFuIGFycmF5IHR5cGUuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQKLSAgIG9mIHRoZSBhcnJheS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiBhIHJhbmdlIG9mIHRoZQotICAgYXJyYXkuICBUaGUgZm91cnRoIGFuZCBmaWZ0aCBhcmd1bWVudCBhcmUgdGhlIGxvd2VyIGFuZCB1cHBlcgotICAgYm91bmRzLCByZXNwZWN0aXZlbHkuICBUaGUgc2l4dGggYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGlzIGFycmF5IGlzCi0gICBhY3R1YWxseSBhIHN0cmluZywgYXMgaW4gQy4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfYXJyYXlfdHlwZSAoaGFuZGxlLCBlbGVtZW50X3R5cGUsIHJhbmdlX3R5cGUsIGxvd2VyLCB1cHBlciwKLQkJICAgICAgIHN0cmluZ3ApCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgZWxlbWVudF90eXBlOwotICAgICBkZWJ1Z190eXBlIHJhbmdlX3R5cGU7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGxvd2VyOwotICAgICBiZmRfc2lnbmVkX3ZtYSB1cHBlcjsKLSAgICAgYm9vbGVhbiBzdHJpbmdwOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX2FycmF5X3R5cGUgKmE7Ci0KLSAgaWYgKGVsZW1lbnRfdHlwZSA9PSBOVUxMIHx8IHJhbmdlX3R5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfQVJSQVksIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgYSA9IChzdHJ1Y3QgZGVidWdfYXJyYXlfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmEpOwotICBtZW1zZXQgKGEsIDAsIHNpemVvZiAqYSk7Ci0KLSAgYS0+ZWxlbWVudF90eXBlID0gZWxlbWVudF90eXBlOwotICBhLT5yYW5nZV90eXBlID0gcmFuZ2VfdHlwZTsKLSAgYS0+bG93ZXIgPSBsb3dlcjsKLSAgYS0+dXBwZXIgPSB1cHBlcjsKLSAgYS0+c3RyaW5ncCA9IHN0cmluZ3A7Ci0KLSAgdC0+dS5rYXJyYXkgPSBhOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgc2V0IG9mIGEgZ2l2ZW4gdHlwZS4gIEZvciBleGFtcGxlLCBhIFBhc2NhbCBzZXQgdHlwZS4gIFRoZQotICAgYm9vbGVhbiBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMgc2V0IGlzIGFjdHVhbGx5IGEgYml0c3RyaW5nLCBhcyBpbgotICAgQ0hJTEwuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3NldF90eXBlIChoYW5kbGUsIHR5cGUsIGJpdHN0cmluZ3ApCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYm9vbGVhbiBiaXRzdHJpbmdwOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX3NldF90eXBlICpzOwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1NFVCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBzID0gKHN0cnVjdCBkZWJ1Z19zZXRfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnMpOwotICBtZW1zZXQgKHMsIDAsIHNpemVvZiAqcyk7Ci0KLSAgcy0+dHlwZSA9IHR5cGU7Ci0gIHMtPmJpdHN0cmluZ3AgPSBiaXRzdHJpbmdwOwotCi0gIHQtPnUua3NldCA9IHM7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSB0eXBlIGZvciBhIHBvaW50ZXIgd2hpY2ggaXMgcmVsYXRpdmUgdG8gYW4gb2JqZWN0LiAgVGhlCi0gICBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byB3aGljaCB0aGUgcG9pbnRlciBpcwotICAgcmVsYXRpdmUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgdGhhdCB0aGUgcG9pbnRlciBwb2ludHMKLSAgIHRvLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9vZmZzZXRfdHlwZSAoaGFuZGxlLCBiYXNlX3R5cGUsIHRhcmdldF90eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIGJhc2VfdHlwZTsKLSAgICAgZGVidWdfdHlwZSB0YXJnZXRfdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19vZmZzZXRfdHlwZSAqbzsKLQotICBpZiAoYmFzZV90eXBlID09IE5VTEwgfHwgdGFyZ2V0X3R5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfT0ZGU0VULCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIG8gPSAoc3RydWN0IGRlYnVnX29mZnNldF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbyk7Ci0gIG1lbXNldCAobywgMCwgc2l6ZW9mICpvKTsKLQotICBvLT5iYXNlX3R5cGUgPSBiYXNlX3R5cGU7Ci0gIG8tPnRhcmdldF90eXBlID0gdGFyZ2V0X3R5cGU7Ci0KLSAgdC0+dS5rb2Zmc2V0ID0gbzsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHR5cGUgZm9yIGEgbWV0aG9kIGZ1bmN0aW9uLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUKLSAgIHJldHVybiB0eXBlLCB0aGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGRvbWFpbiwgYW5kIHRoZSBmb3VydGgKLSAgIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9tZXRob2RfdHlwZSAoaGFuZGxlLCByZXR1cm5fdHlwZSwgZG9tYWluX3R5cGUsIGFyZ190eXBlcywgdmFyYXJncykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgICAgZGVidWdfdHlwZSBkb21haW5fdHlwZTsKLSAgICAgZGVidWdfdHlwZSAqYXJnX3R5cGVzOwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3R5cGUgKm07Ci0KLSAgaWYgKHJldHVybl90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX01FVEhPRCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBtID0gKHN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm0pOwotICBtZW1zZXQgKG0sIDAsIHNpemVvZiAqbSk7Ci0KLSAgbS0+cmV0dXJuX3R5cGUgPSByZXR1cm5fdHlwZTsKLSAgbS0+ZG9tYWluX3R5cGUgPSBkb21haW5fdHlwZTsKLSAgbS0+YXJnX3R5cGVzID0gYXJnX3R5cGVzOwotICBtLT52YXJhcmdzID0gdmFyYXJnczsKLQotICB0LT51LmttZXRob2QgPSBtOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgY29uc3QgcXVhbGlmaWVkIHZlcnNpb24gb2YgYSBnaXZlbiB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9jb25zdF90eXBlIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfQ09OU1QsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdC0+dS5rY29uc3QgPSB0eXBlOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgdm9sYXRpbGUgcXVhbGlmaWVkIHZlcnNpb24gb2YgYSBnaXZlbiB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV92b2xhdGlsZV90eXBlIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfVk9MQVRJTEUsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdC0+dS5rdm9sYXRpbGUgPSB0eXBlOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGFuIHVuZGVmaW5lZCB0YWdnZWQgdHlwZS4gIEZvciBleGFtcGxlLCBhIHN0cnVjdCB3aGljaCBoYXMKLSAgIGJlZW4gbWVudGlvbmVkLCBidXQgbm90IGRlZmluZWQuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3VuZGVmaW5lZF90YWdnZWRfdHlwZSAoaGFuZGxlLCBuYW1lLCBraW5kKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICBjYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTjoKLSAgICBjYXNlIERFQlVHX0tJTkRfQ0xBU1M6Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OX0NMQVNTOgotICAgIGNhc2UgREVCVUdfS0lORF9FTlVNOgotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX21ha2VfdW5kZWZpbmVkX3R5cGU6IHVuc3VwcG9ydGVkIGtpbmQiKSk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBraW5kLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHJldHVybiBkZWJ1Z190YWdfdHlwZSAoaGFuZGxlLCBuYW1lLCB0KTsKLX0KLQotLyogTWFrZSBhIGJhc2UgY2xhc3MgZm9yIGFuIG9iamVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIGJhc2UKLSAgIGNsYXNzIHR5cGUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGJpdCBwb3NpdGlvbiBvZiB0aGlzIGJhc2UKLSAgIGNsYXNzIGluIHRoZSBvYmplY3QgKGFsd2F5cyAwIHVubGVzcyBkb2luZyBtdWx0aXBsZSBpbmhlcml0YW5jZSkuCi0gICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIHdoZXRoZXIgdGhpcyBpcyBhIHZpcnR1YWwgY2xhc3MuICBUaGUgZmlmdGgKLSAgIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBiYXNlIGNsYXNzLiAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19iYXNlY2xhc3MKLWRlYnVnX21ha2VfYmFzZWNsYXNzIChoYW5kbGUsIHR5cGUsIGJpdHBvcywgdmlydHVhbCwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGJmZF92bWEgYml0cG9zOwotICAgICBib29sZWFuIHZpcnR1YWw7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwoteyAgICAgCi0gIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKmI7Ci0KLSAgYiA9IChzdHJ1Y3QgZGVidWdfYmFzZWNsYXNzICopIHhtYWxsb2MgKHNpemVvZiAqYik7Ci0gIG1lbXNldCAoYiwgMCwgc2l6ZW9mICpiKTsKLQotICBiLT50eXBlID0gdHlwZTsKLSAgYi0+Yml0cG9zID0gYml0cG9zOwotICBiLT52aXJ0dWFsID0gdmlydHVhbDsKLSAgYi0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0KLSAgcmV0dXJuIGI7Ci19Ci0KLS8qIE1ha2UgYSBmaWVsZCBmb3IgYSBzdHJ1Y3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBuYW1lLiAgVGhlCi0gICB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzCi0gICB0aGUgYml0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZC4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgc2l6ZSBvZgotICAgdGhlIGZpZWxkIChpdCBtYXkgYmUgemVybykuICBUaGUgc2l4dGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkKLSAgIG9mIHRoZSBmaWVsZC4gICovCi0KLS8qQVJHU1VTRUQqLwotZGVidWdfZmllbGQKLWRlYnVnX21ha2VfZmllbGQgKGhhbmRsZSwgbmFtZSwgdHlwZSwgYml0cG9zLCBiaXRzaXplLCB2aXNpYmlsaXR5KQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJmZF92bWEgYml0c2l6ZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19maWVsZCAqZjsKLQotICBmID0gKHN0cnVjdCBkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChzaXplb2YgKmYpOwotICBtZW1zZXQgKGYsIDAsIHNpemVvZiAqZik7Ci0KLSAgZi0+bmFtZSA9IG5hbWU7Ci0gIGYtPnR5cGUgPSB0eXBlOwotICBmLT5zdGF0aWNfbWVtYmVyID0gZmFsc2U7Ci0gIGYtPnUuZi5iaXRwb3MgPSBiaXRwb3M7Ci0gIGYtPnUuZi5iaXRzaXplID0gYml0c2l6ZTsKLSAgZi0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0KLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIE1ha2UgYSBzdGF0aWMgbWVtYmVyIG9mIGFuIG9iamVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlCi0gICBuYW1lLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBtZW1iZXIuICBUaGUgZm91cnRoCi0gICBhcmd1bWVudCBpcyB0aGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgbWVtYmVyIChpLmUuLCB0aGUgbmFtZSBhcyBhCi0gICBnbG9iYWwgdmFyaWFibGUpLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZQotICAgbWVtYmVyLiAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19maWVsZAotZGVidWdfbWFrZV9zdGF0aWNfbWVtYmVyIChoYW5kbGUsIG5hbWUsIHR5cGUsIHBoeXNuYW1lLCB2aXNpYmlsaXR5KQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3QgZGVidWdfZmllbGQgKmY7Ci0KLSAgZiA9IChzdHJ1Y3QgZGVidWdfZmllbGQgKikgeG1hbGxvYyAoc2l6ZW9mICpmKTsKLSAgbWVtc2V0IChmLCAwLCBzaXplb2YgKmYpOwotCi0gIGYtPm5hbWUgPSBuYW1lOwotICBmLT50eXBlID0gdHlwZTsKLSAgZi0+c3RhdGljX21lbWJlciA9IHRydWU7Ci0gIGYtPnUucy5waHlzbmFtZSA9IHBoeXNuYW1lOwotICBmLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLQotICByZXR1cm4gZjsKLX0KLQotLyogTWFrZSBhIG1ldGhvZC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUsIGFuZCB0aGUgdGhpcmQKLSAgIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIG1ldGhvZCB2YXJpYW50cy4gICovCi0KLS8qQVJHU1VTRUQqLwotZGVidWdfbWV0aG9kCi1kZWJ1Z19tYWtlX21ldGhvZCAoaGFuZGxlLCBuYW1lLCB2YXJpYW50cykKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z19tZXRob2RfdmFyaWFudCAqdmFyaWFudHM7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19tZXRob2QgKm07Ci0KLSAgbSA9IChzdHJ1Y3QgZGVidWdfbWV0aG9kICopIHhtYWxsb2MgKHNpemVvZiAqbSk7Ci0gIG1lbXNldCAobSwgMCwgc2l6ZW9mICptKTsKLQotICBtLT5uYW1lID0gbmFtZTsKLSAgbS0+dmFyaWFudHMgPSB2YXJpYW50czsKLQotICByZXR1cm4gbTsKLX0KLQotLyogTWFrZSBhIG1ldGhvZCBhcmd1bWVudC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHJlYWwgbmFtZSBvZgotICAgdGhlIGZ1bmN0aW9uLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbi4gIFRoZQotICAgZm91cnRoIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5LiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHdoZXRoZXIKLSAgIHRoaXMgaXMgYSBjb25zdCBmdW5jdGlvbi4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB3aGV0aGVyIHRoaXMgaXMgYQotICAgdm9sYXRpbGUgZnVuY3Rpb24uICBUaGUgc2V2ZW50aCBhcmd1bWVudCBpcyB0aGUgb2Zmc2V0IGluIHRoZQotICAgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSwgaWYgYW55LiAgVGhlIGVpZ2h0aCBhcmd1bWVudCBpcyB0aGUgdmlydHVhbAotICAgZnVuY3Rpb24gY29udGV4dC4gIEZJWE1FOiBBcmUgdGhlIGNvbnN0IGFuZCB2b2xhdGlsZSBhcmd1bWVudHMKLSAgIG5lY2Vzc2FyeT8gIENvdWxkIHdlIGp1c3QgdXNlIGRlYnVnX21ha2VfY29uc3RfdHlwZT8gICovCi0KLS8qQVJHU1VTRUQqLwotZGVidWdfbWV0aG9kX3ZhcmlhbnQKLWRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQgKGhhbmRsZSwgcGh5c25hbWUsIHR5cGUsIHZpc2liaWxpdHksIGNvbnN0cCwKLQkJCSAgIHZvbGF0aWxlcCwgdm9mZnNldCwgY29udGV4dCkKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGRlYnVnX3R5cGUgY29udGV4dDsKLXsKLSAgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICptOwotCi0gIG0gPSAoc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICopIHhtYWxsb2MgKHNpemVvZiAqbSk7Ci0gIG1lbXNldCAobSwgMCwgc2l6ZW9mICptKTsKLQotICBtLT5waHlzbmFtZSA9IHBoeXNuYW1lOwotICBtLT50eXBlID0gdHlwZTsKLSAgbS0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0gIG0tPmNvbnN0cCA9IGNvbnN0cDsKLSAgbS0+dm9sYXRpbGVwID0gdm9sYXRpbGVwOwotICBtLT52b2Zmc2V0ID0gdm9mZnNldDsKLSAgbS0+Y29udGV4dCA9IGNvbnRleHQ7Ci0KLSAgcmV0dXJuIG07Ci19Ci0KLS8qIE1ha2UgYSBzdGF0aWMgbWV0aG9kIGFyZ3VtZW50LiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yCi0gICBkZWJ1Z19tYWtlX21ldGhvZF92YXJpYW50LCBleGNlcHQgdGhhdCB0aGUgbGFzdCB0d28gYXJlIG9taXR0ZWQKLSAgIHNpbmNlIGEgc3RhdGljIG1ldGhvZCBjYW4gbm90IGFsc28gYmUgdmlydHVhbC4gICovCi0KLWRlYnVnX21ldGhvZF92YXJpYW50Ci1kZWJ1Z19tYWtlX3N0YXRpY19tZXRob2RfdmFyaWFudCAoaGFuZGxlLCBwaHlzbmFtZSwgdHlwZSwgdmlzaWJpbGl0eSwKLQkJCQkgIGNvbnN0cCwgdm9sYXRpbGVwKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqbTsKLQotICBtID0gKHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqKSB4bWFsbG9jIChzaXplb2YgKm0pOwotICBtZW1zZXQgKG0sIDAsIHNpemVvZiAqbSk7Ci0KLSAgbS0+cGh5c25hbWUgPSBwaHlzbmFtZTsKLSAgbS0+dHlwZSA9IHR5cGU7Ci0gIG0tPnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5OwotICBtLT5jb25zdHAgPSBjb25zdHA7Ci0gIG0tPnZvbGF0aWxlcCA9IHZvbGF0aWxlcDsKLSAgbS0+dm9mZnNldCA9IFZPRkZTRVRfU1RBVElDX01FVEhPRDsKLQotICByZXR1cm4gbTsKLX0KLQotLyogTmFtZSBhIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19uYW1lX3R5cGUgKGhhbmRsZSwgbmFtZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX25hbWVkX3R5cGUgKm47Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpubTsKLQotICBpZiAobmFtZSA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX25hbWVfdHlwZTogbm8gY3VycmVudCBmaWxlIikpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9OQU1FRCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBuID0gKHN0cnVjdCBkZWJ1Z19uYW1lZF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG1lbXNldCAobiwgMCwgc2l6ZW9mICpuKTsKLQotICBuLT50eXBlID0gdHlwZTsKLQotICB0LT51LmtuYW1lZCA9IG47Ci0KLSAgLyogV2UgYWx3YXlzIGFkZCB0aGUgbmFtZSB0byB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFRoaXMgaXMgcHJvYmFibHkKLSAgICAgd3JvbmcgaW4gc29tZSBjYXNlcywgYnV0IGl0IHNlZW1zIHRvIGJlIHJpZ2h0IGZvciBzdGFicy4gIEZJWE1FLiAgKi8KLQotICBubSA9IGRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sICZpbmZvLT5jdXJyZW50X2ZpbGUtPmdsb2JhbHMsIG5hbWUsCi0JCQkgICAgICAgREVCVUdfT0JKRUNUX1RZUEUsIERFQlVHX0xJTktBR0VfTk9ORSk7Ci0gIGlmIChubSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBubS0+dS50eXBlID0gdDsKLQotICBuLT5uYW1lID0gbm07Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIFRhZyBhIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z190YWdfdHlwZSAoaGFuZGxlLCBuYW1lLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZSAqbjsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm5tOwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z190YWdfdHlwZTogbm8gY3VycmVudCBmaWxlIikpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAodHlwZS0+dS5rbmFtZWQtPm5hbWUtPm5hbWUsIG5hbWUpID09IDApCi0JcmV0dXJuIHR5cGU7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfdGFnX3R5cGU6IGV4dHJhIHRhZyBhdHRlbXB0ZWQiKSk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1RBR0dFRCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBuID0gKHN0cnVjdCBkZWJ1Z19uYW1lZF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG1lbXNldCAobiwgMCwgc2l6ZW9mICpuKTsKLQotICBuLT50eXBlID0gdHlwZTsKLQotICB0LT51LmtuYW1lZCA9IG47Ci0KLSAgLyogV2Uga2VlcCBhIGdsb2JhbCBuYW1lc3BhY2Ugb2YgdGFncyBmb3IgZWFjaCBjb21waWxhdGlvbiB1bml0LiAgSQotICAgICBkb24ndCBrbm93IGlmIHRoYXQgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLiAgKi8KLQotICBubSA9IGRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sICZpbmZvLT5jdXJyZW50X2ZpbGUtPmdsb2JhbHMsIG5hbWUsCi0JCQkgICAgICAgREVCVUdfT0JKRUNUX1RBRywgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG5tID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG5tLT51LnRhZyA9IHQ7Ci0KLSAgbi0+bmFtZSA9IG5tOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBSZWNvcmQgdGhlIHNpemUgb2YgYSBnaXZlbiB0eXBlLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfdHlwZV9zaXplIChoYW5kbGUsIHR5cGUsIHNpemUpCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgaWYgKHR5cGUtPnNpemUgIT0gMCAmJiB0eXBlLT5zaXplICE9IHNpemUpCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCJXYXJuaW5nOiBjaGFuZ2luZyB0eXBlIHNpemUgZnJvbSAlZCB0byAlZFxuIiksCi0JICAgICB0eXBlLT5zaXplLCBzaXplKTsKLQotICB0eXBlLT5zaXplID0gc2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluZCBhIG5hbWVkIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19maW5kX25hbWVkX3R5cGUgKGhhbmRsZSwgbmFtZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpiOwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqZjsKLQotICAvKiBXZSBvbmx5IHNlYXJjaCB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgSSBkb24ndCBrbm93IGlmCi0gICAgIHRoaXMgaXMgcmlnaHQgb3Igbm90LiAgKi8KLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX2ZpbmRfbmFtZWRfdHlwZTogbm8gY3VycmVudCBjb21waWxhdGlvbiB1bml0IikpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgZm9yIChiID0gaW5mby0+Y3VycmVudF9ibG9jazsgYiAhPSBOVUxMOyBiID0gYi0+cGFyZW50KQotICAgIHsKLSAgICAgIGlmIChiLT5sb2NhbHMgIT0gTlVMTCkKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLQotCSAgZm9yIChuID0gYi0+bG9jYWxzLT5saXN0OyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKG4tPmtpbmQgPT0gREVCVUdfT0JKRUNUX1RZUEUKLQkJICAmJiBuLT5uYW1lWzBdID09IG5hbWVbMF0KLQkJICAmJiBzdHJjbXAgKG4tPm5hbWUsIG5hbWUpID09IDApCi0JCXJldHVybiBuLT51LnR5cGU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZvciAoZiA9IGluZm8tPmN1cnJlbnRfdW5pdC0+ZmlsZXM7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmdsb2JhbHMgIT0gTlVMTCkKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLQotCSAgZm9yIChuID0gZi0+Z2xvYmFscy0+bGlzdDsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChuLT5raW5kID09IERFQlVHX09CSkVDVF9UWVBFCi0JCSAgJiYgbi0+bmFtZVswXSA9PSBuYW1lWzBdCi0JCSAgJiYgc3RyY21wIChuLT5uYW1lLCBuYW1lKSA9PSAwKQotCQlyZXR1cm4gbi0+dS50eXBlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwkgIAotfQotCi0vKiBGaW5kIGEgdGFnZ2VkIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19maW5kX3RhZ2dlZF90eXBlIChoYW5kbGUsIG5hbWUsIGtpbmQpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z191bml0ICp1OwotCi0gIC8qIFdlIHNlYXJjaCB0aGUgZ2xvYmFscyBvZiBhbGwgdGhlIGNvbXBpbGF0aW9uIHVuaXRzLiAgSSBkb24ndCBrbm93Ci0gICAgIGlmIHRoaXMgaXMgY29ycmVjdCBvciBub3QuICBJdCB3b3VsZCBiZSBlYXN5IHRvIGNoYW5nZS4gICovCi0KLSAgZm9yICh1ID0gaW5mby0+dW5pdHM7IHUgIT0gTlVMTDsgdSA9IHUtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGRlYnVnX2ZpbGUgKmY7Ci0KLSAgICAgIGZvciAoZiA9IHUtPmZpbGVzOyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotCi0JICBpZiAoZi0+Z2xvYmFscyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm9yIChuID0gZi0+Z2xvYmFscy0+bGlzdDsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQkJewotCQkgIGlmIChuLT5raW5kID09IERFQlVHX09CSkVDVF9UQUcKLQkJICAgICAgJiYgKGtpbmQgPT0gREVCVUdfS0lORF9JTExFR0FMCi0JCQkgIHx8IG4tPnUudGFnLT5raW5kID09IGtpbmQpCi0JCSAgICAgICYmIG4tPm5hbWVbMF0gPT0gbmFtZVswXQotCQkgICAgICAmJiBzdHJjbXAgKG4tPm5hbWUsIG5hbWUpID09IDApCi0JCSAgICByZXR1cm4gbi0+dS50YWc7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLX0KLQotLyogR2V0IGEgYmFzZSB0eXBlLiAgV2UgYnVpbGQgYSBsaW5rZWQgbGlzdCBvbiB0aGUgc3RhY2sgdG8gYXZvaWQKLSAgIGNyYXNoaW5nIGlmIHRoZSB0eXBlIGlzIGRlZmluZWQgY2lyY3VsYXJseS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZGVidWdfdHlwZSAqCi1kZWJ1Z19nZXRfcmVhbF90eXBlIChoYW5kbGUsIHR5cGUsIGxpc3QpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0ICpsaXN0OwotewotICBzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QgKmw7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlX3JlYWxfbGlzdCBybDsKLQotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gdHlwZTsKLQotICAgIGNhc2UgREVCVUdfS0lORF9JTkRJUkVDVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfTkFNRUQ6Ci0gICAgY2FzZSBERUJVR19LSU5EX1RBR0dFRDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBmb3IgKGwgPSBsaXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT50ID09IHR5cGUpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICBfKCJkZWJ1Z19nZXRfcmVhbF90eXBlOiBjaXJjdWxhciBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgJXNcbiIpLAotCQkgICBkZWJ1Z19nZXRfdHlwZV9uYW1lIChoYW5kbGUsIHR5cGUpKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgcmwubmV4dCA9IGxpc3Q7Ci0gIHJsLnQgPSB0eXBlOwotCi0gIHN3aXRjaCAodHlwZS0+a2luZCkKLSAgICB7Ci0gICAgICAvKiBUaGUgZGVmYXVsdCBjYXNlIGlzIGp1c3QgaGVyZSB0byBhdm9pZCB3YXJuaW5ncy4gICovCi0gICAgZGVmYXVsdDoKLSAgICBjYXNlIERFQlVHX0tJTkRfSU5ESVJFQ1Q6Ci0gICAgICBpZiAoKnR5cGUtPnUua2luZGlyZWN0LT5zbG90ICE9IE5VTEwpCi0JcmV0dXJuIGRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgKnR5cGUtPnUua2luZGlyZWN0LT5zbG90LCAmcmwpOwotICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgY2FzZSBERUJVR19LSU5EX05BTUVEOgotICAgIGNhc2UgREVCVUdfS0lORF9UQUdHRUQ6Ci0gICAgICByZXR1cm4gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLT51LmtuYW1lZC0+dHlwZSwgJnJsKTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIEdldCB0aGUga2luZCBvZiBhIHR5cGUuICAqLwotCi1lbnVtIGRlYnVnX3R5cGVfa2luZAotZGVidWdfZ2V0X3R5cGVfa2luZCAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX0tJTkRfSUxMRUdBTDsKLSAgdHlwZSA9IGRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZSwgTlVMTCk7Ci0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX0tJTkRfSUxMRUdBTDsKLSAgcmV0dXJuIHR5cGUtPmtpbmQ7Ci19Ci0KLS8qIEdldCB0aGUgbmFtZSBvZiBhIHR5cGUuICAqLwotCi1jb25zdCBjaGFyICoKLWRlYnVnX2dldF90eXBlX25hbWUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBpZiAodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX0lORElSRUNUKQotICAgIHsKLSAgICAgIGlmICgqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QgIT0gTlVMTCkKLQlyZXR1cm4gZGVidWdfZ2V0X3R5cGVfbmFtZSAoaGFuZGxlLCAqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QpOwotICAgICAgcmV0dXJuIHR5cGUtPnUua2luZGlyZWN0LT50YWc7Ci0gICAgfQotICBpZiAodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX05BTUVECi0gICAgICB8fCB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VEKQotICAgIHJldHVybiB0eXBlLT51LmtuYW1lZC0+bmFtZS0+bmFtZTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiBhIHR5cGUuICAqLwotCi1iZmRfdm1hCi1kZWJ1Z19nZXRfdHlwZV9zaXplIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBXZSBkb24ndCBjYWxsIGRlYnVnX2dldF9yZWFsX3R5cGUsIGJlY2F1c2Ugc29tZWJvZHkgbWlnaHQgaGF2ZQotICAgICBjYWxsZWQgZGVidWdfcmVjb3JkX3R5cGVfc2l6ZSBvbiBhIG5hbWVkIG9yIGluZGlyZWN0IHR5cGUuICAqLwotCi0gIGlmICh0eXBlLT5zaXplICE9IDApCi0gICAgcmV0dXJuIHR5cGUtPnNpemU7Ci0KLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBERUJVR19LSU5EX0lORElSRUNUOgotICAgICAgaWYgKCp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCAhPSBOVUxMKQotCXJldHVybiBkZWJ1Z19nZXRfdHlwZV9zaXplIChoYW5kbGUsICp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIERFQlVHX0tJTkRfTkFNRUQ6Ci0gICAgY2FzZSBERUJVR19LSU5EX1RBR0dFRDoKLSAgICAgIHJldHVybiBkZWJ1Z19nZXRfdHlwZV9zaXplIChoYW5kbGUsIHR5cGUtPnUua25hbWVkLT50eXBlKTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIEdldCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBmdW5jdGlvbiBvciBtZXRob2QgdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX2dldF9yZXR1cm5fdHlwZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgdHlwZSA9IGRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZSwgTlVMTCk7Ci0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICBjYXNlIERFQlVHX0tJTkRfRlVOQ1RJT046Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rZnVuY3Rpb24tPnJldHVybl90eXBlOwotICAgIGNhc2UgREVCVUdfS0lORF9NRVRIT0Q6Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rbWV0aG9kLT5yZXR1cm5fdHlwZTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovICAgICAgCi19Ci0KLS8qIEdldCB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIGEgZnVuY3Rpb24gb3IgbWV0aG9kIHR5cGUgKGV4Y2VwdCB0aGF0Ci0gICB3ZSBkb24ndCBjdXJyZW50bHkgc3RvcmUgdGhlIHBhcmFtZXRlciB0eXBlcyBvZiBhIGZ1bmN0aW9uKS4gICovCi0KLWNvbnN0IGRlYnVnX3R5cGUgKgotZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyAoaGFuZGxlLCB0eXBlLCBwdmFyYXJncykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBib29sZWFuICpwdmFyYXJnczsKLXsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgdHlwZSA9IGRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZSwgTlVMTCk7Ci0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHN3aXRjaCAodHlwZS0+a2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGNhc2UgREVCVUdfS0lORF9GVU5DVElPTjoKLSAgICAgICpwdmFyYXJncyA9IHR5cGUtPnUua2Z1bmN0aW9uLT52YXJhcmdzOwotICAgICAgcmV0dXJuIHR5cGUtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXM7Ci0gICAgY2FzZSBERUJVR19LSU5EX01FVEhPRDoKLSAgICAgICpwdmFyYXJncyA9IHR5cGUtPnUua21ldGhvZC0+dmFyYXJnczsKLSAgICAgIHJldHVybiB0eXBlLT51LmttZXRob2QtPmFyZ190eXBlczsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIEdldCB0aGUgdGFyZ2V0IHR5cGUgb2YgYSB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfZ2V0X3RhcmdldF90eXBlIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgdHlwZSA9IGRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZSwgTlVMTCk7Ci0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHN3aXRjaCAodHlwZS0+a2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGNhc2UgREVCVUdfS0lORF9QT0lOVEVSOgotICAgICAgcmV0dXJuIHR5cGUtPnUua3BvaW50ZXI7Ci0gICAgY2FzZSBERUJVR19LSU5EX1JFRkVSRU5DRToKLSAgICAgIHJldHVybiB0eXBlLT51LmtyZWZlcmVuY2U7Ci0gICAgY2FzZSBERUJVR19LSU5EX0NPTlNUOgotICAgICAgcmV0dXJuIHR5cGUtPnUua2NvbnN0OwotICAgIGNhc2UgREVCVUdfS0lORF9WT0xBVElMRToKLSAgICAgIHJldHVybiB0eXBlLT51Lmt2b2xhdGlsZTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIEdldCB0aGUgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGZpZWxkcyBmb3IgYSBzdHJ1Y3QsIHVuaW9uLCBvcgotICAgY2xhc3MuICAqLwotCi1jb25zdCBkZWJ1Z19maWVsZCAqCi1kZWJ1Z19nZXRfZmllbGRzIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgdHlwZSA9IGRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZSwgTlVMTCk7Ci0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHN3aXRjaCAodHlwZS0+a2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGNhc2UgREVCVUdfS0lORF9TVFJVQ1Q6Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OOgotICAgIGNhc2UgREVCVUdfS0lORF9DTEFTUzoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rY2xhc3MtPmZpZWxkczsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIEdldCB0aGUgdHlwZSBvZiBhIGZpZWxkLiAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z190eXBlCi1kZWJ1Z19nZXRfZmllbGRfdHlwZSAoaGFuZGxlLCBmaWVsZCkKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLXsKLSAgaWYgKGZpZWxkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBmaWVsZC0+dHlwZTsKLX0KLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWNvbnN0IGNoYXIgKgotZGVidWdfZ2V0X2ZpZWxkX25hbWUgKGhhbmRsZSwgZmllbGQpCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZGVidWdfZmllbGQgZmllbGQ7Ci17Ci0gIGlmIChmaWVsZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gZmllbGQtPm5hbWU7Ci19Ci0KLS8qIEdldCB0aGUgYml0IHBvc2l0aW9uIG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJmZF92bWEKLWRlYnVnX2dldF9maWVsZF9iaXRwb3MgKGhhbmRsZSwgZmllbGQpCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZGVidWdfZmllbGQgZmllbGQ7Ci17Ci0gIGlmIChmaWVsZCA9PSBOVUxMIHx8IGZpZWxkLT5zdGF0aWNfbWVtYmVyKQotICAgIHJldHVybiAoYmZkX3ZtYSkgLTE7Ci0gIHJldHVybiBmaWVsZC0+dS5mLmJpdHBvczsKLX0KLQotLyogR2V0IHRoZSBiaXQgc2l6ZSBvZiBhIGZpZWxkLiAgKi8KLQotLypBUkdTVVNFRCovCi1iZmRfdm1hCi1kZWJ1Z19nZXRfZmllbGRfYml0c2l6ZSAoaGFuZGxlLCBmaWVsZCkKLSAgICAgUFRSIGhhbmRsZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLXsKLSAgaWYgKGZpZWxkID09IE5VTEwgfHwgZmllbGQtPnN0YXRpY19tZW1iZXIpCi0gICAgcmV0dXJuIChiZmRfdm1hKSAtMTsKLSAgcmV0dXJuIGZpZWxkLT51LmYuYml0c2l6ZTsKLX0KLQotLyogR2V0IHRoZSB2aXNpYmlsaXR5IG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWVudW0gZGVidWdfdmlzaWJpbGl0eQotZGVidWdfZ2V0X2ZpZWxkX3Zpc2liaWxpdHkgKGhhbmRsZSwgZmllbGQpCi0gICAgIFBUUiBoYW5kbGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZGVidWdfZmllbGQgZmllbGQ7Ci17Ci0gIGlmIChmaWVsZCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19WSVNJQklMSVRZX0lHTk9SRTsKLSAgcmV0dXJuIGZpZWxkLT52aXNpYmlsaXR5OwotfQotCi0vKiBHZXQgdGhlIHBoeXNpY2FsIG5hbWUgb2YgYSBmaWVsZC4gICovCi0KLWNvbnN0IGNoYXIgKgotZGVidWdfZ2V0X2ZpZWxkX3BoeXNuYW1lIChoYW5kbGUsIGZpZWxkKQotICAgICBQVFIgaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotewotICBpZiAoZmllbGQgPT0gTlVMTCB8fCAhIGZpZWxkLT5zdGF0aWNfbWVtYmVyKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gZmllbGQtPnUucy5waHlzbmFtZTsKLX0KLQwKLS8qIFdyaXRlIG91dCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBnaXZlbiBhIGhhbmRsZSB0bwotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBhbmQgYSBzZXQgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdG8gY2FsbC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3dyaXRlIChoYW5kbGUsIGZucywgZmhhbmRsZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3VuaXQgKnU7Ci0KLSAgLyogV2UgdXNlIGEgbWFyayB0byB0ZWxsIHdoZXRoZXIgd2UgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IGEKLSAgICAgcGFydGljdWxhciBuYW1lLiAgV2UgdXNlIGFuIGludGVnZXIsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0bwotICAgICBjbGVhciB0aGUgbWFyayBmaWVsZHMgaWYgd2UgaGFwcGVuIHRvIHdyaXRlIG91dCB0aGUgc2FtZQotICAgICBpbmZvcm1hdGlvbiBtb3JlIHRoYW4gb25jZS4gICovCi0gICsraW5mby0+bWFyazsKLQotICAvKiBUaGUgYmFzZV9pZCBmaWVsZCBob2xkcyBhbiBJRCB2YWx1ZSB3aGljaCB3aWxsIG5ldmVyIGJlIHVzZWQsIHNvCi0gICAgIHRoYXQgd2UgY2FuIHRlbGwgd2hldGhlciB3ZSBoYXZlIGFzc2lnbmVkIGFuIElEIGR1cmluZyB0aGlzIGNhbGwKLSAgICAgdG8gZGVidWdfd3JpdGUuICAqLwotICBpbmZvLT5iYXNlX2lkID0gaW5mby0+Y2xhc3NfaWQ7Ci0KLSAgLyogV2Uga2VlcCBhIGxpbmtlZCBsaXN0IG9mIGNsYXNzZXMgZm9yIHdoaWNoIHdhcyBoYXZlIGFzc2lnbmVkIElEJ3MKLSAgICAgZHVyaW5nIHRoaXMgY2FsbCB0byBkZWJ1Z193cml0ZS4gICovCi0gIGluZm8tPmlkX2xpc3QgPSBOVUxMOwotCi0gIGZvciAodSA9IGluZm8tPnVuaXRzOyB1ICE9IE5VTEw7IHUgPSB1LT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBkZWJ1Z19maWxlICpmOwotICAgICAgYm9vbGVhbiBmaXJzdF9maWxlOwotCi0gICAgICBpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVubyA9IHUtPmxpbmVub3M7Ci0gICAgICBpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleCA9IDA7Ci0KLSAgICAgIGlmICghICgqZm5zLT5zdGFydF9jb21waWxhdGlvbl91bml0KSAoZmhhbmRsZSwgdS0+ZmlsZXMtPmZpbGVuYW1lKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZpcnN0X2ZpbGUgPSB0cnVlOwotICAgICAgZm9yIChmID0gdS0+ZmlsZXM7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0JewotCSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0KLQkgIGlmIChmaXJzdF9maWxlKQotCSAgICBmaXJzdF9maWxlID0gZmFsc2U7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKmZucy0+c3RhcnRfc291cmNlKSAoZmhhbmRsZSwgZi0+ZmlsZW5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKGYtPmdsb2JhbHMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvciAobiA9IGYtPmdsb2JhbHMtPmxpc3Q7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCi0JCXsKLQkJICBpZiAoISBkZWJ1Z193cml0ZV9uYW1lIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4pKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIE91dHB1dCBhbnkgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gd2hpY2ggaGFzbid0IGFscmVhZHkgYmVlbgotICAgICAgICAgaGFuZGxlZC4gICovCi0gICAgICBpZiAoISBkZWJ1Z193cml0ZV9saW5lbm9zIChpbmZvLCBmbnMsIGZoYW5kbGUsIChiZmRfdm1hKSAtMSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIGVsZW1lbnQgaW4gYSBuYW1lc3BhY2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfd3JpdGVfbmFtZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotICAgICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLXsKLSAgc3dpdGNoIChuLT5raW5kKQotICAgIHsKLSAgICBjYXNlIERFQlVHX09CSkVDVF9UWVBFOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuLT51LnR5cGUsIG4pCi0JICB8fCAhICgqZm5zLT50eXBkZWYpIChmaGFuZGxlLCBuLT5uYW1lKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIERFQlVHX09CSkVDVF9UQUc6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4tPnUudGFnLCBuKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnRhZykgKGZoYW5kbGUsIG4tPm5hbWUpOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX1ZBUklBQkxFOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuLT51LnZhcmlhYmxlLT50eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+dmFyaWFibGUpIChmaGFuZGxlLCBuLT5uYW1lLCBuLT51LnZhcmlhYmxlLT5raW5kLAotCQkJICAgICAgIG4tPnUudmFyaWFibGUtPnZhbCk7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfRlVOQ1RJT046Ci0gICAgICByZXR1cm4gZGVidWdfd3JpdGVfZnVuY3Rpb24gKGluZm8sIGZucywgZmhhbmRsZSwgbi0+bmFtZSwKLQkJCQkgICBuLT5saW5rYWdlLCBuLT51LmZ1bmN0aW9uKTsKLSAgICBjYXNlIERFQlVHX09CSkVDVF9JTlRfQ09OU1RBTlQ6Ci0gICAgICByZXR1cm4gKCpmbnMtPmludF9jb25zdGFudCkgKGZoYW5kbGUsIG4tPm5hbWUsIG4tPnUuaW50X2NvbnN0YW50KTsKLSAgICBjYXNlIERFQlVHX09CSkVDVF9GTE9BVF9DT05TVEFOVDoKLSAgICAgIHJldHVybiAoKmZucy0+ZmxvYXRfY29uc3RhbnQpIChmaGFuZGxlLCBuLT5uYW1lLCBuLT51LmZsb2F0X2NvbnN0YW50KTsKLSAgICBjYXNlIERFQlVHX09CSkVDVF9UWVBFRF9DT05TVEFOVDoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgbi0+dS50eXBlZF9jb25zdGFudC0+dHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnR5cGVkX2NvbnN0YW50KSAoZmhhbmRsZSwgbi0+bmFtZSwKLQkJCQkgICAgIG4tPnUudHlwZWRfY29uc3RhbnQtPnZhbCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogV3JpdGUgb3V0IGEgdHlwZS4gIElmIHRoZSB0eXBlIGlzIERFQlVHX0tJTkRfTkFNRUQgb3IKLSAgIERFQlVHX0tJTkRfVEFHR0VELCB0aGVuIHRoZSBuYW1lIGFyZ3VtZW50IGlzIHRoZSBuYW1lIGZvciB3aGljaCB3ZQotICAgYXJlIGFib3V0IHRvIGNhbGwgdHlwZWRlZiBvciB0YWcuICBJZiB0aGUgdHlwZSBpcyBhbnl0aGluZyBlbHNlLAotICAgdGhlbiB0aGUgbmFtZSBhcmd1bWVudCBpcyBhIHRhZyBmcm9tIGEgREVCVUdfS0lORF9UQUdHRUQgdHlwZSB3aGljaAotICAgcG9pbnRzIHRvIHRoaXMgb25lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZSwgbmFtZSkKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gICAgIHN0cnVjdCBkZWJ1Z19uYW1lICpuYW1lOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IGlzOwotICBjb25zdCBjaGFyICp0YWcgPSBOVUxMOwotCi0gIC8qIElmIHdlIGhhdmUgYSBuYW1lIGZvciB0aGlzIHR5cGUsIGp1c3Qgb3V0cHV0IGl0LiAgV2Ugb25seSBvdXRwdXQKLSAgICAgdHlwZWRlZiBuYW1lcyBhZnRlciB0aGV5IGhhdmUgYmVlbiBkZWZpbmVkLiAgV2Ugb3V0cHV0IHR5cGUgdGFncwotICAgICB3aGVuZXZlciB3ZSBhcmUgbm90IGFjdHVhbGx5IGRlZmluaW5nIHRoZW0uICAqLwotICBpZiAoKHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9OQU1FRAotICAgICAgIHx8IHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQpCi0gICAgICAmJiAodHlwZS0+dS5rbmFtZWQtPm5hbWUtPm1hcmsgPT0gaW5mby0+bWFyawotCSAgfHwgKHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQKLQkgICAgICAmJiB0eXBlLT51LmtuYW1lZC0+bmFtZSAhPSBuYW1lKSkpCi0gICAgewotICAgICAgaWYgKHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9OQU1FRCkKLQlyZXR1cm4gKCpmbnMtPnR5cGVkZWZfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnUua25hbWVkLT5uYW1lLT5uYW1lKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfdHlwZSAqcmVhbDsKLQkgIHVuc2lnbmVkIGludCBpZDsKLQotCSAgcmVhbCA9IGRlYnVnX2dldF9yZWFsX3R5cGUgKChQVFIpIGluZm8sIHR5cGUsIE5VTEwpOwotCSAgaWYgKHJlYWwgPT0gTlVMTCkKLQkgICAgcmV0dXJuICgqZm5zLT5lbXB0eV90eXBlKSAoZmhhbmRsZSk7Ci0JICBpZCA9IDA7Ci0JICBpZiAoKHJlYWwtPmtpbmQgPT0gREVCVUdfS0lORF9TVFJVQ1QKLQkgICAgICAgfHwgcmVhbC0+a2luZCA9PSBERUJVR19LSU5EX1VOSU9OCi0JICAgICAgIHx8IHJlYWwtPmtpbmQgPT0gREVCVUdfS0lORF9DTEFTUwotCSAgICAgICB8fCByZWFsLT5raW5kID09IERFQlVHX0tJTkRfVU5JT05fQ0xBU1MpCi0JICAgICAgJiYgcmVhbC0+dS5rY2xhc3MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChyZWFsLT51LmtjbGFzcy0+aWQgPD0gaW5mby0+YmFzZV9pZCkKLQkJewotCQkgIGlmICghIGRlYnVnX3NldF9jbGFzc19pZCAoaW5mbywKLQkJCQkJICAgIHR5cGUtPnUua25hbWVkLT5uYW1lLT5uYW1lLAotCQkJCQkgICAgcmVhbCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBpZCA9IHJlYWwtPnUua2NsYXNzLT5pZDsKLQkgICAgfQotCi0JICByZXR1cm4gKCpmbnMtPnRhZ190eXBlKSAoZmhhbmRsZSwgdHlwZS0+dS5rbmFtZWQtPm5hbWUtPm5hbWUsIGlkLAotCQkJCSAgIHJlYWwtPmtpbmQpOwotCX0KLSAgICB9Ci0KLSAgLyogTWFyayB0aGUgbmFtZSBhZnRlciB3ZSBoYXZlIGFscmVhZHkgbG9va2VkIGZvciBhIGtub3duIG5hbWUsIHNvCi0gICAgIHRoYXQgd2UgZG9uJ3QganVzdCBkZWZpbmUgYSB0eXBlIGluIHRlcm1zIG9mIGl0c2VsZi4gIFdlIG5lZWQgdG8KLSAgICAgbWFyayB0aGUgbmFtZSBoZXJlIHNvIHRoYXQgYSBzdHJ1Y3QgY29udGFpbmluZyBhIHBvaW50ZXIgdG8KLSAgICAgaXRzZWxmIHdpbGwgd29yay4gICovCi0gIGlmIChuYW1lICE9IE5VTEwpCi0gICAgbmFtZS0+bWFyayA9IGluZm8tPm1hcms7Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTAotICAgICAgJiYgdHlwZS0+a2luZCAhPSBERUJVR19LSU5EX05BTUVECi0gICAgICAmJiB0eXBlLT5raW5kICE9IERFQlVHX0tJTkRfVEFHR0VEKQotICAgIHsKLSAgICAgIGFzc2VydCAobmFtZS0+a2luZCA9PSBERUJVR19PQkpFQ1RfVEFHKTsKLSAgICAgIHRhZyA9IG5hbWUtPm5hbWU7Ci0gICAgfQotCi0gIHN3aXRjaCAodHlwZS0+a2luZCkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19LSU5EX0lMTEVHQUw6Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfd3JpdGVfdHlwZTogaWxsZWdhbCB0eXBlIGVuY291bnRlcmVkIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgREVCVUdfS0lORF9JTkRJUkVDVDoKLSAgICAgIGlmICgqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiAoKmZucy0+ZW1wdHlfdHlwZSkgKGZoYW5kbGUpOwotICAgICAgcmV0dXJuIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgKnR5cGUtPnUua2luZGlyZWN0LT5zbG90LAotCQkJICAgICAgIG5hbWUpOwotICAgIGNhc2UgREVCVUdfS0lORF9WT0lEOgotICAgICAgcmV0dXJuICgqZm5zLT52b2lkX3R5cGUpIChmaGFuZGxlKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfSU5UOgotICAgICAgcmV0dXJuICgqZm5zLT5pbnRfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnNpemUsIHR5cGUtPnUua2ludCk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0ZMT0FUOgotICAgICAgcmV0dXJuICgqZm5zLT5mbG9hdF90eXBlKSAoZmhhbmRsZSwgdHlwZS0+c2l6ZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0NPTVBMRVg6Ci0gICAgICByZXR1cm4gKCpmbnMtPmNvbXBsZXhfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnNpemUpOwotICAgIGNhc2UgREVCVUdfS0lORF9CT09MOgotICAgICAgcmV0dXJuICgqZm5zLT5ib29sX3R5cGUpIChmaGFuZGxlLCB0eXBlLT5zaXplKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTjoKLSAgICAgIGlmICh0eXBlLT51LmtjbGFzcyAhPSBOVUxMKQotCXsKLQkgIGlmICh0eXBlLT51LmtjbGFzcy0+aWQgPD0gaW5mby0+YmFzZV9pZCkKLQkgICAgewotCSAgICAgIGlmICghIGRlYnVnX3NldF9jbGFzc19pZCAoaW5mbywgdGFnLCB0eXBlKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChpbmZvLT5tYXJrID09IHR5cGUtPnUua2NsYXNzLT5tYXJrKQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlIGN1cnJlbnRseSBvdXRwdXR0aW5nIHRoaXMgc3RydWN0LCBvciB3ZSBoYXZlCi0JCSBhbHJlYWR5IG91dHB1dCBpdC4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGNhbiBoYXBwZW4sCi0JCSBidXQgaXQgY2FuIGhhcHBlbiBmb3IgYSBjbGFzcy4gICovCi0JICAgICAgYXNzZXJ0ICh0eXBlLT51LmtjbGFzcy0+aWQgPiBpbmZvLT5iYXNlX2lkKTsKLQkgICAgICByZXR1cm4gKCpmbnMtPnRhZ190eXBlKSAoZmhhbmRsZSwgdGFnLCB0eXBlLT51LmtjbGFzcy0+aWQsCi0JCQkJICAgICAgIHR5cGUtPmtpbmQpOwotCSAgICB9Ci0JICB0eXBlLT51LmtjbGFzcy0+bWFyayA9IGluZm8tPm1hcms7Ci0JfQotCi0gICAgICBpZiAoISAoKmZucy0+c3RhcnRfc3RydWN0X3R5cGUpIChmaGFuZGxlLCB0YWcsCi0JCQkJICAgICAgICh0eXBlLT51LmtjbGFzcyAhPSBOVUxMCi0JCQkJCT8gdHlwZS0+dS5rY2xhc3MtPmlkCi0JCQkJCTogMCksCi0JCQkJICAgICAgIHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9TVFJVQ1QsCi0JCQkJICAgICAgIHR5cGUtPnNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICh0eXBlLT51LmtjbGFzcyAhPSBOVUxMCi0JICAmJiB0eXBlLT51LmtjbGFzcy0+ZmllbGRzICE9IE5VTEwpCi0JewotCSAgZm9yIChpID0gMDsgdHlwZS0+dS5rY2xhc3MtPmZpZWxkc1tpXSAhPSBOVUxMOyBpKyspCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZGVidWdfZmllbGQgKmY7Ci0KLQkgICAgICBmID0gdHlwZS0+dS5rY2xhc3MtPmZpZWxkc1tpXTsKLQkgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIGYtPnR5cGUsCi0JCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpCi0JCSAgfHwgISAoKmZucy0+c3RydWN0X2ZpZWxkKSAoZmhhbmRsZSwgZi0+bmFtZSwgZi0+dS5mLmJpdHBvcywKLQkJCQkJICAgICBmLT51LmYuYml0c2l6ZSwgZi0+dmlzaWJpbGl0eSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiAoKmZucy0+ZW5kX3N0cnVjdF90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0NMQVNTOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTl9DTEFTUzoKLSAgICAgIHJldHVybiBkZWJ1Z193cml0ZV9jbGFzc190eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUsIHRhZyk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0VOVU06Ci0gICAgICBpZiAodHlwZS0+dS5rZW51bSA9PSBOVUxMKQotCXJldHVybiAoKmZucy0+ZW51bV90eXBlKSAoZmhhbmRsZSwgdGFnLCAoY29uc3QgY2hhciAqKikgTlVMTCwKLQkJCQkgIChiZmRfc2lnbmVkX3ZtYSAqKSBOVUxMKTsKLSAgICAgIHJldHVybiAoKmZucy0+ZW51bV90eXBlKSAoZmhhbmRsZSwgdGFnLCB0eXBlLT51LmtlbnVtLT5uYW1lcywKLQkJCQl0eXBlLT51LmtlbnVtLT52YWx1ZXMpOwotICAgIGNhc2UgREVCVUdfS0lORF9QT0lOVEVSOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51Lmtwb2ludGVyLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+cG9pbnRlcl90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0ZVTkNUSU9OOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAotCQkJICAgICAgdHlwZS0+dS5rZnVuY3Rpb24tPnJldHVybl90eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICh0eXBlLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzID09IE5VTEwpCi0JaXMgPSAtMTsKLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKGlzID0gMDsgdHlwZS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlc1tpc10gIT0gTlVMTDsgaXMrKykKLQkgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAotCQkJCSAgICB0eXBlLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzW2lzXSwKLQkJCQkgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICByZXR1cm4gKCpmbnMtPmZ1bmN0aW9uX3R5cGUpIChmaGFuZGxlLCBpcywKLQkJCQkgICAgdHlwZS0+dS5rZnVuY3Rpb24tPnZhcmFyZ3MpOwotICAgIGNhc2UgREVCVUdfS0lORF9SRUZFUkVOQ0U6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua3JlZmVyZW5jZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnJlZmVyZW5jZV90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX1JBTkdFOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtyYW5nZS0+dHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnJhbmdlX3R5cGUpIChmaGFuZGxlLCB0eXBlLT51LmtyYW5nZS0+bG93ZXIsCi0JCQkJIHR5cGUtPnUua3JhbmdlLT51cHBlcik7Ci0gICAgY2FzZSBERUJVR19LSU5EX0FSUkFZOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmthcnJheS0+ZWxlbWVudF90eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpCi0JICB8fCAhIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCQkgdHlwZS0+dS5rYXJyYXktPnJhbmdlX3R5cGUsCi0JCQkJIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPmFycmF5X3R5cGUpIChmaGFuZGxlLCB0eXBlLT51LmthcnJheS0+bG93ZXIsCi0JCQkJIHR5cGUtPnUua2FycmF5LT51cHBlciwKLQkJCQkgdHlwZS0+dS5rYXJyYXktPnN0cmluZ3ApOwotICAgIGNhc2UgREVCVUdfS0lORF9TRVQ6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua3NldC0+dHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnNldF90eXBlKSAoZmhhbmRsZSwgdHlwZS0+dS5rc2V0LT5iaXRzdHJpbmdwKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfT0ZGU0VUOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtvZmZzZXQtPmJhc2VfdHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKQotCSAgfHwgISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkJIHR5cGUtPnUua29mZnNldC0+dGFyZ2V0X3R5cGUsCi0JCQkJIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPm9mZnNldF90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX01FVEhPRDoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCSAgICAgIHR5cGUtPnUua21ldGhvZC0+cmV0dXJuX3R5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHR5cGUtPnUua21ldGhvZC0+YXJnX3R5cGVzID09IE5VTEwpCi0JaXMgPSAtMTsKLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKGlzID0gMDsgdHlwZS0+dS5rbWV0aG9kLT5hcmdfdHlwZXNbaXNdICE9IE5VTEw7IGlzKyspCi0JICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCQkgICAgdHlwZS0+dS5rbWV0aG9kLT5hcmdfdHlwZXNbaXNdLAotCQkJCSAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmICh0eXBlLT51LmttZXRob2QtPmRvbWFpbl90eXBlICE9IE5VTEwpCi0JewotCSAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAotCQkJCSAgdHlwZS0+dS5rbWV0aG9kLT5kb21haW5fdHlwZSwKLQkJCQkgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHJldHVybiAoKmZucy0+bWV0aG9kX3R5cGUpIChmaGFuZGxlLAotCQkJCSAgdHlwZS0+dS5rbWV0aG9kLT5kb21haW5fdHlwZSAhPSBOVUxMLAotCQkJCSAgaXMsCi0JCQkJICB0eXBlLT51LmttZXRob2QtPnZhcmFyZ3MpOwotICAgIGNhc2UgREVCVUdfS0lORF9DT05TVDoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rY29uc3QsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5jb25zdF90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX1ZPTEFUSUxFOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51Lmt2b2xhdGlsZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnZvbGF0aWxlX3R5cGUpIChmaGFuZGxlKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfTkFNRUQ6Ci0gICAgICByZXR1cm4gZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtuYW1lZC0+dHlwZSwKLQkJCSAgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCk7Ci0gICAgY2FzZSBERUJVR19LSU5EX1RBR0dFRDoKLSAgICAgIHJldHVybiBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua25hbWVkLT50eXBlLAotCQkJICAgICAgIHR5cGUtPnUua25hbWVkLT5uYW1lKTsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgYSBjbGFzcyB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3dyaXRlX2NsYXNzX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZSwgdGFnKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IGlkOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdnB0cmJhc2U7Ci0KLSAgaWYgKHR5cGUtPnUua2NsYXNzID09IE5VTEwpCi0gICAgewotICAgICAgaWQgPSAwOwotICAgICAgdnB0cmJhc2UgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh0eXBlLT51LmtjbGFzcy0+aWQgPD0gaW5mby0+YmFzZV9pZCkKLQl7Ci0JICBpZiAoISBkZWJ1Z19zZXRfY2xhc3NfaWQgKGluZm8sIHRhZywgdHlwZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5tYXJrID09IHR5cGUtPnUua2NsYXNzLT5tYXJrKQotCXsKLQkgIC8qIFdlIGFyZSBjdXJyZW50bHkgb3V0cHV0dGluZyB0aGlzIGNsYXNzLCBvciB3ZSBoYXZlCi0JICAgICBhbHJlYWR5IG91dHB1dCBpdC4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZXJlIGFyZQotCSAgICAgbWV0aG9kcyBmb3IgYW4gYW5vbnltb3VzIGNsYXNzLiAgKi8KLQkgIGFzc2VydCAodHlwZS0+dS5rY2xhc3MtPmlkID4gaW5mby0+YmFzZV9pZCk7Ci0JICByZXR1cm4gKCpmbnMtPnRhZ190eXBlKSAoZmhhbmRsZSwgdGFnLCB0eXBlLT51LmtjbGFzcy0+aWQsCi0JCQkJICAgdHlwZS0+a2luZCk7Ci0JfQotICAgICAgdHlwZS0+dS5rY2xhc3MtPm1hcmsgPSBpbmZvLT5tYXJrOwotICAgICAgaWQgPSB0eXBlLT51LmtjbGFzcy0+aWQ7Ci0KLSAgICAgIHZwdHJiYXNlID0gdHlwZS0+dS5rY2xhc3MtPnZwdHJiYXNlOwotICAgICAgaWYgKHZwdHJiYXNlICE9IE5VTEwgJiYgdnB0cmJhc2UgIT0gdHlwZSkKLQl7Ci0JICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHZwdHJiYXNlLAotCQkJCSAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISAoKmZucy0+c3RhcnRfY2xhc3NfdHlwZSkgKGZoYW5kbGUsIHRhZywgaWQsCi0JCQkJICB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfQ0xBU1MsCi0JCQkJICB0eXBlLT5zaXplLAotCQkJCSAgdnB0cmJhc2UgIT0gTlVMTCwKLQkJCQkgIHZwdHJiYXNlID09IHR5cGUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodHlwZS0+dS5rY2xhc3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MtPmZpZWxkcyAhPSBOVUxMKQotCXsKLQkgIGZvciAoaSA9IDA7IHR5cGUtPnUua2NsYXNzLT5maWVsZHNbaV0gIT0gTlVMTDsgaSsrKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGRlYnVnX2ZpZWxkICpmOwotCi0JICAgICAgZiA9IHR5cGUtPnUua2NsYXNzLT5maWVsZHNbaV07Ci0JICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBmLT50eXBlLAotCQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChmLT5zdGF0aWNfbWVtYmVyKQotCQl7Ci0JCSAgaWYgKCEgKCpmbnMtPmNsYXNzX3N0YXRpY19tZW1iZXIpIChmaGFuZGxlLCBmLT5uYW1lLAotCQkJCQkJICAgICBmLT51LnMucGh5c25hbWUsCi0JCQkJCQkgICAgIGYtPnZpc2liaWxpdHkpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKCEgKCpmbnMtPnN0cnVjdF9maWVsZCkgKGZoYW5kbGUsIGYtPm5hbWUsIGYtPnUuZi5iaXRwb3MsCi0JCQkJCSAgICAgIGYtPnUuZi5iaXRzaXplLCBmLT52aXNpYmlsaXR5KSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MtPmJhc2VjbGFzc2VzICE9IE5VTEwpCi0JewotCSAgZm9yIChpID0gMDsgdHlwZS0+dS5rY2xhc3MtPmJhc2VjbGFzc2VzW2ldICE9IE5VTEw7IGkrKykKLQkgICAgewotCSAgICAgIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKmI7Ci0KLQkgICAgICBiID0gdHlwZS0+dS5rY2xhc3MtPmJhc2VjbGFzc2VzW2ldOwotCSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgYi0+dHlwZSwKLQkJCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoISAoKmZucy0+Y2xhc3NfYmFzZWNsYXNzKSAoZmhhbmRsZSwgYi0+Yml0cG9zLCBiLT52aXJ0dWFsLAotCQkJCQkgICAgIGItPnZpc2liaWxpdHkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICh0eXBlLT51LmtjbGFzcy0+bWV0aG9kcyAhPSBOVUxMKQotCXsKLQkgIGZvciAoaSA9IDA7IHR5cGUtPnUua2NsYXNzLT5tZXRob2RzW2ldICE9IE5VTEw7IGkrKykKLQkgICAgewotCSAgICAgIHN0cnVjdCBkZWJ1Z19tZXRob2QgKm07Ci0JICAgICAgdW5zaWduZWQgaW50IGo7Ci0KLQkgICAgICBtID0gdHlwZS0+dS5rY2xhc3MtPm1ldGhvZHNbaV07Ci0JICAgICAgaWYgKCEgKCpmbnMtPmNsYXNzX3N0YXJ0X21ldGhvZCkgKGZoYW5kbGUsIG0tPm5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgZm9yIChqID0gMDsgbS0+dmFyaWFudHNbal0gIT0gTlVMTDsgaisrKQotCQl7Ci0JCSAgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICp2OwotCi0JCSAgdiA9IG0tPnZhcmlhbnRzW2pdOwotCQkgIGlmICh2LT5jb250ZXh0ICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdi0+Y29udGV4dCwKLQkJCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdi0+dHlwZSwKLQkJCQkJICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgaWYgKHYtPnZvZmZzZXQgIT0gVk9GRlNFVF9TVEFUSUNfTUVUSE9EKQotCQkgICAgewotCQkgICAgICBpZiAoISAoKmZucy0+Y2xhc3NfbWV0aG9kX3ZhcmlhbnQpIChmaGFuZGxlLCB2LT5waHlzbmFtZSwKLQkJCQkJCQkgIHYtPnZpc2liaWxpdHksCi0JCQkJCQkJICB2LT5jb25zdHAsCi0JCQkJCQkJICB2LT52b2xhdGlsZXAsCi0JCQkJCQkJICB2LT52b2Zmc2V0LAotCQkJCQkJCSAgdi0+Y29udGV4dCAhPSBOVUxMKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghICgqZm5zLT5jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQpIChmaGFuZGxlLAotCQkJCQkJCQkgdi0+cGh5c25hbWUsCi0JCQkJCQkJCSB2LT52aXNpYmlsaXR5LAotCQkJCQkJCQkgdi0+Y29uc3RwLAotCQkJCQkJCQkgdi0+dm9sYXRpbGVwKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlmICghICgqZm5zLT5jbGFzc19lbmRfbWV0aG9kKSAoZmhhbmRsZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuICgqZm5zLT5lbmRfY2xhc3NfdHlwZSkgKGZoYW5kbGUpOwotfQotCi0vKiBXcml0ZSBvdXQgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfd3JpdGVfZnVuY3Rpb24gKGluZm8sIGZucywgZmhhbmRsZSwgbmFtZSwgbGlua2FnZSwgZnVuY3Rpb24pCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKLSAgICAgUFRSIGZoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UgbGlua2FnZTsKLSAgICAgc3RydWN0IGRlYnVnX2Z1bmN0aW9uICpmdW5jdGlvbjsKLXsKLSAgc3RydWN0IGRlYnVnX3BhcmFtZXRlciAqcDsKLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpiOwotCi0gIGlmICghIGRlYnVnX3dyaXRlX2xpbmVub3MgKGluZm8sIGZucywgZmhhbmRsZSwgZnVuY3Rpb24tPmJsb2Nrcy0+c3RhcnQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIGZ1bmN0aW9uLT5yZXR1cm5fdHlwZSwKLQkJCSAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISAoKmZucy0+c3RhcnRfZnVuY3Rpb24pIChmaGFuZGxlLCBuYW1lLAotCQkJCWxpbmthZ2UgPT0gREVCVUdfTElOS0FHRV9HTE9CQUwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKHAgPSBmdW5jdGlvbi0+cGFyYW1ldGVyczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHAtPnR5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkKLQkgIHx8ICEgKCpmbnMtPmZ1bmN0aW9uX3BhcmFtZXRlcikgKGZoYW5kbGUsIHAtPm5hbWUsIHAtPmtpbmQsIHAtPnZhbCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBmb3IgKGIgPSBmdW5jdGlvbi0+YmxvY2tzOyBiICE9IE5VTEw7IGIgPSBiLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX2Jsb2NrIChpbmZvLCBmbnMsIGZoYW5kbGUsIGIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuICgqZm5zLT5lbmRfZnVuY3Rpb24pIChmaGFuZGxlKTsKLX0KLQotLyogV3JpdGUgb3V0IGluZm9ybWF0aW9uIGZvciBhIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3dyaXRlX2Jsb2NrIChpbmZvLCBmbnMsIGZoYW5kbGUsIGJsb2NrKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotICAgICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmJsb2NrOwotewotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpiOwotCi0gIGlmICghIGRlYnVnX3dyaXRlX2xpbmVub3MgKGluZm8sIGZucywgZmhhbmRsZSwgYmxvY2stPnN0YXJ0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSSBjYW4ndCBzZWUgYW55IHBvaW50IHRvIHdyaXRpbmcgb3V0IGEgYmxvY2sgd2l0aCBubyBsb2NhbAotICAgICB2YXJpYWJsZXMsIHNvIHdlIGRvbid0IGJvdGhlciwgZXhjZXB0IGZvciB0aGUgdG9wIGxldmVsIGJsb2NrLiAgKi8KLSAgaWYgKGJsb2NrLT5sb2NhbHMgIT0gTlVMTCB8fCBibG9jay0+cGFyZW50ID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCpmbnMtPnN0YXJ0X2Jsb2NrKSAoZmhhbmRsZSwgYmxvY2stPnN0YXJ0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChibG9jay0+bG9jYWxzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChuID0gYmxvY2stPmxvY2Fscy0+bGlzdDsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQl7Ci0JICBpZiAoISBkZWJ1Z193cml0ZV9uYW1lIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBmb3IgKGIgPSBibG9jay0+Y2hpbGRyZW47IGIgIT0gTlVMTDsgYiA9IGItPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfYmxvY2sgKGluZm8sIGZucywgZmhhbmRsZSwgYikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBkZWJ1Z193cml0ZV9saW5lbm9zIChpbmZvLCBmbnMsIGZoYW5kbGUsIGJsb2NrLT5lbmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmxvY2stPmxvY2FscyAhPSBOVUxMIHx8IGJsb2NrLT5wYXJlbnQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKmZucy0+ZW5kX2Jsb2NrKSAoZmhhbmRsZSwgYmxvY2stPmVuZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIHVwIHRvIEFERFJFU1MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfd3JpdGVfbGluZW5vcyAoaW5mbywgZm5zLCBmaGFuZGxlLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIHdoaWxlIChpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVubyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBkZWJ1Z19saW5lbm8gKmw7Ci0KLSAgICAgIGwgPSBpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVubzsKLQotICAgICAgd2hpbGUgKGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4IDwgREVCVUdfTElORU5PX0NPVU5UKQotCXsKLQkgIGlmIChsLT5saW5lbm9zW2luZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4XQotCSAgICAgID09ICh1bnNpZ25lZCBsb25nKSAtMSkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChsLT5hZGRyc1tpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleF0gPj0gYWRkcmVzcykKLQkgICAgcmV0dXJuIHRydWU7Ci0KLQkgIGlmICghICgqZm5zLT5saW5lbm8pIChmaGFuZGxlLCBsLT5maWxlLT5maWxlbmFtZSwKLQkJCQlsLT5saW5lbm9zW2luZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4XSwKLQkJCQlsLT5hZGRyc1tpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleF0pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICsraW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXg7Ci0JfQotCi0gICAgICBpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVubyA9IGwtPm5leHQ7Ci0gICAgICBpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleCA9IDA7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHZXQgdGhlIElEIG51bWJlciBmb3IgYSBjbGFzcy4gIElmIGR1cmluZyB0aGUgc2FtZSBjYWxsIHRvCi0gICBkZWJ1Z193cml0ZSB3ZSBmaW5kIGEgc3RydWN0IHdpdGggdGhlIHNhbWUgZGVmaW5pdGlvbiB3aXRoIHRoZSBzYW1lCi0gICBuYW1lLCB3ZSB1c2UgdGhlIHNhbWUgSUQuICBUaGlzIHR5cGUgb2YgdGhpbmdzIGhhcHBlbnMgYmVjYXVzZSB0aGUKLSAgIHNhbWUgc3RydWN0IHdpbGwgYmUgZGVmaW5lZCBieSBtdWx0aXBsZSBjb21waWxhdGlvbiB1bml0cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z19zZXRfY2xhc3NfaWQgKGluZm8sIHRhZywgdHlwZSkKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKmM7Ci0gIHN0cnVjdCBkZWJ1Z19jbGFzc19pZCAqbDsKLQotICBhc3NlcnQgKHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9TVFJVQ1QKLQkgIHx8IHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9VTklPTgotCSAgfHwgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX0NMQVNTCi0JICB8fCB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVU5JT05fQ0xBU1MpOwotCi0gIGMgPSB0eXBlLT51LmtjbGFzczsKLQotICBpZiAoYy0+aWQgPiBpbmZvLT5iYXNlX2lkKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAobCA9IGluZm8tPmlkX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPnR5cGUtPmtpbmQgIT0gdHlwZS0+a2luZCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKHRhZyA9PSBOVUxMKQotCXsKLQkgIGlmIChsLT50YWcgIT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChsLT50YWcgPT0gTlVMTAotCSAgICAgIHx8IGwtPnRhZ1swXSAhPSB0YWdbMF0KLQkgICAgICB8fCBzdHJjbXAgKGwtPnRhZywgdGFnKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCBsLT50eXBlLCB0eXBlKSkKLQl7Ci0JICBjLT5pZCA9IGwtPnR5cGUtPnUua2NsYXNzLT5pZDsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlcmUgYXJlIG5vIGlkZW50aWNhbCB0eXBlcy4gIFVzZSBhIG5ldyBJRCwgYW5kIGFkZCBpdCB0byB0aGUKLSAgICAgbGlzdC4gICovCi0gICsraW5mby0+Y2xhc3NfaWQ7Ci0gIGMtPmlkID0gaW5mby0+Y2xhc3NfaWQ7Ci0KLSAgbCA9IChzdHJ1Y3QgZGVidWdfY2xhc3NfaWQgKikgeG1hbGxvYyAoc2l6ZW9mICpsKTsKLSAgbWVtc2V0IChsLCAwLCBzaXplb2YgKmwpOwotCi0gIGwtPnR5cGUgPSB0eXBlOwotICBsLT50YWcgPSB0YWc7Ci0KLSAgbC0+bmV4dCA9IGluZm8tPmlkX2xpc3Q7Ci0gIGluZm8tPmlkX2xpc3QgPSBsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgaWYgdHdvIHR5cGVzIGFyZSB0aGUgc2FtZS4gIEF0IHRoaXMgcG9pbnQsIHdlIGRvbid0IGNhcmUgYWJvdXQKLSAgIHRhZ3MgYW5kIHRoZSBsaWtlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLCB0MikKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnQxOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z190eXBlX2NvbXBhcmVfbGlzdCAqbDsKLSAgc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0IHRvcDsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgaWYgKHQxID09IE5VTEwpCi0gICAgcmV0dXJuIHQyID09IE5VTEw7Ci0gIGlmICh0MiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICB3aGlsZSAodDEtPmtpbmQgPT0gREVCVUdfS0lORF9JTkRJUkVDVCkKLSAgICB7Ci0gICAgICB0MSA9ICp0MS0+dS5raW5kaXJlY3QtPnNsb3Q7Ci0gICAgICBpZiAodDEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICB3aGlsZSAodDItPmtpbmQgPT0gREVCVUdfS0lORF9JTkRJUkVDVCkKLSAgICB7Ci0gICAgICB0MiA9ICp0Mi0+dS5raW5kaXJlY3QtPnNsb3Q7Ci0gICAgICBpZiAodDIgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICh0MSA9PSB0MikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBcyBhIHNwZWNpYWwgY2FzZSwgcGVybWl0IGEgdHlwZWRlZiB0byBtYXRjaCBhIHRhZywgc2luY2UgQysrCi0gICAgIGRlYnVnZ2luZyBvdXRwdXQgd2lsbCBzb21ldGltZXMgYWRkIGEgdHlwZWRlZiB3aGVyZSBDIGRlYnVnZ2luZwotICAgICBvdXRwdXQgd2lsbCBub3QuICAqLwotICBpZiAodDEtPmtpbmQgPT0gREVCVUdfS0lORF9OQU1FRAotICAgICAgJiYgdDItPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQpCi0gICAgcmV0dXJuIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtuYW1lZC0+dHlwZSwgdDIpOwotICBlbHNlIGlmICh0MS0+a2luZCA9PSBERUJVR19LSU5EX1RBR0dFRAotCSAgICYmIHQyLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQpCi0gICAgcmV0dXJuIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLCB0Mi0+dS5rbmFtZWQtPnR5cGUpOwotCi0gIGlmICh0MS0+a2luZCAhPSB0Mi0+a2luZAotICAgICAgfHwgdDEtPnNpemUgIT0gdDItPnNpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdldCByaWQgb2YgdGhlIHRyaXZpYWwgY2FzZXMgZmlyc3QuICAqLwotICBzd2l0Y2ggKHQxLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19LSU5EX1ZPSUQ6Ci0gICAgY2FzZSBERUJVR19LSU5EX0ZMT0FUOgotICAgIGNhc2UgREVCVUdfS0lORF9DT01QTEVYOgotICAgIGNhc2UgREVCVUdfS0lORF9CT09MOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBERUJVR19LSU5EX0lOVDoKLSAgICAgIHJldHVybiB0MS0+dS5raW50ID09IHQyLT51LmtpbnQ7Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgdG8gYXZvaWQgYW4gaW5maW5pdGUgcmVjdXJzaW9uLiAgV2UgZG8gdGhpcyBieSBrZWVwaW5nIGEKLSAgICAgbGlzdCBvZiB0eXBlcyB3aGljaCB3ZSBhcmUgY29tcGFyaW5nLiAgV2UganVzdCBrZWVwIHRoZSBsaXN0IG9uCi0gICAgIHRoZSBzdGFjay4gIElmIHdlIGVuY291bnRlciBhIHBhaXIgb2YgdHlwZXMgd2UgYXJlIGN1cnJlbnRseQotICAgICBjb21wYXJpbmcsIHdlIGp1c3QgYXNzdW1lIHRoYXQgdGhleSBhcmUgZXF1YWwuICAqLwotICBmb3IgKGwgPSBpbmZvLT5jb21wYXJlX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPnQxID09IHQxICYmIGwtPnQyID09IHQyKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICB0b3AudDEgPSB0MTsKLSAgdG9wLnQyID0gdDI7Ci0gIHRvcC5uZXh0ID0gaW5mby0+Y29tcGFyZV9saXN0OwotICBpbmZvLT5jb21wYXJlX2xpc3QgPSAmdG9wOwotCi0gIHN3aXRjaCAodDEtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTjoKLSAgICBjYXNlIERFQlVHX0tJTkRfQ0xBU1M6Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OX0NMQVNTOgotICAgICAgaWYgKHQxLT51LmtjbGFzcyA9PSBOVUxMKQotCXJldCA9IHQyLT51LmtjbGFzcyA9PSBOVUxMOwotICAgICAgZWxzZSBpZiAodDItPnUua2NsYXNzID09IE5VTEwpCi0JcmV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICh0MS0+dS5rY2xhc3MtPmlkID4gaW5mby0+YmFzZV9pZAotCSAgICAgICAmJiB0MS0+dS5rY2xhc3MtPmlkID09IHQyLT51LmtjbGFzcy0+aWQpCi0JcmV0ID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQlyZXQgPSBkZWJ1Z19jbGFzc190eXBlX3NhbWVwIChpbmZvLCB0MSwgdDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfRU5VTToKLSAgICAgIGlmICh0MS0+dS5rZW51bSA9PSBOVUxMKQotCXJldCA9IHQyLT51LmtlbnVtID09IE5VTEw7Ci0gICAgICBlbHNlIGlmICh0Mi0+dS5rZW51bSA9PSBOVUxMKQotCXJldCA9IGZhbHNlOwotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKipwbjEsICoqcG4yOwotCSAgYmZkX3NpZ25lZF92bWEgKnB2MSwgKnB2MjsKLQotCSAgcG4xID0gdDEtPnUua2VudW0tPm5hbWVzOwotCSAgcG4yID0gdDItPnUua2VudW0tPm5hbWVzOwotCSAgcHYxID0gdDEtPnUua2VudW0tPnZhbHVlczsKLQkgIHB2MiA9IHQyLT51LmtlbnVtLT52YWx1ZXM7Ci0JICB3aGlsZSAoKnBuMSAhPSBOVUxMICYmICpwbjIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICgqKnBuMSAhPSAqKnBuMgotCQkgIHx8ICpwdjEgIT0gKnB2MgotCQkgIHx8IHN0cmNtcCAoKnBuMSwgKnBuMikgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgKytwbjE7Ci0JICAgICAgKytwbjI7Ci0JICAgICAgKytwdjE7Ci0JICAgICAgKytwdjI7Ci0JICAgIH0KLQkgIHJldCA9ICpwbjEgPT0gTlVMTCAmJiAqcG4yID09IE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfUE9JTlRFUjoKLSAgICAgIHJldCA9IGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51Lmtwb2ludGVyLCB0Mi0+dS5rcG9pbnRlcik7Ci0gICAgICBicmVhazsKLQkgICAgIAotICAgIGNhc2UgREVCVUdfS0lORF9GVU5DVElPTjoKLSAgICAgIGlmICh0MS0+dS5rZnVuY3Rpb24tPnZhcmFyZ3MgIT0gdDItPnUua2Z1bmN0aW9uLT52YXJhcmdzCi0JICB8fCAhIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtmdW5jdGlvbi0+cmV0dXJuX3R5cGUsCi0JCQkJIHQyLT51LmtmdW5jdGlvbi0+cmV0dXJuX3R5cGUpCi0JICB8fCAoKHQxLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzID09IE5VTEwpCi0JICAgICAgIT0gKHQyLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzID09IE5VTEwpKSkKLQlyZXQgPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKHQxLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzID09IE5VTEwpCi0JcmV0ID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfdHlwZSAqKmExLCAqKmEyOwotCi0JICBhMSA9IHQxLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzOwotCSAgYTIgPSB0Mi0+dS5rZnVuY3Rpb24tPmFyZ190eXBlczsKLQkgIHdoaWxlICgqYTEgIT0gTlVMTCAmJiAqYTIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sICphMSwgKmEyKSkKLQkJYnJlYWs7Ci0JICAgICAgKythMTsKLQkgICAgICArK2EyOwotCSAgICB9Ci0JICByZXQgPSAqYTEgPT0gTlVMTCAmJiAqYTIgPT0gTlVMTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9SRUZFUkVOQ0U6Ci0gICAgICByZXQgPSBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rcmVmZXJlbmNlLCB0Mi0+dS5rcmVmZXJlbmNlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1JBTkdFOgotICAgICAgcmV0ID0gKHQxLT51LmtyYW5nZS0+bG93ZXIgPT0gdDItPnUua3JhbmdlLT5sb3dlcgotCSAgICAgJiYgdDEtPnUua3JhbmdlLT51cHBlciA9PSB0Mi0+dS5rcmFuZ2UtPnVwcGVyCi0JICAgICAmJiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rcmFuZ2UtPnR5cGUsCi0JCQkJICB0Mi0+dS5rcmFuZ2UtPnR5cGUpKTsKLQotICAgIGNhc2UgREVCVUdfS0lORF9BUlJBWToKLSAgICAgIHJldCA9ICh0MS0+dS5rYXJyYXktPmxvd2VyID09IHQyLT51LmthcnJheS0+bG93ZXIKLQkgICAgICYmIHQxLT51LmthcnJheS0+dXBwZXIgPT0gdDItPnUua2FycmF5LT51cHBlcgotCSAgICAgJiYgdDEtPnUua2FycmF5LT5zdHJpbmdwID09IHQyLT51LmthcnJheS0+c3RyaW5ncAotCSAgICAgJiYgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua2FycmF5LT5lbGVtZW50X3R5cGUsCi0JCQkJICB0Mi0+dS5rYXJyYXktPmVsZW1lbnRfdHlwZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfU0VUOgotICAgICAgcmV0ID0gKHQxLT51LmtzZXQtPmJpdHN0cmluZ3AgPT0gdDItPnUua3NldC0+Yml0c3RyaW5ncAotCSAgICAgJiYgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua3NldC0+dHlwZSwgdDItPnUua3NldC0+dHlwZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfT0ZGU0VUOgotICAgICAgcmV0ID0gKGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtvZmZzZXQtPmJhc2VfdHlwZSwKLQkJCSAgICAgICB0Mi0+dS5rb2Zmc2V0LT5iYXNlX3R5cGUpCi0JICAgICAmJiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rb2Zmc2V0LT50YXJnZXRfdHlwZSwKLQkJCQkgIHQyLT51LmtvZmZzZXQtPnRhcmdldF90eXBlKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9NRVRIT0Q6Ci0gICAgICBpZiAodDEtPnUua21ldGhvZC0+dmFyYXJncyAhPSB0Mi0+dS5rbWV0aG9kLT52YXJhcmdzCi0JICB8fCAhIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmttZXRob2QtPnJldHVybl90eXBlLAotCQkJCSB0Mi0+dS5rbWV0aG9kLT5yZXR1cm5fdHlwZSkKLQkgIHx8ICEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua21ldGhvZC0+ZG9tYWluX3R5cGUsCi0JCQkJIHQyLT51LmttZXRob2QtPmRvbWFpbl90eXBlKQotCSAgfHwgKCh0MS0+dS5rbWV0aG9kLT5hcmdfdHlwZXMgPT0gTlVMTCkKLQkgICAgICAhPSAodDItPnUua21ldGhvZC0+YXJnX3R5cGVzID09IE5VTEwpKSkKLQlyZXQgPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKHQxLT51LmttZXRob2QtPmFyZ190eXBlcyA9PSBOVUxMKQotCXJldCA9IHRydWU7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGRlYnVnX3R5cGUgKiphMSwgKiphMjsKLQotCSAgYTEgPSB0MS0+dS5rbWV0aG9kLT5hcmdfdHlwZXM7Ci0JICBhMiA9IHQyLT51LmttZXRob2QtPmFyZ190eXBlczsKLQkgIHdoaWxlICgqYTEgIT0gTlVMTCAmJiAqYTIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sICphMSwgKmEyKSkKLQkJYnJlYWs7Ci0JICAgICAgKythMTsKLQkgICAgICArK2EyOwotCSAgICB9Ci0JICByZXQgPSAqYTEgPT0gTlVMTCAmJiAqYTIgPT0gTlVMTDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9DT05TVDoKLSAgICAgIHJldCA9IGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51Lmtjb25zdCwgdDItPnUua2NvbnN0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1ZPTEFUSUxFOgotICAgICAgcmV0ID0gZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua3ZvbGF0aWxlLCB0Mi0+dS5rdm9sYXRpbGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfTkFNRUQ6Ci0gICAgY2FzZSBERUJVR19LSU5EX1RBR0dFRDoKLSAgICAgIHJldCA9IChzdHJjbXAgKHQxLT51LmtuYW1lZC0+bmFtZS0+bmFtZSwgdDItPnUua25hbWVkLT5uYW1lLT5uYW1lKSA9PSAwCi0JICAgICAmJiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rbmFtZWQtPnR5cGUsCi0JCQkJICB0Mi0+dS5rbmFtZWQtPnR5cGUpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpbmZvLT5jb21wYXJlX2xpc3QgPSB0b3AubmV4dDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBTZWUgaWYgdHdvIGNsYXNzZXMgYXJlIHRoZSBzYW1lLiAgVGhpcyBpcyBhIHN1YnJvdXRpbmUgb2YKLSAgIGRlYnVnX3R5cGVfc2FtZXAuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfY2xhc3NfdHlwZV9zYW1lcCAoaW5mbywgdDEsIHQyKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDE7Ci0gICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0MjsKLXsKLSAgc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKmMxLCAqYzI7Ci0KLSAgYzEgPSB0MS0+dS5rY2xhc3M7Ci0gIGMyID0gdDItPnUua2NsYXNzOwotCi0gIGlmICgoYzEtPmZpZWxkcyA9PSBOVUxMKSAhPSAoYzItPmZpZWxkcyA9PSBOVUxMKQotICAgICAgfHwgKGMxLT5iYXNlY2xhc3NlcyA9PSBOVUxMKSAhPSAoYzItPmJhc2VjbGFzc2VzID09IE5VTEwpCi0gICAgICB8fCAoYzEtPm1ldGhvZHMgPT0gTlVMTCkgIT0gKGMyLT5tZXRob2RzID09IE5VTEwpCi0gICAgICB8fCAoYzEtPnZwdHJiYXNlID09IE5VTEwpICE9IChjMi0+dnB0cmJhc2UgPT0gTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjMS0+ZmllbGRzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGRlYnVnX2ZpZWxkICoqcGYxLCAqKnBmMjsKLQotICAgICAgZm9yIChwZjEgPSBjMS0+ZmllbGRzLCBwZjIgPSBjMi0+ZmllbGRzOwotCSAgICpwZjEgIT0gTlVMTCAmJiAqcGYyICE9IE5VTEw7Ci0JICAgcGYxKyssIHBmMisrKQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19maWVsZCAqZjEsICpmMjsKLQotCSAgZjEgPSAqcGYxOwotCSAgZjIgPSAqcGYyOwotCSAgaWYgKGYxLT5uYW1lWzBdICE9IGYyLT5uYW1lWzBdCi0JICAgICAgfHwgZjEtPnZpc2liaWxpdHkgIT0gZjItPnZpc2liaWxpdHkKLQkgICAgICB8fCBmMS0+c3RhdGljX21lbWJlciAhPSBmMi0+c3RhdGljX21lbWJlcikKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGYxLT5zdGF0aWNfbWVtYmVyKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAoZjEtPnUucy5waHlzbmFtZSwgZjItPnUucy5waHlzbmFtZSkgIT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoZjEtPnUuZi5iaXRwb3MgIT0gZjItPnUuZi5iaXRwb3MKLQkJICB8fCBmMS0+dS5mLmJpdHNpemUgIT0gZjItPnUuZi5iaXRzaXplKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIC8qIFdlIGRvIHRoZSBjaGVja3Mgd2hpY2ggcmVxdWlyZSBmdW5jdGlvbiBjYWxscyBsYXN0LiAgV2UKLSAgICAgICAgICAgICBkb24ndCByZXF1aXJlIHRoYXQgdGhlIHR5cGVzIG9mIGZpZWxkcyBoYXZlIHRoZSBzYW1lCi0gICAgICAgICAgICAgbmFtZXMsIHNpbmNlIHRoYXQgc29tZXRpbWVzIGZhaWxzIGluIHRoZSBwcmVzZW5jZSBvZgotICAgICAgICAgICAgIHR5cGVkZWZzIGFuZCB3ZSByZWFsbHkgZG9uJ3QgY2FyZS4gICovCi0JICBpZiAoc3RyY21wIChmMS0+bmFtZSwgZjItPm5hbWUpICE9IDAKLQkgICAgICB8fCAhIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sCi0JCQkJICAgICBkZWJ1Z19nZXRfcmVhbF90eXBlICgoUFRSKSBpbmZvLAotCQkJCQkJCSAgZjEtPnR5cGUsIE5VTEwpLAotCQkJCSAgICAgZGVidWdfZ2V0X3JlYWxfdHlwZSAoKFBUUikgaW5mbywKLQkJCQkJCQkgIGYyLT50eXBlLCBOVUxMKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoKnBmMSAhPSBOVUxMIHx8ICpwZjIgIT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChjMS0+dnB0cmJhc2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCBjMS0+dnB0cmJhc2UsIGMyLT52cHRyYmFzZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYzEtPmJhc2VjbGFzc2VzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGRlYnVnX2Jhc2VjbGFzcyAqKnBiMSwgKipwYjI7Ci0KLSAgICAgIGZvciAocGIxID0gYzEtPmJhc2VjbGFzc2VzLCBwYjIgPSBjMi0+YmFzZWNsYXNzZXM7Ci0JICAgKnBiMSAhPSBOVUxMICYmICpwYjIgIT0gTlVMTDsKLQkgICArK3BiMSwgKytwYjIpCi0JewotCSAgc3RydWN0IGRlYnVnX2Jhc2VjbGFzcyAqYjEsICpiMjsKLQotCSAgYjEgPSAqcGIxOwotCSAgYjIgPSAqcGIyOwotCSAgaWYgKGIxLT5iaXRwb3MgIT0gYjItPmJpdHBvcwotCSAgICAgIHx8IGIxLT52aXJ0dWFsICE9IGIyLT52aXJ0dWFsCi0JICAgICAgfHwgYjEtPnZpc2liaWxpdHkgIT0gYjItPnZpc2liaWxpdHkKLQkgICAgICB8fCAhIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIGIxLT50eXBlLCBiMi0+dHlwZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoKnBiMSAhPSBOVUxMIHx8ICpwYjIgIT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChjMS0+bWV0aG9kcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBkZWJ1Z19tZXRob2QgKipwbTEsICoqcG0yOwotCi0gICAgICBmb3IgKHBtMSA9IGMxLT5tZXRob2RzLCBwbTIgPSBjMi0+bWV0aG9kczsKLQkgICAqcG0xICE9IE5VTEwgJiYgKnBtMiAhPSBOVUxMOwotCSAgICsrcG0xLCArK3BtMikKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfbWV0aG9kICptMSwgKm0yOwotCi0JICBtMSA9ICpwbTE7Ci0JICBtMiA9ICpwbTI7Ci0JICBpZiAobTEtPm5hbWVbMF0gIT0gbTItPm5hbWVbMF0KLQkgICAgICB8fCBzdHJjbXAgKG0xLT5uYW1lLCBtMi0+bmFtZSkgIT0gMAotCSAgICAgIHx8IChtMS0+dmFyaWFudHMgPT0gTlVMTCkgIT0gKG0yLT52YXJpYW50cyA9PSBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKG0xLT52YXJpYW50cyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICoqcHYxLCAqKnB2MjsKLQotCSAgICAgIGZvciAocHYxID0gbTEtPnZhcmlhbnRzLCBwdjIgPSBtMi0+dmFyaWFudHM7Ci0JCSAgICpwdjEgIT0gTlVMTCAmJiAqcHYyICE9IE5VTEw7Ci0JCSAgICsrcHYxLCArK3B2MikKLQkJewotCQkgIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqdjEsICp2MjsKLQotCQkgIHYxID0gKnB2MTsKLQkJICB2MiA9ICpwdjI7Ci0JCSAgaWYgKHYxLT5waHlzbmFtZVswXSAhPSB2Mi0+cGh5c25hbWVbMF0KLQkJICAgICAgfHwgdjEtPnZpc2liaWxpdHkgIT0gdjItPnZpc2liaWxpdHkKLQkJICAgICAgfHwgdjEtPmNvbnN0cCAhPSB2Mi0+Y29uc3RwCi0JCSAgICAgIHx8IHYxLT52b2xhdGlsZXAgIT0gdjItPnZvbGF0aWxlcAotCQkgICAgICB8fCB2MS0+dm9mZnNldCAhPSB2Mi0+dm9mZnNldAotCQkgICAgICB8fCAodjEtPmNvbnRleHQgPT0gTlVMTCkgIT0gKHYyLT5jb250ZXh0ID09IE5VTEwpCi0JCSAgICAgIHx8IHN0cmNtcCAodjEtPnBoeXNuYW1lLCB2Mi0+cGh5c25hbWUpICE9IDAKLQkJICAgICAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB2MS0+dHlwZSwgdjItPnR5cGUpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGlmICh2MS0+Y29udGV4dCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBpZiAoISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB2MS0+Y29udGV4dCwKLQkJCQkJICAgICAgdjItPmNvbnRleHQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0JICAgICAgaWYgKCpwdjEgIT0gTlVMTCB8fCAqcHYyICE9IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGlmICgqcG0xICE9IE5VTEwgfHwgKnBtMiAhPSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9kZWJ1Zy5oIGIvYmludXRpbHMvZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4OTBiMi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzk4ICswLDAgQEAKLS8qIGRlYnVnLmggLS0gRGVzY3JpYmUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBERUJVR19ICi0jZGVmaW5lIERFQlVHX0gKLQotLyogVGhpcyBoZWFkZXIgZmlsZSBkZXNjcmliZXMgYSBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3JtYXQuCi0gICBXZSBtYXkgZXZlbnR1YWxseSBoYXZlIHJlYWRlcnMgd2hpY2ggY29udmVydCBkaWZmZXJlbnQgZm9ybWF0cyBpbnRvCi0gICB0aGlzIGdlbmVyaWMgZm9ybWF0LCBhbmQgd3JpdGVycyB3aGljaCB3cml0ZSBpdCBvdXQuICBUaGUgaW5pdGlhbAotICAgaW1wZXR1cyBmb3IgdGhpcyB3YXMgd3JpdGluZyBhIGNvbnZlcnRvciBmcm9tIHN0YWJzIHRvIEhQIElFRUUtNjk1Ci0gICBkZWJ1Z2dpbmcgZm9ybWF0LiAgKi8KLQotLyogRGlmZmVyZW50IGtpbmRzIG9mIHR5cGVzLiAgKi8KLQotZW51bSBkZWJ1Z190eXBlX2tpbmQKLXsKLSAgLyogTm90IHVzZWQuICAqLwotICBERUJVR19LSU5EX0lMTEVHQUwsCi0gIC8qIEluZGlyZWN0IHZpYSBhIHBvaW50ZXIuICAqLwotICBERUJVR19LSU5EX0lORElSRUNULAotICAvKiBWb2lkLiAgKi8KLSAgREVCVUdfS0lORF9WT0lELAotICAvKiBJbnRlZ2VyLiAgKi8KLSAgREVCVUdfS0lORF9JTlQsCi0gIC8qIEZsb2F0aW5nIHBvaW50LiAgKi8KLSAgREVCVUdfS0lORF9GTE9BVCwKLSAgLyogQ29tcGxleC4gICovCi0gIERFQlVHX0tJTkRfQ09NUExFWCwKLSAgLyogQm9vbGVhbi4gICovCi0gIERFQlVHX0tJTkRfQk9PTCwKLSAgLyogU3RydWN0LiAgKi8KLSAgREVCVUdfS0lORF9TVFJVQ1QsCi0gIC8qIFVuaW9uLiAgKi8KLSAgREVCVUdfS0lORF9VTklPTiwKLSAgLyogQ2xhc3MuICAqLwotICBERUJVR19LSU5EX0NMQVNTLAotICAvKiBVbmlvbiBjbGFzcyAoY2FuIHRoaXMgcmVhbGx5IGhhcHBlbj8pLiAgKi8KLSAgREVCVUdfS0lORF9VTklPTl9DTEFTUywKLSAgLyogRW51bWVyYXRpb24gdHlwZS4gICovCi0gIERFQlVHX0tJTkRfRU5VTSwKLSAgLyogUG9pbnRlci4gICovCi0gIERFQlVHX0tJTkRfUE9JTlRFUiwKLSAgLyogRnVuY3Rpb24uICAqLwotICBERUJVR19LSU5EX0ZVTkNUSU9OLAotICAvKiBSZWZlcmVuY2UuICAqLwotICBERUJVR19LSU5EX1JFRkVSRU5DRSwKLSAgLyogUmFuZ2UuICAqLwotICBERUJVR19LSU5EX1JBTkdFLAotICAvKiBBcnJheS4gICovCi0gIERFQlVHX0tJTkRfQVJSQVksCi0gIC8qIFNldC4gICovCi0gIERFQlVHX0tJTkRfU0VULAotICAvKiBCYXNlZCBwb2ludGVyLiAgKi8KLSAgREVCVUdfS0lORF9PRkZTRVQsCi0gIC8qIE1ldGhvZC4gICovCi0gIERFQlVHX0tJTkRfTUVUSE9ELAotICAvKiBDb25zdCBxdWFsaWZpZWQgdHlwZS4gICovCi0gIERFQlVHX0tJTkRfQ09OU1QsCi0gIC8qIFZvbGF0aWxlIHF1YWxpZmllZCB0eXBlLiAgKi8KLSAgREVCVUdfS0lORF9WT0xBVElMRSwKLSAgLyogTmFtZWQgdHlwZS4gICovCi0gIERFQlVHX0tJTkRfTkFNRUQsCi0gIC8qIFRhZ2dlZCB0eXBlLiAgKi8KLSAgREVCVUdfS0lORF9UQUdHRUQKLX07Ci0KLS8qIERpZmZlcmVudCBraW5kcyBvZiB2YXJpYWJsZXMuICAqLwotCi1lbnVtIGRlYnVnX3Zhcl9raW5kCi17Ci0gIC8qIE5vdCB1c2VkLiAgKi8KLSAgREVCVUdfVkFSX0lMTEVHQUwsCi0gIC8qIEEgZ2xvYmFsIHZhcmlhYmxlLiAgKi8KLSAgREVCVUdfR0xPQkFMLAotICAvKiBBIHN0YXRpYyB2YXJpYWJsZS4gICovCi0gIERFQlVHX1NUQVRJQywKLSAgLyogQSBsb2NhbCBzdGF0aWMgdmFyaWFibGUuICAqLwotICBERUJVR19MT0NBTF9TVEFUSUMsCi0gIC8qIEEgbG9jYWwgdmFyaWFibGUuICAqLwotICBERUJVR19MT0NBTCwKLSAgLyogQSByZWdpc3RlciB2YXJpYWJsZS4gICovCi0gIERFQlVHX1JFR0lTVEVSCi19OwotCi0vKiBEaWZmZXJlbnQga2luZHMgb2YgZnVuY3Rpb24gcGFyYW1ldGVycy4gICovCi0KLWVudW0gZGVidWdfcGFybV9raW5kCi17Ci0gIC8qIE5vdCB1c2VkLiAgKi8KLSAgREVCVUdfUEFSTV9JTExFR0FMLAotICAvKiBBIHN0YWNrIGJhc2VkIHBhcmFtZXRlci4gICovCi0gIERFQlVHX1BBUk1fU1RBQ0ssCi0gIC8qIEEgcmVnaXN0ZXIgcGFyYW1ldGVyLiAgKi8KLSAgREVCVUdfUEFSTV9SRUcsCi0gIC8qIEEgc3RhY2sgYmFzZWQgcmVmZXJlbmNlIHBhcmFtZXRlci4gICovCi0gIERFQlVHX1BBUk1fUkVGRVJFTkNFLAotICAvKiBBIHJlZ2lzdGVyIHJlZmVyZW5jZSBwYXJhbWV0ZXIuICAqLwotICBERUJVR19QQVJNX1JFRl9SRUcKLX07Ci0KLS8qIERpZmZlcmVudCBraW5kcyBvZiB2aXNpYmlsaXR5LiAgKi8KLQotZW51bSBkZWJ1Z192aXNpYmlsaXR5Ci17Ci0gIC8qIEEgcHVibGljIGZpZWxkIChlLmcuLCBhIGZpZWxkIGluIGEgQyBzdHJ1Y3QpLiAgKi8KLSAgREVCVUdfVklTSUJJTElUWV9QVUJMSUMsCi0gIC8qIEEgcHJvdGVjdGVkIGZpZWxkLiAgKi8KLSAgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQsCi0gIC8qIEEgcHJpdmF0ZSBmaWVsZC4gICovCi0gIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURSwKLSAgLyogQSBmaWVsZCB3aGljaCBzaG91bGQgYmUgaWdub3JlZC4gICovCi0gIERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFCi19OwotCi0vKiBBIHR5cGUuICAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWJ1Z190eXBlICpkZWJ1Z190eXBlOwotCi0jZGVmaW5lIERFQlVHX1RZUEVfTlVMTCAoKGRlYnVnX3R5cGUpIE5VTEwpCi0KLS8qIEEgZmllbGQgaW4gYSBzdHJ1Y3Qgb3IgdW5pb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWJ1Z19maWVsZCAqZGVidWdfZmllbGQ7Ci0KLSNkZWZpbmUgREVCVUdfRklFTERfTlVMTCAoKGRlYnVnX2ZpZWxkKSBOVUxMKQotCi0vKiBBIGJhc2UgY2xhc3MgZm9yIGFuIG9iamVjdC4gICovCi0KLXR5cGVkZWYgc3RydWN0IGRlYnVnX2Jhc2VjbGFzcyAqZGVidWdfYmFzZWNsYXNzOwotCi0jZGVmaW5lIERFQlVHX0JBU0VDTEFTU19OVUxMICgoZGVidWdfYmFzZWNsYXNzKSBOVUxMKQotCi0vKiBBIG1ldGhvZCBvZiBhbiBvYmplY3QuICAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWJ1Z19tZXRob2QgKmRlYnVnX21ldGhvZDsKLQotI2RlZmluZSBERUJVR19NRVRIT0RfTlVMTCAoKGRlYnVnX21ldGhvZCkgTlVMTCkKLQotLyogVGhlIGFyZ3VtZW50cyB0byBhIG1ldGhvZCBmdW5jdGlvbiBvZiBhbiBvYmplY3QuICBUaGVzZSBpbmRpY2F0ZQotICAgd2hpY2ggbWV0aG9kIHRvIHJ1bi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICpkZWJ1Z19tZXRob2RfdmFyaWFudDsKLQotI2RlZmluZSBERUJVR19NRVRIT0RfVkFSSUFOVF9OVUxMICgoZGVidWdfbWV0aG9kX3ZhcmlhbnQpIE5VTEwpCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCB0byBkZWJ1Z193cml0ZS4gIEl0IGhvbGRzIGZ1bmN0aW9uCi0gICBwb2ludGVycyB0aGF0IGRlYnVnX3dyaXRlIHdpbGwgY2FsbCBiYXNlZCBvbiB0aGUgYWNjdW11bGF0ZWQKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBkZWJ1Z193cml0ZV9mbnMKLXsKLSAgLyogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggbmV3IGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB0aGUKLSAgICAgbmFtZSBvZiB0aGUgbWFpbiBmaWxlIGluIHRoZSBuZXcgdW5pdC4gICovCi0gIGJvb2xlYW4gKCpzdGFydF9jb21waWxhdGlvbl91bml0KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHdpdGhpbiBhCi0gICAgIGNvbXBpbGF0aW9uIHVuaXQsIGJlZm9yZSBvdXRwdXR0aW5nIGFueSBnbG9iYWwgaW5mb3JtYXRpb24gZm9yCi0gICAgIHRoYXQgZmlsZS4gIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gICovCi0gIGJvb2xlYW4gKCpzdGFydF9zb3VyY2UpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogRWFjaCB3cml0ZXIgbXVzdCBrZWVwIGEgc3RhY2sgb2YgdHlwZXMuICAqLwotCi0gIC8qIFB1c2ggYW4gZW1wdHkgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgVGhpcyB0eXBlIGNhbiBhcHBlYXIgaWYKLSAgICAgdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gYSB0eXBlIHdoaWNoIGlzIG5ldmVyIGRlZmluZWQuICAqLwotICBib29sZWFuICgqZW1wdHlfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUHVzaCBhIHZvaWQgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnZvaWRfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUHVzaCBhbiBpbnRlZ2VyIHR5cGUgb250byB0aGUgdHlwZSBzdGFjaywgZ2l2ZW4gdGhlIHNpemUgYW5kCi0gICAgIHdoZXRoZXIgaXQgaXMgdW5zaWduZWQuICAqLwotICBib29sZWFuICgqaW50X3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50LCBib29sZWFuKSk7Ci0KLSAgLyogUHVzaCBhIGZsb2F0aW5nIHR5cGUgb250byB0aGUgdHlwZSBzdGFjaywgZ2l2ZW4gdGhlIHNpemUuICAqLwotICBib29sZWFuICgqZmxvYXRfdHlwZSkgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLQotICAvKiBQdXNoIGEgY29tcGxleCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2ssIGdpdmVuIHRoZSBzaXplLiAgKi8KLSAgYm9vbGVhbiAoKmNvbXBsZXhfdHlwZSkgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLQotICAvKiBQdXNoIGEgYm9vbGVhbiB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2ssIGdpdmVuIHRoZSBzaXplLiAgKi8KLSAgYm9vbGVhbiAoKmJvb2xfdHlwZSkgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLQotICAvKiBQdXNoIGFuIGVudW0gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLCBnaXZlbiB0aGUgdGFnLCBhIE5VTEwKLSAgICAgdGVybWluYXRlZCBhcnJheSBvZiBuYW1lcyBhbmQgdGhlIGFzc29jaWF0ZWQgdmFsdWVzLiAgSWYgdGhlcmUgaXMKLSAgICAgbm8gdGFnLCB0aGUgdGFnIGFyZ3VtZW50IHdpbGwgYmUgTlVMTC4gIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkCi0gICAgIGVudW0sIHRoZSBuYW1lcyBhbmQgdmFsdWVzIGFyZ3VtZW50cyB3aWxsIGJlIE5VTEwuICAqLwotICBib29sZWFuICgqZW51bV90eXBlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwKLQkJCQliZmRfc2lnbmVkX3ZtYSAqKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvbiB0aGUgdHlwZSBzdGFjaywgYW5kIHB1c2ggYSBwb2ludGVyIHRvIHRoYXQKLSAgICAgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnBvaW50ZXJfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUHVzaCBhIGZ1bmN0aW9uIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gIFRoZSBzZWNvbmQgYXJndW1lbnQKLSAgICAgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYXJndW1lbnQgdHlwZXMgdGhhdCBoYXZlIGJlZW4gcHVzaGVkIG9udG8KLSAgICAgdGhlIHN0YWNrLiAgSWYgdGhlIG51bWJlciBvZiBhcmd1bWVudCB0eXBlcyBpcyBwYXNzZWQgYXMgLTEsIHRoZW4KLSAgICAgdGhlIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBmdW5jdGlvbiBhcmUgdW5rbm93biwgYW5kIG5vIHR5cGVzIGhhdmUKLSAgICAgYmVlbiBwdXNoZWQgb250byB0aGUgc3RhY2suICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGUKLSAgICAgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgVGhlIHJldHVybiB0eXBlCi0gICAgIG9mIHRoZSBmdW5jdGlvbiBpcyBwdXNoZWQgb250byB0aGUgdHlwZSBzdGFjayBiZWxvdyB0aGUgYXJndW1lbnQKLSAgICAgdHlwZXMsIGlmIGFueS4gICovCi0gIGJvb2xlYW4gKCpmdW5jdGlvbl90eXBlKSBQQVJBTVMgKChQVFIsIGludCwgYm9vbGVhbikpOwotCi0gIC8qIFBvcCB0aGUgdG9wIHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgcmVmZXJlbmNlIHRvIHRoYXQKLSAgICAgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnJlZmVyZW5jZV90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBQb3AgdGhlIHRvcCB0eXBlIG9uIHRoZSB0eXBlIHN0YWNrLCBhbmQgcHVzaCBhIHJhbmdlIG9mIHRoYXQgdHlwZQotICAgICB3aXRoIHRoZSBnaXZlbiBsb3dlciBhbmQgdXBwZXIgYm91bmRzIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqcmFuZ2VfdHlwZSkgUEFSQU1TICgoUFRSLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKLQotICAvKiBQdXNoIGFuIGFycmF5IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gIFRoZSB0b3AgdHlwZSBvbiB0aGUgdHlwZQotICAgICBzdGFjayBpcyB0aGUgcmFuZ2UsIGFuZCB0aGUgbmV4dCB0eXBlIG9uIHRoZSB0eXBlIHN0YWNrIGlzIHRoZQotICAgICBlbGVtZW50IHR5cGUuICBUaGVzZSBzaG91bGQgYmUgcG9wcGVkIGJlZm9yZSB0aGUgYXJyYXkgdHlwZSBpcwotICAgICBwdXNoZWQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgbG93ZXIgYm91bmQsIHRoZSB1cHBlciBib3VuZCwgYW5kCi0gICAgIHdoZXRoZXIgdGhlIGFycmF5IGlzIGEgc3RyaW5nLiAgKi8KLSAgYm9vbGVhbiAoKmFycmF5X3R5cGUpIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLAotCQkJCSBib29sZWFuKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvbiB0aGUgdHlwZSBzdGFjaywgYW5kIHB1c2ggYSBzZXQgb2YgdGhhdCB0eXBlCi0gICAgIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgYXJndW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBzZXQgaXMKLSAgICAgYSBiaXRzdHJpbmcuICAqLwotICBib29sZWFuICgqc2V0X3R5cGUpIFBBUkFNUyAoKFBUUiwgYm9vbGVhbikpOwotCi0gIC8qIFB1c2ggYW4gb2Zmc2V0IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gIFRoZSB0b3AgdHlwZSBvbiB0aGUKLSAgICAgdHlwZSBzdGFjayBpcyB0aGUgdGFyZ2V0IHR5cGUsIGFuZCB0aGUgbmV4dCB0eXBlIG9uIHRoZSB0eXBlCi0gICAgIHN0YWNrIGlzIHRoZSBiYXNlIHR5cGUuICBUaGVzZSBzaG91bGQgYmUgcG9wcGVkIGJlZm9yZSB0aGUgb2Zmc2V0Ci0gICAgIHR5cGUgaXMgcHVzaGVkLiAgKi8KLSAgYm9vbGVhbiAoKm9mZnNldF90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBQdXNoIGEgbWV0aG9kIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gIElmIHRoZSBzZWNvbmQgYXJndW1lbnQKLSAgICAgaXMgdHJ1ZSwgdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjayBpcyB0aGUgY2xhc3MgdG8gd2hpY2ggdGhlCi0gICAgIG1ldGhvZCBiZWxvbmdzOyBvdGhlcndpc2UsIHRoZSBjbGFzcyBtdXN0IGJlIGRldGVybWluZWQgYnkgdGhlCi0gICAgIGNsYXNzIHRvIHdoaWNoIHRoZSBtZXRob2QgaXMgYXR0YWNoZWQuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlCi0gICAgIG51bWJlciBvZiBhcmd1bWVudCB0eXBlczsgdGhlc2UgYXJlIHB1c2hlZCBvbnRvIHRoZSB0eXBlIHN0YWNrIGluCi0gICAgIHJldmVyc2Ugb3JkZXIgKHRoZSBmaXJzdCB0eXBlIHBvcHBlZCBpcyB0aGUgbGFzdCBhcmd1bWVudCB0byB0aGUKLSAgICAgbWV0aG9kKS4gIEEgdmFsdWUgb2YgLTEgZm9yIHRoZSB0aGlyZCBhcmd1bWVudCBtZWFucyB0aGF0IG5vCi0gICAgIGFyZ3VtZW50IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4gIFRoZSBmb3VydGggYXJndW1lbnQgaXMgdHJ1ZQotICAgICBpZiB0aGUgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgVGhlIG5leHQKLSAgICAgdHlwZSBvbiB0aGUgdHlwZSBzdGFjayBiZWxvdyB0aGUgZG9tYWluIGFuZCB0aGUgYXJndW1lbnQgdHlwZXMgaXMKLSAgICAgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QuICBBbGwgdGhlc2UgdHlwZXMgbXVzdCBiZSBwb3BwZWQsCi0gICAgIGFuZCB0aGVuIHRoZSBtZXRob2QgdHlwZSBtdXN0IGJlIHB1c2hlZC4gICovCi0gIGJvb2xlYW4gKCptZXRob2RfdHlwZSkgUEFSQU1TICgoUFRSLCBib29sZWFuLCBpbnQsIGJvb2xlYW4pKTsKLQotICAvKiBQb3AgdGhlIHRvcCB0eXBlIG9mZiB0aGUgdHlwZSBzdGFjaywgYW5kIHB1c2ggYSBjb25zdCBxdWFsaWZpZWQKLSAgICAgdmVyc2lvbiBvZiB0aGF0IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpjb25zdF90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBQb3AgdGhlIHRvcCB0eXBlIG9mZiB0aGUgdHlwZSBzdGFjaywgYW5kIHB1c2ggYSB2b2xhdGlsZQotICAgICBxdWFsaWZpZWQgdmVyc2lvbiBvZiB0aGF0IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCp2b2xhdGlsZV90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBTdGFydCBidWlsZGluZyBhIHN0cnVjdC4gIFRoaXMgaXMgZm9sbG93ZWQgYnkgY2FsbHMgdG8gdGhlCi0gICAgIHN0cnVjdF9maWVsZCBmdW5jdGlvbiwgYW5kIGZpbmlzaGVkIGJ5IGEgY2FsbCB0byB0aGUKLSAgICAgZW5kX3N0cnVjdF90eXBlIGZ1bmN0aW9uLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdGFnOyB0aGlzCi0gICAgIHdpbGwgYmUgTlVMTCBpZiB0aGVyZSBpc24ndCBvbmUuICBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIE5VTEwsCi0gICAgIHRoZSB0aGlyZCBhcmd1bWVudCBpcyBhIGNvbnN0YW50IGlkZW50aWZ5aW5nIHRoaXMgc3RydWN0IGZvciB1c2UKLSAgICAgd2l0aCB0YWdfdHlwZS4gIFRoZSBmb3VydGggYXJndW1lbnQgaXMgdHJ1ZSBmb3IgYSBzdHJ1Y3QsIGZhbHNlCi0gICAgIGZvciBhIHVuaW9uLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSBzaXplLiAgSWYgdGhpcyBpcyBhbgotICAgICB1bmRlZmluZWQgc3RydWN0IG9yIHVuaW9uLCB0aGUgc2l6ZSB3aWxsIGJlIDAgYW5kIHN0cnVjdF9maWVsZAotICAgICB3aWxsIG5vdCBiZSBjYWxsZWQgYmVmb3JlIGVuZF9zdHJ1Y3RfdHlwZSBpcyBjYWxsZWQuICAqLwotICBib29sZWFuICgqc3RhcnRfc3RydWN0X3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJCWJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotCi0gIC8qIEFkZCBhIGZpZWxkIHRvIHRoZSBzdHJ1Y3QgdHlwZSBjdXJyZW50bHkgYmVpbmcgYnVpbHQuICBUaGUgdHlwZQotICAgICBvZiB0aGUgZmllbGQgc2hvdWxkIGJlIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICBUaGUgYXJndW1lbnRzCi0gICAgIGFyZSB0aGUgbmFtZSwgdGhlIGJpdCBwb3NpdGlvbiwgdGhlIGJpdCBzaXplIChtYXkgYmUgemVybyBpZiB0aGUKLSAgICAgZmllbGQgaXMgbm90IHBhY2tlZCksIGFuZCB0aGUgdmlzaWJpbGl0eS4gICovCi0gIGJvb2xlYW4gKCpzdHJ1Y3RfZmllbGQpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hLCBiZmRfdm1hLAotCQkJCSAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi0gIC8qIEZpbmlzaCBidWlsZGluZyBhIHN0cnVjdCwgYW5kIHB1c2ggaXQgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCplbmRfc3RydWN0X3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFN0YXJ0IGJ1aWxkaW5nIGEgY2xhc3MuICBUaGlzIGlzIGZvbGxvd2VkIGJ5IGNhbGxzIHRvIHNldmVyYWwKLSAgICAgZnVuY3Rpb25zOiBzdHJ1Y3RfZmllbGQsIGNsYXNzX3N0YXRpY19tZW1iZXIsIGNsYXNzX2Jhc2VjbGFzcywKLSAgICAgY2xhc3Nfc3RhcnRfbWV0aG9kLCBjbGFzc19tZXRob2RfdmFyaWFudCwKLSAgICAgY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50LCBhbmQgY2xhc3NfZW5kX21ldGhvZC4gIFRoZSBjbGFzcyBpcwotICAgICBmaW5pc2hlZCBieSBhIGNhbGwgdG8gZW5kX2NsYXNzX3R5cGUuICBUaGUgZmlyc3QgZml2ZSBhcmd1bWVudHMKLSAgICAgYXJlIHRoZSBzYW1lIGFzIGZvciBzdGFydF9zdHJ1Y3RfdHlwZS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcwotICAgICB0cnVlIGlmIHRoZXJlIGlzIGEgdmlydHVhbCBmdW5jdGlvbiB0YWJsZTsgaWYgdGhlcmUgaXMsIHRoZQotICAgICBzZXZlbnRoIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgY2FuIGJlCi0gICAgIGZvdW5kIGluIHRoZSB0eXBlIGl0c2VsZiwgYW5kIGlzIGZhbHNlIGlmIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QKLSAgICAgaG9sZGluZyB0aGUgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBzaG91bGQgYmUgcG9wcGVkIGZyb20gdGhlIHR5cGUKLSAgICAgc3RhY2suICAqLwotICBib29sZWFuICgqc3RhcnRfY2xhc3NfdHlwZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKLQkJCQkgICAgICAgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBib29sZWFuLAotCQkJCSAgICAgICBib29sZWFuKSk7Ci0KLSAgLyogQWRkIGEgc3RhdGljIG1lbWJlciB0byB0aGUgY2xhc3MgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVGhlCi0gICAgIGFyZ3VtZW50cyBhcmUgdGhlIGZpZWxkIG5hbWUsIHRoZSBwaHlzaWNhbCBuYW1lLCBhbmQgdGhlCi0gICAgIHZpc2liaWxpdHkuICBUaGUgdHlwZSBtdXN0IGJlIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqY2xhc3Nfc3RhdGljX21lbWJlcikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkJCQkJICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLSAgCi0gIC8qIEFkZCBhIGJhc2VjbGFzcyB0byB0aGUgY2xhc3MgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVGhlIHR5cGUgb2YKLSAgICAgdGhlIGJhc2VjbGFzcyBtdXN0IGJlIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICBUaGUgYXJndW1lbnRzCi0gICAgIGFyZSB0aGUgYml0IHBvc2l0aW9uLCB3aGV0aGVyIHRoZSBjbGFzcyBpcyB2aXJ0dWFsLCBhbmQgdGhlCi0gICAgIHZpc2liaWxpdHkuICAqLwotICBib29sZWFuICgqY2xhc3NfYmFzZWNsYXNzKSBQQVJBTVMgKChQVFIsIGJmZF92bWEsIGJvb2xlYW4sCi0JCQkJICAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci0KLSAgLyogU3RhcnQgYWRkaW5nIGEgbWV0aG9kIHRvIHRoZSBjbGFzcyBjdXJyZW50bHkgYmVpbmcgYnVpbHQuICBUaGlzCi0gICAgIGlzIGZvbGxvd2VkIGJ5IGNhbGxzIHRvIGNsYXNzX21ldGhvZF92YXJpYW50IGFuZAotICAgICBjbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQgdG8gZGVzY3JpYmUgZGlmZmVyZW50IHZhcmlhbnRzIG9mIHRoZQotICAgICBtZXRob2Qgd2hpY2ggdGFrZSBkaWZmZXJlbnQgYXJndW1lbnRzLiAgVGhlIG1ldGhvZCBpcyBmaW5pc2hlZAotICAgICB3aXRoIGEgY2FsbCB0byBjbGFzc19lbmRfbWV0aG9kLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBtZXRob2QKLSAgICAgbmFtZS4gICovCi0gIGJvb2xlYW4gKCpjbGFzc19zdGFydF9tZXRob2QpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogRGVzY3JpYmUgYSB2YXJpYW50IHRvIHRoZSBjbGFzcyBtZXRob2QgY3VycmVudGx5IGJlaW5nIGJ1aWx0LgotICAgICBUaGUgdHlwZSBvZiB0aGUgdmFyaWFudCBtdXN0IGJlIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICBUaGUKLSAgICAgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gIFRoZQotICAgICBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSB0aGUgdmlzaWJpbGl0eSwgd2hldGhlciB0aGUgdmFyaWFudCBpcwotICAgICBjb25zdCwgd2hldGhlciB0aGUgdmFyaWFudCBpcyB2b2xhdGlsZSwgdGhlIG9mZnNldCBpbiB0aGUgdmlydHVhbAotICAgICBmdW5jdGlvbiB0YWJsZSwgYW5kIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgb24gdGhlIHR5cGUgc3RhY2sKLSAgICAgKGJlbG93IHRoZSB2YXJpYW50IHR5cGUpLiAgKi8KLSAgYm9vbGVhbiAoKmNsYXNzX21ldGhvZF92YXJpYW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwKLQkJCQkJICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5LAotCQkJCQkgICBib29sZWFuLCBib29sZWFuLAotCQkJCQkgICBiZmRfdm1hLCBib29sZWFuKSk7Ci0KLSAgLyogRGVzY3JpYmUgYSBzdGF0aWMgdmFyaWFudCB0byB0aGUgY2xhc3MgbWV0aG9kIGN1cnJlbnRseSBiZWluZwotICAgICBidWlsdC4gIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciBjbGFzc19tZXRob2RfdmFyaWFudCwKLSAgICAgZXhjZXB0IHRoYXQgdGhlIGxhc3QgdHdvIGFyZ3VtZW50cyBhcmUgb21pdHRlZC4gIFRoZSB0eXBlIG9mIHRoZQotICAgICB2YXJpYW50IG11c3QgYmUgcG9wcGVkIG9mZiB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpjbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLAotCQkJCQkJICBlbnVtIGRlYnVnX3Zpc2liaWxpdHksCi0JCQkJCQkgIGJvb2xlYW4sIGJvb2xlYW4pKTsKLQotICAvKiBGaW5pc2ggZGVzY3JpYmluZyBhIGNsYXNzIG1ldGhvZC4gICovCi0gIGJvb2xlYW4gKCpjbGFzc19lbmRfbWV0aG9kKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBGaW5pc2ggZGVzY3JpYmluZyBhIGNsYXNzLCBhbmQgcHVzaCBpdCBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKmVuZF9jbGFzc190eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBQdXNoIGEgdHlwZSBvbiB0aGUgc3RhY2sgd2hpY2ggd2FzIGdpdmVuIGEgbmFtZSBieSBhbiBlYXJsaWVyCi0gICAgIGNhbGwgdG8gdHlwZGVmLiAgKi8KLSAgYm9vbGVhbiAoKnR5cGVkZWZfdHlwZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotICAvKiBQdXNoIGEgdGFnZ2VkIHR5cGUgb24gdGhlIHN0YWNrIHdoaWNoIHdhcyBkZWZpbmVkIGVhcmxpZXIuICBJZgotICAgICB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGUgdHlwZSB3YXMgZGVmaW5lZCBieSBhIGNhbGwKLSAgICAgdG8gdGFnLiAgSWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBOVUxMLCB0aGUgdHlwZSB3YXMgZGVmaW5lZCBieQotICAgICBhIGNhbGwgdG8gc3RhcnRfc3RydWN0X3R5cGUgb3Igc3RhcnRfY2xhc3NfdHlwZSB3aXRoIGEgdGFnIG9mCi0gICAgIE5VTEwgYW5kIHRoZSBudW1iZXIgb2YgdGhlIHRoaXJkIGFyZ3VtZW50LiAgRWl0aGVyIHdheSwgdGhlCi0gICAgIGZvdXJ0aCBhcmd1bWVudCBpcyB0aGUgdGFnIGtpbmQuICBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgY2FsbGVkCi0gICAgIGZvciBhIHN0cnVjdCAoY2xhc3MpIGJlaW5nIGRlZmluZWQsIGluIGJldHdlZW4gdGhlIGNhbGwgdG8KLSAgICAgc3RhcnRfc3RydWN0X3R5cGUgKHN0YXJ0X2NsYXNzX3R5cGUpIGFuZCB0aGUgY2FsbCB0bwotICAgICBlbmRfc3RydWN0X3R5cGUgKGVuZF9jbGFzc190eXBlKS4gICovCi0gIGJvb2xlYW4gKCp0YWdfdHlwZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKLQkJCSAgICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotCi0gIC8qIFBvcCB0aGUgdHlwZSBzdGFjaywgYW5kIHR5cGVkZWYgaXQgdG8gdGhlIGdpdmVuIG5hbWUuICAqLwotICBib29sZWFuICgqdHlwZGVmKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIFBvcCB0aGUgdHlwZSBzdGFjaywgYW5kIGRlY2xhcmUgaXQgYXMgYSB0YWdnZWQgc3RydWN0IG9yIHVuaW9uIG9yCi0gICAgIGVudW0gb3Igd2hhdGV2ZXIuICBUaGUgdGFnIHBhc3NlZCBkb3duIGhlcmUgaXMgcmVkdW5kYW50LCBzaW5jZQotICAgICB3YXMgYWxzbyBwYXNzZWQgd2hlbiBlbnVtX3R5cGUsIHN0YXJ0X3N0cnVjdF90eXBlLCBvcgotICAgICBzdGFydF9jbGFzc190eXBlIHdhcyBjYWxsZWQuICAqLwotICBib29sZWFuICgqdGFnKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIHRvIHJlY29yZCBhIG5hbWVkIGludGVnZXIgY29uc3RhbnQuICAqLwotICBib29sZWFuICgqaW50X2NvbnN0YW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIHRvIHJlY29yZCBhIG5hbWVkIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLSAgYm9vbGVhbiAoKmZsb2F0X2NvbnN0YW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci0KLSAgLyogVGhpcyBpcyBjYWxsZWQgdG8gcmVjb3JkIGEgdHlwZWQgaW50ZWdlciBjb25zdGFudC4gIFRoZSB0eXBlIGlzCi0gICAgIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqdHlwZWRfY29uc3RhbnQpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci0KLSAgLyogVGhpcyBpcyBjYWxsZWQgdG8gcmVjb3JkIGEgdmFyaWFibGUuICBUaGUgdHlwZSBpcyBwb3BwZWQgb2ZmIHRoZQotICAgICB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnZhcmlhYmxlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192YXJfa2luZCwKLQkJCSAgICAgICBiZmRfdm1hKSk7Ci0KLSAgLyogU3RhcnQgd3JpdGluZyBvdXQgYSBmdW5jdGlvbi4gIFRoZSByZXR1cm4gdHlwZSBtdXN0IGJlIHBvcHBlZCBvZmYKLSAgICAgdGhlIHN0YWNrLiAgVGhlIGJvb2xlYW4gaXMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaXMgZ2xvYmFsLiAgVGhpcwotICAgICBpcyBmb2xsb3dlZCBieSBjYWxscyB0byBmdW5jdGlvbl9wYXJhbWV0ZXIsIGZvbGxvd2VkIGJ5IGJsb2NrCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgYm9vbGVhbiAoKnN0YXJ0X2Z1bmN0aW9uKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotCi0gIC8qIFJlY29yZCBhIGZ1bmN0aW9uIHBhcmFtZXRlciBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICBUaGUgdHlwZQotICAgICBtdXN0IGJlIHBvcHBlZCBvZmYgdGhlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKmZ1bmN0aW9uX3BhcmFtZXRlcikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosCi0JCQkJCSBlbnVtIGRlYnVnX3Bhcm1fa2luZCwgYmZkX3ZtYSkpOwotCi0gIC8qIFN0YXJ0IHdyaXRpbmcgb3V0IGEgYmxvY2suICBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgdG9wIGxldmVsIGJsb2NrCi0gICAgIHBlciBmdW5jdGlvbi4gIEJsb2NrcyBtYXkgYmUgbmVzdGVkLiAgVGhlIGFyZ3VtZW50IGlzIHRoZQotICAgICBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBibG9jay4gICovCi0gIGJvb2xlYW4gKCpzdGFydF9ibG9jaykgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci0KLSAgLyogRmluaXNoIHdyaXRpbmcgb3V0IGEgYmxvY2suICBUaGUgYXJndW1lbnQgaXMgdGhlIGVuZGluZyBhZGRyZXNzCi0gICAgIG9mIHRoZSBibG9jay4gICovCi0gIGJvb2xlYW4gKCplbmRfYmxvY2spIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOwotCi0gIC8qIEZpbmlzaCB3cml0aW5nIG91dCBhIGZ1bmN0aW9uLiAgKi8KLSAgYm9vbGVhbiAoKmVuZF9mdW5jdGlvbikgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUmVjb3JkIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgYm9vbGVhbiAoKmxpbmVubykgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEpKTsKLX07Ci0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucy4gICovCi0KLS8qIFRoZSBmaXJzdCBhcmd1bWVudCB0byBtb3N0IG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBhIGhhbmRsZS4gIFRoaXMKLSAgIGhhbmRsZSBpcyByZXR1cm5lZCBieSB0aGUgZGVidWdfaW5pdCBmdW5jdGlvbi4gIFRoZSBwdXJwb3NlIG9mIHRoZQotICAgaGFuZGxlIGlzIHRvIHBlcm1pdCB0aGUgZGVidWdnaW5nIHJvdXRpbmVzIHRvIG5vdCB1c2Ugc3RhdGljCi0gICB2YXJpYWJsZXMsIGFuZCBoZW5jZSB0byBiZSByZWVudHJhbnQuICBUaGlzIHdvdWxkIGJlIHVzZWZ1bCBmb3IgYQotICAgcHJvZ3JhbSB3aGljaCB3YW50ZWQgdG8gaGFuZGxlIHR3byBleGVjdXRhYmxlcyBzaW11bHRhbmVvdXNseS4gICovCi0KLS8qIFJldHVybiBhIGRlYnVnZ2luZyBoYW5kbGUuICAqLwotCi1leHRlcm4gUFRSIGRlYnVnX2luaXQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBTZXQgdGhlIHNvdXJjZSBmaWxlbmFtZS4gIFRoaXMgaW1wbGljaXRseSBzdGFydHMgYSBuZXcgY29tcGlsYXRpb24KLSAgIHVuaXQuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19zZXRfZmlsZW5hbWUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotLyogQ2hhbmdlIHNvdXJjZSBmaWxlcyB0byB0aGUgZ2l2ZW4gZmlsZSBuYW1lLiAgVGhpcyBpcyB1c2VkIGZvcgotICAgaW5jbHVkZSBmaWxlcyBpbiBhIHNpbmdsZSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfc3RhcnRfc291cmNlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFJlY29yZCBhIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGlzIGltcGxpY2l0bHkgc3RhcnRzIGEgZnVuY3Rpb24KLSAgIGJsb2NrLiAgVGhlIGRlYnVnX3R5cGUgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZS4KLSAgIFRoZSBib29sZWFuIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBnbG9iYWxseSB2aXNpYmxlLgotICAgVGhlIGJmZF92bWEgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gIEN1cnJlbnRseQotICAgdGhlIHBhcmFtZXRlciB0eXBlcyBhcmUgc3BlY2lmaWVkIGJ5IGNhbGxzIHRvCi0gICBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX2Z1bmN0aW9uCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBib29sZWFuLCBiZmRfdm1hKSk7Ci0KLS8qIFJlY29yZCBhIHBhcmFtZXRlciBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBlbnVtIGRlYnVnX3Bhcm1fa2luZCwgYmZkX3ZtYSkpOwotCi0vKiBFbmQgYSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZQotICAgZnVuY3Rpb24gZW5kcy4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX2VuZF9mdW5jdGlvbiBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLQotLyogU3RhcnQgYSBibG9jayBpbiBhIGZ1bmN0aW9uLiAgQWxsIGxvY2FsIGluZm9ybWF0aW9uIHdpbGwgYmUKLSAgIHJlY29yZGVkIGluIHRoaXMgYmxvY2ssIHVudGlsIHRoZSBtYXRjaGluZyBjYWxsIHRvIGRlYnVnX2VuZF9ibG9jay4KLSAgIGRlYnVnX3N0YXJ0X2Jsb2NrIGFuZCBkZWJ1Z19lbmRfYmxvY2sgbWF5IGJlIG5lc3RlZC4gIFRoZSBhcmd1bWVudAotICAgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhpcyBibG9jayBzdGFydHMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19zdGFydF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLQotLyogRmluaXNoIGEgYmxvY2sgaW4gYSBmdW5jdGlvbi4gIFRoaXMgbWF0Y2hlcyB0aGUgY2FsbCB0bwotICAgZGVidWdfc3RhcnRfYmxvY2suICBUaGUgYXJndW1lbnQgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhpcyBibG9jawotICAgZW5kcy4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX2VuZF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLQotLyogQXNzb2NpYXRlIGEgbGluZSBudW1iZXIgaW4gdGhlIGN1cnJlbnQgc291cmNlIGZpbGUgd2l0aCBhIGdpdmVuCi0gICBhZGRyZXNzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX2xpbmUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBsb25nLCBiZmRfdm1hKSk7Ci0KLS8qIFN0YXJ0IGEgbmFtZWQgY29tbW9uIGJsb2NrLiAgVGhpcyBpcyBhIGJsb2NrIG9mIHZhcmlhYmxlcyB0aGF0IG1heQotICAgbW92ZSBpbiBtZW1vcnkuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19zdGFydF9jb21tb25fYmxvY2sgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotLyogRW5kIGEgbmFtZWQgY29tbW9uIGJsb2NrLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfZW5kX2NvbW1vbl9ibG9jayBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0vKiBSZWNvcmQgYSBuYW1lZCBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX2ludF9jb25zdCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotCi0vKiBSZWNvcmQgYSBuYW1lZCBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9mbG9hdF9jb25zdCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci0KLS8qIFJlY29yZCBhIHR5cGVkIGNvbnN0YW50IHdpdGggYW4gaW50ZWdyYWwgdmFsdWUuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfdHlwZWRfY29uc3QKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGJmZF92bWEpKTsKLQotLyogUmVjb3JkIGEgbGFiZWwuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfbGFiZWwKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGJmZF92bWEpKTsKLQotLyogUmVjb3JkIGEgdmFyaWFibGUuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGVudW0gZGVidWdfdmFyX2tpbmQsIGJmZF92bWEpKTsKLQotLyogTWFrZSBhbiBpbmRpcmVjdCB0eXBlLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB0aGUKLSAgIGxvY2F0aW9uIHdoZXJlIHRoZSByZWFsIHR5cGUgd2lsbCBiZSBwbGFjZWQuICBUaGUgc2Vjb25kIGFyZ3VtZW50Ci0gICBpcyB0aGUgdHlwZSB0YWcsIGlmIHRoZXJlIGlzIG9uZTsgdGhpcyBtYXkgYmUgTlVMTDsgdGhlIG9ubHkKLSAgIHB1cnBvc2Ugb2YgdGhpcyBhcmd1bWVudCBpcyBzbyB0aGF0IGRlYnVnX2dldF90eXBlX25hbWUgY2FuIHJldHVybgotICAgc29tZXRoaW5nIHVzZWZ1bC4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgd2hlbiBhIHR5cGUgaXMKLSAgIHJlZmVyZW5jZWQgYmVmb3JlIGl0IGlzIGRlZmluZWQuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBNYWtlIGEgdm9pZCB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV92b2lkX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci0KLS8qIE1ha2UgYW4gaW50ZWdlciB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gIFRoZSBib29sZWFuIGFyZ3VtZW50IGlzIHRydWUKLSAgIGlmIHRoZSBpbnRlZ2VyIGlzIHVuc2lnbmVkLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9pbnRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotCi0vKiBNYWtlIGEgZmxvYXRpbmcgcG9pbnQgdHlwZSBvZiBhIGdpdmVuIHNpemUuICBGSVhNRTogT24gc29tZQotICAgcGxhdGZvcm1zLCBsaWtlIGFuIEFscGhhLCB5b3UgcHJvYmFibHkgbmVlZCB0byBiZSBhYmxlIHRvIHNwZWNpZnkKLSAgIHRoZSBmb3JtYXQuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogTWFrZSBhIGJvb2xlYW4gdHlwZSBvZiBhIGdpdmVuIHNpemUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotCi0vKiBNYWtlIGEgY29tcGxleCB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfY29tcGxleF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIE1ha2UgYSBzdHJ1Y3R1cmUgdHlwZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdHJ1ZSBmb3IgYSBzdHJ1Y3QsCi0gICBmYWxzZSBmb3IgYSB1bmlvbi4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0LgotICAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmaWVsZHMuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgYmZkX3ZtYSwgZGVidWdfZmllbGQgKikpOwotCi0vKiBNYWtlIGFuIG9iamVjdCB0eXBlLiAgVGhlIGZpcnN0IHRocmVlIGFyZ3VtZW50cyBhZnRlciB0aGUgaGFuZGxlCi0gICBhcmUgdGhlIHNhbWUgYXMgZm9yIGRlYnVnX21ha2Vfc3RydWN0X3R5cGUuICBUaGUgbmV4dCBhcmd1bWVudHMgYXJlCi0gICBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBiYXNlIGNsYXNzZXMsIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mCi0gICBtZXRob2RzLCB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGhvbGRpbmcgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUKLSAgIGlmIGl0IGlzIG5vdCB0aGlzIG9iamVjdCwgYW5kIGEgYm9vbGVhbiB3aGljaCBpcyB0cnVlIGlmIHRoaXMKLSAgIG9iamVjdCBoYXMgaXRzIG93biB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9vYmplY3RfdHlwZQotICBQQVJBTVMgKChQVFIsIGJvb2xlYW4sIGJmZF92bWEsIGRlYnVnX2ZpZWxkICosIGRlYnVnX2Jhc2VjbGFzcyAqLAotCSAgIGRlYnVnX21ldGhvZCAqLCBkZWJ1Z190eXBlLCBib29sZWFuKSk7Ci0KLS8qIE1ha2UgYW4gZW51bWVyYXRpb24gdHlwZS4gIFRoZSBhcmd1bWVudHMgYXJlIGEgbnVsbCB0ZXJtaW5hdGVkCi0gICBhcnJheSBvZiBzdHJpbmdzLCBhbmQgYW4gYXJyYXkgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2VudW1fdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiosIGJmZF9zaWduZWRfdm1hICopKTsKLQotLyogTWFrZSBhIHBvaW50ZXIgdG8gYSBnaXZlbiB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9wb2ludGVyX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIE1ha2UgYSBmdW5jdGlvbiB0eXBlLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcmV0dXJuIHR5cGUuICBUaGUKLSAgIHRoaXJkIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgVGhlCi0gICBmb3VydGggYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YKLSAgIGFyZ3VtZW50cy4gIElmIHRoZSB0aGlyZCBhcmd1bWVudCBpcyBOVUxMLCB0aGVuIHRoZSBhcmd1bWVudCB0eXBlcwotICAgYXJlIHVua25vd24uICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlICosIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIHJlZmVyZW5jZSB0byBhIGdpdmVuIHR5cGUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGEgcmFuZ2Ugb2YgYSBnaXZlbiB0eXBlIGZyb20gYSBsb3dlciB0byBhbiB1cHBlciBib3VuZC4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfcmFuZ2VfdHlwZQotICBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotCi0vKiBNYWtlIGFuIGFycmF5IHR5cGUuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQKLSAgIG9mIHRoZSBhcnJheS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiBhIHJhbmdlIG9mIHRoZQotICAgYXJyYXkuICBUaGUgZm91cnRoIGFuZCBmaWZ0aCBhcmd1bWVudCBhcmUgdGhlIGxvd2VyIGFuZCB1cHBlcgotICAgYm91bmRzLCByZXNwZWN0aXZlbHkgKGlmIHRoZSBib3VuZHMgYXJlIG5vdCBrbm93biwgbG93ZXIgc2hvdWxkIGJlCi0gICAwIGFuZCB1cHBlciBzaG91bGQgYmUgLTEpLiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhpcwotICAgYXJyYXkgaXMgYWN0dWFsbHkgYSBzdHJpbmcsIGFzIGluIEMuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEsCi0JICAgYm9vbGVhbikpOwotCi0vKiBNYWtlIGEgc2V0IG9mIGEgZ2l2ZW4gdHlwZS4gIEZvciBleGFtcGxlLCBhIFBhc2NhbCBzZXQgdHlwZS4gIFRoZQotICAgYm9vbGVhbiBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMgc2V0IGlzIGFjdHVhbGx5IGEgYml0c3RyaW5nLCBhcyBpbgotICAgQ0hJTEwuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3NldF90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgYm9vbGVhbikpOwotCi0vKiBNYWtlIGEgdHlwZSBmb3IgYSBwb2ludGVyIHdoaWNoIGlzIHJlbGF0aXZlIHRvIGFuIG9iamVjdC4gIFRoZQotICAgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gd2hpY2ggdGhlIHBvaW50ZXIgaXMKLSAgIHJlbGF0aXZlLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIHRoYXQgdGhlIHBvaW50ZXIgcG9pbnRzCi0gICB0by4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfb2Zmc2V0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIE1ha2UgYSB0eXBlIGZvciBhIG1ldGhvZCBmdW5jdGlvbi4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlCi0gICByZXR1cm4gdHlwZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgZG9tYWluLiAgVGhlIGZvdXJ0aAotICAgYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICBUaGUgZmlmdGgKLSAgIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhlIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mCi0gICBhcmd1bWVudHMsIGluIHdoaWNoIGNhc2UgdGhlIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzIGluZGljYXRlcyB0aGUKLSAgIHR5cGVzIG9mIHRoZSBmaXJzdCBhcmd1bWVudHMuICBUaGUgZG9tYWluIGFuZCB0aGUgYXJndW1lbnQgYXJyYXkKLSAgIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIHRoaXMgaXMgYSBzdHViIG1ldGhvZCBhbmQgdGhhdAotICAgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4gIFN0YWJzIGRlYnVnZ2luZyB1c2VzIHRoaXMsIGFuZCBnZXRzCi0gICB0aGUgYXJndW1lbnQgdHlwZXMgZnJvbSB0aGUgbWFuZ2xlZCBuYW1lLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9tZXRob2RfdHlwZQotICBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIGRlYnVnX3R5cGUsIGRlYnVnX3R5cGUgKiwgYm9vbGVhbikpOwotCi0vKiBNYWtlIGEgY29uc3QgcXVhbGlmaWVkIHZlcnNpb24gb2YgYSBnaXZlbiB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9jb25zdF90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGEgdm9sYXRpbGUgcXVhbGlmaWVkIHZlcnNpb24gb2YgYSBnaXZlbiB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV92b2xhdGlsZV90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGFuIHVuZGVmaW5lZCB0YWdnZWQgdHlwZS4gIEZvciBleGFtcGxlLCBhIHN0cnVjdCB3aGljaCBoYXMKLSAgIGJlZW4gbWVudGlvbmVkLCBidXQgbm90IGRlZmluZWQuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3VuZGVmaW5lZF90YWdnZWRfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z190eXBlX2tpbmQpKTsKLQotLyogTWFrZSBhIGJhc2UgY2xhc3MgZm9yIGFuIG9iamVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIGJhc2UKLSAgIGNsYXNzIHR5cGUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGJpdCBwb3NpdGlvbiBvZiB0aGlzIGJhc2UKLSAgIGNsYXNzIGluIHRoZSBvYmplY3QuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIHdoZXRoZXIgdGhpcyBpcyBhCi0gICB2aXJ0dWFsIGNsYXNzLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBiYXNlCi0gICBjbGFzcy4gICovCi0KLWV4dGVybiBkZWJ1Z19iYXNlY2xhc3MgZGVidWdfbWFrZV9iYXNlY2xhc3MKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBiZmRfdm1hLCBib29sZWFuLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLQotLyogTWFrZSBhIGZpZWxkIGZvciBhIHN0cnVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUuICBUaGUKLSAgIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4gIFRoZSBmb3VydGggYXJndW1lbnQgaXMKLSAgIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIGZpZWxkLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSBzaXplIG9mCi0gICB0aGUgZmllbGQgKGl0IG1heSBiZSB6ZXJvKS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eQotICAgb2YgdGhlIGZpZWxkLiAgKi8KLQotZXh0ZXJuIGRlYnVnX2ZpZWxkIGRlYnVnX21ha2VfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGJmZF92bWEsIGJmZF92bWEsCi0JICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci0KLS8qIE1ha2UgYSBzdGF0aWMgbWVtYmVyIG9mIGFuIG9iamVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlCi0gICBuYW1lLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBtZW1iZXIuICBUaGUgZm91cnRoCi0gICBhcmd1bWVudCBpcyB0aGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgbWVtYmVyIChpLmUuLCB0aGUgbmFtZSBhcyBhCi0gICBnbG9iYWwgdmFyaWFibGUpLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZQotICAgbWVtYmVyLiAgKi8KLQotZXh0ZXJuIGRlYnVnX2ZpZWxkIGRlYnVnX21ha2Vfc3RhdGljX21lbWJlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgY29uc3QgY2hhciAqLAotCSAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi0vKiBNYWtlIGEgbWV0aG9kLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgbmFtZSwgYW5kIHRoZSB0aGlyZAotICAgYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgbWV0aG9kIHZhcmlhbnRzLiAgRWFjaAotICAgbWV0aG9kIHZhcmlhbnQgaXMgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgYnV0IHdpdGggZGlmZmVyZW50Ci0gICBhcmd1bWVudCB0eXBlcy4gICovCi0KLWV4dGVybiBkZWJ1Z19tZXRob2QgZGVidWdfbWFrZV9tZXRob2QKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX21ldGhvZF92YXJpYW50ICopKTsKLQotLyogTWFrZSBhIG1ldGhvZCB2YXJpYW50LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcGh5c2ljYWwgbmFtZSBvZgotICAgdGhlIGZ1bmN0aW9uLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiwKLSAgIHByb2JhYmx5IGNvbnN0cnVjdGVkIGJ5IGRlYnVnX21ha2VfbWV0aG9kX3R5cGUuICBUaGUgZm91cnRoCi0gICBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eS4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB3aGV0aGVyIHRoaXMgaXMKLSAgIGEgY29uc3QgZnVuY3Rpb24uICBUaGUgc2l4dGggYXJndW1lbnQgaXMgd2hldGhlciB0aGlzIGlzIGEgdm9sYXRpbGUKLSAgIGZ1bmN0aW9uLiAgVGhlIHNldmVudGggYXJndW1lbnQgaXMgdGhlIGluZGV4IGluIHRoZSB2aXJ0dWFsCi0gICBmdW5jdGlvbiB0YWJsZSwgaWYgYW55LiAgVGhlIGVpZ2h0aCBhcmd1bWVudCBpcyB0aGUgdmlydHVhbAotICAgZnVuY3Rpb24gY29udGV4dC4gICovCi0KLWV4dGVybiBkZWJ1Z19tZXRob2RfdmFyaWFudCBkZWJ1Z19tYWtlX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sCi0JICAgYm9vbGVhbiwgYmZkX3ZtYSwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGEgc3RhdGljIG1ldGhvZCBhcmd1bWVudC4gIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvcgotICAgZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudCwgZXhjZXB0IHRoYXQgdGhlIGxhc3QgdHdvIGFyZSBvbWl0dGVkCi0gICBzaW5jZSBhIHN0YXRpYyBtZXRob2QgY2FuIG5vdCBhbHNvIGJlIHZpcnR1YWwuICAqLwotCi1leHRlcm4gZGVidWdfbWV0aG9kX3ZhcmlhbnQgZGVidWdfbWFrZV9zdGF0aWNfbWV0aG9kX3ZhcmlhbnQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwKLQkgICBib29sZWFuKSk7Ci0KLS8qIE5hbWUgYSB0eXBlLiAgVGhpcyByZXR1cm5zIGEgbmV3IHR5cGUgd2l0aCBhbiBhdHRhY2hlZCBuYW1lLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbmFtZV90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIEdpdmUgYSB0YWcgdG8gYSB0eXBlLCBzdWNoIGFzIGEgc3RydWN0IG9yIHVuaW9uLiAgVGhpcyByZXR1cm5zIGEKLSAgIG5ldyB0eXBlIHdpdGggYW4gYXR0YWNoZWQgdGFnLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfdGFnX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUpKTsKLQotLyogUmVjb3JkIHRoZSBzaXplIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF90eXBlX3NpemUgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogRmluZCBhIG5hbWVkIHR5cGUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotLyogRmluZCBhIHRhZ2dlZCB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfZmluZF90YWdnZWRfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z190eXBlX2tpbmQpKTsKLQotLyogR2V0IHRoZSBraW5kIG9mIGEgdHlwZS4gICovCi0KLWV4dGVybiBlbnVtIGRlYnVnX3R5cGVfa2luZCBkZWJ1Z19nZXRfdHlwZV9raW5kIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIG5hbWUgb2YgYSB0eXBlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmRlYnVnX2dldF90eXBlX25hbWUgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiBhIHR5cGUuICAqLwotCi1leHRlcm4gYmZkX3ZtYSBkZWJ1Z19nZXRfdHlwZV9zaXplIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIHJldHVybiB0eXBlIG9mIGEgZnVuY3Rpb24gb3IgbWV0aG9kIHR5cGUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19nZXRfcmV0dXJuX3R5cGUgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIEdldCB0aGUgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIHBhcmFtZXRlciB0eXBlcyBmb3IgYSBmdW5jdGlvbiBvcgotICAgbWV0aG9kIHR5cGUgKGFjdHVhbGx5LCBwYXJhbWV0ZXIgdHlwZXMgYXJlIG5vdCBjdXJyZW50bHkgc3RvcmVkIGZvcgotICAgZnVuY3Rpb24gdHlwZXMpLiAgVGhpcyBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIG1ldGhvZAotICAgdHlwZSBpcyBhIHN0dWIgbWV0aG9kIG9yIG5vdC4gIFRoZSBsYXN0IGFyZ3VtZW50IHBvaW50cyB0byBhCi0gICBib29sZWFuIHdoaWNoIGlzIHNldCB0byB0cnVlIGlmIHRoZSBmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlCi0gICBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGRlYnVnX3R5cGUgKmRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMgUEFSQU1TICgoUFRSLAotCQkJCQkJCSAgICBkZWJ1Z190eXBlLAotCQkJCQkJCSAgICBib29sZWFuICopKTsKLQotLyogR2V0IHRoZSB0YXJnZXQgdHlwZSBvZiBhIHBvaW50ZXIgb3IgcmVmZXJlbmNlIG9yIGNvbnN0IG9yIHZvbGF0aWxlCi0gICB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfZ2V0X3RhcmdldF90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmaWVsZHMgZm9yIGEgc3RydWN0LCB1bmlvbiwgb3IKLSAgIGNsYXNzLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGRlYnVnX2ZpZWxkICpkZWJ1Z19nZXRfZmllbGRzIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIHR5cGUgb2YgYSBmaWVsZC4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX2dldF9maWVsZF90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgZmllbGQuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqZGVidWdfZ2V0X2ZpZWxkX25hbWUgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOwotCi0vKiBHZXQgdGhlIGJpdCBwb3NpdGlvbiBvZiBhIGZpZWxkIHdpdGhpbiB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUuCi0gICBJZiB0aGUgZmllbGQgaXMgYSBzdGF0aWMgbWVtYmVyLCB0aGlzIHdpbGwgcmV0dXJuIChiZmRfdm1hKSAtMS4gICovCi0KLWV4dGVybiBiZmRfdm1hIGRlYnVnX2dldF9maWVsZF9iaXRwb3MgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOwotCi0vKiBHZXQgdGhlIGJpdCBzaXplIG9mIGEgZmllbGQuICBJZiB0aGUgZmllbGQgaXMgYSBzdGF0aWMgbWVtYmVyLCB0aGlzCi0gICB3aWxsIHJldHVybiAoYmZkX3ZtYSkgLTEuICAqLwotCi1leHRlcm4gYmZkX3ZtYSBkZWJ1Z19nZXRfZmllbGRfYml0c2l6ZSBQQVJBTVMgKChQVFIsIGRlYnVnX2ZpZWxkKSk7Ci0KLS8qIEdldCB0aGUgdmlzaWJpbGl0eSBvZiBhIGZpZWxkLiAgKi8KLQotZXh0ZXJuIGVudW0gZGVidWdfdmlzaWJpbGl0eSBkZWJ1Z19nZXRfZmllbGRfdmlzaWJpbGl0eQotICBQQVJBTVMgKChQVFIsIGRlYnVnX2ZpZWxkKSk7Ci0KLS8qIEdldCB0aGUgcGh5c2ljYWwgbmFtZSBvZiBhIGZpZWxkLCBpZiBpdCBpcyBhIHN0YXRpYyBtZW1iZXIuICBJZiB0aGUKLSAgIGZpZWxkIGlzIG5vdCBhIHN0YXRpYyBtZW1iZXIsIHRoaXMgd2lsbCByZXR1cm4gTlVMTC4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpkZWJ1Z19nZXRfZmllbGRfcGh5c25hbWUgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOwotCi0vKiBXcml0ZSBvdXQgdGhlIHJlY29yZGVkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgdGFrZXMgYSBzZXQgb2YKLSAgIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGFyZSBjYWxsZWQgdG8gZG8gdGhlIGFjdHVhbCB3cml0aW5nLiAgVGhlCi0gICBmaXJzdCBQVFIgaXMgdGhlIGRlYnVnZ2luZyBoYW5kbGUuICBUaGUgc2Vjb25kIFBUUiBpcyBhIGhhbmRsZQotICAgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z193cml0ZSBQQVJBTVMgKChQVFIsIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSKSk7Ci0KLSNlbmRpZiAvKiBERUJVR19IICovCmRpZmYgLS1naXQgYS9iaW51dGlscy9kZWZsZXgubCBiL2JpbnV0aWxzL2RlZmxleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWE0M2MwLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RlZmxleC5sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotJXsvKiBkZWZsZXgubCAtIExleGVyIGZvciAuZGVmIGZpbGVzICovCi0KLS8qICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgIAkJICBzYWNAY3lnbnVzLmNvbQotCi0qLwotI2RlZmluZSBET05UREVDTEFSRV9NQUxMT0MKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWZwYXJzZS5oIgotI2luY2x1ZGUgImRsbHRvb2wuaCIKLQotaW50IGxpbmVudW1iZXI7Ci0KLSV9Ci0lJQotIk5BTUUiIAkJeyByZXR1cm4gTkFNRTt9Ci0iTElCUkFSWSIJeyByZXR1cm4gTElCUkFSWTt9Ci0iREVTQ1JJUFRJT04iIAl7IHJldHVybiBERVNDUklQVElPTjt9Ci0iU1RBQ0tTSVpFIgl7IHJldHVybiBTVEFDS1NJWkU7fQotIkhFQVBTSVpFIiAJeyByZXR1cm4gSEVBUFNJWkU7fQotIkNPREUiIAkJeyByZXR1cm4gQ09ERTt9Ci0iREFUQSIJCXsgcmV0dXJuIERBVEE7fQotIlNFQ1RJT05TIgl7IHJldHVybiBTRUNUSU9OUzt9Ci0iRVhQT1JUUyIJeyByZXR1cm4gRVhQT1JUUzt9Ci0iSU1QT1JUUyIJeyByZXR1cm4gSU1QT1JUUzt9Ci0iVkVSU0lPTiIJeyByZXR1cm4gVkVSU0lPTks7fQotIkJBU0UiCQl7IHJldHVybiBCQVNFO30KLSJDT05TVEFOVCIJeyByZXR1cm4gQ09OU1RBTlQ7IH0KLSJOT05BTUUiCXsgcmV0dXJuIE5PTkFNRTsgfQotIlJFQUQiCQl7IHJldHVybiBSRUFEO30KLSJXUklURSIJCXsgcmV0dXJuIFdSSVRFO30KLSJFWEVDVVRFIgl7IHJldHVybiBFWEVDVVRFO30KLSJTSEFSRUQiCXsgcmV0dXJuIFNIQVJFRDt9Ci0iTk9OU0hBUkVEIgl7IHJldHVybiBOT05TSEFSRUQ7fQotIlNJTkdMRSIJeyByZXR1cm4gU0lOR0xFO30KLSJNVUxUSVBMRSIJeyByZXR1cm4gTVVMVElQTEU7fQotIklOSVRJTlNUQU5DRSIJeyByZXR1cm4gSU5JVElOU1RBTkNFO30KLSJJTklUR0xPQkFMIgl7IHJldHVybiBJTklUR0xPQkFMO30KLSJURVJNSU5TVEFOQ0UiCXsgcmV0dXJuIFRFUk1JTlNUQU5DRTt9Ci0iVEVSTUdMT0JBTCIJeyByZXR1cm4gVEVSTUdMT0JBTDt9Ci0KLVswLTldW3gwLTlBLUZhLWZdKiB7IHl5bHZhbC5udW1iZXIgPSBzdHJ0b2wgKHl5dGV4dCwwLDApOyAKLQkJcmV0dXJuIE5VTUJFUjsgfQotCi1bQS1aYS16JDpcLVxfP11bQS1aYS16MC05LyQ6XC1cX0A/XSogeyAJCi0JCXl5bHZhbC5pZCA9ICB4c3RyZHVwICh5eXRleHQpOwotCQlyZXR1cm4gSUQ7Ci0JCX0KLQotIlwiIlteXCJdKiJcIiIgewotCQl5eWx2YWwuaWQgPSB4c3RyZHVwICh5eXRleHQrMSk7Ci0JCXl5bHZhbC5pZFt5eWxlbmctMl0gPSAwOwotCQlyZXR1cm4gSUQ7Ci0JCX0KLQotIlwnIlteXCddKiJcJyIgewotCQl5eWx2YWwuaWQgPSB4c3RyZHVwICh5eXRleHQrMSk7Ci0JCXl5bHZhbC5pZFt5eWxlbmctMl0gPSAwOwotCQlyZXR1cm4gSUQ7Ci0JCX0KLSIqIi4qIAkJeyB9Ci0iOyIuKiAJCXsgfQotIiAiCQl7IH0KLSJcdCIJCXsgfQotIlxuIgkgCXsgbGluZW51bWJlciArKyA7fQotIj0iIAkJeyByZXR1cm4gJz0nO30KLSIuIiAJCXsgcmV0dXJuICcuJzt9Ci0iQCIJIAl7IHJldHVybiAnQCc7fQotIiwiCQl7IHJldHVybiAnLCc7fQotJSUKLSNpZm5kZWYgeXl3cmFwCi0vKiBOZWVkZWQgZm9yIGxleCwgdGhvdWdoIG5vdCBmbGV4LiAqLwotaW50IHl5d3JhcCgpIHsgcmV0dXJuIDE7IH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGVmcGFyc2UueSBiL2JpbnV0aWxzL2RlZnBhcnNlLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MThkNDYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGVmcGFyc2UueQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0leyAvKiBkZWZwYXJzZS55IC0gcGFyc2VyIGZvciAuZGVmIGZpbGVzICovCi0KLS8qICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJkbGx0b29sLmgiCi0lfQotCi0ldW5pb24gewotICBjaGFyICppZDsKLSAgaW50IG51bWJlcjsKLX07Ci0KLSV0b2tlbiBOQU1FLCBMSUJSQVJZLCBERVNDUklQVElPTiwgU1RBQ0tTSVpFLCBIRUFQU0laRSwgQ09ERSwgREFUQQotJXRva2VuIFNFQ1RJT05TLCBFWFBPUlRTLCBJTVBPUlRTLCBWRVJTSU9OSywgQkFTRSwgQ09OU1RBTlQKLSV0b2tlbiBSRUFEIFdSSVRFIEVYRUNVVEUgU0hBUkVEIE5PTlNIQVJFRCBOT05BTUUKLSV0b2tlbiBTSU5HTEUgTVVMVElQTEUgSU5JVElOU1RBTkNFIElOSVRHTE9CQUwgVEVSTUlOU1RBTkNFIFRFUk1HTE9CQUwKLSV0b2tlbiA8aWQ+IElECi0ldG9rZW4gPG51bWJlcj4gTlVNQkVSCi0ldHlwZSAgPG51bWJlcj4gb3B0X2Jhc2Ugb3B0X29yZGluYWwgb3B0X05PTkFNRSBvcHRfQ09OU1RBTlQgb3B0X0RBVEEKLSV0eXBlICA8bnVtYmVyPiBhdHRyIGF0dHJfbGlzdCBvcHRfbnVtYmVyCi0ldHlwZSAgPGlkPiBvcHRfbmFtZSBvcHRfZXF1YWxfbmFtZSAKLQotJSUKLQotc3RhcnQ6IHN0YXJ0IGNvbW1hbmQKLQl8IGNvbW1hbmQKLQk7Ci0KLWNvbW1hbmQ6IAotCQlOQU1FIG9wdF9uYW1lIG9wdF9iYXNlIHsgZGVmX25hbWUgKCQyLCAkMyk7IH0KLQl8CUxJQlJBUlkgb3B0X25hbWUgb3B0X2Jhc2Ugb3B0aW9uX2xpc3QgeyBkZWZfbGlicmFyeSAoJDIsICQzKTsgfQotCXwJRVhQT1JUUyBleHBsaXN0IAotCXwJREVTQ1JJUFRJT04gSUQgeyBkZWZfZGVzY3JpcHRpb24gKCQyKTt9Ci0JfAlTVEFDS1NJWkUgTlVNQkVSIG9wdF9udW1iZXIgeyBkZWZfc3RhY2tzaXplICgkMiwgJDMpO30KLQl8CUhFQVBTSVpFIE5VTUJFUiBvcHRfbnVtYmVyIHsgZGVmX2hlYXBzaXplICgkMiwgJDMpO30KLQl8CUNPREUgYXR0cl9saXN0IHsgZGVmX2NvZGUgKCQyKTt9Ci0JfAlEQVRBIGF0dHJfbGlzdCAgeyBkZWZfZGF0YSAoJDIpO30KLQl8CVNFQ1RJT05TIHNlY2xpc3QKLQl8CUlNUE9SVFMgaW1wbGlzdAotCXwJVkVSU0lPTksgTlVNQkVSIHsgZGVmX3ZlcnNpb24gKCQyLDApO30KLQl8CVZFUlNJT05LIE5VTUJFUiAnLicgTlVNQkVSIHsgZGVmX3ZlcnNpb24gKCQyLCQ0KTt9Ci0JOwotCi0KLWV4cGxpc3Q6Ci0JCS8qIEVNUFRZICovCi0JfAlleHBsaXN0IGV4cGxpbmUKLQk7Ci0KLWV4cGxpbmU6Ci0JCUlEIG9wdF9lcXVhbF9uYW1lIG9wdF9vcmRpbmFsIG9wdF9OT05BTUUgb3B0X0NPTlNUQU5UIG9wdF9EQVRBCi0JCQl7IGRlZl9leHBvcnRzICgkMSwgJDIsICQzLCAkNCwgJDUsICQ2KTt9Ci0JOwotaW1wbGlzdDoJCi0JCWltcGxpc3QgaW1wbGluZQotCXwJaW1wbGluZQotCTsKLQotaW1wbGluZToKLSAgICAgICAgICAgICAgIElEICc9JyBJRCAnLicgSUQgJy4nIElEICAgICB7IGRlZl9pbXBvcnQgKCQxLCQzLCQ1LCQ3LCAwKTsgfQotICAgICAgIHwgICAgICAgSUQgJz0nIElEICcuJyBJRCAnLicgTlVNQkVSIHsgZGVmX2ltcG9ydCAoJDEsJDMsJDUsIDAsJDcpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIElEICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICgkMSwkMywgMCwkNSwgMCk7IH0KLSAgICAgICB8ICAgICAgIElEICc9JyBJRCAnLicgTlVNQkVSICAgICAgICB7IGRlZl9pbXBvcnQgKCQxLCQzLCAwLCAwLCQ1KTsgfQotICAgICAgIHwgICAgICAgSUQgJy4nIElEICcuJyBJRCAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoIDAsJDEsJDMsJDUsIDApOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgJy4nIE5VTUJFUiAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwkMSwkMywgMCwkNSk7IH0KLSAgICAgICB8ICAgICAgIElEICcuJyBJRCAgICAgICAgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCAwLCQxLCAwLCQzLCAwKTsgfQotICAgICAgIHwgICAgICAgSUQgJy4nIE5VTUJFUiAgICAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoIDAsJDEsIDAsIDAsJDMpOyB9Ci07Ci0KLXNlY2xpc3Q6Ci0JCXNlY2xpc3Qgc2VjbGluZQotCXwJc2VjbGluZQotCTsKLQotc2VjbGluZToKLQlJRCBhdHRyX2xpc3QgeyBkZWZfc2VjdGlvbiAoJDEsJDIpO30KLQk7Ci0KLWF0dHJfbGlzdDoKLQlhdHRyX2xpc3Qgb3B0X2NvbW1hIGF0dHIKLQl8IGF0dHIKLQk7Ci0KLW9wdF9jb21tYToKLQknLCcKLQl8IAotCTsKLW9wdF9udW1iZXI6ICcsJyBOVU1CRVIgeyAkJD0kMjt9Ci0JfAkgICB7ICQkPS0xO30KLQk7Ci0JCi1hdHRyOgotCQlSRUFEIHsgJCQgPSAxOyB9Ci0JfAlXUklURSB7ICQkID0gMjsgfQotCXwJRVhFQ1VURSB7ICQkID0gNDsgfQotCXwJU0hBUkVEIHsgJCQgPSA4OyB9Ci0JfAlOT05TSEFSRUQgeyAkJCA9IDA7IH0KLQl8CVNJTkdMRSB7ICQkID0gMDsgfQotCXwJTVVMVElQTEUgeyAkJCA9IDA7IH0KLQk7Ci0KLW9wdF9DT05TVEFOVDoKLQkJQ09OU1RBTlQgeyQkPTE7fQotCXwJCSB7JCQ9MDt9Ci0JOwotCi1vcHRfTk9OQU1FOgotCQlOT05BTUUgeyQkPTE7fQotCXwJCSB7JCQ9MDt9Ci0JOwotCi1vcHRfREFUQToKLQkJREFUQSB7ICQkID0gMTsgfQotCXwJICAgICB7ICQkID0gMDsgfQotCTsKLQotb3B0X25hbWU6IElECQl7ICQkID0kMTsgfQotCXwgSUQgJy4nIElECQotCSAgeyAKLQkgICAgY2hhciAqbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoJDEpICsgMSArIHN0cmxlbiAoJDMpICsgMSk7Ci0JICAgIHNwcmludGYgKG5hbWUsICIlcy4lcyIsICQxLCAkMyk7Ci0JICAgICQkID0gbmFtZTsKLQkgIH0KLQl8CQl7ICQkPSIiOyB9Ci0JOwotCi1vcHRfb3JkaW5hbDogCi0JICAnQCcgTlVNQkVSICAgICB7ICQkPSQyO30KLQl8ICAgICAgICAgICAgICAgIHsgJCQ9LTE7fQotCTsKLQotb3B0X2VxdWFsX25hbWU6Ci0gICAgICAgICAgJz0nIElECXsgJCQgPSAkMjsgfQotICAgICAgICB8IAkJeyAkJCA9ICAwOyB9CQkJIAotCTsKLQotb3B0X2Jhc2U6IEJBU0UJJz0nIE5VTUJFUgl7ICQkPSAkMzt9Ci0JfAl7ICQkPS0xO30KLQk7Ci0KLW9wdGlvbl9saXN0OgotCQkvKiBlbXB0eSAqLwotCXwJb3B0aW9uX2xpc3Qgb3B0X2NvbW1hIG9wdGlvbgotCTsKLQotb3B0aW9uOgotCQlJTklUSU5TVEFOQ0UKLQl8CUlOSVRHTE9CQUwKLQl8CVRFUk1JTlNUQU5DRQotCXwJVEVSTUdMT0JBTAotCTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RlcC1pbi5zZWQgYi9iaW51dGlscy9kZXAtaW4uc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjE5MjFhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RlcC1pbi5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi06bG9vcAotL1xcJC9OCi0vXFwkL2IgbG9vcAotCi1zIUBJTkNESVJAISQoSU5DRElSKSFnCi1zIUBCRkRESVJAISQoQkZERElSKSFnCi1zIUBTUkNESVJALyEhZwotcyFAT0JKRElSQC8hIWcKLQotcy9cXFxuICovIC9nCi0KLXMvICokLy8KLXMvICAqLyAvZwotLzokL2QKLQotcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKLSAgL2cKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RsbHRvb2wuYyBiL2JpbnV0aWxzL2RsbHRvb2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlZDJjNi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kbGx0b29sLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjE0ICswLDAgQEAKLS8qIGRsbHRvb2wuYyAtLSB0b29sIHRvIGdlbmVyYXRlIHN0dWZmIGZvciBQRSBzdHlsZSBETExzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyoKLSAgIFRoaXMgcHJvZ3JhbSBhbGxvd3MgeW91IHRvIGJ1aWxkIHRoZSBmaWxlcyBuZWNlc3NhcnkgdG8gY3JlYXRlCi0gICBETExzIHRvIHJ1biBvbiBhIHN5c3RlbSB3aGljaCB1bmRlcnN0YW5kcyBQRSBmb3JtYXQgaW1hZ2UgZmlsZXMuCi0gICAoZWcsIFdpbmRvd3MgTlQpCi0KLSAgIFNlZSAiUGVlcmluZyBJbnNpZGUgdGhlIFBFOiBBIFRvdXIgb2YgdGhlIFdpbjMyIFBvcnRhYmxlIEV4ZWN1dGFibGUKLSAgIEZpbGUgRm9ybWF0IiwgTVNKIDE5OTQsIFZvbHVtZSA5IGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgQWxzbyBzZWUgIk1pY3Jvc29mdCBQb3J0YWJsZSBFeGVjdXRhYmxlIGFuZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0LAotICAgU3BlY2lmaWNhdGlvbiA0LjEiIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0gICBBIERMTCBjb250YWlucyBhbiBleHBvcnQgdGFibGUgd2hpY2ggY29udGFpbnMgdGhlIGluZm9ybWF0aW9uCi0gICB3aGljaCB0aGUgcnVudGltZSBsb2FkZXIgbmVlZHMgdG8gdGllIHVwIHJlZmVyZW5jZXMgZnJvbSBhCi0gICByZWZlcmVuY2luZyBwcm9ncmFtLgotCi0gICBUaGUgZXhwb3J0IHRhYmxlIGlzIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0gYnkgcmVhZGluZwotICAgaW4gYSAuREVGIGZpbGUgb3Igc2Nhbm5pbmcgdGhlIC5hIGFuZCAubyBmaWxlcyB3aGljaCB3aWxsIGJlIGluIHRoZQotICAgRExMLiAgQSAubyBmaWxlIGNhbiBjb250YWluIGluZm9ybWF0aW9uIGluIHNwZWNpYWwgICIuZHJlY3R2ZSIgc2VjdGlvbnMKLSAgIHdpdGggZXhwb3J0IGluZm9ybWF0aW9uLgotCi0gICBBIERFRiBmaWxlIGNvbnRhaW5zIGFueSBudW1iZXIgb2YgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKLQotCi0gICBOQU1FIDxuYW1lPiBbICwgPGJhc2U+IF0KLSAgIFRoZSByZXN1bHQgaXMgZ29pbmcgdG8gYmUgPG5hbWU+LkVYRQotCi0gICBMSUJSQVJZIDxuYW1lPiBbICwgPGJhc2U+IF0KLSAgIFRoZSByZXN1bHQgaXMgZ29pbmcgdG8gYmUgPG5hbWU+LkRMTAotCi0gICBFWFBPUlRTICAoIDxuYW1lMT4gWyA9IDxuYW1lMj4gXSBbIEAgPGludGVnZXI+IF0gWyBOT05BTUUgXSBbQ09OU1RBTlRdIFtEQVRBXSApICoKLSAgIERlY2xhcmVzIG5hbWUxIGFzIGFuIGV4cG9ydGVkIHN5bWJvbCBmcm9tIHRoZQotICAgRExMLCB3aXRoIG9wdGlvbmFsIG9yZGluYWwgbnVtYmVyIDxpbnRlZ2VyPgotCi0gICBJTVBPUlRTICAoICAoICAgPGludGVybmFsLW5hbWU+ID0gICA8bW9kdWxlLW5hbWU+IC4gPGludGVnZXI+ICkKLSAgICAgICAgICAgICB8ICggWyA8aW50ZXJuYWwtbmFtZT4gPSBdIDxtb2R1bGUtbmFtZT4gLiA8ZXh0ZXJuYWwtbmFtZT4gKSkgKgotICAgRGVjbGFyZXMgdGhhdCA8ZXh0ZXJuYWwtbmFtZT4gb3IgdGhlIGV4cG9ydGVkIGZ1bmN0aW9uIHdob2VzIG9yZGluYWwgbnVtYmVyCi0gICBpcyA8aW50ZWdlcj4gaXMgdG8gYmUgaW1wb3J0ZWQgZnJvbSB0aGUgZmlsZSA8bW9kdWxlLW5hbWU+LiAgSWYKLSAgIDxpbnRlcm5hbC1uYW1lPiBpcyBzcGVjaWZpZWQgdGhlbiB0aGlzIGlzIHRoZSBuYW1lIHRoYXQgdGhlIGltcG9ydGVkCi0gICBmdW5jdGlvbiB3aWxsIGJlIHJlZmVyZWQgdG8gaW4gdGhlIGJvZHkgb2YgdGhlIERMTC4KLQotICAgREVTQ1JJUFRJT04gPHN0cmluZz4KLSAgIFB1dHMgPHN0cmluZz4gaW50byBvdXRwdXQgLmV4cCBmaWxlIGluIHRoZSAucmRhdGEgc2VjdGlvbgotCi0gICBbU1RBQ0tTSVpFfEhFQVBTSVpFXSA8bnVtYmVyLXJlc2VydmU+IFsgLCA8bnVtYmVyLWNvbW1pdD4gXQotICAgR2VuZXJhdGVzIC0tc3RhY2t8LS1oZWFwIDxudW1iZXItcmVzZXJ2ZT4sPG51bWJlci1jb21taXQ+Ci0gICBpbiB0aGUgb3V0cHV0IC5kcmVjdHZlIHNlY3Rpb24uICBUaGUgbGlua2VyIHdpbGwKLSAgIHNlZSB0aGlzIGFuZCBhY3QgdXBvbiBpdC4KLQotICAgW0NPREV8REFUQV0gPGF0dHI+KwotICAgU0VDVElPTlMgKCA8c2VjdGlvbm5hbWU+IDxhdHRyPisgKSoKLSAgIDxhdHRyPiA9IFJFQUQgfCBXUklURSB8IEVYRUNVVEUgfCBTSEFSRUQKLSAgIEdlbmVyYXRlcyAtLWF0dHIgPHNlY3Rpb25uYW1lPiA8YXR0cj4gaW4gdGhlIG91dHB1dAotICAgLmRyZWN0dmUgc2VjdGlvbi4gIFRoZSBsaW5rZXIgd2lsbCBzZWUgdGhpcyBhbmQgYWN0Ci0gICB1cG9uIGl0LgotCi0KLSAgIEEgLWV4cG9ydDo8bmFtZT4gaW4gYSAuZHJlY3R2ZSBzZWN0aW9uIGluIGFuIGlucHV0IC5vIG9yIC5hCi0gICBmaWxlIHRvIHRoaXMgcHJvZ3JhbSBpcyBlcXVpdmFsZW50IHRvIGEgRVhQT1JUUyA8bmFtZT4KLSAgIGluIGEgLkRFRiBmaWxlLgotCi0KLQotICAgVGhlIHByb2dyYW0gZ2VuZXJhdGVzIG91dHB1dCBmaWxlcyB3aXRoIHRoZSBwcmVmaXggc3VwcGxpZWQKLSAgIG9uIHRoZSBjb21tYW5kIGxpbmUsIG9yIGluIHRoZSBkZWYgZmlsZSwgb3IgdGFrZW4gZnJvbSB0aGUgZmlyc3QKLSAgIHN1cHBsaWVkIGFyZ3VtZW50LgotCi0gICBUaGUgLmV4cC5zIGZpbGUgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBleHBvcnQKLSAgIHRoZSByb3V0aW5lcyBpbiB0aGUgRExMLiAgVGhlIC5saWIucyBmaWxlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbgotICAgbmVjZXNzYXJ5IHRvIHVzZSB0aGUgRExMJ3Mgcm91dGluZXMgZnJvbSBhIHJlZmVyZW5jaW5nIHByb2dyYW0uCi0KLQotCi0gICBFeGFtcGxlOgotCi0gZmlsZTEuYzoKLSAgIGFzbSAoIi5zZWN0aW9uIC5kcmVjdHZlIik7Ci0gICBhc20gKCIuYXNjaWkgXCItZXhwb3J0OmFkZWZcIiIpOwotCi0gICB2b2lkIGFkZWYgKGNoYXIgKiBzKQotICAgewotICAgICBwcmludGYgKCJoZWxsbyBmcm9tIHRoZSBkbGwgJXNcbiIsIHMpOwotICAgfQotCi0gICB2b2lkIGJkZWYgKGNoYXIgKiBzKQotICAgewotICAgICBwcmludGYgKCJoZWxsbyBmcm9tIHRoZSBkbGwgYW5kIHRoZSBvdGhlciBlbnRyeSBwb2ludCAlc1xuIiwgcyk7Ci0gICB9Ci0KLSBmaWxlMi5jOgotICAgYXNtICgiLnNlY3Rpb24gLmRyZWN0dmUiKTsKLSAgIGFzbSAoIi5hc2NpaSBcIi1leHBvcnQ6Y2RlZlwiIik7Ci0gICBhc20gKCIuYXNjaWkgXCItZXhwb3J0OmRkZWZcIiIpOwotICAgCi0gICB2b2lkIGNkZWYgKGNoYXIgKiBzKQotICAgewotICAgICBwcmludGYgKCJoZWxsbyBmcm9tIHRoZSBkbGwgJXNcbiIsIHMpOwotICAgfQotCi0gICB2b2lkIGRkZWYgKGNoYXIgKiBzKQotICAgewotICAgICBwcmludGYgKCJoZWxsbyBmcm9tIHRoZSBkbGwgYW5kIHRoZSBvdGhlciBlbnRyeSBwb2ludCAlc1xuIiwgcyk7Ci0gICB9Ci0KLSAgIGludCBwcmludGYgKHZvaWQpCi0gICB7Ci0gICAgIHJldHVybiA5OwotICAgfQotCi0gdGhlbWFpbi5jOgotICAgaW50IG1haW4gKHZvaWQpCi0gICB7Ci0gICAgIGNkZWYgKCk7Ci0gICAgIHJldHVybiAwOwotICAgfQotCi0gdGhlZGxsLmRlZgotCi0gICBMSUJSQVJZIHRoZWRsbAotICAgSEVBUFNJWkUgMHg0MDAwMCwgMHgyMDAwCi0gICBFWFBPUlRTIGJkZWYgQCAyMAotICAgICAgICAgICBjZGVmIEAgMzAgTk9OQU1FCi0KLSAgIFNFQ1RJT05TIGRvbmtleSBSRUFEIFdSSVRFCi0gICBhYXJkdmFyayBFWEVDVVRFCi0KLSAjIENvbXBpbGUgdXAgdGhlIHBhcnRzIG9mIHRoZSBkbGwgYW5kIHRoZSBwcm9ncmFtCi0KLSAgIGdjYyAtYyBmaWxlMS5jIGZpbGUyLmMgdGhlbWFpbi5jCi0KLSAjIE9wdGlvbmFsOiBwdXQgdGhlIGRsbCBvYmplY3RzIGludG8gYSBsaWJyYXJ5Ci0gIyAoeW91IGRvbid0IGhhdmUgdG8sIHlvdSBjb3VsZCBuYW1lIGFsbCB0aGUgb2JqZWN0Ci0gIyBmaWxlcyBvbiB0aGUgZGxsdG9vbCBsaW5lKQotCi0gICBhciAgcWN2IHRoZWRsbC5pbiBmaWxlMS5vIGZpbGUyLm8KLSAgIHJhbmxpYiB0aGVkbGwuaW4KLQotICMgUnVuIHRoaXMgdG9vbCBvdmVyIHRoZSBETEwncyAuZGVmIGZpbGUgYW5kIGdlbmVyYXRlIGFuIGV4cG9ydHMKLSAjIGZpbGUgKHRoZWRsbC5vKSBhbmQgYW4gaW1wb3J0cyBmaWxlICh0aGVkbGwuYSkuCi0gIyAoWW91IG1heSBoYXZlIHRvIHVzZSAtUyB0byB0ZWxsIGRsbHRvb2wgd2hlcmUgdG8gZmluZCB0aGUgYXNzZW1ibGVyKS4KLSAKLSAgIGRsbHRvb2wgLS1kZWYgdGhlZGxsLmRlZiAtLW91dHB1dC1leHAgdGhlZGxsLm8gLS1vdXRwdXQtbGliIHRoZWRsbC5hCi0KLSAjIEJ1aWxkIHRoZSBkbGwgd2l0aCB0aGUgbGlicmFyeSBhbmQgdGhlIGV4cG9ydCB0YWJsZQotIAotICAgbGQgLW8gdGhlZGxsLmRsbCB0aGVkbGwubyB0aGVkbGwuaW4KLQotICMgTGluayB0aGUgZXhlY3V0YWJsZSB3aXRoIHRoZSBpbXBvcnQgbGlicmFyeQotIAotICAgZ2NjIC1vIHRoZW1haW4uZXhlIHRoZW1haW4ubyB0aGVkbGwuYQotCi0gVGhpcyBleGFtcGxlIGNhbiBiZSBleHRlbmRlZCBpZiByZWxvY2F0aW9ucyBhcmUgbmVlZGVkIGluIHRoZSBETEw6Ci0KLSAjIENvbXBpbGUgdXAgdGhlIHBhcnRzIG9mIHRoZSBkbGwgYW5kIHRoZSBwcm9ncmFtCi0KLSAgIGdjYyAtYyBmaWxlMS5jIGZpbGUyLmMgdGhlbWFpbi5jCi0KLSAjIFJ1biB0aGlzIHRvb2wgb3ZlciB0aGUgRExMJ3MgLmRlZiBmaWxlIGFuZCBnZW5lcmF0ZSBhbiBpbXBvcnRzIGZpbGUuCi0gCi0gICBkbGx0b29sIC0tZGVmIHRoZWRsbC5kZWYgLS1vdXRwdXQtbGliIHRoZWRsbC5saWIKLQotICMgTGluayB0aGUgZXhlY3V0YWJsZSB3aXRoIHRoZSBpbXBvcnQgbGlicmFyeSBhbmQgZ2VuZXJhdGUgYSBiYXNlIGZpbGUKLSAjIGF0IHRoZSBzYW1lIHRpbWUKLSAKLSAgIGdjYyAtbyB0aGVtYWluLmV4ZSB0aGVtYWluLm8gdGhlZGxsLmxpYiAtV2wsLS1iYXNlLWZpbGUgLVdsLHRoZW1haW4uYmFzZQotCi0gIyBSdW4gdGhpcyB0b29sIG92ZXIgdGhlIERMTCdzIC5kZWYgZmlsZSBhbmQgZ2VuZXJhdGUgYW4gZXhwb3J0cyBmaWxlCi0gIyB3aGljaCBpbmNsdWRlcyB0aGUgcmVsb2NhdGlvbnMgZnJvbSB0aGUgYmFzZSBmaWxlLgotIAotICAgZGxsdG9vbCAtLWRlZiB0aGVkbGwuZGVmIC0tYmFzZS1maWxlIHRoZW1haW4uYmFzZSAtLW91dHB1dC1leHAgdGhlZGxsLmV4cAotCi0gIyBCdWlsZCB0aGUgZGxsIHdpdGggZmlsZTEubywgZmlsZTIubyBhbmQgdGhlIGV4cG9ydCB0YWJsZQotIAotICAgbGQgLW8gdGhlZGxsLmRsbCB0aGVkbGwuZXhwIGZpbGUxLm8gZmlsZTIubwotICovCi0KLS8qIC5pZGF0YSBzZWN0aW9uIGRlc2NyaXB0aW9uCi0KLSAgIFRoZSAuaWRhdGEgc2VjdGlvbiBpcyB0aGUgaW1wb3J0IHRhYmxlLiAgSXQgaXMgYSBjb2xsZWN0aW9uIG9mIHNldmVyYWwKLSAgIHN1YnNlY3Rpb25zIHVzZWQgdG8ga2VlcCB0aGUgcGllY2VzIGZvciBlYWNoIGRsbCB0b2dldGhlcjogLmlkYXRhJFsyMzQ1NjddLgotICAgSUU6IEVhY2ggZGxsJ3MgLmlkYXRhJDIncyBhcmUgY2F0ZW5hdGVkIHRvZ2V0aGVyLCBlYWNoIC5pZGF0YSQzJ3MsIGV0Yy4KLQotICAgLmlkYXRhJDIgPSBJbXBvcnQgRGlyZWN0b3J5IFRhYmxlCi0gICA9IGFycmF5IG9mIElNQUdFX0lNUE9SVF9ERVNDUklQVE9SJ3MuCi0KLQlEV09SRCAgIEltcG9ydCBMb29rdXAgVGFibGU7ICAtIHBvaW50ZXIgdG8gLmlkYXRhJDQKLQlEV09SRCAgIFRpbWVEYXRlU3RhbXA7ICAgICAgICAtIGN1cnJlbnRseSBhbHdheXMgMAotCURXT1JEICAgRm9yd2FyZGVyQ2hhaW47ICAgICAgIC0gY3VycmVudGx5IGFsd2F5cyAwCi0JRFdPUkQgICBOYW1lOyAgICAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIGRsbCdzIG5hbWUKLQlQSU1BR0VfVEhVTktfREFUQSBGaXJzdFRodW5rOyAtIHBvaW50ZXIgdG8gLmlkYXRhJDUKLQotICAgLmlkYXRhJDMgPSBudWxsIHRlcm1pbmF0aW5nIGVudHJ5IGZvciAuaWRhdGEkMi4KLQotICAgLmlkYXRhJDQgPSBJbXBvcnQgTG9va3VwIFRhYmxlCi0gICA9IGFycmF5IG9mIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhpbnQgbmFtZSB0YWJsZS4KLSAgIFRoZXJlIGlzIG9uZSBmb3IgZWFjaCBkbGwgYmVpbmcgaW1wb3J0ZWQgZnJvbSwgYW5kIGVhY2ggZGxsJ3Mgc2V0IGlzCi0gICB0ZXJtaW5hdGVkIGJ5IGEgdHJhaWxpbmcgTlVMTC4KLQotICAgLmlkYXRhJDUgPSBJbXBvcnQgQWRkcmVzcyBUYWJsZQotICAgPSBhcnJheSBvZiBhcnJheSBvZiBwb2ludGVycyB0byBoaW50IG5hbWUgdGFibGUuCi0gICBUaGVyZSBpcyBvbmUgZm9yIGVhY2ggZGxsIGJlaW5nIGltcG9ydGVkIGZyb20sIGFuZCBlYWNoIGRsbCdzIHNldCBpcwotICAgdGVybWluYXRlZCBieSBhIHRyYWlsaW5nIE5VTEwuCi0gICBJbml0aWFsbHksIHRoaXMgdGFibGUgaXMgaWRlbnRpY2FsIHRvIHRoZSBJbXBvcnQgTG9va3VwIFRhYmxlLiAgSG93ZXZlciwKLSAgIGF0IGxvYWQgdGltZSwgdGhlIGxvYWRlciBvdmVyd3JpdGVzIHRoZSBlbnRyaWVzIHdpdGggdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICBmdW5jdGlvbi4KLQotICAgLmlkYXRhJDYgPSBIaW50IE5hbWUgVGFibGUKLSAgID0gQXJyYXkgb2YgeyBzaG9ydCwgYXNjaXogfSBlbnRyaWVzLCBvbmUgZm9yIGVhY2ggaW1wb3J0ZWQgZnVuY3Rpb24uCi0gICBUaGUgYHNob3J0JyBpcyB0aGUgZnVuY3Rpb24ncyBvcmRpbmFsIG51bWJlci4KLQotICAgLmlkYXRhJDcgPSBkbGwgbmFtZSAoZWc6ICJrZXJuZWwzMi5kbGwiKS4gKC5pZGF0YSQ2IGZvciBwcGMpCi0qLwotCi0vKiBBSVggcmVxdWlyZXMgdGhpcyB0byBiZSB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGZpbGUuICAqLwotI2lmbmRlZiBfX0dOVUNfXwotIyBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgc2hvd19hbGxuYW1lcyAwCi0KLSNkZWZpbmUgUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgUEFHRV9NQVNLICgtUEFHRV9TSVpFKQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImRlbWFuZ2xlLmgiCi0jaW5jbHVkZSAiZHluLXN0cmluZy5oIgotI2luY2x1ZGUgImRsbHRvb2wuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX0FSTQotI2luY2x1ZGUgImNvZmYvYXJtLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2VuZGlmCi0KLS8qIEZvcndhcmQgcmVmZXJlbmNlcy4gICovCi1zdGF0aWMgY2hhciAqbG9va19mb3JfcHJvZyBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgY2hhciAqZGVkdWNlX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLSNpZmRlZiBETExUT09MX01DT1JFX0VMRgotc3RhdGljIHZvaWQgbWNvcmVfZWxmX2NhY2hlX2ZpbGVuYW1lIChjaGFyICopOwotc3RhdGljIHZvaWQgbWNvcmVfZWxmX2dlbl9vdXRfZmlsZSAodm9pZCk7Ci0jZW5kaWYKLSAgICAgCi0jaWZkZWYgSEFWRV9TWVNfV0FJVF9ICi0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNlbHNlIC8qICEgSEFWRV9TWVNfV0FJVF9IICovCi0jaWYgISBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRCh3KQkoKCh3KSYwMzc3KSA9PSAwKQotI2VuZGlmCi0jaWZuZGVmIFdJRlNJR05BTEVECi0jZGVmaW5lIFdJRlNJR05BTEVEKHcpCSgoKHcpJjAzNzcpICE9IDAxNzcgJiYgKCh3KSZ+MDM3NykgPT0gMCkKLSNlbmRpZgotI2lmbmRlZiBXVEVSTVNJRwotI2RlZmluZSBXVEVSTVNJRyh3KQkoKHcpICYgMDE3NykKLSNlbmRpZgotI2lmbmRlZiBXRVhJVFNUQVRVUwotI2RlZmluZSBXRVhJVFNUQVRVUyh3KQkoKCh3KSA+PiA4KSAmIDAzNzcpCi0jZW5kaWYKLSNlbHNlIC8qIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pICovCi0jaWZuZGVmIFdJRkVYSVRFRAotI2RlZmluZSBXSUZFWElURUQodykJKCgodykgJiAweGZmKSA9PSAwKQotI2VuZGlmCi0jaWZuZGVmIFdJRlNJR05BTEVECi0jZGVmaW5lIFdJRlNJR05BTEVEKHcpCSgoKHcpICYgMHhmZikgIT0gMCAmJiAoKHcpICYgMHhmZikgIT0gMHg3ZikKLSNlbmRpZgotI2lmbmRlZiBXVEVSTVNJRwotI2RlZmluZSBXVEVSTVNJRyh3KQkoKHcpICYgMHg3ZikKLSNlbmRpZgotI2lmbmRlZiBXRVhJVFNUQVRVUwotI2RlZmluZSBXRVhJVFNUQVRVUyh3KQkoKCh3KSAmIDB4ZmYwMCkgPj4gOCkKLSNlbmRpZgotI2VuZGlmIC8qIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pICovCi0jZW5kaWYgLyogISBIQVZFX1NZU19XQUlUX0ggKi8KLQotLyogaWZ1bmMgYW5kIGloZWFkIGRhdGEgc3RydWN0dXJlczogdHRrQGN5Z251cy5jb20gMTk5NwotCi0gICBXaGVuIElNUE9SVCBkZWNsYXJhdGlvbnMgYXJlIGVuY291bnRlcmVkIGluIGEgLmRlZiBmaWxlIHRoZQotICAgZnVuY3Rpb24gaW1wb3J0IGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBhIHN0cnVjdHVyZSByZWZlcmVuY2VkIGJ5Ci0gICB0aGUgZ2xvYmFsIHZhcmlhYmxlIElNUE9SVF9MSVNULiAgVGhlIHN0cnVjdHVyZSBpcyBhIGxpbmtlZCBsaXN0Ci0gICBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgZGxsIGZpbGVzIGVhY2ggZnVuY3Rpb24gaXMgaW1wb3J0ZWQKLSAgIGZyb20gYW5kIGEgbGlua2VkIGxpc3Qgb2YgZnVuY3Rpb25zIGJlaW5nIGltcG9ydGVkIGZyb20gdGhhdCBkbGwKLSAgIGZpbGUuICBUaGlzIHJvdWdobHkgcGFyYWxsZWxzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIC5pZGF0YSBzZWN0aW9uCi0gICBpbiB0aGUgUEUgb2JqZWN0IGZpbGUuCi0KLSAgIFRoZSBjb250ZW50cyBvZiAuZGVmIGZpbGUgYXJlIGludGVycHJldGVkIGZyb20gd2l0aGluIHRoZQotICAgcHJvY2Vzc19kZWZfZmlsZSBmdW5jdGlvbi4gIEV2ZXJ5IHRpbWUgYW4gSU1QT1JUIGRlY2xhcmF0aW9uIGlzCi0gICBlbmNvdW50ZXJlZCwgaXQgaXMgYnJva2VuIHVwIGludG8gaXRzIGNvbXBvbmVudCBwYXJ0cyBhbmQgcGFzc2VkIHRvCi0gICBkZWZfaW1wb3J0LiAgSU1QT1JUX0xJU1QgaXMgaW5pdGlhbGl6ZWQgdG8gTlVMTCBpbiBmdW5jdGlvbiBtYWluLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgaWZ1bmN0Ci17Ci0gIGNoYXIgICAgICAgICAgKm5hbWU7ICAgLyogbmFtZSBvZiBmdW5jdGlvbiBiZWluZyBpbXBvcnRlZCAqLwotICBpbnQgICAgICAgICAgICBvcmQ7ICAgIC8qIHR3by1ieXRlIG9yZGluYWwgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGZ1bmN0aW9uICovCi0gIHN0cnVjdCBpZnVuY3QgKm5leHQ7Ci19IGlmdW5jdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgaWhlYWR0Ci17Ci0gIGNoYXIgICAgICAgICAgKmRsbG5hbWU7ICAvKiBuYW1lIG9mIGRsbCBmaWxlIGltcG9ydGVkIGZyb20gKi8KLSAgbG9uZyAgICAgICAgICAgbmZ1bmNzOyAgIC8qIG51bWJlciBvZiBmdW5jdGlvbnMgaW4gbGlzdCAqLwotICBzdHJ1Y3QgaWZ1bmN0ICpmdW5jaGVhZDsgLyogZmlyc3QgZnVuY3Rpb24gaW4gbGlzdCAqLwotICBzdHJ1Y3QgaWZ1bmN0ICpmdW5jdGFpbDsgLyogbGFzdCAgZnVuY3Rpb24gaW4gbGlzdCAqLwotICBzdHJ1Y3QgaWhlYWR0ICpuZXh0OyAgICAgLyogbmV4dCBkbGwgZmlsZSBpbiBsaXN0ICovCi19IGloZWFkdHlwZTsKLQotLyogU3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIGltcG9ydCBpbmZvcm1hdGlvbiBhcyBkZWZpbmVkIGluIC5kZWYgZmlsZQotICAgKHF2ICJpaGVhZCBzdHJ1Y3R1cmUiKS4gICovCi0KLXN0YXRpYyBpaGVhZHR5cGUgKmltcG9ydF9saXN0ID0gTlVMTDsKLQotc3RhdGljIGNoYXIgKmFzX25hbWUgPSBOVUxMOwotc3RhdGljIGNoYXIgKiBhc19mbGFncyA9ICIiOwotCi1zdGF0aWMgaW50IG5vX2lkYXRhNDsKLXN0YXRpYyBpbnQgbm9faWRhdGE1Owotc3RhdGljIGNoYXIgKmV4cF9uYW1lOwotc3RhdGljIGNoYXIgKmltcF9uYW1lOwotc3RhdGljIGNoYXIgKmhlYWRfbGFiZWw7Ci1zdGF0aWMgY2hhciAqaW1wX25hbWVfbGFiOwotc3RhdGljIGNoYXIgKmRsbF9uYW1lOwotCi1zdGF0aWMgaW50IGFkZF9pbmRpcmVjdCA9IDA7Ci1zdGF0aWMgaW50IGFkZF91bmRlcnNjb3JlID0gMDsKLXN0YXRpYyBpbnQgZG9udGRlbHRlbXBzID0gMDsKLQotLyogVHJ1ZSBpZiB3ZSBzaG91bGQgZXhwb3J0IGFsbCBzeW1ib2xzLiAgT3RoZXJ3aXNlLCB3ZSBvbmx5IGV4cG9ydAotICAgc3ltYm9scyBsaXN0ZWQgaW4gLmRyZWN0dmUgc2VjdGlvbnMgb3IgaW4gdGhlIGRlZiBmaWxlLiAgKi8KLXN0YXRpYyBib29sZWFuIGV4cG9ydF9hbGxfc3ltYm9sczsKLQotLyogVHJ1ZSBpZiB3ZSBzaG91bGQgZXhjbHVkZSB0aGUgc3ltYm9scyBpbiBERUZBVUxUX0VYQ0xVREVTIHdoZW4KLSAgIGV4cG9ydGluZyBhbGwgc3ltYm9scy4gICovCi1zdGF0aWMgYm9vbGVhbiBkb19kZWZhdWx0X2V4Y2x1ZGVzOwotCi0vKiBEZWZhdWx0IHN5bWJvbHMgdG8gZXhjbHVkZSB3aGVuIGV4cG9ydGluZyBhbGwgdGhlIHN5bWJvbHMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmRlZmF1bHRfZXhjbHVkZXMgPSAiRGxsTWFpbkAxMixEbGxFbnRyeVBvaW50QDAsaW1wdXJlX3B0ciI7Ci0KLXN0YXRpYyBjaGFyICpkZWZfZmlsZTsKLQotZXh0ZXJuIGNoYXIgKiBwcm9ncmFtX25hbWU7Ci0KLXN0YXRpYyBpbnQgbWFjaGluZTsKLXN0YXRpYyBpbnQga2lsbGF0Owotc3RhdGljIGludCBhZGRfc3RkY2FsbF9hbGlhczsKLXN0YXRpYyBpbnQgdmVyYm9zZTsKLXN0YXRpYyBGSUxFICpvdXRwdXRfZGVmOwotc3RhdGljIEZJTEUgKmJhc2VfZmlsZTsKLQotI2lmZGVmIERMTFRPT0xfQVJNCi1zdGF0aWMgY29uc3QgY2hhciAqbW5hbWUgPSAiYXJtIjsKLSNlbmRpZgotCi0jaWZkZWYgRExMVE9PTF9JMzg2Ci1zdGF0aWMgY29uc3QgY2hhciAqbW5hbWUgPSAiaTM4NiI7Ci0jZW5kaWYKLQotI2lmZGVmIERMTFRPT0xfUFBDCi1zdGF0aWMgY29uc3QgY2hhciAqbW5hbWUgPSAicHBjIjsKLSNlbmRpZgotCi0jaWZkZWYgRExMVE9PTF9NQ09SRQotc3RhdGljIGNvbnN0IGNoYXIgKiBtbmFtZSA9ICJtY29yZS1sZSI7Ci0jZW5kaWYKLQotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi1zdGF0aWMgY29uc3QgY2hhciAqIG1uYW1lID0gIm1jb3JlLWVsZiI7Ci1zdGF0aWMgY2hhciAqIG1jb3JlX2VsZl9vdXRfZmlsZSA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqIG1jb3JlX2VsZl9saW5rZXIgICA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqIG1jb3JlX2VsZl9saW5rZXJfZmxhZ3MgPSBOVUxMOwotCi0jZGVmaW5lIERSRUNUVkVfU0VDVElPTl9OQU1FICgobWFjaGluZSA9PSBNTUNPUkVfRUxGIHx8IG1hY2hpbmUgPT0gTU1DT1JFX0VMRl9MRSkgPyAiLmV4cG9ydHMiIDogIi5kcmVjdHZlIikKLSNlbmRpZgotCi0jaWZuZGVmIERSRUNUVkVfU0VDVElPTl9OQU1FCi0jZGVmaW5lIERSRUNUVkVfU0VDVElPTl9OQU1FICIuZHJlY3R2ZSIKLSNlbmRpZgotCi0jZGVmaW5lIFBBVEhNQVggMjUwCQkvKiBXaGF0J3MgdGhlIHJpZ2h0IG5hbWUgZm9yIHRoaXMgPyAqLwotCi0jZGVmaW5lIFRNUF9BU00JCSJkYy5zIgotI2RlZmluZSBUTVBfSEVBRF9TCSJkaC5zIgotI2RlZmluZSBUTVBfSEVBRF9PCSJkaC5vIgotI2RlZmluZSBUTVBfVEFJTF9TCSJkdC5zIgotI2RlZmluZSBUTVBfVEFJTF9PCSJkdC5vIgotI2RlZmluZSBUTVBfU1RVQgkiZHMiCi0KLS8qIFRoaXMgYml0IG9mIGFzc2VtbHkgZG9lcyBqbXAgKiAuLi4uICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpMzg2X2p0YWJbXSA9Ci17Ci0gIDB4ZmYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4OTAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFybV9qdGFiW10gPQotewotICAweDAwLCAweGMwLCAweDlmLCAweGU1LAkvKiBsZHIgIGlwLCBbcGNdICovCi0gIDB4MDAsIDB4ZjAsIDB4OWMsIDB4ZTUsCS8qIGxkciAgcGMsIFtpcF0gKi8KLSAgMCwgICAgMCwgICAgMCwgICAgMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYXJtX2ludGVyd29ya19qdGFiW10gPQotewotICAweDA0LCAweGMwLCAweDlmLCAweGU1LAkvKiBsZHIgIGlwLCBbcGNdICovCi0gIDB4MDAsIDB4YzAsIDB4OWMsIDB4ZTUsCS8qIGxkciAgaXAsIFtpcF0gKi8KLSAgMHgxYywgMHhmZiwgMHgyZiwgMHhlMSwJLyogYnggICBpcCAgICAgICAqLwotICAwLCAgICAwLCAgICAwLCAgICAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0aHVtYl9qdGFiW10gPQotewotICAweDQwLCAweGI0LCAgICAgICAgICAgLyogcHVzaCB7cjZ9ICAgICAgICAgKi8KLSAgMHgwMiwgMHg0ZSwgICAgICAgICAgIC8qIGxkciAgcjYsIFtwYywgIzhdICovCi0gIDB4MzYsIDB4NjgsICAgICAgICAgICAvKiBsZHIgIHI2LCBbcjZdICAgICAqLwotICAweGI0LCAweDQ2LCAgICAgICAgICAgLyogbW92ICBpcCwgcjYgICAgICAgKi8KLSAgMHg0MCwgMHhiYywgICAgICAgICAgIC8qIHBvcCAge3I2fSAgICAgICAgICovCi0gIDB4NjAsIDB4NDcsICAgICAgICAgICAvKiBieCAgIGlwICAgICAgICAgICAqLwotICAwLCAgICAwLCAgICAwLCAgICAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtY29yZV9iZV9qdGFiW10gPQotewotICAweDcwLCAweDAxLCAgICAgICAgICAgIC8qIGptcGkgMSAgICAgKi8KLSAgMHgxMiwgMHgxMSwgICAgICAgICAgICAvKiBub3AgKi8KLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCAvKiA8YWRkcmVzcz4gICovICAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1jb3JlX2xlX2p0YWJbXSA9Ci17Ci0gIDB4MDEsIDB4NzAsICAgICAgICAgICAgLyogam1waSAxICAgICAqLwotICAweDExLCAweDEyLCAgICAgICAgICAgIC8qIG5vcCAqLwotICAweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIDxhZGRyZXNzPiAgKi8gIAotfTsKLQotLyogVGhpcyBpcyB0aGUgZ2x1ZSBzZXF1ZW5jZSBmb3IgUG93ZXJQQyBQRS4gVGhlcmUgaXMgYSAgKi8KLS8qIHRvY3JlbDE2LXRvY2RlZm4gcmVsb2MgYWdhaW5zdCB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24uICovCi0vKiBXZSBhbHNvIG5lZWQgYSBJTUdMVUUgcmVsb2MgYWdhaW5zdCB0aGUgZ2x1ZSBmdW5jdGlvbiAqLwotLyogdG8gcmVzdG9yZSB0aGUgdG9jIHNhdmVkIGJ5IHRoZSB0aGlyZCBpbnN0cnVjdGlvbiBpbiAgKi8KLS8qIHRoZSBnbHVlLiAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcHBjX2p0YWJbXSA9Ci17Ci0gIDB4MDAsIDB4MDAsIDB4NjIsIDB4ODEsIC8qIGx3eiByMTEsMChyMikgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIFJlbG9jIFRPQ1JFTDE2IF9faW1wX3h4eCAgKi8KLSAgMHgwMCwgMHgwMCwgMHg4QiwgMHg4MSwgLyogbHd6IHIxMiwwKHIxMSkgICAgICAgICAgICAgICovCi0gIDB4MDQsIDB4MDAsIDB4NDEsIDB4OTAsIC8qIHN0dyByMiw0KHIxKSAgICAgICAgICAgICAgICAqLwotICAweEE2LCAweDAzLCAweDg5LCAweDdELCAvKiBtdGN0ciByMTIgICAgICAgICAgICAgICAgICAgKi8KLSAgMHgwNCwgMHgwMCwgMHg0QiwgMHg4MCwgLyogbHd6IHIyLDQocjExKSAgICAgICAgICAgICAgICovCi0gIDB4MjAsIDB4MDQsIDB4ODAsIDB4NEUgIC8qIGJjdHIgICAgICAgICAgICAgICAgICAgICAgICAqLwotfTsKLQotI2lmZGVmIERMTFRPT0xfUFBDCi0vKiB0aGUgZ2x1ZSBpbnN0cnVjdGlvbiwgcGlja3MgdXAgdGhlIHRvYyBmcm9tIHRoZSBzdHcgaW4gKi8KLS8qIHRoZSBhYm92ZSBjb2RlOiAibHd6IHIyLDQocjEpIiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotc3RhdGljIGJmZF92bWEgcHBjX2dsdWVfaW5zbiA9IDB4ODA0MTAwMDQ7Ci0jZW5kaWYKLQotc3RydWN0IG1hYwotICB7Ci0gICAgY29uc3QgY2hhciAqdHlwZTsKLSAgICBjb25zdCBjaGFyICpob3dfYnl0ZTsKLSAgICBjb25zdCBjaGFyICpob3dfc2hvcnQ7Ci0gICAgY29uc3QgY2hhciAqaG93X2xvbmc7Ci0gICAgY29uc3QgY2hhciAqaG93X2FzY2l6OwotICAgIGNvbnN0IGNoYXIgKmhvd19jb21tZW50OwotICAgIGNvbnN0IGNoYXIgKmhvd19qdW1wOwotICAgIGNvbnN0IGNoYXIgKmhvd19nbG9iYWw7Ci0gICAgY29uc3QgY2hhciAqaG93X3NwYWNlOwotICAgIGNvbnN0IGNoYXIgKmhvd19hbGlnbl9zaG9ydDsKLSAgICBjb25zdCBjaGFyICpob3dfYWxpZ25fbG9uZzsKLSAgICBjb25zdCBjaGFyICpob3dfZGVmYXVsdF9hc19zd2l0Y2hlczsKLSAgICBjb25zdCBjaGFyICpob3dfYmZkX3RhcmdldDsKLSAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgaG93X2JmZF9hcmNoOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhvd19qdGFiOwotICAgIGludCBob3dfanRhYl9zaXplOyAvKiBzaXplIG9mIHRoZSBqdGFiIGVudHJ5ICovCi0gICAgaW50IGhvd19qdGFiX3JvZmY7IC8qIG9mZnNldCBpbnRvIGl0IGZvciB0aGUgaW5kIDMyIHJlbG9jIGludG8gaWRhdGEgNSAqLwotICB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1hYwotbXRhYmxlW10gPQotewotICB7Ci0jZGVmaW5lIE1BUk0gMAotICAgICJhcm0iLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICJAIiwKLSAgICAibGRyXHRpcCxbcGNdXG5cdGxkclx0cGMsW2lwXVxuXHQubG9uZyIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsICItbWFwY3MtMjYiLAotICAgICJwZS1hcm0tbGl0dGxlIiwgYmZkX2FyY2hfYXJtLAotICAgIGFybV9qdGFiLCBzaXplb2YgKGFybV9qdGFiKSwgOAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNMzg2IDEKLSAgICAiaTM4NiIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIiMiLAotICAgICJqbXAgKiIsICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCAiIiwKLSAgICAicGUtaTM4NiIsYmZkX2FyY2hfaTM4NiwKLSAgICBpMzg2X2p0YWIsIHNpemVvZiAoaTM4Nl9qdGFiKSwgMgotICB9Ci0gICwKLSAgewotI2RlZmluZSBNUFBDIDIKLSAgICAicHBjIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiIyIsCi0gICAgImptcCAqIiwgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsICIiLAotICAgICJwZS1wb3dlcnBjbGUiLGJmZF9hcmNoX3Bvd2VycGMsCi0gICAgcHBjX2p0YWIsIHNpemVvZiAocHBjX2p0YWIpLCAwCi0gIH0KLSAgLAotICB7Ci0jZGVmaW5lIE1USFVNQiAzCi0gICAgInRodW1iIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiQCIsCi0gICAgInB1c2hcdHtyNn1cblx0bGRyXHRyNiwgW3BjLCAjOF1cblx0bGRyXHRyNiwgW3I2XVxuXHRtb3ZcdGlwLCByNlxuXHRwb3BcdHtyNn1cblx0YnhcdGlwIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwgIi1tdGh1bWItaW50ZXJ3b3JrIiwKLSAgICAicGUtYXJtLWxpdHRsZSIsIGJmZF9hcmNoX2FybSwKLSAgICB0aHVtYl9qdGFiLCBzaXplb2YgKHRodW1iX2p0YWIpLCAxMgotICB9Ci0gICwKLSNkZWZpbmUgTUFSTV9JTlRFUldPUksgNAotICB7Ci0gICAgImFybV9pbnRlcndvcmsiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICJAIiwKLSAgICAibGRyXHRpcCxbcGNdXG5cdGxkclx0aXAsW2lwXVxuXHRieFx0aXBcblx0LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCAiLW10aHVtYi1pbnRlcndvcmsiLAotICAgICJwZS1hcm0tbGl0dGxlIiwgYmZkX2FyY2hfYXJtLAotICAgIGFybV9pbnRlcndvcmtfanRhYiwgc2l6ZW9mIChhcm1faW50ZXJ3b3JrX2p0YWIpLCAxMgotICB9Ci0gICwKLSAgewotI2RlZmluZSBNTUNPUkVfQkUgNQotICAgICJtY29yZS1iZSIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIi8vIiwKLSAgICAiam1waVx0MVxuXHRub3Bcblx0LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCAiIiwKLSAgICAicGUtbWNvcmUtYmlnIiwgYmZkX2FyY2hfbWNvcmUsCi0gICAgbWNvcmVfYmVfanRhYiwgc2l6ZW9mIChtY29yZV9iZV9qdGFiKSwgOAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNTUNPUkVfTEUgNgotICAgICJtY29yZS1sZSIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIi8vIiwKLSAgICAiam1waVx0MVxuXHRub3Bcblx0LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCAiLUVMIiwKLSAgICAicGUtbWNvcmUtbGl0dGxlIiwgYmZkX2FyY2hfbWNvcmUsCi0gICAgbWNvcmVfbGVfanRhYiwgc2l6ZW9mIChtY29yZV9sZV9qdGFiKSwgOAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNTUNPUkVfRUxGIDcKLSAgICAibWNvcmUtZWxmLWJlIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiLy8iLAotICAgICJqbXBpXHQxXG5cdG5vcFxuXHQubG9uZyIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsICIiLAotICAgICJlbGYzMi1tY29yZS1iaWciLCBiZmRfYXJjaF9tY29yZSwKLSAgICBtY29yZV9iZV9qdGFiLCBzaXplb2YgKG1jb3JlX2JlX2p0YWIpLCA4Ci0gIH0KLSAgLAotICB7Ci0jZGVmaW5lIE1NQ09SRV9FTEZfTEUgOAotICAgICJtY29yZS1lbGYtbGUiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIvLyIsCi0gICAgImptcGlcdDFcblx0bm9wXG5cdC5sb25nIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwgIi1FTCIsCi0gICAgImVsZjMyLW1jb3JlLWxpdHRsZSIsIGJmZF9hcmNoX21jb3JlLAotICAgIG1jb3JlX2xlX2p0YWIsIHNpemVvZiAobWNvcmVfbGVfanRhYiksIDgKLSAgfQotICAsCi0gIHsKLSNkZWZpbmUgTUFSTV9FUE9DIDkKLSAgICAiYXJtIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiQCIsCi0gICAgImxkclx0aXAsW3BjXVxuXHRsZHJcdHBjLFtpcF1cblx0LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCAiIiwKLSAgICAiZXBvYy1wZS1hcm0tbGl0dGxlIiwgYmZkX2FyY2hfYXJtLAotICAgIGFybV9qdGFiLCBzaXplb2YgKGFybV9qdGFiKSwgOAotICB9Ci0gICwKLSAgeyAwIH0KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGRsaXN0Ci17Ci0gIGNoYXIgKnRleHQ7Ci0gIHN0cnVjdCBkbGlzdCAqbmV4dDsKLX0KLWRsaXN0X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGV4cG9ydAotICB7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lOwotICAgIGludCBvcmRpbmFsOwotICAgIGludCBjb25zdGFudDsKLSAgICBpbnQgbm9uYW1lOwotICAgIGludCBkYXRhOwotICAgIGludCBoaW50OwotICAgIHN0cnVjdCBleHBvcnQgKm5leHQ7Ci0gIH0KLWV4cG9ydF90eXBlOwotCi0vKiBBIGxpc3Qgb2Ygc3ltYm9scyB3aGljaCB3ZSBzaG91bGQgbm90IGV4cG9ydC4gICovCi0gCi1zdHJ1Y3Qgc3RyaW5nX2xpc3QKLXsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpuZXh0OwotICBjaGFyICpzdHJpbmc7Ci19OwotCi1zdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICpleGNsdWRlczsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnJ2YWFmdGVyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKnJ2YWJlZm9yZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICphc21fcHJlZml4IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgYXBwZW5kX2ltcG9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBydW4gUEFSQU1TICgoY29uc3QgY2hhciAqLCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHNjYW5fZHJlY3R2ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzY2FuX2ZpbHRlcmVkX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIFBUUiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBhZGRfZXhjbHVkZXMgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtYXRjaF9leGNsdWRlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfZXhjbHVkZXMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGxvbmcgZmlsdGVyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIFBUUiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBzY2FuX2FsbF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzY2FuX29wZW5fb2JqX2ZpbGUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNjYW5fb2JqX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkdW1wX2RlZl9pbmZvIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCBzZnVuYyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotc3RhdGljIHZvaWQgZmx1c2hfcGFnZSBQQVJBTVMgKChGSUxFICosIGxvbmcgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGdlbl9kZWZfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9pZGF0YV9vZmlsZSBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkIGdlbl9leHBfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqeGxhdGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0jaWYgMAotc3RhdGljIHZvaWQgZHVtcF9pYXQgUEFSQU1TICgoRklMRSAqLCBleHBvcnRfdHlwZSAqKSk7Ci0jZW5kaWYKLXN0YXRpYyBjaGFyICptYWtlX2xhYmVsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYmZkICptYWtlX29uZV9saWJfZmlsZSBQQVJBTVMgKChleHBvcnRfdHlwZSAqLCBpbnQpKTsKLXN0YXRpYyBiZmQgKm1ha2VfaGVhZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYmZkICptYWtlX3RhaWwgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2VuX2xpYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcGZ1bmMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXN0YXRpYyBpbnQgbmZ1bmMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXN0YXRpYyB2b2lkIHJlbW92ZV9udWxsX25hbWVzIFBBUkFNUyAoKGV4cG9ydF90eXBlICoqKSk7Ci1zdGF0aWMgdm9pZCBkdGFiIFBBUkFNUyAoKGV4cG9ydF90eXBlICoqKSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2R1cGxpY2F0ZXMgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKLXN0YXRpYyB2b2lkIGZpbGxfb3JkaW5hbHMgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKLXN0YXRpYyBpbnQgYWxwaGFmdW5jIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCBtYW5nbGVfZGVmcyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgZGlzcGxheSBQQVJBTVMgKChjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLXN0YXRpYyB2b2lkIGluZm9ybSBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotc3RhdGljIHZvaWQgd2FybiBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheSAobWVzc2FnZSwgYXJncykKLSAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2U7Ci0gICAgIHZhX2xpc3QgICAgICBhcmdzOwotewotICBpZiAocHJvZ3JhbV9uYW1lICE9IE5VTEwpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0KLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0KLSAgaWYgKG1lc3NhZ2UgW3N0cmxlbiAobWVzc2FnZSkgLSAxXSAhPSAnXG4nKQotICAgIGZwdXRjICgnXG4nLCBzdGRlcnIpOwotfSAgCi0KLQotc3RhdGljIHZvaWQKLSNpZmRlZiBfX1NURENfXwotaW5mb3JtIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotI2Vsc2UKLWluZm9ybSAobWVzc2FnZSwgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlOwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZ3M7Ci0gIAotICBpZiAoIXZlcmJvc2UpCi0gICAgcmV0dXJuOwotCi0jaWZkZWYgX19TVERDX18KLSAgdmFfc3RhcnQgKGFyZ3MsIG1lc3NhZ2UpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZ3MpOwotI2VuZGlmCi0KLSAgZGlzcGxheSAobWVzc2FnZSwgYXJncyk7Ci0gIAotICB2YV9lbmQgKGFyZ3MpOwotfQotCi1zdGF0aWMgdm9pZAotI2lmZGVmIF9fU1REQ19fCi13YXJuIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotI2Vsc2UKLXdhcm4gKG1lc3NhZ2UsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICogbWVzc2FnZTsKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmdzOwotICAKLSNpZmRlZiBfX1NURENfXwotICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0jZW5kaWYKLSAgCi0gIGRpc3BsYXkgKG1lc3NhZ2UsIGFyZ3MpOwotCi0gIHZhX2VuZCAoYXJncyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXJ2YWFmdGVyIChtYWNoaW5lKQotICAgICBpbnQgbWFjaGluZTsKLXsKLSAgc3dpdGNoIChtYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIE1BUk06Ci0gICAgY2FzZSBNMzg2OgotICAgIGNhc2UgTVBQQzoKLSAgICBjYXNlIE1USFVNQjoKLSAgICBjYXNlIE1BUk1fSU5URVJXT1JLOgotICAgIGNhc2UgTU1DT1JFX0JFOgotICAgIGNhc2UgTU1DT1JFX0xFOgotICAgIGNhc2UgTU1DT1JFX0VMRjoKLSAgICBjYXNlIE1NQ09SRV9FTEZfTEU6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iKSwgbWFjaGluZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAiIjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcnZhYmVmb3JlIChtYWNoaW5lKQotICAgICBpbnQgbWFjaGluZTsKLXsKLSAgc3dpdGNoIChtYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIE1BUk06Ci0gICAgY2FzZSBNMzg2OgotICAgIGNhc2UgTVBQQzoKLSAgICBjYXNlIE1USFVNQjoKLSAgICBjYXNlIE1BUk1fSU5URVJXT1JLOgotICAgIGNhc2UgTU1DT1JFX0JFOgotICAgIGNhc2UgTU1DT1JFX0xFOgotICAgIGNhc2UgTU1DT1JFX0VMRjoKLSAgICBjYXNlIE1NQ09SRV9FTEZfTEU6Ci0gICAgICByZXR1cm4gIi5ydmFcdCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmYXRhbCAoXygiSW50ZXJuYWwgZXJyb3I6IFVua25vd24gbWFjaGluZSB0eXBlOiAlZFxuIiksIG1hY2hpbmUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gIiI7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWFzbV9wcmVmaXggKG1hY2hpbmUpCi0gICAgIGludCBtYWNoaW5lOwotewotICBzd2l0Y2ggKG1hY2hpbmUpCi0gICAgewotICAgIGNhc2UgTUFSTToKLSAgICBjYXNlIE1QUEM6Ci0gICAgY2FzZSBNVEhVTUI6Ci0gICAgY2FzZSBNQVJNX0lOVEVSV09SSzoKLSAgICBjYXNlIE1NQ09SRV9CRToKLSAgICBjYXNlIE1NQ09SRV9MRToKLSAgICBjYXNlIE1NQ09SRV9FTEY6Ci0gICAgY2FzZSBNTUNPUkVfRUxGX0xFOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzg2OgotICAgICAgcmV0dXJuICJfIjsKLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iKSwgbWFjaGluZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAiIjsKLX0KLQotI2RlZmluZSBBU01fQllURSAJbXRhYmxlW21hY2hpbmVdLmhvd19ieXRlCi0jZGVmaW5lIEFTTV9TSE9SVCAJbXRhYmxlW21hY2hpbmVdLmhvd19zaG9ydAotI2RlZmluZSBBU01fTE9ORwltdGFibGVbbWFjaGluZV0uaG93X2xvbmcKLSNkZWZpbmUgQVNNX1RFWFQJbXRhYmxlW21hY2hpbmVdLmhvd19hc2NpegotI2RlZmluZSBBU01fQyAJCW10YWJsZVttYWNoaW5lXS5ob3dfY29tbWVudAotI2RlZmluZSBBU01fSlVNUCAJbXRhYmxlW21hY2hpbmVdLmhvd19qdW1wCi0jZGVmaW5lIEFTTV9HTE9CQUwJbXRhYmxlW21hY2hpbmVdLmhvd19nbG9iYWwKLSNkZWZpbmUgQVNNX1NQQUNFCW10YWJsZVttYWNoaW5lXS5ob3dfc3BhY2UKLSNkZWZpbmUgQVNNX0FMSUdOX1NIT1JUIG10YWJsZVttYWNoaW5lXS5ob3dfYWxpZ25fc2hvcnQKLSNkZWZpbmUgQVNNX1JWQV9CRUZPUkUgCXJ2YWJlZm9yZShtYWNoaW5lKQotI2RlZmluZSBBU01fUlZBX0FGVEVSICAJcnZhYWZ0ZXIobWFjaGluZSkKLSNkZWZpbmUgQVNNX1BSRUZJWAlhc21fcHJlZml4KG1hY2hpbmUpCi0jZGVmaW5lIEFTTV9BTElHTl9MT05HICBtdGFibGVbbWFjaGluZV0uaG93X2FsaWduX2xvbmcKLSNkZWZpbmUgSE9XX0JGRF9SRUFEX1RBUkdFVCAgMCAgLyogYWx3YXlzIGRlZmF1bHQqLwotI2RlZmluZSBIT1dfQkZEX1dSSVRFX1RBUkdFVCBtdGFibGVbbWFjaGluZV0uaG93X2JmZF90YXJnZXQKLSNkZWZpbmUgSE9XX0JGRF9BUkNIICAgIG10YWJsZVttYWNoaW5lXS5ob3dfYmZkX2FyY2gKLSNkZWZpbmUgSE9XX0pUQUIgICAgICAgIG10YWJsZVttYWNoaW5lXS5ob3dfanRhYgotI2RlZmluZSBIT1dfSlRBQl9TSVpFICAgbXRhYmxlW21hY2hpbmVdLmhvd19qdGFiX3NpemUKLSNkZWZpbmUgSE9XX0pUQUJfUk9GRiAgIG10YWJsZVttYWNoaW5lXS5ob3dfanRhYl9yb2ZmCi0jZGVmaW5lIEFTTV9TV0lUQ0hFUyAgICBtdGFibGVbbWFjaGluZV0uaG93X2RlZmF1bHRfYXNfc3dpdGNoZXMKLQotc3RhdGljIGNoYXIgKipvYXY7Ci0KLXZvaWQKLXByb2Nlc3NfZGVmX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIEZJTEUgKmYgPSBmb3BlbiAobmFtZSwgRk9QRU5fUlQpOwotICAKLSAgaWYgKCFmKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oIkNhbid0IG9wZW4gZGVmIGZpbGU6ICVzIiksIG5hbWUpOwotCi0gIHl5aW4gPSBmOwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiUHJvY2Vzc2luZyBkZWYgZmlsZTogJXMiKSwgbmFtZSk7Ci0gIAotICB5eXBhcnNlICgpOwotCi0gIGluZm9ybSAoXygiUHJvY2Vzc2VkIGRlZiBmaWxlIikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgcGFyc2VyICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpkX25hbWU7CS8qIEFyZyB0byBOQU1FIG9yIExJQlJBUlkgKi8KLXN0YXRpYyBpbnQgZF9uZnVuY3M7CQkvKiBOdW1iZXIgb2YgZnVuY3Rpb25zIGV4cG9ydGVkICovCi1zdGF0aWMgaW50IGRfbmFtZWRfbmZ1bmNzOwkvKiBOdW1iZXIgb2YgbmFtZWQgZnVuY3Rpb25zIGV4cG9ydGVkICovCi1zdGF0aWMgaW50IGRfbG93X29yZDsJCS8qIExvd2VzdCBvcmRpbmFsIGluZGV4ICovCi1zdGF0aWMgaW50IGRfaGlnaF9vcmQ7CQkvKiBIaWdoZXN0IG9yZGluYWwgaW5kZXggKi8KLXN0YXRpYyBleHBvcnRfdHlwZSAqZF9leHBvcnRzOwkvKmxpc3Qgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zICovCi1zdGF0aWMgZXhwb3J0X3R5cGUgKipkX2V4cG9ydHNfbGV4aWNhbGx5OwkvKiB2ZWN0b3Igb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIGluIGFscGhhIG9yZGVyICovCi1zdGF0aWMgZGxpc3RfdHlwZSAqZF9saXN0OwkvKiBEZXNjcmlwdGlvbnMgKi8KLXN0YXRpYyBkbGlzdF90eXBlICphX2xpc3Q7CS8qIFN0dWZmIHRvIGdvIGluIGRpcmVjdGl2ZXMgKi8KLQotc3RhdGljIGludCBkX2lzX2RsbDsKLXN0YXRpYyBpbnQgZF9pc19leGU7Ci0KLWludAoteXllcnJvciAoZXJyKQotICAgICBjb25zdCBjaGFyICplcnI7Ci17Ci0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIHdhcm4gKF8oIlN5bnRheCBlcnJvciBpbiBkZWYgZmlsZSAlczolZFxuIiksIGRlZl9maWxlLCBsaW5lbnVtYmVyKTsKLSAgCi0gIHJldHVybiAwOwotfQotCi12b2lkCi1kZWZfZXhwb3J0cyAobmFtZSwgaW50ZXJuYWxfbmFtZSwgb3JkaW5hbCwgbm9uYW1lLCBjb25zdGFudCwgZGF0YSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZTsKLSAgICAgaW50IG9yZGluYWw7Ci0gICAgIGludCBub25hbWU7Ci0gICAgIGludCBjb25zdGFudDsKLSAgICAgaW50IGRhdGE7Ci17Ci0gIHN0cnVjdCBleHBvcnQgKnAgPSAoc3RydWN0IGV4cG9ydCAqKSB4bWFsbG9jIChzaXplb2YgKCpwKSk7Ci0KLSAgcC0+bmFtZSA9IG5hbWU7Ci0gIHAtPmludGVybmFsX25hbWUgPSBpbnRlcm5hbF9uYW1lID8gaW50ZXJuYWxfbmFtZSA6IG5hbWU7Ci0gIHAtPm9yZGluYWwgPSBvcmRpbmFsOwotICBwLT5jb25zdGFudCA9IGNvbnN0YW50OwotICBwLT5ub25hbWUgPSBub25hbWU7Ci0gIHAtPmRhdGEgPSBkYXRhOwotICBwLT5uZXh0ID0gZF9leHBvcnRzOwotICBkX2V4cG9ydHMgPSBwOwotICBkX25mdW5jcysrOwotfQotCi12b2lkCi1kZWZfbmFtZSAobmFtZSwgYmFzZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGJhc2U7Ci17Ci0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiTkFNRTogJXMgYmFzZTogJXgiKSwgbmFtZSwgYmFzZSk7Ci0gIAotICBpZiAoZF9pc19kbGwpCi0gICAgd2FybiAoXygiQ2FuJ3QgaGF2ZSBMSUJSQVJZIGFuZCBOQU1FXG4iKSk7Ci0gIAotICBkX25hbWUgPSBuYW1lOwotICAvKiBpZiAtLWRsbG5hbWUgbm90IHByb3ZpZGVkLCB1c2UgdGhlIG9uZSBpbiB0aGUgREVGIGZpbGUuCi0gICAgIEZJWE1FOiBJcyB0aGlzIGFwcHJvcHJpYXRlIGZvciBleGVjdXRhYmxlcz8gKi8KLSAgaWYgKCEgZGxsX25hbWUpCi0gICAgZGxsX25hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgZF9pc19leGUgPSAxOwotfQotCi12b2lkCi1kZWZfbGlicmFyeSAobmFtZSwgYmFzZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGJhc2U7Ci17Ci0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiTElCUkFSWTogJXMgYmFzZTogJXgiKSwgbmFtZSwgYmFzZSk7Ci0gIAotICBpZiAoZF9pc19leGUpCi0gICAgd2FybiAoXygiJXM6IENhbid0IGhhdmUgTElCUkFSWSBhbmQgTkFNRVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIAotICBkX25hbWUgPSBuYW1lOwotICAvKiBpZiAtLWRsbG5hbWUgbm90IHByb3ZpZGVkLCB1c2UgdGhlIG9uZSBpbiB0aGUgREVGIGZpbGUuICovCi0gIGlmICghIGRsbF9uYW1lKQotICAgIGRsbF9uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGRfaXNfZGxsID0gMTsKLX0KLQotdm9pZAotZGVmX2Rlc2NyaXB0aW9uIChkZXNjKQotICAgICBjb25zdCBjaGFyICpkZXNjOwotewotICBkbGlzdF90eXBlICpkID0gKGRsaXN0X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChkbGlzdF90eXBlKSk7Ci0gIGQtPnRleHQgPSB4c3RyZHVwIChkZXNjKTsKLSAgZC0+bmV4dCA9IGRfbGlzdDsKLSAgZF9saXN0ID0gZDsKLX0KLQotdm9pZAotbmV3X2RpcmVjdGl2ZSAoZGlyKQotICAgICBjaGFyICpkaXI7Ci17Ci0gIGRsaXN0X3R5cGUgKmQgPSAoZGxpc3RfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGRsaXN0X3R5cGUpKTsKLSAgZC0+dGV4dCA9IHhzdHJkdXAgKGRpcik7Ci0gIGQtPm5leHQgPSBhX2xpc3Q7Ci0gIGFfbGlzdCA9IGQ7Ci19Ci0KLXZvaWQKLWRlZl9oZWFwc2l6ZSAocmVzZXJ2ZSwgY29tbWl0KQotICAgICBpbnQgcmVzZXJ2ZTsKLSAgICAgaW50IGNvbW1pdDsKLXsKLSAgY2hhciBiWzIwMF07Ci0gIGlmIChjb21taXQgPiAwKQotICAgIHNwcmludGYgKGIsICItaGVhcCAweCV4LDB4JXggIiwgcmVzZXJ2ZSwgY29tbWl0KTsKLSAgZWxzZQotICAgIHNwcmludGYgKGIsICItaGVhcCAweCV4ICIsIHJlc2VydmUpOwotICBuZXdfZGlyZWN0aXZlICh4c3RyZHVwIChiKSk7Ci19Ci0KLXZvaWQKLWRlZl9zdGFja3NpemUgKHJlc2VydmUsIGNvbW1pdCkKLSAgICAgaW50IHJlc2VydmU7Ci0gICAgIGludCBjb21taXQ7Ci17Ci0gIGNoYXIgYlsyMDBdOwotICBpZiAoY29tbWl0ID4gMCkKLSAgICBzcHJpbnRmIChiLCAiLXN0YWNrIDB4JXgsMHgleCAiLCByZXNlcnZlLCBjb21taXQpOwotICBlbHNlCi0gICAgc3ByaW50ZiAoYiwgIi1zdGFjayAweCV4ICIsIHJlc2VydmUpOwotICBuZXdfZGlyZWN0aXZlICh4c3RyZHVwIChiKSk7Ci19Ci0KLS8qIGFwcGVuZF9pbXBvcnQgc2ltcGx5IGFkZHMgdGhlIGdpdmVuIGltcG9ydCBkZWZpbml0aW9uIHRvIHRoZSBnbG9iYWwKLSAgIGltcG9ydF9saXN0LiAgSXQgaXMgdXNlZCBieSBkZWZfaW1wb3J0LiAgKi8KLQotc3RhdGljIHZvaWQKLWFwcGVuZF9pbXBvcnQgKHN5bWJvbF9uYW1lLCBkbGxfbmFtZSwgZnVuY19vcmRpbmFsKQotICAgICBjb25zdCBjaGFyICpzeW1ib2xfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGxsX25hbWU7Ci0gICAgIGludCBmdW5jX29yZGluYWw7Ci17Ci0gIGloZWFkdHlwZSAqKnBxOwotICBpaGVhZHR5cGUgKnE7Ci0KLSAgZm9yIChwcSA9ICZpbXBvcnRfbGlzdDsgKnBxICE9IE5VTEw7IHBxID0gJigqcHEpLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKCgqcHEpLT5kbGxuYW1lLCBkbGxfbmFtZSkgPT0gMCkKLQl7Ci0JICBxID0gKnBxOwotCSAgcS0+ZnVuY3RhaWwtPm5leHQgPSB4bWFsbG9jIChzaXplb2YgKGlmdW5jdHlwZSkpOwotCSAgcS0+ZnVuY3RhaWwgPSBxLT5mdW5jdGFpbC0+bmV4dDsKLQkgIHEtPmZ1bmN0YWlsLT5vcmQgID0gZnVuY19vcmRpbmFsOwotCSAgcS0+ZnVuY3RhaWwtPm5hbWUgPSB4c3RyZHVwIChzeW1ib2xfbmFtZSk7Ci0JICBxLT5mdW5jdGFpbC0+bmV4dCA9IE5VTEw7Ci0JICBxLT5uZnVuY3MrKzsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIHEgPSB4bWFsbG9jIChzaXplb2YgKGloZWFkdHlwZSkpOwotICBxLT5kbGxuYW1lID0geHN0cmR1cCAoZGxsX25hbWUpOwotICBxLT5uZnVuY3MgPSAxOwotICBxLT5mdW5jaGVhZCA9IHhtYWxsb2MgKHNpemVvZiAoaWZ1bmN0eXBlKSk7Ci0gIHEtPmZ1bmN0YWlsID0gcS0+ZnVuY2hlYWQ7Ci0gIHEtPm5leHQgPSBOVUxMOwotICBxLT5mdW5jdGFpbC0+bmFtZSA9IHhzdHJkdXAgKHN5bWJvbF9uYW1lKTsKLSAgcS0+ZnVuY3RhaWwtPm9yZCAgPSBmdW5jX29yZGluYWw7Ci0gIHEtPmZ1bmN0YWlsLT5uZXh0ID0gTlVMTDsKLQotICAqcHEgPSBxOwotfQotCi0vKiBkZWZfaW1wb3J0IGlzIGNhbGxlZCBmcm9tIHdpdGhpbiBkZWZwYXJzZS55IHdoZW4gYW4gSU1QT1JUCi0gICBkZWNsYXJhdGlvbiBpcyBlbmNvdW50ZXJlZC4gIERlcGVuZGluZyBvbiB0aGUgZm9ybSBvZiB0aGUKLSAgIGRlY2xhcmF0aW9uLCB0aGUgbW9kdWxlIG5hbWUgbWF5IG9yIG1heSBub3QgbmVlZCAiLmRsbCIgdG8gYmUKLSAgIGFwcGVuZGVkIHRvIGl0LCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gbWF5IGJlIHN0b3JlZCBpbiBpbnRlcm5hbAotICAgb3IgZW50cnksIGFuZCB0aGVyZSBtYXkgb3IgbWF5IG5vdCBiZSBhbiBvcmRpbmFsIHZhbHVlIGFzc29jaWF0ZWQKLSAgIHdpdGggaXQuICAqLwotCi0vKiBBIG5vdGUgcmVnYXJkaW5nIHRoZSBwYXJzZSBtb2RlczoKLSAgIEluIGRlZnBhcnNlLnkgd2UgaGF2ZSB0byBhY2NlcHQgaW1wb3J0IGRlY2xhcmF0aW9ucyB3aGljaCBmb2xsb3cKLSAgIGFueSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKLSAgICAgPGZ1bmNfbmFtZV9pbl9hcHA+ID0gPGRsbF9uYW1lPi48ZnVuY19uYW1lX2luX2RsbD4KLSAgICAgPGZ1bmNfbmFtZV9pbl9hcHA+ID0gPGRsbF9uYW1lPi48bnVtYmVyPgotICAgICA8ZGxsX25hbWU+LjxmdW5jX25hbWVfaW5fZGxsPgotICAgICA8ZGxsX25hbWU+LjxudW1iZXI+Ci0gICBGdXJ0aGVybW9yZSwgdGhlIGRsbCdzIG5hbWUgbWF5IG9yIG1heSBub3QgZW5kIHdpdGggIi5kbGwiLCB3aGljaAotICAgY29tcGxpY2F0ZXMgdGhlIHBhcnNpbmcgYSBsaXR0bGUuICBOb3JtYWxseSB0aGUgZGxsJ3MgbmFtZSBpcwotICAgcGFzc2VkIHRvIGRlZl9pbXBvcnQoKSBpbiB0aGUgIm1vZHVsZSIgcGFyYW1ldGVyLCBidXQgd2hlbiBpdCBlbmRzCi0gICB3aXRoICIuZGxsIiBpdCBnZXRzIHBhc3NlZCBpbiAibW9kdWxlIiBzYW5zICIuZGxsIiBhbmQgdGhhdCBuZWVkcwotICAgdG8gYmUgcmVhcHBlbmRlZC4KLQotICBkZWZfaW1wb3J0IGdldHMgZml2ZSBwYXJhbWV0ZXJzOgotICBBUFBfTkFNRSAtIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgYXBwbGljYXRpb24sIGlmCi0gICAgICAgICAgICAgcHJlc2VudCwgb3IgTlVMTCBpZiBub3QgcHJlc2VudC4KLSAgTU9EVUxFICAgLSB0aGUgbmFtZSBvZiB0aGUgZGxsLCBwb3NzaWJseSBzYW5zIGV4dGVuc2lvbiAoaWUsICcuZGxsJykuCi0gIERMTEVYVCAgIC0gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZGxsLCBpZiBwcmVzZW50LCBOVUxMIGlmIG5vdCBwcmVzZW50LgotICBFTlRSWSAgICAtIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgZGxsLCBpZiBwcmVzZW50LCBvciBOVUxMLgotICBPUkRfVkFMICAtIHRoZSBudW1lcmljYWwgdGFnIG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgZGxsLCBpZiBwcmVzZW50LAotICAgICAgICAgICAgIG9yIE5VTEwuICBFeGFjdGx5IG9uZSBvZiA8ZW50cnk+IG9yIDxvcmRfdmFsPiBtdXN0IGJlCi0gICAgICAgICAgICAgcHJlc2VudCAoaS5lLiwgbm90IE5VTEwpLiAgKi8KLQotdm9pZAotZGVmX2ltcG9ydCAoYXBwX25hbWUsIG1vZHVsZSwgZGxsZXh0LCBlbnRyeSwgb3JkX3ZhbCkKLSAgICAgY29uc3QgY2hhciAqYXBwX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1vZHVsZTsKLSAgICAgY29uc3QgY2hhciAqZGxsZXh0OwotICAgICBjb25zdCBjaGFyICplbnRyeTsKLSAgICAgaW50IG9yZF92YWw7Ci17Ci0gIGNvbnN0IGNoYXIgKmFwcGxpY2F0aW9uX25hbWU7Ci0gIGNoYXIgKmJ1ZjsKLQotICBpZiAoZW50cnkgIT0gTlVMTCkKLSAgICBhcHBsaWNhdGlvbl9uYW1lID0gZW50cnk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoYXBwX25hbWUgIT0gTlVMTCkKLQlhcHBsaWNhdGlvbl9uYW1lID0gYXBwX25hbWU7Ci0gICAgICBlbHNlCi0JYXBwbGljYXRpb25fbmFtZSA9ICIiOwotICAgIH0KLSAgCi0gIGlmIChkbGxleHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAobW9kdWxlKSArIHN0cmxlbiAoZGxsZXh0KSArIDIpOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJXMuJXMiLCBtb2R1bGUsIGRsbGV4dCk7Ci0gICAgICBtb2R1bGUgPSBidWY7Ci0gICAgfQotCi0gIGFwcGVuZF9pbXBvcnQgKGFwcGxpY2F0aW9uX25hbWUsIG1vZHVsZSwgb3JkX3ZhbCk7Ci19Ci0KLXZvaWQKLWRlZl92ZXJzaW9uIChtYWpvciwgbWlub3IpCi0gICAgIGludCBtYWpvcjsKLSAgICAgaW50IG1pbm9yOwotewotICBwcmludGYgKCJWRVJTSU9OICVkLiVkXG4iLCBtYWpvciwgbWlub3IpOwotfQotCi12b2lkCi1kZWZfc2VjdGlvbiAobmFtZSwgYXR0cikKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGF0dHI7Ci17Ci0gIGNoYXIgYnVmWzIwMF07Ci0gIGNoYXIgYXR0c1s1XTsKLSAgY2hhciAqZCA9IGF0dHM7Ci0gIGlmIChhdHRyICYgMSkKLSAgICAqZCsrID0gJ1InOwotCi0gIGlmIChhdHRyICYgMikKLSAgICAqZCsrID0gJ1cnOwotICBpZiAoYXR0ciAmIDQpCi0gICAgKmQrKyA9ICdYJzsKLSAgaWYgKGF0dHIgJiA4KQotICAgICpkKysgPSAnUyc7Ci0gICpkKysgPSAwOwotICBzcHJpbnRmIChidWYsICItYXR0ciAlcyAlcyIsIG5hbWUsIGF0dHMpOwotICBuZXdfZGlyZWN0aXZlICh4c3RyZHVwIChidWYpKTsKLX0KLQotdm9pZAotZGVmX2NvZGUgKGF0dHIpCi0gICAgIGludCBhdHRyOwotewotCi0gIGRlZl9zZWN0aW9uICgiQ09ERSIsIGF0dHIpOwotfQotCi12b2lkCi1kZWZfZGF0YSAoYXR0cikKLSAgICAgaW50IGF0dHI7Ci17Ci0gIGRlZl9zZWN0aW9uICgiREFUQSIsIGF0dHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLXJ1biAod2hhdCwgYXJncykKLSAgICAgY29uc3QgY2hhciAqd2hhdDsKLSAgICAgY2hhciAqYXJnczsKLXsKLSAgY2hhciAqczsKLSAgaW50IHBpZCwgd2FpdF9zdGF0dXM7Ci0gIGludCBpOwotICBjb25zdCBjaGFyICoqYXJndjsKLSAgY2hhciAqZXJybXNnX2ZtdCwgKmVycm1zZ19hcmc7Ci0gIGNoYXIgKnRlbXBfYmFzZSA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0KLSAgaW5mb3JtICgicnVuOiAlcyAlc1xuIiwgd2hhdCwgYXJncyk7Ci0KLSAgLyogQ291bnQgdGhlIGFyZ3MgKi8KLSAgaSA9IDA7Ci0gIGZvciAocyA9IGFyZ3M7ICpzOyBzKyspCi0gICAgaWYgKCpzID09ICcgJykKLSAgICAgIGkrKzsKLSAgaSsrOwotICBhcmd2ID0gYWxsb2NhIChzaXplb2YgKGNoYXIgKikgKiAoaSArIDMpKTsKLSAgaSA9IDA7Ci0gIGFyZ3ZbaSsrXSA9IHdoYXQ7Ci0gIHMgPSBhcmdzOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICB3aGlsZSAoKnMgPT0gJyAnKQotCSsrczsKLSAgICAgIGFyZ3ZbaSsrXSA9IHM7Ci0gICAgICB3aGlsZSAoKnMgIT0gJyAnICYmICpzICE9IDApCi0JcysrOwotICAgICAgaWYgKCpzID09IDApCi0JYnJlYWs7Ci0gICAgICAqcysrID0gMDsKLSAgICB9Ci0gIGFyZ3ZbaSsrXSA9IE5VTEw7Ci0KLSAgcGlkID0gcGV4ZWN1dGUgKGFyZ3ZbMF0sIChjaGFyICogY29uc3QgKikgYXJndiwgcHJvZ3JhbV9uYW1lLCB0ZW1wX2Jhc2UsCi0JCSAgJmVycm1zZ19mbXQsICZlcnJtc2dfYXJnLCBQRVhFQ1VURV9PTkUgfCBQRVhFQ1VURV9TRUFSQ0gpOwotCi0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgaW5mb3JtIChzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIAotICAgICAgZmF0YWwgKGVycm1zZ19mbXQsIGVycm1zZ19hcmcpOwotICAgIH0KLQotICBwaWQgPSBwd2FpdCAocGlkLCAmIHdhaXRfc3RhdHVzLCAwKTsKLSAgCi0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJ3YWl0OiAlcyIpLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICB9Ci0gIGVsc2UgaWYgKFdJRlNJR05BTEVEICh3YWl0X3N0YXR1cykpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJzdWJwcm9jZXNzIGdvdCBmYXRhbCBzaWduYWwgJWQiKSwgV1RFUk1TSUcgKHdhaXRfc3RhdHVzKSk7Ci0gICAgfQotICBlbHNlIGlmIChXSUZFWElURUQgKHdhaXRfc3RhdHVzKSkKLSAgICB7Ci0gICAgICBpZiAoV0VYSVRTVEFUVVMgKHdhaXRfc3RhdHVzKSAhPSAwKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0Jd2FybiAoXygiJXMgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iKSwKLQkgICAgICB3aGF0LCBXRVhJVFNUQVRVUyAod2FpdF9zdGF0dXMpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotLyogTG9vayBmb3IgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0IGluIHRoZSAuZHJlY3R2ZSBzZWN0aW9uIG9mCi0gICBBQkZELiAgUGFzcyBlYWNoIG9uZSB0byBkZWZfZXhwb3J0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1zY2FuX2RyZWN0dmVfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqIHM7Ci0gIGludCAgICAgICAgc2l6ZTsKLSAgY2hhciAqICAgICBidWY7Ci0gIGNoYXIgKiAgICAgcDsKLSAgY2hhciAqICAgICBlOwotCi0gIC8qIExvb2sgZm9yIC5kcmVjdHZlJ3MgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBEUkVDVFZFX1NFQ1RJT05fTkFNRSk7Ci0gIAotICBpZiAocyA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgICAgIAotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzKTsKLSAgYnVmICA9IHhtYWxsb2MgKHNpemUpOwotCi0gIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgYnVmLCAwLCBzaXplKTsKLSAgICAgIAotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIlN1Y2tpbmcgaW4gaW5mbyBmcm9tICVzIHNlY3Rpb24gaW4gJXNcbiIpLAotCSAgRFJFQ1RWRV9TRUNUSU9OX05BTUUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAvKiBTZWFyY2ggZm9yIC1leHBvcnQ6IHN0cmluZ3MuIFRoZSBleHBvcnRlZCBzeW1ib2xzIGNhbiBvcHRpb25hbGx5Ci0gICAgIGhhdmUgdHlwZSB0YWdzIChlZy4sIC1leHBvcnQ6Zm9vLGRhdGEpLCBzbyBoYW5kbGUgdGhvc2UgYXMgd2VsbC4KLSAgICAgQ3VycmVudGx5IG9ubHkgZGF0YSB0YWcgaXMgc3VwcG9ydGVkLiAqLwotICBwID0gYnVmOwotICBlID0gYnVmICsgc2l6ZTsKLSAgd2hpbGUgKHAgPCBlKQotICAgIHsKLSAgICAgIGlmIChwWzBdID09ICctJwotCSAgJiYgc3RybmNtcCAocCwgIi1leHBvcnQ6IiwgOCkgPT0gMCkKLQl7Ci0JICBjaGFyICogbmFtZTsKLQkgIGNoYXIgKiBjOwotCSAgZmxhZ3dvcmQgZmxhZ3MgPSBCU0ZfRlVOQ1RJT047Ci0JICAKLQkgIHAgKz0gODsKLQkgIG5hbWUgPSBwOwotCSAgd2hpbGUgKHAgPCBlICYmICpwICE9ICcsJyAmJiAqcCAhPSAnICcgJiYgKnAgIT0gJy0nKQotCSAgICBwKys7Ci0JICBjID0geG1hbGxvYyAocCAtIG5hbWUgKyAxKTsKLQkgIG1lbWNweSAoYywgbmFtZSwgcCAtIG5hbWUpOwotCSAgY1twIC0gbmFtZV0gPSAwOwotCSAgaWYgKHAgPCBlICYmICpwID09ICcsJykgICAgICAgLyogZm91bmQgdHlwZSB0YWcuICovCi0JICAgIHsKLQkgICAgICBjaGFyICp0YWdfc3RhcnQgPSArK3A7Ci0JICAgICAgd2hpbGUgKHAgPCBlICYmICpwICE9ICcgJyAmJiAqcCAhPSAnLScpCi0JCXArKzsKLQkgICAgICBpZiAoc3RybmNtcCAodGFnX3N0YXJ0LCAiZGF0YSIsIDQpID09IDApCi0JCWZsYWdzICY9IH5CU0ZfRlVOQ1RJT047Ci0JICAgIH0KLQotCSAgLyogRklYTUU6IFRoZSA1dGggYXJnIGlzIGZvciB0aGUgYGNvbnN0YW50JyBmaWVsZC4KLQkgICAgIFdoYXQgc2hvdWxkIGl0IGJlPyAgTm90IHRoYXQgaXQgbWF0dGVycyBzaW5jZSBpdCdzIG5vdAotCSAgICAgY3VycmVudGx5IHVzZWZ1bC4gICovCi0JICBkZWZfZXhwb3J0cyAoYywgMCwgLTEsIDAsIDAsICEgKGZsYWdzICYgQlNGX0ZVTkNUSU9OKSk7Ci0KLQkgIGlmIChhZGRfc3RkY2FsbF9hbGlhcyAmJiBzdHJjaHIgKGMsICdAJykpCi0JICAgIHsKLQkgICAgICBjaGFyICpleHBvcnRlZF9uYW1lID0geHN0cmR1cCAoYyk7Ci0JICAgICAgY2hhciAqYXRzeW0gPSBzdHJjaHIgKGV4cG9ydGVkX25hbWUsICdAJyk7Ci0JICAgICAgKmF0c3ltID0gJ1wwJzsKLQkgICAgICAvKiBOb3RlOiBzdGRjYWxsIGFsaWFzIHN5bWJvbHMgY2FuIG5ldmVyIGJlIGRhdGEuICovCi0JICAgICAgZGVmX2V4cG9ydHMgKGV4cG9ydGVkX25hbWUsIHhzdHJkdXAgKGMpLCAtMSwgMCwgMCwgMCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JcCsrOwotICAgIH0KLSAgZnJlZSAoYnVmKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIGluIE1JTklTWU1TLCBhbmQgYWRkIGVhY2ggb25lIHRvIGxpc3Qgb2YKLSAgIHN5bWJvbHMgdG8gZXhwb3J0LiAgKi8KLQotc3RhdGljIHZvaWQKLXNjYW5fZmlsdGVyZWRfc3ltYm9scyAoYWJmZCwgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBtaW5pc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIGFzeW1ib2wgKnN0b3JlOwotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQ7Ci0KLSAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3RvcmUgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgY29uc3QgY2hhciAqc3ltYm9sX25hbWU7Ci0KLSAgICAgIHN5bSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZmFsc2UsIGZyb20sIHN0b3JlKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgc3ltYm9sX25hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pOwotICAgICAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkgPT0gc3ltYm9sX25hbWVbMF0pCi0JKytzeW1ib2xfbmFtZTsKLQotICAgICAgZGVmX2V4cG9ydHMgKHhzdHJkdXAgKHN5bWJvbF9uYW1lKSAsIDAsIC0xLCAwLCAwLAotCQkgICAhIChzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSk7Ci0KLSAgICAgIGlmIChhZGRfc3RkY2FsbF9hbGlhcyAmJiBzdHJjaHIgKHN5bWJvbF9uYW1lLCAnQCcpKQotICAgICAgICB7Ci0JICBjaGFyICpleHBvcnRlZF9uYW1lID0geHN0cmR1cCAoc3ltYm9sX25hbWUpOwotCSAgY2hhciAqYXRzeW0gPSBzdHJjaHIgKGV4cG9ydGVkX25hbWUsICdAJyk7Ci0JICAqYXRzeW0gPSAnXDAnOwotCSAgLyogTm90ZTogc3RkY2FsbCBhbGlhcyBzeW1ib2xzIGNhbiBuZXZlciBiZSBkYXRhLiAqLwotCSAgZGVmX2V4cG9ydHMgKGV4cG9ydGVkX25hbWUsIHhzdHJkdXAgKHN5bWJvbF9uYW1lKSwgLTEsIDAsIDAsIDApOwotCX0KLSAgICB9Ci19Ci0KLS8qIEFkZCBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleGNsdWRlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9leGNsdWRlcyAobmV3X2V4Y2x1ZGVzKQotICAgICBjb25zdCBjaGFyICpuZXdfZXhjbHVkZXM7Ci17Ci0gIGNoYXIgKmxvY2FsX2NvcHk7Ci0gIGNoYXIgKmV4Y2x1ZGVfc3RyaW5nOwotCi0gIGxvY2FsX2NvcHkgPSB4c3RyZHVwIChuZXdfZXhjbHVkZXMpOwotCi0gIGV4Y2x1ZGVfc3RyaW5nID0gc3RydG9rIChsb2NhbF9jb3B5LCAiLDoiKTsKLSAgZm9yICg7IGV4Y2x1ZGVfc3RyaW5nOyBleGNsdWRlX3N0cmluZyA9IHN0cnRvayAoTlVMTCwgIiw6IikpCi0gICAgewotICAgICAgc3RydWN0IHN0cmluZ19saXN0ICpuZXdfZXhjbHVkZTsKLSAgICAgIAotICAgICAgbmV3X2V4Y2x1ZGUgPSAoKHN0cnVjdCBzdHJpbmdfbGlzdCAqKQotCQkgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0cmluZ19saXN0KSkpOwotICAgICAgbmV3X2V4Y2x1ZGUtPnN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZXhjbHVkZV9zdHJpbmcpICsgMik7Ci0gICAgICAvKiBGSVhNRTogSXMgaXQgYWx3YXlzIHJpZ2h0IHRvIGFkZCBhIGxlYWRpbmcgdW5kZXJzY29yZT8gICovCi0gICAgICBzcHJpbnRmIChuZXdfZXhjbHVkZS0+c3RyaW5nLCAiXyVzIiwgZXhjbHVkZV9zdHJpbmcpOwotICAgICAgbmV3X2V4Y2x1ZGUtPm5leHQgPSBleGNsdWRlczsKLSAgICAgIGV4Y2x1ZGVzID0gbmV3X2V4Y2x1ZGU7Ci0KLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBpbmZvcm0gKF8oIkV4Y2x1ZGluZyBzeW1ib2w6ICVzXG4iKSwgZXhjbHVkZV9zdHJpbmcpOwotICAgIH0KLQotICBmcmVlIChsb2NhbF9jb3B5KTsKLX0KLQotLyogU2VlIGlmIFNUUklORyBpcyBvbiB0aGUgbGlzdCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWF0Y2hfZXhjbHVkZSAoc3RyaW5nKQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqZXhjbF9pdGVtOwotCi0gIGZvciAoZXhjbF9pdGVtID0gZXhjbHVkZXM7IGV4Y2xfaXRlbTsgZXhjbF9pdGVtID0gZXhjbF9pdGVtLT5uZXh0KQotICAgIGlmIChzdHJjbXAgKHN0cmluZywgZXhjbF9pdGVtLT5zdHJpbmcpID09IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBZGQgdGhlIGRlZmF1bHQgbGlzdCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X2RlZmF1bHRfZXhjbHVkZXMgKHZvaWQpCi17Ci0gIGFkZF9leGNsdWRlcyAoZGVmYXVsdF9leGNsdWRlcyk7Ci19Ci0KLS8qIENob29zZSB3aGljaCBzeW1ib2xzIHRvIGV4cG9ydC4gICovCi0KLXN0YXRpYyBsb25nCi1maWx0ZXJfc3ltYm9scyAoYWJmZCwgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBtaW5pc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIGJmZF9ieXRlICpmcm9tLCAqZnJvbWVuZCwgKnRvOwotICBhc3ltYm9sICpzdG9yZTsKLQotICBzdG9yZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGZyb20gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0gIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQgKiBzaXplOwotICB0byA9IChiZmRfYnl0ZSAqKSBtaW5pc3ltczsKLQotICBmb3IgKDsgZnJvbSA8IGZyb21lbmQ7IGZyb20gKz0gc2l6ZSkKLSAgICB7Ci0gICAgICBpbnQga2VlcCA9IDA7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0KLSAgICAgIHN5bSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZmFsc2UsIChjb25zdCBQVFIpIGZyb20sIHN0b3JlKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgLyogQ2hlY2sgZm9yIGV4dGVybmFsIGFuZCBkZWZpbmVkIG9ubHkgc3ltYm9scy4gICovCi0gICAgICBrZWVwID0gKCgoc3ltLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDAKLQkgICAgICAgfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAotCSAgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JICAgICAgJiYgISBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpOwotICAgICAgCi0gICAgICBrZWVwID0ga2VlcCAmJiAhIG1hdGNoX2V4Y2x1ZGUgKHN5bS0+bmFtZSk7Ci0KLSAgICAgIGlmIChrZWVwKQotCXsKLQkgIG1lbWNweSAodG8sIGZyb20sIHNpemUpOwotCSAgdG8gKz0gc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAodG8gLSAoYmZkX2J5dGUgKikgbWluaXN5bXMpIC8gc2l6ZTsKLX0KLQotLyogRXhwb3J0IGFsbCBzeW1ib2xzIGluIEFCRkQsIGV4Y2VwdCBmb3Igb25lcyB3ZSB3ZXJlIHRvbGQgbm90IHRvCi0gICBleHBvcnQuICAqLwotCi1zdGF0aWMgdm9pZAotc2Nhbl9hbGxfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHN5bWNvdW50OwotICBQVFIgbWluaXN5bXM7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotCi0gIC8qIElnbm9yZSBiZmRzIHdpdGggYW4gaW1wb3J0IGRlc2NyaXB0b3IgdGFibGUuICBXZSBhc3N1bWUgdGhhdCBhbnkKLSAgICAgc3VjaCBCRkQgY29udGFpbnMgc3ltYm9scyB3aGljaCBhcmUgZXhwb3J0ZWQgZnJvbSBhbm90aGVyIERMTCwKLSAgICAgYW5kIHdlIGRvbid0IHdhbnQgdG8gcmVleHBvcnQgdGhlbSBmcm9tIGhlcmUuICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaWRhdGEkNCIpKQotICAgIHJldHVybjsKLQotICBpZiAoISAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEhBU19TWU1TKSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgd2FybiAoXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gYmZkX3JlYWRfbWluaXN5bWJvbHMgKGFiZmQsIGZhbHNlLCAmbWluaXN5bXMsICZzaXplKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAoc3ltY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgd2FybiAoXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIERpc2NhcmQgdGhlIHN5bWJvbHMgd2UgZG9uJ3Qgd2FudCB0byBleHBvcnQuICBJdCdzIE9LIHRvIGRvIHRoaXMKLSAgICAgaW4gcGxhY2U7IHdlJ2xsIGZyZWUgdGhlIHN0b3JhZ2UgYW55d2F5LiAgKi8KLQotICBzeW1jb3VudCA9IGZpbHRlcl9zeW1ib2xzIChhYmZkLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpOwotICBzY2FuX2ZpbHRlcmVkX3N5bWJvbHMgKGFiZmQsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSk7Ci0KLSAgZnJlZSAobWluaXN5bXMpOwotfQotCi0vKiBMb29rIGF0IHRoZSBvYmplY3QgZmlsZSB0byBkZWNpZGUgd2hpY2ggc3ltYm9scyB0byBleHBvcnQuICAqLwotCi1zdGF0aWMgdm9pZAotc2Nhbl9vcGVuX29ial9maWxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChleHBvcnRfYWxsX3N5bWJvbHMpCi0gICAgc2Nhbl9hbGxfc3ltYm9scyAoYWJmZCk7Ci0gIGVsc2UKLSAgICBzY2FuX2RyZWN0dmVfc3ltYm9scyAoYWJmZCk7Ci0gCi0gIC8qIEZJWE1FOiB3ZSBvdWdodCB0byByZWFkIGluIGFuZCBibG9jayBvdXQgdGhlIGJhc2UgcmVsb2NhdGlvbnMgKi8KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIkRvbmUgcmVhZGluZyAlc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLX0KLQotc3RhdGljIHZvaWQKLXNjYW5fb2JqX2ZpbGUgKGZpbGVuYW1lKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgYmZkICogZiA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIDApOwotCi0gIGlmICghZikKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJVbmFibGUgdG8gb3BlbiBvYmplY3QgZmlsZTogJXMiKSwgZmlsZW5hbWUpOwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiU2Nhbm5pbmcgb2JqZWN0IGZpbGUgJXMiKSwgZmlsZW5hbWUpOwotICAKLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGYsIGJmZF9hcmNoaXZlKSkKLSAgICB7Ci0gICAgICBiZmQgKmFyZmlsZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGYsIDApOwotICAgICAgd2hpbGUgKGFyZmlsZSkKLQl7Ci0JICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYXJmaWxlLCBiZmRfb2JqZWN0KSkKLQkgICAgc2Nhbl9vcGVuX29ial9maWxlIChhcmZpbGUpOwotCSAgYmZkX2Nsb3NlIChhcmZpbGUpOwotCSAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZiwgYXJmaWxlKTsKLQl9Ci0gICAgICAKLSNpZmRlZiBETExUT09MX01DT1JFX0VMRgotICAgICAgaWYgKG1jb3JlX2VsZl9vdXRfZmlsZSkKLQlpbmZvcm0gKF8oIkNhbm5vdCBwcm9kdWNlIG1jb3JlLWVsZiBkbGwgZnJvbSBhcmNoaXZlIGZpbGU6ICVzIiksIGZpbGVuYW1lKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZiwgYmZkX29iamVjdCkpCi0gICAgewotICAgICAgc2Nhbl9vcGVuX29ial9maWxlIChmKTsKLQotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi0gICAgICBpZiAobWNvcmVfZWxmX291dF9maWxlKQotCW1jb3JlX2VsZl9jYWNoZV9maWxlbmFtZSAoKGNoYXIgKikgZmlsZW5hbWUpOwotI2VuZGlmCi0gICAgfQotCi0gIGJmZF9jbG9zZSAoZik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotZHVtcF9kZWZfaW5mbyAoZikKLSAgICAgRklMRSAqZjsKLXsKLSAgaW50IGk7Ci0gIGV4cG9ydF90eXBlICpleHA7Ci0gIGZwcmludGYgKGYsICIlcyAiLCBBU01fQyk7Ci0gIGZvciAoaSA9IDA7IG9hdltpXTsgaSsrKQotICAgIGZwcmludGYgKGYsICIlcyAiLCBvYXZbaV0pOwotICBmcHJpbnRmIChmLCAiXG4iKTsKLSAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICIlcyAgJWQgPSAlcyAlcyBAICVkICVzJXMlc1xuIiwKLQkgICAgICAgQVNNX0MsCi0JICAgICAgIGksCi0JICAgICAgIGV4cC0+bmFtZSwKLQkgICAgICAgZXhwLT5pbnRlcm5hbF9uYW1lLAotCSAgICAgICBleHAtPm9yZGluYWwsCi0JICAgICAgIGV4cC0+bm9uYW1lID8gIk5PTkFNRSAiIDogIiIsCi0JICAgICAgIGV4cC0+Y29uc3RhbnQgPyAiQ09OU1RBTlQiIDogIiIsCi0JICAgICAgIGV4cC0+ZGF0YSA/ICJEQVRBIiA6ICIiKTsKLSAgICB9Ci19Ci0KLS8qIEdlbmVyYXRlIHRoZSAuZXhwIGZpbGUgKi8KLQotc3RhdGljIGludAotc2Z1bmMgKGEsIGIpCi0gICAgIGNvbnN0IHZvaWQgKmE7Ci0gICAgIGNvbnN0IHZvaWQgKmI7Ci17Ci0gIHJldHVybiAqKGNvbnN0IGxvbmcgKikgYSAtICooY29uc3QgbG9uZyAqKSBiOwotfQotCi1zdGF0aWMgdm9pZAotZmx1c2hfcGFnZSAoZiwgbmVlZCwgcGFnZV9hZGRyLCBvbl9wYWdlKQotICAgICBGSUxFICpmOwotICAgICBsb25nICpuZWVkOwotICAgICBpbnQgcGFnZV9hZGRyOwotICAgICBpbnQgb25fcGFnZTsKLXsKLSAgaW50IGk7Ci0KLSAgLyogRmx1c2ggdGhpcyBwYWdlICovCi0gIGZwcmludGYgKGYsICJcdCVzXHQweCUwOHhcdCVzIFN0YXJ0aW5nIFJWQSBmb3IgY2h1bmtcbiIsCi0JICAgQVNNX0xPTkcsCi0JICAgcGFnZV9hZGRyLAotCSAgIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0JXNcdDB4JXhcdCVzIFNpemUgb2YgYmxvY2tcbiIsCi0JICAgQVNNX0xPTkcsCi0JICAgKG9uX3BhZ2UgKiAyKSArIChvbl9wYWdlICYgMSkgKiAyICsgOCwKLQkgICBBU01fQyk7Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgb25fcGFnZTsgaSsrKQotICAgIHsKLSAgICAgIGxvbmcgbmVlZGVkID0gbmVlZFtpXTsKLSAgICAgIAotICAgICAgaWYgKG5lZWRlZCkKLQluZWVkZWQgPSAoKG5lZWRlZCAtIHBhZ2VfYWRkcikgfCAweDMwMDApICYgMHhmZmZmOwotICAKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQweCVseFxuIiwgQVNNX1NIT1JULCBuZWVkZWQpOwotICAgIH0KLSAgCi0gIC8qIEFuZCBwYWRkaW5nICovCi0gIGlmIChvbl9wYWdlICYgMSkKLSAgICBmcHJpbnRmIChmLCAiXHQlc1x0MHgleFxuIiwgQVNNX1NIT1JULCAwIHwgMHgwMDAwKTsKLX0KLQotc3RhdGljIHZvaWQKLWdlbl9kZWZfZmlsZSAoKQotewotICBpbnQgaTsKLSAgZXhwb3J0X3R5cGUgKmV4cDsKLQotICBpbmZvcm0gKF8oIkFkZGluZyBleHBvcnRzIHRvIG91dHB1dCBmaWxlIikpOwotICAKLSAgZnByaW50ZiAob3V0cHV0X2RlZiwgIjsiKTsKLSAgZm9yIChpID0gMDsgb2F2W2ldOyBpKyspCi0gICAgZnByaW50ZiAob3V0cHV0X2RlZiwgIiAlcyIsIG9hdltpXSk7Ci0KLSAgZnByaW50ZiAob3V0cHV0X2RlZiwgIlxuRVhQT1JUU1xuIik7Ci0KLSAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQotICAgIHsKLSAgICAgIGNoYXIgKnF1b3RlID0gc3RyY2hyIChleHAtPm5hbWUsICcuJykgPyAiXCIiIDogIiI7Ci0gICAgICBjaGFyICpyZXMgPSBjcGx1c19kZW1hbmdsZSAoZXhwLT5pbnRlcm5hbF9uYW1lLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7Ci0KLSAgICAgIGlmIChzdHJjbXAgKGV4cC0+bmFtZSwgZXhwLT5pbnRlcm5hbF9uYW1lKSA9PSAwKQotICAgICAgICB7Ci0KLQkgIGZwcmludGYgKG91dHB1dF9kZWYsICJcdCVzJXMlcyBAICVkJXMlcyA7ICVzXG4iLAotCQkgICBxdW90ZSwKLQkJICAgZXhwLT5uYW1lLAotCQkgICBxdW90ZSwKLQkJICAgZXhwLT5vcmRpbmFsLAotCQkgICBleHAtPm5vbmFtZSA/ICIgTk9OQU1FIiA6ICIiLAotCQkgICBleHAtPmRhdGEgPyAiIERBVEEiIDogIiIsCi0JCSAgIHJlcyA/IHJlcyA6ICIiKTsKLQl9Ci0gICAgICBlbHNlIAotICAgICAgICB7Ci0gICAgICAgICAgY2hhciAqcXVvdGUxID0gc3RyY2hyIChleHAtPmludGVybmFsX25hbWUsICcuJykgPyAiXCIiIDogIiI7Ci0JICAvKiBjaGFyICphbGlhcyA9ICAqLwotCSAgZnByaW50ZiAob3V0cHV0X2RlZiwgIlx0JXMlcyVzID0gJXMlcyVzIEAgJWQlcyVzIDsgJXNcbiIsCi0JCSAgIHF1b3RlLAotCQkgICBleHAtPm5hbWUsCi0JCSAgIHF1b3RlLAotCQkgICBxdW90ZTEsCi0JCSAgIGV4cC0+aW50ZXJuYWxfbmFtZSwKLQkJICAgcXVvdGUxLAotCQkgICBleHAtPm9yZGluYWwsCi0JCSAgIGV4cC0+bm9uYW1lID8gIiBOT05BTUUiIDogIiIsCi0JCSAgIGV4cC0+ZGF0YSA/ICIgREFUQSIgOiAiIiwKLQkJICAgcmVzID8gcmVzIDogIiIpOwotCX0KLSAgICAgIGlmIChyZXMpCi0gICAgICAgIGZyZWUgKHJlcyk7Ci0gICAgfQotICAKLSAgaW5mb3JtIChfKCJBZGRlZCBleHBvcnRzIHRvIG91dHB1dCBmaWxlIikpOwotfQotCi0vKiBnZW5lcmF0ZV9pZGF0YV9vZmlsZSBnZW5lcmF0ZXMgdGhlIHBvcnRhYmxlIGFzc2VtYmx5IHNvdXJjZSBjb2RlCi0gICBmb3IgdGhlIGlkYXRhIHNlY3Rpb25zLiAgSXQgYXBwZW5kcyB0aGUgc291cmNlIGNvZGUgdG8gdGhlIGVuZCBvZgotICAgdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2VuZXJhdGVfaWRhdGFfb2ZpbGUgKGZpbHZhcikKLSAgICAgRklMRSAqZmlsdmFyOwotewotICBpaGVhZHR5cGUgKmhlYWRwdHI7Ci0gIGlmdW5jdHlwZSAqZnVuY3B0cjsKLSAgaW50ICAgICAgICBoZWFkaW5kZXg7Ci0gIGludCAgICAgICAgZnVuY2luZGV4OwotICBpbnQJICAgICBuaGVhZHM7Ci0KLSAgaWYgKGltcG9ydF9saXN0ID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGZwcmludGYgKGZpbHZhciwgIiVzIEltcG9ydCBkYXRhIHNlY3Rpb25zXG4iLCBBU01fQyk7Ci0gIGZwcmludGYgKGZpbHZhciwgIlxuXHQuc2VjdGlvblx0LmlkYXRhJDJcbiIpOwotICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHRkb2lfaWRhdGFcbiIsIEFTTV9HTE9CQUwpOwotICBmcHJpbnRmIChmaWx2YXIsICJkb2lfaWRhdGE6XG4iKTsKLQotICBuaGVhZHMgPSAwOwotICBmb3IgKGhlYWRwdHIgPSBpbXBvcnRfbGlzdDsgaGVhZHB0ciAhPSBOVUxMOyBoZWFkcHRyID0gaGVhZHB0ci0+bmV4dCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsICJcdCVzbGlzdG9uZSVkJXNcdCVzICVzXG4iLAotCSAgICAgICBBU01fUlZBX0JFRk9SRSwgbmhlYWRzLCBBU01fUlZBX0FGVEVSLAotCSAgICAgICBBU01fQywgaGVhZHB0ci0+ZGxsbmFtZSk7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsICJcdCVzZGxsbmFtZSVkJXNcbiIsCi0JICAgICAgIEFTTV9SVkFfQkVGT1JFLCBuaGVhZHMsIEFTTV9SVkFfQUZURVIpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc2xpc3R0d28lZCVzXG5cbiIsCi0JICAgICAgIEFTTV9SVkFfQkVGT1JFLCBuaGVhZHMsIEFTTV9SVkFfQUZURVIpOwotICAgICAgbmhlYWRzKys7Ci0gICAgfQotCi0gIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsgLyogTlVMTCByZWNvcmQgYXQgKi8KLSAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOyAvKiBlbmQgb2YgaWRhdGEkMiAqLwotICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7IC8qIHNlY3Rpb24gICAgICAgICovCi0gIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLSAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotCi0gIGZwcmludGYgKGZpbHZhciwgIlxuXHQuc2VjdGlvblx0LmlkYXRhJDRcbiIpOwotICBoZWFkaW5kZXggPSAwOwotICBmb3IgKGhlYWRwdHIgPSBpbXBvcnRfbGlzdDsgaGVhZHB0ciAhPSBOVUxMOyBoZWFkcHRyID0gaGVhZHB0ci0+bmV4dCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsICJsaXN0b25lJWQ6XG4iLCBoZWFkaW5kZXgpOwotICAgICAgZm9yICggZnVuY2luZGV4ID0gMDsgZnVuY2luZGV4IDwgaGVhZHB0ci0+bmZ1bmNzOyBmdW5jaW5kZXgrKyApCi0JZnByaW50ZiAoZmlsdmFyLCAiXHQlc2Z1bmNwdHIlZF8lZCVzXG4iLAotCQkgQVNNX1JWQV9CRUZPUkUsIGhlYWRpbmRleCwgZnVuY2luZGV4LCBBU01fUlZBX0FGVEVSKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOyAvKiBOVUxMIHRlcm1pbmF0aW5nIGxpc3QgKi8KLSAgICAgIGhlYWRpbmRleCsrOwotICAgIH0KLQotICBmcHJpbnRmIChmaWx2YXIsICJcblx0LnNlY3Rpb25cdC5pZGF0YSQ1XG4iKTsKLSAgaGVhZGluZGV4ID0gMDsKLSAgZm9yIChoZWFkcHRyID0gaW1wb3J0X2xpc3Q7IGhlYWRwdHIgIT0gTlVMTDsgaGVhZHB0ciA9IGhlYWRwdHItPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsdmFyLCAibGlzdHR3byVkOlxuIiwgaGVhZGluZGV4KTsKLSAgICAgIGZvciAoIGZ1bmNpbmRleCA9IDA7IGZ1bmNpbmRleCA8IGhlYWRwdHItPm5mdW5jczsgZnVuY2luZGV4KysgKQotCWZwcmludGYgKGZpbHZhciwgIlx0JXNmdW5jcHRyJWRfJWQlc1xuIiwKLQkJIEFTTV9SVkFfQkVGT1JFLCBoZWFkaW5kZXgsIGZ1bmNpbmRleCwgQVNNX1JWQV9BRlRFUik7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7IC8qIE5VTEwgdGVybWluYXRpbmcgbGlzdCAqLwotICAgICAgaGVhZGluZGV4Kys7Ci0gICAgfQotCi0gIGZwcmludGYgKGZpbHZhciwgIlxuXHQuc2VjdGlvblx0LmlkYXRhJDZcbiIpOwotICBoZWFkaW5kZXggPSAwOwotICBmb3IgKGhlYWRwdHIgPSBpbXBvcnRfbGlzdDsgaGVhZHB0ciAhPSBOVUxMOyBoZWFkcHRyID0gaGVhZHB0ci0+bmV4dCkKLSAgICB7Ci0gICAgICBmdW5jaW5kZXggPSAwOwotICAgICAgZm9yIChmdW5jcHRyID0gaGVhZHB0ci0+ZnVuY2hlYWQ7IGZ1bmNwdHIgIT0gTlVMTDsKLQkgICBmdW5jcHRyID0gZnVuY3B0ci0+bmV4dCkKLQl7Ci0JICBmcHJpbnRmIChmaWx2YXIsImZ1bmNwdHIlZF8lZDpcbiIsIGhlYWRpbmRleCwgZnVuY2luZGV4KTsKLQkgIGZwcmludGYgKGZpbHZhciwiXHQlc1x0JWRcbiIsIEFTTV9TSE9SVCwKLQkJICAgKChmdW5jcHRyLT5vcmQpICYgMHhGRkZGKSk7Ci0JICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdFwiJXNcIlxuIiwgQVNNX1RFWFQsIGZ1bmNwdHItPm5hbWUpOwotCSAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHQwXG4iLCBBU01fQllURSk7Ci0JICBmdW5jaW5kZXgrKzsKLQl9Ci0gICAgICBoZWFkaW5kZXgrKzsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZmlsdmFyLCAiXG5cdC5zZWN0aW9uXHQuaWRhdGEkN1xuIik7Ci0gIGhlYWRpbmRleCA9IDA7Ci0gIGZvciAoaGVhZHB0ciA9IGltcG9ydF9saXN0OyBoZWFkcHRyICE9IE5VTEw7IGhlYWRwdHIgPSBoZWFkcHRyLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbHZhciwiZGxsbmFtZSVkOlxuIiwgaGVhZGluZGV4KTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwiXHQlc1x0XCIlc1wiXG4iLCBBU01fVEVYVCwgaGVhZHB0ci0+ZGxsbmFtZSk7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdDBcbiIsIEFTTV9CWVRFKTsKLSAgICAgIGhlYWRpbmRleCsrOwotICAgIH0KLX0KLQotLyogQXNzZW1ibGUgdGhlIHNwZWNpZmllZCBmaWxlLiAqLwotc3RhdGljIHZvaWQKLWFzc2VtYmxlX2ZpbGUgKHNvdXJjZSwgZGVzdCkKLSAgICAgY29uc3QgY2hhciAqIHNvdXJjZTsKLSAgICAgY29uc3QgY2hhciAqIGRlc3Q7Ci17Ci0gIGNoYXIgKiBjbWQ7Ci0gIAotICBjbWQgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoQVNNX1NXSVRDSEVTKSArIHN0cmxlbiAoYXNfZmxhZ3MpCi0JCQkgKyBzdHJsZW4gKHNvdXJjZSkgKyBzdHJsZW4gKGRlc3QpICsgNTApOwotCi0gIHNwcmludGYgKGNtZCwgIiVzICVzIC1vICVzICVzIiwgQVNNX1NXSVRDSEVTLCBhc19mbGFncywgZGVzdCwgc291cmNlKTsKLQotICBydW4gKGFzX25hbWUsIGNtZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZW5fZXhwX2ZpbGUgKCkKLXsKLSAgRklMRSAqZjsKLSAgaW50IGk7Ci0gIGV4cG9ydF90eXBlICpleHA7Ci0gIGRsaXN0X3R5cGUgKmRsOwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiR2VuZXJhdGluZyBleHBvcnQgZmlsZTogJXNcbiIpLCBleHBfbmFtZSk7Ci0gIAotICBmID0gZm9wZW4gKFRNUF9BU00sIEZPUEVOX1dUKTsKLSAgaWYgKCFmKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oIlVuYWJsZSB0byBvcGVuIHRlbXBvcmFyeSBhc3NlbWJsZXIgZmlsZTogJXMiKSwgVE1QX0FTTSk7Ci0gIAotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIk9wZW5lZCB0ZW1wb3JhcnkgZmlsZTogJXMiKSwgVE1QX0FTTSk7Ci0KLSAgZHVtcF9kZWZfaW5mbyAoZik7Ci0gIAotICBpZiAoZF9leHBvcnRzKQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5lZGF0YVxuXG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzCTAJJXMgQWxsd2F5cyAwXG4iLCBBU01fTE9ORywgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXMJMHglbHgJJXMgVGltZSBhbmQgZGF0ZVxuIiwgQVNNX0xPTkcsIChsb25nKSB0aW1lKDApLAotCSAgICAgICBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlcwkwCSVzIE1ham9yIGFuZCBNaW5vciB2ZXJzaW9uXG4iLCBBU01fTE9ORywgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNuYW1lJXMJJXMgUHRyIHRvIG5hbWUgb2YgZGxsXG4iLCBBU01fUlZBX0JFRk9SRSwgQVNNX1JWQV9BRlRFUiwgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXMJJWQJJXMgU3RhcnRpbmcgb3JkaW5hbCBvZiBleHBvcnRzXG4iLCBBU01fTE9ORywgZF9sb3dfb3JkLCBBU01fQyk7Ci0KLQotICAgICAgZnByaW50ZiAoZiwgIlx0JXMJJWQJJXMgTnVtYmVyIG9mIGZ1bmN0aW9uc1xuIiwgQVNNX0xPTkcsIGRfaGlnaF9vcmQgLSBkX2xvd19vcmQgKyAxLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmKGYsIlx0JXMgbmFtZWQgZnVuY3MgJWQsIGxvdyBvcmQgJWQsIGhpZ2ggb3JkICVkXG4iLAotCSAgICAgIEFTTV9DLAotCSAgICAgIGRfbmFtZWRfbmZ1bmNzLCBkX2xvd19vcmQsIGRfaGlnaF9vcmQpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXMJJWQJJXMgTnVtYmVyIG9mIG5hbWVzXG4iLCBBU01fTE9ORywKLQkgICAgICAgc2hvd19hbGxuYW1lcyA/IGRfaGlnaF9vcmQgLSBkX2xvd19vcmQgKyAxIDogZF9uYW1lZF9uZnVuY3MsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzYWZ1bmNzJXMgICVzIEFkZHJlc3Mgb2YgZnVuY3Rpb25zXG4iLCBBU01fUlZBX0JFRk9SRSwgQVNNX1JWQV9BRlRFUiwgQVNNX0MpOwotCi0gICAgICBmcHJpbnRmIChmLCAiXHQlc2FuYW1lcyVzCSVzIEFkZHJlc3Mgb2YgTmFtZSBQb2ludGVyIFRhYmxlXG4iLAotCSAgICAgICBBU01fUlZBX0JFRk9SRSwgQVNNX1JWQV9BRlRFUiwgQVNNX0MpOwotCi0gICAgICBmcHJpbnRmIChmLCAiXHQlc2Fub3JkcyVzCSVzIEFkZHJlc3Mgb2Ygb3JkaW5hbHNcbiIsIEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0KLSAgICAgIGZwcmludGYgKGYsICJuYW1lOgklcwlcIiVzXCJcbiIsIEFTTV9URVhULCBkbGxfbmFtZSk7Ci0KLQotICAgICAgZnByaW50ZihmLCIlcyBFeHBvcnQgYWRkcmVzcyBUYWJsZVxuIiwgQVNNX0MpOwotICAgICAgZnByaW50ZihmLCJcdCVzXG4iLCBBU01fQUxJR05fTE9ORyk7Ci0gICAgICBmcHJpbnRmIChmLCAiYWZ1bmNzOlxuIik7Ci0gICAgICBpID0gZF9sb3dfb3JkOwotCi0gICAgICBmb3IgKGV4cCA9IGRfZXhwb3J0czsgZXhwOyBleHAgPSBleHAtPm5leHQpCi0JewotCSAgaWYgKGV4cC0+b3JkaW5hbCAhPSBpKQotCSAgICB7Ci0jaWYgMAotCSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQlZFx0JXMgJWQuLiVkIG1pc3NpbmdcbiIsCi0JCSAgICAgICBBU01fU1BBQ0UsCi0JCSAgICAgICAoZXhwLT5vcmRpbmFsIC0gaSkgKiA0LAotCQkgICAgICAgQVNNX0MsCi0JCSAgICAgICBpLCBleHAtPm9yZGluYWwgLSAxKTsKLQkgICAgICBpID0gZXhwLT5vcmRpbmFsOwotI2VuZGlmCi0JICAgICAgd2hpbGUgKGkgPCBleHAtPm9yZGluYWwpCi0JCXsKLQkJICBmcHJpbnRmKGYsIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLQkJICBpKys7Ci0JCX0KLQkgICAgfQotCSAgZnByaW50ZiAoZiwgIlx0JXMlcyVzJXNcdCVzICVkXG4iLCBBU01fUlZBX0JFRk9SRSwKLSAgICAgICAgICAgICAgICAgICBBU01fUFJFRklYLAotICAgICAgICAgICAgICAgICAgIGV4cC0+aW50ZXJuYWxfbmFtZSwgQVNNX1JWQV9BRlRFUiwgQVNNX0MsIGV4cC0+b3JkaW5hbCk7Ci0JICBpKys7Ci0JfQotCi0gICAgICBmcHJpbnRmIChmLCIlcyBFeHBvcnQgTmFtZSBQb2ludGVyIFRhYmxlXG4iLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiYW5hbWVzOlxuIik7Ci0KLSAgICAgIGZvciAoaSA9IDA7IChleHAgPSBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldKTsgaSsrKQotCXsKLQkgIGlmICghZXhwLT5ub25hbWUgfHwgc2hvd19hbGxuYW1lcykKLQkgICAgZnByaW50ZiAoZiwgIlx0JXNuJWQlc1xuIiwKLQkJICAgICBBU01fUlZBX0JFRk9SRSwgZXhwLT5vcmRpbmFsLCBBU01fUlZBX0FGVEVSKTsKLQl9Ci0KLSAgICAgIGZwcmludGYgKGYsIiVzIEV4cG9ydCBPcmlkaW5hbCBUYWJsZVxuIiwgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgImFub3JkczpcbiIpOwotICAgICAgZm9yIChpID0gMDsgKGV4cCA9IGRfZXhwb3J0c19sZXhpY2FsbHlbaV0pOyBpKyspCi0JewotCSAgaWYgKCFleHAtPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQotCSAgICBmcHJpbnRmIChmLCAiXHQlcwklZFxuIiwgQVNNX1NIT1JULCBleHAtPm9yZGluYWwgLSBkX2xvd19vcmQpOwotCX0KLQotICAgICAgZnByaW50ZihmLCIlcyBFeHBvcnQgTmFtZSBUYWJsZVxuIiwgQVNNX0MpOwotICAgICAgZm9yIChpID0gMDsgKGV4cCA9IGRfZXhwb3J0c19sZXhpY2FsbHlbaV0pOyBpKyspCi0JaWYgKCFleHAtPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQotCSAgZnByaW50ZiAoZiwgIm4lZDoJJXMJXCIlc1wiXG4iLAotCQkgICBleHAtPm9yZGluYWwsIEFTTV9URVhULCBleHAtPm5hbWUpOwotCi0gICAgICBpZiAoYV9saXN0KQotCXsKLQkgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uICVzXG4iLCBEUkVDVFZFX1NFQ1RJT05fTkFNRSk7Ci0JICBmb3IgKGRsID0gYV9saXN0OyBkbDsgZGwgPSBkbC0+bmV4dCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKGYsICJcdCVzXHRcIiVzXCJcbiIsIEFTTV9URVhULCBkbC0+dGV4dCk7Ci0JICAgIH0KLQl9Ci0gICAgICAKLSAgICAgIGlmIChkX2xpc3QpCi0JewotCSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24gLnJkYXRhXG4iKTsKLQkgIGZvciAoZGwgPSBkX2xpc3Q7IGRsOyBkbCA9IGRsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgY2hhciAqcDsKLQkgICAgICBpbnQgbDsKLQkgICAgICAvKiBXZSBkb250IG91dHB1dCBhcyBhc2NpaSAnY2F1c2UgdGhlcmUgY2FuCi0JICAgICAgICAgYmUgcXVvdGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nICovCi0KLQkgICAgICBsID0gMDsKLQkgICAgICBmb3IgKHAgPSBkbC0+dGV4dDsgKnA7IHArKykKLQkJewotCQkgIGlmIChsID09IDApCi0JCSAgICBmcHJpbnRmIChmLCAiXHQlc1x0IiwgQVNNX0JZVEUpOwotCQkgIGVsc2UKLQkJICAgIGZwcmludGYgKGYsICIsIik7Ci0JCSAgZnByaW50ZiAoZiwgIiVkIiwgKnApOwotCQkgIGlmIChwWzFdID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYgKGYsICIsMFxuIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGlmICgrK2wgPT0gMTApCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYgKGYsICJcbiIpOwotCQkgICAgICBsID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotCi0gIC8qIEFkZCB0byB0aGUgb3V0cHV0IGZpbGUgYSB3YXkgb2YgZ2V0dGluZyB0byB0aGUgZXhwb3J0ZWQgbmFtZXMKLSAgICAgd2l0aG91dCB1c2luZyB0aGUgaW1wb3J0IGxpYnJhcnkuICovCi0gIGlmIChhZGRfaW5kaXJlY3QpCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5yZGF0YVxuIik7Ci0gICAgICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCi0JaWYgKCFleHAtPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQotCSAgewotCSAgICAvKiBXZSB1c2UgYSBzaW5nbGUgdW5kZXJzY29yZSBmb3IgTVMgY29tcGF0aWJpbGl0eSwgYW5kIGEKLSAgICAgICAgICAgICAgIGRvdWJsZSB1bmRlcnNjb3JlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkCi0gICAgICAgICAgICAgICBjeWd3aW4gcmVsZWFzZXMuICAqLwotCSAgICBmcHJpbnRmIChmLCAiXHQlc1x0X19pbXBfJXNcbiIsIEFTTV9HTE9CQUwsIGV4cC0+bmFtZSk7Ci0JICAgIGZwcmludGYgKGYsICJcdCVzXHRfaW1wX18lc1xuIiwgQVNNX0dMT0JBTCwgZXhwLT5uYW1lKTsKLQkgICAgZnByaW50ZiAoZiwgIl9faW1wXyVzOlxuIiwgZXhwLT5uYW1lKTsKLQkgICAgZnByaW50ZiAoZiwgIl9pbXBfXyVzOlxuIiwgZXhwLT5uYW1lKTsKLQkgICAgZnByaW50ZiAoZiwgIlx0JXNcdCVzXG4iLCBBU01fTE9ORywgZXhwLT5uYW1lKTsKLQkgIH0KLSAgICB9Ci0KLSAgLyogRHVtcCB0aGUgcmVsb2Mgc2VjdGlvbiBpZiBhIGJhc2UgZmlsZSBpcyBwcm92aWRlZCAqLwotICBpZiAoYmFzZV9maWxlKQotICAgIHsKLSAgICAgIGludCBhZGRyOwotICAgICAgbG9uZyBuZWVkW1BBR0VfU0laRV07Ci0gICAgICBsb25nIHBhZ2VfYWRkcjsKLSAgICAgIGludCBudW1ieXRlczsKLSAgICAgIGludCBudW1fZW50cmllczsKLSAgICAgIGxvbmcgKmNvcHk7Ci0gICAgICBpbnQgajsKLSAgICAgIGludCBvbl9wYWdlOwotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5pbml0XG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJsYWI6XG4iKTsKLQotICAgICAgZnNlZWsgKGJhc2VfZmlsZSwgMCwgU0VFS19FTkQpOwotICAgICAgbnVtYnl0ZXMgPSBmdGVsbCAoYmFzZV9maWxlKTsKLSAgICAgIGZzZWVrIChiYXNlX2ZpbGUsIDAsIFNFRUtfU0VUKTsKLSAgICAgIGNvcHkgPSB4bWFsbG9jIChudW1ieXRlcyk7Ci0gICAgICBmcmVhZCAoY29weSwgMSwgbnVtYnl0ZXMsIGJhc2VfZmlsZSk7Ci0gICAgICBudW1fZW50cmllcyA9IG51bWJ5dGVzIC8gc2l6ZW9mIChsb25nKTsKLQotCi0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LnJlbG9jXG4iKTsKLSAgICAgIGlmIChudW1fZW50cmllcykKLQl7Ci0JICBpbnQgc3JjOwotCSAgaW50IGRzdCA9IDA7Ci0JICBpbnQgbGFzdCA9IC0xOwotCSAgcXNvcnQgKGNvcHksIG51bV9lbnRyaWVzLCBzaXplb2YgKGxvbmcpLCBzZnVuYyk7Ci0JICAvKiBEZWxldGUgZHVwbGNhdGVzICovCi0JICBmb3IgKHNyYyA9IDA7IHNyYyA8IG51bV9lbnRyaWVzOyBzcmMrKykKLQkgICAgewotCSAgICAgIGlmIChsYXN0ICE9IGNvcHlbc3JjXSkKLQkJbGFzdCA9IGNvcHlbZHN0KytdID0gY29weVtzcmNdOwotCSAgICB9Ci0JICBudW1fZW50cmllcyA9IGRzdDsKLQkgIGFkZHIgPSBjb3B5WzBdOwotCSAgcGFnZV9hZGRyID0gYWRkciAmIFBBR0VfTUFTSzsJCS8qIHdvcmsgb3V0IHRoZSBwYWdlIGFkZHIgKi8KLQkgIG9uX3BhZ2UgPSAwOwotCSAgZm9yIChqID0gMDsgaiA8IG51bV9lbnRyaWVzOyBqKyspCi0JICAgIHsKLQkgICAgICBhZGRyID0gY29weVtqXTsKLQkgICAgICBpZiAoKGFkZHIgJiBQQUdFX01BU0spICE9IHBhZ2VfYWRkcikKLQkJewotCQkgIGZsdXNoX3BhZ2UgKGYsIG5lZWQsIHBhZ2VfYWRkciwgb25fcGFnZSk7Ci0JCSAgb25fcGFnZSA9IDA7Ci0JCSAgcGFnZV9hZGRyID0gYWRkciAmIFBBR0VfTUFTSzsKLQkJfQotCSAgICAgIG5lZWRbb25fcGFnZSsrXSA9IGFkZHI7Ci0JICAgIH0KLQkgIGZsdXNoX3BhZ2UgKGYsIG5lZWQsIHBhZ2VfYWRkciwgb25fcGFnZSk7Ci0KLS8qCSAgZnByaW50ZiAoZiwgIlx0JXNcdDAsMFx0JXMgRW5kXG4iLCBBU01fTE9ORywgQVNNX0MpOyovCi0JfQotICAgIH0KLQotICBnZW5lcmF0ZV9pZGF0YV9vZmlsZSAoZik7Ci0KLSAgZmNsb3NlIChmKTsKLQotICAvKiBhc3NlbWJsZSB0aGUgZmlsZSAqLwotICBhc3NlbWJsZV9maWxlIChUTVBfQVNNLCBleHBfbmFtZSk7Ci0KLSAgaWYgKGRvbnRkZWx0ZW1wcyA9PSAwKQotICAgIHVubGluayAoVE1QX0FTTSk7Ci0gIAotICBpbmZvcm0gKF8oIkdlbmVyYXRlZCBleHBvcnRzIGZpbGUiKSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXhsYXRlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAoYWRkX3VuZGVyc2NvcmUpCi0gICAgewotICAgICAgY2hhciAqY29weSA9IHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAyKTsKLSAgICAgIGNvcHlbMF0gPSAnXyc7Ci0gICAgICBzdHJjcHkgKGNvcHkgKyAxLCBuYW1lKTsKLSAgICAgIG5hbWUgPSBjb3B5OwotICAgIH0KLQotICBpZiAoa2lsbGF0KQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBwID0gc3RyY2hyIChuYW1lLCAnQCcpOwotICAgICAgaWYgKHApCi0JKnAgPSAwOwotICAgIH0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgMAotCi1zdGF0aWMgdm9pZAotZHVtcF9pYXQgKGYsIGV4cCkKLSAgICAgRklMRSAqZjsKLSAgICAgZXhwb3J0X3R5cGUgKmV4cDsKLXsKLSAgaWYgKGV4cC0+bm9uYW1lICYmICFzaG93X2FsbG5hbWVzICkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MHglMDh4XG4iLAotCSAgICAgICBBU01fTE9ORywKLQkgICAgICAgZXhwLT5vcmRpbmFsIHwgMHg4MDAwMDAwMCk7IC8qIGhpbnQgb3Igb3JpbmRhbCA/PyAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzSUQlZCVzXG4iLCBBU01fUlZBX0JFRk9SRSwKLQkgICAgICAgZXhwLT5vcmRpbmFsLAotCSAgICAgICBBU01fUlZBX0FGVEVSKTsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdAotewotICBpbnQgaWQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGludCBmbGFnczsKLSAgaW50IGFsaWduOwotICBhc2VjdGlvbiAqc2VjOwotICBhc3ltYm9sICpzeW07Ci0gIGFzeW1ib2wgKipzeW1wcDsKLSAgaW50IHNpemU7Ci0gIHVuc2lnbmVkICAgY2hhciAqZGF0YTsKLX0gc2luZm87Ci0KLSNpZm5kZWYgRExMVE9PTF9QUEMKLQotI2RlZmluZSBURVhUIDAKLSNkZWZpbmUgREFUQSAxCi0jZGVmaW5lIEJTUyAyCi0jZGVmaW5lIElEQVRBNyAzCi0jZGVmaW5lIElEQVRBNSA0Ci0jZGVmaW5lIElEQVRBNCA1Ci0jZGVmaW5lIElEQVRBNiA2Ci0KLSNkZWZpbmUgTlNFQ1MgNwotCi1zdGF0aWMgc2luZm8gc2VjZGF0YVtOU0VDU10gPQotewotICB7IFRFWFQsICAgIi50ZXh0IiwgICAgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTLCAyfSwKLSAgeyBEQVRBLCAgICIuZGF0YSIsICAgIFNFQ19EQVRBLCAgICAgICAgICAgICAgICAgICAgMn0sCi0gIHsgQlNTLCAgICAiLmJzcyIsICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNywgIi5pZGF0YSQ3IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBJREFUQTUsICIuaWRhdGEkNSIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgSURBVEE0LCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNiwgIi5pZGF0YSQ2IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAxfQotfTsKLQotI2Vsc2UKLQotLyogU2VjdGlvbnMgbnVtYmVyZWQgdG8gbWFrZSB0aGUgb3JkZXIgdGhlIHNhbWUgYXMgb3RoZXIgUG93ZXJQQyBOVCAgICAqLwotLyogY29tcGlsZXJzLiBUaGlzIGFsc28ga2VlcHMgZnVubnkgYWxpZ25tZW50IHRoaW5naWVzIGZyb20gaGFwcGVuaW5nLiAqLwotI2RlZmluZSBURVhUICAgMAotI2RlZmluZSBQREFUQSAgMQotI2RlZmluZSBSREFUQSAgMgotI2RlZmluZSBJREFUQTUgMwotI2RlZmluZSBJREFUQTQgNAotI2RlZmluZSBJREFUQTYgNQotI2RlZmluZSBJREFUQTcgNgotI2RlZmluZSBEQVRBICAgNwotI2RlZmluZSBCU1MgICAgOAotCi0jZGVmaW5lIE5TRUNTIDkKLQotc3RhdGljIHNpbmZvIHNlY2RhdGFbTlNFQ1NdID0KLXsKLSAgeyBURVhULCAgICIudGV4dCIsICAgIFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUywgM30sCi0gIHsgUERBVEEsICAiLnBkYXRhIiwgICBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IFJEQVRBLCAgIi5yZWxkYXRhIiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBJREFUQTUsICIuaWRhdGEkNSIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgSURBVEE0LCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNiwgIi5pZGF0YSQ2IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAxfSwKLSAgeyBJREFUQTcsICIuaWRhdGEkNyIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgREFUQSwgICAiLmRhdGEiLCAgICBTRUNfREFUQSwgICAgICAgICAgICAgICAgICAgIDJ9LAotICB7IEJTUywgICAgIi5ic3MiLCAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAyfQotfTsKLQotI2VuZGlmCi0KLS8qCi1UaGlzIGlzIHdoYXQgd2UncmUgdHJ5aW5nIHRvIG1ha2UuICBXZSBnZW5lcmF0ZSB0aGUgaW1wIHN5bWJvbHMgd2l0aAotYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB1bmRlcnNjb3JlcywgZm9yIGNvbXBhdGliaWxpdHkuCi0KLQkudGV4dAotCS5nbG9iYWwJX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDgKLQkuZ2xvYmFsCV9faW1wX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDgKLV9HZXRGaWxlVmVyc2lvbkluZm9TaXplV0A4OgotCWptcCAqCV9faW1wX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDgKLQkuc2VjdGlvbgkuaWRhdGEkNwkjIFRvIGZvcmNlIGxvYWRpbmcgb2YgaGVhZAotCS5sb25nCV9fdmVyc2lvbl9hX2hlYWQKLSMgSW1wb3J0IEFkZHJlc3MgVGFibGUKLQkuc2VjdGlvbgkuaWRhdGEkNQotX19pbXBfR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVdAODoKLQkucnZhCUlEMgotCi0jIEltcG9ydCBMb29rdXAgVGFibGUKLQkuc2VjdGlvbgkuaWRhdGEkNAotCS5ydmEJSUQyCi0jIEhpbnQvTmFtZSB0YWJsZQotCS5zZWN0aW9uCS5pZGF0YSQ2Ci1JRDI6CS5zaG9ydAkyCi0JLmFzY2l6CSJHZXRGaWxlVmVyc2lvbkluZm9TaXplVyIKLQotCi1Gb3IgdGhlIFBvd2VyUEMsIGhlcmUncyB0aGUgdmFyaWF0aW9uIG9uIHRoZSBhYm92ZSBzY2hlbWU6Ci0KLSMgUmF0aGVyIHRoYW4gYSBzaW1wbGUgImptcCAqIiwgdGhlIGNvZGUgdG8gZ2V0IHRvIHRoZSBkbGwgZnVuY3Rpb24KLSMgbG9va3MgbGlrZToKLSAgICAgICAgIC50ZXh0Ci0gICAgICAgICBsd3oJcjExLFt0b2N2XV9faW1wX2Z1bmN0aW9uX25hbWUocjIpCi0jCQkgICBSRUxPQzogMDAwMDAwMDAgVE9DUkVMMTYsVE9DREVGTiBfX2ltcF9mdW5jdGlvbl9uYW1lCi0gICAgICAgICBsd3oJcjEyLDAocjExKQotCSBzdHcJcjIsNChyMSkKLQkgbXRjdHIJcjEyCi0JIGx3eglyMiw0KHIxMSkKLQkgYmN0cgotKi8KLQotc3RhdGljIGNoYXIgKgotbWFrZV9sYWJlbCAocHJlZml4LCBuYW1lKQotICAgICBjb25zdCBjaGFyICpwcmVmaXg7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBsZW4gPSBzdHJsZW4gKEFTTV9QUkVGSVgpICsgc3RybGVuIChwcmVmaXgpICsgc3RybGVuIChuYW1lKTsKLSAgY2hhciAqY29weSA9IHhtYWxsb2MgKGxlbiArMSApOwotICBzdHJjcHkgKGNvcHksIEFTTV9QUkVGSVgpOwotICBzdHJjYXQgKGNvcHksIHByZWZpeCk7Ci0gIHN0cmNhdCAoY29weSwgbmFtZSk7Ci0gIHJldHVybiBjb3B5OwotfQotCi1zdGF0aWMgYmZkICoKLW1ha2Vfb25lX2xpYl9maWxlIChleHAsIGkpCi0gICAgIGV4cG9ydF90eXBlICpleHA7Ci0gICAgIGludCBpOwotewotI2lmIDAKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgRklMRSAqZjsKLSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICJkIjsKLSAgICAgIGNoYXIgKmRlc3Q7Ci0KLSAgICAgIG5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAocHJlZml4KSArIDEwKTsKLSAgICAgIHNwcmludGYgKG5hbWUsICIlc3MlMDVkLnMiLCBwcmVmaXgsIGkpOwotICAgICAgZiA9IGZvcGVuIChuYW1lLCBGT1BFTl9XVCk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQudGV4dFxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0JXMlc1xuIiwgQVNNX0dMT0JBTCwgQVNNX1BSRUZJWCwgZXhwLT5uYW1lKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHRfX2ltcF8lc1xuIiwgQVNNX0dMT0JBTCwgZXhwLT5uYW1lKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHRfaW1wX18lc1xuIiwgQVNNX0dMT0JBTCwgZXhwLT5uYW1lKTsKLSAgICAgIGZwcmludGYgKGYsICIlcyVzOlxuXHQlc1x0X19pbXBfJXNcbiIsIEFTTV9QUkVGSVgsCi0JICAgICAgIGV4cC0+bmFtZSwgQVNNX0pVTVAsIGV4cC0+bmFtZSk7Ci0KLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQuaWRhdGEkN1x0JXMgVG8gZm9yY2UgbG9hZGluZyBvZiBoZWFkXG4iLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0JXNcbiIsIEFTTV9MT05HLCBoZWFkX2xhYmVsKTsKLQotCi0gICAgICBmcHJpbnRmIChmLCIlcyBJbXBvcnQgQWRkcmVzcyBUYWJsZVxuIiwgQVNNX0MpOwotCi0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNVxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiX19pbXBfJXM6XG4iLCBleHAtPm5hbWUpOwotICAgICAgZnByaW50ZiAoZiwgIl9pbXBfXyVzOlxuIiwgZXhwLT5uYW1lKTsKLQotICAgICAgZHVtcF9pYXQgKGYsIGV4cCk7Ci0KLSAgICAgIGZwcmludGYgKGYsICJcbiVzIEltcG9ydCBMb29rdXAgVGFibGVcbiIsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ0XG4iKTsKLQotICAgICAgZHVtcF9pYXQgKGYsIGV4cCk7Ci0KLSAgICAgIGlmKCFleHAtPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQotCXsKLQkgIGZwcmludGYgKGYsICIlcyBIaW50L05hbWUgdGFibGVcbiIsIEFTTV9DKTsKLQkgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ2XG4iKTsKLQkgIGZwcmludGYgKGYsICJJRCVkOlx0JXNcdCVkXG4iLCBleHAtPm9yZGluYWwsIEFTTV9TSE9SVCwgZXhwLT5oaW50KTsKLQkgIGZwcmludGYgKGYsICJcdCVzXHRcIiVzXCJcbiIsIEFTTV9URVhULCB4bGF0ZSAoZXhwLT5uYW1lKSk7Ci0JfQotCi0gICAgICBmY2xvc2UgKGYpOwotCi0gICAgICBkZXN0ID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHByZWZpeCkgKyAxMCk7Ci0gICAgICBzcHJpbnRmIChkZXN0LCAiJXNzJTA1ZC5vIiwgcHJlZml4LCBpKTsKLSAgICAgIGFzc2VtYmxlX2ZpbGUgKG5hbWUsIGRlc3QpOwotICAgIH0KLSNlbHNlIC8qIGlmIDAgKi8KLSAgICB7Ci0gICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgICBhc3ltYm9sICogIGV4cF9sYWJlbDsKLSAgICAgIGFzeW1ib2wgKiAgaW5hbWU7Ci0gICAgICBhc3ltYm9sICogIGluYW1lMjsKLSAgICAgIGFzeW1ib2wgKiAgaW5hbWVfbGFiOwotICAgICAgYXN5bWJvbCAqKiBpbmFtZV9sYWJfcHA7Ci0gICAgICBhc3ltYm9sICoqIGluYW1lX3BwOwotI2lmZGVmIERMTFRPT0xfUFBDCi0gICAgICBhc3ltYm9sICoqIGZuX3BwOwotICAgICAgYXN5bWJvbCAqKiB0b2NfcHA7Ci0jZGVmaW5lIEVYVFJBCSAyCi0jZW5kaWYKLSNpZm5kZWYgRVhUUkEKLSNkZWZpbmUgRVhUUkEgICAgMAotI2VuZGlmCi0gICAgICBhc3ltYm9sICogIHB0cnNbTlNFQ1MgKyA0ICsgRVhUUkEgKyAxXTsKLQotICAgICAgY2hhciAqICAgICBvdXRuYW1lID0geG1hbGxvYyAoMTApOwotICAgICAgaW50ICAgICAgICBvaWR4ID0gMDsKLQotICAgICAgCi0gICAgICBzcHJpbnRmIChvdXRuYW1lLCAiJXMlMDVkLm8iLCBUTVBfU1RVQiwgaSk7Ci0gICAgICAKLSAgICAgIGFiZmQgPSBiZmRfb3BlbncgKG91dG5hbWUsIEhPV19CRkRfV1JJVEVfVEFSR0VUKTsKLSAgICAgIAotICAgICAgaWYgKCFhYmZkKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JZmF0YWwgKF8oImJmZF9vcGVuIGZhaWxlZCBvcGVuIHN0dWIgZmlsZTogJXMiKSwgb3V0bmFtZSk7Ci0KLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBpbmZvcm0gKF8oIkNyZWF0aW5nIHN0dWIgZmlsZTogJXMiKSwgb3V0bmFtZSk7Ci0gICAgICAKLSAgICAgIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KTsKLSAgICAgIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBIT1dfQkZEX0FSQ0gsIDApOwotCi0jaWZkZWYgRExMVE9PTF9BUk0KLSAgICAgIGlmIChtYWNoaW5lID09IE1BUk1fSU5URVJXT1JLIHx8IG1hY2hpbmUgPT0gTVRIVU1CKQotCWJmZF9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgRl9JTlRFUldPUkspOwotI2VuZGlmCi0gICAgICAKLSAgICAgIC8qIEZpcnN0IG1ha2Ugc3ltYm9scyBmb3IgdGhlIHNlY3Rpb25zICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgTlNFQ1M7IGkrKykKLQl7Ci0JICBzaW5mbyAqc2kgPSBzZWNkYXRhICsgaTsKLQkgIGlmIChzaS0+aWQgIT0gaSkKLQkgICAgYWJvcnQoKTsKLQkgIHNpLT5zZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsIHNpLT5uYW1lKTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwKLQkJCQkgc2ktPnNlYywKLQkJCQkgc2ktPmZsYWdzKTsKLQotCSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChhYmZkLCBzaS0+c2VjLCBzaS0+YWxpZ24pOwotCSAgc2ktPnNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzaS0+c2VjOwotCSAgc2ktPnN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKTsKLQkgIHNpLT5zeW0tPm5hbWUgPSBzaS0+c2VjLT5uYW1lOwotCSAgc2ktPnN5bS0+c2VjdGlvbiA9IHNpLT5zZWM7Ci0JICBzaS0+c3ltLT5mbGFncyA9IEJTRl9MT0NBTDsKLQkgIHNpLT5zeW0tPnZhbHVlID0gMDsKLQkgIHB0cnNbb2lkeF0gPSBzaS0+c3ltOwotCSAgc2ktPnN5bXBwID0gcHRycyArIG9pZHg7Ci0JICBzaS0+c2l6ZSA9IDA7Ci0JICBzaS0+ZGF0YSA9IE5VTEw7Ci0KLQkgIG9pZHgrKzsKLQl9Ci0KLSAgICAgIGlmICghIGV4cC0+ZGF0YSkKLQl7Ci0JICBleHBfbGFiZWwgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotCSAgZXhwX2xhYmVsLT5uYW1lID0gbWFrZV9sYWJlbCAoIiIsIGV4cC0+bmFtZSk7Ci0KLQkgIC8qIE9uIFBvd2VyUEMsIHRoZSBmdW5jdGlvbiBuYW1lIHBvaW50cyB0byBhIGRlc2NyaXB0b3IgaW4KLQkgICAgIHRoZSByZGF0YSBzZWN0aW9uLCB0aGUgZmlyc3QgZWxlbWVudCBvZiB3aGljaCBpcyBhCi0JICAgICBwb2ludGVyIHRvIHRoZSBjb2RlICguLmZ1bmN0aW9uX25hbWUpLCBhbmQgdGhlIHNlY29uZAotCSAgICAgcG9pbnRzIHRvIHRoZSAudG9jICovCi0jaWZkZWYgRExMVE9PTF9QUEMKLQkgIGlmIChtYWNoaW5lID09IE1QUEMpCi0JICAgIGV4cF9sYWJlbC0+c2VjdGlvbiA9IHNlY2RhdGFbUkRBVEFdLnNlYzsKLQkgIGVsc2UKLSNlbmRpZgotCSAgICBleHBfbGFiZWwtPnNlY3Rpb24gPSBzZWNkYXRhW1RFWFRdLnNlYzsKLQotCSAgZXhwX2xhYmVsLT5mbGFncyA9IEJTRl9HTE9CQUw7Ci0JICBleHBfbGFiZWwtPnZhbHVlID0gMDsKLQotI2lmZGVmIERMTFRPT0xfQVJNCi0JICBpZiAobWFjaGluZSA9PSBNVEhVTUIpCi0JICAgIGJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MgKGFiZmQsIGV4cF9sYWJlbCwgQ19USFVNQkVYVEZVTkMpOwotI2VuZGlmCi0JICBwdHJzW29pZHgrK10gPSBleHBfbGFiZWw7Ci0JfQotCi0gICAgICAvKiBHZW5lcmF0ZSBpbXAgc3ltYm9scyB3aXRoIG9uZSB1bmRlcnNjb3JlIGZvciBNaWNyb3NvZnQKLSAgICAgICAgIGNvbXBhdGliaWxpdHksIGFuZCB3aXRoIHR3byB1bmRlcnNjb3JlcyBmb3IgYmFja3dhcmQKLSAgICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgdmVyc2lvbnMgb2YgY3lnd2luLiAgKi8KLSAgICAgIGluYW1lID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOwotICAgICAgaW5hbWUtPm5hbWUgPSBtYWtlX2xhYmVsICgiX19pbXBfIiwgZXhwLT5uYW1lKTsKLSAgICAgIGluYW1lLT5zZWN0aW9uID0gc2VjZGF0YVtJREFUQTVdLnNlYzsKLSAgICAgIGluYW1lLT5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gICAgICBpbmFtZS0+dmFsdWUgPSAwOwotCi0gICAgICBpbmFtZTIgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7Ci0gICAgICBpbmFtZTItPm5hbWUgPSBtYWtlX2xhYmVsICgiX2ltcF9fIiwgZXhwLT5uYW1lKTsKLSAgICAgIGluYW1lMi0+c2VjdGlvbiA9IHNlY2RhdGFbSURBVEE1XS5zZWM7Ci0gICAgICBpbmFtZTItPmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgICAgIGluYW1lMi0+dmFsdWUgPSAwOwotCi0gICAgICBpbmFtZV9sYWIgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7Ci0KLSAgICAgIGluYW1lX2xhYi0+bmFtZSA9IGhlYWRfbGFiZWw7Ci0gICAgICBpbmFtZV9sYWItPnNlY3Rpb24gPSAoYXNlY3Rpb24gKikmYmZkX3VuZF9zZWN0aW9uOwotICAgICAgaW5hbWVfbGFiLT5mbGFncyA9IDA7Ci0gICAgICBpbmFtZV9sYWItPnZhbHVlID0gMDsKLQotCi0gICAgICBpbmFtZV9wcCA9IHB0cnMgKyBvaWR4OwotICAgICAgcHRyc1tvaWR4KytdID0gaW5hbWU7Ci0gICAgICBwdHJzW29pZHgrK10gPSBpbmFtZTI7Ci0KLSAgICAgIGluYW1lX2xhYl9wcCA9IHB0cnMgKyBvaWR4OwotICAgICAgcHRyc1tvaWR4KytdID0gaW5hbWVfbGFiOwotCi0jaWZkZWYgRExMVE9PTF9QUEMKLSAgICAgIC8qIFRoZSBzeW1ib2wgcmVmZXJpbmcgdG8gdGhlIGNvZGUgKC50ZXh0KSAqLwotICAgICAgewotCWFzeW1ib2wgKmZ1bmN0aW9uX25hbWU7Ci0KLQlmdW5jdGlvbl9uYW1lID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOwotCWZ1bmN0aW9uX25hbWUtPm5hbWUgPSBtYWtlX2xhYmVsICgiLi4iLCBleHAtPm5hbWUpOwotCWZ1bmN0aW9uX25hbWUtPnNlY3Rpb24gPSBzZWNkYXRhW1RFWFRdLnNlYzsKLQlmdW5jdGlvbl9uYW1lLT5mbGFncyA9IEJTRl9HTE9CQUw7Ci0JZnVuY3Rpb25fbmFtZS0+dmFsdWUgPSAwOwotCi0JZm5fcHAgPSBwdHJzICsgb2lkeDsKLQlwdHJzW29pZHgrK10gPSBmdW5jdGlvbl9uYW1lOwotICAgICAgfQotCi0gICAgICAvKiBUaGUgLnRvYyBzeW1ib2wgKi8KLSAgICAgIHsKLQlhc3ltYm9sICp0b2Nfc3ltYm9sOyAgICAvKiBUaGUgLnRvYyBzeW1ib2wgKi8KLQotCXRvY19zeW1ib2wgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotCXRvY19zeW1ib2wtPm5hbWUgPSBtYWtlX2xhYmVsICgiLiIsICJ0b2MiKTsKLQl0b2Nfc3ltYm9sLT5zZWN0aW9uID0gKGFzZWN0aW9uICopJmJmZF91bmRfc2VjdGlvbjsKLQl0b2Nfc3ltYm9sLT5mbGFncyA9IEJTRl9HTE9CQUw7Ci0JdG9jX3N5bWJvbC0+dmFsdWUgPSAwOwotCi0JdG9jX3BwID0gcHRycyArIG9pZHg7Ci0JcHRyc1tvaWR4KytdID0gdG9jX3N5bWJvbDsKLSAgICAgIH0KLSNlbmRpZgotICAgICAgCi0gICAgICBwdHJzW29pZHhdID0gMDsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IE5TRUNTOyBpKyspCi0JewotCSAgc2luZm8gKnNpID0gc2VjZGF0YSArIGk7Ci0JICBhc2VjdGlvbiAqc2VjID0gc2ktPnNlYzsKLQkgIGFyZWxlbnQgKnJlbDsKLQkgIGFyZWxlbnQgKipycHA7Ci0KLQkgIHN3aXRjaCAoaSkKLQkgICAgewotCSAgICBjYXNlIFRFWFQ6Ci0JICAgICAgaWYgKCEgZXhwLT5kYXRhKQotCQl7Ci0JCSAgc2ktPnNpemUgPSBIT1dfSlRBQl9TSVpFOwotCQkgIHNpLT5kYXRhID0geG1hbGxvYyAoSE9XX0pUQUJfU0laRSk7Ci0JCSAgbWVtY3B5IChzaS0+ZGF0YSwgSE9XX0pUQUIsIEhPV19KVEFCX1NJWkUpOwotCi0JCSAgLyogYWRkIHRoZSByZWxvYyBpbnRvIGlkYXRhJDUgKi8KLQkJICByZWwgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkJICAKLQkJICBycHAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiAyKTsKLQkJICBycHBbMF0gPSByZWw7Ci0JCSAgcnBwWzFdID0gMDsKLQkJICAKLQkJICByZWwtPmFkZHJlc3MgPSBIT1dfSlRBQl9ST0ZGOwotCQkgIHJlbC0+YWRkZW5kID0gMDsKLQotCQkgIGlmIChtYWNoaW5lID09IE1QUEMpCi0JCSAgICB7Ci0JCSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsCi0JCQkJCQkJICBCRkRfUkVMT0NfMTZfR09UT0ZGKTsKLQkJICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGluYW1lX3BwOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DXzMyKTsKLQkJICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IHNlY2RhdGFbSURBVEE1XS5zeW1wcDsKLQkJICAgIH0KLQkJICBzZWMtPm9yZWxvY2F0aW9uID0gcnBwOwotCQkgIHNlYy0+cmVsb2NfY291bnQgPSAxOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSURBVEE0OgotCSAgICBjYXNlIElEQVRBNToKLQkgICAgICAvKiBBbiBpZGF0YSQ0IG9yIGlkYXRhJDUgaXMgb25lIHdvcmQgbG9uZywgYW5kIGhhcyBhbgotCQkgcnZhIHRvIGlkYXRhJDYgKi8KLQotCSAgICAgIHNpLT5kYXRhID0geG1hbGxvYyAoNCk7Ci0JICAgICAgc2ktPnNpemUgPSA0OwotCi0JICAgICAgaWYgKGV4cC0+bm9uYW1lKQotCQl7Ci0JCSAgc2ktPmRhdGFbMF0gPSBleHAtPm9yZGluYWwgOwotCQkgIHNpLT5kYXRhWzFdID0gZXhwLT5vcmRpbmFsID4+IDg7Ci0JCSAgc2ktPmRhdGFbMl0gPSBleHAtPm9yZGluYWwgPj4gMTY7Ci0JCSAgc2ktPmRhdGFbM10gPSAweDgwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2VjLT5yZWxvY19jb3VudCA9IDE7Ci0JCSAgbWVtc2V0IChzaS0+ZGF0YSwgMCwgc2ktPnNpemUpOwotCQkgIHJlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCQkgIHJwcCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIDIpOwotCQkgIHJwcFswXSA9IHJlbDsKLQkJICBycHBbMV0gPSAwOwotCQkgIHJlbC0+YWRkcmVzcyA9IDA7Ci0JCSAgcmVsLT5hZGRlbmQgPSAwOwotCQkgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ19SVkEpOwotCQkgIHJlbC0+c3ltX3B0cl9wdHIgPSBzZWNkYXRhW0lEQVRBNl0uc3ltcHA7Ci0JCSAgc2VjLT5vcmVsb2NhdGlvbiA9IHJwcDsKLQkJfQotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBJREFUQTY6Ci0JICAgICAgaWYgKCFleHAtPm5vbmFtZSkKLQkJewotCQkgIC8qIFRoaXMgdXNlZCB0byBhZGQgMSB0byBleHAtPmhpbnQuICBJIGRvbid0IGtub3cKLSAgICAgICAgICAgICAgICAgICAgIHdoeSBpdCBkaWQgdGhhdCwgYW5kIGl0IGRvZXMgbm90IG1hdGNoIHdoYXQgSSBzZWUKLSAgICAgICAgICAgICAgICAgICAgIGluIHByb2dyYW1zIGNvbXBpbGVkIHdpdGggdGhlIE1TIHRvb2xzLiAgKi8KLQkJICBpbnQgaWR4ID0gZXhwLT5oaW50OwotCQkgIHNpLT5zaXplID0gc3RybGVuICh4bGF0ZSAoZXhwLT5uYW1lKSkgKyAzOwotCQkgIHNpLT5kYXRhID0geG1hbGxvYyAoc2ktPnNpemUpOwotCQkgIHNpLT5kYXRhWzBdID0gaWR4ICYgMHhmZjsKLQkJICBzaS0+ZGF0YVsxXSA9IGlkeCA+PiA4OwotCQkgIHN0cmNweSAoc2ktPmRhdGEgKyAyLCB4bGF0ZSAoZXhwLT5uYW1lKSk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJREFUQTc6Ci0JICAgICAgc2ktPnNpemUgPSA0OwotCSAgICAgIHNpLT5kYXRhID14bWFsbG9jKDQpOwotCSAgICAgIG1lbXNldCAoc2ktPmRhdGEsIDAsIHNpLT5zaXplKTsKLQkgICAgICByZWwgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkgICAgICBycHAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiAyKTsKLQkgICAgICBycHBbMF0gPSByZWw7Ci0JICAgICAgcmVsLT5hZGRyZXNzID0gMDsKLQkgICAgICByZWwtPmFkZGVuZCA9IDA7Ci0JICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DX1JWQSk7Ci0JICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGluYW1lX2xhYl9wcDsKLQkgICAgICBzZWMtPm9yZWxvY2F0aW9uID0gcnBwOwotCSAgICAgIHNlYy0+cmVsb2NfY291bnQgPSAxOwotCSAgICAgIGJyZWFrOwotCi0jaWZkZWYgRExMVE9PTF9QUEMKLQkgICAgY2FzZSBQREFUQToKLQkgICAgICB7Ci0JCS8qIFRoZSAucGRhdGEgc2VjdGlvbiBpcyA1IHdvcmRzIGxvbmcuICovCi0JCS8qIFRoaW5rIG9mIGl0IGFzOiAgICAgICAgICAgICAgICAgICAgICovCi0JCS8qIHN0cnVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCS8qIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCS8qICAgYmZkX3ZtYSBCZWdpbkFkZHJlc3MsICAgICBbMHgwMF0gICovCi0JCS8qICAgICAgICAgICBFbmRBZGRyZXNzLCAgICAgICBbMHgwNF0gICovCi0JCS8qCSAgICAgRXhjZXB0aW9uSGFuZGxlciwgWzB4MDhdICAqLwotCQkvKgkgICAgIEhhbmRsZXJEYXRhLCAgICAgIFsweDBjXSAgKi8KLQkJLyoJICAgICBQcm9sb2dFbmRBZGRyZXNzOyBbMHgxMF0gICovCi0JCS8qIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQkJLyogU28gdGhpcyBwZGF0YSBzZWN0aW9uIHNldHVwcyB1cCB0aGlzIGFzIGEgZ2x1ZSBsaW5rYWdlIHRvCi0JCSAgIGEgZGxsIHJvdXRpbmUuIFRoZXJlIGFyZSBhIG51bWJlciBvZiBob3VzZSBrZWVwaW5nIHRoaW5ncwotCQkgICB3ZSBuZWVkIHRvIGRvOgotCi0JCSAgIDEuIEluIHRoZSBuYW1lIG9mIGdsdWUgdHJpY2tlcnksIHRoZSBBRERSMzIgcmVsb2NzIGZvciAwLAotCQkgICAgICA0LCBhbmQgMHgxMCBhcmUgc2V0IHRvIHBvaW50IHRvIHRoZSBzYW1lIHBsYWNlOgotCQkgICAgICAiLi5mdW5jdGlvbl9uYW1lIi4KLQkJICAgMi4gVGhlcmUgaXMgb25lIG1vcmUgcmVsb2MgbmVlZGVkIGluIHRoZSBwZGF0YSBzZWN0aW9uLgotCQkgICAgICBUaGUgYWN0dWFsIGdsdWUgaW5zdHJ1Y3Rpb24gdG8gcmVzdG9yZSB0aGUgdG9jIG9uCi0JCSAgICAgIHJldHVybiBpcyBzYXZlZCBhcyB0aGUgb2Zmc2V0IGluIGFuIElNR0xVRSByZWxvYy4KLQkJICAgICAgU28gd2UgbmVlZCBhIHRvdGFsIG9mIGZvdXIgcmVsb2NzIGZvciB0aGlzIHNlY3Rpb24uCi0KLQkJICAgMy4gTGFzdGx5LCB0aGUgSGFuZGxlckRhdGEgZmllbGQgaXMgc2V0IHRvIDB4MDMsIHRvIGluZGljYXRlCi0JCSAgICAgIHRoYXQgdGhpcyBpcyBhIGdsdWUgcm91dGluZS4KLQkJKi8KLQkJYXJlbGVudCAqaW1nbHVlLCAqYmFfcmVsLCAqZWFfcmVsLCAqcGVhX3JlbDsKLQotCQkvKiBhbGlnbm1lbnQgbXVzdCBiZSBzZXQgdG8gMioqMiBvciB5b3UgZ2V0IGV4dHJhIHN0dWZmICovCi0JCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYWJmZCwgc2VjLCAyKTsKLQotCQlzaS0+c2l6ZSA9IDQgKiA1OwotCQlzaS0+ZGF0YSA9eG1hbGxvYyg0ICogNSk7Ci0JCW1lbXNldCAoc2ktPmRhdGEsIDAsIHNpLT5zaXplKTsKLQkJcnBwID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50ICopICogNSk7Ci0JCXJwcFswXSA9IGltZ2x1ZSAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkJcnBwWzFdID0gYmFfcmVsICA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCQlycHBbMl0gPSBlYV9yZWwgID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JCXJwcFszXSA9IHBlYV9yZWwgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkJcnBwWzRdID0gMDsKLQotCQkvKiBzdGljayB0aGUgdG9jIHJlbG9hZCBpbnN0cnVjdGlvbiBpbiB0aGUgZ2x1ZSByZWxvYyAqLwotCQliZmRfcHV0XzMyKGFiZmQsIHBwY19nbHVlX2luc24sIChjaGFyICopICZpbWdsdWUtPmFkZHJlc3MpOwotCi0JCWltZ2x1ZS0+YWRkZW5kID0gMDsKLQkJaW1nbHVlLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwKLQkJCQkJCSAgICAgICBCRkRfUkVMT0NfMzJfR09UT0ZGKTsKLQkJaW1nbHVlLT5zeW1fcHRyX3B0ciA9IGZuX3BwOwotCi0JCWJhX3JlbC0+YWRkcmVzcyA9IDA7Ci0JCWJhX3JlbC0+YWRkZW5kID0gMDsKLQkJYmFfcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DXzMyKTsKLQkJYmFfcmVsLT5zeW1fcHRyX3B0ciA9IGZuX3BwOwotCi0JCWJmZF9wdXRfMzIoYWJmZCwgMHgxOCwgc2ktPmRhdGEgKyAweDA0KTsKLQkJZWFfcmVsLT5hZGRyZXNzID0gNDsKLQkJZWFfcmVsLT5hZGRlbmQgPSAwOwotCQllYV9yZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOwotCQllYV9yZWwtPnN5bV9wdHJfcHRyID0gZm5fcHA7Ci0KLQkJLyogbWFyayBpdCBhcyBnbHVlICovCi0JCWJmZF9wdXRfMzIoYWJmZCwgMHgwMywgc2ktPmRhdGEgKyAweDBjKTsKLQotCQkvKiBtYXJrIHRoZSBwcm9sb2cgZW5kIGFkZHJlc3MgKi8KLQkJYmZkX3B1dF8zMihhYmZkLCAweDBELCBzaS0+ZGF0YSArIDB4MTApOwotCQlwZWFfcmVsLT5hZGRyZXNzID0gMHgxMDsKLQkJcGVhX3JlbC0+YWRkZW5kID0gMDsKLQkJcGVhX3JlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7Ci0JCXBlYV9yZWwtPnN5bV9wdHJfcHRyID0gZm5fcHA7Ci0KLQkJc2VjLT5vcmVsb2NhdGlvbiA9IHJwcDsKLQkJc2VjLT5yZWxvY19jb3VudCA9IDQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgY2FzZSBSREFUQToKLQkgICAgICAvKiBFYWNoIGV4dGVybmFsIGZ1bmN0aW9uIGluIGEgUG93ZXJQQyBQRSBmaWxlIGhhcyBhIHR3byB3b3JkCi0JCSBkZXNjcmlwdG9yIGNvbnNpc3Rpbmcgb2Y6Ci0JCSAxLiBUaGUgYWRkcmVzcyBvZiB0aGUgY29kZS4KLQkJIDIuIFRoZSBhZGRyZXNzIG9mIHRoZSBhcHByb3ByaWF0ZSAudG9jCi0JICAgICAgICAgV2UgdXNlIHJlbG9jcyB0byBidWlsZCB0aGlzLgotCSAgICAgICovCi0KLQkgICAgICBzaS0+c2l6ZSA9IDg7Ci0JICAgICAgc2ktPmRhdGEgPSB4bWFsbG9jICg4KTsKLQkgICAgICBtZW1zZXQgKHNpLT5kYXRhLCAwLCBzaS0+c2l6ZSk7Ci0KLQkgICAgICBycHAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiAzKTsKLQkgICAgICBycHBbMF0gPSByZWwgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkgICAgICBycHBbMV0gPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkgICAgICBycHBbMl0gPSAwOwotCi0JICAgICAgcmVsLT5hZGRyZXNzID0gMDsKLQkgICAgICByZWwtPmFkZGVuZCA9IDA7Ci0JICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DXzMyKTsKLQkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gZm5fcHA7Ci0KLQkgICAgICByZWwgPSBycHBbMV07Ci0KLQkgICAgICByZWwtPmFkZHJlc3MgPSA0OwotCSAgICAgIHJlbC0+YWRkZW5kID0gMDsKLQkgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOwotCSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSB0b2NfcHA7Ci0KLQkgICAgICBzZWMtPm9yZWxvY2F0aW9uID0gcnBwOwotCSAgICAgIHNlYy0+cmVsb2NfY291bnQgPSAyOwotCSAgICAgIGJyZWFrOwotI2VuZGlmIC8qIERMTFRPT0xfUFBDICovCi0JICAgIH0KLQl9Ci0KLSAgICAgIHsKLQliZmRfdm1hIHZtYSA9IDA7Ci0JLyogU2l6ZSB1cCBhbGwgdGhlIHNlY3Rpb25zICovCi0JZm9yIChpID0gMDsgaSA8IE5TRUNTOyBpKyspCi0JICB7Ci0JICAgIHNpbmZvICpzaSA9IHNlY2RhdGEgKyBpOwotCi0JICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBzaS0+c2VjLCBzaS0+c2l6ZSk7Ci0JICAgIGJmZF9zZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNpLT5zZWMsIHZtYSk7Ci0KLS8qCSAgICB2bWEgKz0gc2ktPnNpemU7Ki8KLQkgIH0KLSAgICAgIH0KLSAgICAgIC8qIFdyaXRlIHRoZW0gb3V0ICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgTlNFQ1M7IGkrKykKLQl7Ci0JICBzaW5mbyAqc2kgPSBzZWNkYXRhICsgaTsKLQotCSAgaWYgKGkgPT0gSURBVEE1ICYmIG5vX2lkYXRhNSkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChpID09IElEQVRBNCAmJiBub19pZGF0YTQpCi0JICAgIGNvbnRpbnVlOwotCi0JICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNpLT5zZWMsCi0JCQkJICAgIHNpLT5kYXRhLCAwLAotCQkJCSAgICBzaS0+c2l6ZSk7Ci0JfQotCi0gICAgICBiZmRfc2V0X3N5bXRhYiAoYWJmZCwgcHRycywgb2lkeCk7Ci0gICAgICBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgYWJmZCA9IGJmZF9vcGVuciAob3V0bmFtZSwgSE9XX0JGRF9SRUFEX1RBUkdFVCk7Ci0gICAgICByZXR1cm4gYWJmZDsKLSAgICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIGJmZCAqCi1tYWtlX2hlYWQgKCkKLXsKLSAgRklMRSAqZiA9IGZvcGVuIChUTVBfSEVBRF9TLCBGT1BFTl9XVCk7Ci0KLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmYXRhbCAoXygiZmFpbGVkIHRvIG9wZW4gdGVtcG9yYXJ5IGhlYWQgZmlsZTogJXMiKSwgVE1QX0hFQURfUyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIAotICBmcHJpbnRmIChmLCAiJXMgSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1JcbiIsIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDJcbiIpOwotCi0gIGZwcmludGYoZiwiXHQlc1x0JXNcbiIsIEFTTV9HTE9CQUwsaGVhZF9sYWJlbCk7Ci0KLSAgZnByaW50ZiAoZiwgIiVzOlxuIiwgaGVhZF9sYWJlbCk7Ci0KLSAgZnByaW50ZiAoZiwgIlx0JXNobmFtZSVzXHQlc1B0ciB0byBpbWFnZSBpbXBvcnQgYnkgbmFtZSBsaXN0XG4iLAotCSAgIEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0KLSAgZnByaW50ZiAoZiwgIlx0JXN0aGlzIHNob3VsZCBiZSB0aGUgdGltZXN0YW1wLCBidXQgTlQgc29tZXRpbWVzXG4iLCBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdCVzZG9lc24ndCBsb2FkIERMTHMgd2hlbiB0aGlzIGlzIHNldC5cbiIsIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0JXNcdDBcdCVzIGxvYWRlZCB0aW1lXG4iLCBBU01fTE9ORywgQVNNX0MpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFx0JXMgRm9yd2FyZGVyIGNoYWluXG4iLCBBU01fTE9ORywgQVNNX0MpOwotICBmcHJpbnRmIChmLCAiXHQlc19fJXNfaW5hbWUlc1x0JXMgaW1wb3J0ZWQgZGxsJ3MgbmFtZVxuIiwKLQkgICBBU01fUlZBX0JFRk9SRSwKLQkgICBpbXBfbmFtZV9sYWIsCi0JICAgQVNNX1JWQV9BRlRFUiwKLQkgICBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdCVzZnRodW5rJXNcdCVzIHBvaW50ZXIgdG8gZmlyc3R0aHVua1xuIiwKLQkgICBBU01fUlZBX0JFRk9SRSwKLQkgICBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0KLSAgZnByaW50ZiAoZiwgIiVzU3R1ZmYgZm9yIGNvbXBhdGliaWxpdHlcbiIsIEFTTV9DKTsKLQotICBpZiAoIW5vX2lkYXRhNSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LmlkYXRhJDVcbiIpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLSAgICAgIGZwcmludGYgKGYsICJmdGh1bms6XG4iKTsKLSAgICB9Ci0gIAotICBpZiAoIW5vX2lkYXRhNCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LmlkYXRhJDRcbiIpOwotCi0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDRcbiIpOwotICAgICAgZnByaW50ZiAoZiwgImhuYW1lOlxuIik7Ci0gICAgfQotICAKLSAgZmNsb3NlIChmKTsKLQotICBhc3NlbWJsZV9maWxlIChUTVBfSEVBRF9TLCBUTVBfSEVBRF9PKTsKLQotICByZXR1cm4gYmZkX29wZW5yIChUTVBfSEVBRF9PLCBIT1dfQkZEX1JFQURfVEFSR0VUKTsKLX0KLQotc3RhdGljIGJmZCAqCi1tYWtlX3RhaWwgKCkKLXsKLSAgRklMRSAqZiA9IGZvcGVuIChUTVBfVEFJTF9TLCBGT1BFTl9XVCk7Ci0KLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmYXRhbCAoXygiZmFpbGVkIHRvIG9wZW4gdGVtcG9yYXJ5IHRhaWwgZmlsZTogJXMiKSwgVE1QX1RBSUxfUyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIAotICBpZiAoIW5vX2lkYXRhNCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNFxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgIH0KLSAgCi0gIGlmICghbm9faWRhdGE1KQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ1XG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gICAgfQotCi0jaWZkZWYgRExMVE9PTF9QUEMKLSAgLyogTm9ybWFsbHksIHdlIG5lZWQgdG8gc2VlIGEgbnVsbCBkZXNjcmlwdG9yIGJ1aWx0IGluIGlkYXRhJDMgdG8KLSAgICAgYWN0IGFzIHRoZSB0ZXJtaW5hdG9yIGZvciB0aGUgbGlzdC4gVGhlIGlkZWFsIHdheSwgSSBzdXBwb3NlLAotICAgICB3b3VsZCBiZSB0byBtYXJrIHRoaXMgc2VjdGlvbiBhcyBhIGNvbWRhdCB0eXBlIDIgc2VjdGlvbiwgc28KLSAgICAgb25seSBvbmUgd291bGQgYXBwZWFyIGluIHRoZSBmaW5hbCAuZXhlIChpZiBvdXIgbGlua2VyIHN1cHBvcnRlZAotICAgICBjb21kYXQsIHRoYXQgaXMpIG9yIGNhdXNlIGl0IHRvIGJlIGluc2VydGVkIGJ5IHNvbWV0aGluZyBlbHNlIChzYXkKLSAgICAgY3J0MCkKLSAgKi8KLQotICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkM1xuIik7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0jZW5kaWYKLQotI2lmZGVmIERMTFRPT0xfUFBDCi0gIC8qIE90aGVyIFBvd2VyUEMgTlQgY29tcGlsZXJzIHVzZSBpZGF0YSQ2IGZvciB0aGUgZGxsbmFtZSwgc28gSQotICAgICBkbyB0b28uIE9yaWdpbmFsLCBodWg/ICovCi0gIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ2XG4iKTsKLSNlbHNlCi0gIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ3XG4iKTsKLSNlbmRpZgotCi0gIGZwcmludGYgKGYsICJcdCVzXHRfXyVzX2luYW1lXG4iLCBBU01fR0xPQkFMLCBpbXBfbmFtZV9sYWIpOwotICBmcHJpbnRmIChmLCAiX18lc19pbmFtZTpcdCVzXHRcIiVzXCJcbiIsCi0JICAgaW1wX25hbWVfbGFiLCBBU01fVEVYVCwgZGxsX25hbWUpOwotCi0gIGZjbG9zZSAoZik7Ci0KLSAgYXNzZW1ibGVfZmlsZSAoVE1QX1RBSUxfUywgVE1QX1RBSUxfTyk7Ci0gIAotICByZXR1cm4gIGJmZF9vcGVuciAoVE1QX1RBSUxfTywgSE9XX0JGRF9SRUFEX1RBUkdFVCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZW5fbGliX2ZpbGUgKCkKLXsKLSAgaW50IGk7Ci0gIGV4cG9ydF90eXBlICpleHA7Ci0gIGJmZCAqYXJfaGVhZDsKLSAgYmZkICphcl90YWlsOwotICBiZmQgKm91dGFyY2g7Ci0gIGJmZCAqIGhlYWQgID0gMDsKLQotICB1bmxpbmsgKGltcF9uYW1lKTsKLQotICBvdXRhcmNoID0gYmZkX29wZW53IChpbXBfbmFtZSwgSE9XX0JGRF9XUklURV9UQVJHRVQpOwotCi0gIGlmICghb3V0YXJjaCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJDYW4ndCBvcGVuIC5saWIgZmlsZTogJXMiKSwgaW1wX25hbWUpOwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiQ3JlYXRpbmcgbGlicmFyeSBmaWxlOiAlc1xuIiksIGltcF9uYW1lKTsKLSAgCi0gIGJmZF9zZXRfZm9ybWF0IChvdXRhcmNoLCBiZmRfYXJjaGl2ZSk7Ci0gIG91dGFyY2gtPmhhc19hcm1hcCA9IDE7Ci0KLSAgLyogV29yayBvdXQgYSByZWFzb25hYmxlIHNpemUgb2YgdGhpbmdzIHRvIHB1dCBvbnRvIG9uZSBsaW5lLiAqLwotCi0gIGFyX2hlYWQgPSBtYWtlX2hlYWQgKCk7Ci0gIGFyX3RhaWwgPSBtYWtlX3RhaWwoKTsKLQotICBpZiAoYXJfaGVhZCA9PSBOVUxMIHx8IGFyX3RhaWwgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIAotICBmb3IgKGkgPSAwOyAoZXhwID0gZF9leHBvcnRzX2xleGljYWxseVtpXSk7IGkrKykKLSAgICB7Ci0gICAgICBiZmQgKm4gPSBtYWtlX29uZV9saWJfZmlsZSAoZXhwLCBpKTsKLSAgICAgIG4tPm5leHQgPSBoZWFkOwotICAgICAgaGVhZCA9IG47Ci0gICAgfQotCi0gIC8qIE5vdyBzdGljayB0aGVtIGFsbCBpbnRvIHRoZSBhcmNoaXZlICovCi0KLSAgYXJfaGVhZC0+bmV4dCA9IGhlYWQ7Ci0gIGFyX3RhaWwtPm5leHQgPSBhcl9oZWFkOwotICBoZWFkID0gYXJfdGFpbDsKLQotICBpZiAoISBiZmRfc2V0X2FyY2hpdmVfaGVhZCAob3V0YXJjaCwgaGVhZCkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9hcmNoaXZlX2hlYWQiKTsKLSAgCi0gIGlmICghIGJmZF9jbG9zZSAob3V0YXJjaCkpCi0gICAgYmZkX2ZhdGFsIChpbXBfbmFtZSk7Ci0KLSAgd2hpbGUgKGhlYWQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmQgKm4gPSBoZWFkLT5uZXh0OwotICAgICAgYmZkX2Nsb3NlIChoZWFkKTsKLSAgICAgIGhlYWQgPSBuOwotICAgIH0KLQotICAvKiBEZWxldGUgYWxsIHRoZSB0ZW1wIGZpbGVzICovCi0KLSAgaWYgKGRvbnRkZWx0ZW1wcyA9PSAwKQotICAgIHsKLSAgICAgIHVubGluayAoVE1QX0hFQURfTyk7Ci0gICAgICB1bmxpbmsgKFRNUF9IRUFEX1MpOwotICAgICAgdW5saW5rIChUTVBfVEFJTF9PKTsKLSAgICAgIHVubGluayAoVE1QX1RBSUxfUyk7Ci0gICAgfQotCi0gIGlmIChkb250ZGVsdGVtcHMgPCAyKQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWU7Ci0KLSAgICAgIG5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHNpemVvZiBUTVBfU1RVQiArIDEwKTsKLSAgICAgIGZvciAoaSA9IDAsIGV4cCA9IGRfZXhwb3J0czsgZXhwOyBpKyssIGV4cCA9IGV4cC0+bmV4dCkKLQl7Ci0JICBzcHJpbnRmIChuYW1lLCAiJXMlMDVkLm8iLCBUTVBfU1RVQiwgaSk7Ci0JICBpZiAodW5saW5rIChuYW1lKSA8IDApCi0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIHdhcm4gKF8oImNhbm5vdCBkZWxldGUgJXM6ICVzXG4iKSwgbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0JfQotICAgIH0KLSAgCi0gIGluZm9ybSAoXygiQ3JlYXRlZCBsaWIgZmlsZSIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFJ1biB0aHJvdWdoIHRoZSBpbmZvcm1hdGlvbiBnYXRoZXJlZCBmcm9tIHRoZSAubyBmaWxlcyBhbmQgdGhlCi0gICAuZGVmIGZpbGUgYW5kIHdvcmsgb3V0IHRoZSBiZXN0IHN0dWZmICovCi1zdGF0aWMgaW50Ci1wZnVuYyAoYSwgYikKLSAgICAgY29uc3Qgdm9pZCAqYTsKLSAgICAgY29uc3Qgdm9pZCAqYjsKLXsKLSAgZXhwb3J0X3R5cGUgKmFwID0gKihleHBvcnRfdHlwZSAqKikgYTsKLSAgZXhwb3J0X3R5cGUgKmJwID0gKihleHBvcnRfdHlwZSAqKikgYjsKLSAgaWYgKGFwLT5vcmRpbmFsID09IGJwLT5vcmRpbmFsKQotICAgIHJldHVybiAwOwotCi0gIC8qIHVuc2V0IG9yZGluYWxzIGdvIHRvIHRoZSBib3R0b20gKi8KLSAgaWYgKGFwLT5vcmRpbmFsID09IC0xKQotICAgIHJldHVybiAxOwotICBpZiAoYnAtPm9yZGluYWwgPT0gLTEpCi0gICAgcmV0dXJuIC0xOwotICByZXR1cm4gKGFwLT5vcmRpbmFsIC0gYnAtPm9yZGluYWwpOwotfQotCi1zdGF0aWMgaW50Ci1uZnVuYyAoYSwgYikKLSAgICAgY29uc3Qgdm9pZCAqYTsKLSAgICAgY29uc3Qgdm9pZCAqYjsKLXsKLSAgZXhwb3J0X3R5cGUgKmFwID0gKihleHBvcnRfdHlwZSAqKikgYTsKLSAgZXhwb3J0X3R5cGUgKmJwID0gKihleHBvcnRfdHlwZSAqKikgYjsKLQotICByZXR1cm4gKHN0cmNtcCAoYXAtPm5hbWUsIGJwLT5uYW1lKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfbnVsbF9uYW1lcyAocHRyKQotICAgICBleHBvcnRfdHlwZSAqKnB0cjsKLXsKLSAgaW50IHNyYzsKLSAgaW50IGRzdDsKLSAgZm9yIChkc3QgPSBzcmMgPSAwOyBzcmMgPCBkX25mdW5jczsgc3JjKyspCi0gICAgewotICAgICAgaWYgKHB0cltzcmNdKQotCXsKLQkgIHB0cltkc3RdID0gcHRyW3NyY107Ci0JICBkc3QrKzsKLQl9Ci0gICAgfQotICBkX25mdW5jcyA9IGRzdDsKLX0KLQotc3RhdGljIHZvaWQKLWR0YWIgKHB0cikKLSAgICAgZXhwb3J0X3R5cGUgKipwdHI7Ci17Ci0jaWZkZWYgU0FDREVCVUcKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jczsgaSsrKQotICAgIHsKLSAgICAgIGlmIChwdHJbaV0pCi0JewotCSAgcHJpbnRmICgiJWQgJXMgQCAlZCAlcyVzJXNcbiIsCi0JCSAgaSwgcHRyW2ldLT5uYW1lLCBwdHJbaV0tPm9yZGluYWwsCi0JCSAgcHRyW2ldLT5ub25hbWUgPyAiTk9OQU1FICIgOiAiIiwKLQkJICBwdHJbaV0tPmNvbnN0YW50ID8gIkNPTlNUQU5UIiA6ICIiLAotCQkgIHB0cltpXS0+ZGF0YSA/ICJEQVRBIiA6ICIiKTsKLQl9Ci0gICAgICBlbHNlCi0JcHJpbnRmICgiZW1wdHlcbiIpOwotICAgIH0KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19kdXBsaWNhdGVzIChkX2V4cG9ydF92ZWMpCi0gICAgIGV4cG9ydF90eXBlICoqZF9leHBvcnRfdmVjOwotewotICBpbnQgbW9yZSA9IDE7Ci0gIGludCBpOwotICB3aGlsZSAobW9yZSkKLSAgICB7Ci0KLSAgICAgIG1vcmUgPSAwOwotICAgICAgLyogUmVtb3ZlIGR1cGxpY2F0ZXMgKi8KLSAgICAgIHFzb3J0IChkX2V4cG9ydF92ZWMsIGRfbmZ1bmNzLCBzaXplb2YgKGV4cG9ydF90eXBlICopLCBuZnVuYyk7Ci0KLSAgICAgIGR0YWIgKGRfZXhwb3J0X3ZlYyk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3MgLSAxOyBpKyspCi0JewotCSAgaWYgKHN0cmNtcCAoZF9leHBvcnRfdmVjW2ldLT5uYW1lLAotCQkgICAgICBkX2V4cG9ydF92ZWNbaSArIDFdLT5uYW1lKSA9PSAwKQotCSAgICB7Ci0KLQkgICAgICBleHBvcnRfdHlwZSAqYSA9IGRfZXhwb3J0X3ZlY1tpXTsKLQkgICAgICBleHBvcnRfdHlwZSAqYiA9IGRfZXhwb3J0X3ZlY1tpICsgMV07Ci0KLQkgICAgICBtb3JlID0gMTsKLQkgICAgICAKLQkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICAgIGluZm9ybSAoXygiV2FybmluZywgaWdub3JpbmcgZHVwbGljYXRlIEVYUE9SVCAlcyAlZCwlZFxuIiksCi0JCSAgICAgIGEtPm5hbWUsIGEtPm9yZGluYWwsIGItPm9yZGluYWwpOwotCSAgICAgIAotCSAgICAgIGlmIChhLT5vcmRpbmFsICE9IC0xCi0JCSAgJiYgYi0+b3JkaW5hbCAhPSAtMSkKLQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJZmF0YWwgKF8oIkVycm9yLCBkdXBsaWNhdGUgRVhQT1JUIHdpdGggb3JpZGluYWxzOiAlcyIpLAotCQkgICAgICBhLT5uYW1lKTsKLQotCSAgICAgIC8qIE1lcmdlIGF0dHJpYnV0ZXMgKi8KLQkgICAgICBiLT5vcmRpbmFsID0gYS0+b3JkaW5hbCA+IDAgPyBhLT5vcmRpbmFsIDogYi0+b3JkaW5hbDsKLQkgICAgICBiLT5jb25zdGFudCB8PSBhLT5jb25zdGFudDsKLQkgICAgICBiLT5ub25hbWUgfD0gYS0+bm9uYW1lOwotCSAgICAgIGItPmRhdGEgfD0gYS0+ZGF0YTsKLQkgICAgICBkX2V4cG9ydF92ZWNbaV0gPSAwOwotCSAgICB9Ci0KLQkgIGR0YWIgKGRfZXhwb3J0X3ZlYyk7Ci0JICByZW1vdmVfbnVsbF9uYW1lcyAoZF9leHBvcnRfdmVjKTsKLQkgIGR0YWIgKGRfZXhwb3J0X3ZlYyk7Ci0JfQotICAgIH0KLQotCi0gIC8qIENvdW50IHRoZSBuYW1lcyAqLwotICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIWRfZXhwb3J0X3ZlY1tpXS0+bm9uYW1lKQotCWRfbmFtZWRfbmZ1bmNzKys7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZmlsbF9vcmRpbmFscyAoZF9leHBvcnRfdmVjKQotICAgICBleHBvcnRfdHlwZSAqKmRfZXhwb3J0X3ZlYzsKLXsKLSAgaW50IGxvd2VzdCA9IC0xOwotICBpbnQgaTsKLSAgY2hhciAqcHRyOwotICBpbnQgc2l6ZSA9IDY1NTM2OwotCi0gIHFzb3J0IChkX2V4cG9ydF92ZWMsIGRfbmZ1bmNzLCBzaXplb2YgKGV4cG9ydF90eXBlICopLCBwZnVuYyk7Ci0KLSAgLyogZmlsbCBpbiB0aGUgdW5zZXQgb3JkaW5hbHMgd2l0aCBvbmVzIGZyb20gb3VyIHJhbmdlICovCi0KLSAgcHRyID0gKGNoYXIgKikgeG1hbGxvYyAoc2l6ZSk7Ci0KLSAgbWVtc2V0IChwdHIsIDAsIHNpemUpOwotCi0gIC8qIE1hcmsgaW4gb3VyIGxhcmdlIHZlY3RvciBhbGwgdGhlIG51bWJlcnMgdGhhdCBhcmUgdGFrZW4gKi8KLSAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzOyBpKyspCi0gICAgewotICAgICAgaWYgKGRfZXhwb3J0X3ZlY1tpXS0+b3JkaW5hbCAhPSAtMSkKLQl7Ci0JICBwdHJbZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsXSA9IDE7Ci0JICBpZiAobG93ZXN0ID09IC0xIHx8IGRfZXhwb3J0X3ZlY1tpXS0+b3JkaW5hbCA8IGxvd2VzdCkKLQkgICAgewotCSAgICAgIGxvd2VzdCA9IGRfZXhwb3J0X3ZlY1tpXS0+b3JkaW5hbDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogU3RhcnQgYXQgMSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE1TIHRvb2xjaGFpbi4gICovCi0gIGlmIChsb3dlc3QgPT0gLTEpCi0gICAgbG93ZXN0ID0gMTsKLQotICAvKiBOb3cgZmlsbCBpbiBvcmRpbmFscyB3aGVyZSB0aGUgdXNlciB3YW50cyB1cyB0byBjaG9vc2UuICovCi0gIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jczsgaSsrKQotICAgIHsKLSAgICAgIGlmIChkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWwgPT0gLTEpCi0JewotCSAgcmVnaXN0ZXIgaW50IGo7Ci0KLQkgIC8qIEZpcnN0IHRyeSB3aXRoaW4gb3IgYWZ0ZXIgYW55IHVzZXIgc3VwcGxpZWQgcmFuZ2UuICovCi0JICBmb3IgKGogPSBsb3dlc3Q7IGogPCBzaXplOyBqKyspCi0JICAgIGlmIChwdHJbal0gPT0gMCkKLQkgICAgICB7Ci0JCXB0cltqXSA9IDE7Ci0JCWRfZXhwb3J0X3ZlY1tpXS0+b3JkaW5hbCA9IGo7Ci0JCWdvdG8gZG9uZTsKLQkgICAgICB9Ci0KLQkgIC8qIFRoZW4gdHJ5IGJlZm9yZSB0aGUgcmFuZ2UuICovCi0JICBmb3IgKGogPSBsb3dlc3Q7IGogPjA7IGotLSkKLQkgICAgaWYgKHB0cltqXSA9PSAwKQotCSAgICAgIHsKLQkJcHRyW2pdID0gMTsKLQkJZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsID0gajsKLQkJZ290byBkb25lOwotCSAgICAgIH0KLQlkb25lOjsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKHB0cik7Ci0KLSAgLyogQW5kIHJlc29ydCAqLwotCi0gIHFzb3J0IChkX2V4cG9ydF92ZWMsIGRfbmZ1bmNzLCBzaXplb2YgKGV4cG9ydF90eXBlICopLCBwZnVuYyk7Ci0KLSAgLyogV29yayBvdXQgdGhlIGxvd2VzdCBhbmQgaGlnaGVzdCBvcmRpbmFsIG51bWJlcnMuICAqLwotICBpZiAoZF9uZnVuY3MpCi0gICAgewotICAgICAgaWYgKGRfZXhwb3J0X3ZlY1swXSkKLQlkX2xvd19vcmQgPSBkX2V4cG9ydF92ZWNbMF0tPm9yZGluYWw7Ci0gICAgICBpZiAoZF9leHBvcnRfdmVjW2RfbmZ1bmNzLTFdKQotCWRfaGlnaF9vcmQgPSBkX2V4cG9ydF92ZWNbZF9uZnVuY3MtMV0tPm9yZGluYWw7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1hbHBoYWZ1bmMgKGF2LGJ2KQotICAgICBjb25zdCB2b2lkICphdjsKLSAgICAgY29uc3Qgdm9pZCAqYnY7Ci17Ci0gIGNvbnN0IGV4cG9ydF90eXBlICoqYSA9IChjb25zdCBleHBvcnRfdHlwZSAqKikgYXY7Ci0gIGNvbnN0IGV4cG9ydF90eXBlICoqYiA9IChjb25zdCBleHBvcnRfdHlwZSAqKikgYnY7Ci0KLSAgcmV0dXJuIHN0cmNtcCAoKCphKS0+bmFtZSwgKCpiKS0+bmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tYW5nbGVfZGVmcyAoKQotewotICAvKiBGaXJzdCB3b3JrIG91dCB0aGUgbWluaW11bSBvcmRpbmFsIGNob3NlbiAqLwotCi0gIGV4cG9ydF90eXBlICpleHA7Ci0KLSAgaW50IGk7Ci0gIGludCBoaW50ID0gMDsKLSAgZXhwb3J0X3R5cGUgKipkX2V4cG9ydF92ZWMKLSAgPSAoZXhwb3J0X3R5cGUgKiopIHhtYWxsb2MgKHNpemVvZiAoZXhwb3J0X3R5cGUgKikgKiBkX25mdW5jcyk7Ci0KLSAgaW5mb3JtIChfKCJQcm9jZXNzaW5nIGRlZmluaXRpb25zIikpOwotICAKLSAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQotICAgIHsKLSAgICAgIGRfZXhwb3J0X3ZlY1tpXSA9IGV4cDsKLSAgICB9Ci0KLSAgcHJvY2Vzc19kdXBsaWNhdGVzIChkX2V4cG9ydF92ZWMpOwotICBmaWxsX29yZGluYWxzIChkX2V4cG9ydF92ZWMpOwotCi0gIC8qIFB1dCBiYWNrIHRoZSBsaXN0IGluIHRoZSBuZXcgb3JkZXIgKi8KLSAgZF9leHBvcnRzID0gMDsKLSAgZm9yIChpID0gZF9uZnVuY3MgLSAxOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBkX2V4cG9ydF92ZWNbaV0tPm5leHQgPSBkX2V4cG9ydHM7Ci0gICAgICBkX2V4cG9ydHMgPSBkX2V4cG9ydF92ZWNbaV07Ci0gICAgfQotCi0gIC8qIEJ1aWxkIGxpc3QgaW4gYWxwaGEgb3JkZXIgKi8KLSAgZF9leHBvcnRzX2xleGljYWxseSA9IChleHBvcnRfdHlwZSAqKikKLSAgICB4bWFsbG9jIChzaXplb2YgKGV4cG9ydF90eXBlICopICogKGRfbmZ1bmNzICsgMSkpOwotCi0gIGZvciAoaSA9IDAsIGV4cCA9IGRfZXhwb3J0czsgZXhwOyBpKyssIGV4cCA9IGV4cC0+bmV4dCkKLSAgICB7Ci0gICAgICBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldID0gZXhwOwotICAgIH0KLSAgZF9leHBvcnRzX2xleGljYWxseVtpXSA9IDA7Ci0KLSAgcXNvcnQgKGRfZXhwb3J0c19sZXhpY2FsbHksIGksIHNpemVvZiAoZXhwb3J0X3R5cGUgKiksIGFscGhhZnVuYyk7Ci0KLSAgLyogRmlsbCBleHAgZW50cmllcyB3aXRoIHRoZWlyIGhpbnQgdmFsdWVzICovCi0KLSAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzOyBpKyspCi0gICAgewotICAgICAgaWYgKCFkX2V4cG9ydHNfbGV4aWNhbGx5W2ldLT5ub25hbWUgfHwgc2hvd19hbGxuYW1lcykKLQlkX2V4cG9ydHNfbGV4aWNhbGx5W2ldLT5oaW50ID0gaGludCsrOwotICAgIH0KLSAgCi0gIGluZm9ybSAoXygiUHJvY2Vzc2VkIGRlZmluaXRpb25zIikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLXVzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIC8qIHhnZXRleHQ6Yy1mb3JtYXQgKi8KLSAgZnByaW50ZiAoZmlsZSwgXygiVXNhZ2UgJXMgPG9wdGlvbnM+IDxvYmplY3QtZmlsZXM+XG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgLyogeGdldGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtbSAtLW1hY2hpbmUgPG1hY2hpbmU+ICAgIENyZWF0ZSBhcyBETEwgZm9yIDxtYWNoaW5lPi4gIFtkZWZhdWx0OiAlc11cbiIpLCBtbmFtZSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgICAgICAgcG9zc2libGUgPG1hY2hpbmU+OiBhcm1bX2ludGVyd29ya10sIGkzODYsIG1jb3JlWy1lbGZdey1sZXwtYmV9LCBwcGMsIHRodW1iXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1lIC0tb3V0cHV0LWV4cCA8b3V0bmFtZT4gR2VuZXJhdGUgYW4gZXhwb3J0IGZpbGUuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1sIC0tb3V0cHV0LWxpYiA8b3V0bmFtZT4gR2VuZXJhdGUgYW4gaW50ZXJmYWNlIGxpYnJhcnkuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1hIC0tYWRkLWluZGlyZWN0ICAgICAgICAgQWRkIGRsbCBpbmRpcmVjdHMgdG8gZXhwb3J0IGZpbGUuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1EIC0tZGxsbmFtZSA8bmFtZT4gICAgICAgTmFtZSBvZiBpbnB1dCBkbGwgdG8gcHV0IGludG8gaW50ZXJmYWNlIGxpYi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWQgLS1pbnB1dC1kZWYgPGRlZmZpbGU+ICBOYW1lIG9mIC5kZWYgZmlsZSB0byBiZSByZWFkIGluLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAteiAtLW91dHB1dC1kZWYgPGRlZmZpbGU+IE5hbWUgb2YgLmRlZiBmaWxlIHRvIGJlIGNyZWF0ZWQuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgICAgIC0tZXhwb3J0LWFsbC1zeW1ib2xzICAgRXhwb3J0IGFsbCBzeW1ib2xzIHRvIC5kZWZcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgICAgLS1uby1leHBvcnQtYWxsLXN5bWJvbHMgIE9ubHkgZXhwb3J0IGxpc3RlZCBzeW1ib2xzXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgICAgIC0tZXhjbHVkZS1zeW1ib2xzIDxsaXN0PiBEb24ndCBleHBvcnQgPGxpc3Q+XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgICAgIC0tbm8tZGVmYXVsdC1leGNsdWRlcyAgQ2xlYXIgZGVmYXVsdCBleGNsdWRlIHN5bWJvbHNcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWIgLS1iYXNlLWZpbGUgPGJhc2VmaWxlPiBSZWFkIGxpbmtlciBnZW5lcmF0ZWQgYmFzZSBmaWxlLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAteCAtLW5vLWlkYXRhNCAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGlkYXRhJDQgc2VjdGlvbi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWMgLS1uby1pZGF0YTUgICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBpZGF0YSQ1IHNlY3Rpb24uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1VIC0tYWRkLXVuZGVyc2NvcmUgICAgICAgQWRkIHVuZGVyc2NvcmVzIHRvIHN5bWJvbHMgaW4gaW50ZXJmYWNlIGxpYnJhcnkuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1rIC0ta2lsbC1hdCAgICAgICAgICAgICAgS2lsbCBAPG4+IGZyb20gZXhwb3J0ZWQgbmFtZXMuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1BIC0tYWRkLXN0ZGNhbGwtYWxpYXMgICAgQWRkIGFsaWFzZXMgd2l0aG91dCBAPG4+LlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtUyAtLWFzIDxuYW1lPiAgICAgICAgICAgIFVzZSA8bmFtZT4gZm9yIGFzc2VtYmxlci5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWYgLS1hcy1mbGFncyA8ZmxhZ3M+ICAgICBQYXNzIDxmbGFncz4gdG8gdGhlIGFzc2VtYmxlci5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLW4gLS1uby1kZWxldGUgICAgICAgICAgICBLZWVwIHRlbXAgZmlsZXMgKHJlcGVhdCBmb3IgZXh0cmEgcHJlc2VydmF0aW9uKS5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLXYgLS12ZXJib3NlICAgICAgICAgICAgICBCZSB2ZXJib3NlLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtViAtLXZlcnNpb24gICAgICAgICAgICAgIERpc3BsYXkgdGhlIHByb2dyYW0gdmVyc2lvbi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLWggLS1oZWxwICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaW5mb3JtYXRpb24uXG4iKSk7Ci0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLU0gLS1tY29yZS1lbGYgPG91dG5hbWU+ICBQcm9jZXNzIG1jb3JlLWVsZiBvYmplY3QgZmlsZXMgaW50byA8b3V0bmFtZT4uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1MIC0tbGlua2VyIDxuYW1lPiAgICAgICAgVXNlIDxuYW1lPiBhcyB0aGUgbGlua2VyLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtRiAtLWxpbmtlci1mbGFncyA8ZmxhZ3M+IFBhc3MgPGZsYWdzPiB0byB0aGUgbGlua2VyLlxuIikpOwotI2VuZGlmCi0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLSNkZWZpbmUgT1BUSU9OX0VYUE9SVF9BTExfU1lNUwkJMTUwCi0jZGVmaW5lIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVMJKE9QVElPTl9FWFBPUlRfQUxMX1NZTVMgKyAxKQotI2RlZmluZSBPUFRJT05fRVhDTFVERV9TWU1TCQkoT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNUyArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTCShPUFRJT05fRVhDTFVERV9TWU1TICsgMSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotewotICB7Im5vLWRlbGV0ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnbid9LAotICB7ImRsbG5hbWUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0QnfSwKLSAgeyJuby1pZGF0YTQiLCBub19hcmd1bWVudCwgTlVMTCwgJ3gnfSwKLSAgeyJuby1pZGF0YTUiLCBub19hcmd1bWVudCwgTlVMTCwgJ2MnfSwKLSAgeyJvdXRwdXQtZXhwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdlJ30sCi0gIHsib3V0cHV0LWRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAneid9LAotICB7ImV4cG9ydC1hbGwtc3ltYm9scyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUX0FMTF9TWU1TfSwKLSAgeyJuby1leHBvcnQtYWxsLXN5bWJvbHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNU30sCi0gIHsiZXhjbHVkZS1zeW1ib2xzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWENMVURFX1NZTVN9LAotICB7Im5vLWRlZmF1bHQtZXhjbHVkZXMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0RFRkFVTFRfRVhDTFVERVN9LAotICB7Im91dHB1dC1saWIiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2wnfSwKLSAgeyJkZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2QnfSwgLyogZm9yIGNvbXBhdGlibGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zICovCi0gIHsiaW5wdXQtZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdkJ30sCi0gIHsiYWRkLXVuZGVyc2NvcmUiLCBub19hcmd1bWVudCwgTlVMTCwgJ1UnfSwKLSAgeyJraWxsLWF0Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdrJ30sCi0gIHsiYWRkLXN0ZGNhbGwtYWxpYXMiLCBub19hcmd1bWVudCwgTlVMTCwgJ0EnfSwKLSAgeyJ2ZXJib3NlIiwgbm9fYXJndW1lbnQsIE5VTEwsICd2J30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVid9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKLSAgeyJtYWNoaW5lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdtJ30sCi0gIHsiYWRkLWluZGlyZWN0Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdhJ30sCi0gIHsiYmFzZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdiJ30sCi0gIHsiYXMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1MnfSwKLSAgeyJhcy1mbGFncyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZid9LAotICB7Im1jb3JlLWVsZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnTSd9LAotICB7MH0KLX07Ci0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKiphdjsKLXsKLSAgaW50IGM7Ci0gIGludCBpOwotICBjaGFyICpmaXJzdGFyZyA9IDA7Ci0gIHByb2dyYW1fbmFtZSA9IGF2WzBdOwotICBvYXYgPSBhdjsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhYywgYXYsCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYJCQkgICAKLQkJCSAgICJtOmU6bDphRDpkOno6Yjp4Y3VVa0FTOmY6bnZWaE06TDpGOiIsCi0jZWxzZQotCQkJICAgIm06ZTpsOmFEOmQ6ejpiOnhjdVVrQVM6ZjpudlZoIiwKLSNlbmRpZgotCQkJICAgbG9uZ19vcHRpb25zLCAwKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSBPUFRJT05fRVhQT1JUX0FMTF9TWU1TOgotCSAgZXhwb3J0X2FsbF9zeW1ib2xzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNUzoKLQkgIGV4cG9ydF9hbGxfc3ltYm9scyA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRVhDTFVERV9TWU1TOgotCSAgYWRkX2V4Y2x1ZGVzIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUzoKLQkgIGRvX2RlZmF1bHRfZXhjbHVkZXMgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgbm9faWRhdGE0ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2MnOgotCSAgbm9faWRhdGE1ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCSAgYXNfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgYXNfZmxhZ3MgPSBvcHRhcmc7Ci0JICBicmVhazsKLQotCSAgLyogaWdub3JlZCBmb3IgY29tcGF0aWJpbGl0eSAqLwotCWNhc2UgJ3UnOgotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICBhZGRfaW5kaXJlY3QgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAneic6Ci0JICBvdXRwdXRfZGVmID0gZm9wZW4gKG9wdGFyZywgRk9QRU5fV1QpOwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICBkbGxfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgaW1wX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIGV4cF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ20nOgotCSAgbW5hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBwcmludF92ZXJzaW9uIChwcm9ncmFtX25hbWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAnVSc6Ci0JICBhZGRfdW5kZXJzY29yZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdrJzoKLQkgIGtpbGxhdCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdBJzoKLQkgIGFkZF9zdGRjYWxsX2FsaWFzID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgZGVmX2ZpbGUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIGRvbnRkZWx0ZW1wcysrOwotCSAgYnJlYWs7Ci0JY2FzZSAnYic6Ci0JICBiYXNlX2ZpbGUgPSBmb3BlbiAob3B0YXJnLCBGT1BFTl9SQik7Ci0JICAKLQkgIGlmICghYmFzZV9maWxlKQotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICBmYXRhbCAoXygiVW5hYmxlIHRvIG9wZW4gYmFzZS1maWxlOiAlcyIpLCBvcHRhcmcpOwotCi0JICBicmVhazsKLSNpZmRlZiBETExUT09MX01DT1JFX0VMRgotCWNhc2UgJ00nOgotCSAgbWNvcmVfZWxmX291dF9maWxlID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnTCc6Ci0JICBtY29yZV9lbGZfbGlua2VyID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnRic6Ci0JICBtY29yZV9lbGZfbGlua2VyX2ZsYWdzID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IG10YWJsZVtpXS50eXBlOyBpKyspCi0gICAgaWYgKHN0cmNtcCAobXRhYmxlW2ldLnR5cGUsIG1uYW1lKSA9PSAwKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKCFtdGFibGVbaV0udHlwZSkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJNYWNoaW5lICclcycgbm90IHN1cHBvcnRlZCIpLCBtbmFtZSk7Ci0KLSAgbWFjaGluZSA9IGk7Ci0KLSAgaWYgKCFkbGxfbmFtZSAmJiBleHBfbmFtZSkKLSAgICB7Ci0gICAgICBpbnQgbGVuID0gc3RybGVuIChleHBfbmFtZSkgKyA1OwotICAgICAgZGxsX25hbWUgPSB4bWFsbG9jIChsZW4pOwotICAgICAgc3RyY3B5IChkbGxfbmFtZSwgZXhwX25hbWUpOwotICAgICAgc3RyY2F0IChkbGxfbmFtZSwgIi5kbGwiKTsKLSAgICB9Ci0KLSAgaWYgKGFzX25hbWUgPT0gTlVMTCkKLSAgICBhc19uYW1lID0gZGVkdWNlX25hbWUgKCJhcyIpOwotICAKLSAgLyogRG9uJ3QgdXNlIHRoZSBkZWZhdWx0IGV4Y2x1ZGUgbGlzdCBpZiB3ZSdyZSByZWFkaW5nIG9ubHkgdGhlCi0gICAgIHN5bWJvbHMgaW4gdGhlIC5kcmVjdHZlIHNlY3Rpb24uICBUaGUgZGVmYXVsdCBleGNsdWRlcyBhcmUgbWVhbnQKLSAgICAgdG8gYXZvaWQgZXhwb3J0aW5nIERMTCBlbnRyeSBwb2ludCBhbmQgQ3lnd2luMzIgaW1wdXJlX3B0ci4gICovCi0gIGlmICghIGV4cG9ydF9hbGxfc3ltYm9scykKLSAgICBkb19kZWZhdWx0X2V4Y2x1ZGVzID0gZmFsc2U7Ci0gIAotICBpZiAoZG9fZGVmYXVsdF9leGNsdWRlcykKLSAgICBzZXRfZGVmYXVsdF9leGNsdWRlcyAoKTsKLQotICBpZiAoZGVmX2ZpbGUpCi0gICAgcHJvY2Vzc19kZWZfZmlsZSAoZGVmX2ZpbGUpOwotCi0gIHdoaWxlIChvcHRpbmQgPCBhYykKLSAgICB7Ci0gICAgICBpZiAoIWZpcnN0YXJnKQotCWZpcnN0YXJnID0gYXZbb3B0aW5kXTsKLSAgICAgIHNjYW5fb2JqX2ZpbGUgKGF2W29wdGluZF0pOwotICAgICAgb3B0aW5kKys7Ci0gICAgfQotCi0gIG1hbmdsZV9kZWZzICgpOwotCi0gIGlmIChleHBfbmFtZSkKLSAgICBnZW5fZXhwX2ZpbGUgKCk7Ci0gIAotICBpZiAoaW1wX25hbWUpCi0gICAgewotICAgICAgLyogTWFrZSBpbXBfbmFtZSBzYWZlIGZvciB1c2UgYXMgYSBsYWJlbC4gKi8KLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIGltcF9uYW1lX2xhYiA9IHhzdHJkdXAgKGltcF9uYW1lKTsKLSAgICAgIGZvciAocCA9IGltcF9uYW1lX2xhYjsgKnA7IHArKykKLQl7Ci0JICBpZiAoIWlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSAqcCkgJiYgIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcCkpCi0JICAgICpwID0gJ18nOwotCX0KLSAgICAgIGhlYWRfbGFiZWwgPSBtYWtlX2xhYmVsKCJfaGVhZF8iLCBpbXBfbmFtZV9sYWIpOwotICAgICAgZ2VuX2xpYl9maWxlICgpOwotICAgIH0KLSAgCi0gIGlmIChvdXRwdXRfZGVmKQotICAgIGdlbl9kZWZfZmlsZSAoKTsKLSAgCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLSAgaWYgKG1jb3JlX2VsZl9vdXRfZmlsZSkKLSAgICBtY29yZV9lbGZfZ2VuX291dF9maWxlICgpOwotI2VuZGlmCi0gIAotICByZXR1cm4gMDsKLX0KLQotLyogTG9vayBmb3IgdGhlIHByb2dyYW0gZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgUFJPR19OQU1FIGFuZCB0aGUKLSAgIHN0cmluZyBydW5uaW5nIGZyb20gUFJFRklYIHRvIEVORF9QUkVGSVguICBJZiB0aGUgY29uY2F0ZW5hdGVkCi0gICBzdHJpbmcgY29udGFpbnMgYSAnLycsIHRyeSBhcHBlbmRpbmcgRVhFQ1VUQUJMRV9TVUZGSVggaWYgaXQgaXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotc3RhdGljIGNoYXIgKgotbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcmVmaXgsIGVuZF9wcmVmaXgpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcHJlZml4OwotICAgICBpbnQgZW5kX3ByZWZpeDsKLXsKLSAgc3RydWN0IHN0YXQgczsKLSAgY2hhciAqY21kOwotCi0gIGNtZCA9IHhtYWxsb2MgKHN0cmxlbiAocHJlZml4KSAKLSAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKHByb2dfbmFtZSkgCi0jaWZkZWYgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWAotICAgICAgICAgICAgICAgICArIHN0cmxlbiAoRVhFQ1VUQUJMRV9TVUZGSVgpIAotI2VuZGlmCi0JCSArIDEwKTsKLSAgc3RyY3B5IChjbWQsIHByZWZpeCk7Ci0KLSAgc3ByaW50ZiAoY21kICsgZW5kX3ByZWZpeCwgIiVzIiwgcHJvZ19uYW1lKTsKLQotICBpZiAoc3RyY2hyIChjbWQsICcvJykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgZm91bmQ7Ci0KLSAgICAgIGZvdW5kID0gKHN0YXQgKGNtZCwgJnMpID09IDAKLSNpZmRlZiBIQVZFX0VYRUNVVEFCTEVfU1VGRklYCi0gICAgICAgICAgICAgICB8fCBzdGF0IChzdHJjYXQgKGNtZCwgRVhFQ1VUQUJMRV9TVUZGSVgpLCAmcykgPT0gMAotI2VuZGlmCi0JICAgICAgICk7Ci0KLSAgICAgIGlmICghIGZvdW5kKQotICAgICAgICB7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgaW5mb3JtIChfKCJUcmllZCBmaWxlOiAlcyIpLCBjbWQpOwotCSAgZnJlZSAoY21kKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJVc2luZyBmaWxlOiAlcyIpLCBjbWQpOwotCi0gIHJldHVybiBjbWQ7Ci19Ci0KLS8qIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB3ZSBhcmUgd2FudCB0byBpbnZva2UuCi0gICBQUk9HX05BTUUgaXMgdGhlIGJhc2ljIG5hbWUgb2YgdGhlIHByb2dyYW0gd2Ugd2FudCB0byBydW4sCi0gICBlZyAiYXMiIG9yICJsZCIuICBUaGUgY2F0Y2ggaXMgdGhhdCB3ZSBtaWdodCB3YW50IGFjdHVhbGx5Ci0gICBydW4gImkzODYtcGUtYXMiIG9yICJwcGMtcGUtbGQiLiAgCi0KLSAgIElmIGFyZ3ZbMF0gY29udGFpbnMgdGhlIGZ1bGwgcGF0aCwgdGhlbiB0cnkgdG8gZmluZCB0aGUgcHJvZ3JhbQotICAgaW4gdGhlIHNhbWUgcGxhY2UsIHdpdGggYW5kIHRoZW4gd2l0aG91dCBhIHRhcmdldC1saWtlIHByZWZpeC4KLQotICAgR2l2ZW4sIGFyZ3ZbMF0gPSAvdXNyL2xvY2FsL2Jpbi9pNTg2LWN5Z3dpbjMyLWRsbHRvb2wsCi0gICBkZWR1Y2VfbmFtZSgiYXMiKSB1c2VzIHRoZSBmb2xsb3dpbmcgc2VhcmNoIG9yZGVyOiAKLQotICAgICAvdXNyL2xvY2FsL2Jpbi9pNTg2LWN5Z3dpbjMyLWFzCi0gICAgIC91c3IvbG9jYWwvYmluL2FzCi0gICAgIGFzCi0gICAKLSAgIElmIHRoZXJlJ3MgYW4gRVhFQ1VUQUJMRV9TVUZGSVgsIGl0J2xsIHVzZSB0aGF0IGFzIHdlbGw7IGZvciBlYWNoCi0gICBuYW1lLCBpdCdsbCB0cnkgd2l0aG91dCBhbmQgdGhlbiB3aXRoIEVYRUNVVEFCTEVfU1VGRklYLgotCi0gICBHaXZlbiwgYXJndlswXSA9IGk1ODYtY3lnd2luMzItZGxsdG9vbCwgaXQgd2lsbCBub3QgZXZlbiB0cnkgImFzIgotICAgYXMgdGhlIGZhbGxiYWNrLCBidXQgcmF0aGVyIHJldHVybiBpNTg2LWN5Z3dpbjMyLWFzLgotICAgICAKLSAgIE9oLCBhbmQgZ2l2ZW4sIGFyZ3ZbMF0gPSBkbGx0b29sLCBpdCdsbCByZXR1cm4gImFzIi4KLQotICAgUmV0dXJucyBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmcuICAqLwotCi1zdGF0aWMgY2hhciAqCi1kZWR1Y2VfbmFtZSAocHJvZ19uYW1lKQotICAgICBjb25zdCBjaGFyICpwcm9nX25hbWU7Ci17Ci0gIGNoYXIgKmNtZDsKLSAgY2hhciAqZGFzaCwgKnNsYXNoLCAqY3A7Ci0KLSAgZGFzaCA9IE5VTEw7Ci0gIHNsYXNoID0gTlVMTDsKLSAgZm9yIChjcCA9IHByb2dyYW1fbmFtZTsgKmNwICE9ICdcMCc7ICsrY3ApCi0gICAgewotICAgICAgaWYgKCpjcCA9PSAnLScpCi0JZGFzaCA9IGNwOwotICAgICAgaWYgKAotI2lmIGRlZmluZWQoX19ESkdQUF9fKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKLQkgICpjcCA9PSAnOicgfHwgKmNwID09ICdcXCcgfHwKLSNlbmRpZgotCSAgKmNwID09ICcvJykKLQl7Ci0JICBzbGFzaCA9IGNwOwotCSAgZGFzaCA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBjbWQgPSBOVUxMOwotCi0gIGlmIChkYXNoICE9IE5VTEwpCi0gICAgewotICAgICAgLyogRmlyc3QsIHRyeSBsb29raW5nIGZvciBhIHByZWZpeGVkIFBST0dfTkFNRSBpbiB0aGUKLSAgICAgICAgIFBST0dSQU1fTkFNRSBkaXJlY3RvcnksIHdpdGggdGhlIHNhbWUgcHJlZml4IGFzIFBST0dSQU1fTkFNRS4gICovCi0gICAgICBjbWQgPSBsb29rX2Zvcl9wcm9nIChwcm9nX25hbWUsIHByb2dyYW1fbmFtZSwgZGFzaCAtIHByb2dyYW1fbmFtZSArIDEpOwotICAgIH0KLQotICBpZiAoc2xhc2ggIT0gTlVMTCAmJiBjbWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBOZXh0LCB0cnkgbG9va2luZyBmb3IgYSBQUk9HX05BTUUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzCi0gICAgICAgICB0aGF0IG9mIHRoaXMgcHJvZ3JhbS4gICovCi0gICAgICBjbWQgPSBsb29rX2Zvcl9wcm9nIChwcm9nX25hbWUsIHByb2dyYW1fbmFtZSwgc2xhc2ggLSBwcm9ncmFtX25hbWUgKyAxKTsKLSAgICB9Ci0KLSAgaWYgKGNtZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEp1c3QgcmV0dXJuIFBST0dfTkFNRSBhcyBpcy4gICovCi0gICAgICBjbWQgPSB4c3RyZHVwIChwcm9nX25hbWUpOwotICAgIH0KLQotICByZXR1cm4gY21kOwotfQotCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLXR5cGVkZWYgc3RydWN0IGZuYW1lX2NhY2hlCi17Ci0gIGNoYXIgKiAgICAgICAgICAgICAgIGZpbGVuYW1lOwotICBzdHJ1Y3QgZm5hbWVfY2FjaGUgKiBuZXh0OwotfQotZm5hbWVfY2FjaGU7Ci0KLXN0YXRpYyBmbmFtZV9jYWNoZSBmbmFtZXM7Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9lbGZfY2FjaGVfZmlsZW5hbWUgKGNoYXIgKiBmaWxlbmFtZSkKLXsKLSAgZm5hbWVfY2FjaGUgKiBwdHI7Ci0KLSAgcHRyID0gJiBmbmFtZXM7Ci0KLSAgd2hpbGUgKHB0ci0+bmV4dCAhPSBOVUxMKQotICAgIHB0ciA9IHB0ci0+bmV4dDsKLQotICBwdHItPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIHB0ci0+bmV4dCAgICAgPSAoZm5hbWVfY2FjaGUgKikgbWFsbG9jIChzaXplb2YgKGZuYW1lX2NhY2hlKSk7Ci0gIGlmIChwdHItPm5leHQgIT0gTlVMTCkKLSAgICBwdHItPm5leHQtPm5leHQgPSBOVUxMOwotfQotCi0jZGVmaW5lIE1DT1JFX0VMRl9UTVBfT0JKICJtY29yZWVsZi5vIgotI2RlZmluZSBNQ09SRV9FTEZfVE1QX0VYUCAibWNvcmVlbGYuZXhwIgotI2RlZmluZSBNQ09SRV9FTEZfVE1QX0xJQiAibWNvcmVlbGYubGliIgotCi1zdGF0aWMgdm9pZAotbWNvcmVfZWxmX2dlbl9vdXRfZmlsZSAodm9pZCkKLXsKLSAgZm5hbWVfY2FjaGUgKiBwdHI7Ci0gIGR5bl9zdHJpbmdfdCBkczsKLQotICAvKiBTdGVwIG9uZS4gIFJ1biAnbGQgLXInIG9uIHRoZSBpbnB1dCBvYmplY3QgZmlsZXMgaW4gb3JkZXIgdG8gcmVzb2x2ZQotICAgICBhbnkgaW50ZXJuYWwgcmVmZXJlbmNlcyBhbmQgdG8gZ2VuZXJhdGUgYSBzaW5nbGUgLmV4cG9ydHMgc2VjdGlvbi4gICovCi0gIHB0ciA9ICYgZm5hbWVzOwotCi0gIGRzID0gZHluX3N0cmluZ19uZXcgKDEwMCk7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIi1yICIpOwotCi0gIGlmIChtY29yZV9lbGZfbGlua2VyX2ZsYWdzICE9IE5VTEwpCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBtY29yZV9lbGZfbGlua2VyX2ZsYWdzKTsKLSAgCi0gIHdoaWxlIChwdHItPm5leHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIHB0ci0+ZmlsZW5hbWUpOwotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiICIpOwotCi0gICAgICBwdHIgPSBwdHItPm5leHQ7Ci0gICAgfQotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIi1vICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIE1DT1JFX0VMRl9UTVBfT0JKKTsKLQotICBpZiAobWNvcmVfZWxmX2xpbmtlciA9PSBOVUxMKQotICAgIG1jb3JlX2VsZl9saW5rZXIgPSBkZWR1Y2VfbmFtZSAoImxkIik7Ci0gIAotICBydW4gKG1jb3JlX2VsZl9saW5rZXIsIGRzLT5zKTsKLQotICBkeW5fc3RyaW5nX2RlbGV0ZSAoZHMpOwotCi0gIC8qIFN0ZXAgdHdvLiBDcmVhdGUgYSAuZXhwIGZpbGUgYW5kIGEgLmxpYiBmaWxlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlLiAKLSAgICAgRG8gdGhpcyBieSByZWN1cnNpdmVseSBpbnZva2luZyBkbGx0b29sLi4uLiovCi0gIGRzID0gZHluX3N0cmluZ19uZXcgKDEwMCk7Ci0KLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiLVMgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgYXNfbmFtZSk7Ci0gIAotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgLWUgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgTUNPUkVfRUxGX1RNUF9FWFApOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgLWwgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgTUNPUkVfRUxGX1RNUF9MSUIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgIiApOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIE1DT1JFX0VMRl9UTVBfT0JKKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgLXYiKTsKLSAgCi0gIGlmIChkb250ZGVsdGVtcHMpCi0gICAgewotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC1uIik7Ci0gIAotICAgICAgaWYgKGRvbnRkZWx0ZW1wcyA+IDEpCi0JZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC1uIik7Ci0gICAgfQotCi0gIC8qIFhYWCAtIEZJTUU6IG91Z2h0IHRvIGNoZWNrL2NvcHkgb3RoZXIgY29tbWFuZCBsaW5lIG9wdGlvbnMgYXMgd2VsbC4gICovCi0gIAotICBydW4gKHByb2dyYW1fbmFtZSwgZHMtPnMpOwotCi0gIGR5bl9zdHJpbmdfZGVsZXRlIChkcyk7Ci0KLSAgLyogU3RlcCBmb3VyLiBGZWVkIHRoZSAuZXhwIGFuZCBvYmplY3QgZmlsZXMgdG8gbGQgLXNoYXJlZCB0byBjcmVhdGUgdGhlIGRsbC4gICovCi0gIGRzID0gZHluX3N0cmluZ19uZXcgKDEwMCk7Ci0KLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiLXNoYXJlZCAiKTsKLQotICBpZiAobWNvcmVfZWxmX2xpbmtlcl9mbGFncykKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIG1jb3JlX2VsZl9saW5rZXJfZmxhZ3MpOwotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAiKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBNQ09SRV9FTEZfVE1QX0VYUCk7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAiKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBNQ09SRV9FTEZfVE1QX09CSik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAtbyAiKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBtY29yZV9lbGZfb3V0X2ZpbGUpOwotCi0gIHJ1biAobWNvcmVfZWxmX2xpbmtlciwgZHMtPnMpOwotCi0gIGR5bl9zdHJpbmdfZGVsZXRlIChkcyk7Ci0KLSAgaWYgKGRvbnRkZWx0ZW1wcyA9PSAwKQotICAgIHVubGluayAoTUNPUkVfRUxGX1RNUF9FWFApOwotCi0gIGlmIChkb250ZGVsdGVtcHMgPCAyKQotICAgIHVubGluayAoTUNPUkVfRUxGX1RNUF9PQkopOwotfQotI2VuZGlmIC8qIERMTFRPT0xfTUNPUkVfRUxGICovCmRpZmYgLS1naXQgYS9iaW51dGlscy9kbGx0b29sLmggYi9iaW51dGlscy9kbGx0b29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTY3YzguLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGxsdG9vbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogZGxsdG9vbC5oIC0tIGhlYWRlciBmaWxlIGZvciBkbGx0b29sCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWV4dGVybiB2b2lkIGRlZl9jb2RlIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX2RhdGEgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfZGVzY3JpcHRpb24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZfZXhwb3J0cwotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfaGVhcHNpemUgUEFSQU1TICgoaW50LCBpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9pbXBvcnQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9saWJyYXJ5IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9zdGFja3NpemUgUEFSQU1TICgoaW50LCBpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl92ZXJzaW9uIFBBUkFNUyAoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGludCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGludCB5eWRlYnVnOwotZXh0ZXJuIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gRklMRSAqeXlpbjsKLWV4dGVybiBpbnQgbGluZW51bWJlcjsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RsbHdyYXAuYyBiL2JpbnV0aWxzL2RsbHdyYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ2MDZmYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kbGx3cmFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMzICswLDAgQEAKLS8qIGRsbHdyYXAuYyAtLSB3cmFwcGVyIGZvciBETExUT09MIGFuZCBHQ0MgdG8gZ2VuZXJhdGUgUEUgc3R5bGUgRExMcwotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTXVtaXQgS2hhbiAoa2hhbkB4cmF5bGl0aC53aXNjLmVkdSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gICovCi0jaWZuZGVmIF9fR05VQ19fCi0jIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAiZHluLXN0cmluZy5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1lTX1dBSVRfSAotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jZWxzZSAvKiAhIEhBVkVfU1lTX1dBSVRfSCAqLwotI2lmICEgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTjMyX18pCi0jaWZuZGVmIFdJRkVYSVRFRAotI2RlZmluZSBXSUZFWElURUQodykJKCgodykmMDM3NykgPT0gMCkKLSNlbmRpZgotI2lmbmRlZiBXSUZTSUdOQUxFRAotI2RlZmluZSBXSUZTSUdOQUxFRCh3KQkoKCh3KSYwMzc3KSAhPSAwMTc3ICYmICgodykmfjAzNzcpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV1RFUk1TSUcKLSNkZWZpbmUgV1RFUk1TSUcodykJKCh3KSAmIDAxNzcpCi0jZW5kaWYKLSNpZm5kZWYgV0VYSVRTVEFUVVMKLSNkZWZpbmUgV0VYSVRTVEFUVVModykJKCgodykgPj4gOCkgJiAwMzc3KQotI2VuZGlmCi0jZWxzZSAvKiBkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19DWUdXSU4zMl9fKSAqLwotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHcpCSgoKHcpICYgMHhmZikgPT0gMCkKLSNlbmRpZgotI2lmbmRlZiBXSUZTSUdOQUxFRAotI2RlZmluZSBXSUZTSUdOQUxFRCh3KQkoKCh3KSAmIDB4ZmYpICE9IDAgJiYgKCh3KSAmIDB4ZmYpICE9IDB4N2YpCi0jZW5kaWYKLSNpZm5kZWYgV1RFUk1TSUcKLSNkZWZpbmUgV1RFUk1TSUcodykJKCh3KSAmIDB4N2YpCi0jZW5kaWYKLSNpZm5kZWYgV0VYSVRTVEFUVVMKLSNkZWZpbmUgV0VYSVRTVEFUVVModykJKCgodykgJiAweGZmMDApID4+IDgpCi0jZW5kaWYKLSNlbmRpZiAvKiBkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19DWUdXSU4zMl9fKSAqLwotI2VuZGlmIC8qICEgSEFWRV9TWVNfV0FJVF9IICovCi0KLXN0YXRpYyBjaGFyICpwcm9ncmFtX3ZlcnNpb24gPSAiMC4yLjQiOwotc3RhdGljIGNoYXIgKmRyaXZlcl9uYW1lID0gTlVMTDsKLXN0YXRpYyBjaGFyICpjeWd3aW5fZHJpdmVyX2ZsYWdzID0gCi0gICItV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyI7Ci1zdGF0aWMgY2hhciAqbWluZ3czMl9kcml2ZXJfZmxhZ3MgPSAiLW1kbGwiOwotc3RhdGljIGNoYXIgKmdlbmVyaWNfZHJpdmVyX2ZsYWdzID0gIi1XbCwtLWRsbCI7Ci0KLXN0YXRpYyBjaGFyICplbnRyeV9wb2ludDsKLQotc3RhdGljIGNoYXIgKmRsbHRvb2xfbmFtZSA9IE5VTEw7Ci0KLXN0YXRpYyBjaGFyICp0YXJnZXQgPSBUQVJHRVQ7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIFVOS05PV05fVEFSR0VULCAKLSAgQ1lHV0lOX1RBUkdFVCwgCi0gIE1JTkdXMzJfVEFSR0VUCi19IAotdGFyZ2V0X3R5cGU7Ci0KLXN0YXRpYyB0YXJnZXRfdHlwZSB3aGljaF90YXJnZXQgPSBVTktOT1dOX1RBUkdFVDsKLQotc3RhdGljIGludCBkb250ZGVsdGVtcHMgPSAwOwotc3RhdGljIGludCBkcnlfcnVuID0gMDsKLQotc3RhdGljIGNoYXIgKnByb2dyYW1fbmFtZTsKLQotc3RhdGljIGludCB2ZXJib3NlID0gMDsKLQotc3RhdGljIGNoYXIgKmRsbF9maWxlX25hbWU7Ci1zdGF0aWMgY2hhciAqZGxsX25hbWU7Ci1zdGF0aWMgY2hhciAqYmFzZV9maWxlX25hbWU7Ci1zdGF0aWMgY2hhciAqZXhwX2ZpbGVfbmFtZTsKLXN0YXRpYyBjaGFyICpkZWZfZmlsZV9uYW1lOwotc3RhdGljIGludCBkZWxldGVfYmFzZV9maWxlID0gMTsKLXN0YXRpYyBpbnQgZGVsZXRlX2V4cF9maWxlID0gMTsKLXN0YXRpYyBpbnQgZGVsZXRlX2RlZl9maWxlID0gMTsKLQotc3RhdGljIGludCBydW4gUEFSQU1TICgoY29uc3QgY2hhciAqLCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkaXNwbGF5IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwotc3RhdGljIHZvaWQgaW5mb3JtIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci1zdGF0aWMgY2hhciAqbG9va19mb3JfcHJvZyBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgY2hhciAqZGVkdWNlX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkZWxldGVfdGVtcF9maWxlcyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBjbGVhbnVwX2FuZF9leGl0IFBBUkFNUyAoKGludCBzdGF0dXMpKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFBsZWFzZSBrZWVwIHRoZSBmb2xsb3dpbmcgNCByb3V0aW5lcyBpbiBzeW5jIHdpdGggZGxsdG9vbC5jOgotICAgICBkaXNwbGF5ICgpCi0gICAgIGluZm9ybSAoKQotICAgICBsb29rX2Zvcl9wcm9nICgpCi0gICAgIGRlZHVjZV9uYW1lICgpCi0gICBJdCdzIG5vdCB3b3J0aCB0aGUgaGFzc2xlIHRvIGJyZWFrIHRoZXNlIG91dCBzaW5jZSBkbGx3cmFwIHdpbGwKLSAgIChob3BlZnVsbHkpIHNvb24gYmUgcmV0aXJlZCBpbiBmYXZvciBvZiBgbGQgLS1zaGFyZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzcGxheSAobWVzc2FnZSwgYXJncykKLSAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2U7Ci0gICAgIHZhX2xpc3QgICAgICBhcmdzOwotewotICBpZiAocHJvZ3JhbV9uYW1lICE9IE5VTEwpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0KLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0KLSAgaWYgKG1lc3NhZ2UgW3N0cmxlbiAobWVzc2FnZSkgLSAxXSAhPSAnXG4nKQotICAgIGZwdXRjICgnXG4nLCBzdGRlcnIpOwotfSAgCi0KLQotc3RhdGljIHZvaWQKLSNpZmRlZiBfX1NURENfXwotaW5mb3JtIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotI2Vsc2UKLWluZm9ybSAobWVzc2FnZSwgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlOwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZ3M7Ci0gIAotICBpZiAoIXZlcmJvc2UpCi0gICAgcmV0dXJuOwotCi0jaWZkZWYgX19TVERDX18KLSAgdmFfc3RhcnQgKGFyZ3MsIG1lc3NhZ2UpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZ3MpOwotI2VuZGlmCi0KLSAgZGlzcGxheSAobWVzc2FnZSwgYXJncyk7Ci0gIAotICB2YV9lbmQgKGFyZ3MpOwotfQotCi0vKiBMb29rIGZvciB0aGUgcHJvZ3JhbSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBQUk9HX05BTUUgYW5kIHRoZQotICAgc3RyaW5nIHJ1bm5pbmcgZnJvbSBQUkVGSVggdG8gRU5EX1BSRUZJWC4gIElmIHRoZSBjb25jYXRlbmF0ZWQKLSAgIHN0cmluZyBjb250YWlucyBhICcvJywgdHJ5IGFwcGVuZGluZyBFWEVDVVRBQkxFX1NVRkZJWCBpZiBpdCBpcwotICAgYXBwcm9wcmlhdGUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1sb29rX2Zvcl9wcm9nIChwcm9nX25hbWUsIHByZWZpeCwgZW5kX3ByZWZpeCkKLSAgICAgY29uc3QgY2hhciAqcHJvZ19uYW1lOwotICAgICBjb25zdCBjaGFyICpwcmVmaXg7Ci0gICAgIGludCBlbmRfcHJlZml4OwotewotICBzdHJ1Y3Qgc3RhdCBzOwotICBjaGFyICpjbWQ7Ci0KLSAgY21kID0geG1hbGxvYyAoc3RybGVuIChwcmVmaXgpIAotICAgICAgICAgICAgICAgICArIHN0cmxlbiAocHJvZ19uYW1lKSAKLSNpZmRlZiBIQVZFX0VYRUNVVEFCTEVfU1VGRklYCi0gICAgICAgICAgICAgICAgICsgc3RybGVuIChFWEVDVVRBQkxFX1NVRkZJWCkgCi0jZW5kaWYKLQkJICsgMTApOwotICBzdHJjcHkgKGNtZCwgcHJlZml4KTsKLQotICBzcHJpbnRmIChjbWQgKyBlbmRfcHJlZml4LCAiJXMiLCBwcm9nX25hbWUpOwotCi0gIGlmIChzdHJjaHIgKGNtZCwgJy8nKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCBmb3VuZDsKLQotICAgICAgZm91bmQgPSAoc3RhdCAoY21kLCAmcykgPT0gMAotI2lmZGVmIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgKLSAgICAgICAgICAgICAgIHx8IHN0YXQgKHN0cmNhdCAoY21kLCBFWEVDVVRBQkxFX1NVRkZJWCksICZzKSA9PSAwCi0jZW5kaWYKLQkgICAgICAgKTsKLQotICAgICAgaWYgKCEgZm91bmQpCi0gICAgICAgIHsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBpbmZvcm0gKF8oIlRyaWVkIGZpbGU6ICVzIiksIGNtZCk7Ci0JICBmcmVlIChjbWQpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgIH0KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIlVzaW5nIGZpbGU6ICVzIiksIGNtZCk7Ci0KLSAgcmV0dXJuIGNtZDsKLX0KLQotLyogRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHdlIGFyZSB3YW50IHRvIGludm9rZS4KLSAgIFBST0dfTkFNRSBpcyB0aGUgYmFzaWMgbmFtZSBvZiB0aGUgcHJvZ3JhbSB3ZSB3YW50IHRvIHJ1biwKLSAgIGVnICJhcyIgb3IgImxkIi4gIFRoZSBjYXRjaCBpcyB0aGF0IHdlIG1pZ2h0IHdhbnQgYWN0dWFsbHkKLSAgIHJ1biAiaTM4Ni1wZS1hcyIgb3IgInBwYy1wZS1sZCIuICAKLQotICAgSWYgYXJndlswXSBjb250YWlucyB0aGUgZnVsbCBwYXRoLCB0aGVuIHRyeSB0byBmaW5kIHRoZSBwcm9ncmFtCi0gICBpbiB0aGUgc2FtZSBwbGFjZSwgd2l0aCBhbmQgdGhlbiB3aXRob3V0IGEgdGFyZ2V0LWxpa2UgcHJlZml4LgotCi0gICBHaXZlbiwgYXJndlswXSA9IC91c3IvbG9jYWwvYmluL2k1ODYtY3lnd2luMzItZGxsdG9vbCwKLSAgIGRlZHVjZV9uYW1lKCJhcyIpIHVzZXMgdGhlIGZvbGxvd2luZyBzZWFyY2ggb3JkZXI6IAotCi0gICAgIC91c3IvbG9jYWwvYmluL2k1ODYtY3lnd2luMzItYXMKLSAgICAgL3Vzci9sb2NhbC9iaW4vYXMKLSAgICAgYXMKLSAgIAotICAgSWYgdGhlcmUncyBhbiBFWEVDVVRBQkxFX1NVRkZJWCwgaXQnbGwgdXNlIHRoYXQgYXMgd2VsbDsgZm9yIGVhY2gKLSAgIG5hbWUsIGl0J2xsIHRyeSB3aXRob3V0IGFuZCB0aGVuIHdpdGggRVhFQ1VUQUJMRV9TVUZGSVguCi0KLSAgIEdpdmVuLCBhcmd2WzBdID0gaTU4Ni1jeWd3aW4zMi1kbGx0b29sLCBpdCB3aWxsIG5vdCBldmVuIHRyeSAiYXMiCi0gICBhcyB0aGUgZmFsbGJhY2ssIGJ1dCByYXRoZXIgcmV0dXJuIGk1ODYtY3lnd2luMzItYXMuCi0gICAgIAotICAgT2gsIGFuZCBnaXZlbiwgYXJndlswXSA9IGRsbHRvb2wsIGl0J2xsIHJldHVybiAiYXMiLgotCi0gICBSZXR1cm5zIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHN0cmluZy4gICovCi0KLXN0YXRpYyBjaGFyICoKLWRlZHVjZV9uYW1lIChwcm9nX25hbWUpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dfbmFtZTsKLXsKLSAgY2hhciAqY21kOwotICBjaGFyICpkYXNoLCAqc2xhc2gsICpjcDsKLQotICBkYXNoID0gTlVMTDsKLSAgc2xhc2ggPSBOVUxMOwotICBmb3IgKGNwID0gcHJvZ3JhbV9uYW1lOyAqY3AgIT0gJ1wwJzsgKytjcCkKLSAgICB7Ci0gICAgICBpZiAoKmNwID09ICctJykKLQlkYXNoID0gY3A7Ci0gICAgICBpZiAoCi0jaWYgZGVmaW5lZChfX0RKR1BQX18pIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19XSU4zMl9fKQotCSAgKmNwID09ICc6JyB8fCAqY3AgPT0gJ1xcJyB8fAotI2VuZGlmCi0JICAqY3AgPT0gJy8nKQotCXsKLQkgIHNsYXNoID0gY3A7Ci0JICBkYXNoID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIGNtZCA9IE5VTEw7Ci0KLSAgaWYgKGRhc2ggIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBGaXJzdCwgdHJ5IGxvb2tpbmcgZm9yIGEgcHJlZml4ZWQgUFJPR19OQU1FIGluIHRoZQotICAgICAgICAgUFJPR1JBTV9OQU1FIGRpcmVjdG9yeSwgd2l0aCB0aGUgc2FtZSBwcmVmaXggYXMgUFJPR1JBTV9OQU1FLiAgKi8KLSAgICAgIGNtZCA9IGxvb2tfZm9yX3Byb2cgKHByb2dfbmFtZSwgcHJvZ3JhbV9uYW1lLCBkYXNoIC0gcHJvZ3JhbV9uYW1lICsgMSk7Ci0gICAgfQotCi0gIGlmIChzbGFzaCAhPSBOVUxMICYmIGNtZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5leHQsIHRyeSBsb29raW5nIGZvciBhIFBST0dfTkFNRSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMKLSAgICAgICAgIHRoYXQgb2YgdGhpcyBwcm9ncmFtLiAgKi8KLSAgICAgIGNtZCA9IGxvb2tfZm9yX3Byb2cgKHByb2dfbmFtZSwgcHJvZ3JhbV9uYW1lLCBzbGFzaCAtIHByb2dyYW1fbmFtZSArIDEpOwotICAgIH0KLQotICBpZiAoY21kID09IE5VTEwpCi0gICAgewotICAgICAgLyogSnVzdCByZXR1cm4gUFJPR19OQU1FIGFzIGlzLiAgKi8KLSAgICAgIGNtZCA9IHhzdHJkdXAgKHByb2dfbmFtZSk7Ci0gICAgfQotCi0gIHJldHVybiBjbWQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWxldGVfdGVtcF9maWxlcyAoKQotewotICBpZiAoZGVsZXRlX2Jhc2VfZmlsZSAmJiBiYXNlX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBpZiAodmVyYm9zZSkKLQlmcHJpbnRmIChzdGRlcnIsICIlcyB0ZW1wb3JhcnkgYmFzZSBmaWxlICVzXG4iLAotCQkgZG9udGRlbHRlbXBzID8gIktlZXBpbmciIDogIkRlbGV0aW5nIiwKLQkgICAgICAgICBiYXNlX2ZpbGVfbmFtZSk7Ci0gICAgICBpZiAoISBkb250ZGVsdGVtcHMpCi0gICAgICAgIHsKLSAgICAgICAgICB1bmxpbmsgKGJhc2VfZmlsZV9uYW1lKTsKLQkgIGZyZWUgKGJhc2VfZmlsZV9uYW1lKTsKLQl9Ci0gICAgfQotICAKLSAgaWYgKGRlbGV0ZV9leHBfZmlsZSAmJiBleHBfZmlsZV9uYW1lKQotICAgIHsKLSAgICAgIGlmICh2ZXJib3NlKQotCWZwcmludGYgKHN0ZGVyciwgIiVzIHRlbXBvcmFyeSBleHAgZmlsZSAlc1xuIiwKLQkJIGRvbnRkZWx0ZW1wcyA/ICJLZWVwaW5nIiA6ICJEZWxldGluZyIsCi0JICAgICAgICAgZXhwX2ZpbGVfbmFtZSk7Ci0gICAgICBpZiAoISBkb250ZGVsdGVtcHMpCi0gICAgICAgIHsKLSAgICAgICAgICB1bmxpbmsgKGV4cF9maWxlX25hbWUpOwotICAgICAgICAgIGZyZWUgKGV4cF9maWxlX25hbWUpOwotCX0KLSAgICB9Ci0gIGlmIChkZWxldGVfZGVmX2ZpbGUgJiYgZGVmX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBpZiAodmVyYm9zZSkKLQlmcHJpbnRmIChzdGRlcnIsICIlcyB0ZW1wb3JhcnkgZGVmIGZpbGUgJXNcbiIsCi0JCSBkb250ZGVsdGVtcHMgPyAiS2VlcGluZyIgOiAiRGVsZXRpbmciLAotCSAgICAgICAgIGRlZl9maWxlX25hbWUpOwotICAgICAgaWYgKCEgZG9udGRlbHRlbXBzKQotICAgICAgICB7Ci0gICAgICAgICAgdW5saW5rIChkZWZfZmlsZV9uYW1lKTsKLSAgICAgICAgICBmcmVlIChkZWZfZmlsZV9uYW1lKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCAKLWNsZWFudXBfYW5kX2V4aXQgKGludCBzdGF0dXMpCi17Ci0gIGRlbGV0ZV90ZW1wX2ZpbGVzICgpOwotICBleGl0IChzdGF0dXMpOwotfQotICAKLXN0YXRpYyBpbnQKLXJ1biAod2hhdCwgYXJncykKLSAgICAgY29uc3QgY2hhciAqd2hhdDsKLSAgICAgY2hhciAqYXJnczsKLXsKLSAgY2hhciAqczsKLSAgaW50IHBpZCwgd2FpdF9zdGF0dXMsIHJldGNvZGU7Ci0gIGludCBpOwotICBjb25zdCBjaGFyICoqYXJndjsKLSAgY2hhciAqZXJybXNnX2ZtdCwgKmVycm1zZ19hcmc7Ci0gIGNoYXIgKnRlbXBfYmFzZSA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0gIGludCBpbl9xdW90ZTsKLSAgY2hhciBzZXA7Ci0KLSAgaWYgKHZlcmJvc2UgfHwgZHJ5X3J1bikKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlcyAlc1xuIiwgd2hhdCwgYXJncyk7Ci0KLSAgLyogQ291bnQgdGhlIGFyZ3MgKi8KLSAgaSA9IDA7Ci0gIGZvciAocyA9IGFyZ3M7ICpzOyBzKyspCi0gICAgaWYgKCpzID09ICcgJykKLSAgICAgIGkrKzsKLSAgaSsrOwotICBhcmd2ID0gYWxsb2NhIChzaXplb2YgKGNoYXIgKikgKiAoaSArIDMpKTsKLSAgaSA9IDA7Ci0gIGFyZ3ZbaSsrXSA9IHdoYXQ7Ci0gIHMgPSBhcmdzOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICB3aGlsZSAoKnMgPT0gJyAnICYmICpzICE9IDApCi0JcysrOwotICAgICAgaWYgKCpzID09IDApCi0JYnJlYWs7Ci0gICAgICBpbl9xdW90ZSA9ICgqcyA9PSAnXCcnIHx8ICpzID09ICciJyk7Ci0gICAgICBzZXAgPSAoaW5fcXVvdGUpID8gKnMrKyA6ICcgJzsKLSAgICAgIGFyZ3ZbaSsrXSA9IHM7Ci0gICAgICB3aGlsZSAoKnMgIT0gc2VwICYmICpzICE9IDApCi0JcysrOwotICAgICAgaWYgKCpzID09IDApCi0JYnJlYWs7Ci0gICAgICAqcysrID0gMDsKLSAgICAgIGlmIChpbl9xdW90ZSkKLSAgICAgICAgcysrOwotICAgIH0KLSAgYXJndltpKytdID0gTlVMTDsKLQotICBpZiAoZHJ5X3J1bikKLSAgICByZXR1cm4gMDsKLQotICBwaWQgPSBwZXhlY3V0ZSAoYXJndlswXSwgKGNoYXIgKiBjb25zdCAqKSBhcmd2LCBwcm9ncmFtX25hbWUsIHRlbXBfYmFzZSwKLQkJICAmZXJybXNnX2ZtdCwgJmVycm1zZ19hcmcsIFBFWEVDVVRFX09ORSB8IFBFWEVDVVRFX1NFQVJDSCk7Ci0KLSAgaWYgKHBpZCA9PSAtMSkKLSAgICB7Ci0gICAgICBpbnQgZXJybm9fdmFsID0gZXJybm87Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogJXNcbiIsIHN0cmVycm9yIChlcnJub192YWwpKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICByZXRjb2RlID0gMDsKLSAgcGlkID0gcHdhaXQgKHBpZCwgJndhaXRfc3RhdHVzLCAwKTsKLSAgaWYgKHBpZCA9PSAtMSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogd2FpdDogJXNcbiIsIHByb2dyYW1fbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICByZXRjb2RlID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFdJRlNJR05BTEVEICh3YWl0X3N0YXR1cykpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHN1YnByb2Nlc3MgZ290IGZhdGFsIHNpZ25hbCAlZFxuIiwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCBXVEVSTVNJRyAod2FpdF9zdGF0dXMpKTsKLSAgICAgIHJldGNvZGUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoV0lGRVhJVEVEICh3YWl0X3N0YXR1cykpCi0gICAgewotICAgICAgaWYgKFdFWElUU1RBVFVTICh3YWl0X3N0YXR1cykgIT0gMCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczogJXMgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iLAotCSAgCSAgIHByb2dyYW1fbmFtZSwgd2hhdCwgV0VYSVRTVEFUVVMgKHdhaXRfc3RhdHVzKSk7Ci0JICByZXRjb2RlID0gMTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgcmV0Y29kZSA9IDE7Ci0gIAotICByZXR1cm4gcmV0Y29kZTsKLX0KLQotc3RhdGljIGNoYXIgKgotbXliYXNlbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqYmFzZSA9IG5hbWU7Ci0KLSAgd2hpbGUgKCpuYW1lKQotICAgIHsKLSAgICAgIGlmICgqbmFtZSA9PSAnLycgfHwgKm5hbWUgPT0gJ1xcJykKLQl7Ci0JICBiYXNlID0gbmFtZSArIDE7Ci0JfQotICAgICAgKytuYW1lOwotICAgIH0KLSAgcmV0dXJuIChjaGFyICopIGJhc2U7Ci19Ci0KLXN0YXRpYyBpbnQgCi1zdHJoYXNoIChjb25zdCBjaGFyICpzdHIpCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7Ci0gIHVuc2lnbmVkIGxvbmcgaGFzaDsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgaGFzaCA9IDA7Ci0gIGxlbiA9IDA7Ci0gIHMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBzdHI7Ci0gIHdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpCi0gICAgewotICAgICAgaGFzaCArPSBjICsgKGMgPDwgMTcpOwotICAgICAgaGFzaCBePSBoYXNoID4+IDI7Ci0gICAgICArK2xlbjsKLSAgICB9Ci0gIGhhc2ggKz0gbGVuICsgKGxlbiA8PCAxNyk7Ci0gIGhhc2ggXj0gaGFzaCA+PiAyOwotCi0gIHJldHVybiBoYXNoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotcHJpbnRfdmVyc2lvbiAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgLyogVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LiAgKi8KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgcHJpbnRmICgiR05VICVzICVzXG4iLCBuYW1lLCBwcm9ncmFtX3ZlcnNpb24pOwotICBwcmludGYgKCJDb3B5cmlnaHQgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIpOwotICBwcmludGYgKCJcCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG5cCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKTsKLSAgZXhpdCAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSAoZmlsZSwgc3RhdHVzKQotICAgICBGSUxFICpmaWxlOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChmaWxlLCAiVXNhZ2UgJXMgPG9wdGlvbnM+IDxvYmplY3QtZmlsZXM+XG4iLCBwcm9ncmFtX25hbWUpOwotICBmcHJpbnRmIChmaWxlLCAiICBHZW5lcmljIG9wdGlvbnM6XG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tcXVpZXQsIC1xICAgICAgICAgICAgV29yayBxdWlldGx5XG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tdmVyYm9zZSwgLXYgICAgICAgICAgVmVyYm9zZVxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLXZlcnNpb24gICAgICAgICAgICAgIFByaW50IGRsbHdyYXAgdmVyc2lvblxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWltcGxpYiA8b3V0bmFtZT4gICAgIFN5bm9ueW0gZm9yIC0tb3V0cHV0LWxpYlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgIE9wdGlvbnMgZm9yICVzOlxuIiwgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZHJpdmVyLW5hbWUgPGRyaXZlcj4gRGVmYXVsdHMgdG8gXCJnY2NcIlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWRyaXZlci1mbGFncyA8ZmxhZ3M+IE92ZXJyaWRlIGRlZmF1bHQgbGQgZmxhZ3NcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1kbGx0b29sLW5hbWUgPGRsbHRvb2w+IERlZmF1bHRzIHRvIFwiZGxsdG9vbFwiXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZW50cnkgPGVudHJ5PiAgICAgICAgU3BlY2lmeSBhbHRlcm5hdGUgRExMIGVudHJ5IHBvaW50XG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0taW1hZ2UtYmFzZSA8YmFzZT4gICAgU3BlY2lmeSBpbWFnZSBiYXNlIGFkZHJlc3NcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS10YXJnZXQgPG1hY2hpbmU+ICAgICBpMzg2LWN5Z3dpbjMyIG9yIGkzODYtbWluZ3czMlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWRyeS1ydW4gICAgICAgICAgICAgIFNob3cgd2hhdCBuZWVkcyB0byBiZSBydW5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1tbm8tY3lnd2luICAgICAgICAgICBDcmVhdGUgTWluZ3cgRExMXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgT3B0aW9ucyBwYXNzZWQgdG8gRExMVE9PTDpcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1tYWNoaW5lIDxtYWNoaW5lPlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW91dHB1dC1leHAgPG91dG5hbWU+IEdlbmVyYXRlIGV4cG9ydCBmaWxlLlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW91dHB1dC1saWIgPG91dG5hbWU+IEdlbmVyYXRlIGlucHV0IGxpYnJhcnkuXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tYWRkLWluZGlyZWN0ICAgICAgICAgQWRkIGRsbCBpbmRpcmVjdHMgdG8gZXhwb3J0IGZpbGUuXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZGxsbmFtZSA8bmFtZT4gICAgICAgTmFtZSBvZiBpbnB1dCBkbGwgdG8gcHV0IGludG8gb3V0cHV0IGxpYi5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1kZWYgPGRlZmZpbGU+ICAgICAgICBOYW1lIGlucHV0IC5kZWYgZmlsZVxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW91dHB1dC1kZWYgPGRlZmZpbGU+IE5hbWUgb3V0cHV0IC5kZWYgZmlsZVxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWV4cG9ydC1hbGwtc3ltYm9scyAgICAgRXhwb3J0IGFsbCBzeW1ib2xzIHRvIC5kZWZcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1uby1leHBvcnQtYWxsLXN5bWJvbHMgIE9ubHkgZXhwb3J0IC5kcmVjdHZlIHN5bWJvbHNcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1leGNsdWRlLXN5bWJvbHMgPGxpc3Q+IEV4Y2x1ZGUgPGxpc3Q+IGZyb20gLmRlZlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW5vLWRlZmF1bHQtZXhjbHVkZXMgICAgWmFwIGRlZmF1bHQgZXhjbHVkZSBzeW1ib2xzXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tYmFzZS1maWxlIDxiYXNlZmlsZT4gUmVhZCBsaW5rZXIgZ2VuZXJhdGVkIGJhc2UgZmlsZVxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW5vLWlkYXRhNCAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNCBzZWN0aW9uXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbm8taWRhdGE1ICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBpZGF0YSQ1IHNlY3Rpb25cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLVUgICAgICAgICAgICAgICAgICAgICBBZGQgdW5kZXJzY29yZXMgdG8gLmxpYlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtayAgICAgICAgICAgICAgICAgICAgIEtpbGwgQDxuPiBmcm9tIGV4cG9ydGVkIG5hbWVzXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tYWRkLXN0ZGNhbGwtYWxpYXMgICAgQWRkIGFsaWFzZXMgd2l0aG91dCBAPG4+XG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tYXMgPG5hbWU+ICAgICAgICAgICAgVXNlIDxuYW1lPiBmb3IgYXNzZW1ibGVyXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbm9kZWxldGUgICAgICAgICAgICAgS2VlcCB0ZW1wIGZpbGVzLlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgIFJlc3QgYXJlIHBhc3NlZCB1bm1vZGlmaWVkIHRvIHRoZSBsYW5ndWFnZSBkcml2ZXJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiXG5cbiIpOwotICBleGl0IChzdGF0dXMpOwotfQotCi0jZGVmaW5lIE9QVElPTl9TVEFSVAkJMTQ5Ci0KLS8qIEdFTkVSSUMgb3B0aW9ucy4gKi8KLSNkZWZpbmUgT1BUSU9OX1FVSUVUCQkoT1BUSU9OX1NUQVJUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUkJPU0UJCShPUFRJT05fUVVJRVQgKyAxKQotI2RlZmluZSBPUFRJT05fVkVSU0lPTgkJKE9QVElPTl9WRVJCT1NFICsgMSkKLQotLyogRExMV1JBUCBvcHRpb25zLiAqLwotI2RlZmluZSBPUFRJT05fRFJZX1JVTgkJKE9QVElPTl9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RSSVZFUl9OQU1FCShPUFRJT05fRFJZX1JVTiArIDEpCi0jZGVmaW5lIE9QVElPTl9EUklWRVJfRkxBR1MJKE9QVElPTl9EUklWRVJfTkFNRSArIDEpCi0jZGVmaW5lIE9QVElPTl9ETExUT09MX05BTUUJKE9QVElPTl9EUklWRVJfRkxBR1MgKyAxKQotI2RlZmluZSBPUFRJT05fRU5UUlkJCShPUFRJT05fRExMVE9PTF9OQU1FICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lNQUdFX0JBU0UJKE9QVElPTl9FTlRSWSArIDEpCi0jZGVmaW5lIE9QVElPTl9UQVJHRVQJCShPUFRJT05fSU1BR0VfQkFTRSArIDEpCi0jZGVmaW5lIE9QVElPTl9NTk9fQ1lHV0lOCShPUFRJT05fVEFSR0VUICsgMSkKLQotLyogRExMVE9PTCBvcHRpb25zLiAqLwotI2RlZmluZSBPUFRJT05fTk9ERUxFVEUJCShPUFRJT05fTU5PX0NZR1dJTiArIDEpCi0jZGVmaW5lIE9QVElPTl9ETExOQU1FCQkoT1BUSU9OX05PREVMRVRFICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0lEQVRBNCAJKE9QVElPTl9ETExOQU1FICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0lEQVRBNQkoT1BUSU9OX05PX0lEQVRBNCArIDEpCi0jZGVmaW5lIE9QVElPTl9PVVRQVVRfRVhQCShPUFRJT05fTk9fSURBVEE1ICsgMSkKLSNkZWZpbmUgT1BUSU9OX09VVFBVVF9ERUYJKE9QVElPTl9PVVRQVVRfRVhQICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYUE9SVF9BTExfU1lNUwkoT1BUSU9OX09VVFBVVF9ERUYgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fRVhQT1JUX0FMTF9TWU1TIChPUFRJT05fRVhQT1JUX0FMTF9TWU1TICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYQ0xVREVfU1lNUwkoT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNUyArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTIChPUFRJT05fRVhDTFVERV9TWU1TICsgMSkKLSNkZWZpbmUgT1BUSU9OX09VVFBVVF9MSUIJKE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RFRgkJKE9QVElPTl9PVVRQVVRfTElCICsgMSkKLSNkZWZpbmUgT1BUSU9OX0FERF9VTkRFUlNDT1JFCShPUFRJT05fREVGICsgMSkKLSNkZWZpbmUgT1BUSU9OX0tJTExBVAkJKE9QVElPTl9BRERfVU5ERVJTQ09SRSArIDEpCi0jZGVmaW5lIE9QVElPTl9IRUxQCQkoT1BUSU9OX0tJTExBVCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQUNISU5FCQkoT1BUSU9OX0hFTFAgKyAxKQotI2RlZmluZSBPUFRJT05fQUREX0lORElSRUNUCShPUFRJT05fTUFDSElORSArIDEpCi0jZGVmaW5lIE9QVElPTl9CQVNFX0ZJTEUJKE9QVElPTl9BRERfSU5ESVJFQ1QgKyAxKQotI2RlZmluZSBPUFRJT05fQVMJCShPUFRJT05fQkFTRV9GSUxFICsgMSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotewotICAvKiBnZW5lcmljIG9wdGlvbnMuICovCi0gIHsicXVpZXQiLCBub19hcmd1bWVudCwgTlVMTCwgJ3EnfSwKLSAgeyJ2ZXJib3NlIiwgbm9fYXJndW1lbnQsIE5VTEwsICd2J30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSU0lPTn0sCi0gIHsiaW1wbGliIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfTElCfSwKLQotICAvKiBkbGx3cmFwIG9wdGlvbnMuICovCi0gIHsiZHJ5LXJ1biIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRFJZX1JVTn0sCi0gIHsiZHJpdmVyLW5hbWUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RSSVZFUl9OQU1FfSwKLSAgeyJkcml2ZXItZmxhZ3MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RSSVZFUl9GTEFHU30sCi0gIHsiZGxsdG9vbC1uYW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ETExUT09MX05BTUV9LAotICB7ImVudHJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdlJ30sCi0gIHsiaW1hZ2UtYmFzZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1BR0VfQkFTRX0sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UQVJHRVR9LAotCi0gIC8qIGRsbHRvb2wgb3B0aW9ucy4gKi8KLSAgeyJuby1kZWxldGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ24nfSwKLSAgeyJkbGxuYW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ETExOQU1FfSwKLSAgeyJuby1pZGF0YTQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0lEQVRBNH0sCi0gIHsibm8taWRhdGE1Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19JREFUQTV9LAotICB7Im91dHB1dC1leHAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09VVFBVVF9FWFB9LAotICB7Im91dHB1dC1kZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09VVFBVVF9ERUZ9LAotICB7ImV4cG9ydC1hbGwtc3ltYm9scyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUX0FMTF9TWU1TfSwKLSAgeyJuby1leHBvcnQtYWxsLXN5bWJvbHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNU30sCi0gIHsiZXhjbHVkZS1zeW1ib2xzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWENMVURFX1NZTVN9LAotICB7Im5vLWRlZmF1bHQtZXhjbHVkZXMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0RFRkFVTFRfRVhDTFVERVN9LAotICB7Im91dHB1dC1saWIiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09VVFBVVF9MSUJ9LAotICB7ImRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fREVGfSwKLSAgeyJhZGQtdW5kZXJzY29yZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVSd9LAotICB7ImtpbGxhdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnayd9LAotICB7ImFkZC1zdGRjYWxsLWFsaWFzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdBJ30sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaCd9LAotICB7Im1hY2hpbmUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BQ0hJTkV9LAotICB7ImFkZC1pbmRpcmVjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQUREX0lORElSRUNUfSwKLSAgeyJiYXNlLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JBU0VfRklMRX0sCi0gIHsiYXMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FTfSwKLSAgezB9Ci19OwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGM7Ci0gIGludCBpOwotCi0gIGNoYXIgKipzYXZlZF9hcmd2ID0gMDsKLSAgaW50IGNtZGxpbmVfbGVuID0gMDsKLQotICBpbnQgZXhwb3J0X2FsbCA9IDA7Ci0KLSAgaW50ICpkbGx0b29sX2FyZ19pbmRpY2VzOwotICBpbnQgKmRyaXZlcl9hcmdfaW5kaWNlczsKLQotICBjaGFyICpkcml2ZXJfZmxhZ3MgPSAwOwotICBjaGFyICpvdXRwdXRfbGliX2ZpbGVfbmFtZSA9IDA7Ci0KLSAgZHluX3N0cmluZ190IGRsbHRvb2xfY21kbGluZTsKLSAgZHluX3N0cmluZ190IGRyaXZlcl9jbWRsaW5lOwotCi0gIGludCBkZWZfZmlsZV9zZWVuID0gMDsKLQotICBjaGFyICppbWFnZV9iYXNlX3N0ciA9IDA7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLQotICBzYXZlZF9hcmd2ID0gKGNoYXIgKiopIHhtYWxsb2MgKGFyZ2MgKiBzaXplb2YgKGNoYXIqKSk7Ci0gIGRsbHRvb2xfYXJnX2luZGljZXMgPSAoaW50ICopIHhtYWxsb2MgKGFyZ2MgKiBzaXplb2YgKGludCkpOwotICBkcml2ZXJfYXJnX2luZGljZXMgPSAoaW50ICopIHhtYWxsb2MgKGFyZ2MgKiBzaXplb2YgKGludCkpOwotICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgKytpKSAKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuID0gc3RybGVuIChhcmd2W2ldKTsKLSAgICAgIGNoYXIgKmFyZyA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOwotICAgICAgc3RyY3B5IChhcmcsIGFyZ3ZbaV0pOwotICAgICAgY21kbGluZV9sZW4gKz0gbGVuOwotICAgICAgc2F2ZWRfYXJndltpXSA9IGFyZzsKLSAgICAgIGRsbHRvb2xfYXJnX2luZGljZXNbaV0gPSAwOwotICAgICAgZHJpdmVyX2FyZ19pbmRpY2VzW2ldID0gMTsKLSAgICB9Ci0gIGNtZGxpbmVfbGVuKys7Ci0KLSAgLyogV2UgcmVjb2duaXplIGRsbHdyYXAgYW5kIGRsbHRvb2wgb3B0aW9ucywgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpcwotICAgICBwYXNzZWQgb250byB0aGUgbGFuZ3VhZ2UgZHJpdmVyIChlZy4sIHRvIEdDQykuIFdlIGNvbGxlY3Qgb3B0aW9ucwotICAgICB0byBkbGx0b29sIGFuZCBkcml2ZXIgaW4gZGxsdG9vbF9hcmdzIGFuZCBkcml2ZXJfYXJncy4gKi8KLSAgIAotICBvcHRlcnIgPSAwOwotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAibmtBcXZlOlVobzpsOkw6SToiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ19vcHRpb25zLCAoaW50ICopIDApKSAhPSBFT0YpCi0gICAgewotICAgICAgaW50IGRsbHRvb2xfYXJnOwotICAgICAgaW50IGRyaXZlcl9hcmc7Ci0gICAgICBpbnQgc2luZ2xlX3dvcmRfb3B0aW9uX3ZhbHVlX3BhaXI7Ci0KLSAgICAgIGRsbHRvb2xfYXJnID0gMDsKLSAgICAgIGRyaXZlcl9hcmcgPSAxOwotICAgICAgc2luZ2xlX3dvcmRfb3B0aW9uX3ZhbHVlX3BhaXIgPSAwOwotCi0gICAgICBpZiAoYyAhPSAnPycpCi0gICAgICAgIHsKLQkgIC8qIFdlIHJlY29nbml6ZSB0aGlzIG9wdGlvbiwgc28gaXQgaGFzIHRvIGJlIGVpdGhlciBkbGx3cmFwIG9yCi0JICAgICBkbGx0b29sIG9wdGlvbi4gRG8gbm90IHBhc3MgdG8gZHJpdmVyIHVubGVzcyBpdCdzIG9uZSBvZiB0aGUKLQkgICAgIGdlbmVyaWMgb3B0aW9ucyB0aGF0IGFyZSBwYXNzZWQgdG8gYWxsIHRoZSB0b29scyAoc3VjaCBhcyAtdikKLQkgICAgIHdoaWNoIGFyZSBkZWFsdCB3aXRoIGxhdGVyLiAqLwotCSAgZHJpdmVyX2FyZyA9IDA7Ci0JfQotCi0gICAgICAvKiBkZWFsIHdpdGggZ2VuZXJpYyBhbmQgZGxsd3JhcCBvcHRpb25zIGZpcnN0LiAqLwotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdoJzoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSAncSc6Ci0JICB2ZXJib3NlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgdmVyYm9zZSA9IDE7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9WRVJTSU9OOgotCSAgcHJpbnRfdmVyc2lvbiAocHJvZ3JhbV9uYW1lKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgZW50cnlfcG9pbnQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9JTUFHRV9CQVNFOgotCSAgaW1hZ2VfYmFzZV9zdHIgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ERUY6Ci0JICBkZWZfZmlsZV9uYW1lID0gb3B0YXJnOwotCSAgZGVmX2ZpbGVfc2VlbiA9IDE7Ci0JICBkZWxldGVfZGVmX2ZpbGUgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JICBkb250ZGVsdGVtcHMgPSAxOwotCSAgZGxsdG9vbF9hcmcgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JICBkbGxfZmlsZV9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnSSc6Ci0JY2FzZSAnbCc6Ci0JY2FzZSAnTCc6Ci0JICBkcml2ZXJfYXJnID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RMTE5BTUU6Ci0JICBkbGxfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RSWV9SVU46Ci0JICBkcnlfcnVuID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RSSVZFUl9OQU1FOgotCSAgZHJpdmVyX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9EUklWRVJfRkxBR1M6Ci0JICBkcml2ZXJfZmxhZ3MgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ETExUT09MX05BTUU6Ci0JICBkbGx0b29sX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9UQVJHRVQ6Ci0JICB0YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9NTk9fQ1lHV0lOOgotCSAgdGFyZ2V0ID0gImkzODYtbWluZ3czMiI7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9CQVNFX0ZJTEU6Ci0JICBiYXNlX2ZpbGVfbmFtZSA9IG9wdGFyZzsKLQkgIGRlbGV0ZV9iYXNlX2ZpbGUgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fT1VUUFVUX0VYUDoKLQkgIGV4cF9maWxlX25hbWUgPSBvcHRhcmc7Ci0JICBkZWxldGVfZXhwX2ZpbGUgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRVhQT1JUX0FMTF9TWU1TOgotCSAgZXhwb3J0X2FsbCA9IDE7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9PVVRQVVRfTElCOgotCSAgb3V0cHV0X2xpYl9maWxlX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICc/JzoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBkbGx0b29sX2FyZyA9IDE7Ci0JICBicmVhazsKLQl9Ci0gICAgICAKLSAgICAgIC8qIEhhbmRsZSBwYXNzaW5nIHRocm91Z2ggLS1vcHRpb249dmFsdWUgY2FzZS4gKi8KLSAgICAgIGlmIChvcHRhcmcgCi0gICAgICAgICAgJiYgc2F2ZWRfYXJndltvcHRpbmQtMV1bMF0gPT0gJy0nIAotICAgICAgICAgICYmIHNhdmVkX2FyZ3Zbb3B0aW5kLTFdWzFdID09ICctJyAKLQkgICYmIHN0cmNociAoc2F2ZWRfYXJndltvcHRpbmQtMV0sICc9JykpCi0Jc2luZ2xlX3dvcmRfb3B0aW9uX3ZhbHVlX3BhaXIgPSAxOwotCi0gICAgICBpZiAoZGxsdG9vbF9hcmcpCi0gICAgICAgIHsKLQkgIGRsbHRvb2xfYXJnX2luZGljZXNbb3B0aW5kLTFdID0gMTsKLQkgIGlmIChvcHRhcmcgJiYgISBzaW5nbGVfd29yZF9vcHRpb25fdmFsdWVfcGFpcikKLQkgICAgewotCSAgICAgIGRsbHRvb2xfYXJnX2luZGljZXNbb3B0aW5kLTJdID0gMTsKLQkgICAgfSAKLQl9Ci0KLSAgICAgIGlmICghIGRyaXZlcl9hcmcpCi0gICAgICAgIHsKLQkgIGRyaXZlcl9hcmdfaW5kaWNlc1tvcHRpbmQtMV0gPSAwOwotCSAgaWYgKG9wdGFyZyAmJiAhIHNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyKQotCSAgICB7Ci0JICAgICAgZHJpdmVyX2FyZ19pbmRpY2VzW29wdGluZC0yXSA9IDA7Ci0JICAgIH0gCi0JfQotICAgIH0KLQotICAvKiBzYW5pdHkgY2hlY2tzLiAqLwotICBpZiAoISBkbGxfbmFtZSAmJiAhIGRsbF9maWxlX25hbWUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLAotICAgICAgICAgICAgICAgIiVzOiBNdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIG9mIC1vIG9yIC0tZGxsbmFtZSBvcHRpb25zXG4iLAotICAgICAgICAgICAgICAgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgZWxzZSBpZiAoISBkbGxfbmFtZSkKLSAgICB7Ci0gICAgICBkbGxfbmFtZSA9IHhzdHJkdXAgKG15YmFzZW5hbWUgKGRsbF9maWxlX25hbWUpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZGxsX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBkbGxfZmlsZV9uYW1lID0geHN0cmR1cCAoZGxsX25hbWUpOwotICAgIH0KLQotICAvKiBEZWR1Y2UgZHJpdmVyLW5hbWUgYW5kIGRsbHRvb2wtbmFtZSBmcm9tIG91ciBvd24uICovCi0gIGlmIChkcml2ZXJfbmFtZSA9PSBOVUxMKQotICAgIGRyaXZlcl9uYW1lID0gZGVkdWNlX25hbWUgKCJnY2MiKTsKLQotICBpZiAoZGxsdG9vbF9uYW1lID09IE5VTEwpCi0gICAgZGxsdG9vbF9uYW1lID0gZGVkdWNlX25hbWUgKCJkbGx0b29sIik7Ci0KLSAgaWYgKCEgZGVmX2ZpbGVfc2VlbikKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlcHJlZml4ID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLSAgICAgIGRlZl9maWxlX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGZpbGVwcmVmaXgpICsgNSk7Ci0gICAgICBzcHJpbnRmIChkZWZfZmlsZV9uYW1lLCAiJXMuZGVmIiwgCi0gICAgICAgICAgICAgICAoZG9udGRlbHRlbXBzKSA/IG15YmFzZW5hbWUgKGZpbGVwcmVmaXgpIDogZmlsZXByZWZpeCk7Ci0gICAgICBkZWxldGVfZGVmX2ZpbGUgPSAxOwotICAgICAgZnJlZSAoZmlsZXByZWZpeCk7Ci0gICAgICBkZWxldGVfZGVmX2ZpbGUgPSAxOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiV2FybmluZzogbm8gZXhwb3J0IGRlZmluaXRpb24gZmlsZSBwcm92aWRlZFxuIik7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIAotICAgICAgICAgICAgICAgImRsbHdyYXAgd2lsbCBjcmVhdGUgb25lLCBidXQgbWF5IG5vdCBiZSB3aGF0IHlvdSB3YW50XG4iKTsKLSAgICB9Ci0gIAotICAvKiBzZXQgdGhlIHRhcmdldCBwbGF0Zm9ybS4gKi8KLSAgaWYgKHN0cnN0ciAodGFyZ2V0LCAiY3lnd2luMzIiKSkKLSAgICB3aGljaF90YXJnZXQgPSBDWUdXSU5fVEFSR0VUOwotICBlbHNlIGlmIChzdHJzdHIgKHRhcmdldCwgIm1pbmd3MzIiKSkKLSAgICB3aGljaF90YXJnZXQgPSBNSU5HVzMyX1RBUkdFVDsKLSAgZWxzZSAKLSAgICB3aGljaF90YXJnZXQgPSBVTktOT1dOX1RBUkdFVDsKLQotICAvKiByZS1jcmVhdGUgdGhlIGNvbW1hbmQgbGluZXMgYXMgYSBzdHJpbmcsIHRha2luZyBjYXJlIHRvIHF1b3RlIHN0dWZmLiAqLwotICBkbGx0b29sX2NtZGxpbmUgPSBkeW5fc3RyaW5nX25ldyAoY21kbGluZV9sZW4pOwotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC12Iik7Ci0gICAgfQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC0tZGxsbmFtZSAiKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgZGxsX25hbWUpOwotCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyArK2kpCi0gICAgewotICAgICAgaWYgKGRsbHRvb2xfYXJnX2luZGljZXNbaV0pCi0gICAgICAgIHsKLQkgIGNoYXIgKmFyZyA9IHNhdmVkX2FyZ3ZbaV07Ci0gICAgICAgICAgaW50IHF1b3RlID0gKHN0cmNociAoYXJnLCAnICcpIHx8IHN0cmNociAoYXJnLCAnXHQnKSk7Ci0JICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIiBcIiIgOiAiICIpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgYXJnKTsKLQkgIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIAotCSAgICAgICAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCX0KLSAgICB9Ci0KLSAgZHJpdmVyX2NtZGxpbmUgPSBkeW5fc3RyaW5nX25ldyAoY21kbGluZV9sZW4pOwotICBpZiAoISBkcml2ZXJfZmxhZ3MgfHwgc3RybGVuIChkcml2ZXJfZmxhZ3MpID09IDApCi0gICAgewotICAgICAgc3dpdGNoICh3aGljaF90YXJnZXQpCi0gICAgICAgIHsKLQljYXNlIENZR1dJTl9UQVJHRVQ6Ci0gICAgICAgICAgZHJpdmVyX2ZsYWdzID0gY3lnd2luX2RyaXZlcl9mbGFnczsKLQkgIGJyZWFrOwotCQotCWNhc2UgTUlOR1czMl9UQVJHRVQ6Ci0gICAgICAgICAgZHJpdmVyX2ZsYWdzID0gbWluZ3czMl9kcml2ZXJfZmxhZ3M7Ci0JICBicmVhazsKLQkKLQlkZWZhdWx0OgotICAgICAgICAgIGRyaXZlcl9mbGFncyA9IGdlbmVyaWNfZHJpdmVyX2ZsYWdzOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCBkcml2ZXJfZmxhZ3MpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsICIgLW8gIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgZGxsX2ZpbGVfbmFtZSk7Ci0KLSAgaWYgKCEgZW50cnlfcG9pbnQgfHwgc3RybGVuIChlbnRyeV9wb2ludCkgPT0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHdoaWNoX3RhcmdldCkKLSAgICAgICAgewotCWNhc2UgQ1lHV0lOX1RBUkdFVDoKLQkgIGVudHJ5X3BvaW50ID0gIl9fY3lnd2luX2RsbF9lbnRyeUAxMiI7Ci0JICBicmVhazsKLQkKLQljYXNlIE1JTkdXMzJfVEFSR0VUOgotCSAgZW50cnlfcG9pbnQgPSAiX0RsbE1haW5DUlRTdGFydHVwQDEyIjsKLQkgIGJyZWFrOwotCQotCWRlZmF1bHQ6Ci0gICAgICAgICAgZW50cnlfcG9pbnQgPSAiX0RsbE1haW5AMTIiOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAiIC1XbCwtZSwiKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCBlbnRyeV9wb2ludCk7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsICIgLS1leGNsdWRlLXN5bWJvbD0iKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgCi0gICAgICAgICAgICAgICAgICAgICAoZW50cnlfcG9pbnRbMF0gPT0gJ18nKSA/IGVudHJ5X3BvaW50KzEgOiBlbnRyeV9wb2ludCk7Ci0KLSAgaWYgKCEgaW1hZ2VfYmFzZV9zdHIgfHwgc3RybGVuIChpbWFnZV9iYXNlX3N0cikgPT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICp0bXBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzaXplb2YgKCIweDEyMzQ1Njc4IikgKyAxKTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaGFzaCA9IHN0cmhhc2ggKGRsbF9maWxlX25hbWUpOwotICAgICAgc3ByaW50ZiAodG1wYnVmLCAiMHglLjhsWCIsIDB4NjAwMDAwMDB8KChoYXNoPDwxNikmMHhGRkMwMDAwKSk7Ci0gICAgICBpbWFnZV9iYXNlX3N0ciA9IHRtcGJ1ZjsKLSAgICB9Ci0KLSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAiIC1XbCwtLWltYWdlLWJhc2UsIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgaW1hZ2VfYmFzZV9zdHIpOwotCi0gIGlmICh2ZXJib3NlKQotICAgIHsKLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgIiAtdiIpOwotICAgIH0KLQotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKQotICAgIHsKLSAgICAgIGlmIChkcml2ZXJfYXJnX2luZGljZXNbaV0pCi0gICAgICAgIHsKLQkgIGNoYXIgKmFyZyA9IHNhdmVkX2FyZ3ZbaV07Ci0gICAgICAgICAgaW50IHF1b3RlID0gKHN0cmNociAoYXJnLCAnICcpIHx8IHN0cmNociAoYXJnLCAnXHQnKSk7Ci0JICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIAotCSAgICAgICAgICAgICAgICAgICAgIChxdW90ZSkgPyAiIFwiIiA6ICIgIik7Ci0JICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIGFyZyk7Ci0JICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIAotCSAgICAgICAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCX0KLSAgICB9Ci0gIAotICAvKgotICAgKiBTdGVwIHByZS0xLiBJZiBubyAtLWRlZiA8RVhQT1JUX0RFRj4gaXMgc3BlY2lmaWVkLCB0aGVuIGNyZWF0ZSBpdAotICAgKiBhbmQgdGhlbiBwYXNzIGl0IG9uLgotICAgKi8KLSAgCi0gIGlmICghIGRlZl9maWxlX3NlZW4pIAotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgZHluX3N0cmluZ190IHN0ZXBfcHJlMTsKLQotICAgICAgc3RlcF9wcmUxID0gZHluX3N0cmluZ19uZXcgKDEwMjQpOwotCi0gICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCBkbGx0b29sX2NtZGxpbmUtPnMpOwotICAgICAgaWYgKGV4cG9ydF9hbGwpCi0JewotICAgICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsICIgLS1leHBvcnQtYWxsIC0tZXhjbHVkZS1zeW1ib2w9Iik7Ci0gICAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgCi0JICAiX2N5Z3dpbl9kbGxfZW50cnlAMTIsRGxsTWFpbkNSVFN0YXJ0dXBAMTIsRGxsTWFpbkAxMixEbGxFbnRyeVBvaW50QDEyIik7Ci0JfQotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgIiAtLW91dHB1dC1kZWYgIik7Ci0gICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCBkZWZfZmlsZV9uYW1lKTsKLQotICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7ICsraSkKLQl7Ci0JICBpZiAoZHJpdmVyX2FyZ19pbmRpY2VzW2ldKQotCSAgICB7Ci0JICAgICAgY2hhciAqYXJnID0gc2F2ZWRfYXJndltpXTsKLQkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChhcmcpOwotCSAgICAgIGlmIChsZW4gPj0gMiAmJiBhcmdbbGVuLTJdID09ICcuJyAKLQkgICAgICAgICAgJiYgKGFyZ1tsZW4tMV0gPT0gJ28nIHx8IGFyZ1tsZW4tMV0gPT0gJ2EnKSkKLQkJewotCQkgIGludCBxdW90ZSA9IChzdHJjaHIgKGFyZywgJyAnKSB8fCBzdHJjaHIgKGFyZywgJ1x0JykpOwotCQkgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsCi0JCQkJICAgICAocXVvdGUpID8gIiBcIiIgOiAiICIpOwotCQkgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsIGFyZyk7Ci0JCSAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwKLQkJCQkgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChydW4gKGRsbHRvb2xfbmFtZSwgc3RlcF9wcmUxLT5zKSkKLQljbGVhbnVwX2FuZF9leGl0ICgxKTsKLSAgICAgIAotICAgICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXBfcHJlMSk7Ci0gICAgfQotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsICIgLS1kZWYgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIGRlZl9maWxlX25hbWUpOwotCi0gIGlmICh2ZXJib3NlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRMTFRPT0wgbmFtZSAgICA6ICVzXG4iLCBkbGx0b29sX25hbWUpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRExMVE9PTCBvcHRpb25zIDogJXNcbiIsIGRsbHRvb2xfY21kbGluZS0+cyk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJEUklWRVIgbmFtZSAgICAgOiAlc1xuIiwgZHJpdmVyX25hbWUpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRFJJVkVSIG9wdGlvbnMgIDogJXNcbiIsIGRyaXZlcl9jbWRsaW5lLT5zKTsKLSAgICB9Ci0gCi0gIC8qCi0gICAqIFN0ZXAgMS4gQ2FsbCBHQ0MvTEQgdG8gY3JlYXRlIGJhc2UgcmVsb2NhdGlvbiBmaWxlLiBJZiB1c2luZyBHQ0MsIHRoZQotICAgKiBkcml2ZXIgY29tbWFuZCBsaW5lIHdpbGwgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0gICAqICAgIAotICAgKiAgICAlIGdjYyAtV2wsLS1kbGwgLS1XbCwtLWJhc2UtZmlsZSxmb28uYmFzZSBbcmVzdCBvZiBjb21tYW5kIGxpbmVdCi0gICAqCi0gICAqIElmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgYSBiYXNlIG5hbWUsIGNyZWF0ZSB0ZW1wb3Jhcnkgb25lIHRoYXQKLSAgICogaXMgZGVsZXRlZCBhdCBleGl0LgotICAgKgotICAgKi8KLSAgCi0gIGlmICghIGJhc2VfZmlsZV9uYW1lKQotICAgIHsKLSAgICAgIGNoYXIgKmZpbGVwcmVmaXggPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotICAgICAgYmFzZV9maWxlX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGZpbGVwcmVmaXgpICsgNik7Ci0gICAgICBzcHJpbnRmIChiYXNlX2ZpbGVfbmFtZSwgIiVzLmJhc2UiLCAKLSAgICAgICAgICAgICAgIChkb250ZGVsdGVtcHMpID8gbXliYXNlbmFtZSAoZmlsZXByZWZpeCkgOiBmaWxlcHJlZml4KTsKLSAgICAgIGRlbGV0ZV9iYXNlX2ZpbGUgPSAxOwotICAgICAgZnJlZSAoZmlsZXByZWZpeCk7Ci0gICAgfQotICAKLSAgewotICAgIGludCBxdW90ZTsKLQotICAgIGR5bl9zdHJpbmdfdCBzdGVwMSA9IGR5bl9zdHJpbmdfbmV3IChkcml2ZXJfY21kbGluZS0+bGVuZ3RoIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoYmFzZV9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAxLCAiLVdsLC0tYmFzZS1maWxlLCIpOwotICAgIHF1b3RlID0gKHN0cmNociAoYmFzZV9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAxLCBiYXNlX2ZpbGVfbmFtZSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAxLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBpZiAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCkKLSAgICAgIHsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAxLCAiICIpOwotICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDEsIGRyaXZlcl9jbWRsaW5lLT5zKTsKLSAgICAgIH0KLQotICAgIGlmIChydW4gKGRyaXZlcl9uYW1lLCBzdGVwMS0+cykpCi0gICAgICBjbGVhbnVwX2FuZF9leGl0ICgxKTsKLSAgICAKLSAgICBkeW5fc3RyaW5nX2RlbGV0ZSAoc3RlcDEpOwotICB9Ci0KLQotCi0gIC8qCi0gICAqIFN0ZXAgMi4gZ2VuZXJhdGUgdGhlIGV4cCBmaWxlIGJ5IHJ1bm5pbmcgZGxsdG9vbC4gCi0gICAqIGRsbHRvb2wgY29tbWFuZCBsaW5lIHdpbGwgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0gICAqICAgIAotICAgKiAgICAlIGRsbHRvb2wgLVdsLC0tZGxsIC0tV2wsLS1iYXNlLWZpbGUsZm9vLmJhc2UgW3Jlc3Qgb2YgY29tbWFuZCBsaW5lXQotICAgKgotICAgKiBJZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGEgYmFzZSBuYW1lLCBjcmVhdGUgdGVtcG9yYXJ5IG9uZSB0aGF0Ci0gICAqIGlzIGRlbGV0ZWQgYXQgZXhpdC4KLSAgICoKLSAgICovCi0gIAotICBpZiAoISBleHBfZmlsZV9uYW1lKQotICAgIHsKLSAgICAgIGNoYXIgKnAgPSBzdHJyY2hyIChkbGxfbmFtZSwgJy4nKTsKLSAgICAgIHNpemVfdCBwcmVmaXhfbGVuID0gKHApID8gcCAtIGRsbF9uYW1lIDogc3RybGVuIChkbGxfbmFtZSk7Ci0gICAgICBleHBfZmlsZV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHJlZml4X2xlbiArIDQgKyAxKTsKLSAgICAgIHN0cm5jcHkgKGV4cF9maWxlX25hbWUsIGRsbF9uYW1lLCBwcmVmaXhfbGVuKTsKLSAgICAgIGV4cF9maWxlX25hbWVbcHJlZml4X2xlbl0gPSAnXDAnOwotICAgICAgc3RyY2F0IChleHBfZmlsZV9uYW1lLCAiLmV4cCIpOwotICAgICAgZGVsZXRlX2V4cF9maWxlID0gMTsKLSAgICB9Ci0gIAotICB7Ci0gICAgaW50IHF1b3RlOwotICAgIGR5bl9zdHJpbmdfdCBzdGVwMiA9IGR5bl9zdHJpbmdfbmV3IChkbGx0b29sX2NtZGxpbmUtPmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGJhc2VfZmlsZV9uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoZXhwX2ZpbGVfbmFtZSkKLQkJCQkgICAgICAgICArIDIwKTsKLQotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgIi0tYmFzZS1maWxlICIpOwotICAgIHF1b3RlID0gKHN0cmNociAoYmFzZV9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCBiYXNlX2ZpbGVfbmFtZSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiICIgOiAiICIpOwotCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCAiLS1vdXRwdXQtZXhwICIpOwotICAgIHF1b3RlID0gKHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJyAnKSAKLSAgICAgICAgICAgICB8fCBzdHJjaHIgKGV4cF9maWxlX25hbWUsICdcdCcpKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgZXhwX2ZpbGVfbmFtZSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQotICAgIGlmIChkbGx0b29sX2NtZGxpbmUtPmxlbmd0aCkKLSAgICAgIHsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCAiICIpOwotICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIGRsbHRvb2xfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkbGx0b29sX25hbWUsIHN0ZXAyLT5zKSkKLSAgICAgIGNsZWFudXBfYW5kX2V4aXQgKDEpOwotICAgIAotICAgIGR5bl9zdHJpbmdfZGVsZXRlIChzdGVwMik7Ci0gIH0KLQotICAvKgotICAgKiBTdGVwIDMuIENhbGwgR0NDL0xEIHRvIGFnYWluLCBhZGRpbmcgdGhlIGV4cCBmaWxlIHRoaXMgdGltZS4KLSAgICogZHJpdmVyIGNvbW1hbmQgbGluZSB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgotICAgKiAgICAKLSAgICogICAgJSBnY2MgLVdsLC0tZGxsIC0tV2wsLS1iYXNlLWZpbGUsZm9vLmJhc2UgZm9vLmV4cCBbcmVzdCAuLi5dCi0gICAqLwotCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0KLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDMgPSBkeW5fc3RyaW5nX25ldyAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChiYXNlX2ZpbGVfbmFtZSkKLQkJCQkgICAgICAgICArIDIwKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDMsICItV2wsLS1iYXNlLWZpbGUsIik7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJyAnKSAKLSAgICAgICAgICAgICB8fCBzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDMsIGJhc2VfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDMsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIgIiA6ICIgIik7Ci0KLSAgICBxdW90ZSA9IChzdHJjaHIgKGV4cF9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDMsIGV4cF9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0KLSAgICBpZiAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCkKLSAgICAgIHsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAiICIpOwotICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDMsIGRyaXZlcl9jbWRsaW5lLT5zKTsKLSAgICAgIH0KLQotICAgIGlmIChydW4gKGRyaXZlcl9uYW1lLCBzdGVwMy0+cykpCi0gICAgICBjbGVhbnVwX2FuZF9leGl0ICgxKTsKLSAgICAKLSAgICBkeW5fc3RyaW5nX2RlbGV0ZSAoc3RlcDMpOwotICB9Ci0KLQotICAvKgotICAgKiBTdGVwIDQuIFJ1biBETExUT09MIGFnYWluIHVzaW5nIHRoZSBzYW1lIGNvbW1hbmQgbGluZS4KLSAgICovCi0KLSAgewotICAgIGludCBxdW90ZTsKLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDQgPSBkeW5fc3RyaW5nX25ldyAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChiYXNlX2ZpbGVfbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0KLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICItLWJhc2UtZmlsZSAiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoYmFzZV9maWxlX25hbWUsICdcdCcpKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgYmFzZV9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiAiIDogIiAiKTsKLQotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgIi0tb3V0cHV0LWV4cCAiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGV4cF9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIGV4cF9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0KLSAgICBpZiAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCBkbGx0b29sX2NtZGxpbmUtPnMpOwotICAgICAgfQotCi0gICAgaWYgKG91dHB1dF9saWJfZmlsZV9uYW1lKQotICAgICAgewotICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICIgLS1vdXRwdXQtbGliICIpOwotICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIG91dHB1dF9saWJfZmlsZV9uYW1lKTsKLSAgICAgIH0KLQotICAgIGlmIChydW4gKGRsbHRvb2xfbmFtZSwgc3RlcDQtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXA0KTsKLSAgfQotICAKLQotICAvKgotICAgKiBTdGVwIDUuIExpbmsgaXQgYWxsIHRvZ2V0aGVyIGFuZCBiZSBkb25lIHdpdGggaXQuCi0gICAqIGRyaXZlciBjb21tYW5kIGxpbmUgd2lsbCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZzoKLSAgICogICAgCi0gICAqICAgICUgZ2NjIC1XbCwtLWRsbCBmb28uZXhwIFtyZXN0IC4uLl0KLSAgICoKLSAgICovCi0KLSAgewotICAgIGludCBxdW90ZTsKLQotICAgIGR5bl9zdHJpbmdfdCBzdGVwNSA9IGR5bl9zdHJpbmdfbmV3IChkcml2ZXJfY21kbGluZS0+bGVuZ3RoIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoZXhwX2ZpbGVfbmFtZSkKLQkJCQkgICAgICAgICArIDIwKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGV4cF9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDUsIGV4cF9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNSwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0KLSAgICBpZiAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCkKLSAgICAgIHsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCAiICIpOwotICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDUsIGRyaXZlcl9jbWRsaW5lLT5zKTsKLSAgICAgIH0KLQotICAgIGlmIChydW4gKGRyaXZlcl9uYW1lLCBzdGVwNS0+cykpCi0gICAgICBjbGVhbnVwX2FuZF9leGl0ICgxKTsKLSAgICAKLSAgICBkeW5fc3RyaW5nX2RlbGV0ZSAoc3RlcDUpOwotICB9Ci0KLSAgY2xlYW51cF9hbmRfZXhpdCAoMCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9keW4tc3RyaW5nLmMgYi9iaW51dGlscy9keW4tc3RyaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNjQwMTguLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZHluLXN0cmluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qIEFuIGFic3RyYWN0IHN0cmluZyBkYXRhdHlwZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcmsgTWl0Y2hlbGwgKG1hcmtAbWFya21pdGNoZWxsLmNvbSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLSAgIAotICAgR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGxpdmVzIGluIGF0IGxlYXN0IHR3byBwbGFjZXM6IGJpbnV0aWxzIGFuZCBnY2MuCi0gICBEb24ndCBjaGFuZ2Ugb25lIHdpdGhvdXQgdGhlIG90aGVyLiAgKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2lmZGVmIElOX0dDQwotI2luY2x1ZGUgInN5c3RlbS5oIgotI2luY2x1ZGUgImdhbnNpZGVjbC5oIgotI2Vsc2UKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2VuZGlmCi0jaW5jbHVkZSAiZHluLXN0cmluZy5oIgotCi1leHRlcm4gY2hhciAqeG1hbGxvYyAoKTsKLWV4dGVybiBjaGFyICp4cmVhbGxvYyAoKTsKLQotLyogQ3JlYXRlIGEgbmV3IGR5bmFtaWMgc3RyaW5nIGNhcGFibGUgb2YgaG9sZGluZyBhdCBsZWFzdCBTUEFDRQotICAgY2hhcmFjdGVycywgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBOVUwuICBJZiBTUEFDRSBpcyAwLCBpdAotICAgd2lsbCBiZSBzaWxlbnRseSBpbmNyZWFzZWQgdG8gMS4gICovCi0KLWR5bl9zdHJpbmdfdCAKLWR5bl9zdHJpbmdfbmV3IChzcGFjZSkKLSAgICAgaW50IHNwYWNlOwotewotICBkeW5fc3RyaW5nX3QgcmVzdWx0ID0gKGR5bl9zdHJpbmdfdCkgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZHluX3N0cmluZykpOwotIAotICBpZiAoc3BhY2UgPT0gMCkKLSAgICAvKiBXZSBuZWVkIGF0IGxlYXN0IG9uZSBieXRlIGluIHdoaWNoIHRvIHN0b3JlIHRoZSB0ZXJtaW5hdGluZwotICAgICAgIE5VTC4gICovCi0gICAgc3BhY2UgPSAxOwotCi0gIHJlc3VsdC0+YWxsb2NhdGVkID0gc3BhY2U7Ci0gIHJlc3VsdC0+cyA9IChjaGFyKikgeG1hbGxvYyAoc3BhY2UpOwotICByZXN1bHQtPmxlbmd0aCA9IDA7Ci0gIHJlc3VsdC0+c1swXSA9ICdcMCc7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogRnJlZSB0aGUgbWVtb3J5IHVzZWQgYnkgRFMuICAqLwotCi12b2lkIAotZHluX3N0cmluZ19kZWxldGUgKGRzKQotICAgICBkeW5fc3RyaW5nX3QgZHM7Ci17Ci0gIGZyZWUgKGRzLT5zKTsKLSAgZnJlZSAoZHMpOwotfQotCi0vKiBBcHBlbmQgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBTIHRvIERTLCByZXNpemluZyBEUyBpZgotICAgbmVjZXNzYXJ5LiAgKi8KLQotZHluX3N0cmluZ190IAotZHluX3N0cmluZ19hcHBlbmQgKGRzLCBzKQotICAgICBkeW5fc3RyaW5nX3QgZHM7Ci0gICAgIGNoYXIgKnM7Ci17Ci0gIGludCBsZW4gPSBzdHJsZW4gKHMpOwotICBkeW5fc3RyaW5nX3Jlc2l6ZSAoZHMsIGRzLT5sZW5ndGggKyBsZW4gKyAxIC8qICdcMCcgKi8pOwotICBzdHJjcHkgKGRzLT5zICsgZHMtPmxlbmd0aCwgcyk7Ci0gIGRzLT5sZW5ndGggKz0gbGVuOwotCi0gIHJldHVybiBkczsKLX0KLQotLyogSW5jcmVhc2UgdGhlIGNhcGFjaXR5IG9mIERTIHNvIHRoYXQgaXQgY2FuIGhvbGQgYXQgbGVhc3QgU1BBQ0UKLSAgIGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMLiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdAotICAgKGF0IHByZXNlbnQpIHJlZHVjZSB0aGUgY2FwYWNpdHkgb2YgRFMuICAqLwotCi1keW5fc3RyaW5nX3QgCi1keW5fc3RyaW5nX3Jlc2l6ZSAoZHMsIHNwYWNlKQotICAgICBkeW5fc3RyaW5nX3QgZHM7Ci0gICAgIGludCBzcGFjZTsKLXsKLSAgaW50IG5ld19hbGxvY2F0ZWQgPSBkcy0+YWxsb2NhdGVkOwotCi0gIHdoaWxlIChzcGFjZSA+IG5ld19hbGxvY2F0ZWQpCi0gICAgbmV3X2FsbG9jYXRlZCAqPSAyOwotICAgIAotICBpZiAobmV3X2FsbG9jYXRlZCAhPSBkcy0+YWxsb2NhdGVkKQotICAgIHsKLSAgICAgIC8qIFdlIGFjdHVhbGx5IG5lZWQgbW9yZSBzcGFjZS4gICovCi0gICAgICBkcy0+YWxsb2NhdGVkID0gbmV3X2FsbG9jYXRlZDsKLSAgICAgIGRzLT5zID0gKGNoYXIqKSB4cmVhbGxvYyAoZHMtPnMsIGRzLT5hbGxvY2F0ZWQpOwotICAgIH0KLQotICByZXR1cm4gZHM7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9keW4tc3RyaW5nLmggYi9iaW51dGlscy9keW4tc3RyaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZDI1YzMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZHluLXN0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogQW4gYWJzdHJhY3Qgc3RyaW5nIGRhdGF0eXBlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFyayBNaXRjaGVsbCAobWFya0BtYXJrbWl0Y2hlbGwuY29tKS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgotICAgCi0gICBHTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgbGl2ZXMgaW4gYXQgbGVhc3QgdHdvIHBsYWNlczogYmludXRpbHMgYW5kIGdjYy4KLSAgIERvbid0IGNoYW5nZSBvbmUgd2l0aG91dCB0aGUgb3RoZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdCBkeW5fc3RyaW5nCi17Ci0gIGludCBhbGxvY2F0ZWQ7IC8qIFRoZSBhbW91bnQgb2Ygc3BhY2UgYWxsb2NhdGVkIGZvciB0aGUgc3RyaW5nLiAgKi8KLSAgaW50IGxlbmd0aDsgLyogVGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIHN0cmluZy4gICovCi0gIGNoYXIgKnM7IC8qIFRoZSBzdHJpbmcgaXRzZWxmLCBOVUwtdGVybWluYXRlZC4gICovCi19KiBkeW5fc3RyaW5nX3Q7Ci0KLWV4dGVybiBkeW5fc3RyaW5nX3QgZHluX3N0cmluZ19uZXcgICAgICBQQVJBTVMoKGludCkpOwotZXh0ZXJuIHZvaWQgZHluX3N0cmluZ19kZWxldGUgICAgICAgICAgIFBBUkFNUygoZHluX3N0cmluZ190KSk7Ci1leHRlcm4gZHluX3N0cmluZ190IGR5bl9zdHJpbmdfYXBwZW5kICAgUEFSQU1TKChkeW5fc3RyaW5nX3QsIGNoYXIqKSk7Ci1leHRlcm4gZHluX3N0cmluZ190IGR5bl9zdHJpbmdfcmVzaXplICAgUEFSQU1TKChkeW5fc3RyaW5nX3QsIGludCkpOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZmlsZW1vZGUuYyBiL2JpbnV0aWxzL2ZpbGVtb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ODExYmMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZmlsZW1vZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKiBmaWxlbW9kZS5jIC0tIG1ha2UgYSBzdHJpbmcgZGVzY3JpYmluZyBmaWxlIG1vZGVzCi0gICBDb3B5cmlnaHQgKEMpIDE5ODUsIDkwLCA5MSwgOTQsIDk1LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLXN0YXRpYyBjaGFyIGZ0eXBlbGV0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHNldHN0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGNoYXIgKikpOwotCi0vKiBmaWxlbW9kZXN0cmluZyAtIGZpbGwgaW4gc3RyaW5nIFNUUiB3aXRoIGFuIGxzLXN0eWxlIEFTQ0lJCi0gICByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RfbW9kZSBmaWVsZCBvZiBmaWxlIHN0YXRzIGJsb2NrIFNUQVRQLgotICAgMTAgY2hhcmFjdGVycyBhcmUgc3RvcmVkIGluIFNUUjsgbm8gdGVybWluYXRpbmcgbnVsbCBpcyBhZGRlZC4KLSAgIFRoZSBjaGFyYWN0ZXJzIHN0b3JlZCBpbiBTVFIgYXJlOgotCi0gICAwCUZpbGUgdHlwZS4gICdkJyBmb3IgZGlyZWN0b3J5LCAnYycgZm9yIGNoYXJhY3RlcgotCXNwZWNpYWwsICdiJyBmb3IgYmxvY2sgc3BlY2lhbCwgJ20nIGZvciBtdWx0aXBsZXgsCi0JJ2wnIGZvciBzeW1ib2xpYyBsaW5rLCAncycgZm9yIHNvY2tldCwgJ3AnIGZvciBmaWZvLAotCSctJyBmb3IgYW55IG90aGVyIGZpbGUgdHlwZQotCi0gICAxCSdyJyBpZiB0aGUgb3duZXIgbWF5IHJlYWQsICctJyBvdGhlcndpc2UuCi0KLSAgIDIJJ3cnIGlmIHRoZSBvd25lciBtYXkgd3JpdGUsICctJyBvdGhlcndpc2UuCi0KLSAgIDMJJ3gnIGlmIHRoZSBvd25lciBtYXkgZXhlY3V0ZSwgJ3MnIGlmIHRoZSBmaWxlIGlzCi0Jc2V0LXVzZXItaWQsICctJyBvdGhlcndpc2UuCi0JJ1MnIGlmIHRoZSBmaWxlIGlzIHNldC11c2VyLWlkLCBidXQgdGhlIGV4ZWN1dGUKLQliaXQgaXNuJ3Qgc2V0LgotCi0gICA0CSdyJyBpZiBncm91cCBtZW1iZXJzIG1heSByZWFkLCAnLScgb3RoZXJ3aXNlLgotCi0gICA1CSd3JyBpZiBncm91cCBtZW1iZXJzIG1heSB3cml0ZSwgJy0nIG90aGVyd2lzZS4KLQotICAgNgkneCcgaWYgZ3JvdXAgbWVtYmVycyBtYXkgZXhlY3V0ZSwgJ3MnIGlmIHRoZSBmaWxlIGlzCi0Jc2V0LWdyb3VwLWlkLCAnLScgb3RoZXJ3aXNlLgotCSdTJyBpZiBpdCBpcyBzZXQtZ3JvdXAtaWQgYnV0IG5vdCBleGVjdXRhYmxlLgotCi0gICA3CSdyJyBpZiBhbnkgdXNlciBtYXkgcmVhZCwgJy0nIG90aGVyd2lzZS4KLQotICAgOAkndycgaWYgYW55IHVzZXIgbWF5IHdyaXRlLCAnLScgb3RoZXJ3aXNlLgotCi0gICA5CSd4JyBpZiBhbnkgdXNlciBtYXkgZXhlY3V0ZSwgJ3QnIGlmIHRoZSBmaWxlIGlzICJzdGlja3kiCi0JKHdpbGwgYmUgcmV0YWluZWQgaW4gc3dhcCBzcGFjZSBhZnRlciBleGVjdXRpb24pLCAnLScKLQlvdGhlcndpc2UuCi0JJ1QnIGlmIHRoZSBmaWxlIGlzIHN0aWNreSBidXQgbm90IGV4ZWN1dGFibGUuICovCi0KLSNpZiAwCi0KLS8qIFRoaXMgaXMgbm90IHVzZWQ7IG9ubHkgbW9kZV9zdHJpbmcgaXMgdXNlZC4gICovCi0KLXZvaWQKLWZpbGVtb2Rlc3RyaW5nIChzdGF0cCwgc3RyKQotICAgICBzdHJ1Y3Qgc3RhdCAqc3RhdHA7Ci0gICAgIGNoYXIgKnN0cjsKLXsKLSAgbW9kZV9zdHJpbmcgKCh1bnNpZ25lZCBsb25nKSBzdGF0cC0+c3RfbW9kZSwgc3RyKTsKLX0KLQotI2VuZGlmCi0KLS8qIEdldCBkZWZpbml0aW9ucyBmb3IgdGhlIGZpbGUgcGVybWlzc2lvbiBiaXRzLiAgKi8KLQotI2lmbmRlZiBTX0lSV1hVCi0jZGVmaW5lIFNfSVJXWFUgMDcwMAotI2VuZGlmCi0jaWZuZGVmIFNfSVJVU1IKLSNkZWZpbmUgU19JUlVTUiAwNDAwCi0jZW5kaWYKLSNpZm5kZWYgU19JV1VTUgotI2RlZmluZSBTX0lXVVNSIDAyMDAKLSNlbmRpZgotI2lmbmRlZiBTX0lYVVNSCi0jZGVmaW5lIFNfSVhVU1IgMDEwMAotI2VuZGlmCi0KLSNpZm5kZWYgU19JUldYRwotI2RlZmluZSBTX0lSV1hHIDAwNzAKLSNlbmRpZgotI2lmbmRlZiBTX0lSR1JQCi0jZGVmaW5lIFNfSVJHUlAgMDA0MAotI2VuZGlmCi0jaWZuZGVmIFNfSVdHUlAKLSNkZWZpbmUgU19JV0dSUCAwMDIwCi0jZW5kaWYKLSNpZm5kZWYgU19JWEdSUAotI2RlZmluZSBTX0lYR1JQIDAwMTAKLSNlbmRpZgotCi0jaWZuZGVmIFNfSVJXWE8KLSNkZWZpbmUgU19JUldYTyAwMDA3Ci0jZW5kaWYKLSNpZm5kZWYgU19JUk9USAotI2RlZmluZSBTX0lST1RIIDAwMDQKLSNlbmRpZgotI2lmbmRlZiBTX0lXT1RICi0jZGVmaW5lIFNfSVdPVEggMDAwMgotI2VuZGlmCi0jaWZuZGVmIFNfSVhPVEgKLSNkZWZpbmUgU19JWE9USCAwMDAxCi0jZW5kaWYKLQotLyogTGlrZSBmaWxlbW9kZXN0cmluZywgYnV0IG9ubHkgdGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIGBzdHJ1Y3Qgc3RhdCcKLSAgIGlzIGdpdmVuIGFzIGFuIGFyZ3VtZW50LiAqLwotCi12b2lkCi1tb2RlX3N0cmluZyAobW9kZSwgc3RyKQotICAgICB1bnNpZ25lZCBsb25nIG1vZGU7Ci0gICAgIGNoYXIgKnN0cjsKLXsKLSAgc3RyWzBdID0gZnR5cGVsZXQgKCh1bnNpZ25lZCBsb25nKSBtb2RlKTsKLSAgc3RyWzFdID0gKG1vZGUgJiBTX0lSVVNSKSAhPSAwID8gJ3InIDogJy0nOwotICBzdHJbMl0gPSAobW9kZSAmIFNfSVdVU1IpICE9IDAgPyAndycgOiAnLSc7Ci0gIHN0clszXSA9IChtb2RlICYgU19JWFVTUikgIT0gMCA/ICd4JyA6ICctJzsKLSAgc3RyWzRdID0gKG1vZGUgJiBTX0lSR1JQKSAhPSAwID8gJ3InIDogJy0nOwotICBzdHJbNV0gPSAobW9kZSAmIFNfSVdHUlApICE9IDAgPyAndycgOiAnLSc7Ci0gIHN0cls2XSA9IChtb2RlICYgU19JWEdSUCkgIT0gMCA/ICd4JyA6ICctJzsKLSAgc3RyWzddID0gKG1vZGUgJiBTX0lST1RIKSAhPSAwID8gJ3InIDogJy0nOwotICBzdHJbOF0gPSAobW9kZSAmIFNfSVdPVEgpICE9IDAgPyAndycgOiAnLSc7Ci0gIHN0cls5XSA9IChtb2RlICYgU19JWE9USCkgIT0gMCA/ICd4JyA6ICctJzsKLSAgc2V0c3QgKCh1bnNpZ25lZCBsb25nKSBtb2RlLCBzdHIpOwotfQotCi0vKiBSZXR1cm4gYSBjaGFyYWN0ZXIgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBmaWxlIGRlc2NyaWJlZCBieQotICAgZmlsZSBtb2RlIEJJVFM6Ci0gICAnZCcgZm9yIGRpcmVjdG9yaWVzCi0gICAnYicgZm9yIGJsb2NrIHNwZWNpYWwgZmlsZXMKLSAgICdjJyBmb3IgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZXMKLSAgICdtJyBmb3IgbXVsdGlwbGV4b3IgZmlsZXMKLSAgICdsJyBmb3Igc3ltYm9saWMgbGlua3MKLSAgICdzJyBmb3Igc29ja2V0cwotICAgJ3AnIGZvciBmaWZvcwotICAgJy0nIGZvciBhbnkgb3RoZXIgZmlsZSB0eXBlLiAqLwotCi0jaWZuZGVmIFNfSVNESVIKLSNpZmRlZiBTX0lGRElSCi0jZGVmaW5lIFNfSVNESVIoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZESVIpCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZESVIpICovCi0jZGVmaW5lIFNfSVNESVIoaSkgKCgoaSkgJiAwMTcwMDAwKSA9PSAwNDAwMDApCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGRElSKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JU0RJUikgKi8KLQotI2lmbmRlZiBTX0lTQkxLCi0jaWZkZWYgU19JRkJMSwotI2RlZmluZSBTX0lTQkxLKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGQkxLKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGQkxLKSAqLwotI2RlZmluZSBTX0lTQkxLKGkpIDAKLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSUZCTEspICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lTQkxLKSAqLwotCi0jaWZuZGVmIFNfSVNDSFIKLSNpZmRlZiBTX0lGQ0hSCi0jZGVmaW5lIFNfSVNDSFIoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZDSFIpCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZDSFIpICovCi0jZGVmaW5lIFNfSVNDSFIoaSkgMAotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRkNIUikgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNDSFIpICovCi0KLSNpZm5kZWYgU19JU0ZJRk8KLSNpZmRlZiBTX0lGSUZPCi0jZGVmaW5lIFNfSVNGSUZPKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGSUZPKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGSUZPKSAqLwotI2RlZmluZSBTX0lTRklGTyhpKSAwCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGSUZPKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JU0ZJRk8pICovCi0KLSNpZm5kZWYgU19JU1NPQ0sKLSNpZmRlZiBTX0lGU09DSwotI2RlZmluZSBTX0lTU09DSyhpKSAoKChpKSAmIFNfSUZNVCkgPT0gU19JRlNPQ0spCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZTT0NLKSAqLwotI2RlZmluZSBTX0lTU09DSyhpKSAwCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGU09DSykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNTT0NLKSAqLwotCi0jaWZuZGVmIFNfSVNMTksKLSNpZmRlZiBTX0lGTE5LCi0jZGVmaW5lIFNfSVNMTksoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZMTkspCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZMTkspICovCi0jZGVmaW5lIFNfSVNMTksoaSkgMAotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRkxOSykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNMTkspICovCi0KLXN0YXRpYyBjaGFyCi1mdHlwZWxldCAoYml0cykKLSAgICAgdW5zaWduZWQgbG9uZyBiaXRzOwotewotICBpZiAoU19JU0RJUiAoYml0cykpCi0gICAgcmV0dXJuICdkJzsKLSAgaWYgKFNfSVNMTksgKGJpdHMpKQotICAgIHJldHVybiAnbCc7Ci0gIGlmIChTX0lTQkxLIChiaXRzKSkKLSAgICByZXR1cm4gJ2InOwotICBpZiAoU19JU0NIUiAoYml0cykpCi0gICAgcmV0dXJuICdjJzsKLSAgaWYgKFNfSVNTT0NLIChiaXRzKSkKLSAgICByZXR1cm4gJ3MnOwotICBpZiAoU19JU0ZJRk8gKGJpdHMpKQotICAgIHJldHVybiAncCc7Ci0KLSNpZmRlZiBTX0lGTVQKLSNpZmRlZiBTX0lGTVBDCi0gIGlmICgoYml0cyAmIFNfSUZNVCkgPT0gU19JRk1QQwotICAgICAgfHwgKGJpdHMgJiBTX0lGTVQpID09IFNfSUZNUEIpCi0gICAgcmV0dXJuICdtJzsKLSNlbmRpZgotI2lmZGVmIFNfSUZOV0sKLSAgaWYgKChiaXRzICYgU19JRk1UKSA9PSBTX0lGTldLKQotICAgIHJldHVybiAnbic7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIHJldHVybiAnLSc7Ci19Ci0KLS8qIFNldCB0aGUgJ3MnIGFuZCAndCcgZmxhZ3MgaW4gZmlsZSBhdHRyaWJ1dGVzIHN0cmluZyBDSEFSUywKLSAgIGFjY29yZGluZyB0byB0aGUgZmlsZSBtb2RlIEJJVFMuICovCi0KLXN0YXRpYyB2b2lkCi1zZXRzdCAoYml0cywgY2hhcnMpCi0gICAgIHVuc2lnbmVkIGxvbmcgYml0cyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjaGFyICpjaGFycyBBVFRSSUJVVEVfVU5VU0VEOwotewotI2lmZGVmIFNfSVNVSUQKLSAgaWYgKGJpdHMgJiBTX0lTVUlEKQotICAgIHsKLSAgICAgIGlmIChjaGFyc1szXSAhPSAneCcpCi0JLyogU2V0LXVpZCwgYnV0IG5vdCBleGVjdXRhYmxlIGJ5IG93bmVyLiAqLwotCWNoYXJzWzNdID0gJ1MnOwotICAgICAgZWxzZQotCWNoYXJzWzNdID0gJ3MnOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIFNfSVNHSUQKLSAgaWYgKGJpdHMgJiBTX0lTR0lEKQotICAgIHsKLSAgICAgIGlmIChjaGFyc1s2XSAhPSAneCcpCi0JLyogU2V0LWdpZCwgYnV0IG5vdCBleGVjdXRhYmxlIGJ5IGdyb3VwLiAqLwotCWNoYXJzWzZdID0gJ1MnOwotICAgICAgZWxzZQotCWNoYXJzWzZdID0gJ3MnOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIFNfSVNWVFgKLSAgaWYgKGJpdHMgJiBTX0lTVlRYKQotICAgIHsKLSAgICAgIGlmIChjaGFyc1s5XSAhPSAneCcpCi0JLyogU3RpY2t5LCBidXQgbm90IGV4ZWN1dGFibGUgYnkgb3RoZXJzLiAqLwotCWNoYXJzWzldID0gJ1QnOwotICAgICAgZWxzZQotCWNoYXJzWzldID0gJ3QnOwotICAgIH0KLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvaWVlZS5jIGIvYmludXRpbHMvaWVlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDM2OTI4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2llZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDc2MDkgKzAsMCBAQAotLyogaWVlZS5jIC0tIFJlYWQgYW5kIHdyaXRlIElFRUUtNjk1IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgcmVhZHMgYW5kIHdyaXRlcyBJRUVFLTY5NSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImllZWUuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGFuIGVudHJ5IG9uIHRoZSBibG9jayBzdGFjay4gICovCi0KLXN0cnVjdCBpZWVlX2Jsb2NrCi17Ci0gIC8qIFRoZSBraW5kIG9mIGJsb2NrLiAgKi8KLSAgaW50IGtpbmQ7Ci0gIC8qIFRoZSBzb3VyY2UgZmlsZSBuYW1lLCBmb3IgYSBCQjUgYmxvY2suICAqLwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgLyogVGhlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiB0eXBlLCBmb3IgYSBCQjQgb3IgQkI2IGJsb2NrLiAgKi8KLSAgdW5zaWduZWQgaW50IGZuaW5keDsKLSAgLyogVHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIHNraXBwZWQuICAqLwotICBib29sZWFuIHNraXA7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgYmxvY2sgc3RhY2suICAqLwotCi0jZGVmaW5lIEJMT0NLU1RBQ0tfU0laRSAoMTYpCi0KLXN0cnVjdCBpZWVlX2Jsb2Nrc3RhY2sKLXsKLSAgLyogVGhlIHN0YWNrIHBvaW50ZXIuICAqLwotICBzdHJ1Y3QgaWVlZV9ibG9jayAqYnNwOwotICAvKiBUaGUgc3RhY2suICAqLwotICBzdHJ1Y3QgaWVlZV9ibG9jayBzdGFja1tCTE9DS1NUQUNLX1NJWkVdOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgdmFyaWFibGUuICAqLwotCi1zdHJ1Y3QgaWVlZV92YXIKLXsKLSAgLyogU3RhcnQgb2YgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIExlbmd0aCBvZiBuYW1lLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0gIC8qIFR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFNsb3QgaWYgd2UgbWFrZSBhbiBpbmRpcmVjdCB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSAqcHNsb3Q7Ci0gIC8qIEtpbmQgb2YgdmFyaWFibGUgb3IgZnVuY3Rpb24uICAqLwotICBlbnVtCi0gICAgewotICAgICAgSUVFRV9VTktOT1dOLAotICAgICAgSUVFRV9FWFRFUk5BTCwKLSAgICAgIElFRUVfR0xPQkFMLAotICAgICAgSUVFRV9TVEFUSUMsCi0gICAgICBJRUVFX0xPQ0FMLAotICAgICAgSUVFRV9GVU5DVElPTgotICAgIH0ga2luZDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGFsbCB0aGUgdmFyaWFibGVzLiAgKi8KLQotc3RydWN0IGllZWVfdmFycwotewotICAvKiBOdW1iZXIgb2Ygc2xvdHMgYWxsb2NhdGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IGFsbG9jOwotICAvKiBWYXJpYWJsZXMuICAqLwotICBzdHJ1Y3QgaWVlZV92YXIgKnZhcnM7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYSB0eXBlLiAgV2UgbmVlZCB0aGlzIGJlY2F1c2UKLSAgIHdlIGRvbid0IHdhbnQgdG8gcmVwcmVzZW50IGJpdGZpZWxkcyBhcyByZWFsIHR5cGVzLiAgKi8KLQotc3RydWN0IGllZWVfdHlwZQotewotICAvKiBUeXBlLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBTbG90IGlmIHRoaXMgaXMgdHlwZSBpcyByZWZlcmVuY2VkIGJlZm9yZSBpdCBpcyBkZWZpbmVkLiAgKi8KLSAgZGVidWdfdHlwZSAqcHNsb3Q7Ci0gIC8qIFNsb3RzIGZvciBhcmd1bWVudHMgaWYgd2UgbWFrZSBpbmRpcmVjdCB0eXBlcyBmb3IgdGhlbS4gICovCi0gIGRlYnVnX3R5cGUgKmFyZ19zbG90czsKLSAgLyogSWYgdGhpcyBpcyBhIGJpdGZpZWxkLCB0aGlzIGlzIHRoZSBzaXplIGluIGJpdHMuICBJZiB0aGlzIGlzIG5vdAotICAgICBhIGJpdGZpZWxkLCB0aGlzIGlzIHplcm8uICAqLwotICB1bnNpZ25lZCBsb25nIGJpdHNpemU7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbGwgdGhlIHR5cGUgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgaWVlZV90eXBlcwotewotICAvKiBOdW1iZXIgb2Ygc2xvdHMgYWxsb2NhdGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IGFsbG9jOwotICAvKiBUeXBlcy4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGUgKnR5cGVzOwotICAvKiBCdWlsdGluIHR5cGVzLiAgKi8KLSNkZWZpbmUgQlVJTFRJTl9UWVBFX0NPVU5UICg2MCkKLSAgZGVidWdfdHlwZSBidWlsdGluc1tCVUlMVElOX1RZUEVfQ09VTlRdOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYSBsaW5rZWQgbGFzdCBvZiBzdHJ1Y3RzIHdpdGggdGhlaXIgdGFnIG5hbWVzLAotICAgc28gdGhhdCB3ZSBjYW4gY29udmVydCB0aGVtIHRvIEMrKyBjbGFzc2VzIGlmIG5lY2Vzc2FyeS4gICovCi0KLXN0cnVjdCBpZWVlX3RhZwotewotICAvKiBOZXh0IHRhZy4gICovCi0gIHN0cnVjdCBpZWVlX3RhZyAqbmV4dDsKLSAgLyogVGhpcyB0YWcgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFRoZSB0eXBlIG9mIHRoZSB0YWcuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFRoZSB0YWdnZWQgdHlwZSBpcyBhbiBpbmRpcmVjdCB0eXBlIHBvaW50aW5nIGF0IHRoaXMgc2xvdC4gICovCi0gIGRlYnVnX3R5cGUgc2xvdDsKLSAgLyogVGhpcyBpcyBhbiBhcnJheSBvZiBzbG90cyB1c2VkIHdoZW4gYSBmaWVsZCB0eXBlIGlzIGNvbnZlcnRlZAotICAgICBpbnRvIGEgaW5kaXJlY3QgdHlwZSwgaW4gY2FzZSBpdCBuZWVkcyB0byBiZSBsYXRlciBjb252ZXJ0ZWQgaW50bwotICAgICBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSAqZnNsb3RzOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIHdlIHBhc3MgYXJvdW5kIHRvIHRoZSBwYXJzaW5nCi0gICBmdW5jdGlvbnMuICAqLwotCi1zdHJ1Y3QgaWVlZV9pbmZvCi17Ci0gIC8qIFRoZSBkZWJ1Z2dpbmcgaGFuZGxlLiAgKi8KLSAgUFRSIGRoYW5kbGU7Ci0gIC8qIFRoZSBCRkQuICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIFRoZSBzdGFydCBvZiB0aGUgYnl0ZXMgdG8gYmUgcGFyc2VkLiAgKi8KLSAgY29uc3QgYmZkX2J5dGUgKmJ5dGVzOwotICAvKiBUaGUgZW5kIG9mIHRoZSBieXRlcyB0byBiZSBwYXJzZWQuICAqLwotICBjb25zdCBiZmRfYnl0ZSAqcGVuZDsKLSAgLyogVGhlIGJsb2NrIHN0YWNrLiAgKi8KLSAgc3RydWN0IGllZWVfYmxvY2tzdGFjayBibG9ja3N0YWNrOwotICAvKiBXaGV0aGVyIHdlIGhhdmUgc2VlbiBhIEJCMSBvciBCQjIuICAqLwotICBib29sZWFuIHNhd19maWxlbmFtZTsKLSAgLyogVGhlIHZhcmlhYmxlcy4gICovCi0gIHN0cnVjdCBpZWVlX3ZhcnMgdmFyczsKLSAgLyogVGhlIGdsb2JhbCB2YXJpYWJsZXMsIGFmdGVyIGEgZ2xvYmFsIHR5cGVkZWYgYmxvY2suICAqLwotICBzdHJ1Y3QgaWVlZV92YXJzICpnbG9iYWxfdmFyczsKLSAgLyogVGhlIHR5cGVzLiAgKi8KLSAgc3RydWN0IGllZWVfdHlwZXMgdHlwZXM7Ci0gIC8qIFRoZSBnbG9iYWwgdHlwZXMsIGFmdGVyIGEgZ2xvYmFsIHR5cGVkZWYgYmxvY2suICAqLwotICBzdHJ1Y3QgaWVlZV90eXBlcyAqZ2xvYmFsX3R5cGVzOwotICAvKiBUaGUgbGlzdCBvZiB0YWdnZWQgc3RydWN0cy4gICovCi0gIHN0cnVjdCBpZWVlX3RhZyAqdGFnczsKLX07Ci0KLS8qIEJhc2ljIGJ1aWx0aW4gdHlwZXMsIG5vdCBpbmNsdWRpbmcgdGhlIHBvaW50ZXJzLiAgKi8KLQotZW51bSBidWlsdGluX3R5cGVzCi17Ci0gIGJ1aWx0aW5fdW5rbm93biA9IDAsCi0gIGJ1aWx0aW5fdm9pZCA9IDEsCi0gIGJ1aWx0aW5fc2lnbmVkX2NoYXIgPSAyLAotICBidWlsdGluX3Vuc2lnbmVkX2NoYXIgPSAzLAotICBidWlsdGluX3NpZ25lZF9zaG9ydF9pbnQgPSA0LAotICBidWlsdGluX3Vuc2lnbmVkX3Nob3J0X2ludCA9IDUsCi0gIGJ1aWx0aW5fc2lnbmVkX2xvbmcgPSA2LAotICBidWlsdGluX3Vuc2lnbmVkX2xvbmcgPSA3LAotICBidWlsdGluX3NpZ25lZF9sb25nX2xvbmcgPSA4LAotICBidWlsdGluX3Vuc2lnbmVkX2xvbmdfbG9uZyA9IDksCi0gIGJ1aWx0aW5fZmxvYXQgPSAxMCwKLSAgYnVpbHRpbl9kb3VibGUgPSAxMSwKLSAgYnVpbHRpbl9sb25nX2RvdWJsZSA9IDEyLAotICBidWlsdGluX2xvbmdfbG9uZ19kb3VibGUgPSAxMywKLSAgYnVpbHRpbl9xdW90ZWRfc3RyaW5nID0gMTQsCi0gIGJ1aWx0aW5faW5zdHJ1Y3Rpb25fYWRkcmVzcyA9IDE1LAotICBidWlsdGluX2ludCA9IDE2LAotICBidWlsdGluX3Vuc2lnbmVkID0gMTcsCi0gIGJ1aWx0aW5fdW5zaWduZWRfaW50ID0gMTgsCi0gIGJ1aWx0aW5fY2hhciA9IDE5LAotICBidWlsdGluX2xvbmcgPSAyMCwKLSAgYnVpbHRpbl9zaG9ydCA9IDIxLAotICBidWlsdGluX3Vuc2lnbmVkX3Nob3J0ID0gMjIsCi0gIGJ1aWx0aW5fc2hvcnRfaW50ID0gMjMsCi0gIGJ1aWx0aW5fc2lnbmVkX3Nob3J0ID0gMjQsCi0gIGJ1aWx0aW5fYmNkX2Zsb2F0ID0gMjUKLX07Ci0KLS8qIFRoZXNlIGFyZSB0aGUgdmFsdWVzIGZvdW5kIGluIHRoZSBkZXJpdmF0aW9uIGZsYWdzIG9mIGEgJ2InCi0gICBjb21wb25lbnQgcmVjb3JkIG9mIGEgJ1QnIHR5cGUgZXh0ZW5zaW9uIHJlY29yZCBpbiBhIEMrKyBwbWlzYwotICAgcmVjb3JkLiAgVGhlc2UgYXJlIGJpdG1hc2tzLiAgKi8KLQotLyogU2V0IGZvciBhIHByaXZhdGUgYmFzZSBjbGFzcywgY2xlYXIgZm9yIGEgcHVibGljIGJhc2UgY2xhc3MuCi0gICBQcm90ZWN0ZWQgYmFzZSBjbGFzc2VzIGFyZSBub3Qgc3VwcG9ydGVkLiAgKi8KLSNkZWZpbmUgQkFTRUZMQUdTX1BSSVZBVEUgKDB4MSkKLS8qIFNldCBmb3IgYSB2aXJ0dWFsIGJhc2UgY2xhc3MuICAqLwotI2RlZmluZSBCQVNFRkxBR1NfVklSVFVBTCAoMHgyKQotLyogU2V0IGZvciBhIGZyaWVuZCBjbGFzcywgY2xlYXIgZm9yIGEgYmFzZSBjbGFzcy4gICovCi0jZGVmaW5lIEJBU0VGTEFHU19GUklFTkQgKDB4MTApCi0KLS8qIFRoZXNlIGFyZSB0aGUgdmFsdWVzIGZvdW5kIGluIHRoZSBzcGVjcyBmbGFncyBvZiBhICdkJywgJ20nLCBvciAndicKLSAgIGNvbXBvbmVudCByZWNvcmQgb2YgYSAnVCcgdHlwZSBleHRlbnNpb24gcmVjb3JkIGluIGEgQysrIHBtaXNjCi0gICByZWNvcmQuICBUaGUgc2FtZSBmbGFncyBhcmUgdXNlZCBmb3IgYSAnTScgcmVjb3JkIGluIGEgQysrIHBtaXNjCi0gICByZWNvcmQuICAqLwotCi0vKiBUaGUgbG93ZXIgdHdvIGJpdHMgaG9sZCB2aXNpYmlsaXR5IGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfVklTSUJJTElUWSAoMHgzKQotLyogVGhpcyB2YWx1ZSBpbiB0aGUgbG93ZXIgdHdvIGJpdHMgaW5kaWNhdGVzIGEgcHVibGljIG1lbWJlci4gICovCi0jZGVmaW5lIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFVCTElDICgweDApCi0vKiBUaGlzIHZhbHVlIGluIHRoZSBsb3dlciB0d28gYml0cyBpbmRpY2F0ZXMgYSBwcml2YXRlIG1lbWJlci4gICovCi0jZGVmaW5lIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJJVkFURSAoMHgxKQotLyogVGhpcyB2YWx1ZSBpbiB0aGUgbG93ZXIgdHdvIGJpdHMgaW5kaWNhdGVzIGEgcHJvdGVjdGVkIG1lbWJlci4gICovCi0jZGVmaW5lIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJPVEVDVEVEICgweDIpCi0vKiBTZXQgZm9yIGEgc3RhdGljIG1lbWJlci4gICovCi0jZGVmaW5lIENYWEZMQUdTX1NUQVRJQyAoMHg0KQotLyogU2V0IGZvciBhIHZpcnR1YWwgb3ZlcnJpZGUuICAqLwotI2RlZmluZSBDWFhGTEFHU19PVkVSUklERSAoMHg4KQotLyogU2V0IGZvciBhIGZyaWVuZCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIENYWEZMQUdTX0ZSSUVORCAoMHgxMCkKLS8qIFNldCBmb3IgYSBjb25zdCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIENYWEZMQUdTX0NPTlNUICgweDIwKQotLyogU2V0IGZvciBhIHZvbGF0aWxlIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfVk9MQVRJTEUgKDB4NDApCi0vKiBTZXQgZm9yIGFuIG92ZXJsb2FkZWQgZnVuY3Rpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19PVkVSTE9BREVEICgweDgwKQotLyogU2V0IGZvciBhbiBvcGVyYXRvciBmdW5jdGlvbi4gICovCi0jZGVmaW5lIENYWEZMQUdTX09QRVJBVE9SICgweDEwMCkKLS8qIFNldCBmb3IgYSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfQ1RPUkRUT1IgKDB4NDAwKQotLyogU2V0IGZvciBhIGNvbnN0cnVjdG9yLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfQ1RPUiAoMHgyMDApCi0vKiBTZXQgZm9yIGFuIGlubGluZSBmdW5jdGlvbi4gICovCi0jZGVmaW5lIENYWEZMQUdTX0lOTElORSAoMHg4MDApCi0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIGllZWVfZXJyb3IKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGllZWVfZW9mIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKikpOwotc3RhdGljIGNoYXIgKnNhdmVzdHJpbmcgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfbnVtYmVyCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX29wdGlvbmFsX251bWJlcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBiZmRfdm1hICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX2lkCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGNvbnN0IGNoYXIgKiosCi0JICAgdW5zaWduZWQgbG9uZyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfb3B0aW9uYWxfaWQKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgY29uc3QgY2hhciAqKiwKLQkgICB1bnNpZ25lZCBsb25nICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX2V4cHJlc3Npb24KLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBpZWVlX2J1aWx0aW5fdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9hbGxvY190eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgdW5zaWduZWQgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfdHlwZV9pbmRleAotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBkZWJ1Z190eXBlICopKTsKLXN0YXRpYyBpbnQgaWVlZV9yZWdub190b19nZW5yZWcgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGludCBpZWVlX2dlbnJlZ190b19yZWdubyBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9pZWVlX2JiIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX2llZWVfYmUgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2VfaWVlZV9ubiBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9pZWVlX3R5IFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX2llZWVfYXRuIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9jeHhfbWlzYwotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfY3h4X2NsYXNzCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9jeHhfZGVmYXVsdHMKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX3JlZmVyZW5jZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlcXVpcmVfYXNuCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZXF1aXJlX2F0bjY1Ci0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGNvbnN0IGNoYXIgKiosCi0JICAgdW5zaWduZWQgbG9uZyAqKSk7Ci0KLS8qIFJlcG9ydCBhbiBlcnJvciBpbiB0aGUgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotaWVlZV9lcnJvciAoaW5mbywgcCwgcykKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKnA7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IDB4JWx4OiAlcyAoMHgleClcbiIsIGJmZF9nZXRfZmlsZW5hbWUgKGluZm8tPmFiZmQpLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpIChwIC0gaW5mby0+Ynl0ZXMpLCBzLCAqcCk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIGJmZF9nZXRfZmlsZW5hbWUgKGluZm8tPmFiZmQpLCBzKTsKLX0KLQotLyogUmVwb3J0IGFuIHVuZXhwZWN0ZWQgRU9GIGluIHRoZSBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1pZWVlX2VvZiAoaW5mbykKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLXsKLSAgaWVlZV9lcnJvciAoaW5mbywgKGNvbnN0IGJmZF9ieXRlICopIE5VTEwsCi0JICAgICAgXygidW5leHBlY3RlZCBlbmQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIikpOwotfQotCi0vKiBTYXZlIGEgc3RyaW5nIGluIG1lbW9yeS4gICovCi0KLXN0YXRpYyBjaGFyICoKLXNhdmVzdHJpbmcgKHN0YXJ0LCBsZW4pCi0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0OwotICAgICB1bnNpZ25lZCBsb25nIGxlbjsKLXsKLSAgY2hhciAqcmV0OwotCi0gIHJldCA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOwotICBtZW1jcHkgKHJldCwgc3RhcnQsIGxlbik7Ci0gIHJldFtsZW5dID0gJ1wwJzsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUmVhZCBhIG51bWJlciB3aGljaCBtdXN0IGJlIHByZXNlbnQgaW4gYW4gSUVFRSBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCBwdikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgYmZkX3ZtYSAqcHY7Ci17Ci0gIHJldHVybiBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgcHYsIChib29sZWFuICopIE5VTEwpOwotfQotCi0vKiBSZWFkIGEgbnVtYmVyIGluIGFuIElFRUUgZmlsZS4gIElmIHBwcmVzZW50IGlzIG5vdCBOVUxMLCB0aGUgbnVtYmVyCi0gICBuZWVkIG5vdCBiZSB0aGVyZS4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCBwdiwgcHByZXNlbnQpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIGJmZF92bWEgKnB2OwotICAgICBib29sZWFuICpwcHJlc2VudDsKLXsKLSAgaWVlZV9yZWNvcmRfZW51bV90eXBlIGI7Ci0KLSAgaWYgKCpwcCA+PSBpbmZvLT5wZW5kKQotICAgIHsKLSAgICAgIGlmIChwcHJlc2VudCAhPSBOVUxMKQotCXsKLQkgICpwcHJlc2VudCA9IGZhbHNlOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgaWVlZV9lb2YgKGluZm8pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcDsKLSAgKysqcHA7Ci0KLSAgaWYgKGIgPD0gaWVlZV9udW1iZXJfZW5kX2VudW0pCi0gICAgewotICAgICAgKnB2ID0gKGJmZF92bWEpIGI7Ci0gICAgICBpZiAocHByZXNlbnQgIT0gTlVMTCkKLQkqcHByZXNlbnQgPSB0cnVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChiID49IGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtICYmIGIgPD0gaWVlZV9udW1iZXJfcmVwZWF0X2VuZF9lbnVtKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBpID0gKGludCkgYiAtIChpbnQpIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtOwotICAgICAgaWYgKCpwcCArIGkgLSAxID49IGluZm8tPnBlbmQpCi0JewotCSAgaWVlZV9lb2YgKGluZm8pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgKnB2ID0gMDsKLSAgICAgIGZvciAoOyBpID4gMDsgaS0tKQotCXsKLQkgICpwdiA8PD0gODsKLQkgICpwdiArPSAqKnBwOwotCSAgKysqcHA7Ci0JfQotCi0gICAgICBpZiAocHByZXNlbnQgIT0gTlVMTCkKLQkqcHByZXNlbnQgPSB0cnVlOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCi0gICAgewotICAgICAgLS0qcHA7Ci0gICAgICAqcHByZXNlbnQgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZWVlX2Vycm9yIChpbmZvLCAqcHAgLSAxLCBfKCJpbnZhbGlkIG51bWJlciIpKTsKLSAgcmV0dXJuIGZhbHNlOyAgCi19Ci0KLS8qIFJlYWQgYSByZXF1aXJlZCBzdHJpbmcgZnJvbSBhbiBJRUVFIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX2lkIChpbmZvLCBwcCwgcG5hbWUsIHBuYW1sZW4pCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIGNvbnN0IGNoYXIgKipwbmFtZTsKLSAgICAgdW5zaWduZWQgbG9uZyAqcG5hbWxlbjsKLXsKLSAgcmV0dXJuIGllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsIHBuYW1lLCBwbmFtbGVuLCAoYm9vbGVhbiAqKSBOVUxMKTsKLX0KLQotLyogUmVhZCBhIHN0cmluZyBmcm9tIGFuIElFRUUgZmlsZS4gIElmIHBwcmVzZW50IGlzIG5vdCBOVUxMLCB0aGUKLSAgIHN0cmluZyBpcyBvcHRpb25hbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCBwbmFtZSwgcG5hbWxlbiwgcHByZXNlbnQpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIGNvbnN0IGNoYXIgKipwbmFtZTsKLSAgICAgdW5zaWduZWQgbG9uZyAqcG5hbWxlbjsKLSAgICAgYm9vbGVhbiAqcHByZXNlbnQ7Ci17Ci0gIGJmZF9ieXRlIGI7Ci0gIHVuc2lnbmVkIGxvbmcgbGVuOwotCi0gIGlmICgqcHAgPj0gaW5mby0+cGVuZCkKLSAgICB7Ci0gICAgICBpZWVlX2VvZiAoaW5mbyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGIgPSAqKnBwOwotICArKypwcDsKLQotICBpZiAoYiA8PSAweDdmKQotICAgIGxlbiA9IGI7Ci0gIGVsc2UgaWYgKChpZWVlX3JlY29yZF9lbnVtX3R5cGUpIGIgPT0gaWVlZV9leHRlbnNpb25fbGVuZ3RoXzFfZW51bSkKLSAgICB7Ci0gICAgICBsZW4gPSAqKnBwOwotICAgICAgKysqcHA7Ci0gICAgfQotICBlbHNlIGlmICgoaWVlZV9yZWNvcmRfZW51bV90eXBlKSBiID09IGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8yX2VudW0pCi0gICAgewotICAgICAgbGVuID0gKCoqcHAgPDwgOCkgKyAoKnBwKVsxXTsKLSAgICAgICpwcCArPSAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChwcHJlc2VudCAhPSBOVUxMKQotCXsKLQkgIC0tKnBwOwotCSAgKnBwcmVzZW50ID0gZmFsc2U7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCAqcHAgLSAxLCBfKCJpbnZhbGlkIHN0cmluZyBsZW5ndGgiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICgodW5zaWduZWQgbG9uZykgKGluZm8tPnBlbmQgLSAqcHApIDwgbGVuKQotICAgIHsKLSAgICAgIGllZWVfZW9mIChpbmZvKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgKnBuYW1lID0gKGNvbnN0IGNoYXIgKikgKnBwOwotICAqcG5hbWxlbiA9IGxlbjsKLSAgKnBwICs9IGxlbjsKLQotICBpZiAocHByZXNlbnQgIT0gTlVMTCkKLSAgICAqcHByZXNlbnQgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGFuIGV4cHJlc3Npb24gZnJvbSBhbiBJRUVFIGZpbGUuICBTaW5jZSB0aGlzIGNvZGUgaXMgb25seSB1c2VkCi0gICB0byBwYXJzZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIEkgaGF2ZW4ndCBib3RoZXJlZCB0byB3cml0ZSBhIGZ1bGwKLSAgIGJsb3duIElFRUUgZXhwcmVzc2lvbiBwYXJzZXIuICBJJ3ZlIG9ubHkgdGhyb3duIGluIHRoZSB0aGluZ3MgSSd2ZQotICAgc2VlbiBpbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGNhbiBiZSBlYXNpbHkgZXh0ZW5kZWQgaWYKLSAgIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsIHB2KQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBiZmRfdm1hICpwdjsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKmV4cHJfc3RhcnQ7Ci0jZGVmaW5lIEVYUFJfU1RBQ0tfU0laRSAoMTApCi0gIGJmZF92bWEgZXhwcl9zdGFja1tFWFBSX1NUQUNLX1NJWkVdOwotICBiZmRfdm1hICplc3A7Ci0KLSAgZXhwcl9zdGFydCA9ICpwcDsKLQotICBlc3AgPSBleHByX3N0YWNrOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgYm9vbGVhbiBwcmVzZW50OwotICAgICAgaWVlZV9yZWNvcmRfZW51bV90eXBlIGM7Ci0KLSAgICAgIHN0YXJ0ID0gKnBwOwotCi0gICAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnZhbCwgJnByZXNlbnQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHByZXNlbnQpCi0JewotCSAgaWYgKGVzcCAtIGV4cHJfc3RhY2sgPj0gRVhQUl9TVEFDS19TSVpFKQotCSAgICB7Ci0JICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oImV4cHJlc3Npb24gc3RhY2sgb3ZlcmZsb3ciKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAqZXNwKysgPSB2YWw7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGMgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwOwotCi0gICAgICBpZiAoYyA+PSBpZWVlX21vZHVsZV9iZWdpbm5pbmdfZW51bSkKLQlicmVhazsKLQotICAgICAgKysqcHA7Ci0KLSAgICAgIGlmIChjID09IGllZWVfY29tbWEpCi0JYnJlYWs7Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JZGVmYXVsdDoKLQkgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bnN1cHBvcnRlZCBJRUVFIGV4cHJlc3Npb24gb3BlcmF0b3IiKSk7Ci0JICBicmVhazsKLQotCWNhc2UgaWVlZV92YXJpYWJsZV9SX2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgaW5keDsKLQkgICAgYXNlY3Rpb24gKnM7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZpbmR4KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGZvciAocyA9IGluZm8tPmFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCSAgICAgIGlmICgoYmZkX3ZtYSkgcy0+dGFyZ2V0X2luZGV4ID09IGluZHgpCi0JCWJyZWFrOwotCSAgICBpZiAocyA9PSBOVUxMKQotCSAgICAgIHsKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVua25vd24gc2VjdGlvbiIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgCi0JICAgIGlmIChlc3AgLSBleHByX3N0YWNrID49IEVYUFJfU1RBQ0tfU0laRSkKLQkgICAgICB7Ci0JCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJleHByZXNzaW9uIHN0YWNrIG92ZXJmbG93IikpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgICplc3ArKyA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGluZm8tPmFiZmQsIHMpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGllZWVfZnVuY3Rpb25fcGx1c19lbnVtOgotCWNhc2UgaWVlZV9mdW5jdGlvbl9taW51c19lbnVtOgotCSAgewotCSAgICBiZmRfdm1hIHYxLCB2MjsKLQotCSAgICBpZiAoZXNwIC0gZXhwcl9zdGFjayA8IDIpCi0JICAgICAgewotCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiZXhwcmVzc2lvbiBzdGFjayB1bmRlcmZsb3ciKSk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgdjEgPSAqLS1lc3A7Ci0JICAgIHYyID0gKi0tZXNwOwotCSAgICAqZXNwKysgPSB2MSArIHYyOwotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZXNwIC0gMSAhPSBleHByX3N0YWNrKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIGV4cHJfc3RhcnQsIF8oImV4cHJlc3Npb24gc3RhY2sgbWlzbWF0Y2giKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICpwdiA9ICotLWVzcDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIGFuIElFRUUgYnVpbHRpbiB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLWllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBwLCBpbmR4KQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqcDsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci17Ci0gIFBUUiBkaGFuZGxlOwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaWYgKGluZHggPCBCVUlMVElOX1RZUEVfQ09VTlQKLSAgICAgICYmIGluZm8tPnR5cGVzLmJ1aWx0aW5zW2luZHhdICE9IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gaW5mby0+dHlwZXMuYnVpbHRpbnNbaW5keF07Ci0KLSAgZGhhbmRsZSA9IGluZm8tPmRoYW5kbGU7Ci0KLSAgaWYgKGluZHggPj0gMzIgJiYgaW5keCA8IDY0KQotICAgIHsKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgICBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgcCwgaW5keCAtIDMyKSk7Ci0gICAgICBhc3NlcnQgKGluZHggPCBCVUlMVElOX1RZUEVfQ09VTlQpOwotICAgICAgaW5mby0+dHlwZXMuYnVpbHRpbnNbaW5keF0gPSB0eXBlOwotICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gIHN3aXRjaCAoKGVudW0gYnVpbHRpbl90eXBlcykgaW5keCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHAsIF8oInVua25vd24gYnVpbHRpbiB0eXBlIikpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5rbm93bjoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBuYW1lID0gTlVMTDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3ZvaWQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgbmFtZSA9ICJ2b2lkIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3NpZ25lZF9jaGFyOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2lnbmVkIGNoYXIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfY2hhcjoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgY2hhciI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9zaWduZWRfc2hvcnRfaW50OgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2lnbmVkIHNob3J0IGludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9zaG9ydF9pbnQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIHNob3J0IGludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9zaWduZWRfbG9uZzoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBuYW1lID0gInNpZ25lZCBsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkX2xvbmc6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGxvbmciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fc2lnbmVkX2xvbmdfbG9uZzoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCBmYWxzZSk7Ci0gICAgICBuYW1lID0gInNpZ25lZCBsb25nIGxvbmciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfbG9uZ19sb25nOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBsb25nIGxvbmciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fZmxvYXQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIG5hbWUgPSAiZmxvYXQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fZG91YmxlOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgOCk7Ci0gICAgICBuYW1lID0gImRvdWJsZSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9sb25nX2RvdWJsZToKLSAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBmb3IgdGhpcyB0eXBlIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUKLSAgICAgICAgIHByb2Nlc3Nvci4gICovCi0gICAgICB0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCAxMik7Ci0gICAgICBuYW1lID0gImxvbmcgZG91YmxlIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2xvbmdfbG9uZ19kb3VibGU6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCAxNik7Ci0gICAgICBuYW1lID0gImxvbmcgbG9uZyBkb3VibGUiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fcXVvdGVkX3N0cmluZzoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsCi0JCQkJICAgIGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBwLAotCQkJCQkJICAgICAgICgodW5zaWduZWQgaW50KQotCQkJCQkJCWJ1aWx0aW5fY2hhcikpLAotCQkJCSAgICBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgcCwKLQkJCQkJCSAgICAgICAoKHVuc2lnbmVkIGludCkKLQkJCQkJCQlidWlsdGluX2ludCkpLAotCQkJCSAgICAwLCAtMSwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gIlFVT1RFRCBTVFJJTkciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5faW5zdHJ1Y3Rpb25fYWRkcmVzczoKLSAgICAgIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIGNvZGUgYWRkcmVzcy4gICovCi0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gImluc3RydWN0aW9uIGFkZHJlc3MiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5faW50OgotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGZvciB0aGlzIHR5cGUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZQotICAgICAgICAgcHJvY2Vzc29yLiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBuYW1lID0gImludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZDoKLSAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBmb3IgdGhpcyB0eXBlIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUKLSAgICAgICAgIHByb2Nlc3Nvci4gICovCi0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkX2ludDoKLSAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBmb3IgdGhpcyB0eXBlIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUKLSAgICAgICAgIHByb2Nlc3Nvci4gICovCi0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9jaGFyOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAiY2hhciI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9sb25nOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAibG9uZyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9zaG9ydDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gInNob3J0IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkX3Nob3J0OgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9zaG9ydF9pbnQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaG9ydCBpbnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fc2lnbmVkX3Nob3J0OgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2lnbmVkIHNob3J0IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2JjZF9mbG9hdDoKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHAsIF8oIkJDRCBmbG9hdCB0eXBlIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChuYW1lICE9IE5VTEwpCi0gICAgdHlwZSA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgdHlwZSk7Ci0KLSAgYXNzZXJ0IChpbmR4IDwgQlVJTFRJTl9UWVBFX0NPVU5UKTsKLQotICBpbmZvLT50eXBlcy5idWlsdGluc1tpbmR4XSA9IHR5cGU7Ci0KLSAgcmV0dXJuIHR5cGU7Ci19Ci0KLS8qIEFsbG9jYXRlIG1vcmUgc3BhY2UgaW4gdGhlIHR5cGUgdGFibGUuICBJZiByZWYgaXMgdHJ1ZSwgdGhpcyBpcyBhCi0gICByZWZlcmVuY2UgdG8gdGhlIHR5cGU7IGlmIGl0IGlzIG5vdCBhbHJlYWR5IGRlZmluZWQsIHdlIHNob3VsZCBzZXQKLSAgIHVwIGFuIGluZGlyZWN0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hbGxvY190eXBlIChpbmZvLCBpbmR4LCByZWYpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGludCBpbmR4OwotICAgICBib29sZWFuIHJlZjsKLXsKLSAgdW5zaWduZWQgaW50IG5hbGxvYzsKLSAgcmVnaXN0ZXIgc3RydWN0IGllZWVfdHlwZSAqdDsKLSAgc3RydWN0IGllZWVfdHlwZSAqdGVuZDsKLQotICBpZiAoaW5keCA+PSBpbmZvLT50eXBlcy5hbGxvYykKLSAgICB7Ci0gICAgICBuYWxsb2MgPSBpbmZvLT50eXBlcy5hbGxvYzsKLSAgICAgIGlmIChuYWxsb2MgPT0gMCkKLQluYWxsb2MgPSA0OwotICAgICAgd2hpbGUgKGluZHggPj0gbmFsbG9jKQotCW5hbGxvYyAqPSAyOwotCi0gICAgICBpbmZvLT50eXBlcy50eXBlcyA9ICgoc3RydWN0IGllZWVfdHlwZSAqKQotCQkJICAgeHJlYWxsb2MgKGluZm8tPnR5cGVzLnR5cGVzLAotCQkJCSAgICAgbmFsbG9jICogc2l6ZW9mICppbmZvLT50eXBlcy50eXBlcykpOwotCi0gICAgICBtZW1zZXQgKGluZm8tPnR5cGVzLnR5cGVzICsgaW5mby0+dHlwZXMuYWxsb2MsIDAsCi0JICAgICAgKG5hbGxvYyAtIGluZm8tPnR5cGVzLmFsbG9jKSAqIHNpemVvZiAqaW5mby0+dHlwZXMudHlwZXMpOwotCi0gICAgICB0ZW5kID0gaW5mby0+dHlwZXMudHlwZXMgKyBuYWxsb2M7Ci0gICAgICBmb3IgKHQgPSBpbmZvLT50eXBlcy50eXBlcyArIGluZm8tPnR5cGVzLmFsbG9jOyB0IDwgdGVuZDsgdCsrKQotCXQtPnR5cGUgPSBERUJVR19UWVBFX05VTEw7Ci0KLSAgICAgIGluZm8tPnR5cGVzLmFsbG9jID0gbmFsbG9jOwotICAgIH0KLQotICBpZiAocmVmKQotICAgIHsKLSAgICAgIHQgPSBpbmZvLT50eXBlcy50eXBlcyArIGluZHg7Ci0gICAgICBpZiAodC0+dHlwZSA9PSBOVUxMKQotCXsKLQkgIHQtPnBzbG90ID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICp0LT5wc2xvdCk7Ci0JICAqdC0+cHNsb3QgPSBERUJVR19UWVBFX05VTEw7Ci0JICB0LT50eXBlID0gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChpbmZvLT5kaGFuZGxlLCB0LT5wc2xvdCwKLQkJCQkJICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0JICBpZiAodC0+dHlwZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIHR5cGUgaW5kZXggYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgcHR5cGUpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKnB0eXBlOwotewotICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7Ci0gIGJmZF92bWEgaW5keDsKLQotICBzdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5keCA8IDI1NikKLSAgICB7Ci0gICAgICAqcHR5cGUgPSBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgc3RhcnQsIGluZHgpOwotICAgICAgaWYgKCpwdHlwZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpbmR4IC09IDI1NjsKLSAgaWYgKCEgaWVlZV9hbGxvY190eXBlIChpbmZvLCBpbmR4LCB0cnVlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnB0eXBlID0gaW5mby0+dHlwZXMudHlwZXNbaW5keF0udHlwZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGEgZmlsZS4gIFRoaXMgaXMgcGFzc2VkIHRoZQotICAgYnl0ZXMgd2hpY2ggY29tcG9zZSB0aGUgRGVidWcgSW5mb3JtYXRpb24gUGFydCBvZiBhbiBJRUVFIGZpbGUuICAqLwotCi1ib29sZWFuCi1wYXJzZV9pZWVlIChkaGFuZGxlLCBhYmZkLCBieXRlcywgbGVuKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBiZmRfYnl0ZSAqYnl0ZXM7Ci0gICAgIGJmZF9zaXplX3R5cGUgbGVuOwotewotICBzdHJ1Y3QgaWVlZV9pbmZvIGluZm87Ci0gIHVuc2lnbmVkIGludCBpOwotICBjb25zdCBiZmRfYnl0ZSAqcCwgKnBlbmQ7Ci0KLSAgaW5mby5kaGFuZGxlID0gZGhhbmRsZTsKLSAgaW5mby5hYmZkID0gYWJmZDsKLSAgaW5mby5ieXRlcyA9IGJ5dGVzOwotICBpbmZvLnBlbmQgPSBieXRlcyArIGxlbjsKLSAgaW5mby5ibG9ja3N0YWNrLmJzcCA9IGluZm8uYmxvY2tzdGFjay5zdGFjazsKLSAgaW5mby5zYXdfZmlsZW5hbWUgPSBmYWxzZTsKLSAgaW5mby52YXJzLmFsbG9jID0gMDsKLSAgaW5mby52YXJzLnZhcnMgPSBOVUxMOwotICBpbmZvLmdsb2JhbF92YXJzID0gTlVMTDsKLSAgaW5mby50eXBlcy5hbGxvYyA9IDA7Ci0gIGluZm8udHlwZXMudHlwZXMgPSBOVUxMOwotICBpbmZvLmdsb2JhbF90eXBlcyA9IE5VTEw7Ci0gIGluZm8udGFncyA9IE5VTEw7Ci0gIGZvciAoaSA9IDA7IGkgPCBCVUlMVElOX1RZUEVfQ09VTlQ7IGkrKykKLSAgICBpbmZvLnR5cGVzLmJ1aWx0aW5zW2ldID0gREVCVUdfVFlQRV9OVUxMOwotCi0gIHAgPSBieXRlczsKLSAgcGVuZCA9IGluZm8ucGVuZDsKLSAgd2hpbGUgKHAgPCBwZW5kKQotICAgIHsKLSAgICAgIGNvbnN0IGJmZF9ieXRlICpyZWNvcmRfc3RhcnQ7Ci0gICAgICBpZWVlX3JlY29yZF9lbnVtX3R5cGUgYzsKLQotICAgICAgcmVjb3JkX3N0YXJ0ID0gcDsKLQotICAgICAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICpwKys7Ci0KLSAgICAgIGlmIChjID09IGllZWVfYXRfcmVjb3JkX2VudW0pCi0JYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICgoKHVuc2lnbmVkIGludCkgYyA8PCA4KSB8ICpwKyspOwotCi0gICAgICBpZiAoYyA8PSBpZWVlX251bWJlcl9yZXBlYXRfZW5kX2VudW0pCi0JewotCSAgaWVlZV9lcnJvciAoJmluZm8sIHJlY29yZF9zdGFydCwgXygidW5leHBlY3RlZCBudW1iZXIiKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWRlZmF1bHQ6Ci0JICBpZWVlX2Vycm9yICgmaW5mbywgcmVjb3JkX3N0YXJ0LCBfKCJ1bmV4cGVjdGVkIHJlY29yZCB0eXBlIikpOwotCSAgcmV0dXJuIGZhbHNlOwotCi0JY2FzZSBpZWVlX2JiX3JlY29yZF9lbnVtOgotCSAgaWYgKCEgcGFyc2VfaWVlZV9iYiAoJmluZm8sICZwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGllZWVfYmVfcmVjb3JkX2VudW06Ci0JICBpZiAoISBwYXJzZV9pZWVlX2JlICgmaW5mbywgJnApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgaWVlZV9ubl9yZWNvcmQ6Ci0JICBpZiAoISBwYXJzZV9pZWVlX25uICgmaW5mbywgJnApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgaWVlZV90eV9yZWNvcmRfZW51bToKLQkgIGlmICghIHBhcnNlX2llZWVfdHkgKCZpbmZvLCAmcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX2F0bl9yZWNvcmRfZW51bToKLQkgIGlmICghIHBhcnNlX2llZWVfYXRuICgmaW5mbywgJnApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChpbmZvLmJsb2Nrc3RhY2suYnNwICE9IGluZm8uYmxvY2tzdGFjay5zdGFjaykKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yICgmaW5mbywgKGNvbnN0IGJmZF9ieXRlICopIE5VTEwsCi0JCSAgXygiYmxvY2tzIGxlZnQgb24gc3RhY2sgYXQgZW5kIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGFuIElFRUUgQkIgcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2llZWVfYmIgKGluZm8sIHBwKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotewotICBjb25zdCBiZmRfYnl0ZSAqYmxvY2tfc3RhcnQ7Ci0gIGJmZF9ieXRlIGI7Ci0gIGJmZF92bWEgc2l6ZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0gIGNoYXIgKm5hbWNvcHkgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgZm5pbmR4OwotICBib29sZWFuIHNraXA7Ci0KLSAgYmxvY2tfc3RhcnQgPSAqcHA7Ci0KLSAgYiA9ICoqcHA7Ci0gICsrKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkKLSAgICAgIHx8ICEgaWVlZV9yZWFkX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmbmluZHggPSAodW5zaWduZWQgaW50KSAtMTsKLSAgc2tpcCA9IGZhbHNlOwotCi0gIHN3aXRjaCAoYikKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgLyogQkIxOiBUeXBlIGRlZmluaXRpb25zIGxvY2FsIHRvIGEgbW9kdWxlLiAgKi8KLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgaWYgKG5hbWNvcHkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19zZXRfZmlsZW5hbWUgKGluZm8tPmRoYW5kbGUsIG5hbWNvcHkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPnNhd19maWxlbmFtZSA9IHRydWU7Ci0KLSAgICAgIC8qIERpc2NhcmQgYW55IHZhcmlhYmxlcyBvciB0eXBlcyB3ZSBtYXkgaGF2ZSBzZWVuIGJlZm9yZS4gICovCi0gICAgICBpZiAoaW5mby0+dmFycy52YXJzICE9IE5VTEwpCi0JZnJlZSAoaW5mby0+dmFycy52YXJzKTsKLSAgICAgIGluZm8tPnZhcnMudmFycyA9IE5VTEw7Ci0gICAgICBpbmZvLT52YXJzLmFsbG9jID0gMDsKLSAgICAgIGlmIChpbmZvLT50eXBlcy50eXBlcyAhPSBOVUxMKQotCWZyZWUgKGluZm8tPnR5cGVzLnR5cGVzKTsKLSAgICAgIGluZm8tPnR5cGVzLnR5cGVzID0gTlVMTDsKLSAgICAgIGluZm8tPnR5cGVzLmFsbG9jID0gMDsKLQotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHlwZXMgdG8gdGhlIGdsb2JhbCB0eXBlcy4gICovCi0gICAgICBpZiAoaW5mby0+Z2xvYmFsX3R5cGVzICE9IE5VTEwpCi0JewotCSAgaW5mby0+dHlwZXMuYWxsb2MgPSBpbmZvLT5nbG9iYWxfdHlwZXMtPmFsbG9jOwotCSAgaW5mby0+dHlwZXMudHlwZXMgPSAoKHN0cnVjdCBpZWVlX3R5cGUgKikKLQkJCSAgICAgICB4bWFsbG9jIChpbmZvLT50eXBlcy5hbGxvYwotCQkJCQkqIHNpemVvZiAoKmluZm8tPnR5cGVzLnR5cGVzKSkpOwotCSAgbWVtY3B5IChpbmZvLT50eXBlcy50eXBlcywgaW5mby0+Z2xvYmFsX3R5cGVzLT50eXBlcywKLQkJICBpbmZvLT50eXBlcy5hbGxvYyAqIHNpemVvZiAoKmluZm8tPnR5cGVzLnR5cGVzKSk7Ci0JfQotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjoKLSAgICAgIC8qIEJCMjogR2xvYmFsIHR5cGUgZGVmaW5pdGlvbnMuICBUaGUgbmFtZSBpcyBzdXBwb3NlZCB0byBiZQotCSBlbXB0eSwgYnV0IHdlIGRvbid0IGNoZWNrLiAqLwotICAgICAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChpbmZvLT5kaGFuZGxlLCAiKmdsb2JhbCoiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT5zYXdfZmlsZW5hbWUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICAvKiBCQjM6IEhpZ2ggbGV2ZWwgbW9kdWxlIGJsb2NrIGJlZ2luLiAgV2UgZG9uJ3QgaGF2ZSB0byBkbwotCSBhbnl0aGluZyBoZXJlLiAgVGhlIG5hbWUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgYXMgZm9yCi0JIHRoZSBCQjEsIGJ1dCB3ZSBkb24ndCBjaGVjay4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSAgICAgIC8qIEJCNDogR2xvYmFsIGZ1bmN0aW9uLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHN0YWNrc3BhY2UsIHR5cGluZHgsIG9mZnNldDsKLQlkZWJ1Z190eXBlIHJldHVybl90eXBlOwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzdGFja3NwYWNlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdHlwaW5keCkKLQkgICAgfHwgISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBzdGFjayBzcGFjZS4gIEZJWE1FLiAgKi8KLQotCWlmICh0eXBpbmR4IDwgMjU2KQotCSAgewotCSAgICByZXR1cm5fdHlwZSA9IGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBibG9ja19zdGFydCwgdHlwaW5keCk7Ci0JICAgIGlmIChyZXR1cm5fdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgdHlwaW5keCAtPSAyNTY7Ci0JICAgIGlmICghIGllZWVfYWxsb2NfdHlwZSAoaW5mbywgdHlwaW5keCwgdHJ1ZSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBmbmluZHggPSB0eXBpbmR4OwotCSAgICByZXR1cm5fdHlwZSA9IGluZm8tPnR5cGVzLnR5cGVzW3R5cGluZHhdLnR5cGU7Ci0JICAgIGlmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChpbmZvLT5kaGFuZGxlLCByZXR1cm5fdHlwZSkKLQkJPT0gREVCVUdfS0lORF9GVU5DVElPTikKLQkgICAgICByZXR1cm5fdHlwZSA9IGRlYnVnX2dldF9yZXR1cm5fdHlwZSAoaW5mby0+ZGhhbmRsZSwKLQkJCQkJCSAgIHJldHVybl90eXBlKTsKLQkgIH0KLQotCW5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotCWlmIChuYW1jb3B5ID09IE5VTEwpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKCEgZGVidWdfcmVjb3JkX2Z1bmN0aW9uIChpbmZvLT5kaGFuZGxlLCBuYW1jb3B5LCByZXR1cm5fdHlwZSwKLQkJCQkgICAgIHRydWUsIG9mZnNldCkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNToKLSAgICAgIC8qIEJCNTogRmlsZSBuYW1lIGZvciBzb3VyY2UgbGluZSBudW1iZXJzLiAgKi8KLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCS8qIFdlIGlnbm9yZSB0aGUgZGF0ZSBhbmQgdGltZS4gIEZJWE1FLiAgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCSAgewotCSAgICBiZmRfdm1hIGlnbm9yZTsKLQkgICAgYm9vbGVhbiBwcmVzZW50OwotCi0JICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmaWdub3JlLCAmcHJlc2VudCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoISBwcmVzZW50KQotCSAgICAgIGJyZWFrOwotCSAgfQotCi0JbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0JaWYgKG5hbWNvcHkgPT0gTlVMTCkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAoISBkZWJ1Z19zdGFydF9zb3VyY2UgKGluZm8tPmRoYW5kbGUsIG5hbWNvcHkpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDY6Ci0gICAgICAvKiBCQjY6IExvY2FsIGZ1bmN0aW9uIG9yIGJsb2NrLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHN0YWNrc3BhY2UsIHR5cGluZHgsIG9mZnNldDsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc3RhY2tzcGFjZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnR5cGluZHgpCi0JICAgIHx8ICEgaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCAmb2Zmc2V0KSkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGUgc3RhY2sgc3BhY2UuICBGSVhNRS4gICovCi0KLQlpZiAobmFtbGVuID09IDApCi0JICB7Ci0JICAgIGlmICghIGRlYnVnX3N0YXJ0X2Jsb2NrIChpbmZvLT5kaGFuZGxlLCBvZmZzZXQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgLyogQ2hhbmdlIGIgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGEgYmxvY2sKLQkgICAgICAgcmF0aGVyIHRoYW4gYSBmdW5jdGlvbi4gICovCi0JICAgIGIgPSAweDg2OwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogVGhlIE1SSSBDKysgY29tcGlsZXIgd2lsbCBvdXRwdXQgYSBmYWtlIGZ1bmN0aW9uIG5hbWVkCi0JICAgICAgIF9fWFJZQ1BQIHRvIGhvbGQgQysrIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFdlIHNraXAKLQkgICAgICAgdGhhdCBmdW5jdGlvbi4gIFRoaXMgaXMgbm90IGNydWNpYWwsIGJ1dCBpdCBtYWtlcwotCSAgICAgICBjb252ZXJ0aW5nIGZyb20gSUVFRSB0byBvdGhlciBkZWJ1ZyBmb3JtYXRzIHdvcmsKLQkgICAgICAgYmV0dGVyLiAgKi8KLQkgICAgaWYgKHN0cm5jbXAgKG5hbWUsICJfX1hSWUNQUCIsIG5hbWxlbikgPT0gMCkKLQkgICAgICBza2lwID0gdHJ1ZTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLQotCQlpZiAodHlwaW5keCA8IDI1NikKLQkJICB7Ci0JCSAgICByZXR1cm5fdHlwZSA9IGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBibG9ja19zdGFydCwKLQkJCQkJCSAgICAgdHlwaW5keCk7Ci0JCSAgICBpZiAocmV0dXJuX3R5cGUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIHR5cGluZHggLT0gMjU2OwotCQkgICAgaWYgKCEgaWVlZV9hbGxvY190eXBlIChpbmZvLCB0eXBpbmR4LCB0cnVlKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgZm5pbmR4ID0gdHlwaW5keDsKLQkJICAgIHJldHVybl90eXBlID0gaW5mby0+dHlwZXMudHlwZXNbdHlwaW5keF0udHlwZTsKLQkJICAgIGlmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChpbmZvLT5kaGFuZGxlLCByZXR1cm5fdHlwZSkKLQkJCT09IERFQlVHX0tJTkRfRlVOQ1RJT04pCi0JCSAgICAgIHJldHVybl90eXBlID0gZGVidWdfZ2V0X3JldHVybl90eXBlIChpbmZvLT5kaGFuZGxlLAotCQkJCQkJCSAgIHJldHVybl90eXBlKTsKLQkJICB9Ci0KLQkJbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0JCWlmIChuYW1jb3B5ID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlpZiAoISBkZWJ1Z19yZWNvcmRfZnVuY3Rpb24gKGluZm8tPmRoYW5kbGUsIG5hbWNvcHksCi0JCQkJCSAgICAgcmV0dXJuX3R5cGUsIGZhbHNlLCBvZmZzZXQpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTA6Ci0gICAgICAvKiBCQjEwOiBBc3NlbWJsZXIgbW9kdWxlIHNjb3BlLiAgSW4gdGhlIG5vcm1hbCBjYXNlLCB3ZQotCSBjb21wbGV0ZWx5IGlnbm9yZSBhbGwgdGhpcyBpbmZvcm1hdGlvbi4gIEZJWE1FLiAgKi8KLSAgICAgIHsKLQljb25zdCBjaGFyICppbmFtLCAqdnN0cjsKLQl1bnNpZ25lZCBsb25nIGluYW1sZW4sIHZzdHJsZW47Ci0JYmZkX3ZtYSB0b29sX3R5cGU7Ci0JYm9vbGVhbiBwcmVzZW50OwotCXVuc2lnbmVkIGludCBpOwotCi0JaWYgKCEgaW5mby0+c2F3X2ZpbGVuYW1lKQotCSAgewotCSAgICBuYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLQkgICAgaWYgKG5hbWNvcHkgPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIGRlYnVnX3NldF9maWxlbmFtZSAoaW5mby0+ZGhhbmRsZSwgbmFtY29weSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpbmZvLT5zYXdfZmlsZW5hbWUgPSB0cnVlOwotCSAgfQotCi0JaWYgKCEgaWVlZV9yZWFkX2lkIChpbmZvLCBwcCwgJmluYW0sICZpbmFtbGVuKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdG9vbF90eXBlKQotCSAgICB8fCAhIGllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsICZ2c3RyLCAmdnN0cmxlbiwgJnByZXNlbnQpKQotCSAgcmV0dXJuIGZhbHNlOwotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JICB7Ci0JICAgIGJmZF92bWEgaWdub3JlOwotCi0JICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmaWdub3JlLCAmcHJlc2VudCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoISBwcmVzZW50KQotCSAgICAgIGJyZWFrOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDExOgotICAgICAgLyogQkIxMTogTW9kdWxlIHNlY3Rpb24uICBXZSBjb21wbGV0ZWx5IGlnbm9yZSBhbGwgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEZJWE1FLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNlY3R5cGUsIHNlY2luZHgsIG9mZnNldCwgbWFwOwotCWJvb2xlYW4gcHJlc2VudDsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2VjdHlwZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNlY2luZHgpCi0JICAgIHx8ICEgaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCAmb2Zmc2V0KQotCSAgICB8fCAhIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmbWFwLCAmcHJlc2VudCkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBibG9ja19zdGFydCwgXygidW5rbm93biBCQiB0eXBlIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gIC8qIFB1c2ggdGhpcyBibG9jayBvbiB0aGUgYmxvY2sgc3RhY2suICAqLwotCi0gIGlmIChpbmZvLT5ibG9ja3N0YWNrLmJzcCA+PSBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrICsgQkxPQ0tTVEFDS19TSVpFKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIChjb25zdCBiZmRfYnl0ZSAqKSBOVUxMLCBfKCJzdGFjayBvdmVyZmxvdyIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mby0+YmxvY2tzdGFjay5ic3AtPmtpbmQgPSBiOwotICBpZiAoYiA9PSA1KQotICAgIGluZm8tPmJsb2Nrc3RhY2suYnNwLT5maWxlbmFtZSA9IG5hbWNvcHk7Ci0gIGluZm8tPmJsb2Nrc3RhY2suYnNwLT5mbmluZHggPSBmbmluZHg7Ci0gIGluZm8tPmJsb2Nrc3RhY2suYnNwLT5za2lwID0gc2tpcDsKLSAgKytpbmZvLT5ibG9ja3N0YWNrLmJzcDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGFuIElFRUUgQkUgcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2llZWVfYmUgKGluZm8sIHBwKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotewotICBiZmRfdm1hIG9mZnNldDsKLQotICBpZiAoaW5mby0+YmxvY2tzdGFjay5ic3AgPD0gaW5mby0+YmxvY2tzdGFjay5zdGFjaykKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCAqcHAsIF8oInN0YWNrIHVuZGVyZmxvdyIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIC0taW5mby0+YmxvY2tzdGFjay5ic3A7Ci0KLSAgc3dpdGNoIChpbmZvLT5ibG9ja3N0YWNrLmJzcC0+a2luZCkKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgLyogV2hlbiB3ZSBlbmQgdGhlIGdsb2JhbCB0eXBlZGVmcyBibG9jaywgd2UgY29weSBvdXQgdGhlIHRoZQotICAgICAgICAgY29udGVudHMgb2YgaW5mby0+dmFycy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgdmFyaWFibGUgaW5kaWNlcwotICAgICAgICAgbWF5IGJlIHJldXNlZCBpbiB0aGUgbG9jYWwgYmxvY2tzLiAgSG93ZXZlciwgd2UgbmVlZCB0bwotICAgICAgICAgcHJlc2VydmUgdGhlbSBzbyB0aGF0IHdlIGNhbiBsb2NhdGUgYSBmdW5jdGlvbiByZXR1cm5pbmcgYQotICAgICAgICAgcmVmZXJlbmNlIHZhcmlhYmxlIHdob3NlIHR5cGUgaXMgbmFtZWQgaW4gdGhlIGdsb2JhbCB0eXBlZGVmCi0gICAgICAgICBibG9jay4gICovCi0gICAgICBpbmZvLT5nbG9iYWxfdmFycyA9ICgoc3RydWN0IGllZWVfdmFycyAqKQotCQkJICAgeG1hbGxvYyAoc2l6ZW9mICppbmZvLT5nbG9iYWxfdmFycykpOwotICAgICAgaW5mby0+Z2xvYmFsX3ZhcnMtPmFsbG9jID0gaW5mby0+dmFycy5hbGxvYzsKLSAgICAgIGluZm8tPmdsb2JhbF92YXJzLT52YXJzID0gKChzdHJ1Y3QgaWVlZV92YXIgKikKLQkJCQkgeG1hbGxvYyAoaW5mby0+dmFycy5hbGxvYwotCQkJCQkgICogc2l6ZW9mICgqaW5mby0+dmFycy52YXJzKSkpOwotICAgICAgbWVtY3B5IChpbmZvLT5nbG9iYWxfdmFycy0+dmFycywgaW5mby0+dmFycy52YXJzLAotCSAgICAgIGluZm8tPnZhcnMuYWxsb2MgKiBzaXplb2YgKCppbmZvLT52YXJzLnZhcnMpKTsKLQotICAgICAgLyogV2UgYWxzbyBjb3B5IG91dCB0aGUgbm9uIGJ1aWx0aW4gcGFydHMgb2YgaW5mby0+dHlwZXMsIHNpbmNlCi0gICAgICAgICB0aGUgdHlwZXMgYXJlIGRpc2NhcmRlZCB3aGVuIHdlIHN0YXJ0IGEgbmV3IGJsb2NrLiAgKi8KLSAgICAgIGluZm8tPmdsb2JhbF90eXBlcyA9ICgoc3RydWN0IGllZWVfdHlwZXMgKikKLQkJCSAgICB4bWFsbG9jIChzaXplb2YgKmluZm8tPmdsb2JhbF90eXBlcykpOwotICAgICAgaW5mby0+Z2xvYmFsX3R5cGVzLT5hbGxvYyA9IGluZm8tPnR5cGVzLmFsbG9jOwotICAgICAgaW5mby0+Z2xvYmFsX3R5cGVzLT50eXBlcyA9ICgoc3RydWN0IGllZWVfdHlwZSAqKQotCQkJCSAgIHhtYWxsb2MgKGluZm8tPnR5cGVzLmFsbG9jCi0JCQkJCSAgICAqIHNpemVvZiAoKmluZm8tPnR5cGVzLnR5cGVzKSkpOwotICAgICAgbWVtY3B5IChpbmZvLT5nbG9iYWxfdHlwZXMtPnR5cGVzLCBpbmZvLT50eXBlcy50eXBlcywKLQkgICAgICBpbmZvLT50eXBlcy5hbGxvYyAqIHNpemVvZiAoKmluZm8tPnR5cGVzLnR5cGVzKSk7Ci0gICAgICBtZW1zZXQgKGluZm8tPmdsb2JhbF90eXBlcy0+YnVpbHRpbnMsIDAsCi0JICAgICAgc2l6ZW9mIChpbmZvLT5nbG9iYWxfdHlwZXMtPmJ1aWx0aW5zKSk7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotICAgIGNhc2UgNjoKLSAgICAgIGlmICghIGllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgJm9mZnNldCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgaW5mby0+YmxvY2tzdGFjay5ic3AtPnNraXApCi0JewotCSAgaWYgKCEgZGVidWdfZW5kX2Z1bmN0aW9uIChpbmZvLT5kaGFuZGxlLCBvZmZzZXQgKyAxKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAweDg2OgotICAgICAgLyogVGhpcyBpcyBCRTYgd2hlbiBCQjYgc3RhcnRlZCBhIGJsb2NrIHJhdGhlciB0aGFuIGEgbG9jYWwKLQkgZnVuY3Rpb24uICAqLwotICAgICAgaWYgKCEgaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCAmb2Zmc2V0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19lbmRfYmxvY2sgKGluZm8tPmRoYW5kbGUsIG9mZnNldCArIDEpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA1OgotICAgICAgLyogV2hlbiB3ZSBlbmQgYSBCQjUsIHdlIGxvb2sgdXAgdGhlIHN0YWNrIGZvciB0aGUgbGFzdCBCQjUsIGlmCi0gICAgICAgICB0aGVyZSBpcyBvbmUsIHNvIHRoYXQgd2UgY2FuIGNhbGwgZGVidWdfc3RhcnRfc291cmNlLiAgKi8KLSAgICAgIGlmIChpbmZvLT5ibG9ja3N0YWNrLmJzcCA+IGluZm8tPmJsb2Nrc3RhY2suc3RhY2spCi0JewotCSAgc3RydWN0IGllZWVfYmxvY2sgKmJsOwotCi0JICBibCA9IGluZm8tPmJsb2Nrc3RhY2suYnNwOwotCSAgZG8KLQkgICAgewotCSAgICAgIC0tYmw7Ci0JICAgICAgaWYgKGJsLT5raW5kID09IDUpCi0JCXsKLQkJICBpZiAoISBkZWJ1Z19zdGFydF9zb3VyY2UgKGluZm8tPmRoYW5kbGUsIGJsLT5maWxlbmFtZSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgd2hpbGUgKGJsICE9IGluZm8tPmJsb2Nrc3RhY2suc3RhY2spOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxMToKLSAgICAgIGlmICghIGllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgJm9mZnNldCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLyogV2UganVzdCBpZ25vcmUgdGhlIG1vZHVsZSBzaXplLiAgRklYTUUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogT3RoZXIgYmxvY2sgdHlwZXMgZG8gbm90IGhhdmUgYW55IHRyYWlsaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgYW4gTk4gcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2llZWVfbm4gKGluZm8sIHBwKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotewotICBjb25zdCBiZmRfYnl0ZSAqbm5fc3RhcnQ7Ci0gIGJmZF92bWEgdmFyaW5keDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0KLSAgbm5fc3RhcnQgPSAqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2YXJpbmR4KQotICAgICAgfHwgISBpZWVlX3JlYWRfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2YXJpbmR4IDwgMzIpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgbm5fc3RhcnQsIF8oImlsbGVnYWwgdmFyaWFibGUgaW5kZXgiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB2YXJpbmR4IC09IDMyOwotCi0gIGlmICh2YXJpbmR4ID49IGluZm8tPnZhcnMuYWxsb2MpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGFsbG9jOwotCi0gICAgICBhbGxvYyA9IGluZm8tPnZhcnMuYWxsb2M7Ci0gICAgICBpZiAoYWxsb2MgPT0gMCkKLQlhbGxvYyA9IDQ7Ci0gICAgICB3aGlsZSAodmFyaW5keCA+PSBhbGxvYykKLQlhbGxvYyAqPSAyOwotICAgICAgaW5mby0+dmFycy52YXJzID0gKChzdHJ1Y3QgaWVlZV92YXIgKikKLQkJCSB4cmVhbGxvYyAoaW5mby0+dmFycy52YXJzLAotCQkJCSAgIGFsbG9jICogc2l6ZW9mICppbmZvLT52YXJzLnZhcnMpKTsKLSAgICAgIG1lbXNldCAoaW5mby0+dmFycy52YXJzICsgaW5mby0+dmFycy5hbGxvYywgMCwKLQkgICAgICAoYWxsb2MgLSBpbmZvLT52YXJzLmFsbG9jKSAqIHNpemVvZiAqaW5mby0+dmFycy52YXJzKTsKLSAgICAgIGluZm8tPnZhcnMuYWxsb2MgPSBhbGxvYzsKLSAgICB9Ci0KLSAgaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLm5hbWUgPSBuYW1lOwotICBpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0ubmFtbGVuID0gbmFtbGVuOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIFRZIHJlY29yZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9pZWVlX3R5IChpbmZvLCBwcCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKnR5X3N0YXJ0LCAqdHlfdmFyX3N0YXJ0LCAqdHlfY29kZV9zdGFydDsKLSAgYmZkX3ZtYSB0eXBlaW5keCwgdmFyaW5keCwgdGM7Ci0gIFBUUiBkaGFuZGxlOwotICBib29sZWFuIHRhZywgdHlwZGVmOwotICBkZWJ1Z190eXBlICphcmdfc2xvdHM7Ci0gIHVuc2lnbmVkIGxvbmcgdHlwZV9iaXRzaXplOwotICBkZWJ1Z190eXBlIHR5cGU7Ci0KLSAgdHlfc3RhcnQgPSAqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0eXBlaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh0eXBlaW5keCA8IDI1NikKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCB0eV9zdGFydCwgXygiaWxsZWdhbCB0eXBlIGluZGV4IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICB0eXBlaW5keCAtPSAyNTY7Ci0gIGlmICghIGllZWVfYWxsb2NfdHlwZSAoaW5mbywgdHlwZWluZHgsIGZhbHNlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCoqcHAgIT0gMHhjZSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCAqcHAsIF8oInVua25vd24gVFkgY29kZSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIHR5X3Zhcl9zdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnZhcmluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodmFyaW5keCA8IDMyKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHR5X3Zhcl9zdGFydCwgXygiaWxsZWdhbCB2YXJpYWJsZSBpbmRleCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHZhcmluZHggLT0gMzI7Ci0KLSAgaWYgKHZhcmluZHggPj0gaW5mby0+dmFycy5hbGxvYyB8fCBpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0ubmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHR5X3Zhcl9zdGFydCwgXygidW5kZWZpbmVkIHZhcmlhYmxlIGluIFRZIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICB0eV9jb2RlX3N0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdGMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkaGFuZGxlID0gaW5mby0+ZGhhbmRsZTsKLQotICB0YWcgPSBmYWxzZTsKLSAgdHlwZGVmID0gZmFsc2U7Ci0gIGFyZ19zbG90cyA9IE5VTEw7Ci0gIHR5cGVfYml0c2l6ZSA9IDA7Ci0gIHN3aXRjaCAodGMpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCB0eV9jb2RlX3N0YXJ0LCBfKCJ1bmtub3duIFRZIGNvZGUiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlICchJzoKLSAgICAgIC8qIFVua25vd24gdHlwZSwgd2l0aCBzaXplLiAgV2UgdHJlYXQgaXQgYXMgaW50LiAgRklYTUUuICAqLwotICAgICAgewotCWJmZF92bWEgc2l6ZTsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIHNpemUsIGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQSc6IC8qIEFycmF5LiAgKi8KLSAgICBjYXNlICdhJzogLyogRk9SVFJBTiBhcnJheSBpbiBjb2x1bW4vcm93IG9yZGVyLiAgRklYTUU6IE5vdAotCQkgZGlzdGluZ3Vpc2hlZCBmcm9tIG5vcm1hbCBhcnJheS4gICovCi0gICAgICB7Ci0JZGVidWdfdHlwZSBlbGVfdHlwZTsKLQliZmRfdm1hIGxvd2VyLCB1cHBlcjsKLQotCWlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJmVsZV90eXBlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmbG93ZXIpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ1cHBlcikpCi0JICByZXR1cm4gZmFsc2U7Ci0JdHlwZSA9IGRlYnVnX21ha2VfYXJyYXlfdHlwZSAoZGhhbmRsZSwgZWxlX3R5cGUsCi0JCQkJICAgICAgaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHR5X2NvZGVfc3RhcnQsCi0JCQkJCQkJICgodW5zaWduZWQgaW50KQotCQkJCQkJCSAgYnVpbHRpbl9pbnQpKSwKLQkJCQkgICAgICAoYmZkX3NpZ25lZF92bWEpIGxvd2VyLAotCQkJCSAgICAgIChiZmRfc2lnbmVkX3ZtYSkgdXBwZXIsCi0JCQkJICAgICAgZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdFJzoKLSAgICAgIC8qIFNpbXBsZSBlbnVtZXJhdGlvbi4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBzaXplOwotCXVuc2lnbmVkIGludCBhbGxvYzsKLQljb25zdCBjaGFyICoqbmFtZXM7Ci0JdW5zaWduZWQgaW50IGM7Ci0JYmZkX3NpZ25lZF92bWEgKnZhbHM7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpKQotCSAgcmV0dXJuIGZhbHNlOwotCS8qIEZJWE1FOiB3ZSBpZ25vcmUgdGhlIGVudW1lcmF0aW9uIHNpemUuICAqLwotCi0JYWxsb2MgPSAxMDsKLQluYW1lcyA9IChjb25zdCBjaGFyICoqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqbmFtZXMpOwotCW1lbXNldCAobmFtZXMsIDAsIGFsbG9jICogc2l6ZW9mICpuYW1lcyk7Ci0JYyA9IDA7Ci0Jd2hpbGUgKDEpCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCSAgICBib29sZWFuIHByZXNlbnQ7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgaWYgKGMgKyAxID49IGFsbG9jKQotCSAgICAgIHsKLQkJYWxsb2MgKz0gMTA7Ci0JCW5hbWVzID0gKChjb25zdCBjaGFyICoqKQotCQkJIHhyZWFsbG9jIChuYW1lcywgYWxsb2MgKiBzaXplb2YgKm5hbWVzKSk7Ci0JICAgICAgfQotCi0JICAgIG5hbWVzW2NdID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLQkgICAgaWYgKG5hbWVzW2NdID09IE5VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICArK2M7Ci0JICB9Ci0KLQluYW1lc1tjXSA9IE5VTEw7Ci0KLQl2YWxzID0gKGJmZF9zaWduZWRfdm1hICopIHhtYWxsb2MgKGMgKiBzaXplb2YgKnZhbHMpOwotCWZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0JICB2YWxzW2ldID0gaTsKLQotCXR5cGUgPSBkZWJ1Z19tYWtlX2VudW1fdHlwZSAoZGhhbmRsZSwgbmFtZXMsIHZhbHMpOwotCXRhZyA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgLyogU3RydWN0IHdpdGggYml0IGZpZWxkcy4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBzaXplOwotCXVuc2lnbmVkIGludCBhbGxvYzsKLQlkZWJ1Z19maWVsZCAqZmllbGRzOwotCXVuc2lnbmVkIGludCBjOwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaXplKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCWFsbG9jID0gMTA7Ci0JZmllbGRzID0gKGRlYnVnX2ZpZWxkICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpmaWVsZHMpOwotCWMgPSAwOwotCXdoaWxlICgxKQotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLQkgICAgYm9vbGVhbiBwcmVzZW50OwotCSAgICBkZWJ1Z190eXBlIGZ0eXBlOwotCSAgICBiZmRfdm1hIGJpdHBvcywgYml0c2l6ZTsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKCEgcHJlc2VudCkKLQkgICAgICBicmVhazsKLQkgICAgaWYgKCEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmZnR5cGUpCi0JCXx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZiaXRwb3MpCi0JCXx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZiaXRzaXplKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgaWYgKGMgKyAxID49IGFsbG9jKQotCSAgICAgIHsKLQkJYWxsb2MgKz0gMTA7Ci0JCWZpZWxkcyA9ICgoZGVidWdfZmllbGQgKikKLQkJCSAgeHJlYWxsb2MgKGZpZWxkcywgYWxsb2MgKiBzaXplb2YgKmZpZWxkcykpOwotCSAgICAgIH0KLQotCSAgICBmaWVsZHNbY10gPSBkZWJ1Z19tYWtlX2ZpZWxkIChkaGFuZGxlLCBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pLAotCQkJCQkgIGZ0eXBlLCBiaXRwb3MsIGJpdHNpemUsCi0JCQkJCSAgREVCVUdfVklTSUJJTElUWV9QVUJMSUMpOwotCSAgICBpZiAoZmllbGRzW2NdID09IE5VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICArK2M7Ci0JICB9Ci0KLQlmaWVsZHNbY10gPSBOVUxMOwotCi0JdHlwZSA9IGRlYnVnX21ha2Vfc3RydWN0X3R5cGUgKGRoYW5kbGUsIHRydWUsIHNpemUsIGZpZWxkcyk7Ci0JdGFnID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTic6Ci0gICAgICAvKiBFbnVtZXJhdGlvbi4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgaW50IGFsbG9jOwotCWNvbnN0IGNoYXIgKipuYW1lczsKLQliZmRfc2lnbmVkX3ZtYSAqdmFsczsKLQl1bnNpZ25lZCBpbnQgYzsKLQotCWFsbG9jID0gMTA7Ci0JbmFtZXMgPSAoY29uc3QgY2hhciAqKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKm5hbWVzKTsKLQl2YWxzID0gKGJmZF9zaWduZWRfdm1hICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpuYW1lcyk7Ci0JYyA9IDA7Ci0Jd2hpbGUgKDEpCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCSAgICBib29sZWFuIHByZXNlbnQ7Ci0JICAgIGJmZF92bWEgdmFsOwotCi0JICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuLCAmcHJlc2VudCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoISBwcmVzZW50KQotCSAgICAgIGJyZWFrOwotCSAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnZhbCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIC8qIElmIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgaXMgemVybywgdGhlbiB0aGUgdmFsdWUgaXMKLSAgICAgICAgICAgICAgIGFjdHVhbGx5IHRoZSBzaXplIG9mIHRoZSBlbnVtLiAgV2UgaWdub3JlIHRoaXMKLSAgICAgICAgICAgICAgIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotCSAgICBpZiAobmFtbGVuID09IDApCi0JICAgICAgY29udGludWU7Ci0KLQkgICAgaWYgKGMgKyAxID49IGFsbG9jKQotCSAgICAgIHsKLQkJYWxsb2MgKz0gMTA7Ci0JCW5hbWVzID0gKChjb25zdCBjaGFyICoqKQotCQkJIHhyZWFsbG9jIChuYW1lcywgYWxsb2MgKiBzaXplb2YgKm5hbWVzKSk7Ci0JCXZhbHMgPSAoKGJmZF9zaWduZWRfdm1hICopCi0JCQl4cmVhbGxvYyAodmFscywgYWxsb2MgKiBzaXplb2YgKnZhbHMpKTsKLQkgICAgICB9Ci0KLQkgICAgbmFtZXNbY10gPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotCSAgICBpZiAobmFtZXNbY10gPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIHZhbHNbY10gPSAoYmZkX3NpZ25lZF92bWEpIHZhbDsKLQkgICAgKytjOwotCSAgfQotCi0JbmFtZXNbY10gPSBOVUxMOwotCi0JdHlwZSA9IGRlYnVnX21ha2VfZW51bV90eXBlIChkaGFuZGxlLCBuYW1lcywgdmFscyk7Ci0JdGFnID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTyc6IC8qIFNtYWxsIHBvaW50ZXIuICBXZSBkb24ndCBkaXN0aW5ndWlzaCBzbWFsbCBhbmQgbGFyZ2UKLQkJIHBvaW50ZXJzLiAgRklYTUUuICAqLwotICAgIGNhc2UgJ1AnOiAvKiBMYXJnZSBwb2ludGVyLiAgKi8KLSAgICAgIHsKLQlkZWJ1Z190eXBlIHQ7Ci0KLQlpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZ0KSkKLQkgIHJldHVybiBmYWxzZTsKLQl0eXBlID0gZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKGRoYW5kbGUsIHQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdSJzoKLSAgICAgIC8qIFJhbmdlLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIGxvdywgaGlnaCwgc2lnbmVkcCwgc2l6ZTsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmbG93KQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmaGlnaCkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpZ25lZHApCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaXplKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCXR5cGUgPSBkZWJ1Z19tYWtlX3JhbmdlX3R5cGUgKGRoYW5kbGUsCi0JCQkJICAgICAgZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgc2l6ZSwKLQkJCQkJCQkgICAhIHNpZ25lZHApLAotCQkJCSAgICAgIChiZmRfc2lnbmVkX3ZtYSkgbG93LAotCQkJCSAgICAgIChiZmRfc2lnbmVkX3ZtYSkgaGlnaCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOiAvKiBTdHJ1Y3QuICAqLwotICAgIGNhc2UgJ1UnOiAvKiBVbmlvbi4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBzaXplOwotCXVuc2lnbmVkIGludCBhbGxvYzsKLQlkZWJ1Z19maWVsZCAqZmllbGRzOwotCXVuc2lnbmVkIGludCBjOwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaXplKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCWFsbG9jID0gMTA7Ci0JZmllbGRzID0gKGRlYnVnX2ZpZWxkICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpmaWVsZHMpOwotCWMgPSAwOwotCXdoaWxlICgxKQotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLQkgICAgYm9vbGVhbiBwcmVzZW50OwotCSAgICBiZmRfdm1hIHRpbmR4OwotCSAgICBiZmRfdm1hIG9mZnNldDsKLQkgICAgZGVidWdfdHlwZSBmdHlwZTsKLQkgICAgYmZkX3ZtYSBiaXRzaXplOwotCi0JICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuLCAmcHJlc2VudCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoISBwcmVzZW50KQotCSAgICAgIGJyZWFrOwotCSAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnRpbmR4KQotCQl8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmb2Zmc2V0KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgaWYgKHRpbmR4IDwgMjU2KQotCSAgICAgIHsKLQkJZnR5cGUgPSBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgdHlfY29kZV9zdGFydCwgdGluZHgpOwotCQliaXRzaXplID0gMDsKLQkJb2Zmc2V0ICo9IDg7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlzdHJ1Y3QgaWVlZV90eXBlICp0OwotCi0JCXRpbmR4IC09IDI1NjsKLQkJaWYgKCEgaWVlZV9hbGxvY190eXBlIChpbmZvLCB0aW5keCwgdHJ1ZSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQl0ID0gaW5mby0+dHlwZXMudHlwZXMgKyB0aW5keDsKLQkJZnR5cGUgPSB0LT50eXBlOwotCQliaXRzaXplID0gdC0+Yml0c2l6ZTsKLQkJaWYgKGJpdHNpemUgPT0gMCkKLQkJICBvZmZzZXQgKj0gODsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGMgKyAxID49IGFsbG9jKQotCSAgICAgIHsKLQkJYWxsb2MgKz0gMTA7Ci0JCWZpZWxkcyA9ICgoZGVidWdfZmllbGQgKikKLQkJCSAgeHJlYWxsb2MgKGZpZWxkcywgYWxsb2MgKiBzaXplb2YgKmZpZWxkcykpOwotCSAgICAgIH0KLQotCSAgICBmaWVsZHNbY10gPSBkZWJ1Z19tYWtlX2ZpZWxkIChkaGFuZGxlLCBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pLAotCQkJCQkgIGZ0eXBlLCBvZmZzZXQsIGJpdHNpemUsCi0JCQkJCSAgREVCVUdfVklTSUJJTElUWV9QVUJMSUMpOwotCSAgICBpZiAoZmllbGRzW2NdID09IE5VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICArK2M7Ci0JICB9Ci0KLQlmaWVsZHNbY10gPSBOVUxMOwotCi0JdHlwZSA9IGRlYnVnX21ha2Vfc3RydWN0X3R5cGUgKGRoYW5kbGUsIHRjID09ICdTJywgc2l6ZSwgZmllbGRzKTsKLQl0YWcgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIC8qIFR5cGVkZWYuICAqLwotICAgICAgaWYgKCEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdHlwZGVmID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWCc6Ci0gICAgICAvKiBQcm9jZWR1cmUuICBGSVhNRTogVGhpcyBpcyBhbiBleHRlcm4gZGVjbGFyYXRpb24sIHdoaWNoIHdlCi0gICAgICAgICBoYXZlIG5vIHdheSBvZiByZXByZXNlbnRpbmcuICAqLwotICAgICAgewotCWJmZF92bWEgYXR0cjsKLQlkZWJ1Z190eXBlIHJ0eXBlOwotCWJmZF92bWEgbmFyZ3M7Ci0JYm9vbGVhbiBwcmVzZW50OwotCXN0cnVjdCBpZWVlX3ZhciAqcHY7Ci0KLQkvKiBGSVhNRTogV2UgaWdub3JlIHRoZSBhdHRyaWJ1dGUgYW5kIHRoZSBhcmd1bWVudCBuYW1lcy4gICovCi0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmF0dHIpCi0JICAgIHx8ICEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmcnR5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZuYXJncykpCi0JICByZXR1cm4gZmFsc2U7Ci0JZG8KLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0Jd2hpbGUgKHByZXNlbnQpOwotCi0JcHYgPSBpbmZvLT52YXJzLnZhcnMgKyB2YXJpbmR4OwotCXB2LT5raW5kID0gSUVFRV9FWFRFUk5BTDsKLQlpZiAocHYtPm5hbWxlbiA+IDAKLQkgICAgJiYgZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgcnR5cGUpID09IERFQlVHX0tJTkRfUE9JTlRFUikKLQkgIHsKLQkgICAgLyogU2V0IHVwIHRoZSByZXR1cm4gdHlwZSBhcyBhbiBpbmRpcmVjdCB0eXBlIHBvaW50aW5nIHRvCi0gICAgICAgICAgICAgICB0aGUgdmFyaWFibGUgc2xvdCwgc28gdGhhdCB3ZSBjYW4gY2hhbmdlIGl0IHRvIGEKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZSBsYXRlciBpZiBhcHByb3ByaWF0ZS4gICovCi0JICAgIHB2LT5wc2xvdCA9IChkZWJ1Z190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqcHYtPnBzbG90KTsKLQkgICAgKnB2LT5wc2xvdCA9IHJ0eXBlOwotCSAgICBydHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgcHYtPnBzbG90LAotCQkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkgIH0KLQotCXR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGRoYW5kbGUsIHJ0eXBlLCAoZGVidWdfdHlwZSAqKSBOVUxMLAotCQkJCQkgZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgIC8qIFZvaWQuICBUaGlzIGlzIG5vdCBkb2N1bWVudGVkLCBidXQgdGhlIE1SSSBjb21waWxlciBlbWl0cyBpdC4gICovCi0gICAgICB0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdaJzoKLSAgICAgIC8qIEFycmF5IHdpdGggMCBsb3dlciBib3VuZC4gICovCi0gICAgICB7Ci0JZGVidWdfdHlwZSBldHlwZTsKLQliZmRfdm1hIGhpZ2g7Ci0KLQlpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZldHlwZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmhpZ2gpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JdHlwZSA9IGRlYnVnX21ha2VfYXJyYXlfdHlwZSAoZGhhbmRsZSwgZXR5cGUsCi0JCQkJICAgICAgaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHR5X2NvZGVfc3RhcnQsCi0JCQkJCQkJICgodW5zaWduZWQgaW50KQotCQkJCQkJCSAgYnVpbHRpbl9pbnQpKSwKLQkJCQkgICAgICAwLCAoYmZkX3NpZ25lZF92bWEpIGhpZ2gsIGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYyc6IC8qIENvbXBsZXguICAqLwotICAgIGNhc2UgJ2QnOiAvKiBEb3VibGUgY29tcGxleC4gICovCi0gICAgICB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQl1bnNpZ25lZCBsb25nIG5hbWxlbjsKLQotCS8qIEZJWE1FOiBJIGRvbid0IGtub3cgd2hhdCB0aGUgbmFtZSBtZWFucy4gICovCi0KLQlpZiAoISBpZWVlX3JlYWRfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgKGRoYW5kbGUsIHRjID09ICdjJyA/IDQgOiA4KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZic6Ci0gICAgICAvKiBQYXNjYWwgZmlsZSBuYW1lLiAgRklYTUUuICAqLwotICAgICAgaWVlZV9lcnJvciAoaW5mbywgdHlfY29kZV9zdGFydCwgXygiUGFzY2FsIGZpbGUgbmFtZSBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY2FzZSAnZyc6Ci0gICAgICAvKiBCaXRmaWVsZCB0eXBlLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpZ25lZHAsIGJpdHNpemUsIGR1bW15OwotCWNvbnN0IGJmZF9ieXRlICpob2xkOwotCWJvb2xlYW4gcHJlc2VudDsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2lnbmVkcCkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmJpdHNpemUpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogSSB0aGluayB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIHRoYXQgdGhlcmUgaXMgYSB0eXBlIGluZGV4LAotICAgICAgICAgICBidXQgc29tZSBhY3R1YWwgZmlsZXMgZG8gbm90IGhhdmUgb25lLiAgKi8KLQlob2xkID0gKnBwOwotCWlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmZHVtbXksICZwcmVzZW50KSkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAoISBwcmVzZW50KQotCSAgewotCSAgICAvKiBGSVhNRTogVGhpcyBpcyBqdXN0IGEgZ3Vlc3MuICAqLwotCSAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwKLQkJCQkJc2lnbmVkcCA/IGZhbHNlIDogdHJ1ZSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAqcHAgPSBob2xkOwotCSAgICBpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZ0eXBlKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JdHlwZV9iaXRzaXplID0gYml0c2l6ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnbic6Ci0gICAgICAvKiBRdWFsaWZpZXIuICAqLwotICAgICAgewotCWJmZF92bWEga2luZDsKLQlkZWJ1Z190eXBlIHQ7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmtpbmQpCi0JICAgIHx8ICEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmdCkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQlzd2l0Y2ggKGtpbmQpCi0JICB7Ci0JICBkZWZhdWx0OgotCSAgICBpZWVlX2Vycm9yIChpbmZvLCB0eV9zdGFydCwgXygidW5zdXBwb3J0ZWQgcXVhbGlmZXIiKSk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgY2FzZSAxOgotCSAgICB0eXBlID0gZGVidWdfbWFrZV9jb25zdF90eXBlIChkaGFuZGxlLCB0KTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMjoKLQkgICAgdHlwZSA9IGRlYnVnX21ha2Vfdm9sYXRpbGVfdHlwZSAoZGhhbmRsZSwgdCk7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICAgIC8qIFNldC4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBzaXplOwotCWRlYnVnX3R5cGUgZXR5cGU7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmZXR5cGUpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogRklYTUU6IFdlIGlnbm9yZSB0aGUgc2l6ZS4gICovCi0KLQl0eXBlID0gZGVidWdfbWFrZV9zZXRfdHlwZSAoZGhhbmRsZSwgZXR5cGUsIGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgICAvKiBQcm9jZWR1cmUgd2l0aCBjb21waWxlciBkZXBlbmRlbmNpZXMuICAqLwotICAgICAgewotCXN0cnVjdCBpZWVlX3ZhciAqcHY7Ci0JYmZkX3ZtYSBhdHRyLCBmcmFtZV90eXBlLCBwdXNoX21hc2ssIG5hcmdzLCBsZXZlbCwgZmF0aGVyOwotCWRlYnVnX3R5cGUgcnR5cGU7Ci0JZGVidWdfdHlwZSAqYXJnX3R5cGVzOwotCWJvb2xlYW4gdmFyYXJnczsKLQlib29sZWFuIHByZXNlbnQ7Ci0KLQkvKiBGSVhNRTogV2UgaWdub3JlIHNvbWUgb2YgdGhpcyBpbmZvcm1hdGlvbi4gICovCi0KLQlwdiA9IGluZm8tPnZhcnMudmFycyArIHZhcmluZHg7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmF0dHIpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZmcmFtZV90eXBlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmcHVzaF9tYXNrKQotCSAgICB8fCAhIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnJ0eXBlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmbmFyZ3MpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChuYXJncyA9PSAoYmZkX3ZtYSkgLTEpCi0JICB7Ci0JICAgIGFyZ190eXBlcyA9IE5VTEw7Ci0JICAgIHZhcmFyZ3MgPSBmYWxzZTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBpOwotCi0JICAgIGFyZ190eXBlcyA9ICgoZGVidWdfdHlwZSAqKQotCQkJIHhtYWxsb2MgKChuYXJncyArIDEpICogc2l6ZW9mICphcmdfdHlwZXMpKTsKLQkgICAgZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCi0JICAgICAgaWYgKCEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCBhcmdfdHlwZXMgKyBpKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgIC8qIElmIHRoZSBsYXN0IHR5cGUgaXMgcG9pbnRlciB0byB2b2lkLCB0aGlzIGlzIHJlYWxseSBhCi0gICAgICAgICAgICAgICB2YXJhcmdzIGZ1bmN0aW9uLiAgKi8KLQkgICAgdmFyYXJncyA9IGZhbHNlOwotCSAgICBpZiAobmFyZ3MgPiAwKQotCSAgICAgIHsKLQkJZGVidWdfdHlwZSBsYXN0OwotCi0JCWxhc3QgPSBhcmdfdHlwZXNbbmFyZ3MgLSAxXTsKLQkJaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIGxhc3QpID09IERFQlVHX0tJTkRfUE9JTlRFUgotCQkgICAgJiYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsCi0JCQkJCSAgICAgZGVidWdfZ2V0X3RhcmdldF90eXBlIChkaGFuZGxlLAotCQkJCQkJCQkgICAgbGFzdCkpCi0JCQk9PSBERUJVR19LSU5EX1ZPSUQpKQotCQkgIHsKLQkJICAgIC0tbmFyZ3M7Ci0JCSAgICB2YXJhcmdzID0gdHJ1ZTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIC8qIElmIHRoZXJlIGFyZSBhbnkgcG9pbnRlciBhcmd1bWVudHMsIHR1cm4gdGhlbSBpbnRvCi0gICAgICAgICAgICAgICBpbmRpcmVjdCB0eXBlcyBpbiBjYXNlIHdlIGxhdGVyIG5lZWQgdG8gY29udmVydCB0aGVtIHRvCi0gICAgICAgICAgICAgICByZWZlcmVuY2UgdHlwZXMuICAqLwotCSAgICBmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKLQkgICAgICB7Ci0JCWlmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBhcmdfdHlwZXNbaV0pCi0JCSAgICA9PSBERUJVR19LSU5EX1BPSU5URVIpCi0JCSAgewotCQkgICAgaWYgKGFyZ19zbG90cyA9PSBOVUxMKQotCQkgICAgICB7Ci0JCQlhcmdfc2xvdHMgPSAoKGRlYnVnX3R5cGUgKikKLQkJCQkgICAgIHhtYWxsb2MgKG5hcmdzICogc2l6ZW9mICphcmdfc2xvdHMpKTsKLQkJCW1lbXNldCAoYXJnX3Nsb3RzLCAwLCBuYXJncyAqIHNpemVvZiAqYXJnX3Nsb3RzKTsKLQkJICAgICAgfQotCQkgICAgYXJnX3Nsb3RzW2ldID0gYXJnX3R5cGVzW2ldOwotCQkgICAgYXJnX3R5cGVzW2ldID0KLQkJICAgICAgZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLAotCQkJCQkJYXJnX3Nsb3RzICsgaSwKLQkJCQkJCShjb25zdCBjaGFyICopIE5VTEwpOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgYXJnX3R5cGVzW25hcmdzXSA9IERFQlVHX1RZUEVfTlVMTDsKLQkgIH0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmxldmVsKQotCSAgICB8fCAhIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmZmF0aGVyLCAmcHJlc2VudCkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBXZSBjYW4ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgZ2xvYmFsIGZ1bmN0aW9uIGFuZCBhIHN0YXRpYwotICAgICAgICAgICBmdW5jdGlvbi4gICovCi0JcHYtPmtpbmQgPSBJRUVFX0ZVTkNUSU9OOwotCi0JaWYgKHB2LT5uYW1sZW4gPiAwCi0JICAgICYmIGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIHJ0eXBlKSA9PSBERUJVR19LSU5EX1BPSU5URVIpCi0JICB7Ci0JICAgIC8qIFNldCB1cCB0aGUgcmV0dXJuIHR5cGUgYXMgYW4gaW5kaXJlY3QgdHlwZSBwb2ludGluZyB0bwotICAgICAgICAgICAgICAgdGhlIHZhcmlhYmxlIHNsb3QsIHNvIHRoYXQgd2UgY2FuIGNoYW5nZSBpdCB0byBhCi0gICAgICAgICAgICAgICByZWZlcmVuY2UgbGF0ZXIgaWYgYXBwcm9wcmlhdGUuICAqLwotCSAgICBwdi0+cHNsb3QgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnB2LT5wc2xvdCk7Ci0JICAgICpwdi0+cHNsb3QgPSBydHlwZTsKLQkgICAgcnR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsIHB2LT5wc2xvdCwKLQkJCQkJICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0JICB9Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlIChkaGFuZGxlLCBydHlwZSwgYXJnX3R5cGVzLCB2YXJhcmdzKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBSZWNvcmQgdGhlIHR5cGUgaW4gdGhlIHRhYmxlLiAgKi8KLQotICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS50eXBlID0gdHlwZTsKLQotICBpZiAoKHRhZyB8fCB0eXBkZWYpCi0gICAgICAmJiBpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0ubmFtbGVuID4gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICBuYW1lID0gc2F2ZXN0cmluZyAoaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLm5hbWUsCi0JCQkgaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLm5hbWxlbik7Ci0gICAgICBpZiAodHlwZGVmKQotCXR5cGUgPSBkZWJ1Z19uYW1lX3R5cGUgKGRoYW5kbGUsIG5hbWUsIHR5cGUpOwotICAgICAgZWxzZSBpZiAodGMgPT0gJ0UnIHx8IHRjID09ICdOJykKLQl0eXBlID0gZGVidWdfdGFnX3R5cGUgKGRoYW5kbGUsIG5hbWUsIHR5cGUpOwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBpZWVlX3RhZyAqaXQ7Ci0KLQkgIC8qIFdlIG11c3QgYWxsb2NhdGUgYWxsIHN0cnVjdCB0YWdzIGFzIGluZGlyZWN0IHR5cGVzLCBzbwotICAgICAgICAgICAgIHRoYXQgaWYgd2UgbGF0ZXIgc2VlIGEgZGVmaW5pdGlvbiBvZiB0aGUgdGFnIGFzIGEgQysrCi0gICAgICAgICAgICAgcmVjb3JkIHdlIGNhbiB1cGRhdGUgdGhlIGluZGlyZWN0IHNsb3QgYW5kIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICBjaGFuZ2UgYWxsIHRoZSBleGlzdGluZyByZWZlcmVuY2VzLiAgKi8KLQkgIGl0ID0gKHN0cnVjdCBpZWVlX3RhZyAqKSB4bWFsbG9jIChzaXplb2YgKml0KTsKLQkgIG1lbXNldCAoaXQsIDAsIHNpemVvZiAqaXQpOwotCSAgaXQtPm5leHQgPSBpbmZvLT50YWdzOwotCSAgaW5mby0+dGFncyA9IGl0OwotCSAgaXQtPm5hbWUgPSBuYW1lOwotCSAgaXQtPnNsb3QgPSB0eXBlOwotCi0JICB0eXBlID0gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLCAmaXQtPnNsb3QsIG5hbWUpOwotCSAgdHlwZSA9IGRlYnVnX3RhZ190eXBlIChkaGFuZGxlLCBuYW1lLCB0eXBlKTsKLQotCSAgaXQtPnR5cGUgPSB0eXBlOwotCX0KLSAgICAgIGlmICh0eXBlID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLT50eXBlcy50eXBlc1t0eXBlaW5keF0udHlwZSA9IHR5cGU7Ci0gIGluZm8tPnR5cGVzLnR5cGVzW3R5cGVpbmR4XS5hcmdfc2xvdHMgPSBhcmdfc2xvdHM7Ci0gIGluZm8tPnR5cGVzLnR5cGVzW3R5cGVpbmR4XS5iaXRzaXplID0gdHlwZV9iaXRzaXplOwotCi0gIC8qIFdlIG1heSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHR5cGUgYXMgYW4gaW5kaXJlY3QgdHlwZSBwb2ludGluZwotICAgICB0byBzbG90LiAgSXQgZG9lcyBubyBoYXJtIHRvIHJlcGxhY2UgdGhlIGluZGlyZWN0IHR5cGUgd2l0aCB0aGUKLSAgICAgcmVhbCB0eXBlLiAgRmlsbGluZyBpbiBzbG90IGFzIHdlbGwgaGFuZGxlcyB0aGUgaW5kaXJlY3QgdHlwZXMKLSAgICAgd2hpY2ggYXJlIGFscmVhZHkgaGFuZ2luZyBhcm91bmQuICAqLwotICBpZiAoaW5mby0+dHlwZXMudHlwZXNbdHlwZWluZHhdLnBzbG90ICE9IE5VTEwpCi0gICAgKmluZm8tPnR5cGVzLnR5cGVzW3R5cGVpbmR4XS5wc2xvdCA9IHR5cGU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGFuIEFUTiByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfaWVlZV9hdG4gKGluZm8sIHBwKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotewotICBjb25zdCBiZmRfYnl0ZSAqYXRuX3N0YXJ0LCAqYXRuX2NvZGVfc3RhcnQ7Ci0gIGJmZF92bWEgdmFyaW5keDsKLSAgc3RydWN0IGllZWVfdmFyICpwdmFyOwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIGJmZF92bWEgYXRuX2NvZGU7Ci0gIFBUUiBkaGFuZGxlOwotICBiZmRfdm1hIHYsIHYyLCB2MywgdjQsIHY1OwotICBjb25zdCBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLSAgY2hhciAqbmFtY29weTsKLSAgYm9vbGVhbiBwcmVzZW50OwotICBpbnQgYmxvY2t0eXBlOwotCi0gIGF0bl9zdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnZhcmluZHgpCi0gICAgICB8fCAhIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnR5cGUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhdG5fY29kZV9zdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmF0bl9jb2RlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHZhcmluZHggPT0gMCkKLSAgICB7Ci0gICAgICBwdmFyID0gTlVMTDsKLSAgICAgIG5hbWUgPSAiIjsKLSAgICAgIG5hbWxlbiA9IDA7Ci0gICAgfQotICBlbHNlIGlmICh2YXJpbmR4IDwgMzIpCi0gICAgewotICAgICAgLyogVGhlIE1SSSBjb21waWxlciByZXBvcnRlZGx5IHNvbWV0aW1lcyBlbWl0cyB2YXJpYWJsZSBsaWZldGltZQotICAgICAgICAgaW5mb3JtYXRpb24gZm9yIGEgcmVnaXN0ZXIuICBXZSBqdXN0IGlnbm9yZSBpdC4gICovCi0gICAgICBpZiAoYXRuX2NvZGUgPT0gOSkKLQlyZXR1cm4gaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KTsKLQotICAgICAgaWVlZV9lcnJvciAoaW5mbywgYXRuX3N0YXJ0LCBfKCJpbGxlZ2FsIHZhcmlhYmxlIGluZGV4IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHZhcmluZHggLT0gMzI7Ci0gICAgICBpZiAodmFyaW5keCA+PSBpbmZvLT52YXJzLmFsbG9jCi0JICB8fCBpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIFRoZSBNUkkgY29tcGlsZXIgb3IgbGlua2VyIHNvbWV0aW1lcyBvbWl0cyB0aGUgTk4gcmVjb3JkCi0gICAgICAgICAgICAgZm9yIGEgcG1pc2MgcmVjb3JkLiAgKi8KLQkgIGlmIChhdG5fY29kZSA9PSA2MikKLQkgICAgewotCSAgICAgIGlmICh2YXJpbmR4ID49IGluZm8tPnZhcnMuYWxsb2MpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLQkJICBhbGxvYyA9IGluZm8tPnZhcnMuYWxsb2M7Ci0JCSAgaWYgKGFsbG9jID09IDApCi0JCSAgICBhbGxvYyA9IDQ7Ci0JCSAgd2hpbGUgKHZhcmluZHggPj0gYWxsb2MpCi0JCSAgICBhbGxvYyAqPSAyOwotCQkgIGluZm8tPnZhcnMudmFycyA9ICgoc3RydWN0IGllZWVfdmFyICopCi0JCQkJICAgICB4cmVhbGxvYyAoaW5mby0+dmFycy52YXJzLAotCQkJCQkgICAgICAgKGFsbG9jCi0JCQkJCQkqIHNpemVvZiAqaW5mby0+dmFycy52YXJzKSkpOwotCQkgIG1lbXNldCAoaW5mby0+dmFycy52YXJzICsgaW5mby0+dmFycy5hbGxvYywgMCwKLQkJCSAgKChhbGxvYyAtIGluZm8tPnZhcnMuYWxsb2MpCi0JCQkgICAqIHNpemVvZiAqaW5mby0+dmFycy52YXJzKSk7Ci0JCSAgaW5mby0+dmFycy5hbGxvYyA9IGFsbG9jOwotCQl9Ci0KLQkgICAgICBwdmFyID0gaW5mby0+dmFycy52YXJzICsgdmFyaW5keDsKLQkgICAgICBwdmFyLT5uYW1lID0gIiI7Ci0JICAgICAgcHZhci0+bmFtbGVuID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWVlZV9lcnJvciAoaW5mbywgYXRuX3N0YXJ0LCBfKCJ1bmRlZmluZWQgdmFyaWFibGUgaW4gQVROIikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgcHZhciA9IGluZm8tPnZhcnMudmFycyArIHZhcmluZHg7Ci0KLSAgICAgIHB2YXItPnR5cGUgPSB0eXBlOwotCi0gICAgICBuYW1lID0gcHZhci0+bmFtZTsKLSAgICAgIG5hbWxlbiA9IHB2YXItPm5hbWxlbjsKLSAgICB9Ci0KLSAgZGhhbmRsZSA9IGluZm8tPmRoYW5kbGU7Ci0KLSAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIGNhbGwgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIHdpdGggYSBwb2ludGVyCi0gICAgIHR5cGUsIGNoYW5nZSB0aGUgdHlwZSB0byBhbiBpbmRpcmVjdCB0eXBlIHNvIHRoYXQgd2UgY2FuIGxhdGVyCi0gICAgIGNoYW5nZSBpdCB0byBhIHJlZmVyZW5jZSB0eXBlIGlmIHdlIGVuY291bnRlciBhIEMrKyBwbWlzYyAnUicKLSAgICAgcmVjb3JkLiAgKi8KLSAgaWYgKHB2YXIgIT0gTlVMTAotICAgICAgJiYgdHlwZSAhPSBERUJVR19UWVBFX05VTEwKLSAgICAgICYmIGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIHR5cGUpID09IERFQlVHX0tJTkRfUE9JTlRFUikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGF0bl9jb2RlKQotCXsKLQljYXNlIDE6Ci0JY2FzZSAyOgotCWNhc2UgMzoKLQljYXNlIDU6Ci0JY2FzZSA4OgotCWNhc2UgMTA6Ci0JICBwdmFyLT5wc2xvdCA9IChkZWJ1Z190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqcHZhci0+cHNsb3QpOwotCSAgKnB2YXItPnBzbG90ID0gdHlwZTsKLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsIHB2YXItPnBzbG90LAotCQkJCQkgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkgIHB2YXItPnR5cGUgPSB0eXBlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBzd2l0Y2ggKGF0bl9jb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWVlZV9lcnJvciAoaW5mbywgYXRuX2NvZGVfc3RhcnQsIF8oInVua25vd24gQVROIHR5cGUiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICAvKiBBdXRvbWF0aWMgdmFyaWFibGUuICAqLwotICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBuYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLSAgICAgIGlmICh0eXBlID09IE5VTEwpCi0JdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIGlmIChwdmFyICE9IE5VTEwpCi0JcHZhci0+a2luZCA9IElFRUVfTE9DQUw7Ci0gICAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1jb3B5LCB0eXBlLCBERUJVR19MT0NBTCwgdik7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICAvKiBSZWdpc3RlciB2YXJpYWJsZS4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQl0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9MT0NBTDsKLSAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksIHR5cGUsIERFQlVHX1JFR0lTVEVSLAotCQkJCSAgICBpZWVlX3JlZ25vX3RvX2dlbnJlZyAoaW5mby0+YWJmZCwgdikpOwotCi0gICAgY2FzZSAzOgotICAgICAgLyogU3RhdGljIHZhcmlhYmxlLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0gICAgICBpZiAodHlwZSA9PSBOVUxMKQotCXR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBpZiAoaW5mby0+YmxvY2tzdGFjay5ic3AgPD0gaW5mby0+YmxvY2tzdGFjay5zdGFjaykKLQlibG9ja3R5cGUgPSAwOwotICAgICAgZWxzZQotCWJsb2NrdHlwZSA9IGluZm8tPmJsb2Nrc3RhY2suYnNwWy0xXS5raW5kOwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQl7Ci0JICBpZiAoYmxvY2t0eXBlID09IDQgfHwgYmxvY2t0eXBlID09IDYpCi0JICAgIHB2YXItPmtpbmQgPSBJRUVFX0xPQ0FMOwotCSAgZWxzZQotCSAgICBwdmFyLT5raW5kID0gSUVFRV9TVEFUSUM7Ci0JfQotICAgICAgcmV0dXJuIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgbmFtY29weSwgdHlwZSwKLQkJCQkgICAgKGJsb2NrdHlwZSA9PSA0IHx8IGJsb2NrdHlwZSA9PSA2Ci0JCQkJICAgICA/IERFQlVHX0xPQ0FMX1NUQVRJQwotCQkJCSAgICAgOiBERUJVR19TVEFUSUMpLAotCQkJCSAgICB2KTsKLQotICAgIGNhc2UgNDoKLSAgICAgIC8qIEV4dGVybmFsIGZ1bmN0aW9uLiAgV2UgZG9uJ3QgY3VycmVudGx5IHJlY29yZCB0aGVzZS4gIEZJWE1FLiAgKi8KLSAgICAgIGlmIChwdmFyICE9IE5VTEwpCi0JcHZhci0+a2luZCA9IElFRUVfRVhURVJOQUw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgNToKLSAgICAgIC8qIEV4dGVybmFsIHZhcmlhYmxlLiAgV2UgZG9uJ3QgY3VycmVudGx5IHJlY29yZCB0aGVzZS4gIEZJWE1FLiAgKi8KLSAgICAgIGlmIChwdmFyICE9IE5VTEwpCi0JcHZhci0+a2luZCA9IElFRUVfRVhURVJOQUw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgNzoKLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2MikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2MywgJnByZXNlbnQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChwcmVzZW50KQotCXsKLQkgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjQsICZwcmVzZW50KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UganVzdCBpZ25vcmUgdGhlIHR3byBvcHRpb25hbCBmaWVsZHMgaW4gdjMgYW5kIHY0LCBzaW5jZQotICAgICAgICAgdGhleSBhcmUgbm90IGRlZmluZWQuICAqLwotCi0gICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnYzKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGUgY29sdW1uIG51bWJlci4gIEZJWE1FLiAgKi8KLQotICAgICAgcmV0dXJuIGRlYnVnX3JlY29yZF9saW5lIChkaGFuZGxlLCB2LCB2Myk7Ci0KLSAgICBjYXNlIDg6Ci0gICAgICAvKiBHbG9iYWwgdmFyaWFibGUuICAqLwotICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBuYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLSAgICAgIGlmICh0eXBlID09IE5VTEwpCi0JdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIGlmIChwdmFyICE9IE5VTEwpCi0JcHZhci0+a2luZCA9IElFRUVfR0xPQkFMOwotICAgICAgcmV0dXJuIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgbmFtY29weSwgdHlwZSwgREVCVUdfR0xPQkFMLCB2KTsKLQotICAgIGNhc2UgOToKLSAgICAgIC8qIFZhcmlhYmxlIGxpZmV0aW1lIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbi4gIEZJWE1FLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSAxMDoKLSAgICAgIC8qIExvY2tlZCByZWdpc3Rlci4gIFRoZSBzcGVjIHNheXMgdGhhdCB0aGVyZSBhcmUgdHdvIHJlcXVpcmVkCi0gICAgICAgICBmaWVsZHMsIGJ1dCBhdCBsZWFzdCBvbiBvY2Nhc2lvbiB0aGUgTVJJIGNvbXBpbGVyIG9ubHkgZW1pdHMKLSAgICAgICAgIG9uZS4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpCi0JICB8fCAhIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjIsICZwcmVzZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEkgdGhpbmsgdGhpcyBtZWFucyBhIHZhcmlhYmxlIHRoYXQgaXMgYm90aCBpbiBhIHJlZ2lzdGVyIGFuZAotICAgICAgICAgYSBmcmFtZSBzbG90LiAgV2UgaWdub3JlIHRoZSBmcmFtZSBzbG90LiAgRklYTUUuICAqLwotCi0gICAgICBuYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLSAgICAgIGlmICh0eXBlID09IE5VTEwpCi0JdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIGlmIChwdmFyICE9IE5VTEwpCi0JcHZhci0+a2luZCA9IElFRUVfTE9DQUw7Ci0gICAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1jb3B5LCB0eXBlLCBERUJVR19SRUdJU1RFUiwgdik7Ci0KLSAgICBjYXNlIDExOgotICAgICAgLyogUmVzZXJ2ZWQgZm9yIEZPUlRSQU4gY29tbW9uLiAgKi8KLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIGF0bl9jb2RlX3N0YXJ0LCBfKCJ1bnN1cHBvcnRlZCBBVE4xMSIpKTsKLQotICAgICAgLyogUmV0dXJuIHRydWUgdG8ga2VlcCBnb2luZy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgMTI6Ci0gICAgICAvKiBCYXNlZCB2YXJpYWJsZS4gICovCi0gICAgICB2MyA9IDA7Ci0gICAgICB2NCA9IDB4ODA7Ci0gICAgICB2NSA9IDA7Ci0gICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpCi0JICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdjIpCi0JICB8fCAhIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjMsICZwcmVzZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocHJlc2VudCkKLQl7Ci0JICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnY0LCAmcHJlc2VudCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChwcmVzZW50KQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2NSwgJnByZXNlbnQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotCi0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fY29kZV9zdGFydCwgXygidW5zdXBwb3J0ZWQgQVROMTIiKSk7Ci0KLSAgICAgIC8qIFJldHVybiB0cnVlIHRvIGtlZXAgZ29pbmcuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIDE2OgotICAgICAgLyogQ29uc3RhbnQuICBUaGUgZGVzY3JpcHRpb24gb2YgdGhpcyB0aGF0IEkgaGF2ZSBpcyBhbWJpZ3VvdXMsCi0gICAgICAgICBzbyBJJ20gbm90IGdvaW5nIHRvIHRyeSB0byBpbXBsZW1lbnQgaXQuICAqLwotICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KQotCSAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnYyLCAmcHJlc2VudCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHByZXNlbnQpCi0JewotCSAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2MiwgJnByZXNlbnQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAocHJlc2VudCkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuLCAmcHJlc2VudCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHAgPT0gaWVlZV9lMl9maXJzdF9ieXRlX2VudW0pCi0JewotCSAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2MykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSAxOToKLSAgICAgIC8qIFN0YXRpYyB2YXJpYWJsZSBmcm9tIGFzc2VtYmxlci4gICovCi0gICAgICB2MiA9IDA7Ci0gICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpCi0JICB8fCAhIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjIsICZwcmVzZW50KQotCSAgfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnYzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBuYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLSAgICAgIC8qIFdlIGRvbid0IHJlYWxseSBoYW5kbGUgdGhpcyBjb3JyZWN0bHkuICBGSVhNRS4gICovCi0gICAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1jb3B5LAotCQkJCSAgICBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSksCi0JCQkJICAgIHYyICE9IDAgPyBERUJVR19HTE9CQUwgOiBERUJVR19TVEFUSUMsCi0JCQkJICAgIHYzKTsKLQotICAgIGNhc2UgNjI6Ci0gICAgICAvKiBQcm9jZWR1cmUgbWlzY2VsbGFuZW91cyBpbmZvcm1hdGlvbi4gICovCi0gICAgY2FzZSA2MzoKLSAgICAgIC8qIFZhcmlhYmxlIG1pc2NlbGxhbmVvdXMgaW5mb3JtYXRpb24uICAqLwotICAgIGNhc2UgNjQ6Ci0gICAgICAvKiBNb2R1bGUgbWlzY2VsbGFuZW91cyBpbmZvcm1hdGlvbi4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpCi0JICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdjIpCi0JICB8fCAhIGllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuLCAmcHJlc2VudCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYXRuX2NvZGUgPT0gNjIgJiYgdiA9PSA4MCkKLQl7Ci0JICBpZiAocHJlc2VudCkKLQkgICAgewotCSAgICAgIGllZWVfZXJyb3IgKGluZm8sIGF0bl9jb2RlX3N0YXJ0LAotCQkJICBfKCJ1bmV4cGVjdGVkIHN0cmluZyBpbiBDKysgbWlzYyIpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIHJldHVybiBpZWVlX3JlYWRfY3h4X21pc2MgKGluZm8sIHBwLCB2Mik7Ci0JfQotCi0gICAgICAvKiBXZSBqdXN0IGlnbm9yZSBhbGwgb2YgdGhpcyBzdHVmZi4gIEZJWE1FLiAgKi8KLQotICAgICAgZm9yICg7IHYyID4gMDsgLS12MikKLQl7Ci0JICBzd2l0Y2ggKChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHApCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBpZWVlX2Vycm9yIChpbmZvLCAqcHAsIF8oImJhZCBtaXNjIHJlY29yZCIpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgY2FzZSBpZWVlX2F0X3JlY29yZF9lbnVtOgotCSAgICAgIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgaWVlZV9lMl9maXJzdF9ieXRlX2VudW06Ci0JICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2MykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIEhhbmRsZSBDKysgZGVidWdnaW5nIG1pc2NlbGxhbmVvdXMgcmVjb3Jkcy4gIFRoaXMgaXMgY2FsbGVkIGZvcgotICAgcHJvY2VkdXJlIG1pc2NlbGxhbmVvdXMgcmVjb3JkcyBvZiB0eXBlIDgwLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9jeHhfbWlzYyAoaW5mbywgcHAsIGNvdW50KQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICB1bnNpZ25lZCBsb25nIGNvdW50OwotewotICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7Ci0gIGJmZF92bWEgY2F0ZWdvcnk7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0KLSAgLyogR2V0IHRoZSBjYXRlZ29yeSBvZiBDKysgbWlzYyByZWNvcmQuICAqLwotICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNhdGVnb3J5KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC0tY291bnQ7Ci0KLSAgc3dpdGNoIChjYXRlZ29yeSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bnJlY29nbml6ZWQgQysrIG1pc2MgcmVjb3JkIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICBpZiAoISBpZWVlX3JlYWRfY3h4X2NsYXNzIChpbmZvLCBwcCwgY291bnQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTSc6Ci0gICAgICB7Ci0JYmZkX3ZtYSBmbGFnczsKLQljb25zdCBjaGFyICpuYW1lOwotCXVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCi0JLyogVGhlIElFRUUgc3BlYyBpbmRpY2F0ZXMgdGhhdCB0aGUgJ00nIHJlY29yZCBvbmx5IGhhcyBhCi0gICAgICAgICAgIGZsYWdzIGZpZWxkLiAgVGhlIE1SSSBjb21waWxlciBhbHNvIGVtaXRzIHRoZSBuYW1lIG9mIHRoZQotICAgICAgICAgICBmdW5jdGlvbi4gICovCi0KLQlpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmZsYWdzKSkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAoKnBwIDwgaW5mby0+cGVuZAotCSAgICAmJiAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwID09IGllZWVfYXRfcmVjb3JkX2VudW0pCi0JICB7Ci0JICAgIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0KLQkvKiBUaGlzIGlzIGVtaXR0ZWQgZm9yIG1ldGhvZCBmdW5jdGlvbnMsIGJ1dCBJIGRvbid0IHRoaW5rIHdlCi0gICAgICAgICAgIGNhcmUgdmVyeSBtdWNoLiAgSXQgbWlnaHQgaGVscCBpZiBpdCB0b2xkIHVzIHVzZWZ1bAotICAgICAgICAgICBpbmZvcm1hdGlvbiBsaWtlIHRoZSBjbGFzcyB3aXRoIHdoaWNoIHRoaXMgZnVuY3Rpb24gaXMKLSAgICAgICAgICAgYXNzb2NpYXRlZCwgYnV0IGl0IGRvZXNuJ3QsIHNvIGl0IGlzbid0IGhlbHBmdWwuICAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdCJzoKLSAgICAgIGlmICghIGllZWVfcmVhZF9jeHhfZGVmYXVsdHMgKGluZm8sIHBwLCBjb3VudCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd6JzoKLSAgICAgIHsKLQljb25zdCBjaGFyICpuYW1lLCAqbWFuZ2xlZCwgKmNsYXNzOwotCXVuc2lnbmVkIGxvbmcgbmFtbGVuLCBtYW5nbGVkbGVuLCBjbGFzc2xlbjsKLQliZmRfdm1hIGNvbnRyb2w7Ci0KLQkvKiBQb2ludGVyIHRvIG1lbWJlci4gICovCi0KLQlpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikKLQkgICAgfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbWFuZ2xlZCwgJm1hbmdsZWRsZW4pCi0JICAgIHx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmNsYXNzLCAmY2xhc3NsZW4pCi0JICAgIHx8ICEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZjb250cm9sKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIEZJWE1FOiBXZSBzaG91bGQgbm93IHRyYWNrIGRvd24gbmFtZSBhbmQgY2hhbmdlIGl0cyB0eXBlLiAgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICBpZiAoISBpZWVlX3JlYWRfcmVmZXJlbmNlIChpbmZvLCBwcCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgQysrIGNsYXNzIGRlZmluaXRpb24uICBUaGlzIGlzIGEgcG1pc2MgdHlwZSA4MCByZWNvcmQgb2YKLSAgIGNhdGVnb3J5ICdUJy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfY3h4X2NsYXNzIChpbmZvLCBwcCwgY291bnQpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgYmZkX3ZtYSBjbGFzczsKLSAgY29uc3QgY2hhciAqdGFnOwotICB1bnNpZ25lZCBsb25nIHRhZ2xlbjsKLSAgc3RydWN0IGllZWVfdGFnICppdDsKLSAgUFRSIGRoYW5kbGU7Ci0gIGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0gIHVuc2lnbmVkIGludCBmaWVsZF9jb3VudCwgZmllbGRfYWxsb2M7Ci0gIGRlYnVnX2Jhc2VjbGFzcyAqYmFzZWNsYXNzZXM7Ci0gIHVuc2lnbmVkIGludCBiYXNlY2xhc3Nlc19jb3VudCwgYmFzZWNsYXNzZXNfYWxsb2M7Ci0gIGNvbnN0IGRlYnVnX2ZpZWxkICpzdHJ1Y3RmaWVsZHM7Ci0gIHN0cnVjdCBpZWVlX21ldGhvZAotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLSAgICAgIGRlYnVnX21ldGhvZF92YXJpYW50ICp2YXJpYW50czsKLSAgICAgIHVuc2lnbmVkIGNvdW50OwotICAgICAgdW5zaWduZWQgaW50IGFsbG9jOwotICAgIH0gKm1ldGhvZHM7Ci0gIHVuc2lnbmVkIGludCBtZXRob2RzX2NvdW50LCBtZXRob2RzX2FsbG9jOwotICBkZWJ1Z190eXBlIHZwdHJiYXNlOwotICBib29sZWFuIG93bnZwdHI7Ci0gIGRlYnVnX21ldGhvZCAqZG1ldGhvZHM7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZjbGFzcykpCi0gICAgcmV0dXJuIGZhbHNlOwotICAtLWNvdW50OwotCi0gIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZ0YWcsICZ0YWdsZW4pKQotICAgIHJldHVybiBmYWxzZTsKLSAgLS1jb3VudDsKLQotICAvKiBGaW5kIHRoZSBDIHN0cnVjdCB3aXRoIHRoaXMgbmFtZS4gICovCi0gIGZvciAoaXQgPSBpbmZvLT50YWdzOyBpdCAhPSBOVUxMOyBpdCA9IGl0LT5uZXh0KQotICAgIGlmIChpdC0+bmFtZVswXSA9PSB0YWdbMF0KLQkmJiBzdHJuY21wIChpdC0+bmFtZSwgdGFnLCB0YWdsZW4pID09IDAKLQkmJiBzdHJsZW4gKGl0LT5uYW1lKSA9PSB0YWdsZW4pCi0gICAgICBicmVhazsKLSAgaWYgKGl0ID09IE5VTEwpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVuZGVmaW5lZCBDKysgb2JqZWN0IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBkaGFuZGxlID0gaW5mby0+ZGhhbmRsZTsKLQotICBmaWVsZHMgPSBOVUxMOwotICBmaWVsZF9jb3VudCA9IDA7Ci0gIGZpZWxkX2FsbG9jID0gMDsKLSAgYmFzZWNsYXNzZXMgPSBOVUxMOwotICBiYXNlY2xhc3Nlc19jb3VudCA9IDA7Ci0gIGJhc2VjbGFzc2VzX2FsbG9jID0gMDsKLSAgbWV0aG9kcyA9IE5VTEw7Ci0gIG1ldGhvZHNfY291bnQgPSAwOwotICBtZXRob2RzX2FsbG9jID0gMDsKLSAgdnB0cmJhc2UgPSBERUJVR19UWVBFX05VTEw7Ci0gIG93bnZwdHIgPSBmYWxzZTsKLQotICBzdHJ1Y3RmaWVsZHMgPSBkZWJ1Z19nZXRfZmllbGRzIChkaGFuZGxlLCBpdC0+dHlwZSk7Ci0KLSAgd2hpbGUgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGlkOwotICAgICAgY29uc3QgYmZkX2J5dGUgKnNwZWNfc3RhcnQ7Ci0KLSAgICAgIHNwZWNfc3RhcnQgPSAqcHA7Ci0KLSAgICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmaWQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC0tY291bnQ7Ci0KLSAgICAgIHN3aXRjaCAoaWQpCi0JewotCWRlZmF1bHQ6Ci0JICBpZWVlX2Vycm9yIChpbmZvLCBzcGVjX3N0YXJ0LCBfKCJ1bnJlY29nbml6ZWQgQysrIG9iamVjdCBzcGVjIikpOwotCSAgcmV0dXJuIGZhbHNlOwotCi0JY2FzZSAnYic6Ci0JICB7Ci0JICAgIGJmZF92bWEgZmxhZ3MsIGNpbmxpbmU7Ci0JICAgIGNvbnN0IGNoYXIgKmJhc2VuYW1lLCAqZmllbGRuYW1lOwotCSAgICB1bnNpZ25lZCBsb25nIGJhc2VsZW4sIGZpZWxkbGVuOwotCSAgICBjaGFyICpiYXNlY29weTsKLQkgICAgZGVidWdfdHlwZSBiYXNldHlwZTsKLQkgICAgYmZkX3ZtYSBiaXRwb3M7Ci0JICAgIGJvb2xlYW4gdmlydHVhbHA7Ci0JICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotCSAgICBkZWJ1Z19iYXNlY2xhc3MgYmFzZWNsYXNzOwotCi0JICAgIC8qIFRoaXMgcmVwcmVzZW50cyBhIGJhc2Ugb3IgZnJpZW5kIGNsYXNzLiAgKi8KLQotCSAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmZsYWdzKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZiYXNlbmFtZSwgJmJhc2VsZW4pCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZjaW5saW5lKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZmaWVsZG5hbWUsICZmaWVsZGxlbikpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBjb3VudCAtPSA0OwotCi0JICAgIC8qIFdlIGhhdmUgbm8gd2F5IG9mIHJlY29yZGluZyBmcmllbmQgaW5mb3JtYXRpb24sIHNvIHdlCi0gICAgICAgICAgICAgICBqdXN0IGlnbm9yZSBpdC4gICovCi0JICAgIGlmICgoZmxhZ3MgJiBCQVNFRkxBR1NfRlJJRU5EKSAhPSAwKQotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIEkgYXNzdW1lIHRoYXQgZWl0aGVyIGFsbCBvZiB0aGUgbWVtYmVycyBvZiB0aGUKLSAgICAgICAgICAgICAgIGJhc2VjbGFzcyBhcmUgaW5jbHVkZWQgaW4gdGhlIG9iamVjdCwgc3RhcnRpbmcgYXQgdGhlCi0gICAgICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIG9iamVjdCwgb3IgdGhhdCBub25lIG9mIHRoZW0gYXJlCi0gICAgICAgICAgICAgICBpbmNsdWRlZC4gICovCi0KLQkgICAgaWYgKChmaWVsZGxlbiA9PSAwKSA9PSAoY2lubGluZSA9PSAwKSkKLQkgICAgICB7Ci0JCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bnN1cHBvcnRlZCBDKysgb2JqZWN0IHR5cGUiKSk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgYmFzZWNvcHkgPSBzYXZlc3RyaW5nIChiYXNlbmFtZSwgYmFzZWxlbik7Ci0JICAgIGJhc2V0eXBlID0gZGVidWdfZmluZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgYmFzZWNvcHksCi0JCQkJCSAgICAgICBERUJVR19LSU5EX0lMTEVHQUwpOwotCSAgICBmcmVlIChiYXNlY29weSk7Ci0JICAgIGlmIChiYXNldHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICAgewotCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiQysrIGJhc2UgY2xhc3Mgbm90IGRlZmluZWQiKSk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGZpZWxkbGVuID09IDApCi0JICAgICAgYml0cG9zID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJY29uc3QgZGVidWdfZmllbGQgKnBmOwotCi0JCWlmIChzdHJ1Y3RmaWVsZHMgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiQysrIG9iamVjdCBoYXMgbm8gZmllbGRzIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQotCQlmb3IgKHBmID0gc3RydWN0ZmllbGRzOyAqcGYgIT0gREVCVUdfRklFTERfTlVMTDsgcGYrKykKLQkJICB7Ci0JCSAgICBjb25zdCBjaGFyICpmbmFtZTsKLQotCQkgICAgZm5hbWUgPSBkZWJ1Z19nZXRfZmllbGRfbmFtZSAoZGhhbmRsZSwgKnBmKTsKLQkJICAgIGlmIChmbmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoZm5hbWVbMF0gPT0gZmllbGRuYW1lWzBdCi0JCQkmJiBzdHJuY21wIChmbmFtZSwgZmllbGRuYW1lLCBmaWVsZGxlbikgPT0gMAotCQkJJiYgc3RybGVuIChmbmFtZSkgPT0gZmllbGRsZW4pCi0JCSAgICAgIGJyZWFrOwotCQkgIH0KLQkJaWYgKCpwZiA9PSBERUJVR19GSUVMRF9OVUxMKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LAotCQkJCV8oIkMrKyBiYXNlIGNsYXNzIG5vdCBmb3VuZCBpbiBjb250YWluZXIiKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCi0JCWJpdHBvcyA9IGRlYnVnX2dldF9maWVsZF9iaXRwb3MgKGRoYW5kbGUsICpwZik7Ci0JICAgICAgfQotCi0JICAgIGlmICgoZmxhZ3MgJiBCQVNFRkxBR1NfVklSVFVBTCkgIT0gMCkKLQkgICAgICB2aXJ0dWFscCA9IHRydWU7Ci0JICAgIGVsc2UKLQkgICAgICB2aXJ0dWFscCA9IGZhbHNlOwotCSAgICBpZiAoKGZsYWdzICYgQkFTRUZMQUdTX1BSSVZBVEUpICE9IDApCi0JICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURTsKLQkgICAgZWxzZQotCSAgICAgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQotCSAgICBiYXNlY2xhc3MgPSBkZWJ1Z19tYWtlX2Jhc2VjbGFzcyAoZGhhbmRsZSwgYmFzZXR5cGUsIGJpdHBvcywKLQkJCQkJICAgICAgdmlydHVhbHAsIHZpc2liaWxpdHkpOwotCSAgICBpZiAoYmFzZWNsYXNzID09IERFQlVHX0JBU0VDTEFTU19OVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBpZiAoYmFzZWNsYXNzZXNfY291bnQgKyAxID49IGJhc2VjbGFzc2VzX2FsbG9jKQotCSAgICAgIHsKLQkJYmFzZWNsYXNzZXNfYWxsb2MgKz0gMTA7Ci0JCWJhc2VjbGFzc2VzID0gKChkZWJ1Z19iYXNlY2xhc3MgKikKLQkJCSAgICAgICB4cmVhbGxvYyAoYmFzZWNsYXNzZXMsCi0JCQkJCSAoYmFzZWNsYXNzZXNfYWxsb2MKLQkJCQkJICAqIHNpemVvZiAqYmFzZWNsYXNzZXMpKSk7Ci0JICAgICAgfQotCi0JICAgIGJhc2VjbGFzc2VzW2Jhc2VjbGFzc2VzX2NvdW50XSA9IGJhc2VjbGFzczsKLQkgICAgKytiYXNlY2xhc3Nlc19jb3VudDsKLQkgICAgYmFzZWNsYXNzZXNbYmFzZWNsYXNzZXNfY291bnRdID0gREVCVUdfQkFTRUNMQVNTX05VTEw7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ2QnOgotCSAgewotCSAgICBiZmRfdm1hIGZsYWdzOwotCSAgICBjb25zdCBjaGFyICpmaWVsZG5hbWUsICptYW5nbGVkbmFtZTsKLQkgICAgdW5zaWduZWQgbG9uZyBmaWVsZGxlbiwgbWFuZ2xlZGxlbjsKLQkgICAgY2hhciAqZmllbGRjb3B5OwotCSAgICBib29sZWFuIHN0YXRpY3A7Ci0JICAgIGRlYnVnX3R5cGUgZnR5cGU7Ci0JICAgIGNvbnN0IGRlYnVnX2ZpZWxkICpwZiA9IE5VTEw7Ci0JICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotCSAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLQotCSAgICAvKiBUaGlzIHJlcHJlc2VudHMgYSBkYXRhIG1lbWJlci4gICovCi0KLQkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZmbGFncykKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmZmllbGRuYW1lLCAmZmllbGRsZW4pCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm1hbmdsZWRuYW1lLCAmbWFuZ2xlZGxlbikpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBjb3VudCAtPSAzOwotCi0JICAgIGZpZWxkY29weSA9IHNhdmVzdHJpbmcgKGZpZWxkbmFtZSwgZmllbGRsZW4pOwotCi0JICAgIHN0YXRpY3AgPSAoZmxhZ3MgJiBDWFhGTEFHU19TVEFUSUMpICE9IDAgPyB0cnVlIDogZmFsc2U7Ci0KLQkgICAgaWYgKHN0YXRpY3ApCi0JICAgICAgewotCQlzdHJ1Y3QgaWVlZV92YXIgKnB2LCAqcHZlbmQ7Ci0KLQkJLyogU2VlIGlmIHdlIGNhbiBmaW5kIGEgZGVmaW5pdGlvbiBmb3IgdGhpcyB2YXJpYWJsZS4gICovCi0JCXB2ID0gaW5mby0+dmFycy52YXJzOwotCQlwdmVuZCA9IHB2ICsgaW5mby0+dmFycy5hbGxvYzsKLQkJZm9yICg7IHB2IDwgcHZlbmQ7IHB2KyspCi0JCSAgaWYgKHB2LT5uYW1sZW4gPT0gbWFuZ2xlZGxlbgotCQkgICAgICAmJiBzdHJuY21wIChwdi0+bmFtZSwgbWFuZ2xlZG5hbWUsIG1hbmdsZWRsZW4pID09IDApCi0JCSAgICBicmVhazsKLQkJaWYgKHB2IDwgcHZlbmQpCi0JCSAgZnR5cGUgPSBwdi0+dHlwZTsKLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgdmFyaWFibGUgaXMgbmV2ZXIgdXNlZC4gICovCi0JCSAgICBmdHlwZSA9IGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBzdGFydCwKLQkJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fdm9pZCk7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IGZpbmR4OwotCi0JCWlmIChzdHJ1Y3RmaWVsZHMgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiQysrIG9iamVjdCBoYXMgbm8gZmllbGRzIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQotCQlmb3IgKHBmID0gc3RydWN0ZmllbGRzLCBmaW5keCA9IDA7Ci0JCSAgICAgKnBmICE9IERFQlVHX0ZJRUxEX05VTEw7Ci0JCSAgICAgcGYrKywgZmluZHgrKykKLQkJICB7Ci0JCSAgICBjb25zdCBjaGFyICpmbmFtZTsKLQotCQkgICAgZm5hbWUgPSBkZWJ1Z19nZXRfZmllbGRfbmFtZSAoZGhhbmRsZSwgKnBmKTsKLQkJICAgIGlmIChmbmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoZm5hbWVbMF0gPT0gbWFuZ2xlZG5hbWVbMF0KLQkJCSYmIHN0cm5jbXAgKGZuYW1lLCBtYW5nbGVkbmFtZSwgbWFuZ2xlZGxlbikgPT0gMAotCQkJJiYgc3RybGVuIChmbmFtZSkgPT0gbWFuZ2xlZGxlbikKLQkJICAgICAgYnJlYWs7Ci0JCSAgfQotCQlpZiAoKnBmID09IERFQlVHX0ZJRUxEX05VTEwpCi0JCSAgewotCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCi0JCQkJXygiQysrIGRhdGEgbWVtYmVyIG5vdCBmb3VuZCBpbiBjb250YWluZXIiKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCi0JCWZ0eXBlID0gZGVidWdfZ2V0X2ZpZWxkX3R5cGUgKGRoYW5kbGUsICpwZik7Ci0KLQkJaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIGZ0eXBlKSA9PSBERUJVR19LSU5EX1BPSU5URVIpCi0JCSAgewotCQkgICAgLyogV2UgbWlnaHQgbmVlZCB0byBjb252ZXJ0IHRoaXMgZmllbGQgaW50byBhCi0gICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSB0eXBlIGxhdGVyIG9uLCBzbyBtYWtlIGl0IGFuIGluZGlyZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgIHR5cGUuICAqLwotCQkgICAgaWYgKGl0LT5mc2xvdHMgPT0gTlVMTCkKLQkJICAgICAgewotCQkJdW5zaWduZWQgaW50IGZjbnQ7Ci0JCQljb25zdCBkZWJ1Z19maWVsZCAqcGZjbnQ7Ci0KLQkJCWZjbnQgPSAwOwotCQkJZm9yIChwZmNudCA9IHN0cnVjdGZpZWxkczsKLQkJCSAgICAgKnBmY250ICE9IERFQlVHX0ZJRUxEX05VTEw7Ci0JCQkgICAgIHBmY250KyspCi0JCQkgICsrZmNudDsKLQkJCWl0LT5mc2xvdHMgPSAoKGRlYnVnX3R5cGUgKikKLQkJCQkgICAgICB4bWFsbG9jIChmY250ICogc2l6ZW9mICppdC0+ZnNsb3RzKSk7Ci0JCQltZW1zZXQgKGl0LT5mc2xvdHMsIDAsCi0JCQkJZmNudCAqIHNpemVvZiAqaXQtPmZzbG90cyk7Ci0JCSAgICAgIH0KLQotCQkgICAgaWYgKGZ0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgaXQtPmZzbG90c1tmaW5keF0gPSBmdHlwZTsKLQkJICAgIGZ0eXBlID0gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLAotCQkJCQkJICAgICAgaXQtPmZzbG90cyArIGZpbmR4LAotCQkJCQkJICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgaWYgKGZ0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgc3dpdGNoIChmbGFncyAmIENYWEZMQUdTX1ZJU0lCSUxJVFkpCi0JICAgICAgewotCSAgICAgIGRlZmF1bHQ6Ci0JCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bmtub3duIEMrKyB2aXNpYmlsaXR5IikpOwotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBjYXNlIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFVCTElDOgotCQl2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBDWFhGTEFHU19WSVNJQklMSVRZX1BSSVZBVEU6Ci0JCXZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBDWFhGTEFHU19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLQkJdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgaWYgKHN0YXRpY3ApCi0JICAgICAgewotCQljaGFyICptYW5nbGVkY29weTsKLQotCQltYW5nbGVkY29weSA9IHNhdmVzdHJpbmcgKG1hbmdsZWRuYW1lLCBtYW5nbGVkbGVuKTsKLQotCQlmaWVsZCA9IGRlYnVnX21ha2Vfc3RhdGljX21lbWJlciAoZGhhbmRsZSwgZmllbGRjb3B5LAotCQkJCQkJICBmdHlwZSwgbWFuZ2xlZGNvcHksCi0JCQkJCQkgIHZpc2liaWxpdHkpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYmZkX3ZtYSBiaXRwb3MsIGJpdHNpemU7Ci0KLQkJYml0cG9zID0gZGVidWdfZ2V0X2ZpZWxkX2JpdHBvcyAoZGhhbmRsZSwgKnBmKTsKLQkJYml0c2l6ZSA9IGRlYnVnX2dldF9maWVsZF9iaXRzaXplIChkaGFuZGxlLCAqcGYpOwotCQlpZiAoYml0cG9zID09IChiZmRfdm1hKSAtMSB8fCBiaXRzaXplID09IChiZmRfdm1hKSAtMSkKLQkJICB7Ci0JCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiYmFkIEMrKyBmaWVsZCBiaXQgcG9zIG9yIHNpemUiKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCQlmaWVsZCA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIGZpZWxkY29weSwgZnR5cGUsIGJpdHBvcywKLQkJCQkJICBiaXRzaXplLCB2aXNpYmlsaXR5KTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGZpZWxkID09IERFQlVHX0ZJRUxEX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIGlmIChmaWVsZF9jb3VudCArIDEgPj0gZmllbGRfYWxsb2MpCi0JICAgICAgewotCQlmaWVsZF9hbGxvYyArPSAxMDsKLQkJZmllbGRzID0gKChkZWJ1Z19maWVsZCAqKQotCQkJICB4cmVhbGxvYyAoZmllbGRzLCBmaWVsZF9hbGxvYyAqIHNpemVvZiAqZmllbGRzKSk7Ci0JICAgICAgfQotCi0JICAgIGZpZWxkc1tmaWVsZF9jb3VudF0gPSBmaWVsZDsKLQkgICAgKytmaWVsZF9jb3VudDsKLQkgICAgZmllbGRzW2ZpZWxkX2NvdW50XSA9IERFQlVHX0ZJRUxEX05VTEw7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ20nOgotCWNhc2UgJ3YnOgotCSAgewotCSAgICBiZmRfdm1hIGZsYWdzLCB2b2Zmc2V0LCBjb250cm9sOwotCSAgICBjb25zdCBjaGFyICpuYW1lLCAqbWFuZ2xlZDsKLQkgICAgdW5zaWduZWQgbG9uZyBuYW1sZW4sIG1hbmdsZWRsZW47Ci0JICAgIHN0cnVjdCBpZWVlX3ZhciAqcHYsICpwdmVuZDsKLQkgICAgZGVidWdfdHlwZSB0eXBlOwotCSAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLQkgICAgYm9vbGVhbiBjb25zdHAsIHZvbGF0aWxlcDsKLQkgICAgY2hhciAqbWFuZ2xlZGNvcHk7Ci0JICAgIGRlYnVnX21ldGhvZF92YXJpYW50IG12OwotCSAgICBzdHJ1Y3QgaWVlZV9tZXRob2QgKm1ldGg7Ci0JICAgIHVuc2lnbmVkIGludCBpbTsKLQotCSAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmZsYWdzKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZtYW5nbGVkLCAmbWFuZ2xlZGxlbikpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBjb3VudCAtPSAzOwotCSAgICBpZiAoaWQgIT0gJ3YnKQotCSAgICAgIHZvZmZzZXQgPSAwOwotCSAgICBlbHNlCi0JICAgICAgewotCQlpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnZvZmZzZXQpKQotCQkgIHJldHVybiBmYWxzZTsKLQkJLS1jb3VudDsKLQkgICAgICB9Ci0JICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmY29udHJvbCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAtLWNvdW50OwotCi0JICAgIC8qIFdlIGp1c3QgaWdub3JlIHRoZSBjb250cm9sIGluZm9ybWF0aW9uLiAgKi8KLQotCSAgICAvKiBXZSBoYXZlIG5vIHdheSB0byByZXByZXNlbnQgZnJpZW5kIGluZm9ybWF0aW9uLCBzbyB3ZQotICAgICAgICAgICAgICAganVzdCBpZ25vcmUgaXQuICAqLwotCSAgICBpZiAoKGZsYWdzICYgQ1hYRkxBR1NfRlJJRU5EKSAhPSAwKQotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIFdlIHNob3VsZCBhbHJlYWR5IGhhdmUgc2VlbiBhIHR5cGUgZm9yIHRoZSBmdW5jdGlvbi4gICovCi0JICAgIHB2ID0gaW5mby0+dmFycy52YXJzOwotCSAgICBwdmVuZCA9IHB2ICsgaW5mby0+dmFycy5hbGxvYzsKLQkgICAgZm9yICg7IHB2IDwgcHZlbmQ7IHB2KyspCi0JICAgICAgaWYgKHB2LT5uYW1sZW4gPT0gbWFuZ2xlZGxlbgotCQkgICYmIHN0cm5jbXAgKHB2LT5uYW1lLCBtYW5nbGVkLCBtYW5nbGVkbGVuKSA9PSAwKQotCQlicmVhazsKLQotCSAgICBpZiAocHYgPj0gcHZlbmQpCi0JICAgICAgewotCQkvKiBXZSB3b24ndCBoYXZlIHR5cGUgaW5mb3JtYXRpb24gZm9yIHRoaXMgZnVuY3Rpb24gaWYKLQkJICAgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgZmlsZS4gIFdlIGRvbid0IHRyeSB0bwotCQkgICBoYW5kbGUgdGhpcyBjYXNlLiAgRklYTUUuICAqLwotCQl0eXBlID0gKGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZQotCQkJKGRoYW5kbGUsCi0JCQkgaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHN0YXJ0LAotCQkJCQkgICAgKHVuc2lnbmVkIGludCkgYnVpbHRpbl92b2lkKSwKLQkJCSAoZGVidWdfdHlwZSAqKSBOVUxMLAotCQkJIGZhbHNlKSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlkZWJ1Z190eXBlIHJldHVybl90eXBlOwotCQljb25zdCBkZWJ1Z190eXBlICphcmdfdHlwZXM7Ci0JCWJvb2xlYW4gdmFyYXJnczsKLQotCQlpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgcHYtPnR5cGUpCi0JCSAgICAhPSBERUJVR19LSU5EX0ZVTkNUSU9OKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LAotCQkJCV8oImJhZCB0eXBlIGZvciBDKysgbWV0aG9kIGZ1bmN0aW9uIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQotCQlyZXR1cm5fdHlwZSA9IGRlYnVnX2dldF9yZXR1cm5fdHlwZSAoZGhhbmRsZSwgcHYtPnR5cGUpOwotCQlhcmdfdHlwZXMgPSBkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzIChkaGFuZGxlLCBwdi0+dHlwZSwKLQkJCQkJCSAgICAgICAmdmFyYXJncyk7Ci0JCWlmIChyZXR1cm5fdHlwZSA9PSBERUJVR19UWVBFX05VTEwgfHwgYXJnX3R5cGVzID09IE5VTEwpCi0JCSAgewotCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCi0JCQkJXygibm8gdHlwZSBpbmZvcm1hdGlvbiBmb3IgQysrIG1ldGhvZCBmdW5jdGlvbiIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0KLQkJdHlwZSA9IGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGRoYW5kbGUsIHJldHVybl90eXBlLCBpdC0+dHlwZSwKLQkJCQkJICAgICAgIChkZWJ1Z190eXBlICopIGFyZ190eXBlcywKLQkJCQkJICAgICAgIHZhcmFyZ3MpOwotCSAgICAgIH0KLQkgICAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBzd2l0Y2ggKGZsYWdzICYgQ1hYRkxBR1NfVklTSUJJTElUWSkKLQkgICAgICB7Ci0JICAgICAgZGVmYXVsdDoKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVua25vd24gQysrIHZpc2liaWxpdHkiKSk7Ci0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QVUJMSUM6Ci0JCXZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJJVkFURToKLQkJdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotCQl2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBjb25zdHAgPSAoZmxhZ3MgJiBDWFhGTEFHU19DT05TVCkgIT0gMCA/IHRydWUgOiBmYWxzZTsKLQkgICAgdm9sYXRpbGVwID0gKGZsYWdzICYgQ1hYRkxBR1NfVk9MQVRJTEUpICE9IDAgPyB0cnVlIDogZmFsc2U7Ci0KLQkgICAgbWFuZ2xlZGNvcHkgPSBzYXZlc3RyaW5nIChtYW5nbGVkLCBtYW5nbGVkbGVuKTsKLQotCSAgICBpZiAoKGZsYWdzICYgQ1hYRkxBR1NfU1RBVElDKSAhPSAwKQotCSAgICAgIHsKLQkJaWYgKGlkID09ICd2JykKLQkJICB7Ci0JCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiQysrIHN0YXRpYyB2aXJ0dWFsIG1ldGhvZCIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JCW12ID0gZGVidWdfbWFrZV9zdGF0aWNfbWV0aG9kX3ZhcmlhbnQgKGRoYW5kbGUsIG1hbmdsZWRjb3B5LAotCQkJCQkJICAgICAgIHR5cGUsIHZpc2liaWxpdHksCi0JCQkJCQkgICAgICAgY29uc3RwLCB2b2xhdGlsZXApOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZGVidWdfdHlwZSB2Y29udGV4dDsKLQotCQlpZiAoaWQgIT0gJ3YnKQotCQkgIHZjb250ZXh0ID0gREVCVUdfVFlQRV9OVUxMOwotCQllbHNlCi0JCSAgewotCQkgICAgLyogRklYTUU6IEhvdyBjYW4gd2UgY2FsY3VsYXRlIHRoaXMgY29ycmVjdGx5PyAgKi8KLQkJICAgIHZjb250ZXh0ID0gaXQtPnR5cGU7Ci0JCSAgfQotCQltdiA9IGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQgKGRoYW5kbGUsIG1hbmdsZWRjb3B5LCB0eXBlLAotCQkJCQkJdmlzaWJpbGl0eSwgY29uc3RwLAotCQkJCQkJdm9sYXRpbGVwLCB2b2Zmc2V0LAotCQkJCQkJdmNvbnRleHQpOwotCSAgICAgIH0KLQkgICAgaWYgKG12ID09IERFQlVHX01FVEhPRF9WQVJJQU5UX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIGZvciAobWV0aCA9IG1ldGhvZHMsIGltID0gMDsgaW0gPCBtZXRob2RzX2NvdW50OyBtZXRoKyssIGltKyspCi0JICAgICAgaWYgKG1ldGgtPm5hbWxlbiA9PSBuYW1sZW4KLQkJICAmJiBzdHJuY21wIChtZXRoLT5uYW1lLCBuYW1lLCBuYW1sZW4pID09IDApCi0JCWJyZWFrOwotCSAgICBpZiAoaW0gPj0gbWV0aG9kc19jb3VudCkKLQkgICAgICB7Ci0JCWlmIChtZXRob2RzX2NvdW50ID49IG1ldGhvZHNfYWxsb2MpCi0JCSAgewotCQkgICAgbWV0aG9kc19hbGxvYyArPSAxMDsKLQkJICAgIG1ldGhvZHMgPSAoKHN0cnVjdCBpZWVlX21ldGhvZCAqKQotCQkJICAgICAgIHhyZWFsbG9jIChtZXRob2RzLAotCQkJCQkgbWV0aG9kc19hbGxvYyAqIHNpemVvZiAqbWV0aG9kcykpOwotCQkgIH0KLQkJbWV0aG9kc1ttZXRob2RzX2NvdW50XS5uYW1lID0gbmFtZTsKLQkJbWV0aG9kc1ttZXRob2RzX2NvdW50XS5uYW1sZW4gPSBuYW1sZW47Ci0JCW1ldGhvZHNbbWV0aG9kc19jb3VudF0udmFyaWFudHMgPSBOVUxMOwotCQltZXRob2RzW21ldGhvZHNfY291bnRdLmNvdW50ID0gMDsKLQkJbWV0aG9kc1ttZXRob2RzX2NvdW50XS5hbGxvYyA9IDA7Ci0JCW1ldGggPSBtZXRob2RzICsgbWV0aG9kc19jb3VudDsKLQkJKyttZXRob2RzX2NvdW50OwotCSAgICAgIH0KLQotCSAgICBpZiAobWV0aC0+Y291bnQgKyAxID49IG1ldGgtPmFsbG9jKQotCSAgICAgIHsKLQkJbWV0aC0+YWxsb2MgKz0gMTA7Ci0JCW1ldGgtPnZhcmlhbnRzID0gKChkZWJ1Z19tZXRob2RfdmFyaWFudCAqKQotCQkJCSAgeHJlYWxsb2MgKG1ldGgtPnZhcmlhbnRzLAotCQkJCQkgICAgKG1ldGgtPmFsbG9jCi0JCQkJCSAgICAgKiBzaXplb2YgKm1ldGgtPnZhcmlhbnRzKSkpOwotCSAgICAgIH0KLQotCSAgICBtZXRoLT52YXJpYW50c1ttZXRoLT5jb3VudF0gPSBtdjsKLQkgICAgKyttZXRoLT5jb3VudDsKLQkgICAgbWV0aC0+dmFyaWFudHNbbWV0aC0+Y291bnRdID0gREVCVUdfTUVUSE9EX1ZBUklBTlRfTlVMTDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnbyc6Ci0JICB7Ci0JICAgIGJmZF92bWEgc3BlYzsKLQotCSAgICAvKiBXZSBoYXZlIG5vIHdheSB0byBzdG9yZSB0aGlzIGluZm9ybWF0aW9uLCBzbyB3ZSBqdXN0Ci0JICAgICAgIGlnbm9yZSBpdC4gICovCi0JICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmc3BlYykpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAtLWNvdW50OwotCSAgICBpZiAoKHNwZWMgJiA0KSAhPSAwKQotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0JCXVuc2lnbmVkIGxvbmcgZmlsZW5hbWxlbjsKLQkJYmZkX3ZtYSBsaW5lbm87Ci0KLQkJaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmZpbGVuYW1lLCAmZmlsZW5hbWxlbikKLQkJICAgIHx8ICEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZsaW5lbm8pKQotCQkgIHJldHVybiBmYWxzZTsKLQkJY291bnQgLT0gMjsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKChzcGVjICYgOCkgIT0gMCkKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm1hbmdsZWQ7Ci0JCXVuc2lnbmVkIGxvbmcgbWFuZ2xlZGxlbjsKLQotCQlpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbWFuZ2xlZCwgJm1hbmdsZWRsZW4pKQotCQkgIHJldHVybiBmYWxzZTsKLQkJLS1jb3VudDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LAotCQkJICAgIF8oInVucmVjb2duaXplZCBDKysgb2JqZWN0IG92ZXJoZWFkIHNwZWMiKSk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ3onOgotCSAgewotCSAgICBjb25zdCBjaGFyICp2bmFtZSwgKmJhc2VuYW1lOwotCSAgICB1bnNpZ25lZCBsb25nIHZuYW1lbGVuLCBiYXNlbGVuOwotCSAgICBiZmRfdm1hIHZzaXplLCBjb250cm9sOwotCi0JICAgIC8qIEEgdmlydHVhbCB0YWJsZSBwb2ludGVyLiAgKi8KLQotCSAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmdm5hbWUsICZ2bmFtZWxlbikKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnZzaXplKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZiYXNlbmFtZSwgJmJhc2VsZW4pCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZjb250cm9sKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGNvdW50IC09IDQ7Ci0KLQkgICAgLyogV2UganVzdCBpZ25vcmUgdGhlIGNvbnRyb2wgbnVtYmVyLiAgV2UgZG9uJ3QgY2FyZSB3aGF0Ci0JICAgICAgIHRoZSB2aXJ0dWFsIHRhYmxlIG5hbWUgaXMuICBXZSBoYXZlIG5vIHdheSB0byBzdG9yZSB0aGUKLQkgICAgICAgdmlydHVhbCB0YWJsZSBzaXplLCBhbmQgSSBkb24ndCB0aGluayB3ZSBjYXJlIGFueWhvdy4gICovCi0KLQkgICAgLyogRklYTUU6IFdlIGNhbid0IGhhbmRsZSBtdWx0aXBsZSB2aXJ0dWFsIHRhYmxlIHBvaW50ZXJzLiAgKi8KLQotCSAgICBpZiAoYmFzZWxlbiA9PSAwKQotCSAgICAgIG93bnZwdHIgPSB0cnVlOwotCSAgICBlbHNlCi0JICAgICAgewotCQljaGFyICpiYXNlY29weTsKLQotCQliYXNlY29weSA9IHNhdmVzdHJpbmcgKGJhc2VuYW1lLCBiYXNlbGVuKTsKLQkJdnB0cmJhc2UgPSBkZWJ1Z19maW5kX3RhZ2dlZF90eXBlIChkaGFuZGxlLCBiYXNlY29weSwKLQkJCQkJCSAgIERFQlVHX0tJTkRfSUxMRUdBTCk7Ci0JCWZyZWUgKGJhc2Vjb3B5KTsKLQkJaWYgKHZwdHJiYXNlID09IERFQlVHX1RZUEVfTlVMTCkKLQkJICB7Ci0JCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5kZWZpbmVkIEMrKyB2dGFibGUiKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSBzZWVuIGFsbCB0aGUgbWV0aG9kIHZhcmlhbnRzLCB3ZSBjYW4gY2FsbAotICAgICBkZWJ1Z19tYWtlX21ldGhvZCBmb3IgZWFjaCBvbmUuICAqLwotCi0gIGlmIChtZXRob2RzX2NvdW50ID09IDApCi0gICAgZG1ldGhvZHMgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGRtZXRob2RzID0gKChkZWJ1Z19tZXRob2QgKikKLQkJICB4bWFsbG9jICgobWV0aG9kc19jb3VudCArIDEpICogc2l6ZW9mICpkbWV0aG9kcykpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG1ldGhvZHNfY291bnQ7IGkrKykKLQl7Ci0JICBjaGFyICpuYW1jb3B5OwotCi0JICBuYW1jb3B5ID0gc2F2ZXN0cmluZyAobWV0aG9kc1tpXS5uYW1lLCBtZXRob2RzW2ldLm5hbWxlbik7Ci0JICBkbWV0aG9kc1tpXSA9IGRlYnVnX21ha2VfbWV0aG9kIChkaGFuZGxlLCBuYW1jb3B5LAotCQkJCQkgICBtZXRob2RzW2ldLnZhcmlhbnRzKTsKLQkgIGlmIChkbWV0aG9kc1tpXSA9PSBERUJVR19NRVRIT0RfTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGRtZXRob2RzW2ldID0gREVCVUdfTUVUSE9EX05VTEw7Ci0gICAgICBmcmVlIChtZXRob2RzKTsKLSAgICB9Ci0KLSAgLyogVGhlIHN0cnVjdCB0eXBlIHdhcyBjcmVhdGVkIGFzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcgYXQKLSAgICAgaXQtPnNsb3QuICBXZSB1cGRhdGUgaXQtPnNsb3QgdG8gYXV0b21hdGljYWxseSB1cGRhdGUgYWxsCi0gICAgIHJlZmVyZW5jZXMgdG8gdGhpcyBzdHJ1Y3QuICAqLwotICBpdC0+c2xvdCA9IGRlYnVnX21ha2Vfb2JqZWN0X3R5cGUgKGRoYW5kbGUsCi0JCQkJICAgICBjbGFzcyAhPSAndScsCi0JCQkJICAgICBkZWJ1Z19nZXRfdHlwZV9zaXplIChkaGFuZGxlLAotCQkJCQkJCSAgaXQtPnNsb3QpLAotCQkJCSAgICAgZmllbGRzLCBiYXNlY2xhc3NlcywgZG1ldGhvZHMsCi0JCQkJICAgICB2cHRyYmFzZSwgb3dudnB0cik7Ci0gIGlmIChpdC0+c2xvdCA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIEMrKyBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlIGFuZCByZWZlcmVuY2UgdHlwZSBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfY3h4X2RlZmF1bHRzIChpbmZvLCBwcCwgY291bnQpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgY29uc3QgY2hhciAqZm5uYW1lOwotICB1bnNpZ25lZCBsb25nIGZubGVuOwotICBiZmRfdm1hIGRlZmNvdW50OwotCi0gIHN0YXJ0ID0gKnBwOwotCi0gIC8qIEdpdmluZyB0aGUgZnVuY3Rpb24gbmFtZSBiZWZvcmUgdGhlIGFyZ3VtZW50IGNvdW50IGlzIGFuIGFkZGVuZHVtCi0gICAgIHRvIHRoZSBzcGVjLiAgVGhlIGZ1bmN0aW9uIG5hbWUgaXMgZGVtYW5nbGVkLCB0aG91Z2gsIHNvIHRoaXMKLSAgICAgcmVjb3JkIG11c3QgYWx3YXlzIHJlZmVyIHRvIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLQotICBpZiAoaW5mby0+YmxvY2tzdGFjay5ic3AgPD0gaW5mby0+YmxvY2tzdGFjay5zdGFjawotICAgICAgfHwgaW5mby0+YmxvY2tzdGFjay5ic3BbLTFdLmZuaW5keCA9PSAodW5zaWduZWQgaW50KSAtMSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiQysrIGRlZmF1bHQgdmFsdWVzIG5vdCBpbiBhIGZ1bmN0aW9uIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmZm5uYW1lLCAmZm5sZW4pCi0gICAgICB8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmZGVmY291bnQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgY291bnQgLT0gMjsKLQotICB3aGlsZSAoZGVmY291bnQtLSA+IDApCi0gICAgewotICAgICAgYmZkX3ZtYSB0eXBlLCB2YWw7Ci0gICAgICBjb25zdCBjaGFyICpzdHJ2YWw7Ci0gICAgICB1bnNpZ25lZCBsb25nIHN0cnZhbGxlbjsKLQotICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAtLWNvdW50OwotCi0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgMDoKLQljYXNlIDQ6Ci0JICBicmVhazsKLQotCWNhc2UgMToKLQljYXNlIDI6Ci0JICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnZhbCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC0tY291bnQ7Ci0JICBicmVhazsKLQotCWNhc2UgMzoKLQljYXNlIDc6Ci0JICBpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmc3RydmFsLCAmc3RydmFsbGVuKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLS1jb3VudDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bnJlY29nbml6ZWQgQysrIGRlZmF1bHQgdHlwZSIpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGUgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMsIHNvIHdlCi0gICAgICAgICBqdXN0IGlnbm9yZSB0aGVtLiAgRklYTUUuICAqLwotICAgIH0KLQotICAvKiBBbnkgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgaW5kaWNlcyBvZiBwYXJhbWV0ZXJzIHRoYXQgYXJlIHJlYWxseQotICAgICByZWZlcmVuY2UgdHlwZS4gICovCi0gIGlmIChjb3VudCA+IDApCi0gICAgewotICAgICAgUFRSIGRoYW5kbGU7Ci0gICAgICBkZWJ1Z190eXBlICphcmdfc2xvdHM7Ci0KLSAgICAgIGRoYW5kbGUgPSBpbmZvLT5kaGFuZGxlOwotICAgICAgYXJnX3Nsb3RzID0gaW5mby0+dHlwZXMudHlwZXNbaW5mby0+YmxvY2tzdGFjay5ic3BbLTFdLmZuaW5keF0uYXJnX3Nsb3RzOwotICAgICAgd2hpbGUgKGNvdW50LS0gPiAwKQotCXsKLQkgIGJmZF92bWEgaW5keDsKLQkgIGRlYnVnX3R5cGUgdGFyZ2V0OwotCi0JICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmluZHgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBUaGUgaW5kZXggaXMgMSBiYXNlZC4gICovCi0JICAtLWluZHg7Ci0JICBpZiAoYXJnX3Nsb3RzID09IE5VTEwKLQkgICAgICB8fCBhcmdfc2xvdHNbaW5keF0gPT0gREVCVUdfVFlQRV9OVUxMCi0JICAgICAgfHwgKGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIGFyZ19zbG90c1tpbmR4XSkKLQkJICAhPSBERUJVR19LSU5EX1BPSU5URVIpKQotCSAgICB7Ci0JICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInJlZmVyZW5jZSBwYXJhbWV0ZXIgaXMgbm90IGEgcG9pbnRlciIpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgdGFyZ2V0ID0gZGVidWdfZ2V0X3RhcmdldF90eXBlIChkaGFuZGxlLCBhcmdfc2xvdHNbaW5keF0pOwotCSAgYXJnX3Nsb3RzW2luZHhdID0gZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZSAoZGhhbmRsZSwgdGFyZ2V0KTsKLQkgIGlmIChhcmdfc2xvdHNbaW5keF0gPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIEMrKyByZWZlcmVuY2UgZGVmaW5pdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfcmVmZXJlbmNlIChpbmZvLCBwcCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICBiZmRfdm1hIGZsYWdzOwotICBjb25zdCBjaGFyICpjbGFzcywgKm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgY2xhc3NsZW4sIG5hbWxlbjsKLSAgZGVidWdfdHlwZSAqcHNsb3Q7Ci0gIGRlYnVnX3R5cGUgdGFyZ2V0OwotCi0gIHN0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmZmxhZ3MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHaXZpbmcgdGhlIGNsYXNzIG5hbWUgYmVmb3JlIHRoZSBtZW1iZXIgbmFtZSBpcyBpbiBhbiBhZGRlbmR1bSB0bwotICAgICB0aGUgc3BlYy4gICovCi0gIGlmIChmbGFncyA9PSAzKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZjbGFzcywgJmNsYXNzbGVuKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcHNsb3QgPSBOVUxMOwotICBpZiAoZmxhZ3MgIT0gMykKLSAgICB7Ci0gICAgICBpbnQgcGFzczsKLQotICAgICAgLyogV2Ugc2VhcmNoIGZyb20gdGhlIGxhc3QgdmFyaWFibGUgaW5kaWNlcyB0byB0aGUgZmlyc3QgaW4KLQkgaG9wZXMgb2YgZmluZGluZyBsb2NhbCB2YXJpYWJsZXMgY29ycmVjdGx5LiAgV2Ugc2VhcmNoIHRoZQotCSBsb2NhbCB2YXJpYWJsZXMgb24gdGhlIGZpcnN0IHBhc3MsIGFuZCB0aGUgZ2xvYmFsIHZhcmlhYmxlcwotCSBvbiB0aGUgc2Vjb25kLiAgRklYTUU6IFRoaXMgcHJvYmFibHkgd29uJ3Qgd29yayBpbiBhbGwgY2FzZXMuCi0JIE9uIHRoZSBvdGhlciBoYW5kLCBJIGRvbid0IGtub3cgd2hhdCB3aWxsLiAgKi8KLSAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspCi0JewotCSAgc3RydWN0IGllZWVfdmFycyAqdmFyczsKLQkgIGludCBpOwotCSAgc3RydWN0IGllZWVfdmFyICpwdiA9IE5VTEw7Ci0KLQkgIGlmIChwYXNzID09IDApCi0JICAgIHZhcnMgPSAmaW5mby0+dmFyczsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHZhcnMgPSBpbmZvLT5nbG9iYWxfdmFyczsKLQkgICAgICBpZiAodmFycyA9PSBOVUxMKQotCQlicmVhazsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAoaW50KSB2YXJzLT5hbGxvYyAtIDE7IGkgPj0gMDsgaS0tKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBmb3VuZDsKLQotCSAgICAgIHB2ID0gdmFycy0+dmFycyArIGk7Ci0KLQkgICAgICBpZiAocHYtPnBzbG90ID09IE5VTEwKLQkJICB8fCBwdi0+bmFtbGVuICE9IG5hbWxlbgotCQkgIHx8IHN0cm5jbXAgKHB2LT5uYW1lLCBuYW1lLCBuYW1sZW4pICE9IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgZm91bmQgPSBmYWxzZTsKLQkgICAgICBzd2l0Y2ggKGZsYWdzKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCSAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCi0JCQkgICAgICBfKCJ1bnJlY29nbml6ZWQgQysrIHJlZmVyZW5jZSB0eXBlIikpOwotCQkgIHJldHVybiBmYWxzZTsKLQotCQljYXNlIDA6Ci0JCSAgLyogR2xvYmFsIHZhcmlhYmxlIG9yIGZ1bmN0aW9uLiAgKi8KLQkJICBpZiAocHYtPmtpbmQgPT0gSUVFRV9HTE9CQUwKLQkJICAgICAgfHwgcHYtPmtpbmQgPT0gSUVFRV9FWFRFUk5BTAotCQkgICAgICB8fCBwdi0+a2luZCA9PSBJRUVFX0ZVTkNUSU9OKQotCQkgICAgZm91bmQgPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgMToKLQkJICAvKiBHbG9iYWwgc3RhdGljIHZhcmlhYmxlIG9yIGZ1bmN0aW9uLiAgKi8KLQkJICBpZiAocHYtPmtpbmQgPT0gSUVFRV9TVEFUSUMKLQkJICAgICAgfHwgcHYtPmtpbmQgPT0gSUVFRV9GVU5DVElPTikKLQkJICAgIGZvdW5kID0gdHJ1ZTsKLQkJICBicmVhazsKLQotCQljYXNlIDI6Ci0JCSAgLyogTG9jYWwgdmFyaWFibGUuICAqLwotCQkgIGlmIChwdi0+a2luZCA9PSBJRUVFX0xPQ0FMKQotCQkgICAgZm91bmQgPSB0cnVlOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBpZiAoZm91bmQpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChpID49IDApCi0JICAgIHsKLQkgICAgICBwc2xvdCA9IHB2LT5wc2xvdDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWVlZV90YWcgKml0OwotCi0gICAgICBmb3IgKGl0ID0gaW5mby0+dGFnczsgaXQgIT0gTlVMTDsgaXQgPSBpdC0+bmV4dCkKLQl7Ci0JICBpZiAoaXQtPm5hbWVbMF0gPT0gY2xhc3NbMF0KLQkgICAgICAmJiBzdHJuY21wIChpdC0+bmFtZSwgY2xhc3MsIGNsYXNzbGVuKSA9PSAwCi0JICAgICAgJiYgc3RybGVuIChpdC0+bmFtZSkgPT0gY2xhc3NsZW4pCi0JICAgIHsKLQkgICAgICBpZiAoaXQtPmZzbG90cyAhPSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgZGVidWdfZmllbGQgKnBmOwotCQkgIHVuc2lnbmVkIGludCBmaW5keDsKLQotCQkgIHBmID0gZGVidWdfZ2V0X2ZpZWxkcyAoaW5mby0+ZGhhbmRsZSwgaXQtPnR5cGUpOwotCQkgIGlmIChwZiA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKLQkJCQkgICJDKysgcmVmZXJlbmNlIGluIGNsYXNzIHdpdGggbm8gZmllbGRzIik7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIGZvciAoZmluZHggPSAwOyAqcGYgIT0gREVCVUdfRklFTERfTlVMTDsgcGYrKywgZmluZHgrKykKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqZm5hbWU7Ci0KLQkJICAgICAgZm5hbWUgPSBkZWJ1Z19nZXRfZmllbGRfbmFtZSAoaW5mby0+ZGhhbmRsZSwgKnBmKTsKLQkJICAgICAgaWYgKGZuYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGlmIChzdHJuY21wIChmbmFtZSwgbmFtZSwgbmFtbGVuKSA9PSAwCi0JCQkgICYmIHN0cmxlbiAoZm5hbWUpID09IG5hbWxlbikKLQkJCXsKLQkJCSAgcHNsb3QgPSBpdC0+ZnNsb3RzICsgZmluZHg7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKHBzbG90ID09IE5VTEwpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIkMrKyByZWZlcmVuY2Ugbm90IGZvdW5kIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXZSBhbGxvY2F0ZWQgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBhcyBhbiBpbmRpcmVjdCB0eXBlIHBvaW50aW5nCi0gICAgIHRvICpwc2xvdCwgd2hpY2ggd2UgY2FuIG5vdyB1cGRhdGUgdG8gYmUgYSByZWZlcmVuY2UgdHlwZS4gICovCi0gIGlmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChpbmZvLT5kaGFuZGxlLCAqcHNsb3QpICE9IERFQlVHX0tJTkRfUE9JTlRFUikKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiQysrIHJlZmVyZW5jZSBpcyBub3QgcG9pbnRlciIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgdGFyZ2V0ID0gZGVidWdfZ2V0X3RhcmdldF90eXBlIChpbmZvLT5kaGFuZGxlLCAqcHNsb3QpOwotICAqcHNsb3QgPSBkZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlIChpbmZvLT5kaGFuZGxlLCB0YXJnZXQpOwotICBpZiAoKnBzbG90ID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlcXVpcmUgYW4gQVNOIHJlY29yZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgcHYpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIGJmZF92bWEgKnB2OwotewotICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7Ci0gIGllZWVfcmVjb3JkX2VudW1fdHlwZSBjOwotICBiZmRfdm1hIHZhcmluZHg7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0KLSAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHA7Ci0gIGlmIChjICE9IGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJtaXNzaW5nIHJlcXVpcmVkIEFTTiIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGMgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAoKCh1bnNpZ25lZCBpbnQpIGMgPDwgOCkgfCAqKnBwKTsKLSAgaWYgKGMgIT0gaWVlZV9hc25fcmVjb3JkX2VudW0pCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIm1pc3NpbmcgcmVxdWlyZWQgQVNOIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgLyogSnVzdCBpZ25vcmUgdGhlIHZhcmlhYmxlIGluZGV4LiAgKi8KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2YXJpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgcHYpOwotfQotCi0vKiBSZXF1aXJlIGFuIEFUTjY1IHJlY29yZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCBwbmFtZSwgcG5hbWxlbikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgY29uc3QgY2hhciAqKnBuYW1lOwotICAgICB1bnNpZ25lZCBsb25nICpwbmFtbGVuOwotewotICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7Ci0gIGllZWVfcmVjb3JkX2VudW1fdHlwZSBjOwotICBiZmRfdm1hIG5hbWVfaW5keCwgdHlwZV9pbmR4LCBhdG5fY29kZTsKLQotICBzdGFydCA9ICpwcDsKLQotICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcDsKLSAgaWYgKGMgIT0gaWVlZV9hdF9yZWNvcmRfZW51bSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygibWlzc2luZyByZXF1aXJlZCBBVE42NSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGMgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAoKCh1bnNpZ25lZCBpbnQpIGMgPDwgOCkgfCAqKnBwKTsKLSAgaWYgKGMgIT0gaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIm1pc3NpbmcgcmVxdWlyZWQgQVRONjUiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJm5hbWVfaW5keCkKLSAgICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0eXBlX2luZHgpCi0gICAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYXRuX2NvZGUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBKdXN0IGlnbm9yZSBuYW1lX2luZHguICAqLwotCi0gIGlmICh0eXBlX2luZHggIT0gMCB8fCBhdG5fY29kZSAhPSA2NSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiYmFkIEFUTjY1IHJlY29yZCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGllZWVfcmVhZF9pZCAoaW5mbywgcHAsIHBuYW1lLCBwbmFtbGVuKTsKLX0KLQwKLS8qIENvbnZlcnQgYSByZWdpc3RlciBudW1iZXIgaW4gSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW50byBhCi0gICBnZW5lcmljIHJlZ2lzdGVyIG51bWJlci4gICovCi0KLXN0YXRpYyBpbnQKLWllZWVfcmVnbm9fdG9fZ2VucmVnIChhYmZkLCByKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCByOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbnMgc3RhYnMgYWRkcyAyIHRvIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcgotICAgICAgICAgbnVtYmVycy4gICovCi0gICAgICBpZiAociA+PSAxNikKLQlyICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfaTk2MDoKLSAgICAgIC8qIFN0YWJzIHVzZXMgMCB0byAxNSBmb3IgcjAgdG8gcjE1LCAxNiB0byAzMSBmb3IgZzAgdG8gZzE1LCBhbmQKLSAgICAgICAgIDMyIHRvIDM1IGZvciBmcDAgdG8gZnAzLiAgKi8KLSAgICAgIC0tcjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhIGdlbmVyaWMgcmVnaXN0ZXIgbnVtYmVyIHRvIGFuIElFRUUgc3BlY2lmaWMgb25lLiAgKi8KLQotc3RhdGljIGludAotaWVlZV9nZW5yZWdfdG9fcmVnbm8gKGFiZmQsIHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHI7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgLyogRm9yIHNvbWUgcmVhc29uIHN0YWJzIGFkZCAyIHRvIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcgotICAgICAgICAgbnVtYmVycy4gICovCi0gICAgICBpZiAociA+PSAxOCkKLQlyIC09IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfaTk2MDoKLSAgICAgIC8qIFN0YWJzIHVzZXMgMCB0byAxNSBmb3IgcjAgdG8gcjE1LCAxNiB0byAzMSBmb3IgZzAgdG8gZzE1LCBhbmQKLSAgICAgICAgIDMyIHRvIDM1IGZvciBmcDAgdG8gZnAzLiAgKi8KLSAgICAgICsrcjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcjsKLX0KLQwKLS8qIFRoZXNlIHJvdXRpbmVzIGJ1aWxkIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uIG91dCBvZiB0aGUgZ2VuZXJpYwotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotLyogV2UgYnVpbGQgdGhlIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGJ5dGUgYnkgYnl0ZS4gIFJhdGhlciB0aGFuCi0gICB3YXN0ZSB0aW1lIGNvcHlpbmcgZGF0YSBhcm91bmQsIHdlIHVzZSBhIGxpbmtlZCBsaXN0IG9mIGJ1ZmZlcnMgdG8KLSAgIGhvbGQgdGhlIGRhdGEuICAqLwotCi0jZGVmaW5lIElFRUVfQlVGU0laRSAoNDkwKQotCi1zdHJ1Y3QgaWVlZV9idWYKLXsKLSAgLyogTmV4dCBidWZmZXIuICAqLwotICBzdHJ1Y3QgaWVlZV9idWYgKm5leHQ7Ci0gIC8qIE51bWJlciBvZiBkYXRhIGJ5dGVzIGluIHRoaXMgYnVmZmVyLiAgKi8KLSAgdW5zaWduZWQgaW50IGM7Ci0gIC8qIEJ5dGVzLiAgKi8KLSAgYmZkX2J5dGUgYnVmW0lFRUVfQlVGU0laRV07Ci19OwotCi0vKiBBIGxpc3Qgb2YgYnVmZmVycy4gICovCi0KLXN0cnVjdCBpZWVlX2J1Zmxpc3QKLXsKLSAgLyogSGVhZCBvZiBsaXN0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmICpoZWFkOwotICAvKiBUYWlsLS1sYXN0IGJ1ZmZlciBvbiBsaXN0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmICp0YWlsOwotfTsKLQotLyogSW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIEJCMTEgYmxvY2tzIHJlcXVpcmVkIGJ5IHRoZSBIUCBlbXVsYXRvciwKLSAgIHdlIGtlZXAgdHJhY2sgb2YgcmFuZ2VzIG9mIGFkZHJlc3NlcyB3aGljaCBjb3JyZXNwb25kIHRvIGEgZ2l2ZW4KLSAgIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdHJ1Y3QgaWVlZV9yYW5nZQotewotICAvKiBOZXh0IHJhbmdlLiAgKi8KLSAgc3RydWN0IGllZWVfcmFuZ2UgKm5leHQ7Ci0gIC8qIExvdyBhZGRyZXNzLiAgKi8KLSAgYmZkX3ZtYSBsb3c7Ci0gIC8qIEhpZ2ggYWRkcmVzcy4gICovCi0gIGJmZF92bWEgaGlnaDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhIGNsYXNzIG9uIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RydWN0IGllZWVfdHlwZV9jbGFzcwotewotICAvKiBUaGUgbmFtZSBpbmRleCBpbiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIC8qIFRoZSBwbWlzYyByZWNvcmRzIGZvciB0aGUgY2xhc3MuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHBtaXNjYnVmOwotICAvKiBUaGUgbnVtYmVyIG9mIHBtaXNjIHJlY29yZHMuICAqLwotICB1bnNpZ25lZCBpbnQgcG1pc2Njb3VudDsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGhvbGRpbmcgdGhlIHZpcnR1YWwgdGFibGUsIGlmIG5vdCB0aGlzCi0gICAgIGNsYXNzLiAgKi8KLSAgY29uc3QgY2hhciAqdmNsYXNzOwotICAvKiBXaGV0aGVyIHRoaXMgY2xhc3MgaG9sZHMgaXRzIG93biB2aXJ0dWFsIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiBvd252cHRyOwotICAvKiBUaGUgbGFyZ2VzdCB2aXJ0dWFsIHRhYmxlIG9mZnNldCBzZWVuIHNvIGZhci4gICovCi0gIGJmZF92bWEgdm9mZnNldDsKLSAgLyogVGhlIGN1cnJlbnQgbWV0aG9kLiAgKi8KLSAgY29uc3QgY2hhciAqbWV0aG9kOwotICAvKiBBZGRpdGlvbmFsIHBtaXNjIHJlY29yZHMgdXNlZCB0byByZWNvcmQgZmllbGRzIG9mIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCByZWZzOwotfTsKLQotLyogVGhpcyBpcyBob3cgd2Ugc3RvcmUgdHlwZXMgZm9yIHRoZSB3cml0aW5nIHJvdXRpbmVzLiAgTW9zdCB0eXBlcwotICAgYXJlIHNpbXBseSByZXByZXNlbnRlZCBieSBhIHR5cGUgaW5kZXguICAqLwotCi1zdHJ1Y3QgaWVlZV93cml0ZV90eXBlCi17Ci0gIC8qIFR5cGUgaW5kZXguICAqLwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgLyogVGhlIHNpemUgb2YgdGhlIHR5cGUsIGlmIGtub3duLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSB0eXBlLCBpZiBhbnkuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24gb3IgbWV0aG9kIHR5cGUsIHdlIGJ1aWxkIHRoZSB0eXBlIGhlcmUsIGFuZAotICAgICBvbmx5IGFkZCBpdCB0byB0aGUgb3V0cHV0IGJ1ZmZlcnMgaWYgd2UgbmVlZCBpdC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgZm5kZWY7Ci0gIC8qIElmIHRoaXMgaXMgYSBzdHJ1Y3QsIHRoaXMgaXMgd2hlcmUgdGhlIHN0cnVjdCBkZWZpbml0aW9uIGlzCi0gICAgIGJ1aWx0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBzdHJkZWY7Ci0gIC8qIElmIHRoaXMgaXMgYSBjbGFzcywgdGhpcyBpcyB3aGVyZSB0aGUgY2xhc3MgaW5mb3JtYXRpb24gaXMgYnVpbHQuICAqLwotICBzdHJ1Y3QgaWVlZV90eXBlX2NsYXNzICpjbGFzc2RlZjsKLSAgLyogV2hldGhlciB0aGUgdHlwZSBpcyB1bnNpZ25lZC4gICovCi0gIHVuc2lnbmVkIGludCB1bnNpZ25lZHAgOiAxOwotICAvKiBXaGV0aGVyIHRoaXMgaXMgYSByZWZlcmVuY2UgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCByZWZlcmVuY2VwIDogMTsKLSAgLyogV2hldGhlciB0aGlzIGlzIGluIHRoZSBsb2NhbCB0eXBlIGJsb2NrLiAgKi8KLSAgdW5zaWduZWQgaW50IGxvY2FscCA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhpcyBpcyBhIGR1cGxpY2F0ZSBzdHJ1Y3QgZGVmaW5pdGlvbiB3aGljaCB3ZSBhcmUKLSAgICAgaWdub3JpbmcuICAqLwotICB1bnNpZ25lZCBpbnQgaWdub3JlcCA6IDE7Ci19OwotCi0vKiBUaGlzIGlzIHRoZSB0eXBlIHN0YWNrIHVzZWQgYnkgdGhlIGRlYnVnIHdyaXRpbmcgcm91dGluZXMuICBGSVhNRToKLSAgIFdlIGNvdWxkIGdlbmVyYXRlIG1vcmUgZWZmaWNpZW50IG91dHB1dCBpZiB3ZSByZW1lbWJlcmVkIHdoZW4gd2UKLSAgIGhhdmUgb3V0cHV0IGEgcGFydGljdWxhciB0eXBlIGJlZm9yZS4gICovCi0KLXN0cnVjdCBpZWVlX3R5cGVfc3RhY2sKLXsKLSAgLyogTmV4dCBlbnRyeSBvbiBzdGFjay4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVfc3RhY2sgKm5leHQ7Ci0gIC8qIFR5cGUgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgaWVlZV93cml0ZV90eXBlIHR5cGU7Ci19OwotCi0vKiBUaGlzIGlzIGEgbGlzdCBvZiBhc3NvY2lhdGlvbnMgYmV0d2VlbiBhIG5hbWUgYW5kIHNvbWUgdHlwZXMuCi0gICBUaGVzZSBhcmUgdXNlZCBmb3IgdHlwZWRlZnMgYW5kIHRhZ3MuICAqLwotCi1zdHJ1Y3QgaWVlZV9uYW1lX3R5cGUKLXsKLSAgLyogTmV4dCB0eXBlIGZvciB0aGlzIG5hbWUuICAqLwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm5leHQ7Ci0gIC8qIElEIG51bWJlci4gIEZvciBhIHR5cGVkZWYsIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSB0eXBlIHRvIHdoaWNoCi0gICAgIHRoaXMgbmFtZSBpcyB0eXBlZGVmZWQuICAqLwotICB1bnNpZ25lZCBpbnQgaWQ7Ci0gIC8qIFR5cGUuICAqLwotICBzdHJ1Y3QgaWVlZV93cml0ZV90eXBlIHR5cGU7Ci0gIC8qIElmIHRoaXMgaXMgYSB0YWcgd2hpY2ggaGFzIG5vdCB5ZXQgYmVlbiBkZWZpbmVkLCB0aGlzIGlzIHRoZQotICAgICBraW5kLiAgSWYgdGhlIHRhZyBoYXMgYmVlbiBkZWZpbmVkLCB0aGlzIGlzIERFQlVHX0tJTkRfSUxMRUdBTC4gICovCi0gIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci19OwotCi0vKiBXZSB1c2UgYSBoYXNoIHRhYmxlIHRvIGFzc29jaWF0ZSBuYW1lcyBhbmQgdHlwZXMuICAqLwotCi1zdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLXN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBJbmZvcm1hdGlvbiBmb3IgdGhpcyBuYW1lLiAgKi8KLSAgc3RydWN0IGllZWVfbmFtZV90eXBlICp0eXBlczsKLX07Ci0KLS8qIFRoaXMgaXMgYSBsaXN0IG9mIGVudW1zLiAgKi8KLQotc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtCi17Ci0gIC8qIE5leHQgZW51bS4gICovCi0gIHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqbmV4dDsKLSAgLyogVHlwZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBpbmR4OwotICAvKiBXaGV0aGVyIHRoaXMgZW51bSBoYXMgYmVlbiBkZWZpbmVkLiAgKi8KLSAgYm9vbGVhbiBkZWZpbmVkOwotICAvKiBUYWcuICAqLwotICBjb25zdCBjaGFyICp0YWc7Ci0gIC8qIE5hbWVzLiAgKi8KLSAgY29uc3QgY2hhciAqKm5hbWVzOwotICAvKiBWYWx1ZXMuICAqLwotICBiZmRfc2lnbmVkX3ZtYSAqdmFsczsKLX07Ci0KLS8qIFdlIGtlZXAgYSBsaXN0IG9mIG1vZGlmaWVkIHZlcnNpb25zIG9mIHR5cGVzLCBzbyB0aGF0IHdlIGRvbid0Ci0gICBvdXRwdXQgdGhlbSBtb3JlIHRoYW4gb25jZS4gICovCi0KLXN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUKLXsKLSAgLyogUG9pbnRlciB0byB0aGlzIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgcG9pbnRlcjsKLSAgLyogRnVuY3Rpb24gd2l0aCB1bmtub3duIGFyZ3VtZW50cyByZXR1cm5pbmcgdGhpcyB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IGZ1bmN0aW9uOwotICAvKiBDb25zdCB2ZXJzaW9uIG9mIHRoaXMgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBjb25zdF9xdWFsaWZpZWQ7Ci0gIC8qIFZvbGF0aWxlIHZlcnNpb24gb2YgdGhpcyB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHZvbGF0aWxlX3F1YWxpZmllZDsKLSAgLyogTGlzdCBvZiBhcnJheXMgb2YgdGhpcyB0eXBlIG9mIHZhcmlvdXMgYm91bmRzLiAgKi8KLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfYXJyYXlfdHlwZSAqYXJyYXlzOwotfTsKLQotLyogQSBsaXN0IG9mIGFycmF5cyBib3VuZHMuICAqLwotCi1zdHJ1Y3QgaWVlZV9tb2RpZmllZF9hcnJheV90eXBlCi17Ci0gIC8qIE5leHQgYXJyYXkgYm91bmRzLiAgKi8KLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfYXJyYXlfdHlwZSAqbmV4dDsKLSAgLyogVHlwZSBpbmRleCB3aXRoIHRoZXNlIGJvdW5kcy4gICovCi0gIHVuc2lnbmVkIGludCBpbmR4OwotICAvKiBMb3cgYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSBsb3c7Ci0gIC8qIEhpZ2ggYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSBoaWdoOwotfTsKLQotLyogVGhpcyBpcyBhIGxpc3Qgb2YgcGVuZGluZyBmdW5jdGlvbiBwYXJhbWV0ZXIgaW5mb3JtYXRpb24uICBXZSBkb24ndAotICAgb3V0cHV0IHRoZW0gdW50aWwgd2Ugc2VlIHRoZSBmaXJzdCBibG9jay4gICovCi0KLXN0cnVjdCBpZWVlX3BlbmRpbmdfcGFybQotewotICAvKiBOZXh0IHBlbmRpbmcgcGFyYW1ldGVyLiAgKi8KLSAgc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICpuZXh0OwotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVHlwZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCB0eXBlOwotICAvKiBXaGV0aGVyIHRoZSB0eXBlIGlzIGEgcmVmZXJlbmNlLiAgKi8KLSAgYm9vbGVhbiByZWZlcmVuY2VwOwotICAvKiBLaW5kLiAgKi8KLSAgZW51bSBkZWJ1Z19wYXJtX2tpbmQga2luZDsKLSAgLyogVmFsdWUuICAqLwotICBiZmRfdm1hIHZhbDsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGhhbmRsZSBwYXNzZWQgZG93biBieSBkZWJ1Z193cml0ZS4gICovCi0KLXN0cnVjdCBpZWVlX2hhbmRsZQotewotICAvKiBCRkQgd2UgYXJlIHdyaXRpbmcgdG8uICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIFdoZXRoZXIgd2UgZ290IGFuIGVycm9yIGluIGEgc3Vicm91dGluZSBjYWxsZWQgdmlhIHRyYXZlcnNlIG9yCi0gICAgIG1hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLSAgYm9vbGVhbiBlcnJvcjsKLSAgLyogQ3VycmVudCBkYXRhIGJ1ZmZlciBsaXN0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCAqY3VycmVudDsKLSAgLyogQ3VycmVudCBkYXRhIGJ1ZmZlci4gICovCi0gIHN0cnVjdCBpZWVlX2J1ZiAqY3VyYnVmOwotICAvKiBGaWxlbmFtZSBvZiBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgLyogTW9kdWxlIG5hbWUgb2YgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgY29uc3QgY2hhciAqbW9kbmFtZTsKLSAgLyogTGlzdCBvZiBidWZmZXIgZm9yIGdsb2JhbCB0eXBlcy4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgZ2xvYmFsX3R5cGVzOwotICAvKiBMaXN0IG9mIGZpbmlzaGVkIGRhdGEgYnVmZmVycy4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgZGF0YTsKLSAgLyogTGlzdCBvZiBidWZmZXJzIGZvciB0eXBlZGVmcyBpbiB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCB0eXBlczsKLSAgLyogTGlzdCBvZiBidWZmZXJzIGZvciB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBpbiB0aGUgY3VycmVudAotICAgICBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCB2YXJzOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIEMrKyBjbGFzcyBkZWZpbml0aW9ucyBpbiB0aGUgY3VycmVudAotICAgICBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBjeHg7Ci0gIC8qIExpc3Qgb2YgYnVmZmVycyBmb3IgbGluZSBudW1iZXJzIGluIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGxpbmVub3M7Ci0gIC8qIFJhbmdlcyBmb3IgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBpZWVlX3JhbmdlICpyYW5nZXM7Ci0gIC8qIFJhbmdlcyBmb3IgYWxsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBpZWVlX3JhbmdlICpnbG9iYWxfcmFuZ2VzOwotICAvKiBOZXN0ZWQgcGVuZGluZyByYW5nZXMuICAqLwotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqcGVuZGluZ19yYW5nZXM7Ci0gIC8qIFR5cGUgc3RhY2suICAqLwotICBzdHJ1Y3QgaWVlZV90eXBlX3N0YWNrICp0eXBlX3N0YWNrOwotICAvKiBOZXh0IHVuYWxsb2NhdGVkIHR5cGUgaW5kZXguICAqLwotICB1bnNpZ25lZCBpbnQgdHlwZV9pbmR4OwotICAvKiBOZXh0IHVuYWxsb2NhdGVkIG5hbWUgaW5kZXguICAqLwotICB1bnNpZ25lZCBpbnQgbmFtZV9pbmR4OwotICAvKiBUeXBlZGVmcy4gICovCi0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX3RhYmxlIHR5cGVkZWZzOwotICAvKiBUYWdzLiAgKi8KLSAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfdGFibGUgdGFnczsKLSAgLyogRW51bXMuICAqLwotICBzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKmVudW1zOwotICAvKiBNb2RpZmllZCB2ZXJzaW9ucyBvZiB0eXBlcy4gICovCi0gIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKm1vZGlmaWVkOwotICAvKiBOdW1iZXIgb2YgZW50cmllcyBhbGxvY2F0ZWQgaW4gbW9kaWZpZWQuICAqLwotICB1bnNpZ25lZCBpbnQgbW9kaWZpZWRfYWxsb2M7Ci0gIC8qIDQgYnl0ZSBjb21wbGV4IHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgY29tcGxleF9mbG9hdF9pbmRleDsKLSAgLyogOCBieXRlIGNvbXBsZXggdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBjb21wbGV4X2RvdWJsZV9pbmRleDsKLSAgLyogVGhlIGRlcHRoIG9mIGJsb2NrIG5lc3RpbmcuICBUaGlzIGlzIDAgb3V0c2lkZSBhIGZ1bmN0aW9uLCBhbmQgMQotICAgICBqdXN0IGFmdGVyIHN0YXJ0X2Z1bmN0aW9uIGlzIGNhbGxlZC4gICovCi0gIHVuc2lnbmVkIGludCBibG9ja19kZXB0aDsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotICBjb25zdCBjaGFyICpmbm5hbWU7Ci0gIC8qIExpc3Qgb2YgYnVmZmVycyBmb3IgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIHdlIGFyZSBjdXJyZW50bHkKLSAgICAgd3JpdGluZyBvdXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGZudHlwZTsKLSAgLyogTGlzdCBvZiBidWZmZXJzIGZvciB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZnVuY3Rpb24gd2UgYXJlCi0gICAgIGN1cnJlbnRseSB3cml0aW5nIG91dC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgZm5hcmdzOwotICAvKiBOdW1iZXIgb2YgYXJndW1lbnRzIHdyaXR0ZW4gdG8gZm5hcmdzLiAgKi8KLSAgdW5zaWduZWQgaW50IGZuYXJnY291bnQ7Ci0gIC8qIFBlbmRpbmcgZnVuY3Rpb24gcGFyYW1ldGVycy4gICovCi0gIHN0cnVjdCBpZWVlX3BlbmRpbmdfcGFybSAqcGVuZGluZ19wYXJtczsKLSAgLyogQ3VycmVudCBsaW5lIG51bWJlciBmaWxlbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKmxpbmVub19maWxlbmFtZTsKLSAgLyogTGluZSBudW1iZXIgbmFtZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBsaW5lbm9fbmFtZV9pbmR4OwotICAvKiBGaWxlbmFtZSBvZiBwZW5kaW5nIGxpbmUgbnVtYmVyLiAgKi8KLSAgY29uc3QgY2hhciAqcGVuZGluZ19saW5lbm9fZmlsZW5hbWU7Ci0gIC8qIFBlbmRpbmcgbGluZSBudW1iZXIuICAqLwotICB1bnNpZ25lZCBsb25nIHBlbmRpbmdfbGluZW5vOwotICAvKiBBZGRyZXNzIG9mIHBlbmRpbmcgbGluZSBudW1iZXIuICAqLwotICBiZmRfdm1hIHBlbmRpbmdfbGluZW5vX2FkZHI7Ci0gIC8qIEhpZ2hlc3QgYWRkcmVzcyBzZWVuIGF0IGVuZCBvZiBwcm9jZWR1cmUuICAqLwotICBiZmRfdm1hIGhpZ2hhZGRyOwotfTsKLQotc3RhdGljIGJvb2xlYW4gaWVlZV9pbml0X2J1ZmZlcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgc3RydWN0IGllZWVfYnVmbGlzdCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NoYW5nZV9idWZmZXIKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9hcHBlbmRfYnVmZmVyCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBzdHJ1Y3QgaWVlZV9idWZsaXN0ICosCi0JICAgc3RydWN0IGllZWVfYnVmbGlzdCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWxfd3JpdGVfYnl0ZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlXzJieXRlcyBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX251bWJlciBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9pZCBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2FzbgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgdW5zaWduZWQgaW50LCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2F0bjY1Ci0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCB1bnNpZ25lZCBpbnQsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9wdXNoX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBib29sZWFuLAotCSAgIGJvb2xlYW4pKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaWVlZV9wb3BfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikpOwotc3RhdGljIHZvaWQgaWVlZV9wb3BfdW51c2VkX3R5cGUgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaWVlZV9wb3BfdHlwZV91c2VkCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2FkZF9yYW5nZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgYm9vbGVhbiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zdGFydF9yYW5nZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9lbmRfcmFuZ2UgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZGVmaW5lX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9kZWZpbmVfbmFtZWRfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkgICBib29sZWFuLCBib29sZWFuLCBzdHJ1Y3QgaWVlZV9idWZsaXN0ICopKTsKLXN0YXRpYyBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICppZWVlX2dldF9tb2RpZmllZF9pbmZvCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmllZWVfbmFtZV90eXBlX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfdW5kZWZpbmVkX3RhZwotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZmluaXNoX2NvbXBpbGF0aW9uX3VuaXQgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICopKTsKLXN0YXRpYyB2b2lkIGllZWVfYWRkX2JiMTFfYmxvY2tzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYWRkX2JiMTEKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGFzZWN0aW9uICosIGJmZF92bWEsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfb3V0cHV0X3BlbmRpbmdfcGFybXMgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaWVlZV92aXNfdG9fZmxhZ3MgUEFSQU1TICgoZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NsYXNzX21ldGhvZF92YXIKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLAotCSAgIGJvb2xlYW4sIGJvb2xlYW4sIGJmZF92bWEsIGJvb2xlYW4pKTsKLQotc3RhdGljIGJvb2xlYW4gaWVlZV9zdGFydF9jb21waWxhdGlvbl91bml0IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X3NvdXJjZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9lbXB0eV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV92b2lkX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2ludF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2Zsb2F0X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY29tcGxleF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2Jvb2xfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9lbnVtX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosIGJmZF9zaWduZWRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcG9pbnRlcl90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9mdW5jdGlvbl90eXBlIFBBUkFNUyAoKFBUUiwgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlZmVyZW5jZV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yYW5nZV90eXBlIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2FycmF5X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc2V0X3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX29mZnNldF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9tZXRob2RfdHlwZSBQQVJBTVMgKChQVFIsIGJvb2xlYW4sIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jb25zdF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV92b2xhdGlsZV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zdGFydF9zdHJ1Y3RfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc3RydWN0X2ZpZWxkCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hLCBiZmRfdm1hLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZW5kX3N0cnVjdF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zdGFydF9jbGFzc190eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIHVuc2lnbmVkIGludCwgYm9vbGVhbiwKLQkgICBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NsYXNzX3N0YXRpY19tZW1iZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NsYXNzX2Jhc2VjbGFzcwotICBQQVJBTVMgKChQVFIsIGJmZF92bWEsIGJvb2xlYW4sIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19zdGFydF9tZXRob2QgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3NfbWV0aG9kX3ZhcmlhbnQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwgYm9vbGVhbiwKLQkgICBiZmRfdm1hLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NsYXNzX2VuZF9tZXRob2QgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VuZF9jbGFzc190eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV90eXBlZGVmX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfdGFnX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgZW51bSBkZWJ1Z190eXBlX2tpbmQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfdHlwZGVmIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3RhZyBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9pbnRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZmxvYXRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV90eXBlZF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV92YXJpYWJsZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192YXJfa2luZCwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zdGFydF9mdW5jdGlvbiBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9mdW5jdGlvbl9wYXJhbWV0ZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfcGFybV9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X2Jsb2NrIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9lbmRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VuZF9mdW5jdGlvbiBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfbGluZW5vCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBiZmRfdm1hKSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zIGllZWVfZm5zID0KLXsKLSAgaWVlZV9zdGFydF9jb21waWxhdGlvbl91bml0LAotICBpZWVlX3N0YXJ0X3NvdXJjZSwKLSAgaWVlZV9lbXB0eV90eXBlLAotICBpZWVlX3ZvaWRfdHlwZSwKLSAgaWVlZV9pbnRfdHlwZSwKLSAgaWVlZV9mbG9hdF90eXBlLAotICBpZWVlX2NvbXBsZXhfdHlwZSwKLSAgaWVlZV9ib29sX3R5cGUsCi0gIGllZWVfZW51bV90eXBlLAotICBpZWVlX3BvaW50ZXJfdHlwZSwKLSAgaWVlZV9mdW5jdGlvbl90eXBlLAotICBpZWVlX3JlZmVyZW5jZV90eXBlLAotICBpZWVlX3JhbmdlX3R5cGUsCi0gIGllZWVfYXJyYXlfdHlwZSwKLSAgaWVlZV9zZXRfdHlwZSwKLSAgaWVlZV9vZmZzZXRfdHlwZSwKLSAgaWVlZV9tZXRob2RfdHlwZSwKLSAgaWVlZV9jb25zdF90eXBlLAotICBpZWVlX3ZvbGF0aWxlX3R5cGUsCi0gIGllZWVfc3RhcnRfc3RydWN0X3R5cGUsCi0gIGllZWVfc3RydWN0X2ZpZWxkLAotICBpZWVlX2VuZF9zdHJ1Y3RfdHlwZSwKLSAgaWVlZV9zdGFydF9jbGFzc190eXBlLAotICBpZWVlX2NsYXNzX3N0YXRpY19tZW1iZXIsCi0gIGllZWVfY2xhc3NfYmFzZWNsYXNzLAotICBpZWVlX2NsYXNzX3N0YXJ0X21ldGhvZCwKLSAgaWVlZV9jbGFzc19tZXRob2RfdmFyaWFudCwKLSAgaWVlZV9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQsCi0gIGllZWVfY2xhc3NfZW5kX21ldGhvZCwKLSAgaWVlZV9lbmRfY2xhc3NfdHlwZSwKLSAgaWVlZV90eXBlZGVmX3R5cGUsCi0gIGllZWVfdGFnX3R5cGUsCi0gIGllZWVfdHlwZGVmLAotICBpZWVlX3RhZywKLSAgaWVlZV9pbnRfY29uc3RhbnQsCi0gIGllZWVfZmxvYXRfY29uc3RhbnQsCi0gIGllZWVfdHlwZWRfY29uc3RhbnQsCi0gIGllZWVfdmFyaWFibGUsCi0gIGllZWVfc3RhcnRfZnVuY3Rpb24sCi0gIGllZWVfZnVuY3Rpb25fcGFyYW1ldGVyLAotICBpZWVlX3N0YXJ0X2Jsb2NrLAotICBpZWVlX2VuZF9ibG9jaywKLSAgaWVlZV9lbmRfZnVuY3Rpb24sCi0gIGllZWVfbGluZW5vCi19OwotCi0vKiBJbml0aWFsaXplIGEgYnVmZmVyIHRvIGJlIGVtcHR5LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgYnVmbGlzdCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKmJ1Zmxpc3Q7Ci17Ci0gIGJ1Zmxpc3QtPmhlYWQgPSBOVUxMOwotICBidWZsaXN0LT50YWlsID0gTlVMTDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGEgYnVmZmVyIGxpc3QgaGFzIGFueSBkYXRhLiAgKi8KLQotI2RlZmluZSBpZWVlX2J1ZmZlcl9lbXB0eXAoYnVmbGlzdCkgKChidWZsaXN0KS0+aGVhZCA9PSBOVUxMKQotCi0vKiBDaGFuZ2UgdGhlIGN1cnJlbnQgYnVmZmVyIHRvIGEgc3BlY2lmaWVkIGJ1ZmZlciBjaGFpbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sIGJ1Zmxpc3QpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqYnVmbGlzdDsKLXsKLSAgaWYgKGJ1Zmxpc3QtPmhlYWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWVlZV9idWYgKmJ1ZjsKLQotICAgICAgYnVmID0gKHN0cnVjdCBpZWVlX2J1ZiAqKSB4bWFsbG9jIChzaXplb2YgKmJ1Zik7Ci0gICAgICBidWYtPm5leHQgPSBOVUxMOwotICAgICAgYnVmLT5jID0gMDsKLSAgICAgIGJ1Zmxpc3QtPmhlYWQgPSBidWY7Ci0gICAgICBidWZsaXN0LT50YWlsID0gYnVmOwotICAgIH0KLQotICBpbmZvLT5jdXJyZW50ID0gYnVmbGlzdDsKLSAgaW5mby0+Y3VyYnVmID0gYnVmbGlzdC0+dGFpbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXBwZW5kIGEgYnVmZmVyIGNoYWluLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCBtYWluYnVmLCBuZXdidWYpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICptYWluYnVmOwotICAgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpuZXdidWY7Ci17Ci0gIGlmIChuZXdidWYtPmhlYWQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobWFpbmJ1Zi0+aGVhZCA9PSBOVUxMKQotCW1haW5idWYtPmhlYWQgPSBuZXdidWYtPmhlYWQ7Ci0gICAgICBlbHNlCi0JbWFpbmJ1Zi0+dGFpbC0+bmV4dCA9IG5ld2J1Zi0+aGVhZDsKLSAgICAgIG1haW5idWYtPnRhaWwgPSBuZXdidWYtPnRhaWw7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgYSBieXRlIGludG8gdGhlIGJ1ZmZlci4gIFdlIHVzZSBhIG1hY3JvIGZvciBzcGVlZCBhbmQgYQotICAgZnVuY3Rpb24gZm9yIHRoZSBjb21wbGV4IGNhc2VzLiAgKi8KLQotI2RlZmluZSBpZWVlX3dyaXRlX2J5dGUoaW5mbywgYikJCQkJXAotICAoKGluZm8pLT5jdXJidWYtPmMgPCBJRUVFX0JVRlNJWkUJCQkJXAotICAgPyAoKGluZm8pLT5jdXJidWYtPmJ1ZlsoaW5mbyktPmN1cmJ1Zi0+YysrXSA9IChiKSwgdHJ1ZSkJXAotICAgOiBpZWVlX3JlYWxfd3JpdGVfYnl0ZSAoKGluZm8pLCAoYikpKQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFsX3dyaXRlX2J5dGUgKGluZm8sIGIpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgaW50IGI7Ci17Ci0gIGlmIChpbmZvLT5jdXJidWYtPmMgPj0gSUVFRV9CVUZTSVpFKQotICAgIHsKLSAgICAgIHN0cnVjdCBpZWVlX2J1ZiAqbjsKLQotICAgICAgbiA9IChzdHJ1Y3QgaWVlZV9idWYgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgICAgIG4tPm5leHQgPSBOVUxMOwotICAgICAgbi0+YyA9IDA7Ci0gICAgICBpZiAoaW5mby0+Y3VycmVudC0+aGVhZCA9PSBOVUxMKQotCWluZm8tPmN1cnJlbnQtPmhlYWQgPSBuOwotICAgICAgZWxzZQotCWluZm8tPmN1cnJlbnQtPnRhaWwtPm5leHQgPSBuOwotICAgICAgaW5mby0+Y3VycmVudC0+dGFpbCA9IG47Ci0gICAgICBpbmZvLT5jdXJidWYgPSBuOwotICAgIH0KLQotICBpbmZvLT5jdXJidWYtPmJ1ZltpbmZvLT5jdXJidWYtPmNdID0gYjsKLSAgKytpbmZvLT5jdXJidWYtPmM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0d28gYnl0ZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIGkpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgaW50IGk7Ci17Ci0gIHJldHVybiAoaWVlZV93cml0ZV9ieXRlIChpbmZvLCBpID4+IDgpCi0JICAmJiBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIGkgJiAweGZmKSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBpbnRlZ2VyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB2KQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGJmZF92bWEgdjsKLXsKLSAgYmZkX3ZtYSB0OwotICBiZmRfYnl0ZSBhYlsyMF07Ci0gIGJmZF9ieXRlICpwOwotICB1bnNpZ25lZCBpbnQgYzsKLQotICBpZiAodiA8PSAoYmZkX3ZtYSkgaWVlZV9udW1iZXJfZW5kX2VudW0pCi0gICAgcmV0dXJuIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgdik7Ci0KLSAgdCA9IHY7Ci0gIHAgPSBhYiArIHNpemVvZiBhYjsKLSAgd2hpbGUgKHQgIT0gMCkKLSAgICB7Ci0gICAgICAqLS1wID0gdCAmIDB4ZmY7Ci0gICAgICB0ID4+PSA4OwotICAgIH0KLSAgYyA9IChhYiArIDIwKSAtIHA7Ci0KLSAgaWYgKGMgPiAodW5zaWduZWQgaW50KSAoaWVlZV9udW1iZXJfcmVwZWF0X2VuZF9lbnVtCi0JCQkgIC0gaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW0pKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiSUVFRSBudW1lcmljIG92ZXJmbG93OiAweCIpKTsKLSAgICAgIGZwcmludGZfdm1hIChzdGRlcnIsIHYpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bSArIGMpKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yICg7IGMgPiAwOyAtLWMsICsrcCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sICpwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSBzdHJpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9pZCAoaW5mbywgcykKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpzOwotewotICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gIGxlbiA9IHN0cmxlbiAocyk7Ci0gIGlmIChsZW4gPD0gMHg3ZikKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIGxlbikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAobGVuIDw9IDB4ZmYpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMV9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIGxlbikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAobGVuIDw9IDB4ZmZmZikKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8yX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCBsZW4pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIklFRUUgc3RyaW5nIGxlbmd0aCBvdmVyZmxvdzogJXVcbiIpLCBsZW4pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBmb3IgKDsgKnMgIT0gJ1wwJzsgcysrKQotICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKnMpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gQVNOIHJlY29yZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2FzbiAoaW5mbywgaW5keCwgdmFsKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIHVuc2lnbmVkIGludCBpbmR4OwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgcmV0dXJuIChpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hc25fcmVjb3JkX2VudW0pCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB2YWwpKTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIEFUTjY1IHJlY29yZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBpbmR4LCBzKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIHVuc2lnbmVkIGludCBpbmR4OwotICAgICBjb25zdCBjaGFyICpzOwotewotICByZXR1cm4gKGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNjUpCi0JICAmJiBpZWVlX3dyaXRlX2lkIChpbmZvLCBzKSk7Ci19Ci0KLS8qIFB1c2ggYSB0eXBlIGluZGV4IG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9wdXNoX3R5cGUgKGluZm8sIGluZHgsIHNpemUsIHVuc2lnbmVkcCwgbG9jYWxwKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIHVuc2lnbmVkIGludCBpbmR4OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci0gICAgIGJvb2xlYW4gbG9jYWxwOwotewotICBzdHJ1Y3QgaWVlZV90eXBlX3N0YWNrICp0czsKLQotICB0cyA9IChzdHJ1Y3QgaWVlZV90eXBlX3N0YWNrICopIHhtYWxsb2MgKHNpemVvZiAqdHMpOwotICBtZW1zZXQgKHRzLCAwLCBzaXplb2YgKnRzKTsKLQotICB0cy0+dHlwZS5pbmR4ID0gaW5keDsKLSAgdHMtPnR5cGUuc2l6ZSA9IHNpemU7Ci0gIHRzLT50eXBlLnVuc2lnbmVkcCA9IHVuc2lnbmVkcDsKLSAgdHMtPnR5cGUubG9jYWxwID0gbG9jYWxwOwotCi0gIHRzLT5uZXh0ID0gaW5mby0+dHlwZV9zdGFjazsKLSAgaW5mby0+dHlwZV9zdGFjayA9IHRzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQb3AgYSB0eXBlIGluZGV4IG9mZiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWllZWVfcG9wX3R5cGUgKGluZm8pCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLXsKLSAgcmV0dXJuIGllZWVfcG9wX3R5cGVfdXNlZCAoaW5mbywgdHJ1ZSk7Ci19Ci0KLS8qIFBvcCBhbiB1bnVzZWQgdHlwZSBpbmRleCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgdm9pZAotaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLXsKLSAgKHZvaWQpIGllZWVfcG9wX3R5cGVfdXNlZCAoaW5mbywgZmFsc2UpOwotfQotCi0vKiBQb3AgYSB1c2VkIG9yIHVudXNlZCB0eXBlIGluZGV4IG9mZiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWllZWVfcG9wX3R5cGVfdXNlZCAoaW5mbywgdXNlZCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBib29sZWFuIHVzZWQ7Ci17Ci0gIHN0cnVjdCBpZWVlX3R5cGVfc3RhY2sgKnRzOwotICB1bnNpZ25lZCBpbnQgcmV0OwotCi0gIHRzID0gaW5mby0+dHlwZV9zdGFjazsKLSAgYXNzZXJ0ICh0cyAhPSBOVUxMKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24gdHlwZSwgYW5kIHdlIG5lZWQgaXQsIHdlIG5lZWQgdG8gYXBwZW5kIHRoZQotICAgICBhY3R1YWwgZGVmaW5pdGlvbiB0byB0aGUgdHlwZWRlZiBibG9jayBub3cuICAqLwotICBpZiAodXNlZCAmJiAhIGllZWVfYnVmZmVyX2VtcHR5cCAoJnRzLT50eXBlLmZuZGVmKSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpidWZsaXN0OwotCi0gICAgICBpZiAodHMtPnR5cGUubG9jYWxwKQotCXsKLQkgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHN0YXJ0ZWQgdGhlIHR5cGVzIGJsb2NrLiAgKi8KLQkgIGlmIChpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlcykpCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMSkKLQkJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnVmbGlzdCA9ICZpbmZvLT50eXBlczsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTWFrZSBzdXJlIHdlIHN0YXJ0ZWQgdGhlIGdsb2JhbCB0eXBlIGJsb2NrLiAgKi8KLQkgIGlmIChpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5nbG9iYWxfdHlwZXMpKQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Z2xvYmFsX3R5cGVzKQotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAyKQotCQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnVmbGlzdCA9ICZpbmZvLT5nbG9iYWxfdHlwZXM7Ci0JfQotCi0gICAgICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sIGJ1Zmxpc3QsICZ0cy0+dHlwZS5mbmRlZikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXQgPSB0cy0+dHlwZS5pbmR4OwotICBpbmZvLT50eXBlX3N0YWNrID0gdHMtPm5leHQ7Ci0gIGZyZWUgKHRzKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQWRkIGEgcmFuZ2Ugb2YgYnl0ZXMgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2FkZF9yYW5nZSAoaW5mbywgZ2xvYmFsLCBsb3csIGhpZ2gpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgYm9vbGVhbiBnbG9iYWw7Ci0gICAgIGJmZF92bWEgbG93OwotICAgICBiZmRfdm1hIGhpZ2g7Ci17Ci0gIHN0cnVjdCBpZWVlX3JhbmdlICoqcGxpc3QsICpyLCAqKnByOwotCi0gIGlmIChsb3cgPT0gKGJmZF92bWEpIC0xIHx8IGhpZ2ggPT0gKGJmZF92bWEpIC0xIHx8IGxvdyA9PSBoaWdoKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChnbG9iYWwpCi0gICAgcGxpc3QgPSAmaW5mby0+Z2xvYmFsX3JhbmdlczsKLSAgZWxzZQotICAgIHBsaXN0ID0gJmluZm8tPnJhbmdlczsKLQotICBmb3IgKHIgPSAqcGxpc3Q7IHIgIT0gTlVMTDsgciA9IHItPm5leHQpCi0gICAgewotICAgICAgaWYgKGhpZ2ggPj0gci0+bG93ICYmIGxvdyA8PSByLT5oaWdoKQotCXsKLQkgIC8qIFRoZSBuZXcgcmFuZ2Ugb3ZlcmxhcHMgci4gICovCi0JICBpZiAobG93IDwgci0+bG93KQotCSAgICByLT5sb3cgPSBsb3c7Ci0JICBpZiAoaGlnaCA+IHItPmhpZ2gpCi0JICAgIHItPmhpZ2ggPSBoaWdoOwotCSAgcHIgPSAmci0+bmV4dDsKLQkgIHdoaWxlICgqcHIgIT0gTlVMTCAmJiAoKnByKS0+bG93IDw9IHItPmhpZ2gpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgaWVlZV9yYW5nZSAqbjsKLQotCSAgICAgIGlmICgoKnByKS0+aGlnaCA+IHItPmhpZ2gpCi0JCXItPmhpZ2ggPSAoKnByKS0+aGlnaDsKLQkgICAgICBuID0gKCpwciktPm5leHQ7Ci0JICAgICAgZnJlZSAoKnByKTsKLQkgICAgICAqcHIgPSBuOwotCSAgICB9Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IGllZWVfcmFuZ2UgKikgeG1hbGxvYyAoc2l6ZW9mICpyKTsKLSAgbWVtc2V0IChyLCAwLCBzaXplb2YgKnIpOwotCi0gIHItPmxvdyA9IGxvdzsKLSAgci0+aGlnaCA9IGhpZ2g7Ci0KLSAgLyogU3RvcmUgdGhlIHJhbmdlcyBzb3J0ZWQgYnkgYWRkcmVzcy4gICovCi0gIGZvciAocHIgPSBwbGlzdDsgKnByICE9IE5VTEw7IHByID0gJigqcHIpLT5uZXh0KQotICAgIGlmICgoKnByKS0+bG93ID4gaGlnaCkKLSAgICAgIGJyZWFrOwotICByLT5uZXh0ID0gKnByOwotICAqcHIgPSByOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIG5ldyByYW5nZSBmb3Igd2hpY2ggd2Ugb25seSBoYXZlIHRoZSBsb3cgYWRkcmVzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3N0YXJ0X3JhbmdlIChpbmZvLCBsb3cpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgYmZkX3ZtYSBsb3c7Ci17Ci0gIHN0cnVjdCBpZWVlX3JhbmdlICpyOwotCi0gIHIgPSAoc3RydWN0IGllZWVfcmFuZ2UgKikgeG1hbGxvYyAoc2l6ZW9mICpyKTsKLSAgbWVtc2V0IChyLCAwLCBzaXplb2YgKnIpOwotICByLT5sb3cgPSBsb3c7Ci0gIHItPm5leHQgPSBpbmZvLT5wZW5kaW5nX3JhbmdlczsKLSAgaW5mby0+cGVuZGluZ19yYW5nZXMgPSByOwotICByZXR1cm4gdHJ1ZTsKLX0gIAotCi0vKiBGaW5pc2ggYSByYW5nZSBzdGFydGVkIGJ5IGllZWVfc3RhcnRfcmFuZ2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9lbmRfcmFuZ2UgKGluZm8sIGhpZ2gpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgYmZkX3ZtYSBoaWdoOwotewotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqcjsKLSAgYmZkX3ZtYSBsb3c7Ci0KLSAgYXNzZXJ0IChpbmZvLT5wZW5kaW5nX3JhbmdlcyAhPSBOVUxMKTsKLSAgciA9IGluZm8tPnBlbmRpbmdfcmFuZ2VzOwotICBsb3cgPSByLT5sb3c7Ci0gIGluZm8tPnBlbmRpbmdfcmFuZ2VzID0gci0+bmV4dDsKLSAgZnJlZSAocik7Ci0gIHJldHVybiBpZWVlX2FkZF9yYW5nZSAoaW5mbywgZmFsc2UsIGxvdywgaGlnaCk7Ci19Ci0KLS8qIFN0YXJ0IGRlZmluaW5nIGEgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci0gICAgIGJvb2xlYW4gbG9jYWxwOwotewotICByZXR1cm4gaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSAoaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgKHVuc2lnbmVkIGludCkgLTEsIHNpemUsIHVuc2lnbmVkcCwKLQkJCQkgbG9jYWxwLCAoc3RydWN0IGllZWVfYnVmbGlzdCAqKSBOVUxMKTsKLX0KLQotLyogU3RhcnQgZGVmaW5pbmcgYSBuYW1lZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIG5hbWUsIGluZHgsIHNpemUsIHVuc2lnbmVkcCwgbG9jYWxwLCBidWZsaXN0KQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHVuc2lnbmVkIGludCBpbmR4OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci0gICAgIGJvb2xlYW4gbG9jYWxwOwotICAgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpidWZsaXN0OwotewotICB1bnNpZ25lZCBpbnQgdHlwZV9pbmR4OwotICB1bnNpZ25lZCBpbnQgbmFtZV9pbmR4OwotCi0gIGlmIChpbmR4ICE9ICh1bnNpZ25lZCBpbnQpIC0xKQotICAgIHR5cGVfaW5keCA9IGluZHg7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0eXBlX2luZHggPSBpbmZvLT50eXBlX2luZHg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5keDsKLSAgICB9Ci0KLSAgbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICArK2luZm8tPm5hbWVfaW5keDsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIG5hbWUgPSAiIjsKLQotICAvKiBJZiB3ZSB3ZXJlIGdpdmVuIGEgYnVmZmVyLCB1c2UgaXQ7IG90aGVyd2lzZSwgdXNlIGVpdGhlciB0aGUKLSAgICAgbG9jYWwgb3IgdGhlIGdsb2JhbCB0eXBlIGluZm9ybWF0aW9uLCBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIHR5cGUKLSAgICAgYmxvY2sgaXMgc3RhcnRlZC4gICovCi0gIGlmIChidWZsaXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCBidWZsaXN0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlIGlmIChsb2NhbHApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZXMpKQotCXsKLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Z2xvYmFsX3R5cGVzKSkKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5nbG9iYWxfdHlwZXMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmdsb2JhbF90eXBlcykKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMikKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBQdXNoIHRoZSBuZXcgdHlwZSBvbiB0aGUgdHlwZSBzdGFjaywgd3JpdGUgb3V0IGFuIE5OIHJlY29yZCwgYW5kCi0gICAgIHdyaXRlIG91dCB0aGUgc3RhcnQgb2YgYSBUWSByZWNvcmQuICBUaGUgY2FsbGVyIHdpbGwgdGhlbiBmaW5pc2gKLSAgICAgdGhlIFRZIHJlY29yZC4gICovCi0gIGlmICghIGllZWVfcHVzaF90eXBlIChpbmZvLCB0eXBlX2luZHgsIHNpemUsIHVuc2lnbmVkcCwgbG9jYWxwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIChpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5hbWVfaW5keCkKLQkgICYmIGllZWVfd3JpdGVfaWQgKGluZm8sIG5hbWUpCi0JICAmJiBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfdHlfcmVjb3JkX2VudW0pCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdHlwZV9pbmR4KQotCSAgJiYgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAweGNlKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5hbWVfaW5keCkpOwotfQotCi0vKiBHZXQgYW4gZW50cnkgdG8gdGhlIGxpc3Qgb2YgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSB0eXBlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKgotaWVlZV9nZXRfbW9kaWZpZWRfaW5mbyAoaW5mbywgaW5keCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLXsKLSAgaWYgKGluZHggPj0gaW5mby0+bW9kaWZpZWRfYWxsb2MpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG5hbGxvYzsKLQotICAgICAgbmFsbG9jID0gaW5mby0+bW9kaWZpZWRfYWxsb2M7Ci0gICAgICBpZiAobmFsbG9jID09IDApCi0JbmFsbG9jID0gMTY7Ci0gICAgICB3aGlsZSAoaW5keCA+PSBuYWxsb2MpCi0JbmFsbG9jICo9IDI7Ci0gICAgICBpbmZvLT5tb2RpZmllZCA9ICgoc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqKQotCQkJeHJlYWxsb2MgKGluZm8tPm1vZGlmaWVkLAotCQkJCSAgbmFsbG9jICogc2l6ZW9mICppbmZvLT5tb2RpZmllZCkpOwotICAgICAgbWVtc2V0IChpbmZvLT5tb2RpZmllZCArIGluZm8tPm1vZGlmaWVkX2FsbG9jLCAwLAotCSAgICAgIChuYWxsb2MgLSBpbmZvLT5tb2RpZmllZF9hbGxvYykgKiBzaXplb2YgKmluZm8tPm1vZGlmaWVkKTsKLSAgICAgIGluZm8tPm1vZGlmaWVkX2FsbG9jID0gbmFsbG9jOwotICAgIH0KLQotICByZXR1cm4gaW5mby0+bW9kaWZpZWQgKyBpbmR4OwotfQotDAotLyogUm91dGluZXMgZm9yIHRoZSBoYXNoIHRhYmxlIG1hcHBpbmcgbmFtZXMgdG8gdHlwZXMuICAqLwotCi0vKiBJbml0aWFsaXplIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1pZWVlX25hbWVfdHlwZV9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKnJldCkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPnR5cGVzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBpZWVlX25hbWVfdHlwZV9oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIFRyYXZlcnNlIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBpZWVlX25hbWVfdHlwZV9oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGJmZF9oYXNoX3RyYXZlcnNlCQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0MCi0vKiBUaGUgZ2VuZXJhbCByb3V0aW5lIHRvIHdyaXRlIG91dCBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWJvb2xlYW4KLXdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8gKGFiZmQsIGRoYW5kbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGRoYW5kbGU7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSBpbmZvOwotICBhc2VjdGlvbiAqczsKLSAgY29uc3QgY2hhciAqZXJyOwotICBzdHJ1Y3QgaWVlZV9idWYgKmI7Ci0KLSAgbWVtc2V0ICgmaW5mbywgMCwgc2l6ZW9mIGluZm8pOwotICBpbmZvLmFiZmQgPSBhYmZkOwotICBpbmZvLnR5cGVfaW5keCA9IDI1NjsKLSAgaW5mby5uYW1lX2luZHggPSAzMjsKLQotICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmaW5mby50eXBlZGVmcy5yb290LCBpZWVlX25hbWVfdHlwZV9uZXdmdW5jKQotICAgICAgfHwgISBiZmRfaGFzaF90YWJsZV9pbml0ICgmaW5mby50YWdzLnJvb3QsIGllZWVfbmFtZV90eXBlX25ld2Z1bmMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8uZ2xvYmFsX3R5cGVzKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8uZGF0YSkKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLnR5cGVzKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8udmFycykKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLmN4eCkKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLmxpbmVub3MpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby5mbnR5cGUpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby5mbmFyZ3MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBkZWJ1Z193cml0ZSAoZGhhbmRsZSwgJmllZWVfZm5zLCAoUFRSKSAmaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLmZpbGVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCAoJmluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogUHV0IGFueSB1bmRlZmluZWQgdGFncyBpbiB0aGUgZ2xvYmFsIHR5cGVkZWYgaW5mb3JtYXRpb24uICAqLwotICBpbmZvLmVycm9yID0gZmFsc2U7Ci0gIGllZWVfbmFtZV90eXBlX2hhc2hfdHJhdmVyc2UgKCZpbmZvLnRhZ3MsCi0JCQkJaWVlZV93cml0ZV91bmRlZmluZWRfdGFnLAotCQkJCShQVFIpICZpbmZvKTsKLSAgaWYgKGluZm8uZXJyb3IpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFByZXBlbmQgdGhlIGdsb2JhbCB0eXBlZGVmIGluZm9ybWF0aW9uIHRvIHRoZSBvdGhlciBkYXRhLiAgKi8KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby5nbG9iYWxfdHlwZXMpKQotICAgIHsKLSAgICAgIC8qIFRoZSBIUCBkZWJ1Z2dlciBzZWVtcyB0byBoYXZlIGEgYnVnIGluIHdoaWNoIGl0IGlnbm9yZXMgdGhlCi0gICAgICAgICBsYXN0IGVudHJ5IGluIHRoZSBnbG9iYWwgdHlwZXMsIHNvIHdlIGFkZCBhIGR1bW15IGVudHJ5LiAgKi8KLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoJmluZm8sICZpbmZvLmdsb2JhbF90eXBlcykKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlICgmaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyICgmaW5mbywgaW5mby5uYW1lX2luZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKCZpbmZvLCAiIikKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlICgmaW5mbywgKGludCkgaWVlZV90eV9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKCZpbmZvLCBpbmZvLnR5cGVfaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlICgmaW5mbywgMHhjZSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKCZpbmZvLCBpbmZvLm5hbWVfaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKCZpbmZvLCAnUCcpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyICgmaW5mbywgKGludCkgYnVpbHRpbl92b2lkICsgMzIpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyICgmaW5mbywgJmluZm8uZ2xvYmFsX3R5cGVzLCAmaW5mby5kYXRhKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLmRhdGEgPSBpbmZvLmdsb2JhbF90eXBlczsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBkZWNsYXJlIEJCMTEgYmxvY2tzIGZvciBlYWNoIHJhbmdlIGluIHRoZQotICAgICBmaWxlLiAgVGhleSBhcmUgYWRkZWQgdG8gaW5mby0+dmFycy4gICovCi0gIGluZm8uZXJyb3IgPSBmYWxzZTsKLSAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLnZhcnMpKQotICAgIHJldHVybiBmYWxzZTsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBpZWVlX2FkZF9iYjExX2Jsb2NrcywgKFBUUikgJmluZm8pOwotICBpZiAoaW5mby5lcnJvcikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8udmFycykpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyICgmaW5mbywgJmluZm8udmFycykKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlICgmaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKCZpbmZvLCAmaW5mby5kYXRhLCAmaW5mby52YXJzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE5vdyBhbGwgdGhlIGRhdGEgaXMgaW4gaW5mby5kYXRhLiAgV3JpdGUgaXQgb3V0IHRvIHRoZSBCRkQuICBXZQotICAgICBub3JtYWxseSB3b3VsZCBuZWVkIHRvIHdvcnJ5IGFib3V0IHdoZXRoZXIgYWxsIHRoZSBvdGhlciBzZWN0aW9ucwotICAgICBhcmUgc2V0IHVwIHlldCwgYnV0IHRoZSBJRUVFIGJhY2tlbmQgd2lsbCBoYW5kbGUgdGhpcyBwYXJ0aWN1bGFyCi0gICAgIGNhc2UgY29ycmVjdGx5IHJlZ2FyZGxlc3MuICAqLwotICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby5kYXRhKSkKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBpcyBubyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlcnIgPSBOVUxMOwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kZWJ1ZyIpOwotICBpZiAocyA9PSBOVUxMKQotICAgIGVyciA9ICJiZmRfbWFrZV9zZWN0aW9uIjsKLSAgaWYgKGVyciA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgU0VDX0RFQlVHR0lORyB8IFNFQ19IQVNfQ09OVEVOVFMpKQotCWVyciA9ICJiZmRfc2V0X3NlY3Rpb25fZmxhZ3MiOwotICAgIH0KLSAgaWYgKGVyciA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICAgICAgc2l6ZSA9IDA7Ci0gICAgICBmb3IgKGIgPSBpbmZvLmRhdGEuaGVhZDsgYiAhPSBOVUxMOyBiID0gYi0+bmV4dCkKLQlzaXplICs9IGItPmM7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgcywgc2l6ZSkpCi0JZXJyID0gImJmZF9zZXRfc2VjdGlvbl9zaXplIjsKLSAgICB9Ci0gIGlmIChlcnIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0KLSAgICAgIG9mZnNldCA9IDA7Ci0gICAgICBmb3IgKGIgPSBpbmZvLmRhdGEuaGVhZDsgYiAhPSBOVUxMOyBiID0gYi0+bmV4dCkKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIGItPmJ1Ziwgb2Zmc2V0LCBiLT5jKSkKLQkgICAgewotCSAgICAgIGVyciA9ICJiZmRfc2V0X3NlY3Rpb25fY29udGVudHMiOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBvZmZzZXQgKz0gYi0+YzsKLQl9Ci0gICAgfQotCi0gIGlmIChlcnIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgZXJyLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZpbmZvLnR5cGVkZWZzLnJvb3QpOwotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmaW5mby50YWdzLnJvb3QpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgaW5mb3JtYXRpb24gZm9yIGFuIHVuZGVmaW5lZCB0YWcuICBUaGlzIGlzIGNhbGxlZCB2aWEKLSAgIGllZWVfbmFtZV90eXBlX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV91bmRlZmluZWRfdGFnIChoLCBwKQotICAgICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgc3RydWN0IGllZWVfbmFtZV90eXBlICpudDsKLQotICBmb3IgKG50ID0gaC0+dHlwZXM7IG50ICE9IE5VTEw7IG50ID0gbnQtPm5leHQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG5hbWVfaW5keDsKLSAgICAgIGNoYXIgY29kZTsKLQotICAgICAgaWYgKG50LT5raW5kID09IERFQlVHX0tJTkRfSUxMRUdBTCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmdsb2JhbF90eXBlcykpCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Z2xvYmFsX3R5cGVzKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAyKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0JICAgIHsKLQkgICAgICBpbmZvLT5lcnJvciA9IHRydWU7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmdsb2JhbF90eXBlcykpCi0JICAgIHsKLQkgICAgICBpbmZvLT5lcnJvciA9IHRydWU7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBuYW1lX2luZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0gICAgICArK2luZm8tPm5hbWVfaW5keDsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIG50LT50eXBlLm5hbWUpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV90eV9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG50LT50eXBlLmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMHhjZSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5hbWVfaW5keCkpCi0JewotCSAgaW5mby0+ZXJyb3IgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgc3dpdGNoIChudC0+a2luZCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCSAgaW5mby0+ZXJyb3IgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgREVCVUdfS0lORF9TVFJVQ1Q6Ci0JY2FzZSBERUJVR19LSU5EX0NMQVNTOgotCSAgY29kZSA9ICdTJzsKLQkgIGJyZWFrOwotCWNhc2UgREVCVUdfS0lORF9VTklPTjoKLQljYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6Ci0JICBjb2RlID0gJ1UnOwotCSAgYnJlYWs7Ci0JY2FzZSBERUJVR19LSU5EX0VOVU06Ci0JICBjb2RlID0gJ0UnOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGNvZGUpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKSkKLQl7Ci0JICBpbmZvLT5lcnJvciA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgd3JpdGluZyBvdXQgaW5mb3JtYXRpb24gZm9yIGEgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQgKHAsIGZpbGVuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgY29uc3QgY2hhciAqbW9kbmFtZTsKLSAgY2hhciAqYywgKnM7Ci0gIHVuc2lnbmVkIGludCBuaW5keDsKLQotICBpZiAoaW5mby0+ZmlsZW5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2ZpbmlzaF9jb21waWxhdGlvbl91bml0IChpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8tPmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gIG1vZG5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLSAgaWYgKG1vZG5hbWUgIT0gTlVMTCkKLSAgICArK21vZG5hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtb2RuYW1lID0gc3RycmNociAoZmlsZW5hbWUsICdcXCcpOwotICAgICAgaWYgKG1vZG5hbWUgIT0gTlVMTCkKLQkrK21vZG5hbWU7Ci0gICAgICBlbHNlCi0JbW9kbmFtZSA9IGZpbGVuYW1lOwotICAgIH0KLSAgYyA9IHhzdHJkdXAgKG1vZG5hbWUpOwotICBzID0gc3RycmNociAoYywgJy4nKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICAqcyA9ICdcMCc7Ci0gIGluZm8tPm1vZG5hbWUgPSBjOwotCi0gIGlmICghIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT5jeHgpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT5saW5lbm9zKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPnJhbmdlcyA9IE5VTEw7Ci0KLSAgLyogQWx3YXlzIGluY2x1ZGUgYSBCQjEgYW5kIGEgQkIzIGJsb2NrLiAgVGhhdCBpcyB3aGF0IHRoZSBvdXRwdXQgb2YKLSAgICAgdGhlIE1SSSBsaW5rZXIgc2VlbXMgdG8gbG9vayBsaWtlLiAgKi8KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG5pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICArK2luZm8tPm5hbWVfaW5keDsKLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDMpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5tb2RuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCAoaW5mbykKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqcjsKLQotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlcykpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5jeHgpKQotICAgIHsKLSAgICAgIC8qIEFwcGVuZCBhbnkgQysrIGluZm9ybWF0aW9uIHRvIHRoZSBnbG9iYWwgZnVuY3Rpb24gYW5kCi0gICAgICAgICB2YXJpYWJsZSBpbmZvcm1hdGlvbi4gICovCi0gICAgICBhc3NlcnQgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dmFycykpOwotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBXZSBwdXQgdGhlIHBtaXNjIHJlY29yZHMgaW4gYSBkdW1teSBwcm9jZWR1cmUsIGp1c3QgYXMgdGhlCi0gICAgICAgICBNUkkgY29tcGlsZXIgZG9lcy4gICovCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgNikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICJfX1hSWUNQUCIpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPmhpZ2hhZGRyIC0gMSkKLQkgIHx8ICEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycywgJmluZm8tPmN4eCkKLQkgIHx8ICEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+aGlnaGFkZHIgLSAxKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnZhcnMpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBGb3JjZSBvdXQgdGhlIHBlbmRpbmcgbGluZSBudW1iZXIuICAqLwotICAgICAgaWYgKCEgaWVlZV9saW5lbm8gKChQVFIpIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIDAsIChiZmRfdm1hKSAtMSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+bGluZW5vcykpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+bGluZW5vcykKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoc3RyY21wIChpbmZvLT5maWxlbmFtZSwgaW5mby0+bGluZW5vX2ZpbGVuYW1lKSAhPSAwKQotCXsKLQkgIC8qIFdlIHdlcmUgbm90IGluIHRoZSBtYWluIGZpbGUuICBXZSBqdXN0IGNsb3NlZCB0aGUKLSAgICAgICAgICAgICBpbmNsdWRlZCBsaW5lIG51bWJlciBibG9jaywgYW5kIG5vdyB3ZSBtdXN0IGNsb3NlIHRoZQotICAgICAgICAgICAgIG1haW4gbGluZSBudW1iZXIgYmxvY2suICAqLwotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+ZGF0YSwgJmluZm8tPnR5cGVzKQotICAgICAgfHwgISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sICZpbmZvLT5kYXRhLCAmaW5mby0+dmFycykKLSAgICAgIHx8ICEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+ZGF0YSwgJmluZm8tPmxpbmVub3MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBCdWlsZCBCQjEwL0JCMTEgYmxvY2tzIGJhc2VkIG9uIHRoZSByYW5nZXMgd2UgcmVjb3JkZWQuICAqLwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5kYXRhKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDEwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiR05VIG9iamNvcHkiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChyID0gaW5mby0+cmFuZ2VzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF92bWEgbG93LCBoaWdoOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBpbnQga2luZDsKLQotICAgICAgbG93ID0gci0+bG93OwotICAgICAgaGlnaCA9IHItPmhpZ2g7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIHNlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGlzIHJhbmdlLiAgKi8KLSAgICAgIGZvciAocyA9IGluZm8tPmFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIGlmIChiZmRfZ2V0X3NlY3Rpb25fdm1hIChpbmZvLT5hYmZkLCBzKSA8PSBsb3cKLQkgICAgICAmJiBoaWdoIDw9IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChpbmZvLT5hYmZkLCBzKQotCQkJICArIGJmZF9zZWN0aW9uX3NpemUgKGluZm8tPmFiZmQsIHMpKSkKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocyA9PSBOVUxMKQotCXsKLQkgIC8qIEp1c3QgaWdub3JlIHRoaXMgcmFuZ2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBDb2FsZXNjZSByYW5nZXMgaWYgaXQgc2VlbXMgcmVhc29uYWJsZS4gICovCi0gICAgICB3aGlsZSAoci0+bmV4dCAhPSBOVUxMCi0JICAgICAmJiBoaWdoICsgMHgxMDAwID49IHItPm5leHQtPmxvdwotCSAgICAgJiYgKHItPm5leHQtPmhpZ2gKLQkJIDw9IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChpbmZvLT5hYmZkLCBzKQotCQkgICAgICsgYmZkX3NlY3Rpb25fc2l6ZSAoaW5mby0+YWJmZCwgcykpKSkKLQl7Ci0JICByID0gci0+bmV4dDsKLQkgIGhpZ2ggPSByLT5oaWdoOwotCX0KLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotCWtpbmQgPSAxOwotICAgICAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwKQotCWtpbmQgPSAzOwotICAgICAgZWxzZQotCWtpbmQgPSAyOwotCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMTEpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGtpbmQpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBzLT5pbmRleCArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGxvdykKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaGlnaCAtIGxvdykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBBZGQgdGhpcyByYW5nZSB0byB0aGUgbGlzdCBvZiBnbG9iYWwgcmFuZ2VzLiAgKi8KLSAgICAgIGlmICghIGllZWVfYWRkX3JhbmdlIChpbmZvLCB0cnVlLCBsb3csIGhpZ2gpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBCQjExIGJsb2NrcyBkZXNjcmliaW5nIGVhY2ggcmFuZ2UgdGhhdCB3ZSBoYXZlIG5vdCBhbHJlYWR5Ci0gICBkZXNjcmliZWQuICAqLwotCi1zdGF0aWMgdm9pZAotaWVlZV9hZGRfYmIxMV9ibG9ja3MgKGFiZmQsIHNlYywgZGF0YSkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIGRhdGE7Ci0gIGJmZF92bWEgbG93LCBoaWdoOwotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqcjsKLQotICBsb3cgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpOwotICBoaWdoID0gbG93ICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKTsKLQotICAvKiBGaW5kIHRoZSBmaXJzdCByYW5nZSBhdCBvciBhZnRlciB0aGlzIHNlY3Rpb24uICBUaGUgcmFuZ2VzIGFyZQotICAgICBzb3J0ZWQgYnkgYWRkcmVzcy4gICovCi0gIGZvciAociA9IGluZm8tPmdsb2JhbF9yYW5nZXM7IHIgIT0gTlVMTDsgciA9IHItPm5leHQpCi0gICAgaWYgKHItPmhpZ2ggPiBsb3cpCi0gICAgICBicmVhazsKLQotICB3aGlsZSAobG93IDwgaGlnaCkKLSAgICB7Ci0gICAgICBpZiAociA9PSBOVUxMIHx8IHItPmxvdyA+PSBoaWdoKQotCXsKLQkgIGlmICghIGllZWVfYWRkX2JiMTEgKGluZm8sIHNlYywgbG93LCBoaWdoKSkKLQkgICAgaW5mby0+ZXJyb3IgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGxvdyA8IHItPmxvdwotCSAgJiYgci0+bG93IC0gbG93ID4gMHgxMDApCi0JewotCSAgaWYgKCEgaWVlZV9hZGRfYmIxMSAoaW5mbywgc2VjLCBsb3csIHItPmxvdykpCi0JICAgIHsKLQkgICAgICBpbmZvLT5lcnJvciA9IHRydWU7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgICAgbG93ID0gci0+aGlnaDsKLQotICAgICAgciA9IHItPm5leHQ7Ci0gICAgfQotfQotCi0vKiBBZGQgYSBzaW5nbGUgQkIxMSBibG9jayBmb3IgYSByYW5nZS4gIFdlIGFkZCBpdCB0byBpbmZvLT52YXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfYWRkX2JiMTEgKGluZm8sIHNlYywgbG93LCBoaWdoKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF92bWEgbG93OwotICAgICBiZmRfdm1hIGhpZ2g7Ci17Ci0gIGludCBraW5kOwotCi0gIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnZhcnMpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgKm1vZG5hbWU7Ci0gICAgICBjaGFyICpjLCAqczsKLQotICAgICAgLyogU3RhcnQgdGhlIGVuY2xvc2luZyBCQjEwIGJsb2NrLiAgKi8KLSAgICAgIGZpbGVuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoaW5mby0+YWJmZCk7Ci0gICAgICBtb2RuYW1lID0gc3RycmNociAoZmlsZW5hbWUsICcvJyk7Ci0gICAgICBpZiAobW9kbmFtZSAhPSBOVUxMKQotCSsrbW9kbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtb2RuYW1lID0gc3RycmNociAoZmlsZW5hbWUsICdcXCcpOwotCSAgaWYgKG1vZG5hbWUgIT0gTlVMTCkKLQkgICAgKyttb2RuYW1lOwotCSAgZWxzZQotCSAgICBtb2RuYW1lID0gZmlsZW5hbWU7Ci0JfQotICAgICAgYyA9IHhzdHJkdXAgKG1vZG5hbWUpOwotICAgICAgcyA9IHN0cnJjaHIgKGMsICcuJyk7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCSpzID0gJ1wwJzsKLQotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDEwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgYykKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiR05VIG9iamNvcHkiKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZyZWUgKGMpOwotICAgIH0KLQotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLSAgICBraW5kID0gMTsKLSAgZWxzZSBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDApCi0gICAga2luZCA9IDM7Ci0gIGVsc2UKLSAgICBraW5kID0gMjsKLQotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMTEpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGtpbmQpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBzZWMtPmluZGV4ICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbG93KQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBoaWdoIC0gbG93KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IHJlY29yZGluZyBpbmZvcm1hdGlvbiBmcm9tIGEgcGFydGljdWxhciBzb3VyY2UgZmlsZS4gIFRoaXMgaXMKLSAgIHVzZWQgdG8gcmVjb3JkIHdoaWNoIGZpbGUgZGVmaW5lZCB3aGljaCB0eXBlcywgdmFyaWFibGVzLCBldGMuICBJdAotICAgaXMgbm90IHVzZWQgZm9yIGxpbmUgbnVtYmVycywgc2luY2UgdGhlIGxpbmVubyBlbnRyeSBwb2ludCBwYXNzZXMKLSAgIGRvd24gdGhlIGZpbGUgbmFtZSBhbnlob3cuICBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBkb2Vzbid0IHNlZW0KLSAgIHRvIHN0b3JlIHRoaXMgaW5mb3JtYXRpb24gYW55d2hlcmUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1pZWVlX3N0YXJ0X3NvdXJjZSAocCwgZmlsZW5hbWUpCi0gICAgIFBUUiBwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGFuIGVtcHR5IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9lbXB0eV90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgKGludCkgYnVpbHRpbl91bmtub3duLCAwLCBmYWxzZSwgZmFsc2UpOwotfQotCi0vKiBNYWtlIGEgdm9pZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfdm9pZF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgKGludCkgYnVpbHRpbl92b2lkLCAwLCBmYWxzZSwgZmFsc2UpOwotfQotCi0vKiBNYWtlIGFuIGludGVnZXIgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2ludF90eXBlIChwLCBzaXplLCB1bnNpZ25lZHApCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9zaWduZWRfY2hhcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX3NpZ25lZF9zaG9ydF9pbnQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9zaWduZWRfbG9uZzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX3NpZ25lZF9sb25nX2xvbmc7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJRUVFIHVuc3VwcG9ydGVkIGludGVnZXIgdHlwZSBzaXplICV1XG4iKSwgc2l6ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICh1bnNpZ25lZHApCi0gICAgKytpbmR4OwotCi0gIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5keCwgc2l6ZSwgdW5zaWduZWRwLCBmYWxzZSk7Ci19Ci0KLS8qIE1ha2UgYSBmbG9hdGluZyBwb2ludCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZmxvYXRfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fZmxvYXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9kb3VibGU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyOgotICAgICAgLyogRklYTUU6IFRoaXMgc2l6ZSByZWFsbHkgZGVwZW5kcyB1cG9uIHRoZSBwcm9jZXNzb3IuICAqLwotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fbG9uZ19kb3VibGU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fbG9uZ19sb25nX2RvdWJsZTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIklFRUUgdW5zdXBwb3J0ZWQgZmxvYXQgdHlwZSBzaXplICV1XG4iKSwgc2l6ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5keCwgc2l6ZSwgZmFsc2UsIGZhbHNlKTsKLX0KLQotLyogTWFrZSBhIGNvbXBsZXggdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NvbXBsZXhfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGNoYXIgY29kZTsKLQotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIGlmIChpbmZvLT5jb21wbGV4X2Zsb2F0X2luZGV4ICE9IDApCi0JcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBpbmZvLT5jb21wbGV4X2Zsb2F0X2luZGV4LCBzaXplICogMiwKLQkJCSAgICAgICBmYWxzZSwgZmFsc2UpOwotICAgICAgY29kZSA9ICdjJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI6Ci0gICAgY2FzZSAxNjoKLSAgICAgIC8qIFRoZXNlIGNhc2VzIGNhbiBiZSBvdXRwdXQgYnkgZ2NjIC1nc3RhYnMuICBPdXRwdXR0aW5nIHRoZQotICAgICAgICAgd3JvbmcgdHlwZSBpcyBiZXR0ZXIgdGhhbiBjcmFzaGluZy4gICovCi0gICAgY2FzZSA4OgotICAgICAgaWYgKGluZm8tPmNvbXBsZXhfZG91YmxlX2luZGV4ICE9IDApCi0JcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBpbmZvLT5jb21wbGV4X2RvdWJsZV9pbmRleCwgc2l6ZSAqIDIsCi0JCQkgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGNvZGUgPSAnZCc7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJRUVFIHVuc3VwcG9ydGVkIGNvbXBsZXggdHlwZSBzaXplICV1XG4iKSwgc2l6ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBJIGRvbid0IGtub3cgd2hhdCB0aGUgc3RyaW5nIGlzIGZvci4gICovCi0gIGlmICghIGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIHNpemUgKiAyLCBmYWxzZSwgZmFsc2UpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBjb2RlKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChzaXplID09IDQpCi0gICAgaW5mby0+Y29tcGxleF9mbG9hdF9pbmRleCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLSAgZWxzZQotICAgIGluZm8tPmNvbXBsZXhfZG91YmxlX2luZGV4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pbmR4OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGEgYm9vbGVhbiB0eXBlLiAgSUVFRSBkb2Vzbid0IHN1cHBvcnQgdGhlc2UsIHNvIHdlIGp1c3QgbWFrZQotICAgYW4gaW50ZWdlciB0eXBlIGluc3RlYWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9ib29sX3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgcmV0dXJuIGllZWVfaW50X3R5cGUgKHAsIHNpemUsIHRydWUpOwotfQotCi0vKiBNYWtlIGFuIGVudW1lcmF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW51bV90eXBlIChwLCB0YWcsIG5hbWVzLCB2YWxzKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gICAgIGJmZF9zaWduZWRfdm1hICp2YWxzOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqZTsKLSAgYm9vbGVhbiBsb2NhbHAsIHNpbXBsZTsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIGludCBpID0gMDsKLQotICBsb2NhbHAgPSBmYWxzZTsKLSAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIC0xOwotICBmb3IgKGUgPSBpbmZvLT5lbnVtczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAodGFnID09IE5VTEwpCi0JewotCSAgaWYgKGUtPnRhZyAhPSBOVUxMKQotCSAgICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGUtPnRhZyA9PSBOVUxMCi0JICAgICAgfHwgdGFnWzBdICE9IGUtPnRhZ1swXQotCSAgICAgIHx8IHN0cmNtcCAodGFnLCBlLT50YWcpICE9IDApCi0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCEgZS0+ZGVmaW5lZCkKLQl7Ci0JICAvKiBUaGlzIGVudW0gdGFnIGhhcyBiZWVuIHNlZW4gYnV0IG5vdCBkZWZpbmVkLiAgKi8KLQkgIGluZHggPSBlLT5pbmR4OwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAobmFtZXMgIT0gTlVMTCAmJiBlLT5uYW1lcyAhPSBOVUxMKQotCXsKLQkgIGZvciAoaSA9IDA7IG5hbWVzW2ldICE9IE5VTEwgJiYgZS0+bmFtZXNbaV0gIT0gTlVMTDsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKG5hbWVzW2ldWzBdICE9IGUtPm5hbWVzW2ldWzBdCi0JCSAgfHwgdmFsc1tpXSAhPSBlLT52YWxzW2ldCi0JCSAgfHwgc3RyY21wIChuYW1lc1tpXSwgZS0+bmFtZXNbaV0pICE9IDApCi0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoKG5hbWVzID09IE5VTEwgJiYgZS0+bmFtZXMgPT0gTlVMTCkKLQkgIHx8IChuYW1lcyAhPSBOVUxMCi0JICAgICAgJiYgZS0+bmFtZXMgIT0gTlVMTAotCSAgICAgICYmIG5hbWVzW2ldID09IE5VTEwKLQkgICAgICAmJiBlLT5uYW1lc1tpXSA9PSBOVUxMKSkKLQl7Ci0JICAvKiBXZSd2ZSBzZWVuIHRoaXMgZW51bSBiZWZvcmUuICAqLwotCSAgcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBlLT5pbmR4LCAwLCB0cnVlLCBmYWxzZSk7Ci0JfQotCi0gICAgICBpZiAodGFnICE9IE5VTEwpCi0JewotCSAgLyogV2UndmUgYWxyZWFkeSBzZWVuIGFuIGVudW0gb2YgdGhlIHNhbWUgbmFtZSwgc28gd2UgbXVzdCBtYWtlCi0JICAgICBzdXJlIHRvIG91dHB1dCB0aGlzIG9uZSBsb2NhbGx5LiAgKi8KLQkgIGxvY2FscCA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBzaW1wbGUgZW51bWVyYXRpb24sIGluIHdoaWNoIHRoZSB2YWx1ZXMgc3RhcnQgYXQgMAotICAgICBhbmQgYWx3YXlzIGluY3JlbWVudCBieSAxLCB3ZSBjYW4gdXNlIHR5cGUgRS4gIE90aGVyd2lzZSB3ZSBtdXN0Ci0gICAgIHVzZSB0eXBlIE4uICAqLwotCi0gIHNpbXBsZSA9IHRydWU7Ci0gIGlmIChuYW1lcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IG5hbWVzW2ldICE9IE5VTEw7IGkrKykKLQl7Ci0JICBpZiAodmFsc1tpXSAhPSBpKQotCSAgICB7Ci0JICAgICAgc2ltcGxlID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICghIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIHRhZywgaW5keCwgMCwgdHJ1ZSwgbG9jYWxwLAotCQkJCShzdHJ1Y3QgaWVlZV9idWZsaXN0ICopIE5VTEwpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBzaW1wbGUgPyAnRScgOiAnTicpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHNpbXBsZSkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogVGhpcyBpcyBzdXBwb3NlZCB0byBiZSB0aGUgZW51bWVyYXRpb24gc2l6ZSwgYnV0IHdlCi0gICAgICAgICBkb24ndCBzdG9yZSB0aGF0LiAgKi8KLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAobmFtZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBuYW1lc1tpXSAhPSBOVUxMOyBpKyspCi0JewotCSAgaWYgKCEgaWVlZV93cml0ZV9pZCAoaW5mbywgbmFtZXNbaV0pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoISBzaW1wbGUpCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdmFsc1tpXSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIGlmIChpbmR4ID09ICh1bnNpZ25lZCBpbnQpIC0xKQotCXsKLQkgIGUgPSAoc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtICopIHhtYWxsb2MgKHNpemVvZiAqZSk7Ci0JICBtZW1zZXQgKGUsIDAsIHNpemVvZiAqZSk7Ci0JICBlLT5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pbmR4OwotCSAgZS0+dGFnID0gdGFnOwotCi0JICBlLT5uZXh0ID0gaW5mby0+ZW51bXM7Ci0JICBpbmZvLT5lbnVtcyA9IGU7Ci0JfQotCi0gICAgICBlLT5uYW1lcyA9IG5hbWVzOwotICAgICAgZS0+dmFscyA9IHZhbHM7Ci0gICAgICBlLT5kZWZpbmVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBwb2ludGVyIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9wb2ludGVyX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbSA9IE5VTEw7Ci0KLSAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7Ci0gIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICAvKiBBIHBvaW50ZXIgdG8gYSBzaW1wbGUgYnVpbHRpbiB0eXBlIGNhbiBiZSBvYnRhaW5lZCBieSBhZGRpbmcgMzIuCi0gICAgIEZJWE1FOiBXaWxsIHRoaXMgYmUgYSBzaG9ydCBwb2ludGVyLCBhbmQgd2lsbCB0aGF0IG1hdHRlcj8gICovCi0gIGlmIChpbmR4IDwgMzIpCi0gICAgcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBpbmR4ICsgMzIsIDAsIHRydWUsIGZhbHNlKTsKLQotICBpZiAoISBsb2NhbHApCi0gICAgewotICAgICAgbSA9IGllZWVfZ2V0X21vZGlmaWVkX2luZm8gKHAsIGluZHgpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlIGFyY2hpdGVjdHVyZS4gICovCi0gICAgICBpZiAobS0+cG9pbnRlciA+IDApCi0JcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBtLT5wb2ludGVyLCA0LCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotCi0gIGlmICghIGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIDQsIHRydWUsIGxvY2FscCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdQJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBsb2NhbHApCi0gICAgbS0+cG9pbnRlciA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIGZ1bmN0aW9uIHR5cGUuICBUaGlzIHdpbGwgYmUgY2FsbGVkIGZvciBhIG1ldGhvZCwgYnV0IHdlCi0gICBkb24ndCB3YW50IHRvIGFjdHVhbGx5IGFkZCBpdCB0byB0aGUgdHlwZSB0YWJsZSBpbiB0aGF0IGNhc2UuICBXZQotICAgaGFuZGxlIHRoaXMgYnkgZGVmaW5pbmcgdGhlIHR5cGUgaW4gYSBwcml2YXRlIGJ1ZmZlciwgYW5kIG9ubHkKLSAgIGFkZGluZyB0aGF0IGJ1ZmZlciB0byB0aGUgdHlwZWRlZiBibG9jayBpZiB3ZSBhcmUgZ29pbmcgdG8gdXNlIGl0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZnVuY3Rpb25fdHlwZSAocCwgYXJnY291bnQsIHZhcmFyZ3MpCi0gICAgIFBUUiBwOwotICAgICBpbnQgYXJnY291bnQ7Ci0gICAgIGJvb2xlYW4gdmFyYXJnczsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGxvY2FscDsKLSAgdW5zaWduZWQgaW50ICphcmdzID0gTlVMTDsKLSAgaW50IGk7Ci0gIHVuc2lnbmVkIGludCByZXRpbmR4OwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGZuZGVmOwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICptOwotCi0gIGxvY2FscCA9IGZhbHNlOwotCi0gIGlmIChhcmdjb3VudCA+IDApCi0gICAgewotICAgICAgYXJncyA9ICh1bnNpZ25lZCBpbnQgKikgeG1hbGxvYyAoYXJnY291bnQgKiBzaXplb2YgKmFyZ3MpOwotICAgICAgZm9yIChpID0gYXJnY291bnQgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHApCi0JICAgIGxvY2FscCA9IHRydWU7Ci0JICBhcmdzW2ldID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoYXJnY291bnQgPCAwKQotICAgIHZhcmFyZ3MgPSBmYWxzZTsKLQotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHApCi0gICAgbG9jYWxwID0gdHJ1ZTsKLSAgcmV0aW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIG0gPSBOVUxMOwotICBpZiAoYXJnY291bnQgPCAwICYmICEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChwLCByZXRpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAobS0+ZnVuY3Rpb24gPiAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbS0+ZnVuY3Rpb24sIDAsIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgLyogQW4gYXR0cmlidXRlIG9mIDB4NDEgbWVhbnMgdGhhdCB0aGUgZnJhbWUgYW5kIHB1c2ggbWFzayBhcmUKLSAgICAgdW5rbm93bi4gICovCi0gIGlmICghIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZmbmRlZikKLSAgICAgIHx8ICEgaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSAoaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgICAodW5zaWduZWQgaW50KSAtMSwgMCwgdHJ1ZSwgbG9jYWxwLAotCQkJCSAgICZmbmRlZikKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICd4JykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDB4NDEpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHJldGluZHgpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAoYmZkX3ZtYSkgYXJnY291bnQgKyAodmFyYXJncyA/IDEgOiAwKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYXJnY291bnQgPiAwKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotCWlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBhcmdzW2ldKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIGZyZWUgKGFyZ3MpOwotICAgIH0KLSAgaWYgKHZhcmFyZ3MpCi0gICAgewotICAgICAgLyogQSB2YXJhcmdzIGZ1bmN0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IHdyaXRpbmcgb3V0IHRoZSBsYXN0Ci0gICAgICAgICBhcmd1bWVudCBhcyB0eXBlIHZvaWQgKiwgYWx0aG91Z2ggdGhpcyBtYWtlcyBsaXR0bGUgc2Vuc2UuICAqLwotICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIChiZmRfdm1hKSBidWlsdGluX3ZvaWQgKyAzMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIHdyb3RlIHRoZSBpbmZvcm1hdGlvbiBpbnRvIGZuZGVmLCBpbiBjYXNlIHdlIGRvbid0IG5lZWQgaXQuCi0gICAgIEl0IHdpbGwgYmUgYXBwZW5kZWQgdG8gaW5mby0+dHlwZXMgYnkgaWVlZV9wb3BfdHlwZS4gICovCi0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuZm5kZWYgPSBmbmRlZjsKLQotICBpZiAobSAhPSBOVUxMKQotICAgIG0tPmZ1bmN0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pbmR4OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGEgcmVmZXJlbmNlIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWZlcmVuY2VfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICAvKiBJRUVFIGFwcGVhcnMgdG8gcmVjb3JkIGEgbm9ybWFsIHBvaW50ZXIgdHlwZSwgYW5kIHRoZW4gdXNlIGEKLSAgICAgcG1pc2MgcmVjb3JkIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgcmVhbGx5IGEgcmVmZXJlbmNlLiAgKi8KLQotICBpZiAoISBpZWVlX3BvaW50ZXJfdHlwZSAocCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnJlZmVyZW5jZXAgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIHJhbmdlIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yYW5nZV90eXBlIChwLCBsb3csIGhpZ2gpCi0gICAgIFBUUiBwOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3c7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGhpZ2g7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGJvb2xlYW4gdW5zaWduZWRwLCBsb2NhbHA7Ci0KLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuc2l6ZTsKLSAgdW5zaWduZWRwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS51bnNpZ25lZHA7Ci0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0gIHJldHVybiAoaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHApCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgJ1InKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIChiZmRfdm1hKSBsb3cpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgKGJmZF92bWEpIGhpZ2gpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdW5zaWduZWRwID8gMCA6IDEpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgc2l6ZSkpOwotfQotCi0vKiBNYWtlIGFuIGFycmF5IHR5cGUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1pZWVlX2FycmF5X3R5cGUgKHAsIGxvdywgaGlnaCwgc3RyaW5ncCkKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGxvdzsKLSAgICAgYmZkX3NpZ25lZF92bWEgaGlnaDsKLSAgICAgYm9vbGVhbiBzdHJpbmdwIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IGVsZWluZHg7Ci0gIGJvb2xlYW4gbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbSA9IE5VTEw7Ci0gIHN0cnVjdCBpZWVlX21vZGlmaWVkX2FycmF5X3R5cGUgKmE7Ci0KLSAgLyogSUVFRSBkb2VzIG5vdCBzdG9yZSB0aGUgcmFuZ2UsIHNvIHdlIGp1c3QgaWdub3JlIGl0LiAgKi8KLSAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuc2l6ZTsKLSAgZWxlaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIElmIHdlIGRvbid0IGtub3cgdGhlIHJhbmdlLCB0cmVhdCB0aGUgc2l6ZSBhcyBleGFjdGx5IG9uZQotICAgICBlbGVtZW50LiAgKi8KLSAgaWYgKGxvdyA8IGhpZ2gpCi0gICAgc2l6ZSAqPSAoaGlnaCAtIGxvdykgKyAxOwotCi0gIGlmICghIGxvY2FscCkKLSAgICB7Ci0gICAgICBtID0gaWVlZV9nZXRfbW9kaWZpZWRfaW5mbyAoaW5mbywgZWxlaW5keCk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZm9yIChhID0gbS0+YXJyYXlzOyBhICE9IE5VTEw7IGEgPSBhLT5uZXh0KQotCXsKLQkgIGlmIChhLT5sb3cgPT0gbG93ICYmIGEtPmhpZ2ggPT0gaGlnaCkKLQkgICAgcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBhLT5pbmR4LCBzaXplLCBmYWxzZSwgZmFsc2UpOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgc2l6ZSwgZmFsc2UsIGxvY2FscCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGxvdyA9PSAwID8gJ1onIDogJ0MnKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgZWxlaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAobG93ICE9IDApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGxvdykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaGlnaCArIDEpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBsb2NhbHApCi0gICAgewotICAgICAgYSA9IChzdHJ1Y3QgaWVlZV9tb2RpZmllZF9hcnJheV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqYSk7Ci0gICAgICBtZW1zZXQgKGEsIDAsIHNpemVvZiAqYSk7Ci0KLSAgICAgIGEtPmluZHggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0gICAgICBhLT5sb3cgPSBsb3c7Ci0gICAgICBhLT5oaWdoID0gaGlnaDsKLQotICAgICAgYS0+bmV4dCA9IG0tPmFycmF5czsKLSAgICAgIG0tPmFycmF5cyA9IGE7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGEgc2V0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zZXRfdHlwZSAocCwgYml0c3RyaW5ncCkKLSAgICAgUFRSIHA7Ci0gICAgIGJvb2xlYW4gYml0c3RyaW5ncCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgZWxlaW5keDsKLQotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgZWxlaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEZJWE1FOiBXZSBkb24ndCBrbm93IHRoZSBzaXplLCBzbyB3ZSBqdXN0IHVzZSA0LiAgKi8KLQotICByZXR1cm4gKGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIDAsIHRydWUsIGxvY2FscCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAncycpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBlbGVpbmR4KSk7Ci19Ci0KLS8qIE1ha2UgYW4gb2Zmc2V0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9vZmZzZXRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IHRhcmdldGluZHgsIGJhc2VpbmR4OwotCi0gIHRhcmdldGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLSAgYmFzZWluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICAvKiBGSVhNRTogVGhlIE1SSSBDKysgY29tcGlsZXIgZG9lcyBub3QgYXBwZWFyIHRvIGdlbmVyYXRlIGFueQotICAgICB1c2VmdWwgdHlwZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBvZmZzZXQgdHlwZS4gIEl0IGp1c3QgcmVjb3JkcyBhCi0gICAgIHBvaW50ZXIgdG8gbWVtYmVyIGFzIGFuIGludGVnZXIuICBUaGUgTVJJL0hQIElFRUUgc3BlYyBkb2VzCi0gICAgIGRlc2NyaWJlIGEgcG1pc2MgcmVjb3JkIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBhIHBvaW50ZXIgdG8KLSAgICAgbWVtYmVyLiAgVW5mb3J0dW5hdGVseSwgaXQgZG9lcyBub3QgZGVzY3JpYmUgdGhlIHRhcmdldCB0eXBlLAotICAgICB3aGljaCBzZWVtcyBwcmV0dHkgaW1wb3J0YW50LiAgSSdtIGdvaW5nIHRvIHB1bnQgdGhpcyBmb3Igbm93LiAgKi8KLQotICByZXR1cm4gaWVlZV9pbnRfdHlwZSAocCwgNCwgdHJ1ZSk7Ci19ICAKLQotLyogTWFrZSBhIG1ldGhvZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfbWV0aG9kX3R5cGUgKHAsIGRvbWFpbiwgYXJnY291bnQsIHZhcmFyZ3MpCi0gICAgIFBUUiBwOwotICAgICBib29sZWFuIGRvbWFpbjsKLSAgICAgaW50IGFyZ2NvdW50OwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICAvKiBGSVhNRTogVGhlIE1SSS9IUCBJRUVFIHNwZWMgZGVmaW5lcyBhIHBtaXNjIHJlY29yZCB0byB1c2UgZm9yIGEKLSAgICAgbWV0aG9kLCBidXQgdGhlIGRlZmluaXRpb24gaXMgaW5jb21wbGV0ZS4gIFdlIGp1c3Qgb3V0cHV0IGFuICd4JwotICAgICB0eXBlLiAgKi8KLQotICBpZiAoZG9tYWluKQotICAgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLQotICByZXR1cm4gaWVlZV9mdW5jdGlvbl90eXBlIChwLCBhcmdjb3VudCwgdmFyYXJncyk7Ci19Ci0KLS8qIE1ha2UgYSBjb25zdCBxdWFsaWZpZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NvbnN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHVuc2lnbmVkcCwgbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbSA9IE5VTEw7Ci0KLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuc2l6ZTsKLSAgdW5zaWduZWRwID0gaW5mby0+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+dHlwZXM7Ci0gIGgtPnR5cGVzID0gbnQ7Ci0KLSAgaWYgKGZvdW5kKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgb25lIG9mIHRoZSBidWlsdGluIHR5cGVkZWZzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgICAgICBhY3R1YWxseSBkZWZpbmUgaXQuICAqLwotICAgICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBpZiAoISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCBuYW1lLCAodW5zaWduZWQgaW50KSAtMSwgdHlwZS5zaXplLAotCQkJCXR5cGUudW5zaWduZWRwLAlsb2NhbHAsCi0JCQkJKHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikgTlVMTCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdUJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZW1vdmUgdGhlIHR5cGUgd2UganVzdCBhZGRlZCB0byB0aGUgdHlwZSBzdGFjay4gIFRoaXMgc2hvdWxkIG5vdAotICAgICBiZSBpZWVlX3BvcF91bnVzZWRfdHlwZSwgc2luY2UgdGhlIHR5cGUgaXMgdXNlZCwgd2UganVzdCBkb24ndAotICAgICBuZWVkIGl0IG5vdy4gICovCi0gICh2b2lkKSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdGFnIGZvciBhIHR5cGUuICBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV90YWcgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICAvKiBUaGlzIHNob3VsZCBub3QgYmUgaWVlZV9wb3BfdW51c2VkX3R5cGUsIHNpbmNlIHdlIHdhbnQgdGhlIHR5cGUKLSAgICAgdG8gYmUgZGVmaW5lZC4gICovCi0gICh2b2lkKSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhbiBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfaW50X2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBwIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3ZtYSB2YWwgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogRklYTUUuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9mbG9hdF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGRvdWJsZSB2YWwgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogRklYTUUuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdHlwZWQgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV90eXBlZF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBiZmRfdm1hIHZhbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogRklYTUUuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3ZhcmlhYmxlIChwLCBuYW1lLCBraW5kLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zhcl9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHJlZmVyZW5jZXA7Ci0gIHVuc2lnbmVkIGludCB0eXBlX2luZHg7Ci0gIGJvb2xlYW4gYXNuOwotICBpbnQgcmVmZmxhZzsKLQotICBzaXplID0gaW5mby0+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+c3RyaW5nID0gczsKLSAgZm9yIChwcCA9ICZsOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0gICAgOwotICAqcHAgPSBuOwotICByZXR1cm4gbDsKLX0KLQotLyogRHVwbGljYXRlIGEgc3RyaW5nIGluIG1lbW9yeS4gICovCi0KLXN0YXRpYyBjaGFyICoKLXhzdHJkdXAgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgbGVuOwotICBjaGFyICpyZXQ7Ci0KLSAgbGVuID0gc3RybGVuIChzKTsKLSAgcmV0ID0geG1hbGxvYyAobGVuICsgMSk7Ci0gIHN0cmNweSAocmV0LCBzKTsKLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25tLjEgYi9iaW51dGlscy9ubS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmFkOTllLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25tLjEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIG5tIDEgIjUgTm92ZW1iZXIgMTk5MSIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLW5tIFwtIGxpc3Qgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcy4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIG5tCi0uUkIgIltcfCIgXC1hIHwgXC1cLWRlYnVnXC1zeW1zICJcfF0iIAotLlJCICJbXHwiIFwtZyB8IFwtXC1leHRlcm5cLW9ubHkgIlx8XSIKLS5SQiAiW1x8IiBcLUIgIlx8XSIgIAotLlJCICJbXHwiIFwtQyB8IFwtXC1kZW1hbmdsZSAiXHxdIiAKLS5SQiAiW1x8IiBcLUQgfCBcLVwtZHluYW1pYyAiXHxdIiAKLS5SQiAiW1x8IiBcLXMgfCBcLVwtcHJpbnRcLWFybWFwICJcfF0iIAotLlJCICJbXHwiIFwtbyB8IFwtXC1wcmludFwtZmlsZVwtbmFtZSAiXHxdIiAgCi0uUkIgIltcfCIgXC1uIHwgXC1cLW51bWVyaWNcLXNvcnQgIlx8XSIgCi0uUkIgIltcfCIgXC1wIHwgXC1cLW5vXC1zb3J0ICJcfF0iCi0uUkIgIltcfCIgXC1yIHwgXC1cLXJldmVyc2VcLXNvcnQgIlx8XSIgCi0uUkIgIltcfCIgXC1cLXNpemVcLXNvcnQgIlx8XSIgCi0uUkIgIltcfCIgXC11IHwgXC1cLXVuZGVmaW5lZFwtb25seSAiXHxdIiAgCi0uUkIgIltcfCIgXC1sIHwgXC1cLWxpbmVcLW51bWJlcnMgIlx8XSIKLS5SQiAiW1x8IiBcLVwtaGVscCAiXHxdIiAgCi0uUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIgIAotLlJCICJbXHwiICJcLXQgXGZJcmFkaXgiIHwgXC1cLXJhZGl4PVxmSXJhZGl4ICJcfF0iCi0uUkIgIltcfCIgXC1QIHwgLS1wb3J0YWJpbGl0eSAiXHxdIgotLlJCICJbXHwiICJcLWYgXGZJZm9ybWF0IiB8IFwtXC1mb3JtYXQ9XGZJZm9ybWF0ICJcfF0iCi0uUkIgIltcfCIgIlwtXC10YXJnZXQ9XGZJYmZkbmFtZSIgIlx8XSIKLS5SQiAiW1x8IiBcYwotLkkgb2JqZmlsZVxjCi1cJi5cfC5cfC5cfF0KLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1HTlUgXGMKLS5CIG5tXGMKLVwmIGxpc3RzIHRoZSBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzIFxjCi0uSSBvYmpmaWxlXGMKLVwmLiAgSWYgbm8gb2JqZWN0IGZpbGVzIGFyZSBnaXZlbiBhcyBhcmd1bWVudHMsIFxjCi0uQiBubVxjCi1cJiBhc3N1bWVzIGBcfFxjCi0uQiBhLm91dFxjCi1cfCcuCi0KLS5TSCBPUFRJT05TCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4KLQotLlRQCi0uQiBcLUEKLS5UUAotLkIgXC1vCi0uVFAKLS5CIFwtXC1wcmludFwtZmlsZVwtbmFtZSAKLVByZWNlZGUgZWFjaCBzeW1ib2wgYnkgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgd2hlcmUgaXQgd2FzIGZvdW5kLAotcmF0aGVyIHRoYW4gaWRlbnRpZnlpbmcgdGhlIGlucHV0IGZpbGUgb25jZSBvbmx5IGJlZm9yZSBhbGwgb2YgaXRzCi1zeW1ib2xzLiAKLQotLlRQCi0uQiBcLWEKLS5UUAotLkIgXC1cLWRlYnVnXC1zeW1zIAotRGlzcGxheSBkZWJ1Z2dlci1vbmx5IHN5bWJvbHM7IG5vcm1hbGx5IHRoZXNlIGFyZSBub3QgbGlzdGVkLgotCi0uVFAKLS5CIFwtQgotVGhlIHNhbWUgYXMKLS5CIFwtXC1mb3JtYXQ9YnNkCi0oZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTUlQUyBcZkJubVxmUCkuCi0KLS5UUAotLkIgXC1DCi0uVFAKLS5CIFwtXC1kZW1hbmdsZQotRGVjb2RlIChcZklkZW1hbmdsZVxmUCkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCi1CZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKLW1ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4KLQotLlRQCi0uQiBcLUQKLS5UUAotLkIgXC1cLWR5bmFtaWMKLURpc3BsYXkgdGhlIGR5bmFtaWMgc3ltYm9scyByYXRoZXIgdGhhbiB0aGUgbm9ybWFsIHN5bWJvbHMuICBUaGlzIGlzCi1vbmx5IG1lYW5pbmdmdWwgZm9yIGR5bmFtaWMgb2JqZWN0cywgc3VjaCBhcyBjZXJ0YWluIHR5cGVzIG9mIHNoYXJlZAotbGlicmFyaWVzLgotCi0uVFAKLS5CICJcLWYgXGZJZm9ybWF0IgotVXNlIHRoZSBvdXRwdXQgZm9ybWF0IFxmSWZvcm1hdFxmUCwgd2hpY2ggY2FuIGJlIGBgYnNkJycsCi1gYHN5c3YnJywgb3IgYGBwb3NpeCcnLiAgVGhlIGRlZmF1bHQgaXMgYGBic2QnJy4KLU9ubHkgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBcZklmb3JtYXRcZlAgaXMgc2lnbmlmaWNhbnQ7IGl0IGNhbiBiZQotZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UuCi0KLS5UUAotLkIgXC1nCi0uVFAKLS5CIFwtXC1leHRlcm5cLW9ubHkgCi1EaXNwbGF5IG9ubHkgZXh0ZXJuYWwgc3ltYm9scy4KLQotLlRQCi0uQiBcLW4KLS5UUAotLkIgXC12Ci0uVFAKLS5CIFwtXC1udW1lcmljXC1zb3J0IAotU29ydCBzeW1ib2xzIG51bWVyaWNhbGx5IGJ5IHRoZWlyIGFkZHJlc3Nlcywgbm90IGFscGhhYmV0aWNhbGx5IGJ5IHRoZWlyCi1uYW1lcy4gCi0KLS5UUAotLkIgXC1wCi0uVFAKLS5CIFwtXC1ub1wtc29ydCAKLURvbid0IGJvdGhlciB0byBzb3J0IHRoZSBzeW1ib2xzIGluIGFueSBvcmRlcjsganVzdCBwcmludCB0aGVtIGluIHRoZQotb3JkZXIgZW5jb3VudGVyZWQuCi0KLS5UUAotLkIgXC1QCi0uVFAKLS5CIFwtXC1wb3J0YWJpbGl0eQotVXNlIHRoZSBQT1NJWC4yIHN0YW5kYXJkIG91dHB1dCBmb3JtYXQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBmb3JtYXQuCi1FcXVpdmFsZW50IHRvIGBgXC1mIHBvc2l4JycuCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1wcmludFwtYXJtYXAKLVdoZW4gbGlzdGluZyBzeW1ib2xzIGZyb20gYXJjaGl2ZSBtZW1iZXJzLCBpbmNsdWRlIHRoZSBpbmRleDogYSBtYXBwaW5nCi0oc3RvcmVkIGluIHRoZSBhcmNoaXZlIGJ5IFxjCi0uQiBhclxjCi1cJiBvciBcYwotLkIgcmFubGliXGMKLVwmKSBvZiB3aGF0IG1vZHVsZXMKLWNvbnRhaW4gZGVmaW5pdGlvbnMgZm9yIHdoYXQgbmFtZXMuCi0KLS5UUAotLkIgXC1yCi0uVFAKLS5CIFwtXC1yZXZlcnNlXC1zb3J0IAotUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIHNvcnQgKHdoZXRoZXIgbnVtZXJpYyBvciBhbHBoYWJldGljKTsgbGV0IHRoZQotbGFzdCBjb21lIGZpcnN0LgotCi0uVFAKLS5CIFwtXC1zaXplXC1zb3J0IAotU29ydCBzeW1ib2xzIGJ5IHNpemUuICBUaGUgc2l6ZSBpcyBjb21wdXRlZCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi10aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgd2l0aCB0aGUgbmV4dCBoaWdoZXIKLXZhbHVlLiAgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBpcyBwcmludGVkLCByYXRoZXIgdGhhbiB0aGUgdmFsdWUuCi0KLS5UUAotLkIgIlwtdCBcZklyYWRpeCIKLS5UUAotLkIgIlwtXC1yYWRpeD1cZklyYWRpeCIKLVVzZSBcZklyYWRpeFxmUCBhcyB0aGUgcmFkaXggZm9yIHByaW50aW5nIHRoZSBzeW1ib2wgdmFsdWVzLiAgSXQgbXVzdCBiZQotYGBkJycgZm9yIGRlY2ltYWwsIGBgbycnIGZvciBvY3RhbCwgb3IgYGB4JycgZm9yIGhleGFkZWNpbWFsLgotCi0uVFAKLS5CSSAiXC1cLXRhcmdldD0iICJiZmRuYW1lIgotU3BlY2lmeSBhbiBvYmplY3QgY29kZSBmb3JtYXQgb3RoZXIgdGhhbiB5b3VyIHN5c3RlbSdzIGRlZmF1bHQgZm9ybWF0LgotU2VlIAotLkJSIG9iamR1bXAgKCAxICksCi1mb3IgaW5mb3JtYXRpb24gb24gbGlzdGluZyBhdmFpbGFibGUgZm9ybWF0cy4KLQotLlRQCi0uQiBcLXUKLS5UUAotLkIgXC1cLXVuZGVmaW5lZFwtb25seSAKLURpc3BsYXkgb25seSB1bmRlZmluZWQgc3ltYm9scyAodGhvc2UgZXh0ZXJuYWwgdG8gZWFjaCBvYmplY3QgZmlsZSkuCi0KLS5UUAotLkIgXC1sCi0uVFAKLS5CIFwtXC1saW5lXC1udW1iZXJzCi1Gb3IgZWFjaCBzeW1ib2wsIHVzZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gdHJ5IHRvIGZpbmQgYSBmaWxlbmFtZSBhbmQKLWxpbmUgbnVtYmVyLiAgRm9yIGEgZGVmaW5lZCBzeW1ib2wsIGxvb2sgZm9yIHRoZSBsaW5lIG51bWJlciBvZiB0aGUKLWFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4gIEZvciBhbiB1bmRlZmluZWQgc3ltYm9sLCBsb29rIGZvciB0aGUgbGluZQotbnVtYmVyIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSB3aGljaCByZWZlcnMgdG8gdGhlIHN5bWJvbC4gIElmIGxpbmUgbnVtYmVyCi1pbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQsIHByaW50IGl0IGFmdGVyIHRoZSBvdGhlciBzeW1ib2wgaW5mb3JtYXRpb24uCi0KLS5UUAotLkIgXC1WCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgbm0KLWFuZCBleGl0LgotCi0uVFAKLS5CIFwtXC1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgbm0KLWFuZCBleGl0LgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsKLS5CUiBhciAiKCIgMSAiKSwiCi0uQlIgb2JqZHVtcCAoIDEgKSwKLS5CUiByYW5saWIgIigiIDEgIikuIgotCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25tLmMgYi9iaW51dGlscy9ubS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTJlZTEyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU4ICswLDAgQEAKLS8qIG5tLmMgLS0gRGVzY3JpYmUgc3ltYm9sIHRhYmxlIG9mIGEgcmVsIGZpbGUuCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9yYW5saWIuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0vKiBXaGVuIHNvcnRpbmcgYnkgc2l6ZSwgd2UgdXNlIHRoaXMgc3RydWN0dXJlIHRvIGhvbGQgdGhlIHNpemUgYW5kIGEKLSAgIHBvaW50ZXIgdG8gdGhlIG1pbmlzeW1ib2wuICAqLwotCi1zdHJ1Y3Qgc2l6ZV9zeW0KLXsKLSAgY29uc3QgUFRSIG1pbmlzeW07Ci0gIGJmZF92bWEgc2l6ZTsKLX07Ci0KLS8qIFdoZW4gZmV0Y2hpbmcgcmVsb2NzLCB3ZSB1c2UgdGhpcyBzdHJ1Y3R1cmUgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgZ2V0X3JlbG9jcy4gICovCi0KLXN0cnVjdCBnZXRfcmVsb2NzX2luZm8KLXsKLSAgYXNlY3Rpb24gKipzZWNzOwotICBhcmVsZW50ICoqKnJlbG9jczsKLSAgbG9uZyAqcmVsY291bnQ7Ci0gIGFzeW1ib2wgKipzeW1zOwotfTsKLQotc3RhdGljIHZvaWQKLXVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1zZXRfcHJpbnRfcmFkaXggUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zZXRfb3V0cHV0X2Zvcm1hdCBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotZGlzcGxheV9maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3JlbF9maWxlIFBBUkFNUyAoKGJmZCAqIGZpbGUsIGJmZCAqIGFyY2hpdmUpKTsKLQotc3RhdGljIGxvbmcKLWZpbHRlcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCkpOwotCi1zdGF0aWMgbG9uZwotc29ydF9zeW1ib2xzX2J5X3NpemUgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiwgbG9uZywgdW5zaWduZWQgaW50LAotCQkJICAgICAgc3RydWN0IHNpemVfc3ltICoqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCwgYmZkICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3NpemVfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgc3RydWN0IHNpemVfc3ltICosIGxvbmcsIGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1kZWZfZW50cnkgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi0vKiBUaGUgc29ydGluZyBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgaW50Ci1udW1lcmljX2ZvcndhcmQgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIGludAotbnVtZXJpY19yZXZlcnNlIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyBpbnQKLW5vbl9udW1lcmljX2ZvcndhcmQgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIGludAotbm9uX251bWVyaWNfcmV2ZXJzZSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1zaXplX2ZvcndhcmQxIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyBpbnQKLXNpemVfZm9yd2FyZDIgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotLyogVGhlIG91dHB1dCBmb3JtYXR0aW5nIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vYmplY3RfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vYmplY3RfZmlsZW5hbWVfc3lzdiBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4IFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX2ZpbGVuYW1lX3N5c3YgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfcG9zaXggUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9tZW1iZXJfYnNkIFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX21lbWJlcl9zeXN2IFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX21lbWJlcl9wb3NpeCBQQVJBTVMgKChjaGFyICphcmNoaXZlLCBDT05TVCBjaGFyICpmaWxlbmFtZSkpOwotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGJmZCAqIGFyY2hpdmVfYmZkLCBiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfc3lzdiBQQVJBTVMgKChiZmQgKiBhcmNoaXZlX2JmZCwgYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX3Bvc2l4IFBBUkFNUyAoKGJmZCAqIGFyY2hpdmVfYmZkLCBiZmQgKiBhYmZkKSk7Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X3ZhbHVlIFBBUkFNUyAoKGJmZF92bWEpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9pbmZvX2JzZCBQQVJBTVMgKChzeW1ib2xfaW5mbyAqIGluZm8sIGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9pbmZvX3N5c3YgUEFSQU1TICgoc3ltYm9sX2luZm8gKiBpbmZvLCBiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19wb3NpeCBQQVJBTVMgKChzeW1ib2xfaW5mbyAqIGluZm8sIGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLWdldF9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0vKiBTdXBwb3J0IGZvciBkaWZmZXJlbnQgb3V0cHV0IGZvcm1hdHMuICAqLwotc3RydWN0IG91dHB1dF9mbnMKLSAgewotICAgIC8qIFByaW50IHRoZSBuYW1lIG9mIGFuIG9iamVjdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotICAgIHZvaWQgKCpwcmludF9vYmplY3RfZmlsZW5hbWUpIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSAgICAvKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIGZpbGUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0gICAgdm9pZCAoKnByaW50X2FyY2hpdmVfZmlsZW5hbWUpIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSAgICAvKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIG1lbWJlciBmaWxlLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfYXJjaGl2ZV9tZW1iZXIpIFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSAgICAvKiBQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSAoYW5kIGFyY2hpdmUsIGlmIHRoZXJlIGlzIG9uZSkKLSAgICAgICBjb250YWluaW5nIGEgc3ltYm9sLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfc3ltYm9sX2ZpbGVuYW1lKSBQQVJBTVMgKChiZmQgKiBhcmNoaXZlX2JmZCwgYmZkICogYWJmZCkpOwotCi0gICAgLyogUHJpbnQgYSBsaW5lIG9mIGluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfc3ltYm9sX2luZm8pIFBBUkFNUyAoKHN5bWJvbF9pbmZvICogaW5mbywgYmZkICogYWJmZCkpOwotICB9Owotc3RhdGljIHN0cnVjdCBvdXRwdXRfZm5zIGZvcm1hdHNbXSA9Ci17Ci0gIHtwcmludF9vYmplY3RfZmlsZW5hbWVfYnNkLAotICAgcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9ic2QsCi0gICBwcmludF9hcmNoaXZlX21lbWJlcl9ic2QsCi0gICBwcmludF9zeW1ib2xfZmlsZW5hbWVfYnNkLAotICAgcHJpbnRfc3ltYm9sX2luZm9fYnNkfSwKLSAge3ByaW50X29iamVjdF9maWxlbmFtZV9zeXN2LAotICAgcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9zeXN2LAotICAgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfc3lzdiwKLSAgIHByaW50X3N5bWJvbF9maWxlbmFtZV9zeXN2LAotICAgcHJpbnRfc3ltYm9sX2luZm9fc3lzdn0sCi0gIHtwcmludF9vYmplY3RfZmlsZW5hbWVfcG9zaXgsCi0gICBwcmludF9hcmNoaXZlX2ZpbGVuYW1lX3Bvc2l4LAotICAgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfcG9zaXgsCi0gICBwcmludF9zeW1ib2xfZmlsZW5hbWVfcG9zaXgsCi0gICBwcmludF9zeW1ib2xfaW5mb19wb3NpeH0KLX07Ci0KLS8qIEluZGljZXMgaW4gYGZvcm1hdHMnLiAgKi8KLSNkZWZpbmUgRk9STUFUX0JTRCAwCi0jZGVmaW5lIEZPUk1BVF9TWVNWIDEKLSNkZWZpbmUgRk9STUFUX1BPU0lYIDIKLSNkZWZpbmUgRk9STUFUX0RFRkFVTFQgRk9STUFUX0JTRAotCi0vKiBUaGUgb3V0cHV0IGZvcm1hdCB0byB1c2UuICAqLwotc3RhdGljIHN0cnVjdCBvdXRwdXRfZm5zICpmb3JtYXQgPSAmZm9ybWF0c1tGT1JNQVRfREVGQVVMVF07Ci0KLQotLyogQ29tbWFuZCBvcHRpb25zLiAgKi8KLQotc3RhdGljIGludCBkb19kZW1hbmdsZSA9IDA7CS8qIFByZXR0eSBwcmludCBDKysgc3ltYm9sIG5hbWVzLiAgKi8KLXN0YXRpYyBpbnQgZXh0ZXJuYWxfb25seSA9IDA7CS8qIHByaW50IGV4dGVybmFsIHN5bWJvbHMgb25seSAqLwotc3RhdGljIGludCBkZWZpbmVkX29ubHkgPSAwOwkvKiBQcmludCBkZWZpbmVkIHN5bWJvbHMgb25seSAqLwotc3RhdGljIGludCBub19zb3J0ID0gMDsJCS8qIGRvbid0IHNvcnQ7IHByaW50IHN5bXMgaW4gb3JkZXIgZm91bmQgKi8KLXN0YXRpYyBpbnQgcHJpbnRfZGVidWdfc3ltcyA9IDA7CS8qIHByaW50IGRlYnVnZ2VyLW9ubHkgc3ltYm9scyB0b28gKi8KLXN0YXRpYyBpbnQgcHJpbnRfYXJtYXAgPSAwOwkvKiBkZXNjcmliZSBfXy5TWU1ERUYgZGF0YSBpbiBhcmNoaXZlIGZpbGVzLiAgKi8KLXN0YXRpYyBpbnQgcmV2ZXJzZV9zb3J0ID0gMDsJLyogc29ydCBpbiBkb3dud2FyZChhbHBoYSBvciBudW1lcmljKSBvcmRlciAqLwotc3RhdGljIGludCBzb3J0X251bWVyaWNhbGx5ID0gMDsJLyogc29ydCBpbiBudW1lcmljIHJhdGhlciB0aGFuIGFscGhhIG9yZGVyICovCi1zdGF0aWMgaW50IHNvcnRfYnlfc2l6ZSA9IDA7CS8qIHNvcnQgYnkgc2l6ZSBvZiBzeW1ib2wgKi8KLXN0YXRpYyBpbnQgdW5kZWZpbmVkX29ubHkgPSAwOwkvKiBwcmludCB1bmRlZmluZWQgc3ltYm9scyBvbmx5ICovCi1zdGF0aWMgaW50IGR5bmFtaWMgPSAwOwkJLyogcHJpbnQgZHluYW1pYyBzeW1ib2xzLiAgKi8KLXN0YXRpYyBpbnQgc2hvd192ZXJzaW9uID0gMDsJLyogc2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgKi8KLXN0YXRpYyBpbnQgc2hvd19zdGF0cyA9IDA7CS8qIHNob3cgc3RhdGlzdGljcyAqLwotc3RhdGljIGludCBsaW5lX251bWJlcnMgPSAwOwkvKiBwcmludCBsaW5lIG51bWJlcnMgZm9yIHN5bWJvbHMgKi8KLQotLyogV2hlbiB0byBwcmludCB0aGUgbmFtZXMgb2YgZmlsZXMuICBOb3QgbXV0dWFsbHkgZXhjbHVzaXZlIGluIFNZU1YgZm9ybWF0LiAgKi8KLXN0YXRpYyBpbnQgZmlsZW5hbWVfcGVyX2ZpbGUgPSAwOwkvKiBPbmNlIHBlciBmaWxlLCBvbiBpdHMgb3duIGxpbmUuICAqLwotc3RhdGljIGludCBmaWxlbmFtZV9wZXJfc3ltYm9sID0gMDsJLyogT25jZSBwZXIgc3ltYm9sLCBhdCBzdGFydCBvZiBsaW5lLiAgKi8KLQotLyogUHJpbnQgZm9ybWF0cyBmb3IgcHJpbnRpbmcgYSBzeW1ib2wgdmFsdWUuICAqLwotI2lmbmRlZiBCRkQ2NAotc3RhdGljIGNoYXIgdmFsdWVfZm9ybWF0W10gPSAiJTA4bHgiOwotI2Vsc2UKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi1zdGF0aWMgY2hhciB2YWx1ZV9mb3JtYXRbXSA9ICIlMDE2bHgiOwotI2Vsc2UKLS8qIFdlIGRvbid0IHVzZSB2YWx1ZV9mb3JtYXQgZm9yIHRoaXMgY2FzZS4gICovCi0jZW5kaWYKLSNlbmRpZgotc3RhdGljIGludCBwcmludF9yYWRpeCA9IDE2OwotLyogUHJpbnQgZm9ybWF0cyBmb3IgcHJpbnRpbmcgc3RhYiBpbmZvLiAgKi8KLXN0YXRpYyBjaGFyIG90aGVyX2Zvcm1hdFtdID0gIiUwMngiOwotc3RhdGljIGNoYXIgZGVzY19mb3JtYXRbXSA9ICIlMDR4IjsKLQotc3RhdGljIGNoYXIgKnRhcmdldCA9IE5VTEw7Ci0KLS8qIFVzZWQgdG8gY2FjaGUgdGhlIGxpbmUgbnVtYmVycyBmb3IgYSBCRkQuICAqLwotc3RhdGljIGJmZCAqbGluZW5vX2NhY2hlX2JmZDsKLXN0YXRpYyBiZmQgKmxpbmVub19jYWNoZV9yZWxfYmZkOwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiZGVidWctc3ltcyIsIG5vX2FyZ3VtZW50LCAmcHJpbnRfZGVidWdfc3ltcywgMX0sCi0gIHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgJmRvX2RlbWFuZ2xlLCAxfSwKLSAgeyJkeW5hbWljIiwgbm9fYXJndW1lbnQsICZkeW5hbWljLCAxfSwKLSAgeyJleHRlcm4tb25seSIsIG5vX2FyZ3VtZW50LCAmZXh0ZXJuYWxfb25seSwgMX0sCi0gIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdmJ30sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7ImxpbmUtbnVtYmVycyIsIG5vX2FyZ3VtZW50LCAwLCAnbCd9LAotICB7Im5vLWNwbHVzIiwgbm9fYXJndW1lbnQsICZkb19kZW1hbmdsZSwgMH0sICAvKiBMaW51eCBjb21wYXRpYmlsaXR5LiAgKi8KLSAgeyJuby1kZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAmZG9fZGVtYW5nbGUsIDB9LAotICB7Im5vLXNvcnQiLCBub19hcmd1bWVudCwgJm5vX3NvcnQsIDF9LAotICB7Im51bWVyaWMtc29ydCIsIG5vX2FyZ3VtZW50LCAmc29ydF9udW1lcmljYWxseSwgMX0sCi0gIHsicG9ydGFiaWxpdHkiLCBub19hcmd1bWVudCwgMCwgJ1AnfSwKLSAgeyJwcmludC1hcm1hcCIsIG5vX2FyZ3VtZW50LCAmcHJpbnRfYXJtYXAsIDF9LAotICB7InByaW50LWZpbGUtbmFtZSIsIG5vX2FyZ3VtZW50LCAwLCAnbyd9LAotICB7InJhZGl4IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd0J30sCi0gIHsicmV2ZXJzZS1zb3J0Iiwgbm9fYXJndW1lbnQsICZyZXZlcnNlX3NvcnQsIDF9LAotICB7InNpemUtc29ydCIsIG5vX2FyZ3VtZW50LCAmc29ydF9ieV9zaXplLCAxfSwKLSAgeyJzdGF0cyIsIG5vX2FyZ3VtZW50LCAmc2hvd19zdGF0cywgMX0sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDIwMH0sCi0gIHsiZGVmaW5lZC1vbmx5Iiwgbm9fYXJndW1lbnQsICZkZWZpbmVkX29ubHksIDF9LAotICB7InVuZGVmaW5lZC1vbmx5Iiwgbm9fYXJndW1lbnQsICZ1bmRlZmluZWRfb25seSwgMX0sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAmc2hvd192ZXJzaW9uLCAxfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQwKLS8qIFNvbWUgZXJyb3ItcmVwb3J0aW5nIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVXNhZ2U6ICVzIFstYUFCQ0RnbG5vcFByc3V2Vl0gWy10IHJhZGl4XSBbLS1yYWRpeD1yYWRpeF0gWy0tdGFyZ2V0PWJmZG5hbWVdXG5cCi0gICAgICAgWy0tZGVidWctc3ltc10gWy0tZXh0ZXJuLW9ubHldIFstLXByaW50LWFybWFwXSBbLS1wcmludC1maWxlLW5hbWVdXG5cCi0gICAgICAgWy0tbnVtZXJpYy1zb3J0XSBbLS1uby1zb3J0XSBbLS1yZXZlcnNlLXNvcnRdIFstLXNpemUtc29ydF1cblwKLSAgICAgICBbLS11bmRlZmluZWQtb25seV0gWy0tcG9ydGFiaWxpdHldIFstZiB7YnNkLHN5c3YscG9zaXh9XVxuXAotICAgICAgIFstLWZvcm1hdD17YnNkLHN5c3YscG9zaXh9XSBbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdIFstLWR5bmFtaWNdXG5cCi0gICAgICAgWy0tZGVmaW5lZC1vbmx5XSBbLS1saW5lLW51bWJlcnNdXG5cCi0gICAgICAgWy0tdmVyc2lvbl0gWy0taGVscF1cblwKLSAgICAgICBbZmlsZS4uLl1cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLS8qIFNldCB0aGUgcmFkaXggZm9yIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHNpemUgYWNjb3JkaW5nIHRvIFJBRElYLiAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9wcmludF9yYWRpeCAocmFkaXgpCi0gICAgIGNoYXIgKnJhZGl4OwotewotICBzd2l0Y2ggKCpyYWRpeCkKLSAgICB7Ci0gICAgY2FzZSAneCc6Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdvJzoKLSAgICAgIGlmICgqcmFkaXggPT0gJ2QnKQotCXByaW50X3JhZGl4ID0gMTA7Ci0gICAgICBlbHNlCi0JcHJpbnRfcmFkaXggPSA4OwotI2lmbmRlZiBCRkQ2NAotICAgICAgdmFsdWVfZm9ybWF0WzRdID0gKnJhZGl4OwotI2Vsc2UKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi0gICAgICB2YWx1ZV9mb3JtYXRbNV0gPSAqcmFkaXg7Ci0jZWxzZQotICAgICAgLyogVGhpcyBjYXNlIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG9jdGFsIGFuZCBkZWNpbWFsCi0gICAgICAgICBwcmludGluZy4gICovCi0jZW5kaWYKLSNlbmRpZgotICAgICAgb3RoZXJfZm9ybWF0WzNdID0gZGVzY19mb3JtYXRbM10gPSAqcmFkaXg7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IGludmFsaWQgcmFkaXhcbiIpLCBwcm9ncmFtX25hbWUsIHJhZGl4KTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNldF9vdXRwdXRfZm9ybWF0IChmKQotICAgICBjaGFyICpmOwotewotICBpbnQgaTsKLQotICBzd2l0Y2ggKCpmKQotICAgIHsKLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICdCJzoKLSAgICAgIGkgPSBGT1JNQVRfQlNEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBpID0gRk9STUFUX1BPU0lYOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBpID0gRk9STUFUX1NZU1Y7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IGludmFsaWQgb3V0cHV0IGZvcm1hdFxuIiksIHByb2dyYW1fbmFtZSwgZik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIGZvcm1hdCA9ICZmb3JtYXRzW2ldOwotfQotDAotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBpbnQgcmV0dmFsOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gKmFyZ3Y7Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImFBQkNEZWY6Z2xub3BQcnN0OnV2ViIsIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnYSc6Ci0JICBwcmludF9kZWJ1Z19zeW1zID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ0EnOgotCWNhc2UgJ28nOgotCSAgZmlsZW5hbWVfcGVyX3N5bWJvbCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdCJzoJCS8qIEZvciBNSVBTIGNvbXBhdGliaWxpdHkuICAqLwotCSAgc2V0X291dHB1dF9mb3JtYXQgKCJic2QiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0MnOgotCSAgZG9fZGVtYW5nbGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICBkeW5hbWljID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgLyogSWdub3JlZCBmb3IgSFAvVVggY29tcGF0aWJpbGl0eS4gICovCi0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIHNldF9vdXRwdXRfZm9ybWF0IChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZyc6Ci0JICBleHRlcm5hbF9vbmx5ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JY2FzZSAnbCc6Ci0JICBsaW5lX251bWJlcnMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JY2FzZSAndic6Ci0JICBzb3J0X251bWVyaWNhbGx5ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgbm9fc29ydCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdQJzoKLQkgIHNldF9vdXRwdXRfZm9ybWF0ICgicG9zaXgiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgcmV2ZXJzZV9zb3J0ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgcHJpbnRfYXJtYXAgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBzZXRfcHJpbnRfcmFkaXggKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQkgIHVuZGVmaW5lZF9vbmx5ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgc2hvd192ZXJzaW9uID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAyMDA6CQkvKiAtLXRhcmdldCAqLwotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlIDA6CQkvKiBBIGxvbmcgb3B0aW9uIHRoYXQganVzdCBzZXRzIGEgZmxhZy4gICovCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzaG93X3ZlcnNpb24pCi0gICAgcHJpbnRfdmVyc2lvbiAoIm5tIik7Ci0KLSAgLyogT0ssIGFsbCBvcHRpb25zIG5vdyBwYXJzZWQuICBJZiBubyBmaWxlbmFtZSBzcGVjaWZpZWQsIGRvIGEub3V0LiAgKi8KLSAgaWYgKG9wdGluZCA9PSBhcmdjKQotICAgIHJldHVybiAhZGlzcGxheV9maWxlICgiYS5vdXQiKTsKLQotICByZXR2YWwgPSAwOwotCi0gIGlmIChhcmdjIC0gb3B0aW5kID4gMSkKLSAgICBmaWxlbmFtZV9wZXJfZmlsZSA9IDE7Ci0KLSAgLyogV2Ugd2VyZSBnaXZlbiBzZXZlcmFsIGZpbGVuYW1lcyB0byBkby4gICovCi0gIHdoaWxlIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLSAgICAgIGlmICghZGlzcGxheV9maWxlIChhcmd2W29wdGluZCsrXSkpCi0JcmV0dmFsKys7Ci0gICAgfQotCi0gIEVORF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lKTsKLQotI2lmZGVmIEhBVkVfU0JSSwotICBpZiAoc2hvd19zdGF0cykKLSAgICB7Ci0gICAgICBjaGFyICpsaW0gPSAoY2hhciAqKSBzYnJrICgwKTsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZGF0YSBzaXplICVsZFxuIiksIHByb2dyYW1fbmFtZSwKLQkgICAgICAgKGxvbmcpIChsaW0gLSAoY2hhciAqKSAmZW52aXJvbikpOwotICAgIH0KLSNlbmRpZgotCi0gIGV4aXQgKHJldHZhbCk7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0MCi1zdGF0aWMgdm9pZAotZGlzcGxheV9hcmNoaXZlIChmaWxlKQotICAgICBiZmQgKmZpbGU7Ci17Ci0gIGJmZCAqYXJmaWxlID0gTlVMTDsKLSAgYmZkICpsYXN0X2FyZmlsZSA9IE5VTEw7Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICAoKmZvcm1hdC0+cHJpbnRfYXJjaGl2ZV9maWxlbmFtZSkgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLQotICBpZiAocHJpbnRfYXJtYXApCi0gICAgcHJpbnRfc3ltZGVmX2VudHJ5IChmaWxlKTsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLQotICAgICAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZmlsZSwgYXJmaWxlKTsKLQotICAgICAgaWYgKGFyZmlsZSA9PSBOVUxMKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYXJmaWxlLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotCXsKLQkgICgqZm9ybWF0LT5wcmludF9hcmNoaXZlX21lbWJlcikgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpLAotCQkJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhcmZpbGUpKTsKLQkgIGRpc3BsYXlfcmVsX2ZpbGUgKGFyZmlsZSwgZmlsZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYXJmaWxlKSk7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCSAgICB7Ci0JICAgICAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICAgICAgZnJlZSAobWF0Y2hpbmcpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKLQl7Ci0JICBiZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKLQkgIGxpbmVub19jYWNoZV9iZmQgPSBOVUxMOwotCSAgbGluZW5vX2NhY2hlX3JlbF9iZmQgPSBOVUxMOwotCX0KLSAgICAgIGxhc3RfYXJmaWxlID0gYXJmaWxlOwotICAgIH0KLQotICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKLSAgICAgIGxpbmVub19jYWNoZV9iZmQgPSBOVUxMOwotICAgICAgbGluZW5vX2NhY2hlX3JlbF9iZmQgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLWRpc3BsYXlfZmlsZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBib29sZWFuIHJldHZhbCA9IHRydWU7Ci0gIGJmZCAqZmlsZTsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGZpbGUgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlsZSwgYmZkX2FyY2hpdmUpKQotICAgIHsKLSAgICAgIGRpc3BsYXlfYXJjaGl2ZSAoZmlsZSk7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGZpbGUsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgKCpmb3JtYXQtPnByaW50X29iamVjdF9maWxlbmFtZSkgKGZpbGVuYW1lKTsKLSAgICAgIGRpc3BsYXlfcmVsX2ZpbGUgKGZpbGUsIE5VTEwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICByZXR2YWwgPSBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9jbG9zZSAoZmlsZSkgPT0gZmFsc2UpCi0gICAgYmZkX2ZhdGFsIChmaWxlbmFtZSk7Ci0KLSAgbGluZW5vX2NhY2hlX2JmZCA9IE5VTEw7Ci0gIGxpbmVub19jYWNoZV9yZWxfYmZkID0gTlVMTDsKLQotICByZXR1cm4gcmV0dmFsOwotfQotDAotLyogVGhlc2UgZ2xvYmFscyBhcmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGludG8gdGhlIHNvcnRpbmcKLSAgIHJvdXRpbmVzLiAgKi8KLXN0YXRpYyBiZmQgKnNvcnRfYmZkOwotc3RhdGljIGJvb2xlYW4gc29ydF9keW5hbWljOwotc3RhdGljIGFzeW1ib2wgKnNvcnRfeDsKLXN0YXRpYyBhc3ltYm9sICpzb3J0X3k7Ci0KLS8qIFN5bWJvbC1zb3J0aW5nIHByZWRpY2F0ZXMgKi8KLSNkZWZpbmUgdmFsdWVvZih4KSAoKHgpLT5zZWN0aW9uLT52bWEgKyAoeCktPnZhbHVlKQotCi0vKiBOdW1lcmljIHNvcnRzLiAgVW5kZWZpbmVkIHN5bWJvbHMgYXJlIGFsd2F5cyBjb25zaWRlcmVkICJsZXNzIHRoYW4iCi0gICBkZWZpbmVkIHN5bWJvbHMgd2l0aCB6ZXJvIHZhbHVlcy4gIENvbW1vbiBzeW1ib2xzIGFyZSBub3QgdHJlYXRlZAotICAgc3BlY2lhbGx5IC0tIGkuZS4sIHRoZWlyIHNpemVzIGFyZSB1c2VkIGFzIHRoZWlyICJ2YWx1ZXMiLiAgKi8KLQotc3RhdGljIGludAotbnVtZXJpY19mb3J3YXJkIChQX3gsIFBfeSkKLSAgICAgY29uc3QgUFRSIFBfeDsKLSAgICAgY29uc3QgUFRSIFBfeTsKLXsKLSAgYXN5bWJvbCAqeCwgKnk7Ci0gIGFzZWN0aW9uICp4cywgKnlzOwotCi0gIHggPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeCwgc29ydF94KTsKLSAgeSA9ICBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeSwgc29ydF95KTsKLSAgaWYgKHggPT0gTlVMTCB8fCB5ID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChzb3J0X2JmZCkpOwotCi0gIHhzID0gYmZkX2dldF9zZWN0aW9uICh4KTsKLSAgeXMgPSBiZmRfZ2V0X3NlY3Rpb24gKHkpOwotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHhzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHlzKSkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHlzKSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAodmFsdWVvZiAoeCkgIT0gdmFsdWVvZiAoeSkpCi0gICAgcmV0dXJuIHZhbHVlb2YgKHgpIDwgdmFsdWVvZiAoeSkgPyAtMSA6IDE7Ci0KLSAgcmV0dXJuIG5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KTsKLX0KLQotc3RhdGljIGludAotbnVtZXJpY19yZXZlcnNlICh4LCB5KQotICAgICBjb25zdCBQVFIgeDsKLSAgICAgY29uc3QgUFRSIHk7Ci17Ci0gIHJldHVybiAtIG51bWVyaWNfZm9yd2FyZCAoeCwgeSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KQotICAgICBjb25zdCBQVFIgUF94OwotICAgICBjb25zdCBQVFIgUF95OwotewotICBhc3ltYm9sICp4LCAqeTsKLSAgY29uc3QgY2hhciAqeG4sICp5bjsKLQotICB4ID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChzb3J0X2JmZCwgc29ydF9keW5hbWljLCBQX3gsIHNvcnRfeCk7Ci0gIHkgPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeSwgc29ydF95KTsKLSAgaWYgKHggPT0gTlVMTCB8fCB5ID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChzb3J0X2JmZCkpOwotCi0gIHhuID0gYmZkX2FzeW1ib2xfbmFtZSAoeCk7Ci0gIHluID0gYmZkX2FzeW1ib2xfbmFtZSAoeSk7Ci0KLSAgcmV0dXJuICgoeG4gPT0gTlVMTCkgPyAoKHluID09IE5VTEwpID8gMCA6IC0xKSA6Ci0JICAoKHluID09IE5VTEwpID8gMSA6IHN0cmNtcCAoeG4sIHluKSkpOwotfQotCi1zdGF0aWMgaW50Ci1ub25fbnVtZXJpY19yZXZlcnNlICh4LCB5KQotICAgICBjb25zdCBQVFIgeDsKLSAgICAgY29uc3QgUFRSIHk7Ci17Ci0gIHJldHVybiAtIG5vbl9udW1lcmljX2ZvcndhcmQgKHgsIHkpOwotfQotCi1zdGF0aWMgaW50ICgqKHNvcnRlcnNbMl1bMl0pKSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpID0KLXsKLSAgeyBub25fbnVtZXJpY19mb3J3YXJkLCBub25fbnVtZXJpY19yZXZlcnNlIH0sCi0gIHsgbnVtZXJpY19mb3J3YXJkLCBudW1lcmljX3JldmVyc2UgfQotfTsKLQotLyogVGhpcyBzb3J0IHJvdXRpbmUgaXMgdXNlZCBieSBzb3J0X3N5bWJvbHNfYnlfc2l6ZS4gIEl0IGlzIHNpbWlsYXIKLSAgIHRvIG51bWVyaWNfZm9yd2FyZCwgYnV0IHdoZW4gc3ltYm9scyBoYXZlIHRoZSBzYW1lIHZhbHVlIGl0IHNvcnRzCi0gICBieSBzZWN0aW9uIFZNQS4gIFRoaXMgc2ltcGxpZmllcyB0aGUgc29ydF9zeW1ib2xzX2J5X3NpemUgY29kZQotICAgd2hpY2ggaGFuZGxlcyBzeW1ib2xzIGF0IHRoZSBlbmQgb2Ygc2VjdGlvbnMuICBBbHNvLCB0aGlzIHJvdXRpbmUKLSAgIHRyaWVzIHRvIHNvcnQgZmlsZSBuYW1lcyBiZWZvcmUgb3RoZXIgc3ltYm9scyB3aXRoIHRoZSBzYW1lIHZhbHVlLgotICAgVGhhdCB3aWxsIG1ha2UgdGhlIGZpbGUgbmFtZSBoYXZlIGEgemVybyBzaXplLCB3aGljaCB3aWxsIG1ha2UKLSAgIHNvcnRfc3ltYm9sc19ieV9zaXplIGNob29zZSB0aGUgbm9uIGZpbGUgbmFtZSBzeW1ib2wsIGxlYWRpbmcgdG8KLSAgIG1vcmUgbWVhbmluZ2Z1bCBvdXRwdXQuICBGb3Igc2ltaWxhciByZWFzb25zLCB0aGlzIGNvZGUgc29ydHMKLSAgIGdudV9jb21waWxlZF8qIGFuZCBnY2MyX2NvbXBpbGVkIGJlZm9yZSBvdGhlciBzeW1ib2xzIHdpdGggdGhlIHNhbWUKLSAgIHZhbHVlLiAgKi8KLQotc3RhdGljIGludAotc2l6ZV9mb3J3YXJkMSAoUF94LCBQX3kpCi0gICAgIGNvbnN0IFBUUiBQX3g7Ci0gICAgIGNvbnN0IFBUUiBQX3k7Ci17Ci0gIGFzeW1ib2wgKngsICp5OwotICBhc2VjdGlvbiAqeHMsICp5czsKLSAgY29uc3QgY2hhciAqeG4sICp5bjsKLSAgc2l6ZV90IHhubCwgeW5sOwotICBpbnQgeGYsIHlmOwotCi0gIHggPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeCwgc29ydF94KTsKLSAgeSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoc29ydF9iZmQsIHNvcnRfZHluYW1pYywgUF95LCBzb3J0X3kpOwotICBpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKHNvcnRfYmZkKSk7Ci0KLSAgeHMgPSBiZmRfZ2V0X3NlY3Rpb24gKHgpOwotICB5cyA9IGJmZF9nZXRfc2VjdGlvbiAoeSk7Ci0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoeHMpKQotICAgIGFib3J0ICgpOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uICh5cykpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHZhbHVlb2YgKHgpICE9IHZhbHVlb2YgKHkpKQotICAgIHJldHVybiB2YWx1ZW9mICh4KSA8IHZhbHVlb2YgKHkpID8gLTEgOiAxOwotCi0gIGlmICh4cy0+dm1hICE9IHlzLT52bWEpCi0gICAgcmV0dXJuIHhzLT52bWEgPCB5cy0+dm1hID8gLTEgOiAxOwotCi0gIHhuID0gYmZkX2FzeW1ib2xfbmFtZSAoeCk7Ci0gIHluID0gYmZkX2FzeW1ib2xfbmFtZSAoeSk7Ci0gIHhubCA9IHN0cmxlbiAoeG4pOwotICB5bmwgPSBzdHJsZW4gKHluKTsKLQotICAvKiBUaGUgc3ltYm9scyBnbnVfY29tcGlsZWQgYW5kIGdjYzJfY29tcGlsZWQgY29udmV5IGV2ZW4gbGVzcwotICAgICBpbmZvcm1hdGlvbiB0aGFuIHRoZSBmaWxlIG5hbWUsIHNvIHNvcnQgdGhlbSBvdXQgZmlyc3QuICAqLwotCi0gIHhmID0gKHN0cnN0ciAoeG4sICJnbnVfY29tcGlsZWQiKSAhPSBOVUxMCi0JfHwgc3Ryc3RyICh4biwgImdjYzJfY29tcGlsZWQiKSAhPSBOVUxMKTsKLSAgeWYgPSAoc3Ryc3RyICh5biwgImdudV9jb21waWxlZCIpICE9IE5VTEwKLQl8fCBzdHJzdHIgKHluLCAiZ2NjMl9jb21waWxlZCIpICE9IE5VTEwpOwotCi0gIGlmICh4ZiAmJiAhIHlmKQotICAgIHJldHVybiAtMTsKLSAgaWYgKCEgeGYgJiYgeWYpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogV2UgdXNlIGEgaGV1cmlzdGljIGZvciB0aGUgZmlsZSBuYW1lLiAgSXQgbWF5IG5vdCB3b3JrIG9uIG5vbgotICAgICBVbml4IHN5c3RlbXMsIGJ1dCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXI7IHRoZSBvbmx5IGRpZmZlcmVuY2UKLSAgICAgaXMgcHJlY2lzZWx5IHdoaWNoIHN5bWJvbCBuYW1lcyBnZXQgcHJpbnRlZC4gICovCi0KLSNkZWZpbmUgZmlsZV9zeW1ib2wocywgc24sIHNubCkJCQlcCi0gICgoKHMpLT5mbGFncyAmIEJTRl9GSUxFKSAhPSAwCQkJXAotICAgfHwgKChzbilbKHNubCkgLSAyXSA9PSAnLicJCQlcCi0gICAgICAgJiYgKChzbilbKHNubCkgLSAxXSA9PSAnbycJCVwKLQkgICB8fCAoc24pWyhzbmwpIC0gMV0gPT0gJ2EnKSkpCi0KLSAgeGYgPSBmaWxlX3N5bWJvbCAoeCwgeG4sIHhubCk7Ci0gIHlmID0gZmlsZV9zeW1ib2wgKHksIHluLCB5bmwpOwotCi0gIGlmICh4ZiAmJiAhIHlmKQotICAgIHJldHVybiAtMTsKLSAgaWYgKCEgeGYgJiYgeWYpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIG5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KTsKLX0KLQotLyogVGhpcyBzb3J0IHJvdXRpbmUgaXMgdXNlZCBieSBzb3J0X3N5bWJvbHNfYnlfc2l6ZS4gIEl0IGlzIHNvcnRpbmcKLSAgIGFuIGFycmF5IG9mIHNpemVfc3ltIHN0cnVjdHVyZXMgaW50byBzaXplIG9yZGVyLiAgKi8KLQotc3RhdGljIGludAotc2l6ZV9mb3J3YXJkMiAoUF94LCBQX3kpCi0gICAgIGNvbnN0IFBUUiBQX3g7Ci0gICAgIGNvbnN0IFBUUiBQX3k7Ci17Ci0gIGNvbnN0IHN0cnVjdCBzaXplX3N5bSAqeCA9IChjb25zdCBzdHJ1Y3Qgc2l6ZV9zeW0gKikgUF94OwotICBjb25zdCBzdHJ1Y3Qgc2l6ZV9zeW0gKnkgPSAoY29uc3Qgc3RydWN0IHNpemVfc3ltICopIFBfeTsKLQotICBpZiAoeC0+c2l6ZSA8IHktPnNpemUpCi0gICAgcmV0dXJuIHJldmVyc2Vfc29ydCA/IDEgOiAtMTsKLSAgZWxzZSBpZiAoeC0+c2l6ZSA+IHktPnNpemUpCi0gICAgcmV0dXJuIHJldmVyc2Vfc29ydCA/IC0xIDogMTsKLSAgZWxzZQotICAgIHJldHVybiBzb3J0ZXJzWzBdW3JldmVyc2Vfc29ydF0gKHgtPm1pbmlzeW0sIHktPm1pbmlzeW0pOwotfQotCi0vKiBTb3J0IHRoZSBzeW1ib2xzIGJ5IHNpemUuICBXZSBndWVzcyB0aGUgc2l6ZSBieSBhc3N1bWluZyB0aGF0IHRoZQotICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGEgc3ltYm9sIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIG5leHQgaGlnaGVyIHN5bWJvbCBpcyB0aGUgc2l6ZS4gIEZJWE1FOiBFTEYgYWN0dWFsbHkgc3RvcmVzIGEgc2l6ZQotICAgd2l0aCBlYWNoIHN5bWJvbC4gIFdlIHNob3VsZCB1c2UgaXQuICAqLwotCi1zdGF0aWMgbG9uZwotc29ydF9zeW1ib2xzX2J5X3NpemUgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwgc3ltc2l6ZXNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgUFRSIG1pbmlzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgc3RydWN0IHNpemVfc3ltICoqc3ltc2l6ZXNwOwotewotICBzdHJ1Y3Qgc2l6ZV9zeW0gKnN5bXNpemVzOwotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQ7Ci0gIGFzeW1ib2wgKnN5bSA9IE5VTEw7Ci0gIGFzeW1ib2wgKnN0b3JlX3N5bSwgKnN0b3JlX25leHQ7Ci0KLSAgcXNvcnQgKG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwgc2l6ZV9mb3J3YXJkMSk7Ci0KLSAgLyogV2UgYXJlIGdvaW5nIHRvIHJldHVybiBhIHNwZWNpYWwgc2V0IG9mIHN5bWJvbHMgYW5kIHNpemVzIHRvCi0gICAgIHByaW50LiAgKi8KLSAgc3ltc2l6ZXMgPSAoc3RydWN0IHNpemVfc3ltICopIHhtYWxsb2MgKHN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc2l6ZV9zeW0pKTsKLSAgKnN5bXNpemVzcCA9IHN5bXNpemVzOwotCi0gIC8qIE5vdGUgdGhhdCBmaWx0ZXJfc3ltYm9scyBoYXMgYWxyZWFkeSByZW1vdmVkIGFsbCBhYnNvbHV0ZSBhbmQKLSAgICAgdW5kZWZpbmVkIHN5bWJvbHMuICBIZXJlIHdlIHJlbW92ZSBhbGwgc3ltYm9scyB3aG9zZSBzaXplIHdpbmRzCi0gICAgIHVwIGFzIHplcm8uICAqLwotCi0gIGZyb20gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0gIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQgKiBzaXplOwotCi0gIHN0b3JlX3N5bSA9IHNvcnRfeDsKLSAgc3RvcmVfbmV4dCA9IHNvcnRfeTsKLQotICBpZiAoZnJvbSA8IGZyb21lbmQpCi0gICAgewotICAgICAgc3ltID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCAoY29uc3QgUFRSKSBmcm9tLAotCQkJCSAgICAgIHN0b3JlX3N5bSk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgfQotCi0gIGZvciAoOyBmcm9tIDwgZnJvbWVuZDsgZnJvbSArPSBzaXplKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKm5leHQ7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSBzejsKLSAgICAgIGFzeW1ib2wgKnRlbXA7Ci0KLSAgICAgIGlmIChmcm9tICsgc2l6ZSA8IGZyb21lbmQpCi0JewotCSAgbmV4dCA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwKLQkJCQkJICAgZHluYW1pYywKLQkJCQkJICAgKGNvbnN0IFBUUikgKGZyb20gKyBzaXplKSwKLQkJCQkJICAgc3RvcmVfbmV4dCk7Ci0JICBpZiAobmV4dCA9PSBOVUxMKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQl9Ci0gICAgICBlbHNlCi0JbmV4dCA9IE5VTEw7Ci0KLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKTsKLQotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLQlzeiA9IHN5bS0+dmFsdWU7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGZyb20gKyBzaXplIDwgZnJvbWVuZAotCSAgICAgICYmIHNlYyA9PSBiZmRfZ2V0X3NlY3Rpb24gKG5leHQpKQotCSAgICBzeiA9IHZhbHVlb2YgKG5leHQpIC0gdmFsdWVvZiAoc3ltKTsKLQkgIGVsc2UKLQkgICAgc3ogPSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkgICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKQotCQkgIC0gdmFsdWVvZiAoc3ltKSk7Ci0JfQotCi0gICAgICBpZiAoc3ogIT0gMCkKLQl7Ci0JICBzeW1zaXplcy0+bWluaXN5bSA9IChjb25zdCBQVFIpIGZyb207Ci0JICBzeW1zaXplcy0+c2l6ZSA9IHN6OwotCSAgKytzeW1zaXplczsKLQl9Ci0KLSAgICAgIHN5bSA9IG5leHQ7Ci0KLSAgICAgIHRlbXAgPSBzdG9yZV9zeW07Ci0gICAgICBzdG9yZV9zeW0gPSBzdG9yZV9uZXh0OwotICAgICAgc3RvcmVfbmV4dCA9IHRlbXA7Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gc3ltc2l6ZXMgLSAqc3ltc2l6ZXNwOwotCi0gIC8qIFdlIG11c3Qgbm93IHNvcnQgYWdhaW4gYnkgc2l6ZS4gICovCi0gIHFzb3J0ICgoUFRSKSAqc3ltc2l6ZXNwLCBzeW1jb3VudCwgc2l6ZW9mIChzdHJ1Y3Qgc2l6ZV9zeW0pLCBzaXplX2ZvcndhcmQyKTsKLQotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0MCi0vKiBJZiBBUkNISVZFX0JGRCBpcyBub24tTlVMTCwgaXQgaXMgdGhlIGFyY2hpdmUgY29udGFpbmluZyBBQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfcmVsX2ZpbGUgKGFiZmQsIGFyY2hpdmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZCAqYXJjaGl2ZV9iZmQ7Ci17Ci0gIGxvbmcgc3ltY291bnQ7Ci0gIFBUUiBtaW5pc3ltczsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIHN0cnVjdCBzaXplX3N5bSAqc3ltc2l6ZXM7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBpZiAoIShiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgSEFTX1NZTVMpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBzeW1jb3VudCA9IGJmZF9yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCAmbWluaXN5bXMsICZzaXplKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAoc3ltY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBEaXNjYXJkIHRoZSBzeW1ib2xzIHdlIGRvbid0IHdhbnQgdG8gcHJpbnQuCi0gICAgIEl0J3MgT0sgdG8gZG8gdGhpcyBpbiBwbGFjZTsgd2UnbGwgZnJlZSB0aGUgc3RvcmFnZSBhbnl3YXkKLSAgICAgKGFmdGVyIHByaW50aW5nKS4gICovCi0KLSAgc3ltY291bnQgPSBmaWx0ZXJfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKTsKLQotICBzeW1zaXplcyA9IE5VTEw7Ci0gIGlmICghIG5vX3NvcnQpCi0gICAgewotICAgICAgc29ydF9iZmQgPSBhYmZkOwotICAgICAgc29ydF9keW5hbWljID0gZHluYW1pYzsKLSAgICAgIHNvcnRfeCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gICAgICBzb3J0X3kgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICAgICAgaWYgKHNvcnRfeCA9PSBOVUxMIHx8IHNvcnRfeSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBpZiAoISBzb3J0X2J5X3NpemUpCi0JcXNvcnQgKG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwKLQkgICAgICAgc29ydGVyc1tzb3J0X251bWVyaWNhbGx5XVtyZXZlcnNlX3NvcnRdKTsKLSAgICAgIGVsc2UKLQlzeW1jb3VudCA9IHNvcnRfc3ltYm9sc19ieV9zaXplIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsCi0JCQkJCSBzaXplLCAmc3ltc2l6ZXMpOwotICAgIH0KLQotICBpZiAoISBzb3J0X2J5X3NpemUpCi0gICAgcHJpbnRfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplLCBhcmNoaXZlX2JmZCk7Ci0gIGVsc2UKLSAgICBwcmludF9zaXplX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIHN5bXNpemVzLCBzeW1jb3VudCwgYXJjaGl2ZV9iZmQpOwotCi0gIGZyZWUgKG1pbmlzeW1zKTsKLX0KLQwKLS8qIENob29zZSB3aGljaCBzeW1ib2wgZW50cmllcyB0byBwcmludDsKLSAgIGNvbXBhY3QgdGhlbSBkb3dud2FyZCB0byBnZXQgcmlkIG9mIHRoZSByZXN0LgotICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBiZSBwcmludGVkLiAgKi8KLQotc3RhdGljIGxvbmcKLWZpbHRlcl9zeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBQVFIgbWluaXN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQsICp0bzsKLSAgYXN5bWJvbCAqc3RvcmU7Ci0KLSAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3RvcmUgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKLSAgdG8gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0KLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCi0gICAgewotICAgICAgaW50IGtlZXAgPSAwOwotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBQUk9HUkVTUyAoMSk7Ci0gICAgICAKLSAgICAgIHN5bSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgKGNvbnN0IFBUUikgZnJvbSwgc3RvcmUpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBpZiAodW5kZWZpbmVkX29ubHkpCi0Ja2VlcCA9IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKTsKLSAgICAgIGVsc2UgaWYgKGV4dGVybmFsX29ubHkpCi0Ja2VlcCA9ICgoc3ltLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDAKLQkJfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAotCQl8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLQkJfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKTsKLSAgICAgIGVsc2UKLQlrZWVwID0gMTsKLQotICAgICAgaWYgKGtlZXAKLQkgICYmICEgcHJpbnRfZGVidWdfc3ltcwotCSAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQotCWtlZXAgPSAwOwotCi0gICAgICBpZiAoa2VlcAotCSAgJiYgc29ydF9ieV9zaXplCi0JICAmJiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0JICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKSkKLQlrZWVwID0gMDsKLQotICAgICAgaWYgKGtlZXAKLQkgICYmIGRlZmluZWRfb25seSkKLQl7Ci0JICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCSAgICBrZWVwID0gMDsKLQl9Ci0KLSAgICAgIGlmIChrZWVwKQotCXsKLQkgIG1lbWNweSAodG8sIGZyb20sIHNpemUpOwotCSAgdG8gKz0gc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAodG8gLSAoYmZkX2J5dGUgKikgbWluaXN5bXMpIC8gc2l6ZTsKLX0KLQwKLS8qIFByaW50IHN5bWJvbCBuYW1lIE5BTUUsIHJlYWQgZnJvbSBBQkZELCB3aXRoIHByaW50ZiBmb3JtYXQgRk9STUFULAotICAgZGVtYW5nbGluZyBpdCBpZiByZXF1ZXN0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltbmFtZSAoZm9ybWF0LCBuYW1lLCBhYmZkKQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGRvX2RlbWFuZ2xlICYmICpuYW1lKQotICAgIHsKLSAgICAgIGNoYXIgKnJlczsKLQotICAgICAgLyogSW4gdGhpcyBtb2RlLCBnaXZlIGEgdXNlci1sZXZlbCB2aWV3IG9mIHRoZSBzeW1ib2wgbmFtZQotCSBldmVuIGlmIGl0J3Mgbm90IG1hbmdsZWQ7IHN0cmlwIG9mZiBhbnkgbGVhZGluZwotCSB1bmRlcnNjb3JlLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09IG5hbWVbMF0pCi0JbmFtZSsrOwotCi0gICAgICByZXMgPSBjcGx1c19kZW1hbmdsZSAobmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotICAgICAgaWYgKHJlcykKLQl7Ci0JICBwcmludGYgKGZvcm1hdCwgcmVzKTsKLQkgIGZyZWUgKHJlcyk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBwcmludGYgKGZvcm1hdCwgbmFtZSk7Ci19Ci0KLS8qIFByaW50IHRoZSBzeW1ib2xzLiAgSWYgQVJDSElWRV9CRkQgaXMgbm9uLU5VTEwsIGl0IGlzIHRoZSBhcmNoaXZlCi0gICBjb250YWluaW5nIEFCRkQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplLCBhcmNoaXZlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiBtaW5pc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJmZCAqYXJjaGl2ZV9iZmQ7Ci17Ci0gIGFzeW1ib2wgKnN0b3JlOwotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQ7Ci0KLSAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3RvcmUgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIGZyb20sIHN0b3JlKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgcHJpbnRfc3ltYm9sIChhYmZkLCBzeW0sIGFyY2hpdmVfYmZkKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IHRoZSBzeW1ib2xzIHdoZW4gc29ydGluZyBieSBzaXplLiAgKi8KLQotc3RhdGljIHZvaWQgCi1wcmludF9zaXplX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIHN5bXNpemVzLCBzeW1jb3VudCwgYXJjaGl2ZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBzdHJ1Y3Qgc2l6ZV9zeW0gKnN5bXNpemVzOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBiZmQgKmFyY2hpdmVfYmZkOwotewotICBhc3ltYm9sICpzdG9yZTsKLSAgc3RydWN0IHNpemVfc3ltICpmcm9tLCAqZnJvbWVuZDsKLQotICBzdG9yZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGZyb20gPSBzeW1zaXplczsKLSAgZnJvbWVuZCA9IGZyb20gKyBzeW1jb3VudDsKLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIGZyb20tPm1pbmlzeW0sIHN0b3JlKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgLyogU2V0IHRoZSBzeW1ib2wgdmFsdWUgc28gdGhhdCB3ZSBhY3R1YWxseSBkaXNwbGF5IHRoZSBzeW1ib2wKLSAgICAgICAgIHNpemUuICAqLwotICAgICAgc3ltLT52YWx1ZSA9IGZyb20tPnNpemUgLSBiZmRfc2VjdGlvbl92bWEgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSk7Ci0KLSAgICAgIHByaW50X3N5bWJvbCAoYWJmZCwgc3ltLCBhcmNoaXZlX2JmZCk7Ci0gICAgfQotfQotCi0vKiBQcmludCBhIHNpbmdsZSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sIChhYmZkLCBzeW0sIGFyY2hpdmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgYmZkICphcmNoaXZlX2JmZDsKLXsKLSAgUFJPR1JFU1MgKDEpOwotCi0gICgqZm9ybWF0LT5wcmludF9zeW1ib2xfZmlsZW5hbWUpIChhcmNoaXZlX2JmZCwgYWJmZCk7Ci0KLSAgaWYgKHVuZGVmaW5lZF9vbmx5KQotICAgIHsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JcHJpbnRfc3ltbmFtZSAoIiVzIiwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgYWJmZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sX2luZm8gc3ltaW5mbzsKLQotICAgICAgYmZkX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltLCAmc3ltaW5mbyk7Ci0gICAgICAoKmZvcm1hdC0+cHJpbnRfc3ltYm9sX2luZm8pICgmc3ltaW5mbywgYWJmZCk7Ci0gICAgfQotCi0gIGlmIChsaW5lX251bWJlcnMpCi0gICAgewotICAgICAgc3RhdGljIGFzeW1ib2wgKipzeW1zOwotICAgICAgc3RhdGljIGxvbmcgc3ltY291bnQ7Ci0gICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgKmZ1bmN0aW9ubmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBsaW5lbm87Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gZ2V0IHRoZSBjYW5vbmljYWwgc3ltYm9scyBpbiBvcmRlciB0byBjYWxsCi0gICAgICAgICBiZmRfZmluZF9uZWFyZXN0X2xpbmUuICBUaGlzIGlzIGluZWZmaWNpZW50LCBidXQsIHRoZW4sIHlvdQotICAgICAgICAgZG9uJ3QgaGF2ZSB0byB1c2UgLS1saW5lLW51bWJlcnMuICAqLwotICAgICAgaWYgKGFiZmQgIT0gbGluZW5vX2NhY2hlX2JmZCAmJiBzeW1zICE9IE5VTEwpCi0JewotCSAgZnJlZSAoc3ltcyk7Ci0JICBzeW1zID0gTlVMTDsKLQl9Ci0gICAgICBpZiAoc3ltcyA9PSBOVUxMKQotCXsKLQkgIGxvbmcgc3ltc2l6ZTsKLQotCSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLQkgIGlmIChzeW1zaXplIDwgMCkKLQkgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBzeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0JICBpZiAoc3ltY291bnQgPCAwKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGxpbmVub19jYWNoZV9iZmQgPSBhYmZkOwotCX0KLQotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQl7Ci0JICBzdGF0aWMgYXNlY3Rpb24gKipzZWNzOwotCSAgc3RhdGljIGFyZWxlbnQgKioqcmVsb2NzOwotCSAgc3RhdGljIGxvbmcgKnJlbGNvdW50OwotCSAgc3RhdGljIHVuc2lnbmVkIGludCBzZWNjb3VudDsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgY29uc3QgY2hhciAqc3ltbmFtZTsKLQotCSAgLyogRm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHdlIHRyeSB0byBmaW5kIGEgcmVsb2MgZm9yIHRoZQotICAgICAgICAgICAgIHN5bWJvbCwgYW5kIHByaW50IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgcmVsb2MuICAqLwotCi0JICBpZiAoYWJmZCAhPSBsaW5lbm9fY2FjaGVfcmVsX2JmZCAmJiByZWxvY3MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWNjb3VudDsgaSsrKQotCQlpZiAocmVsb2NzW2ldICE9IE5VTEwpCi0JCSAgZnJlZSAocmVsb2NzW2ldKTsKLQkgICAgICBmcmVlIChzZWNzKTsKLQkgICAgICBmcmVlIChyZWxvY3MpOwotCSAgICAgIGZyZWUgKHJlbGNvdW50KTsKLQkgICAgICBzZWNzID0gTlVMTDsKLQkgICAgICByZWxvY3MgPSBOVUxMOwotCSAgICAgIHJlbGNvdW50ID0gTlVMTDsKLQkgICAgfQotCi0JICBpZiAocmVsb2NzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvIGluZm87Ci0KLQkgICAgICBzZWNjb3VudCA9IGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCk7Ci0KLQkgICAgICBzZWNzID0gKGFzZWN0aW9uICoqKSB4bWFsbG9jIChzZWNjb3VudCAqIHNpemVvZiAqc2Vjcyk7Ci0JICAgICAgcmVsb2NzID0gKGFyZWxlbnQgKioqKSB4bWFsbG9jIChzZWNjb3VudCAqIHNpemVvZiAqcmVsb2NzKTsKLQkgICAgICByZWxjb3VudCA9IChsb25nICopIHhtYWxsb2MgKHNlY2NvdW50ICogc2l6ZW9mICpyZWxjb3VudCk7Ci0KLQkgICAgICBpbmZvLnNlY3MgPSBzZWNzOwotCSAgICAgIGluZm8ucmVsb2NzID0gcmVsb2NzOwotCSAgICAgIGluZm8ucmVsY291bnQgPSByZWxjb3VudDsKLQkgICAgICBpbmZvLnN5bXMgPSBzeW1zOwotCSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZ2V0X3JlbG9jcywgKFBUUikgJmluZm8pOwotCSAgICAgIGxpbmVub19jYWNoZV9yZWxfYmZkID0gYWJmZDsKLQkgICAgfQotCi0JICBzeW1uYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzZWNjb3VudDsgaSsrKQotCSAgICB7Ci0JICAgICAgbG9uZyBqOwotCi0JICAgICAgZm9yIChqID0gMDsgaiA8IHJlbGNvdW50W2ldOyBqKyspCi0JCXsKLQkJICBhcmVsZW50ICpyOwotCi0JCSAgciA9IHJlbG9jc1tpXVtqXTsKLQkJICBpZiAoci0+c3ltX3B0cl9wdHIgIT0gTlVMTAotCQkgICAgICAmJiAoKnItPnN5bV9wdHJfcHRyKS0+c2VjdGlvbiA9PSBzeW0tPnNlY3Rpb24KLQkJICAgICAgJiYgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlID09IHN5bS0+dmFsdWUKLQkJICAgICAgJiYgc3RyY21wIChzeW1uYW1lLAotCQkJCSBiZmRfYXN5bWJvbF9uYW1lICgqci0+c3ltX3B0cl9wdHIpKSA9PSAwCi0JCSAgICAgICYmIGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2Vjc1tpXSwgc3ltcywKLQkJCQkJCXItPmFkZHJlc3MsICZmaWxlbmFtZSwKLQkJCQkJCSZmdW5jdGlvbm5hbWUsICZsaW5lbm8pKQotCQkgICAgewotCQkgICAgICAvKiBXZSBvbmx5IHByaW50IHRoZSBmaXJzdCBvbmUgd2UgZmluZC4gICovCi0JCSAgICAgIHByaW50ZiAoIlx0JXM6JXUiLCBmaWxlbmFtZSwgbGluZW5vKTsKLQkJICAgICAgaSA9IHNlY2NvdW50OwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pLT5vd25lciA9PSBhYmZkKQotCXsKLQkgIGlmIChiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSwgc3ltcywKLQkJCQkgICAgIHN5bS0+dmFsdWUsICZmaWxlbmFtZSwgJmZ1bmN0aW9ubmFtZSwKLQkJCQkgICAgICZsaW5lbm8pCi0JICAgICAgJiYgZmlsZW5hbWUgIT0gTlVMTAotCSAgICAgICYmIGxpbmVubyAhPSAwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiXHQlczoldSIsIGZpbGVuYW1lLCBsaW5lbm8pOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBwdXRjaGFyICgnXG4nKTsKLX0KLQwKLS8qIFRoZSBmb2xsb3dpbmcgMyBncm91cHMgb2YgZnVuY3Rpb25zIGFyZSBjYWxsZWQgdW5jb25kaXRpb25hbGx5LAotICAgb25jZSBhdCB0aGUgc3RhcnQgb2YgcHJvY2Vzc2luZyBlYWNoIGZpbGUgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCi0gICBUaGV5IHNob3VsZCBjaGVjayBgZmlsZW5hbWVfcGVyX2ZpbGUnIGFuZCBgZmlsZW5hbWVfcGVyX3N5bWJvbCcsCi0gICBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlaXIgb3V0cHV0IGZvcm1hdCwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8KLSAgIHByaW50IGFueXRoaW5nLiAgKi8KLQwKLS8qIFByaW50IHRoZSBuYW1lIG9mIGFuIG9iamVjdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX2JzZCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAoZmlsZW5hbWVfcGVyX2ZpbGUgJiYgIWZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgcHJpbnRmICgiXG4lczpcbiIsIGZpbGVuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X29iamVjdF9maWxlbmFtZV9zeXN2IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmICh1bmRlZmluZWRfb25seSkKLSAgICBwcmludGYgKF8oIlxuXG5VbmRlZmluZWQgc3ltYm9scyBmcm9tICVzOlxuXG4iKSwgZmlsZW5hbWUpOwotICBlbHNlCi0gICAgcHJpbnRmIChfKCJcblxuU3ltYm9scyBmcm9tICVzOlxuXG4iKSwgZmlsZW5hbWUpOwotICBwcmludGYgKF8oIlwKLU5hbWUgICAgICAgICAgICAgICAgICBWYWx1ZSAgIENsYXNzICAgICAgICBUeXBlICAgICAgICAgU2l6ZSAgIExpbmUgIFNlY3Rpb25cblxuIikpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmIChmaWxlbmFtZV9wZXJfZmlsZSAmJiAhZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICBwcmludGYgKCIlczpcbiIsIGZpbGVuYW1lKTsKLX0KLQwKLS8qIFByaW50IHRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgZmlsZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfYnNkIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmIChmaWxlbmFtZV9wZXJfZmlsZSkKLSAgICBwcmludGYgKCJcbiVzOlxuIiwgZmlsZW5hbWUpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9zeXN2IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfcG9zaXggKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotfQotDAotLyogUHJpbnQgdGhlIG5hbWUgb2YgYW4gYXJjaGl2ZSBtZW1iZXIgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX21lbWJlcl9ic2QgKGFyY2hpdmUsIGZpbGVuYW1lKQotICAgICBjaGFyICphcmNoaXZlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAoIWZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgcHJpbnRmICgiXG4lczpcbiIsIGZpbGVuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX3N5c3YgKGFyY2hpdmUsIGZpbGVuYW1lKQotICAgICBjaGFyICphcmNoaXZlOwotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaWYgKHVuZGVmaW5lZF9vbmx5KQotICAgIHByaW50ZiAoXygiXG5cblVuZGVmaW5lZCBzeW1ib2xzIGZyb20gJXNbJXNdOlxuXG4iKSwgYXJjaGl2ZSwgZmlsZW5hbWUpOwotICBlbHNlCi0gICAgcHJpbnRmIChfKCJcblxuU3ltYm9scyBmcm9tICVzWyVzXTpcblxuIiksIGFyY2hpdmUsIGZpbGVuYW1lKTsKLSAgcHJpbnRmIChfKCJcCi1OYW1lICAgICAgICAgICAgICAgICAgVmFsdWUgICBDbGFzcyAgICAgICAgVHlwZSAgICAgICAgIFNpemUgICBMaW5lICBTZWN0aW9uXG5cbiIpKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX3Bvc2l4IChhcmNoaXZlLCBmaWxlbmFtZSkKLSAgICAgY2hhciAqYXJjaGl2ZTsKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmICghZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICBwcmludGYgKCIlc1slc106XG4iLCBhcmNoaXZlLCBmaWxlbmFtZSk7Ci19Ci0MCi0vKiBQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSAoYW5kIGFyY2hpdmUsIGlmIHRoZXJlIGlzIG9uZSkKLSAgIGNvbnRhaW5pbmcgYSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX2JzZCAoYXJjaGl2ZV9iZmQsIGFiZmQpCi0gICAgIGJmZCAqYXJjaGl2ZV9iZmQsICphYmZkOwotewotICBpZiAoZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICB7Ci0gICAgICBpZiAoYXJjaGl2ZV9iZmQpCi0JcHJpbnRmICgiJXM6IiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpKTsKLSAgICAgIHByaW50ZiAoIiVzOiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfc3lzdiAoYXJjaGl2ZV9iZmQsIGFiZmQpCi0gICAgIGJmZCAqYXJjaGl2ZV9iZmQsICphYmZkOwotewotICBpZiAoZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICB7Ci0gICAgICBpZiAoYXJjaGl2ZV9iZmQpCi0JcHJpbnRmICgiJXM6IiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpKTsKLSAgICAgIHByaW50ZiAoIiVzOiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfcG9zaXggKGFyY2hpdmVfYmZkLCBhYmZkKQotICAgICBiZmQgKmFyY2hpdmVfYmZkLCAqYWJmZDsKLXsKLSAgaWYgKGZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgewotICAgICAgaWYgKGFyY2hpdmVfYmZkKQotCXByaW50ZiAoIiVzWyVzXTogIiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBlbHNlCi0JcHJpbnRmICgiJXM6ICIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci19Ci0MCi0vKiBQcmludCBhIHN5bWJvbCB2YWx1ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF92YWx1ZSAodmFsKQotICAgICBiZmRfdm1hIHZhbDsKLXsKLSNpZiAhIGRlZmluZWQgKEJGRDY0KSB8fCBCRkRfSE9TVF82NEJJVF9MT05HCi0gIHByaW50ZiAodmFsdWVfZm9ybWF0LCB2YWwpOwotI2Vsc2UKLSAgLyogV2UgaGF2ZSBhIDY0IGJpdCB2YWx1ZSB0byBwcmludCwgYnV0IHRoZSBob3N0IGlzIG9ubHkgMzIgYml0LiAgKi8KLSAgaWYgKHByaW50X3JhZGl4ID09IDE2KQotICAgIGZwcmludGZfdm1hIChzdGRvdXQsIHZhbCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlszMF07Ci0gICAgICBjaGFyICpzOwotCi0gICAgICBzID0gYnVmICsgc2l6ZW9mIGJ1ZjsKLSAgICAgICotLXMgPSAnXDAnOwotICAgICAgd2hpbGUgKHZhbCA+IDApCi0JewotCSAgKi0tcyA9ICh2YWwgJSBwcmludF9yYWRpeCkgKyAnMCc7Ci0JICB2YWwgLz0gcHJpbnRfcmFkaXg7Ci0JfQotICAgICAgd2hpbGUgKChidWYgKyBzaXplb2YgYnVmIC0gMSkgLSBzIDwgMTYpCi0JKi0tcyA9ICcwJzsKLSAgICAgIHByaW50ZiAoIiVzIiwgcyk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLS8qIFByaW50IGEgbGluZSBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19ic2QgKGluZm8sIGFiZmQpCi0gICAgIHN5bWJvbF9pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChpbmZvLT50eXBlID09ICdVJyB8fCBpbmZvLT50eXBlID09ICd3JykKLSAgICB7Ci0gICAgICBwcmludGYgKCIlKnMiLAotI2lmZGVmIEJGRDY0Ci0JICAgICAgMTYsCi0jZWxzZQotCSAgICAgIDgsCi0jZW5kaWYKLQkgICAgICAiIik7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpbnRfdmFsdWUgKGluZm8tPnZhbHVlKTsKLSAgcHJpbnRmICgiICVjIiwgaW5mby0+dHlwZSk7Ci0gIGlmIChpbmZvLT50eXBlID09ICctJykKLSAgICB7Ci0gICAgICAvKiBBIHN0YWIuICAqLwotICAgICAgcHJpbnRmICgiICIpOwotICAgICAgcHJpbnRmIChvdGhlcl9mb3JtYXQsIGluZm8tPnN0YWJfb3RoZXIpOwotICAgICAgcHJpbnRmICgiICIpOwotICAgICAgcHJpbnRmIChkZXNjX2Zvcm1hdCwgaW5mby0+c3RhYl9kZXNjKTsKLSAgICAgIHByaW50ZiAoIiAlNXMiLCBpbmZvLT5zdGFiX25hbWUpOwotICAgIH0KLSAgcHJpbnRfc3ltbmFtZSAoIiAlcyIsIGluZm8tPm5hbWUsIGFiZmQpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2luZm9fc3lzdiAoaW5mbywgYWJmZCkKLSAgICAgc3ltYm9sX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcHJpbnRfc3ltbmFtZSAoIiUtMjBzfCIsIGluZm8tPm5hbWUsIGFiZmQpOwkvKiBOYW1lICovCi0gIGlmIChpbmZvLT50eXBlID09ICdVJyB8fCBpbmZvLT50eXBlID09ICd3JykKLSAgICBwcmludGYgKCIgICAgICAgICIpOwkvKiBWYWx1ZSAqLwotICBlbHNlCi0gICAgcHJpbnRfdmFsdWUgKGluZm8tPnZhbHVlKTsKLSAgcHJpbnRmICgifCAgICVjICB8IiwgaW5mby0+dHlwZSk7CS8qIENsYXNzICovCi0gIGlmIChpbmZvLT50eXBlID09ICctJykKLSAgICB7Ci0gICAgICAvKiBBIHN0YWIuICAqLwotICAgICAgcHJpbnRmICgiJTE4c3wgICIsIGluZm8tPnN0YWJfbmFtZSk7CS8qIChDKSBUeXBlICovCi0gICAgICBwcmludGYgKGRlc2NfZm9ybWF0LCBpbmZvLT5zdGFiX2Rlc2MpOwkvKiBTaXplICovCi0gICAgICBwcmludGYgKCJ8ICAgICB8Iik7CS8qIExpbmUsIFNlY3Rpb24gKi8KLSAgICB9Ci0gIGVsc2UKLSAgICBwcmludGYgKCIgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCIpOwkvKiBUeXBlLCBTaXplLCBMaW5lLCBTZWN0aW9uICovCi19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19wb3NpeCAoaW5mbywgYWJmZCkKLSAgICAgc3ltYm9sX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcHJpbnRfc3ltbmFtZSAoIiVzICIsIGluZm8tPm5hbWUsIGFiZmQpOwotICBwcmludGYgKCIlYyAiLCBpbmZvLT50eXBlKTsKLSAgaWYgKGluZm8tPnR5cGUgPT0gJ1UnIHx8IGluZm8tPnR5cGUgPT0gJ3cnKQotICAgIHByaW50ZiAoIiAgICAgICAgIik7Ci0gIGVsc2UKLSAgICBwcmludF92YWx1ZSAoaW5mby0+dmFsdWUpOwotICAvKiBQT1NJWC4yIHdhbnRzIHRoZSBzeW1ib2wgc2l6ZSBwcmludGVkIGhlcmUsIHdoZW4gYXBwbGljYWJsZTsKLSAgICAgQkZEIGN1cnJlbnRseSBkb2Vzbid0IHByb3ZpZGUgaXQsIHNvIHdlIHRha2UgdGhlIGVhc3kgd2F5IG91dCBieQotICAgICBjb25zaWRlcmluZyBpdCB0byBuZXZlciBiZSBhcHBsaWNhYmxlLiAgKi8KLX0KLQwKLXN0YXRpYyB2b2lkCi1wcmludF9zeW1kZWZfZW50cnkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3ltaW5kZXggaWR4ID0gQkZEX05PX01PUkVfU1lNQk9MUzsKLSAgY2Fyc3ltICp0aGVzeW07Ci0gIGJvb2xlYW4gZXZlcnByaW50ZWQgPSBmYWxzZTsKLQotICBmb3IgKGlkeCA9IGJmZF9nZXRfbmV4dF9tYXBlbnQgKGFiZmQsIGlkeCwgJnRoZXN5bSk7Ci0gICAgICAgaWR4ICE9IEJGRF9OT19NT1JFX1NZTUJPTFM7Ci0gICAgICAgaWR4ID0gYmZkX2dldF9uZXh0X21hcGVudCAoYWJmZCwgaWR4LCAmdGhlc3ltKSkKLSAgICB7Ci0gICAgICBiZmQgKmVsdDsKLSAgICAgIGlmICghZXZlcnByaW50ZWQpCi0JewotCSAgcHJpbnRmIChfKCJcbkFyY2hpdmUgaW5kZXg6XG4iKSk7Ci0JICBldmVycHJpbnRlZCA9IHRydWU7Ci0JfQotICAgICAgZWx0ID0gYmZkX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGlkeCk7Ci0gICAgICBpZiAoZWx0ID09IE5VTEwpCi0JYmZkX2ZhdGFsICgiYmZkX2dldF9lbHRfYXRfaW5kZXgiKTsKLSAgICAgIGlmICh0aGVzeW0tPm5hbWUgIT0gKGNoYXIgKikgTlVMTCkKLQl7Ci0JICBwcmludF9zeW1uYW1lICgiJXMiLCB0aGVzeW0tPm5hbWUsIGFiZmQpOwotCSAgcHJpbnRmICgiIGluICVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChlbHQpKTsKLQl9Ci0gICAgfQotfQotDAotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgcmVsb2NzIGZvciBhIHBhcnRpY3VsYXIgc2VjdGlvbi4KLSAgIEl0IGlzIGNhbGxlZCB2aWEgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWdldF9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YWFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YWFyZzsKLXsKLSAgc3RydWN0IGdldF9yZWxvY3NfaW5mbyAqZGF0YSA9IChzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvICopIGRhdGFhcmc7Ci0KLSAgKmRhdGEtPnNlY3MgPSBzZWM7Ci0KLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQotICAgIHsKLSAgICAgICpkYXRhLT5yZWxvY3MgPSBOVUxMOwotICAgICAgKmRhdGEtPnJlbGNvdW50ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIHJlbHNpemU7Ci0KLSAgICAgIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpOwotICAgICAgaWYgKHJlbHNpemUgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICAqZGF0YS0+cmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICAgICAgKmRhdGEtPnJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjLCAqZGF0YS0+cmVsb2NzLAotCQkJCQkJZGF0YS0+c3ltcyk7Ci0gICAgICBpZiAoKmRhdGEtPnJlbGNvdW50IDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci0KLSAgKytkYXRhLT5zZWNzOwotICArK2RhdGEtPnJlbG9jczsKLSAgKytkYXRhLT5yZWxjb3VudDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25vdC1yYW5saWIuYyBiL2JpbnV0aWxzL25vdC1yYW5saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiOWNlYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9ub3QtcmFubGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIGFyLm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBpcyAnYXInIChub3QgJ3JhbmxpYicpLiAqLwotCi1pbnQgaXNfcmFubGliID0gMDsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25vdC1zdHJpcC5jIGIvYmludXRpbHMvbm90LXN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDkzY2UuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbm90LXN0cmlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIG9iamNvcHkubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGlzICdvYmpjb3B5JyAobm90Ci0gICAnc3RyaXAnKS4gKi8KLQotaW50IGlzX3N0cmlwID0gMDsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL29iamNvcHkuMSBiL2JpbnV0aWxzL29iamNvcHkuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmYTI5Ni4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9vYmpjb3B5LjEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIG9iamNvcHkgMSAiMTk5OSIgIkN5Z251cyBTb2x1dGlvbnMiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotb2JqY29weSBcLSBjb3B5IGFuZCB0cmFuc2xhdGUgb2JqZWN0IGZpbGVzCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBvYmpjb3B5Ci0uUkIgIltcfCIgXC1GXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtdGFyZ2V0PVxmSWJmZG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1JXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtT1wgXGZJYmZkbmFtZVxmUlwgfFwgXGZCXC1cLW91dHB1dFwtdGFyZ2V0PVxmSWJmZG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1qXCBcZklzZWN0aW9ubmFtZVxmUlwgfFwgXGZCXC1cLW9ubHlcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWVcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVJcIFxmSXNlY3Rpb25uYW1lXGZSXCB8XCBcZkJcLVwtcmVtb3ZlXC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lXGZSICJcfF0iCi0uUkIgIltcfCIgXC1TXGZSXCB8XCBcZkJcLVwtc3RyaXBcLWFsbFxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLWdcZlJcIHxcIFxmQlwtXC1zdHJpcFwtZGVidWdcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1cLXN0cmlwXC11bm5lZWRlZFxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLUtcIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC1rZWVwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLU5cIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC1zdHJpcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1MXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwtbG9jYWxpemVcLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtV1wgXGZJc3ltYm9sbmFtZVxmUlwgfFwgXGZCXC1cLXdlYWtlblwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC14XGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtYWxsXGZSICJcfF0iIAotLlJCICJbXHwiIFwtWFxmUlwgfFwgXGZCXC1cLWRpc2NhcmRcLWxvY2Fsc1xmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLWJcIFxmSWJ5dGVcZlJcIHxcIFxmQlwtXC1ieXRlPVxmSWJ5dGVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1pXCBcZklpbnRlcmxlYXZlXGZSXCB8XCBcZkJcLVwtaW50ZXJsZWF2ZT1cZklpbnRlcmxlYXZlXGZSICJcfF0iIAotLlJCICJbXHwiIFwtcFxmUlwgfFwgXGZCXC1cLXByZXNlcnZlXC1kYXRlc1xmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtZGVidWdnaW5nICJcfF0iCi0uUkIgIltcfCIgXC1cLWdhcFwtZmlsbD1cZkl2YWxcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtcGFkXC10bz1cZklhZGRyZXNzXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXNldFwtc3RhcnQ9XGZJdmFsXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWNoYW5nZVwtc3RhcnQ9XGZJaW5jclxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLWFkZHJlc3Nlcz1cZklpbmNyXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWNoYW5nZVwtc2VjdGlvblwtYWRkcmVzcz1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXNlY3Rpb25cLWxtYT1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXNlY3Rpb25cLXZtYT1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXdhcm5pbmdzXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLW5vXC1jaGFuZ2VcLXdhcm5pbmdzXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXNldFwtc2VjdGlvblwtZmxhZ3M9XGZJc2VjdGlvbj1mbGFnc1xmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1hZGRcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWU9ZmlsZW5hbWVcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtY2hhbmdlXC1sZWFkaW5nXC1jaGFyXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXJlbW92ZVwtbGVhZGluZ1wtY2hhclxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC13ZWFrZW5cZlIgIlx8XSIKLS5SQiAiW1x8IiBcLXZcIHxcIFwtXC12ZXJib3NlXGZSICJcfF0iIAotLlJCICJbXHwiIFwtVlwgfFwgXC1cLXZlcnNpb25cZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1cLWhlbHBcZlIgIlx8XSIgCi0uQiBpbmZpbGUKLS5SQiAiW1x8IiBvdXRmaWxlXGZSICJcfF0iIAotLlNIIERFU0NSSVBUSU9OCi1UaGUgR05VIAotLkIgb2JqY29weQotdXRpbGl0eSBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGFuIG9iamVjdCBmaWxlIHRvIGFub3RoZXIuICAKLS5CIG9iamNvcHkgCi11c2VzIHRoZSBHTlUgQkZEIExpYnJhcnkgdG8gcmVhZCBhbmQgd3JpdGUgdGhlIG9iamVjdCBmaWxlcy4gIEl0IGNhbgotd3JpdGUgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmaWxlIGluIGEgZm9ybWF0IGRpZmZlcmVudCBmcm9tIHRoYXQgb2YKLXRoZSBzb3VyY2Ugb2JqZWN0IGZpbGUuICBUaGUgZXhhY3QgYmVoYXZpb3Igb2YgCi0uQiBvYmpjb3B5Ci1pcyBjb250cm9sbGVkIGJ5IGNvbW1hbmQtbGluZSBvcHRpb25zLgotLlBQCi0uQiBvYmpjb3B5Ci1jcmVhdGVzIHRlbXBvcmFyeSBmaWxlcyB0byBkbyBpdHMgdHJhbnNsYXRpb25zIGFuZCBkZWxldGVzIHRoZW0KLWFmdGVyd2FyZC4KLS5CIG9iamNvcHkKLXVzZXMgQkZEIHRvIGRvIGFsbCBpdHMgdHJhbnNsYXRpb24gd29yazsgaXQga25vd3MgYWJvdXQgYWxsIHRoZQotZm9ybWF0cyBCRkQga25vd3MgYWJvdXQsIGFuZCB0aHVzIGlzIGFibGUgdG8gcmVjb2duaXplIG1vc3QgZm9ybWF0cwotd2l0aG91dCBiZWluZyB0b2xkIGV4cGxpY2l0bHkuCi0uUFAKLS5CIG9iamNvcHkKLWNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFMtcmVjb3JkcyBieSB1c2luZyBhbiBvdXRwdXQgdGFyZ2V0IG9mCi0uQiBzcmVjCi0oZS5nLiwgdXNlCi0uQiAtTyBzcmVjKS4KLS5QUAotLkIgb2JqY29weQotY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSByYXcgYmluYXJ5IGZpbGUgYnkgdXNpbmcgYW4gb3V0cHV0IHRhcmdldCBvZgotLkIgYmluYXJ5Ci0oZS5nLiwgdXNlCi0uQiAtTyBiaW5hcnkpLgotV2hlbgotLkIgb2JqY29weQotZ2VuZXJhdGVzIGEgcmF3IGJpbmFyeSBmaWxlLCBpdCB3aWxsIGVzc2VudGlhbGx5IHByb2R1Y2UgYSBtZW1vcnkgZHVtcAotb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBvYmplY3QgZmlsZS4gIEFsbCBzeW1ib2xzIGFuZCByZWxvY2F0aW9uCi1pbmZvcm1hdGlvbiB3aWxsIGJlIGRpc2NhcmRlZC4gIFRoZSBtZW1vcnkgZHVtcCB3aWxsIHN0YXJ0IGF0IHRoZQotdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBsb3dlc3Qgc2VjdGlvbiBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuCi0uUFAKLVdoZW4gZ2VuZXJhdGluZyBhbiBTLXJlY29yZCBvciBhIHJhdyBiaW5hcnkgZmlsZSwgaXQgbWF5IGJlIGhlbHBmdWwgdG8KLXVzZQotLkIgLVMKLXRvIHJlbW92ZSBzZWN0aW9ucyBjb250YWluaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEluIHNvbWUgY2FzZXMKLS5CIC1SCi13aWxsIGJlIHVzZWZ1bCB0byByZW1vdmUgc2VjdGlvbnMgd2hpY2ggY29udGFpbiBpbmZvcm1hdGlvbiB3aGljaCBpcwotbm90IG5lZWRlZCBieSB0aGUgYmluYXJ5IGZpbGUuCi0uUFAKLS5JIGluZmlsZQotYW5kCi0uSSBvdXRmaWxlCi1hcmUgdGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZpbGVzIHJlc3BlY3RpdmVseS4gIElmIHlvdSBkbyBub3Qgc3BlY2lmeQotLklSIG91dGZpbGUgLAotLkIgb2JqY29weQotY3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIGFuZCBkZXN0cnVjdGl2ZWx5IHJlbmFtZXMgdGhlIHJlc3VsdCB3aXRoIHRoZQotbmFtZSBvZiB0aGUgaW5wdXQgZmlsZS4KLQotLlNIIE9QVElPTlMKLS5UUAotLkIgXC1JIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUKLUNvbnNpZGVyIHRoZSBzb3VyY2UgZmlsZSdzIG9iamVjdCBmb3JtYXQgdG8gYmUgCi0uSVIgYmZkbmFtZSAsCi1yYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGRlZHVjZSBpdC4KLS5UUAotLkIgXC1PIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lCi1Xcml0ZSB0aGUgb3V0cHV0IGZpbGUgdXNpbmcgdGhlIG9iamVjdCBmb3JtYXQgCi0uSVIgYmZkbmFtZSAuCi0uVFAKLS5CIFwtRiBcZkliZmRuYW1lXGZSLCBcZkJcLVwtdGFyZ2V0PVxmSWJmZG5hbWUKLVVzZSAKLS5JIGJmZG5hbWUKLWFzIHRoZSBvYmplY3QgZm9ybWF0IGZvciBib3RoIHRoZSBpbnB1dCBhbmQgdGhlIG91dHB1dCBmaWxlOyBpLmUuCi1zaW1wbHkgdHJhbnNmZXIgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aXRoIG5vIHRyYW5zbGF0aW9uLgotLlRQCi0uQiBcLWogXGZJc2VjdGlvbm5hbWVcZlIsIFxmQlwtXC1vbmx5XC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lCi1Db3B5IG9ubHkgdGhlIG5hbWVkIHNlY3Rpb24gZnJvbSB0aGUgaW5wdXQgZmlsZSB0byB0aGUgb3V0cHV0IGZpbGUsCi1kaXNjYXJkaW5nIGFsbCBvdGhlciBzZWN0aW9ucy4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4KLW9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24gaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZSBvdXRwdXQKLWZpbGUgdW51c2FibGUuCi0uVFAKLS5CIFwtUiBcZklzZWN0aW9ubmFtZVxmUiwgXGZCXC1cLXJlbW92ZS1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lCi1SZW1vdmUgdGhlIG5hbWVkIHNlY3Rpb24gZnJvbSB0aGUgZmlsZS4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlCi10aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24gaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZQotb3V0cHV0IGZpbGUgdW51c2FibGUuCi0uVFAKLS5CIFwtU1xmUiwgXGZCXC1cLXN0cmlwXC1hbGwKLURvIG5vdCBjb3B5IHJlbG9jYXRpb24gYW5kIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLS5UUAotLkIgXC1nXGZSLCBcZkJcLVwtc3RyaXBcLWRlYnVnCi1EbyBub3QgY29weSBkZWJ1Z2dpbmcgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLS5UUAotLkIgXC1cLXN0cmlwXC11bm5lZWRlZAotU3RyaXAgYWxsIHN5bWJvbHMgdGhhdCBhcmUgbm90IG5lZWRlZCBmb3IgcmVsb2NhdGlvbiBwcm9jZXNzaW5nLgotLlRQCi0uQiBcLUsgXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLWtlZXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lCi1Db3B5IG9ubHkgc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0uVFAKLS5CIFwtTiBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwtc3RyaXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lCi1EbyBub3QgY29weSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24KLW1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLS5UUAotLkIgXC1MIFxmSXN5bWJvbG5hbWVcZlIsIFxmQlwtXC1sb2NhbGl6ZVwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKLU1ha2Ugc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgbG9jYWwgdG8gdGhlIGZpbGUsIHNvIHRoYXQgaXQgaXMgbm90Ci12aXNpYmxlIGV4dGVybmFsbHkuICBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0uVFAKLS5CIFwtVyBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwtd2Vha2VuXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotTWFrZSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCB3ZWFrLiBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0uVFAKLS5CIFwteFxmUiwgXGZCIFwtXC1kaXNjYXJkXC1hbGwKLURvIG5vdCBjb3B5IG5vbi1nbG9iYWwgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLS5UUAotLkIgXC1YXGZSLCBcZkJcLVwtZGlzY2FyZFwtbG9jYWxzCi1EbyBub3QgY29weSBjb21waWxlci1nZW5lcmF0ZWQgbG9jYWwgc3ltYm9scy4gKFRoZXNlIHVzdWFsbHkgc3RhcnQKLXdpdGggIkwiIG9yICIuIikuCi0uVFAKLS5CIFwtYiBcZklieXRlXGZSLCBcZkJcLVwtYnl0ZT1cZklieXRlCi1LZWVwIG9ubHkgZXZlcnkgXGZJYnl0ZVxmUHRoIGJ5dGUgb2YgdGhlIGlucHV0IGZpbGUgKGhlYWRlciBkYXRhIGlzCi1ub3QgYWZmZWN0ZWQpLiAgXGZJYnl0ZVxmUCBjYW4gYmUgaW4gdGhlIHJhbmdlIGZyb20gMCB0byB0aGUKLWludGVybGVhdmUtMS4gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgZmlsZXMgdG8gcHJvZ3JhbQotUk9Ncy4gIEl0IGlzIHR5cGljYWxseSB1c2VkIHdpdGggYW4gc3JlYyBvdXRwdXQgdGFyZ2V0LgotLlRQCi0uQiBcLWkgXGZJaW50ZXJsZWF2ZVxmUiwgXGZCXC1cLWludGVybGVhdmU9XGZJaW50ZXJsZWF2ZQotT25seSBjb3B5IG9uZSBvdXQgb2YgZXZlcnkgXGZJaW50ZXJsZWF2ZVxmUCBieXRlcy4gIFdoaWNoIG9uZSB0byBjb3B5IGlzCi1zZWxlY3RlZCBieSB0aGUgXGZCXC1iXGZQIG9yIFxmQlwtXC1ieXRlXGZQIG9wdGlvbi4gIFRoZSBkZWZhdWx0IGlzIDQuCi1UaGUgaW50ZXJsZWF2ZSBpcyBpZ25vcmVkIGlmIG5laXRoZXIgXGZCXC1iXGZQIG5vciBcZkJcLVwtYnl0ZVxmUCBpcyBnaXZlbi4KLS5UUAotLkIgXC1wXGZSLCBcZkJcLVwtcHJlc2VydmVcLWRhdGVzCi1TZXQgdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGVzIG9mIHRoZSBvdXRwdXQgZmlsZSB0byBiZSB0aGUgc2FtZQotYXMgdGhvc2Ugb2YgdGhlIGlucHV0IGZpbGUuCi0uVFAKLS5CIFwtXC1kZWJ1Z2dpbmcKLUNvbnZlcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBpZiBwb3NzaWJsZS4gIFRoaXMgaXMgbm90IHRoZSBkZWZhdWx0Ci1iZWNhdXNlIG9ubHkgY2VydGFpbiBkZWJ1Z2dpbmcgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLCBhbmQgdGhlCi1jb252ZXJzaW9uIHByb2Nlc3MgY2FuIGJlIHRpbWUgY29uc3VtaW5nLgotLlRQCi0uQiBcLVwtZ2FwXC1maWxsPVxmSXZhbAotRmlsbCBnYXBzIGJldHdlZW4gc2VjdGlvbnMgd2l0aCBcZkl2YWxcZlAuICBUaGlzIG9wZXJhdGlvbiBhcHBsaWVzIHRvCi10aGUgXGZJbG9hZCBhZGRyZXNzXGZQIChMTUEpIG9mIHRoZSBzZWN0aW9ucy4gIEl0IGlzIGRvbmUgYnkgaW5jcmVhc2luZwotdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gd2l0aCB0aGUgbG93ZXIgYWRkcmVzcywgYW5kIGZpbGxpbmcgaW4gdGhlIGV4dHJhCi1zcGFjZSBjcmVhdGVkIHdpdGggXGZJdmFsXGZQLgotLlRQCi0uQiBcLVwtcGFkXC10bz1cZklhZGRyZXNzCi1QYWQgdGhlIG91dHB1dCBmaWxlIHVwIHRvIHRoZSBsb2FkIGFkZHJlc3MgXGZJYWRkcmVzc1xmUC4gIFRoaXMgaXMKLWRvbmUgYnkgaW5jcmVhc2luZyB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBzZWN0aW9uLiAgVGhlIGV4dHJhIHNwYWNlIGlzCi1maWxsZWQgaW4gd2l0aCB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IFxmQlwtXC1nYXBcLWZpbGxcZlAgKGRlZmF1bHQKLXplcm8pLgotLlRQCi0uQiBcZkJcLVwtc2V0XC1zdGFydD1cZkl2YWwKLVNldCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV3IGZpbGUgdG8gXGZJdmFsXGZQLiAgTm90IGFsbCBvYmplY3QKLWZpbGUgZm9ybWF0cyBzdXBwb3J0IHNldHRpbmcgdGhlIHN0YXJ0IGFkZHJlc3MuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLXN0YXJ0PVxmSWluY3JcZlIsIFxmQlwtXC1hZGp1c3RcLXN0YXJ0PVxmSWluY3IKLUNoYW5nZXMgdGhlIHN0YXJ0IGFkZHJlc3MgYnkgYWRkaW5nIFxmSWluY3JcZlAuICBOb3QgYWxsIG9iamVjdCBmaWxlCi1mb3JtYXRzIHN1cHBvcnQgc2V0dGluZyB0aGUgc3RhcnQgYWRkcmVzcy4KLS5UUAotLkIgXGZCXC1cLWNoYW5nZVwtYWRkcmVzc2VzPVxmSWluY3JcZlIsIFxmQlwtXC1hZGp1c3RcLXZtYT1cZklpbmNyCi1DaGFuZ2VzIHRoZSBhZGRyZXNzIG9mIGFsbCBzZWN0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3RhcnQgYWRkcmVzcywgYnkKLWFkZGluZyBcZklpbmNyXGZQLiAgU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIGRvIG5vdCBwZXJtaXQgc2VjdGlvbgotYWRkcmVzc2VzIHRvIGJlIGNoYW5nZWQgYXJiaXRyYXJpbHkuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCByZWxvY2F0ZQotdGhlIHNlY3Rpb25zOyBpZiB0aGUgcHJvZ3JhbSBleHBlY3RzIHNlY3Rpb25zIHRvIGJlIGxvYWRlZCBhdCBhCi1jZXJ0YWluIGFkZHJlc3MsIGFuZCB0aGlzIG9wdGlvbiBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc2VjdGlvbnMgc3VjaAotdGhhdCB0aGV5IGFyZSBsb2FkZWQgYXQgYSBkaWZmZXJlbnQgYWRkcmVzcywgdGhlIHByb2dyYW0gbWF5IGZhaWwuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLXNlY3Rpb25cLWFkZHJlc3M9XGZJc2VjdGlvbns9LCssLX12YWxcZlIsIFxmQlwtXC1hZGp1c3RcLXNlY3Rpb25cLXZtYT1cZklzZWN0aW9uez0sKywtfXZhbAotU2V0IG9yIGNoYW5nZXMgdGhlIFZNQSBhbmQgTE1BIGFkZHJlc3NlcyBvZiB0aGUgbmFtZWQgXGZJc2VjdGlvblxmUC4KLUlmIFxmST1cZlAgaXMgdXNlZCwgdGhlIHNlY3Rpb24gYWRkcmVzcyBpcyBzZXQgdG8gXGZJdmFsXGZQLgotT3RoZXJ3aXNlLCBcZkl2YWxcZlAgaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZCBmcm9tIHRoZSBzZWN0aW9uCi1hZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cyB1bmRlciBcZkJcLVwtY2hhbmdlXC1hZGRyZXNzZXNcZlAsIGFib3ZlLiAgSWYKLVxmSXNlY3Rpb25cZlAgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGlucHV0IGZpbGUsIGEgd2FybmluZyB3aWxsIGJlCi1pc3N1ZWQsIHVubGVzcyBcZkJcLVwtbm9cLWNoYW5nZVwtd2FybmluZ3NcZlAgaXMgdXNlZC4KLS5UUAotLkIgXGZCXC1cLWNoYW5nZVwtc2VjdGlvblwtbG1hPVxmSXNlY3Rpb257PSwrLC19dmFsCi1TZXQgb3IgY2hhbmdlIHRoZSBMTUEgYWRkcmVzcyBvZiB0aGUgbmFtZWQgXGZJc2VjdGlvblxmUC4gIElmIFxmST1cZlAgaXMKLXVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvIFxmSXZhbFxmUC4gIE90aGVyd2lzZSwgXGZJdmFsXGZQCi1pcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlIHNlY3Rpb24gYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMKLXVuZGVyIFxmQlwtXC1jaGFuZ2VcLWFkZHJlc3Nlc1xmUCwgYWJvdmUuICBJZiBcZklzZWN0aW9uXGZQIGRvZXMgbm90IGV4aXN0Ci1pbiB0aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkLCB1bmxlc3MKLVxmQlwtXC1ub1wtY2hhbmdlXC13YXJuaW5nc1xmUCBpcyB1c2VkLgotLlRQCi0uQiBcZkJcLVwtY2hhbmdlXC1zZWN0aW9uXC12bWE9XGZJc2VjdGlvbns9LCssLX12YWwKLVNldCBvciBjaGFuZ2UgdGhlIFZNQSBhZGRyZXNzIG9mIHRoZSBuYW1lZCBcZklzZWN0aW9uXGZQLiAgSWYgXGZJPVxmUCBpcwotdXNlZCwgdGhlIHNlY3Rpb24gYWRkcmVzcyBpcyBzZXQgdG8gXGZJdmFsXGZQLiAgT3RoZXJ3aXNlLCBcZkl2YWxcZlAKLWlzIGFkZGVkIHRvIG9yIHN1YnRyYWN0ZWQgZnJvbSB0aGUgc2VjdGlvbiBhZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cwotdW5kZXIgXGZCXC1cLWNoYW5nZVwtYWRkcmVzc2VzXGZQLCBhYm92ZS4gIElmIFxmSXNlY3Rpb25cZlAgZG9lcyBub3QgZXhpc3QKLWluIHRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQsIHVubGVzcwotXGZCXC1cLW5vXC1jaGFuZ2VcLXdhcm5pbmdzXGZQIGlzIHVzZWQuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLXdhcm5pbmdzXGZSLCBcZkJcLVwtYWRqdXN0XC13YXJuaW5ncwotSWYgXGZCXC1cLWNoYW5nZVwtc2VjdGlvblwtWFhYXGZQIGlzIHVzZWQsIGFuZCB0aGUgbmFtZWQgc2VjdGlvbiBkb2VzCi1ub3QgZXhpc3QsIGlzc3VlIGEgd2FybmluZy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCi0uVFAKLS5CIFxmQlwtXC1ub1wtY2hhbmdlXC13YXJuaW5nc1xmUiwgXGZCXC1cLW5vXC1hZGp1c3RcLXdhcm5pbmdzCi1EbyBub3QgaXNzdWUgYSB3YXJuaW5nIGlmIFxmQlwtXC1jaGFuZ2VcLXNlY3Rpb25cLVhYWFxmUCBpcyB1c2VkLCBldmVuCi1pZiB0aGUgbmFtZWQgc2VjdGlvbiBkb2VzIG5vdCBleGlzdC4KLS5UUAotLkIgXGZCXC1cLXNldFwtc2VjdGlvblwtZmxhZ3M9XGZJc2VjdGlvbj1mbGFncwotU2V0IHRoZSBmbGFncyBmb3IgdGhlIG5hbWVkIHNlY3Rpb24uICBUaGUgXGZJZmxhZ3NcZlAgYXJndW1lbnQgaXMgYQotY29tbWEgc2VwYXJhdGVkIHN0cmluZyBvZiBmbGFnIG5hbWVzLiAgVGhlIHJlY29nbml6ZWQgbmFtZXMgYXJlCi1cZklhbGxvY1xmUCwgXGZJY29udGVudHNcZlAsIFxmSWxvYWRcZlAsIFxmSW5vbG9hZFxmUCwgXGZJcmVhZG9ubHlcZlAsCi1cZkljb2RlXGZQLCBcZklkYXRhXGZQLCBcZklyb21cZlAsIFxmSXNoYXJlXGZQLCBhbmQgXGZJZGVidWdcZlAuICBOb3QKLWFsbCBmbGFncyBhcmUgbWVhbmluZ2Z1bCBmb3IgYWxsIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0uVFAKLS5CIFxmQlwtXC1hZGRcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWU9ZmlsZW5hbWUKLUFkZCBhIG5ldyBzZWN0aW9uIG5hbWVkIFxmSXNlY3Rpb25uYW1lXGZSIHdoaWxlIGNvcHlpbmcgdGhlIGZpbGUuICBUaGUKLWNvbnRlbnRzIG9mIHRoZSBuZXcgc2VjdGlvbiBhcmUgdGFrZW4gZnJvbSB0aGUgZmlsZSBcZklmaWxlbmFtZVxmUi4KLVRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIHdpbGwgYmUgdGhlIHNpemUgb2YgdGhlIGZpbGUuICBUaGlzIG9wdGlvbgotb25seSB3b3JrcyBvbiBmaWxlIGZvcm1hdHMgd2hpY2ggY2FuIHN1cHBvcnQgc2VjdGlvbnMgd2l0aCBhcmJpdHJhcnkKLW5hbWVzLgotLlRQCi0uQiBcLVwtY2hhbmdlXC1sZWFkaW5nXC1jaGFyCi1Tb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgdXNlIHNwZWNpYWwgY2hhcmFjdGVycyBhdCB0aGUgc3RhcnQgb2YKLXN5bWJvbHMuICBUaGUgbW9zdCBjb21tb24gc3VjaCBjaGFyYWN0ZXIgaXMgdW5kZXJzY29yZSwgd2hpY2ggY29tcGlsZXJzCi1vZnRlbiBhZGQgYmVmb3JlIGV2ZXJ5IHN5bWJvbC4gIFRoaXMgb3B0aW9uIHRlbGxzIAotLkIgb2JqY29weQotdG8gY2hhbmdlIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBvZiBldmVyeSBzeW1ib2wgd2hlbiBpdCBjb252ZXJ0cwotYmV0d2VlbiBvYmplY3QgZmlsZSBmb3JtYXRzLiAgSWYgdGhlIG9iamVjdCBmaWxlIGZvcm1hdHMgdXNlIHRoZSBzYW1lCi1sZWFkaW5nIGNoYXJhY3RlciwgdGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdC4gIE90aGVyd2lzZSwgaXQgd2lsbCBhZGQKLWEgY2hhcmFjdGVyLCBvciByZW1vdmUgYSBjaGFyYWN0ZXIsIG9yIGNoYW5nZSBhIGNoYXJhY3RlciwgYXMKLWFwcHJvcHJpYXRlLgotLlRQCi0uQiBcLVwtcmVtb3ZlXC1sZWFkaW5nXC1jaGFyCi1JZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgZ2xvYmFsIHN5bWJvbCBpcyBhIHNwZWNpYWwgc3ltYm9sIGxlYWRpbmcKLWNoYXJhY3RlciB1c2VkIGJ5IHRoZSBvYmplY3QgZmlsZSBmb3JtYXQsIHJlbW92ZSB0aGUgY2hhcmFjdGVyLiAgVGhlCi1tb3N0IGNvbW1vbiBzeW1ib2wgbGVhZGluZyBjaGFyYWN0ZXIgaXMgdW5kZXJzY29yZS4gIFRoaXMgb3B0aW9uIHdpbGwKLXJlbW92ZSBhIGxlYWRpbmcgdW5kZXJzY29yZSBmcm9tIGFsbCBnbG9iYWwgc3ltYm9scy4gIFRoaXMgY2FuIGJlCi11c2VmdWwgaWYgeW91IHdhbnQgdG8gbGluayB0b2dldGhlciBvYmplY3RzIG9mIGRpZmZlcmVudCBmaWxlIGZvcm1hdHMKLXdpdGggZGlmZmVyZW50IGNvbnZlbnRpb25zIGZvciBzeW1ib2wgbmFtZXMuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tCi1cZkJcLVwtY2hhbmdlXC1sZWFkaW5nXC1jaGFyXGZQIGJlY2F1c2UgaXQgYWx3YXlzIGNoYW5nZXMgdGhlIHN5bWJvbCBuYW1lCi13aGVuIGFwcHJvcHJpYXRlLCByZWdhcmRsZXNzIG9mIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgb2YgdGhlIG91dHB1dAotLlRQCi0uQiBcLVwtd2Vha2VuCi1DaGFuZ2UgYWxsIGdsb2JhbCBzeW1ib2xzIGluIHRoZSBmaWxlIHRvIGJlIHdlYWsuCi0uVFAKLS5CIFwtdlxmUiwgXGZCXC1cLXZlcmJvc2UKLVZlcmJvc2Ugb3V0cHV0OiBsaXN0IGFsbCBvYmplY3QgZmlsZXMgbW9kaWZpZWQuICBJbiB0aGUgY2FzZSBvZgotYXJjaGl2ZXMsICJcZkJvYmpjb3B5IFwtVlxmUiIgbGlzdHMgYWxsIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUuCi0uVFAKLS5CIFwtVlxmUiwgXGZCXC1cLXZlcnNpb24KLVNob3cgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQiBvYmpjb3B5Ci1hbmQgZXhpdC4KLS5UUAotLkIgXC1cLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCi0uQiBvYmpjb3B5Ci1hbmQgZXhpdC4KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIgCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoSnVuZSAxOTkzKS4KLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9vYmpjb3B5LmMgYi9iaW51dGlscy9vYmpjb3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YjEyZTcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvb2JqY29weS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjExMCArMCwwIEBACi0vKiBvYmpjb3B5LmMgLS0gY29weSBvYmplY3QgZmlsZSBmcm9tIGlucHV0IHRvIG91dHB1dCwgb3B0aW9uYWxseSBtYXNzYWdpbmcgaXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJwcm9ncmVzcy5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotLyogQSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwbGljaXRseSBzdHJpcCBvdXQsIG9yIHRvIGtlZXAuICBBIGxpbmtlZAotICAgbGlzdCBpcyBnb29kIGVub3VnaCBmb3IgYSBzbWFsbCBudW1iZXIgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBidXQKLSAgIHRoaXMgd2lsbCBzbG93IHRoaW5ncyBkb3duIGEgbG90IGlmIG1hbnkgc3ltYm9scyBhcmUgYmVpbmcKLSAgIGRlbGV0ZWQuICovCi0KLXN0cnVjdCBzeW1saXN0Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBzeW1saXN0ICpuZXh0OwotfTsKLQotc3RhdGljIHZvaWQgY29weV91c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgc3RyaXBfdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyBmbGFnd29yZCBwYXJzZV9mbGFncyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpmaW5kX3NlY3Rpb25fbGlzdCBQQVJBTVMgKChjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIHNldHVwX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgY29weV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGdldF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgaW50IGNvbXBhcmVfc2VjdGlvbl9sbWEgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGFkZF9zcGVjaWZpY19zeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3ltbGlzdCAqKikpOwotc3RhdGljIGJvb2xlYW4gaXNfc3BlY2lmaWVkX3N5bWJvbCBQQVJBTVMgKChjb25zdCBjaGFyICosIHN0cnVjdCBzeW1saXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGlzX3N0cmlwX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZmlsdGVyX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqLCBhc3ltYm9sICoqLCBhc3ltYm9sICoqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBmaWx0ZXJfYnl0ZXMgUEFSQU1TICgoY2hhciAqLCBiZmRfc2l6ZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHdyaXRlX2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGxvbmcgKiwgYXN5bWJvbCAqKiopKTsKLXN0YXRpYyB2b2lkIGNvcHlfb2JqZWN0IFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgY29weV9hcmNoaXZlIFBBUkFNUyAoKGJmZCAqLCBiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBjb3B5X2ZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IHN0cmlwX21haW4gUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGNvcHlfbWFpbiBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLQotI2RlZmluZSBSRVRVUk5fTk9ORkFUQUwocykge2JmZF9ub25mYXRhbCAocyk7IHN0YXR1cyA9IDE7IHJldHVybjt9Ci0KLXN0YXRpYyBhc3ltYm9sICoqaXN5bXBwID0gTlVMTDsJLyogSW5wdXQgc3ltYm9scyAqLwotc3RhdGljIGFzeW1ib2wgKipvc3ltcHAgPSBOVUxMOwkvKiBPdXRwdXQgc3ltYm9scyB0aGF0IHN1cnZpdmUgc3RyaXBwaW5nICovCi0KLS8qIElmIGBjb3B5X2J5dGUnID49IDAsIGNvcHkgb25seSB0aGF0IGJ5dGUgb2YgZXZlcnkgYGludGVybGVhdmUnIGJ5dGVzLiAgKi8KLXN0YXRpYyBpbnQgY29weV9ieXRlID0gLTE7Ci1zdGF0aWMgaW50IGludGVybGVhdmUgPSA0OwotCi1zdGF0aWMgYm9vbGVhbiB2ZXJib3NlOwkJLyogUHJpbnQgZmlsZSBhbmQgdGFyZ2V0IG5hbWVzLiAqLwotc3RhdGljIGJvb2xlYW4gcHJlc2VydmVfZGF0ZXM7CS8qIFByZXNlcnZlIGlucHV0IGZpbGUgdGltZXN0YW1wLiAgKi8KLXN0YXRpYyBpbnQgc3RhdHVzID0gMDsJCS8qIEV4aXQgc3RhdHVzLiAgKi8KLQotZW51bSBzdHJpcF9hY3Rpb24KLSAgewotICAgIFNUUklQX1VOREVGLAotICAgIFNUUklQX05PTkUsCQkJLyogZG9uJ3Qgc3RyaXAgKi8KLSAgICBTVFJJUF9ERUJVRywJCS8qIHN0cmlwIGFsbCBkZWJ1Z2dlciBzeW1ib2xzICovCi0gICAgU1RSSVBfVU5ORUVERUQsCQkvKiBzdHJpcCB1bm5lY2Vzc2FyeSBzeW1ib2xzICovCi0gICAgU1RSSVBfQUxMCQkJLyogc3RyaXAgYWxsIHN5bWJvbHMgKi8KLSAgfTsKLQotLyogV2hpY2ggc3ltYm9scyB0byByZW1vdmUuICovCi1zdGF0aWMgZW51bSBzdHJpcF9hY3Rpb24gc3RyaXBfc3ltYm9sczsKLQotZW51bSBsb2NhbHNfYWN0aW9uCi0gIHsKLSAgICBMT0NBTFNfVU5ERUYsCi0gICAgTE9DQUxTX1NUQVJUX0wsCQkvKiBkaXNjYXJkIGxvY2FscyBzdGFydGluZyB3aXRoIEwgKi8KLSAgICBMT0NBTFNfQUxMCQkJLyogZGlzY2FyZCBhbGwgbG9jYWxzICovCi0gIH07Ci0KLS8qIFdoaWNoIGxvY2FsIHN5bWJvbHMgdG8gcmVtb3ZlLiAgT3ZlcnJpZGVzIFNUUklQX0FMTC4gICovCi1zdGF0aWMgZW51bSBsb2NhbHNfYWN0aW9uIGRpc2NhcmRfbG9jYWxzOwotCi0vKiBXaGF0IGtpbmQgb2YgY2hhbmdlIHRvIHBlcmZvcm0uICAqLwotZW51bSBjaGFuZ2VfYWN0aW9uCi17Ci0gIENIQU5HRV9JR05PUkUsCi0gIENIQU5HRV9NT0RJRlksCi0gIENIQU5HRV9TRVQKLX07Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgbGlzdHMgb2Ygc2VjdGlvbnMgYW5kIGFjdGlvbnMgdG8gdGFrZS4gICovCi1zdHJ1Y3Qgc2VjdGlvbl9saXN0Ci17Ci0gIHN0cnVjdCBzZWN0aW9uX2xpc3QgKiBuZXh0OyAgICAgIC8qIE5leHQgc2VjdGlvbiB0byBjaGFuZ2UuICAqLwotICBjb25zdCBjaGFyICogICAgICAgICAgbmFtZTsgICAgICAvKiBTZWN0aW9uIG5hbWUuICAqLwotICBib29sZWFuICAgICAgICAgICAgICAgdXNlZDsgICAgICAvKiBXaGV0aGVyIHRoaXMgZW50cnkgd2FzIHVzZWQuICAqLwotICBib29sZWFuICAgICAgICAgICAgICAgcmVtb3ZlOyAgICAvKiBXaGV0aGVyIHRvIHJlbW92ZSB0aGlzIHNlY3Rpb24uICAqLwotICBib29sZWFuCQljb3B5OyAgICAgIC8qIFdoZXRoZXIgdG8gY29weSB0aGlzIHNlY3Rpb24uICAqLwotICBlbnVtIGNoYW5nZV9hY3Rpb24gICAgY2hhbmdlX3ZtYTsvKiBXaGV0aGVyIHRvIGNoYW5nZSBvciBzZXQgVk1BLiAgKi8KLSAgYmZkX3ZtYSAJCXZtYV92YWw7ICAgLyogQW1vdW50IHRvIGNoYW5nZSBieSBvciBzZXQgdG8uICAqLwotICBlbnVtIGNoYW5nZV9hY3Rpb24gICAgY2hhbmdlX2xtYTsvKiBXaGV0aGVyIHRvIGNoYW5nZSBvciBzZXQgTE1BLiAgKi8KLSAgYmZkX3ZtYSAJCWxtYV92YWw7ICAgLyogQW1vdW50IHRvIGNoYW5nZSBieSBvciBzZXQgdG8uICAqLwotICBib29sZWFuIAkJc2V0X2ZsYWdzOyAvKiBXaGV0aGVyIHRvIHNldCB0aGUgc2VjdGlvbiBmbGFncy4gICovCi0gIGZsYWd3b3JkIAkJZmxhZ3M7ICAgICAvKiBXaGF0IHRvIHNldCB0aGUgc2VjdGlvbiBmbGFncyB0by4gICovCi19OwotCi1zdGF0aWMgc3RydWN0IHNlY3Rpb25fbGlzdCAqY2hhbmdlX3NlY3Rpb25zOwotc3RhdGljIGJvb2xlYW4gc2VjdGlvbnNfcmVtb3ZlZDsKLXN0YXRpYyBib29sZWFuIHNlY3Rpb25zX2NvcGllZDsKLQotLyogQ2hhbmdlcyB0byB0aGUgc3RhcnQgYWRkcmVzcy4gICovCi1zdGF0aWMgYmZkX3ZtYSBjaGFuZ2Vfc3RhcnQgPSAwOwotc3RhdGljIGJvb2xlYW4gc2V0X3N0YXJ0X3NldCA9IGZhbHNlOwotc3RhdGljIGJmZF92bWEgc2V0X3N0YXJ0OwotCi0vKiBDaGFuZ2VzIHRvIHNlY3Rpb24gYWRkcmVzc2VzLiAgKi8KLXN0YXRpYyBiZmRfdm1hIGNoYW5nZV9zZWN0aW9uX2FkZHJlc3MgPSAwOwotCi0vKiBGaWxsaW5nIGdhcHMgYmV0d2VlbiBzZWN0aW9ucy4gICovCi1zdGF0aWMgYm9vbGVhbiBnYXBfZmlsbF9zZXQgPSBmYWxzZTsKLXN0YXRpYyBiZmRfYnl0ZSBnYXBfZmlsbCA9IDA7Ci0KLS8qIFBhZCB0byBhIGdpdmVuIGFkZHJlc3MuICAqLwotc3RhdGljIGJvb2xlYW4gcGFkX3RvX3NldCA9IGZhbHNlOwotc3RhdGljIGJmZF92bWEgcGFkX3RvOwotCi0vKiBMaXN0IG9mIHNlY3Rpb25zIHRvIGFkZC4gICovCi0KLXN0cnVjdCBzZWN0aW9uX2FkZAotewotICAvKiBOZXh0IHNlY3Rpb24gdG8gYWRkLiAgKi8KLSAgc3RydWN0IHNlY3Rpb25fYWRkICpuZXh0OwotICAvKiBOYW1lIG9mIHNlY3Rpb24gdG8gYWRkLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogTmFtZSBvZiBmaWxlIGhvbGRpbmcgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAvKiBTaXplIG9mIGZpbGUuICAqLwotICBzaXplX3Qgc2l6ZTsKLSAgLyogQ29udGVudHMgb2YgZmlsZS4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQkZEIHNlY3Rpb24sIGFmdGVyIGl0IGhhcyBiZWVuIGFkZGVkLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci19OwotCi1zdGF0aWMgc3RydWN0IHNlY3Rpb25fYWRkICphZGRfc2VjdGlvbnM7Ci0KLS8qIFdoZXRoZXIgdG8gY29udmVydCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb252ZXJ0X2RlYnVnZ2luZyA9IGZhbHNlOwotCi0vKiBXaGV0aGVyIHRvIGNoYW5nZSB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaW4gc3ltYm9sIG5hbWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY2hhbmdlX2xlYWRpbmdfY2hhciA9IGZhbHNlOwotCi0vKiBXaGV0aGVyIHRvIHJlbW92ZSB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgZnJvbSBnbG9iYWwgc3ltYm9sIG5hbWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gcmVtb3ZlX2xlYWRpbmdfY2hhciA9IGZhbHNlOwotCi0vKiBMaXN0IG9mIHN5bWJvbHMgdG8gc3RyaXAsIGtlZXAsIGxvY2FsaXplLCBhbmQgd2Vha2VuLiAgKi8KLQotc3RhdGljIHN0cnVjdCBzeW1saXN0ICpzdHJpcF9zcGVjaWZpY19saXN0ID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3Qgc3ltbGlzdCAqa2VlcF9zcGVjaWZpY19saXN0ID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3Qgc3ltbGlzdCAqbG9jYWxpemVfc3BlY2lmaWNfbGlzdCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IHN5bWxpc3QgKndlYWtlbl9zcGVjaWZpY19saXN0ID0gTlVMTDsKLQotLyogSWYgdGhpcyBpcyB0cnVlLCB3ZSB3ZWFrZW4gZ2xvYmFsIHN5bWJvbHMgKHNldCBCU0ZfV0VBSykuICAqLwotCi1zdGF0aWMgYm9vbGVhbiB3ZWFrZW4gPSBmYWxzZTsKLQotLyogMTUwIGlzbid0IHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotCi0jZGVmaW5lIE9QVElPTl9BRERfU0VDVElPTiAxNTAKLSNkZWZpbmUgT1BUSU9OX0NIQU5HRV9BRERSRVNTRVMgKE9QVElPTl9BRERfU0VDVElPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSIChPUFRJT05fQ0hBTkdFX0FERFJFU1NFUyArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfU1RBUlQgKE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1MgKE9QVElPTl9DSEFOR0VfU1RBUlQgKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BIChPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTUyArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUEgKE9QVElPTl9DSEFOR0VfU0VDVElPTl9MTUEgKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX1dBUk5JTkdTIChPUFRJT05fQ0hBTkdFX1NFQ1RJT05fVk1BICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RFQlVHR0lORyAoT1BUSU9OX0NIQU5HRV9XQVJOSU5HUyArIDEpCi0jZGVmaW5lIE9QVElPTl9HQVBfRklMTCAoT1BUSU9OX0RFQlVHR0lORyArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19DSEFOR0VfV0FSTklOR1MgKE9QVElPTl9HQVBfRklMTCArIDEpCi0jZGVmaW5lIE9QVElPTl9QQURfVE8gKE9QVElPTl9OT19DSEFOR0VfV0FSTklOR1MgKyAxKQotI2RlZmluZSBPUFRJT05fUkVNT1ZFX0xFQURJTkdfQ0hBUiAoT1BUSU9OX1BBRF9UTyArIDEpCi0jZGVmaW5lIE9QVElPTl9TRVRfU0VDVElPTl9GTEFHUyAoT1BUSU9OX1JFTU9WRV9MRUFESU5HX0NIQVIgKyAxKQotI2RlZmluZSBPUFRJT05fU0VUX1NUQVJUIChPUFRJT05fU0VUX1NFQ1RJT05fRkxBR1MgKyAxKQotI2RlZmluZSBPUFRJT05fU1RSSVBfVU5ORUVERUQgKE9QVElPTl9TRVRfU1RBUlQgKyAxKQotI2RlZmluZSBPUFRJT05fV0VBS0VOIChPUFRJT05fU1RSSVBfVU5ORUVERUQgKyAxKQotCi0vKiBPcHRpb25zIHRvIGhhbmRsZSBpZiBydW5uaW5nIGFzICJzdHJpcCIuICAqLwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBzdHJpcF9vcHRpb25zW10gPQotewotICB7ImRpc2NhcmQtYWxsIiwgbm9fYXJndW1lbnQsIDAsICd4J30sCi0gIHsiZGlzY2FyZC1sb2NhbHMiLCBub19hcmd1bWVudCwgMCwgJ1gnfSwKLSAgeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnfSwgLyogT2Jzb2xldGUgKi8KLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gIHsiaW5wdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sIC8qIE9ic29sZXRlICovCi0gIHsiaW5wdXQtdGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCi0gIHsia2VlcC1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0snfSwKLSAgeyJvdXRwdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCS8qIE9ic29sZXRlICovCi0gIHsib3V0cHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTyd9LAotICB7InByZXNlcnZlLWRhdGVzIiwgbm9fYXJndW1lbnQsIDAsICdwJ30sCi0gIHsicmVtb3ZlLXNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1InfSwKLSAgeyJzdHJpcC1hbGwiLCBub19hcmd1bWVudCwgMCwgJ3MnfSwKLSAgeyJzdHJpcC1kZWJ1ZyIsIG5vX2FyZ3VtZW50LCAwLCAnUyd9LAotICB7InN0cmlwLXVubmVlZGVkIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9TVFJJUF9VTk5FRURFRH0sCi0gIHsic3RyaXAtc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdOJ30sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCAwLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotLyogT3B0aW9ucyB0byBoYW5kbGUgaWYgcnVubmluZyBhcyAib2JqY29weSIuICAqLwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBjb3B5X29wdGlvbnNbXSA9Ci17Ci0gIHsiYWRkLXNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0FERF9TRUNUSU9OfSwKLSAgeyJhZGp1c3Qtc3RhcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9TVEFSVH0sCi0gIHsiYWRqdXN0LXZtYSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX0FERFJFU1NFU30sCi0gIHsiYWRqdXN0LXNlY3Rpb24tdm1hIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTfSwKLSAgeyJhZGp1c3Qtd2FybmluZ3MiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9XQVJOSU5HU30sCi0gIHsiYnl0ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnYid9LAotICB7ImNoYW5nZS1hZGRyZXNzZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9BRERSRVNTRVN9LAotICB7ImNoYW5nZS1sZWFkaW5nLWNoYXIiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9MRUFESU5HX0NIQVJ9LAotICB7ImNoYW5nZS1zZWN0aW9uLWFkZHJlc3MiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1N9LAotICB7ImNoYW5nZS1zZWN0aW9uLWxtYSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BfSwKLSAgeyJjaGFuZ2Utc2VjdGlvbi12bWEiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQX0sCi0gIHsiY2hhbmdlLXN0YXJ0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU1RBUlR9LAotICB7ImNoYW5nZS13YXJuaW5ncyIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1dBUk5JTkdTfSwKLSAgeyJkZWJ1Z2dpbmciLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0RFQlVHR0lOR30sCi0gIHsiZGlzY2FyZC1hbGwiLCBub19hcmd1bWVudCwgMCwgJ3gnfSwKLSAgeyJkaXNjYXJkLWxvY2FscyIsIG5vX2FyZ3VtZW50LCAwLCAnWCd9LAotICB7Im9ubHktc2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnaid9LAotICB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LCAvKiBPYnNvbGV0ZSAqLwotICB7ImdhcC1maWxsIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9HQVBfRklMTH0sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7ImlucHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LCAvKiBPYnNvbGV0ZSAqLwotICB7ImlucHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LAotICB7ImludGVybGVhdmUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2knfSwKLSAgeyJrZWVwLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSyd9LAotICB7Im5vLWFkanVzdC13YXJuaW5ncyIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fTk9fQ0hBTkdFX1dBUk5JTkdTfSwKLSAgeyJuby1jaGFuZ2Utd2FybmluZ3MiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX05PX0NIQU5HRV9XQVJOSU5HU30sCi0gIHsib3V0cHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTyd9LAkvKiBPYnNvbGV0ZSAqLwotICB7Im91dHB1dC10YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwKLSAgeyJwYWQtdG8iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX1BBRF9UT30sCi0gIHsicHJlc2VydmUtZGF0ZXMiLCBub19hcmd1bWVudCwgMCwgJ3AnfSwKLSAgeyJsb2NhbGl6ZS1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0wnfSwKLSAgeyJyZW1vdmUtbGVhZGluZy1jaGFyIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9SRU1PVkVfTEVBRElOR19DSEFSfSwKLSAgeyJyZW1vdmUtc2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUid9LAotICB7InNldC1zZWN0aW9uLWZsYWdzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9TRVRfU0VDVElPTl9GTEFHU30sCi0gIHsic2V0LXN0YXJ0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9TRVRfU1RBUlR9LAotICB7InN0cmlwLWFsbCIsIG5vX2FyZ3VtZW50LCAwLCAnUyd9LAotICB7InN0cmlwLWRlYnVnIiwgbm9fYXJndW1lbnQsIDAsICdnJ30sCi0gIHsic3RyaXAtdW5uZWVkZWQiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1NUUklQX1VOTkVFREVEfSwKLSAgeyJzdHJpcC1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ04nfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnfSwKLSAgeyJ2ZXJib3NlIiwgbm9fYXJndW1lbnQsIDAsICd2J30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICB7IndlYWtlbiIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fV0VBS0VOfSwKLSAgeyJ3ZWFrZW4tc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdXJ30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLS8qIElNUE9SVFMgKi8KLWV4dGVybiBjaGFyICpwcm9ncmFtX25hbWU7Ci0KLS8qIFRoaXMgZmxhZyBkaXN0aW5ndWlzaGVzIGJldHdlZW4gc3RyaXAgYW5kIG9iamNvcHk6Ci0gICAxIG1lYW5zIHRoaXMgaXMgJ3N0cmlwJzsgMCBtZWFucyB0aGlzIGlzICdvYmpjb3B5Jy4KLSAgIC0xIG1lYW5zIGlmIHdlIHNob3VsZCB1c2UgYXJndlswXSB0byBkZWNpZGUuICovCi1leHRlcm4gaW50IGlzX3N0cmlwOwotCi0KLXN0YXRpYyB2b2lkCi1jb3B5X3VzYWdlIChzdHJlYW0sIGV4aXRfc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBleGl0X3N0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJVc2FnZTogJXMgPHN3aXRjaGVzPiBpbi1maWxlIFtvdXQtZmlsZV1cbiIpLCBwcm9ncmFtX25hbWUpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiBUaGUgc3dpdGNoZXMgYXJlOlxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLUkgLS1pbnB1dC10YXJnZXQgPGJmZG5hbWU+ICAgICAgQXNzdW1lIGlucHV0IGZpbGUgaXMgaW4gZm9ybWF0IDxiZmRuYW1lPlxuXAotICAtTyAtLW91dHB1dC10YXJnZXQgPGJmZG5hbWU+ICAgICBDcmVhdGUgYW4gb3V0cHV0IGZpbGUgaW4gZm9ybWF0IDxiZmRuYW1lPlxuXAotICAtRiAtLXRhcmdldCA8YmZkbmFtZT4gICAgICAgICAgICBTZXQgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGZvcm1hdCB0byA8YmZkbmFtZT5cblwKLSAgICAgLS1kZWJ1Z2dpbmcgICAgICAgICAgICAgICAgICAgQ29udmVydCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGlmIHBvc3NpYmxlXG5cCi0gIC1wIC0tcHJlc2VydmUtZGF0ZXMgICAgICAgICAgICAgIENvcHkgbW9kaWZpZWQvYWNjZXNzIHRpbWVzdGFtcHMgdG8gdGhlIG91dHB1dFxuXAotICAtaiAtLW9ubHktc2VjdGlvbiA8bmFtZT4gICAgICAgICBPbmx5IGNvcHkgc2VjdGlvbiA8bmFtZT4gaW50byB0aGUgb3V0cHV0XG5cCi0gIC1SIC0tcmVtb3ZlLXNlY3Rpb24gPG5hbWU+ICAgICAgIFJlbW92ZSBzZWN0aW9uIDxuYW1lPiBmcm9tIHRoZSBvdXRwdXRcblwKLSAgLVMgLS1zdHJpcC1hbGwgICAgICAgICAgICAgICAgICAgUmVtb3ZlIGFsbCBzeW1ib2wgYW5kIHJlbG9jYXRpb24gaW5mb3JtYXRpb25cblwKLSAgLWcgLS1zdHJpcC1kZWJ1ZyAgICAgICAgICAgICAgICAgUmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgc3ltYm9sc1xuXAotICAgICAtLXN0cmlwLXVubmVlZGVkICAgICAgICAgICAgICBSZW1vdmUgYWxsIHN5bWJvbHMgbm90IG5lZWRlZCBieSByZWxvY2F0aW9uc1xuXAotICAtTiAtLXN0cmlwLXN5bWJvbCA8bmFtZT4gICAgICAgICBEbyBub3QgY29weSBzeW1ib2wgPG5hbWU+XG5cCi0gIC1LIC0ta2VlcC1zeW1ib2wgPG5hbWU+ICAgICAgICAgIE9ubHkgY29weSBzeW1ib2wgPG5hbWU+XG5cCi0gIC1MIC0tbG9jYWxpemUtc3ltYm9sIDxuYW1lPiAgICAgIEZvcmNlIHN5bWJvbCA8bmFtZT4gdG8gYmUgbWFya2VkIGFzIGEgbG9jYWxcblwKLSAgLVcgLS13ZWFrZW4tc3ltYm9sIDxuYW1lPiAgICAgICAgRm9yY2Ugc3ltYm9sIDxuYW1lPiB0byBiZSBtYXJrZWQgYXMgYSB3ZWFrXG5cCi0gICAgIC0td2Vha2VuICAgICAgICAgICAgICAgICAgICAgIEZvcmNlIGFsbCBnbG9iYWwgc3ltYm9scyB0byBiZSBtYXJrZWQgYXMgd2Vha1xuXAotICAteCAtLWRpc2NhcmQtYWxsICAgICAgICAgICAgICAgICBSZW1vdmUgYWxsIG5vbi1nbG9iYWwgc3ltYm9sc1xuXAotICAtWCAtLWRpc2NhcmQtbG9jYWxzICAgICAgICAgICAgICBSZW1vdmUgYW55IGNvbXBpbGVyLWdlbmVyYXRlZCBzeW1ib2xzXG5cCi0gIC1pIC0taW50ZXJsZWF2ZSA8bnVtYmVyPiAgICAgICAgIE9ubHkgY29weSBvbmUgb3V0IG9mIGV2ZXJ5IDxudW1iZXI+IGJ5dGVzXG5cCi0gIC1iIC0tYnl0ZSA8bnVtPiAgICAgICAgICAgICAgICAgIFNlbGVjdCBieXRlIDxudW0+IGluIGV2ZXJ5IGludGVybGVhdmVkIGJsb2NrXG5cCi0gICAgIC0tZ2FwLWZpbGwgPHZhbD4gICAgICAgICAgICAgIEZpbGwgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zIHdpdGggPHZhbD5cblwKLSAgICAgLS1wYWQtdG8gPGFkZHI+ICAgICAgICAgICAgICAgUGFkIHRoZSBsYXN0IHNlY3Rpb24gdXAgdG8gYWRkcmVzcyA8YWRkcj5cblwKLSAgICAgLS1zZXQtc3RhcnQgPGFkZHI+ICAgICAgICAgICAgU2V0IHRoZSBzdGFydCBhZGRyZXNzIHRvIDxhZGRyPlxuXAotICAgIHstLWNoYW5nZS1zdGFydHwtLWFkanVzdC1zdGFydH0gPGluY3I+XG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCA8aW5jcj4gdG8gdGhlIHN0YXJ0IGFkZHJlc3NcblwKLSAgICB7LS1jaGFuZ2UtYWRkcmVzc2VzfC0tYWRqdXN0LXZtYX0gPGluY3I+XG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCA8aW5jcj4gdG8gTE1BLCBWTUEgYW5kIHN0YXJ0IGFkZHJlc3Nlc1xuXAotICAgIHstLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3N8LS1hZGp1c3Qtc2VjdGlvbi12bWF9IDxuYW1lPns9fCt8LX08dmFsPlxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2UgTE1BIGFuZCBWTUEgb2Ygc2VjdGlvbiA8bmFtZT4gYnkgPHZhbD5cblwKLSAgICAgLS1jaGFuZ2Utc2VjdGlvbi1sbWEgPG5hbWU+ez18K3wtfTx2YWw+XG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZSB0aGUgTE1BIG9mIHNlY3Rpb24gPG5hbWU+IGJ5IDx2YWw+XG5cCi0gICAgIC0tY2hhbmdlLXNlY3Rpb24tdm1hIDxuYW1lPns9fCt8LX08dmFsPlxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2UgdGhlIFZNQSBvZiBzZWN0aW9uIDxuYW1lPiBieSA8dmFsPlxuXAotICAgIHstLVtuby1dY2hhbmdlLXdhcm5pbmdzfC0tW25vLV1hZGp1c3Qtd2FybmluZ3N9XG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdhcm4gaWYgYSBuYW1lZCBzZWN0aW9uIGRvZXMgbm90IGV4aXN0XG5cCi0gICAgIC0tc2V0LXNlY3Rpb24tZmxhZ3MgPG5hbWU+PTxmbGFncz5cblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHNlY3Rpb24gPG5hbWU+J3MgcHJvcGVydGllcyB0byA8ZmxhZ3M+XG5cCi0gICAgIC0tYWRkLXNlY3Rpb24gPG5hbWU+PTxmaWxlPiAgIEFkZCBzZWN0aW9uIDxuYW1lPiBmb3VuZCBpbiA8ZmlsZT4gdG8gb3V0cHV0XG5cCi0gICAgIC0tY2hhbmdlLWxlYWRpbmctY2hhciAgICAgICAgIEZvcmNlIG91dHB1dCBmb3JtYXQncyBsZWFkaW5nIGNoYXJhY3RlciBzdHlsZVxuXAotICAgICAtLXJlbW92ZS1sZWFkaW5nLWNoYXIgICAgICAgICBSZW1vdmUgbGVhZGluZyBjaGFyYWN0ZXIgZnJvbSBnbG9iYWwgc3ltYm9sc1xuXAotICAtdiAtLXZlcmJvc2UgICAgICAgICAgICAgICAgICAgICBMaXN0IGFsbCBvYmplY3QgZmlsZXMgbW9kaWZpZWRcblwKLSAgLVYgLS12ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlclxuXAotICAtaCAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgb3V0cHV0XG5cCi0iKSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKGV4aXRfc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoZXhpdF9zdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZAotc3RyaXBfdXNhZ2UgKHN0cmVhbSwgZXhpdF9zdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IGV4aXRfc3RhdHVzOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlVzYWdlOiAlcyA8c3dpdGNoZXM+IGluLWZpbGUocylcbiIpLCBwcm9ncmFtX25hbWUpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiBUaGUgc3dpdGNoZXMgYXJlOlxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLUkgLS1pbnB1dC10YXJnZXQgPGJmZG5hbWU+ICAgICAgQXNzdW1lIGlucHV0IGZpbGUgaXMgaW4gZm9ybWF0IDxiZmRuYW1lPlxuXAotICAtTyAtLW91dHB1dC10YXJnZXQgPGJmZG5hbWU+ICAgICBDcmVhdGUgYW4gb3V0cHV0IGZpbGUgaW4gZm9ybWF0IDxiZmRuYW1lPlxuXAotICAtRiAtLXRhcmdldCA8YmZkbmFtZT4gICAgICAgICAgICBTZXQgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGZvcm1hdCB0byA8YmZkbmFtZT5cblwKLSAgLXAgLS1wcmVzZXJ2ZS1kYXRlcyAgICAgICAgICAgICAgQ29weSBtb2RpZmllZC9hY2Nlc3MgdGltZXN0YW1wcyB0byB0aGUgb3V0cHV0XG5cCi0gIC1SIC0tcmVtb3ZlLXNlY3Rpb24gPG5hbWU+ICAgICAgIFJlbW92ZSBzZWN0aW9uIDxuYW1lPiBmcm9tIHRoZSBvdXRwdXRcblwKLSAgLXMgLS1zdHJpcC1hbGwgICAgICAgICAgICAgICAgICAgUmVtb3ZlIGFsbCBzeW1ib2wgYW5kIHJlbG9jYXRpb24gaW5mb3JtYXRpb25cblwKLSAgLWcgLVMgLS1zdHJpcC1kZWJ1ZyAgICAgICAgICAgICAgUmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgc3ltYm9sc1xuXAotICAgICAtLXN0cmlwLXVubmVlZGVkICAgICAgICAgICAgICBSZW1vdmUgYWxsIHN5bWJvbHMgbm90IG5lZWRlZCBieSByZWxvY2F0aW9uc1xuXAotICAtTiAtLXN0cmlwLXN5bWJvbCA8bmFtZT4gICAgICAgICBEbyBub3QgY29weSBzeW1ib2wgPG5hbWU+XG5cCi0gIC1LIC0ta2VlcC1zeW1ib2wgPG5hbWU+ICAgICAgICAgIE9ubHkgY29weSBzeW1ib2wgPG5hbWU+XG5cCi0gIC14IC0tZGlzY2FyZC1hbGwgICAgICAgICAgICAgICAgIFJlbW92ZSBhbGwgbm9uLWdsb2JhbCBzeW1ib2xzXG5cCi0gIC1YIC0tZGlzY2FyZC1sb2NhbHMgICAgICAgICAgICAgIFJlbW92ZSBhbnkgY29tcGlsZXItZ2VuZXJhdGVkIHN5bWJvbHNcblwKLSAgLXYgLS12ZXJib3NlICAgICAgICAgICAgICAgICAgICAgTGlzdCBhbGwgb2JqZWN0IGZpbGVzIG1vZGlmaWVkXG5cCi0gIC1WIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBwcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXJcblwKLSAgLWggLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIG91dHB1dFxuXAotICAtbyA8ZmlsZT4gICAgICAgICAgICAgICAgICAgICAgICBQbGFjZSBzdHJpcHBlZCBvdXRwdXQgaW50byA8ZmlsZT5cblwKLSIpKTsKLQotICBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIChwcm9ncmFtX25hbWUsIHN0cmVhbSk7Ci0gIGlmIChleGl0X3N0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKGV4aXRfc3RhdHVzKTsKLX0KLQotLyogUGFyc2Ugc2VjdGlvbiBmbGFncyBpbnRvIGEgZmxhZ3dvcmQsIHdpdGggYSBmYXRhbCBlcnJvciBpZiB0aGUKLSAgIHN0cmluZyBjYW4ndCBiZSBwYXJzZWQuICAqLwotCi1zdGF0aWMgZmxhZ3dvcmQKLXBhcnNlX2ZsYWdzIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBmbGFnd29yZCByZXQ7Ci0gIGNvbnN0IGNoYXIgKnNuZXh0OwotICBpbnQgbGVuOwotCi0gIHJldCA9IFNFQ19OT19GTEFHUzsKLQotICBkbwotICAgIHsKLSAgICAgIHNuZXh0ID0gc3RyY2hyIChzLCAnLCcpOwotICAgICAgaWYgKHNuZXh0ID09IE5VTEwpCi0JbGVuID0gc3RybGVuIChzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBsZW4gPSBzbmV4dCAtIHM7Ci0JICArK3NuZXh0OwotCX0KLQotICAgICAgaWYgKDApIDsKLSNkZWZpbmUgUEFSU0VfRkxBRyhmbmFtZSxmdmFsKSBcCi0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChmbmFtZSwgcywgbGVuKSA9PSAwKSByZXQgfD0gZnZhbAotICAgICAgUEFSU0VfRkxBRyAoImFsbG9jIiwgU0VDX0FMTE9DKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJsb2FkIiwgU0VDX0xPQUQpOwotICAgICAgUEFSU0VfRkxBRyAoIm5vbG9hZCIsIFNFQ19ORVZFUl9MT0FEKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJyZWFkb25seSIsIFNFQ19SRUFET05MWSk7Ci0gICAgICBQQVJTRV9GTEFHICgiZGVidWciLCBTRUNfREVCVUdHSU5HKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJjb2RlIiwgU0VDX0NPREUpOwotICAgICAgUEFSU0VfRkxBRyAoImRhdGEiLCBTRUNfREFUQSk7Ci0gICAgICBQQVJTRV9GTEFHICgicm9tIiwgU0VDX1JPTSk7Ci0gICAgICBQQVJTRV9GTEFHICgic2hhcmUiLCBTRUNfU0hBUkVEKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJjb250ZW50cyIsIFNFQ19IQVNfQ09OVEVOVFMpOwotI3VuZGVmIFBBUlNFX0ZMQUcKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpjb3B5OwotCi0JICBjb3B5ID0geG1hbGxvYyAobGVuICsgMSk7Ci0JICBzdHJuY3B5IChjb3B5LCBzLCBsZW4pOwotCSAgY29weVtsZW5dID0gJ1wwJzsKLQkgIG5vbl9mYXRhbCAoXygidW5yZWNvZ25pemVkIHNlY3Rpb24gZmxhZyBgJXMnIiksIGNvcHkpOwotCSAgZmF0YWwgKF8oInN1cHBvcnRlZCBmbGFnczogYWxsb2MsIGxvYWQsIG5vbG9hZCwgcmVhZG9ubHksIGRlYnVnLCBjb2RlLCBkYXRhLCByb20sIHNoYXJlLCBjb250ZW50cyIpKTsKLQl9Ci0KLSAgICAgIHMgPSBzbmV4dDsKLSAgICB9Ci0gIHdoaWxlIChzICE9IE5VTEwpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEZpbmQgYW5kIG9wdGlvbmFsbHkgYWRkIGFuIGVudHJ5IGluIHRoZSBjaGFuZ2Vfc2VjdGlvbnMgbGlzdC4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICoKLWZpbmRfc2VjdGlvbl9saXN0IChuYW1lLCBhZGQpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJvb2xlYW4gYWRkOwotewotICByZWdpc3RlciBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOwotCi0gIGZvciAocCA9IGNoYW5nZV9zZWN0aW9uczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICBpZiAoc3RyY21wIChwLT5uYW1lLCBuYW1lKSA9PSAwKQotICAgICAgcmV0dXJuIHA7Ci0KLSAgaWYgKCEgYWRkKQotICAgIHJldHVybiBOVUxMOwotCi0gIHAgPSAoc3RydWN0IHNlY3Rpb25fbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzZWN0aW9uX2xpc3QpKTsKLSAgcC0+bmFtZSA9IG5hbWU7Ci0gIHAtPnVzZWQgPSBmYWxzZTsKLSAgcC0+cmVtb3ZlID0gZmFsc2U7Ci0gIHAtPmNvcHkgPSBmYWxzZTsKLSAgcC0+Y2hhbmdlX3ZtYSA9IENIQU5HRV9JR05PUkU7Ci0gIHAtPmNoYW5nZV9sbWEgPSBDSEFOR0VfSUdOT1JFOwotICBwLT52bWFfdmFsID0gMDsKLSAgcC0+bG1hX3ZhbCA9IDA7Ci0gIHAtPnNldF9mbGFncyA9IGZhbHNlOwotICBwLT5mbGFncyA9IDA7Ci0KLSAgcC0+bmV4dCA9IGNoYW5nZV9zZWN0aW9uczsKLSAgY2hhbmdlX3NlY3Rpb25zID0gcDsKLQotICByZXR1cm4gcDsKLX0KLQotLyogQWRkIGEgc3ltYm9sIHRvIHN0cmlwX3NwZWNpZmljX2xpc3QuICAqLwotCi1zdGF0aWMgdm9pZCAKLWFkZF9zcGVjaWZpY19zeW1ib2wgKG5hbWUsIGxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHN0cnVjdCBzeW1saXN0ICoqbGlzdDsKLXsKLSAgc3RydWN0IHN5bWxpc3QgKnRtcF9saXN0OwotCi0gIHRtcF9saXN0ID0gKHN0cnVjdCBzeW1saXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHN5bWxpc3QpKTsKLSAgdG1wX2xpc3QtPm5hbWUgPSBuYW1lOwotICB0bXBfbGlzdC0+bmV4dCA9ICpsaXN0OwotICAqbGlzdCA9IHRtcF9saXN0OwotfQotCi0vKiBTZWUgd2hldGhlciBhIHN5bWJvbCBzaG91bGQgYmUgc3RyaXBwZWQgb3Iga2VwdCBiYXNlZCBvbgotICAgc3RyaXBfc3BlY2lmaWNfbGlzdCBhbmQga2VlcF9zeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWlzX3NwZWNpZmllZF9zeW1ib2wgKG5hbWUsIGxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHN0cnVjdCBzeW1saXN0ICpsaXN0OwotewotICBzdHJ1Y3Qgc3ltbGlzdCAqdG1wX2xpc3Q7Ci0KLSAgZm9yICh0bXBfbGlzdCA9IGxpc3Q7IHRtcF9saXN0OyB0bXBfbGlzdCA9IHRtcF9saXN0LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHRtcF9saXN0LT5uYW1lKSA9PSAwKQotCXJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTZWUgaWYgYSBzZWN0aW9uIGlzIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaXNfc3RyaXBfc2VjdGlvbiAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgc3RydWN0IHNlY3Rpb25fbGlzdCAqcDsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19ERUJVR0dJTkcpICE9IDAKLSAgICAgICYmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0RFQlVHCi0JICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOTkVFREVECi0JICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTAotCSAgfHwgZGlzY2FyZF9sb2NhbHMgPT0gTE9DQUxTX0FMTAotCSAgfHwgY29udmVydF9kZWJ1Z2dpbmcpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIHNlY3Rpb25zX3JlbW92ZWQgJiYgISBzZWN0aW9uc19jb3BpZWQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIGZhbHNlKTsKLSAgaWYgKHNlY3Rpb25zX3JlbW92ZWQgJiYgcCAhPSBOVUxMICYmIHAtPnJlbW92ZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKHNlY3Rpb25zX2NvcGllZCAmJiAocCA9PSBOVUxMIHx8ICEgcC0+Y29weSkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQ2hvb3NlIHdoaWNoIHN5bWJvbCBlbnRyaWVzIHRvIGNvcHk7IHB1dCB0aGUgcmVzdWx0IGluIE9TWU1TLgotICAgV2UgZG9uJ3QgY29weSBpbiBwbGFjZSwgYmVjYXVzZSB0aGF0IGNvbmZ1c2VzIHRoZSByZWxvY3MuCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBzeW1ib2xzIHRvIHByaW50LiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotZmlsdGVyX3N5bWJvbHMgKGFiZmQsIG9iZmQsIG9zeW1zLCBpc3ltcywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc3ltYm9sICoqb3N5bXMsICoqaXN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGFzeW1ib2wgKipmcm9tID0gaXN5bXMsICoqdG8gPSBvc3ltczsKLSAgbG9uZyBzcmNfY291bnQgPSAwLCBkc3RfY291bnQgPSAwOwotCi0gIGZvciAoOyBzcmNfY291bnQgPCBzeW1jb3VudDsgc3JjX2NvdW50KyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltID0gZnJvbVtzcmNfY291bnRdOwotICAgICAgZmxhZ3dvcmQgZmxhZ3MgPSBzeW0tPmZsYWdzOwotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7Ci0gICAgICBpbnQga2VlcDsKLQotICAgICAgaWYgKGNoYW5nZV9sZWFkaW5nX2NoYXIKLQkgICYmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpCi0JICAgICAgIT0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChvYmZkKSkKLQkgICYmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09ICdcMCcKLQkgICAgICB8fCAobmFtZVswXSA9PSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpKSkpCi0JewotCSAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob2JmZCkgPT0gJ1wwJykKLQkgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSkgPSBuYW1lICsgMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKm47Ci0KLQkgICAgICBuID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDIpOwotCSAgICAgIG5bMF0gPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKG9iZmQpOwotCSAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09ICdcMCcpCi0JCXN0cmNweSAobiArIDEsIG5hbWUpOwotCSAgICAgIGVsc2UKLQkJc3RyY3B5IChuICsgMSwgbmFtZSArIDEpOwotCSAgICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pID0gbjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHJlbW92ZV9sZWFkaW5nX2NoYXIKLQkgICYmICgoZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwCi0JICAgICAgfHwgKGZsYWdzICYgQlNGX1dFQUspICE9IDAKLQkgICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAmJiBuYW1lWzBdID09IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkpCi0JbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSkgPSBuYW1lICsgMTsKLQotICAgICAgaWYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMKQotCWtlZXAgPSAwOwotICAgICAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX0tFRVApICE9IDAJCS8qIFVzZWQgaW4gcmVsb2NhdGlvbi4gICovCi0JICAgICAgIHx8ICgoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDAKLQkJICAgJiYgKCgqYmZkX2dldF9zZWN0aW9uIChzeW0pLT5zeW1ib2xfcHRyX3B0ciktPmZsYWdzCi0JCSAgICAgICAmIEJTRl9LRUVQKSAhPSAwKSkKLQlrZWVwID0gMTsKLSAgICAgIGVsc2UgaWYgKChmbGFncyAmIEJTRl9HTE9CQUwpICE9IDAJLyogR2xvYmFsIHN5bWJvbC4gICovCi0JICAgICAgIHx8IChmbGFncyAmIEJTRl9XRUFLKSAhPSAwCi0JICAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0Ja2VlcCA9IHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfVU5ORUVERUQ7Ci0gICAgICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQkvKiBEZWJ1Z2dpbmcgc3ltYm9sLiAgKi8KLQlrZWVwID0gKHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfREVCVUcKLQkJJiYgc3RyaXBfc3ltYm9scyAhPSBTVFJJUF9VTk5FRURFRAotCQkmJiAhIGNvbnZlcnRfZGVidWdnaW5nKTsKLSAgICAgIGVsc2UJCQkvKiBMb2NhbCBzeW1ib2wuICAqLwotCWtlZXAgPSAoc3RyaXBfc3ltYm9scyAhPSBTVFJJUF9VTk5FRURFRAotCQkmJiAoZGlzY2FyZF9sb2NhbHMgIT0gTE9DQUxTX0FMTAotCQkgICAgJiYgKGRpc2NhcmRfbG9jYWxzICE9IExPQ0FMU19TVEFSVF9MCi0JCQl8fCAhIGJmZF9pc19sb2NhbF9sYWJlbCAoYWJmZCwgc3ltKSkpKTsKLQotICAgICAgaWYgKGtlZXAgJiYgaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwgc3RyaXBfc3BlY2lmaWNfbGlzdCkpCi0Ja2VlcCA9IDA7Ci0gICAgICBpZiAoIWtlZXAgJiYgaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwga2VlcF9zcGVjaWZpY19saXN0KSkKLQlrZWVwID0gMTsKLSAgICAgIGlmIChrZWVwICYmIGlzX3N0cmlwX3NlY3Rpb24gKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0Ja2VlcCA9IDA7Ci0KLSAgICAgIGlmIChrZWVwICYmIChmbGFncyAmIEJTRl9HTE9CQUwpICE9IDAKLQkgICYmICh3ZWFrZW4gfHwgaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwgd2Vha2VuX3NwZWNpZmljX2xpc3QpKSkKLQl7Ci0JICBzeW0tPmZsYWdzICY9fiBCU0ZfR0xPQkFMOwotCSAgc3ltLT5mbGFncyB8PSBCU0ZfV0VBSzsKLQl9Ci0gICAgICBpZiAoa2VlcCAmJiAoZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkKLQkgICYmIGlzX3NwZWNpZmllZF9zeW1ib2wgKG5hbWUsIGxvY2FsaXplX3NwZWNpZmljX2xpc3QpKQotCXsKLQkgIHN5bS0+ZmxhZ3MgJj0gfihCU0ZfR0xPQkFMIHwgQlNGX1dFQUspOwotCSAgc3ltLT5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0JfQotCi0gICAgICBpZiAoa2VlcCkKLQl0b1tkc3RfY291bnQrK10gPSBzeW07Ci0gICAgfQotCi0gIHRvW2RzdF9jb3VudF0gPSBOVUxMOwotCi0gIHJldHVybiBkc3RfY291bnQ7Ci19Ci0KLS8qIEtlZXAgb25seSBldmVyeSBgY29weV9ieXRlJ3RoIGJ5dGUgaW4gTUVNSFVOSywgd2hpY2ggaXMgKlNJWkUgYnl0ZXMgbG9uZy4KLSAgIEFkanVzdCAqU0laRS4gICovCi0KLXN0YXRpYyB2b2lkCi1maWx0ZXJfYnl0ZXMgKG1lbWh1bmssIHNpemUpCi0gICAgIGNoYXIgKm1lbWh1bms7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnNpemU7Ci17Ci0gIGNoYXIgKmZyb20gPSBtZW1odW5rICsgY29weV9ieXRlLCAqdG8gPSBtZW1odW5rLCAqZW5kID0gbWVtaHVuayArICpzaXplOwotCi0gIGZvciAoOyBmcm9tIDwgZW5kOyBmcm9tICs9IGludGVybGVhdmUpCi0gICAgKnRvKysgPSAqZnJvbTsKLSAgaWYgKCpzaXplICUgaW50ZXJsZWF2ZSA+IChiZmRfc2l6ZV90eXBlKSBjb3B5X2J5dGUpCi0gICAgKnNpemUgPSAoKnNpemUgLyBpbnRlcmxlYXZlKSArIDE7Ci0gIGVsc2UKLSAgICAqc2l6ZSAvPSBpbnRlcmxlYXZlOwotfQotCi0vKiBDb3B5IG9iamVjdCBmaWxlIElCRkQgb250byBPQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLWNvcHlfb2JqZWN0IChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgYmZkX3ZtYSBzdGFydDsKLSAgbG9uZyBzeW1jb3VudDsKLSAgYXNlY3Rpb24gKipvc2VjdGlvbnMgPSBOVUxMOwotICBiZmRfc2l6ZV90eXBlICpnYXBzID0gTlVMTDsKLSAgYmZkX3NpemVfdHlwZSBtYXhfZ2FwID0gMDsKLSAgbG9uZyBzeW1zaXplOwotICBQVFIgZGhhbmRsZTsKLQotCi0gIGlmICghYmZkX3NldF9mb3JtYXQgKG9iZmQsIGJmZF9nZXRfZm9ybWF0IChpYmZkKSkpCi0gICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgcHJpbnRmIChfKCJjb3B5IGZyb20gJXMoJXMpIHRvICVzKCVzKVxuIiksCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCBiZmRfZ2V0X3RhcmdldCAoaWJmZCksCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLCBiZmRfZ2V0X3RhcmdldCAob2JmZCkpOwotCi0gIGlmIChzZXRfc3RhcnRfc2V0KQotICAgIHN0YXJ0ID0gc2V0X3N0YXJ0OwotICBlbHNlCi0gICAgc3RhcnQgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGliZmQpOwotICBzdGFydCArPSBjaGFuZ2Vfc3RhcnQ7Ci0KLSAgaWYgKCFiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKG9iZmQsIHN0YXJ0KQotICAgICAgfHwgIWJmZF9zZXRfZmlsZV9mbGFncyAob2JmZCwKLQkJCSAgICAgIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGliZmQpCi0JCQkgICAgICAgJiBiZmRfYXBwbGljYWJsZV9maWxlX2ZsYWdzIChvYmZkKSkpKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gIC8qIENvcHkgYXJjaGl0ZWN0dXJlIG9mIGlucHV0IGZpbGUgdG8gb3V0cHV0IGZpbGUgKi8KLSAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwKLQkJCSAgYmZkX2dldF9tYWNoIChpYmZkKSkpCi0gICAgbm9uX2ZhdGFsIChfKCJXYXJuaW5nOiBPdXRwdXQgZmlsZSBjYW5ub3QgcmVwcmVzZW50IGFyY2hpdGVjdHVyZSAlcyIpLAotCSAgICAgICBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoYmZkX2dldF9hcmNoIChpYmZkKSwKLQkJCQkJYmZkX2dldF9tYWNoIChpYmZkKSkpOwotICAKLSAgaWYgKCFiZmRfc2V0X2Zvcm1hdCAob2JmZCwgYmZkX2dldF9mb3JtYXQgKGliZmQpKSkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICBpZiAoaXN5bXBwKQotICAgIGZyZWUgKGlzeW1wcCk7Ci0gIAotICBpZiAob3N5bXBwICE9IGlzeW1wcCkKLSAgICBmcmVlIChvc3ltcHApOwotCi0gIC8qIEJGRCBtYW5kYXRlcyB0aGF0IGFsbCBvdXRwdXQgc2VjdGlvbnMgYmUgY3JlYXRlZCBhbmQgc2l6ZXMgc2V0IGJlZm9yZQotICAgICBhbnkgb3V0cHV0IGlzIGRvbmUuICBUaHVzLCB3ZSB0cmF2ZXJzZSBhbGwgc2VjdGlvbnMgbXVsdGlwbGUgdGltZXMuICAqLwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGliZmQsIHNldHVwX3NlY3Rpb24sICh2b2lkICopIG9iZmQpOwotCi0gIGlmIChhZGRfc2VjdGlvbnMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc2VjdGlvbl9hZGQgKnBhZGQ7Ci0gICAgICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwc2V0OwotCi0gICAgICBmb3IgKHBhZGQgPSBhZGRfc2VjdGlvbnM7IHBhZGQgIT0gTlVMTDsgcGFkZCA9IHBhZGQtPm5leHQpCi0JewotCSAgcGFkZC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG9iZmQsIHBhZGQtPm5hbWUpOwotCSAgaWYgKHBhZGQtPnNlY3Rpb24gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG5vbl9mYXRhbCAoXygiY2FuJ3QgY3JlYXRlIHNlY3Rpb24gYCVzJzogJXMiKSwKLQkJICAgICAgIHBhZGQtPm5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgICAgICBzdGF0dXMgPSAxOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0JICAgICAgCi0JICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG9iZmQsIHBhZGQtPnNlY3Rpb24sIHBhZGQtPnNpemUpKQotCQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotCSAgICAgIHBzZXQgPSBmaW5kX3NlY3Rpb25fbGlzdCAocGFkZC0+bmFtZSwgZmFsc2UpOwotCSAgICAgIGlmIChwc2V0ICE9IE5VTEwpCi0JCXBzZXQtPnVzZWQgPSB0cnVlOwotCi0JICAgICAgaWYgKHBzZXQgIT0gTlVMTCAmJiBwc2V0LT5zZXRfZmxhZ3MpCi0JCWZsYWdzID0gcHNldC0+ZmxhZ3MgfCBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICAgIGVsc2UKLQkJZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZIHwgU0VDX0RBVEE7Ci0JICAgICAgCi0JICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvYmZkLCBwYWRkLT5zZWN0aW9uLCBmbGFncykpCi0JCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0JICAgICAgaWYgKHBzZXQgIT0gTlVMTCkKLQkJewotCQkgIGlmIChwc2V0LT5jaGFuZ2Vfdm1hICE9IENIQU5HRV9JR05PUkUpCi0JCSAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fdm1hIChvYmZkLCBwYWRkLT5zZWN0aW9uLCBwc2V0LT52bWFfdmFsKSkKLQkJICAgICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0JCSAgCi0JCSAgaWYgKHBzZXQtPmNoYW5nZV9sbWEgIT0gQ0hBTkdFX0lHTk9SRSkKLQkJICAgIHsKLQkJICAgICAgcGFkZC0+c2VjdGlvbi0+bG1hID0gcHNldC0+bG1hX3ZhbDsKLQkJICAgICAgCi0JCSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQKLQkJCSAgKG9iZmQsIHBhZGQtPnNlY3Rpb24sCi0JCQkgICBiZmRfc2VjdGlvbl9hbGlnbm1lbnQgKG9iZmQsIHBhZGQtPnNlY3Rpb24pKSkKLQkJCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChnYXBfZmlsbF9zZXQgfHwgcGFkX3RvX3NldCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqKnNldDsKLSAgICAgIHVuc2lnbmVkIGludCBjLCBpOwotCi0gICAgICAvKiBXZSBtdXN0IGZpbGwgaW4gZ2FwcyBiZXR3ZWVuIHRoZSBzZWN0aW9ucyBhbmQvb3Igd2UgbXVzdCBwYWQKLQkgdGhlIGxhc3Qgc2VjdGlvbiB0byBhIHNwZWNpZmllZCBhZGRyZXNzLiAgV2UgZG8gdGhpcyBieQotCSBncmFiYmluZyBhIGxpc3Qgb2YgdGhlIHNlY3Rpb25zLCBzb3J0aW5nIHRoZW0gYnkgVk1BLCBhbmQKLQkgaW5jcmVhc2luZyB0aGUgc2VjdGlvbiBzaXplcyBhcyByZXF1aXJlZCB0byBmaWxsIHRoZSBnYXBzLgotCSBXZSB3cml0ZSBvdXQgdGhlIGdhcCBjb250ZW50cyBiZWxvdy4gICovCi0KLSAgICAgIGMgPSBiZmRfY291bnRfc2VjdGlvbnMgKG9iZmQpOwotICAgICAgb3NlY3Rpb25zID0gKGFzZWN0aW9uICoqKSB4bWFsbG9jIChjICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gICAgICBzZXQgPSBvc2VjdGlvbnM7Ci0gICAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKG9iZmQsIGdldF9zZWN0aW9ucywgKHZvaWQgKikgJnNldCk7Ci0KLSAgICAgIHFzb3J0IChvc2VjdGlvbnMsIGMsIHNpemVvZiAoYXNlY3Rpb24gKiksIGNvbXBhcmVfc2VjdGlvbl9sbWEpOwotCi0gICAgICBnYXBzID0gKGJmZF9zaXplX3R5cGUgKikgeG1hbGxvYyAoYyAqIHNpemVvZiAoYmZkX3NpemVfdHlwZSkpOwotICAgICAgbWVtc2V0IChnYXBzLCAwLCBjICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSk7Ci0KLSAgICAgIGlmIChnYXBfZmlsbF9zZXQpCi0JewotCSAgZm9yIChpID0gMDsgaSA8IGMgLSAxOyBpKyspCi0JICAgIHsKLQkgICAgICBmbGFnd29yZCBmbGFnczsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JICAgICAgYmZkX3ZtYSBnYXBfc3RhcnQsIGdhcF9zdG9wOwotCi0JICAgICAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKG9iZmQsIG9zZWN0aW9uc1tpXSk7Ci0JICAgICAgaWYgKChmbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkJICB8fCAoZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAob2JmZCwgb3NlY3Rpb25zW2ldKTsKLQkgICAgICBnYXBfc3RhcnQgPSBiZmRfc2VjdGlvbl9sbWEgKG9iZmQsIG9zZWN0aW9uc1tpXSkgKyBzaXplOwotCSAgICAgIGdhcF9zdG9wID0gYmZkX3NlY3Rpb25fbG1hIChvYmZkLCBvc2VjdGlvbnNbaSArIDFdKTsKLQkgICAgICBpZiAoZ2FwX3N0YXJ0IDwgZ2FwX3N0b3ApCi0JCXsKLQkJICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgb3NlY3Rpb25zW2ldLAotCQkJCQkgICAgICBzaXplICsgKGdhcF9zdG9wIC0gZ2FwX3N0YXJ0KSkpCi0JCSAgICB7Ci0JCSAgICAgIG5vbl9mYXRhbCAoXygiQ2FuJ3QgZmlsbCBnYXAgYWZ0ZXIgJXM6ICVzIiksCi0JCQkgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKG9iZmQsIG9zZWN0aW9uc1tpXSksCi0JCQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCQkgICAgICBzdGF0dXMgPSAxOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBnYXBzW2ldID0gZ2FwX3N0b3AgLSBnYXBfc3RhcnQ7Ci0JCSAgaWYgKG1heF9nYXAgPCBnYXBfc3RvcCAtIGdhcF9zdGFydCkKLQkJICAgIG1heF9nYXAgPSBnYXBfc3RvcCAtIGdhcF9zdGFydDsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocGFkX3RvX3NldCkKLQl7Ci0JICBiZmRfdm1hIGxtYTsKLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotCSAgbG1hID0gYmZkX3NlY3Rpb25fbG1hIChvYmZkLCBvc2VjdGlvbnNbYyAtIDFdKTsKLQkgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChvYmZkLCBvc2VjdGlvbnNbYyAtIDFdKTsKLQkgIGlmIChsbWEgKyBzaXplIDwgcGFkX3RvKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uc1tjIC0gMV0sCi0JCQkJCSAgcGFkX3RvIC0gbG1hKSkKLQkJewotCQkgIG5vbl9mYXRhbCAoXygiQ2FuJ3QgYWRkIHBhZGRpbmcgdG8gJXM6ICVzIiksCi0JCQkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob2JmZCwgb3NlY3Rpb25zW2MgLSAxXSksCi0JCQkgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JCSAgc3RhdHVzID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGdhcHNbYyAtIDFdID0gcGFkX3RvIC0gKGxtYSArIHNpemUpOwotCQkgIGlmIChtYXhfZ2FwIDwgcGFkX3RvIC0gKGxtYSArIHNpemUpKQotCQkgICAgbWF4X2dhcCA9IHBhZF90byAtIChsbWEgKyBzaXplKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBTeW1ib2wgZmlsdGVyaW5nIG11c3QgaGFwcGVuIGFmdGVyIHRoZSBvdXRwdXQgc2VjdGlvbnMgaGF2ZQotICAgICBiZWVuIGNyZWF0ZWQsIGJ1dCBiZWZvcmUgdGhlaXIgY29udGVudHMgYXJlIHNldC4gICovCi0gIGRoYW5kbGUgPSBOVUxMOwotICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGliZmQpOwotICBpZiAoc3ltc2l6ZSA8IDApCi0gICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gIAotICBvc3ltcHAgPSBpc3ltcHAgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7Ci0gIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGliZmQsIGlzeW1wcCk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gIAotICBpZiAoY29udmVydF9kZWJ1Z2dpbmcpCi0gICAgZGhhbmRsZSA9IHJlYWRfZGVidWdnaW5nX2luZm8gKGliZmQsIGlzeW1wcCwgc3ltY291bnQpOwotICAKLSAgaWYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfREVCVUcgCi0gICAgICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTAotICAgICAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9VTk5FRURFRAotICAgICAgfHwgZGlzY2FyZF9sb2NhbHMgIT0gTE9DQUxTX1VOREVGCi0gICAgICB8fCBzdHJpcF9zcGVjaWZpY19saXN0ICE9IE5VTEwKLSAgICAgIHx8IGtlZXBfc3BlY2lmaWNfbGlzdCAhPSBOVUxMCi0gICAgICB8fCBsb2NhbGl6ZV9zcGVjaWZpY19saXN0ICE9IE5VTEwKLSAgICAgIHx8IHdlYWtlbl9zcGVjaWZpY19saXN0ICE9IE5VTEwKLSAgICAgIHx8IHNlY3Rpb25zX3JlbW92ZWQKLSAgICAgIHx8IHNlY3Rpb25zX2NvcGllZAotICAgICAgfHwgY29udmVydF9kZWJ1Z2dpbmcKLSAgICAgIHx8IGNoYW5nZV9sZWFkaW5nX2NoYXIKLSAgICAgIHx8IHJlbW92ZV9sZWFkaW5nX2NoYXIKLSAgICAgIHx8IHdlYWtlbikKLSAgICB7Ci0gICAgICAvKiBNYXJrIHN5bWJvbHMgdXNlZCBpbiBvdXRwdXQgcmVsb2NhdGlvbnMgc28gdGhhdCB0aGV5Ci0JIGFyZSBrZXB0LCBldmVuIGlmIHRoZXkgYXJlIGxvY2FsIGxhYmVscyBvciBzdGF0aWMgc3ltYm9scy4KLQkgCi0JIE5vdGUgd2UgaXRlcmF0ZSBvdmVyIHRoZSBpbnB1dCBzZWN0aW9ucyBleGFtaW5pbmcgdGhlaXIKLQkgcmVsb2NhdGlvbnMgc2luY2UgdGhlIHJlbG9jYXRpb25zIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zCi0JIGhhdmVuJ3QgYmVlbiBzZXQgeWV0LiAgbWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMgd2lsbAotCSBpZ25vcmUgaW5wdXQgc2VjdGlvbnMgd2hpY2ggaGF2ZSBubyBjb3JyZXNwb25kaW5nIG91dHB1dAotCSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChzdHJpcF9zeW1ib2xzICE9IFNUUklQX0FMTCkKLQliZmRfbWFwX292ZXJfc2VjdGlvbnMgKGliZmQsCi0JCQkgICAgICAgbWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMsCi0JCQkgICAgICAgKFBUUilpc3ltcHApOwotICAgICAgb3N5bXBwID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKChzeW1jb3VudCArIDEpICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgIHN5bWNvdW50ID0gZmlsdGVyX3N5bWJvbHMgKGliZmQsIG9iZmQsIG9zeW1wcCwgaXN5bXBwLCBzeW1jb3VudCk7Ci0gICAgfQotCi0gIGlmIChjb252ZXJ0X2RlYnVnZ2luZyAmJiBkaGFuZGxlICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgd3JpdGVfZGVidWdnaW5nX2luZm8gKG9iZmQsIGRoYW5kbGUsICZzeW1jb3VudCwgJm9zeW1wcCkpCi0JewotCSAgc3RhdHVzID0gMTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGJmZF9zZXRfc3ltdGFiIChvYmZkLCBvc3ltcHAsIHN5bWNvdW50KTsKLQotICAvKiBUaGlzIGhhcyB0byBoYXBwZW4gYWZ0ZXIgdGhlIHN5bWJvbCB0YWJsZSBoYXMgYmVlbiBzZXQuICAqLwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGliZmQsIGNvcHlfc2VjdGlvbiwgKHZvaWQgKikgb2JmZCk7Ci0KLSAgaWYgKGFkZF9zZWN0aW9ucyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX2FkZCAqcGFkZDsKLQotICAgICAgZm9yIChwYWRkID0gYWRkX3NlY3Rpb25zOyBwYWRkICE9IE5VTEw7IHBhZGQgPSBwYWRkLT5uZXh0KQotCXsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob2JmZCwgcGFkZC0+c2VjdGlvbiwKLQkJCQkJICAoUFRSKSBwYWRkLT5jb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsCi0JCQkJCSAgKGJmZF9zaXplX3R5cGUpIHBhZGQtPnNpemUpKQotCSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQl9Ci0gICAgfQotCi0gIGlmIChnYXBfZmlsbF9zZXQgfHwgcGFkX3RvX3NldCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqYnVmOwotICAgICAgaW50IGMsIGk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGdhcHMuICAqLwotCi0gICAgICBpZiAobWF4X2dhcCA+IDgxOTIpCi0JbWF4X2dhcCA9IDgxOTI7Ci0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAobWF4X2dhcCk7Ci0gICAgICBtZW1zZXQgKGJ1ZiwgZ2FwX2ZpbGwsIChzaXplX3QpIG1heF9nYXApOwotCi0gICAgICBjID0gYmZkX2NvdW50X3NlY3Rpb25zIChvYmZkKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0JewotCSAgaWYgKGdhcHNbaV0gIT0gMCkKLQkgICAgewotCSAgICAgIGJmZF9zaXplX3R5cGUgbGVmdDsKLQkgICAgICBmaWxlX3B0ciBvZmY7Ci0KLQkgICAgICBsZWZ0ID0gZ2Fwc1tpXTsKLQkgICAgICBvZmYgPSBiZmRfc2VjdGlvbl9zaXplIChvYmZkLCBvc2VjdGlvbnNbaV0pIC0gbGVmdDsKLQkgICAgICB3aGlsZSAobGVmdCA+IDApCi0JCXsKLQkJICBiZmRfc2l6ZV90eXBlIG5vdzsKLQotCQkgIGlmIChsZWZ0ID4gODE5MikKLQkJICAgIG5vdyA9IDgxOTI7Ci0JCSAgZWxzZQotCQkgICAgbm93ID0gbGVmdDsKLQotCQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob2JmZCwgb3NlY3Rpb25zW2ldLCBidWYsCi0JCQkJCQkgIG9mZiwgbm93KSkKLQkJICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0JCSAgbGVmdCAtPSBub3c7Ci0JCSAgb2ZmICs9IG5vdzsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBBbGxvdyB0aGUgQkZEIGJhY2tlbmQgdG8gY29weSBhbnkgcHJpdmF0ZSBkYXRhIGl0IHVuZGVyc3RhbmRzCi0gICAgIGZyb20gdGhlIGlucHV0IEJGRCB0byB0aGUgb3V0cHV0IEJGRC4gIFRoaXMgaXMgZG9uZSBsYXN0IHRvCi0gICAgIHBlcm1pdCB0aGUgcm91dGluZSB0byBsb29rIGF0IHRoZSBmaWx0ZXJlZCBzeW1ib2wgdGFibGUsIHdoaWNoIGlzCi0gICAgIGltcG9ydGFudCBmb3IgdGhlIEVDT0ZGIGNvZGUgYXQgbGVhc3QuICAqLwotICBpZiAoIWJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpKQotICAgIHsKLSAgICAgIG5vbl9mYXRhbCAoXygiJXM6IGVycm9yIGNvcHlpbmcgcHJpdmF0ZSBCRkQgZGF0YTogJXMiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLAotCQkgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgc3RhdHVzID0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLS8qIFJlYWQgZWFjaCBhcmNoaXZlIGVsZW1lbnQgaW4gdHVybiBmcm9tIElCRkQsIGNvcHkgdGhlCi0gICBjb250ZW50cyB0byB0ZW1wIGZpbGUsIGFuZCBrZWVwIHRoZSB0ZW1wIGZpbGUgaGFuZGxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWNvcHlfYXJjaGl2ZSAoaWJmZCwgb2JmZCwgb3V0cHV0X3RhcmdldCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm91dHB1dF90YXJnZXQ7Ci17Ci0gIHN0cnVjdCBuYW1lX2xpc3QKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbmFtZV9saXN0ICpuZXh0OwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGJmZCAqb2JmZDsKLSAgICB9ICpsaXN0LCAqbDsKLSAgYmZkICoqcHRyID0gJm9iZmQtPmFyY2hpdmVfaGVhZDsKLSAgYmZkICp0aGlzX2VsZW1lbnQ7Ci0gIGNoYXIgKmRpciA9IG1ha2VfdGVtcG5hbWUgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotICAvKiBNYWtlIGEgdGVtcCBkaXJlY3RvcnkgdG8gaG9sZCB0aGUgY29udGVudHMuICAqLwotI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgIWRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLSAgaWYgKG1rZGlyIChkaXIpICE9IDApCi0jZWxzZQotICBpZiAobWtkaXIgKGRpciwgMDcwMCkgIT0gMCkKLSNlbmRpZgotICAgIHsKLSAgICAgIGZhdGFsIChfKCJjYW5ub3QgbWtkaXIgJXMgZm9yIGFyY2hpdmUgY29weWluZyAoZXJyb3I6ICVzKSIpLAotCSAgICAgZGlyLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICB9Ci0gIG9iZmQtPmhhc19hcm1hcCA9IGliZmQtPmhhc19hcm1hcDsKLQotICBsaXN0ID0gTlVMTDsKLQotICB0aGlzX2VsZW1lbnQgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChpYmZkLCBOVUxMKTsKLSAgd2hpbGUgKCFzdGF0dXMgJiYgdGhpc19lbGVtZW50ICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgYW4gb3V0cHV0IGZpbGUgZm9yIHRoaXMgbWVtYmVyLiAgKi8KLSAgICAgIGNoYXIgKm91dHB1dF9uYW1lID0gY29uY2F0IChkaXIsICIvIiwgYmZkX2dldF9maWxlbmFtZSAodGhpc19lbGVtZW50KSwKLQkJCQkgIChjaGFyICopIE5VTEwpOwotICAgICAgYmZkICpvdXRwdXRfYmZkID0gYmZkX29wZW53IChvdXRwdXRfbmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBiZmQgKmxhc3RfZWxlbWVudDsKLSAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgICAgIGludCBzdGF0X3N0YXR1cyA9IDA7Ci0KLSAgICAgIGlmIChwcmVzZXJ2ZV9kYXRlcykKLQl7Ci0JICBzdGF0X3N0YXR1cyA9IGJmZF9zdGF0X2FyY2hfZWx0ICh0aGlzX2VsZW1lbnQsICZidWYpOwotCSAgaWYgKHN0YXRfc3RhdHVzICE9IDApCi0JICAgIG5vbl9mYXRhbCAoXygiaW50ZXJuYWwgc3RhdCBlcnJvciBvbiAlcyIpLAotCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAodGhpc19lbGVtZW50KSk7Ci0JfQotCi0gICAgICBsID0gKHN0cnVjdCBuYW1lX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbmFtZV9saXN0KSk7Ci0gICAgICBsLT5uYW1lID0gb3V0cHV0X25hbWU7Ci0gICAgICBsLT5uZXh0ID0gbGlzdDsKLSAgICAgIGxpc3QgPSBsOwotCi0gICAgICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0JUkVUVVJOX05PTkZBVEFMIChvdXRwdXRfbmFtZSk7Ci0KLSAgICAgIGlmICghYmZkX3NldF9mb3JtYXQgKG9iZmQsIGJmZF9nZXRfZm9ybWF0IChpYmZkKSkpCi0JUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLSAgICAgIGlmIChiZmRfY2hlY2tfZm9ybWF0ICh0aGlzX2VsZW1lbnQsIGJmZF9vYmplY3QpID09IHRydWUpCi0JY29weV9vYmplY3QgKHRoaXNfZWxlbWVudCwgb3V0cHV0X2JmZCk7Ci0KLSAgICAgIGlmICghYmZkX2Nsb3NlIChvdXRwdXRfYmZkKSkKLQl7Ci0JICBiZmRfbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpKTsKLQkgIC8qIEVycm9yIGluIG5ldyBvYmplY3QgZmlsZS4gRG9uJ3QgY2hhbmdlIGFyY2hpdmUuICovCi0JICBzdGF0dXMgPSAxOwotCX0KLQotICAgICAgaWYgKHByZXNlcnZlX2RhdGVzICYmIHN0YXRfc3RhdHVzID09IDApCi0Jc2V0X3RpbWVzIChvdXRwdXRfbmFtZSwgJmJ1Zik7Ci0KLSAgICAgIC8qIE9wZW4gdGhlIG5ld2x5IG91dHB1dCBmaWxlIGFuZCBhdHRhY2ggdG8gb3VyIGxpc3QuICAqLwotICAgICAgb3V0cHV0X2JmZCA9IGJmZF9vcGVuciAob3V0cHV0X25hbWUsIG91dHB1dF90YXJnZXQpOwotCi0gICAgICBsLT5vYmZkID0gb3V0cHV0X2JmZDsKLQotICAgICAgKnB0ciA9IG91dHB1dF9iZmQ7Ci0gICAgICBwdHIgPSAmb3V0cHV0X2JmZC0+bmV4dDsKLQotICAgICAgbGFzdF9lbGVtZW50ID0gdGhpc19lbGVtZW50OwotCi0gICAgICB0aGlzX2VsZW1lbnQgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChpYmZkLCBsYXN0X2VsZW1lbnQpOwotCi0gICAgICBiZmRfY2xvc2UgKGxhc3RfZWxlbWVudCk7Ci0gICAgfQotICAqcHRyID0gKGJmZCAqKSBOVUxMOwotCi0gIGlmICghYmZkX2Nsb3NlIChvYmZkKSkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotICBpZiAoIWJmZF9jbG9zZSAoaWJmZCkpCi0gICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgLyogRGVsZXRlIGFsbCB0aGUgZmlsZXMgdGhhdCB3ZSBvcGVuZWQuICAqLwotICBmb3IgKGwgPSBsaXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9jbG9zZSAobC0+b2JmZCk7Ci0gICAgICB1bmxpbmsgKGwtPm5hbWUpOwotICAgIH0KLSAgcm1kaXIgKGRpcik7Ci19Ci0KLS8qIFRoZSB0b3AtbGV2ZWwgY29udHJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1jb3B5X2ZpbGUgKGlucHV0X2ZpbGVuYW1lLCBvdXRwdXRfZmlsZW5hbWUsIGlucHV0X3RhcmdldCwgb3V0cHV0X3RhcmdldCkKLSAgICAgY29uc3QgY2hhciAqaW5wdXRfZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm91dHB1dF9maWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqaW5wdXRfdGFyZ2V0OwotICAgICBjb25zdCBjaGFyICpvdXRwdXRfdGFyZ2V0OwotewotICBiZmQgKmliZmQ7Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICAvKiBUbyBhbGxvdyB1cyB0byBkbyAic3RyaXAgKiIgd2l0aG91dCBkeWluZyBvbiB0aGUgZmlyc3QKLSAgICAgbm9uLW9iamVjdCBmaWxlLCBmYWlsdXJlcyBhcmUgbm9uZmF0YWwuICAqLwotCi0gIGliZmQgPSBiZmRfb3BlbnIgKGlucHV0X2ZpbGVuYW1lLCBpbnB1dF90YXJnZXQpOwotICBpZiAoaWJmZCA9PSBOVUxMKQotICAgIFJFVFVSTl9OT05GQVRBTCAoaW5wdXRfZmlsZW5hbWUpOwotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChpYmZkLCBiZmRfYXJjaGl2ZSkpCi0gICAgewotICAgICAgYmZkICpvYmZkOwotCi0gICAgICAvKiBiZmRfZ2V0X3RhcmdldCBkb2VzIG5vdCByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgdW50aWwKLSAgICAgICAgIGJmZF9jaGVja19mb3JtYXQgc3VjY2VlZHMuICAqLwotICAgICAgaWYgKG91dHB1dF90YXJnZXQgPT0gTlVMTCkKLQlvdXRwdXRfdGFyZ2V0ID0gYmZkX2dldF90YXJnZXQgKGliZmQpOwotCi0gICAgICBvYmZkID0gYmZkX29wZW53IChvdXRwdXRfZmlsZW5hbWUsIG91dHB1dF90YXJnZXQpOwotICAgICAgaWYgKG9iZmQgPT0gTlVMTCkKLQlSRVRVUk5fTk9ORkFUQUwgKG91dHB1dF9maWxlbmFtZSk7Ci0KLSAgICAgIGNvcHlfYXJjaGl2ZSAoaWJmZCwgb2JmZCwgb3V0cHV0X3RhcmdldCk7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGliZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkICpvYmZkOwotCi0gICAgICAvKiBiZmRfZ2V0X3RhcmdldCBkb2VzIG5vdCByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgdW50aWwKLSAgICAgICAgIGJmZF9jaGVja19mb3JtYXQgc3VjY2VlZHMuICAqLwotICAgICAgaWYgKG91dHB1dF90YXJnZXQgPT0gTlVMTCkKLQlvdXRwdXRfdGFyZ2V0ID0gYmZkX2dldF90YXJnZXQgKGliZmQpOwotCi0gICAgICBvYmZkID0gYmZkX29wZW53IChvdXRwdXRfZmlsZW5hbWUsIG91dHB1dF90YXJnZXQpOwotICAgICAgaWYgKG9iZmQgPT0gTlVMTCkKLQlSRVRVUk5fTk9ORkFUQUwgKG91dHB1dF9maWxlbmFtZSk7Ci0KLSAgICAgIGNvcHlfb2JqZWN0IChpYmZkLCBvYmZkKTsKLQotICAgICAgaWYgKCFiZmRfY2xvc2UgKG9iZmQpKQotCVJFVFVSTl9OT05GQVRBTCAob3V0cHV0X2ZpbGVuYW1lKTsKLQotICAgICAgaWYgKCFiZmRfY2xvc2UgKGliZmQpKQotCVJFVFVSTl9OT05GQVRBTCAoaW5wdXRfZmlsZW5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoaW5wdXRfZmlsZW5hbWUpOwotICAgICAgCi0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCXsKLQkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotCSAgZnJlZSAobWF0Y2hpbmcpOwotCX0KLSAgICAgIAotICAgICAgc3RhdHVzID0gMTsKLSAgICB9Ci19Ci0KLS8qIENyZWF0ZSBhIHNlY3Rpb24gaW4gT0JGRCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIGF0dHJpYnV0ZXMKLSAgIGFzIElTRUNUSU9OIGluIElCRkQuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0dXBfc2VjdGlvbiAoaWJmZCwgaXNlY3Rpb24sIG9iZmRhcmcpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgc2VjX3B0ciBpc2VjdGlvbjsKLSAgICAgUFRSIG9iZmRhcmc7Ci17Ci0gIGJmZCAqb2JmZCA9IChiZmQgKikgb2JmZGFyZzsKLSAgc3RydWN0IHNlY3Rpb25fbGlzdCAqcDsKLSAgc2VjX3B0ciBvc2VjdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBiZmRfdm1hIHZtYTsKLSAgYmZkX3ZtYSBsbWE7Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBjaGFyICplcnI7Ci0KLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGliZmQsIGlzZWN0aW9uKSAmIFNFQ19ERUJVR0dJTkcpICE9IDAKLSAgICAgICYmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0RFQlVHCi0JICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOTkVFREVECi0JICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTAotCSAgfHwgZGlzY2FyZF9sb2NhbHMgPT0gTE9DQUxTX0FMTAotCSAgfHwgY29udmVydF9kZWJ1Z2dpbmcpKQotICAgIHJldHVybjsKLQotICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKGJmZF9zZWN0aW9uX25hbWUgKGliZmQsIGlzZWN0aW9uKSwgZmFsc2UpOwotICBpZiAocCAhPSBOVUxMKQotICAgIHAtPnVzZWQgPSB0cnVlOwotCi0gIGlmIChzZWN0aW9uc19yZW1vdmVkICYmIHAgIT0gTlVMTCAmJiBwLT5yZW1vdmUpCi0gICAgcmV0dXJuOwotICBpZiAoc2VjdGlvbnNfY29waWVkICYmIChwID09IE5VTEwgfHwgISBwLT5jb3B5KSkKLSAgICByZXR1cm47Ci0KLSAgb3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAob2JmZCwgYmZkX3NlY3Rpb25fbmFtZSAoaWJmZCwgaXNlY3Rpb24pKTsKLSAgCi0gIGlmIChvc2VjdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVyciA9ICJtYWtpbmciOwotICAgICAgZ290byBsb3NlcjsKLSAgICB9Ci0KLSAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGliZmQsIGlzZWN0aW9uKTsKLSAgaWYgKGNvcHlfYnl0ZSA+PSAwKQotICAgIHNpemUgPSAoc2l6ZSArIGludGVybGVhdmUgLSAxKSAvIGludGVybGVhdmU7Ci0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBvc2VjdGlvbiwgc2l6ZSkpCi0gICAgewotICAgICAgZXJyID0gInNpemUiOwotICAgICAgZ290byBsb3NlcjsKLSAgICB9Ci0gIAotICB2bWEgPSBiZmRfc2VjdGlvbl92bWEgKGliZmQsIGlzZWN0aW9uKTsKLSAgaWYgKHAgIT0gTlVMTCAmJiBwLT5jaGFuZ2Vfdm1hID09IENIQU5HRV9NT0RJRlkpCi0gICAgdm1hICs9IHAtPnZtYV92YWw7Ci0gIGVsc2UgaWYgKHAgIT0gTlVMTCAmJiBwLT5jaGFuZ2Vfdm1hID09IENIQU5HRV9TRVQpCi0gICAgdm1hID0gcC0+dm1hX3ZhbDsKLSAgZWxzZQotICAgIHZtYSArPSBjaGFuZ2Vfc2VjdGlvbl9hZGRyZXNzOwotICAKLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3ZtYSAob2JmZCwgb3NlY3Rpb24sIHZtYSkpCi0gICAgewotICAgICAgZXJyID0gInZtYSI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICBsbWEgPSBpc2VjdGlvbi0+bG1hOwotICBpZiAoKHAgIT0gTlVMTCkgJiYgcC0+Y2hhbmdlX2xtYSAhPSBDSEFOR0VfSUdOT1JFKQotICAgIHsKLSAgICAgIGlmIChwLT5jaGFuZ2VfbG1hID09IENIQU5HRV9NT0RJRlkpCi0JbG1hICs9IHAtPmxtYV92YWw7Ci0gICAgICBlbHNlIGlmIChwLT5jaGFuZ2VfbG1hID09IENIQU5HRV9TRVQpCi0JbG1hID0gcC0+bG1hX3ZhbDsKLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBsbWEgKz0gY2hhbmdlX3NlY3Rpb25fYWRkcmVzczsKLSAgCi0gIG9zZWN0aW9uLT5sbWEgPSBsbWE7Ci0KLSAgLyogRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgbm90IGVub3VnaC4gIElmIHdlIGNoYW5nZSB0aGUgTE1BIHdlCi0gICAgIG1heSBoYXZlIHRvIHJlY29tcHV0ZSB0aGUgaGVhZGVyIGZvciB0aGUgZmlsZSBhcyB3ZWxsLiAgKi8KLSAgaWYgKGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKG9iZmQsCi0JCQkJIG9zZWN0aW9uLAotCQkJCSBiZmRfc2VjdGlvbl9hbGlnbm1lbnQgKGliZmQsIGlzZWN0aW9uKSkKLSAgICAgID09IGZhbHNlKQotICAgIHsKLSAgICAgIGVyciA9ICJhbGlnbm1lbnQiOwotICAgICAgZ290byBsb3NlcjsKLSAgICB9Ci0KLSAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGliZmQsIGlzZWN0aW9uKTsKLSAgaWYgKHAgIT0gTlVMTCAmJiBwLT5zZXRfZmxhZ3MpCi0gICAgZmxhZ3MgPSBwLT5mbGFncyB8IChmbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpOwotICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAob2JmZCwgb3NlY3Rpb24sIGZsYWdzKSkKLSAgICB7Ci0gICAgICBlcnIgPSAiZmxhZ3MiOwotICAgICAgZ290byBsb3NlcjsKLSAgICB9Ci0KLSAgLyogVGhpcyB1c2VkIHRvIGJlIG1hbmdsZV9zZWN0aW9uOyB3ZSBkbyBoZXJlIHRvIGF2b2lkIHVzaW5nCi0gICAgIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIHNpbmNlIHNvbWUgZm9ybWF0cyBhbGxvdyBtdWx0aXBsZQotICAgICBzZWN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLwotICBpc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBvc2VjdGlvbjsKLSAgaXNlY3Rpb24tPm91dHB1dF9vZmZzZXQgPSAwOwotCi0gIC8qIEFsbG93IHRoZSBCRkQgYmFja2VuZCB0byBjb3B5IGFueSBwcml2YXRlIGRhdGEgaXQgdW5kZXJzdGFuZHMKLSAgICAgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotICBpZiAoIWJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjdGlvbiwgb2JmZCwgb3NlY3Rpb24pKQotICAgIHsKLSAgICAgIGVyciA9ICJwcml2YXRlIGRhdGEiOwotICAgICAgZ290byBsb3NlcjsKLSAgICB9Ci0KLSAgLyogQWxsIHdlbnQgd2VsbCAqLwotICByZXR1cm47Ci0KLWxvc2VyOgotICBub25fZmF0YWwgKF8oIiVzOiBzZWN0aW9uIGAlcyc6IGVycm9yIGluICVzOiAlcyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JICAgICBiZmRfc2VjdGlvbl9uYW1lIChpYmZkLCBpc2VjdGlvbiksCi0JICAgICBlcnIsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgc3RhdHVzID0gMTsKLX0KLQotLyogQ29weSB0aGUgZGF0YSBvZiBpbnB1dCBzZWN0aW9uIElTRUNUSU9OIG9mIElCRkQKLSAgIHRvIGFuIG91dHB1dCBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBPQkZELgotICAgSWYgc3RyaXBwaW5nIHRoZW4gZG9uJ3QgY29weSBhbnkgcmVsb2NhdGlvbiBpbmZvLiAgKi8KLQotc3RhdGljIHZvaWQKLWNvcHlfc2VjdGlvbiAoaWJmZCwgaXNlY3Rpb24sIG9iZmRhcmcpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgc2VjX3B0ciBpc2VjdGlvbjsKLSAgICAgUFRSIG9iZmRhcmc7Ci17Ci0gIGJmZCAqb2JmZCA9IChiZmQgKikgb2JmZGFyZzsKLSAgc3RydWN0IHNlY3Rpb25fbGlzdCAqcDsKLSAgYXJlbGVudCAqKnJlbHBwOwotICBsb25nIHJlbGNvdW50OwotICBzZWNfcHRyIG9zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGxvbmcgcmVsc2l6ZTsKLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgZmFpbGVkIGVhcmxpZXIgb24sIGRvIG5vdCBrZWVwIG9uIGdlbmVyYXRpbmcKLSAgICAgY29tcGxhaW50cyBub3cuICAqLwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgcmV0dXJuOwotICAKLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGliZmQsIGlzZWN0aW9uKSAmIFNFQ19ERUJVR0dJTkcpICE9IDAKLSAgICAgICYmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0RFQlVHCi0JICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOTkVFREVECi0JICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTAotCSAgfHwgZGlzY2FyZF9sb2NhbHMgPT0gTE9DQUxTX0FMTAotCSAgfHwgY29udmVydF9kZWJ1Z2dpbmcpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChiZmRfc2VjdGlvbl9uYW1lIChpYmZkLCBpc2VjdGlvbiksIGZhbHNlKTsKLQotICBpZiAoc2VjdGlvbnNfcmVtb3ZlZCAmJiBwICE9IE5VTEwgJiYgcC0+cmVtb3ZlKQotICAgIHJldHVybjsKLSAgaWYgKHNlY3Rpb25zX2NvcGllZCAmJiAocCA9PSBOVUxMIHx8ICEgcC0+Y29weSkpCi0gICAgcmV0dXJuOwotCi0gIG9zZWN0aW9uID0gaXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChpc2VjdGlvbik7Ci0KLSAgaWYgKHNpemUgPT0gMCB8fCBvc2VjdGlvbiA9PSAwKQotICAgIHJldHVybjsKLQotCi0gIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpYmZkLCBpc2VjdGlvbik7Ci0gIGlmIChyZWxzaXplIDwgMCkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgCi0gIGlmIChyZWxzaXplID09IDApCi0gICAgYmZkX3NldF9yZWxvYyAob2JmZCwgb3NlY3Rpb24sIChhcmVsZW50ICoqKSBOVUxMLCAwKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICAgICAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpYmZkLCBpc2VjdGlvbiwgcmVscHAsIGlzeW1wcCk7Ci0gICAgICBpZiAocmVsY291bnQgPCAwKQotCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgICAgCi0gICAgICBpZiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9BTEwpCi0JewotCSAgLyogUmVtb3ZlIHJlbG9jYXRpb25zIHdoaWNoIGFyZSBub3QgaW4KLQkgICAgIGtlZXBfc3RyaXBfc3BlY2lmaWNfbGlzdC4gKi8KLQkgIGFyZWxlbnQgKip0ZW1wX3JlbHBwOwotCSAgbG9uZyB0ZW1wX3JlbGNvdW50ID0gMDsKLQkgIGxvbmcgaTsKLQkgIAotCSAgdGVtcF9yZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLQkgIGZvciAoaSA9IDA7IGkgPCByZWxjb3VudDsgaSsrKQotCSAgICBpZiAoaXNfc3BlY2lmaWVkX3N5bWJvbAotCQkoYmZkX2FzeW1ib2xfbmFtZSAoKnJlbHBwIFtpXS0+c3ltX3B0cl9wdHIpLAotCQkga2VlcF9zcGVjaWZpY19saXN0KSkKLQkgICAgICB0ZW1wX3JlbHBwIFt0ZW1wX3JlbGNvdW50KytdID0gcmVscHAgW2ldOwotCSAgcmVsY291bnQgPSB0ZW1wX3JlbGNvdW50OwotCSAgZnJlZSAocmVscHApOwotCSAgcmVscHAgPSB0ZW1wX3JlbHBwOwotCX0KLSAgICAgIGJmZF9zZXRfcmVsb2MgKG9iZmQsIG9zZWN0aW9uLAotCQkgICAgIChyZWxjb3VudCA9PSAwID8gKGFyZWxlbnQgKiopIE5VTEwgOiByZWxwcCksIHJlbGNvdW50KTsKLSAgICB9Ci0gIAotICBpc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaXNlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgaXNlY3Rpb24tPnJlbG9jX2RvbmUgPSB0cnVlOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGliZmQsIGlzZWN0aW9uKSAmIFNFQ19IQVNfQ09OVEVOVFMpCi0gICAgewotICAgICAgUFRSIG1lbWh1bmsgPSAoUFRSKSB4bWFsbG9jICgodW5zaWduZWQpIHNpemUpOwotCi0gICAgICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaWJmZCwgaXNlY3Rpb24sIG1lbWh1bmssIChmaWxlX3B0cikgMCwKLQkJCQkgICAgIHNpemUpKQotCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gICAgICBpZiAoY29weV9ieXRlID49IDApIAotCWZpbHRlcl9ieXRlcyAobWVtaHVuaywgJnNpemUpOwotCi0gICAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob2JmZCwgb3NlY3Rpb24sIG1lbWh1bmssIChmaWxlX3B0cikgMCwKLQkJCQkgICAgIHNpemUpKQotCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gICAgICBmcmVlIChtZW1odW5rKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHAgIT0gTlVMTCAmJiBwLT5zZXRfZmxhZ3MgJiYgKHAtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLSAgICB7Ci0gICAgICBQVFIgbWVtaHVuayA9IChQVFIpIHhtYWxsb2MgKCh1bnNpZ25lZCkgc2l6ZSk7Ci0KLSAgICAgIC8qIFdlIGRvbid0IHBlcm1pdCB0aGUgdXNlciB0byB0dXJuIG9mZiB0aGUgU0VDX0hBU19DT05URU5UUwotCSBmbGFnLS10aGV5IGNhbiBqdXN0IHJlbW92ZSB0aGUgc2VjdGlvbiBlbnRpcmVseSBhbmQgYWRkIGl0Ci0JIGJhY2sgYWdhaW4uICBIb3dldmVyLCB3ZSBkbyBwZXJtaXQgdGhlbSB0byB0dXJuIG9uIHRoZQotCSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcsIGFuZCB0YWtlIGl0IHRvIG1lYW4gdGhhdCB0aGUgc2VjdGlvbgotCSBjb250ZW50cyBzaG91bGQgYmUgemVyb2VkIG91dC4gICovCi0KLSAgICAgIG1lbXNldCAobWVtaHVuaywgMCwgc2l6ZSk7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG9iZmQsIG9zZWN0aW9uLCBtZW1odW5rLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgc2l6ZSkpCi0JUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0gICAgICBmcmVlIChtZW1odW5rKTsKLSAgICB9Ci19Ci0KLS8qIEdldCBhbGwgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyB1c2VkIHdoZW4gLS1nYXAtZmlsbCBvciAtLXBhZC10byBpcwotICAgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nZXRfc2VjdGlvbnMgKG9iZmQsIG9zZWN0aW9uLCBzZWNwcHBhcmcpCi0gICAgIGJmZCAqb2JmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqb3NlY3Rpb247Ci0gICAgIFBUUiBzZWNwcHBhcmc7Ci17Ci0gIGFzZWN0aW9uICoqKnNlY3BwcCA9IChhc2VjdGlvbiAqKiopIHNlY3BwcGFyZzsKLQotICAqKnNlY3BwcCA9IG9zZWN0aW9uOwotICArKygqc2VjcHBwKTsKLX0KLQotLyogU29ydCBzZWN0aW9ucyBieSBWTUEuICBUaGlzIGlzIGNhbGxlZCB2aWEgcXNvcnQsIGFuZCBpcyB1c2VkIHdoZW4KLSAgIC0tZ2FwLWZpbGwgb3IgLS1wYWQtdG8gaXMgdXNlZC4gIFdlIGZvcmNlIG5vbiBsb2FkYWJsZSBvciBlbXB0eQotICAgc2VjdGlvbnMgdG8gdGhlIGZyb250LCB3aGVyZSB0aGV5IGFyZSBlYXNpZXIgdG8gaWdub3JlLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9zZWN0aW9uX2xtYSAoYXJnMSwgYXJnMikKLSAgICAgY29uc3QgUFRSIGFyZzE7Ci0gICAgIGNvbnN0IFBUUiBhcmcyOwotewotICBjb25zdCBhc2VjdGlvbiAqKnNlYzEgPSAoY29uc3QgYXNlY3Rpb24gKiopIGFyZzE7Ci0gIGNvbnN0IGFzZWN0aW9uICoqc2VjMiA9IChjb25zdCBhc2VjdGlvbiAqKikgYXJnMjsKLSAgZmxhZ3dvcmQgZmxhZ3MxLCBmbGFnczI7Ci0KLSAgLyogU29ydCBub24gbG9hZGFibGUgc2VjdGlvbnMgdG8gdGhlIGZyb250LiAgKi8KLSAgZmxhZ3MxID0gKCpzZWMxKS0+ZmxhZ3M7Ci0gIGZsYWdzMiA9ICgqc2VjMiktPmZsYWdzOwotICBpZiAoKGZsYWdzMSAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLSAgICAgIHx8IChmbGFnczEgJiBTRUNfTE9BRCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoKGZsYWdzMiAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDAKLQkgICYmIChmbGFnczIgJiBTRUNfTE9BRCkgIT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChmbGFnczIgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICB8fCAoZmxhZ3MyICYgU0VDX0xPQUQpID09IDApCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIFNvcnQgc2VjdGlvbnMgYnkgTE1BLiAgKi8KLSAgaWYgKCgqc2VjMSktPmxtYSA+ICgqc2VjMiktPmxtYSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoKCpzZWMxKS0+bG1hIDwgKCpzZWMyKS0+bG1hKQotICAgIHJldHVybiAtMTsKLQotICAvKiBTb3J0IHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgTE1BIGJ5IHNpemUuICAqLwotICBpZiAoKCpzZWMxKS0+X3Jhd19zaXplID4gKCpzZWMyKS0+X3Jhd19zaXplKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmICgoKnNlYzEpLT5fcmF3X3NpemUgPCAoKnNlYzIpLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBNYXJrIGFsbCB0aGUgc3ltYm9scyB3aGljaCB3aWxsIGJlIHVzZWQgaW4gb3V0cHV0IHJlbG9jYXRpb25zIHdpdGgKLSAgIHRoZSBCU0ZfS0VFUCBmbGFnIHNvIHRoYXQgdGhvc2Ugc3ltYm9scyB3aWxsIG5vdCBiZSBzdHJpcHBlZC4KLQotICAgSWdub3JlIHJlbG9jYXRpb25zIHdoaWNoIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotbWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMgKGliZmQsIGlzZWN0aW9uLCBzeW1ib2xzYXJnKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIHNlY19wdHIgaXNlY3Rpb247Ci0gICAgIFBUUiBzeW1ib2xzYXJnOwotewotICBhc3ltYm9sICoqc3ltYm9scyA9IChhc3ltYm9sICoqKSBzeW1ib2xzYXJnOwotICBsb25nIHJlbHNpemU7Ci0gIGFyZWxlbnQgKipyZWxwcDsKLSAgbG9uZyByZWxjb3VudCwgaTsKLQotICAvKiBJZ25vcmUgYW4gaW5wdXQgc2VjdGlvbiB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHNlY3Rpb24uICAqLwotICBpZiAoaXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpYmZkLCBpc2VjdGlvbik7Ci0gIGlmIChyZWxzaXplIDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICBpZiAocmVsc2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpYmZkLCBpc2VjdGlvbiwgcmVscHAsIHN5bWJvbHMpOwotICBpZiAocmVsY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gIC8qIEV4YW1pbmUgZWFjaCBzeW1ib2wgdXNlZCBpbiBhIHJlbG9jYXRpb24uICBJZiBpdCdzIG5vdCBvbmUgb2YgdGhlCi0gICAgIHNwZWNpYWwgYmZkIHNlY3Rpb24gc3ltYm9scywgdGhlbiBtYXJrIGl0IHdpdGggQlNGX0tFRVAuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgcmVsY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoKnJlbHBwW2ldLT5zeW1fcHRyX3B0ciAhPSBiZmRfY29tX3NlY3Rpb25fcHRyLT5zeW1ib2wKLQkgICYmICpyZWxwcFtpXS0+c3ltX3B0cl9wdHIgIT0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sCi0JICAmJiAqcmVscHBbaV0tPnN5bV9wdHJfcHRyICE9IGJmZF91bmRfc2VjdGlvbl9wdHItPnN5bWJvbCkKLQkoKnJlbHBwW2ldLT5zeW1fcHRyX3B0ciktPmZsYWdzIHw9IEJTRl9LRUVQOwotICAgIH0KLQotICBpZiAocmVscHAgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxwcCk7Ci19Ci0KLS8qIFdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotd3JpdGVfZGVidWdnaW5nX2luZm8gKG9iZmQsIGRoYW5kbGUsIHN5bWNvdW50cCwgc3ltcHBwKQotICAgICBiZmQgKm9iZmQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotICAgICBsb25nICpzeW1jb3VudHAgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYXN5bWJvbCAqKipzeW1wcHAgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8gKG9iZmQsIGRoYW5kbGUpOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgewotICAgICAgYmZkX2J5dGUgKnN5bXMsICpzdHJpbmdzOwotICAgICAgYmZkX3NpemVfdHlwZSBzeW1zaXplLCBzdHJpbmdzaXplOwotICAgICAgYXNlY3Rpb24gKnN0YWJzZWMsICpzdGFic3Ryc2VjOwotCi0gICAgICBpZiAoISB3cml0ZV9zdGFic19pbl9zZWN0aW9uc19kZWJ1Z2dpbmdfaW5mbyAob2JmZCwgZGhhbmRsZSwgJnN5bXMsCi0JCQkJCQkgICAgJnN5bXNpemUsICZzdHJpbmdzLAotCQkJCQkJICAgICZzdHJpbmdzaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHN0YWJzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChvYmZkLCAiLnN0YWIiKTsKLSAgICAgIHN0YWJzdHJzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChvYmZkLCAiLnN0YWJzdHIiKTsKLSAgICAgIGlmIChzdGFic2VjID09IE5VTEwKLQkgIHx8IHN0YWJzdHJzZWMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgc3RhYnNlYywgc3ltc2l6ZSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG9iZmQsIHN0YWJzdHJzZWMsIHN0cmluZ3NpemUpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKG9iZmQsIHN0YWJzZWMsIDIpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKG9iZmQsIHN0YWJzdHJzZWMsIDApCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob2JmZCwgc3RhYnNlYywKLQkJCQkgICAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgICB8IFNFQ19SRUFET05MWQotCQkJCSAgICB8IFNFQ19ERUJVR0dJTkcpKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG9iZmQsIHN0YWJzdHJzZWMsCi0JCQkJICAgICAgKFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkgICAgICAgfCBTRUNfREVCVUdHSU5HKSkpCi0JewotCSAgbm9uX2ZhdGFsIChfKCIlczogY2FuJ3QgY3JlYXRlIGRlYnVnZ2luZyBzZWN0aW9uOiAlcyIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLAotCQkgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGNhbiBnZXQgYXdheSB3aXRoIHNldHRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMgbm93IGJlY2F1c2UKLSAgICAgICAgIHRoZSBuZXh0IHRoaW5nIHRoZSBjYWxsZXIgaXMgZ29pbmcgdG8gZG8gaXMgY29weSBvdmVyIHRoZQotICAgICAgICAgcmVhbCBzZWN0aW9ucy4gIFdlIG1heSBzb21lZGF5IGhhdmUgdG8gc3BsaXQgdGhlIGNvbnRlbnRzCi0gICAgICAgICBzZXR0aW5nIG91dCBvZiB0aGlzIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob2JmZCwgc3RhYnNlYywgc3ltcywgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgIHN5bXNpemUpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob2JmZCwgc3RhYnN0cnNlYywgc3RyaW5ncywKLQkJCQkJIChmaWxlX3B0cikgMCwgc3RyaW5nc2l6ZSkpCi0JewotCSAgbm9uX2ZhdGFsIChfKCIlczogY2FuJ3Qgc2V0IGRlYnVnZ2luZyBzZWN0aW9uIGNvbnRlbnRzOiAlcyIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLAotCQkgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBub25fZmF0YWwgKF8oIiVzOiBkb24ndCBrbm93IGhvdyB0byB3cml0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yICVzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwgYmZkX2dldF90YXJnZXQgKG9iZmQpKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50Ci1zdHJpcF9tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqYXJndltdOwotewotICBjaGFyICppbnB1dF90YXJnZXQgPSBOVUxMLCAqb3V0cHV0X3RhcmdldCA9IE5VTEw7Ci0gIGJvb2xlYW4gc2hvd192ZXJzaW9uID0gZmFsc2U7Ci0gIGludCBjLCBpOwotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOwotICBjaGFyICpvdXRwdXRfZmlsZSA9IE5VTEw7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJJOk86RjpLOk46UjpvOnNTcGd4WFZ2IiwKLQkJCSAgIHN0cmlwX29wdGlvbnMsIChpbnQgKikgMCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ0knOgotCSAgaW5wdXRfdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnTyc6Ci0JICBvdXRwdXRfdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnRic6Ci0JICBpbnB1dF90YXJnZXQgPSBvdXRwdXRfdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnUic6Ci0JICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKG9wdGFyZywgdHJ1ZSk7Ci0JICBwLT5yZW1vdmUgPSB0cnVlOwotCSAgc2VjdGlvbnNfcmVtb3ZlZCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9BTEw7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQljYXNlICdnJzoKLQkgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9ERUJVRzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NUUklQX1VOTkVFREVEOgotCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX1VOTkVFREVEOwotCSAgYnJlYWs7Ci0JY2FzZSAnSyc6Ci0JICBhZGRfc3BlY2lmaWNfc3ltYm9sIChvcHRhcmcsICZrZWVwX3NwZWNpZmljX2xpc3QpOwotCSAgYnJlYWs7Ci0JY2FzZSAnTic6Ci0JICBhZGRfc3BlY2lmaWNfc3ltYm9sIChvcHRhcmcsICZzdHJpcF9zcGVjaWZpY19saXN0KTsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgb3V0cHV0X2ZpbGUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIHByZXNlcnZlX2RhdGVzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgZGlzY2FyZF9sb2NhbHMgPSBMT0NBTFNfQUxMOwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JICBkaXNjYXJkX2xvY2FscyA9IExPQ0FMU19TVEFSVF9MOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICB2ZXJib3NlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgc2hvd192ZXJzaW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMDoKLQkgIGJyZWFrOwkJLyogd2UndmUgYmVlbiBnaXZlbiBhIGxvbmcgb3B0aW9uICovCi0JY2FzZSAnaCc6Ci0JICBzdHJpcF91c2FnZSAoc3Rkb3V0LCAwKTsKLQlkZWZhdWx0OgotCSAgc3RyaXBfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JfQotICAgIH0KLQotICBpZiAoc2hvd192ZXJzaW9uKQotICAgIHByaW50X3ZlcnNpb24gKCJzdHJpcCIpOwotCi0gIC8qIERlZmF1bHQgaXMgdG8gc3RyaXAgYWxsIHN5bWJvbHMuICAqLwotICBpZiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9VTkRFRgotICAgICAgJiYgZGlzY2FyZF9sb2NhbHMgPT0gTE9DQUxTX1VOREVGCi0gICAgICAmJiBzdHJpcF9zcGVjaWZpY19saXN0ID09IE5VTEwpCi0gICAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0FMTDsKLQotICBpZiAob3V0cHV0X3RhcmdldCA9PSAoY2hhciAqKSBOVUxMKQotICAgIG91dHB1dF90YXJnZXQgPSBpbnB1dF90YXJnZXQ7Ci0KLSAgaSA9IG9wdGluZDsKLSAgaWYgKGkgPT0gYXJnYwotICAgICAgfHwgKG91dHB1dF9maWxlICE9IE5VTEwgJiYgKGkgKyAxKSA8IGFyZ2MpKQotICAgIHN0cmlwX3VzYWdlIChzdGRlcnIsIDEpOwotCi0gIGZvciAoOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgIGludCBob2xkX3N0YXR1cyA9IHN0YXR1czsKLSAgICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgICBjaGFyICp0bXBuYW1lOwotCi0gICAgICBpZiAocHJlc2VydmVfZGF0ZXMpCi0JewotCSAgaWYgKHN0YXQgKGFyZ3ZbaV0sICZzdGF0YnVmKSA8IDApCi0JICAgIHsKLQkgICAgICBub25fZmF0YWwgKF8oIiVzOiBjYW5ub3Qgc3RhdDogJXMiKSwgYXJndltpXSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChvdXRwdXRfZmlsZSAhPSBOVUxMKQotCXRtcG5hbWUgPSBvdXRwdXRfZmlsZTsKLSAgICAgIGVsc2UKLQl0bXBuYW1lID0gbWFrZV90ZW1wbmFtZSAoYXJndltpXSk7Ci0gICAgICBzdGF0dXMgPSAwOwotCi0gICAgICBjb3B5X2ZpbGUgKGFyZ3ZbaV0sIHRtcG5hbWUsIGlucHV0X3RhcmdldCwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBpZiAoc3RhdHVzID09IDApCi0JewotCSAgaWYgKHByZXNlcnZlX2RhdGVzKQotCSAgICBzZXRfdGltZXMgKHRtcG5hbWUsICZzdGF0YnVmKTsKLQkgIGlmIChvdXRwdXRfZmlsZSA9PSBOVUxMKQotCSAgICBzbWFydF9yZW5hbWUgKHRtcG5hbWUsIGFyZ3ZbaV0sIHByZXNlcnZlX2RhdGVzKTsKLQkgIHN0YXR1cyA9IGhvbGRfc3RhdHVzOwotCX0KLSAgICAgIGVsc2UKLQl1bmxpbmsgKHRtcG5hbWUpOwotICAgICAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpCi0JZnJlZSAodG1wbmFtZSk7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1jb3B5X21haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0gIGNoYXIgKmlucHV0X2ZpbGVuYW1lID0gTlVMTCwgKm91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci0gIGNoYXIgKmlucHV0X3RhcmdldCA9IE5VTEwsICpvdXRwdXRfdGFyZ2V0ID0gTlVMTDsKLSAgYm9vbGVhbiBzaG93X3ZlcnNpb24gPSBmYWxzZTsKLSAgYm9vbGVhbiBjaGFuZ2Vfd2FybiA9IHRydWU7Ci0gIGludCBjOwotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiYjppOkk6ajpLOk46czpPOmQ6RjpMOlI6U3BneFhWdlc6IiwKLQkJCSAgIGNvcHlfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnYic6Ci0JICBjb3B5X2J5dGUgPSBhdG9pIChvcHRhcmcpOwotCSAgaWYgKGNvcHlfYnl0ZSA8IDApCi0JICAgIGZhdGFsIChfKCJieXRlIG51bWJlciBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2knOgotCSAgaW50ZXJsZWF2ZSA9IGF0b2kgKG9wdGFyZyk7Ci0JICBpZiAoaW50ZXJsZWF2ZSA8IDEpCi0JICAgIGZhdGFsIChfKCJpbnRlcmxlYXZlIG11c3QgYmUgcG9zaXRpdmUiKSk7Ci0JICBicmVhazsKLQljYXNlICdJJzoKLQljYXNlICdzJzoJCS8qICJzb3VyY2UiIC0gJ0knIGlzIHByZWZlcnJlZCAqLwotCSAgaW5wdXRfdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnTyc6Ci0JY2FzZSAnZCc6CQkvKiAiZGVzdGluYXRpb24iIC0gJ08nIGlzIHByZWZlcnJlZCAqLwotCSAgb3V0cHV0X3RhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0YnOgotCSAgaW5wdXRfdGFyZ2V0ID0gb3V0cHV0X3RhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ2onOgotCSAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChvcHRhcmcsIHRydWUpOwotCSAgaWYgKHAtPnJlbW92ZSkKLQkgICAgZmF0YWwgKF8oIiVzIGJvdGggY29waWVkIGFuZCByZW1vdmVkIiksIG9wdGFyZyk7Ci0JICBwLT5jb3B5ID0gdHJ1ZTsKLQkgIHNlY3Rpb25zX2NvcGllZCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdSJzoKLQkgIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAob3B0YXJnLCB0cnVlKTsKLQkgIGlmIChwLT5jb3B5KQotCSAgICBmYXRhbCAoXygiJXMgYm90aCBjb3BpZWQgYW5kIHJlbW92ZWQiKSwgb3B0YXJnKTsKLQkgIHAtPnJlbW92ZSA9IHRydWU7Ci0JICBzZWN0aW9uc19yZW1vdmVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0FMTDsKLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgotCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0RFQlVHOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1RSSVBfVU5ORUVERUQ6Ci0JICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfVU5ORUVERUQ7Ci0JICBicmVhazsKLQljYXNlICdLJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJmtlZXBfc3BlY2lmaWNfbGlzdCk7Ci0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJnN0cmlwX3NwZWNpZmljX2xpc3QpOwotCSAgYnJlYWs7Ci0JY2FzZSAnTCc6Ci0JICBhZGRfc3BlY2lmaWNfc3ltYm9sIChvcHRhcmcsICZsb2NhbGl6ZV9zcGVjaWZpY19saXN0KTsKLQkgIGJyZWFrOwotCWNhc2UgJ1cnOgotCSAgYWRkX3NwZWNpZmljX3N5bWJvbCAob3B0YXJnLCAmd2Vha2VuX3NwZWNpZmljX2xpc3QpOwotCSAgYnJlYWs7Ci0JY2FzZSAncCc6Ci0JICBwcmVzZXJ2ZV9kYXRlcyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGRpc2NhcmRfbG9jYWxzID0gTE9DQUxTX0FMTDsKLQkgIGJyZWFrOwotCWNhc2UgJ1gnOgotCSAgZGlzY2FyZF9sb2NhbHMgPSBMT0NBTFNfU1RBUlRfTDsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgdmVyYm9zZSA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIHNob3dfdmVyc2lvbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XRUFLRU46Ci0JICB3ZWFrZW4gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQUREX1NFQ1RJT046Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnM7Ci0JICAgIHN0cnVjdCBzdGF0IHN0OwotCSAgICBzdHJ1Y3Qgc2VjdGlvbl9hZGQgKnBhOwotCSAgICBpbnQgbGVuOwotCSAgICBjaGFyICpuYW1lOwotCSAgICBGSUxFICpmOwotCi0JICAgIHMgPSBzdHJjaHIgKG9wdGFyZywgJz0nKTsKLQkgICAgCi0JICAgIGlmIChzID09IE5VTEwpCi0JICAgICAgZmF0YWwgKF8oImJhZCBmb3JtYXQgZm9yIC0tYWRkLXNlY3Rpb24gTkFNRT1GSUxFTkFNRSIpKTsKLQotCSAgICBpZiAoc3RhdCAocyArIDEsICYgc3QpIDwgMCkKLQkgICAgICBmYXRhbCAoXygiY2Fubm90IHN0YXQ6ICVzOiAlcyIpLCBzICsgMSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLQkgICAgcGEgPSAoc3RydWN0IHNlY3Rpb25fYWRkICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNlY3Rpb25fYWRkKSk7Ci0KLQkgICAgbGVuID0gcyAtIG9wdGFyZzsKLQkgICAgbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOwotCSAgICBzdHJuY3B5IChuYW1lLCBvcHRhcmcsIGxlbik7Ci0JICAgIG5hbWVbbGVuXSA9ICdcMCc7Ci0JICAgIHBhLT5uYW1lID0gbmFtZTsKLQotCSAgICBwYS0+ZmlsZW5hbWUgPSBzICsgMTsKLQotCSAgICBwYS0+c2l6ZSA9IHN0LnN0X3NpemU7Ci0KLQkgICAgcGEtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHBhLT5zaXplKTsKLQkgICAgZiA9IGZvcGVuIChwYS0+ZmlsZW5hbWUsIEZPUEVOX1JCKTsKLQkgICAgCi0JICAgIGlmIChmID09IE5VTEwpCi0JICAgICAgZmF0YWwgKF8oImNhbm5vdCBvcGVuOiAlczogJXMiKSwgcGEtPmZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLQkgICAgCi0JICAgIGlmIChmcmVhZCAocGEtPmNvbnRlbnRzLCAxLCBwYS0+c2l6ZSwgZikgPT0gMAotCQl8fCBmZXJyb3IgKGYpKQotCSAgICAgIGZhdGFsIChfKCIlczogZnJlYWQgZmFpbGVkIiksIHBhLT5maWxlbmFtZSk7Ci0KLQkgICAgZmNsb3NlIChmKTsKLQotCSAgICBwYS0+bmV4dCA9IGFkZF9zZWN0aW9uczsKLQkgICAgYWRkX3NlY3Rpb25zID0gcGE7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9DSEFOR0VfU1RBUlQ6Ci0JICBjaGFuZ2Vfc3RhcnQgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tY2hhbmdlLXN0YXJ0Iik7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTOgotCWNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQToKLQljYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUE6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnM7Ci0JICAgIGludCBsZW47Ci0JICAgIGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgKm9wdGlvbiA9IE5VTEw7Ci0JICAgIGJmZF92bWEgdmFsOwotCSAgICBlbnVtIGNoYW5nZV9hY3Rpb24gd2hhdCA9IENIQU5HRV9JR05PUkU7Ci0JICAgIAotCSAgICBzd2l0Y2ggKGMpCi0JICAgICAgewotCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1M6Ci0JCW9wdGlvbiA9ICItLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MiOwotCQlicmVhazsKLQkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9MTUE6Ci0JCW9wdGlvbiA9ICItLWNoYW5nZS1zZWN0aW9uLWxtYSI7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQToKLQkJb3B0aW9uID0gIi0tY2hhbmdlLXNlY3Rpb24tdm1hIjsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICAKLQkgICAgcyA9IHN0cmNociAob3B0YXJnLCAnPScpOwotCSAgICBpZiAocyA9PSBOVUxMKQotCSAgICAgIHsKLQkJcyA9IHN0cmNociAob3B0YXJnLCAnKycpOwotCQlpZiAocyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIHMgPSBzdHJjaHIgKG9wdGFyZywgJy0nKTsKLQkJICAgIGlmIChzID09IE5VTEwpCi0JCSAgICAgIGZhdGFsIChfKCJiYWQgZm9ybWF0IGZvciAlcyIpLCBvcHRpb24pOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgbGVuID0gcyAtIG9wdGFyZzsKLQkgICAgbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOwotCSAgICBzdHJuY3B5IChuYW1lLCBvcHRhcmcsIGxlbik7Ci0JICAgIG5hbWVbbGVuXSA9ICdcMCc7Ci0KLQkgICAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChuYW1lLCB0cnVlKTsKLQotCSAgICB2YWwgPSBwYXJzZV92bWEgKHMgKyAxLCBvcHRpb24pOwotCi0JICAgIHN3aXRjaCAoKnMpCi0JICAgICAgewotCSAgICAgIGNhc2UgJz0nOiB3aGF0ID0gQ0hBTkdFX1NFVDsgYnJlYWs7Ci0JICAgICAgY2FzZSAnLSc6IHZhbCAgPSAtIHZhbDsgLyogRHJvcCB0aHJvdWdoLiAgKi8KLQkgICAgICBjYXNlICcrJzogd2hhdCA9IENIQU5HRV9NT0RJRlk7IGJyZWFrOwotCSAgICAgIH0KLQkgICAgCi0JICAgIHN3aXRjaCAoYykKLQkgICAgICB7Ci0JICAgICAgY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTUzoKLQkJcC0+Y2hhbmdlX3ZtYSA9IHdoYXQ7Ci0JCXAtPnZtYV92YWwgICAgPSB2YWw7Ci0JCS8qIERyb3AgdGhyb3VnaC4gICovCi0JCQotCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQToKLQkJcC0+Y2hhbmdlX2xtYSA9IHdoYXQ7Ci0JCXAtPmxtYV92YWwgICAgPSB2YWw7Ci0JCWJyZWFrOwotCQkKLQkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUE6Ci0JCXAtPmNoYW5nZV92bWEgPSB3aGF0OwotCQlwLT52bWFfdmFsICAgID0gdmFsOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9DSEFOR0VfQUREUkVTU0VTOgotCSAgY2hhbmdlX3NlY3Rpb25fYWRkcmVzcyA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1jaGFuZ2UtYWRkcmVzc2VzIik7Ci0JICBjaGFuZ2Vfc3RhcnQgPSBjaGFuZ2Vfc2VjdGlvbl9hZGRyZXNzOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX1dBUk5JTkdTOgotCSAgY2hhbmdlX3dhcm4gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUjoKLQkgIGNoYW5nZV9sZWFkaW5nX2NoYXIgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fREVCVUdHSU5HOgotCSAgY29udmVydF9kZWJ1Z2dpbmcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fR0FQX0ZJTEw6Ci0JICB7Ci0JICAgIGJmZF92bWEgZ2FwX2ZpbGxfdm1hOwotCi0JICAgIGdhcF9maWxsX3ZtYSA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1nYXAtZmlsbCIpOwotCSAgICBnYXBfZmlsbCA9IChiZmRfYnl0ZSkgZ2FwX2ZpbGxfdm1hOwotCSAgICBpZiAoKGJmZF92bWEpIGdhcF9maWxsICE9IGdhcF9maWxsX3ZtYSkKLQkgICAgICB7Ci0JCWNoYXIgYnVmZlsyMF07Ci0JCQotCQlzcHJpbnRmX3ZtYSAoYnVmZiwgZ2FwX2ZpbGxfdm1hKTsKLQkJCi0JCW5vbl9mYXRhbCAoXygiV2FybmluZzogdHJ1bmNhdGluZyBnYXAtZmlsbCBmcm9tIDB4JXMgdG8gMHgleCIpLAotCQkJICAgYnVmZiwgZ2FwX2ZpbGwpOwotCSAgICAgIH0KLQkgICAgZ2FwX2ZpbGxfc2V0ID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0NIQU5HRV9XQVJOSU5HUzoKLQkgIGNoYW5nZV93YXJuID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9QQURfVE86Ci0JICBwYWRfdG8gPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tcGFkLXRvIik7Ci0JICBwYWRfdG9fc2V0ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1JFTU9WRV9MRUFESU5HX0NIQVI6Ci0JICByZW1vdmVfbGVhZGluZ19jaGFyID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NFVF9TRUNUSU9OX0ZMQUdTOgotCSAgewotCSAgICBjb25zdCBjaGFyICpzOwotCSAgICBpbnQgbGVuOwotCSAgICBjaGFyICpuYW1lOwotCi0JICAgIHMgPSBzdHJjaHIgKG9wdGFyZywgJz0nKTsKLQkgICAgaWYgKHMgPT0gTlVMTCkKLQkgICAgICBmYXRhbCAoXygiYmFkIGZvcm1hdCBmb3IgLS1zZXQtc2VjdGlvbi1mbGFncyIpKTsKLQotCSAgICBsZW4gPSBzIC0gb3B0YXJnOwotCSAgICBuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0JICAgIHN0cm5jcHkgKG5hbWUsIG9wdGFyZywgbGVuKTsKLQkgICAgbmFtZVtsZW5dID0gJ1wwJzsKLQotCSAgICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKG5hbWUsIHRydWUpOwotCi0JICAgIHAtPnNldF9mbGFncyA9IHRydWU7Ci0JICAgIHAtPmZsYWdzID0gcGFyc2VfZmxhZ3MgKHMgKyAxKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NFVF9TVEFSVDoKLQkgIHNldF9zdGFydCA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1zZXQtc3RhcnQiKTsKLQkgIHNldF9zdGFydF9zZXQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAwOgotCSAgYnJlYWs7CQkvKiB3ZSd2ZSBiZWVuIGdpdmVuIGEgbG9uZyBvcHRpb24gKi8KLQljYXNlICdoJzoKLQkgIGNvcHlfdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JZGVmYXVsdDoKLQkgIGNvcHlfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JfQotICAgIH0KLQotICBpZiAoc2hvd192ZXJzaW9uKQotICAgIHByaW50X3ZlcnNpb24gKCJvYmpjb3B5Iik7Ci0KLSAgaWYgKGNvcHlfYnl0ZSA+PSBpbnRlcmxlYXZlKQotICAgIGZhdGFsIChfKCJieXRlIG51bWJlciBtdXN0IGJlIGxlc3MgdGhhbiBpbnRlcmxlYXZlIikpOwotCi0gIGlmIChvcHRpbmQgPT0gYXJnYyB8fCBvcHRpbmQgKyAyIDwgYXJnYykKLSAgICBjb3B5X3VzYWdlIChzdGRlcnIsIDEpOwotCi0gIGlucHV0X2ZpbGVuYW1lID0gYXJndltvcHRpbmRdOwotICBpZiAob3B0aW5kICsgMSA8IGFyZ2MpCi0gICAgb3V0cHV0X2ZpbGVuYW1lID0gYXJndltvcHRpbmQgKyAxXTsKLQotICAvKiBEZWZhdWx0IGlzIHRvIHN0cmlwIG5vIHN5bWJvbHMuICAqLwotICBpZiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9VTkRFRiAmJiBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfVU5ERUYpCi0gICAgc3RyaXBfc3ltYm9scyA9IFNUUklQX05PTkU7Ci0KLSAgaWYgKG91dHB1dF90YXJnZXQgPT0gKGNoYXIgKikgTlVMTCkKLSAgICBvdXRwdXRfdGFyZ2V0ID0gaW5wdXRfdGFyZ2V0OwotCi0gIGlmIChwcmVzZXJ2ZV9kYXRlcykKLSAgICB7Ci0gICAgICBpZiAoc3RhdCAoaW5wdXRfZmlsZW5hbWUsICZzdGF0YnVmKSA8IDApCi0JZmF0YWwgKF8oIkNhbm5vdCBzdGF0OiAlczogJXMiKSwgaW5wdXRfZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBubyBkZXN0aW5hdGlvbiBmaWxlIHRoZW4gY3JlYXRlIGEgdGVtcCBhbmQgcmVuYW1lCi0gICAgIHRoZSByZXN1bHQgaW50byB0aGUgaW5wdXQuICAqLwotCi0gIGlmIChvdXRwdXRfZmlsZW5hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICp0bXBuYW1lID0gbWFrZV90ZW1wbmFtZSAoaW5wdXRfZmlsZW5hbWUpOwotCi0gICAgICBjb3B5X2ZpbGUgKGlucHV0X2ZpbGVuYW1lLCB0bXBuYW1lLCBpbnB1dF90YXJnZXQsIG91dHB1dF90YXJnZXQpOwotICAgICAgaWYgKHN0YXR1cyA9PSAwKQotCXsJCi0JICBpZiAocHJlc2VydmVfZGF0ZXMpCi0JICAgIHNldF90aW1lcyAodG1wbmFtZSwgJnN0YXRidWYpOwotCSAgc21hcnRfcmVuYW1lICh0bXBuYW1lLCBpbnB1dF9maWxlbmFtZSwgcHJlc2VydmVfZGF0ZXMpOwotCX0KLSAgICAgIGVsc2UKLQl1bmxpbmsgKHRtcG5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvcHlfZmlsZSAoaW5wdXRfZmlsZW5hbWUsIG91dHB1dF9maWxlbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGlmIChzdGF0dXMgPT0gMCAmJiBwcmVzZXJ2ZV9kYXRlcykKLQlzZXRfdGltZXMgKG91dHB1dF9maWxlbmFtZSwgJnN0YXRidWYpOwotICAgIH0KLQotICBpZiAoY2hhbmdlX3dhcm4pCi0gICAgewotICAgICAgZm9yIChwID0gY2hhbmdlX3NlY3Rpb25zOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmICghIHAtPnVzZWQpCi0JICAgIHsKLQkgICAgICBpZiAocC0+Y2hhbmdlX3ZtYSAhPSBDSEFOR0VfSUdOT1JFKQotCQl7Ci0JCSAgY2hhciBidWZmIFsyMF07Ci0KLQkJICBzcHJpbnRmX3ZtYSAoYnVmZiwgcC0+dm1hX3ZhbCk7Ci0JCSAgCi0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBub25fZmF0YWwgKF8oIldhcm5pbmc6IC0tY2hhbmdlLXNlY3Rpb24tdm1hICVzJWMweCVzIG5ldmVyIHVzZWQiKSwKLQkJCSAgICAgcC0+bmFtZSwKLQkJCSAgICAgcC0+Y2hhbmdlX3ZtYSA9PSBDSEFOR0VfU0VUID8gJz0nIDogJysnLAotCQkJICAgICBidWZmKTsKLQkJfQotCSAgICAgIAotCSAgICAgIGlmIChwLT5jaGFuZ2VfbG1hICE9IENIQU5HRV9JR05PUkUpCi0JCXsKLQkJICBjaGFyIGJ1ZmYgWzIwXTsKLQotCQkgIHNwcmludGZfdm1hIChidWZmLCBwLT5sbWFfdmFsKTsKLQkJICAKLQkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgIG5vbl9mYXRhbCAoXygiV2FybmluZzogLS1jaGFuZ2Utc2VjdGlvbi1sbWEgJXMlYzB4JXMgbmV2ZXIgdXNlZCIpLAotCQkJICAgICBwLT5uYW1lLAotCQkJICAgICBwLT5jaGFuZ2VfbG1hID09IENIQU5HRV9TRVQgPyAnPScgOiAnKycsCi0JCQkgICAgIGJ1ZmYpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIFNUQVJUX1BST0dSRVNTIChwcm9ncmFtX25hbWUsIDApOwotCi0gIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9VTkRFRjsKLSAgZGlzY2FyZF9sb2NhbHMgPSBMT0NBTFNfVU5ERUY7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgaWYgKGlzX3N0cmlwIDwgMCkKLSAgICB7Ci0gICAgICBpbnQgaSA9IHN0cmxlbiAocHJvZ3JhbV9uYW1lKTsKLSAgICAgIGlzX3N0cmlwID0gKGkgPj0gNSAmJiBzdHJjbXAgKHByb2dyYW1fbmFtZSArIGkgLSA1LCAic3RyaXAiKSA9PSAwKTsKLSAgICB9Ci0KLSAgaWYgKGlzX3N0cmlwKQotICAgIHN0cmlwX21haW4gKGFyZ2MsIGFyZ3YpOwotICBlbHNlCi0gICAgY29weV9tYWluIChhcmdjLCBhcmd2KTsKLQotICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL29iamR1bXAuMSBiL2JpbnV0aWxzL29iamR1bXAuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjMTUzZS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9vYmpkdW1wLjEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIG9iamR1bXAgMSAiNSBOb3ZlbWJlciAxOTkxIiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotb2JqZHVtcCBcLSBkaXNwbGF5IGluZm9ybWF0aW9uIGZyb20gb2JqZWN0IGZpbGVzLgotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgb2JqZHVtcAotLlJCICJbXHwiIFwtYSB8IFwtXC1hcmNoaXZlXC1oZWFkZXJzICJcfF0iIAotLlJCICJbXHwiICJcLWJcICJcYwotLkkgYmZkbmFtZVxjCi0uUkIgIiB8ICIgIlwtXC10YXJnZXQ9IlxjCi0uSSBiZmRuYW1lXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtQyB8IFwtXC1kZW1hbmdsZSAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtZGVidWdnaW5nICJcfF0iIAotLlJCICJbXHwiIFwtZCB8IFwtXC1kaXNhc3NlbWJsZSAiXHxdIiAKLS5SQiAiW1x8IiBcLUQgfCBcLVwtZGlzYXNzZW1ibGUtYWxsICJcfF0iIAotLlJCICJbXHwiIFwtXC1kaXNhc3NlbWJsZVwtemVyb2VzICJcfF0iIAotLlJCICJbXHwiIFwtRUIgfCBcLUVMIHwgXC1cLWVuZGlhbj1cYwotLkkge2JpZ3xsaXR0bGV9XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1mIHwgXC1cLWZpbGVcLWhlYWRlcnMgIlx8XSIKLS5SQiAiW1x8IiBcLWggfCBcLVwtc2VjdGlvblwtaGVhZGVycwotLlJCICJ8ICIgXC1cLWhlYWRlcnMgIlx8XSIgCi0uUkIgIltcfCIgXC1pIHwgXC1cLWluZm8gIlx8XSIgCi0uUkIgIltcfCIgIlwtalwgIlxjCi0uSSBzZWN0aW9uXGMKLS5SQiAiIHwgIiAiXC1cLXNlY3Rpb249IlxjCi0uSSBzZWN0aW9uXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtbCB8IFwtXC1saW5lXC1udW1iZXJzICJcfF0iCi0uUkIgIltcfCIgIlwtbVwgIlxjCi0uSSBtYWNoaW5lXGMKLS5SQiAiIHwgIiAiXC1cLWFyY2hpdGVjdHVyZT0iXGMKLS5JIG1hY2hpbmVcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1wIHwgXC1cLXByaXZhdGVcLWhlYWRlcnMgIlx8XSIgCi0uUkIgIltcfCIgXC1cLXByZWZpeFwtYWRkcmVzc2VzICJcfF0iIAotLlJCICJbXHwiIFwtciB8IFwtXC1yZWxvYyAiXHxdIiAKLS5SQiAiW1x8IiBcLVIgfCBcLVwtZHluYW1pY1wtcmVsb2MgIlx8XSIgCi0uUkIgIltcfCIgXC1zIHwgXC1cLWZ1bGxcLWNvbnRlbnRzICJcfF0iCi0uUkIgIltcfCIgXC1TIHwgXC1cLXNvdXJjZSAiXHxdIgotLlJCICJbXHwiIFwtXC1bbm9cLV1zaG93XC1yYXdcLWluc24gIlx8XSIgCi0uUkIgIltcfCIgXC1cLXN0YWJzICJcfF0iCi0uUkIgIltcfCIgXC10IHwgXC1cLXN5bXMgIlx8XSIgCi0uUkIgIltcfCIgXC1UIHwgXC1cLWR5bmFtaWNcLXN5bXMgIlx8XSIgCi0uUkIgIltcfCIgXC14IHwgXC1cLWFsbFwtaGVhZGVycyAiXHxdIgotLlJCICJbXHwiICJcLVwtc3RhcnRcLWFkZHJlc3M9IlxjCi0uSSBhZGRyZXNzXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtXC1zdG9wXC1hZGRyZXNzPSJcYwotLkkgYWRkcmVzc1xjCi1cJlx8XQotLlJCICJbXHwiICJcLVwtYWRqdXN0XC12bWE9IlxjCi0uSSBvZmZzZXRcYwotXCZcfF0KLS5SQiAiW1x8IiBcLVwtdmVyc2lvbiAiXHxdIgotLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iCi0uSSBvYmpmaWxlXGMKLVwmLlx8Llx8LgotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLVxjCi0uQiBvYmpkdW1wXGMKLVwmIGRpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBvciBtb3JlIG9iamVjdCBmaWxlcy4KLVRoZSBvcHRpb25zIGNvbnRyb2wgd2hhdCBwYXJ0aWN1bGFyIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkuICBUaGlzCi1pbmZvcm1hdGlvbiBpcyBtb3N0bHkgdXNlZnVsIHRvIHByb2dyYW1tZXJzIHdobyBhcmUgd29ya2luZyBvbiB0aGUKLWNvbXBpbGF0aW9uIHRvb2xzLCBhcyBvcHBvc2VkIHRvIHByb2dyYW1tZXJzIHdobyBqdXN0IHdhbnQgdGhlaXIKLXByb2dyYW0gdG8gY29tcGlsZSBhbmQgd29yay4KLS5QUAotLklSICAib2JqZmlsZSIgLlx8Llx8LgotYXJlIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUgZXhhbWluZWQuICBXaGVuIHlvdSBzcGVjaWZ5IGFyY2hpdmVzLAotXGMKLS5CIG9iamR1bXBcYwotXCYgc2hvd3MgaW5mb3JtYXRpb24gb24gZWFjaCBvZiB0aGUgbWVtYmVyIG9iamVjdCBmaWxlcy4KLQotLlNIIE9QVElPTlMKLVdoZXJlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIGFuIG9wdGlvbiBhcmUgc2hvd24gdG9nZXRoZXIsIHRoZXkgYXJlCi1lcXVpdmFsZW50LiAgQXQgbGVhc3Qgb25lIG9wdGlvbiBiZXNpZGVzCi0uQiBcLWwKLShcZkJcLVwtbGluZVwtbnVtYmVyc1xmUCkgbXVzdCBiZSBnaXZlbi4KLQotLlRQCi0uQiBcLWEKLS5UUAotLkIgXC1cLWFyY2hpdmVcLWhlYWRlcnMKLUlmIGFueSBmaWxlcyBmcm9tIFxjCi0uSSBvYmpmaWxlXGMKLVwmIGFyZSBhcmNoaXZlcywgZGlzcGxheSB0aGUgYXJjaGl2ZQotaGVhZGVyIGluZm9ybWF0aW9uIChpbiBhIGZvcm1hdCBzaW1pbGFyIHRvIGBcfFxjCi0uQiBscyBcLWxcYwotXHwnKS4gIEJlc2lkZXMgdGhlCi1pbmZvcm1hdGlvbiB5b3UgY291bGQgbGlzdCB3aXRoIGBcfFxjCi0uQiBhciB0dlxjCi1cfCcsIGBcfFxjCi0uQiBvYmpkdW1wIFwtYVxjCi1cfCcgc2hvd3MKLXRoZSBvYmplY3QgZmlsZSBmb3JtYXQgb2YgZWFjaCBhcmNoaXZlIG1lbWJlci4KLQotLlRQCi0uQkkgIlwtXC1hZGp1c3RcLXZtYT0iICJvZmZzZXQiCi1XaGVuIGR1bXBpbmcgaW5mb3JtYXRpb24sIGZpcnN0IGFkZAotLkkgb2Zmc2V0Ci10byBhbGwgdGhlIHNlY3Rpb24gYWRkcmVzc2VzLiAgVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHNlY3Rpb24gYWRkcmVzc2VzCi1kbyBub3QgY29ycmVzcG9uZCB0byB0aGUgc3ltYm9sIHRhYmxlLCB3aGljaCBjYW4gaGFwcGVuIHdoZW4gcHV0dGluZwotc2VjdGlvbnMgYXQgcGFydGljdWxhciBhZGRyZXNzZXMgd2hlbiB1c2luZyBhIGZvcm1hdCB3aGljaCBjYW4gbm90Ci1yZXByZXNlbnQgc2VjdGlvbiBhZGRyZXNzZXMsIHN1Y2ggYXMgYS5vdXQuCi0KLS5UUAotLkJJICJcLWIgIiAiYmZkbmFtZSJcYwotLlRQCi0uQkkgIlwtXC10YXJnZXQ9IiAiYmZkbmFtZSIKLVNwZWNpZnkgdGhlIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgdGhlIG9iamVjdCBmaWxlcyB0byBiZQotXGMKLS5JIGJmZG5hbWVcYwotXCYuICBUaGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBcYwotLkkgb2JqZHVtcFxjCi1cJiBjYW4KLWF1dG9tYXRpY2FsbHkgcmVjb2duaXplIG1hbnkgZm9ybWF0cy4gIEZvciBleGFtcGxlLAotLnNwCi0uYnIKLW9iamR1bXBcIFwtYlwgb2FzeXNcIFwtbVwgdmF4XCBcLWhcIGZ1Lm8KLS5icgotLnNwCi1kaXNwbGF5IHN1bW1hcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VjdGlvbiBoZWFkZXJzIChgXHxcYwotLkIgXC1oXGMKLVx8Jykgb2YKLWBcfFxjCi0uQiBmdS5vXGMKLVx8Jywgd2hpY2ggaXMgZXhwbGljaXRseSBpZGVudGlmaWVkIChgXHxcYwotLkIgXC1tXGMKLVx8JykgYXMgYSBWYXggb2JqZWN0Ci1maWxlIGluIHRoZSBmb3JtYXQgcHJvZHVjZWQgYnkgT2FzeXMgY29tcGlsZXJzLiAgWW91IGNhbiBsaXN0IHRoZQotZm9ybWF0cyBhdmFpbGFibGUgd2l0aCB0aGUgYFx8XGMKLS5CIFwtaVxjCi1cfCcgb3B0aW9uLgotCi0uVFAKLS5CIFwtQwotLlRQCi0uQiBcLVwtZGVtYW5nbGUKLURlY29kZSAoXGZJZGVtYW5nbGVcZlApIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgotQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCi1tYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuCi0KLS5UUAotLkIgXC1cLWRlYnVnZ2luZwotRGlzcGxheSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGF0dGVtcHRzIHRvIHBhcnNlIGRlYnVnZ2luZwotaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBmaWxlIGFuZCBwcmludCBpdCBvdXQgdXNpbmcgYSBDIGxpa2Ugc3ludGF4LgotT25seSBjZXJ0YWluIHR5cGVzIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCi0KLS5UUAotLkIgXC1kCi0uVFAKLS5CIFwtXC1kaXNhc3NlbWJsZQotRGlzcGxheSB0aGUgYXNzZW1ibGVyIG1uZW1vbmljcyBmb3IgdGhlIG1hY2hpbmUKLWluc3RydWN0aW9ucyBmcm9tIFxjCi0uSSBvYmpmaWxlXGMKLVwmLgotVGhpcyBvcHRpb24gb25seSBkaXNhc3NlbWJsZXMgdGhvc2Ugc2VjdGlvbnMgd2hpY2ggYXJlCi1leHBlY3RlZCB0byBjb250YWluIGluc3RydWN0aW9ucy4KLQotLlRQCi0uQiBcLUQKLS5UUAotLkIgXC1cLWRpc2Fzc2VtYmxlLWFsbAotTGlrZSBcZkJcLWRcZlAsIGJ1dCBkaXNhc3NlbWJsZSB0aGUgY29udGVudHMgb2YgYWxsIHNlY3Rpb25zLCBub3QganVzdAotdGhvc2UgZXhwZWN0ZWQgdG8gY29udGFpbiBpbnN0cnVjdGlvbnMuCi0KLS5UUAotLkIgXC1cLXByZWZpeFwtYWRkcmVzc2VzCi1XaGVuIGRpc2Fzc2VtYmxpbmcsIHByaW50IHRoZSBjb21wbGV0ZSBhZGRyZXNzIG9uIGVhY2ggbGluZS4gIFRoaXMgaXMKLXRoZSBvbGRlciBkaXNhc3NlbWJseSBmb3JtYXQuCi0KLS5UUAotLkIgXC1cLWRpc2Fzc2VtYmxlXC16ZXJvZXMKLU5vcm1hbGx5IHRoZSBkaXNhc3NlbWJseSBvdXRwdXQgd2lsbCBza2lwIGJsb2NrcyBvZiB6ZXJvZXMuICBUaGlzCi1vcHRpb24gZGlyZWN0cyB0aGUgZGlzYXNzZW1ibGVyIHRvIGRpc2Fzc2VtYmxlIHRob3NlIGJsb2NrcywganVzdCBsaWtlCi1hbnkgb3RoZXIgZGF0YS4KLQotLlRQCi0uQiBcLUVCCi0uVFAKLS5CIFwtRUwKLS5UUAotLkJJICJcLVwtZW5kaWFuPSIgIntiaWd8bGl0dGxlfSIKLVNwZWNpZnkgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIG9iamVjdCBmaWxlcy4gIFRoaXMgb25seSBhZmZlY3RzCi1kaXNhc3NlbWJseS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGRpc2Fzc2VtYmxpbmcgYSBmaWxlIGZvcm1hdCB3aGljaAotZG9lcyBub3QgZGVzY3JpYmUgZW5kaWFubmVzcyBpbmZvcm1hdGlvbiwgc3VjaCBhcyBTLXJlY29yZHMuCi0KLS5UUAotLkIgXC1mCi0uVFAKLS5CIFwtXC1maWxlXC1oZWFkZXJzCi1EaXNwbGF5IHN1bW1hcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3ZlcmFsbCBoZWFkZXIgb2YKLWVhY2ggZmlsZSBpbiBcYwotLkkgb2JqZmlsZVxjCi1cJi4KLQotLlRQCi0uQiBcLWgKLS5UUAotLkIgXC1cLXNlY3Rpb25cLWhlYWRlcnMKLS5UUAotLkIgXC1cLWhlYWRlcnMKLURpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgb2YgdGhlCi1vYmplY3QgZmlsZS4KLQotLlRQCi0uQiBcLVwtaGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCi0uQiBvYmpkdW1wCi1hbmQgZXhpdC4KLQotLlRQCi0uQiBcLWkKLS5UUAotLkIgXC1cLWluZm8KLURpc3BsYXkgYSBsaXN0IHNob3dpbmcgYWxsIGFyY2hpdGVjdHVyZXMgYW5kIG9iamVjdCBmb3JtYXRzIGF2YWlsYWJsZQotZm9yIHNwZWNpZmljYXRpb24gd2l0aCBcYwotLkIgXC1iXGMKLVwmIG9yIFxjCi0uQiBcLW1cYwotXCYuCi0KLS5UUAotLkJJICJcLWogIiAibmFtZSJcYwotLlRQCi0uQkkgIlwtXC1zZWN0aW9uPSIgIm5hbWUiCi1EaXNwbGF5IGluZm9ybWF0aW9uIG9ubHkgZm9yIHNlY3Rpb24gXGMKLS5JIG5hbWVcYwotXCYuCi0KLS5UUAotLkIgXC1sCi0uVFAKLS5CIFwtXC1saW5lXC1udW1iZXJzCi1MYWJlbCB0aGUgZGlzcGxheSAodXNpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uKSB3aXRoIHRoZSBmaWxlbmFtZQotYW5kIHNvdXJjZSBsaW5lIG51bWJlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0IGNvZGUgc2hvd24uCi1Pbmx5IHVzZWZ1bCB3aXRoIFxmQlwtZFxmUCwgXGZCXC1EXGZQLCBvciBcZkJcLXJcZlAuCi0KLS5UUAotLkJJICJcLW0gIiAibWFjaGluZSJcYwotLlRQCi0uQkkgIlwtXC1hcmNoaXRlY3R1cmU9IiAibWFjaGluZSIKLVNwZWNpZnkgdGhlIGFyY2hpdGVjdHVyZSB0byB1c2Ugd2hlbiBkaXNhc3NlbWJsaW5nIG9iamVjdCBmaWxlcy4gIFRoaXMKLWNhbiBiZSB1c2VmdWwgd2hlbiBkaXNhc3NlbWJsaW5nIG9iamVjdCBmaWxlcyB3aGljaCBkbyBub3QgZGVzY3JpYmUKLWFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBTLXJlY29yZHMuICBZb3UgY2FuIGxpc3QgdGhlIGF2YWlsYWJsZQotYXJjaGl0ZWN0dXJlcyB3aXRoIHRoZSBcZkJcLWlcZlAgb3B0aW9uLiAKLQotLlRQCi0uQiBcLXAKLS5UUAotLkIgXC1cLXByaXZhdGVcLWhlYWRlcnMKLVByaW50IGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZQotZXhhY3QgaW5mb3JtYXRpb24gcHJpbnRlZCBkZXBlbmRzIHVwb24gdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gIEZvcgotc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLCBubyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIHByaW50ZWQuCi0KLS5UUAotLkIgXC1yCi0uVFAKLS5CIFwtXC1yZWxvYwotUHJpbnQgdGhlIHJlbG9jYXRpb24gZW50cmllcyBvZiB0aGUgZmlsZS4gIElmIHVzZWQgd2l0aCBcZkJcLWRcZlAgb3IKLVxmQlwtRFxmUCwgdGhlIHJlbG9jYXRpb25zIGFyZSBwcmludGVkIGludGVyc3BlcnNlZCB3aXRoIHRoZQotZGlzYXNzZW1ibHkuCi0KLS5UUAotLkIgXC1SCi0uVFAKLS5CIFwtXC1keW5hbWljXC1yZWxvYwotUHJpbnQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzIG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBvbmx5Ci1tZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKLWxpYnJhcmllcy4KLQotLlRQCi0uQiBcLXMKLS5UUAotLkIgXC1cLWZ1bGxcLWNvbnRlbnRzCi1EaXNwbGF5IHRoZSBmdWxsIGNvbnRlbnRzIG9mIGFueSBzZWN0aW9ucyByZXF1ZXN0ZWQuCi0KLS5UUAotLkIgXC1TCi0uVFAKLS5CIFwtXC1zb3VyY2UKLURpc3BsYXkgc291cmNlIGNvZGUgaW50ZXJtaXhlZCB3aXRoIGRpc2Fzc2VtYmx5LCBpZiBwb3NzaWJsZS4gIEltcGxpZXMKLVxmQi1kXGZQLgotCi0uVFAKLS5CIFwtXC1zaG93XC1yYXdcLWluc24KLVdoZW4gZGlzYXNzZW1ibGluZyBpbnN0cnVjdGlvbnMsIHByaW50IHRoZSBpbnN0cnVjdGlvbiBpbiBoZXggYXMgd2VsbCBhcwotaW4gc3ltYm9saWMgZm9ybS4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgZXhjZXB0IHdoZW4KLS5CIFwtXC1wcmVmaXhcLWFkZHJlc3NlcwotaXMgdXNlZC4KLQotLlRQCi0uQiBcLVwtbm9cLXNob3dcLXJhd1wtaW5zbgotV2hlbiBkaXNhc3NlbWJsaW5nIGluc3RydWN0aW9ucywgZG8gbm90IHByaW50IHRoZSBpbnN0cnVjdGlvbiBieXRlcy4KLVRoaXMgaXMgdGhlIGRlZmF1bHQgd2hlbgotLkIgXC1cLXByZWZpeFwtYWRkcmVzc2VzCi1pcyB1c2VkLgotCi0uVFAKLS5CIFwtXC1zdGFicwotRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIC5zdGFiLCAuc3RhYi5pbmRleCwgYW5kIC5zdGFiLmV4Y2wKLXNlY3Rpb25zIGZyb20gYW4gRUxGIGZpbGUuICBUaGlzIGlzIG9ubHkgdXNlZnVsIG9uIHN5c3RlbXMgKHN1Y2ggYXMKLVNvbGFyaXMgMi4wKSBpbiB3aGljaCAuc3RhYiBkZWJ1Z2dpbmcgc3ltYm9sLXRhYmxlIGVudHJpZXMgYXJlIGNhcnJpZWQKLWluIGFuIEVMRiBzZWN0aW9uLiAgSW4gbW9zdCBvdGhlciBmaWxlIGZvcm1hdHMsIGRlYnVnZ2luZyBzeW1ib2wtdGFibGUKLWVudHJpZXMgYXJlIGludGVybGVhdmVkIHdpdGggbGlua2FnZSBzeW1ib2xzLCBhbmQgYXJlIHZpc2libGUgaW4gdGhlCi0uQiBcLVwtc3ltcwotb3V0cHV0LgotCi0uVFAKLS5CSSAiXC1cLXN0YXJ0XC1hZGRyZXNzPSIgImFkZHJlc3MiCi1TdGFydCBkaXNwbGF5aW5nIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhpcyBhZmZlY3RzIHRoZSBvdXRwdXQKLW9mIHRoZQotLkIgXC1kXGMKLSwKLS5CIFwtcgotYW5kCi0uQiBcLXMKLW9wdGlvbnMuCi0KLS5UUAotLkJJICJcLVwtc3RvcFwtYWRkcmVzcz0iICJhZGRyZXNzIgotU3RvcCBkaXNwbGF5aW5nIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhpcyBhZmZlY3RzIHRoZSBvdXRwdXQKLW9mIHRoZQotLkIgXC1kXGMKLSwKLS5CIFwtcgotYW5kCi0uQiBcLXMKLW9wdGlvbnMuCi0KLS5UUAotLkIgXC10Ci0uVFAKLS5CIFwtXC1zeW1zCi1TeW1ib2wgVGFibGUuICBQcmludCB0aGUgc3ltYm9sIHRhYmxlIGVudHJpZXMgb2YgdGhlIGZpbGUuCi1UaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBgXHxcYwotLkIgbm1cYwotXHwnIHByb2dyYW0uCi0KLS5UUAotLkIgXC1UCi0uVFAKLS5CIFwtXC1keW5hbWljXC1zeW1zCi1EeW5hbWljIFN5bWJvbCBUYWJsZS4gIFByaW50IHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzIG9mIHRoZQotZmlsZS4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbgotdHlwZXMgb2Ygc2hhcmVkIGxpYnJhcmllcy4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgaW5mb3JtYXRpb24KLXByb3ZpZGVkIGJ5IHRoZSBgXHxcYwotLkIgbm1cYwotXHwnIHByb2dyYW0gd2hlbiBnaXZlbiB0aGUKLS5CIFwtRCAoXC1cLWR5bmFtaWMpCi1vcHRpb24uCi0KLS5UUAotLkIgXC1cLXZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgb2JqZHVtcAotYW5kIGV4aXQuCi0KLS5UUAotLkIgXC14Ci0uVFAKLS5CIFwtXC1hbGxcLWhlYWRlcnMKLURpc3BsYXkgYWxsIGF2YWlsYWJsZSBoZWFkZXIgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgc3ltYm9sIHRhYmxlIGFuZAotcmVsb2NhdGlvbiBlbnRyaWVzLiAgVXNpbmcgYFx8XGMKLS5CIFwteFxjCi1cfCcgaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIGFsbCBvZgotYFx8XGMKLS5CIFwtYSBcLWYgXC1oIFwtciBcLXRcYwotXHwnLgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsgCi0uQlIgbm0gIigiIDEgIikuIgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvb2JqZHVtcC5jIGIvYmludXRpbHMvb2JqZHVtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGM5MmU3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL29iamR1bXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI5NjcgKzAsMCBAQAotLyogb2JqZHVtcC5jIC0tIGR1bXAgaW5mb3JtYXRpb24gYWJvdXQgYW4gb2JqZWN0IGZpbGUuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotLyogSW50ZXJuYWwgaGVhZGVycyBmb3IgdGhlIEVMRiAuc3RhYi1kdW1wIGNvZGUgLSBzb3JyeS4gICovCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJMzIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGCi0vKiBUaGlzIGlzIG5lZWRlZCBieSBJTklUX0RJU0FTU0VNQkxFX0lORk8uICAqLwotZXh0ZXJuIGludCBmcHJpbnRmIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLSNlbmRpZgotCi0vKiBFeGl0IHN0YXR1cy4gICovCi1zdGF0aWMgaW50IGV4aXRfc3RhdHVzID0gMDsKLQotc3RhdGljIGNoYXIgKmRlZmF1bHRfdGFyZ2V0ID0gTlVMTDsJLyogZGVmYXVsdCBhdCBydW50aW1lICovCi0KLXN0YXRpYyBpbnQgc2hvd192ZXJzaW9uID0gMDsJCS8qIHNob3cgdGhlIHZlcnNpb24gbnVtYmVyICovCi1zdGF0aWMgaW50IGR1bXBfc2VjdGlvbl9jb250ZW50czsJLyogLXMgKi8KLXN0YXRpYyBpbnQgZHVtcF9zZWN0aW9uX2hlYWRlcnM7CS8qIC1oICovCi1zdGF0aWMgYm9vbGVhbiBkdW1wX2ZpbGVfaGVhZGVyOwkvKiAtZiAqLwotc3RhdGljIGludCBkdW1wX3N5bXRhYjsJCQkvKiAtdCAqLwotc3RhdGljIGludCBkdW1wX2R5bmFtaWNfc3ltdGFiOwkJLyogLVQgKi8KLXN0YXRpYyBpbnQgZHVtcF9yZWxvY19pbmZvOwkJLyogLXIgKi8KLXN0YXRpYyBpbnQgZHVtcF9keW5hbWljX3JlbG9jX2luZm87CS8qIC1SICovCi1zdGF0aWMgaW50IGR1bXBfYXJfaGRyczsJCS8qIC1hICovCi1zdGF0aWMgaW50IGR1bXBfcHJpdmF0ZV9oZWFkZXJzOwkvKiAtcCAqLwotc3RhdGljIGludCBwcmVmaXhfYWRkcmVzc2VzOwkJLyogLS1wcmVmaXgtYWRkcmVzc2VzICovCi1zdGF0aWMgaW50IHdpdGhfbGluZV9udW1iZXJzOwkJLyogLWwgKi8KLXN0YXRpYyBib29sZWFuIHdpdGhfc291cmNlX2NvZGU7CS8qIC1TICovCi1zdGF0aWMgaW50IHNob3dfcmF3X2luc247CQkvKiAtLXNob3ctcmF3LWluc24gKi8KLXN0YXRpYyBpbnQgZHVtcF9zdGFiX3NlY3Rpb25faW5mbzsJLyogLS1zdGFicyAqLwotc3RhdGljIGludCBkb19kZW1hbmdsZTsJCQkvKiAtQywgLS1kZW1hbmdsZSAqLwotc3RhdGljIGJvb2xlYW4gZGlzYXNzZW1ibGU7CQkvKiAtZCAqLwotc3RhdGljIGJvb2xlYW4gZGlzYXNzZW1ibGVfYWxsOwkJLyogLUQgKi8KLXN0YXRpYyBpbnQgZGlzYXNzZW1ibGVfemVyb2VzOwkJLyogLS1kaXNhc3NlbWJsZS16ZXJvZXMgKi8KLXN0YXRpYyBib29sZWFuIGZvcm1hdHNfaW5mbzsJCS8qIC1pICovCi1zdGF0aWMgY2hhciAqb25seTsJCQkvKiAtaiBzZWNuYW1lICovCi1zdGF0aWMgaW50IHdpZGVfb3V0cHV0OwkJCS8qIC13ICovCi1zdGF0aWMgYmZkX3ZtYSBzdGFydF9hZGRyZXNzID0gKGJmZF92bWEpIC0xOyAvKiAtLXN0YXJ0LWFkZHJlc3MgKi8KLXN0YXRpYyBiZmRfdm1hIHN0b3BfYWRkcmVzcyA9IChiZmRfdm1hKSAtMTsgIC8qIC0tc3RvcC1hZGRyZXNzICovCi1zdGF0aWMgaW50IGR1bXBfZGVidWdnaW5nOwkJLyogLS1kZWJ1Z2dpbmcgKi8KLXN0YXRpYyBiZmRfdm1hIGFkanVzdF9zZWN0aW9uX3ZtYSA9IDA7CS8qIC0tYWRqdXN0LXZtYSAqLwotCi0vKiBFeHRyYSBpbmZvIHRvIHBhc3MgdG8gdGhlIGRpc2Fzc2VtYmxlciBhZGRyZXNzIHByaW50aW5nIGZ1bmN0aW9uLiAgKi8KLXN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvIHsKLSAgYmZkICphYmZkOwotICBhc2VjdGlvbiAqc2VjOwotICBib29sZWFuIHJlcXVpcmVfc2VjOwotfTsKLQotLyogQXJjaGl0ZWN0dXJlIHRvIGRpc2Fzc2VtYmxlIGZvciwgb3IgZGVmYXVsdCBpZiBOVUxMLiAgKi8KLXN0YXRpYyBjaGFyICptYWNoaW5lID0gKGNoYXIgKikgTlVMTDsKLQotLyogVGFyZ2V0IHNwZWNpZmljIG9wdGlvbnMgdG8gdGhlIGRpc2Fzc2VtYmxlci4gICovCi1zdGF0aWMgY2hhciAqZGlzYXNzZW1ibGVyX29wdGlvbnMgPSAoY2hhciAqKSBOVUxMOwotCi0vKiBFbmRpYW5uZXNzIHRvIGRpc2Fzc2VtYmxlIGZvciwgb3IgZGVmYXVsdCBpZiBCRkRfRU5ESUFOX1VOS05PV04uICAqLwotc3RhdGljIGVudW0gYmZkX2VuZGlhbiBlbmRpYW4gPSBCRkRfRU5ESUFOX1VOS05PV047Ci0KLS8qIFRoZSBzeW1ib2wgdGFibGUuICAqLwotc3RhdGljIGFzeW1ib2wgKipzeW1zOwotCi0vKiBOdW1iZXIgb2Ygc3ltYm9scyBpbiBgc3ltcycuICAqLwotc3RhdGljIGxvbmcgc3ltY291bnQgPSAwOwotCi0vKiBUaGUgc29ydGVkIHN5bWJvbCB0YWJsZS4gICovCi1zdGF0aWMgYXN5bWJvbCAqKnNvcnRlZF9zeW1zOwotCi0vKiBOdW1iZXIgb2Ygc3ltYm9scyBpbiBgc29ydGVkX3N5bXMnLiAgKi8KLXN0YXRpYyBsb25nIHNvcnRlZF9zeW1jb3VudCA9IDA7Ci0KLS8qIFRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCi1zdGF0aWMgYXN5bWJvbCAqKmR5bnN5bXM7Ci0KLS8qIE51bWJlciBvZiBzeW1ib2xzIGluIGBkeW5zeW1zJy4gICovCi1zdGF0aWMgbG9uZyBkeW5zeW1jb3VudCA9IDA7Ci0KLS8qIFN0YXRpYyBkZWNsYXJhdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLW5vbmZhdGFsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lLCBjaGFyICp0YXJnZXQpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfc2VjdGlvbl9oZWFkZXIgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2RhdGEgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3JlbG9jcyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfZHluYW1pY19yZWxvY3MgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9yZWxvY19zZXQgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGxvbmcpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfc3ltYm9scyBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gZHluYW1pYykpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9iZmRfaGVhZGVyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2JmZF9wcml2YXRlX2hlYWRlciBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9iZmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3RhcmdldF9saXN0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfaW5mb190YWJsZSBQQVJBTVMgKChpbnQsIGludCkpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV90YXJnZXRfdGFibGVzIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfaW5mbyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X3ZhbHVlIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJvb2xlYW4pKTsKLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfc3ltbmFtZSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYXN5bWJvbCAqKSk7Ci0KLXN0YXRpYyBhc3ltYm9sICoKLWZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBib29sZWFuLCBsb25nICopKTsKLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqLCBiZmRfdm1hLAotCQkJCSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYm9vbGVhbikpOwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9hZGRyIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJvb2xlYW4pKTsKLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkcmVzcyBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zaG93X2xpbmUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlX2J5dGVzIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGRpc2Fzc2VtYmxlcl9mdHlwZSwKLQkJCSAgIGJvb2xlYW4sIGJmZF9ieXRlICosIGJmZF92bWEsIGJmZF92bWEsCi0JCQkgICBhcmVsZW50ICoqKiwgYXJlbGVudCAqKikpOwotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGVfZGF0YSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1lbmRpYW5fc3RyaW5nIFBBUkFNUyAoKGVudW0gYmZkX2VuZGlhbikpOwotCi1zdGF0aWMgYXN5bWJvbCAqKgotc2x1cnBfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBhc3ltYm9sICoqCi1zbHVycF9keW5hbWljX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgbG9uZwotcmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyBQQVJBTVMgKChhc3ltYm9sICoqLCBsb25nKSk7Ci0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfc3ltYm9scyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1jb21wYXJlX3JlbG9jcyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9zdGFicyBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotcmVhZF9zZWN0aW9uX3N0YWJzIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc2VjdGlvbl9zdGFicyBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQwKLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJVc2FnZTogJXMgPHN3aXRjaGVzPiBmaWxlKHMpXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3dpdGNoZXMgbXVzdCBiZSBnaXZlbjpcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1hICAtLWFyY2hpdmUtaGVhZGVycyAgICBEaXNwbGF5IGFyY2hpdmUgaGVhZGVyIGluZm9ybWF0aW9uXG5cCi0gIC1mICAtLWZpbGUtaGVhZGVycyAgICAgICBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgb3ZlcmFsbCBmaWxlIGhlYWRlclxuXAotICAtcCAgLS1wcml2YXRlLWhlYWRlcnMgICAgRGlzcGxheSBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGZpbGUgaGVhZGVyIGNvbnRlbnRzXG5cCi0gIC1oICAtLVtzZWN0aW9uLV1oZWFkZXJzICBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBoZWFkZXJzXG5cCi0gIC14ICAtLWFsbC1oZWFkZXJzICAgICAgICBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiBhbGwgaGVhZGVyc1xuXAotICAtZCAgLS1kaXNhc3NlbWJsZSAgICAgICAgRGlzcGxheSBhc3NlbWJsZXIgY29udGVudHMgb2YgZXhlY3V0YWJsZSBzZWN0aW9uc1xuXAotICAtRCAgLS1kaXNhc3NlbWJsZS1hbGwgICAgRGlzcGxheSBhc3NlbWJsZXIgY29udGVudHMgb2YgYWxsIHNlY3Rpb25zXG5cCi0gIC1TICAtLXNvdXJjZSAgICAgICAgICAgICBJbnRlcm1peCBzb3VyY2UgY29kZSB3aXRoIGRpc2Fzc2VtYmx5XG5cCi0gIC1zICAtLWZ1bGwtY29udGVudHMgICAgICBEaXNwbGF5IHRoZSBmdWxsIGNvbnRlbnRzIG9mIGFsbCBzZWN0aW9ucyByZXF1ZXN0ZWRcblwKLSAgLWcgIC0tZGVidWdnaW5nICAgICAgICAgIERpc3BsYXkgZGVidWcgaW5mb3JtYXRpb24gaW4gb2JqZWN0IGZpbGVcblwKLSAgLUcgIC0tc3RhYnMgICAgICAgICAgICAgIERpc3BsYXkgdGhlIFNUQUJTIGNvbnRlbnRzIG9mIGFuIEVMRiBmb3JtYXQgZmlsZVxuXAotICAtdCAgLS1zeW1zICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIHN5bWJvbCB0YWJsZShzKVxuXAotICAtVCAgLS1keW5hbWljLXN5bXMgICAgICAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlXG5cCi0gIC1yICAtLXJlbG9jICAgICAgICAgICAgICBEaXNwbGF5IHRoZSByZWxvY2F0aW9uIGVudHJpZXMgaW4gdGhlIGZpbGVcblwKLSAgLVIgIC0tZHluYW1pYy1yZWxvYyAgICAgIERpc3BsYXkgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzIGluIHRoZSBmaWxlXG5cCi0gIC1WICAtLXZlcnNpb24gICAgICAgICAgICBEaXNwbGF5IHRoaXMgcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyXG5cCi0gIC1pICAtLWluZm8gICAgICAgICAgICAgICBMaXN0IG9iamVjdCBmb3JtYXRzIGFuZCBhcmNoaXRlY3R1cmVzIHN1cHBvcnRlZFxuXAotICAtSCAgLS1oZWxwICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGluZm9ybWF0aW9uXG5cCi0iKSk7Ci0gIGlmIChzdGF0dXMgIT0gMikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuIFRoZSBmb2xsb3dpbmcgc3dpdGNoZXMgYXJlIG9wdGlvbmFsOlxuIikpOwotICAgICAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1iICAtLXRhcmdldCA8YmZkbmFtZT4gICAgICAgICBTcGVjaWZ5IHRoZSB0YXJnZXQgb2JqZWN0IGZvcm1hdCBhcyA8YmZkbmFtZT5cblwKLSAgLW0gIC0tYXJjaGl0ZWN0dXJlIDxtYWNoaW5lPiAgIFNwZWNpZnkgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgYXMgPG1hY2hpbmU+XG5cCi0gIC1qICAtLXNlY3Rpb24gPG5hbWU+ICAgICAgICAgICBPbmx5IGRpc3BsYXkgaW5mb3JtYXRpb24gZm9yIHNlY3Rpb24gPG5hbWU+XG5cCi0gIC1NICAtLWRpc2Fzc2VtYmxlci1vcHRpb25zIDxvPiBQYXNzIHRleHQgPG8+IG9uIHRvIHRoZSBkaXNhc3NlbWJsZXJcblwKLSAgLUVCIC0tZW5kaWFuPWJpZyAgICAgICAgICAgICAgIEFzc3VtZSBiaWcgZW5kaWFuIGZvcm1hdCB3aGVuIGRpc2Fzc2VtYmxpbmdcblwKLSAgLUVMIC0tZW5kaWFuPWxpdHRsZSAgICAgICAgICAgIEFzc3VtZSBsaXR0bGUgZW5kaWFuIGZvcm1hdCB3aGVuIGRpc2Fzc2VtYmxpbmdcblwKLSAgLWwgIC0tbGluZS1udW1iZXJzICAgICAgICAgICAgIEluY2x1ZGUgbGluZSBudW1iZXJzIGFuZCBmaWxlbmFtZXMgaW4gb3V0cHV0XG5cCi0gIC1DICAtLWRlbWFuZ2xlICAgICAgICAgICAgICAgICBEZWNvZGUgbWFuZ2xlZC9wcm9jZXNzZWQgc3ltYm9sIG5hbWVzXG5cCi0gIC13ICAtLXdpZGUgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgb3V0cHV0IGZvciBtb3JlIHRoYW4gODAgY29sdW1uc1xuXAotICAteiAgLS1kaXNhc3NlbWJsZS16ZXJvZXMgICAgICAgRG8gbm90IHNraXAgYmxvY2tzIG9mIHplcm9lcyB3aGVuIGRpc2Fzc2VtYmxpbmdcblwKLSAgICAgIC0tc3RhcnQtYWRkcmVzcyA8YWRkcj4gICAgIE9ubHkgcHJvY2VzcyBkYXRhIHdob2VzIGFkZHJlc3MgaXMgPj0gPGFkZHI+XG5cCi0gICAgICAtLXN0b3AtYWRkcmVzcyA8YWRkcj4gICAgICBPbmx5IHByb2Nlc3MgZGF0YSB3aG9lcyBhZGRyZXNzIGlzIDw9IDxhZGRyPlxuXAotICAgICAgLS1wcmVmaXgtYWRkcmVzc2VzICAgICAgICAgUHJpbnQgY29tcGxldGUgYWRkcmVzcyBhbG9uZ3NpZGUgZGlzYXNzZW1ibHlcblwKLSAgICAgIC0tW25vLV1zaG93LXJhdy1pbnNuICAgICAgIERpc3BsYXkgaGV4IGFsb25nc2lkZSBzeW1ib2xpYyBkaXNhc3NlbWJseVxuXAotICAgICAgLS1hZGp1c3Qtdm1hIDxvZmZzZXQ+ICAgICAgQWRkIDxvZmZzZXQ+IHRvIGFsbCBkaXNwbGF5ZWQgc2VjdGlvbiBhZGRyZXNzZXNcblwKLVxuIikpOwotICAgICAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICAgIH0KLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLS8qIDE1MCBpc24ndCBzcGVjaWFsOyBpdCdzIGp1c3QgYW4gYXJiaXRyYXJ5IG5vbi1BU0NJSSBjaGFyIHZhbHVlLiAgKi8KLQotI2RlZmluZSBPUFRJT05fRU5ESUFOICgxNTApCi0jZGVmaW5lIE9QVElPTl9TVEFSVF9BRERSRVNTIChPUFRJT05fRU5ESUFOICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NUT1BfQUREUkVTUyAoT1BUSU9OX1NUQVJUX0FERFJFU1MgKyAxKQotI2RlZmluZSBPUFRJT05fQURKVVNUX1ZNQSAoT1BUSU9OX1NUT1BfQUREUkVTUyArIDEpCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdPQotewotICB7ImFkanVzdC12bWEiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FESlVTVF9WTUF9LAotICB7ImFsbC1oZWFkZXJzIiwgbm9fYXJndW1lbnQsIE5VTEwsICd4J30sCi0gIHsicHJpdmF0ZS1oZWFkZXJzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdwJ30sCi0gIHsiYXJjaGl0ZWN0dXJlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdtJ30sCi0gIHsiYXJjaGl2ZS1oZWFkZXJzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdhJ30sCi0gIHsiZGVidWdnaW5nIiwgbm9fYXJndW1lbnQsIE5VTEwsICdnJ30sCi0gIHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ0MnfSwKLSAgeyJkaXNhc3NlbWJsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZCd9LAotICB7ImRpc2Fzc2VtYmxlLWFsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnRCd9LAotICB7ImRpc2Fzc2VtYmxlci1vcHRpb25zIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdNJ30sCi0gIHsiZGlzYXNzZW1ibGUtemVyb2VzIiwgbm9fYXJndW1lbnQsIE5VTEwsICd6J30sCi0gIHsiZHluYW1pYy1yZWxvYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnUid9LAotICB7ImR5bmFtaWMtc3ltcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVCd9LAotICB7ImVuZGlhbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU5ESUFOfSwKLSAgeyJmaWxlLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2YnfSwKLSAgeyJmdWxsLWNvbnRlbnRzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCi0gIHsiaGVhZGVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaCd9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ0gnfSwKLSAgeyJpbmZvIiwgbm9fYXJndW1lbnQsIE5VTEwsICdpJ30sCi0gIHsibGluZS1udW1iZXJzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdsJ30sCi0gIHsibm8tc2hvdy1yYXctaW5zbiIsIG5vX2FyZ3VtZW50LCAmc2hvd19yYXdfaW5zbiwgLTF9LAotICB7InByZWZpeC1hZGRyZXNzZXMiLCBub19hcmd1bWVudCwgJnByZWZpeF9hZGRyZXNzZXMsIDF9LAotICB7InJlbG9jIiwgbm9fYXJndW1lbnQsIE5VTEwsICdyJ30sCi0gIHsic2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnaid9LAotICB7InNlY3Rpb24taGVhZGVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaCd9LAotICB7InNob3ctcmF3LWluc24iLCBub19hcmd1bWVudCwgJnNob3dfcmF3X2luc24sIDF9LAotICB7InNvdXJjZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnUyd9LAotICB7InN0YWJzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdHJ30sCi0gIHsic3RhcnQtYWRkcmVzcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RBUlRfQUREUkVTU30sCi0gIHsic3RvcC1hZGRyZXNzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVE9QX0FERFJFU1N9LAotICB7InN5bXMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3QnfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2InfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsICdWJ30sCi0gIHsid2lkZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndyd9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotDAotc3RhdGljIHZvaWQKLW5vbmZhdGFsIChtc2cpCi0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgYmZkX25vbmZhdGFsIChtc2cpOwotICBleGl0X3N0YXR1cyA9IDE7Ci19Ci0MCi1zdGF0aWMgdm9pZAotZHVtcF9zZWN0aW9uX2hlYWRlciAoYWJmZCwgc2VjdGlvbiwgaWdub3JlZCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgaWdub3JlZCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpjb21tYSA9ICIiOwotCi0gIHByaW50ZiAoIiUzZCAlLTEzcyAlMDhseCAgIiwgc2VjdGlvbi0+aW5kZXgsCi0JICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdGlvbiksCi0JICAodW5zaWduZWQgbG9uZykgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotICBwcmludGZfdm1hIChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKSk7Ci0gIHByaW50ZiAoIiAgIik7Ci0gIHByaW50Zl92bWEgKHNlY3Rpb24tPmxtYSk7Ci0gIHByaW50ZiAoIiAgJTA4bHggIDIqKiV1Iiwgc2VjdGlvbi0+ZmlsZXBvcywKLQkgIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlY3Rpb24pKTsKLSAgaWYgKCEgd2lkZV9vdXRwdXQpCi0gICAgcHJpbnRmICgiXG4gICAgICAgICAgICAgICAgIik7Ci0gIHByaW50ZiAoIiAgIik7Ci0KLSNkZWZpbmUgUEYoeCwgeSkgXAotICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiB4KSB7IHByaW50ZiAoIiVzJXMiLCBjb21tYSwgeSk7IGNvbW1hID0gIiwgIjsgfQotCi0gIFBGIChTRUNfSEFTX0NPTlRFTlRTLCAiQ09OVEVOVFMiKTsKLSAgUEYgKFNFQ19BTExPQywgIkFMTE9DIik7Ci0gIFBGIChTRUNfQ09OU1RSVUNUT1IsICJDT05TVFJVQ1RPUiIpOwotICBQRiAoU0VDX0NPTlNUUlVDVE9SX1RFWFQsICJDT05TVFJVQ1RPUiBURVhUIik7Ci0gIFBGIChTRUNfQ09OU1RSVUNUT1JfREFUQSwgIkNPTlNUUlVDVE9SIERBVEEiKTsKLSAgUEYgKFNFQ19DT05TVFJVQ1RPUl9CU1MsICJDT05TVFJVQ1RPUiBCU1MiKTsKLSAgUEYgKFNFQ19MT0FELCAiTE9BRCIpOwotICBQRiAoU0VDX1JFTE9DLCAiUkVMT0MiKTsKLSNpZmRlZiBTRUNfQkFMSUdOCi0gIFBGIChTRUNfQkFMSUdOLCAiQkFMSUdOIik7Ci0jZW5kaWYKLSAgUEYgKFNFQ19SRUFET05MWSwgIlJFQURPTkxZIik7Ci0gIFBGIChTRUNfQ09ERSwgIkNPREUiKTsKLSAgUEYgKFNFQ19EQVRBLCAiREFUQSIpOwotICBQRiAoU0VDX1JPTSwgIlJPTSIpOwotICBQRiAoU0VDX0RFQlVHR0lORywgIkRFQlVHR0lORyIpOwotICBQRiAoU0VDX05FVkVSX0xPQUQsICJORVZFUl9MT0FEIik7Ci0gIFBGIChTRUNfRVhDTFVERSwgIkVYQ0xVREUiKTsKLSAgUEYgKFNFQ19TT1JUX0VOVFJJRVMsICJTT1JUX0VOVFJJRVMiKTsKLSAgUEYgKFNFQ19TTUFMTF9EQVRBLCAiU01BTExfREFUQSIpOwotICBQRiAoU0VDX1NIQVJFRCwgIlNIQVJFRCIpOwotCi0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTElOS19PTkNFKSAhPSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmxzOwotCi0gICAgICBzd2l0Y2ggKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xJTktfRFVQTElDQVRFUykKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOgotCSAgbHMgPSAiTElOS19PTkNFX0RJU0NBUkQiOwotCSAgYnJlYWs7Ci0JY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZOgotCSAgbHMgPSAiTElOS19PTkNFX09ORV9PTkxZIjsKLQkgIGJyZWFrOwotCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU6Ci0JICBscyA9ICJMSU5LX09OQ0VfU0FNRV9TSVpFIjsKLQkgIGJyZWFrOwotCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOgotCSAgbHMgPSAiTElOS19PTkNFX1NBTUVfQ09OVEVOVFMiOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcHJpbnRmICgiJXMlcyIsIGNvbW1hLCBscyk7Ci0KLSAgICAgIGlmIChzZWN0aW9uLT5jb21kYXQgIT0gTlVMTCkKLQlwcmludGYgKCIgKENPTURBVCAlcyAlbGQpIiwgc2VjdGlvbi0+Y29tZGF0LT5uYW1lLAotCQlzZWN0aW9uLT5jb21kYXQtPnN5bWJvbCk7Ci0KLSAgICAgIGNvbW1hID0gIiwgIjsKLSAgICB9Ci0KLSAgcHJpbnRmICgiXG4iKTsKLSN1bmRlZiBQRgotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9oZWFkZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHByaW50ZiAoXygiU2VjdGlvbnM6XG4iKSk7Ci0KLSNpZm5kZWYgQkZENjQKLSAgcHJpbnRmIChfKCJJZHggTmFtZSAgICAgICAgICBTaXplICAgICAgVk1BICAgICAgIExNQSAgICAgICBGaWxlIG9mZiAgQWxnbiIpKTsKLSNlbHNlCi0gIHByaW50ZiAoXygiSWR4IE5hbWUgICAgICAgICAgU2l6ZSAgICAgIFZNQSAgICAgICAgICAgICAgIExNQSAgICAgICAgICAgICAgIEZpbGUgb2ZmICBBbGduIikpOwotI2VuZGlmCi0KLSAgaWYgKHdpZGVfb3V0cHV0KQotICAgIHByaW50ZiAoXygiICBGbGFncyIpKTsKLSAgcHJpbnRmICgiXG4iKTsKLQotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGR1bXBfc2VjdGlvbl9oZWFkZXIsIChQVFIpIE5VTEwpOwotfQotDAotc3RhdGljIGFzeW1ib2wgKioKLXNsdXJwX3N5bXRhYiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICoqc3kgPSAoYXN5bWJvbCAqKikgTlVMTDsKLSAgbG9uZyBzdG9yYWdlOwotCi0gIGlmICghKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBIQVNfU1lNUykpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gc3ltYm9sc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIHN5bWNvdW50ID0gMDsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICBpZiAoc3RvcmFnZSA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgaWYgKHN0b3JhZ2UpCi0gICAgewotICAgICAgc3kgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7Ci0gICAgfQotICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBzeSk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gIGlmIChzeW1jb3VudCA9PSAwKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gIHJldHVybiBzeTsKLX0KLQotLyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKioKLXNsdXJwX2R5bmFtaWNfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKipzeSA9IChhc3ltYm9sICoqKSBOVUxMOwotICBsb25nIHN0b3JhZ2U7Ci0KLSAgc3RvcmFnZSA9IGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICBpZiAoc3RvcmFnZSA8IDApCi0gICAgewotICAgICAgaWYgKCEoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiBub3QgYSBkeW5hbWljIG9iamVjdFxuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgZHluc3ltY291bnQgPSAwOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci0KLSAgaWYgKHN0b3JhZ2UpCi0gICAgewotICAgICAgc3kgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7Ci0gICAgfQotICBkeW5zeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHN5KTsKLSAgaWYgKGR5bnN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgaWYgKGR5bnN5bWNvdW50ID09IDApCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IE5vIGR5bmFtaWMgc3ltYm9sc1xuIiksCi0JICAgICBwcm9ncmFtX25hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgcmV0dXJuIHN5OwotfQotCi0vKiBGaWx0ZXIgb3V0IChpbiBwbGFjZSkgc3ltYm9scyB0aGF0IGFyZSB1c2VsZXNzIGZvciBkaXNhc3NlbWJseS4KLSAgIENPVU5UIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gU1lNQk9MUy4KLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIHVzZWZ1bCBzeW1ib2xzLiAqLwotCi1zdGF0aWMgbG9uZwotcmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyAoc3ltYm9scywgY291bnQpCi0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBsb25nIGNvdW50OwotewotICByZWdpc3RlciBhc3ltYm9sICoqaW5fcHRyID0gc3ltYm9scywgKipvdXRfcHRyID0gc3ltYm9sczsKLQotICB3aGlsZSAoLS1jb3VudCA+PSAwKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bSA9ICppbl9wdHIrKzsKLQotICAgICAgaWYgKHN5bS0+bmFtZSA9PSBOVUxMIHx8IHN5bS0+bmFtZVswXSA9PSAnXDAnKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHN5bS0+ZmxhZ3MgJiAoQlNGX0RFQlVHR0lORykpCi0JY29udGludWU7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0JICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JY29udGludWU7Ci0KLSAgICAgICpvdXRfcHRyKysgPSBzeW07Ci0gICAgfQotICByZXR1cm4gb3V0X3B0ciAtIHN5bWJvbHM7Ci19Ci0KLS8qIFNvcnQgc3ltYm9scyBpbnRvIHZhbHVlIG9yZGVyLiAgKi8KLQotc3RhdGljIGludCAKLWNvbXBhcmVfc3ltYm9scyAoYXAsIGJwKQotICAgICBjb25zdCBQVFIgYXA7Ci0gICAgIGNvbnN0IFBUUiBicDsKLXsKLSAgY29uc3QgYXN5bWJvbCAqYSA9ICooY29uc3QgYXN5bWJvbCAqKilhcDsKLSAgY29uc3QgYXN5bWJvbCAqYiA9ICooY29uc3QgYXN5bWJvbCAqKilicDsKLSAgY29uc3QgY2hhciAqYW4sICpibjsKLSAgc2l6ZV90IGFubCwgYm5sOwotICBib29sZWFuIGFmLCBiZjsKLSAgZmxhZ3dvcmQgYWZsYWdzLCBiZmxhZ3M7Ci0KLSAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChhKSA+IGJmZF9hc3ltYm9sX3ZhbHVlIChiKSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKGEpIDwgYmZkX2FzeW1ib2xfdmFsdWUgKGIpKQotICAgIHJldHVybiAtMTsKLQotICBpZiAoYS0+c2VjdGlvbiA+IGItPnNlY3Rpb24pCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKGEtPnNlY3Rpb24gPCBiLT5zZWN0aW9uKQotICAgIHJldHVybiAtMTsKLQotICBhbiA9IGJmZF9hc3ltYm9sX25hbWUgKGEpOwotICBibiA9IGJmZF9hc3ltYm9sX25hbWUgKGIpOwotICBhbmwgPSBzdHJsZW4gKGFuKTsKLSAgYm5sID0gc3RybGVuIChibik7Ci0KLSAgLyogVGhlIHN5bWJvbHMgZ251X2NvbXBpbGVkIGFuZCBnY2MyX2NvbXBpbGVkIGNvbnZleSBubyByZWFsCi0gICAgIGluZm9ybWF0aW9uLCBzbyBwdXQgdGhlbSBhZnRlciBvdGhlciBzeW1ib2xzIHdpdGggdGhlIHNhbWUgdmFsdWUuICAqLwotCi0gIGFmID0gKHN0cnN0ciAoYW4sICJnbnVfY29tcGlsZWQiKSAhPSBOVUxMCi0JfHwgc3Ryc3RyIChhbiwgImdjYzJfY29tcGlsZWQiKSAhPSBOVUxMKTsKLSAgYmYgPSAoc3Ryc3RyIChibiwgImdudV9jb21waWxlZCIpICE9IE5VTEwKLQl8fCBzdHJzdHIgKGJuLCAiZ2NjMl9jb21waWxlZCIpICE9IE5VTEwpOwotCi0gIGlmIChhZiAmJiAhIGJmKQotICAgIHJldHVybiAxOwotICBpZiAoISBhZiAmJiBiZikKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogV2UgdXNlIGEgaGV1cmlzdGljIGZvciB0aGUgZmlsZSBuYW1lLCB0byB0cnkgdG8gc29ydCBpdCBhZnRlcgotICAgICBtb3JlIHVzZWZ1bCBzeW1ib2xzLiAgSXQgbWF5IG5vdCB3b3JrIG9uIG5vbiBVbml4IHN5c3RlbXMsIGJ1dCBpdAotICAgICBkb2Vzbid0IHJlYWxseSBtYXR0ZXI7IHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgcHJlY2lzZWx5IHdoaWNoCi0gICAgIHN5bWJvbCBuYW1lcyBnZXQgcHJpbnRlZC4gICovCi0KLSNkZWZpbmUgZmlsZV9zeW1ib2wocywgc24sIHNubCkJCQlcCi0gICgoKHMpLT5mbGFncyAmIEJTRl9GSUxFKSAhPSAwCQkJXAotICAgfHwgKChzbilbKHNubCkgLSAyXSA9PSAnLicJCQlcCi0gICAgICAgJiYgKChzbilbKHNubCkgLSAxXSA9PSAnbycJCVwKLQkgICB8fCAoc24pWyhzbmwpIC0gMV0gPT0gJ2EnKSkpCi0KLSAgYWYgPSBmaWxlX3N5bWJvbCAoYSwgYW4sIGFubCk7Ci0gIGJmID0gZmlsZV9zeW1ib2wgKGIsIGJuLCBibmwpOwotCi0gIGlmIChhZiAmJiAhIGJmKQotICAgIHJldHVybiAxOwotICBpZiAoISBhZiAmJiBiZikKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogVHJ5IHRvIHNvcnQgZ2xvYmFsIHN5bWJvbHMgYmVmb3JlIGxvY2FsIHN5bWJvbHMgYmVmb3JlIGZ1bmN0aW9uCi0gICAgIHN5bWJvbHMgYmVmb3JlIGRlYnVnZ2luZyBzeW1ib2xzLiAgKi8KLQotICBhZmxhZ3MgPSBhLT5mbGFnczsKLSAgYmZsYWdzID0gYi0+ZmxhZ3M7Ci0KLSAgaWYgKChhZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAoYmZsYWdzICYgQlNGX0RFQlVHR0lORykpCi0gICAgewotICAgICAgaWYgKChhZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQotCXJldHVybiAxOwotICAgICAgZWxzZQotCXJldHVybiAtMTsKLSAgICB9Ci0gIGlmICgoYWZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAoYmZsYWdzICYgQlNGX0ZVTkNUSU9OKSkKLSAgICB7Ci0gICAgICBpZiAoKGFmbGFncyAmIEJTRl9GVU5DVElPTikgIT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDE7Ci0gICAgfQotICBpZiAoKGFmbGFncyAmIEJTRl9MT0NBTCkgIT0gKGJmbGFncyAmIEJTRl9MT0NBTCkpCi0gICAgewotICAgICAgaWYgKChhZmxhZ3MgJiBCU0ZfTE9DQUwpICE9IDApCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKChhZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAoYmZsYWdzICYgQlNGX0dMT0JBTCkpCi0gICAgewotICAgICAgaWYgKChhZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwKQotCXJldHVybiAtMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgLyogU3ltYm9scyB0aGF0IHN0YXJ0IHdpdGggJy4nIG1pZ2h0IGJlIHNlY3Rpb24gbmFtZXMsIHNvIHNvcnQgdGhlbQotICAgICBhZnRlciBzeW1ib2xzIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCAnLicuICAqLwotICBpZiAoYW5bMF0gPT0gJy4nICYmIGJuWzBdICE9ICcuJykKLSAgICByZXR1cm4gMTsKLSAgaWYgKGFuWzBdICE9ICcuJyAmJiBiblswXSA9PSAnLicpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIEZpbmFsbHksIGlmIHdlIGNhbid0IGRpc3Rpbmd1aXNoIHRoZW0gaW4gYW55IG90aGVyIHdheSwgdHJ5IHRvCi0gICAgIGdldCBjb25zaXN0ZW50IHJlc3VsdHMgYnkgc29ydGluZyB0aGUgc3ltYm9scyBieSBuYW1lLiAgKi8KLSAgcmV0dXJuIHN0cmNtcCAoYW4sIGJuKTsKLX0KLQotLyogU29ydCByZWxvY3MgaW50byBhZGRyZXNzIG9yZGVyLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9yZWxvY3MgKGFwLCBicCkKLSAgICAgY29uc3QgUFRSIGFwOwotICAgICBjb25zdCBQVFIgYnA7Ci17Ci0gIGNvbnN0IGFyZWxlbnQgKmEgPSAqKGNvbnN0IGFyZWxlbnQgKiopYXA7Ci0gIGNvbnN0IGFyZWxlbnQgKmIgPSAqKGNvbnN0IGFyZWxlbnQgKiopYnA7Ci0KLSAgaWYgKGEtPmFkZHJlc3MgPiBiLT5hZGRyZXNzKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChhLT5hZGRyZXNzIDwgYi0+YWRkcmVzcykKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogU28gdGhhdCBhc3NvY2lhdGVkIHJlbG9jYXRpb25zIHRpZWQgdG8gdGhlIHNhbWUgYWRkcmVzcyBzaG93IHVwCi0gICAgIGluIHRoZSBjb3JyZWN0IG9yZGVyLCB3ZSBkb24ndCBkbyBhbnkgZnVydGhlciBzb3J0aW5nLiAgKi8KLSAgaWYgKGEgPiBiKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChhIDwgYikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogUHJpbnQgVk1BIHRvIFNUUkVBTS4gIElmIFNLSVBfWkVST0VTIGlzIHRydWUsIG9taXQgbGVhZGluZyB6ZXJvZXMuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF92YWx1ZSAodm1hLCBpbmZvLCBza2lwX3plcm9lcykKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBib29sZWFuIHNraXBfemVyb2VzOwotewotICBjaGFyIGJ1ZlszMF07Ci0gIGNoYXIgKnA7Ci0KLSAgc3ByaW50Zl92bWEgKGJ1Ziwgdm1hKTsKLSAgaWYgKCEgc2tpcF96ZXJvZXMpCi0gICAgcCA9IGJ1ZjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAocCA9IGJ1ZjsgKnAgPT0gJzAnOyArK3ApCi0JOwotICAgICAgaWYgKCpwID09ICdcMCcpCi0JLS1wOwotICAgIH0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHApOwotfQotCi0vKiBQcmludCB0aGUgbmFtZSBvZiBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X3N5bW5hbWUgKGFiZmQsIGluZm8sIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBjaGFyICphbGxvYzsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqcHJpbnQ7Ci0KLSAgYWxsb2MgPSBOVUxMOwotICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLSAgaWYgKCEgZG9fZGVtYW5nbGUgfHwgbmFtZVswXSA9PSAnXDAnKQotICAgIHByaW50ID0gbmFtZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIERlbWFuZ2xlIHRoZSBuYW1lLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09IG5hbWVbMF0pCi0JKytuYW1lOwotCi0gICAgICBhbGxvYyA9IGNwbHVzX2RlbWFuZ2xlIChuYW1lLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7Ci0gICAgICBpZiAoYWxsb2MgPT0gTlVMTCkKLQlwcmludCA9IG5hbWU7Ci0gICAgICBlbHNlCi0JcHJpbnQgPSBhbGxvYzsKLSAgICB9Ci0KLSAgaWYgKGluZm8gIT0gTlVMTCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcHJpbnQpOwotICBlbHNlCi0gICAgcHJpbnRmICgiJXMiLCBwcmludCk7Ci0KLSAgaWYgKGFsbG9jICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2MpOwotfQotCi0vKiBMb2NhdGUgYSBzeW1ib2wgZ2l2ZW4gYSBiZmQsIGEgc2VjdGlvbiwgYW5kIGEgVk1BLiAgSWYgUkVRVUlSRV9TRUMKLSAgIGlzIHRydWUsIHRoZW4gYWx3YXlzIHJlcXVpcmUgdGhlIHN5bWJvbCB0byBiZSBpbiB0aGUgc2VjdGlvbi4gIFRoaXMKLSAgIHJldHVybnMgTlVMTCBpZiB0aGVyZSBpcyBubyBzdWl0YWJsZSBzeW1ib2wuICBJZiBQTEFDRSBpcyBub3QgTlVMTCwKLSAgIHRoZW4gKlBMQUNFIGlzIHNldCB0byB0aGUgaW5kZXggb2YgdGhlIHN5bWJvbCBpbiBzb3J0ZWRfc3ltcy4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLWZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzIChhYmZkLCBzZWMsIHZtYSwgcmVxdWlyZV9zZWMsIHBsYWNlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBib29sZWFuIHJlcXVpcmVfc2VjOwotICAgICBsb25nICpwbGFjZTsKLXsKLSAgLyogQEAgV291bGQgaXQgc3BlZWQgdGhpbmdzIHVwIHRvIGNhY2hlIHRoZSBsYXN0IHR3byBzeW1ib2xzIHJldHVybmVkLAotICAgICBhbmQgbWF5YmUgdGhlaXIgYWRkcmVzcyByYW5nZXM/ICBGb3IgbWFueSBwcm9jZXNzb3JzLCBvbmx5IG9uZSBtZW1vcnkKLSAgICAgb3BlcmFuZCBjYW4gYmUgcHJlc2VudCBhdCBhIHRpbWUsIHNvIHRoZSAyLWVudHJ5IGNhY2hlIHdvdWxkbid0IGJlCi0gICAgIGNvbnN0YW50bHkgY2h1cm5lZCBieSBjb2RlIGRvaW5nIGhlYXZ5IG1lbW9yeSBhY2Nlc3Nlcy4gICovCi0KLSAgLyogSW5kaWNlcyBpbiBgc29ydGVkX3N5bXMnLiAgKi8KLSAgbG9uZyBtaW4gPSAwOwotICBsb25nIG1heCA9IHNvcnRlZF9zeW1jb3VudDsKLSAgbG9uZyB0aGlzcGxhY2U7Ci0KLSAgaWYgKHNvcnRlZF9zeW1jb3VudCA8IDEpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogUGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggbG9va2luZyBmb3IgdGhlIGNsb3Nlc3Qgc3ltYm9sIHRvIHRoZQotICAgICByZXF1aXJlZCB2YWx1ZS4gIFdlIGFyZSBzZWFyY2hpbmcgdGhlIHJhbmdlIChtaW4sIG1heF0uICAqLwotICB3aGlsZSAobWluICsgMSA8IG1heCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0KLSAgICAgIHRoaXNwbGFjZSA9IChtYXggKyBtaW4pIC8gMjsKLSAgICAgIHN5bSA9IHNvcnRlZF9zeW1zW3RoaXNwbGFjZV07Ci0KLSAgICAgIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHZtYSkKLQltYXggPSB0aGlzcGxhY2U7Ci0gICAgICBlbHNlIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA8IHZtYSkKLQltaW4gPSB0aGlzcGxhY2U7Ci0gICAgICBlbHNlCi0JewotCSAgbWluID0gdGhpc3BsYWNlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgc3ltYm9sIHdlIHdhbnQgaXMgbm93IGluIG1pbiwgdGhlIGxvdyBlbmQgb2YgdGhlIHJhbmdlIHdlCi0gICAgIHdlcmUgc2VhcmNoaW5nLiAgSWYgdGhlcmUgYXJlIHNldmVyYWwgc3ltYm9scyB3aXRoIHRoZSBzYW1lCi0gICAgIHZhbHVlLCB3ZSB3YW50IHRoZSBmaXJzdCBvbmUuICAqLwotICB0aGlzcGxhY2UgPSBtaW47Ci0gIHdoaWxlICh0aGlzcGxhY2UgPiAwCi0JICYmIChiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbdGhpc3BsYWNlXSkKLQkgICAgID09IGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2UgLSAxXSkpKQotICAgIC0tdGhpc3BsYWNlOwotCi0gIC8qIElmIHRoZSBmaWxlIGlzIHJlbG9jYXRlYWJsZSwgYW5kIHRoZSBzeW1ib2wgY291bGQgYmUgZnJvbSB0aGlzCi0gICAgIHNlY3Rpb24sIHByZWZlciBhIHN5bWJvbCBmcm9tIHRoaXMgc2VjdGlvbiBvdmVyIHN5bWJvbHMgZnJvbQotICAgICBvdGhlcnMsIGV2ZW4gaWYgdGhlIG90aGVyIHN5bWJvbCdzIHZhbHVlIG1pZ2h0IGJlIGNsb3Nlci4KLSAgICAgICAKLSAgICAgTm90ZSB0aGF0IHRoaXMgbWF5IGJlIHdyb25nIGZvciBzb21lIHN5bWJvbCByZWZlcmVuY2VzIGlmIHRoZQotICAgICBzZWN0aW9ucyBoYXZlIG92ZXJsYXBwaW5nIG1lbW9yeSByYW5nZXMsIGJ1dCBpbiB0aGF0IGNhc2UgdGhlcmUncwotICAgICBubyB3YXkgdG8gdGVsbCB3aGF0J3MgZGVzaXJlZCB3aXRob3V0IGxvb2tpbmcgYXQgdGhlIHJlbG9jYXRpb24KLSAgICAgdGFibGUuICAqLwotCi0gIGlmIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdLT5zZWN0aW9uICE9IHNlYwotICAgICAgJiYgKHJlcXVpcmVfc2VjCi0JICB8fCAoKGFiZmQtPmZsYWdzICYgSEFTX1JFTE9DKSAhPSAwCi0JICAgICAgJiYgdm1hID49IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKLQkgICAgICAmJiB2bWEgPCAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkJKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpKSkpKQotICAgIHsKLSAgICAgIGxvbmcgaTsKLQotICAgICAgZm9yIChpID0gdGhpc3BsYWNlICsgMTsgaSA8IHNvcnRlZF9zeW1jb3VudDsgaSsrKQotCXsKLQkgIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbaV0pCi0JICAgICAgIT0gYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZV0pKQotCSAgICBicmVhazsKLQl9Ci0gICAgICAtLWk7Ci0gICAgICBmb3IgKDsgaSA+PSAwOyBpLS0pCi0JewotCSAgaWYgKHNvcnRlZF9zeW1zW2ldLT5zZWN0aW9uID09IHNlYwotCSAgICAgICYmIChpID09IDAKLQkJICB8fCBzb3J0ZWRfc3ltc1tpIC0gMV0tPnNlY3Rpb24gIT0gc2VjCi0JCSAgfHwgKGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1tpXSkKLQkJICAgICAgIT0gYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW2kgLSAxXSkpKSkKLQkgICAgewotCSAgICAgIHRoaXNwbGFjZSA9IGk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdLT5zZWN0aW9uICE9IHNlYykKLQl7Ci0JICAvKiBXZSBkaWRuJ3QgZmluZCBhIGdvb2Qgc3ltYm9sIHdpdGggYSBzbWFsbGVyIHZhbHVlLgotCSAgICAgTG9vayBmb3Igb25lIHdpdGggYSBsYXJnZXIgdmFsdWUuICAqLwotCSAgZm9yIChpID0gdGhpc3BsYWNlICsgMTsgaSA8IHNvcnRlZF9zeW1jb3VudDsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKHNvcnRlZF9zeW1zW2ldLT5zZWN0aW9uID09IHNlYykKLQkJewotCQkgIHRoaXNwbGFjZSA9IGk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZV0tPnNlY3Rpb24gIT0gc2VjCi0JICAmJiAocmVxdWlyZV9zZWMKLQkgICAgICB8fCAoKGFiZmQtPmZsYWdzICYgSEFTX1JFTE9DKSAhPSAwCi0JCSAgJiYgdm1hID49IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKLQkJICAmJiB2bWEgPCAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkJICAgICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKSkpKSkKLQl7Ci0JICAvKiBUaGVyZSBpcyBubyBzdWl0YWJsZSBzeW1ib2wuICAqLwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgIH0KLQotICBpZiAocGxhY2UgIT0gTlVMTCkKLSAgICAqcGxhY2UgPSB0aGlzcGxhY2U7Ci0KLSAgcmV0dXJuIHNvcnRlZF9zeW1zW3RoaXNwbGFjZV07Ci19Ci0KLS8qIFByaW50IGFuIGFkZHJlc3MgdG8gSU5GTyBzeW1ib2xpY2FsbHkuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltIChhYmZkLCBzZWMsIHN5bSwgdm1hLCBpbmZvLCBza2lwX3plcm9lcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBza2lwX3plcm9lczsKLXsKLSAgb2JqZHVtcF9wcmludF92YWx1ZSAodm1hLCBpbmZvLCBza2lwX3plcm9lcyk7Ci0KLSAgaWYgKHN5bSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF92bWEgc2VjYWRkcjsKLQotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgPCVzIiwKLQkJCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotICAgICAgc2VjYWRkciA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0gICAgICBpZiAodm1hIDwgc2VjYWRkcikKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0weCIpOwotCSAgb2JqZHVtcF9wcmludF92YWx1ZSAoc2VjYWRkciAtIHZtYSwgaW5mbywgdHJ1ZSk7Ci0JfQotICAgICAgZWxzZSBpZiAodm1hID4gc2VjYWRkcikKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisweCIpOwotCSAgb2JqZHVtcF9wcmludF92YWx1ZSAodm1hIC0gc2VjYWRkciwgaW5mbywgdHJ1ZSk7Ci0JfQotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI+Iik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgPCIpOwotICAgICAgb2JqZHVtcF9wcmludF9zeW1uYW1lIChhYmZkLCBpbmZvLCBzeW0pOwotICAgICAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gdm1hKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLTB4Iik7Ci0JICBvYmpkdW1wX3ByaW50X3ZhbHVlIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSAtIHZtYSwgaW5mbywgdHJ1ZSk7Ci0JfQotICAgICAgZWxzZSBpZiAodm1hID4gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrMHgiKTsKLQkgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHZtYSAtIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pLCBpbmZvLCB0cnVlKTsKLQl9Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIj4iKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IFZNQSB0byBJTkZPLCBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICBJZiBTS0lQX1pFUk9FUyBpcwotICAgdHJ1ZSwgZG9uJ3Qgb3V0cHV0IGxlYWRpbmcgemVyb2VzLiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkciAodm1hLCBpbmZvLCBza2lwX3plcm9lcykKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBib29sZWFuIHNraXBfemVyb2VzOwotewotICBzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqYXV4OwotICBhc3ltYm9sICpzeW07Ci0KLSAgaWYgKHNvcnRlZF9zeW1jb3VudCA8IDEpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCIpOwotICAgICAgb2JqZHVtcF9wcmludF92YWx1ZSAodm1hLCBpbmZvLCBza2lwX3plcm9lcyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGF1eCA9IChzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqKSBpbmZvLT5hcHBsaWNhdGlvbl9kYXRhOwotICBzeW0gPSBmaW5kX3N5bWJvbF9mb3JfYWRkcmVzcyAoYXV4LT5hYmZkLCBhdXgtPnNlYywgdm1hLCBhdXgtPnJlcXVpcmVfc2VjLAotCQkJCSAobG9uZyAqKSBOVUxMKTsKLSAgb2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltIChhdXgtPmFiZmQsIGF1eC0+c2VjLCBzeW0sIHZtYSwgaW5mbywKLQkJCSAgICAgICBza2lwX3plcm9lcyk7Ci19Ci0KLS8qIFByaW50IFZNQSB0byBJTkZPLiAgVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGRpc2Fzc2VtYmxlcgotICAgcm91dGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X2FkZHJlc3MgKHZtYSwgaW5mbykKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBvYmpkdW1wX3ByaW50X2FkZHIgKHZtYSwgaW5mbywgISBwcmVmaXhfYWRkcmVzc2VzKTsKLX0KLQotLyogRGV0ZXJtaW5lIG9mIHRoZSBnaXZlbiBhZGRyZXNzIGhhcyBhIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaXQuICAqLwotCi1zdGF0aWMgaW50Ci1vYmpkdW1wX3N5bWJvbF9hdF9hZGRyZXNzICh2bWEsIGluZm8pCi0gICAgIGJmZF92bWEgdm1hOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci17Ci0gIHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvICogYXV4OwotICBhc3ltYm9sICogc3ltOwotCi0gIC8qIE5vIHN5bWJvbHMgLSBkbyBub3QgYm90aGVyIGNoZWNraW5nLiAgKi8KLSAgaWYgKHNvcnRlZF9zeW1jb3VudCA8IDEpCi0gICAgcmV0dXJuIDA7Ci0KLSAgYXV4ID0gKHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvICopIGluZm8tPmFwcGxpY2F0aW9uX2RhdGE7Ci0gIHN5bSA9IGZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzIChhdXgtPmFiZmQsIGF1eC0+c2VjLCB2bWEsIGF1eC0+cmVxdWlyZV9zZWMsCi0JCQkJIChsb25nICopIE5VTEwpOwotCi0gIHJldHVybiAoc3ltICE9IE5VTEwgJiYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID09IHZtYSkpOwotfQotCi0vKiBIb2xkIHRoZSBsYXN0IGZ1bmN0aW9uIG5hbWUgYW5kIHRoZSBsYXN0IGxpbmUgbnVtYmVyIHdlIGRpc3BsYXllZAotICAgaW4gYSBkaXNhc3NlbWJseS4gICovCi0KLXN0YXRpYyBjaGFyICpwcmV2X2Z1bmN0aW9ubmFtZTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcHJldl9saW5lOwotCi0vKiBXZSBrZWVwIGEgbGlzdCBvZiBhbGwgZmlsZXMgdGhhdCB3ZSBoYXZlIHNlZW4gd2hlbiBkb2luZyBhCi0gICBkaXNzYXNzZW1ibHkgd2l0aCBzb3VyY2UsIHNvIHRoYXQgd2Uga25vdyBob3cgbXVjaCBvZiB0aGUgZmlsZSB0bwotICAgZGlzcGxheS4gIFRoaXMgY2FuIGJlIGltcG9ydGFudCBmb3IgaW5saW5lZCBmdW5jdGlvbnMuICAqLwotCi1zdHJ1Y3QgcHJpbnRfZmlsZV9saXN0Ci17Ci0gIHN0cnVjdCBwcmludF9maWxlX2xpc3QgKm5leHQ7Ci0gIGNoYXIgKmZpbGVuYW1lOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgRklMRSAqZjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0ICpwcmludF9maWxlczsKLQotLyogVGhlIG51bWJlciBvZiBwcmVjZWRpbmcgY29udGV4dCBsaW5lcyB0byBzaG93IHdoZW4gd2Ugc3RhcnQKLSAgIGRpc3BsYXlpbmcgYSBmaWxlIGZvciB0aGUgZmlyc3QgdGltZS4gICovCi0KLSNkZWZpbmUgU0hPV19QUkVDRURJTkdfQ09OVEVYVF9MSU5FUyAoNSkKLQotLyogU2tpcCBhaGVhZCB0byBhIGdpdmVuIGxpbmUgaW4gYSBmaWxlLCBvcHRpb25hbGx5IHByaW50aW5nIGVhY2gKLSAgIGxpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotc2tpcF90b19saW5lIFBBUkFNUyAoKHN0cnVjdCBwcmludF9maWxlX2xpc3QgKiwgdW5zaWduZWQgaW50LCBib29sZWFuKSk7Ci0KLXN0YXRpYyB2b2lkCi1za2lwX3RvX2xpbmUgKHAsIGxpbmUsIHNob3cpCi0gICAgIHN0cnVjdCBwcmludF9maWxlX2xpc3QgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICBib29sZWFuIHNob3c7Ci17Ci0gIHdoaWxlIChwLT5saW5lIDwgbGluZSkKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlsxMDBdOwotCi0gICAgICBpZiAoZmdldHMgKGJ1Ziwgc2l6ZW9mIGJ1ZiwgcC0+ZikgPT0gTlVMTCkKLQl7Ci0JICBmY2xvc2UgKHAtPmYpOwotCSAgcC0+ZiA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChzaG93KQotCXByaW50ZiAoIiVzIiwgYnVmKTsKLQotICAgICAgaWYgKHN0cmNociAoYnVmLCAnXG4nKSAhPSBOVUxMKQotCSsrcC0+bGluZTsKLSAgICB9Ci19ICAKLQotLyogU2hvdyB0aGUgbGluZSBudW1iZXIsIG9yIHRoZSBzb3VyY2UgbGluZSwgaW4gYSBkaXNzYXNzZW1ibHkKLSAgIGxpc3RpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotc2hvd19saW5lIChhYmZkLCBzZWN0aW9uLCBvZmYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgb2ZmOwotewotICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLSAgQ09OU1QgY2hhciAqZnVuY3Rpb25uYW1lOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLQotICBpZiAoISB3aXRoX2xpbmVfbnVtYmVycyAmJiAhIHdpdGhfc291cmNlX2NvZGUpCi0gICAgcmV0dXJuOwotCi0gIGlmICghIGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltcywgb2ZmLCAmZmlsZW5hbWUsCi0JCQkgICAgICAgJmZ1bmN0aW9ubmFtZSwgJmxpbmUpKQotICAgIHJldHVybjsKLQotICBpZiAoZmlsZW5hbWUgIT0gTlVMTCAmJiAqZmlsZW5hbWUgPT0gJ1wwJykKLSAgICBmaWxlbmFtZSA9IE5VTEw7Ci0gIGlmIChmdW5jdGlvbm5hbWUgIT0gTlVMTCAmJiAqZnVuY3Rpb25uYW1lID09ICdcMCcpCi0gICAgZnVuY3Rpb25uYW1lID0gTlVMTDsKLQotICBpZiAod2l0aF9saW5lX251bWJlcnMpCi0gICAgewotICAgICAgaWYgKGZ1bmN0aW9ubmFtZSAhPSBOVUxMCi0JICAmJiAocHJldl9mdW5jdGlvbm5hbWUgPT0gTlVMTAotCSAgICAgIHx8IHN0cmNtcCAoZnVuY3Rpb25uYW1lLCBwcmV2X2Z1bmN0aW9ubmFtZSkgIT0gMCkpCi0JcHJpbnRmICgiJXMoKTpcbiIsIGZ1bmN0aW9ubmFtZSk7Ci0gICAgICBpZiAobGluZSA+IDAgJiYgbGluZSAhPSBwcmV2X2xpbmUpCi0JcHJpbnRmICgiJXM6JXVcbiIsIGZpbGVuYW1lID09IE5VTEwgPyAiPz8/IiA6IGZpbGVuYW1lLCBsaW5lKTsKLSAgICB9Ci0KLSAgaWYgKHdpdGhfc291cmNlX2NvZGUKLSAgICAgICYmIGZpbGVuYW1lICE9IE5VTEwKLSAgICAgICYmIGxpbmUgPiAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBwcmludF9maWxlX2xpc3QgKipwcCwgKnA7Ci0KLSAgICAgIGZvciAocHAgPSAmcHJpbnRfZmlsZXM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQlpZiAoc3RyY21wICgoKnBwKS0+ZmlsZW5hbWUsIGZpbGVuYW1lKSA9PSAwKQotCSAgYnJlYWs7Ci0gICAgICBwID0gKnBwOwotCi0gICAgICBpZiAocCAhPSBOVUxMKQotCXsKLQkgIGlmIChwICE9IHByaW50X2ZpbGVzKQotCSAgICB7Ci0JICAgICAgaW50IGw7Ci0KLQkgICAgICAvKiBXZSBoYXZlIHJlZW5jb3VudGVyZWQgYSBmaWxlIG5hbWUgd2hpY2ggd2Ugc2F3Ci0JCSBlYXJsaWVyLiAgVGhpcyBpbXBsaWVzIHRoYXQgZWl0aGVyIHdlIGFyZSBkdW1waW5nIG91dAotCQkgY29kZSBmcm9tIGFuIGluY2x1ZGVkIGZpbGUsIG9yIHRoZSBzYW1lIGZpbGUgd2FzCi0JCSBsaW5rZWQgaW4gbW9yZSB0aGFuIG9uY2UuICBUaGVyZSBhcmUgdHdvIGNvbW1vbiBjYXNlcwotCQkgb2YgYW4gaW5jbHVkZWQgZmlsZTogaW5saW5lIGZ1bmN0aW9ucyBpbiBhIGhlYWRlcgotCQkgZmlsZSwgYW5kIGEgYmlzb24gb3IgZmxleCBza2VsZXRvbiBmaWxlLiAgSW4gdGhlCi0JCSBmb3JtZXIgY2FzZSB3ZSB3YW50IHRvIGp1c3Qgc3RhcnQgcHJpbnRpbmcgKGJ1dCB3ZQotCQkgYmFjayB1cCBhIGZldyBsaW5lcyB0byBnaXZlIGNvbnRleHQpOyBpbiB0aGUgbGF0dGVyCi0JCSBjYXNlIHdlIHdhbnQgdG8gY29udGludWUgZnJvbSB3aGVyZSB3ZSBsZWZ0IG9mZi4gIEkKLQkJIGNhbid0IHRoaW5rIG9mIGEgZ29vZCB3YXkgdG8gZGlzdGluZ3Vpc2ggdGhlIGNhc2VzLAotCQkgc28gSSB1c2VkIGEgaGV1cmlzdGljIGJhc2VkIG9uIHRoZSBmaWxlIG5hbWUuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKHAtPmZpbGVuYW1lICsgc3RybGVuIChwLT5maWxlbmFtZSkgLSAyLCAiLmgiKSAhPSAwKQotCQlsID0gcC0+bGluZTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBsID0gbGluZSAtIFNIT1dfUFJFQ0VESU5HX0NPTlRFWFRfTElORVM7Ci0JCSAgaWYgKGwgPD0gMCkKLQkJICAgIGwgPSAxOwotCQl9Ci0KLQkgICAgICBpZiAocC0+ZiA9PSBOVUxMKQotCQl7Ci0JCSAgcC0+ZiA9IGZvcGVuIChwLT5maWxlbmFtZSwgInIiKTsKLQkJICBwLT5saW5lID0gMDsKLQkJfQotCSAgICAgIGlmIChwLT5mICE9IE5VTEwpCi0JCXNraXBfdG9fbGluZSAocCwgbCwgZmFsc2UpOwotCi0JICAgICAgaWYgKHByaW50X2ZpbGVzLT5mICE9IE5VTEwpCi0JCXsKLQkJICBmY2xvc2UgKHByaW50X2ZpbGVzLT5mKTsKLQkJICBwcmludF9maWxlcy0+ZiA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAocC0+ZiAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2tpcF90b19saW5lIChwLCBsaW5lLCB0cnVlKTsKLQkgICAgICAqcHAgPSBwLT5uZXh0OwotCSAgICAgIHAtPm5leHQgPSBwcmludF9maWxlczsKLQkgICAgICBwcmludF9maWxlcyA9IHA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRklMRSAqZjsKLQotCSAgZiA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKLQkgIGlmIChmICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpbnQgbDsKLQotCSAgICAgIHAgPSAoKHN0cnVjdCBwcmludF9maWxlX2xpc3QgKikKLQkJICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0KSkpOwotCSAgICAgIHAtPmZpbGVuYW1lID0geG1hbGxvYyAoc3RybGVuIChmaWxlbmFtZSkgKyAxKTsKLQkgICAgICBzdHJjcHkgKHAtPmZpbGVuYW1lLCBmaWxlbmFtZSk7Ci0JICAgICAgcC0+bGluZSA9IDA7Ci0JICAgICAgcC0+ZiA9IGY7Ci0KLQkgICAgICBpZiAocHJpbnRfZmlsZXMgIT0gTlVMTCAmJiBwcmludF9maWxlcy0+ZiAhPSBOVUxMKQotCQl7Ci0JCSAgZmNsb3NlIChwcmludF9maWxlcy0+Zik7Ci0JCSAgcHJpbnRfZmlsZXMtPmYgPSBOVUxMOwotCQl9Ci0JICAgICAgcC0+bmV4dCA9IHByaW50X2ZpbGVzOwotCSAgICAgIHByaW50X2ZpbGVzID0gcDsKLQotCSAgICAgIGwgPSBsaW5lIC0gU0hPV19QUkVDRURJTkdfQ09OVEVYVF9MSU5FUzsKLQkgICAgICBpZiAobCA8PSAwKQotCQlsID0gMTsKLQkgICAgICBza2lwX3RvX2xpbmUgKHAsIGwsIGZhbHNlKTsKLQkgICAgICBpZiAocC0+ZiAhPSBOVUxMKQotCQlza2lwX3RvX2xpbmUgKHAsIGxpbmUsIHRydWUpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwKLSAgICAgICYmIChwcmV2X2Z1bmN0aW9ubmFtZSA9PSBOVUxMCi0JICB8fCBzdHJjbXAgKGZ1bmN0aW9ubmFtZSwgcHJldl9mdW5jdGlvbm5hbWUpICE9IDApKQotICAgIHsKLSAgICAgIGlmIChwcmV2X2Z1bmN0aW9ubmFtZSAhPSBOVUxMKQotCWZyZWUgKHByZXZfZnVuY3Rpb25uYW1lKTsKLSAgICAgIHByZXZfZnVuY3Rpb25uYW1lID0geG1hbGxvYyAoc3RybGVuIChmdW5jdGlvbm5hbWUpICsgMSk7Ci0gICAgICBzdHJjcHkgKHByZXZfZnVuY3Rpb25uYW1lLCBmdW5jdGlvbm5hbWUpOwotICAgIH0KLQotICBpZiAobGluZSA+IDAgJiYgbGluZSAhPSBwcmV2X2xpbmUpCi0gICAgcHJldl9saW5lID0gbGluZTsKLX0KLQotLyogUHNldWRvIEZJTEUgb2JqZWN0IGZvciBzdHJpbmdzLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNoYXIgKmJ1ZmZlcjsKLSAgc2l6ZV90IHNpemU7Ci0gIGNoYXIgKmN1cnJlbnQ7Ci19IFNGSUxFOwotCi0vKiBzcHJpbnRmIHRvIGEgInN0cmVhbSIgKi8KLQotc3RhdGljIGludAotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotb2JqZHVtcF9zcHJpbnRmIChTRklMRSAqZiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0jZWxzZQotb2JqZHVtcF9zcHJpbnRmICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSNpZm5kZWYgQU5TSV9QUk9UT1RZUEVTCi0gIFNGSUxFICpmOwotICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0jZW5kaWYKLSAgY2hhciAqYnVmOwotICB2YV9saXN0IGFyZ3M7Ci0gIHNpemVfdCBuOwotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBmID0gdmFfYXJnIChhcmdzLCBTRklMRSAqKTsKLSAgZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLSAgdmFzcHJpbnRmICgmYnVmLCBmb3JtYXQsIGFyZ3MpOwotCi0gIHZhX2VuZCAoYXJncyk7Ci0KLSAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiT3V0IG9mIHZpcnR1YWwgbWVtb3J5XG4iKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgbiA9IHN0cmxlbiAoYnVmKTsKLQotICB3aGlsZSAoKHNpemVfdCkgKChmLT5idWZmZXIgKyBmLT5zaXplKSAtIGYtPmN1cnJlbnQpIDwgbiArIDEpCi0gICAgewotICAgICAgc2l6ZV90IGN1cnJvZmY7Ci0KLSAgICAgIGN1cnJvZmYgPSBmLT5jdXJyZW50IC0gZi0+YnVmZmVyOwotICAgICAgZi0+c2l6ZSAqPSAyOwotICAgICAgZi0+YnVmZmVyID0geHJlYWxsb2MgKGYtPmJ1ZmZlciwgZi0+c2l6ZSk7Ci0gICAgICBmLT5jdXJyZW50ID0gZi0+YnVmZmVyICsgY3Vycm9mZjsKLSAgICB9Ci0KLSAgbWVtY3B5IChmLT5jdXJyZW50LCBidWYsIG4pOwotICBmLT5jdXJyZW50ICs9IG47Ci0gIGYtPmN1cnJlbnRbMF0gPSAnXDAnOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIG47Ci19Ci0KLS8qIFRoZSBudW1iZXIgb2YgemVyb2VzIHdlIHdhbnQgdG8gc2VlIGJlZm9yZSB3ZSBzdGFydCBza2lwcGluZyB0aGVtLgotICAgVGhlIG51bWJlciBpcyBhcmJpdHJhcmlseSBjaG9zZW4uICAqLwotCi0jZGVmaW5lIFNLSVBfWkVST0VTICg4KQotCi0vKiBUaGUgbnVtYmVyIG9mIHplcm9lcyB0byBza2lwIGF0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiAgSWYgdGhlCi0gICBudW1iZXIgb2YgemVyb2VzIGF0IHRoZSBlbmQgaXMgYmV0d2VlbiBTS0lQX1pFUk9FU19BVF9FTkQgYW5kCi0gICBTS0lQX1pFUk9FUywgdGhleSB3aWxsIGJlIGRpc2Fzc2VtYmxlZC4gIElmIHRoZXJlIGFyZSBmZXdlciB0aGFuCi0gICBTS0lQX1pFUk9FU19BVF9FTkQsIHRoZXkgd2lsbCBiZSBza2lwcGVkLiAgVGhpcyBpcyBhIGhldXJpc3RpYwotICAgYXR0ZW1wdCB0byBhdm9pZCBkaXNhc3NlbWJsaW5nIHplcm9lcyBpbnNlcnRlZCBieSBzZWN0aW9uCi0gICBhbGlnbm1lbnQuICAqLwotCi0jZGVmaW5lIFNLSVBfWkVST0VTX0FUX0VORCAoMykKLQotLyogRGlzYXNzZW1ibGUgc29tZSBkYXRhIGluIG1lbW9yeSBiZXR3ZWVuIGdpdmVuIHZhbHVlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZV9ieXRlcyAoaW5mbywgZGlzYXNzZW1ibGVfZm4sIGluc25zLCBkYXRhLCBzdGFydCwgc3RvcCwgcmVscHBwLAotCQkgICByZWxwcGVuZCkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZV9mbjsKLSAgICAgYm9vbGVhbiBpbnNuczsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJmZF92bWEgc3RhcnQ7Ci0gICAgIGJmZF92bWEgc3RvcDsKLSAgICAgYXJlbGVudCAqKipyZWxwcHA7Ci0gICAgIGFyZWxlbnQgKipyZWxwcGVuZDsKLXsKLSAgc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKmF1eDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGludCBieXRlc19wZXJfbGluZTsKLSAgYm9vbGVhbiBkb25lX2RvdDsKLSAgaW50IHNraXBfYWRkcl9jaGFyczsKLSAgYmZkX3ZtYSBpOwotCi0gIGF1eCA9IChzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqKSBpbmZvLT5hcHBsaWNhdGlvbl9kYXRhOwotICBzZWN0aW9uID0gYXV4LT5zZWM7Ci0KLSAgaWYgKGluc25zKQotICAgIGJ5dGVzX3Blcl9saW5lID0gNDsKLSAgZWxzZQotICAgIGJ5dGVzX3Blcl9saW5lID0gMTY7Ci0KLSAgLyogRmlndXJlIG91dCBob3cgbWFueSBjaGFyYWN0ZXJzIHRvIHNraXAgYXQgdGhlIHN0YXJ0IG9mIGFuCi0gICAgIGFkZHJlc3MsIHRvIG1ha2UgdGhlIGRpc2Fzc2VtYmx5IGxvb2sgbmljZXIuICBXZSBkaXNjYXJkIGxlYWRpbmcKLSAgICAgemVyb2VzIGluIGNodW5rcyBvZiA0LCBlbnN1cmluZyB0aGF0IHRoZXJlIGlzIGFsd2F5cyBhIGxlYWRpbmcKLSAgICAgemVybyByZW1haW5pbmcuICAqLwotICBza2lwX2FkZHJfY2hhcnMgPSAwOwotICBpZiAoISBwcmVmaXhfYWRkcmVzc2VzKQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzMwXTsKLSAgICAgIGNoYXIgKnM7Ci0KLSAgICAgIHNwcmludGZfdm1hIChidWYsCi0JCSAgIHNlY3Rpb24tPnZtYSArIGJmZF9zZWN0aW9uX3NpemUgKHNlY3Rpb24tPm93bmVyLCBzZWN0aW9uKSk7Ci0gICAgICBzID0gYnVmOwotICAgICAgd2hpbGUgKHNbMF0gPT0gJzAnICYmIHNbMV0gPT0gJzAnICYmIHNbMl0gPT0gJzAnICYmIHNbM10gPT0gJzAnCi0JICAgICAmJiBzWzRdID09ICcwJykKLQl7Ci0JICBza2lwX2FkZHJfY2hhcnMgKz0gNDsKLQkgIHMgKz0gNDsKLQl9Ci0gICAgfQotCi0gIGluZm8tPmluc25faW5mb192YWxpZCA9IDA7Ci0KLSAgZG9uZV9kb3QgPSBmYWxzZTsKLSAgaSA9IHN0YXJ0OwotICB3aGlsZSAoaSA8IHN0b3ApCi0gICAgewotICAgICAgYmZkX3ZtYSB6OwotICAgICAgaW50IGJ5dGVzID0gMDsKLSAgICAgIGJvb2xlYW4gbmVlZF9ubCA9IGZhbHNlOwotCi0gICAgICAvKiBJZiB3ZSBzZWUgbW9yZSB0aGFuIFNLSVBfWkVST0VTIGJ5dGVzIG9mIHplcm9lcywgd2UganVzdAotICAgICAgICAgcHJpbnQgYC4uLicuICAqLwotICAgICAgZm9yICh6ID0gaTsgeiA8IHN0b3A7IHorKykKLQlpZiAoZGF0YVt6XSAhPSAwKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoISBkaXNhc3NlbWJsZV96ZXJvZXMKLQkgICYmIChpbmZvLT5pbnNuX2luZm9fdmFsaWQgPT0gMAotCSAgICAgIHx8IGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9PSAwKQotCSAgJiYgKHogLSBpID49IFNLSVBfWkVST0VTCi0JICAgICAgfHwgKHogPT0gc3RvcCAmJiB6IC0gaSA8IFNLSVBfWkVST0VTX0FUX0VORCkpKQotCXsKLQkgIHByaW50ZiAoIlx0Li4uXG4iKTsKLQotCSAgLyogSWYgdGhlcmUgYXJlIG1vcmUgbm9uemVybyBieXRlcyB0byBmb2xsb3csIHdlIG9ubHkgc2tpcAotICAgICAgICAgICAgIHplcm9lcyBpbiBtdWx0aXBsZXMgb2YgNCwgdG8gdHJ5IHRvIGF2b2lkIHJ1bm5pbmcgb3ZlcgotICAgICAgICAgICAgIHRoZSBzdGFydCBvZiBhbiBpbnN0cnVjdGlvbiB3aGljaCBoYXBwZW5zIHRvIHN0YXJ0IHdpdGgKLSAgICAgICAgICAgICB6ZXJvLiAgKi8KLQkgIGlmICh6ICE9IHN0b3ApCi0JICAgIHogPSBpICsgKCh6IC0gaSkgJn4gMyk7Ci0KLQkgIGJ5dGVzID0geiAtIGk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgYnVmWzUwXTsKLQkgIFNGSUxFIHNmaWxlOwotCSAgaW50IGJwYyA9IDA7Ci0JICBpbnQgcGIgPSAwOwotCi0JICBkb25lX2RvdCA9IGZhbHNlOwotCi0JICBpZiAod2l0aF9saW5lX251bWJlcnMgfHwgd2l0aF9zb3VyY2VfY29kZSkKLQkgICAgc2hvd19saW5lIChhdXgtPmFiZmQsIHNlY3Rpb24sIGkpOwotCi0JICBpZiAoISBwcmVmaXhfYWRkcmVzc2VzKQotCSAgICB7Ci0JICAgICAgY2hhciAqczsKLQotCSAgICAgIHNwcmludGZfdm1hIChidWYsIHNlY3Rpb24tPnZtYSArIGkpOwotCSAgICAgIGZvciAocyA9IGJ1ZiArIHNraXBfYWRkcl9jaGFyczsgKnMgPT0gJzAnOyBzKyspCi0JCSpzID0gJyAnOwotCSAgICAgIGlmICgqcyA9PSAnXDAnKQotCQkqLS1zID0gJzAnOwotCSAgICAgIHByaW50ZiAoIiVzOlx0IiwgYnVmICsgc2tpcF9hZGRyX2NoYXJzKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXV4LT5yZXF1aXJlX3NlYyA9IHRydWU7Ci0JICAgICAgb2JqZHVtcF9wcmludF9hZGRyZXNzIChzZWN0aW9uLT52bWEgKyBpLCBpbmZvKTsKLQkgICAgICBhdXgtPnJlcXVpcmVfc2VjID0gZmFsc2U7Ci0JICAgICAgcHV0Y2hhciAoJyAnKTsKLQkgICAgfQotCi0JICBpZiAoaW5zbnMpCi0JICAgIHsKLQkgICAgICBzZmlsZS5zaXplID0gMTIwOwotCSAgICAgIHNmaWxlLmJ1ZmZlciA9IHhtYWxsb2MgKHNmaWxlLnNpemUpOwotCSAgICAgIHNmaWxlLmN1cnJlbnQgPSBzZmlsZS5idWZmZXI7Ci0JICAgICAgaW5mby0+ZnByaW50Zl9mdW5jID0gKGZwcmludGZfZnR5cGUpIG9iamR1bXBfc3ByaW50ZjsKLQkgICAgICBpbmZvLT5zdHJlYW0gPSAoRklMRSAqKSAmc2ZpbGU7Ci0JICAgICAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSAwOwotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDA7Ci0KLQkgICAgICAvKiBGSVhNRTogVGhpcyBpcyB3cm9uZy4gIEl0IHRlc3RzIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgICAgICAgICAgICAgaW4gdGhlIGxhc3QgaW5zdHJ1Y3Rpb24sIG5vdCB0aGUgY3VycmVudCBvbmUuICAqLwotCSAgICAgIGlmICgqcmVscHBwIDwgcmVscHBlbmQKLQkJICAmJiAoKipyZWxwcHApLT5hZGRyZXNzID49IGkKLQkJICAmJiAoKipyZWxwcHApLT5hZGRyZXNzIDwgaSArIGJ5dGVzKQotCQlpbmZvLT5mbGFncyA9IElOU05fSEFTX1JFTE9DOwotCSAgICAgIGVsc2UKLQkJaW5mby0+ZmxhZ3MgPSAwOwotCi0JICAgICAgYnl0ZXMgPSAoKmRpc2Fzc2VtYmxlX2ZuKSAoc2VjdGlvbi0+dm1hICsgaSwgaW5mbyk7Ci0JICAgICAgaW5mby0+ZnByaW50Zl9mdW5jID0gKGZwcmludGZfZnR5cGUpIGZwcmludGY7Ci0JICAgICAgaW5mby0+c3RyZWFtID0gc3Rkb3V0OwotCSAgICAgIGlmIChpbmZvLT5ieXRlc19wZXJfbGluZSAhPSAwKQotCQlieXRlc19wZXJfbGluZSA9IGluZm8tPmJ5dGVzX3Blcl9saW5lOwotCSAgICAgIGlmIChieXRlcyA8IDApCi0JCXsKLQkJICBpZiAoc2ZpbGUuY3VycmVudCAhPSBzZmlsZS5idWZmZXIpCi0JCSAgICBwcmludGYgKCIlc1xuIiwgc2ZpbGUuYnVmZmVyKTsKLQkJICBmcmVlIChzZmlsZS5idWZmZXIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgajsKLQotCSAgICAgIGJ5dGVzID0gYnl0ZXNfcGVyX2xpbmU7Ci0JICAgICAgaWYgKGkgKyBieXRlcyA+IHN0b3ApCi0JCWJ5dGVzID0gc3RvcCAtIGk7Ci0KLQkgICAgICBmb3IgKGogPSBpOyBqIDwgaSArIGJ5dGVzOyArK2opCi0JCXsKLQkJICBpZiAoaXNwcmludCAoZGF0YVtqXSkpCi0JCSAgICBidWZbaiAtIGldID0gZGF0YVtqXTsKLQkJICBlbHNlCi0JCSAgICBidWZbaiAtIGldID0gJy4nOwotCQl9Ci0JICAgICAgYnVmW2ogLSBpXSA9ICdcMCc7Ci0JICAgIH0KLQotCSAgaWYgKHByZWZpeF9hZGRyZXNzZXMKLQkgICAgICA/IHNob3dfcmF3X2luc24gPiAwCi0JICAgICAgOiBzaG93X3Jhd19pbnNuID49IDApCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIGo7Ci0KLQkgICAgICAvKiBJZiAhIHByZWZpeF9hZGRyZXNzZXMgYW5kICEgd2lkZV9vdXRwdXQsIHdlIHByaW50Ci0gICAgICAgICAgICAgICAgIGJ5dGVzX3Blcl9saW5lIGJ5dGVzIHBlciBsaW5lLiAgKi8KLQkgICAgICBwYiA9IGJ5dGVzOwotCSAgICAgIGlmIChwYiA+IGJ5dGVzX3Blcl9saW5lICYmICEgcHJlZml4X2FkZHJlc3NlcyAmJiAhIHdpZGVfb3V0cHV0KQotCQlwYiA9IGJ5dGVzX3Blcl9saW5lOwotCi0JICAgICAgaWYgKGluZm8tPmJ5dGVzX3Blcl9jaHVuaykKLQkJYnBjID0gaW5mby0+Ynl0ZXNfcGVyX2NodW5rOwotCSAgICAgIGVsc2UKLQkJYnBjID0gMTsKLQotCSAgICAgIGZvciAoaiA9IGk7IGogPCBpICsgcGI7IGogKz0gYnBjKQotCQl7Ci0JCSAgaW50IGs7Ci0JCSAgaWYgKGJwYyA+IDEgJiYgaW5mby0+ZGlzcGxheV9lbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0JCSAgICB7Ci0JCSAgICAgIGZvciAoayA9IGJwYyAtIDE7IGsgPj0gMDsgay0tKQotCQkJcHJpbnRmICgiJTAyeCIsICh1bnNpZ25lZCkgZGF0YVtqICsga10pOwotCQkgICAgICBwdXRjaGFyICgnICcpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgZm9yIChrID0gMDsgayA8IGJwYzsgaysrKQotCQkJcHJpbnRmICgiJTAyeCIsICh1bnNpZ25lZCkgZGF0YVtqICsga10pOwotCQkgICAgICBwdXRjaGFyICgnICcpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBmb3IgKDsgcGIgPCBieXRlc19wZXJfbGluZTsgcGIgKz0gYnBjKQotCQl7Ci0JCSAgaW50IGs7Ci0KLQkJICBmb3IgKGsgPSAwOyBrIDwgYnBjOyBrKyspCi0JCSAgICBwcmludGYgKCIgICIpOwotCQkgIHB1dGNoYXIgKCcgJyk7Ci0JCX0KLQotCSAgICAgIC8qIFNlcGFyYXRlIHJhdyBkYXRhIGZyb20gaW5zdHJ1Y3Rpb24gYnkgZXh0cmEgc3BhY2UuICAqLwotCSAgICAgIGlmIChpbnNucykKLQkJcHV0Y2hhciAoJ1x0Jyk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCIgICAgIik7Ci0JICAgIH0KLQotCSAgaWYgKCEgaW5zbnMpCi0JICAgIHByaW50ZiAoIiVzIiwgYnVmKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVzIiwgc2ZpbGUuYnVmZmVyKTsKLQkgICAgICBmcmVlIChzZmlsZS5idWZmZXIpOwotCSAgICB9Ci0KLQkgIGlmIChwcmVmaXhfYWRkcmVzc2VzCi0JICAgICAgPyBzaG93X3Jhd19pbnNuID4gMAotCSAgICAgIDogc2hvd19yYXdfaW5zbiA+PSAwKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKHBiIDwgYnl0ZXMpCi0JCXsKLQkJICBiZmRfdm1hIGo7Ci0JCSAgY2hhciAqczsKLQotCQkgIHB1dGNoYXIgKCdcbicpOwotCQkgIGogPSBpICsgcGI7Ci0KLQkJICBzcHJpbnRmX3ZtYSAoYnVmLCBzZWN0aW9uLT52bWEgKyBqKTsKLQkJICBmb3IgKHMgPSBidWYgKyBza2lwX2FkZHJfY2hhcnM7ICpzID09ICcwJzsgcysrKQotCQkgICAgKnMgPSAnICc7Ci0JCSAgaWYgKCpzID09ICdcMCcpCi0JCSAgICAqLS1zID0gJzAnOwotCQkgIHByaW50ZiAoIiVzOlx0IiwgYnVmICsgc2tpcF9hZGRyX2NoYXJzKTsKLQotCQkgIHBiICs9IGJ5dGVzX3Blcl9saW5lOwotCQkgIGlmIChwYiA+IGJ5dGVzKQotCQkgICAgcGIgPSBieXRlczsKLQkJICBmb3IgKDsgaiA8IGkgKyBwYjsgaiArPSBicGMpCi0JCSAgICB7Ci0JCSAgICAgIGludCBrOwotCi0JCSAgICAgIGlmIChicGMgPiAxICYmIGluZm8tPmRpc3BsYXlfZW5kaWFuID09IEJGRF9FTkRJQU5fTElUVExFKQotCQkJewotCQkJICBmb3IgKGsgPSBicGMgLSAxOyBrID49IDA7IGstLSkKLQkJCSAgICBwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSBkYXRhW2ogKyBrXSk7Ci0JCQkgIHB1dGNoYXIgKCcgJyk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgZm9yIChrID0gMDsgayA8IGJwYzsgaysrKQotCQkJICAgIHByaW50ZiAoIiUwMngiLCAodW5zaWduZWQpIGRhdGFbaiArIGtdKTsKLQkJCSAgcHV0Y2hhciAoJyAnKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmICghd2lkZV9vdXRwdXQpCi0JICAgIHB1dGNoYXIgKCdcbicpOwotCSAgZWxzZQotCSAgICBuZWVkX25sID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIGlmIChkdW1wX3JlbG9jX2luZm8KLQkgICYmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQl7Ci0JICB3aGlsZSAoKCpyZWxwcHApIDwgcmVscHBlbmQKLQkJICYmICgoKipyZWxwcHApLT5hZGRyZXNzID49IChiZmRfdm1hKSBpCi0JCSAgICAgJiYgKCoqcmVscHBwKS0+YWRkcmVzcyA8IChiZmRfdm1hKSBpICsgYnl0ZXMpKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqcTsKLQotCSAgICAgIHEgPSAqKnJlbHBwcDsKLQotCSAgICAgIGlmICh3aWRlX291dHB1dCkKLQkJcHV0Y2hhciAoJ1x0Jyk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCJcdFx0XHQiKTsKLQotCSAgICAgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHNlY3Rpb24tPnZtYSArIHEtPmFkZHJlc3MsIGluZm8sIHRydWUpOwotCi0JICAgICAgcHJpbnRmICgiOiAlc1x0IiwgcS0+aG93dG8tPm5hbWUpOwotCi0JICAgICAgaWYgKHEtPnN5bV9wdHJfcHRyID09IE5VTEwgfHwgKnEtPnN5bV9wdHJfcHRyID09IE5VTEwpCi0JCXByaW50ZiAoIip1bmtub3duKiIpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCi0JCSAgc3ltX25hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqcS0+c3ltX3B0cl9wdHIpOwotCQkgIGlmIChzeW1fbmFtZSAhPSBOVUxMICYmICpzeW1fbmFtZSAhPSAnXDAnKQotCQkgICAgb2JqZHVtcF9wcmludF9zeW1uYW1lIChhdXgtPmFiZmQsIGluZm8sICpxLT5zeW1fcHRyX3B0cik7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLQotCQkgICAgICBzeW1fc2VjID0gYmZkX2dldF9zZWN0aW9uICgqcS0+c3ltX3B0cl9wdHIpOwotCQkgICAgICBzeW1fbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhdXgtPmFiZmQsIHN5bV9zZWMpOwotCQkgICAgICBpZiAoc3ltX25hbWUgPT0gTlVMTCB8fCAqc3ltX25hbWUgPT0gJ1wwJykKLQkJCXN5bV9uYW1lID0gIip1bmtub3duKiI7Ci0JCSAgICAgIHByaW50ZiAoIiVzIiwgc3ltX25hbWUpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAocS0+YWRkZW5kKQotCQl7Ci0JCSAgcHJpbnRmICgiKzB4Iik7Ci0JCSAgb2JqZHVtcF9wcmludF92YWx1ZSAocS0+YWRkZW5kLCBpbmZvLCB0cnVlKTsKLQkJfQotCi0JICAgICAgcHJpbnRmICgiXG4iKTsKLQkgICAgICBuZWVkX25sID0gZmFsc2U7Ci0JICAgICAgKysoKnJlbHBwcCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChuZWVkX25sKQotCXByaW50ZiAoIlxuIik7Ci0KLSAgICAgIGkgKz0gYnl0ZXM7Ci0gICAgfQotfQotCi0vKiBEaXNhc3NlbWJsZSB0aGUgY29udGVudHMgb2YgYW4gb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGVfZGF0YSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIGk7Ci0gIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZV9mbjsKLSAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gZGlzYXNtX2luZm87Ci0gIHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvIGF1eDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgcHJpbnRfZmlsZXMgPSBOVUxMOwotICBwcmV2X2Z1bmN0aW9ubmFtZSA9IE5VTEw7Ci0gIHByZXZfbGluZSA9IC0xOwotCi0gIC8qIFdlIG1ha2UgYSBjb3B5IG9mIHN5bXMgdG8gc29ydC4gIFdlIGRvbid0IHdhbnQgdG8gc29ydCBzeW1zCi0gICAgIGJlY2F1c2UgdGhhdCB3aWxsIHNjcmV3IHVwIHRoZSByZWxvY3MuICAqLwotICBzb3J0ZWRfc3ltcyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1jb3VudCAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIG1lbWNweSAoc29ydGVkX3N5bXMsIHN5bXMsIHN5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLQotICBzb3J0ZWRfc3ltY291bnQgPSByZW1vdmVfdXNlbGVzc19zeW1ib2xzIChzb3J0ZWRfc3ltcywgc3ltY291bnQpOwotCi0gIC8qIFNvcnQgdGhlIHN5bWJvbHMgaW50byBzZWN0aW9uIGFuZCBzeW1ib2wgb3JkZXIgKi8KLSAgcXNvcnQgKHNvcnRlZF9zeW1zLCBzb3J0ZWRfc3ltY291bnQsIHNpemVvZiAoYXN5bWJvbCAqKSwgY29tcGFyZV9zeW1ib2xzKTsKLQotICBJTklUX0RJU0FTU0VNQkxFX0lORk8oZGlzYXNtX2luZm8sIHN0ZG91dCwgZnByaW50Zik7Ci0gIGRpc2FzbV9pbmZvLmFwcGxpY2F0aW9uX2RhdGEgPSAoUFRSKSAmYXV4OwotICBhdXguYWJmZCA9IGFiZmQ7Ci0gIGF1eC5yZXF1aXJlX3NlYyA9IGZhbHNlOwotICBkaXNhc21faW5mby5wcmludF9hZGRyZXNzX2Z1bmMgPSBvYmpkdW1wX3ByaW50X2FkZHJlc3M7Ci0gIGRpc2FzbV9pbmZvLnN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgPSBvYmpkdW1wX3N5bWJvbF9hdF9hZGRyZXNzOwotCi0gIGlmIChtYWNoaW5lICE9IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICppbmZvID0gYmZkX3NjYW5fYXJjaCAobWFjaGluZSk7Ci0gICAgICBpZiAoaW5mbyA9PSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IHVzZSBzdXBwbGllZCBtYWNoaW5lICVzXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLAotCQkgICBtYWNoaW5lKTsKLQkgIGV4aXQgKDEpOwotCX0KLSAgICAgIGFiZmQtPmFyY2hfaW5mbyA9IGluZm87Ci0gICAgfQotCi0gIGlmIChlbmRpYW4gIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfdGFyZ2V0ICp4dmVjOwotCi0gICAgICB4dmVjID0gKHN0cnVjdCBiZmRfdGFyZ2V0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF90YXJnZXQpKTsKLSAgICAgIG1lbWNweSAoeHZlYywgYWJmZC0+eHZlYywgc2l6ZW9mIChzdHJ1Y3QgYmZkX3RhcmdldCkpOwotICAgICAgeHZlYy0+Ynl0ZW9yZGVyID0gZW5kaWFuOwotICAgICAgYWJmZC0+eHZlYyA9IHh2ZWM7Ci0gICAgfQotCi0gIGRpc2Fzc2VtYmxlX2ZuID0gZGlzYXNzZW1ibGVyIChhYmZkKTsKLSAgaWYgKCFkaXNhc3NlbWJsZV9mbikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBDYW4ndCBkaXNhc3NlbWJsZSBmb3IgYXJjaGl0ZWN0dXJlICVzXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLAotCSAgICAgICBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoYmZkX2dldF9hcmNoIChhYmZkKSwgMCkpOwotICAgICAgZXhpdF9zdGF0dXMgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkaXNhc21faW5mby5mbGF2b3VyID0gYmZkX2dldF9mbGF2b3VyIChhYmZkKTsKLSAgZGlzYXNtX2luZm8uYXJjaCA9IGJmZF9nZXRfYXJjaCAoYWJmZCk7Ci0gIGRpc2FzbV9pbmZvLm1hY2ggPSBiZmRfZ2V0X21hY2ggKGFiZmQpOwotICBkaXNhc21faW5mby5kaXNhc3NlbWJsZXJfb3B0aW9ucyA9IGRpc2Fzc2VtYmxlcl9vcHRpb25zOwotICAKLSAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICBkaXNhc21faW5mby5kaXNwbGF5X2VuZGlhbiA9IGRpc2FzbV9pbmZvLmVuZGlhbiA9IEJGRF9FTkRJQU5fQklHOwotICBlbHNlIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0gICAgZGlzYXNtX2luZm8uZGlzcGxheV9lbmRpYW4gPSBkaXNhc21faW5mby5lbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKLSAgZWxzZQotICAgIC8qID8/PyBBYm9ydGluZyBoZXJlIHNlZW1zIHRvbyBkcmFzdGljLiAgV2UgY291bGQgZGVmYXVsdCB0byBiaWcgb3IgbGl0dGxlCi0gICAgICAgaW5zdGVhZC4gICovCi0gICAgZGlzYXNtX2luZm8uZW5kaWFuID0gQkZEX0VORElBTl9VTktOT1dOOwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgIHNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0gICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmRhdGEgPSBOVUxMOwotICAgICAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7Ci0gICAgICBhcmVsZW50ICoqcmVsYnVmID0gTlVMTDsKLSAgICAgIGFyZWxlbnQgKipyZWxwcCA9IE5VTEw7Ci0gICAgICBhcmVsZW50ICoqcmVscHBlbmQgPSBOVUxMOwotICAgICAgbG9uZyBzdG9wOwotICAgICAgYXN5bWJvbCAqc3ltID0gTlVMTDsKLSAgICAgIGxvbmcgcGxhY2UgPSAwOwotCi0gICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpID09IDAKLQkgIHx8ICghIGRpc2Fzc2VtYmxlX2FsbAotCSAgICAgICYmIG9ubHkgPT0gTlVMTAotCSAgICAgICYmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChvbmx5ICE9IChjaGFyICopIE5VTEwgJiYgc3RyY21wIChvbmx5LCBzZWN0aW9uLT5uYW1lKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZHVtcF9yZWxvY19pbmZvCi0JICAmJiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgbG9uZyByZWxzaXplOwotCi0JICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjdGlvbik7Ci0JICBpZiAocmVsc2l6ZSA8IDApCi0JICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0JICBpZiAocmVsc2l6ZSA+IDApCi0JICAgIHsKLQkgICAgICBsb25nIHJlbGNvdW50OwotCi0JICAgICAgcmVsYnVmID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotCSAgICAgIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVsYnVmLCBzeW1zKTsKLQkgICAgICBpZiAocmVsY291bnQgPCAwKQotCQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotCSAgICAgIC8qIFNvcnQgdGhlIHJlbG9jcyBieSBhZGRyZXNzLiAgKi8KLQkgICAgICBxc29ydCAocmVsYnVmLCByZWxjb3VudCwgc2l6ZW9mIChhcmVsZW50ICopLCBjb21wYXJlX3JlbG9jcyk7Ci0KLQkgICAgICByZWxwcCA9IHJlbGJ1ZjsKLQkgICAgICByZWxwcGVuZCA9IHJlbHBwICsgcmVsY291bnQ7Ci0KLQkgICAgICAvKiBTa2lwIG92ZXIgdGhlIHJlbG9jcyBiZWxvbmdpbmcgdG8gYWRkcmVzc2VzIGJlbG93IHRoZQotCQkgc3RhcnQgYWRkcmVzcy4gICovCi0JICAgICAgaWYgKHN0YXJ0X2FkZHJlc3MgIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgd2hpbGUgKHJlbHBwIDwgcmVscHBlbmQKLQkJCSAmJiAoKnJlbHBwKS0+YWRkcmVzcyA8IHN0YXJ0X2FkZHJlc3MpCi0JCSAgICArK3JlbHBwOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHByaW50ZiAoXygiRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAlczpcbiIpLCBzZWN0aW9uLT5uYW1lKTsKLQotICAgICAgZGF0YXNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3Rpb24pOwotICAgICAgaWYgKGRhdGFzaXplID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGRhdGEgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoKHNpemVfdCkgZGF0YXNpemUpOwotCi0gICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGRhdGEsIDAsIGRhdGFzaXplKTsKLQotICAgICAgYXV4LnNlYyA9IHNlY3Rpb247Ci0gICAgICBkaXNhc21faW5mby5idWZmZXIgPSBkYXRhOwotICAgICAgZGlzYXNtX2luZm8uYnVmZmVyX3ZtYSA9IHNlY3Rpb24tPnZtYTsKLSAgICAgIGRpc2FzbV9pbmZvLmJ1ZmZlcl9sZW5ndGggPSBkYXRhc2l6ZTsKLSAgICAgIGlmIChzdGFydF9hZGRyZXNzID09IChiZmRfdm1hKSAtMQotCSAgfHwgc3RhcnRfYWRkcmVzcyA8IGRpc2FzbV9pbmZvLmJ1ZmZlcl92bWEpCi0JaSA9IDA7Ci0gICAgICBlbHNlCi0JaSA9IHN0YXJ0X2FkZHJlc3MgLSBkaXNhc21faW5mby5idWZmZXJfdm1hOwotICAgICAgaWYgKHN0b3BfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEpCi0Jc3RvcCA9IGRhdGFzaXplOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChzdG9wX2FkZHJlc3MgPCBkaXNhc21faW5mby5idWZmZXJfdm1hKQotCSAgICBzdG9wID0gMDsKLQkgIGVsc2UKLQkgICAgc3RvcCA9IHN0b3BfYWRkcmVzcyAtIGRpc2FzbV9pbmZvLmJ1ZmZlcl92bWE7Ci0JICBpZiAoc3RvcCA+IGRpc2FzbV9pbmZvLmJ1ZmZlcl9sZW5ndGgpCi0JICAgIHN0b3AgPSBkaXNhc21faW5mby5idWZmZXJfbGVuZ3RoOwotCX0KLQotICAgICAgc3ltID0gZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MgKGFiZmQsIHNlY3Rpb24sIHNlY3Rpb24tPnZtYSArIGksCi0JCQkJICAgICB0cnVlLCAmcGxhY2UpOwotCi0gICAgICB3aGlsZSAoaSA8IHN0b3ApCi0JewotCSAgYXN5bWJvbCAqbmV4dHN5bTsKLQkgIGxvbmcgbmV4dHN0b3A7Ci0JICBib29sZWFuIGluc25zOwotCSAgCi0JICBpZiAoc3ltICE9IE5VTEwgJiYgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPD0gc2VjdGlvbi0+dm1hICsgaSkKLQkgICAgewotCSAgICAgIGludCB4OwotCi0JICAgICAgZm9yICh4ID0gcGxhY2U7Ci0JCSAgICh4IDwgc29ydGVkX3N5bWNvdW50Ci0JCSAgICAmJiBiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbeF0pIDw9IHNlY3Rpb24tPnZtYSArIGkpOwotCQkgICArK3gpCi0JCWNvbnRpbnVlOwotCSAgICAgIGRpc2FzbV9pbmZvLnN5bWJvbHMgPSAmIHNvcnRlZF9zeW1zW3BsYWNlXTsKLQkgICAgICBkaXNhc21faW5mby5udW1fc3ltYm9scyA9IHggLSBwbGFjZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBkaXNhc21faW5mby5zeW1ib2xzID0gTlVMTDsKLQotCSAgaWYgKCEgcHJlZml4X2FkZHJlc3NlcykKLQkgICAgewotCSAgICAgIHByaW50ZiAoIlxuIik7Ci0JICAgICAgb2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltIChhYmZkLCBzZWN0aW9uLCBzeW0sCi0JCQkJCSAgIHNlY3Rpb24tPnZtYSArIGksCi0JCQkJCSAgICZkaXNhc21faW5mbywKLQkJCQkJICAgZmFsc2UpOwotCSAgICAgIHByaW50ZiAoIjpcbiIpOwotCSAgICB9Ci0JICAKLQkgIGlmIChzeW0gIT0gTlVMTCAmJiBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHNlY3Rpb24tPnZtYSArIGkpCi0JICAgIG5leHRzeW0gPSBzeW07Ci0JICBlbHNlIGlmIChzeW0gPT0gTlVMTCkKLQkgICAgbmV4dHN5bSA9IE5VTEw7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTZWFyY2ggZm9yd2FyZCBmb3IgdGhlIG5leHQgYXBwcm9wcmlhdGUgc3ltYm9sIGluCi0gICAgICAgICAgICAgICAgIFNFQ1RJT04uICBOb3RlIHRoYXQgYWxsIHRoZSBzeW1ib2xzIGFyZSBzb3J0ZWQKLSAgICAgICAgICAgICAgICAgdG9nZXRoZXIgaW50byBvbmUgYmlnIGFycmF5LCBhbmQgdGhhdCBzb21lIHNlY3Rpb25zCi0gICAgICAgICAgICAgICAgIG1heSBoYXZlIG92ZXJsYXBwaW5nIGFkZHJlc3Nlcy4gICovCi0JICAgICAgd2hpbGUgKHBsYWNlIDwgc29ydGVkX3N5bWNvdW50Ci0JCSAgICAgJiYgKHNvcnRlZF9zeW1zW3BsYWNlXS0+c2VjdGlvbiAhPSBzZWN0aW9uCi0JCQkgfHwgKGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1twbGFjZV0pCi0JCQkgICAgIDw9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkpCi0JCSsrcGxhY2U7Ci0JICAgICAgaWYgKHBsYWNlID49IHNvcnRlZF9zeW1jb3VudCkKLQkJbmV4dHN5bSA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQluZXh0c3ltID0gc29ydGVkX3N5bXNbcGxhY2VdOwotCSAgICB9Ci0JICAKLQkgIGlmIChzeW0gIT0gTlVMTCAmJiBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHNlY3Rpb24tPnZtYSArIGkpCi0JICAgIHsKLQkgICAgICBuZXh0c3RvcCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pIC0gc2VjdGlvbi0+dm1hOwotCSAgICAgIGlmIChuZXh0c3RvcCA+IHN0b3ApCi0JCW5leHRzdG9wID0gc3RvcDsKLQkgICAgfQotCSAgZWxzZSBpZiAobmV4dHN5bSA9PSBOVUxMKQotCSAgICBuZXh0c3RvcCA9IHN0b3A7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuZXh0c3RvcCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChuZXh0c3ltKSAtIHNlY3Rpb24tPnZtYTsKLQkgICAgICBpZiAobmV4dHN0b3AgPiBzdG9wKQotCQluZXh0c3RvcCA9IHN0b3A7Ci0JICAgIH0KLQkgIAotCSAgLyogSWYgYSBzeW1ib2wgaXMgZXhwbGljaXRseSBtYXJrZWQgYXMgYmVpbmcgYW4gb2JqZWN0Ci0JICAgICByYXRoZXIgdGhhbiBhIGZ1bmN0aW9uLCBqdXN0IGR1bXAgdGhlIGJ5dGVzIHdpdGhvdXQKLQkgICAgIGRpc2Fzc2VtYmxpbmcgdGhlbS4gICovCi0JICBpZiAoZGlzYXNzZW1ibGVfYWxsCi0JICAgICAgfHwgc3ltID09IE5VTEwKLQkgICAgICB8fCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHNlY3Rpb24tPnZtYSArIGkKLQkgICAgICB8fCAoKHN5bS0+ZmxhZ3MgJiBCU0ZfT0JKRUNUKSA9PSAwCi0JCSAgJiYgKHN0cnN0ciAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgImdudV9jb21waWxlZCIpCi0JCSAgICAgID09IE5VTEwpCi0JCSAgJiYgKHN0cnN0ciAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgImdjYzJfY29tcGlsZWQiKQotCQkgICAgICA9PSBOVUxMKSkKLQkgICAgICB8fCAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikgIT0gMCkKLQkgICAgaW5zbnMgPSB0cnVlOwotCSAgZWxzZQotCSAgICBpbnNucyA9IGZhbHNlOwotCSAgCi0JICBkaXNhc3NlbWJsZV9ieXRlcyAoJmRpc2FzbV9pbmZvLCBkaXNhc3NlbWJsZV9mbiwgaW5zbnMsIGRhdGEsIGksCi0JCQkgICAgIG5leHRzdG9wLCAmcmVscHAsIHJlbHBwZW5kKTsKLQkgIAotCSAgaSA9IG5leHRzdG9wOwotCSAgc3ltID0gbmV4dHN5bTsKLQl9Ci0gICAgICAKLSAgICAgIGZyZWUgKGRhdGEpOwotICAgICAgaWYgKHJlbGJ1ZiAhPSBOVUxMKQotCWZyZWUgKHJlbGJ1Zik7Ci0gICAgfQotICBmcmVlIChzb3J0ZWRfc3ltcyk7Ci19Ci0MCi0KLS8qIERlZmluZSBhIHRhYmxlIG9mIHN0YWIgdmFsdWVzIGFuZCBwcmludC1zdHJpbmdzLiAgV2Ugd2lzaCB0aGUgaW5pdGlhbGl6ZXIKLSAgIGNvdWxkIGJlIGEgZGlyZWN0LW1hcHBlZCB0YWJsZSwgYnV0IGluc3RlYWQgd2UgYnVpbGQgb25lIHRoZSBmaXJzdAotICAgdGltZSB3ZSBuZWVkIGl0LiAgKi8KLQotc3RhdGljIHZvaWQgZHVtcF9zZWN0aW9uX3N0YWJzIFBBUkFNUyAoKGJmZCAqYWJmZCwgY2hhciAqc3RhYnNlY3RfbmFtZSwKLQkJCQkJY2hhciAqc3Ryc2VjdF9uYW1lKSk7Ci0KLS8qIER1bXAgdGhlIHN0YWJzIHNlY3Rpb25zIGZyb20gYW4gb2JqZWN0IGZpbGUgdGhhdCBoYXMgYSBzZWN0aW9uIHRoYXQKLSAgIHVzZXMgU3VuIHN0YWJzIGVuY29kaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfc3RhYnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCAiLnN0YWIiLCAiLnN0YWJzdHIiKTsKLSAgZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCAiLnN0YWIuZXhjbCIsICIuc3RhYi5leGNsc3RyIik7Ci0gIGR1bXBfc2VjdGlvbl9zdGFicyAoYWJmZCwgIi5zdGFiLmluZGV4IiwgIi5zdGFiLmluZGV4c3RyIik7Ci0gIGR1bXBfc2VjdGlvbl9zdGFicyAoYWJmZCwgIiRHREJfU1lNQk9MUyQiLCAiJEdEQl9TVFJJTkdTJCIpOwotfQotCi1zdGF0aWMgYmZkX2J5dGUgKnN0YWJzOwotc3RhdGljIGJmZF9zaXplX3R5cGUgc3RhYl9zaXplOwotCi1zdGF0aWMgY2hhciAqc3RydGFiOwotc3RhdGljIGJmZF9zaXplX3R5cGUgc3RhYnN0cl9zaXplOwotCi0vKiBSZWFkIEFCRkQncyBzdGFicyBzZWN0aW9uIFNUQUJTRUNUX05BTUUgaW50byBgc3RhYnMnCi0gICBhbmQgc3RyaW5nIHRhYmxlIHNlY3Rpb24gU1RSU0VDVF9OQU1FIGludG8gYHN0cnRhYicuCi0gICBJZiB0aGUgc2VjdGlvbiBleGlzdHMgYW5kIHdhcyByZWFkLCBhbGxvY2F0ZSB0aGUgc3BhY2UgYW5kIHJldHVybiB0cnVlLgotICAgT3RoZXJ3aXNlIHJldHVybiBmYWxzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1yZWFkX3NlY3Rpb25fc3RhYnMgKGFiZmQsIHN0YWJzZWN0X25hbWUsIHN0cnNlY3RfbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpzdGFic2VjdF9uYW1lOwotICAgICBjb25zdCBjaGFyICpzdHJzZWN0X25hbWU7Ci17Ci0gIGFzZWN0aW9uICpzdGFic2VjdCwgKnN0YWJzdHJzZWN0OwotCi0gIHN0YWJzZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN0YWJzZWN0X25hbWUpOwotICBpZiAoMCA9PSBzdGFic2VjdCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIk5vICVzIHNlY3Rpb24gcHJlc2VudFxuXG4iKSwgc3RhYnNlY3RfbmFtZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHN0YWJzdHJzZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN0cnNlY3RfbmFtZSk7Ci0gIGlmICgwID09IHN0YWJzdHJzZWN0KQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzIGhhcyBubyAlcyBzZWN0aW9uXG4iKSwgcHJvZ3JhbV9uYW1lLAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3Ryc2VjdF9uYW1lKTsKLSAgICAgIGV4aXRfc3RhdHVzID0gMTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gCi0gIHN0YWJfc2l6ZSAgICA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN0YWJzZWN0KTsKLSAgc3RhYnN0cl9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3RhYnN0cnNlY3QpOwotCi0gIHN0YWJzICA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChzdGFiX3NpemUpOwotICBzdHJ0YWIgPSAoY2hhciAqKSB4bWFsbG9jIChzdGFic3RyX3NpemUpOwotICAKLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzdGFic2VjdCwgKFBUUikgc3RhYnMsIDAsIHN0YWJfc2l6ZSkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogUmVhZGluZyAlcyBzZWN0aW9uIG9mICVzIGZhaWxlZDogJXNcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsIHN0YWJzZWN0X25hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBmcmVlIChzdGFicyk7Ci0gICAgICBmcmVlIChzdHJ0YWIpOwotICAgICAgZXhpdF9zdGF0dXMgPSAxOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0YWJzdHJzZWN0LCAoUFRSKSBzdHJ0YWIsIDAsCi0JCQkJICBzdGFic3RyX3NpemUpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IFJlYWRpbmcgJXMgc2VjdGlvbiBvZiAlcyBmYWlsZWQ6ICVzXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCBzdHJzZWN0X25hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBmcmVlIChzdGFicyk7Ci0gICAgICBmcmVlIChzdHJ0YWIpOwotICAgICAgZXhpdF9zdGF0dXMgPSAxOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhYnMgZW50cmllcyB1c2UgYSAxMiBieXRlIGZvcm1hdDoKLSAgICAgNCBieXRlIHN0cmluZyB0YWJsZSBpbmRleAotICAgICAxIGJ5dGUgc3RhYiB0eXBlCi0gICAgIDEgYnl0ZSBzdGFiIG90aGVyIGZpZWxkCi0gICAgIDIgYnl0ZSBzdGFiIGRlc2MgZmllbGQKLSAgICAgNCBieXRlIHN0YWIgdmFsdWUKLSAgIEZJWE1FOiBUaGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UgZm9yIGEgNjQgYml0IG9iamVjdCBmb3JtYXQuICAqLwotCi0jZGVmaW5lIFNUUkRYT0ZGICgwKQotI2RlZmluZSBUWVBFT0ZGICg0KQotI2RlZmluZSBPVEhFUk9GRiAoNSkKLSNkZWZpbmUgREVTQ09GRiAoNikKLSNkZWZpbmUgVkFMT0ZGICg4KQotI2RlZmluZSBTVEFCU0laRSAoMTIpCi0KLS8qIFByaW50IEFCRkQncyBzdGFicyBzZWN0aW9uIFNUQUJTRUNUX05BTUUgKGluIGBzdGFicycpLAotICAgdXNpbmcgc3RyaW5nIHRhYmxlIHNlY3Rpb24gU1RSU0VDVF9OQU1FIChpbiBgc3RydGFiJykuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc2VjdGlvbl9zdGFicyAoYWJmZCwgc3RhYnNlY3RfbmFtZSwgc3Ryc2VjdF9uYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YWJzZWN0X25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cnNlY3RfbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgaTsKLSAgdW5zaWduZWQgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gMCwgbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQgPSAwOwotICBiZmRfYnl0ZSAqc3RhYnAsICpzdGFic19lbmQ7Ci0KLSAgc3RhYnAgPSBzdGFiczsKLSAgc3RhYnNfZW5kID0gc3RhYnAgKyBzdGFiX3NpemU7Ci0KLSAgcHJpbnRmIChfKCJDb250ZW50cyBvZiAlcyBzZWN0aW9uOlxuXG4iKSwgc3RhYnNlY3RfbmFtZSk7Ci0gIHByaW50ZiAoIlN5bW51bSBuX3R5cGUgbl9vdGhyIG5fZGVzYyBuX3ZhbHVlICBuX3N0cnggU3RyaW5nXG4iKTsKLQotICAvKiBMb29wIHRocm91Z2ggYWxsIHN5bWJvbHMgYW5kIHByaW50IHRoZW0uCi0KLSAgICAgV2Ugc3RhcnQgdGhlIGluZGV4IGF0IC0xIGJlY2F1c2UgdGhlcmUgaXMgYSBkdW1teSBzeW1ib2wgb24KLSAgICAgdGhlIGZyb250IG9mIHN0YWJzLWluLXtjb2ZmLGVsZn0gc2VjdGlvbnMgdGhhdCBzdXBwbGllcyBzaXplcy4gICovCi0KLSAgZm9yIChpID0gLTE7IHN0YWJwIDwgc3RhYnNfZW5kOyBzdGFicCArPSBTVEFCU0laRSwgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICB1bnNpZ25lZCBsb25nIHN0cng7Ci0gICAgICB1bnNpZ25lZCBjaGFyIHR5cGUsIG90aGVyOwotICAgICAgdW5zaWduZWQgc2hvcnQgZGVzYzsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0KLSAgICAgIHN0cnggPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHN0YWJwICsgU1RSRFhPRkYpOwotICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCBzdGFicCArIFRZUEVPRkYpOwotICAgICAgb3RoZXIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgc3RhYnAgKyBPVEhFUk9GRik7Ci0gICAgICBkZXNjID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzdGFicCArIERFU0NPRkYpOwotICAgICAgdmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHN0YWJwICsgVkFMT0ZGKTsKLQotICAgICAgcHJpbnRmICgiXG4lLTZkICIsIGkpOwotICAgICAgLyogRWl0aGVyIHByaW50IHRoZSBzdGFiIG5hbWUsIG9yLCBpZiB1bm5hbWVkLCBwcmludCBpdHMgbnVtYmVyCi0JIGFnYWluIChtYWtlcyBjb25zaXN0ZW50IGZvcm1hdHRpbmcgZm9yIHRvb2xzIGxpa2UgYXdrKS4gKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3N0YWJfbmFtZSAodHlwZSk7Ci0gICAgICBpZiAobmFtZSAhPSBOVUxMKQotCXByaW50ZiAoIiUtNnMiLCBuYW1lKTsKLSAgICAgIGVsc2UgaWYgKHR5cGUgPT0gTl9VTkRGKQotCXByaW50ZiAoIkhkclN5bSIpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiUtNmQiLCB0eXBlKTsKLSAgICAgIHByaW50ZiAoIiAlLTZkICUtNmQgIiwgb3RoZXIsIGRlc2MpOwotICAgICAgcHJpbnRmX3ZtYSAodmFsdWUpOwotICAgICAgcHJpbnRmICgiICUtNmx1Iiwgc3RyeCk7Ci0KLSAgICAgIC8qIFN5bWJvbHMgd2l0aCB0eXBlID09IDAgKE5fVU5ERikgc3BlY2lmeSB0aGUgbGVuZ3RoIG9mIHRoZQotCSBzdHJpbmcgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsZS4gIFdlIHVzZSB0aGF0IGluZm8KLQkgdG8ga25vdyBob3cgdG8gcmVsb2NhdGUgdGhlICpuZXh0KiBmaWxlJ3Mgc3RyaW5nIHRhYmxlIGluZGljZXMuICAqLwotCi0gICAgICBpZiAodHlwZSA9PSBOX1VOREYpCi0JewotCSAgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQ7Ci0JICBuZXh0X2ZpbGVfc3RyaW5nX3RhYmxlX29mZnNldCArPSB2YWx1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVXNpbmcgdGhlIChwb3NzaWJseSB1cGRhdGVkKSBzdHJpbmcgdGFibGUgb2Zmc2V0LCBwcmludCB0aGUKLQkgICAgIHN0cmluZyAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzeW1ib2wuICAqLwotCi0JICBpZiAoKHN0cnggKyBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXQpIDwgc3RhYnN0cl9zaXplKQotCSAgICBwcmludGYgKCIgJXMiLCAmc3RydGFiW3N0cnggKyBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXRdKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiICoiKTsKLQl9Ci0gICAgfQotICBwcmludGYgKCJcblxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3NlY3Rpb25fc3RhYnMgKGFiZmQsIHN0YWJzZWN0X25hbWUsIHN0cnNlY3RfbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpzdGFic2VjdF9uYW1lOwotICAgICBjaGFyICpzdHJzZWN0X25hbWU7Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIC8qIENoZWNrIGZvciBzZWN0aW9uIG5hbWVzIGZvciB3aGljaCBzdGFic2VjdF9uYW1lIGlzIGEgcHJlZml4LCB0bwotICAgICBoYW5kbGUgLnN0YWIwLCBldGMuICAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBzICE9IE5VTEw7Ci0gICAgICAgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaW50IGxlbjsKLQotICAgICAgbGVuID0gc3RybGVuIChzdGFic2VjdF9uYW1lKTsKLQotICAgICAgLyogSWYgdGhlIHByZWZpeCBtYXRjaGVzLCBhbmQgdGhlIGZpbGVzIHNlY3Rpb24gbmFtZSBlbmRzIHdpdGggYQotCSBudWwgb3IgYSBkaWdpdCwgdGhlbiB3ZSBtYXRjaC4gIEkuZS4sIHdlIHdhbnQgZWl0aGVyIGFuIGV4YWN0Ci0JIG1hdGNoIG9yIGEgc2VjdGlvbiBmb2xsb3dlZCBieSBhIG51bWJlci4gICovCi0gICAgICBpZiAoc3RybmNtcCAoc3RhYnNlY3RfbmFtZSwgcy0+bmFtZSwgbGVuKSA9PSAwCi0JICAmJiAocy0+bmFtZVtsZW5dID09ICdcMDAwJwotCSAgICAgIHx8IGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzLT5uYW1lW2xlbl0pKSkKLQl7Ci0JICBpZiAocmVhZF9zZWN0aW9uX3N0YWJzIChhYmZkLCBzLT5uYW1lLCBzdHJzZWN0X25hbWUpKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc2VjdGlvbl9zdGFicyAoYWJmZCwgcy0+bmFtZSwgc3Ryc2VjdF9uYW1lKTsKLQkgICAgICBmcmVlIChzdGFicyk7Ci0JICAgICAgZnJlZSAoc3RydGFiKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0MCi1zdGF0aWMgdm9pZAotZHVtcF9iZmRfaGVhZGVyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmNvbW1hID0gIiI7Ci0KLSAgcHJpbnRmIChfKCJhcmNoaXRlY3R1cmU6ICVzLCAiKSwKLQkgIGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpLAotCQkJCSAgIGJmZF9nZXRfbWFjaCAoYWJmZCkpKTsKLSAgcHJpbnRmIChfKCJmbGFncyAweCUwOHg6XG4iKSwgYWJmZC0+ZmxhZ3MpOwotCi0jZGVmaW5lIFBGKHgsIHkpICAgIGlmIChhYmZkLT5mbGFncyAmIHgpIHtwcmludGYoIiVzJXMiLCBjb21tYSwgeSk7IGNvbW1hPSIsICI7fQotICBQRiAoSEFTX1JFTE9DLCAiSEFTX1JFTE9DIik7Ci0gIFBGIChFWEVDX1AsICJFWEVDX1AiKTsKLSAgUEYgKEhBU19MSU5FTk8sICJIQVNfTElORU5PIik7Ci0gIFBGIChIQVNfREVCVUcsICJIQVNfREVCVUciKTsKLSAgUEYgKEhBU19TWU1TLCAiSEFTX1NZTVMiKTsKLSAgUEYgKEhBU19MT0NBTFMsICJIQVNfTE9DQUxTIik7Ci0gIFBGIChEWU5BTUlDLCAiRFlOQU1JQyIpOwotICBQRiAoV1BfVEVYVCwgIldQX1RFWFQiKTsKLSAgUEYgKERfUEFHRUQsICJEX1BBR0VEIik7Ci0gIFBGIChCRkRfSVNfUkVMQVhBQkxFLCAiQkZEX0lTX1JFTEFYQUJMRSIpOwotICBwcmludGYgKF8oIlxuc3RhcnQgYWRkcmVzcyAweCIpKTsKLSAgcHJpbnRmX3ZtYSAoYWJmZC0+c3RhcnRfYWRkcmVzcyk7Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci0MCi1zdGF0aWMgdm9pZAotZHVtcF9iZmRfcHJpdmF0ZV9oZWFkZXIgKGFiZmQpCi1iZmQgKmFiZmQ7Ci17Ci0gIGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBzdGRvdXQpOwotfQotCi0vKiBEdW1wIHNlbGVjdGVkIGNvbnRlbnRzIG9mIEFCRkQgKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfYmZkIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIElmIHdlIGFyZSBhZGp1c3Rpbmcgc2VjdGlvbiBWTUEncywgY2hhbmdlIHRoZW0gYWxsIG5vdy4gIENoYW5naW5nCi0gICAgIHRoZSBCRkQgaW5mb3JtYXRpb24gaXMgYSBoYWNrLiAgSG93ZXZlciwgd2UgbXVzdCBkbyBpdCwgb3IKLSAgICAgYmZkX2ZpbmRfbmVhcmVzdF9saW5lIHdpbGwgbm90IGRvIHRoZSByaWdodCB0aGluZy4gICovCi0gIGlmIChhZGp1c3Rfc2VjdGlvbl92bWEgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgcy0+dm1hICs9IGFkanVzdF9zZWN0aW9uX3ZtYTsKLQkgIHMtPmxtYSArPSBhZGp1c3Rfc2VjdGlvbl92bWE7Ci0JfQotICAgIH0KLQotICBwcmludGYgKF8oIlxuJXM6ICAgICBmaWxlIGZvcm1hdCAlc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAgYWJmZC0+eHZlYy0+bmFtZSk7Ci0gIGlmIChkdW1wX2FyX2hkcnMpCi0gICAgcHJpbnRfYXJlbHRfZGVzY3IgKHN0ZG91dCwgYWJmZCwgdHJ1ZSk7Ci0gIGlmIChkdW1wX2ZpbGVfaGVhZGVyKQotICAgIGR1bXBfYmZkX2hlYWRlciAoYWJmZCk7Ci0gIGlmIChkdW1wX3ByaXZhdGVfaGVhZGVycykKLSAgICBkdW1wX2JmZF9wcml2YXRlX2hlYWRlciAoYWJmZCk7Ci0gIHB1dGNoYXIgKCdcbicpOwotICBpZiAoZHVtcF9zZWN0aW9uX2hlYWRlcnMpCi0gICAgZHVtcF9oZWFkZXJzIChhYmZkKTsKLSAgaWYgKGR1bXBfc3ltdGFiIHx8IGR1bXBfcmVsb2NfaW5mbyB8fCBkaXNhc3NlbWJsZSB8fCBkdW1wX2RlYnVnZ2luZykKLSAgICB7Ci0gICAgICBzeW1zID0gc2x1cnBfc3ltdGFiIChhYmZkKTsKLSAgICB9Ci0gIGlmIChkdW1wX2R5bmFtaWNfc3ltdGFiIHx8IGR1bXBfZHluYW1pY19yZWxvY19pbmZvKQotICAgIHsKLSAgICAgIGR5bnN5bXMgPSBzbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCk7Ci0gICAgfQotICBpZiAoZHVtcF9zeW10YWIpCi0gICAgZHVtcF9zeW1ib2xzIChhYmZkLCBmYWxzZSk7Ci0gIGlmIChkdW1wX2R5bmFtaWNfc3ltdGFiKQotICAgIGR1bXBfc3ltYm9scyAoYWJmZCwgdHJ1ZSk7Ci0gIGlmIChkdW1wX3N0YWJfc2VjdGlvbl9pbmZvKQotICAgIGR1bXBfc3RhYnMgKGFiZmQpOwotICBpZiAoZHVtcF9yZWxvY19pbmZvICYmICEgZGlzYXNzZW1ibGUpCi0gICAgZHVtcF9yZWxvY3MgKGFiZmQpOwotICBpZiAoZHVtcF9keW5hbWljX3JlbG9jX2luZm8pCi0gICAgZHVtcF9keW5hbWljX3JlbG9jcyAoYWJmZCk7Ci0gIGlmIChkdW1wX3NlY3Rpb25fY29udGVudHMpCi0gICAgZHVtcF9kYXRhIChhYmZkKTsKLSAgaWYgKGRpc2Fzc2VtYmxlKQotICAgIGRpc2Fzc2VtYmxlX2RhdGEgKGFiZmQpOwotICBpZiAoZHVtcF9kZWJ1Z2dpbmcpCi0gICAgewotICAgICAgUFRSIGRoYW5kbGU7Ci0KLSAgICAgIGRoYW5kbGUgPSByZWFkX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCk7Ci0gICAgICBpZiAoZGhhbmRsZSAhPSBOVUxMKQotCXsKLQkgIGlmICghIHByaW50X2RlYnVnZ2luZ19pbmZvIChzdGRvdXQsIGRoYW5kbGUpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IHByaW50aW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmYWlsZWRcbiIpLAotCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgICAgIGV4aXRfc3RhdHVzID0gMTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChzeW1zKQotICAgIHsKLSAgICAgIGZyZWUgKHN5bXMpOwotICAgICAgc3ltcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZHluc3ltcykKLSAgICB7Ci0gICAgICBmcmVlIChkeW5zeW1zKTsKLSAgICAgIGR5bnN5bXMgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfYmZkIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGR1bXBfYmZkIChhYmZkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLSAgICB7Ci0gICAgICBub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0gICAgICBmcmVlIChtYXRjaGluZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkKQotICAgIHsKLSAgICAgIG5vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9jb3JlLCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGR1bXBfYmZkIChhYmZkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotICAgIHsKLSAgICAgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotICAgICAgZnJlZSAobWF0Y2hpbmcpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfZmlsZSAoZmlsZW5hbWUsIHRhcmdldCkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNoYXIgKnRhcmdldDsKLXsKLSAgYmZkICpmaWxlLCAqYXJmaWxlID0gKGJmZCAqKSBOVUxMOwotCi0gIGZpbGUgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIG5vbmZhdGFsIChmaWxlbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaWxlLCBiZmRfYXJjaGl2ZSkgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICBiZmQgKmxhc3RfYXJmaWxlID0gTlVMTDsKLQotICAgICAgcHJpbnRmIChfKCJJbiBhcmNoaXZlICVzOlxuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLSAgICAgIGZvciAoOzspCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQotCSAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZmlsZSwgYXJmaWxlKTsKLQkgIGlmIChhcmZpbGUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKQotCQlub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoZmlsZSkpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGRpc3BsYXlfYmZkIChhcmZpbGUpOwotCi0JICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKLQkgICAgYmZkX2Nsb3NlIChsYXN0X2FyZmlsZSk7Ci0JICBsYXN0X2FyZmlsZSA9IGFyZmlsZTsKLQl9Ci0KLSAgICAgIGlmIChsYXN0X2FyZmlsZSAhPSBOVUxMKQotCWJmZF9jbG9zZSAobGFzdF9hcmZpbGUpOwotICAgIH0KLSAgZWxzZQotICAgIGRpc3BsYXlfYmZkIChmaWxlKTsKLQotICBiZmRfY2xvc2UgKGZpbGUpOwotfQotDAotLyogQWN0dWFsbHkgZGlzcGxheSB0aGUgdmFyaW91cyByZXF1ZXN0ZWQgcmVnaW9ucyAqLwotCi1zdGF0aWMgdm9pZAotZHVtcF9kYXRhIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgZGF0YXNpemUgPSAwOwotICBiZmRfc2l6ZV90eXBlIGk7Ci0gIGJmZF9zaXplX3R5cGUgc3RhcnQsIHN0b3A7Ci0KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9Ci0gICAgICAgc2VjdGlvbi0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgb25hbGluZSA9IDE2OwotCi0gICAgICBpZiAob25seSA9PSAoY2hhciAqKSBOVUxMIHx8Ci0JICBzdHJjbXAgKG9ubHksIHNlY3Rpb24tPm5hbWUpID09IDApCi0JewotCSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykKLQkgICAgewotCSAgICAgIHByaW50ZiAoXygiQ29udGVudHMgb2Ygc2VjdGlvbiAlczpcbiIpLCBzZWN0aW9uLT5uYW1lKTsKLQotCSAgICAgIGlmIChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSA9PSAwKQotCQljb250aW51ZTsKLQkgICAgICBkYXRhID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKChzaXplX3QpIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKTsKLQkgICAgICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotCi0KLQkgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIChQVFIpIGRhdGEsIDAsIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKTsKLQotCSAgICAgIGlmIChzdGFydF9hZGRyZXNzID09IChiZmRfdm1hKSAtMQotCQkgIHx8IHN0YXJ0X2FkZHJlc3MgPCBzZWN0aW9uLT52bWEpCi0JCXN0YXJ0ID0gMDsKLQkgICAgICBlbHNlCi0JCXN0YXJ0ID0gc3RhcnRfYWRkcmVzcyAtIHNlY3Rpb24tPnZtYTsKLQkgICAgICBpZiAoc3RvcF9hZGRyZXNzID09IChiZmRfdm1hKSAtMSkKLQkJc3RvcCA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChzdG9wX2FkZHJlc3MgPCBzZWN0aW9uLT52bWEpCi0JCSAgICBzdG9wID0gMDsKLQkJICBlbHNlCi0JCSAgICBzdG9wID0gc3RvcF9hZGRyZXNzIC0gc2VjdGlvbi0+dm1hOwotCQkgIGlmIChzdG9wID4gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpCi0JCSAgICBzdG9wID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0JCX0KLQkgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gb25hbGluZSkKLQkJewotCQkgIGJmZF9zaXplX3R5cGUgajsKLQotCQkgIHByaW50ZiAoIiAlMDRseCAiLCAodW5zaWduZWQgbG9uZyBpbnQpIChpICsgc2VjdGlvbi0+dm1hKSk7Ci0JCSAgZm9yIChqID0gaTsgaiA8IGkgKyBvbmFsaW5lOyBqKyspCi0JCSAgICB7Ci0JCSAgICAgIGlmIChqIDwgc3RvcCkKLQkJCXByaW50ZiAoIiUwMngiLCAodW5zaWduZWQpIChkYXRhW2pdKSk7Ci0JCSAgICAgIGVsc2UKLQkJCXByaW50ZiAoIiAgIik7Ci0JCSAgICAgIGlmICgoaiAmIDMpID09IDMpCi0JCQlwcmludGYgKCIgIik7Ci0JCSAgICB9Ci0KLQkJICBwcmludGYgKCIgIik7Ci0JCSAgZm9yIChqID0gaTsgaiA8IGkgKyBvbmFsaW5lOyBqKyspCi0JCSAgICB7Ci0JCSAgICAgIGlmIChqID49IHN0b3ApCi0JCQlwcmludGYgKCIgIik7Ci0JCSAgICAgIGVsc2UKLQkJCXByaW50ZiAoIiVjIiwgaXNwcmludCAoZGF0YVtqXSkgPyBkYXRhW2pdIDogJy4nKTsKLQkJICAgIH0KLQkJICBwdXRjaGFyICgnXG4nKTsKLQkJfQotCSAgICAgIGZyZWUgKGRhdGEpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogU2hvdWxkIHBlcmhhcHMgc2hhcmUgY29kZSBhbmQgZGlzcGxheSB3aXRoIG5tPyAqLwotc3RhdGljIHZvaWQKLWR1bXBfc3ltYm9scyAoYWJmZCwgZHluYW1pYykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgYXN5bWJvbCAqKmN1cnJlbnQ7Ci0gIGxvbmcgbWF4OwotICBsb25nIGNvdW50OwotCi0gIGlmIChkeW5hbWljKQotICAgIHsKLSAgICAgIGN1cnJlbnQgPSBkeW5zeW1zOwotICAgICAgbWF4ID0gZHluc3ltY291bnQ7Ci0gICAgICBpZiAobWF4ID09IDApCi0JcmV0dXJuOwotICAgICAgcHJpbnRmICgiRFlOQU1JQyBTWU1CT0wgVEFCTEU6XG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjdXJyZW50ID0gc3ltczsKLSAgICAgIG1heCA9IHN5bWNvdW50OwotICAgICAgaWYgKG1heCA9PSAwKQotCXJldHVybjsKLSAgICAgIHByaW50ZiAoIlNZTUJPTCBUQUJMRTpcbiIpOwotICAgIH0KLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBtYXg7IGNvdW50KyspCi0gICAgewotICAgICAgaWYgKCpjdXJyZW50KQotCXsKLQkgIGJmZCAqY3VyX2JmZCA9IGJmZF9hc3ltYm9sX2JmZCAoKmN1cnJlbnQpOwotCi0JICBpZiAoY3VyX2JmZCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgICBjaGFyICphbGxvYzsKLQotCSAgICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqY3VycmVudCk7Ci0JICAgICAgYWxsb2MgPSBOVUxMOwotCSAgICAgIGlmIChkb19kZW1hbmdsZSAmJiBuYW1lICE9IE5VTEwgJiYgKm5hbWUgIT0gJ1wwJykKLQkJewotCQkgIGNvbnN0IGNoYXIgKm47Ci0KLQkJICAvKiBJZiB3ZSB3YW50IHRvIGRlbWFuZ2xlIHRoZSBuYW1lLCB3ZSBkZW1hbmdsZSBpdAotICAgICAgICAgICAgICAgICAgICAgaGVyZSwgYW5kIHRlbXBvcmFyaWx5IGNsb2JiZXIgaXQgd2hpbGUgY2FsbGluZwotICAgICAgICAgICAgICAgICAgICAgYmZkX3ByaW50X3N5bWJvbC4gIEZJWE1FOiBUaGlzIGlzIGEgZ3Jvc3MgaGFjay4gICovCi0KLQkJICBuID0gbmFtZTsKLQkJICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChjdXJfYmZkKSA9PSAqbikKLQkJICAgICsrbjsKLQkJICBhbGxvYyA9IGNwbHVzX2RlbWFuZ2xlIChuLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7Ci0JCSAgaWYgKGFsbG9jICE9IE5VTEwpCi0JCSAgICAoKmN1cnJlbnQpLT5uYW1lID0gYWxsb2M7Ci0JCSAgZWxzZQotCQkgICAgKCpjdXJyZW50KS0+bmFtZSA9IG47Ci0JCX0KLQotCSAgICAgIGJmZF9wcmludF9zeW1ib2wgKGN1cl9iZmQsIHN0ZG91dCwgKmN1cnJlbnQsCi0JCQkJYmZkX3ByaW50X3N5bWJvbF9hbGwpOwotCi0JICAgICAgKCpjdXJyZW50KS0+bmFtZSA9IG5hbWU7Ci0JICAgICAgaWYgKGFsbG9jICE9IE5VTEwpCi0JCWZyZWUgKGFsbG9jKTsKLQotCSAgICAgIHByaW50ZiAoIlxuIik7Ci0JICAgIH0KLQl9Ci0gICAgICBjdXJyZW50Kys7Ci0gICAgfQotICBwcmludGYgKCJcbiIpOwotICBwcmludGYgKCJcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9yZWxvY3MgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXJlbGVudCAqKnJlbHBwOwotICBsb25nIHJlbGNvdW50OwotICBhc2VjdGlvbiAqYTsKLQotICBmb3IgKGEgPSBhYmZkLT5zZWN0aW9uczsgYSAhPSAoYXNlY3Rpb24gKikgTlVMTDsgYSA9IGEtPm5leHQpCi0gICAgewotICAgICAgbG9uZyByZWxzaXplOwotCi0gICAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChhKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGEpKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoYSkpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChvbmx5KQotCXsKLQkgIGlmIChzdHJjbXAgKG9ubHksIGEtPm5hbWUpKQotCSAgICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlIGlmICgoYS0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhKTsKLSAgICAgIGlmIChyZWxzaXplIDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgcHJpbnRmICgiUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbJXNdOiIsIGEtPm5hbWUpOwotCi0gICAgICBpZiAocmVsc2l6ZSA9PSAwKQotCXsKLQkgIHByaW50ZiAoIiAobm9uZSlcblxuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotCSAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBhLCByZWxwcCwgc3ltcyk7Ci0JICBpZiAocmVsY291bnQgPCAwKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGVsc2UgaWYgKHJlbGNvdW50ID09IDApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIgKG5vbmUpXG5cbiIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJcbiIpOwotCSAgICAgIGR1bXBfcmVsb2Nfc2V0IChhYmZkLCBhLCByZWxwcCwgcmVsY291bnQpOwotCSAgICAgIHByaW50ZiAoIlxuXG4iKTsKLQkgICAgfQotCSAgZnJlZSAocmVscHApOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2R5bmFtaWNfcmVsb2NzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgcmVsc2l6ZTsKLSAgYXJlbGVudCAqKnJlbHBwOwotICBsb25nIHJlbGNvdW50OwotCi0gIHJlbHNpemUgPSBiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpOwotICBpZiAocmVsc2l6ZSA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgcHJpbnRmICgiRFlOQU1JQyBSRUxPQ0FUSU9OIFJFQ09SRFMiKTsKLQotICBpZiAocmVsc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAobm9uZSlcblxuIik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0gICAgICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyAoYWJmZCwgcmVscHAsIGR5bnN5bXMpOwotICAgICAgaWYgKHJlbGNvdW50IDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGVsc2UgaWYgKHJlbGNvdW50ID09IDApCi0JewotCSAgcHJpbnRmICgiIChub25lKVxuXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGR1bXBfcmVsb2Nfc2V0IChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwgcmVscHAsIHJlbGNvdW50KTsKLQkgIHByaW50ZiAoIlxuXG4iKTsKLQl9Ci0gICAgICBmcmVlIChyZWxwcCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9yZWxvY19zZXQgKGFiZmQsIHNlYywgcmVscHAsIHJlbGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKipyZWxwcDsKLSAgICAgbG9uZyByZWxjb3VudDsKLXsKLSAgYXJlbGVudCAqKnA7Ci0gIGNoYXIgKmxhc3RfZmlsZW5hbWUsICpsYXN0X2Z1bmN0aW9ubmFtZTsKLSAgdW5zaWduZWQgaW50IGxhc3RfbGluZTsKLQotICAvKiBHZXQgY29sdW1uIGhlYWRlcnMgbGluZWQgdXAgcmVhc29uYWJseS4gICovCi0gIHsKLSAgICBzdGF0aWMgaW50IHdpZHRoOwotICAgIGlmICh3aWR0aCA9PSAwKQotICAgICAgewotCWNoYXIgYnVmWzMwXTsKLQlzcHJpbnRmX3ZtYSAoYnVmLCAoYmZkX3ZtYSkgLTEpOwotCXdpZHRoID0gc3RybGVuIChidWYpIC0gNzsKLSAgICAgIH0KLSAgICBwcmludGYgKCJPRkZTRVQgJSpzIFRZUEUgJSpzIFZBTFVFIFxuIiwgd2lkdGgsICIiLCAxMiwgIiIpOwotICB9Ci0KLSAgbGFzdF9maWxlbmFtZSA9IE5VTEw7Ci0gIGxhc3RfZnVuY3Rpb25uYW1lID0gTlVMTDsKLSAgbGFzdF9saW5lID0gMDsKLQotICBmb3IgKHAgPSByZWxwcDsgcmVsY291bnQgJiYgKnAgIT0gKGFyZWxlbnQgKikgTlVMTDsgcCsrLCByZWxjb3VudC0tKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnEgPSAqcDsKLSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCAqZnVuY3Rpb25uYW1lOwotICAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZTsKLQotICAgICAgaWYgKHN0YXJ0X2FkZHJlc3MgIT0gKGJmZF92bWEpIC0xCi0JICAmJiBxLT5hZGRyZXNzIDwgc3RhcnRfYWRkcmVzcykKLQljb250aW51ZTsKLSAgICAgIGlmIChzdG9wX2FkZHJlc3MgIT0gKGJmZF92bWEpIC0xCi0JICAmJiBxLT5hZGRyZXNzID4gc3RvcF9hZGRyZXNzKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAod2l0aF9saW5lX251bWJlcnMKLQkgICYmIHNlYyAhPSBOVUxMCi0JICAmJiBiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlYywgc3ltcywgcS0+YWRkcmVzcywKLQkJCQkgICAgJmZpbGVuYW1lLCAmZnVuY3Rpb25uYW1lLCAmbGluZSkpCi0JewotCSAgaWYgKGZ1bmN0aW9ubmFtZSAhPSBOVUxMCi0JICAgICAgJiYgKGxhc3RfZnVuY3Rpb25uYW1lID09IE5VTEwKLQkJICB8fCBzdHJjbXAgKGZ1bmN0aW9ubmFtZSwgbGFzdF9mdW5jdGlvbm5hbWUpICE9IDApKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJXMoKTpcbiIsIGZ1bmN0aW9ubmFtZSk7Ci0JICAgICAgaWYgKGxhc3RfZnVuY3Rpb25uYW1lICE9IE5VTEwpCi0JCWZyZWUgKGxhc3RfZnVuY3Rpb25uYW1lKTsKLQkgICAgICBsYXN0X2Z1bmN0aW9ubmFtZSA9IHhzdHJkdXAgKGZ1bmN0aW9ubmFtZSk7Ci0JICAgIH0KLQkgIGlmIChsaW5lID4gMAotCSAgICAgICYmIChsaW5lICE9IGxhc3RfbGluZQotCQkgIHx8IChmaWxlbmFtZSAhPSBOVUxMCi0JCSAgICAgICYmIGxhc3RfZmlsZW5hbWUgIT0gTlVMTAotCQkgICAgICAmJiBzdHJjbXAgKGZpbGVuYW1lLCBsYXN0X2ZpbGVuYW1lKSAhPSAwKSkpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlczoldVxuIiwgZmlsZW5hbWUgPT0gTlVMTCA/ICI/Pz8iIDogZmlsZW5hbWUsIGxpbmUpOwotCSAgICAgIGxhc3RfbGluZSA9IGxpbmU7Ci0JICAgICAgaWYgKGxhc3RfZmlsZW5hbWUgIT0gTlVMTCkKLQkJZnJlZSAobGFzdF9maWxlbmFtZSk7Ci0JICAgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0JCWxhc3RfZmlsZW5hbWUgPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJbGFzdF9maWxlbmFtZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHEtPnN5bV9wdHJfcHRyICYmICpxLT5zeW1fcHRyX3B0cikKLQl7Ci0JICBzeW1fbmFtZSA9ICgqKHEtPnN5bV9wdHJfcHRyKSktPm5hbWU7Ci0JICBzZWN0aW9uX25hbWUgPSAoKihxLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5uYW1lOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1fbmFtZSA9IE5VTEw7Ci0JICBzZWN0aW9uX25hbWUgPSBOVUxMOwotCX0KLSAgICAgIGlmIChzeW1fbmFtZSkKLQl7Ci0JICBwcmludGZfdm1hIChxLT5hZGRyZXNzKTsKLQkgIGlmIChxLT5ob3d0by0+bmFtZSkKLQkgICAgcHJpbnRmICgiICUtMTZzICAiLCBxLT5ob3d0by0+bmFtZSk7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIiAlLTE2ZCAgIiwgcS0+aG93dG8tPnR5cGUpOwotCSAgb2JqZHVtcF9wcmludF9zeW1uYW1lIChhYmZkLCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikgTlVMTCwKLQkJCQkgKnEtPnN5bV9wdHJfcHRyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHNlY3Rpb25fbmFtZSA9PSAoQ09OU1QgY2hhciAqKSBOVUxMKQotCSAgICBzZWN0aW9uX25hbWUgPSAiKnVua25vd24qIjsKLQkgIHByaW50Zl92bWEgKHEtPmFkZHJlc3MpOwotCSAgcHJpbnRmICgiICUtMTZzICBbJXNdIiwKLQkJICBxLT5ob3d0by0+bmFtZSwKLQkJICBzZWN0aW9uX25hbWUpOwotCX0KLSAgICAgIGlmIChxLT5hZGRlbmQpCi0JewotCSAgcHJpbnRmICgiKzB4Iik7Ci0JICBwcmludGZfdm1hIChxLT5hZGRlbmQpOwotCX0KLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotfQotDAotLyogVGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBhcmNoaXRlY3R1cmUgbmFtZSArIDEuICAqLwotI2RlZmluZSBMT05HRVNUX0FSQ0ggc2l6ZW9mKCJyczYwMDA6NjAwMCIpCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWVuZGlhbl9zdHJpbmcgKGVuZGlhbikKLSAgICAgZW51bSBiZmRfZW5kaWFuIGVuZGlhbjsKLXsKLSAgaWYgKGVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRykKLSAgICByZXR1cm4gImJpZyBlbmRpYW4iOwotICBlbHNlIGlmIChlbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0gICAgcmV0dXJuICJsaXR0bGUgZW5kaWFuIjsKLSAgZWxzZQotICAgIHJldHVybiAiZW5kaWFubmVzcyB1bmtub3duIjsKLX0KLQotLyogTGlzdCB0aGUgdGFyZ2V0cyB0aGF0IEJGRCBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQsIGVhY2ggZm9sbG93ZWQKLSAgIGJ5IGl0cyBlbmRpYW5uZXNzIGFuZCB0aGUgYXJjaGl0ZWN0dXJlcyBpdCBzdXBwb3J0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3RhcmdldF9saXN0ICgpCi17Ci0gIGV4dGVybiBiZmRfdGFyZ2V0ICpiZmRfdGFyZ2V0X3ZlY3RvcltdOwotICBjaGFyICpkdW1teV9uYW1lOwotICBpbnQgdDsKLQotICBkdW1teV9uYW1lID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLSAgZm9yICh0ID0gMDsgYmZkX3RhcmdldF92ZWN0b3JbdF07IHQrKykKLSAgICB7Ci0gICAgICBiZmRfdGFyZ2V0ICpwID0gYmZkX3RhcmdldF92ZWN0b3JbdF07Ci0gICAgICBiZmQgKmFiZmQgPSBiZmRfb3BlbncgKGR1bW15X25hbWUsIHAtPm5hbWUpOwotICAgICAgaW50IGE7Ci0KLSAgICAgIHByaW50ZiAoIiVzXG4gKGhlYWRlciAlcywgZGF0YSAlcylcbiIsIHAtPm5hbWUsCi0JICAgICAgZW5kaWFuX3N0cmluZyAocC0+aGVhZGVyX2J5dGVvcmRlciksCi0JICAgICAgZW5kaWFuX3N0cmluZyAocC0+Ynl0ZW9yZGVyKSk7Ci0KLSAgICAgIGlmIChhYmZkID09IE5VTEwpCi0JewotCSAgbm9uZmF0YWwgKGR1bW15X25hbWUpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKQotCSAgICBub25mYXRhbCAocC0+bmFtZSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGZvciAoYSA9IChpbnQpIGJmZF9hcmNoX29ic2N1cmUgKyAxOyBhIDwgKGludCkgYmZkX2FyY2hfbGFzdDsgYSsrKQotCWlmIChiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgKGVudW0gYmZkX2FyY2hpdGVjdHVyZSkgYSwgMCkpCi0JICBwcmludGYgKCIgICVzXG4iLAotCQkgIGJmZF9wcmludGFibGVfYXJjaF9tYWNoICgoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKSBhLCAwKSk7Ci0gICAgfQotICB1bmxpbmsgKGR1bW15X25hbWUpOwotICBmcmVlIChkdW1teV9uYW1lKTsKLX0KLQotLyogUHJpbnQgYSB0YWJsZSBzaG93aW5nIHdoaWNoIGFyY2hpdGVjdHVyZXMgYXJlIHN1cHBvcnRlZCBmb3IgZW50cmllcwotICAgRklSU1QgdGhyb3VnaCBMQVNULTEgb2YgYmZkX3RhcmdldF92ZWN0b3IgKHRhcmdldHMgYWNyb3NzLAotICAgYXJjaGl0ZWN0dXJlcyBkb3duKS4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2luZm9fdGFibGUgKGZpcnN0LCBsYXN0KQotICAgICBpbnQgZmlyc3Q7Ci0gICAgIGludCBsYXN0OwotewotICBleHRlcm4gYmZkX3RhcmdldCAqYmZkX3RhcmdldF92ZWN0b3JbXTsKLSAgaW50IHQsIGE7Ci0gIGNoYXIgKmR1bW15X25hbWU7Ci0KLSAgLyogUHJpbnQgaGVhZGluZyBvZiB0YXJnZXQgbmFtZXMuICAqLwotICBwcmludGYgKCJcbiUqcyIsIChpbnQpIExPTkdFU1RfQVJDSCwgIiAiKTsKLSAgZm9yICh0ID0gZmlyc3Q7IHQgPCBsYXN0ICYmIGJmZF90YXJnZXRfdmVjdG9yW3RdOyB0KyspCi0gICAgcHJpbnRmICgiJXMgIiwgYmZkX3RhcmdldF92ZWN0b3JbdF0tPm5hbWUpOwotICBwdXRjaGFyICgnXG4nKTsKLQotICBkdW1teV9uYW1lID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLSAgZm9yIChhID0gKGludCkgYmZkX2FyY2hfb2JzY3VyZSArIDE7IGEgPCAoaW50KSBiZmRfYXJjaF9sYXN0OyBhKyspCi0gICAgaWYgKHN0cmNtcCAoYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGEsIDApLCAiVU5LTk9XTiEiKSAhPSAwKQotICAgICAgewotCXByaW50ZiAoIiUqcyAiLCAoaW50KSBMT05HRVNUX0FSQ0ggLSAxLAotCQliZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoYSwgMCkpOwotCWZvciAodCA9IGZpcnN0OyB0IDwgbGFzdCAmJiBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsgdCsrKQotCSAgewotCSAgICBiZmRfdGFyZ2V0ICpwID0gYmZkX3RhcmdldF92ZWN0b3JbdF07Ci0JICAgIGJvb2xlYW4gb2sgPSB0cnVlOwotCSAgICBiZmQgKmFiZmQgPSBiZmRfb3BlbncgKGR1bW15X25hbWUsIHAtPm5hbWUpOwotCi0JICAgIGlmIChhYmZkID09IE5VTEwpCi0JICAgICAgewotCQlub25mYXRhbCAocC0+bmFtZSk7Ci0JCW9rID0gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIGlmIChvaykKLQkgICAgICB7Ci0JCWlmICghIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLQkJICB7Ci0JCSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pCi0JCSAgICAgIG5vbmZhdGFsIChwLT5uYW1lKTsKLQkJICAgIG9rID0gZmFsc2U7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAob2spCi0JICAgICAgewotCQlpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYSwgMCkpCi0JCSAgb2sgPSBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKG9rKQotCSAgICAgIHByaW50ZiAoIiVzICIsIHAtPm5hbWUpOwotCSAgICBlbHNlCi0JICAgICAgewotCQlpbnQgbCA9IHN0cmxlbiAocC0+bmFtZSk7Ci0JCXdoaWxlIChsLS0pCi0JCSAgcHV0Y2hhciAoJy0nKTsKLQkJcHV0Y2hhciAoJyAnKTsKLQkgICAgICB9Ci0JICB9Ci0JcHV0Y2hhciAoJ1xuJyk7Ci0gICAgICB9Ci0gIHVubGluayAoZHVtbXlfbmFtZSk7Ci0gIGZyZWUgKGR1bW15X25hbWUpOwotfQotCi0vKiBQcmludCB0YWJsZXMgb2YgYWxsIHRoZSB0YXJnZXQtYXJjaGl0ZWN0dXJlIGNvbWJpbmF0aW9ucyB0aGF0Ci0gICBCRkQgaGFzIGJlZW4gY29uZmlndXJlZCB0byBzdXBwb3J0LiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfdGFyZ2V0X3RhYmxlcyAoKQotewotICBpbnQgdCwgY29sdW1uczsKLSAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107Ci0gIGNoYXIgKmNvbHVtOwotCi0gIGNvbHVtbnMgPSAwOwotICBjb2x1bSA9IGdldGVudiAoIkNPTFVNTlMiKTsKLSAgaWYgKGNvbHVtICE9IE5VTEwpCi0gICAgY29sdW1ucyA9IGF0b2kgKGNvbHVtKTsKLSAgaWYgKGNvbHVtbnMgPT0gMCkKLSAgICBjb2x1bW5zID0gODA7Ci0KLSAgdCA9IDA7Ci0gIHdoaWxlIChiZmRfdGFyZ2V0X3ZlY3Rvclt0XSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCBvbGR0ID0gdCwgd2lkOwotCi0gICAgICB3aWQgPSBMT05HRVNUX0FSQ0ggKyBzdHJsZW4gKGJmZF90YXJnZXRfdmVjdG9yW3RdLT5uYW1lKSArIDE7Ci0gICAgICArK3Q7Ci0gICAgICB3aGlsZSAod2lkIDwgY29sdW1ucyAmJiBiZmRfdGFyZ2V0X3ZlY3Rvclt0XSAhPSBOVUxMKQotCXsKLQkgIGludCBuZXd3aWQ7Ci0KLQkgIG5ld3dpZCA9IHdpZCArIHN0cmxlbiAoYmZkX3RhcmdldF92ZWN0b3JbdF0tPm5hbWUpICsgMTsKLQkgIGlmIChuZXd3aWQgPj0gY29sdW1ucykKLQkgICAgYnJlYWs7Ci0JICB3aWQgPSBuZXd3aWQ7Ci0JICArK3Q7Ci0JfQotICAgICAgZGlzcGxheV9pbmZvX3RhYmxlIChvbGR0LCB0KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2luZm8gKCkKLXsKLSAgcHJpbnRmIChfKCJCRkQgaGVhZGVyIGZpbGUgdmVyc2lvbiAlc1xuIiksIEJGRF9WRVJTSU9OKTsKLSAgZGlzcGxheV90YXJnZXRfbGlzdCAoKTsKLSAgZGlzcGxheV90YXJnZXRfdGFibGVzICgpOwotfQotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGM7Ci0gIGNoYXIgKnRhcmdldCA9IGRlZmF1bHRfdGFyZ2V0OwotICBib29sZWFuIHNlZW5mbGFnID0gZmFsc2U7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSAqYXJndjsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIFNUQVJUX1BST0dSRVNTIChwcm9ncmFtX25hbWUsIDApOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAicGliOm06TTpWQ2REbGZhaEhyUnRUeHNTajp3RTp6Z0ciLAotCQkJICAgbG9uZ19vcHRpb25zLCAoaW50ICopIDApKQotCSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlIDA6Ci0JICBicmVhazsJCS8qIHdlJ3ZlIGJlZW4gZ2l2ZW4gYSBsb25nIG9wdGlvbiAqLwotCWNhc2UgJ20nOgotCSAgbWFjaGluZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ00nOgotCSAgZGlzYXNzZW1ibGVyX29wdGlvbnMgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdqJzoKLQkgIG9ubHkgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIHdpdGhfbGluZV9udW1iZXJzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnQyc6Ci0JICBkb19kZW1hbmdsZSA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICd3JzoKLQkgIHdpZGVfb3V0cHV0ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0FESlVTVF9WTUE6Ci0JICBhZGp1c3Rfc2VjdGlvbl92bWEgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tYWRqdXN0LXZtYSIpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1RBUlRfQUREUkVTUzoKLQkgIHN0YXJ0X2FkZHJlc3MgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tc3RhcnQtYWRkcmVzcyIpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1RPUF9BRERSRVNTOgotCSAgc3RvcF9hZGRyZXNzID0gcGFyc2Vfdm1hIChvcHRhcmcsICItLXN0b3AtYWRkcmVzcyIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnRSc6Ci0JICBpZiAoc3RyY21wIChvcHRhcmcsICJCIikgPT0gMCkKLQkgICAgZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgIkwiKSA9PSAwKQotCSAgICBlbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVjb2duaXplZCAtRSBvcHRpb25cbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLQkgICAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRU5ESUFOOgotCSAgaWYgKHN0cm5jbXAgKG9wdGFyZywgImJpZyIsIHN0cmxlbiAob3B0YXJnKSkgPT0gMCkKLQkgICAgZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0JICBlbHNlIGlmIChzdHJuY21wIChvcHRhcmcsICJsaXR0bGUiLCBzdHJsZW4gKG9wdGFyZykpID09IDApCi0JICAgIGVuZGlhbiA9IEJGRF9FTkRJQU5fTElUVExFOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5yZWNvZ25pemVkIC0tZW5kaWFuIHR5cGUgYCVzJ1xuIiksCi0JCSAgICAgIHByb2dyYW1fbmFtZSwgb3B0YXJnKTsKLQkgICAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlICdmJzoKLQkgIGR1bXBfZmlsZV9oZWFkZXIgPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICBmb3JtYXRzX2luZm8gPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAncCc6Ci0JICBkdW1wX3ByaXZhdGVfaGVhZGVycyA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGR1bXBfcHJpdmF0ZV9oZWFkZXJzID0gdHJ1ZTsKLQkgIGR1bXBfc3ltdGFiID0gdHJ1ZTsKLQkgIGR1bXBfcmVsb2NfaW5mbyA9IHRydWU7Ci0JICBkdW1wX2ZpbGVfaGVhZGVyID0gdHJ1ZTsKLQkgIGR1bXBfYXJfaGRycyA9IHRydWU7Ci0JICBkdW1wX3NlY3Rpb25faGVhZGVycyA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICd0JzoKLQkgIGR1bXBfc3ltdGFiID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1QnOgotCSAgZHVtcF9keW5hbWljX3N5bXRhYiA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGRpc2Fzc2VtYmxlID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3onOgotCSAgZGlzYXNzZW1ibGVfemVyb2VzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ0QnOgotCSAgZGlzYXNzZW1ibGUgPSB0cnVlOwotCSAgZGlzYXNzZW1ibGVfYWxsID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCSAgZGlzYXNzZW1ibGUgPSB0cnVlOwotCSAgd2l0aF9zb3VyY2VfY29kZSA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdnJzoKLQkgIGR1bXBfZGVidWdnaW5nID0gMTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ0cnOgotCSAgZHVtcF9zdGFiX3NlY3Rpb25faW5mbyA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGR1bXBfc2VjdGlvbl9jb250ZW50cyA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdyJzoKLQkgIGR1bXBfcmVsb2NfaW5mbyA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdSJzoKLQkgIGR1bXBfZHluYW1pY19yZWxvY19pbmZvID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2EnOgotCSAgZHVtcF9hcl9oZHJzID0gdHJ1ZTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgZHVtcF9zZWN0aW9uX2hlYWRlcnMgPSB0cnVlOwotCSAgc2VlbmZsYWcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnSCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQkgIHNlZW5mbGFnID0gdHJ1ZTsKLQljYXNlICdWJzoKLQkgIHNob3dfdmVyc2lvbiA9IHRydWU7Ci0JICBzZWVuZmxhZyA9IHRydWU7Ci0JICBicmVhazsKLQkgIAotCWRlZmF1bHQ6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzaG93X3ZlcnNpb24pCi0gICAgcHJpbnRfdmVyc2lvbiAoIm9iamR1bXAiKTsKLQotICBpZiAoc2VlbmZsYWcgPT0gZmFsc2UpCi0gICAgdXNhZ2UgKHN0ZGVyciwgMik7Ci0KLSAgaWYgKGZvcm1hdHNfaW5mbykKLSAgICBkaXNwbGF5X2luZm8gKCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAob3B0aW5kID09IGFyZ2MpCi0JZGlzcGxheV9maWxlICgiYS5vdXQiLCB0YXJnZXQpOwotICAgICAgZWxzZQotCWZvciAoOyBvcHRpbmQgPCBhcmdjOykKLQkgIGRpc3BsYXlfZmlsZSAoYXJndltvcHRpbmQrK10sIHRhcmdldCk7Ci0gICAgfQotCi0gIEVORF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lKTsKLQotICByZXR1cm4gZXhpdF9zdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9wby9NYWtlLWluIGIvYmludXRpbHMvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3BvL1BPVEZJTEVTLmluIGIvYmludXRpbHMvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTA1ODYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1hZGRyMmxpbmUuYwotYXIuYwotYXJzdXAuYwotYXJzdXAuaAotYnVjb21tLmMKLWJ1Y29tbS5oCi1idWRiZy5oCi1jb2ZmZHVtcC5jCi1jb2ZmZ3Jvay5jCi1jb2ZmZ3Jvay5oCi1kZWJ1Zy5jCi1kZWJ1Zy5jCi1kZWJ1Zy5oCi1kbGx0b29sLmMKLWRsbHRvb2wuaAotZGxsd3JhcC5jCi1keW4tc3RyaW5nLmMKLWR5bi1zdHJpbmcuaAotZmlsZW1vZGUuYwotaWVlZS5jCi1pZWVlLmMKLWlzLXJhbmxpYi5jCi1pcy1zdHJpcC5jCi1tYXliZS1yYW5saWIuYwotbWF5YmUtc3RyaXAuYwotbmxtY29udi5jCi1ubG1jb252LmgKLW5tLmMKLW5vdC1yYW5saWIuYwotbm90LXN0cmlwLmMKLW9iamNvcHkuYwotb2JqZHVtcC5jCi1wcmRiZy5jCi1yZGNvZmYuYwotcmRjb2ZmLmMKLXJkZGJnLmMKLXJkZGJnLmMKLXJlYWRlbGYuYwotcmVuYW1lLmMKLXJlc2Jpbi5jCi1yZXNjb2ZmLmMKLXJlc3JjLmMKLXJlc3Jlcy5jCi1zaXplLmMKLXNyY29udi5jCi1zdGFicy5jCi1zdGFicy5jCi1zdHJpbmdzLmMKLXN5c2R1bXAuYwotdmVyc2lvbi5jCi13aW5kcmVzLmMKLXdpbmRyZXMuaAotd2luZHVuaS5jCi13aW5kdW5pLmgKLXdyc3RhYnMuYwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcG8vYmludXRpbHMucG90IGIvYmludXRpbHMvcG8vYmludXRpbHMucG90CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzc5NWNiLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3BvL2JpbnV0aWxzLnBvdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ODMgKzAsMCBAQAotIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgotIyBDb3B5cmlnaHQgKEMpIFlFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCi0jCi0jLCBmdXp6eQotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDE5OTktMDYtMDMgMDI6NTgtMDcwMFxuIgotIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgotIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgotIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgotIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IEVOQ09ESU5HXG4iCi0KLSM6IGFkZHIybGluZS5jOjc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1DZnNIVl0gWy1iIGJmZG5hbWVdIFstLXRhcmdldD1iZmRuYW1lXVxuIgotIiAgICAgICBbLWUgZXhlY3V0YWJsZV0gWy0tZXhlPWV4ZWN1dGFibGVdIFstLWRlbWFuZ2xlXVxuIgotIiAgICAgICBbLS1iYXNlbmFtZXNdIFstLWZ1bmN0aW9uc10gW2FkZHIgYWRkciAuLi5dXG4iCi1tc2dzdHIgIiIKLQotIzogYWRkcjJsaW5lLmM6ODMgYXIuYzoyNTUgbmxtY29udi5jOjExNDEgbm0uYzozMDQgb2JqY29weS5jOjMxOCBvYmpjb3B5LmM6MzM3Ci0jOiBvYmpkdW1wLmM6MjM2IHJlYWRlbGYuYzoxMTY4IHNpemUuYzo4OSBzdHJpbmdzLmM6NTEyIHdpbmRyZXMuYzo3MzAKLW1zZ2lkICJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBhZGRyMmxpbmUuYzoyNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbiBub3QgZ2V0IGFkZHJlc3NlcyBmcm9tIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gZW50cnkgJXMgaW4gYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1de2RtcHFyc3R4fVthYmNpbG9zU3V2Vl0gW21lbWJlci1uYW1lXSBhcmNoaXZlLWZpbGUgZmlsZS4uLlxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICAlcyAtTSBbPG1yaS1zY3JpcHRdXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMjcKLW1zZ2lkICIgY29tbWFuZHM6XG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMjgKLW1zZ2lkICIgIGQgICAgICAgICAgICAtIGRlbGV0ZSBmaWxlKHMpIGZyb20gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIyOQotbXNnaWQgIiAgbVthYl0gICAgICAgIC0gbW92ZSBmaWxlKHMpIGluIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzAKLW1zZ2lkICIgIHAgICAgICAgICAgICAtIHByaW50IGZpbGUocykgZm91bmQgaW4gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzMQotbXNnaWQgIiAgcVtmXSAgICAgICAgIC0gcXVpY2sgYXBwZW5kIGZpbGUocykgdG8gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzMgotbXNnaWQgIiIKLSIgIHJbYWJdW2ZdW3VdICAtIHJlcGxhY2UgZXhpc3Rpbmcgb3IgaW5zZXJ0IG5ldyBmaWxlKHMpIGludG8gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzMwotbXNnaWQgIiAgdCAgICAgICAgICAgIC0gZGlzcGxheSBjb250ZW50cyBvZiBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzQKLW1zZ2lkICIgIHhbb10gICAgICAgICAtIGV4dHJhY3QgZmlsZShzKSBmcm9tIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzUKLW1zZ2lkICIgY29tbWFuZCBzcGVjaWZpYyBtb2RpZmllcnM6XG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzYKLW1zZ2lkICIgIFthXSAgICAgICAgICAtIHB1dCBmaWxlKHMpIGFmdGVyIFttZW1iZXItbmFtZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzNwotbXNnaWQgIiAgW2JdICAgICAgICAgIC0gcHV0IGZpbGUocykgYmVmb3JlIFttZW1iZXItbmFtZV0gKHNhbWUgYXMgW2ldKVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjM4Ci1tc2dpZCAiICBbZl0gICAgICAgICAgLSB0cnVuY2F0ZSBpbnNlcnRlZCBmaWxlIG5hbWVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzkKLW1zZ2lkICIgIFtvXSAgICAgICAgICAtIHByZXNlcnZlIG9yaWdpbmFsIGRhdGVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDAKLW1zZ2lkICIiCi0iICBbdV0gICAgICAgICAgLSBvbmx5IHJlcGxhY2UgZmlsZXMgdGhhdCBhcmUgbmV3ZXIgdGhhbiBjdXJyZW50IGFyY2hpdmUgIgotImNvbnRlbnRzXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDEKLW1zZ2lkICIgZ2VuZXJpYyBtb2RpZmllcnM6XG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDIKLW1zZ2lkICIgIFtjXSAgICAgICAgICAtIGRvIG5vdCB3YXJuIGlmIHRoZSBsaWJyYXJ5IGhhZCB0byBiZSBjcmVhdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDMKLW1zZ2lkICIgIFtzXSAgICAgICAgICAtIGNyZWF0ZSBhbiBhcmNoaXZlIGluZGV4IChjZi4gcmFubGliKVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQ0Ci1tc2dpZCAiICBbU10gICAgICAgICAgLSBkbyBub3QgYnVpbGQgYSBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI0NQotbXNnaWQgIiAgW3ZdICAgICAgICAgIC0gYmUgdmVyYm9zZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQ2Ci1tc2dpZCAiICBbVl0gICAgICAgICAgLSBkaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlclxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlOiAlcyBbLXZWXSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzo0MzEKLW1zZ2lkICJ0d28gZGlmZmVyZW50IG9wZXJhdGlvbiBvcHRpb25zIHNwZWNpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjUwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaWxsZWdhbCBvcHRpb24gLS0gJWNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjUzMgotbXNnaWQgIm5vIG9wZXJhdGlvbiBzcGVjaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo1MzUKLW1zZ2lkICJgdScgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlIGByJyBvcHRpb24uIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NjE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnRlcm5hbCBlcnJvciAtLSB0aGlzIG9wdGlvbiBub3QgaW1wbGVtZW50ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjczMCBhci5jOjc4MiBhci5jOjEyMTIgb2JqY29weS5jOjk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBzdGF0IGVycm9yIG9uICVzIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSI8bWVtYmVyICVzPlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NzUxIGFyLmM6ODE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIGlzIG5vdCBhIHZhbGlkIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo3ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RhdCByZXR1cm5zIG5lZ2F0aXZlIHNpemUgZm9yICVzIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6OTA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIGlzIG5vdCBhbiBhcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6OTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjcmVhdGluZyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MTExMAotIywgYy1mb3JtYXQKLW1zZ2lkICJObyBtZW1iZXIgbmFtZWQgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MTE2MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gZW50cnkgJXMgaW4gYXJjaGl2ZSAlcyFcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjEzMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIGFyY2hpdmUgbWFwIHRvIHVwZGF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIGVudHJ5ICVzIGluIGFyY2hpdmUuXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoxMTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgb3BlbiBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoxNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IG9wZW4gb3V0cHV0IGFyY2hpdmUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjE3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3Qgb3BlbiBpbnB1dCBhcmNoaXZlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoxODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgJXMgaXMgbm90IGFuIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjIyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gb3V0cHV0IGFyY2hpdmUgc3BlY2lmaWVkIHlldFxuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MjQ1IGFyc3VwLmM6MjgwIGFyc3VwLmM6MzE2IGFyc3VwLmM6MzM2IGFyc3VwLmM6Mzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoyNTMgYXJzdXAuYzozNTQgYXJzdXAuYzozNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbid0IG9wZW4gZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MzAxIGFyc3VwLmM6MzcwIGFyc3VwLmM6NDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4ndCBmaW5kIG1vZHVsZSBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzo0MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ3VycmVudCBvcGVuIGFyY2hpdmUgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjQyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gb3BlbiAgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGJ1Y29tbS5jOjEzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBzZXQgQkZEIGRlZmF1bHQgdGFyZ2V0IHRvIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IGJ1Y29tbS5jOjE1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogTWF0Y2hpbmcgZm9ybWF0czoiCi1tc2dzdHIgIiIKLQotIzogYnVjb21tLmM6MTY4Ci1tc2dpZCAiU3VwcG9ydGVkIHRhcmdldHM6IgotbXNnc3RyICIiCi0KLSM6IGJ1Y29tbS5jOjE3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3VwcG9ydGVkIHRhcmdldHM6IgotbXNnc3RyICIiCi0KLSM6IGJ1Y29tbS5jOjI2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmFkIG51bWJlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29mZmR1bXAuYzo5NAotIywgYy1mb3JtYXQKLW1zZ2lkICIjbGluZXMgJWQgIgotbXNnc3RyICIiCi0KLSM6IGNvZmZkdW1wLmM6NDU2IHN5c2R1bXAuYzo3MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFByaW50IGEgaHVtYW4gcmVhZGFibGUgaW50ZXJwcmV0YXRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogY29mZmR1bXAuYzo0OTggc3Jjb252LmM6MTk0MCBzeXNkdW1wLmM6NzU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkdOVSAlcyB2ZXJzaW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29mZmR1bXAuYzo1MTYgc3Jjb252LmM6MTk3NyBzeXNkdW1wLmM6Nzc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZFxuIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6NjUzCi1tc2dpZCAiZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlOiBubyBjdXJyZW50IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo3MzYKLW1zZ2lkICJkZWJ1Z19zdGFydF9zb3VyY2U6IG5vIGRlYnVnX3NldF9maWxlbmFtZSBjYWxsIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6Nzk1Ci1tc2dpZCAiZGVidWdfcmVjb3JkX2Z1bmN0aW9uOiBubyBkZWJ1Z19zZXRfZmlsZW5hbWUgY2FsbCIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjg1MQotbXNnaWQgImRlYnVnX3JlY29yZF9wYXJhbWV0ZXI6IG5vIGN1cnJlbnQgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo4ODUKLW1zZ2lkICJkZWJ1Z19lbmRfZnVuY3Rpb246IG5vIGN1cnJlbnQgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo4OTEKLW1zZ2lkICJkZWJ1Z19lbmRfZnVuY3Rpb246IHNvbWUgYmxvY2tzIHdlcmUgbm90IGNsb3NlZCIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjkyMQotbXNnaWQgImRlYnVnX3N0YXJ0X2Jsb2NrOiBubyBjdXJyZW50IGJsb2NrIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6OTU5Ci1tc2dpZCAiZGVidWdfZW5kX2Jsb2NrOiBubyBjdXJyZW50IGJsb2NrIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6OTY2Ci1tc2dpZCAiZGVidWdfZW5kX2Jsb2NrOiBhdHRlbXB0IHRvIGNsb3NlIHRvcCBsZXZlbCBibG9jayIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjk5MgotbXNnaWQgImRlYnVnX3JlY29yZF9saW5lOiBubyBjdXJyZW50IHVuaXQiCi1tc2dzdHIgIiIKLQotIy4gRklYTUUKLSM6IGRlYnVnLmM6MTA0NgotbXNnaWQgImRlYnVnX3N0YXJ0X2NvbW1vbl9ibG9jazogbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSMuIEZJWE1FCi0jOiBkZWJ1Zy5jOjEwNTgKLW1zZ2lkICJkZWJ1Z19lbmRfY29tbW9uX2Jsb2NrOiBub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIy4gRklYTUUuCi0jOiBkZWJ1Zy5jOjExNTIKLW1zZ2lkICJkZWJ1Z19yZWNvcmRfbGFiZWwgbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MTE3OAotbXNnaWQgImRlYnVnX3JlY29yZF92YXJpYWJsZTogbm8gY3VycmVudCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MTE5NAotbXNnaWQgImRlYnVnX3JlY29yZF92YXJpYWJsZTogbm8gY3VycmVudCBibG9jayIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjE3NjQKLW1zZ2lkICJkZWJ1Z19tYWtlX3VuZGVmaW5lZF90eXBlOiB1bnN1cHBvcnRlZCBraW5kIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MTk3MAotbXNnaWQgImRlYnVnX25hbWVfdHlwZTogbm8gY3VycmVudCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MjAxOAotbXNnaWQgImRlYnVnX3RhZ190eXBlOiBubyBjdXJyZW50IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMDI2Ci1tc2dpZCAiZGVidWdfdGFnX3R5cGU6IGV4dHJhIHRhZyBhdHRlbXB0ZWQiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IGNoYW5naW5nIHR5cGUgc2l6ZSBmcm9tICVkIHRvICVkXG4iCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMDkwCi1tc2dpZCAiZGVidWdfZmluZF9uYW1lZF90eXBlOiBubyBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnX2dldF9yZWFsX3R5cGU6IGNpcmN1bGFyIGRlYnVnIGluZm9ybWF0aW9uIGZvciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MjY2MwotbXNnaWQgImRlYnVnX3dyaXRlX3R5cGU6IGlsbGVnYWwgdHlwZSBlbmNvdW50ZXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6NzExIGRsbHRvb2wuYzo3MzUgZGxsdG9vbC5jOjc2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjc5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuIGRlZiBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Nzk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlByb2Nlc3NpbmcgZGVmIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo4MDMKLW1zZ2lkICJQcm9jZXNzZWQgZGVmIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjgyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW50YXggZXJyb3IgaW4gZGVmIGZpbGUgJXM6JWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6ODYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5BTUU6ICVzIGJhc2U6ICV4IgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo4NjQKLW1zZ2lkICJDYW4ndCBoYXZlIExJQlJBUlkgYW5kIE5BTUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6ODgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkxJQlJBUlk6ICVzIGJhc2U6ICV4IgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo4ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IGhhdmUgTElCUkFSWSBhbmQgTkFNRVxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxMTM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndhaXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxMTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgInN1YnByb2Nlc3MgZ290IGZhdGFsIHNpZ25hbCAlZCIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTE0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTE4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJTdWNraW5nIGluIGluZm8gZnJvbSAlcyBzZWN0aW9uIGluICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjEyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXhjbHVkaW5nIHN5bWJvbDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTM4NiBkbGx0b29sLmM6MTM5NyBubS5jOjkwMiBubS5jOjkxMyBvYmpkdW1wLmM6Mzc5IG9iamR1bXAuYzozOTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRTogd2Ugb3VnaHQgdG8gcmVhZCBpbiBhbmQgYmxvY2sgb3V0IHRoZSBiYXNlIHJlbG9jYXRpb25zCi0jOiBkbGx0b29sLmM6MTQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJEb25lIHJlYWRpbmcgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTQzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gb3BlbiBvYmplY3QgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2Nhbm5pbmcgb2JqZWN0IGZpbGUgJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE0NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IHByb2R1Y2UgbWNvcmUtZWxmIGRsbCBmcm9tIGFyY2hpdmUgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE1MzgKLW1zZ2lkICJBZGRpbmcgZXhwb3J0cyB0byBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTU4MwotbXNnaWQgIkFkZGVkIGV4cG9ydHMgdG8gb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE2OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR2VuZXJhdGluZyBleHBvcnQgZmlsZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTY5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgYXNzZW1ibGVyIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxNjk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk9wZW5lZCB0ZW1wb3JhcnkgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE5MTgKLW1zZ2lkICJHZW5lcmF0ZWQgZXhwb3J0cyBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyMTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgImJmZF9vcGVuIGZhaWxlZCBvcGVuIHN0dWIgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjIxNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ3JlYXRpbmcgc3R1YiBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjU1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gb3BlbiB0ZW1wb3JhcnkgaGVhZCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjYyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gb3BlbiB0ZW1wb3JhcnkgdGFpbCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjY5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuIC5saWIgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI3MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ3JlYXRpbmcgbGlicmFyeSBmaWxlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyNzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBkZWxldGUgJXM6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI3NjEKLW1zZ2lkICJDcmVhdGVkIGxpYiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyODYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmcsIGlnbm9yaW5nIGR1cGxpY2F0ZSBFWFBPUlQgJXMgJWQsJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjg2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvciwgZHVwbGljYXRlIEVYUE9SVCB3aXRoIG9yaWRpbmFsczogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI5OTUKLW1zZ2lkICJQcm9jZXNzaW5nIGRlZmluaXRpb25zIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDMzCi1tc2dpZCAiUHJvY2Vzc2VkIGRlZmluaXRpb25zIgotbXNnc3RyICIiCi0KLSMuIHhnZXRleHQ6Yy1mb3JtYXQKLSM6IGRsbHRvb2wuYzozMDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlICVzIDxvcHRpb25zPiA8b2JqZWN0LWZpbGVzPlxuIgotbXNnc3RyICIiCi0KLSMuIHhnZXRleHQ6Yy1mb3JtYXQKLSM6IGRsbHRvb2wuYzozMDQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgICAtbSAtLW1hY2hpbmUgPG1hY2hpbmU+ICAgIENyZWF0ZSBhcyBETEwgZm9yIDxtYWNoaW5lPi4gIFtkZWZhdWx0OiAlc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA0NwotbXNnaWQgIiIKLSIgICAgICAgIHBvc3NpYmxlIDxtYWNoaW5lPjogYXJtW19pbnRlcndvcmtdLCBpMzg2LCBtY29yZVstZWxmXVstbGVdLCBwcGMsICIKLSJ0aHVtYlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDQ4Ci1tc2dpZCAiICAgLWUgLS1vdXRwdXQtZXhwIDxvdXRuYW1lPiBHZW5lcmF0ZSBhbiBleHBvcnQgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA0OQotbXNnaWQgIiAgIC1sIC0tb3V0cHV0LWxpYiA8b3V0bmFtZT4gR2VuZXJhdGUgYW4gaW50ZXJmYWNlIGxpYnJhcnkuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNTAKLW1zZ2lkICIgICAtYSAtLWFkZC1pbmRpcmVjdCAgICAgICAgIEFkZCBkbGwgaW5kaXJlY3RzIHRvIGV4cG9ydCBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDUxCi1tc2dpZCAiIgotIiAgIC1EIC0tZGxsbmFtZSA8bmFtZT4gICAgICAgTmFtZSBvZiBpbnB1dCBkbGwgdG8gcHV0IGludG8gaW50ZXJmYWNlIGxpYi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1MgotbXNnaWQgIiAgIC1kIC0taW5wdXQtZGVmIDxkZWZmaWxlPiAgTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgcmVhZCBpbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1MwotbXNnaWQgIiAgIC16IC0tb3V0cHV0LWRlZiA8ZGVmZmlsZT4gTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgY3JlYXRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1NAotbXNnaWQgIiAgICAgIC0tZXhwb3J0LWFsbC1zeW1ib2xzICAgRXhwb3J0IGFsbCBzeW1ib2xzIHRvIC5kZWZcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1NQotbXNnaWQgIiAgICAgIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzICBPbmx5IGV4cG9ydCBsaXN0ZWQgc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDU2Ci1tc2dpZCAiICAgICAgLS1leGNsdWRlLXN5bWJvbHMgPGxpc3Q+IERvbid0IGV4cG9ydCA8bGlzdD5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1NwotbXNnaWQgIiAgICAgIC0tbm8tZGVmYXVsdC1leGNsdWRlcyAgQ2xlYXIgZGVmYXVsdCBleGNsdWRlIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1OAotbXNnaWQgIiAgIC1iIC0tYmFzZS1maWxlIDxiYXNlZmlsZT4gUmVhZCBsaW5rZXIgZ2VuZXJhdGVkIGJhc2UgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1OQotbXNnaWQgIiAgIC14IC0tbm8taWRhdGE0ICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNCBzZWN0aW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDYwCi1tc2dpZCAiICAgLWMgLS1uby1pZGF0YTUgICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBpZGF0YSQ1IHNlY3Rpb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjEKLW1zZ2lkICIiCi0iICAgLVUgLS1hZGQtdW5kZXJzY29yZSAgICAgICBBZGQgdW5kZXJzY29yZXMgdG8gc3ltYm9scyBpbiBpbnRlcmZhY2UgIgotImxpYnJhcnkuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjIKLW1zZ2lkICIgICAtayAtLWtpbGwtYXQgICAgICAgICAgICAgIEtpbGwgQDxuPiBmcm9tIGV4cG9ydGVkIG5hbWVzLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDYzCi1tc2dpZCAiICAgLUEgLS1hZGQtc3RkY2FsbC1hbGlhcyAgICBBZGQgYWxpYXNlcyB3aXRob3V0IEA8bj4uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjQKLW1zZ2lkICIgICAtUyAtLWFzIDxuYW1lPiAgICAgICAgICAgIFVzZSA8bmFtZT4gZm9yIGFzc2VtYmxlci5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA2NQotbXNnaWQgIiAgIC1mIC0tYXMtZmxhZ3MgPGZsYWdzPiAgICAgUGFzcyA8ZmxhZ3M+IHRvIHRoZSBhc3NlbWJsZXIuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjYKLW1zZ2lkICIiCi0iICAgLW4gLS1uby1kZWxldGUgICAgICAgICAgICBLZWVwIHRlbXAgZmlsZXMgKHJlcGVhdCBmb3IgZXh0cmEgIgotInByZXNlcnZhdGlvbikuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjcKLW1zZ2lkICIgICAtdiAtLXZlcmJvc2UgICAgICAgICAgICAgIEJlIHZlcmJvc2UuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjgKLW1zZ2lkICIgICAtViAtLXZlcnNpb24gICAgICAgICAgICAgIERpc3BsYXkgdGhlIHByb2dyYW0gdmVyc2lvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA2OQotbXNnaWQgIiAgIC1oIC0taGVscCAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGluZm9ybWF0aW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDcxCi1tc2dpZCAiIgotIiAgIC1NIC0tbWNvcmUtZWxmIDxvdXRuYW1lPiAgUHJvY2VzcyBtY29yZS1lbGYgb2JqZWN0IGZpbGVzIGludG8gPG91dG5hbWU+LlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDcyCi1tc2dpZCAiICAgLUwgLS1saW5rZXIgPG5hbWU+ICAgICAgICBVc2UgPG5hbWU+IGFzIHRoZSBsaW5rZXIuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNzMKLW1zZ2lkICIgICAtRiAtLWxpbmtlci1mbGFncyA8ZmxhZ3M+IFBhc3MgPGZsYWdzPiB0byB0aGUgbGlua2VyLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYWJsZSB0byBvcGVuIGJhc2UtZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMyNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTWFjaGluZSAnJXMnIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMzODUKLW1zZ2lkICJidWZmZXIgb3ZlcmZsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzE2Ci1tc2dpZCAidW5leHBlY3RlZCBlbmQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo0MTEKLW1zZ2lkICJpbnZhbGlkIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NDcwCi1tc2dpZCAiaW52YWxpZCBzdHJpbmcgbGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1MjcgaWVlZS5jOjU2OAotbXNnaWQgImV4cHJlc3Npb24gc3RhY2sgb3ZlcmZsb3ciCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjU0NwotbXNnaWQgInVuc3VwcG9ydGVkIElFRUUgZXhwcmVzc2lvbiBvcGVyYXRvciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTYyCi1tc2dpZCAidW5rbm93biBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1ODMKLW1zZ2lkICJleHByZXNzaW9uIHN0YWNrIHVuZGVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTk3Ci1tc2dpZCAiZXhwcmVzc2lvbiBzdGFjayBtaXNtYXRjaCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NjM2Ci1tc2dpZCAidW5rbm93biBidWlsdGluIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjc4MQotbXNnaWQgIkJDRCBmbG9hdCB0eXBlIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjkyNwotbXNnaWQgInVuZXhwZWN0ZWQgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo5MzQKLW1zZ2lkICJ1bmV4cGVjdGVkIHJlY29yZCB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo5NjcKLW1zZ2lkICJibG9ja3MgbGVmdCBvbiBzdGFjayBhdCBlbmQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjEyMzIKLW1zZ2lkICJ1bmtub3duIEJCIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjEyNDEKLW1zZ2lkICJzdGFjayBvdmVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTI2NgotbXNnaWQgInN0YWNrIHVuZGVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTM4MCBpZWVlLmM6MTQ1MiBpZWVlLmM6MjE1MQotbXNnaWQgImlsbGVnYWwgdmFyaWFibGUgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE0MzAKLW1zZ2lkICJpbGxlZ2FsIHR5cGUgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE0NDAgaWVlZS5jOjE0NzcKLW1zZ2lkICJ1bmtub3duIFRZIGNvZGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE0NTkKLW1zZ2lkICJ1bmRlZmluZWQgdmFyaWFibGUgaW4gVFkiCi1tc2dzdHIgIiIKLQotIy4gUGFzY2FsIGZpbGUgbmFtZS4gIEZJWE1FLgotIzogaWVlZS5jOjE4NzAKLW1zZ2lkICJQYXNjYWwgZmlsZSBuYW1lIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE5MTgKLW1zZ2lkICJ1bnN1cHBvcnRlZCBxdWFsaWZlciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjE4OQotbXNnaWQgInVuZGVmaW5lZCB2YXJpYWJsZSBpbiBBVE4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjIyMzIKLW1zZ2lkICJ1bmtub3duIEFUTiB0eXBlIgotbXNnc3RyICIiCi0KLSMuIFJlc2VydmVkIGZvciBGT1JUUkFOIGNvbW1vbi4KLSM6IGllZWUuYzoyMzU0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgQVROMTEiCi1tc2dzdHIgIiIKLQotIy4gV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24uICBGSVhNRS4KLSM6IGllZWUuYzoyMzgxCi1tc2dpZCAidW5zdXBwb3J0ZWQgQVROMTIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI0NDEKLW1zZ2lkICJ1bmV4cGVjdGVkIHN0cmluZyBpbiBDKysgbWlzYyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjQ1NAotbXNnaWQgImJhZCBtaXNjIHJlY29yZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjQ5NwotbXNnaWQgInVucmVjb2duaXplZCBDKysgbWlzYyByZWNvcmQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI2MTQKLW1zZ2lkICJ1bmRlZmluZWQgQysrIG9iamVjdCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjY0OAotbXNnaWQgInVucmVjb2duaXplZCBDKysgb2JqZWN0IHNwZWMiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI2ODQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBDKysgb2JqZWN0IHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI2OTQKLW1zZ2lkICJDKysgYmFzZSBjbGFzcyBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjcwNiBpZWVlLmM6MjgxMQotbXNnaWQgIkMrKyBvYmplY3QgaGFzIG5vIGZpZWxkcyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjcyNQotbXNnaWQgIkMrKyBiYXNlIGNsYXNzIG5vdCBmb3VuZCBpbiBjb250YWluZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI4MzIKLW1zZ2lkICJDKysgZGF0YSBtZW1iZXIgbm90IGZvdW5kIGluIGNvbnRhaW5lciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6Mjg3MyBpZWVlLmM6MzAyMwotbXNnaWQgInVua25vd24gQysrIHZpc2liaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI5MDcKLW1zZ2lkICJiYWQgQysrIGZpZWxkIGJpdCBwb3Mgb3Igc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6Mjk5OQotbXNnaWQgImJhZCB0eXBlIGZvciBDKysgbWV0aG9kIGZ1bmN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMDA5Ci1tc2dpZCAibm8gdHlwZSBpbmZvcm1hdGlvbiBmb3IgQysrIG1ldGhvZCBmdW5jdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzA0OAotbXNnaWQgIkMrKyBzdGF0aWMgdmlydHVhbCBtZXRob2QiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMxNDMKLW1zZ2lkICJ1bnJlY29nbml6ZWQgQysrIG9iamVjdCBvdmVyaGVhZCBzcGVjIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMTgyCi1tc2dpZCAidW5kZWZpbmVkIEMrKyB2dGFibGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMyNTMKLW1zZ2lkICJDKysgZGVmYXVsdCB2YWx1ZXMgbm90IGluIGEgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMyOTMKLW1zZ2lkICJ1bnJlY29nbml6ZWQgQysrIGRlZmF1bHQgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzMyNAotbXNnaWQgInJlZmVyZW5jZSBwYXJhbWV0ZXIgaXMgbm90IGEgcG9pbnRlciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzQwOQotbXNnaWQgInVucmVjb2duaXplZCBDKysgcmVmZXJlbmNlIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM0OTEKLW1zZ2lkICJDKysgcmVmZXJlbmNlIG5vdCBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzQ5OQotbXNnaWQgIkMrKyByZWZlcmVuY2UgaXMgbm90IHBvaW50ZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM1MjggaWVlZS5jOjM1MzYKLW1zZ2lkICJtaXNzaW5nIHJlcXVpcmVkIEFTTiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzU2NiBpZWVlLmM6MzU3NAotbXNnaWQgIm1pc3NpbmcgcmVxdWlyZWQgQVRONjUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM1ODgKLW1zZ2lkICJiYWQgQVRONjUgcmVjb3JkIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo0MjM1Ci1tc2dpZCAiSUVFRSBudW1lcmljIG92ZXJmbG93OiAweCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NDI4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJRUVFIHN0cmluZyBsZW5ndGggb3ZlcmZsb3c6ICV1XG4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjUzMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSUVFRSB1bnN1cHBvcnRlZCBpbnRlZ2VyIHR5cGUgc2l6ZSAldVxuIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1MzUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIklFRUUgdW5zdXBwb3J0ZWQgZmxvYXQgdHlwZSBzaXplICV1XG4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjUzODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSUVFRSB1bnN1cHBvcnRlZCBjb21wbGV4IHR5cGUgc2l6ZSAldVxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoyNzUgc3Jjb252LmM6MTk2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtdXN0IGJlIGRpZmZlcmVudFxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzozMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGlucHV0IGZpbGUgbmFtZWQgYm90aCBvbiBjb21tYW5kIGxpbmUgYW5kIHdpdGggSU5QVVRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MzM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBpbnB1dCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjM2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gbmFtZSBmb3Igb3V0cHV0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOmlucHV0IGFuZCBvdXRwdXQgZm9ybWF0cyBhcmUgbm90IGNvbXBhdGlibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NDExCi1tc2dpZCAibWFrZSAuYnNzIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjQyMAotbXNnaWQgIm1ha2UgLm5sbXNlY3Rpb25zIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjQyMgotbXNnaWQgInNldCAubmxtc2VjdGlvbnMgZmxhZ3MiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjQ1MAotbXNnaWQgInNldCAuYnNzIHZtYSIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NDU3Ci1tc2dpZCAic2V0IC5kYXRhIHNpemUiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjYzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogc3ltYm9sICVzIGltcG9ydGVkIGJ1dCBub3QgaW4gaW1wb3J0IGxpc3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NjU4Ci1tc2dpZCAic2V0IHN0YXJ0IGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjcwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogU1RBUlQgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjcxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogRVhJVCBwcm9jZWR1cmUgJXMgbm90IGRlZmluZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NzE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBDSEVDSyBwcm9jZWR1cmUgJXMgbm90IGRlZmluZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NzM2IG5sbWNvbnYuYzo5MjgKLW1zZ2lkICJjdXN0b20gc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NzU3IG5sbWNvbnYuYzo5NjAKLW1zZ2lkICJoZWxwIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjc3OSBubG1jb252LmM6OTc5Ci1tc2dpZCAibWVzc2FnZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo3OTUgbmxtY29udi5jOjEwMTIKLW1zZ2lkICJtb2R1bGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6ODE1IG5sbWNvbnYuYzoxMDI5Ci1tc2dpZCAicnBjIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjg1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolczogd2FybmluZzogc2hhcmVkIGxpYnJhcmllcyBjYW4gbm90IGhhdmUgdW5pbml0aWFsaXplZCBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjg3MyBubG1jb252LmM6MTA0OQotbXNnaWQgInNoYXJlZCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo4ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IE5vIHZlcnNpb24gbnVtYmVyIGdpdmVuXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjkyMiBubG1jb252LmM6OTU0IG5sbWNvbnYuYzo5NzMgbmxtY29udi5jOjEwMjMgbmxtY29udi5jOjEwNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JXM6IHJlYWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjk0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogTUFQIGFuZCBGVUxMTUFQIGFyZSBub3Qgc3VwcG9ydGVkOyB0cnkgbGQgLU1cbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ29udmVydCBhbiBvYmplY3QgZmlsZSBpbnRvIGEgTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstZGhWXSBbLUkgYmZkbmFtZV0gWy1PIGJmZG5hbWVdIFstVCBoZWFkZXItZmlsZV0gWy1sIGxpbmtlcl1cbiIKLSIgICAgICAgWy0taW5wdXQtdGFyZ2V0PWJmZG5hbWVdIFstLW91dHB1dC10YXJnZXQ9YmZkbmFtZV1cbiIKLSIgICAgICAgWy0taGVhZGVyLWZpbGU9ZmlsZV0gWy0tbGlua2VyPWxpbmtlcl0gWy0tZGVidWddXG4iCi0iICAgICAgIFstLWhlbHBdIFstLXZlcnNpb25dXG4iCi0iICAgICAgIFtpbi1maWxlIFtvdXQtZmlsZV1dXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjExNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHN1cHBvcnQgbm90IGNvbXBpbGVkIGluIGZvciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMjE2Ci1tc2dpZCAibWFrZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMjMwCi1tc2dpZCAic2V0IHNlY3Rpb24gc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTIzNgotbXNnaWQgInNldCBzZWN0aW9uIGFsaWdubWVudCIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTI0MAotbXNnaWQgInNldCBzZWN0aW9uIGZsYWdzIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMjUxCi1tc2dpZCAic2V0IC5ubG1zZWN0aW9ucyBzaXplIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMzM5IG5sbWNvbnYuYzoxMzQ3IG5sbWNvbnYuYzoxMzU2IG5sbWNvbnYuYzoxMzYxCi1tc2dpZCAic2V0IC5ubG1zZWN0aW9uIGNvbnRlbnRzIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxODY0Ci1tc2dpZCAic3R1YiBzZWN0aW9uIHNpemVzIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxOTEzCi1tc2dpZCAid3JpdGluZyBzdHViIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoyMDAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bnJlc29sdmVkIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MjA2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogb3ZlcmZsb3cgd2hlbiBhZGp1c3RpbmcgcmVsb2NhdGlvbiBhZ2FpbnN0ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjIxOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGV4ZWN1dGlvbiBvZiAlcyBmYWlsZWQ6ICIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MjIwNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRXhlY3V0aW9uIG9mICVzIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1hQUJDRGdsbm9wUHJzdXZWXSBbLXQgcmFkaXhdIFstLXJhZGl4PXJhZGl4XSBbLS10YXJnZXQ9YmZkbmFtZV1cbiIKLSIgICAgICAgWy0tZGVidWctc3ltc10gWy0tZXh0ZXJuLW9ubHldIFstLXByaW50LWFybWFwXSBbLS1wcmludC1maWxlLW5hbWVdXG4iCi0iICAgICAgIFstLW51bWVyaWMtc29ydF0gWy0tbm8tc29ydF0gWy0tcmV2ZXJzZS1zb3J0XSBbLS1zaXplLXNvcnRdXG4iCi0iICAgICAgIFstLXVuZGVmaW5lZC1vbmx5XSBbLS1wb3J0YWJpbGl0eV0gWy1mIHtic2Qsc3lzdixwb3NpeH1dXG4iCi0iICAgICAgIFstLWZvcm1hdD17YnNkLHN5c3YscG9zaXh9XSBbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdIFstLWR5bmFtaWNdXG4iCi0iICAgICAgIFstLWRlZmluZWQtb25seV0gWy0tbGluZS1udW1iZXJzXVxuIgotIiAgICAgICBbLS12ZXJzaW9uXSBbLS1oZWxwXVxuIgotIiAgICAgICBbZmlsZS4uLl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjMzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IGludmFsaWQgcmFkaXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjM2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IGludmFsaWQgb3V0cHV0IGZvcm1hdFxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6NDkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkYXRhIHNpemUgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzoxMjgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJVbmRlZmluZWQgc3ltYm9scyBmcm9tICVzOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MTI4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iU3ltYm9scyBmcm9tICVzOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MTI4NCBubS5jOjEzMzgKLW1zZ2lkICIiCi0iTmFtZSAgICAgICAgICAgICAgICAgIFZhbHVlICAgQ2xhc3MgICAgICAgIFR5cGUgICAgICAgICBTaXplICAgTGluZSAgIgotIlNlY3Rpb25cbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjEzMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlVuZGVmaW5lZCBzeW1ib2xzIGZyb20gJXNbJXNdOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MTMzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iU3ltYm9scyBmcm9tICVzWyVzXTpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjE1MDgKLW1zZ2lkICIiCi0iXG4iCi0iQXJjaGl2ZSBpbmRleDpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy12VlNwZ3hYXSBbLUkgYmZkbmFtZV0gWy1PIGJmZG5hbWVdIFstRiBiZmRuYW1lXSBbLWIgYnl0ZV1cbiIKLSIgICAgICAgWy1SIHNlY3Rpb25dIFstaSBpbnRlcmxlYXZlXSBbLS1pbnRlcmxlYXZlPWludGVybGVhdmVdIFstLWJ5dGU9Ynl0ZV1cbiIKLSIgICAgICAgWy0taW5wdXQtdGFyZ2V0PWJmZG5hbWVdIFstLW91dHB1dC10YXJnZXQ9YmZkbmFtZV0gIgotIlstLXRhcmdldD1iZmRuYW1lXVxuIgotIiAgICAgICBbLS1zdHJpcC1hbGxdIFstLXN0cmlwLWRlYnVnXSBbLS1zdHJpcC11bm5lZWRlZF0gWy0tZGlzY2FyZC1hbGxdXG4iCi0iICAgICAgIFstLWRpc2NhcmQtbG9jYWxzXSBbLS1kZWJ1Z2dpbmddIFstLXJlbW92ZS1zZWN0aW9uPXNlY3Rpb25dXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjMwMAotbXNnaWQgIiIKLSIgICAgICAgWy0tZ2FwLWZpbGw9dmFsXSBbLS1wYWQtdG89YWRkcmVzc10gWy0tcHJlc2VydmUtZGF0ZXNdXG4iCi0iICAgICAgIFstLXNldC1zdGFydD12YWxdIFxuIgotIiAgICAgICBbLS1jaGFuZ2Utc3RhcnQ9aW5jcl0gWy0tY2hhbmdlLWFkZHJlc3Nlcz1pbmNyXSBcbiIKLSIgICAgICAgKC0tYWRqdXN0LXN0YXJ0ICAgYW5kICAtLWFkanVzdC12bWEgYXJlIGFsaWFzZXMgZm9yIHRoZXNlIHR3bykgXG4iCi0iICAgICAgIFstLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3M9c2VjdGlvbns9LCssLX12YWxdXG4iCi0iICAgICAgICgtLWFkanVzdC1zZWN0aW9uLXZtYSBpcyBhbiBhbGlhcyBmb3IgLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzKVxuIgotIiAgICAgICBbLS1jaGFuZ2Utc2VjdGlvbi1sbWE9c2VjdGlvbns9LCssLX12YWxdXG4iCi0iICAgICAgIFstLWNoYW5nZS1zZWN0aW9uLXZtYT1zZWN0aW9uez0sKywtfXZhbF1cbiIKLSIgICAgICAgWy0tYWRqdXN0LXdhcm5pbmdzXSBbLS1uby1hZGp1c3Qtd2FybmluZ3NdXG4iCi0iICAgICAgIFstLWNoYW5nZS13YXJuaW5nc10gWy0tbm8tY2hhbmdlLXdhcm5pbmdzXVxuIgotIiAgICAgICBbLS1zZXQtc2VjdGlvbi1mbGFncz1zZWN0aW9uPWZsYWdzXSAiCi0iWy0tYWRkLXNlY3Rpb249c2VjdGlvbm5hbWU9ZmlsZW5hbWVdXG4iCi0iICAgICAgIFstLWtlZXAtc3ltYm9sIHN5bWJvbF0gWy1LIHN5bWJvbF0gWy0tc3RyaXAtc3ltYm9sIHN5bWJvbF0gWy1OICIKLSJzeW1ib2xdXG4iCi0iICAgICAgIFstLWxvY2FsaXplLXN5bWJvbCBzeW1ib2xdIFstTCBzeW1ib2xdIFstLXdlYWtlbi1zeW1ib2wgc3ltYm9sXVxuIgotIiAgICAgICBbLVcgc3ltYm9sXSBbLS1jaGFuZ2UtbGVhZGluZy1jaGFyXSBbLS1yZW1vdmUtbGVhZGluZy1jaGFyXSAiCi0iWy0td2Vha2VuXVxuIgotIiAgICAgICBbLS12ZXJib3NlXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSBpbi1maWxlIFtvdXQtZmlsZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MzI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy12VnNTcGd4WF0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLUYgYmZkbmFtZV0gWy1SIHNlY3Rpb25dXG4iCi0iICAgICAgIFstLWlucHV0LXRhcmdldD1iZmRuYW1lXSBbLS1vdXRwdXQtdGFyZ2V0PWJmZG5hbWVdICIKLSJbLS10YXJnZXQ9YmZkbmFtZV1cbiIKLSIgICAgICAgWy0tc3RyaXAtYWxsXSBbLS1zdHJpcC1kZWJ1Z10gWy0tc3RyaXAtdW5uZWVkZWRdIFstLWRpc2NhcmQtYWxsXVxuIgotIiAgICAgICBbLS1kaXNjYXJkLWxvY2Fsc10gWy0ta2VlcC1zeW1ib2wgc3ltYm9sXSBbLUsgc3ltYm9sXVxuIgotIiAgICAgICBbLS1zdHJpcC1zeW1ib2wgc3ltYm9sXSBbLU4gc3ltYm9sXSBbLS1yZW1vdmUtc2VjdGlvbj1zZWN0aW9uXVxuIgotIiAgICAgICBbLW8gZmlsZV0gWy0tcHJlc2VydmUtZGF0ZXNdIFstLXZlcmJvc2VdIFstLXZlcnNpb25dIFstLWhlbHBdICIKLSJmaWxlLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjM4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgc2VjdGlvbiBmbGFnIGAlcyciCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjM4NAotbXNnaWQgInN1cHBvcnRlZCBmbGFnczogYWxsb2MsIGxvYWQsIHJlYWRvbmx5LCBjb2RlLCBkYXRhLCByb20sIGNvbnRlbnRzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzo2MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY29weSBmcm9tICVzKCVzKSB0byAlcyglcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6NjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IE91dHB1dCBmaWxlIGNhbm5vdCByZXByZXNlbnQgYXJjaGl0ZWN0dXJlICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzo2NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3QgY3JlYXRlIHNlY3Rpb24gYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjc1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBmaWxsIGdhcCBhZnRlciAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjc4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBhZGQgcGFkZGluZyB0byAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjkxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZXJyb3IgY29weWluZyBwcml2YXRlIEJGRCBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6OTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBta2RpciAlcyBmb3IgYXJjaGl2ZSBjb3B5aW5nIChlcnJvcjogJXMpIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxMjE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzZWN0aW9uIGAlcyc6IGVycm9yIGluICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTQ4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3QgY3JlYXRlIGRlYnVnZ2luZyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTUwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3Qgc2V0IGRlYnVnZ2luZyBzZWN0aW9uIGNvbnRlbnRzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTUxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZG9uJ3Qga25vdyBob3cgdG8gd3JpdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTYxOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IHN0YXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNjY4Ci1tc2dpZCAiYnl0ZSBudW1iZXIgbXVzdCBiZSBub24tbmVnYXRpdmUiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE2NzMKLW1zZ2lkICJpbnRlcmxlYXZlIG11c3QgYmUgcG9zaXRpdmUiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE3NDIKLW1zZ2lkICJiYWQgZm9ybWF0IGZvciAtLWFkZC1zZWN0aW9uIE5BTUU9RklMRU5BTUUiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE3NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQ6ICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTc2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbjogJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNzY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmcmVhZCBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE4MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGZvcm1hdCBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE4NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogdHJ1bmNhdGluZyBnYXAtZmlsbCBmcm9tIDB4JXMgdG8gMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTg5MgotbXNnaWQgImJhZCBmb3JtYXQgZm9yIC0tc2V0LXNlY3Rpb24tZmxhZ3MiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE5MjIKLW1zZ2lkICJieXRlIG51bWJlciBtdXN0IGJlIGxlc3MgdGhhbiBpbnRlcmxlYXZlIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxOTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBzdGF0OiAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE5ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogLS1jaGFuZ2Utc2VjdGlvbi12bWEgJXMlYzB4JXMgbmV2ZXIgdXNlZCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTk5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiAtLWNoYW5nZS1zZWN0aW9uLWxtYSAlcyVjMHglcyBuZXZlciB1c2VkIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLWFoaWZDZERwclJ0VHhzU2x3XSBbLWIgYmZkbmFtZV0gWy1tIG1hY2hpbmVdIFstaiBzZWN0aW9uLW5hbWVdXG4iCi0iICAgICAgIFstLWFyY2hpdmUtaGVhZGVyc10gWy0tdGFyZ2V0PWJmZG5hbWVdIFstLWRlYnVnZ2luZ10gWy0tZGlzYXNzZW1ibGVdXG4iCi0iICAgICAgIFstLWRpc2Fzc2VtYmxlLWFsbF0gWy0tZGlzYXNzZW1ibGUtemVyb2VzXSBbLS1maWxlLWhlYWRlcnNdXG4iCi0iICAgICAgIFstLXNlY3Rpb24taGVhZGVyc10gWy0taGVhZGVyc11cbiIKLSIgICAgICAgWy0taW5mb10gWy0tc2VjdGlvbj1zZWN0aW9uLW5hbWVdIFstLWxpbmUtbnVtYmVyc10gWy0tc291cmNlXVxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMjYKLW1zZ2lkICIiCi0iICAgICAgIFstLWFyY2hpdGVjdHVyZT1tYWNoaW5lXSBbLS1yZWxvY10gWy0tZnVsbC1jb250ZW50c10gWy0tc3RhYnNdXG4iCi0iICAgICAgIFstLXN5bXNdIFstLWFsbC1oZWFkZXJzXSBbLS1keW5hbWljLXN5bXNdIFstLWR5bmFtaWMtcmVsb2NdXG4iCi0iICAgICAgIFstLXdpZGVdIFstLXZlcnNpb25dIFstLWhlbHBdIFstLXByaXZhdGUtaGVhZGVyc11cbiIKLSIgICAgICAgWy0tc3RhcnQtYWRkcmVzcz1hZGRyXSBbLS1zdG9wLWFkZHJlc3M9YWRkcl1cbiIKLSIgICAgICAgWy0tcHJlZml4LWFkZHJlc3Nlc10gWy0tW25vLV1zaG93LXJhdy1pbnNuXSBbLS1kZW1hbmdsZV1cbiIKLSIgICAgICAgWy0tYWRqdXN0LXZtYT1vZmZzZXRdIFstRUJ8LUVMXSBbLS1lbmRpYW49e2JpZ3xsaXR0bGV9XSBvYmpmaWxlLi4uXG4iCi0iYXQgbGVhc3Qgb25lIG9wdGlvbiBiZXNpZGVzIC1sICgtLWxpbmUtbnVtYmVycykgbXVzdCBiZSBnaXZlblxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzozNjEKLW1zZ2lkICJTZWN0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MzYzCi1tc2dpZCAiSWR4IE5hbWUgICAgICAgICAgU2l6ZSAgICAgIFZNQSAgICAgICBMTUEgICAgICAgRmlsZSBvZmYgIEFsZ25cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MzY1Ci1tc2dpZCAiIgotIklkeCBOYW1lICAgICAgICAgIFNpemUgICAgICBWTUEgICAgICAgICAgICAgICBMTUEgICAgICAgICAgICAgICBGaWxlIG9mZiAgIgotIkFsZ25cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6NDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogbm90IGEgZHluYW1pYyBvYmplY3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6NDMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogTm8gZHluYW1pYyBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjExMzEKLW1zZ2lkICJPdXQgb2YgdmlydHVhbCBtZW1vcnlcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTUzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3QgdXNlIHN1cHBsaWVkIG1hY2hpbmUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTU1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3QgZGlzYXNzZW1ibGUgZm9yIGFyY2hpdGVjdHVyZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxNjI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkRpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE3OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIk5vICVzIHNlY3Rpb24gcHJlc2VudFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxODA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlcyBoYXMgbm8gJXMgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxODE4IG9iamR1bXAuYzoxODI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBSZWFkaW5nICVzIHNlY3Rpb24gb2YgJXMgZmFpbGVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxODcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJDb250ZW50cyBvZiAlcyBzZWN0aW9uOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxOTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgImFyY2hpdGVjdHVyZTogJXMsICIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTk3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJmbGFncyAweCUwOHg6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE5ODcKLW1zZ2lkICIiCi0iXG4iCi0ic3RhcnQgYWRkcmVzcyAweCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjAzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iJXM6ICAgICBmaWxlIGZvcm1hdCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMDcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBwcmludGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZmFpbGVkXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjIxMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW4gYXJjaGl2ZSAlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjE1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJDb250ZW50cyBvZiBzZWN0aW9uICVzOlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyNjY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJGRCBoZWFkZXIgZmlsZSB2ZXJzaW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjI3ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVucmVjb2duaXplZCAtRSBvcHRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjgwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5yZWNvZ25pemVkIC0tZW5kaWFuIHR5cGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHJkY29mZi5jOjIwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcGFyc2VfY29mZl90eXBlOiBCYWQgdHlwZSBjb2RlIDB4JXhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZGNvZmYuYzo0MjMgcmRjb2ZmLmM6NTMxIHJkY29mZi5jOjcxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmZkX2NvZmZfZ2V0X3N5bWVudCBmYWlsZWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmRjb2ZmLmM6NDM5IHJkY29mZi5jOjczMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmZkX2NvZmZfZ2V0X2F1eGVudCBmYWlsZWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmRjb2ZmLmM6Nzk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlbGQ6IC5iZiB3aXRob3V0IHByZWNlZGluZyBmdW5jdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHJkY29mZi5jOjg0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJWxkOiB1bmV4cGVjdGVkIC5lZlxuIgotbXNnc3RyICIiCi0KLSM6IHJkZGJnLmM6ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIHJlY29nbml6ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogcmRkYmcuYzo0MDAKLW1zZ2lkICJMYXN0IHN0YWJzIGVudHJpZXMgYmVmb3JlIGVycm9yOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMzcgcmVhZGVsZi5jOjI2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRXJyb3I6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjQ5IHJlYWRlbGYuYzoyNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFdhcm5pbmc6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA4IHJlYWRlbGYuYzozMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5oYW5kbGVkIGRhdGEgbGVuZ3RoOiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzIKLW1zZ2lkICJEb24ndCBrbm93IGFib3V0IHJlbG9jYXRpb25zIG9uIHRoaXMgbWFjaGluZSBhcmNoaXRlY3R1cmVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDEwIHJlYWRlbGYuYzo0MzkKLW1zZ2lkICJvdXQgb2YgbWVtb3J5IHBhcnNpbmcgcmVsb2NzIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NTYKLW1zZ2lkICIiCi0iICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lICAgICAgICAgICIKLSJBZGRlbmRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDU5Ci1tc2dpZCAiICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbmlzZWQ6ICUtN2x4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHN0cmluZyB0YWJsZSBpbmRleCAlM2xkPiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlByb2Nlc3NvciBTcGVjaWZpYzogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3BlcmF0aW5nIFN5c3RlbSBzcGVjaWZpYzogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3NDQgcmVhZGVsZi5jOjk5NgotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93bj46ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzU4Ci1tc2dpZCAiTk9ORSAoTm9uZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc1OQotbXNnaWQgIlJFTCAoUmVsb2NhdGFibGUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc2MAotbXNnaWQgIkVYRUMgKEV4ZWN1dGFibGUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc2MQotbXNnaWQgIkRZTiAoU2hhcmVkIG9iamVjdCBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzYyCi1tc2dpZCAiQ09SRSAoQ29yZSBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlByb2Nlc3NvciBTcGVjaWZpYzogKCV4KSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk9TIFNwZWNpZmljOiAoJXgpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3NzAgcmVhZGVsZi5jOjgyOSByZWFkZWxmLmM6OTMyIHJlYWRlbGYuYzoxMTA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duPjogJXgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc4MwotbXNnaWQgIk5vbmUiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjkyOQotbXNnaWQgIkVMRkRBVEEyTFNCIChsaXR0bGUgZW5kaWFuKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6OTMwCi1tc2dpZCAiRUxGREFUQTJNU0IgKGJpZyBlbmRpYW4pIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQzCi1tc2dpZCAiVXNhZ2U6IHJlYWRlbGYge29wdGlvbnN9IGVsZi1maWxlKHMpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNDQKLW1zZ2lkICIgIE9wdGlvbnMgYXJlOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQ1Ci1tc2dpZCAiIgotIiAgLWEgb3IgLS1hbGwgICAgICAgICAgICAgICBFcXVpdmFsZW50IHRvOiAtaCAtbCAtUyAtcyAtciAtZCAtViAtLWhpc3RvZ3JhbVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQ2Ci1tc2dpZCAiICAtaCBvciAtLWZpbGUtaGVhZGVyICAgICAgIERpc3BsYXkgdGhlIEVMRiBmaWxlIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQ3Ci1tc2dpZCAiICAtbCBvciAtLXByb2dyYW0taGVhZGVycyBvciAtLXNlZ21lbnRzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNDgKLW1zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgcHJvZ3JhbSBoZWFkZXJzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNDkKLW1zZ2lkICIgIC1TIG9yIC0tc2VjdGlvbi1oZWFkZXJzIG9yIC0tc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1MAotbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBzZWN0aW9ucycgaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTEKLW1zZ2lkICIgIC1lIG9yIC0taGVhZGVycyAgICAgICAgICAgRXF1aXZhbGVudCB0bzogLWggLWwgLVNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1MgotbXNnaWQgIiAgLXMgb3IgLS1zeW1zIG9yIC0tc3ltYm9scyBEaXNwbGF5IHRoZSBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1MwotbXNnaWQgIiAgLXIgb3IgLS1yZWxvY3MgICAgICAgICAgICBEaXNwbGF5IHRoZSByZWxvY2F0aW9ucyAoaWYgcHJlc2VudClcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1NAotbXNnaWQgIiAgLWQgb3IgLS1keW5hbWljICAgICAgICAgICBEaXNwbGF5IHRoZSBkeW5hbWljIHNlZ21lbnQgKGlmIHByZXNlbnQpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTUKLW1zZ2lkICIgIC1WIG9yIC0tdmVyc2lvbi1pbmZvICAgICAgRGlzcGxheSB0aGUgdmVyc2lvbiBzZWN0aW9ucyAoaWYgcHJlc2VudClcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1NgotbXNnaWQgIiIKLSIgIC1EIG9yIC0tdXNlLWR5bmFtaWMgICAgICAgVXNlIHRoZSBkeW5hbWljIHNlY3Rpb24gaW5mbyB3aGVuIGRpc3BsYXlpbmcgIgotInN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1NwotbXNnaWQgIiAgLXggPG51bWJlcj4gb3IgLS1oZXgtZHVtcD08bnVtYmVyPlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTU4Ci1tc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bXAgdGhlIGNvbnRlbnRzIG9mIHNlY3Rpb24gPG51bWJlcj5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1OQotbXNnaWQgIiAgLXdbbGlhcHJdIG9yIC0tZGVidWctZHVtcFs9bGluZSw9aW5mbyw9YWJicmV2LD1wdWJuYW1lcyw9cmFuZ2VzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTYwCi1tc2dpZCAiIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiBEV0FSRjIgZGVidWcgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE2MgotbXNnaWQgIiAgLWkgPG51bWJlcj4gb3IgLS1pbnN0cnVjdGlvbi1kdW1wPTxudW1iZXI+XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNjMKLW1zZ2lkICIiCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBzZWN0aW9uIDxudW1iZXI+XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNjUKLW1zZ2lkICIgICAgICAgIC0taGlzdG9ncmFtICAgICAgICAgRGlzcGxheSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3Roc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTY2Ci1tc2dpZCAiICAtdiBvciAtLXZlcnNpb24gICAgICAgICAgIERpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHJlYWRlbGZcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE2NwotbXNnaWQgIiAgLUggb3IgLS1oZWxwICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE4NQotbXNnaWQgIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBkdW1wIHJlcXVlc3QgdGFibGUuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBkZWJ1ZyBvcHRpb24gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgb3B0aW9uICctJWMnXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzNDcKLW1zZ2lkICJOb3RoaW5nIHRvIGRvLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzYwIHJlYWRlbGYuYzoxMzc3IHJlYWRlbGYuYzoyNTMxCi1tc2dpZCAibm9uZSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTM2MQotbXNnaWQgIkVMRjMyIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzYyCi1tc2dpZCAiRUxGNjQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzNjQgcmVhZGVsZi5jOjEzODEgcmVhZGVsZi5jOjEzOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd246ICVseD4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzNzgKLW1zZ2lkICIyJ3MgY29tcGxlbWVudCwgbGl0dGxlIGVuZGlhbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTM3OQotbXNnaWQgIjIncyBjb21wbGVtZW50LCBiaWcgZW5kaWFuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzk0Ci1tc2dpZCAiVU5JWCAtIFN5c3RlbSBWIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzk1Ci1tc2dpZCAiVU5JWCAtIEhQLVVYIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzk2Ci1tc2dpZCAiU3RhbmRhbG9uZSBBcHAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0MTMKLW1zZ2lkICJOb3QgYW4gRUxGIGZpbGUgLSBpdCBoYXMgdGhlIHdyb25nIG1hZ2ljIGJ5dGVzIGF0IHRoZSBzdGFydFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDIxCi1tc2dpZCAiRUxGIEhlYWRlcjpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQyMgotbXNnaWQgIiAgTWFnaWM6ICAgIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDI4IHJlYWRlbGYuYzoxNDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAlZCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT1MvQUJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQUJJIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTWFjaGluZTogICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRW50cnkgcG9pbnQgYWRkcmVzczogICAgICAgICAgICAgICAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAlbGQgKGJ5dGVzIGludG8gZmlsZSlcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFN0YXJ0IG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgJWxkIChieXRlcyBpbnRvIGZpbGUpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBGbGFnczogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JWx4JXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgdGhpcyBoZWFkZXI6ICAgICAgICAgICAgICAgJWxkIChieXRlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAgJWxkIChieXRlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgICVsZCAoYnl0ZXMpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OiAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ3NgotbXNnaWQgIk5vdCBhIDMyIGJpdCBFTEYgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDk2Ci1tc2dpZCAiIgotIlxuIgotIlRoZXJlIGFyZSBubyBwcm9ncmFtIGhlYWRlcnMgaW4gdGhpcyBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJFbGYgZmlsZSBpcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkVudHJ5IHBvaW50IDB4JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE1MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVGhlcmUgYXJlICVkIHByb2dyYW0gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0ICVseDpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTUxNyByZWFkZWxmLmM6MTY2OCByZWFkZWxmLmM6MTcxMSByZWFkZWxmLmM6MjA5MCByZWFkZWxmLmM6MjIxNAotIzogcmVhZGVsZi5jOjMxMTUgcmVhZGVsZi5jOjMxMjkKLW1zZ2lkICJPdXQgb2YgbWVtb3J5XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE1NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlByb2dyYW0gSGVhZGVyJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE1NDIKLW1zZ2lkICIiCi0iICBUeXBlICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgIFBoeXNBZGRyICAgRmlsZVNpeiBNZW1TaXogIEZsZyBBbGlnblxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTc4Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSBkeW5hbWljIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTU4NgotbXNnaWQgIlVuYWJsZSB0byBmaW5kIHByb2dyYW0gaW50ZXJwcmV0ZXIgbmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBbUmVxdWVzdGluZyBwcm9ncmFtIGludGVycHJldGVyOiAlc10iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE2MTEKLW1zZ2lkICIiCi0iXG4iCi0iIFNlY3Rpb24gdG8gU2VnbWVudCBtYXBwaW5nOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNjEyCi1tc2dpZCAiICBTZWdtZW50IFNlY3Rpb25zLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE3NDYKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgYXJlIG5vIHNlY3Rpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTc1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJUaGVyZSBhcmUgJWQgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJWx4OlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNzg2Ci1tc2dpZCAiRmlsZSBjb250YWlucyBtdWx0aXBsZSBkeW5hbWljIHN5bWJvbCB0YWJsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTc5OQotbXNnaWQgIkZpbGUgY29udGFpbnMgbXVsdGlwbGUgZHluYW1pYyBzdHJpbmcgdGFibGVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE4MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gSGVhZGVyJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE4MjgKLW1zZ2lkICIiCi0iICBbTnJdIE5hbWUgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsZyBMayAiCi0iSW5mIEFsXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWxkIGJ5dGVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxOTE2Ci1tc2dpZCAiIgotIlxuIgotIlRoZXJlIGFyZSBubyBkeW5hbWljIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk0MwotbXNnaWQgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxOTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWx1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5ODIKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjA3MAotbXNnaWQgIiIKLSJcbiIKLSJUaGVyZSBpcyBubyBkeW5hbWljIHNlZ21lbnQgaW4gdGhpcyBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTI4Ci1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGUhIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTM0Ci1tc2dpZCAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gbG9hZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTY0Ci1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjE3MAotbXNnaWQgIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjIzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRHluYW1pYyBzZWdtZW50IGF0IG9mZnNldCAweCV4IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyMzQKLW1zZ2lkICIgIFRhZyAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lL1ZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAweCUtOC44bHggKCVzKSUqcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjI1NAotbXNnaWQgIkF1eGlsaWFyeSBsaWJyYXJ5IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMjU2Ci1tc2dpZCAiRmlsdGVyIGxpYnJhcnkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyNjggcmVhZGVsZi5jOjIyODkgcmVhZGVsZi5jOjIzMTUKLW1zZ2lkICJGbGFnczoiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyNzAgcmVhZGVsZi5jOjIyOTEgcmVhZGVsZi5jOjIzMTcKLW1zZ2lkICIgTm9uZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlNoYXJlZCBsaWJyYXJ5OiBbJXNdIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNDI1Ci1tc2dpZCAiIHByb2dyYW0gaW50ZXJwcmV0ZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjQyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHNvbmFtZTogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgcnBhdGg6IFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjQ4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJOb3QgbmVlZGVkIG9iamVjdDogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTgwCi1tc2dpZCAiICBBZGRyOiAweCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjU4MiByZWFkZWxmLmM6Mjc3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9mZnNldDogJSMwOGx4ICBMaW5rOiAlbHggKCVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFJldjogJWQgIEZsYWdzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjYxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEluZGV4OiAlZCAgQ250OiAlZCAgIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5hbWU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI2MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTmFtZSBpbmRleDogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI2NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogUGFyZW50ICVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFBhcmVudCAlZCwgbmFtZSBpbmRleDogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI2NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gbmVlZHMgc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjY4Ci1tc2dpZCAiIEFkZHI6IDB4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT2Zmc2V0OiAlIzA4bHggIExpbmsgdG8gc2VjdGlvbjogJWxkICglcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjY5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBWZXJzaW9uOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjY5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRmlsZTogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQ250OiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IE5hbWU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IE5hbWUgaW5kZXg6ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjcyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEZsYWdzOiAlcyAgVmVyc2lvbjogJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mjc2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzY5Ci1tc2dpZCAiIEFkZHI6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mjc5OAotbXNnaWQgIiAgIDAgKCpsb2NhbCopICAgICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjgwMgotbXNnaWQgIiAgIDEgKCpnbG9iYWwqKSAgICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzAyNQotbXNnaWQgIiIKLSJcbiIKLSJObyB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzAzOAotbXNnaWQgIkxPQ0FMIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDM5Ci1tc2dpZCAiR0xPQkFMIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDQwCi1tc2dpZCAiV0VBSyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA0MyByZWFkZWxmLmM6MzA2NwotIywgYy1mb3JtYXQKLW1zZ2lkICI8cHJvY2Vzc29yIHNwZWNpZmljPjogJWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwNDUgcmVhZGVsZi5jOjMwNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPE9TIHNwZWNpZmljPjogJWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwNDcgcmVhZGVsZi5jOjMwNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24+OiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA2MAotbXNnaWQgIk5PVFlQRSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA2MQotbXNnaWQgIk9CSkVDVCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA2MgotbXNnaWQgIkZVTkMiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwNjMKLW1zZ2lkICJTRUNUSU9OIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDY0Ci1tc2dpZCAiRklMRSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzEyMQotbXNnaWQgIlVuYWJsZSB0byByZWFkIGluIGR5bmFtaWMgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMTYzCi1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gc3RhcnQgb2YgZHluYW1pYyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzE2OQotbXNnaWQgIkZhaWxlZCB0byByZWFkIGluIG51bWJlciBvZiBidWNrZXRzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMxNzUKLW1zZ2lkICJGYWlsZWQgdG8gcmVhZCBpbiBudW1iZXIgb2YgY2hhaW5zXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMxOTUKLW1zZ2lkICIiCi0iXG4iCi0iU3ltYm9sIHRhYmxlIGZvciBpbWFnZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzE5NgotbXNnaWQgIiAgTnVtIEJ1YzogICAgVmFsdWUgIFNpemUgICBUeXBlICAgQmluZCBPdCBOZHggTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMjQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTeW1ib2wgdGFibGUgJyVzJyBjb250YWlucyAlbHUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzI0NAotbXNnaWQgIiAgTnVtOiAgICBWYWx1ZSAgU2l6ZSBUeXBlICAgIEJpbmQgICBPdCAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzM1NgotbXNnaWQgImJhZCBkeW5hbWljIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzQxNQotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIHN5bWJvbCBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvciBkaXNwbGF5aW5nIHN5bWJvbHMuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM0MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoICh0b3RhbCBvZiAlZCBidWNrZXRzKTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzQyOQotbXNnaWQgIiBMZW5ndGggIE51bWJlciAgICAgJSUgb2YgdG90YWwgIENvdmVyYWdlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM0MzQgcmVhZGVsZi5jOjM0NTMgcmVhZGVsZi5jOjUzMzYgcmVhZGVsZi5jOjU1MjYKLW1zZ2lkICJPdXQgb2YgbWVtb3J5IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNDk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIGluZm8gc2VnbWVudCBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzUwMgotbXNnaWQgIiBOdW06IE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZFRvICAgICBGbGFnc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJBc3NlbWJseSBkdW1wIG9mIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzU3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiAnJXMnIGhhcyBubyBkYXRhIHRvIGR1bXAuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM1NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhleCBkdW1wIG9mIHNlY3Rpb24gJyVzJzpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzcyOAotbXNnaWQgImJhZGx5IGZvcm1lZCBleHRlbmRlZCBsaW5lIG9wIGVuY291bnRlcmVkISIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzczNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEV4dGVuZGVkIG9wY29kZSAlZDogIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzQwCi1tc2dpZCAiIgotIkVuZCBvZiBTZXF1ZW5jZVxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNldCBBZGRyZXNzIHRvIDB4JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NTIKLW1zZ2lkICIgIGRlZmluZSBuZXcgRmlsZSBUYWJsZSBlbnRyeVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzUzIHJlYWRlbGYuYzozODcxCi1tc2dpZCAiICBFbnRyeVx0RGlyXHRUaW1lXHRTaXplXHROYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJWRcdCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzc1OCByZWFkZWxmLmM6Mzc2MCByZWFkZWxmLmM6Mzc2MiByZWFkZWxmLmM6Mzg4MyByZWFkZWxmLmM6Mzg4NQotIzogcmVhZGVsZi5jOjM4ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJWx1XHQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVU5LTk9XTjogbGVuZ3RoICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkR1bXAgb2YgZGVidWcgY29udGVudHMgb2Ygc2VjdGlvbiAlczpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzgwMQotbXNnaWQgIlRoZSBsaW5lIGluZm8gYXBwZWFycyB0byBiZSBjb3JydXB0IC0gdGhlIHNlY3Rpb24gaXMgdG9vIHNtYWxsXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MDkKLW1zZ2lkICJPbmx5IERXQVJGIHZlcnNpb24gMiBsaW5lIGluZm8gaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzgyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIExlbmd0aDogICAgICAgICAgICAgICAgICAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBEV0FSRiBWZXJzaW9uOiAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBQcm9sZ3VlIExlbmd0aDogICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBNaW5pbXVtIEluc3RydWN0aW9uIExlbmd0aDogICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBJbml0aWFsIHZhbHVlIG9mICdpc19zdG10JzogICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBMaW5lIEJhc2U6ICAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBMaW5lIFJhbmdlOiAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPcGNvZGUgQmFzZTogICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NDAKLW1zZ2lkICIiCi0iXG4iCi0iIE9wY29kZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPcGNvZGUgJWQgaGFzICVkIGFyZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzg0OQotbXNnaWQgIiIKLSJcbiIKLSIgVGhlIERpcmVjdG9yeSBUYWJsZSBpcyBlbXB0eS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzg1MgotbXNnaWQgIiIKLSJcbiIKLSIgVGhlIERpcmVjdG9yeSBUYWJsZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzg1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NjcKLW1zZ2lkICIiCi0iXG4iCi0iIFRoZSBGaWxlIE5hbWUgVGFibGUgaXMgZW1wdHkuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NzAKLW1zZ2lkICIiCi0iXG4iCi0iIFRoZSBGaWxlIE5hbWUgVGFibGU6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlZFx0IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzXG4iCi1tc2dzdHIgIiIKLQotIy4gTm93IGRpc3BsYXkgdGhlIHN0YXRlbWVudHMuCi0jOiByZWFkZWxmLmM6Mzg5NwotbXNnaWQgIiIKLSJcbiIKLSIgTGluZSBOdW1iZXIgU3RhdGVtZW50czpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzkxNQotbXNnaWQgIiAgQ29weVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQWR2YW5jZSBQQyBieSAlZCB0byAlbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzkzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFkdmFuY2UgTGluZSBieSAlZCB0byAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2V0IEZpbGUgTmFtZSB0byBlbnRyeSAlZCBpbiB0aGUgRmlsZSBOYW1lIFRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTZXQgY29sdW1uIHRvICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTZXQgaXNfc3RtdCB0byAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTU3Ci1tc2dpZCAiICBTZXQgYmFzaWMgYmxvY2tcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzk2NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFkdmFuY2UgUEMgYnkgY29uc3RhbnQgJWQgdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFkdmFuY2UgUEMgYnkgZml4ZWQgc2l6ZSBhbW91bnQgJWQgdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzk4MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNwZWNpYWwgb3Bjb2RlICVkOiBhZHZhbmNlIEFkZHJlc3MgYnkgJWQgdG8gMHglbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFuZCBMaW5lIGJ5ICVkIHRvICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQwMDcgcmVhZGVsZi5jOjQ0MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkNvbnRlbnRzIG9mIHRoZSAlcyBzZWN0aW9uOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDI2Ci1tc2dpZCAiT25seSBEV0FSRiAyIHB1Ym5hbWVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPZmZzZXQgaW50byAuZGVidWdfaW5mbyBzZWN0aW9uOiAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQwMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIGFyZWEgaW4gLmRlYnVnX2luZm8gc2VjdGlvbjogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQwMzkKLW1zZ2lkICIiCi0iXG4iCi0iICAgIE9mZnNldFx0TmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gVEFHIHZhbHVlOiAlbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQyMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBBVCB2YWx1ZTogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gRk9STSB2YWx1ZTogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDMyCi1tc2dpZCAiICBOdW1iZXIgVEFHXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJWxkICAgICAgJXMgICAgWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDQxCi1tc2dpZCAiaGFzIGNoaWxkcmVuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDQxCi1tc2dpZCAibm8gY2hpbGRyZW4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICUtMThzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICVsdSBieXRlIGJsb2NrOiAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ2MzMKLW1zZ2lkICIoVXNlciBkZWZpbmVkIGxvY2F0aW9uIG9wKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDYzNQotbXNnaWQgIihVbmtub3duIGxvY2F0aW9uIG9wKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gaGFuZGxlIEZPUk06ICVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBmb3JtOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc2OQotbXNnaWQgIihub3QgaW5saW5lZCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3NzAKLW1zZ2lkICIoaW5saW5lZCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3NzEKLW1zZ2lkICIoZGVjbGFyZWQgYXMgaW5saW5lIGJ1dCBpZ25vcmVkKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc3MgotbXNnaWQgIihkZWNsYXJlZCBhcyBpbmxpbmUgYW5kIGlubGluZWQpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NzczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgKFVua25vd24gaW5saW5lIGF0dHJpYnV0ZSB2YWx1ZTogJWx4KSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDkwMyByZWFkZWxmLmM6NTAyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVGhlIHNlY3Rpb24gJXMgY29udGFpbnM6XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5MjUKLW1zZ2lkICJPbmx5IHZlcnNpb24gMiBEV0FSRiBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTI5Ci1tc2dpZCAiICBDb21waWxhdGlvbiBVbml0OlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgIExlbmd0aDogICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgIFZlcnNpb246ICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgQWJicmV2IE9mZnNldDogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgUG9pbnRlciBTaXplOiAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDk1MwotbXNnaWQgIlVuYWJsZSB0byBsb2NhdGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uIVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYWJsZSB0byBsb2NhdGUgZW50cnkgJWQgaW4gdGhlIGFiYnJldmlhdGlvbiB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiA8JWQ+PCV4PjogQWJicmV2IE51bWJlcjogJWQgKCVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTA0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTA0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9mZnNldCBpbnRvIC5kZWJ1Z19pbmZvOiAgJWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBQb2ludGVyIFNpemU6ICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTZWdtZW50IFNpemU6ICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwNTEKLW1zZ2lkICIiCi0iXG4iCi0iICAgIEFkZHJlc3MgIExlbmd0aFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MDg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkRpc3BsYXlpbmcgdGhlIGRlYnVnIGNvbnRlbnRzIG9mIHNlY3Rpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUxMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gJyVzJyBoYXMgbm8gZGVidWdnaW5nIGRhdGEuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUxNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pc2VkIGRlYnVnIHNlY3Rpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUxODMKLW1zZ2lkICJTb21lIHNlY3Rpb25zIHdlcmUgbm90IGR1bXBlZCBiZWNhdXNlIHRoZXkgZG8gbm90IGV4aXN0IVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MzU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTUxOQotbXNnaWQgImNvbmZsaWN0IGxpc3Qgd2l0aCB3aXRob3V0IHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1NTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uICcuY29uZmxpY3QnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU1NDgKLW1zZ2lkICIgIE51bTogICAgSW5kZXggICAgICAgVmFsdWUgIE5hbWUiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU2MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IHN0YXQgaW5wdXQgZmlsZSAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTYzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnB1dCBmaWxlICVzIG5vdCBmb3VuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTYzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRmFpbGVkIHRvIHJlYWQgZmlsZSBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTY1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRmlsZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZW5hbWUuYzoxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBzZXQgdGltZTogJXMiCi1tc2dzdHIgIiIKLQotIy4gV2UgaGF2ZSB0byBjbGVhbiB1cCBoZXJlLgotIzogcmVuYW1lLmM6MTYwIHJlbmFtZS5jOjE5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVuYW1lOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZW5hbWUuYzoyMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNpbXBsZV9jb3B5OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vdCBlbm91Z2ggYmluYXJ5IGRhdGEiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTQ5Ci1tc2dpZCAibnVsbCB0ZXJtaW5hdGVkIHVuaWNvZGUgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjE3OSByZXNiaW4uYzoxODUKLW1zZ2lkICJyZXNvdXJjZSBJRCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoyMjkKLW1zZ2lkICJjdXJzb3IiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MjYzIHJlc2Jpbi5jOjI3MAotbXNnaWQgIm1lbnUgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjI4MAotbXNnaWQgIm1lbnVleCBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6Mjg0Ci1tc2dpZCAibWVudWV4IG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgbWVudSB2ZXJzaW9uICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjMxOSByZXNiaW4uYzozMzQgcmVzYmluLmM6NDAwCi1tc2dpZCAibWVudWl0ZW0gaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjQzMAotbXNnaWQgIm1lbnVpdGVtIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjQ3MSByZXNiaW4uYzo0OTkKLW1zZ2lkICJkaWFsb2cgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjQ4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGRpYWxvZyBzaWduYXR1cmUgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NTMxCi1tc2dpZCAiZGlhbG9nIGZvbnQgcG9pbnQgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo1MzkKLW1zZ2lkICJkaWFsb2dleCBmb250IGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjU2NCByZXNiaW4uYzo1ODIKLW1zZ2lkICJkaWFsb2cgY29udHJvbCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo1NzQKLW1zZ2lkICJkaWFsb2dleCBjb250cm9sIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjYwMwotbXNnaWQgImRpYWxvZyBjb250cm9sIGVuZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo2MTUKLW1zZ2lkICJkaWFsb2cgY29udHJvbCBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjY1OAotbXNnaWQgInN0cmluZ3RhYmxlIHN0cmluZyBsZW5ndGgiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NjY4Ci1tc2dpZCAic3RyaW5ndGFibGUgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjcwMQotbXNnaWQgImZvbnRkaXIgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjcxNAotbXNnaWQgImZvbnRkaXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NzMwCi1tc2dpZCAiZm9udGRpciBkZXZpY2UgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo3MzYKLW1zZ2lkICJmb250ZGlyIGZhY2UgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo3NzkKLW1zZ2lkICJhY2NlbGVyYXRvciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo4NDMKLW1zZ2lkICJncm91cCBjdXJzb3IgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjg0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGdyb3VwIGN1cnNvciB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjg2MgotbXNnaWQgImdyb3VwIGN1cnNvciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo5MDEKLW1zZ2lkICJncm91cCBpY29uIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo5MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBncm91cCBpY29uIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6OTIwCi1tc2dpZCAiZ3JvdXAgaWNvbiIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo5OTEgcmVzYmluLmM6MTIxMAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTAyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJ2ZXJzaW9uIGxlbmd0aCAlZCBkb2VzIG5vdCBtYXRjaCByZXNvdXJjZSBsZW5ndGggJWx1IgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTA0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gaW5mb3JtYXRpb24gbGVuZ3RoICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwNDQKLW1zZ2lkICJmaXhlZCB2ZXJzaW9uIGluZm8iCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTA0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gc2lnbmF0dXJlICVsdSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgZml4ZWQgdmVyc2lvbiBpbmZvIHZlcnNpb24gJWx1IgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwODEKLW1zZ2lkICJ2ZXJzaW9uIHZhciBpbmZvIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBzdHJpbmdmaWxlaW5mbyB2YWx1ZSBsZW5ndGggJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTEwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5ndGFibGUgdmFsdWUgbGVuZ3RoICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjExNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyBsZW5ndGggJWQgIT0gJWQgKyAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMTUzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmcgbGVuZ3RoICVkIDwgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTE3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHZhcmZpbGVpbmZvIHZhbHVlIGxlbmd0aCAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMTg5Ci1tc2dpZCAidmVyc2lvbiB2YXJmaWxlaW5mbyIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiB2YWx1ZSBsZW5ndGggJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjEyOAotbXNnaWQgImZpbGVuYW1lIHJlcXVpcmVkIGZvciBDT0ZGIGlucHV0IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoxNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBubyByZXNvdXJjZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjE1NAotbXNnaWQgImNhbid0IHJlYWQgcmVzb3VyY2Ugc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MTgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogYWRkcmVzcyBvdXQgb2YgYm91bmRzIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoxOTkKLW1zZ2lkICJkaXJlY3RvcnkiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjIyNwotbXNnaWQgIm5hbWVkIGRpcmVjdG9yeSBlbnRyeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MjM2Ci1tc2dpZCAiZGlyZWN0b3J5IGVudHJ5IG5hbWUiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjI1NgotbXNnaWQgIm5hbWVkIHN1YmRpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MjY0Ci1tc2dpZCAibmFtZWQgcmVzb3VyY2UiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjI3OQotbXNnaWQgIklEIGRpcmVjdG9yeSBlbnRyeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6Mjk2Ci1tc2dpZCAiSUQgc3ViZGlyZWN0b3J5IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozMDQKLW1zZ2lkICJJRCByZXNvdXJjZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MzMwCi1tc2dpZCAicmVzb3VyY2UgdHlwZSB1bmtub3duIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozMzMKLW1zZ2lkICJkYXRhIGVudHJ5IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozNDEKLW1zZ2lkICJyZXNvdXJjZSBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozNDYKLW1zZ2lkICJyZXNvdXJjZSBkYXRhIHNpemUiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjQ0MQotbXNnaWQgImZpbGVuYW1lIHJlcXVpcmVkIGZvciBDT0ZGIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6NzM0Ci1tc2dpZCAiY2FuJ3QgZ2V0IEJGRF9SRUxPQ19SVkEgcmVsb2NhdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IHBvcGVuIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MjY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBwcmVwcm9jZXNzb3IgZmFpbGVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzozMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuZXhwZWN0ZWQgRU9GIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MzY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiByZWFkIG9mICVsdSByZXR1cm5lZCAlbHUiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzo0MTAgcmVzcmMuYzo2NDEgcmVzcmMuYzo5MTQgcmVzcmMuYzoxMDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6NDYzCi0jLCBjLWZvcm1hdAotbXNnaWQgImN1cnNvciBmaWxlIGAlcycgZG9lcyBub3QgY29udGFpbiBjdXJzb3IgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjQ5NSByZXNyYy5jOjc4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZnNlZWsgdG8gJWx1IGZhaWxlZDogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzo3NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWNvbiBmaWxlIGAlcycgZG9lcyBub3QgY29udGFpbiBpY29uIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzoxMjczCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IG9wZW4gYCVzJyBmb3Igb3V0cHV0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzaXplLmM6NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLUFCZG94Vl0gWy0tZm9ybWF0PWJlcmtlbGV5fHN5c3ZdIFstLXJhZGl4PTh8MTB8MTZdXG4iCi0iICAgICAgIFstLXRhcmdldD1iZmRuYW1lXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSBbZmlsZS4uLl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzaXplLmM6ODMKLW1zZ2lkICJkZWZhdWx0IGlzIC0tZm9ybWF0PWJlcmtlbGV5XG4iCi1tc2dzdHIgIiIKLQotIzogc2l6ZS5jOjg1Ci1tc2dpZCAiZGVmYXVsdCBpcyAtLWZvcm1hdD1zeXN2XG4iCi1tc2dzdHIgIiIKLQotIzogc2l6ZS5jOjEzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyZ3VtZW50IHRvIC0tZm9ybWF0OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNpemUuYzoxNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCByYWRpeDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmNvbnYuYzoxODc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlOiAlcyBbLWRoVnFdIGluLWZpbGUgW291dC1maWxlXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyY29udi5jOjE4ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENvbnZlcnQgYSBDT0ZGIG9iamVjdCBmaWxlIGludG8gYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3Jjb252LmM6MjAyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5hYmxlIHRvIG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM0OSBzdGFicy5jOjE3NjIKLW1zZ2lkICJudW1lcmljIG92ZXJmbG93IgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkJhZCBzdGFiOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6ICVzOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6NDkyCi1tc2dpZCAiTl9MQlJBQyBub3Qgd2l0aGluIGZ1bmN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzo1MzEKLW1zZ2lkICJUb28gbWFueSBOX1JCUkFDc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6NzgwCi1tc2dpZCAidW5rbm93biBDKysgZW5jb2RlZCBuYW1lIgotbXNnc3RyICIiCi0KLSMuIENvbXBsYWluIGFuZCBrZWVwIGdvaW5nLCBzbyBjb21waWxlcnMgY2FuIGludmVudCBuZXcKLSMuIGNyb3NzLXJlZmVyZW5jZSB0eXBlcy4KLSM6IHN0YWJzLmM6MTMwNgotbXNnaWQgInVucmVjb2duaXplZCBjcm9zcyByZWZlcmVuY2UgdHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBEb2VzIHRoaXMgYWN0dWFsbHkgZXZlciBoYXBwZW4/ICBJcyB0aGF0IHdoeSB3ZSBhcmUgd29ycnlpbmcKLSMuIGFib3V0IGRlYWxpbmcgd2l0aCBpdCByYXRoZXIgdGhhbiBqdXN0IGNhbGxpbmcgZXJyb3JfdHlwZT8KLSM6IHN0YWJzLmM6MTg1NAotbXNnaWQgIm1pc3NpbmcgaW5kZXggdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjIxODEKLW1zZ2lkICJ1bmtub3duIHZpcnR1YWwgY2hhcmFjdGVyIGZvciBiYXNlY2xhc3MiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyMTk5Ci1tc2dpZCAidW5rbm93biB2aXNpYmlsaXR5IGNoYXJhY3RlciBmb3IgYmFzZWNsYXNzIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MjM5MQotbXNnaWQgInVubmFtZWQgJHZiIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyMzk3Ci1tc2dpZCAidW5yZWNvZ25pemVkIEMrKyBhYmJyZXZpYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyNDc3Ci1tc2dpZCAidW5rbm93biB2aXNpYmlsaXR5IGNoYXJhY3RlciBmb3IgZmllbGQiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyNzMzCi1tc2dpZCAiY29uc3Qvdm9sYXRpbGUgaW5kaWNhdG9yIG1pc3NpbmciCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyOTczCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIG1hbmdsaW5nIGZvciBcIiVzXCJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjMyODYKLW1zZ2lkICJVbmRlZmluZWQgTl9FWENMIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzM3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJUeXBlIGZpbGUgbnVtYmVyICVkIG91dCBvZiByYW5nZVxuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzM3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJUeXBlIGluZGV4IG51bWJlciAlZCBvdXQgb2YgcmFuZ2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM0NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIFhDT0ZGIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM3NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIG1hbmdsZWQgbmFtZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozODYxCi1tc2dpZCAibm8gYXJndW1lbnQgdHlwZXMgaW4gbWFuZ2xlZCBzdHJpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdHJpbmdzLmM6MTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnZhbGlkIG51bWJlciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0cmluZ3MuYzo0OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGludmFsaWQgaW50ZWdlciBhcmd1bWVudCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0cmluZ3MuYzo1MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLWFmb3ZdIFstbiBtaW4tbGVuXSBbLW1pbi1sZW5dIFstdCB7byx4LGR9XSBbLV1cbiIKLSIgICAgICAgWy0tYWxsXSBbLS1wcmludC1maWxlLW5hbWVdIFstLWJ5dGVzPW1pbi1sZW5dIFstLXJhZGl4PXtvLHgsZH1dXG4iCi0iICAgICAgIFstLXRhcmdldD1iZmRuYW1lXSBbLS1oZWxwXSBbLS12ZXJzaW9uXSBmaWxlLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogc3lzZHVtcC5jOjcxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgWy1oVl0gaW4tZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHN5c2R1bXAuYzo3ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiB2ZXJzaW9uLmM6MzkKLW1zZ2lkICJDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiB2ZXJzaW9uLmM6NDAKLW1zZ2lkICIiCi0iVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuIgotInRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6MjMzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IG9wZW4gJXMgYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjQxMgotbXNnaWQgIjogZXhwZWN0ZWQgdG8gYmUgYSBkaXJlY3RvcnlcbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NDI0Ci1tc2dpZCAiOiBleHBlY3RlZCB0byBiZSBhIGxlYWZcbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiAiCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjQzNQotbXNnaWQgIjogZHVwbGljYXRlIHZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjU5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5rbm93biBmb3JtYXQgdHlwZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjU5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3VwcG9ydGVkIGZvcm1hdHM6IgotbXNnc3RyICIiCi0KLSMuIE90aGVyd2lzZSwgd2UgZ2l2ZSB1cC4KLSM6IHdpbmRyZXMuYzo2ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuIG5vdCBkZXRlcm1pbmUgdHlwZSBvZiBmaWxlIGAlcyc7IHVzZSB0aGUgLUkgb3B0aW9uIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo3MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2U6ICVzIFtvcHRpb25zXSBbaW5wdXQtZmlsZV0gW291dHB1dC1maWxlXVxuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo3MDIKLW1zZ2lkICIiCi0iT3B0aW9uczpcbiIKLSIgIC1pIEZJTEUsIC0taW5wdXQgRklMRSAgICAgICBOYW1lIGlucHV0IGZpbGVcbiIKLSIgIC1vIEZJTEUsIC0tb3V0cHV0IEZJTEUgICAgICBOYW1lIG91dHB1dCBmaWxlXG4iCi0iICAtSSBGT1JNQVQsIC0taW5wdXQtZm9ybWF0IEZPUk1BVFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgaW5wdXQgZm9ybWF0XG4iCi0iICAtTyBGT1JNQVQsIC0tb3V0cHV0LWZvcm1hdCBGT1JNQVRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IG91dHB1dCBmb3JtYXRcbiIKLSIgIC1GIFRBUkdFVCwgLS10YXJnZXQgVEFSR0VUICBTcGVjaWZ5IENPRkYgdGFyZ2V0XG4iCi0iICAtLXByZXByb2Nlc3NvciBQUk9HUkFNICAgICAgUHJvZ3JhbSB0byB1c2UgdG8gcHJlcHJvY2VzcyByYyBmaWxlXG4iCi0iICAtLWluY2x1ZGUtZGlyIERJUiAgICAgICAgICAgSW5jbHVkZSBkaXJlY3Rvcnkgd2hlbiBwcmVwcm9jZXNzaW5nIHJjIGZpbGVcbiIKLSIgIC1EU1lNWz1WQUxdLCAtLWRlZmluZSBTWU1bPVZBTF1cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgU1lNIHdoZW4gcHJlcHJvY2Vzc2luZyByYyBmaWxlXG4iCi0iICAtdiAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyYm9zZSAtIHRlbGxzIHlvdSB3aGF0IGl0J3MgZG9pbmdcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NzE4Ci1tc2dpZCAiICAtLXl5ZGVidWcgICAgICAgICAgICAgICAgICAgVHVybiBvbiBwYXJzZXIgZGVidWdnaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjcyMQotbXNnaWQgIiIKLSIgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICBQcmludCB0aGlzIGhlbHAgbWVzc2FnZVxuIgotIiAgLS12ZXJzaW9uICAgICAgICAgICAgICAgICAgIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NzI0Ci1tc2dpZCAiIgotIkZPUk1BVCBpcyBvbmUgb2YgcmMsIHJlcywgb3IgY29mZiwgYW5kIGlzIGRlZHVjZWQgZnJvbSB0aGUgZmlsZSBuYW1lXG4iCi0iZXh0ZW5zaW9uIGlmIG5vdCBzcGVjaWZpZWQuICBBIHNpbmdsZSBmaWxlIG5hbWUgaXMgYW4gaW5wdXQgZmlsZS5cbiIKLSJObyBpbnB1dC1maWxlIGlzIHN0ZGluLCBkZWZhdWx0IHJjLiAgTm8gb3V0cHV0LWZpbGUgaXMgc3Rkb3V0LCBkZWZhdWx0IHJjLlxuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo5NjMKLW1zZ2lkICJubyByZXNvdXJjZXMiCi1tc2dzdHIgIiIKLQotIzogd3JzdGFicy5jOjM2NiB3cnN0YWJzLmM6MjAyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzdHJpbmdfaGFzaF9sb29rdXAgZmFpbGVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHdyc3RhYnMuYzo2NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RhYl9pbnRfdHlwZTogYmFkIHNpemUgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiB3cnN0YWJzLmM6MTQ2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogdW5rbm93biBzaXplIGZvciBmaWVsZCBgJXMnIGluIHN0cnVjdFxuIgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9iaW51dGlscy9wcmRiZy5jIGIvYmludXRpbHMvcHJkYmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNjg0ZC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9wcmRiZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2MiArMCwwIEBACi0vKiBwcmRiZy5jIC0tIFByaW50IG91dCBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgcHJpbnRzIG91dCB0aGUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGJ5Ci0gICBzdXBwbHlpbmcgYSBzZXQgb2Ygcm91dGluZXMgdG8gZGVidWdfd3JpdGUuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHdlIHVzZSBhcyBhIGhhbmRsZSBmb3IgdGhlc2Ugcm91dGluZXMuICAqLwotCi1zdHJ1Y3QgcHJfaGFuZGxlCi17Ci0gIC8qIEZpbGUgdG8gcHJpbnQgaW5mb3JtYXRpb24gdG8uICAqLwotICBGSUxFICpmOwotICAvKiBDdXJyZW50IGluZGVudGF0aW9uIGxldmVsLiAgKi8KLSAgdW5zaWduZWQgaW50IGluZGVudDsKLSAgLyogVHlwZSBzdGFjay4gICovCi0gIHN0cnVjdCBwcl9zdGFjayAqc3RhY2s7Ci0gIC8qIFBhcmFtZXRlciBudW1iZXIgd2UgYXJlIGFib3V0IHRvIG91dHB1dC4gICovCi0gIGludCBwYXJhbWV0ZXI7Ci19OwotCi0vKiBUaGUgdHlwZSBzdGFjay4gICovCi0KLXN0cnVjdCBwcl9zdGFjawotewotICAvKiBOZXh0IGVsZW1lbnQgb24gdGhlIHN0YWNrLiAgKi8KLSAgc3RydWN0IHByX3N0YWNrICpuZXh0OwotICAvKiBUaGlzIGVsZW1lbnQuICAqLwotICBjaGFyICp0eXBlOwotICAvKiBDdXJyZW50IHZpc2liaWxpdHkgb2YgZmllbGRzIGlmIHRoaXMgaXMgYSBjbGFzcy4gICovCi0gIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAvKiBOYW1lIG9mIHRoZSBjdXJyZW50IG1ldGhvZCB3ZSBhcmUgaGFuZGxpbmcuICAqLwotICBjb25zdCBjaGFyICptZXRob2Q7Ci19OwotCi1zdGF0aWMgdm9pZCBpbmRlbnQgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwdXNoX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByZXBlbmRfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgcHJfaGFuZGxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gYXBwZW5kX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN1YnN0aXR1dGVfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgcHJfaGFuZGxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaW5kZW50X3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqKSk7Ci1zdGF0aWMgY2hhciAqcG9wX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF92bWEgUEFSQU1TICgoYmZkX3ZtYSwgY2hhciAqLCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9maXhfdmlzaWJpbGl0eQotICBQQVJBTVMgKChzdHJ1Y3QgcHJfaGFuZGxlICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9jb21waWxhdGlvbl91bml0IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9zb3VyY2UgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX2VtcHR5X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl92b2lkX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9pbnRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfZmxvYXRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gcHJfY29tcGxleF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9ib29sX3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHByX2VudW1fdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYmZkX3NpZ25lZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gcHJfcG9pbnRlcl90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfZnVuY3Rpb25fdHlwZSBQQVJBTVMgKChQVFIsIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfcmVmZXJlbmNlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9yYW5nZV90eXBlIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9hcnJheV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX29mZnNldF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfbWV0aG9kX3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX2NvbnN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl92b2xhdGlsZV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfc3RydWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdHJ1Y3RfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEsIGJmZF92bWEsIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gcHJfZW5kX3N0cnVjdF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfY2xhc3NfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfY2xhc3Nfc3RhdGljX21lbWJlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIHByX2NsYXNzX2Jhc2VjbGFzcwotICBQQVJBTVMgKChQVFIsIGJmZF92bWEsIGJvb2xlYW4sIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gcHJfY2xhc3Nfc3RhcnRfbWV0aG9kIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuLAotCSAgIGJmZF92bWEsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19lbmRfbWV0aG9kIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfZW5kX2NsYXNzX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90eXBlZGVmX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX3RhZ190eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90eXBkZWYgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX3RhZyBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gcHJfaW50X2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9mbG9hdF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90eXBlZF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcHJfdmFyaWFibGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmFyX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX3N0YXJ0X2Z1bmN0aW9uIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9mdW5jdGlvbl9wYXJhbWV0ZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfcGFybV9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX2VuZF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX2VuZF9mdW5jdGlvbiBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX2xpbmVubyBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSkpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyBwcl9mbnMgPQotewotICBwcl9zdGFydF9jb21waWxhdGlvbl91bml0LAotICBwcl9zdGFydF9zb3VyY2UsCi0gIHByX2VtcHR5X3R5cGUsCi0gIHByX3ZvaWRfdHlwZSwKLSAgcHJfaW50X3R5cGUsCi0gIHByX2Zsb2F0X3R5cGUsCi0gIHByX2NvbXBsZXhfdHlwZSwKLSAgcHJfYm9vbF90eXBlLAotICBwcl9lbnVtX3R5cGUsCi0gIHByX3BvaW50ZXJfdHlwZSwKLSAgcHJfZnVuY3Rpb25fdHlwZSwKLSAgcHJfcmVmZXJlbmNlX3R5cGUsCi0gIHByX3JhbmdlX3R5cGUsCi0gIHByX2FycmF5X3R5cGUsCi0gIHByX3NldF90eXBlLAotICBwcl9vZmZzZXRfdHlwZSwKLSAgcHJfbWV0aG9kX3R5cGUsCi0gIHByX2NvbnN0X3R5cGUsCi0gIHByX3ZvbGF0aWxlX3R5cGUsCi0gIHByX3N0YXJ0X3N0cnVjdF90eXBlLAotICBwcl9zdHJ1Y3RfZmllbGQsCi0gIHByX2VuZF9zdHJ1Y3RfdHlwZSwKLSAgcHJfc3RhcnRfY2xhc3NfdHlwZSwKLSAgcHJfY2xhc3Nfc3RhdGljX21lbWJlciwKLSAgcHJfY2xhc3NfYmFzZWNsYXNzLAotICBwcl9jbGFzc19zdGFydF9tZXRob2QsCi0gIHByX2NsYXNzX21ldGhvZF92YXJpYW50LAotICBwcl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQsCi0gIHByX2NsYXNzX2VuZF9tZXRob2QsCi0gIHByX2VuZF9jbGFzc190eXBlLAotICBwcl90eXBlZGVmX3R5cGUsCi0gIHByX3RhZ190eXBlLAotICBwcl90eXBkZWYsCi0gIHByX3RhZywKLSAgcHJfaW50X2NvbnN0YW50LAotICBwcl9mbG9hdF9jb25zdGFudCwKLSAgcHJfdHlwZWRfY29uc3RhbnQsCi0gIHByX3ZhcmlhYmxlLAotICBwcl9zdGFydF9mdW5jdGlvbiwKLSAgcHJfZnVuY3Rpb25fcGFyYW1ldGVyLAotICBwcl9zdGFydF9ibG9jaywKLSAgcHJfZW5kX2Jsb2NrLAotICBwcl9lbmRfZnVuY3Rpb24sCi0gIHByX2xpbmVubwotfTsKLQwKLS8qIFByaW50IG91dCB0aGUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gcmVjb3JkZWQgaW4gZGhhbmRsZS4gICovCi0KLWJvb2xlYW4KLXByaW50X2RlYnVnZ2luZ19pbmZvIChmLCBkaGFuZGxlKQotICAgICBGSUxFICpmOwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSBpbmZvOwotCi0gIGluZm8uZiA9IGY7Ci0gIGluZm8uaW5kZW50ID0gMDsKLSAgaW5mby5zdGFjayA9IE5VTEw7Ci0gIGluZm8ucGFyYW1ldGVyID0gMDsKLQotICByZXR1cm4gZGVidWdfd3JpdGUgKGRoYW5kbGUsICZwcl9mbnMsIChQVFIpICZpbmZvKTsKLX0KLQwKLS8qIEluZGVudCB0byB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1pbmRlbnQgKGluZm8pCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5pbmRlbnQ7IGkrKykKLSAgICBwdXRjICgnICcsIGluZm8tPmYpOwotfQotCi0vKiBQdXNoIGEgdHlwZSBvbiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wdXNoX3R5cGUgKGluZm8sIHR5cGUpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnR5cGU7Ci17Ci0gIHN0cnVjdCBwcl9zdGFjayAqbjsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gKHN0cnVjdCBwcl9zdGFjayAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBtZW1zZXQgKG4sIDAsIHNpemVvZiAqbik7Ci0KLSAgbi0+dHlwZSA9IHhzdHJkdXAgKHR5cGUpOwotICBuLT52aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9JR05PUkU7Ci0gIG4tPm1ldGhvZCA9IE5VTEw7Ci0gIG4tPm5leHQgPSBpbmZvLT5zdGFjazsKLSAgaW5mby0+c3RhY2sgPSBuOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQcmVwZW5kIGEgc3RyaW5nIG9udG8gdGhlIHR5cGUgb24gdGhlIHRvcCBvZiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcmVwZW5kX3R5cGUgKGluZm8sIHMpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGNoYXIgKm47Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIHN0cmxlbiAoaW5mby0+c3RhY2stPnR5cGUpICsgMSk7Ci0gIHNwcmludGYgKG4sICIlcyVzIiwgcywgaW5mby0+c3RhY2stPnR5cGUpOwotICBmcmVlIChpbmZvLT5zdGFjay0+dHlwZSk7Ci0gIGluZm8tPnN0YWNrLT50eXBlID0gbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSB0eXBlIG9uIHRoZSB0b3Agb2YgdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYXBwZW5kX3R5cGUgKGluZm8sIHMpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgaWYgKHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBsZW4gPSBzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKTsKLSAgaW5mby0+c3RhY2stPnR5cGUgPSAoY2hhciAqKSB4cmVhbGxvYyAoaW5mby0+c3RhY2stPnR5cGUsCi0JCQkJCSBsZW4gKyBzdHJsZW4gKHMpICsgMSk7Ci0gIHN0cmNweSAoaW5mby0+c3RhY2stPnR5cGUgKyBsZW4sIHMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB1c2UgYW4gdW5kZXJzY29yZSB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgbmFtZSBzaG91bGQgZ28gaW4gYSB0eXBlCi0gICBzdHJpbmcuICBUaGlzIGZ1bmN0aW9uIHN1YnN0aXR1dGVzIGEgc3RyaW5nIGZvciB0aGUgdW5kZXJzY29yZS4gIElmCi0gICB0aGVyZSBpcyBubyB1bmRlcnNjb3JlLCB0aGUgbmFtZSBmb2xsb3dzIHRoZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1YnN0aXR1dGVfdHlwZSAoaW5mbywgcykKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgY2hhciAqdTsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIHUgPSBzdHJjaHIgKGluZm8tPnN0YWNrLT50eXBlLCAnfCcpOwotICBpZiAodSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKm47Ci0KLSAgICAgIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKSArIHN0cmxlbiAocykpOwotCi0gICAgICBtZW1jcHkgKG4sIGluZm8tPnN0YWNrLT50eXBlLCB1IC0gaW5mby0+c3RhY2stPnR5cGUpOwotICAgICAgc3RyY3B5IChuICsgKHUgLSBpbmZvLT5zdGFjay0+dHlwZSksIHMpOwotICAgICAgc3RyY2F0IChuLCB1ICsgMSk7Ci0KLSAgICAgIGZyZWUgKGluZm8tPnN0YWNrLT50eXBlKTsKLSAgICAgIGluZm8tPnN0YWNrLT50eXBlID0gbjsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChzdHJjaHIgKHMsICd8JykgIT0gTlVMTAotICAgICAgJiYgKHN0cmNociAoaW5mby0+c3RhY2stPnR5cGUsICd7JykgIT0gTlVMTAotCSAgfHwgc3RyY2hyIChpbmZvLT5zdGFjay0+dHlwZSwgJygnKSAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sICIoIikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIpIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoKnMgPT0gJ1wwJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gKGFwcGVuZF90eXBlIChpbmZvLCAiICIpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgcykpOwotfQotCi0vKiBJbmRlbnQgdGhlIHR5cGUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgYnkgYXBwZW5kaW5nIHNwYWNlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pbmRlbnRfdHlwZSAoaW5mbykKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGluZm8tPmluZGVudDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiICIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBvcCBhIHR5cGUgZnJvbSB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBjaGFyICoKLXBvcF90eXBlIChpbmZvKQotICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3QgcHJfc3RhY2sgKm87Ci0gIGNoYXIgKnJldDsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIG8gPSBpbmZvLT5zdGFjazsKLSAgaW5mby0+c3RhY2sgPSBvLT5uZXh0OwotICByZXQgPSBvLT50eXBlOwotICBmcmVlIChvKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBQcmludCBhIFZNQSB2YWx1ZSBpbnRvIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3ZtYSAodm1hLCBidWYsIHVuc2lnbmVkcCwgaGV4cCkKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci0gICAgIGJvb2xlYW4gaGV4cDsKLXsKLSAgaWYgKHNpemVvZiAodm1hKSA8PSBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKQotICAgIHsKLSAgICAgIGlmIChoZXhwKQotCXNwcmludGYgKGJ1ZiwgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpIHZtYSk7Ci0gICAgICBlbHNlIGlmICh1bnNpZ25lZHApCi0Jc3ByaW50ZiAoYnVmLCAiJWx1IiwgKHVuc2lnbmVkIGxvbmcpIHZtYSk7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmLCAiJWxkIiwgKGxvbmcpIHZtYSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYnVmWzBdID0gJzAnOwotICAgICAgYnVmWzFdID0gJ3gnOwotICAgICAgc3ByaW50Zl92bWEgKGJ1ZiArIDIsIHZtYSk7Ci0gICAgfQotfQotDAotLyogU3RhcnQgYSBuZXcgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9jb21waWxhdGlvbl91bml0IChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPmluZGVudCA9PSAwKTsKLQotICBmcHJpbnRmIChpbmZvLT5mLCAiJXM6XG4iLCBmaWxlbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgc291cmNlIGZpbGUgd2l0aGluIGEgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9zb3VyY2UgKHAsIGZpbGVuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+aW5kZW50ID09IDApOwotCi0gIGZwcmludGYgKGluZm8tPmYsICIgJXM6XG4iLCBmaWxlbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYW4gZW1wdHkgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VtcHR5X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCAiPHVuZGVmaW5lZD4iKTsKLX0KLQotLyogUHVzaCBhIHZvaWQgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3ZvaWRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sICJ2b2lkIik7Ci19Ci0KLS8qIFB1c2ggYW4gaW50ZWdlciB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfaW50X3R5cGUgKHAsIHNpemUsIHVuc2lnbmVkcCkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHVuc2lnbmVkcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMTBdOwotCi0gIHNwcmludGYgKGFiLCAiJXNpbnQlZCIsIHVuc2lnbmVkcCA/ICJ1IiA6ICIiLCBzaXplICogOCk7Ci0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sIGFiKTsKLX0KLQotLyogUHVzaCBhIGZsb2F0aW5nIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9mbG9hdF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyIGFiWzEwXTsKLQotICBpZiAoc2l6ZSA9PSA0KQotICAgIHJldHVybiBwdXNoX3R5cGUgKGluZm8sICJmbG9hdCIpOwotICBlbHNlIGlmIChzaXplID09IDgpCi0gICAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgImRvdWJsZSIpOwotCi0gIHNwcmludGYgKGFiLCAiZmxvYXQlZCIsIHNpemUgKiA4KTsKLSAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgYWIpOwotfQotCi0vKiBQdXNoIGEgY29tcGxleCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY29tcGxleF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGlmICghIHByX2Zsb2F0X3R5cGUgKHAsIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gcHJlcGVuZF90eXBlIChpbmZvLCAiY29tcGxleCAiKTsKLX0KLQotLyogUHVzaCBhIGJvb2xlYW4gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2Jvb2xfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsxMF07Ci0KLSAgc3ByaW50ZiAoYWIsICJib29sJWQiLCBzaXplICogOCk7Ci0KLSAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgYWIpOwotfQotCi0vKiBQdXNoIGFuIGVudW0gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VudW1fdHlwZSAocCwgdGFnLCBuYW1lcywgdmFsdWVzKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gICAgIGJmZF9zaWduZWRfdm1hICp2YWx1ZXM7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX3NpZ25lZF92bWEgdmFsOwotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgImVudW0gIikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAodGFnICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHRhZykKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJ7ICIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIi8qIHVuZGVmaW5lZCAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSAwOwotICAgICAgZm9yIChpID0gMDsgbmFtZXNbaV0gIT0gTlVMTDsgaSsrKQotCXsKLQkgIGlmIChpID4gMCkKLQkgICAgewotCSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiLCAiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBuYW1lc1tpXSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKHZhbHVlc1tpXSAhPSB2YWwpCi0JICAgIHsKLQkgICAgICBjaGFyIGFiWzIwXTsKLQotCSAgICAgIHByaW50X3ZtYSAodmFsdWVzW2ldLCBhYiwgZmFsc2UsIGZhbHNlKTsKLQkgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiA9ICIpCi0JCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgdmFsID0gdmFsdWVzW2ldOwotCSAgICB9Ci0KLQkgICsrdmFsOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGFwcGVuZF90eXBlIChpbmZvLCAiIH0iKTsKLX0KLQotLyogVHVybiB0aGUgdG9wIHR5cGUgb24gdGhlIHN0YWNrIGludG8gYSBwb2ludGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3BvaW50ZXJfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICpzOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgcyA9IHN0cmNociAoaW5mby0+c3RhY2stPnR5cGUsICd8Jyk7Ci0gIGlmIChzICE9IE5VTEwgJiYgc1sxXSA9PSAnWycpCi0gICAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIigqfCkiKTsKLSAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIip8Iik7Ci19Ci0KLS8qIFR1cm4gdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjayBpbnRvIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoYXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9mdW5jdGlvbl90eXBlIChwLCBhcmdjb3VudCwgdmFyYXJncykKLSAgICAgUFRSIHA7Ci0gICAgIGludCBhcmdjb3VudDsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqKmFyZ190eXBlczsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY2hhciAqczsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIGxlbiA9IDEwOwotCi0gIGlmIChhcmdjb3VudCA8PSAwKQotICAgIHsKLSAgICAgIGFyZ190eXBlcyA9IE5VTEw7Ci0gICAgICBsZW4gKz0gMTU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGFyZ190eXBlcyA9IChjaGFyICoqKSB4bWFsbG9jIChhcmdjb3VudCAqIHNpemVvZiAqYXJnX3R5cGVzKTsKLSAgICAgIGZvciAoaSA9IGFyZ2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGFyZ190eXBlc1tpXSA9IHBvcF90eXBlIChpbmZvKTsKLQkgIGlmIChhcmdfdHlwZXNbaV0gPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbGVuICs9IHN0cmxlbiAoYXJnX3R5cGVzW2ldKSArIDI7Ci0JfQotICAgICAgaWYgKHZhcmFyZ3MpCi0JbGVuICs9IDU7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGUgcmV0dXJuIHR5cGUgaXMgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAqLwotCi0gIHMgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICBzdHJjcHkgKHMsICIofCkgKCIpOwotCi0gIGlmIChhcmdjb3VudCA8IDApCi0gICAgc3RyY2F0IChzLCAiLyogdW5rbm93biAqLyIpOwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotCXsKLQkgIGlmIChpID4gMCkKLQkgICAgc3RyY2F0IChzLCAiLCAiKTsKLQkgIHN0cmNhdCAocywgYXJnX3R5cGVzW2ldKTsKLQl9Ci0gICAgICBpZiAodmFyYXJncykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHN0cmNhdCAocywgIiwgIik7Ci0JICBzdHJjYXQgKHMsICIuLi4iKTsKLQl9Ci0gICAgICBpZiAoYXJnY291bnQgPiAwKQotCWZyZWUgKGFyZ190eXBlcyk7Ci0gICAgfQotCi0gIHN0cmNhdCAocywgIikiKTsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIHMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVHVybiB0aGUgdG9wIHR5cGUgb24gdGhlIHN0YWNrIGludG8gYSByZWZlcmVuY2UgdG8gdGhhdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3JlZmVyZW5jZV90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICByZXR1cm4gc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiJnwiKTsKLX0KLQotLyogTWFrZSBhIHJhbmdlIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfcmFuZ2VfdHlwZSAocCwgbG93ZXIsIHVwcGVyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93ZXI7Ci0gICAgIGJmZF9zaWduZWRfdm1hIHVwcGVyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYmxbMjBdLCBhYnVbMjBdOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHByaW50X3ZtYSAobG93ZXIsIGFibCwgZmFsc2UsIGZhbHNlKTsKLSAgcHJpbnRfdm1hICh1cHBlciwgYWJ1LCBmYWxzZSwgZmFsc2UpOwotCi0gIHJldHVybiAocHJlcGVuZF90eXBlIChpbmZvLCAicmFuZ2UgKCIpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIik6IikKLQkgICYmIGFwcGVuZF90eXBlIChpbmZvLCBhYmwpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIjoiKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sIGFidSkpOwotfQotCi0vKiBNYWtlIGFuIGFycmF5IHR5cGUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1wcl9hcnJheV90eXBlIChwLCBsb3dlciwgdXBwZXIsIHN0cmluZ3ApCi0gICAgIFBUUiBwOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgICAgYmZkX3NpZ25lZF92bWEgdXBwZXI7Ci0gICAgIGJvb2xlYW4gc3RyaW5ncDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnJhbmdlX3R5cGU7Ci0gIGNoYXIgYWJsWzIwXSwgYWJ1WzIwXSwgYWJbNTBdOwotCi0gIHJhbmdlX3R5cGUgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmIChyYW5nZV90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChsb3dlciA9PSAwKQotICAgIHsKLSAgICAgIGlmICh1cHBlciA9PSAtMSkKLQlzcHJpbnRmIChhYiwgInxbXSIpOwotICAgICAgZWxzZQotCXsKLQkgIHByaW50X3ZtYSAodXBwZXIgKyAxLCBhYnUsIGZhbHNlLCBmYWxzZSk7Ci0JICBzcHJpbnRmIChhYiwgInxbJXNdIiwgYWJ1KTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRfdm1hIChsb3dlciwgYWJsLCBmYWxzZSwgZmFsc2UpOwotICAgICAgcHJpbnRfdm1hICh1cHBlciwgYWJ1LCBmYWxzZSwgZmFsc2UpOwotICAgICAgc3ByaW50ZiAoYWIsICJ8WyVzOiVzXSIsIGFibCwgYWJ1KTsKLSAgICB9Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBhYikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChzdHJjbXAgKHJhbmdlX3R5cGUsICJpbnQiKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiOiIpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCByYW5nZV90eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChzdHJpbmdwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qIHN0cmluZyAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBzZXQgdHlwZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXByX3NldF90eXBlIChwLCBiaXRzdHJpbmdwKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBiaXRzdHJpbmdwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAic2V0IHsgIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgfSIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYml0c3RyaW5ncCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIi8qIGJpdHN0cmluZyAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYW4gb2Zmc2V0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfb2Zmc2V0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIChzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKQotCSAgJiYgcHJlcGVuZF90eXBlIChpbmZvLCAiICIpCi0JICAmJiBwcmVwZW5kX3R5cGUgKGluZm8sIHQpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIjo6fCIpKTsKLX0KLQotLyogTWFrZSBhIG1ldGhvZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX21ldGhvZF90eXBlIChwLCBkb21haW4sIGFyZ2NvdW50LCB2YXJhcmdzKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBkb21haW47Ci0gICAgIGludCBhcmdjb3VudDsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY2hhciAqZG9tYWluX3R5cGU7Ci0gIGNoYXIgKiphcmdfdHlwZXM7Ci0gIGNoYXIgKnM7Ci0KLSAgbGVuID0gMTA7Ci0KLSAgaWYgKCEgZG9tYWluKQotICAgIGRvbWFpbl90eXBlID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGRvbWFpbl90eXBlID0gcG9wX3R5cGUgKGluZm8pOwotICAgICAgaWYgKGRvbWFpbl90eXBlID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHN0cm5jbXAgKGRvbWFpbl90eXBlLCAiY2xhc3MgIiwgc2l6ZW9mICJjbGFzcyAiIC0gMSkgPT0gMAotCSAgJiYgc3RyY2hyIChkb21haW5fdHlwZSArIHNpemVvZiAiY2xhc3MgIiAtIDEsICcgJykgPT0gTlVMTCkKLQlkb21haW5fdHlwZSArPSBzaXplb2YgImNsYXNzICIgLSAxOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAoZG9tYWluX3R5cGUsICJ1bmlvbiBjbGFzcyAiLAotCQkJc2l6ZW9mICJ1bmlvbiBjbGFzcyAiKSA9PSAwCi0JICAgICAgICYmIChzdHJjaHIgKGRvbWFpbl90eXBlICsgc2l6ZW9mICJ1bmlvbiBjbGFzcyAiIC0gMSwgJyAnKQotCQkgICA9PSBOVUxMKSkKLQlkb21haW5fdHlwZSArPSBzaXplb2YgInVuaW9uIGNsYXNzICIgLSAxOwotICAgICAgbGVuICs9IHN0cmxlbiAoZG9tYWluX3R5cGUpOwotICAgIH0KLQotICBpZiAoYXJnY291bnQgPD0gMCkKLSAgICB7Ci0gICAgICBhcmdfdHlwZXMgPSBOVUxMOwotICAgICAgbGVuICs9IDE1OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBhcmdfdHlwZXMgPSAoY2hhciAqKikgeG1hbGxvYyAoYXJnY291bnQgKiBzaXplb2YgKmFyZ190eXBlcyk7Ci0gICAgICBmb3IgKGkgPSBhcmdjb3VudCAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBhcmdfdHlwZXNbaV0gPSBwb3BfdHlwZSAoaW5mbyk7Ci0JICBpZiAoYXJnX3R5cGVzW2ldID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGxlbiArPSBzdHJsZW4gKGFyZ190eXBlc1tpXSkgKyAyOwotCX0KLSAgICAgIGlmICh2YXJhcmdzKQotCWxlbiArPSA1OwotICAgIH0KLQotICAvKiBOb3cgdGhlIHJldHVybiB0eXBlIGlzIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQotICBzID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgaWYgKCEgZG9tYWluKQotICAgICpzID0gJ1wwJzsKLSAgZWxzZQotICAgIHN0cmNweSAocywgZG9tYWluX3R5cGUpOwotICBzdHJjYXQgKHMsICI6OnwgKCIpOwotCi0gIGlmIChhcmdjb3VudCA8IDApCi0gICAgc3RyY2F0IChzLCAiLyogdW5rbm93biAqLyIpOwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotCXsKLQkgIGlmIChpID4gMCkKLQkgICAgc3RyY2F0IChzLCAiLCAiKTsKLQkgIHN0cmNhdCAocywgYXJnX3R5cGVzW2ldKTsKLQl9Ci0gICAgICBpZiAodmFyYXJncykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHN0cmNhdCAocywgIiwgIik7Ci0JICBzdHJjYXQgKHMsICIuLi4iKTsKLQl9Ci0gICAgICBpZiAoYXJnY291bnQgPiAwKQotCWZyZWUgKGFyZ190eXBlcyk7Ci0gICAgfQotCi0gIHN0cmNhdCAocywgIikiKTsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIHMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIGNvbnN0IHF1YWxpZmllZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NvbnN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiY29uc3QgfCIpOwotfQotCi0vKiBNYWtlIGEgdm9sYXRpbGUgcXVhbGlmaWVkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfdm9sYXRpbGVfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICJ2b2xhdGlsZSB8Iik7Ci19Ci0KLS8qIFN0YXJ0IGFjY3VtdWxhdGluZyBhIHN0cnVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3N0YXJ0X3N0cnVjdF90eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGluZm8tPmluZGVudCArPSAyOwotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgc3RydWN0cCA/ICJzdHJ1Y3QgIiA6ICJ1bmlvbiAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICh0YWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgdGFnKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciBpZGJ1ZlsyMF07Ci0KLSAgICAgIHNwcmludGYgKGlkYnVmLCAiJSVhbm9uJXUiLCBpZCk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgaWRidWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgeyIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHNpemUgIT0gMCB8fCB0YWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyIGFiWzMwXTsKLQotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgLyoiKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChzaXplICE9IDApCi0JewotCSAgc3ByaW50ZiAoYWIsICIgc2l6ZSAldSIsIHNpemUpOwotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmICh0YWcgIT0gTlVMTCkKLQl7Ci0JICBzcHJpbnRmIChhYiwgIiBpZCAldSIsIGlkKTsKLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBhYikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiXG4iKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+c3RhY2stPnZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQotICByZXR1cm4gaW5kZW50X3R5cGUgKGluZm8pOwotfQotCi0vKiBPdXRwdXQgdGhlIHZpc2liaWxpdHkgb2YgYSBmaWVsZCBpbiBhIHN0cnVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIGNvbnN0IGNoYXIgKnMgPSBOVUxMOwotICBjaGFyICp0OwotICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgaWYgKGluZm8tPnN0YWNrLT52aXNpYmlsaXR5ID09IHZpc2liaWxpdHkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjay0+dmlzaWJpbGl0eSAhPSBERUJVR19WSVNJQklMSVRZX0lHTk9SRSk7Ci0KLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOgotICAgICAgcyA9ICJwdWJsaWMiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU6Ci0gICAgICBzID0gInByaXZhdGUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLSAgICAgIHMgPSAicHJvdGVjdGVkIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9JR05PUkU6Ci0gICAgICBzID0gIi8qIGlnbm9yZSAqLyI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRyaW0gb2ZmIGEgdHJhaWxpbmcgc3BhY2UgaW4gdGhlIHN0cnVjdCBzdHJpbmcsIHRvIG1ha2UgdGhlCi0gICAgIG91dHB1dCBsb29rIGEgYml0IGJldHRlciwgdGhlbiBzdGljayBvbiB0aGUgdmlzaWJpbGl0eSBzdHJpbmcuICAqLwotCi0gIHQgPSBpbmZvLT5zdGFjay0+dHlwZTsKLSAgbGVuID0gc3RybGVuICh0KTsKLSAgYXNzZXJ0ICh0W2xlbiAtIDFdID09ICcgJyk7Ci0gIHRbbGVuIC0gMV0gPSAnXDAnOwotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBzKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIjpcbiIpCi0gICAgICB8fCAhIGluZGVudF90eXBlIChpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+c3RhY2stPnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBmaWVsZCB0byBhIHN0cnVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3N0cnVjdF9maWVsZCAocCwgbmFtZSwgYml0cG9zLCBiaXRzaXplLCB2aXNpYmlsaXR5KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJmZF92bWEgYml0c2l6ZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyIGFiWzIwXTsKLSAgY2hhciAqdDsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIjsgLyogIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiaXRzaXplICE9IDApCi0gICAgewotICAgICAgcHJpbnRfdm1hIChiaXRzaXplLCBhYiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJiaXRzaXplICIpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBhYikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIsICIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcHJpbnRfdm1hIChiaXRwb3MsIGFiLCB0cnVlLCBmYWxzZSk7Ci0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiYml0cG9zICIpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBhYikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgKi9cbiIpCi0gICAgICB8fCAhIGluZGVudF90eXBlIChpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgcHJfZml4X3Zpc2liaWxpdHkgKGluZm8sIHZpc2liaWxpdHkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gYXBwZW5kX3R5cGUgKGluZm8sIHQpOwotfQotCi0vKiBGaW5pc2ggYSBzdHJ1Y3QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9lbmRfc3RydWN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqczsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotICBhc3NlcnQgKGluZm8tPmluZGVudCA+PSAyKTsKLQotICBpbmZvLT5pbmRlbnQgLT0gMjsKLQotICAvKiBDaGFuZ2UgdGhlIHRyYWlsaW5nIGluZGVudGF0aW9uIHRvIGhhdmUgYSBjbG9zZSBicmFjZS4gICovCi0gIHMgPSBpbmZvLT5zdGFjay0+dHlwZSArIHN0cmxlbiAoaW5mby0+c3RhY2stPnR5cGUpIC0gMjsKLSAgYXNzZXJ0IChzWzBdID09ICcgJyAmJiBzWzFdID09ICcgJyAmJiBzWzJdID09ICdcMCcpOwotCi0gICpzKysgPSAnfSc7Ci0gICpzID0gJ1wwJzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYSBjbGFzcyB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3N0YXJ0X2NsYXNzX3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUsIHZwdHIsIG93bnZwdHIpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgIHVuc2lnbmVkIGludCBpZDsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB2cHRyOwotICAgICBib29sZWFuIG93bnZwdHI7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0diA9IE5VTEw7Ci0KLSAgaW5mby0+aW5kZW50ICs9IDI7Ci0KLSAgaWYgKHZwdHIgJiYgISBvd252cHRyKQotICAgIHsKLSAgICAgIHR2ID0gcG9wX3R5cGUgKGluZm8pOwotICAgICAgaWYgKHR2ID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBwdXNoX3R5cGUgKGluZm8sIHN0cnVjdHAgPyAiY2xhc3MgIiA6ICJ1bmlvbiBjbGFzcyAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICh0YWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgdGFnKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciBpZGJ1ZlsyMF07Ci0KLSAgICAgIHNwcmludGYgKGlkYnVmLCAiJSVhbm9uJXUiLCBpZCk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgaWRidWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgeyIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHNpemUgIT0gMCB8fCB2cHRyIHx8IG93bnZwdHIgfHwgdGFnICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgLyoiKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChzaXplICE9IDApCi0JewotCSAgY2hhciBhYlsyMF07Ci0KLQkgIHNwcmludGYgKGFiLCAiJXUiLCBzaXplKTsKLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIHNpemUgIikKLQkgICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBhYikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICh2cHRyKQotCXsKLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIHZ0YWJsZSAiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKG93bnZwdHIpCi0JICAgIHsKLQkgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgInNlbGYgIikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHR2KQotCQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgIikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHRhZyAhPSBOVUxMKQotCXsKLQkgIGNoYXIgYWJbMzBdOwotCi0JICBzcHJpbnRmIChhYiwgIiBpZCAldSIsIGlkKTsKLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBhYikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiICovIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLT5zdGFjay0+dmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURTsKLQotICByZXR1cm4gKGFwcGVuZF90eXBlIChpbmZvLCAiXG4iKQotCSAgJiYgaW5kZW50X3R5cGUgKGluZm8pKTsKLX0KLQotLyogQWRkIGEgc3RhdGljIG1lbWJlciB0byBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NsYXNzX3N0YXRpY19tZW1iZXIgKHAsIG5hbWUsIHBoeXNuYW1lLCB2aXNpYmlsaXR5KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sICJzdGF0aWMgIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICI7IC8qICIpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBwaHlzbmFtZSkKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgKi9cbiIpCi0gICAgICB8fCAhIGluZGVudF90eXBlIChpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgcHJfZml4X3Zpc2liaWxpdHkgKGluZm8sIHZpc2liaWxpdHkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gYXBwZW5kX3R5cGUgKGluZm8sIHQpOwotfQotCi0vKiBBZGQgYSBiYXNlIGNsYXNzIHRvIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3NfYmFzZWNsYXNzIChwLCBiaXRwb3MsIHZpcnR1YWwsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYm9vbGVhbiB2aXJ0dWFsOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0gIGNvbnN0IGNoYXIgKnByZWZpeDsKLSAgY2hhciBhYlsyMF07Ci0gIGNoYXIgKnMsICpsLCAqbjsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwgJiYgaW5mby0+c3RhY2stPm5leHQgIT0gTlVMTCk7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChzdHJuY21wICh0LCAiY2xhc3MgIiwgc2l6ZW9mICJjbGFzcyAiIC0gMSkgPT0gMCkKLSAgICB0ICs9IHNpemVvZiAiY2xhc3MgIiAtIDE7Ci0KLSAgLyogUHVzaCBpdCBiYWNrIG9uIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBwcmVwZW5kX3R5cGUgYW5kCi0gICAgIGFwcGVuZF90eXBlIHJvdXRpbmVzLiAgKi8KLSAgaWYgKCEgcHVzaF90eXBlIChpbmZvLCB0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHZpcnR1YWwpCi0gICAgewotICAgICAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAidmlydHVhbCAiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHN3aXRjaCAodmlzaWJpbGl0eSkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKLSAgICAgIHByZWZpeCA9ICJwdWJsaWMgIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0gICAgICBwcmVmaXggPSAicHJvdGVjdGVkICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIHByZWZpeCA9ICJwcml2YXRlICI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcHJlZml4ID0gIi8qIHVua25vd24gdmlzaWJpbGl0eSAqLyAiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgcHJlZml4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJpdHBvcyAhPSAwKQotICAgIHsKLSAgICAgIHByaW50X3ZtYSAoYml0cG9zLCBhYiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgLyogYml0cG9zICIpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBhYikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgKi8iKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGUgdG9wIG9mIHRoZSBzdGFjayBpcyBzb21ldGhpbmcgbGlrZSAicHVibGljIEEgLyAqIGJpdHBvcwotICAgICAxMCAqIC8iLiAgVGhlIG5leHQgZWxlbWVudCBvbiB0aGUgc3RhY2sgaXMgc29tZXRoaW5nIGxpa2UgImNsYXNzCi0gICAgIHh4IHsgLyAqIHNpemUgOCAqIC9cbi4uLiIuICBXZSB3YW50IHRvIHN1YnN0aXR1dGUgdGhlIHRvcCBvZiB0aGUKLSAgICAgc3RhY2sgaW4gYmVmb3JlIHRoZSB7LiAgKi8KLSAgcyA9IHN0cmNociAoaW5mby0+c3RhY2stPm5leHQtPnR5cGUsICd7Jyk7Ci0gIGFzc2VydCAocyAhPSBOVUxMKTsKLSAgLS1zOwotCi0gIC8qIElmIHRoZXJlIGlzIGFscmVhZHkgYSAnOicsIHRoZW4gd2UgYWxyZWFkeSBoYXZlIGEgYmFzZWNsYXNzLCBhbmQKLSAgICAgd2UgbXVzdCBhcHBlbmQgdGhpcyBvbmUgYWZ0ZXIgYSBjb21tYS4gICovCi0gIGZvciAobCA9IGluZm8tPnN0YWNrLT5uZXh0LT50eXBlOyBsICE9IHM7IGwrKykKLSAgICBpZiAoKmwgPT0gJzonKQotICAgICAgYnJlYWs7Ci0gIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgbCA9PSBzID8gIiA6ICIgOiAiLCAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoaW5mby0+c3RhY2stPnR5cGUpICsgc3RybGVuICh0KSArIDEpOwotICBtZW1jcHkgKG4sIGluZm8tPnN0YWNrLT50eXBlLCBzIC0gaW5mby0+c3RhY2stPnR5cGUpOwotICBzdHJjcHkgKG4gKyAocyAtIGluZm8tPnN0YWNrLT50eXBlKSwgdCk7Ci0gIHN0cmNhdCAobiwgcyk7Ci0KLSAgZnJlZSAoaW5mby0+c3RhY2stPnR5cGUpOwotICBpbmZvLT5zdGFjay0+dHlwZSA9IG47Ci0KLSAgZnJlZSAodCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGFkZGluZyBhIG1ldGhvZCB0byBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NsYXNzX3N0YXJ0X21ldGhvZCAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0gIGluZm8tPnN0YWNrLT5tZXRob2QgPSBuYW1lOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgdmFyaWFudCB0byBhIG1ldGhvZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9jbGFzc19tZXRob2RfdmFyaWFudCAocCwgcGh5c25hbWUsIHZpc2liaWxpdHksIGNvbnN0cCwgdm9sYXRpbGVwLCB2b2Zmc2V0LAotCQkJIGNvbnRleHQpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLSAgICAgYmZkX3ZtYSB2b2Zmc2V0OwotICAgICBib29sZWFuIGNvbnRleHQ7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICptZXRob2RfdHlwZTsKLSAgY2hhciAqY29udGV4dF90eXBlOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0gIGFzc2VydCAoaW5mby0+c3RhY2stPm5leHQgIT0gTlVMTCk7Ci0KLSAgLyogUHV0IHRoZSBjb25zdCBhbmQgdm9sYXRpbGUgcXVhbGlmaWVycyBvbiB0aGUgdHlwZS4gICovCi0gIGlmICh2b2xhdGlsZXApCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgdm9sYXRpbGUiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoY29uc3RwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIGNvbnN0IikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTdGljayB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGludG8gaXRzIHR5cGUuICAqLwotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sCi0JCQkgKGNvbnRleHQKLQkJCSAgPyBpbmZvLT5zdGFjay0+bmV4dC0+bmV4dC0+bWV0aG9kCi0JCQkgIDogaW5mby0+c3RhY2stPm5leHQtPm1ldGhvZCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgdGhlIHR5cGUuICAqLwotICBtZXRob2RfdHlwZSA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKG1ldGhvZF90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFB1bGwgb2ZmIHRoZSBjb250ZXh0IHR5cGUgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKCEgY29udGV4dCkKLSAgICBjb250ZXh0X3R5cGUgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgY29udGV4dF90eXBlID0gcG9wX3R5cGUgKGluZm8pOwotICAgICAgaWYgKGNvbnRleHRfdHlwZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTm93IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIHRoZSBjbGFzcy4gICovCi0KLSAgaWYgKCEgcHJfZml4X3Zpc2liaWxpdHkgKGluZm8sIHZpc2liaWxpdHkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgbWV0aG9kX3R5cGUpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qICIpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBwaHlzbmFtZSkKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgIikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoY29udGV4dCB8fCB2b2Zmc2V0ICE9IDApCi0gICAgewotICAgICAgY2hhciBhYlsyMF07Ci0KLSAgICAgIGlmIChjb250ZXh0KQotCXsKLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiY29udGV4dCAiKQotCSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGNvbnRleHRfdHlwZSkKLQkgICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgcHJpbnRfdm1hICh2b2Zmc2V0LCBhYiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJ2b2Zmc2V0ICIpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBhYikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gKGFwcGVuZF90eXBlIChpbmZvLCAiICovO1xuIikKLQkgICYmIGluZGVudF90eXBlIChpbmZvKSk7Ci19Ci0KLS8qIEFkZCBhIHN0YXRpYyB2YXJpYW50IHRvIGEgbWV0aG9kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCAocCwgcGh5c25hbWUsIHZpc2liaWxpdHksIGNvbnN0cCwgdm9sYXRpbGVwKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICptZXRob2RfdHlwZTsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotICBhc3NlcnQgKGluZm8tPnN0YWNrLT5uZXh0ICE9IE5VTEwpOwotICBhc3NlcnQgKGluZm8tPnN0YWNrLT5uZXh0LT5tZXRob2QgIT0gTlVMTCk7Ci0KLSAgLyogUHV0IHRoZSBjb25zdCBhbmQgdm9sYXRpbGUgcXVhbGlmaWVycyBvbiB0aGUgdHlwZS4gICovCi0gIGlmICh2b2xhdGlsZXApCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgdm9sYXRpbGUiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoY29uc3RwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIGNvbnN0IikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBNYXJrIGl0IGFzIHN0YXRpYy4gICovCi0gIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgInN0YXRpYyAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU3RpY2sgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpbnRvIGl0cyB0eXBlLiAgKi8KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBpbmZvLT5zdGFjay0+bmV4dC0+bWV0aG9kKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogR2V0IHRoZSB0eXBlLiAgKi8KLSAgbWV0aG9kX3R5cGUgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmIChtZXRob2RfdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgdGhlIHRvcCBvZiB0aGUgc3RhY2sgaXMgdGhlIGNsYXNzLiAgKi8KLQotICBpZiAoISBwcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiAoYXBwZW5kX3R5cGUgKGluZm8sIG1ldGhvZF90eXBlKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICIgLyogIikKLQkgICYmIGFwcGVuZF90eXBlIChpbmZvLCBwaHlzbmFtZSkKLQkgICYmIGFwcGVuZF90eXBlIChpbmZvLCAiICovO1xuIikKLQkgICYmIGluZGVudF90eXBlIChpbmZvKSk7Ci19Ci0KLS8qIEZpbmlzaCB1cCBhIG1ldGhvZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9jbGFzc19lbmRfbWV0aG9kIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgaW5mby0+c3RhY2stPm1ldGhvZCA9IE5VTEw7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9lbmRfY2xhc3NfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHJldHVybiBwcl9lbmRfc3RydWN0X3R5cGUgKHApOwotfQotCi0vKiBQdXNoIGEgdHlwZSBvbiB0aGUgc3RhY2sgdXNpbmcgYSB0eXBlZGVmIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfdHlwZWRlZl90eXBlIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgbmFtZSk7Ci19Ci0KLS8qIFB1c2ggYSB0eXBlIG9uIHRoZSBzdGFjayB1c2luZyBhIHRhZyBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3RhZ190eXBlIChwLCBuYW1lLCBpZCwga2luZCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHVuc2lnbmVkIGludCBpZDsKLSAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNvbnN0IGNoYXIgKnQsICp0YWc7Ci0gIGNoYXIgaWRidWZbMjBdOwotCi0gIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKLSAgICAgIHQgPSAic3RydWN0ICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT046Ci0gICAgICB0ID0gInVuaW9uICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0tJTkRfRU5VTToKLSAgICAgIHQgPSAiZW51bSAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19LSU5EX0NMQVNTOgotICAgICAgdCA9ICJjbGFzcyAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19LSU5EX1VOSU9OX0NMQVNTOgotICAgICAgdCA9ICJ1bmlvbiBjbGFzcyAiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBwdXNoX3R5cGUgKGluZm8sIHQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICB0YWcgPSBuYW1lOwotICBlbHNlCi0gICAgewotICAgICAgc3ByaW50ZiAoaWRidWYsICIlJWFub24ldSIsIGlkKTsKLSAgICAgIHRhZyA9IGlkYnVmOwotICAgIH0KLQotICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgdGFnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChuYW1lICE9IE5VTEwgJiYga2luZCAhPSBERUJVR19LSU5EX0VOVU0pCi0gICAgewotICAgICAgc3ByaW50ZiAoaWRidWYsICIgLyogaWQgJXUgKi8iLCBpZCk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgaWRidWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIHR5cGVkZWYuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfdHlwZGVmIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnM7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgZnByaW50ZiAoaW5mby0+ZiwgInR5cGVkZWYgJXM7XG4iLCBzKTsKLQotICBmcmVlIChzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdGFnLiAgVGhlIHRhZyBzaG91bGQgYWxyZWFkeSBiZSBpbiB0aGUgc3RyaW5nIG9uIHRoZQotICAgc3RhY2ssIHNvIGFsbCB3ZSBoYXZlIHRvIGRvIGhlcmUgaXMgcHJpbnQgaXQgb3V0LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcHJfdGFnIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmRlbnQgKGluZm8pOwotICBmcHJpbnRmIChpbmZvLT5mLCAiJXM7XG4iLCB0KTsKLQotICBmcmVlICh0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGFuIGludGVnZXIgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfaW50X2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMjBdOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIHByaW50X3ZtYSAodmFsLCBhYiwgZmFsc2UsIGZhbHNlKTsKLSAgZnByaW50ZiAoaW5mby0+ZiwgImNvbnN0IGludCAlcyA9ICVzO1xuIiwgbmFtZSwgYWIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZmxvYXRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRvdWJsZSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJjb25zdCBkb3VibGUgJXMgPSAlZztcbiIsIG5hbWUsIHZhbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB0eXBlZCBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl90eXBlZF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotICBjaGFyIGFiWzIwXTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmRlbnQgKGluZm8pOwotICBwcmludF92bWEgKHZhbCwgYWIsIGZhbHNlLCBmYWxzZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJjb25zdCAlcyAlcyA9ICVzO1xuIiwgdCwgbmFtZSwgYWIpOwotCi0gIGZyZWUgKHQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl92YXJpYWJsZSAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgYWJbMjBdOwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19TVEFUSUM6Ci0gICAgY2FzZSBERUJVR19MT0NBTF9TVEFUSUM6Ci0gICAgICBmcHJpbnRmIChpbmZvLT5mLCAic3RhdGljICIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19SRUdJU1RFUjoKLSAgICAgIGZwcmludGYgKGluZm8tPmYsICJyZWdpc3RlciAiKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHByaW50X3ZtYSAodmFsLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICIlcyAvKiAlcyAqLztcbiIsIHQsIGFiKTsKLQotICBmcmVlICh0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgb3V0cHV0dGluZyBhIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3N0YXJ0X2Z1bmN0aW9uIChwLCBuYW1lLCBnbG9iYWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGdsb2JhbDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgaWYgKCEgZ2xvYmFsKQotICAgIGZwcmludGYgKGluZm8tPmYsICJzdGF0aWMgIik7Ci0gIGZwcmludGYgKGluZm8tPmYsICIlcyAoIiwgdCk7Ci0KLSAgaW5mby0+cGFyYW1ldGVyID0gMTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2Z1bmN0aW9uX3BhcmFtZXRlciAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z19wYXJtX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotICBjaGFyIGFiWzIwXTsKLQotICBpZiAoa2luZCA9PSBERUJVR19QQVJNX1JFRkVSRU5DRQotICAgICAgfHwga2luZCA9PSBERUJVR19QQVJNX1JFRl9SRUcpCi0gICAgewotICAgICAgaWYgKCEgcHJfcmVmZXJlbmNlX3R5cGUgKHApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPnBhcmFtZXRlciAhPSAxKQotICAgIGZwcmludGYgKGluZm8tPmYsICIsICIpOwotCi0gIGlmIChraW5kID09IERFQlVHX1BBUk1fUkVHIHx8IGtpbmQgPT0gREVCVUdfUEFSTV9SRUZfUkVHKQotICAgIGZwcmludGYgKGluZm8tPmYsICJyZWdpc3RlciAiKTsKLQotICBwcmludF92bWEgKHZhbCwgYWIsIHRydWUsIHRydWUpOwotICBmcHJpbnRmIChpbmZvLT5mLCAiJXMgLyogJXMgKi8iLCB0LCBhYik7Ci0KLSAgZnJlZSAodCk7Ci0KLSAgKytpbmZvLT5wYXJhbWV0ZXI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IHdyaXRpbmcgb3V0IGEgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RhcnRfYmxvY2sgKHAsIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyIGFiWzIwXTsKLQotICBpZiAoaW5mby0+cGFyYW1ldGVyID4gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChpbmZvLT5mLCAiKVxuIik7Ci0gICAgICBpbmZvLT5wYXJhbWV0ZXIgPSAwOwotICAgIH0KLQotICBpbmRlbnQgKGluZm8pOwotICBwcmludF92bWEgKGFkZHIsIGFiLCB0cnVlLCB0cnVlKTsKLSAgZnByaW50ZiAoaW5mby0+ZiwgInsgLyogJXMgKi9cbiIsIGFiKTsKLQotICBpbmZvLT5pbmRlbnQgKz0gMjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2xpbmVubyAocCwgZmlsZW5hbWUsIGxpbmVubywgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICB1bnNpZ25lZCBsb25nIGxpbmVubzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgcHJpbnRfdm1hIChhZGRyLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICIvKiBmaWxlICVzIGxpbmUgJWx1IGFkZHIgJXMgKi9cbiIsIGZpbGVuYW1lLCBsaW5lbm8sIGFiKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHdyaXRpbmcgb3V0IGEgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZW5kX2Jsb2NrIChwLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgaW5mby0+aW5kZW50IC09IDI7Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgcHJpbnRfdm1hIChhZGRyLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJ9IC8qICVzICovXG4iLCBhYik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB3cml0aW5nIG91dCBhIGZ1bmN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcHJfZW5kX2Z1bmN0aW9uIChwKQotICAgICBQVFIgcCBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3JhbmxpYi4xIGIvYmludXRpbHMvcmFubGliLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZmI1YzguLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmFubGliLjEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggcmFubGliIDEgIjUgTm92ZW1iZXIgMTk5MSIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLXJhbmxpYiBcLSBnZW5lcmF0ZSBpbmRleCB0byBhcmNoaXZlLgotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5CIHJhbmxpYiBcYwotLlJCICJbXHwiIFwtdiB8IFwtViAiXHxdIgotLkkgYXJjaGl2ZVxjCi1cJgotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLS5CIHJhbmxpYgotZ2VuZXJhdGVzIGFuIGluZGV4IHRvIHRoZSBjb250ZW50cyBvZiBhbiBhcmNoaXZlLCBhbmQKLXN0b3JlcyBpdCBpbiB0aGUgYXJjaGl2ZS4gIFRoZSBpbmRleCBsaXN0cyBlYWNoIHN5bWJvbCBkZWZpbmVkIGJ5IGEKLW1lbWJlciBvZiBhbiBhcmNoaXZlIHRoYXQgaXMgYSByZWxvY2F0YWJsZSBvYmplY3QgZmlsZS4gIAotLlBQCi1Zb3UgbWF5IHVzZQotLlJCIGAgIm5tIFwtcyIgJwotb3IKLS5SQiBgICJubSBcLVwtcHJpbnQtYXJtYXAiICcKLXRvIGxpc3QgdGhpcyBpbmRleC4KLS5QUAotQW4gYXJjaGl2ZSB3aXRoIHN1Y2ggYW4gaW5kZXggc3BlZWRzIHVwIGxpbmtpbmcgdG8gdGhlIGxpYnJhcnksIGFuZAotYWxsb3dzIHJvdXRpbmVzIGluIHRoZSBsaWJyYXJ5IHRvIGNhbGwgZWFjaCBvdGhlciB3aXRob3V0IHJlZ2FyZCB0bwotdGhlaXIgcGxhY2VtZW50IGluIHRoZSBhcmNoaXZlLgotLlBQCi1UaGUgR05VCi0uQiByYW5saWIKLXByb2dyYW0gaXMgYW5vdGhlciBmb3JtIG9mIEdOVQotLkJSIGFyIDsKLXJ1bm5pbmcKLS5CIHJhbmxpYgotaXMgY29tcGxldGVseSBlcXVpdmFsZW50IHRvIGV4ZWN1dGluZwotLlJCIGAgImFyIFwtcyIgJy4KLQotLlNIIE9QVElPTlMKLS5UUAotLkIgXC12Ci1QcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YKLS5CIHJhbmxpYgotYW5kIGV4aXQuCi0KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIKLWVudHJ5IGluIAotLkIKLWluZm9cYwotXCY7IAotLkkKLVRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCi1cJiwgUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpOyAKLS5CUiBhciAiKCIgMSAiKSwiCi0uQlIgbm0gIigiIDEgIikuIgotCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3JhbmxpYi5zaCBiL2JpbnV0aWxzL3JhbmxpYi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmI2ZmJjNC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yYW5saWIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMhL2Jpbi9zaAotIyBBIHNpbXBsZSByYW5saWIgc2NyaXB0LCB0byB1c2UgbGVzcyBkaXNrIHNwYWNlIHRoYW4gYSByYW5saWIgcHJvZ3JhbS4KLWFyIHMgJDEKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3JjbGV4LmwgYi9iaW51dGlscy9yY2xleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2I0NzliLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3JjbGV4LmwKKysrIC9kZXYvbnVsbApAQCAtMSw0OTYgKzAsMCBAQAotJXsgLyogcmNsZXgubCAtLSBsZXhlciBmb3IgV2luZG93cyByYyBmaWxlcyBwYXJzZXIgICovCi0vKiBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgYSBsZXggaW5wdXQgZmlsZSB3aGljaCBnZW5lcmF0ZXMgYSBsZXhlciB1c2VkIGJ5IHRoZQotICAgV2luZG93cyByYyBmaWxlIHBhcnNlci4gIEl0IGJhc2ljYWxseSBqdXN0IHJlY29nbml6ZWQgYSBidW5jaCBvZgotICAga2V5d29yZHMuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotI2luY2x1ZGUgInJjcGFyc2UuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLS8qIFdoZXRoZXIgd2UgYXJlIGluIHJjZGF0YSBtb2RlLCBpbiB3aGljaCB3ZSByZXR1cm5zIHRoZSBsZW5ndGhzIG9mCi0gICBzdHJpbmdzLiAgKi8KLQotc3RhdGljIGludCByY2RhdGFfbW9kZTsKLQotLyogV2hldGhlciB3ZSBhcmUgc3VwcmVzc2luZyBsaW5lcyBmcm9tIGNwcCAoaW5jbHVkaW5nIHdpbmRvd3MuaCBvcgotICAgaGVhZGVycyBmcm9tIHlvdXIgQyBzb3VyY2VzIG1heSBicmluZyBpbiBleHRlcm5zIGFuZCB0eXBlZGVmcykuCi0gICBXaGVuIGFjdGl2ZSwgd2UgcmV0dXJuIElHTk9SRURfVE9LRU4sIHdoaWNoIGxldHMgdXMgaWdub3JlIHRoZXNlCi0gICBvdXRzaWRlIG9mIHJlc291cmNlIGNvbnN0cnVjdHMuICBUaHVzLCBpdCBpc24ndCByZXF1aXJlZCB0byBwcm90ZWN0Ci0gICBhbGwgdGhlIG5vbi1wcmVwcm9jZXNzb3IgbGluZXMgaW4geW91ciBoZWFkZXIgZmlsZXMgd2l0aCAjaWZkZWYKLSAgIFJDX0lOVk9LRUQuICBJdCBhbHNvIG1lYW5zIHlvdXIgUkMgZmlsZSBjYW4ndCBpbmNsdWRlIG90aGVyIFJDCi0gICBmaWxlcyBpZiB0aGV5J3JlIG5hbWVkICIqLmgiLiAgU29ycnkuICBOYW1lIHRoZW0gKi5yY2ggb3Igd2hhdGV2ZXIuICAqLwotCi1zdGF0aWMgaW50IHN1cHByZXNzX2NwcF9kYXRhOwotCi0jZGVmaW5lIE1BWUJFX1JFVFVSTih4KSByZXR1cm4gc3VwcHJlc3NfY3BwX2RhdGEgPyBJR05PUkVEX1RPS0VOIDogKHgpCi0KLS8qIFRoZSBmaXJzdCBmaWxlbmFtZSB3ZSBkZXRlY3QgaW4gdGhlIGNwcCBvdXRwdXQuICBXZSB1c2UgdGhpcyB0bwotICAgdGVsbCBpbmNsdWRlZCBmaWxlcyBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLiAgKi8KLQotc3RhdGljIGNoYXIgKmluaXRpYWxfZm47Ci0KLS8qIExpc3Qgb2YgYWxsb2NhdGVkIHN0cmluZ3MuICAqLwotCi1zdHJ1Y3QgYWxsb2Nfc3RyaW5nCi17Ci0gIHN0cnVjdCBhbGxvY19zdHJpbmcgKm5leHQ7Ci0gIGNoYXIgKnM7Ci19OwotCi1zdGF0aWMgc3RydWN0IGFsbG9jX3N0cmluZyAqc3RyaW5nczsKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgY3BwX2xpbmUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgY2hhciAqaGFuZGxlX3F1b3RlcyBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcgKikpOwotc3RhdGljIGNoYXIgKmdldF9zdHJpbmcgUEFSQU1TICgoaW50KSk7Ci0KLSV9Ci0KLSUlCi0KLSJCRUdJTiIJCQl7IE1BWUJFX1JFVFVSTiAoQkVHKTsgfQotInsiCQkJeyBNQVlCRV9SRVRVUk4gKEJFRyk7IH0KLSJFTkQiCQkJeyBNQVlCRV9SRVRVUk4gKEVORCk7IH0KLSJ9IgkJCXsgTUFZQkVfUkVUVVJOIChFTkQpOyB9Ci0iQUNDRUxFUkFUT1JTIgkJeyBNQVlCRV9SRVRVUk4gKEFDQ0VMRVJBVE9SUyk7IH0KLSJWSVJUS0VZIgkJeyBNQVlCRV9SRVRVUk4gKFZJUlRLRVkpOyB9Ci0iQVNDSUkiCQkJeyBNQVlCRV9SRVRVUk4gKEFTQ0lJKTsgfQotIk5PSU5WRVJUIgkJeyBNQVlCRV9SRVRVUk4gKE5PSU5WRVJUKTsgfQotIlNISUZUIgkJCXsgTUFZQkVfUkVUVVJOIChTSElGVCk7IH0KLSJDT05UUk9MIgkJeyBNQVlCRV9SRVRVUk4gKENPTlRST0wpOyB9Ci0iQUxUIgkJCXsgTUFZQkVfUkVUVVJOIChBTFQpOyB9Ci0iQklUTUFQIgkJeyBNQVlCRV9SRVRVUk4gKEJJVE1BUCk7IH0KLSJDVVJTT1IiCQl7IE1BWUJFX1JFVFVSTiAoQ1VSU09SKTsgfQotIkRJQUxPRyIJCXsgTUFZQkVfUkVUVVJOIChESUFMT0cpOyB9Ci0iRElBTE9HRVgiCQl7IE1BWUJFX1JFVFVSTiAoRElBTE9HRVgpOyB9Ci0iRVhTVFlMRSIJCXsgTUFZQkVfUkVUVVJOIChFWFNUWUxFKTsgfQotIkNBUFRJT04iCQl7IE1BWUJFX1JFVFVSTiAoQ0FQVElPTik7IH0KLSJDTEFTUyIJCQl7IE1BWUJFX1JFVFVSTiAoQ0xBU1MpOyB9Ci0iU1RZTEUiCQkJeyBNQVlCRV9SRVRVUk4gKFNUWUxFKTsgfQotIkFVVE8zU1RBVEUiCQl7IE1BWUJFX1JFVFVSTiAoQVVUTzNTVEFURSk7IH0KLSJBVVRPQ0hFQ0tCT1giCQl7IE1BWUJFX1JFVFVSTiAoQVVUT0NIRUNLQk9YKTsgfQotIkFVVE9SQURJT0JVVFRPTiIJeyBNQVlCRV9SRVRVUk4gKEFVVE9SQURJT0JVVFRPTik7IH0KLSJDSEVDS0JPWCIJCXsgTUFZQkVfUkVUVVJOIChDSEVDS0JPWCk7IH0KLSJDT01CT0JPWCIJCXsgTUFZQkVfUkVUVVJOIChDT01CT0JPWCk7IH0KLSJDVEVYVCIJCQl7IE1BWUJFX1JFVFVSTiAoQ1RFWFQpOyB9Ci0iREVGUFVTSEJVVFRPTiIJCXsgTUFZQkVfUkVUVVJOIChERUZQVVNIQlVUVE9OKTsgfQotIkVESVRURVhUIgkJeyBNQVlCRV9SRVRVUk4gKEVESVRURVhUKTsgfQotIkdST1VQQk9YIgkJeyBNQVlCRV9SRVRVUk4gKEdST1VQQk9YKTsgfQotIkxJU1RCT1giCQl7IE1BWUJFX1JFVFVSTiAoTElTVEJPWCk7IH0KLSJMVEVYVCIJCQl7IE1BWUJFX1JFVFVSTiAoTFRFWFQpOyB9Ci0iUFVTSEJPWCIJCXsgTUFZQkVfUkVUVVJOIChQVVNIQk9YKTsgfQotIlBVU0hCVVRUT04iCQl7IE1BWUJFX1JFVFVSTiAoUFVTSEJVVFRPTik7IH0KLSJSQURJT0JVVFRPTiIJCXsgTUFZQkVfUkVUVVJOIChSQURJT0JVVFRPTik7IH0KLSJSVEVYVCIJCQl7IE1BWUJFX1JFVFVSTiAoUlRFWFQpOyB9Ci0iU0NST0xMQkFSIgkJeyBNQVlCRV9SRVRVUk4gKFNDUk9MTEJBUik7IH0KLSJTVEFURTMiCQl7IE1BWUJFX1JFVFVSTiAoU1RBVEUzKTsgfQotIlVTRVJCVVRUT04iCQl7IE1BWUJFX1JFVFVSTiAoVVNFUkJVVFRPTik7IH0KLSJCRURJVCIJCQl7IE1BWUJFX1JFVFVSTiAoQkVESVQpOyB9Ci0iSEVESVQiCQkJeyBNQVlCRV9SRVRVUk4gKEhFRElUKTsgfQotIklFRElUIgkJCXsgTUFZQkVfUkVUVVJOIChJRURJVCk7IH0KLSJGT05UIgkJCXsgTUFZQkVfUkVUVVJOIChGT05UKTsgfQotIklDT04iCQkJeyBNQVlCRV9SRVRVUk4gKElDT04pOyB9Ci0iTEFOR1VBR0UiCQl7IE1BWUJFX1JFVFVSTiAoTEFOR1VBR0UpOyB9Ci0iQ0hBUkFDVEVSSVNUSUNTIgl7IE1BWUJFX1JFVFVSTiAoQ0hBUkFDVEVSSVNUSUNTKTsgfQotIlZFUlNJT04iCQl7IE1BWUJFX1JFVFVSTiAoVkVSU0lPTkspOyB9Ci0iTUVOVSIJCQl7IE1BWUJFX1JFVFVSTiAoTUVOVSk7IH0KLSJNRU5VRVgiCQl7IE1BWUJFX1JFVFVSTiAoTUVOVUVYKTsgfQotIk1FTlVJVEVNIgkJeyBNQVlCRV9SRVRVUk4gKE1FTlVJVEVNKTsgfQotIlNFUEFSQVRPUiIJCXsgTUFZQkVfUkVUVVJOIChTRVBBUkFUT1IpOyB9Ci0iUE9QVVAiCQkJeyBNQVlCRV9SRVRVUk4gKFBPUFVQKTsgfQotIkNIRUNLRUQiCQl7IE1BWUJFX1JFVFVSTiAoQ0hFQ0tFRCk7IH0KLSJHUkFZRUQiCQl7IE1BWUJFX1JFVFVSTiAoR1JBWUVEKTsgfQotIkhFTFAiCQkJeyBNQVlCRV9SRVRVUk4gKEhFTFApOyB9Ci0iSU5BQ1RJVkUiCQl7IE1BWUJFX1JFVFVSTiAoSU5BQ1RJVkUpOyB9Ci0iTUVOVUJBUkJSRUFLIgkJeyBNQVlCRV9SRVRVUk4gKE1FTlVCQVJCUkVBSyk7IH0KLSJNRU5VQlJFQUsiCQl7IE1BWUJFX1JFVFVSTiAoTUVOVUJSRUFLKTsgfQotIk1FU1NBR0VUQUJMRSIJCXsgTUFZQkVfUkVUVVJOIChNRVNTQUdFVEFCTEUpOyB9Ci0iUkNEQVRBIgkJeyBNQVlCRV9SRVRVUk4gKFJDREFUQSk7IH0KLSJTVFJJTkdUQUJMRSIJCXsgTUFZQkVfUkVUVVJOIChTVFJJTkdUQUJMRSk7IH0KLSJWRVJTSU9OSU5GTyIJCXsgTUFZQkVfUkVUVVJOIChWRVJTSU9OSU5GTyk7IH0KLSJGSUxFVkVSU0lPTiIJCXsgTUFZQkVfUkVUVVJOIChGSUxFVkVSU0lPTik7IH0KLSJQUk9EVUNUVkVSU0lPTiIJeyBNQVlCRV9SRVRVUk4gKFBST0RVQ1RWRVJTSU9OKTsgfQotIkZJTEVGTEFHU01BU0siCQl7IE1BWUJFX1JFVFVSTiAoRklMRUZMQUdTTUFTSyk7IH0KLSJGSUxFRkxBR1MiCQl7IE1BWUJFX1JFVFVSTiAoRklMRUZMQUdTKTsgfQotIkZJTEVPUyIJCXsgTUFZQkVfUkVUVVJOIChGSUxFT1MpOyB9Ci0iRklMRVRZUEUiCQl7IE1BWUJFX1JFVFVSTiAoRklMRVRZUEUpOyB9Ci0iRklMRVNVQlRZUEUiCQl7IE1BWUJFX1JFVFVSTiAoRklMRVNVQlRZUEUpOyB9Ci0iVkFMVUUiCQkJeyBNQVlCRV9SRVRVUk4gKFZBTFVFKTsgfQotIk1PVkVBQkxFIgkJeyBNQVlCRV9SRVRVUk4gKE1PVkVBQkxFKTsgfQotIkZJWEVEIgkJCXsgTUFZQkVfUkVUVVJOIChGSVhFRCk7IH0KLSJQVVJFIgkJCXsgTUFZQkVfUkVUVVJOIChQVVJFKTsgfQotIklNUFVSRSIJCXsgTUFZQkVfUkVUVVJOIChJTVBVUkUpOyB9Ci0iUFJFTE9BRCIJCXsgTUFZQkVfUkVUVVJOIChQUkVMT0FEKTsgfQotIkxPQURPTkNBTEwiCQl7IE1BWUJFX1JFVFVSTiAoTE9BRE9OQ0FMTCk7IH0KLSJESVNDQVJEQUJMRSIJCXsgTUFZQkVfUkVUVVJOIChESVNDQVJEQUJMRSk7IH0KLSJOT1QiCQkJeyBNQVlCRV9SRVRVUk4gKE5PVCk7IH0KLQotIkJMT0NLIlsgXHRcbl0qIlwiIlteXCNcbl0qIlwiIiB7Ci0JCQkgIGNoYXIgKnMsICpzZW5kOwotCi0JCQkgIC8qIFRoaXMgaXMgYSBoYWNrIHRvIGxldCB1cyBwYXJzZSB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGVhc2lseS4gICovCi0KLQkJCSAgcyA9IHN0cmNociAoeXl0ZXh0LCAnIicpOwotCQkJICArK3M7Ci0JCQkgIHNlbmQgPSBzdHJjaHIgKHMsICciJyk7Ci0JCQkgIGlmIChzdHJuY21wIChzLCAiU3RyaW5nRmlsZUluZm8iLAotCQkJCSAgICAgICBzaXplb2YgIlN0cmluZ0ZpbGVJbmZvIiAtIDEpID09IDAKLQkJCSAgICAgICYmIHMgKyBzaXplb2YgIlN0cmluZ0ZpbGVJbmZvIiAtIDEgPT0gc2VuZCkKLQkJCSAgICBNQVlCRV9SRVRVUk4gKEJMT0NLU1RSSU5HRklMRUlORk8pOwotCQkJICBlbHNlIGlmIChzdHJuY21wIChzLCAiVmFyRmlsZUluZm8iLAotCQkJCQkgICAgc2l6ZW9mICJWYXJGaWxlSW5mbyIgLSAxKSA9PSAwCi0JCQkJICAgJiYgcyArIHNpemVvZiAiVmFyRmlsZUluZm8iIC0gMSA9PSBzZW5kKQotCQkJICAgIE1BWUJFX1JFVFVSTiAoQkxPQ0tWQVJGSUxFSU5GTyk7Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBjaGFyICpyOwotCi0JCQkgICAgICByID0gZ2V0X3N0cmluZyAoc2VuZCAtIHMgKyAxKTsKLQkJCSAgICAgIHN0cm5jcHkgKHIsIHMsIHNlbmQgLSBzKTsKLQkJCSAgICAgIHJbc2VuZCAtIHNdID0gJ1wwJzsKLQkJCSAgICAgIHl5bHZhbC5zID0gcjsKLQkJCSAgICAgIE1BWUJFX1JFVFVSTiAoQkxPQ0spOwotCQkJICAgIH0KLQkJCX0KLQotIiMiW15cbl0qCQl7Ci0JCQkgIGNwcF9saW5lICh5eXRleHQpOwotCQkJfQotCi1bMC05XVt4MC05QS1GYS1mXSpMCXsKLQkJCSAgeXlsdmFsLmkudmFsID0gc3RydG91bCAoeXl0ZXh0LCAwLCAwKTsKLQkJCSAgeXlsdmFsLmkuZHdvcmQgPSAxOwotCQkJICBNQVlCRV9SRVRVUk4gKE5VTUJFUik7Ci0JCQl9Ci0KLVswLTldW3gwLTlBLUZhLWZdKgl7Ci0JCQkgIHl5bHZhbC5pLnZhbCA9IHN0cnRvdWwgKHl5dGV4dCwgMCwgMCk7Ci0JCQkgIHl5bHZhbC5pLmR3b3JkID0gMDsKLQkJCSAgTUFZQkVfUkVUVVJOIChOVU1CRVIpOwotCQkJfQotCi0oIlwiIlteXCJcbl0qIlwiIlsgXHRdKikrIHsKLQkJCSAgY2hhciAqczsKLQkJCSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0KLQkJCSAgcyA9IGhhbmRsZV9xdW90ZXMgKHl5dGV4dCwgJmxlbmd0aCk7Ci0JCQkgIGlmICghIHJjZGF0YV9tb2RlKQotCQkJICAgIHsKLQkJCSAgICAgIHl5bHZhbC5zID0gczsKLQkJCSAgICAgIE1BWUJFX1JFVFVSTiAoUVVPVEVEU1RSSU5HKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICB5eWx2YWwuc3MubGVuZ3RoID0gbGVuZ3RoOwotCQkJICAgICAgeXlsdmFsLnNzLnMgPSBzOwotCQkJICAgICAgTUFZQkVfUkVUVVJOIChTSVpFRFNUUklORyk7Ci0JCQkgICAgfQotCQkJfQotCi1bQS1aYS16XVteICxcdFxyXG5dKgl7Ci0JCQkgIGNoYXIgKnM7Ci0KLQkJCSAgLyogSSByZWplY3RlZCBjb21tYSBpbiBhIHN0cmluZyBpbiBvcmRlciB0bwotCQkJICAgICBoYW5kbGUgVklSVEtFWSwgQ09OVFJPTCBpbiBhbiBhY2NlbGVyYXRvcgotCQkJICAgICByZXNvdXJjZS4gIFRoaXMgbWVhbnMgdGhhdCBhbiB1bnF1b3RlZAotCQkJICAgICBmaWxlIG5hbWUgY2FuIG5vdCBjb250YWluIGEgY29tbWEuICBJCi0JCQkgICAgIGRvbid0IGtub3cgd2hhdCByYyBwZXJtaXRzLiAgKi8KLQotCQkJICBzID0gZ2V0X3N0cmluZyAoc3RybGVuICh5eXRleHQpICsgMSk7Ci0JCQkgIHN0cmNweSAocywgeXl0ZXh0KTsKLQkJCSAgeXlsdmFsLnMgPSBzOwotCQkJICBNQVlCRV9SRVRVUk4gKFNUUklORyk7Ci0JCQl9Ci0KLVtcbl0JCQl7ICsrcmNfbGluZW5vOyB9Ci1bIFx0XHJdKwkJeyAvKiBpZ25vcmUgd2hpdGVzcGFjZSAqLyB9Ci0uCQkJeyBNQVlCRV9SRVRVUk4gKCp5eXRleHQpOyB9Ci0KLSUlCi0jaWZuZGVmIHl5d3JhcAotLyogVGhpcyBpcyBuZWVkZWQgZm9yIHNvbWUgdmVyc2lvbnMgb2YgbGV4LiAgKi8KLWludCB5eXdyYXAgKCkKLXsKLSAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQotLyogSGFuZGxlIGEgQyBwcmVwcm9jZXNzb3IgbGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1jcHBfbGluZSAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgaW50IGxpbmU7Ci0gIGNoYXIgKnNlbmQsICpmbjsKLQotICArK3M7Ci0gIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotICAgICsrczsKLSAgCi0gIGxpbmUgPSBzdHJ0b2wgKHMsICZzZW5kLCAwKTsKLSAgaWYgKCpzZW5kICE9ICdcMCcgJiYgISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnNlbmQpKQotICAgIHJldHVybjsKLQotICAvKiBTdWJ0cmFjdCAxIGJlY2F1c2Ugd2UgYXJlIGFib3V0IHRvIGNvdW50IHRoZSBuZXdsaW5lLiAgKi8KLSAgcmNfbGluZW5vID0gbGluZSAtIDE7Ci0KLSAgcyA9IHNlbmQ7Ci0gIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotICAgICsrczsKLQotICBpZiAoKnMgIT0gJyInKQotICAgIHJldHVybjsKLQotICArK3M7Ci0gIHNlbmQgPSBzdHJjaHIgKHMsICciJyk7Ci0gIGlmIChzZW5kID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGZuID0gKGNoYXIgKikgeG1hbGxvYyAoc2VuZCAtIHMgKyAxKTsKLSAgc3RybmNweSAoZm4sIHMsIHNlbmQgLSBzKTsKLSAgZm5bc2VuZCAtIHNdID0gJ1wwJzsKLQotICBmcmVlIChyY19maWxlbmFtZSk7Ci0gIHJjX2ZpbGVuYW1lID0gZm47Ci0KLSAgaWYgKCFpbml0aWFsX2ZuKQotICAgIHsKLSAgICAgIGluaXRpYWxfZm4gPSB4bWFsbG9jIChzdHJsZW4gKGZuKSArIDEpOwotICAgICAgc3RyY3B5KGluaXRpYWxfZm4sIGZuKTsKLSAgICB9Ci0KLSAgLyogQWxsb3cgdGhlIGluaXRpYWwgZmlsZSwgcmVnYXJkbGVzcyBvZiBuYW1lLiAgU3VwcHJlc3MgYWxsIG90aGVyCi0gICAgIGZpbGVzIGlmIHRoZXkgZW5kIGluICIuaCIgKHRoaXMgYWxsb3dzIGluY2x1ZGVkICIqLnJjIikgKi8KLSAgaWYgKHN0cmNtcCAoaW5pdGlhbF9mbiwgZm4pID09IDAKLSAgICAgIHx8IHN0cmNtcCAoZm4gKyBzdHJsZW4gKGZuKSAtIDIsICIuaCIpICE9IDApCi0gICAgc3VwcHJlc3NfY3BwX2RhdGEgPSAwOwotICBlbHNlCi0gICAgc3VwcHJlc3NfY3BwX2RhdGEgPSAxOwotfQotCi0vKiBIYW5kbGUgYSBxdW90ZWQgc3RyaW5nLiAgVGhlIHF1b3RlcyBhcmUgc3RyaXBwZWQuICBBIHBhaXIgb2YgcXVvdGVzCi0gICBpbiBhIHN0cmluZyBhcmUgdHVybmVkIGludG8gYSBzaW5nbGUgcXVvdGUuICBBZGphY2VudCBzdHJpbmdzIGFyZQotICAgbWVyZ2VkIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIGFyZSBtZXJnZWQsIGFzIGluIEMuICAqLwotCi1zdGF0aWMgY2hhciAqCi1oYW5kbGVfcXVvdGVzIChpbnB1dCwgbGVuKQotICAgICBjb25zdCBjaGFyICppbnB1dDsKLSAgICAgdW5zaWduZWQgbG9uZyAqbGVuOwotewotICBjaGFyICpyZXQsICpzOwotICBjb25zdCBjaGFyICp0OwotICBpbnQgY2g7Ci0KLSAgcmV0ID0gZ2V0X3N0cmluZyAoc3RybGVuIChpbnB1dCkgKyAxKTsKLQotICBzID0gcmV0OwotICB0ID0gaW5wdXQ7Ci0gIGlmICgqdCA9PSAnIicpCi0gICAgKyt0OwotICB3aGlsZSAoKnQgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoKnQgPT0gJ1xcJykKLQl7Ci0JICArK3Q7Ci0JICBzd2l0Y2ggKCp0KQotCSAgICB7Ci0JICAgIGNhc2UgJ1wwJzoKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKCJiYWNrc2xhc2ggYXQgZW5kIG9mIHN0cmluZyIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1wiJzoKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKCJ1c2UgXCJcIiB0byBwdXQgXCIgaW4gYSBzdHJpbmciKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdhJzoKLQkgICAgICAqcysrID0gRVNDQVBFX0E7Ci0JICAgICAgKyt0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2InOgotCSAgICAgICpzKysgPSBFU0NBUEVfQjsKLQkgICAgICArK3Q7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnZic6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9GOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICduJzoKLQkgICAgICAqcysrID0gRVNDQVBFX047Ci0JICAgICAgKyt0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3InOgotCSAgICAgICpzKysgPSBFU0NBUEVfUjsKLQkgICAgICArK3Q7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAndCc6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9UOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd2JzoKLQkgICAgICAqcysrID0gRVNDQVBFX1Y7Ci0JICAgICAgKyt0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1xcJzoKLQkgICAgICAqcysrID0gKnQrKzsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzoKLQkgICAgY2FzZSAnNCc6IGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6Ci0JICAgICAgY2ggPSAqdCAtICcwJzsKLQkgICAgICArK3Q7Ci0JICAgICAgaWYgKCp0ID49ICcwJyAmJiAqdCA8PSAnNycpCi0JCXsKLQkJICBjaCA9IChjaCA8PCAzKSB8ICgqdCAtICcwJyk7Ci0JCSAgKyt0OwotCQkgIGlmICgqdCA+PSAnMCcgJiYgKnQgPD0gJzcnKQotCQkgICAgewotCQkgICAgICBjaCA9IChjaCA8PCAzKSB8ICgqdCAtICcwJyk7Ci0JCSAgICAgICsrdDsKLQkJICAgIH0KLQkJfQotCSAgICAgICpzKysgPSBjaDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd4JzoKLQkgICAgICArK3Q7Ci0JICAgICAgY2ggPSAwOwotCSAgICAgIHdoaWxlICgxKQotCQl7Ci0JCSAgaWYgKCp0ID49ICcwJyAmJiAqdCA8PSAnOScpCi0JCSAgICBjaCA9IChjaCA8PCA0KSB8ICgqdCAtICcwJyk7Ci0JCSAgZWxzZSBpZiAoKnQgPj0gJ2EnICYmICp0IDw9ICdmJykKLQkJICAgIGNoID0gKGNoIDw8IDQpIHwgKCp0IC0gJ2EnKTsKLQkJICBlbHNlIGlmICgqdCA+PSAnQScgJiYgKnQgPD0gJ0YnKQotCQkgICAgY2ggPSAoY2ggPDwgNCkgfCAoKnQgLSAnQScpOwotCQkgIGVsc2UKLQkJICAgIGJyZWFrOwotCQkgICsrdDsKLQkJfQotCSAgICAgICpzKysgPSBjaDsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoInVucmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2UiKTsKLQkgICAgICAqcysrID0gJ1xcJzsKLQkgICAgICAqcysrID0gKnQrKzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKCp0ICE9ICciJykKLQkqcysrID0gKnQrKzsKLSAgICAgIGVsc2UgaWYgKHRbMV0gPT0gJ1wwJykKLQlicmVhazsKLSAgICAgIGVsc2UgaWYgKHRbMV0gPT0gJyInKQotCXsKLQkgICpzKysgPSAnIic7Ci0JICB0ICs9IDI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICsrdDsKLQkgIGFzc2VydCAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICp0KSk7Ci0JICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICp0KSkKLQkgICAgKyt0OwotCSAgaWYgKCp0ID09ICdcMCcpCi0JICAgIGJyZWFrOwotCSAgYXNzZXJ0ICgqdCA9PSAnIicpOwotCSAgKyt0OwotCX0KLSAgICB9Ci0KLSAgKnMgPSAnXDAnOwotCi0gICpsZW4gPSBzIC0gcmV0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFsbG9jYXRlIGEgc3RyaW5nIG9mIGEgZ2l2ZW4gbGVuZ3RoLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZ2V0X3N0cmluZyAobGVuKQotICAgICBpbnQgbGVuOwotewotICBzdHJ1Y3QgYWxsb2Nfc3RyaW5nICphczsKLQotICBhcyA9IChzdHJ1Y3QgYWxsb2Nfc3RyaW5nICopIHhtYWxsb2MgKHNpemVvZiAqYXMpOwotICBhcy0+cyA9IHhtYWxsb2MgKGxlbik7Ci0KLSAgYXMtPm5leHQgPSBzdHJpbmdzOwotICBzdHJpbmdzID0gYXMtPm5leHQ7Ci0KLSAgcmV0dXJuIGFzLT5zOwotfQotCi0vKiBEaXNjYXJkIGFsbCB0aGUgc3RyaW5ncyB3ZSBoYXZlIGFsbG9jYXRlZC4gIFRoZSBwYXJzZXIgY2FsbHMgdGhpcwotICAgd2hlbiBpdCBubyBsb25nZXIgbmVlZHMgdGhlbS4gICovCi0KLXZvaWQKLXJjcGFyc2VfZGlzY2FyZF9zdHJpbmdzICgpCi17Ci0gIHN0cnVjdCBhbGxvY19zdHJpbmcgKmFzOwotCi0gIGFzID0gc3RyaW5nczsKLSAgd2hpbGUgKGFzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGFsbG9jX3N0cmluZyAqbjsKLQotICAgICAgZnJlZSAoYXMtPnMpOwotICAgICAgbiA9IGFzLT5uZXh0OwotICAgICAgZnJlZSAoYXMpOwotICAgICAgYXMgPSBuOwotICAgIH0KLQotICBzdHJpbmdzID0gTlVMTDsKLX0KLQotLyogRW50ZXIgcmNkYXRhIG1vZGUuICAqLwotCi12b2lkCi1yY3BhcnNlX3JjZGF0YSAoKQotewotICByY2RhdGFfbW9kZSA9IDE7Ci19Ci0KLS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgZnJvbSByY2RhdGEgbW9kZS4gICovCi0KLXZvaWQKLXJjcGFyc2Vfbm9ybWFsICgpCi17Ci0gIHJjZGF0YV9tb2RlID0gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3JjcGFyc2UueSBiL2JpbnV0aWxzL3JjcGFyc2UueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjYmJkYy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yY3BhcnNlLnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNjE5ICswLDAgQEAKLSV7IC8qIHJjcGFyc2UueSAtLSBwYXJzZXIgZm9yIFdpbmRvd3MgcmMgZmlsZXMKLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBpcyBhIHBhcnNlciBmb3IgV2luZG93cyByYyBmaWxlcy4gIEl0IGlzIGJhc2VkIG9uIHRoZSBwYXJzZXIKLSAgIGJ5IEd1bnRoZXIgRWJlcnQgPGd1bnRoZXIuZWJlcnRAaXhvcy1sZWlwemlnLmRlPi4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJ3aW5kcmVzLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKiBUaGUgY3VycmVudCBsYW5ndWFnZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBsYW5ndWFnZTsKLQotLyogVGhlIHJlc291cmNlIGluZm9ybWF0aW9uIGR1cmluZyBhIHN1YiBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNfaW5mbyBzdWJfcmVzX2luZm87Ci0KLS8qIERpYWxvZyBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgYnVpbHQgYnkgdGhlIG5vbnRlcm1pbmFscyBzdHlsZXMgYW5kCi0gICBjb250cm9scy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZGlhbG9nIGRpYWxvZzsKLQotLyogVGhpcyBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgYSBzdHlsZS4gIEl0IGlzIG1vZGlmaWVkIGJ5IHRoZQotICAgbm9udGVybWluYWwgc3R5bGVleHByLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3R5bGU7Ci0KLS8qIFRoZXNlIGFyZSB1c2VkIHdoZW4gYnVpbGRpbmcgYSBjb250cm9sLiAgVGhleSBhcmUgc2V0IGJlZm9yZSB1c2luZwotICAgY29udHJvbF9wYXJhbXMuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBiYXNlX3N0eWxlOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVmYXVsdF9zdHlsZTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNsYXNzOwotCi0lfQotCi0ldW5pb24KLXsKLSAgc3RydWN0IGFjY2VsZXJhdG9yIGFjYzsKLSAgc3RydWN0IGFjY2VsZXJhdG9yICpwYWNjOwotICBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmRpYWxvZ19jb250cm9sOwotICBzdHJ1Y3QgbWVudWl0ZW0gKm1lbnVpdGVtOwotICBzdHJ1Y3QKLSAgewotICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqZmlyc3Q7Ci0gICAgc3RydWN0IHJjZGF0YV9pdGVtICpsYXN0OwotICB9IHJjZGF0YTsKLSAgc3RydWN0IHJjZGF0YV9pdGVtICpyY2RhdGFfaXRlbTsKLSAgc3RydWN0IHN0cmluZ3RhYmxlX2RhdGEgKnN0cmluZ3RhYmxlOwotICBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmZpeHZlcjsKLSAgc3RydWN0IHZlcl9pbmZvICp2ZXJpbmZvOwotICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnZlcnN0cmluZzsKLSAgc3RydWN0IHZlcl92YXJpbmZvICp2ZXJ2YXI7Ci0gIHN0cnVjdCByZXNfaWQgaWQ7Ci0gIHN0cnVjdCByZXNfcmVzX2luZm8gcmVzX2luZm87Ci0gIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgc2hvcnQgb247Ci0gICAgdW5zaWduZWQgc2hvcnQgb2ZmOwotICB9IG1lbWZsYWdzOwotICBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBudW1iZXIgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGFzIGxvbmcuICAqLwotICAgIGludCBkd29yZDsKLSAgfSBpOwotICB1bnNpZ25lZCBsb25nIGlsOwotICB1bnNpZ25lZCBzaG9ydCBpczsKLSAgY29uc3QgY2hhciAqczsKLSAgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICBjb25zdCBjaGFyICpzOwotICB9IHNzOwotfTsKLQotJXRva2VuIEJFRyBFTkQKLSV0b2tlbiBBQ0NFTEVSQVRPUlMgVklSVEtFWSBBU0NJSSBOT0lOVkVSVCBTSElGVCBDT05UUk9MIEFMVAotJXRva2VuIEJJVE1BUAotJXRva2VuIENVUlNPUgotJXRva2VuIERJQUxPRyBESUFMT0dFWCBFWFNUWUxFIENBUFRJT04gQ0xBU1MgU1RZTEUKLSV0b2tlbiBBVVRPM1NUQVRFIEFVVE9DSEVDS0JPWCBBVVRPUkFESU9CVVRUT04gQ0hFQ0tCT1ggQ09NQk9CT1ggQ1RFWFQKLSV0b2tlbiBERUZQVVNIQlVUVE9OIEVESVRURVhUIEdST1VQQk9YIExJU1RCT1ggTFRFWFQgUFVTSEJPWCBQVVNIQlVUVE9OCi0ldG9rZW4gUkFESU9CVVRUT04gUlRFWFQgU0NST0xMQkFSIFNUQVRFMyBVU0VSQlVUVE9OCi0ldG9rZW4gQkVESVQgSEVESVQgSUVESVQKLSV0b2tlbiBGT05UCi0ldG9rZW4gSUNPTgotJXRva2VuIExBTkdVQUdFIENIQVJBQ1RFUklTVElDUyBWRVJTSU9OSwotJXRva2VuIE1FTlUgTUVOVUVYIE1FTlVJVEVNIFNFUEFSQVRPUiBQT1BVUCBDSEVDS0VEIEdSQVlFRCBIRUxQIElOQUNUSVZFCi0ldG9rZW4gTUVOVUJBUkJSRUFLIE1FTlVCUkVBSwotJXRva2VuIE1FU1NBR0VUQUJMRQotJXRva2VuIFJDREFUQQotJXRva2VuIFNUUklOR1RBQkxFCi0ldG9rZW4gVkVSU0lPTklORk8gRklMRVZFUlNJT04gUFJPRFVDVFZFUlNJT04gRklMRUZMQUdTTUFTSyBGSUxFRkxBR1MKLSV0b2tlbiBGSUxFT1MgRklMRVRZUEUgRklMRVNVQlRZUEUgQkxPQ0tTVFJJTkdGSUxFSU5GTyBCTE9DS1ZBUkZJTEVJTkZPCi0ldG9rZW4gVkFMVUUKLSV0b2tlbiA8cz4gQkxPQ0sKLSV0b2tlbiBNT1ZFQUJMRSBGSVhFRCBQVVJFIElNUFVSRSBQUkVMT0FEIExPQURPTkNBTEwgRElTQ0FSREFCTEUKLSV0b2tlbiBOT1QKLSV0b2tlbiA8cz4gUVVPVEVEU1RSSU5HIFNUUklORwotJXRva2VuIDxpPiBOVU1CRVIKLSV0b2tlbiA8c3M+IFNJWkVEU1RSSU5HCi0ldG9rZW4gSUdOT1JFRF9UT0tFTgotCi0ldHlwZSA8cGFjYz4gYWNjX2VudHJpZXMKLSV0eXBlIDxhY2M+IGFjY19lbnRyeSBhY2NfZXZlbnQKLSV0eXBlIDxkaWFsb2dfY29udHJvbD4gY29udHJvbCBjb250cm9sX3BhcmFtcwotJXR5cGUgPG1lbnVpdGVtPiBtZW51aXRlbXMgbWVudWl0ZW0gbWVudWV4aXRlbXMgbWVudWV4aXRlbQotJXR5cGUgPHJjZGF0YT4gb3B0cmNkYXRhX2RhdGEgb3B0cmNkYXRhX2RhdGFfaW50IHJjZGF0YV9kYXRhCi0ldHlwZSA8cmNkYXRhX2l0ZW0+IG9wdF9jb250cm9sX2RhdGEKLSV0eXBlIDxmaXh2ZXI+IGZpeGVkdmVyaW5mbwotJXR5cGUgPHZlcmluZm8+IHZlcmJsb2NrcwotJXR5cGUgPHZlcnN0cmluZz4gdmVydmFscwotJXR5cGUgPHZlcnZhcj4gdmVydHJhbnMKLSV0eXBlIDxyZXNfaW5mbz4gc3Vib3B0aW9ucyBtZW1mbGFnc19tb3ZlX2Rpc2NhcmQgbWVtZmxhZ3NfbW92ZQotJXR5cGUgPG1lbWZsYWdzPiBtZW1mbGFnCi0ldHlwZSA8aWQ+IGlkCi0ldHlwZSA8aWw+IGV4c3R5bGUgcGFyZW5udW1iZXIKLSV0eXBlIDxpbD4gbnVtZXhwciBwb3NudW1leHByIGNudW1leHByIG9wdGNudW1leHByIGNwb3NudW1leHByCi0ldHlwZSA8aXM+IGFjY19vcHRpb25zIGFjY19vcHRpb24gbWVudWl0ZW1fZmxhZ3MgbWVudWl0ZW1fZmxhZwotJXR5cGUgPHM+IG9wdHN0cmluZ2MgZmlsZV9uYW1lCi0ldHlwZSA8aT4gc2l6ZWRudW1leHByIHNpemVkcG9zbnVtZXhwcgotCi0lbGVmdCAnfCcKLSVsZWZ0ICdeJwotJWxlZnQgJyYnCi0lbGVmdCAnKycgJy0nCi0lbGVmdCAnKicgJy8nICclJwotJXJpZ2h0ICd+JyBORUcKLQotJSUKLQotaW5wdXQ6Ci0JICAvKiBlbXB0eSAqLwotCXwgaW5wdXQgbmV3Y21kIGFjY2VsZXJhdG9yCi0JfCBpbnB1dCBuZXdjbWQgYml0bWFwCi0JfCBpbnB1dCBuZXdjbWQgY3Vyc29yCi0JfCBpbnB1dCBuZXdjbWQgZGlhbG9nCi0JfCBpbnB1dCBuZXdjbWQgZm9udAotCXwgaW5wdXQgbmV3Y21kIGljb24KLQl8IGlucHV0IG5ld2NtZCBsYW5ndWFnZQotCXwgaW5wdXQgbmV3Y21kIG1lbnUKLQl8IGlucHV0IG5ld2NtZCBtZW51ZXgKLQl8IGlucHV0IG5ld2NtZCBtZXNzYWdldGFibGUKLQl8IGlucHV0IG5ld2NtZCByY2RhdGEKLQl8IGlucHV0IG5ld2NtZCBzdHJpbmd0YWJsZQotCXwgaW5wdXQgbmV3Y21kIHVzZXIKLQl8IGlucHV0IG5ld2NtZCB2ZXJzaW9uaW5mbwotCXwgaW5wdXQgbmV3Y21kIElHTk9SRURfVE9LRU4KLQk7Ci0KLW5ld2NtZDoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgIHJjcGFyc2VfZGlzY2FyZF9zdHJpbmdzICgpOwotCSAgfQotCTsKLQotLyogQWNjZWxlcmF0b3IgcmVzb3VyY2VzLiAgKi8KLQotYWNjZWxlcmF0b3I6Ci0JICBpZCBBQ0NFTEVSQVRPUlMgc3Vib3B0aW9ucyBCRUcgYWNjX2VudHJpZXMgRU5ECi0JICB7Ci0JICAgIGRlZmluZV9hY2NlbGVyYXRvciAoJDEsICYkMywgJDUpOwotCSAgfQotCTsKLQotYWNjX2VudHJpZXM6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IE5VTEw7Ci0JICB9Ci0JfCBhY2NfZW50cmllcyBhY2NfZW50cnkKLQkgIHsKLQkgICAgc3RydWN0IGFjY2VsZXJhdG9yICphOwotCi0JICAgIGEgPSAoc3RydWN0IGFjY2VsZXJhdG9yICopIHJlc19hbGxvYyAoc2l6ZW9mICphKTsKLQkgICAgKmEgPSAkMjsKLQkgICAgaWYgKCQxID09IE5VTEwpCi0JICAgICAgJCQgPSBhOwotCSAgICBlbHNlCi0JICAgICAgewotCQlzdHJ1Y3QgYWNjZWxlcmF0b3IgKipwcDsKLQotCQlmb3IgKHBwID0gJiQxLT5uZXh0OyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JCSAgOwotCQkqcHAgPSBhOwotCQkkJCA9ICQxOwotCSAgICAgIH0KLQkgIH0KLQk7Ci0KLWFjY19lbnRyeToKLQkgIGFjY19ldmVudCBjcG9zbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQxOwotCSAgICAkJC5pZCA9ICQyOwotCSAgfQotCXwgYWNjX2V2ZW50IGNwb3NudW1leHByICcsJyBhY2Nfb3B0aW9ucwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgICAkJC5pZCA9ICQyOwotCSAgICAkJC5mbGFncyB8PSAkNDsKLQkgICAgaWYgKCgkJC5mbGFncyAmIEFDQ19WSVJUS0VZKSA9PSAwCi0JCSYmICgkJC5mbGFncyAmIChBQ0NfU0hJRlQgfCBBQ0NfQ09OVFJPTCB8IEFDQ19BTFQpKSAhPSAwKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaW5hcHByb3ByaWF0ZSBtb2RpZmllcnMgZm9yIG5vbi1WSVJUS0VZIikpOwotCSAgfQotCTsKLQotYWNjX2V2ZW50OgotCSAgUVVPVEVEU1RSSU5HCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnMgPSAkMTsKLQkgICAgY2hhciBjaDsKLQotCSAgICAkJC5uZXh0ID0gTlVMTDsKLQkgICAgJCQuaWQgPSAwOwotCSAgICBjaCA9ICpzOwotCSAgICBpZiAoY2ggIT0gJ14nKQotCSAgICAgICQkLmZsYWdzID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJJCQuZmxhZ3MgPSBBQ0NfQ09OVFJPTCB8IEFDQ19WSVJUS0VZOwotCQkrK3M7Ci0JCWNoID0gKnM7Ci0JCWNoID0gdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGNoKTsKLQkgICAgICB9Ci0JICAgICQkLmtleSA9IGNoOwotCSAgICBpZiAoc1sxXSAhPSAnXDAnKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiYWNjZWxlcmF0b3Igc2hvdWxkIG9ubHkgYmUgb25lIGNoYXJhY3RlciIpKTsKLQkgIH0KLQl8IHBvc251bWV4cHIKLQkgIHsKLQkgICAgJCQubmV4dCA9IE5VTEw7Ci0JICAgICQkLmZsYWdzID0gMDsKLQkgICAgJCQuaWQgPSAwOwotCSAgICAkJC5rZXkgPSAkMTsKLQkgIH0KLQk7Ci0KLWFjY19vcHRpb25zOgotCSAgYWNjX29wdGlvbgotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCXwgYWNjX29wdGlvbnMgJywnIGFjY19vcHRpb24KLQkgIHsKLQkgICAgJCQgPSAkMSB8ICQzOwotCSAgfQotCS8qIEkndmUgaGFkIG9uZSByZXBvcnQgdGhhdCB0aGUgY29tbWEgaXMgb3B0aW9uYWwuICAqLwotCXwgYWNjX29wdGlvbnMgYWNjX29wdGlvbgotCSAgewotCSAgICAkJCA9ICQxIHwgJDI7Ci0JICB9Ci0JOwotCi1hY2Nfb3B0aW9uOgotCSAgVklSVEtFWQotCSAgewotCSAgICAkJCA9IEFDQ19WSVJUS0VZOwotCSAgfQotCXwgQVNDSUkKLQkgIHsKLQkgICAgLyogVGhpcyBpcyBqdXN0IHRoZSBhYnNlbmNlIG9mIFZJUlRLRVkuICAqLwotCSAgICAkJCA9IDA7Ci0JICB9Ci0JfCBOT0lOVkVSVAotCSAgewotCSAgICAkJCA9IEFDQ19OT0lOVkVSVDsKLQkgIH0KLQl8IFNISUZUCi0JICB7Ci0JICAgICQkID0gQUNDX1NISUZUOwotCSAgfQotCXwgQ09OVFJPTAotCSAgewotCSAgICAkJCA9IEFDQ19DT05UUk9MOwotCSAgfQotCXwgQUxUCi0JICB7Ci0JICAgICQkID0gQUNDX0FMVDsKLQkgIH0KLQk7Ci0KLS8qIEJpdG1hcCByZXNvdXJjZXMuICAqLwotCi1iaXRtYXA6Ci0JICBpZCBCSVRNQVAgbWVtZmxhZ3NfbW92ZSBmaWxlX25hbWUKLQkgIHsKLQkgICAgZGVmaW5lX2JpdG1hcCAoJDEsICYkMywgJDQpOwotCSAgfQotCTsKLQotLyogQ3Vyc29yIHJlc291cmNlcy4gICovCi0KLWN1cnNvcjoKLQkgIGlkIENVUlNPUiBtZW1mbGFnc19tb3ZlX2Rpc2NhcmQgZmlsZV9uYW1lCi0JICB7Ci0JICAgIGRlZmluZV9jdXJzb3IgKCQxLCAmJDMsICQ0KTsKLQkgIH0KLQk7Ci0KLS8qIERpYWxvZyByZXNvdXJjZXMuICAqLwotCi1kaWFsb2c6Ci0JICBpZCBESUFMT0cgbWVtZmxhZ3NfbW92ZSBleHN0eWxlIHBvc251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgICAgY251bWV4cHIKLQkgICAgewotCSAgICAgIG1lbXNldCAoJmRpYWxvZywgMCwgc2l6ZW9mIGRpYWxvZyk7Ci0JICAgICAgZGlhbG9nLnggPSAkNTsKLQkgICAgICBkaWFsb2cueSA9ICQ2OwotCSAgICAgIGRpYWxvZy53aWR0aCA9ICQ3OwotCSAgICAgIGRpYWxvZy5oZWlnaHQgPSAkODsKLQkgICAgICBkaWFsb2cuc3R5bGUgPSBXU19QT1BVUCB8IFdTX0JPUkRFUiB8IFdTX1NZU01FTlU7Ci0JICAgICAgZGlhbG9nLmV4c3R5bGUgPSAkNDsKLQkgICAgICBkaWFsb2cubWVudS5uYW1lZCA9IDE7Ci0JICAgICAgZGlhbG9nLmNsYXNzLm5hbWVkID0gMTsKLQkgICAgICBkaWFsb2cuZm9udCA9IE5VTEw7Ci0JICAgICAgZGlhbG9nLmV4ID0gTlVMTDsKLQkgICAgICBkaWFsb2cuY29udHJvbHMgPSBOVUxMOwotCSAgICAgIHN1Yl9yZXNfaW5mbyA9ICQzOwotCSAgICB9Ci0JICAgIHN0eWxlcyBCRUcgY29udHJvbHMgRU5ECi0JICB7Ci0JICAgIGRlZmluZV9kaWFsb2cgKCQxLCAmc3ViX3Jlc19pbmZvLCAmZGlhbG9nKTsKLQkgIH0KLQl8IGlkIERJQUxPR0VYIG1lbWZsYWdzX21vdmUgZXhzdHlsZSBwb3NudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGNudW1leHByCi0JICAgIHsKLQkgICAgICBtZW1zZXQgKCZkaWFsb2csIDAsIHNpemVvZiBkaWFsb2cpOwotCSAgICAgIGRpYWxvZy54ID0gJDU7Ci0JICAgICAgZGlhbG9nLnkgPSAkNjsKLQkgICAgICBkaWFsb2cud2lkdGggPSAkNzsKLQkgICAgICBkaWFsb2cuaGVpZ2h0ID0gJDg7Ci0JICAgICAgZGlhbG9nLnN0eWxlID0gV1NfUE9QVVAgfCBXU19CT1JERVIgfCBXU19TWVNNRU5VOwotCSAgICAgIGRpYWxvZy5leHN0eWxlID0gJDQ7Ci0JICAgICAgZGlhbG9nLm1lbnUubmFtZWQgPSAxOwotCSAgICAgIGRpYWxvZy5jbGFzcy5uYW1lZCA9IDE7Ci0JICAgICAgZGlhbG9nLmZvbnQgPSBOVUxMOwotCSAgICAgIGRpYWxvZy5leCA9ICgoc3RydWN0IGRpYWxvZ19leCAqKQotCQkJICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCBkaWFsb2dfZXgpKSk7Ci0JICAgICAgbWVtc2V0IChkaWFsb2cuZXgsIDAsIHNpemVvZiAoc3RydWN0IGRpYWxvZ19leCkpOwotCSAgICAgIGRpYWxvZy5jb250cm9scyA9IE5VTEw7Ci0JICAgICAgc3ViX3Jlc19pbmZvID0gJDM7Ci0JICAgIH0KLQkgICAgc3R5bGVzIEJFRyBjb250cm9scyBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX2RpYWxvZyAoJDEsICZzdWJfcmVzX2luZm8sICZkaWFsb2cpOwotCSAgfQotCXwgaWQgRElBTE9HRVggbWVtZmxhZ3NfbW92ZSBleHN0eWxlIHBvc251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgICAgY251bWV4cHIgY251bWV4cHIKLQkgICAgewotCSAgICAgIG1lbXNldCAoJmRpYWxvZywgMCwgc2l6ZW9mIGRpYWxvZyk7Ci0JICAgICAgZGlhbG9nLnggPSAkNTsKLQkgICAgICBkaWFsb2cueSA9ICQ2OwotCSAgICAgIGRpYWxvZy53aWR0aCA9ICQ3OwotCSAgICAgIGRpYWxvZy5oZWlnaHQgPSAkODsKLQkgICAgICBkaWFsb2cuc3R5bGUgPSBXU19QT1BVUCB8IFdTX0JPUkRFUiB8IFdTX1NZU01FTlU7Ci0JICAgICAgZGlhbG9nLmV4c3R5bGUgPSAkNDsKLQkgICAgICBkaWFsb2cubWVudS5uYW1lZCA9IDE7Ci0JICAgICAgZGlhbG9nLmNsYXNzLm5hbWVkID0gMTsKLQkgICAgICBkaWFsb2cuZm9udCA9IE5VTEw7Ci0JICAgICAgZGlhbG9nLmV4ID0gKChzdHJ1Y3QgZGlhbG9nX2V4ICopCi0JCQkgICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IGRpYWxvZ19leCkpKTsKLQkgICAgICBtZW1zZXQgKGRpYWxvZy5leCwgMCwgc2l6ZW9mIChzdHJ1Y3QgZGlhbG9nX2V4KSk7Ci0JICAgICAgZGlhbG9nLmV4LT5oZWxwID0gJDk7Ci0JICAgICAgZGlhbG9nLmNvbnRyb2xzID0gTlVMTDsKLQkgICAgICBzdWJfcmVzX2luZm8gPSAkMzsKLQkgICAgfQotCSAgICBzdHlsZXMgQkVHIGNvbnRyb2xzIEVORAotCSAgewotCSAgICBkZWZpbmVfZGlhbG9nICgkMSwgJnN1Yl9yZXNfaW5mbywgJmRpYWxvZyk7Ci0JICB9Ci0JOwotCi1leHN0eWxlOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSAwOwotCSAgfQotCXwgRVhTVFlMRSAnPScgbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQzOwotCSAgfQotCTsKLQotc3R5bGVzOgotCSAgLyogZW1wdHkgKi8KLQl8IHN0eWxlcyBDQVBUSU9OIFFVT1RFRFNUUklORwotCSAgewotCSAgICB1bmljb2RlX2Zyb21fYXNjaWkgKChpbnQgKikgTlVMTCwgJmRpYWxvZy5jYXB0aW9uLCAkMyk7Ci0JICB9Ci0JfCBzdHlsZXMgQ0xBU1MgaWQKLQkgIHsKLQkgICAgZGlhbG9nLmNsYXNzID0gJDM7Ci0JICB9Ci0JfCBzdHlsZXMgU1RZTEUKLQkgICAgeyBzdHlsZSA9IGRpYWxvZy5zdHlsZTsgfQotCSAgICBzdHlsZWV4cHIKLQkgIHsKLQkgICAgZGlhbG9nLnN0eWxlID0gc3R5bGU7Ci0JICB9Ci0JfCBzdHlsZXMgRVhTVFlMRSBudW1leHByCi0JICB7Ci0JICAgIGRpYWxvZy5leHN0eWxlID0gJDM7Ci0JICB9Ci0JfCBzdHlsZXMgRk9OVCBudW1leHByICcsJyBRVU9URURTVFJJTkcKLQkgIHsKLQkgICAgZGlhbG9nLnN0eWxlIHw9IERTX1NFVEZPTlQ7Ci0JICAgIGRpYWxvZy5wb2ludHNpemUgPSAkMzsKLQkgICAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZkaWFsb2cuZm9udCwgJDUpOwotCSAgfQotCXwgc3R5bGVzIEZPTlQgbnVtZXhwciAnLCcgUVVPVEVEU1RSSU5HIGNudW1leHByIGNudW1leHByCi0JICB7Ci0JICAgIGRpYWxvZy5zdHlsZSB8PSBEU19TRVRGT05UOwotCSAgICBkaWFsb2cucG9pbnRzaXplID0gJDM7Ci0JICAgIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmZGlhbG9nLmZvbnQsICQ1KTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiZXh0ZW5kZWQgRk9OVCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZGlhbG9nLmV4LT53ZWlnaHQgPSAkNjsKLQkJZGlhbG9nLmV4LT5pdGFsaWMgPSAkNzsKLQkgICAgICB9Ci0JICB9Ci0JfCBzdHlsZXMgTUVOVSBpZAotCSAgewotCSAgICBkaWFsb2cubWVudSA9ICQzOwotCSAgfQotCXwgc3R5bGVzIENIQVJBQ1RFUklTVElDUyBudW1leHByCi0JICB7Ci0JICAgIHN1Yl9yZXNfaW5mby5jaGFyYWN0ZXJpc3RpY3MgPSAkMzsKLQkgIH0KLQl8IHN0eWxlcyBMQU5HVUFHRSBudW1leHByIGNudW1leHByCi0JICB7Ci0JICAgIHN1Yl9yZXNfaW5mby5sYW5ndWFnZSA9ICQzIHwgKCQ0IDw8IDgpOwotCSAgfQotCXwgc3R5bGVzIFZFUlNJT05LIG51bWV4cHIKLQkgIHsKLQkgICAgc3ViX3Jlc19pbmZvLnZlcnNpb24gPSAkMzsKLQkgIH0KLQk7Ci0KLWNvbnRyb2xzOgotCSAgLyogZW1wdHkgKi8KLQl8IGNvbnRyb2xzIGNvbnRyb2wKLQkgIHsKLQkgICAgc3RydWN0IGRpYWxvZ19jb250cm9sICoqcHA7Ci0KLQkgICAgZm9yIChwcCA9ICZkaWFsb2cuY29udHJvbHM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQkgICAgICA7Ci0JICAgICpwcCA9ICQyOwotCSAgfQotCTsKLQotY29udHJvbDoKLQkgIEFVVE8zU1RBVEUKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19BVVRPM1NUQVRFIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfQVVUTzNTVEFURTsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IEFVVE9DSEVDS0JPWAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEJTX0FVVE9DSEVDS0JPWDsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IEFVVE9SQURJT0JVVFRPTgotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEJTX0FVVE9SQURJT0JVVFRPTjsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IEJFRElUCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gRVNfTEVGVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGNsYXNzID0gQ1RMX0VESVQ7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiSUVESVQgcmVxdWlyZXMgRElBTE9HRVgiKSk7Ci0JICAgIHJlc19zdHJpbmdfdG9faWQgKCYkJC0+Y2xhc3MsICJCRURJVCIpOwotCSAgfQotCXwgQ0hFQ0tCT1gKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19DSEVDS0JPWCB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEJTX0NIRUNLQk9YIHwgV1NfVEFCU1RPUDsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IENPTUJPQk9YCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gQ0JTX1NJTVBMRSB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IDA7Ci0JICAgICAgY2xhc3MgPSBDVExfQ09NQk9CT1g7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IENPTlRST0wgb3B0c3RyaW5nYyBudW1leHByIGNudW1leHByIGNvbnRyb2xfc3R5bGVleHByIGNudW1leHByCi0JICAgIGNudW1leHByIGNudW1leHByIGNudW1leHByIG9wdGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDIsICQzLCAkNiwgJDcsICQ4LCAkOSwgJDQsIHN0eWxlLCAkMTApOwotCSAgICBpZiAoJDExICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAoZGlhbG9nLmV4ID09IE5VTEwpCi0JCSAgcmNwYXJzZV93YXJuaW5nIChfKCJjb250cm9sIGRhdGEgcmVxdWlyZXMgRElBTE9HRVgiKSk7Ci0JCSQkLT5kYXRhID0gJDExOwotCSAgICAgIH0KLQkgIH0KLQl8IENPTlRST0wgb3B0c3RyaW5nYyBudW1leHByIGNudW1leHByIGNvbnRyb2xfc3R5bGVleHByIGNudW1leHByCi0JICAgIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDIsICQzLCAkNiwgJDcsICQ4LCAkOSwgJDQsIHN0eWxlLCAkMTApOwotCSAgICBpZiAoZGlhbG9nLmV4ID09IE5VTEwpCi0JICAgICAgcmNwYXJzZV93YXJuaW5nIChfKCJoZWxwIElEIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCSAgICAkJC0+aGVscCA9ICQxMTsKLQkgICAgJCQtPmRhdGEgPSAkMTI7Ci0JICB9Ci0JfCBDT05UUk9MIG9wdHN0cmluZ2MgbnVtZXhwciAnLCcgUVVPVEVEU1RSSU5HIGNvbnRyb2xfc3R5bGVleHByCi0JICAgIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIG9wdGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDIsICQzLCAkNywgJDgsICQ5LCAkMTAsIDAsIHN0eWxlLCAkMTEpOwotCSAgICBpZiAoJDEyICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAoZGlhbG9nLmV4ID09IE5VTEwpCi0JCSAgcmNwYXJzZV93YXJuaW5nICgiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIik7Ci0JCSQkLT5kYXRhID0gJDEyOwotCSAgICAgIH0KLQkgICAgJCQtPmNsYXNzLm5hbWVkID0gMTsKLSAgCSAgICB1bmljb2RlX2Zyb21fYXNjaWkoJiQkLT5jbGFzcy51Lm4ubGVuZ3RoLCAmJCQtPmNsYXNzLnUubi5uYW1lLCAkNSk7Ci0JICB9Ci0JfCBDT05UUk9MIG9wdHN0cmluZ2MgbnVtZXhwciAnLCcgUVVPVEVEU1RSSU5HIGNvbnRyb2xfc3R5bGVleHByCi0JICAgIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDIsICQzLCAkNywgJDgsICQ5LCAkMTAsIDAsIHN0eWxlLCAkMTEpOwotCSAgICBpZiAoZGlhbG9nLmV4ID09IE5VTEwpCi0JICAgICAgcmNwYXJzZV93YXJuaW5nICgiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpOwotCSAgICAkJC0+aGVscCA9ICQxMjsKLQkgICAgJCQtPmRhdGEgPSAkMTM7Ci0JICAgICQkLT5jbGFzcy5uYW1lZCA9IDE7Ci0gIAkgICAgdW5pY29kZV9mcm9tX2FzY2lpKCYkJC0+Y2xhc3MudS5uLmxlbmd0aCwgJiQkLT5jbGFzcy51Lm4ubmFtZSwgJDUpOwotCSAgfQotCXwgQ1RFWFQKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBTU19DRU5URVIgfCBXU19HUk9VUDsKLQkgICAgICBiYXNlX3N0eWxlID0gU1NfQ0VOVEVSOwotCSAgICAgIGNsYXNzID0gQ1RMX1NUQVRJQzsKLQkgICAgfQotCSAgICBjb250cm9sX3BhcmFtcwotCSAgewotCSAgICAkJCA9ICQzOwotCSAgfQotCXwgREVGUFVTSEJVVFRPTgotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX0RFRlBVU0hCVVRUT04gfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19ERUZQVVNIQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IEVESVRURVhUCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gRVNfTEVGVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGNsYXNzID0gQ1RMX0VESVQ7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IEdST1VQQk9YCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gQlNfR1JPVVBCT1g7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEJTX0dST1VQQk9YOwotCSAgICAgIGNsYXNzID0gQ1RMX0JVVFRPTjsKLQkgICAgfQotCSAgICBjb250cm9sX3BhcmFtcwotCSAgewotCSAgICAkJCA9ICQzOwotCSAgfQotCXwgSEVESVQKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gRVNfTEVGVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfRURJVDsKLQkgICAgfQotCSAgICBjb250cm9sX3BhcmFtcwotCSAgewotCSAgICAkJCA9ICQzOwotCSAgICBpZiAoZGlhbG9nLmV4ID09IE5VTEwpCi0JICAgICAgcmNwYXJzZV93YXJuaW5nIChfKCJJRURJVCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgcmVzX3N0cmluZ190b19pZCAoJiQkLT5jbGFzcywgIkhFRElUIik7Ci0JICB9Ci0JfCBJQ09OIG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDQsICQ1LCAwLCAwLCBDVExfU1RBVElDLAotCQkJCSBTU19JQ09OIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFLCAwKTsKLQkgICAgaWYgKCQ2ICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAoZGlhbG9nLmV4ID09IE5VTEwpCi0JCSAgcmNwYXJzZV93YXJuaW5nIChfKCJjb250cm9sIGRhdGEgcmVxdWlyZXMgRElBTE9HRVgiKSk7Ci0JCSQkLT5kYXRhID0gJDY7Ci0JICAgICAgfQotCSAgfQotCXwgSUNPTiBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgICAgaWNvbl9zdHlsZWV4cHIgb3B0Y251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotICAgIAkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDIsICQzLCAkNCwgJDUsICQ2LCAkNywgQ1RMX1NUQVRJQywKLQkJCQkgc3R5bGUsICQ5KTsKLQkgICAgaWYgKCQxMCAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQxMDsKLQkgICAgICB9Ci0JICB9Ci0JfCBJQ09OIG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwcgotCSAgICBpY29uX3N0eWxlZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0gICAgCSAgICAkJCA9IGRlZmluZV9jb250cm9sICgkMiwgJDMsICQ0LCAkNSwgJDYsICQ3LCBDVExfU1RBVElDLAotCQkJCSBzdHlsZSwgJDkpOwotCSAgICBpZiAoZGlhbG9nLmV4ID09IE5VTEwpCi0JICAgICAgcmNwYXJzZV93YXJuaW5nIChfKCJoZWxwIElEIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCSAgICAkJC0+aGVscCA9ICQxMDsKLQkgICAgJCQtPmRhdGEgPSAkMTE7Ci0JICB9Ci0JfCBJRURJVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBjbGFzcyA9IENUTF9FRElUOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICAgIGlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oIklFRElUIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCSAgICByZXNfc3RyaW5nX3RvX2lkICgmJCQtPmNsYXNzLCAiSUVESVQiKTsKLQkgIH0KLQl8IExJU1RCT1gKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBMQlNfTk9USUZZIHwgV1NfQk9SREVSOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBMQlNfTk9USUZZIHwgV1NfQk9SREVSOwotCSAgICAgIGNsYXNzID0gQ1RMX0xJU1RCT1g7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IExURVhUCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gU1NfTEVGVCB8IFdTX0dST1VQOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBTU19MRUZUOwotCSAgICAgIGNsYXNzID0gQ1RMX1NUQVRJQzsKLQkgICAgfQotCSAgICBjb250cm9sX3BhcmFtcwotCSAgewotCSAgICAkJCA9ICQzOwotCSAgfQotCXwgUFVTSEJPWAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX1BVU0hCT1ggfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19QVVNIQk9YOwotCSAgICAgIGNsYXNzID0gQ1RMX0JVVFRPTjsKLQkgICAgfQotCSAgICBjb250cm9sX3BhcmFtcwotCSAgewotCSAgICAkJCA9ICQzOwotCSAgfQotCXwgUFVTSEJVVFRPTgotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IFJBRElPQlVUVE9OCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gQlNfUkFESU9CVVRUT04gfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19SQURJT0JVVFRPTjsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IFJURVhUCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gU1NfUklHSFQgfCBXU19HUk9VUDsKLQkgICAgICBiYXNlX3N0eWxlID0gU1NfUklHSFQ7Ci0JICAgICAgY2xhc3MgPSBDVExfU1RBVElDOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBTQ1JPTExCQVIKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBTQlNfSE9SWjsKLQkgICAgICBiYXNlX3N0eWxlID0gMDsKLQkgICAgICBjbGFzcyA9IENUTF9TQ1JPTExCQVI7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IFNUQVRFMwotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTXzNTVEFURSB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEJTXzNTVEFURTsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IFVTRVJCVVRUT04gUVVPVEVEU1RSSU5HICcsJyBudW1leHByICcsJyBudW1leHByICcsJyBudW1leHByICcsJwotCSAgICBudW1leHByICcsJyBudW1leHByICcsJyAKLQkgICAgeyBzdHlsZSA9IFdTX0NISUxEIHwgV1NfVklTSUJMRTsgfQotCSAgICBzdHlsZWV4cHIgb3B0Y251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDIsICQ0LCAkNiwgJDgsICQxMCwgJDEyLCBDVExfQlVUVE9OLAotCQkJCSBzdHlsZSwgJDE2KTsKLQkgIH0KLQk7Ci0KLS8qIFBhcmFtZXRlcnMgZm9yIGEgY29udHJvbC4gIFRoZSBzdGF0aWMgdmFyaWFibGVzIERFRkFVTFRfU1RZTEUsCi0gICBCQVNFX1NUWUxFLCBhbmQgQ0xBU1MgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBub250ZXJtaW5hbAotICAgaXMgdXNlZC4gIERFRkFVTFRfU1RZTEUgaXMgdGhlIHN0eWxlIHRvIHVzZSBpZiBubyBzdHlsZSBleHByZXNzaW9uCi0gICBpcyBzcGVjaWZpZWQuICBCQVNFX1NUWUxFIGlzIHRoZSBiYXNlIHN0eWxlIHRvIHVzZSBpZiBhIHN0eWxlCi0gICBleHByZXNzaW9uIGlzIHNwZWNpZmllZDsgdGhlIHN0eWxlIGV4cHJlc3Npb24gbW9kaWZpZXMgdGhlIGJhc2UKLSAgIHN0eWxlLiAgQ0xBU1MgaXMgdGhlIGNsYXNzIG9mIHRoZSBjb250cm9sLiAgKi8KLQotY29udHJvbF9wYXJhbXM6Ci0JICBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgICAgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotCSAgICAkJCA9IGRlZmluZV9jb250cm9sICgkMSwgJDIsICQzLCAkNCwgJDUsICQ2LCBjbGFzcywKLQkJCQkgZGVmYXVsdF9zdHlsZSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSwgMCk7Ci0JICAgIGlmICgkNyAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQ3OwotCSAgICAgIH0KLQkgIH0KLQl8IG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwcgotCSAgICBjb250cm9sX3BhcmFtc19zdHlsZWV4cHIgb3B0Y251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotCSAgICAkJCA9IGRlZmluZV9jb250cm9sICgkMSwgJDIsICQzLCAkNCwgJDUsICQ2LCBjbGFzcywgc3R5bGUsICQ4KTsKLQkgICAgaWYgKCQ5ICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAoZGlhbG9nLmV4ID09IE5VTEwpCi0JCSAgcmNwYXJzZV93YXJuaW5nIChfKCJjb250cm9sIGRhdGEgcmVxdWlyZXMgRElBTE9HRVgiKSk7Ci0JCSQkLT5kYXRhID0gJDk7Ci0JICAgICAgfQotCSAgfQotCXwgb3B0c3RyaW5nYyBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGNvbnRyb2xfcGFyYW1zX3N0eWxlZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQxLCAkMiwgJDMsICQ0LCAkNSwgJDYsIGNsYXNzLCBzdHlsZSwgJDgpOwotCSAgICBpZiAoZGlhbG9nLmV4ID09IE5VTEwpCi0JICAgICAgcmNwYXJzZV93YXJuaW5nIChfKCJoZWxwIElEIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCSAgICAkJC0+aGVscCA9ICQ5OwotCSAgICAkJC0+ZGF0YSA9ICQxMDsKLQkgIH0KLQk7Ci0KLW9wdHN0cmluZ2M6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IE5VTEw7Ci0JICB9Ci0JfCBRVU9URURTVFJJTkcgJywnCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi1vcHRfY29udHJvbF9kYXRhOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgQkVHIG9wdHJjZGF0YV9kYXRhIEVORAotCSAgewotCSAgICAkJCA9ICQyLmZpcnN0OwotCSAgfQotCTsKLQotLyogVGhlc2Ugb25seSBleGlzdCB0byBwYXJzZSBhIHJlZHVjdGlvbiBvdXQgb2YgYSBjb21tb24gY2FzZS4gICovCi0KLWNvbnRyb2xfc3R5bGVleHByOgotCSAgJywnCi0JICB7IHN0eWxlID0gV1NfQ0hJTEQgfCBXU19WSVNJQkxFOyB9Ci0JICBzdHlsZWV4cHIKLQk7Ci0KLWljb25fc3R5bGVleHByOgotCSAgJywnCi0JICB7IHN0eWxlID0gU1NfSUNPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRTsgfQotCSAgc3R5bGVleHByCi0JOwotCi1jb250cm9sX3BhcmFtc19zdHlsZWV4cHI6Ci0JICAnLCcKLQkgIHsgc3R5bGUgPSBiYXNlX3N0eWxlIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFOyB9Ci0JICBzdHlsZWV4cHIKLQk7Ci0KLS8qIEZvbnQgcmVzb3VyY2VzLiAgKi8KLQotZm9udDoKLQkgIGlkIEZPTlQgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIGZpbGVfbmFtZQotCSAgewotCSAgICBkZWZpbmVfZm9udCAoJDEsICYkMywgJDQpOwotCSAgfQotCTsKLQotLyogSWNvbiByZXNvdXJjZXMuICAqLwotCi1pY29uOgotCSAgaWQgSUNPTiBtZW1mbGFnc19tb3ZlX2Rpc2NhcmQgZmlsZV9uYW1lCi0JICB7Ci0JICAgIGRlZmluZV9pY29uICgkMSwgJiQzLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBMYW5ndWFnZSBjb21tYW5kLiAgVGhpcyBjaGFuZ2VzIHRoZSBzdGF0aWMgdmFyaWFibGUgbGFuZ3VhZ2UsIHdoaWNoCi0gICBhZmZlY3RzIGFsbCBzdWJzZXF1ZW50IHJlc291cmNlcy4gICovCi0KLWxhbmd1YWdlOgotCSAgTEFOR1VBR0UgbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICBsYW5ndWFnZSA9ICQyIHwgKCQzIDw8IDgpOwotCSAgfQotCTsKLQotLyogTWVudSByZXNvdXJjZXMuICAqLwotCi1tZW51OgotCSAgaWQgTUVOVSBzdWJvcHRpb25zIEJFRyBtZW51aXRlbXMgRU5ECi0JICB7Ci0JICAgIGRlZmluZV9tZW51ICgkMSwgJiQzLCAkNSk7Ci0JICB9Ci0JOwotCi1tZW51aXRlbXM6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IE5VTEw7Ci0JICB9Ci0JfCBtZW51aXRlbXMgbWVudWl0ZW0KLQkgIHsKLQkgICAgaWYgKCQxID09IE5VTEwpCi0JICAgICAgJCQgPSAkMjsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RydWN0IG1lbnVpdGVtICoqcHA7Ci0KLQkJZm9yIChwcCA9ICYkMS0+bmV4dDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCQkgIDsKLQkJKnBwID0gJDI7Ci0JCSQkID0gJDE7Ci0JICAgICAgfQotCSAgfQotCTsKLQotbWVudWl0ZW06Ci0JICBNRU5VSVRFTSBRVU9URURTVFJJTkcgY251bWV4cHIgbWVudWl0ZW1fZmxhZ3MKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgJDQsIDAsIDAsIE5VTEwpOwotCSAgfQotCXwgTUVOVUlURU0gU0VQQVJBVE9SCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtIChOVUxMLCAwLCAwLCAwLCAwLCBOVUxMKTsKLQkgIH0KLQl8IFBPUFVQIFFVT1RFRFNUUklORyBtZW51aXRlbV9mbGFncyBCRUcgbWVudWl0ZW1zIEVORAotCSAgewotCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoJDIsIDAsICQzLCAwLCAwLCAkNSk7Ci0JICB9Ci0JOwotCi1tZW51aXRlbV9mbGFnczoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gMDsKLQkgIH0KLQl8IG1lbnVpdGVtX2ZsYWdzICcsJyBtZW51aXRlbV9mbGFnCi0JICB7Ci0JICAgICQkID0gJDEgfCAkMzsKLQkgIH0KLQl8IG1lbnVpdGVtX2ZsYWdzIG1lbnVpdGVtX2ZsYWcKLQkgIHsKLQkgICAgJCQgPSAkMSB8ICQyOwotCSAgfQotCTsKLQotbWVudWl0ZW1fZmxhZzoKLQkgIENIRUNLRUQKLQkgIHsKLQkgICAgJCQgPSBNRU5VSVRFTV9DSEVDS0VEOwotCSAgfQotCXwgR1JBWUVECi0JICB7Ci0JICAgICQkID0gTUVOVUlURU1fR1JBWUVEOwotCSAgfQotCXwgSEVMUAotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX0hFTFA7Ci0JICB9Ci0JfCBJTkFDVElWRQotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX0lOQUNUSVZFOwotCSAgfQotCXwgTUVOVUJBUkJSRUFLCi0JICB7Ci0JICAgICQkID0gTUVOVUlURU1fTUVOVUJBUkJSRUFLOwotCSAgfQotCXwgTUVOVUJSRUFLCi0JICB7Ci0JICAgICQkID0gTUVOVUlURU1fTUVOVUJSRUFLOwotCSAgfQotCTsKLQotLyogTWVudWV4IHJlc291cmNlcy4gICovCi0KLW1lbnVleDoKLQkgIGlkIE1FTlVFWCBzdWJvcHRpb25zIEJFRyBtZW51ZXhpdGVtcyBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX21lbnUgKCQxLCAmJDMsICQ1KTsKLQkgIH0KLQk7Ci0KLW1lbnVleGl0ZW1zOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgbWVudWV4aXRlbXMgbWVudWV4aXRlbQotCSAgewotCSAgICBpZiAoJDEgPT0gTlVMTCkKLQkgICAgICAkJCA9ICQyOwotCSAgICBlbHNlCi0JICAgICAgewotCQlzdHJ1Y3QgbWVudWl0ZW0gKipwcDsKLQotCQlmb3IgKHBwID0gJiQxLT5uZXh0OyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JCSAgOwotCQkqcHAgPSAkMjsKLQkJJCQgPSAkMTsKLQkgICAgICB9Ci0JICB9Ci0JOwotCi1tZW51ZXhpdGVtOgotCSAgTUVOVUlURU0gUVVPVEVEU1RSSU5HCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgMCwgMCwgMCwgMCwgTlVMTCk7Ci0JICB9Ci0JfCBNRU5VSVRFTSBRVU9URURTVFJJTkcgY251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgMCwgMCwgMCwgTlVMTCk7Ci0JICB9Ci0JfCBNRU5VSVRFTSBRVU9URURTVFJJTkcgY251bWV4cHIgY251bWV4cHIgb3B0Y251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgJDQsICQ1LCAwLCBOVUxMKTsKLQkgIH0KLSAJfCBNRU5VSVRFTSBTRVBBUkFUT1IKLSAJICB7Ci0gCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoTlVMTCwgMCwgMCwgMCwgMCwgTlVMTCk7Ci0gCSAgfQotCXwgUE9QVVAgUVVPVEVEU1RSSU5HIEJFRyBtZW51ZXhpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAwLCAwLCAwLCAwLCAkNCk7Ci0JICB9Ci0JfCBQT1BVUCBRVU9URURTVFJJTkcgY251bWV4cHIgQkVHIG1lbnVleGl0ZW1zIEVORAotCSAgewotCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoJDIsICQzLCAwLCAwLCAwLCAkNSk7Ci0JICB9Ci0JfCBQT1BVUCBRVU9URURTVFJJTkcgY251bWV4cHIgY251bWV4cHIgQkVHIG1lbnVleGl0ZW1zIEVORAotCSAgewotCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoJDIsICQzLCAkNCwgMCwgMCwgJDYpOwotCSAgfQotCXwgUE9QVVAgUVVPVEVEU1RSSU5HIGNudW1leHByIGNudW1leHByIGNudW1leHByIG9wdGNudW1leHByCi0JICAgIEJFRyBtZW51ZXhpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgJDQsICQ1LCAkNiwgJDgpOwotCSAgfQotCTsKLQotLyogTWVzc2FnZXRhYmxlIHJlc291cmNlcy4gICovCi0KLW1lc3NhZ2V0YWJsZToKLQkgIGlkIE1FU1NBR0VUQUJMRSBtZW1mbGFnc19tb3ZlIGZpbGVfbmFtZQotCSAgewotCSAgICBkZWZpbmVfbWVzc2FnZXRhYmxlICgkMSwgJiQzLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBSY2RhdGEgcmVzb3VyY2VzLiAgKi8KLQotcmNkYXRhOgotCSAgaWQgUkNEQVRBIHN1Ym9wdGlvbnMgQkVHIG9wdHJjZGF0YV9kYXRhIEVORAotCSAgewotCSAgICBkZWZpbmVfcmNkYXRhICgkMSwgJiQzLCAkNS5maXJzdCk7Ci0JICB9Ci0JOwotCi0vKiBXZSB1c2UgYSBkaWZmZXJlbnQgbGV4aW5nIGFsZ29yaXRobSwgYmVjYXVzZSByY2RhdGEgc3RyaW5ncyBtYXkKLSAgIGNvbnRhaW4gZW1iZWRkZWQgbnVsbCBieXRlcywgYW5kIHdlIG5lZWQgdG8ga25vdyB0aGUgbGVuZ3RoIHRvIHVzZS4gICovCi0KLW9wdHJjZGF0YV9kYXRhOgotCSAgewotCSAgICByY3BhcnNlX3JjZGF0YSAoKTsKLQkgIH0KLQkgIG9wdHJjZGF0YV9kYXRhX2ludAotCSAgewotCSAgICByY3BhcnNlX25vcm1hbCAoKTsKLQkgICAgJCQgPSAkMjsKLQkgIH0KLQk7Ci0KLW9wdHJjZGF0YV9kYXRhX2ludDoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkLmZpcnN0ID0gTlVMTDsKLQkgICAgJCQubGFzdCA9IE5VTEw7Ci0JICB9Ci0JfCByY2RhdGFfZGF0YQotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotcmNkYXRhX2RhdGE6Ci0JICBTSVpFRFNUUklORwotCSAgewotCSAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOwotCi0JICAgIHJpID0gZGVmaW5lX3JjZGF0YV9zdHJpbmcgKCQxLnMsICQxLmxlbmd0aCk7Ci0JICAgICQkLmZpcnN0ID0gcmk7Ci0JICAgICQkLmxhc3QgPSByaTsKLQkgIH0KLQl8IHNpemVkbnVtZXhwcgotCSAgewotCSAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOwotCi0JICAgIHJpID0gZGVmaW5lX3JjZGF0YV9udW1iZXIgKCQxLnZhbCwgJDEuZHdvcmQpOwotCSAgICAkJC5maXJzdCA9IHJpOwotCSAgICAkJC5sYXN0ID0gcmk7Ci0JICB9Ci0JfCByY2RhdGFfZGF0YSAnLCcgU0laRURTVFJJTkcKLQkgIHsKLQkgICAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotCSAgICByaSA9IGRlZmluZV9yY2RhdGFfc3RyaW5nICgkMy5zLCAkMy5sZW5ndGgpOwotCSAgICAkJC5maXJzdCA9ICQxLmZpcnN0OwotCSAgICAkMS5sYXN0LT5uZXh0ID0gcmk7Ci0JICAgICQkLmxhc3QgPSByaTsKLQkgIH0KLQl8IHJjZGF0YV9kYXRhICcsJyBzaXplZG51bWV4cHIKLQkgIHsKLQkgICAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotCSAgICByaSA9IGRlZmluZV9yY2RhdGFfbnVtYmVyICgkMy52YWwsICQzLmR3b3JkKTsKLQkgICAgJCQuZmlyc3QgPSAkMS5maXJzdDsKLQkgICAgJDEubGFzdC0+bmV4dCA9IHJpOwotCSAgICAkJC5sYXN0ID0gcmk7Ci0JICB9Ci0JOwotCi0vKiBTdHJpbmd0YWJsZSByZXNvdXJjZXMuICAqLwotCi1zdHJpbmd0YWJsZToKLQkgIFNUUklOR1RBQkxFIHN1Ym9wdGlvbnMgQkVHIAotCSAgICB7IHN1Yl9yZXNfaW5mbyA9ICQyOyB9Ci0JICAgIHN0cmluZ19kYXRhIEVORAotCTsKLQotc3RyaW5nX2RhdGE6Ci0JICAvKiBlbXB0eSAqLwotCXwgc3RyaW5nX2RhdGEgbnVtZXhwciBRVU9URURTVFJJTkcKLQkgIHsKLQkgICAgZGVmaW5lX3N0cmluZ3RhYmxlICgmc3ViX3Jlc19pbmZvLCAkMiwgJDMpOwotCSAgfQotCXwgc3RyaW5nX2RhdGEgbnVtZXhwciAnLCcgUVVPVEVEU1RSSU5HCi0JICB7Ci0JICAgIGRlZmluZV9zdHJpbmd0YWJsZSAoJnN1Yl9yZXNfaW5mbywgJDIsICQ0KTsKLQkgIH0KLQk7Ci0KLS8qIFVzZXIgZGVmaW5lZCByZXNvdXJjZXMuICBXZSBhY2NlcHQgZ2VuZXJhbCBzdWJvcHRpb25zIGluIHRoZQotICAgZmlsZV9uYW1lIGNhc2UgdG8ga2VlcCB0aGUgcGFyc2VyIGhhcHB5LiAgKi8KLQotdXNlcjoKLQkgIGlkIGlkIHN1Ym9wdGlvbnMgQkVHIG9wdHJjZGF0YV9kYXRhIEVORAotCSAgewotCSAgICBkZWZpbmVfdXNlcl9kYXRhICgkMSwgJDIsICYkMywgJDUuZmlyc3QpOwotCSAgfQotCXwgaWQgaWQgc3Vib3B0aW9ucyBmaWxlX25hbWUKLQkgIHsKLQkgICAgZGVmaW5lX3VzZXJfZmlsZSAoJDEsICQyLCAmJDMsICQ0KTsKLQkgIH0KLQk7Ci0KLS8qIFZlcnNpb25pbmZvIHJlc291cmNlcy4gICovCi0KLXZlcnNpb25pbmZvOgotCSAgaWQgVkVSU0lPTklORk8gZml4ZWR2ZXJpbmZvIEJFRyB2ZXJibG9ja3MgRU5ECi0JICB7Ci0JICAgIGRlZmluZV92ZXJzaW9uaW5mbyAoJDEsIGxhbmd1YWdlLCAkMywgJDUpOwotCSAgfQotCTsKLQotZml4ZWR2ZXJpbmZvOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSAoKHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbyAqKQotCQkgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8pKSk7Ci0JICAgIG1lbXNldCAoJCQsIDAsIHNpemVvZiAoc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvKSk7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRVZFUlNJT04gbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICAkMS0+ZmlsZV92ZXJzaW9uX21zID0gKCQzIDw8IDE2KSB8ICQ0OwotCSAgICAkMS0+ZmlsZV92ZXJzaW9uX2xzID0gKCQ1IDw8IDE2KSB8ICQ2OwotCSAgICAkJCA9ICQxOwotCSAgfQotCXwgZml4ZWR2ZXJpbmZvIFBST0RVQ1RWRVJTSU9OIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgIHsKLQkgICAgJDEtPnByb2R1Y3RfdmVyc2lvbl9tcyA9ICgkMyA8PCAxNikgfCAkNDsKLQkgICAgJDEtPnByb2R1Y3RfdmVyc2lvbl9scyA9ICgkNSA8PCAxNikgfCAkNjsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGZpeGVkdmVyaW5mbyBGSUxFRkxBR1NNQVNLIG51bWV4cHIKLQkgIHsKLQkgICAgJDEtPmZpbGVfZmxhZ3NfbWFzayA9ICQzOwotCSAgICAkJCA9ICQxOwotCSAgfQotCXwgZml4ZWR2ZXJpbmZvIEZJTEVGTEFHUyBudW1leHByCi0JICB7Ci0JICAgICQxLT5maWxlX2ZsYWdzID0gJDM7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRU9TIG51bWV4cHIKLQkgIHsKLQkgICAgJDEtPmZpbGVfb3MgPSAkMzsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGZpeGVkdmVyaW5mbyBGSUxFVFlQRSBudW1leHByCi0JICB7Ci0JICAgICQxLT5maWxlX3R5cGUgPSAkMzsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGZpeGVkdmVyaW5mbyBGSUxFU1VCVFlQRSBudW1leHByCi0JICB7Ci0JICAgICQxLT5maWxlX3N1YnR5cGUgPSAkMzsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLS8qIFRvIGhhbmRsZSB2ZXJibG9ja3Mgc3VjY2Vzc2Z1bGx5LCB0aGUgbGV4ZXIgaGFuZGxlcyBCTE9DSwotICAgc3BlY2lhbGx5LiAgQSBCTE9DSyAiU3RyaW5nRmlsZUluZm8iIGlzIHJldHVybmVkIGFzCi0gICBCTE9DS1NUUklOR0ZJTEVJTkZPLiAgQSBCTE9DSyAiVmFyRmlsZUluZm8iIGlzIHJldHVybmVkIGFzCi0gICBCTE9DS1ZBUkZJTEVJTkZPLiAgQSBCTE9DSyB3aXRoIHNvbWUgb3RoZXIgc3RyaW5nIHJldHVybnMgQkxPQ0sKLSAgIHdpdGggdGhlIHN0cmluZyBhcyB0aGUgdmFsdWUuICAqLwotCi12ZXJibG9ja3M6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IE5VTEw7Ci0JICB9Ci0JfCB2ZXJibG9ja3MgQkxPQ0tTVFJJTkdGSUxFSU5GTyBCRUcgQkxPQ0sgQkVHIHZlcnZhbHMgRU5EIEVORAotCSAgewotCSAgICAkJCA9IGFwcGVuZF92ZXJfc3RyaW5nZmlsZWluZm8gKCQxLCAkNCwgJDYpOwotCSAgfQotCXwgdmVyYmxvY2tzIEJMT0NLVkFSRklMRUlORk8gQkVHIFZBTFVFIFFVT1RFRFNUUklORyB2ZXJ0cmFucyBFTkQKLQkgIHsKLQkgICAgJCQgPSBhcHBlbmRfdmVyX3ZhcmZpbGVpbmZvICgkMSwgJDUsICQ2KTsKLQkgIH0KLQk7Ci0KLXZlcnZhbHM6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IE5VTEw7Ci0JICB9Ci0JfCB2ZXJ2YWxzIFZBTFVFIFFVT1RFRFNUUklORyAnLCcgUVVPVEVEU1RSSU5HCi0JICB7Ci0JICAgICQkID0gYXBwZW5kX3ZlcnZhbCAoJDEsICQzLCAkNSk7Ci0JICB9Ci0JOwotCi12ZXJ0cmFuczoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IHZlcnRyYW5zIGNudW1leHByIGNudW1leHByCi0JICB7Ci0JICAgICQkID0gYXBwZW5kX3ZlcnRyYW5zICgkMSwgJDIsICQzKTsKLQkgIH0KLQk7Ci0KLS8qIEEgcmVzb3VyY2UgSUQuICAqLwotCi1pZDoKLQkgIHBvc251bWV4cHIKLQkgIHsKLQkgICAgJCQubmFtZWQgPSAwOwotCSAgICAkJC51LmlkID0gJDE7Ci0JICB9Ci0JfCBTVFJJTkcKLQkgIHsKLQkgICAgY2hhciAqY29weSwgKnM7Ci0KLQkgICAgLyogSXQgc2VlbXMgdGhhdCByZXNvdXJjZSBJRCdzIGFyZSBmb3JjZWQgdG8gdXBwZXIgY2FzZS4gICovCi0JICAgIGNvcHkgPSB4c3RyZHVwICgkMSk7Ci0JICAgIGZvciAocyA9IGNvcHk7ICpzICE9ICdcMCc7IHMrKykKLQkgICAgICBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJKnMgPSB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgKnMpOwotCSAgICByZXNfc3RyaW5nX3RvX2lkICgmJCQsIGNvcHkpOwotCSAgICBmcmVlIChjb3B5KTsKLQkgIH0KLQk7Ci0KLS8qIEdlbmVyaWMgc3Vib3B0aW9ucy4gIFRoZXNlIG1heSBhcHBlYXIgYmVmb3JlIHRoZSBCRUdJTiBpbiBhbnkKLSAgIG11bHRpbGluZSBzdGF0ZW1lbnQuICAqLwotCi1zdWJvcHRpb25zOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgbWVtc2V0ICgmJCQsIDAsIHNpemVvZiAoc3RydWN0IHJlc19yZXNfaW5mbykpOwotCSAgICAkJC5sYW5ndWFnZSA9IGxhbmd1YWdlOwotCSAgICAvKiBGSVhNRTogSXMgdGhpcyB0aGUgcmlnaHQgZGVmYXVsdD8gICovCi0JICAgICQkLm1lbWZsYWdzID0gTUVNRkxBR19NT1ZFQUJMRTsKLQkgIH0KLQl8IHN1Ym9wdGlvbnMgbWVtZmxhZwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgICAkJC5tZW1mbGFncyB8PSAkMi5vbjsKLQkgICAgJCQubWVtZmxhZ3MgJj1+ICQyLm9mZjsKLQkgIH0KLQl8IHN1Ym9wdGlvbnMgQ0hBUkFDVEVSSVNUSUNTIG51bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQuY2hhcmFjdGVyaXN0aWNzID0gJDM7Ci0JICB9Ci0JfCBzdWJvcHRpb25zIExBTkdVQUdFIG51bWV4cHIgY251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQubGFuZ3VhZ2UgPSAkMyB8ICgkNCA8PCA4KTsKLQkgIH0KLQl8IHN1Ym9wdGlvbnMgVkVSU0lPTksgbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQxOwotCSAgICAkJC52ZXJzaW9uID0gJDM7Ci0JICB9Ci0JOwotCi0vKiBNZW1vcnkgZmxhZ3Mgd2hpY2ggZGVmYXVsdCB0byBNT1ZFQUJMRSBhbmQgRElTQ0FSREFCTEUuICAqLwotCi1tZW1mbGFnc19tb3ZlX2Rpc2NhcmQ6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICBtZW1zZXQgKCYkJCwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc19pbmZvKSk7Ci0JICAgICQkLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0JICAgICQkLm1lbWZsYWdzID0gTUVNRkxBR19NT1ZFQUJMRSB8IE1FTUZMQUdfRElTQ0FSREFCTEU7Ci0JICB9Ci0JfCBtZW1mbGFnc19tb3ZlX2Rpc2NhcmQgbWVtZmxhZwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgICAkJC5tZW1mbGFncyB8PSAkMi5vbjsKLQkgICAgJCQubWVtZmxhZ3MgJj1+ICQyLm9mZjsKLQkgIH0KLQk7Ci0KLS8qIE1lbW9yeSBmbGFncyB3aGljaCBkZWZhdWx0IHRvIE1PVkVBQkxFLiAgKi8KLQotbWVtZmxhZ3NfbW92ZToKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgIG1lbXNldCAoJiQkLCAwLCBzaXplb2YgKHN0cnVjdCByZXNfcmVzX2luZm8pKTsKLQkgICAgJCQubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLQkgICAgJCQubWVtZmxhZ3MgPSBNRU1GTEFHX01PVkVBQkxFOwotCSAgfQotCXwgbWVtZmxhZ3NfbW92ZSBtZW1mbGFnCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICAgICQkLm1lbWZsYWdzIHw9ICQyLm9uOwotCSAgICAkJC5tZW1mbGFncyAmPX4gJDIub2ZmOwotCSAgfQotCTsKLQotLyogTWVtb3J5IGZsYWdzLiAgVGhpcyByZXR1cm5zIGEgc3RydWN0IHdpdGggdHdvIGludGVnZXJzLCBiZWNhdXNlIHdlCi0gICBzb21ldGltZXMgd2FudCB0byBzZXQgYml0cyBhbmQgd2Ugc29tZXRpbWVzIHdhbnQgdG8gY2xlYXIgdGhlbS4gICovCi0KLW1lbWZsYWc6Ci0JICBNT1ZFQUJMRQotCSAgewotCSAgICAkJC5vbiA9IE1FTUZMQUdfTU9WRUFCTEU7Ci0JICAgICQkLm9mZiA9IDA7Ci0JICB9Ci0JfCBGSVhFRAotCSAgewotCSAgICAkJC5vbiA9IDA7Ci0JICAgICQkLm9mZiA9IE1FTUZMQUdfTU9WRUFCTEU7Ci0JICB9Ci0JfCBQVVJFCi0JICB7Ci0JICAgICQkLm9uID0gTUVNRkxBR19QVVJFOwotCSAgICAkJC5vZmYgPSAwOwotCSAgfQotCXwgSU1QVVJFCi0JICB7Ci0JICAgICQkLm9uID0gMDsKLQkgICAgJCQub2ZmID0gTUVNRkxBR19QVVJFOwotCSAgfQotCXwgUFJFTE9BRAotCSAgewotCSAgICAkJC5vbiA9IE1FTUZMQUdfUFJFTE9BRDsKLQkgICAgJCQub2ZmID0gMDsKLQkgIH0KLQl8IExPQURPTkNBTEwKLQkgIHsKLQkgICAgJCQub24gPSAwOwotCSAgICAkJC5vZmYgPSBNRU1GTEFHX1BSRUxPQUQ7Ci0JICB9Ci0JfCBESVNDQVJEQUJMRQotCSAgewotCSAgICAkJC5vbiA9IE1FTUZMQUdfRElTQ0FSREFCTEU7Ci0JICAgICQkLm9mZiA9IDA7Ci0JICB9Ci0JOwotCi0vKiBBIGZpbGUgbmFtZS4gICovCi0KLWZpbGVfbmFtZToKLQkgIFFVT1RFRFNUUklORwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCXwgU1RSSU5HCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi0vKiBBIHN0eWxlIGV4cHJlc3Npb24uICBUaGlzIGNoYW5nZXMgdGhlIHN0YXRpYyB2YXJpYWJsZSBTVFlMRS4gIFdlIGRvCi0gICBpdCB0aGlzIHdheSBiZWNhdXNlIHJjIGFwcGVhcnMgdG8gcGVybWl0IGEgc3R5bGUgdG8gYmUgc2V0IHRvCi0gICBzb21ldGhpbmcgbGlrZQotICAgICAgIFdTX0dST1VQIHwgTk9UIFdTX1RBQlNUT1AKLSAgIHRvIG1lYW4gdGhhdCBhIGRlZmF1bHQgb2YgV1NfVEFCU1RPUCBzaG91bGQgYmUgcmVtb3ZlZC4gIEFueXRoaW5nCi0gICB3aGljaCB3YW50cyB0byBhY2NlcHQgYSBzdHlsZSBtdXN0IGZpcnN0IHNldCBTVFlMRSB0byB0aGUgZGVmYXVsdAotICAgdmFsdWUuICBUaGUgc3R5bGVleHByIG5vbnRlcm1pbmFsIHdpbGwgY2hhbmdlIFNUWUxFIGFzIHNwZWNpZmllZCBieQotICAgdGhlIHVzZXIuICBOb3RlIHRoYXQgd2UgZG8gbm90IGFjY2VwdCBhcmJpdHJhcnkgZXhwcmVzc2lvbnMgaGVyZSwKLSAgIGp1c3QgbnVtYmVycyBzZXBhcmF0ZWQgYnkgJ3wnLiAgKi8KLQotc3R5bGVleHByOgotCSAgcGFyZW5udW1iZXIKLQkgIHsKLQkgICAgc3R5bGUgfD0gJDE7Ci0JICB9Ci0JfCBOT1QgcGFyZW5udW1iZXIKLQkgIHsKLQkgICAgc3R5bGUgJj1+ICQyOwotCSAgfQotCXwgc3R5bGVleHByICd8JyBwYXJlbm51bWJlcgotCSAgewotCSAgICBzdHlsZSB8PSAkMzsKLQkgIH0KLQl8IHN0eWxlZXhwciAnfCcgTk9UIHBhcmVubnVtYmVyCi0JICB7Ci0JICAgIHN0eWxlICY9fiAkNDsKLQkgIH0KLQk7Ci0KLXBhcmVubnVtYmVyOgotCSAgTlVNQkVSCi0JICB7Ci0JICAgICQkID0gJDEudmFsOwotCSAgfQotCXwgJygnIG51bWV4cHIgJyknCi0JICB7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JOwotCi0vKiBBbiBvcHRpb25hbCBleHByZXNzaW9uIHdpdGggYSBsZWFkaW5nIGNvbW1hLiAgKi8KLQotb3B0Y251bWV4cHI6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IDA7Ci0JICB9Ci0JfCBjbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotLyogQW4gZXhwcmVzc2lvbiB3aXRoIGEgbGVhZGluZyBjb21tYS4gICovCi0KLWNudW1leHByOgotCSAgJywnIG51bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMjsKLQkgIH0KLQk7Ci0KLS8qIEEgcG9zc2libHkgbmVnYXRlZCBudW1lcmljIGV4cHJlc3Npb24uICAqLwotCi1udW1leHByOgotCSAgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkID0gJDEudmFsOwotCSAgfQotCTsKLQotLyogQSBwb3NzaWJseSBuZWdhdGVkIGV4cHJlc3Npb24gd2l0aCBhIHNpemUuICAqLwotCi1zaXplZG51bWV4cHI6Ci0JICBOVU1CRVIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8ICcoJyBzaXplZG51bWV4cHIgJyknCi0JICB7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JfCAnficgc2l6ZWRudW1leHByICVwcmVjICd+JwotCSAgewotCSAgICAkJC52YWwgPSB+ICQyLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMi5kd29yZDsKLQkgIH0KLQl8ICctJyBzaXplZG51bWV4cHIgJXByZWMgTkVHCi0JICB7Ci0JICAgICQkLnZhbCA9IC0gJDIudmFsOwotCSAgICAkJC5kd29yZCA9ICQyLmR3b3JkOwotCSAgfQotCXwgc2l6ZWRudW1leHByICcqJyBzaXplZG51bWV4cHIKLQkgIHsKLQkgICAgJCQudmFsID0gJDEudmFsICogJDMudmFsOwotCSAgICAkJC5kd29yZCA9ICQxLmR3b3JkIHx8ICQzLmR3b3JkOwotCSAgfQotCXwgc2l6ZWRudW1leHByICcvJyBzaXplZG51bWV4cHIKLQkgIHsKLQkgICAgJCQudmFsID0gJDEudmFsIC8gJDMudmFsOwotCSAgICAkJC5kd29yZCA9ICQxLmR3b3JkIHx8ICQzLmR3b3JkOwotCSAgfQotCXwgc2l6ZWRudW1leHByICclJyBzaXplZG51bWV4cHIKLQkgIHsKLQkgICAgJCQudmFsID0gJDEudmFsICUgJDMudmFsOwotCSAgICAkJC5kd29yZCA9ICQxLmR3b3JkIHx8ICQzLmR3b3JkOwotCSAgfQotCXwgc2l6ZWRudW1leHByICcrJyBzaXplZG51bWV4cHIKLQkgIHsKLQkgICAgJCQudmFsID0gJDEudmFsICsgJDMudmFsOwotCSAgICAkJC5kd29yZCA9ICQxLmR3b3JkIHx8ICQzLmR3b3JkOwotCSAgfQotCXwgc2l6ZWRudW1leHByICctJyBzaXplZG51bWV4cHIKLQkgIHsKLQkgICAgJCQudmFsID0gJDEudmFsIC0gJDMudmFsOwotCSAgICAkJC5kd29yZCA9ICQxLmR3b3JkIHx8ICQzLmR3b3JkOwotCSAgfQotCXwgc2l6ZWRudW1leHByICcmJyBzaXplZG51bWV4cHIKLQkgIHsKLQkgICAgJCQudmFsID0gJDEudmFsICYgJDMudmFsOwotCSAgICAkJC5kd29yZCA9ICQxLmR3b3JkIHx8ICQzLmR3b3JkOwotCSAgfQotCXwgc2l6ZWRudW1leHByICdeJyBzaXplZG51bWV4cHIKLQkgIHsKLQkgICAgJCQudmFsID0gJDEudmFsIF4gJDMudmFsOwotCSAgICAkJC5kd29yZCA9ICQxLmR3b3JkIHx8ICQzLmR3b3JkOwotCSAgfQotCXwgc2l6ZWRudW1leHByICd8JyBzaXplZG51bWV4cHIKLQkgIHsKLQkgICAgJCQudmFsID0gJDEudmFsIHwgJDMudmFsOwotCSAgICAkJC5kd29yZCA9ICQxLmR3b3JkIHx8ICQzLmR3b3JkOwotCSAgfQotCTsKLQotLyogQW4gZXhwcmVzc2lvbiB3aXRoIGEgbGVhZGluZyBjb21tYSB3aGljaCBkb2VzIG5vdCB1c2UgdW5hcnkKLSAgIG5lZ2F0aW9uLiAgKi8KLQotY3Bvc251bWV4cHI6Ci0JICAnLCcgcG9zbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCTsKLQotLyogQW4gZXhwcmVzc2lvbiB3aGljaCBkb2VzIG5vdCB1c2UgdW5hcnkgbmVnYXRpb24uICAqLwotCi1wb3NudW1leHByOgotCSAgc2l6ZWRwb3NudW1leHByCi0JICB7Ci0JICAgICQkID0gJDEudmFsOwotCSAgfQotCTsKLQotLyogQW4gZXhwcmVzc2lvbiB3aGljaCBkb2VzIG5vdCB1c2UgdW5hcnkgbmVnYXRpb24uICBXZSBzZXBhcmF0ZSB1bmFyeQotICAgbmVnYXRpb24gdG8gYXZvaWQgcGFyc2luZyBjb25mbGljdHMgd2hlbiB0d28gbnVtZXJpYyBleHByZXNzaW9ucwotICAgYXBwZWFyIGNvbnNlY3V0aXZlbHkuICAqLwotCi1zaXplZHBvc251bWV4cHI6Ci0JICBOVU1CRVIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8ICcoJyBzaXplZG51bWV4cHIgJyknCi0JICB7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JfCAnficgc2l6ZWRudW1leHByICVwcmVjICd+JwotCSAgewotCSAgICAkJC52YWwgPSB+ICQyLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMi5kd29yZDsKLQkgIH0KLQl8IHNpemVkcG9zbnVtZXhwciAnKicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAqICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkcG9zbnVtZXhwciAnLycgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAvICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkcG9zbnVtZXhwciAnJScgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAlICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkcG9zbnVtZXhwciAnKycgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCArICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkcG9zbnVtZXhwciAnLScgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAtICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkcG9zbnVtZXhwciAnJicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAmICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkcG9zbnVtZXhwciAnXicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCBeICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkcG9zbnVtZXhwciAnfCcgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCB8ICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQk7Ci0KLSUlCi0KLS8qIFNldCB0aGUgbGFuZ3VhZ2UgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLQotdm9pZAotcmNwYXJzZV9zZXRfbGFuZ3VhZ2UgKGxhbmcpCi0gICAgIGludCBsYW5nOwotewotICBsYW5ndWFnZSA9IGxhbmc7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZGNvZmYuYyBiL2JpbnV0aWxzL3JkY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWVlNmU2Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3JkY29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsODg5ICswLDAgQEAKLS8qIHN0YWJzLmMgLS0gUGFyc2UgQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgY29kZSB3aGljaCBwYXJzZXMgQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlbWFuZ2xlLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotCi0vKiBGSVhNRTogV2Ugc2hvdWxkIG5vdCBuZWVkIHRoaXMgQkZEIGludGVybmFsIGZpbGUuICBXZSBuZWVkIGl0IGZvcgotICAgdGhlIE5fQlRNQVNLLCBldGMuLCB2YWx1ZXMuICAqLwotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhlc2UgbWFjcm9zIGV4dHJhY3QgdGhlIHJpZ2h0IG1hc2sgYW5kIHNoaWZ0cyBmb3IgdGhpcyBCRkQuICBUaGV5Ci0gICBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIGxvY2FsIHZhcmlhYmxlIG5hbWVkIEFCRkQuICBUaGlzIGlzIHNvIHRoYXQKLSAgIG1hY3JvcyBsaWtlIElTRkNOIGFuZCBERUNSRUYsIGZyb20gY29mZi9pbnRlcm5hbC5oLCB3aWxsIHdvcmsKLSAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLiAgKi8KLSNkZWZpbmUgTl9CVE1BU0sgKGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fYnRtYXNrKQotI2RlZmluZQlOX0JUU0hGVCAoY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl9idHNoZnQpCi0jZGVmaW5lCU5fVE1BU0sgIChjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX3RtYXNrKQotI2RlZmluZQlOX1RTSElGVCAoY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90c2hpZnQpCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCB0aGUgc3ltYm9scywgYXMgd2VsbCBhcyB0aGUgY3VycmVudAotICAgbG9jYXRpb24gd2l0aGluIHRoZSBzeW1ib2xzLiAgKi8KLQotc3RydWN0IGNvZmZfc3ltYm9scwotewotICAvKiBUaGUgc3ltYm9scy4gICovCi0gIGFzeW1ib2wgKipzeW1zOwotICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMuICAqLwotICBsb25nIHN5bWNvdW50OwotICAvKiBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgc3ltYm9sLiAgKi8KLSAgbG9uZyBzeW1ubzsKLSAgLyogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHN5bWJvbCBpbiB0aGUgQ09GRiBzeW1ib2wgdGFibGUgKHdoZXJlCi0gICAgIGVhY2ggYXV4ZW50IGNvdW50cyBhcyBhIHN5bWJvbCkuICAqLwotICBsb25nIGNvZmZfc3ltbm87Ci19OwotCi0vKiBUaGUgbGFyZ2VzdCBiYXNpYyB0eXBlIHdlIGFyZSBwcmVwYXJlZCB0byBoYW5kbGUuICAqLwotCi0jZGVmaW5lIFRfTUFYIChUX0xOR0RCTCkKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIHNsb3RzLiAgKi8KLQotc3RydWN0IGNvZmZfc2xvdHMKLXsKLSAgLyogTmV4dCBzZXQgb2Ygc2xvdHMuICAqLwotICBzdHJ1Y3QgY29mZl9zbG90cyAqbmV4dDsKLSAgLyogU2xvdHMuICAqLwotI2RlZmluZSBDT0ZGX1NMT1RTICgxNikKLSAgZGVidWdfdHlwZSBzbG90c1tDT0ZGX1NMT1RTXTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWFwIHN5bWJvbCBpbmRpY2VzIHRvIHR5cGVzLiAgKi8KLQotc3RydWN0IGNvZmZfdHlwZXMKLXsKLSAgLyogU2xvdHMuICAqLwotICBzdHJ1Y3QgY29mZl9zbG90cyAqc2xvdHM7Ci0gIC8qIEJhc2ljIHR5cGVzLiAgKi8KLSAgZGVidWdfdHlwZSBiYXNpY1tUX01BWCArIDFdOwotfTsKLQotc3RhdGljIGRlYnVnX3R5cGUgKmNvZmZfZ2V0X3Nsb3QgUEFSQU1TICgoc3RydWN0IGNvZmZfdHlwZXMgKiwgaW50KSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9jb2ZmX3R5cGUKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKiwgc3RydWN0IGNvZmZfdHlwZXMgKiwgbG9uZywgaW50LAotCSAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqLCBib29sZWFuLCBQVFIpKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHBhcnNlX2NvZmZfYmFzZV90eXBlCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9zeW1ib2xzICosIHN0cnVjdCBjb2ZmX3R5cGVzICosIGxvbmcsIGludCwKLQkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgUFRSKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9jb2ZmX3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9zeW1ib2xzICosIHN0cnVjdCBjb2ZmX3R5cGVzICosIGludCwKLQkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgUFRSKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9jb2ZmX2VudW1fdHlwZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfc3ltYm9scyAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLAotCSAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX2NvZmZfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLCBhc3ltYm9sICosIGxvbmcsCi0JICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBQVFIsIGRlYnVnX3R5cGUsIGJvb2xlYW4pKTsKLQwKLS8qIFJldHVybiB0aGUgc2xvdCBmb3IgYSB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUgKgotY29mZl9nZXRfc2xvdCAodHlwZXMsIGluZHgpCi0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKLSAgICAgaW50IGluZHg7Ci17Ci0gIHN0cnVjdCBjb2ZmX3Nsb3RzICoqcHBzOwotCi0gIHBwcyA9ICZ0eXBlcy0+c2xvdHM7Ci0KLSAgd2hpbGUgKGluZHggPj0gQ09GRl9TTE9UUykKLSAgICB7Ci0gICAgICBpZiAoKnBwcyA9PSBOVUxMKQotCXsKLQkgICpwcHMgPSAoc3RydWN0IGNvZmZfc2xvdHMgKikgeG1hbGxvYyAoc2l6ZW9mICoqcHBzKTsKLQkgIG1lbXNldCAoKnBwcywgMCwgc2l6ZW9mICoqcHBzKTsKLQl9Ci0gICAgICBwcHMgPSAmKCpwcHMpLT5uZXh0OwotICAgICAgaW5keCAtPSBDT0ZGX1NMT1RTOwotICAgIH0KLQotICBpZiAoKnBwcyA9PSBOVUxMKQotICAgIHsKLSAgICAgICpwcHMgPSAoc3RydWN0IGNvZmZfc2xvdHMgKikgeG1hbGxvYyAoc2l6ZW9mICoqcHBzKTsKLSAgICAgIG1lbXNldCAoKnBwcywgMCwgc2l6ZW9mICoqcHBzKTsKLSAgICB9Ci0KLSAgcmV0dXJuICgqcHBzKS0+c2xvdHMgKyBpbmR4OwotfQotCi0vKiBQYXJzZSBhIENPRkYgdHlwZSBjb2RlIGluIE5UWVBFLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIGNvZmZfc3ltbm8sIG50eXBlLCBwYXV4ZW50LCB1c2VhdXgsCi0JCSBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKLSAgICAgbG9uZyBjb2ZmX3N5bW5vOwotICAgICBpbnQgbnR5cGU7Ci0gICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcGF1eGVudDsKLSAgICAgYm9vbGVhbiB1c2VhdXg7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBkZWJ1Z190eXBlIHR5cGU7Ci0KLSAgaWYgKChudHlwZSAmIH5OX0JUTUFTSykgIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgbmV3dHlwZTsKLQotICAgICAgbmV3dHlwZSA9IERFQ1JFRiAobnR5cGUpOwotCi0gICAgICBpZiAoSVNQVFIgKG50eXBlKSkKLQl7Ci0JICB0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgY29mZl9zeW1ubywgbmV3dHlwZSwKLQkJCQkgIHBhdXhlbnQsIHVzZWF1eCwgZGhhbmRsZSk7Ci0JICB0eXBlID0gZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKGRoYW5kbGUsIHR5cGUpOwotCX0KLSAgICAgIGVsc2UgaWYgKElTRkNOIChudHlwZSkpCi0JewotCSAgdHlwZSA9IHBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIGNvZmZfc3ltbm8sIG5ld3R5cGUsCi0JCQkJICBwYXV4ZW50LCB1c2VhdXgsIGRoYW5kbGUpOwotCSAgdHlwZSA9IGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAoZGhhbmRsZSwgdHlwZSwgKGRlYnVnX3R5cGUgKikgTlVMTCwKLQkJCQkJICAgZmFsc2UpOwotCX0KLSAgICAgIGVsc2UgaWYgKElTQVJZIChudHlwZSkpCi0JewotCSAgaW50IG47Ci0KLQkgIGlmIChwYXV4ZW50ID09IE5VTEwpCi0JICAgIG4gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgc2hvcnQgKmRpbTsKLQkgICAgICBpbnQgaTsKLQotCSAgICAgIC8qIEZJWE1FOiBJZiBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5sID09IDAsIGdkYiBzZXRzCi0gICAgICAgICAgICAgICAgIHRoZSBjX25hdXggZmllbGQgb2YgdGhlIHN5bWVudCB0byAwLiAgKi8KLQotCSAgICAgIC8qIE1vdmUgdGhlIGRpbWVuc2lvbnMgZG93biwgc28gdGhhdCB0aGUgbmV4dCBhcnJheQotICAgICAgICAgICAgICAgICBwaWNrcyB1cCB0aGUgbmV4dCBvbmUuICAqLwotCSAgICAgIGRpbSA9IHBhdXhlbnQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW47Ci0JICAgICAgbiA9IGRpbVswXTsKLQkgICAgICBmb3IgKGkgPSAwOyAqZGltICE9IDAgJiYgaSA8IERJTU5VTSAtIDE7IGkrKywgZGltKyspCi0JCSpkaW0gPSAqKGRpbSArIDEpOwotCSAgICAgICpkaW0gPSAwOwotCSAgICB9Ci0KLQkgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBuZXd0eXBlLAotCQkJCSAgcGF1eGVudCwgZmFsc2UsIGRoYW5kbGUpOwotCSAgdHlwZSA9IGRlYnVnX21ha2VfYXJyYXlfdHlwZSAoZGhhbmRsZSwgdHlwZSwKLQkJCQkJcGFyc2VfY29mZl9iYXNlX3R5cGUgKGFiZmQsIHN5bWJvbHMsCi0JCQkJCQkJICAgICAgdHlwZXMsCi0JCQkJCQkJICAgICAgY29mZl9zeW1ubywKLQkJCQkJCQkgICAgICBUX0lOVCwKLQkJCQkJCQkgICAgICBOVUxMLCBkaGFuZGxlKSwKLQkJCQkJMCwgbiAtIDEsIGZhbHNlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogcGFyc2VfY29mZl90eXBlOiBCYWQgdHlwZSBjb2RlIDB4JXhcbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIG50eXBlKTsKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JfQotCi0gICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgaWYgKHBhdXhlbnQgIT0gTlVMTCAmJiBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5sID4gMCkKLSAgICB7Ci0gICAgICBkZWJ1Z190eXBlICpzbG90OwotCi0gICAgICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIHR5cGUuICBGSVhNRTogZ2RiIGNoZWNrcwotCSB0aGF0IHRoZSBjbGFzcyBpcyBub3QgQ19TVFJUQUcsIG5vciBDX1VOVEFHLCBub3IgQ19FTlRBRy4gICovCi0gICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIHBhdXhlbnQtPnhfc3ltLnhfdGFnbmR4LmwpOwotICAgICAgaWYgKCpzbG90ICE9IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gKnNsb3Q7Ci0gICAgICBlbHNlCi0JcmV0dXJuIGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgc2xvdCwgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBhdXggZW50cnkgaGFzIGFscmVhZHkgYmVlbiB1c2VkIGZvciBzb21ldGhpbmcsIHVzZWF1eCB3aWxsCi0gICAgIGhhdmUgYmVlbiBzZXQgdG8gZmFsc2UsIGluZGljYXRpbmcgdGhhdCBwYXJzZV9jb2ZmX2Jhc2VfdHlwZQotICAgICBzaG91bGQgbm90IHVzZSBpdC4gIFdlIG5lZWQgdG8gZG8gaXQgdGhpcyB3YXksIHJhdGhlciB0aGFuIHNpbXBseQotICAgICBwYXNzaW5nIHBhdXhlbnQgYXMgTlVMTCwgYmVjYXVzZSB3ZSBuZWVkIHRvIGJlIGFibGUgaGFuZGxlCi0gICAgIG11bHRpcGxlIGFycmF5IGRpbWVuc2lvbnMgd2hpbGUgc3RpbGwgZGlzY2FyZGluZyBwYXV4ZW50IGFmdGVyCi0gICAgIGhhdmluZyBoYW5kbGVkIGFsbCBvZiB0aGVtLiAgKi8KLSAgaWYgKCEgdXNlYXV4KQotICAgIHBhdXhlbnQgPSBOVUxMOwotCi0gIHJldHVybiBwYXJzZV9jb2ZmX2Jhc2VfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIGNvZmZfc3ltbm8sIG50eXBlLAotCQkJICAgICAgIHBhdXhlbnQsIGRoYW5kbGUpOwotfQotCi0vKiBQYXJzZSBhIGJhc2ljIENPRkYgdHlwZSBpbiBOVFlQRS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9jb2ZmX2Jhc2VfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIGNvZmZfc3ltbm8sIG50eXBlLCBwYXV4ZW50LAotCQkgICAgICBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKLSAgICAgbG9uZyBjb2ZmX3N5bW5vOwotICAgICBpbnQgbnR5cGU7Ci0gICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcGF1eGVudDsKLSAgICAgUFRSIGRoYW5kbGU7Ci17Ci0gIGRlYnVnX3R5cGUgcmV0OwotICBib29sZWFuIHNldF9iYXNpYzsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgZGVidWdfdHlwZSAqc2xvdDsKLQotICBpZiAobnR5cGUgPj0gMAotICAgICAgJiYgbnR5cGUgPD0gVF9NQVgKLSAgICAgICYmIHR5cGVzLT5iYXNpY1tudHlwZV0gIT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiB0eXBlcy0+YmFzaWNbbnR5cGVdOwotCi0gIHNldF9iYXNpYyA9IHRydWU7Ci0gIG5hbWUgPSBOVUxMOwotCi0gIHN3aXRjaCAobnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXQgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9OVUxMOgotICAgIGNhc2UgVF9WT0lEOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgbmFtZSA9ICJ2b2lkIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0NIQVI6Ci0gICAgICByZXQgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gImNoYXIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfU0hPUlQ6Ci0gICAgICByZXQgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gInNob3J0IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0lOVDoKLSAgICAgIC8qIEZJWE1FOiBQZXJoYXBzIHRoZSBzaXplIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAiaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0xPTkc6Ci0gICAgICByZXQgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBuYW1lID0gImxvbmciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfRkxPQVQ6Ci0gICAgICByZXQgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgbmFtZSA9ICJmbG9hdCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9ET1VCTEU6Ci0gICAgICByZXQgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgbmFtZSA9ICJkb3VibGUiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfTE5HREJMOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCAxMik7Ci0gICAgICBuYW1lID0gImxvbmcgZG91YmxlIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1VDSEFSOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGNoYXIiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfVVNIT1JUOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIHNob3J0IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1VJTlQ6Ci0gICAgICByZXQgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1VMT05HOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGxvbmciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfU1RSVUNUOgotICAgICAgaWYgKHBhdXhlbnQgPT0gTlVMTCkKLQlyZXQgPSBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlIChkaGFuZGxlLCB0cnVlLCAwLAotCQkJCSAgICAgIChkZWJ1Z19maWVsZCAqKSBOVUxMKTsKLSAgICAgIGVsc2UKLQlyZXQgPSBwYXJzZV9jb2ZmX3N0cnVjdF90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgbnR5cGUsIHBhdXhlbnQsCi0JCQkJICAgICAgZGhhbmRsZSk7Ci0KLSAgICAgIHNsb3QgPSBjb2ZmX2dldF9zbG90ICh0eXBlcywgY29mZl9zeW1ubyk7Ci0gICAgICAqc2xvdCA9IHJldDsKLQotICAgICAgc2V0X2Jhc2ljID0gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VTklPTjoKLSAgICAgIGlmIChwYXV4ZW50ID09IE5VTEwpCi0JcmV0ID0gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgZmFsc2UsIDAsIChkZWJ1Z19maWVsZCAqKSBOVUxMKTsKLSAgICAgIGVsc2UKLQlyZXQgPSBwYXJzZV9jb2ZmX3N0cnVjdF90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgbnR5cGUsIHBhdXhlbnQsCi0JCQkJICAgICAgZGhhbmRsZSk7Ci0KLSAgICAgIHNsb3QgPSBjb2ZmX2dldF9zbG90ICh0eXBlcywgY29mZl9zeW1ubyk7Ci0gICAgICAqc2xvdCA9IHJldDsKLQotICAgICAgc2V0X2Jhc2ljID0gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9FTlVNOgotICAgICAgaWYgKHBhdXhlbnQgPT0gTlVMTCkKLQlyZXQgPSBkZWJ1Z19tYWtlX2VudW1fdHlwZSAoZGhhbmRsZSwgKGNvbnN0IGNoYXIgKiopIE5VTEwsCi0JCQkJICAgIChiZmRfc2lnbmVkX3ZtYSAqKSBOVUxMKTsKLSAgICAgIGVsc2UKLQlyZXQgPSBwYXJzZV9jb2ZmX2VudW1fdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIHBhdXhlbnQsIGRoYW5kbGUpOwotCi0gICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotICAgICAgKnNsb3QgPSByZXQ7Ci0KLSAgICAgIHNldF9iYXNpYyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChuYW1lICE9IE5VTEwpCi0gICAgcmV0ID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCByZXQpOwotCi0gIGlmIChzZXRfYmFzaWMKLSAgICAgICYmIG50eXBlID49IDAKLSAgICAgICYmIG50eXBlIDw9IFRfTUFYKQotICAgIHR5cGVzLT5iYXNpY1tudHlwZV0gPSByZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUGFyc2UgYSBzdHJ1Y3QgdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9jb2ZmX3N0cnVjdF90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgbnR5cGUsIHBhdXhlbnQsIGRoYW5kbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9scyAqc3ltYm9sczsKLSAgICAgc3RydWN0IGNvZmZfdHlwZXMgKnR5cGVzOwotICAgICBpbnQgbnR5cGU7Ci0gICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcGF1eGVudDsKLSAgICAgUFRSIGRoYW5kbGU7Ci17Ci0gIGxvbmcgc3ltZW5kOwotICBpbnQgYWxsb2M7Ci0gIGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0gIGludCBjb3VudDsKLSAgYm9vbGVhbiBkb25lOwotCi0gIHN5bWVuZCA9IHBhdXhlbnQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4Lmw7Ci0KLSAgYWxsb2MgPSAxMDsKLSAgZmllbGRzID0gKGRlYnVnX2ZpZWxkICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpmaWVsZHMpOwotICBjb3VudCA9IDA7Ci0KLSAgZG9uZSA9IGZhbHNlOwotICB3aGlsZSAoISBkb25lCi0JICYmIHN5bWJvbHMtPmNvZmZfc3ltbm8gPCBzeW1lbmQKLQkgJiYgc3ltYm9scy0+c3ltbm8gPCBzeW1ib2xzLT5zeW1jb3VudCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBsb25nIHRoaXNfY29mZl9zeW1ubzsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltZW50OwotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eGVudDsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcHN1YmF1eDsKLSAgICAgIGJmZF92bWEgYml0cG9zID0gMCwgYml0c2l6ZSA9IDA7Ci0KLSAgICAgIHN5bSA9IHN5bWJvbHMtPnN5bXNbc3ltYm9scy0+c3ltbm9dOwotCi0gICAgICBpZiAoISBiZmRfY29mZl9nZXRfc3ltZW50IChhYmZkLCBzeW0sICZzeW1lbnQpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF9jb2ZmX2dldF9zeW1lbnQgZmFpbGVkOiAlc1xuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQl9Ci0KLSAgICAgIHRoaXNfY29mZl9zeW1ubyA9IHN5bWJvbHMtPmNvZmZfc3ltbm87Ci0KLSAgICAgICsrc3ltYm9scy0+c3ltbm87Ci0gICAgICBzeW1ib2xzLT5jb2ZmX3N5bW5vICs9IDEgKyBzeW1lbnQubl9udW1hdXg7Ci0KLSAgICAgIGlmIChzeW1lbnQubl9udW1hdXggPT0gMCkKLQlwc3ViYXV4ID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfY29mZl9nZXRfYXV4ZW50IChhYmZkLCBzeW0sIDAsICZhdXhlbnQpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYmZkX2NvZmZfZ2V0X2F1eGVudCBmYWlsZWQ6ICVzXG4iKSwKLQkJICAgICAgIHByb2dyYW1fbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICAgIH0KLQkgIHBzdWJhdXggPSAmYXV4ZW50OwotCX0KLQotICAgICAgc3dpdGNoIChzeW1lbnQubl9zY2xhc3MpCi0JewotCWNhc2UgQ19NT1M6Ci0JY2FzZSBDX01PVToKLQkgIGJpdHBvcyA9IDggKiBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgIGJpdHNpemUgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIENfRklFTEQ6Ci0JICBiaXRwb3MgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgIGJpdHNpemUgPSBhdXhlbnQueF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU7Ci0JICBicmVhazsKLQotCWNhc2UgQ19FT1M6Ci0JICBkb25lID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCEgZG9uZSkKLQl7Ci0JICBkZWJ1Z190eXBlIGZ0eXBlOwotCSAgZGVidWdfZmllbGQgZjsKLQotCSAgZnR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCB0aGlzX2NvZmZfc3ltbm8sCi0JCQkJICAgc3ltZW50Lm5fdHlwZSwgcHN1YmF1eCwgdHJ1ZSwgZGhhbmRsZSk7Ci0JICBmID0gZGVidWdfbWFrZV9maWVsZCAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgZnR5cGUsCi0JCQkJYml0cG9zLCBiaXRzaXplLCBERUJVR19WSVNJQklMSVRZX1BVQkxJQyk7Ci0JICBpZiAoZiA9PSBERUJVR19GSUVMRF9OVUxMKQotCSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0JICBpZiAoY291bnQgKyAxID49IGFsbG9jKQotCSAgICB7Ci0JICAgICAgYWxsb2MgKz0gMTA7Ci0JICAgICAgZmllbGRzID0gKChkZWJ1Z19maWVsZCAqKQotCQkJeHJlYWxsb2MgKGZpZWxkcywgYWxsb2MgKiBzaXplb2YgKmZpZWxkcykpOwotCSAgICB9Ci0KLQkgIGZpZWxkc1tjb3VudF0gPSBmOwotCSAgKytjb3VudDsKLQl9Ci0gICAgfQotCi0gIGZpZWxkc1tjb3VudF0gPSBERUJVR19GSUVMRF9OVUxMOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlIChkaGFuZGxlLCBudHlwZSA9PSBUX1NUUlVDVCwKLQkJCQkgcGF1eGVudC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUsCi0JCQkJIGZpZWxkcyk7Ci19Ci0KLS8qIFBhcnNlIGFuIGVudW0gdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9jb2ZmX2VudW1fdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIHBhdXhlbnQsIGRoYW5kbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9scyAqc3ltYm9sczsKLSAgICAgc3RydWN0IGNvZmZfdHlwZXMgKnR5cGVzIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcGF1eGVudDsKLSAgICAgUFRSIGRoYW5kbGU7Ci17Ci0gIGxvbmcgc3ltZW5kOwotICBpbnQgYWxsb2M7Ci0gIGNvbnN0IGNoYXIgKipuYW1lczsKLSAgYmZkX3NpZ25lZF92bWEgKnZhbHM7Ci0gIGludCBjb3VudDsKLSAgYm9vbGVhbiBkb25lOwotCi0gIHN5bWVuZCA9IHBhdXhlbnQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4Lmw7Ci0KLSAgYWxsb2MgPSAxMDsKLSAgbmFtZXMgPSAoY29uc3QgY2hhciAqKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKm5hbWVzKTsKLSAgdmFscyA9IChiZmRfc2lnbmVkX3ZtYSAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqdmFscyk7Ci0gIGNvdW50ID0gMDsKLQotICBkb25lID0gZmFsc2U7Ci0gIHdoaWxlICghIGRvbmUKLQkgJiYgc3ltYm9scy0+Y29mZl9zeW1ubyA8IHN5bWVuZAotCSAmJiBzeW1ib2xzLT5zeW1ubyA8IHN5bWJvbHMtPnN5bWNvdW50KQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltZW50OwotCi0gICAgICBzeW0gPSBzeW1ib2xzLT5zeW1zW3N5bWJvbHMtPnN5bW5vXTsKLQotICAgICAgaWYgKCEgYmZkX2NvZmZfZ2V0X3N5bWVudCAoYWJmZCwgc3ltLCAmc3ltZW50KSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfY29mZl9nZXRfc3ltZW50IGZhaWxlZDogJXNcbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JfQotCi0gICAgICArK3N5bWJvbHMtPnN5bW5vOwotICAgICAgc3ltYm9scy0+Y29mZl9zeW1ubyArPSAxICsgc3ltZW50Lm5fbnVtYXV4OwotCi0gICAgICBzd2l0Y2ggKHN5bWVudC5uX3NjbGFzcykKLQl7Ci0JY2FzZSBDX01PRToKLQkgIGlmIChjb3VudCArIDEgPj0gYWxsb2MpCi0JICAgIHsKLQkgICAgICBhbGxvYyArPSAxMDsKLQkgICAgICBuYW1lcyA9ICgoY29uc3QgY2hhciAqKikKLQkJICAgICAgIHhyZWFsbG9jIChuYW1lcywgYWxsb2MgKiBzaXplb2YgKm5hbWVzKSk7Ci0JICAgICAgdmFscyA9ICgoYmZkX3NpZ25lZF92bWEgKikKLQkJICAgICAgeHJlYWxsb2MgKHZhbHMsIGFsbG9jICogc2l6ZW9mICp2YWxzKSk7Ci0JICAgIH0KLQotCSAgbmFtZXNbY291bnRdID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLQkgIHZhbHNbY291bnRdID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICArK2NvdW50OwotCSAgYnJlYWs7Ci0KLQljYXNlIENfRU9TOgotCSAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIG5hbWVzW2NvdW50XSA9IE5VTEw7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfZW51bV90eXBlIChkaGFuZGxlLCBuYW1lcywgdmFscyk7Ci19Ci0KLS8qIEhhbmRsZSBhIHNpbmdsZSBDT0ZGIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9jb2ZmX3N5bWJvbCAoYWJmZCwgdHlwZXMsIHN5bSwgY29mZl9zeW1ubywgcHN5bWVudCwgZGhhbmRsZSwgdHlwZSwKLQkJICAgd2l0aGluX2Z1bmN0aW9uKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGNvZmZfdHlwZXMgKnR5cGVzOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqcHN5bWVudDsKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYm9vbGVhbiB3aXRoaW5fZnVuY3Rpb247Ci17Ci0gIHN3aXRjaCAocHN5bWVudC0+bl9zY2xhc3MpCi0gICAgewotICAgIGNhc2UgQ19OVUxMOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfQVVUTzoKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICBERUJVR19MT0NBTCwgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VYVDoKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICBERUJVR19HTE9CQUwsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19TVEFUOgotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlLAotCQkJCSAgICh3aXRoaW5fZnVuY3Rpb24KLQkJCQkgICAgPyBERUJVR19MT0NBTF9TVEFUSUMKLQkJCQkgICAgOiBERUJVR19TVEFUSUMpLAotCQkJCSAgIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19SRUc6Ci0gICAgICAvKiBGSVhNRTogV2UgbWF5IG5lZWQgdG8gY29udmVydCB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICBERUJVR19SRUdJU1RFUiwgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0xBQkVMOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfQVJHOgotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICAgREVCVUdfUEFSTV9TVEFDSywgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX1JFR1BBUk06Ci0gICAgICAvKiBGSVhNRTogV2UgbWF5IG5lZWQgdG8gY29udmVydCB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUsCi0JCQkJICAgIERFQlVHX1BBUk1fUkVHLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICB0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlKTsKLSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX1VOVEFHOgotICAgIGNhc2UgQ19FTlRBRzoKLSAgICAgIHsKLQlkZWJ1Z190eXBlICpzbG90OwotCi0JdHlwZSA9IGRlYnVnX3RhZ190eXBlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlKTsKLQlpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBTdG9yZSB0aGUgbmFtZWQgdHlwZSBpbnRvIHRoZSBzbG90LCBzbyB0aGF0IHJlZmVyZW5jZXMgZ2V0Ci0gICAgICAgICAgIHRoZSBuYW1lLiAgKi8KLQlzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotCSpzbG90ID0gdHlwZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsJCQkJICAgCi19Ci0KLS8qIFRoaXMgaXMgdGhlIG1haW4gcm91dGluZS4gIEl0IGxvb2tzIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzIGFuZAotICAgaGFuZGxlcyB0aGVtLiAgKi8KLQotYm9vbGVhbgotcGFyc2VfY29mZiAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBzdHJ1Y3QgY29mZl9zeW1ib2xzIHN5bWJvbHM7Ci0gIHN0cnVjdCBjb2ZmX3R5cGVzIHR5cGVzOwotICBpbnQgaTsKLSAgbG9uZyBuZXh0X2NfZmlsZTsKLSAgY29uc3QgY2hhciAqZm5uYW1lOwotICBpbnQgZm5jbGFzczsKLSAgaW50IGZudHlwZTsKLSAgYmZkX3ZtYSBmbmVuZDsKLSAgYWxlbnQgKmxpbmVub3M7Ci0gIGJvb2xlYW4gd2l0aGluX2Z1bmN0aW9uOwotICBsb25nIHRoaXNfY29mZl9zeW1ubzsKLQotICBzeW1ib2xzLnN5bXMgPSBzeW1zOwotICBzeW1ib2xzLnN5bWNvdW50ID0gc3ltY291bnQ7Ci0gIHN5bWJvbHMuc3ltbm8gPSAwOwotICBzeW1ib2xzLmNvZmZfc3ltbm8gPSAwOwotCi0gIHR5cGVzLnNsb3RzID0gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8PSBUX01BWDsgaSsrKQotICAgIHR5cGVzLmJhc2ljW2ldID0gREVCVUdfVFlQRV9OVUxMOwotCi0gIG5leHRfY19maWxlID0gLTE7Ci0gIGZubmFtZSA9IE5VTEw7Ci0gIGZuY2xhc3MgPSAwOwotICBmbnR5cGUgPSAwOwotICBmbmVuZCA9IDA7Ci0gIGxpbmVub3MgPSBOVUxMOwotICB3aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKLQotICB3aGlsZSAoc3ltYm9scy5zeW1ubyA8IHN5bWNvdW50KQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXg7Ci0gICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0KLSAgICAgIHN5bSA9IHN5bXNbc3ltYm9scy5zeW1ub107Ci0KLSAgICAgIGlmICghIGJmZF9jb2ZmX2dldF9zeW1lbnQgKGFiZmQsIHN5bSwgJnN5bWVudCkpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYmZkX2NvZmZfZ2V0X3N5bWVudCBmYWlsZWQ6ICVzXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLQotICAgICAgdGhpc19jb2ZmX3N5bW5vID0gc3ltYm9scy5jb2ZmX3N5bW5vOwotCi0gICAgICArK3N5bWJvbHMuc3ltbm87Ci0gICAgICBzeW1ib2xzLmNvZmZfc3ltbm8gKz0gMSArIHN5bWVudC5uX251bWF1eDsKLQotICAgICAgLyogV2Ugb25seSB3b3JyeSBhYm91dCB0aGUgZmlyc3QgYXV4ZW50LCBiZWNhdXNlIHRoYXQgaXMgdGhlCi0JIG9ubHkgb25lIHdoaWNoIGlzIHJlbGV2YW50IGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKHN5bWVudC5uX251bWF1eCA9PSAwKQotCXBhdXggPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9jb2ZmX2dldF9hdXhlbnQgKGFiZmQsIHN5bSwgMCwgJmF1eGVudCkpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfY29mZl9nZXRfYXV4ZW50IGZhaWxlZDogJXNcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBwYXV4ID0gJmF1eGVudDsKLQl9Ci0KLSAgICAgIGlmICh0aGlzX2NvZmZfc3ltbm8gPT0gbmV4dF9jX2ZpbGUgJiYgc3ltZW50Lm5fc2NsYXNzICE9IENfRklMRSkKLQl7Ci0JICAvKiBUaGUgbGFzdCBDX0ZJTEUgc3ltYm9sIHBvaW50cyB0byB0aGUgZmlyc3QgZXh0ZXJuYWwKLSAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChkaGFuZGxlLCAiKmdsb2JhbHMqIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoc3ltZW50Lm5fc2NsYXNzKQotCXsKLQljYXNlIENfRUZDTjoKLQljYXNlIENfRVhUREVGOgotCWNhc2UgQ19VTEFCRUw6Ci0JY2FzZSBDX1VTVEFUSUM6Ci0JY2FzZSBDX0xJTkU6Ci0JY2FzZSBDX0FMSUFTOgotCWNhc2UgQ19ISURERU46Ci0JICAvKiBKdXN0IGlnbm9yZSB0aGVzZSBjbGFzc2VzLiAgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBDX0ZJTEU6Ci0JICBuZXh0X2NfZmlsZSA9IHN5bWVudC5uX3ZhbHVlOwotCSAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChkaGFuZGxlLCBuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIENfU1RBVDoKLQkgIC8qIElnbm9yZSBzdGF0aWMgc3ltYm9scyB3aXRoIGEgdHlwZSBvZiBUX05VTEwuICBUaGVzZQotICAgICAgICAgICAgIHJlcHJlc2VudCBzZWN0aW9uIGVudHJpZXMuICAqLwotCSAgaWYgKHN5bWVudC5uX3R5cGUgPT0gVF9OVUxMKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBDX0VYVDoKLQkgIGlmIChJU0ZDTiAoc3ltZW50Lm5fdHlwZSkpCi0JICAgIHsKLQkgICAgICBmbm5hbWUgPSBuYW1lOwotCSAgICAgIGZuY2xhc3MgPSBzeW1lbnQubl9zY2xhc3M7Ci0JICAgICAgZm50eXBlID0gc3ltZW50Lm5fdHlwZTsKLQkgICAgICBpZiAoc3ltZW50Lm5fbnVtYXV4ID4gMCkKLQkJZm5lbmQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSArIGF1eGVudC54X3N5bS54X21pc2MueF9mc2l6ZTsKLQkgICAgICBlbHNlCi0JCWZuZW5kID0gMDsKLQkgICAgICBsaW5lbm9zID0gQkZEX1NFTkQgKGFiZmQsIF9nZXRfbGluZW5vLCAoYWJmZCwgc3ltKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsICZzeW1ib2xzLCAmdHlwZXMsIHRoaXNfY29mZl9zeW1ubywKLQkJCQkgIHN5bWVudC5uX3R5cGUsIHBhdXgsIHRydWUsIGRoYW5kbGUpOwotCSAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoISBwYXJzZV9jb2ZmX3N5bWJvbCAoYWJmZCwgJnR5cGVzLCBzeW0sIHRoaXNfY29mZl9zeW1ubywgJnN5bWVudCwKLQkJCQkgICBkaGFuZGxlLCB0eXBlLCB3aXRoaW5fZnVuY3Rpb24pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQ19GQ046Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmJmIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChmbm5hbWUgPT0gTlVMTCkKLQkJewotCQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVsZDogLmJmIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uXG4iKSwKLQkJCSAgIHByb2dyYW1fbmFtZSwgdGhpc19jb2ZmX3N5bW5vKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsICZzeW1ib2xzLCAmdHlwZXMsIHRoaXNfY29mZl9zeW1ubywKLQkJCQkgICAgICBERUNSRUYgKGZudHlwZSksIHBhdXgsIGZhbHNlLCBkaGFuZGxlKTsKLQkgICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9mdW5jdGlvbiAoZGhhbmRsZSwgZm5uYW1lLCB0eXBlLAotCQkJCQkgICBmbmNsYXNzID09IENfRVhULAotCQkJCQkgICBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmIChsaW5lbm9zICE9IE5VTEwpCi0JCXsKLQkJICBpbnQgYmFzZTsKLQkJICBiZmRfdm1hIGFkZHI7Ci0KLQkJICBpZiAoc3ltZW50Lm5fbnVtYXV4ID09IDApCi0JCSAgICBiYXNlID0gMDsKLQkJICBlbHNlCi0JCSAgICBiYXNlID0gYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vIC0gMTsKLQotCQkgIGFkZHIgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpOwotCi0JCSAgKytsaW5lbm9zOwotCi0JCSAgd2hpbGUgKGxpbmVub3MtPmxpbmVfbnVtYmVyICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9saW5lIChkaGFuZGxlLAotCQkJCQkgICAgICAgbGluZW5vcy0+bGluZV9udW1iZXIgKyBiYXNlLAotCQkJCQkgICAgICAgbGluZW5vcy0+dS5vZmZzZXQgKyBhZGRyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgKytsaW5lbm9zOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBmbm5hbWUgPSBOVUxMOwotCSAgICAgIGxpbmVub3MgPSBOVUxMOwotCSAgICAgIGZuY2xhc3MgPSAwOwotCSAgICAgIGZudHlwZSA9IDA7Ci0KLQkgICAgICB3aXRoaW5fZnVuY3Rpb24gPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZWYiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgd2l0aGluX2Z1bmN0aW9uKQotCQl7Ci0JCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJWxkOiB1bmV4cGVjdGVkIC5lZlxuIiksCi0JCQkgICBwcm9ncmFtX25hbWUsIHRoaXNfY29mZl9zeW1ubyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPiBmbmVuZCkKLQkJZm5lbmQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICAgICBpZiAoISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGRoYW5kbGUsIGZuZW5kKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgZm5lbmQgPSAwOwotCSAgICAgIHdpdGhpbl9mdW5jdGlvbiA9IGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQ19CTE9DSzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuYmIiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVidWdfc3RhcnRfYmxvY2sgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZWIiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVidWdfZW5kX2Jsb2NrIChkaGFuZGxlLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgdHlwZSA9IHBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgJnN5bWJvbHMsICZ0eXBlcywgdGhpc19jb2ZmX3N5bW5vLAotCQkJCSAgc3ltZW50Lm5fdHlwZSwgcGF1eCwgdHJ1ZSwgZGhhbmRsZSk7Ci0JICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICghIHBhcnNlX2NvZmZfc3ltYm9sIChhYmZkLCAmdHlwZXMsIHN5bSwgdGhpc19jb2ZmX3N5bW5vLCAmc3ltZW50LAotCQkJCSAgIGRoYW5kbGUsIHR5cGUsIHdpdGhpbl9mdW5jdGlvbikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZGRiZy5jIGIvYmludXRpbHMvcmRkYmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyOGMzNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZGRiZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qIHJkZGJnLmMgLS0gUmVhZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW50byBhIGdlbmVyaWMgZm9ybS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgOTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIHJlYWRzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbnRvIGEgZ2VuZXJpYyBmb3JtLiAgVGhpcwotICAgZmlsZSBrbm93cyBob3cgdG8gZGlnIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb3V0IG9mIGFuIG9iamVjdAotICAgZmlsZS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0KLXN0YXRpYyBib29sZWFuIHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgbG9uZywgUFRSLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBsb25nLCBQVFIsIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gcmVhZF9pZWVlX2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGJvb2xlYW4gKikpOwotc3RhdGljIHZvaWQgc2F2ZV9zdGFiIFBBUkFNUyAoKGludCwgaW50LCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHN0YWJfY29udGV4dCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBmcmVlX3NhdmVkX3N0YWJzIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogUmVhZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBhIEJGRC4gIFJldHVybnMgYSBnZW5lcmljIGRlYnVnZ2luZwotICAgcG9pbnRlci4gICovCi0KLVBUUgotcmVhZF9kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci17Ci0gIFBUUiBkaGFuZGxlOwotICBib29sZWFuIGZvdW5kOwotCi0gIGRoYW5kbGUgPSBkZWJ1Z19pbml0ICgpOwotICBpZiAoZGhhbmRsZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUsCi0JCQkJCSAgICZmb3VuZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0gICAgewotICAgICAgaWYgKCEgcmVhZF9zeW1ib2xfc3RhYnNfZGVidWdnaW5nX2luZm8gKGFiZmQsIHN5bXMsIHN5bWNvdW50LCBkaGFuZGxlLAotCQkJCQkgICAgICAmZm91bmQpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2llZWVfZmxhdm91cikKLSAgICB7Ci0gICAgICBpZiAoISByZWFkX2llZWVfZGVidWdnaW5nX2luZm8gKGFiZmQsIGRoYW5kbGUsICZmb3VuZCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFRyeSByZWFkaW5nIHRoZSBDT0ZGIHN5bWJvbHMgaWYgd2UgZGlkbid0IGZpbmQgYW55IHN0YWJzIGluIENPRkYKLSAgICAgc2VjdGlvbnMuICAqLwotICBpZiAoISBmb3VuZAotICAgICAgJiYgYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotICAgICAgJiYgc3ltY291bnQgPiAwKQotICAgIHsKLSAgICAgIGlmICghIHBhcnNlX2NvZmYgKGFiZmQsIHN5bXMsIHN5bWNvdW50LCBkaGFuZGxlKSkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCEgZm91bmQpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gcmVjb2duaXplZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiIpLAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRoYW5kbGU7Ci19Ci0KLS8qIFJlYWQgc3RhYnMgaW4gc2VjdGlvbnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSBCRkQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcmVhZF9zZWN0aW9uX3N0YWJzX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSwgcGZvdW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYm9vbGVhbiAqcGZvdW5kOwotewotICBzdGF0aWMgc3RydWN0Ci0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cnNlY25hbWU7Ci0gICAgfSBuYW1lc1tdID0geyB7ICIuc3RhYiIsICIuc3RhYnN0ciIgfSB9OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgUFRSIHNoYW5kbGU7Ci0KLSAgKnBmb3VuZCA9IGZhbHNlOwotICBzaGFuZGxlID0gTlVMTDsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIG5hbWVzIC8gc2l6ZW9mIG5hbWVzWzBdOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYywgKnN0cnNlYzsKLQotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVzW2ldLnNlY25hbWUpOwotICAgICAgc3Ryc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVzW2ldLnN0cnNlY25hbWUpOwotICAgICAgaWYgKHNlYyAhPSBOVUxMICYmIHN0cnNlYyAhPSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc3RhYnNpemUsIHN0cnNpemU7Ci0JICBiZmRfYnl0ZSAqc3RhYnMsICpzdHJpbmdzOwotCSAgYmZkX2J5dGUgKnN0YWI7Ci0JICBiZmRfc2l6ZV90eXBlIHN0cm9mZiwgbmV4dF9zdHJvZmY7Ci0KLQkgIHN0YWJzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKTsKLQkgIHN0YWJzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHN0YWJzaXplKTsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBzdGFicywgMCwgc3RhYnNpemUpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwKLQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lc1tpXS5zZWNuYW1lLAotCQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBzdHJzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Ryc2VjKTsKLQkgIHN0cmluZ3MgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoc3Ryc2l6ZSk7Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0cnNlYywgc3RyaW5ncywgMCwgc3Ryc2l6ZSkpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICVzXG4iLAotCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWVzW2ldLnN0cnNlY25hbWUsCi0JCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChzaGFuZGxlID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzaGFuZGxlID0gc3RhcnRfc3RhYiAoZGhhbmRsZSwgYWJmZCwgdHJ1ZSwgc3ltcywgc3ltY291bnQpOwotCSAgICAgIGlmIChzaGFuZGxlID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAqcGZvdW5kID0gdHJ1ZTsKLQotCSAgc3Ryb2ZmID0gMDsKLQkgIG5leHRfc3Ryb2ZmID0gMDsKLQkgIGZvciAoc3RhYiA9IHN0YWJzOyBzdGFiIDwgc3RhYnMgKyBzdGFic2l6ZTsgc3RhYiArPSAxMikKLQkgICAgewotCSAgICAgIGJmZF9zaXplX3R5cGUgc3RyeDsKLQkgICAgICBpbnQgdHlwZTsKLQkgICAgICBpbnQgb3RoZXI7Ci0JICAgICAgaW50IGRlc2M7Ci0JICAgICAgYmZkX3ZtYSB2YWx1ZTsKLQotCSAgICAgIC8qIFRoaXMgY29kZSBwcmVzdW1lcyAzMiBiaXQgdmFsdWVzLiAgKi8KLQotCSAgICAgIHN0cnggPSBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiKTsKLQkgICAgICB0eXBlID0gYmZkX2dldF84IChhYmZkLCBzdGFiICsgNCk7Ci0JICAgICAgb3RoZXIgPSBiZmRfZ2V0XzggKGFiZmQsIHN0YWIgKyA1KTsKLQkgICAgICBkZXNjID0gYmZkX2dldF8xNiAoYWJmZCwgc3RhYiArIDYpOwotCSAgICAgIHZhbHVlID0gYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIDgpOwotCi0JICAgICAgaWYgKHR5cGUgPT0gMCkKLQkJewotCQkgIC8qIFNwZWNpYWwgdHlwZSAwIHN0YWJzIGluZGljYXRlIHRoZSBvZmZzZXQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBuZXh0IHN0cmluZyB0YWJsZS4gICovCi0JCSAgc3Ryb2ZmID0gbmV4dF9zdHJvZmY7Ci0JCSAgbmV4dF9zdHJvZmYgKz0gdmFsdWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjaGFyICpmLCAqczsKLQotCQkgIGYgPSBOVUxMOwotCQkgIHMgPSAoY2hhciAqKSBzdHJpbmdzICsgc3Ryb2ZmICsgc3RyeDsKLQkJICB3aGlsZSAoc1tzdHJsZW4gKHMpIC0gMV0gPT0gJ1xcJwotCQkJICYmIHN0YWIgKyAxMiA8IHN0YWJzICsgc3RhYnNpemUpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKnA7Ci0KLQkJICAgICAgc3RhYiArPSAxMjsKLQkJICAgICAgcCA9IHMgKyBzdHJsZW4gKHMpIC0gMTsKLQkJICAgICAgKnAgPSAnXDAnOwotCQkgICAgICBzID0gY29uY2F0IChzLAotCQkJCSAgKChjaGFyICopIHN0cmluZ3MKLQkJCQkgICArIHN0cm9mZgotCQkJCSAgICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYikpLAotCQkJCSAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0KLQkJICAgICAgLyogV2UgaGF2ZSB0byByZXN0b3JlIHRoZSBiYWNrc2xhc2gsIGJlY2F1c2UsIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbmtlciBpcyBoYXNoaW5nIHN0YWJzIHN0cmluZ3MsIHdlIG1heQotICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSB0aGUgc2FtZSBzdHJpbmcgbW9yZSB0aGFuIG9uY2UuICAqLwotCQkgICAgICAqcCA9ICdcXCc7Ci0KLQkJICAgICAgaWYgKGYgIT0gTlVMTCkKLQkJCWZyZWUgKGYpOwotCQkgICAgICBmID0gczsKLQkJICAgIH0KLQotCQkgIHNhdmVfc3RhYiAodHlwZSwgZGVzYywgdmFsdWUsIHMpOwotCi0JCSAgaWYgKCEgcGFyc2Vfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSwgdHlwZSwgZGVzYywgdmFsdWUsIHMpKQotCQkgICAgewotCQkgICAgICBzdGFiX2NvbnRleHQgKCk7Ci0JCSAgICAgIGZyZWVfc2F2ZWRfc3RhYnMgKCk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIC8qIERvbid0IGZyZWUgZiwgc2luY2UgSSB0aGluayB0aGUgc3RhYnMgY29kZQotICAgICAgICAgICAgICAgICAgICAgZXhwZWN0cyBzdHJpbmdzIHRvIGhhbmcgYXJvdW5kLiAgVGhpcyBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgIHN0cmFpZ2h0ZW5lZCBvdXQuICBGSVhNRS4gICovCi0JCX0KLQkgICAgfQotCi0JICBmcmVlX3NhdmVkX3N0YWJzICgpOwotCSAgZnJlZSAoc3RhYnMpOwotCi0JICAvKiBEb24ndCBmcmVlIHN0cmluZ3MsIHNpbmNlIEkgdGhpbmsgdGhlIHN0YWJzIGNvZGUgZXhwZWN0cwotICAgICAgICAgICAgIHRoZSBzdHJpbmdzIHRvIGhhbmcgYXJvdW5kLiAgVGhpcyBzaG91bGQgYmUgc3RyYWlnaHRlbmVkCi0gICAgICAgICAgICAgb3V0LiAgRklYTUUuICAqLwotCX0KLSAgICB9Ci0KLSAgaWYgKHNoYW5kbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBmaW5pc2hfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBzdGFicyBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSwgcGZvdW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYm9vbGVhbiAqcGZvdW5kOwotewotICBQVFIgc2hhbmRsZTsKLSAgYXN5bWJvbCAqKnBzLCAqKnN5bWVuZDsKLQotICBzaGFuZGxlID0gTlVMTDsKLSAgc3ltZW5kID0gc3ltcyArIHN5bWNvdW50OwotICBmb3IgKHBzID0gc3ltczsgcHMgPCBzeW1lbmQ7IHBzKyspCi0gICAgewotICAgICAgc3ltYm9sX2luZm8gaTsKLQotICAgICAgYmZkX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgKnBzLCAmaSk7Ci0KLSAgICAgIGlmIChpLnR5cGUgPT0gJy0nKQotCXsKLQkgIGNvbnN0IGNoYXIgKnM7Ci0JICBjaGFyICpmOwotCi0JICBpZiAoc2hhbmRsZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2hhbmRsZSA9IHN0YXJ0X3N0YWIgKGRoYW5kbGUsIGFiZmQsIGZhbHNlLCBzeW1zLCBzeW1jb3VudCk7Ci0JICAgICAgaWYgKHNoYW5kbGUgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgICpwZm91bmQgPSB0cnVlOwotCi0JICBzID0gaS5uYW1lOwotCSAgZiA9IE5VTEw7Ci0JICB3aGlsZSAoc1tzdHJsZW4gKHMpIC0gMV0gPT0gJ1xcJwotCQkgJiYgcHMgKyAxIDwgc3ltZW5kKQotCSAgICB7Ci0JICAgICAgY2hhciAqc2MsICpuOwotCi0JICAgICAgKytwczsKLQkgICAgICBzYyA9IHhzdHJkdXAgKHMpOwotCSAgICAgIHNjW3N0cmxlbiAoc2MpIC0gMV0gPSAnXDAnOwotCSAgICAgIG4gPSBjb25jYXQgKHNjLCBiZmRfYXN5bWJvbF9uYW1lICgqcHMpLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkgICAgICBmcmVlIChzYyk7Ci0JICAgICAgaWYgKGYgIT0gTlVMTCkKLQkJZnJlZSAoZik7Ci0JICAgICAgZiA9IG47Ci0JICAgICAgcyA9IG47Ci0JICAgIH0KLQotCSAgc2F2ZV9zdGFiIChpLnN0YWJfdHlwZSwgaS5zdGFiX2Rlc2MsIGkudmFsdWUsIHMpOwotCi0JICBpZiAoISBwYXJzZV9zdGFiIChkaGFuZGxlLCBzaGFuZGxlLCBpLnN0YWJfdHlwZSwgaS5zdGFiX2Rlc2MsCi0JCQkgICAgaS52YWx1ZSwgcykpCi0JICAgIHsKLQkgICAgICBzdGFiX2NvbnRleHQgKCk7Ci0JICAgICAgZnJlZV9zYXZlZF9zdGFicyAoKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogRG9uJ3QgZnJlZSBmLCBzaW5jZSBJIHRoaW5rIHRoZSBzdGFicyBjb2RlIGV4cGVjdHMKLQkgICAgIHN0cmluZ3MgdG8gaGFuZyBhcm91bmQuICBUaGlzIHNob3VsZCBiZSBzdHJhaWdodGVuZWQgb3V0LgotCSAgICAgRklYTUUuICAqLwotCX0KLSAgICB9Ci0KLSAgZnJlZV9zYXZlZF9zdGFicyAoKTsKLQotICBpZiAoc2hhbmRsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGZpbmlzaF9zdGFiIChkaGFuZGxlLCBzaGFuZGxlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfaWVlZV9kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgZGhhbmRsZSwgcGZvdW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotICAgICBib29sZWFuICpwZm91bmQ7Ci17Ci0gIGFzZWN0aW9uICpkc2VjOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLQotICAvKiBUaGUgQkZEIGJhY2tlbmQgcHV0cyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGludG8gYSBzZWN0aW9uCi0gICAgIG5hbWVkIC5kZWJ1Zy4gICovCi0KLSAgZHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0gIGlmIChkc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGRzZWMpOwotICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChzaXplKTsKLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBkc2VjLCBjb250ZW50cywgMCwgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHBhcnNlX2llZWUgKGRoYW5kbGUsIGFiZmQsIGNvbnRlbnRzLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoY29udGVudHMpOwotCi0gICpwZm91bmQgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVjb3JkIHN0YWJzIHN0cmluZ3MsIHNvIHRoYXQgd2UgY2FuIGdpdmUgc29tZSBjb250ZXh0IGZvciBlcnJvcnMuICAqLwotCi0jZGVmaW5lIFNBVkVfU1RBQlNfQ09VTlQgKDE2KQotCi1zdHJ1Y3Qgc2F2ZWRfc3RhYgotewotICBpbnQgdHlwZTsKLSAgaW50IGRlc2M7Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGNoYXIgKnN0cmluZzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2F2ZWRfc3RhYiBzYXZlZF9zdGFic1tTQVZFX1NUQUJTX0NPVU5UXTsKLXN0YXRpYyBpbnQgc2F2ZWRfc3RhYnNfaW5kZXg7Ci0KLS8qIFNhdmUgYSBzdGFicyBzdHJpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotc2F2ZV9zdGFiICh0eXBlLCBkZXNjLCB2YWx1ZSwgc3RyaW5nKQotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGRlc2M7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHNhdmVkX3N0YWJzW3NhdmVkX3N0YWJzX2luZGV4XS5zdHJpbmcgIT0gTlVMTCkKLSAgICBmcmVlIChzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uc3RyaW5nKTsKLSAgc2F2ZWRfc3RhYnNbc2F2ZWRfc3RhYnNfaW5kZXhdLnR5cGUgPSB0eXBlOwotICBzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uZGVzYyA9IGRlc2M7Ci0gIHNhdmVkX3N0YWJzW3NhdmVkX3N0YWJzX2luZGV4XS52YWx1ZSA9IHZhbHVlOwotICBzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uc3RyaW5nID0geHN0cmR1cCAoc3RyaW5nKTsKLSAgc2F2ZWRfc3RhYnNfaW5kZXggPSAoc2F2ZWRfc3RhYnNfaW5kZXggKyAxKSAlIFNBVkVfU1RBQlNfQ09VTlQ7Ci19Ci0KLS8qIFByb3ZpZGUgY29udGV4dCBmb3IgYW4gZXJyb3IuICAqLwotCi1zdGF0aWMgdm9pZAotc3RhYl9jb250ZXh0ICgpCi17Ci0gIGludCBpOwotCi0gIGZwcmludGYgKHN0ZGVyciwgXygiTGFzdCBzdGFicyBlbnRyaWVzIGJlZm9yZSBlcnJvcjpcbiIpKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAibl90eXBlIG5fZGVzYyBuX3ZhbHVlICBzdHJpbmdcbiIpOwotCi0gIGkgPSBzYXZlZF9zdGFic19pbmRleDsKLSAgZG8KLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc2F2ZWRfc3RhYiAqc3RhYnA7Ci0KLSAgICAgIHN0YWJwID0gc2F2ZWRfc3RhYnMgKyBpOwotICAgICAgaWYgKHN0YWJwLT5zdHJpbmcgIT0gTlVMTCkKLQl7Ci0JICBjb25zdCBjaGFyICpzOwotCi0JICBzID0gYmZkX2dldF9zdGFiX25hbWUgKHN0YWJwLT50eXBlKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIiUtNnMiLCBzKTsKLQkgIGVsc2UgaWYgKHN0YWJwLT50eXBlID09IDApCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIkhkclN5bSIpOwotCSAgZWxzZQotCSAgICBmcHJpbnRmIChzdGRlcnIsICIlLTZkIiwgc3RhYnAtPnR5cGUpOwotCSAgZnByaW50ZiAoc3RkZXJyLCAiICUtNmQgIiwgc3RhYnAtPmRlc2MpOwotCSAgZnByaW50Zl92bWEgKHN0ZGVyciwgc3RhYnAtPnZhbHVlKTsKLQkgIGlmIChzdGFicC0+dHlwZSAhPSAwKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICIgJXMiLCBzdGFicC0+c3RyaW5nKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0JfQotICAgICAgaSA9IChpICsgMSkgJSBTQVZFX1NUQUJTX0NPVU5UOwotICAgIH0KLSAgd2hpbGUgKGkgIT0gc2F2ZWRfc3RhYnNfaW5kZXgpOwotfQotCi0vKiBGcmVlIHRoZSBzYXZlZCBzdGFiIHN0cmluZ3MuICAqLwotCi1zdGF0aWMgdm9pZAotZnJlZV9zYXZlZF9zdGFicyAoKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgU0FWRV9TVEFCU19DT1VOVDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzYXZlZF9zdGFic1tpXS5zdHJpbmcgIT0gTlVMTCkKLQl7Ci0JICBmcmVlIChzYXZlZF9zdGFic1tpXS5zdHJpbmcpOwotCSAgc2F2ZWRfc3RhYnNbaV0uc3RyaW5nID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIHNhdmVkX3N0YWJzX2luZGV4ID0gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3JlYWRlbGYuYyBiL2JpbnV0aWxzL3JlYWRlbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiNWJjZi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZWFkZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjAzICswLDAgQEAKLS8qIHJlYWRlbGYuYyAtLSBkaXNwbGF5IGNvbnRlbnRzIG9mIGFuIEVMRiBmb3JtYXQgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBPcmlnaW5hbGx5IGRldmVsb3BlZCBieSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+Ci0gICBNb2RpZmljYXRpb25zIGJ5IE5pY2sgQ2xpZnRvbiA8bmlja2NAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpZiBfX0dOVUNfXyA+PSAyCi0vKiBEZWZpbmUgQkZENjQgaGVyZSwgZXZlbiBpZiBvdXIgZGVmYXVsdCBhcmNoaXRlY3R1cmUgaXMgMzIgYml0IEVMRgotICAgYXMgdGhpcyB3aWxsIGFsbG93IHVzIHRvIHJlYWQgaW4gYW5kIHBhcnNlIDY0Yml0IGFuZCAzMmJpdCBFTEYgZmlsZXMuCi0gICBPbmx5IGRvIHRoaXMgaWYgd2UgYmVsaXZlIHRoYXQgdGhlIGNvbXBpbGVyIGNhbiBzdXBwb3J0IGEgNjQgYml0Ci0gICBkYXRhIHR5cGUuICBGb3Igbm93IHdlIG9ubHkgcmVseSBvbiBHQ0MgYmVpbmcgYWJsZSB0byBkbyB0aGlzLiAgKi8KLSNkZWZpbmUgQkZENjQKLSNlbmRpZgotCi0jaW5jbHVkZSAiYmZkLmgiCi0KLSNpbmNsdWRlICJlbGYvY29tbW9uLmgiCi0jaW5jbHVkZSAiZWxmL2V4dGVybmFsLmgiCi0jaW5jbHVkZSAiZWxmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiZWxmL2R3YXJmMi5oIgotCi0vKiBUaGUgZm9sbG93aW5nIGhlYWRlcnMgdXNlIHRoZSBlbGYvcmVsb2MtbWFjcm9zLmggZmlsZSB0bwotICAgYXV0b21hdGljYWxseSBnZW5lcmF0ZSByZWxvY2F0aW9uIHJlY29nbml0aW9uIGZ1bmN0aW9ucwotICAgc3VjaCBhcyBlbGZfbWlwc19yZWxvY190eXBlKCkgICovCi0KLSNkZWZpbmUgUkVMT0NfTUFDUk9TX0dFTl9GVU5DCi0KLSNpbmNsdWRlICJlbGYvaTM4Ni5oIgotI2luY2x1ZGUgImVsZi92ODUwLmgiCi0jaW5jbHVkZSAiZWxmL3BwYy5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0jaW5jbHVkZSAiZWxmL2FscGhhLmgiCi0jaW5jbHVkZSAiZWxmL2FybS5oIgotI2luY2x1ZGUgImVsZi9tNjhrLmgiCi0jaW5jbHVkZSAiZWxmL3NwYXJjLmgiCi0jaW5jbHVkZSAiZWxmL20zMnIuaCIKLSNpbmNsdWRlICJlbGYvZDEwdi5oIgotI2luY2x1ZGUgImVsZi9kMzB2LmgiCi0jaW5jbHVkZSAiZWxmL3NoLmgiCi0jaW5jbHVkZSAiZWxmL21uMTAyMDAuaCIKLSNpbmNsdWRlICJlbGYvbW4xMDMwMC5oIgotI2luY2x1ZGUgImVsZi9ocHBhLmgiCi0jaW5jbHVkZSAiZWxmL2FyYy5oIgotI2luY2x1ZGUgImVsZi9mcjMwLmgiCi0jaW5jbHVkZSAiZWxmL21jb3JlLmgiCi0jaW5jbHVkZSAiZWxmL2k5NjAuaCIKLSNpbmNsdWRlICJlbGYvcGouaCIKLQotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi1jaGFyICogICAgICAgICAgCXByb2dyYW1fbmFtZSA9ICJyZWFkZWxmIjsKLXVuc2lnbmVkIGludCAgICAJZHluYW1pY19hZGRyOwotYmZkX3NpemVfdHlwZSAgCQlkeW5hbWljX3NpemU7Ci11bnNpZ25lZCBpbnQgICAgCXJlbGFfYWRkcjsKLXVuc2lnbmVkIGludCAgICAJcmVsYV9zaXplOwotY2hhciAqICAgICAgICAgIAlkeW5hbWljX3N0cmluZ3M7Ci1jaGFyICoJCQlzdHJpbmdfdGFibGU7Ci11bnNpZ25lZCBsb25nICAgICAgICAgICBudW1fZHluYW1pY19zeW1zOwotRWxmX0ludGVybmFsX1N5bSAqIAlkeW5hbWljX3N5bWJvbHM7Ci1FbGZfSW50ZXJuYWxfU3ltaW5mbyAqCWR5bmFtaWNfc3ltaW5mbzsKLXVuc2lnbmVkIGxvbmcgICAJZHluYW1pY19zeW1pbmZvX29mZnNldDsKLXVuc2lnbmVkIGludAkJZHluYW1pY19zeW1pbmZvX25lbnQ7Ci1jaGFyICAgICAgICAgICAgCXByb2dyYW1faW50ZXJwcmV0ZXIgWzY0XTsKLWludCAgICAgICAgICAgICAJZHluYW1pY19pbmZvW0RUX0pNUFJFTCArIDFdOwotaW50ICAgICAgICAgICAgIAl2ZXJzaW9uX2luZm9bMTZdOwotaW50ICAgICAgICAgICAgIAlsb2FkYWRkciA9IDA7Ci1FbGZfSW50ZXJuYWxfRWhkciAgICAgICBlbGZfaGVhZGVyOwotRWxmX0ludGVybmFsX1NoZHIgKiAgICAgc2VjdGlvbl9oZWFkZXJzOwotRWxmX0ludGVybmFsX0R5biAqICAgICAgZHluYW1pY19zZWdtZW50OwotaW50IAkJCXNob3dfbmFtZTsKLWludCAJCQlkb19keW5hbWljOwotaW50IAkJCWRvX3N5bXM7Ci1pbnQgCQkJZG9fcmVsb2M7Ci1pbnQgCQkJZG9fc2VjdGlvbnM7Ci1pbnQgCQkJZG9fc2VnbWVudHM7Ci1pbnQgCQkJZG9fdXNpbmdfZHluYW1pYzsKLWludCAJCQlkb19oZWFkZXI7Ci1pbnQgCQkJZG9fZHVtcDsKLWludCAJCQlkb192ZXJzaW9uOwotaW50CQkJZG9faGlzdG9ncmFtOwotaW50CQkJZG9fZGVidWdnaW5nOwotaW50ICAgICAgICAgICAgICAgICAgICAgZG9fZGVidWdfaW5mbzsKLWludCAgICAgICAgICAgICAgICAgICAgIGRvX2RlYnVnX2FiYnJldnM7Ci1pbnQgICAgICAgICAgICAgICAgICAgICBkb19kZWJ1Z19saW5lczsKLWludCAgICAgICAgICAgICAgICAgICAgIGRvX2RlYnVnX3B1Ym5hbWVzOwotaW50ICAgICAgICAgICAgICAgICAgICAgZG9fZGVidWdfYXJhbmdlczsKLWludCAgICAgICAgICAgICAgICAgICAgIGRvX2FyY2g7Ci1pbnQgICAgICAgICAgICAgICAgICAgICBkb19ub3RlczsKLWludAkJCWlzXzMyYml0X2VsZjsKLQotLyogQSBkeW5hbWljIGFycmF5IG9mIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggc2VjdGlvbnMgcmVxdWlyZSBkdW1waW5nLiAgKi8KLWNoYXIgKgkJCWR1bXBfc2VjdHMgPSBOVUxMOwotdW5zaWduZWQgaW50CQludW1fZHVtcF9zZWN0cyA9IDA7Ci0KLSNkZWZpbmUgSEVYX0RVTVAJKDEgPDwgMCkKLSNkZWZpbmUgRElTQVNTX0RVTVAJKDEgPDwgMSkKLSNkZWZpbmUgREVCVUdfRFVNUAkoMSA8PCAyKQotCi0vKiBIb3cgdG8gcnBpbnQgYSB2bWEgdmFsdWUuICAqLwotdHlwZWRlZiBlbnVtIHByaW50X21vZGUKLXsKLSAgSEVYLAotICBERUMsCi0gIERFQ181LAotICBVTlNJR05FRCwKLSAgUFJFRklYX0hFWCwKLSAgRlVMTF9IRVgsCi0gIExPTkdfSEVYCi19Ci1wcmludF9tb2RlOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgZHVtYiBjb21waWxlcnMuICAqLwotc3RhdGljIHZvaWQJCSAgcHJpbnRfdm1hCQkgICAgICBQQVJBTVMgKChiZmRfdm1hLCBwcmludF9tb2RlKSk7Ci1zdGF0aWMgYmZkX3ZtYSAoKiAgICAgICAgIGJ5dGVfZ2V0KSAgICAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCkpOwotc3RhdGljIGJmZF92bWEgICAgICAgICAgICBieXRlX2dldF9saXR0bGVfZW5kaWFuICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBiZmRfdm1hICAgICAgICAgICAgYnl0ZV9nZXRfYmlnX2VuZGlhbiAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9taXBzX2R5bmFtaWNfdHlwZSAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9zcGFyYzY0X2R5bmFtaWNfdHlwZSAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9wYXJpc2NfZHluYW1pY190eXBlICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9keW5hbWljX3R5cGUgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGR1bXBfcmVsb2NhdGlvbnMgICAgICAgICAgICBQQVJBTVMgKChGSUxFICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIEVsZl9JbnRlcm5hbF9TeW0gKiwgdW5zaWduZWQgbG9uZywgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X2ZpbGVfdHlwZSAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkKSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9tYWNoaW5lX25hbWUgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfbWFjaGluZV9mbGFncyAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQsIHVuc2lnbmVkKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9taXBzX3NlZ21lbnRfdHlwZSAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9wYXJpc2Nfc2VnbWVudF90eXBlICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9zZWdtZW50X3R5cGUgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9taXBzX3NlY3Rpb25fdHlwZV9uYW1lICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X3BhcmlzY19zZWN0aW9uX3R5cGVfbmFtZSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X3NlY3Rpb25fdHlwZV9uYW1lICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfc3ltYm9sX2JpbmRpbmcgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9zeW1ib2xfdHlwZSAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgcGFyc2VfYXJncyAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX2ZpbGVfaGVhZGVyICAgICAgICAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3Byb2dyYW1faGVhZGVycyAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3Nfc2VjdGlvbl9oZWFkZXJzICAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgZHluYW1pY19zZWdtZW50X21pcHNfdmFsICAgIFBBUkFNUyAoKEVsZl9JbnRlcm5hbF9EeW4gKikpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBkeW5hbWljX3NlZ21lbnRfcGFyaXNjX3ZhbCAgUEFSQU1TICgoRWxmX0ludGVybmFsX0R5biAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3NfZHluYW1pY19zZWdtZW50ICAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19zeW1ib2xfdGFibGUgICAgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3NlY3Rpb25fY29udGVudHMgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIHByb2Nlc3NfZmlsZSAgICAgICAgICAgICAgICBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19yZWxvY3MgICAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3ZlcnNpb25fc2VjdGlvbnMgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF92ZXJfZmxhZ3MgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X3N5bWJvbF9pbmRleF90eXBlICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBnZXRfMzJiaXRfc2VjdGlvbl9oZWFkZXJzICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGdldF82NGJpdF9zZWN0aW9uX2hlYWRlcnMgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQJCSAgZ2V0XzMyYml0X3Byb2dyYW1faGVhZGVycyAgIFBBUkFNUyAoKEZJTEUgKiwgRWxmX0ludGVybmFsX1BoZHIgKikpOwotc3RhdGljIGludAkJICBnZXRfNjRiaXRfcHJvZ3JhbV9oZWFkZXJzICAgUEFSQU1TICgoRklMRSAqLCBFbGZfSW50ZXJuYWxfUGhkciAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGdldF9maWxlX2hlYWRlciAgICAgICAgICAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBFbGZfSW50ZXJuYWxfU3ltICogZ2V0XzMyYml0X2VsZl9zeW1ib2xzICAgICAgIFBBUkFNUyAoKEZJTEUgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIEVsZl9JbnRlcm5hbF9TeW0gKiBnZXRfNjRiaXRfZWxmX3N5bWJvbHMgICAgICAgUEFSQU1TICgoRklMRSAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50ICogICAgICAgICAgICAgIGdldF9keW5hbWljX2RhdGEgICAgICAgICAgICBQQVJBTVMgKChGSUxFICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBnZXRfMzJiaXRfZHluYW1pY19zZWdtZW50ICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGdldF82NGJpdF9keW5hbWljX3NlZ21lbnQgICBQQVJBTVMgKChGSUxFICopKTsKLSNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCi1zdGF0aWMgaW50IAkgICAgICAgICAgZGlzYXNzZW1ibGVfc2VjdGlvbiAgICAgICAgIFBBUkFNUyAoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgRklMRSAqKSk7Ci0jZW5kaWYKLXN0YXRpYyBpbnQgCSAgICAgICAgICBkdW1wX3NlY3Rpb24gICAgICAgICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBGSUxFICopKTsKLXN0YXRpYyBpbnQgCSAgICAgICAgICBkaXNwbGF5X2RlYnVnX3NlY3Rpb24gICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZGlzcGxheV9kZWJ1Z19pbmZvICAgICAgICAgIFBBUkFNUyAoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgdW5zaWduZWQgY2hhciAqLCBGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkIFBBUkFNUyAoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgdW5zaWduZWQgY2hhciAqLCBGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZGlzcGxheV9kZWJ1Z19saW5lcyAgICAgICAgIFBBUkFNUyAoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgdW5zaWduZWQgY2hhciAqLCBGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZGlzcGxheV9kZWJ1Z19hYmJyZXYgICAgICAgIFBBUkFNUyAoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgdW5zaWduZWQgY2hhciAqLCBGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZGlzcGxheV9kZWJ1Z19hcmFuZ2VzICAgICAgIFBBUkFNUyAoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgdW5zaWduZWQgY2hhciAqLCBGSUxFICopKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogICAgcHJvY2Vzc19hYmJyZXZfc2VjdGlvbiAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyAgICAgIHJlYWRfbGViMTI4ICAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19leHRlbmRlZF9saW5lX29wICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgcmVzZXRfc3RhdGVfbWFjaGluZSAgICAgICAgIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfVEFHX25hbWUgICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfQVRfbmFtZSAgICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfRk9STV9uYW1lICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBmcmVlX2FiYnJldnMgICAgICAgICAgICAgICAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBhZGRfYWJicmV2ICAgICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGFkZF9hYmJyZXZfYXR0ciAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqICAgIHJlYWRfYW5kX2Rpc3BsYXlfYXR0ciAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogICAgZGlzcGxheV9ibG9jayAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBkZWNvZGVfbG9jYXRpb25fZXhwcmVzc2lvbiAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkCQkgIHJlcXVlc3RfZHVtcCAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNoYXIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X2VsZl9jbGFzcyAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X2RhdGFfZW5jb2RpbmcgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X29zYWJpX25hbWUgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIpKTsKLXN0YXRpYyBpbnQJCSAgZ3Vlc3NfaXNfcmVsYSAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBjaGFyICogCQkgIGdldF9ub3RlX3R5cGUJCSAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGludAkJICBwcm9jZXNzX25vdGUJCSAgICAgICAgIFBBUkFNUyAoKEVsZjMyX0ludGVybmFsX05vdGUgKikpOwotc3RhdGljIGludAkJICBwcm9jZXNzX2NvcmVmaWxlX25vdGVfc2VnbWVudCAgUEFSQU1TICgoRklMRSAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgaW50CQkgIHByb2Nlc3NfY29yZWZpbGVfbm90ZV9zZWdtZW50cyBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgCQkgIHByb2Nlc3NfY29yZWZpbGVfY29udGVudHMJIFBBUkFNUyAoKEZJTEUgKikpOwotCi10eXBlZGVmIGludCBFbGYzMl9Xb3JkOwotCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAgICAgMQotI2RlZmluZSBGQUxTRSAgICAwCi0jZW5kaWYKLSNkZWZpbmUgVU5LTk9XTiAtMQotCi0jZGVmaW5lIFNFQ1RJT05fTkFNRShYKSAJKHN0cmluZ190YWJsZSArIChYKS0+c2hfbmFtZSkKLQotI2RlZmluZSBEVF9WRVJTSU9OVEFHSURYKHRhZykJKERUX1ZFUk5FRUROVU0gLSAodGFnKSkJLyogUmV2ZXJzZSBvcmRlciEgKi8KLQotI2RlZmluZSBCWVRFX0dFVChmaWVsZCkgCWJ5dGVfZ2V0IChmaWVsZCwgc2l6ZW9mIChmaWVsZCkpCi0KLS8qIElmIHdlIGNhbiBzdXBwb3J0IGEgNjQgYml0IGRhdGEgdHlwZSB0aGVuIEJGRDY0IHNob3VsZCBiZSBkZWZpbmVkCi0gICBhbmQgc2l6ZW9mIChiZmRfdm1hKSA9PSA4LiAgSW4gdGhpcyBjYXNlIHdoZW4gdHJhbnNsYXRpbmcgZnJvbSBhbgotICAgZXh0ZXJuYWwgOCBieXRlIGZpZWxkIHRvIGFuIGludGVybmFsIGZpZWxkLCB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlCi0gICBpbnRlcm5hbCBmaWVsZCBpcyBhbHNvIDggYnl0ZXMgd2lkZSBhbmQgc28gd2UgY2FuIGV4dGFjdCBhbGwgdGhlIGRhdGEuCi0gICBJZiwgaG93ZXZlciwgQkZENjQgaXMgbm90IGRlZmluZWQsIHRoZW4gd2UgbXVzdCBhc3N1bWUgdGhhdCB0aGUKLSAgIGludGVybmFsIGRhdGEgc3RydWN0dXJlIG9ubHkgaGFzIDQgYnl0ZSB3aWRlIGZpZWxkcyB0aGF0IGFyZSB0aGUKLSAgIGVxdWl2YWxlbnQgb2YgdGhlIDggYnl0ZSB3aWRlIGV4dGVybmFsIGNvdW50ZXJwYXJ0cywgYW5kIHNvIHdlIG11c3QKLSAgIHRydW5jYXRlIHRoZSBkYXRhLiAgKi8KLSNpZmRlZiAgQkZENjQKLSNkZWZpbmUgQllURV9HRVQ4KGZpZWxkKSAJYnl0ZV9nZXQgKGZpZWxkLCAtOCkKLSNlbHNlCi0jZGVmaW5lIEJZVEVfR0VUOChmaWVsZCkgCWJ5dGVfZ2V0IChmaWVsZCwgOCkKLSNlbmRpZgotCi0jZGVmaW5lIE5VTV9FTEVNKGFycmF5KSAJKHNpemVvZiAoYXJyYXkpIC8gc2l6ZW9mICgoYXJyYXkpWzBdKSkKLQotI2RlZmluZSBHRVRfREFUQV9BTExPQyhvZmZzZXQsIHNpemUsIHZhciwgdHlwZSwgcmVhc29uKQkJCVwKLSAgaWYgKGZzZWVrIChmaWxlLCBvZmZzZXQsIFNFRUtfU0VUKSkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBzZWVrIHRvIHN0YXJ0IG9mICVzIGF0ICV4XG4iKSwgcmVhc29uLCBvZmZzZXQpOyBcCi0gICAgICByZXR1cm4gMDsJCQkJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotICB2YXIgPSAodHlwZSkgbWFsbG9jIChzaXplKTsJCQkJCQlcCi0JCQkJCQkJCQlcCi0gIGlmICh2YXIgPT0gTlVMTCkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nICVkIGJ5dGVzIGZvciAlc1xuIiksIHNpemUsIHJlYXNvbik7IFwKLSAgICAgIHJldHVybiAwOwkJCQkJCQkJXAotICAgIH0gCQkJCQkJCQkJXAotIAkJCQkJCQkJCVwKLSAgaWYgKGZyZWFkICh2YXIsIHNpemUsIDEsIGZpbGUpICE9IDEpIAkJCQkJXAotICAgIHsgCQkJCQkJCQkJXAotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byByZWFkIGluICVkIGJ5dGVzIG9mICVzXG4iKSwgc2l6ZSwgcmVhc29uKTsgCVwKLSAgICAgIGZyZWUgKHZhcik7IAkJCQkJCQlcCi0gICAgICB2YXIgPSBOVUxMOwkJCQkJCQlcCi0gICAgICByZXR1cm4gMDsgCQkJCQkJCVwKLSAgICB9Ci0KLQotI2RlZmluZSBHRVRfREFUQShvZmZzZXQsIHZhciwgcmVhc29uKSAJCQkJCVwKLSAgaWYgKGZzZWVrIChmaWxlLCBvZmZzZXQsIFNFRUtfU0VUKSkJCQkJCVwKLSAgICB7IAkJCQkJCQkJCVwKLSAgICAgIGVycm9yIChfKCJVbmFibGUgdG8gc2VlayB0byAleCBmb3IgJXNcbiIpLCBvZmZzZXQsIHJlYXNvbik7CVwKLSAgICAgIHJldHVybiAwOwkJCQkJCQkJXAotICAgIH0JCQkJCQkJCQlcCi0gIGVsc2UgaWYgKGZyZWFkICgmIHZhciwgc2l6ZW9mICh2YXIpLCAxLCBmaWxlKSAhPSAxKQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byByZWFkIGRhdGEgYXQgJXggZm9yICVzXG4iKSwgb2Zmc2V0LCByZWFzb24pOwlcCi0gICAgICByZXR1cm4gMDsJCQkJCQkJCVwKLSAgICB9Ci0KLSNkZWZpbmUgR0VUX0VMRl9TWU1CT0xTKGZpbGUsIG9mZnNldCwgc2l6ZSkJCQlcCi0gIChpc18zMmJpdF9lbGYgPyBnZXRfMzJiaXRfZWxmX3N5bWJvbHMgKGZpbGUsIG9mZnNldCwgc2l6ZSkJXAotICAgOiBnZXRfNjRiaXRfZWxmX3N5bWJvbHMgKGZpbGUsIG9mZnNldCwgc2l6ZSkpCi0KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RhdGljIHZvaWQKLWVycm9yIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogRXJyb3I6ICIpLCBwcm9ncmFtX25hbWUpOwotICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi13YXJuIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogV2FybmluZzogIiksIHByb2dyYW1fbmFtZSk7Ci0gIHZhX3N0YXJ0IChhcmdzLCBtZXNzYWdlKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybjsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZAotZXJyb3IgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLXsKLSAgY2hhciAqIG1lc3NhZ2U7Ci0gIHZhX2xpc3QgYXJnczsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBFcnJvcjogIiksIHByb2dyYW1fbmFtZSk7Ci0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgbWVzc2FnZSA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXdhcm4gKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLXsKLSAgY2hhciAqIG1lc3NhZ2U7Ci0gIHZhX2xpc3QgYXJnczsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBXYXJuaW5nOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBtZXNzYWdlID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgcmV0dXJuOwotfQotI2VuZGlmCi0KLXN0YXRpYyBiZmRfdm1hCi1ieXRlX2dldF9saXR0bGVfZW5kaWFuIChmaWVsZCwgc2l6ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqIGZpZWxkOwotICAgICBpbnQgICAgICAgICAgICAgc2l6ZTsKLXsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gKiBmaWVsZDsKLQotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiAgKCh1bnNpZ25lZCBpbnQpIChmaWVsZCBbMF0pKQotCXwgICAgKCgodW5zaWduZWQgaW50KSAoZmllbGQgWzFdKSkgPDwgOCk7Ci0KLSAgICBjYXNlIDg6Ci0gICAgICAvKiBXZSB3YW50IHRvIGV4dHJhY3QgZGF0YSBmcm9tIGFuIDggYnl0ZSB3aWRlIGZpZWxkIGFuZAotCSBwbGFjZSBpdCBpbnRvIGEgNCBieXRlIHdpZGUgZmllbGQuICBTaW5jZSB0aGlzIGlzIGEgbGl0dGxlCi0JIGVuZGlhbiBzb3VyY2Ugd2UgY2FuIGp1dHMgdXNlIHRoZSA0IGJ5dGUgZXh0cmFjdGlvbiBjb2RlLiAgKi8KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuICAoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMF0pKQotCXwgICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFsxXSkpIDw8IDgpCi0JfCAgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzJdKSkgPDwgMTYpCi0JfCAgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzNdKSkgPDwgMjQpOwotCi0jaWZkZWYgQkZENjQKLSAgICBjYXNlIC04OgotICAgICAgLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSwgZ2VuZXJhdGVkIGJ5IHRoZSBCWVRFX0dFVDggbWFjcm8uCi0JIEl0IG1lYW5zIHRoYXQgd2UgYXJlIGxvYWRpbmcgYW4gOCBieXRlIHZhbHVlIGZyb20gYSBmaWVsZAotCSBpbiBhbiBleHRlcm5hbCBzdHJ1Y3R1cmUgaW50byBhbiA4IGJ5dGUgdmFsdWUgaW4gYSBmaWVsZAotCSBpbiBhbiBpbnRlcm5hbCBzdHJjdXR1cmUuICAqLwotICAgICAgcmV0dXJuICAoKGJmZF92bWEpIChmaWVsZCBbMF0pKQotCXwgICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFsxXSkpIDw8IDgpCi0JfCAgICAoKChiZmRfdm1hKSAoZmllbGQgWzJdKSkgPDwgMTYpCi0JfCAgICAoKChiZmRfdm1hKSAoZmllbGQgWzNdKSkgPDwgMjQpCi0JfCAgICAoKChiZmRfdm1hKSAoZmllbGQgWzRdKSkgPDwgMzIpCi0JfCAgICAoKChiZmRfdm1hKSAoZmllbGQgWzVdKSkgPDwgNDApCi0JfCAgICAoKChiZmRfdm1hKSAoZmllbGQgWzZdKSkgPDwgNDgpCi0JfCAgICAoKChiZmRfdm1hKSAoZmllbGQgWzddKSkgPDwgNTYpOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yIChfKCJVbmhhbmRsZWQgZGF0YSBsZW5ndGg6ICVkXG4iKSwgc2l6ZSk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGEgVk1BIHZhbHVlLiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF92bWEgKHZtYSwgbW9kZSkKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHByaW50X21vZGUgbW9kZTsKLXsKLSNpZmRlZiBCRkQ2NAotICBpZiAoaXNfMzJiaXRfZWxmKQotI2VuZGlmCi0gICAgewotICAgICAgc3dpdGNoIChtb2RlKQotCXsKLQljYXNlIEZVTExfSEVYOiBwcmludGYgKCIweCIpOyAvKiBkcm9wIHRocm91Z2ggKi8KLQljYXNlIExPTkdfSEVYOiBwcmludGYgKCIlOC44bHgiLCAodW5zaWduZWQgbG9uZykgdm1hKTsgYnJlYWs7Ci0JY2FzZSBQUkVGSVhfSEVYOiBwcmludGYgKCIweCIpOyAvKiBkcm9wIHRocm91Z2ggKi8KLQljYXNlIEhFWDogcHJpbnRmICgiJWx4IiwgKHVuc2lnbmVkIGxvbmcpIHZtYSk7IGJyZWFrOwotCWNhc2UgREVDOiBwcmludGYgKCIlbGQiLCAodW5zaWduZWQgbG9uZykgdm1hKTsgYnJlYWs7Ci0JY2FzZSBERUNfNTogcHJpbnRmICgiJTVsZCIsIChsb25nKSB2bWEpOyBicmVhazsKLQljYXNlIFVOU0lHTkVEOiBwcmludGYgKCIlbHUiLCAodW5zaWduZWQgbG9uZykgdm1hKTsgYnJlYWs7Ci0JfQotICAgIH0KLSNpZmRlZiBCRkQ2NAotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChtb2RlKQotCXsKLQljYXNlIEZVTExfSEVYOgotCSAgcHJpbnRmICgiMHgiKTsKLQkgIC8qIGRyb3AgdGhyb3VnaCAqLwotCSAgCi0JY2FzZSBMT05HX0hFWDoKLQkgIHByaW50Zl92bWEgKHZtYSk7Ci0JICBicmVhazsKLQkgIAotCWNhc2UgUFJFRklYX0hFWDoKLQkgIHByaW50ZiAoIjB4Iik7Ci0JICAvKiBkcm9wIHRocm91Z2ggKi8KLQkgIAotCWNhc2UgSEVYOgotI2lmIEJGRF9IT1NUXzY0QklUX0xPTkcKLQkgIHByaW50ZiAoIiVseCIsIHZtYSk7Ci0jZWxzZQotCSAgaWYgKF9iZmRfaW50NjRfaGlnaCAodm1hKSkKLQkgICAgcHJpbnRmICgiJWx4JWx4IiwgX2JmZF9pbnQ2NF9oaWdoICh2bWEpLCBfYmZkX2ludDY0X2xvdyAodm1hKSk7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIiVseCIsIF9iZmRfaW50NjRfbG93ICh2bWEpKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0KLQljYXNlIERFQzoKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi0JICBwcmludGYgKCIlbGQiLCB2bWEpOwotI2Vsc2UKLQkgIGlmIChfYmZkX2ludDY0X2hpZ2ggKHZtYSkpCi0JICAgIC8qIHVnZyAqLwotCSAgICBwcmludGYgKCIrKyVsZCIsIF9iZmRfaW50NjRfbG93ICh2bWEpKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiJWxkIiwgX2JmZF9pbnQ2NF9sb3cgKHZtYSkpOwotI2VuZGlmCSAgCi0JICBicmVhazsKLQotCWNhc2UgREVDXzU6Ci0jaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotCSAgcHJpbnRmICgiJTVsZCIsIHZtYSk7Ci0jZWxzZQotCSAgaWYgKF9iZmRfaW50NjRfaGlnaCAodm1hKSkKLQkgICAgLyogdWdnICovCi0JICAgIHByaW50ZiAoIisrJWxkIiwgX2JmZF9pbnQ2NF9sb3cgKHZtYSkpOwotCSAgZWxzZQotCSAgICBwcmludGYgKCIlNWxkIiwgX2JmZF9pbnQ2NF9sb3cgKHZtYSkpOwotI2VuZGlmCSAgCi0JICBicmVhazsKLQkgIAotCWNhc2UgVU5TSUdORUQ6Ci0jaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotCSAgcHJpbnRmICgiJWx1Iiwgdm1hKTsKLSNlbHNlCSAgCi0JICBpZiAoX2JmZF9pbnQ2NF9oaWdoICh2bWEpKQotCSAgICAvKiB1Z2cgKi8KLQkgICAgcHJpbnRmICgiKyslbHUiLCBfYmZkX2ludDY0X2xvdyAodm1hKSk7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIiVsdSIsIF9iZmRfaW50NjRfbG93ICh2bWEpKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotfQotCi1zdGF0aWMgYmZkX3ZtYQotYnl0ZV9nZXRfYmlnX2VuZGlhbiAoZmllbGQsIHNpemUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBmaWVsZDsKLSAgICAgaW50ICAgICAgICAgICAgIHNpemU7Ci17Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgcmV0dXJuICogZmllbGQ7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gKCh1bnNpZ25lZCBpbnQpIChmaWVsZCBbMV0pKSB8ICgoKGludCkgKGZpZWxkIFswXSkpIDw8IDgpOwotCi0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuICgodW5zaWduZWQgbG9uZykgKGZpZWxkIFszXSkpCi0JfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMl0pKSA8PCA4KQotCXwgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzFdKSkgPDwgMTYpCi0JfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMF0pKSA8PCAyNCk7Ci0KLSAgICBjYXNlIDg6Ci0gICAgICAvKiBBbHRob3VnaCB3ZSBhcmUgZXh0cmFjaW5nIGRhdGEgZnJvbSBhbiA4IGJ5dGUgd2lkZSBmaWVsZCwgd2UKLQkgYXJlIHJldHVybmluZyBvbmx5IDQgYnl0ZXMgb2YgZGF0YS4gICovCi0gICAgICByZXR1cm4gKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzddKSkKLQl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFs2XSkpIDw8IDgpCi0JfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbNV0pKSA8PCAxNikKLQl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFs0XSkpIDw8IDI0KTsKLQotI2lmZGVmIEJGRDY0Ci0gICAgY2FzZSAtODoKLSAgICAgIC8qIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UsIGdlbmVyYXRlZCBieSB0aGUgQllURV9HRVQ4IG1hY3JvLgotCSBJdCBtZWFucyB0aGF0IHdlIGFyZSBsb2FkaW5nIGFuIDggYnl0ZSB2YWx1ZSBmcm9tIGEgZmllbGQKLQkgaW4gYW4gZXh0ZXJuYWwgc3RydWN0dXJlIGludG8gYW4gOCBieXRlIHZhbHVlIGluIGEgZmllbGQKLQkgaW4gYW4gaW50ZXJuYWwgc3RyY3V0dXJlLiAgKi8KLSAgICAgIHJldHVybiAoKGJmZF92bWEpIChmaWVsZCBbN10pKQotCXwgICAoKChiZmRfdm1hKSAoZmllbGQgWzZdKSkgPDwgOCkKLQl8ICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs1XSkpIDw8IDE2KQotCXwgICAoKChiZmRfdm1hKSAoZmllbGQgWzRdKSkgPDwgMjQpCi0JfCAgICgoKGJmZF92bWEpIChmaWVsZCBbM10pKSA8PCAzMikKLQl8ICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFsyXSkpIDw8IDQwKQotCXwgICAoKChiZmRfdm1hKSAoZmllbGQgWzFdKSkgPDwgNDgpCi0JfCAgICgoKGJmZF92bWEpIChmaWVsZCBbMF0pKSA8PCA1Nik7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvciAoXygiVW5oYW5kbGVkIGRhdGEgbGVuZ3RoOiAlZFxuIiksIHNpemUpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0KLS8qIEd1ZXNzIHRoZSByZWxvY2F0aW9uIHNpemVkIGJhc2VkIG9uIHRoZSBzaXplZCBjb21tb25seSB1c2VkIGJ5IHRoZSBzcGVjaWZpYyBtYWNoaW5lLiAgKi8KLXN0YXRpYyBpbnQKLWd1ZXNzX2lzX3JlbGEgKGVfbWFjaGluZSkKLSAgICAgdW5zaWduZWQgbG9uZyBlX21hY2hpbmU7Ci17Ci0gIHN3aXRjaCAoZV9tYWNoaW5lKQotICAgIHsKLSAgICAgIC8qIFRhcmdldHMgdGhhdCB1c2UgUkVMIHJlbG9jYXRpb25zLiAgKi8KLSAgICBjYXNlIEVNX0FSTToKLSAgICBjYXNlIEVNXzM4NjoKLSAgICBjYXNlIEVNXzQ4NjoKLSAgICBjYXNlIEVNXzk2MDoKLSAgICBjYXNlIEVNX0NZR05VU19NMzJSOgotICAgIGNhc2UgRU1fQ1lHTlVTX0QxMFY6Ci0gICAgY2FzZSBFTV9NSVBTOgotICAgIGNhc2UgRU1fTUlQU19SUzRfQkU6Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgIC8qIFRhcmdldHMgdGhhdCB1c2UgUkVMQSByZWxvY2F0aW9ucy4gICovCi0gICAgY2FzZSBFTV82OEs6Ci0gICAgY2FzZSBFTV9TUEFSQzMyUExVUzoKLSAgICBjYXNlIEVNX1NQQVJDVjk6Ci0gICAgY2FzZSBFTV9TUEFSQzoKLSAgICBjYXNlIEVNX1BQQzoKLSAgICBjYXNlIEVNX0NZR05VU19WODUwOgotICAgIGNhc2UgRU1fQ1lHTlVTX0QzMFY6Ci0gICAgY2FzZSBFTV9DWUdOVVNfTU4xMDIwMDoKLSAgICBjYXNlIEVNX0NZR05VU19NTjEwMzAwOgotICAgIGNhc2UgRU1fQ1lHTlVTX0ZSMzA6Ci0gICAgY2FzZSBFTV9TSDoKLSAgICBjYXNlIEVNX0FMUEhBOgotICAgIGNhc2UgRU1fTUNPUkU6Ci0gICAgICByZXR1cm4gVFJVRTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB3YXJuIChfKCJEb24ndCBrbm93IGFib3V0IHJlbG9jYXRpb25zIG9uIHRoaXMgbWFjaGluZSBhcmNoaXRlY3R1cmVcbiIpKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci19Ci0KLS8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWxvY2F0aW9uIGRhdGEgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuICAqLwotc3RhdGljIGludAotZHVtcF9yZWxvY2F0aW9ucyAoZmlsZSwgcmVsX29mZnNldCwgcmVsX3NpemUsIHN5bXRhYiwgbnN5bXMsIHN0cnRhYiwgaXNfcmVsYSkKLSAgICAgRklMRSAqICAgICAgICAgICAgIGZpbGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgICByZWxfb2Zmc2V0OwotICAgICB1bnNpZ25lZCBsb25nICAgICAgcmVsX3NpemU7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBzeW10YWI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgICBuc3ltczsKLSAgICAgY2hhciAqICAgICAgICAgICAgIHN0cnRhYjsKLSAgICAgaW50ICAgICAgICAgICAgICAgIGlzX3JlbGE7Ci17Ci0gIHVuc2lnbmVkIGludCAgICAgICAgaTsKLSAgRWxmX0ludGVybmFsX1JlbCAqICByZWxzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbGFzOwotCi0KLSAgaWYgKGlzX3JlbGEgPT0gVU5LTk9XTikKLSAgICBpc19yZWxhID0gZ3Vlc3NfaXNfcmVsYSAoZWxmX2hlYWRlci5lX21hY2hpbmUpOwotCi0gIGlmIChpc19yZWxhKQotICAgIHsKLSAgICAgIGlmIChpc18zMmJpdF9lbGYpCi0JewotCSAgRWxmMzJfRXh0ZXJuYWxfUmVsYSAqIGVyZWxhczsKLQotCSAgR0VUX0RBVEFfQUxMT0MgKHJlbF9vZmZzZXQsIHJlbF9zaXplLCBlcmVsYXMsCi0JCQkgIEVsZjMyX0V4dGVybmFsX1JlbGEgKiwgInJlbG9jcyIpOwotCi0JICByZWxfc2l6ZSA9IHJlbF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotCSAgcmVsYXMgPSAoRWxmX0ludGVybmFsX1JlbGEgKikKLQkgICAgbWFsbG9jIChyZWxfc2l6ZSAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbGEpKTsKLQotCSAgaWYgKHJlbGFzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvcihfKCJvdXQgb2YgbWVtb3J5IHBhcnNpbmcgcmVsb2NzIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCByZWxfc2l6ZTsgaSsrKQotCSAgICB7Ci0JICAgICAgcmVsYXNbaV0ucl9vZmZzZXQgPSBCWVRFX0dFVCAoZXJlbGFzW2ldLnJfb2Zmc2V0KTsKLQkgICAgICByZWxhc1tpXS5yX2luZm8gICA9IEJZVEVfR0VUIChlcmVsYXNbaV0ucl9pbmZvKTsKLQkgICAgICByZWxhc1tpXS5yX2FkZGVuZCA9IEJZVEVfR0VUIChlcmVsYXNbaV0ucl9hZGRlbmQpOwotCSAgICB9Ci0KLQkgIGZyZWUgKGVyZWxhcyk7Ci0KLQkgIHJlbHMgPSAoRWxmX0ludGVybmFsX1JlbCAqKSByZWxhczsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRWxmNjRfRXh0ZXJuYWxfUmVsYSAqIGVyZWxhczsKLQotCSAgR0VUX0RBVEFfQUxMT0MgKHJlbF9vZmZzZXQsIHJlbF9zaXplLCBlcmVsYXMsCi0JCQkgIEVsZjY0X0V4dGVybmFsX1JlbGEgKiwgInJlbG9jcyIpOwotCi0JICByZWxfc2l6ZSA9IHJlbF9zaXplIC8gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQotCSAgcmVsYXMgPSAoRWxmX0ludGVybmFsX1JlbGEgKikKLQkgICAgbWFsbG9jIChyZWxfc2l6ZSAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbGEpKTsKLQotCSAgaWYgKHJlbGFzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvcihfKCJvdXQgb2YgbWVtb3J5IHBhcnNpbmcgcmVsb2NzIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCByZWxfc2l6ZTsgaSsrKQotCSAgICB7Ci0JICAgICAgcmVsYXNbaV0ucl9vZmZzZXQgPSBCWVRFX0dFVDggKGVyZWxhc1tpXS5yX29mZnNldCk7Ci0JICAgICAgcmVsYXNbaV0ucl9pbmZvICAgPSBCWVRFX0dFVDggKGVyZWxhc1tpXS5yX2luZm8pOwotCSAgICAgIHJlbGFzW2ldLnJfYWRkZW5kID0gQllURV9HRVQ4IChlcmVsYXNbaV0ucl9hZGRlbmQpOwotCSAgICB9Ci0KLQkgIGZyZWUgKGVyZWxhcyk7Ci0KLQkgIHJlbHMgPSAoRWxmX0ludGVybmFsX1JlbCAqKSByZWxhczsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGlzXzMyYml0X2VsZikKLQl7Ci0JICBFbGYzMl9FeHRlcm5hbF9SZWwgKiBlcmVsczsKLQotCSAgR0VUX0RBVEFfQUxMT0MgKHJlbF9vZmZzZXQsIHJlbF9zaXplLCBlcmVscywKLQkJCSAgRWxmMzJfRXh0ZXJuYWxfUmVsICosICJyZWxvY3MiKTsKLQotCSAgcmVsX3NpemUgPSByZWxfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotCSAgcmVscyA9IChFbGZfSW50ZXJuYWxfUmVsICopCi0JICAgIG1hbGxvYyAocmVsX3NpemUgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWwpKTsKLQotCSAgaWYgKHJlbHMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVycm9yKF8oIm91dCBvZiBtZW1vcnkgcGFyc2luZyByZWxvY3MiKSk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQotCSAgZm9yIChpID0gMDsgaSA8IHJlbF9zaXplOyBpKyspCi0JICAgIHsKLQkgICAgICByZWxzW2ldLnJfb2Zmc2V0ID0gQllURV9HRVQgKGVyZWxzW2ldLnJfb2Zmc2V0KTsKLQkgICAgICByZWxzW2ldLnJfaW5mbyAgID0gQllURV9HRVQgKGVyZWxzW2ldLnJfaW5mbyk7Ci0JICAgIH0KLQotCSAgZnJlZSAoZXJlbHMpOwotCi0JICByZWxhcyA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSByZWxzOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFbGY2NF9FeHRlcm5hbF9SZWwgKiBlcmVsczsKLQotCSAgR0VUX0RBVEFfQUxMT0MgKHJlbF9vZmZzZXQsIHJlbF9zaXplLCBlcmVscywKLQkJCSAgRWxmNjRfRXh0ZXJuYWxfUmVsICosICJyZWxvY3MiKTsKLQotCSAgcmVsX3NpemUgPSByZWxfc2l6ZSAvIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsKTsKLQotCSAgcmVscyA9IChFbGZfSW50ZXJuYWxfUmVsICopCi0JICAgIG1hbGxvYyAocmVsX3NpemUgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWwpKTsKLQotCSAgaWYgKHJlbHMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVycm9yKF8oIm91dCBvZiBtZW1vcnkgcGFyc2luZyByZWxvY3MiKSk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQotCSAgZm9yIChpID0gMDsgaSA8IHJlbF9zaXplOyBpKyspCi0JICAgIHsKLQkgICAgICByZWxzW2ldLnJfb2Zmc2V0ID0gQllURV9HRVQ4IChlcmVsc1tpXS5yX29mZnNldCk7Ci0JICAgICAgcmVsc1tpXS5yX2luZm8gICA9IEJZVEVfR0VUOCAoZXJlbHNbaV0ucl9pbmZvKTsKLQkgICAgfQotCi0JICBmcmVlIChlcmVscyk7Ci0KLQkgIHJlbGFzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIHJlbHM7Ci0JfQotICAgIH0KLQotICBpZiAoaXNfcmVsYSkKLSAgICBwcmludGYKLSAgICAgIChfKCIgIE9mZnNldCAgICBJbmZvICBUeXBlICAgICAgICAgICAgU3ltYm9sJ3MgVmFsdWUgIFN5bWJvbCdzIE5hbWUgICAgICAgICAgQWRkZW5kXG4iKSk7Ci0gIGVsc2UKLSAgICBwcmludGYKLSAgICAgIChfKCIgIE9mZnNldCAgICBJbmZvICBUeXBlICAgICAgICAgICAgU3ltYm9sJ3MgVmFsdWUgIFN5bWJvbCdzIE5hbWVcbiIpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgcmVsX3NpemU7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICogcnR5cGU7Ci0gICAgICBiZmRfdm1hICAgICAgb2Zmc2V0OwotICAgICAgYmZkX3ZtYSAgICAgIGluZm87Ci0gICAgICBiZmRfdm1hICAgICAgc3ltdGFiX2luZGV4OwotICAgICAgYmZkX3ZtYSAgICAgIHR5cGU7Ci0KLSAgICAgIGlmIChpc19yZWxhKQotCXsKLQkgIG9mZnNldCA9IHJlbGFzIFtpXS5yX29mZnNldDsKLQkgIGluZm8gICA9IHJlbGFzIFtpXS5yX2luZm87Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9mZnNldCA9IHJlbHMgW2ldLnJfb2Zmc2V0OwotCSAgaW5mbyAgID0gcmVscyBbaV0ucl9pbmZvOwotCX0KLQotICAgICAgaWYgKGlzXzMyYml0X2VsZikKLQl7Ci0JICB0eXBlICAgICAgICAgPSBFTEYzMl9SX1RZUEUgKGluZm8pOwotCSAgc3ltdGFiX2luZGV4ID0gRUxGMzJfUl9TWU0gIChpbmZvKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGVsZl9oZWFkZXIuZV9tYWNoaW5lID09IEVNX1NQQVJDVjkpCi0JICAgIHR5cGUgICAgICAgPSBFTEY2NF9SX1RZUEVfSUQgKGluZm8pOwotCSAgZWxzZQotCSAgICB0eXBlICAgICAgID0gRUxGNjRfUl9UWVBFIChpbmZvKTsKLQkgIC8qIFRoZSAjaWZkZWYgQkZENjQgYmVsb3cgaXMgdG8gcHJldmVudCBhIGNvbXBpbGUgdGltZSB3YXJuaW5nLgotCSAgICAgV2Uga25vdyB0aGF0IGlmIHdlIGRvIG5vdCBoYXZlIGEgNjQgYml0IGRhdGEgdHlwZSB0aGF0IHdlCi0JICAgICB3aWxsIG5ldmVyIGV4ZWN1dGUgdGhpcyBjb2RlIGFueXdheS4gICovCi0jaWZkZWYgQkZENjQKLQkgIHN5bXRhYl9pbmRleCA9IEVMRjY0X1JfU1lNICAoaW5mbyk7Ci0jZW5kaWYKLQl9Ci0KLSNpZmRlZiBfYmZkX2ludDY0X2xvdwotICAgICAgcHJpbnRmICgiICAlOC44bHggICU1LjVseCAiLCBfYmZkX2ludDY0X2xvdyAob2Zmc2V0KSwgX2JmZF9pbnQ2NF9sb3cgKGluZm8pKTsKLSNlbHNlCi0gICAgICBwcmludGYgKCIgICU4LjhseCAgJTUuNWx4ICIsIG9mZnNldCwgaW5mbyk7Ci0jZW5kaWYKLQotICAgICAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHJ0eXBlID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfTTMyUjoKLQkgIHJ0eXBlID0gZWxmX20zMnJfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fMzg2OgotCWNhc2UgRU1fNDg2OgotCSAgcnR5cGUgPSBlbGZfaTM4Nl9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV82OEs6Ci0JICBydHlwZSA9IGVsZl9tNjhrX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNXzk2MDoKLQkgIHJ0eXBlID0gZWxmX2k5NjBfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fT0xEX1NQQVJDVjk6Ci0JY2FzZSBFTV9TUEFSQzMyUExVUzoKLQljYXNlIEVNX1NQQVJDVjk6Ci0JY2FzZSBFTV9TUEFSQzoKLQkgIHJ0eXBlID0gZWxmX3NwYXJjX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19WODUwOgotCSAgcnR5cGUgPSB2ODUwX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19EMTBWOgotCSAgcnR5cGUgPSBlbGZfZDEwdl9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfRDMwVjoKLQkgIHJ0eXBlID0gZWxmX2QzMHZfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fU0g6Ci0JICBydHlwZSA9IGVsZl9zaF9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfTU4xMDMwMDoKLQkgIHJ0eXBlID0gZWxmX21uMTAzMDBfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX01OMTAyMDA6Ci0JICBydHlwZSA9IGVsZl9tbjEwMjAwX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19GUjMwOgotCSAgcnR5cGUgPSBlbGZfZnIzMF9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9NQ09SRToKLQkgIHJ0eXBlID0gZWxmX21jb3JlX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX1BQQzoKLQkgIHJ0eXBlID0gZWxmX3BwY19yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9NSVBTOgotCWNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JICBydHlwZSA9IGVsZl9taXBzX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0FMUEhBOgotCSAgcnR5cGUgPSBlbGZfYWxwaGFfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQVJNOgotCSAgcnR5cGUgPSBlbGZfYXJtX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19BUkM6Ci0JICBydHlwZSA9IGVsZl9hcmNfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fUEFSSVNDOgotCSAgcnR5cGUgPSBlbGZfaHBwYV9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9QSjoKLQkgIHJ0eXBlID0gZWxmX3BqX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocnR5cGUgPT0gTlVMTCkKLSNpZmRlZiBfYmZkX2ludDY0X2xvdwotCXByaW50ZiAoXygidW5yZWNvZ25pc2VkOiAlLTdseCIpLCBfYmZkX2ludDY0X2xvdyAodHlwZSkpOwotI2Vsc2UKLQlwcmludGYgKF8oInVucmVjb2duaXNlZDogJS03bHgiKSwgdHlwZSk7Ci0jZW5kaWYKLSAgICAgIGVsc2UKLQlwcmludGYgKCIlLTIxLjIxcyIsIHJ0eXBlKTsKLQotICAgICAgaWYgKHN5bXRhYl9pbmRleCkKLQl7Ci0JICBpZiAoc3ltdGFiICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoc3ltdGFiX2luZGV4ID49IG5zeW1zKQotCQlwcmludGYgKCIgYmFkIHN5bWJvbCBpbmRleDogJTA4bHgiLCAodW5zaWduZWQgbG9uZykgc3ltdGFiX2luZGV4KTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfU3ltICogcHN5bTsKLQotCQkgIHBzeW0gPSBzeW10YWIgKyBzeW10YWJfaW5kZXg7Ci0KLQkJICBwcmludGYgKCIgIik7Ci0JCSAgcHJpbnRfdm1hIChwc3ltLT5zdF92YWx1ZSwgTE9OR19IRVgpOwotCQkgIHByaW50ZiAoIiAgIik7Ci0KLQkJICBpZiAocHN5bS0+c3RfbmFtZSA9PSAwKQotCQkgICAgcHJpbnRmICgiJS0yNS4yNXMiLAotCQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbl9oZWFkZXJzICsgcHN5bS0+c3Rfc2huZHgpKTsKLQkJICBlbHNlIGlmIChzdHJ0YWIgPT0gTlVMTCkKLQkJICAgIHByaW50ZiAoXygiPHN0cmluZyB0YWJsZSBpbmRleCAlM2xkPiIpLCBwc3ltLT5zdF9uYW1lKTsKLQkJICBlbHNlCi0JCSAgICBwcmludGYgKCIlLTI1LjI1cyIsIHN0cnRhYiArIHBzeW0tPnN0X25hbWUpOwotCi0JCSAgaWYgKGlzX3JlbGEpCi0JCSAgICBwcmludGYgKCIgKyAlbHgiLCAodW5zaWduZWQgbG9uZykgcmVsYXMgW2ldLnJfYWRkZW5kKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaXNfcmVsYSkKLQl7Ci0JICBwcmludGYgKCIlKmMiLCBpc18zMmJpdF9lbGYgPyAzNCA6IDI2LCAnICcpOwotCSAgcHJpbnRfdm1hIChyZWxhc1tpXS5yX2FkZGVuZCwgTE9OR19IRVgpOwotCX0KLQotICAgICAgaWYgKGVsZl9oZWFkZXIuZV9tYWNoaW5lID09IEVNX1NQQVJDVjkKLQkgICYmICFzdHJjbXAgKHJ0eXBlLCAiUl9TUEFSQ19PTE8xMCIpKQotCXByaW50ZiAoIiArICVseCIsICh1bnNpZ25lZCBsb25nKSBFTEY2NF9SX1RZUEVfREFUQSAoaW5mbykpOwotCi0gICAgICBwdXRjaGFyICgnXG4nKTsKLSAgICB9Ci0KLSAgZnJlZSAocmVsYXMpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfbWlwc19keW5hbWljX3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIERUX01JUFNfUkxEX1ZFUlNJT046IHJldHVybiAiTUlQU19STERfVkVSU0lPTiI7Ci0gICAgY2FzZSBEVF9NSVBTX1RJTUVfU1RBTVA6IHJldHVybiAiTUlQU19USU1FX1NUQU1QIjsKLSAgICBjYXNlIERUX01JUFNfSUNIRUNLU1VNOiByZXR1cm4gIk1JUFNfSUNIRUNLU1VNIjsKLSAgICBjYXNlIERUX01JUFNfSVZFUlNJT046IHJldHVybiAiTUlQU19JVkVSU0lPTiI7Ci0gICAgY2FzZSBEVF9NSVBTX0ZMQUdTOiByZXR1cm4gIk1JUFNfRkxBR1MiOwotICAgIGNhc2UgRFRfTUlQU19CQVNFX0FERFJFU1M6IHJldHVybiAiTUlQU19CQVNFX0FERFJFU1MiOwotICAgIGNhc2UgRFRfTUlQU19NU1lNOiByZXR1cm4gIk1JUFNfTVNZTSI7Ci0gICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUOiByZXR1cm4gIk1JUFNfQ09ORkxJQ1QiOwotICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUOiByZXR1cm4gIk1JUFNfTElCTElTVCI7Ci0gICAgY2FzZSBEVF9NSVBTX0xPQ0FMX0dPVE5POiByZXR1cm4gIk1JUFNfTE9DQUxfR09UTk8iOwotICAgIGNhc2UgRFRfTUlQU19DT05GTElDVE5POiByZXR1cm4gIk1JUFNfQ09ORkxJQ1ROTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0xJQkxJU1ROTzogcmV0dXJuICJNSVBTX0xJQkxJU1ROTyI7Ci0gICAgY2FzZSBEVF9NSVBTX1NZTVRBQk5POiByZXR1cm4gIk1JUFNfU1lNVEFCTk8iOwotICAgIGNhc2UgRFRfTUlQU19VTlJFRkVYVE5POiByZXR1cm4gIk1JUFNfVU5SRUZFWFROTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0dPVFNZTTogcmV0dXJuICJNSVBTX0dPVFNZTSI7Ci0gICAgY2FzZSBEVF9NSVBTX0hJUEFHRU5POiByZXR1cm4gIk1JUFNfSElQQUdFTk8iOwotICAgIGNhc2UgRFRfTUlQU19STERfTUFQOiByZXR1cm4gIk1JUFNfUkxEX01BUCI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTOiByZXR1cm4gIk1JUFNfREVMVEFfQ0xBU1MiOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9DTEFTU19OTzogcmV0dXJuICJNSVBTX0RFTFRBX0NMQVNTX05PIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfSU5TVEFOQ0U6IHJldHVybiAiTUlQU19ERUxUQV9JTlNUQU5DRSI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFX05POiByZXR1cm4gIk1JUFNfREVMVEFfSU5TVEFOQ0VfTk8iOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9SRUxPQzogcmV0dXJuICJNSVBTX0RFTFRBX1JFTE9DIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfUkVMT0NfTk86IHJldHVybiAiTUlQU19ERUxUQV9SRUxPQ19OTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1NZTTogcmV0dXJuICJNSVBTX0RFTFRBX1NZTSI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1NZTV9OTzogcmV0dXJuICJNSVBTX0RFTFRBX1NZTV9OTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNOiByZXR1cm4gIk1JUFNfREVMVEFfQ0xBU1NTWU0iOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9DTEFTU1NZTV9OTzogcmV0dXJuICJNSVBTX0RFTFRBX0NMQVNTU1lNX05PIjsKLSAgICBjYXNlIERUX01JUFNfQ1hYX0ZMQUdTOiByZXR1cm4gIk1JUFNfQ1hYX0ZMQUdTIjsKLSAgICBjYXNlIERUX01JUFNfUElYSUVfSU5JVDogcmV0dXJuICJNSVBTX1BJWElFX0lOSVQiOwotICAgIGNhc2UgRFRfTUlQU19TWU1CT0xfTElCOiByZXR1cm4gIk1JUFNfU1lNQk9MX0xJQiI7Ci0gICAgY2FzZSBEVF9NSVBTX0xPQ0FMUEFHRV9HT1RJRFg6IHJldHVybiAiTUlQU19MT0NBTFBBR0VfR09USURYIjsKLSAgICBjYXNlIERUX01JUFNfTE9DQUxfR09USURYOiByZXR1cm4gIk1JUFNfTE9DQUxfR09USURYIjsKLSAgICBjYXNlIERUX01JUFNfSElEREVOX0dPVElEWDogcmV0dXJuICJNSVBTX0hJRERFTl9HT1RJRFgiOwotICAgIGNhc2UgRFRfTUlQU19QUk9URUNURURfR09USURYOiByZXR1cm4gIk1JUFNfUFJPVEVDVEVEX0dPVElEWCI7Ci0gICAgY2FzZSBEVF9NSVBTX09QVElPTlM6IHJldHVybiAiTUlQU19PUFRJT05TIjsKLSAgICBjYXNlIERUX01JUFNfSU5URVJGQUNFOiByZXR1cm4gIk1JUFNfSU5URVJGQUNFIjsKLSAgICBjYXNlIERUX01JUFNfRFlOU1RSX0FMSUdOOiByZXR1cm4gIk1JUFNfRFlOU1RSX0FMSUdOIjsKLSAgICBjYXNlIERUX01JUFNfSU5URVJGQUNFX1NJWkU6IHJldHVybiAiTUlQU19JTlRFUkZBQ0VfU0laRSI7Ci0gICAgY2FzZSBEVF9NSVBTX1JMRF9URVhUX1JFU09MVkVfQUREUjogcmV0dXJuICJNSVBTX1JMRF9URVhUX1JFU09MVkVfQUREUiI7Ci0gICAgY2FzZSBEVF9NSVBTX1BFUkZfU1VGRklYOiByZXR1cm4gIk1JUFNfUEVSRl9TVUZGSVgiOwotICAgIGNhc2UgRFRfTUlQU19DT01QQUNUX1NJWkU6IHJldHVybiAiTUlQU19DT01QQUNUX1NJWkUiOwotICAgIGNhc2UgRFRfTUlQU19HUF9WQUxVRTogcmV0dXJuICJNSVBTX0dQX1ZBTFVFIjsKLSAgICBjYXNlIERUX01JUFNfQVVYX0RZTkFNSUM6IHJldHVybiAiTUlQU19BVVhfRFlOQU1JQyI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3NwYXJjNjRfZHluYW1pY190eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBEVF9TUEFSQ19SRUdJU1RFUjogcmV0dXJuICJTUEFSQ19SRUdJU1RFUiI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3BhcmlzY19keW5hbWljX3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIERUX0hQX0xPQURfTUFQOglyZXR1cm4gIkhQX0xPQURfTUFQIjsKLSAgICBjYXNlIERUX0hQX0RMRF9GTEFHUzoJcmV0dXJuICJIUF9ETERfRkxBR1MiOwotICAgIGNhc2UgRFRfSFBfRExEX0hPT0s6CXJldHVybiAiSFBfRExEX0hPT0siOwotICAgIGNhc2UgRFRfSFBfVVgxMF9JTklUOglyZXR1cm4gIkhQX1VYMTBfSU5JVCI7Ci0gICAgY2FzZSBEVF9IUF9VWDEwX0lOSVRTWjoJcmV0dXJuICJIUF9VWDEwX0lOSVRTWiI7Ci0gICAgY2FzZSBEVF9IUF9QUkVJTklUOgkJcmV0dXJuICJIUF9QUkVJTklUIjsKLSAgICBjYXNlIERUX0hQX1BSRUlOSVRTWjoJcmV0dXJuICJIUF9QUkVJTklUU1oiOwotICAgIGNhc2UgRFRfSFBfTkVFREVEOgkJcmV0dXJuICJIUF9ORUVERUQiOwotICAgIGNhc2UgRFRfSFBfVElNRV9TVEFNUDoJcmV0dXJuICJIUF9USU1FX1NUQU1QIjsKLSAgICBjYXNlIERUX0hQX0NIRUNLU1VNOglyZXR1cm4gIkhQX0NIRUNLU1VNIjsKLSAgICBjYXNlIERUX0hQX0dTVF9TSVpFOglyZXR1cm4gIkhQX0dTVF9TSVpFIjsKLSAgICBjYXNlIERUX0hQX0dTVF9WRVJTSU9OOglyZXR1cm4gIkhQX0dTVF9WRVJTSU9OIjsKLSAgICBjYXNlIERUX0hQX0dTVF9IQVNIVkFMOglyZXR1cm4gIkhQX0dTVF9IQVNIVkFMIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfZHluYW1pY190eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgRFRfTlVMTDoJcmV0dXJuICJOVUxMIjsKLSAgICBjYXNlIERUX05FRURFRDoJcmV0dXJuICJORUVERUQiOwotICAgIGNhc2UgRFRfUExUUkVMU1o6CXJldHVybiAiUExUUkVMU1oiOwotICAgIGNhc2UgRFRfUExUR09UOglyZXR1cm4gIlBMVEdPVCI7Ci0gICAgY2FzZSBEVF9IQVNIOglyZXR1cm4gIkhBU0giOwotICAgIGNhc2UgRFRfU1RSVEFCOglyZXR1cm4gIlNUUlRBQiI7Ci0gICAgY2FzZSBEVF9TWU1UQUI6CXJldHVybiAiU1lNVEFCIjsKLSAgICBjYXNlIERUX1JFTEE6CXJldHVybiAiUkVMQSI7Ci0gICAgY2FzZSBEVF9SRUxBU1o6CXJldHVybiAiUkVMQVNaIjsKLSAgICBjYXNlIERUX1JFTEFFTlQ6CXJldHVybiAiUkVMQUVOVCI7Ci0gICAgY2FzZSBEVF9TVFJTWjoJcmV0dXJuICJTVFJTWiI7Ci0gICAgY2FzZSBEVF9TWU1FTlQ6CXJldHVybiAiU1lNRU5UIjsKLSAgICBjYXNlIERUX0lOSVQ6CXJldHVybiAiSU5JVCI7Ci0gICAgY2FzZSBEVF9GSU5JOglyZXR1cm4gIkZJTkkiOwotICAgIGNhc2UgRFRfU09OQU1FOglyZXR1cm4gIlNPTkFNRSI7Ci0gICAgY2FzZSBEVF9SUEFUSDoJcmV0dXJuICJSUEFUSCI7Ci0gICAgY2FzZSBEVF9TWU1CT0xJQzoJcmV0dXJuICJTWU1CT0xJQyI7Ci0gICAgY2FzZSBEVF9SRUw6CXJldHVybiAiUkVMIjsKLSAgICBjYXNlIERUX1JFTFNaOglyZXR1cm4gIlJFTFNaIjsKLSAgICBjYXNlIERUX1JFTEVOVDoJcmV0dXJuICJSRUxFTlQiOwotICAgIGNhc2UgRFRfUExUUkVMOglyZXR1cm4gIlBMVFJFTCI7Ci0gICAgY2FzZSBEVF9ERUJVRzoJcmV0dXJuICJERUJVRyI7Ci0gICAgY2FzZSBEVF9URVhUUkVMOglyZXR1cm4gIlRFWFRSRUwiOwotICAgIGNhc2UgRFRfSk1QUkVMOglyZXR1cm4gIkpNUFJFTCI7Ci0gICAgY2FzZSBEVF9CSU5EX05PVzogICByZXR1cm4gIkJJTkRfTk9XIjsKLSAgICBjYXNlIERUX0lOSVRfQVJSQVk6IHJldHVybiAiSU5JVF9BUlJBWSI7Ci0gICAgY2FzZSBEVF9GSU5JX0FSUkFZOiByZXR1cm4gIkZJTklfQVJSQVkiOwotICAgIGNhc2UgRFRfSU5JVF9BUlJBWVNaOiByZXR1cm4gIklOSVRfQVJSQVlTWiI7Ci0gICAgY2FzZSBEVF9GSU5JX0FSUkFZU1o6IHJldHVybiAiRklOSV9BUlJBWVNaIjsKLQotICAgIGNhc2UgRFRfUExUUEFEU1o6CXJldHVybiAiUExUUEFEU1oiOwotICAgIGNhc2UgRFRfTU9WRUVOVDoJcmV0dXJuICJNT1ZFRU5UIjsKLSAgICBjYXNlIERUX01PVkVTWjoJcmV0dXJuICJNT1ZFU1oiOwotICAgIGNhc2UgRFRfRkVBVFVSRV8xOglyZXR1cm4gIkZFQVRVUkVfMSI7Ci0gICAgY2FzZSBEVF9QT1NGTEFHXzE6CXJldHVybiAiUE9TRkxBR18xIjsKLSAgICBjYXNlIERUX1NZTUlOU1o6CXJldHVybiAiU1lNSU5TWiI7Ci0gICAgY2FzZSBEVF9TWU1JTkVOVDoJcmV0dXJuICJTWU1JTkVOVCI7IC8qIGFrYSBWQUxSTkdISSAqLwotCi0gICAgY2FzZSBEVF9BRERSUk5HTE86ICByZXR1cm4gIkFERFJSTkdMTyI7Ci0gICAgY2FzZSBEVF9TWU1JTkZPOglyZXR1cm4gIlNZTUlORk8iOyAvKiBha2EgQUREUlJOR0hJICovCi0KLSAgICBjYXNlIERUX1ZFUlNZTToJcmV0dXJuICJWRVJTWU0iOwotCi0gICAgY2FzZSBEVF9SRUxBQ09VTlQ6CXJldHVybiAiUkVMQUNPVU5UIjsKLSAgICBjYXNlIERUX1JFTENPVU5UOglyZXR1cm4gIlJFTENPVU5UIjsKLSAgICBjYXNlIERUX0ZMQUdTXzE6CXJldHVybiAiRkxBR1NfMSI7Ci0gICAgY2FzZSBEVF9WRVJERUY6CXJldHVybiAiVkVSREVGIjsKLSAgICBjYXNlIERUX1ZFUkRFRk5VTToJcmV0dXJuICJWRVJERUZOVU0iOwotICAgIGNhc2UgRFRfVkVSTkVFRDoJcmV0dXJuICJWRVJORUVEIjsKLSAgICBjYXNlIERUX1ZFUk5FRUROVU06CXJldHVybiAiVkVSTkVFRE5VTSI7Ci0KLSAgICBjYXNlIERUX0FVWElMSUFSWToJcmV0dXJuICJBVVhJTEFSWSI7Ci0gICAgY2FzZSBEVF9VU0VEOglyZXR1cm4gIlVTRUQiOwotICAgIGNhc2UgRFRfRklMVEVSOglyZXR1cm4gIkZJTFRFUiI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKCh0eXBlID49IERUX0xPUFJPQykgJiYgKHR5cGUgPD0gRFRfSElQUk9DKSkKLQl7Ci0JICBjb25zdCBjaGFyICogcmVzdWx0OwotCi0JICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotCSAgICB7Ci0JICAgIGNhc2UgRU1fTUlQUzoKLQkgICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKLQkgICAgICByZXN1bHQgPSBnZXRfbWlwc19keW5hbWljX3R5cGUgKHR5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEVNX1NQQVJDVjk6Ci0JICAgICAgcmVzdWx0ID0gZ2V0X3NwYXJjNjRfZHluYW1pY190eXBlICh0eXBlKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXN1bHQgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChyZXN1bHQgIT0gTlVMTCkKLQkgICAgcmV0dXJuIHJlc3VsdDsKLQotCSAgc3ByaW50ZiAoYnVmZiwgXygiUHJvY2Vzc29yIFNwZWNpZmljOiAlbHgiKSwgdHlwZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoKHR5cGUgPj0gRFRfTE9PUykgJiYgKHR5cGUgPD0gRFRfSElPUykpCi0JewotCSAgY29uc3QgY2hhciAqIHJlc3VsdDsKLQotCSAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLQkgICAgewotCSAgICBjYXNlIEVNX1BBUklTQzoKLQkgICAgICByZXN1bHQgPSBnZXRfcGFyaXNjX2R5bmFtaWNfdHlwZSAodHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmVzdWx0ID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAocmVzdWx0ICE9IE5VTEwpCi0JICAgIHJldHVybiByZXN1bHQ7Ci0KLQkgIHNwcmludGYgKGJ1ZmYsIF8oIk9wZXJhdGluZyBTeXN0ZW0gc3BlY2lmaWM6ICVseCIpLCB0eXBlKTsKLQl9Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAlbHgiKSwgdHlwZSk7Ci0KLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2ZpbGVfdHlwZSAoZV90eXBlKQotICAgICB1bnNpZ25lZCBlX3R5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKGVfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFVF9OT05FOglyZXR1cm4gXygiTk9ORSAoTm9uZSkiKTsKLSAgICBjYXNlIEVUX1JFTDoJcmV0dXJuIF8oIlJFTCAoUmVsb2NhdGFibGUgZmlsZSkiKTsKLSAgICBjYXNlIEVUX0VYRUM6ICAgICAgIHJldHVybiBfKCJFWEVDIChFeGVjdXRhYmxlIGZpbGUpIik7Ci0gICAgY2FzZSBFVF9EWU46ICAgICAgICByZXR1cm4gXygiRFlOIChTaGFyZWQgb2JqZWN0IGZpbGUpIik7Ci0gICAgY2FzZSBFVF9DT1JFOiAgICAgICByZXR1cm4gXygiQ09SRSAoQ29yZSBmaWxlKSIpOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmICgoZV90eXBlID49IEVUX0xPUFJPQykgJiYgKGVfdHlwZSA8PSBFVF9ISVBST0MpKQotCXNwcmludGYgKGJ1ZmYsIF8oIlByb2Nlc3NvciBTcGVjaWZpYzogKCV4KSIpLCBlX3R5cGUpOwotICAgICAgZWxzZSBpZiAoKGVfdHlwZSA+PSBFVF9MT09TKSAmJiAoZV90eXBlIDw9IEVUX0hJT1MpKQotCXNwcmludGYgKGJ1ZmYsIF8oIk9TIFNwZWNpZmljOiAoJXgpIiksIGVfdHlwZSk7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAleCIpLCBlX3R5cGUpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfbWFjaGluZV9uYW1lIChlX21hY2hpbmUpCi0gICAgIHVuc2lnbmVkIGVfbWFjaGluZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAoZV9tYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIEVNX05PTkU6ICAgICAgICAJcmV0dXJuIF8oIk5vbmUiKTsKLSAgICBjYXNlIEVNX00zMjogICAgICAgICAJcmV0dXJuICJXRTMyMTAwIjsKLSAgICBjYXNlIEVNX1NQQVJDOiAgICAgICAJcmV0dXJuICJTcGFyYyI7Ci0gICAgY2FzZSBFTV8zODY6ICAgICAgICAgCXJldHVybiAiSW50ZWwgODAzODYiOwotICAgIGNhc2UgRU1fNjhLOiAgICAgICAgIAlyZXR1cm4gIk1DNjgwMDAiOwotICAgIGNhc2UgRU1fODhLOiAgICAgICAgIAlyZXR1cm4gIk1DODgwMDAiOwotICAgIGNhc2UgRU1fNDg2OiAgICAgICAgIAlyZXR1cm4gIkludGVsIDgwNDg2IjsKLSAgICBjYXNlIEVNXzg2MDogICAgICAgICAJcmV0dXJuICJJbnRlbCA4MDg2MCI7Ci0gICAgY2FzZSBFTV9NSVBTOiAgICAgICAgCXJldHVybiAiTUlQUyBSMzAwMCBiaWctZW5kaWFuIjsKLSAgICBjYXNlIEVNX1MzNzA6ICAgICAgICAJcmV0dXJuICJBbWRhaGwiOwotICAgIGNhc2UgRU1fTUlQU19SUzRfQkU6IAlyZXR1cm4gIk1JUFMgUjQwMDAgYmlnLWVuZGlhbiI7Ci0gICAgY2FzZSBFTV9PTERfU1BBUkNWOToJcmV0dXJuICJTcGFyYyB2OSAob2xkKSI7Ci0gICAgY2FzZSBFTV9QQVJJU0M6ICAgICAgCXJldHVybiAiSFBQQSI7Ci0gICAgY2FzZSBFTV9QUENfT0xEOgkJcmV0dXJuICJQb3dlciBQQyAob2xkKSI7Ci0gICAgY2FzZSBFTV9TUEFSQzMyUExVUzogCXJldHVybiAiU3BhcmMgdjgrIiA7Ci0gICAgY2FzZSBFTV85NjA6ICAgICAgICAgCXJldHVybiAiSW50ZWwgOTA4NjAiOwotICAgIGNhc2UgRU1fUFBDOiAgICAgICAgIAlyZXR1cm4gIlBvd2VyUEMiOwotICAgIGNhc2UgRU1fVjgwMDogICAgICAgICAJcmV0dXJuICJORUMgVjgwMCI7Ci0gICAgY2FzZSBFTV9GUjIwOiAgICAgICAgIAlyZXR1cm4gIkZ1aml0c3UgRlIyMCI7Ci0gICAgY2FzZSBFTV9SSDMyOiAgICAgICAgIAlyZXR1cm4gIlRSVyBSSDMyIjsKLSAgICBjYXNlIEVNX01DT1JFOgkgICAgICAgIHJldHVybiAiTUNPUkUiOwotICAgIGNhc2UgRU1fQVJNOgkgCXJldHVybiAiQVJNIjsKLSAgICBjYXNlIEVNX09MRF9BTFBIQToJIAlyZXR1cm4gIkRpZ2l0YWwgQWxwaGEgKG9sZCkiOwotICAgIGNhc2UgRU1fU0g6CQkgCXJldHVybiAiSGl0YWNoaSBTSCI7Ci0gICAgY2FzZSBFTV9TUEFSQ1Y5OiAgICAgCXJldHVybiAiU3BhcmMgdjkiOwotICAgIGNhc2UgRU1fVFJJQ09SRTogICAgCXJldHVybiAiU2llbWVucyBUcmljb3JlIjsKLSAgICBjYXNlIEVNX0FSQzoJCXJldHVybiAiQXJnb25hdXQgUklTQyBDb3JlIjsKLSAgICBjYXNlIEVNX0g4XzMwMDoJCXJldHVybiAiSGl0YWNoaSBIOC8zMDAiOwotICAgIGNhc2UgRU1fSDhfMzAwSDoJCXJldHVybiAiSGl0YWNoaSBIOC8zMDBIIjsKLSAgICBjYXNlIEVNX0g4UzoJCXJldHVybiAiSGl0YWNoaSBIOFMiOwotICAgIGNhc2UgRU1fSDhfNTAwOgkJcmV0dXJuICJIaXRhY2hpIEg4LzUwMCI7Ci0gICAgY2FzZSBFTV9JQV82NDoJCXJldHVybiAiSW50ZWwgSUEtNjQiOwotICAgIGNhc2UgRU1fTUlQU19YOgkJcmV0dXJuICJTdGFuZm9yZCBNSVBTLVgiOwotICAgIGNhc2UgRU1fQ09MREZJUkU6CQlyZXR1cm4gIk1vdG9yb2xhIENvbGRmaXJlIjsKLSAgICBjYXNlIEVNXzY4SEMxMjoJCXJldHVybiAiTW90b3JvbGEgTTY4SEMxMiI7Ci0gICAgY2FzZSBFTV9BTFBIQTogICAgICAgCXJldHVybiAiQWxwaGEiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0QxMFY6ICAgICAgICByZXR1cm4gImQxMHYiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0QzMFY6ICAgICAgICByZXR1cm4gImQzMHYiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0FSQzoJCXJldHVybiAiQXJjIjsKLSAgICBjYXNlIEVNX0NZR05VU19NMzJSOglyZXR1cm4gIk1pdHN1YmlzaGkgTTMyciI7Ci0gICAgY2FzZSBFTV9DWUdOVVNfVjg1MDoJcmV0dXJuICJORUMgdjg1MCI7Ci0gICAgY2FzZSBFTV9DWUdOVVNfTU4xMDMwMDoJcmV0dXJuICJtbjEwMzAwIjsKLSAgICBjYXNlIEVNX0NZR05VU19NTjEwMjAwOglyZXR1cm4gIm1uMTAyMDAiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0ZSMzA6CXJldHVybiAiRnVqaXRzdSBGUjMwIjsKLSAgICBjYXNlIEVNX1BKOiAgICAgICAgICAgICAgICAgcmV0dXJuICJwaWNvSmF2YSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duPjogJXgiKSwgZV9tYWNoaW5lKTsKLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X21hY2hpbmVfZmxhZ3MgKGVfZmxhZ3MsIGVfbWFjaGluZSkKLSAgICAgdW5zaWduZWQgZV9mbGFnczsKLSAgICAgdW5zaWduZWQgZV9tYWNoaW5lOwotewotICBzdGF0aWMgY2hhciBidWYgWzEwMjRdOwotCi0gIGJ1ZlswXSA9ICdcMCc7Ci0gIGlmIChlX2ZsYWdzKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZV9tYWNoaW5lKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBFTV82OEs6Ci0gICAgICAgICAgaWYgKGVfZmxhZ3MgJiBFRl9DUFUzMikKLSAgICAgICAgICAgIHN0cmNhdCAoYnVmLCAiLCBjcHUzMiIpOwotICAgICAgICAgIGJyZWFrOwotCi0JY2FzZSBFTV9QUEM6Ci0JICBpZiAoZV9mbGFncyAmIEVGX1BQQ19FTUIpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBlbWIiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEUpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCByZWxvY2F0YWJsZSIpOwotCi0JICBpZiAoZV9mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCByZWxvY2F0YWJsZS1saWIiKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfVjg1MDoKLQkgIHN3aXRjaCAoZV9mbGFncyAmIEVGX1Y4NTBfQVJDSCkKLQkgICAgewotCSAgICBjYXNlIEVfVjg1MEVfQVJDSDoKLQkgICAgICBzdHJjYXQgKGJ1ZiwgIiwgdjg1MGUiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBFX1Y4NTBFQV9BUkNIOgotCSAgICAgIHN0cmNhdCAoYnVmLCAiLCB2ODUwZWEiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBFX1Y4NTBfQVJDSDoKLQkgICAgICBzdHJjYXQgKGJ1ZiwgIiwgdjg1MCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHN0cmNhdCAoYnVmLCAiLCB1bmtub3duIHY4NTAgYXJjaGl0ZWN0dXJlIHZhcmlhbnQiKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19NMzJSOgotCSAgaWYgKChlX2ZsYWdzICYgRUZfTTMyUl9BUkNIKSA9PSBFX00zMlJfQVJDSCkKLQkgICAgc3RyY2F0IChidWYsICIsIG0zMnIiKTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX01JUFM6Ci0JY2FzZSBFTV9NSVBTX1JTNF9CRToKLQkgIGlmIChlX2ZsYWdzICYgRUZfTUlQU19OT1JFT1JERVIpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBub3Jlb3JkZXIiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9NSVBTX1BJQykKLQkgICAgc3RyY2F0IChidWYsICIsIHBpYyIpOwotCi0JICBpZiAoZV9mbGFncyAmIEVGX01JUFNfQ1BJQykKLQkgICAgc3RyY2F0IChidWYsICIsIGNwaWMiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9NSVBTX0FCSTIpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBhYmkyIik7Ci0KLQkgIGlmICgoZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMSkKLQkgICAgc3RyY2F0IChidWYsICIsIG1pcHMxIik7Ci0KLQkgIGlmICgoZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMikKLQkgICAgc3RyY2F0IChidWYsICIsIG1pcHMyIik7Ci0KLQkgIGlmICgoZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfMykKLQkgICAgc3RyY2F0IChidWYsICIsIG1pcHMzIik7Ci0KLQkgIGlmICgoZV9mbGFncyAmIEVGX01JUFNfQVJDSCkgPT0gRV9NSVBTX0FSQ0hfNCkKLQkgICAgc3RyY2F0IChidWYsICIsIG1pcHM0Iik7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fU1BBUkNWOToKLQkgIGlmIChlX2ZsYWdzICYgRUZfU1BBUkNfMzJQTFVTKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgdjgrIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfU1BBUkNfU1VOX1VTMSkKLQkgICAgc3RyY2F0IChidWYsICIsIHVsdHJhc3BhcmNJIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfU1BBUkNfU1VOX1VTMykKLQkgICAgc3RyY2F0IChidWYsICIsIHVsdHJhc3BhcmNJSUkiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9TUEFSQ19IQUxfUjEpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBoYWxyMSIpOwotCi0JICBpZiAoZV9mbGFncyAmIEVGX1NQQVJDX0xFREFUQSkKLQkgICAgc3RyY2F0IChidWYsICIsIGxlZGF0YSIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9TUEFSQ1Y5X01NKSA9PSBFRl9TUEFSQ1Y5X1RTTykKLQkgICAgc3RyY2F0IChidWYsICIsIHRzbyIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9TUEFSQ1Y5X01NKSA9PSBFRl9TUEFSQ1Y5X1BTTykKLQkgICAgc3RyY2F0IChidWYsICIsIHBzbyIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9TUEFSQ1Y5X01NKSA9PSBFRl9TUEFSQ1Y5X1JNTykKLQkgICAgc3RyY2F0IChidWYsICIsIHJtbyIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX1BBUklTQzoKLQkgIHN3aXRjaCAoZV9mbGFncyAmIEVGX1BBUklTQ19BUkNIKQotCSAgICB7Ci0JICAgIGNhc2UgRUZBX1BBUklTQ18xXzA6Ci0JICAgICAgc3RyY3B5IChidWYsICIsIFBBLVJJU0MgMS4wIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRUZBX1BBUklTQ18xXzE6Ci0JICAgICAgc3RyY3B5IChidWYsICIsIFBBLVJJU0MgMS4xIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRUZBX1BBUklTQ18yXzA6Ci0JICAgICAgc3RyY3B5IChidWYsICIsIFBBLVJJU0MgMi4wIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChlX2ZsYWdzICYgRUZfUEFSSVNDX1RSQVBOSUwpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCB0cmFwbmlsIik7Ci0JICBpZiAoZV9mbGFncyAmIEVGX1BBUklTQ19FWFQpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBleHQiKTsKLQkgIGlmIChlX2ZsYWdzICYgRUZfUEFSSVNDX0xTQikKLQkgICAgc3RyY2F0IChidWYsICIsIGxzYiIpOwotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QQVJJU0NfV0lERSkKLQkgICAgc3RyY2F0IChidWYsICIsIHdpZGUiKTsKLQkgIGlmIChlX2ZsYWdzICYgRUZfUEFSSVNDX05PX0tBQlApCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBubyBrYWJwIik7Ci0JICBpZiAoZV9mbGFncyAmIEVGX1BBUklTQ19MQVpZU1dBUCkKLQkgICAgc3RyY2F0IChidWYsICIsIGxhenlzd2FwIik7Ci0JICBicmVhazsKLQkgIAotCWNhc2UgRU1fUEo6Ci0JICBpZiAoKGVfZmxhZ3MgJiBFRl9QSUNPSkFWQV9ORVdDQUxMUykgPT0gRUZfUElDT0pBVkFfTkVXQ0FMTFMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBuZXcgY2FsbGluZyBjb252ZW50aW9uIik7Ci0KLQkgIGlmICgoZV9mbGFncyAmIEVGX1BJQ09KQVZBX0dOVUNBTExTKSA9PSBFRl9QSUNPSkFWQV9HTlVDQUxMUykKLQkgICAgc3RyY2F0IChidWYsICIsIGdudSBjYWxsaW5nIGNvbnZlbnRpb24iKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X21pcHNfc2VnbWVudF90eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBQVF9NSVBTX1JFR0lORk86Ci0gICAgICByZXR1cm4gIlJFR0lORk8iOwotICAgIGNhc2UgUFRfTUlQU19SVFBST0M6Ci0gICAgICByZXR1cm4gIlJUUFJPQyI7Ci0gICAgY2FzZSBQVF9NSVBTX09QVElPTlM6Ci0gICAgICByZXR1cm4gIk9QVElPTlMiOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9wYXJpc2Nfc2VnbWVudF90eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBQVF9IUF9UTFM6CQlyZXR1cm4gIkhQX1RMUyI7Ci0gICAgY2FzZSBQVF9IUF9DT1JFX05PTkU6CXJldHVybiAiSFBfQ09SRV9OT05FIjsKLSAgICBjYXNlIFBUX0hQX0NPUkVfVkVSU0lPTjoJcmV0dXJuICJIUF9DT1JFX1ZFUlNJT04iOwotICAgIGNhc2UgUFRfSFBfQ09SRV9LRVJORUw6CXJldHVybiAiSFBfQ09SRV9LRVJORUwiOwotICAgIGNhc2UgUFRfSFBfQ09SRV9DT01NOglyZXR1cm4gIkhQX0NPUkVfQ09NTSI7Ci0gICAgY2FzZSBQVF9IUF9DT1JFX1BST0M6CXJldHVybiAiSFBfQ09SRV9QUk9DIjsKLSAgICBjYXNlIFBUX0hQX0NPUkVfTE9BREFCTEU6CXJldHVybiAiSFBfQ09SRV9MT0FEQUJMRSI7Ci0gICAgY2FzZSBQVF9IUF9DT1JFX1NUQUNLOglyZXR1cm4gIkhQX0NPUkVfU1RBQ0siOwotICAgIGNhc2UgUFRfSFBfQ09SRV9TSE06CXJldHVybiAiSFBfQ09SRV9TSE0iOwotICAgIGNhc2UgUFRfSFBfQ09SRV9NTUY6CXJldHVybiAiSFBfQ09SRV9NTUYiOwotICAgIGNhc2UgUFRfSFBfUEFSQUxMRUw6CXJldHVybiAiSFBfUEFSQUxMRUwiOwotICAgIGNhc2UgUFRfSFBfRkFTVEJJTkQ6CXJldHVybiAiSFBfRkFTVEJJTkQiOwotICAgIGNhc2UgUFRfUEFSSVNDX0FSQ0hFWFQ6CXJldHVybiAiUEFSSVNDX0FSQ0hFWFQiOwotICAgIGNhc2UgUFRfUEFSSVNDX1VOV0lORDoJcmV0dXJuICJQQVJJU0NfVU5XSU5EIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfc2VnbWVudF90eXBlIChwX3R5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgcF90eXBlOwotewotICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLSAgc3dpdGNoIChwX3R5cGUpCi0gICAgewotICAgIGNhc2UgUFRfTlVMTDogICAgICAgcmV0dXJuICJOVUxMIjsKLSAgICBjYXNlIFBUX0xPQUQ6ICAgICAgIHJldHVybiAiTE9BRCI7Ci0gICAgY2FzZSBQVF9EWU5BTUlDOglyZXR1cm4gIkRZTkFNSUMiOwotICAgIGNhc2UgUFRfSU5URVJQOiAgICAgcmV0dXJuICJJTlRFUlAiOwotICAgIGNhc2UgUFRfTk9URTogICAgICAgcmV0dXJuICJOT1RFIjsKLSAgICBjYXNlIFBUX1NITElCOiAgICAgIHJldHVybiAiU0hMSUIiOwotICAgIGNhc2UgUFRfUEhEUjogICAgICAgcmV0dXJuICJQSERSIjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoKHBfdHlwZSA+PSBQVF9MT1BST0MpICYmIChwX3R5cGUgPD0gUFRfSElQUk9DKSkKLQl7Ci0JICBjb25zdCBjaGFyICogcmVzdWx0OwotCi0JICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotCSAgICB7Ci0JICAgIGNhc2UgRU1fTUlQUzoKLQkgICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKLQkgICAgICByZXN1bHQgPSBnZXRfbWlwc19zZWdtZW50X3R5cGUgKHBfdHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRU1fUEFSSVNDOgotCSAgICAgIHJlc3VsdCA9IGdldF9wYXJpc2Nfc2VnbWVudF90eXBlIChwX3R5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJlc3VsdCA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHJlc3VsdCAhPSBOVUxMKQotCSAgICByZXR1cm4gcmVzdWx0OwotCi0JICBzcHJpbnRmIChidWZmLCAiTE9QUk9DKyVseCIsIHBfdHlwZSAtIFBUX0xPUFJPQyk7Ci0JfQotICAgICAgZWxzZSBpZiAoKHBfdHlwZSA+PSBQVF9MT09TKSAmJiAocF90eXBlIDw9IFBUX0hJT1MpKQotCXsKLQkgIGNvbnN0IGNoYXIgKiByZXN1bHQ7Ci0KLQkgIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCi0JICAgIHsKLQkgICAgY2FzZSBFTV9QQVJJU0M6Ci0JICAgICAgcmVzdWx0ID0gZ2V0X3BhcmlzY19zZWdtZW50X3R5cGUgKHBfdHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmVzdWx0ID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAocmVzdWx0ICE9IE5VTEwpCi0JICAgIHJldHVybiByZXN1bHQ7Ci0KLQkgIHNwcmludGYgKGJ1ZmYsICJMT09TKyVseCIsIHBfdHlwZSAtIFBUX0xPT1MpOwotCX0KLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICVseCIpLCBwX3R5cGUpOwotCi0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9taXBzX3NlY3Rpb25fdHlwZV9uYW1lIChzaF90eXBlKQotICAgICB1bnNpZ25lZCBpbnQgc2hfdHlwZTsKLXsKLSAgc3dpdGNoIChzaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9NSVBTX0xJQkxJU1Q6ICAgICAgIHJldHVybiAiTUlQU19MSUJMSVNUIjsKLSAgICBjYXNlIFNIVF9NSVBTX01TWU06ICAgICAgICAgIHJldHVybiAiTUlQU19NU1lNIjsKLSAgICBjYXNlIFNIVF9NSVBTX0NPTkZMSUNUOiAgICAgIHJldHVybiAiTUlQU19DT05GTElDVCI7Ci0gICAgY2FzZSBTSFRfTUlQU19HUFRBQjogICAgICAgICByZXR1cm4gIk1JUFNfR1BUQUIiOwotICAgIGNhc2UgU0hUX01JUFNfVUNPREU6ICAgICAgICAgcmV0dXJuICJNSVBTX1VDT0RFIjsKLSAgICBjYXNlIFNIVF9NSVBTX0RFQlVHOiAgICAgICAgIHJldHVybiAiTUlQU19ERUJVRyI7Ci0gICAgY2FzZSBTSFRfTUlQU19SRUdJTkZPOiAgICAgICByZXR1cm4gIk1JUFNfUkVHSU5GTyI7Ci0gICAgY2FzZSBTSFRfTUlQU19QQUNLQUdFOiAgICAgICByZXR1cm4gIk1JUFNfUEFDS0FHRSI7Ci0gICAgY2FzZSBTSFRfTUlQU19QQUNLU1lNOiAgICAgICByZXR1cm4gIk1JUFNfUEFDS1NZTSI7Ci0gICAgY2FzZSBTSFRfTUlQU19SRUxEOiAgICAgICAgICByZXR1cm4gIk1JUFNfUkVMRCI7Ci0gICAgY2FzZSBTSFRfTUlQU19JRkFDRTogICAgICAgICByZXR1cm4gIk1JUFNfSUZBQ0UiOwotICAgIGNhc2UgU0hUX01JUFNfQ09OVEVOVDogICAgICAgcmV0dXJuICJNSVBTX0NPTlRFTlQiOwotICAgIGNhc2UgU0hUX01JUFNfT1BUSU9OUzogICAgICAgcmV0dXJuICJNSVBTX09QVElPTlMiOwotICAgIGNhc2UgU0hUX01JUFNfU0hEUjogICAgICAgICAgcmV0dXJuICJNSVBTX1NIRFIiOwotICAgIGNhc2UgU0hUX01JUFNfRkRFU0M6ICAgICAgICAgcmV0dXJuICJNSVBTX0ZERVNDIjsKLSAgICBjYXNlIFNIVF9NSVBTX0VYVFNZTTogICAgICAgIHJldHVybiAiTUlQU19FWFRTWU0iOwotICAgIGNhc2UgU0hUX01JUFNfREVOU0U6ICAgICAgICAgcmV0dXJuICJNSVBTX0RFTlNFIjsKLSAgICBjYXNlIFNIVF9NSVBTX1BERVNDOiAgICAgICAgIHJldHVybiAiTUlQU19QREVTQyI7Ci0gICAgY2FzZSBTSFRfTUlQU19MT0NTWU06ICAgICAgICByZXR1cm4gIk1JUFNfTE9DU1lNIjsKLSAgICBjYXNlIFNIVF9NSVBTX0FVWFNZTTogICAgICAgIHJldHVybiAiTUlQU19BVVhTWU0iOwotICAgIGNhc2UgU0hUX01JUFNfT1BUU1lNOiAgICAgICAgcmV0dXJuICJNSVBTX09QVFNZTSI7Ci0gICAgY2FzZSBTSFRfTUlQU19MT0NTVFI6ICAgICAgICByZXR1cm4gIk1JUFNfTE9DU1RSIjsKLSAgICBjYXNlIFNIVF9NSVBTX0xJTkU6ICAgICAgICAgIHJldHVybiAiTUlQU19MSU5FIjsKLSAgICBjYXNlIFNIVF9NSVBTX1JGREVTQzogICAgICAgIHJldHVybiAiTUlQU19SRkRFU0MiOwotICAgIGNhc2UgU0hUX01JUFNfREVMVEFTWU06ICAgICAgcmV0dXJuICJNSVBTX0RFTFRBU1lNIjsKLSAgICBjYXNlIFNIVF9NSVBTX0RFTFRBSU5TVDogICAgIHJldHVybiAiTUlQU19ERUxUQUlOU1QiOwotICAgIGNhc2UgU0hUX01JUFNfREVMVEFDTEFTUzogICAgcmV0dXJuICJNSVBTX0RFTFRBQ0xBU1MiOwotICAgIGNhc2UgU0hUX01JUFNfRFdBUkY6ICAgICAgICAgcmV0dXJuICJNSVBTX0RXQVJGIjsKLSAgICBjYXNlIFNIVF9NSVBTX0RFTFRBREVDTDogICAgIHJldHVybiAiTUlQU19ERUxUQURFQ0wiOwotICAgIGNhc2UgU0hUX01JUFNfU1lNQk9MX0xJQjogICAgcmV0dXJuICJNSVBTX1NZTUJPTF9MSUIiOwotICAgIGNhc2UgU0hUX01JUFNfRVZFTlRTOiAgICAgICAgcmV0dXJuICJNSVBTX0VWRU5UUyI7Ci0gICAgY2FzZSBTSFRfTUlQU19UUkFOU0xBVEU6ICAgICByZXR1cm4gIk1JUFNfVFJBTlNMQVRFIjsKLSAgICBjYXNlIFNIVF9NSVBTX1BJWElFOiAgICAgICAgIHJldHVybiAiTUlQU19QSVhJRSI7Ci0gICAgY2FzZSBTSFRfTUlQU19YTEFURTogICAgICAgICByZXR1cm4gIk1JUFNfWExBVEUiOwotICAgIGNhc2UgU0hUX01JUFNfWExBVEVfREVCVUc6ICAgcmV0dXJuICJNSVBTX1hMQVRFX0RFQlVHIjsKLSAgICBjYXNlIFNIVF9NSVBTX1dISVJMOiAgICAgICAgIHJldHVybiAiTUlQU19XSElSTCI7Ci0gICAgY2FzZSBTSFRfTUlQU19FSF9SRUdJT046ICAgICByZXR1cm4gIk1JUFNfRUhfUkVHSU9OIjsKLSAgICBjYXNlIFNIVF9NSVBTX1hMQVRFX09MRDogICAgIHJldHVybiAiTUlQU19YTEFURV9PTEQiOwotICAgIGNhc2UgU0hUX01JUFNfUERSX0VYQ0VQVElPTjogcmV0dXJuICJNSVBTX1BEUl9FWENFUFRJT04iOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfcGFyaXNjX3NlY3Rpb25fdHlwZV9uYW1lIChzaF90eXBlKQotICAgICB1bnNpZ25lZCBpbnQgc2hfdHlwZTsKLXsKLSAgc3dpdGNoIChzaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9QQVJJU0NfRVhUOglyZXR1cm4gIlBBUklTQ19FWFQiOwotICAgIGNhc2UgU0hUX1BBUklTQ19VTldJTkQ6CXJldHVybiAiUEFSSVNDX1VOV0lORCI7Ci0gICAgY2FzZSBTSFRfUEFSSVNDX0RPQzoJcmV0dXJuICJQQVJJU0NfRE9DIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3NlY3Rpb25fdHlwZV9uYW1lIChzaF90eXBlKQotICAgICB1bnNpZ25lZCBpbnQgc2hfdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAoc2hfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTSFRfTlVMTDoJCXJldHVybiAiTlVMTCI7Ci0gICAgY2FzZSBTSFRfUFJPR0JJVFM6CQlyZXR1cm4gIlBST0dCSVRTIjsKLSAgICBjYXNlIFNIVF9TWU1UQUI6CQlyZXR1cm4gIlNZTVRBQiI7Ci0gICAgY2FzZSBTSFRfU1RSVEFCOgkJcmV0dXJuICJTVFJUQUIiOwotICAgIGNhc2UgU0hUX1JFTEE6CQlyZXR1cm4gIlJFTEEiOwotICAgIGNhc2UgU0hUX0hBU0g6CQlyZXR1cm4gIkhBU0giOwotICAgIGNhc2UgU0hUX0RZTkFNSUM6CQlyZXR1cm4gIkRZTkFNSUMiOwotICAgIGNhc2UgU0hUX05PVEU6CQlyZXR1cm4gIk5PVEUiOwotICAgIGNhc2UgU0hUX05PQklUUzoJCXJldHVybiAiTk9CSVRTIjsKLSAgICBjYXNlIFNIVF9SRUw6CQlyZXR1cm4gIlJFTCI7Ci0gICAgY2FzZSBTSFRfU0hMSUI6CQlyZXR1cm4gIlNITElCIjsKLSAgICBjYXNlIFNIVF9EWU5TWU06CQlyZXR1cm4gIkRZTlNZTSI7Ci0gICAgY2FzZSBTSFRfR05VX3ZlcmRlZjoJcmV0dXJuICJWRVJERUYiOwotICAgIGNhc2UgU0hUX0dOVV92ZXJuZWVkOglyZXR1cm4gIlZFUk5FRUQiOwotICAgIGNhc2UgU0hUX0dOVV92ZXJzeW06CXJldHVybiAiVkVSU1lNIjsKLSAgICBjYXNlIDB4NmZmZmZmZjA6CSAgICAgICAgcmV0dXJuICJWRVJTWU0iOwotICAgIGNhc2UgMHg2ZmZmZmZmYzoJICAgICAgICByZXR1cm4gIlZFUkRFRiI7Ci0gICAgY2FzZSAweDdmZmZmZmZkOgkJcmV0dXJuICJBVVhJTElBUlkiOwotICAgIGNhc2UgMHg3ZmZmZmZmZjoJCXJldHVybiAiRklMVEVSIjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoKHNoX3R5cGUgPj0gU0hUX0xPUFJPQykgJiYgKHNoX3R5cGUgPD0gU0hUX0hJUFJPQykpCi0JewotCSAgY29uc3QgY2hhciAqIHJlc3VsdDsKLQotCSAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLQkgICAgewotCSAgICBjYXNlIEVNX01JUFM6Ci0JICAgIGNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JICAgICAgcmVzdWx0ID0gZ2V0X21pcHNfc2VjdGlvbl90eXBlX25hbWUgKHNoX3R5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEVNX1BBUklTQzoKLQkgICAgICByZXN1bHQgPSBnZXRfcGFyaXNjX3NlY3Rpb25fdHlwZV9uYW1lIChzaF90eXBlKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXN1bHQgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChyZXN1bHQgIT0gTlVMTCkKLQkgICAgcmV0dXJuIHJlc3VsdDsKLQotCSAgc3ByaW50ZiAoYnVmZiwgIlNIVF9MT1BST0MrJXgiLCBzaF90eXBlIC0gU0hUX0xPUFJPQyk7Ci0JfQotICAgICAgZWxzZSBpZiAoKHNoX3R5cGUgPj0gU0hUX0xPT1MpICYmIChzaF90eXBlIDw9IFNIVF9ISU9TKSkKLQlzcHJpbnRmIChidWZmLCAiU0hUX0xPT1MrJXgiLCBzaF90eXBlIC0gU0hUX0xPT1MpOwotICAgICAgZWxzZSBpZiAoKHNoX3R5cGUgPj0gU0hUX0xPVVNFUikgJiYgKHNoX3R5cGUgPD0gU0hUX0hJVVNFUikpCi0Jc3ByaW50ZiAoYnVmZiwgIlNIVF9MT1VTRVIrJXgiLCBzaF90eXBlIC0gU0hUX0xPVVNFUik7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAleCIpLCBzaF90eXBlKTsKLQotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdHJ1Y3Qgb3B0aW9uIG9wdGlvbnMgW10gPQotewotICB7ImFsbCIsICAgICAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ2EnfSwKLSAgeyJmaWxlLWhlYWRlciIsICAgICAgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gIHsicHJvZ3JhbS1oZWFkZXJzIiwgIG5vX2FyZ3VtZW50LCAwLCAnbCd9LAotICB7ImhlYWRlcnMiLCAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ2UnfSwKLSAgeyJoaXN0b2dyYW0iLCAgICAgICAgbm9fYXJndW1lbnQsIDAsICdJJ30sCi0gIHsic2VnbWVudHMiLCAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAnbCd9LAotICB7InNlY3Rpb25zIiwgICAgICAgICBub19hcmd1bWVudCwgMCwgJ1MnfSwKLSAgeyJzZWN0aW9uLWhlYWRlcnMiLCAgbm9fYXJndW1lbnQsIDAsICdTJ30sCi0gIHsic3ltYm9scyIsICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAncyd9LAotICB7InN5bXMiLCAgICAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ3MnfSwKLSAgeyJyZWxvY3MiLCAgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdyJ30sCi0gIHsibm90ZXMiLCAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAnbid9LAotICB7ImR5bmFtaWMiLCAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ2QnfSwKLSAgeyJhcmNoLXNwZWNpZmljIiwgICAgbm9fYXJndW1lbnQsIDAsICdBJ30sCi0gIHsidmVyc2lvbi1pbmZvIiwgICAgIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICB7InVzZS1keW5hbWljIiwgICAgICBub19hcmd1bWVudCwgMCwgJ0QnfSwKLSAgeyJoZXgtZHVtcCIsICAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd4J30sCi0gIHsiZGVidWctZHVtcCIsICAgICAgIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAndyd9LAotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLSAgeyJpbnN0cnVjdGlvbi1kdW1wIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdpJ30sCi0jZW5kaWYKLQotICB7InZlcnNpb24iLCAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgeyJoZWxwIiwgICAgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdIJ30sCi0gIHswLCAgICAgICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotc3RhdGljIHZvaWQKLXVzYWdlICgpCi17Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiVXNhZ2U6IHJlYWRlbGYge29wdGlvbnN9IGVsZi1maWxlKHMpXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICBPcHRpb25zIGFyZTpcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1hIG9yIC0tYWxsICAgICAgICAgICAgICAgRXF1aXZhbGVudCB0bzogLWggLWwgLVMgLXMgLXIgLWQgLVYgLUEgLUlcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1oIG9yIC0tZmlsZS1oZWFkZXIgICAgICAgRGlzcGxheSB0aGUgRUxGIGZpbGUgaGVhZGVyXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtbCBvciAtLXByb2dyYW0taGVhZGVycyBvciAtLXNlZ21lbnRzXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIHByb2dyYW0gaGVhZGVyc1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLVMgb3IgLS1zZWN0aW9uLWhlYWRlcnMgb3IgLS1zZWN0aW9uc1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBzZWN0aW9ucycgaGVhZGVyXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtZSBvciAtLWhlYWRlcnMgICAgICAgICAgIEVxdWl2YWxlbnQgdG86IC1oIC1sIC1TXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtcyBvciAtLXN5bXMgb3IgLS1zeW1ib2xzIERpc3BsYXkgdGhlIHN5bWJvbCB0YWJsZVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLW4gb3IgLS1ub3RlcyAgICAgICAgICAgICBEaXNwbGF5IHRoZSBjb3JlIG5vdGVzIChpZiBwcmVzZW50KVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLXIgb3IgLS1yZWxvY3MgICAgICAgICAgICBEaXNwbGF5IHRoZSByZWxvY2F0aW9ucyAoaWYgcHJlc2VudClcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1kIG9yIC0tZHluYW1pYyAgICAgICAgICAgRGlzcGxheSB0aGUgZHluYW1pYyBzZWdtZW50IChpZiBwcmVzZW50KVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLVYgb3IgLS12ZXJzaW9uLWluZm8gICAgICBEaXNwbGF5IHRoZSB2ZXJzaW9uIHNlY3Rpb25zIChpZiBwcmVzZW50KVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLUEgb3IgLS1hcmNoLXNwZWNpZmljICAgICBEaXNwbGF5IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiAoaWYgYW55KS5cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1EIG9yIC0tdXNlLWR5bmFtaWMgICAgICAgVXNlIHRoZSBkeW5hbWljIHNlY3Rpb24gaW5mbyB3aGVuIGRpc3BsYXlpbmcgc3ltYm9sc1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLXggPG51bWJlcj4gb3IgLS1oZXgtZHVtcD08bnVtYmVyPlxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdW1wIHRoZSBjb250ZW50cyBvZiBzZWN0aW9uIDxudW1iZXI+XG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtd1tsaWFwcl0gb3IgLS1kZWJ1Zy1kdW1wWz1saW5lLD1pbmZvLD1hYmJyZXYsPXB1Ym5hbWVzLD1yYW5nZXNdXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIERXQVJGMiBkZWJ1ZyBzZWN0aW9uc1xuIikpOwotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1pIDxudW1iZXI+IG9yIC0taW5zdHJ1Y3Rpb24tZHVtcD08bnVtYmVyPlxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhc3NlbWJsZSB0aGUgY29udGVudHMgb2Ygc2VjdGlvbiA8bnVtYmVyPlxuIikpOwotI2VuZGlmCi0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtSSBvciAtLWhpc3RvZ3JhbSAgICAgICAgIERpc3BsYXkgaGlzdG9ncmFtIG9mIGJ1Y2tldCBsaXN0IGxlbmd0aHNcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC12IG9yIC0tdmVyc2lvbiAgICAgICAgICAgRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgb2YgcmVhZGVsZlxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLUggb3IgLS1oZWxwICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaW5mb3JtYXRpb25cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLQotICBleGl0ICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlcXVlc3RfZHVtcCAoc2VjdGlvbiwgdHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHNlY3Rpb247Ci0gICAgIGNoYXIgICAgICAgICB0eXBlOwotewotICBpZiAoc2VjdGlvbiA+PSBudW1fZHVtcF9zZWN0cykKLSAgICB7Ci0gICAgICBjaGFyICogbmV3X2R1bXBfc2VjdHM7Ci0KLSAgICAgIG5ld19kdW1wX3NlY3RzID0gKGNoYXIgKikgY2FsbG9jIChzZWN0aW9uICsgMSwgMSk7Ci0KLSAgICAgIGlmIChuZXdfZHVtcF9zZWN0cyA9PSBOVUxMKQotCWVycm9yIChfKCJPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgZHVtcCByZXF1ZXN0IHRhYmxlLiIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDb3B5IGN1cnJlbnQgZmxhZyBzZXR0aW5ncy4gICovCi0JICBtZW1jcHkgKG5ld19kdW1wX3NlY3RzLCBkdW1wX3NlY3RzLCBudW1fZHVtcF9zZWN0cyk7Ci0KLQkgIGZyZWUgKGR1bXBfc2VjdHMpOwotCi0JICBkdW1wX3NlY3RzID0gbmV3X2R1bXBfc2VjdHM7Ci0JICBudW1fZHVtcF9zZWN0cyA9IHNlY3Rpb24gKyAxOwotCX0KLSAgICB9Ci0KLSAgaWYgKGR1bXBfc2VjdHMpCi0gICAgZHVtcF9zZWN0cyBbc2VjdGlvbl0gfD0gdHlwZTsKLQotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKiBhcmd2OwotewotICBpbnQgYzsKLQotICBpZiAoYXJnYyA8IDIpCi0gICAgdXNhZ2UgKCk7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcKLQkgIChhcmdjLCBhcmd2LCAiZXJzYWhubGRTREFJdzo6eDppOnZWIiwgb3B0aW9ucywgTlVMTCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBjaGFyICogICAgY3A7Ci0gICAgICBpbnQJc2VjdGlvbjsKLQotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlIDA6Ci0JICAvKiBMb25nIG9wdGlvbnMuICAqLwotCSAgYnJlYWs7Ci0JY2FzZSAnSCc6Ci0JICB1c2FnZSAoKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYSc6Ci0JICBkb19zeW1zICsrOwotCSAgZG9fcmVsb2MgKys7Ci0JICBkb19keW5hbWljICsrOwotCSAgZG9faGVhZGVyICsrOwotCSAgZG9fc2VjdGlvbnMgKys7Ci0JICBkb19zZWdtZW50cyArKzsKLQkgIGRvX3ZlcnNpb24gKys7Ci0JICBkb19oaXN0b2dyYW0gKys7Ci0JICBkb19hcmNoICsrOwotCSAgZG9fbm90ZXMgKys7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIGRvX2hlYWRlciArKzsKLQkgIGRvX3NlY3Rpb25zICsrOwotCSAgZG9fc2VnbWVudHMgKys7Ci0JICBicmVhazsKLQljYXNlICdBJzoKLQkgIGRvX2FyY2ggKys7Ci0JICBicmVhazsKLQljYXNlICdEJzoKLQkgIGRvX3VzaW5nX2R5bmFtaWMgKys7Ci0JICBicmVhazsKLQljYXNlICdyJzoKLQkgIGRvX3JlbG9jICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICBkb19oZWFkZXIgKys7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIGRvX3NlZ21lbnRzICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBkb19zeW1zICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0JICBkb19zZWN0aW9ucyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgZG9fZHluYW1pYyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ0knOgotCSAgZG9faGlzdG9ncmFtICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JICBkb19ub3RlcyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgZG9fZHVtcCArKzsKLQkgIHNlY3Rpb24gPSBzdHJ0b3VsIChvcHRhcmcsICYgY3AsIDApOwotCSAgaWYgKCEgKiBjcCAmJiBzZWN0aW9uID49IDApCi0JICAgIHsKLQkgICAgICByZXF1ZXN0X2R1bXAgKHNlY3Rpb24sIEhFWF9EVU1QKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgZ290byBvb3BzOwotCWNhc2UgJ3cnOgotCSAgZG9fZHVtcCArKzsKLQkgIGlmIChvcHRhcmcgPT0gMCkKLQkgICAgZG9fZGVidWdnaW5nID0gMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGRvX2RlYnVnZ2luZyA9IDA7Ci0JICAgICAgc3dpdGNoIChvcHRhcmdbMF0pCi0JCXsKLQkJY2FzZSAnaSc6Ci0JCWNhc2UgJ0knOgotCQkgIGRvX2RlYnVnX2luZm8gPSAxOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2EnOgotCQljYXNlICdBJzoKLQkJICBkb19kZWJ1Z19hYmJyZXZzID0gMTsKLQkJICBicmVhazsKLQotCQljYXNlICdsJzoKLQkJY2FzZSAnTCc6Ci0JCSAgZG9fZGVidWdfbGluZXMgPSAxOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3AnOgotCQljYXNlICdQJzoKLQkJICBkb19kZWJ1Z19wdWJuYW1lcyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAncic6Ci0JCWNhc2UgJ1InOgotCQkgIGRvX2RlYnVnX2FyYW5nZXMgPSAxOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgd2FybiAoXygiVW5yZWNvZ25pc2VkIGRlYnVnIG9wdGlvbiAnJXMnXG4iKSwgb3B0YXJnKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLSNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCi0JY2FzZSAnaSc6Ci0JICBkb19kdW1wICsrOwotCSAgc2VjdGlvbiA9IHN0cnRvdWwgKG9wdGFyZywgJiBjcCwgMCk7Ci0JICBpZiAoISAqIGNwICYmIHNlY3Rpb24gPj0gMCkKLQkgICAgewotCSAgICAgIHJlcXVlc3RfZHVtcCAoc2VjdGlvbiwgRElTQVNTX0RVTVApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBnb3RvIG9vcHM7Ci0jZW5kaWYKLQljYXNlICd2JzoKLQkgIHByaW50X3ZlcnNpb24gKHByb2dyYW1fbmFtZSk7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIGRvX3ZlcnNpb24gKys7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCW9vcHM6Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZXJyb3IgKF8oIkludmFsaWQgb3B0aW9uICctJWMnXG4iKSwgYyk7Ci0JICAvKiBEcm9wIHRocm91Z2guICAqLwotCWNhc2UgJz8nOgotCSAgdXNhZ2UgKCk7Ci0JfQotICAgIH0KLQotICBpZiAoIWRvX2R5bmFtaWMgJiYgIWRvX3N5bXMgJiYgIWRvX3JlbG9jICYmICFkb19zZWN0aW9ucwotICAgICAgJiYgIWRvX3NlZ21lbnRzICYmICFkb19oZWFkZXIgJiYgIWRvX2R1bXAgJiYgIWRvX3ZlcnNpb24KLSAgICAgICYmICFkb19oaXN0b2dyYW0gJiYgIWRvX2RlYnVnZ2luZyAmJiAhZG9fYXJjaCAmJiAhZG9fbm90ZXMpCi0gICAgdXNhZ2UgKCk7Ci0gIGVsc2UgaWYgKGFyZ2MgPCAzKQotICAgIHsKLSAgICAgIHdhcm4gKF8oIk5vdGhpbmcgdG8gZG8uXG4iKSk7Ci0gICAgICB1c2FnZSgpOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X2VsZl9jbGFzcyAoZWxmX2NsYXNzKQotICAgICB1bnNpZ25lZCBjaGFyIGVsZl9jbGFzczsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAoZWxmX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIEVMRkNMQVNTTk9ORTogcmV0dXJuIF8oIm5vbmUiKTsKLSAgICBjYXNlIEVMRkNMQVNTMzI6ICAgcmV0dXJuIF8oIkVMRjMyIik7Ci0gICAgY2FzZSBFTEZDTEFTUzY0OiAgIHJldHVybiBfKCJFTEY2NCIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bjogJXg+IiksIGVsZl9jbGFzcyk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9kYXRhX2VuY29kaW5nIChlbmNvZGluZykKLSAgICAgdW5zaWduZWQgY2hhciBlbmNvZGluZzsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAoZW5jb2RpbmcpCi0gICAgewotICAgIGNhc2UgRUxGREFUQU5PTkU6IHJldHVybiBfKCJub25lIik7Ci0gICAgY2FzZSBFTEZEQVRBMkxTQjogcmV0dXJuIF8oIjIncyBjb21wbGVtZW50LCBsaXR0bGUgZW5kaWFuIik7Ci0gICAgY2FzZSBFTEZEQVRBMk1TQjogcmV0dXJuIF8oIjIncyBjb21wbGVtZW50LCBiaWcgZW5kaWFuIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duOiAleD4iKSwgZW5jb2RpbmcpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfb3NhYmlfbmFtZSAob3NhYmkpCi0gICAgIHVuc2lnbmVkIGNoYXIgb3NhYmk7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKG9zYWJpKQotICAgIHsKLSAgICBjYXNlIEVMRk9TQUJJX1NZU1Y6ICAgICAgIHJldHVybiBfKCJVTklYIC0gU3lzdGVtIFYiKTsKLSAgICBjYXNlIEVMRk9TQUJJX0hQVVg6ICAgICAgIHJldHVybiBfKCJVTklYIC0gSFAtVVgiKTsKLSAgICBjYXNlIEVMRk9TQUJJX1NUQU5EQUxPTkU6IHJldHVybiBfKCJTdGFuZGFsb25lIEFwcCIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bjogJXg+IiksIG9zYWJpKTsKLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotLyogRGVjb2RlIHRoZSBkYXRhIGhlbGQgaW4gJ2VsZl9oZWFkZXInLiAgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3NfZmlsZV9oZWFkZXIgKCkKLXsKLSAgaWYgKCAgIGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfTUFHMF0gIT0gRUxGTUFHMAotICAgICAgfHwgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9NQUcxXSAhPSBFTEZNQUcxCi0gICAgICB8fCBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX01BRzJdICE9IEVMRk1BRzIKLSAgICAgIHx8IGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfTUFHM10gIT0gRUxGTUFHMykKLSAgICB7Ci0gICAgICBlcnJvcgotCShfKCJOb3QgYW4gRUxGIGZpbGUgLSBpdCBoYXMgdGhlIHdyb25nIG1hZ2ljIGJ5dGVzIGF0IHRoZSBzdGFydFxuIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChkb19oZWFkZXIpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIHByaW50ZiAoXygiRUxGIEhlYWRlcjpcbiIpKTsKLSAgICAgIHByaW50ZiAoXygiICBNYWdpYzogICAiKSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgRUlfTklERU5UOyBpICsrKQotCXByaW50ZiAoIiUyLjJ4ICIsIGVsZl9oZWFkZXIuZV9pZGVudCBbaV0pOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoXygiICBDbGFzczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iKSwKLQkgICAgICBnZXRfZWxmX2NsYXNzIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX0NMQVNTXSkpOwotICAgICAgcHJpbnRmIChfKCIgIERhdGE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgICAgIGdldF9kYXRhX2VuY29kaW5nIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX0RBVEFdKSk7Ci0gICAgICBwcmludGYgKF8oIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAlZCAlc1xuIiksCi0JICAgICAgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9WRVJTSU9OXSwKLQkgICAgICAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9WRVJTSU9OXSA9PSBFVl9DVVJSRU5UCi0JICAgICAgID8gIihjdXJyZW50KSIKLQkgICAgICAgOiAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9WRVJTSU9OXSAhPSBFVl9OT05FCi0JCSAgPyAiPHVua25vd246ICVseD4iCi0JCSAgOiAiIikpKTsKLSAgICAgIHByaW50ZiAoXygiICBPUy9BQkk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iKSwKLQkgICAgICBnZXRfb3NhYmlfbmFtZSAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9PU0FCSV0pKTsKLSAgICAgIHByaW50ZiAoXygiICBBQkkgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICVkXG4iKSwKLQkgICAgICBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX0FCSVZFUlNJT05dKTsKLSAgICAgIHByaW50ZiAoXygiICBUeXBlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iKSwKLQkgICAgICBnZXRfZmlsZV90eXBlIChlbGZfaGVhZGVyLmVfdHlwZSkpOwotICAgICAgcHJpbnRmIChfKCIgIE1hY2hpbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgICAgIGdldF9tYWNoaW5lX25hbWUgKGVsZl9oZWFkZXIuZV9tYWNoaW5lKSk7Ci0gICAgICBwcmludGYgKF8oIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAweCVseFxuIiksCi0JICAgICAgKHVuc2lnbmVkIGxvbmcpIGVsZl9oZWFkZXIuZV92ZXJzaW9uKTsKLSAgICAgIAotICAgICAgcHJpbnRmIChfKCIgIEVudHJ5IHBvaW50IGFkZHJlc3M6ICAgICAgICAgICAgICAgIikpOwotICAgICAgcHJpbnRfdm1hICgoYmZkX3ZtYSkgZWxmX2hlYWRlci5lX2VudHJ5LCBQUkVGSVhfSEVYKTsKLSAgICAgIHByaW50ZiAoXygiXG4gIFN0YXJ0IG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgIikpOwotICAgICAgcHJpbnRfdm1hICgoYmZkX3ZtYSkgZWxmX2hlYWRlci5lX3Bob2ZmLCBERUMpOwotICAgICAgcHJpbnRmIChfKCIgKGJ5dGVzIGludG8gZmlsZSlcbiAgU3RhcnQgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICAiKSk7Ci0gICAgICBwcmludF92bWEgKChiZmRfdm1hKSBlbGZfaGVhZGVyLmVfc2hvZmYsIERFQyk7Ci0gICAgICBwcmludGYgKF8oIiAoYnl0ZXMgaW50byBmaWxlKVxuIikpOwotCQotICAgICAgcHJpbnRmIChfKCIgIEZsYWdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHglbHglc1xuIiksCi0JICAgICAgKHVuc2lnbmVkIGxvbmcpIGVsZl9oZWFkZXIuZV9mbGFncywKLQkgICAgICBnZXRfbWFjaGluZV9mbGFncyAoZWxmX2hlYWRlci5lX2ZsYWdzLCBlbGZfaGVhZGVyLmVfbWFjaGluZSkpOwotICAgICAgcHJpbnRmIChfKCIgIFNpemUgb2YgdGhpcyBoZWFkZXI6ICAgICAgICAgICAgICAgJWxkIChieXRlcylcbiIpLAotCSAgICAgIChsb25nKSBlbGZfaGVhZGVyLmVfZWhzaXplKTsKLSAgICAgIHByaW50ZiAoXygiICBTaXplIG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgICVsZCAoYnl0ZXMpXG4iKSwKLQkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3BoZW50c2l6ZSk7Ci0gICAgICBwcmludGYgKF8oIiAgTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAlbGRcbiIpLAotCSAgICAgIChsb25nKSBlbGZfaGVhZGVyLmVfcGhudW0pOwotICAgICAgcHJpbnRmIChfKCIgIFNpemUgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICAgJWxkIChieXRlcylcbiIpLAotCSAgICAgIChsb25nKSBlbGZfaGVhZGVyLmVfc2hlbnRzaXplKTsKLSAgICAgIHByaW50ZiAoXygiICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICVsZFxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9zaG51bSk7Ci0gICAgICBwcmludGYgKF8oIiAgU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OiAlbGRcbiIpLAotCSAgICAgIChsb25nKSBlbGZfaGVhZGVyLmVfc2hzdHJuZHgpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50Ci1nZXRfMzJiaXRfcHJvZ3JhbV9oZWFkZXJzIChmaWxlLCBwcm9ncmFtX2hlYWRlcnMpCi0gICAgIEZJTEUgKiBmaWxlOwotICAgICBFbGZfSW50ZXJuYWxfUGhkciAqIHByb2dyYW1faGVhZGVyczsKLXsKLSAgRWxmMzJfRXh0ZXJuYWxfUGhkciAqIHBoZHJzOwotICBFbGYzMl9FeHRlcm5hbF9QaGRyICogZXh0ZXJuYWw7Ci0gIEVsZjMyX0ludGVybmFsX1BoZHIgKiBpbnRlcm5hbDsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgIGk7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKGVsZl9oZWFkZXIuZV9waG9mZiwKLQkJICBlbGZfaGVhZGVyLmVfcGhlbnRzaXplICogZWxmX2hlYWRlci5lX3BobnVtLAotCQkgIHBoZHJzLCBFbGYzMl9FeHRlcm5hbF9QaGRyICosICJwcm9ncmFtIGhlYWRlcnMiKTsKLQotICBmb3IgKGkgPSAwLCBpbnRlcm5hbCA9IHByb2dyYW1faGVhZGVycywgZXh0ZXJuYWwgPSBwaGRyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3BobnVtOwotICAgICAgIGkgKyssIGludGVybmFsICsrLCBleHRlcm5hbCArKykKLSAgICB7Ci0gICAgICBpbnRlcm5hbC0+cF90eXBlICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfdHlwZSk7Ci0gICAgICBpbnRlcm5hbC0+cF9vZmZzZXQgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfb2Zmc2V0KTsKLSAgICAgIGludGVybmFsLT5wX3ZhZGRyICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF92YWRkcik7Ci0gICAgICBpbnRlcm5hbC0+cF9wYWRkciAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfcGFkZHIpOwotICAgICAgaW50ZXJuYWwtPnBfZmlsZXN6ID0gQllURV9HRVQgKGV4dGVybmFsLT5wX2ZpbGVzeik7Ci0gICAgICBpbnRlcm5hbC0+cF9tZW1zeiAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfbWVtc3opOwotICAgICAgaW50ZXJuYWwtPnBfZmxhZ3MgID0gQllURV9HRVQgKGV4dGVybmFsLT5wX2ZsYWdzKTsKLSAgICAgIGludGVybmFsLT5wX2FsaWduICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF9hbGlnbik7Ci0gICAgfQotCi0gIGZyZWUgKHBoZHJzKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZ2V0XzY0Yml0X3Byb2dyYW1faGVhZGVycyAoZmlsZSwgcHJvZ3JhbV9oZWFkZXJzKQotICAgICBGSUxFICogZmlsZTsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIgKiBwcm9ncmFtX2hlYWRlcnM7Ci17Ci0gIEVsZjY0X0V4dGVybmFsX1BoZHIgKiBwaGRyczsKLSAgRWxmNjRfRXh0ZXJuYWxfUGhkciAqIGV4dGVybmFsOwotICBFbGY2NF9JbnRlcm5hbF9QaGRyICogaW50ZXJuYWw7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICBpOwotCi0gIEdFVF9EQVRBX0FMTE9DIChlbGZfaGVhZGVyLmVfcGhvZmYsCi0JCSAgZWxmX2hlYWRlci5lX3BoZW50c2l6ZSAqIGVsZl9oZWFkZXIuZV9waG51bSwKLQkJICBwaGRycywgRWxmNjRfRXh0ZXJuYWxfUGhkciAqLCAicHJvZ3JhbSBoZWFkZXJzIik7Ci0KLSAgZm9yIChpID0gMCwgaW50ZXJuYWwgPSBwcm9ncmFtX2hlYWRlcnMsIGV4dGVybmFsID0gcGhkcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9waG51bTsKLSAgICAgICBpICsrLCBpbnRlcm5hbCArKywgZXh0ZXJuYWwgKyspCi0gICAgewotICAgICAgaW50ZXJuYWwtPnBfdHlwZSAgID0gQllURV9HRVQgKGV4dGVybmFsLT5wX3R5cGUpOwotICAgICAgaW50ZXJuYWwtPnBfZmxhZ3MgID0gQllURV9HRVQgKGV4dGVybmFsLT5wX2ZsYWdzKTsKLSAgICAgIGludGVybmFsLT5wX29mZnNldCA9IEJZVEVfR0VUOCAoZXh0ZXJuYWwtPnBfb2Zmc2V0KTsKLSAgICAgIGludGVybmFsLT5wX3ZhZGRyICA9IEJZVEVfR0VUOCAoZXh0ZXJuYWwtPnBfdmFkZHIpOwotICAgICAgaW50ZXJuYWwtPnBfcGFkZHIgID0gQllURV9HRVQ4IChleHRlcm5hbC0+cF9wYWRkcik7Ci0gICAgICBpbnRlcm5hbC0+cF9maWxlc3ogPSBCWVRFX0dFVDggKGV4dGVybmFsLT5wX2ZpbGVzeik7Ci0gICAgICBpbnRlcm5hbC0+cF9tZW1zeiAgPSBCWVRFX0dFVDggKGV4dGVybmFsLT5wX21lbXN6KTsKLSAgICAgIGludGVybmFsLT5wX2FsaWduICA9IEJZVEVfR0VUOCAoZXh0ZXJuYWwtPnBfYWxpZ24pOwotICAgIH0KLQotICBmcmVlIChwaGRycyk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfcHJvZ3JhbV9oZWFkZXJzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmX0ludGVybmFsX1BoZHIgKiBwcm9ncmFtX2hlYWRlcnM7Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICogc2VnbWVudDsKLSAgdW5zaWduZWQgaW50CSAgICAgIGk7Ci0KLSAgaWYgKGVsZl9oZWFkZXIuZV9waG51bSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChkb19zZWdtZW50cykKLQlwcmludGYgKF8oIlxuVGhlcmUgYXJlIG5vIHByb2dyYW0gaGVhZGVycyBpbiB0aGlzIGZpbGUuXG4iKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGRvX3NlZ21lbnRzICYmICFkb19oZWFkZXIpCi0gICAgewotICAgICAgcHJpbnRmIChfKCJcbkVsZiBmaWxlIHR5cGUgaXMgJXNcbiIpLCBnZXRfZmlsZV90eXBlIChlbGZfaGVhZGVyLmVfdHlwZSkpOwotICAgICAgcHJpbnRmIChfKCJFbnRyeSBwb2ludCAiKSk7Ci0gICAgICBwcmludF92bWEgKChiZmRfdm1hKSBlbGZfaGVhZGVyLmVfZW50cnksIFBSRUZJWF9IRVgpOwotICAgICAgcHJpbnRmIChfKCJcblRoZXJlIGFyZSAlZCBwcm9ncmFtIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAiKSwKLQkgICAgICBlbGZfaGVhZGVyLmVfcGhudW0pOwotICAgICAgcHJpbnRfdm1hICgoYmZkX3ZtYSkgZWxmX2hlYWRlci5lX3Bob2ZmLCBERUMpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0KLSAgcHJvZ3JhbV9oZWFkZXJzID0gKEVsZl9JbnRlcm5hbF9QaGRyICopIG1hbGxvYwotICAgIChlbGZfaGVhZGVyLmVfcGhudW0gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSk7Ci0KLSAgaWYgKHByb2dyYW1faGVhZGVycyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICBpID0gZ2V0XzMyYml0X3Byb2dyYW1faGVhZGVycyAoZmlsZSwgcHJvZ3JhbV9oZWFkZXJzKTsKLSAgZWxzZQotICAgIGkgPSBnZXRfNjRiaXRfcHJvZ3JhbV9oZWFkZXJzIChmaWxlLCBwcm9ncmFtX2hlYWRlcnMpOwotCi0gIGlmIChpID09IDApCi0gICAgewotICAgICAgZnJlZSAocHJvZ3JhbV9oZWFkZXJzKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoZG9fc2VnbWVudHMpCi0gICAgewotICAgICAgcHJpbnRmCi0JKF8oIlxuUHJvZ3JhbSBIZWFkZXIlczpcbiIpLCBlbGZfaGVhZGVyLmVfcGhudW0gPiAxID8gInMiIDogIiIpOwotICAgICAgCi0gICAgICBpZiAoaXNfMzJiaXRfZWxmKQotCXByaW50ZgotCSAgKF8oIiAgVHlwZSAgICAgICAgICAgT2Zmc2V0ICAgVmlydEFkZHIgICBQaHlzQWRkciAgIEZpbGVTaXogTWVtU2l6ICBGbGcgQWxpZ25cbiIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYKLQkgICAgKF8oIiAgVHlwZSAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgIFZpcnRBZGRyICAgICAgICAgICBQaHlzQWRkclxuIikpOwotCSAgcHJpbnRmCi0JICAgIChfKCIgICAgICAgICAgICAgICAgIEZpbGVTaXogICAgICAgICAgICBNZW1TaXogICAgICAgICAgICAgIEZsYWdzICBBbGlnblxuIikpOwotCX0KLSAgICB9Ci0KLSAgbG9hZGFkZHIgPSAtMTsKLSAgZHluYW1pY19hZGRyID0gMDsKLSAgZHluYW1pY19zaXplID0gMDsKLQotICBmb3IgKGkgPSAwLCBzZWdtZW50ID0gcHJvZ3JhbV9oZWFkZXJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfcGhudW07Ci0gICAgICAgaSArKywgc2VnbWVudCArKykKLSAgICB7Ci0gICAgICBpZiAoZG9fc2VnbWVudHMpCi0JewotCSAgcHJpbnRmICgiICAlLTE0LjE0cyAiLCBnZXRfc2VnbWVudF90eXBlIChzZWdtZW50LT5wX3R5cGUpKTsKLQotCSAgaWYgKGlzXzMyYml0X2VsZikKLQkgICAgewotCSAgICAgIHByaW50ZiAoIjB4JTYuNmx4ICIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX29mZnNldCk7Ci0JICAgICAgcHJpbnRmICgiMHglOC44bHggIiwgKHVuc2lnbmVkIGxvbmcpIHNlZ21lbnQtPnBfdmFkZHIpOwotCSAgICAgIHByaW50ZiAoIjB4JTguOGx4ICIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX3BhZGRyKTsKLQkgICAgICBwcmludGYgKCIweCU1LjVseCAiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF9maWxlc3opOwotCSAgICAgIHByaW50ZiAoIjB4JTUuNWx4ICIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX21lbXN6KTsKLQkgICAgICBwcmludGYgKCIlYyVjJWMgIiwKLQkJICAgICAgKHNlZ21lbnQtPnBfZmxhZ3MgJiBQRl9SID8gJ1InIDogJyAnKSwKLQkJICAgICAgKHNlZ21lbnQtPnBfZmxhZ3MgJiBQRl9XID8gJ1cnIDogJyAnKSwKLQkJICAgICAgKHNlZ21lbnQtPnBfZmxhZ3MgJiBQRl9YID8gJ0UnIDogJyAnKSk7Ci0JICAgICAgcHJpbnRmICgiJSNseCIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX2FsaWduKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHJpbnRfdm1hIChzZWdtZW50LT5wX29mZnNldCwgRlVMTF9IRVgpOwotCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JICAgICAgcHJpbnRfdm1hIChzZWdtZW50LT5wX3ZhZGRyLCBGVUxMX0hFWCk7Ci0JICAgICAgcHV0Y2hhciAoJyAnKTsKLQkgICAgICBwcmludF92bWEgKHNlZ21lbnQtPnBfcGFkZHIsIEZVTExfSEVYKTsKLQkgICAgICBwcmludGYgKCJcbiAgICAgICAgICAgICAgICAgIik7Ci0JICAgICAgcHJpbnRfdm1hIChzZWdtZW50LT5wX2ZpbGVzeiwgRlVMTF9IRVgpOwotCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JICAgICAgcHJpbnRfdm1hIChzZWdtZW50LT5wX21lbXN6LCBGVUxMX0hFWCk7Ci0JICAgICAgcHJpbnRmICgiICAlYyVjJWMgICAgIiwKLQkJICAgICAgKHNlZ21lbnQtPnBfZmxhZ3MgJiBQRl9SID8gJ1InIDogJyAnKSwKLQkJICAgICAgKHNlZ21lbnQtPnBfZmxhZ3MgJiBQRl9XID8gJ1cnIDogJyAnKSwKLQkJICAgICAgKHNlZ21lbnQtPnBfZmxhZ3MgJiBQRl9YID8gJ0UnIDogJyAnKSk7Ci0JICAgICAgcHJpbnRfdm1hIChzZWdtZW50LT5wX2FsaWduLCBIRVgpOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKHNlZ21lbnQtPnBfdHlwZSkKLQl7Ci0JY2FzZSBQVF9MT0FEOgotCSAgaWYgKGxvYWRhZGRyID09IC0xKQotCSAgICBsb2FkYWRkciA9IChzZWdtZW50LT5wX3ZhZGRyICYgMHhmZmZmZjAwMCkKLQkgICAgICAtIChzZWdtZW50LT5wX29mZnNldCAmIDB4ZmZmZmYwMDApOwotCSAgYnJlYWs7Ci0KLQljYXNlIFBUX0RZTkFNSUM6Ci0JICBpZiAoZHluYW1pY19hZGRyKQotCSAgICBlcnJvciAoXygibW9yZSB0aGFuIG9uZSBkeW5hbWljIHNlZ21lbnRcbiIpKTsKLQotCSAgZHluYW1pY19hZGRyID0gc2VnbWVudC0+cF9vZmZzZXQ7Ci0JICBkeW5hbWljX3NpemUgPSBzZWdtZW50LT5wX2ZpbGVzejsKLQkgIGJyZWFrOwotCi0JY2FzZSBQVF9JTlRFUlA6Ci0JICBpZiAoZnNlZWsgKGZpbGUsIChsb25nKSBzZWdtZW50LT5wX29mZnNldCwgU0VFS19TRVQpKQotCSAgICBlcnJvciAoXygiVW5hYmxlIHRvIGZpbmQgcHJvZ3JhbSBpbnRlcnByZXRlciBuYW1lXG4iKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwcm9ncmFtX2ludGVycHJldGVyWzBdID0gMDsKLQkgICAgICBmc2NhbmYgKGZpbGUsICIlNjNzIiwgcHJvZ3JhbV9pbnRlcnByZXRlcik7Ci0KLQkgICAgICBpZiAoZG9fc2VnbWVudHMpCi0JCXByaW50ZiAoXygiXG4gICAgICBbUmVxdWVzdGluZyBwcm9ncmFtIGludGVycHJldGVyOiAlc10iKSwKLQkJICAgIHByb2dyYW1faW50ZXJwcmV0ZXIpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChkb19zZWdtZW50cykKLQlwdXRjICgnXG4nLCBzdGRvdXQpOwotICAgIH0KLQotICBpZiAobG9hZGFkZHIgPT0gLTEpCi0gICAgewotICAgICAgLyogVmVyeSBzdHJhbmdlLiAqLwotICAgICAgbG9hZGFkZHIgPSAwOwotICAgIH0KLQotICBpZiAoZG9fc2VnbWVudHMgJiYgc2VjdGlvbl9oZWFkZXJzICE9IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmIChfKCJcbiBTZWN0aW9uIHRvIFNlZ21lbnQgbWFwcGluZzpcbiIpKTsKLSAgICAgIHByaW50ZiAoXygiICBTZWdtZW50IFNlY3Rpb25zLi4uXG4iKSk7Ci0KLSAgICAgIGFzc2VydCAoc3RyaW5nX3RhYmxlICE9IE5VTEwpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgZWxmX2hlYWRlci5lX3BobnVtOyBpKyspCi0JewotCSAgaW50ICAgICAgICAgICAgICAgICBqOwotCSAgRWxmX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotCi0JICBzZWdtZW50ID0gcHJvZ3JhbV9oZWFkZXJzICsgaTsKLQkgIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0KLQkgIHByaW50ZiAoIiAgICUyLjJkICAgICAiLCBpKTsKLQotCSAgZm9yIChqID0gMDsgaiA8IGVsZl9oZWFkZXIuZV9zaG51bTsgaisrLCBzZWN0aW9uICsrKQotCSAgICB7Ci0JICAgICAgaWYgKHNlY3Rpb24tPnNoX3NpemUgPiAwCi0JCSAgLyogQ29tcGFyZSBhbGxvY2F0ZWQgc2VjdGlvbnMgYnkgVk1BLCB1bmFsbG9jYXRlZAotCQkgICAgIHNlY3Rpb25zIGJ5IGZpbGUgb2Zmc2V0LiAgKi8KLQkJICAmJiAoc2VjdGlvbi0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MKLQkJICAgICAgPyAoc2VjdGlvbi0+c2hfYWRkciA+PSBzZWdtZW50LT5wX3ZhZGRyCi0JCQkgJiYgc2VjdGlvbi0+c2hfYWRkciArIHNlY3Rpb24tPnNoX3NpemUKLQkJCSA8PSBzZWdtZW50LT5wX3ZhZGRyICsgc2VnbWVudC0+cF9tZW1zeikKLQkJICAgICAgOiAoKGJmZF92bWEpIHNlY3Rpb24tPnNoX29mZnNldCA+PSBzZWdtZW50LT5wX29mZnNldAotCQkJICYmIChzZWN0aW9uLT5zaF9vZmZzZXQgKyBzZWN0aW9uLT5zaF9zaXplCi0JCQkgICAgIDw9IHNlZ21lbnQtPnBfb2Zmc2V0ICsgc2VnbWVudC0+cF9maWxlc3opKSkpCi0JCXByaW50ZiAoIiVzICIsIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCSAgICB9Ci0KLQkgIHB1dGMgKCdcbicsc3Rkb3V0KTsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKHByb2dyYW1faGVhZGVycyk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGludAotZ2V0XzMyYml0X3NlY3Rpb25faGVhZGVycyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjMyX0V4dGVybmFsX1NoZHIgKiBzaGRyczsKLSAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIGludGVybmFsOwotICB1bnNpZ25lZCBpbnQgICAgICAgICAgaTsKLQotICBHRVRfREFUQV9BTExPQyAoZWxmX2hlYWRlci5lX3Nob2ZmLAotCQkgIGVsZl9oZWFkZXIuZV9zaGVudHNpemUgKiBlbGZfaGVhZGVyLmVfc2hudW0sCi0JCSAgc2hkcnMsIEVsZjMyX0V4dGVybmFsX1NoZHIgKiwgInNlY3Rpb24gaGVhZGVycyIpOwotCi0gIHNlY3Rpb25faGVhZGVycyA9IChFbGZfSW50ZXJuYWxfU2hkciAqKSBtYWxsb2MKLSAgICAoZWxmX2hlYWRlci5lX3NobnVtICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU2hkcikpOwotCi0gIGlmIChzZWN0aW9uX2hlYWRlcnMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIGludGVybmFsID0gc2VjdGlvbl9oZWFkZXJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07Ci0gICAgICAgaSArKywgaW50ZXJuYWwgKyspCi0gICAgewotICAgICAgaW50ZXJuYWwtPnNoX25hbWUgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9uYW1lKTsKLSAgICAgIGludGVybmFsLT5zaF90eXBlICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfdHlwZSk7Ci0gICAgICBpbnRlcm5hbC0+c2hfZmxhZ3MgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2ZsYWdzKTsKLSAgICAgIGludGVybmFsLT5zaF9hZGRyICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfYWRkcik7Ci0gICAgICBpbnRlcm5hbC0+c2hfb2Zmc2V0ICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX29mZnNldCk7Ci0gICAgICBpbnRlcm5hbC0+c2hfc2l6ZSAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX3NpemUpOwotICAgICAgaW50ZXJuYWwtPnNoX2xpbmsgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9saW5rKTsKLSAgICAgIGludGVybmFsLT5zaF9pbmZvICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfaW5mbyk7Ci0gICAgICBpbnRlcm5hbC0+c2hfYWRkcmFsaWduID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2FkZHJhbGlnbik7Ci0gICAgICBpbnRlcm5hbC0+c2hfZW50c2l6ZSAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2VudHNpemUpOwotICAgIH0KLQotICBmcmVlIChzaGRycyk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF82NGJpdF9zZWN0aW9uX2hlYWRlcnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGY2NF9FeHRlcm5hbF9TaGRyICogc2hkcnM7Ci0gIEVsZjY0X0ludGVybmFsX1NoZHIgKiBpbnRlcm5hbDsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgIGk7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKGVsZl9oZWFkZXIuZV9zaG9mZiwKLQkJICBlbGZfaGVhZGVyLmVfc2hlbnRzaXplICogZWxmX2hlYWRlci5lX3NobnVtLAotCQkgIHNoZHJzLCBFbGY2NF9FeHRlcm5hbF9TaGRyICosICJzZWN0aW9uIGhlYWRlcnMiKTsKLQotICBzZWN0aW9uX2hlYWRlcnMgPSAoRWxmX0ludGVybmFsX1NoZHIgKikgbWFsbG9jCi0gICAgKGVsZl9oZWFkZXIuZV9zaG51bSAqIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIpKTsKLQotICBpZiAoc2VjdGlvbl9oZWFkZXJzID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBpbnRlcm5hbCA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkgKyssIGludGVybmFsICsrKQotICAgIHsKLSAgICAgIGludGVybmFsLT5zaF9uYW1lICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfbmFtZSk7Ci0gICAgICBpbnRlcm5hbC0+c2hfdHlwZSAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX3R5cGUpOwotICAgICAgaW50ZXJuYWwtPnNoX2ZsYWdzICAgICA9IEJZVEVfR0VUOCAoc2hkcnNbaV0uc2hfZmxhZ3MpOwotICAgICAgaW50ZXJuYWwtPnNoX2FkZHIgICAgICA9IEJZVEVfR0VUOCAoc2hkcnNbaV0uc2hfYWRkcik7Ci0gICAgICBpbnRlcm5hbC0+c2hfc2l6ZSAgICAgID0gQllURV9HRVQ4IChzaGRyc1tpXS5zaF9zaXplKTsKLSAgICAgIGludGVybmFsLT5zaF9lbnRzaXplICAgPSBCWVRFX0dFVDggKHNoZHJzW2ldLnNoX2VudHNpemUpOwotICAgICAgaW50ZXJuYWwtPnNoX2xpbmsgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9saW5rKTsKLSAgICAgIGludGVybmFsLT5zaF9pbmZvICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfaW5mbyk7Ci0gICAgICBpbnRlcm5hbC0+c2hfb2Zmc2V0ICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX29mZnNldCk7Ci0gICAgICBpbnRlcm5hbC0+c2hfYWRkcmFsaWduID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2FkZHJhbGlnbik7Ci0gICAgfQotCi0gIGZyZWUgKHNoZHJzKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIEVsZl9JbnRlcm5hbF9TeW0gKgotZ2V0XzMyYml0X2VsZl9zeW1ib2xzIChmaWxlLCBvZmZzZXQsIG51bWJlcikKLSAgICAgRklMRSAqIGZpbGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICB1bnNpZ25lZCBsb25nIG51bWJlcjsKLXsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICogZXN5bXM7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKiAgIGlzeW1zOwotICBFbGZfSW50ZXJuYWxfU3ltICogICBwc3ltOwotICB1bnNpZ25lZCBpbnQgICAgICAgICBqOwotCi0gIEdFVF9EQVRBX0FMTE9DIChvZmZzZXQsIG51bWJlciAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKLQkJICBlc3ltcywgRWxmMzJfRXh0ZXJuYWxfU3ltICosICJzeW1ib2xzIik7Ci0KLSAgaXN5bXMgPSAoRWxmX0ludGVybmFsX1N5bSAqKSBtYWxsb2MgKG51bWJlciAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpOwotCi0gIGlmIChpc3ltcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICBmcmVlIChlc3ltcyk7Ci0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBmb3IgKGogPSAwLCBwc3ltID0gaXN5bXM7Ci0gICAgICAgaiA8IG51bWJlcjsKLSAgICAgICBqICsrLCBwc3ltICsrKQotICAgIHsKLSAgICAgIHBzeW0tPnN0X25hbWUgID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X25hbWUpOwotICAgICAgcHN5bS0+c3RfdmFsdWUgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3RfdmFsdWUpOwotICAgICAgcHN5bS0+c3Rfc2l6ZSAgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3Rfc2l6ZSk7Ci0gICAgICBwc3ltLT5zdF9zaG5keCA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9zaG5keCk7Ci0gICAgICBwc3ltLT5zdF9pbmZvICA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9pbmZvKTsKLSAgICAgIHBzeW0tPnN0X290aGVyID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X290aGVyKTsKLSAgICB9Ci0KLSAgZnJlZSAoZXN5bXMpOwotCi0gIHJldHVybiBpc3ltczsKLX0KLQotc3RhdGljIEVsZl9JbnRlcm5hbF9TeW0gKgotZ2V0XzY0Yml0X2VsZl9zeW1ib2xzIChmaWxlLCBvZmZzZXQsIG51bWJlcikKLSAgICAgRklMRSAqIGZpbGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICB1bnNpZ25lZCBsb25nIG51bWJlcjsKLXsKLSAgRWxmNjRfRXh0ZXJuYWxfU3ltICogZXN5bXM7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKiAgIGlzeW1zOwotICBFbGZfSW50ZXJuYWxfU3ltICogICBwc3ltOwotICB1bnNpZ25lZCBpbnQgICAgICAgICBqOwotCi0gIEdFVF9EQVRBX0FMTE9DIChvZmZzZXQsIG51bWJlciAqIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfU3ltKSwKLQkJICBlc3ltcywgRWxmNjRfRXh0ZXJuYWxfU3ltICosICJzeW1ib2xzIik7Ci0KLSAgaXN5bXMgPSAoRWxmX0ludGVybmFsX1N5bSAqKSBtYWxsb2MgKG51bWJlciAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpOwotCi0gIGlmIChpc3ltcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICBmcmVlIChlc3ltcyk7Ci0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBmb3IgKGogPSAwLCBwc3ltID0gaXN5bXM7Ci0gICAgICAgaiA8IG51bWJlcjsKLSAgICAgICBqICsrLCBwc3ltICsrKQotICAgIHsKLSAgICAgIHBzeW0tPnN0X25hbWUgID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X25hbWUpOwotICAgICAgcHN5bS0+c3RfaW5mbyAgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3RfaW5mbyk7Ci0gICAgICBwc3ltLT5zdF9vdGhlciA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9vdGhlcik7Ci0gICAgICBwc3ltLT5zdF9zaG5keCA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9zaG5keCk7Ci0gICAgICBwc3ltLT5zdF92YWx1ZSA9IEJZVEVfR0VUOCAoZXN5bXNbal0uc3RfdmFsdWUpOwotICAgICAgcHN5bS0+c3Rfc2l6ZSAgPSBCWVRFX0dFVDggKGVzeW1zW2pdLnN0X3NpemUpOwotICAgIH0KLQotICBmcmVlIChlc3ltcyk7Ci0KLSAgcmV0dXJuIGlzeW1zOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3NlY3Rpb25faGVhZGVycyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgaW50ICAgICAgICAgICAgICAgICBpOwotCi0gIHNlY3Rpb25faGVhZGVycyA9IE5VTEw7Ci0KLSAgaWYgKGVsZl9oZWFkZXIuZV9zaG51bSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChkb19zZWN0aW9ucykKLQlwcmludGYgKF8oIlxuVGhlcmUgYXJlIG5vIHNlY3Rpb25zIGluIHRoaXMgZmlsZS5cbiIpKTsKLQotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmIChkb19zZWN0aW9ucyAmJiAhZG9faGVhZGVyKQotICAgIHByaW50ZiAoXygiVGhlcmUgYXJlICVkIHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0IDB4JWx4OlxuIiksCi0JICAgIGVsZl9oZWFkZXIuZV9zaG51bSwgKHVuc2lnbmVkIGxvbmcpIGVsZl9oZWFkZXIuZV9zaG9mZik7Ci0KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICB7Ci0gICAgICBpZiAoISBnZXRfMzJiaXRfc2VjdGlvbl9oZWFkZXJzIChmaWxlKSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZ2V0XzY0Yml0X3NlY3Rpb25faGVhZGVycyAoZmlsZSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogUmVhZCBpbiB0aGUgc3RyaW5nIHRhYmxlLCBzbyB0aGF0IHdlIGhhdmUgbmFtZXMgdG8gZGlzcGxheS4gICovCi0gIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnMgKyBlbGZfaGVhZGVyLmVfc2hzdHJuZHg7Ci0KLSAgaWYgKHNlY3Rpb24tPnNoX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHN0cmluZ190YWJsZV9vZmZzZXQ7Ci0KLSAgICAgIHN0cmluZ190YWJsZV9vZmZzZXQgPSBzZWN0aW9uLT5zaF9vZmZzZXQ7Ci0KLSAgICAgIEdFVF9EQVRBX0FMTE9DIChzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX3NpemUsCi0JCSAgICAgIHN0cmluZ190YWJsZSwgY2hhciAqLCAic3RyaW5nIHRhYmxlIik7Ci0gICAgfQotCi0gIC8qIFNjYW4gdGhlIHNlY3Rpb25zIGZvciB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUKLSAgICAgYW5kIGR5bmFtaWMgc3RyaW5nIHRhYmxlIGFuZCBkZWJ1ZyBzZWN0aW9ucy4gKi8KLSAgZHluYW1pY19zeW1ib2xzID0gTlVMTDsKLSAgZHluYW1pY19zdHJpbmdzID0gTlVMTDsKLSAgZHluYW1pY19zeW1pbmZvID0gTlVMTDsKLQotICBmb3IgKGkgPSAwLCBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07Ci0gICAgICAgaSArKywgc2VjdGlvbiArKykKLSAgICB7Ci0gICAgICBjaGFyICogbmFtZSA9IFNFQ1RJT05fTkFNRSAoc2VjdGlvbik7Ci0KLSAgICAgIGlmIChzZWN0aW9uLT5zaF90eXBlID09IFNIVF9EWU5TWU0pCi0JewotCSAgaWYgKGR5bmFtaWNfc3ltYm9scyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKF8oIkZpbGUgY29udGFpbnMgbXVsdGlwbGUgZHluYW1pYyBzeW1ib2wgdGFibGVzXG4iKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgbnVtX2R5bmFtaWNfc3ltcyA9IHNlY3Rpb24tPnNoX3NpemUgLyBzZWN0aW9uLT5zaF9lbnRzaXplOwotCSAgZHluYW1pY19zeW1ib2xzID0KLQkgICAgR0VUX0VMRl9TWU1CT0xTIChmaWxlLCBzZWN0aW9uLT5zaF9vZmZzZXQsIG51bV9keW5hbWljX3N5bXMpOwotCX0KLSAgICAgIGVsc2UgaWYgKHNlY3Rpb24tPnNoX3R5cGUgPT0gU0hUX1NUUlRBQgotCSAgICAgICAmJiBzdHJjbXAgKG5hbWUsICIuZHluc3RyIikgPT0gMCkKLQl7Ci0JICBpZiAoZHluYW1pY19zdHJpbmdzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoXygiRmlsZSBjb250YWlucyBtdWx0aXBsZSBkeW5hbWljIHN0cmluZyB0YWJsZXNcbiIpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBHRVRfREFUQV9BTExPQyAoc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9zaXplLAotCQkJICBkeW5hbWljX3N0cmluZ3MsIGNoYXIgKiwgImR5bmFtaWMgc3RyaW5ncyIpOwotCX0KLSAgICAgIGVsc2UgaWYgKChkb19kZWJ1Z2dpbmcgfHwgZG9fZGVidWdfaW5mbyB8fCBkb19kZWJ1Z19hYmJyZXZzCi0JCXx8IGRvX2RlYnVnX2xpbmVzIHx8IGRvX2RlYnVnX3B1Ym5hbWVzIHx8IGRvX2RlYnVnX2FyYW5nZXMpCi0JICAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIuZGVidWdfIiwgNykgPT0gMCkKLQl7Ci0JICBuYW1lICs9IDc7Ci0KLQkgIGlmIChkb19kZWJ1Z2dpbmcKLQkgICAgICB8fCAoZG9fZGVidWdfaW5mbyAgICAgJiYgKHN0cmNtcCAobmFtZSwgImluZm8iKSA9PSAwKSkKLQkgICAgICB8fCAoZG9fZGVidWdfYWJicmV2cyAgJiYgKHN0cmNtcCAobmFtZSwgImFiYnJldiIpID09IDApKQotCSAgICAgIHx8IChkb19kZWJ1Z19saW5lcyAgICAmJiAoc3RyY21wIChuYW1lLCAibGluZSIpID09IDApKQotCSAgICAgIHx8IChkb19kZWJ1Z19wdWJuYW1lcyAmJiAoc3RyY21wIChuYW1lLCAicHVibmFtZXMiKSA9PSAwKSkKLQkgICAgICB8fCAoZG9fZGVidWdfYXJhbmdlcyAgJiYgKHN0cmNtcCAobmFtZSwgImFyYW5nZXMiKSA9PSAwKSkKLQkgICAgICApCi0JICAgIHJlcXVlc3RfZHVtcCAoaSwgREVCVUdfRFVNUCk7Ci0JfQotICAgIH0KLQotICBpZiAoISBkb19zZWN0aW9ucykKLSAgICByZXR1cm4gMTsKLQotICBwcmludGYgKF8oIlxuU2VjdGlvbiBIZWFkZXIlczpcbiIpLCBlbGZfaGVhZGVyLmVfc2hudW0gPiAxID8gInMiIDogIiIpOwotICBpZiAoaXNfMzJiaXRfZWxmKQotICAgIHByaW50ZgotICAgICAgKF8oIiAgW05yXSBOYW1lICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGcgTGsgSW5mIEFsXG4iKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIiAgW05yXSBOYW1lICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAgIE9mZnNldFxuIikpOwotICAgICAgcHJpbnRmIChfKCIgICAgICAgU2l6ZSAgICAgICAgICAgICAgRW50U2l6ZSAgICAgICAgICBGbGFncyAgTGluayAgSW5mbyAgQWxpZ25cbiIpKTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkgKyssIHNlY3Rpb24gKyspCi0gICAgewotICAgICAgcHJpbnRmICgiICBbJTJkXSAlLTE3LjE3cyAlLTE1LjE1cyAiLAotCSAgICAgIGksCi0JICAgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwKLQkgICAgICBnZXRfc2VjdGlvbl90eXBlX25hbWUgKHNlY3Rpb24tPnNoX3R5cGUpKTsKLQotICAgICAgaWYgKGlzXzMyYml0X2VsZikKLQl7Ci0JICBwcmludF92bWEgKHNlY3Rpb24tPnNoX2FkZHIsIExPTkdfSEVYKTsKLSAgICAgIAotCSAgcHJpbnRmICggIiAlNi42bHggJTYuNmx4ICUyLjJseCIsCi0JCSAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9vZmZzZXQsCi0JCSAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9zaXplLAotCQkgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfZW50c2l6ZSk7Ci0JICAKLQkgIHByaW50ZiAoIiAlYyVjJWMgJTJsZCAlM2x4ICVsZFxuIiwKLQkJICAoc2VjdGlvbi0+c2hfZmxhZ3MgJiBTSEZfV1JJVEUgPyAnVycgOiAnICcpLAotCQkgIChzZWN0aW9uLT5zaF9mbGFncyAmIFNIRl9BTExPQyA/ICdBJyA6ICcgJyksCi0JCSAgKHNlY3Rpb24tPnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUiA/ICdYJyA6ICcgJyksCi0JCSAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX2xpbmssCi0JCSAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX2luZm8sCi0JCSAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX2FkZHJhbGlnbik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHB1dGNoYXIgKCcgJyk7Ci0JICBwcmludF92bWEgKHNlY3Rpb24tPnNoX2FkZHIsIExPTkdfSEVYKTsKLQkgIHByaW50ZiAoIiAgJTguOGx4Iiwgc2VjdGlvbi0+c2hfb2Zmc2V0KTsKLQkgIHByaW50ZiAoIlxuICAgICAgICIpOwotCSAgcHJpbnRfdm1hIChzZWN0aW9uLT5zaF9zaXplLCBMT05HX0hFWCk7Ci0JICBwcmludGYgKCIgICIpOwotCSAgcHJpbnRfdm1hIChzZWN0aW9uLT5zaF9lbnRzaXplLCBMT05HX0hFWCk7Ci0JICAKLQkgIHByaW50ZiAoIiAlYyVjJWMiLAotCQkgIChzZWN0aW9uLT5zaF9mbGFncyAmIFNIRl9XUklURSA/ICdXJyA6ICcgJyksCi0JCSAgKHNlY3Rpb24tPnNoX2ZsYWdzICYgU0hGX0FMTE9DID8gJ0EnIDogJyAnKSwKLQkJICAoc2VjdGlvbi0+c2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSID8gJ1gnIDogJyAnKSk7Ci0JICAKLQkgIHByaW50ZiAoIiAgICAgJTJsZCAgICUzbHggICAgICVsZFxuIiwKLQkJICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfbGluaywKLQkJICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfaW5mbywKLQkJICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfYWRkcmFsaWduKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBQcm9jZXNzIHRoZSByZWxvYyBzZWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3NfcmVsb2NzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgdW5zaWduZWQgbG9uZyAgICByZWxfc2l6ZTsKLSAgdW5zaWduZWQgbG9uZwkgICByZWxfb2Zmc2V0OwotCi0KLSAgaWYgKCFkb19yZWxvYykKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZG9fdXNpbmdfZHluYW1pYykKLSAgICB7Ci0gICAgICBpbnQgaXNfcmVsYSA9IEZBTFNFOwotCi0gICAgICByZWxfc2l6ZSAgID0gMDsKLSAgICAgIHJlbF9vZmZzZXQgPSAwOwotCi0gICAgICBpZiAoZHluYW1pY19pbmZvW0RUX1JFTF0pCi0JewotCSAgcmVsX29mZnNldCA9IGR5bmFtaWNfaW5mb1tEVF9SRUxdOwotCSAgcmVsX3NpemUgICA9IGR5bmFtaWNfaW5mb1tEVF9SRUxTWl07Ci0JICBpc19yZWxhICAgID0gRkFMU0U7Ci0JfQotICAgICAgZWxzZSBpZiAoZHluYW1pY19pbmZvIFtEVF9SRUxBXSkKLQl7Ci0JICByZWxfb2Zmc2V0ID0gZHluYW1pY19pbmZvW0RUX1JFTEFdOwotCSAgcmVsX3NpemUgICA9IGR5bmFtaWNfaW5mb1tEVF9SRUxBU1pdOwotCSAgaXNfcmVsYSAgICA9IFRSVUU7Ci0JfQotICAgICAgZWxzZSBpZiAoZHluYW1pY19pbmZvW0RUX0pNUFJFTF0pCi0JewotCSAgcmVsX29mZnNldCA9IGR5bmFtaWNfaW5mb1tEVF9KTVBSRUxdOwotCSAgcmVsX3NpemUgICA9IGR5bmFtaWNfaW5mb1tEVF9QTFRSRUxTWl07Ci0KLQkgIHN3aXRjaCAoZHluYW1pY19pbmZvW0RUX1BMVFJFTF0pCi0JICAgIHsKLQkgICAgY2FzZSBEVF9SRUw6Ci0JICAgICAgaXNfcmVsYSA9IEZBTFNFOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERUX1JFTEE6Ci0JICAgICAgaXNfcmVsYSA9IFRSVUU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaXNfcmVsYSA9IFVOS05PV047Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChyZWxfc2l6ZSkKLQl7Ci0JICBwcmludGYKLQkgICAgKF8oIlxuUmVsb2NhdGlvbiBzZWN0aW9uIGF0IG9mZnNldCAweCVseCBjb250YWlucyAlbGQgYnl0ZXM6XG4iKSwKLQkgICAgIHJlbF9vZmZzZXQsIHJlbF9zaXplKTsKLQotCSAgZHVtcF9yZWxvY2F0aW9ucyAoZmlsZSwgcmVsX29mZnNldCAtIGxvYWRhZGRyLCByZWxfc2l6ZSwKLQkJCSAgICBkeW5hbWljX3N5bWJvbHMsIG51bV9keW5hbWljX3N5bXMsIGR5bmFtaWNfc3RyaW5ncywgaXNfcmVsYSk7Ci0JfQotICAgICAgZWxzZQotCXByaW50ZiAoXygiXG5UaGVyZSBhcmUgbm8gZHluYW1pYyByZWxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuXG4iKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqICAgICBzZWN0aW9uOwotICAgICAgdW5zaWduZWQgbG9uZyAJCWk7Ci0gICAgICBpbnQgICAgICAgICAgIAkJZm91bmQgPSAwOwotCi0gICAgICBmb3IgKGkgPSAwLCBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOwotCSAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07Ci0JICAgaSsrLCBzZWN0aW9uICsrKQotCXsKLQkgIGlmICggICBzZWN0aW9uLT5zaF90eXBlICE9IFNIVF9SRUxBCi0JICAgICAgJiYgc2VjdGlvbi0+c2hfdHlwZSAhPSBTSFRfUkVMKQotCSAgICBjb250aW51ZTsKLQotCSAgcmVsX29mZnNldCA9IHNlY3Rpb24tPnNoX29mZnNldDsKLQkgIHJlbF9zaXplICAgPSBzZWN0aW9uLT5zaF9zaXplOwotCi0JICBpZiAocmVsX3NpemUpCi0JICAgIHsKLQkgICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc3Ryc2VjOwotCSAgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzeW1zZWM7Ci0JICAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgIHN5bXRhYjsKLQkgICAgICBjaGFyICogICAgICAgICAgICAgICAgc3RydGFiOwotCSAgICAgIGludCAgICAgICAgICAgICAgICAgICBpc19yZWxhOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICBuc3ltczsKLQotCSAgICAgIHByaW50ZiAoXygiXG5SZWxvY2F0aW9uIHNlY3Rpb24gIikpOwotCi0JICAgICAgaWYgKHN0cmluZ190YWJsZSA9PSBOVUxMKQotCQlwcmludGYgKCIlZCIsIHNlY3Rpb24tPnNoX25hbWUpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiJyVzJyIsIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0JICAgICAgcHJpbnRmIChfKCIgYXQgb2Zmc2V0IDB4JWx4IGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIiksCi0JCSByZWxfb2Zmc2V0LCAodW5zaWduZWQgbG9uZykgKHJlbF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZSkpOwotCi0JICAgICAgc3ltc2VjID0gc2VjdGlvbl9oZWFkZXJzICsgc2VjdGlvbi0+c2hfbGluazsKLQotCSAgICAgIG5zeW1zID0gc3ltc2VjLT5zaF9zaXplIC8gc3ltc2VjLT5zaF9lbnRzaXplOwotCSAgICAgIHN5bXRhYiA9IEdFVF9FTEZfU1lNQk9MUyAoZmlsZSwgc3ltc2VjLT5zaF9vZmZzZXQsIG5zeW1zKTsKLQotCSAgICAgIGlmIChzeW10YWIgPT0gTlVMTCkKLQkJY29udGludWU7Ci0KLQkgICAgICBzdHJzZWMgPSBzZWN0aW9uX2hlYWRlcnMgKyBzeW1zZWMtPnNoX2xpbms7Ci0KLQkgICAgICBHRVRfREFUQV9BTExPQyAoc3Ryc2VjLT5zaF9vZmZzZXQsIHN0cnNlYy0+c2hfc2l6ZSwgc3RydGFiLAotCQkJICAgICAgY2hhciAqLCAic3RyaW5nIHRhYmxlIik7Ci0KLQkgICAgICBpc19yZWxhID0gc2VjdGlvbi0+c2hfdHlwZSA9PSBTSFRfUkVMQTsKLQotCSAgICAgIGR1bXBfcmVsb2NhdGlvbnMgKGZpbGUsIHJlbF9vZmZzZXQsIHJlbF9zaXplLCBzeW10YWIsIG5zeW1zLCBzdHJ0YWIsIGlzX3JlbGEpOwotCi0JICAgICAgZnJlZSAoc3RydGFiKTsKLQkgICAgICBmcmVlIChzeW10YWIpOwotCi0JICAgICAgZm91bmQgPSAxOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBmb3VuZCkKLQlwcmludGYgKF8oIlxuVGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIpKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWR5bmFtaWNfc2VnbWVudF9taXBzX3ZhbCAoZW50cnkpCi0gICAgIEVsZl9JbnRlcm5hbF9EeW4gKiBlbnRyeTsKLXsKLSAgc3dpdGNoIChlbnRyeS0+ZF90YWcpCi0gICAgewotICAgIGNhc2UgRFRfTUlQU19GTEFHUzoKLSAgICAgIGlmIChlbnRyeS0+ZF91bi5kX3ZhbCA9PSAwKQotCXByaW50ZiAoIk5PTkVcbiIpOwotICAgICAgZWxzZQotCXsKLQkgIHN0YXRpYyBjb25zdCBjaGFyICogb3B0c1tdID0KLQkgIHsKLQkgICAgIlFVSUNLU1RBUlQiLCAiTk9UUE9UIiwgIk5PX0xJQlJBUllfUkVQTEFDRU1FTlQiLAotCSAgICAiTk9fTU9WRSIsICJTR0lfT05MWSIsICJHVUFSQU5URUVfSU5JVCIsICJERUxUQV9DX1BMVVNfUExVUyIsCi0JICAgICJHVUFSQU5URUVfU1RBUlRfSU5JVCIsICJQSVhJRSIsICJERUZBVUxUX0RFTEFZX0xPQUQiLAotCSAgICAiUkVRVUlDS1NUQVJUIiwgIlJFUVVJQ0tTVEFSVEVEIiwgIkNPUkQiLCAiTk9fVU5SRVNfVU5ERUYiLAotCSAgICAiUkxEX09SREVSX1NBRkUiCi0JICB9OwotCSAgdW5zaWduZWQgaW50IGNudDsKLQkgIGludCBmaXJzdCA9IDE7Ci0JICBmb3IgKGNudCA9IDA7IGNudCA8IE5VTV9FTEVNIChvcHRzKTsgKysgY250KQotCSAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgJiAoMSA8PCBjbnQpKQotCSAgICAgIHsKLQkJcHJpbnRmICgiJXMlcyIsIGZpcnN0ID8gIiIgOiAiICIsIG9wdHNbY250XSk7Ci0JCWZpcnN0ID0gMDsKLQkgICAgICB9Ci0JICBwdXRzICgiIik7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERUX01JUFNfSVZFUlNJT046Ci0gICAgICBpZiAoZHluYW1pY19zdHJpbmdzICE9IE5VTEwpCi0JcHJpbnRmICgiSW50ZXJmYWNlIFZlcnNpb246ICVzXG4iLAotCQlkeW5hbWljX3N0cmluZ3MgKyBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0gICAgICBlbHNlCi0JcHJpbnRmICgiJWxkXG4iLCAobG9uZykgZW50cnktPmRfdW4uZF9wdHIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERUX01JUFNfVElNRV9TVEFNUDoKLSAgICAgIHsKLQljaGFyIHRpbWVidWZbMjBdOwotCXRpbWVfdCB0aW1lID0gZW50cnktPmRfdW4uZF92YWw7Ci0Jc3RyZnRpbWUgKHRpbWVidWYsIDIwLCAiJVktJW0tJWRUJUg6JU06JVMiLCBnbXRpbWUgKCZ0aW1lKSk7Ci0JcHJpbnRmICgiVGltZSBTdGFtcDogJXNcbiIsIHRpbWVidWYpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERUX01JUFNfUkxEX1ZFUlNJT046Ci0gICAgY2FzZSBEVF9NSVBTX0xPQ0FMX0dPVE5POgotICAgIGNhc2UgRFRfTUlQU19DT05GTElDVE5POgotICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUTk86Ci0gICAgY2FzZSBEVF9NSVBTX1NZTVRBQk5POgotICAgIGNhc2UgRFRfTUlQU19VTlJFRkVYVE5POgotICAgIGNhc2UgRFRfTUlQU19ISVBBR0VOTzoKLSAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1NfTk86Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFX05POgotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9SRUxPQ19OTzoKLSAgICBjYXNlIERUX01JUFNfREVMVEFfU1lNX05POgotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9DTEFTU1NZTV9OTzoKLSAgICBjYXNlIERUX01JUFNfQ09NUEFDVF9TSVpFOgotICAgICAgcHJpbnRmICgiJWxkXG4iLCAobG9uZykgZW50cnktPmRfdW4uZF9wdHIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcHJpbnRmICgiJSNseFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWR5bmFtaWNfc2VnbWVudF9wYXJpc2NfdmFsIChlbnRyeSkKLSAgICAgRWxmX0ludGVybmFsX0R5biAqIGVudHJ5OwotewotICBzd2l0Y2ggKGVudHJ5LT5kX3RhZykKLSAgICB7Ci0gICAgY2FzZSBEVF9IUF9ETERfRkxBR1M6Ci0gICAgICB7Ci0Jc3RhdGljIHN0cnVjdAotCXsKLQkgIGxvbmcgaW50IGJpdDsKLQkgIGNvbnN0IGNoYXIgKiBzdHI7Ci0JfQotCWZsYWdzW10gPQotCXsKLQkgIHsgRFRfSFBfREVCVUdfUFJJVkFURSwgIkhQX0RFQlVHX1BSSVZBVEUiIH0sCi0JICB7IERUX0hQX0RFQlVHX0NBTExCQUNLLCAiSFBfREVCVUdfQ0FMTEJBQ0siIH0sCi0JICB7IERUX0hQX0RFQlVHX0NBTExCQUNLX0JPUiwgIkhQX0RFQlVHX0NBTExCQUNLX0JPUiIgfSwKLQkgIHsgRFRfSFBfTk9fRU5WVkFSLCAiSFBfTk9fRU5WVkFSIiB9LAotCSAgeyBEVF9IUF9CSU5EX05PVywgIkhQX0JJTkRfTk9XIiB9LAotCSAgeyBEVF9IUF9CSU5EX05PTkZBVEFMLCAiSFBfQklORF9OT05GQVRBTCIgfSwKLQkgIHsgRFRfSFBfQklORF9WRVJCT1NFLCAiSFBfQklORF9WRVJCT1NFIiB9LAotCSAgeyBEVF9IUF9CSU5EX1JFU1RSSUNURUQsICJIUF9CSU5EX1JFU1RSSUNURUQiIH0sCi0JICB7IERUX0hQX0JJTkRfU1lNQk9MSUMsICJIUF9CSU5EX1NZTUJPTElDIiB9LAotCSAgeyBEVF9IUF9SUEFUSF9GSVJTVCwgIkhQX1JQQVRIX0ZJUlNUIiB9LAotCSAgeyBEVF9IUF9CSU5EX0RFUFRIX0ZJUlNULCAiSFBfQklORF9ERVBUSF9GSVJTVCIgfQotCX07Ci0JaW50IGZpcnN0ID0gMTsKLQlzaXplX3QgY250OwotCWJmZF92bWEgdmFsID0gZW50cnktPmRfdW4uZF92YWw7Ci0KLQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZmxhZ3MpIC8gc2l6ZW9mIChmbGFnc1swXSk7ICsrY250KQotCSAgaWYgKHZhbCAmIGZsYWdzW2NudF0uYml0KQotCSAgICB7Ci0JICAgICAgaWYgKCEgZmlyc3QpCi0JCXB1dGNoYXIgKCcgJyk7Ci0JICAgICAgZnB1dHMgKGZsYWdzW2NudF0uc3RyLCBzdGRvdXQpOwotCSAgICAgIGZpcnN0ID0gMDsKLQkgICAgICB2YWwgXj0gZmxhZ3NbY250XS5iaXQ7Ci0JICAgIH0KLQkKLQlpZiAodmFsICE9IDAgfHwgZmlyc3QpCi0JICB7Ci0JICAgIGlmICghIGZpcnN0KQotCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JICAgIHByaW50X3ZtYSAodmFsLCBIRVgpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgcHJpbnRfdm1hIChlbnRyeS0+ZF91bi5kX3B0ciwgUFJFRklYX0hFWCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF8zMmJpdF9keW5hbWljX3NlZ21lbnQgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGYzMl9FeHRlcm5hbF9EeW4gKiBlZHluOwotICBFbGZfSW50ZXJuYWxfRHluICogICBlbnRyeTsKLSAgYmZkX3NpemVfdHlwZSAgICAgICAgaTsKLQotICBHRVRfREFUQV9BTExPQyAoZHluYW1pY19hZGRyLCBkeW5hbWljX3NpemUsCi0JCSAgZWR5biwgRWxmMzJfRXh0ZXJuYWxfRHluICosICJkeW5hbWljIHNlZ21lbnQiKTsKLQotICAvKiBTR0kncyBFTEYgaGFzIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBpbiB0aGUgRFlOQU1JQyBzZWdtZW50LiAgRGV0ZXJtaW5lCi0gICAgIGhvdyBsYXJnZSB0aGlzIC5keW5hbWljIGlzIG5vdy4gIFdlIGNhbiBkbyB0aGlzIGV2ZW4gYmVmb3JlIHRoZSBieXRlCi0gICAgIHN3YXBwaW5nIHNpbmNlIHRoZSBEVF9OVUxMIHRhZyBpcyByZWNvZ25pemFibGUuICAqLwotICBkeW5hbWljX3NpemUgPSAwOwotICB3aGlsZSAoKihFbGYzMl9Xb3JkICopIGVkeW4gW2R5bmFtaWNfc2l6ZSsrXS5kX3RhZyAhPSBEVF9OVUxMKQotICAgIDsKLQotICBkeW5hbWljX3NlZ21lbnQgPSAoRWxmX0ludGVybmFsX0R5biAqKQotICAgIG1hbGxvYyAoZHluYW1pY19zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfRHluKSk7Ci0KLSAgaWYgKGR5bmFtaWNfc2VnbWVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICBmcmVlIChlZHluKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBlbnRyeSA9IGR5bmFtaWNfc2VnbWVudDsKLSAgICAgICBpIDwgZHluYW1pY19zaXplOwotICAgICAgIGkgKyssIGVudHJ5ICsrKQotICAgIHsKLSAgICAgIGVudHJ5LT5kX3RhZyAgICAgID0gQllURV9HRVQgKGVkeW4gW2ldLmRfdGFnKTsKLSAgICAgIGVudHJ5LT5kX3VuLmRfdmFsID0gQllURV9HRVQgKGVkeW4gW2ldLmRfdW4uZF92YWwpOwotICAgIH0KLQotICBmcmVlIChlZHluKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZ2V0XzY0Yml0X2R5bmFtaWNfc2VnbWVudCAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjY0X0V4dGVybmFsX0R5biAqIGVkeW47Ci0gIEVsZl9JbnRlcm5hbF9EeW4gKiAgIGVudHJ5OwotICBiZmRfc2l6ZV90eXBlICAgICAgICBpOwotCi0gIEdFVF9EQVRBX0FMTE9DIChkeW5hbWljX2FkZHIsIGR5bmFtaWNfc2l6ZSwKLQkJICBlZHluLCBFbGY2NF9FeHRlcm5hbF9EeW4gKiwgImR5bmFtaWMgc2VnbWVudCIpOwotCi0gIC8qIFNHSSdzIEVMRiBoYXMgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGluIHRoZSBEWU5BTUlDIHNlZ21lbnQuICBEZXRlcm1pbmUKLSAgICAgaG93IGxhcmdlIHRoaXMgLmR5bmFtaWMgaXMgbm93LiAgV2UgY2FuIGRvIHRoaXMgZXZlbiBiZWZvcmUgdGhlIGJ5dGUKLSAgICAgc3dhcHBpbmcgc2luY2UgdGhlIERUX05VTEwgdGFnIGlzIHJlY29nbml6YWJsZS4gICovCi0gIGR5bmFtaWNfc2l6ZSA9IDA7Ci0gIHdoaWxlICgqKGJmZF92bWEgKikgZWR5biBbZHluYW1pY19zaXplICsrXS5kX3RhZyAhPSBEVF9OVUxMKQotICAgIDsKLQotICBkeW5hbWljX3NlZ21lbnQgPSAoRWxmX0ludGVybmFsX0R5biAqKQotICAgIG1hbGxvYyAoZHluYW1pY19zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfRHluKSk7Ci0KLSAgaWYgKGR5bmFtaWNfc2VnbWVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICBmcmVlIChlZHluKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBlbnRyeSA9IGR5bmFtaWNfc2VnbWVudDsKLSAgICAgICBpIDwgZHluYW1pY19zaXplOwotICAgICAgIGkgKyssIGVudHJ5ICsrKQotICAgIHsKLSAgICAgIGVudHJ5LT5kX3RhZyAgICAgID0gQllURV9HRVQ4IChlZHluIFtpXS5kX3RhZyk7Ci0gICAgICBlbnRyeS0+ZF91bi5kX3ZhbCA9IEJZVEVfR0VUOCAoZWR5biBbaV0uZF91bi5kX3ZhbCk7Ci0gICAgfQotCi0gIGZyZWUgKGVkeW4pOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBQYXJzZSBhbmQgZGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIGR5bmFtaWMgc2VnbWVudC4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2R5bmFtaWNfc2VnbWVudCAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9EeW4gKiBlbnRyeTsKLSAgYmZkX3NpemVfdHlwZSAgICAgIGk7Ci0KLSAgaWYgKGR5bmFtaWNfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChkb19keW5hbWljKQotCXByaW50ZiAoXygiXG5UaGVyZSBpcyBubyBkeW5hbWljIHNlZ21lbnQgaW4gdGhpcyBmaWxlLlxuIikpOwotCi0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICB7Ci0gICAgICBpZiAoISBnZXRfMzJiaXRfZHluYW1pY19zZWdtZW50IChmaWxlKSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZ2V0XzY0Yml0X2R5bmFtaWNfc2VnbWVudCAoZmlsZSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogRmluZCB0aGUgYXBwcm9wcmlhdGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKGR5bmFtaWNfc3ltYm9scyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OwotCSAgIGkgPCBkeW5hbWljX3NpemU7Ci0JICAgKytpLCArKyBlbnRyeSkKLQl7Ci0JICB1bnNpZ25lZCBsb25nICAgICAgICBvZmZzZXQ7Ci0KLQkgIGlmIChlbnRyeS0+ZF90YWcgIT0gRFRfU1lNVEFCKQotCSAgICBjb250aW51ZTsKLQotCSAgZHluYW1pY19pbmZvW0RUX1NZTVRBQl0gPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCSAgLyogU2luY2Ugd2UgZG8gbm90IGtub3cgaG93IGJpZyB0aGUgc3ltYm9sIHRhYmxlIGlzLAotCSAgICAgd2UgZGVmYXVsdCB0byByZWFkaW5nIGluIHRoZSBlbnRpcmUgZmlsZSAoISkgYW5kCi0JICAgICBwcm9jZXNzaW5nIHRoYXQuICBUaGlzIGlzIG92ZXJraWxsLCBJIGtub3csIGJ1dCBpdAotCSAgICAgc2hvdWxkIHdvcmsuICovCi0JICBvZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCi0JICBpZiAoZnNlZWsgKGZpbGUsIDAsIFNFRUtfRU5EKSkKLQkgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBzZWVrIHRvIGVuZCBvZiBmaWxlISIpKTsKLQotCSAgaWYgKGlzXzMyYml0X2VsZikKLQkgICAgbnVtX2R5bmFtaWNfc3ltcyA9IChmdGVsbCAoZmlsZSkgLSBvZmZzZXQpIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotCSAgZWxzZQotCSAgICBudW1fZHluYW1pY19zeW1zID0gKGZ0ZWxsIChmaWxlKSAtIG9mZnNldCkgLyBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1N5bSk7Ci0KLQkgIGlmIChudW1fZHluYW1pY19zeW1zIDwgMSkKLQkgICAgewotCSAgICAgIGVycm9yIChfKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBsb2FkXG4iKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgZHluYW1pY19zeW1ib2xzID0gR0VUX0VMRl9TWU1CT0xTIChmaWxlLCBvZmZzZXQsIG51bV9keW5hbWljX3N5bXMpOwotCX0KLSAgICB9Ci0KLSAgLyogU2ltaWxhcmx5IGZpbmQgYSBzdHJpbmcgdGFibGUuICAqLwotICBpZiAoZHluYW1pY19zdHJpbmdzID09IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0JICAgaSA8IGR5bmFtaWNfc2l6ZTsKLQkgICArK2ksICsrIGVudHJ5KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCSAgbG9uZyAgICAgICAgICBzdHJfdGFiX2xlbjsKLQotCSAgaWYgKGVudHJ5LT5kX3RhZyAhPSBEVF9TVFJUQUIpCi0JICAgIGNvbnRpbnVlOwotCi0JICBkeW5hbWljX2luZm9bRFRfU1RSVEFCXSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JICAvKiBTaW5jZSB3ZSBkbyBub3Qga25vdyBob3cgYmlnIHRoZSBzdHJpbmcgdGFibGUgaXMsCi0JICAgICB3ZSBkZWZhdWx0IHRvIHJlYWRpbmcgaW4gdGhlIGVudGlyZSBmaWxlICghKSBhbmQKLQkgICAgIHByb2Nlc3NpbmcgdGhhdC4gIFRoaXMgaXMgb3ZlcmtpbGwsIEkga25vdywgYnV0IGl0Ci0JICAgICBzaG91bGQgd29yay4gKi8KLQotCSAgb2Zmc2V0ID0gZW50cnktPmRfdW4uZF92YWwgLSBsb2FkYWRkcjsKLQkgIGlmIChmc2VlayAoZmlsZSwgMCwgU0VFS19FTkQpKQotCSAgICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGVcbiIpKTsKLQkgIHN0cl90YWJfbGVuID0gZnRlbGwgKGZpbGUpIC0gb2Zmc2V0OwotCi0JICBpZiAoc3RyX3RhYl9sZW4gPCAxKQotCSAgICB7Ci0JICAgICAgZXJyb3IKLQkJKF8oIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGVcbiIpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBHRVRfREFUQV9BTExPQyAob2Zmc2V0LCBzdHJfdGFiX2xlbiwgZHluYW1pY19zdHJpbmdzLCBjaGFyICosCi0JCQkgICJkeW5hbWljIHN0cmluZyB0YWJsZSIpOwotCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEFuZCBmaW5kIHRoZSBzeW1pbmZvIHNlY3Rpb24gaWYgYXZhaWxhYmxlLiAgKi8KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzeW1pbnN6ID0gMDsKLQotICAgICAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0JICAgaSA8IGR5bmFtaWNfc2l6ZTsKLQkgICArK2ksICsrIGVudHJ5KQotCXsKLQkgIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfU1lNSU5FTlQpCi0JICAgIHsKLQkgICAgICAvKiBOb3RlOiB0aGVzZSBicmFjZXMgYXJlIG5lY2Vzc2FyeSB0byBhdm9pZCBhIHN5bnRheAotCQkgZXJyb3IgZnJvbSB0aGUgU3VuT1M0IEMgY29tcGlsZXIuICAqLwotCSAgICAgIGFzc2VydCAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltaW5mbykgPT0gZW50cnktPmRfdW4uZF92YWwpOwotCSAgICB9Ci0JICBlbHNlIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfU1lNSU5TWikKLQkgICAgc3ltaW5zeiA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCSAgZWxzZSBpZiAoZW50cnktPmRfdGFnID09IERUX1NZTUlORk8pCi0JICAgIGR5bmFtaWNfc3ltaW5mb19vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCX0KLQotICAgICAgaWYgKGR5bmFtaWNfc3ltaW5mb19vZmZzZXQgIT0gMCAmJiBzeW1pbnN6ICE9IDApCi0JewotCSAgRWxmX0V4dGVybmFsX1N5bWluZm8gKiBleHRzeW1pbmZvOwotCSAgRWxmX0ludGVybmFsX1N5bWluZm8gKiBzeW1pbmZvOwotCi0JICAvKiBUaGVyZSBpcyBhIHN5bWluZm8gc2VjdGlvbi4gIFJlYWQgdGhlIGRhdGEuICAqLwotCSAgR0VUX0RBVEFfQUxMT0MgKGR5bmFtaWNfc3ltaW5mb19vZmZzZXQsIHN5bWluc3osIGV4dHN5bWluZm8sCi0JCQkgIEVsZl9FeHRlcm5hbF9TeW1pbmZvICosICJzeW1ib2wgaW5mb3JtYXRpb24iKTsKLQotCSAgZHluYW1pY19zeW1pbmZvID0gKEVsZl9JbnRlcm5hbF9TeW1pbmZvICopIG1hbGxvYyAoc3ltaW5zeik7Ci0JICBpZiAoZHluYW1pY19zeW1pbmZvID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0KLQkgIGR5bmFtaWNfc3ltaW5mb19uZW50ID0gc3ltaW5zeiAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bWluZm8pOwotCSAgZm9yIChpID0gMCwgc3ltaW5mbyA9IGR5bmFtaWNfc3ltaW5mbzsgaSA8IGR5bmFtaWNfc3ltaW5mb19uZW50OwotCSAgICAgICArK2ksICsrc3ltaW5mbykKLQkgICAgewotCSAgICAgIHN5bWluZm8tPnNpX2JvdW5kdG8gPSBCWVRFX0dFVCAoZXh0c3ltaW5mb1tpXS5zaV9ib3VuZHRvKTsKLQkgICAgICBzeW1pbmZvLT5zaV9mbGFncyA9IEJZVEVfR0VUIChleHRzeW1pbmZvW2ldLnNpX2ZsYWdzKTsKLQkgICAgfQotCi0JICBmcmVlIChleHRzeW1pbmZvKTsKLQl9Ci0gICAgfQotCi0gIGlmIChkb19keW5hbWljICYmIGR5bmFtaWNfYWRkcikKLSAgICBwcmludGYgKF8oIlxuRHluYW1pYyBzZWdtZW50IGF0IG9mZnNldCAweCV4IGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIiksCi0JICAgIGR5bmFtaWNfYWRkciwgKGxvbmcpIGR5bmFtaWNfc2l6ZSk7Ci0gIGlmIChkb19keW5hbWljKQotICAgIHByaW50ZiAoXygiICBUYWcgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZS9WYWx1ZVxuIikpOwotCi0gIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OwotICAgICAgIGkgPCBkeW5hbWljX3NpemU7Ci0gICAgICAgaSsrLCBlbnRyeSArKykKLSAgICB7Ci0gICAgICBpZiAoZG9fZHluYW1pYykKLQl7Ci0JICBwdXRjaGFyICgnICcpOwotCSAgcHJpbnRfdm1hIChlbnRyeS0+ZF90YWcsIEZVTExfSEVYKTsKLQkgIHByaW50ZiAoIiAoJXMpJSpzIiwKLQkJICBnZXRfZHluYW1pY190eXBlIChlbnRyeS0+ZF90YWcpLAotCQkgIChpc18zMmJpdF9lbGYgPyAyNyA6IDE5KSAtIHN0cmxlbiAoZ2V0X2R5bmFtaWNfdHlwZSAoZW50cnktPmRfdGFnKSksCi0JCSAgIiAiKTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoZW50cnktPmRfdGFnKQotCXsKLQljYXNlIERUX0FVWElMSUFSWToKLQljYXNlIERUX0ZJTFRFUjoKLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgaWYgKGVudHJ5LT5kX3RhZyA9PSBEVF9BVVhJTElBUlkpCi0JCXByaW50ZiAoXygiQXV4aWxpYXJ5IGxpYnJhcnkiKSk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKF8oIkZpbHRlciBsaWJyYXJ5IikpOwotCi0JICAgICAgaWYgKGR5bmFtaWNfc3RyaW5ncykKLQkJcHJpbnRmICgiOiBbJXNdXG4iLCBkeW5hbWljX3N0cmluZ3MgKyBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgcHJpbnRmICgiOiAiKTsKLQkJICBwcmludF92bWEgKGVudHJ5LT5kX3VuLmRfdmFsLCBQUkVGSVhfSEVYKTsKLQkJICBwdXRjaGFyICgnXG4nKTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfRkVBVFVSRV8xOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBwcmludGYgKF8oIkZsYWdzOiIpKTsKLQkgICAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgPT0gMCkKLQkJcHJpbnRmIChfKCIgTm9uZVxuIikpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgaW50IHZhbCA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCQkgIGlmICh2YWwgJiBEVEZfMV9QQVJJTklUKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgUEFSSU5JVCIpOwotCQkgICAgICB2YWwgXj0gRFRGXzFfUEFSSU5JVDsKLQkJICAgIH0KLQkJICBpZiAodmFsICE9IDApCi0JCSAgICBwcmludGYgKCIgJWx4IiwgdmFsKTsKLQkJICBwdXRzICgiIik7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIERUX1BPU0ZMQUdfMToKLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCJGbGFnczoiKSk7Ci0JICAgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsID09IDApCi0JCXByaW50ZiAoXygiIE5vbmVcbiIpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGludCB2YWwgPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQkJICBpZiAodmFsICYgREZfUDFfTEFaWUxPQUQpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBMQVpZTE9BRCIpOwotCQkgICAgICB2YWwgXj0gREZfUDFfTEFaWUxPQUQ7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGX1AxX0dST1VQUEVSTSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIEdST1VQUEVSTSIpOwotCQkgICAgICB2YWwgXj0gREZfUDFfR1JPVVBQRVJNOwotCQkgICAgfQotCQkgIGlmICh2YWwgIT0gMCkKLQkJICAgIHByaW50ZiAoIiAlbHgiLCB2YWwpOwotCQkgIHB1dHMgKCIiKTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfRkxBR1NfMToKLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCJGbGFnczoiKSk7Ci0JICAgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsID09IDApCi0JCXByaW50ZiAoXygiIE5vbmVcbiIpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGludCB2YWwgPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQkJICBpZiAodmFsICYgREZfMV9OT1cpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBOT1ciKTsKLQkJICAgICAgdmFsIF49IERGXzFfTk9XOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX0dMT0JBTCkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIEdMT0JBTCIpOwotCQkgICAgICB2YWwgXj0gREZfMV9HTE9CQUw7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfR1JPVVApCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBHUk9VUCIpOwotCQkgICAgICB2YWwgXj0gREZfMV9HUk9VUDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9OT0RFTEVURSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIE5PREVMRVRFIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX05PREVMRVRFOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX0xPQURGTFRSKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgTE9BREZMVFIiKTsKLQkJICAgICAgdmFsIF49IERGXzFfTE9BREZMVFI7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfSU5JVEZJUlNUKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgSU5JVEZJUlNUIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0lOSVRGSVJTVDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9OT09QRU4pCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBOT09QRU4iKTsKLQkJICAgICAgdmFsIF49IERGXzFfTk9PUEVOOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX09SSUdJTikKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIE9SSUdJTiIpOwotCQkgICAgICB2YWwgXj0gREZfMV9PUklHSU47Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfRElSRUNUKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgRElSRUNUIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0RJUkVDVDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9UUkFOUykKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIFRSQU5TIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX1RSQU5TOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX0lOVEVSUE9TRSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIElOVEVSUE9TRSIpOwotCQkgICAgICB2YWwgXj0gREZfMV9JTlRFUlBPU0U7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAhPSAwKQotCQkgICAgcHJpbnRmICgiICVseCIsIHZhbCk7Ci0JCSAgcHV0cyAoIiIpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9QTFRSRUw6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgcHV0cyAoZ2V0X2R5bmFtaWNfdHlwZSAoZW50cnktPmRfdW4uZF92YWwpKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9OVUxMCToKLQljYXNlIERUX05FRURFRAk6Ci0JY2FzZSBEVF9QTFRHT1QJOgotCWNhc2UgRFRfSEFTSAk6Ci0JY2FzZSBEVF9TVFJUQUIJOgotCWNhc2UgRFRfU1lNVEFCCToKLQljYXNlIERUX1JFTEEJOgotCWNhc2UgRFRfSU5JVAk6Ci0JY2FzZSBEVF9GSU5JCToKLQljYXNlIERUX1NPTkFNRQk6Ci0JY2FzZSBEVF9SUEFUSAk6Ci0JY2FzZSBEVF9TWU1CT0xJQzoKLQljYXNlIERUX1JFTAk6Ci0JY2FzZSBEVF9ERUJVRwk6Ci0JY2FzZSBEVF9URVhUUkVMCToKLQljYXNlIERUX0pNUFJFTAk6Ci0JICBkeW5hbWljX2luZm9bZW50cnktPmRfdGFnXSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgewotCSAgICAgIGNoYXIgKiBuYW1lOwotCi0JICAgICAgaWYgKGR5bmFtaWNfc3RyaW5ncyA9PSBOVUxMKQotCQluYW1lID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCW5hbWUgPSBkeW5hbWljX3N0cmluZ3MgKyBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCSAgICAgIGlmIChuYW1lKQotCQl7Ci0JCSAgc3dpdGNoIChlbnRyeS0+ZF90YWcpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERUX05FRURFRDoKLQkJICAgICAgcHJpbnRmIChfKCJTaGFyZWQgbGlicmFyeTogWyVzXSIpLCBuYW1lKTsKLQotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCBwcm9ncmFtX2ludGVycHJldGVyKSA9PSAwKQotCQkJcHJpbnRmIChfKCIgcHJvZ3JhbSBpbnRlcnByZXRlciIpKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgRFRfU09OQU1FOgotCQkgICAgICBwcmludGYgKF8oIkxpYnJhcnkgc29uYW1lOiBbJXNdIiksIG5hbWUpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBEVF9SUEFUSDoKLQkJICAgICAgcHJpbnRmIChfKCJMaWJyYXJ5IHJwYXRoOiBbJXNdIiksIG5hbWUpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgcHJpbnRfdm1hIChlbnRyeS0+ZF91bi5kX3ZhbCwgUFJFRklYX0hFWCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQlwcmludF92bWEgKGVudHJ5LT5kX3VuLmRfdmFsLCBQUkVGSVhfSEVYKTsKLQotCSAgICAgIHB1dGNoYXIgKCdcbicpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfUExUUkVMU1o6Ci0JY2FzZSBEVF9SRUxBU1oJOgotCWNhc2UgRFRfU1RSU1oJOgotCWNhc2UgRFRfUkVMU1oJOgotCWNhc2UgRFRfUkVMQUVOVAk6Ci0JY2FzZSBEVF9TWU1FTlQJOgotCWNhc2UgRFRfUkVMRU5UCToKLQljYXNlIERUX1BMVFBBRFNaOgotCWNhc2UgRFRfTU9WRUVOVAk6Ci0JY2FzZSBEVF9NT1ZFU1oJOgotCWNhc2UgRFRfSU5JVF9BUlJBWVNaOgotCWNhc2UgRFRfRklOSV9BUlJBWVNaOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBwcmludF92bWEgKGVudHJ5LT5kX3VuLmRfdmFsLCBVTlNJR05FRCk7Ci0JICAgICAgcHJpbnRmICgiIChieXRlcylcbiIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfVkVSREVGTlVNOgotCWNhc2UgRFRfVkVSTkVFRE5VTToKLQljYXNlIERUX1JFTEFDT1VOVDoKLQljYXNlIERUX1JFTENPVU5UOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBwcmludF92bWEgKGVudHJ5LT5kX3VuLmRfdmFsLCBVTlNJR05FRCk7Ci0JICAgICAgcHV0Y2hhciAoJ1xuJyk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9TWU1JTlNaOgotCWNhc2UgRFRfU1lNSU5FTlQ6Ci0JY2FzZSBEVF9TWU1JTkZPOgotCWNhc2UgRFRfVVNFRDoKLQljYXNlIERUX0lOSVRfQVJSQVk6Ci0JY2FzZSBEVF9GSU5JX0FSUkFZOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBpZiAoZHluYW1pY19zdHJpbmdzICE9IE5VTEwgJiYgZW50cnktPmRfdGFnID09IERUX1VTRUQpCi0JCXsKLQkJICBjaGFyICogbmFtZTsKLQotCQkgIG5hbWUgPSBkeW5hbWljX3N0cmluZ3MgKyBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCQkgIGlmICgqIG5hbWUpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoXygiTm90IG5lZWRlZCBvYmplY3Q6IFslc11cbiIpLCBuYW1lKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHByaW50X3ZtYSAoZW50cnktPmRfdW4uZF92YWwsIFBSRUZJWF9IRVgpOwotCSAgICAgIHB1dGNoYXIgKCdcbicpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfQklORF9OT1c6Ci0JICAvKiBUaGUgdmFsdWUgb2YgdGhpcyBlbnRyeSBpcyBpZ25vcmVkLiAgKi8KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGlmICgoZW50cnktPmRfdGFnID49IERUX1ZFUlNZTSkgJiYgKGVudHJ5LT5kX3RhZyA8PSBEVF9WRVJORUVETlVNKSkKLQkgICAgdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChlbnRyeS0+ZF90YWcpXSA9Ci0JICAgICAgZW50cnktPmRfdW4uZF92YWw7Ci0KLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLQkJewotCQljYXNlIEVNX01JUFM6Ci0JCWNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JCSAgZHluYW1pY19zZWdtZW50X21pcHNfdmFsIChlbnRyeSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRU1fUEFSSVNDOgotCQkgIGR5bmFtaWNfc2VnbWVudF9wYXJpc2NfdmFsIChlbnRyeSk7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgcHJpbnRfdm1hIChlbnRyeS0+ZF91bi5kX3ZhbCwgUFJFRklYX0hFWCk7Ci0JCSAgcHV0Y2hhciAoJ1xuJyk7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X3Zlcl9mbGFncyAoZmxhZ3MpCi0gICAgIHVuc2lnbmVkIGludCBmbGFnczsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIGJ1ZmZbMF0gPSAwOwotCi0gIGlmIChmbGFncyA9PSAwKQotICAgIHJldHVybiBfKCJub25lIik7Ci0KLSAgaWYgKGZsYWdzICYgVkVSX0ZMR19CQVNFKQotICAgIHN0cmNhdCAoYnVmZiwgIkJBU0UgIik7Ci0KLSAgaWYgKGZsYWdzICYgVkVSX0ZMR19XRUFLKQotICAgIHsKLSAgICAgIGlmIChmbGFncyAmIFZFUl9GTEdfQkFTRSkKLQlzdHJjYXQgKGJ1ZmYsICJ8ICIpOwotCi0gICAgICBzdHJjYXQgKGJ1ZmYsICJXRUFLICIpOwotICAgIH0KLQotICBpZiAoZmxhZ3MgJiB+KFZFUl9GTEdfQkFTRSB8IFZFUl9GTEdfV0VBSykpCi0gICAgc3RyY2F0IChidWZmLCAifCA8dW5rbm93bj4iKTsKLQotICByZXR1cm4gYnVmZjsKLX0KLQotLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIHZlcnNpb24gc2VjdGlvbnMuICAqLwotc3RhdGljIGludAotcHJvY2Vzc192ZXJzaW9uX3NlY3Rpb25zIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gIHVuc2lnbmVkICAgaTsKLSAgaW50ICAgICAgICBmb3VuZCA9IDA7Ci0KLSAgaWYgKCEgZG9fdmVyc2lvbikKLSAgICByZXR1cm4gMTsKLQotICBmb3IgKGkgPSAwLCBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07Ci0gICAgICAgaSsrLCBzZWN0aW9uICsrKQotICAgIHsKLSAgICAgIHN3aXRjaCAoc2VjdGlvbi0+c2hfdHlwZSkKLQl7Ci0JY2FzZSBTSFRfR05VX3ZlcmRlZjoKLQkgIHsKLQkgICAgRWxmX0V4dGVybmFsX1ZlcmRlZiAqIGVkZWZzOwotCSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgaWR4OwotCSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgY250OwotCi0JICAgIGZvdW5kID0gMTsKLQotCSAgICBwcmludGYKLQkgICAgICAoXygiXG5WZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIiksCi0JICAgICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbiksIHNlY3Rpb24tPnNoX2luZm8pOwotCi0JICAgIHByaW50ZiAoXygiICBBZGRyOiAweCIpKTsKLQkgICAgcHJpbnRmX3ZtYSAoc2VjdGlvbi0+c2hfYWRkcik7Ci0JICAgIHByaW50ZiAoXygiICBPZmZzZXQ6ICUjMDhseCAgTGluazogJWx4ICglcylcbiIpLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfbGluaywKLQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbl9oZWFkZXJzICsgc2VjdGlvbi0+c2hfbGluaykpOwotCi0JICAgIEdFVF9EQVRBX0FMTE9DIChzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX3NpemUsCi0JCQkgICAgZWRlZnMsIEVsZl9FeHRlcm5hbF9WZXJkZWYgKiwKLQkJCSAgICAidmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24iKTsKLQotCSAgICBmb3IgKGlkeCA9IGNudCA9IDA7IGNudCA8IHNlY3Rpb24tPnNoX2luZm87ICsrIGNudCkKLQkgICAgICB7Ci0JCWNoYXIgKiAgICAgICAgICAgICAgICAgdnN0YXJ0OwotCQlFbGZfRXh0ZXJuYWxfVmVyZGVmICogIGVkZWY7Ci0JCUVsZl9JbnRlcm5hbF9WZXJkZWYgICAgZW50OwotCQlFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqIGVhdXg7Ci0JCUVsZl9JbnRlcm5hbF9WZXJkYXV4ICAgYXV4OwotCQlpbnQgICAgICAgICAgICAgICAgICAgIGo7Ci0JCWludCAgICAgICAgICAgICAgICAgICAgaXN1bTsKLQotCQl2c3RhcnQgPSAoKGNoYXIgKikgZWRlZnMpICsgaWR4OwotCi0JCWVkZWYgPSAoRWxmX0V4dGVybmFsX1ZlcmRlZiAqKSB2c3RhcnQ7Ci0KLQkJZW50LnZkX3ZlcnNpb24gPSBCWVRFX0dFVCAoZWRlZi0+dmRfdmVyc2lvbik7Ci0JCWVudC52ZF9mbGFncyAgID0gQllURV9HRVQgKGVkZWYtPnZkX2ZsYWdzKTsKLQkJZW50LnZkX25keCAgICAgPSBCWVRFX0dFVCAoZWRlZi0+dmRfbmR4KTsKLQkJZW50LnZkX2NudCAgICAgPSBCWVRFX0dFVCAoZWRlZi0+dmRfY250KTsKLQkJZW50LnZkX2hhc2ggICAgPSBCWVRFX0dFVCAoZWRlZi0+dmRfaGFzaCk7Ci0JCWVudC52ZF9hdXggICAgID0gQllURV9HRVQgKGVkZWYtPnZkX2F1eCk7Ci0JCWVudC52ZF9uZXh0ICAgID0gQllURV9HRVQgKGVkZWYtPnZkX25leHQpOwotCi0JCXByaW50ZiAoXygiICAlIzA2eDogUmV2OiAlZCAgRmxhZ3M6ICVzIiksCi0JCQlpZHgsIGVudC52ZF92ZXJzaW9uLCBnZXRfdmVyX2ZsYWdzIChlbnQudmRfZmxhZ3MpKTsKLQotCQlwcmludGYgKF8oIiAgSW5kZXg6ICVkICBDbnQ6ICVkICAiKSwKLQkJCWVudC52ZF9uZHgsIGVudC52ZF9jbnQpOwotCi0JCXZzdGFydCArPSBlbnQudmRfYXV4OwotCi0JCWVhdXggPSAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgdnN0YXJ0OwotCi0JCWF1eC52ZGFfbmFtZSA9IEJZVEVfR0VUIChlYXV4LT52ZGFfbmFtZSk7Ci0JCWF1eC52ZGFfbmV4dCA9IEJZVEVfR0VUIChlYXV4LT52ZGFfbmV4dCk7Ci0KLQkJaWYgKGR5bmFtaWNfc3RyaW5ncykKLQkJICBwcmludGYgKF8oIk5hbWU6ICVzXG4iKSwgZHluYW1pY19zdHJpbmdzICsgYXV4LnZkYV9uYW1lKTsKLQkJZWxzZQotCQkgIHByaW50ZiAoXygiTmFtZSBpbmRleDogJWxkXG4iKSwgYXV4LnZkYV9uYW1lKTsKLQotCQlpc3VtID0gaWR4ICsgZW50LnZkX2F1eDsKLQotCQlmb3IgKGogPSAxOyBqIDwgZW50LnZkX2NudDsgaiArKykKLQkJICB7Ci0JCSAgICBpc3VtICAgKz0gYXV4LnZkYV9uZXh0OwotCQkgICAgdnN0YXJ0ICs9IGF1eC52ZGFfbmV4dDsKLQotCQkgICAgZWF1eCA9IChFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKSB2c3RhcnQ7Ci0KLQkJICAgIGF1eC52ZGFfbmFtZSA9IEJZVEVfR0VUIChlYXV4LT52ZGFfbmFtZSk7Ci0JCSAgICBhdXgudmRhX25leHQgPSBCWVRFX0dFVCAoZWF1eC0+dmRhX25leHQpOwotCi0JCSAgICBpZiAoZHluYW1pY19zdHJpbmdzKQotCQkgICAgICBwcmludGYgKF8oIiAgJSMwNng6IFBhcmVudCAlZDogJXNcbiIpLAotCQkJICAgICAgaXN1bSwgaiwgZHluYW1pY19zdHJpbmdzICsgYXV4LnZkYV9uYW1lKTsKLQkJICAgIGVsc2UKLQkJICAgICAgcHJpbnRmIChfKCIgICUjMDZ4OiBQYXJlbnQgJWQsIG5hbWUgaW5kZXg6ICVsZFxuIiksCi0JCQkgICAgICBpc3VtLCBqLCBhdXgudmRhX25hbWUpOwotCQkgIH0KLQotCQlpZHggKz0gZW50LnZkX25leHQ7Ci0JICAgICAgfQotCi0JICAgIGZyZWUgKGVkZWZzKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfR05VX3Zlcm5lZWQ6Ci0JICB7Ci0JICAgIEVsZl9FeHRlcm5hbF9WZXJuZWVkICogIGVuZWVkOwotCSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBpZHg7Ci0JICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIGNudDsKLQotCSAgICBmb3VuZCA9IDE7Ci0KLQkgICAgcHJpbnRmIChfKCJcblZlcnNpb24gbmVlZHMgc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIiksCi0JCSAgICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pLCBzZWN0aW9uLT5zaF9pbmZvKTsKLQotCSAgICBwcmludGYgKF8oIiBBZGRyOiAweCIpKTsKLQkgICAgcHJpbnRmX3ZtYSAoc2VjdGlvbi0+c2hfYWRkcik7Ci0JICAgIHByaW50ZiAoXygiICBPZmZzZXQ6ICUjMDhseCAgTGluayB0byBzZWN0aW9uOiAlbGQgKCVzKVxuIiksCi0JCSAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9saW5rLAotCQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uX2hlYWRlcnMgKyBzZWN0aW9uLT5zaF9saW5rKSk7Ci0KLQkgICAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfc2l6ZSwKLQkJCSAgICBlbmVlZCwgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKiwKLQkJCSAgICAidmVyc2lvbiBuZWVkIHNlY3Rpb24iKTsKLQotCSAgICBmb3IgKGlkeCA9IGNudCA9IDA7IGNudCA8IHNlY3Rpb24tPnNoX2luZm87ICsrY250KQotCSAgICAgIHsKLQkJRWxmX0V4dGVybmFsX1Zlcm5lZWQgKiBlbnRyeTsKLQkJRWxmX0ludGVybmFsX1Zlcm5lZWQgICAgIGVudDsKLQkJaW50ICAgICAgICAgICAgICAgICAgICAgIGo7Ci0JCWludCAgICAgICAgICAgICAgICAgICAgICBpc3VtOwotCQljaGFyICogICAgICAgICAgICAgICAgICAgdnN0YXJ0OwotCi0JCXZzdGFydCA9ICgoY2hhciAqKSBlbmVlZCkgKyBpZHg7Ci0KLQkJZW50cnkgPSAoRWxmX0V4dGVybmFsX1Zlcm5lZWQgKikgdnN0YXJ0OwotCi0JCWVudC52bl92ZXJzaW9uID0gQllURV9HRVQgKGVudHJ5LT52bl92ZXJzaW9uKTsKLQkJZW50LnZuX2NudCAgICAgPSBCWVRFX0dFVCAoZW50cnktPnZuX2NudCk7Ci0JCWVudC52bl9maWxlICAgID0gQllURV9HRVQgKGVudHJ5LT52bl9maWxlKTsKLQkJZW50LnZuX2F1eCAgICAgPSBCWVRFX0dFVCAoZW50cnktPnZuX2F1eCk7Ci0JCWVudC52bl9uZXh0ICAgID0gQllURV9HRVQgKGVudHJ5LT52bl9uZXh0KTsKLQotCQlwcmludGYgKF8oIiAgJSMwNng6IFZlcnNpb246ICVkIiksIGlkeCwgZW50LnZuX3ZlcnNpb24pOwotCi0JCWlmIChkeW5hbWljX3N0cmluZ3MpCi0JCSAgcHJpbnRmIChfKCIgIEZpbGU6ICVzIiksIGR5bmFtaWNfc3RyaW5ncyArIGVudC52bl9maWxlKTsKLQkJZWxzZQotCQkgIHByaW50ZiAoXygiICBGaWxlOiAlbHgiKSwgZW50LnZuX2ZpbGUpOwotCi0JCXByaW50ZiAoXygiICBDbnQ6ICVkXG4iKSwgZW50LnZuX2NudCk7Ci0KLQkJdnN0YXJ0ICs9IGVudC52bl9hdXg7Ci0KLQkJZm9yIChqID0gMCwgaXN1bSA9IGlkeCArIGVudC52bl9hdXg7IGogPCBlbnQudm5fY250OyArK2opCi0JCSAgewotCQkgICAgRWxmX0V4dGVybmFsX1Zlcm5hdXggKiBlYXV4OwotCQkgICAgRWxmX0ludGVybmFsX1Zlcm5hdXggICBhdXg7Ci0KLQkJICAgIGVhdXggPSAoRWxmX0V4dGVybmFsX1Zlcm5hdXggKikgdnN0YXJ0OwotCi0JCSAgICBhdXgudm5hX2hhc2ggID0gQllURV9HRVQgKGVhdXgtPnZuYV9oYXNoKTsKLQkJICAgIGF1eC52bmFfZmxhZ3MgPSBCWVRFX0dFVCAoZWF1eC0+dm5hX2ZsYWdzKTsKLQkJICAgIGF1eC52bmFfb3RoZXIgPSBCWVRFX0dFVCAoZWF1eC0+dm5hX290aGVyKTsKLQkJICAgIGF1eC52bmFfbmFtZSAgPSBCWVRFX0dFVCAoZWF1eC0+dm5hX25hbWUpOwotCQkgICAgYXV4LnZuYV9uZXh0ICA9IEJZVEVfR0VUIChlYXV4LT52bmFfbmV4dCk7Ci0KLQkJICAgIGlmIChkeW5hbWljX3N0cmluZ3MpCi0JCSAgICAgIHByaW50ZiAoXygiICAlIzA2eDogTmFtZTogJXMiKSwKLQkJCSAgICAgIGlzdW0sIGR5bmFtaWNfc3RyaW5ncyArIGF1eC52bmFfbmFtZSk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHByaW50ZiAoXygiICAlIzA2eDogTmFtZSBpbmRleDogJWx4IiksCi0JCQkgICAgICBpc3VtLCBhdXgudm5hX25hbWUpOwotCi0JCSAgICBwcmludGYgKF8oIiAgRmxhZ3M6ICVzICBWZXJzaW9uOiAlZFxuIiksCi0JCQkgICAgZ2V0X3Zlcl9mbGFncyAoYXV4LnZuYV9mbGFncyksIGF1eC52bmFfb3RoZXIpOwotCi0JCSAgICBpc3VtICAgKz0gYXV4LnZuYV9uZXh0OwotCQkgICAgdnN0YXJ0ICs9IGF1eC52bmFfbmV4dDsKLQkJICB9Ci0KLQkJaWR4ICs9IGVudC52bl9uZXh0OwotCSAgICAgIH0KLQotCSAgICBmcmVlIChlbmVlZCk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX0dOVV92ZXJzeW06Ci0JICB7Ci0JICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiAgICAgICBsaW5rX3NlY3Rpb247Ci0JICAgIGludCAgICAgICAgICAgICAgCQl0b3RhbDsKLQkgICAgaW50ICAgICAgICAgICAgICAJCWNudDsKLQkgICAgdW5zaWduZWQgY2hhciAqIAkJZWRhdGE7Ci0JICAgIHVuc2lnbmVkIHNob3J0ICogCQlkYXRhOwotCSAgICBjaGFyICogICAgICAgICAgIAkJc3RydGFiOwotCSAgICBFbGZfSW50ZXJuYWxfU3ltICogCQlzeW1ib2xzOwotCSAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogICAgICAgc3RyaW5nX3NlYzsKLQotCSAgICBsaW5rX3NlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnMgKyBzZWN0aW9uLT5zaF9saW5rOwotCSAgICB0b3RhbCA9IHNlY3Rpb24tPnNoX3NpemUgLyBzZWN0aW9uLT5zaF9lbnRzaXplOwotCi0JICAgIGZvdW5kID0gMTsKLQotCSAgICBzeW1ib2xzID0gR0VUX0VMRl9TWU1CT0xTIChmaWxlLCBsaW5rX3NlY3Rpb24tPnNoX29mZnNldCwKLQkJCQkgICAgICAgbGlua19zZWN0aW9uLT5zaF9zaXplIC8gbGlua19zZWN0aW9uLT5zaF9lbnRzaXplKTsKLQotCSAgICBzdHJpbmdfc2VjID0gc2VjdGlvbl9oZWFkZXJzICsgbGlua19zZWN0aW9uLT5zaF9saW5rOwotCi0JICAgIEdFVF9EQVRBX0FMTE9DIChzdHJpbmdfc2VjLT5zaF9vZmZzZXQsIHN0cmluZ19zZWMtPnNoX3NpemUsCi0JCQkgICAgc3RydGFiLCBjaGFyICosICJ2ZXJzaW9uIHN0cmluZyB0YWJsZSIpOwotCi0JICAgIHByaW50ZiAoXygiXG5WZXJzaW9uIHN5bWJvbHMgc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iKSwKLQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbiksIHRvdGFsKTsKLQotCSAgICBwcmludGYgKF8oIiBBZGRyOiAiKSk7Ci0JICAgIHByaW50Zl92bWEgKHNlY3Rpb24tPnNoX2FkZHIpOwotCSAgICBwcmludGYgKF8oIiAgT2Zmc2V0OiAlIzA4bHggIExpbms6ICVseCAoJXMpXG4iKSwKLQkJICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX2xpbmssCi0JCSAgICBTRUNUSU9OX05BTUUgKGxpbmtfc2VjdGlvbikpOwotCi0JICAgIEdFVF9EQVRBX0FMTE9DICh2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUlNZTSldCi0JCQkgICAgLSBsb2FkYWRkciwKLQkJCSAgICB0b3RhbCAqIHNpemVvZiAoc2hvcnQpLCBlZGF0YSwKLQkJCSAgICB1bnNpZ25lZCBjaGFyICosICJ2ZXJzaW9uIHN5bWJvbCBkYXRhIik7Ci0KLQkgICAgZGF0YSA9ICh1bnNpZ25lZCBzaG9ydCAqKSBtYWxsb2MgKHRvdGFsICogc2l6ZW9mIChzaG9ydCkpOwotCi0JICAgIGZvciAoY250ID0gdG90YWw7IGNudCAtLTspCi0JICAgICAgZGF0YSBbY250XSA9IGJ5dGVfZ2V0IChlZGF0YSArIGNudCAqIHNpemVvZiAoc2hvcnQpLAotCQkJCSAgICAgc2l6ZW9mIChzaG9ydCkpOwotCi0JICAgIGZyZWUgKGVkYXRhKTsKLQotCSAgICBmb3IgKGNudCA9IDA7IGNudCA8IHRvdGFsOyBjbnQgKz0gNCkKLQkgICAgICB7Ci0JCWludCBqLCBubjsKLQotCQlwcmludGYgKCIgICUwM3g6IiwgY250KTsKLQotCQlmb3IgKGogPSAwOyAoaiA8IDQpICYmIChjbnQgKyBqKSA8IHRvdGFsOyArK2opCi0JCSAgc3dpdGNoIChkYXRhIFtjbnQgKyBqXSkKLQkJICAgIHsKLQkJICAgIGNhc2UgMDoKLQkJICAgICAgZnB1dHMgKF8oIiAgIDAgKCpsb2NhbCopICAgICIpLCBzdGRvdXQpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAxOgotCQkgICAgICBmcHV0cyAoXygiICAgMSAoKmdsb2JhbCopICAgIiksIHN0ZG91dCk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBubiA9IHByaW50ZiAoIiU0eCVjIiwgZGF0YSBbY250ICsgal0gJiAweDdmZmYsCi0JCQkJICAgZGF0YSBbY250ICsgal0gJiAweDgwMDAgPyAnaCcgOiAnICcpOwotCi0JCSAgICAgIGlmIChzeW1ib2xzIFtjbnQgKyBqXS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUKLQkJCSAgJiYgc2VjdGlvbl9oZWFkZXJzW3N5bWJvbHMgW2NudCArIGpdLnN0X3NobmR4XS5zaF90eXBlCi0JCQkgID09IFNIVF9OT0JJVFMpCi0JCQl7Ci0JCQkgIC8qIFdlIG11c3QgdGVzdCBib3RoLiAgKi8KLQkJCSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgICAgIGl2bjsKLQkJCSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIG9mZnNldDsKLQotCQkJICBvZmZzZXQgPSB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUk5FRUQpXQotCQkJICAgIC0gbG9hZGFkZHI7Ci0KLQkJCSAgZG8KLQkJCSAgICB7Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAgIGV2bjsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICAgZXZuYTsKLQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICAgICBpdm5hOwotCQkJICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIHZuYV9vZmY7Ci0KLQkJCSAgICAgIEdFVF9EQVRBIChvZmZzZXQsIGV2biwgInZlcnNpb24gbmVlZCIpOwotCi0JCQkgICAgICBpdm4udm5fYXV4ICA9IEJZVEVfR0VUIChldm4udm5fYXV4KTsKLQkJCSAgICAgIGl2bi52bl9uZXh0ID0gQllURV9HRVQgKGV2bi52bl9uZXh0KTsKLQotCQkJICAgICAgdm5hX29mZiA9IG9mZnNldCArIGl2bi52bl9hdXg7Ci0KLQkJCSAgICAgIGRvCi0JCQkJewotCQkJCSAgR0VUX0RBVEEgKHZuYV9vZmYsIGV2bmEsCi0JCQkJCSAgICAidmVyc2lvbiBuZWVkIGF1eCAoMSkiKTsKLQotCQkJCSAgaXZuYS52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmV4dCk7Ci0JCQkJICBpdm5hLnZuYV9vdGhlciA9IEJZVEVfR0VUIChldm5hLnZuYV9vdGhlcik7Ci0KLQkJCQkgIHZuYV9vZmYgKz0gaXZuYS52bmFfbmV4dDsKLQkJCQl9Ci0JCQkgICAgICB3aGlsZSAoaXZuYS52bmFfb3RoZXIgIT0gZGF0YSBbY250ICsgal0KLQkJCQkgICAgICYmIGl2bmEudm5hX25leHQgIT0gMCk7Ci0KLQkJCSAgICAgIGlmIChpdm5hLnZuYV9vdGhlciA9PSBkYXRhIFtjbnQgKyBqXSkKLQkJCQl7Ci0JCQkJICBpdm5hLnZuYV9uYW1lID0gQllURV9HRVQgKGV2bmEudm5hX25hbWUpOwotCi0JCQkJICBubiArPSBwcmludGYgKCIoJXMlLSpzIiwKLQkJCQkJCXN0cnRhYiArIGl2bmEudm5hX25hbWUsCi0JCQkJCQkxMiAtIHN0cmxlbiAoc3RydGFiCi0JCQkJCQkJICAgICArIGl2bmEudm5hX25hbWUpLAotCQkJCQkJIikiKTsKLQkJCQkgIGJyZWFrOwotCQkJCX0KLQkJCSAgICAgIGVsc2UgaWYgKGl2bi52bl9uZXh0ID09IDApCi0JCQkJewotCQkJCSAgaWYgKGRhdGEgW2NudCArIGpdICE9IDB4ODAwMSkKLQkJCQkgICAgewotCQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgIGl2ZDsKLQkJCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVyZGVmICBldmQ7Ci0KLQkJCQkgICAgICBvZmZzZXQgPSB2ZXJzaW9uX2luZm8KLQkJCQkJW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUkRFRildCi0JCQkJCS0gbG9hZGFkZHI7Ci0KLQkJCQkgICAgICBkbwotCQkJCQl7Ci0JCQkJCSAgR0VUX0RBVEEgKG9mZnNldCwgZXZkLAotCQkJCQkJICAgICJ2ZXJzaW9uIGRlZmluaXRpb24iKTsKLQotCQkJCQkgIGl2ZC52ZF9uZXh0ID0gQllURV9HRVQgKGV2ZC52ZF9uZXh0KTsKLQkJCQkJICBpdmQudmRfbmR4ICA9IEJZVEVfR0VUIChldmQudmRfbmR4KTsKLQotCQkJCQkgIG9mZnNldCArPSBpdmQudmRfbmV4dDsKLQkJCQkJfQotCQkJCSAgICAgIHdoaWxlIChpdmQudmRfbmR4Ci0JCQkJCSAgICAgIT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKQotCQkJCQkgICAgICYmIGl2ZC52ZF9uZXh0ICE9IDApOwotCi0JCQkJICAgICAgaWYgKGl2ZC52ZF9uZHgKLQkJCQkJICA9PSAoZGF0YSBbY250ICsgal0gJiAweDdmZmYpKQotCQkJCQl7Ci0JCQkJCSAgRWxmX0V4dGVybmFsX1ZlcmRhdXggIGV2ZGE7Ci0JCQkJCSAgRWxmX0ludGVybmFsX1ZlcmRhdXggIGl2ZGE7Ci0KLQkJCQkJICBpdmQudmRfYXV4ID0gQllURV9HRVQgKGV2ZC52ZF9hdXgpOwotCi0JCQkJCSAgR0VUX0RBVEEgKG9mZnNldCArIGl2ZC52ZF9hdXgsIGV2ZGEsCi0JCQkJCQkgICAgInZlcnNpb24gZGVmaW5pdGlvbiBhdXgiKTsKLQotCQkJCQkgIGl2ZGEudmRhX25hbWUgPQotCQkJCQkgICAgQllURV9HRVQgKGV2ZGEudmRhX25hbWUpOwotCi0JCQkJCSAgbm4gKz0KLQkJCQkJICAgIHByaW50ZiAoIiglcyUtKnMiLAotCQkJCQkJICAgIHN0cnRhYiArIGl2ZGEudmRhX25hbWUsCi0JCQkJCQkgICAgMTIKLQkJCQkJCSAgICAtIHN0cmxlbiAoc3RydGFiCi0JCQkJCQkJICAgICAgKyBpdmRhLnZkYV9uYW1lKSwKLQkJCQkJCSAgICAiKSIpOwotCQkJCQl9Ci0JCQkJICAgIH0KLQotCQkJCSAgYnJlYWs7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCW9mZnNldCArPSBpdm4udm5fbmV4dDsKLQkJCSAgICB9Ci0JCQkgIHdoaWxlIChpdm4udm5fbmV4dCk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHN5bWJvbHMgW2NudCArIGpdLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkJCXsKLQkJCSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgICAgIGl2bjsKLQkJCSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIG9mZnNldDsKLQotCQkJICBvZmZzZXQgPSB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUk5FRUQpXQotCQkJICAgIC0gbG9hZGFkZHI7Ci0KLQkJICAgICAgICAgIGRvCi0JCQkgICAgewotCQkJICAgICAgRWxmX0ludGVybmFsX1Zlcm5hdXggICAgIGl2bmE7Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAgIGV2bjsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICAgZXZuYTsKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBhX29mZjsKLQotCQkJICAgICAgR0VUX0RBVEEgKG9mZnNldCwgZXZuLCAidmVyc2lvbiBuZWVkIik7Ci0KLQkJCSAgICAgIGl2bi52bl9hdXggID0gQllURV9HRVQgKGV2bi52bl9hdXgpOwotCQkJICAgICAgaXZuLnZuX25leHQgPSBCWVRFX0dFVCAoZXZuLnZuX25leHQpOwotCi0JCQkgICAgICBhX29mZiA9IG9mZnNldCArIGl2bi52bl9hdXg7Ci0KLQkJCSAgICAgIGRvCi0JCQkJewotCQkJCSAgR0VUX0RBVEEgKGFfb2ZmLCBldm5hLAotCQkJCQkgICAgInZlcnNpb24gbmVlZCBhdXggKDIpIik7Ci0KLQkJCQkgIGl2bmEudm5hX25leHQgID0gQllURV9HRVQgKGV2bmEudm5hX25leHQpOwotCQkJCSAgaXZuYS52bmFfb3RoZXIgPSBCWVRFX0dFVCAoZXZuYS52bmFfb3RoZXIpOwotCi0JCQkJICBhX29mZiArPSBpdm5hLnZuYV9uZXh0OwotCQkJCX0KLQkJCSAgICAgIHdoaWxlIChpdm5hLnZuYV9vdGhlciAhPSBkYXRhIFtjbnQgKyBqXQotCQkJCSAgICAgJiYgaXZuYS52bmFfbmV4dCAhPSAwKTsKLQotCQkJICAgICAgaWYgKGl2bmEudm5hX290aGVyID09IGRhdGEgW2NudCArIGpdKQotCQkJCXsKLQkJCQkgIGl2bmEudm5hX25hbWUgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmFtZSk7Ci0KLQkJCQkgIG5uICs9IHByaW50ZiAoIiglcyUtKnMiLAotCQkJCQkJc3RydGFiICsgaXZuYS52bmFfbmFtZSwKLQkJCQkJCTEyIC0gc3RybGVuIChzdHJ0YWIKLQkJCQkJCQkgICAgICsgaXZuYS52bmFfbmFtZSksCi0JCQkJCQkiKSIpOwotCQkJCSAgYnJlYWs7Ci0JCQkJfQotCi0JCQkgICAgICBvZmZzZXQgKz0gaXZuLnZuX25leHQ7Ci0JCQkgICAgfQotCQkJICB3aGlsZSAoaXZuLnZuX25leHQpOwotCQkJfQotCQkgICAgICBlbHNlIGlmIChkYXRhIFtjbnQgKyBqXSAhPSAweDgwMDEpCi0JCQl7Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJkZWYgIGl2ZDsKLQkJCSAgRWxmX0V4dGVybmFsX1ZlcmRlZiAgZXZkOwotCQkJICB1bnNpZ25lZCBsb25nICAgICAgICBvZmZzZXQ7Ci0KLQkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvCi0JCQkgICAgW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUkRFRildIC0gbG9hZGFkZHI7Ci0KLQkJCSAgZG8KLQkJCSAgICB7Ci0JCQkgICAgICBHRVRfREFUQSAob2Zmc2V0LCBldmQsICJ2ZXJzaW9uIGRlZiIpOwotCi0JCQkgICAgICBpdmQudmRfbmV4dCA9IEJZVEVfR0VUIChldmQudmRfbmV4dCk7Ci0JCQkgICAgICBpdmQudmRfbmR4ICA9IEJZVEVfR0VUIChldmQudmRfbmR4KTsKLQotCQkJICAgICAgb2Zmc2V0ICs9IGl2ZC52ZF9uZXh0OwotCQkJICAgIH0KLQkJCSAgd2hpbGUgKGl2ZC52ZF9uZHggIT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKQotCQkJCSAmJiBpdmQudmRfbmV4dCAhPSAwKTsKLQotCQkJICBpZiAoaXZkLnZkX25keCA9PSAoZGF0YSBbY250ICsgal0gJiAweDdmZmYpKQotCQkJICAgIHsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICBldmRhOwotCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggIGl2ZGE7Ci0KLQkJCSAgICAgIGl2ZC52ZF9hdXggPSBCWVRFX0dFVCAoZXZkLnZkX2F1eCk7Ci0KLQkJCSAgICAgIEdFVF9EQVRBIChvZmZzZXQgLSBpdmQudmRfbmV4dCArIGl2ZC52ZF9hdXgsCi0JCQkJCWV2ZGEsICJ2ZXJzaW9uIGRlZiBhdXgiKTsKLQotCQkJICAgICAgaXZkYS52ZGFfbmFtZSA9IEJZVEVfR0VUIChldmRhLnZkYV9uYW1lKTsKLQotCQkJICAgICAgbm4gKz0gcHJpbnRmICgiKCVzJS0qcyIsCi0JCQkJCSAgICBzdHJ0YWIgKyBpdmRhLnZkYV9uYW1lLAotCQkJCQkgICAgMTIgLSBzdHJsZW4gKHN0cnRhYgotCQkJCQkJCSArIGl2ZGEudmRhX25hbWUpLAotCQkJCQkgICAgIikiKTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgaWYgKG5uIDwgMTgpCi0JCQlwcmludGYgKCIlKmMiLCAxOCAtIG5uLCAnICcpOwotCQkgICAgfQotCi0JCXB1dGNoYXIgKCdcbicpOwotCSAgICAgIH0KLQotCSAgICBmcmVlIChkYXRhKTsKLQkgICAgZnJlZSAoc3RydGFiKTsKLQkgICAgZnJlZSAoc3ltYm9scyk7Ci0JICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmICghIGZvdW5kKQotICAgIHByaW50ZiAoXygiXG5ObyB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoaXMgZmlsZS5cbiIpKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X3N5bWJvbF9iaW5kaW5nIChiaW5kaW5nKQotICAgICB1bnNpZ25lZCBpbnQgYmluZGluZzsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAoYmluZGluZykKLSAgICB7Ci0gICAgY2FzZSBTVEJfTE9DQUw6ICByZXR1cm4gIkxPQ0FMIjsKLSAgICBjYXNlIFNUQl9HTE9CQUw6IHJldHVybiAiR0xPQkFMIjsKLSAgICBjYXNlIFNUQl9XRUFLOiAgIHJldHVybiAiV0VBSyI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChiaW5kaW5nID49IFNUQl9MT1BST0MgJiYgYmluZGluZyA8PSBTVEJfSElQUk9DKQotCXNwcmludGYgKGJ1ZmYsIF8oIjxwcm9jZXNzb3Igc3BlY2lmaWM+OiAlZCIpLCBiaW5kaW5nKTsKLSAgICAgIGVsc2UgaWYgKGJpbmRpbmcgPj0gU1RCX0xPT1MgJiYgYmluZGluZyA8PSBTVEJfSElPUykKLQlzcHJpbnRmIChidWZmLCBfKCI8T1Mgc3BlY2lmaWM+OiAlZCIpLCBiaW5kaW5nKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICVkIiksIGJpbmRpbmcpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfc3ltYm9sX3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGludCB0eXBlOwotewotICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIFNUVF9OT1RZUEU6ICAgcmV0dXJuICJOT1RZUEUiOwotICAgIGNhc2UgU1RUX09CSkVDVDogICByZXR1cm4gIk9CSkVDVCI7Ci0gICAgY2FzZSBTVFRfRlVOQzogICAgIHJldHVybiAiRlVOQyI7Ci0gICAgY2FzZSBTVFRfU0VDVElPTjogIHJldHVybiAiU0VDVElPTiI7Ci0gICAgY2FzZSBTVFRfRklMRTogICAgIHJldHVybiAiRklMRSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh0eXBlID49IFNUVF9MT1BST0MgJiYgdHlwZSA8PSBTVFRfSElQUk9DKQotCXsKLQkgIGlmIChlbGZfaGVhZGVyLmVfbWFjaGluZSA9PSBFTV9BUk0gJiYgdHlwZSA9PSBTVFRfQVJNX1RGVU5DKQotCSAgICByZXR1cm4gIlRIVU1CX0ZVTkMiOwotCi0JICBpZiAoZWxmX2hlYWRlci5lX21hY2hpbmUgPT0gRU1fU1BBUkNWOSAmJiB0eXBlID09IFNUVF9SRUdJU1RFUikKLQkgICAgcmV0dXJuICJSRUdJU1RFUiI7Ci0KLQkgIGlmIChlbGZfaGVhZGVyLmVfbWFjaGluZSA9PSBFTV9QQVJJU0MgJiYgdHlwZSA9PSBTVFRfUEFSSVNDX01JTExJKQotCSAgICByZXR1cm4gIlBBUklTQ19NSUxMSSI7Ci0KLQkgIHNwcmludGYgKGJ1ZmYsIF8oIjxwcm9jZXNzb3Igc3BlY2lmaWM+OiAlZCIpLCB0eXBlKTsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlID49IFNUVF9MT09TICYmIHR5cGUgPD0gU1RUX0hJT1MpCi0JewotCSAgaWYgKGVsZl9oZWFkZXIuZV9tYWNoaW5lID09IEVNX1BBUklTQykKLQkgICAgewotCSAgICAgIGlmICh0eXBlID09IFNUVF9IUF9PUEFRVUUpCi0JCXJldHVybiAiSFBfT1BBUVVFIjsKLQkgICAgICBpZiAodHlwZSA9PSBTVFRfSFBfU1RVQikKLQkJcmV0dXJuICJIUF9TVFVCIjsKLQkgICAgfQotCi0JICBzcHJpbnRmIChidWZmLCBfKCI8T1Mgc3BlY2lmaWM+OiAlZCIpLCB0eXBlKTsKLQl9Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAlZCIpLCB0eXBlKTsKLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X3N5bWJvbF9pbmRleF90eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIFNITl9VTkRFRjogIHJldHVybiAiVU5EIjsKLSAgICBjYXNlIFNITl9BQlM6ICAgIHJldHVybiAiQUJTIjsKLSAgICBjYXNlIFNITl9DT01NT046IHJldHVybiAiQ09NIjsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHR5cGUgPj0gU0hOX0xPUFJPQyAmJiB0eXBlIDw9IFNITl9ISVBST0MpCi0JcmV0dXJuICJQUkMiOwotICAgICAgZWxzZSBpZiAodHlwZSA+PSBTSE5fTE9SRVNFUlZFICYmIHR5cGUgPD0gU0hOX0hJUkVTRVJWRSkKLQlyZXR1cm4gIlJTViI7Ci0gICAgICBlbHNlIGlmICh0eXBlID49IFNITl9MT09TICYmIHR5cGUgPD0gU0hOX0hJT1MpCi0JcmV0dXJuICJPUyAiOwotICAgICAgZWxzZQotCXsKLQkgIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotCSAgc3ByaW50ZiAoYnVmZiwgIiUzZCIsIHR5cGUpOwotCSAgcmV0dXJuIGJ1ZmY7Ci0JfQotICAgIH0KLX0KLQotCi1zdGF0aWMgaW50ICoKLWdldF9keW5hbWljX2RhdGEgKGZpbGUsIG51bWJlcikKLSAgICAgRklMRSAqICAgICAgIGZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBudW1iZXI7Ci17Ci0gIGNoYXIgKiBlX2RhdGE7Ci0gIGludCAqICBpX2RhdGE7Ci0KLSAgZV9kYXRhID0gKGNoYXIgKikgbWFsbG9jIChudW1iZXIgKiA0KTsKLQotICBpZiAoZV9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlYWQgKGVfZGF0YSwgNCwgbnVtYmVyLCBmaWxlKSAhPSBudW1iZXIpCi0gICAgewotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byByZWFkIGluIGR5bmFtaWMgZGF0YVxuIikpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlfZGF0YSA9IChpbnQgKikgbWFsbG9jIChudW1iZXIgKiBzaXplb2YgKCogaV9kYXRhKSk7Ci0KLSAgaWYgKGlfZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICBmcmVlIChlX2RhdGEpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHdoaWxlIChudW1iZXItLSkKLSAgICBpX2RhdGEgW251bWJlcl0gPSBieXRlX2dldCAoZV9kYXRhICsgbnVtYmVyICogNCwgNCk7Ci0KLSAgZnJlZSAoZV9kYXRhKTsKLQotICByZXR1cm4gaV9kYXRhOwotfQotCi0vKiBEdW1wIHRoZSBzeW1ib2wgdGFibGUgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3Nfc3ltYm9sX3RhYmxlIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmMzJfSW50ZXJuYWxfU2hkciAqICAgc2VjdGlvbjsKLSAgY2hhciAgIG5iIFs0XTsKLSAgY2hhciAgIG5jIFs0XTsKLSAgaW50ICAgIG5idWNrZXRzID0gMDsKLSAgaW50ICAgIG5jaGFpbnMgPSAwOwotICBpbnQgKiAgYnVja2V0cyA9IE5VTEw7Ci0gIGludCAqICBjaGFpbnMgPSBOVUxMOwotCi0gIGlmICghIGRvX3N5bXMgJiYgIWRvX2hpc3RvZ3JhbSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZHluYW1pY19pbmZvW0RUX0hBU0hdICYmICgoZG9fdXNpbmdfZHluYW1pYyAmJiBkeW5hbWljX3N0cmluZ3MgIT0gTlVMTCkKLQkJCQl8fCBkb19oaXN0b2dyYW0pKQotICAgIHsKLSAgICAgIGlmIChmc2VlayAoZmlsZSwgZHluYW1pY19pbmZvW0RUX0hBU0hdIC0gbG9hZGFkZHIsIFNFRUtfU0VUKSkKLQl7Ci0JICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gc3RhcnQgb2YgZHluYW1pYyBpbmZvcm1hdGlvbiIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgaWYgKGZyZWFkIChuYiwgc2l6ZW9mIChuYiksIDEsIGZpbGUpICE9IDEpCi0JewotCSAgZXJyb3IgKF8oIkZhaWxlZCB0byByZWFkIGluIG51bWJlciBvZiBidWNrZXRzXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGlmIChmcmVhZCAobmMsIHNpemVvZiAobmMpLCAxLCBmaWxlKSAhPSAxKQotCXsKLQkgIGVycm9yIChfKCJGYWlsZWQgdG8gcmVhZCBpbiBudW1iZXIgb2YgY2hhaW5zXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIG5idWNrZXRzID0gYnl0ZV9nZXQgKG5iLCA0KTsKLSAgICAgIG5jaGFpbnMgID0gYnl0ZV9nZXQgKG5jLCA0KTsKLQotICAgICAgYnVja2V0cyA9IGdldF9keW5hbWljX2RhdGEgKGZpbGUsIG5idWNrZXRzKTsKLSAgICAgIGNoYWlucyAgPSBnZXRfZHluYW1pY19kYXRhIChmaWxlLCBuY2hhaW5zKTsKLQotICAgICAgaWYgKGJ1Y2tldHMgPT0gTlVMTCB8fCBjaGFpbnMgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGRvX3N5bXMKLSAgICAgICYmIGR5bmFtaWNfaW5mb1tEVF9IQVNIXSAmJiBkb191c2luZ19keW5hbWljICYmIGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCAgICBobjsKLSAgICAgIGludCAgICBzaTsKLQotICAgICAgcHJpbnRmIChfKCJcblN5bWJvbCB0YWJsZSBmb3IgaW1hZ2U6XG4iKSk7Ci0gICAgICBpZiAoaXNfMzJiaXRfZWxmKQotCXByaW50ZiAoXygiICBOdW0gQnVjOiAgICBWYWx1ZSAgU2l6ZSAgIFR5cGUgICBCaW5kIE90IE5keCBOYW1lXG4iKSk7Ci0gICAgICBlbHNlCi0JcHJpbnRmIChfKCIgIE51bSBCdWM6ICAgIFZhbHVlICAgICAgICAgIFNpemUgICBUeXBlICAgQmluZCBPdCBOZHggTmFtZVxuIikpOwotCi0gICAgICBmb3IgKGhuID0gMDsgaG4gPCBuYnVja2V0czsgaG4rKykKLQl7Ci0JICBpZiAoISBidWNrZXRzIFtobl0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBmb3IgKHNpID0gYnVja2V0cyBbaG5dOyBzaSA8IG5jaGFpbnMgJiYgc2kgPiAwOyBzaSA9IGNoYWlucyBbc2ldKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1N5bSAqIHBzeW07Ci0KLQkgICAgICBwc3ltID0gZHluYW1pY19zeW1ib2xzICsgc2k7Ci0KLQkgICAgICBwcmludGYgKCIgICUzZCAlM2Q6ICIsIHNpLCBobik7Ci0JICAgICAgcHJpbnRfdm1hIChwc3ltLT5zdF92YWx1ZSwgTE9OR19IRVgpOwotCSAgICAgIHB1dGNoYXIgKCcgJyApOwotCSAgICAgIHByaW50X3ZtYSAocHN5bS0+c3Rfc2l6ZSwgIERFQ181KTsKLQkJICAgICAgCi0JICAgICAgcHJpbnRmICgiICAlNnMgJTZzICUyZCAiLAotCQkgICAgICBnZXRfc3ltYm9sX3R5cGUgKEVMRl9TVF9UWVBFIChwc3ltLT5zdF9pbmZvKSksCi0JCSAgICAgIGdldF9zeW1ib2xfYmluZGluZyAoRUxGX1NUX0JJTkQgKHBzeW0tPnN0X2luZm8pKSwKLQkJICAgICAgcHN5bS0+c3Rfb3RoZXIpOwotCi0JICAgICAgcHJpbnRmICgiJTMuM3MiLCBnZXRfc3ltYm9sX2luZGV4X3R5cGUgKHBzeW0tPnN0X3NobmR4KSk7Ci0KLQkgICAgICBwcmludGYgKCIgJXNcbiIsIGR5bmFtaWNfc3RyaW5ncyArIHBzeW0tPnN0X25hbWUpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZG9fc3ltcyAmJiAhZG9fdXNpbmdfZHluYW1pYykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgICAgIGk7Ci0KLSAgICAgIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0JICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLQkgICBpKyssIHNlY3Rpb24rKykKLQl7Ci0JICB1bnNpZ25lZCBpbnQgICAgICAgICAgc2k7Ci0JICBjaGFyICogICAgICAgICAgICAgICAgc3RydGFiOwotCSAgRWxmX0ludGVybmFsX1N5bSAqICAgIHN5bXRhYjsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICBwc3ltOwotCi0KLQkgIGlmICggICBzZWN0aW9uLT5zaF90eXBlICE9IFNIVF9TWU1UQUIKLQkgICAgICAmJiBzZWN0aW9uLT5zaF90eXBlICE9IFNIVF9EWU5TWU0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBwcmludGYgKF8oIlxuU3ltYm9sIHRhYmxlICclcycgY29udGFpbnMgJWx1IGVudHJpZXM6XG4iKSwKLQkJICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pLAotCQkgICh1bnNpZ25lZCBsb25nKSAoc2VjdGlvbi0+c2hfc2l6ZSAvIHNlY3Rpb24tPnNoX2VudHNpemUpKTsKLQkgIGlmIChpc18zMmJpdF9lbGYpCi0JICAgIHByaW50ZiAoXygiICAgTnVtOiAgICBWYWx1ZSAgU2l6ZSBUeXBlICAgIEJpbmQgICBPdCAgTmR4IE5hbWVcbiIpKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmIChfKCIgICBOdW06ICAgIFZhbHVlICAgICAgICAgIFNpemUgVHlwZSAgICBCaW5kICAgT3QgIE5keCBOYW1lXG4iKSk7Ci0KLQkgIHN5bXRhYiA9IEdFVF9FTEZfU1lNQk9MUyAoZmlsZSwgc2VjdGlvbi0+c2hfb2Zmc2V0LAotCQkJCSAgICBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZSk7Ci0JICBpZiAoc3ltdGFiID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoc2VjdGlvbi0+c2hfbGluayA9PSBlbGZfaGVhZGVyLmVfc2hzdHJuZHgpCi0JICAgIHN0cnRhYiA9IHN0cmluZ190YWJsZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzdHJpbmdfc2VjOwotCi0JICAgICAgc3RyaW5nX3NlYyA9IHNlY3Rpb25faGVhZGVycyArIHNlY3Rpb24tPnNoX2xpbms7Ci0KLQkgICAgICBHRVRfREFUQV9BTExPQyAoc3RyaW5nX3NlYy0+c2hfb2Zmc2V0LCBzdHJpbmdfc2VjLT5zaF9zaXplLAotCQkJICAgICAgc3RydGFiLCBjaGFyICosICJzdHJpbmcgdGFibGUiKTsKLQkgICAgfQotCi0JICBmb3IgKHNpID0gMCwgcHN5bSA9IHN5bXRhYjsKLQkgICAgICAgc2kgPCBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZTsKLQkgICAgICAgc2kgKyssIHBzeW0gKyspCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlNmQ6ICIsIHNpKTsKLQkgICAgICBwcmludF92bWEgKHBzeW0tPnN0X3ZhbHVlLCBMT05HX0hFWCk7Ci0JICAgICAgcHV0Y2hhciAoJyAnKTsKLQkgICAgICBwcmludF92bWEgKHBzeW0tPnN0X3NpemUsIERFQ181KTsKLQkgICAgICBwcmludGYgKCIgJS03cyAlLTZzICUyZCAiLAotCQkgICAgICBnZXRfc3ltYm9sX3R5cGUgKEVMRl9TVF9UWVBFIChwc3ltLT5zdF9pbmZvKSksCi0JCSAgICAgIGdldF9zeW1ib2xfYmluZGluZyAoRUxGX1NUX0JJTkQgKHBzeW0tPnN0X2luZm8pKSwKLQkJICAgICAgcHN5bS0+c3Rfb3RoZXIpOwotCi0JICAgICAgcHJpbnRmICgiJTRzIiwgZ2V0X3N5bWJvbF9pbmRleF90eXBlIChwc3ltLT5zdF9zaG5keCkpOwotCi0JICAgICAgcHJpbnRmICgiICVzIiwgc3RydGFiICsgcHN5bS0+c3RfbmFtZSk7Ci0KLQkgICAgICBpZiAoc2VjdGlvbi0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNICYmCi0JCSAgdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJTWU0pXSAhPSAwKQotCQl7Ci0JCSAgdW5zaWduZWQgY2hhciAgIGRhdGFbMl07Ci0JCSAgdW5zaWduZWQgc2hvcnQgIHZlcnNfZGF0YTsKLQkJICB1bnNpZ25lZCBsb25nICAgb2Zmc2V0OwotCQkgIGludCAgICAgICAgICAgICBpc19ub2JpdHM7Ci0JCSAgaW50ICAgICAgICAgICAgIGNoZWNrX2RlZjsKLQotCQkgIG9mZnNldCA9IHZlcnNpb25faW5mbyBbRFRfVkVSU0lPTlRBR0lEWCAoRFRfVkVSU1lNKV0KLQkJICAgIC0gbG9hZGFkZHI7Ci0KLQkJICBHRVRfREFUQSAob2Zmc2V0ICsgc2kgKiBzaXplb2YgKHZlcnNfZGF0YSksIGRhdGEsCi0JCQkgICAgInZlcnNpb24gZGF0YSIpOwotCi0JCSAgdmVyc19kYXRhID0gYnl0ZV9nZXQgKGRhdGEsIDIpOwotCi0JCSAgaXNfbm9iaXRzID0gcHN5bS0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFID8KLQkJICAgIChzZWN0aW9uX2hlYWRlcnMgW3BzeW0tPnN0X3NobmR4XS5zaF90eXBlID09IFNIVF9OT0JJVFMpCi0JCSAgICA6IDA7Ci0KLQkJICBjaGVja19kZWYgPSAocHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGKTsKLQotCQkgIGlmICgodmVyc19kYXRhICYgMHg4MDAwKSB8fCB2ZXJzX2RhdGEgPiAxKQotCQkgICAgewotCQkgICAgICBpZiAoaXNfbm9iaXRzIHx8ICEgY2hlY2tfZGVmKQotCQkJewotCQkJICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAgZXZuOwotCQkJICBFbGZfSW50ZXJuYWxfVmVybmVlZCAgaXZuOwotCQkJICBFbGZfSW50ZXJuYWxfVmVybmF1eCAgaXZuYTsKLQotCQkJICAvKiBXZSBtdXN0IHRlc3QgYm90aC4gICovCi0JCQkgIG9mZnNldCA9IHZlcnNpb25faW5mbwotCQkJICAgIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJORUVEKV0gLSBsb2FkYWRkcjsKLQotCQkJICBHRVRfREFUQSAob2Zmc2V0LCBldm4sICJ2ZXJzaW9uIG5lZWQiKTsKLQotCQkJICBpdm4udm5fYXV4ICA9IEJZVEVfR0VUIChldm4udm5fYXV4KTsKLQkJCSAgaXZuLnZuX25leHQgPSBCWVRFX0dFVCAoZXZuLnZuX25leHQpOwotCi0JCQkgIGRvCi0JCQkgICAgewotCQkJICAgICAgdW5zaWduZWQgbG9uZyAgdm5hX29mZjsKLQotCQkJICAgICAgdm5hX29mZiA9IG9mZnNldCArIGl2bi52bl9hdXg7Ci0KLQkJCSAgICAgIGRvCi0JCQkJewotCQkJCSAgRWxmX0V4dGVybmFsX1Zlcm5hdXggIGV2bmE7Ci0KLQkJCQkgIEdFVF9EQVRBICh2bmFfb2ZmLCBldm5hLAotCQkJCQkgICAgInZlcnNpb24gbmVlZCBhdXggKDMpIik7Ci0KLQkJCQkgIGl2bmEudm5hX290aGVyID0gQllURV9HRVQgKGV2bmEudm5hX290aGVyKTsKLQkJCQkgIGl2bmEudm5hX25leHQgID0gQllURV9HRVQgKGV2bmEudm5hX25leHQpOwotCQkJCSAgaXZuYS52bmFfbmFtZSAgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmFtZSk7Ci0KLQkJCQkgIHZuYV9vZmYgKz0gaXZuYS52bmFfbmV4dDsKLQkJCQl9Ci0JCQkgICAgICB3aGlsZSAoaXZuYS52bmFfb3RoZXIgIT0gdmVyc19kYXRhCi0JCQkJICAgICAmJiBpdm5hLnZuYV9uZXh0ICE9IDApOwotCi0JCQkgICAgICBpZiAoaXZuYS52bmFfb3RoZXIgPT0gdmVyc19kYXRhKQotCQkJCWJyZWFrOwotCi0JCQkgICAgICBvZmZzZXQgKz0gaXZuLnZuX25leHQ7Ci0JCQkgICAgfQotCQkJICB3aGlsZSAoaXZuLnZuX25leHQgIT0gMCk7Ci0KLQkJCSAgaWYgKGl2bmEudm5hX290aGVyID09IHZlcnNfZGF0YSkKLQkJCSAgICB7Ci0JCQkgICAgICBwcmludGYgKCJAJXMgKCVkKSIsCi0JCQkJICAgICAgc3RydGFiICsgaXZuYS52bmFfbmFtZSwgaXZuYS52bmFfb3RoZXIpOwotCQkJICAgICAgY2hlY2tfZGVmID0gMDsKLQkJCSAgICB9Ci0JCQkgIGVsc2UgaWYgKCEgaXNfbm9iaXRzKQotCQkJICAgIGVycm9yIChfKCJiYWQgZHluYW1pYyBzeW1ib2wiKSk7Ci0JCQkgIGVsc2UKLQkJCSAgICBjaGVja19kZWYgPSAxOwotCQkJfQotCi0JCSAgICAgIGlmIChjaGVja19kZWYpCi0JCQl7Ci0JCQkgIGlmICh2ZXJzX2RhdGEgIT0gMHg4MDAxKQotCQkJICAgIHsKLQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgICAgIGl2ZDsKLQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICAgIGl2ZGE7Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVyZGF1eCAgZXZkYTsKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIG9mZnNldDsKLQotCQkJICAgICAgb2Zmc2V0ID0KLQkJCQl2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUkRFRildCi0JCQkJLSBsb2FkYWRkcjsKLQotCQkJICAgICAgZG8KLQkJCQl7Ci0JCQkJICBFbGZfRXh0ZXJuYWxfVmVyZGVmICAgZXZkOwotCi0JCQkJICBHRVRfREFUQSAob2Zmc2V0LCBldmQsICJ2ZXJzaW9uIGRlZiIpOwotCi0JCQkJICBpdmQudmRfbmR4ICA9IEJZVEVfR0VUIChldmQudmRfbmR4KTsKLQkJCQkgIGl2ZC52ZF9hdXggID0gQllURV9HRVQgKGV2ZC52ZF9hdXgpOwotCQkJCSAgaXZkLnZkX25leHQgPSBCWVRFX0dFVCAoZXZkLnZkX25leHQpOwotCi0JCQkJICBvZmZzZXQgKz0gaXZkLnZkX25leHQ7Ci0JCQkJfQotCQkJICAgICAgd2hpbGUgKGl2ZC52ZF9uZHggIT0gKHZlcnNfZGF0YSAmIDB4N2ZmZikKLQkJCQkgICAgICYmIGl2ZC52ZF9uZXh0ICE9IDApOwotCi0JCQkgICAgICBvZmZzZXQgLT0gaXZkLnZkX25leHQ7Ci0JCQkgICAgICBvZmZzZXQgKz0gaXZkLnZkX2F1eDsKLQotCQkJICAgICAgR0VUX0RBVEEgKG9mZnNldCwgZXZkYSwgInZlcnNpb24gZGVmIGF1eCIpOwotCi0JCQkgICAgICBpdmRhLnZkYV9uYW1lID0gQllURV9HRVQgKGV2ZGEudmRhX25hbWUpOwotCi0JCQkgICAgICBpZiAocHN5bS0+c3RfbmFtZSAhPSBpdmRhLnZkYV9uYW1lKQotCQkJCXByaW50ZiAoKHZlcnNfZGF0YSAmIDB4ODAwMCkKLQkJCQkJPyAiQCVzIiA6ICJAQCVzIiwKLQkJCQkJc3RydGFiICsgaXZkYS52ZGFfbmFtZSk7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBwdXRjaGFyICgnXG4nKTsKLQkgICAgfQotCi0JICBmcmVlIChzeW10YWIpOwotCSAgaWYgKHN0cnRhYiAhPSBzdHJpbmdfdGFibGUpCi0JICAgIGZyZWUgKHN0cnRhYik7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZG9fc3ltcykKLSAgICBwcmludGYKLSAgICAgIChfKCJcbkR5bmFtaWMgc3ltYm9sIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIGRpc3BsYXlpbmcgc3ltYm9scy5cbiIpKTsKLQotICBpZiAoZG9faGlzdG9ncmFtICYmIGJ1Y2tldHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgKmxlbmd0aHM7Ci0gICAgICBpbnQgKmNvdW50czsKLSAgICAgIGludCBobjsKLSAgICAgIGludCBzaTsKLSAgICAgIGludCBtYXhsZW5ndGggPSAwOwotICAgICAgaW50IG56ZXJvX2NvdW50cyA9IDA7Ci0gICAgICBpbnQgbnN5bXMgPSAwOwotCi0gICAgICBwcmludGYgKF8oIlxuSGlzdG9ncmFtIGZvciBidWNrZXQgbGlzdCBsZW5ndGggKHRvdGFsIG9mICVkIGJ1Y2tldHMpOlxuIiksCi0JICAgICAgbmJ1Y2tldHMpOwotICAgICAgcHJpbnRmIChfKCIgTGVuZ3RoICBOdW1iZXIgICAgICUlIG9mIHRvdGFsICBDb3ZlcmFnZVxuIikpOwotCi0gICAgICBsZW5ndGhzID0gKGludCAqKSBjYWxsb2MgKG5idWNrZXRzLCBzaXplb2YgKGludCkpOwotICAgICAgaWYgKGxlbmd0aHMgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeSIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGZvciAoaG4gPSAwOyBobiA8IG5idWNrZXRzOyArK2huKQotCXsKLQkgIGlmICghIGJ1Y2tldHMgW2huXSkKLQkgICAgY29udGludWU7Ci0KLQkgIGZvciAoc2kgPSBidWNrZXRzW2huXTsgc2kgPiAwICYmIHNpIDwgbmNoYWluczsgc2kgPSBjaGFpbnNbc2ldKQotCSAgICB7Ci0JICAgICAgKysgbnN5bXM7Ci0JICAgICAgaWYgKG1heGxlbmd0aCA8ICsrbGVuZ3Roc1tobl0pCi0JCSsrIG1heGxlbmd0aDsKLQkgICAgfQotCX0KLQotICAgICAgY291bnRzID0gKGludCAqKSBjYWxsb2MgKG1heGxlbmd0aCArIDEsIHNpemVvZiAoaW50KSk7Ci0gICAgICBpZiAoY291bnRzID09IE5VTEwpCi0JewotCSAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnkiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGZvciAoaG4gPSAwOyBobiA8IG5idWNrZXRzOyArK2huKQotCSsrIGNvdW50cyBbbGVuZ3RocyBbaG5dXTsKLQotICAgICAgaWYgKG5idWNrZXRzID4gMCkKLQl7Ci0JICBwcmludGYgKCIgICAgICAwICAlLTEwZCAoJTUuMWYlJSlcbiIsCi0JCSAgY291bnRzWzBdLCAoY291bnRzWzBdICogMTAwLjApIC8gbmJ1Y2tldHMpOwotCSAgZm9yIChzaSA9IDE7IHNpIDw9IG1heGxlbmd0aDsgKytzaSkKLQkgICAgewotCSAgICAgIG56ZXJvX2NvdW50cyArPSBjb3VudHNbc2ldICogc2k7Ci0JICAgICAgcHJpbnRmICgiJTdkICAlLTEwZCAoJTUuMWYlJSkgICAgJTUuMWYlJVxuIiwKLQkJICAgICAgc2ksIGNvdW50c1tzaV0sIChjb3VudHNbc2ldICogMTAwLjApIC8gbmJ1Y2tldHMsCi0JCSAgICAgIChuemVyb19jb3VudHMgKiAxMDAuMCkgLyBuc3ltcyk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZyZWUgKGNvdW50cyk7Ci0gICAgICBmcmVlIChsZW5ndGhzKTsKLSAgICB9Ci0KLSAgaWYgKGJ1Y2tldHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChidWNrZXRzKTsKLSAgICAgIGZyZWUgKGNoYWlucyk7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3N5bWluZm8gKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGlmIChkeW5hbWljX3N5bWluZm8gPT0gTlVMTAotICAgICAgfHwgIWRvX2R5bmFtaWMpCi0gICAgLyogTm8gc3ltaW5mbywgdGhpcyBpcyBvay4gICovCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogVGhlcmUgYmV0dGVyIHNob3VsZCBiZSBhIGR5bmFtaWMgc3ltYm9sIHNlY3Rpb24uICAqLwotICBpZiAoZHluYW1pY19zeW1ib2xzID09IE5VTEwgfHwgZHluYW1pY19zdHJpbmdzID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGR5bmFtaWNfYWRkcikKLSAgICBwcmludGYgKF8oIlxuRHluYW1pYyBpbmZvIHNlZ21lbnQgYXQgb2Zmc2V0IDB4JWx4IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iKSwKLQkgICAgZHluYW1pY19zeW1pbmZvX29mZnNldCwgZHluYW1pY19zeW1pbmZvX25lbnQpOwotCi0gIHByaW50ZiAoXygiIE51bTogTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kVG8gICAgIEZsYWdzXG4iKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBkeW5hbWljX3N5bWluZm9fbmVudDsgKytpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGludCBmbGFncyA9IGR5bmFtaWNfc3ltaW5mb1tpXS5zaV9mbGFnczsKLQotICAgICAgcHJpbnRmICgiJTRkOiAlLTMwcyAiLCBpLAotCSAgICAgIGR5bmFtaWNfc3RyaW5ncyArIGR5bmFtaWNfc3ltYm9sc1tpXS5zdF9uYW1lKTsKLQotICAgICAgc3dpdGNoIChkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0bykKLQl7Ci0JY2FzZSBTWU1JTkZPX0JUX1NFTEY6Ci0JICBmcHV0cyAoIlNFTEYgICAgICAgIiwgc3Rkb3V0KTsKLQkgIGJyZWFrOwotCWNhc2UgU1lNSU5GT19CVF9QQVJFTlQ6Ci0JICBmcHV0cyAoIlBBUkVOVCAgICAgIiwgc3Rkb3V0KTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBpZiAoZHluYW1pY19zeW1pbmZvW2ldLnNpX2JvdW5kdG8gPiAwCi0JICAgICAgJiYgZHluYW1pY19zeW1pbmZvW2ldLnNpX2JvdW5kdG8gPCBkeW5hbWljX3NpemUpCi0JICAgIHByaW50ZiAoIiUtMTBzICIsCi0JCSAgICBkeW5hbWljX3N0cmluZ3MKLQkJICAgICsgZHluYW1pY19zZWdtZW50W2R5bmFtaWNfc3ltaW5mb1tpXS5zaV9ib3VuZHRvXS5kX3VuLmRfdmFsKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiJS0xMGQgIiwgZHluYW1pY19zeW1pbmZvW2ldLnNpX2JvdW5kdG8pOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoZmxhZ3MgJiBTWU1JTkZPX0ZMR19ESVJFQ1QpCi0JcHJpbnRmICgiIERJUkVDVCIpOwotICAgICAgaWYgKGZsYWdzICYgU1lNSU5GT19GTEdfUEFTU1RIUlUpCi0JcHJpbnRmICgiIFBBU1NUSFJVIik7Ci0gICAgICBpZiAoZmxhZ3MgJiBTWU1JTkZPX0ZMR19DT1BZKQotCXByaW50ZiAoIiBDT1BZIik7Ci0gICAgICBpZiAoZmxhZ3MgJiBTWU1JTkZPX0ZMR19MQVpZTE9BRCkKLQlwcmludGYgKCIgTEFaWUxPQUQiKTsKLQotICAgICAgcHV0cyAoIiIpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZV9zZWN0aW9uIChzZWN0aW9uLCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIHByaW50ZiAoXygiXG5Bc3NlbWJseSBkdW1wIG9mIHNlY3Rpb24gJXNcbiIpLAotCSAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgLyogWFhYIC0tIHRvIGJlIGRvbmUgLS0tIFhYWCAqLwotCi0gIHJldHVybiAxOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWR1bXBfc2VjdGlvbiAoc2VjdGlvbiwgZmlsZSkKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gICAgIEZJTEUgKiBmaWxlOwotewotICBiZmRfc2l6ZV90eXBlICAgYnl0ZXM7Ci0gIGJmZF92bWEgICAgICAgICBhZGRyOwotICB1bnNpZ25lZCBjaGFyICogZGF0YTsKLSAgdW5zaWduZWQgY2hhciAqIHN0YXJ0OwotCi0gIGJ5dGVzID0gc2VjdGlvbi0+c2hfc2l6ZTsKLQotICBpZiAoYnl0ZXMgPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlxuU2VjdGlvbiAnJXMnIGhhcyBubyBkYXRhIHRvIGR1bXAuXG4iKSwKLQkgICAgICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZWxzZQotICAgIHByaW50ZiAoXygiXG5IZXggZHVtcCBvZiBzZWN0aW9uICclcyc6XG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgYWRkciA9IHNlY3Rpb24tPnNoX2FkZHI7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgYnl0ZXMsIHN0YXJ0LCB1bnNpZ25lZCBjaGFyICosCi0JCSAgInNlY3Rpb24gZGF0YSIpOwotCi0gIGRhdGEgPSBzdGFydDsKLQotICB3aGlsZSAoYnl0ZXMpCi0gICAgewotICAgICAgaW50IGo7Ci0gICAgICBpbnQgazsKLSAgICAgIGludCBsYnl0ZXM7Ci0KLSAgICAgIGxieXRlcyA9IChieXRlcyA+IDE2ID8gMTYgOiBieXRlcyk7Ci0KLSAgICAgIHByaW50ZiAoIiAgMHglOC44bHggIiwgKHVuc2lnbmVkIGxvbmcpIGFkZHIpOwotCi0gICAgICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfREFUQV0pCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBFTEZEQVRBMkxTQjoKLQkgIGZvciAoaiA9IDE1OyBqID49IDA7IGogLS0pCi0JICAgIHsKLQkgICAgICBpZiAoaiA8IGxieXRlcykKLQkJcHJpbnRmICgiJTIuMngiLCBkYXRhIFtqXSk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCIgICIpOwotCi0JICAgICAgaWYgKCEoaiAmIDB4MykpCi0JCXByaW50ZiAoIiAiKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEVMRkRBVEEyTVNCOgotCSAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0JICAgIHsKLQkgICAgICBpZiAoaiA8IGxieXRlcykKLQkJcHJpbnRmICgiJTIuMngiLCBkYXRhIFtqXSk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCIgICIpOwotCi0JICAgICAgaWYgKChqICYgMykgPT0gMykKLQkJcHJpbnRmICgiICIpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBsYnl0ZXM7IGorKykKLQl7Ci0JICBrID0gZGF0YSBbal07Ci0JICBpZiAoayA+PSAnICcgJiYgayA8IDB4ODApCi0JICAgIHByaW50ZiAoIiVjIiwgayk7Ci0JICBlbHNlCi0JICAgIHByaW50ZiAoIi4iKTsKLQl9Ci0KLSAgICAgIHB1dGNoYXIgKCdcbicpOwotCi0gICAgICBkYXRhICArPSBsYnl0ZXM7Ci0gICAgICBhZGRyICArPSBsYnl0ZXM7Ci0gICAgICBieXRlcyAtPSBsYnl0ZXM7Ci0gICAgfQotCi0gIGZyZWUgKHN0YXJ0KTsKLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQKLXJlYWRfbGViMTI4IChkYXRhLCBsZW5ndGhfcmV0dXJuLCBzaWduKQotICAgICB1bnNpZ25lZCBjaGFyICogZGF0YTsKLSAgICAgaW50ICogICAgICAgICAgIGxlbmd0aF9yZXR1cm47Ci0gICAgIGludCAgICAgICAgICAgICBzaWduOwotewotICB1bnNpZ25lZCBsb25nIGludCByZXN1bHQgPSAwOwotICB1bnNpZ25lZCBpbnQgICAgICBudW1fcmVhZCA9IDA7Ci0gIGludCAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsKLSAgdW5zaWduZWQgY2hhciAgICAgYnl0ZTsKLQotICBkbwotICAgIHsKLSAgICAgIGJ5dGUgPSAqIGRhdGEgKys7Ci0gICAgICBudW1fcmVhZCArKzsKLQotICAgICAgcmVzdWx0IHw9IChieXRlICYgMHg3ZikgPDwgc2hpZnQ7Ci0KLSAgICAgIHNoaWZ0ICs9IDc7Ci0KLSAgICB9Ci0gIHdoaWxlIChieXRlICYgMHg4MCk7Ci0KLSAgaWYgKGxlbmd0aF9yZXR1cm4gIT0gTlVMTCkKLSAgICAqIGxlbmd0aF9yZXR1cm4gPSBudW1fcmVhZDsKLQotICBpZiAoc2lnbiAmJiAoc2hpZnQgPCAzMikgJiYgKGJ5dGUgJiAweDQwKSkKLSAgICByZXN1bHQgfD0gLTEgPDwgc2hpZnQ7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgU3RhdGVfTWFjaGluZV9SZWdpc3RlcnMKLXsKLSAgdW5zaWduZWQgbG9uZwlhZGRyZXNzOwotICB1bnNpZ25lZCBpbnQgIGZpbGU7Ci0gIHVuc2lnbmVkIGludCAgbGluZTsKLSAgdW5zaWduZWQgaW50ICBjb2x1bW47Ci0gIGludCAgICAgICAgICAgaXNfc3RtdDsKLSAgaW50ICAgICAgICAgICBiYXNpY19ibG9jazsKLSAgaW50CSAgICAgICAgZW5kX3NlcXVlbmNlOwotLyogVGhpcyB2YXJpYWJsZSBob2xkIHRoZSBudW1iZXIgb2YgdGhlIGxhc3QgZW50cnkgc2VlbgotICAgaW4gdGhlIEZpbGUgVGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgIGxhc3RfZmlsZV9lbnRyeTsKLX0gU01SOwotCi1zdGF0aWMgU01SIHN0YXRlX21hY2hpbmVfcmVnczsKLQotc3RhdGljIHZvaWQKLXJlc2V0X3N0YXRlX21hY2hpbmUgKGlzX3N0bXQpCi0gICAgIGludCBpc19zdG10OwotewotICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyA9IDA7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5maWxlID0gMTsKLSAgc3RhdGVfbWFjaGluZV9yZWdzLmxpbmUgPSAxOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MuY29sdW1uID0gMDsKLSAgc3RhdGVfbWFjaGluZV9yZWdzLmlzX3N0bXQgPSBpc19zdG10OwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYmFzaWNfYmxvY2sgPSAwOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MuZW5kX3NlcXVlbmNlID0gMDsKLSAgc3RhdGVfbWFjaGluZV9yZWdzLmxhc3RfZmlsZV9lbnRyeSA9IDA7Ci19Ci0KLS8qIEhhbmRsZWQgYW4gZXh0ZW5kIGxpbmUgb3AuICBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyB0aGUgZW5kCi0gICBvZiBzZXF1ZW5jZS4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3AgKGRhdGEsIGlzX3N0bXQsIHBvaW50ZXJfc2l6ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7Ci0gICAgIGludCBpc19zdG10OwotICAgICBpbnQgcG9pbnRlcl9zaXplOwotewotICB1bnNpZ25lZCBjaGFyICAgb3BfY29kZTsKLSAgaW50ICAgICAgICAgICAgIGJ5dGVzX3JlYWQ7Ci0gIHVuc2lnbmVkIGludCAgICBsZW47Ci0gIHVuc2lnbmVkIGNoYXIgKiBuYW1lOwotICB1bnNpZ25lZCBsb25nICAgYWRyOwotCi0gIGxlbiA9IHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApOwotICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgaWYgKGxlbiA9PSAwKQotICAgIHsKLSAgICAgIHdhcm4gKF8oImJhZGx5IGZvcm1lZCBleHRlbmRlZCBsaW5lIG9wIGVuY291bnRlcmVkISIpKTsKLSAgICAgIHJldHVybiBieXRlc19yZWFkOwotICAgIH0KLQotICBsZW4gKz0gYnl0ZXNfcmVhZDsKLSAgb3BfY29kZSA9ICogZGF0YSArKzsKLQotICBwcmludGYgKF8oIiAgRXh0ZW5kZWQgb3Bjb2RlICVkOiAiKSwgb3BfY29kZSk7Ci0KLSAgc3dpdGNoIChvcF9jb2RlKQotICAgIHsKLSAgICBjYXNlIERXX0xORV9lbmRfc2VxdWVuY2U6Ci0gICAgICBwcmludGYgKF8oIkVuZCBvZiBTZXF1ZW5jZVxuXG4iKSk7Ci0gICAgICByZXNldF9zdGF0ZV9tYWNoaW5lIChpc19zdG10KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19MTkVfc2V0X2FkZHJlc3M6Ci0gICAgICBhZHIgPSBieXRlX2dldCAoZGF0YSwgcG9pbnRlcl9zaXplKTsKLSAgICAgIHByaW50ZiAoXygic2V0IEFkZHJlc3MgdG8gMHglbHhcbiIpLCBhZHIpOwotICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgPSBhZHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfTE5FX2RlZmluZV9maWxlOgotICAgICAgcHJpbnRmIChfKCIgIGRlZmluZSBuZXcgRmlsZSBUYWJsZSBlbnRyeVxuIikpOwotICAgICAgcHJpbnRmIChfKCIgIEVudHJ5XHREaXJcdFRpbWVcdFNpemVcdE5hbWVcbiIpKTsKLQotICAgICAgcHJpbnRmIChfKCIgICAlZFx0IiksICsrIHN0YXRlX21hY2hpbmVfcmVncy5sYXN0X2ZpbGVfZW50cnkpOwotICAgICAgbmFtZSA9IGRhdGE7Ci0gICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7Ci0gICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKLSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOwotICAgICAgcHJpbnRmIChfKCIlc1xuXG4iKSwgbmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGYgKF8oIlVOS05PV046IGxlbmd0aCAlZFxuIiksIGxlbiAtIGJ5dGVzX3JlYWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBsZW47Ci19Ci0KLS8qIFNpemUgb2YgcG9pbnRlcnMgaW4gdGhlIC5kZWJ1Z19saW5lIHNlY3Rpb24uICBUaGlzIGluZm9ybWF0aW9uIGlzIG5vdAotICAgcmVhbGx5IHByZXNlbnQgaW4gdGhhdCBzZWN0aW9uLiAgSXQncyBvYnRhaW5lZCBiZWZvcmUgZHVtcGluZyB0aGUgZGVidWcKLSAgIHNlY3Rpb25zIGJ5IGRvaW5nIHNvbWUgcHJlLXNjYW4gb2YgdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24uICAqLwotc3RhdGljIGludCBkZWJ1Z19saW5lX3BvaW50ZXJfc2l6ZSA9IDQ7Ci0KLXN0YXRpYyBpbnQKLWRpc3BsYXlfZGVidWdfbGluZXMgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBEV0FSRjJfRXh0ZXJuYWxfTGluZUluZm8gKiBleHRlcm5hbDsKLSAgRFdBUkYyX0ludGVybmFsX0xpbmVJbmZvICAgaW5mbzsKLSAgdW5zaWduZWQgY2hhciAqICAgICAgICAgICAgc3RhbmRhcmRfb3Bjb2RlczsKLSAgdW5zaWduZWQgY2hhciAqICAgICAgICAgICAgZGF0YSA9IHN0YXJ0OwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBlbmQgID0gc3RhcnQgKyBzZWN0aW9uLT5zaF9zaXplOwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBlbmRfb2Zfc2VxdWVuY2U7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0KLSAgcHJpbnRmIChfKCJcbkR1bXAgb2YgZGVidWcgY29udGVudHMgb2Ygc2VjdGlvbiAlczpcblxuIiksCi0JICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICB3aGlsZSAoZGF0YSA8IGVuZCkKLSAgICB7Ci0gICAgICBleHRlcm5hbCA9IChEV0FSRjJfRXh0ZXJuYWxfTGluZUluZm8gKikgZGF0YTsKLQotICAgICAgLyogQ2hlY2sgdGhlIGxlbmd0aCBvZiB0aGUgYmxvY2suICAqLwotICAgICAgaW5mby5saV9sZW5ndGggPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX2xlbmd0aCk7Ci0gICAgICBpZiAoaW5mby5saV9sZW5ndGggPiBzZWN0aW9uLT5zaF9zaXplKQotCXsKLQkgIHdhcm4KLQkgICAgKF8oIlRoZSBsaW5lIGluZm8gYXBwZWFycyB0byBiZSBjb3JydXB0IC0gdGhlIHNlY3Rpb24gaXMgdG9vIHNtYWxsXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIENoZWNrIGl0cyB2ZXJzaW9uIG51bWJlci4gICovCi0gICAgICBpbmZvLmxpX3ZlcnNpb24gPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX3ZlcnNpb24pOwotICAgICAgaWYgKGluZm8ubGlfdmVyc2lvbiAhPSAyKQotCXsKLQkgIHdhcm4gKF8oIk9ubHkgRFdBUkYgdmVyc2lvbiAyIGxpbmUgaW5mbyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpbmZvLmxpX3Byb2xvZ3VlX2xlbmd0aCA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfcHJvbG9ndWVfbGVuZ3RoKTsKLSAgICAgIGluZm8ubGlfbWluX2luc25fbGVuZ3RoID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9taW5faW5zbl9sZW5ndGgpOwotICAgICAgaW5mby5saV9kZWZhdWx0X2lzX3N0bXQgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0gICAgICBpbmZvLmxpX2xpbmVfYmFzZSAgICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfbGluZV9iYXNlKTsKLSAgICAgIGluZm8ubGlfbGluZV9yYW5nZSAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9saW5lX3JhbmdlKTsKLSAgICAgIGluZm8ubGlfb3Bjb2RlX2Jhc2UgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9vcGNvZGVfYmFzZSk7Ci0KLSAgICAgIC8qIFNpZ24gZXh0ZW5kIHRoZSBsaW5lIGJhc2UgZmllbGQuICAqLwotICAgICAgaW5mby5saV9saW5lX2Jhc2UgPDw9IDI0OwotICAgICAgaW5mby5saV9saW5lX2Jhc2UgPj49IDI0OwotCi0gICAgICBwcmludGYgKF8oIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICAlbGRcbiIpLCBpbmZvLmxpX2xlbmd0aCk7Ci0gICAgICBwcmludGYgKF8oIiAgRFdBUkYgVmVyc2lvbjogICAgICAgICAgICAgICAlZFxuIiksIGluZm8ubGlfdmVyc2lvbik7Ci0gICAgICBwcmludGYgKF8oIiAgUHJvbGd1ZSBMZW5ndGg6ICAgICAgICAgICAgICAlZFxuIiksIGluZm8ubGlfcHJvbG9ndWVfbGVuZ3RoKTsKLSAgICAgIHByaW50ZiAoXygiICBNaW5pbXVtIEluc3RydWN0aW9uIExlbmd0aDogICVkXG4iKSwgaW5mby5saV9taW5faW5zbl9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgIEluaXRpYWwgdmFsdWUgb2YgJ2lzX3N0bXQnOiAgJWRcbiIpLCBpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0gICAgICBwcmludGYgKF8oIiAgTGluZSBCYXNlOiAgICAgICAgICAgICAgICAgICAlZFxuIiksIGluZm8ubGlfbGluZV9iYXNlKTsKLSAgICAgIHByaW50ZiAoXygiICBMaW5lIFJhbmdlOiAgICAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9saW5lX3JhbmdlKTsKLSAgICAgIHByaW50ZiAoXygiICBPcGNvZGUgQmFzZTogICAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9vcGNvZGVfYmFzZSk7Ci0KLSAgICAgIGVuZF9vZl9zZXF1ZW5jZSA9IGRhdGEgKyBpbmZvLmxpX2xlbmd0aCArIHNpemVvZiAoaW5mby5saV9sZW5ndGgpOwotCi0gICAgICByZXNldF9zdGF0ZV9tYWNoaW5lIChpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0KLSAgICAgIC8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBPcGNvZGVzIHRhYmxlLiAgKi8KLSAgICAgIHN0YW5kYXJkX29wY29kZXMgPSBkYXRhICsgc2l6ZW9mICgqIGV4dGVybmFsKTsKLQotICAgICAgcHJpbnRmIChfKCJcbiBPcGNvZGVzOlxuIikpOwotCi0gICAgICBmb3IgKGkgPSAxOyBpIDwgaW5mby5saV9vcGNvZGVfYmFzZTsgaSsrKQotCXByaW50ZiAoXygiICBPcGNvZGUgJWQgaGFzICVkIGFyZ3NcbiIpLCBpLCBzdGFuZGFyZF9vcGNvZGVzW2kgLSAxXSk7Ci0KLSAgICAgIC8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBEaXJlY3RvcnkgdGFibGUuICAqLwotICAgICAgZGF0YSA9IHN0YW5kYXJkX29wY29kZXMgKyBpbmZvLmxpX29wY29kZV9iYXNlIC0gMTsKLQotICAgICAgaWYgKCogZGF0YSA9PSAwKQotCXByaW50ZiAoXygiXG4gVGhlIERpcmVjdG9yeSBUYWJsZSBpcyBlbXB0eS5cbiIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKF8oIlxuIFRoZSBEaXJlY3RvcnkgVGFibGU6XG4iKSk7Ci0KLQkgIHdoaWxlICgqIGRhdGEgIT0gMCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoXygiICAlc1xuIiksIGRhdGEpOwotCi0JICAgICAgZGF0YSArPSBzdHJsZW4gKGRhdGEpICsgMTsKLQkgICAgfQotCX0KLQotICAgICAgLyogU2tpcCB0aGUgTlVMIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlLiAgKi8KLSAgICAgIGRhdGEgKys7Ci0KLSAgICAgIC8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBGaWxlIE5hbWUgdGFibGUuICAqLwotICAgICAgaWYgKCogZGF0YSA9PSAwKQotCXByaW50ZiAoXygiXG4gVGhlIEZpbGUgTmFtZSBUYWJsZSBpcyBlbXB0eS5cbiIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKF8oIlxuIFRoZSBGaWxlIE5hbWUgVGFibGU6XG4iKSk7Ci0JICBwcmludGYgKF8oIiAgRW50cnlcdERpclx0VGltZVx0U2l6ZVx0TmFtZVxuIikpOwotCi0JICB3aGlsZSAoKiBkYXRhICE9IDApCi0JICAgIHsKLQkgICAgICBjaGFyICogbmFtZTsKLQkgICAgICBpbnQgYnl0ZXNfcmVhZDsKLQotCSAgICAgIHByaW50ZiAoXygiICAlZFx0IiksICsrIHN0YXRlX21hY2hpbmVfcmVncy5sYXN0X2ZpbGVfZW50cnkpOwotCSAgICAgIG5hbWUgPSBkYXRhOwotCi0JICAgICAgZGF0YSArPSBzdHJsZW4gKGRhdGEpICsgMTsKLQotCSAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKLQkgICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0JICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHByaW50ZiAoXygiJXNcbiIpLCBuYW1lKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogU2tpcCB0aGUgTlVMIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlLiAgKi8KLSAgICAgIGRhdGEgKys7Ci0KLSAgICAgIC8qIE5vdyBkaXNwbGF5IHRoZSBzdGF0ZW1lbnRzLiAgKi8KLSAgICAgIHByaW50ZiAoXygiXG4gTGluZSBOdW1iZXIgU3RhdGVtZW50czpcbiIpKTsKLQotCi0gICAgICB3aGlsZSAoZGF0YSA8IGVuZF9vZl9zZXF1ZW5jZSkKLQl7Ci0JICB1bnNpZ25lZCBjaGFyIG9wX2NvZGU7Ci0JICBpbnQgICAgICAgICAgIGFkdjsKLQkgIGludCAgICAgICAgICAgYnl0ZXNfcmVhZDsKLQotCSAgb3BfY29kZSA9ICogZGF0YSArKzsKLQotCSAgc3dpdGNoIChvcF9jb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgRFdfTE5TX2V4dGVuZGVkX29wOgotCSAgICAgIGRhdGEgKz0gcHJvY2Vzc19leHRlbmRlZF9saW5lX29wIChkYXRhLCBpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2xpbmVfcG9pbnRlcl9zaXplKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0xOU19jb3B5OgotCSAgICAgIHByaW50ZiAoXygiICBDb3B5XG4iKSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9wYzoKLQkgICAgICBhZHYgPSBpbmZvLmxpX21pbl9pbnNuX2xlbmd0aCAqIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyArPSBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgIEFkdmFuY2UgUEMgYnkgJWQgdG8gJWx4XG4iKSwgYWR2LAotCQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9saW5lOgotCSAgICAgIGFkdiA9IHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDEpOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSArPSBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgIEFkdmFuY2UgTGluZSBieSAlZCB0byAlZFxuIiksIGFkdiwKLQkJICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmxpbmUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5TX3NldF9maWxlOgotCSAgICAgIGFkdiA9IHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBwcmludGYgKF8oIiAgU2V0IEZpbGUgTmFtZSB0byBlbnRyeSAlZCBpbiB0aGUgRmlsZSBOYW1lIFRhYmxlXG4iKSwKLQkJICAgICAgYWR2KTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuZmlsZSA9IGFkdjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0xOU19zZXRfY29sdW1uOgotCSAgICAgIGFkdiA9IHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBwcmludGYgKF8oIiAgU2V0IGNvbHVtbiB0byAlZFxuIiksIGFkdik7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmNvbHVtbiA9IGFkdjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0xOU19uZWdhdGVfc3RtdDoKLQkgICAgICBhZHYgPSBzdGF0ZV9tYWNoaW5lX3JlZ3MuaXNfc3RtdDsKLQkgICAgICBhZHYgPSAhIGFkdjsKLQkgICAgICBwcmludGYgKF8oIiAgU2V0IGlzX3N0bXQgdG8gJWRcbiIpLCBhZHYpOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5pc19zdG10ID0gYWR2OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFdfTE5TX3NldF9iYXNpY19ibG9jazoKLQkgICAgICBwcmludGYgKF8oIiAgU2V0IGJhc2ljIGJsb2NrXG4iKSk7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmJhc2ljX2Jsb2NrID0gMTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERXX0xOU19jb25zdF9hZGRfcGM6Ci0JICAgICAgYWR2ID0gKCgoMjU1IC0gaW5mby5saV9vcGNvZGVfYmFzZSkgLyBpbmZvLmxpX2xpbmVfcmFuZ2UpCi0JCSAgICAgKiBpbmZvLmxpX21pbl9pbnNuX2xlbmd0aCk7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBBZHZhbmNlIFBDIGJ5IGNvbnN0YW50ICVkIHRvIDB4JWx4XG4iKSwgYWR2LAotCQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEV19MTlNfZml4ZWRfYWR2YW5jZV9wYzoKLQkgICAgICBhZHYgPSBieXRlX2dldCAoZGF0YSwgMik7Ci0JICAgICAgZGF0YSArPSAyOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzICs9IGFkdjsKLQkgICAgICBwcmludGYgKF8oIiAgQWR2YW5jZSBQQyBieSBmaXhlZCBzaXplIGFtb3VudCAlZCB0byAweCVseFxuIiksCi0JCSAgICAgIGFkdiwgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgb3BfY29kZSAtPSBpbmZvLmxpX29wY29kZV9iYXNlOwotCSAgICAgIGFkdiAgICAgID0gKG9wX2NvZGUgLyBpbmZvLmxpX2xpbmVfcmFuZ2UpICogaW5mby5saV9taW5faW5zbl9sZW5ndGg7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBTcGVjaWFsIG9wY29kZSAlZDogYWR2YW5jZSBBZGRyZXNzIGJ5ICVkIHRvIDB4JWx4IiksCi0JCSAgICAgIG9wX2NvZGUsIGFkdiwgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MpOwotCSAgICAgIGFkdiA9IChvcF9jb2RlICUgaW5mby5saV9saW5lX3JhbmdlKSArIGluZm8ubGlfbGluZV9iYXNlOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5saW5lICs9IGFkdjsKLQkgICAgICBwcmludGYgKF8oIiBhbmQgTGluZSBieSAlZCB0byAlZFxuIiksCi0JCSAgICAgIGFkdiwgc3RhdGVfbWFjaGluZV9yZWdzLmxpbmUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWRpc3BsYXlfZGVidWdfcHVibmFtZXMgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBEV0FSRjJfRXh0ZXJuYWxfUHViTmFtZXMgKiBleHRlcm5hbDsKLSAgRFdBUkYyX0ludGVybmFsX1B1Yk5hbWVzICAgcHVibmFtZXM7Ci0gIHVuc2lnbmVkIGNoYXIgKiAgICAgICAgICAgIGVuZDsKLQotICBlbmQgPSBzdGFydCArIHNlY3Rpb24tPnNoX3NpemU7Ci0KLSAgcHJpbnRmIChfKCJDb250ZW50cyBvZiB0aGUgJXMgc2VjdGlvbjpcblxuIiksIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0gIHdoaWxlIChzdGFydCA8IGVuZCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICogZGF0YTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQ7Ci0KLSAgICAgIGV4dGVybmFsID0gKERXQVJGMl9FeHRlcm5hbF9QdWJOYW1lcyAqKSBzdGFydDsKLQotICAgICAgcHVibmFtZXMucG5fbGVuZ3RoICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cG5fbGVuZ3RoKTsKLSAgICAgIHB1Ym5hbWVzLnBuX3ZlcnNpb24gPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBuX3ZlcnNpb24pOwotICAgICAgcHVibmFtZXMucG5fb2Zmc2V0ICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cG5fb2Zmc2V0KTsKLSAgICAgIHB1Ym5hbWVzLnBuX3NpemUgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBuX3NpemUpOwotCi0gICAgICBkYXRhICAgPSBzdGFydCArIHNpemVvZiAoKiBleHRlcm5hbCk7Ci0gICAgICBzdGFydCArPSBwdWJuYW1lcy5wbl9sZW5ndGggKyBzaXplb2YgKGV4dGVybmFsLT5wbl9sZW5ndGgpOwotCi0gICAgICBpZiAocHVibmFtZXMucG5fdmVyc2lvbiAhPSAyKQotCXsKLQkgIHdhcm4gKF8oIk9ubHkgRFdBUkYgMiBwdWJuYW1lcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgcHJpbnRmIChfKCIgIExlbmd0aDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlbGRcbiIpLAotCSAgICAgIHB1Ym5hbWVzLnBuX2xlbmd0aCk7Ci0gICAgICBwcmludGYgKF8oIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVkXG4iKSwKLQkgICAgICBwdWJuYW1lcy5wbl92ZXJzaW9uKTsKLSAgICAgIHByaW50ZiAoXygiICBPZmZzZXQgaW50byAuZGVidWdfaW5mbyBzZWN0aW9uOiAgICAgJWxkXG4iKSwKLQkgICAgICBwdWJuYW1lcy5wbl9vZmZzZXQpOwotICAgICAgcHJpbnRmIChfKCIgIFNpemUgb2YgYXJlYSBpbiAuZGVidWdfaW5mbyBzZWN0aW9uOiAlbGRcbiIpLAotCSAgICAgIHB1Ym5hbWVzLnBuX3NpemUpOwotCi0gICAgICBwcmludGYgKF8oIlxuICAgIE9mZnNldFx0TmFtZVxuIikpOwotCi0gICAgICBkbwotCXsKLQkgIG9mZnNldCA9IGJ5dGVfZ2V0IChkYXRhLCA0KTsKLQotCSAgaWYgKG9mZnNldCAhPSAwKQotCSAgICB7Ci0JICAgICAgZGF0YSArPSA0OwotCSAgICAgIHByaW50ZiAoIiAgICAlbGRcdFx0JXNcbiIsIG9mZnNldCwgZGF0YSk7Ci0JICAgICAgZGF0YSArPSBzdHJsZW4gKGRhdGEpICsgMTsKLQkgICAgfQotCX0KLSAgICAgIHdoaWxlIChvZmZzZXQgIT0gMCk7Ci0gICAgfQotCi0gIHByaW50ZiAoIlxuIik7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfVEFHX25hbWUgKHRhZykKLSAgICAgdW5zaWduZWQgbG9uZyB0YWc7Ci17Ci0gIHN3aXRjaCAodGFnKQotICAgIHsKLSAgICBjYXNlIERXX1RBR19wYWRkaW5nOiByZXR1cm4gIkRXX1RBR19wYWRkaW5nIjsKLSAgICBjYXNlIERXX1RBR19hcnJheV90eXBlOiByZXR1cm4gIkRXX1RBR19hcnJheV90eXBlIjsKLSAgICBjYXNlIERXX1RBR19jbGFzc190eXBlOiByZXR1cm4gIkRXX1RBR19jbGFzc190eXBlIjsKLSAgICBjYXNlIERXX1RBR19lbnRyeV9wb2ludDogcmV0dXJuICJEV19UQUdfZW50cnlfcG9pbnQiOwotICAgIGNhc2UgRFdfVEFHX2VudW1lcmF0aW9uX3R5cGU6IHJldHVybiAiRFdfVEFHX2VudW1lcmF0aW9uX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXI6IHJldHVybiAiRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIiOwotICAgIGNhc2UgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uOiByZXR1cm4gIkRXX1RBR19pbXBvcnRlZF9kZWNsYXJhdGlvbiI7Ci0gICAgY2FzZSBEV19UQUdfbGFiZWw6IHJldHVybiAiRFdfVEFHX2xhYmVsIjsKLSAgICBjYXNlIERXX1RBR19sZXhpY2FsX2Jsb2NrOiByZXR1cm4gIkRXX1RBR19sZXhpY2FsX2Jsb2NrIjsKLSAgICBjYXNlIERXX1RBR19tZW1iZXI6IHJldHVybiAiRFdfVEFHX21lbWJlciI7Ci0gICAgY2FzZSBEV19UQUdfcG9pbnRlcl90eXBlOiByZXR1cm4gIkRXX1RBR19wb2ludGVyX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3JlZmVyZW5jZV90eXBlOiByZXR1cm4gIkRXX1RBR19yZWZlcmVuY2VfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfY29tcGlsZV91bml0OiByZXR1cm4gIkRXX1RBR19jb21waWxlX3VuaXQiOwotICAgIGNhc2UgRFdfVEFHX3N0cmluZ190eXBlOiByZXR1cm4gIkRXX1RBR19zdHJpbmdfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfc3RydWN0dXJlX3R5cGU6IHJldHVybiAiRFdfVEFHX3N0cnVjdHVyZV90eXBlIjsKLSAgICBjYXNlIERXX1RBR19zdWJyb3V0aW5lX3R5cGU6IHJldHVybiAiRFdfVEFHX3N1YnJvdXRpbmVfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfdHlwZWRlZjogcmV0dXJuICJEV19UQUdfdHlwZWRlZiI7Ci0gICAgY2FzZSBEV19UQUdfdW5pb25fdHlwZTogcmV0dXJuICJEV19UQUdfdW5pb25fdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVyczogcmV0dXJuICJEV19UQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVycyI7Ci0gICAgY2FzZSBEV19UQUdfdmFyaWFudDogcmV0dXJuICJEV19UQUdfdmFyaWFudCI7Ci0gICAgY2FzZSBEV19UQUdfY29tbW9uX2Jsb2NrOiByZXR1cm4gIkRXX1RBR19jb21tb25fYmxvY2siOwotICAgIGNhc2UgRFdfVEFHX2NvbW1vbl9pbmNsdXNpb246IHJldHVybiAiRFdfVEFHX2NvbW1vbl9pbmNsdXNpb24iOwotICAgIGNhc2UgRFdfVEFHX2luaGVyaXRhbmNlOiByZXR1cm4gIkRXX1RBR19pbmhlcml0YW5jZSI7Ci0gICAgY2FzZSBEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lOiByZXR1cm4gIkRXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmUiOwotICAgIGNhc2UgRFdfVEFHX21vZHVsZTogcmV0dXJuICJEV19UQUdfbW9kdWxlIjsKLSAgICBjYXNlIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGU6IHJldHVybiAiRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfc2V0X3R5cGU6IHJldHVybiAiRFdfVEFHX3NldF90eXBlIjsKLSAgICBjYXNlIERXX1RBR19zdWJyYW5nZV90eXBlOiByZXR1cm4gIkRXX1RBR19zdWJyYW5nZV90eXBlIjsKLSAgICBjYXNlIERXX1RBR193aXRoX3N0bXQ6IHJldHVybiAiRFdfVEFHX3dpdGhfc3RtdCI7Ci0gICAgY2FzZSBEV19UQUdfYWNjZXNzX2RlY2xhcmF0aW9uOiByZXR1cm4gIkRXX1RBR19hY2Nlc3NfZGVjbGFyYXRpb24iOwotICAgIGNhc2UgRFdfVEFHX2Jhc2VfdHlwZTogcmV0dXJuICJEV19UQUdfYmFzZV90eXBlIjsKLSAgICBjYXNlIERXX1RBR19jYXRjaF9ibG9jazogcmV0dXJuICJEV19UQUdfY2F0Y2hfYmxvY2siOwotICAgIGNhc2UgRFdfVEFHX2NvbnN0X3R5cGU6IHJldHVybiAiRFdfVEFHX2NvbnN0X3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX2NvbnN0YW50OiByZXR1cm4gIkRXX1RBR19jb25zdGFudCI7Ci0gICAgY2FzZSBEV19UQUdfZW51bWVyYXRvcjogcmV0dXJuICJEV19UQUdfZW51bWVyYXRvciI7Ci0gICAgY2FzZSBEV19UQUdfZmlsZV90eXBlOiByZXR1cm4gIkRXX1RBR19maWxlX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX2ZyaWVuZDogcmV0dXJuICJEV19UQUdfZnJpZW5kIjsKLSAgICBjYXNlIERXX1RBR19uYW1lbGlzdDogcmV0dXJuICJEV19UQUdfbmFtZWxpc3QiOwotICAgIGNhc2UgRFdfVEFHX25hbWVsaXN0X2l0ZW06IHJldHVybiAiRFdfVEFHX25hbWVsaXN0X2l0ZW0iOwotICAgIGNhc2UgRFdfVEFHX3BhY2tlZF90eXBlOiByZXR1cm4gIkRXX1RBR19wYWNrZWRfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfc3VicHJvZ3JhbTogcmV0dXJuICJEV19UQUdfc3VicHJvZ3JhbSI7Ci0gICAgY2FzZSBEV19UQUdfdGVtcGxhdGVfdHlwZV9wYXJhbTogcmV0dXJuICJEV19UQUdfdGVtcGxhdGVfdHlwZV9wYXJhbSI7Ci0gICAgY2FzZSBEV19UQUdfdGVtcGxhdGVfdmFsdWVfcGFyYW06IHJldHVybiAiRFdfVEFHX3RlbXBsYXRlX3ZhbHVlX3BhcmFtIjsKLSAgICBjYXNlIERXX1RBR190aHJvd25fdHlwZTogcmV0dXJuICJEV19UQUdfdGhyb3duX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3RyeV9ibG9jazogcmV0dXJuICJEV19UQUdfdHJ5X2Jsb2NrIjsKLSAgICBjYXNlIERXX1RBR192YXJpYW50X3BhcnQ6IHJldHVybiAiRFdfVEFHX3ZhcmlhbnRfcGFydCI7Ci0gICAgY2FzZSBEV19UQUdfdmFyaWFibGU6IHJldHVybiAiRFdfVEFHX3ZhcmlhYmxlIjsKLSAgICBjYXNlIERXX1RBR192b2xhdGlsZV90eXBlOiByZXR1cm4gIkRXX1RBR192b2xhdGlsZV90eXBlIjsKLSAgICBjYXNlIERXX1RBR19NSVBTX2xvb3A6IHJldHVybiAiRFdfVEFHX01JUFNfbG9vcCI7Ci0gICAgY2FzZSBEV19UQUdfZm9ybWF0X2xhYmVsOiByZXR1cm4gIkRXX1RBR19mb3JtYXRfbGFiZWwiOwotICAgIGNhc2UgRFdfVEFHX2Z1bmN0aW9uX3RlbXBsYXRlOiByZXR1cm4gIkRXX1RBR19mdW5jdGlvbl90ZW1wbGF0ZSI7Ci0gICAgY2FzZSBEV19UQUdfY2xhc3NfdGVtcGxhdGU6IHJldHVybiAiRFdfVEFHX2NsYXNzX3RlbXBsYXRlIjsKLSAgICBkZWZhdWx0OgotICAgICAgewotCXN0YXRpYyBjaGFyIGJ1ZmZlciBbMTAwXTsKLQotCXNwcmludGYgKGJ1ZmZlciwgXygiVW5rbm93biBUQUcgdmFsdWU6ICVseCIpLCB0YWcpOwotCXJldHVybiBidWZmZXI7Ci0gICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfQVRfbmFtZSAoYXR0cmlidXRlKQotICAgICB1bnNpZ25lZCBsb25nIGF0dHJpYnV0ZTsKLXsKLSAgc3dpdGNoIChhdHRyaWJ1dGUpCi0gICAgewotICAgIGNhc2UgRFdfQVRfc2libGluZzogcmV0dXJuICJEV19BVF9zaWJsaW5nIjsKLSAgICBjYXNlIERXX0FUX2xvY2F0aW9uOiByZXR1cm4gIkRXX0FUX2xvY2F0aW9uIjsKLSAgICBjYXNlIERXX0FUX25hbWU6IHJldHVybiAiRFdfQVRfbmFtZSI7Ci0gICAgY2FzZSBEV19BVF9vcmRlcmluZzogcmV0dXJuICJEV19BVF9vcmRlcmluZyI7Ci0gICAgY2FzZSBEV19BVF9zdWJzY3JfZGF0YTogcmV0dXJuICJEV19BVF9zdWJzY3JfZGF0YSI7Ci0gICAgY2FzZSBEV19BVF9ieXRlX3NpemU6IHJldHVybiAiRFdfQVRfYnl0ZV9zaXplIjsKLSAgICBjYXNlIERXX0FUX2JpdF9vZmZzZXQ6IHJldHVybiAiRFdfQVRfYml0X29mZnNldCI7Ci0gICAgY2FzZSBEV19BVF9iaXRfc2l6ZTogcmV0dXJuICJEV19BVF9iaXRfc2l6ZSI7Ci0gICAgY2FzZSBEV19BVF9lbGVtZW50X2xpc3Q6IHJldHVybiAiRFdfQVRfZWxlbWVudF9saXN0IjsKLSAgICBjYXNlIERXX0FUX3N0bXRfbGlzdDogcmV0dXJuICJEV19BVF9zdG10X2xpc3QiOwotICAgIGNhc2UgRFdfQVRfbG93X3BjOiByZXR1cm4gIkRXX0FUX2xvd19wYyI7Ci0gICAgY2FzZSBEV19BVF9oaWdoX3BjOiByZXR1cm4gIkRXX0FUX2hpZ2hfcGMiOwotICAgIGNhc2UgRFdfQVRfbGFuZ3VhZ2U6IHJldHVybiAiRFdfQVRfbGFuZ3VhZ2UiOwotICAgIGNhc2UgRFdfQVRfbWVtYmVyOiByZXR1cm4gIkRXX0FUX21lbWJlciI7Ci0gICAgY2FzZSBEV19BVF9kaXNjcjogcmV0dXJuICJEV19BVF9kaXNjciI7Ci0gICAgY2FzZSBEV19BVF9kaXNjcl92YWx1ZTogcmV0dXJuICJEV19BVF9kaXNjcl92YWx1ZSI7Ci0gICAgY2FzZSBEV19BVF92aXNpYmlsaXR5OiByZXR1cm4gIkRXX0FUX3Zpc2liaWxpdHkiOwotICAgIGNhc2UgRFdfQVRfaW1wb3J0OiByZXR1cm4gIkRXX0FUX2ltcG9ydCI7Ci0gICAgY2FzZSBEV19BVF9zdHJpbmdfbGVuZ3RoOiByZXR1cm4gIkRXX0FUX3N0cmluZ19sZW5ndGgiOwotICAgIGNhc2UgRFdfQVRfY29tbW9uX3JlZmVyZW5jZTogcmV0dXJuICJEV19BVF9jb21tb25fcmVmZXJlbmNlIjsKLSAgICBjYXNlIERXX0FUX2NvbXBfZGlyOiByZXR1cm4gIkRXX0FUX2NvbXBfZGlyIjsKLSAgICBjYXNlIERXX0FUX2NvbnN0X3ZhbHVlOiByZXR1cm4gIkRXX0FUX2NvbnN0X3ZhbHVlIjsKLSAgICBjYXNlIERXX0FUX2NvbnRhaW5pbmdfdHlwZTogcmV0dXJuICJEV19BVF9jb250YWluaW5nX3R5cGUiOwotICAgIGNhc2UgRFdfQVRfZGVmYXVsdF92YWx1ZTogcmV0dXJuICJEV19BVF9kZWZhdWx0X3ZhbHVlIjsKLSAgICBjYXNlIERXX0FUX2lubGluZTogcmV0dXJuICJEV19BVF9pbmxpbmUiOwotICAgIGNhc2UgRFdfQVRfaXNfb3B0aW9uYWw6IHJldHVybiAiRFdfQVRfaXNfb3B0aW9uYWwiOwotICAgIGNhc2UgRFdfQVRfbG93ZXJfYm91bmQ6IHJldHVybiAiRFdfQVRfbG93ZXJfYm91bmQiOwotICAgIGNhc2UgRFdfQVRfcHJvZHVjZXI6IHJldHVybiAiRFdfQVRfcHJvZHVjZXIiOwotICAgIGNhc2UgRFdfQVRfcHJvdG90eXBlZDogcmV0dXJuICJEV19BVF9wcm90b3R5cGVkIjsKLSAgICBjYXNlIERXX0FUX3JldHVybl9hZGRyOiByZXR1cm4gIkRXX0FUX3JldHVybl9hZGRyIjsKLSAgICBjYXNlIERXX0FUX3N0YXJ0X3Njb3BlOiByZXR1cm4gIkRXX0FUX3N0YXJ0X3Njb3BlIjsKLSAgICBjYXNlIERXX0FUX3N0cmlkZV9zaXplOiByZXR1cm4gIkRXX0FUX3N0cmlkZV9zaXplIjsKLSAgICBjYXNlIERXX0FUX3VwcGVyX2JvdW5kOiByZXR1cm4gIkRXX0FUX3VwcGVyX2JvdW5kIjsKLSAgICBjYXNlIERXX0FUX2Fic3RyYWN0X29yaWdpbjogcmV0dXJuICJEV19BVF9hYnN0cmFjdF9vcmlnaW4iOwotICAgIGNhc2UgRFdfQVRfYWNjZXNzaWJpbGl0eTogcmV0dXJuICJEV19BVF9hY2Nlc3NpYmlsaXR5IjsKLSAgICBjYXNlIERXX0FUX2FkZHJlc3NfY2xhc3M6IHJldHVybiAiRFdfQVRfYWRkcmVzc19jbGFzcyI7Ci0gICAgY2FzZSBEV19BVF9hcnRpZmljaWFsOiByZXR1cm4gIkRXX0FUX2FydGlmaWNpYWwiOwotICAgIGNhc2UgRFdfQVRfYmFzZV90eXBlczogcmV0dXJuICJEV19BVF9iYXNlX3R5cGVzIjsKLSAgICBjYXNlIERXX0FUX2NhbGxpbmdfY29udmVudGlvbjogcmV0dXJuICJEV19BVF9jYWxsaW5nX2NvbnZlbnRpb24iOwotICAgIGNhc2UgRFdfQVRfY291bnQ6IHJldHVybiAiRFdfQVRfY291bnQiOwotICAgIGNhc2UgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb246IHJldHVybiAiRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb24iOwotICAgIGNhc2UgRFdfQVRfZGVjbF9jb2x1bW46IHJldHVybiAiRFdfQVRfZGVjbF9jb2x1bW4iOwotICAgIGNhc2UgRFdfQVRfZGVjbF9maWxlOiByZXR1cm4gIkRXX0FUX2RlY2xfZmlsZSI7Ci0gICAgY2FzZSBEV19BVF9kZWNsX2xpbmU6IHJldHVybiAiRFdfQVRfZGVjbF9saW5lIjsKLSAgICBjYXNlIERXX0FUX2RlY2xhcmF0aW9uOiByZXR1cm4gIkRXX0FUX2RlY2xhcmF0aW9uIjsKLSAgICBjYXNlIERXX0FUX2Rpc2NyX2xpc3Q6IHJldHVybiAiRFdfQVRfZGlzY3JfbGlzdCI7Ci0gICAgY2FzZSBEV19BVF9lbmNvZGluZzogcmV0dXJuICJEV19BVF9lbmNvZGluZyI7Ci0gICAgY2FzZSBEV19BVF9leHRlcm5hbDogcmV0dXJuICJEV19BVF9leHRlcm5hbCI7Ci0gICAgY2FzZSBEV19BVF9mcmFtZV9iYXNlOiByZXR1cm4gIkRXX0FUX2ZyYW1lX2Jhc2UiOwotICAgIGNhc2UgRFdfQVRfZnJpZW5kOiByZXR1cm4gIkRXX0FUX2ZyaWVuZCI7Ci0gICAgY2FzZSBEV19BVF9pZGVudGlmaWVyX2Nhc2U6IHJldHVybiAiRFdfQVRfaWRlbnRpZmllcl9jYXNlIjsKLSAgICBjYXNlIERXX0FUX21hY3JvX2luZm86IHJldHVybiAiRFdfQVRfbWFjcm9faW5mbyI7Ci0gICAgY2FzZSBEV19BVF9uYW1lbGlzdF9pdGVtczogcmV0dXJuICJEV19BVF9uYW1lbGlzdF9pdGVtcyI7Ci0gICAgY2FzZSBEV19BVF9wcmlvcml0eTogcmV0dXJuICJEV19BVF9wcmlvcml0eSI7Ci0gICAgY2FzZSBEV19BVF9zZWdtZW50OiByZXR1cm4gIkRXX0FUX3NlZ21lbnQiOwotICAgIGNhc2UgRFdfQVRfc3BlY2lmaWNhdGlvbjogcmV0dXJuICJEV19BVF9zcGVjaWZpY2F0aW9uIjsKLSAgICBjYXNlIERXX0FUX3N0YXRpY19saW5rOiByZXR1cm4gIkRXX0FUX3N0YXRpY19saW5rIjsKLSAgICBjYXNlIERXX0FUX3R5cGU6IHJldHVybiAiRFdfQVRfdHlwZSI7Ci0gICAgY2FzZSBEV19BVF91c2VfbG9jYXRpb246IHJldHVybiAiRFdfQVRfdXNlX2xvY2F0aW9uIjsKLSAgICBjYXNlIERXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlcjogcmV0dXJuICJEV19BVF92YXJpYWJsZV9wYXJhbWV0ZXIiOwotICAgIGNhc2UgRFdfQVRfdmlydHVhbGl0eTogcmV0dXJuICJEV19BVF92aXJ0dWFsaXR5IjsKLSAgICBjYXNlIERXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uOiByZXR1cm4gIkRXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uIjsKLSAgICBjYXNlIERXX0FUX01JUFNfZmRlOiByZXR1cm4gIkRXX0FUX01JUFNfZmRlIjsKLSAgICBjYXNlIERXX0FUX01JUFNfbG9vcF9iZWdpbjogcmV0dXJuICJEV19BVF9NSVBTX2xvb3BfYmVnaW4iOwotICAgIGNhc2UgRFdfQVRfTUlQU190YWlsX2xvb3BfYmVnaW46IHJldHVybiAiRFdfQVRfTUlQU190YWlsX2xvb3BfYmVnaW4iOwotICAgIGNhc2UgRFdfQVRfTUlQU19lcGlsb2dfYmVnaW46IHJldHVybiAiRFdfQVRfTUlQU19lcGlsb2dfYmVnaW4iOwotICAgIGNhc2UgRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3I6IHJldHVybiAiRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3IiOwotICAgIGNhc2UgRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aDogcmV0dXJuICJEV19BVF9NSVBTX3NvZnR3YXJlX3BpcGVsaW5lX2RlcHRoIjsKLSAgICBjYXNlIERXX0FUX01JUFNfbGlua2FnZV9uYW1lOiByZXR1cm4gIkRXX0FUX01JUFNfbGlua2FnZV9uYW1lIjsKLSAgICBjYXNlIERXX0FUX01JUFNfc3RyaWRlOiByZXR1cm4gIkRXX0FUX01JUFNfc3RyaWRlIjsKLSAgICBjYXNlIERXX0FUX01JUFNfYWJzdHJhY3RfbmFtZTogcmV0dXJuICJEV19BVF9NSVBTX2Fic3RyYWN0X25hbWUiOwotICAgIGNhc2UgRFdfQVRfTUlQU19jbG9uZV9vcmlnaW46IHJldHVybiAiRFdfQVRfTUlQU19jbG9uZV9vcmlnaW4iOwotICAgIGNhc2UgRFdfQVRfTUlQU19oYXNfaW5saW5lczogcmV0dXJuICJEV19BVF9NSVBTX2hhc19pbmxpbmVzIjsKLSAgICBjYXNlIERXX0FUX3NmX25hbWVzOiByZXR1cm4gIkRXX0FUX3NmX25hbWVzIjsKLSAgICBjYXNlIERXX0FUX3NyY19pbmZvOiByZXR1cm4gIkRXX0FUX3NyY19pbmZvIjsKLSAgICBjYXNlIERXX0FUX21hY19pbmZvOiByZXR1cm4gIkRXX0FUX21hY19pbmZvIjsKLSAgICBjYXNlIERXX0FUX3NyY19jb29yZHM6IHJldHVybiAiRFdfQVRfc3JjX2Nvb3JkcyI7Ci0gICAgY2FzZSBEV19BVF9ib2R5X2JlZ2luOiByZXR1cm4gIkRXX0FUX2JvZHlfYmVnaW4iOwotICAgIGNhc2UgRFdfQVRfYm9keV9lbmQ6IHJldHVybiAiRFdfQVRfYm9keV9lbmQiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyIFsxMDBdOwotCi0Jc3ByaW50ZiAoYnVmZmVyLCBfKCJVbmtub3duIEFUIHZhbHVlOiAlbHgiKSwgYXR0cmlidXRlKTsKLQlyZXR1cm4gYnVmZmVyOwotICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X0ZPUk1fbmFtZSAoZm9ybSkKLSAgICAgdW5zaWduZWQgbG9uZyBmb3JtOwotewotICBzd2l0Y2ggKGZvcm0pCi0gICAgewotICAgIGNhc2UgRFdfRk9STV9hZGRyOiByZXR1cm4gIkRXX0ZPUk1fYWRkciI7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMjogcmV0dXJuICJEV19GT1JNX2Jsb2NrMiI7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrNDogcmV0dXJuICJEV19GT1JNX2Jsb2NrNCI7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGEyOiByZXR1cm4gIkRXX0ZPUk1fZGF0YTIiOwotICAgIGNhc2UgRFdfRk9STV9kYXRhNDogcmV0dXJuICJEV19GT1JNX2RhdGE0IjsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTg6IHJldHVybiAiRFdfRk9STV9kYXRhOCI7Ci0gICAgY2FzZSBEV19GT1JNX3N0cmluZzogcmV0dXJuICJEV19GT1JNX3N0cmluZyI7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrOiByZXR1cm4gIkRXX0ZPUk1fYmxvY2siOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazE6IHJldHVybiAiRFdfRk9STV9ibG9jazEiOwotICAgIGNhc2UgRFdfRk9STV9kYXRhMTogcmV0dXJuICJEV19GT1JNX2RhdGExIjsKLSAgICBjYXNlIERXX0ZPUk1fZmxhZzogcmV0dXJuICJEV19GT1JNX2ZsYWciOwotICAgIGNhc2UgRFdfRk9STV9zZGF0YTogcmV0dXJuICJEV19GT1JNX3NkYXRhIjsKLSAgICBjYXNlIERXX0ZPUk1fc3RycDogcmV0dXJuICJEV19GT1JNX3N0cnAiOwotICAgIGNhc2UgRFdfRk9STV91ZGF0YTogcmV0dXJuICJEV19GT1JNX3VkYXRhIjsKLSAgICBjYXNlIERXX0ZPUk1fcmVmX2FkZHI6IHJldHVybiAiRFdfRk9STV9yZWZfYWRkciI7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjE6IHJldHVybiAiRFdfRk9STV9yZWYxIjsKLSAgICBjYXNlIERXX0ZPUk1fcmVmMjogcmV0dXJuICJEV19GT1JNX3JlZjIiOwotICAgIGNhc2UgRFdfRk9STV9yZWY0OiByZXR1cm4gIkRXX0ZPUk1fcmVmNCI7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjg6IHJldHVybiAiRFdfRk9STV9yZWY4IjsKLSAgICBjYXNlIERXX0ZPUk1fcmVmX3VkYXRhOiByZXR1cm4gIkRXX0ZPUk1fcmVmX3VkYXRhIjsKLSAgICBjYXNlIERXX0ZPUk1faW5kaXJlY3Q6IHJldHVybiAiRFdfRk9STV9pbmRpcmVjdCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQlzdGF0aWMgY2hhciBidWZmZXIgWzEwMF07Ci0KLQlzcHJpbnRmIChidWZmZXIsIF8oIlVua25vd24gRk9STSB2YWx1ZTogJWx4IiksIGZvcm0pOwotCXJldHVybiBidWZmZXI7Ci0gICAgICB9Ci0gICAgfQotfQotCi0vKiBGSVhNRTogIFRoZXJlIGFyZSBiZXR0ZXIgYW5kIG1vcmUgZWZmaWVjaW50IHdheXMgdG8gaGFuZGxlCi0gICB0aGVzZSBzdHJ1Y3R1cmVzLiAgRm9yIG5vdyB0aG91Z2gsIEkganVzdCB3YW50IHNvbWV0aGluZyB0aGF0Ci0gICBpcyBzaW1wbGUgdG8gaW1wbGVtZW50LiAgKi8KLXR5cGVkZWYgc3RydWN0IGFiYnJldl9hdHRyCi17Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgIGF0dHJpYnV0ZTsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgZm9ybTsKLSAgc3RydWN0IGFiYnJldl9hdHRyICogbmV4dDsKLX0KLWFiYnJldl9hdHRyOwotCi10eXBlZGVmIHN0cnVjdCBhYmJyZXZfZW50cnkKLXsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICBlbnRyeTsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICB0YWc7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW47Ci0gIHN0cnVjdCBhYmJyZXZfYXR0ciAqICAgZmlyc3RfYXR0cjsKLSAgc3RydWN0IGFiYnJldl9hdHRyICogICBsYXN0X2F0dHI7Ci0gIHN0cnVjdCBhYmJyZXZfZW50cnkgKiAgbmV4dDsKLX0KLWFiYnJldl9lbnRyeTsKLQotc3RhdGljIGFiYnJldl9lbnRyeSAqIGZpcnN0X2FiYnJldiA9IE5VTEw7Ci1zdGF0aWMgYWJicmV2X2VudHJ5ICogbGFzdF9hYmJyZXYgPSBOVUxMOwotCi1zdGF0aWMgdm9pZAotZnJlZV9hYmJyZXZzIFBBUkFNUyAoKHZvaWQpKQotewotICBhYmJyZXZfZW50cnkgKiBhYmJyZXY7Ci0KLSAgZm9yIChhYmJyZXYgPSBmaXJzdF9hYmJyZXY7IGFiYnJldjspCi0gICAgewotICAgICAgYWJicmV2X2VudHJ5ICogbmV4dCA9IGFiYnJldi0+bmV4dDsKLSAgICAgIGFiYnJldl9hdHRyICAqIGF0dHI7Ci0KLSAgICAgIGZvciAoYXR0ciA9IGFiYnJldi0+Zmlyc3RfYXR0cjsgYXR0cjspCi0JewotCSAgYWJicmV2X2F0dHIgKiBuZXh0ID0gYXR0ci0+bmV4dDsKLQotCSAgZnJlZSAoYXR0cik7Ci0JICBhdHRyID0gbmV4dDsKLQl9Ci0KLSAgICAgIGZyZWUgKGFiYnJldik7Ci0gICAgICBhYmJyZXYgPSBuZXh0OwotICAgIH0KLQotICBsYXN0X2FiYnJldiA9IGZpcnN0X2FiYnJldiA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGRfYWJicmV2IChudW1iZXIsIHRhZywgY2hpbGRyZW4pCi0gICAgIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotICAgICB1bnNpZ25lZCBsb25nIHRhZzsKLSAgICAgaW50ICAgICAgICAgICBjaGlsZHJlbjsKLXsKLSAgYWJicmV2X2VudHJ5ICogZW50cnk7Ci0KLSAgZW50cnkgPSAoYWJicmV2X2VudHJ5ICopIG1hbGxvYyAoc2l6ZW9mICgqIGVudHJ5KSk7Ci0KLSAgaWYgKGVudHJ5ID09IE5VTEwpCi0gICAgLyogdWdnICovCi0gICAgcmV0dXJuOwotCi0gIGVudHJ5LT5lbnRyeSAgICAgID0gbnVtYmVyOwotICBlbnRyeS0+dGFnICAgICAgICA9IHRhZzsKLSAgZW50cnktPmNoaWxkcmVuICAgPSBjaGlsZHJlbjsKLSAgZW50cnktPmZpcnN0X2F0dHIgPSBOVUxMOwotICBlbnRyeS0+bGFzdF9hdHRyICA9IE5VTEw7Ci0gIGVudHJ5LT5uZXh0ICAgICAgID0gTlVMTDsKLQotICBpZiAoZmlyc3RfYWJicmV2ID09IE5VTEwpCi0gICAgZmlyc3RfYWJicmV2ID0gZW50cnk7Ci0gIGVsc2UKLSAgICBsYXN0X2FiYnJldi0+bmV4dCA9IGVudHJ5OwotCi0gIGxhc3RfYWJicmV2ID0gZW50cnk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGRfYWJicmV2X2F0dHIgKGF0dHJpYnV0ZSwgZm9ybSkKLSAgICAgdW5zaWduZWQgbG9uZyBhdHRyaWJ1dGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZm9ybTsKLXsKLSAgYWJicmV2X2F0dHIgKiBhdHRyOwotCi0gIGF0dHIgPSAoYWJicmV2X2F0dHIgKikgbWFsbG9jIChzaXplb2YgKCogYXR0cikpOwotCi0gIGlmIChhdHRyID09IE5VTEwpCi0gICAgLyogdWdnICovCi0gICAgcmV0dXJuOwotCi0gIGF0dHItPmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLSAgYXR0ci0+Zm9ybSAgICAgID0gZm9ybTsKLSAgYXR0ci0+bmV4dCAgICAgID0gTlVMTDsKLQotICBpZiAobGFzdF9hYmJyZXYtPmZpcnN0X2F0dHIgPT0gTlVMTCkKLSAgICBsYXN0X2FiYnJldi0+Zmlyc3RfYXR0ciA9IGF0dHI7Ci0gIGVsc2UKLSAgICBsYXN0X2FiYnJldi0+bGFzdF9hdHRyLT5uZXh0ID0gYXR0cjsKLQotICBsYXN0X2FiYnJldi0+bGFzdF9hdHRyID0gYXR0cjsKLX0KLQotLyogUHJvY2Vzc2VzIHRoZSAocGFydGlhbCkgY29udGVudHMgb2YgYSAuZGVidWdfYWJicmV2IHNlY3Rpb24uCi0gICBSZXR1cm5zIE5VTEwgaWYgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbiB3YXMgZW5jb3VudGVyZWQuCi0gICBSZXR1cm5zIHRoZSBhZGRyZXNzIGFmdGVyIHRoZSBsYXN0IGJ5dGUgcmVhZCBpZiB0aGUgZW5kIG9mCi0gICBhbiBhYmJyZXZpYXRpb24gc2V0IHdhcyBmb3VuZC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXByb2Nlc3NfYWJicmV2X3NlY3Rpb24gKHN0YXJ0LCBlbmQpCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBzdGFydDsKLSAgICAgdW5zaWduZWQgY2hhciAqIGVuZDsKLXsKLSAgaWYgKGZpcnN0X2FiYnJldiAhPSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHdoaWxlIChzdGFydCA8IGVuZCkKLSAgICB7Ci0gICAgICBpbnQgICAgICAgICAgIGJ5dGVzX3JlYWQ7Ci0gICAgICB1bnNpZ25lZCBsb25nIGVudHJ5OwotICAgICAgdW5zaWduZWQgbG9uZyB0YWc7Ci0gICAgICB1bnNpZ25lZCBsb25nIGF0dHJpYnV0ZTsKLSAgICAgIGludCAgICAgICAgICAgY2hpbGRyZW47Ci0KLSAgICAgIGVudHJ5ID0gcmVhZF9sZWIxMjggKHN0YXJ0LCAmIGJ5dGVzX3JlYWQsIDApOwotICAgICAgc3RhcnQgKz0gYnl0ZXNfcmVhZDsKLQotICAgICAgLyogQSBzaW5nbGUgemVybyBpcyBzdXBwb3NlZCB0byBlbmQgdGhlIHNlY3Rpb24gYWNjb3JkaW5nCi0JIHRvIHRoZSBzdGFuZGFyZC4gIElmIHRoZXJlJ3MgbW9yZSwgdGhlbiBzaWduYWwgdGhhdCB0bwotCSB0aGUgY2FsbGVyLiAgKi8KLSAgICAgIGlmIChlbnRyeSA9PSAwKQotCXJldHVybiBzdGFydCA9PSBlbmQgPyBOVUxMIDogc3RhcnQ7Ci0KLSAgICAgIHRhZyA9IHJlYWRfbGViMTI4IChzdGFydCwgJiBieXRlc19yZWFkLCAwKTsKLSAgICAgIHN0YXJ0ICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgICAgIGNoaWxkcmVuID0gKiBzdGFydCArKzsKLQotICAgICAgYWRkX2FiYnJldiAoZW50cnksIHRhZywgY2hpbGRyZW4pOwotCi0gICAgICBkbwotCXsKLQkgIHVuc2lnbmVkIGxvbmcgZm9ybTsKLQotCSAgYXR0cmlidXRlID0gcmVhZF9sZWIxMjggKHN0YXJ0LCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgc3RhcnQgKz0gYnl0ZXNfcmVhZDsKLQotCSAgZm9ybSA9IHJlYWRfbGViMTI4IChzdGFydCwgJiBieXRlc19yZWFkLCAwKTsKLQkgIHN0YXJ0ICs9IGJ5dGVzX3JlYWQ7Ci0KLQkgIGlmIChhdHRyaWJ1dGUgIT0gMCkKLQkgICAgYWRkX2FiYnJldl9hdHRyIChhdHRyaWJ1dGUsIGZvcm0pOwotCX0KLSAgICAgIHdoaWxlIChhdHRyaWJ1dGUgIT0gMCk7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBpbnQKLWRpc3BsYXlfZGVidWdfYWJicmV2IChzZWN0aW9uLCBzdGFydCwgZmlsZSkKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKiAgICAgICBzdGFydDsKLSAgICAgRklMRSAqICAgICAgICAgICAgICAgIGZpbGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJicmV2X2VudHJ5ICogZW50cnk7Ci0gIHVuc2lnbmVkIGNoYXIgKiBlbmQgPSBzdGFydCArIHNlY3Rpb24tPnNoX3NpemU7Ci0KLSAgcHJpbnRmIChfKCJDb250ZW50cyBvZiB0aGUgJXMgc2VjdGlvbjpcblxuIiksIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0gIGRvCi0gICAgewotICAgICAgc3RhcnQgPSBwcm9jZXNzX2FiYnJldl9zZWN0aW9uIChzdGFydCwgZW5kKTsKLQotICAgICAgcHJpbnRmIChfKCIgIE51bWJlciBUQUdcbiIpKTsKLQotICAgICAgZm9yIChlbnRyeSA9IGZpcnN0X2FiYnJldjsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpCi0JewotCSAgYWJicmV2X2F0dHIgKiBhdHRyOwotCi0JICBwcmludGYgKF8oIiAgICVsZCAgICAgICVzICAgIFslc11cbiIpLAotCQkgIGVudHJ5LT5lbnRyeSwKLQkJICBnZXRfVEFHX25hbWUgKGVudHJ5LT50YWcpLAotCQkgIGVudHJ5LT5jaGlsZHJlbiA/IF8oImhhcyBjaGlsZHJlbiIpIDogXygibm8gY2hpbGRyZW4iKSk7Ci0KLQkgIGZvciAoYXR0ciA9IGVudHJ5LT5maXJzdF9hdHRyOyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4dCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoXygiICAgICUtMThzICVzXG4iKSwKLQkJICAgICAgZ2V0X0FUX25hbWUgKGF0dHItPmF0dHJpYnV0ZSksCi0JCSAgICAgIGdldF9GT1JNX25hbWUgKGF0dHItPmZvcm0pKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHdoaWxlIChzdGFydCk7Ci0KLSAgcHJpbnRmICgiXG4iKTsKLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1kaXNwbGF5X2Jsb2NrIChkYXRhLCBsZW5ndGgpCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICB1bnNpZ25lZCBsb25nICAgbGVuZ3RoOwotewotICBwcmludGYgKF8oIiAlbHUgYnl0ZSBibG9jazogIiksIGxlbmd0aCk7Ci0KLSAgd2hpbGUgKGxlbmd0aCAtLSkKLSAgICBwcmludGYgKCIlbHggIiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhICsrLCAxKSk7Ci0KLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWNvZGVfbG9jYXRpb25fZXhwcmVzc2lvbiAoZGF0YSwgcG9pbnRlcl9zaXplKQotICAgICB1bnNpZ25lZCBjaGFyICogZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICAgIHBvaW50ZXJfc2l6ZTsKLXsKLSAgdW5zaWduZWQgY2hhciBvcDsKLSAgaW50ICAgICAgICAgICBieXRlc19yZWFkOwotICB1bnNpZ25lZCBsb25nIHV2YWx1ZTsKLQotICBvcCA9ICogZGF0YSArKzsKLQotICBzd2l0Y2ggKG9wKQotICAgIHsKLSAgICBjYXNlIERXX09QX2FkZHI6Ci0gICAgICBwcmludGYgKCJEV19PUF9hZGRyOiAlbHgiLCAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEsIHBvaW50ZXJfc2l6ZSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9kZXJlZjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2RlcmVmIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0MXU6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDF1OiAlbHUiLCAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3QxczoKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0MXM6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdDJ1OgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3QydTogJWx1IiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCAyKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0MnM6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDJzOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3Q0dToKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0NHU6ICVsdSIsICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSwgNCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdDRzOgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3Q0czogJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0OHU6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDh1OiAlbHUgJWx1IiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCA0KSwKLQkgICAgICAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEgKyA0LCA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0OHM6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDhzOiAlbGQgJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCA0KSwKLQkgICAgICAobG9uZykgYnl0ZV9nZXQgKGRhdGEgKyA0LCA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0dToKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0dTogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3RzOgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3RzOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9kdXA6Ci0gICAgICBwcmludGYgKCJEV19PUF9kdXAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZHJvcDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2Ryb3AiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfb3ZlcjoKLSAgICAgIHByaW50ZiAoIkRXX09QX292ZXIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcGljazoKLSAgICAgIHByaW50ZiAoIkRXX09QX3BpY2s6ICVsZCIsICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9zd2FwOgotICAgICAgcHJpbnRmICgiRFdfT1Bfc3dhcCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yb3Q6Ci0gICAgICBwcmludGYgKCJEV19PUF9yb3QiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfeGRlcmVmOgotICAgICAgcHJpbnRmICgiRFdfT1BfeGRlcmVmIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2FiczoKLSAgICAgIHByaW50ZiAoIkRXX09QX2FicyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9hbmQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9hbmQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZGl2OgotICAgICAgcHJpbnRmICgiRFdfT1BfZGl2Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX21pbnVzOgotICAgICAgcHJpbnRmICgiRFdfT1BfbWludXMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbW9kOgotICAgICAgcHJpbnRmICgiRFdfT1BfbW9kIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX211bDoKLSAgICAgIHByaW50ZiAoIkRXX09QX211bCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9uZWc6Ci0gICAgICBwcmludGYgKCJEV19PUF9uZWciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfbm90OgotICAgICAgcHJpbnRmICgiRFdfT1Bfbm90Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX29yOgotICAgICAgcHJpbnRmICgiRFdfT1Bfb3IiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcGx1czoKLSAgICAgIHByaW50ZiAoIkRXX09QX3BsdXMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcGx1c191Y29uc3Q6Ci0gICAgICBwcmludGYgKCJEV19PUF9wbHVzX3Vjb25zdDogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfc2hsOgotICAgICAgcHJpbnRmICgiRFdfT1Bfc2hsIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3NocjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3NociIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9zaHJhOgotICAgICAgcHJpbnRmICgiRFdfT1Bfc2hyYSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF94b3I6Ci0gICAgICBwcmludGYgKCJEV19PUF94b3IiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJhOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJhOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZXE6Ci0gICAgICBwcmludGYgKCJEV19PUF9lcSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9nZToKLSAgICAgIHByaW50ZiAoIkRXX09QX2dlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2d0OgotICAgICAgcHJpbnRmICgiRFdfT1BfZ3QiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGU6Ci0gICAgICBwcmludGYgKCJEV19PUF9sZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9sdDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2x0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX25lOgotICAgICAgcHJpbnRmICgiRFdfT1BfbmUiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfc2tpcDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3NraXA6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQwOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQzOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ0OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0NCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ1OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0NSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ2OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0NiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ3OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0NyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ4OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0OCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ5OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0OSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDEwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDExOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTI6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxMiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxMzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDEzIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE0OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTU6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxNSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxNjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDE2Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE3OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTg6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxOCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxOToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDE5Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDIwOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MjE6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDIyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDIzOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MjQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyNCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyNToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDI1Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI2OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0Mjc6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyNyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyODoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDI4Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI5OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjkiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MzA6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQzMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQzMToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDMxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzA6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzE6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzI6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzM6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWczIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzU6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc1Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzY6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc2Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzc6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc3Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzg6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc4Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzk6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc5Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzEwOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTE6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzEyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzEzOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxNCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxNToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzE1Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzE2OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTc6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxNyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxODoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzE4Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzE5OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTkiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjA6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyMToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzIxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzIyOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjM6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyMyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzI0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzI1OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjUiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjY6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyNiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzI3Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzI4OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjgiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjk6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyOSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWczMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzMwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzMxOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMzEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzA6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzM6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnNDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzU6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnNTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzY6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnNjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzc6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnNzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzg6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnODogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzk6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnOTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzEwOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzEwOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTE6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTE6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxMjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzEzOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzEzOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTQ6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxNToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxNTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE2OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzE2OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTc6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTc6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxODoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxODogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE5OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzE5OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjA6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjA6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyMToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyMTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzIyOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzIyOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjM6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjM6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyNDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI1OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzI1OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjY6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjY6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyNzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI4OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzI4OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjk6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjk6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWczMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWczMDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzMxOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzMxOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWd4OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVneDogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZmJyZWc6Ci0gICAgICBwcmludGYgKCJEV19PUF9mYnJlZzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZ3g6Ci0gICAgICB1dmFsdWUgPSByZWFkX2xlYjEyOCAoZGF0YSwgJmJ5dGVzX3JlYWQsIDApOwotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZ3g6ICVsdSAlbGQiLCB1dmFsdWUsCi0JICAgICAgcmVhZF9sZWIxMjggKGRhdGEgKyBieXRlc19yZWFkLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3BpZWNlOgotICAgICAgcHJpbnRmICgiRFdfT1BfcGllY2U6ICVsdSIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2RlcmVmX3NpemU6Ci0gICAgICBwcmludGYgKCJEV19PUF9kZXJlZl9zaXplOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfeGRlcmVmX3NpemU6Ci0gICAgICBwcmludGYgKCJEV19PUF94ZGVyZWZfc2l6ZTogJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX25vcDoKLSAgICAgIHByaW50ZiAoIkRXX09QX25vcCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKG9wID49IERXX09QX2xvX3VzZXIKLQkgICYmIG9wIDw9IERXX09QX2hpX3VzZXIpCi0JcHJpbnRmIChfKCIoVXNlciBkZWZpbmVkIGxvY2F0aW9uIG9wKSIpKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKF8oIihVbmtub3duIGxvY2F0aW9uIG9wKSIpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1yZWFkX2FuZF9kaXNwbGF5X2F0dHIgKGF0dHJpYnV0ZSwgZm9ybSwgZGF0YSwgcG9pbnRlcl9zaXplKQotICAgICB1bnNpZ25lZCBsb25nICAgYXR0cmlidXRlOwotICAgICB1bnNpZ25lZCBsb25nICAgZm9ybTsKLSAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICBwb2ludGVyX3NpemU7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgICB1dmFsdWUgPSAwOwotICB1bnNpZ25lZCBjaGFyICogYmxvY2tfc3RhcnQgPSBOVUxMOwotICBpbnQgICAgICAgICAgICAgYnl0ZXNfcmVhZDsKLSAgaW50CQkgIGlzX3JlZiA9IDA7Ci0KLSAgcHJpbnRmICgiICAgICAlLTE4czoiLCBnZXRfQVRfbmFtZSAoYXR0cmlidXRlKSk7Ci0KLSAgc3dpdGNoIChmb3JtKQotICAgIHsKLSAgICBjYXNlIERXX0ZPUk1fcmVmX2FkZHI6Ci0gICAgY2FzZSBEV19GT1JNX3JlZjE6Ci0gICAgY2FzZSBEV19GT1JNX3JlZjI6Ci0gICAgY2FzZSBEV19GT1JNX3JlZjQ6Ci0gICAgY2FzZSBEV19GT1JNX3JlZjg6Ci0gICAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YToKLSAgICAgIGlzX3JlZiA9IDE7Ci0gICAgfQotCi0gIHN3aXRjaCAoZm9ybSkKLSAgICB7Ci0gICAgY2FzZSBEV19GT1JNX3JlZl9hZGRyOgotICAgIGNhc2UgRFdfRk9STV9hZGRyOgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIHBvaW50ZXJfc2l6ZSk7Ci0gICAgICBwcmludGYgKGlzX3JlZiA/ICIgPCV4PiIgOiAiICUjeCIsIHV2YWx1ZSk7Ci0gICAgICBkYXRhICs9IHBvaW50ZXJfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3JlZjE6Ci0gICAgY2FzZSBEV19GT1JNX2ZsYWc6Ci0gICAgY2FzZSBEV19GT1JNX2RhdGExOgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEgKyssIDEpOwotICAgICAgcHJpbnRmIChpc19yZWYgPyAiIDwleD4iIDogIiAlZCIsIHV2YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWYyOgotICAgIGNhc2UgRFdfRk9STV9kYXRhMjoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCAyKTsKLSAgICAgIGRhdGEgKz0gMjsKLSAgICAgIHByaW50ZiAoaXNfcmVmID8gIiA8JXg+IiA6ICIgJWQiLCB1dmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fcmVmNDoKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgNCk7Ci0gICAgICBkYXRhICs9IDQ7Ci0gICAgICBwcmludGYgKGlzX3JlZiA/ICIgPCV4PiIgOiAiICVkIiwgdXZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3JlZjg6Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE4OgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIDQpOwotICAgICAgcHJpbnRmICgiICVseCIsIHV2YWx1ZSk7Ci0gICAgICBwcmludGYgKCIgJWx4IiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhICsgNCwgNCkpOwotICAgICAgZGF0YSArPSA4OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fc3RyaW5nOgotICAgICAgcHJpbnRmICgiICVzIiwgZGF0YSk7Ci0gICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fc2RhdGE6Ci0gICAgICB1dmFsdWUgPSByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAxKTsKLSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHByaW50ZiAoIiAlbGQiLCAobG9uZykgdXZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YToKLSAgICBjYXNlIERXX0ZPUk1fdWRhdGE6Ci0gICAgICB1dmFsdWUgPSByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKTsKLSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHByaW50ZiAoaXNfcmVmID8gIiA8JWx4PiIgOiAiICVsZCIsIHV2YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9ibG9jazoKLSAgICAgIHV2YWx1ZSA9IHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApOwotICAgICAgYmxvY2tfc3RhcnQgPSBkYXRhICsgYnl0ZXNfcmVhZDsKLSAgICAgIGRhdGEgPSBkaXNwbGF5X2Jsb2NrIChibG9ja19zdGFydCwgdXZhbHVlKTsKLSAgICAgIHV2YWx1ZSA9ICogYmxvY2tfc3RhcnQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9ibG9jazE6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgMSk7Ci0gICAgICBibG9ja19zdGFydCA9IGRhdGEgKyAxOwotICAgICAgZGF0YSA9IGRpc3BsYXlfYmxvY2sgKGJsb2NrX3N0YXJ0LCB1dmFsdWUpOwotICAgICAgdXZhbHVlID0gKiBibG9ja19zdGFydDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMjoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCAyKTsKLSAgICAgIGJsb2NrX3N0YXJ0ID0gZGF0YSArIDI7Ci0gICAgICBkYXRhID0gZGlzcGxheV9ibG9jayAoYmxvY2tfc3RhcnQsIHV2YWx1ZSk7Ci0gICAgICB1dmFsdWUgPSAqIGJsb2NrX3N0YXJ0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s0OgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIDQpOwotICAgICAgYmxvY2tfc3RhcnQgPSBkYXRhICsgNDsKLSAgICAgIGRhdGEgPSBkaXNwbGF5X2Jsb2NrIChibG9ja19zdGFydCwgdXZhbHVlKTsKLSAgICAgIHV2YWx1ZSA9ICogYmxvY2tfc3RhcnQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9zdHJwOgotICAgIGNhc2UgRFdfRk9STV9pbmRpcmVjdDoKLSAgICAgIHdhcm4gKF8oIlVuYWJsZSB0byBoYW5kbGUgRk9STTogJWQiKSwgZm9ybSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB3YXJuIChfKCJVbnJlY29nbmlzZWQgZm9ybTogJWQiKSwgZm9ybSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogRm9yIHNvbWUgYXR0cmlidXRlcyB3ZSBjYW4gZGlzcGxheSBmdXRoZXIgaW5mb3JtYXRpb24uICAqLwotCi0gIHByaW50ZiAoIlx0Iik7Ci0KLSAgc3dpdGNoIChhdHRyaWJ1dGUpCi0gICAgewotICAgIGNhc2UgRFdfQVRfaW5saW5lOgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfSU5MX25vdF9pbmxpbmVkOiAgICAgICAgICBwcmludGYgKF8oIihub3QgaW5saW5lZCkiKSk7IGJyZWFrOwotCWNhc2UgRFdfSU5MX2lubGluZWQ6ICAgICAgICAgICAgICBwcmludGYgKF8oIihpbmxpbmVkKSIpKTsgYnJlYWs7Ci0JY2FzZSBEV19JTkxfZGVjbGFyZWRfbm90X2lubGluZWQ6IHByaW50ZiAoXygiKGRlY2xhcmVkIGFzIGlubGluZSBidXQgaWdub3JlZCkiKSk7IGJyZWFrOwotCWNhc2UgRFdfSU5MX2RlY2xhcmVkX2lubGluZWQ6ICAgICBwcmludGYgKF8oIihkZWNsYXJlZCBhcyBpbmxpbmUgYW5kIGlubGluZWQpIikpOyBicmVhazsKLQlkZWZhdWx0OiBwcmludGYgKF8oIiAgKFVua25vd24gaW5saW5lIGF0dHJpYnV0ZSB2YWx1ZTogJWx4KSIpLCB1dmFsdWUpOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfZnJhbWVfYmFzZToKLSAgICAgIGlmICh1dmFsdWUgPj0gRFdfT1BfcmVnMCAmJiB1dmFsdWUgPD0gRFdfT1BfcmVnMzEpCi0JcHJpbnRmICgiKHJlZyAlbGQpIiwgdXZhbHVlIC0gRFdfT1BfcmVnMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfbGFuZ3VhZ2U6Ci0gICAgICBzd2l0Y2ggKHV2YWx1ZSkKLQl7Ci0JY2FzZSBEV19MQU5HX0M6ICAgICAgICAgICAgICBwcmludGYgKCIobm9uLUFOU0kgQykiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX0M4OTogICAgICAgICAgICBwcmludGYgKCIoQU5TSSBDKSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfQ19wbHVzX3BsdXM6ICAgIHByaW50ZiAoIihDKyspIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19Gb3J0cmFuNzc6ICAgICAgcHJpbnRmICgiKEZPUlRSQU4gNzcpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19Gb3J0cmFuOTA6ICAgICAgcHJpbnRmICgiKEZvcnRyYW4gOTApIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19Nb2R1bGEyOiAgICAgICAgcHJpbnRmICgiKE1vZHVsYSAyKSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfUGFzY2FsODM6ICAgICAgIHByaW50ZiAoIihBTlNJIFBhc2NhbCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX0FkYTgzOiAgICAgICAgICBwcmludGYgKCIoQWRhKSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfQ29ib2w3NDogICAgICAgIHByaW50ZiAoIihDb2JvbCA3NCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX0NvYm9sODU6ICAgICAgICBwcmludGYgKCIoQ29ib2wgODUpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19NaXBzX0Fzc2VtYmxlcjogcHJpbnRmICgiKE1JUFMgYXNzZW1ibGVyKSIpOyBicmVhazsKLQlkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIihVbmtub3duOiAlbHgpIiwgdXZhbHVlKTsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2VuY29kaW5nOgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfQVRFX3ZvaWQ6ICAgICAgICAgICAgcHJpbnRmICgiKHZvaWQpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX2FkZHJlc3M6ICAgICAgICAgcHJpbnRmICgiKG1hY2hpbmUgYWRkcmVzcykiKTsgYnJlYWs7Ci0JY2FzZSBEV19BVEVfYm9vbGVhbjogICAgICAgICBwcmludGYgKCIoYm9vbGVhbikiKTsgYnJlYWs7Ci0JY2FzZSBEV19BVEVfY29tcGxleF9mbG9hdDogICBwcmludGYgKCIoY29tcGxleCBmbG9hdCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19BVEVfZmxvYXQ6ICAgICAgICAgICBwcmludGYgKCIoZmxvYXQpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX3NpZ25lZDogICAgICAgICAgcHJpbnRmICgiKHNpZ25lZCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19BVEVfc2lnbmVkX2NoYXI6ICAgICBwcmludGYgKCIoc2lnbmVkIGNoYXIpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX3Vuc2lnbmVkOiAgICAgICAgcHJpbnRmICgiKHVuc2lnbmVkKSIpOyBicmVhazsKLQljYXNlIERXX0FURV91bnNpZ25lZF9jaGFyOiAgIHByaW50ZiAoIih1bnNpZ25lZCBjaGFyKSIpOyBicmVhazsKLQlkZWZhdWx0OgotCSAgaWYgKHV2YWx1ZSA+PSBEV19BVEVfbG9fdXNlcgotCSAgICAgICYmIHV2YWx1ZSA8PSBEV19BVEVfaGlfdXNlcikKLQkgICAgcHJpbnRmICgiKHVzZXIgZGVmaW5lZCB0eXBlKSIpOwotCSAgZWxzZQotCSAgICBwcmludGYgKCIodW5rbm93biB0eXBlKSIpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2FjY2Vzc2liaWxpdHk6Ci0gICAgICBzd2l0Y2ggKHV2YWx1ZSkKLQl7Ci0JY2FzZSBEV19BQ0NFU1NfcHVibGljOgkJcHJpbnRmICgiKHB1YmxpYykiKTsgYnJlYWs7Ci0JY2FzZSBEV19BQ0NFU1NfcHJvdGVjdGVkOglwcmludGYgKCIocHJvdGVjdGVkKSIpOyBicmVhazsKLQljYXNlIERXX0FDQ0VTU19wcml2YXRlOgkJcHJpbnRmICgiKHByaXZhdGUpIik7IGJyZWFrOwotCWRlZmF1bHQ6CQkgICAgICAgIHByaW50ZiAoIih1bmtub3duIGFjY2Vzc2liaWxpdHkpIik7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF92aXNpYmlsaXR5OgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfVklTX2xvY2FsOglwcmludGYgKCIobG9jYWwpIik7IGJyZWFrOwotCWNhc2UgRFdfVklTX2V4cG9ydGVkOglwcmludGYgKCIoZXhwb3J0ZWQpIik7IGJyZWFrOwotCWNhc2UgRFdfVklTX3F1YWxpZmllZDoJcHJpbnRmICgiKHF1YWxpZmllZCkiKTsgYnJlYWs7Ci0JZGVmYXVsdDoJCXByaW50ZiAoIih1bmtub3duIHZpc2liaWxpdHkpIik7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF92aXJ0dWFsaXR5OgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfVklSVFVBTElUWV9ub25lOglwcmludGYgKCIobm9uZSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19WSVJUVUFMSVRZX3ZpcnR1YWw6CXByaW50ZiAoIih2aXJ0dWFsKSIpOyBicmVhazsKLQljYXNlIERXX1ZJUlRVQUxJVFlfcHVyZV92aXJ0dWFsOnByaW50ZiAoIihwdXJlX3ZpcnR1YWwpIik7IGJyZWFrOwotCWRlZmF1bHQ6CQkgICAgICAgIHByaW50ZiAoIih1bmtub3duIHZpcnR1YWxpdHkpIik7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9pZGVudGlmaWVyX2Nhc2U6Ci0gICAgICBzd2l0Y2ggKHV2YWx1ZSkKLQl7Ci0JY2FzZSBEV19JRF9jYXNlX3NlbnNpdGl2ZToJcHJpbnRmICgiKGNhc2Vfc2Vuc2l0aXZlKSIpOyBicmVhazsKLQljYXNlIERXX0lEX3VwX2Nhc2U6CQlwcmludGYgKCIodXBfY2FzZSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19JRF9kb3duX2Nhc2U6CQlwcmludGYgKCIoZG93bl9jYXNlKSIpOyBicmVhazsKLQljYXNlIERXX0lEX2Nhc2VfaW5zZW5zaXRpdmU6CXByaW50ZiAoIihjYXNlX2luc2Vuc2l0aXZlKSIpOyBicmVhazsKLQlkZWZhdWx0OgkJICAgICAgICBwcmludGYgKCIodW5rbm93biBjYXNlKSIpOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfY2FsbGluZ19jb252ZW50aW9uOgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfQ0Nfbm9ybWFsOglwcmludGYgKCIobm9ybWFsKSIpOyBicmVhazsKLQljYXNlIERXX0NDX3Byb2dyYW06CXByaW50ZiAoIihwcm9ncmFtKSIpOyBicmVhazsKLQljYXNlIERXX0NDX25vY2FsbDoJcHJpbnRmICgiKG5vY2FsbCkiKTsgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGlmICh1dmFsdWUgPj0gRFdfQ0NfbG9fdXNlcgotCSAgICAgICYmIHV2YWx1ZSA8PSBEV19DQ19oaV91c2VyKQotCSAgICBwcmludGYgKCIodXNlciBkZWZpbmVkKSIpOwotCSAgZWxzZQotCSAgICBwcmludGYgKCIodW5rbm93biBjb252ZW50aW9uKSIpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9sb2NhdGlvbjoKLSAgICBjYXNlIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uOgotICAgIGNhc2UgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb246Ci0gICAgICBwcmludGYgKCIoIik7Ci0gICAgICBkZWNvZGVfbG9jYXRpb25fZXhwcmVzc2lvbiAoYmxvY2tfc3RhcnQsIHBvaW50ZXJfc2l6ZSk7Ci0gICAgICBwcmludGYgKCIpIik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcHJpbnRmICgiXG4iKTsKLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyBpbnQKLWRpc3BsYXlfZGVidWdfaW5mbyAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7Ci0gICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlOwotewotICB1bnNpZ25lZCBjaGFyICogZW5kID0gc3RhcnQgKyBzZWN0aW9uLT5zaF9zaXplOwotICB1bnNpZ25lZCBjaGFyICogc2VjdGlvbl9iZWdpbiA9IHN0YXJ0OwotCi0gIHByaW50ZiAoXygiVGhlIHNlY3Rpb24gJXMgY29udGFpbnM6XG5cbiIpLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICB3aGlsZSAoc3RhcnQgPCBlbmQpCi0gICAgewotICAgICAgRFdBUkYyX0V4dGVybmFsX0NvbXBVbml0ICogZXh0ZXJuYWw7Ci0gICAgICBEV0FSRjJfSW50ZXJuYWxfQ29tcFVuaXQgICBjb21wdW5pdDsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKiAgICAgICAgICAgIHRhZ3M7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBpOwotICAgICAgaW50CQkJIGxldmVsOwotCi0gICAgICBleHRlcm5hbCA9IChEV0FSRjJfRXh0ZXJuYWxfQ29tcFVuaXQgKikgc3RhcnQ7Ci0KLSAgICAgIGNvbXB1bml0LmN1X2xlbmd0aCAgICAgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmN1X2xlbmd0aCk7Ci0gICAgICBjb21wdW5pdC5jdV92ZXJzaW9uICAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5jdV92ZXJzaW9uKTsKLSAgICAgIGNvbXB1bml0LmN1X2FiYnJldl9vZmZzZXQgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmN1X2FiYnJldl9vZmZzZXQpOwotICAgICAgY29tcHVuaXQuY3VfcG9pbnRlcl9zaXplICA9IEJZVEVfR0VUIChleHRlcm5hbC0+Y3VfcG9pbnRlcl9zaXplKTsKLQotICAgICAgdGFncyA9IHN0YXJ0ICsgc2l6ZW9mICgqIGV4dGVybmFsKTsKLSAgICAgIHN0YXJ0ICs9IGNvbXB1bml0LmN1X2xlbmd0aCArIHNpemVvZiAoZXh0ZXJuYWwtPmN1X2xlbmd0aCk7Ci0KLSAgICAgIGlmIChjb21wdW5pdC5jdV92ZXJzaW9uICE9IDIpCi0JewotCSAgd2FybiAoXygiT25seSB2ZXJzaW9uIDIgRFdBUkYgZGVidWcgaW5mb3JtYXRpb24gaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgcHJpbnRmIChfKCIgIENvbXBpbGF0aW9uIFVuaXQ6XG4iKSk7Ci0gICAgICBwcmludGYgKF8oIiAgIExlbmd0aDogICAgICAgICVsZFxuIiksIGNvbXB1bml0LmN1X2xlbmd0aCk7Ci0gICAgICBwcmludGYgKF8oIiAgIFZlcnNpb246ICAgICAgICVkXG4iKSwgY29tcHVuaXQuY3VfdmVyc2lvbik7Ci0gICAgICBwcmludGYgKF8oIiAgIEFiYnJldiBPZmZzZXQ6ICVsZFxuIiksIGNvbXB1bml0LmN1X2FiYnJldl9vZmZzZXQpOwotICAgICAgcHJpbnRmIChfKCIgICBQb2ludGVyIFNpemU6ICAlZFxuIiksIGNvbXB1bml0LmN1X3BvaW50ZXJfc2l6ZSk7Ci0KLSAgICAgIGlmIChmaXJzdF9hYmJyZXYgIT0gTlVMTCkKLQlmcmVlX2FiYnJldnMgKCk7Ci0KLSAgICAgIC8qIFJlYWQgaW4gdGhlIGFiYnJldnMgdXNlZCBieSB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi0gICAgICB7Ci0JRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlYzsKLQl1bnNpZ25lZCBjaGFyICogICAgICAgYmVnaW47Ci0KLQkvKiBMb2NhdGUgdGhlIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbiBhbmQgcHJvY2VzcyBpdC4gICovCi0JZm9yIChpID0gMCwgc2VjID0gc2VjdGlvbl9oZWFkZXJzOwotCSAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLQkgICAgIGkgKyssIHNlYyArKykKLQkgIGlmIChzdHJjbXAgKFNFQ1RJT05fTkFNRSAoc2VjKSwgIi5kZWJ1Z19hYmJyZXYiKSA9PSAwKQotCSAgICBicmVhazsKLQotCWlmIChpID09IC0xIHx8IHNlYy0+c2hfc2l6ZSA9PSAwKQotCSAgewotCSAgICB3YXJuIChfKCJVbmFibGUgdG8gbG9jYXRlIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbiFcbiIpKTsKLQkgICAgcmV0dXJuIDA7Ci0JICB9Ci0KLQlHRVRfREFUQV9BTExPQyAoc2VjLT5zaF9vZmZzZXQsIHNlYy0+c2hfc2l6ZSwgYmVnaW4sIHVuc2lnbmVkIGNoYXIgKiwKLQkJCSJkZWJ1Z19hYmJyZXYgc2VjdGlvbiBkYXRhIik7Ci0KLQlwcm9jZXNzX2FiYnJldl9zZWN0aW9uIChiZWdpbiArIGNvbXB1bml0LmN1X2FiYnJldl9vZmZzZXQsCi0JCQkJYmVnaW4gKyBzZWMtPnNoX3NpemUpOwotCi0JZnJlZSAoYmVnaW4pOwotICAgICAgfQotCi0gICAgICBsZXZlbCA9IDA7Ci0gICAgICB3aGlsZSAodGFncyA8IHN0YXJ0KQotCXsKLQkgIGludCAgICAgICAgICAgIGJ5dGVzX3JlYWQ7Ci0JICB1bnNpZ25lZCBsb25nICBhYmJyZXZfbnVtYmVyOwotCSAgYWJicmV2X2VudHJ5ICogZW50cnk7Ci0JICBhYmJyZXZfYXR0ciAgKiBhdHRyOwotCi0JICBhYmJyZXZfbnVtYmVyID0gcmVhZF9sZWIxMjggKHRhZ3MsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICB0YWdzICs9IGJ5dGVzX3JlYWQ7Ci0KLQkgIC8qIEEgbnVsbCBESUUgbWFya3MgdGhlIGVuZCBvZiBhIGxpc3Qgb2YgY2hpbGRyZW4uICAqLwotCSAgaWYgKGFiYnJldl9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIC0tbGV2ZWw7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogU2NhbiB0aHJvdWdoIHRoZSBhYmJyZXZpYXRpb24gbGlzdCB1bnRpbCB3ZSByZWFjaCB0aGUKLQkgICAgIGNvcnJlY3QgZW50cnkuICAqLwotCSAgZm9yIChlbnRyeSA9IGZpcnN0X2FiYnJldjsKLQkgICAgICAgZW50cnkgJiYgZW50cnktPmVudHJ5ICE9IGFiYnJldl9udW1iZXI7Ci0JICAgICAgIGVudHJ5ID0gZW50cnktPm5leHQpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoZW50cnkgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHdhcm4gKF8oIlVuYWJsZSB0byBsb2NhdGUgZW50cnkgJWx1IGluIHRoZSBhYmJyZXZpYXRpb24gdGFibGVcbiIpLAotCQkgICAgYWJicmV2X251bWJlcik7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQotCSAgcHJpbnRmIChfKCIgPCVkPjwleD46IEFiYnJldiBOdW1iZXI6ICVsdSAoJXMpXG4iKSwKLQkJICBsZXZlbCwgdGFncyAtIHNlY3Rpb25fYmVnaW4gLSBieXRlc19yZWFkLAotCQkgIGFiYnJldl9udW1iZXIsCi0JCSAgZ2V0X1RBR19uYW1lIChlbnRyeS0+dGFnKSk7Ci0KLQkgIGZvciAoYXR0ciA9IGVudHJ5LT5maXJzdF9hdHRyOyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4dCkKLQkgICAgdGFncyA9IHJlYWRfYW5kX2Rpc3BsYXlfYXR0ciAoYXR0ci0+YXR0cmlidXRlLAotCQkJCQkgIGF0dHItPmZvcm0sCi0JCQkJCSAgdGFncywKLQkJCQkJICBjb21wdW5pdC5jdV9wb2ludGVyX3NpemUpOwotCi0JICBpZiAoZW50cnktPmNoaWxkcmVuKQotCSAgICArK2xldmVsOwotCX0KLSAgICB9Ci0KLSAgcHJpbnRmICgiXG4iKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19hcmFuZ2VzIChzZWN0aW9uLCBzdGFydCwgZmlsZSkKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKiAgICAgICBzdGFydDsKLSAgICAgRklMRSAqICAgICAgICAgICAgICAgIGZpbGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgdW5zaWduZWQgY2hhciAqIGVuZCA9IHN0YXJ0ICsgc2VjdGlvbi0+c2hfc2l6ZTsKLQotICBwcmludGYgKF8oIlRoZSBzZWN0aW9uICVzIGNvbnRhaW5zOlxuXG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgd2hpbGUgKHN0YXJ0IDwgZW5kKQotICAgIHsKLSAgICAgIERXQVJGMl9FeHRlcm5hbF9BUmFuZ2UgKiBleHRlcm5hbDsKLSAgICAgIERXQVJGMl9JbnRlcm5hbF9BUmFuZ2UgICBhcmFuZ2U7Ci0gICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgcmFuZ2VzOwotICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIGxlbmd0aDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBhZGRyZXNzOwotICAgICAgaW50CQkgICAgICAgZXhjZXNzOwotCi0gICAgICBleHRlcm5hbCA9IChEV0FSRjJfRXh0ZXJuYWxfQVJhbmdlICopIHN0YXJ0OwotCi0gICAgICBhcmFuZ2UuYXJfbGVuZ3RoICAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl9sZW5ndGgpOwotICAgICAgYXJhbmdlLmFyX3ZlcnNpb24gICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfdmVyc2lvbik7Ci0gICAgICBhcmFuZ2UuYXJfaW5mb19vZmZzZXQgID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl9pbmZvX29mZnNldCk7Ci0gICAgICBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl9wb2ludGVyX3NpemUpOwotICAgICAgYXJhbmdlLmFyX3NlZ21lbnRfc2l6ZSA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfc2VnbWVudF9zaXplKTsKLQotICAgICAgcHJpbnRmIChfKCIgIExlbmd0aDogICAgICAgICAgICAgICAgICAgJWxkXG4iKSwgYXJhbmdlLmFyX2xlbmd0aCk7Ci0gICAgICBwcmludGYgKF8oIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAlZFxuIiksIGFyYW5nZS5hcl92ZXJzaW9uKTsKLSAgICAgIHByaW50ZiAoXygiICBPZmZzZXQgaW50byAuZGVidWdfaW5mbzogICVseFxuIiksIGFyYW5nZS5hcl9pbmZvX29mZnNldCk7Ci0gICAgICBwcmludGYgKF8oIiAgUG9pbnRlciBTaXplOiAgICAgICAgICAgICAlZFxuIiksIGFyYW5nZS5hcl9wb2ludGVyX3NpemUpOwotICAgICAgcHJpbnRmIChfKCIgIFNlZ21lbnQgU2l6ZTogICAgICAgICAgICAgJWRcbiIpLCBhcmFuZ2UuYXJfc2VnbWVudF9zaXplKTsKLQotICAgICAgcHJpbnRmIChfKCJcbiAgICBBZGRyZXNzICBMZW5ndGhcbiIpKTsKLQotICAgICAgcmFuZ2VzID0gc3RhcnQgKyBzaXplb2YgKCogZXh0ZXJuYWwpOwotCi0gICAgICAvKiBNdXN0IHBhZCB0byBhbiBhbGlnbm1lbnQgYm91bmRhcnkgdGhhdCBpcyB0d2ljZSB0aGUgcG9pbnRlciBzaXplLiAgKi8KLSAgICAgIGV4Y2VzcyA9IHNpemVvZiAoKmV4dGVybmFsKSAlICgyICogYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZSk7Ci0gICAgICBpZiAoZXhjZXNzKQotCXJhbmdlcyArPSAoMiAqIGFyYW5nZS5hcl9wb2ludGVyX3NpemUpIC0gZXhjZXNzOwotCi0gICAgICBmb3IgKDs7KQotCXsKLQkgIGFkZHJlc3MgPSBieXRlX2dldCAocmFuZ2VzLCBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplKTsKLQotCSAgcmFuZ2VzICs9IGFyYW5nZS5hcl9wb2ludGVyX3NpemU7Ci0KLQkgIGxlbmd0aCAgPSBieXRlX2dldCAocmFuZ2VzLCBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplKTsKLQotCSAgcmFuZ2VzICs9IGFyYW5nZS5hcl9wb2ludGVyX3NpemU7Ci0KLQkgIC8qIEEgcGFpciBvZiB6ZXJvcyBtYXJrcyB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgKi8KLQkgIGlmIChhZGRyZXNzID09IDAgJiYgbGVuZ3RoID09IDApCi0JICAgIGJyZWFrOwotCi0JICBwcmludGYgKCIgICAgJTguOGx4ICVsdVxuIiwgYWRkcmVzcywgbGVuZ3RoKTsKLQl9Ci0KLSAgICAgIHN0YXJ0ICs9IGFyYW5nZS5hcl9sZW5ndGggKyBzaXplb2YgKGV4dGVybmFsLT5hcl9sZW5ndGgpOwotICAgIH0KLQotICBwcmludGYgKCJcbiIpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLWRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgRklMRSAqICAgICAgICAgICAgICAgIGZpbGUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcHJpbnRmIChfKCJEaXNwbGF5aW5nIHRoZSBkZWJ1ZyBjb250ZW50cyBvZiBzZWN0aW9uICVzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLlxuIiksCi0JICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBQcmUtc2NhbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiB0byByZWNvcmQgdGhlIHNpemUgb2YgYWRkcmVzcy4KLSAgIFdoZW4gZHVtcGluZyB0aGUgLmRlYnVnX2xpbmUsIHdlIHVzZSB0aGF0IHNpemUgaW5mb3JtYXRpb24sIGFzc3VtaW5nCi0gICB0aGF0IGFsbCBjb21waWxhdGlvbiB1bml0cyBoYXZlIHRoZSBzYW1lIGFkZHJlc3Mgc2l6ZS4gICovCi1zdGF0aWMgaW50Ci1wcmVzY2FuX2RlYnVnX2luZm8gKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7Ci0gICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIERXQVJGMl9FeHRlcm5hbF9Db21wVW5pdCAqIGV4dGVybmFsOwotCi0gIGV4dGVybmFsID0gKERXQVJGMl9FeHRlcm5hbF9Db21wVW5pdCAqKSBzdGFydDsKLQotICBkZWJ1Z19saW5lX3BvaW50ZXJfc2l6ZSA9IEJZVEVfR0VUIChleHRlcm5hbC0+Y3VfcG9pbnRlcl9zaXplKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLSAgLyogQSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgbmFtZSBvZiBhIGRlYnVnIHNlY3Rpb24gYW5kIGEgcG9pbnRlcgotICAgICB0byBhIGZ1bmN0aW9uIHRoYXQgY2FuIGRlY29kZSBpdC4gIFRoZSB0aGlyZCBmaWVsZCBpcyBhIHByZXNjYW4KLSAgICAgZnVuY3Rpb24gdG8gYmUgcnVuIG92ZXIgdGhlIHNlY3Rpb24gYmVmb3JlIGRpc3BsYXlpbmcgYW55IG9mIHRoZQotICAgICBzZWN0aW9ucy4gICovCi1zdHJ1Y3QKLXsKLSAgY2hhciAqIG5hbWU7Ci0gIGludCAoKiBkaXNwbGF5KSBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIHVuc2lnbmVkIGNoYXIgKiwgRklMRSAqKSk7Ci0gIGludCAoKiBwcmVzY2FuKSBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIHVuc2lnbmVkIGNoYXIgKiwgRklMRSAqKSk7Ci19Ci1kZWJ1Z19kaXNwbGF5c1tdID0KLXsKLSAgeyAiLmRlYnVnX2luZm8iLCAgICAgICAgZGlzcGxheV9kZWJ1Z19pbmZvLCBwcmVzY2FuX2RlYnVnX2luZm8gfSwKLSAgeyAiLmRlYnVnX2FiYnJldiIsICAgICAgZGlzcGxheV9kZWJ1Z19hYmJyZXYsIE5VTEwgfSwKLSAgeyAiLmRlYnVnX2xpbmUiLCAgICAgICAgZGlzcGxheV9kZWJ1Z19saW5lcywgTlVMTCB9LAotICB7ICIuZGVidWdfYXJhbmdlcyIsICAgICBkaXNwbGF5X2RlYnVnX2FyYW5nZXMsIE5VTEwgfSwKLSAgeyAiLmRlYnVnX3B1Ym5hbWVzIiwgICAgZGlzcGxheV9kZWJ1Z19wdWJuYW1lcywgTlVMTCB9LAotICB7ICIuZGVidWdfbWFjaW5mbyIsICAgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQsIE5VTEwgfSwKLSAgeyAiLmRlYnVnX2ZyYW1lIiwgICAgICAgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkLCBOVUxMIH0sCi0gIHsgIi5kZWJ1Z19zdHIiLCAgICAgICAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCwgTlVMTCB9LAotICB7ICIuZGVidWdfc3RhdGljX2Z1bmMiLCBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQsIE5VTEwgfSwKLSAgeyAiLmRlYnVnX3N0YXRpY192YXJzIiwgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkLCBOVUxMIH0sCi0gIHsgIi5kZWJ1Z190eXBlcyIsICAgICAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCwgTlVMTCB9LAotICB7ICIuZGVidWdfd2Vha25hbWVzIiwgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQsIE5VTEwgfQotfTsKLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19zZWN0aW9uIChzZWN0aW9uLCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIGNoYXIgKiAgICAgICAgICBuYW1lID0gU0VDVElPTl9OQU1FIChzZWN0aW9uKTsKLSAgYmZkX3NpemVfdHlwZSAgIGxlbmd0aDsKLSAgdW5zaWduZWQgY2hhciAqIHN0YXJ0OwotICBpbnQgICAgICAgICAgICAgaTsKLQotICBsZW5ndGggPSBzZWN0aW9uLT5zaF9zaXplOwotICBpZiAobGVuZ3RoID09IDApCi0gICAgewotICAgICAgcHJpbnRmIChfKCJcblNlY3Rpb24gJyVzJyBoYXMgbm8gZGVidWdnaW5nIGRhdGEuXG4iKSwgbmFtZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgbGVuZ3RoLCBzdGFydCwgdW5zaWduZWQgY2hhciAqLAotCQkgICJkZWJ1ZyBzZWN0aW9uIGRhdGEiKTsKLQotICAvKiBTZWUgaWYgd2Uga25vdyBob3cgdG8gZGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uLiAgKi8KLSAgZm9yIChpID0gTlVNX0VMRU0gKGRlYnVnX2Rpc3BsYXlzKTsgaS0tOykKLSAgICBpZiAoc3RyY21wIChkZWJ1Z19kaXNwbGF5c1tpXS5uYW1lLCBuYW1lKSA9PSAwKQotICAgICAgewotCWRlYnVnX2Rpc3BsYXlzW2ldLmRpc3BsYXkgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKTsKLQlicmVhazsKLSAgICAgIH0KLQotICBpZiAoaSA9PSAtMSkKLSAgICBwcmludGYgKF8oIlVucmVjb2duaXNlZCBkZWJ1ZyBzZWN0aW9uOiAlc1xuIiksIG5hbWUpOwotCi0gIGZyZWUgKHN0YXJ0KTsKLQotICAvKiBJZiB3ZSBsb2FkZWQgaW4gdGhlIGFiYnJldiBzZWN0aW9uIGF0IHNvbWUgcG9pbnQsCi0gICAgIHdlIG11c3QgcmVsZWFzZSBpdCBoZXJlLiAgKi8KLSAgaWYgKGZpcnN0X2FiYnJldiAhPSBOVUxMKQotICAgIGZyZWVfYWJicmV2cyAoKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19zZWN0aW9uX2NvbnRlbnRzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247Ci0gIHVuc2lnbmVkIGludCAgCWk7Ci0KLSAgaWYgKCEgZG9fZHVtcCkKLSAgICByZXR1cm4gMTsKLQotICAvKiBQcmUtc2NhbiB0aGUgZGVidWcgc2VjdGlvbnMgdG8gZmluZCBzb21lIGRlYnVnIGluZm9ybWF0aW9uIG5vdAotICAgICBwcmVzZW50IGluIHNvbWUgb2YgdGhlbS4gIEZvciB0aGUgLmRlYnVnX2xpbmUsIHdlIG11c3QgZmluZCBvdXQgdGhlCi0gICAgIHNpemUgb2YgYWRkcmVzcyAoc3BlY2lmaWVkIGluIC5kZWJ1Z19pbmZvIGFuZCAuZGVidWdfYXJhbmdlcykuICAqLwotICBmb3IgKGkgPSAwLCBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW0gJiYgaSA8IG51bV9kdW1wX3NlY3RzOwotICAgICAgIGkgKyssIHNlY3Rpb24gKyspCi0gICAgewotICAgICAgY2hhciAqCW5hbWUgPSBTRUNUSU9OX05BTUUgKHNlY3Rpb24pOwotICAgICAgaW50ICAgICAgIGo7Ci0KLSAgICAgIGlmIChzZWN0aW9uLT5zaF9zaXplID09IDApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBTZWUgaWYgdGhlcmUgaXMgc29tZSBwcmUtc2NhbiBvcGVyYXRpb24gZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBmb3IgKGogPSBOVU1fRUxFTSAoZGVidWdfZGlzcGxheXMpOyBqLS07KQotICAgICAgICBpZiAoc3RyY21wIChkZWJ1Z19kaXNwbGF5c1tqXS5uYW1lLCBuYW1lKSA9PSAwKQotCSAgewotCSAgICBpZiAoZGVidWdfZGlzcGxheXNbal0ucHJlc2NhbiAhPSBOVUxMKQotCSAgICAgIHsKLQkJYmZkX3NpemVfdHlwZSAgIGxlbmd0aDsKLQkJdW5zaWduZWQgY2hhciAqIHN0YXJ0OwotCi0JCWxlbmd0aCA9IHNlY3Rpb24tPnNoX3NpemU7Ci0JCUdFVF9EQVRBX0FMTE9DIChzZWN0aW9uLT5zaF9vZmZzZXQsIGxlbmd0aCwgc3RhcnQsIHVuc2lnbmVkIGNoYXIgKiwKLQkJCQkiZGVidWcgc2VjdGlvbiBkYXRhIik7Ci0KLQkJZGVidWdfZGlzcGxheXNbal0ucHJlc2NhbiAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpOwotCQlmcmVlIChzdGFydCk7Ci0JICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bSAmJiBpIDwgbnVtX2R1bXBfc2VjdHM7Ci0gICAgICAgaSArKywgc2VjdGlvbiArKykKLSAgICB7Ci0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotICAgICAgaWYgKGR1bXBfc2VjdHNbaV0gJiBESVNBU1NfRFVNUCkKLQlkaXNhc3NlbWJsZV9zZWN0aW9uIChzZWN0aW9uLCBmaWxlKTsKLSNlbmRpZgotICAgICAgaWYgKGR1bXBfc2VjdHNbaV0gJiBIRVhfRFVNUCkKLQlkdW1wX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpOwotCi0gICAgICBpZiAoZHVtcF9zZWN0c1tpXSAmIERFQlVHX0RVTVApCi0JZGlzcGxheV9kZWJ1Z19zZWN0aW9uIChzZWN0aW9uLCBmaWxlKTsKLSAgICB9Ci0KLSAgaWYgKGkgPCBudW1fZHVtcF9zZWN0cykKLSAgICB3YXJuIChfKCJTb21lIHNlY3Rpb25zIHdlcmUgbm90IGR1bXBlZCBiZWNhdXNlIHRoZXkgZG8gbm90IGV4aXN0IVxuIikpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19taXBzX2ZwZV9leGNlcHRpb24gKG1hc2spCi0gICAgIGludCBtYXNrOwotewotICBpZiAobWFzaykKLSAgICB7Ci0gICAgICBpbnQgZmlyc3QgPSAxOwotICAgICAgaWYgKG1hc2sgJiBPRVhfRlBVX0lORVgpCi0JZnB1dHMgKCJJTkVYIiwgc3Rkb3V0KSwgZmlyc3QgPSAwOwotICAgICAgaWYgKG1hc2sgJiBPRVhfRlBVX1VGTE8pCi0JcHJpbnRmICgiJXNVRkxPIiwgZmlyc3QgPyAiIiA6ICJ8IiksIGZpcnN0ID0gMDsKLSAgICAgIGlmIChtYXNrICYgT0VYX0ZQVV9PRkxPKQotCXByaW50ZiAoIiVzT0ZMTyIsIGZpcnN0ID8gIiIgOiAifCIpLCBmaXJzdCA9IDA7Ci0gICAgICBpZiAobWFzayAmIE9FWF9GUFVfRElWMCkKLQlwcmludGYgKCIlc0RJVjAiLCBmaXJzdCA/ICIiIDogInwiKSwgZmlyc3QgPSAwOwotICAgICAgaWYgKG1hc2sgJiBPRVhfRlBVX0lOVkFMKQotCXByaW50ZiAoIiVzSU5WQUwiLCBmaXJzdCA/ICIiIDogInwiKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmcHV0cyAoIjAiLCBzdGRvdXQpOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX21pcHNfc3BlY2lmaWMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGZfSW50ZXJuYWxfRHluICogZW50cnk7Ci0gIHNpemVfdCBsaWJsaXN0X29mZnNldCA9IDA7Ci0gIHNpemVfdCBsaWJsaXN0bm8gPSAwOwotICBzaXplX3QgY29uZmxpY3Rzbm8gPSAwOwotICBzaXplX3Qgb3B0aW9uc19vZmZzZXQgPSAwOwotICBzaXplX3QgY29uZmxpY3RzX29mZnNldCA9IDA7Ci0KLSAgLyogV2UgaGF2ZSBhIGxvdCBvZiBzcGVjaWFsIHNlY3Rpb25zLiAgVGhhbmtzIFNHSSEgICovCi0gIGlmIChkeW5hbWljX3NlZ21lbnQgPT0gTlVMTCkKLSAgICAvKiBObyBpbmZvcm1hdGlvbiBhdmFpbGFibGUuICAqLwotICAgIHJldHVybiAwOwotCi0gIGZvciAoZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7IGVudHJ5LT5kX3RhZyAhPSBEVF9OVUxMOyArK2VudHJ5KQotICAgIHN3aXRjaCAoZW50cnktPmRfdGFnKQotICAgICAgewotICAgICAgY2FzZSBEVF9NSVBTX0xJQkxJU1Q6Ci0JbGlibGlzdF9vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCWJyZWFrOwotICAgICAgY2FzZSBEVF9NSVBTX0xJQkxJU1ROTzoKLQlsaWJsaXN0bm8gPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQlicmVhazsKLSAgICAgIGNhc2UgRFRfTUlQU19PUFRJT05TOgotCW9wdGlvbnNfb2Zmc2V0ID0gZW50cnktPmRfdW4uZF92YWwgLSBsb2FkYWRkcjsKLQlicmVhazsKLSAgICAgIGNhc2UgRFRfTUlQU19DT05GTElDVDoKLQljb25mbGljdHNfb2Zmc2V0ID0gZW50cnktPmRfdW4uZF92YWwgLSBsb2FkYWRkcjsKLQlicmVhazsKLSAgICAgIGNhc2UgRFRfTUlQU19DT05GTElDVE5POgotCWNvbmZsaWN0c25vID0gZW50cnktPmRfdW4uZF92YWw7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotCi0gIGlmIChsaWJsaXN0X29mZnNldCAhPSAwICYmIGxpYmxpc3RubyAhPSAwICYmIGRvX2R5bmFtaWMpCi0gICAgewotICAgICAgRWxmMzJfRXh0ZXJuYWxfTGliICogZWxpYjsKLSAgICAgIHNpemVfdCBjbnQ7Ci0KLSAgICAgIEdFVF9EQVRBX0FMTE9DIChsaWJsaXN0X29mZnNldCwgbGlibGlzdG5vICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9MaWIpLAotCQkgICAgICBlbGliLCBFbGYzMl9FeHRlcm5hbF9MaWIgKiwgImxpYmxpc3QiKTsKLQotICAgICAgcHJpbnRmICgiXG5TZWN0aW9uICcubGlibGlzdCcgY29udGFpbnMgJWQgZW50cmllczpcbiIsIGxpYmxpc3Rubyk7Ci0gICAgICBmcHV0cyAoIiAgICAgTGlicmFyeSAgICAgICAgICAgICAgVGltZSBTdGFtcCAgICAgICAgICBDaGVja3N1bSAgIFZlcnNpb24gRmxhZ3NcbiIsCi0JICAgICBzdGRvdXQpOwotCi0gICAgICBmb3IgKGNudCA9IDA7IGNudCA8IGxpYmxpc3RubzsgKytjbnQpCi0JewotCSAgRWxmMzJfTGliIGxpYmxpc3Q7Ci0JICB0aW1lX3QgdGltZTsKLQkgIGNoYXIgdGltZWJ1ZlsyMF07Ci0KLQkgIGxpYmxpc3QubF9uYW1lID0gQllURV9HRVQgKGVsaWJbY250XS5sX25hbWUpOwotCSAgdGltZSA9IEJZVEVfR0VUIChlbGliW2NudF0ubF90aW1lX3N0YW1wKTsKLQkgIGxpYmxpc3QubF9jaGVja3N1bSA9IEJZVEVfR0VUIChlbGliW2NudF0ubF9jaGVja3N1bSk7Ci0JICBsaWJsaXN0LmxfdmVyc2lvbiA9IEJZVEVfR0VUIChlbGliW2NudF0ubF92ZXJzaW9uKTsKLQkgIGxpYmxpc3QubF9mbGFncyA9IEJZVEVfR0VUIChlbGliW2NudF0ubF9mbGFncyk7Ci0KLQkgIHN0cmZ0aW1lICh0aW1lYnVmLCAyMCwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgZ210aW1lICgmdGltZSkpOwotCi0JICBwcmludGYgKCIlM2Q6ICUtMjBzICVzICUjMTBseCAlLTdsZCIsIGNudCwKLQkJICBkeW5hbWljX3N0cmluZ3MgKyBsaWJsaXN0LmxfbmFtZSwgdGltZWJ1ZiwKLQkJICBsaWJsaXN0LmxfY2hlY2tzdW0sIGxpYmxpc3QubF92ZXJzaW9uKTsKLQotCSAgaWYgKGxpYmxpc3QubF9mbGFncyA9PSAwKQotCSAgICBwdXRzICgiIE5PTkUiKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKiBuYW1lOwotCQlpbnQgYml0OwotCSAgICAgIH0KLQkgICAgICBsX2ZsYWdzX3ZhbHNbXSA9Ci0JICAgICAgewotCQl7ICIgRVhBQ1RfTUFUQ0giLCBMTF9FWEFDVF9NQVRDSCB9LAotCQl7ICIgSUdOT1JFX0lOVF9WRVIiLCBMTF9JR05PUkVfSU5UX1ZFUiB9LAotCQl7ICIgUkVRVUlSRV9NSU5PUiIsIExMX1JFUVVJUkVfTUlOT1IgfSwKLQkJeyAiIEVYUE9SVFMiLCBMTF9FWFBPUlRTIH0sCi0JCXsgIiBERUxBWV9MT0FEIiwgTExfREVMQVlfTE9BRCB9LAotCQl7ICIgREVMVEEiLCBMTF9ERUxUQSB9Ci0JICAgICAgfTsKLQkgICAgICBpbnQgZmxhZ3MgPSBsaWJsaXN0LmxfZmxhZ3M7Ci0JICAgICAgc2l6ZV90IGZjbnQ7Ci0KLQkgICAgICBmb3IgKGZjbnQgPSAwOwotCQkgICBmY250IDwgc2l6ZW9mIChsX2ZsYWdzX3ZhbHMpIC8gc2l6ZW9mIChsX2ZsYWdzX3ZhbHNbMF0pOwotCQkgICArK2ZjbnQpCi0JCWlmICgoZmxhZ3MgJiBsX2ZsYWdzX3ZhbHNbZmNudF0uYml0KSAhPSAwKQotCQkgIHsKLQkJICAgIGZwdXRzIChsX2ZsYWdzX3ZhbHNbZmNudF0ubmFtZSwgc3Rkb3V0KTsKLQkJICAgIGZsYWdzIF49IGxfZmxhZ3NfdmFsc1tmY250XS5iaXQ7Ci0JCSAgfQotCSAgICAgIGlmIChmbGFncyAhPSAwKQotCQlwcmludGYgKCIgJSN4IiwgKHVuc2lnbmVkIGludCkgZmxhZ3MpOwotCi0JICAgICAgcHV0cyAoIiIpOwotCSAgICB9Ci0JfQotCi0gICAgICBmcmVlIChlbGliKTsKLSAgICB9Ci0KLSAgaWYgKG9wdGlvbnNfb2Zmc2V0ICE9IDApCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX09wdGlvbnMgKiBlb3B0OwotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKiBzZWN0ID0gc2VjdGlvbl9oZWFkZXJzOwotICAgICAgRWxmX0ludGVybmFsX09wdGlvbnMgKiBpb3B0OwotICAgICAgRWxmX0ludGVybmFsX09wdGlvbnMgKiBvcHRpb247Ci0gICAgICBzaXplX3Qgb2Zmc2V0OwotICAgICAgaW50IGNudDsKLQotICAgICAgLyogRmluZCB0aGUgc2VjdGlvbiBoZWFkZXIgc28gdGhhdCB3ZSBnZXQgdGhlIHNpemUuICAqLwotICAgICAgd2hpbGUgKHNlY3QtPnNoX3R5cGUgIT0gU0hUX01JUFNfT1BUSU9OUykKLQkrK3NlY3Q7Ci0KLSAgICAgIEdFVF9EQVRBX0FMTE9DIChvcHRpb25zX29mZnNldCwgc2VjdC0+c2hfc2l6ZSwgZW9wdCwKLQkJICAgICAgRWxmX0V4dGVybmFsX09wdGlvbnMgKiwgIm9wdGlvbnMiKTsKLQotICAgICAgaW9wdCA9IChFbGZfSW50ZXJuYWxfT3B0aW9ucyAqKSBtYWxsb2MgKChzZWN0LT5zaF9zaXplIC8gc2l6ZW9mIChlb3B0KSkKLQkJCQkJICAgICAgKiBzaXplb2YgKCppb3B0KSk7Ci0gICAgICBpZiAoaW9wdCA9PSBOVUxMKQotCXsKLQkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBvZmZzZXQgPSBjbnQgPSAwOwotICAgICAgb3B0aW9uID0gaW9wdDsKLSAgICAgIHdoaWxlIChvZmZzZXQgPCBzZWN0LT5zaF9zaXplKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9PcHRpb25zICogZW9wdGlvbjsKLQotCSAgZW9wdGlvbiA9IChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSAoKGNoYXIgKikgZW9wdCArIG9mZnNldCk7Ci0KLQkgIG9wdGlvbi0+a2luZCA9IEJZVEVfR0VUIChlb3B0aW9uLT5raW5kKTsKLQkgIG9wdGlvbi0+c2l6ZSA9IEJZVEVfR0VUIChlb3B0aW9uLT5zaXplKTsKLQkgIG9wdGlvbi0+c2VjdGlvbiA9IEJZVEVfR0VUIChlb3B0aW9uLT5zZWN0aW9uKTsKLQkgIG9wdGlvbi0+aW5mbyA9IEJZVEVfR0VUIChlb3B0aW9uLT5pbmZvKTsKLQotCSAgb2Zmc2V0ICs9IG9wdGlvbi0+c2l6ZTsKLQkgICsrb3B0aW9uOwotCSAgKytjbnQ7Ci0JfQotCi0gICAgICBwcmludGYgKF8oIlxuU2VjdGlvbiAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iKSwKLQkgICAgICBzdHJpbmdfdGFibGUgKyBzZWN0LT5zaF9uYW1lLCBjbnQpOwotCi0gICAgICBvcHRpb24gPSBpb3B0OwotICAgICAgd2hpbGUgKGNudC0tID4gMCkKLQl7Ci0JICBzaXplX3QgbGVuOwotCi0JICBzd2l0Y2ggKG9wdGlvbi0+a2luZCkKLQkgICAgewotCSAgICBjYXNlIE9ES19OVUxMOgotCSAgICAgIC8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbi4gICovCi0JICAgICAgcHJpbnRmICgiIE5VTEwgICAgICAgJWQgJWx4Iiwgb3B0aW9uLT5zZWN0aW9uLCBvcHRpb24tPmluZm8pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19SRUdJTkZPOgotCSAgICAgIHByaW50ZiAoIiBSRUdJTkZPICAgICIpOwotCSAgICAgIGlmIChlbGZfaGVhZGVyLmVfbWFjaGluZSA9PSBFTV9NSVBTKQotCQl7Ci0JCSAgLyogMzJiaXQgZm9ybS4gICovCi0JCSAgRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqZXJlZzsKLQkJICBFbGYzMl9SZWdJbmZvIHJlZ2luZm87Ci0KLQkJICBlcmVnID0gKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKikgKG9wdGlvbiArIDEpOwotCQkgIHJlZ2luZm8ucmlfZ3BybWFzayA9IEJZVEVfR0VUIChlcmVnLT5yaV9ncHJtYXNrKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1swXSk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzFdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMV0pOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1syXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzJdKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1szXSk7Ci0JCSAgcmVnaW5mby5yaV9ncF92YWx1ZSA9IEJZVEVfR0VUIChlcmVnLT5yaV9ncF92YWx1ZSk7Ci0KLQkJICBwcmludGYgKCJHUFIgJTA4bHggIEdQIDB4JWx4XG4iLAotCQkJICByZWdpbmZvLnJpX2dwcm1hc2ssCi0JCQkgICh1bnNpZ25lZCBsb25nKSByZWdpbmZvLnJpX2dwX3ZhbHVlKTsKLQkJICBwcmludGYgKCIgICAgICAgICAgICBDUFIwICUwOGx4ICBDUFIxICUwOGx4ICBDUFIyICUwOGx4ICBDUFIzICUwOGx4XG4iLAotCQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0sIHJlZ2luZm8ucmlfY3BybWFza1sxXSwKLQkJCSAgcmVnaW5mby5yaV9jcHJtYXNrWzJdLCByZWdpbmZvLnJpX2Nwcm1hc2tbM10pOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogNjQgYml0IGZvcm0uICAqLwotCQkgIEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKiBlcmVnOwotCQkgIEVsZjY0X0ludGVybmFsX1JlZ0luZm8gcmVnaW5mbzsKLQotCQkgIGVyZWcgPSAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqKSAob3B0aW9uICsgMSk7Ci0JCSAgcmVnaW5mby5yaV9ncHJtYXNrICAgID0gQllURV9HRVQgKGVyZWctPnJpX2dwcm1hc2spOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1swXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzBdKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMV0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1sxXSk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzJdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMl0pOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1szXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzNdKTsKLQkJICByZWdpbmZvLnJpX2dwX3ZhbHVlICAgPSBCWVRFX0dFVDggKGVyZWctPnJpX2dwX3ZhbHVlKTsKLQotCQkgIHByaW50ZiAoIkdQUiAlMDhseCAgR1AgMHgiLAotCQkJICByZWdpbmZvLnJpX2dwcm1hc2spOwotCQkgIHByaW50Zl92bWEgKHJlZ2luZm8ucmlfZ3BfdmFsdWUpOwotCQkgIHByaW50ZiAoIlxuIik7Ci0KLQkJICBwcmludGYgKCIgICAgICAgICAgICBDUFIwICUwOGx4ICBDUFIxICUwOGx4ICBDUFIyICUwOGx4ICBDUFIzICUwOGx4XG4iLAotCQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0sIHJlZ2luZm8ucmlfY3BybWFza1sxXSwKLQkJCSAgcmVnaW5mby5yaV9jcHJtYXNrWzJdLCByZWdpbmZvLnJpX2Nwcm1hc2tbM10pOwotCQl9Ci0JICAgICAgKytvcHRpb247Ci0JICAgICAgY29udGludWU7Ci0JICAgIGNhc2UgT0RLX0VYQ0VQVElPTlM6Ci0JICAgICAgZnB1dHMgKCIgRVhDRVBUSU9OUyBmcGVfbWluKCIsIHN0ZG91dCk7Ci0JICAgICAgcHJvY2Vzc19taXBzX2ZwZV9leGNlcHRpb24gKG9wdGlvbi0+aW5mbyAmIE9FWF9GUFVfTUlOKTsKLQkgICAgICBmcHV0cyAoIikgZnBlX21heCgiLCBzdGRvdXQpOwotCSAgICAgIHByb2Nlc3NfbWlwc19mcGVfZXhjZXB0aW9uICgob3B0aW9uLT5pbmZvICYgT0VYX0ZQVV9NQVgpID4+IDgpOwotCSAgICAgIGZwdXRzICgiKSIsIHN0ZG91dCk7Ci0KLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0VYX1BBR0UwKQotCQlmcHV0cyAoIiBQQUdFMCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9FWF9TTU0pCi0JCWZwdXRzICgiIFNNTSIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9FWF9GUERCVUcpCi0JCWZwdXRzICgiIEZQREJVRyIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9FWF9ESVNNSVNTKQotCQlmcHV0cyAoIiBESVNNSVNTIiwgc3Rkb3V0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfUEFEOgotCSAgICAgIGZwdXRzICgiIFBBRCAgICAgICAiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPUEFEX1BSRUZJWCkKLQkJZnB1dHMgKCIgUFJFRklYIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT1BBRF9QT1NURklYKQotCQlmcHV0cyAoIiBQT1NURklYIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT1BBRF9TWU1CT0wpCi0JCWZwdXRzICgiIFNZTUJPTCIsIHN0ZG91dCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0hXUEFUQ0g6Ci0JICAgICAgZnB1dHMgKCIgSFdQQVRDSCAgICIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV19SNEtFT1ApCi0JCWZwdXRzICgiIFI0S0VPUCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV19SOEtQRkVUQ0gpCi0JCWZwdXRzICgiIFI4S1BGRVRDSCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV19SNUtFT1ApCi0JCWZwdXRzICgiIFI1S0VPUCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV19SNUtDVlRMKQotCQlmcHV0cyAoIiBSNUtDVlRMIiwgc3Rkb3V0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfRklMTDoKLQkgICAgICBmcHV0cyAoIiBGSUxMICAgICAgICIsIHN0ZG91dCk7Ci0JICAgICAgLyogWFhYIFByaW50IGNvbnRlbnQgb2YgaW5mbyB3b3JkPyAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfVEFHUzoKLQkgICAgICBmcHV0cyAoIiBUQUdTICAgICAgICIsIHN0ZG91dCk7Ci0JICAgICAgLyogWFhYIFByaW50IGNvbnRlbnQgb2YgaW5mbyB3b3JkPyAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfSFdBTkQ6Ci0JICAgICAgZnB1dHMgKCIgSFdBTkQgICAgICIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV0EwX1I0S0VPUF9DSEVDS0VEKQotCQlmcHV0cyAoIiBSNEtFT1BfQ0hFQ0tFRCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV0EwX1I0S0VPUF9DTEVBTikKLQkJZnB1dHMgKCIgUjRLRU9QX0NMRUFOIiwgc3Rkb3V0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfSFdPUjoKLQkgICAgICBmcHV0cyAoIiBIV09SICAgICAgIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXQTBfUjRLRU9QX0NIRUNLRUQpCi0JCWZwdXRzICgiIFI0S0VPUF9DSEVDS0VEIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT0hXQTBfUjRLRU9QX0NMRUFOKQotCQlmcHV0cyAoIiBSNEtFT1BfQ0xFQU4iLCBzdGRvdXQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19HUF9HUk9VUDoKLQkgICAgICBwcmludGYgKCIgR1BfR1JPVVAgICUjMDZseCAgc2VsZi1jb250YWluZWQgJSMwNmx4IiwKLQkJICAgICAgb3B0aW9uLT5pbmZvICYgT0dQX0dST1VQLAotCQkgICAgICAob3B0aW9uLT5pbmZvICYgT0dQX1NFTEYpID4+IDE2KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfSURFTlQ6Ci0JICAgICAgcHJpbnRmICgiIElERU5UICAgICAlIzA2bHggIHNlbGYtY29udGFpbmVkICUjMDZseCIsCi0JCSAgICAgIG9wdGlvbi0+aW5mbyAmIE9HUF9HUk9VUCwKLQkJICAgICAgKG9wdGlvbi0+aW5mbyAmIE9HUF9TRUxGKSA+PiAxNik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLiAgKi8KLQkgICAgICBwcmludGYgKCIgJTNkID8/PyAgICAgJWQgJWx4IiwKLQkJICAgICAgb3B0aW9uLT5raW5kLCBvcHRpb24tPnNlY3Rpb24sIG9wdGlvbi0+aW5mbyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgbGVuID0gc2l6ZW9mICgqZW9wdCk7Ci0JICB3aGlsZSAobGVuIDwgb3B0aW9uLT5zaXplKQotCSAgICBpZiAoKChjaGFyICopIG9wdGlvbilbbGVuXSA+PSAnICcKLQkJJiYgKChjaGFyICopIG9wdGlvbilbbGVuXSA8IDB4N2YpCi0JICAgICAgcHJpbnRmICgiJWMiLCAoKGNoYXIgKikgb3B0aW9uKVtsZW4rK10pOwotCSAgICBlbHNlCi0JICAgICAgcHJpbnRmICgiXFwlMDNvIiwgKChjaGFyICopIG9wdGlvbilbbGVuKytdKTsKLQotCSAgZnB1dHMgKCJcbiIsIHN0ZG91dCk7Ci0JICArK29wdGlvbjsKLQl9Ci0KLSAgICAgIGZyZWUgKGVvcHQpOwotICAgIH0KLQotICBpZiAoY29uZmxpY3RzX29mZnNldCAhPSAwICYmIGNvbmZsaWN0c25vICE9IDApCi0gICAgewotICAgICAgRWxmMzJfRXh0ZXJuYWxfQ29uZmxpY3QgKiBlY29uZjMyOwotICAgICAgRWxmNjRfRXh0ZXJuYWxfQ29uZmxpY3QgKiBlY29uZjY0OwotICAgICAgRWxmMzJfQ29uZmxpY3QgKiBpY29uZjsKLSAgICAgIHNpemVfdCBjbnQ7Ci0KLSAgICAgIGlmIChkeW5hbWljX3N5bWJvbHMgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoXygiY29uZmxpY3QgbGlzdCB3aXRoIHdpdGhvdXQgdGFibGUiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGljb25mID0gKEVsZjMyX0NvbmZsaWN0ICopIG1hbGxvYyAoY29uZmxpY3Rzbm8gKiBzaXplb2YgKCppY29uZikpOwotICAgICAgaWYgKGljb25mID09IE5VTEwpCi0JewotCSAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnkiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGlmIChpc18zMmJpdF9lbGYpCi0JewotCSAgR0VUX0RBVEFfQUxMT0MgKGNvbmZsaWN0c19vZmZzZXQsIGNvbmZsaWN0c25vICogc2l6ZW9mICgqZWNvbmYzMiksCi0JCQkgIGVjb25mMzIsIEVsZjMyX0V4dGVybmFsX0NvbmZsaWN0ICosICJjb25mbGljdCIpOwotCi0JICBmb3IgKGNudCA9IDA7IGNudCA8IGNvbmZsaWN0c25vOyArK2NudCkKLQkgICAgaWNvbmZbY250XSA9IEJZVEVfR0VUIChlY29uZjMyW2NudF0pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBHRVRfREFUQV9BTExPQyAoY29uZmxpY3RzX29mZnNldCwgY29uZmxpY3Rzbm8gKiBzaXplb2YgKCplY29uZjY0KSwKLQkJCSAgZWNvbmY2NCwgRWxmNjRfRXh0ZXJuYWxfQ29uZmxpY3QgKiwgImNvbmZsaWN0Iik7Ci0KLQkgIGZvciAoY250ID0gMDsgY250IDwgY29uZmxpY3Rzbm87ICsrY250KQotCSAgICBpY29uZltjbnRdID0gQllURV9HRVQgKGVjb25mNjRbY250XSk7Ci0JfQotCi0gICAgICBwcmludGYgKF8oIlxuU2VjdGlvbiAnLmNvbmZsaWN0JyBjb250YWlucyAlZCBlbnRyaWVzOlxuIiksIGNvbmZsaWN0c25vKTsKLSAgICAgIHB1dHMgKF8oIiAgTnVtOiAgICBJbmRleCAgICAgICBWYWx1ZSAgTmFtZSIpKTsKLQotICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBjb25mbGljdHNubzsgKytjbnQpCi0JewotCSAgRWxmX0ludGVybmFsX1N5bSAqIHBzeW0gPSAmZHluYW1pY19zeW1ib2xzW2ljb25mW2NudF1dOwotCi0JICBwcmludGYgKCIlNXU6ICU4bHUgICIsIGNudCwgaWNvbmZbY250XSk7Ci0JICBwcmludF92bWEgKHBzeW0tPnN0X3ZhbHVlLCBGVUxMX0hFWCk7Ci0JICBwcmludGYgKCIgICVzXG4iLCBkeW5hbWljX3N0cmluZ3MgKyBwc3ltLT5zdF9uYW1lKTsKLQl9Ci0KLSAgICAgIGZyZWUgKGljb25mKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9ub3RlX3R5cGUgKGVfdHlwZSkKLSAgICAgdW5zaWduZWQgZV90eXBlOwotewotICBzdGF0aWMgY2hhciBidWZmWzY0XTsKLQotICBzd2l0Y2ggKGVfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBOVF9QUlNUQVRVUzoJcmV0dXJuIF8oIk5UX1BSU1RBVFVTIChwcnN0YXR1cyBzdHJ1Y3R1cmUpIik7Ci0gICAgY2FzZSBOVF9GUFJFR1NFVDoJcmV0dXJuIF8oIk5UX0ZQUkVHU0VUIChmbG9hdGluZyBwb2ludCByZWdpc3RlcnMpIik7Ci0gICAgY2FzZSBOVF9QUlBTSU5GTzogICByZXR1cm4gXygiTlRfUFJQU0lORk8gKHBycHNpbmZvIHN0cnVjdHVyZSkiKTsKLSAgICBjYXNlIE5UX1RBU0tTVFJVQ1Q6IHJldHVybiBfKCJOVF9UQVNLU1RSVUNUICh0YXNrIHN0cnVjdHVyZSkiKTsKLSAgICBjYXNlIE5UX1BTVEFUVVM6CXJldHVybiBfKCJOVF9QU1RBVFVTIChwc3RhdHVzIHN0cnVjdHVyZSkiKTsKLSAgICBjYXNlIE5UX0ZQUkVHUzoJcmV0dXJuIF8oIk5UX0ZQUkVHUyAoZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzKSIpOwotICAgIGNhc2UgTlRfUFNJTkZPOglyZXR1cm4gXygiTlRfUFNJTkZPIChwc2luZm8gc3RydWN0dXJlKSIpOwotICAgIGNhc2UgTlRfTFdQU1RBVFVTOglyZXR1cm4gXygiTlRfTFdQU1RBVFVTIChsd3BzdGF0dXNfdCBzdHJ1Y3R1cmUpIik7Ci0gICAgY2FzZSBOVF9MV1BTSU5GTzoJcmV0dXJuIF8oIk5UX0xXUFNJTkZPIChsd3BzaW5mb190IHN0cnVjdHVyZSkiKTsKLSAgICBkZWZhdWx0OgotICAgICAgc3ByaW50ZiAoYnVmZiwgXygiVW5rbm93biBub3RlIHR5cGU6ICgweCUwOHgpIiksIGVfdHlwZSk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLS8qIE5vdGUgdGhhdCBieSB0aGUgRUxGIHN0YW5kYXJkLCB0aGUgbmFtZSBmaWVsZCBpcyBhbHJlYWR5IG51bGwgYnl0ZQotICAgdGVybWluYXRlZCwgYW5kIG5hbWVzeiBpbmNsdWRlcyB0aGUgdGVybWluYXRpbmcgbnVsbCBieXRlLgotICAgSS5FLiB0aGUgdmFsdWUgb2YgbmFtZXN6IGZvciB0aGUgbmFtZSAiRlNGIiBpcyA0LgotCi0gICBJZiB0aGUgdmFsdWUgb2YgbmFtZXN6IGlzIHplcm8sIHRoZXJlIGlzIG5vIG5hbWUgcHJlc2VudC4gKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3Nfbm90ZSAocG5vdGUpCi0gIEVsZjMyX0ludGVybmFsX05vdGUgKiBwbm90ZTsKLXsKLSAgcHJpbnRmICgiICAlc1x0XHQweCUwOGx4XHQlc1xuIiwKLQkgIHBub3RlLT5uYW1lc3ogPyBwbm90ZS0+bmFtZWRhdGEgOiAiKE5PTkUpIiwKLSAgCSAgcG5vdGUtPmRlc2NzeiwgZ2V0X25vdGVfdHlwZSAocG5vdGUtPnR5cGUpKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGludAotcHJvY2Vzc19jb3JlZmlsZV9ub3RlX3NlZ21lbnQgKGZpbGUsIG9mZnNldCwgbGVuZ3RoKQotICAgICBGSUxFICogZmlsZTsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF92bWEgbGVuZ3RoOwotewotICBFbGZfRXh0ZXJuYWxfTm90ZSAqICBwbm90ZXM7Ci0gIEVsZl9FeHRlcm5hbF9Ob3RlICogIGV4dGVybmFsOwotICBpbnQgICAgICAgICAgICAgICAgICByZXMgPSAxOwotCi0gIGlmIChsZW5ndGggPD0gMCkKLSAgICByZXR1cm4gMDsKLQotICBHRVRfREFUQV9BTExPQyAob2Zmc2V0LCBsZW5ndGgsIHBub3RlcywgRWxmX0V4dGVybmFsX05vdGUgKiwgIm5vdGVzIik7Ci0KLSAgZXh0ZXJuYWwgPSBwbm90ZXM7Ci0KLSAgcHJpbnRmIChfKCJcbk5vdGVzIGF0IG9mZnNldCAweCUwOGx4IHdpdGggbGVuZ3RoIDB4JTA4bHg6XG4iKSwgb2Zmc2V0LCBsZW5ndGgpOwotICBwcmludGYgKF8oIiAgT3duZXJcdFx0RGF0YSBzaXplXHREZXNjcmlwdGlvblxuIikpOwotCi0gIHdoaWxlIChleHRlcm5hbCA8IChFbGZfRXh0ZXJuYWxfTm90ZSAqKSgoY2hhciAqKSBwbm90ZXMgKyBsZW5ndGgpKQotICAgIHsKLSAgICAgIEVsZjMyX0ludGVybmFsX05vdGUgaW5vdGU7Ci0gICAgICBjaGFyICogdGVtcCA9IE5VTEw7Ci0KLSAgICAgIGlub3RlLnR5cGUgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT50eXBlKTsKLSAgICAgIGlub3RlLm5hbWVzeiAgID0gQllURV9HRVQgKGV4dGVybmFsLT5uYW1lc3opOwotICAgICAgaW5vdGUubmFtZWRhdGEgPSBleHRlcm5hbC0+bmFtZTsKLSAgICAgIGlub3RlLmRlc2NzeiAgID0gQllURV9HRVQgKGV4dGVybmFsLT5kZXNjc3opOwotICAgICAgaW5vdGUuZGVzY2RhdGEgPSBpbm90ZS5uYW1lZGF0YSArIGFsaWduX3Bvd2VyIChpbm90ZS5uYW1lc3osIDIpOwotICAgICAgaW5vdGUuZGVzY3BvcyAgPSBvZmZzZXQgKyAoaW5vdGUuZGVzY2RhdGEgLSAoY2hhciAqKSBwbm90ZXMpOwotICAgICAgCi0gICAgICBleHRlcm5hbCA9IChFbGZfRXh0ZXJuYWxfTm90ZSAqKShpbm90ZS5kZXNjZGF0YSArIGFsaWduX3Bvd2VyIChpbm90ZS5kZXNjc3osIDIpKTsKLQotICAgICAgLyogVmVyaWZ5IHRoYXQgbmFtZSBpcyBudWxsIHRlcm1pbmF0ZWQuICBJdCBhcHBlYXJzIHRoYXQgYXQgbGVhc3QKLQkgb25lIHZlcnNpb24gb2YgTGludXggKFJlZEhhdCA2LjApIGdlbmVyYXRlcyBjb3JlZmlsZXMgdGhhdCBkb24ndAotCSBjb21wbHkgd2l0aCB0aGUgRUxGIHNwZWMgYnkgZmFpbGluZyB0byBpbmNsdWRlIHRoZSBudWxsIGJ5dGUgaW4KLQkgbmFtZXN6LiAgKi8KLSAgICAgIGlmIChpbm90ZS5uYW1lZGF0YVtpbm90ZS5uYW1lc3pdICE9ICdcMCcpCi0JewotCSAgdGVtcCA9IG1hbGxvYyAoaW5vdGUubmFtZXN6ICsgMSk7Ci0JICAKLQkgIGlmICh0ZW1wID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotCSAgICAgIHJlcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIAotCSAgc3RybmNweSAodGVtcCwgaW5vdGUubmFtZWRhdGEsIGlub3RlLm5hbWVzeik7Ci0JICB0ZW1wW2lub3RlLm5hbWVzel0gPSAwOwotCSAgCi0JICAvKiB3YXJuIChfKCInJXMnIE5PVEUgbmFtZSBub3QgcHJvcGVybHkgbnVsbCB0ZXJtaW5hdGVkXG4iKSwgdGVtcCk7ICAqLwotCSAgaW5vdGUubmFtZWRhdGEgPSB0ZW1wOwotCX0KLQotICAgICAgcmVzICY9IHByb2Nlc3Nfbm90ZSAoJiBpbm90ZSk7Ci0KLSAgICAgIGlmICh0ZW1wICE9IE5VTEwpCi0JewotCSAgZnJlZSAodGVtcCk7Ci0JICB0ZW1wID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKHBub3Rlcyk7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19jb3JlZmlsZV9ub3RlX3NlZ21lbnRzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmX0ludGVybmFsX1BoZHIgKiBwcm9ncmFtX2hlYWRlcnM7Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICogc2VnbWVudDsKLSAgdW5zaWduZWQgaW50CSAgICAgIGk7Ci0gIGludCAgICAgICAgICAgICAgICAgcmVzID0gMTsKLQotICBwcm9ncmFtX2hlYWRlcnMgPSAoRWxmX0ludGVybmFsX1BoZHIgKikgbWFsbG9jCi0gICAgKGVsZl9oZWFkZXIuZV9waG51bSAqIHNpemVvZiAoRWxmX0ludGVybmFsX1BoZHIpKTsKLQotICBpZiAocHJvZ3JhbV9oZWFkZXJzID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoaXNfMzJiaXRfZWxmKQotICAgIGkgPSBnZXRfMzJiaXRfcHJvZ3JhbV9oZWFkZXJzIChmaWxlLCBwcm9ncmFtX2hlYWRlcnMpOwotICBlbHNlCi0gICAgaSA9IGdldF82NGJpdF9wcm9ncmFtX2hlYWRlcnMgKGZpbGUsIHByb2dyYW1faGVhZGVycyk7Ci0KLSAgaWYgKGkgPT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChwcm9ncmFtX2hlYWRlcnMpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIHNlZ21lbnQgPSBwcm9ncmFtX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9waG51bTsKLSAgICAgICBpICsrLCBzZWdtZW50ICsrKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50LT5wX3R5cGUgPT0gUFRfTk9URSkKLQlyZXMgJj0gcHJvY2Vzc19jb3JlZmlsZV9ub3RlX3NlZ21lbnQgKGZpbGUsCi0JCQkJCSAgICAgIChiZmRfdm1hKSBzZWdtZW50LT5wX29mZnNldCwKLQkJCQkJICAgICAgKGJmZF92bWEpIHNlZ21lbnQtPnBfZmlsZXN6KTsKLSAgICB9Ci0KLSAgZnJlZSAocHJvZ3JhbV9oZWFkZXJzKTsKLQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2NvcmVmaWxlX2NvbnRlbnRzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgLyogSWYgd2UgaGF2ZSBub3QgYmVlbiBhc2tlZCB0byBkaXNwbGF5IHRoZSBub3RlcyB0aGVuIGRvIG5vdGhpbmcuICAqLwotICBpZiAoISBkb19ub3RlcykKLSAgICByZXR1cm4gMTsKLQotICAvKiBJZiBmaWxlIGlzIG5vdCBhIGNvcmUgZmlsZSB0aGVuIGV4aXQuICAqLwotICBpZiAoZWxmX2hlYWRlci5lX3R5cGUgIT0gRVRfQ09SRSkKLSAgICByZXR1cm4gMTsKLQotICAvKiBObyBwcm9ncmFtIGhlYWRlcnMgbWVhbnMgbm8gTk9URSBzZWdtZW50LiAgKi8KLSAgaWYgKGVsZl9oZWFkZXIuZV9waG51bSA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiTm8gbm90ZSBzZWdtZW50cyBwcmVzZW50IGluIHRoZSBjb3JlIGZpbGUuXG4iKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLQotICByZXR1cm4gcHJvY2Vzc19jb3JlZmlsZV9ub3RlX3NlZ21lbnRzIChmaWxlKTsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19hcmNoX3NwZWNpZmljIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgaWYgKCEgZG9fYXJjaCkKLSAgICByZXR1cm4gMTsKLQotICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIEVNX01JUFM6Ci0gICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKLSAgICAgIHJldHVybiBwcm9jZXNzX21pcHNfc3BlY2lmaWMgKGZpbGUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9maWxlX2hlYWRlciAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIC8qIFJlYWQgaW4gdGhlIGlkZW50aXR5IGFycmF5LiAgKi8KLSAgaWYgKGZyZWFkIChlbGZfaGVhZGVyLmVfaWRlbnQsIEVJX05JREVOVCwgMSwgZmlsZSkgIT0gMSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBEZXRlcm1pbmUgaG93IHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlci4gICovCi0gIHN3aXRjaCAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9EQVRBXSkKLSAgICB7Ci0gICAgZGVmYXVsdDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBFTEZEQVRBTk9ORTogLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBFTEZEQVRBMkxTQjogYnl0ZV9nZXQgPSBieXRlX2dldF9saXR0bGVfZW5kaWFuOyBicmVhazsKLSAgICBjYXNlIEVMRkRBVEEyTVNCOiBieXRlX2dldCA9IGJ5dGVfZ2V0X2JpZ19lbmRpYW47IGJyZWFrOwotICAgIH0KLQotICAvKiBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCAzMiBiaXQgYW5kIDY0IGJpdCBFTEYgZmlsZXMuICAqLwotICBpc18zMmJpdF9lbGYgPSAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9DTEFTU10gIT0gRUxGQ0xBU1M2NCk7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyLiAgKi8KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9FaGRyIGVoZHIzMjsKLQotICAgICAgaWYgKGZyZWFkIChlaGRyMzIuZV90eXBlLCBzaXplb2YgKGVoZHIzMikgLSBFSV9OSURFTlQsIDEsIGZpbGUpICE9IDEpCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGVsZl9oZWFkZXIuZV90eXBlICAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfdHlwZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfbWFjaGluZSAgID0gQllURV9HRVQgKGVoZHIzMi5lX21hY2hpbmUpOwotICAgICAgZWxmX2hlYWRlci5lX3ZlcnNpb24gICA9IEJZVEVfR0VUIChlaGRyMzIuZV92ZXJzaW9uKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9lbnRyeSAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfZW50cnkpOwotICAgICAgZWxmX2hlYWRlci5lX3Bob2ZmICAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9waG9mZik7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hvZmYgICAgID0gQllURV9HRVQgKGVoZHIzMi5lX3Nob2ZmKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9mbGFncyAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfZmxhZ3MpOwotICAgICAgZWxmX2hlYWRlci5lX2Voc2l6ZSAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9laHNpemUpOwotICAgICAgZWxmX2hlYWRlci5lX3BoZW50c2l6ZSA9IEJZVEVfR0VUIChlaGRyMzIuZV9waGVudHNpemUpOwotICAgICAgZWxmX2hlYWRlci5lX3BobnVtICAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9waG51bSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hlbnRzaXplID0gQllURV9HRVQgKGVoZHIzMi5lX3NoZW50c2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hudW0gICAgID0gQllURV9HRVQgKGVoZHIzMi5lX3NobnVtKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaHN0cm5keCAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfc2hzdHJuZHgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjY0X0V4dGVybmFsX0VoZHIgZWhkcjY0OwotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGJlZW4gY29tcGlsZWQgd2l0aCBzaXplb2YgKGJmZF92bWEpID09IDQsIHRoZW4KLQkgd2Ugd2lsbCBub3QgYmUgYWJsZSB0byBjb3BlIHdpdGggdGhlIDY0Yml0IGRhdGEgZm91bmQgaW4KLQkgNjQgRUxGIGZpbGVzLiAgRGV0ZWN0IHRoaXMgbm93IGFuZCBhYm9ydCBiZWZvcmUgd2Ugc3RhcnQKLQkgb3ZlcndyaXR0aW5nIHRoaW5ncy4gICovCi0gICAgICBpZiAoc2l6ZW9mIChiZmRfdm1hKSA8IDgpCi0JewotCSAgZXJyb3IgKF8oIlRoaXMgaW5zdGFuY2Ugb2YgcmVhZGVsZiBoYXMgYmVlbiBidWlsdCB3aXRob3V0IHN1cHBvcnQgZm9yIGFcbiIpKTsKLQkgIGVycm9yIChfKCI2NCBiaXQgZGF0YSB0eXBlIGFuZCBzbyBpdCBjYW5ub3QgcmVhZCA2NCBiaXQgRUxGIGZpbGVzLlxuIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpZiAoZnJlYWQgKGVoZHI2NC5lX3R5cGUsIHNpemVvZiAoZWhkcjY0KSAtIEVJX05JREVOVCwgMSwgZmlsZSkgIT0gMSkKLQlyZXR1cm4gMDsKLQotICAgICAgZWxmX2hlYWRlci5lX3R5cGUgICAgICA9IEJZVEVfR0VUIChlaGRyNjQuZV90eXBlKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9tYWNoaW5lICAgPSBCWVRFX0dFVCAoZWhkcjY0LmVfbWFjaGluZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfdmVyc2lvbiAgID0gQllURV9HRVQgKGVoZHI2NC5lX3ZlcnNpb24pOwotICAgICAgZWxmX2hlYWRlci5lX2VudHJ5ICAgICA9IEJZVEVfR0VUOCAoZWhkcjY0LmVfZW50cnkpOwotICAgICAgZWxmX2hlYWRlci5lX3Bob2ZmICAgICA9IEJZVEVfR0VUOCAoZWhkcjY0LmVfcGhvZmYpOwotICAgICAgZWxmX2hlYWRlci5lX3Nob2ZmICAgICA9IEJZVEVfR0VUOCAoZWhkcjY0LmVfc2hvZmYpOwotICAgICAgZWxmX2hlYWRlci5lX2ZsYWdzICAgICA9IEJZVEVfR0VUIChlaGRyNjQuZV9mbGFncyk7Ci0gICAgICBlbGZfaGVhZGVyLmVfZWhzaXplICAgID0gQllURV9HRVQgKGVoZHI2NC5lX2Voc2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfcGhlbnRzaXplID0gQllURV9HRVQgKGVoZHI2NC5lX3BoZW50c2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfcGhudW0gICAgID0gQllURV9HRVQgKGVoZHI2NC5lX3BobnVtKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaGVudHNpemUgPSBCWVRFX0dFVCAoZWhkcjY0LmVfc2hlbnRzaXplKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaG51bSAgICAgPSBCWVRFX0dFVCAoZWhkcjY0LmVfc2hudW0pOwotICAgICAgZWxmX2hlYWRlci5lX3Noc3RybmR4ICA9IEJZVEVfR0VUIChlaGRyNjQuZV9zaHN0cm5keCk7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19maWxlIChmaWxlX25hbWUpCi0gICAgIGNoYXIgKiBmaWxlX25hbWU7Ci17Ci0gIEZJTEUgKiAgICAgICBmaWxlOwotICBzdHJ1Y3Qgc3RhdCAgc3RhdGJ1ZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKHN0YXQgKGZpbGVfbmFtZSwgJiBzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgZXJyb3IgKF8oIkNhbm5vdCBzdGF0IGlucHV0IGZpbGUgJXMuXG4iKSwgZmlsZV9uYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZmlsZSA9IGZvcGVuIChmaWxlX25hbWUsICJyYiIpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJJbnB1dCBmaWxlICVzIG5vdCBmb3VuZC5cbiIpLCBmaWxlX25hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoISBnZXRfZmlsZV9oZWFkZXIgKGZpbGUpKQotICAgIHsKLSAgICAgIGVycm9yIChfKCIlczogRmFpbGVkIHRvIHJlYWQgZmlsZSBoZWFkZXJcbiIpLCBmaWxlX25hbWUpOwotICAgICAgZmNsb3NlIChmaWxlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSW5pdGlhbGlzZSBwZXIgZmlsZSB2YXJpYWJsZXMuICAqLwotICBmb3IgKGkgPSBOVU1fRUxFTSAodmVyc2lvbl9pbmZvKTsgaS0tOykKLSAgICB2ZXJzaW9uX2luZm9baV0gPSAwOwotCi0gIGZvciAoaSA9IE5VTV9FTEVNIChkeW5hbWljX2luZm8pOyBpLS07KQotICAgIGR5bmFtaWNfaW5mb1tpXSA9IDA7Ci0KLSAgLyogUHJvY2VzcyB0aGUgZmlsZS4gICovCi0gIGlmIChzaG93X25hbWUpCi0gICAgcHJpbnRmIChfKCJcbkZpbGU6ICVzXG4iKSwgZmlsZV9uYW1lKTsKLQotICBpZiAoISBwcm9jZXNzX2ZpbGVfaGVhZGVyICgpKQotICAgIHsKLSAgICAgIGZjbG9zZSAoZmlsZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHByb2Nlc3Nfc2VjdGlvbl9oZWFkZXJzIChmaWxlKTsKLQotICBwcm9jZXNzX3Byb2dyYW1faGVhZGVycyAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19keW5hbWljX3NlZ21lbnQgKGZpbGUpOwotCi0gIHByb2Nlc3NfcmVsb2NzIChmaWxlKTsKLQotICBwcm9jZXNzX3N5bWJvbF90YWJsZSAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19zeW1pbmZvIChmaWxlKTsKLQotICBwcm9jZXNzX3ZlcnNpb25fc2VjdGlvbnMgKGZpbGUpOwotCi0gIHByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19jb3JlZmlsZV9jb250ZW50cyAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19hcmNoX3NwZWNpZmljIChmaWxlKTsKLQotICBmY2xvc2UgKGZpbGUpOwotCi0gIGlmIChzZWN0aW9uX2hlYWRlcnMpCi0gICAgewotICAgICAgZnJlZSAoc2VjdGlvbl9oZWFkZXJzKTsKLSAgICAgIHNlY3Rpb25faGVhZGVycyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChzdHJpbmdfdGFibGUpCi0gICAgewotICAgICAgZnJlZSAoc3RyaW5nX3RhYmxlKTsKLSAgICAgIHN0cmluZ190YWJsZSA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChkeW5hbWljX3N0cmluZ3MpCi0gICAgewotICAgICAgZnJlZSAoZHluYW1pY19zdHJpbmdzKTsKLSAgICAgIGR5bmFtaWNfc3RyaW5ncyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChkeW5hbWljX3N5bWJvbHMpCi0gICAgewotICAgICAgZnJlZSAoZHluYW1pY19zeW1ib2xzKTsKLSAgICAgIGR5bmFtaWNfc3ltYm9scyA9IE5VTEw7Ci0gICAgICBudW1fZHluYW1pY19zeW1zID0gMDsKLSAgICB9Ci0KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbykKLSAgICB7Ci0gICAgICBmcmVlIChkeW5hbWljX3N5bWluZm8pOwotICAgICAgZHluYW1pY19zeW1pbmZvID0gTlVMTDsKLSAgICB9Ci19Ci0KLSNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCi0vKiBOZWVkZWQgYnkgdGhlIGkzODYgZGlzYXNzZW1ibGVyLiAgRm9yIGV4dHJhIGNyZWRpdCwgc29tZW9uZSBjb3VsZAotICAgZml4IHRoaXMgc28gdGhhdCB3ZSBpbnNlcnQgc3ltYm9saWMgYWRkcmVzc2VzIGhlcmUsIGVzcCBmb3IgR09UL1BMVAotICAgc3ltYm9scyAqLwotCi12b2lkCi1wcmludF9hZGRyZXNzICh1bnNpZ25lZCBpbnQgYWRkciwgRklMRSAqIG91dGZpbGUpCi17Ci0gIGZwcmludGYgKG91dGZpbGUsIjB4JTguOHgiLCBhZGRyKTsKLX0KLQotLyogTmVlZGVkIGJ5IHRoZSBpMzg2IGRpc2Fzc2VtYmxlci4gKi8KLXZvaWQKLWRiX3Rhc2tfcHJpbnRzeW0gKHVuc2lnbmVkIGludCBhZGRyKQotewotICBwcmludF9hZGRyZXNzIChhZGRyLCBzdGRlcnIpOwotfQotI2VuZGlmCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50ICAgICBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci17Ci0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcGFyc2VfYXJncyAoYXJnYywgYXJndik7Ci0KLSAgaWYgKG9wdGluZCA8IChhcmdjIC0gMSkpCi0gICAgc2hvd19uYW1lID0gMTsKLQotICB3aGlsZSAob3B0aW5kIDwgYXJnYykKLSAgICBwcm9jZXNzX2ZpbGUgKGFyZ3YgW29wdGluZCArK10pOwotCi0gIGlmIChkdW1wX3NlY3RzICE9IE5VTEwpCi0gICAgZnJlZSAoZHVtcF9zZWN0cyk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZW5hbWUuYyBiL2JpbnV0aWxzL3JlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVhOWZkLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3JlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qIHJlbmFtZS5jIC0tIHJlbmFtZSBhIGZpbGUsIHByZXNlcnZpbmcgc3ltbGlua3MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+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+bGVuZ3RoOwotICBjd2ktPnJlc291cmNlcy5sYXN0ID0gZDsKLSAgY3dpLT5yZXNvdXJjZXMubGVuZ3RoICs9IGxlbmd0aDsKLQotICBwdXRjd2lfMzIgKGN3aSwgbGVuZ3RoLCBlcmQtPnNpemUpOwotCi0gIC8qIEZvcmNlIHRoZSBuZXh0IHJlc291cmNlIHRvIGhhdmUgMzIgYml0IGFsaWdubWVudC4gICovCi0KLSAgaWYgKChsZW5ndGggJiAzKSAhPSAwKQotICAgIHsKLSAgICAgIGludCBhZGQ7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpleDsKLQotICAgICAgYWRkID0gNCAtIChsZW5ndGggJiAzKTsKLQotICAgICAgZXggPSBjb2ZmX2FsbG9jICgmY3dpLT5yZXNvdXJjZXMsIGFkZCk7Ci0gICAgICBtZW1zZXQgKGV4LCAwLCBhZGQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Jlc3JjLmMgYi9iaW51dGlscy9yZXNyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQ2YTVkLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Jlc3JjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDE2ICswLDAgQEAKLS8qIHJlc3JjLmMgLS0gcmVhZCBhbmQgd3JpdGUgV2luZG93cyByYyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IHJlYWQgYW5kIHdyaXRlIFdpbmRvd3MgcmMgZmlsZXMuCi0gICBUaGVzZSBhcmUgdGV4dCBmaWxlcyB0aGF0IHJlcHJlc2VudCByZXNvdXJjZXMuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+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+dS5idWZmZXIubGVuZ3RoOyBpICs9IDQpCi0JICAgICAgewotCQl1bnNpZ25lZCBsb25nIGw7Ci0JCWludCBqOwotCi0JCWlmICghIGZpcnN0KQotCQkgIGluZGVudCAoZSwgaW5kICsgMik7Ci0JCWwgPSAoKCgoKChyaS0+dS5idWZmZXIuZGF0YVtpICsgM10gPDwgOCkKLQkJCSB8IHJpLT51LmJ1ZmZlci5kYXRhW2kgKyAyXSkgPDwgOCkKLQkJICAgICAgIHwgcmktPnUuYnVmZmVyLmRhdGFbaSArIDFdKSA8PCA4KQotCQkgICAgIHwgcmktPnUuYnVmZmVyLmRhdGFbaV0pOwotCQlmcHJpbnRmIChlLCAiJWx1TCIsIGwpOwotCQlpZiAoaSArIDQgPCByaS0+dS5idWZmZXIubGVuZ3RoIHx8IHJpLT5uZXh0ICE9IE5VTEwpCi0JCSAgZnByaW50ZiAoZSwgIiwiKTsKLQkJZm9yIChqID0gMDsgaiA8IDQ7ICsraikKLQkJICBpZiAoISBpc3ByaW50IChyaS0+dS5idWZmZXIuZGF0YVtpICsgal0pCi0JCSAgICAgICYmIHJpLT51LmJ1ZmZlci5kYXRhW2kgKyBqXSAhPSAwKQotCQkgICAgYnJlYWs7Ci0JCWlmIChqID49IDQpCi0JCSAgewotCQkgICAgZnByaW50ZiAoZSwgIlx0Ly8gIik7Ci0JCSAgICBmb3IgKGogPSAwOyBqIDwgNDsgKytqKQotCQkgICAgICB7Ci0JCQlpZiAoISBpc3ByaW50IChyaS0+dS5idWZmZXIuZGF0YVtpICsgal0pKQotCQkJICBmcHJpbnRmIChlLCAiXFwlMDNvIiwgcmktPnUuYnVmZmVyLmRhdGFbaSArIGpdKTsKLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGlmIChyaS0+dS5idWZmZXIuZGF0YVtpICsgal0gPT0gJ1xcJykKLQkJCSAgICAgIGZwcmludGYgKGUsICJcXCIpOwotCQkJICAgIGZwcmludGYgKGUsICIlYyIsIHJpLT51LmJ1ZmZlci5kYXRhW2kgKyBqXSk7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgIH0KLQkJZnByaW50ZiAoZSwgIlxuIik7Ci0JCWZpcnN0ID0gMDsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGkgKyAxIDwgcmktPnUuYnVmZmVyLmxlbmd0aCkKLQkgICAgICB7Ci0JCWludCBzOwotCQlpbnQgajsKLQotCQlpZiAoISBmaXJzdCkKLQkJICBpbmRlbnQgKGUsIGluZCArIDIpOwotCQlzID0gKHJpLT51LmJ1ZmZlci5kYXRhW2kgKyAxXSA8PCA4KSB8IHJpLT51LmJ1ZmZlci5kYXRhW2ldOwotCQlmcHJpbnRmIChlLCAiJWQiLCBzKTsKLQkJaWYgKGkgKyAyIDwgcmktPnUuYnVmZmVyLmxlbmd0aCB8fCByaS0+bmV4dCAhPSBOVUxMKQotCQkgIGZwcmludGYgKGUsICIsIik7Ci0JCWZvciAoaiA9IDA7IGogPCAyOyArK2opCi0JCSAgaWYgKCEgaXNwcmludCAocmktPnUuYnVmZmVyLmRhdGFbaSArIGpdKQotCQkgICAgICAmJiByaS0+dS5idWZmZXIuZGF0YVtpICsgal0gIT0gMCkKLQkJICAgIGJyZWFrOwotCQlpZiAoaiA+PSAyKQotCQkgIHsKLQkJICAgIGZwcmludGYgKGUsICJcdC8vICIpOwotCQkgICAgZm9yIChqID0gMDsgaiA8IDI7ICsraikKLQkJICAgICAgewotCQkJaWYgKCEgaXNwcmludCAocmktPnUuYnVmZmVyLmRhdGFbaSArIGpdKSkKLQkJCSAgZnByaW50ZiAoZSwgIlxcJTAzbyIsIHJpLT51LmJ1ZmZlci5kYXRhW2kgKyBqXSk7Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBpZiAocmktPnUuYnVmZmVyLmRhdGFbaSArIGpdID09ICdcXCcpCi0JCQkgICAgICBmcHJpbnRmIChlLCAiXFwiKTsKLQkJCSAgICBmcHJpbnRmIChlLCAiJWMiLCByaS0+dS5idWZmZXIuZGF0YVtpICsgal0pOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWZwcmludGYgKGUsICJcbiIpOwotCQlpICs9IDI7Ci0JCWZpcnN0ID0gMDsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGkgPCByaS0+dS5idWZmZXIubGVuZ3RoKQotCSAgICAgIHsKLQkJaWYgKCEgZmlyc3QpCi0JCSAgaW5kZW50IChlLCBpbmQgKyAyKTsKLQkJaWYgKChyaS0+dS5idWZmZXIuZGF0YVtpXSAmIDB4N2YpID09IHJpLT51LmJ1ZmZlci5kYXRhW2ldCi0JCSAgICAmJiBpc3ByaW50IChyaS0+dS5idWZmZXIuZGF0YVtpXSkpCi0JCSAgZnByaW50ZiAoZSwgIlwiJWNcIiIsIHJpLT51LmJ1ZmZlci5kYXRhW2ldKTsKLQkJZWxzZQotCQkgIGZwcmludGYgKGUsICJcIlxcJTAzb1wiIiwgcmktPnUuYnVmZmVyLmRhdGFbaV0pOwotCQlpZiAocmktPm5leHQgIT0gTlVMTCkKLQkJICBmcHJpbnRmIChlLCAiLCIpOwotCQlmcHJpbnRmIChlLCAiXG4iKTsKLQkJZmlyc3QgPSAwOwotCSAgICAgIH0KLQotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0KLSAgICAgIGlmIChyaS0+dHlwZSAhPSBSQ0RBVEFfQlVGRkVSKQotCXsKLQkgIGlmIChyaS0+bmV4dCAhPSBOVUxMKQotCSAgICBmcHJpbnRmIChlLCAiLCIpOwotCSAgZnByaW50ZiAoZSwgIlxuIik7Ci0JfQotICAgIH0KLQotICBpbmRlbnQgKGUsIGluZCk7Ci0gIGZwcmludGYgKGUsICJFTkRcbiIpOwotfQotCi0vKiBXcml0ZSBvdXQgYSBzdHJpbmd0YWJsZSByZXNvdXJjZS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19zdHJpbmd0YWJsZSAoZSwgbmFtZSwgc3RyaW5ndGFibGUpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGNvbnN0IHN0cnVjdCBzdHJpbmd0YWJsZSAqc3RyaW5ndGFibGU7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICBpbnQgaTsKLQotICBpZiAobmFtZSAhPSBOVUxMICYmICEgbmFtZS0+bmFtZWQpCi0gICAgb2Zmc2V0ID0gKG5hbWUtPnUuaWQgLSAxKSA8PCA0OwotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vICVzIHN0cmluZyB0YWJsZSBuYW1lXG4iLAotCSAgICAgICBuYW1lID09IE5VTEwgPyAiTWlzc2luZyIgOiAiSW52YWxpZCIpOwotICAgICAgb2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZSwgIkJFR0lOXG4iKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyaW5ndGFibGUtPnN0cmluZ3NbaV0ubGVuZ3RoICE9IDApCi0JewotCSAgZnByaW50ZiAoZSwgIiAgJWx1LCBcIiIsIG9mZnNldCArIGkpOwotCSAgdW5pY29kZV9wcmludCAoZSwgc3RyaW5ndGFibGUtPnN0cmluZ3NbaV0uc3RyaW5nLAotCQkJIHN0cmluZ3RhYmxlLT5zdHJpbmdzW2ldLmxlbmd0aCk7Ci0JICBmcHJpbnRmIChlLCAiXCJcbiIpOwotCX0KLSAgICB9Ci0KLSAgZnByaW50ZiAoZSwgIkVORFxuIik7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHZlcnNpb25pbmZvIHJlc291cmNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX3ZlcnNpb25pbmZvIChlLCB2ZXJzaW9uaW5mbykKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHZlcnNpb25pbmZvICp2ZXJzaW9uaW5mbzsKLXsKLSAgY29uc3Qgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmOwotICBjb25zdCBzdHJ1Y3QgdmVyX2luZm8gKnZpOwotCi0gIGYgPSB2ZXJzaW9uaW5mby0+Zml4ZWQ7Ci0gIGlmIChmLT5maWxlX3ZlcnNpb25fbXMgIT0gMCB8fCBmLT5maWxlX3ZlcnNpb25fbHMgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIEZJTEVWRVJTSU9OICVsdSwgJWx1LCAlbHUsICVsdVxuIiwKLQkgICAgIChmLT5maWxlX3ZlcnNpb25fbXMgPj4gMTYpICYgMHhmZmZmLAotCSAgICAgZi0+ZmlsZV92ZXJzaW9uX21zICYgMHhmZmZmLAotCSAgICAgKGYtPmZpbGVfdmVyc2lvbl9scyA+PiAxNikgJiAweGZmZmYsCi0JICAgICBmLT5maWxlX3ZlcnNpb25fbHMgJiAweGZmZmYpOwotICBpZiAoZi0+cHJvZHVjdF92ZXJzaW9uX21zICE9IDAgfHwgZi0+cHJvZHVjdF92ZXJzaW9uX2xzICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBQUk9EVUNUVkVSU0lPTiAlbHUsICVsdSwgJWx1LCAlbHVcbiIsCi0JICAgICAoZi0+cHJvZHVjdF92ZXJzaW9uX21zID4+IDE2KSAmIDB4ZmZmZiwKLQkgICAgIGYtPnByb2R1Y3RfdmVyc2lvbl9tcyAmIDB4ZmZmZiwKLQkgICAgIChmLT5wcm9kdWN0X3ZlcnNpb25fbHMgPj4gMTYpICYgMHhmZmZmLAotCSAgICAgZi0+cHJvZHVjdF92ZXJzaW9uX2xzICYgMHhmZmZmKTsKLSAgaWYgKGYtPmZpbGVfZmxhZ3NfbWFzayAhPSAwKQotICAgIGZwcmludGYgKGUsICIgRklMRUZMQUdTTUFTSyAweCVseFxuIiwgZi0+ZmlsZV9mbGFnc19tYXNrKTsKLSAgaWYgKGYtPmZpbGVfZmxhZ3MgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIEZJTEVGTEFHUyAweCVseFxuIiwgZi0+ZmlsZV9mbGFncyk7Ci0gIGlmIChmLT5maWxlX29zICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBGSUxFT1MgMHglbHhcbiIsIGYtPmZpbGVfb3MpOwotICBpZiAoZi0+ZmlsZV90eXBlICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBGSUxFVFlQRSAweCVseFxuIiwgZi0+ZmlsZV90eXBlKTsKLSAgaWYgKGYtPmZpbGVfc3VidHlwZSAhPSAwKQotICAgIGZwcmludGYgKGUsICIgRklMRVNVQlRZUEUgMHglbHhcbiIsIGYtPmZpbGVfc3VidHlwZSk7Ci0gIGlmIChmLT5maWxlX2RhdGVfbXMgIT0gMCB8fCBmLT5maWxlX2RhdGVfbHMgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiLy8gRGF0ZTogJWx1LCAlbHVcbiIsIGYtPmZpbGVfZGF0ZV9tcywgZi0+ZmlsZV9kYXRlX2xzKTsKLQotICBmcHJpbnRmIChlLCAiQkVHSU5cbiIpOwotCi0gIGZvciAodmkgPSB2ZXJzaW9uaW5mby0+dmFyOyB2aSAhPSBOVUxMOyB2aSA9IHZpLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAodmktPnR5cGUpCi0JewotCWNhc2UgVkVSSU5GT19TVFJJTkc6Ci0JICB7Ci0JICAgIGNvbnN0IHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqdnM7Ci0KLQkgICAgZnByaW50ZiAoZSwgIiAgQkxPQ0sgXCJTdHJpbmdGaWxlSW5mb1wiXG4iKTsKLQkgICAgZnByaW50ZiAoZSwgIiAgQkVHSU5cbiIpOwotCSAgICBmcHJpbnRmIChlLCAiICAgIEJMT0NLIFwiIik7Ci0JICAgIHVuaWNvZGVfcHJpbnQgKGUsIHZpLT51LnN0cmluZy5sYW5ndWFnZSwgLTEpOwotCSAgICBmcHJpbnRmIChlLCAiXCJcbiIpOwotCSAgICBmcHJpbnRmIChlLCAiICAgIEJFR0lOXG4iKTsKLQotCSAgICBmb3IgKHZzID0gdmktPnUuc3RyaW5nLnN0cmluZ3M7IHZzICE9IE5VTEw7IHZzID0gdnMtPm5leHQpCi0JICAgICAgewotCQlmcHJpbnRmIChlLCAiICAgICAgVkFMVUUgXCIiKTsKLQkJdW5pY29kZV9wcmludCAoZSwgdnMtPmtleSwgLTEpOwotCQlmcHJpbnRmIChlLCAiXCIsIFwiIik7Ci0JCXVuaWNvZGVfcHJpbnQgKGUsIHZzLT52YWx1ZSwgLTEpOwotCQlmcHJpbnRmIChlLCAiXCJcbiIpOwotCSAgICAgIH0KLQotCSAgICBmcHJpbnRmIChlLCAiICAgIEVORFxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgIEVORFxuIik7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSBWRVJJTkZPX1ZBUjoKLQkgIHsKLQkgICAgY29uc3Qgc3RydWN0IHZlcl92YXJpbmZvICp2djsKLQotCSAgICBmcHJpbnRmIChlLCAiICBCTE9DSyBcIlZhckZpbGVJbmZvXCJcbiIpOwotCSAgICBmcHJpbnRmIChlLCAiICBCRUdJTlxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgICAgVkFMVUUgXCIiKTsKLQkgICAgdW5pY29kZV9wcmludCAoZSwgdmktPnUudmFyLmtleSwgLTEpOwotCSAgICBmcHJpbnRmIChlLCAiXCIiKTsKLQotCSAgICBmb3IgKHZ2ID0gdmktPnUudmFyLnZhcjsgdnYgIT0gTlVMTDsgdnYgPSB2di0+bmV4dCkKLQkgICAgICBmcHJpbnRmIChlLCAiLCAweCV4LCAlZCIsICh1bnNpZ25lZCBpbnQpIHZ2LT5sYW5ndWFnZSwKLQkJICAgICAgIHZ2LT5jaGFyc2V0KTsKLQotCSAgICBmcHJpbnRmIChlLCAiXG4gIEVORFxuIik7Ci0KLQkgICAgYnJlYWs7Ci0JICB9Ci0JfQotICAgIH0KLQotICBmcHJpbnRmIChlLCAiRU5EXG4iKTsKLX0KLQotLyogV3JpdGUgb3V0IGRhdGEgd2hpY2ggd291bGQgbm9ybWFsbHkgYmUgcmVhZCBmcm9tIGEgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19maWxlZGF0YSAoZSwgbGVuZ3RoLCBkYXRhKQotICAgICBGSUxFICplOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLXsKLSAgdW5zaWduZWQgbG9uZyBpOwotCi0gIGZvciAoaSA9IDA7IGkgKyAxNSA8IGxlbmd0aDsgaSArPSAxNikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gJTRseDogIiwgaSk7Ci0gICAgICBmcHJpbnRmIChlLCAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICIsCi0JICAgICAgIGRhdGFbaSArIDBdLCBkYXRhW2kgKyAxXSwgZGF0YVtpICsgMl0sIGRhdGFbaSArIDNdLAotCSAgICAgICBkYXRhW2kgKyA0XSwgZGF0YVtpICsgNV0sIGRhdGFbaSArIDZdLCBkYXRhW2kgKyA3XSk7Ci0gICAgICBmcHJpbnRmIChlLCAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotCSAgICAgICBkYXRhW2kgKyAgOF0sIGRhdGFbaSArICA5XSwgZGF0YVtpICsgMTBdLCBkYXRhW2kgKyAxMV0sCi0JICAgICAgIGRhdGFbaSArIDEyXSwgZGF0YVtpICsgMTNdLCBkYXRhW2kgKyAxNF0sIGRhdGFbaSArIDE1XSk7Ci0gICAgfQotCi0gIGlmIChpIDwgbGVuZ3RoKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIvLyAlNGx4OiIsIGkpOwotICAgICAgd2hpbGUgKGkgPCBsZW5ndGgpCi0JewotCSAgZnByaW50ZiAoZSwgIiAlMDJ4IiwgZGF0YVtpXSk7Ci0JICArK2k7Ci0JfQotICAgICAgZnByaW50ZiAoZSwgIlxuIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmVzcmVzLmMgYi9iaW51dGlscy9yZXNyZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4NjBlYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZXNyZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKiByZXNyZXMuYzogcmVhZF9yZXNfZmlsZSBhbmQgd3JpdGVfcmVzX2ZpbGUgaW1wbGVtZW50YXRpb24gZm9yIHdpbmRyZXMuCi0gICBDb3B5cmlnaHQgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQW5kZXJzIE5vcmxhbmRlciA8YW5vcmxhbmRAaGVtMi5wYXNzYWdlbi5zZT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEZJWE1FOiBUaGlzIGZpbGUgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgaW4gYSBjcm9zcyBjb25maWd1cmF0aW9uLgotICAgSXQgYXNzdW1lcyB0aGF0IGl0IGNhbiB1c2UgZnJlYWQgYW5kIGZ3cml0ZSB0byByZWFkIGFuZCB3cml0ZQotICAgaW50ZWdlcnMuICBJdCBkb2VzIG5vIHN3YXBwaW5nLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIndpbmRyZXMuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotc3RydWN0IHJlc19oZHIKLSAgewotICAgIHVuc2lnbmVkIGxvbmcgZGF0YV9zaXplOwotICAgIHVuc2lnbmVkIGxvbmcgaGVhZGVyX3NpemU7Ci0gIH07Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19kaXJlY3RvcnkKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKLQkgICBpbnQgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yZXNfcmVzb3VyY2UKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19pZCAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqLCBpbnQgKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmVzX2JpbgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKikpOwotCi1zdGF0aWMgdm9pZCB3cml0ZV9yZXNfaWQgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19pZCAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yZXNfaW5mbyBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19kYXRhIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19oZWFkZXIKLSAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqKSk7Ci0KLXN0YXRpYyBpbnQgcmVhZF9yZXNvdXJjZV9lbnRyeSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCByZWFkX3Jlc19kYXRhIFBBUkFNUyAoKHZvaWQgKiwgc2l6ZV90LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHJlYWRfcmVzX2lkIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQgKikpOwotc3RhdGljIHVuaWNoYXIgKnJlYWRfdW5pc3RyaW5nIFBBUkFNUyAoKGludCAqKSk7Ci1zdGF0aWMgdm9pZCBza2lwX251bGxfcmVzb3VyY2UgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfaWRfc2l6ZSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2lkICopKTsKLXN0YXRpYyB2b2lkIHJlc19hbGlnbl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLSAgcmVzX2FkZF9yZXNvdXJjZQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX3Jlc291cmNlICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCwgaW50KSk7Ci0KLXZvaWQKLSAgcmVzX2FwcGVuZF9yZXNvdXJjZQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKiwgc3RydWN0IHJlc19yZXNvdXJjZSAqLAotCSAgIGludCwgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBpbnQpKTsKLQotc3RhdGljIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNvdXJjZXMgPSBOVUxMOwotCi1zdGF0aWMgRklMRSAqZnJlczsKLXN0YXRpYyBjb25zdCBjaGFyICpmaWxlbmFtZTsKLQotZXh0ZXJuIGNoYXIgKnByb2dyYW1fbmFtZTsKLQotLyogUmVhZCByZXNvdXJjZSBmaWxlICovCi1zdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqCi1yZWFkX3Jlc19maWxlIChmbikKLSAgICAgY29uc3QgY2hhciAqZm47Ci17Ci0gIGZpbGVuYW1lID0gZm47Ci0gIGZyZXMgPSBmb3BlbiAoZmlsZW5hbWUsICJyYiIpOwotICBpZiAoZnJlcyA9PSBOVUxMKQotICAgIGZhdGFsICgiY2FuJ3Qgb3BlbiBgJXMnIGZvciBvdXRwdXQ6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCi0gIHNraXBfbnVsbF9yZXNvdXJjZSAoKTsKLQotICB3aGlsZSAocmVhZF9yZXNvdXJjZV9lbnRyeSAoKSkKLSAgICA7Ci0KLSAgZmNsb3NlIChmcmVzKTsKLQotICByZXR1cm4gcmVzb3VyY2VzOwotfQotCi0vKiBXcml0ZSByZXNvdXJjZSBmaWxlICovCi12b2lkCi13cml0ZV9yZXNfZmlsZSAoZm4sIHJlc2RpcikKLSAgICAgY29uc3QgY2hhciAqZm47Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNkaXI7Ci17Ci0gIGludCBsYW5ndWFnZTsKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2lnbltdID0KLSAgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotICBsb25nIGZwb3M7Ci0KLSAgZmlsZW5hbWUgPSBmbjsKLQotICBmcmVzID0gZm9wZW4gKGZpbGVuYW1lLCAid2IiKTsKLSAgaWYgKGZyZXMgPT0gTlVMTCkKLSAgICBmYXRhbCAoImNhbid0IG9wZW4gYCVzJyBmb3Igb3V0cHV0OiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLQotICAvKiBXcml0ZSAzMiBiaXQgcmVzb3VyY2Ugc2lnbmF0dXJlICovCi0gIHdyaXRlX3Jlc19kYXRhIChzaWduLCBzaXplb2YgKHNpZ24pLCAxKTsKLQotICAvKiB3cml0ZSByZXNvdXJjZXMgKi8KLQotICBsYW5ndWFnZSA9IC0xOwotICB3cml0ZV9yZXNfZGlyZWN0b3J5IChyZXNkaXIsIChjb25zdCBzdHJ1Y3QgcmVzX2lkICopIE5VTEwsCi0JCSAgICAgICAoY29uc3Qgc3RydWN0IHJlc19pZCAqKSBOVUxMLCAmbGFuZ3VhZ2UsIDEpOwotCi0gIC8qIGVuZCBmaWxlIG9uIERXT1JEIGJvdW5kYXJ5ICovCi0gIGZwb3MgPSBmdGVsbCAoZnJlcyk7Ci0gIGlmIChmcG9zICUgNCkKLSAgICB3cml0ZV9yZXNfZGF0YSAoc2lnbiwgZnBvcyAlIDQsIDEpOwotCi0gIGZjbG9zZSAoZnJlcyk7Ci19Ci0KLS8qIFJlYWQgYSByZXNvdXJjZSBlbnRyeSwgcmV0dXJucyAwIHdoZW4gYWxsIHJlc291cmNlcyBhcmUgcmVhZCAqLwotc3RhdGljIGludAotcmVhZF9yZXNvdXJjZV9lbnRyeSAodm9pZCkKLXsKLSAgc3RydWN0IHJlc19pZCB0eXBlOwotICBzdHJ1Y3QgcmVzX2lkIG5hbWU7Ci0gIHN0cnVjdCByZXNfcmVzX2luZm8gcmVzaW5mbzsKLSAgc3RydWN0IHJlc19oZHIgcmVzaGRyOwotICBsb25nIHZlcnNpb247Ci0gIHZvaWQgKmJ1ZmY7Ci0KLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICByZXNfYWxpZ25fZmlsZSAoKTsKLQotICAvKiBSZWFkIGhlYWRlciAqLwotICBpZiAoZnJlYWQgKCZyZXNoZHIsIHNpemVvZiAocmVzaGRyKSwgMSwgZnJlcykgIT0gMSkKLSAgICByZXR1cm4gMDsKLQotICAvKiByZWFkIHJlc291cmNlIHR5cGUgKi8KLSAgcmVhZF9yZXNfaWQgKCZ0eXBlKTsKLSAgLyogcmVhZCByZXNvdXJjZSBpZCAqLwotICByZWFkX3Jlc19pZCAoJm5hbWUpOwotCi0gIHJlc19hbGlnbl9maWxlICgpOwotCi0gIC8qIFJlYWQgYWRkaXRpb25hbCByZXNvdXJjZSBoZWFkZXIgKi8KLSAgcmVhZF9yZXNfZGF0YSAoJnJlc2luZm8udmVyc2lvbiwgc2l6ZW9mIChyZXNpbmZvLnZlcnNpb24pLCAxKTsKLSAgcmVhZF9yZXNfZGF0YSAoJnJlc2luZm8ubWVtZmxhZ3MsIHNpemVvZiAocmVzaW5mby5tZW1mbGFncyksIDEpOwotICByZWFkX3Jlc19kYXRhICgmcmVzaW5mby5sYW5ndWFnZSwgc2l6ZW9mIChyZXNpbmZvLmxhbmd1YWdlKSwgMSk7Ci0gIHJlYWRfcmVzX2RhdGEgKCZ2ZXJzaW9uLCBzaXplb2YgKHZlcnNpb24pLCAxKTsKLSAgcmVhZF9yZXNfZGF0YSAoJnJlc2luZm8uY2hhcmFjdGVyaXN0aWNzLCBzaXplb2YgKHJlc2luZm8uY2hhcmFjdGVyaXN0aWNzKSwgMSk7Ci0KLSAgcmVzX2FsaWduX2ZpbGUgKCk7Ci0KLSAgLyogQWxsb2NhdGUgYnVmZmVyIGZvciBkYXRhICovCi0gIGJ1ZmYgPSByZXNfYWxsb2MgKHJlc2hkci5kYXRhX3NpemUpOwotICAvKiBSZWFkIGRhdGEgKi8KLSAgcmVhZF9yZXNfZGF0YSAoYnVmZiwgcmVzaGRyLmRhdGFfc2l6ZSwgMSk7Ci0gIC8qIENvbnZlcnQgYmluYXJ5IGRhdGEgdG8gcmVzb3VyY2UgKi8KLSAgciA9IGJpbl90b19yZXMgKHR5cGUsIGJ1ZmYsIHJlc2hkci5kYXRhX3NpemUsIDApOwotICByLT5yZXNfaW5mbyA9IHJlc2luZm87Ci0gIC8qIEFkZCByZXNvdXJjZSB0byByZXNvdXJjZSBkaXJlY3RvcnkgKi8KLSAgcmVzX2FkZF9yZXNvdXJjZSAociwgJnR5cGUsICZuYW1lLCByZXNpbmZvLmxhbmd1YWdlLCAwKTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogd3JpdGUgcmVzb3VyY2UgZGlyZWN0b3J5IHRvIGJpbmFyeSByZXNvdXJjZSBmaWxlICovCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX2RpcmVjdG9yeSAocmQsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCkKLSAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJkOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBpbnQgKmxhbmd1YWdlOwotICAgICBpbnQgbGV2ZWw7Ci17Ci0gIGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKnJlOwotCi0gIGZvciAocmUgPSByZC0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGxldmVsKQotCXsKLQljYXNlIDE6Ci0JICAvKiBJZiB3ZSdyZSBhdCBsZXZlbCAxLCB0aGUga2V5IG9mIHRoaXMgcmVzb3VyY2UgaXMgdGhlCi0JICAgICB0eXBlLiAgVGhpcyBub3JtYWxseSBkdXBsaWNhdGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlCi0JICAgICBzdG9yZWQgd2l0aCB0aGUgcmVzb3VyY2UgaXRzZWxmLCBidXQgd2UgbmVlZCB0byByZW1lbWJlcgotCSAgICAgdGhlIHR5cGUgaWYgdGhpcyBpcyBhIHVzZXIgZGVmaW5lIHJlc291cmNlIHR5cGUuICAqLwotCSAgdHlwZSA9ICZyZS0+aWQ7Ci0JICBicmVhazsKLQotCWNhc2UgMjoKLQkgIC8qIElmIHdlJ3JlIGF0IGxldmVsIDIsIHRoZSBrZXkgb2YgdGhpcyByZXNvdXJjZSBpcyB0aGUgbmFtZQotCSAgICAgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbiB0aGUgcmMgcHJpbnRvdXQuICovCi0JICBuYW1lID0gJnJlLT5pZDsKLQkgIGJyZWFrOwotCi0JY2FzZSAzOgotCSAgLyogSWYgd2UncmUgYXQgbGV2ZWwgMywgdGhlbiB0aGlzIGtleSByZXByZXNlbnRzIGEgbGFuZ3VhZ2UuCi0JICAgICBVc2UgaXQgdG8gdXBkYXRlIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAgKi8KLQkgIGlmICghcmUtPmlkLm5hbWVkCi0JICAgICAgJiYgcmUtPmlkLnUuaWQgIT0gKHVuc2lnbmVkIGxvbmcpICpsYW5ndWFnZQotCSAgICAgICYmIChyZS0+aWQudS5pZCAmIDB4ZmZmZikgPT0gcmUtPmlkLnUuaWQpCi0JICAgIHsKLQkgICAgICAqbGFuZ3VhZ2UgPSByZS0+aWQudS5pZDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocmUtPnN1YmRpcikKLQl3cml0ZV9yZXNfZGlyZWN0b3J5IChyZS0+dS5kaXIsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCArIDEpOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChsZXZlbCA9PSAzKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgbm9ybWFsIGNhc2U6IHRoZSB0aHJlZSBsZXZlbHMgYXJlCi0JICAgICAgICAgVFlQRS9OQU1FL0xBTkdVQUdFLiAgTkFNRSB3aWxsIGhhdmUgYmVlbiBzZXQgYXQgbGV2ZWwKLQkgICAgICAgICAyLCBhbmQgcmVwcmVzZW50cyB0aGUgbmFtZSB0byB1c2UuICBXZSBwcm9iYWJseSBqdXN0Ci0JICAgICAgICAgc2V0IExBTkdVQUdFLCBhbmQgaXQgd2lsbCBwcm9iYWJseSBtYXRjaCB3aGF0IHRoZQotCSAgICAgICAgIHJlc291cmNlIGl0c2VsZiByZWNvcmRzIGlmIGFueXRoaW5nLiAgKi8KLQkgICAgICB3cml0ZV9yZXNfcmVzb3VyY2UgKHR5cGUsIG5hbWUsIHJlLT51LnJlcywgbGFuZ3VhZ2UpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIvLyBSZXNvdXJjZSBhdCB1bmV4cGVjdGVkIGxldmVsICVkXG4iLCBsZXZlbCk7Ci0JICAgICAgd3JpdGVfcmVzX3Jlc291cmNlICh0eXBlLCAoc3RydWN0IHJlc19pZCAqKSBOVUxMLCByZS0+dS5yZXMsCi0JCQkJICBsYW5ndWFnZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfcmVzb3VyY2UgKHR5cGUsIG5hbWUsIHJlcywgbGFuZ3VhZ2UpCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlczsKLSAgICAgaW50ICpsYW5ndWFnZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgcnQ7Ci0KLSAgc3dpdGNoIChyZXMtPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgUkVTX1RZUEVfQUNDRUxFUkFUT1I6Ci0gICAgICBydCA9IFJUX0FDQ0VMRVJBVE9SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0JJVE1BUDoKLSAgICAgIHJ0ID0gUlRfQklUTUFQOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0NVUlNPUjoKLSAgICAgIHJ0ID0gUlRfQ1VSU09SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0NVUlNPUjoKLSAgICAgIHJ0ID0gUlRfR1JPVVBfQ1VSU09SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0RJQUxPRzoKLSAgICAgIHJ0ID0gUlRfRElBTE9HOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0ZPTlQ6Ci0gICAgICBydCA9IFJUX0ZPTlQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRk9OVERJUjoKLSAgICAgIHJ0ID0gUlRfRk9OVERJUjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9JQ09OOgotICAgICAgcnQgPSBSVF9JQ09OOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0lDT046Ci0gICAgICBydCA9IFJUX0dST1VQX0lDT047Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfTUVOVToKLSAgICAgIHJ0ID0gUlRfTUVOVTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9NRVNTQUdFVEFCTEU6Ci0gICAgICBydCA9IFJUX01FU1NBR0VUQUJMRTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9SQ0RBVEE6Ci0gICAgICBydCA9IFJUX1JDREFUQTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9TVFJJTkdUQUJMRToKLSAgICAgIHJ0ID0gUlRfU1RSSU5HOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1VTRVJEQVRBOgotICAgICAgcnQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1ZFUlNJT05JTkZPOgotICAgICAgcnQgPSBSVF9WRVJTSU9OOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChydCAhPSAwCi0gICAgICAmJiB0eXBlICE9IE5VTEwKLSAgICAgICYmICh0eXBlLT5uYW1lZCB8fCB0eXBlLT51LmlkICE9ICh1bnNpZ25lZCBsb25nKSBydCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLy8gVW5leHBlY3RlZCByZXNvdXJjZSB0eXBlIG1pc21hdGNoOiAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoc3RkZXJyLCAqdHlwZSwgMSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgIT0gJWQiLCBydCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgd3JpdGVfcmVzX2JpbiAocmVzLCB0eXBlLCBuYW1lLCAmcmVzLT5yZXNfaW5mbyk7Ci0gIHJldHVybjsKLX0KLQotLyogV3JpdGUgYSByZXNvdXJjZSBpbiBiaW5hcnkgcmVzb3VyY2UgZm9ybWF0ICovCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX2JpbiAocmVzLCB0eXBlLCBuYW1lLCByZXNpbmZvKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci17Ci0gIHVuc2lnbmVkIGxvbmcgZGF0YXNpemUgPSAwOwotICBjb25zdCBzdHJ1Y3QgYmluZGF0YSAqYmluX3JlcCwgKmRhdGE7Ci0KLSAgYmluX3JlcCA9IHJlc190b19iaW4gKHJlcywgMCk7Ci0gIGZvciAoZGF0YSA9IGJpbl9yZXA7IGRhdGEgIT0gTlVMTDsgZGF0YSA9IGRhdGEtPm5leHQpCi0gICAgZGF0YXNpemUgKz0gZGF0YS0+bGVuZ3RoOwotCi0gIHdyaXRlX3Jlc19oZWFkZXIgKGRhdGFzaXplLCB0eXBlLCBuYW1lLCByZXNpbmZvKTsKLQotICBmb3IgKGRhdGEgPSBiaW5fcmVwOyBkYXRhICE9IE5VTEw7IGRhdGEgPSBkYXRhLT5uZXh0KQotICAgIHdyaXRlX3Jlc19kYXRhIChkYXRhLT5kYXRhLCBkYXRhLT5sZW5ndGgsIDEpOwotfQotCi0vKiBHZXQgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBzdG9yZSBhbiBpZCBpbiBiaW5hcnkgZm9ybWF0ICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZ2V0X2lkX3NpemUgKGlkKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICppZDsKLXsKLSAgaWYgKGlkLT5uYW1lZCkKLSAgICByZXR1cm4gc2l6ZW9mICh1bmljaGFyKSAqIChpZC0+dS5uLmxlbmd0aCArIDEpOwotICBlbHNlCi0gICAgcmV0dXJuIHNpemVvZiAodW5pY2hhcikgKiAyOwotfQotCi0vKiBXcml0ZSBhIHJlc291cmNlIGhlYWRlciAqLwotc3RhdGljIHZvaWQKLXdyaXRlX3Jlc19oZWFkZXIgKGRhdGFzaXplLCB0eXBlLCBuYW1lLCByZXNpbmZvKQotICAgICB1bnNpZ25lZCBsb25nIGRhdGFzaXplOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotewotICBzdHJ1Y3QgcmVzX2hkciByZXNoZHI7Ci0gIHJlc2hkci5kYXRhX3NpemUgPSBkYXRhc2l6ZTsKLSAgcmVzaGRyLmhlYWRlcl9zaXplID0gMjQgKyBnZXRfaWRfc2l6ZSAodHlwZSkgKyBnZXRfaWRfc2l6ZSAobmFtZSk7Ci0KLSAgcmVzX2FsaWduX2ZpbGUgKCk7Ci0gIHdyaXRlX3Jlc19kYXRhICgmcmVzaGRyLCBzaXplb2YgKHJlc2hkciksIDEpOwotICB3cml0ZV9yZXNfaWQgKHR5cGUpOwotICB3cml0ZV9yZXNfaWQgKG5hbWUpOwotCi0gIHJlc19hbGlnbl9maWxlICgpOwotCi0gIHdyaXRlX3Jlc19pbmZvIChyZXNpbmZvKTsKLSAgcmVzX2FsaWduX2ZpbGUgKCk7Ci19Ci0KLQotLyogV3JpdGUgZGF0YSB0byBmaWxlLCBhYm9ydCBvbiBmYWlsdXJlICovCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX2RhdGEgKGRhdGEsIHNpemUsIGNvdW50KQotICAgICBjb25zdCB2b2lkICpkYXRhOwotICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgaW50IGNvdW50OwotewotICBpZiAoZndyaXRlIChkYXRhLCBzaXplLCBjb3VudCwgZnJlcykgIT0gKHNpemVfdCkgY291bnQpCi0gICAgZmF0YWwgKCIlczogY291bGQgbm90IHdyaXRlIHRvIGZpbGUiLCBmaWxlbmFtZSk7Ci19Ci0KLS8qIFJlYWQgZGF0YSBmcm9tIGZpbGUsIGFib3J0IG9uIGZhaWx1cmUgKi8KLXN0YXRpYyB2b2lkCi1yZWFkX3Jlc19kYXRhIChkYXRhLCBzaXplLCBjb3VudCkKLSAgICAgdm9pZCAqZGF0YTsKLSAgICAgc2l6ZV90IHNpemU7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgaWYgKGZyZWFkIChkYXRhLCBzaXplLCBjb3VudCwgZnJlcykgIT0gKHNpemVfdCkgY291bnQpCi0gICAgZmF0YWwgKCIlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZSIsIGZpbGVuYW1lKTsKLX0KLQotLyogV3JpdGUgYSByZXNvdXJjZSBpZCAqLwotc3RhdGljIHZvaWQKLXdyaXRlX3Jlc19pZCAoaWQpCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKmlkOwotewotICBpZiAoaWQtPm5hbWVkKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuID0gaWQtPnUubi5sZW5ndGg7Ci0gICAgICB1bmljaGFyIG51bGxfdGVybSA9IDA7Ci0gICAgICB3cml0ZV9yZXNfZGF0YSAoaWQtPnUubi5uYW1lLCBsZW4gKiBzaXplb2YgKHVuaWNoYXIpLCAxKTsKLSAgICAgIHdyaXRlX3Jlc19kYXRhICgmbnVsbF90ZXJtLCBzaXplb2YgKG51bGxfdGVybSksIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGkgPSAweEZGRkY7Ci0gICAgICB3cml0ZV9yZXNfZGF0YSAoJmksIHNpemVvZiAoaSksIDEpOwotICAgICAgaSA9IGlkLT51LmlkOwotICAgICAgd3JpdGVfcmVzX2RhdGEgKCZpLCBzaXplb2YgKGkpLCAxKTsKLSAgICB9Ci19Ci0KLS8qIFdyaXRlIHJlc291cmNlIGluZm8gKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfaW5mbyAoaW5mbykKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqaW5mbzsKLXsKLSAgd3JpdGVfcmVzX2RhdGEgKCZpbmZvLT52ZXJzaW9uLCBzaXplb2YgKGluZm8tPnZlcnNpb24pLCAxKTsKLSAgd3JpdGVfcmVzX2RhdGEgKCZpbmZvLT5tZW1mbGFncywgc2l6ZW9mIChpbmZvLT5tZW1mbGFncyksIDEpOwotICB3cml0ZV9yZXNfZGF0YSAoJmluZm8tPmxhbmd1YWdlLCBzaXplb2YgKGluZm8tPmxhbmd1YWdlKSwgMSk7Ci0gIHdyaXRlX3Jlc19kYXRhICgmaW5mby0+dmVyc2lvbiwgc2l6ZW9mIChpbmZvLT52ZXJzaW9uKSwgMSk7Ci0gIHdyaXRlX3Jlc19kYXRhICgmaW5mby0+Y2hhcmFjdGVyaXN0aWNzLCBzaXplb2YgKGluZm8tPmNoYXJhY3RlcmlzdGljcyksIDEpOwotfQotCi0vKiByZWFkIGEgcmVzb3VyY2UgaWRlbnRpZmllciAqLwotdm9pZCAKLXJlYWRfcmVzX2lkIChpZCkKLSAgICAgc3RydWN0IHJlc19pZCAqaWQ7Ci17Ci0gIHVuc2lnbmVkIHNob3J0IG9yZDsKLSAgdW5pY2hhciAqaWRfcyA9IE5VTEw7Ci0gIGludCBsZW47Ci0KLSAgcmVhZF9yZXNfZGF0YSAoJm9yZCwgc2l6ZW9mIChvcmQpLCAxKTsKLSAgaWYgKG9yZCA9PSAweEZGRkYpCQkvKiBhbiBvcmRpbmFsIGlkICovCi0gICAgewotICAgICAgcmVhZF9yZXNfZGF0YSAoJm9yZCwgc2l6ZW9mIChvcmQpLCAxKTsKLSAgICAgIGlkLT5uYW1lZCA9IDA7Ci0gICAgICBpZC0+dS5pZCA9IG9yZDsKLSAgICB9Ci0gIGVsc2UKLSAgICAvKiBuYW1lZCBpZCAqLwotICAgIHsKLSAgICAgIGlmIChmc2VlayAoZnJlcywgLXNpemVvZiAob3JkKSwgU0VFS19DVVIpICE9IDApCi0JZmF0YWwgKCIlczogJXM6IGNvdWxkIG5vdCBzZWVrIGluIGZpbGUiLCBwcm9ncmFtX25hbWUsIGZpbGVuYW1lKTsKLSAgICAgIGlkX3MgPSByZWFkX3VuaXN0cmluZyAoJmxlbik7Ci0gICAgICBpZC0+bmFtZWQgPSAxOwotICAgICAgaWQtPnUubi5sZW5ndGggPSBsZW47Ci0gICAgICBpZC0+dS5uLm5hbWUgPSBpZF9zOwotICAgIH0KLX0KLQotLyogUmVhZCBhIG51bGwgdGVybWluYXRlZCBVTklDT0RFIHN0cmluZyAqLwotc3RhdGljIHVuaWNoYXIgKgotcmVhZF91bmlzdHJpbmcgKGxlbikKLSAgICAgaW50ICpsZW47Ci17Ci0gIHVuaWNoYXIgKnM7Ci0gIHVuaWNoYXIgYzsKLSAgdW5pY2hhciAqcDsKLSAgaW50IGw7Ci0KLSAgKmxlbiA9IDA7Ci0gIGwgPSAwOwotCi0gIC8qIHRoZXJlIGFyZSBoYXJkbHkgYW55IG5hbWVzIGxvbmdlciB0aGFuIDI1NiBjaGFyYWN0ZXJzICovCi0gIHAgPSBzID0gKHVuaWNoYXIgKikgeG1hbGxvYyAoc2l6ZW9mICh1bmljaGFyKSAqIDI1Nik7Ci0gIGRvCi0gICAgewotICAgICAgcmVhZF9yZXNfZGF0YSAoJmMsIHNpemVvZiAoYyksIDEpOwotICAgICAgKnArKyA9IGM7Ci0gICAgICBpZiAoYyAhPSAwKQotCWwrKzsKLSAgICB9Ci0gIHdoaWxlIChjICE9IDApOwotICAqbGVuID0gbDsKLSAgcmV0dXJuIHM7Ci19Ci0KLS8qIGFsaWduIGZpbGUgb24gRFdPUkQgYm91bmRhcnkgKi8KLXN0YXRpYyB2b2lkCi1yZXNfYWxpZ25fZmlsZSAodm9pZCkKLXsKLSAgaWYgKGZzZWVrIChmcmVzLCBmdGVsbCAoZnJlcykgJSA0LCBTRUVLX0NVUikgIT0gMCkKLSAgICBmYXRhbCAoIiVzOiAlczogdW5hYmxlIHRvIGFsaWduIGZpbGUiLCBwcm9ncmFtX25hbWUsIGZpbGVuYW1lKTsKLX0KLQotLyogQ2hlY2sgaWYgZmlsZSBpcyBhIHdpbjMyIGJpbmFyeSByZXNvdXJjZSBmaWxlLCBpZiBzbwotICAgc2tpcCBwYXN0IHRoZSBudWxsIHJlc291cmNlLiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgb24KLSAgIGVycm9yLgotICovCi1zdGF0aWMgdm9pZAotc2tpcF9udWxsX3Jlc291cmNlICh2b2lkKQotewotICBzdHJ1Y3QgcmVzX2hkciByZXNoZHIgPQotICB7MCwgMH07Ci0gIHJlYWRfcmVzX2RhdGEgKCZyZXNoZHIsIHNpemVvZiAocmVzaGRyKSwgMSk7Ci0gIGlmICgocmVzaGRyLmRhdGFfc2l6ZSAhPSAwKSB8fCAocmVzaGRyLmhlYWRlcl9zaXplICE9IDB4MjApKQotICAgIGdvdG8gc2tpcF9lcnI7Ci0KLSAgLyogU3VidHJhY3Qgc2l6ZSBvZiBIZWFkZXJTaXplIGFuZCBEYXRhU2l6ZSAqLwotICBpZiAoZnNlZWsgKGZyZXMsIHJlc2hkci5oZWFkZXJfc2l6ZSAtIDgsIFNFRUtfQ1VSKSAhPSAwKQotICAgIGdvdG8gc2tpcF9lcnI7Ci0KLSAgcmV0dXJuOwotCi1za2lwX2VycjoKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiBOb3QgYSB2YWxpZCBXSU4zMiByZXNvdXJjZSBmaWxlXG4iLCBwcm9ncmFtX25hbWUsCi0JICAgZmlsZW5hbWUpOwotICB4ZXhpdCAoMSk7Ci19Ci0KLS8qIEFkZCBhIHJlc291cmNlIHRvIHJlc291cmNlIGRpcmVjdG9yeSAqLwotdm9pZAotcmVzX2FkZF9yZXNvdXJjZSAociwgdHlwZSwgaWQsIGxhbmd1YWdlLCBkdXBvaykKLSAgICAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWQ7Ci0gICAgIGludCBsYW5ndWFnZTsKLSAgICAgaW50IGR1cG9rOwotewotICBzdHJ1Y3QgcmVzX2lkIGFbM107Ci0KLSAgYVswXSA9ICp0eXBlOwotICBhWzFdID0gKmlkOwotICBhWzJdLm5hbWVkID0gMDsKLSAgYVsyXS51LmlkID0gbGFuZ3VhZ2U7Ci0gIHJlc19hcHBlbmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIHIsIDMsIGEsIGR1cG9rKTsKLX0KLQotLyogQXBwZW5kIGEgcmVzb3VyY2UgdG8gcmVzb3VyY2UgZGlyZWN0b3J5LgotICAgVGhpcyBpcyBqdXN0IGNvcGllZCBmcm9tIGRlZmluZV9yZXNvdXJjZQotICAgYW5kIG1vZGlmaWVkIHRvIGFkZCBhbiBleGlzdGluZyByZXNvdXJjZS4KLSAqLwotdm9pZAotcmVzX2FwcGVuZF9yZXNvdXJjZSAocmVzb3VyY2VzLCByZXNvdXJjZSwgY2lkcywgaWRzLCBkdXBvaykKLSAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKipyZXNvdXJjZXM7Ci0gICAgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlc291cmNlOwotICAgICBpbnQgY2lkczsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWRzOwotICAgICBpbnQgZHVwb2s7Ci17Ci0gIHN0cnVjdCByZXNfZW50cnkgKnJlID0gTlVMTDsKLSAgaW50IGk7Ci0KLSAgYXNzZXJ0IChjaWRzID4gMCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjaWRzOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IHJlc19lbnRyeSAqKnBwOwotCi0gICAgICBpZiAoKnJlc291cmNlcyA9PSBOVUxMKQotCXsKLQkgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWV2YWw7Ci0KLQkgIC8qIFVzZSB0aGUgc2FtZSB0aW1lc3RhbXAgZm9yIGV2ZXJ5IHJlc291cmNlIGNyZWF0ZWQgaW4gYQotCSAgICAgc2luZ2xlIHJ1bi4gICovCi0JICBpZiAodGltZXZhbCA9PSAwKQotCSAgICB0aW1ldmFsID0gdGltZSAoTlVMTCk7Ci0KLQkgICpyZXNvdXJjZXMgPSAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICopCi0JCQlyZXNfYWxsb2MgKHNpemVvZiAqKnJlc291cmNlcykpOwotCSAgKCpyZXNvdXJjZXMpLT5jaGFyYWN0ZXJpc3RpY3MgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT50aW1lID0gdGltZXZhbDsKLQkgICgqcmVzb3VyY2VzKS0+bWFqb3IgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT5taW5vciA9IDA7Ci0JICAoKnJlc291cmNlcyktPmVudHJpZXMgPSBOVUxMOwotCX0KLQotICAgICAgZm9yIChwcCA9ICYoKnJlc291cmNlcyktPmVudHJpZXM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQlpZiAocmVzX2lkX2NtcCAoKCpwcCktPmlkLCBpZHNbaV0pID09IDApCi0JICBicmVhazsKLQotICAgICAgaWYgKCpwcCAhPSBOVUxMKQotCXJlID0gKnBwOwotICAgICAgZWxzZQotCXsKLQkgIHJlID0gKHN0cnVjdCByZXNfZW50cnkgKikgcmVzX2FsbG9jIChzaXplb2YgKnJlKTsKLQkgIHJlLT5uZXh0ID0gTlVMTDsKLQkgIHJlLT5pZCA9IGlkc1tpXTsKLQkgIGlmICgoaSArIDEpIDwgY2lkcykKLQkgICAgewotCSAgICAgIHJlLT5zdWJkaXIgPSAxOwotCSAgICAgIHJlLT51LmRpciA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlLT5zdWJkaXIgPSAwOwotCSAgICAgIHJlLT51LnJlcyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnBwID0gcmU7Ci0JfQotCi0gICAgICBpZiAoKGkgKyAxKSA8IGNpZHMpCi0JewotCSAgaWYgKCFyZS0+c3ViZGlyKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBpLCBpZHMpOwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogZXhwZWN0ZWQgdG8gYmUgYSBkaXJlY3RvcnlcbiIpOwotCSAgICAgIHhleGl0ICgxKTsKLQkgICAgfQotCi0JICByZXNvdXJjZXMgPSAmcmUtPnUuZGlyOwotCX0KLSAgICB9Ci0KLSAgaWYgKHJlLT5zdWJkaXIpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0gICAgICByZXNfaWRzX3ByaW50IChzdGRlcnIsIGNpZHMsIGlkcyk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI6IGV4cGVjdGVkIHRvIGJlIGEgbGVhZlxuIik7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChyZS0+dS5yZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZHVwb2spCi0JcmV0dXJuOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogd2FybmluZzogIiwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRzKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogZHVwbGljYXRlIHZhbHVlXG4iKTsKLSAgICB9Ci0KLSAgcmUtPnUucmVzID0gcmVzb3VyY2U7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zYW5pdHkuc2ggYi9iaW51dGlscy9zYW5pdHkuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0MmNhYmYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc2FuaXR5LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyEvYmluL3NoCi0jIyMgcXVpY2sgc2FuaXR5IHRlc3QgZm9yIHRoZSBiaW51dGlscy4KLSMjIwotIyMjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBhbmQgaXMgbWFpbnRhaW5lZCBieSBLLiBSaWNoYXJkIFBpeGxleSwKLSMjIyByaWNoQGN5Z251cy5jb20uCi0KLSMjIyBmYWlsIG9uIGVycm9ycwotc2V0IC1lCi0KLSMjIyBmaXJzdCBhcmcgaXMgZGlyZWN0b3J5IGluIHdoaWNoIGJpbmFyaWVzIHRvIGJlIHRlc3RlZCByZXNpZGUuCi1jYXNlICIkMSIgaW4KLSIiKSBCSU49LiA7OwotKikgIEJJTj0iJDEiIDs7Ci1lc2FjCi0KLSMjIyBzaXplCi1mb3IgaSBpbiBzaXplIG9iamR1bXAgbm0gYXIgc3RyaXAgcmFubGliIDsgZG8KLQkke0JJTn0vc2l6ZSAke0JJTn0vJGkgPiAvZGV2L251bGwKLWRvbmUKLQotIyMjIG9iamR1bXAKLWZvciBpIGluIHNpemUgb2JqZHVtcCBubSBhciBzdHJpcCByYW5saWIgOyBkbwotCSR7QklOfS9vYmpkdW1wIC1haGlmZHJ0eHNsICR7QklOfS8kaSA+IC9kZXYvbnVsbAotZG9uZQotCi0jIyMgbm0KLWZvciBpIGluIHNpemUgb2JqZHVtcCBubSBhciBzdHJpcCByYW5saWIgOyBkbwotCSR7QklOfS9ubSAke0JJTn0vJGkgPiAvZGV2L251bGwKLWRvbmUKLQotIyMjIHN0cmlwCi1UTVBESVI9Li9iaW51dGlscy0kJAotbWtkaXIgJHtUTVBESVJ9Ci0KLWNwICR7QklOfS9zdHJpcCAke1RNUERJUn0vc3RyaXAKLQotZm9yIGkgaW4gc2l6ZSBvYmpkdW1wIG5tIGFyIHJhbmxpYiA7IGRvCi0JY3AgJHtCSU59LyRpICR7VE1QRElSfS8kaQotCSR7QklOfS9zdHJpcCAke1RNUERJUn0vJGkKLQljcCAke0JJTn0vJGkgJHtUTVBESVJ9LyRpCi0JJHtUTVBESVJ9L3N0cmlwICR7VE1QRElSfS8kaQotZG9uZQotCi0jIyMgYXIKLQotIyMjIHJhbmxpYgotCi1ybSAtcmYgJHtUTVBESVJ9Ci0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvYmludXRpbHMvc2l6ZS4xIGIvYmludXRpbHMvc2l6ZS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjE5YmQyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3NpemUuMQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggc2l6ZSAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1zaXplIFwtIGxpc3Qgc2VjdGlvbiBzaXplcyBhbmQgdG90YWwgc2l6ZS4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIHNpemUKLS5SQiAiW1x8IiBcLUEgXHx8XHwgXC1CIFx8fFx8IFxjCi0uQkkgIlwtXC1mb3JtYXQ9IiBjb21wYXRpYmlsaXR5XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIgCi0uUkIgIltcfCIgXC1kIFx8fFx8IFwtbyBcfHxcfCBcLXhcYwotXHx8XHxcYwotLkJJICJcLVwtcmFkaXg9IiBudW1iZXJcYwotXCZcfF0KLS5SQiAiW1x8IiBcYwotLkJJICJcLVwtdGFyZ2V0PSIgYmZkbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiIFwtViBcfHxcfCBcLVwtdmVyc2lvbiAiXHxdIiAgCi0uSSBvYmpmaWxlXGMKLVwmLlx8Llx8LgotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLVRoZSBHTlUgXGMKLS5CIHNpemVcYwotXCYgdXRpbGl0eSBsaXN0cyB0aGUgc2VjdGlvbiBzaXplc1woZW1cJmFuZCB0aGUgdG90YWwKLXNpemVcKGVtXCZmb3IgZWFjaCBvZiB0aGUgb2JqZWN0IGZpbGVzCi0uSSBvYmpmaWxlCi1pbiBpdHMgYXJndW1lbnQgbGlzdC4KLUJ5IGRlZmF1bHQsIG9uZSBsaW5lIG9mIG91dHB1dCBpcyBnZW5lcmF0ZWQgZm9yIGVhY2ggb2JqZWN0IGZpbGUgb3IgZWFjaAotbW9kdWxlIGluIGFuIGFyY2hpdmUuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CIFwtQQotLlRQCi0uQiBcLUIKLS5UUAotLkJJICJcLVwtZm9ybWF0ICIgImNvbXBhdGliaWxpdHkiCi1Vc2luZyBvbmUgb2YgdGhlc2Ugb3B0aW9ucywgeW91IGNhbiBjaG9vc2Ugd2hldGhlciB0aGUgb3V0cHV0IGZyb20gR05VCi1cYwotLkIgc2l6ZVxjCi1cJiByZXNlbWJsZXMgb3V0cHV0IGZyb20gU3lzdGVtIFYgXGMKLS5CIHNpemVcYwotXCYgKHVzaW5nIGBcfFxjCi0uQiBcLUFcYwotXHwnLAotb3IgYFx8XGMKLS5CIFwtXC1mb3JtYXQ9c3lzdlxjCi1cfCcpLCBvciBCZXJrZWxleSBcYwotLkIgc2l6ZVxjCi1cJiAodXNpbmcgYFx8XGMKLS5CIFwtQlxjCi1cfCcsIG9yCi1gXHxcYwotLkIgXC1cLWZvcm1hdD1iZXJrZWxleVxjCi1cfCcpLiAgVGhlIGRlZmF1bHQgaXMgdGhlIG9uZS1saW5lIGZvcm1hdCBzaW1pbGFyIHRvCi1CZXJrZWxleSdzLiAgCi0KLS5UUAotLkIgXC1cLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIGFjY2VwdGFibGUgYXJndW1lbnRzIGFuZCBvcHRpb25zLgotCi0uVFAKLS5CIFwtZAotLlRQCi0uQiBcLW8KLS5UUAotLkIgXC14Ci0uVFAKLS5CSSAiXC1cLXJhZGl4ICIgIm51bWJlciIKLVVzaW5nIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGNvbnRyb2wgd2hldGhlciB0aGUgc2l6ZSBvZiBlYWNoCi1zZWN0aW9uIGlzIGdpdmVuIGluIGRlY2ltYWwgKGBcfFxjCi0uQiBcLWRcYwotXHwnLCBvciBgXHxcYwotLkIgXC1cLXJhZGl4IDEwXGMKLVx8Jyk7IG9jdGFsCi0oYFx8XGMKLS5CIFwtb1xjCi1cfCcsIG9yIGBcfFxjCi0uQiBcLVwtcmFkaXggOFxjCi1cfCcpOyBvciBoZXhhZGVjaW1hbCAoYFx8XGMKLS5CIFwteFxjCi1cfCcsIG9yCi1gXHxcYwotLkIgXC1cLXJhZGl4IDE2XGMKLVx8JykuICBJbiBgXHxcYwotLkIgXC1cLXJhZGl4IFxjCi0uSSBudW1iZXJcYwotXCZcYwotXHwnLCBvbmx5IHRoZSB0aHJlZQotdmFsdWVzICg4LCAxMCwgMTYpIGFyZSBzdXBwb3J0ZWQuICBUaGUgdG90YWwgc2l6ZSBpcyBhbHdheXMgZ2l2ZW4gaW4gdHdvCi1yYWRpY2VzOyBkZWNpbWFsIGFuZCBoZXhhZGVjaW1hbCBmb3IgYFx8XGMKLS5CIFwtZFxjCi1cfCcgb3IgYFx8XGMKLS5CIFwteFxjCi1cfCcgb3V0cHV0LCBvcgotb2N0YWwgYW5kIGhleGFkZWNpbWFsIGlmIHlvdSdyZSB1c2luZyBgXHxcYwotLkIgXC1vXGMKLVx8Jy4KLQotLlRQCi0uQkkgIlwtXC10YXJnZXQgIiAiYmZkbmFtZSIKLVlvdSBjYW4gc3BlY2lmeSBhIHBhcnRpY3VsYXIgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciBcYwotLkkgb2JqZmlsZVxjCi1cJiBhcwotXGMKLS5JIGJmZG5hbWVcYwotXCYuICBUaGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBcYwotLkkgc2l6ZVxjCi1cJiBjYW4KLWF1dG9tYXRpY2FsbHkgcmVjb2duaXplIG1hbnkgZm9ybWF0cy4gICBTZWUgCi0uQlIgb2JqZHVtcCAoIDEgKSAKLWZvciBpbmZvcm1hdGlvbgotb24gbGlzdGluZyBhdmFpbGFibGUgZm9ybWF0cy4KLQotLlRQCi0uQiBcLVYKLS5UUAotLkIgXC1cLXZlcnNpb24KLURpc3BsYXkgdmVyc2lvbiBudW1iZXIgaW5mb3JtYXRpb24gb24gXGMKLS5CIHNpemVcYwotXCYgaXRzZWxmLgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAotZW50cnkgaW4gCi0uQlIgaW5mbyA7Ci0uSVIgIlRoZSBHTlUgQmluYXJ5IFV0aWxpdGllcyIgLAotIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsgCi0uQlIgYXIgIigiIDEgIiksIgotLkJSIG9iamR1bXAgKCAxICkuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3NpemUuYyBiL2JpbnV0aWxzL3NpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzODUwYy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zaXplLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotLyogc2l6ZS5jIC0tIHJlcG9ydCBzaXplIG9mIHZhcmlvdXMgc2VjdGlvbnMgb2YgYW4gZXhlY3V0YWJsZSBmaWxlLgotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyogRXh0ZW5zaW9ucy9pbmNvbXBhdGliaWxpdGllczoKLSAgIG8gLSBCU0Qgb3V0cHV0IGhhcyBmaWxlbmFtZXMgYXQgdGhlIGVuZC4KLSAgIG8gLSBCU0Qgb3V0cHV0IGNhbiBhcHBlYXIgaW4gZGlmZmVyZW50IHJhZGljaWVzLgotICAgbyAtIFN5c1Ygb3V0cHV0IGhhcyBsZXNzIHJlZHVuZGFudCB3aGl0ZXNwYWNlLiAgRmlsZW5hbWUgY29tZXMgYXQgZW5kLgotICAgbyAtIFN5c1Ygb3V0cHV0IGRvZXNuJ3Qgc2hvdyBWTUEgd2hpY2ggaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBQTUEuCi0gICBvIC0gV2UgYWxzbyBoYW5kbGUgY29yZSBmaWxlcy4KLSAgIG8gLSBXZSBhbHNvIGhhbmRsZSBhcmNoaXZlcy4KLSAgIElmIHlvdSB3cml0ZSBzaGVsbCBzY3JpcHRzIHdoaWNoIG1hbmlwdWxhdGUgdGhpcyBpbmZvIHRoZW4geW91IG1heSBiZQotICAgb3V0IG9mIGx1Y2s7IHRoZXJlJ3Mgbm8gLS1jb21wYXRpYmlsaXR5IG9yIC0tcGVkYW50aWMgb3B0aW9uLgotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWZuZGVmIEJTRF9ERUZBVUxUCi0jZGVmaW5lIEJTRF9ERUZBVUxUIDEKLSNlbmRpZgotCi0vKiBQcm9ncmFtIG9wdGlvbnMuICAqLwotCi1lbnVtCi0gIHsKLSAgICBkZWNpbWFsLCBvY3RhbCwgaGV4Ci0gIH0gcmFkaXggPSBkZWNpbWFsOwotaW50IGJlcmtlbGV5X2Zvcm1hdCA9IEJTRF9ERUZBVUxUOwkvKiAwIG1lYW5zIHVzZSBBVCZULXN0eWxlIG91dHB1dC4gICovCi1pbnQgc2hvd192ZXJzaW9uID0gMDsKLWludCBzaG93X2hlbHAgPSAwOwotCi0vKiBQcm9ncmFtIGV4aXQgc3RhdHVzLiAgKi8KLWludCByZXR1cm5fY29kZSA9IDA7Ci0KLXN0YXRpYyBjaGFyICp0YXJnZXQgPSBOVUxMOwotCi0vKiBTdGF0aWMgZGVjbGFyYXRpb25zICovCi0KLXN0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkaXNwbGF5X2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLXN0YXRpYyB2b2lkIGRpc3BsYXlfYmZkIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBkaXNwbGF5X2FyY2hpdmUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgc2l6ZV9udW1iZXIgUEFSQU1TICgoYmZkX3NpemVfdHlwZSkpOwotI2lmIDAKLXN0YXRpYyB2b2lkIGxwcmludF9udW1iZXIgUEFSQU1TICgoaW50LCBiZmRfc2l6ZV90eXBlKSk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIHJwcmludF9udW1iZXIgUEFSQU1TICgoaW50LCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9iZXJrZWxleV9mb3JtYXQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHN5c3ZfaW50ZXJuYWxfc2l6ZXIgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgc3lzdl9pbnRlcm5hbF9wcmludGVyIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHByaW50X3N5c3ZfZm9ybWF0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zaXplcyBQQVJBTVMgKChiZmQgKiBmaWxlKSk7Ci1zdGF0aWMgdm9pZCBiZXJrZWxleV9zdW0gUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUikpOwotDAotc3RhdGljIHZvaWQKLXVzYWdlIChzdHJlYW0sIHN0YXR1cykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLVVzYWdlOiAlcyBbLUFCZG94Vl0gWy0tZm9ybWF0PWJlcmtlbGV5fHN5c3ZdIFstLXJhZGl4PTh8MTB8MTZdXG5cCi0gICAgICAgWy0tdGFyZ2V0PWJmZG5hbWVdIFstLXZlcnNpb25dIFstLWhlbHBdIFtmaWxlLi4uXVxuIiksIHByb2dyYW1fbmFtZSk7Ci0jaWYgQlNEX0RFRkFVTFQKLSAgZnB1dHMgKF8oImRlZmF1bHQgaXMgLS1mb3JtYXQ9YmVya2VsZXlcbiIpLCBzdHJlYW0pOwotI2Vsc2UKLSAgZnB1dHMgKF8oImRlZmF1bHQgaXMgLS1mb3JtYXQ9c3lzdlxuIiksIHN0cmVhbSk7Ci0jZW5kaWYKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDIwMH0sCi0gIHsicmFkaXgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMjAxfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMjAyfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsICZzaG93X3ZlcnNpb24sIDF9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgJnNob3dfaGVscCwgMX0sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgdGVtcDsKLSAgaW50IGM7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSAqYXJndjsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiQUJWZG94IiwgbG9uZ19vcHRpb25zLAotCQkJICAgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHN3aXRjaCAoYykKLSAgICAgIHsKLSAgICAgIGNhc2UgMjAwOgkJLyogLS1mb3JtYXQgKi8KLQlzd2l0Y2ggKCpvcHRhcmcpCi0JICB7Ci0JICBjYXNlICdCJzoKLQkgIGNhc2UgJ2InOgotCSAgICBiZXJrZWxleV9mb3JtYXQgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1MnOgotCSAgY2FzZSAncyc6Ci0JICAgIGJlcmtlbGV5X2Zvcm1hdCA9IDA7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnZhbGlkIGFyZ3VtZW50IHRvIC0tZm9ybWF0OiAlc1xuIiksIG9wdGFyZyk7Ci0JICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBjYXNlIDIwMjoJCS8qIC0tdGFyZ2V0ICovCi0JdGFyZ2V0ID0gb3B0YXJnOwotCWJyZWFrOwotCi0gICAgICBjYXNlIDIwMToJCS8qIC0tcmFkaXggKi8KLSNpZmRlZiBBTlNJX0xJQlJBUklFUwotCXRlbXAgPSBzdHJ0b2wgKG9wdGFyZywgTlVMTCwgMTApOwotI2Vsc2UKLQl0ZW1wID0gYXRvbCAob3B0YXJnKTsKLSNlbmRpZgotCXN3aXRjaCAodGVtcCkKLQkgIHsKLQkgIGNhc2UgMTA6Ci0JICAgIHJhZGl4ID0gZGVjaW1hbDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDg6Ci0JICAgIHJhZGl4ID0gb2N0YWw7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxNjoKLQkgICAgcmFkaXggPSBoZXg7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgcHJpbnRmIChfKCJJbnZhbGlkIHJhZGl4OiAlc1xuIiksIG9wdGFyZyk7Ci0JICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgfQotCWJyZWFrOwotCi0gICAgICBjYXNlICdBJzoKLQliZXJrZWxleV9mb3JtYXQgPSAwOwotCWJyZWFrOwotICAgICAgY2FzZSAnQic6Ci0JYmVya2VsZXlfZm9ybWF0ID0gMTsKLQlicmVhazsKLSAgICAgIGNhc2UgJ1YnOgotCXNob3dfdmVyc2lvbiA9IDE7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdkJzoKLQlyYWRpeCA9IGRlY2ltYWw7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICd4JzoKLQlyYWRpeCA9IGhleDsKLQlicmVhazsKLSAgICAgIGNhc2UgJ28nOgotCXJhZGl4ID0gb2N0YWw7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDA6Ci0JYnJlYWs7Ci0gICAgICBjYXNlICc/JzoKLQl1c2FnZSAoc3RkZXJyLCAxKTsKLSAgICAgIH0KLQotICBpZiAoc2hvd192ZXJzaW9uKQotICAgIHByaW50X3ZlcnNpb24gKCJzaXplIik7Ci0gIGlmIChzaG93X2hlbHApCi0gICAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0KLSAgaWYgKG9wdGluZCA9PSBhcmdjKQotICAgIGRpc3BsYXlfZmlsZSAoImEub3V0Iik7Ci0gIGVsc2UKLSAgICBmb3IgKDsgb3B0aW5kIDwgYXJnYzspCi0gICAgICBkaXNwbGF5X2ZpbGUgKGFyZ3Zbb3B0aW5kKytdKTsKLQotICByZXR1cm4gcmV0dXJuX2NvZGU7Ci19Ci0MCi0vKiBEaXNwbGF5IHN0YXRzIG9uIGZpbGUgb3IgYXJjaGl2ZSBtZW1iZXIgQUJGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2JmZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9hcmNoaXZlKSkKLSAgICAvKiBBbiBhcmNoaXZlIHdpdGhpbiBhbiBhcmNoaXZlLiAgKi8KLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBwcmludF9zaXplcyAoYWJmZCk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0gICAgICBmcmVlIChtYXRjaGluZyk7Ci0gICAgICByZXR1cm5fY29kZSA9IDM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9jb3JlLCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIENPTlNUIGNoYXIgKmNvcmVfY21kOwotCi0gICAgICBwcmludF9zaXplcyAoYWJmZCk7Ci0gICAgICBmcHV0cyAoIiAoY29yZSBmaWxlIiwgc3Rkb3V0KTsKLQotICAgICAgY29yZV9jbWQgPSBiZmRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCk7Ci0gICAgICBpZiAoY29yZV9jbWQpCi0JcHJpbnRmICgiIGludm9rZWQgYXMgJXMiLCBjb3JlX2NtZCk7Ci0KLSAgICAgIHB1dHMgKCIpXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLSAgICB7Ci0gICAgICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLSAgICAgIGZyZWUgKG1hdGNoaW5nKTsKLSAgICB9Ci0KLSAgcmV0dXJuX2NvZGUgPSAzOwotfQotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9hcmNoaXZlIChmaWxlKQotICAgICBiZmQgKmZpbGU7Ci17Ci0gIGJmZCAqYXJmaWxlID0gKGJmZCAqKSBOVUxMOwotCi0gIGZvciAoOzspCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQotICAgICAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZmlsZSwgYXJmaWxlKTsKLSAgICAgIGlmIChhcmZpbGUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcykKLQkgICAgewotCSAgICAgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoZmlsZSkpOwotCSAgICAgIHJldHVybl9jb2RlID0gMjsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBkaXNwbGF5X2JmZCAoYXJmaWxlKTsKLSAgICAgIC8qIERvbid0IGNsb3NlIHRoZSBhcmNoaXZlIGVsZW1lbnRzOyB3ZSBuZWVkIHRoZW0gZm9yIG5leHRfYXJjaGl2ZSAqLwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfZmlsZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBiZmQgKmZpbGUgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuX2NvZGUgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlsZSwgYmZkX2FyY2hpdmUpID09IHRydWUpCi0gICAgZGlzcGxheV9hcmNoaXZlIChmaWxlKTsKLSAgZWxzZQotICAgIGRpc3BsYXlfYmZkIChmaWxlKTsKLQotICBpZiAoYmZkX2Nsb3NlIChmaWxlKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGZpbGVuYW1lKTsKLSAgICAgIHJldHVybl9jb2RlID0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0MCi0vKiBUaGlzIGlzIHdoYXQgbGV4aWNhbCBmdW5jdGlvbnMgYXJlIGZvci4gICovCi0KLXN0YXRpYyBpbnQKLXNpemVfbnVtYmVyIChudW0pCi0gICAgIGJmZF9zaXplX3R5cGUgbnVtOwotewotICBjaGFyIGJ1ZmZlcls0MF07Ci0gIHNwcmludGYgKGJ1ZmZlciwKLQkgICAocmFkaXggPT0gZGVjaW1hbCA/ICIlbHUiIDoKLQkgICAoKHJhZGl4ID09IG9jdGFsKSA/ICIwJWxvIiA6ICIweCVseCIpKSwKLQkgICAodW5zaWduZWQgbG9uZykgbnVtKTsKLQotICByZXR1cm4gc3RybGVuIChidWZmZXIpOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vdCB1c2VkLiAgKi8KLQotc3RhdGljIHZvaWQKLWxwcmludF9udW1iZXIgKHdpZHRoLCBudW0pCi0gICAgIGludCB3aWR0aDsKLSAgICAgYmZkX3NpemVfdHlwZSBudW07Ci17Ci0gIGNoYXIgYnVmZmVyWzQwXTsKLSAgc3ByaW50ZiAoYnVmZmVyLAotCSAgIChyYWRpeCA9PSBkZWNpbWFsID8gIiVsdSIgOgotCSAgICgocmFkaXggPT0gb2N0YWwpID8gIjAlbG8iIDogIjB4JWx4IikpLAotCSAgICh1bnNpZ25lZCBsb25nKSBudW0pOwotCi0gIHByaW50ZiAoIiUtKnMiLCB3aWR0aCwgYnVmZmVyKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1ycHJpbnRfbnVtYmVyICh3aWR0aCwgbnVtKQotICAgICBpbnQgd2lkdGg7Ci0gICAgIGJmZF9zaXplX3R5cGUgbnVtOwotewotICBjaGFyIGJ1ZmZlcls0MF07Ci0gIHNwcmludGYgKGJ1ZmZlciwKLQkgICAocmFkaXggPT0gZGVjaW1hbCA/ICIlbHUiIDoKLQkgICAoKHJhZGl4ID09IG9jdGFsKSA/ICIwJWxvIiA6ICIweCVseCIpKSwKLQkgICAodW5zaWduZWQgbG9uZykgbnVtKTsKLQotICBwcmludGYgKCIlKnMiLCB3aWR0aCwgYnVmZmVyKTsKLX0KLQotc3RhdGljIGJmZF9zaXplX3R5cGUgYnNzc2l6ZTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIGRhdGFzaXplOwotc3RhdGljIGJmZF9zaXplX3R5cGUgdGV4dHNpemU7Ci0KLXN0YXRpYyB2b2lkCi1iZXJrZWxleV9zdW0gKGFiZmQsIHNlYywgaWdub3JlKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VjX3B0ciBzZWM7Ci0gICAgIFBUUiBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLSAgaWYgKChmbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLSAgaWYgKChmbGFncyAmIFNFQ19DT0RFKSAhPSAwIHx8IChmbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMCkKLSAgICB0ZXh0c2l6ZSArPSBzaXplOwotICBlbHNlIGlmICgoZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotICAgIGRhdGFzaXplICs9IHNpemU7Ci0gIGVsc2UKLSAgICBic3NzaXplICs9IHNpemU7Ci19Ci0KLXN0YXRpYyB2b2lkIAotcHJpbnRfYmVya2VsZXlfZm9ybWF0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0YXRpYyBpbnQgZmlsZXNfc2VlbiA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgdG90YWw7Ci0KLSAgYnNzc2l6ZSA9IDA7Ci0gIGRhdGFzaXplID0gMDsKLSAgdGV4dHNpemUgPSAwOwotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgYmVya2VsZXlfc3VtLCAoUFRSKSBOVUxMKTsKLQotICBpZiAoZmlsZXNfc2VlbisrID09IDApCi0jaWYgMAotICAgIC8qIEludGVsIGRvZXNuJ3QgbGlrZSBic3Mvc3RrIGJlY2F1c2UgdGhleSBkb24ndCBoYXZlIGNvcmUgZmlsZXMuICAqLwotICAgIHB1dHMgKChyYWRpeCA9PSBvY3RhbCkgPyAiICAgdGV4dFx0ICAgZGF0YVx0YnNzL3N0a1x0ICAgIG9jdFx0ICAgIGhleFx0ZmlsZW5hbWUiIDoKLQkgICIgICB0ZXh0XHQgICBkYXRhXHRic3Mvc3RrXHQgICAgZGVjXHQgICAgaGV4XHRmaWxlbmFtZSIpOwotI2Vsc2UKLSAgICBwdXRzICgocmFkaXggPT0gb2N0YWwpID8gIiAgIHRleHRcdCAgIGRhdGFcdCAgICBic3NcdCAgICBvY3RcdCAgICBoZXhcdGZpbGVuYW1lIiA6Ci0JICAiICAgdGV4dFx0ICAgZGF0YVx0ICAgIGJzc1x0ICAgIGRlY1x0ICAgIGhleFx0ZmlsZW5hbWUiKTsKLSNlbmRpZgotCi0gIHRvdGFsID0gdGV4dHNpemUgKyBkYXRhc2l6ZSArIGJzc3NpemU7Ci0KLSAgcnByaW50X251bWJlciAoNywgdGV4dHNpemUpOwotICBwdXRjaGFyICgnXHQnKTsKLSAgcnByaW50X251bWJlciAoNywgZGF0YXNpemUpOwotICBwdXRjaGFyICgnXHQnKTsKLSAgcnByaW50X251bWJlciAoNywgYnNzc2l6ZSk7Ci0gIHByaW50ZiAoKChyYWRpeCA9PSBvY3RhbCkgPyAiXHQlN2xvXHQlN2x4XHQiIDogIlx0JTdsdVx0JTdseFx0IiksCi0JICAodW5zaWduZWQgbG9uZykgdG90YWwsICh1bnNpZ25lZCBsb25nKSB0b3RhbCk7Ci0KLSAgZnB1dHMgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdGRvdXQpOwotICBpZiAoYmZkX215X2FyY2hpdmUgKGFiZmQpKQotICAgIHByaW50ZiAoIiAoZXggJXMpIiwgYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGFiZmQpKSk7Ci19Ci0KLS8qIEkgUkVBTExZIG1pc3MgbGV4aWNhbCBmdW5jdGlvbnMhICovCi1iZmRfc2l6ZV90eXBlIHN2aV90b3RhbCA9IDA7Ci1iZmRfdm1hIHN2aV9tYXh2bWEgPSAwOwotaW50IHN2aV9uYW1lbGVuID0gMDsKLWludCBzdmlfdm1hbGVuID0gMDsKLWludCBzdmlfc2l6ZWxlbiA9IDA7Ci0KLXN0YXRpYyB2b2lkCi1zeXN2X2ludGVybmFsX3NpemVyIChmaWxlLCBzZWMsIGlnbm9yZSkKLSAgICAgYmZkICpmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlY19wdHIgc2VjOwotICAgICBQVFIgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGZpbGUsIHNlYyk7Ci0gIGlmICghYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpCi0gICAgICAmJiAhYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpCi0gICAgICAmJiAhYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpKQotICAgIHsKLSAgICAgIGludCBuYW1lbGVuID0gc3RybGVuIChiZmRfc2VjdGlvbl9uYW1lIChmaWxlLCBzZWMpKTsKLSAgICAgIGlmIChuYW1lbGVuID4gc3ZpX25hbWVsZW4pCi0Jc3ZpX25hbWVsZW4gPSBuYW1lbGVuOwotCi0gICAgICBzdmlfdG90YWwgKz0gc2l6ZTsKLSAgICAgIGlmIChiZmRfc2VjdGlvbl92bWEgKGZpbGUsIHNlYykgPiBzdmlfbWF4dm1hKQotCXN2aV9tYXh2bWEgPSBiZmRfc2VjdGlvbl92bWEgKGZpbGUsIHNlYyk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3lzdl9pbnRlcm5hbF9wcmludGVyIChmaWxlLCBzZWMsIGlnbm9yZSkKLSAgICAgYmZkICpmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlY19wdHIgc2VjOwotICAgICBQVFIgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGZpbGUsIHNlYyk7Ci0gIGlmICghYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpCi0gICAgICAmJiAhYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpCi0gICAgICAmJiAhYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpKQotICAgIHsKLSAgICAgIHN2aV90b3RhbCArPSBzaXplOwotCi0gICAgICBwcmludGYgKCIlLSpzICAgIiwgc3ZpX25hbWVsZW4sIGJmZF9zZWN0aW9uX25hbWUgKGZpbGUsIHNlYykpOwotICAgICAgcnByaW50X251bWJlciAoc3ZpX3NpemVsZW4sIHNpemUpOwotICAgICAgcHJpbnRmICgiICAgIik7Ci0gICAgICBycHJpbnRfbnVtYmVyIChzdmlfdm1hbGVuLCBiZmRfc2VjdGlvbl92bWEgKGZpbGUsIHNlYykpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeXN2X2Zvcm1hdCAoZmlsZSkKLSAgICAgYmZkICpmaWxlOwotewotICAvKiBzaXplIGFsbCBvZiB0aGUgY29sdW1ucyAqLwotICBzdmlfdG90YWwgPSAwOwotICBzdmlfbWF4dm1hID0gMDsKLSAgc3ZpX25hbWVsZW4gPSAwOwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGZpbGUsIHN5c3ZfaW50ZXJuYWxfc2l6ZXIsIChQVFIpIE5VTEwpOwotICBzdmlfdm1hbGVuID0gc2l6ZV9udW1iZXIgKChiZmRfc2l6ZV90eXBlKXN2aV9tYXh2bWEpOwotICBpZiAoKHNpemVfdCkgc3ZpX3ZtYWxlbiA8IHNpemVvZiAoImFkZHIiKSAtIDEpCi0gICAgc3ZpX3ZtYWxlbiA9IHNpemVvZiAoImFkZHIiKS0xOwotCi0gIHN2aV9zaXplbGVuID0gc2l6ZV9udW1iZXIgKHN2aV90b3RhbCk7Ci0gIGlmICgoc2l6ZV90KSBzdmlfc2l6ZWxlbiA8IHNpemVvZiAoInNpemUiKSAtIDEpCi0gICAgc3ZpX3NpemVsZW4gPSBzaXplb2YgKCJzaXplIiktMTsKLQotICBzdmlfdG90YWwgPSAwOwotICBwcmludGYgKCIlcyAgIiwgYmZkX2dldF9maWxlbmFtZSAoZmlsZSkpOwotICBpZiAoYmZkX215X2FyY2hpdmUgKGZpbGUpKQotICAgIHByaW50ZiAoIiAoZXggJXMpIiwgYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGZpbGUpKSk7Ci0KLSAgcHJpbnRmICgiOlxuJS0qcyAgICUqcyAgICUqc1xuIiwgc3ZpX25hbWVsZW4sICJzZWN0aW9uIiwKLQkgIHN2aV9zaXplbGVuLCAic2l6ZSIsIHN2aV92bWFsZW4sICJhZGRyIik7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoZmlsZSwgc3lzdl9pbnRlcm5hbF9wcmludGVyLCAoUFRSKSBOVUxMKTsKLQotICBwcmludGYgKCIlLSpzICAgIiwgc3ZpX25hbWVsZW4sICJUb3RhbCIpOwotICBycHJpbnRfbnVtYmVyIChzdmlfc2l6ZWxlbiwgc3ZpX3RvdGFsKTsKLSAgcHJpbnRmICgiXG5cbiIpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc2l6ZXMgKGZpbGUpCi0gICAgIGJmZCAqZmlsZTsKLXsKLSAgaWYgKGJlcmtlbGV5X2Zvcm1hdCkKLSAgICBwcmludF9iZXJrZWxleV9mb3JtYXQgKGZpbGUpOwotICBlbHNlCi0gICAgcHJpbnRfc3lzdl9mb3JtYXQgKGZpbGUpOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3Jjb252LmMgYi9iaW51dGlscy9zcmNvbnYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIwZjJiNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zcmNvbnYuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMzYgKzAsMCBAQAotLyogc3Jjb252LmMgLS0gU3lzcm9mZiBjb252ZXJzaW9uIHByb2dyYW0KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiAoc2FjQGN5Z251cy5jb20pCi0KLSAgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGEgY29mZiBvYmplY3QgZmlsZQotICAgaW50byBhIEhpdGFjaGkgT00vTE0gKFN5c3JvZmYpIGZvcm1hdC4KLQotICAgQWxsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBwcmVzZXJ2ZWQgKi8KLQotI2luY2x1ZGUgPGJmZC5oPgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgInN5c3JvZmYuaCIKLSNpbmNsdWRlICJjb2ZmZ3Jvay5oIgotI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCi0KLSNkZWZpbmUgUFJPR1JBTV9WRVJTSU9OICIxLjUiCi0vKiNkZWZpbmUgRk9PUDEgMSAqLwotCi1zdGF0aWMgaW50IGFkZHJzaXplOwotc3RhdGljIGNoYXIgKnRvb2xuYW1lOwotc3RhdGljIGNoYXIgKipybmFtZXM7Ci0KLXN0YXRpYyB2b2lkIHdyX2NzICgpOwotc3RhdGljIHZvaWQgd2Fsa190cmVlX3Njb3BlICgpOwotc3RhdGljIHZvaWQgd3JfZ2xvYmFscyAoKTsKLXN0YXRpYyBpbnQgZmluZF9iYXNlICgpOwotCi1zdGF0aWMgRklMRSAqZmlsZTsKLXN0YXRpYyBiZmQgKmFiZmQ7Ci1zdGF0aWMgaW50IGRlYnVnID0gMDsKLXN0YXRpYyBpbnQgcXVpY2sgPSAwOwotc3RhdGljIGludCBub3ByZXNjYW4gPSAwOwotc3RhdGljIHN0cnVjdCBjb2ZmX29maWxlICp0cmVlOwotLyogT2Jzb2xldGUgPz8gCi0gICBzdGF0aWMgaW50IGFic29sdXRlX3A7Ci0gKi8KLQotc3RhdGljIGludCBzZWdtZW50ZWRfcDsKLXN0YXRpYyBpbnQgY29kZTsKLQotc3RhdGljIGludCBpZHMxWzIwMDAwXTsKLXN0YXRpYyBpbnQgaWRzMlsyMDAwMF07Ci0KLXN0YXRpYyBpbnQgYmFzZTEgPSAweDE4Owotc3RhdGljIGludCBiYXNlMiA9IDB4MjAxODsKLQotc3RhdGljIGludAotZ2V0X21lbWJlcl9pZCAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIGlmIChpZHMyW3hdKQotICAgIHsKLSAgICAgIHJldHVybiBpZHMyW3hdOwotICAgIH0KLSAgaWRzMlt4XSA9IGJhc2UyKys7Ci0gIHJldHVybiBpZHMyW3hdOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfb3JkaW5hcnlfaWQgKHgpCi0gICAgIGludCB4OwotewotICBpZiAoaWRzMVt4XSkKLSAgICB7Ci0gICAgICByZXR1cm4gaWRzMVt4XTsKLSAgICB9Ci0gIGlkczFbeF0gPSBiYXNlMSsrOwotICByZXR1cm4gaWRzMVt4XTsKLX0KLXN0YXRpYyBjaGFyICoKLXNlY3Rpb25fdHJhbnNsYXRlIChuKQotICAgICBjaGFyICpuOwotewotICBpZiAoc3RyY21wIChuLCAiLnRleHQiKSA9PSAwKQotICAgIHJldHVybiAiUCI7Ci0gIGlmIChzdHJjbXAgKG4sICIuZGF0YSIpID09IDApCi0gICAgcmV0dXJuICJEIjsKLSAgaWYgKHN0cmNtcCAobiwgIi5ic3MiKSA9PSAwKQotICAgIHJldHVybiAiQiI7Ci0gIHJldHVybiBuOwotfQotCi0KLQotI2RlZmluZSBEQVRFICI5NDAyMDEwNzMwMDAiOwkvKiBKdXN0IGEgdGltZSBvbiBteSBiaXJ0aGRheSAqLwotCi0KLXN0YXRpYwotY2hhciAqCi1zdHJpcF9zdWZmaXggKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGludCBpOwotICBjaGFyICpyZXM7Ci0gIGZvciAoaSA9IDA7IG5hbWVbaV0gIT0gMCAmJiBuYW1lW2ldICE9ICcuJzsgaSsrKQotICAgIDsKLSAgcmVzID0gKGNoYXIgKikgeG1hbGxvYyAoaSArIDEpOwotICBtZW1jcHkgKHJlcywgbmFtZSwgaSk7Ci0gIHJlc1tpXSA9IDA7Ci0gIHJldHVybiByZXM7Ci19Ci0KLQotLyogSVQgTEVOIHN0dWZmIENTICovCi1zdGF0aWMgdm9pZAotY2hlY2tzdW0gKGZpbGUsIHB0ciwgc2l6ZSwgY29kZSkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IGNvZGU7Ci17Ci0gIGludCBqOwotICBpbnQgbGFzdDsKLSAgaW50IHN1bSA9IDA7Ci0gIGludCBieXRlcyA9IHNpemUgLyA4OwotICBsYXN0ID0gIShjb2RlICYgMHhmZjAwKTsKLSAgaWYgKHNpemUgJiAweDcpCi0gICAgYWJvcnQgKCk7Ci0gIHB0clswXSA9IGNvZGUgfCAobGFzdCA/IDB4ODAgOiAwKTsKLSAgcHRyWzFdID0gYnl0ZXMgKyAxOwotCi0gIGZvciAoaiA9IDA7IGogPCBieXRlczsgaisrKQotICAgIHsKLSAgICAgIHN1bSArPSBwdHJbal07Ci0gICAgfQotICAvKiBHbHVlIG9uIGEgY2hlY2tzdW0gdG9vICovCi0gIHB0cltieXRlc10gPSB+c3VtOwotICBmd3JpdGUgKHB0ciwgYnl0ZXMgKyAxLCAxLCBmaWxlKTsKLX0KLQotCi0KLQotc3RhdGljIHZvaWQKLXdyaXRlSU5UIChuLCBwdHIsIGlkeCwgc2l6ZSwgZmlsZSkKLSAgICAgaW50IG47Ci0gICAgIGNoYXIgKnB0cjsKLSAgICAgaW50ICppZHg7Ci0gICAgIGludCBzaXplOwotICAgICBGSUxFICpmaWxlOwotewotICBpbnQgYnl0ZSA9ICppZHggLyA4OwotCi0gIGlmIChzaXplID09IC0yKQotICAgIHNpemUgPSBhZGRyc2l6ZTsKLSAgZWxzZSBpZiAoc2l6ZSA9PSAtMSkKLSAgICBzaXplID0gMDsKLQotICBpZiAoYnl0ZSA+IDI0MCkKLSAgICB7Ci0gICAgICAvKiBMZXRzIHdyaXRlIG91dCB0aGF0IHJlY29yZCBhbmQgZG8gYW5vdGhlciBvbmUgKi8KLSAgICAgIGNoZWNrc3VtIChmaWxlLCBwdHIsICppZHgsIGNvZGUgfCAweDEwMDApOwotICAgICAgKmlkeCA9IDE2OwotICAgICAgYnl0ZSA9ICppZHggLyA4OwotICAgIH0KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBwdHJbYnl0ZV0gPSBuOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgcHRyW2J5dGUgKyAwXSA9IG4gPj4gODsKLSAgICAgIHB0cltieXRlICsgMV0gPSBuOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgcHRyW2J5dGUgKyAwXSA9IG4gPj4gMjQ7Ci0gICAgICBwdHJbYnl0ZSArIDFdID0gbiA+PiAxNjsKLSAgICAgIHB0cltieXRlICsgMl0gPSBuID4+IDg7Ci0gICAgICBwdHJbYnl0ZSArIDNdID0gbiA+PiAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgKmlkeCArPSBzaXplICogODsKLX0KLQotCi1zdGF0aWMgdm9pZAotd3JpdGVCSVRTICh2YWwsIHB0ciwgaWR4LCBzaXplKQotICAgICBpbnQgdmFsOwotICAgICBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IGJ5dGUgPSAqaWR4IC8gODsKLSAgaW50IGJpdCA9ICppZHggJSA4OwotICBpbnQgb2xkOwotICAqaWR4ICs9IHNpemU7Ci0KLSAgb2xkID0gcHRyW2J5dGVdOwotICAvKiBUdXJuIG9mZiBhbGwgYWJvdXQgdG8gY2hhbmdlIGJpdHMgKi8KLSAgb2xkICY9IH4oKH4wID4+ICg4IC0gYml0IC0gc2l6ZSkpICYgKCgxIDw8IHNpemUpIC0gMSkpOwotICAvKiBUdXJuIG9uIHRoZSBiaXRzIHdlIHdhbnQgKi8KLSAgb2xkIHw9ICh2YWwgJiAoKDEgPDwgc2l6ZSkgLSAxKSkgPDwgKDggLSBiaXQgLSBzaXplKTsKLSAgcHRyW2J5dGVdID0gb2xkOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVCQVJSQVkgKGRhdGEsIHB0ciwgaWR4LCBzaXplLCBmaWxlKQotICAgICBiYXJyYXkgZGF0YTsKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IHNpemU7Ci0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGludCBpOwotICB3cml0ZUlOVCAoZGF0YS5sZW4sIHB0ciwgaWR4LCAxLCBmaWxlKTsKLSAgZm9yIChpID0gMDsgaSA8IGRhdGEubGVuOyBpKyspCi0gICAgewotICAgICAgd3JpdGVJTlQgKGRhdGEuZGF0YVtpXSwgcHRyLCBpZHgsIDEsIGZpbGUpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotd3JpdGVDSEFSUyAoc3RyaW5nLCBwdHIsIGlkeCwgc2l6ZSwgZmlsZSkKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgaW50IGkgPSAqaWR4IC8gODsKLQotICBpZiAoaSA+IDI0MCkKLSAgICB7Ci0gICAgICAvKiBMZXRzIHdyaXRlIG91dCB0aGF0IHJlY29yZCBhbmQgZG8gYW5vdGhlciBvbmUgKi8KLSAgICAgIGNoZWNrc3VtIChmaWxlLCBwdHIsICppZHgsIGNvZGUgfCAweDEwMDApOwotICAgICAgKmlkeCA9IDE2OwotICAgICAgaSA9ICppZHggLyA4OwotICAgIH0KLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFZhcmlhYmxlIGxlbmd0aCBzdHJpbmcgKi8KLSAgICAgIHNpemUgPSBzdHJsZW4gKHN0cmluZyk7Ci0gICAgICBwdHJbaSsrXSA9IHNpemU7Ci0gICAgfQotCi0gIC8qIEJVRyBXQUlUSU5HIFRPIEhBUFBFTiAqLwotICBtZW1jcHkgKHB0ciArIGksIHN0cmluZywgc2l6ZSk7Ci0gIGkgKz0gc2l6ZTsKLSAgKmlkeCA9IGkgKiA4OwotfQotCi0jZGVmaW5lIFNZU1JPRkZfU1dBUF9PVVQKLSNpbmNsdWRlICJzeXNyb2ZmLmMiCi0KLQotc3RhdGljIGNoYXIgKnJuYW1lX3NoW10gPQotewotICAiUjAiLCAiUjEiLCAiUjIiLCAiUjMiLCAiUjQiLCAiUjUiLCAiUjYiLCAiUjciLCAiUjgiLCAiUjkiLCAiUjEwIiwgIlIxMSIsICJSMTIiLCAiUjEzIiwgIlIxNCIsICJSMTUiCi19OwotCi1zdGF0aWMgY2hhciAqcm5hbWVfaDgzMDBbXSA9Ci17Ci0gICJFUjAiLCAiRVIxIiwgIkVSMiIsICJFUjMiLCAiRVI0IiwgIkVSNSIsICJFUjYiLCAiRVI3IiwgIlBDIiwgIkNDUiIKLX07Ci0KLXN0YXRpYyB2b2lkCi13cl90ciAoKQotewotICAvKiBUaGUgVFIgYmxvY2sgaXMgbm90IG5vcm1hbCAtIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgY29udGVudHMuICovCi0KLSAgc3RhdGljIGNoYXIgYltdID0gewotICAgIDB4ZmYsCQkJLyogSVQgKi8KLSAgICAweDAzLAkJCS8qIFJMICovCi0gICAgMHhmZCwJCQkvKiBDUyAqLwotICB9OwotICBmd3JpdGUgKGIsIDEsIHNpemVvZiAoYiksIGZpbGUpOwotfQotCi1zdGF0aWMgdm9pZAotd3JfdW4gKHB0ciwgc2ZpbGUsIGZpcnN0LCBuc2VjcykKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBpbnQgZmlyc3Q7Ci0gICAgIGludCBuc2VjczsKLXsKLSAgc3RydWN0IElUX3VuIHVuOwotCi0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqczsKLQotICB1bi5zcGFyZTEgPSAwOwotCi0gIGlmIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRVhFQ19QKQotICAgIHVuLmZvcm1hdCA9IEZPUk1BVF9MTTsKLSAgZWxzZQotICAgIHVuLmZvcm1hdCA9IEZPUk1BVF9PTTsKLSAgdW4uc3BhcmUxID0gMDsKLQotCi0jaWYgMQotICB1bi5uc2VjdGlvbnMgPSBwdHItPm5zZWN0aW9ucyAtIDE7CS8qICBEb24ndCBjb3VudCB0aGUgYWJzIHNlY3Rpb24gKi8KLSNlbHNlCi0gIC8qTkVXIC0gb25seSBjb3VudCBzZWN0aW9ucyB3aXRoIHNpemUgKi8KLSAgdW4ubnNlY3Rpb25zID0gbnNlY3M7Ci0jZW5kaWYKLQotICB1bi5uZXh0ZGVmcyA9IDA7Ci0gIHVuLm5leHRyZWZzID0gMDsKLSAgLyogQ291bnQgYWxsIHRoZSB1bmRlZmluZWQgYW5kIGRlZmluZWQgdmFyaWFibGVzIHdpdGggZ2xvYmFsIHNjb3BlICovCi0KLSAgaWYgKGZpcnN0KQotICAgIHsKLSAgICAgIGZvciAocyA9IHB0ci0+c3ltYm9sX2xpc3RfaGVhZDsgczsgcyA9IHMtPm5leHRfaW5fb2ZpbGVfbGlzdCkKLQl7Ci0JICBpZiAocy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfZGVmCi0JICAgICAgfHwgcy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19jb21tb24pCi0JICAgIHVuLm5leHRkZWZzKys7Ci0KLQkgIGlmIChzLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9yZWYpCi0JICAgIHVuLm5leHRyZWZzKys7Ci0JfQotICAgIH0KLSAgdW4udG9vbCA9IHRvb2xuYW1lOwotICB1bi50Y2QgPSBEQVRFOwotICB1bi5saW5rZXIgPSAiTF9HWDAwIjsKLSAgdW4ubGNkID0gREFURTsKLSAgdW4ubmFtZSA9IHNmaWxlLT5uYW1lOwotICBzeXNyb2ZmX3N3YXBfdW5fb3V0IChmaWxlLCAmdW4pOwotfQotCi0KLXN0YXRpYyB2b2lkCi13cl9oZCAocCkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci17Ci0gIHN0cnVjdCBJVF9oZCBoZDsKLQotICBoZC5zcGFyZTEgPSAwOwotICBpZiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICBoZC5tdCA9IE1UWVBFX0FCU19MTTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoZC5tdCA9IE1UWVBFX09NU19PUl9MTVM7Ci0gICAgfQotICBoZC5jZCA9IERBVEU7Ci0KLSAgaGQubnUgPSBwLT5uc291cmNlczsJCS8qIEFsd2F5cyBvbmUgdW5pdCAqLwotICBoZC5jb2RlID0gMDsJCQkvKiBBbHdheXMgQVNDSUkgKi8KLSAgaGQudmVyID0gIjAyMDAiOwkJLyogVmVyc2lvbiAyLjAwICovCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9oODMwMDoKLSAgICAgIGhkLmF1ID0gODsKLSAgICAgIGhkLnNpID0gMDsKLSAgICAgIGhkLnNwY3N6ID0gMzI7Ci0gICAgICBoZC5zZWdzeiA9IDA7Ci0gICAgICBoZC5zZWdzaCA9IDA7Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWNhc2UgYmZkX21hY2hfaDgzMDA6Ci0JICBoZC5jcHUgPSAiSDgzMDAiOwotCSAgaGQuYWZsID0gMjsKLQkgIGFkZHJzaXplID0gMjsKLQkgIHRvb2xuYW1lID0gIkNfSDgvMzAwIjsKLQkgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfaDgzMDBoOgotCSAgaGQuY3B1ID0gIkg4MzAwSCI7Ci0JICBoZC5hZmwgPSA0OwotCSAgYWRkcnNpemUgPSA0OwotCSAgdG9vbG5hbWUgPSAiQ19IOC8zMDBIIjsKLQkgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfaDgzMDBzOgotCSAgaGQuY3B1ID0gIkg4MzAwUyI7Ci0JICBoZC5hZmwgPSA0OwotCSAgYWRkcnNpemUgPSA0OwotCSAgdG9vbG5hbWUgPSAiQ19IOC8zMDBTIjsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCgpOwotCX0KLSAgICAgIHJuYW1lcyA9IHJuYW1lX2g4MzAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9zaDoKLSAgICAgIGhkLmF1ID0gODsKLSAgICAgIGhkLnNpID0gMDsKLSAgICAgIGhkLmFmbCA9IDQ7Ci0gICAgICBoZC5zcGNzeiA9IDMyOwotICAgICAgaGQuc2Vnc3ogPSAwOwotICAgICAgaGQuc2Vnc2ggPSAwOwotICAgICAgaGQuY3B1ID0gIlNIIjsKLSAgICAgIGFkZHJzaXplID0gNDsKLSAgICAgIHRvb2xuYW1lID0gIkNfU0giOwotICAgICAgcm5hbWVzID0gcm5hbWVfc2g7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmICghIGJmZF9nZXRfZmlsZV9mbGFncyhhYmZkKSAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICBoZC5lcCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaGQuZXAgPSAxOwotICAgICAgaGQudWFuID0gMDsKLSAgICAgIGhkLnNhID0gMDsKLSAgICAgIGhkLnNhZCA9IDA7Ci0gICAgICBoZC5hZGRyZXNzID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgICB9Ci0KLSAgaGQub3MgPSAiIjsKLSAgaGQuc3lzID0gIiI7Ci0gIGhkLm1uID0gc3RyaXBfc3VmZml4IChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgc3lzcm9mZl9zd2FwX2hkX291dCAoZmlsZSwgJmhkKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotd3Jfc2ggKHAsIHNlYykKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlYzsKLXsKLSAgc3RydWN0IElUX3NoIHNoOwotICBzaC51bml0ID0gMDsKLSAgc2guc2VjdGlvbiA9IHNlYy0+bnVtYmVyOwotI2lmZGVmIEZPT1AxCi0gIHNoLnNlY3Rpb24gPSAwOwotI2VuZGlmCi0gIHN5c3JvZmZfc3dhcF9zaF9vdXQgKGZpbGUsICZzaCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyX29iIChwLCBzZWN0aW9uKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgYmZkX3NpemVfdHlwZSBpOwotICBpbnQgZmlyc3QgPSAxOwotICB1bnNpZ25lZCBjaGFyIHN0dWZmWzIwMF07Ci0KLSAgaSA9IDA7Ci0gIHdoaWxlIChpIDwgc2VjdGlvbi0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgSVRfb2Igb2I7Ci0gICAgICBpbnQgdG9kbyA9IDIwMDsJCS8qIENvcHkgaW4gMjAwIGJ5dGUgbHVtcHMgKi8KLSAgICAgIG9iLnNwYXJlID0gMDsKLSAgICAgIGlmIChpICsgdG9kbyA+IHNlY3Rpb24tPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JdG9kbyA9IHNlY3Rpb24tPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgLSBpOwotCi0gICAgICBpZiAoZmlyc3QpCi0JewotCSAgb2Iuc2FmID0gMTsKLQkgIGlmIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRVhFQ19QKQotCSAgICBvYi5hZGRyZXNzID0gc2VjdGlvbi0+YWRkcmVzczsKLQkgIGVsc2UKLQkgICAgb2IuYWRkcmVzcyA9IDA7Ci0KLQkgIGZpcnN0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb2Iuc2FmID0gMDsKLQl9Ci0KLSAgICAgIG9iLmNwZiA9IDA7CQkvKiBOZXZlciBjb21wcmVzcyAqLwotICAgICAgb2IuZGF0YS5sZW4gPSB0b2RvOwotICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLT5iZmRfc2VjdGlvbiwgc3R1ZmYsIGksIHRvZG8pOwotICAgICAgb2IuZGF0YS5kYXRhID0gc3R1ZmY7Ci0gICAgICBzeXNyb2ZmX3N3YXBfb2Jfb3V0IChmaWxlLCAmb2IgLyosIGkgKyB0b2RvIDwgc2VjdGlvbi0+c2l6ZSAqLyApOwotICAgICAgaSArPSB0b2RvOwotICAgIH0KLSAgLyogTm93IGZpbGwgdGhlIHJlc3Qgd2l0aCBibGFua3MgKi8KLSAgd2hpbGUgKGkgPCAoYmZkX3NpemVfdHlwZSkgc2VjdGlvbi0+c2l6ZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgSVRfb2Igb2I7Ci0gICAgICBpbnQgdG9kbyA9IDIwMDsJCS8qIENvcHkgaW4gMjAwIGJ5dGUgbHVtcHMgKi8KLSAgICAgIG9iLnNwYXJlID0gMDsKLSAgICAgIGlmIChpICsgdG9kbyA+IChiZmRfc2l6ZV90eXBlKSBzZWN0aW9uLT5zaXplKQotCXRvZG8gPSBzZWN0aW9uLT5zaXplIC0gaTsKLSAgICAgIG9iLnNhZiA9IDA7Ci0KLSAgICAgIG9iLmNwZiA9IDA7CQkvKiBOZXZlciBjb21wcmVzcyAqLwotICAgICAgb2IuZGF0YS5sZW4gPSB0b2RvOwotICAgICAgbWVtc2V0IChzdHVmZiwgMCwgdG9kbyk7Ci0gICAgICBvYi5kYXRhLmRhdGEgPSBzdHVmZjsKLSAgICAgIHN5c3JvZmZfc3dhcF9vYl9vdXQgKGZpbGUsICZvYik7Ci0gICAgICBpICs9IHRvZG87Ci0gICAgfQotICAvKiBOb3cgZmlsbCB0aGUgcmVzdCB3aXRoIGJsYW5rcyAqLwotCi19Ci0KLXN0YXRpYyB2b2lkCi13cl9ybCAocHRyLCBzZWMpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwdHI7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlYzsKLXsKLSAgaW50IG5yID0gc2VjLT5ucmVsb2NzOwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IG5yOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGNvZmZfcmVsb2MgKnIgPSBzZWMtPnJlbG9jcyArIGk7Ci0gICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnJlZjsKLSAgICAgIHN0cnVjdCBJVF9ybCBybDsKLSAgICAgIHJsLmFwb2wgPSAwOwotICAgICAgcmwuYm91bmRhcnkgPSAwOwotICAgICAgcmwuc2VnbWVudCA9IDE7Ci0gICAgICBybC5zaWduID0gMDsKLSAgICAgIHJsLmNoZWNrID0gMDsKLSAgICAgIHJsLmFkZHIgPSByLT5vZmZzZXQ7Ci0gICAgICBybC5iaXRsb2MgPSAwOwotICAgICAgcmwuZmxlbiA9IDMyOwkJLyogU0ggU3BlY2lmaWMgKi8KLSAgICAgIC8qIFdoYXQgc29ydCBvZiByZWxvYyA/IExvb2sgaW4gdGhlIHNlY3Rpb24gdG8gZmluZCBvdXQgKi8KLSAgICAgIHJlZiA9IHItPnN5bWJvbDsKLSAgICAgIGlmIChyZWYtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfZXh0X3JlZikKLQl7Ci0JICBybC5iY291bnQgPSA0OwkvKiBBbHdheXMgNCBmb3IgdXMgKi8KLQkgIHJsLm9wID0gT1BfRVhUX1JFRjsKLQkgIHJsLnN5bW4gPSByZWYtPmVyX251bWJlcjsKLQl9Ci0gICAgICBlbHNlIGlmIChyZWYtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfY29tbW9uKQotCXsKLQkgIHJsLmJjb3VudCA9IDExOwkvKiBBbHdheXMgMTEgZm9yIHVzICovCi0JICBybC5vcCA9IE9QX1NFQ19SRUY7Ci0JICBybC5zZWNuID0gcmVmLT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOwotCSAgcmwuY29wY29kZV9pc18zID0gMzsKLQkgIHJsLmFsZW5ndGhfaXNfNCA9IDQ7Ci0JICBybC5hZGRlbmQgPSByZWYtPndoZXJlLT5vZmZzZXQgLSByZWYtPndoZXJlLT5zZWN0aW9uLT5hZGRyZXNzOwotCSAgcmwuYW9wY29kZV9pc18weDIwID0gMHgyMDsKLQl9Ci0KLSAgICAgIGVsc2UKLQl7Ci0JICBybC5iY291bnQgPSAxMTsJLyogQWx3YXlzIDExIGZvciB1cyAqLwotCSAgcmwub3AgPSBPUF9TRUNfUkVGOwotCSAgcmwuc2VjbiA9IHJlZi0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKLQkgIHJsLmNvcGNvZGVfaXNfMyA9IDM7Ci0JICBybC5hbGVuZ3RoX2lzXzQgPSA0OwotCSAgcmwuYWRkZW5kID0gLXJlZi0+d2hlcmUtPnNlY3Rpb24tPmFkZHJlc3M7Ci0JICBybC5hb3Bjb2RlX2lzXzB4MjAgPSAweDIwOwotCX0KLSAgICAgIHJsLmVuZCA9IDB4ZmY7Ci0gICAgICBpZiAocmwub3AgPT0gT1BfU0VDX1JFRgotCSAgfHwgcmwub3AgPT0gT1BfRVhUX1JFRikKLQl7Ci0JICBzeXNyb2ZmX3N3YXBfcmxfb3V0IChmaWxlLCAmcmwpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9vYmplY3RfYm9keSAocCkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci17Ci0gIGludCBpOwotICBmb3IgKGkgPSAxOyBpIDwgcC0+bnNlY3Rpb25zOyBpKyspCi0gICAgewotICAgICAgd3Jfc2ggKHAsIHAtPnNlY3Rpb25zICsgaSk7Ci0gICAgICB3cl9vYiAocCwgcC0+c2VjdGlvbnMgKyBpKTsKLSAgICAgIHdyX3JsIChwLCBwLT5zZWN0aW9ucyArIGkpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXdyX2Rwc19zdGFydCAoc2ZpbGUsIHNlY3Rpb24sIHNjb3BlLCB0eXBlLCBuZXN0KQotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpzY29wZTsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBuZXN0OwotewotICBzdHJ1Y3QgSVRfZHBzIGRwczsKLSAgZHBzLmVuZCA9IDA7Ci0gIGRwcy5vcHQgPSAwOwotICBkcHMudHlwZSA9IHR5cGU7Ci0gIGlmIChzY29wZS0+c2VjKQotICAgIHsKLSAgICAgIGRwcy5zYW4gPSBzY29wZS0+c2VjLT5udW1iZXI7Ci0gICAgICBkcHMuYWRkcmVzcyA9IHNjb3BlLT5vZmZzZXQgLSBmaW5kX2Jhc2UgKHNmaWxlLCBzY29wZS0+c2VjKTsKLSAgICAgIGRwcy5ibG9ja19zaXplID0gc2NvcGUtPnNpemU7Ci0gICAgICBpZiAoZGVidWcpCi0JewotCSAgcHJpbnRmICgiRFBTICVzICVkICV4XG4iLAotCQkgIHNmaWxlLT5uYW1lLAotCQkgIG5lc3QsCi0JCSAgZHBzLmFkZHJlc3MpOwotCi0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRwcy5zYW4gPSAwOwotICAgICAgZHBzLmFkZHJlc3MgPSAwOwotICAgICAgZHBzLmJsb2NrX3NpemUgPSAwOwotICAgIH0KLQotICBkcHMubmVzdGluZyA9IG5lc3Q7Ci0gIGRwcy5uZWcgPSAweDEwMDE7Ci0gIHN5c3JvZmZfc3dhcF9kcHNfb3V0IChmaWxlLCAmZHBzKTsKLX0KLQotc3RhdGljIHZvaWQKLXdyX2Rwc19lbmQgKHNlY3Rpb24sIHNjb3BlLCB0eXBlKQotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqc2NvcGU7Ci0gICAgIGludCB0eXBlOwotewotICBzdHJ1Y3QgSVRfZHBzIGRwczsKLSAgZHBzLmVuZCA9IDE7Ci0gIGRwcy50eXBlID0gdHlwZTsKLSAgc3lzcm9mZl9zd2FwX2Rwc19vdXQgKGZpbGUsICZkcHMpOwotfQotCi1zdGF0aWMgaW50ICoKLW5pbnRzICh4KQotICAgICBpbnQgeDsKLXsKLSAgcmV0dXJuIChpbnQgKikgKHhjYWxsb2MgKHNpemVvZiAoaW50KSwgeCkpOwotfQotCi1zdGF0aWMgdm9pZCB3YWxrX3RyZWVfc3ltYm9sICgpOwotc3RhdGljIHZvaWQKLXdhbGtfdHJlZV90eXBlXzEgKHNmaWxlLCBzeW1ib2wsIHR5cGUsIG5lc3QpCi0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnR5cGU7Ci0gICAgIGludCBuZXN0OwotewotICBzd2l0Y2ggKHR5cGUtPnR5cGUpCi0gICAgewotICAgIGNhc2UgY29mZl9zZWNkZWZfdHlwZToKLSAgICBjYXNlIGNvZmZfYmFzaWNfdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGJ0IGRidDsKLQotCXN3aXRjaCAodHlwZS0+dS5iYXNpYykKLQkgIHsKLQkgIGNhc2UgVF9OVUxMOgotCSAgY2FzZSBUX1ZPSUQ6Ci0JICAgIGRidC5idHlwZSA9IEJUWVBFX1ZPSUQ7Ci0JICAgIGRidC5zaWduID0gQlRZUEVfVU5TUEVDOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX0NIQVI6Ci0JICAgIGRidC5idHlwZSA9IEJUWVBFX0NIQVI7Ci0JICAgIGRidC5zaWduID0gQlRZUEVfVU5TUEVDOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX1NIT1JUOgotCSAgY2FzZSBUX0lOVDoKLQkgIGNhc2UgVF9MT05HOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9JTlQ7Ci0JICAgIGRidC5zaWduID0gU0lHTl9TSUdORUQ7Ci0JICAgIGRidC5mcHR5cGUgPSBGUFRZUEVfTk9UU1BFQzsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFRfRkxPQVQ6Ci0JICAgIGRidC5idHlwZSA9IEJUWVBFX0ZMT0FUOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX1NJTkdMRTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFRfRE9VQkxFOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9GTE9BVDsKLQkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9ET1VCTEU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX0xOR0RCTDoKLQkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfRkxPQVQ7Ci0JICAgIGRidC5mcHR5cGUgPSBGUFRZUEVfRVhURU5ERUQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX1VDSEFSOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9DSEFSOwotCSAgICBkYnQuc2lnbiA9IFNJR05fVU5TSUdORUQ7Ci0JICAgIGRidC5mcHR5cGUgPSBGUFRZUEVfTk9UU1BFQzsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFRfVVNIT1JUOgotCSAgY2FzZSBUX1VJTlQ6Ci0JICBjYXNlIFRfVUxPTkc6Ci0JICAgIGRidC5idHlwZSA9IEJUWVBFX0lOVDsKLQkgICAgZGJ0LnNpZ24gPSBTSUdOX1VOU0lHTkVEOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JICAgIGJyZWFrOwotCSAgfQotCWRidC5iaXRzaXplID0gdHlwZS0+c2l6ZTsKLQlkYnQubmVnID0gMHgxMDAxOwotCXN5c3JvZmZfc3dhcF9kYnRfb3V0IChmaWxlLCAmZGJ0KTsKLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIGNvZmZfcG9pbnRlcl90eXBlOgotICAgICAgewotCXN0cnVjdCBJVF9kcHQgZHB0OwotCXdhbGtfdHJlZV90eXBlXzEgKHNmaWxlLCBzeW1ib2wsIHR5cGUtPnUucG9pbnRlci5wb2ludHNfdG8sIG5lc3QgKyAxKTsKLQlkcHQubmVnID0gMHgxMDAxOwotCXN5c3JvZmZfc3dhcF9kcHRfb3V0IChmaWxlLCAmZHB0KTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgY29mZl9mdW5jdGlvbl90eXBlOgotICAgICAgewotCXN0cnVjdCBJVF9kZnAgZGZwOwotCXN0cnVjdCBjb2ZmX3N5bWJvbCAqcGFyYW07Ci0JZGZwLmVuZCA9IDA7Ci0JZGZwLnNwYXJlID0gMDsKLQlkZnAubnBhcmFtcyA9IHR5cGUtPnUuZnVuY3Rpb24ucGFyYW1ldGVycy0+bnZhcnM7Ci0JZGZwLm5lZyA9IDB4MTAwMTsKLQotCXdhbGtfdHJlZV90eXBlXzEgKHNmaWxlLCBzeW1ib2wsIHR5cGUtPnUuZnVuY3Rpb24uZnVuY3Rpb25fcmV0dXJucywgbmVzdCArIDEpOwotCi0Jc3lzcm9mZl9zd2FwX2RmcF9vdXQgKGZpbGUsICZkZnApOwotCi0JZm9yIChwYXJhbSA9IHR5cGUtPnUuZnVuY3Rpb24ucGFyYW1ldGVycy0+dmFyc19oZWFkOwotCSAgICAgcGFyYW07Ci0JICAgICBwYXJhbSA9IHBhcmFtLT5uZXh0KQotCSAgewotCSAgICB3YWxrX3RyZWVfc3ltYm9sIChzZmlsZSwgMCwgcGFyYW0sIG5lc3QpOwotCSAgfQotCWRmcC5lbmQgPSAxOwotCXN5c3JvZmZfc3dhcF9kZnBfb3V0IChmaWxlLCAmZGZwKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgY29mZl9zdHJ1Y3RkZWZfdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGJ0IGRidDsKLQlzdHJ1Y3QgSVRfZGRzIGRkczsKLQlzdHJ1Y3QgY29mZl9zeW1ib2wgKm1lbWJlcjsKLQlkZHMuc3BhcmUgPSAwOwotCWRidC5idHlwZSA9IEJUWVBFX1NUUlVDVDsKLQlkYnQuYml0c2l6ZSA9IHR5cGUtPnNpemU7Ci0JZGJ0LnNpZ24gPSBTSUdOX1VOU1BFQzsKLQlkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JZGJ0LnNpZCA9IGdldF9tZW1iZXJfaWQgKHR5cGUtPnUuYXN0cnVjdGRlZi5pZHgpOwotCWRidC5uZWcgPSAweDEwMDE7Ci0Jc3lzcm9mZl9zd2FwX2RidF9vdXQgKGZpbGUsICZkYnQpOwotCWRkcy5lbmQgPSAwOwotCWRkcy5uZWcgPSAweDEwMDE7Ci0Jc3lzcm9mZl9zd2FwX2Rkc19vdXQgKGZpbGUsICZkZHMpOwotCWZvciAobWVtYmVyID0gdHlwZS0+dS5hc3RydWN0ZGVmLmVsZW1lbnRzLT52YXJzX2hlYWQ7Ci0JICAgICBtZW1iZXI7Ci0JICAgICBtZW1iZXIgPSBtZW1iZXItPm5leHQpCi0JICB7Ci0JICAgIHdhbGtfdHJlZV9zeW1ib2wgKHNmaWxlLCAwLCBtZW1iZXIsIG5lc3QgKyAxKTsKLQkgIH0KLQotCWRkcy5lbmQgPSAxOwotCXN5c3JvZmZfc3dhcF9kZHNfb3V0IChmaWxlLCAmZGRzKTsKLQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3N0cnVjdHJlZl90eXBlOgotICAgICAgewotCXN0cnVjdCBJVF9kYnQgZGJ0OwotCWRidC5idHlwZSA9IEJUWVBFX1RBRzsKLQlkYnQuYml0c2l6ZSA9IHR5cGUtPnNpemU7Ci0JZGJ0LnNpZ24gPSBTSUdOX1VOU1BFQzsKLQlkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JaWYgKHR5cGUtPnUuYXN0cnVjdHJlZi5yZWYpCi0JICB7Ci0JICAgIGRidC5zaWQgPSBnZXRfbWVtYmVyX2lkICh0eXBlLT51LmFzdHJ1Y3RyZWYucmVmLT5udW1iZXIpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgZGJ0LnNpZCA9IDA7Ci0JICB9Ci0KLQlkYnQubmVnID0gMHgxMDAxOwotCXN5c3JvZmZfc3dhcF9kYnRfb3V0IChmaWxlLCAmZGJ0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9hcnJheV90eXBlOgotICAgICAgewotCXN0cnVjdCBJVF9kYXIgZGFyOwotCWludCBqOwotCWludCBkaW1zID0gMTsJCS8qIE9ubHkgb3V0cHV0IG9uZSBkaW1lbnNpb24gYXQgYSB0aW1lICovCi0JZGFyLmRpbXMgPSBkaW1zOwotCWRhci52YXJpYWJsZSA9IG5pbnRzIChkaW1zKTsKLQlkYXIuc3VidHlwZSA9IG5pbnRzIChkaW1zKTsKLQlkYXIuc3BhcmUgPSBuaW50cyAoZGltcyk7Ci0JZGFyLm1heF92YXJpYWJsZSA9IG5pbnRzIChkaW1zKTsKLQlkYXIubWF4c3BhcmUgPSBuaW50cyAoZGltcyk7Ci0JZGFyLm1heCA9IG5pbnRzIChkaW1zKTsKLQlkYXIubWluX3ZhcmlhYmxlID0gbmludHMgKGRpbXMpOwotCWRhci5taW4gPSBuaW50cyAoZGltcyk7Ci0JZGFyLm1pbnNwYXJlID0gbmludHMgKGRpbXMpOwotCWRhci5uZWcgPSAweDEwMDE7Ci0JZGFyLmxlbmd0aCA9IHR5cGUtPnNpemUgLyB0eXBlLT51LmFycmF5LmRpbTsKLQlmb3IgKGogPSAwOyBqIDwgZGltczsgaisrKQotCSAgewotCSAgICBkYXIudmFyaWFibGVbal0gPSBWQVJJQUJMRV9GSVhFRDsKLQkgICAgZGFyLnN1YnR5cGVbal0gPSBTVUJfSU5URUdFUjsKLQkgICAgZGFyLnNwYXJlW2pdID0gMDsKLQkgICAgZGFyLm1heF92YXJpYWJsZVtqXSA9IDA7Ci0JICAgIGRhci5tYXhbal0gPSB0eXBlLT51LmFycmF5LmRpbTsKLQkgICAgZGFyLm1pbl92YXJpYWJsZVtqXSA9IDA7Ci0JICAgIGRhci5taW5bal0gPSAxOwkvKiBXaHkgaXNuJ3QgdGhpcyAwID8gKi8KLQkgIH0KLQl3YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLT51LmFycmF5LmFycmF5X29mLCBuZXN0ICsgMSk7Ci0Jc3lzcm9mZl9zd2FwX2Rhcl9vdXQgKGZpbGUsICZkYXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2VudW1kZWZfdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGJ0IGRidDsKLQlzdHJ1Y3QgSVRfZGVuIGRlbjsKLQlzdHJ1Y3QgY29mZl9zeW1ib2wgKm1lbWJlcjsKLQlkYnQuYnR5cGUgPSBCVFlQRV9FTlVNOwotCWRidC5iaXRzaXplID0gdHlwZS0+c2l6ZTsKLQlkYnQuc2lnbiA9IFNJR05fVU5TUEVDOwotCWRidC5mcHR5cGUgPSBGUFRZUEVfTk9UU1BFQzsKLQlkYnQuc2lkID0gZ2V0X21lbWJlcl9pZCAodHlwZS0+dS5hZW51bWRlZi5pZHgpOwotCWRidC5uZWcgPSAweDEwMDE7Ci0Jc3lzcm9mZl9zd2FwX2RidF9vdXQgKGZpbGUsICZkYnQpOwotCi0JZGVuLmVuZCA9IDA7Ci0JZGVuLm5lZyA9IDB4MTAwMTsKLQlkZW4uc3BhcmUgPSAwOwotCXN5c3JvZmZfc3dhcF9kZW5fb3V0IChmaWxlLCAmZGVuKTsKLQlmb3IgKG1lbWJlciA9IHR5cGUtPnUuYWVudW1kZWYuZWxlbWVudHMtPnZhcnNfaGVhZDsKLQkgICAgIG1lbWJlcjsKLQkgICAgIG1lbWJlciA9IG1lbWJlci0+bmV4dCkKLQkgIHsKLQkgICAgd2Fsa190cmVlX3N5bWJvbCAoc2ZpbGUsIDAsIG1lbWJlciwgbmVzdCArIDEpOwotCSAgfQotCi0JZGVuLmVuZCA9IDE7Ci0Jc3lzcm9mZl9zd2FwX2Rlbl9vdXQgKGZpbGUsICZkZW4pOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9lbnVtcmVmX3R5cGU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RidCBkYnQ7Ci0JZGJ0LmJ0eXBlID0gQlRZUEVfVEFHOwotCWRidC5iaXRzaXplID0gdHlwZS0+c2l6ZTsKLQlkYnQuc2lnbiA9IFNJR05fVU5TUEVDOwotCWRidC5mcHR5cGUgPSBGUFRZUEVfTk9UU1BFQzsKLQlkYnQuc2lkID0gZ2V0X21lbWJlcl9pZCAodHlwZS0+dS5hZW51bXJlZi5yZWYtPm51bWJlcik7Ci0JZGJ0Lm5lZyA9IDB4MTAwMTsKLQlzeXNyb2ZmX3N3YXBfZGJ0X291dCAoZmlsZSwgJmRidCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBPYnNvbGV0ZSA/IAotICAgc3RhdGljIHZvaWQKLSAgIGR0eV9zdGFydCAoKQotICAgewotICAgc3RydWN0IElUX2R0eSBkdHk7Ci0gICBkdHkuZW5kID0gMDsKLSAgIGR0eS5uZWcgPSAweDEwMDE7Ci0gICBkdHkuc3BhcmUgPSAwOwotICAgc3lzcm9mZl9zd2FwX2R0eV9vdXQgKGZpbGUsICZkdHkpOwotICAgfQotCi0gICBzdGF0aWMgdm9pZAotICAgZHR5X3N0b3AgKCkKLSAgIHsKLSAgIHN0cnVjdCBJVF9kdHkgZHR5OwotICAgZHR5LmVuZCA9IDA7Ci0gICBkdHkubmVnID0gMHgxMDAxOwotICAgZHR5LmVuZCA9IDE7Ci0gICBzeXNyb2ZmX3N3YXBfZHR5X291dCAoZmlsZSwgJmR0eSk7Ci0gICB9Ci0KLQotICAgc3RhdGljIHZvaWQKLSAgIGR1bXBfdHJlZV9zdHJ1Y3R1cmUgKHNmaWxlLCBzeW1ib2wsIHR5cGUsIG5lc3QpCi0gICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLSAgIHN0cnVjdCBjb2ZmX3R5cGUgKnR5cGU7Ci0gICBpbnQgbmVzdDsKLSAgIHsKLSAgIGlmIChzeW1ib2wtPnR5cGUtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQotICAgewotCi0KLSAgIH0KLQotICAgfQotICovCi0KLXN0YXRpYyB2b2lkCi13YWxrX3RyZWVfdHlwZSAoc2ZpbGUsIHN5bWJvbCwgdHlwZSwgbmVzdCkKLQotICAgICBzdHJ1Y3QKLSAgICAgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotICAgICBzdHJ1Y3QgY29mZl90eXBlICp0eXBlOwotICAgICBpbnQgbmVzdDsKLXsKLSAgaWYgKHN5bWJvbC0+dHlwZS0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCi0gICAgewotCi0gICAgICBzdHJ1Y3QgSVRfZHR5IGR0eTsKLSAgICAgIGR0eS5lbmQgPSAwOwotICAgICAgZHR5Lm5lZyA9IDB4MTAwMTsKLQotICAgICAgc3lzcm9mZl9zd2FwX2R0eV9vdXQgKGZpbGUsICZkdHkpOwotICAgICAgd2Fsa190cmVlX3R5cGVfMSAoc2ZpbGUsIHN5bWJvbCwgdHlwZSwgbmVzdCk7Ci0gICAgICBkdHkuZW5kID0gMTsKLSAgICAgIHN5c3JvZmZfc3dhcF9kdHlfb3V0IChmaWxlLCAmZHR5KTsKLQotICAgICAgd3JfZHBzX3N0YXJ0IChzZmlsZSwKLQkJICAgIHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24sCi0JCSAgICBzeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24uY29kZSwKLQkJICAgIEJMT0NLX1RZUEVfRlVOQ1RJT04sIG5lc3QpOwotICAgICAgd3JfZHBzX3N0YXJ0IChzZmlsZSwgc3ltYm9sLT53aGVyZS0+c2VjdGlvbiwKLQkJICAgIHN5bWJvbC0+dHlwZS0+dS5mdW5jdGlvbi5jb2RlLAotCQkgICAgQkxPQ0tfVFlQRV9CTE9DSywgbmVzdCk7Ci0gICAgICB3YWxrX3RyZWVfc2NvcGUgKHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24sCi0JCSAgICAgICBzZmlsZSwKLQkJICAgICAgIHN5bWJvbC0+dHlwZS0+dS5mdW5jdGlvbi5jb2RlLAotCQkgICAgICAgbmVzdCArIDEsIEJMT0NLX1RZUEVfQkxPQ0spOwotCi0gICAgICB3cl9kcHNfZW5kIChzeW1ib2wtPndoZXJlLT5zZWN0aW9uLAotCQkgIHN5bWJvbC0+dHlwZS0+dS5mdW5jdGlvbi5jb2RlLAotCQkgIEJMT0NLX1RZUEVfQkxPQ0spOwotICAgICAgd3JfZHBzX2VuZCAoc3ltYm9sLT53aGVyZS0+c2VjdGlvbiwKLQkJICBzeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24uY29kZSwgQkxPQ0tfVFlQRV9GVU5DVElPTik7Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgSVRfZHR5IGR0eTsKLSAgICAgIGR0eS5lbmQgPSAwOwotICAgICAgZHR5Lm5lZyA9IDB4MTAwMTsKLSAgICAgIHN5c3JvZmZfc3dhcF9kdHlfb3V0IChmaWxlLCAmZHR5KTsKLSAgICAgIHdhbGtfdHJlZV90eXBlXzEgKHNmaWxlLCBzeW1ib2wsIHR5cGUsIG5lc3QpOwotICAgICAgZHR5LmVuZCA9IDE7Ci0gICAgICBzeXNyb2ZmX3N3YXBfZHR5X291dCAoZmlsZSwgJmR0eSk7Ci0gICAgfQotCi19Ci0KLQotCi1zdGF0aWMgdm9pZAotd2Fsa190cmVlX3N5bWJvbCAoc2ZpbGUsIHNlY3Rpb24sIHN5bWJvbCwgbmVzdCkKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLSAgICAgaW50IG5lc3Q7Ci17Ci0gIHN0cnVjdCBJVF9kc3kgZHN5OwotCi0gIG1lbXNldCgmZHN5LCAwLCBzaXplb2YoZHN5KSk7Ci0gIGRzeS5uZXN0aW5nID0gbmVzdDsKLQotICBzd2l0Y2ggKHN5bWJvbC0+dHlwZS0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX2Z1bmN0aW9uX3R5cGU6Ci0gICAgICBkc3kudHlwZSA9IFNUWVBFX0ZVTkM7Ci0gICAgICBkc3kuYXNzaWduID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9zdHJ1Y3RyZWZfdHlwZToKLSAgICBjYXNlIGNvZmZfcG9pbnRlcl90eXBlOgotICAgIGNhc2UgY29mZl9hcnJheV90eXBlOgotICAgIGNhc2UgY29mZl9iYXNpY190eXBlOgotICAgIGNhc2UgY29mZl9lbnVtcmVmX3R5cGU6Ci0gICAgICBkc3kudHlwZSA9IFNUWVBFX1ZBUjsKLSAgICAgIGRzeS5hc3NpZ24gPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2VudW1kZWZfdHlwZToKLSAgICAgIGRzeS50eXBlID0gU1RZUEVfVEFHOwotICAgICAgZHN5LmFzc2lnbiA9IDA7Ci0gICAgICBkc3kubWFnaWMgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3N0cnVjdGRlZl90eXBlOgotICAgICAgZHN5LnR5cGUgPSBTVFlQRV9UQUc7Ci0gICAgICBkc3kuYXNzaWduID0gMDsKLSAgICAgIGRzeS5tYWdpYyA9IHN5bWJvbC0+dHlwZS0+dS5hc3RydWN0ZGVmLmlzc3RydWN0ID8gMCA6IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfc2VjZGVmX3R5cGU6Ci0gICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoc3ltYm9sLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0KQotICAgIHsKLSAgICAgIGRzeS5hc3NpZ24gPSAwOwotICAgICAgZHN5LnR5cGUgPSBTVFlQRV9NRU1CRVI7Ci0gICAgfQotICBpZiAoc3ltYm9sLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9tZW1iZXJfb2ZfZW51bSkKLSAgICB7Ci0gICAgICBkc3kudHlwZSA9IFNUWVBFX0VOVU07Ci0gICAgICBkc3kuYXNzaWduID0gMDsKLSAgICAgIGRzeS5ldmFsbGVuID0gNDsKLSAgICAgIGRzeS5ldmFsdWUgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7Ci0gICAgfQotCi0gIGlmIChzeW1ib2wtPnR5cGUtPnR5cGUgPT0gY29mZl9zdHJ1Y3RkZWZfdHlwZQotICAgICAgfHwgc3ltYm9sLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9lbnRhZwotICAgICAgfHwgc3ltYm9sLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9zdHJ0YWcpCi0gICAgewotICAgICAgZHN5LnNudW1iZXIgPSBnZXRfbWVtYmVyX2lkIChzeW1ib2wtPm51bWJlcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZHN5LnNudW1iZXIgPSBnZXRfb3JkaW5hcnlfaWQgKHN5bWJvbC0+bnVtYmVyKTsKLSAgICB9Ci0KLQotICBkc3kuc25hbWUgPSBzeW1ib2wtPm5hbWVbMF0gPT0gJ18nID8gc3ltYm9sLT5uYW1lICsgMSA6IHN5bWJvbC0+bmFtZTsKLQotICBzd2l0Y2ggKHN5bWJvbC0+dmlzaWJsZS0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX3Zpc19jb21tb246Ci0gICAgY2FzZSBjb2ZmX3Zpc19leHRfZGVmOgotICAgICAgZHN5LmFpbmZvID0gQUlORk9fU1RBVElDX0VYVF9ERUY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2V4dF9yZWY6Ci0gICAgICBkc3kuYWluZm8gPSBBSU5GT19TVEFUSUNfRVhUX1JFRjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfaW50X2RlZjoKLSAgICAgIGRzeS5haW5mbyA9IEFJTkZPX1NUQVRJQ19JTlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2F1dG86Ci0gICAgY2FzZSBjb2ZmX3Zpc19hdXRvcGFyYW06Ci0gICAgICBkc3kuYWluZm8gPSBBSU5GT19BVVRPOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19yZWdpc3RlcjoKLSAgICBjYXNlIGNvZmZfdmlzX3JlZ3BhcmFtOgotICAgICAgZHN5LmFpbmZvID0gQUlORk9fUkVHOwotICAgICAgYnJlYWs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX3RhZzoKLSAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9zdHJ1Y3Q6Ci0gICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2ZfZW51bToKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgZHN5LmRsZW5ndGggPSBzeW1ib2wtPnR5cGUtPnNpemU7Ci0gIHN3aXRjaCAoc3ltYm9sLT53aGVyZS0+d2hlcmUpCi0gICAgewotICAgIGNhc2UgY29mZl93aGVyZV9tZW1vcnk6Ci0KLSAgICAgIGRzeS5zZWN0aW9uID0gc3ltYm9sLT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOwotI2lmZGVmIEZPT1AKLSAgICAgIGRzeS5zZWN0aW9uID0gMDsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbWJlcl9vZl9zdHJ1Y3Q6Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtOgotICAgIGNhc2UgY29mZl93aGVyZV9zdGFjazoKLSAgICBjYXNlIGNvZmZfd2hlcmVfcmVnaXN0ZXI6Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3Vua25vd246Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3N0cnRhZzoKLQotICAgIGNhc2UgY29mZl93aGVyZV9lbnRhZzoKLSAgICBjYXNlIGNvZmZfd2hlcmVfdHlwZWRlZjoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgc3dpdGNoIChzeW1ib2wtPndoZXJlLT53aGVyZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbW9yeToKLSAgICAgIGRzeS5hZGRyZXNzID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0IC0gZmluZF9iYXNlIChzZmlsZSwgc3ltYm9sLT53aGVyZS0+c2VjdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfc3RhY2s6Ci0gICAgICBkc3kuYWRkcmVzcyA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OgotCi0KLSAgICAgIGlmIChzeW1ib2wtPndoZXJlLT5iaXRzaXplKQotCXsKLQkgIGludCBiaXRzID0gKHN5bWJvbC0+d2hlcmUtPm9mZnNldCAqIDggKyBzeW1ib2wtPndoZXJlLT5iaXRvZmZzZXQpOwotCSAgZHN5LmJpdHVuaXQgPSAxOwotCSAgZHN5LmZpZWxkX2xlbiA9IHN5bWJvbC0+d2hlcmUtPmJpdHNpemU7Ci0JICBkc3kuZmllbGRfb2ZmID0gKGJpdHMgLyAzMikgKiA0OwotCSAgZHN5LmZpZWxkX2JpdG9mZiA9IGJpdHMgJSAzMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZHN5LmJpdHVuaXQgPSAwOwotCi0JICBkc3kuZmllbGRfbGVuID0gc3ltYm9sLT50eXBlLT5zaXplOwotCSAgZHN5LmZpZWxkX29mZiA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldDsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfbWVtYmVyX29mX2VudW06Ci0gICAgICAvKiAgICAgIGRzeS5iaXR1bml0ID0gMDsKLSAgICAgICAgIGRzeS5maWVsZF9sZW4gID0gc3ltYm9sLT50eXBlLT5zaXplOwotICAgICAgICAgZHN5LmZpZWxkX29mZiA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldDsgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9yZWdpc3RlcjoKLSAgICBjYXNlIGNvZmZfd2hlcmVfdW5rbm93bjoKLSAgICBjYXNlIGNvZmZfd2hlcmVfc3RydGFnOgotCi0gICAgY2FzZSBjb2ZmX3doZXJlX2VudGFnOgotICAgIGNhc2UgY29mZl93aGVyZV90eXBlZGVmOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoc3ltYm9sLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9yZWdpc3RlcikKLSAgICBkc3kucmVnID0gcm5hbWVzW3N5bWJvbC0+d2hlcmUtPm9mZnNldF07Ci0KLSAgc3dpdGNoIChzeW1ib2wtPnZpc2libGUtPnR5cGUpCi0gICAgewotICAgIGNhc2UgY29mZl92aXNfY29tbW9uOgotICAgICAgLyogV2UgZG8gdGhpcyAnY2F1c2UgY29tbW9uIEMgc3ltYm9scyBhcmUgdHJlYXRlZCBhcyBleHRkZWZzICovCi0gICAgY2FzZSBjb2ZmX3Zpc19leHRfZGVmOgotICAgIGNhc2UgY29mZl92aXNfZXh0X3JlZjoKLQotICAgICAgZHN5LmVuYW1lID0gc3ltYm9sLT5uYW1lOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGNvZmZfdmlzX3JlZ3BhcmFtOgotICAgIGNhc2UgY29mZl92aXNfYXV0b3BhcmFtOgotICAgICAgZHN5LnR5cGUgPSBTVFlQRV9QQVJBTUVURVI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgY29mZl92aXNfaW50X2RlZjoKLQotICAgIGNhc2UgY29mZl92aXNfYXV0bzoKLSAgICBjYXNlIGNvZmZfdmlzX3JlZ2lzdGVyOgotICAgIGNhc2UgY29mZl92aXNfdGFnOgotICAgIGNhc2UgY29mZl92aXNfbWVtYmVyX29mX3N0cnVjdDoKLSAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9lbnVtOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBkc3kuc2ZuID0gMDsKLSAgZHN5LnNsbiA9IDI7Ci0KLSAgZHN5Lm5lZyA9IDB4MTAwMTsKLQotCi0gIHN5c3JvZmZfc3dhcF9kc3lfb3V0IChmaWxlLCAmZHN5KTsKLQotICB3YWxrX3RyZWVfdHlwZSAoc2ZpbGUsIHN5bWJvbCwgc3ltYm9sLT50eXBlLCBuZXN0KTsKLX0KLQotCi1zdGF0aWMgdm9pZAotd2Fsa190cmVlX3Njb3BlIChzZWN0aW9uLCBzZmlsZSwgc2NvcGUsIG5lc3QsIHR5cGUpCi0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKnNjb3BlOwotICAgICBpbnQgbmVzdDsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqdmFyczsKLSAgc3RydWN0IGNvZmZfc2NvcGUgKmNoaWxkOwotCi0gIGlmIChzY29wZS0+dmFyc19oZWFkCi0gICAgICB8fCAoc2NvcGUtPmxpc3RfaGVhZCAmJiBzY29wZS0+bGlzdF9oZWFkLT52YXJzX2hlYWQpKQotICAgIHsKLSAgICAgIHdyX2Rwc19zdGFydCAoc2ZpbGUsIHNlY3Rpb24sIHNjb3BlLCB0eXBlLCBuZXN0KTsKLQotICAgICAgaWYgKG5lc3QgPT0gMCkKLQl3cl9nbG9iYWxzICh0cmVlLCBzZmlsZSwgbmVzdCArIDEpOwotCi0gICAgICBmb3IgKHZhcnMgPSBzY29wZS0+dmFyc19oZWFkOyB2YXJzOyB2YXJzID0gdmFycy0+bmV4dCkKLQl7Ci0JICB3YWxrX3RyZWVfc3ltYm9sIChzZmlsZSwgc2VjdGlvbiwgdmFycywgbmVzdCk7Ci0JfQotCi0gICAgICBmb3IgKGNoaWxkID0gc2NvcGUtPmxpc3RfaGVhZDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpCi0JewotCSAgd2Fsa190cmVlX3Njb3BlIChzZWN0aW9uLCBzZmlsZSwgY2hpbGQsIG5lc3QgKyAxLCBCTE9DS19UWVBFX0JMT0NLKTsKLQl9Ci0KLSAgICAgIHdyX2Rwc19lbmQgKHNlY3Rpb24sIHNjb3BlLCB0eXBlKTsKLSAgICB9Ci19Ci1zdGF0aWMgdm9pZAotd2Fsa190cmVlX3NmaWxlIChzZWN0aW9uLCBzZmlsZSkKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotewotICB3YWxrX3RyZWVfc2NvcGUgKHNlY3Rpb24sIHNmaWxlLCBzZmlsZS0+c2NvcGUsIDAsIEJMT0NLX1RZUEVfQ09NUFVOSVQpOwotCi19Ci0KLXN0YXRpYyB2b2lkCi13cl9wcm9ncmFtX3N0cnVjdHVyZSAocCwgc2ZpbGUpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci17Ci0KLSAgd2Fsa190cmVlX3NmaWxlIChwLT5zZWN0aW9ucyArIDQsIHNmaWxlKTsKLQotfQotCi1zdGF0aWMgdm9pZAotd3JfZHUgKHAsIHNmaWxlLCBuKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBpbnQgbjsKLXsKLSAgc3RydWN0IElUX2R1IGR1OwotICBpbnQgbGltOwotI2lmIDAKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7Ci0gIHN0YXRpYyBpbnQgaW5jaXQgPSAweDUwMDAwMDsKLSAgaW50IHVzZWQgPSAwOwotI2VuZGlmCi0gIGludCBpOwotICBpbnQgajsKLSAgdW5zaWduZWQgaW50ICpsb3dlc3QgPSAodW5zaWduZWQgKikgbmludHMgKHAtPm5zZWN0aW9ucyk7Ci0gIHVuc2lnbmVkIGludCAqaGlnaGVzdCA9ICh1bnNpZ25lZCAqKSBuaW50cyAocC0+bnNlY3Rpb25zKTsKLSAgZHUuZm9ybWF0ID0gYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCA/IDAgOiAxOwotICBkdS5vcHRpbWl6ZWQgPSAwOwotICBkdS5zdGFja2ZybXQgPSAwOwotICBkdS5zcGFyZSA9IDA7Ci0gIGR1LnVuaXQgPSBuOwotICBkdS5zZWN0aW9ucyA9IHAtPm5zZWN0aW9ucyAtIDE7Ci0gIGR1LnNhbiA9IChpbnQgKikgeGNhbGxvYyAoc2l6ZW9mIChpbnQpLCBkdS5zZWN0aW9ucyk7Ci0gIGR1LmFkZHJlc3MgPSBuaW50cyAoZHUuc2VjdGlvbnMpOwotICBkdS5sZW5ndGggPSBuaW50cyAoZHUuc2VjdGlvbnMpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBkdS5zZWN0aW9uczsgaSsrKQotICAgIHsKLSAgICAgIGxvd2VzdFtpXSA9IH4wOwotICAgICAgaGlnaGVzdFtpXSA9IDA7Ci0gICAgfQotCi0gIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIHN5bWJvbHMgYW5kIHRyeSBhbmQgd29yayBvdXQgdGhlIGV4dGVudHMgaW4gdGhpcwotICAgICBzb3VyY2UgZmlsZSAqLwotI2lmIDAKLSAgZm9yIChzeW1ib2wgPSBzZmlsZS0+c2NvcGUtPnZhcnNfaGVhZDsKLSAgICAgICBzeW1ib2w7Ci0gICAgICAgc3ltYm9sID0gc3ltYm9sLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzeW1ib2wtPnR5cGUtPnR5cGUgPT0gY29mZl9zZWNkZWZfdHlwZSkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbG93ID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0OwotCSAgdW5zaWduZWQgaW50IGhpZ2ggPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQgKyBzeW1ib2wtPnR5cGUtPnNpemUgLSAxOwotCSAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbiA9IHN5bWJvbC0+d2hlcmUtPnNlY3Rpb247Ci0KLQkgIGludCBzbiA9IHNlY3Rpb24tPm51bWJlcjsKLQkgIGlmIChsb3cgPCBsb3dlc3Rbc25dKQotCSAgICBsb3dlc3Rbc25dID0gbG93OwotCSAgaWYgKGhpZ2ggPiBoaWdoZXN0W3NuXSkKLQkgICAgaGlnaGVzdFtzbl0gPSBoaWdoOwotCX0KLSAgICB9Ci0KLQotICBmb3IgKGkgPSAwOyBpIDwgZHUuc2VjdGlvbnM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaGlnaGVzdFtpXSA9PSAwKQotCXsKLQkgIGxvd2VzdFtpXSA9IGhpZ2hlc3RbaV0gPSBpbmNpdDsKLQl9Ci0gICAgICBkdS5zYW5bdXNlZF0gPSBpOwotICAgICAgZHUubGVuZ3RoW3VzZWRdID0gaGlnaGVzdFtpXSAtIGxvd2VzdFtpXTsKLSAgICAgIGR1LmFkZHJlc3NbdXNlZF0gPSBiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRVhFQ19QID8gbG93ZXN0W2ldIDogMDsKLSAgICAgIGlmIChkZWJ1ZykKLQl7Ci0JICBwcmludGYgKCIgc2VjdGlvbiAlNnMgMHglMDh4Li4weCUwOHhcbiIsCi0JCSAgcC0+c2VjdGlvbnNbaSArIDFdLm5hbWUsCi0JCSAgbG93ZXN0W2ldLAotCQkgIGhpZ2hlc3RbaV0pOwotCX0KLSAgICAgIHVzZWQrKzsKLSAgICB9Ci0KLSNlbmRpZgotICBsaW0gPSBkdS5zZWN0aW9uczsKLSAgZm9yIChqID0gMDsgaiA8IGxpbTsgaisrKQotICAgIHsKLSAgICAgIGludCBzcmMgPSBqOwotICAgICAgaW50IGRzdCA9IGo7Ci0gICAgICBkdS5zYW5bZHN0XSA9IGRzdDsKLSAgICAgIGlmIChzZmlsZS0+c2VjdGlvbltzcmNdLmluaXQpCi0JewotCSAgZHUubGVuZ3RoW2RzdF0KLQkgICAgPSBzZmlsZS0+c2VjdGlvbltzcmNdLmhpZ2ggLSBzZmlsZS0+c2VjdGlvbltzcmNdLmxvdyArIDE7Ci0JICBkdS5hZGRyZXNzW2RzdF0KLQkgICAgPSBzZmlsZS0+c2VjdGlvbltzcmNdLmxvdzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZHUubGVuZ3RoW2RzdF0gPSAwOwotCSAgZHUuYWRkcmVzc1tkc3RdID0gMDsKLQl9Ci0gICAgICBpZiAoZGVidWcpCi0JewotCSAgaWYgKHNmaWxlLT5zZWN0aW9uW3NyY10ucGFyZW50KQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiIHNlY3Rpb24gJTZzIDB4JTA4eC4uMHglMDh4XG4iLAotCQkgICAgICBzZmlsZS0+c2VjdGlvbltzcmNdLnBhcmVudC0+bmFtZSwKLQkJICAgICAgZHUuYWRkcmVzc1tkc3RdLAotCQkgICAgICBkdS5hZGRyZXNzW2RzdF0gKyBkdS5sZW5ndGhbZHN0XSAtIDEpOwotCSAgICB9Ci0JfQotICAgICAgZHUuc2VjdGlvbnMgPSBkc3QgKyAxOwotICAgIH0KLQotICBkdS50b29sID0gImNfZ2NjIjsKLSAgZHUuZGF0ZSA9IERBVEU7Ci0KLSAgc3lzcm9mZl9zd2FwX2R1X291dCAoZmlsZSwgJmR1KTsKLX0KLQotc3RhdGljIHZvaWQKLXdyX2R1cyAocCwgc2ZpbGUpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci17Ci0KLSAgc3RydWN0IElUX2R1cyBkdXM7Ci0KLSAgZHVzLmVmbiA9IDB4MTAwMTsKLSAgZHVzLm5zID0gMTsJCQkvKiBwLT5uc291cmNlczsgc2FjIDE0IGp1bCA5NCAqLwotICBkdXMuZHJiID0gbmludHMgKGR1cy5ucyk7Ci0gIGR1cy5mbmFtZSA9IChjaGFyICoqKSB4Y2FsbG9jIChzaXplb2YgKGNoYXIgKiksIGR1cy5ucyk7Ci0gIGR1cy5zcGFyZSA9IG5pbnRzIChkdXMubnMpOwotICBkdXMubmRpciA9IDA7Ci0gIC8qIEZpbmQgdGhlIGZpbGVuYW1lcyAqLwotI2lmIDAKLSAgaSA9IDA7Ci0KLSAgZm9yIChzZmlsZSA9IHAtPnNvdXJjZV9oZWFkOwotICAgICAgIHNmaWxlOwotICAgICAgIHNmaWxlID0gc2ZpbGUtPm5leHQpCi0gICAgewotICAgICAgZHVzLmRyYltpXSA9IDA7Ci0gICAgICBkdXMuc3BhcmVbaV0gPSAwOwotICAgICAgZHVzLmZuYW1lW2ldID0gc2ZpbGUtPm5hbWU7Ci0gICAgICBpKys7Ci0gICAgfQotI2Vsc2UKLSAgZHVzLmRyYlswXSA9IDA7Ci0gIGR1cy5mbmFtZVswXSA9IHNmaWxlLT5uYW1lOwotI2VuZGlmCi0KLSAgc3lzcm9mZl9zd2FwX2R1c19vdXQgKGZpbGUsICZkdXMpOwotCi19Ci0KLS8qIEZpbmQgdGhlIG9mZnNldCBvZiB0aGUgLnRleHQgc2VjdGlvbiBmb3IgdGhpcyBzZmlsZSBpbiB0aGUKLSAgIC50ZXh0IHNlY3Rpb24gZm9yIHRoZSBvdXRwdXQgZmlsZSAqLwotCi1zdGF0aWMgaW50Ci1maW5kX2Jhc2UgKHNmaWxlLCBzZWN0aW9uKQotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHJldHVybiBzZmlsZS0+c2VjdGlvbltzZWN0aW9uLT5udW1iZXJdLmxvdzsKLX0KLXN0YXRpYyB2b2lkCi13cl9kbG4gKHAsIHNmaWxlLCBuKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBpbnQgbjsKLQotewotI2lmIDAKLSAgaWYgKG4gPT0gMCkKLSAgICB7Ci0gICAgICAvKiBDb3VudCB1cCBhbGwgdGhlIGxpbmVudW1iZXJzICovCi0gICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5OwotICAgICAgaW50IGxjID0gMDsKLSAgICAgIHN0cnVjdCBJVF9kbG4gZGxuOwotCi0gICAgICBpbnQgaWR4OwotCi0gICAgICBmb3IgKHN5ID0gcC0+c3ltYm9sX2xpc3RfaGVhZDsKLQkgICBzeTsKLQkgICBzeSA9IHN5LT5uZXh0X2luX29maWxlX2xpc3QpCi0JewotCSAgc3RydWN0IGNvZmZfdHlwZSAqdCA9IHN5LT50eXBlOwotCSAgaWYgKHQtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGNvZmZfbGluZSAqbCA9IHQtPnUuZnVuY3Rpb24ubGluZXM7Ci0JICAgICAgbGMgKz0gbC0+bmxpbmVzOwotCSAgICB9Ci0JfQotCi0gICAgICBkbG4uc2ZuID0gbmludHMgKGxjKTsKLSAgICAgIGRsbi5zbG4gPSBuaW50cyAobGMpOwotICAgICAgZGxuLmxsbiA9IG5pbnRzIChsYyk7Ci0gICAgICBkbG4uc2VjdGlvbiA9IG5pbnRzIChsYyk7Ci0KLSAgICAgIGRsbi5mcm9tX2FkZHJlc3MgPSBuaW50cyAobGMpOwotICAgICAgZGxuLnRvX2FkZHJlc3MgPSBuaW50cyAobGMpOwotCi0KLSAgICAgIGRsbi5uZWcgPSAweDEwMDE7Ci0KLSAgICAgIGRsbi5ubG4gPSBsYzsKLQotICAgICAgLyogUnVuIHRocm91Z2ggb25jZSBtb3JlIGFuZCBmaWxsIHVwIHRoZSBzdHJ1Y3R1cmUgKi8KLSAgICAgIGlkeCA9IDA7Ci0gICAgICBmb3IgKHN5ID0gcC0+c3ltYm9sX2xpc3RfaGVhZDsKLQkgICBzeTsKLQkgICBzeSA9IHN5LT5uZXh0X2luX29maWxlX2xpc3QpCi0JewotCSAgaWYgKHN5LT50eXBlLT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKLQkgICAgewotCSAgICAgIGludCBpOwotCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmUgKmwgPSBzeS0+dHlwZS0+dS5mdW5jdGlvbi5saW5lczsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgbC0+bmxpbmVzOyBpKyspCi0JCXsKLQkJICBkbG4uc2VjdGlvbltpZHhdID0gc3ktPndoZXJlLT5zZWN0aW9uLT5udW1iZXI7Ci0JCSAgZGxuLnNmbltpZHhdID0gbjsKLQkJICBkbG4uc2xuW2lkeF0gPSBsLT5saW5lc1tpXTsKLQkJICBkbG4uZnJvbV9hZGRyZXNzW2lkeF0gPSBsLT5hZGRyZXNzZXNbaV07Ci0JCSAgaWYgKGlkeCkKLQkJICAgIGRsbi50b19hZGRyZXNzW2lkeCAtIDFdID0gZGxuLmZyb21fYWRkcmVzc1tpZHhdOwotCQkgIGlkeCsrOwotCQl9Ci0JICAgIH0KLQkgIG4rKzsKLQl9Ci0gICAgICBzeXNyb2ZmX3N3YXBfZGxuX291dCAoZmlsZSwgJmRsbik7Ci0gICAgfQotCi0jZW5kaWYKLSNpZiAxCi0gIC8qIENvdW50IHVwIGFsbCB0aGUgbGluZW51bWJlcnMgKi8KLQotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5OwotICBpbnQgbGMgPSAwOwotICBzdHJ1Y3QgSVRfZGxuIGRsbjsKLQotICBpbnQgaWR4OwotCi0gIGZvciAoc3kgPSBzZmlsZS0+c2NvcGUtPnZhcnNfaGVhZDsKLSAgICAgICBzeTsKLSAgICAgICBzeSA9IHN5LT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnQgPSBzeS0+dHlwZTsKLSAgICAgIGlmICh0LT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKLQl7Ci0JICBzdHJ1Y3QgY29mZl9saW5lICpsID0gdC0+dS5mdW5jdGlvbi5saW5lczsKLQkgIGlmIChsKQotCSAgICBsYyArPSBsLT5ubGluZXM7Ci0JfQotICAgIH0KLQotICBkbG4uc2ZuID0gbmludHMgKGxjKTsKLSAgZGxuLnNsbiA9IG5pbnRzIChsYyk7Ci0gIGRsbi5jYyA9IG5pbnRzIChsYyk7Ci0gIGRsbi5zZWN0aW9uID0gbmludHMgKGxjKTsKLQotICBkbG4uZnJvbV9hZGRyZXNzID0gbmludHMgKGxjKTsKLSAgZGxuLnRvX2FkZHJlc3MgPSBuaW50cyAobGMpOwotCi0KLSAgZGxuLm5lZyA9IDB4MTAwMTsKLQotICBkbG4ubmxuID0gbGM7Ci0KLSAgLyogUnVuIHRocm91Z2ggb25jZSBtb3JlIGFuZCBmaWxsIHVwIHRoZSBzdHJ1Y3R1cmUgKi8KLSAgaWR4ID0gMDsKLSAgZm9yIChzeSA9IHNmaWxlLT5zY29wZS0+dmFyc19oZWFkOwotICAgICAgIHN5OwotICAgICAgIHN5ID0gc3ktPm5leHQpCi0gICAgewotICAgICAgaWYgKHN5LT50eXBlLT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKLQl7Ci0JICBpbnQgaTsKLQkgIHN0cnVjdCBjb2ZmX2xpbmUgKmwgPSBzeS0+dHlwZS0+dS5mdW5jdGlvbi5saW5lczsKLQkgIGlmIChsKQotCSAgICB7Ci0JICAgICAgaW50IGJhc2UgPSBmaW5kX2Jhc2UgKHNmaWxlLCBzeS0+d2hlcmUtPnNlY3Rpb24pOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBsLT5ubGluZXM7IGkrKykKLQkJewotCQkgIGRsbi5zZWN0aW9uW2lkeF0gPSBzeS0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKLQkJICBkbG4uc2ZuW2lkeF0gPSAwOwotCQkgIGRsbi5zbG5baWR4XSA9IGwtPmxpbmVzW2ldOwotCQkgIGRsbi5mcm9tX2FkZHJlc3NbaWR4XSA9Ci0JCSAgICBsLT5hZGRyZXNzZXNbaV0gKyBzeS0+d2hlcmUtPnNlY3Rpb24tPmFkZHJlc3MgLSBiYXNlOwotCQkgIGRsbi5jY1tpZHhdID0gMDsKLQkJICBpZiAoaWR4KQotCQkgICAgZGxuLnRvX2FkZHJlc3NbaWR4IC0gMV0gPSBkbG4uZnJvbV9hZGRyZXNzW2lkeF07Ci0JCSAgaWR4Kys7Ci0KLQkJfQotCSAgICAgIGRsbi50b19hZGRyZXNzW2lkeCAtIDFdID0gZGxuLmZyb21fYWRkcmVzc1tpZHggLSAxXSArIDI7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAobGMpCi0gICAgc3lzcm9mZl9zd2FwX2Rsbl9vdXQgKGZpbGUsICZkbG4pOwotI2VuZGlmCi19Ci0KLS8qIFdyaXRlIHRoZSBnbG9iYWwgc3ltYm9scyBvdXQgdG8gdGhlIGRlYnVnIGluZm8gKi8KLXN0YXRpYyB2b2lkCi13cl9nbG9iYWxzIChwLCBzZmlsZSwgbikKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgaW50IG47Ci17Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3k7Ci0gIGZvciAoc3kgPSBwLT5zeW1ib2xfbGlzdF9oZWFkOwotICAgICAgIHN5OwotICAgICAgIHN5ID0gc3ktPm5leHRfaW5fb2ZpbGVfbGlzdCkKLSAgICB7Ci0gICAgICBpZiAoc3ktPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfZXh0X2RlZgotCSAgfHwgc3ktPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfZXh0X3JlZikKLQl7Ci0JICAvKiBPbmx5IHdyaXRlIG91dCBzeW1ib2xzIGlmIHRoZXkgYmVsb25nIHRvCi0JICAgICB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSAqLwotCSAgaWYgKHN5LT5zZmlsZSA9PSBzZmlsZSkKLQkgICAgd2Fsa190cmVlX3N5bWJvbCAoc2ZpbGUsIDAsIHN5LCAwKTsKLQotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9kZWJ1ZyAocCkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci17Ci0gIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgaW50IG4gPSAwOwotICBmb3IgKHNmaWxlID0gcC0+c291cmNlX2hlYWQ7Ci0gICAgICAgc2ZpbGU7Ci0gICAgICAgc2ZpbGUgPSBzZmlsZS0+bmV4dCkKLQotICAgIHsKLSAgICAgIGlmIChkZWJ1ZykKLQl7Ci0JICBwcmludGYgKCIlc1xuIiwgc2ZpbGUtPm5hbWUpOwotCX0KLSAgICAgIHdyX2R1IChwLCBzZmlsZSwgbik7Ci0gICAgICB3cl9kdXMgKHAsIHNmaWxlKTsKLSAgICAgIHdyX3Byb2dyYW1fc3RydWN0dXJlIChwLCBzZmlsZSk7Ci0gICAgICB3cl9kbG4gKHAsIHNmaWxlLCBuKTsKLSAgICAgIG4rKzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9jcyAoKQotewotICAvKiBJdCBzZWVtcyB0aGF0IHRoZSBDUyBzdHJ1Y3QgaXMgbm90IG5vcm1hbCAtIHRoZSBzaXplIGlzIHdyb25nCi0gICAgIGhlcmVzIG9uZSBJIHByZXBhcmVkIGVhcmxpZXIuLiAqLwotICBzdGF0aWMgY2hhciBiW10gPSB7Ci0gICAgMHg4MCwJCQkvKiBJVCAqLwotICAgIDB4MjEsCQkJLyogUkwgKi8KLSAgICAweDAwLAkJCS8qIG51bWJlciBvZiBjaGFycyBpbiB2YXJpYWJsZSBsZW5ndGggcGFydCAqLwotICAgIDB4ODAsCQkJLyogaGQgKi8gCi0gICAgMHgwMCwJCQkvKiBocyAqLyAKLSAgICAweDgwLAkJCS8qIHVuICovIAotICAgIDB4MDAsCQkJLyogdXMgKi8gCi0gICAgMHg4MCwJCQkvKiBzYyAqLyAKLSAgICAweDAwLAkJCS8qIHNzICovIAotICAgIDB4ODAsCQkJLyogZXIgKi8gCi0gICAgMHg4MCwJCQkvKiBlZCAqLyAKLSAgICAweDgwLAkJCS8qIHNoICovIAotICAgIDB4ODAsCQkJLyogb2IgKi8gCi0gICAgMHg4MCwJCQkvKiBybCAqLyAKLSAgICAweDgwLAkJCS8qIGR1ICovCi0gICAgMHg4MCwJCQkvKiBkcHMgKi8KLSAgICAweDgwLAkJCS8qIGRzeSAqLwotICAgIDB4ODAsCQkJLyogZHR5ICovCi0gICAgMHg4MCwJCQkvKiBkbG4gKi8KLSAgICAweDgwLAkJCS8qIGRzbyAqLwotICAgIDB4ODAsCQkJLyogZHVzICovCi0gICAgMHgwMCwJCQkvKiBkc3MgKi8KLSAgICAweDgwLAkJCS8qIGRidCAqLwotICAgIDB4MDAsCQkJLyogZHBwICovCi0gICAgMHg4MCwJCQkvKiBkZnAgKi8KLSAgICAweDgwLAkJCS8qIGRlbiAqLwotICAgIDB4ODAsCQkJLyogZGRzICovCi0gICAgMHg4MCwJCQkvKiBkYXIgKi8KLSAgICAweDgwLAkJCS8qIGRwdCAqLwotICAgIDB4MDAsCQkJLyogZHVsICovCi0gICAgMHgwMCwJCQkvKiBkc2UgKi8KLSAgICAweDAwLAkJCS8qIGRvdCAqLwotICAgIDB4REUJCQkvKiBDUyAqLwotICB9OwotICBmd3JpdGUgKGIsIDEsIHNpemVvZiAoYiksIGZpbGUpOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIFNDIHJlY29yZHMgZm9yIGEgdW5pdC4gIENyZWF0ZSBhbiBTQwotICAgZm9yIGFsbCB0aGUgc2VjdGlvbnMgd2hpY2ggYXBwZWFyIGluIHRoZSBvdXRwdXQgZmlsZSwgZXZlbgotICAgaWYgdGhlcmUgaXNuJ3QgYW4gZXF1aXZhbGVudCBvbmUgb24gdGhlIGlucHV0ICovCi0KLXN0YXRpYyBpbnQKLXdyX3NjIChwdHIsIHNmaWxlKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci17Ci0gIGludCBpOwotaW50IHNjb3VudCA9IDA7Ci0gIC8qIEZpcnN0IHdvcmsgb3V0IHRoZSB0b3RhbCBudW1iZXIgb2Ygc2VjdGlvbnMgKi8KLQotICBpbnQgdG90YWxfc2VjID0gcHRyLT5uc2VjdGlvbnM7Ci0KLSAgc3RydWN0IG15aW5mbwotICAgIHsKLSAgICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotICAgIH07Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotCi0gIHN0cnVjdCBteWluZm8gKmluZm8KLSAgICA9IChzdHJ1Y3QgbXlpbmZvICopIGNhbGxvYyAodG90YWxfc2VjLCBzaXplb2YgKHN0cnVjdCBteWluZm8pKTsKLQotCi0KLSAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3NlYzsgaSsrKQotICAgIHsKLSAgICAgIGluZm9baV0uc2VjID0gcHRyLT5zZWN0aW9ucyArIGk7Ci0gICAgICBpbmZvW2ldLnN5bWJvbCA9IDA7Ci0gICAgfQotCi0gIGZvciAoc3ltYm9sID0gc2ZpbGUtPnNjb3BlLT52YXJzX2hlYWQ7Ci0gICAgICAgc3ltYm9sOwotICAgICAgIHN5bWJvbCA9IHN5bWJvbC0+bmV4dCkKLSAgICB7Ci0KLSAgICAgIGlmIChzeW1ib2wtPnR5cGUtPnR5cGUgPT0gY29mZl9zZWNkZWZfdHlwZSkKLQl7Ci0JICBmb3IgKGkgPSAwOyBpIDwgdG90YWxfc2VjOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3ltYm9sLT53aGVyZS0+c2VjdGlvbiA9PSBpbmZvW2ldLnNlYykKLQkJewotCQkgIGluZm9baV0uc3ltYm9sID0gc3ltYm9sOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBvdXRwdXQgYWxsIHRoZSBzZWN0aW9uIGluZm8sIGFuZCBmYWtlIHVwIHNvbWUgc3R1ZmYgZm9yIHNlY3Rpb25zCi0gICAgIHdlIGRvbid0IGhhdmUgKi8KLQotICBmb3IgKGkgPSAxOyBpIDwgdG90YWxfc2VjOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IElUX3NjIHNjOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIHN5bWJvbCA9IGluZm9baV0uc3ltYm9sOwotICAgICAgc2Muc3BhcmUgPSAwOwotICAgICAgc2Muc3BhcmUxID0gMDsKLSAgICAgIGlmICghc3ltYm9sKQotCXsKLQkgIC8qIERvbid0IGhhdmUgYSBzeW1ib2wgc2V0IGFzaWRlIGZvciB0aGlzIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgbm90aGluZwotCSAgICAgaW4gdGhpcyBmaWxlIGRvZXMgYW55dGhpbmcgZm9yIHRoZSBzZWN0aW9uLiAqLwotCSAgc2MuZm9ybWF0ID0gIShiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRVhFQ19QKTsKLQkgIHNjLmFkZHIgPSAwOwotCSAgc2MubGVuZ3RoID0gMDsKLQkgIG5hbWUgPSBpbmZvW2ldLnNlYy0+bmFtZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBFWEVDX1ApCi0JICAgIHsKLQkgICAgICBzYy5mb3JtYXQgPSAwOwotCSAgICAgIHNjLmFkZHIgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNjLmZvcm1hdCA9IDE7Ci0JICAgICAgc2MuYWRkciA9IDA7Ci0JICAgIH0KLQkgIHNjLmxlbmd0aCA9IHN5bWJvbC0+dHlwZS0+c2l6ZTsKLQkgIG5hbWUgPSBzeW1ib2wtPm5hbWU7Ci0JfQotCi0gICAgICBzYy5hbGlnbiA9IDQ7Ci0KLSAgICAgIHNjLmNvbmNhdCA9IENPTkNBVF9TSU1QTEU7Ci0gICAgICBzYy5yZWFkID0gMzsKLSAgICAgIHNjLndyaXRlID0gMzsKLSAgICAgIHNjLmV4ZWMgPSAzOwotICAgICAgc2MuaW5pdCA9IDM7Ci0gICAgICBzYy5tb2RlID0gMzsKLSAgICAgIHNjLnNwYXJlID0gMDsKLSAgICAgIHNjLnNlZ2FkZCA9IDA7Ci0gICAgICBzYy5zcGFyZTEgPSAwOwkJLyogSWYgbm90IHplcm8sIHRoZW4gaXQgZG9lc24ndCB3b3JrICovCi0gICAgICBzYy5uYW1lID0gc2VjdGlvbl90cmFuc2xhdGUgKG5hbWUpOwotICAgICAgaWYgKHN0cmxlbiAoc2MubmFtZSkgPT0gMSkKLQl7Ci0JICBzd2l0Y2ggKHNjLm5hbWVbMF0pCi0JICAgIHsKLQkgICAgY2FzZSAnRCc6Ci0JICAgIGNhc2UgJ0InOgotCSAgICAgIHNjLmNvbnRlbnRzID0gQ09OVEVOVFNfREFUQTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzYy5jb250ZW50cyA9IENPTlRFTlRTX0NPREU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2MuY29udGVudHMgPSBDT05URU5UU19DT0RFOwotCX0KLSNpZiAwCi0gICAgICAvKiBORVcgKi8KLSAgICAgIGlmIChzYy5sZW5ndGgpIHsKLSNlbmRpZgotCXN5c3JvZmZfc3dhcF9zY19vdXQgKGZpbGUsICZzYyk7Ci0Jc2NvdW50Kys7Ci0jaWYgMAotICAgICAgfQotI2VuZGlmCi0gICAgfQotcmV0dXJuIHNjb3VudDsKLX0KLQotCi0vKiBXcml0ZSBvdXQgdGhlIEVSIHJlY29yZHMgZm9yIGEgdW5pdC4gKi8KLXN0YXRpYyB2b2lkCi13cl9lciAocHRyLCBzZmlsZSwgZmlyc3QpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwdHI7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgaW50IGZpcnN0OwotewotICBpbnQgaWR4ID0gMDsKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW07Ci0gIGlmIChmaXJzdCkKLSAgICB7Ci0gICAgICBmb3IgKHN5bSA9IHB0ci0+c3ltYm9sX2xpc3RfaGVhZDsgc3ltOyBzeW0gPSBzeW0tPm5leHRfaW5fb2ZpbGVfbGlzdCkKLQl7Ci0JICBpZiAoc3ltLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9yZWYpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgSVRfZXIgZXI7Ci0JICAgICAgZXIuc3BhcmUgPSAwOwotCSAgICAgIGVyLnR5cGUgPSBFUl9OT1RTUEVDOwotCSAgICAgIGVyLm5hbWUgPSBzeW0tPm5hbWU7Ci0JICAgICAgc3lzcm9mZl9zd2FwX2VyX291dCAoZmlsZSwgJmVyKTsKLQkgICAgICBzeW0tPmVyX251bWJlciA9IGlkeCsrOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogV3JpdGUgb3V0IHRoZSBFRCByZWNvcmRzIGZvciBhIHVuaXQuICovCi1zdGF0aWMgdm9pZAotd3JfZWQgKHB0ciwgc2ZpbGUsIGZpcnN0KQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIGludCBmaXJzdDsKLXsKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzOwotICBpZiAoZmlyc3QpCi0gICAgewotICAgICAgZm9yIChzID0gcHRyLT5zeW1ib2xfbGlzdF9oZWFkOyBzOyBzID0gcy0+bmV4dF9pbl9vZmlsZV9saXN0KQotCXsKLQkgIGlmIChzLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9kZWYKLQkgICAgICB8fCBzLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2NvbW1vbikKLQkgICAgewotCSAgICAgIHN0cnVjdCBJVF9lZCBlZDsKLQotCSAgICAgIGVkLnNlY3Rpb24gPSBzLT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOwotCSAgICAgIGVkLnNwYXJlID0gMDsKLQkgICAgICBpZiAocy0+d2hlcmUtPnNlY3Rpb24tPmRhdGEpCi0JCXsKLQkJICBlZC50eXBlID0gRURfVFlQRV9EQVRBOwotCQl9Ci0JICAgICAgZWxzZSBpZiAocy0+d2hlcmUtPnNlY3Rpb24tPmNvZGUgJiBTRUNfQ09ERSkKLQkJewotCQkgIGVkLnR5cGUgPSBFRF9UWVBFX0VOVFJZOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZWQudHlwZSA9IEVEX1RZUEVfTk9UU1BFQzsKLQkJICBlZC50eXBlID0gRURfVFlQRV9EQVRBOwotCQl9Ci0JICAgICAgZWQuYWRkcmVzcyA9IHMtPndoZXJlLT5vZmZzZXQgLSBzLT53aGVyZS0+c2VjdGlvbi0+YWRkcmVzczsKLQkgICAgICBlZC5uYW1lID0gcy0+bmFtZTsKLQkgICAgICBzeXNyb2ZmX3N3YXBfZWRfb3V0IChmaWxlLCAmZWQpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXdyX3VuaXRfaW5mbyAocHRyKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOwotewotICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gIGludCBmaXJzdCA9IDE7Ci0gIGZvciAoc2ZpbGUgPSBwdHItPnNvdXJjZV9oZWFkOwotICAgICAgIHNmaWxlOwotICAgICAgIHNmaWxlID0gc2ZpbGUtPm5leHQpCi0gICAgewotICAgICAgbG9uZyBwMTsKLSAgICAgIGxvbmcgcDI7Ci0gICAgICBpbnQgbnNlY3M7Ci0gICAgICBwMSA9IGZ0ZWxsIChmaWxlKTsKLSAgICAgIHdyX3VuIChwdHIsIHNmaWxlLCBmaXJzdCwgMCk7Ci0gICAgICBuc2VjcyA9IHdyX3NjIChwdHIsIHNmaWxlKTsKLSAgICAgIHAyID0gZnRlbGwgKGZpbGUpOwotICAgICAgZnNlZWsgKGZpbGUsIHAxLCBTRUVLX1NFVCk7Ci0gICAgICB3cl91biAocHRyLCBzZmlsZSwgZmlyc3QsIG5zZWNzKTsKLSAgICAgIGZzZWVrIChmaWxlLCBwMiwgU0VFS19TRVQpOyAKLSAgICAgIHdyX2VyIChwdHIsIHNmaWxlLCBmaXJzdCk7Ci0gICAgICB3cl9lZCAocHRyLCBzZmlsZSwgZmlyc3QpOwotICAgICAgZmlyc3QgPSAwOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXdyX21vZHVsZSAocCkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci17Ci0gIHdyX2NzICgpOwotICB3cl9oZCAocCk7Ci0gIHdyX3VuaXRfaW5mbyAocCk7Ci0gIHdyX29iamVjdF9ib2R5IChwKTsKLSAgd3JfZGVidWcgKHApOwotICB3cl90ciAoKTsKLX0KLQotc3RhdGljIGludAotYWxpZ24gKHgpCi0gICAgIGludCB4OwotewotICByZXR1cm4gKHggKyAzKSAmIH4zOwotfQotCi0vKiBGaW5kIGFsbCB0aGUgY29tbW9uIHZhcmlhYmxlcyBhbmQgdHVybiB0aGVtIGludG8KLSAgIG9yZGluYXJ5IGRlZnMgLSBkdW5ubyB3aHksIGJ1dCB0aGF0cyB3aGF0IGhpdGFjaGkgZG9lcyB3aXRoICdlbSAqLwotCi1zdGF0aWMgdm9pZAotcHJlc2NhbiAodHJlZSkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnRyZWU7Ci17Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqczsKLSAgc3RydWN0IGNvZmZfc2VjdGlvbiAqY29tbW9uX3NlY3Rpb247Ci0gIC8qIEZpbmQgdGhlIGNvbW1vbiBzZWN0aW9uIC0gYWx3YXlzIHNlY3Rpb24gMyAqLwotICBjb21tb25fc2VjdGlvbiA9IHRyZWUtPnNlY3Rpb25zICsgMzsKLSAgZm9yIChzID0gdHJlZS0+c3ltYm9sX2xpc3RfaGVhZDsKLSAgICAgICBzOwotICAgICAgIHMgPSBzLT5uZXh0X2luX29maWxlX2xpc3QpCi0gICAgewotICAgICAgaWYgKHMtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfY29tbW9uKQotCXsKLQkgIHN0cnVjdCBjb2ZmX3doZXJlICp3ID0gcy0+d2hlcmU7Ci0JICAvKiAgICAgIHMtPnZpc2libGUtPnR5cGUgPSBjb2ZmX3Zpc19leHRfZGVmOyBsZWF2ZSBpdCBhcyBjb21tb24gKi8KLQkgIGNvbW1vbl9zZWN0aW9uLT5zaXplID0gYWxpZ24gKGNvbW1vbl9zZWN0aW9uLT5zaXplKTsKLQkgIHctPm9mZnNldCA9IGNvbW1vbl9zZWN0aW9uLT5zaXplICsgY29tbW9uX3NlY3Rpb24tPmFkZHJlc3M7Ci0JICB3LT5zZWN0aW9uID0gY29tbW9uX3NlY3Rpb247Ci0JICBjb21tb25fc2VjdGlvbi0+c2l6ZSArPSBzLT50eXBlLT5zaXplOwotCSAgY29tbW9uX3NlY3Rpb24tPnNpemUgPSBhbGlnbiAoY29tbW9uX3NlY3Rpb24tPnNpemUpOwotCX0KLSAgICB9Ci19Ci0KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiVXNhZ2U6ICVzIFstZGhWcV0gaW4tZmlsZSBbb3V0LWZpbGVdXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQKLXNob3dfaGVscCAoKQotewotICBwcmludGYgKF8oIiVzOiBDb252ZXJ0IGEgQ09GRiBvYmplY3QgZmlsZSBpbnRvIGEgU1lTUk9GRiBvYmplY3QgZmlsZVxuIiksCi0JICBwcm9ncmFtX25hbWUpOwotICBzaG93X3VzYWdlIChzdGRvdXQsIDApOwotfQotCi0KLQotaW50Ci1tYWluIChhYywgYXYpCi0gICAgIGludCBhYzsKLSAgICAgY2hhciAqYXZbXTsKLXsKLSAgaW50IG9wdDsKLSAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotICB7Ci0gICAgeyJkZWJ1ZyIsIG5vX2FyZ3VtZW50LCAwLCAnZCd9LAotICAgIHsicXVpY2siLCBub19hcmd1bWVudCwgMCwgJ3EnfSwKLSAgICB7Im5vcHJlc2NhbiIsIG5vX2FyZ3VtZW50LCAwLCAnbid9LAotICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICAgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICAgIHtOVUxMLCBub19hcmd1bWVudCwgMCwgMH0KLSAgfTsKLSAgY2hhciAqKm1hdGNoaW5nOwotICBjaGFyICppbnB1dF9maWxlOwotICBjaGFyICpvdXRwdXRfZmlsZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGF2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LCAiZGhWcW4iLCBsb25nX29wdGlvbnMsCi0JCQkgICAgIChpbnQgKikgTlVMTCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wdCkKLQl7Ci0JY2FzZSAncSc6Ci0JICBxdWljayA9IDE7Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIG5vcHJlc2NhbiA9IDE7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGRlYnVnID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgc2hvd19oZWxwICgpOwotCSAgLypOT1RSRUFDSEVEICovCi0JY2FzZSAnVic6Ci0JICBwcmludGYgKF8oIkdOVSAlcyB2ZXJzaW9uICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBQUk9HUkFNX1ZFUlNJT04pOwotCSAgZXhpdCAoMCk7Ci0JICAvKk5PVFJFQUNIRUQgKi8KLQljYXNlIDA6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIC8qTk9UUkVBQ0hFRCAqLwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbWF5IGJlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotICBvdXRwdXRfZmlsZSA9IE5VTEw7Ci0gIGlmIChvcHRpbmQgPCBhYykKLSAgICB7Ci0gICAgICBpbnB1dF9maWxlID0gYXZbb3B0aW5kXTsKLSAgICAgICsrb3B0aW5kOwotICAgICAgaWYgKG9wdGluZCA8IGFjKQotCXsKLQkgIG91dHB1dF9maWxlID0gYXZbb3B0aW5kXTsKLQkgICsrb3B0aW5kOwotCSAgaWYgKG9wdGluZCA8IGFjKQotCSAgICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgaWYgKHN0cmNtcCAoaW5wdXRfZmlsZSwgb3V0cHV0X2ZpbGUpID09IDApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtdXN0IGJlIGRpZmZlcmVudFxuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUpOwotCSAgICAgIGV4aXQgKDEpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGlucHV0X2ZpbGUgPSAwOwotCi0gIGlmICghaW5wdXRfZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZFxuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKCFvdXRwdXRfZmlsZSkKLSAgICB7Ci0gICAgICAvKiBUYWtlIGEgLm8gb2ZmIHRoZSBpbnB1dCBmaWxlIGFuZCBzdGljayBvbiBhIC5vYmouICBJZgotICAgICAgICAgaXQgZG9lc24ndCBlbmQgaW4gLm8sIHRoZW4gc3RpY2sgYSAub2JqIG9uIGFueXdheSAqLwotCi0gICAgICBpbnQgbGVuID0gc3RybGVuIChpbnB1dF9maWxlKTsKLSAgICAgIG91dHB1dF9maWxlID0geG1hbGxvYyAobGVuICsgNSk7Ci0gICAgICBzdHJjcHkgKG91dHB1dF9maWxlLCBpbnB1dF9maWxlKTsKLSAgICAgIGlmIChsZW4gPiAzCi0JICAmJiBvdXRwdXRfZmlsZVtsZW4gLSAyXSA9PSAnLicKLQkgICYmIG91dHB1dF9maWxlW2xlbiAtIDFdID09ICdvJykKLQl7Ci0JICBvdXRwdXRfZmlsZVtsZW5dID0gJ2InOwotCSAgb3V0cHV0X2ZpbGVbbGVuICsgMV0gPSAnaic7Ci0JICBvdXRwdXRfZmlsZVtsZW4gKyAyXSA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cmNhdCAob3V0cHV0X2ZpbGUsICIub2JqIik7Ci0JfQotICAgIH0KLQotICBhYmZkID0gYmZkX29wZW5yIChpbnB1dF9maWxlLCAwKTsKLQotICBpZiAoIWFiZmQpCi0gICAgYmZkX2ZhdGFsIChpbnB1dF9maWxlKTsKLQotICBpZiAoIWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGlucHV0X2ZpbGUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgZmlsZSA9IGZvcGVuIChvdXRwdXRfZmlsZSwgRk9QRU5fV0IpOwotCi0gIGlmICghZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwgb3V0cHV0X2ZpbGUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChkZWJ1ZykKLSAgICBwcmludGYgKCJpZHMgJWQgJWRcbiIsIGJhc2UxLCBiYXNlMik7Ci0gIHRyZWUgPSBjb2ZmX2dyb2sgKGFiZmQpOwotICBpZiAoIW5vcHJlc2NhbikKLSAgICBwcmVzY2FuICh0cmVlKTsKLSAgd3JfbW9kdWxlICh0cmVlKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zdGFicy5jIGIvYmludXRpbHMvc3RhYnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlMTA3MC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zdGFicy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIwOSArMCwwIEBACi0vKiBzdGFicy5jIC0tIFBhcnNlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHdoaWNoIHBhcnNlcyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBUaGUgb3JnYW5pemF0aW9uIG9mIHRoaXMgY29kZSBpcyBiYXNlZCBvbiB0aGUgZ2RiIHN0YWJzIHJlYWRpbmcKLSAgIGNvZGUuICBUaGUgam9iIGl0IGRvZXMgaXMgc29tZXdoYXQgZGlmZmVyZW50LCBiZWNhdXNlIGl0IGlzIG5vdAotICAgdHJ5aW5nIHRvIGlkZW50aWZ5IHRoZSBjb3JyZWN0IGFkZHJlc3MgZm9yIGFueXRoaW5nLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlbWFuZ2xlLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotCi0vKiBNZWFuaW5nbGVzcyBkZWZpbml0aW9uIG5lZWRzIGJ5IGFvdXQ2NC5oLiAgRklYTUUuICAqLwotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1IKLSNpZmRlZiBfV0lOMzIKLSNkZWZpbmUgRElSX1NFUEFSQVRPUiAnXFwnCi0jZWxzZQotI2RlZmluZSBESVJfU0VQQVJBVE9SICcvJwotI2VuZGlmCi0jZW5kaWYKLQotLyogVGhlIG51bWJlciBvZiBwcmVkZWZpbmVkIFhDT0ZGIHR5cGVzLiAgKi8KLQotI2RlZmluZSBYQ09GRl9UWVBFX0NPVU5UIDM0Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYXMgYSBoYW5kbGUgc28gdGhhdCB0aGUgc3RhYiBwYXJzaW5nIGRvZXNuJ3QKLSAgIG5lZWQgdG8gdXNlIGFueSBzdGF0aWMgdmFyaWFibGVzLiAgKi8KLQotc3RydWN0IHN0YWJfaGFuZGxlCi17Ci0gIC8qIFRoZSBCRkQuICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIFRydWUgaWYgdGhpcyBpcyBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gc2VjdGlvbnM7Ci0gIC8qIFRoZSBzeW1ib2wgdGFibGUuICAqLwotICBhc3ltYm9sICoqc3ltczsKLSAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzLiAgKi8KLSAgbG9uZyBzeW1jb3VudDsKLSAgLyogVGhlIGFjY3VtdWxhdGVkIGZpbGUgbmFtZSBzdHJpbmcuICAqLwotICBjaGFyICpzb19zdHJpbmc7Ci0gIC8qIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBOX1NPIHN5bWJvbC4gICovCi0gIGJmZF92bWEgc29fdmFsdWU7Ci0gIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBmaWxlCi0gICAgIHJlbGF0aXZlIE5fTEJSQUMgYW5kIE5fUkJSQUMgc3ltYm9scy4gICovCi0gIGJmZF92bWEgZmlsZV9zdGFydF9vZmZzZXQ7Ci0gIC8qIFRoZSBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiwgc28gdGhhdCB3ZSBjYW4gaGFuZGxlCi0gICAgIGZ1bmN0aW9uIHJlbGF0aXZlIE5fTEJSQUMgYW5kIE5fUkJSQUMgc3ltYm9scy4gICovCi0gIGJmZF92bWEgZnVuY3Rpb25fc3RhcnRfb2Zmc2V0OwotICAvKiBUaGUgdmVyc2lvbiBudW1iZXIgb2YgZ2NjIHdoaWNoIGNvbXBpbGVkIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uCi0gICAgIHVuaXQsIDAgaWYgbm90IGNvbXBpbGVkIGJ5IGdjYy4gICovCi0gIGludCBnY2NfY29tcGlsZWQ7Ci0gIC8qIFdoZXRoZXIgYW4gTl9PUFQgc3ltYm9sIHdhcyBzZWVuIHRoYXQgd2FzIG5vdCBnZW5lcmF0ZWQgYnkgZ2NjLAotICAgICBzbyB0aGF0IHdlIGNhbiBkZXRlY3QgdGhlIFN1blBSTyBjb21waWxlci4gICovCi0gIGJvb2xlYW4gbl9vcHRfZm91bmQ7Ci0gIC8qIFRoZSBtYWluIGZpbGUgbmFtZS4gICovCi0gIGNoYXIgKm1haW5fZmlsZW5hbWU7Ci0gIC8qIEEgc3RhY2sgb2YgdW5maW5pc2hlZCBOX0JJTkNMIGZpbGVzLiAgKi8KLSAgc3RydWN0IGJpbmNsX2ZpbGUgKmJpbmNsX3N0YWNrOwotICAvKiBBIGxpc3Qgb2YgZmluaXNoZWQgTl9CSU5DTCBmaWxlcy4gICovCi0gIHN0cnVjdCBiaW5jbF9maWxlICpiaW5jbF9saXN0OwotICAvKiBXaGV0aGVyIHdlIGFyZSBpbnNpZGUgYSBmdW5jdGlvbiBvciBub3QuICAqLwotICBib29sZWFuIHdpdGhpbl9mdW5jdGlvbjsKLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIHVzZWQgaWYgd2UgaGF2ZSBzZWVuIGFuCi0gICAgIE5fRlVOIHN5bWJvbCB3aGlsZSBpbiBhIGZ1bmN0aW9uLiAgVGhpcyBpcyAtMSBpZiB3ZSBoYXZlIG5vdCBzZWVuCi0gICAgIGFuIE5fRlVOICh0aGUgbm9ybWFsIGNhc2UpLiAgKi8KLSAgYmZkX3ZtYSBmdW5jdGlvbl9lbmQ7Ci0gIC8qIFRoZSBkZXB0aCBvZiBibG9jayBuZXN0aW5nLiAgKi8KLSAgaW50IGJsb2NrX2RlcHRoOwotICAvKiBMaXN0IG9mIHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMuICAqLwotICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqcGVuZGluZzsKLSAgLyogTnVtYmVyIG9mIGZpbGVzIGZvciB3aGljaCB3ZSBoYXZlIHR5cGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IGZpbGVzOwotICAvKiBMaXN0cyBvZiB0eXBlcyBwZXIgZmlsZS4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVzICoqZmlsZV90eXBlczsKLSAgLyogUHJlZGVmaW5lZCBYQ09GRiB0eXBlcy4gICovCi0gIGRlYnVnX3R5cGUgeGNvZmZfdHlwZXNbWENPRkZfVFlQRV9DT1VOVF07Ci0gIC8qIFVuZGVmaW5lZCB0YWdzLiAgKi8KLSAgc3RydWN0IHN0YWJfdGFnICp0YWdzOwotICAvKiBTZXQgYnkgcGFyc2Vfc3RhYl90eXBlIGlmIGl0IHNlZXMgYSBzdHJ1Y3R1cmUgZGVmaW5lZCBhcyBhIGNyb3NzCi0gICAgIHJlZmVyZW5jZSB0byBpdHNlbGYuICBSZXNldCBieSBwYXJzZV9zdGFiX3R5cGUgb3RoZXJ3aXNlLiAgKi8KLSAgYm9vbGVhbiBzZWxmX2Nyb3NzcmVmOwotfTsKLQotLyogQSBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgdXNlZCB0byBob2xkIHBlbmRpbmcgdmFyaWFibGUKLSAgIGRlZmluaXRpb25zIHNlZW4gYmVmb3JlIHRoZSBOX0xCUkFDIG9mIGEgYmxvY2suICAqLwotCi1zdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhcgotewotICAvKiBOZXh0IHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbi4gICovCi0gIHN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyICpuZXh0OwotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogS2luZC4gICovCi0gIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgLyogVmFsdWUuICAqLwotICBiZmRfdm1hIHZhbDsKLX07Ci0KLS8qIEEgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIHVzZWQgdG8gaG9sZCB0aGUgdHlwZXMgZm9yIGEgc2luZ2xlCi0gICBmaWxlLiAgKi8KLQotc3RydWN0IHN0YWJfdHlwZXMKLXsKLSAgLyogTmV4dCBzZXQgb2Ygc2xvdHMgZm9yIHRoaXMgZmlsZS4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVzICpuZXh0OwotICAvKiBUeXBlcyBpbmRleGVkIGJ5IHR5cGUgbnVtYmVyLiAgKi8KLSNkZWZpbmUgU1RBQl9UWVBFU19TTE9UUyAoMTYpCi0gIGRlYnVnX3R5cGUgdHlwZXNbU1RBQl9UWVBFU19TTE9UU107Ci19OwotCi0vKiBXZSBrZWVwIGEgbGlzdCBvZiB1bmRlZmluZWQgdGFncyB0aGF0IHdlIGVuY291bnRlciwgc28gdGhhdCB3ZSBjYW4KLSAgIGZpbGwgdGhlbSBpbiBpZiB0aGUgdGFnIGlzIGxhdGVyIGRlZmluZWQuICAqLwotCi1zdHJ1Y3Qgc3RhYl90YWcKLXsKLSAgLyogTmV4dCB1bmRlZmluZWQgdGFnLiAgKi8KLSAgc3RydWN0IHN0YWJfdGFnICpuZXh0OwotICAvKiBUYWcgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFR5cGUga2luZC4gICovCi0gIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci0gIC8qIFNsb3QgdG8gaG9sZCByZWFsIHR5cGUgd2hlbiB3ZSBkaXNjb3ZlciBpdC4gIElmIHdlIGRvbid0LCB3ZSBmaWxsCi0gICAgIGluIGFuIHVuZGVmaW5lZCB0YWcgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgc2xvdDsKLSAgLyogSW5kaXJlY3QgdHlwZSB3ZSBoYXZlIGNyZWF0ZWQgdG8gcG9pbnQgYXQgc2xvdC4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLX07Ci0KLXN0YXRpYyBjaGFyICpzYXZlc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgYmZkX3ZtYSBwYXJzZV9udW1iZXIgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgdm9pZCBiYWRfc3RhYiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHdhcm5fc3RhYiBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9zdHJpbmcKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgaW50LCBpbnQsIGJmZF92bWEsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwKLQkgICBkZWJ1Z190eXBlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIGludCAqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3JhbmdlX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGludCAqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3N1bl9idWlsdGluX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3N1bl9mbG9hdGluZ190eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9lbnVtX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYm9vbGVhbiwKLQkgICBjb25zdCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9iYXNlY2xhc3NlcwotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z19iYXNlY2xhc3MgKiopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfc3RydWN0X2ZpZWxkcwotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z19maWVsZCAqKiwKLQkgICBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfY3BwX2FiYnJldgotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z19maWVsZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX29uZV9zdHJ1Y3RfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqLAotCSAgIGRlYnVnX2ZpZWxkICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9tZW1iZXJzCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBpbnQgKiwgZGVidWdfbWV0aG9kICoqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX2FyZ3R5cGVzCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGRlYnVnX3R5cGUsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCSAgIGRlYnVnX3R5cGUsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl90aWxkZV9maWVsZAotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBjb25zdCBpbnQgKiwKLQkgICBkZWJ1Z190eXBlICosIGJvb2xlYW4gKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9hcnJheV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiosIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIHB1c2hfYmluY2wgUEFSQU1TICgoc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGNvbnN0IGNoYXIgKnBvcF9iaW5jbCBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKikpOwotc3RhdGljIGJvb2xlYW4gZmluZF9leGNsCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfcmVjb3JkX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwKLQkgICBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2VtaXRfcGVuZGluZ192YXJzIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlICpzdGFiX2ZpbmRfc2xvdAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgaW50ICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHN0YWJfZmluZF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3JlY29yZF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGludCAqLCBkZWJ1Z190eXBlKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBzdGFiX3hjb2ZmX2J1aWx0aW5fdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBpbnQpKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHN0YWJfZmluZF90YWdnZWRfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGludCwKLQkgICBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotc3RhdGljIGRlYnVnX3R5cGUgKnN0YWJfZGVtYW5nbGVfYXJndHlwZXMKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBib29sZWFuICopKTsKLQotLyogU2F2ZSBhIHN0cmluZyBpbiBtZW1vcnkuICAqLwotCi1zdGF0aWMgY2hhciAqCi1zYXZlc3RyaW5nIChzdGFydCwgbGVuKQotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgaW50IGxlbjsKLXsKLSAgY2hhciAqcmV0OwotCi0gIHJldCA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOwotICBtZW1jcHkgKHJldCwgc3RhcnQsIGxlbik7Ci0gIHJldFtsZW5dID0gJ1wwJzsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUmVhZCBhIG51bWJlciBmcm9tIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLXBhcnNlX251bWJlciAocHAsIHBvdmVyZmxvdykKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBib29sZWFuICpwb3ZlcmZsb3c7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdWw7Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0KLSAgaWYgKHBvdmVyZmxvdyAhPSBOVUxMKQotICAgICpwb3ZlcmZsb3cgPSBmYWxzZTsKLQotICBvcmlnID0gKnBwOwotCi0gIGVycm5vID0gMDsKLSAgdWwgPSBzdHJ0b3VsICgqcHAsIChjaGFyICoqKSBwcCwgMCk7Ci0gIGlmICh1bCArIDEgIT0gMCB8fCBlcnJubyA9PSAwKQotICAgIHsKLSAgICAgIC8qIElmIGJmZF92bWEgaXMgbGFyZ2VyIHRoYW4gdW5zaWduZWQgbG9uZywgYW5kIHRoZSBudW1iZXIgaXMKLSAgICAgICAgIG1lYW50IHRvIGJlIG5lZ2F0aXZlLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHNpZ24KLSAgICAgICAgIGV4dGVuZCBwcm9wZXJseS4gICovCi0gICAgICBpZiAoKm9yaWcgPT0gJy0nKQotCXJldHVybiAoYmZkX3ZtYSkgKGJmZF9zaWduZWRfdm1hKSAobG9uZykgdWw7Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIHVsOwotICAgIH0KLQotICAvKiBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggc3RydG91bCBvdmVyZmxvd2VkLCBpdCBzaG91bGQgaGF2ZSBzZXQgKnBwCi0gICAgIHRvIHRoZSBlbmQgb2YgdGhlIG51bWJlciwgd2hpY2ggaXMgd2hlcmUgd2Ugd2FudCBpdC4gICovCi0KLSAgaWYgKHNpemVvZiAoYmZkX3ZtYSkgPiBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgICBib29sZWFuIG5lZzsKLSAgICAgIGludCBiYXNlOwotICAgICAgYmZkX3ZtYSBvdmVyLCBsYXN0ZGlnOwotICAgICAgYm9vbGVhbiBvdmVyZmxvdzsKLSAgICAgIGJmZF92bWEgdjsKLQotICAgICAgLyogT3VyIG93biB2ZXJzaW9uIG9mIHN0cnRvdWwsIGZvciBhIGJmZF92bWEuICAqLwotCi0gICAgICBwID0gb3JpZzsKLQotICAgICAgbmVnID0gZmFsc2U7Ci0gICAgICBpZiAoKnAgPT0gJysnKQotCSsrcDsKLSAgICAgIGVsc2UgaWYgKCpwID09ICctJykKLQl7Ci0JICBuZWcgPSB0cnVlOwotCSAgKytwOwotCX0KLQotICAgICAgYmFzZSA9IDEwOwotICAgICAgaWYgKCpwID09ICcwJykKLQl7Ci0JICBpZiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcpCi0JICAgIHsKLQkgICAgICBiYXNlID0gMTY7Ci0JICAgICAgcCArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiYXNlID0gODsKLQkgICAgICArK3A7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIG92ZXIgPSAoKGJmZF92bWEpIChiZmRfc2lnbmVkX3ZtYSkgLTEpIC8gKGJmZF92bWEpIGJhc2U7Ci0gICAgICBsYXN0ZGlnID0gKChiZmRfdm1hKSAoYmZkX3NpZ25lZF92bWEpIC0xKSAlIChiZmRfdm1hKSBiYXNlOwotCi0gICAgICBvdmVyZmxvdyA9IGZhbHNlOwotICAgICAgdiA9IDA7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpbnQgZDsKLQotCSAgZCA9ICpwKys7Ci0JICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGQpKQotCSAgICBkIC09ICcwJzsKLQkgIGVsc2UgaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBkKSkKLQkgICAgZCAtPSAnQSc7Ci0JICBlbHNlIGlmIChpc2xvd2VyICgodW5zaWduZWQgY2hhcikgZCkpCi0JICAgIGQgLT0gJ2EnOwotCSAgZWxzZQotCSAgICBicmVhazsKLQotCSAgaWYgKGQgPj0gYmFzZSkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmICh2ID4gb3ZlciB8fCAodiA9PSBvdmVyICYmIChiZmRfdm1hKSBkID4gbGFzdGRpZykpCi0JICAgIHsKLQkgICAgICBvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIG92ZXJmbG93KQotCXsKLQkgIGlmIChuZWcpCi0JICAgIHYgPSAtIHY7Ci0JICByZXR1cm4gdjsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGdldCBoZXJlLCB0aGUgbnVtYmVyIGlzIHRvbyBsYXJnZSB0byByZXByZXNlbnQgaW4gYQotICAgICBiZmRfdm1hLiAgKi8KLQotICBpZiAocG92ZXJmbG93ICE9IE5VTEwpCi0gICAgKnBvdmVyZmxvdyA9IHRydWU7Ci0gIGVsc2UKLSAgICB3YXJuX3N0YWIgKG9yaWcsIF8oIm51bWVyaWMgb3ZlcmZsb3ciKSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEdpdmUgYW4gZXJyb3IgZm9yIGEgYmFkIHN0YWIgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWJhZF9zdGFiIChwKQotICAgICBjb25zdCBjaGFyICpwOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oIkJhZCBzdGFiOiAlc1xuIiksIHApOwotfQotCi0vKiBXYXJuIGFib3V0IHNvbWV0aGluZyBpbiBhIHN0YWIgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXdhcm5fc3RhYiAocCwgZXJyKQotICAgICBjb25zdCBjaGFyICpwOwotICAgICBjb25zdCBjaGFyICplcnI7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiV2FybmluZzogJXM6ICVzXG4iKSwgZXJyLCBwKTsKLX0KLQotLyogQ3JlYXRlIGEgaGFuZGxlIHRvIHBhcnNlIHN0YWJzIHN5bWJvbHMgd2l0aC4gICovCi0KLS8qQVJHU1VTRUQqLwotUFRSCi1zdGFydF9zdGFiIChkaGFuZGxlLCBhYmZkLCBzZWN0aW9ucywgc3ltcywgc3ltY291bnQpCi0gICAgIFBUUiBkaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBzZWN0aW9uczsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci17Ci0gIHN0cnVjdCBzdGFiX2hhbmRsZSAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpyZXQpOwotICBtZW1zZXQgKHJldCwgMCwgc2l6ZW9mICpyZXQpOwotICByZXQtPmFiZmQgPSBhYmZkOwotICByZXQtPnNlY3Rpb25zID0gc2VjdGlvbnM7Ci0gIHJldC0+c3ltcyA9IHN5bXM7Ci0gIHJldC0+c3ltY291bnQgPSBzeW1jb3VudDsKLSAgcmV0LT5maWxlcyA9IDE7Ci0gIHJldC0+ZmlsZV90eXBlcyA9IChzdHJ1Y3Qgc3RhYl90eXBlcyAqKikgeG1hbGxvYyAoc2l6ZW9mICpyZXQtPmZpbGVfdHlwZXMpOwotICByZXQtPmZpbGVfdHlwZXNbMF0gPSBOVUxMOwotICByZXQtPmZ1bmN0aW9uX2VuZCA9IChiZmRfdm1hKSAtMTsKLSAgcmV0dXJuIChQVFIpIHJldDsKLX0KLQotLyogV2hlbiB3ZSBoYXZlIHByb2Nlc3NlZCBhbGwgdGhlIHN0YWJzIGluZm9ybWF0aW9uLCB3ZSBuZWVkIHRvIGdvCi0gICB0aHJvdWdoIGFuZCBmaWxsIGluIGFsbCB0aGUgdW5kZWZpbmVkIHRhZ3MuICAqLwotCi1ib29sZWFuCi1maW5pc2hfc3RhYiAoZGhhbmRsZSwgaGFuZGxlKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgUFRSIGhhbmRsZTsKLXsKLSAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBzdGFiX3RhZyAqc3Q7Ci0KLSAgaWYgKGluZm8tPndpdGhpbl9mdW5jdGlvbikKLSAgICB7Ci0gICAgICBpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQotCSAgfHwgISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGRoYW5kbGUsIGluZm8tPmZ1bmN0aW9uX2VuZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+d2l0aGluX2Z1bmN0aW9uID0gZmFsc2U7Ci0gICAgICBpbmZvLT5mdW5jdGlvbl9lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0gICAgfQotCi0gIGZvciAoc3QgPSBpbmZvLT50YWdzOyBzdCAhPSBOVUxMOyBzdCA9IHN0LT5uZXh0KQotICAgIHsKLSAgICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci0KLSAgICAgIGtpbmQgPSBzdC0+a2luZDsKLSAgICAgIGlmIChraW5kID09IERFQlVHX0tJTkRfSUxMRUdBTCkKLQlraW5kID0gREVCVUdfS0lORF9TVFJVQ1Q7Ci0gICAgICBzdC0+c2xvdCA9IGRlYnVnX21ha2VfdW5kZWZpbmVkX3RhZ2dlZF90eXBlIChkaGFuZGxlLCBzdC0+bmFtZSwga2luZCk7Ci0gICAgICBpZiAoc3QtPnNsb3QgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhIHNpbmdsZSBzdGFicyBzeW1ib2wuICAqLwotCi1ib29sZWFuCi1wYXJzZV9zdGFiIChkaGFuZGxlLCBoYW5kbGUsIHR5cGUsIGRlc2MsIHZhbHVlLCBzdHJpbmcpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBQVFIgaGFuZGxlOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGRlc2M7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX2hhbmRsZSAqKSBoYW5kbGU7Ci0KLSAgLyogZ2NjIHdpbGwgZW1pdCB0d28gTl9TTyBzdHJpbmdzIHBlciBjb21waWxhdGlvbiB1bml0LCBvbmUgZm9yIHRoZQotICAgICBkaXJlY3RvcnkgbmFtZSBhbmQgb25lIGZvciB0aGUgZmlsZSBuYW1lLiAgV2UganVzdCBjb2xsZWN0IE5fU08KLSAgICAgc3RyaW5ncyBhcyB3ZSBzZWUgdGhlbSwgYW5kIHN0YXJ0IHRoZSBuZXcgY29tcGlsYXRpb24gdW5pdCB3aGVuCi0gICAgIHdlIHNlZSBhIG5vbiBOX1NPIHN5bWJvbC4gICovCi0gIGlmIChpbmZvLT5zb19zdHJpbmcgIT0gTlVMTAotICAgICAgJiYgKHR5cGUgIT0gTl9TTyB8fCAqc3RyaW5nID09ICdcMCcgfHwgdmFsdWUgIT0gaW5mby0+c29fdmFsdWUpKQotICAgIHsKLSAgICAgIGlmICghIGRlYnVnX3NldF9maWxlbmFtZSAoZGhhbmRsZSwgaW5mby0+c29fc3RyaW5nKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT5tYWluX2ZpbGVuYW1lID0gaW5mby0+c29fc3RyaW5nOwotCi0gICAgICBpbmZvLT5nY2NfY29tcGlsZWQgPSAwOwotICAgICAgaW5mby0+bl9vcHRfZm91bmQgPSBmYWxzZTsKLQotICAgICAgLyogR2VuZXJhbGx5LCBmb3Igc3RhYnMgaW4gdGhlIHN5bWJvbCB0YWJsZSwgdGhlIE5fTEJSQUMgYW5kCi0JIE5fUkJSQUMgc3ltYm9scyBhcmUgcmVsYXRpdmUgdG8gdGhlIE5fU08gc3ltYm9sIHZhbHVlLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNlY3Rpb25zKQotCWluZm8tPmZpbGVfc3RhcnRfb2Zmc2V0ID0gaW5mby0+c29fdmFsdWU7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gcmVzZXQgdGhlIG1hcHBpbmcgZnJvbSB0eXBlIG51bWJlcnMgdG8gdHlwZXMuICBXZQotCSBjYW4ndCBmcmVlIHRoZSBvbGQgbWFwcGluZywgYmVjYXVzZSBvZiB0aGUgdXNlIG9mCi0JIGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZS4gICovCi0gICAgICBpbmZvLT5maWxlcyA9IDE7Ci0gICAgICBpbmZvLT5maWxlX3R5cGVzID0gKChzdHJ1Y3Qgc3RhYl90eXBlcyAqKikKLQkJCSAgeG1hbGxvYyAoc2l6ZW9mICppbmZvLT5maWxlX3R5cGVzKSk7Ci0gICAgICBpbmZvLT5maWxlX3R5cGVzWzBdID0gTlVMTDsKLQotICAgICAgaW5mby0+c29fc3RyaW5nID0gTlVMTDsKLQotICAgICAgLyogTm93IHByb2Nlc3Mgd2hhdGV2ZXIgdHlwZSB3ZSBqdXN0IGdvdC4gICovCi0gICAgfQotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBOX0ZOOgotICAgIGNhc2UgTl9GTl9TRVE6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9MQlJBQzoKLSAgICAgIC8qIElnbm9yZSBleHRyYSBvdXRlcm1vc3QgY29udGV4dCBmcm9tIFN1blBSTyBjYyBhbmQgYWNjLiAgKi8KLSAgICAgIGlmIChpbmZvLT5uX29wdF9mb3VuZCAmJiBkZXNjID09IDEpCi0JYnJlYWs7Ci0KLSAgICAgIGlmICghIGluZm8tPndpdGhpbl9mdW5jdGlvbikKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIk5fTEJSQUMgbm90IHdpdGhpbiBmdW5jdGlvblxuIikpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogU3RhcnQgYW4gaW5uZXIgbGV4aWNhbCBibG9jay4gICovCi0gICAgICBpZiAoISBkZWJ1Z19zdGFydF9ibG9jayAoZGhhbmRsZSwKLQkJCSAgICAgICAodmFsdWUKLQkJCQkrIGluZm8tPmZpbGVfc3RhcnRfb2Zmc2V0Ci0JCQkJKyBpbmZvLT5mdW5jdGlvbl9zdGFydF9vZmZzZXQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEVtaXQgYW55IHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMuICAqLwotICAgICAgaWYgKCEgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyAoZGhhbmRsZSwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICArK2luZm8tPmJsb2NrX2RlcHRoOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fUkJSQUM6Ci0gICAgICAvKiBJZ25vcmUgZXh0cmEgb3V0ZXJtb3N0IGNvbnRleHQgZnJvbSBTdW5QUk8gY2MgYW5kIGFjYy4gICovCi0gICAgICBpZiAoaW5mby0+bl9vcHRfZm91bmQgJiYgZGVzYyA9PSAxKQotCWJyZWFrOwotCi0gICAgICAvKiBXZSBzaG91bGRuJ3QgaGF2ZSBhbnkgcGVuZGluZyB2YXJpYWJsZSBkZWZpbml0aW9ucyBoZXJlLCBidXQsCi0gICAgICAgICBpZiB3ZSBkbywgd2UgcHJvYmFibHkgbmVlZCB0byBlbWl0IHRoZW0gYmVmb3JlIGNsb3NpbmcgdGhlCi0gICAgICAgICBibG9jay4gICovCi0gICAgICBpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEVuZCBhbiBpbm5lciBsZXhpY2FsIGJsb2NrLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX2VuZF9ibG9jayAoZGhhbmRsZSwKLQkJCSAgICAgKHZhbHVlCi0JCQkgICAgICArIGluZm8tPmZpbGVfc3RhcnRfb2Zmc2V0Ci0JCQkgICAgICArIGluZm8tPmZ1bmN0aW9uX3N0YXJ0X29mZnNldCkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLS1pbmZvLT5ibG9ja19kZXB0aDsKLSAgICAgIGlmIChpbmZvLT5ibG9ja19kZXB0aCA8IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJUb28gbWFueSBOX1JCUkFDc1xuIikpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1NPOgotICAgICAgLyogVGhpcyBhbHdheXMgZW5kcyBhIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT53aXRoaW5fZnVuY3Rpb24pCi0JewotCSAgYmZkX3ZtYSBlbmR2YWw7Ci0KLQkgIGVuZHZhbCA9IHZhbHVlOwotCSAgaWYgKCpzdHJpbmcgIT0gJ1wwJwotCSAgICAgICYmIGluZm8tPmZ1bmN0aW9uX2VuZCAhPSAoYmZkX3ZtYSkgLTEKLQkgICAgICAmJiBpbmZvLT5mdW5jdGlvbl9lbmQgPCBlbmR2YWwpCi0JICAgIGVuZHZhbCA9IGluZm8tPmZ1bmN0aW9uX2VuZDsKLQkgIGlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pCi0JICAgICAgfHwgISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGRoYW5kbGUsIGVuZHZhbCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGluZm8tPndpdGhpbl9mdW5jdGlvbiA9IGZhbHNlOwotCSAgaW5mby0+ZnVuY3Rpb25fZW5kID0gKGJmZF92bWEpIC0xOwotCX0KLQotICAgICAgLyogQW4gZW1wdHkgc3RyaW5nIGlzIGVtaXR0ZWQgYnkgZ2NjIGF0IHRoZSBlbmQgb2YgYSBjb21waWxhdGlvbgotICAgICAgICAgdW5pdC4gICovCi0gICAgICBpZiAoKnN0cmluZyA9PSAnXDAnKQotCXJldHVybiB0cnVlOwotCi0gICAgICAvKiBKdXN0IGFjY3VtdWxhdGUgc3RyaW5ncyB1bnRpbCB3ZSBzZWUgYSBub24gTl9TTyBzeW1ib2wuICBJZgotICAgICAgICAgdGhlIHN0cmluZyBzdGFydHMgd2l0aCBhIGRpcmVjdG9yeSBzZXBhcmF0b3Igb3Igc29tZSBvdGhlcgotCSBmb3JtIG9mIGFic29sdXRlIHBhdGggc3BlY2lmaWNhdGlvbiwgd2UgZGlzY2FyZCB0aGUgcHJldmlvdXNseQotICAgICAgICAgYWNjdW11bGF0ZWQgc3RyaW5ncy4gICovCi0gICAgICBpZiAoaW5mby0+c29fc3RyaW5nID09IE5VTEwpCi0JaW5mby0+c29fc3RyaW5nID0geHN0cmR1cCAoc3RyaW5nKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpmOwotCi0JICBmID0gaW5mby0+c29fc3RyaW5nOwotCi0JICBpZiAoICAgKHN0cmluZ1swXSA9PSAnLycpCi0JICAgICAgfHwgKHN0cmluZ1swXSA9PSBESVJfU0VQQVJBVE9SKQotCSAgICAgIHx8ICggICAoRElSX1NFUEFSQVRPUiA9PSAnXFwnKQotCQkgICYmIChzdHJpbmdbMV0gPT0gJzonKQotCQkgICYmICggICAoc3RyaW5nWzJdID09IERJUl9TRVBBUkFUT1IpCi0JCSAgICAgIHx8IChzdHJpbmdbMl0gPT0gJy8nKSkpKQotCSAgICBpbmZvLT5zb19zdHJpbmcgPSB4c3RyZHVwIChzdHJpbmcpOwotCSAgZWxzZQotCSAgICBpbmZvLT5zb19zdHJpbmcgPSBjb25jYXQgKGluZm8tPnNvX3N0cmluZywgc3RyaW5nLAotCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwpOwotCSAgZnJlZSAoZik7Ci0JfQotCi0gICAgICBpbmZvLT5zb192YWx1ZSA9IHZhbHVlOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9TT0w6Ci0gICAgICAvKiBTdGFydCBhbiBpbmNsdWRlIGZpbGUuICAqLwotICAgICAgaWYgKCEgZGVidWdfc3RhcnRfc291cmNlIChkaGFuZGxlLCBzdHJpbmcpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0JJTkNMOgotICAgICAgLyogU3RhcnQgYW4gaW5jbHVkZSBmaWxlIHdoaWNoIG1heSBiZSByZXBsYWNlZC4gICovCi0gICAgICBwdXNoX2JpbmNsIChpbmZvLCBzdHJpbmcsIHZhbHVlKTsKLSAgICAgIGlmICghIGRlYnVnX3N0YXJ0X3NvdXJjZSAoZGhhbmRsZSwgc3RyaW5nKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9FSU5DTDoKLSAgICAgIC8qIEVuZCBhbiBOX0JJTkNMIGluY2x1ZGUuICAqLwotICAgICAgaWYgKCEgZGVidWdfc3RhcnRfc291cmNlIChkaGFuZGxlLCBwb3BfYmluY2wgKGluZm8pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9FWENMOgotICAgICAgLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSBvZiBhIGhlYWRlciBmaWxlIG5hbWVkIGJ5IE5fQklOQ0wgd2hpY2gKLSAgICAgICAgIHdhcyBlbGltaW5hdGVkIGJ5IHRoZSBsaW5rZXIuICAqLwotICAgICAgaWYgKCEgZmluZF9leGNsIChpbmZvLCBzdHJpbmcsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9TTElORToKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9saW5lIChkaGFuZGxlLCBkZXNjLAotCQkJICAgICAgIHZhbHVlICsgaW5mby0+ZnVuY3Rpb25fc3RhcnRfb2Zmc2V0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9CQ09NTToKLSAgICAgIGlmICghIGRlYnVnX3N0YXJ0X2NvbW1vbl9ibG9jayAoZGhhbmRsZSwgc3RyaW5nKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9FQ09NTToKLSAgICAgIGlmICghIGRlYnVnX2VuZF9jb21tb25fYmxvY2sgKGRoYW5kbGUsIHN0cmluZykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fRlVOOgotICAgICAgaWYgKCpzdHJpbmcgPT0gJ1wwJykKLQl7Ci0JICBpZiAoaW5mby0+d2l0aGluX2Z1bmN0aW9uKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBhbHdheXMgbWFya3MgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uOyB3ZSBkb24ndAotICAgICAgICAgICAgICAgICBuZWVkIHRvIHdvcnJ5IGFib3V0IGluZm8tPmZ1bmN0aW9uX2VuZC4gICovCi0JICAgICAgaWYgKGluZm8tPnNlY3Rpb25zKQotCQl2YWx1ZSArPSBpbmZvLT5mdW5jdGlvbl9zdGFydF9vZmZzZXQ7Ci0JICAgICAgaWYgKCEgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyAoZGhhbmRsZSwgaW5mbykKLQkJICB8fCAhIGRlYnVnX2VuZF9mdW5jdGlvbiAoZGhhbmRsZSwgdmFsdWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaW5mby0+d2l0aGluX2Z1bmN0aW9uID0gZmFsc2U7Ci0JICAgICAgaW5mby0+ZnVuY3Rpb25fZW5kID0gKGJmZF92bWEpIC0xOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEEgY29uc3Qgc3RhdGljIHN5bWJvbCBpbiB0aGUgLnRleHQgc2VjdGlvbiB3aWxsIGhhdmUgYW4gTl9GVU4KLSAgICAgICAgIGVudHJ5LiAgV2UgbmVlZCB0byB1c2UgdGhlc2UgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiwKLSAgICAgICAgIGluIGNhc2Ugd2UgYXJlIGxvb2tpbmcgYXQgZ2NjIG91dHB1dCBiZWZvcmUgaXQgd2FzIGNoYW5nZWQgdG8KLSAgICAgICAgIGFsd2F5cyBlbWl0IGFuIGVtcHR5IE5fRlVOLiAgV2UgY2FuJ3QgY2FsbCBkZWJ1Z19lbmRfZnVuY3Rpb24KLSAgICAgICAgIGhlcmUsIGJlY2F1c2UgaXQgbWlnaHQgYmUgYSBsb2NhbCBzdGF0aWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChpbmZvLT53aXRoaW5fZnVuY3Rpb24KLQkgICYmIChpbmZvLT5mdW5jdGlvbl9lbmQgPT0gKGJmZF92bWEpIC0xCi0JICAgICAgfHwgdmFsdWUgPCBpbmZvLT5mdW5jdGlvbl9lbmQpKQotCWluZm8tPmZ1bmN0aW9uX2VuZCA9IHZhbHVlOwotCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgICAgLyogRklYTUU6IGdkYiBjaGVja3MgdGhlIHN0cmluZyBmb3IgTl9TVFNZTSwgTl9MQ1NZTSBvciBOX1JPU1lNCi0gICAgICAgICBzeW1ib2xzLCBhbmQgaWYgaXQgZG9lcyBub3Qgc3RhcnQgd2l0aCA6UywgZ2RiIHJlbG9jYXRlcyB0aGUKLSAgICAgICAgIHZhbHVlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbi4gIGdjYyBhbHdheXMgc2VlbXMgdG8gdXNlCi0gICAgICAgICA6Uywgc28gd2UgZG9uJ3Qgd29ycnkgYWJvdXQgdGhpcy4gICovCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqY29sb247Ci0KLQljb2xvbiA9IHN0cmNociAoc3RyaW5nLCAnOicpOwotCWlmIChjb2xvbiAhPSBOVUxMCi0JICAgICYmIChjb2xvblsxXSA9PSAnZicgfHwgY29sb25bMV0gPT0gJ0YnKSkKLQkgIHsKLQkgICAgaWYgKGluZm8tPndpdGhpbl9mdW5jdGlvbikKLQkgICAgICB7Ci0JCWJmZF92bWEgZW5kdmFsOwotCi0JCWVuZHZhbCA9IHZhbHVlOwotCQlpZiAoaW5mby0+ZnVuY3Rpb25fZW5kICE9IChiZmRfdm1hKSAtMQotCQkgICAgJiYgaW5mby0+ZnVuY3Rpb25fZW5kIDwgZW5kdmFsKQotCQkgIGVuZHZhbCA9IGluZm8tPmZ1bmN0aW9uX2VuZDsKLQkJaWYgKCEgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyAoZGhhbmRsZSwgaW5mbykKLQkJICAgIHx8ICEgZGVidWdfZW5kX2Z1bmN0aW9uIChkaGFuZGxlLCBlbmR2YWwpKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaW5mby0+ZnVuY3Rpb25fZW5kID0gKGJmZF92bWEpIC0xOwotCSAgICAgIH0KLQkgICAgLyogRm9yIHN0YWJzIGluIHNlY3Rpb25zLCBsaW5lIG51bWJlcnMgYW5kIGJsb2NrIGFkZHJlc3NlcwotICAgICAgICAgICAgICAgYXJlIG9mZnNldHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgICAgaWYgKGluZm8tPnNlY3Rpb25zKQotCSAgICAgIGluZm8tPmZ1bmN0aW9uX3N0YXJ0X29mZnNldCA9IHZhbHVlOwotCSAgICBpbmZvLT53aXRoaW5fZnVuY3Rpb24gPSB0cnVlOwotCSAgfQotCi0JaWYgKCEgcGFyc2Vfc3RhYl9zdHJpbmcgKGRoYW5kbGUsIGluZm8sIHR5cGUsIGRlc2MsIHZhbHVlLCBzdHJpbmcpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fT1BUOgotICAgICAgaWYgKHN0cmluZyAhPSBOVUxMICYmIHN0cmNtcCAoc3RyaW5nLCAiZ2NjMl9jb21waWxlZC4iKSA9PSAwKQotCWluZm8tPmdjY19jb21waWxlZCA9IDI7Ci0gICAgICBlbHNlIGlmIChzdHJpbmcgIT0gTlVMTCAmJiBzdHJjbXAgKHN0cmluZywgImdjY19jb21waWxlZC4iKSA9PSAwKQotCWluZm8tPmdjY19jb21waWxlZCA9IDE7Ci0gICAgICBlbHNlCi0JaW5mby0+bl9vcHRfZm91bmQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fT0JKOgotICAgIGNhc2UgTl9FTkRNOgotICAgIGNhc2UgTl9NQUlOOgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSB0aGUgc3RhYnMgc3RyaW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX3N0YWJfc3RyaW5nIChkaGFuZGxlLCBpbmZvLCBzdGFidHlwZSwgZGVzYywgdmFsdWUsIHN0cmluZykKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgaW50IHN0YWJ0eXBlOwotICAgICBpbnQgZGVzYzsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBjb25zdCBjaGFyICpwOwotICBjaGFyICpuYW1lOwotICBpbnQgdHlwZTsKLSAgZGVidWdfdHlwZSBkdHlwZTsKLSAgYm9vbGVhbiBzeW5vbnltOwotICBib29sZWFuIHNlbGZfY3Jvc3NyZWY7Ci0gIHVuc2lnbmVkIGludCBsaW5lbm87Ci0gIGRlYnVnX3R5cGUgKnNsb3Q7Ci0KLSAgcCA9IHN0cmNociAoc3RyaW5nLCAnOicpOwotICBpZiAocCA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHdoaWxlIChwWzFdID09ICc6JykKLSAgICB7Ci0gICAgICBwICs9IDI7Ci0gICAgICBwID0gc3RyY2hyIChwLCAnOicpOwotICAgICAgaWYgKHAgPT0gTlVMTCkKLQl7Ci0JICBiYWRfc3RhYiAoc3RyaW5nKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIEdDQyAyLnggcHV0cyB0aGUgbGluZSBudW1iZXIgaW4gZGVzYy4gIFN1bk9TIGFwcGFyZW50bHkgcHV0cyBpbgotICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkIGJ5IGEgdHlwZSBvciBvYmplY3QsIHdoaWNoIHdlCi0gICAgIGlnbm9yZS4gICovCi0gIGlmIChpbmZvLT5nY2NfY29tcGlsZWQgPj0gMikKLSAgICBsaW5lbm8gPSBkZXNjOwotICBlbHNlCi0gICAgbGluZW5vID0gMDsKLQotICAvKiBGSVhNRTogU29tZXRpbWVzIHRoZSBzcGVjaWFsIEMrKyBuYW1lcyBzdGFydCB3aXRoICcuJy4gICovCi0gIG5hbWUgPSBOVUxMOwotICBpZiAoc3RyaW5nWzBdID09ICckJykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHN0cmluZ1sxXSkKLQl7Ci0JY2FzZSAndCc6Ci0JICBuYW1lID0gInRoaXMiOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICAvKiBXYXM6IG5hbWUgPSAidnB0ciI7ICovCi0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIG5hbWUgPSAiZWhfdGhyb3ciOwotCSAgYnJlYWs7Ci0JY2FzZSAnXyc6Ci0JICAvKiBUaGlzIHdhcyBhbiBhbm9ueW1vdXMgdHlwZSB0aGF0IHdhcyBuZXZlciBmaXhlZCB1cC4gICovCi0JICBicmVhazsKLQljYXNlICdYJzoKLQkgIC8qIFN1blBSTyAoMy4wIGF0IGxlYXN0KSBzdGF0aWMgdmFyaWFibGUgZW5jb2RpbmcuICAqLwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHdhcm5fc3RhYiAoc3RyaW5nLCBfKCJ1bmtub3duIEMrKyBlbmNvZGVkIG5hbWUiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKHAgPT0gc3RyaW5nIHx8IChzdHJpbmdbMF0gPT0gJyAnICYmIHAgPT0gc3RyaW5nICsgMSkpCi0JbmFtZSA9IE5VTEw7Ci0gICAgICBlbHNlCi0JbmFtZSA9IHNhdmVzdHJpbmcgKHN0cmluZywgcCAtIHN0cmluZyk7Ci0gICAgfQotCi0gICsrcDsKLSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcCkgfHwgKnAgPT0gJygnIHx8ICpwID09ICctJykKLSAgICB0eXBlID0gJ2wnOwotICBlbHNlCi0gICAgdHlwZSA9ICpwKys7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdjJzoKLSAgICAgIC8qIGMgaXMgYSBzcGVjaWFsIGNhc2UsIG5vdCBmb2xsb3dlZCBieSBhIHR5cGUtbnVtYmVyLgotCSBTWU1CT0w6Yz1pVkFMVUUgZm9yIGFuIGludGVnZXIgY29uc3RhbnQgc3ltYm9sLgotCSBTWU1CT0w6Yz1yVkFMVUUgZm9yIGEgZmxvYXRpbmcgY29uc3RhbnQgc3ltYm9sLgotCSBTWU1CT0w6Yz1lVFlQRSxJTlRWQUxVRSBmb3IgYW4gZW51bSBjb25zdGFudCBzeW1ib2wuCi0JIGUuZy4gImI6Yz1lNiwwIiBmb3IgImNvbnN0IGIgPSBibG9iMSIKLQkgKHdoZXJlIHR5cGUgNiBpcyBkZWZpbmVkIGJ5ICJibG9iczp0Nj1lYmxvYjE6MCxibG9iMjoxLDsiKS4gICovCi0gICAgICBpZiAoKnAgIT0gJz0nKQotCXsKLQkgIGJhZF9zdGFiIChzdHJpbmcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICsrcDsKLSAgICAgIHN3aXRjaCAoKnArKykKLQl7Ci0JY2FzZSAncic6Ci0JICAvKiBGbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCi0JICBpZiAoISBkZWJ1Z19yZWNvcmRfZmxvYXRfY29uc3QgKGRoYW5kbGUsIG5hbWUsIGF0b2YgKHApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICAvKiBJbnRlZ2VyIGNvbnN0YW50LiAgKi8KLQkgIC8qIERlZmluaW5nIGludGVnZXIgY29uc3RhbnRzIHRoaXMgd2F5IGlzIGtpbmQgb2Ygc2lsbHksCi0JICAgICBzaW5jZSAnZScgY29uc3RhbnRzIGFsbG93cyB0aGUgY29tcGlsZXIgdG8gZ2l2ZSBub3Qgb25seQotCSAgICAgdGhlIHZhbHVlLCBidXQgdGhlIHR5cGUgYXMgd2VsbC4gIEMgaGFzIGF0IGxlYXN0IGludCwKLQkgICAgIGxvbmcsIHVuc2lnbmVkIGludCwgYW5kIGxvbmcgbG9uZyBhcyBjb25zdGFudCB0eXBlczsKLQkgICAgIG90aGVyIGxhbmd1YWdlcyBwcm9iYWJseSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB1bnNpZ25lZCBhcwotCSAgICAgd2VsbCBhcyBzaWduZWQgY29uc3RhbnRzLiAgKi8KLQkgIGlmICghIGRlYnVnX3JlY29yZF9pbnRfY29uc3QgKGRoYW5kbGUsIG5hbWUsIGF0b2kgKHApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnZSc6Ci0JICAvKiBTWU1CT0w6Yz1lVFlQRSxJTlRWQUxVRSBmb3IgYSBjb25zdGFudCBzeW1ib2wgd2hvc2UgdmFsdWUKLQkgICAgIGNhbiBiZSByZXByZXNlbnRlZCBhcyBpbnRlZ3JhbC4KLQkgICAgIGUuZy4gImI6Yz1lNiwwIiBmb3IgImNvbnN0IGIgPSBibG9iMSIKLQkgICAgICh3aGVyZSB0eXBlIDYgaXMgZGVmaW5lZCBieSAiYmxvYnM6dDY9ZWJsb2IxOjAsYmxvYjI6MSw7IikuICAqLwotCSAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgJnAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICgqcCAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBiYWRfc3RhYiAoc3RyaW5nKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmICghIGRlYnVnX3JlY29yZF90eXBlZF9jb25zdCAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIGF0b2kgKHApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJhZF9zdGFiIChzdHJpbmcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdDJzoKLSAgICAgIC8qIFRoZSBuYW1lIG9mIGEgY2F1Z2h0IGV4Y2VwdGlvbi4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCSAgICAgICAmcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfbGFiZWwgKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICAgIC8qIEEgZnVuY3Rpb24gZGVmaW5pdGlvbi4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfZnVuY3Rpb24gKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCB0eXBlID09ICdGJywgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU3VuIGFjYyBwdXRzIGRlY2xhcmVkIHR5cGVzIG9mIGFyZ3VtZW50cyBoZXJlLiAgV2UgZG9uJ3QgY2FyZQotCSBhYm91dCB0aGVpciBhY3R1YWwgdHlwZXMgKEZJWE1FIC0tIHdlIHNob3VsZCByZW1lbWJlciB0aGUgd2hvbGUKLQkgZnVuY3Rpb24gcHJvdG90eXBlKSwgYnV0IHRoZSBsaXN0IG1heSBkZWZpbmUgc29tZSBuZXcgdHlwZXMKLQkgdGhhdCB3ZSBoYXZlIHRvIHJlbWVtYmVyLCBzbyB3ZSBtdXN0IHNjYW4gaXQgbm93LiAgKi8KLSAgICAgIHdoaWxlICgqcCA9PSAnOycpCi0JewotCSAgKytwOwotCSAgaWYgKHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpCi0JICAgICAgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgewotCWNoYXIgbGVhZGluZzsKLQlsb25nIGM7Ci0JYXN5bWJvbCAqKnBzOwotCi0JLyogQSBnbG9iYWwgc3ltYm9sLiAgVGhlIHZhbHVlIG11c3QgYmUgZXh0cmFjdGVkIGZyb20gdGhlCi0JICAgc3ltYm9sIHRhYmxlLiAgKi8KLQlkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkJIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQlpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgcmV0dXJuIGZhbHNlOwotCWxlYWRpbmcgPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGluZm8tPmFiZmQpOwotCWZvciAoYyA9IGluZm8tPnN5bWNvdW50LCBwcyA9IGluZm8tPnN5bXM7IGMgPiAwOyAtLWMsICsrcHMpCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm47Ci0KLQkgICAgbiA9IGJmZF9hc3ltYm9sX25hbWUgKCpwcyk7Ci0JICAgIGlmIChsZWFkaW5nICE9ICdcMCcgJiYgKm4gPT0gbGVhZGluZykKLQkgICAgICArK247Ci0JICAgIGlmICgqbiA9PSAqbmFtZSAmJiBzdHJjbXAgKG4sIG5hbWUpID09IDApCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0JaWYgKGMgPiAwKQotCSAgdmFsdWUgPSBiZmRfYXN5bWJvbF92YWx1ZSAoKnBzKTsKLQlpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsIERFQlVHX0dMT0JBTCwKLQkJCQkgICAgdmFsdWUpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFRoaXMgY2FzZSBpcyBmYWtlZCBieSBhIGNvbmRpdGlvbmFsIGFib3ZlLCB3aGVuIHRoZXJlIGlzIG5vCi0JIGNvZGUgbGV0dGVyIGluIHRoZSBkYnggZGF0YS4gIERieCBkYXRhIG5ldmVyIGFjdHVhbGx5Ci0JIGNvbnRhaW5zICdsJy4gICovCi0gICAgY2FzZSAnbCc6Ci0gICAgY2FzZSAncyc6Ci0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsIERFQlVHX0xPQ0FMLAotCQkJCSAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgICAvKiBBIGZ1bmN0aW9uIHBhcmFtZXRlci4gICovCi0gICAgICBpZiAoKnAgIT0gJ0YnKQotCWR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCQkgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgZWxzZQotCXsKLQkvKiBwRiBpcyBhIHR3by1sZXR0ZXIgY29kZSB0aGF0IG1lYW5zIGEgZnVuY3Rpb24gcGFyYW1ldGVyIGluCi0JICAgRm9ydHJhbi4gIFRoZSB0eXBlLW51bWJlciBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIHJldHVybgotCSAgIHZhbHVlLiAgVHJhbnNsYXRlIGl0IGludG8gYSBwb2ludGVyLXRvLWZ1bmN0aW9uIHR5cGUuICAqLwotCSAgKytwOwotCSAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJCSAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgIGlmIChkdHlwZSAhPSBERUJVR19UWVBFX05VTEwpCi0JICAgIHsKLQkgICAgICBkZWJ1Z190eXBlIGZ0eXBlOwotCi0JICAgICAgZnR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGRoYW5kbGUsIGR0eXBlLAotCQkJCQkJKGRlYnVnX3R5cGUgKikgTlVMTCwgZmFsc2UpOwotCSAgICAgIGR0eXBlID0gZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKGRoYW5kbGUsIGZ0eXBlKTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIERFQlVHX1BBUk1fU1RBQ0ssCi0JCQkJICAgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEZJWE1FOiBBdCB0aGlzIHBvaW50IGdkYiBjb25zaWRlcnMgcmVhcnJhbmdpbmcgdGhlIHBhcmFtZXRlcgotCSBhZGRyZXNzIG9uIGEgYmlnIGVuZGlhbiBtYWNoaW5lIGlmIGl0IGlzIHNtYWxsZXIgdGhhbiBhbiBpbnQuCi0JIFdlIGhhdmUgbm8gd2F5IHRvIGRvIHRoYXQsIHNpbmNlIHdlIGRvbid0IHJlYWxseSBrbm93IG11Y2gKLQkgYWJvdXQgdGhlIHRhcmdldC4gICovCi0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUCc6Ci0gICAgICBpZiAoc3RhYnR5cGUgPT0gTl9GVU4pCi0JewotCSAgLyogUHJvdG90eXBlIG9mIGEgZnVuY3Rpb24gcmVmZXJlbmNlZCBieSB0aGlzIGZpbGUuICAqLwotCSAgd2hpbGUgKCpwID09ICc7JykKLQkgICAgewotCSAgICAgICsrcDsKLQkgICAgICBpZiAocGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCQkgICAoZGVidWdfdHlwZSAqKikgTlVMTCkKLQkJICA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICdSJzoKLSAgICAgIC8qIFBhcmFtZXRlciB3aGljaCBpcyBpbiBhIHJlZ2lzdGVyLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCBERUJVR19QQVJNX1JFRywKLQkJCQkgICAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncic6Ci0gICAgICAvKiBSZWdpc3RlciB2YXJpYWJsZSAoZWl0aGVyIGdsb2JhbCBvciBsb2NhbCkuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsIGR0eXBlLCBERUJVR19SRUdJU1RFUiwKLQkJCQkgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEZJWE1FOiBBdCB0aGlzIHBvaW50IGdkYiBjaGVja3MgdG8gY29tYmluZSBwYWlycyBvZiAncCcgYW5kCi0JICdyJyBzdGFicyBpbnRvIGEgc2luZ2xlICdQJyBzdGFiLiAgKi8KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICAgIC8qIFN0YXRpYyBzeW1ib2wgYXQgdG9wIGxldmVsIG9mIGZpbGUgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwgREVCVUdfU1RBVElDLAotCQkJCSAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgICAvKiBBIHR5cGVkZWYuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsICZwLCAmc2xvdCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JewotCSAgLyogQSBuYW1lbGVzcyB0eXBlLiAgTm90aGluZyB0byBkby4gICovCi0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIGR0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCBkdHlwZSk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHNsb3QgIT0gTlVMTCkKLQkqc2xvdCA9IGR0eXBlOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgLyogU3RydWN0LCB1bmlvbiwgb3IgZW51bSB0YWcuICBGb3IgR05VIEMrKywgdGhpcyBjYW4gYmUgYmUgZm9sbG93ZWQKLQkgYnkgJ3QnIHdoaWNoIG1lYW5zIHdlIGFyZSB0eXBlZGVmJ2luZyBpdCBhcyB3ZWxsLiAgKi8KLSAgICAgIGlmICgqcCAhPSAndCcpCi0JewotCSAgc3lub255bSA9IGZhbHNlOwotCSAgLyogRklYTUU6IGdkYiBzZXRzIHN5bm9ueW0gdG8gdHJ1ZSBpZiB0aGUgY3VycmVudCBsYW5ndWFnZQotICAgICAgICAgICAgIGlzIEMrKy4gICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bm9ueW0gPSB0cnVlOwotCSAgKytwOwotCX0KLQotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsICZwLCAmc2xvdCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIC8qIElORk8tPlNFTEZfQ1JPU1NSRUYgaXMgc2V0IGJ5IHBhcnNlX3N0YWJfdHlwZSBpZiB0aGlzIHR5cGUgaXMKLSAgICAgICAgIGEgY3Jvc3MgcmVmZXJlbmNlIHRvIGl0c2VsZi4gIFRoZXNlIGFyZSBnZW5lcmF0ZWQgYnkgc29tZQotICAgICAgICAgdmVyc2lvbnMgb2YgZysrLiAgKi8KLSAgICAgIHNlbGZfY3Jvc3NyZWYgPSBpbmZvLT5zZWxmX2Nyb3NzcmVmOwotCi0gICAgICBkdHlwZSA9IGRlYnVnX3RhZ190eXBlIChkaGFuZGxlLCBuYW1lLCBkdHlwZSk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChzbG90ICE9IE5VTEwpCi0JKnNsb3QgPSBkdHlwZTsKLQotICAgICAgLyogU2VlIGlmIHdlIGhhdmUgYSBjcm9zcyByZWZlcmVuY2UgdG8gdGhpcyB0YWcgd2hpY2ggd2UgY2FuIG5vdwotICAgICAgICAgZmlsbCBpbi4gIEF2b2lkIGZpbGxpbmcgaW4gYSBjcm9zcyByZWZlcmVuY2UgdG8gb3Vyc2VsdmVzLAotICAgICAgICAgYmVjYXVzZSB0aGF0IHdvdWxkIGxlYWQgdG8gY2lyY3VsYXIgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmICghIHNlbGZfY3Jvc3NyZWYpCi0JewotCSAgcmVnaXN0ZXIgc3RydWN0IHN0YWJfdGFnICoqcHN0OwotCi0JICBmb3IgKHBzdCA9ICZpbmZvLT50YWdzOyAqcHN0ICE9IE5VTEw7IHBzdCA9ICYoKnBzdCktPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoKCpwc3QpLT5uYW1lWzBdID09IG5hbWVbMF0KLQkJICAmJiBzdHJjbXAgKCgqcHN0KS0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJewotCQkgICgqcHN0KS0+c2xvdCA9IGR0eXBlOwotCQkgICpwc3QgPSAoKnBzdCktPm5leHQ7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHN5bm9ueW0pCi0JewotCSAgZHR5cGUgPSBkZWJ1Z19uYW1lX3R5cGUgKGRoYW5kbGUsIG5hbWUsIGR0eXBlKTsKLQkgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKHNsb3QgIT0gTlVMTCkKLQkgICAgKnNsb3QgPSBkdHlwZTsKLQl9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVic6Ci0gICAgICAvKiBTdGF0aWMgc3ltYm9sIG9mIGxvY2FsIHNjb3BlICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBvczlrX3N0YWJzIGhlcmUuICAqLwotICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsIGR0eXBlLAotCQkJCSAgREVCVUdfTE9DQUxfU1RBVElDLCB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd2JzoKLSAgICAgIC8qIFJlZmVyZW5jZSBwYXJhbWV0ZXIuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIERFQlVHX1BBUk1fUkVGRVJFTkNFLAotCQkJCSAgICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdhJzoKLSAgICAgIC8qIFJlZmVyZW5jZSBwYXJhbWV0ZXIgd2hpY2ggaXMgaW4gYSByZWdpc3Rlci4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgREVCVUdfUEFSTV9SRUZfUkVHLAotCQkJCSAgICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdYJzoKLSAgICAgIC8qIFRoaXMgaXMgdXNlZCBieSBTdW4gRk9SVFJBTiBmb3IgImZ1bmN0aW9uIHJlc3VsdCB2YWx1ZSIuCi0JIFN1biBjbGFpbXMgKCJkYnggYW5kIGRieHRvb2wgaW50ZXJmYWNlcyIsIDJuZCBlZCkKLQkgdGhhdCBQYXNjYWwgdXNlcyBpdCB0b28sIGJ1dCB3aGVuIEkgdHJpZWQgaXQgUGFzY2FsIHVzZWQKLQkgIng6MyIgKGxvY2FsIHN5bWJvbCkgaW5zdGVhZC4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsIERFQlVHX0xPQ0FMLAotCQkJCSAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJhZF9zdGFiIChzdHJpbmcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBGSVhNRTogZ2RiIGNvbnZlcnRzIHN0cnVjdHVyZSB2YWx1ZXMgdG8gc3RydWN0dXJlIHBvaW50ZXJzIGluIGEKLSAgICAgY291cGxlIG9mIGNhc2VzLCBkZXBlbmRpbmcgdXBvbiB0aGUgdGFyZ2V0LiAgKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgYSBzdGFicyB0eXBlLiAgVGhlIHR5cGVuYW1lIGFyZ3VtZW50IGlzIG5vbi1OVUxMIGlmIHRoaXMgaXMgYQotICAgdHlwZWRlZiBvciBhIHRhZyBkZWZpbml0aW9uLiAgVGhlIHBwIGFyZ3VtZW50IHBvaW50cyB0byB0aGUgc3RhYgotICAgc3RyaW5nLCBhbmQgaXMgdXBkYXRlZC4gIFRoZSBzbG90cCBhcmd1bWVudCBwb2ludHMgdG8gYSBwbGFjZSB0bwotICAgc3RvcmUgdGhlIHNsb3QgdXNlZCBpZiB0aGUgdHlwZSBpcyBiZWluZyBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW5hbWUsIHBwLCBzbG90cCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqdHlwZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqKnNsb3RwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBpbnQgdHlwZW51bXNbMl07Ci0gIGludCBzaXplOwotICBib29sZWFuIHN0cmluZ3A7Ci0gIGludCBkZXNjcmlwdG9yOwotICBkZWJ1Z190eXBlIGR0eXBlOwotCi0gIGlmIChzbG90cCAhPSBOVUxMKQotICAgICpzbG90cCA9IE5VTEw7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBzaXplID0gLTE7Ci0gIHN0cmluZ3AgPSBmYWxzZTsKLQotICBpbmZvLT5zZWxmX2Nyb3NzcmVmID0gZmFsc2U7Ci0KLSAgLyogUmVhZCB0eXBlIG51bWJlciBpZiBwcmVzZW50LiAgVGhlIHR5cGUgbnVtYmVyIG1heSBiZSBvbWl0dGVkLgotICAgICBmb3IgaW5zdGFuY2UgaW4gYSB0d28tZGltZW5zaW9uYWwgYXJyYXkgZGVjbGFyZWQgd2l0aCB0eXBlCi0gICAgICJhcjE7MTsxMDthcjE7MTsxMDs0Ii4gICovCi0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSAmJiAqKnBwICE9ICcoJyAmJiAqKnBwICE9ICctJykKLSAgICB7Ci0gICAgICAvKiAndHlwZW51bXM9JyBub3QgcHJlc2VudCwgdHlwZSBpcyBhbm9ueW1vdXMuICBSZWFkIGFuZCByZXR1cm4KLQkgdGhlIGRlZmluaXRpb24sIGJ1dCBkb24ndCBwdXQgaXQgaW4gdGhlIHR5cGUgdmVjdG9yLiAgKi8KLSAgICAgIHR5cGVudW1zWzBdID0gdHlwZW51bXNbMV0gPSAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyIChwcCwgdHlwZW51bXMpKQotCXJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgICAgIGlmICgqKnBwICE9ICc9JykKLQl7Ci0JICAvKiBUeXBlIGlzIG5vdCBiZWluZyBkZWZpbmVkIGhlcmUuICBFaXRoZXIgaXQgYWxyZWFkeQotCSAgICAgZXhpc3RzLCBvciB0aGlzIGlzIGEgZm9yd2FyZCByZWZlcmVuY2UgdG8gaXQuICAqLwotCSAgcmV0dXJuIHN0YWJfZmluZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcyk7Ci0JfQotCi0gICAgICAvKiBPbmx5IHNldCB0aGUgc2xvdCBpZiB0aGUgdHlwZSBpcyBiZWluZyBkZWZpbmVkLiAgVGhpcyBtZWFucwotICAgICAgICAgdGhhdCB0aGUgbWFwcGluZyBmcm9tIHR5cGUgbnVtYmVycyB0byB0eXBlcyB3aWxsIG9ubHkgcmVjb3JkCi0gICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdHlwZWRlZiB3aGljaCBkZWZpbmVzIGEgdHlwZS4gIElmIHdlIGRvbid0IGRvCi0gICAgICAgICB0aGlzLCB0aGVuIHNvbWV0aGluZyBsaWtlCi0JICAgICB0eXBlZGVmIGludCBmb287Ci0JICAgICBpbnQgaTsKLQkgd2lsbCByZWNvcmQgdGhhdCBpIGlzIG9mIHR5cGUgZm9vLiAgVW5mb3J0dW5hdGVseSwgc3RhYnMKLQkgaW5mb3JtYXRpb24gaXMgYW1iaWd1b3VzIGFib3V0IHZhcmlhYmxlIHR5cGVzLiAgRm9yIHRoaXMgY29kZSwKLQkgICAgIHR5cGVkZWYgaW50IGZvbzsKLQkgICAgIGludCBpOwotCSAgICAgZm9vIGo7Ci0JIHRoZSBzdGFicyBpbmZvcm1hdGlvbiByZWNvcmRzIGJvdGggaSBhbmQgaiBhcyBoYXZpbmcgdGhlIHNhbWUKLQkgdHlwZS4gIFRoaXMgY291bGQgYmUgZml4ZWQgYnkgcGF0Y2hpbmcgdGhlIGNvbXBpbGVyLiAgKi8KLSAgICAgIGlmIChzbG90cCAhPSBOVUxMICYmIHR5cGVudW1zWzBdID49IDAgJiYgdHlwZW51bXNbMV0gPj0gMCkKLQkqc2xvdHAgPSBzdGFiX2ZpbmRfc2xvdCAoaW5mbywgdHlwZW51bXMpOwotCi0gICAgICAvKiBUeXBlIGlzIGJlaW5nIGRlZmluZWQgaGVyZS4gICovCi0gICAgICAvKiBTa2lwIHRoZSAnPScuICAqLwotICAgICAgKysqcHA7Ci0KLSAgICAgIHdoaWxlICgqKnBwID09ICdAJykKLQl7Ci0JICBjb25zdCBjaGFyICpwID0gKnBwICsgMTsKLQkgIGNvbnN0IGNoYXIgKmF0dHI7Ci0KLQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApIHx8ICpwID09ICcoJyB8fCAqcCA9PSAnLScpCi0JICAgIHsKLQkgICAgICAvKiBNZW1iZXIgdHlwZS4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogVHlwZSBhdHRyaWJ1dGVzLiAgKi8KLQkgIGF0dHIgPSBwOwotCi0JICBmb3IgKDsgKnAgIT0gJzsnOyArK3ApCi0JICAgIHsKLQkgICAgICBpZiAoKnAgPT0gJ1wwJykKLQkJewotCQkgIGJhZF9zdGFiIChvcmlnKTsKLQkJICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCQl9Ci0JICAgIH0KLQkgICpwcCA9IHAgKyAxOwotCi0JICBzd2l0Y2ggKCphdHRyKQotCSAgICB7Ci0JICAgIGNhc2UgJ3MnOgotCSAgICAgIHNpemUgPSBhdG9pIChhdHRyICsgMSk7Ci0JICAgICAgaWYgKHNpemUgPD0gMCkKLQkJc2l6ZSA9IC0xOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1MnOgotCSAgICAgIHN0cmluZ3AgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogSWdub3JlIHVucmVjb2duaXplZCB0eXBlIGF0dHJpYnV0ZXMsIHNvIGZ1dHVyZQotCQkgY29tcGlsZXJzIGNhbiBpbnZlbnQgbmV3IG9uZXMuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBkZXNjcmlwdG9yID0gKipwcDsKLSAgKysqcHA7Ci0KLSAgc3dpdGNoIChkZXNjcmlwdG9yKQotICAgIHsKLSAgICBjYXNlICd4JzoKLSAgICAgIHsKLQllbnVtIGRlYnVnX3R5cGVfa2luZCBjb2RlOwotCWNvbnN0IGNoYXIgKnExLCAqcTIsICpwOwotCi0JLyogQSBjcm9zcyByZWZlcmVuY2UgdG8gYW5vdGhlciB0eXBlLiAgKi8KLQotCXN3aXRjaCAoKipwcCkKLQkgIHsKLQkgIGNhc2UgJ3MnOgotCSAgICBjb2RlID0gREVCVUdfS0lORF9TVFJVQ1Q7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAndSc6Ci0JICAgIGNvZGUgPSBERUJVR19LSU5EX1VOSU9OOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ2UnOgotCSAgICBjb2RlID0gREVCVUdfS0lORF9FTlVNOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIC8qIENvbXBsYWluIGFuZCBrZWVwIGdvaW5nLCBzbyBjb21waWxlcnMgY2FuIGludmVudCBuZXcKLQkgICAgICAgY3Jvc3MtcmVmZXJlbmNlIHR5cGVzLiAgKi8KLQkgICAgd2Fybl9zdGFiIChvcmlnLCBfKCJ1bnJlY29nbml6ZWQgY3Jvc3MgcmVmZXJlbmNlIHR5cGUiKSk7Ci0JICAgIGNvZGUgPSBERUJVR19LSU5EX1NUUlVDVDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JKysqcHA7Ci0KLQlxMSA9IHN0cmNociAoKnBwLCAnPCcpOwotCXAgPSBzdHJjaHIgKCpwcCwgJzonKTsKLQlpZiAocCA9PSBOVUxMKQotCSAgewotCSAgICBiYWRfc3RhYiAob3JpZyk7Ci0JICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICB9Ci0JaWYgKHExICE9IE5VTEwgJiYgcCA+IHExICYmIHBbMV0gPT0gJzonKQotCSAgewotCSAgICBpbnQgbmVzdCA9IDA7Ci0KLQkgICAgZm9yIChxMiA9IHExOyAqcTIgIT0gJ1wwJzsgKytxMikKLQkgICAgICB7Ci0JCWlmICgqcTIgPT0gJzwnKQotCQkgICsrbmVzdDsKLQkJZWxzZSBpZiAoKnEyID09ICc+JykKLQkJICAtLW5lc3Q7Ci0JCWVsc2UgaWYgKCpxMiA9PSAnOicgJiYgbmVzdCA9PSAwKQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgcCA9IHEyOwotCSAgICBpZiAoKnAgIT0gJzonKQotCSAgICAgIHsKLQkJYmFkX3N0YWIgKG9yaWcpOwotCQlyZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICAgIH0KLQkgIH0KLQotCS8qIFNvbWUgdmVyc2lvbnMgb2YgZysrIGNhbiBlbWl0IHN0YWJzIGxpa2UKLQkgICAgICAgZmxlZXA6VDIwPXhzZmxlZXA6Ci0JICAgd2hpY2ggZGVmaW5lIHN0cnVjdHVyZXMgaW4gdGVybXMgb2YgdGhlbXNlbHZlcy4gIFdlIG5lZWQgdG8KLQkgICB0ZWxsIHRoZSBjYWxsZXIgdG8gYXZvaWQgYnVpbGRpbmcgYSBjaXJjdWxhciBzdHJ1Y3R1cmUuICAqLwotCWlmICh0eXBlbmFtZSAhPSBOVUxMCi0JICAgICYmIHN0cm5jbXAgKHR5cGVuYW1lLCAqcHAsIHAgLSAqcHApID09IDAKLQkgICAgJiYgdHlwZW5hbWVbcCAtICpwcF0gPT0gJ1wwJykKLQkgIGluZm8tPnNlbGZfY3Jvc3NyZWYgPSB0cnVlOwotCi0JZHR5cGUgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKGRoYW5kbGUsIGluZm8sICpwcCwgcCAtICpwcCwgY29kZSk7Ci0KLQkqcHAgPSBwICsgMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLSc6Ci0gICAgY2FzZSAnMCc6Ci0gICAgY2FzZSAnMSc6Ci0gICAgY2FzZSAnMic6Ci0gICAgY2FzZSAnMyc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnNyc6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnOSc6Ci0gICAgY2FzZSAnKCc6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqaG9sZDsKLQlpbnQgeHR5cGVudW1zWzJdOwotCi0JLyogVGhpcyB0eXBlIGlzIGRlZmluZWQgYXMgYW5vdGhlciB0eXBlLiAgKi8KLQotCSgqcHApLS07Ci0JaG9sZCA9ICpwcDsKLQotCS8qIFBlZWsgYWhlYWQgYXQgdGhlIG51bWJlciB0byBkZXRlY3Qgdm9pZC4gICovCi0JaWYgKCEgcGFyc2Vfc3RhYl90eXBlX251bWJlciAocHAsIHh0eXBlbnVtcykpCi0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0JaWYgKHR5cGVudW1zWzBdID09IHh0eXBlbnVtc1swXSAmJiB0eXBlbnVtc1sxXSA9PSB4dHlwZW51bXNbMV0pCi0JICB7Ci0JICAgIC8qIFRoaXMgdHlwZSBpcyBiZWluZyBkZWZpbmVkIGFzIGl0c2VsZiwgd2hpY2ggbWVhbnMgdGhhdAotICAgICAgICAgICAgICAgaXQgaXMgdm9pZC4gICovCi0JICAgIGR0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgKnBwID0gaG9sZDsKLQotCSAgICAvKiBHbyBiYWNrIHRvIHRoZSBudW1iZXIgYW5kIGhhdmUgcGFyc2Vfc3RhYl90eXBlIGdldCBpdC4KLQkgICAgICAgVGhpcyBtZWFucyB0aGF0IHdlIGNhbiBkZWFsIHdpdGggc29tZXRoaW5nIGxpa2UKLQkgICAgICAgdCgxLDIpPSgzLDQpPS4uLiB3aGljaCB0aGUgTHVjaWQgY29tcGlsZXIgdXNlcy4gICovCi0JICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICAgcHAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgfQotCi0JaWYgKHR5cGVudW1zWzBdICE9IC0xKQotCSAgewotCSAgICBpZiAoISBzdGFiX3JlY29yZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcywgZHR5cGUpKQotCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICB9Ci0KLQlicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgJyonOgotICAgICAgZHR5cGUgPSBkZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgICAgcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLAotCQkJCQkJCShjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkJcHAsCi0JCQkJCQkJKGRlYnVnX3R5cGUgKiopIE5VTEwpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnJic6Ci0gICAgICAvKiBSZWZlcmVuY2UgdG8gYW5vdGhlciB0eXBlLiAgKi8KLSAgICAgIGR0eXBlID0gKGRlYnVnX21ha2VfcmVmZXJlbmNlX3R5cGUKLQkgICAgICAgKGRoYW5kbGUsCi0JCXBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkJIChkZWJ1Z190eXBlICoqKSBOVUxMKSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdmJzoKLSAgICAgIC8qIEZ1bmN0aW9uIHJldHVybmluZyBhbm90aGVyIHR5cGUuICAqLwotICAgICAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KLSAgICAgIGR0eXBlID0gKGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZQotCSAgICAgICAoZGhhbmRsZSwKLQkJcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgKGRlYnVnX3R5cGUgKiopIE5VTEwpLAotCQkoZGVidWdfdHlwZSAqKSBOVUxMLCBmYWxzZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdrJzoKLSAgICAgIC8qIENvbnN0IHF1YWxpZmllciBvbiBzb21lIHR5cGUgKFN1bikuICAqLwotICAgICAgLyogRklYTUU6IGdkYiBhY2NlcHRzICdjJyBoZXJlIGlmIG9zOWtfc3RhYnMuICAqLwotICAgICAgZHR5cGUgPSBkZWJ1Z19tYWtlX2NvbnN0X3R5cGUgKGRoYW5kbGUsCi0JCQkJICAgICBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sCi0JCQkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkJICAgICAgcHAsCi0JCQkJCQkgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdCJzoKLSAgICAgIC8qIFZvbGF0aWxlIHF1YWwgb24gc29tZSB0eXBlIChTdW4pLiAgKi8KLSAgICAgIC8qIEZJWE1FOiBnZGIgYWNjZXB0cyAnaScgaGVyZSBpZiBvczlrX3N0YWJzLiAgKi8KLSAgICAgIGR0eXBlID0gKGRlYnVnX21ha2Vfdm9sYXRpbGVfdHlwZQotCSAgICAgICAoZGhhbmRsZSwKLQkJcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgKGRlYnVnX3R5cGUgKiopIE5VTEwpKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0AnOgotICAgICAgLyogT2Zmc2V0IChjbGFzcyAmIHZhcmlhYmxlKSB0eXBlLiAgVGhpcyBpcyB1c2VkIGZvciBhIHBvaW50ZXIKLSAgICAgICAgIHJlbGF0aXZlIHRvIGFuIG9iamVjdC4gICovCi0gICAgICB7Ci0JZGVidWdfdHlwZSBkb21haW47Ci0JZGVidWdfdHlwZSBtZW10eXBlOwotCi0JLyogTWVtYmVyIHR5cGUuICAqLwotCi0JZG9tYWluID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQlpZiAoZG9tYWluID09IERFQlVHX1RZUEVfTlVMTCkKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLQlpZiAoKipwcCAhPSAnLCcpCi0JICB7Ci0JICAgIGJhZF9zdGFiIChvcmlnKTsKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgIH0KLQkrKypwcDsKLQotCW1lbXR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQlpZiAobWVtdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0JZHR5cGUgPSBkZWJ1Z19tYWtlX29mZnNldF90eXBlIChkaGFuZGxlLCBkb21haW4sIG1lbXR5cGUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcjJzoKLSAgICAgIC8qIE1ldGhvZCAoY2xhc3MgJiBmbikgdHlwZS4gICovCi0gICAgICBpZiAoKipwcCA9PSAnIycpCi0JewotCSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLQotCSAgKysqcHA7Ci0JICByZXR1cm5fdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJIHBwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JICBpZiAocmV0dXJuX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgaWYgKCoqcHAgIT0gJzsnKQotCSAgICB7Ci0JICAgICAgYmFkX3N0YWIgKG9yaWcpOwotCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICAgIH0KLQkgICsrKnBwOwotCSAgZHR5cGUgPSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlIChkaGFuZGxlLCByZXR1cm5fdHlwZSwKLQkJCQkJICBERUJVR19UWVBFX05VTEwsCi0JCQkJCSAgKGRlYnVnX3R5cGUgKikgTlVMTCwgZmFsc2UpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkZWJ1Z190eXBlIGRvbWFpbjsKLQkgIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0JICBkZWJ1Z190eXBlICphcmdzOwotCSAgdW5zaWduZWQgaW50IG47Ci0JICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0JICBib29sZWFuIHZhcmFyZ3M7Ci0KLQkgIGRvbWFpbiA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgICAgcHAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgIGlmIChkb21haW4gPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0JICBpZiAoKipwcCAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBiYWRfc3RhYiAob3JpZyk7Ci0JICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgICAgfQotCSAgKysqcHA7Ci0KLQkgIHJldHVybl90eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkgcHAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgIGlmIChyZXR1cm5fdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLQkgIGFsbG9jID0gMTA7Ci0JICBhcmdzID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKmFyZ3MpOwotCSAgbiA9IDA7Ci0JICB3aGlsZSAoKipwcCAhPSAnOycpCi0JICAgIHsKLQkgICAgICBpZiAoKipwcCAhPSAnLCcpCi0JCXsKLQkJICBiYWRfc3RhYiAob3JpZyk7Ci0JCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkJfQotCSAgICAgICsrKnBwOwotCi0JICAgICAgaWYgKG4gKyAxID49IGFsbG9jKQotCQl7Ci0JCSAgYWxsb2MgKz0gMTA7Ci0JCSAgYXJncyA9ICgoZGVidWdfdHlwZSAqKQotCQkJICB4cmVhbGxvYyAoKFBUUikgYXJncywgYWxsb2MgKiBzaXplb2YgKmFyZ3MpKTsKLQkJfQotCi0JICAgICAgYXJnc1tuXSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJIHBwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JICAgICAgaWYgKGFyZ3Nbbl0gPT0gREVCVUdfVFlQRV9OVUxMKQotCQlyZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICAgICsrbjsKLQkgICAgfQotCSAgKysqcHA7Ci0KLQkgIC8qIElmIHRoZSBsYXN0IHR5cGUgaXMgbm90IHZvaWQsIHRoZW4gdGhpcyBmdW5jdGlvbiB0YWtlcyBhCi0JICAgICB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgT3RoZXJ3aXNlLCB3ZSBtdXN0IHN0cmlwCi0JICAgICB0aGUgdm9pZCB0eXBlLiAgKi8KLQkgIGlmIChuID09IDAKLQkgICAgICB8fCBkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBhcmdzW24gLSAxXSkgIT0gREVCVUdfS0lORF9WT0lEKQotCSAgICB2YXJhcmdzID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC0tbjsKLQkgICAgICB2YXJhcmdzID0gZmFsc2U7Ci0JICAgIH0KLQotCSAgYXJnc1tuXSA9IERFQlVHX1RZUEVfTlVMTDsKLQotCSAgZHR5cGUgPSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlIChkaGFuZGxlLCByZXR1cm5fdHlwZSwgZG9tYWluLCBhcmdzLAotCQkJCQkgIHZhcmFyZ3MpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncic6Ci0gICAgICAvKiBSYW5nZSB0eXBlLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9yYW5nZV90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbmFtZSwgcHAsIHR5cGVudW1zKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYic6Ci0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBvczlrX3N0YWJzIGhlcmUuICAqLwotICAgICAgLyogU3VuIEFDQyBidWlsdGluIGludCB0eXBlLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9zdW5fYnVpbHRpbl90eXBlIChkaGFuZGxlLCBwcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgLyogU3VuIEFDQyBidWlsdGluIGZsb2F0IHR5cGUuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3N1bl9mbG9hdGluZ190eXBlIChkaGFuZGxlLCBwcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2UnOgotICAgICAgLyogRW51bWVyYXRpb24gdHlwZS4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfZW51bV90eXBlIChkaGFuZGxlLCBwcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ3UnOgotICAgICAgLyogU3RydWN0IG9yIHVuaW9uIHR5cGUuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3N0cnVjdF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbmFtZSwgcHAsCi0JCQkJICAgICAgZGVzY3JpcHRvciA9PSAncycsIHR5cGVudW1zKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYSc6Ci0gICAgICAvKiBBcnJheSB0eXBlLiAgKi8KLSAgICAgIGlmICgqKnBwICE9ICdyJykKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCX0KLSAgICAgICsrKnBwOwotCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfYXJyYXlfdHlwZSAoZGhhbmRsZSwgaW5mbywgcHAsIHN0cmluZ3ApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICAgIGR0eXBlID0gZGVidWdfbWFrZV9zZXRfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sCi0JCQkJCQkgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCSAgICBwcCwKLQkJCQkJCSAgICAoZGVidWdfdHlwZSAqKikgTlVMTCksCi0JCQkJICAgc3RyaW5ncCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKHR5cGVudW1zWzBdICE9IC0xKQotICAgIHsKLSAgICAgIGlmICghIHN0YWJfcmVjb3JkX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zLCBkdHlwZSkpCi0JcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHNpemUgIT0gLTEpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3R5cGVfc2l6ZSAoZGhhbmRsZSwgZHR5cGUsICh1bnNpZ25lZCBpbnQpIHNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGR0eXBlOwotfQotCi0vKiBSZWFkIGEgbnVtYmVyIGJ5IHdoaWNoIGEgdHlwZSBpcyByZWZlcnJlZCB0byBpbiBkYnggZGF0YSwgb3IKLSAgIHBlcmhhcHMgcmVhZCBhIHBhaXIgKEZJTEVOVU0sIFRZUEVOVU0pIGluIHBhcmVudGhlc2VzLiAgSnVzdCBhCi0gICBzaW5nbGUgbnVtYmVyIE4gaXMgZXF1aXZhbGVudCB0byAoMCxOKS4gIFJldHVybiB0aGUgdHdvIG51bWJlcnMgYnkKLSAgIHN0b3JpbmcgdGhlbSBpbiB0aGUgdmVjdG9yIFRZUEVOVU1TLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX3N0YWJfdHlwZV9udW1iZXIgKHBwLCB0eXBlbnVtcykKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBpbnQgKnR5cGVudW1zOwotewotICBjb25zdCBjaGFyICpvcmlnOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgaWYgKCoqcHAgIT0gJygnKQotICAgIHsKLSAgICAgIHR5cGVudW1zWzBdID0gMDsKLSAgICAgIHR5cGVudW1zWzFdID0gKGludCkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKysqcHA7Ci0gICAgICB0eXBlbnVtc1swXSA9IChpbnQpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICAgICAgaWYgKCoqcHAgIT0gJywnKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIHR5cGVudW1zWzFdID0gKGludCkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gICAgICBpZiAoKipwcCAhPSAnKScpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICsrKnBwOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgYSByYW5nZSB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX3N0YWJfcmFuZ2VfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW5hbWUsIHBwLCB0eXBlbnVtcykKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqdHlwZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgY29uc3QgaW50ICp0eXBlbnVtczsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgaW50IHJhbmdlbnVtc1syXTsKLSAgYm9vbGVhbiBzZWxmX3N1YnJhbmdlOwotICBkZWJ1Z190eXBlIGluZGV4X3R5cGU7Ci0gIGNvbnN0IGNoYXIgKnMyLCAqczM7Ci0gIGJmZF9zaWduZWRfdm1hIG4yLCBuMzsKLSAgYm9vbGVhbiBvdjIsIG92MzsKLQotICBvcmlnID0gKnBwOwotCi0gIGluZGV4X3R5cGUgPSBERUJVR19UWVBFX05VTEw7Ci0KLSAgLyogRmlyc3QgY29tZXMgYSB0eXBlIHdlIGFyZSBhIHN1YnJhbmdlIG9mLgotICAgICBJbiBDIGl0IGlzIHVzdWFsbHkgMCwgMSBvciB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLiAgKi8KLSAgaWYgKCEgcGFyc2Vfc3RhYl90eXBlX251bWJlciAocHAsIHJhbmdlbnVtcykpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBzZWxmX3N1YnJhbmdlID0gKHJhbmdlbnVtc1swXSA9PSB0eXBlbnVtc1swXQotCQkgICAmJiByYW5nZW51bXNbMV0gPT0gdHlwZW51bXNbMV0pOwotCi0gIGlmICgqKnBwID09ICc9JykKLSAgICB7Ci0gICAgICAqcHAgPSBvcmlnOwotICAgICAgaW5kZXhfdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgICAgcHAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChpbmRleF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBpZiAoKipwcCA9PSAnOycpCi0gICAgKysqcHA7Ci0KLSAgLyogVGhlIHJlbWFpbmluZyB0d28gb3BlcmFuZHMgYXJlIHVzdWFsbHkgbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBvZgotICAgICB0aGUgcmFuZ2UuICBCdXQgaW4gc29tZSBzcGVjaWFsIGNhc2VzIHRoZXkgbWVhbiBzb21ldGhpbmcgZWxzZS4gICovCi0gIHMyID0gKnBwOwotICBuMiA9IHBhcnNlX251bWJlciAocHAsICZvdjIpOwotICBpZiAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0gICsrKnBwOwotCi0gIHMzID0gKnBwOwotICBuMyA9IHBhcnNlX251bWJlciAocHAsICZvdjMpOwotICBpZiAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGlmIChvdjIgfHwgb3YzKQotICAgIHsKLSAgICAgIC8qIGdjYyB3aWxsIGVtaXQgcmFuZ2Ugc3RhYnMgZm9yIGxvbmcgbG9uZyB0eXBlcy4gIEhhbmRsZSB0aGlzCi0gICAgICAgICBhcyBhIHNwZWNpYWwgY2FzZS4gIEZJWE1FOiBUaGlzIG5lZWRzIHRvIGJlIG1vcmUgZ2VuZXJhbC4gICovCi0jZGVmaW5lIExMTE9XICAiMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDA7IgotI2RlZmluZSBMTEhJR0ggIjA3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7IgotI2RlZmluZSBVTExISUdIICIwMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzsiCi0gICAgICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JewotCSAgaWYgKHN0cm5jbXAgKHMyLCBMTExPVywgc2l6ZW9mIExMTE9XIC0gMSkgPT0gMAotCSAgICAgICYmIHN0cm5jbXAgKHMzLCBMTEhJR0gsIHNpemVvZiBMTEhJR0ggLSAxKSA9PSAwKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOwotCSAgaWYgKCEgb3YyCi0JICAgICAgJiYgbjIgPT0gMAotCSAgICAgICYmIHN0cm5jbXAgKHMzLCBVTExISUdILCBzaXplb2YgVUxMSElHSCAtIDEpID09IDApCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKLQl9Ci0KLSAgICAgIHdhcm5fc3RhYiAob3JpZywgXygibnVtZXJpYyBvdmVyZmxvdyIpKTsKLSAgICB9Ci0KLSAgaWYgKGluZGV4X3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHsKLSAgICAgIC8qIEEgdHlwZSBkZWZpbmVkIGFzIGEgc3VicmFuZ2Ugb2YgaXRzZWxmLCB3aXRoIGJvdGggYm91bmRzIDAsCi0gICAgICAgICBpcyB2b2lkLiAgKi8KLSAgICAgIGlmIChzZWxmX3N1YnJhbmdlICYmIG4yID09IDAgJiYgbjMgPT0gMCkKLQlyZXR1cm4gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotCi0gICAgICAvKiBBIHR5cGUgZGVmaW5lZCBhcyBhIHN1YnJhbmdlIG9mIGl0c2VsZiwgd2l0aCBuMiBwb3NpdGl2ZSBhbmQKLQkgbjMgemVybywgaXMgYSBjb21wbGV4IHR5cGUsIGFuZCBuMiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzLiAgKi8KLSAgICAgIGlmIChzZWxmX3N1YnJhbmdlICYmIG4zID09IDAgJiYgbjIgPiAwKQotCXJldHVybiBkZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSAoZGhhbmRsZSwgbjIpOwotCi0gICAgICAvKiBJZiBuMyBpcyB6ZXJvIGFuZCBuMiBpcyBwb3NpdGl2ZSwgdGhpcyBpcyBhIGZsb2F0aW5nIHBvaW50Ci0gICAgICAgICB0eXBlLCBhbmQgbjIgaXMgdGhlIG51bWJlciBvZiBieXRlcy4gICovCi0gICAgICBpZiAobjMgPT0gMCAmJiBuMiA+IDApCi0JcmV0dXJuIGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgbjIpOwotCi0gICAgICAvKiBJZiB0aGUgdXBwZXIgYm91bmQgaXMgLTEsIHRoaXMgaXMgYW4gdW5zaWduZWQgaW50LiAgKi8KLSAgICAgIGlmIChuMiA9PSAwICYmIG4zID09IC0xKQotCXsKLQkgIC8qIFdoZW4gZ2NjIGlzIHVzZWQgd2l0aCAtZ3N0YWJzLCBidXQgbm90IC1nc3RhYnMrLCBpdCB3aWxsIGVtaXQKLQkgICAgICAgICBsb25nIGxvbmcgaW50OnQ2PXIxOzA7LTE7Ci0JCSBsb25nIGxvbmcgdW5zaWduZWQgaW50OnQ3PXIxOzA7LTE7Ci0JICAgICBXZSBoYWNrIGhlcmUgdG8gaGFuZGxlIHRoaXMgcmVhc29uYWJseS4gICovCi0JICBpZiAodHlwZW5hbWUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKHR5cGVuYW1lLCAibG9uZyBsb25nIGludCIpID09IDApCi0JCXJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCBmYWxzZSk7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wICh0eXBlbmFtZSwgImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQiKSA9PSAwKQotCQlyZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgdHJ1ZSk7Ci0JICAgIH0KLQkgIC8qIEZJWE1FOiBUaGUgc2l6ZSBoZXJlIHJlYWxseSBkZXBlbmRzIHVwb24gdGhlIHRhcmdldC4gICovCi0JICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0JfQotCi0gICAgICAvKiBBIHJhbmdlIG9mIDAgdG8gMTI3IGlzIGNoYXIuICAqLwotICAgICAgaWYgKHNlbGZfc3VicmFuZ2UgJiYgbjIgPT0gMCAmJiBuMyA9PSAxMjcpCi0JcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKLQotICAgICAgLyogRklYTUU6IGdkYiBjaGVja3MgZm9yIHRoZSBsYW5ndWFnZSBDSElMTCBoZXJlLiAgKi8KLQotICAgICAgaWYgKG4yID09IDApCi0JewotCSAgaWYgKG4zIDwgMCkKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIC0gbjMsIHRydWUpOwotCSAgZWxzZSBpZiAobjMgPT0gMHhmZikKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOwotCSAgZWxzZSBpZiAobjMgPT0gMHhmZmZmKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgdHJ1ZSk7Ci0JICBlbHNlIGlmIChuMyA9PSAoYmZkX3NpZ25lZF92bWEpIDB4ZmZmZmZmZmYpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSNpZmRlZiBCRkQ2NAotCSAgZWxzZSBpZiAobjMgPT0gKCgoKGJmZF92bWEpIDB4ZmZmZmZmZmYpIDw8IDMyKSB8IDB4ZmZmZmZmZmYpKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgdHJ1ZSk7Ci0jZW5kaWYKLQl9Ci0gICAgICBlbHNlIGlmIChuMyA9PSAwCi0JICAgICAgICYmIG4yIDwgMAotCSAgICAgICAmJiAoc2VsZl9zdWJyYW5nZSB8fCBuMiA9PSAtOCkpCi0JcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIC0gbjIsIHRydWUpOwotICAgICAgZWxzZSBpZiAobjIgPT0gLSBuMyAtIDEgfHwgbjIgPT0gbjMgKyAxKQotCXsKLQkgIGlmIChuMyA9PSAweDdmKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotCSAgZWxzZSBpZiAobjMgPT0gMHg3ZmZmKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotCSAgZWxzZSBpZiAobjMgPT0gMHg3ZmZmZmZmZikKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSNpZmRlZiBCRkQ2NAotCSAgZWxzZSBpZiAobjMgPT0gKCgoKGJmZF92bWEpIDB4N2ZmZmZmZmYpIDw8IDMyKSB8IDB4ZmZmZmZmZmYpKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOwotI2VuZGlmCi0JfQotICAgIH0KLQotICAvKiBBdCB0aGlzIHBvaW50IEkgZG9uJ3QgaGF2ZSB0aGUgZmFpbnRlc3QgaWRlYSBob3cgdG8gZGVhbCB3aXRoIGEKLSAgICAgc2VsZl9zdWJyYW5nZSB0eXBlOyBJJ20gZ29pbmcgdG8gYXNzdW1lIHRoYXQgdGhpcyBpcyB1c2VkIGFzIGFuCi0gICAgIGlkaW9tLCBhbmQgdGhhdCBhbGwgb2YgdGhlbSBhcmUgc3BlY2lhbCBjYXNlcy4gIFNvIC4gLiAuICAqLwotICBpZiAoc2VsZl9zdWJyYW5nZSkKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBpbmRleF90eXBlID0gc3RhYl9maW5kX3R5cGUgKGRoYW5kbGUsIGluZm8sIHJhbmdlbnVtcyk7Ci0gIGlmIChpbmRleF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICB7Ci0gICAgICAvKiBEb2VzIHRoaXMgYWN0dWFsbHkgZXZlciBoYXBwZW4/ICBJcyB0aGF0IHdoeSB3ZSBhcmUgd29ycnlpbmcKLSAgICAgICAgIGFib3V0IGRlYWxpbmcgd2l0aCBpdCByYXRoZXIgdGhhbiBqdXN0IGNhbGxpbmcgZXJyb3JfdHlwZT8gICovCi0gICAgICB3YXJuX3N0YWIgKG9yaWcsIF8oIm1pc3NpbmcgaW5kZXggdHlwZSIpKTsKLSAgICAgIGluZGV4X3R5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgfQotCi0gIHJldHVybiBkZWJ1Z19tYWtlX3JhbmdlX3R5cGUgKGRoYW5kbGUsIGluZGV4X3R5cGUsIG4yLCBuMyk7Ci19Ci0KLS8qIFN1bidzIEFDQyB1c2VzIGEgc29tZXdoYXQgc2FuZXIgbWV0aG9kIGZvciBzcGVjaWZ5aW5nIHRoZSBidWlsdGluCi0gICB0eXBlZGVmcyBpbiBldmVyeSBmaWxlIChmb3IgaW50LCBsb25nLCBldGMpOgotCi0JdHlwZSA9IGIgPHNpZ25lZD4gPHdpZHRoPjsgPG9mZnNldD47IDxuYml0cz4KLQlzaWduZWQgPSB1IG9yIHMuICBQb3NzaWJsZSBjIGluIGFkZGl0aW9uIHRvIHUgb3IgcyAoZm9yIGNoYXI/KS4KLQlvZmZzZXQgPSBvZmZzZXQgZnJvbSBoaWdoIG9yZGVyIGJpdCB0byBzdGFydCBiaXQgb2YgdHlwZS4KLQl3aWR0aCBpcyAjIGJ5dGVzIGluIG9iamVjdCBvZiB0aGlzIHR5cGUsIG5iaXRzIGlzICMgYml0cyBpbiB0eXBlLgotCi0gICBUaGUgd2lkdGgvb2Zmc2V0IHN0dWZmIGFwcGVhcnMgdG8gYmUgZm9yIHNtYWxsIG9iamVjdHMgc3RvcmVkIGluCi0gICBsYXJnZXIgb25lcyAoZS5nLiBgc2hvcnRzJyBpbiBgaW50JyByZWdpc3RlcnMpLiAgV2UgaWdub3JlIGl0IGZvciBub3csCi0gICBGSVhNRS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX3N1bl9idWlsdGluX3R5cGUgKGRoYW5kbGUsIHBwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBib29sZWFuIHVuc2lnbmVkcDsKLSAgYmZkX3ZtYSBiaXRzOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgc3dpdGNoICgqKnBwKQotICAgIHsKLSAgICBjYXNlICdzJzoKLSAgICAgIHVuc2lnbmVkcCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndSc6Ci0gICAgICB1bnNpZ25lZHAgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotICArKypwcDsKLQotICAvKiBGb3Igc29tZSBvZGQgcmVhc29uLCBhbGwgZm9ybXMgb2YgY2hhciBwdXQgYSBjIGhlcmUuICBUaGlzIGlzIHN0cmFuZ2UKLSAgICAgYmVjYXVzZSBubyBvdGhlciB0eXBlIGhhcyB0aGlzIGhvbm9yLiAgV2UgY2FuIHNhZmVseSBpZ25vcmUgdGhpcyBiZWNhdXNlCi0gICAgIHdlIGFjdHVhbGx5IGRldGVybWluZSAnY2hhcidhY3Rlcm5lc3MgYnkgdGhlIG51bWJlciBvZiBiaXRzIHNwZWNpZmllZCBpbgotICAgICB0aGUgZGVzY3JpcHRvci4gICovCi0gIGlmICgqKnBwID09ICdjJykKLSAgICArKypwcDsKLQotICAvKiBUaGUgZmlyc3QgbnVtYmVyIGFwcGVhcnMgdG8gYmUgdGhlIG51bWJlciBvZiBieXRlcyBvY2N1cGllZAotICAgICBieSB0aGlzIHR5cGUsIGV4Y2VwdCB0aGF0IHVuc2lnbmVkIHNob3J0IGlzIDQgaW5zdGVhZCBvZiAyLgotICAgICBTaW5jZSB0aGlzIGluZm9ybWF0aW9uIGlzIHJlZHVuZGFudCB3aXRoIHRoZSB0aGlyZCBudW1iZXIsCi0gICAgIHdlIHdpbGwgaWdub3JlIGl0LiAgKi8KLSAgKHZvaWQpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0gICsrKnBwOwotCi0gIC8qIFRoZSBzZWNvbmQgbnVtYmVyIGlzIGFsd2F5cyAwLCBzbyBpZ25vcmUgaXQgdG9vLiAqLwotICAodm9pZCkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgLyogVGhlIHRoaXJkIG51bWJlciBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIHRoaXMgdHlwZS4gKi8KLSAgYml0cyA9IHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotCi0gIC8qIFRoZSB0eXBlICpzaG91bGQqIGVuZCB3aXRoIGEgc2VtaWNvbG9uLiAgSWYgaXQgYXJlIGVtYmVkZGVkCi0gICAgIGluIGEgbGFyZ2VyIHR5cGUgdGhlIHNlbWljb2xvbiBtYXkgYmUgdGhlIG9ubHkgd2F5IHRvIGtub3cgd2hlcmUKLSAgICAgdGhlIHR5cGUgZW5kcy4gIElmIHRoaXMgdHlwZSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzdGFic3RyaW5nIHdlCi0gICAgIGNhbiBkZWFsIHdpdGggdGhlIG9taXR0ZWQgc2VtaWNvbG9uIChidXQgd2UgZG9uJ3QgaGF2ZSB0byBsaWtlCi0gICAgIGl0KS4gIERvbid0IGJvdGhlciB0byBjb21wbGFpbigpLCBTdW4ncyBjb21waWxlciBvbWl0cyB0aGUgc2VtaWNvbG9uCi0gICAgIGZvciAidm9pZCIuICAqLwotICBpZiAoKipwcCA9PSAnOycpCi0gICAgKysqcHA7Ci0KLSAgaWYgKGJpdHMgPT0gMCkKLSAgICByZXR1cm4gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCBiaXRzIC8gOCwgdW5zaWduZWRwKTsKLX0KLQotLyogUGFyc2UgYSBidWlsdGluIGZsb2F0aW5nIHR5cGUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4gY29tcGlsZXIuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl9zdW5fZmxvYXRpbmdfdHlwZSAoZGhhbmRsZSwgcHApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGJmZF92bWEgZGV0YWlsczsKLSAgYmZkX3ZtYSBieXRlczsKLQotICBvcmlnID0gKnBwOwotCi0gIC8qIFRoZSBmaXJzdCBudW1iZXIgaGFzIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgdHlwZSwgZm9yIGV4YW1wbGUKLSAgICAgRk5fQ09NUExFWC4gICovCi0gIGRldGFpbHMgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIC8qIFRoZSBzZWNvbmQgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgdGhpcyB0eXBlICovCi0gIGJ5dGVzID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBpZiAoZGV0YWlscyA9PSBORl9DT01QTEVYCi0gICAgICB8fCBkZXRhaWxzID09IE5GX0NPTVBMRVgxNgotICAgICAgfHwgZGV0YWlscyA9PSBORl9DT01QTEVYMzIpCi0gICAgcmV0dXJuIGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCBieXRlcyk7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgYnl0ZXMpOyAgICAgIAotfQotCi0vKiBIYW5kbGUgYW4gZW51bSB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX3N0YWJfZW51bV90eXBlIChkaGFuZGxlLCBwcCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgY29uc3QgY2hhciAqKm5hbWVzOwotICBiZmRfc2lnbmVkX3ZtYSAqdmFsdWVzOwotICB1bnNpZ25lZCBpbnQgbjsKLSAgdW5zaWduZWQgaW50IGFsbG9jOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KLQotICAvKiBUaGUgYWl4NCBjb21waWxlciBlbWl0cyBhbiBleHRyYSBmaWVsZCBiZWZvcmUgdGhlIGVudW0gbWVtYmVyczsKLSAgICAgbXkgZ3Vlc3MgaXMgaXQncyBhIHR5cGUgb2Ygc29tZSBzb3J0LiAgSnVzdCBpZ25vcmUgaXQuICAqLwotICBpZiAoKipwcCA9PSAnLScpCi0gICAgewotICAgICAgd2hpbGUgKCoqcHAgIT0gJzonKQotCSsrKnBwOwotICAgICAgKysqcHA7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIHZhbHVlLW5hbWVzIGFuZCB0aGVpciB2YWx1ZXMuCi0gICAgIFRoZSBpbnB1dCBzeW50YXggaXMgTkFNRTpWQUxVRSxOQU1FOlZBTFVFLCBhbmQgc28gb24uCi0gICAgIEEgc2VtaWNvbG9uIG9yIGNvbW1hIGluc3RlYWQgb2YgYSBOQU1FIG1lYW5zIHRoZSBlbmQuICAqLwotICBhbGxvYyA9IDEwOwotICBuYW1lcyA9IChjb25zdCBjaGFyICoqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqbmFtZXMpOwotICB2YWx1ZXMgPSAoYmZkX3NpZ25lZF92bWEgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKnZhbHVlcyk7Ci0gIG4gPSAwOwotICB3aGlsZSAoKipwcCAhPSAnXDAnICYmICoqcHAgIT0gJzsnICYmICoqcHAgIT0gJywnKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgYmZkX3NpZ25lZF92bWEgdmFsOwotCi0gICAgICBwID0gKnBwOwotICAgICAgd2hpbGUgKCpwICE9ICc6JykKLQkrK3A7Ci0KLSAgICAgIG5hbWUgPSBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApOwotCi0gICAgICAqcHAgPSBwICsgMTsKLSAgICAgIHZhbCA9IChiZmRfc2lnbmVkX3ZtYSkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gICAgICBpZiAoKipwcCAhPSAnLCcpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQl9Ci0gICAgICArKypwcDsKLQotICAgICAgaWYgKG4gKyAxID49IGFsbG9jKQotCXsKLQkgIGFsbG9jICs9IDEwOwotCSAgbmFtZXMgPSAoKGNvbnN0IGNoYXIgKiopCi0JCSAgIHhyZWFsbG9jICgoUFRSKSBuYW1lcywgYWxsb2MgKiBzaXplb2YgKm5hbWVzKSk7Ci0JICB2YWx1ZXMgPSAoKGJmZF9zaWduZWRfdm1hICopCi0JCSAgICB4cmVhbGxvYyAoKFBUUikgdmFsdWVzLCBhbGxvYyAqIHNpemVvZiAqdmFsdWVzKSk7Ci0JfQotCi0gICAgICBuYW1lc1tuXSA9IG5hbWU7Ci0gICAgICB2YWx1ZXNbbl0gPSB2YWw7Ci0gICAgICArK247Ci0gICAgfQotCi0gIG5hbWVzW25dID0gTlVMTDsKLSAgdmFsdWVzW25dID0gMDsKLQotICBpZiAoKipwcCA9PSAnOycpCi0gICAgKysqcHA7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfZW51bV90eXBlIChkaGFuZGxlLCBuYW1lcywgdmFsdWVzKTsKLX0KLQotLyogUmVhZCB0aGUgZGVzY3JpcHRpb24gb2YgYSBzdHJ1Y3R1cmUgKG9yIHVuaW9uIHR5cGUpIGFuZCByZXR1cm4gYW4gb2JqZWN0Ci0gICBkZXNjcmliaW5nIHRoZSB0eXBlLgotCi0gICBQUCBwb2ludHMgdG8gYSBjaGFyYWN0ZXIgcG9pbnRlciB0aGF0IHBvaW50cyB0byB0aGUgbmV4dCB1bmNvbnN1bWVkIHRva2VuCi0gICBpbiB0aGUgdGhlIHN0YWJzIHN0cmluZy4gIEZvciBleGFtcGxlLCBnaXZlbiBzdGFicyAiQTpUND1zNGE6MSwwLDMyOzsiLAotICAgKlBQIHdpbGwgcG9pbnQgdG8gIjRhOjEsMCwzMjs7Ii4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX3N0cnVjdF90eXBlIChkaGFuZGxlLCBpbmZvLCB0YWduYW1lLCBwcCwgc3RydWN0cCwgdHlwZW51bXMpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnRhZ25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBiZmRfdm1hIHNpemU7Ci0gIGRlYnVnX2Jhc2VjbGFzcyAqYmFzZWNsYXNzZXM7Ci0gIGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0gIGJvb2xlYW4gc3RhdGljczsKLSAgZGVidWdfbWV0aG9kICptZXRob2RzOwotICBkZWJ1Z190eXBlIHZwdHJiYXNlOwotICBib29sZWFuIG93bnZwdHI7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICAvKiBHZXQgdGhlIHNpemUuICAqLwotICBzaXplID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0KLSAgLyogR2V0IHRoZSBvdGhlciBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIHBhcnNlX3N0YWJfYmFzZWNsYXNzZXMgKGRoYW5kbGUsIGluZm8sIHBwLCAmYmFzZWNsYXNzZXMpCi0gICAgICB8fCAhIHBhcnNlX3N0YWJfc3RydWN0X2ZpZWxkcyAoZGhhbmRsZSwgaW5mbywgcHAsICZmaWVsZHMsICZzdGF0aWNzKQotICAgICAgfHwgISBwYXJzZV9zdGFiX21lbWJlcnMgKGRoYW5kbGUsIGluZm8sIHRhZ25hbWUsIHBwLCB0eXBlbnVtcywgJm1ldGhvZHMpCi0gICAgICB8fCAhIHBhcnNlX3N0YWJfdGlsZGVfZmllbGQgKGRoYW5kbGUsIGluZm8sIHBwLCB0eXBlbnVtcywgJnZwdHJiYXNlLAotCQkJCSAgICZvd252cHRyKSkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmICghIHN0YXRpY3MKLSAgICAgICYmIGJhc2VjbGFzc2VzID09IE5VTEwKLSAgICAgICYmIG1ldGhvZHMgPT0gTlVMTAotICAgICAgJiYgdnB0cmJhc2UgPT0gREVCVUdfVFlQRV9OVUxMCi0gICAgICAmJiAhIG93bnZwdHIpCi0gICAgcmV0dXJuIGRlYnVnX21ha2Vfc3RydWN0X3R5cGUgKGRoYW5kbGUsIHN0cnVjdHAsIHNpemUsIGZpZWxkcyk7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2Vfb2JqZWN0X3R5cGUgKGRoYW5kbGUsIHN0cnVjdHAsIHNpemUsIGZpZWxkcywgYmFzZWNsYXNzZXMsCi0JCQkJIG1ldGhvZHMsIHZwdHJiYXNlLCBvd252cHRyKTsKLX0KLQotLyogVGhlIHN0YWJzIGZvciBDKysgZGVyaXZlZCBjbGFzc2VzIGNvbnRhaW4gYmFzZWNsYXNzIGluZm9ybWF0aW9uIHdoaWNoCi0gICBpcyBtYXJrZWQgYnkgYSAnIScgY2hhcmFjdGVyIGFmdGVyIHRoZSB0b3RhbCBzaXplLiAgVGhpcyBmdW5jdGlvbiBpcwotICAgY2FsbGVkIHdoZW4gd2UgZW5jb3VudGVyIHRoZSBiYXNlY2xhc3MgbWFya2VyLCBhbmQgc2x1cnBzIHVwIGFsbCB0aGUKLSAgIGJhc2VjbGFzcyBpbmZvcm1hdGlvbi4KLQotICAgSW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSAnIScgbWFya2VyIGlzIHRoZSBudW1iZXIgb2YgYmFzZSBjbGFzc2VzIHRoYXQKLSAgIHRoZSBjbGFzcyBpcyBkZXJpdmVkIGZyb20sIGZvbGxvd2VkIGJ5IGluZm9ybWF0aW9uIGZvciBlYWNoIGJhc2UgY2xhc3MuCi0gICBGb3IgZWFjaCBiYXNlIGNsYXNzLCB0aGVyZSBhcmUgdHdvIHZpc2liaWxpdHkgc3BlY2lmaWVycywgYSBiaXQgb2Zmc2V0Ci0gICB0byB0aGUgYmFzZSBjbGFzcyBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIGRlcml2ZWQgY2xhc3MsIGEgcmVmZXJlbmNlIHRvCi0gICB0aGUgdHlwZSBmb3IgdGhlIGJhc2UgY2xhc3MsIGFuZCBhIHRlcm1pbmF0aW5nIHNlbWljb2xvbi4KLQotICAgQSB0eXBpY2FsIGV4YW1wbGUsIHdpdGggdHdvIGJhc2UgY2xhc3Nlcywgd291bGQgYmUgIiEyLDAyMCwxOTswMjY0LDIxOyIuCi0gICAJCQkJCQkgICAgICAgXl4gXiBeIF4gIF4gXiAgXgotCUJhc2VjbGFzcyBpbmZvcm1hdGlvbiBtYXJrZXIgX19fX19fX19fX19fX19fX19ffHwgfCB8IHwgIHwgfCAgfAotCU51bWJlciBvZiBiYXNlY2xhc3NlcyBfX19fX19fX19fX19fX19fX19fX19fX19fX3wgfCB8IHwgIHwgfCAgfAotCVZpc2liaWxpdHkgc3BlY2lmaWVycyAoMikgX19fX19fX19fX19fX19fX19fX19fX19ffCB8IHwgIHwgfCAgfAotCU9mZnNldCBpbiBiaXRzIGZyb20gc3RhcnQgb2YgY2xhc3MgX19fX19fX19fX19fX19fX198IHwgIHwgfCAgfAotCVR5cGUgbnVtYmVyIGZvciBiYXNlIGNsYXNzIF9fX19fX19fX19fX19fX19fX19fX19fX19fX3wgIHwgfCAgfAotCVZpc2liaWxpdHkgc3BlY2lmaWVycyAoMikgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wgfCAgfAotCU9mZnNldCBpbiBiaXRzIGZyb20gc3RhcnQgb2YgY2xhc3MgX19fX19fX19fX19fX19fX19fX19fX19ffCAgfAotCVR5cGUgbnVtYmVyIG9mIGJhc2UgY2xhc3MgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotCi0gIFJldHVybiB0cnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX2Jhc2VjbGFzc2VzIChkaGFuZGxlLCBpbmZvLCBwcCwgcmV0cCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z19iYXNlY2xhc3MgKipyZXRwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICB1bnNpZ25lZCBpbnQgYywgaTsKLSAgZGVidWdfYmFzZWNsYXNzICpjbGFzc2VzOwotCi0gICpyZXRwID0gTlVMTDsKLQotICBvcmlnID0gKnBwOwotCi0gIGlmICgqKnBwICE9ICchJykKLSAgICB7Ci0gICAgICAvKiBObyBiYXNlIGNsYXNzZXMuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICArKypwcDsKLQotICBjID0gKHVuc2lnbmVkIGludCkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0KLSAgaWYgKCoqcHAgIT0gJywnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGNsYXNzZXMgPSAoZGVidWdfYmFzZWNsYXNzICopIHhtYWxsb2MgKChjICsgMSkgKiBzaXplb2YgKCoqcmV0cCkpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgewotICAgICAgYm9vbGVhbiB2aXJ0dWFsOwotICAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgIGRlYnVnX3R5cGUgdHlwZTsKLQotICAgICAgc3dpdGNoICgqKnBwKQotCXsKLQljYXNlICcwJzoKLQkgIHZpcnR1YWwgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJzEnOgotCSAgdmlydHVhbCA9IHRydWU7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgd2Fybl9zdGFiIChvcmlnLCBfKCJ1bmtub3duIHZpcnR1YWwgY2hhcmFjdGVyIGZvciBiYXNlY2xhc3MiKSk7Ci0JICB2aXJ0dWFsID0gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0gICAgICArKypwcDsKLQotICAgICAgc3dpdGNoICgqKnBwKQotCXsKLQljYXNlICcwJzoKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU7Ci0JICBicmVhazsKLQljYXNlICcxJzoKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDsKLQkgIGJyZWFrOwotCWNhc2UgJzInOgotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHdhcm5fc3RhYiAob3JpZywgXygidW5rbm93biB2aXNpYmlsaXR5IGNoYXJhY3RlciBmb3IgYmFzZWNsYXNzIikpOwotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCSAgYnJlYWs7Ci0JfQotICAgICAgKysqcHA7Ci0KLSAgICAgIC8qIFRoZSByZW1haW5pbmcgdmFsdWUgaXMgdGhlIGJpdCBvZmZzZXQgb2YgdGhlIHBvcnRpb24gb2YgdGhlCi0JIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYmFzZWNsYXNzLiAgQWx3YXlzIHplcm8gaW4gdGhlCi0JIGFic2VuY2Ugb2YgbXVsdGlwbGUgaW5oZXJpdGFuY2UuICAqLwotICAgICAgYml0cG9zID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gICAgICBpZiAoKipwcCAhPSAnLCcpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICsrKnBwOwotCi0gICAgICB0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCSAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGNsYXNzZXNbaV0gPSBkZWJ1Z19tYWtlX2Jhc2VjbGFzcyAoZGhhbmRsZSwgdHlwZSwgYml0cG9zLCB2aXJ0dWFsLAotCQkJCQkgdmlzaWJpbGl0eSk7Ci0gICAgICBpZiAoY2xhc3Nlc1tpXSA9PSBERUJVR19CQVNFQ0xBU1NfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICgqKnBwICE9ICc7JykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICArKypwcDsKLSAgICB9Ci0KLSAgY2xhc3Nlc1tpXSA9IERFQlVHX0JBU0VDTEFTU19OVUxMOwotCi0gICpyZXRwID0gY2xhc3NlczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBzdHJ1Y3Qgb3IgY2xhc3MgZGF0YSBmaWVsZHMuICBUaGV5IGhhdmUgdGhlIGZvcm06Ci0KLSAgIAlOQU1FIDogW1ZJU0lCSUxJVFldIFRZUEVOVU0gLCBCSVRQT1MgLCBCSVRTSVpFIDsKLQotICAgQXQgdGhlIGVuZCwgd2Ugc2VlIGEgc2VtaWNvbG9uIGluc3RlYWQgb2YgYSBmaWVsZC4KLQotICAgSW4gQysrLCB0aGlzIG1heSB3aW5kIHVwIGJlaW5nIE5BTUU6P1RZUEVOVU06UEhZU05BTUU7IGZvcgotICAgYSBzdGF0aWMgZmllbGQuCi0KLSAgIFRoZSBvcHRpb25hbCBWSVNJQklMSVRZIGlzIG9uZSBvZjoKLQotICAgCScvMCcJKFZJU0lCSUxJVFlfUFJJVkFURSkKLQknLzEnCShWSVNJQklMSVRZX1BST1RFQ1RFRCkKLQknLzInCShWSVNJQklMSVRZX1BVQkxJQykKLQknLzknCShWSVNJQklMSVRZX0lHTk9SRSkKLQotICAgb3Igbm90aGluZywgZm9yIEMgc3R5bGUgZmllbGRzIHdpdGggcHVibGljIHZpc2liaWxpdHkuCi0KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX3N0cnVjdF9maWVsZHMgKGRoYW5kbGUsIGluZm8sIHBwLCByZXRwLCBzdGF0aWNzcCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z19maWVsZCAqKnJldHA7Ci0gICAgIGJvb2xlYW4gKnN0YXRpY3NwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjb25zdCBjaGFyICpwOwotICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgdW5zaWduZWQgaW50IGFsbG9jOwotCi0gICpyZXRwID0gTlVMTDsKLSAgKnN0YXRpY3NwID0gZmFsc2U7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBjID0gMDsKLSAgYWxsb2MgPSAxMDsKLSAgZmllbGRzID0gKGRlYnVnX2ZpZWxkICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpmaWVsZHMpOwotICB3aGlsZSAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KLQotICAgICAgcCA9ICpwcDsKLQotICAgICAgLyogQWRkIDEgdG8gYyB0byBsZWF2ZSByb29tIGZvciBOVUxMIHBvaW50ZXIgYXQgZW5kLiAgKi8KLSAgICAgIGlmIChjICsgMSA+PSBhbGxvYykKLQl7Ci0JICBhbGxvYyArPSAxMDsKLQkgIGZpZWxkcyA9ICgoZGVidWdfZmllbGQgKikKLQkJICAgIHhyZWFsbG9jICgoUFRSKSBmaWVsZHMsIGFsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKLQl9Ci0KLSAgICAgIC8qIElmIGl0IHN0YXJ0cyB3aXRoIENQTFVTX01BUktFUiBpdCBpcyBhIHNwZWNpYWwgYWJicmV2aWF0aW9uLAotCSB1bmxlc3MgdGhlIENQTFVTX01BUktFUiBpcyBmb2xsb3dlZCBieSBhbiB1bmRlcnNjb3JlLCBpbgotCSB3aGljaCBjYXNlIGl0IGlzIGp1c3QgdGhlIG5hbWUgb2YgYW4gYW5vbnltb3VzIHR5cGUsIHdoaWNoIHdlCi0JIHNob3VsZCBoYW5kbGUgbGlrZSBhbnkgb3RoZXIgdHlwZSBuYW1lLiAgV2UgYWNjZXB0IGVpdGhlciAnJCcKLQkgb3IgJy4nLCBiZWNhdXNlIGEgZmllbGQgbmFtZSBjYW4gbmV2ZXIgY29udGFpbiBvbmUgb2YgdGhlc2UKLQkgY2hhcmFjdGVycyBleGNlcHQgYXMgYSBDUExVU19NQVJLRVIuICAqLwotCi0gICAgICBpZiAoKCpwID09ICckJyB8fCAqcCA9PSAnLicpICYmIHBbMV0gIT0gJ18nKQotCXsKLQkgICsrKnBwOwotCSAgaWYgKCEgcGFyc2Vfc3RhYl9jcHBfYWJicmV2IChkaGFuZGxlLCBpbmZvLCBwcCwgZmllbGRzICsgYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICsrYzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgdGhlICc6JyB0aGF0IHNlcGFyYXRlcyB0aGUgZmllbGQgbmFtZSBmcm9tIHRoZSBmaWVsZAotCSB2YWx1ZXMuICBEYXRhIG1lbWJlcnMgYXJlIGRlbGltaXRlZCBieSBhIHNpbmdsZSAnOicsIHdoaWxlIG1lbWJlcgotCSBmdW5jdGlvbnMgYXJlIGRlbGltaXRlZCBieSBhIHBhaXIgb2YgJzoncy4gIFdoZW4gd2UgaGl0IHRoZSBtZW1iZXIKLQkgZnVuY3Rpb25zIChpZiBhbnkpLCB0ZXJtaW5hdGUgc2NhbiBsb29wIGFuZCByZXR1cm4uICovCi0KLSAgICAgIHAgPSBzdHJjaHIgKHAsICc6Jyk7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwWzFdID09ICc6JykKLQlicmVhazsKLQotICAgICAgaWYgKCEgcGFyc2Vfc3RhYl9vbmVfc3RydWN0X2ZpZWxkIChkaGFuZGxlLCBpbmZvLCBwcCwgcCwgZmllbGRzICsgYywKLQkJCQkJIHN0YXRpY3NwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgICsrYzsKLSAgICB9Ci0KLSAgZmllbGRzW2NdID0gREVCVUdfRklFTERfTlVMTDsKLQotICAqcmV0cCA9IGZpZWxkczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3BlY2lhbCBHTlUgQysrIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl9jcHBfYWJicmV2IChkaGFuZGxlLCBpbmZvLCBwcCwgcmV0cCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z19maWVsZCAqcmV0cDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgaW50IGNwcF9hYmJyZXY7Ci0gIGRlYnVnX3R5cGUgY29udGV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqdHlwZW5hbWU7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgYmZkX3ZtYSBiaXRwb3M7Ci0KLSAgKnJldHAgPSBERUJVR19GSUVMRF9OVUxMOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgaWYgKCoqcHAgIT0gJ3YnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiICgqcHApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgY3BwX2FiYnJldiA9ICoqcHA7Ci0gICsrKnBwOwotCi0gIC8qIEF0IHRoaXMgcG9pbnQsICpwcCBwb2ludHMgdG8gc29tZXRoaW5nIGxpa2UgIjIyOjIzPSoyMi4uLiIsIHdoZXJlCi0gICAgIHRoZSB0eXBlIG51bWJlciBiZWZvcmUgdGhlICc6JyBpcyB0aGUgImNvbnRleHQiIGFuZCBldmVyeXRoaW5nCi0gICAgIGFmdGVyIGlzIGEgcmVndWxhciB0eXBlIGRlZmluaXRpb24uICBMb29rdXAgdGhlIHR5cGUsIGZpbmQgaXQncwotICAgICBuYW1lLCBhbmQgY29uc3RydWN0IHRoZSBmaWVsZCBuYW1lLiAgKi8KLQotICBjb250ZXh0ID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCSAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN3aXRjaCAoY3BwX2FiYnJldikKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAvKiAkdmYgLS0gYSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIHBvaW50ZXIuICAqLwotICAgICAgbmFtZSA9ICJfdnB0ciQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgICAvKiAkdmIgLS0gYSB2aXJ0dWFsIGJzb21ldGhpbmdvcm90aGVyICovCi0gICAgICB0eXBlbmFtZSA9IGRlYnVnX2dldF90eXBlX25hbWUgKGRoYW5kbGUsIGNvbnRleHQpOwotICAgICAgaWYgKHR5cGVuYW1lID09IE5VTEwpCi0JewotCSAgd2Fybl9zdGFiIChvcmlnLCBfKCJ1bm5hbWVkICR2YiB0eXBlIikpOwotCSAgdHlwZW5hbWUgPSAiRk9PIjsKLQl9Ci0gICAgICBuYW1lID0gY29uY2F0ICgiX3ZiJCIsIHR5cGVuYW1lLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB3YXJuX3N0YWIgKG9yaWcsIF8oInVucmVjb2duaXplZCBDKysgYWJicmV2aWF0aW9uIikpOwotICAgICAgbmFtZSA9ICJJTlZBTElEX0NQTFVTUExVU19BQkJSRVYiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmICgqKnBwICE9ICc6JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICB0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCSAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnLCcpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYml0cG9zID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICAqcmV0cCA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIG5hbWUsIHR5cGUsIGJpdHBvcywgMCwKLQkJCSAgICBERUJVR19WSVNJQklMSVRZX1BSSVZBVEUpOwotICBpZiAoKnJldHAgPT0gREVCVUdfRklFTERfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGEgc2luZ2xlIGZpZWxkIGluIGEgc3RydWN0IG9yIHVuaW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX3N0YWJfb25lX3N0cnVjdF9maWVsZCAoZGhhbmRsZSwgaW5mbywgcHAsIHAsIHJldHAsIHN0YXRpY3NwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgIGRlYnVnX2ZpZWxkICpyZXRwOwotICAgICBib29sZWFuICpzdGF0aWNzcDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgY2hhciAqbmFtZTsKLSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgYmZkX3ZtYSBiaXRwb3M7Ci0gIGJmZF92bWEgYml0c2l6ZTsKLQotICBvcmlnID0gKnBwOwotCi0gIC8qIEZJWE1FOiBnZGIgY2hlY2tzIEFSTV9ERU1BTkdMSU5HIGhlcmUuICAqLwotCi0gIG5hbWUgPSBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApOwotCi0gICpwcCA9IHAgKyAxOwotCi0gIGlmICgqKnBwICE9ICcvJykKLSAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArKypwcDsKLSAgICAgIHN3aXRjaCAoKipwcCkKLQl7Ci0JY2FzZSAnMCc6Ci0JICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCSAgYnJlYWs7Ci0JY2FzZSAnMSc6Ci0JICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ7Ci0JICBicmVhazsKLQljYXNlICcyJzoKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB3YXJuX3N0YWIgKG9yaWcsIF8oInVua25vd24gdmlzaWJpbGl0eSBjaGFyYWN0ZXIgZm9yIGZpZWxkIikpOwotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCSAgYnJlYWs7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgfQotCi0gIHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCoqcHAgPT0gJzonKQotICAgIHsKLSAgICAgIGNoYXIgKnZhcm5hbWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBzdGF0aWMgY2xhc3MgbWVtYmVyLiAgKi8KLSAgICAgICsrKnBwOwotICAgICAgcCA9IHN0cmNociAoKnBwLCAnOycpOwotICAgICAgaWYgKHAgPT0gTlVMTCkKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICB2YXJuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKLQotICAgICAgKnBwID0gcCArIDE7Ci0KLSAgICAgICpyZXRwID0gZGVidWdfbWFrZV9zdGF0aWNfbWVtYmVyIChkaGFuZGxlLCBuYW1lLCB0eXBlLCB2YXJuYW1lLAotCQkJCQl2aXNpYmlsaXR5KTsKLSAgICAgICpzdGF0aWNzcCA9IHRydWU7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoKipwcCAhPSAnLCcpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYml0cG9zID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICcsJykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBiaXRzaXplID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBpZiAoYml0cG9zID09IDAgJiYgYml0c2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBpbiB0d28gY2FzZXM6ICgxKSBhdCBsZWFzdCBmb3IgZ2NjIDIuNC41IG9yCi0JIHNvLCBpdCBpcyBhIGZpZWxkIHdoaWNoIGhhcyBiZWVuIG9wdGltaXplZCBvdXQuICBUaGUgY29ycmVjdAotCSBzdGFiIGZvciB0aGlzIGNhc2UgaXMgdG8gdXNlIFZJU0lCSUxJVFlfSUdOT1JFLCBidXQgdGhhdCBpcyBhCi0JIHJlY2VudCBpbnZlbnRpb24uICAoMikgSXQgaXMgYSAwLXNpemUgYXJyYXkuICBGb3IgZXhhbXBsZQotCSB1bmlvbiB7IGludCBudW07IGNoYXIgc3RyWzBdOyB9IGZvby4gIFByaW50aW5nICI8bm8gdmFsdWU+IgotCSBmb3Igc3RyIGluICJwIGZvbyIgaXMgT0ssIHNpbmNlIGZvby5zdHIgKGFuZCB0aHVzIGZvby5zdHJbM10pCi0JIHdpbGwgY29udGludWUgdG8gd29yaywgYW5kIGEgMC1zaXplIGFycmF5IGFzIGEgd2hvbGUgZG9lc24ndAotCSBoYXZlIGFueSBjb250ZW50cyB0byBwcmludC4KLQotCSBJIHN1c3BlY3QgdGhpcyBwcm9iYWJseSBjb3VsZCBhbHNvIGhhcHBlbiB3aXRoIGdjYyAtZ3N0YWJzCi0JIChub3QgLWdzdGFicyspIGZvciBzdGF0aWMgZmllbGRzLCBhbmQgcGVyaGFwcyBvdGhlciBDKysKLQkgZXh0ZW5zaW9ucy4gIEhvcGVmdWxseSBmZXcgcGVvcGxlIHVzZSAtZ3N0YWJzIHdpdGggZ2RiLCBzaW5jZQotCSBpdCBpcyBpbnRlbmRlZCBmb3IgZGJ4IGNvbXBhdGliaWxpdHkuICAqLwotICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFOwotICAgIH0KLQotICAvKiBGSVhNRTogZ2RiIGRvZXMgc29tZSBzdHVmZiBoZXJlIHRvIG1hcmsgZmllbGRzIGFzIHVucGFja2VkLiAgKi8KLQotICAqcmV0cCA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIG5hbWUsIHR5cGUsIGJpdHBvcywgYml0c2l6ZSwgdmlzaWJpbGl0eSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgbWVtYmVyIGZ1bmN0aW9uIHN0YWJzIGluZm8gZm9yIEMrKyBjbGFzc2VzLiAgVGhlIGZvcm0gb2YgZWFjaCBtZW1iZXIKLSAgIGZ1bmN0aW9uIGRhdGEgaXM6Ci0KLQlOQU1FIDo6IFRZUEVOVU1bPXR5cGUgZGVmaW5pdGlvbl0gQVJHUyA6IFBIWVNOQU1FIDsKLQotICAgQW4gZXhhbXBsZSB3aXRoIHR3byBtZW1iZXIgZnVuY3Rpb25zIGlzOgotCi0JYWZ1bmMxOjoyMD0jIzE1OzppOzJBLjthZnVuYzI6OjIwOmk7MkEuOwotCi0gICBGb3IgdGhlIGNhc2Ugb2Ygb3ZlcmxvYWRlZCBvcGVyYXRvcnMsIHRoZSBmb3JtYXQgaXMgb3AkOjoqLmZ1bmNzLCB3aGVyZQotICAgJCBpcyB0aGUgQ1BMVVNfTUFSS0VSICh1c3VhbGx5ICckJyksIGAqJyBob2xkcyB0aGUgcGxhY2UgZm9yIGFuIG9wZXJhdG9yCi0gICBuYW1lIChzdWNoIGFzIGArPScpIGFuZCBgLicgbWFya3MgdGhlIGVuZCBvZiB0aGUgb3BlcmF0b3IgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX21lbWJlcnMgKGRoYW5kbGUsIGluZm8sIHRhZ25hbWUsIHBwLCB0eXBlbnVtcywgcmV0cCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqdGFnbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotICAgICBkZWJ1Z19tZXRob2QgKipyZXRwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBkZWJ1Z19tZXRob2QgKm1ldGhvZHM7Ci0gIHVuc2lnbmVkIGludCBjOwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgKnJldHAgPSBOVUxMOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgYWxsb2MgPSAwOwotICBtZXRob2RzID0gTlVMTDsKLSAgYyA9IDA7Ci0KLSAgd2hpbGUgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKnZhcmlhbnRzOwotICAgICAgdW5zaWduZWQgaW50IGN2YXJzOwotICAgICAgdW5zaWduZWQgaW50IGFsbG9jdmFyczsKLSAgICAgIGRlYnVnX3R5cGUgbG9va19haGVhZF90eXBlOwotCi0gICAgICBwID0gc3RyY2hyICgqcHAsICc6Jyk7Ci0gICAgICBpZiAocCA9PSBOVUxMIHx8IHBbMV0gIT0gJzonKQotCWJyZWFrOwotCi0gICAgICAvKiBGSVhNRTogU29tZSBzeXN0ZW1zIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiAnJCcgaGVyZS4gICovCi0gICAgICBpZiAoKCpwcClbMF0gIT0gJ28nIHx8ICgqcHApWzFdICE9ICdwJyB8fCAoKnBwKVsyXSAhPSAnJCcpCi0JewotCSAgbmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgcCAtICpwcCk7Ci0JICAqcHAgPSBwICsgMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBpcyBhIGNvbXBsZXRlbHkgd2llcmQgY2FzZS4gIEluIG9yZGVyIHRvIHN0dWZmIGluIHRoZQotCSAgICAgbmFtZXMgdGhhdCBtaWdodCBjb250YWluIGNvbG9ucyAodGhlIHVzdWFsIG5hbWUgZGVsaW1pdGVyKSwKLQkgICAgIE1pa2UgVGllbWFubiBkZWZpbmVkIGEgZGlmZmVyZW50IG5hbWUgZm9ybWF0IHdoaWNoIGlzCi0JICAgICBzaWduYWxsZWQgaWYgdGhlIGlkZW50aWZpZXIgaXMgIm9wJCIuICBJbiB0aGF0IGNhc2UsIHRoZQotCSAgICAgZm9ybWF0IGlzICJvcCQ6OlhYWFguIiB3aGVyZSBYWFhYIGlzIHRoZSBuYW1lLiAgVGhpcyBpcwotCSAgICAgdXNlZCBmb3IgbmFtZXMgbGlrZSAiKyIgb3IgIj0iLiAgWVVVVVVVVVVLISAgRklYTUUhICAqLwotCSAgKnBwID0gcCArIDI7Ci0JICBmb3IgKHAgPSAqcHA7ICpwICE9ICcuJyAmJiAqcCAhPSAnXDAnOyBwKyspCi0JICAgIDsKLQkgIGlmICgqcCAhPSAnLicpCi0JICAgIHsKLQkgICAgICBiYWRfc3RhYiAob3JpZyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKLQkgICpwcCA9IHAgKyAxOwotCX0KLQotICAgICAgYWxsb2N2YXJzID0gMTA7Ci0gICAgICB2YXJpYW50cyA9ICgoZGVidWdfbWV0aG9kX3ZhcmlhbnQgKikKLQkJICB4bWFsbG9jIChhbGxvY3ZhcnMgKiBzaXplb2YgKnZhcmlhbnRzKSk7Ci0gICAgICBjdmFycyA9IDA7Ci0KLSAgICAgIGxvb2tfYWhlYWRfdHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKLQotICAgICAgZG8KLQl7Ci0JICBkZWJ1Z190eXBlIHR5cGU7Ci0JICBib29sZWFuIHN0dWI7Ci0JICBjaGFyICphcmd0eXBlczsKLQkgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotCSAgYm9vbGVhbiBjb25zdHAsIHZvbGF0aWxlcCwgc3RhdGljcDsKLQkgIGJmZF92bWEgdm9mZnNldDsKLQkgIGRlYnVnX3R5cGUgY29udGV4dDsKLQkgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotCSAgYm9vbGVhbiB2YXJhcmdzOwotCi0JICBpZiAobG9va19haGVhZF90eXBlICE9IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgewotCSAgICAgIC8qIGcrKyB2ZXJzaW9uIDEga2x1ZGdlICovCi0JICAgICAgdHlwZSA9IGxvb2tfYWhlYWRfdHlwZTsKLQkgICAgICBsb29rX2FoZWFkX3R5cGUgPSBERUJVR19UWVBFX05VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoKipwcCAhPSAnOicpCi0JCXsKLQkJICBiYWRfc3RhYiAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgKysqcHA7Ci0JICBwID0gc3RyY2hyICgqcHAsICc7Jyk7Ci0JICBpZiAocCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmFkX3N0YWIgKG9yaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBzdHViID0gZmFsc2U7Ci0JICBpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgdHlwZSkgPT0gREVCVUdfS0lORF9NRVRIT0QKLQkgICAgICAmJiBkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzIChkaGFuZGxlLCB0eXBlLCAmdmFyYXJncykgPT0gTlVMTCkKLQkgICAgc3R1YiA9IHRydWU7Ci0KLQkgIGFyZ3R5cGVzID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKLQkgICpwcCA9IHAgKyAxOwotCi0JICBzd2l0Y2ggKCoqcHApCi0JICAgIHsKLQkgICAgY2FzZSAnMCc6Ci0JICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnMSc6Ci0JICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgKysqcHA7Ci0KLQkgIGNvbnN0cCA9IGZhbHNlOwotCSAgdm9sYXRpbGVwID0gZmFsc2U7Ci0JICBzd2l0Y2ggKCoqcHApCi0JICAgIHsKLQkgICAgY2FzZSAnQSc6Ci0JICAgICAgLyogTm9ybWFsIGZ1bmN0aW9uLiAgKi8KLQkgICAgICArKypwcDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnQic6Ci0JICAgICAgLyogY29uc3QgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KLQkgICAgICBjb25zdHAgPSB0cnVlOwotCSAgICAgICsrKnBwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdDJzoKLQkgICAgICAvKiB2b2xhdGlsZSBtZW1iZXIgZnVuY3Rpb24uICAqLwotCSAgICAgIHZvbGF0aWxlcCA9IHRydWU7Ci0JICAgICAgKysqcHA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0QnOgotCSAgICAgIC8qIGNvbnN0IHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbi4gICovCi0JICAgICAgY29uc3RwID0gdHJ1ZTsKLQkgICAgICB2b2xhdGlsZXAgPSB0cnVlOwotCSAgICAgICsrKnBwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICcqJzoKLQkgICAgY2FzZSAnPyc6Ci0JICAgIGNhc2UgJy4nOgotCSAgICAgIC8qIEZpbGUgY29tcGlsZWQgd2l0aCBnKysgdmVyc2lvbiAxOyBubyBpbmZvcm1hdGlvbi4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgd2Fybl9zdGFiIChvcmlnLCBfKCJjb25zdC92b2xhdGlsZSBpbmRpY2F0b3IgbWlzc2luZyIpKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBzdGF0aWNwID0gZmFsc2U7Ci0JICBzd2l0Y2ggKCoqcHApCi0JICAgIHsKLQkgICAgY2FzZSAnKic6Ci0JICAgICAgLyogdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24sIGZvbGxvd2VkIGJ5IGluZGV4LiAgVGhlIHNpZ24KLQkJIGJpdCBpcyBzdXBwb3NlZGx5IHNldCB0byBkaXN0aW5ndWlzaAotCQkgcG9pbnRlcnMtdG8tbWV0aG9kcyBmcm9tIHZpcnR1YWwgZnVuY3Rpb24gaW5kaWNpZXMuICAqLwotCSAgICAgICsrKnBwOwotCSAgICAgIHZvZmZzZXQgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLQkgICAgICBpZiAoKipwcCAhPSAnOycpCi0JCXsKLQkJICBiYWRfc3RhYiAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgKysqcHA7Ci0JICAgICAgdm9mZnNldCAmPSAweDdmZmZmZmZmOwotCi0JICAgICAgaWYgKCoqcHAgPT0gJzsnIHx8ICpwcCA9PSAnXDAnKQotCQl7Ci0JCSAgLyogTXVzdCBiZSBnKysgdmVyc2lvbiAxLiAgKi8KLQkJICBjb250ZXh0ID0gREVCVUdfVFlQRV9OVUxMOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogRmlndXJlIG91dCBmcm9tIHdoZW5jZSB0aGlzIHZpcnR1YWwgZnVuY3Rpb24KLQkJICAgICBjYW1lLiAgSXQgbWF5IGJlbG9uZyB0byB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIG9mCi0JCSAgICAgb25lIG9mIGl0cyBiYXNlY2xhc3Nlcy4gICovCi0JCSAgICBsb29rX2FoZWFkX3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sCi0JCQkJCQkgICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCSAgICAgICBwcCwKLQkJCQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JCSAgICBpZiAoKipwcCA9PSAnOicpCi0JCSAgICAgIHsKLQkJCS8qIGcrKyB2ZXJzaW9uIDEgb3ZlcmxvYWRlZCBtZXRob2RzLiAgKi8KLQkJCWNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJY29udGV4dCA9IGxvb2tfYWhlYWRfdHlwZTsKLQkJCWxvb2tfYWhlYWRfdHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKLQkJCWlmICgqKnBwICE9ICc7JykKLQkJCSAgewotCQkJICAgIGJhZF9zdGFiIChvcmlnKTsKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIH0KLQkJCSsrKnBwOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJz8nOgotCSAgICAgIC8qIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24uICAqLwotCSAgICAgICsrKnBwOwotCSAgICAgIHN0YXRpY3AgPSB0cnVlOwotCSAgICAgIHZvZmZzZXQgPSAwOwotCSAgICAgIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JICAgICAgaWYgKHN0cm5jbXAgKGFyZ3R5cGVzLCBuYW1lLCBzdHJsZW4gKG5hbWUpKSAhPSAwKQotCQlzdHViID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIHdhcm5fc3RhYiAob3JpZywgIm1lbWJlciBmdW5jdGlvbiB0eXBlIG1pc3NpbmciKTsKLQkgICAgICB2b2Zmc2V0ID0gMDsKLQkgICAgICBjb250ZXh0ID0gREVCVUdfVFlQRV9OVUxMOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJy4nOgotCSAgICAgICsrKnBwOwotCSAgICAgIHZvZmZzZXQgPSAwOwotCSAgICAgIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhlIHR5cGUgaXMgbm90IGEgc3R1YiwgdGhlbiB0aGUgYXJndHlwZXMgc3RyaW5nIGlzCi0gICAgICAgICAgICAgdGhlIHBoeXNpY2FsIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlIHRoZQotICAgICAgICAgICAgIGFyZ3R5cGVzIHN0cmluZyBpcyB0aGUgbWFuZ2xlZCBmb3JtIG9mIHRoZSBhcmd1bWVudAotICAgICAgICAgICAgIHR5cGVzLCBhbmQgdGhlIGZ1bGwgdHlwZSBhbmQgdGhlIHBoeXNpY2FsIG5hbWUgbXVzdCBiZQotICAgICAgICAgICAgIGV4dHJhY3RlZCBmcm9tIHRoZW0uICAqLwotCSAgaWYgKCEgc3R1YikKLQkgICAgcGh5c25hbWUgPSBhcmd0eXBlczsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGRlYnVnX3R5cGUgY2xhc3NfdHlwZSwgcmV0dXJuX3R5cGU7Ci0KLQkgICAgICBjbGFzc190eXBlID0gc3RhYl9maW5kX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zKTsKLQkgICAgICBpZiAoY2xhc3NfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZXR1cm5fdHlwZSA9IGRlYnVnX2dldF9yZXR1cm5fdHlwZSAoZGhhbmRsZSwgdHlwZSk7Ci0JICAgICAgaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkJewotCQkgIGJhZF9zdGFiIChvcmlnKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICB0eXBlID0gcGFyc2Vfc3RhYl9hcmd0eXBlcyAoZGhhbmRsZSwgaW5mbywgY2xhc3NfdHlwZSwgbmFtZSwKLQkJCQkJICB0YWduYW1lLCByZXR1cm5fdHlwZSwgYXJndHlwZXMsCi0JCQkJCSAgY29uc3RwLCB2b2xhdGlsZXAsICZwaHlzbmFtZSk7Ci0JICAgICAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKGN2YXJzICsgMSA+PSBhbGxvY3ZhcnMpCi0JICAgIHsKLQkgICAgICBhbGxvY3ZhcnMgKz0gMTA7Ci0JICAgICAgdmFyaWFudHMgPSAoKGRlYnVnX21ldGhvZF92YXJpYW50ICopCi0JCQkgIHhyZWFsbG9jICgoUFRSKSB2YXJpYW50cywKLQkJCQkgICAgYWxsb2N2YXJzICogc2l6ZW9mICp2YXJpYW50cykpOwotCSAgICB9Ci0KLQkgIGlmICghIHN0YXRpY3ApCi0JICAgIHZhcmlhbnRzW2N2YXJzXSA9IGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQgKGRoYW5kbGUsIHBoeXNuYW1lLAotCQkJCQkJCSB0eXBlLCB2aXNpYmlsaXR5LAotCQkJCQkJCSBjb25zdHAsIHZvbGF0aWxlcCwKLQkJCQkJCQkgdm9mZnNldCwgY29udGV4dCk7Ci0JICBlbHNlCi0JICAgIHZhcmlhbnRzW2N2YXJzXSA9IGRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50IChkaGFuZGxlLAotCQkJCQkJCQlwaHlzbmFtZSwKLQkJCQkJCQkJdHlwZSwKLQkJCQkJCQkJdmlzaWJpbGl0eSwKLQkJCQkJCQkJY29uc3RwLAotCQkJCQkJCQl2b2xhdGlsZXApOwotCSAgaWYgKHZhcmlhbnRzW2N2YXJzXSA9PSBERUJVR19NRVRIT0RfVkFSSUFOVF9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICsrY3ZhcnM7Ci0JfQotICAgICAgd2hpbGUgKCoqcHAgIT0gJzsnICYmICoqcHAgIT0gJ1wwJyk7Ci0KLSAgICAgIHZhcmlhbnRzW2N2YXJzXSA9IERFQlVHX01FVEhPRF9WQVJJQU5UX05VTEw7Ci0KLSAgICAgIGlmICgqKnBwICE9ICdcMCcpCi0JKysqcHA7Ci0KLSAgICAgIGlmIChjICsgMSA+PSBhbGxvYykKLQl7Ci0JICBhbGxvYyArPSAxMDsKLQkgIG1ldGhvZHMgPSAoKGRlYnVnX21ldGhvZCAqKQotCQkgICAgIHhyZWFsbG9jICgoUFRSKSBtZXRob2RzLCBhbGxvYyAqIHNpemVvZiAqbWV0aG9kcykpOwotCX0KLQotICAgICAgbWV0aG9kc1tjXSA9IGRlYnVnX21ha2VfbWV0aG9kIChkaGFuZGxlLCBuYW1lLCB2YXJpYW50cyk7Ci0KLSAgICAgICsrYzsKLSAgICB9Ci0KLSAgaWYgKG1ldGhvZHMgIT0gTlVMTCkKLSAgICBtZXRob2RzW2NdID0gREVCVUdfTUVUSE9EX05VTEw7Ci0KLSAgKnJldHAgPSBtZXRob2RzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIHN0cmluZyByZXByZXNlbnRpbmcgYXJndW1lbnQgdHlwZXMgZm9yIGEgbWV0aG9kLiAgU3RhYnMKLSAgIHRyaWVzIHRvIHNhdmUgc3BhY2UgYnkgcGFja2luZyBhcmd1bWVudCB0eXBlcyBpbnRvIGEgbWFuZ2xlZAotICAgc3RyaW5nLiAgVGhpcyBzdHJpbmcgc2hvdWxkIGdpdmUgdXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGV4dHJhY3QKLSAgIGJvdGggYXJndW1lbnQgdHlwZXMgYW5kIHRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBmdW5jdGlvbiwgZ2l2ZW4KLSAgIHRoZSB0YWcgbmFtZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX2FyZ3R5cGVzIChkaGFuZGxlLCBpbmZvLCBjbGFzc190eXBlLCBmaWVsZG5hbWUsIHRhZ25hbWUsCi0JCSAgICAgcmV0dXJuX3R5cGUsIGFyZ3R5cGVzLCBjb25zdHAsIHZvbGF0aWxlcCwgcHBoeXNuYW1lKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBkZWJ1Z190eXBlIGNsYXNzX3R5cGU7Ci0gICAgIGNvbnN0IGNoYXIgKmZpZWxkbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGFnbmFtZTsKLSAgICAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgICAgY29uc3QgY2hhciAqYXJndHlwZXM7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLSAgICAgY29uc3QgY2hhciAqKnBwaHlzbmFtZTsKLXsKLSAgYm9vbGVhbiBpc19mdWxsX3BoeXNuYW1lX2NvbnN0cnVjdG9yOwotICBib29sZWFuIGlzX2NvbnN0cnVjdG9yOwotICBib29sZWFuIGlzX2Rlc3RydWN0b3I7Ci0gIGRlYnVnX3R5cGUgKmFyZ3M7Ci0gIGJvb2xlYW4gdmFyYXJnczsKLQotICAvKiBDb25zdHJ1Y3RvcnMgYXJlIHNvbWV0aW1lcyBoYW5kbGVkIHNwZWNpYWxseS4gICovCi0gIGlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3IgPSAoKGFyZ3R5cGVzWzBdID09ICdfJwotCQkJCSAgICYmIGFyZ3R5cGVzWzFdID09ICdfJwotCQkJCSAgICYmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYXJndHlwZXNbMl0pCi0JCQkJICAgICAgIHx8IGFyZ3R5cGVzWzJdID09ICdRJwotCQkJCSAgICAgICB8fCBhcmd0eXBlc1syXSA9PSAndCcpKQotCQkJCSAgfHwgc3RybmNtcCAoYXJndHlwZXMsICJfX2N0IiwgNCkgPT0gMCk7Ci0KLSAgaXNfY29uc3RydWN0b3IgPSAoaXNfZnVsbF9waHlzbmFtZV9jb25zdHJ1Y3RvcgotCQkgICAgfHwgKHRhZ25hbWUgIT0gTlVMTAotCQkJJiYgc3RyY21wIChmaWVsZG5hbWUsIHRhZ25hbWUpID09IDApKTsKLSAgaXNfZGVzdHJ1Y3RvciA9ICgoYXJndHlwZXNbMF0gPT0gJ18nCi0JCSAgICAmJiAoYXJndHlwZXNbMV0gPT0gJyQnIHx8IGFyZ3R5cGVzWzFdID09ICcuJykKLQkJICAgICYmIGFyZ3R5cGVzWzJdID09ICdfJykKLQkJICAgfHwgc3RybmNtcCAoYXJndHlwZXMsICJfX2R0IiwgNCkgPT0gMCk7Ci0KLSAgaWYgKGlzX2Rlc3RydWN0b3IgfHwgaXNfZnVsbF9waHlzbmFtZV9jb25zdHJ1Y3RvcikKLSAgICAqcHBoeXNuYW1lID0gYXJndHlwZXM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgICAgY29uc3QgY2hhciAqY29uc3RfcHJlZml4OwotICAgICAgY29uc3QgY2hhciAqdm9sYXRpbGVfcHJlZml4OwotICAgICAgY2hhciBidWZbMjBdOwotICAgICAgdW5zaWduZWQgaW50IG1hbmdsZWRfbmFtZV9sZW47Ci0gICAgICBjaGFyICpwaHlzbmFtZTsKLQotICAgICAgbGVuID0gdGFnbmFtZSA9PSBOVUxMID8gMCA6IHN0cmxlbiAodGFnbmFtZSk7Ci0gICAgICBjb25zdF9wcmVmaXggPSBjb25zdHAgPyAiQyIgOiAiIjsKLSAgICAgIHZvbGF0aWxlX3ByZWZpeCA9IHZvbGF0aWxlcCA/ICJWIiA6ICIiOwotCi0gICAgICBpZiAobGVuID09IDApCi0Jc3ByaW50ZiAoYnVmLCAiX18lcyVzIiwgY29uc3RfcHJlZml4LCB2b2xhdGlsZV9wcmVmaXgpOwotICAgICAgZWxzZSBpZiAodGFnbmFtZSAhPSBOVUxMICYmIHN0cmNociAodGFnbmFtZSwgJzwnKSAhPSBOVUxMKQotCXsKLQkgIC8qIFRlbXBsYXRlIG1ldGhvZHMgYXJlIGZ1bGx5IG1hbmdsZWQuICAqLwotCSAgc3ByaW50ZiAoYnVmLCAiX18lcyVzIiwgY29uc3RfcHJlZml4LCB2b2xhdGlsZV9wcmVmaXgpOwotCSAgdGFnbmFtZSA9IE5VTEw7Ci0JICBsZW4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWYsICJfXyVzJXMlZCIsIGNvbnN0X3ByZWZpeCwgdm9sYXRpbGVfcHJlZml4LCBsZW4pOwotCi0gICAgICBtYW5nbGVkX25hbWVfbGVuID0gKChpc19jb25zdHJ1Y3RvciA/IDAgOiBzdHJsZW4gKGZpZWxkbmFtZSkpCi0JCQkgICsgc3RybGVuIChidWYpCi0JCQkgICsgbGVuCi0JCQkgICsgc3RybGVuIChhcmd0eXBlcykKLQkJCSAgKyAxKTsKLQotICAgICAgaWYgKGZpZWxkbmFtZVswXSA9PSAnbycKLQkgICYmIGZpZWxkbmFtZVsxXSA9PSAncCcKLQkgICYmIChmaWVsZG5hbWVbMl0gPT0gJyQnIHx8IGZpZWxkbmFtZVsyXSA9PSAnLicpKQotCXsKLQkgIGNvbnN0IGNoYXIgKm9wbmFtZTsKLQotCSAgb3BuYW1lID0gY3BsdXNfbWFuZ2xlX29wbmFtZSAoZmllbGRuYW1lICsgMywgMCk7Ci0JICBpZiAob3BuYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIk5vIG1hbmdsaW5nIGZvciBcIiVzXCJcbiIpLCBmaWVsZG5hbWUpOwotCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICAgIH0KLQkgIG1hbmdsZWRfbmFtZV9sZW4gKz0gc3RybGVuIChvcG5hbWUpOwotCSAgcGh5c25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChtYW5nbGVkX25hbWVfbGVuKTsKLQkgIHN0cm5jcHkgKHBoeXNuYW1lLCBmaWVsZG5hbWUsIDMpOwotCSAgc3RyY3B5IChwaHlzbmFtZSArIDMsIG9wbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHBoeXNuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAobWFuZ2xlZF9uYW1lX2xlbik7Ci0JICBpZiAoaXNfY29uc3RydWN0b3IpCi0JICAgIHBoeXNuYW1lWzBdID0gJ1wwJzsKLQkgIGVsc2UKLQkgICAgc3RyY3B5IChwaHlzbmFtZSwgZmllbGRuYW1lKTsKLQl9Ci0KLSAgICAgIHN0cmNhdCAocGh5c25hbWUsIGJ1Zik7Ci0gICAgICBpZiAodGFnbmFtZSAhPSBOVUxMKQotCXN0cmNhdCAocGh5c25hbWUsIHRhZ25hbWUpOwotICAgICAgc3RyY2F0IChwaHlzbmFtZSwgYXJndHlwZXMpOwotCi0gICAgICAqcHBoeXNuYW1lID0gcGh5c25hbWU7Ci0gICAgfQotCi0gIGlmICgqYXJndHlwZXMgPT0gJ1wwJyB8fCBpc19kZXN0cnVjdG9yKQotICAgIHsKLSAgICAgIGFyZ3MgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmFyZ3MpOwotICAgICAgKmFyZ3MgPSBOVUxMOwotICAgICAgcmV0dXJuIGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGRoYW5kbGUsIHJldHVybl90eXBlLCBjbGFzc190eXBlLCBhcmdzLAotCQkJCSAgICAgZmFsc2UpOwotICAgIH0KLQotICBhcmdzID0gc3RhYl9kZW1hbmdsZV9hcmd0eXBlcyAoZGhhbmRsZSwgaW5mbywgKnBwaHlzbmFtZSwgJnZhcmFyZ3MpOwotICBpZiAoYXJncyA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGRoYW5kbGUsIHJldHVybl90eXBlLCBjbGFzc190eXBlLCBhcmdzLAotCQkJCSB2YXJhcmdzKTsKLX0KLQotLyogVGhlIHRhaWwgZW5kIG9mIHN0YWJzIGZvciBDKysgY2xhc3NlcyB0aGF0IGNvbnRhaW4gYSB2aXJ0dWFsIGZ1bmN0aW9uCi0gICBwb2ludGVyIGNvbnRhaW5zIGEgdGlsZGUsIGEgJSwgYW5kIGEgdHlwZSBudW1iZXIuCi0gICBUaGUgdHlwZSBudW1iZXIgcmVmZXJzIHRvIHRoZSBiYXNlIGNsYXNzIChwb3NzaWJseSB0aGlzIGNsYXNzIGl0c2VsZikgd2hpY2gKLSAgIGNvbnRhaW5zIHRoZSB2dGFibGUgcG9pbnRlciBmb3IgdGhlIGN1cnJlbnQgY2xhc3MuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgaGF2ZSBwYXJzZWQgYWxsIHRoZSBtZXRob2QgZGVjbGFyYXRpb25zLAotICAgc28gd2UgY2FuIGxvb2sgZm9yIHRoZSB2cHRyIGJhc2UgY2xhc3MgaW5mby4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX3RpbGRlX2ZpZWxkIChkaGFuZGxlLCBpbmZvLCBwcCwgdHlwZW51bXMsIHJldHZwdHJiYXNlLCByZXRvd252cHRyKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNvbnN0IGludCAqdHlwZW51bXM7Ci0gICAgIGRlYnVnX3R5cGUgKnJldHZwdHJiYXNlOwotICAgICBib29sZWFuICpyZXRvd252cHRyOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjb25zdCBjaGFyICpob2xkOwotICBpbnQgdnR5cGVudW1zWzJdOwotCi0gICpyZXR2cHRyYmFzZSA9IERFQlVHX1RZUEVfTlVMTDsKLSAgKnJldG93bnZwdHIgPSBmYWxzZTsKLQotICBvcmlnID0gKnBwOwotCi0gIC8qIElmIHdlIGFyZSBwb3NpdGlvbmVkIGF0IGEgJzsnLCB0aGVuIHNraXAgaXQuICovCi0gIGlmICgqKnBwID09ICc7JykKLSAgICArKypwcDsKLQotICBpZiAoKipwcCAhPSAnficpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgKysqcHA7Ci0KLSAgaWYgKCoqcHAgPT0gJz0nIHx8ICoqcHAgPT0gJysnIHx8ICoqcHAgPT0gJy0nKQotICAgIHsKLSAgICAgIC8qIE9ic29sZXRlIGZsYWdzIHRoYXQgdXNlZCB0byBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2YKLQkgY29uc3RydWN0b3JzIGFuZC9vciBkZXN0cnVjdG9ycy4gKi8KLSAgICAgICsrKnBwOwotICAgIH0KLQotICBpZiAoKipwcCAhPSAnJScpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgKysqcHA7Ci0KLSAgaG9sZCA9ICpwcDsKLQotICAvKiBUaGUgbmV4dCBudW1iZXIgaXMgdGhlIHR5cGUgbnVtYmVyIG9mIHRoZSBiYXNlIGNsYXNzIChwb3NzaWJseQotICAgICBvdXIgb3duIGNsYXNzKSB3aGljaCBzdXBwbGllcyB0aGUgdnRhYmxlIGZvciB0aGlzIGNsYXNzLiAgKi8KLSAgaWYgKCEgcGFyc2Vfc3RhYl90eXBlX251bWJlciAocHAsIHZ0eXBlbnVtcykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2dHlwZW51bXNbMF0gPT0gdHlwZW51bXNbMF0KLSAgICAgICYmIHZ0eXBlbnVtc1sxXSA9PSB0eXBlbnVtc1sxXSkKLSAgICAqcmV0b3dudnB0ciA9IHRydWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkZWJ1Z190eXBlIHZ0eXBlOwotICAgICAgY29uc3QgY2hhciAqcDsKLQotICAgICAgKnBwID0gaG9sZDsKLQotICAgICAgdnR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGZvciAocCA9ICpwcDsgKnAgIT0gJzsnICYmICpwICE9ICdcMCc7IHArKykKLQk7Ci0gICAgICBpZiAoKnAgIT0gJzsnKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgICpyZXR2cHRyYmFzZSA9IHZ0eXBlOwotCi0gICAgICAqcHAgPSBwICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7ICAgIAotfQotCi0vKiBSZWFkIGEgZGVmaW5pdGlvbiBvZiBhbiBhcnJheSB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX3N0YWJfYXJyYXlfdHlwZSAoZGhhbmRsZSwgaW5mbywgcHAsIHN0cmluZ3ApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgYm9vbGVhbiBzdHJpbmdwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjb25zdCBjaGFyICpwOwotICBpbnQgdHlwZW51bXNbMl07Ci0gIGRlYnVnX3R5cGUgaW5kZXhfdHlwZTsKLSAgYm9vbGVhbiBhZGp1c3RhYmxlOwotICBiZmRfc2lnbmVkX3ZtYSBsb3dlciwgdXBwZXI7Ci0gIGRlYnVnX3R5cGUgZWxlbWVudF90eXBlOwotCi0gIC8qIEZvcm1hdCBvZiBhbiBhcnJheSB0eXBlOgotICAgICAiYXI8aW5kZXggdHlwZT47bG93ZXI7dXBwZXI7PGFycmF5X2NvbnRlbnRzX3R5cGU+Ii4KLSAgICAgT1M5MDAwOiAiYXJsb3dlcix1cHBlcjs8YXJyYXlfY29udGVudHNfdHlwZT4iLgotCi0gICAgIEZvcnRyYW4gYWRqdXN0YWJsZSBhcnJheXMgdXNlIEFkaWdpdHMgb3IgVGRpZ2l0cyBmb3IgbG93ZXIgb3IgdXBwZXI7Ci0gICAgIGZvciB0aGVzZSwgcHJvZHVjZSBhIHR5cGUgbGlrZSBmbG9hdFtdW10uICAqLwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KLQotICAvKiBJZiB0aGUgaW5kZXggdHlwZSBpcyB0eXBlIDAsIHdlIHRha2UgaXQgYXMgaW50LiAgKi8KLSAgcCA9ICpwcDsKLSAgaWYgKCEgcGFyc2Vfc3RhYl90eXBlX251bWJlciAoJnAsIHR5cGVudW1zKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICh0eXBlbnVtc1swXSA9PSAwICYmIHR5cGVudW1zWzFdID09IDAgJiYgKipwcCAhPSAnPScpCi0gICAgewotICAgICAgaW5kZXhfdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAoZGhhbmRsZSwgImludCIpOwotICAgICAgaWYgKGluZGV4X3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXsKLQkgIGluZGV4X3R5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0JICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAqcHAgPSBwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluZGV4X3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgfQotCi0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYWRqdXN0YWJsZSA9IGZhbHNlOwotCi0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSAmJiAqKnBwICE9ICctJykKLSAgICB7Ci0gICAgICArKypwcDsKLSAgICAgIGFkanVzdGFibGUgPSB0cnVlOwotICAgIH0KLQotICBsb3dlciA9IChiZmRfc2lnbmVkX3ZtYSkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkgJiYgKipwcCAhPSAnLScpCi0gICAgewotICAgICAgKysqcHA7Ci0gICAgICBhZGp1c3RhYmxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgdXBwZXIgPSAoYmZkX3NpZ25lZF92bWEpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgZWxlbWVudF90eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgaWYgKGVsZW1lbnRfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhZGp1c3RhYmxlKQotICAgIHsKLSAgICAgIGxvd2VyID0gMDsKLSAgICAgIHVwcGVyID0gLTE7Ci0gICAgfQotCi0gIHJldHVybiBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsIGVsZW1lbnRfdHlwZSwgaW5kZXhfdHlwZSwgbG93ZXIsCi0JCQkJdXBwZXIsIHN0cmluZ3ApOwotfQotCi0vKiBUaGlzIHN0cnVjdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBmaWxlcyB3ZSBoYXZlIHNlZW4gdXNpbmcKLSAgIE5fQklOQ0wuICAqLwotCi1zdHJ1Y3QgYmluY2xfZmlsZQotewotICAvKiBUaGUgbmV4dCBOX0JJTkNMIGZpbGUuICAqLwotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbmV4dDsKLSAgLyogVGhlIG5leHQgTl9CSU5DTCBvbiB0aGUgc3RhY2suICAqLwotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbmV4dF9zdGFjazsKLSAgLyogVGhlIGZpbGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFRoZSBoYXNoIHZhbHVlLiAgKi8KLSAgYmZkX3ZtYSBoYXNoOwotICAvKiBUaGUgZmlsZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBmaWxlOwotICAvKiBUaGUgbGlzdCBvZiB0eXBlcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVzICpmaWxlX3R5cGVzOwotfTsKLQotLyogU3RhcnQgYSBuZXcgTl9CSU5DTCBmaWxlLCBwdXNoaW5nIGl0IG9udG8gdGhlIHN0YWNrLiAgKi8KLQotc3RhdGljIHZvaWQKLXB1c2hfYmluY2wgKGluZm8sIG5hbWUsIGhhc2gpCi0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBoYXNoOwotewotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbjsKLQotICBuID0gKHN0cnVjdCBiaW5jbF9maWxlICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG4tPm5leHQgPSBpbmZvLT5iaW5jbF9saXN0OwotICBuLT5uZXh0X3N0YWNrID0gaW5mby0+YmluY2xfc3RhY2s7Ci0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT5oYXNoID0gaGFzaDsKLSAgbi0+ZmlsZSA9IGluZm8tPmZpbGVzOwotICBuLT5maWxlX3R5cGVzID0gTlVMTDsKLSAgaW5mby0+YmluY2xfbGlzdCA9IG47Ci0gIGluZm8tPmJpbmNsX3N0YWNrID0gbjsKLQotICArK2luZm8tPmZpbGVzOwotICBpbmZvLT5maWxlX3R5cGVzID0gKChzdHJ1Y3Qgc3RhYl90eXBlcyAqKikKLQkJICAgICAgeHJlYWxsb2MgKChQVFIpIGluZm8tPmZpbGVfdHlwZXMsCi0JCQkJKGluZm8tPmZpbGVzCi0JCQkJICogc2l6ZW9mICppbmZvLT5maWxlX3R5cGVzKSkpOwotICBpbmZvLT5maWxlX3R5cGVzW24tPmZpbGVdID0gTlVMTDsKLX0KLQotLyogRmluaXNoIGFuIE5fQklOQ0wgZmlsZSwgYXQgYW4gTl9FSU5DTCwgcG9wcGluZyB0aGUgbmFtZSBvZmYgdGhlCi0gICBzdGFjay4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBvcF9iaW5jbCAoaW5mbykKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbzsKLQotICBvID0gaW5mby0+YmluY2xfc3RhY2s7Ci0gIGlmIChvID09IE5VTEwpCi0gICAgcmV0dXJuIGluZm8tPm1haW5fZmlsZW5hbWU7Ci0gIGluZm8tPmJpbmNsX3N0YWNrID0gby0+bmV4dF9zdGFjazsKLQotICBvLT5maWxlX3R5cGVzID0gaW5mby0+ZmlsZV90eXBlc1tvLT5maWxlXTsKLQotICBpZiAoaW5mby0+YmluY2xfc3RhY2sgPT0gTlVMTCkKLSAgICByZXR1cm4gaW5mby0+bWFpbl9maWxlbmFtZTsKLSAgcmV0dXJuIGluZm8tPmJpbmNsX3N0YWNrLT5uYW1lOwotfQotCi0vKiBIYW5kbGUgYW4gTl9FWENMOiBnZXQgdGhlIHR5cGVzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgTl9CSU5DTC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1maW5kX2V4Y2wgKGluZm8sIG5hbWUsIGhhc2gpCi0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBoYXNoOwotewotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbDsKLQotICArK2luZm8tPmZpbGVzOwotICBpbmZvLT5maWxlX3R5cGVzID0gKChzdHJ1Y3Qgc3RhYl90eXBlcyAqKikKLQkJICAgICAgeHJlYWxsb2MgKChQVFIpIGluZm8tPmZpbGVfdHlwZXMsCi0JCQkJKGluZm8tPmZpbGVzCi0JCQkJICogc2l6ZW9mICppbmZvLT5maWxlX3R5cGVzKSkpOwotCi0gIGZvciAobCA9IGluZm8tPmJpbmNsX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgaWYgKGwtPmhhc2ggPT0gaGFzaCAmJiBzdHJjbXAgKGwtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICBicmVhazsKLSAgaWYgKGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB3YXJuX3N0YWIgKG5hbWUsIF8oIlVuZGVmaW5lZCBOX0VYQ0wiKSk7Ci0gICAgICBpbmZvLT5maWxlX3R5cGVzW2luZm8tPmZpbGVzIC0gMV0gPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGluZm8tPmZpbGVfdHlwZXNbaW5mby0+ZmlsZXMgLSAxXSA9IGwtPmZpbGVfdHlwZXM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhIHZhcmlhYmxlIGRlZmluaXRpb24uICBnY2MgZW1pdHMgdmFyaWFibGUgZGVmaW5pdGlvbnMgZm9yIGEKLSAgIGJsb2NrIGJlZm9yZSB0aGUgTl9MQlJBQywgc28gd2UgbXVzdCBob2xkIG9udG8gdGhlbSB1bnRpbCB3ZSBzZWUKLSAgIGl0LiAgVGhlIFN1blBSTyBjb21waWxlciBlbWl0cyB2YXJpYWJsZSBkZWZpbml0aW9ucyBhZnRlciB0aGUKLSAgIE5fTEJSQUMsIHNvIHdlIGNhbiBjYWxsIGRlYnVnX3JlY29yZF92YXJpYWJsZSBpbW1lZGlhdGVseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgdHlwZSwga2luZCwgdmFsKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyICp2OwotCi0gIGlmICgoa2luZCA9PSBERUJVR19HTE9CQUwgfHwga2luZCA9PSBERUJVR19TVEFUSUMpCi0gICAgICB8fCAhIGluZm8tPndpdGhpbl9mdW5jdGlvbgotICAgICAgfHwgKGluZm8tPmdjY19jb21waWxlZCA9PSAwICYmIGluZm8tPm5fb3B0X2ZvdW5kKSkKLSAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1lLCB0eXBlLCBraW5kLCB2YWwpOwotCi0gIHYgPSAoc3RydWN0IHN0YWJfcGVuZGluZ192YXIgKikgeG1hbGxvYyAoc2l6ZW9mICp2KTsKLSAgbWVtc2V0ICh2LCAwLCBzaXplb2YgKnYpOwotCi0gIHYtPm5leHQgPSBpbmZvLT5wZW5kaW5nOwotICB2LT5uYW1lID0gbmFtZTsKLSAgdi0+dHlwZSA9IHR5cGU7Ci0gIHYtPmtpbmQgPSBraW5kOwotICB2LT52YWwgPSB2YWw7Ci0gIGluZm8tPnBlbmRpbmcgPSB2OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBFbWl0IHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMuICBUaGlzIGlzIGNhbGxlZCBhZnRlciB3ZSBzZWUgdGhlCi0gICBOX0xCUkFDIHRoYXQgc3RhcnRzIHRoZSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqdjsKLQotICB2ID0gaW5mby0+cGVuZGluZzsKLSAgd2hpbGUgKHYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqbmV4dDsKLQotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCB2LT5uYW1lLCB2LT50eXBlLCB2LT5raW5kLCB2LT52YWwpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbmV4dCA9IHYtPm5leHQ7Ci0gICAgICBmcmVlICh2KTsKLSAgICAgIHYgPSBuZXh0OwotICAgIH0KLQotICBpbmZvLT5wZW5kaW5nID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluZCB0aGUgc2xvdCBmb3IgYSB0eXBlIGluIHRoZSBkYXRhYmFzZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlICoKLXN0YWJfZmluZF9zbG90IChpbmZvLCB0eXBlbnVtcykKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotewotICBpbnQgZmlsZW51bTsKLSAgaW50IGluZGV4OwotICBzdHJ1Y3Qgc3RhYl90eXBlcyAqKnBzOwotCi0gIGZpbGVudW0gPSB0eXBlbnVtc1swXTsKLSAgaW5kZXggPSB0eXBlbnVtc1sxXTsKLQotICBpZiAoZmlsZW51bSA8IDAgfHwgKHVuc2lnbmVkIGludCkgZmlsZW51bSA+PSBpbmZvLT5maWxlcykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlR5cGUgZmlsZSBudW1iZXIgJWQgb3V0IG9mIHJhbmdlXG4iKSwgZmlsZW51bSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGlmIChpbmRleCA8IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJUeXBlIGluZGV4IG51bWJlciAlZCBvdXQgb2YgcmFuZ2VcbiIpLCBpbmRleCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcHMgPSBpbmZvLT5maWxlX3R5cGVzICsgZmlsZW51bTsKLQotICB3aGlsZSAoaW5kZXggPj0gU1RBQl9UWVBFU19TTE9UUykKLSAgICB7Ci0gICAgICBpZiAoKnBzID09IE5VTEwpCi0JewotCSAgKnBzID0gKHN0cnVjdCBzdGFiX3R5cGVzICopIHhtYWxsb2MgKHNpemVvZiAqKnBzKTsKLQkgIG1lbXNldCAoKnBzLCAwLCBzaXplb2YgKipwcyk7Ci0JfQotICAgICAgcHMgPSAmKCpwcyktPm5leHQ7Ci0gICAgICBpbmRleCAtPSBTVEFCX1RZUEVTX1NMT1RTOwotICAgIH0KLSAgaWYgKCpwcyA9PSBOVUxMKQotICAgIHsKLSAgICAgICpwcyA9IChzdHJ1Y3Qgc3RhYl90eXBlcyAqKSB4bWFsbG9jIChzaXplb2YgKipwcyk7Ci0gICAgICBtZW1zZXQgKCpwcywgMCwgc2l6ZW9mICoqcHMpOwotICAgIH0KLQotICByZXR1cm4gKCpwcyktPnR5cGVzICsgaW5kZXg7Ci19Ci0KLS8qIEZpbmQgYSB0eXBlIGdpdmVuIGEgdHlwZSBudW1iZXIuICBJZiB0aGUgdHlwZSBoYXMgbm90IGJlZW4KLSAgIGFsbG9jYXRlZCB5ZXQsIGNyZWF0ZSBhbiBpbmRpcmVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXN0YWJfZmluZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcykKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgaW50ICp0eXBlbnVtczsKLXsKLSAgZGVidWdfdHlwZSAqc2xvdDsKLQotICBpZiAodHlwZW51bXNbMF0gPT0gMCAmJiB0eXBlbnVtc1sxXSA8IDApCi0gICAgewotICAgICAgLyogQSBuZWdhdGl2ZSB0eXBlIG51bWJlciBpbmRpY2F0ZXMgYW4gWENPRkYgYnVpbHRpbiB0eXBlLiAgKi8KLSAgICAgIHJldHVybiBzdGFiX3hjb2ZmX2J1aWx0aW5fdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXNbMV0pOwotICAgIH0KLQotICBzbG90ID0gc3RhYl9maW5kX3Nsb3QgKGluZm8sIHR5cGVudW1zKTsKLSAgaWYgKHNsb3QgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmICgqc2xvdCA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgc2xvdCwgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0KLSAgcmV0dXJuICpzbG90OwotfQotCi0vKiBSZWNvcmQgdGhhdCBhIGdpdmVuIHR5cGUgbnVtYmVyIHJlZmVycyB0byBhIGdpdmVuIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9yZWNvcmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXMsIHR5cGUpCi0gICAgIFBUUiBkaGFuZGxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgaW50ICp0eXBlbnVtczsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBkZWJ1Z190eXBlICpzbG90OwotCi0gIHNsb3QgPSBzdGFiX2ZpbmRfc2xvdCAoaW5mbywgdHlwZW51bXMpOwotICBpZiAoc2xvdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBnZGIgYXBwZWFycyB0byBpZ25vcmUgdHlwZSByZWRlZmluaXRpb25zLCBzbyB3ZSBkbyBhcyB3ZWxsLiAgKi8KLQotICAqc2xvdCA9IHR5cGU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiBhbiBYQ09GRiBidWlsdGluIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotc3RhYl94Y29mZl9idWlsdGluX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW0pCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGludCB0eXBlbnVtOwotewotICBkZWJ1Z190eXBlIHJldHR5cGU7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaWYgKHR5cGVudW0gPj0gMCB8fCB0eXBlbnVtIDwgLVhDT0ZGX1RZUEVfQ09VTlQpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgWENPRkYgdHlwZSAlZFxuIiksIHR5cGVudW0pOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0gIGlmIChpbmZvLT54Y29mZl90eXBlc1stdHlwZW51bV0gIT0gTlVMTCkKLSAgICByZXR1cm4gaW5mby0+eGNvZmZfdHlwZXNbLXR5cGVudW1dOwotCi0gIHN3aXRjaCAoLXR5cGVudW0pCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIC8qIFRoZSBzaXplIG9mIHRoaXMgYW5kIGFsbCB0aGUgb3RoZXIgdHlwZXMgYXJlIGZpeGVkLCBkZWZpbmVkCi0JIGJ5IHRoZSBkZWJ1Z2dpbmcgZm9ybWF0LiAgKi8KLSAgICAgIG5hbWUgPSAiaW50IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBuYW1lID0gImNoYXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIG5hbWUgPSAic2hvcnQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIG5hbWUgPSAibG9uZyI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBjaGFyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgIG5hbWUgPSAic2lnbmVkIGNoYXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNzoKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgc2hvcnQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBpbnQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5OgotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgY2FzZSAxMDoKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDExOgotICAgICAgbmFtZSA9ICJ2b2lkIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyOgotICAgICAgLyogSUVFRSBzaW5nbGUgcHJlY2lzaW9uICgzMiBiaXQpLiAgKi8KLSAgICAgIG5hbWUgPSAiZmxvYXQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEzOgotICAgICAgLyogSUVFRSBkb3VibGUgcHJlY2lzaW9uICg2NCBiaXQpLiAgKi8KLSAgICAgIG5hbWUgPSAiZG91YmxlIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNDoKLSAgICAgIC8qIFRoaXMgaXMgYW4gSUVFRSBkb3VibGUgb24gdGhlIFJTLzYwMDAsIGFuZCBkaWZmZXJlbnQgbWFjaGluZXMKLQkgd2l0aCBkaWZmZXJlbnQgc2l6ZXMgZm9yICJsb25nIGRvdWJsZSIgc2hvdWxkIHVzZSBkaWZmZXJlbnQKLQkgbmVnYXRpdmUgdHlwZSBudW1iZXJzLiAgU2VlIHN0YWJzLnRleGluZm8uICAqLwotICAgICAgbmFtZSA9ICJsb25nIGRvdWJsZSI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTU6Ci0gICAgICBuYW1lID0gImludGVnZXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBuYW1lID0gImJvb2xlYW4iOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTc6Ci0gICAgICBuYW1lID0gInNob3J0IHJlYWwiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE4OgotICAgICAgbmFtZSA9ICJyZWFsIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOToKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBuYW1lID0gInN0cmluZ3B0ciI7Ci0gICAgICByZXR0eXBlID0gTlVMTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjA6Ci0gICAgICAvKiBGSVhNRSAqLwotICAgICAgbmFtZSA9ICJjaGFyYWN0ZXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMToKLSAgICAgIG5hbWUgPSAibG9naWNhbCoxIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoZGhhbmRsZSwgMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDIyOgotICAgICAgbmFtZSA9ICJsb2dpY2FsKjIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCAyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjM6Ci0gICAgICBuYW1lID0gImxvZ2ljYWwqNCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIG5hbWUgPSAibG9naWNhbCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNToKLSAgICAgIC8qIENvbXBsZXggdHlwZSBjb25zaXN0aW5nIG9mIHR3byBJRUVFIHNpbmdsZSBwcmVjaXNpb24gdmFsdWVzLiAgKi8KLSAgICAgIG5hbWUgPSAiY29tcGxleCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNjoKLSAgICAgIC8qIENvbXBsZXggdHlwZSBjb25zaXN0aW5nIG9mIHR3byBJRUVFIGRvdWJsZSBwcmVjaXNpb24gdmFsdWVzLiAgKi8KLSAgICAgIG5hbWUgPSAiZG91YmxlIGNvbXBsZXgiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI3OgotICAgICAgbmFtZSA9ICJpbnRlZ2VyKjEiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjg6Ci0gICAgICBuYW1lID0gImludGVnZXIqMiI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOToKLSAgICAgIG5hbWUgPSAiaW50ZWdlcio0IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMwOgotICAgICAgLyogRklYTUUgKi8KLSAgICAgIG5hbWUgPSAid2NoYXIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzE6Ci0gICAgICBuYW1lID0gImxvbmcgbG9uZyI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyBsb25nIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzM6Ci0gICAgICBuYW1lID0gImxvZ2ljYWwqOCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzNDoKLSAgICAgIG5hbWUgPSAiaW50ZWdlcio4IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHR5cGUgPSBkZWJ1Z19uYW1lX3R5cGUgKGRoYW5kbGUsIG5hbWUsIHJldHR5cGUpOwotCi0gIGluZm8tPnhjb2ZmX3R5cGVzWy10eXBlbnVtXSA9IHJldHR5cGU7Ci0KLSAgcmV0dXJuIHJldHR5cGU7Ci19Ci0KLS8qIEZpbmQgb3IgY3JlYXRlIGEgdGFnZ2VkIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotc3RhYl9maW5kX3RhZ2dlZF90eXBlIChkaGFuZGxlLCBpbmZvLCBwLCBsZW4sIGtpbmQpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgIGludCBsZW47Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGRlYnVnX3R5cGUgZHR5cGU7Ci0gIHN0cnVjdCBzdGFiX3RhZyAqc3Q7Ci0KLSAgbmFtZSA9IHNhdmVzdHJpbmcgKHAsIGxlbik7Ci0KLSAgLyogV2UgcGFzcyBERUJVR19LSU5EX0lMTEVHQUwgYmVjYXVzZSB3ZSB3YW50IGFsbCB0YWdzIGluIHRoZSBzYW1lCi0gICAgIG5hbWVzcGFjZS4gIFRoaXMgaXMgcmlnaHQgZm9yIEMsIGFuZCBJIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZQotICAgICBvdGhlciBsYW5ndWFnZXMuICBGSVhNRS4gICovCi0gIGR0eXBlID0gZGVidWdfZmluZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgbmFtZSwgREVCVUdfS0lORF9JTExFR0FMKTsKLSAgaWYgKGR0eXBlICE9IERFQlVHX1RZUEVfTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChuYW1lKTsKLSAgICAgIHJldHVybiBkdHlwZTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBlbnRyeSBvbiB0aGUgdW5kZWZpbmVkIHRhZyBsaXN0LiAgKi8KLSAgZm9yIChzdCA9IGluZm8tPnRhZ3M7IHN0ICE9IE5VTEw7IHN0ID0gc3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0LT5uYW1lWzBdID09IG5hbWVbMF0KLQkgICYmIHN0cmNtcCAoc3QtPm5hbWUsIG5hbWUpID09IDApCi0JewotCSAgaWYgKHN0LT5raW5kID09IERFQlVHX0tJTkRfSUxMRUdBTCkKLQkgICAgc3QtPmtpbmQgPSBraW5kOwotCSAgZnJlZSAobmFtZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBpZiAoc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdCA9IChzdHJ1Y3Qgc3RhYl90YWcgKikgeG1hbGxvYyAoc2l6ZW9mICpzdCk7Ci0gICAgICBtZW1zZXQgKHN0LCAwLCBzaXplb2YgKnN0KTsKLQotICAgICAgc3QtPm5leHQgPSBpbmZvLT50YWdzOwotICAgICAgc3QtPm5hbWUgPSBuYW1lOwotICAgICAgc3QtPmtpbmQgPSBraW5kOwotICAgICAgc3QtPnNsb3QgPSBERUJVR19UWVBFX05VTEw7Ci0gICAgICBzdC0+dHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgJnN0LT5zbG90LCBuYW1lKTsKLSAgICAgIGluZm8tPnRhZ3MgPSBzdDsKLSAgICB9Ci0KLSAgcmV0dXJuIHN0LT50eXBlOwotfQotDAotLyogSW4gb3JkZXIgdG8gZ2V0IHRoZSBjb3JyZWN0IGFyZ3VtZW50IHR5cGVzIGZvciBhIHN0dWJiZWQgbWV0aG9kLCB3ZQotICAgbmVlZCB0byBleHRyYWN0IHRoZSBhcmd1bWVudCB0eXBlcyBmcm9tIGEgQysrIG1hbmdsZWQgc3RyaW5nLgotICAgU2luY2UgdGhlIGFyZ3VtZW50IHR5cGVzIGNhbiByZWZlciBiYWNrIHRvIHRoZSByZXR1cm4gdHlwZSwgdGhpcwotICAgbWVhbnMgdGhhdCB3ZSBtdXN0IGRlbWFuZ2xlIHRoZSBlbnRpcmUgcGh5c2ljYWwgbmFtZS4gIEluIGdkYiB0aGlzCi0gICBpcyBkb25lIGJ5IGNhbGxpbmcgY3BsdXNfZGVtYW5nbGUgYW5kIHJ1bm5pbmcgdGhlIHJlc3VsdHMgYmFjawotICAgdGhyb3VnaCB0aGUgQysrIGV4cHJlc3Npb24gcGFyc2VyLiAgU2luY2Ugd2UgaGF2ZSBubyBleHByZXNzaW9uCi0gICBwYXJzZXIsIHdlIG11c3QgZHVwbGljYXRlIG11Y2ggb2YgdGhlIHdvcmsgb2YgY3BsdXNfZGVtYW5nbGUgaGVyZS4KLQotICAgV2UgYXNzdW1lIHRoYXQgR05VIHN0eWxlIGRlbWFuZ2xpbmcgaXMgdXNlZCwgc2luY2UgdGhpcyBpcyBvbmx5Ci0gICBkb25lIGZvciBtZXRob2Qgc3R1YnMsIGFuZCBvbmx5IGcrKyBzaG91bGQgb3V0cHV0IHRoYXQgZm9ybSBvZgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIGEgcG9pbnRlciB0byB0eXBlIGluZm9ybWF0aW9uIHdoaWNoCi0gICBkZW1hbmdsaW5nIGEgc3RyaW5nLiAgKi8KLQotc3RydWN0IHN0YWJfZGVtYW5nbGVfdHlwZXN0cmluZwotewotICAvKiBUaGUgc3RhcnQgb2YgdGhlIHR5cGUuICBUaGlzIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQuICAqLwotICBjb25zdCBjaGFyICp0eXBlc3RyaW5nOwotICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IGxlbjsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiB3aGlsZSBkZW1hbmdsaW5nIGEKLSAgIHN0cmluZy4gICovCi0KLXN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8KLXsKLSAgLyogVGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBoYW5kbGUuICAqLwotICBQVFIgZGhhbmRsZTsKLSAgLyogVGhlIHN0YWIgaW5mb3JtYXRpb24gaGFuZGxlLiAgKi8KLSAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAvKiBUaGUgYXJyYXkgb2YgYXJndW1lbnRzIHdlIGFyZSBidWlsZGluZy4gICovCi0gIGRlYnVnX3R5cGUgKmFyZ3M7Ci0gIC8qIFdoZXRoZXIgdGhlIG1ldGhvZCB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICAqLwotICBib29sZWFuIHZhcmFyZ3M7Ci0gIC8qIFRoZSBhcnJheSBvZiB0eXBlcyB3ZSBoYXZlIHJlbWVtYmVyZWQuICAqLwotICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV90eXBlc3RyaW5nICp0eXBlc3RyaW5nczsKLSAgLyogVGhlIG51bWJlciBvZiB0eXBlc3RyaW5ncy4gICovCi0gIHVuc2lnbmVkIGludCB0eXBlc3RyaW5nX2NvdW50OwotICAvKiBUaGUgbnVtYmVyIG9mIHR5cGVzdHJpbmcgc2xvdHMgd2UgaGF2ZSBhbGxvY2F0ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgdHlwZXN0cmluZ19hbGxvYzsKLX07Ci0KLXN0YXRpYyB2b2lkIHN0YWJfYmFkX2RlbWFuZ2xlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBzdGFiX2RlbWFuZ2xlX2NvdW50IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX3ByZWZpeAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfZnVuY3Rpb25fbmFtZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9zaWduYXR1cmUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX3F1YWxpZmllZAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfY2xhc3MKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2FyZ3MKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z190eXBlICoqLAotCSAgIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9hcmcKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z190eXBlICoqLAotCSAgIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgZGVidWdfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotLyogV2FybiBhYm91dCBhIGJhZCBkZW1hbmdsaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXN0YWJfYmFkX2RlbWFuZ2xlIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oImJhZCBtYW5nbGVkIG5hbWUgYCVzJ1xuIiksIHMpOwotfQotCi0vKiBHZXQgYSBjb3VudCBmcm9tIGEgc3RhYiBzdHJpbmcuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1zdGFiX2RlbWFuZ2xlX2NvdW50IChwcCkKLSAgICAgY29uc3QgY2hhciAqKnBwOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgY291bnQgPSAwOwotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotICAgIHsKLSAgICAgIGNvdW50ICo9IDEwOwotICAgICAgY291bnQgKz0gKipwcCAtICcwJzsKLSAgICAgICsrKnBwOwotICAgIH0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKiBSZXF1aXJlIGEgY291bnQgaW4gYSBzdHJpbmcuICBUaGUgY291bnQgbWF5IGJlIG11bHRpcGxlIGRpZ2l0cywgaW4KLSAgIHdoaWNoIGNhc2UgaXQgbXVzdCBlbmQgaW4gYW4gdW5kZXJzY29yZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsIHBpKQotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIHVuc2lnbmVkIGludCAqcGk7Ci17Ci0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnBpID0gKipwcCAtICcwJzsKLSAgKysqcHA7Ci0gIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGNvdW50OwotICAgICAgY29uc3QgY2hhciAqcDsKLQotICAgICAgY291bnQgPSAqcGk7Ci0gICAgICBwID0gKnBwOwotICAgICAgZG8KLQl7Ci0JICBjb3VudCAqPSAxMDsKLQkgIGNvdW50ICs9ICpwIC0gJzAnOwotCSAgKytwOwotCX0KLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApKTsKLSAgICAgIGlmICgqcCA9PSAnXycpCi0JewotCSAgKnBwID0gcCArIDE7Ci0JICAqcGkgPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGRlbWFuZ2xlcyBhIHBoeXNpY2FsIG5hbWUsIHJldHVybmluZyBhIE5VTEwKLSAgIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZSAqCi1zdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzIChkaGFuZGxlLCBpbmZvLCBwaHlzbmFtZSwgcHZhcmFyZ3MpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBib29sZWFuICpwdmFyYXJnczsKLXsKLSAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyBtaW5mbzsKLQotICBtaW5mby5kaGFuZGxlID0gZGhhbmRsZTsKLSAgbWluZm8uaW5mbyA9IGluZm87Ci0gIG1pbmZvLmFyZ3MgPSBOVUxMOwotICBtaW5mby52YXJhcmdzID0gZmFsc2U7Ci0gIG1pbmZvLnR5cGVzdHJpbmdfYWxsb2MgPSAxMDsKLSAgbWluZm8udHlwZXN0cmluZ3MgPSAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX3R5cGVzdHJpbmcgKikKLQkJICAgICAgIHhtYWxsb2MgKG1pbmZvLnR5cGVzdHJpbmdfYWxsb2MKLQkJCQkqIHNpemVvZiAqbWluZm8udHlwZXN0cmluZ3MpKTsKLSAgbWluZm8udHlwZXN0cmluZ19jb3VudCA9IDA7Ci0KLSAgLyogY3BsdXNfZGVtYW5nbGUgY2hlY2tzIGZvciBzcGVjaWFsIEdOVSBtYW5nbGVkIGZvcm1zLCBidXQgd2UgY2FuJ3QKLSAgICAgc2VlIGFueSBvZiB0aGVtIGluIG1hbmdsZWQgbWV0aG9kIGFyZ3VtZW50IHR5cGVzLiAgKi8KLQotICBpZiAoISBzdGFiX2RlbWFuZ2xlX3ByZWZpeCAoJm1pbmZvLCAmcGh5c25hbWUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICgqcGh5c25hbWUgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3NpZ25hdHVyZSAoJm1pbmZvLCAmcGh5c25hbWUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBmcmVlIChtaW5mby50eXBlc3RyaW5ncyk7Ci0gIG1pbmZvLnR5cGVzdHJpbmdzID0gTlVMTDsKLQotICBpZiAobWluZm8uYXJncyA9PSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygibm8gYXJndW1lbnQgdHlwZXMgaW4gbWFuZ2xlZCBzdHJpbmdcbiIpKTsKLQotICAqcHZhcmFyZ3MgPSBtaW5mby52YXJhcmdzOwotICByZXR1cm4gbWluZm8uYXJnczsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKG1pbmZvLnR5cGVzdHJpbmdzICE9IE5VTEwpCi0gICAgZnJlZSAobWluZm8udHlwZXN0cmluZ3MpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRGVtYW5nbGUgdGhlIHByZWZpeCBvZiB0aGUgbWFuZ2xlZCBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfcHJlZml4IChtaW5mbywgcHApCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci17Ci0gIGNvbnN0IGNoYXIgKnNjYW47Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIGNwbHVzX2RlbWFuZ2xlIGNoZWNrcyBmb3IgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMsCi0gICAgIGJ1dCB3ZSBjYW4ndCBzZWUgdGhlbSBpbiBtYW5nbGVkIGFyZ3VtZW50IHR5cGVzLiAgKi8KLQotICAvKiBMb29rIGZvciBgX18nLiAgKi8KLSAgc2NhbiA9ICpwcDsKLSAgZG8KLSAgICB7Ci0gICAgICBzY2FuID0gc3RyY2hyIChzY2FuLCAnXycpOwotICAgIH0KLSAgd2hpbGUgKHNjYW4gIT0gTlVMTCAmJiAqKytzY2FuICE9ICdfJyk7Ci0KLSAgaWYgKHNjYW4gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAoKnBwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLS1zY2FuOwotCi0gIC8qIFdlIGZvdW5kIGBfXyc7IG1vdmUgYWhlYWQgdG8gdGhlIGxhc3QgY29udGlndW91cyBgX18nIHBhaXIuICAqLwotICBpID0gc3Ryc3BuIChzY2FuLCAiXyIpOwotICBpZiAoaSA+IDIpCi0gICAgc2NhbiArPSBpIC0gMjsKLQotICBpZiAoc2NhbiA9PSAqcHAKLSAgICAgICYmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc2NhblsyXSkKLQkgIHx8IHNjYW5bMl0gPT0gJ1EnCi0JICB8fCBzY2FuWzJdID09ICd0JykpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIEdOVSBzdHlsZSBjb25zdHJ1Y3RvciBuYW1lLiAgKi8KLSAgICAgICpwcCA9IHNjYW4gKyAyOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlIGlmIChzY2FuID09ICpwcAotCSAgICYmICEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHNjYW5bMl0pCi0JICAgJiYgc2NhblsyXSAhPSAndCcpCi0gICAgewotICAgICAgLyogTG9vayBmb3IgdGhlIGBfXycgdGhhdCBzZXBhcmF0ZXMgdGhlIHByZWZpeCBmcm9tIHRoZQotICAgICAgICAgc2lnbmF0dXJlLiAgKi8KLSAgICAgIHdoaWxlICgqc2NhbiA9PSAnXycpCi0JKytzY2FuOwotICAgICAgc2NhbiA9IHN0cnN0ciAoc2NhbiwgIl9fIik7Ci0gICAgICBpZiAoc2NhbiA9PSBOVUxMIHx8IHNjYW5bMl0gPT0gJ1wwJykKLQl7Ci0JICBzdGFiX2JhZF9kZW1hbmdsZSAoKnBwKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHJldHVybiBzdGFiX2RlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgKG1pbmZvLCBwcCwgc2Nhbik7Ci0gICAgfQotICBlbHNlIGlmIChzY2FuWzJdICE9ICdcMCcpCi0gICAgewotICAgICAgLyogVGhlIG5hbWUgZG9lc24ndCBzdGFydCB3aXRoIGBfXycsIGJ1dCBpdCBkb2VzIGNvbnRhaW4gYF9fJy4gICovCi0gICAgICByZXR1cm4gc3RhYl9kZW1hbmdsZV9mdW5jdGlvbl9uYW1lIChtaW5mbywgcHAsIHNjYW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlICgqcHApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogRGVtYW5nbGUgYSBmdW5jdGlvbiBuYW1lIHByZWZpeC4gIFRoZSBzY2FuIGFyZ3VtZW50IHBvaW50cyB0byB0aGUKLSAgIGRvdWJsZSB1bmRlcnNjb3JlIHdoaWNoIHNlcGFyYXRlcyB0aGUgZnVuY3Rpb24gbmFtZSBmcm9tIHRoZQotICAgc2lnbmF0dXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAobWluZm8sIHBwLCBzY2FuKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBjb25zdCBjaGFyICpzY2FuOwotewotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBzdHJpbmcgZnJvbSAqcHAgdG8gc2NhbiBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICBXZQotICAgICBkb24ndCBjYXJlIGFib3V0IHRoZSBuYW1lLCBzaW5jZSB3ZSBqdXN0IGxvb2tpbmcgZm9yIGFyZ3VtZW50Ci0gICAgIHR5cGVzLiAgSG93ZXZlciwgZm9yIGNvbnZlcnNpb24gb3BlcmF0b3JzLCB0aGUgbmFtZSBtYXkgaW5jbHVkZSBhCi0gICAgIHR5cGUgd2hpY2ggd2UgbXVzdCByZW1lbWJlciBpbiBvcmRlciB0byBoYW5kbGUgYmFja3JlZmVyZW5jZXMuICAqLwotCi0gIG5hbWUgPSAqcHA7Ci0gICpwcCA9IHNjYW4gKyAyOwotCi0gIGlmICgqcHAgLSBuYW1lID49IDUKLQkgICAmJiBzdHJuY21wIChuYW1lLCAidHlwZSIsIDQpID09IDAKLQkgICAmJiAobmFtZVs0XSA9PSAnJCcgfHwgbmFtZVs0XSA9PSAnLicpKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnRlbTsKLQotICAgICAgLyogVGhpcyBpcyBhIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCi0gICAgICB0ZW0gPSBuYW1lICsgNTsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sICZ0ZW0sIChkZWJ1Z190eXBlICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKG5hbWVbMF0gPT0gJ18nCi0JICAgJiYgbmFtZVsxXSA9PSAnXycKLQkgICAmJiBuYW1lWzJdID09ICdvJwotCSAgICYmIG5hbWVbM10gPT0gJ3AnKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnRlbTsKLQotICAgICAgLyogVGhpcyBpcyBhIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCi0gICAgICB0ZW0gPSBuYW1lICsgNDsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sICZ0ZW0sIChkZWJ1Z190eXBlICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIHRoZSBzaWduYXR1cmUuICBUaGlzIGlzIHdoZXJlIHRoZSBhcmd1bWVudCB0eXBlcyBhcmUKLSAgIGZvdW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfc2lnbmF0dXJlIChtaW5mbywgcHApCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGJvb2xlYW4gZXhwZWN0X2Z1bmMsIGZ1bmNfZG9uZTsKLSAgY29uc3QgY2hhciAqaG9sZDsKLQotICBvcmlnID0gKnBwOwotCi0gIGV4cGVjdF9mdW5jID0gZmFsc2U7Ci0gIGZ1bmNfZG9uZSA9IGZhbHNlOwotICBob2xkID0gTlVMTDsKLQotICB3aGlsZSAoKipwcCAhPSAnXDAnKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKipwcCkKLQl7Ci0JY2FzZSAnUSc6Ci0JICBob2xkID0gKnBwOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQgKG1pbmZvLCBwcCwgKGRlYnVnX3R5cGUgKikgTlVMTCkKLQkgICAgICB8fCAhIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIGhvbGQsICpwcCAtIGhvbGQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBleHBlY3RfZnVuYyA9IHRydWU7Ci0JICBob2xkID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUyc6Ci0JICAvKiBTdGF0aWMgbWVtYmVyIGZ1bmN0aW9uLiAgRklYTUU6IENhbiB0aGlzIGhhcHBlbj8gICovCi0JICBpZiAoaG9sZCA9PSBOVUxMKQotCSAgICBob2xkID0gKnBwOwotCSAgKysqcHA7Ci0JICBicmVhazsKLQotCWNhc2UgJ0MnOgotCSAgLyogQ29uc3QgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KLQkgIGlmIChob2xkID09IE5VTEwpCi0JICAgIGhvbGQgPSAqcHA7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkgIGlmIChob2xkID09IE5VTEwpCi0JICAgIGhvbGQgPSAqcHA7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2NsYXNzIChtaW5mbywgcHAsIChjb25zdCBjaGFyICoqKSBOVUxMKQotCSAgICAgIHx8ICEgc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlIChtaW5mbywgaG9sZCwgKnBwIC0gaG9sZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGV4cGVjdF9mdW5jID0gdHJ1ZTsKLQkgIGhvbGQgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlICdGJzoKLQkgIC8qIEZ1bmN0aW9uLiAgSSBkb24ndCBrbm93IGlmIHRoaXMgYWN0dWFsbHkgaGFwcGVucyB3aXRoIGcrKwotICAgICAgICAgICAgIG91dHB1dC4gICovCi0JICBob2xkID0gTlVMTDsKLQkgIGZ1bmNfZG9uZSA9IHRydWU7Ci0JICArKypwcDsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCAmbWluZm8tPmFyZ3MsICZtaW5mby0+dmFyYXJncykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAndCc6Ci0JICAvKiBUZW1wbGF0ZS4gICovCi0JICBpZiAoaG9sZCA9PSBOVUxMKQotCSAgICBob2xkID0gKnBwOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLCAoY2hhciAqKikgTlVMTCkKLQkgICAgICB8fCAhIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIGhvbGQsICpwcCAtIGhvbGQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBob2xkID0gTlVMTDsKLQkgIGV4cGVjdF9mdW5jID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnXyc6Ci0JICAvKiBBdCB0aGUgb3V0ZXJtb3N0IGxldmVsLCB3ZSBjYW5ub3QgaGF2ZSBhIHJldHVybiB0eXBlCi0JICAgICBzcGVjaWZpZWQsIHNvIGlmIHdlIHJ1biBpbnRvIGFub3RoZXIgJ18nIGF0IHRoaXMgcG9pbnQgd2UKLQkgICAgIGFyZSBkZWFsaW5nIHdpdGggYSBtYW5nbGVkIG5hbWUgdGhhdCBpcyBlaXRoZXIgYm9ndXMsIG9yCi0JICAgICBoYXMgYmVlbiBtYW5nbGVkIGJ5IHNvbWUgYWxnb3JpdGhtIHdlIGRvbid0IGtub3cgaG93IHRvCi0JICAgICBkZWFsIHdpdGguICBTbyBqdXN0IHJlamVjdCB0aGUgZW50aXJlIGRlbWFuZ2xpbmcuICAqLwotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCi0JZGVmYXVsdDoKLQkgIC8qIEFzc3VtZSB3ZSBoYXZlIHN0dW1ibGVkIG9udG8gdGhlIGZpcnN0IG91dGVybW9zdCBmdW5jdGlvbgotCSAgICAgYXJndW1lbnQgdG9rZW4sIGFuZCBzdGFydCBwcm9jZXNzaW5nIGFyZ3MuICAqLwotCSAgZnVuY19kb25lID0gdHJ1ZTsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCAmbWluZm8tPmFyZ3MsICZtaW5mby0+dmFyYXJncykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGV4cGVjdF9mdW5jKQotCXsKLQkgIGZ1bmNfZG9uZSA9IHRydWU7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwgJm1pbmZvLT5hcmdzLCAmbWluZm8tPnZhcmFyZ3MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISBmdW5jX2RvbmUpCi0gICAgewotICAgICAgLyogV2l0aCBHTlUgc3R5bGUgZGVtYW5nbGluZywgYmFyX18zZm9vIGlzICdmb286OmJhcih2b2lkKScsIGFuZAotCSBiYXJfXzNmb29pIGlzICdmb286OmJhcihpbnQpJy4gIFdlIGdldCBoZXJlIHdoZW4gd2UgZmluZCB0aGUKLQkgZmlyc3QgY2FzZSwgYW5kIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlICcodm9pZCknIGdldHMgYWRkZWQKLQkgdG8gdGhlIGN1cnJlbnQgZGVjbHAuICAqLwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmdzIChtaW5mbywgcHAsICZtaW5mby0+YXJncywgJm1pbmZvLT52YXJhcmdzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBhIHF1YWxpZmllZCBuYW1lLCBzdWNoIGFzICJRMjVPdXRlcjVJbm5lciIgd2hpY2ggaXMgdGhlCi0gICBtYW5nbGVkIGZvcm0gb2YgIk91dGVyOjpJbm5lciIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQgKG1pbmZvLCBwcCwgcHR5cGUpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKnB0eXBlOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjb25zdCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgcXVhbGlmaWVyczsKLSAgZGVidWdfdHlwZSBjb250ZXh0OwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgc3dpdGNoICgoKnBwKVsxXSkKLSAgICB7Ci0gICAgY2FzZSAnXyc6Ci0gICAgICAvKiBHTlUgbWFuZ2xlZCBuYW1lIHdpdGggbW9yZSB0aGFuIDkgY2xhc3Nlcy4gIFRoZSBjb3VudCBpcwotCSBwcmVjZWRlZCBieSBhbiB1bmRlcnNjb3JlICh0byBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZSA8PSA5Ci0JIGNhc2UpIGFuZCBmb2xsb3dlZCBieSBhbiB1bmRlcnNjb3JlLiAgKi8KLSAgICAgIHAgPSAqcHAgKyAyOwotICAgICAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSB8fCAqcCA9PSAnMCcpCi0JewotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHF1YWxpZmllcnMgPSBhdG9pIChwKTsKLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApKQotCSsrcDsKLSAgICAgIGlmICgqcCAhPSAnXycpCi0JewotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICpwcCA9IHAgKyAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzogY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0gICAgICBxdWFsaWZpZXJzID0gKCpwcClbMV0gLSAnMCc7Ci0gICAgICAvKiBTa2lwIGFuIG9wdGlvbmFsIHVuZGVyc2NvcmUgYWZ0ZXIgdGhlIGNvdW50LiAgKi8KLSAgICAgIGlmICgoKnBwKVsyXSA9PSAnXycpCi0JKysqcHA7Ci0gICAgICAqcHAgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMCc6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKLQotICAvKiBQaWNrIG9mZiB0aGUgbmFtZXMuICAqLwotICB3aGlsZSAocXVhbGlmaWVycy0tID4gMCkKLSAgICB7Ci0gICAgICBpZiAoKipwcCA9PSAnXycpCi0JKysqcHA7Ci0gICAgICBpZiAoKipwcCA9PSAndCcpCi0JewotCSAgY2hhciAqbmFtZTsKLQotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLAotCQkJCQlwdHlwZSAhPSBOVUxMID8gJm5hbWUgOiBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAocHR5cGUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNvbnRleHQgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBtaW5mby0+aW5mbywKLQkJCQkJICAgICAgIG5hbWUsIHN0cmxlbiAobmFtZSksCi0JCQkJCSAgICAgICBERUJVR19LSU5EX0NMQVNTKTsKLQkgICAgICBmcmVlIChuYW1lKTsKLQkgICAgICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbGVuOwotCi0JICBsZW4gPSBzdGFiX2RlbWFuZ2xlX2NvdW50IChwcCk7Ci0JICBpZiAoc3RybGVuICgqcHApIDwgbGVuKQotCSAgICB7Ci0JICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAocHR5cGUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNvbnN0IGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0KLQkgICAgICBmaWVsZHMgPSBOVUxMOwotCSAgICAgIGlmIChjb250ZXh0ICE9IERFQlVHX1RZUEVfTlVMTCkKLQkJZmllbGRzID0gZGVidWdfZ2V0X2ZpZWxkcyAobWluZm8tPmRoYW5kbGUsIGNvbnRleHQpOwotCi0JICAgICAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKLQotCSAgICAgIGlmIChmaWVsZHMgIT0gTlVMTCkKLQkJewotCQkgIGNoYXIgKm5hbWU7Ci0KLQkJICAvKiBUcnkgdG8gZmluZCB0aGUgdHlwZSBieSBsb29raW5nIHRocm91Z2ggdGhlCi0gICAgICAgICAgICAgICAgICAgICBmaWVsZHMgb2YgY29udGV4dCB1bnRpbCB3ZSBmaW5kIGEgZmllbGQgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHNhbWUgdHlwZS4gIFRoaXMgb3VnaHQgdG8gd29yayBmb3IgYSBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCB3aXRoaW4gYSBjbGFzcywgYnV0IGl0IHdvbid0IHdvcmsgZm9yLAotICAgICAgICAgICAgICAgICAgICAgZS5nLiwgYW4gZW51bSBkZWZpbmVkIHdpdGhpbiBhIGNsYXNzLiAgc3RhYnMgZG9lcwotICAgICAgICAgICAgICAgICAgICAgbm90IGdpdmUgdXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICBsYXR0ZXIgY2FzZS4gICovCi0KLQkJICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBsZW4pOwotCi0JCSAgZm9yICg7ICpmaWVsZHMgIT0gREVCVUdfRklFTERfTlVMTDsgZmllbGRzKyspCi0JCSAgICB7Ci0JCSAgICAgIGRlYnVnX3R5cGUgZnQ7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKmRuOwotCi0JCSAgICAgIGZ0ID0gZGVidWdfZ2V0X2ZpZWxkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqZmllbGRzKTsKLQkJICAgICAgaWYgKGZ0ID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGRuID0gZGVidWdfZ2V0X3R5cGVfbmFtZSAobWluZm8tPmRoYW5kbGUsIGZ0KTsKLQkJICAgICAgaWYgKGRuICE9IE5VTEwgJiYgc3RyY21wIChkbiwgbmFtZSkgPT0gMCkKLQkJCXsKLQkJCSAgY29udGV4dCA9IGZ0OwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGZyZWUgKG5hbWUpOwotCQl9Ci0KLQkgICAgICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0JCXsKLQkJICAvKiBXZSBoYXZlIHRvIGZhbGwgYmFjayBvbiBmaW5kaW5nIHRoZSB0eXBlIGJ5IG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICBJZiB0aGVyZSBhcmUgbW9yZSB0eXBlcyB0byBjb21lLCB0aGVuIHRoaXMgbXVzdAotICAgICAgICAgICAgICAgICAgICAgYmUgYSBjbGFzcy4gIE90aGVyd2lzZSwgaXQgY291bGQgYmUgYW55dGhpbmcuICAqLwotCi0JCSAgaWYgKHF1YWxpZmllcnMgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY2hhciAqbmFtZTsKLQotCQkgICAgICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBsZW4pOwotCQkgICAgICBjb250ZXh0ID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJCSAgICAgICBuYW1lKTsKLQkJICAgICAgZnJlZSAobmFtZSk7Ci0JCSAgICB9Ci0KLQkJICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGNvbnRleHQgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAotCQkJCQkJICAgICAgIG1pbmZvLT5pbmZvLAotCQkJCQkJICAgICAgICpwcCwgbGVuLAotCQkJCQkJICAgICAgIChxdWFsaWZpZXJzID09IDAKLQkJCQkJCQk/IERFQlVHX0tJTkRfSUxMRUdBTAotCQkJCQkJCTogREVCVUdfS0lORF9DTEFTUykpOwotCQkgICAgICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAqcHAgKz0gbGVuOwotCX0KLSAgICB9Ci0KLSAgaWYgKHB0eXBlICE9IE5VTEwpCi0gICAgKnB0eXBlID0gY29udGV4dDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgYSB0ZW1wbGF0ZS4gIElmIFBOQU1FIGlzIG5vdCBOVUxMLCB0aGlzIHNldHMgKlBOQU1FIHRvIGEKLSAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLCBwbmFtZSkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgY2hhciAqKnBuYW1lOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICB1bnNpZ25lZCBpbnQgciwgaTsKLQotICBvcmlnID0gKnBwOwotCi0gICsrKnBwOwotCi0gIC8qIFNraXAgdGhlIHRlbXBsYXRlIG5hbWUuICAqLwotICByID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOwotICBpZiAociA9PSAwIHx8IHN0cmxlbiAoKnBwKSA8IHIpCi0gICAgewotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKnBwICs9IHI7Ci0KLSAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgbGlzdC4gICovCi0gIGlmIChzdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsICZyKSA9PSAwKQotICAgIHsKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoKipwcCA9PSAnWicpCi0JewotCSAgLyogVGhpcyBpcyBhIHR5cGUgcGFyYW1ldGVyLiAgKi8KLQkgICsrKnBwOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIChkZWJ1Z190eXBlICopIE5VTEwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKm9sZF9wOwotCSAgYm9vbGVhbiBwb2ludGVycCwgcmVhbHAsIGludGVncmFscCwgY2hhcnAsIGJvb2xwOwotCSAgYm9vbGVhbiBkb25lOwotCi0JICBvbGRfcCA9ICpwcDsKLQkgIHBvaW50ZXJwID0gZmFsc2U7Ci0JICByZWFscCA9IGZhbHNlOwotCSAgaW50ZWdyYWxwID0gZmFsc2U7Ci0JICBjaGFycCA9IGZhbHNlOwotCSAgYm9vbHAgPSBmYWxzZTsKLQkgIGRvbmUgPSBmYWxzZTsKLQotCSAgLyogVGhpcyBpcyBhIHZhbHVlIHBhcmFtZXRlci4gICovCi0KLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCAoZGVidWdfdHlwZSAqKSBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICB3aGlsZSAoKm9sZF9wICE9ICdcMCcgJiYgISBkb25lKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqb2xkX3ApCi0JCXsKLQkJY2FzZSAnUCc6Ci0JCWNhc2UgJ3AnOgotCQljYXNlICdSJzoKLQkJICBwb2ludGVycCA9IHRydWU7Ci0JCSAgZG9uZSA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0MnOgkvKiBDb25zdC4gICovCi0JCWNhc2UgJ1MnOgkvKiBTaWduZWQuICAqLwotCQljYXNlICdVJzoJLyogVW5zaWduZWQuICAqLwotCQljYXNlICdWJzoJLyogVm9sYXRpbGUuICAqLwotCQljYXNlICdGJzoJLyogRnVuY3Rpb24uICAqLwotCQljYXNlICdNJzoJLyogTWVtYmVyIGZ1bmN0aW9uLiAgKi8KLQkJY2FzZSAnTyc6CS8qID8/PyAqLwotCQkgICsrb2xkX3A7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1EnOgkvKiBRdWFsaWZpZWQgbmFtZS4gICovCi0JCSAgaW50ZWdyYWxwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJY2FzZSAnVCc6CS8qIFJlbWVtYmVyZWQgdHlwZS4gICovCi0JCSAgYWJvcnQgKCk7Ci0JCWNhc2UgJ3YnOgkvKiBWb2lkLiAgKi8KLQkJICBhYm9ydCAoKTsKLQkJY2FzZSAneCc6CS8qIExvbmcgbG9uZy4gICovCi0JCWNhc2UgJ2wnOgkvKiBMb25nLiAgKi8KLQkJY2FzZSAnaSc6CS8qIEludC4gICovCi0JCWNhc2UgJ3MnOgkvKiBTaG9ydC4gICovCi0JCWNhc2UgJ3cnOgkvKiBXY2hhcl90LiAgKi8KLQkJICBpbnRlZ3JhbHAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlICdiJzoJLyogQm9vbC4gICovCi0JCSAgYm9vbHAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlICdjJzoJLyogQ2hhci4gICovCi0JCSAgY2hhcnAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlICdyJzoJLyogTG9uZyBkb3VibGUuICAqLwotCQljYXNlICdkJzoJLyogRG91YmxlLiAgKi8KLQkJY2FzZSAnZic6CS8qIEZsb2F0LiAgKi8KLQkJICByZWFscCA9IHRydWU7Ci0JCSAgZG9uZSA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgLyogQXNzdW1lIGl0J3MgYSB1c2VyIGRlZmluZWQgaW50ZWdyYWwgdHlwZS4gICovCi0JCSAgaW50ZWdyYWxwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpbnRlZ3JhbHApCi0JICAgIHsKLQkgICAgICBpZiAoKipwcCA9PSAnbScpCi0JCSsrKnBwOwotCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0JCSsrKnBwOwotCSAgICB9Ci0JICBlbHNlIGlmIChjaGFycCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCB2YWw7Ci0KLQkgICAgICBpZiAoKipwcCA9PSAnbScpCi0JCSsrKnBwOwotCSAgICAgIHZhbCA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLQkgICAgICBpZiAodmFsID09IDApCi0JCXsKLQkJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJvb2xwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHZhbDsKLQotCSAgICAgIHZhbCA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLQkgICAgICBpZiAodmFsICE9IDAgJiYgdmFsICE9IDEpCi0JCXsKLQkJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJlYWxwKQotCSAgICB7Ci0JICAgICAgaWYgKCoqcHAgPT0gJ20nKQotCQkrKypwcDsKLQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCQkrKypwcDsKLQkgICAgICBpZiAoKipwcCA9PSAnLicpCi0JCXsKLQkJICArKypwcDsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCQkgICAgKysqcHA7Ci0JCX0KLQkgICAgICBpZiAoKipwcCA9PSAnZScpCi0JCXsKLQkJICArKypwcDsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCQkgICAgKysqcHA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocG9pbnRlcnApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0JICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmbGVuKSkKLQkJewotCQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICAqcHAgKz0gbGVuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBXZSBjYW4gdHJhbnNsYXRlIHRoaXMgdG8gYSBzdHJpbmcgZmFpcmx5IGVhc2lseSBieSBpbnZva2luZyB0aGUKLSAgICAgcmVndWxhciBkZW1hbmdsaW5nIHJvdXRpbmUuICAqLwotICBpZiAocG5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpzMSwgKnMyLCAqczMsICpzNDsKLSAgICAgIGNoYXIgKmZyb20sICp0bzsKLQotICAgICAgczEgPSBzYXZlc3RyaW5nIChvcmlnLCAqcHAgLSBvcmlnKTsKLQotICAgICAgczIgPSBjb25jYXQgKCJOb1N1Y2hTdHJpbkdfXyIsIHMxLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQotICAgICAgZnJlZSAoczEpOwotCi0gICAgICBzMyA9IGNwbHVzX2RlbWFuZ2xlIChzMiwgRE1HTF9BTlNJKTsKLQotICAgICAgZnJlZSAoczIpOwotCi0gICAgICBpZiAoczMgIT0gTlVMTCkKLQlzNCA9IHN0cnN0ciAoczMsICI6Ok5vU3VjaFN0cmluRyIpOwotICAgICAgaWYgKHMzID09IE5VTEwgfHwgczQgPT0gTlVMTCkKLQl7Ci0JICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICBpZiAoczMgIT0gTlVMTCkKLQkgICAgZnJlZSAoczMpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogRWxpbWluYXRpbmcgYWxsIHNwYWNlcywgZXhjZXB0IHRob3NlIGJldHdlZW4gPiBjaGFyYWN0ZXJzLAotICAgICAgICAgbWFrZXMgaXQgbW9yZSBsaWtlbHkgdGhhdCB0aGUgZGVtYW5nbGVkIG5hbWUgd2lsbCBtYXRjaCB0aGUKLSAgICAgICAgIG5hbWUgd2hpY2ggZysrIHVzZWQgYXMgdGhlIHN0cnVjdHVyZSBuYW1lLiAgKi8KLSAgICAgIGZvciAoZnJvbSA9IHRvID0gczM7IGZyb20gIT0gczQ7ICsrZnJvbSkKLQlpZiAoKmZyb20gIT0gJyAnCi0JICAgIHx8IChmcm9tWzFdID09ICc+JyAmJiBmcm9tID4gczMgJiYgZnJvbVstMV0gPT0gJz4nKSkKLQkgICp0bysrID0gKmZyb207Ci0KLSAgICAgICpwbmFtZSA9IHNhdmVzdHJpbmcgKHMzLCB0byAtIHMzKTsKLQotICAgICAgZnJlZSAoczMpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgYSBjbGFzcyBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfY2xhc3MgKG1pbmZvLCBwcCwgcHN0YXJ0KQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNvbnN0IGNoYXIgKipwc3RhcnQ7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIHVuc2lnbmVkIGludCBuOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgbiA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLSAgaWYgKHN0cmxlbiAoKnBwKSA8IG4pCi0gICAgewotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAocHN0YXJ0ICE9IE5VTEwpCi0gICAgKnBzdGFydCA9ICpwcDsKLQotICAqcHAgKz0gbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgZnVuY3Rpb24gYXJndW1lbnRzLiAgSWYgdGhlIHBhcmdzIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCBpdAotICAgaXMgc2V0IHRvIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IGhvbGRpbmcgdGhlIGFyZ3VtZW50cy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwgcGFyZ3MsIHB2YXJhcmdzKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z190eXBlICoqcGFyZ3M7Ci0gICAgIGJvb2xlYW4gKnB2YXJhcmdzOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICB1bnNpZ25lZCBpbnQgYWxsb2MsIGNvdW50OwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgYWxsb2MgPSAxMDsKLSAgaWYgKHBhcmdzICE9IE5VTEwpCi0gICAgewotICAgICAgKnBhcmdzID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKipwYXJncyk7Ci0gICAgICAqcHZhcmFyZ3MgPSBmYWxzZTsKLSAgICB9Ci0gIGNvdW50ID0gMDsKLQotICB3aGlsZSAoKipwcCAhPSAnXycgJiYgKipwcCAhPSAnXDAnICYmICoqcHAgIT0gJ2UnKQotICAgIHsKLSAgICAgIGlmICgqKnBwID09ICdOJyB8fCAqKnBwID09ICdUJykKLQl7Ci0JICBjaGFyIHRlbXB0eXBlOwotCSAgdW5zaWduZWQgaW50IHIsIHQ7Ci0KLQkgIHRlbXB0eXBlID0gKipwcDsKLQkgICsrKnBwOwotCi0JICBpZiAodGVtcHR5cGUgPT0gJ1QnKQotCSAgICByID0gMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50IChwcCwgJnIpKQotCQl7Ci0JCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50IChwcCwgJnQpKQotCSAgICB7Ci0JICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAodCA+PSBtaW5mby0+dHlwZXN0cmluZ19jb3VudCkKLQkgICAgewotCSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIHdoaWxlIChyLS0gPiAwKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqdGVtOwotCi0JICAgICAgdGVtID0gbWluZm8tPnR5cGVzdHJpbmdzW3RdLnR5cGVzdHJpbmc7Ci0JICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmcgKG1pbmZvLCAmdGVtLCBwYXJncywgJmNvdW50LCAmYWxsb2MpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmcgKG1pbmZvLCBwcCwgcGFyZ3MsICZjb3VudCwgJmFsbG9jKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKHBhcmdzICE9IE5VTEwpCi0gICAgKCpwYXJncylbY291bnRdID0gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmICgqKnBwID09ICdlJykKLSAgICB7Ci0gICAgICBpZiAocGFyZ3MgIT0gTlVMTCkKLQkqcHZhcmFyZ3MgPSB0cnVlOwotICAgICAgKysqcHA7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBhIHNpbmdsZSBhcmd1bWVudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2FyZyAobWluZm8sIHBwLCBwYXJncywgcGNvdW50LCBwYWxsb2MpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKipwYXJnczsKLSAgICAgdW5zaWduZWQgaW50ICpwY291bnQ7Ci0gICAgIHVuc2lnbmVkIGludCAqcGFsbG9jOwotewotICBjb25zdCBjaGFyICpzdGFydDsKLSAgZGVidWdfdHlwZSB0eXBlOwotCi0gIHN0YXJ0ID0gKnBwOwotICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwKLQkJCSAgICBwYXJncyA9PSBOVUxMID8gKGRlYnVnX3R5cGUgKikgTlVMTCA6ICZ0eXBlKQotICAgICAgfHwgISBzdGFiX2RlbWFuZ2xlX3JlbWVtYmVyX3R5cGUgKG1pbmZvLCBzdGFydCwgKnBwIC0gc3RhcnQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAocGFyZ3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoKnBjb3VudCArIDEgPj0gKnBhbGxvYykKLQl7Ci0JICAqcGFsbG9jICs9IDEwOwotCSAgKnBhcmdzID0gKChkZWJ1Z190eXBlICopCi0JCSAgICB4cmVhbGxvYyAoKnBhcmdzLCAqcGFsbG9jICogc2l6ZW9mICoqcGFyZ3MpKTsKLQl9Ci0gICAgICAoKnBhcmdzKVsqcGNvdW50XSA9IHR5cGU7Ci0gICAgICArKypwY291bnQ7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBhIHR5cGUuICBJZiB0aGUgcHR5cGUgYXJndW1lbnQgaXMgbm90IE5VTEwsICpwdHlwZSBpcyBzZXQKLSAgIHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKnB0eXBlOwotewotICBjb25zdCBjaGFyICpvcmlnOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgc3dpdGNoICgqKnBwKQotICAgIHsKLSAgICBjYXNlICdQJzoKLSAgICBjYXNlICdwJzoKLSAgICAgIC8qIEEgcG9pbnRlciB0eXBlLiAgKi8KLSAgICAgICsrKnBwOwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQkqcHR5cGUgPSBkZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgLyogQSByZWZlcmVuY2UgdHlwZS4gICovCi0gICAgICArKypwcDsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JKnB0eXBlID0gZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0EnOgotICAgICAgLyogQW4gYXJyYXkuICAqLwotICAgICAgewotCXVuc2lnbmVkIGxvbmcgaGlnaDsKLQotCSsrKnBwOwotCWhpZ2ggPSAwOwotCXdoaWxlICgqKnBwICE9ICdcMCcgJiYgKipwcCAhPSAnXycpCi0JICB7Ci0JICAgIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQkgICAgICB7Ci0JCXN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgaGlnaCAqPSAxMDsKLQkgICAgaGlnaCArPSAqKnBwIC0gJzAnOwotCSAgICArKypwcDsKLQkgIH0KLQlpZiAoKipwcCAhPSAnXycpCi0JICB7Ci0JICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSsrKnBwOwotCi0JaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAocHR5cGUgIT0gTlVMTCkKLQkgIHsKLQkgICAgZGVidWdfdHlwZSBpbnRfdHlwZTsKLQotCSAgICBpbnRfdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJpbnQiKTsKLQkgICAgaWYgKGludF90eXBlID09IE5VTEwpCi0JICAgICAgaW50X3R5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgNCwgZmFsc2UpOwotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUsIGludF90eXBlLAotCQkJCQkgICAgMCwgaGlnaCwgZmFsc2UpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIC8qIEEgYmFjayByZWZlcmVuY2UgdG8gYSByZW1lbWJlcmVkIHR5cGUuICAqLwotICAgICAgewotCXVuc2lnbmVkIGludCBpOwotCWNvbnN0IGNoYXIgKnA7Ci0KLQkrKypwcDsKLQlpZiAoISBzdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsICZpKSkKLQkgIHsKLQkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JaWYgKGkgPj0gbWluZm8tPnR5cGVzdHJpbmdfY291bnQpCi0JICB7Ci0JICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCXAgPSBtaW5mby0+dHlwZXN0cmluZ3NbaV0udHlwZXN0cmluZzsKLQlpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCAmcCwgcHR5cGUpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdGJzoKLSAgICAgIC8qIEEgZnVuY3Rpb24uICAqLwotICAgICAgewotCWRlYnVnX3R5cGUgKmFyZ3M7Ci0JYm9vbGVhbiB2YXJhcmdzOwotCi0JKysqcHA7Ci0JaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmdzIChtaW5mbywgcHAsCi0JCQkJICAocHR5cGUgPT0gTlVMTAotCQkJCSAgID8gKGRlYnVnX3R5cGUgKiopIE5VTEwKLQkJCQkgICA6ICZhcmdzKSwKLQkJCQkgIChwdHlwZSA9PSBOVUxMCi0JCQkJICAgPyAoYm9vbGVhbiAqKSBOVUxMCi0JCQkJICAgOiAmdmFyYXJncykpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmICgqKnBwICE9ICdfJykKLQkgIHsKLQkgICAgLyogY3BsdXNfZGVtYW5nbGUgd2lsbCBhY2NlcHQgYSBmdW5jdGlvbiB3aXRob3V0IGEgcmV0dXJuCi0JICAgICAgIHR5cGUsIGJ1dCBJIGRvbid0IGtub3cgd2hlbiB0aGF0IHdpbGwgaGFwcGVuLCBvciB3aGF0Ci0JICAgICAgIHRvIGRvIGlmIGl0IGRvZXMuICAqLwotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkrKypwcDsKLQlpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChwdHlwZSAhPSBOVUxMKQotCSAgKnB0eXBlID0gZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlLCBhcmdzLAotCQkJCQkgICAgIHZhcmFyZ3MpOwotCi0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ00nOgotICAgIGNhc2UgJ08nOgotICAgICAgewotCWJvb2xlYW4gbWVtYmVycCwgY29uc3RwLCB2b2xhdGlsZXA7Ci0JZGVidWdfdHlwZSBjbGFzc190eXBlID0gREVCVUdfVFlQRV9OVUxMOwotCWRlYnVnX3R5cGUgKmFyZ3M7Ci0JYm9vbGVhbiB2YXJhcmdzOwotCXVuc2lnbmVkIGludCBuOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQltZW1iZXJwID0gKipwcCA9PSAnTSc7Ci0JY29uc3RwID0gZmFsc2U7Ci0Jdm9sYXRpbGVwID0gZmFsc2U7Ci0JYXJncyA9IE5VTEw7Ci0JdmFyYXJncyA9IGZhbHNlOwotCi0JKysqcHA7Ci0JaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQkgIHsKLQkgICAgbiA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLQkgICAgaWYgKHN0cmxlbiAoKnBwKSA8IG4pCi0JICAgICAgewotCQlzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgIG5hbWUgPSAqcHA7Ci0JICAgICpwcCArPSBuOwotCi0JICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCSAgICAgIHsKLQkJY2xhc3NfdHlwZSA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCi0JCQkJCQkgICAgbWluZm8tPmluZm8sCi0JCQkJCQkgICAgbmFtZSwgKGludCkgbiwKLQkJCQkJCSAgICBERUJVR19LSU5EX0NMQVNTKTsKLQkJaWYgKGNsYXNzX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZSBpZiAoKipwcCA9PSAnUScpCi0JICB7Ci0JICAgIGlmICghIHN0YWJfZGVtYW5nbGVfcXVhbGlmaWVkIChtaW5mbywgcHAsCi0JCQkJCSAgIChwdHlwZSA9PSBOVUxMCi0JCQkJCSAgICA/IChkZWJ1Z190eXBlICopIE5VTEwKLQkJCQkJICAgIDogJmNsYXNzX3R5cGUpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCWlmIChtZW1iZXJwKQotCSAgewotCSAgICBpZiAoKipwcCA9PSAnQycpCi0JICAgICAgewotCQljb25zdHAgPSB0cnVlOwotCQkrKypwcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKCoqcHAgPT0gJ1YnKQotCSAgICAgIHsKLQkJdm9sYXRpbGVwID0gdHJ1ZTsKLQkJKysqcHA7Ci0JICAgICAgfQotCSAgICBpZiAoKipwcCAhPSAnRicpCi0JICAgICAgewotCQlzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICsrKnBwOwotCSAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwKLQkJCQkgICAgICAocHR5cGUgPT0gTlVMTAotCQkJCSAgICAgICA/IChkZWJ1Z190eXBlICoqKSBOVUxMCi0JCQkJICAgICAgIDogJmFyZ3MpLAotCQkJCSAgICAgIChwdHlwZSA9PSBOVUxMCi0JCQkJICAgICAgID8gKGJvb2xlYW4gKikgTlVMTAotCQkJCSAgICAgICA6ICZ2YXJhcmdzKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCi0JaWYgKCoqcHAgIT0gJ18nKQotCSAgewotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkrKypwcDsKLQotCWlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQlpZiAocHR5cGUgIT0gTlVMTCkKLQkgIHsKLQkgICAgaWYgKCEgbWVtYmVycCkKLQkgICAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX29mZnNldF90eXBlIChtaW5mby0+ZGhhbmRsZSwgY2xhc3NfdHlwZSwKLQkJCQkJICAgICAgICpwdHlwZSk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCS8qIEZJWE1FOiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgY29uc3RwIG9yCi0gICAgICAgICAgICAgICAgICAgdm9sYXRpbGVwLiAgKi8KLQkJKnB0eXBlID0gZGVidWdfbWFrZV9tZXRob2RfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSwKLQkJCQkJCSBjbGFzc190eXBlLCBhcmdzLCB2YXJhcmdzKTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgKysqcHA7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQyc6Ci0gICAgICArKypwcDsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JKnB0eXBlID0gZGVidWdfbWFrZV9jb25zdF90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUSc6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqaG9sZDsKLQotCWhvbGQgPSAqcHA7Ci0JaWYgKCEgc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQgKG1pbmZvLCBwcCwgcHR5cGUpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9mdW5kX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgYSBmdW5kYW1lbnRhbCB0eXBlLiAgSWYgdGhlIHB0eXBlIGFyZ3VtZW50IGlzIG5vdCBOVUxMLAotICAgKnB0eXBlIGlzIHNldCB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9mdW5kX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKnB0eXBlOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBib29sZWFuIGNvbnN0cCwgdm9sYXRpbGVwLCB1bnNpZ25lZHAsIHNpZ25lZHA7Ci0gIGJvb2xlYW4gZG9uZTsKLQotICBvcmlnID0gKnBwOwotCi0gIGNvbnN0cCA9IGZhbHNlOwotICB2b2xhdGlsZXAgPSBmYWxzZTsKLSAgdW5zaWduZWRwID0gZmFsc2U7Ci0gIHNpZ25lZHAgPSBmYWxzZTsKLQotICBkb25lID0gZmFsc2U7Ci0gIHdoaWxlICghIGRvbmUpCi0gICAgewotICAgICAgc3dpdGNoICgqKnBwKQotCXsKLQljYXNlICdDJzoKLQkgIGNvbnN0cCA9IHRydWU7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnVSc6Ci0JICB1bnNpZ25lZHAgPSB0cnVlOwotCSAgKysqcHA7Ci0JICBicmVhazsKLQotCWNhc2UgJ1MnOgotCSAgc2lnbmVkcCA9IHRydWU7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnVic6Ci0JICB2b2xhdGlsZXAgPSB0cnVlOwotCSAgKysqcHA7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBkb25lID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgc3dpdGNoICgqKnBwKQotICAgIHsKLSAgICBjYXNlICdcMCc6Ci0gICAgY2FzZSAnXyc6Ci0gICAgICAvKiBjcGx1c19kZW1hbmdsZSBwZXJtaXRzIHRoaXMsIGJ1dCBJIGRvbid0IGtub3cgd2hhdCBpdCBtZWFucy4gICovCi0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3YnOiAvKiB2b2lkICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAidm9pZCIpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChtaW5mby0+ZGhhbmRsZSk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOiAvKiBsb25nIGxvbmcgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCi0JCQkJCSAgKHVuc2lnbmVkcAotCQkJCQkgICA/ICJsb25nIGxvbmcgdW5zaWduZWQgaW50IgotCQkJCQkgICA6ICJsb25nIGxvbmcgaW50IikpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA4LCB1bnNpZ25lZHApOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdsJzogLyogbG9uZyAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJICAodW5zaWduZWRwCi0JCQkJCSAgID8gImxvbmcgdW5zaWduZWQgaW50IgotCQkJCQkgICA6ICJsb25nIGludCIpKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgNCwgdW5zaWduZWRwKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaSc6IC8qIGludCAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJICAodW5zaWduZWRwCi0JCQkJCSAgID8gInVuc2lnbmVkIGludCIKLQkJCQkJICAgOiAiaW50IikpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA0LCB1bnNpZ25lZHApOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzogLyogc2hvcnQgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCi0JCQkJCSAgKHVuc2lnbmVkcAotCQkJCQkgICA/ICJzaG9ydCB1bnNpZ25lZCBpbnQiCi0JCQkJCSAgIDogInNob3J0IGludCIpKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgMiwgdW5zaWduZWRwKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYic6IC8qIGJvb2wgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJib29sIik7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA0KTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYyc6IC8qIGNoYXIgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCi0JCQkJCSAgKHVuc2lnbmVkcAotCQkJCQkgICA/ICJ1bnNpZ25lZCBjaGFyIgotCQkJCQkgICA6IChzaWduZWRwCi0JCQkJCSAgICAgID8gInNpZ25lZCBjaGFyIgotCQkJCQkgICAgICA6ICJjaGFyIikpKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgMSwgdW5zaWduZWRwKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndyc6IC8qIHdjaGFyX3QgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJfX3djaGFyX3QiKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgMiwgdHJ1ZSk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3InOiAvKiBsb25nIGRvdWJsZSAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgImxvbmcgZG91YmxlIik7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChtaW5mby0+ZGhhbmRsZSwgOCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOiAvKiBkb3VibGUgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJkb3VibGUiKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA4KTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZic6IC8qIGZsb2F0ICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAiZmxvYXQiKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA0KTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICArKypwcDsKLSAgICAgIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQl7Ci0JICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotICAgICAgewotCWNvbnN0IGNoYXIgKmhvbGQ7Ci0KLQlpZiAoISBzdGFiX2RlbWFuZ2xlX2NsYXNzIChtaW5mbywgcHAsICZob2xkKSkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAocHR5cGUgIT0gTlVMTCkKLQkgIHsKLQkgICAgY2hhciAqbmFtZTsKLQotCSAgICBuYW1lID0gc2F2ZXN0cmluZyAoaG9sZCwgKnBwIC0gaG9sZCk7Ci0JICAgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsIG5hbWUpOwotCSAgICBmcmVlIChuYW1lKTsKLQkgICAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICAgewotCQkvKiBGSVhNRTogSXQgaXMgcHJvYmFibHkgaW5jb3JyZWN0IHRvIGFzc3VtZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkIHR5cGVzIGFyZSB0YWdnZWQgdHlwZXMuICAqLwotCQkqcHR5cGUgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBtaW5mby0+aW5mbywKLQkJCQkJCWhvbGQsICpwcCAtIGhvbGQsCi0JCQkJCQlERUJVR19LSU5EX0lMTEVHQUwpOwotCQlpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICAgIHsKLQljaGFyICpuYW1lOwotCi0JaWYgKCEgc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLAotCQkJCSAgICAgIHB0eXBlICE9IE5VTEwgPyAmbmFtZSA6IE5VTEwpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChwdHlwZSAhPSBOVUxMKQotCSAgewotCSAgICAqcHR5cGUgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBtaW5mby0+aW5mbywKLQkJCQkJICAgIG5hbWUsIHN0cmxlbiAobmFtZSksCi0JCQkJCSAgICBERUJVR19LSU5EX0NMQVNTKTsKLQkgICAgZnJlZSAobmFtZSk7Ci0JICAgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHB0eXBlICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGNvbnN0cCkKLQkqcHR5cGUgPSBkZWJ1Z19tYWtlX2NvbnN0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUpOwotICAgICAgaWYgKHZvbGF0aWxlcCkKLQkqcHR5cGUgPSBkZWJ1Z19tYWtlX3ZvbGF0aWxlX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVtZW1iZXIgYSB0eXBlIHN0cmluZyBpbiBhIGRlbWFuZ2xlZCBzdHJpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlIChtaW5mbywgcCwgbGVuKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqcDsKLSAgICAgaW50IGxlbjsKLXsKLSAgaWYgKG1pbmZvLT50eXBlc3RyaW5nX2NvdW50ID49IG1pbmZvLT50eXBlc3RyaW5nX2FsbG9jKQotICAgIHsKLSAgICAgIG1pbmZvLT50eXBlc3RyaW5nX2FsbG9jICs9IDEwOwotICAgICAgbWluZm8tPnR5cGVzdHJpbmdzID0gKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV90eXBlc3RyaW5nICopCi0JCQkgICAgeHJlYWxsb2MgKG1pbmZvLT50eXBlc3RyaW5ncywKLQkJCQkgICAgICAobWluZm8tPnR5cGVzdHJpbmdfYWxsb2MKLQkJCQkgICAgICAgKiBzaXplb2YgKm1pbmZvLT50eXBlc3RyaW5ncykpKTsKLSAgICB9Ci0KLSAgbWluZm8tPnR5cGVzdHJpbmdzW21pbmZvLT50eXBlc3RyaW5nX2NvdW50XS50eXBlc3RyaW5nID0gcDsKLSAgbWluZm8tPnR5cGVzdHJpbmdzW21pbmZvLT50eXBlc3RyaW5nX2NvdW50XS5sZW4gPSAodW5zaWduZWQgaW50KSBsZW47Ci0gICsrbWluZm8tPnR5cGVzdHJpbmdfY291bnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zdGFtcC1oLmluIGIvYmludXRpbHMvc3RhbXAtaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4OGY3MC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9iaW51dGlscy9zdHJpbmdzLjEgYi9iaW51dGlscy9zdHJpbmdzLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOGRlMjkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3RyaW5ncy4xCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBzdHJpbmdzIDEgIjI1IEp1bmUgMTk5MyIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLXN0cmluZ3MgXC0gcHJpbnQgdGhlIHN0cmluZ3Mgb2YgcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gZmlsZXMKLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIHN0cmluZ3MKLS5SQiAiW1x8IiBcLWEgfCBcLVxjCi0uUkIgfCBcLVwtYWxsICJcfF0iIAotLlJCICJbXHwiIFwtZiB8IFwtXC1wcmludFwtZmlsZVwtbmFtZSAiXHxdIgotLlJCICJbXHwiIFwtbyAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtaGVscCAiXHxdIiAKLS5SQiAiW1x8IiBcLXYgfCBcLVwtdmVyc2lvbiAiXHxdIiAgCi0uUkIgIltcfCIgXC1uCi0uSSBtaW5cLWxlblxjCi0uUkkgfCBcLW1pblwtbGVuXGMKLS5SQiB8ICJcLVwtYnl0ZXM9IlxjCi0uSSBtaW5cLWxlblxjCi1cJlx8XQotLlJCICJbXHwiIFwtdAotLkkge28seCxkfVxjCi0uUkIgIltcfCIgIlwtXC10YXJnZXQ9XGZJYmZkbmFtZSIgIlx8XSIKLS5SQiB8ICJcLVwtcmFkaXg9IlxjCi0uSSB7byx4LGR9XGMKLVwmXHxdCi0uSSBmaWxlXGMKLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1Gb3IgZWFjaAotLkkgZmlsZQotZ2l2ZW4sIEdOVSBcYwotLkIgc3RyaW5ncwotcHJpbnRzIHRoZSBwcmludGFibGUgY2hhcmFjdGVyIHNlcXVlbmNlcyB0aGF0IGFyZSBhdCBsZWFzdCA0Ci1jaGFyYWN0ZXJzIGxvbmcgKG9yIHRoZSBudW1iZXIgZ2l2ZW4gd2l0aCB0aGUgb3B0aW9ucyBiZWxvdykgYW5kIGFyZQotZm9sbG93ZWQgYnkgYW4gdW5wcmludGFibGUgY2hhcmFjdGVyLiAgQnkgZGVmYXVsdCwgaXQgb25seSBwcmludHMgdGhlCi1zdHJpbmdzIGZyb20gdGhlIGluaXRpYWxpemVkIGFuZCBsb2FkZWQgc2VjdGlvbnMgb2Ygb2JqZWN0IGZpbGVzOyBmb3IKLW90aGVyIHR5cGVzIG9mIGZpbGVzLCBpdCBwcmludHMgdGhlIHN0cmluZ3MgZnJvbSB0aGUgd2hvbGUgZmlsZS4KLQotLlBQCi0uQiBzdHJpbmdzCi1pcyBtYWlubHkgdXNlZnVsIGZvciBkZXRlcm1pbmluZyB0aGUgY29udGVudHMgb2Ygbm9uLXRleHQgZmlsZXMuCi0KLS5TSCBPUFRJT05TCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4KLQotLlRQCi0uQiBcLWEKLS5UUAotLkIgXC1cLWFsbAotLlRQCi0uQiBcLQotRG8gbm90IHNjYW4gb25seSB0aGUgaW5pdGlhbGl6ZWQgYW5kIGxvYWRlZCBzZWN0aW9ucyBvZiBvYmplY3QgZmlsZXM7Ci1zY2FuIHRoZSB3aG9sZSBmaWxlcy4KLQotLlRQCi0uQiBcLWYKLS5UUAotLkIgXC1cLXByaW50XC1maWxlXC1uYW1lCi1QcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcuCi0KLS5UUAotLkIgXC1cLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgc3RyaW5ncwotb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLQotLlRQCi0uQiBcLXYKLS5UUAotLkIgXC1cLXZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlcgotb2YKLS5CIHN0cmluZ3MKLW9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCi0KLS5UUAotLkIgIlwtbiBcZkltaW5cLWxlblxmUCIKLS5UUAotLkIgIlwtXGZJbWluXC1sZW5cZlAiCi0uVFAKLS5CICJcLWJ5dGVzPVxmSW1pblwtbGVuXGZQIgotUHJpbnQgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYXQgbGVhc3QKLS5JIG1pblwtbGVuCi1jaGFyYWN0ZXJzIGxvbmcsIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgNC4KLQotLlRQCi0uQlIgIlwtdCAiIHtvLHgsZH0KLS5UUAotLkJSICJcLVwtcmFkaXg9IiB7byx4LGR9Ci1QcmludCB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcuICBUaGUgc2luZ2xlCi1jaGFyYWN0ZXIgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSByYWRpeCBvZiB0aGUgb2Zmc2V0XChlbW9jdGFsLAotaGV4YWRlY2ltYWwsIG9yIGRlY2ltYWwuCi0KLS5UUAotLkJJICJcLVwtdGFyZ2V0PSIgImJmZG5hbWUiCi1TcGVjaWZ5IGFuIG9iamVjdCBjb2RlIGZvcm1hdCBvdGhlciB0aGFuIHlvdXIgc3lzdGVtJ3MgZGVmYXVsdCBmb3JtYXQuCi1TZWUgCi0uQlIgb2JqZHVtcCAoIDEgKSwKLWZvciBpbmZvcm1hdGlvbiBvbiBsaXN0aW5nIGF2YWlsYWJsZSBmb3JtYXRzLgotCi0uVFAKLS5CIFwtbwotTGlrZQotLkJSICJcLXQgbyIgLgotCi0uUFAKLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSk7Ci0uQlIgYXIgKCAxICksCi0uQlIgbm0gKCAxICksCi0uQlIgb2JqZHVtcCAoIDEgKSwKLS5CUiByYW5saWIgKCAxICkuCi0KLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3RyaW5ncy5jIGIvYmludXRpbHMvc3RyaW5ncy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmZlNmExLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N0cmluZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDUxNCArMCwwIEBACi0vKiBzdHJpbmdzIC0tIHByaW50IHRoZSBzdHJpbmdzIG9mIHByaW50YWJsZSBjaGFyYWN0ZXJzIGluIGZpbGVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0vKiBVc2FnZTogc3RyaW5ncyBbb3B0aW9uc10gZmlsZS4uLgotCi0gICBPcHRpb25zOgotICAgLS1hbGwKLSAgIC1hCi0gICAtCQlEbyBub3Qgc2NhbiBvbmx5IHRoZSBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24gb2Ygb2JqZWN0IGZpbGVzLgotCi0gICAtLXByaW50LWZpbGUtbmFtZQotICAgLWYJCVByaW50IHRoZSBuYW1lIG9mIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4KLQotICAgLS1ieXRlcz1taW4tbGVuCi0gICAtbiBtaW4tbGVuCi0gICAtbWluLWxlbglQcmludCBncmFwaGljIGNoYXIgc2VxdWVuY2VzLCBNSU4tTEVOIG9yIG1vcmUgYnl0ZXMgbG9uZywKLQkJdGhhdCBhcmUgZm9sbG93ZWQgYnkgYSBOVUwgb3IgYSBuZXdsaW5lLiAgRGVmYXVsdCBpcyA0LgotCi0gICAtLXJhZGl4PXtvLHgsZH0KLSAgIC10IHtvLHgsZH0JUHJpbnQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLAotCQlpbiBvY3RhbC9oZXgvZGVjaW1hbC4KLQotICAgLW8JCUxpa2UgLXRvLiAgKFNvbWUgb3RoZXIgaW1wbGVtZW50YXRpb25zIGhhdmUgLW8gbGlrZSAtdG8sCi0JCW90aGVycyBsaWtlIC10ZC4gIFdlIGNob3NlIG9uZSBhcmJpdHJhcmlseS4pCi0KLSAgIC0tdGFyZ2V0PUJGRE5BTUUKLQkJU3BlY2lmeSBhIG5vbi1kZWZhdWx0IG9iamVjdCBmaWxlIGZvcm1hdC4KLQotICAgLS1oZWxwCi0gICAtaAkJUHJpbnQgdGhlIHVzYWdlIG1lc3NhZ2Ugb24gdGhlIHN0YW5kYXJkIG91dHB1dC4KLQotICAgLS12ZXJzaW9uCi0gICAtdgkJUHJpbnQgdGhlIHByb2dyYW0gdmVyc2lvbiBudW1iZXIuCi0KLSAgIFdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiA8cm1zQGdudS5haS5taXQuZWR1PgotICAgYW5kIERhdmlkIE1hY0tlbnppZSA8ZGptQGdudS5haS5taXQuZWR1Pi4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2lmZGVmIGlzYXNjaWkKLSNkZWZpbmUgaXNncmFwaGljKGMpIChpc2FzY2lpIChjKSAmJiBpc3ByaW50IChjKSkKLSNlbHNlCi0jZGVmaW5lIGlzZ3JhcGhpYyhjKSAoaXNwcmludCAoYykpCi0jZW5kaWYKLQotI2lmbmRlZiBlcnJubwotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotCi0vKiBUaGUgQkZEIHNlY3Rpb24gZmxhZ3MgdGhhdCBpZGVudGlmeSBhbiBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24uICAqLwotI2RlZmluZSBEQVRBX0ZMQUdTIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpCi0KLS8qIFJhZGl4IGZvciBwcmludGluZyBhZGRyZXNzZXMgKG11c3QgYmUgOCwgMTAgb3IgMTYpLiAgKi8KLXN0YXRpYyBpbnQgYWRkcmVzc19yYWRpeDsKLQotLyogTWluaW11bSBsZW5ndGggb2Ygc2VxdWVuY2Ugb2YgZ3JhcGhpYyBjaGFycyB0byB0cmlnZ2VyIG91dHB1dC4gICovCi1zdGF0aWMgaW50IHN0cmluZ19taW47Ci0KLS8qIHRydWUgbWVhbnMgcHJpbnQgYWRkcmVzcyB3aXRoaW4gZmlsZSBmb3IgZWFjaCBzdHJpbmcuICAqLwotc3RhdGljIGJvb2xlYW4gcHJpbnRfYWRkcmVzc2VzOwotCi0vKiB0cnVlIG1lYW5zIHByaW50IGZpbGVuYW1lIGZvciBlYWNoIHN0cmluZy4gICovCi1zdGF0aWMgYm9vbGVhbiBwcmludF9maWxlbmFtZXM7Ci0KLS8qIHRydWUgbWVhbnMgZm9yIG9iamVjdCBmaWxlcyBzY2FuIG9ubHkgdGhlIGRhdGEgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbiBkYXRhc2VjdGlvbl9vbmx5OwotCi0vKiB0cnVlIGlmIHdlIGZvdW5kIGFuIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiBpbiB0aGUgY3VycmVudCBmaWxlLiAgKi8KLXN0YXRpYyBib29sZWFuIGdvdF9hX3NlY3Rpb247Ci0KLS8qIFRoZSBCRkQgb2JqZWN0IGZpbGUgZm9ybWF0LiAgKi8KLXN0YXRpYyBjaGFyICp0YXJnZXQ7Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJhbGwiLCBub19hcmd1bWVudCwgTlVMTCwgJ2EnfSwKLSAgeyJwcmludC1maWxlLW5hbWUiLCBub19hcmd1bWVudCwgTlVMTCwgJ2YnfSwKLSAgeyJieXRlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbid9LAotICB7InJhZGl4IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd0J30sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdUJ30sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaCd9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgJ3YnfSwKLSAge05VTEwsIDAsIE5VTEwsIDB9Ci19OwotCi1zdGF0aWMgdm9pZCBzdHJpbmdzX2Ffc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdHJpbmdzX29iamVjdF9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RyaW5nc19maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGUpKTsKLXN0YXRpYyBpbnQgaW50ZWdlcl9hcmcgUEFSQU1TICgoY2hhciAqcykpOwotc3RhdGljIHZvaWQgcHJpbnRfc3RyaW5ncyBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSwgRklMRSAqc3RyZWFtLAotCQkJCSAgZmlsZV9wdHIgYWRkcmVzcywgaW50IHN0b3BfcG9pbnQsCi0JCQkJICBpbnQgbWFnaWNjb3VudCwgY2hhciAqbWFnaWMpKTsKLXN0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKEZJTEUgKnN0cmVhbSwgaW50IHN0YXR1cykpOwotDAotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBvcHRjOwotICBpbnQgZXhpdF9zdGF0dXMgPSAwOwotICBib29sZWFuIGZpbGVzX2dpdmVuID0gZmFsc2U7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0gIHN0cmluZ19taW4gPSAtMTsKLSAgcHJpbnRfYWRkcmVzc2VzID0gZmFsc2U7Ci0gIHByaW50X2ZpbGVuYW1lcyA9IGZhbHNlOwotICBkYXRhc2VjdGlvbl9vbmx5ID0gdHJ1ZTsKLSAgdGFyZ2V0ID0gTlVMTDsKLQotICB3aGlsZSAoKG9wdGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImFmbjpvdDp2MDEyMzQ1Njc4OSIsCi0JCQkgICAgICBsb25nX29wdGlvbnMsIChpbnQgKikgMCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wdGMpCi0JewotCWNhc2UgJ2EnOgotCSAgZGF0YXNlY3Rpb25fb25seSA9IGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlICdmJzoKLQkgIHByaW50X2ZpbGVuYW1lcyA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgJ2gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0KLQljYXNlICduJzoKLQkgIHN0cmluZ19taW4gPSBpbnRlZ2VyX2FyZyAob3B0YXJnKTsKLQkgIGlmIChzdHJpbmdfbWluIDwgMSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGludmFsaWQgbnVtYmVyICVzXG4iKSwKLQkJICAgICAgIHByb2dyYW1fbmFtZSwgb3B0YXJnKTsKLQkgICAgICBleGl0ICgxKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdvJzoKLQkgIHByaW50X2FkZHJlc3NlcyA9IHRydWU7Ci0JICBhZGRyZXNzX3JhZGl4ID0gODsKLQkgIGJyZWFrOwotCi0JY2FzZSAndCc6Ci0JICBwcmludF9hZGRyZXNzZXMgPSB0cnVlOwotCSAgaWYgKG9wdGFyZ1sxXSAhPSAnXDAnKQotCSAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQkgIHN3aXRjaCAob3B0YXJnWzBdKQotCSAgICB7Ci0JICAgIGNhc2UgJ28nOgotCSAgICAgIGFkZHJlc3NfcmFkaXggPSA4OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2QnOgotCSAgICAgIGFkZHJlc3NfcmFkaXggPSAxMDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd4JzoKLQkgICAgICBhZGRyZXNzX3JhZGl4ID0gMTY7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdUJzoKLQkgIHRhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCi0JY2FzZSAndic6Ci0JICBwcmludF92ZXJzaW9uICgic3RyaW5ncyIpOwotCSAgYnJlYWs7Ci0KLQljYXNlICc/JzoKLQkgIHVzYWdlIChzdGRlcnIsIDEpOwotCi0JZGVmYXVsdDoKLQkgIGlmIChzdHJpbmdfbWluIDwgMCkKLQkgICAgc3RyaW5nX21pbiA9IG9wdGM7Ci0JICBlbHNlCi0JICAgIHN0cmluZ19taW4gPSBzdHJpbmdfbWluICogMTAgKyBvcHRjIC0gJzAnOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoc3RyaW5nX21pbiA8IDApCi0gICAgc3RyaW5nX21pbiA9IDQ7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgaWYgKG9wdGluZCA+PSBhcmdjKQotICAgIHsKLSAgICAgIGRhdGFzZWN0aW9uX29ubHkgPSBmYWxzZTsKLSAgICAgIHByaW50X3N0cmluZ3MgKCJ7c3RhbmRhcmQgaW5wdXR9Iiwgc3RkaW4sIDAsIDAsIDAsIChjaGFyICopIE5VTEwpOwotICAgICAgZmlsZXNfZ2l2ZW4gPSB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoOyBvcHRpbmQgPCBhcmdjOyArK29wdGluZCkKLQl7Ci0JICBpZiAoc3RyY21wIChhcmd2W29wdGluZF0sICItIikgPT0gMCkKLQkgICAgZGF0YXNlY3Rpb25fb25seSA9IGZhbHNlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZmlsZXNfZ2l2ZW4gPSB0cnVlOwotCSAgICAgIGV4aXRfc3RhdHVzIHw9IChzdHJpbmdzX2ZpbGUgKGFyZ3Zbb3B0aW5kXSkgPT0gZmFsc2UpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoZmlsZXNfZ2l2ZW4gPT0gZmFsc2UpCi0gICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0KLSAgcmV0dXJuIChleGl0X3N0YXR1cyk7Ci19Ci0MCi0vKiBTY2FuIHNlY3Rpb24gU0VDVCBvZiB0aGUgZmlsZSBBQkZELCB3aG9zZSBwcmludGFibGUgbmFtZSBpcyBGSUxFLgotICAgSWYgaXQgY29udGFpbnMgaW5pdGlhbGl6ZWQgZGF0YSwKLSAgIHNldCBgZ290X2Ffc2VjdGlvbicgYW5kIHByaW50IHRoZSBzdHJpbmdzIGluIGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLXN0cmluZ3NfYV9zZWN0aW9uIChhYmZkLCBzZWN0LCBmaWxlYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0OwotICAgICBQVFIgZmlsZWFyZzsKLXsKLSAgY29uc3QgY2hhciAqZmlsZSA9IChjb25zdCBjaGFyICopIGZpbGVhcmc7Ci0KLSAgaWYgKChzZWN0LT5mbGFncyAmIERBVEFfRkxBR1MpID09IERBVEFfRkxBR1MpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzeiA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdCk7Ci0gICAgICBQVFIgbWVtID0geG1hbGxvYyAoc3opOwotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdCwgbWVtLCAoZmlsZV9wdHIpIDAsIHN6KSkKLQl7Ci0JICBnb3RfYV9zZWN0aW9uID0gdHJ1ZTsKLQkgIHByaW50X3N0cmluZ3MgKGZpbGUsIChGSUxFICopIE5VTEwsIHNlY3QtPmZpbGVwb3MsIDAsIHN6LCBtZW0pOwotCX0KLSAgICAgIGZyZWUgKG1lbSk7Ci0gICAgfQotfQotCi0vKiBTY2FuIGFsbCBvZiB0aGUgc2VjdGlvbnMgaW4gRklMRSwgYW5kIHByaW50IHRoZSBzdHJpbmdzCi0gICBpbiB0aGUgaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uKHMpLgotCi0gICBSZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLAotICAgZmFsc2UgaWYgbm90IChzdWNoIGFzIGlmIEZJTEUgaXMgbm90IGFuIG9iamVjdCBmaWxlKS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdHJpbmdzX29iamVjdF9maWxlIChmaWxlKQotICAgICBjb25zdCBjaGFyICpmaWxlOwotewotICBiZmQgKmFiZmQgPSBiZmRfb3BlbnIgKGZpbGUsIHRhcmdldCk7Ci0KLSAgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUcmVhdCB0aGUgZmlsZSBhcyBhIG5vbi1vYmplY3QgZmlsZS4gICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoaXMgY2FsbCBpcyBtYWlubHkgZm9yIGl0cyBzaWRlIGVmZmVjdCBvZiByZWFkaW5nIGluIHRoZSBzZWN0aW9ucy4KLSAgICAgV2UgZm9sbG93IHRoZSB0cmFkaXRpb25hbCBiZWhhdmlvciBvZiBgc3RyaW5ncycgaW4gdGhhdCB3ZSBkb24ndAotICAgICBjb21wbGFpbiBpZiB3ZSBkb24ndCByZWNvZ25pemUgYSBmaWxlIHRvIGJlIGFuIG9iamVjdCBmaWxlLiAgKi8KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGdvdF9hX3NlY3Rpb24gPSBmYWxzZTsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBzdHJpbmdzX2Ffc2VjdGlvbiwgKFBUUikgZmlsZSk7Ci0KLSAgaWYgKCFiZmRfY2xvc2UgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiBnb3RfYV9zZWN0aW9uOwotfQotCi0vKiBQcmludCB0aGUgc3RyaW5ncyBpbiBGSUxFLiAgUmV0dXJuIHRydWUgaWYgb2ssIGZhbHNlIGlmIGFuIGVycm9yIG9jY3Vycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdHJpbmdzX2ZpbGUgKGZpbGUpCi0gICAgIGNoYXIgKmZpbGU7Ci17Ci0gIC8qIElmIHdlIHdlcmVuJ3QgdG9sZCB0byBzY2FuIHRoZSB3aG9sZSBmaWxlLAotICAgICB0cnkgdG8gb3BlbiBpdCBhcyBhbiBvYmplY3QgZmlsZSBhbmQgb25seSBsb29rIGF0Ci0gICAgIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbnMuICBJZiB0aGF0IGZhaWxzLCBmYWxsIGJhY2sgdG8gdGhlCi0gICAgIHdob2xlIGZpbGUuICAqLwotICBpZiAoIWRhdGFzZWN0aW9uX29ubHkgfHwgIXN0cmluZ3Nfb2JqZWN0X2ZpbGUgKGZpbGUpKQotICAgIHsKLSAgICAgIEZJTEUgKnN0cmVhbTsKLQotICAgICAgc3RyZWFtID0gZm9wZW4gKGZpbGUsICJyYiIpOwotICAgICAgLyogTm90IGFsbCBzeXN0ZW1zIHBlcm1pdCAicmIiLCBzbyB0cnkgInIiIGlmIGl0IGZhaWxlZC4gICovCi0gICAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0Jc3RyZWFtID0gZm9wZW4gKGZpbGUsICJyIik7Ci0gICAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0JICBwZXJyb3IgKGZpbGUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcHJpbnRfc3RyaW5ncyAoZmlsZSwgc3RyZWFtLCAoZmlsZV9wdHIpIDAsIDAsIDAsIChjaGFyICopIDApOwotCi0gICAgICBpZiAoZmNsb3NlIChzdHJlYW0pID09IEVPRikKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLQkgIHBlcnJvciAoZmlsZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEZpbmQgdGhlIHN0cmluZ3MgaW4gZmlsZSBGSUxFTkFNRSwgcmVhZCBmcm9tIFNUUkVBTS4KLSAgIEFzc3VtZSB0aGF0IFNUUkVBTSBpcyBwb3NpdGlvbmVkIHNvIHRoYXQgdGhlIG5leHQgYnl0ZSByZWFkCi0gICBpcyBhdCBhZGRyZXNzIEFERFJFU1MgaW4gdGhlIGZpbGUuCi0gICBTdG9wIHJlYWRpbmcgYXQgYWRkcmVzcyBTVE9QX1BPSU5UIGluIHRoZSBmaWxlLCBpZiBub256ZXJvLgotCi0gICBJZiBTVFJFQU0gaXMgTlVMTCwgZG8gbm90IHJlYWQgZnJvbSBpdC4KLSAgIFRoZSBjYWxsZXIgY2FuIHN1cHBseSBhIGJ1ZmZlciBvZiBjaGFyYWN0ZXJzCi0gICB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIHRoZSBkYXRhIGluIFNUUkVBTS4KLSAgIE1BR0lDIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgYW5kCi0gICBNQUdJQ0NPVU5UIGlzIGhvdyBtYW55IGNoYXJhY3RlcnMgYXJlIGluIGl0LgotICAgVGhvc2UgY2hhcmFjdGVycyBjb21lIGF0IGFkZHJlc3MgQUREUkVTUyBhbmQgdGhlIGRhdGEgaW4gU1RSRUFNIGZvbGxvdy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zdHJpbmdzIChmaWxlbmFtZSwgc3RyZWFtLCBhZGRyZXNzLCBzdG9wX3BvaW50LCBtYWdpY2NvdW50LCBtYWdpYykKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgZmlsZV9wdHIgYWRkcmVzczsKLSAgICAgaW50IHN0b3BfcG9pbnQ7Ci0gICAgIGludCBtYWdpY2NvdW50OwotICAgICBjaGFyICptYWdpYzsKLXsKLSAgY2hhciAqYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RyaW5nX21pbiArIDEpOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGZpbGVfcHRyIHN0YXJ0OwotICAgICAgaW50IGk7Ci0gICAgICBpbnQgYzsKLQotICAgICAgLyogU2VlIGlmIHRoZSBuZXh0IGBzdHJpbmdfbWluJyBjaGFycyBhcmUgYWxsIGdyYXBoaWMgY2hhcnMuICAqLwotICAgIHRyeWxpbmU6Ci0gICAgICBpZiAoc3RvcF9wb2ludCAmJiBhZGRyZXNzID49IHN0b3BfcG9pbnQpCi0JYnJlYWs7Ci0gICAgICBzdGFydCA9IGFkZHJlc3M7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5nX21pbjsgaSsrKQotCXsKLQkgIGlmIChtYWdpY2NvdW50KQotCSAgICB7Ci0JICAgICAgbWFnaWNjb3VudC0tOwotCSAgICAgIGMgPSAqbWFnaWMrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmVhbSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JICAgICAgYyA9IGdldGMgKHN0cmVhbSk7Ci0JICAgICAgaWYgKGMgPT0gRU9GKQotCQlyZXR1cm47Ci0JICAgIH0KLQkgIGFkZHJlc3MrKzsKLQkgIGlmICghaXNncmFwaGljIChjKSkKLQkgICAgLyogRm91bmQgYSBub24tZ3JhcGhpYy4gIFRyeSBhZ2FpbiBzdGFydGluZyB3aXRoIG5leHQgY2hhci4gICovCi0JICAgIGdvdG8gdHJ5bGluZTsKLQkgIGJ1ZltpXSA9IGM7Ci0JfQotCi0gICAgICAvKiBXZSBmb3VuZCBhIHJ1biBvZiBgc3RyaW5nX21pbicgZ3JhcGhpYyBjaGFyYWN0ZXJzLiAgUHJpbnQgdXAKLSAgICAgICAgIHRvIHRoZSBuZXh0IG5vbi1ncmFwaGljIGNoYXJhY3Rlci4gICovCi0KLSAgICAgIGlmIChwcmludF9maWxlbmFtZXMpCi0JcHJpbnRmICgiJXM6ICIsIGZpbGVuYW1lKTsKLSAgICAgIGlmIChwcmludF9hZGRyZXNzZXMpCi0Jc3dpdGNoIChhZGRyZXNzX3JhZGl4KQotCSAgewotCSAgY2FzZSA4OgotCSAgICBwcmludGYgKCIlN2xvICIsICh1bnNpZ25lZCBsb25nKSBzdGFydCk7Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDEwOgotCSAgICBwcmludGYgKCIlN2xkICIsIChsb25nKSBzdGFydCk7Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDE2OgotCSAgICBwcmludGYgKCIlN2x4ICIsICh1bnNpZ25lZCBsb25nKSBzdGFydCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0gICAgICBidWZbaV0gPSAnXDAnOwotICAgICAgZnB1dHMgKGJ1Ziwgc3Rkb3V0KTsKLQotICAgICAgd2hpbGUgKDEpCi0JewotCSAgaWYgKG1hZ2ljY291bnQpCi0JICAgIHsKLQkgICAgICBtYWdpY2NvdW50LS07Ci0JICAgICAgYyA9ICptYWdpYysrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0JCWJyZWFrOwotCSAgICAgIGMgPSBnZXRjIChzdHJlYW0pOwotCSAgICAgIGlmIChjID09IEVPRikKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGFkZHJlc3MrKzsKLQkgIGlmICghIGlzZ3JhcGhpYyAoYykpCi0JICAgIGJyZWFrOwotCSAgcHV0Y2hhciAoYyk7Ci0JfQotCi0gICAgICBwdXRjaGFyICgnXG4nKTsKLSAgICB9Ci19Ci0MCi0vKiBQYXJzZSBzdHJpbmcgUyBhcyBhbiBpbnRlZ2VyLCB1c2luZyBkZWNpbWFsIHJhZGl4IGJ5IGRlZmF1bHQsCi0gICBidXQgYWxsb3dpbmcgb2N0YWwgYW5kIGhleCBudW1iZXJzIGFzIGluIEMuICAqLwotCi1zdGF0aWMgaW50Ci1pbnRlZ2VyX2FyZyAocykKLSAgICAgY2hhciAqczsKLXsKLSAgaW50IHZhbHVlOwotICBpbnQgcmFkaXggPSAxMDsKLSAgY2hhciAqcCA9IHM7Ci0gIGludCBjOwotCi0gIGlmICgqcCAhPSAnMCcpCi0gICAgcmFkaXggPSAxMDsKLSAgZWxzZSBpZiAoKisrcCA9PSAneCcpCi0gICAgewotICAgICAgcmFkaXggPSAxNjsKLSAgICAgIHArKzsKLSAgICB9Ci0gIGVsc2UKLSAgICByYWRpeCA9IDg7Ci0KLSAgdmFsdWUgPSAwOwotICB3aGlsZSAoKChjID0gKnArKykgPj0gJzAnICYmIGMgPD0gJzknKQotCSB8fCAocmFkaXggPT0gMTYgJiYgKGMgJiB+NDApID49ICdBJyAmJiAoYyAmIH40MCkgPD0gJ1onKSkKLSAgICB7Ci0gICAgICB2YWx1ZSAqPSByYWRpeDsKLSAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLQl2YWx1ZSArPSBjIC0gJzAnOwotICAgICAgZWxzZQotCXZhbHVlICs9IChjICYgfjQwKSAtICdBJzsKLSAgICB9Ci0KLSAgaWYgKGMgPT0gJ2InKQotICAgIHZhbHVlICo9IDUxMjsKLSAgZWxzZSBpZiAoYyA9PSAnQicpCi0gICAgdmFsdWUgKj0gMTAyNDsKLSAgZWxzZQotICAgIHAtLTsKLQotICBpZiAoKnApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaW52YWxpZCBpbnRlZ2VyIGFyZ3VtZW50ICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBzKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVXNhZ2U6ICVzIFstYWZvdl0gWy1uIG1pbi1sZW5dIFstbWluLWxlbl0gWy10IHtvLHgsZH1dIFstXVxuXAotICAgICAgIFstLWFsbF0gWy0tcHJpbnQtZmlsZS1uYW1lXSBbLS1ieXRlcz1taW4tbGVuXSBbLS1yYWRpeD17byx4LGR9XVxuXAotICAgICAgIFstLXRhcmdldD1iZmRuYW1lXSBbLS1oZWxwXSBbLS12ZXJzaW9uXSBmaWxlLi4uXG4iKSwKLQkgICBwcm9ncmFtX25hbWUpOwotICBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIChwcm9ncmFtX25hbWUsIHN0cmVhbSk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBleGl0IChzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3RyaXAuMSBiL2JpbnV0aWxzL3N0cmlwLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODgxN2QuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3RyaXAuMQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggc3RyaXAgMSAiNSBOb3ZlbWJlciAxOTkxIiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotc3RyaXAgXC0gRGlzY2FyZCBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzLgotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgc3RyaXAKLS5SQiAiW1x8IiBcLUZcIFxmSWJmZG5hbWVcZlJcIHxcIFxmQlwtXC10YXJnZXQ9XGZJYmZkbmFtZVxmUCAiXHxdIgotLlJCICJbXHwiIFwtSVwgXGZJYmZkbmFtZVxmUlwgfFwgXGZCXC1cLWlucHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUCAiXHxdIgotLlJCICJbXHwiIFwtT1wgXGZJYmZkbmFtZVxmUlwgfFwgXGZCXC1cLW91dHB1dFwtdGFyZ2V0PVxmSWJmZG5hbWVcZlAgIlx8XSIKLS5SQiAiW1x8IiBcLVJcIFxmSXNlY3Rpb25uYW1lXGZSXCB8XCBcZkJcLVwtcmVtb3ZlXC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lXGZQICJcfF0iCi0uUkIgIltcfCIgXC1zXGZSXCB8XCBcZkJcLVwtc3RyaXBcLWFsbCAiXHxdIgotLlJCICJbXHwiIFwtU1xmUlwgfFwgXGZCXC1nXGZSXCB8XCBcZkJcLVwtc3RyaXBcLWRlYnVnICJcfF0iCi0uUkIgIltcfCIgXC1cLXN0cmlwXC11bm5lZWRlZFxmUiAiXHxdIgotLlJCICJbXHwiIFwteFxmUlwgfFwgXGZCXC1cLWRpc2NhcmRcLWFsbCAiXHxdIgotLlJCICJbXHwiIFwtWFxmUlwgfFwgXGZCXC1cLWRpc2NhcmRcLWxvY2FscyAiXHxdIgotLlJCICJbXHwiIFwtS1wgXGZJc3ltYm9sbmFtZVxmUlwgfFwgXGZCXC1cLWtlZXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtTlwgXGZJc3ltYm9sbmFtZVxmUlwgfFwgXGZCXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZVxmUiAiXHxdIgotLlJCICJbXHwiIFwtb1wgXGZJZmlsZVxmXFIgIlx8XSIKLS5SQiAiW1x8IiBcLXBcZlJcIHxcIFxmQlwtXC1wcmVzZXJ2ZVwtZGF0ZXMgIlx8XSIKLS5SQiAiW1x8IiBcLXZcZlJcIHxcIFxmQlwtXC12ZXJib3NlICJcfF0iCi0uUkIgIltcfCIgXC1WXGZSXCB8XCBcZkJcLVwtdmVyc2lvbiAiXHxdIgotLlJCICJbXHwiIFwtVlxmUlwgfFwgXGZCXC1cLWhlbHAgIlx8XSIKLS5JIG9iamZpbGVcYwotXCYuXHwuXHwuCi0KLS5TSCBERVNDUklQVElPTgotR05VCi0uQiBzdHJpcAotZGlzY2FyZHMgYWxsIHN5bWJvbHMgZnJvbSB0aGUgb2JqZWN0IGZpbGVzCi0uSVIgb2JqZmlsZSAuCi1UaGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgbWF5IGluY2x1ZGUgYXJjaGl2ZXMuCi1BdCBsZWFzdCBvbmUgb2JqZWN0IGZpbGUgbXVzdCBiZSBnaXZlbi4KLQotLlAKLS5CIHN0cmlwCi1tb2RpZmllcyB0aGUgZmlsZXMgbmFtZWQgaW4gaXRzIGFyZ3VtZW50LAotcmF0aGVyIHRoYW4gd3JpdGluZyBtb2RpZmllZCBjb3BpZXMgdW5kZXIgZGlmZmVyZW50IG5hbWVzLgotCi0uU0ggT1BUSU9OUwotLlRQCi0uQiAiXC1GIFxmSWJmZG5hbWUiCi0uVFAKLS5CICJcLVwtdGFyZ2V0PVxmSWJmZG5hbWUiCi1UcmVhdCB0aGUgb3JpZ2luYWwgXGZJb2JqZmlsZVxmUCBhcyBhIGZpbGUgd2l0aCB0aGUgb2JqZWN0Ci1jb2RlIGZvcm1hdCBcZkliZmRuYW1lXGZQLCBhbmQgcmV3cml0ZSBpdCBpbiB0aGUgc2FtZSBmb3JtYXQuCi0KLS5UUAotLkIgXC1cLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCi0uQiBzdHJpcAotYW5kIGV4aXQuCi0KLS5UUAotLkIgIlwtSSBcZkliZmRuYW1lCi0uVFAKLS5CICJcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lIgotVHJlYXQgdGhlIG9yaWdpbmFsIFxmSW9iamZpbGVcZlAgYXMgYSBmaWxlIHdpdGggdGhlIG9iamVjdAotY29kZSBmb3JtYXQgXGZJYmZkbmFtZVxmUC4KLQotLlRQCi0uQiAiXC1PIFxmSWJmZG5hbWVcZlAiCi0uVFAKLS5CICJcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZSIKLVJlcGxhY2UgXGZJb2JqZmlsZVxmUCB3aXRoIGEgZmlsZSBpbiB0aGUgb3V0cHV0IGZvcm1hdCBcZkliZmRuYW1lXGZQLgotCi0uVFAKLS5CICJcLVIgXGZJc2VjdGlvbm5hbWVcZlAiCi0uVFAKLS5CICJcLVwtcmVtb3ZlXC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lIgotUmVtb3ZlIHRoZSBuYW1lZCBzZWN0aW9uIGZyb20gdGhlIGZpbGUuICBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZQotdGhhbiBvbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uIGluYXBwcm9wcmlhdGVseSBtYXkgbWFrZSB0aGUKLW9iamVjdCBmaWxlIHVudXNhYmxlLgotCi0uVFAKLS5CIFwtcwotLlRQCi0uQiBcLVwtc3RyaXBcLWFsbAotUmVtb3ZlIGFsbCBzeW1ib2xzLgotCi0uVFAKLS5CIFwtUwotLlRQCi0uQiBcLWcKLS5UUAotLkIgXC1cLXN0cmlwXC1kZWJ1ZwotUmVtb3ZlIGRlYnVnZ2luZyBzeW1ib2xzIG9ubHkuCi0KLS5UUAotLkIgXC1cLXN0cmlwXC11bm5lZWRlZAotU3RyaXAgYWxsIHN5bWJvbHMgdGhhdCBhcmUgbm90IG5lZWRlZCBmb3IgcmVsb2NhdGlvbiBwcm9jZXNzaW5nLgotCi0uVFAKLS5CIFwtTiBcZklzeW1ib2xuYW1lXGZSCi0uVFAKLS5CIFwtXC1zdHJpcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKLVJlbW92ZSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24KLW1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZSwgYW5kIG1heSBiZSBjb21iaW5lZCB3aXRoIG90aGVyIHN0cmlwCi1vcHRpb25zLgotCi0uVFAKLS5CIFwtbyBcZklmaWxlXGZSCi1QdXQgdGhlIHN0cmlwcGVkIG91dHB1dCBpbiBcZklmaWxlXGZSLCByYXRoZXIgdGhhbiByZXBsYWNpbmcgdGhlCi1leGlzdGluZyBmaWxlLiAgV2hlbiB0aGlzIGFyZ3VtZW50IGlzIHVzZWQsIG9ubHkgb25lIFxmSW9iamZpbGVcZlIKLWFyZ3VtZW50IG1heSBiZSBzcGVjaWZpZWQuCi0KLS5UUAotLkIgXC1wCi0uVFAKLS5CIFwtXC1wcmVzZXJ2ZS1kYXRlcwotUHJlc2VydmUgdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGVzIG9mIHRoZSBmaWxlLgotCi0uVFAKLS5CIFwteAotLlRQCi0uQiBcLVwtZGlzY2FyZFwtYWxsCi1SZW1vdmUgbm9uLWdsb2JhbCBzeW1ib2xzLgotCi0uVFAKLS5CIFwtWAotLlRQCi0uQiBcLVwtZGlzY2FyZFwtbG9jYWxzCi1SZW1vdmUgY29tcGlsZXItZ2VuZXJhdGVkIGxvY2FsIHN5bWJvbHMuCi0oVGhlc2UgdXN1YWxseSBzdGFydCB3aXRoIGBgTCcnIG9yIGBgLicnLikKLQotLlRQCi0uQiBcLUsgXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLWtlZXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lCi1Db3B5IG9ubHkgc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0KLS5UUAotLkIgXC1OIFxmSXN5bWJvbG5hbWVcZlIsIFxmQlwtXC1zdHJpcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKLURvIG5vdCBjb3B5IHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGZyb20gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIG9wdGlvbgotbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLCBhbmQgbWF5IGJlIGNvbWJpbmVkIHdpdGggc3RyaXAgb3B0aW9ucwotb3RoZXIgdGhhbiBcZkJcLUtcZlIuCi0KLS5UUAotLkIgXC12Ci0uVFAKLS5CIFwtXC12ZXJib3NlCi1WZXJib3NlIG91dHB1dDogbGlzdCBhbGwgb2JqZWN0IGZpbGVzIG1vZGlmaWVkLiAgSW4gdGhlIGNhc2Ugb2YKLWFyY2hpdmVzLAotLkIgInN0cmlwIFwtdiIKLWxpc3RzIGFsbCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLgotCi0uVFAKLS5CIFwtVgotLlRQCi0uQiBcLVwtdmVyc2lvbgotU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIFxmQnN0cmlwXGZQIGFuZCBleGl0LgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAotZW50cnkgaW4gCi0uQlIgaW5mbyA7Ci0uSVIgIlRoZSBHTlUgQmluYXJ5IFV0aWxpdGllcyIgLAotUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpLgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9zeXNkdW1wLmMgYi9iaW51dGlscy9zeXNkdW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MjFlOGMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3lzZHVtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkwICswLDAgQEAKLS8qIFN5c3JvZmYgb2JqZWN0IGZvcm1hdCBkdW1wZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4uCi0KLSBUaGlzIHByb2dyYW0gcmVhZHMgYSBTWVNST0ZGIG9iamVjdCBmaWxlIGFuZCBwcmludHMgaXQgaW4gYW4KLSBhbG1vc3QgaHVtYW4gcmVhZGFibGUgZm9ybSB0byBzdGRvdXQuICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxsaWJpYmVydHkuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLSNpbmNsdWRlICJzeXNyb2ZmLmgiCi0KLSNkZWZpbmUgUFJPR1JBTV9WRVJTSU9OICIxLjAiCi0KLXN0YXRpYyBpbnQgZHVtcCA9IDE7Ci1zdGF0aWMgaW50IHNlZ21lbnRlZF9wOwotc3RhdGljIGludCBjb2RlOwotc3RhdGljIGludCBhZGRyc2l6ZSA9IDQ7Ci1zdGF0aWMgRklMRSAqZmlsZTsKLQotY2hhciAqCi1nZXRDSEFSUyAocHRyLCBpZHgsIHNpemUsIG1heCkKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBtYXg7Ci17Ci0gIGludCBvYyA9ICppZHggLyA4OwotICBjaGFyICpyOwotICBpbnQgYiA9IHNpemU7Ci0gIGlmIChiID49IG1heCkKLSAgICB7Ci0gICAgICByZXR1cm4gIip1bmRlZmluZWQqIjsKLSAgICB9Ci0KLSAgaWYgKGIgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBHb3QgdG8gd29yayBvdXQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGZyb20gc2VsZiAqLwotICAgICAgYiA9IHB0cltvYysrXTsKLSAgICAgICgqaWR4KSArPSA4OwotICAgIH0KLQotICAqaWR4ICs9IGIgKiA4OwotICByID0geGNhbGxvYyAoYiArIDEsIDEpOwotICBtZW1jcHkgKHIsIHB0ciArIG9jLCBiKTsKLSAgcltiXSA9IDA7Ci0gIHJldHVybiByOwotfQotCi1zdGF0aWMgdm9pZAotZGggKHB0ciwgc2l6ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IGk7Ci0gIGludCBqOwotICBpbnQgc3BhbiA9IDE2OwotCi0gIHByaW50ZiAoIlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBzcGFuKQotICAgIHsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBzcGFuOyBqKyspCi0JewotCSAgaWYgKGogKyBpIDwgc2l6ZSkgCi0JICAgIHByaW50ZiAoIiUwMnggIiwgcHRyW2kgKyBqXSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJpbnRmICgiICAgIik7Ci0JfQotCi0gICAgICBmb3IgKGogPSAwOyBqIDwgc3BhbiAmJiBqICsgaSA8IHNpemU7IGorKykKLQl7Ci0JICBpbnQgYyA9IHB0cltpICsgal07Ci0JICBpZiAoYyA8IDMyIHx8IGMgPiAxMjcpCi0JICAgIGMgPSAnLic7Ci0JICBwcmludGYgKCIlYyIsIGMpOwotCX0KLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotfQotCi1pbnQKLWZpbGx1cCAocHRyKQotICAgICBjaGFyICpwdHI7Ci17Ci0gIGludCBzaXplOwotICBpbnQgc3VtOwotICBpbnQgaTsKLSAgc2l6ZSA9IGdldGMgKGZpbGUpIC0gMjsKLSAgZnJlYWQgKHB0ciwgMSwgc2l6ZSwgZmlsZSk7Ci0gIHN1bSA9IGNvZGUgKyBzaXplICsgMjsKLSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICBzdW0gKz0gcHRyW2ldOwotICAgIH0KLQotICBpZiAoKHN1bSAmIDB4ZmYpICE9IDB4ZmYpCi0gICAgewotICAgICAgcHJpbnRmICgiU1VNIElTICV4XG4iLCBzdW0pOwotICAgIH0KLSAgaWYgKGR1bXApCi0gICAgZGggKHB0ciwgc2l6ZSk7Ci0KLSAgcmV0dXJuIHNpemUgLSAxOwotfQotCi1iYXJyYXkKLWdldEJBUlJBWSAocHRyLCBpZHgsIGRzaXplLCBtYXgpCi0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICAgaW50ICppZHg7Ci0gICAgIGludCBkc2l6ZTsKLSAgICAgaW50IG1heDsKLXsKLSAgYmFycmF5IHJlczsKLSAgaW50IGk7Ci0gIGludCBieXRlID0gKmlkeCAvIDg7Ci0gIGludCBzaXplID0gcHRyW2J5dGUrK107Ci0gIHJlcy5sZW4gPSBzaXplOwotICByZXMuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKHNpemUpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHJlcy5kYXRhW2ldID0gcHRyW2J5dGUrK107Ci0gICAgfQotICByZXR1cm4gcmVzOwotfQotCi1pbnQKLWdldElOVCAocHRyLCBpZHgsIHNpemUsIG1heCkKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBtYXg7Ci17Ci0gIGludCBuID0gMDsKLSAgaW50IGJ5dGUgPSAqaWR4IC8gODsKLQotICBpZiAoYnl0ZSA+PSBtYXgpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoc2l6ZSA9PSAtMikKLSAgICBzaXplID0gYWRkcnNpemU7Ci0gIGlmIChzaXplID09IC0xKQotICAgIHNpemUgPSAwOwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgMToKLSAgICAgIG4gPSAocHRyW2J5dGVdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIG4gPSAocHRyW2J5dGUgKyAwXSA8PCA4KSArIHB0cltieXRlICsgMV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBuID0gKHB0cltieXRlICsgMF0gPDwgMjQpICsgKHB0cltieXRlICsgMV0gPDwgMTYpICsgKHB0cltieXRlICsgMl0gPDwgOCkgKyAocHRyW2J5dGUgKyAzXSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICAqaWR4ICs9IHNpemUgKiA4OwotICByZXR1cm4gbjsKLX0KLQotaW50Ci1nZXRCSVRTIChwdHIsIGlkeCwgc2l6ZSwgbWF4KQotICAgICBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZSwgbWF4OwotewotICBpbnQgYnl0ZSA9ICppZHggLyA4OwotICBpbnQgYml0ID0gKmlkeCAlIDg7Ci0KLSAgaWYgKGJ5dGUgPj0gbWF4KQotICAgIHJldHVybiAwOwotCi0gICppZHggKz0gc2l6ZTsKLQotICByZXR1cm4gKHB0cltieXRlXSA+PiAoOCAtIGJpdCAtIHNpemUpKSAmICgoMSA8PCBzaXplKSAtIDEpOwotfQotCi1zdGF0aWMgdm9pZAotaXRoZWFkZXIgKG5hbWUsIGNvZGUpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBjb2RlOwotewotICBwcmludGYgKCJcbiVzIDB4JTAyeFxuIiwgbmFtZSwgY29kZSk7Ci19Ci0KLXN0YXRpYyBpbnQgaW5kZW50Owotc3RhdGljIHZvaWQKLXAgKCkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLSAgICB7Ci0gICAgICBwcmludGYgKCJ8ICIpOwotICAgIH0KLSAgcHJpbnRmICgiPiAiKTsKLX0KLQotc3RhdGljIHZvaWQKLXRhYm91dCAoKQotewotICBwICgpOwotfQotCi1zdGF0aWMgdm9pZAotcGJhcnJheSAoeSkKLSAgICAgYmFycmF5ICp5OwotewotICBpbnQgeDsKLSAgcHJpbnRmICgiJWQgKCIsIHktPmxlbik7Ci0gIGZvciAoeCA9IDA7IHggPCB5LT5sZW47IHgrKykKLSAgICB7Ci0gICAgICBwcmludGYgKCIoJTAyeCAlYykiLCB5LT5kYXRhW3hdLCBpc3ByaW50ICh5LT5kYXRhW3hdKSA/IHktPmRhdGFbeF0gOiAnLicpOwotICAgIH0KLSAgcHJpbnRmICgiKVxuIik7Ci19Ci0KLSNkZWZpbmUgU1lTUk9GRl9QUklOVAotI2RlZmluZSBTWVNST0ZGX1NXQVBfSU4KLQotI2luY2x1ZGUgInN5c3JvZmYuYyIKLQotLyogCi0gKiBGSVhNRTogc3lzaW5mbywgd2hpY2ggZ2VuZXJhdGVzIHN5c3JvZmYuW2NoXSBmcm9tIHN5c3JvZmYuaW5mbywgY2FuJ3QKLSAqIGhhY2sgdGhlIHNwZWNpYWwgY2FzZSBvZiB0aGUgdHIgYmxvY2ssIHdoaWNoIGhhcyBubyBjb250ZW50cy4gIFNvIHdlCi0gKiBpbXBsZW1lbnQgb3VyIG93biBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgaW4gYW5kIHByaW50aW5nIG91dCB0aGUgdHIKLSAqIGJsb2NrLgotICovCi0KLSNkZWZpbmUgSVRfdHJfQ09ERQkweDdmCi12b2lkCi1zeXNyb2ZmX3N3YXBfdHJfaW4oKQotewotCWNoYXIgcmF3WzI1NV07Ci0KLQltZW1zZXQocmF3LCAwLCAyNTUpOwotCWZpbGx1cChyYXcpOwotfQotCi12b2lkCi1zeXNyb2ZmX3ByaW50X3RyX291dCgpCi17Ci0JaXRoZWFkZXIoInRyIiwgSVRfdHJfQ09ERSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldG9uZSAodHlwZSkKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGludCBjID0gZ2V0YyAoZmlsZSk7Ci0gIGNvZGUgPSBjOwotCi0gIGlmICgoYyAmIDB4N2YpICE9IHR5cGUpCi0gICAgewotICAgICAgdW5nZXRjIChjLCBmaWxlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzd2l0Y2ggKGMgJiAweDdmKQotICAgIHsKLSAgICBjYXNlIElUX2NzX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2NzIGR1bW15OwotCXN5c3JvZmZfc3dhcF9jc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2NzX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZGxuX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RsbiBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZGxuX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZGxuX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfaGRfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfaGQgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2hkX2luICgmZHVtbXkpOwotCWFkZHJzaXplID0gZHVtbXkuYWZsOwotCXN5c3JvZmZfcHJpbnRfaGRfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kYXJfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGFyIGR1bW15OwotCXN5c3JvZmZfc3dhcF9kYXJfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kYXJfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kc3lfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHN5IGR1bW15OwotCXN5c3JvZmZfc3dhcF9kc3lfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kc3lfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kZnBfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGZwIGR1bW15OwotCXN5c3JvZmZfc3dhcF9kZnBfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kZnBfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kc29fQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHNvIGR1bW15OwotCXN5c3JvZmZfc3dhcF9kc29faW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kc29fb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kcHRfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHB0IGR1bW15OwotCXN5c3JvZmZfc3dhcF9kcHRfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kcHRfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kZW5fQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGVuIGR1bW15OwotCXN5c3JvZmZfc3dhcF9kZW5faW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kZW5fb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kYnRfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGJ0IGR1bW15OwotCXN5c3JvZmZfc3dhcF9kYnRfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kYnRfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kdHlfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHR5IGR1bW15OwotCXN5c3JvZmZfc3dhcF9kdHlfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kdHlfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF91bl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF91biBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfdW5faW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF91bl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX3NjX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX3NjIGR1bW15OwotCXN5c3JvZmZfc3dhcF9zY19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X3NjX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZXJfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZXIgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2VyX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZXJfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9lZF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9lZCBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZWRfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9lZF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX3NoX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX3NoIGR1bW15OwotCXN5c3JvZmZfc3dhcF9zaF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X3NoX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfb2JfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfb2IgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX29iX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfb2Jfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9ybF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9ybCBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfcmxfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9ybF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2R1X0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2R1IGR1bW15OwotCXN5c3JvZmZfc3dhcF9kdV9pbiAoJmR1bW15KTsKLQotCXN5c3JvZmZfcHJpbnRfZHVfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kdXNfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHVzIGR1bW15OwotCXN5c3JvZmZfc3dhcF9kdXNfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kdXNfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kdWxfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHVsIGR1bW15OwotCXN5c3JvZmZfc3dhcF9kdWxfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kdWxfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kc3NfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHNzIGR1bW15OwotCXN5c3JvZmZfc3dhcF9kc3NfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kc3Nfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9oc19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9ocyBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfaHNfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9oc19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rwc19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kcHMgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rwc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rwc19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX3RyX0NPREU6Ci0gICAgICB7Ci0Jc3lzcm9mZl9zd2FwX3RyX2luICgpOwotCXN5c3JvZmZfcHJpbnRfdHJfb3V0ICgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kZHNfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGRzIGR1bW15OwotCXN5c3JvZmZfc3dhcF9kZHNfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kZHNfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZiAoIkdPVCBBICV4XG4iLCBjKTsKLSAgICAgIHJldHVybiAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotb3B0ICh4KQotICAgICBpbnQgeDsKLXsKLSAgcmV0dXJuIGdldG9uZSAoeCk7Ci19Ci0KLSNpZiAwCi0KLS8qIFRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQuICAqLwotCi1zdGF0aWMgdm9pZAotdW5pdF9pbmZvX2xpc3QgKCkKLXsKLSAgd2hpbGUgKG9wdCAoSVRfdW5fQ09ERSkpCi0gICAgewotICAgICAgZ2V0b25lIChJVF91c19DT0RFKTsKLQotICAgICAgd2hpbGUgKGdldG9uZSAoSVRfc2NfQ09ERSkpCi0JZ2V0b25lIChJVF9zc19DT0RFKTsKLQotICAgICAgd2hpbGUgKGdldG9uZSAoSVRfZXJfQ09ERSkpCi0JOwotCi0gICAgICB3aGlsZSAoZ2V0b25lIChJVF9lZF9DT0RFKSkKLQk7Ci0gICAgfQotfQotCi0jZW5kaWYKLQotI2lmIDAKLQotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmplY3RfYm9keV9saXN0ICgpCi17Ci0gIHdoaWxlIChnZXRvbmUgKElUX3NoX0NPREUpKQotICAgIHsKLSAgICAgIHdoaWxlIChnZXRvbmUgKElUX29iX0NPREUpKQotCTsKLSAgICAgIHdoaWxlIChnZXRvbmUgKElUX3JsX0NPREUpKQotCTsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotbXVzdCAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIGlmICghZ2V0b25lICh4KSkKLSAgICB7Ci0gICAgICBwcmludGYgKCJXQU5URUQgJXghIVxuIiwgeCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotdGFiIChpLCBzKQotICAgICBpbnQgaTsKLSAgICAgY2hhciAqczsKLXsKLSAgaW5kZW50ICs9IGk7Ci0gIGlmIChzKQotICAgIHsKLSAgICAgIHAgKCk7Ci0gICAgICBwcmludGYgKHMpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGRlcml2ZWRfdHlwZSAoKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfc3ltYm9sX2luZm8gKCkKLXsKLSAgdGFiICgxLCAiU1lNQk9MIElORk8iKTsKLSAgd2hpbGUgKG9wdCAoSVRfZHN5X0NPREUpKQotICAgIHsKLSAgICAgIGlmIChvcHQgKElUX2R0eV9DT0RFKSkKLQl7Ci0JICBtdXN0IChJVF9kYnRfQ09ERSk7Ci0JICBkZXJpdmVkX3R5cGUgKCk7Ci0JICBtdXN0IChJVF9kdHlfQ09ERSk7Ci0JfQotICAgIH0KLSAgdGFiICgtMSwgIiIpOwotfQotCi1zdGF0aWMgdm9pZAotZGVyaXZlZF90eXBlICgpCi17Ci0gIHRhYiAoMSwgIkRFUklWRUQgVFlQRSIpOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAob3B0IChJVF9kcHBfQ09ERSkpCi0JewotCSAgZHVtcF9zeW1ib2xfaW5mbyAoKTsKLQkgIG11c3QgKElUX2RwcF9DT0RFKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2RmcF9DT0RFKSkKLQl7Ci0JICBkdW1wX3N5bWJvbF9pbmZvICgpOwotCSAgbXVzdCAoSVRfZGZwX0NPREUpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZGVuX0NPREUpKQotCXsKLQkgIGR1bXBfc3ltYm9sX2luZm8gKCk7Ci0JICBtdXN0IChJVF9kZW5fQ09ERSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kZW5fQ09ERSkpCi0JewotCSAgZHVtcF9zeW1ib2xfaW5mbyAoKTsKLQkgIG11c3QgKElUX2Rlbl9DT0RFKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2Rkc19DT0RFKSkKLQl7Ci0JICBkdW1wX3N5bWJvbF9pbmZvICgpOwotCSAgbXVzdCAoSVRfZGRzX0NPREUpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZGFyX0NPREUpKQotCXsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2RwdF9DT0RFKSkKLQl7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kdWxfQ09ERSkpCi0JewotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZHNlX0NPREUpKQotCXsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2RvdF9DT0RFKSkKLQl7Ci0JfQotICAgICAgZWxzZQotCWJyZWFrOwotICAgIH0KLQotICB0YWIgKC0xLCAiIik7Ci19Ci0KLSNpZiAwCi0KLS8qIFRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJvZ3JhbV9zdHJ1Y3R1cmUgKCkKLXsKLSAgdGFiICgxLCAiUFJPR1JBTSBTVFJVQ1RVUkUiKTsKLSAgd2hpbGUgKG9wdCAoSVRfZHBzX0NPREUpKQotICAgIHsKLSAgICAgIG11c3QgKElUX2Rzb19DT0RFKTsKLSAgICAgIG9wdCAoSVRfZHNzX0NPREUpOwotICAgICAgZHVtcF9zeW1ib2xfaW5mbyAoKTsKLSAgICAgIG11c3QgKElUX2Rwc19DT0RFKTsKLSAgICB9Ci0gIHRhYiAoLTEsICIiKTsKLX0KLQotI2VuZGlmCi0KLSNpZiAwCi0KLS8qIFRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZGVidWdfbGlzdCAoKQotewotICB0YWIgKDEsICJERUJVRyBMSVNUIik7Ci0KLSAgbXVzdCAoSVRfZHVfQ09ERSk7Ci0gIG9wdCAoSVRfZHVzX0NPREUpOwotICBwcm9ncmFtX3N0cnVjdHVyZSAoKTsKLSAgbXVzdCAoSVRfZGxuX0NPREUpOwotCi0gIHRhYiAoLTEsICIiKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1tb2R1bGUgKCkKLXsKLSAgaW50IGMgPSAwOwotICBpbnQgbCA9IDA7Ci0KLSAgdGFiICgxLCAiTU9EVUxFKioqXG4iKTsKLQotICBkbwotICAgIHsKLSAgICAgIGMgPSBnZXRjIChmaWxlKTsKLSAgICAgIHVuZ2V0YyAoYywgZmlsZSk7Ci0KLSAgICAgIGMgJj0gMHg3ZjsKLSAgICB9Ci0gIHdoaWxlIChnZXRvbmUgKGMpICYmIGMgIT0gSVRfdHJfQ09ERSk7Ci0KLSNpZiAwCi0gIG11c3QgKElUX2NzX0NPREUpOwotICBtdXN0IChJVF9oZF9DT0RFKTsKLSAgb3B0IChJVF9oc19DT0RFKTsKLQotICB1bml0X2luZm9fbGlzdCAoKTsKLSAgb2JqZWN0X2JvZHlfbGlzdCAoKTsKLSAgZGVidWdfbGlzdCAoKTsKLQotICBtdXN0IChJVF90cl9DT0RFKTsKLSNlbmRpZgotICB0YWIgKC0xLCAiIik7Ci0KLSAgYyA9IGdldGMgKGZpbGUpOwotICB3aGlsZSAoYyAhPSBFT0YpCi0gICAgewotICAgICAgcHJpbnRmICgiJTAyeCAiLCBjKTsKLSAgICAgIGwrKzsKLSAgICAgIGlmIChsID09IDMyKQotCXsKLQkgIHByaW50ZiAoIlxuIik7Ci0JICBsID0gMDsKLQl9Ci0gICAgICBjID0gZ2V0YyAoZmlsZSk7Ci0gICAgfQotfQotCi1jaGFyICpwcm9ncmFtX25hbWU7Ci0KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIlVzYWdlOiAlcyBbLWhWXSBpbi1maWxlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQKLXNob3dfaGVscCAoKQotewotICBwcmludGYgKF8oIiVzOiBQcmludCBhIGh1bWFuIHJlYWRhYmxlIGludGVycHJldGF0aW9uIG9mIGEgU1lTUk9GRiBvYmplY3QgZmlsZVxuIiksCi0JICBwcm9ncmFtX25hbWUpOwotICBzaG93X3VzYWdlIChzdGRvdXQsIDApOwotfQotCi1pbnQKLW1haW4gKGFjLCBhdikKLSAgICAgaW50IGFjOwotICAgICBjaGFyICoqYXY7Ci17Ci0gIGNoYXIgKmlucHV0X2ZpbGUgPSBOVUxMOwotICBpbnQgb3B0OwotICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci0gIHsKLSAgICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKLSAgICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnfSwKLSAgICB7TlVMTCwgbm9fYXJndW1lbnQsIDAsIDB9Ci0gIH07Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhdlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcgKGFjLCBhdiwgImhWIiwgbG9uZ19vcHRpb25zLCAoaW50ICopIE5VTEwpKSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChvcHQpCi0JewotCWNhc2UgJ2gnOgotCSAgc2hvd19oZWxwICgpOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlICdWJzoKLQkgIHByaW50ZiAoXygiR05VICVzIHZlcnNpb24gJXNcbiIpLCBwcm9ncmFtX25hbWUsIFBST0dSQU1fVkVSU0lPTik7Ci0JICBleGl0ICgwKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAwOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbWF5IGJlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotCi0gIGlmIChvcHRpbmQgPCBhYykKLSAgICB7Ci0gICAgICBpbnB1dF9maWxlID0gYXZbb3B0aW5kXTsKLSAgICB9Ci0KLSAgaWYgKCFpbnB1dF9maWxlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBmaWxlID0gZm9wZW4gKGlucHV0X2ZpbGUsIEZPUEVOX1JCKTsKLSAgaWYgKCFmaWxlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXNcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsIGlucHV0X2ZpbGUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIG1vZHVsZSAoKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zeXNpbmZvLnkgYi9iaW51dGlscy9zeXNpbmZvLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTg3MzcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3lzaW5mby55CisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLSV7Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotZXh0ZXJuIGNoYXIgKndvcmQ7Ci1leHRlcm4gY2hhciB3cml0ZWNvZGU7Ci1leHRlcm4gaW50IG51bWJlcjsKLWV4dGVybiBpbnQgdW5pdDsKLWNoYXIgbmljZV9uYW1lWzEwMDBdOwotY2hhciAqaXQ7Ci1pbnQgc29mYXI7Ci1pbnQgd2lkdGg7Ci1pbnQgY29kZTsKLWNoYXIgKiByZXBlYXQ7Ci1jaGFyICpvbGRyZXBlYXQ7Ci1jaGFyICpuYW1lOwotaW50IHJkZXB0aDsKLWNoYXIgKmxvb3AgW10gPSB7IiIsIm4iLCJtIiwiLypCQUQqLyJ9OwotY2hhciAqbmFtZXNbXSA9IHsiICIsIltuXSIsIltuXVttXSJ9OwotY2hhciAqcG5hbWVzW109IHsiIiwiKiIsIioqIn07Ci0lfQotCi0KLSV1bmlvbiB7Ci0gaW50IGk7Ci0gY2hhciAqczsKLX0gCi0ldG9rZW4gQ09ORAotJXRva2VuIFJFUEVBVAotJXRva2VuICcoJyAnKScKLSV0b2tlbiA8cz4gVFlQRQotJXRva2VuIDxzPiBOQU1FCi0ldG9rZW4gPGk+IE5VTUJFUiBVTklUCi0ldHlwZSA8aT4gYXR0cl9zaXplIAotJXR5cGUgPHM+IGF0dHJfZGVzYyBhdHRyX2lkIGF0dHJfdHlwZQotJSUKLQotdG9wOiAgewotICBzd2l0Y2ggKHdyaXRlY29kZSkKLSAgICB7Ci0gICAgY2FzZSAnaSc6Ci0gICAgICBwcmludGYoIiNpZmRlZiBTWVNST0ZGX1NXQVBfSU5cbiIpOwotICAgICAgYnJlYWs7IAotICAgIGNhc2UgJ3AnOgotICAgICAgcHJpbnRmKCIjaWZkZWYgU1lTUk9GRl9wXG4iKTsKLSAgICAgIGJyZWFrOyAKLSAgICBjYXNlICdkJzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2cnOgotICAgICAgcHJpbnRmKCIjaWZkZWYgU1lTUk9GRl9TV0FQX09VVFxuIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICAgIHByaW50ZigiI2lmZGVmIFNZU1JPRkZfUFJJTlRcbiIpOwotICAgICAgcHJpbnRmKCIjaW5jbHVkZSA8c3RkaW8uaD5cbiIpOwotICAgICAgcHJpbnRmKCIjaW5jbHVkZSA8c3RkbGliLmg+XG4iKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSB9IAotaXRfbGlzdCB7Ci0gIHN3aXRjaCAod3JpdGVjb2RlKSB7Ci0gIGNhc2UgJ2knOgotICBjYXNlICdwJzoKLSAgY2FzZSAnZyc6Ci0gIGNhc2UgJ2MnOgotICAgIHByaW50ZigiI2VuZGlmXG4iKTsKLSAgICBicmVhazsgCi0gIGNhc2UgJ2QnOgotICAgIGJyZWFrOwotICB9Ci19Ci0KLSAgOwotCi0KLWl0X2xpc3Q6IGl0IGl0X2xpc3QKLSAgfAotICA7Ci0KLWl0OgotCScoJyBOQU1FIE5VTUJFUiAKLSAgICAgIHsKLQlpdCA9ICQyOyBjb2RlID0gJDM7Ci0Jc3dpdGNoICh3cml0ZWNvZGUpIAotCSAgewotCSAgY2FzZSAnZCc6Ci0JICAgIHByaW50ZigiXG5cblxuI2RlZmluZSBJVF8lc19DT0RFIDB4JXhcbiIsIGl0LGNvZGUpOwotCSAgICBwcmludGYoInN0cnVjdCBJVF8lcyB7IFxuIiwgaXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ2knOgotCSAgICBwcmludGYoInZvaWQgc3lzcm9mZl9zd2FwXyVzX2luKHB0cilcbiIsJDIpOwotCSAgICBwcmludGYoInN0cnVjdCBJVF8lcyAqcHRyO1xuIiwgaXQpOwotCSAgICBwcmludGYoIntcbiIpOwotCSAgICBwcmludGYoImNoYXIgcmF3WzI1NV07XG4iKTsKLQkgICAgcHJpbnRmKCJcdGludCBpZHggPSAwIDtcbiIpOwotCSAgICBwcmludGYoIlx0aW50IHNpemU7XG4iKTsKLQkgICAgcHJpbnRmKCJtZW1zZXQocmF3LDAsMjU1KTtcbiIpOwkKLQkgICAgcHJpbnRmKCJtZW1zZXQocHRyLDAsc2l6ZW9mKCpwdHIpKTtcbiIpOwotCSAgICBwcmludGYoInNpemUgPSBmaWxsdXAocmF3KTtcbiIpOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ2cnOgotCSAgICBwcmludGYoInZvaWQgc3lzcm9mZl9zd2FwXyVzX291dChmaWxlLHB0cilcbiIsJDIpOwotCSAgICBwcmludGYoIkZJTEUgKiBmaWxlO1xuIik7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzICpwdHI7XG4iLCBpdCk7Ci0JICAgIHByaW50Zigie1xuIik7Ci0JICAgIHByaW50ZigiXHRjaGFyIHJhd1syNTVdO1xuIik7Ci0JICAgIHByaW50ZigiXHRpbnQgaWR4ID0gMTYgO1xuIik7Ci0JICAgIHByaW50ZigiXHRtZW1zZXQgKHJhdywgMCwgMjU1KTtcbiIpOwotCSAgICBwcmludGYoIlx0Y29kZSA9IElUXyVzX0NPREU7XG4iLCBpdCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnbyc6Ci0JICAgIHByaW50Zigidm9pZCBzeXNyb2ZmX3N3YXBfJXNfb3V0KGFiZmQscHRyKVxuIiwkMik7Ci0JICAgIHByaW50ZigiYmZkICogYWJmZDtcbiIpOwotCSAgICBwcmludGYoInN0cnVjdCBJVF8lcyAqcHRyO1xuIixpdCk7Ci0JICAgIHByaW50Zigie1xuIik7Ci0JICAgIHByaW50ZigiaW50IGlkeCA9IDAgO1xuIik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnYyc6Ci0JICAgIHByaW50Zigidm9pZCBzeXNyb2ZmX3ByaW50XyVzX291dChwdHIpXG4iLCQyKTsKLQkgICAgcHJpbnRmKCJzdHJ1Y3QgSVRfJXMgKnB0cjtcbiIsIGl0KTsKLQkgICAgcHJpbnRmKCJ7XG4iKTsKLQkgICAgcHJpbnRmKCJpdGhlYWRlcihcIiVzXCIsIElUXyVzX0NPREUpO1xuIiwkMiwkMik7Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlICd0JzoKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLSAgICAgIH0gCi0JaXRfZmllbGRfbGlzdCAKLScpJwotewotICBzd2l0Y2ggKHdyaXRlY29kZSkgewotICBjYXNlICdkJzogCi0gICAgcHJpbnRmKCJ9O1xuIik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgJ2cnOgotICAgIHByaW50ZigiXHRjaGVja3N1bShmaWxlLHJhdywgaWR4LCBJVF8lc19DT0RFKTtcbiIsIGl0KTsKLSAgICAKLSAgY2FzZSAnaSc6Ci0KLSAgY2FzZSAnbyc6Ci0gIGNhc2UgJ2MnOgotICAgIHByaW50ZigifVxuIik7Ci0gIH0KLX0KLTsKLQotCi0KLWl0X2ZpZWxkX2xpc3Q6Ci0JCWl0X2ZpZWxkIGl0X2ZpZWxkX2xpc3QKLQl8CWNvbmRfaXRfZmllbGQgaXRfZmllbGRfbGlzdAkKLQl8CXJlcGVhdF9pdF9maWVsZCBpdF9maWVsZF9saXN0Ci0JfAotCTsKLQotcmVwZWF0X2l0X2ZpZWxkOiAnKCcgUkVQRUFUIE5BTUUKLQl7Ci0JICByZGVwdGgrKzsKLQkgIHN3aXRjaCAod3JpdGVjb2RlKSAKLQkgICAgewotCSAgICBjYXNlICdjJzoKLQkgICAgICBpZiAocmRlcHRoPT0xKQotCSAgICAgIHByaW50ZigiXHRwcmludGYoXCJyZXBlYXQgJSVkXFxuXCIsICVzKTtcbiIsJDMpOwotCSAgICAgIGlmIChyZGVwdGg9PTIpCi0JICAgICAgcHJpbnRmKCJcdHByaW50ZihcInJlcGVhdCAlJWRcXG5cIiwgJXNbbl0pO1xuIiwkMyk7Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnbyc6Ci0KLQkgICAgICBpZiAocmRlcHRoPT0xKSAKLQkJewotCSAgICAgIHByaW50ZigiXHR7IGludCBuOyBmb3IgKG4gPSAwOyBuIDwgJXM7IG4rKykge1xuIiwgICAgJDMpOwotCSAgICB9Ci0JICAgICAgaWYgKHJkZXB0aCA9PSAyKSB7Ci0JICAgICAgcHJpbnRmKCJcdHsgaW50IG07IGZvciAobSA9IDA7IG0gPCAlc1tuXTsgbSsrKSB7XG4iLCAgICAkMyk7Ci0JICAgIH0JCQotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgb2xkcmVwZWF0ID0gcmVwZWF0OwotICAgICAgICAgcmVwZWF0ID0gJDM7Ci0JfQotCi0JIGl0X2ZpZWxkX2xpc3QgJyknIAotCi0JewotCSAgcmVwZWF0ID0gb2xkcmVwZWF0OwotCSAgb2xkcmVwZWF0ID0wOwotCSAgcmRlcHRoLS07Ci0JICBzd2l0Y2ggKHdyaXRlY29kZSkKLQkgICAgewotCSAgICBjYXNlICdpJzoKLQkgICAgY2FzZSAnZyc6Ci0JICAgIGNhc2UgJ28nOgotCSAgICBjYXNlICdjJzoKLQkgIHByaW50ZigiXHR9fVxuIik7Ci0JfQotCX0KLSAgICAgICA7Ci0KLQotY29uZF9pdF9maWVsZDogJygnIENPTkQgTkFNRQotCXsKLQkgIHN3aXRjaCAod3JpdGVjb2RlKSAKLQkgICAgewotCSAgICBjYXNlICdpJzoKLQkgICAgY2FzZSAnZyc6Ci0JICAgIGNhc2UgJ28nOgotCSAgICBjYXNlICdjJzoKLQkgICAgICBwcmludGYoIlx0aWYgKCVzKSB7XG4iLCAkMyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLQkgaXRfZmllbGRfbGlzdCAnKScgCi0JewotCSAgc3dpdGNoICh3cml0ZWNvZGUpCi0JICAgIHsKLQkgICAgY2FzZSAnaSc6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdvJzoKLQkgICAgY2FzZSAnYyc6Ci0JICBwcmludGYoIlx0fVxuIik7Ci0JfQotCX0KLSAgICAgICA7Ci0KLWl0X2ZpZWxkOgotCScoJyBhdHRyX2Rlc2MgJygnIGF0dHJfdHlwZSBhdHRyX3NpemUgJyknIGF0dHJfaWQgCi0Je25hbWUgPSAkNzsgfSAKLQllbnVtcyAnKScKLQl7Ci0JICBjaGFyICpkZXNjID0gJDI7Ci0JICBjaGFyICp0eXBlID0gJDQ7Ci0JICBpbnQgc2l6ZSA9ICQ1OwotCSAgY2hhciAqaWQgPSAkNzsKLWNoYXIgKnAgPSBuYW1lc1tyZGVwdGhdOwotY2hhciAqcHRyID0gcG5hbWVzW3JkZXB0aF07Ci0JICBzd2l0Y2ggKHdyaXRlY29kZSkgCi0JICAgIHsKLQkgICAgY2FzZSAnZyc6Ci0JICAgICAgaWYgKHNpemUgJSA4KSAKLQkJewotCQkgIAotCQkgIHByaW50ZigiXHR3cml0ZUJJVFMocHRyLT4lcyVzLHJhdywmaWR4LCVkKTtcbiIsCi0JCQkgaWQsCi0JCQkgbmFtZXNbcmRlcHRoXSwgc2l6ZSk7Ci0KLQkJfQotCSAgICAgIGVsc2UgewotCQlwcmludGYoIlx0d3JpdGUlcyhwdHItPiVzJXMscmF3LCZpZHgsJWQsZmlsZSk7XG4iLAotCQkgICAgICAgdHlwZSwKLQkJICAgICAgIGlkLAotCQkgICAgICAgbmFtZXNbcmRlcHRoXSxzaXplLzgpOwotCQl9Ci0JICAgICAgYnJlYWs7CSAgICAgIAotCSAgICBjYXNlICdpJzoKLQkgICAgICB7Ci0KLQkJaWYgKHJkZXB0aCA+PSAxKQotCi0JCSAgewotCQkgICAgcHJpbnRmKCJpZiAoIXB0ci0+JXMpIHB0ci0+JXMgPSAoJXMqKXhjYWxsb2MoJXMsIHNpemVvZihwdHItPiVzWzBdKSk7XG4iLCAKLQkJCSAgIGlkLCAKLQkJCSAgIGlkLAotCQkJICAgdHlwZSwKLQkJCSAgIHJlcGVhdCwKLQkJCSAgIGlkKTsKLQkJICB9Ci0KLQkJaWYgKHJkZXB0aCA9PSAyKQotCQkgIHsKLQkJICAgIHByaW50ZigiaWYgKCFwdHItPiVzW25dKSBwdHItPiVzW25dID0gKCVzKiopeGNhbGxvYyglc1tuXSwgc2l6ZW9mKHB0ci0+JXNbbl1bMF0pKTtcbiIsIAotCQkJICAgaWQsIAotCQkJICAgaWQsCi0JCQkgICB0eXBlLAotCQkJICAgcmVwZWF0LAotCQkJICAgaWQpOwotCQkgIH0KLQotCSAgICAgIH0KLQotCSAgICAgIGlmIChzaXplICUgOCkgCi0JCXsKLQkJICBwcmludGYoIlx0cHRyLT4lcyVzID0gZ2V0QklUUyhyYXcsJmlkeCwgJWQsc2l6ZSk7XG4iLAotCQkJIGlkLAotCQkJIG5hbWVzW3JkZXB0aF0sIAotCQkJIHNpemUpOwotCQl9Ci0JICAgICAgZWxzZSB7Ci0JCXByaW50ZigiXHRwdHItPiVzJXMgPSBnZXQlcyhyYXcsJmlkeCwgJWQsc2l6ZSk7XG4iLAotCQkgICAgICAgaWQsCi0JCSAgICAgICBuYW1lc1tyZGVwdGhdLAotCQkgICAgICAgdHlwZSwKLQkJICAgICAgIHNpemUvOCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnbyc6Ci0JICAgICAgcHJpbnRmKCJcdHB1dCVzKHJhdywlZCwlZCwmaWR4LHB0ci0+JXMlcyk7XG4iLCB0eXBlLHNpemUvOCxzaXplJTgsaWQsbmFtZXNbcmRlcHRoXSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2QnOgotCSAgICAgIGlmIChyZXBlYXQpIAotCQlwcmludGYoIlx0LyogcmVwZWF0ICVzICovXG4iLCByZXBlYXQpOwotCi0JCSAgaWYgKHR5cGVbMF0gPT0gJ0knKSB7Ci0JCSAgcHJpbnRmKCJcdGludCAlcyVzOyBcdC8qICVzICovXG4iLHB0cixpZCwgZGVzYyk7Ci0JCX0KLQkJICBlbHNlIGlmICh0eXBlWzBdID09J0MnKSB7Ci0JCSAgcHJpbnRmKCJcdGNoYXIgJXMqJXM7XHQgLyogJXMgKi9cbiIscHRyLGlkLCBkZXNjKTsKLQkJfQotCSAgICAgIGVsc2UgewotCQlwcmludGYoIlx0YmFycmF5ICVzJXM7XHQgLyogJXMgKi9cbiIscHRyLGlkLCBkZXNjKTsKLQkgICAgICB9Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2MnOgotCSAgICAgIHByaW50ZigidGFib3V0KCk7XG4iKTsKLQkJICBwcmludGYoIlx0cHJpbnRmKFwiLyolLTMwcyovIHB0ci0+JXMgPSBcIik7XG4iLCBkZXNjLCBpZCk7Ci0KLQkJICBpZiAodHlwZVswXSA9PSAnSScpCi0JCSAgcHJpbnRmKCJcdHByaW50ZihcIiUlZFxcblwiLHB0ci0+JXMlcyk7XG4iLCBpZCxwKTsKLQkJICBlbHNlICAgaWYgKHR5cGVbMF0gPT0gJ0MnKQotCQkgIHByaW50ZigiXHRwcmludGYoXCIlJXNcXG5cIixwdHItPiVzJXMpO1xuIiwgaWQscCk7Ci0KLQkJICBlbHNlICAgaWYgKHR5cGVbMF0gPT0gJ0InKSAKLQkJICAgIHsKLQkJICBwcmludGYoIlx0cGJhcnJheSgmcHRyLT4lcyVzKTtcbiIsIGlkLHApOwotCQl9Ci0JICAgICAgZWxzZSBhYm9ydCgpOwotCQkgIGJyZWFrOwotCQl9Ci0JfQotCi0JOwotCi0KLWF0dHJfdHlwZToJCi0JIFRZUEUgeyAkJCA9ICQxOyB9Ci0gCXwgIHsgJCQgPSAiSU5UIjt9Ci0JOwotCi1hdHRyX2Rlc2M6IAotCScoJyBOQU1FICcpJwkKLQl7ICQkID0gJDI7IH0KLQk7Ci0KLWF0dHJfc2l6ZToKLQkgTlVNQkVSIFVOSVQgCi0JeyAkJCA9ICQxICogJDI7IH0KLQk7Ci0KLQotYXR0cl9pZDoKLQkJJygnIE5BTUUgJyknCXsgJCQgPSAkMjsgfQotCXwJeyAkJCA9ICJkdW1teSI7fQotCTsJCi0JCi1lbnVtczogCi0JfCAnKCcgZW51bV9saXN0ICcpJyA7Ci0KLWVudW1fbGlzdDoKLQl8Ci0JZW51bV9saXN0ICcoJyBOQU1FIE5BTUUgJyknIHsgCi0JICBzd2l0Y2ggKHdyaXRlY29kZSkgCi0JICAgIHsKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgcHJpbnRmKCIjZGVmaW5lICVzICVzXG4iLCAkMywkNCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2MnOgotCQlwcmludGYoImlmIChwdHItPiVzJXMgPT0gJXMpIHsgdGFib3V0KCk7IHByaW50ZihcIiVzXFxuXCIpO31cbiIsIG5hbWUsIG5hbWVzW3JkZXB0aF0sJDQsJDMpOwotCSAgICB9Ci0JfQotCi0JOwotCi0KLQotJSUKLS8qIGZvdXIgbW9kZXMKLQotICAgLWQgd3JpdGUgc3RydWN0dXJlIGRlZmludGlvbnMgZm9yIHN5c3JvZmYgaW4gaG9zdCBmb3JtYXQKLSAgIC1pIHdyaXRlIGZ1bmN0aW9ucyB0byBzd2FwIGludG8gc3lzcm9mZiBmb3JtYXQgaW4KLSAgIC1vIHdyaXRlIGZ1bmN0aW9ucyB0byBzd2FwIGludG8gc3lzcm9mZiBmb3JtYXQgb3V0Ci0gICAtYyB3cml0ZSBjb2RlIHRvIHByaW50IGluZm8gaW4gaHVtYW4gZm9ybSAqLwotCi1pbnQgeXlkZWJ1ZzsKLWNoYXIgd3JpdGVjb2RlOwotCi1pbnQgCi1tYWluKGFjLGF2KQotaW50IGFjOwotY2hhciAqKmF2OwotewotICB5eWRlYnVnPTA7Ci0gIGlmIChhYyA+IDEpCi0gICAgd3JpdGVjb2RlID0gYXZbMV1bMV07Ci1pZiAod3JpdGVjb2RlID09ICdkJykKLSAgewotICAgIHByaW50ZigidHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBjaGFyICpkYXRhOyBpbnQgbGVuOyB9IGJhcnJheTsgXG4iKTsKLSAgICBwcmludGYoInR5cGVkZWYgIGludCBJTlQ7XG4iKTsKLSAgICBwcmludGYoInR5cGVkZWYgIGNoYXIgKiBDSEFSUztcbiIpOwotCi0gIH0KLSAgeXlwYXJzZSgpOwotcmV0dXJuIDA7Ci19Ci0KLWludAoteXllcnJvcihzKQotICAgICBjaGFyICpzOwotewotICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iICwgcyk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3lzbGV4LmwgYi9iaW51dGlscy9zeXNsZXgubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5NDg0Mi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zeXNsZXgubAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSV7Ci0jaW5jbHVkZSAic3lzaW5mby5oIgotY2hhciAqd29yZDsKLWludCBudW1iZXI7Ci1pbnQgdW5pdDsKLQotI2lmbmRlZiB5eXdyYXAKLXN0YXRpYyBpbnQgeXl3cmFwICgpIHsgcmV0dXJuIDE7IH0KLSNlbmRpZgotJX0KLSUlCi0iKCIgeyByZXR1cm4gJygnO30KLSIpIiB7IHJldHVybiAnKSc7fQotIlsiIHsgcmV0dXJuICdbJzt9Ci0iXSIgeyByZXR1cm4gJ10nO30KLSIgIiB7IDsgfQotIjsiLiogeyA7IH0gCi0iXHQiIHsgOyB9Ci0iXG4iIHsgOyB9Ci0iXCIiW15cIl0qIlwiIiB7Ci15eWx2YWwucyA9IG1hbGxvYyhzdHJsZW4gKHl5dGV4dCkpOwotc3RyY3B5KHl5bHZhbC5zLCB5eXRleHQrMSk7Ci15eWx2YWwuc1tzdHJsZW4oeXlsdmFsLnMpLTFdID0gMDsKLSAgICAgICAgcmV0dXJuIE5BTUU7Ci0JfQotCi0weFswLTlhLWZdKyB7Ci0gICAgICAgIHl5bHZhbC5pID0gc3RydG9sKHl5dGV4dCwwLDE2KTsKLQlyZXR1cm4gIE5VTUJFUjsKLQl9Ci0KLVswLTldKyB7Ci0gICAgICAgIHl5bHZhbC5pID0gYXRvaSh5eXRleHQpOwotCXJldHVybiAgTlVNQkVSOwotCX0KLQotCi0iYml0cyIgeyB5eWx2YWwuaSA9MSA7cmV0dXJuIFVOSVQ7fQotImJpdCIgeyB5eWx2YWwuaSA9IDE7IHJldHVybiBVTklUO30KLSJieXRlcyIgeyB5eWx2YWwuaT0gODsgcmV0dXJuIFVOSVQ7fQotImJ5dGUiIHsgeXlsdmFsLmkgPSA4OyByZXR1cm4gVU5JVDt9Ci0KLSJpbnQiIHsgeXlsdmFsLnMgPSAiSU5UIjsgcmV0dXJuIFRZUEU7fQotImJhcnJheSIgeyB5eWx2YWwucyA9ICJCQVJSQVkiOyByZXR1cm4gVFlQRTt9Ci0iY2hhcnMiIHsgeXlsdmFsLnMgPSAiQ0hBUlMiOyByZXR1cm4gVFlQRTt9Ci0idmFyaWFibGUiIHsgeXlsdmFsLmkgPSAwOyByZXR1cm4gTlVNQkVSO30KLSJjb3VudGVkIiB7IHl5bHZhbC5pID0gLTQ7IHJldHVybiBOVU1CRVI7fQotImFkZHJzaXplIiB7IHl5bHZhbC5pID0gLTI7IHJldHVybiBOVU1CRVI7IH0KLSJzZWdzaXplIiB7IHl5bHZhbC5pID0gLTE7IHJldHVybiBOVU1CRVI7IH0KLSJjb25kIiB7IHJldHVybiBDT05EO30KLSJyZXBlYXQiIHsgcmV0dXJuIFJFUEVBVDt9CmRpZmYgLS1naXQgYS9iaW51dGlscy9zeXNyb2ZmLmluZm8gYi9iaW51dGlscy9zeXNyb2ZmLmluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjAwMWEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3lzcm9mZi5pbmZvCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLSgiY3MiIDB4MAotICgoInNpemUiKSAoMSBieXRlKSAoInNpemUiKSkKLQotICgoImhkIikgKDEgYnl0ZSkgKCJoZCIpKQotICgoImhzIikgKDEgYnl0ZSkgKCJocyIpKQotICgoInVuIikgKDEgYnl0ZSkgKCJ1biIpKQotICgoInVzIikgKDEgYnl0ZSkgKCJ1cyIpKQotCi0gKCgic2MiKSAoMSBieXRlKSAoInNjIikpCi0gKCgic3MiKSAoMSBieXRlKSAoInNzIikpCi0gKCgiZXIiKSAoMSBieXRlKSAoImVyIikpCi0gKCgiZWQiKSAoMSBieXRlKSAoImVkIikpCi0KLSAoKCJzaCIpICgxIGJ5dGUpICgic2giKSkKLSAoKCJvYiIpICgxIGJ5dGUpICgib2IiKSkKLSAoKCJybCIpICgxIGJ5dGUpICgicmwiKSkKLSAoKCJkdSIpICgxIGJ5dGUpICgiZHUiKSkKLQotICgoImRwcyIpICgxIGJ5dGUpICgiZHBzIikpCi0gKCgiZHN5IikgKDEgYnl0ZSkgKCJkc3kiKSkKLSAoKCJkdHkiKSAoMSBieXRlKSAoImR0eSIpKQotICgoImRsbiIpICgxIGJ5dGUpICgiZGxuIikpCi0KLSAoKCJkc28iKSAoMSBieXRlKSAoImRzbyIpKQotICgoImR1cyIpICgxIGJ5dGUpICgiZHVzIikpCi0gKCgiZHNzIikgKDEgYnl0ZSkgKCJkc3MiKSkKLSAoKCJkYnQiKSAoMSBieXRlKSAoImRidCIpKQotCi0gKCgiZHBwIikgKDEgYnl0ZSkgKCJkcHAiKSkKLSAoKCJkZnAiKSAoMSBieXRlKSAoImRmcCIpKQotICgoImRlbiIpICgxIGJ5dGUpICgiZGVuIikpCi0gKCgiZGRzIikgKDEgYnl0ZSkgKCJkZHMiKSkKLQotICgoImRhciIpICgxIGJ5dGUpICgiZGFyIikpCi0gKCgiZHB0IikgKDEgYnl0ZSkgKCJkcHQiKSkKLSAoKCJkdWwiKSAoMSBieXRlKSAoImR1bCIpKQotICgoImRzZSIpICgxIGJ5dGUpICgiZHNlIikpCi0KLSAoKCJkb3QiKSAoMSBieXRlKSAoImRvdCIpKSkKLQotCi0oImhkIiAweDA0Ci0gKCgibW9kdWxlIHR5cGUiKSAoNCBiaXRzKSAoIm10IikKLSAgKCgiTVRZUEVfQUJTX0xNIiAJIjAiKQotICAgKCJNVFlQRV9SRUxfTE0iIAkiMSIpCi0gICAoIk1UWVBFX09NU19PUl9MTVMiIAkiMiIpCi0gICAoIk1UWVBFX1VOU1BFQyIgCSIweGYiKSkpCi0gKCgic3BhcmUiKSg0IGJpdHMpICgic3BhcmUxIikpCi0gKCgiY3JlYXRpb24gZGF0ZSIpKCBjaGFycyAxMiBieXRlcykoICJjZCIpKQotICgoIm51bWJlciBvZiB1bml0cyIpICgyIGJ5dGVzKSAoIm51IikpCi0gKCgiY29kZSIpICgxIGJ5dGUpICgiY29kZSIpKQotICgoInZlcnNpb24iKSAoY2hhcnMgNCBieXRlcykgKCJ2ZXIiKSkKLSAoKCJhZGRyZXNzIHVwZGF0ZSIpICgxIGJ5dGUpICgiYXUiKSkKLSAoKCJzZWdtZW50IGlkZW50aWZpZXIiKSAoMSBiaXQpICgic2kiKSkKLSAoKCJhZGRyZXNzIGZpZWxkIGxlbmd0aCIpICg0IGJpdHMpICgiYWZsIikpCi0gKCgic3BhcmUiKSgzIGJpdHMpICgic3BhcmUyIikpCi0gKCgic3BhY2Ugc2l6ZSB3aXRoaW4gc2VnbWVudCIpICgxIGJ5dGUpICgic3Bjc3oiKSkKLSAoKCJzZWdtZW50IHNpemUiKSAgCSgxIGJ5dGUpICgic2Vnc3oiKSkKLSAoKCJzZWdtZW50IHNoaWZ0IikgCSgxIGJ5dGUpICgic2Vnc2giKSkKLSAoKCJlbnRyeSBwb2ludCIpIAkoMSBieXRlKSAoImVwIikpCi0gKGNvbmQgInB0ci0+ZXAiCi0gICAgICAgKGNvbmQgInB0ci0+bXQgIT0gTVRZUEVfQUJTX0xNIiAKLQkgICAgICgoInVuaXQgYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJ1YW4iKSkKLQkgICAgICgoInNlY3Rpb24gYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJzYSIpKSkKLSAgICAgICAoY29uZCAic2VnbWVudGVkX3AiCi0JICAgICAoKCJzZWdtZW50IGFkZHJlc3MiKSAoc2Vnc2l6ZSBieXRlcykgKCJzYWQiKSkpCi0gICAgICAgKCgiYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpKQotICgoIm9zIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgib3MiKSkKLSAoKCJzeXMgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJzeXMiKSkKLSAoKCJtb2R1bGUgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJtbiIpKQotICgoImNwdSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJjcHUiKSkpCi0KLQotKCJocyIgMHgwNQotICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpCi0KLQotKCJ1biIgMHgwNgotICgoImZvcm1hdCIpICgyIGJpdHMpICgiZm9ybWF0IikKLSAgKCgiRk9STUFUX0xNIiAiMCIpCi0gICAoIkZPUk1BVF9PTSIgIjEiKQotICAgKCJGT1JNQVRfT01TX09SX0xNUyIgIjIiKSkpCi0gKCgic3BhcmUiKSAoNiBiaXRzKSAoInNwYXJlMSIpKQotICgoIm51bWJlciBvZiBzZWN0aW9ucyIpICgyIGJ5dGVzKSAoIm5zZWN0aW9ucyIpKQotICgoIm51bWJlciBvZiBleHRlcm5hbCByZWZzIikgKDIgYnl0ZXMpICgibmV4dHJlZnMiKSkKLSAoKCJudW1iZXIgb2YgZXh0ZXJuYWwgZGVmcyIpICgyIGJ5dGVzKSAoIm5leHRkZWZzIikpCi0gKCgidW5pdCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgibmFtZSIpKQotICgoInRvb2wgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoInRvb2wiKSkKLSAoKCJjcmVhdGlvbiBkYXRlIikgKGNoYXJzIDEyIGJ5dGVzKSAoInRjZCIpKQotICgoImxpbmtlciBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgibGlua2VyIikpCi0gKCgiY3JlYXRpb24gZGF0ZSIpIChjaGFycyAxMiBieXRlcykgKCJsY2QiKSkpCi0KLQotKCJ1cyIgMHgwNwotICgoIm5lZ290aWF0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLQotCi0oInNjIiAweDA4Ci0gKCgiZm9ybWF0IikgKDIgYml0cykgKCJmb3JtYXQiKSkJCi0gKCgic3BhcmUiKSAoNiBiaXRzKSAoInNwYXJlIikpCi0gKCgic2VnbWVudCBhZGRyZXNzIikgKHNlZ3NpemUgYnl0ZXMpICgic2VnYWRkIikpCi0gKCgiYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyIikpCi0gKCgibGVuZ3RoIikgKGFkZHJzaXplIGJ5dGVzKSAoImxlbmd0aCIpKQotICgoImFsaWdubWVudCIpIChhZGRyc2l6ZSBieXRlcykgKCJhbGlnbiIpKQotICgoImNvbnRlbnRzIikgKDQgYml0cykgKCJjb250ZW50cyIpCi0gICgoIkNPTlRFTlRTX0NPREUiICIwIikKLSAgICgiQ09OVEVOVFNfREFUQSIgIjEiKQotICAgKCJDT05URU5UU19TVEFDSyIgIjIiKQotICAgKCJDT05URU5UU19EVU1NWSIgIjMiKQotICAgKCJDT05URU5UU19TUEVDSUFMIiAiNCIpCi0gICAoIkNPTlRFTlRTX05PTlNQRUMiICIweGYiKSkpCi0gKCgiY29uY2F0IikgKDQgYml0cykgKCJjb25jYXQiKQotICAoKCJDT05DQVRfU0lNUExFIiAiMCIpCi0gICAoIkNPTkNBVF9TSEFSRURDIiAiMSIpCi0gICAoIkNPTkNBVF9EVU1NWSIgIjIiKQotICAgKCJDT05DQVRfR1JPVVAiICIzIikKLSAgICgiQ09OQ0FUX1NIQVJFRCIgIjQiKQotICAgKCJDT05DQVRfUFJJVkFURSIgIjUiKQotICAgKCJDT05DQVRfVU5TUEVDIiAiMHhmIikpKQotICgoInJlYWQiKSAoMiBiaXRzKSAoInJlYWQiKSkKLSAoKCJ3cml0ZSIpICgyIGJpdHMpICgid3JpdGUiKSkKLSAoKCJleGVjIikgKDIgYml0cykgKCJleGVjIikpCi0gKCgiaW5pdGlhbGl6ZWQiKSAoMiBiaXRzKSAoImluaXQiKSkKLSAoKCJtb2RlIikgKDIgYml0cykgKCJtb2RlIikpCi0gKCgic3BhcmUiKSAoNiBiaXRzKSAoInNwYXJlMSIpKQotICgoIm5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJuYW1lIikpKQotCi0KLSgic3MiIDB4MDkKLSAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKQotCi0JCi0oImVyIiAweDBjCi0gKCgic3ltYm9sIHR5cGUiKSAoMiBiaXRzKSAoInR5cGUiKQotICAoKCJFUl9FTlRSWSIgIjAiKQotICAgKCJFUl9EQVRBIiAiMSIpCi0gICAoIkVSX05PVERFRiIgIjIiKQotICAgKCJFUl9OT1RTUEVDIiAiMyIpKSkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUiKSkKLSAoKCJzeW1ib2wgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoIm5hbWUiKSkpCi0JCi0KLSgiZWQiIDB4MTQKLSAoKCJzZWN0aW9uIGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgic2VjdGlvbiIpKQotICgoInN5bWJvbCB0eXBlIikgKDMgYml0cykgKCJ0eXBlIikKLSAgKCgiRURfVFlQRV9FTlRSWSIgIjAiKQotICAgKCJFRF9UWVBFX0RBVEEiICIxIikKLSAgICgiRURfVFlQRV9DT05TVCIgIjIiKQotICAgKCJFRF9UWVBFX05PVFNQRUMiICI3IikpKQotICgoInNwYXJlIikgKDUgYml0cykgKCJzcGFyZSIpKQotIChjb25kICJwdHItPnR5cGU9PUVEX1RZUEVfRU5UUlkgfHwgcHRyLT50eXBlPT1FRF9UWVBFX0RBVEEiCi0gICAgICAgKCgic3ltYm9sIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKSkKLSAoY29uZCAicHRyLT50eXBlPT1FRF9UWVBFX0NPTlNUIgotICAgICAgICgoImNvbnN0YW50IHZhbHVlIikgKGFkZHJzaXplIGJ5dGVzKSAoImNvbnN0YW50IikpKQotICgoInN5bWJvbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgibmFtZSIpKSkKLQotCi0oInNoIiAweDFhCi0gKCgidW5pdCBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInVuaXQiKSkKLSAoKCJzZWN0aW9uIGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgic2VjdGlvbiIpKSkKLQotCi0oIm9iIiAweDFjCi0gKCgic3RhcnRpbmcgYWRkcmVzcyBmbGFnIikgKDEgYml0KSAoInNhZiIpKQotICgoImNvbXByZXNzaW9uIGZsYWciKSAoMSBiaXQpICgiY3BmIikpCi0gKCgic3BhcmUiKSAoNiBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgInB0ci0+c2FmIgotICAgICAgICggKCJzdGFydGluZyBhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkpCi0gKGNvbmQgInB0ci0+Y3BmIgotICAgICAgICgoImNvbXAgcmVwcyIpIChhZGRyc2l6ZSBieXRlcykgKCJjb21wcmVwcyIpKSkKLSAoKCJkYXRhIikgKGJhcnJheSBjb3VudGVkIGJ5dGUpICgiZGF0YSIpKSkKLQkKLQotKCJybCIgMHgyMAotICgoImJvdW5kYXJ5IG9mIHJlbG9jYXRlYWJsZSBhcmVhIikgKDQgYml0cykgKCJib3VuZGFyeSIpKQotICgoImFkZHJlc3MgcG9sYXJpdHkiKSAoMSBiaXQpICgiYXBvbCIpKQotICgoInNlZ21lbnQgbnVtYmVyIikgKDEgYml0KSAoInNlZ21lbnQiKSkKLSAoKCJzaWduIG9mIHJlbG9jYXRpb24iKSAoMSBiaXQpICgic2lnbiIpKQotICgoImNoZWNrIHJhbmdlIikgKDEgYml0KSAoImNoZWNrIikpCi0gKCgicmVsb2MgYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyIikpCi0KLSAoKCJiaXQgbG9jIikgKDEgYnl0ZSkgKCJiaXRsb2MiKSkKLSAoKCJmaWVsZCBsZW5ndGgiKSAoMSBieXRlKSAoImZsZW4iKSkKLSAoKCJiY291bnQiKSAoMSBieXRlKSAoImJjb3VudCIpKQotICgoIm9wZXJhdG9yIikgKDEgYnl0ZSkgKCJvcCIpCi0gICgoIk9QX1JFTE9DX0FERFIiICIxIikKLSAgICgiT1BfU0VDX1JFRiIgIjAiKQotICAgKCJPUF9FWFRfUkVGIiAiMiIpKSkKLSAoY29uZCAicHRyLT5vcCA9PSBPUF9FWFRfUkVGIgotICAgICAgICgoInN5bWJvbCBudW1iZXIiKSAoMiBieXRlcykgKCJzeW1uIikpCSkKLQkKLSAoY29uZCAicHRyLT5vcCA9PSBPUF9TRUNfUkVGIgotICAgICAgICgoInNlY3Rpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgic2VjbiIpKQotICAgICAgICgoImNvbnN0IG9wY29kZSIpICgxIGJ5dGUpICgiY29wY29kZV9pc18zIikpCi0gICAgICAgKCgiYWRkZW5kIGxlbmd0aCIpICgxIGJ5dGUpICgiYWxlbmd0aF9pc180IikpCi0gICAgICAgKCgiYWRkZW5kIikgKDQgYnl0ZSkgKCJhZGRlbmQiKSkKLSAgICAgICAoKCJwbHVzIG9wY29kZSIpICgxIGJ5dGUpICgiYW9wY29kZV9pc18weDIwIikpKQotCi0gKGNvbmQgInB0ci0+b3AgPT0gT1BfUkVMT0NfQUREUiIKLSAgICAgICAoKCJkdW5ubyIpICgyIGJ5dGVzKSAoImR1bm5vIikpKQotCi0gKCgiZW5kIikgICgxIGJ5dGUpICgiZW5kIikpKQotCQotCi0oImR1IiAweDMwCi0gKCgiZm9ybWF0IikgKDIgYml0cykgKCJmb3JtYXQiKSkKLSAoKCJvcHRpbWl6ZWQiKSAoMSBiaXQpICgib3B0aW1pemVkIikpCi0gKCgic3RhY2tmcm10IikgKDIgYml0cykgKCJzdGFja2ZybXQiKSkKLSAoKCJzcGFyZSIpICgzIGJpdHMpICgic3BhcmUiKSkKLSAoKCJ1bml0IG51bWJlciIpICgyIGJ5dGVzKSAoInVuaXQiKSkKLSAoKCJzZWN0aW9ucyIpICgyIGJ5dGVzKSAoInNlY3Rpb25zIikpCi0gKHJlcGVhdCAicHRyLT5zZWN0aW9ucyIKLQkgKCgic2VjdGlvbiBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInNhbiIpKQotCSAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkKLQkgKCgic2VjdGlvbiBsZW5ndGgiKSAoYWRkcnNpemUgYnl0ZXMpICgibGVuZ3RoIikpKQotICgoInRvb2wgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoInRvb2wiKSkKLSAoKCJjcmVhdGlvbiBkYXRlIikgKGNoYXJzIDEyIGJ5dGVzKSAoImRhdGUiKSkpCi0KLQotKCJkc3kiIDB4MzQKLSAoKCJzeW1ib2wgdHlwZSIpICg3IGJpdHMpICgidHlwZSIpCi0gICgoIlNUWVBFX1ZBUiIgIjAiKQotICAgKCJTVFlQRV9MQUIiICIxIikKLSAgICgiU1RZUEVfUFJPQyIgIjIiKQotICAgKCJTVFlQRV9GVU5DIiAiMyIpCi0gICAoIlNUWVBFX1RZUEUiICI0IikKLSAgICgiU1RZUEVfQ09OU1QiICI1IikKLSAgICgiU1RZUEVfRU5UUlkiICI2IikKLSAgICgiU1RZUEVfTUVNQkVSIiAiNyIpCi0gICAoIlNUWVBFX0VOVU0iICI4IikKLSAgICgiU1RZUEVfVEFHIiAiOSIpCi0gICAoIlNUWVBFX1BBQ0tBR0UiICIxMCIpCi0gICAoIlNUWVBFX0dFTkVSSUMiICIxMSIpCi0gICAoIlNUWVBFX1RBU0siICIxMiIpCi0gICAoIlNUWVBFX0VYQ0VQVElPTiIgIjEzIikKLSAgICgiU1RZUEVfUEFSQU1FVEVSIiAiMTQiKQotICAgKCJTVFlQRV9FUVVBVEUiICIxNSIpCi0gICAoIlNUWVBFX1VOU1BFQyIgIjB4N2YiKSkpCi0gKCgiYXNzaWdubWVudCBpbmZvIikgKDEgYml0KSAoImFzc2lnbiIpKQotICgoInN5bWJvbCBpZCIpICgyIGJ5dGVzKSAoInNudW1iZXIiKSkKLSAoKCJzeW1ib2wgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJzbmFtZSIpKQotICgoIm5lc3RpbmcgbGV2ZWwiKSAoMiBieXRlcykgKCJuZXN0aW5nIikpCi0gKGNvbmQgInB0ci0+YXNzaWduIgotICAgICAgICgoImFzc2lnbm1lbnQgdHlwZSIpICgxIGJ5dGUpICAoImFpbmZvIikKLQkoKCJBSU5GT19SRUciICIxIikKLQkgKCJBSU5GT19TVEFUSUNfRVhUX0RFRiIgIjIiKQotCSAoIkFJTkZPX1NUQVRJQ19FWFRfUkVGIiAiMyIpCi0JICgiQUlORk9fU1RBVElDX0lOVCIgIjQiKQotCSAoIkFJTkZPX1NUQVRJQ19DT00iICI1IikKLQkgKCJBSU5GT19BVVRPIiAiNiIpCi0JICgiQUlORk9fQ09OU1QiICI3IikKLQkgKCJBSU5GT19VTlNQRUMiICIweGZmIikpKQotICAgICAgICgoImRhdGEgbGVuZ3RoIikgKGFkZHJzaXplIGJ5dGVzKSAoImRsZW5ndGgiKSkKLSAgICAgICAoY29uZCAicHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfRVhUX0RFRgotICAgICAgICAgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfSU5UCi0gICAgICAgICAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19DT00iCi0JICAgICAoKCJzZWN0aW9uIG51bWJlciIpICAoMiBieXRlcykgKCJzZWN0aW9uIikpKQotICAgICAgIChjb25kICJwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19FWFRfREVGCi0gICAgICAgICAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19JTlQKLSAgICAgICAgICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0NPTQotICAgICAgICAgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19BVVRPIgotCSAgICAgKCgiYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpKQotICAgICAgIChjb25kICJwdHItPmFpbmZvID09IEFJTkZPX1JFRyIKLQkgICAgICgoInJlZ2lzdGVyIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgicmVnIikpKQotICAgICAgIChjb25kICJwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19FWFRfREVGCi0JICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0VYVF9SRUYiCi0JICAgICAoKCJleHRlcm5hbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImVuYW1lIikpKQotICAgICAgIChjb25kICJwdHItPmFpbmZvID09IEFJTkZPX0NPTlNUIgotCSAgICAgKCgiY29uc3RhbnQiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiY29uc3RhbnQiKSkpKQotIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfTUVNQkVSIgotICAgICAgICgoImFzc2lnbm1lbnQgdW5pdCIpICgxIGJpdCkgKCJiaXR1bml0IikpCi0gICAgICAgKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlMiIpKQotICAgICAgICgoImZpZWxkIGxlbmd0aCIpIChhZGRyc2l6ZSBieXRlcykgKCJmaWVsZF9sZW4iKSkKLSAgICAgICAoKCJmaWVsZCBvZmZzZXQiKSAoYWRkcnNpemUgYnl0ZXMpICgiZmllbGRfb2ZmIikpCi0gICAgICAgKGNvbmQgInB0ci0+Yml0dW5pdCIKLQkgICAgICgoImJpdCBvZmZzZXQiKSAoYWRkcnNpemUgYnl0ZXMpICgiZmllbGRfYml0b2ZmIikpKSkKLSAoY29uZCAicHRyLT50eXBlPT0gU1RZUEVfRU5VTSIKLSAgICAgICAoKCJ2YWx1ZSBsZW5ndGgiKSAoMSBieXRlKSAoImV2YWxsZW4iKSkKLSAgICAgICAoKCJ2YWx1ZSIpICg0IGJ5dGVzKSAoImV2YWx1ZSIpKSkKLSAoY29uZCAicHRyLT50eXBlID09IFNUWVBFX0NPTlNUIgotICAgICAgICgoInZhbHVlIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImN2YWx1ZSIpKSkKLSAoY29uZCAicHRyLT50eXBlID09IFNUWVBFX0VRVUFURSIKLSAgICAgICAoKCJ2YWx1ZSBsZW5ndGgiKSAoMSBieXRlKSAoInF2YWxsZW4iKSkKLSAgICAgICAoKCJ2YWx1ZSIpICg0IGJ5dGVzKSAoInF2YWx1ZSIpKQotICAgICAgICgoImJhc2ljIHR5cGUiKSAoMSBieXRlKSAoImJ0eXBlIikpCi0gICAgICAgKCgic2l6ZSBpbmZvcm1hdGlvbiIpIChhZGRyc2l6ZSBieXRlcykgKCJzaXplaW5mbyIpKQotICAgICAgICgoInNpZ24iKSAoMiBiaXRzKSAoInNpZ24iKSkKLSAgICAgICAoKCJmbG9hdGluZyBwb2ludCB0eXBlIikgKDYgYml0cykgKCJmbHRfdHlwZSIpKSkKLSAoKCJzb3VyY2UgZmlsZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZm4iKSkKLSAoKCJzb3VyY2UgbGluZSBudW1iZXIiKSAoMiBieXRlcykgKCJzbG4iKSkKLSAoKCJuZWdvdGlhdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkKLSAoY29uZCAicHRyLT50eXBlID09IFNUWVBFX1RBRyIKLSAgICAgICAoKCJtYWdpYyIpICgxIGJ5dGUpICgibWFnaWMiKSkpKQotCi0gCi0KLSgiZHVsIiAweDUyCi0gKCgibWF4IGRlY2xhcmF0aW9uIHR5cGUgZmxhZyIpICgxIGJpdCkgKCJtYXhfdmFyaWFibGUiKSkKLSAoKCJtYXggc3BhcmUiKSAoNyBiaXRzKSAoIm1heHNwYXJlIikpCi0gKGNvbmQgInB0ci0+bWF4X3ZhcmlhYmxlID09IDAiCi0gICAgICAgKCgibWF4aW11bSIpIChhZGRyc2l6ZSBieXRlcykgKCJtYXgiKSkKLSAgICAgICAoKCJtYXggbW9kZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJtYXhtb2RlIikpKQotCi0gKCgibWluIGRlY2xhcmF0aW9uIHR5cGUgZmxhZyIpICgxIGJpdCkgKCJtaW5fdmFyaWFibGUiKSkKLSAoKCJtaW4gc3BhcmUiKSAoNyBiaXRzKSAoIm1pbnNwYXJlIikpCi0gKGNvbmQgInB0ci0+bWluX3ZhcmlhYmxlID09IDAiCi0gICAgICAgKCgibWluaW11bSIpIChhZGRyc2l6ZSBieXRlcykgKCJtaW4iKSkKLSAgICAgICAoKCJtaW4gbW9kZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJtaW5tb2RlIikpKSkKLQotCi0oImR0eSIgMHgzNgotICgoImVuZCBmbGFnIikgKDEgYml0KSAoImVuZCIpKQotICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotIChjb25kICIhcHRyLT5lbmQiCi0gICAgICAgKCgibmVnb3RpYXRpb24iKSAoMiBieXRlcykgKCJuZWciKSkpKQotCi0KLSgiZGJ0IiAweDQ0Ci0gKCgiYmFzaWMgdHlwZSIpICgxIGJ5dGUpICgiYnR5cGUiKQotICAoKCJCVFlQRV9WT0lEIiAiMCIpCi0gICAoIkJUWVBFX1VOREVGIiAiMSIpCi0gICAoIkJUWVBFX0NIQVIiICIyIikKLSAgICgiQlRZUEVfSU5UIiAiMyIpCi0gICAoIkJUWVBFX0ZMT0FUIiAiNCIpCi0gICAoIkJUWVBFX0JJVCIgIjUiKQotICAgKCJCVFlQRV9TVFJJTkciICI2IikKLSAgICgiQlRZUEVfREVDSU1BTCIgIjciKQotICAgKCJCVFlQRV9FTlVNIiAiOCIpCi0gICAoIkJUWVBFX1NUUlVDVCIgIjkiKQotICAgKCJCVFlQRV9UWVBFIiAiMTAiKQotICAgKCJCVFlQRV9UQUciICIxMSIpCi0gICAoIkJUWVBFX1VOU1BFQyIgIjB4ZmYiKSkpCi0gKCgic2l6ZSBpbmZvIikgKGFkZHJzaXplIGJ5dGVzKSAoImJpdHNpemUiKSkKLSAoKCJzaWduIikgKDIgYml0cykgKCJzaWduIikKLSAgKCgiU0lHTl9TSUdORUQiICIwIikKLSAgICgiU0lHTl9VTlNJR05FRCIgIjEiKQotICAgKCJTSUdOX1VOU1BFQyIgIjMiKSkpCi0gKCgiZmxvYXRpbmcgcG9pbnQgdHlwZSIpICg2IGJpdHMpICgiZnB0eXBlIikKLSAgKCgiRlBUWVBFX1NJTkdMRSIgIjAiKQotICAgKCJGUFRZUEVfRE9VQkxFIiAiMSIpCi0gICAoIkZQVFlQRV9FWFRFTkRFRCIgIjIiKQotICAgKCJGUFRZUEVfTk9UU1BFQyIgIjB4M2YiKSkpCi0gKGNvbmQgInB0ci0+YnR5cGU9PUJUWVBFX1RBRyB8fCBwdHItPmJ0eXBlID09IEJUWVBFX1RZUEUiCi0gICAgICAgKCgic3ltYm9sIGlkIikgKDIgYnl0ZXMpICgic2lkIikpKQotICgoIm5lZ290aWF0aW9uIikgKDIgYnl0ZXMpICgibmVnIikpKQotCi0oImRhciIgMHg0ZQotICgoImVsZW1lbnQgbGVuZ3RoIiApIChhZGRyc2l6ZSBieXRlcykgKCJsZW5ndGgiKSkKLSAoKCJkaW1zIikgKDEgYnl0ZSkgKCJkaW1zIikpCi0gKHJlcGVhdCAicHRyLT5kaW1zIgotCSAoKCJ2YXJpYWJsZSBmbGFnIikgKDEgYml0KSAoInZhcmlhYmxlIikKLQkgICgoIlZBUklBQkxFX0ZJWEVEIiAiMCIpCi0JICAgKCJWQVJJQUJMRV9WQVJJQUJMRSIgIjEiKSkpCi0KLQkgKCgic3Vic2NyaXB0IHR5cGUiKSAoMSBiaXQpICgic3VidHlwZSIpCi0JICAoKCJTVUJfSU5URUdFUiIgIjAiKQotCSAgICgiU1VCX1RZUEUiICAgICIxIikpKQotCi0JICgoInNwYXJlIikgKDYgYml0cykgKCJzcGFyZSIpKQotCi0JIChjb25kICJwdHItPnN1YnR5cGVbbl0gPT0gU1VCX1RZUEUiCi0JICAgICAgICgoInN1YiBzeW1ib2wgaWQiKSAoMiBieXRlcykgKCJzaWQiKSkpCi0KLQkgKGNvbmQgInB0ci0+c3VidHlwZVtuXSA9PSBTVUJfSU5URUdFUiIKLQkgICAgICAgKCgibWF4IGRlY2xhcmF0aW9uIHR5cGUgZmxhZyIpICgxIGJpdCkgKCJtYXhfdmFyaWFibGUiKSkKLQkgICAgICAgKCgibWF4IHNwYXJlIikgKDcgYml0cykgKCJtYXhzcGFyZSIpKQotCSAgICAgICA7OyBGSVhNRTogbmV4dCBmaWVsZCBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gbWF4X3ZhcmlhYmxlLAotCSAgICAgICAoKCJtYXhpbXVtIikgKGFkZHJzaXplIGJ5dGVzKSAoIm1heCIpKQotCi0JICAgICAgICgoIm1pbiBkZWNsYXJhdGlvbiB0eXBlIGZsYWciKSAoMSBiaXQpICgibWluX3ZhcmlhYmxlIikpCi0JICAgICAgICgoIm1pbiBzcGFyZSIpICg3IGJpdHMpICgibWluc3BhcmUiKSkKLQkgICAgICAgOzsgRklYTUU6IG5leHQgZmllbGQgc2hvdWxkIGJlIGNvbmRpdGlvbmFsIG9uIG1pbl92YXJpYWJsZQotCSAgICAgICAoKCJtaW5pbXVtIikgKGFkZHJzaXplIGJ5dGVzKSAoIm1pbiIpKSkpCi0gKCgibmVnb3RpYXRpb24iKSAoMiBieXRlcykgKCJuZWciKSkpCi0KLQkgICAgICAgCi0oImRzbyIgMHgzYQotICgoImZ1bmN0aW9uIG5hbWUiKSAoMiBieXRlcykgKCJzaWQiKSkKLSAoKCJzcCB1cGRhdGUgY291bnQiKSAoNCBieXRlcykgKCJzcHVwZGF0ZXMiKSkKLSAocmVwZWF0ICJwdHItPnNwdXBkYXRlcyIKLQkgKCgidXBkYXRlIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKQotCSAoKCJvZmZzZXQiKSAoYWRkcnNpemUgYnl0ZXMpICgib2Zmc2V0IikpKSkKLQotKCJkbG4iIDB4MzgKLSAoKCJudW1iZXIgb2YgbGluZXMiKSAoMiBieXRlcykgKCJubG4iKSkKLSAocmVwZWF0ICJwdHItPm5sbiIKLQkgKCgic291cmNlIGZpbGUgbnVtYmVyIikgKDIgYnl0ZXMpICgic2ZuIikpCi0JICgoInNvdXJjZSBsaW5lIG51bWJlciIpICgyIGJ5dGVzKSAoInNsbiIpKQotCSAoKCJzZWN0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoInNlY3Rpb24iKSkKLQkgKCgiZnJvbSBhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImZyb21fYWRkcmVzcyIpKQotCSAoKCJ0byBhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoInRvX2FkZHJlc3MiKSkKLQkgKCgiY2FsbCBjb3VudCIpICgyIGJ5dGVzKSAoImNjIikpCi0JICkKLSAoKCJuZWciKSAoMiBieXRlcykgKCJuZWciKSkpCi0gCi0oImRwcCIgMHg0NgotICgoInN0YXJ0L2VuZCIpICgxIGJpdCkgKCJlbmQiKSkKLSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAiIXB0ci0+ZW5kIgotICAgICAgICgoInBhcmFtcyIpICgxIGJ5dGUpICgicGFyYW1zIikpCi0gICAgICAgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLSgiZGVuIiAweDRhCi0gKCgic3RhcnQvZW5kIikgKDEgYml0KSAoImVuZCIpKQotICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotIChjb25kICIhcHRyLT5lbmQiCi0gICAgICAgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLSgiZGZwIiAweDQ4Ci0gKCgic3RhcnQvZW5kIGZsYWciKSAoMSBiaXQpICgiZW5kIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmVuZCIKLSAgICAgICAoKCJudW1iZXIgb2YgcGFyYW1ldGVycyIpICgxIGJ5dGUpICgibnBhcmFtcyIpKQotICAgICAgICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpKQotCi0oImRkcyIgMHg0YwotICgoInN0YXJ0L2VuZCIpICgxIGJpdCkgKCJlbmQiKSkKLSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAiIXB0ci0+ZW5kIgotICAgICAgICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpKQotCi0oImRwdCIgMHg1MAotICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkKLSAoKCJkdW5ubyIpICgxIGJ5dGUpICgiZHVubm8iKSkpCi0KLSgiZHNlIiAweDU0Ci0gKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKQotICgoImR1bm5vIikgKDEgYnl0ZSkgKCJkdW5ubyIpKSkKLQotKCJkb3QiIDB4NTYKLSAoKCJ1bmtub3duIikgKDEgYnl0ZSkgKCJ1bmtub3duIikpKQotOyBGSVhNRTogdW5rbm93biBmaWVsZCBzaG91bGQgYmUgcmVwZWF0ZWQgc3ltYm9sIG51bWJlcj8KLQotCi0oImRzcyIgMHg0MgotICgoInR5cGUiKSAoMSBieXRlKSAoInR5cGUiKSkKLSAoKCJleHRlcm5hbC9pbnRlcm5hbCIpICgxIGJpdCkgKCJpbnRlcm5hbCIpKQotICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotIChjb25kICIhcHRyLT5pbnRlcm5hbCIKLSAgICAgICAoICAoInBhY2thZ2UgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoInBhY2thZ2UiKSkpCi0gKGNvbmQgInB0ci0+aW50ZXJuYWwiCi0gICAgICAgKCgic3ltYm9sIGlkIikgKDIgYnl0ZXMpICgiaWQiKSkpCi0gKCgicmVjb3JkIHR5cGUiKSAoMiBieXRlcykgKCJyZWNvcmQiKSkKLSAoKCJydWxlcyIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoInJ1bGVzIikpCi0gKCgibnVtYmVyIG9mIHN5bWJvbHMiKSAoMiBieXRlcykgKCJuc3ltYm9scyIpKQotICgoInVua25vd24iICkgKDIgYnl0ZXMpICgiZml4bWUiKSkpCi0gICAgIAotKCJwc3MiIDB4NDAKLSAoKCJuZWdvdGlhdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJlZm4iKSkKLSAoKCJudW1iZXIgb2Ygc291cmNlIGZpbGVzIikgKDIgYnl0ZXMpICgibnMiKSkKLSAocmVwZWF0ICJwdHItPm5zIgotCSAoKCJkaXJlY3RvcnkgcmVmZXJlbmNlIGJpdCIpICgxIGJpdCkgKCJkcmIiKSkKLQkgKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0JICgoImNvbXBsZXRlZCBmaWxlIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJmbmFtZSIpKQotCSAoY29uZCAicHRyLT5kcmJbbl0iIAotCSAgICAgICAoKCJkaXJlY3RvcnkgYXBwZXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoImRhbiIpKSkpCi0gCi0gKCgibnVtYmVyIG9mIGRpcmVjdG9yaWVzIikgKDIgYnl0ZXMpICgibmRpciIpKQotIChyZXBlYXQgInB0ci0+bmRpciIKLQkgKCgiZGlyZWN0b3J5IG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiZG5hbWUiKSkpKQotCi0KLTsgRklYTUU6IHRoZSB0ciBibG9jayBoYXMgbm8gY29udGVudHMuIHN5c2luZm8sIGV0Yy4gYXJlbid0IHByZXBhcmVkIAotOyB0byBkZWFsIHdpdGggdGhhdC4KLTsgKCJ0ciIgMHg3ZikKLQotCi0oImR1cyIgMHg0MAotICgoIm5lZ290aWF0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoImVmbiIpKQotICgoIm51bWJlciBvZiBzb3VyY2UgZmlsZXMiKSAoMiBieXRlcykgKCJucyIpKQotIChyZXBlYXQgInB0ci0+bnMiCi0JICgoImRpcmVjdG9yeSByZWZlcmVuY2UgYml0IikgKDEgYml0KSAoImRyYiIpKQotCSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLQkgKCgiY29tcGxldGVkIGZpbGUgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoImZuYW1lIikpCi0JIChjb25kICJwdHItPmRyYltuXSIgCi0JICAgICAgICgoImRpcmVjdG9yeSBhcHBlcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgiZGFuIikpKSkKLSAoKCJudW1iZXIgb2YgZGlyZWN0b3JpZXMiKSAoMiBieXRlcykgKCJuZGlyIikpCi0gKHJlcGVhdCAicHRyLT5uZGlyIgotCSAoKCJkaXJlY3RvcnkgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJkbmFtZSIpKSkpCi0KLQotKCJkcHMiIDB4MzIKLSAoKCJzdGFydC9lbmQgZmxhZyIpICgxIGJpdCkgKCJlbmQiKSkKLSAoKCJibG9jayB0eXBlIikgKDcgYml0cykgKCJ0eXBlIikKLSAgKCgiQkxPQ0tfVFlQRV9DT01QVU5JVCIgIjAiKQotICAgKCJCTE9DS19UWVBFX1BST0NFRFVSRSIgIjIiKQotICAgKCJCTE9DS19UWVBFX0ZVTkNUSU9OIiAiMyIpCi0gICAoIkJMT0NLX1RZUEVfQkxPQ0siICI0IikKLSAgICgiQkxPQ0tfVFlQRV9CQVNJQyIgIjkiKSkpCi0gKGNvbmQgIiFwdHItPmVuZCIKLSAgICAgICAoKCJvcHRpbWl6YXRpb24iKSAoMSBieXRlKSAoIm9wdCIpKQotICAgICAgICgoInNlY3Rpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgic2FuIikpCi0gICAgICAgKCgiYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpCi0gICAgICAgKCgiYmxvY2sgc2l6ZSIpIChhZGRyc2l6ZSBieXRlcykgKCJibG9ja19zaXplIikpCi0gICAgICAgKCgibmVzdGluZyIpICgxIGJ5dGUpICgibmVzdGluZyIpKQotICAgICAgIChjb25kICJwdHItPnR5cGUgPT0gQkxPQ0tfVFlQRV9QUk9DRURVUkUgCi0JICAgIHx8IHB0ci0+dHlwZSA9PSBCTE9DS19UWVBFX0ZVTkNUSU9OIgotCSAgICAgKCgicmV0dXJuIGFkZHJlc3MiKSAoMSBiaXQpICgicmV0YWRkciIpKQotCSAgICAgKCgiaW50ZXJydXB0IGZ1bmN0aW9uIGZsYWciKSAoMSBiaXQpICgiaW50cmZsYWciKSkKLQkgICAgICgoInN0YWNrIHVwZGF0ZSBmbGFnIikgKDEgYml0KSAoInN0YWNrZmxhZyIpKQotCSAgICAgKCgiaW50cmEgcGFnZSBKTVAiKSAoMSBiaXQpICgiaW50cnBhZ2VqbXAiKSkKLQkgICAgICgoInNwYXJlIikgKDQgYml0cykgKCJzcGFyZSIpKSkKLSAgICAgICAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKSkKLQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL0NoYW5nZUxvZyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTNkOGIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDYzNCArMCwwIEBACi0xOTk5LTExLTAxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEV4cGVjdCBzaW1wbGUgb2JqY29weSB0ZXN0IGZvciBmYWlsCi0JZm9yIENPRkYgYmFzZWQgQVJNIGFuZCBUaHVtYiBwb3J0cy4KLQotVHVlIFNlcCAxNCAwMDoyODoxNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLWFsbC9ocHBhL29iamR1bXAuZXhwOiBEbyBub3QgcnVuIGZvciBQQTY0LgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogQWRkIHBqIHRvIGNwdXNfZXhwZWN0ZWQuCi0KLVNhdCBBdWcgMjggMDA6MjQ6MjcgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9ocHBhL2ZyZWcuczogIE5ldyBmaWxlLgotCSogYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHA6ICBBZGQgZnJlZy5zIHRlc3QuCi0KLTE5OTktMDgtMDkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3Igc2ltcGxlIGNvcHkgdGVzdAotCWZvciBpKjg2LSotbXNkb3MqLgotCi0xOTk5LTA3LTIxICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGJpbnV0aWxzLWFsbC90ZXN0cHJvZy5jOiBJbmNsdWRlIDxzdGRpby5oPi4KLQotMTk5OS0wNi0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBBZGQgZnIzMCBhbmQgTUNvcmUgdG8gZXhwZWN0ZWQgY3B1cwotCWxpc3QuIAotCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5yOiBEbyBub3QgYXNzdW1lIGEgZml4ZWQgbnVtYmVyIG9mIHNwYWNlcwotCWluIHRoZSBvdXRwdXQuCi0KLTE5OTktMDYtMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+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+Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRBUl0gPT0gMH0gdGhlbiB7Ci0gICAgICAgIHBlcnJvciAiJEFSIGRvZXMgbm90IGV4aXN0IgotICAgICAgICByZXR1cm4KLSAgICB9Ci19Ci0KLSMgc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJEFSXSIKLQotIyBUZXN0IGxvbmcgZmlsZSBuYW1lIHN1cHBvcnQKLQotcHJvYyBsb25nX2ZpbGVuYW1lcyB7IH0gewotICAgIGdsb2JhbCBBUgotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIHNldCB0ZXN0bmFtZSAiYXIgbG9uZyBmaWxlIG5hbWVzIgotCi0gICAgc2V0IG4xICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejEiCi0gICAgc2V0IG4yICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejIiCi0gICAgc2V0IGZpbGUxIHRtcGRpci8kbjEKLSAgICBzZXQgZmlsZTIgdG1wZGlyLyRuMgotCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlICRmaWxlMQotCi0gICAgIyBTb21lIGZpbGUgc3lzdGVtcyB0cnVuY2F0ZSBmaWxlIG5hbWVzIGF0IDE0IGNoYXJhY3RlcnMsIHdoaWNoCi0gICAgIyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHJ1biB0aGlzIHRlc3QuICBDaGVjayBmb3IgdGhhdCBub3cuCi0gICAgc2V0IHN0YXR1cyBbY2F0Y2ggInNldCBmIFtvcGVuIHRtcGRpci8kbjEgd10iIGVycnNdCi0gICAgaWYgeyAkc3RhdHVzICE9IDAgfSB7Ci0JdmVyYm9zZSAtbG9nICJvcGVuIHRtcGRpci8kbjEgcmV0dXJuZWQgJGVycnMiCi0JdW5zdXBwb3J0ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotICAgIHB1dHMgJGYgImZpcnN0IgotICAgIGNsb3NlICRmCi0KLQotICAgIHJlbW90ZV9maWxlIGJ1aWxkIGRlbGV0ZSAkZmlsZTIKLQotICAgIHNldCBzdGF0dXMgW2NhdGNoICJzZXQgZiBbb3BlbiB0bXBkaXIvJG4yIHddIiBlcnJzXQotICAgIGlmIHsgJHN0YXR1cyAhPSAwIH0gewotCXZlcmJvc2UgLWxvZyAib3BlbiB0bXBkaXIvJG4yIHJldHVybmVkICRlcnJzIgotCXVuc3VwcG9ydGVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLSAgICBwdXRzICRmICJzZWNvbmQiCi0gICAgY2xvc2UgJGYKLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBmaWxlMSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgJGZpbGUxXTsKLQlzZXQgZmlsZTIgW3JlbW90ZV9kb3dubG9hZCBob3N0ICRmaWxlMl07Ci0Jc2V0IGRlc3QgYXJ0ZXN0LmEKLSAgICB9IGVsc2UgewotCXNldCBkZXN0IHRtcGRpci9hcnRlc3QuYQotICAgIH0KLQotICAgIHJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRkZXN0OwotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAicmMgJGRlc3QgJGZpbGUxICRmaWxlMiJdCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICRmaWxlMSB0bXBkaXIvJG4xCi0gICAgfQotCi0gICAgc2V0IGYgW29wZW4gdG1wZGlyLyRuMSByXQotICAgIGdldHMgJGYgc3RyaW5nCi0gICAgY2xvc2UgJGYKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiZmlyc3QiICRzdHJpbmddIHsKLQl2ZXJib3NlIC1sb2cgInJlYWRpbmcgdG1wZGlyLyRuMSByZXR1cm5lZCAkc3RyaW5nIgotCXVuc3VwcG9ydGVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRkZXN0OwotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkQVIgInJjICRkZXN0ICRmaWxlMSAkZmlsZTIiXQotCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gewotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlIHRtcGRpci8kbjEKLSAgICByZW1vdGVfZmlsZSBidWlsZCBkZWxldGUgdG1wZGlyLyRuMgotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAidCAkZGVzdCJdCi0gICAgcmVnc3ViICJcW1xyXG4gXHRcXSokIiAiJGdvdCIgIiIgZ290OwotICAgIGlmICFbc3RyaW5nIG1hdGNoICIkbjEqJG4yIiAkZ290XSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJGZpbGUxOwotCXJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRmaWxlMjsKLSAgICB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRBUiB4ICRkZXN0IgotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICRBUiAieCAkZGVzdCJdCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JdmVyYm9zZSAtbG9nICRleGVjX291dHB1dAotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICRuMSB0bXBkaXIvJG4xOwotCXJlbW90ZV91cGxvYWQgaG9zdCAkbjIgdG1wZGlyLyRuMjsKLQlzZXQgZmlsZTEgdG1wZGlyLyRuMQotCXNldCBmaWxlMiB0bXBkaXIvJG4yCi0gICAgfSBlbHNlIHsKLQlzZXQgZmlsZTEgJG4xCi0Jc2V0IGZpbGUyICRuMgotICAgIH0KLQotICAgIGlmICFbZmlsZSBleGlzdHMgJGZpbGUxXSB7Ci0JdmVyYm9zZSAtbG9nICIkZmlsZTEgZG9lcyBub3QgZXhpc3QiCi0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgaWYgIVtmaWxlIGV4aXN0cyAkZmlsZTJdIHsKLQl2ZXJib3NlIC1sb2cgIiRmaWxlMiBkb2VzIG5vdCBleGlzdCIKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHNldCBmIFtvcGVuICRmaWxlMSByXQotICAgIGlmIHsgW2dldHMgJGYgbGluZV0gPT0gLTEgfHwgJGxpbmUgIT0gImZpcnN0IiB9IHsKLQl2ZXJib3NlIC1sb2cgIiRmaWxlMSBjb250ZW50czoiCi0JdmVyYm9zZSAtbG9nICIkbGluZSIKLQljbG9zZSAkZgotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotICAgIGNsb3NlICRmCi0KLSAgICBzZXQgZiBbb3BlbiAkZmlsZTIgcl0KLSAgICBpZiB7IFtnZXRzICRmIGxpbmVdID09IC0xIHx8ICRsaW5lICE9ICJzZWNvbmQiIH0gewotCXZlcmJvc2UgLWxvZyAiJGZpbGUyIGNvbnRlbnRzOiIKLQl2ZXJib3NlIC1sb2cgIiRsaW5lIgotCWNsb3NlICRmCi0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgY2xvc2UgJGYKLQotICAgIHBhc3MgJHRlc3RuYW1lCi19Ci0KLSMgVGVzdCBidWlsZGluZyB0aGUgc3ltYm9sIHRhYmxlLgotCi1wcm9jIHN5bWJvbF90YWJsZSB7IH0gewotICAgIGdsb2JhbCBBUgotICAgIGdsb2JhbCBBUwotICAgIGdsb2JhbCBOTQotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0KLSAgICBzZXQgdGVzdG5hbWUgImFyIHN5bWJvbCB0YWJsZSIKLQotICAgIGlmICFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgYXJjaGl2ZSBhcnRlc3QuYQotCXNldCBvYmpmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotCXJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRhcmNoaXZlCi0gICAgfSBlbHNlIHsKLQlzZXQgYXJjaGl2ZSB0bXBkaXIvYXJ0ZXN0LmEKLQlzZXQgb2JqZmlsZSB0bXBkaXIvYmludGVzdC5vCi0gICAgfQotCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlIHRtcGRpci9hcnRlc3QuYQotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAicmMgJGFyY2hpdmUgJHtvYmpmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gewotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICROTSAiLS1wcmludC1hcm1hcCAkYXJjaGl2ZSJdCi0gICAgaWYgeyAhW3N0cmluZyBtYXRjaCAiKnRleHRfc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIFwKLQkgfHwgIVtzdHJpbmcgbWF0Y2ggIipkYXRhX3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSBcCi0JIHx8ICFbc3RyaW5nIG1hdGNoICIqY29tbW9uX3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSBcCi0JIHx8IFtzdHJpbmcgbWF0Y2ggIipzdGF0aWNfdGV4dF9zeW1ib2wgaW4gYmludGVzdC5vKiIgJGdvdF0gXAotCSB8fCBbc3RyaW5nIG1hdGNoICIqc3RhdGljX2RhdGFfc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKmV4dGVybmFsX3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSB9IHsKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHBhc3MgJHRlc3RuYW1lCi19Ci0KLSMgUnVuIHRoZSB0ZXN0cy4KLQotbG9uZ19maWxlbmFtZXMKLXN5bWJvbF90YWJsZQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9iaW50ZXN0LnMgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2JpbnRlc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwMDY1MC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2JpbnRlc3QucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuZ2xvYmwgdGV4dF9zeW1ib2wKLQkudGV4dAotdGV4dF9zeW1ib2w6CQotc3RhdGljX3RleHRfc3ltYm9sOgotCS5sb25nCTEKLQkubG9uZwlleHRlcm5hbF9zeW1ib2wKLQkuZ2xvYmwgZGF0YV9zeW1ib2wKLQkuZGF0YQotZGF0YV9zeW1ib2w6Ci1zdGF0aWNfZGF0YV9zeW1ib2w6Ci0JLmxvbmcJMgotCS5jb21tIGNvbW1vbl9zeW1ib2wsNApkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL2FkZGVuZGJ1Zy5zIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL2FkZGVuZGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTkzMDZmLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9hZGRlbmRidWcucworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGluaXRpYWxpemVfY2hhcl9zeW50YXgsQ09ERQotCS5FWFBPUlQgaW5pdGlhbGl6ZV9jaGFyX3N5bnRheCxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotaW5pdGlhbGl6ZV9jaGFyX3N5bnRheAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTY0LE5PX0NBTExTLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCWFkZGlsIEwnaXNfaWRjaGFyLSRnbG9iYWwkLTMyLCVyMjcKLQkuRVhJVAotCS5QUk9DRU5ECi1pc19pZGNoYXIJLmNvbW0gMjU2CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvZnJlZy5zIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL2ZyZWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZTEwZi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvZnJlZy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuTlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTY0LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlmbXB5ZmFkZCxzZ2wgJWZyNEwsJWZyNFIsJWZyNVIsJWZyNUwKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMjE1NWUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL29iamR1bXAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIHJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICByZXR1cm4KLX0KLQotIyBUaGVzZSB0ZXN0cyBhcmUgbm90IHN1aXRhYmxlIGZvciB3aWRlIG1vZGUuCi1pZiBbaXN0YXJnZXQgaHBwYSp3LSotKl0gdGhlbiB7Ci0gIHJldHVybgotfQotCi1pZiB7W3doaWNoICRPQkpEVU1QXSA9PSAwfSB0aGVuIHsKLSAgICBwZXJyb3IgIiRPQkpEVU1QIGRvZXMgbm90IGV4aXN0IgotICAgIHJldHVybgotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkT0JKRFVNUF0iCi0KLWlmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9hZGRlbmRidWcucyB0bXBkaXIvYWRkZW5kYnVnLm9dfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IG9iamZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9hZGRlbmRidWcub10KLX0gZWxzZSB7Ci0gICAgc2V0IG9iamZpbGUgdG1wZGlyL2FkZGVuZGJ1Zy5vCi19Ci0KLSMgTWFrZSBzdXJlIHRoZSBTT00gQkZEIGNvZGUgc2lnbiBleHRlbmRzIGNvbnN0YW50cyBpbiBSX0RBVEFfT1ZFUlJJREUgZml4dXBzLgotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLXIgJG9iamZpbGUiXQotCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0gIHNldCB3YW50ICIwMDAwMDAwMCBSX1BBUklTQ19EUFJFTDIxTFxbIAlcXStpc19pZGNoYXJcXCsweGZmZmZmZmUwLioiCi19IGVsc2UgewotICBzZXQgd2FudCAiMDAwMDAwMDAgUl9EUF9SRUxBVElWRVxbIAlcXStpc19pZGNoYXJcXCsweGZmZmZmZmUwLioiCi19Ci0KLQotaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBwYXNzICJhZGRlbmRidWcgdGVzdCIKLX0gZWxzZSB7Ci0gICAgZmFpbCAiYWRkZW5kYnVnIHRlc3QiCi19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTZXQgdXAgdGhlIHRlc3Qgb2YgZnJlZy5zCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2ZyZWcucyB0bXBkaXIvZnJlZy5vXX0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIFtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCBvYmpmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvZnJlZy5vXQotfSBlbHNlIHsKLSAgICBzZXQgb2JqZmlsZSB0bXBkaXIvZnJlZy5vCi19Ci0KLSMgTWFrZSBzdXJlIHRoYXQgd2UgZ2V0IFIgZmxvYXQgcmVncyBsaWtlIHdlJ3JlIHN1cHBvc2VkIHRvCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtLWRpc2Fzc2VtYmxlICRvYmpmaWxlIl0KLQotc2V0IHdhbnQgImZtcHlmYWRkLHNnbCBmcjQsZnI0UixmcjVSLGZyNSIKLQotaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBwYXNzICJmcmVnIHRlc3QiCi19IGVsc2UgewotICAgIGZhaWwgImZyZWcgdGVzdCIKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvbm0uZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ubS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YzdjNWYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ubS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIHJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIGlmIHtbd2hpY2ggJE5NXSA9PSAwfSB0aGVuIHsKLSAgICAgICAgcGVycm9yICIkTk0gZG9lcyBub3QgZXhpc3QiCi0gICAgICAgIHJldHVybgotICAgIH0KLX0KLQotc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJE5NXSIKLQotCi1pZiB7IVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYmludGVzdC5zIHRtcGRpci9iaW50ZXN0Lm9dfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlbXBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotfSBlbHNlIHsKLSAgICBzZXQgdGVtcGZpbGUgdG1wZGlyL2JpbnRlc3QubwotfQotCi0jIFRlc3Qgbm0gd2l0aCBubyBhcmd1bWVudHMuCi0KLSMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIEVDT0ZGIHRhcmdldHMsIGJlY2F1c2UgRUNPRkYKLSMgc3RvcmVzIG1vc3Qgc3ltYm9scyB0d2ljZSwgd2hpY2ggbWVzc2VzIHVwIHRoZSBubSBvdXRwdXQuCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotb3NmKiIgImFscGhhKi0qLW5ldHdhcmUqIgotc2V0dXBfeGZhaWwgIm1pcHMqLSotdWx0cml4KiIgIm1pcHMqLSotZWNvZmYqIiAibWlwcyotKi1pcml4NCoiCi1zZXR1cF94ZmFpbCAibWlwcyotKi1yaXNjb3MqIiAibWlwcyotKi1zeXN2MyoiICJtaXBzKi1zb255LWJzZCoiCi0KLSMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIFhDT0ZGIHRhcmdldHMsIGJlY2F1c2UgWENPRkYKLSMgZG9lcyBub3QgZW50ZXIgc3RhdGljIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZS4KLXNldHVwX3hmYWlsICIqLSotYWl4KiIKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICROTSAiJE5NRkxBR1MgJHRlbXBmaWxlIl0KLQotaWYgW2luZm8gZXhpc3RzIHZhcnNdIHRoZW4geyB1bnNldCB2YXJzIH0KLXdoaWxlIHtbcmVnZXhwICIoXFthLXpBLVpcXSkgKFxbYS16X1xdKl9zeW1ib2wpKC4qKSIgJGdvdCBhbGwgdHlwZSBzeW1ib2wgcmVzdF19IHsKLSAgICBzZXQgdmFycygkc3ltYm9sKSAkdHlwZQotICAgIHNldCBnb3QgJHJlc3QKLX0KLQotaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgJHZhcnModGV4dF9zeW1ib2wpICE9ICJUIiBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhkYXRhX3N5bWJvbCldIFwKLSAgICAgfHwgJHZhcnMoZGF0YV9zeW1ib2wpICE9ICJEIiBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhjb21tb25fc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyhjb21tb25fc3ltYm9sKSAhPSAiQyIgXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoZXh0ZXJuYWxfc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyhleHRlcm5hbF9zeW1ib2wpICE9ICJVIiBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhzdGF0aWNfdGV4dF9zeW1ib2wpXSBcCi0gICAgIHx8ICR2YXJzKHN0YXRpY190ZXh0X3N5bWJvbCkgIT0gInQiIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKHN0YXRpY19kYXRhX3N5bWJvbCldIFwKLSAgICAgfHwgJHZhcnMoc3RhdGljX2RhdGFfc3ltYm9sKSAhPSAiZCJ9IHsKLSAgICBmYWlsICJubSAobm8gYXJndW1lbnRzKSIKLX0gZWxzZSB7Ci0gICAgcGFzcyAibm0gKG5vIGFyZ3VtZW50cykiCi19Ci0KLSMgVGVzdCBubSAtZwotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAtZyAkdGVtcGZpbGUiXQotCi1pZiBbaW5mbyBleGlzdHMgdmFyc10gdGhlbiB7IHVuc2V0IHZhcnMgfQotd2hpbGUge1tyZWdleHAgIihcW2Etel9cXSpfc3ltYm9sKSguKikiICRnb3QgYWxsIHN5bWJvbCByZXN0XX0gewotICAgIHNldCB2YXJzKCRzeW1ib2wpIDEKLSAgICBzZXQgZ290ICRyZXN0Ci19Ci0KLWlmIHshW2luZm8gZXhpc3RzIHZhcnModGV4dF9zeW1ib2wpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhkYXRhX3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGNvbW1vbl9zeW1ib2wpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhleHRlcm5hbF9zeW1ib2wpXSBcCi0gICAgIHx8IFtpbmZvIGV4aXN0cyB2YXJzKHN0YXRpY190ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgW2luZm8gZXhpc3RzIHZhcnMoc3RhdGljX2RhdGFfc3ltYm9sKV19IHsKLSAgICBmYWlsICJubSAtZyIKLX0gZWxzZSB7Ci0gICAgcGFzcyAibm0gLWciCi19Ci0KLSMgVGVzdCBubSAtUAotCi0jIFRoaXMgdGVzdCBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBvbiBFQ09GRiB0YXJnZXRzLCBiZWNhdXNlIEVDT0ZGCi0jIHN0b3JlcyBtb3N0IHN5bWJvbHMgdHdpY2UsIHdoaWNoIG1lc3NlcyB1cCB0aGUgbm0gb3V0cHV0Lgotc2V0dXBfeGZhaWwgImFscGhhKi0qLW9zZioiICJhbHBoYSotKi1uZXR3YXJlKiIKLXNldHVwX3hmYWlsICJtaXBzKi0qLXVsdHJpeCoiICJtaXBzKi0qLWVjb2ZmKiIgIm1pcHMqLSotaXJpeDQqIgotc2V0dXBfeGZhaWwgIm1pcHMqLSotcmlzY29zKiIgIm1pcHMqLSotc3lzdjMqIiAibWlwcyotc29ueS1ic2QqIgotCi0jIFRoaXMgdGVzdCBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBvbiBYQ09GRiB0YXJnZXRzLCBiZWNhdXNlIFhDT0ZGCi0jIGRvZXMgbm90IGVudGVyIHN0YXRpYyBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGUuCi1zZXR1cF94ZmFpbCAiKi0qLWFpeCoiCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkTk0gIiROTUZMQUdTIC1QICR0ZW1wZmlsZSJdCi0KLXNldCB3YW50ICJjb21tb25fc3ltYm9sIEMgXFswXF0qNC4qZGF0YV9zeW1ib2wgRCBcWzAtOWEtZkEtRlxdKi4qZXh0ZXJuYWxfc3ltYm9sIFUuKnN0YXRpY19kYXRhX3N5bWJvbCBkIFxbMC05YS1mQS1GXF0qLipzdGF0aWNfdGV4dF9zeW1ib2wgdCBcWzAtOWEtZkEtRlxdKi4qdGV4dF9zeW1ib2wgVCBcWzAtOWEtZkEtRlxdKiIKLQotaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBwYXNzICJubSAtUCIKLX0gZWxzZSB7Ci0gICAgZmFpbCAibm0gLVAiCi19Ci0KLSMgVGhlcmUgYXJlIGNlcnRhaW5seSBvdGhlciB0ZXN0cyB0aGF0IGNvdWxkIGJlIHJ1bi4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvb2JqY29weS5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamNvcHkuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQwZTBhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvb2JqY29weS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OTYgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRPQkpDT1BZXSA9PSAwfSB0aGVuIHsKLSAgICAgICAgcGVycm9yICIkT0JKQ09QWSBkb2VzIG5vdCBleGlzdCIKLSAgICAgICAgcmV0dXJuCi0gICAgfQotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkT0JKQ09QWV0iCi0KLWlmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9iaW50ZXN0LnMgdG1wZGlyL2JpbnRlc3Qub119IHRoZW4gewotICAgIHBlcnJvciAidW5yZXNvbHZlZCAxIgotICAgIHVucmVzb2x2ZWQgIm9iamNvcHkgKHNpbXBsZSBjb3B5KSIKLSAgICByZXR1cm4KLX0KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCB0ZW1wZmlsZSB0bXBkaXIvYmludGVzdC5vOwotICAgIHNldCBjb3B5ZmlsZSB0bXBkaXIvY29weTsKLX0gZWxzZSB7Ci0gICAgc2V0IHRlbXBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotICAgIHNldCBjb3B5ZmlsZSBjb3B5Ci19Ci0KLSMgVGVzdCB0aGF0IG9iamNvcHkgZG9lcyBub3QgbW9kaWZ5IGEgZmlsZSB3aGVuIGNvcHlpbmcgaXQuCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0ubyJdCi0KLWlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotICAgIGZhaWwgIm9iamNvcHkgKHNpbXBsZSBjb3B5KSIKLX0gZWxzZSB7Ci0gICAgc2VuZF9sb2cgImNtcCAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0ub1xuIgotICAgIHZlcmJvc2UgImNtcCAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0ubyIKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgc3JjMSB0bXBkaXIvYmludGVzdC5vCi0Jc2V0IHNyYzIgdG1wZGlyL2NvcHkubwotCXJlbW90ZV91cGxvYWQgaG9zdCAkdGVtcGZpbGUgJHNyYzE7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICR7Y29weWZpbGV9Lm8gJHNyYzI7Ci0gICAgfSBlbHNlIHsKLQlzZXQgc3JjMSAke3RlbXBmaWxlfQotCXNldCBzcmMyICR7Y29weWZpbGV9Lm8KLSAgICB9Ci0gICAgc2V0IHN0YXR1cyBbcmVtb3RlX2V4ZWMgYnVpbGQgY21wICIke3NyYzF9ICR7c3JjMn0iXTsKLSAgICBzZXQgZXhlY19vdXRwdXQgW2xpbmRleCAkc3RhdHVzIDFdOwotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0gICAgIyBPbiBzb21lIHN5c3RlbXMgdGhlIHJlc3VsdCBvZiBvYmpjb3B5IHdpbGwgbm90IGJlIGlkZW50aWNhbC4KLSAgICAjIFVzdWFsbHkgdGhpcyBpcyBqdXN0IGJlY2F1c2UgZ2FzIGlzbid0IHVzaW5nIGJmZCB0byB3cml0ZSB0aGUgZmlsZXMKLSAgICAjIGluIHRoZSBmaXJzdCBwbGFjZSwgYW5kIG1heSBvcmRlciB0aGluZ3MgYSBsaXR0bGUgZGlmZmVyZW50bHkuCi0gICAgIyBUaG9zZSBzeXN0ZW1zIHNob3VsZCB1c2Ugc2V0dXBfeGZhaWwgaGVyZS4KLQotICAgIHNldHVwX3hmYWlsICJzaC0qLWNvZmYiICJzaC0qLWhtcyIgCi0gICAgc2V0dXBfeGZhaWwgIm02OCotKi1ocHV4KiIgIm02OCotKi1zdW5vcyoiICJtNjgqLSotY29mZiIgIm02OCotKi12eHdvcmtzKiIKLSAgICBzZXR1cF94ZmFpbCAibTY4Ki1lcmljc3Nvbi1vc2UiICJtNjhrKi1tb3Rvcm9sYS1zeXN2KiIKLSAgICBzZXR1cF94ZmFpbCAiaSo4Ni0qLWxpbnV4YW91dCoiICJpKjg2LSotYW91dCoiCi0gICAgc2V0dXBfeGZhaWwgImkqODYtKi1zeXN2MyIgImkqODYtKi1pc2MqIiAiaSo4Ni0qLXNjbyoiICJpKjg2LSotY29mZiIKLSAgICBzZXR1cF94ZmFpbCAiaSo4Ni0qLWFpeCoiICJpKjg2LSotZ28zMioiICJpKjg2LSotbXNkb3MqIgotICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIiAiYTI5ay0qLWNvZmYiICJhMjlrLSotdnh3b3JrcyoiCi0gICAgc2V0dXBfeGZhaWwgImk5NjAtKi1jb2ZmIgotICAgIHNldHVwX3hmYWlsICJoODMwMC0qLWhtcyIgImg4MzAwLSotY29mZiIKLSAgICBzZXR1cF94ZmFpbCAiaDg1MDAtKi1obXMiICJoODUwMC0qLWNvZmYiCi0gICAgc2V0dXBfeGZhaWwgImhwcGEqLSotKiIKLSAgICBjbGVhcl94ZmFpbCAiaHBwYSotKi0qZWxmKiIKLSAgICBzZXR1cF94ZmFpbCAibTg4Ki0qLWNvZmYiICJtODgqLW1vdG9yb2xhLXN5c3YqIgotICAgIHNldHVwX3hmYWlsICJ6OCotKi1jb2ZmIgotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXBhc3MgIm9iamNvcHkgKHNpbXBsZSBjb3B5KSIKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQotCSMgT24gT1NGLzEsIHRoaXMgc3VjY2VlZHMgd2l0aCBnYXMgYW5kIGZhaWxzIHdpdGggL2Jpbi9hcy4KLQlzZXR1cF94ZmFpbCAiYWxwaGEqLSotb3NmKiIKLQotCSMgVGhpcyBmYWlscyBmb3IgQ09GRiBpOTYwLXZ4d29ya3MgdGFyZ2V0cy4KLQlzZXR1cF94ZmFpbCAiaTk2MC0qLXZ4d29ya3MqIgotCi0JZmFpbCAib2JqY29weSAoc2ltcGxlIGNvcHkpIgotICAgIH0KLX0KLQotIyBUZXN0IGdlbmVyYXRpbmcgUyByZWNvcmRzLgotCi0jIFdlIG1ha2UgdGhlIHNyZWMgZmlsZW5hbWUgOC4zIGNvbXBhdGlibGUuIE5vdGUgdGhhdCB0aGUgaGVhZGVyIHN0cmluZwotIyBtYXRjaGVkIGFnYWluc3QgZGVwZW5kcyBvbiB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gVWdoLgotCi1pZiBbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgc3JlY2ZpbGUgY29weS5zcmUKLSAgICBzZXQgaGVhZGVyX3N0cmluZyBTMDBCMDAwMDYzNkY3MDc5MkU3MzcyNjVDMQotfSBlbHNlIHsKLSAgICBzZXQgc3JlY2ZpbGUgJHtjb3B5ZmlsZX0uc3JlYwotICAgIHNldCBoZWFkZXJfc3RyaW5nIFMwMTMwMDAwNzQ2RDcwNjQ2OTcyMkY2MzZGNzA3OTJFNzM3MjY1NjM5NwotfQotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkNPUFkgIiRPQkpDT1BZRkxBR1MgLU8gc3JlYyAkdGVtcGZpbGUgJHtzcmVjZmlsZX0iXQotCi1pZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLSAgICBmYWlsICJvYmpjb3B5IC1PIHNyZWMiCi19IGVsc2UgewotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAke3NyZWNmaWxlfSB0bXBkaXIvY29weS5zcmVjOwotCXNldCBzcmVjZmlsZSB0bXBkaXIvY29weS5zcmVjOwotICAgIH0KLSAgICBzZXQgZmlsZSBbb3BlbiAke3NyZWNmaWxlfSByXQotCi0gICAgIyBUaGUgZmlyc3QgUyByZWNvcmQgaXMgZml4ZWQgYnkgdGhlIGZpbGUgbmFtZSB3ZSBhcmUgdXNpbmcuCi0gICAgZ2V0cyAkZmlsZSBsaW5lCi0gICAgc2VuZF9sb2cgIiRsaW5lXG4iCi0gICAgdmVyYm9zZSAkbGluZQotICAgIGlmICFbcmVnZXhwICIkaGVhZGVyX3N0cmluZy4qIiAkbGluZV0gewotCXNlbmRfbG9nICJiYWQgaGVhZGVyXG4iCi0JZmFpbCAib2JqY29weSAtTyBzcmVjIgotICAgIH0gZWxzZSB7Ci0Jd2hpbGUge1tnZXRzICRmaWxlIGxpbmVdICE9IC0xIFwKLQkgICAgICAgJiYgW3JlZ2V4cCAiXlNcWzEyM1xdXFswLTlhLWZBLUZcXStcW1xyXG5cXSokIiAkbGluZV19IHsKLQkgICAgc2VuZF9sb2cgIiRsaW5lXG4iCi0JICAgIHZlcmJvc2UgJGxpbmUKLQkgICAgc2V0IGxpbmUgIioqRU9GKioiCi0JfQotCXNlbmRfbG9nICIkbGluZVxuIgotCXZlcmJvc2UgJGxpbmUKLQlpZiAhW3JlZ2V4cCAiXlNcWzc4OVxdXFswLTlhLWZBLUZcXStcW1xyXG5cXSokIiAkbGluZV0gdGhlbiB7Ci0JICAgIHNlbmRfbG9nICJiYWQgdHJhaWxlclxuIgotCSAgICBmYWlsICJvYmpjb3B5IC1PIHNyZWMiCi0JfSBlbHNlIHsKLQkgICAgaWYge1tnZXRzICRmaWxlIGxpbmVdICE9IC0xfSB0aGVuIHsKLQkJc2VuZF9sb2cgImdhcmJhZ2UgYXQgZW5kXG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQl2ZXJib3NlICRsaW5lCi0JCWZhaWwgIm9iamNvcHkgLU8gc3JlYyIKLQkgICAgfSBlbHNlIHsKLQkJc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1mICR7Y29weWZpbGV9LnNyZWMiXQotCQlpZiAhW3JlZ2V4cCAiZmlsZSBmb3JtYXQgc3JlYyIgJGdvdF0gdGhlbiB7Ci0JCSAgICBzZW5kX2xvZyAib2JqZHVtcCBmYWlsZWRcbiIKLQkJICAgIGZhaWwgIm9iamNvcHkgLU8gc3JlYyIKLQkJfSBlbHNlIHsKLQkJICAgIHBhc3MgIm9iamNvcHkgLU8gc3JlYyIKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGNsb3NlICRmaWxlCi19Ci0KLSMgVGVzdCBzZXR0aW5nIGFuZCBhZGp1c3RpbmcgdGhlIHN0YXJ0IGFkZHJlc3MuICBXZSBvbmx5IHRlc3QgdGhpcwotIyB3aGlsZSBnZW5lcmF0aW5nIFMgcmVjb3JkcywgYmVjYXVzZSB3ZSBtYXkgbm90IGJlIGFibGUgdG8gc2V0IHRoZQotIyBzdGFydCBhZGRyZXNzIGZvciBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLCBhbmQgdGhlIFMgcmVjb3JkIGNhc2UKLSMgaXMgdGhlIG9ubHkgdXNlZnVsIG9uZSBhbnlob3cuCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZiAkdGVtcGZpbGUiXQotaWYgIVtyZWdleHAgInN0YXJ0IGFkZHJlc3MgKFxbMC05YS1mQS1GeFhcXSspIiAkZ290IGFsbCBvcmlnc3RhcnRdIHRoZW4gewotICAgIHBlcnJvciAib2JqZHVtcCBjYW4gbm90IHJlY29nbml6ZSBiaW50ZXN0Lm8iCi0gICAgc2V0IG9yaWdzdGFydCAiIgotfSBlbHNlIHsKLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkNPUFkgIiRPQkpDT1BZRkxBR1MgLU8gc3JlYyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0uc3JlYyAtLXNldC1zdGFydCAweDc2NTQiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotCWZhaWwgIm9iamNvcHkgLS1zZXQtc3RhcnQiCi0gICAgfSBlbHNlIHsKLQlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWYgJHtjb3B5ZmlsZX0uc3JlYyJdCi0JaWYgIVtyZWdleHAgImZpbGUgZm9ybWF0IHNyZWMuKnN0YXJ0IGFkZHJlc3MgKFxbMC05YS1mQS1GeFhcXSspIiAkZ290IGFsbCBzcmVjc3RhcnRdIHRoZW4gewotCSAgICBmYWlsICJvYmpjb3B5IC0tc2V0LXN0YXJ0IgotCX0gZWxzZSB7Ci0JICAgIGlmIHskc3JlY3N0YXJ0ICE9IDB4NzY1NH0gdGhlbiB7Ci0JCXNlbmRfbG9nICIkc3JlY3N0YXJ0ICE9IDB4NzY1NFxuIgotCQlmYWlsICJvYmpjb3B5IC0tc2V0LXN0YXJ0IgotCSAgICB9IGVsc2UgewotCQlwYXNzICJvYmpjb3B5IC0tc2V0LXN0YXJ0IgotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKQ09QWSAiJE9CSkNPUFlGTEFHUyAtTyBzcmVjICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5zcmVjIC0tYWRqdXN0LXN0YXJ0IDB4MTIzIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXN0YXJ0IgotICAgIH0gZWxzZSB7Ci0Jc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1mICR7Y29weWZpbGV9LnNyZWMiXQotCWlmICFbcmVnZXhwICJmaWxlIGZvcm1hdCBzcmVjLipzdGFydCBhZGRyZXNzIChcWzAtOWEtZkEtRnhYXF0rKSIgJGdvdCBhbGwgc3JlY3N0YXJ0XSB0aGVuIHsKLQkgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC1zdGFydCIKLQl9IGVsc2UgewotCSAgICBpZiB7JHNyZWNzdGFydCAhPSAkb3JpZ3N0YXJ0ICsgMHgxMjN9IHRoZW4gewotCQlzZW5kX2xvZyAiJHNyZWNzdGFydCAhPSAkb3JpZ3N0YXJ0ICsgMHgxMjNcbiIKLQkJZmFpbCAib2JqY29weSAtLWFkanVzdC1zdGFydCIKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAib2JqY29weSAtLWFkanVzdC1zdGFydCIKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLSMgVGVzdCBhZGp1c3RpbmcgdGhlIG92ZXJhbGwgVk1BLCBhbmQgYWRqdXN0aW5nIHRoZSBWTUEgb2YgYQotIyBwYXJ0aWN1bGFyIHNlY3Rpb24uICBXZSBhZ2FpbiBvbmx5IHRlc3QgdGhpcyB3aGVuIGdlbmVyYXRpbmcgUwotIyByZWNvcmRzLgotCi1zZXQgbG93ICIiCi1zZXQgbG93bmFtZSAiIgotCi1zZXQgaGVhZGVycyBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1oICR0ZW1wZmlsZSJdCi0KLXNldCBoZWFkZXJzX3JlZ2V4cCAiXFsgCTAtOVxdKyhcW14gCVxdKylcWyAJXF0qKFxbMC05YS1mQS1GXF0rKVxbIAlcXStcWzAtOWEtZkEtRlxdK1xbIAlcXSsoXFswLTlhLWZBLUZcXSspXFsgCVxdK1xbMC05YS1mQS1GXF0rXFsgCVxdKzJcWypcXVxbKlxdXFswLTlcXSsoLiopIgotCi1zZXQgZ290ICRoZWFkZXJzCi13aGlsZSB7W3JlZ2V4cCAkaGVhZGVyc19yZWdleHAgJGdvdCBhbGwgbmFtZSBzaXplIHZtYSByZXN0XX0gewotICAgIHNldCB2bWEgMHgkdm1hCi0gICAgc2V0IHNpemUgMHgkc2l6ZQotICAgIGlmIHskc2l6ZSAhPSAwfSB7Ci0JaWYgeyRsb3cgPT0gIiIgfHwgJHZtYSA8ICRsb3d9IHsKLSAgICAgICAgICAgIHNldCBsb3cgJHZtYQotCSAgICBzZXQgbG93bmFtZSAkbmFtZQotCX0KLSAgICB9Ci0gICAgc2V0IGdvdCAkcmVzdAotfQotCi1pZiB7JGxvdyA9PSAiIiB8fCAkb3JpZ3N0YXJ0ID09ICIifSB0aGVuIHsKLSAgICBwZXJyb3IgIm9iamR1bXAgY2FuIG5vdCByZWNvZ25pemUgYmludGVzdC5vIgotfSBlbHNlIHsKLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkNPUFkgIiRPQkpDT1BZRkxBR1MgLU8gc3JlYyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0uc3JlYyAtLWFkanVzdC12bWEgMHgxMjMiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotICAgICAgICBmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXZtYSIKLSAgICB9IGVsc2UgewotCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZmggJHtjb3B5ZmlsZX0uc3JlYyJdCi0Jc2V0IHdhbnQgImZpbGUgZm9ybWF0IHNyZWMuKnN0YXJ0IGFkZHJlc3NcWyAJXF0qKFxbMC05YS1mQS1GeFhcXSspLipzZWMxXFsgCVxdK1xbMC05YS1mQS1GXF0rXFsgCVxdKyhcWzAtOWEtZkEtRlxdKykiCi0JaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgc3RhcnQgdm1hXSB0aGVuIHsKLQkgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC12bWEiCi0JfSBlbHNlIHsKLQkgICAgc2V0IHZtYSAweCR2bWEKLQkgICAgaWYgeyR2bWEgIT0gJGxvdyArIDB4MTIzfSB0aGVuIHsKLQkJc2VuZF9sb2cgIiR2bWEgIT0gJGxvdyArIDB4MTIzXG4iCi0JCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtdm1hIgotCSAgICB9IGVsc2UgewotCQlpZiB7JHN0YXJ0ICE9ICRvcmlnc3RhcnQgKyAweDEyM30gdGhlbiB7Ci0JCSAgICBzZW5kX2xvZyAiJHN0YXJ0ICE9ICRvcmlnc3RhcnQgKyAweDEyM1xuIgotCQkgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC12bWEiCi0JCX0gZWxzZSB7Ci0JCSAgICBwYXNzICJvYmpjb3B5IC0tYWRqdXN0LXZtYSIKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIHNldCBhcmcgIiIKLSAgICBzZXQgZ290ICRoZWFkZXJzCi0gICAgd2hpbGUge1tyZWdleHAgJGhlYWRlcnNfcmVnZXhwICRnb3QgYWxsIG5hbWUgc2l6ZSB2bWEgcmVzdF19IHsKLQlzZXQgdm1hIDB4JHZtYQotCWlmIHskdm1hID09ICRsb3d9IHRoZW4gewotCSAgICBzZXQgYXJnICIkYXJnIC0tYWRqdXN0LXNlY3Rpb24tdm1hICRuYW1lKzQiCi0JfQotCXNldCBnb3QgJHJlc3QKLSAgICB9Ci0KLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkNPUFkgIiRPQkpDT1BZRkxBR1MgLU8gc3JlYyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0uc3JlYyAkYXJnIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hICsiCi0gICAgfSBlbHNlIHsKLQlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWggJHtjb3B5ZmlsZX0uc3JlYyJdCi0Jc2V0IHdhbnQgImZpbGUgZm9ybWF0IHNyZWMuKnNlYzFcWyAJXF0rXFswLTlhLWZBLUZcXStcWyAJXF0rKFxbMC05YS1mQS1GXF0rKSIKLQlpZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCB2bWFdIHRoZW4gewotCSAgICBmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hICsiCi0JfSBlbHNlIHsKLQkgICAgc2V0IHZtYSAweCR2bWEKLQkgICAgaWYgeyR2bWEgIT0gJGxvdyArIDR9IHRoZW4gewotCQlzZW5kX2xvZyAiJHZtYSAhPSAkbG93ICsgNFxuIgotCQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hICsiCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgKyIKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICByZWdzdWIgLWFsbCAiXFwrNCIgJGFyZyAiPVtleHByICRsb3cgKyA0XSIgYXJnZXEKLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkNPUFkgIiRPQkpDT1BZRkxBR1MgLU8gc3JlYyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0uc3JlYyAkYXJnZXEiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRnb3RdIHRoZW4gewotCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgPSIKLSAgICB9IGVsc2UgewotCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtaCAke2NvcHlmaWxlfS5zcmVjIl0KLQlzZXQgd2FudCAiZmlsZSBmb3JtYXQgc3JlYy4qc2VjMVxbIAlcXStcWzAtOWEtZkEtRlxdK1xbIAlcXSsoXFswLTlhLWZBLUZcXSspIgotCWlmICFbcmVnZXhwICR3YW50ICRnb3QgYWxsIHZtYV0gdGhlbiB7Ci0JICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgPSIKLQl9IGVsc2UgewotCSAgICBzZXQgdm1hIDB4JHZtYQotCSAgICBpZiB7JHZtYSAhPSAkbG93ICsgNH0gdGhlbiB7Ci0JCXNlbmRfbG9nICIkdm1hICE9ICRsb3cgKyA0XG4iCi0JCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgPSIKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSA9IgotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotIyBUZXN0IHN0cmlwcGluZyBhbiBvYmplY3QuCi0KLXByb2Mgc3RyaXBfdGVzdCB7IH0gewotICAgIGdsb2JhbCBDQwotICAgIGdsb2JhbCBTVFJJUAotICAgIGdsb2JhbCBTVFJJUEZMQUdTCi0gICAgZ2xvYmFsIE5NCi0gICAgZ2xvYmFsIE5NRkxBR1MKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotCi0gICAgc2V0IHRlc3QgInN0cmlwIgotCi0gICAgaWYgeyBbdGFyZ2V0X2NvbXBpbGUgJHNyY2Rpci8kc3ViZGlyL3Rlc3Rwcm9nLmMgdG1wZGlyL3Rlc3Rwcm9nLm8gb2JqZWN0IGRlYnVnXSAhPSAiIiB9IHsKLQl1bnRlc3RlZCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBvYmpmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvdGVzdHByb2cub107Ci0gICAgfSBlbHNlIHsKLQlzZXQgb2JqZmlsZSB0bXBkaXIvdGVzdHByb2cubwotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICRTVFJJUCAiJFNUUklQRkxBR1MgJG9iamZpbGUiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCWZhaWwgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkTk0gIi1hICROTUZMQUdTICRvYmpmaWxlIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiKjogbm8gc3ltYm9scyoiICRleGVjX291dHB1dF0gewotCWZhaWwgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0Ci19Ci0KLXN0cmlwX3Rlc3QKLQotIyBUZXN0IHN0cmlwcGluZyBhbiBvYmplY3QgZmlsZSB3aXRoIHNhdmluZyBhIHN5bWJvbAotCi1wcm9jIHN0cmlwX3Rlc3Rfd2l0aF9zYXZpbmdfYV9zeW1ib2wgeyB9IHsKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgU1RSSVAKLSAgICBnbG9iYWwgU1RSSVBGTEFHUwotICAgIGdsb2JhbCBOTQotICAgIGdsb2JhbCBOTUZMQUdTCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLQotICAgIHNldCB0ZXN0ICJzdHJpcCB3aXRoIHNhdmluZyBhIHN5bWJvbCIKLQotICAgIGlmIHsgW3RhcmdldF9jb21waWxlICRzcmNkaXIvJHN1YmRpci90ZXN0cHJvZy5jIHRtcGRpci90ZXN0cHJvZy5vIG9iamVjdCBkZWJ1Z10gIT0gIiIgfSB7Ci0JdW50ZXN0ZWQgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgb2JqZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL3Rlc3Rwcm9nLm9dOwotICAgIH0gZWxzZSB7Ci0Jc2V0IG9iamZpbGUgdG1wZGlyL3Rlc3Rwcm9nLm8KLSAgICB9Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkU1RSSVAgIiRTVFJJUEZMQUdTIC1LIG1haW4gLUsgX21haW4gJG9iamZpbGUiXQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCWZhaWwgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkTk0gIiROTUZMQUdTICRvYmpmaWxlIl0KLSAgICBpZiB7IVtyZWdleHAge14oWzAtOWEtZkEtRl0rKT9bIF0rVCBtYWlufSAkZXhlY19vdXRwdXRdIFwKLSAgICAgICAgICYmICFbcmVnZXhwIHteKFswLTlhLWZBLUZdKyk/WyBdK1QgX21haW59ICRleGVjX291dHB1dF19IHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgcGFzcyAkdGVzdAotfQotCi1zdHJpcF90ZXN0X3dpdGhfc2F2aW5nX2Ffc3ltYm9sCi0KLSMgQnVpbGQgYSBmaW5hbCBleGVjdXRhYmxlLgotCi1wcm9jIGNvcHlfc2V0dXAgeyB9IHsKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIAotICAgIHNldCByZXMgW2J1aWxkX3dyYXBwZXIgdGVzdGdsdWUub107Ci0gICAgc2V0IGZsYWdzIHsgZGVidWcgfTsKLSAgICAKLSAgICBpZiB7ICRyZXMgIT0gIiIgfSB7Ci0JbGFwcGVuZCBmbGFncyAiYWRkaXRpb25hbF9mbGFncz1bbGluZGV4ICRyZXMgMV0iOwotCXNldCBhZGRfbGlicyAidGVzdGdsdWUubyI7Ci0gICAgfSBlbHNlIHsKLQlzZXQgYWRkX2xpYnMgIiI7Ci0gICAgfQotCi0gICAgaWYgeyBbdGFyZ2V0X2NvbXBpbGUgIiRzcmNkaXIvJHN1YmRpci90ZXN0cHJvZy5jICRhZGRfbGlicyIgdG1wZGlyL3Rlc3Rwcm9nIGV4ZWN1dGFibGUgJGZsYWdzXSAgIT0gIiIgfSB7Ci0JcmV0dXJuIDIKLSAgICB9Ci0KLSAgICBzZXQgcmVzdWx0IFtyZW1vdGVfbG9hZCB0YXJnZXQgdG1wZGlyL3Rlc3Rwcm9nXTsKLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJHJlc3VsdCAwXTsKLQotICAgIGlmIHsgJHN0YXR1cyAhPSAicGFzcyIgIH0gewotCXBlcnJvciAidW5yZXNvbHZlZCBzZXR1cCwgc3RhdHVzID0gJHN0YXR1cyIKLQlyZXR1cm4gMwotICAgIH0KLQotICAgIHJldHVybiAwCi19Ci0KLSMgVGVzdCBjb3B5aW5nIGFuIGV4ZWN1dGFibGUuCi0KLXByb2MgY29weV9leGVjdXRhYmxlIHsgcHJvZyBmbGFncyB0ZXN0MSB0ZXN0MiB9IHsKLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCB0ZXN0ZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL3Rlc3Rwcm9nXTsKLQlzZXQgdGVzdGNvcHkgY29weXByb2cKLSAgICB9IGVsc2UgewotCXNldCB0ZXN0ZmlsZSB0bXBkaXIvdGVzdHByb2cKLQlzZXQgdGVzdGNvcHkgdG1wZGlyL2NvcHlwcm9nCi0gICAgfQotICAgIHJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICR0ZXN0Y29weTsKLQotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICRwcm9nICIkZmxhZ3MgJHRlc3RmaWxlICR0ZXN0Y29weSJdCi0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0MQotCWZhaWwgJHRlc3QyCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICR0ZXN0Y29weSB0bXBkaXIvY29weXByb2cKLSAgICB9Ci0KLSAgICBzZXQgc3RhdHVzIFtyZW1vdGVfZXhlYyBidWlsZCAiY21wIiAidG1wZGlyL3Rlc3Rwcm9nIHRtcGRpci9jb3B5cHJvZyJdCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtsaW5kZXggJHN0YXR1cyAxXTsKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlwYXNzICR0ZXN0MQotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQotCSMgVGhpcyB3aWxsIGZhaWwgZm9yIG1hbnkgcmVhc29ucy4gIEZvciBleGFtcGxlLCBpdCB3aWxsIG1vc3QKLQkjIGxpa2VseSBmYWlsIGlmIGEgbm9uLUdOVSBsaW5rZXIgaXMgdXNlZC4gIFRoZXJlZm9yZSwgd2UgZG8KLQkjIG5vdCBpbnNpc3QgdGhhdCBpdCBwYXNzLiAgSWYgeW91IGFyZSB1c2luZyBhbiBhc3NlbWJsZXIgYW5kCi0JIyBsaW5rZXIgYmFzZWQgb24gdGhlIHNhbWUgQkZEIGFzIG9iamNvcHksIGl0IGlzIHdvcnRoCi0JIyBpbnZlc3RpZ2F0aW5nIHRvIHNlZSB3aHkgdGhpcyBmYWlsdXJlIG9jY3Vycy4gIElmIHdlIGFyZQotCSMgY3Jvc3MgY29tcGlsaW5nLCB3ZSBhc3N1bWUgdGhhdCBhIEdOVSBsaW5rZXIgaXMgYmVpbmcgdXNlZCwKLQkjIGFuZCBleHBlY3QgaXQgdG8gc3VjY2VlZC4KLQlpZiB7W2lzbmF0aXZlXX0gdGhlbiB7Ci0JICAgIHNldHVwX3hmYWlsICIqLSotKiIKLQl9Ci0KLQkjIFRoaXMgYWxzbyBmYWlscyBmb3IgbWlwcyotKi1lbGYgdGFyZ2V0cy4gIFNlZSBlbGYzMi1taXBzLmMKLQkjIG1pcHNfZWxmX3N5bV9pc19nbG9iYWwuCi0Jc2V0dXBfeGZhaWwgIm1pcHMqLSotZWxmIgotCi0Jc2V0dXBfeGZhaWwgImFybSotKi1jb2ZmIgotCXNldHVwX3hmYWlsICJhcm0qLSotcGUiCi0Jc2V0dXBfeGZhaWwgInRodW1iKi0qLWNvZmYiCi0Jc2V0dXBfeGZhaWwgInRodW1iKi0qLXBlIgotICAgIAotCWZhaWwgJHRlc3QxCi0gICAgfQotCi0gICAgc2V0IG91dHB1dCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9jb3B5cHJvZ10KLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJG91dHB1dCAwXTsKLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0gewotCWZhaWwgJHRlc3QyCi0gICAgfSBlbHNlIHsKLQlwYXNzICR0ZXN0MgotICAgIH0KLX0KLQotIyBUZXN0IHN0cmlwcGluZyBhbiBleGVjdXRhYmxlCi0KLXByb2Mgc3RyaXBfZXhlY3V0YWJsZSB7IHByb2cgZmxhZ3MgdGVzdCB9IHsKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotCi0gICAgcmVtb3RlX2Rvd25sb2FkIGJ1aWxkIHRtcGRpci9jb3B5cHJvZyB0bXBkaXIvc3RyaXByb2cKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgY29weWZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9zdHJpcHJvZ107Ci0gICAgfSBlbHNlIHsKLQlzZXQgY29weWZpbGUgdG1wZGlyL3N0cmlwcm9nCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJHByb2cgIiRmbGFncyAke2NvcHlmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAke2NvcHlmaWxlfSB0bXBkaXIvc3RyaXByb2c7Ci0gICAgfQotCi0gICAgc2V0IHJlc3VsdCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9zdHJpcHJvZ10KLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJHJlc3VsdCAwXTsKLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0gewotCWZhaWwgJHRlc3QKLSAgICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAke2NvcHlmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIio6IG5vIHN5bWJvbHMqIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotICAgIHBhc3MgJHRlc3QKLX0KLQotIyBUZXN0IHN0cmlwcGluZyBhbiBleGVjdXRhYmxlIHdpdGggc2F2aW5nIGEgc3ltYm9sCi0KLXByb2Mgc3RyaXBfZXhlY3V0YWJsZV93aXRoX3NhdmluZ19hX3N5bWJvbCB7IHByb2cgZmxhZ3MgdGVzdCB9IHsKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotCi0gICAgcmVtb3RlX2Rvd25sb2FkIGJ1aWxkIHRtcGRpci9jb3B5cHJvZyB0bXBkaXIvc3RyaXByb2cKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgY29weWZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9zdHJpcHJvZ107Ci0gICAgfSBlbHNlIHsKLQlzZXQgY29weWZpbGUgdG1wZGlyL3N0cmlwcm9nCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJHByb2cgIiRmbGFncyAke2NvcHlmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAke2NvcHlmaWxlfSB0bXBkaXIvc3RyaXByb2c7Ci0gICAgfQotCi0gICAgc2V0IHJlc3VsdCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9zdHJpcHJvZ10KLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJHJlc3VsdCAwXTsKLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0gewotCWZhaWwgJHRlc3QKLSAgICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAke2NvcHlmaWxlfSJdCi0gICAgaWYgeyFbcmVnZXhwIHteWzAtOWEtZkEtRl0rIFQgbWFpbn0gJGV4ZWNfb3V0cHV0XSBcCi0gICAgICAgICAmJiAhW3JlZ2V4cCB7XlswLTlhLWZBLUZdKyBUIF9tYWlufSAkZXhlY19vdXRwdXRdfSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLSAgICBwYXNzICR0ZXN0Ci19Ci0KLXNldCB0ZXN0MSAic2ltcGxlIG9iamNvcHkgb2YgZXhlY3V0YWJsZSIKLXNldCB0ZXN0MiAicnVuIG9iamNvcHkgb2YgZXhlY3V0YWJsZSIKLXNldCB0ZXN0MyAicnVuIHN0cmlwcGVkIGV4ZWN1dGFibGUiCi1zZXQgdGVzdDQgInJ1biBzdHJpcHBlZCBleGVjdXRhYmxlIHdpdGggc2F2aW5nIGEgc3ltYm9sIgotCi1zd2l0Y2ggW2NvcHlfc2V0dXBdIHsKLSAgICAiMSIgewotCSMgZG8gbm90aGluZwotICAgIH0KLSAgICAiMiIgewotCXVudGVzdGVkICR0ZXN0MQotCXVudGVzdGVkICR0ZXN0MgotCXVudGVzdGVkICR0ZXN0MwotCXVudGVzdGVkICR0ZXN0NAotICAgIH0KLSAgICAiMyIgewotCXVucmVzb2x2ZWQgJHRlc3QxCi0JdW5yZXNvbHZlZCAkdGVzdDIKLQl1bnJlc29sdmVkICR0ZXN0MwotCXVucmVzb2x2ZWQgJHRlc3Q0Ci0gICAgfQotICAgICIwIiB7Ci0JY29weV9leGVjdXRhYmxlICIkT0JKQ09QWSIgIiRPQkpDT1BZRkxBR1MiICIkdGVzdDEiICIkdGVzdDIiCi0Jc3RyaXBfZXhlY3V0YWJsZSAiJFNUUklQIiAiJFNUUklQRkxBR1MiICIkdGVzdDMiCi0Jc3RyaXBfZXhlY3V0YWJsZV93aXRoX3NhdmluZ19hX3N5bWJvbCAiJFNUUklQIiAiLUsgbWFpbiAtSyBfbWFpbiAkU1RSSVBGTEFHUyIgIiR0ZXN0NCIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamR1bXAuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwNDBmYy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamR1bXAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZSA8cm9iQGN5Z251cy5jb20+Ci0jIGFuZCByZXdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRPQkpEVU1QXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRPQkpEVU1QIGRvZXMgbm90IGV4aXN0IgotCXJldHVybgotICAgIH0KLX0KLQotc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJE9CSkRVTVBdIgotCi0jIFNpbXBsZSB0ZXN0IG9mIG9iamR1bXAgLWkKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1pIl0KLQotc2V0IGNwdXNfZXhwZWN0ZWQgIihhMjlrfGFsbGlhbnR8YWxwaGF8YXJjfGFybXxjb252ZXh8ZDEwdnxkMzB2fGZyMzB8aDh8aHBwYXxpMzg2fGk4NjB8aTk2MHxtMzJyfG02OGt8bTg4a3xNQ29yZXxtaXBzfG1uMTAyMDB8bW4xMDMwMHxuczMya3xwanxwb3dlcnBjfHB5cmFtaWR8cm9tcHxyczYwMDB8c2h8c3BhcmN8dGFob2V8djg1MHx2YXh8d2UzMmt8ejhrfHo4MDAxfHo4MDAyKSIKLQotIyBNYWtlIHN1cmUgdGhlIHRhcmdldCBDUFUgc2hvd3MgdXAgaW4gdGhlIGxpc3QuCi1pZiAhW3JlZ2V4cCAkY3B1c19leHBlY3RlZCAkdGFyZ2V0X2NwdV0gewotICAgIHJlZ3N1YiAiXlxbKFxdIiAiJGNwdXNfZXhwZWN0ZWQiICIoJHt0YXJnZXRfY3B1fXwiIGNwdXNfZXhwZWN0ZWQ7Ci19Ci0KLXNldCB3YW50ICJCRkQgaGVhZGVyIGZpbGUgdmVyc2lvbi4qc3JlY1xbXlxuXF0qXG5cW15cblxdKmhlYWRlciBcW15cblxdKmVuZGlhblxbXlxuXF0qLCBkYXRhIFxbXlxuXF0qZW5kaWFuLiokY3B1c19leHBlY3RlZCIKLQotaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBwYXNzICJvYmpkdW1wIC1pIgotfSBlbHNlIHsKLSAgICBmYWlsICJvYmpkdW1wIC1pIgotfQotCi0jIFRoZSByZW1haW5pbmcgdGVzdHMgcmVxdWlyZSBhIHRlc3QgZmlsZS4KLQotCi1pZiB7IVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYmludGVzdC5zIHRtcGRpci9iaW50ZXN0Lm9dfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLWlmIFtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCB0ZXN0ZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL2JpbnRlc3Qub10KLX0gZWxzZSB7Ci0gICAgc2V0IHRlc3RmaWxlIHRtcGRpci9iaW50ZXN0Lm8KLX0KLQotIyBUZXN0IG9iamR1bXAgLWYKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1mICR0ZXN0ZmlsZSJdCi0KLXNldCB3YW50ICIkdGVzdGZpbGU6XFsgCVxdKmZpbGUgZm9ybWF0LiphcmNoaXRlY3R1cmU6XFsgCVxdKiR7Y3B1c19leHBlY3RlZH0uKkhBU19SRUxPQy4qSEFTX1NZTVMiCi0KLWlmICFbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIGZhaWwgIm9iamR1bXAgLWYiCi19IGVsc2UgewotICAgIHBhc3MgIm9iamR1bXAgLWYiCi19Ci0KLSMgVGVzdCBvYmpkdW1wIC1oCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtaCAkdGVzdGZpbGUiXQotCi1zZXQgd2FudCAiJHRlc3RmaWxlOlxbIAlcXSpmaWxlIGZvcm1hdC4qU2VjdGlvbnMuKlxbMC05XF0rXFsgCVxdK1xbXiAJXF0qKHRleHR8VEVYVHxcXFwkQ09ERVxcXCQpXFteIAlcXSpcWyAJXF0qKFxbMC05YS1mQS1GXF0rKS4qXFswLTlcXStcWyAJXF0rXFteIAlcXSooXFwuZGF0YXxEQVRBKVxbXiAJXF0qXFsgCVxdKihcWzAtOWEtZkEtRlxdKykiCi0KLWlmICFbcmVnZXhwICR3YW50ICRnb3QgYWxsIHRleHRfbmFtZSB0ZXh0X3NpemUgZGF0YV9uYW1lIGRhdGFfc2l6ZV0gdGhlbiB7Ci0gICAgZmFpbCAib2JqZHVtcCAtaCIKLX0gZWxzZSB7Ci0gICAgdmVyYm9zZSAidGV4dCBuYW1lIGlzICR0ZXh0X25hbWUgc2l6ZSBpcyAkdGV4dF9zaXplIgotICAgIHZlcmJvc2UgImRhdGEgbmFtZSBpcyAkZGF0YV9uYW1lIHNpemUgaXMgJGRhdGFfc2l6ZSIKLSAgICBpZiB7W2V4cHIgIjB4JHRleHRfc2l6ZSJdIDwgOCB8fCBbZXhwciAiMHgkZGF0YV9zaXplIl0gPCA0fSB0aGVuIHsKLQlzZW5kX2xvZyAic2l6ZXMgdG9vIHNtYWxsXG4iCi0JZmFpbCAib2JqZHVtcCAtaCIKLSAgICB9IGVsc2UgewotCXBhc3MgIm9iamR1bXAgLWgiCi0gICAgfQotfQotCi0jIFRlc3Qgb2JqZHVtcCAtdAotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLXQgJHRlc3RmaWxlIl0KLQotaWYgW2luZm8gZXhpc3RzIHZhcnNdIHRoZW4geyB1bnNldCB2YXJzIH0KLXdoaWxlIHtbcmVnZXhwICIoXFthLXpcXSpfc3ltYm9sKSguKikiICRnb3QgYWxsIHN5bWJvbCByZXN0XX0gewotICAgIHNldCB2YXJzKCRzeW1ib2wpIDEKLSAgICBzZXQgZ290ICRyZXN0Ci19Ci0KLWlmIHshW2luZm8gZXhpc3RzIHZhcnModGV4dF9zeW1ib2wpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhkYXRhX3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGNvbW1vbl9zeW1ib2wpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhleHRlcm5hbF9zeW1ib2wpXX0gdGhlbiB7Ci0gICAgZmFpbCAib2JqZHVtcCAtdCIKLX0gZWxzZSB7Ci0gICAgcGFzcyAib2JqZHVtcCAtdCIKLX0KLQotIyBUZXN0IG9iamR1bXAgLXIKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1yICR0ZXN0ZmlsZSJdCi0KLXNldCB3YW50ICIkdGVzdGZpbGU6XFsgCVxdKmZpbGUgZm9ybWF0LipSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxcXFtcW15cXVxdKih0ZXh0fFRFWFR8XFxcJENPREVcXFwkKVxbXlxdXF0qXFxcXS4qZXh0ZXJuYWxfc3ltYm9sIgotCi1pZiBbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIHBhc3MgIm9iamR1bXAgLXIiCi19IGVsc2UgewotICAgIGZhaWwgIm9iamR1bXAgLXIiCi19Ci0KLSMgVGVzdCBvYmpkdW1wIC1zCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtcyAkdGVzdGZpbGUiXQotCi1zZXQgd2FudCAiJHRlc3RmaWxlOlxbIAlcXSpmaWxlIGZvcm1hdC4qQ29udGVudHMuKih0ZXh0fFRFWFR8XFxcJENPREVcXFwkKVxbXjAtOVxdKlxbIAlcXSpcWzAtOWEtZkEtRlxdKlxbIAlcXSooMDAwMDAwMDF8MDEwMDAwMDApLipDb250ZW50cy4qKGRhdGF8REFUQSlcW14wLTlcXSpcWyAJXF0qXFswLTlhLWZBLUZcXSpcWyAJXF0qKDAwMDAwMDAyfDAyMDAwMDAwKSIKLQotaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBwYXNzICJvYmpkdW1wIC1zIgotfSBlbHNlIHsKLSAgICBmYWlsICJvYmpkdW1wIC1zIgotfQotCi0jIE9wdGlvbnMgd2hpY2ggYXJlIG5vdCB0ZXN0ZWQ6IC1hIC1kIC1EIC1SIC1UIC14IC1sIC0tc3RhYnMKLSMgSSBkb24ndCBzZWUgYW55IGdlbmVyaWMgd2F5IHRvIHRlc3QgYW55IG9mIHRoZXNlIG90aGVyIHRoYW4gLWEuCi0jIFRlc3RzIGNvdWxkIGJlIHdyaXR0ZW4gZm9yIHNwZWNpZmljIHRhcmdldHMsIGFuZCB0aGF0IHNob3VsZCBiZSBkb25lCi0jIGlmIHNwZWNpZmljIHByb2JsZW1zIGFyZSBmb3VuZC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmY3NDRjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFdyaXR0ZW4gYnkgTmljayBDbGlmdG8gIDxuaWNrY0BjeWdudXMuY29tPgotIyBCYXNlZCBvbiBzY3JpcHRzIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0jIGFuZCBLZW4gUmFlYnVybiA8cmFlYnVybkBjeWdudXMuY29tPi4KLQotIyBGaXJzdCBzb21lIGhlbHBmdWwgcHJvY2VkdXJlcywgdGhlbiB0aGUgdGVzdHMgdGhlbXNlbHZlcwotCi0jIFJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVuYW1lIGdpdmVuCi1wcm9jIGZpbGVfY29udGVudHMgeyBmaWxlbmFtZSB9IHsKLSAgICBzZXQgZmlsZSBbb3BlbiAkZmlsZW5hbWUgcl0KLSAgICBzZXQgY29udGVudHMgW3JlYWQgJGZpbGVdCi0gICAgY2xvc2UgJGZpbGUKLSAgICByZXR1cm4gJGNvbnRlbnRzCi19Ci0KLSMgcmVnZXhwX2RpZmYsIGJhc2VkIG9uIHNpbXBsZV9kaWZmIHRha2VuIGZyb20gbGQgdGVzdCBzdWl0ZQotIwljb21wYXJlcyB0d28gZmlsZXMgbGluZS1ieS1saW5lCi0jCWZpbGUxIGNvbnRhaW5zIHN0cmluZ3MsIGZpbGUyIGNvbnRhaW5zIHJlZ2V4cHMgYW5kICMtY29tbWVudHMKLSMJYmxhbmsgbGluZXMgYXJlIGlnbm9yZWQgaW4gZWl0aGVyIGZpbGUKLSMJcmV0dXJucyBub24temVybyBpZiBkaWZmZXJlbmNlcyBleGlzdAotIwotcHJvYyByZWdleHBfZGlmZiB7IGZpbGVfMSBmaWxlXzIgfSB7Ci0KLSAgICBzZXQgZW9mIC0xCi0gICAgc2V0IGVuZF8xIDAKLSAgICBzZXQgZW5kXzIgMAotICAgIHNldCBkaWZmZXJlbmNlcyAwCi0gICAgc2V0IGRpZmZfcGFzcyAwCi0KLSAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMV0gdGhlbiB7Ci0Jc2V0IGZpbGVfYSBbb3BlbiAkZmlsZV8xIHJdCi0gICAgfSBlbHNlIHsKLQl3YXJuaW5nICIkZmlsZV8xIGRvZXNuJ3QgZXhpc3QiCi0JcmV0dXJuIDEKLSAgICB9Ci0KLSAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMl0gdGhlbiB7Ci0Jc2V0IGZpbGVfYiBbb3BlbiAkZmlsZV8yIHJdCi0gICAgfSBlbHNlIHsKLQlmYWlsICIkZmlsZV8yIGRvZXNuJ3QgZXhpc3QiCi0JY2xvc2UgJGZpbGVfYQotCXJldHVybiAxCi0gICAgfQotCi0gICAgdmVyYm9zZSAiIFJlZ2V4cC1kaWZmJ2luZzogJGZpbGVfMSAkZmlsZV8yIiAyCi0KLSAgICB3aGlsZSB7IDEgfSB7Ci0Jc2V0IGxpbmVfYSAiIgotCXNldCBsaW5lX2IgIiIKLQl3aGlsZSB7IFtzdHJpbmcgbGVuZ3RoICRsaW5lX2FdID09IDAgfSB7Ci0JICAgIGlmIHsgW2dldHMgJGZpbGVfYSBsaW5lX2FdID09ICRlb2YgfSB7Ci0JCXNldCBlbmRfMSAxCi0JCWJyZWFrCi0JICAgIH0KLQl9Ci0Jd2hpbGUgeyBbc3RyaW5nIGxlbmd0aCAkbGluZV9iXSA9PSAwIHx8IFtzdHJpbmcgbWF0Y2ggIiMqIiAkbGluZV9iXSB9IHsKLQkgICAgaWYgWyBzdHJpbmcgbWF0Y2ggIiNwYXNzIiAkbGluZV9iIF0gewotCQlzZXQgZW5kXzIgMQotCQlzZXQgZGlmZl9wYXNzIDEKLQkJYnJlYWsKLQkgICAgfQotCSAgICBpZiB7IFtnZXRzICRmaWxlX2IgbGluZV9iXSA9PSAkZW9mIH0gewotCQlzZXQgZW5kXzIgMQotCQlicmVhawotCSAgICB9Ci0JfQotCi0gICAgICAgIGlmIHsgJGRpZmZfcGFzcyB9IHsgCi0gICAgICAgICAgICBicmVhayAKLSAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzEgJiYgJGVuZF8yIH0geyAKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIH0gZWxzZWlmIHsgJGVuZF8xIH0gewotICAgICAgICAgICAgc2VuZF9sb2cgImV4dHJhIHJlZ2V4cHMgaW4gJGZpbGVfMiBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2IkXCJcbkVPRiBmcm9tICRmaWxlXzFcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImV4dHJhIHJlZ2V4cHMgaW4gJGZpbGVfMiBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2IkXCJcbkVPRiBmcm9tICRmaWxlXzEiIDMKLSAgICAgICAgICAgIHNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMiB9IHsKLSAgICAgICAgICAgIHNlbmRfbG9nICJleHRyYSBsaW5lcyBpbiAkZmlsZV8xIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYSRcIlxuRU9GIGZyb20gJGZpbGVfMlxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZXh0cmEgbGluZXMgaW4gJGZpbGVfMSBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2EkXCJcbkVPRiBmcm9tICRmaWxlXzJcbiIgMwotICAgICAgICAgICAgc2V0IGRpZmZlcmVuY2VzIDEKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2ZXJib3NlICJyZWdleHAgXCJeJGxpbmVfYiRcIlxubGluZSAgIFwiJGxpbmVfYVwiIiAzCi0gICAgICAgICAgICBpZiAhW3JlZ2V4cCAiXiRsaW5lX2IkIiAiJGxpbmVfYSJdIHsKLQkJc2VuZF9sb2cgInJlZ2V4cF9kaWZmIG1hdGNoIGZhaWx1cmVcbiIKLQkJc2VuZF9sb2cgInJlZ2V4cCBcIl4kbGluZV9iJFwiXG5saW5lICAgXCIkbGluZV9hXCJcbiIKLQkJc2V0IGRpZmZlcmVuY2VzIDEKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgeyAkZGlmZmVyZW5jZXMgPT0gMCAmJiAhJGRpZmZfcGFzcyAmJiBbZW9mICRmaWxlX2FdICE9IFtlb2YgJGZpbGVfYl0gfSB7Ci0Jc2VuZF9sb2cgIiRmaWxlXzEgYW5kICRmaWxlXzIgYXJlIGRpZmZlcmVudCBsZW5ndGhzXG4iCi0JdmVyYm9zZSAiJGZpbGVfMSBhbmQgJGZpbGVfMiBhcmUgZGlmZmVyZW50IGxlbmd0aHMiIDMKLQlzZXQgZGlmZmVyZW5jZXMgMQotICAgIH0KLQotICAgIGNsb3NlICRmaWxlX2EKLSAgICBjbG9zZSAkZmlsZV9iCi0KLSAgICByZXR1cm4gJGRpZmZlcmVuY2VzCi19Ci0KLSMgUnVuIGFuIGluZGl2aWR1YWwgcmVhZGVsZiB0ZXN0LgotIyBCYXNpY2FsbHkgcmVhZGVsZiBpcyBydW4gb24gdGhlIGJpbmFyeV9maWxlIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuCi0jIFJlYWRlbGYncyBvdXRwdXQgaXMgY2FwdHVyZWQgYW5kIHRoZW4gY29tcGFyZWQgYWdhaW5zdCB0aGUgY29udGVudHMKLSMgb2YgdGhlIHJlZ2V4cF9maWxlLgotCi1wcm9jIHJlYWRlbGZfdGVzdCB7IG9wdGlvbnMgYmluYXJ5X2ZpbGUgcmVnZXhwX2ZpbGUgeGZhaWxzIH0gewotCi0gICAgZ2xvYmFsIFJFQURFTEYKLSAgICBnbG9iYWwgUkVBREVMRkZMQUdTCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICAKLSAgICBzZW5kX2xvZyAiZXhlYyAkUkVBREVMRiAkUkVBREVMRkZMQUdTICRvcHRpb25zICRiaW5hcnlfZmlsZSA+IHJlYWRlbGYub3V0IgotICAgIGNhdGNoICJleGVjICRSRUFERUxGICRSRUFERUxGRkxBR1MgJG9wdGlvbnMgJGJpbmFyeV9maWxlID4gcmVhZGVsZi5vdXQiIGdvdAotCi0gICAgaWYgeyBbbGxlbmd0aCAkeGZhaWxzXSAhPSAwIH0gdGhlbiB7Ci0Jc2V0dXBfeGZhaWwgJHhmYWlscwotICAgIH0KLSAgICAKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLQlzZW5kX2xvZyAkZ290Ci0JZmFpbCAicmVhZGVsZiAkb3B0aW9ucyIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiB7IFtyZWdleHBfZGlmZiByZWFkZWxmLm91dCAkc3JjZGlyLyRzdWJkaXIvJHJlZ2V4cF9maWxlXSB9IHRoZW4gewotCWZhaWwgInJlYWRlbGYgJG9wdGlvbnMiCi0JdmVyYm9zZSAib3V0cHV0IGlzIFxuW2ZpbGVfY29udGVudHMgcmVhZGVsZi5vdXRdIiAyCi0JcmV0dXJuCi0gICAgfQotCi0gICAgcGFzcyAicmVhZGVsZiAkb3B0aW9ucyIKLX0KLQotCi0KLSMgT25seSBFTEYgYmFzZWQgdG9vbGNoYWlucyBuZWVkIHJlYWRlbGYuCi0jIEZvciBub3cgYmUgcGFyYW5vaWQgYW5kIGFzc3VtZSB0aGF0IGlmIEVMRiBpcyBub3QgbWVudGlvbmVkCi0jIGluIHRoZSB0YXJnZXQgc3RyaW5nLCB0aGVuIHRoZSB0YXJnZXQgaXMgbm90IGFuIEVMRiBiYXNlZCBwb3J0LgotCi1pZiAhW2lzdGFyZ2V0ICIqLSplbGYiXSB0aGVuIHsKLSAgICB2ZXJib3NlICIkUkVBREVMRiBpcyBvbmx5IGludGVudGVkZWQgZm9yIEVMRiB0YXJnZXRzIiAyCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRSRUFERUxGXSA9PSAwfSB0aGVuIHsKLSAgICAgICAgcGVycm9yICIkUkVBREVMRiBkb2VzIG5vdCBleGlzdCIKLSAgICAgICAgcmV0dXJuCi0gICAgfQotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkUkVBREVMRl0iCi0KLSMgQXNzZW1sZSB0aGUgdGVzdCBmaWxlLgotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXX0gdGhlbiB7Ci0gICAgcGVycm9yICJ1bnJlc29sdmVkIDEiCi0gICAgdW5yZXNvbHZlZCAicmVhZGVsZiAtIGZhaWxlZCB0byBhc3NlbWJsZSIKLSAgICByZXR1cm4KLX0KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCB0ZW1wZmlsZSB0bXBkaXIvYmludGVzdC5vOwotfSBlbHNlIHsKLSAgICBzZXQgdGVtcGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCi19Ci0KLSMgUnVuIHRoZSB0ZXN0cwotcmVhZGVsZl90ZXN0IC1oICR0ZW1wZmlsZSByZWFkZWxmLmggIHt9Ci0KLSMgVGhlIHY4NTAgZmFpbHMgdGhlIG5leHQgdHdvIHRlc3RzIGJlY2F1c2UgaXQgY3JlYXRlcyB0d28gc3BlY2lhbAotIyBzZWN0aW9ucyBvZiBpdHMgb3duOiAuY2FsbF90YWJsZV9kYXRhIGFuZCAuY2FsbF90YWJsZV90ZXh0Ci0jIFRoZSByZWdleHAgc2NyaXB0cyBhcmUgbm90IGV4cGVjdGluZyB0aGVzZSBzZWN0aW9ucy4uLgotCi1yZWFkZWxmX3Rlc3QgLVMgJHRlbXBmaWxlIHJlYWRlbGYucyAge3Y4NTAqLSotKn0KLXJlYWRlbGZfdGVzdCAtcyAkdGVtcGZpbGUgcmVhZGVsZi5zcyB7djg1MCotKi0qfQotcmVhZGVsZl90ZXN0IC1yICR0ZW1wZmlsZSByZWFkZWxmLnIgIHt9Ci0KLQotIyBDb21waWxlIHRoZSBzZWNvbmQgdGVzdCBmaWxlLgotaWYgeyBbdGFyZ2V0X2NvbXBpbGUgJHNyY2Rpci8kc3ViZGlyL3Rlc3Rwcm9nLmMgdG1wZGlyL3Rlc3Rwcm9nLm8gb2JqZWN0IGRlYnVnXSAhPSAiIiB9IHsKLSAgICB1bnRlc3RlZCAicmVhZGVsZiAtdyIKLSAgICByZXR1cm4KLX0KLQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlbXBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvdGVzdHByb2cub107Ci19IGVsc2UgewotICAgIHNldCB0ZW1wZmlsZSB0bXBkaXIvdGVzdHByb2cubwotfQotCi0jIFRoZSB4ZmFpbCB0YXJnZXRzIGhlcmUgZG8gbm90IGRlZmF1bHQgdG8gRFdBUkYyIGZvcm1hdCBkZWJ1ZyBpbmZvcm1hdGlvbgotIyBUaGUgc3ltcHRvbSBpcyB0aGF0IHRoZSBvdXRwdXQgb2YgJ3JlYWRlbGYgLXdpJyBpcyBlbXB0eS4KLQotcmVhZGVsZl90ZXN0IC13aSAkdGVtcGZpbGUgcmVhZGVsZi53aSB7djg1MCotKi0qfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmggYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwZWFiNS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLUVMRiBIZWFkZXI6Ci0gIE1hZ2ljOiAgIDdmIDQ1IDRjIDQ2IDBbMTJdIDBbMTJdIDAxIC4uIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIAotICBDbGFzczogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRlszNl1bMjRdCi0gIERhdGE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMidzIGNvbXBsZW1lbnQsLiogZW5kaWFuCi0gIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBcKGN1cnJlbnRcKQotICBPUy9BQkk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4qCi0gIEFCSSBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgLioKLSAgVHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUwgXChSZWxvY2F0YWJsZSBmaWxlXCkKLSAgTWFjaGluZTogICAgICAgICAgICAgICAgICAgICAgICAgICAuKgotICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQotICBFbnRyeSBwb2ludCBhZGRyZXNzOiAgICAgICAgICAgICAgIDB4MAotICBTdGFydCBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgIDAgXChieXRlcyBpbnRvIGZpbGVcKQotICBTdGFydCBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgIC4qIFwoYnl0ZXMgaW50byBmaWxlXCkKLSAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuKgotICBTaXplIG9mIHRoaXMgaGVhZGVyOiAgICAgICAgICAgICAgIC4qIFwoYnl0ZXNcKQotICBTaXplIG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgIDAgXChieXRlc1wpCi0gIE51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgMAotICBTaXplIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgIC4qIFwoYnl0ZXNcKQotICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgIC4qCi0gIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogLioKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5yIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDk2NTkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnIKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotUmVsb2NhdGlvbiBzZWN0aW9uICcucmVsLip0ZXh0JyBhdCBvZmZzZXQgMHguKiBjb250YWlucyAxIGVudHJpZXM6Ci0gIE9mZnNldCAgICBJbmZvICBUeXBlICAgICAgICAgICAgU3ltYm9sJ3MgVmFsdWUgIFN5bWJvbCdzIE5hbWUuKgotICAwMDAwMDAwNCAgMDAuKiBSXy4qMDAwMDAwMDAgIGV4dGVybmFsX3N5bWJvbC4qCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYucyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGIxMjQ1Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotVGhlcmUgYXJlIC4qIHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0IC4qOgotCi1TZWN0aW9uIEhlYWRlcnM6Ci0gIFxbTnJcXSBOYW1lICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGcgTGsgSW5mIEFsCi0gIFxbIDBcXSAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgMDAwMDAwMDAgMDAwMDAwIDAwMDAwMCAwMCAgICAgIDAgICAwIDAKLSAgXFsgMVxdIC50ZXh0ICAgICAgICAgICAgIFBST0dCSVRTICAgICAgICAwMDAwMDAwMCAwMDAwMzQgMDAwMDA4IDAwICBBWCAgMCAgIDAgLgotICBcWyAyXF0gLnJlbC4rdGV4dCArUkVMLiArMCsgMCsuKiAwMDAwMC4gMC4gICAgICAuICAgMSA0Ci0gIFxbIDNcXSAuZGF0YSAgICAgICAgICAgICBQUk9HQklUUyAgICAgICAgMDAwMDAwMDAgMDAwMDNjIDAwMDAwNCAwMCBXQSAgIDAgICAwIC4KLSAgXFsgNFxdIC5ic3MgICAgICAgICAgICAgIE5PQklUUyAgICAgICAgICAwMDAwMDAwMCAwMDAwNDAgMDAwMDAwIDAwIFdBICAgMCAgIDAgLgotICBcWyA1XF0gLnNoc3RydGFiICAgICAgICAgU1RSVEFCICAgICAgICAgIDAwMDAwMDAwIDAwMDA0MCAwMDAwLiogMDAgICAgICAwICAgMCAuCi0gIFxbIDZcXSAuc3ltdGFiICAgICAgICAgICBTWU1UQUIgICAgICAgICAgMDAwMDAwMDAgMCsuKiAwKy4qIDEwICAgICAgNyAgIDYgNAotICBcWyA3XF0gLnN0cnRhYiAgICAgICAgICAgU1RSVEFCICAgICAgICAgIDAwMDAwMDAwIDArLiogMCsuKiAwMCAgICAgIDAgICAwIDEKLQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnNzIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzYwYjM4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotU3ltYm9sIHRhYmxlICcuc3ltdGFiJyBjb250YWlucyAuKiBlbnRyaWVzOgotICBOdW06ICAgIFZhbHVlICBTaXplIFR5cGUgICAgQmluZCAgIE90ICBOZHggTmFtZQotICAgIDA6ICAgICAgICAwICAgICAwIE5PVFlQRSAgTE9DQUwgICAwICBVTkQgCi0gICAgMTogICAgICAgIDAgICAgIDAgU0VDVElPTiBMT0NBTCAgIDAgICAgMSAKLSAgICAyOiAgICAgICAgMCAgICAgMCBTRUNUSU9OIExPQ0FMICAgMCAgICAzIAotICAgIDM6ICAgICAgICAwICAgICAwIFNFQ1RJT04gTE9DQUwgICAwICAgIDQgCi0gICAgNDogICAgICAgIDAgICAgIDAgTk9UWVBFICBMT0NBTCAgIDAgICAgMSBzdGF0aWNfdGV4dF9zeW1ib2wKLSAgICA1OiAgICAgICAgMCAgICAgMCBOT1RZUEUgIExPQ0FMICAgMCAgICAzIHN0YXRpY19kYXRhX3N5bWJvbAotICAgIC46ICAgICAgICAwICAgICAwIE5PVFlQRSAgR0xPQkFMICAwICAgIDEgdGV4dF9zeW1ib2wKLSAgICAuOiAgICAgICAgMCAgICAgMCBOT1RZUEUgIEdMT0JBTCAgMCAgVU5EIGV4dGVybmFsX3N5bWJvbAotICAgLio6ICAgICAgICAwICAgICAwIE5PVFlQRSAgR0xPQkFMICAwICAgIDMgZGF0YV9zeW1ib2wKLSAgIC4qOiAgICAgICAgNCAgICAgNCBPQkpFQ1QgIEdMT0JBTCAgMCAgQ09NIGNvbW1vbl9zeW1ib2wKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi53aSBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi53aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyMmZmZi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYud2kKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1UaGUgc2VjdGlvbiAuZGVidWdfaW5mbyBjb250YWluczoKLQotICBDb21waWxhdGlvbiBVbml0OgotICAgTGVuZ3RoOiAgICAgICAgLioKLSAgIFZlcnNpb246ICAgICAgIDIKLSAgIEFiYnJldiBPZmZzZXQ6IDAKLSAgIFBvaW50ZXIgU2l6ZTogIDQKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiAxIFwoRFdfVEFHX2NvbXBpbGVfdW5pdFwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogLiovdGVzdHByb2cuYwkKLSAgICAgRFdfQVRfY29tcF9kaXIgICAgOiAuKi9iaW51dGlscwkKLSAgICAgRFdfQVRfcHJvZHVjZXIgICAgOiBHTlUgQyAuKgkKLSAgICAgRFdfQVRfbGFuZ3VhZ2UgICAgOiAxCVwoQU5TSSBDXCkKLSAgICAgRFdfQVRfbG93X3BjICAgICAgOiAwCQotICAgICBEV19BVF9oaWdoX3BjICAgICA6IC4qCQotICAgICBEV19BVF9zdG10X2xpc3QgICA6IDAJCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogMiBcKERXX1RBR19zdWJwcm9ncmFtXCkKLSAgICAgRFdfQVRfZXh0ZXJuYWwgICAgOiAxCQotICAgICBEV19BVF9uYW1lICAgICAgICA6IGZuCQotICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCi0gICAgIERXX0FUX2RlY2xfbGluZSAgIDogMTAJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogLioJCi0gICAgIERXX0FUX2xvd19wYyAgICAgIDogMAkKLSAgICAgRFdfQVRfaGlnaF9wYyAgICAgOiAuKgkKLSAgICAgRFdfQVRfZnJhbWVfYmFzZSAgOiAxIGJ5dGUgYmxvY2s6IC4qCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogMyBcKERXX1RBR19iYXNlX3R5cGVcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IGludAkKLSAgICAgRFdfQVRfYnl0ZV9zaXplICAgOiA0CQotICAgICBEV19BVF9lbmNvZGluZyAgICA6IDUJXChzaWduZWRcKQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDQgXChEV19UQUdfc3VicHJvZ3JhbVwpCi0gICAgIERXX0FUX3NpYmxpbmcgICAgIDogLioJCi0gICAgIERXX0FUX2V4dGVybmFsICAgIDogMQkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBtYWluCQotICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCi0gICAgIERXX0FUX2RlY2xfbGluZSAgIDogMTYJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogLioJCi0gICAgIERXX0FUX2xvd19wYyAgICAgIDogLioJCi0gICAgIERXX0FUX2hpZ2hfcGMgICAgIDogLioJCi0gICAgIERXX0FUX2ZyYW1lX2Jhc2UgIDogMSBieXRlIGJsb2NrOiAuKgotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDUgXChEV19UQUdfbGV4aWNhbF9ibG9ja1wpCi0gICAgIERXX0FUX2xvd19wYyAgICAgIDogLioJCi0gICAgIERXX0FUX2hpZ2hfcGMgICAgIDogLioJCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogNiBcKERXX1RBR192YXJpYWJsZVwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogY29tbW9uCQotICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCi0gICAgIERXX0FUX2RlY2xfbGluZSAgIDogMwkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiA8Lio+CQotICAgICBEV19BVF9leHRlcm5hbCAgICA6IDEJCi0gICAgIERXX0FUX2xvY2F0aW9uICAgIDogNSBieXRlIGJsb2NrOiAzIDAgMCAwIDAgCVwoRFdfT1BfYWRkcjogMFwpCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogNiBcKERXX1RBR192YXJpYWJsZVwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogZ2xvYmFsCQotICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCi0gICAgIERXX0FUX2RlY2xfbGluZSAgIDogNAkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiA8Lio+CQotICAgICBEV19BVF9leHRlcm5hbCAgICA6IDEJCi0gICAgIERXX0FUX2xvY2F0aW9uICAgIDogNSBieXRlIGJsb2NrOiAzIDAgMCAwIDAgCVwoRFdfT1BfYWRkcjogMFwpCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogNyBcKERXX1RBR192YXJpYWJsZVwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogbG9jYWwJCi0gICAgIERXX0FUX2RlY2xfZmlsZSAgIDogMQkKLSAgICAgRFdfQVRfZGVjbF9saW5lICAgOiA1CQotICAgICBEV19BVF90eXBlICAgICAgICA6IDwuKj4JCi0gICAgIERXX0FUX2xvY2F0aW9uICAgIDogNSBieXRlIGJsb2NrOiAzIC4gMCAwIC4gCVwoRFdfT1BfYWRkcjogLlwpCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogOCBcKERXX1RBR19hcnJheV90eXBlXCkKLSAgICAgRFdfQVRfc2libGluZyAgICAgOiA8Lio+CQotICAgICBEV19BVF90eXBlICAgICAgICA6IDwuKj4JCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogOSBcKERXX1RBR19zdWJyYW5nZV90eXBlXCkKLSAgICAgRFdfQVRfdXBwZXJfYm91bmQgOiA2CQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDMgXChEV19UQUdfYmFzZV90eXBlXCkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBjaGFyCQotICAgICBEV19BVF9ieXRlX3NpemUgICA6IDEJCi0gICAgIERXX0FUX2VuY29kaW5nICAgIDogOAlcKHVuc2lnbmVkIGNoYXJcKQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDcgXChEV19UQUdfdmFyaWFibGVcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IHN0cmluZwkKLSAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQotICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDYJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogPC4qPgkKLSAgICAgRFdfQVRfbG9jYXRpb24gICAgOiA1IGJ5dGUgYmxvY2s6IDMgLiAwIDAgLiAJXChEV19PUF9hZGRyOiAuXCkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvc2l6ZS5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3NpemUuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTA4YzkxLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvc2l6ZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUgPHJvYkBjeWdudXMuY29tPgotIyBhbmQgcmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgaWYge1t3aGljaCAkU0laRV0gPT0gMH0gdGhlbiB7Ci0JcGVycm9yICIkU0laRSBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4KLSAgICB9Ci19Ci0KLXNlbmRfdXNlciAiVmVyc2lvbiBbYmludXRpbF92ZXJzaW9uICRTSVpFXSIKLQotCi1pZiB7IVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYmludGVzdC5zIHRtcGRpci9iaW50ZXN0Lm9dfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlc3RmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotfSBlbHNlIHsKLSAgICBzZXQgdGVzdGZpbGUgdG1wZGlyL2JpbnRlc3QubwotfQotCi1zZXQgZGVjICJcWzAtOVxdKyIKLXNldCBoZXggIlxbMC05YS1mQS1GXF0rIgotCi0jIFRlc3Qgc2l6ZSB3aXRoIG5vIGFyZ3VtZW50cwotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJFNJWkUgIiRTSVpFRkxBR1MgJHRlc3RmaWxlIl0KLQotc2V0IHdhbnQgIigkZGVjKVxbIAlcXSsoJGRlYylcWyAJXF0rKCRkZWMpXFsgCVxdKygkZGVjKVxbIAlcXSsoJGhleClcWyAJXF0rJHt0ZXN0ZmlsZX0iCi0KLWlmICFbcmVnZXhwICR3YW50ICRnb3QgYWxsIHRleHQgZGF0YSBic3MgZHRvdCBoZXh0b3RdIHRoZW4gewotICAgIGZhaWwgInNpemUgKG5vIGFyZ3VtZW50cykiCi19IGVsc2UgewotICAgIGlmIHskdGV4dCA8IDggfHwgJGRhdGEgPCA0fSB0aGVuIHsKLQlmYWlsICJzaXplIChubyBhcmd1bWVudHMpIgotICAgIH0gZWxzZSB7Ci0JcGFzcyAic2l6ZSAobm8gYXJndW1lbnRzKSIKLSAgICB9Ci19Ci0KLSMgVGVzdCBzaXplIC1BCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkU0laRSAiJFNJWkVGTEFHUyAtQSAke3Rlc3RmaWxlfSJdCi0KLXNldCB3YW50ICIke3Rlc3RmaWxlfS4qKHRleHR8VEVYVClcW15cblxyXF0qXFsgCVxdKCRkZWMpXFsgCVxdKyRkZWMuKihcXC5kYXRhfERBVEEpXFteXG5cclxdKlxbIAlcXSgkZGVjKVxbIAlcXSskZGVjIgotCi1pZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCB0ZXh0bmFtZSB0ZXh0c2l6ZSBkYXRhbmFtZSBkYXRhc2l6ZV0gdGhlbiB7Ci0gICAgZmFpbCAic2l6ZSAtQSIKLX0gZWxzZSB7Ci0gICAgdmVyYm9zZSAidGV4dCBzaXplOiAkdGV4dHNpemUiCi0gICAgdmVyYm9zZSAiZGF0YSBzaXplOiAkZGF0YXNpemUiCi0gICAgaWYgeyR0ZXh0c2l6ZSA8IDggfHwgJGRhdGFzaXplIDwgNH0gdGhlbiB7Ci0JZmFpbCAic2l6ZSAtQSIKLSAgICB9IGVsc2UgewotCXBhc3MgInNpemUgLUEiCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC90ZXN0cHJvZy5jIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC90ZXN0cHJvZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmIxODU2Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvdGVzdHByb2cuYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qIFRoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIHRlc3Qgb2JqY29weSBhbmQgc3RyaXAuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50IGNvbW1vbjsKLWludCBnbG9iYWwgPSAxOwotc3RhdGljIGludCBsb2NhbCA9IDI7Ci1zdGF0aWMgY2hhciBzdHJpbmdbXSA9ICJzdHJpbmciOwotCi1pbnQKLWZuICgpCi17Ci0gIHJldHVybiAzOwotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgaWYgKGNvbW1vbiAhPSAwCi0gICAgICB8fCBnbG9iYWwgIT0gMQotICAgICAgfHwgbG9jYWwgIT0gMgotICAgICAgfHwgc3RyY21wIChzdHJpbmcsICJzdHJpbmciKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWxlZFxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgcHJpbnRmICgib2tcbiIpOwotICBleGl0ICgwKTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTI4MDJlLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUuIChyb2JAY3lnbnVzLmNvbSkKLQotbG9hZF9saWIgdXRpbC1kZWZzLmV4cAotbG9hZF9saWIgdXRpbHMtbGliLmV4cAotCi1pZiAhW2luZm8gZXhpc3RzIE5NXSB0aGVuIHsKLSAgICBzZXQgTk0gW2ZpbmRmaWxlICRiYXNlX2Rpci9ubS1uZXcgJGJhc2VfZGlyL25tLW5ldyBbdHJhbnNmb3JtIG5tXV0KLX0KLWlmICFbaW5mbyBleGlzdHMgTk1GTEFHU10gdGhlbiB7Ci0gICAgc2V0IE5NRkxBR1MgIiIKLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBTSVpFXSB0aGVuIHsKLSAgICBzZXQgU0laRSBbZmluZGZpbGUgJGJhc2VfZGlyL3NpemVdCi19Ci1pZiAhW2luZm8gZXhpc3RzIFNJWkVGTEFHU10gdGhlbiB7Ci0gICAgc2V0IFNJWkVGTEFHUyAiIgotfQotCi1pZiAhW2luZm8gZXhpc3RzIE9CSkRVTVBdIHRoZW4gewotICAgIHNldCBPQkpEVU1QIFtmaW5kZmlsZSAkYmFzZV9kaXIvb2JqZHVtcF0KLX0KLWlmICFbaW5mbyBleGlzdHMgT0JKRFVNUEZMQUdTXSB0aGVuIHsKLSAgICBzZXQgT0JKRFVNUEZMQUdTICIiCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgT0JKQ09QWV0gdGhlbiB7Ci0gICAgc2V0IE9CSkNPUFkgW2ZpbmRmaWxlICRiYXNlX2Rpci9vYmpjb3B5XQotfQotaWYgIVtpbmZvIGV4aXN0cyBPQkpDT1BZRkxBR1NdIHRoZW4gewotICAgIHNldCBPQkpDT1BZRkxBR1MgIiIKLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBBUl0gdGhlbiB7Ci0gICAgc2V0IEFSIFtmaW5kZmlsZSAkYmFzZV9kaXIvYXJdCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgU1RSSVBdIHRoZW4gewotICAgIHNldCBTVFJJUCBbZmluZGZpbGUgJGJhc2VfZGlyL3N0cmlwLW5ldyAkYmFzZV9kaXIvc3RyaXAtbmV3IFt0cmFuc2Zvcm0gc3RyaXBdXQotfQotaWYgIVtpbmZvIGV4aXN0cyBTVFJJUEZMQUdTXSB0aGVuIHsKLSAgICBzZXQgU1RSSVBGTEFHUyAiIgotfQotCi1pZiAhW2luZm8gZXhpc3RzIFJFQURFTEZdIHRoZW4gewotICAgIHNldCBSRUFERUxGIFtmaW5kZmlsZSAkYmFzZV9kaXIvcmVhZGVsZl0KLX0KLWlmICFbaW5mbyBleGlzdHMgUkVBREVMRkZMQUdTXSB0aGVuIHsKLSAgICBzZXQgUkVBREVMRkZMQUdTICIiCi19Ci0KLWlmICFbZmlsZSBpc2RpcmVjdG9yeSB0bXBkaXJdIHtjYXRjaCAiZXhlYyBta2RpciB0bXBkaXIiIHN0YXR1c30KLQotIwotIyBiaW51dGlsc19ydW4KLSMJcnVuIGEgcHJvZ3JhbSwgcmV0dXJuaW5nIHRoZSBvdXRwdXQKLSMJc2V0cyBiaW51dGlsc19ydW5fZmFpbGVkIGlmIHRoZSBwcm9ncmFtIGRvZXMgbm90IGV4aXN0Ci0jCi1wcm9jIGJpbnV0aWxzX3J1biB7IHByb2cgcHJvZ2FyZ3MgfSB7Ci0gICAgZGVmYXVsdF9iaW51dGlsc19ydW4gJHByb2cgJHByb2dhcmdzCi19Ci0KLSMKLSMgYmludXRpbHNfYXNzZW1ibGUKLSMJYXNzZW1ibGUgYSBmaWxlCi0jCi1wcm9jIGJpbnV0aWxzX2Fzc2VtYmxlIHsgc291cmNlIG9iamVjdCB9IHsKLSAgICBkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlICRzb3VyY2UgJG9iamVjdAotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9ocHBhLnNlZCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvaHBwYS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjA3ZDguLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9ocHBhLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcy8jIE9sZCBPU0Ygc2VkIGJsb3dzIHVwIGlmIHlvdSBoYXZlIGEgc2VkIGNvbW1hbmQgc3RhcnRpbmcgd2l0aCAiIyIvLwotcy8jIEF2b2lkIGl0IGJ5IHB1dHRpbmcgdGhlIGNvbW1lbnRzIHdpdGhpbiByZWFsIHNlZCBjb21tYW5kcy4vLwotcy8jIEZpeCB0aGUgZGVmaW5pdGlvbiBvZiBjb21tb25fc3ltYm9sIHRvIGJlIGNvcnJlY3QgZm9yIHRoZSBQQSBhc3NlYm1sZXJzLi8vCi1zLwlcLmNvbW0gY29tbW9uX3N5bWJvbCw0L2NvbW1vbl9zeW1ib2wJLmNvbW0gNC8KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9saWIvdXRpbHMtbGliLmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9saWIvdXRpbHMtbGliLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3ZjIxNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvbGliL3V0aWxzLWxpYi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIGV4dGVuZGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1wcm9jIGJpbnV0aWxfdmVyc2lvbiB7IHByb2cgfSB7Ci0gICAgaWYgIVtpc19yZW1vdGUgaG9zdF0gewotCXNldCBwYXRoIFt3aGljaCAkcHJvZ107Ci0JaWYgeyRwYXRoID09IDB9IHRoZW4gewotCSAgICBwZXJyb3IgIiRwcm9nIGNhbid0IGJlIHJ1biwgZmlsZSBub3QgZm91bmQuIgotCSAgICByZXR1cm4gIiIKLQl9Ci0gICAgfSBlbHNlIHsKLQlzZXQgcGF0aCAkcHJvZwotICAgIH0KLSAgICBzZXQgc3RhdGUgW3JlbW90ZV9leGVjIGhvc3QgJHByb2cgLS12ZXJzaW9uXTsKLSAgICBzZXQgdG1wICJbbGluZGV4ICRzdGF0ZSAxXVxuIjsKLSAgICAjIFNob3VsZCBmaW5kIGEgd2F5IHRvIGRpc2NhcmQgY29uc3RhbnQgcGFydHMsIGtlZXAgd2hhdGV2ZXIncwotICAgICMgbGVmdCwgc28gdGhlIHZlcnNpb24gc3RyaW5nIGNvdWxkIGJlIGFsbW9zdCBhbnl0aGluZyBhdCBhbGwuLi4KLSAgICByZWdleHAgIlxbXlxuXF0qIChjeWdudXMtfCkoXFstMC05LmEtekEtWi1cXSspXFtcclxuXF0uKiIgIiR0bXAiIHZlcnNpb24gY3lnIG51bWJlcgotICAgIGlmICFbaW5mbyBleGlzdHMgbnVtYmVyXSB0aGVuIHsKLSAgICAgICAgcmV0dXJuICIkcGF0aCAobm8gdmVyc2lvbiBudW1iZXIpXG4iCi0gICAgfQotICAgIHJldHVybiAiJHBhdGggJG51bWJlclxuIgotfQotCi0jCi0jIGRlZmF1bHRfYmludXRpbHNfcnVuCi0jCXJ1biBhIHByb2dyYW0sIHJldHVybmluZyB0aGUgb3V0cHV0Ci0jCXNldHMgYmludXRpbHNfcnVuX2ZhaWxlZCBpZiB0aGUgcHJvZ3JhbSBkb2VzIG5vdCBleGlzdAotIwotcHJvYyBkZWZhdWx0X2JpbnV0aWxzX3J1biB7IHByb2cgcHJvZ2FyZ3MgfSB7Ci0gICAgZ2xvYmFsIGJpbnV0aWxzX3J1bl9mYWlsZWQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICBzZXQgYmludXRpbHNfcnVuX2ZhaWxlZCAwCi0KLSAgICBpZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0JaWYge1t3aGljaCAkcHJvZ10gPT0gMH0gdGhlbiB7Ci0JICAgIHBlcnJvciAiJHByb2cgZG9lcyBub3QgZXhpc3QiCi0JICAgIHNldCBiaW51dGlsc19ydW5fZmFpbGVkIDEKLQkgICAgcmV0dXJuICIiCi0JfQotICAgIH0KLQotICAgIHNlbmRfbG9nICIkcHJvZyAkcHJvZ2FyZ3NcbiIKLSAgICB2ZXJib3NlICIkcHJvZyAkcHJvZ2FyZ3MiCi0KLSAgICAjIEdvdHRhIHF1b3RlIGRvbGxhci1zaWducyBiZWNhdXNlIHRoZXkgZ2V0IG1hbmdsZWQgYnkgdGhlCi0gICAgIyBzaGVsbCBvdGhlcndpc2UuCi0gICAgcmVnc3ViIC1hbGwgIlxcJCIgIiRwcm9nYXJncyIgIlxcJCIgcHJvZ2FyZ3MKLQotICAgIHNldCBzdGF0ZSBbcmVtb3RlX2V4ZWMgaG9zdCAkcHJvZyAkcHJvZ2FyZ3NdCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyBbbGluZGV4ICRzdGF0ZSAxXV07Ci0gICAgaWYgeyFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF19IHRoZW4gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0gICAgfQotICAgIHJldHVybiAkZXhlY19vdXRwdXQKLX0KLQotIwotIyBkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlCi0jCWFzc2VtYmxlIGEgZmlsZQotIwotcHJvYyBkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlIHsgc291cmNlIG9iamVjdCB9IHsKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgIyBUaGUgSFBQQSBhc3NlbWJsZXIgc3ludGF4IGlzIGEgbGl0dGxlIGRpZmZlcmVudCB0aGFuIG1vc3QsIHRvIG1ha2UKLSAgICAjIHRoZSB0ZXN0IHNvdXJjZSBmaWxlIGFzc2VtYmxlIHdlIG5lZWQgdG8gcnVuIGl0IHRocm91Z2ggc2VkLgotICAgICMKLSAgICAjIFRoaXMgaXMgYSBoYWNrIGluIHRoYXQgaXQgd29uJ3Qgc2NhbGUgd2VsbCBpZiBvdGhlciB0YXJnZXRzIG5lZWQKLSAgICAjIHNpbWlsYXIgdHJhbnNmb3JtYXRpb25zIHRvIGFzc2VtYmxlLiAgV2UnbGwgZ2VuZXJhbGl6ZSB0aGUgaGFjawotICAgICMgaWYvd2hlbiBvdGhlciB0YXJnZXRzIG5lZWQgc2ltaWxhciBoYW5kbGluZy4KLSAgICBpZiBbaXN0YXJnZXQgImhwcGEqLSotKiIgXSB0aGVuIHsKLQlzZW5kX2xvZyAic2VkIC1mICRzcmNkaXIvY29uZmlnL2hwcGEuc2VkIDwgJHNvdXJjZSA+IGFzbS5zXG4iCi0JdmVyYm9zZSAic2VkIC1mICRzcmNkaXIvY29uZmlnL2hwcGEuc2VkIDwgJHNvdXJjZSA+IGFzbS5zIgotCWNhdGNoICJleGVjIHNlZCAtZiAkc3JjZGlyL2NvbmZpZy9ocHBhLnNlZCA8ICRzb3VyY2UgPiBhc20ucyI7Ci0Jc2V0IHNvdXJjZSBhc20ucwotICAgIH0KLQotICAgIHNldCBleGVjX291dHB1dCBbdGFyZ2V0X2Fzc2VtYmxlICRzb3VyY2UgJG9iamVjdCAiIl07Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCXBlcnJvciAiJHNvdXJjZTogYXNzZW1ibHkgZmFpbGVkIgotCXJldHVybiAwCi0gICAgfQotfQotCi1pZiAhW2luZm8gZXhpc3RzIHRhcmdldF9hc3NlbWJsZV0gewotIwotIyBTdG9sZW4gZnJvbSBkZWphZ251L2xpYi90YXJnZXQuZXhwLS1wbGVhc2UgcmVtb3ZlIGFmdGVyIDEvMS85OC4KLSMKLXVwbGV2ZWwgIzAgewotICAgIHByb2MgdGFyZ2V0X2Fzc2VtYmxlIHsgc291cmNlIGRlc3RmaWxlIGZsYWdzIH0gewotCXJldHVybiBbZGVmYXVsdF90YXJnZXRfYXNzZW1ibGUgJHNvdXJjZSAkZGVzdGZpbGUgJGZsYWdzXTsKLSAgICB9Ci0KLSAgICBwcm9jIGRlZmF1bHRfdGFyZ2V0X2Fzc2VtYmxlIHsgc291cmNlIGRlc3RmaWxlIGZsYWdzIH0gewotCWdsb2JhbCBBU19GT1JfVEFSR0VUOwotCWdsb2JhbCBBU0ZMQUdTX0ZPUl9UQVJHRVQ7Ci0KLQlpZiBbaW5mbyBleGlzdHMgQVNfRk9SX1RBUkdFVF0gewotCSAgICBzZXQgQVMgIiRBU19GT1JfVEFSR0VUIjsKLQl9IGVsc2UgewotCSAgICBpZiAhW2JvYXJkX2luZm8gdGFyZ2V0IGV4aXN0cyBhc3NlbWJsZXJdIHsKLQkJc2V0IEFTIFtmaW5kX2dhc107Ci0JICAgIH0gZWxzZSB7Ci0JCXNldCBBUyBbYm9hcmRfaW5mbyB0YXJnZXQgYXNzZW1ibGVyXTsKLQkgICAgfQotCX0KLQotCWlmIFtpbmZvIGV4aXN0cyBBU0ZMQUdTX0ZPUl9UQVJHRVRdIHsKLQkgICAgYXBwZW5kIGZsYWdzICIgJEFTRkxBR1NfRk9SX1RBUkdFVCI7Ci0JfQotCi0JaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JICAgIHNldCBzb3VyY2UgW3JlbW90ZV9kb3dubG9hZCBob3N0ICRzb3VyY2VdOwotCSAgICBzZXQgZGVzdCAiYS5vdXQiCi0JfSBlbHNlIHsKLQkgICAgc2V0IGRlc3QgJGRlc3RmaWxlCi0JfQotCXNldCBzdGF0dXMgW3JlbW90ZV9leGVjIGhvc3QgIiRBUyAkc291cmNlICRmbGFncyAtbyAkZGVzdCJdCi0JaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JICAgIHJlbW90ZV91cGxvYWQgaG9zdCAkZGVzdCAkZGVzdGZpbGUKLQl9Ci0KLQlzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzIFtsaW5kZXggJHN0YXR1cyAxXV07Ci0JaWYgeyBbbGluZGV4ICRzdGF0dXMgMF0gIT0gMCB9IHsKLQkgICAgdmVyYm9zZSAtbG9nICJhc3NlbWJsZXIgZXhpdGVkIHdpdGggc3RhdHVzIFtsaW5kZXggJHN0YXR1cyAwXSI7Ci0JfQotCWlmIHsgW2xpbmRleCAkc3RhdHVzIDFdICE9ICIiIH0gewotCSAgICB2ZXJib3NlIC1sb2cgImFzc2VtYmxlciBvdXRwdXQgaXM6XG5bbGluZGV4ICRzdGF0dXMgMV0iIDI7Ci0JfQotCXJldHVybiAke2NvbXBfb3V0cHV0fTsKLX0KLX0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3ZlcnNpb24uYyBiL2JpbnV0aWxzL3ZlcnNpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1NTkzOS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy92ZXJzaW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiB2ZXJzaW9uLmMgLS0gYmludXRpbHMgdmVyc2lvbiBpbmZvcm1hdGlvbgotICAgQ29weXJpZ2h0IDE5OTEsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLS8qIFRoaXMgaXMgdGhlIHZlcnNpb24gbnVtYmVycyBmb3IgdGhlIGJpbnV0aWxzLiAgVGhleSBhbGwgY2hhbmdlIGluCi0gICBsb2Nrc3RlcCAtLSBpdCdzIGVhc2llciB0aGF0IHdheS4gKi8KLQotY29uc3QgY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gVkVSU0lPTjsKLQotLyogUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIGFuZCBjb3B5cmlnaHQgaW5mb3JtYXRpb24sIGFuZCBleGl0LiAgVGhpcwotICAgaW1wbGVtZW50cyB0aGUgLS12ZXJzaW9uIG9wdGlvbiBmb3IgdGhlIHZhcmlvdXMgcHJvZ3JhbXMuICAqLwotCi12b2lkCi1wcmludF92ZXJzaW9uIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICAvKiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuICAqLwotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBwcmludGYgKCJHTlUgJXMgJXNcbiIsIG5hbWUsIHByb2dyYW1fdmVyc2lvbik7Ci0gIHByaW50ZiAoXygiQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iKSk7Ci0gIHByaW50ZiAoXygiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuXAotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIikpOwotICBleGl0ICgwKTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3dpbmRyZXMuYyBiL2JpbnV0aWxzL3dpbmRyZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjZDkwOS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy93aW5kcmVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OTIgKzAsMCBAQAotLyogd2luZHJlcy5jIC0tIGEgcHJvZ3JhbSB0byBtYW5pcHVsYXRlIFdpbmRvd3MgcmVzb3VyY2VzCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgcHJvZ3JhbSBjYW4gcmVhZCBhbmQgd3JpdGUgV2luZG93cyByZXNvdXJjZXMgaW4gdmFyaW91cwotICAgZm9ybWF0cy4gIEluIHBhcnRpY3VsYXIsIGl0IGNhbiBhY3QgbGlrZSB0aGUgcmMgcmVzb3VyY2UgY29tcGlsZXIKLSAgIHByb2dyYW0sIGFuZCBpdCBjYW4gYWN0IGxpa2UgdGhlIGN2dHJlcyByZXMgdG8gQ09GRiBjb252ZXJzaW9uCi0gICBwcm9ncmFtLgotCi0gICBJdCBpcyBiYXNlZCBvbiBpbmZvcm1hdGlvbiB0YWtlbiBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlczoKLQotICAgKiBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbi4KLQotICAgKiBUaGUgcmNsIHByb2dyYW0sIHdyaXR0ZW4gYnkgR3VudGhlciBFYmVydAotICAgICA8Z3VudGhlci5lYmVydEBpeG9zLWxlaXB6aWcuZGU+LgotCi0gICAqIFRoZSByZXMyY29mZiBwcm9ncmFtLCB3cml0dGVuIGJ5IFBlZHJvIEEuIEFyYW5kYSA8cGFhZ0B0aWQuZXM+LgotCi0gICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgIndpbmRyZXMuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0vKiB1c2VkIGJ5IHJlc3JjLmMgYXQgbGVhc3QgKi8KLQotaW50IHZlcmJvc2UgPSAwOwotCi0vKiBBbiBlbnVtZXJhdGlvbiBvZiBmb3JtYXQgdHlwZXMuICAqLwotCi1lbnVtIHJlc19mb3JtYXQKLXsKLSAgLyogVW5rbm93biBmb3JtYXQuICAqLwotICBSRVNfRk9STUFUX1VOS05PV04sCi0gIC8qIFRleHR1YWwgUkMgZmlsZS4gICovCi0gIFJFU19GT1JNQVRfUkMsCi0gIC8qIEJpbmFyeSBSRVMgZmlsZS4gICovCi0gIFJFU19GT1JNQVRfUkVTLAotICAvKiBDT0ZGIGZpbGUuICAqLwotICBSRVNfRk9STUFUX0NPRkYKLX07Ci0KLS8qIEEgc3RydWN0dXJlIHVzZWQgdG8gbWFwIGJldHdlZW4gZm9ybWF0IHR5cGVzIGFuZCBzdHJpbmdzLiAgKi8KLQotc3RydWN0IGZvcm1hdF9tYXAKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgZW51bSByZXNfZm9ybWF0IGZvcm1hdDsKLX07Ci0KLS8qIEEgbWFwcGluZyBiZXR3ZWVuIG5hbWVzIGFuZCBmb3JtYXQgdHlwZXMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZvcm1hdF9tYXAgZm9ybWF0X25hbWVzW10gPQotewotICB7ICJyYyIsIFJFU19GT1JNQVRfUkMgfSwKLSAgeyAicmVzIiwgUkVTX0ZPUk1BVF9SRVMgfSwKLSAgeyAiY29mZiIsIFJFU19GT1JNQVRfQ09GRiB9LAotICB7IE5VTEwsIFJFU19GT1JNQVRfVU5LTk9XTiB9Ci19OwotCi0vKiBBIG1hcHBpbmcgZnJvbSBmaWxlIGV4dGVuc2lvbnMgdG8gZm9ybWF0IHR5cGVzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmb3JtYXRfbWFwIGZvcm1hdF9maWxlZXh0c1tdID0KLXsKLSAgeyAicmMiLCBSRVNfRk9STUFUX1JDIH0sCi0gIHsgInJlcyIsIFJFU19GT1JNQVRfUkVTIH0sCi0gIHsgImV4ZSIsIFJFU19GT1JNQVRfQ09GRiB9LAotICB7ICJvYmoiLCBSRVNfRk9STUFUX0NPRkYgfSwKLSAgeyAibyIsIFJFU19GT1JNQVRfQ09GRiB9LAotICB7IE5VTEwsIFJFU19GT1JNQVRfVU5LTk9XTiB9Ci19OwotCi0vKiBBIGxpc3Qgb2YgaW5jbHVkZSBkaXJlY3Rvcmllcy4gICovCi0KLXN0cnVjdCBpbmNsdWRlX2RpcgotewotICBzdHJ1Y3QgaW5jbHVkZV9kaXIgKm5leHQ7Ci0gIGNoYXIgKmRpcjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5jbHVkZV9kaXIgKmluY2x1ZGVfZGlyczsKLQotLyogTG9uZyBvcHRpb25zLiAgKi8KLQotLyogMTUwIGlzbid0IHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotCi0jZGVmaW5lIE9QVElPTl9ERUZJTkUgMTUwCi0jZGVmaW5lIE9QVElPTl9IRUxQIChPUFRJT05fREVGSU5FICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lOQ0xVREVfRElSIChPUFRJT05fSEVMUCArIDEpCi0jZGVmaW5lIE9QVElPTl9MQU5HVUFHRSAoT1BUSU9OX0lOQ0xVREVfRElSICsgMSkKLSNkZWZpbmUgT1BUSU9OX1BSRVBST0NFU1NPUiAoT1BUSU9OX0xBTkdVQUdFICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT04gKE9QVElPTl9QUkVQUk9DRVNTT1IgKyAxKQotI2RlZmluZSBPUFRJT05fWVlERUJVRyAoT1BUSU9OX1ZFUlNJT04gKyAxKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiZGVmaW5lIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9ERUZJTkV9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0hFTFB9LAotICB7ImluY2x1ZGUtZGlyIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9JTkNMVURFX0RJUn0sCi0gIHsiaW5wdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCi0gIHsibGFuZ3VhZ2UiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0xBTkdVQUdFfSwKLSAgeyJvdXRwdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCi0gIHsicHJlcHJvY2Vzc29yIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9QUkVQUk9DRVNTT1J9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LAotICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9WRVJTSU9OfSwKLSAgeyJ5eWRlYnVnIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9ZWURFQlVHfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotLyogU3RhdGljIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIHJlc19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZXh0ZW5kZWRfbWVudWl0ZW1zIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqKSk7Ci1zdGF0aWMgZW51bSByZXNfZm9ybWF0IGZvcm1hdF9mcm9tX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgZW51bSByZXNfZm9ybWF0IGZvcm1hdF9mcm9tX2ZpbGVuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIGludCBjbXBfcmVzX2VudHJ5IFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKnNvcnRfcmVzb3VyY2VzIFBBUkFNUyAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICopKTsKLQwKLS8qIFdoZW4gd2UgYXJlIGJ1aWxkaW5nIGEgcmVzb3VyY2UgdHJlZSwgd2UgYWxsb2NhdGUgZXZlcnl0aGluZyBvbnRvCi0gICBhbiBvYnN0YWNrLCBzbyB0aGF0IHdlIGNhbiBmcmVlIGl0IGFsbCBhdCBvbmNlIGlmIHdlIHdhbnQuICAqLwotCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfYWxsb2MgeG1hbGxvYwotI2RlZmluZSBvYnN0YWNrX2NodW5rX2ZyZWUgZnJlZQotCi0vKiBUaGUgcmVzb3VyY2UgYnVpbGRpbmcgb2JzdGFjay4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb2JzdGFjayByZXNfb2JzdGFjazsKLQotLyogSW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2UgYnVpbGRpbmcgb2JzdGFjay4gICovCi0KLXN0YXRpYyB2b2lkCi1yZXNfaW5pdCAoKQotewotICBvYnN0YWNrX2luaXQgKCZyZXNfb2JzdGFjayk7Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIG9uIHRoZSByZXNvdXJjZSBidWlsZGluZyBvYnN0YWNrLiAgKi8KLQotUFRSCi1yZXNfYWxsb2MgKGJ5dGVzKQotICAgICBzaXplX3QgYnl0ZXM7Ci17Ci0gIHJldHVybiAoUFRSKSBvYnN0YWNrX2FsbG9jICgmcmVzX29ic3RhY2ssIGJ5dGVzKTsKLX0KLQotLyogV2UgYWxzbyB1c2UgYW4gb2JzdGFjayB0byBzYXZlIG1lbW9yeSB1c2VkIHdoaWxlIHdyaXRpbmcgb3V0IGEgc2V0Ci0gICBvZiByZXNvdXJjZXMuICAqLwotCi1zdGF0aWMgc3RydWN0IG9ic3RhY2sgcmVzd3Jfb2JzdGFjazsKLQotLyogSW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2Ugd3JpdGluZyBvYnN0YWNrLiAgKi8KLQotc3RhdGljIHZvaWQKLXJlc3dyX2luaXQgKCkKLXsKLSAgb2JzdGFja19pbml0ICgmcmVzd3Jfb2JzdGFjayk7Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIG9uIHRoZSByZXNvdXJjZSB3cml0aW5nIG9ic3RhY2suICAqLwotCi1QVFIKLXJlc3dyX2FsbG9jIChieXRlcykKLSAgICAgc2l6ZV90IGJ5dGVzOwotewotICByZXR1cm4gKFBUUikgb2JzdGFja19hbGxvYyAoJnJlc3dyX29ic3RhY2ssIGJ5dGVzKTsKLX0KLQwKLS8qIE9wZW4gYSBmaWxlIHVzaW5nIHRoZSBpbmNsdWRlIGRpcmVjdG9yeSBzZWFyY2ggbGlzdC4gICovCi0KLUZJTEUgKgotb3Blbl9maWxlX3NlYXJjaCAoZmlsZW5hbWUsIG1vZGUsIGVycm1zZywgcmVhbF9maWxlbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1vZGU7Ci0gICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgICAgY2hhciAqKnJlYWxfZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmU7Ci0gIHN0cnVjdCBpbmNsdWRlX2RpciAqZDsKLQotICBlID0gZm9wZW4gKGZpbGVuYW1lLCBtb2RlKTsKLSAgaWYgKGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqcmVhbF9maWxlbmFtZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKLSAgICAgIHJldHVybiBlOwotICAgIH0KLQotICBpZiAoZXJybm8gPT0gRU5PRU5UKQotICAgIHsKLSAgICAgIGZvciAoZCA9IGluY2x1ZGVfZGlyczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLQl7Ci0JICBjaGFyICpuOwotCi0JICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChkLT5kaXIpICsgc3RybGVuIChmaWxlbmFtZSkgKyAyKTsKLQkgIHNwcmludGYgKG4sICIlcy8lcyIsIGQtPmRpciwgZmlsZW5hbWUpOwotCSAgZSA9IGZvcGVuIChuLCBtb2RlKTsKLQkgIGlmIChlICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAqcmVhbF9maWxlbmFtZSA9IG47Ci0JICAgICAgcmV0dXJuIGU7Ci0JICAgIH0KLQotCSAgaWYgKGVycm5vICE9IEVOT0VOVCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmYXRhbCAoXygiY2FuJ3Qgb3BlbiAlcyBgJXMnOiAlcyIpLCBlcnJtc2csIGZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLQotICAvKiBSZXR1cm4gYSB2YWx1ZSB0byBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcuICAqLwotICByZXR1cm4gTlVMTDsKLX0KLQwKLS8qIENvbXBhcmUgdHdvIHJlc291cmNlIElEJ3MuICBXZSBjb25zaWRlciBuYW1lIGVudHJpZXMgdG8gY29tZSBiZWZvcmUKLSAgIG51bWVyaWMgZW50cmllcywgYmVjYXVzZSB0aGF0IGlzIGhvdyB0aGV5IGFwcGVhciBpbiB0aGUgQ09GRiAucnNyYwotICAgc2VjdGlvbi4gICovCi0KLWludAotcmVzX2lkX2NtcCAoYSwgYikKLSAgICAgc3RydWN0IHJlc19pZCBhOwotICAgICBzdHJ1Y3QgcmVzX2lkIGI7Ci17Ci0gIGlmICghIGEubmFtZWQpCi0gICAgewotICAgICAgaWYgKGIubmFtZWQpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoYS51LmlkID4gYi51LmlkKQotCXJldHVybiAxOwotICAgICAgZWxzZSBpZiAoYS51LmlkIDwgYi51LmlkKQotCXJldHVybiAtMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bmljaGFyICphcywgKmFzZSwgKmJzLCAqYnNlOwotCi0gICAgICBpZiAoISBiLm5hbWVkKQotCXJldHVybiAtMTsKLQotICAgICAgYXMgPSBhLnUubi5uYW1lOwotICAgICAgYXNlID0gYXMgKyBhLnUubi5sZW5ndGg7Ci0gICAgICBicyA9IGIudS5uLm5hbWU7Ci0gICAgICBic2UgPSBicyArIGIudS5uLmxlbmd0aDsKLQotICAgICAgd2hpbGUgKGFzIDwgYXNlKQotCXsKLQkgIGludCBpOwotCi0JICBpZiAoYnMgPj0gYnNlKQotCSAgICByZXR1cm4gMTsKLQkgIGkgPSAoaW50KSAqYXMgLSAoaW50KSAqYnM7Ci0JICBpZiAoaSAhPSAwKQotCSAgICByZXR1cm4gaTsKLQkgICsrYXM7Ci0JICArK2JzOwotCX0KLQotICAgICAgaWYgKGJzIDwgYnNlKQotCXJldHVybiAtMTsKLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKiBQcmludCBhIHJlc291cmNlIElELiAgKi8KLQotdm9pZAotcmVzX2lkX3ByaW50IChzdHJlYW0sIGlkLCBxdW90ZSkKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBpbnQgcXVvdGU7Ci17Ci0gIGlmICghIGlkLm5hbWVkKQotICAgIGZwcmludGYgKHN0cmVhbSwgIiVsdSIsIGlkLnUuaWQpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKHF1b3RlKQotCXB1dGMgKCciJywgc3RyZWFtKTsKLSAgICAgIHVuaWNvZGVfcHJpbnQgKHN0cmVhbSwgaWQudS5uLm5hbWUsIGlkLnUubi5sZW5ndGgpOwotICAgICAgaWYgKHF1b3RlKQotCXB1dGMgKCciJywgc3RyZWFtKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGEgbGlzdCBvZiByZXNvdXJjZSBJRCdzLiAgKi8KLQotdm9pZAotcmVzX2lkc19wcmludCAoc3RyZWFtLCBjaWRzLCBpZHMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IGNpZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKmlkczsKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNpZHM7IGkrKykKLSAgICB7Ci0gICAgICByZXNfaWRfcHJpbnQgKHN0cmVhbSwgaWRzW2ldLCAxKTsKLSAgICAgIGlmIChpICsgMSA8IGNpZHMpCi0JZnByaW50ZiAoc3RyZWFtLCAiOiAiKTsKLSAgICB9Ci19Ci0KLS8qIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgcmVzb3VyY2UgSUQuICAqLwotCi12b2lkCi1yZXNfc3RyaW5nX3RvX2lkIChyZXNfaWQsIHN0cmluZykKLSAgICAgc3RydWN0IHJlc19pZCAqcmVzX2lkOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHJlc19pZC0+bmFtZWQgPSAxOwotICB1bmljb2RlX2Zyb21fYXNjaWkgKCZyZXNfaWQtPnUubi5sZW5ndGgsICZyZXNfaWQtPnUubi5uYW1lLCBzdHJpbmcpOwotfQotCi0vKiBEZWZpbmUgYSByZXNvdXJjZS4gIFRoZSBhcmd1bWVudHMgYXJlIHRoZSByZXNvdXJjZSB0cmVlLCBSRVNPVVJDRVMsCi0gICBhbmQgdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRvIHB1dCBpdCBpbiB0aGUgdHJlZSwgQ0lEUyBhbmQgSURTLgotICAgVGhpcyByZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkIHJlc19yZXNvdXJjZSBzdHJ1Y3R1cmUsIHdoaWNoIHRoZQotICAgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGluaXRpYWxpemUuICBJZiBEVVBPSyBpcyBub24temVybywgdGhlbiBpZiBhCi0gICByZXNvdXJjZSB3aXRoIHRoaXMgSUQgZXhpc3RzLCBpdCBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgYSB3YXJuaW5nCi0gICBpcyBpc3N1ZWQsIGFuZCBhIG5ldyByZXNvdXJjZSBpcyBjcmVhdGVkIHJlcGxhY2luZyB0aGUgZXhpc3RpbmcKLSAgIG9uZS4gICovCi0KLXN0cnVjdCByZXNfcmVzb3VyY2UgKgotZGVmaW5lX3Jlc291cmNlIChyZXNvdXJjZXMsIGNpZHMsIGlkcywgZHVwb2spCi0gICAgIHN0cnVjdCByZXNfZGlyZWN0b3J5ICoqcmVzb3VyY2VzOwotICAgICBpbnQgY2lkczsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWRzOwotICAgICBpbnQgZHVwb2s7Ci17Ci0gIHN0cnVjdCByZXNfZW50cnkgKnJlID0gTlVMTDsKLSAgaW50IGk7Ci0KLSAgYXNzZXJ0IChjaWRzID4gMCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjaWRzOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IHJlc19lbnRyeSAqKnBwOwotCi0gICAgICBpZiAoKnJlc291cmNlcyA9PSBOVUxMKQotCXsKLQkgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWV2YWw7Ci0KLQkgIC8qIFVzZSB0aGUgc2FtZSB0aW1lc3RhbXAgZm9yIGV2ZXJ5IHJlc291cmNlIGNyZWF0ZWQgaW4gYQotICAgICAgICAgICAgIHNpbmdsZSBydW4uICAqLwotCSAgaWYgKHRpbWV2YWwgPT0gMCkKLQkgICAgdGltZXZhbCA9IHRpbWUgKE5VTEwpOwotCi0JICAqcmVzb3VyY2VzID0gKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKQotCQkJcmVzX2FsbG9jIChzaXplb2YgKipyZXNvdXJjZXMpKTsKLQkgICgqcmVzb3VyY2VzKS0+Y2hhcmFjdGVyaXN0aWNzID0gMDsKLQkgICgqcmVzb3VyY2VzKS0+dGltZSA9IHRpbWV2YWw7Ci0JICAoKnJlc291cmNlcyktPm1ham9yID0gMDsKLQkgICgqcmVzb3VyY2VzKS0+bWlub3IgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT5lbnRyaWVzID0gTlVMTDsKLQl9Ci0KLSAgICAgIGZvciAocHAgPSAmKCpyZXNvdXJjZXMpLT5lbnRyaWVzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JaWYgKHJlc19pZF9jbXAgKCgqcHApLT5pZCwgaWRzW2ldKSA9PSAwKQotCSAgYnJlYWs7Ci0KLSAgICAgIGlmICgqcHAgIT0gTlVMTCkKLQlyZSA9ICpwcDsKLSAgICAgIGVsc2UKLQl7Ci0JICByZSA9IChzdHJ1Y3QgcmVzX2VudHJ5ICopIHJlc19hbGxvYyAoc2l6ZW9mICpyZSk7Ci0JICByZS0+bmV4dCA9IE5VTEw7Ci0JICByZS0+aWQgPSBpZHNbaV07Ci0JICBpZiAoKGkgKyAxKSA8IGNpZHMpCi0JICAgIHsKLQkgICAgICByZS0+c3ViZGlyID0gMTsKLQkgICAgICByZS0+dS5kaXIgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZS0+c3ViZGlyID0gMDsKLQkgICAgICByZS0+dS5yZXMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpwcCA9IHJlOwotCX0KLQotICAgICAgaWYgKChpICsgMSkgPCBjaWRzKQotCXsKLQkgIGlmICghIHJlLT5zdWJkaXIpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLQkgICAgICByZXNfaWRzX3ByaW50IChzdGRlcnIsIGksIGlkcyk7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCI6IGV4cGVjdGVkIHRvIGJlIGEgZGlyZWN0b3J5XG4iKSk7Ci0JICAgICAgeGV4aXQgKDEpOwotCSAgICB9Ci0KLQkgIHJlc291cmNlcyA9ICZyZS0+dS5kaXI7Ci0JfQotICAgIH0KLQotICBpZiAocmUtPnN1YmRpcikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRzKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiOiBleHBlY3RlZCB0byBiZSBhIGxlYWZcbiIpKTsKLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKHJlLT51LnJlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChkdXBvaykKLQlyZXR1cm4gcmUtPnUucmVzOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRzKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiOiBkdXBsaWNhdGUgdmFsdWVcbiIpKTsKLSAgICB9Ci0KLSAgcmUtPnUucmVzID0gKChzdHJ1Y3QgcmVzX3Jlc291cmNlICopCi0JICAgICAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc291cmNlKSkpOwotCi0gIHJlLT51LnJlcy0+dHlwZSA9IFJFU19UWVBFX1VOSU5JVElBTElaRUQ7Ci0gIG1lbXNldCAoJnJlLT51LnJlcy0+cmVzX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IHJlc19yZXNfaW5mbykpOwotICBtZW1zZXQgKCZyZS0+dS5yZXMtPmNvZmZfaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX2NvZmZfaW5mbykpOwotCi0gIHJldHVybiByZS0+dS5yZXM7Ci19Ci0KLS8qIERlZmluZSBhIHN0YW5kYXJkIHJlc291cmNlLiAgVGhpcyBpcyBhIHZlcnNpb24gb2YgZGVmaW5lX3Jlc291cmNlCi0gICB0aGF0IGp1c3QgdGFrZXMgdHlwZSwgbmFtZSwgYW5kIGxhbmd1YWdlIGFyZ3VtZW50cy4gICovCi0KLXN0cnVjdCByZXNfcmVzb3VyY2UgKgotZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlIChyZXNvdXJjZXMsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBkdXBvaykKLSAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKipyZXNvdXJjZXM7Ci0gICAgIGludCB0eXBlOwotICAgICBzdHJ1Y3QgcmVzX2lkIG5hbWU7Ci0gICAgIGludCBsYW5ndWFnZTsKLSAgICAgaW50IGR1cG9rOwotewotICBzdHJ1Y3QgcmVzX2lkIGFbM107Ci0KLSAgYVswXS5uYW1lZCA9IDA7Ci0gIGFbMF0udS5pZCA9IHR5cGU7Ci0gIGFbMV0gPSBuYW1lOwotICBhWzJdLm5hbWVkID0gMDsKLSAgYVsyXS51LmlkID0gbGFuZ3VhZ2U7Ci0gIHJldHVybiBkZWZpbmVfcmVzb3VyY2UgKHJlc291cmNlcywgMywgYSwgZHVwb2spOwotfQotCi0vKiBDb21wYXJpc29uIHJvdXRpbmUgZm9yIHJlc291cmNlIHNvcnRpbmcuICAqLwotCi1zdGF0aWMgaW50Ci1jbXBfcmVzX2VudHJ5IChwMSwgcDIpCi0gICAgIGNvbnN0IFBUUiBwMTsKLSAgICAgY29uc3QgUFRSIHAyOwotewotICBjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICoqcmUxLCAqKnJlMjsKLQotICByZTEgPSAoY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqKikgcDE7Ci0gIHJlMiA9IChjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICoqKSBwMjsKLSAgcmV0dXJuIHJlc19pZF9jbXAgKCgqcmUxKS0+aWQsICgqcmUyKS0+aWQpOwotfQotCi0vKiBTb3J0IHRoZSByZXNvdXJjZXMuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKgotc29ydF9yZXNvdXJjZXMgKHJlc2RpcikKLSAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc2RpcjsKLXsKLSAgaW50IGMsIGk7Ci0gIHN0cnVjdCByZXNfZW50cnkgKnJlOwotICBzdHJ1Y3QgcmVzX2VudHJ5ICoqYTsKLQotICBpZiAocmVzZGlyLT5lbnRyaWVzID09IE5VTEwpCi0gICAgcmV0dXJuIHJlc2RpcjsKLQotICBjID0gMDsKLSAgZm9yIChyZSA9IHJlc2Rpci0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKLSAgICArK2M7Ci0KLSAgLyogVGhpcyBpcyBhIHJlY3Vyc2l2ZSByb3V0aW5lLCBzbyB1c2luZyB4bWFsbG9jIGlzIHByb2JhYmx5IGJldHRlcgotICAgICB0aGFuIGFsbG9jYS4gICovCi0gIGEgPSAoc3RydWN0IHJlc19lbnRyeSAqKikgeG1hbGxvYyAoYyAqIHNpemVvZiAoc3RydWN0IHJlc19lbnRyeSAqKSk7Ci0KLSAgZm9yIChpID0gMCwgcmUgPSByZXNkaXItPmVudHJpZXM7IHJlICE9IE5VTEw7IHJlID0gcmUtPm5leHQsIGkrKykKLSAgICBhW2ldID0gcmU7Ci0KLSAgcXNvcnQgKGEsIGMsIHNpemVvZiAoc3RydWN0IHJlc19lbnRyeSAqKSwgY21wX3Jlc19lbnRyeSk7Ci0KLSAgcmVzZGlyLT5lbnRyaWVzID0gYVswXTsKLSAgZm9yIChpID0gMDsgaSA8IGMgLSAxOyBpKyspCi0gICAgYVtpXS0+bmV4dCA9IGFbaSArIDFdOwotICBhW2ldLT5uZXh0ID0gTlVMTDsKLQotICBmcmVlIChhKTsKLQotICAvKiBOb3cgc29ydCB0aGUgc3ViZGlyZWN0b3JpZXMuICAqLwotCi0gIGZvciAocmUgPSByZXNkaXItPmVudHJpZXM7IHJlICE9IE5VTEw7IHJlID0gcmUtPm5leHQpCi0gICAgaWYgKHJlLT5zdWJkaXIpCi0gICAgICByZS0+dS5kaXIgPSBzb3J0X3Jlc291cmNlcyAocmUtPnUuZGlyKTsKLQotICByZXR1cm4gcmVzZGlyOwotfQotDAotLyogUmV0dXJuIHdoZXRoZXIgdGhlIGRpYWxvZyByZXNvdXJjZSBESUFMT0cgaXMgYSBESUFMT0cgb3IgYQotICAgRElBTE9HRVguICAqLwotCi1pbnQKLWV4dGVuZGVkX2RpYWxvZyAoZGlhbG9nKQotICAgICBjb25zdCBzdHJ1Y3QgZGlhbG9nICpkaWFsb2c7Ci17Ci0gIGNvbnN0IHN0cnVjdCBkaWFsb2dfY29udHJvbCAqYzsKLQotICBpZiAoZGlhbG9nLT5leCAhPSBOVUxMKQotICAgIHJldHVybiAxOwotCi0gIGZvciAoYyA9IGRpYWxvZy0+Y29udHJvbHM7IGMgIT0gTlVMTDsgYyA9IGMtPm5leHQpCi0gICAgaWYgKGMtPmRhdGEgIT0gTlVMTCB8fCBjLT5oZWxwICE9IDApCi0gICAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgTUVOVUlURU1TIGFyZSBhIE1FTlUgb3IgYSBNRU5VRVguICAqLwotCi1pbnQKLWV4dGVuZGVkX21lbnUgKG1lbnUpCi0gICAgIGNvbnN0IHN0cnVjdCBtZW51ICptZW51OwotewotICByZXR1cm4gZXh0ZW5kZWRfbWVudWl0ZW1zIChtZW51LT5pdGVtcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dGVuZGVkX21lbnVpdGVtcyAobWVudWl0ZW1zKQotICAgICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1lbnVpdGVtczsKLXsKLSAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICptaTsKLQotICBmb3IgKG1pID0gbWVudWl0ZW1zOyBtaSAhPSBOVUxMOyBtaSA9IG1pLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChtaS0+aGVscCAhPSAwIHx8IG1pLT5zdGF0ZSAhPSAwKQotCXJldHVybiAxOwotICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMICYmIG1pLT5pZCAhPSAwKQotCXJldHVybiAxOwotICAgICAgaWYgKChtaS0+dHlwZQotCSAgICYgfiAoTUVOVUlURU1fQ0hFQ0tFRAotCQl8IE1FTlVJVEVNX0dSQVlFRAotCQl8IE1FTlVJVEVNX0hFTFAKLQkJfCBNRU5VSVRFTV9JTkFDVElWRQotCQl8IE1FTlVJVEVNX01FTlVCQVJCUkVBSwotCQl8IE1FTlVJVEVNX01FTlVCUkVBSykpCi0JICAhPSAwKQotCXJldHVybiAxOwotICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMKQotCXsKLQkgIGlmIChleHRlbmRlZF9tZW51aXRlbXMgKG1pLT5wb3B1cCkpCi0JICAgIHJldHVybiAxOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgZm9ybWF0IHR5cGUsIG9yIGV4aXQgaWYgaXQgY2FuJ3QgYmUgZG9uZS4gICovCi0KLXN0YXRpYyBlbnVtIHJlc19mb3JtYXQKLWZvcm1hdF9mcm9tX25hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IHN0cnVjdCBmb3JtYXRfbWFwICptOwotCi0gIGZvciAobSA9IGZvcm1hdF9uYW1lczsgbS0+bmFtZSAhPSBOVUxMOyBtKyspCi0gICAgaWYgKHN0cmNhc2VjbXAgKG0tPm5hbWUsIG5hbWUpID09IDApCi0gICAgICBicmVhazsKLQotICBpZiAobS0+bmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVua25vd24gZm9ybWF0IHR5cGUgYCVzJ1xuIiksIHByb2dyYW1fbmFtZSwgbmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBzdXBwb3J0ZWQgZm9ybWF0czoiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGZvciAobSA9IGZvcm1hdF9uYW1lczsgbS0+bmFtZSAhPSBOVUxMOyBtKyspCi0JZnByaW50ZiAoc3RkZXJyLCAiICVzIiwgbS0+bmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICByZXR1cm4gbS0+Zm9ybWF0OwotfQotCi0vKiBXb3JrIG91dCBhIGZvcm1hdCB0eXBlIGdpdmVuIGEgZmlsZSBuYW1lLiAgSWYgSU5QVVQgaXMgbm9uLXplcm8sCi0gICBpdCdzIE9LIHRvIGxvb2sgYXQgdGhlIGZpbGUgaXRzZWxmLiAgKi8KLQotc3RhdGljIGVudW0gcmVzX2Zvcm1hdAotZm9ybWF0X2Zyb21fZmlsZW5hbWUgKGZpbGVuYW1lLCBpbnB1dCkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGludCBpbnB1dDsKLXsKLSAgY29uc3QgY2hhciAqZXh0OwotICBGSUxFICplOwotICB1bnNpZ25lZCBjaGFyIGIxLCBiMiwgYjMsIGI0LCBiNTsKLSAgaW50IG1hZ2ljOwotCi0gIC8qIElmIHdlIGhhdmUgYW4gZXh0ZW5zaW9uLCBzZWUgaWYgd2UgcmVjb2duaXplIGl0IGFzIGltcGx5aW5nIGEKLSAgICAgcGFydGljdWxhciBmb3JtYXQuICAqLwotICBleHQgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy4nKTsKLSAgaWYgKGV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBmb3JtYXRfbWFwICptOwotCi0gICAgICArK2V4dDsKLSAgICAgIGZvciAobSA9IGZvcm1hdF9maWxlZXh0czsgbS0+bmFtZSAhPSBOVUxMOyBtKyspCi0JaWYgKHN0cmNhc2VjbXAgKG0tPm5hbWUsIGV4dCkgPT0gMCkKLQkgIHJldHVybiBtLT5mb3JtYXQ7Ci0gICAgfQotCi0gIC8qIElmIHdlIGRvbid0IHJlY29nbml6ZSB0aGUgbmFtZSBvZiBhbiBvdXRwdXQgZmlsZSwgYXNzdW1lIGl0J3MgYQotICAgICBDT0ZGIGZpbGUuICAqLwotCi0gIGlmICghIGlucHV0KQotICAgIHJldHVybiBSRVNfRk9STUFUX0NPRkY7Ci0KLSAgLyogUmVhZCB0aGUgZmlyc3QgZmV3IGJ5dGVzIG9mIHRoZSBmaWxlIHRvIHNlZSBpZiB3ZSBjYW4gZ3Vlc3Mgd2hhdAotICAgICBpdCBpcy4gICovCi0KLSAgZSA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUkIpOwotICBpZiAoZSA9PSBOVUxMKQotICAgIGZhdGFsICgiJXM6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCi0gIGIxID0gZ2V0YyAoZSk7Ci0gIGIyID0gZ2V0YyAoZSk7Ci0gIGIzID0gZ2V0YyAoZSk7Ci0gIGI0ID0gZ2V0YyAoZSk7Ci0gIGI1ID0gZ2V0YyAoZSk7Ci0KLSAgZmNsb3NlIChlKTsKLQotICAvKiBBIFBFIGV4ZWN1dGFibGUgc3RhcnRzIHdpdGggMHg0ZCAweDVhLiAgKi8KLSAgaWYgKGIxID09IDB4NGQgJiYgYjIgPT0gMHg1YSkKLSAgICByZXR1cm4gUkVTX0ZPUk1BVF9DT0ZGOwotCi0gIC8qIEEgQ09GRiAubyBmaWxlIHN0YXJ0cyB3aXRoIGEgQ09GRiBtYWdpYyBudW1iZXIuICAqLwotICBtYWdpYyA9IChiMiA8PCA4KSB8IGIxOwotICBzd2l0Y2ggKG1hZ2ljKQotICAgIHsKLSAgICBjYXNlIDB4MTRjOiAvKiBpMzg2ICovCi0gICAgY2FzZSAweDE2NjogLyogTUlQUyAqLwotICAgIGNhc2UgMHgxODQ6IC8qIEFscGhhICovCi0gICAgY2FzZSAweDI2ODogLyogNjhrICovCi0gICAgY2FzZSAweDFmMDogLyogUG93ZXJQQyAqLwotICAgIGNhc2UgMHgyOTA6IC8qIFBBICovCi0gICAgICByZXR1cm4gUkVTX0ZPUk1BVF9DT0ZGOwotICAgIH0KLQotICAvKiBBIFJFUyBmaWxlIHN0YXJ0cyB3aXRoIDB4MCAweDAgMHgwIDB4MCAweDIwIDB4MCAweDAgMHgwLiAgKi8KLSAgaWYgKGIxID09IDAgJiYgYjIgPT0gMCAmJiBiMyA9PSAwICYmIGI0ID09IDAgJiYgYjUgPT0gMHgyMCkKLSAgICByZXR1cm4gUkVTX0ZPUk1BVF9SRVM7Ci0KLSAgLyogSWYgZXZlcnkgY2hhcmFjdGVyIGlzIHByaW50YWJsZSBvciBzcGFjZSwgYXNzdW1lIGl0J3MgYW4gUkMgZmlsZS4gICovCi0gIGlmICgoaXNwcmludCAoYjEpIHx8IGlzc3BhY2UgKGIxKSkKLSAgICAgICYmIChpc3ByaW50IChiMikgfHwgaXNzcGFjZSAoYjIpKQotICAgICAgJiYgKGlzcHJpbnQgKGIzKSB8fCBpc3NwYWNlIChiMykpCi0gICAgICAmJiAoaXNwcmludCAoYjQpIHx8IGlzc3BhY2UgKGI0KSkKLSAgICAgICYmIChpc3ByaW50IChiNSkgfHwgaXNzcGFjZSAoYjUpKSkKLSAgICByZXR1cm4gUkVTX0ZPUk1BVF9SQzsKLQotICAvKiBPdGhlcndpc2UsIHdlIGdpdmUgdXAuICAqLwotICBmYXRhbCAoXygiY2FuIG5vdCBkZXRlcm1pbmUgdHlwZSBvZiBmaWxlIGAlcyc7IHVzZSB0aGUgLUkgb3B0aW9uIiksCi0JIGZpbGVuYW1lKTsKLQotICAvKiBSZXR1cm4gc29tZXRoaW5nIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyIHdhcm5pbmcuICAqLwotICByZXR1cm4gUkVTX0ZPUk1BVF9VTktOT1dOOwotfQotCi0vKiBQcmludCBhIHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuICAqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiVXNhZ2U6ICVzIFtvcHRpb25zXSBbaW5wdXQtZmlsZV0gW291dHB1dC1maWxlXVxuIiksCi0JICAgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1PcHRpb25zOlxuXAotICAtaSBGSUxFLCAtLWlucHV0IEZJTEUgICAgICAgTmFtZSBpbnB1dCBmaWxlXG5cCi0gIC1vIEZJTEUsIC0tb3V0cHV0IEZJTEUgICAgICBOYW1lIG91dHB1dCBmaWxlXG5cCi0gIC1JIEZPUk1BVCwgLS1pbnB1dC1mb3JtYXQgRk9STUFUXG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IGlucHV0IGZvcm1hdFxuXAotICAtTyBGT1JNQVQsIC0tb3V0cHV0LWZvcm1hdCBGT1JNQVRcblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgb3V0cHV0IGZvcm1hdFxuXAotICAtRiBUQVJHRVQsIC0tdGFyZ2V0IFRBUkdFVCAgU3BlY2lmeSBDT0ZGIHRhcmdldFxuXAotICAtLXByZXByb2Nlc3NvciBQUk9HUkFNICAgICAgUHJvZ3JhbSB0byB1c2UgdG8gcHJlcHJvY2VzcyByYyBmaWxlXG5cCi0gIC0taW5jbHVkZS1kaXIgRElSICAgICAgICAgICBJbmNsdWRlIGRpcmVjdG9yeSB3aGVuIHByZXByb2Nlc3NpbmcgcmMgZmlsZVxuXAotICAtRFNZTVs9VkFMXSwgLS1kZWZpbmUgU1lNWz1WQUxdXG5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgU1lNIHdoZW4gcHJlcHJvY2Vzc2luZyByYyBmaWxlXG5cCi0gIC12ICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJib3NlIC0gdGVsbHMgeW91IHdoYXQgaXQncyBkb2luZ1xuXAotICAtLWxhbmd1YWdlIFZBTCAgICAgICAgICAgICAgU2V0IGxhbmd1YWdlIHdoZW4gcmVhZGluZyByYyBmaWxlXG4iKSk7Ci0jaWZkZWYgWVlERUJVRwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLS15eWRlYnVnICAgICAgICAgICAgICAgICAgIFR1cm4gb24gcGFyc2VyIGRlYnVnZ2luZ1xuIikpOwotI2VuZGlmCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2VcblwKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgICAgIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb25cbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1GT1JNQVQgaXMgb25lIG9mIHJjLCByZXMsIG9yIGNvZmYsIGFuZCBpcyBkZWR1Y2VkIGZyb20gdGhlIGZpbGUgbmFtZVxuXAotZXh0ZW5zaW9uIGlmIG5vdCBzcGVjaWZpZWQuICBBIHNpbmdsZSBmaWxlIG5hbWUgaXMgYW4gaW5wdXQgZmlsZS5cblwKLU5vIGlucHV0LWZpbGUgaXMgc3RkaW4sIGRlZmF1bHQgcmMuICBObyBvdXRwdXQtZmlsZSBpcyBzdGRvdXQsIGRlZmF1bHQgcmMuXG4iKSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLS8qIFF1b3RlIGNoYXJhY3RlcnMgdGhhdCB3aWxsIGNvbmZ1c2UgdGhlIHNoZWxsIHdoZW4gd2UgcnVuIHRoZSBwcmVwcm9jZXNzb3IgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpxdW90IChzdHJpbmcpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RhdGljIGNoYXIgKmJ1ZiA9IDA7Ci0gIHN0YXRpYyBpbnQgYnVmbGVuID0gMDsKLSAgaW50IHNsZW4gPSBzdHJsZW4gKHN0cmluZyk7Ci0gIGNvbnN0IGNoYXIgKnNyYzsKLSAgY2hhciAqZGVzdDsKLQotICBpZiAoKGJ1ZmxlbiA8IHNsZW4gKiAyICsgMikgfHwgIWJ1ZikKLSAgICB7Ci0gICAgICBidWZsZW4gPSBzbGVuICogMiArIDI7Ci0gICAgICBpZiAoYnVmKQotCWZyZWUgKGJ1Zik7Ci0gICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChidWZsZW4pOwotICAgIH0KLQotICBmb3IgKHNyYz1zdHJpbmcsIGRlc3Q9YnVmOyAqc3JjOyBzcmMrKywgZGVzdCsrKQotICAgIHsKLSAgICAgIGlmICgqc3JjID09ICcoJyB8fCAqc3JjID09ICcpJyB8fCAqc3JjID09ICcgJykKLQkqZGVzdCsrID0gJ1xcJzsKLSAgICAgICpkZXN0ID0gKnNyYzsKLSAgICB9Ci0gICpkZXN0ID0gMDsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotLyogVGhlIG1haW4gZnVuY3Rpb24uICAqLwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGM7Ci0gIGNoYXIgKmlucHV0X2ZpbGVuYW1lOwotICBjaGFyICpvdXRwdXRfZmlsZW5hbWU7Ci0gIGVudW0gcmVzX2Zvcm1hdCBpbnB1dF9mb3JtYXQ7Ci0gIGVudW0gcmVzX2Zvcm1hdCBvdXRwdXRfZm9ybWF0OwotICBjaGFyICp0YXJnZXQ7Ci0gIGNoYXIgKnByZXByb2Nlc3NvcjsKLSAgY2hhciAqcHJlcHJvY2FyZ3M7Ci0gIGNvbnN0IGNoYXIgKnF1b3RlZGFyZzsKLSAgaW50IGxhbmd1YWdlOwotICBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzb3VyY2VzOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIHJlc19pbml0ICgpOwotCi0gIGlucHV0X2ZpbGVuYW1lID0gTlVMTDsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLSAgaW5wdXRfZm9ybWF0ID0gUkVTX0ZPUk1BVF9VTktOT1dOOwotICBvdXRwdXRfZm9ybWF0ID0gUkVTX0ZPUk1BVF9VTktOT1dOOwotICB0YXJnZXQgPSBOVUxMOwotICBwcmVwcm9jZXNzb3IgPSBOVUxMOwotICBwcmVwcm9jYXJncyA9IE5VTEw7Ci0gIGxhbmd1YWdlID0gLTE7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJpOm86STpPOkY6RDp2IiwgbG9uZ19vcHRpb25zLAotCQkJICAgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnaSc6Ci0JICBpbnB1dF9maWxlbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnbyc6Ci0JICBvdXRwdXRfZmlsZW5hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQotCWNhc2UgJ0knOgotCSAgaW5wdXRfZm9ybWF0ID0gZm9ybWF0X2Zyb21fbmFtZSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnTyc6Ci0JICBvdXRwdXRfZm9ybWF0ID0gZm9ybWF0X2Zyb21fbmFtZSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnRic6Ci0JICB0YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1BSRVBST0NFU1NPUjoKLQkgIHByZXByb2Nlc3NvciA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnRCc6Ci0JY2FzZSBPUFRJT05fREVGSU5FOgotCSAgaWYgKHByZXByb2NhcmdzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBxdW90ZWRhcmcgPSBxdW90IChvcHRhcmcpOwotCSAgICAgIHByZXByb2NhcmdzID0geG1hbGxvYyAoc3RybGVuIChxdW90ZWRhcmcpICsgMyk7Ci0JICAgICAgc3ByaW50ZiAocHJlcHJvY2FyZ3MsICItRCVzIiwgcXVvdGVkYXJnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqbjsKLQotCSAgICAgIHF1b3RlZGFyZyA9IHF1b3QgKG9wdGFyZyk7Ci0JICAgICAgbiA9IHhtYWxsb2MgKHN0cmxlbiAocHJlcHJvY2FyZ3MpICsgc3RybGVuIChxdW90ZWRhcmcpICsgNCk7Ci0JICAgICAgc3ByaW50ZiAobiwgIiVzIC1EJXMiLCBwcmVwcm9jYXJncywgcXVvdGVkYXJnKTsKLQkgICAgICBmcmVlIChwcmVwcm9jYXJncyk7Ci0JICAgICAgcHJlcHJvY2FyZ3MgPSBuOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ3YnOgotCSAgdmVyYm9zZSArKzsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fSU5DTFVERV9ESVI6Ci0JICBpZiAocHJlcHJvY2FyZ3MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHF1b3RlZGFyZyA9IHF1b3QgKG9wdGFyZyk7Ci0JICAgICAgcHJlcHJvY2FyZ3MgPSB4bWFsbG9jIChzdHJsZW4gKHF1b3RlZGFyZykgKyAzKTsKLQkgICAgICBzcHJpbnRmIChwcmVwcm9jYXJncywgIi1JJXMiLCBxdW90ZWRhcmcpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICpuOwotCi0JICAgICAgcXVvdGVkYXJnID0gcXVvdCAob3B0YXJnKTsKLQkgICAgICBuID0geG1hbGxvYyAoc3RybGVuIChwcmVwcm9jYXJncykgKyBzdHJsZW4gKHF1b3RlZGFyZykgKyA0KTsKLQkgICAgICBzcHJpbnRmIChuLCAiJXMgLUklcyIsIHByZXByb2NhcmdzLCBxdW90ZWRhcmcpOwotCSAgICAgIGZyZWUgKHByZXByb2NhcmdzKTsKLQkgICAgICBwcmVwcm9jYXJncyA9IG47Ci0JICAgIH0KLQotCSAgewotCSAgICBzdHJ1Y3QgaW5jbHVkZV9kaXIgKm4sICoqcHA7Ci0KLQkgICAgbiA9IChzdHJ1Y3QgaW5jbHVkZV9kaXIgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLQkgICAgbi0+bmV4dCA9IE5VTEw7Ci0JICAgIG4tPmRpciA9IG9wdGFyZzsKLQotCSAgICBmb3IgKHBwID0gJmluY2x1ZGVfZGlyczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCSAgICAgIDsKLQkgICAgKnBwID0gbjsKLQkgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9MQU5HVUFHRToKLQkgIGxhbmd1YWdlID0gc3RydG9sIChvcHRhcmcsIChjaGFyICoqKSBOVUxMLCAxNik7Ci0JICBicmVhazsKLQotI2lmZGVmIFlZREVCVUcKLQljYXNlIE9QVElPTl9ZWURFQlVHOgotCSAgeXlkZWJ1ZyA9IDE7Ci0JICBicmVhazsKLSNlbmRpZgotCi0JY2FzZSBPUFRJT05fSEVMUDoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9WRVJTSU9OOgotCSAgcHJpbnRfdmVyc2lvbiAoIndpbmRyZXMiKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoaW5wdXRfZmlsZW5hbWUgPT0gTlVMTCAmJiBvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIGlucHV0X2ZpbGVuYW1lID0gYXJndltvcHRpbmRdOwotICAgICAgKytvcHRpbmQ7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfZmlsZW5hbWUgPT0gTlVMTCAmJiBvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIG91dHB1dF9maWxlbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKLSAgICAgICsrb3B0aW5kOwotICAgIH0KLQotICBpZiAoYXJnYyAhPSBvcHRpbmQpCi0gICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0KLSAgaWYgKGlucHV0X2Zvcm1hdCA9PSBSRVNfRk9STUFUX1VOS05PV04pCi0gICAgewotICAgICAgaWYgKGlucHV0X2ZpbGVuYW1lID09IE5VTEwpCi0JaW5wdXRfZm9ybWF0ID0gUkVTX0ZPUk1BVF9SQzsKLSAgICAgIGVsc2UKLQlpbnB1dF9mb3JtYXQgPSBmb3JtYXRfZnJvbV9maWxlbmFtZSAoaW5wdXRfZmlsZW5hbWUsIDEpOwotICAgIH0KLQotICBpZiAob3V0cHV0X2Zvcm1hdCA9PSBSRVNfRk9STUFUX1VOS05PV04pCi0gICAgewotICAgICAgaWYgKG91dHB1dF9maWxlbmFtZSA9PSBOVUxMKQotCW91dHB1dF9mb3JtYXQgPSBSRVNfRk9STUFUX1JDOwotICAgICAgZWxzZQotCW91dHB1dF9mb3JtYXQgPSBmb3JtYXRfZnJvbV9maWxlbmFtZSAob3V0cHV0X2ZpbGVuYW1lLCAwKTsKLSAgICB9Ci0KLSAgLyogUmVhZCB0aGUgaW5wdXQgZmlsZS4gICovCi0KLSAgc3dpdGNoIChpbnB1dF9mb3JtYXQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIFJFU19GT1JNQVRfUkM6Ci0gICAgICByZXNvdXJjZXMgPSByZWFkX3JjX2ZpbGUgKGlucHV0X2ZpbGVuYW1lLCBwcmVwcm9jZXNzb3IsIHByZXByb2NhcmdzLAotCQkJCWxhbmd1YWdlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9SRVM6Ci0gICAgICByZXNvdXJjZXMgPSByZWFkX3Jlc19maWxlIChpbnB1dF9maWxlbmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJFU19GT1JNQVRfQ09GRjoKLSAgICAgIHJlc291cmNlcyA9IHJlYWRfY29mZl9yc3JjIChpbnB1dF9maWxlbmFtZSwgdGFyZ2V0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAocmVzb3VyY2VzID09IE5VTEwpCi0gICAgZmF0YWwgKF8oIm5vIHJlc291cmNlcyIpKTsKLQotICAvKiBTb3J0IHRoZSByZXNvdXJjZXMuICBUaGlzIGlzIHJlcXVpcmVkIGZvciBDT0ZGLCBjb252ZW5pZW50IGZvcgotICAgICByYywgYW5kIHVuaW1wb3J0YW50IGZvciByZXMuICAqLwotCi0gIHJlc291cmNlcyA9IHNvcnRfcmVzb3VyY2VzIChyZXNvdXJjZXMpOwotCi0gIC8qIFdyaXRlIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLSAgcmVzd3JfaW5pdCAoKTsKLQotICBzd2l0Y2ggKG91dHB1dF9mb3JtYXQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIFJFU19GT1JNQVRfUkM6Ci0gICAgICB3cml0ZV9yY19maWxlIChvdXRwdXRfZmlsZW5hbWUsIHJlc291cmNlcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJFU19GT1JNQVRfUkVTOgotICAgICAgd3JpdGVfcmVzX2ZpbGUgKG91dHB1dF9maWxlbmFtZSwgcmVzb3VyY2VzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9DT0ZGOgotICAgICAgd3JpdGVfY29mZl9maWxlIChvdXRwdXRfZmlsZW5hbWUsIHRhcmdldCwgcmVzb3VyY2VzKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICB4ZXhpdCAoMCk7Ci0gIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9iaW51dGlscy93aW5kcmVzLmggYi9iaW51dGlscy93aW5kcmVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDNkZDUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvd2luZHJlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsODQ5ICswLDAgQEAKLS8qIHdpbmRyZXMuaCAtLSBoZWFkZXIgZmlsZSBmb3Igd2luZHJlcyBwcm9ncmFtLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotLyogVGhpcyBpcyB0aGUgaGVhZGVyIGZpbGUgZm9yIHRoZSB3aW5kcmVzIHByb2dyYW0uICBJdCBkZWZpbmVzCi0gICBzdHJ1Y3R1cmVzIGFuZCBkZWNsYXJlcyBmdW5jdGlvbnMgdXNlZCB3aXRoaW4gdGhlIHByb2dyYW0uICAqLwotCi0jaW5jbHVkZSAid2luZHVuaS5oIgotCi0vKiBXZSByZXByZXNlbnQgcmVzb3VyY2VzIGludGVybmFsbHkgYXMgYSB0cmVlLCBzaW1pbGFyIHRvIHRoZSB0cmVlCi0gICB1c2VkIGluIHRoZSAucnNyYyBzZWN0aW9uIG9mIGEgQ09GRiBmaWxlLiAgVGhlIHJvb3QgaXMgYQotICAgcmVzX2RpcmVjdG9yeSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgcmVzX2RpcmVjdG9yeQotewotICAvKiBSZXNvdXJjZSBmbGFncy4gIEFjY29yZGluZyB0byB0aGUgTVMgZG9jcywgdGhpcyBpcyBjdXJyZW50bHkKLSAgICAgYWx3YXlzIHplcm8uICAqLwotICB1bnNpZ25lZCBsb25nIGNoYXJhY3RlcmlzdGljczsKLSAgLyogVGltZS9kYXRlIHN0YW1wLiAgKi8KLSAgdW5zaWduZWQgbG9uZyB0aW1lOwotICAvKiBNYWpvciB2ZXJzaW9uIG51bWJlci4gICovCi0gIHVuc2lnbmVkIHNob3J0IG1ham9yOwotICAvKiBNaW5vciB2ZXJzaW9uIG51bWJlci4gICovCi0gIHVuc2lnbmVkIHNob3J0IG1pbm9yOwotICAvKiBEaXJlY3RvcnkgZW50cmllcy4gICovCi0gIHN0cnVjdCByZXNfZW50cnkgKmVudHJpZXM7Ci19OwotCi0vKiBBIHJlc291cmNlIElEIGlzIHN0b3JlZCBpbiBhIHJlc19pZCBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgcmVzX2lkCi17Ci0gIC8qIE5vbi16ZXJvIGlmIHRoaXMgZW50cnkgaGFzIGEgbmFtZSByYXRoZXIgdGhhbiBhbiBJRC4gICovCi0gIHVuc2lnbmVkIGludCBuYW1lZCA6IDE7Ci0gIHVuaW9uCi0gIHsKLSAgICAvKiBJZiB0aGUgbmFtZWQgZmllbGQgaXMgbm9uLXplcm8sIHRoaXMgaXMgdGhlIG5hbWUuICAqLwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIExlbmd0aCBvZiB0aGUgbmFtZS4gICovCi0gICAgICBpbnQgbGVuZ3RoOwotICAgICAgLyogUG9pbnRlciB0byB0aGUgbmFtZSwgd2hpY2ggaXMgYSBVbmljb2RlIHN0cmluZy4gICovCi0gICAgICB1bmljaGFyICpuYW1lOwotICAgIH0gbjsKLSAgICAvKiBJZiB0aGUgbmFtZWQgZmllbGQgaXMgemVybywgdGhpcyBpcyB0aGUgSUQuICAqLwotICAgIHVuc2lnbmVkIGxvbmcgaWQ7Ci0gIH0gdTsKLX07Ci0KLS8qIEVhY2ggZW50cnkgaW4gdGhlIHRyZWUgaXMgYSByZXNfZW50cnkgc3RydWN0dXJlLiAgV2UgbWl4Ci0gICBkaXJlY3RvcmllcyBhbmQgcmVzb3VyY2VzIGJlY2F1c2UgaW4gYSBDT0ZGIGZpbGUgYWxsIGVudHJpZXMgaW4gYQotICAgZGlyZWN0b3J5IGFyZSBzb3J0ZWQgdG9nZXRoZXIsIHdoZXRoZXIgdGhlIGVudHJpZXMgYXJlCi0gICBzdWJkaXJlY3RvcmllcyBvciByZXNvdXJjZXMuICAqLwotCi1zdHJ1Y3QgcmVzX2VudHJ5Ci17Ci0gIC8qIE5leHQgZW50cnkuICAqLwotICBzdHJ1Y3QgcmVzX2VudHJ5ICpuZXh0OwotICAvKiBSZXNvdXJjZSBJRC4gICovCi0gIHN0cnVjdCByZXNfaWQgaWQ7Ci0gIC8qIE5vbi16ZXJvIGlmIHRoaXMgZW50cnkgaXMgYSBzdWJkaXJlY3RvcnkgcmF0aGVyIHRoYW4gYSBsZWFmLiAgKi8KLSAgdW5zaWduZWQgaW50IHN1YmRpciA6IDE7Ci0gIHVuaW9uCi0gIHsKLSAgICAvKiBJZiB0aGUgc3ViZGlyIGZpZWxkIGlzIG5vbi16ZXJvLCB0aGlzIGlzIGEgcG9pbnRlciB0byB0aGUKLSAgICAgICBzdWJkaXJlY3RvcnkuICAqLwotICAgIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpkaXI7Ci0gICAgLyogSWYgdGhlIHN1YmRpciBmaWVsZCBpcyB6ZXJvLCB0aGlzIGlzIGEgcG9pbnRlciB0byB0aGUgcmVzb3VyY2UKLSAgICAgICBkYXRhLiAgKi8KLSAgICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7Ci0gIH0gdTsKLX07Ci0KLS8qIFR5cGVzIG9mIHJlc291cmNlcy4gICovCi0KLWVudW0gcmVzX3R5cGUKLXsKLSAgUkVTX1RZUEVfVU5JTklUSUFMSVpFRCwKLSAgUkVTX1RZUEVfQUNDRUxFUkFUT1IsCi0gIFJFU19UWVBFX0JJVE1BUCwKLSAgUkVTX1RZUEVfQ1VSU09SLAotICBSRVNfVFlQRV9HUk9VUF9DVVJTT1IsCi0gIFJFU19UWVBFX0RJQUxPRywKLSAgUkVTX1RZUEVfRk9OVCwKLSAgUkVTX1RZUEVfRk9OVERJUiwKLSAgUkVTX1RZUEVfSUNPTiwKLSAgUkVTX1RZUEVfR1JPVVBfSUNPTiwKLSAgUkVTX1RZUEVfTUVOVSwKLSAgUkVTX1RZUEVfTUVTU0FHRVRBQkxFLAotICBSRVNfVFlQRV9SQ0RBVEEsCi0gIFJFU19UWVBFX1NUUklOR1RBQkxFLAotICBSRVNfVFlQRV9VU0VSREFUQSwKLSAgUkVTX1RZUEVfVkVSU0lPTklORk8KLX07Ci0KLS8qIEEgcmVzIGZpbGUgYW5kIGEgQ09GRiBmaWxlIHN0b3JlIGluZm9ybWF0aW9uIGRpZmZlcmVudGx5LiAgVGhlCi0gICByZXNfaW5mbyBzdHJ1Y3R1cmVzIGhvbGRzIGRhdGEgd2hpY2ggaW4gYSByZXMgZmlsZSBpcyBzdG9yZWQgd2l0aAotICAgZWFjaCByZXNvdXJjZSwgYnV0IGluIGEgQ09GRiBmaWxlIGlzIHN0b3JlZCBlbHNld2hlcmUuICAqLwotCi1zdHJ1Y3QgcmVzX3Jlc19pbmZvCi17Ci0gIC8qIExhbmd1YWdlLiAgSW4gYSBDT0ZGIGZpbGUsIHRoZSB0aGlyZCBsZXZlbCBvZiB0aGUgZGlyZWN0b3J5IGlzCi0gICAgIGtleWVkIGJ5IHRoZSBsYW5ndWFnZSwgc28gdGhlIGxhbmd1YWdlIG9mIGEgcmVzb3VyY2UgaXMgZGVmaW5lZAotICAgICBieSBpdHMgbG9jYXRpb24gaW4gdGhlIHJlc291cmNlIHRyZWUuICAqLwotICB1bnNpZ25lZCBzaG9ydCBsYW5ndWFnZTsKLSAgLyogQ2hhcmFjdGVyaXN0aWNzIG9mIHRoZSByZXNvdXJjZS4gIEVudGlyZWx5IHVzZXIgZGVmaW5lZC4gIEluIGEKLSAgICAgQ09GRiBmaWxlLCB0aGUgcmVzX2RpcmVjdG9yeSBzdHJ1Y3R1cmUgaGFzIGEgY2hhcmFjdGVyaXN0aWNzCi0gICAgIGZpZWxkLCBidXQgSSBkb24ndCBrbm93IGlmIGl0J3MgcmVsYXRlZCB0byB0aGUgb25lIGluIHRoZSByZXMKLSAgICAgZmlsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgY2hhcmFjdGVyaXN0aWNzOwotICAvKiBWZXJzaW9uIG9mIHRoZSByZXNvdXJjZS4gIEVudGlyZWx5IHVzZXIgZGVmaW5lZC4gIEluIGEgQ09GRiBmaWxlLAotICAgICB0aGUgcmVzX2RpcmVjdG9yeSBzdHJ1Y3R1cmUgaGFzIGEgY2hhcmFjdGVyaXN0aWNzIGZpZWxkLCBidXQgSQotICAgICBkb24ndCBrbm93IGlmIGl0J3MgcmVsYXRlZCB0byB0aGUgb25lIGluIHRoZSByZXMgZmlsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgdmVyc2lvbjsKLSAgLyogTWVtb3J5IGZsYWdzLiAgVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBNRU1GTEFHIHZhbHVlcwotICAgICBkZWZpbmVkIGJlbG93LiAgTW9zdCBvZiB0aGVzZSB2YWx1ZXMgYXJlIGhpc3RvcmljYWwsIGFuZCBhcmUgbm90Ci0gICAgIG1lYW5pbmdmdWwgZm9yIHdpbjMyLiAgSSBkb24ndCB0aGluayB0aGVyZSBpcyBhbnkgd2F5IHRvIHN0b3JlCi0gICAgIHRoaXMgaW5mb3JtYXRpb24gaW4gYSBDT0ZGIGZpbGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCBtZW1mbGFnczsKLX07Ci0KLS8qIEVhY2ggcmVzb3VyY2UgaW4gYSBDT0ZGIGZpbGUgaGFzIHNvbWUgaW5mb3JtYXRpb24gd2hpY2ggY2FuIGRvZXMKLSAgIG5vdCBhcHBlYXIgaW4gYSByZXMgZmlsZS4gICovCi0KLXN0cnVjdCByZXNfY29mZl9pbmZvCi17Ci0gIC8qIFRoZSBjb2RlIHBhZ2UgdXNlZCBmb3IgdGhlIGRhdGEuICBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhpcwotICAgICBzaG91bGQgYmUuICAqLwotICB1bnNpZ25lZCBsb25nIGNvZGVwYWdlOwotICAvKiBBIHJlc291cmNlIGVudHJ5IGluIGEgQ09GRiBmaWxlIGhhcyBhIHJlc2VydmVkIGZpZWxkLCB3aGljaCB3ZQotICAgICByZWNvcmQgaGVyZSB3aGVuIHJlYWRpbmcgYSBDT0ZGIGZpbGUuICBXaGVuIHdyaXRpbmcgYSBDT0ZGIGZpbGUsCi0gICAgIHdlIHNldCB0aGlzIGZpZWxkIHRvIHplcm8uICAqLwotICB1bnNpZ25lZCBsb25nIHJlc2VydmVkOwotfTsKLQotLyogUmVzb3VyY2UgZGF0YSBpcyBzdG9yZWQgaW4gYSByZXNfcmVzb3VyY2Ugc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZQotewotICAvKiBUaGUgdHlwZSBvZiByZXNvdXJjZS4gICovCi0gIGVudW0gcmVzX3R5cGUgdHlwZTsKLSAgLyogVGhlIGRhdGEgZm9yIHRoZSByZXNvdXJjZS4gICovCi0gIHVuaW9uCi0gIHsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgfSBkYXRhOwotICAgIHN0cnVjdCBhY2NlbGVyYXRvciAqYWNjOwotICAgIHN0cnVjdCBjdXJzb3IgKmN1cnNvcjsKLSAgICBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpncm91cF9jdXJzb3I7Ci0gICAgc3RydWN0IGRpYWxvZyAqZGlhbG9nOwotICAgIHN0cnVjdCBmb250ZGlyICpmb250ZGlyOwotICAgIHN0cnVjdCBncm91cF9pY29uICpncm91cF9pY29uOwotICAgIHN0cnVjdCBtZW51ICptZW51OwotICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqcmNkYXRhOwotICAgIHN0cnVjdCBzdHJpbmd0YWJsZSAqc3RyaW5ndGFibGU7Ci0gICAgc3RydWN0IHJjZGF0YV9pdGVtICp1c2VyZGF0YTsKLSAgICBzdHJ1Y3QgdmVyc2lvbmluZm8gKnZlcnNpb25pbmZvOwotICB9IHU7Ci0gIC8qIEluZm9ybWF0aW9uIGZyb20gYSByZXMgZmlsZS4gICovCi0gIHN0cnVjdCByZXNfcmVzX2luZm8gcmVzX2luZm87Ci0gIC8qIEluZm9ybWF0aW9uIGZyb20gYSBDT0ZGIGZpbGUuICAqLwotICBzdHJ1Y3QgcmVzX2NvZmZfaW5mbyBjb2ZmX2luZm87Ci19OwotCi0vKiBNZW1vcnkgZmxhZ3MgaW4gdGhlIG1lbWZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHJlc19yZXNvdXJjZS4gICovCi0KLSNkZWZpbmUgTUVNRkxBR19NT1ZFQUJMRQkweDEwCi0jZGVmaW5lIE1FTUZMQUdfUFVSRQkJMHgyMAotI2RlZmluZSBNRU1GTEFHX1BSRUxPQUQJCTB4NDAKLSNkZWZpbmUgTUVNRkxBR19ESVNDQVJEQUJMRQkweDEwMDAKLQotLyogU3RhbmRhcmQgcmVzb3VyY2UgdHlwZSBjb2Rlcy4gIFRoZXNlIGFyZSB1c2VkIGluIHRoZSBJRCBmaWVsZCBvZiBhCi0gICByZXNfZW50cnkgc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBSVF9DVVJTT1IJCSAxCi0jZGVmaW5lIFJUX0JJVE1BUAkJIDIKLSNkZWZpbmUgUlRfSUNPTgkJCSAzCi0jZGVmaW5lIFJUX01FTlUJCQkgNAotI2RlZmluZSBSVF9ESUFMT0cJCSA1Ci0jZGVmaW5lIFJUX1NUUklORwkJIDYKLSNkZWZpbmUgUlRfRk9OVERJUgkJIDcKLSNkZWZpbmUgUlRfRk9OVAkJCSA4Ci0jZGVmaW5lIFJUX0FDQ0VMRVJBVE9SCQkgOQotI2RlZmluZSBSVF9SQ0RBVEEJCTEwCi0jZGVmaW5lIFJUX01FU1NBR0VUQUJMRQkJMTEKLSNkZWZpbmUgUlRfR1JPVVBfQ1VSU09SCQkxMgotI2RlZmluZSBSVF9HUk9VUF9JQ09OCQkxNAotI2RlZmluZSBSVF9WRVJTSU9OCQkxNgotI2RlZmluZSBSVF9ETEdJTkNMVURFCQkxNwotI2RlZmluZSBSVF9QTFVHUExBWQkJMTkKLSNkZWZpbmUgUlRfVlhECQkJMjAKLSNkZWZpbmUgUlRfQU5JQ1VSU09SCQkyMQotI2RlZmluZSBSVF9BTklJQ09OCQkyMgotCi0vKiBBbiBhY2NlbGVyYXRvciByZXNvdXJjZSBpcyBhIGxpbmtlZCBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMuICAqLwotCi1zdHJ1Y3QgYWNjZWxlcmF0b3IKLXsKLSAgLyogTmV4dCBhY2NlbGVyYXRvci4gICovCi0gIHN0cnVjdCBhY2NlbGVyYXRvciAqbmV4dDsKLSAgLyogRmxhZ3MuICBBIGNvbWJpbmF0aW9uIG9mIHRoZSBBQ0MgdmFsdWVzIGRlZmluZWQgYmVsb3cuICAqLwotICB1bnNpZ25lZCBzaG9ydCBmbGFnczsKLSAgLyogS2V5IHZhbHVlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQga2V5OwotICAvKiBSZXNvdXJjZSBJRC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGlkOwotfTsKLQotLyogQWNjZWxlcmF0b3IgZmxhZ3MgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IGFjY2VsZXJhdG9yLgotICAgVGhlc2UgYXJlIHRoZSBzYW1lIHZhbHVlcyB0aGF0IGFwcGVhciBpbiBhIHJlcyBmaWxlLiAgSSBob3BlLiAgKi8KLQotI2RlZmluZSBBQ0NfVklSVEtFWQkweDAxCi0jZGVmaW5lIEFDQ19OT0lOVkVSVAkweDAyCi0jZGVmaW5lIEFDQ19TSElGVAkweDA0Ci0jZGVmaW5lIEFDQ19DT05UUk9MCTB4MDgKLSNkZWZpbmUgQUNDX0FMVAkJMHgxMAotI2RlZmluZSBBQ0NfTEFTVAkweDgwCi0KLS8qIEEgY3Vyc29yIHJlc291cmNlLiAgKi8KLQotc3RydWN0IGN1cnNvcgotewotICAvKiBYIGNvb3JkaW5hdGUgb2YgaG90c3BvdC4gICovCi0gIHNob3J0IHhob3RzcG90OwotICAvKiBZIGNvb3JkaW5hdGUgb2YgaG90c3BvdC4gICovCi0gIHNob3J0IHlob3RzcG90OwotICAvKiBMZW5ndGggb2YgYml0bWFwIGRhdGEuICAqLwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgLyogRGF0YS4gICovCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci19OwotCi0vKiBBIGdyb3VwX2N1cnNvciByZXNvdXJjZSBpcyBhIGxpc3Qgb2YgZ3JvdXBfY3Vyc29yIHN0cnVjdHVyZXMuICAqLwotCi1zdHJ1Y3QgZ3JvdXBfY3Vyc29yCi17Ci0gIC8qIE5leHQgY3Vyc29yIGluIGdyb3VwLiAgKi8KLSAgc3RydWN0IGdyb3VwX2N1cnNvciAqbmV4dDsKLSAgLyogV2lkdGguICAqLwotICB1bnNpZ25lZCBzaG9ydCB3aWR0aDsKLSAgLyogSGVpZ2h0LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaGVpZ2h0OwotICAvKiBQbGFuZXMuICAqLwotICB1bnNpZ25lZCBzaG9ydCBwbGFuZXM7Ci0gIC8qIEJpdHMgcGVyIHBpeGVsLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgYml0czsKLSAgLyogTnVtYmVyIG9mIGJ5dGVzIGluIGN1cnNvciByZXNvdXJjZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgYnl0ZXM7Ci0gIC8qIEluZGV4IG9mIGN1cnNvciByZXNvdXJjZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IGluZGV4OwotfTsKLQotLyogQSBkaWFsb2cgcmVzb3VyY2UuICAqLwotCi1zdHJ1Y3QgZGlhbG9nCi17Ci0gIC8qIEJhc2ljIHdpbmRvdyBzdHlsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgc3R5bGU7Ci0gIC8qIEV4dGVuZGVkIHdpbmRvdyBzdHlsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgZXhzdHlsZTsKLSAgLyogWCBjb29yZGluYXRlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgeDsKLSAgLyogWSBjb29yZGluYXRlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgeTsKLSAgLyogV2lkdGguICAqLwotICB1bnNpZ25lZCBzaG9ydCB3aWR0aDsKLSAgLyogSGVpZ2h0LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaGVpZ2h0OwotICAvKiBNZW51IG5hbWUuICAqLwotICBzdHJ1Y3QgcmVzX2lkIG1lbnU7Ci0gIC8qIENsYXNzIG5hbWUuICAqLwotICBzdHJ1Y3QgcmVzX2lkIGNsYXNzOwotICAvKiBDYXB0aW9uLiAgKi8KLSAgdW5pY2hhciAqY2FwdGlvbjsKLSAgLyogRm9udCBwb2ludCBzaXplLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgcG9pbnRzaXplOwotICAvKiBGb250IG5hbWUuICAqLwotICB1bmljaGFyICpmb250OwotICAvKiBFeHRlbmRlZCBpbmZvcm1hdGlvbiBmb3IgYSBkaWFsb2dleC4gICovCi0gIHN0cnVjdCBkaWFsb2dfZXggKmV4OwotICAvKiBDb250cm9scy4gICovCi0gIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqY29udHJvbHM7Ci19OwotCi0vKiBBbiBleHRlbmRlZCBkaWFsb2cgaGFzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgZGlhbG9nX2V4Ci17Ci0gIC8qIEhlbHAgSUQuICAqLwotICB1bnNpZ25lZCBsb25nIGhlbHA7Ci0gIC8qIEZvbnQgd2VpZ2h0LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgd2VpZ2h0OwotICAvKiBXaGV0aGVyIHRoZSBmb250IGlzIGl0YWxpYy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGl0YWxpYzsKLX07Ci0KLS8qIFdpbmRvdyBzdHlsZSBmbGFncywgZnJvbSB0aGUgd2luc3VwIERlZmluZXMuaCBoZWFkZXIgZmlsZS4gIFRoZXNlCi0gICBjYW4gYXBwZWFyIGluIHRoZSBzdHlsZSBmaWVsZCBvZiBhIHN0cnVjdCBkaWFsb2cgb3IgYSBzdHJ1Y3QKLSAgIGRpYWxvZ19jb250cm9sLiAgKi8KLQotI2RlZmluZSBDV19VU0VERUZBVUxUCSgweDgwMDAwMDAwKQotI2RlZmluZSBXU19CT1JERVIJKDB4ODAwMDAwTCkKLSNkZWZpbmUgV1NfQ0FQVElPTgkoMHhjMDAwMDBMKQotI2RlZmluZSBXU19DSElMRAkoMHg0MDAwMDAwMEwpCi0jZGVmaW5lIFdTX0NISUxEV0lORE9XCSgweDQwMDAwMDAwTCkKLSNkZWZpbmUgV1NfQ0xJUENISUxEUkVOCSgweDIwMDAwMDBMKQotI2RlZmluZSBXU19DTElQU0lCTElOR1MJKDB4NDAwMDAwMEwpCi0jZGVmaW5lIFdTX0RJU0FCTEVECSgweDgwMDAwMDBMKQotI2RlZmluZSBXU19ETEdGUkFNRQkoMHg0MDAwMDBMKQotI2RlZmluZSBXU19HUk9VUAkoMHgyMDAwMEwpCi0jZGVmaW5lIFdTX0hTQ1JPTEwJKDB4MTAwMDAwTCkKLSNkZWZpbmUgV1NfSUNPTklDCSgweDIwMDAwMDAwTCkKLSNkZWZpbmUgV1NfTUFYSU1JWkUJKDB4MTAwMDAwMEwpCi0jZGVmaW5lIFdTX01BWElNSVpFQk9YCSgweDEwMDAwTCkKLSNkZWZpbmUgV1NfTUlOSU1JWkUJKDB4MjAwMDAwMDBMKQotI2RlZmluZSBXU19NSU5JTUlaRUJPWAkoMHgyMDAwMEwpCi0jZGVmaW5lIFdTX09WRVJMQVBQRUQJKDBMKQotI2RlZmluZSBXU19PVkVSTEFQUEVEV0lORE9XCSgweGNmMDAwMEwpCi0jZGVmaW5lIFdTX1BPUFVQCSgweDgwMDAwMDAwTCkKLSNkZWZpbmUgV1NfUE9QVVBXSU5ET1cJKDB4ODA4ODAwMDBMKQotI2RlZmluZSBXU19TSVpFQk9YCSgweDQwMDAwTCkKLSNkZWZpbmUgV1NfU1lTTUVOVQkoMHg4MDAwMEwpCi0jZGVmaW5lIFdTX1RBQlNUT1AJKDB4MTAwMDBMKQotI2RlZmluZSBXU19USElDS0ZSQU1FCSgweDQwMDAwTCkKLSNkZWZpbmUgV1NfVElMRUQJKDBMKQotI2RlZmluZSBXU19USUxFRFdJTkRPVwkoMHhjZjAwMDBMKQotI2RlZmluZSBXU19WSVNJQkxFCSgweDEwMDAwMDAwTCkKLSNkZWZpbmUgV1NfVlNDUk9MTAkoMHgyMDAwMDBMKQotI2RlZmluZSBNRElTX0FMTENISUxEU1RZTEVTCSgweDEpCi0jZGVmaW5lIEJTXzNTVEFURQkoMHg1TCkKLSNkZWZpbmUgQlNfQVVUTzNTVEFURQkoMHg2TCkKLSNkZWZpbmUgQlNfQVVUT0NIRUNLQk9YCSgweDNMKQotI2RlZmluZSBCU19BVVRPUkFESU9CVVRUT04JKDB4OUwpCi0jZGVmaW5lIEJTX0JJVE1BUAkoMHg4MEwpCi0jZGVmaW5lIEJTX0JPVFRPTQkoMHg4MDBMKQotI2RlZmluZSBCU19DRU5URVIJKDB4MzAwTCkKLSNkZWZpbmUgQlNfQ0hFQ0tCT1gJKDB4MkwpCi0jZGVmaW5lIEJTX0RFRlBVU0hCVVRUT04JKDB4MUwpCi0jZGVmaW5lIEJTX0dST1VQQk9YCSgweDdMKQotI2RlZmluZSBCU19JQ09OCSgweDQwTCkKLSNkZWZpbmUgQlNfTEVGVAkoMHgxMDBMKQotI2RlZmluZSBCU19MRUZUVEVYVAkoMHgyMEwpCi0jZGVmaW5lIEJTX01VTFRJTElORQkoMHgyMDAwTCkKLSNkZWZpbmUgQlNfTk9USUZZCSgweDQwMDBMKQotI2RlZmluZSBCU19PV05FUkRSQVcJKDB4YkwpCi0jZGVmaW5lIEJTX1BVU0hCT1gJKDB4Y0wpCQkvKiBGSVhNRSEgIFdoYXQgc2hvdWxkIHRoaXMgYmU/ICAqLwotI2RlZmluZSBCU19QVVNIQlVUVE9OCSgwTCkKLSNkZWZpbmUgQlNfUFVTSExJS0UJKDB4MTAwMEwpCi0jZGVmaW5lIEJTX1JBRElPQlVUVE9OCSgweDRMKQotI2RlZmluZSBCU19SSUdIVAkoMHgyMDBMKQotI2RlZmluZSBCU19SSUdIVEJVVFRPTgkoMHgyMEwpCi0jZGVmaW5lIEJTX1RFWFQJKDBMKQotI2RlZmluZSBCU19UT1AJKDB4NDAwTCkKLSNkZWZpbmUgQlNfVVNFUkJVVFRPTgkoMHg4TCkKLSNkZWZpbmUgQlNfVkNFTlRFUgkoMHhjMDBMKQotI2RlZmluZSBDQlNfQVVUT0hTQ1JPTEwJKDB4NDBMKQotI2RlZmluZSBDQlNfRElTQUJMRU5PU0NST0xMCSgweDgwMEwpCi0jZGVmaW5lIENCU19EUk9QRE9XTgkoMHgyTCkKLSNkZWZpbmUgQ0JTX0RST1BET1dOTElTVAkoMHgzTCkKLSNkZWZpbmUgQ0JTX0hBU1NUUklOR1MJKDB4MjAwTCkKLSNkZWZpbmUgQ0JTX0xPV0VSQ0FTRQkoMHg0MDAwTCkKLSNkZWZpbmUgQ0JTX05PSU5URUdSQUxIRUlHSFQJKDB4NDAwTCkKLSNkZWZpbmUgQ0JTX09FTUNPTlZFUlQJKDB4ODBMKQotI2RlZmluZSBDQlNfT1dORVJEUkFXRklYRUQJKDB4MTBMKQotI2RlZmluZSBDQlNfT1dORVJEUkFXVkFSSUFCTEUJKDB4MjBMKQotI2RlZmluZSBDQlNfU0lNUExFCSgweDFMKQotI2RlZmluZSBDQlNfU09SVAkoMHgxMDBMKQotI2RlZmluZSBDQlNfVVBQRVJDQVNFCSgweDIwMDBMKQotI2RlZmluZSBFU19BVVRPSFNDUk9MTAkoMHg4MEwpCi0jZGVmaW5lIEVTX0FVVE9WU0NST0xMCSgweDQwTCkKLSNkZWZpbmUgRVNfQ0VOVEVSCSgweDFMKQotI2RlZmluZSBFU19MRUZUCSgwTCkKLSNkZWZpbmUgRVNfTE9XRVJDQVNFCSgweDEwTCkKLSNkZWZpbmUgRVNfTVVMVElMSU5FCSgweDRMKQotI2RlZmluZSBFU19OT0hJREVTRUwJKDB4MTAwTCkKLSNkZWZpbmUgRVNfTlVNQkVSCSgweDIwMDBMKQotI2RlZmluZSBFU19PRU1DT05WRVJUCSgweDQwMEwpCi0jZGVmaW5lIEVTX1BBU1NXT1JECSgweDIwTCkKLSNkZWZpbmUgRVNfUkVBRE9OTFkJKDB4ODAwTCkKLSNkZWZpbmUgRVNfUklHSFQJKDB4MkwpCi0jZGVmaW5lIEVTX1VQUEVSQ0FTRQkoMHg4TCkKLSNkZWZpbmUgRVNfV0FOVFJFVFVSTgkoMHgxMDAwTCkKLSNkZWZpbmUgTEJTX0RJU0FCTEVOT1NDUk9MTAkoMHgxMDAwTCkKLSNkZWZpbmUgTEJTX0VYVEVOREVEU0VMCSgweDgwMEwpCi0jZGVmaW5lIExCU19IQVNTVFJJTkdTCSgweDQwTCkKLSNkZWZpbmUgTEJTX01VTFRJQ09MVU1OCSgweDIwMEwpCi0jZGVmaW5lIExCU19NVUxUSVBMRVNFTAkoMHg4TCkKLSNkZWZpbmUgTEJTX05PREFUQQkoMHgyMDAwTCkKLSNkZWZpbmUgTEJTX05PSU5URUdSQUxIRUlHSFQJKDB4MTAwTCkKLSNkZWZpbmUgTEJTX05PUkVEUkFXCSgweDRMKQotI2RlZmluZSBMQlNfTk9TRUwJKDB4NDAwMEwpCi0jZGVmaW5lIExCU19OT1RJRlkJKDB4MUwpCi0jZGVmaW5lIExCU19PV05FUkRSQVdGSVhFRAkoMHgxMEwpCi0jZGVmaW5lIExCU19PV05FUkRSQVdWQVJJQUJMRQkoMHgyMEwpCi0jZGVmaW5lIExCU19TT1JUCSgweDJMKQotI2RlZmluZSBMQlNfU1RBTkRBUkQJKDB4YTAwMDAzTCkKLSNkZWZpbmUgTEJTX1VTRVRBQlNUT1BTCSgweDgwTCkKLSNkZWZpbmUgTEJTX1dBTlRLRVlCT0FSRElOUFVUCSgweDQwMEwpCi0jZGVmaW5lIFNCU19CT1RUT01BTElHTgkoMHg0TCkKLSNkZWZpbmUgU0JTX0hPUloJKDBMKQotI2RlZmluZSBTQlNfTEVGVEFMSUdOCSgweDJMKQotI2RlZmluZSBTQlNfUklHSFRBTElHTgkoMHg0TCkKLSNkZWZpbmUgU0JTX1NJWkVCT1gJKDB4OEwpCi0jZGVmaW5lIFNCU19TSVpFQk9YQk9UVE9NUklHSFRBTElHTgkoMHg0TCkKLSNkZWZpbmUgU0JTX1NJWkVCT1hUT1BMRUZUQUxJR04JKDB4MkwpCi0jZGVmaW5lIFNCU19TSVpFR1JJUAkoMHgxMEwpCi0jZGVmaW5lIFNCU19UT1BBTElHTgkoMHgyTCkKLSNkZWZpbmUgU0JTX1ZFUlQJKDB4MUwpCi0jZGVmaW5lIFNTX0JJVE1BUAkoMHhlTCkKLSNkZWZpbmUgU1NfQkxBQ0tGUkFNRQkoMHg3TCkKLSNkZWZpbmUgU1NfQkxBQ0tSRUNUCSgweDRMKQotI2RlZmluZSBTU19DRU5URVIJKDB4MUwpCi0jZGVmaW5lIFNTX0NFTlRFUklNQUdFCSgweDIwMEwpCi0jZGVmaW5lIFNTX0VOSE1FVEFGSUxFCSgweGZMKQotI2RlZmluZSBTU19FVENIRURGUkFNRQkoMHgxMkwpCi0jZGVmaW5lIFNTX0VUQ0hFREhPUloJKDB4MTBMKQotI2RlZmluZSBTU19FVENIRURWRVJUCSgweDExTCkKLSNkZWZpbmUgU1NfR1JBWUZSQU1FCSgweDhMKQotI2RlZmluZSBTU19HUkFZUkVDVAkoMHg1TCkKLSNkZWZpbmUgU1NfSUNPTgkoMHgzTCkKLSNkZWZpbmUgU1NfTEVGVAkoMEwpCi0jZGVmaW5lIFNTX0xFRlROT1dPUkRXUkFQCSgweGNMKQotI2RlZmluZSBTU19OT1BSRUZJWAkoMHg4MEwpCi0jZGVmaW5lIFNTX05PVElGWQkoMHgxMDBMKQotI2RlZmluZSBTU19PV05FUkRSQVcJKDB4ZEwpCi0jZGVmaW5lIFNTX1JFQUxTSVpFSU1BR0UJKDB4ODAwTCkKLSNkZWZpbmUgU1NfUklHSFQJKDB4MkwpCi0jZGVmaW5lIFNTX1JJR0hUSlVTVAkoMHg0MDBMKQotI2RlZmluZSBTU19TSU1QTEUJKDB4YkwpCi0jZGVmaW5lIFNTX1NVTktFTgkoMHgxMDAwTCkKLSNkZWZpbmUgU1NfVVNFUklURU0gICAgICgweGFMKQotI2RlZmluZSBTU19XSElURUZSQU1FCSgweDlMKQotI2RlZmluZSBTU19XSElURVJFQ1QJKDB4NkwpCi0jZGVmaW5lIERTXzNETE9PSwkoMHg0TCkKLSNkZWZpbmUgRFNfQUJTQUxJR04JKDB4MUwpCi0jZGVmaW5lIERTX0NFTlRFUgkoMHg4MDBMKQotI2RlZmluZSBEU19DRU5URVJNT1VTRQkoMHgxMDAwTCkKLSNkZWZpbmUgRFNfQ09OVEVYVEhFTFAJKDB4MjAwMEwpCi0jZGVmaW5lIERTX0NPTlRST0wJKDB4NDAwTCkKLSNkZWZpbmUgRFNfRklYRURTWVMJKDB4OEwpCi0jZGVmaW5lIERTX0xPQ0FMRURJVAkoMHgyMEwpCi0jZGVmaW5lIERTX01PREFMRlJBTUUJKDB4ODBMKQotI2RlZmluZSBEU19OT0ZBSUxDUkVBVEUJKDB4MTBMKQotI2RlZmluZSBEU19OT0lETEVNU0cJKDB4MTAwTCkKLSNkZWZpbmUgRFNfU0VURk9OVAkoMHg0MEwpCi0jZGVmaW5lIERTX1NFVEZPUkVHUk9VTkQJKDB4MjAwTCkKLSNkZWZpbmUgRFNfU1lTTU9EQUwJKDB4MkwpCi0KLS8qIEEgZGlhbG9nIGNvbnRyb2wuICAqLwotCi1zdHJ1Y3QgZGlhbG9nX2NvbnRyb2wKLXsKLSAgLyogTmV4dCBjb250cm9sLiAgKi8KLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICpuZXh0OwotICAvKiBJRC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGlkOwotICAvKiBTdHlsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgc3R5bGU7Ci0gIC8qIEV4dGVuZGVkIHN0eWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBleHN0eWxlOwotICAvKiBYIGNvb3JkaW5hdGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB4OwotICAvKiBZIGNvb3JkaW5hdGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB5OwotICAvKiBXaWR0aC4gICovCi0gIHVuc2lnbmVkIHNob3J0IHdpZHRoOwotICAvKiBIZWlnaHQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBoZWlnaHQ7Ci0gIC8qIENsYXNzIG5hbWUuICAqLwotICBzdHJ1Y3QgcmVzX2lkIGNsYXNzOwotICAvKiBBc3NvY2lhdGVkIHRleHQuICAqLwotICBzdHJ1Y3QgcmVzX2lkIHRleHQ7Ci0gIC8qIEV4dHJhIGRhdGEgZm9yIHRoZSB3aW5kb3cgcHJvY2VkdXJlLiAgKi8KLSAgc3RydWN0IHJjZGF0YV9pdGVtICpkYXRhOwotICAvKiBIZWxwIElELiAgT25seSB1c2VkIGluIGFuIGV4dGVuZGVkIGRpYWxvZy4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGVscDsKLX07Ci0KLS8qIENvbnRyb2wgY2xhc3Nlcy4gIFRoZXNlIGNhbiBiZSB1c2VkIGFzIHRoZSBJRCBmaWVsZCBpbiBhIHN0cnVjdAotICAgZGlhbG9nX2NvbnRyb2wuICAqLwotCi0jZGVmaW5lIENUTF9CVVRUT04JMHg4MAotI2RlZmluZSBDVExfRURJVAkweDgxCi0jZGVmaW5lIENUTF9TVEFUSUMJMHg4MgotI2RlZmluZSBDVExfTElTVEJPWAkweDgzCi0jZGVmaW5lIENUTF9TQ1JPTExCQVIJMHg4NAotI2RlZmluZSBDVExfQ09NQk9CT1gJMHg4NQotCi0vKiBBIGZvbnRkaXIgcmVzb3VyY2UgaXMgYSBsaXN0IG9mIGZvbnRkaXIgc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCBmb250ZGlyCi17Ci0gIHN0cnVjdCBmb250ZGlyICpuZXh0OwotICAvKiBJbmRleCBvZiBmb250IGVudHJ5LiAgKi8KLSAgc2hvcnQgaW5kZXg7Ci0gIC8qIExlbmd0aCBvZiBmb250IGluZm9ybWF0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIC8qIEZvbnQgaW5mb3JtYXRpb24uICovCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci19OwotCi0vKiBBIGdyb3VwX2ljb24gcmVzb3VyY2UgaXMgYSBsaXN0IG9mIGdyb3VwX2ljb24gc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCBncm91cF9pY29uCi17Ci0gIC8qIE5leHQgaWNvbiBpbiBncm91cC4gICovCi0gIHN0cnVjdCBncm91cF9pY29uICpuZXh0OwotICAvKiBXaWR0aC4gICovCi0gIHVuc2lnbmVkIGNoYXIgd2lkdGg7Ci0gIC8qIEhlaWdodC4gICovCi0gIHVuc2lnbmVkIGNoYXIgaGVpZ2h0OwotICAvKiBDb2xvciBjb3VudC4gICovCi0gIHVuc2lnbmVkIGNoYXIgY29sb3JzOwotICAvKiBQbGFuZXMuICAqLwotICB1bnNpZ25lZCBzaG9ydCBwbGFuZXM7Ci0gIC8qIEJpdHMgcGVyIHBpeGVsLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgYml0czsKLSAgLyogTnVtYmVyIG9mIGJ5dGVzIGluIGN1cnNvciByZXNvdXJjZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgYnl0ZXM7Ci0gIC8qIEluZGV4IG9mIGN1cnNvciByZXNvdXJjZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IGluZGV4OwotfTsKLQotLyogQSBtZW51IHJlc291cmNlLiAgKi8KLQotc3RydWN0IG1lbnUKLXsKLSAgLyogTGlzdCBvZiBtZW51aXRlbXMuICAqLwotICBzdHJ1Y3QgbWVudWl0ZW0gKml0ZW1zOwotICAvKiBIZWxwIElELiAgSSBkb24ndCB0aGluayB0aGVyZSBpcyBhbnkgd2F5IHRvIHNldCB0aGlzIGluIGFuIHJjCi0gICAgIGZpbGUsIGJ1dCBpdCBjYW4gYXBwZWFyIGluIHRoZSBiaW5hcnkgZm9ybWF0LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoZWxwOwotfTsKLQotLyogQSBtZW51IHJlc291cmNlIGlzIGEgbGlzdCBvZiBtZW51aXRlbSBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IG1lbnVpdGVtCi17Ci0gIC8qIE5leHQgbWVudWl0ZW0uICAqLwotICBzdHJ1Y3QgbWVudWl0ZW0gKm5leHQ7Ci0gIC8qIFR5cGUuICBJbiBhIG5vcm1hbCBtZW51LCByYXRoZXIgdGhhbiBhIG1lbnVleCwgdGhpcyBpcyB0aGUgZmxhZ3MKLSAgICAgZmllbGQuICAqLwotICB1bnNpZ25lZCBsb25nIHR5cGU7Ci0gIC8qIFN0YXRlLiAgVGhpcyBpcyBvbmx5IHVzZWQgaW4gYSBtZW51ZXguICAqLwotICB1bnNpZ25lZCBsb25nIHN0YXRlOwotICAvKiBJZC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGlkOwotICAvKiBVbmljb2RlIHRleHQuICAqLwotICB1bmljaGFyICp0ZXh0OwotICAvKiBQb3B1cCBtZW51IGl0ZW1zIGZvciBhIHBvcHVwLiAgKi8KLSAgc3RydWN0IG1lbnVpdGVtICpwb3B1cDsKLSAgLyogSGVscCBJRC4gIFRoaXMgaXMgb25seSB1c2VkIGluIGEgbWVudWV4LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoZWxwOwotfTsKLQotLyogTWVudSBpdGVtIGZsYWdzLiAgVGhlc2UgY2FuIGFwcGVhciBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QKLSAgIG1lbnVpdGVtLiAgKi8KLQotI2RlZmluZSBNRU5VSVRFTV9HUkFZRUQJCTB4MDAxCi0jZGVmaW5lIE1FTlVJVEVNX0lOQUNUSVZFCTB4MDAyCi0jZGVmaW5lIE1FTlVJVEVNX0JJVE1BUAkJMHgwMDQKLSNkZWZpbmUgTUVOVUlURU1fT1dORVJEUkFXCTB4MTAwCi0jZGVmaW5lIE1FTlVJVEVNX0NIRUNLRUQJMHgwMDgKLSNkZWZpbmUgTUVOVUlURU1fUE9QVVAJCTB4MDEwCi0jZGVmaW5lIE1FTlVJVEVNX01FTlVCQVJCUkVBSwkweDAyMAotI2RlZmluZSBNRU5VSVRFTV9NRU5VQlJFQUsJMHgwNDAKLSNkZWZpbmUgTUVOVUlURU1fRU5ETUVOVQkweDA4MAotI2RlZmluZSBNRU5VSVRFTV9IRUxQCSAgICAgICAweDQwMDAKLQotLyogQW4gcmNkYXRhIHJlc291cmNlIGlzIGEgcG9pbnRlciB0byBhIGxpc3Qgb2YgcmNkYXRhX2l0ZW0KLSAgIHN0cnVjdHVyZXMuICAqLwotCi1zdHJ1Y3QgcmNkYXRhX2l0ZW0KLXsKLSAgLyogTmV4dCBkYXRhIGl0ZW0uICAqLwotICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKm5leHQ7Ci0gIC8qIFR5cGUgb2YgZGF0YS4gICovCi0gIGVudW0KLSAgewotICAgIFJDREFUQV9XT1JELAotICAgIFJDREFUQV9EV09SRCwKLSAgICBSQ0RBVEFfU1RSSU5HLAotICAgIFJDREFUQV9XU1RSSU5HLAotICAgIFJDREFUQV9CVUZGRVIKLSAgfSB0eXBlOwotICB1bmlvbgotICB7Ci0gICAgdW5zaWduZWQgaW50IHdvcmQ7Ci0gICAgdW5zaWduZWQgbG9uZyBkd29yZDsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgfSBzdHJpbmc7Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgICBjb25zdCB1bmljaGFyICp3OwotICAgIH0gd3N0cmluZzsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgfSBidWZmZXI7Ci0gIH0gdTsKLX07Ci0KLS8qIEEgc3RyaW5ndGFibGUgcmVzb3VyY2UgaXMgYSBwb2ludGVyIHRvIGEgc3RyaW5ndGFibGUgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHN0cmluZ3RhYmxlCi17Ci0gIC8qIEVhY2ggc3RyaW5ndGFibGUgcmVzb3VyY2UgaXMgYSBsaXN0IG9mIDE2IHVuaWNvZGUgc3RyaW5ncy4gICovCi0gIHN0cnVjdAotICB7Ci0gICAgLyogTGVuZ3RoIG9mIHN0cmluZy4gICovCi0gICAgaW50IGxlbmd0aDsKLSAgICAvKiBTdHJpbmcgZGF0YSBpZiBsZW5ndGggPiAwLiAgKi8KLSAgICB1bmljaGFyICpzdHJpbmc7Ci0gIH0gc3RyaW5nc1sxNl07Ci19OwotCi0vKiBBIHZlcnNpb25pbmZvIHJlc291cmNlIHBvaW50cyB0byBhIHZlcnNpb25pbmZvIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCB2ZXJzaW9uaW5mbwotewotICAvKiBGaXhlZCB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmaXhlZDsKLSAgLyogVmFyaWFibGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCB2ZXJfaW5mbyAqdmFyOwotfTsKLQotLyogVGhlIGZpeGVkIHBvcnRpb24gb2YgYSB2ZXJzaW9uaW5mbyByZXNvdXJjZS4gICovCi0KLXN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbwotewotICAvKiBUaGUgZmlsZSB2ZXJzaW9uLCB3aGljaCBpcyB0d28gMzIgYml0IGludGVnZXJzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX3ZlcnNpb25fbXM7Ci0gIHVuc2lnbmVkIGxvbmcgZmlsZV92ZXJzaW9uX2xzOwotICAvKiBUaGUgcHJvZHVjdCB2ZXJzaW9uLCB3aGljaCBpcyB0d28gMzIgYml0IGludGVnZXJzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBwcm9kdWN0X3ZlcnNpb25fbXM7Ci0gIHVuc2lnbmVkIGxvbmcgcHJvZHVjdF92ZXJzaW9uX2xzOwotICAvKiBUaGUgZmlsZSBmbGFncyBtYXNrLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX2ZsYWdzX21hc2s7Ci0gIC8qIFRoZSBmaWxlIGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX2ZsYWdzOwotICAvKiBUaGUgT1MgdHlwZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlsZV9vczsKLSAgLyogVGhlIGZpbGUgdHlwZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlsZV90eXBlOwotICAvKiBUaGUgZmlsZSBzdWJ0eXBlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX3N1YnR5cGU7Ci0gIC8qIFRoZSBkYXRlLCB3aGljaCBpbiBXaW5kb3dzIGlzIHR3byAzMiBiaXQgaW50ZWdlcnMuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfZGF0ZV9tczsKLSAgdW5zaWduZWQgbG9uZyBmaWxlX2RhdGVfbHM7Ci19OwotCi0vKiBBIGxpc3Qgb2YgdmFyaWFibGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCB2ZXJfaW5mbwotewotICAvKiBOZXh0IGl0ZW0uICAqLwotICBzdHJ1Y3QgdmVyX2luZm8gKm5leHQ7Ci0gIC8qIFR5cGUgb2YgZGF0YS4gICovCi0gIGVudW0geyBWRVJJTkZPX1NUUklORywgVkVSSU5GT19WQVIgfSB0eXBlOwotICB1bmlvbgotICB7Ci0gICAgLyogU3RyaW5nRmlsZUluZm8gZGF0YS4gICovCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgLyogTGFuZ3VhZ2UuICAqLwotICAgICAgdW5pY2hhciAqbGFuZ3VhZ2U7Ci0gICAgICAvKiBTdHJpbmdzLiAgKi8KLSAgICAgIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqc3RyaW5nczsKLSAgICB9IHN0cmluZzsKLSAgICAvKiBWYXJGaWxlSW5mbyBkYXRhLiAgKi8KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAvKiBLZXkuICAqLwotICAgICAgdW5pY2hhciAqa2V5OwotICAgICAgLyogVmFsdWVzLiAgKi8KLSAgICAgIHN0cnVjdCB2ZXJfdmFyaW5mbyAqdmFyOwotICAgIH0gdmFyOwotICB9IHU7Ci19OwotCi0vKiBBIGxpc3Qgb2Ygc3RyaW5nIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgdmVyX3N0cmluZ2luZm8KLXsKLSAgLyogTmV4dCBzdHJpbmcuICAqLwotICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKm5leHQ7Ci0gIC8qIEtleS4gICovCi0gIHVuaWNoYXIgKmtleTsKLSAgLyogVmFsdWUuICAqLwotICB1bmljaGFyICp2YWx1ZTsKLX07Ci0KLS8qIEEgbGlzdCBvZiB2YXJpYWJsZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IHZlcl92YXJpbmZvCi17Ci0gIC8qIE5leHQgaXRlbS4gICovCi0gIHN0cnVjdCB2ZXJfdmFyaW5mbyAqbmV4dDsKLSAgLyogTGFuZ3VhZ2UgSUQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBsYW5ndWFnZTsKLSAgLyogQ2hhcmFjdGVyIHNldCBJRC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGNoYXJzZXQ7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHdoZW4gY29udmVydGluZyByZXNvdXJjZSBpbmZvcm1hdGlvbiB0bwotICAgYmluYXJ5LiAgKi8KLQotc3RydWN0IGJpbmRhdGEKLXsKLSAgLyogTmV4dCBkYXRhLiAgKi8KLSAgc3RydWN0IGJpbmRhdGEgKm5leHQ7Ci0gIC8qIExlbmd0aCBvZiBkYXRhLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIC8qIERhdGEuICAqLwotICB1bnNpZ25lZCBjaGFyICpkYXRhOwotfTsKLQotZXh0ZXJuIGludCB2ZXJib3NlOwotCi0vKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMuICAqLwotCi1leHRlcm4gc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlYWRfcmNfZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLWV4dGVybiBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVhZF9yZXNfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVhZF9jb2ZmX3JzcmMKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHdyaXRlX3JjX2ZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKSk7Ci1leHRlcm4gdm9pZCB3cml0ZV9yZXNfZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICopKTsKLWV4dGVybiB2b2lkIHdyaXRlX2NvZmZfZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKikpOwotCi1leHRlcm4gc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3JlcwotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotZXh0ZXJuIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgaW50KSk7Ci0KLWV4dGVybiBGSUxFICpvcGVuX2ZpbGVfc2VhcmNoCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIgKiopKTsKLQotZXh0ZXJuIFBUUiByZXNfYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1leHRlcm4gUFRSIHJlc3dyX2FsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi0vKiBSZXNvdXJjZSBJRCBoYW5kbGluZy4gICovCi0KLWV4dGVybiBpbnQgcmVzX2lkX2NtcCBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBzdHJ1Y3QgcmVzX2lkKSk7Ci1leHRlcm4gdm9pZCByZXNfaWRfcHJpbnQgUEFSQU1TICgoRklMRSAqLCBzdHJ1Y3QgcmVzX2lkLCBpbnQpKTsKLWV4dGVybiB2b2lkIHJlc19pZHNfcHJpbnQgUEFSQU1TICgoRklMRSAqLCBpbnQsIGNvbnN0IHN0cnVjdCByZXNfaWQgKikpOwotZXh0ZXJuIHZvaWQgcmVzX3N0cmluZ190b19pZCBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBNYW5pcHVsYXRpb24gb2YgdGhlIHJlc291cmNlIHRyZWUuICAqLwotCi1leHRlcm4gc3RydWN0IHJlc19yZXNvdXJjZSAqZGVmaW5lX3Jlc291cmNlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICoqLCBpbnQsIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgaW50KSk7Ci1leHRlcm4gc3RydWN0IHJlc19yZXNvdXJjZSAqZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICoqLCBpbnQsIHN0cnVjdCByZXNfaWQsIGludCwgaW50KSk7Ci0KLWV4dGVybiBpbnQgZXh0ZW5kZWRfZGlhbG9nIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBkaWFsb2cgKikpOwotZXh0ZXJuIGludCBleHRlbmRlZF9tZW51IFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtZW51ICopKTsKLQotLyogQ29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSByYyBmaWxlIHN1cHBvcnQgYW5kIHRoZSBwYXJzZXIgYW5kIGxleGVyLiAgKi8KLQotZXh0ZXJuIGludCB5eWRlYnVnOwotZXh0ZXJuIEZJTEUgKnl5aW47Ci1leHRlcm4gY2hhciAqcmNfZmlsZW5hbWU7Ci1leHRlcm4gaW50IHJjX2xpbmVubzsKLWV4dGVybiBpbnQgeXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHl5ZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCByY3BhcnNlX3dhcm5pbmcgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCByY3BhcnNlX3NldF9sYW5ndWFnZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHJjcGFyc2VfZGlzY2FyZF9zdHJpbmdzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHJjcGFyc2VfcmNkYXRhIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHJjcGFyc2Vfbm9ybWFsIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgZGVmaW5lX2FjY2VsZXJhdG9yCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgc3RydWN0IGFjY2VsZXJhdG9yICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9iaXRtYXAKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9jdXJzb3IKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9kaWFsb2cKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBjb25zdCBzdHJ1Y3QgZGlhbG9nICopKTsKLWV4dGVybiBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmRlZmluZV9jb250cm9sCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKLQkgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAotCSAgIHVuc2lnbmVkIGxvbmcpKTsKLWV4dGVybiB2b2lkIGRlZmluZV9mb250Ci0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfaWNvbgotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX21lbnUKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBzdHJ1Y3QgbWVudWl0ZW0gKikpOwotZXh0ZXJuIHN0cnVjdCBtZW51aXRlbSAqZGVmaW5lX21lbnVpdGVtCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAotCSAgIHN0cnVjdCBtZW51aXRlbSAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfbWVzc2FnZXRhYmxlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfcmNkYXRhCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgc3RydWN0IHJjZGF0YV9pdGVtICopKTsKLWV4dGVybiBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmRlZmluZV9yY2RhdGFfc3RyaW5nCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIHN0cnVjdCByY2RhdGFfaXRlbSAqZGVmaW5lX3JjZGF0YV9udW1iZXIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfc3RyaW5ndGFibGUKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV91c2VyX2RhdGEKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLAotCSAgIHN0cnVjdCByY2RhdGFfaXRlbSAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfdXNlcl9maWxlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwKLQkgICBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV92ZXJzaW9uaW5mbwotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBpbnQsIHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbyAqLAotCSAgIHN0cnVjdCB2ZXJfaW5mbyAqKSk7Ci1leHRlcm4gc3RydWN0IHZlcl9pbmZvICphcHBlbmRfdmVyX3N0cmluZ2ZpbGVpbmZvCi0gIFBBUkFNUyAoKHN0cnVjdCB2ZXJfaW5mbyAqLCBjb25zdCBjaGFyICosIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqKSk7Ci1leHRlcm4gc3RydWN0IHZlcl9pbmZvICphcHBlbmRfdmVyX3ZhcmZpbGVpbmZvCi0gIFBBUkFNUyAoKHN0cnVjdCB2ZXJfaW5mbyAqLCBjb25zdCBjaGFyICosIHN0cnVjdCB2ZXJfdmFyaW5mbyAqKSk7Ci1leHRlcm4gc3RydWN0IHZlcl9zdHJpbmdpbmZvICphcHBlbmRfdmVydmFsCi0gIFBBUkFNUyAoKHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHN0cnVjdCB2ZXJfdmFyaW5mbyAqYXBwZW5kX3ZlcnRyYW5zCi0gIFBBUkFNUyAoKHN0cnVjdCB2ZXJfdmFyaW5mbyAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7CmRpZmYgLS1naXQgYS9iaW51dGlscy93aW5kdW5pLmMgYi9iaW51dGlscy93aW5kdW5pLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OWY0N2EuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvd2luZHVuaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qIHdpbmR1bmkuYyAtLSB1bmljb2RlIHN1cHBvcnQgZm9yIHRoZSB3aW5kcmVzIHByb2dyYW0uCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyB1bmljb2RlIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSB3aW5kcmVzCi0gICBwcm9ncmFtLiAgSWRlYWxseSwgd2Ugd291bGQgaGF2ZSBnZW5lcmljIHVuaWNvZGUgc3VwcG9ydCB3aGljaAotICAgd291bGQgd29yayBvbiBhbGwgc3lzdGVtcy4gIEhvd2V2ZXIsIHdlIGRvbid0LiAgSW5zdGVhZCwgb24gYQotICAgV2luZG93cyBob3N0LCB3ZSBhcmUgcHJlcGFyZWQgdG8gY2FsbCBzb21lIFdpbmRvd3Mgcm91dGluZXMuICBUaGlzCi0gICBtZWFucyB0aGF0IHdlIHdpbGwgZ2VuZXJhdGUgZGlmZmVyZW50IG91dHB1dCBvbiBXaW5kb3dzIGFuZCBVbml4Ci0gICBob3N0cywgYnV0IHRoYXQgc2VlbXMgYmV0dGVyIHRoYW4gbm90IHJlYWxseSBzdXBwb3J0aW5nIHVuaWNvZGUgYXQKLSAgIGFsbC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJ3aW5kdW5pLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0KLS8qIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgdW5pY29kZSBzdHJpbmcuICBXZSBqdXN0IGNvcHkgaXQsCi0gICBleHBhbmRpbmcgY2hhcnMgdG8gc2hvcnRzLCByYXRoZXIgdGhhbiBkb2luZyBzb21ldGhpbmcgaW50ZWxsaWdlbnQuICAqLwotCi12b2lkCi11bmljb2RlX2Zyb21fYXNjaWkgKGxlbmd0aCwgdW5pY29kZSwgYXNjaWkpCi0gICAgIGludCAqbGVuZ3RoOwotICAgICB1bmljaGFyICoqdW5pY29kZTsKLSAgICAgY29uc3QgY2hhciAqYXNjaWk7Ci17Ci0gIGludCBsZW47Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIHVuc2lnbmVkIHNob3J0ICp3OwotCi0gIGxlbiA9IHN0cmxlbiAoYXNjaWkpOwotCi0gIGlmIChsZW5ndGggIT0gTlVMTCkKLSAgICAqbGVuZ3RoID0gbGVuOwotCi0gICp1bmljb2RlID0gKCh1bmljaGFyICopIHJlc19hbGxvYyAoKGxlbiArIDEpICogc2l6ZW9mICh1bmljaGFyKSkpOwotCi0jaWZkZWYgX1dJTjMyCi0gIC8qIEZJWE1FOiBPbiBXaW5kb3dzLCB3ZSBzaG91bGQgYmUgdXNpbmcgTXVsdGlCeXRlVG9XaWRlQ2hhciB0byBzZXQKLSAgICAgdGhlIGxlbmd0aC4gICovCi0gIE11bHRpQnl0ZVRvV2lkZUNoYXIgKENQX0FDUCwgMCwgYXNjaWksIGxlbiArIDEsICp1bmljb2RlLCBsZW4gKyAxKTsKLSNlbHNlCi0gIGZvciAocyA9IGFzY2lpLCB3ID0gKnVuaWNvZGU7ICpzICE9ICdcMCc7IHMrKywgdysrKQotICAgICp3ID0gKnMgJiAweGZmOwotICAqdyA9IDA7Ci0jZW5kaWYKLX0KLQotLyogUHJpbnQgdGhlIHVuaWNvZGUgc3RyaW5nIFVOSUNPREUgdG8gdGhlIGZpbGUgRS4gIExFTkdUSCBpcyB0aGUKLSAgIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHByaW50LCBvciAtMSBpZiB3ZSBzaG91bGQgcHJpbnQgdW50aWwgdGhlCi0gICBlbmQgb2YgdGhlIHN0cmluZy4gIEZJWE1FOiBPbiBhIFdpbmRvd3MgaG9zdCwgd2Ugc2hvdWxkIGJlIGNhbGxpbmcKLSAgIHNvbWUgV2luZG93cyBmdW5jdGlvbiwgcHJvYmFibHkgV2lkZUNoYXJUb011bHRpQnl0ZS4gICovCi0KLXZvaWQKLXVuaWNvZGVfcHJpbnQgKGUsIHVuaWNvZGUsIGxlbmd0aCkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3QgdW5pY2hhciAqdW5pY29kZTsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgdW5pY2hhciBjaDsKLQotICAgICAgaWYgKGxlbmd0aCA9PSAwKQotCXJldHVybjsKLSAgICAgIGlmIChsZW5ndGggPiAwKQotCS0tbGVuZ3RoOwotCi0gICAgICBjaCA9ICp1bmljb2RlOwotCi0gICAgICBpZiAoY2ggPT0gMCAmJiBsZW5ndGggPCAwKQotCXJldHVybjsKLQotICAgICAgKyt1bmljb2RlOwotCi0gICAgICBpZiAoKGNoICYgMHg3ZikgPT0gY2gpCi0JewotCSAgaWYgKGNoID09ICdcXCcpCi0JICAgIGZwdXRzICgiXFwiLCBlKTsKLQkgIGVsc2UgaWYgKGlzcHJpbnQgKGNoKSkKLQkgICAgcHV0YyAoY2gsIGUpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChjaCkKLQkJewotCQljYXNlIEVTQ0FQRV9BOgotCQkgIGZwdXRzICgiXFxhIiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBFU0NBUEVfQjoKLQkJICBmcHV0cyAoIlxcYiIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRVNDQVBFX0Y6Ci0JCSAgZnB1dHMgKCJcXGYiLCBlKTsKLQkJICBicmVhazsKLQotCQljYXNlIEVTQ0FQRV9OOgotCQkgIGZwdXRzICgiXFxuIiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBFU0NBUEVfUjoKLQkJICBmcHV0cyAoIlxcciIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRVNDQVBFX1Q6Ci0JCSAgZnB1dHMgKCJcXHQiLCBlKTsKLQkJICBicmVhazsKLQotCQljYXNlIEVTQ0FQRV9WOgotCQkgIGZwdXRzICgiXFx2IiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBmcHJpbnRmIChlLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgY2gpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgoY2ggJiAweGZmKSA9PSBjaCkKLQlmcHJpbnRmIChlLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgY2gpOwotICAgICAgZWxzZQotCWZwcmludGYgKGUsICJcXHgleCIsICh1bnNpZ25lZCBpbnQpIGNoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy93aW5kdW5pLmggYi9iaW51dGlscy93aW5kdW5pLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTlhZjIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvd2luZHVuaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogd2luZHVuaS5oIC0tIGhlYWRlciBmaWxlIGZvciB1bmljb2RlIHN1cHBvcnQgZm9yIHdpbmRyZXMgcHJvZ3JhbS4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLS8qIFRoaXMgaGVhZGVyIGZpbGUgZGVjbGFyZXMgdGhlIHR5cGVzIGFuZCBmdW5jdGlvbnMgd2UgdXNlIGZvcgotICAgdW5pY29kZSBzdXBwb3J0IGluIHdpbmRyZXMuICBPdXIgdW5pY29kZSBzdXBwb3J0IGlzIHZlcnkgbGltaXRlZCBhdAotICAgcHJlc2VudC4KLQotICAgV2UgZG9uJ3QgcHV0IHRoaXMgc3R1ZmYgaW4gd2luZHJlcy5oIHNvIHRoYXQgd2luZHVuaS5jIGRvZXNuJ3QgaGF2ZQotICAgdG8gaW5jbHVkZSB3aW5kcmVzLmguICB3aW5kdW5pLmMgbmVlZHMgdG8gaW5jbHVkZXMgd2luZG93cy5oLCBhbmQKLSAgIHRoYXQgd291bGQgY29uZmxpY3Qgd2l0aCB0aGUgZGVmaW5pdGlvbnMgb2YgV2luZG93cyBtYWNyb3Mgd2UKLSAgIGFscmVhZHkgaGF2ZSBpbiB3aW5kcmVzLmguICAqLwotCi0vKiBXZSB1c2UgdGhpcyB0eXBlIHRvIGhvbGQgYSB1bmljb2RlIGNoYXJhY3Rlci4gICovCi0KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdW5pY2hhcjsKLQotLyogRXNjYXBlIGNoYXJhY3RlciB0cmFuc2xhdGlvbnMuICAqLwotCi0jZGVmaW5lIEVTQ0FQRV9BICgwMDcpCi0jZGVmaW5lIEVTQ0FQRV9CICgwMTApCi0jZGVmaW5lIEVTQ0FQRV9GICgwMTQpCi0jZGVmaW5lIEVTQ0FQRV9OICgwMTIpCi0jZGVmaW5lIEVTQ0FQRV9SICgwMTUpCi0jZGVmaW5lIEVTQ0FQRV9UICgwMTEpCi0jZGVmaW5lIEVTQ0FQRV9WICgwMTMpCi0KLS8qIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgdW5pY29kZSBzdHJpbmcuICAqLwotCi1leHRlcm4gdm9pZCB1bmljb2RlX2Zyb21fYXNjaWkKLSAgUEFSQU1TICgoaW50ICosIHVuaWNoYXIgKiosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBQcmludCBhIHVuaWNvZGUgc3RyaW5nIHRvIGEgZmlsZS4gICovCi0KLWV4dGVybiB2b2lkIHVuaWNvZGVfcHJpbnQgUEFSQU1TICgoRklMRSAqLCBjb25zdCB1bmljaGFyICosIGludCkpOwotCi0vKiBXaW5kcmVzIHN1cHBvcnQgcm91dGluZSBjYWxsZWQgYnkgdW5pY29kZV9mcm9tX2FzY2lpLiAgVGhpcyBpcyBib3RoCi0gICBoZXJlIGFuZCBpbiB3aW5kcmVzLmguICBJdCBzaG91bGQgcHJvYmFibHkgYmUgaW4gYSBzZXBhcmF0ZSBoZWFkZXIKLSAgIGZpbGUsIGJ1dCBpdCBoYXJkbHkgc2VlbXMgd29ydGggaXQgZm9yIG9uZSBmdW5jdGlvbi4gICovCi0KLWV4dGVybiBQVFIgcmVzX2FsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvd3JzdGFicy5jIGIvYmludXRpbHMvd3JzdGFicy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjUxNTg3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3dyc3RhYnMuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MTYgKzAsMCBAQAotLyogd3JzdGFicy5jIC0tIE91dHB1dCBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgY29kZSB3aGljaCB3cml0ZXMgb3V0IHN0YWJzIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24uICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotCi0vKiBNZWFuaW5nbGVzcyBkZWZpbml0aW9uIG5lZWRzIGJ5IGFvdXQ2NC5oLiAgRklYTUUuICAqLwotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi0vKiBUaGUgc2l6ZSBvZiBhIHN0YWJzIHN5bWJvbC4gIFRoaXMgcHJlc3VtZXMgMzIgYml0IHZhbHVlcy4gICovCi0KLSNkZWZpbmUgU1RBQl9TWU1CT0xfU0laRSAoMTIpCi0KLS8qIEFuIGVudHJ5IGluIGEgc3RyaW5nIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIE5leHQgc3RyaW5nIGluIHRoaXMgdGFibGUuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKm5leHQ7Ci0gIC8qIEluZGV4IGluIHN0cmluZyB0YWJsZS4gICovCi0gIGxvbmcgaW5kZXg7Ci0gIC8qIFNpemUgb2YgdHlwZSBpZiB0aGlzIGlzIGEgdHlwZWRlZi4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotfTsKLQotLyogQSBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBzdHJpbmdfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgdGFibGU7Ci19OwotCi0vKiBUaGUgdHlwZSBzdGFjay4gIEVhY2ggZWxlbWVudCBvbiB0aGUgc3RhY2sgaXMgYSBzdHJpbmcuICAqLwotCi1zdHJ1Y3Qgc3RhYl90eXBlX3N0YWNrCi17Ci0gIC8qIFRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIHN0YWNrLiAgKi8KLSAgc3RydWN0IHN0YWJfdHlwZV9zdGFjayAqbmV4dDsKLSAgLyogVGhpcyBlbGVtZW50IGFzIGEgc3RyaW5nLiAgKi8KLSAgY2hhciAqc3RyaW5nOwotICAvKiBUaGUgdHlwZSBpbmRleCBvZiB0aGlzIGVsZW1lbnQuICAqLwotICBsb25nIGluZGV4OwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotICAvKiBXaGV0aGVyIHR5cGUgc3RyaW5nIGRlZmluZXMgYSBuZXcgdHlwZS4gICovCi0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgLyogU3RyaW5nIGRlZmluaW5nIHN0cnVjdCBmaWVsZHMuICAqLwotICBjaGFyICpmaWVsZHM7Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBzdHJpbmdzIGRlZmluaW5nIGJhc2UgY2xhc3NlcyBmb3IgYQotICAgICBjbGFzcy4gICovCi0gIGNoYXIgKipiYXNlY2xhc3NlczsKLSAgLyogU3RyaW5nIGRlZmluaW5nIGNsYXNzIG1ldGhvZHMuICAqLwotICBjaGFyICptZXRob2RzOwotICAvKiBTdHJpbmcgZGVmaW5pbmcgdnRhYmxlIHBvaW50ZXIgZm9yIGEgY2xhc3MuICAqLwotICBjaGFyICp2dGFibGU7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdHlwZSBpbmRpY2VzIGZvciB0YWdnZWQKLSAgIHR5cGVzLiAgKi8KLQotc3RydWN0IHN0YWJfdGFnCi17Ci0gIC8qIFRoZSB0eXBlIGluZGV4LiAgKi8KLSAgbG9uZyBpbmRleDsKLSAgLyogVGhlIHRhZyBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqdGFnOwotICAvKiBUaGUga2luZCBvZiB0eXBlLiAgVGhpcyBpcyBzZXQgdG8gREVCVUdfS0lORF9JTExFR0FMIHdoZW4gdGhlCi0gICAgIHR5cGUgaXMgZGVmaW5lZC4gICovCi0gIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSBzdHJ1Y3QuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLX07Ci0KLS8qIFdlIHJlbWVtYmVyIHZhcmlvdXMgc29ydHMgb2YgdHlwZSBpbmRpY2VzLiAgVGhleSBhcmUgbm90IHJlbGF0ZWQsCi0gICBidXQsIGZvciBjb252ZW5pZW5jZSwgd2Uga2VlcCBhbGwgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMKLSAgIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBzdGFiX3R5cGVfY2FjaGUKLXsKLSAgLyogVGhlIHZvaWQgdHlwZSBpbmRleC4gICovCi0gIGxvbmcgdm9pZF90eXBlOwotICAvKiBTaWduZWQgaW50ZWdlciB0eXBlIGluZGljZXMsIGluZGV4ZWQgYnkgc2l6ZSAtIDEuICAqLwotICBsb25nIHNpZ25lZF9pbnRlZ2VyX3R5cGVzWzhdOwotICAvKiBVbnNpZ25lZCBpbnRlZ2VyIHR5cGUgaW5kaWNlcywgaW5kZXhlZCBieSBzaXplIC0gMS4gICovCi0gIGxvbmcgdW5zaWduZWRfaW50ZWdlcl90eXBlc1s4XTsKLSAgLyogRmxvYXRpbmcgcG9pbnQgdHlwZXMsIGluZGV4ZWQgYnkgc2l6ZSAtIDEuICAqLwotICBsb25nIGZsb2F0X3R5cGVzWzE2XTsKLSAgLyogUG9pbnRlcnMgdG8gdHlwZXMsIGluZGV4ZWQgYnkgdGhlIHR5cGUgaW5kZXguICAqLwotICBsb25nICpwb2ludGVyX3R5cGVzOwotICBzaXplX3QgcG9pbnRlcl90eXBlc19hbGxvYzsKLSAgLyogRnVuY3Rpb25zIHJldHVybmluZyB0eXBlcywgaW5kZXhlZCBieSB0aGUgdHlwZSBpbmRleC4gICovCi0gIGxvbmcgKmZ1bmN0aW9uX3R5cGVzOwotICBzaXplX3QgZnVuY3Rpb25fdHlwZXNfYWxsb2M7Ci0gIC8qIFJlZmVyZW5jZXMgdG8gdHlwZXMsIGluZGV4ZWQgYnkgdGhlIHR5cGUgaW5kZXguICAqLwotICBsb25nICpyZWZlcmVuY2VfdHlwZXM7Ci0gIHNpemVfdCByZWZlcmVuY2VfdHlwZXNfYWxsb2M7Ci0gIC8qIFN0cnVjdC91bmlvbi9jbGFzcyB0eXBlIGluZGljZXMsIGluZGV4ZWQgYnkgdGhlIHN0cnVjdCBpZC4gICovCi0gIHN0cnVjdCBzdGFiX3RhZyAqc3RydWN0X3R5cGVzOwotICBzaXplX3Qgc3RydWN0X3R5cGVzX2FsbG9jOwotfTsKLQotLyogVGhpcyBpcyB0aGUgaGFuZGxlIHBhc3NlZCB0aHJvdWdoIGRlYnVnX3dyaXRlLiAgKi8KLQotc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlCi17Ci0gIC8qIFRoZSBCRkQuICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIFRoaXMgYnVmZmVyIGhvbGRzIHRoZSBzeW1ib2xzLiAgKi8KLSAgYmZkX2J5dGUgKnN5bWJvbHM7Ci0gIHNpemVfdCBzeW1ib2xzX3NpemU7Ci0gIHNpemVfdCBzeW1ib2xzX2FsbG9jOwotICAvKiBUaGlzIGlzIGEgbGlzdCBvZiBoYXNoIHRhYmxlIGVudHJpZXMgZm9yIHRoZSBzdHJpbmdzLiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzdHJpbmdzOwotICAvKiBUaGUgbGFzdCBzdHJpbmcgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqbGFzdF9zdHJpbmc7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSBzdHJpbmdzLiAgKi8KLSAgc2l6ZV90IHN0cmluZ3Nfc2l6ZTsKLSAgLyogVGhpcyBoYXNoIHRhYmxlIGVsaW1pbmF0ZXMgZHVwbGljYXRlIHN0cmluZ3MuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUgc3RyaGFzaDsKLSAgLyogVGhlIHR5cGUgc3RhY2suICAqLwotICBzdHJ1Y3Qgc3RhYl90eXBlX3N0YWNrICp0eXBlX3N0YWNrOwotICAvKiBUaGUgbmV4dCB0eXBlIGluZGV4LiAgKi8KLSAgbG9uZyB0eXBlX2luZGV4OwotICAvKiBUaGUgdHlwZSBjYWNoZS4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVfY2FjaGUgdHlwZV9jYWNoZTsKLSAgLyogQSBtYXBwaW5nIGZyb20gdHlwZWRlZiBuYW1lcyB0byB0eXBlIGluZGljZXMuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUgdHlwZWRlZl9oYXNoOwotICAvKiBJZiB0aGlzIGlzIG5vdCAtMSwgaXQgaXMgdGhlIG9mZnNldCB0byB0aGUgbW9zdCByZWNlbnQgTl9TTwotICAgICBzeW1ib2wsIGFuZCB0aGUgdmFsdWUgb2YgdGhhdCBzeW1ib2wgbmVlZHMgdG8gYmUgc2V0LiAgKi8KLSAgbG9uZyBzb19vZmZzZXQ7Ci0gIC8qIElmIHRoaXMgaXMgbm90IC0xLCBpdCBpcyB0aGUgb2Zmc2V0IHRvIHRoZSBtb3N0IHJlY2VudCBOX0ZVTgotICAgICBzeW1ib2wsIGFuZCB0aGUgdmFsdWUgb2YgdGhhdCBzeW1ib2wgbmVlZHMgdG8gYmUgc2V0LiAgKi8KLSAgbG9uZyBmdW5fb2Zmc2V0OwotICAvKiBUaGUgbGFzdCB0ZXh0IHNlY3Rpb24gYWRkcmVzcyBzZWVuLiAgKi8KLSAgYmZkX3ZtYSBsYXN0X3RleHRfYWRkcmVzczsKLSAgLyogVGhlIGJsb2NrIG5lc3RpbmcgZGVwdGguICAqLwotICB1bnNpZ25lZCBpbnQgbmVzdGluZzsKLSAgLyogVGhlIGZ1bmN0aW9uIGFkZHJlc3MuICAqLwotICBiZmRfdm1hIGZuYWRkcjsKLSAgLyogQSBwZW5kaW5nIExCUkFDIHN5bWJvbC4gICovCi0gIGJmZF92bWEgcGVuZGluZ19sYnJhYzsKLSAgLyogVGhlIGN1cnJlbnQgbGluZSBudW1iZXIgZmlsZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbGluZW5vX2ZpbGVuYW1lOwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3RyaW5nX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl93cml0ZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICosIGludCwgaW50LCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfcHVzaF9zdHJpbmcKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgbG9uZywgYm9vbGVhbiwKLQkgICB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICosIGxvbmcsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNoYXIgKnN0YWJfcG9wX3R5cGUgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfbW9kaWZ5X3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICosIGludCwgdW5zaWduZWQgaW50LCBsb25nICoqLCBzaXplX3QgKikpOwotc3RhdGljIGxvbmcgc3RhYl9nZXRfc3RydWN0X2luZGV4Ci0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKLQkgICBlbnVtIGRlYnVnX3R5cGVfa2luZCwgdW5zaWduZWQgaW50ICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY2xhc3NfbWV0aG9kX3ZhcgotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbiwgYmZkX3ZtYSwgYm9vbGVhbikpOwotCi1zdGF0aWMgYm9vbGVhbiBzdGFiX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfc3RhcnRfc291cmNlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2VtcHR5X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3ZvaWRfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfaW50X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZmxvYXRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jb21wbGV4X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfYm9vbF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2VudW1fdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYmZkX3NpZ25lZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9wb2ludGVyX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2Z1bmN0aW9uX3R5cGUgUEFSQU1TICgoUFRSLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfcmVmZXJlbmNlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3JhbmdlX3R5cGUgUEFSQU1TICgoUFRSLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfYXJyYXlfdHlwZQotICBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfb2Zmc2V0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX21ldGhvZF90eXBlIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2NvbnN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3ZvbGF0aWxlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3N0YXJ0X3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9zdHJ1Y3RfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEsIGJmZF92bWEsIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9lbmRfc3RydWN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3N0YXJ0X2NsYXNzX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBib29sZWFuLAotCSAgIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY2xhc3Nfc3RhdGljX21lbWJlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY2xhc3NfYmFzZWNsYXNzCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSwgYm9vbGVhbiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX3N0YXJ0X21ldGhvZCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuLAotCSAgIGJmZF92bWEsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY2xhc3NfZW5kX21ldGhvZCBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZW5kX2NsYXNzX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3R5cGVkZWZfdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl90YWdfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl90eXBkZWYgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdGFnIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2ludF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9mbG9hdF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3R5cGVkX2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3N0YXJ0X2Z1bmN0aW9uIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2Z1bmN0aW9uX3BhcmFtZXRlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfc3RhcnRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2VuZF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZW5kX2Z1bmN0aW9uIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9saW5lbm8KLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEpKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgc3RhYl9mbnMgPQotewotICBzdGFiX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQsCi0gIHN0YWJfc3RhcnRfc291cmNlLAotICBzdGFiX2VtcHR5X3R5cGUsCi0gIHN0YWJfdm9pZF90eXBlLAotICBzdGFiX2ludF90eXBlLAotICBzdGFiX2Zsb2F0X3R5cGUsCi0gIHN0YWJfY29tcGxleF90eXBlLAotICBzdGFiX2Jvb2xfdHlwZSwKLSAgc3RhYl9lbnVtX3R5cGUsCi0gIHN0YWJfcG9pbnRlcl90eXBlLAotICBzdGFiX2Z1bmN0aW9uX3R5cGUsCi0gIHN0YWJfcmVmZXJlbmNlX3R5cGUsCi0gIHN0YWJfcmFuZ2VfdHlwZSwKLSAgc3RhYl9hcnJheV90eXBlLAotICBzdGFiX3NldF90eXBlLAotICBzdGFiX29mZnNldF90eXBlLAotICBzdGFiX21ldGhvZF90eXBlLAotICBzdGFiX2NvbnN0X3R5cGUsCi0gIHN0YWJfdm9sYXRpbGVfdHlwZSwKLSAgc3RhYl9zdGFydF9zdHJ1Y3RfdHlwZSwKLSAgc3RhYl9zdHJ1Y3RfZmllbGQsCi0gIHN0YWJfZW5kX3N0cnVjdF90eXBlLAotICBzdGFiX3N0YXJ0X2NsYXNzX3R5cGUsCi0gIHN0YWJfY2xhc3Nfc3RhdGljX21lbWJlciwKLSAgc3RhYl9jbGFzc19iYXNlY2xhc3MsCi0gIHN0YWJfY2xhc3Nfc3RhcnRfbWV0aG9kLAotICBzdGFiX2NsYXNzX21ldGhvZF92YXJpYW50LAotICBzdGFiX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCwKLSAgc3RhYl9jbGFzc19lbmRfbWV0aG9kLAotICBzdGFiX2VuZF9jbGFzc190eXBlLAotICBzdGFiX3R5cGVkZWZfdHlwZSwKLSAgc3RhYl90YWdfdHlwZSwKLSAgc3RhYl90eXBkZWYsCi0gIHN0YWJfdGFnLAotICBzdGFiX2ludF9jb25zdGFudCwKLSAgc3RhYl9mbG9hdF9jb25zdGFudCwKLSAgc3RhYl90eXBlZF9jb25zdGFudCwKLSAgc3RhYl92YXJpYWJsZSwKLSAgc3RhYl9zdGFydF9mdW5jdGlvbiwKLSAgc3RhYl9mdW5jdGlvbl9wYXJhbWV0ZXIsCi0gIHN0YWJfc3RhcnRfYmxvY2ssCi0gIHN0YWJfZW5kX2Jsb2NrLAotICBzdGFiX2VuZF9mdW5jdGlvbiwKLSAgc3RhYl9saW5lbm8KLX07Ci0MCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1zdHJpbmdfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+bmV4dCA9IE5VTEw7Ci0gICAgICByZXQtPmluZGV4ID0gLTE7Ci0gICAgICByZXQtPnNpemUgPSAwOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgc3RyaW5nX2hhc2hfbG9va3VwKHQsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0KS0+dGFibGUsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogQWRkIGEgc3ltYm9sIHRvIHRoZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2UgYXJlIGJ1aWxkaW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCB0eXBlLCBkZXNjLCB2YWx1ZSwgc3RyaW5nKQotICAgICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm87Ci0gICAgIGludCB0eXBlOwotICAgICBpbnQgZGVzYzsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBiZmRfc2l6ZV90eXBlIHN0cng7Ci0gIGJmZF9ieXRlIHN5bVtTVEFCX1NZTUJPTF9TSVpFXTsKLQotICBpZiAoc3RyaW5nID09IE5VTEwpCi0gICAgc3RyeCA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZpbmZvLT5zdHJoYXNoLCBzdHJpbmcsIHRydWUsIHRydWUpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oInN0cmluZ19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVzXG4iKSwKLQkJICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChoLT5pbmRleCAhPSAtMSkKLQlzdHJ4ID0gaC0+aW5kZXg7Ci0gICAgICBlbHNlCi0JewotCSAgc3RyeCA9IGluZm8tPnN0cmluZ3Nfc2l6ZTsKLQkgIGgtPmluZGV4ID0gc3RyeDsKLQkgIGlmIChpbmZvLT5sYXN0X3N0cmluZyA9PSBOVUxMKQotCSAgICBpbmZvLT5zdHJpbmdzID0gaDsKLQkgIGVsc2UKLQkgICAgaW5mby0+bGFzdF9zdHJpbmctPm5leHQgPSBoOwotCSAgaW5mby0+bGFzdF9zdHJpbmcgPSBoOwotCSAgaW5mby0+c3RyaW5nc19zaXplICs9IHN0cmxlbiAoc3RyaW5nKSArIDE7Ci0JfQotICAgIH0KLQotICAvKiBUaGlzIHByZXN1bWVzIDMyIGJpdCB2YWx1ZXMuICAqLwotICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBzdHJ4LCBzeW0pOwotICBiZmRfcHV0XzggKGluZm8tPmFiZmQsIHR5cGUsIHN5bSArIDQpOwotICBiZmRfcHV0XzggKGluZm8tPmFiZmQsIDAsIHN5bSArIDUpOwotICBiZmRfcHV0XzE2IChpbmZvLT5hYmZkLCBkZXNjLCBzeW0gKyA2KTsKLSAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgdmFsdWUsIHN5bSArIDgpOwotCi0gIGlmIChpbmZvLT5zeW1ib2xzX3NpemUgKyBTVEFCX1NZTUJPTF9TSVpFID4gaW5mby0+c3ltYm9sc19hbGxvYykKLSAgICB7Ci0gICAgICBpbmZvLT5zeW1ib2xzX2FsbG9jICo9IDI7Ci0gICAgICBpbmZvLT5zeW1ib2xzID0gKGJmZF9ieXRlICopIHhyZWFsbG9jIChpbmZvLT5zeW1ib2xzLAotCQkJCQkgICAgIGluZm8tPnN5bWJvbHNfYWxsb2MpOwotICAgIH0KLQotICBtZW1jcHkgKGluZm8tPnN5bWJvbHMgKyBpbmZvLT5zeW1ib2xzX3NpemUsIHN5bSwgU1RBQl9TWU1CT0xfU0laRSk7Ci0KLSAgaW5mby0+c3ltYm9sc19zaXplICs9IFNUQUJfU1lNQk9MX1NJWkU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYSBzdHJpbmcgb24gdG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgc3RyaW5nLCBpbmRleCwgZGVmaW5pdGlvbiwgc2l6ZSkKLSAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGxvbmcgaW5kZXg7Ci0gICAgIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBzdGFiX3R5cGVfc3RhY2sgKnM7Ci0KLSAgcyA9IChzdHJ1Y3Qgc3RhYl90eXBlX3N0YWNrICopIHhtYWxsb2MgKHNpemVvZiAqcyk7Ci0gIHMtPnN0cmluZyA9IHhzdHJkdXAgKHN0cmluZyk7Ci0gIHMtPmluZGV4ID0gaW5kZXg7Ci0gIHMtPmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICBzLT5zaXplID0gc2l6ZTsKLQotICBzLT5maWVsZHMgPSBOVUxMOwotICBzLT5iYXNlY2xhc3NlcyA9IE5VTEw7Ci0gIHMtPm1ldGhvZHMgPSBOVUxMOwotICBzLT52dGFibGUgPSBOVUxMOwotCi0gIHMtPm5leHQgPSBpbmZvLT50eXBlX3N0YWNrOwotICBpbmZvLT50eXBlX3N0YWNrID0gczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIHR5cGUgaW5kZXggd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZGV4LCBzaXplKQotICAgICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm87Ci0gICAgIGxvbmcgaW5kZXg7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBjaGFyIGJ1ZlsyMF07Ci0KLSAgc3ByaW50ZiAoYnVmLCAiJWxkIiwgaW5kZXgpOwotICByZXR1cm4gc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgZmFsc2UsIHNpemUpOwotfQotCi0vKiBQb3AgYSB0eXBlIG9mZiB0aGUgdHlwZSBzdGFjay4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gICBmcmVlaW5nIHRoZSBzdHJpbmcuICAqLwotCi1zdGF0aWMgY2hhciAqCi1zdGFiX3BvcF90eXBlIChpbmZvKQotICAgICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm87Ci17Ci0gIHN0cnVjdCBzdGFiX3R5cGVfc3RhY2sgKnM7Ci0gIGNoYXIgKnJldDsKLQotICBzID0gaW5mby0+dHlwZV9zdGFjazsKLSAgYXNzZXJ0IChzICE9IE5VTEwpOwotCi0gIGluZm8tPnR5cGVfc3RhY2sgPSBzLT5uZXh0OwotCi0gIHJldCA9IHMtPnN0cmluZzsKLQotICBmcmVlIChzKTsKLQotICByZXR1cm4gcmV0OwotfQotDAotLyogVGhlIGdlbmVyYWwgcm91dGluZSB0byB3cml0ZSBvdXQgc3RhYnMgaW4gc2VjdGlvbnMgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbi4gIFRoaXMgYWNjdW11bGF0ZXMgdGhlIHN0YWJzIHN5bWJvbHMgYW5kIHRoZSBzdHJpbmdzIGluCi0gICB0d28gb2JzdGFja3MuICBXZSBjYW4ndCBlYXNpbHkgd3JpdGUgb3V0IHRoZSBpbmZvcm1hdGlvbiBhcyB3ZSBnbwotICAgYWxvbmcsIGJlY2F1c2Ugd2UgbmVlZCB0byBrbm93IHRoZSBzZWN0aW9uIHNpemVzIGJlZm9yZSB3ZSBjYW4KLSAgIHdyaXRlIG91dCB0aGUgc2VjdGlvbiBjb250ZW50cy4gIEFCRkQgaXMgdGhlIEJGRCBhbmQgREhBTkRMRSBpcyB0aGUKLSAgIGhhbmRsZSBmb3IgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgc2V0cyAqUFNZTVMgdG8gcG9pbnQgdG8KLSAgIHRoZSBzeW1ib2xzLCAqUFNZTVNJWkUgdGhlIHNpemUgb2YgdGhlIHN5bWJvbHMsICpQU1RSSU5HUyB0byB0aGUKLSAgIHN0cmluZ3MsIGFuZCAqUFNUUklOR1NJWkUgdG8gdGhlIHNpemUgb2YgdGhlIHN0cmluZ3MuICAqLwotCi1ib29sZWFuCi13cml0ZV9zdGFic19pbl9zZWN0aW9uc19kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgZGhhbmRsZSwgcHN5bXMsIHBzeW1zaXplLAotCQkJCQlwc3RyaW5ncywgcHN0cmluZ3NpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGJmZF9ieXRlICoqcHN5bXM7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnBzeW1zaXplOwotICAgICBiZmRfYnl0ZSAqKnBzdHJpbmdzOwotICAgICBiZmRfc2l6ZV90eXBlICpwc3RyaW5nc2l6ZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlIGluZm87Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqaDsKLSAgYmZkX2J5dGUgKnA7Ci0KLSAgaW5mby5hYmZkID0gYWJmZDsKLQotICBpbmZvLnN5bWJvbHNfc2l6ZSA9IDA7Ci0gIGluZm8uc3ltYm9sc19hbGxvYyA9IDUwMDsKLSAgaW5mby5zeW1ib2xzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKGluZm8uc3ltYm9sc19hbGxvYyk7Ci0KLSAgaW5mby5zdHJpbmdzID0gTlVMTDsKLSAgaW5mby5sYXN0X3N0cmluZyA9IE5VTEw7Ci0gIC8qIFJlc2VydmUgMSBieXRlIGZvciBhIG51bGwgYnl0ZS4gICovCi0gIGluZm8uc3RyaW5nc19zaXplID0gMTsKLQotICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmaW5mby5zdHJoYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jKQotICAgICAgfHwgISBiZmRfaGFzaF90YWJsZV9pbml0ICgmaW5mby50eXBlZGVmX2hhc2gudGFibGUsIHN0cmluZ19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgImJmZF9oYXNoX3RhYmxlX2luaXRfZmFpbGVkOiAlc1xuIiwKLQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLnR5cGVfc3RhY2sgPSBOVUxMOwotICBpbmZvLnR5cGVfaW5kZXggPSAxOwotICBtZW1zZXQgKCZpbmZvLnR5cGVfY2FjaGUsIDAsIHNpemVvZiBpbmZvLnR5cGVfY2FjaGUpOwotICBpbmZvLnNvX29mZnNldCA9IC0xOwotICBpbmZvLmZ1bl9vZmZzZXQgPSAtMTsKLSAgaW5mby5sYXN0X3RleHRfYWRkcmVzcyA9IDA7Ci0gIGluZm8ubmVzdGluZyA9IDA7Ci0gIGluZm8uZm5hZGRyID0gMDsKLSAgaW5mby5wZW5kaW5nX2xicmFjID0gKGJmZF92bWEpIC0xOwotCi0gIC8qIFRoZSBpbml0aWFsIHN5bWJvbCBob2xkcyB0aGUgc3RyaW5nIHNpemUuICAqLwotICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoJmluZm8sIDAsIDAsIDAsIChjb25zdCBjaGFyICopIE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBPdXRwdXQgYW4gaW5pdGlhbCBOX1NPIHN5bWJvbC4gICovCi0gIGluZm8uc29fb2Zmc2V0ID0gaW5mby5zeW1ib2xzX3NpemU7Ci0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sICgmaW5mbywgTl9TTywgMCwgMCwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBkZWJ1Z193cml0ZSAoZGhhbmRsZSwgJnN0YWJfZm5zLCAoUFRSKSAmaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFzc2VydCAoaW5mby5wZW5kaW5nX2xicmFjID09IChiZmRfdm1hKSAtMSk7Ci0KLSAgLyogT3V0cHV0IGEgdHJhaWxpbmcgTl9TTy4gICovCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sICgmaW5mbywgTl9TTywgMCwgaW5mby5sYXN0X3RleHRfYWRkcmVzcywKLQkJCSAgIChjb25zdCBjaGFyICopIE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBQdXQgdGhlIHN0cmluZyBzaXplIGluIHRoZSBpbml0aWFsIHN5bWJvbC4gICovCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGluZm8uc3RyaW5nc19zaXplLCBpbmZvLnN5bWJvbHMgKyA4KTsKLQotICAqcHN5bXMgPSBpbmZvLnN5bWJvbHM7Ci0gICpwc3ltc2l6ZSA9IGluZm8uc3ltYm9sc19zaXplOwotCi0gICpwc3RyaW5nc2l6ZSA9IGluZm8uc3RyaW5nc19zaXplOwotICAqcHN0cmluZ3MgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoaW5mby5zdHJpbmdzX3NpemUpOwotCi0gIHAgPSAqcHN0cmluZ3M7Ci0gICpwKysgPSAnXDAnOwotICBmb3IgKGggPSBpbmZvLnN0cmluZ3M7IGggIT0gTlVMTDsgaCA9IGgtPm5leHQpCi0gICAgewotICAgICAgc3RyY3B5ICgoY2hhciAqKSBwLCBoLT5yb290LnN0cmluZyk7Ci0gICAgICBwICs9IHN0cmxlbiAoKGNoYXIgKikgcCkgKyAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgd3JpdGluZyBvdXQgaW5mb3JtYXRpb24gZm9yIGEgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQgKHAsIGZpbGVuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICAvKiBXZSB3b3VsZCBub3JtYWxseSBvdXRwdXQgYW4gTl9TTyBzeW1ib2wgaGVyZS4gIEhvd2V2ZXIsIHRoYXQKLSAgICAgd291bGQgZm9yY2UgdXMgdG8gcmVzZXQgYWxsIG9mIG91ciB0eXBlIGluZm9ybWF0aW9uLiAgSSB0aGluayB3ZQotICAgICB3aWxsIGJlIGJldHRlciBvZmYganVzdCBvdXRwdXR0aW5nIGFuIE5fU09MIHN5bWJvbCwgYW5kIG5vdAotICAgICB3b3JyeWluZyBhYm91dCBzcGxpdHRpbmcgaW5mb3JtYXRpb24gYmV0d2VlbiBmaWxlcy4gICovCi0KLSAgaW5mby0+bGluZW5vX2ZpbGVuYW1lID0gZmlsZW5hbWU7Ci0KLSAgcmV0dXJuIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX1NPTCwgMCwgMCwgZmlsZW5hbWUpOwotfQotCi0vKiBTdGFydCB3cml0aW5nIG91dCBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfc3RhcnRfc291cmNlIChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgLyogRklYTUU6IFRoZSBzeW1ib2wncyB2YWx1ZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgdGV4dCBzZWN0aW9uCi0gICAgIGFkZHJlc3MuICBIb3dldmVyLCB3ZSB3b3VsZCBoYXZlIHRvIGZpbGwgaXQgaW4gbGF0ZXIsIGFuZCBnZGIKLSAgICAgZG9lc24ndCBjYXJlLCBzbyB3ZSBkb24ndCBib3RoZXIgd2l0aCBpdC4gICovCi0KLSAgaW5mby0+bGluZW5vX2ZpbGVuYW1lID0gZmlsZW5hbWU7Ci0KLSAgcmV0dXJuIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX1NPTCwgMCwgMCwgZmlsZW5hbWUpOwotfQotCi0vKiBQdXNoIGFuIGVtcHR5IHR5cGUuICBUaGlzIHNob3VsZG4ndCBub3JtYWxseSBoYXBwZW4uICBXZSBqdXN0IHVzZSBhCi0gICB2b2lkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9lbXB0eV90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIC8qIFdlIGRvbid0IGNhbGwgc3RhYl92b2lkX3R5cGUgaWYgdGhlIHR5cGUgaXMgbm90IHlldCBkZWZpbmVkLAotICAgICBiZWNhdXNlIHRoYXQgbWlnaHQgc2NyZXcgdXAgdGhlIHR5cGVkZWYuICAqLwotCi0gIGlmIChpbmZvLT50eXBlX2NhY2hlLnZvaWRfdHlwZSAhPSAwKQotICAgIHJldHVybiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBpbmZvLT50eXBlX2NhY2hlLnZvaWRfdHlwZSwgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIGluZGV4OwotICAgICAgY2hhciBidWZbNDBdOwotCi0gICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZD0lbGQiLCBpbmRleCwgaW5kZXgpOwotCi0gICAgICByZXR1cm4gc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgZmFsc2UsIDApOwotICAgIH0KLX0KLQotLyogUHVzaCBhIHZvaWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3ZvaWRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICBpZiAoaW5mby0+dHlwZV9jYWNoZS52b2lkX3R5cGUgIT0gMCkKLSAgICByZXR1cm4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5mby0+dHlwZV9jYWNoZS52b2lkX3R5cGUsIDApOwotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBpbmRleDsKLSAgICAgIGNoYXIgYnVmWzQwXTsKLQotICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICAgICAgKytpbmZvLT50eXBlX2luZGV4OwotCi0gICAgICBpbmZvLT50eXBlX2NhY2hlLnZvaWRfdHlwZSA9IGluZGV4OwotCi0gICAgICBzcHJpbnRmIChidWYsICIlbGQ9JWxkIiwgaW5kZXgsIGluZGV4KTsKLQotICAgICAgcmV0dXJuIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIHRydWUsIDApOwotICAgIH0KLX0KLQotLyogUHVzaCBhbiBpbnRlZ2VyIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9pbnRfdHlwZSAocCwgc2l6ZSwgdW5zaWduZWRwKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGxvbmcgKmNhY2hlOwotCi0gIGlmIChzaXplIDw9IDAgfHwgKHNpemUgPiBzaXplb2YgKGxvbmcpICYmIHNpemUgIT0gOCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJzdGFiX2ludF90eXBlOiBiYWQgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAodW5zaWduZWRwKQotICAgIGNhY2hlID0gaW5mby0+dHlwZV9jYWNoZS5zaWduZWRfaW50ZWdlcl90eXBlczsKLSAgZWxzZQotICAgIGNhY2hlID0gaW5mby0+dHlwZV9jYWNoZS51bnNpZ25lZF9pbnRlZ2VyX3R5cGVzOwotCi0gIGlmIChjYWNoZVtzaXplIC0gMV0gIT0gMCkKLSAgICByZXR1cm4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgY2FjaGVbc2l6ZSAtIDFdLCBzaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgaW5kZXg7Ci0gICAgICBjaGFyIGJ1ZlsxMDBdOwotCi0gICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0KLSAgICAgIGNhY2hlW3NpemUgLSAxXSA9IGluZGV4OwotCi0gICAgICBzcHJpbnRmIChidWYsICIlbGQ9ciVsZDsiLCBpbmRleCwgaW5kZXgpOwotICAgICAgaWYgKHVuc2lnbmVkcCkKLQl7Ci0JICBzdHJjYXQgKGJ1ZiwgIjA7Iik7Ci0JICBpZiAoc2l6ZSA8IHNpemVvZiAobG9uZykpCi0JICAgIHNwcmludGYgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgIiVsZDsiLCAoKGxvbmcpIDEgPDwgKHNpemUgKiA4KSkgLSAxKTsKLQkgIGVsc2UgaWYgKHNpemUgPT0gc2l6ZW9mIChsb25nKSkKLQkgICAgc3RyY2F0IChidWYsICItMTsiKTsKLQkgIGVsc2UgaWYgKHNpemUgPT0gOCkKLQkgICAgc3RyY2F0IChidWYsICIwMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzsiKTsKLQkgIGVsc2UKLQkgICAgYWJvcnQgKCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChzaXplIDw9IHNpemVvZiAobG9uZykpCi0JICAgIHNwcmludGYgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgIiVsZDslbGQ7IiwKLQkJICAgICAobG9uZykgLSAoKHVuc2lnbmVkIGxvbmcpIDEgPDwgKHNpemUgKiA4IC0gMSkpLAotCQkgICAgIChsb25nKSAoKCh1bnNpZ25lZCBsb25nKSAxIDw8IChzaXplICogOCAtIDEpKSAtIDEpKTsKLQkgIGVsc2UgaWYgKHNpemUgPT0gOCkKLQkgICAgc3RyY2F0IChidWYsICIwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDswNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3OyIpOwotCSAgZWxzZQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIHJldHVybiBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCB0cnVlLCBzaXplKTsKLSAgICB9Ci19Ci0KLS8qIFB1c2ggYSBmbG9hdGluZyBwb2ludCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZmxvYXRfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgaWYgKHNpemUgPiAwCi0gICAgICAmJiBzaXplIC0gMSA8IChzaXplb2YgaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlcwotCQkgICAgIC8gc2l6ZW9mIGluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXNbMF0pCi0gICAgICAmJiBpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzW3NpemUgLSAxXSAhPSAwKQotICAgIHJldHVybiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLAotCQkJCSAgIGluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXNbc2l6ZSAtIDFdLAotCQkJCSAgIHNpemUpOwotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBpbmRleDsKLSAgICAgIGNoYXIgKmludF90eXBlOwotICAgICAgY2hhciBidWZbNTBdOwotCi0gICAgICAvKiBGbG9hdHMgYXJlIGRlZmluZWQgYXMgYSBzdWJyYW5nZSBvZiBpbnQuICAqLwotICAgICAgaWYgKCEgc3RhYl9pbnRfdHlwZSAoaW5mbywgNCwgZmFsc2UpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGludF90eXBlID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLQotICAgICAgaWYgKHNpemUgPiAwCi0JICAmJiBzaXplIC0gMSA8IChzaXplb2YgaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlcwotCQkJIC8gc2l6ZW9mIGluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXNbMF0pKQotCWluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXNbc2l6ZSAtIDFdID0gaW5kZXg7Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZD1yJXM7JXU7MDsiLCBpbmRleCwgaW50X3R5cGUsIHNpemUpOwotCi0gICAgICBmcmVlIChpbnRfdHlwZSk7Ci0KLSAgICAgIHJldHVybiBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCB0cnVlLCBzaXplKTsKLSAgICB9Ci19Ci0KLS8qIFB1c2ggYSBjb21wbGV4IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9jb21wbGV4X3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyIGJ1Zls1MF07Ci0gIGxvbmcgaW5kZXg7Ci0KLSAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICArK2luZm8tPnR5cGVfaW5kZXg7Ci0KLSAgc3ByaW50ZiAoYnVmLCAiJWxkPXIlbGQ7JXU7MDsiLCBpbmRleCwgaW5kZXgsIHNpemUpOwotCi0gIHJldHVybiBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCB0cnVlLCBzaXplICogMik7Ci19Ci0KLS8qIFB1c2ggYSBib29sZWFuIHR5cGUuICBXZSB1c2UgYW4gWENPRkYgcHJlZGVmaW5lZCB0eXBlLCBzaW5jZSBnZGIKLSAgIGFsd2F5cyByZWNvZ25pemVzIHRoZW0uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9ib29sX3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBsb25nIGluZGV4OwotCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5kZXggPSAtMjE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjoKLSAgICAgIGluZGV4ID0gLTIyOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgNDoKLSAgICAgIGluZGV4ID0gLTE2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDg6Ci0gICAgICBpbmRleCA9IC0zMzsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5kZXgsIHNpemUpOwotfQotCi0vKiBQdXNoIGFuIGVudW0gdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2VudW1fdHlwZSAocCwgdGFnLCBuYW1lcywgdmFscykKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVzOwotICAgICBiZmRfc2lnbmVkX3ZtYSAqdmFsczsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBzaXplX3QgbGVuOwotICBjb25zdCBjaGFyICoqcG47Ci0gIGNoYXIgKmJ1ZjsKLSAgbG9uZyBpbmRleCA9IDA7Ci0gIGJmZF9zaWduZWRfdm1hICpwdjsKLQotICBpZiAobmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKHRhZyAhPSBOVUxMKTsKLQotICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMTAgKyBzdHJsZW4gKHRhZykpOwotICAgICAgc3ByaW50ZiAoYnVmLCAieGUlczoiLCB0YWcpOwotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGlzIGp1c3QgYSBndWVzcy4gICovCi0gICAgICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIDAsIGZhbHNlLCA0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmcmVlIChidWYpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGxlbiA9IDEwOwotICBpZiAodGFnICE9IE5VTEwpCi0gICAgbGVuICs9IHN0cmxlbiAodGFnKTsKLSAgZm9yIChwbiA9IG5hbWVzOyAqcG4gIT0gTlVMTDsgcG4rKykKLSAgICBsZW4gKz0gc3RybGVuICgqcG4pICsgMjA7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLQotICBpZiAodGFnID09IE5VTEwpCi0gICAgc3RyY3B5IChidWYsICJlIik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0gICAgICBzcHJpbnRmIChidWYsICIlczpUJWxkPWUiLCB0YWcsIGluZGV4KTsKLSAgICB9Ci0KLSAgZm9yIChwbiA9IG5hbWVzLCBwdiA9IHZhbHM7ICpwbiAhPSBOVUxMOyBwbisrLCBwdisrKQotICAgIHNwcmludGYgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgIiVzOiVsZCwiLCAqcG4sIChsb25nKSAqcHYpOwotICBzdHJjYXQgKGJ1ZiwgIjsiKTsKLQotICBpZiAodGFnID09IE5VTEwpCi0gICAgewotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGlzIGp1c3QgYSBndWVzcy4gICovCi0gICAgICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIDAsIGZhbHNlLCA0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGlzIGp1c3QgYSBndWVzcy4gICovCi0gICAgICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MU1lNLCAwLCAwLCBidWYpCi0JICB8fCAhIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZGV4LCA0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYSBtb2RpZmljYXRpb24gb2YgdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjay4gIENhY2hlIHRoZQotICAgcmVzdWx0cyBpbiBDQUNIRSBhbmQgQ0FDSEVfQUxMT0MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9tb2RpZnlfdHlwZSAoaW5mbywgbW9kLCBzaXplLCBjYWNoZSwgY2FjaGVfYWxsb2MpCi0gICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKLSAgICAgaW50IG1vZDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGxvbmcgKipjYWNoZTsKLSAgICAgc2l6ZV90ICpjYWNoZV9hbGxvYzsKLXsKLSAgbG9uZyB0YXJnaW5kZXg7Ci0gIGxvbmcgaW5kZXg7Ci0gIGNoYXIgKnMsICpidWY7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwpOwotICB0YXJnaW5kZXggPSBpbmZvLT50eXBlX3N0YWNrLT5pbmRleDsKLQotICBpZiAodGFyZ2luZGV4IDw9IDAKLSAgICAgIHx8IGNhY2hlID09IE5VTEwpCi0gICAgewotICAgICAgYm9vbGVhbiBkZWZpbml0aW9uOwotCi0gICAgICAvKiBFaXRoZXIgdGhlIHRhcmdldCB0eXBlIGhhcyBubyBpbmRleCwgb3Igd2UgYXJlbid0IGNhY2hpbmcKLSAgICAgICAgIHRoaXMgbW9kaWZpZXIuICBFaXRoZXIgd2F5IHdlIGhhdmUgbm8gd2F5IG9mIHJlY29yZGluZyB0aGUKLSAgICAgICAgIG5ldyB0eXBlLCBzbyB3ZSBkb24ndCBib3RoZXIgdG8gZGVmaW5lIG9uZS4gICovCi0gICAgICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgICAgIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyAyKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVjJXMiLCBtb2QsIHMpOwotICAgICAgZnJlZSAocyk7Ci0gICAgICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIDAsIGRlZmluaXRpb24sIHNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChzaXplX3QpIHRhcmdpbmRleCA+PSAqY2FjaGVfYWxsb2MpCi0JewotCSAgc2l6ZV90IGFsbG9jOwotCi0JICBhbGxvYyA9ICpjYWNoZV9hbGxvYzsKLQkgIGlmIChhbGxvYyA9PSAwKQotCSAgICBhbGxvYyA9IDEwOwotCSAgd2hpbGUgKChzaXplX3QpIHRhcmdpbmRleCA+PSBhbGxvYykKLQkgICAgYWxsb2MgKj0gMjsKLQkgICpjYWNoZSA9IChsb25nICopIHhyZWFsbG9jICgqY2FjaGUsIGFsbG9jICogc2l6ZW9mIChsb25nKSk7Ci0JICBtZW1zZXQgKCpjYWNoZSArICpjYWNoZV9hbGxvYywgMCwKLQkJICAoYWxsb2MgLSAqY2FjaGVfYWxsb2MpICogc2l6ZW9mIChsb25nKSk7Ci0JICAqY2FjaGVfYWxsb2MgPSBhbGxvYzsKLQl9Ci0KLSAgICAgIGluZGV4ID0gKCpjYWNoZSlbdGFyZ2luZGV4XTsKLSAgICAgIGlmIChpbmRleCAhPSAwICYmICEgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbikKLQl7Ci0JICAvKiBXZSBoYXZlIGFscmVhZHkgZGVmaW5lZCBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHR5cGUsIGFuZAotICAgICAgICAgICAgIHRoZSBlbnRyeSBvbiB0aGUgdHlwZSBzdGFjayBpcyBub3QgYSBkZWZpbml0aW9uLCBzbyB3ZQotICAgICAgICAgICAgIGNhbiBzYWZlbHkgZGlzY2FyZCBpdCAod2UgbWF5IGhhdmUgYSBkZWZpbml0aW9uIG9uIHRoZQotICAgICAgICAgICAgIHN0YWNrLCBldmVuIGlmIHdlIGFscmVhZHkgZGVmaW5lZCBhIG1vZGlmaWNhdGlvbiwgaWYgaXQKLSAgICAgICAgICAgICBpcyBhIHN0cnVjdCB3aGljaCB3ZSBkaWQgbm90IGRlZmluZSBhdCB0aGUgdGltZSBpdCB3YXMKLSAgICAgICAgICAgICByZWZlcmVuY2VkKS4gICovCi0JICBmcmVlIChzdGFiX3BvcF90eXBlIChpbmZvKSk7Ci0JICBpZiAoISBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBpbmRleCwgc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotCSAgKytpbmZvLT50eXBlX2luZGV4OwotCi0JICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0JICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMjApOwotCSAgc3ByaW50ZiAoYnVmLCAiJWxkPSVjJXMiLCBpbmRleCwgbW9kLCBzKTsKLQkgIGZyZWUgKHMpOwotCi0JICAoKmNhY2hlKVt0YXJnaW5kZXhdID0gaW5kZXg7Ci0KLQkgIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIHRydWUsIHNpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGZyZWUgKGJ1Zik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0gIAotCi0vKiBQdXNoIGEgcG9pbnRlciB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfcG9pbnRlcl90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIC8qIEZJWE1FOiBUaGUgc2l6ZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlIGFyY2hpdGVjdHVyZS4gICovCi0gIHJldHVybiBzdGFiX21vZGlmeV90eXBlIChpbmZvLCAnKicsIDQsICZpbmZvLT50eXBlX2NhY2hlLnBvaW50ZXJfdHlwZXMsCi0JCQkgICAmaW5mby0+dHlwZV9jYWNoZS5wb2ludGVyX3R5cGVzX2FsbG9jKTsKLX0KLQotLyogUHVzaCBhIGZ1bmN0aW9uIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9mdW5jdGlvbl90eXBlIChwLCBhcmdjb3VudCwgdmFyYXJncykKLSAgICAgUFRSIHA7Ci0gICAgIGludCBhcmdjb3VudDsKLSAgICAgYm9vbGVhbiB2YXJhcmdzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgaW50IGk7Ci0KLSAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVwcmVzZW50IHRoZSBhcmd1bWVudCB0eXBlcywgc28gd2UganVzdAotICAgICBkaXNjYXJkIHRoZW0uICBIb3dldmVyLCBpZiB0aGV5IGRlZmluZSBuZXcgdHlwZXMsIHdlIG11c3Qgb3V0cHV0Ci0gICAgIHRoZW0uICBXZSBkbyB0aGlzIGJ5IHByb2R1Y2luZyBlbXB0eSB0eXBlZGVmcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24pCi0JZnJlZSAoc3RhYl9wb3BfdHlwZSAoaW5mbykpOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKnMsICpidWY7Ci0KLQkgIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotCSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIDMpOwotCSAgc3ByaW50ZiAoYnVmLCAiOnQlcyIsIHMpOwotCSAgZnJlZSAocyk7Ci0KLQkgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgZnJlZSAoYnVmKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBzdGFiX21vZGlmeV90eXBlIChpbmZvLCAnZicsIDAsICZpbmZvLT50eXBlX2NhY2hlLmZ1bmN0aW9uX3R5cGVzLAotCQkJICAgJmluZm8tPnR5cGVfY2FjaGUuZnVuY3Rpb25fdHlwZXNfYWxsb2MpOwotfQotCi0vKiBQdXNoIGEgcmVmZXJlbmNlIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9yZWZlcmVuY2VfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICAvKiBGSVhNRTogVGhlIHNpemUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZSBhcmNoaXRlY3R1cmUuICAqLwotICByZXR1cm4gc3RhYl9tb2RpZnlfdHlwZSAoaW5mbywgJyYnLCA0LCAmaW5mby0+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+bmVzdGluZyA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9SQlJBQywgMCwgYWRkciAtIGluZm8tPmZuYWRkciwKLQkJCSAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLX0KLQotLyogRW5kIGEgZnVuY3Rpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1zdGFiX2VuZF9mdW5jdGlvbiAocCkKLSAgICAgUFRSIHAgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIGxpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfbGluZW5vIChwLCBmaWxlLCBsaW5lbm8sIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBsb25nIGxpbmVubzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5saW5lbm9fZmlsZW5hbWUgIT0gTlVMTCk7Ci0KLSAgaWYgKGFkZHIgPiBpbmZvLT5sYXN0X3RleHRfYWRkcmVzcykKLSAgICBpbmZvLT5sYXN0X3RleHRfYWRkcmVzcyA9IGFkZHI7Ci0KLSAgaWYgKHN0cmNtcCAoZmlsZSwgaW5mby0+bGluZW5vX2ZpbGVuYW1lKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX1NPTCwgMCwgYWRkciwgZmlsZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+bGluZW5vX2ZpbGVuYW1lID0gZmlsZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX1NMSU5FLCBsaW5lbm8sIGFkZHIgLSBpbmZvLT5mbmFkZHIsCi0JCQkgICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci19CmRpZmYgLS1naXQgYS9jb25maWctbWwuaW4gYi9jb25maWctbWwuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2Y3Y2YuLjAwMDAwMDAKLS0tIGEvY29uZmlnLW1sLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjg3ICswLDAgQEAKLSMgQ29uZmlndXJlIGZyYWdtZW50IGludm9rZWQgaW4gdGhlIHBvc3QtdGFyZ2V0IHNlY3Rpb24gZm9yIHN1YmRpcnMKLSMgd2FudGluZyBtdWx0aWxpYiBzdXBwb3J0LgotIwotIyBJdCBpcyBhZHZpc2FibGUgdG8gc3VwcG9ydCBhIGZldyAtLWVuYWJsZS8tLWRpc2FibGUgb3B0aW9ucyB0byBsZXQgdGhlCi0jIHVzZXIgc2VsZWN0IHdoaWNoIGxpYnJhcmllcyBzL2hlIHJlYWxseSB3YW50cy4KLSMKLSMgU3ViZGlyZWN0b3JpZXMgd2lzaGluZyB0byB1c2UgbXVsdGlsaWIgc2hvdWxkIHB1dCB0aGUgZm9sbG93aW5nIGxpbmVzCi0jIGluIHRoZSAicG9zdC10YXJnZXQiIHNlY3Rpb24gb2YgY29uZmlndXJlLmluLgotIwotIyBpZiBbICIke3NyY2Rpcn0iID0gIi4iIF0gOyB0aGVuCi0jICAgaWYgWyAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiAhPSAiLiIgXSA7IHRoZW4KLSMgICAgIC4gJHt3aXRoX211bHRpc3JjdG9wfS4uLy4uL2NvbmZpZy1tbC5pbgotIyAgIGVsc2UKLSMgICAgIC4gJHt3aXRoX211bHRpc3JjdG9wfS4uL2NvbmZpZy1tbC5pbgotIyAgIGZpCi0jIGVsc2UKLSMgICAuICR7c3JjZGlyfS8uLi9jb25maWctbWwuaW4KLSMgZmkKLSMKLSMgU2VlIGxpYnJ4L2NvbmZpZ3VyZS5pbiBpbiB0aGUgbGliZysrIGRpc3RyaWJ1dGlvbiBmb3IgYW4gZXhhbXBsZSBvZiBob3cKLSMgdG8gaGFuZGxlIGF1dG9jb25mJ2QgbGlicmFyaWVzLgotIwotIyBUaGluZ3MgYXJlIGNvbXBsaWNhdGVkIGJlY2F1c2UgNiBzZXBhcmF0ZSBjYXNlcyBtdXN0IGJlIGhhbmRsZWQ6Ci0jIDIgKG5hdGl2ZSwgY3Jvc3MpIHggMyAoYWJzb2x1dGUtcGF0aCwgcmVsYXRpdmUtbm90LWRvdCwgZG90KSA9IDYuCi0jCi0jIHNyY2Rpcj0uIGlzIHNwZWNpYWwuICBJdCBtdXN0IGhhbmRsZSBtYWtlIHByb2dyYW1zIHRoYXQgZG9uJ3QgaGFuZGxlIFZQQVRILgotIyBUbyBpbXBsZW1lbnQgdGhpcywgYSBzeW1saW5rIHRyZWUgaXMgYnVpbHQgZm9yIGVhY2ggbGlicmFyeSBhbmQgZm9yIGVhY2gKLSMgbXVsdGlsaWIgc3ViZGlyLgotIwotIyBUaGUgYnVpbGQgdHJlZSBpcyBsYXllZCBvdXQgYXMKLSMKLSMgLi8KLSMgICBsaWJnKysKLSMgICBuZXdsaWIKLSMgICBtNjgwMjAvCi0jICAgICAgICAgIGxpYmcrKwotIyAgICAgICAgICBuZXdsaWIKLSMgICAgICAgICAgbTY4ODgxLwotIyAgICAgICAgICAgICAgICAgbGliZysrCi0jICAgICAgICAgICAgICAgICBuZXdsaWIKLSMKLSMgVGhlIG5pY2UgZmVhdHVyZSBhYm91dCB0aGlzIGFycmFuZ2VtZW50IGlzIHRoYXQgaW50ZXItbGlicmFyeSByZWZlcmVuY2VzCi0jIGluIHRoZSBidWlsZCB0cmVlIHdvcmsgd2l0aG91dCBoYXZpbmcgdG8gY2FyZSB3aGVyZSB5b3UgYXJlLiAgTm90ZSB0aGF0Ci0jIGludGVyLWxpYnJhcnkgcmVmZXJlbmNlcyBhbHNvIHdvcmsgaW4gdGhlIHNvdXJjZSB0cmVlIGJlY2F1c2Ugc3ltbGluayB0cmVlcwotIyBhcmUgYnVpbHQgd2hlbiBzcmNkaXI9LgotIwotIyBVbmZvcnR1bmF0ZWx5LCB0cnlpbmcgdG8gYWNjZXNzIHRoZSBsaWJyYXJpZXMgaW4gdGhlIGJ1aWxkIHRyZWUgcmVxdWlyZXMKLSMgdGhlIHVzZXIgdG8gbWFudWFsbHkgY2hvb3NlIHdoaWNoIGxpYnJhcnkgdG8gdXNlIGFzIEdDQyB3b24ndCBiZSBhYmxlIHRvCi0jIGZpbmQgdGhlIHJpZ2h0IG9uZS4gIFRoaXMgaXMgdmlld2VkIGFzIHRoZSBsZXNzZXIgb2YgdHdvIGV2aWxzLgotIwotIyBDb25maWd1cmUgdmFyaWFibGVzOgotIyAke3dpdGhfdGFyZ2V0X3N1YmRpcn0gPSAiLiIgZm9yIG5hdGl2ZSwgb3IgJHt0YXJnZXRfYWxpYXN9IGZvciBjcm9zcy4KLSMgU2V0IGJ5IHRvcCBsZXZlbCBNYWtlZmlsZS4KLSMgJHt3aXRoX211bHRpc3JjdG9wfSA9IGhvdyBtYW55IGxldmVscyBvZiBtdWx0aWxpYnMgdGhlcmUgYXJlIGluIHRoZSBzb3VyY2UKLSMgdHJlZS4gIEl0IGV4aXN0cyB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgY29uZmlndXJpbmcgaW4gdGhlIHNvdXJjZSB0cmVlOgotIyAke3NyY2Rpcn0gaXMgbm90IGNvbnN0YW50LgotIyAke3dpdGhfbXVsdGlzdWJkaXJ9ID0gbmFtZSBvZiBtdWx0aWxpYiBzdWJkaXJlY3RvcnkgKGVnOiBtNjgwMjAvbTY4ODgxKS4KLSMKLSMgTWFrZWZpbGUgdmFyaWFibGVzOgotIyBNVUxUSVNSQ1RPUCA9IG51bWJlciBvZiBtdWx0aWxpYiBsZXZlbHMgaW4gc291cmNlIHRyZWUgKCsxIGlmIGNyb3NzKQotIyAoRklYTUU6IG5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0aGFuICR7d2l0aF9tdWx0aXNyY3RvcH0uICBDaGVjayBvdXQuKS4KLSMgTVVMVElCVUlMRFRPUCA9IG51bWJlciBvZiBtdWx0aWxpYiBsZXZlbHMgaW4gYnVpbGQgdHJlZQotIyBNVUxUSURJUlMgPSBsaXN0IG9mIG11bHRpbGliIHN1YmRpcnMgKGVnOiBtNjgwMDAgbTY4MDIwIC4uLikKLSMgKG9ubHkgZGVmaW5lZCBpbiBlYWNoIGxpYnJhcnkncyBtYWluIE1ha2VmaWxlKS4KLSMgTVVMVElTVUJESVIgPSBpbnN0YWxsZWQgc3ViZGlyZWN0b3J5IG5hbWUgd2l0aCBsZWFkaW5nICcvJyAoZWc6IC9tNjgwMDApCi0jIChvbmx5IGRlZmluZWQgaW4gZWFjaCBtdWx0aWxpYiBzdWJkaXIpLgotCi0jIEZJWE1FOiBNdWx0aWxpYiBpcyBjdXJyZW50bHkgZGlzYWJsZWQgYnkgZGVmYXVsdCBmb3IgZXZlcnl0aGluZyBvdGhlciB0aGFuCi0jIG5ld2xpYi4gIEl0IGlzIHVwIHRvIGVhY2ggdGFyZ2V0IHRvIHR1cm4gb24gbXVsdGlsaWIgc3VwcG9ydCBmb3IgdGhlIG90aGVyCi0jIGxpYnJhcmllcyBhcyBkZXNpcmVkLgotCi0jIFdlIGhhdmUgdG8gaGFuZGxlIGJlaW5nIGludm9rZWQgYnkgYm90aCBDeWdudXMgY29uZmlndXJlIGFuZCBBdXRvY29uZi4KLSMKLSMgQ3lnbnVzIGNvbmZpZ3VyZSBpbmNvbWluZyB2YXJpYWJsZXM6Ci0jIHNyY2Rpciwgc3ViZGlyLCBob3N0LCBhcmd1bWVudHMKLSMKLSMgQXV0b2NvbmYgaW5jb21pbmcgdmFyaWFibGVzOgotIyBzcmNkaXIsIGhvc3QsIGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIFdlICpjb3VsZCogZmlndXJlIHNyY2RpciBhbmQgaG9zdCBvdXQsIGJ1dCB3ZSdkIGhhdmUgdG8gZG8gd29yayB0aGF0Ci0jIG91ciBjYWxsZXIgaGFzIGFscmVhZHkgZG9uZSB0byBmaWd1cmUgdGhlbSBvdXQgYW5kIHJlcXVpcmluZyB0aGVzZSB0d28KLSMgc2VlbXMgcmVhc29uYWJsZS4KLSMgTm90ZSB0aGF0IGBob3N0JyBpbiB0aGlzIGNhc2UgaXMgR0NDJ3MgYHRhcmdldCcuICBUYXJnZXQgbGlicmFyaWVzIGFyZQotIyBjb25maWd1cmVkIGZvciBhIHBhcnRpY3VsYXIgaG9zdC4KLQotaWYgWyAtbiAiJHthY19jb25maWd1cmVfYXJnc30iIF07IHRoZW4KLSAgTWFrZWZpbGU9JHthY19maWxlLU1ha2VmaWxlfQotICBtbF9jb25maWdfc2hlbGw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSAgbWxfYXJndW1lbnRzPSIke2FjX2NvbmZpZ3VyZV9hcmdzfSIKLSAgbWxfcmVhbHNyY2Rpcj0ke3NyY2Rpcn0KLWVsc2UKLSAgTWFrZWZpbGU9JHtNYWtlZmlsZS1NYWtlZmlsZX0KLSAgbWxfY29uZmlnX3NoZWxsPSR7Y29uZmlnX3NoZWxsLS9iaW4vc2h9Ci0gIG1sX2FyZ3VtZW50cz0iJHthcmd1bWVudHN9IgotICBpZiBbIC1uICIke3N1YmRpcn0iIC1hICIke3N1YmRpcn0iICE9ICIuIiBdIDsgdGhlbgotICAgIG1sX3JlYWxzcmNkaXI9JHtzcmNkaXJ9LyR7c3ViZGlyfQotICBlbHNlCi0gICAgbWxfcmVhbHNyY2Rpcj0ke3NyY2Rpcn0KLSAgZmkKLWZpCi0KLSMgU2NhbiBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgc2V0IGFsbCB0aGUgb25lcyB3ZSBuZWVkLgotCi1tbF92ZXJib3NlPS0tdmVyYm9zZQotZm9yIG9wdGlvbiBpbiAke21sX2FyZ3VtZW50c30KLWRvCi0gIGNhc2UgJG9wdGlvbiBpbgotICAtLSopIDs7Ci0gIC0qKSBvcHRpb249LSRvcHRpb24gOzsKLSAgZXNhYwotCi0gIGNhc2UgJG9wdGlvbiBpbgotICAtLSo9KikKLQlvcHRhcmc9YGVjaG8gJG9wdGlvbiB8IHNlZCAtZSAncy9eW149XSo9Ly8nYAotCTs7Ci0gIGVzYWMKLQotICBjYXNlICRvcHRpb24gaW4KLSAgLS1kaXNhYmxlLSopCi0JZW5hYmxlb3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS1kaXNhYmxlLTplbmFibGVfOjtzOi06XzpnJ2AKLQlldmFsICRlbmFibGVvcHQ9bm8KLQk7OwotICAtLWVuYWJsZS0qKQotCWNhc2UgIiRvcHRpb24iIGluCi0JKj0qKQk7OwotCSopCW9wdGFyZz15ZXMgOzsKLQllc2FjCi0JZW5hYmxlb3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS06OjtzOj0uKiQ6OjtzOi06XzpnJ2AKLQlldmFsICRlbmFibGVvcHQ9IiRvcHRhcmciCi0JOzsKLSAgLS1ub3JlY3Vyc2lvbiB8IC0tbm8qKQotCW1sX25vcmVjdXJzaW9uPXllcwotCTs7Ci0gIC0tc2lsZW50IHwgLS1zaWwqIHwgLS1xdWlldCB8IC0tcSopCi0JbWxfdmVyYm9zZT0tLXNpbGVudAotCTs7Ci0gIC0tdmVyYm9zZSB8IC0tdiB8IC0tdmVyYiopCi0JbWxfdmVyYm9zZT0tLXZlcmJvc2UKLQk7OwotICAtLXdpdGgtKikKLQljYXNlICIkb3B0aW9uIiBpbgotCSo9KikJOzsKLQkqKQlvcHRhcmc9eWVzIDs7Ci0JZXNhYwotCXdpdGhvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6PS4qJDo6O3M6LTpfOmcnYAotCWV2YWwgJHdpdGhvcHQ9IiRvcHRhcmciCi0JOzsKLSAgLS13aXRob3V0LSopCi0Jd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czpvdXQ6OjtzOi06XzpnJ2AKLQlldmFsICR3aXRob3B0PW5vCi0JOzsKLSAgZXNhYwotZG9uZQotCi0jIE9ubHkgZG8gdGhpcyBpZiAtLWVuYWJsZS1tdWx0aWxpYi4KLWlmIFsgIiR7ZW5hYmxlX211bHRpbGlifSIgPSB5ZXMgXTsgdGhlbgotCi0jIENvbXB1dGUgd2hldGhlciB0aGlzIGlzIHRoZSBsaWJyYXJ5J3MgdG9wIGxldmVsIGRpcmVjdG9yeQotIyAoaWU6IG5vdCBhIG11bHRpbGliIHN1YmRpcmVjdG9yeSwgYW5kIG5vdCBhIHN1YmRpcmVjdG9yeSBsaWtlIGxpYmcrKy9zcmMpLgotIyAke3dpdGhfbXVsdGlzdWJkaXJ9IHRlbGxzIHVzIHdlJ3JlIGluIHRoZSByaWdodCBicmFuY2gsIGJ1dCB3ZSBjb3VsZCBiZQotIyBpbiBhIHN1YmRpciBvZiB0aGF0LgotIyA/Pz8gVGhlIHByZXZpb3VzIHZlcnNpb24gY291bGQgdm9pZCB0aGlzIHRlc3QgYnkgc2VwYXJhdGluZyB0aGUgcHJvY2VzcyBpbnRvCi0jIHR3byBmaWxlczogb25lIHRoYXQgb25seSB0aGUgbGlicmFyeSdzIHRvcGxldmVsIGNvbmZpZ3VyZS5pbiByYW4gKHRvCi0jIGNvbmZpZ3VyZSB0aGUgbXVsdGlsaWIgc3ViZGlycyksIGFuZCBhbm90aGVyIHRoYXQgYWxsIGNvbmZpZ3VyZS5pbidzIHJhbiB0bwotIyB1cGRhdGUgdGhlIE1ha2VmaWxlLiAgSXQgc2VlbWVkIHJlYXNvbmFibGUgdG8gY29sbGFwc2UgYWxsIG11bHRpbGliIHN1cHBvcnQKLSMgaW50byBvbmUgZmlsZSwgYnV0IGl0IGRvZXMgbGVhdmUgdXMgd2l0aCBoYXZpbmcgdG8gcGVyZm9ybSB0aGlzIHRlc3QuCi1tbF90b3BsZXZlbF9wPW5vCi1pZiBbIC16ICIke3dpdGhfbXVsdGlzdWJkaXJ9IiBdOyB0aGVuCi0gIGlmIFsgIiR7c3JjZGlyfSIgPSAiLiIgXTsgdGhlbgotICAgICMgVXNlICR7bWxfcmVhbHNyY2Rpcn0gaW5zdGVhZCBvZiAke3NyY2Rpcn0gaGVyZSB0byBhY2NvdW50IGZvciAke3N1YmRpcn0uCi0gICAgIyAke3dpdGhfdGFyZ2V0X3N1YmRpcn0gPSAiLiIgZm9yIG5hdGl2ZSwgb3RoZXJ3aXNlIHRhcmdldCBhbGlhcy4KLSAgICBpZiBbICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iID0gIi4iIF07IHRoZW4KLSAgICAgIGlmIFsgLWYgJHttbF9yZWFsc3JjZGlyfS8uLi9jb25maWctbWwuaW4gXTsgdGhlbgotCW1sX3RvcGxldmVsX3A9eWVzCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGlmIFsgLWYgJHttbF9yZWFsc3JjZGlyfS8uLi8uLi9jb25maWctbWwuaW4gXTsgdGhlbgotCW1sX3RvcGxldmVsX3A9eWVzCi0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFVzZSAke21sX3JlYWxzcmNkaXJ9IGluc3RlYWQgb2YgJHtzcmNkaXJ9IGhlcmUgdG8gYWNjb3VudCBmb3IgJHtzdWJkaXJ9LgotICAgIGlmIFsgLWYgJHttbF9yZWFsc3JjZGlyfS8uLi9jb25maWctbWwuaW4gXTsgdGhlbgotICAgICAgbWxfdG9wbGV2ZWxfcD15ZXMKLSAgICBmaQotICBmaQotZmkKLQotIyBJZiB0aGlzIGlzIHRoZSBsaWJyYXJ5J3MgdG9wIGxldmVsIGRpcmVjdG9yeSwgc2V0IG11bHRpZGlycyB0byB0aGUKLSMgbXVsdGlsaWIgc3ViZGlycyB0byBzdXBwb3J0LiAgVGhpcyBsaXZlcyBhdCB0aGUgdG9wIGJlY2F1c2Ugd2UgbmVlZAotIyBgbXVsdGlkaXJzJyBzZXQgcmlnaHQgYXdheS4KLQotaWYgWyAiJHttbF90b3BsZXZlbF9wfSIgPSB5ZXMgXTsgdGhlbgotCi1tdWx0aWRpcnM9Ci1mb3IgaSBpbiBgJHtDQy1nY2N9IC0tcHJpbnQtbXVsdGktbGliIDI+L2Rldi9udWxsYDsgZG8KLSAgZGlyPWBlY2hvICRpIHwgc2VkIC1lICdzLzsuKiQvLydgCi0gIGlmIFsgIiR7ZGlyfSIgPSAiLiIgXTsgdGhlbgotICAgIHRydWUKLSAgZWxzZQotICAgIGlmIFsgLXogIiR7bXVsdGlkaXJzfSIgXTsgdGhlbgotICAgICAgbXVsdGlkaXJzPSIke2Rpcn0iCi0gICAgZWxzZQotICAgICAgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHtkaXJ9IgotICAgIGZpCi0gIGZpCi1kb25lCi0KLSMgVGFyZ2V0IGxpYnJhcmllcyBhcmUgY29uZmlndXJlZCBmb3IgdGhlIGhvc3QgdGhleSBydW4gb24sIHNvIHdlIGNoZWNrCi0jICRob3N0IGhlcmUsIG5vdCAkdGFyZ2V0LgotCi1jYXNlICIke2hvc3R9IiBpbgotYXJjLSotZWxmKikKLQlpZiBbIHgkZW5hYmxlX2JpZW5kaWFuICE9IHh5ZXMgXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9JHttdWx0aWRpcnN9Ci0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR7eH0iIGluCi0JICAgICAgKmJlKikgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCTs7Ci1hcm0tKi0qKQotCWlmIFsgeCIkZW5hYmxlX2ZwdSIgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9JHttdWx0aWRpcnN9Ci0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR7eH0iIGluCi0JICAgICAgKmZwdSopIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgiJGVuYWJsZV8yNmJpdCIgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9JHttdWx0aWRpcnN9Ci0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR7eH0iIGluCi0JICAgICAgKjI2Yml0KikgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCIkZW5hYmxlX3VuZGVyc2NvcmUiID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSR7bXVsdGlkaXJzfQotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIke3h9IiBpbgotCSAgICAgICp1bmRlciopIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgiJGVuYWJsZV9pbnRlcndvcmsiID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSR7bXVsdGlkaXJzfQotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIke3h9IiBpbgotCSAgICAgICppbnRlcndvcmsqKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9iaWVuZGlhbiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbGUqICkgOiA7OwotCSAgICAgICpiZSogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JOzsKLW02OCotKi0qKQotCWlmIFsgeCRlbmFibGVfc29mdGZsb2F0ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICpzb2Z0LWZsb2F0KiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX202ODg4MSA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbTY4ODgxKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX202ODAwMCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbTY4MDAwKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX202ODAyMCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbTY4MDIwKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQk7OwotbWlwcyotKi0qKQotCWlmIFsgeCRlbmFibGVfc2luZ2xlX2Zsb2F0ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICpzaW5nbGUqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfYmllbmRpYW4gPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKmVsKiApIDogOzsKLQkgICAgICAqZWIqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfc29mdGZsb2F0ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICpzb2Z0LWZsb2F0KiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQk7OwotcG93ZXJwYyotKi0qIHwgcnM2MDAwKi0qLSopCi0JaWYgWyB4JGVuYWJsZV9zb2Z0ZmxvYXQgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKnNvZnQtZmxvYXQqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfcG93ZXJjcHUgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgcG93ZXIgfCAqL3Bvd2VyIHwgKi9wb3dlci8qICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfcG93ZXJwY2NwdSA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqcG93ZXJwYyogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9wb3dlcnBjb3MgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm1jYWxsLWxpbnV4KiB8ICptY2FsbC1zb2xhcmlzKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX2JpZW5kaWFuID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptbGl0dGxlKiB8ICptYmlnKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX3N5c3YgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm1jYWxsLXN5c3YqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfYWl4ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptY2FsbC1haXgqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCTs7Ci1lc2FjCi0KLSMgUmVtb3ZlIGV4dHJhbmVvdXMgYmxhbmtzIGZyb20gbXVsdGlkaXJzLgotIyBUZXN0cyBsaWtlIGBpZiBbIC1uICIkbXVsdGlkaXJzIiBdJyByZXF1aXJlIGl0LgotbXVsdGlkaXJzPWBlY2hvICIkbXVsdGlkaXJzIiB8IHNlZCAtZSAncy9eWyBdWyBdKi8vJyAtZSAncy9bIF1bIF0qJC8vJyAtZSAncy9bIF1bIF0qLyAvZydgCi0KLSMgQWRkIGNvZGUgdG8gbGlicmFyeSdzIHRvcCBsZXZlbCBtYWtlZmlsZSB0byBoYW5kbGUgYnVpbGRpbmcgdGhlIG11bHRpbGliCi0jIHN1YmRpcnMuCi0KLWNhdCA+IE11bHRpLnRlbSA8PFxFT0YKLQotIyBGSVhNRTogVGhlcmUgc2hvdWxkIGJlIGFuIEAtc2lnbiBpbiBmcm9udCBvZiB0aGUgYGlmJy4KLSMgTGVhdmUgb3V0IHVudGlsIHRoaXMgaXMgdGVzdGVkIGEgYml0IG1vcmUuCi1tdWx0aS1kbzoKLQlpZiBbIC16ICIkKE1VTFRJRElSUykiIF07IHRoZW4gXAotCSAgdHJ1ZTsgXAotCWVsc2UgXAotCSAgcm9vdHByZT1gcHdkYC87IGV4cG9ydCByb290cHJlOyBcCi0JICBzcmNyb290cHJlPWBjZCAkKHNyY2Rpcik7IHB3ZGAvOyBleHBvcnQgc3Jjcm9vdHByZTsgXAotCSAgbGliPWBlY2hvICQke3Jvb3RwcmV9IHwgc2VkIC1lICdzLF4uKi9cKFteL11bXi9dKlwpLyQkLFwxLCdgOyBcCi0JICBjb21waWxlcj0iJChDQykiOyBcCi0JICBmb3IgaSBpbiBgJCR7Y29tcGlsZXJ9IC0tcHJpbnQtbXVsdGktbGliIDI+L2Rldi9udWxsYDsgZG8gXAotCSAgICBkaXI9YGVjaG8gJCRpIHwgc2VkIC1lICdzLzsuKiQkLy8nYDsgXAotCSAgICBpZiBbICIkJHtkaXJ9IiA9ICIuIiBdOyB0aGVuIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGlmIFsgLWQgLi4vJCR7ZGlyfS8kJHtsaWJ9IF07IHRoZW4gXAotCQlmbGFncz1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXlteO10qOy8vJyAtZSAncy9ALyAtL2cnYDsgXAotCQlpZiAoY2QgLi4vJCR7ZGlyfS8kJHtsaWJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgXAotCQkJCUNGTEFHUz0iJChDRkxBR1MpICQke2ZsYWdzfSIgXAotCQkJCUNYWEZMQUdTPSIkKENYWEZMQUdTKSAkJHtmbGFnc30iIFwKLQkJCQlMSUJDRkxBR1M9IiQoTElCQ0ZMQUdTKSAkJHtmbGFnc30iIFwKLQkJCQlMSUJDWFhGTEFHUz0iJChMSUJDWFhGTEFHUykgJCR7ZmxhZ3N9IiBcCi0JCQkJTERGTEFHUz0iJChMREZMQUdTKSAkJHtmbGFnc30iIFwKLQkJCQkkKERPKSk7IHRoZW4gXAotCQkgIHRydWU7IFwKLQkJZWxzZSBcCi0JCSAgZXhpdCAxOyBcCi0JCWZpOyBcCi0JICAgICAgZWxzZSB0cnVlOyBcCi0JICAgICAgZmk7IFwKLQkgICAgZmk7IFwKLQkgIGRvbmU7IFwKLQlmaQotCi0jIEZJWE1FOiBUaGVyZSBzaG91bGQgYmUgYW4gQC1zaWduIGluIGZyb250IG9mIHRoZSBgaWYnLgotIyBMZWF2ZSBvdXQgdW50aWwgdGhpcyBpcyB0ZXN0ZWQgYSBiaXQgbW9yZS4KLW11bHRpLWNsZWFuOgotCWlmIFsgLXogIiQoTVVMVElESVJTKSIgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxzZSBcCi0JICBsaWI9YHB3ZCB8IHNlZCAtZSAncyxeLiovXChbXi9dW14vXSpcKSQkLFwxLCdgOyBcCi0JICBmb3IgZGlyIGluIE1ha2VmaWxlICQoTVVMVElESVJTKTsgZG8gXAotCSAgICBpZiBbIC1mIC4uLyQke2Rpcn0vJCR7bGlifS9NYWtlZmlsZSBdOyB0aGVuIFwKLQkgICAgICBpZiAoY2QgLi4vJCR7ZGlyfS8kJHtsaWJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChETykpOyBcCi0JICAgICAgdGhlbiB0cnVlOyBcCi0JICAgICAgZWxzZSBleGl0IDE7IFwKLQkgICAgICBmaTsgXAotCSAgICBlbHNlIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGRvbmU7IFwKLQlmaQotRU9GCi0KLWNhdCAke01ha2VmaWxlfSBNdWx0aS50ZW0gPiBNYWtlZmlsZS50ZW0KLXJtIC1mICR7TWFrZWZpbGV9IE11bHRpLnRlbQotbXYgTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9Ci0KLWZpICMgJHttbF90b3BsZXZlbF9wfSA9IHllcwotCi1pZiBbICIke21sX3ZlcmJvc2V9IiA9IC0tdmVyYm9zZSBdOyB0aGVuCi0gIGVjaG8gIkFkZGluZyBtdWx0aWxpYiBzdXBwb3J0IHRvIE1ha2VmaWxlIGluICR7bWxfcmVhbHNyY2Rpcn0iCi0gIGlmIFsgIiR7bWxfdG9wbGV2ZWxfcH0iID0geWVzIF07IHRoZW4KLSAgICBlY2hvICJtdWx0aWRpcnM9JHttdWx0aWRpcnN9IgotICBmaQotICBlY2hvICJ3aXRoX211bHRpc3ViZGlyPSR7d2l0aF9tdWx0aXN1YmRpcn0iCi1maQotCi1pZiBbICIke3NyY2Rpcn0iID0gIi4iIF07IHRoZW4KLSAgaWYgWyAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiAhPSAiLiIgXTsgdGhlbgotICAgIG1sX3NyY2RvdGRvdD0iLi4vIgotICBlbHNlCi0gICAgbWxfc3JjZG90ZG90PSIiCi0gIGZpCi1lbHNlCi0gIG1sX3NyY2RvdGRvdD0iIgotZmkKLQotaWYgWyAteiAiJHt3aXRoX211bHRpc3ViZGlyfSIgXTsgdGhlbgotICBtbF9zdWJkaXI9Ci0gIG1sX2J1aWxkZG90ZG90PQotICA6ICMgbWxfc3JjZG90ZG90PSAjIGFscmVhZHkgc2V0Ci1lbHNlCi0gIG1sX3N1YmRpcj0iLyR7d2l0aF9tdWx0aXN1YmRpcn0iCi0gICMgVGhlICdbXi9dW14vXSonIGFwcGVhcnMgdGhhdCB3YXkgdG8gd29yayBhcm91bmQgYSBTdW5PUyBzZWQgYnVnLgotICBtbF9idWlsZGRvdGRvdD1gZWNobyAke3dpdGhfbXVsdGlzdWJkaXJ9IHwgc2VkIC1lICdzOlteL11bXi9dKjouLjpnJ2AvCi0gIGlmIFsgIiRzcmNkaXIiID0gIi4iIF07IHRoZW4KLSAgICBtbF9zcmNkb3Rkb3Q9JHttbF9zcmNkb3Rkb3R9JHttbF9idWlsZGRvdGRvdH0KLSAgZWxzZQotICAgIDogIyBtbF9zcmNkb3Rkb3Q9ICMgYWxyZWFkeSBzZXQKLSAgZmkKLWZpCi0KLWlmIFsgIiR7bWxfdG9wbGV2ZWxfcH0iID0geWVzIF07IHRoZW4KLSAgbWxfZG89JyQoTUFLRSknCi0gIG1sX2NsZWFuPSckKE1BS0UpJwotZWxzZQotICBtbF9kbz10cnVlCi0gIG1sX2NsZWFuPXRydWUKLWZpCi0KLSMgVE9QIGlzIHVzZWQgYnkgbmV3bGliIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZWxzZXdoZXJlIGZvciB0aGlzIHB1cnBvc2UuCi0jIE1VTFRJe1NSQyxCVUlMRH1UT1AgYXJlIHRoZSBwcm9wZXIgb25lcyB0byB1c2UuICBNVUxUSVNSQ1RPUCBpcyBlbXB0eQotIyB3aGVuIHNyY2RpciAhPSBidWlsZGRpci4gIE1VTFRJQlVJTERUT1AgaXMgYWx3YXlzIHNvbWUgbnVtYmVyIG9mIC4uLydzLgotIyBGSVhNRTogbmV3bGliIG5lZWRzIHRvIGJlIHVwZGF0ZWQgdG8gdXNlIE1VTFRJe1NSQyxCVUlMRH1UT1Agc28gd2UgY2FuCi0jIGRlbGV0ZSBUT1AuICBOZXdsaWIgbWF5IHdpc2ggdG8gY29udGludWUgdG8gdXNlIFRPUCBmb3IgaXRzIG93biBwdXJwb3NlcwotIyBvZiBjb3Vyc2UuCi0jIE1VTFRJRElSUyBpcyBub24tZW1wdHkgZm9yIHRoZSBjcHUgdG9wIGxldmVsIE1ha2VmaWxlIChlZzogbmV3bGliL01ha2VmaWxlKQotIyBhbmQgbGlzdHMgdGhlIHN1YmRpcmVjdG9yaWVzIHRvIHJlY3Vyc2UgaW50by4KLSMgTVVMVElTVUJESVIgaXMgbm9uLWVtcHR5IGluIGVhY2ggY3B1IHN1YmRpcmVjdG9yeSdzIE1ha2VmaWxlCi0jIChlZzogbmV3bGliL2g4MzAwaC9NYWtlZmlsZSkgYW5kIGlzIHRoZSBpbnN0YWxsZWQgc3ViZGlyZWN0b3J5IG5hbWUgd2l0aAotIyBhIGxlYWRpbmcgJy8nLgotIyBNVUxUSURPIGlzIHVzZWQgZm9yIHRhcmdldHMgbGlrZSBhbGwsIGluc3RhbGwsIGFuZCBjaGVjayB3aGVyZQotIyAkKEZMQUdTX1RPX1BBU1MpIGF1Z21lbnRlZCB3aXRoIHRoZSBzdWJkaXIncyBjb21waWxlciBvcHRpb24gaXMgbmVlZGVkLgotIyBNVUxUSUNMRUFOIGlzIHVzZWQgZm9yIHRoZSAqY2xlYW4gdGFyZ2V0cy4KLSMKLSMgPz8/IEl0IGlzIHBvc3NpYmxlIHRvIG1lcmdlIE1VTFRJRE8gYW5kIE1VTFRJQ0xFQU4gaW50byBvbmUuICBUaGV5IGFyZQotIyBjdXJyZW50bHkga2VwdCBzZXBhcmF0ZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlICpjbGVhbiB0YXJnZXRzIHRvIHJlcXVpcmUKLSMgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgY29tcGlsZXIgKHdoaWNoIE1VTFRJRE8gY3VycmVudGx5IHJlcXVpcmVzKSBhbmQKLSMgdGhlcmVmb3JlIHdlJ2QgaGF2ZSB0byByZWNvcmQgdGhlIGRpcmVjdG9yeSBvcHRpb25zIGFzIHdlbGwgYXMgbmFtZXMKLSMgKGN1cnJlbnRseSB3ZSBqdXN0IHJlY29yZCB0aGUgbmFtZXMgYW5kIHVzZSAtLXByaW50LW11bHRpLWxpYiB0byBnZXQgdGhlCi0jIG9wdGlvbnMpLgotCi1zZWQgLWUgInM6XlRPUFsgCV0qPVsgCV0qXChbLi9dKlwpWyAJXSokOlRPUCA9ICR7bWxfYnVpbGRkb3Rkb3R9XDE6IiBcCi0gICAgLWUgInM6Xk1VTFRJU1JDVE9QWyAJXSo9LiokOk1VTFRJU1JDVE9QID0gJHttbF9zcmNkb3Rkb3R9OiIgXAotICAgIC1lICJzOl5NVUxUSUJVSUxEVE9QWyAJXSo9LiokOk1VTFRJQlVJTERUT1AgPSAke21sX2J1aWxkZG90ZG90fToiIFwKLSAgICAtZSAiczpeTVVMVElESVJTWyAJXSo9LiokOk1VTFRJRElSUyA9ICR7bXVsdGlkaXJzfToiIFwKLSAgICAtZSAiczpeTVVMVElTVUJESVJbIAldKj0uKiQ6TVVMVElTVUJESVIgPSAke21sX3N1YmRpcn06IiBcCi0gICAgLWUgInM6Xk1VTFRJRE9bIAldKj0uKiQ6TVVMVElETyA9ICRtbF9kbzoiIFwKLSAgICAtZSAiczpeTVVMVElDTEVBTlsgCV0qPS4qJDpNVUxUSUNMRUFOID0gJG1sX2NsZWFuOiIgXAotCSR7TWFrZWZpbGV9ID4gTWFrZWZpbGUudGVtCi1ybSAtZiAke01ha2VmaWxlfQotbXYgTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9Ci0KLSMgSWYgdGhpcyBpcyB0aGUgbGlicmFyeSdzIHRvcCBsZXZlbCwgY29uZmlndXJlIGVhY2ggbXVsdGlsaWIgc3ViZGlyLgotIyBUaGlzIGlzIGRvbmUgYXQgdGhlIGVuZCBiZWNhdXNlIHRoaXMgaXMgdGhlIGxvb3AgdGhhdCBydW5zIGNvbmZpZ3VyZQotIyBpbiBlYWNoIG11bHRpbGliIHN1YmRpciBhbmQgaXQgc2VlbWVkIHJlYXNvbmFibGUgdG8gZmluaXNoIHVwZGF0aW5nIHRoZQotIyBNYWtlZmlsZSBiZWZvcmUgZ29pbmcgb24gdG8gY29uZmlndXJlIHRoZSBzdWJkaXJzLgotCi1pZiBbICIke21sX3RvcGxldmVsX3B9IiA9IHllcyBdOyB0aGVuCi0KLSMgV2UgbXVzdCBmcmVzaGx5IGNvbmZpZ3VyZSBlYWNoIHN1YmRpcmVjdG9yeS4gIFRoaXMgYml0IG9mIGNvZGUgaXMKLSMgYWN0dWFsbHkgcGFydGlhbGx5IHN0b2xlbiBmcm9tIHRoZSBtYWluIGNvbmZpZ3VyZSBzY3JpcHQuICBGSVhNRS4KLQotaWYgWyAtbiAiJHttdWx0aWRpcnN9IiBdICYmIFsgLXogIiR7bWxfbm9yZWN1cnNpb259IiBdOyB0aGVuCi0KLSAgaWYgWyAiJHttbF92ZXJib3NlfSIgPSAtLXZlcmJvc2UgXTsgdGhlbgotICAgIGVjaG8gIlJ1bm5pbmcgY29uZmlndXJlIGluIG11bHRpbGliIHN1YmRpcnMgJHttdWx0aWRpcnN9IgotICAgIGVjaG8gInB3ZDogYHB3ZGAiCi0gIGZpCi0KLSAgbWxfb3JpZ2Rpcj1gcHdkYAotICBtbF9saWJkaXI9YGVjaG8gJG1sX29yaWdkaXIgfCBzZWQgLWUgJ3MsXi4qLywsJ2AKLSAgIyBjZCB0byB0b3AtbGV2ZWwtYnVpbGQtZGlyLyR7d2l0aF90YXJnZXRfc3ViZGlyfQotICBjZCAuLgotCi0gIGZvciBtbF9kaXIgaW4gJHttdWx0aWRpcnN9OyBkbwotCi0gICAgaWYgWyAiJHttbF92ZXJib3NlfSIgPSAtLXZlcmJvc2UgXTsgdGhlbgotICAgICAgZWNobyAiUnVubmluZyBjb25maWd1cmUgaW4gbXVsdGlsaWIgc3ViZGlyICR7bWxfZGlyfSIKLSAgICAgIGVjaG8gInB3ZDogYHB3ZGAiCi0gICAgZmkKLQotICAgIGlmIFsgLWQgJHttbF9kaXJ9IF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAke21sX2Rpcn07IGZpCi0gICAgaWYgWyAtZCAke21sX2Rpcn0vJHttbF9saWJkaXJ9IF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAke21sX2Rpcn0vJHttbF9saWJkaXJ9OyBmaQotCi0gICAgIyBFZzogaWYgJHttbF9kaXJ9ID0gbTY4MDAwL202ODg4MSwgZG90ZG90ID0gLi4vLi4vCi0gICAgZG90ZG90PS4uL2BlY2hvICR7bWxfZGlyfSB8IHNlZCAtZSAnc3xbXi9dfHxnJyAtZSAnc3wvfC4uL3xnJ2AKLQotICAgIGNhc2UgJHtzcmNkaXJ9IGluCi0gICAgIi4iKQotICAgICAgZWNobyBCdWlsZGluZyBzeW1saW5rIHRyZWUgaW4gYHB3ZGAvJHttbF9kaXJ9LyR7bWxfbGliZGlyfQotICAgICAgaWYgWyAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiAhPSAiLiIgXTsgdGhlbgotCW1sX3Vuc3ViZGlyPSIuLi8iCi0gICAgICBlbHNlCi0JbWxfdW5zdWJkaXI9IiIKLSAgICAgIGZpCi0gICAgICAoY2QgJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsKLSAgICAgICAuLi8ke2RvdGRvdH0ke21sX3Vuc3ViZGlyfXN5bWxpbmstdHJlZSAuLi8ke2RvdGRvdH0ke21sX3Vuc3ViZGlyfSR7bWxfbGliZGlyfSAiIikKLSAgICAgIGlmIFsgLWYgJHttbF9kaXJ9LyR7bWxfbGliZGlyfS9NYWtlZmlsZSBdOyB0aGVuCi0JaWYgWyB4IiR7TUFLRX0iID0geCBdOyB0aGVuCi0JICAoY2QgJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsgbWFrZSBkaXN0Y2xlYW4pCi0JZWxzZQotCSAgKGNkICR7bWxfZGlyfS8ke21sX2xpYmRpcn07ICR7TUFLRX0gZGlzdGNsZWFuKQotCWZpCi0gICAgICBmaQotICAgICAgbWxfbmV3c3JjZGlyPSIuIgotICAgICAgbWxfc3JjZGlyb3B0aW9uPQotICAgICAgbXVsdGlzcmN0b3A9JHtkb3Rkb3R9Ci0gICAgICA7OwotICAgICopCi0gICAgICBjYXNlICIke3NyY2Rpcn0iIGluCi0gICAgICAvKikgIyBhYnNvbHV0ZSBwYXRoCi0gICAgICAgIG1sX25ld3NyY2Rpcj0ke3NyY2Rpcn0KLSAgICAgICAgOzsKLSAgICAgICopICMgb3RoZXJ3aXNlIHJlbGF0aXZlCi0gICAgICAgIG1sX25ld3NyY2Rpcj0ke2RvdGRvdH0ke3NyY2Rpcn0KLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICAgIG1sX3NyY2Rpcm9wdGlvbj0iLXNyY2Rpcj0ke21sX25ld3NyY2Rpcn0iCi0gICAgICBtdWx0aXNyY3RvcD0KLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgY2FzZSAiJHtwcm9nbmFtZX0iIGluCi0gICAgLyopICAgICBtbF9yZWNwcm9nPSR7cHJvZ25hbWV9IDs7Ci0gICAgKikgICAgICBtbF9yZWNwcm9nPSR7ZG90ZG90fSR7cHJvZ25hbWV9IDs7Ci0gICAgZXNhYwotCi0gICAgIyBGSVhNRTogUE9QRElSPSR7UFdEPWBwd2RgfSBkb2Vzbid0IHdvcmsgaGVyZS4KLSAgICBNTF9QT1BESVI9YHB3ZGAKLSAgICBjZCAke21sX2Rpcn0vJHttbF9saWJkaXJ9Ci0KLSAgICBpZiBbIC1mICR7bWxfbmV3c3JjZGlyfS9jb25maWd1cmUgXTsgdGhlbgotICAgICAgbWxfcmVjcHJvZz0ke21sX25ld3NyY2Rpcn0vY29uZmlndXJlCi0gICAgZmkKLSAgICBpZiBldmFsICR7bWxfY29uZmlnX3NoZWxsfSAke21sX3JlY3Byb2d9IFwKLQktLXdpdGgtbXVsdGlzdWJkaXI9JHttbF9kaXJ9IC0td2l0aC1tdWx0aXNyY3RvcD0ke211bHRpc3JjdG9wfSBcCi0JJHttbF9hcmd1bWVudHN9ICR7bWxfc3JjZGlyb3B0aW9ufSA7IHRoZW4KLSAgICAgIHRydWUKLSAgICBlbHNlCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgY2QgJHtNTF9QT1BESVJ9Ci0KLSAgZG9uZQotCi0gIGNkICR7bWxfb3JpZ2Rpcn0KLWZpCi0KLWZpICMgJHttbF90b3BsZXZlbF9wfSA9IHllcwotZmkgIyAke2VuYWJsZV9tdWx0aWxpYn0gPSB5ZXMKZGlmZiAtLWdpdCBhL2NvbmZpZy5ndWVzcyBiL2NvbmZpZy5ndWVzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODg1ZjY2MS4uMDAwMDAwMAotLS0gYS9jb25maWcuZ3Vlc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA4ICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPGJvdGhuZXJAY3lnbnVzLmNvbT4uCi0jIFRoZSBtYXN0ZXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaXMgYXQgdGhlIEZTRiBpbiAvaG9tZS9nZC9nbnUvbGliLgotIwotIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCi0jIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAotIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KLSMKLSMgVGhlIHBsYW4gaXMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgY29uZmlndXJlIHNjcmlwdHMgaWYgeW91Ci0jIGRvbid0IHNwZWNpZnkgYW4gZXhwbGljaXQgc3lzdGVtIHR5cGUgKGhvc3QvdGFyZ2V0IG5hbWUpLgotIwotIyBPbmx5IGEgZmV3IHN5c3RlbXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoaXMgbGlzdDsgcGxlYXNlIGFkZCBvdGhlcnMKLSMgKGJ1dCB0cnkgdG8ga2VlcCB0aGUgc3RydWN0dXJlIGNsZWFuKS4KLSMKLQotIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KLSMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSA4LzI0Lzk0LikKLWlmICh0ZXN0IC1mIC8uYXR0YmluL3VuYW1lKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JUEFUSD0kUEFUSDovLmF0dGJpbiA7IGV4cG9ydCBQQVRICi1maQotCi1VTkFNRV9NQUNISU5FPWAodW5hbWUgLW0pIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9NQUNISU5FPXVua25vd24KLVVOQU1FX1JFTEVBU0U9YCh1bmFtZSAtcikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1JFTEVBU0U9dW5rbm93bgotVU5BTUVfU1lTVEVNPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9TWVNURU09dW5rbm93bgotVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCi0KLXRyYXAgJ3JtIC1mIGR1bW15LmMgZHVtbXkubyBkdW1teTsgZXhpdCAxJyAxIDIgMTUKLQotIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgotCi1jYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCi0gICAgYWxwaGE6T1NGMToqOiopCi0JaWYgdGVzdCAkVU5BTUVfUkVMRUFTRSA9ICJWNC4wIjsgdGhlbgotCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAotCWZpCi0JIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCi0JIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KLQkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KLQkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KLQljYXQgPDxFT0YgPmR1bW15LnMKLQkuZ2xvYmwgbWFpbgotCS5lbnQgbWFpbgotbWFpbjoKLQkuZnJhbWUgXCQzMCwwLFwkMjYsMAotCS5wcm9sb2d1ZSAwCi0JLmxvbmcgMHg0N2UwM2Q4MCAjIGltcGx2ZXIgJDAKLQlsZGEgXCQyLDI1OQotCS5sb25nIDB4NDdlMjBjMjEgIyBhbWFzayAkMiwkMQotCXNybCBcJDEsOCxcJDIKLQlzbGwgXCQyLDIsXCQyCi0Jc2xsIFwkMCwzLFwkMAotCWFkZGwgXCQxLFwkMCxcJDAKLQlhZGRsIFwkMixcJDAsXCQwCi0JcmV0IFwkMzEsKFwkMjYpLDEKLQkuZW5kIG1haW4KLUVPRgotCSR7Q0MtY2N9IGR1bW15LnMgLW8gZHVtbXkgMj4vZGV2L251bGwKLQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkuL2R1bW15Ci0JCWNhc2UgIiQ/IiBpbgotCQkJNykKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIKLQkJCQk7OwotCQkJMTUpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCi0JCQkJOzsKLQkJCTE0KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIKLQkJCQk7OwotCQkJMTApCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIKLQkJCQk7OwotCQkJMTYpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiCi0JCQkJOzsKLQkJZXNhYwotCWZpCi0Jcm0gLWYgZHVtbXkucyBkdW1teQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1ZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCi0JZXhpdCAwIDs7Ci0gICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQotCWVjaG8gYWxwaGEtZGVjLXdpbm50My41Ci0JZXhpdCAwIDs7Ci0gICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCi0JZWNobyBtNjhrLWNibS1zeXN2NAotCWV4aXQgMDs7Ci0gICAgYW1pZ2E6TmV0QlNEOio6KikKLSAgICAgIGVjaG8gbTY4ay1jYm0tbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotICAgICAgZXhpdCAwIDs7Ci0gICAgYW1pZ2E6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKLQlleGl0IDAgOzsKLSAgICBhcmM2NDpPcGVuQlNEOio6KikKLQllY2hvIG1pcHM2NGVsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhcmM6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGhrbWlwczpPcGVuQlNEOio6KikKLQllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHBtYXg6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHNnaTpPcGVuQlNEOio6KikKLQllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHdncmlzYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQotCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDA7OwotICAgIGFybTMyOk5ldEJTRDoqOiopCi0JZWNobyBhcm0tdW5rbm93bi1uZXRic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQlleGl0IDAgOzsKLSAgICBTUjI/MDE6SEktVVgvTVBQOio6KikKLQllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCi0JZXhpdCAwOzsKLSAgICBQeXJhbWlkKjpPU3gqOio6KnxNSVMqOk9TeCo6KjoqKQotCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCi0JaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MwotCWVsc2UKLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBOSUxFOio6KjpkY29zeCkKLQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0Ci0JZXhpdCAwIDs7Ci0gICAgc3VuNEg6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgaTg2cGM6U3VuT1M6NS4qOiopCi0JZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6Nio6KikKLQkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQotCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0Ci0JIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KLQllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOio6KikKLQljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCi0JICAgIFNlcmllcyp8UzQqKQotCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKLQkJOzsKLQllc2FjCi0JIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgotCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuMyo6U3VuT1M6KjoqKQotCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuKjoqOjQuMkJTRDoqKQotCVVOQU1FX1JFTEVBU0U9YChoZWFkIC0xIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAotCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKLQljYXNlICJgL2Jpbi9hcmNoYCIgaW4KLQkgICAgc3VuMykKLQkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQkJOzsKLQkgICAgc3VuNCkKLQkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JZXNhYwotCWV4aXQgMCA7OwotICAgIGF1c2hwOlN1bk9TOio6KikKLQllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhdGFyaSo6TmV0QlNEOio6KikKLQllY2hvIG02OGstYXRhcmktbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGF0YXJpKjpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHN1bjMqOk5ldEJTRDoqOiopCi0JZWNobyBtNjhrLXN1bi1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuMyo6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYWM2OGs6TmV0QlNEOio6KikKLQllY2hvIG02OGstYXBwbGUtbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hYzY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWU2OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lODhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcG93ZXJwYzptYWNodGVuOio6KikKLQllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSSVNDKjpNYWNoOio6KikKLQllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCi0JZXhpdCAwIDs7Ci0gICAgUklTQyo6VUxUUklYOio6KikKLQllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBWQVgqOlVMVFJJWCo6KjoqKQotCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgMjAyMDpDTElYOio6KikKLQllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCXNlZCAncy9eCS8vJyA8PCBFT0YgPmR1bW15LmMKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKiphcmd2OyB7Ci0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgXAotCSAgJiYgLi9kdW1teSBgZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCBcCi0JICAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCXJtIC1mIGR1bW15LmMgZHVtbXkKLQllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKLQllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAotCWV4aXQgMCA7OwotICAgIG04OGs6Q1gvVVg6Nyo6KikKLQllY2hvIG04OGstaGFycmlzLWN4dXg3Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azoqOjQqOlI0KikKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKLQlleGl0IDAgOzsKLSAgICBtODhrOio6Myo6UjMqKQotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MwotCWV4aXQgMCA7OwotICAgIEFWaWlPTjpkZ3V4Oio6KikKLSAgICAgICAgIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKLSAgICAgICAgVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKLSAgICAgICAgaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCAtbyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdIDsgdGhlbgotCWlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IFwKLQkgICAgIC1vICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXSA7IHRoZW4KLQkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JZWxzZQotCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KLQlmaQotICAgICAgICBlbHNlIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBmaQotIAlleGl0IDAgOzsKLSAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQotCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgTTg4KjoqOlIzKjoqKQotCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKLQllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKLQllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgMCA7OwotICAgICo6SVJJWCo6KjoqKQotCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKLQlleGl0IDAgOzsKLSAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCi0JZWNobyByb21wLWlibS1haXggICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKLSAgICBpPzg2OkFJWDoqOiopCi0JZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDAgOzsKLSAgICAqOkFJWDoyOjMpCi0JaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCXNlZCAncy9eCQkvLycgPDwgRU9GID5kdW1teS5jCi0JCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+Ci0KLQkJbWFpbigpCi0JCQl7Ci0JCQlpZiAoIV9fcG93ZXJfcGMoKSkKLQkJCQlleGl0KDEpOwotCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKLQkJCWV4aXQoMCk7Ci0JCQl9Ci1FT0YKLQkJJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAmJiAuL2R1bW15ICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi0JCXJtIC1mIGR1bW15LmMgZHVtbXkKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41Ci0JZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40Ci0JZWxzZQotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCi0JZmkKLQlleGl0IDAgOzsKLSAgICAqOkFJWDoqOjQpCi0JaWYgL3Vzci9zYmluL2xzYXR0ciAtRUhsIHByb2MwIHwgZ3JlcCBQT1dFUiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJSUJNX0FSQ0g9cnM2MDAwCi0JZWxzZQotCQlJQk1fQVJDSD1wb3dlcnBjCi0JZmkKLQlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KLQkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKLQllbHNlCi0JCUlCTV9SRVY9NC4ke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLQllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9Ci0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6KjoqKQotCWVjaG8gcnM2MDAwLWlibS1haXgKLQlleGl0IDAgOzsKLSAgICBpYm1ydDo0LjRCU0Q6Knxyb21wLWlibTpCU0Q6KikKLQllY2hvIHJvbXAtaWJtLWJzZDQuNAotCWV4aXQgMCA7OwotICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBOZXRCU0QgYW5kCi0JZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bwotCWV4aXQgMCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCi0gICAgKjpCT1NYOio6KikKLQllY2hvIHJzNjAwMC1idWxsLWJvc3gKLQlleGl0IDAgOzsKLSAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQotCWVjaG8gbTY4ay1idWxsLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC9bMzRdPz86NC4zYnNkOjEuKjoqKQotCWVjaG8gbTY4ay1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQotCWVjaG8gbTY4ay1ocC1ic2Q0LjQKLQlleGl0IDAgOzsKLSAgICAqOT8/KjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgMCA7OwotICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSApCi0KLSAgICAgICAgICAgICAgc2VkICdzL14gICAgICAgICAgICAgIC8vJyA8PCBFT0YgPmR1bW15LmMKLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgotICAgICAgICAgICAgICAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpbnQgbWFpbiAoKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKLSAgICAgICAgICAgICAgI2VuZGlmIAotICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNwdSkgCi0gICAgICAgICAgICAgIAl7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOwotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDogCi0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpIAotICAgICAgICAgICAgICAJCXsKLSAgICAgICAgICAgICAgCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOwotICAgICAgICAgICAgICAJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJCX0gYnJlYWs7Ci0gICAgICAgICAgICAgICNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCi0gICAgICAgICAgICAgIAkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICNlbmRpZiAKLSAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7Ci0gICAgICAgICAgICAgIH0KLUVPRgotCSgke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICkgJiYgSFBfQVJDSD1gLi9kdW1teWAKLQlybSAtZiBkdW1teS5jIGR1bW15Ci0JZXNhYwotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDAgOzsKLSAgICAzMDUwKjpISS1VWDoqOiopCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+ZHVtbXkuYwotCSNpbmNsdWRlIDx1bmlzdGQuaD4KLQlpbnQKLQltYWluICgpCi0JewotCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOwotCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKLQkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0Ci0JICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KLQkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoY3B1KQotCQl7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKLQkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7Ci0JICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZXhpdCAoMCk7Ci0JfQotRU9GCi0JJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAmJiAuL2R1bW15ICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi0Jcm0gLWYgZHVtbXkuYyBkdW1teQotCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKLQlleGl0IDAgOzsKLSAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCi0JZWNobyBocHBhMS4xLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCi0JZWNobyBocHBhMS4wLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBocDg/PzpPU0YxOio6KikKLQllY2hvIGhwcGExLjAtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaT84NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGFyaXNjKjpMaXRlcyo6KjoqKQotCWVjaG8gaHBwYTEuMS1ocC1saXRlcwotCWV4aXQgMCA7OwotICAgIGhwcGEqOk9wZW5CU0Q6KjoqKQotCWVjaG8gaHBwYS11bmtub3duLW9wZW5ic2QKLQlleGl0IDAgOzsKLSAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQotCWVjaG8gYzEtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKLQllY2hvIGM0LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQ1JBWSpYLU1QOio6KjoqKQotCWVjaG8geG1wLWNyYXktdW5pY29zCi0gICAgICAgIGV4aXQgMCA7OwotICAgIENSQVkqWS1NUDoqOio6KikKLQllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8KLQlleGl0IDAgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIENSQVktMjoqOio6KikKLQllY2hvIGNyYXkyLWNyYXktdW5pY29zCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEYzMDA6VU5JWF9TeXN0ZW1fVjoqOiopCi0gICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKLSAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKLSAgICAgICAgZWNobyAiZjMwMC1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEYzMDE6VU5JWF9TeXN0ZW1fVjoqOiopCi0gICAgICAgZWNobyBmMzAxLWZ1aml0c3UtdXhwdmBlY2hvICRVTkFNRV9SRUxFQVNFIHwgc2VkICdzLyAuKi8vJ2AKLSAgICAgICBleGl0IDAgOzsKLSAgICBocDNbMC05XVswNV06TmV0QlNEOio6KikKLQllY2hvIG02OGstaHAtbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGhwMzAwOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjpCU0QvMzg2Oio6KiB8ICo6QlNEL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkZyZWVCU0Q6KjoqKQotCWlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCi0JICAgIGlmIHRlc3QgImVsZiIgPSAiYC91c3IvYmluL29iamZvcm1hdGAiOyB0aGVuCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RlbGZgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovLydgCi0JCWV4aXQgMAotCSAgICBmaQotCWZpCi0gIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYAotCWV4aXQgMCA7OwotICAgICo6TmV0QlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1uZXRic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQlleGl0IDAgOzsKLSAgICAqOk9wZW5CU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9wZW5ic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQlleGl0IDAgOzsKLSAgICBpKjpbQ2NdW1l5XVtHZ11bV3ddW0lpXVtObl0qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbjMyCi0JZXhpdCAwIDs7Ci0gICAgaSo6TUlOR1cqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKLQlleGl0IDAgOzsKLSAgICBpKjpXaW5kb3dzX05UKjoqIHwgUGVudGl1bSo6V2luZG93c19OVCo6KikKLSAgICAgICAgIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gZ2VuZXJpYyBwb3NpeCBzdWJzeXN0ZW0/Ci0JIyBJdCBhbHNvIGNvbmZsaWN0cyB3aXRoIHByZS0yLjAgdmVyc2lvbnMgb2YgQVQmVCBVV0lOLiBTaG91bGQgd2UKLQkjIGNoYW5nZSBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZgotCSMgaTM4Nj8KLQllY2hvIGkzODYtcGMtaW50ZXJpeAotCWV4aXQgMCA7OwotICAgIGkqOlVXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KLQlleGl0IDAgOzsKLSAgICBwKjpDWUdXSU4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4zMgotCWV4aXQgMCA7OwotICAgIHByZXAqOlN1bk9TOjUuKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICAqOkdOVToqOiopCi0JZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCi0JZXhpdCAwIDs7Ci0gICAgKjpMaW51eDoqOiopCi0JIyB1bmFtZSBvbiB0aGUgQVJNIHByb2R1Y2VzIGFsbCBzb3J0cyBvZiBzdHJhbmdlbmVzcywgYW5kIHdlIG5lZWQgdG8KLQkjIGZpbHRlciBpdCBvdXQuCi0JY2FzZSAiJFVOQU1FX01BQ0hJTkUiIGluCi0JICBhcm12KikJCSAgICAgIFVOQU1FX01BQ0hJTkU9JFVOQU1FX01BQ0hJTkUgOzsKLQkgIGFybSogfCBzYTExMCopCSAgICAgIFVOQU1FX01BQ0hJTkU9ImFybSIgOzsKLQllc2FjCi0KLQkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbwotCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4KLQlsZF9oZWxwX3N0cmluZz1gbGQgLS1oZWxwIDI+JjFgCi0JbGRfc3VwcG9ydGVkX2VtdWxhdGlvbnM9YGVjaG8gJGxkX2hlbHBfc3RyaW5nIFwKLQkJCSB8IHNlZCAtbmUgJy9zdXBwb3J0ZWQgZW11bGF0aW9uczovIWQKLQkJCQkgICAgcy9bIAldWyAJXSovIC9nCi0JCQkJICAgIHMvLipzdXBwb3J0ZWQgZW11bGF0aW9uczogKi8vCi0JCQkJICAgIHMvIC4qLy8KLQkJCQkgICAgcCdgCi0gICAgICAgIGNhc2UgIiRsZF9zdXBwb3J0ZWRfZW11bGF0aW9ucyIgaW4KLQkgIGk/ODZsaW51eCkgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIgICAgICA7IGV4aXQgMCA7OwotCSAgaT84NmNvZmYpICAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVjb2ZmIiAgICAgIDsgZXhpdCAwIDs7Ci0JICBzcGFyY2xpbnV4KSBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIgOyBleGl0IDAgOzsKLQkgIGFybWxpbnV4KSAgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IiA7IGV4aXQgMCA7OwotCSAgbTY4a2xpbnV4KSAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWFvdXQiIDsgZXhpdCAwIDs7Ci0JICBlbGYzMnBwYyB8IGVsZjMycHBjbGludXgpCi0JCSMgRGV0ZXJtaW5lIExpYiBWZXJzaW9uCi0JCWNhdCA+ZHVtbXkuYyA8PEVPRgotI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0jaWYgZGVmaW5lZChfX0dMSUJDX18pCi1leHRlcm4gY2hhciBfX2xpYmNfdmVyc2lvbltdOwotZXh0ZXJuIGNoYXIgX19saWJjX3JlbGVhc2VbXTsKLSNlbmRpZgotbWFpbihhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqYXJndltdOwotewotI2lmIGRlZmluZWQoX19HTElCQ19fKQotICBwcmludGYoIiVzICVzXG4iLCBfX2xpYmNfdmVyc2lvbiwgX19saWJjX3JlbGVhc2UpOwotI2Vsc2UKLSAgcHJpbnRmKCJ1bmtvd25cbiIpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotRU9GCi0JCUxJQkM9IiIKLQkJJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbAotCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkJLi9kdW1teSB8IGdyZXAgMVwuOTkgPiAvZGV2L251bGwKLQkJCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCQkJTElCQz0ibGliYzEiCi0JCQlmaQotCQlmaQkKLQkJcm0gLWYgZHVtbXkuYyBkdW1teQotCQllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUke0xJQkN9IDsgZXhpdCAwIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAiYWxwaGEiIDsgdGhlbgotCQlzZWQgJ3MvXgkvLycgIDw8RU9GID5kdW1teS5zCi0JCS5nbG9ibCBtYWluCi0JCS5lbnQgbWFpbgotCW1haW46Ci0JCS5mcmFtZSBcJDMwLDAsXCQyNiwwCi0JCS5wcm9sb2d1ZSAwCi0JCS5sb25nIDB4NDdlMDNkODAgIyBpbXBsdmVyICQwCi0JCWxkYSBcJDIsMjU5Ci0JCS5sb25nIDB4NDdlMjBjMjEgIyBhbWFzayAkMiwkMQotCQlzcmwgXCQxLDgsXCQyCi0JCXNsbCBcJDIsMixcJDIKLQkJc2xsIFwkMCwzLFwkMAotCQlhZGRsIFwkMSxcJDAsXCQwCi0JCWFkZGwgXCQyLFwkMCxcJDAKLQkJcmV0IFwkMzEsKFwkMjYpLDEKLQkJLmVuZCBtYWluCi1FT0YKLQkJTElCQz0iIgotCQkke0NDLWNjfSBkdW1teS5zIC1vIGR1bW15IDI+L2Rldi9udWxsCi0JCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCQkuL2R1bW15Ci0JCQljYXNlICIkPyIgaW4KLQkJCTcpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGEiCi0JCQkJOzsKLQkJCTE1KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IgotCQkJCTs7Ci0JCQkxNCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCi0JCQkJOzsKLQkJCTEwKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCi0JCQkJOzsKLQkJCTE2KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgotCQkJCTs7Ci0JCQllc2FjCQotCi0JCQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIGR1bW15IHwgXAotCQkJICBncmVwIGxkLnNvLjEgPiAvZGV2L251bGwKLQkJCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCQkJTElCQz0ibGliYzEiCi0JCQlmaQotCQlmaQkKLQkJcm0gLWYgZHVtbXkucyBkdW1teQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUke0xJQkN9IDsgZXhpdCAwCi0JZWxpZiB0ZXN0ICIke1VOQU1FX01BQ0hJTkV9IiA9ICJtaXBzIiA7IHRoZW4KLQkgIGNhdCA+ZHVtbXkuYyA8PEVPRgotbWFpbihhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqYXJndltdOwotewotI2lmZGVmIF9fTUlQU0VCX18KLSAgcHJpbnRmICgiJXMtdW5rbm93bi1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOwotI2VuZGlmCi0jaWZkZWYgX19NSVBTRUxfXwotICBwcmludGYgKCIlc2VsLXVua25vd24tbGludXgtZ251XG4iLCBhcmd2WzFdKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLUVPRgotCSAgJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICIke1VOQU1FX01BQ0hJTkV9IiAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCSAgcm0gLWYgZHVtbXkuYyBkdW1teQotCWVsc2UKLQkgICMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKQotCSAgIyBvciBvbmUgdGhhdCBkb2VzIG5vdCBnaXZlIHVzIHVzZWZ1bCAtLWhlbHAuCi0JICAjIEdDQyB3YW50cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGxpbnV4LWdudW9sZGxkIGFuZCBsaW51eC1nbnVhb3V0LgotCSAgIyBJZiBsZCBkb2VzIG5vdCBwcm92aWRlICphbnkqICJzdXBwb3J0ZWQgZW11bGF0aW9uczoiCi0JICAjIHRoYXQgbWVhbnMgaXQgaXMgZ251b2xkbGQuCi0JICBlY2hvICIkbGRfaGVscF9zdHJpbmciIHwgZ3JlcCA+L2Rldi9udWxsIDI+JjEgInN1cHBvcnRlZCBlbXVsYXRpb25zOiIKLQkgIHRlc3QgJD8gIT0gMCAmJiBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudW9sZGxkIiAmJiBleGl0IDAKLQotCSAgY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KLQkgIGk/ODYpCi0JICAgIFZFTkRPUj1wYzsKLQkgICAgOzsKLQkgICopCi0JICAgIFZFTkRPUj11bmtub3duOwotCSAgICA7OwotCSAgZXNhYwotCSAgIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKLQkgIGNhdCA+ZHVtbXkuYyA8PEVPRgotI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWZkZWYgX19FTEZfXwotIyBpZmRlZiBfX0dMSUJDX18KLSMgIGlmIF9fR0xJQkNfXyA+PSAyCi0gICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudVxuIiwgYXJndlsxXSk7Ci0jICBlbHNlCi0gICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWxpYmMxXG4iLCBhcmd2WzFdKTsKLSMgIGVuZGlmCi0jIGVsc2UKLSAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVsaWJjMVxuIiwgYXJndlsxXSk7Ci0jIGVuZGlmCi0jZWxzZQotICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251YW91dFxuIiwgYXJndlsxXSk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci1FT0YKLQkgICR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwgJiYgLi9kdW1teSAiJHtVTkFNRV9NQUNISU5FfSIgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLQkgIHJtIC1mIGR1bW15LmMgZHVtbXkKLQlmaSA7OwotIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4gIGVhcmxpZXIgdmVyc2lvbnMKLSMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoIHN5c25hbWUgYW5kIG5vZGVuYW1lLgotICAgIGk/ODY6RFlOSVgvcHR4OjQqOiopCi0JZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKLQlleGl0IDAgOzsKLSAgICBpPzg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQotICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCi0gICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KLSAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAotCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KLSAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KLQlleGl0IDAgOzsKLSAgICBpPzg2Oio6NC4qOiogfCBpPzg2OlNZU1RFTV9WOjQuKjoqKQotCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWV4aXQgMCA7OwotICAgIGk/ODY6Kjo1OjcpCi0gICAgICAgVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKLSAgICAgICAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2Ci0gICAgICAgKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCi0gICAgICAgICAgICAgICAmJiBVTkFNRV9NQUNISU5FPWk1ODYKLSMgNS4wLjRjIHJldHVybnMgIlBlbnQgSUkiLiAgNS4wLjUgcmV0dXJucyBQZW50SUkKLSAgICAgICAoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnQuKklJJyA+L2Rldi9udWxsKSBcCi0gICAgICAgICAgICAgICAmJiBVTkFNRV9NQUNISU5FPWk2ODYKLSAgICAgICAoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCi0gICAgICAgICAgICAgICAmJiBVTkFNRV9NQUNISU5FPWk2ODYKLSAgICAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfS1zeXN2JHtVTkFNRV9SRUxFQVNFfQotICAgICAgIGV4aXQgMCA7OwotICAgIGk/ODY6KjozLjI6KikKLQlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCi0JCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKLQllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRJSScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCSgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudCBJSScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0gICAgICAgICAgICAgICAgKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCi0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCi0JZmkKLQlleGl0IDAgOzsKLSAgICBwYzoqOio6KikKLSAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKLSAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KLQllY2hvIGkzODYtcGMtbXNkb3NkamdwcAotICAgICAgICBleGl0IDAgOzsKLSAgICBJbnRlbDpNYWNoOjMqOiopCi0JZWNobyBpMzg2LXBjLW1hY2gzCi0JZXhpdCAwIDs7Ci0gICAgcGFyYWdvbjoqOio6KikKLQllY2hvIGk4NjAtaW50ZWwtb3NmMQotCWV4aXQgMCA7OwotICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKLQlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAotCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KLQkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBtaW5pKjpDVElYOlNZUyo1OiopCi0JIyAibWluaWZyYW1lIgotCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgotCWV4aXQgMCA7OwotICAgIE02OCo6KjpSM1ZbNTY3XSo6KikKLQl0ZXN0IC1yIC9zeXNWNjggJiYgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JyAmJiBleGl0IDAgOzsKLSAgICAzWzM0XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCkKLQlPU19SRUw9JycKLQl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKLQkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotCSAgJiYgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMAotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAotCSAgJiYgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMCA7OwotICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQotICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLSAgICAgICAgICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0ICYmIGV4aXQgMCA7OwotICAgIG02OCo6THlueE9TOjIuKjoqKQotCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCi0JZWNobyBtNjhrLWF0YXJpLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjpMeW54T1M6Mi4qOiopCi0JZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQotCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcnM2MDAwOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjIuKjoqKQotCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCi0JZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFJNKjpTSU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpTSU5JWC0qOio6KikKLQlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0Ci0JZWxzZQotCQllY2hvIG5zMzJrLXNuaS1zeXN2Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBQRU5USVVNOkNQdW5peDo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+Ci0gICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCi0JIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgotCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjoqOio6RlRYKikKLQkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KLQllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAotCWV4aXQgMCA7OwotICAgIG1jNjgqOkEvVVg6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbmV3cyo6TkVXUy1PUzoqOjYqKQotCWVjaG8gbWlwcy1zb255LW5ld3NvczYKLQlleGl0IDAgOzsKLSAgICBSMzAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSNDAwMDpVTklYX1NWOio6KikKLQlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KLQkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYmUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYXBwbGUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCi0JZWNobyBpNTg2LXBjLWJlb3MKLQlleGl0IDAgOzsKLWVzYWMKLQotI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCi0jZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCi0KLWNhdCA+ZHVtbXkuYyA8PEVPRgotI2lmZGVmIF9TRVFVRU5UXwotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLSNlbmRpZgotbWFpbiAoKQotewotI2lmIGRlZmluZWQgKHNvbnkpCi0jaWYgZGVmaW5lZCAoTUlQU0VCKQotICAvKiBCRkQgd2FudHMgImJzZCIgaW5zdGVhZCBvZiAibmV3c29zIi4gIFBlcmhhcHMgQkZEIHNob3VsZCBiZSBjaGFuZ2VkLAotICAgICBJIGRvbid0IGtub3cuLi4uICAqLwotICBwcmludGYgKCJtaXBzLXNvbnktYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotICBwcmludGYgKCJtNjhrLXNvbnktbmV3c29zJXNcbiIsCi0jaWZkZWYgTkVXU09TNAotICAgICAgICAgICI0IgotI2Vsc2UKLQkgICIiCi0jZW5kaWYKLSAgICAgICAgICk7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCi0gIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXgiKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKGhwMzAwKSAmJiAhZGVmaW5lZCAoaHB1eCkKLSAgcHJpbnRmICgibTY4ay1ocC1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTmVYVCkKLSNpZiAhZGVmaW5lZCAoX19BUkNISVRFQ1RVUkVfXykKLSNkZWZpbmUgX19BUkNISVRFQ1RVUkVfXyAibTY4ayIKLSNlbmRpZgotICBpbnQgdmVyc2lvbjsKLSAgdmVyc2lvbj1gKGhvc3RpbmZvIHwgc2VkIC1uICdzLy4qTmVYVCBNYWNoIFwoWzAtOV0qXCkuKi9cMS9wJykgMj4vZGV2L251bGxgOwotICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKLSNpZiBkZWZpbmVkIChVTUFYVikKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoQ01VKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX18zODZCU0RfXykKLSAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoc2VxdWVudCkKLSNpZiBkZWZpbmVkIChpMzg2KQotICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKG5zMzIwMDApCi0gIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCi0gICAgc3RydWN0IHV0c25hbWUgdW47Ci0KLSAgICB1bmFtZSgmdW4pOwotCi0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgewotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCi0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOwotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHZheCkKLSNpZiAhZGVmaW5lZCAodWx0cml4KQotICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQotICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotICBleGl0ICgxKTsKLX0KLUVPRgotCi0ke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLXJtIC1mIGR1bW15LmMgZHVtbXkKLQotIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgotCi10ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQgMDsgfQotCi0jIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCi0KLWlmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCi10aGVuCi0gICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KLSAgICBjMSopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzIqKQotCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYwotCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAotCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCi0JZmkKLQlleGl0IDAgOzsKLSAgICBjMzQqKQotCWVjaG8gYzM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjMzgqKQotCWVjaG8gYzM4LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKLSAgICBjNCopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgZXNhYwotZmkKLQotI2VjaG8gJyhVbmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUpJyAxPiYyCi0KLWV4aXQgMQpkaWZmIC0tZ2l0IGEvY29uZmlnLmlmIGIvY29uZmlnLmlmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MwMjY5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy5pZgorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMhIC9kZXYvbnVsbAotIyBEb24ndCBjYWxsIGl0IGRpcmVjdGx5LiBUaGlzIHNoZWxsIHNjcmlwdCBmcmFnbWVudCBpcyBjYWxsZWQgdG8KLSMgZGV0ZXJtaW5lOgotIwotIwkxLiBsaWJzdGN4eF9pbnRlcmZhY2U6IHRoZSBpbnRlcmZhY2UgbmFtZSBmb3IgbGlic3RkYysrLgotIwkyLiBjeHhfaW50ZXJmYWNlOiB0aGUgaW50ZXJmYWNlIG5hbWUgZm9yIGMrKy4KLSMJMy4gbGliY19pbnRlcmZhY2U6IHRoZSBpbnRlcmZhY2UgbmFtZSBmb3IgbGliYy4KLSMKLQotIyBHZXQgdGhlIHRvcCBsZXZlbCBzcmMgZGlyLgotaWYgWyAteiAiJHt0b3BzcmNkaXJ9IiAtYSAteiAiJHt0b3Bfc3JjZGlyfSIgXQotdGhlbgotICBlY2hvICJVbmRlZmluZWQgdG9wIGxldmVsIHNyYyBkaXI6IHRvcHNyY2RpciBhbmQgdG9wX3NyY2RpciBhcmUgZW1wdHkiID4mMgotICBleGl0IDEKLWZpCi0KLWlmIFsgLW4gIiR7dG9wc3JjZGlyfSIgXQotdGhlbgotICBpZl90b3BzcmNkaXI9JHt0b3BzcmNkaXJ9Ci1lbHNlCi0gIGlmX3RvcHNyY2Rpcj0ke3RvcF9zcmNkaXJ9Ci1maQotCi1pZiBbIC1mICR7aWZfdG9wc3JjZGlyfS9saWJzdGRjKysvTWFrZWZpbGUuaW4gXTsgdGhlbgotIyBXZSBjaGVjayBsaWJzdGRjKysgZm9yIGxpYnN0ZGN4eF9pbnRlcmZhY2UuCi1saWJzdGRjeHhfaW50ZXJmYWNlPWBncmVwICJeSU5URVJGQUNFIiAke2lmX3RvcHNyY2Rpcn0vbGlic3RkYysrL01ha2VmaWxlLmluIHwgc2VkICdzL0lOVEVSRkFDRVsgCV0qPVsgCV0qXCguKlwpL1wxLydgCi1lbHNlCi1saWJzdGRjeHhfaW50ZXJmYWNlPQotZmkKLQotaWYgWyAtZiAke2lmX3RvcHNyY2Rpcn0vZ2NjL2NwL01ha2VmaWxlLmluIF07IHRoZW4KLSMgV2UgY2hlY2sgZ2NjL2NwIGZvciBjeHhfaW50ZXJmYWNlLgotY3h4X2ludGVyZmFjZT1gZ3JlcCAiXklOVEVSRkFDRSIgJHtpZl90b3BzcmNkaXJ9L2djYy9jcC9NYWtlZmlsZS5pbiB8IHNlZCAncy9JTlRFUkZBQ0VbIAldKj1bIAldKlwoLipcKS9cMS8nYAotZWxzZQotY3h4X2ludGVyZmFjZT0KLWZpCi0KLSMgVGhlIHRyaWNraWVzdCBwYXJ0IGlzIGxpYmNfaW50ZXJmYWNlLgotaWYgWyAteiAiJHtsaWJjX2ludGVyZmFjZX0iIF0KLXRoZW4KLSAgY2FzZSAke3RhcmdldF9vc30gaW4KLSAgKmxpbnV4KmxpYmMxKnwqbGludXgqbGliYzUqKQotICAgIGNhc2UgJHt0YXJnZXRfYWxpYXN9IGluCi0gICAgKmFscGhhKnwqcG93ZXJwYyopCi0gICAgICBsaWJjX2ludGVyZmFjZT0tbGliYzUuOS0KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGxpYmNfaW50ZXJmYWNlPS1saWJjNS0KLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7Ci0gICpsaW51eCpnbnUqKQotICAgICMgV2UgaGF2ZSB0byB3b3JrIGhhcmRlciB0byBmaWd1cmUgaXQgb3V0LgotICAgIGlmIFsgJHt0YXJnZXRfYWxpYXN9ID0gJHtidWlsZF9hbGlhc30gXQotICAgIHRoZW4KLSAgICAgIGR1bW15PWlmJCQKLSAgICAgIGNhdCA+JGR1bW15LmMgPDxFT0YKLSNpbmNsdWRlIDxmZWF0dXJlcy5oPiAgICAgICAgICAgICAgICAgICAgICAKLW1haW4oYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7ICAgICAgICAgIAotICAgICBjaGFyICphcmd2W107Ci17Ci0gIHByaW50ZigiJWRcbiIsIF9fR0xJQkNfTUlOT1JfXyk7Ci0gIHJldHVybiAwOwotfQotRU9GCi0gICAgICAke0NDLWNjfSAkZHVtbXkuYyAtbyAkZHVtbXkgMj4vZGV2L251bGwKLSAgICAgIGlmIFsgIiQ/IiA9IDAgXQotICAgICAgdGhlbgotCWxpYmNfaW50ZXJmYWNlPS1saWJjNi5gLi8kZHVtbXlgLQotCXJtIC1mICRkdW1teS5jICRkdW1teQotICAgICAgZWxzZQotCSMgSXQgc2hvdWxkIG5ldmVyIGhhcHBlbi4KLQllY2hvICJDYW5ub3QgZmluZCB0aGUgR05VIEMgbGlicmFyeSBtaW5vciB2ZXJzaW9uIG51bWJlci4iID4mMgotCXJtIC1mICRkdW1teS5jICRkdW1teQotCWV4aXQgMQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAjIENyb3NzIGNvbXBpbGluZy4gQXNzdW1lIGdsaWJjIDIuMS4KLSAgICAgIGxpYmNfaW50ZXJmYWNlPS1saWJjNi4xLQotICAgIGZpCi0gICAgOzsKLSAgKikKLSAgICBsaWJjX2ludGVyZmFjZT0tCi0gICAgOzsKLSAgZXNhYwotZmkKZGlmZiAtLWdpdCBhL2NvbmZpZy5zdWIgYi9jb25maWcuc3ViCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMGYyZTk5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy5zdWIKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEzICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LCB2ZXJzaW9uIDEuMS4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCi0jIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKLSMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotIyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQ29uZmlndXJhdGlvbiBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIGFuZCBjYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIHR5cGUuCi0jIFN1cHBseSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdHlwZSBhcyBhbiBhcmd1bWVudC4KLSMgSWYgaXQgaXMgaW52YWxpZCwgd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGV4aXQgd2l0aCBjb2RlIDEuCi0jIE90aGVyd2lzZSwgd2UgcHJpbnQgdGhlIGNhbm9uaWNhbCBjb25maWcgdHlwZSBvbiBzdGRvdXQgYW5kIHN1Y2NlZWQuCi0KLSMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCi0jIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcwotIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgotIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucwotIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKLSMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcwotIyBjb25maWd1cmF0aW9uLgotCi0jIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgotIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgotIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQotIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06Ci0jCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQotIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCi0KLWlmIFsgeCQxID0geCBdCi10aGVuCi0JZWNobyBDb25maWd1cmF0aW9uIG5hbWUgbWlzc2luZy4gMT4mMgotCWVjaG8gIlVzYWdlOiAkMCBDUFUtTUZSLU9QU1lTIiAxPiYyCi0JZWNobyAib3IgICAgICQwIEFMSUFTIiAxPiYyCi0JZWNobyB3aGVyZSBBTElBUyBpcyBhIHJlY29nbml6ZWQgY29uZmlndXJhdGlvbiB0eXBlLiAxPiYyCi0JZXhpdCAxCi1maQotCi0jIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KLWNhc2UgJDEgaW4KLQkqbG9jYWwqKQotCQllY2hvICQxCi0JCWV4aXQgMAotCQk7OwotCSopCi0JOzsKLWVzYWMKLQotIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgotIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KLW1heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAotY2FzZSAkbWF5YmVfb3MgaW4KLSAgbGludXgtZ251KikKLSAgICBvcz0tJG1heWJlX29zCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKLSAgICA7OwotICAqKQotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKLSAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KLSAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCi0gICAgZWxzZSBvcz07IGZpCi0gICAgOzsKLWVzYWMKLQotIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCi0jIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbwotIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQotIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCi1jYXNlICRvcyBpbgotCS1zdW4qb3MqKQotCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KLQkJOzsKLQktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAotCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAotCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCi0JLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKLQktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAotCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAotCS1hcHBsZSkKLQkJb3M9Ci0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKLQkJb3M9Ci0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLQktc2NvdXQpCi0JCTs7Ci0JLXdycykKLQkJb3M9dnh3b3JrcwotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLWhpdXgqKQotCQlvcz0taGl1eHdlMgotCQk7OwotCS1zY281KQotCQlvcz0tc2NvMy4ydjUKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY280KQotCQlvcz0tc2NvMy4ydjQKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjIuWzQtOV0qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4ydls0LTldKikKLQkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28qKQotCQlvcz0tc2NvMy4ydjIKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS11ZGsqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWlzYykKLQkJb3M9LWlzYzIuMgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWNsaXgqKQotCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAotCQk7OwotCS1pc2MqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLWx5bngqKQotCQlvcz0tbHlueG9zCi0JCTs7Ci0JLXB0eCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAotCQk7OwotCS13aW5kb3dzbnQqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCi0JCTs7Ci0JLXBzb3MqKQotCQlvcz0tcHNvcwotCQk7OwotZXNhYwotCi0jIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgotCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCi0JdGFob2UgfCBpODYwIHwgbTMyciB8IG02OGsgfCBtNjgwMDAgfCBtODhrIHwgbnMzMmsgfCBhcmMgfCBhcm0gXAotCQl8IGFybWVbbGJdIHwgcHlyYW1pZCB8IG1uMTAyMDAgfCBtbjEwMzAwIHwgdHJvbiB8IGEyOWsgXAotCQl8IDU4MCB8IGk5NjAgfCBoODMwMCBcCi0JCXwgaHBwYSB8IGhwcGExLjAgfCBocHBhMS4xIHwgaHBwYTIuMCB8IGhwcGEyLjB3IHwgaHBwYTIuMG4gXAotCQl8IGFscGhhIHwgYWxwaGFldls0LThdIHwgYWxwaGFldjU2IHwgYWxwaGFwY2E1WzY3XSBcCi0JCXwgd2UzMmsgfCBuczE2ayB8IGNsaXBwZXIgfCBpMzcwIHwgc2ggfCBwb3dlcnBjIHwgcG93ZXJwY2xlIFwKLQkJfCAxNzUwYSB8IGRzcDE2eHggfCBwZHAxMSB8IG1pcHMxNiB8IG1pcHM2NCB8IG1pcHNlbCB8IG1pcHM2NGVsIFwKLQkJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAotCQl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIHwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgXAotCQl8IG1pcHM2NHZyNTAwMCB8IG1pcHJzNjR2cjUwMDBlbCB8IG1jb3JlIFwKLQkgICAgICAgIHwgbTg4MTEwIHwgbTY4MFswMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgejhrIHwgdjcwIFwKLQkJfCBzcGFyYyB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmM2NCB8IHNwYXJjODZ4IHwgc3BhcmN2OSBcCi0JCXwgdGh1bWIgfCB2ODUwIHwgYzR4IHwgZDEwdiB8IGg4NTAwIHwgdzY1IHwgZnIzMCB8IHBqIHwgcGpsKQotCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KLQkJOzsKLQkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJwotCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAotCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KLQlpWzM0NTY3XTg2KQotCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYwotCSAgOzsKLQkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgotCSotKi0qKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KLQl2YXgtKiB8IHRhaG9lLSogfCBpWzM0NTY3XTg2LSogfCBpODYwLSogfCBtMzJyLSogfCBtNjhrLSogfCBtNjgwMDAtKiBcCi0JICAgICAgfCBtODhrLSogfCBzcGFyYy0qIHwgbnMzMmstKiB8IGZ4ODAtKiB8IGFyYy0qIHwgYXJtLSogfCBjWzEyM10qIFwKLQkgICAgICB8IG1pcHMtKiB8IHB5cmFtaWQtKiB8IHRyb24tKiB8IGEyOWstKiB8IHJvbXAtKiB8IHJzNjAwMC0qIFwKLQkgICAgICB8IHBvd2VyLSogfCBub25lLSogfCA1ODAtKiB8IGNyYXkyLSogfCBoODMwMC0qIHwgaDg1MDAtKiB8IGk5NjAtKiBcCi0JICAgICAgfCB4bXAtKiB8IHltcC0qIFwKLQkgICAgICB8IGhwcGEtKiB8IGhwcGExLjAtKiB8IGhwcGExLjEtKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjB3LSogfCBocHBhMi4wbi0qIFwKLQkgICAgICB8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFwY2E1WzY3XS0qIFwKLQkgICAgICB8IHdlMzJrLSogfCBjeWRyYS0qIHwgbnMxNmstKiB8IHBuLSogfCBucDEtKiB8IHhwczEwMC0qIFwKLQkgICAgICB8IGNsaXBwZXItKiB8IG9yaW9uLSogXAotCSAgICAgIHwgc3BhcmNsaXRlLSogfCBwZHAxMS0qIHwgc2gtKiB8IHBvd2VycGMtKiB8IHBvd2VycGNsZS0qIFwKLQkgICAgICB8IHNwYXJjNjQtKiB8IHNwYXJjdjktKiB8IHNwYXJjODZ4LSogfCBtaXBzMTYtKiB8IG1pcHM2NC0qIHwgbWlwc2VsLSogXAotCSAgICAgIHwgbWlwczY0ZWwtKiB8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogXAotCSAgICAgIHwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIHwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKLQkgICAgICB8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogfCBtY29yZS0qIFwKLQkgICAgICB8IGYzMDEtKiB8IGFybSotKiB8IHQzZS0qIFwKLQkgICAgICB8IG04ODExMC0qIHwgbTY4MFswMTIzNF0wLSogfCBtNjgzPzItKiB8IG02ODM2MC0qIHwgejhrLSogfCBkMTB2LSogXAotCSAgICAgIHwgdGh1bWItKiB8IHY4NTAtKiB8IGQzMHYtKiB8IHRpYzMwLSogfCBjMzAtKiB8IGZyMzAtKiApCi0JCTs7Ci0JIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAotCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCi0JMzg2YnNkKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tYnNkCi0JCTs7Ci0JM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAotCQk7OwotCTNiKikKLQkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKLQkJOzsKLQlhMjlraGlmKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQlhZG9iZTY4aykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKLQkJb3M9LXNjb3V0Ci0JCTs7Ci0JYWxsaWFudCB8IGZ4ODApCi0JCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50Ci0JCTs7Ci0JYWx0b3MgfCBhbHRvczMwNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcwotCQk7OwotCWFtMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQotCQlvcz0tYnNkCi0JCTs7Ci0JYW1kYWhsKQotCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKLQkJb3M9LXN5c3YKLQkJOzsKLQlhbWlnYSB8IGFtaWdhLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KLQkJOzsKLQlhbWlnYW9zIHwgYW1pZ2Fkb3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KLQkJb3M9LWFtaWdhb3MKLQkJOzsKLQlhbWlnYXVuaXggfCBhbWl4KQotCQliYXNpY19tYWNoaW5lPW02OGstY2JtCi0JCW9zPS1zeXN2NAotCQk7OwotCWFwb2xsbzY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JYXBvbGxvNjhic2QpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LWJzZAotCQk7OwotCWF1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCi0JCW9zPS1hdXgKLQkJOzsKLQliYWxhbmNlKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKLQkJb3M9LWR5bml4Ci0JCTs7Ci0JY29udmV4LWMxKQotCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMyKQotCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzMikKLQkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM0KQotCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzgpCi0JCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY3JheSB8IHltcCkKLQkJYmFzaWNfbWFjaGluZT15bXAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JY3JheTIpCi0JCWJhc2ljX21hY2hpbmU9Y3JheTItY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JW2N0al05MC1jcmF5KQotCQliYXNpY19tYWNoaW5lPWM5MC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQljcmRzIHwgdW5vcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKLQkJOzsKLQlkYTMwIHwgZGEzMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAotCQk7OwotCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKLQkJYmFzaWNfbWFjaGluZT1taXBzLWRlYwotCQk7OwotCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCi0JICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQotCQk7OwotCWRlbHRhODgpCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQotCQlvcz0tc3lzdjMKLQkJOzsKLQlkcHgyMCB8IGRweDIwLSopCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKLQkJb3M9LWJvc3gKLQkJOzsKLQlkcHgyKiB8IGRweDIqLWJ1bGwpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCi0JCW9zPS1zeXN2MwotCQk7OwotCWVibW9uMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS1lYm1vbgotCQk7OwotCWVseHNpKQotCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCi0JCW9zPS1ic2QKLQkJOzsKLQllbmNvcmUgfCB1bWF4IHwgbW1heCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKLQkJOzsKLQllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgotCQlvcz0tb3NlCi0JCTs7Ci0JZngyODAwKQotCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAotCQk7OwotCWdlbml4KQotCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCi0JCTs7Ci0JZ21pY3JvKQotCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JaDMwNTByKiB8IGhpdXgqKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCWg4MzAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWg4MzAweHJheSkKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS14cmF5Ci0JCTs7Ci0JaDg1MDBobXMpCi0JCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0JaGFycmlzKQotCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCi0JCW9zPS1zeXN2MwotCQk7OwotCWhwMzAwLSopCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQk7OwotCWhwMzAwYnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJb3M9LWJzZAotCQk7OwotCWhwMzAwaHB1eCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ocHV4Ci0JCTs7Ci0JaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCi0JCTs7Ci0JaHA5azNbMi05XVswLTldKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCi0JCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAotCQk7OwotCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKLQkJOzsKLQlocHBhLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLQlocHBhb3NmKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LW9zZgotCQk7OwotCWhwcHJvKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJb3M9LXByb2VsZgotCQk7OwotCWkzNzAtaWJtKiB8IGlibSopCi0JCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KLQkJb3M9LW12cwotCQk7OwotIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/Ci0JaVszNDU2N104NnYzMikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2MzIKLQkJOzsKLQlpWzM0NTY3XTg2djQqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JaVszNDU2N104NnYpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdgotCQk7OwotCWlbMzQ1NjddODZzb2wyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0JaTM4Nm1hY2gpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCi0JCW9zPS1tYWNoCi0JCTs7Ci0JaTM4Ni12c3RhIHwgdnN0YSkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LXZzdGEKLQkJOzsKLQlpMzg2LWdvMzIgfCBnbzMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tZ28zMgotCQk7OwotCWkzODYtbWluZ3czMiB8IG1pbmd3MzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1taW5ndzMyCi0JCTs7Ci0JaXJpcyB8IGlyaXM0ZCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQotCQljYXNlICRvcyBpbgotCQkgICAgLWlyaXgqKQotCQkJOzsKLQkJICAgICopCi0JCQlvcz0taXJpeDQKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQlpc2k2OCB8IGlzaSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQotCQlvcz0tc3lzdgotCQk7OwotCW04OGstb21yb24qKQotCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KLQkJOzsKLQltYWdudW0gfCBtMzIzMCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKLQkJb3M9LXN5c3YKLQkJOzsKLQltZXJsaW4pCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlawotCQlvcz0tc3lzdgotCQk7OwotCW1pbmlmcmFtZSkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAotCQk7OwotCSptaW50IHwgKk1pTlQpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQotCQlvcz0tbWludAotCQk7OwotCW1pcHNlbCotbGludXgqKQotCQliYXNpY19tYWNoaW5lPW1pcHNlbC11bmtub3duCi0JCW9zPS1saW51eC1nbnUKLQkJOzsKLQltaXBzKi1saW51eCopCi0JCWJhc2ljX21hY2hpbmU9bWlwcy11bmtub3duCi0JCW9zPS1saW51eC1nbnUKLQkJOzsKLQltaXBzMyotKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKLQkJOzsKLQltaXBzMyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KLQkJOzsKLQltb25pdG9yKQotCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JbXNkb3MpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1tc2RvcwotCQk7OwotCW5jcjMwMDApCi0JCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JbmV0YnNkMzg2KQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tbmV0YnNkCi0JCTs7Ci0JbmV0d2luZGVyKQotCQliYXNpY19tYWNoaW5lPWFybXY0bC1jb3JlbAotCQlvcz0tbGludXgKLQkJOzsKLQluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQotCQliYXNpY19tYWNoaW5lPW02OGstc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmV3czEwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5lY3Y3MCkKLQkJYmFzaWNfbWFjaGluZT12NzAtbmVjCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbmV4dCB8IG0qLW5leHQgKQotCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAotCQljYXNlICRvcyBpbgotCQkgICAgLW5leHRzdGVwKiApCi0JCQk7OwotCQkgICAgLW5zMiopCi0JCSAgICAgIG9zPS1uZXh0c3RlcDIKLQkJCTs7Ci0JCSAgICAqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAzCi0JCQk7OwotCQllc2FjCi0JCTs7Ci0JbmgzMDAwKQotCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCi0JCW9zPS1jeHV4Ci0JCTs7Ci0JbmhbNDVdMDAwKQotCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCi0JCW9zPS1jeHV4Ci0JCTs7Ci0JbmluZHk5NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAotCQlvcz0tbmluZHkKLQkJOzsKLQltb245NjApCi0JCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAotCQlvcz0tbW9uOTYwCi0JCTs7Ci0JbnAxKQotCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAotCQk7OwotCW9wNTBuLSogfCBvcDYwYy0qKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlPU0U2ODAwMCB8IG9zZTY4MDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1lcmljc3NvbgotCQlvcz0tb3NlCi0JCTs7Ci0Jb3M2OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ub25lCi0JCW9zPS1vczY4awotCQk7OwotCXBhLWhpdGFjaGkpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JcGFyYWdvbikKLQkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCi0JCW9zPS1vc2YKLQkJOzsKLQlwYmQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCi0JCTs7Ci0JcGJiKQotCQliYXNpY19tYWNoaW5lPW02OGstdHRpCi0JCTs7Ci0gICAgICAgIHBjNTMyIHwgcGM1MzItKikKLQkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgotCQk7OwotCXBlbnRpdW0gfCBwNSB8IGs1IHwgbmV4ZW4pCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1wYwotCQk7OwotCXBlbnRpdW1wcm8gfCBwNiB8IGs2IHwgNng4NikKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCTs7Ci0JcGVudGl1bWlpIHwgcGVudGl1bTIpCi0JCWJhc2ljX21hY2hpbmU9aTc4Ni1wYwotCQk7OwotCXBlbnRpdW0tKiB8IHA1LSogfCBrNS0qIHwgazYtKiB8IG5leGVuLSopCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSopCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKikKLQkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcG4pCi0JCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKLQkJOzsKLQlwb3dlcikJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCi0JCTs7Ci0JcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgotCSAgICAgICAgOzsKLQlwcGMtKikJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KLQkgICAgICAgIDs7Ci0JcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwczIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KLQkJOzsKLQlyb202OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKLQkJb3M9LWNvZmYKLQkJOzsKLQlybVs0Nl0wMCkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKLQkJOzsKLQlydHBjIHwgcnRwYy0qKQotCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCi0JCTs7Ci0Jc2EyOTIwMCkKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0Jc2VxdWVudCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKLQkJOzsKLQlzaCkKLQkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQlzcGFyY2xpdGUtd3JzKQotCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQlzcHM3KQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQlvcz0tc3lzdjIKLQkJOzsKLQlzcHVyKQotCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgotCQk7OwotCXN0MjAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQotCQk7OwotCXN0cmF0dXMpCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1zdHJhdHVzCi0JCW9zPS1zeXN2NAotCQk7OwotCXN1bjIpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQk7OwotCXN1bjJvczMpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuMm9zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW4zb3MzKQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCW9zPS1zdW5vczMKLQkJOzsKLQlzdW4zb3M0KQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40b3MzKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuNG9zNCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zNAotCQk7OwotCXN1bjRzb2wyKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlzdW4zIHwgc3VuMy0qKQotCQliYXNpY19tYWNoaW5lPW02OGstc3VuCi0JCTs7Ci0Jc3VuNCkKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJOzsKLQlzdW4zODYgfCBzdW4zODZpIHwgcm9hZHJ1bm5lcikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXN1bgotCQk7OwotCXN5bW1ldHJ5KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQl0M2UpCi0JCWJhc2ljX21hY2hpbmU9dDNlLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXR4MzkpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgotCQk7OwotCXR4MzllbCkKLQkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KLQkJOzsKLQl0b3dlciB8IHRvd2VyLTMyKQotCQliYXNpY19tYWNoaW5lPW02OGstbmNyCi0JCTs7Ci0JdWRpMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQl1bHRyYTMpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKLQkJb3M9LXN5bTEKLQkJOzsKLQl2ODEwIHwgbmVjdjgxMCkKLQkJYmFzaWNfbWFjaGluZT12ODEwLW5lYwotCQlvcz0tbm9uZQotCQk7OwotCXZheHYpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tc3lzdgotCQk7OwotCXZtcykKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS12bXMKLQkJOzsKLQl2cHAqfHZ4fHZ4LSopCi0gICAgICAgICAgICAgICBiYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQotICAgICAgICAgICAgICAgOzsKLQl2eHdvcmtzOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczY4KQotCQliYXNpY19tYWNoaW5lPW02OGstd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jdnh3b3JrczI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXc2NSopCi0JCWJhc2ljX21hY2hpbmU9dzY1LXdkYwotCQlvcz0tbm9uZQotCQk7OwotCXc4OWstKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKLQkJb3M9LXByb2VsZgotCQk7OwotCXhtcCkKLQkJYmFzaWNfbWFjaGluZT14bXAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0gICAgICAgIHhwcyB8IHhwczEwMCkKLQkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCi0JCTs7Ci0JejhrLSotY29mZikKLQkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgotCQlvcz0tc2ltCi0JCTs7Ci0Jbm9uZSkKLQkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKLQkJb3M9LW5vbmUKLQkJOzsKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgotIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgotCXc4OWspCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCi0JCTs7Ci0Jb3A1MG4pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQlvcDYwYykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQk7OwotCW1pcHMpCi0JCWlmIFsgeCRvcyA9IHgtbGludXgtZ251IF07IHRoZW4KLQkJCWJhc2ljX21hY2hpbmU9bWlwcy11bmtub3duCi0JCWVsc2UKLQkJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCi0JCWZpCi0JCTs7Ci0Jcm9tcCkKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCXJzNjAwMCkKLQkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCi0JCTs7Ci0JdmF4KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJOzsKLQlwZHAxMSkKLQkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKLQkJOzsKLQl3ZTMyaykKLQkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKLQkJOzsKLQlzcGFyYyB8IHNwYXJjdjkpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0gICAgICAgIGN5ZHJhKQotCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKLQkJOzsKLQlvcmlvbikKLQkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKLQkJOzsKLQlvcmlvbjEwNSkKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAotCQk7OwotCW1hYyB8IG1wdyB8IG1hYy1tcHcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQk7OwotCXBtYWMgfCBwbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCi0JCTs7Ci0JYzR4KikKLQkJYmFzaWNfbWFjaGluZT1jNHgtbm9uZQotCQlvcz0tY29mZgotCQk7OwotCSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLQotIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1kaWdpdGFsKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCi0JCTs7Ci0JKi1jb21tb2RvcmUqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAotCQk7OwotCSopCi0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgotCi1pZiBbIHgiJG9zIiAhPSB4IiIgXQotdGhlbgotY2FzZSAkb3MgaW4KLSAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKLSAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KLQkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KLQktc29sYXJpczEgfCAtc29sYXJpczEuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAotCQk7OwotCS1zb2xhcmlzKQotCQlvcz0tc29sYXJpczIKLQkJOzsKLQktc3ZyNCopCi0JCW9zPS1zeXN2NAotCQk7OwotCS11bml4d2FyZSopCi0JCW9zPS1zeXN2NC4ydXcKLQkJOzsKLQktZ251L2xpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgotCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCi0JIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KLQkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCi0JLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAotCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCi0JICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKLQkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKLQkgICAgICB8IC1hb3MqIFwKLQkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAotCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAotCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAtbmV0YnNkKiB8IC1vcGVuYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIFwKLQkgICAgICB8IC1seW54b3MqIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKLQkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCi0JICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCi0JICAgICAgfCAtY3lnd2luKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAotCSAgICAgIHwgLW1pbmd3MzIqIHwgLWxpbnV4LWdudSogfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAotCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLXJoYXBzb2R5KiB8IC1vcGVuc3RlcCogfCAtb3NraXQqKQotCSMgUmVtZW1iZXIsIGVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KLQkJOzsKLQktc2ltIHwgLWVzMTgwMCogfCAtaG1zKiB8IC14cmF5IHwgLW9zNjhrKiB8IC1ub25lKiB8IC12ODhyKiBcCi0JICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiBcCi0JICAgICAgfCAtbWFjb3MqIHwgLW1wdyogfCAtbWFnaWMqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQotCQk7OwotCS1tYWMqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCi0JCTs7Ci0JLWxpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAotCQk7OwotCS1zdW5vczUqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCi0JCTs7Ci0JLXN1bm9zNiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKLQkJOzsKLQktb3Nmcm9zZSopCi0JCW9zPS1vc2Zyb3NlCi0JCTs7Ci0JLW9zZiopCi0JCW9zPS1vc2YKLQkJOzsKLQktdXRlayopCi0JCW9zPS1ic2QKLQkJOzsKLQktZHluaXgqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWFjaXMqKQotCQlvcz0tYW9zCi0JCTs7Ci0JLTM4NmJzZCkKLQkJb3M9LWJzZAotCQk7OwotCS1jdGl4KiB8IC11dHMqKQotCQlvcz0tc3lzdgotCQk7OwotCS1uczIgKQotCSAgICAgICAgb3M9LW5leHRzdGVwMgotCQk7OwotCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KLQktc2luaXg1LiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCi0JCTs7Ci0JLXNpbml4KikKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXRyaXRvbiopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1vc3MqKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXN2cjMpCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zeXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KLQktc3lzdiopCi0JCTs7Ci0JLW9zZSopCi0JCW9zPS1vc2UKLQkJOzsKLQktZXMxODAwKikKLQkJb3M9LW9zZQotCQk7OwotCS14ZW5peCkKLQkJb3M9LXhlbml4Ci0JCTs7Ci0gICAgICAgIC0qbWludCB8IC0qTWlOVCkKLQkgICAgICAgIG9zPS1taW50Ci0JCTs7Ci0JLW5vbmUpCi0JCTs7Ci0JKikKLQkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLWVsc2UKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgotIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKLSMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KLQotIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAotIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAotIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCi0jIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKLSMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCi0KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLWFjb3JuKQotCQlvcz0tcmlzY2l4MS4yCi0JCTs7Ci0JYXJtKi1jb3JlbCkKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JYXJtKi1zZW1pKQotCQlvcz0tYW91dAotCQk7OwotICAgICAgICBwZHAxMS0qKQotCQlvcz0tbm9uZQotCQk7OwotCSotZGVjIHwgdmF4LSopCi0JCW9zPS11bHRyaXg0LjIKLQkJOzsKLQltNjgqLWFwb2xsbykKLQkJb3M9LWRvbWFpbgotCQk7OwotCWkzODYtc3VuKQotCQlvcz0tc3Vub3M0LjAuMgotCQk7OwotCW02ODAwMC1zdW4pCi0JCW9zPS1zdW5vczMKLQkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCi0JCSMgZGVmYXVsdC4KLQkJIyBvcz0tc3Vub3M0Ci0JCTs7Ci0JbTY4Ki1jaXNjbykKLQkJb3M9LWFvdXQKLQkJOzsKLQltaXBzKi1jaXNjbykKLQkJb3M9LWVsZgotCQk7OwotCW1pcHMqLSopCi0JCW9zPS1lbGYKLQkJOzsKLQkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgotCQlvcz0tc3lzdjMKLQkJOzsKLQlzcGFyYy0qIHwgKi1zdW4pCi0JCW9zPS1zdW5vczQuMS4xCi0JCTs7Ci0JKi1iZSkKLQkJb3M9LWJlb3MKLQkJOzsKLQkqLWlibSkKLQkJb3M9LWFpeAotCQk7OwotCSotd2VjKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi13aW5ib25kKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi1va2kpCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQkqLWhwKQotCQlvcz0taHB1eAotCQk7OwotCSotaGl0YWNoaSkKLQkJb3M9LWhpdXgKLQkJOzsKLQlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JKi1jYm0pCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JKi1kZykKLQkJb3M9LWRndXgKLQkJOzsKLQkqLWRvbHBoaW4pCi0JCW9zPS1zeXN2MwotCQk7OwotCW02OGstY2N1cikKLQkJb3M9LXJ0dQotCQk7OwotCW04OGstb21yb24qKQotCQlvcz0tbHVuYQotCQk7OwotCSotbmV4dCApCi0JCW9zPS1uZXh0c3RlcAotCQk7OwotCSotc2VxdWVudCkKLQkJb3M9LXB0eAotCQk7OwotCSotY3JkcykKLQkJb3M9LXVub3MKLQkJOzsKLQkqLW5zKQotCQlvcz0tZ2VuaXgKLQkJOzsKLQlpMzcwLSopCi0JCW9zPS1tdnMKLQkJOzsKLQkqLW5leHQpCi0JCW9zPS1uZXh0c3RlcDMKLQkJOzsKLSAgICAgICAgKi1nb3VsZCkKLQkJb3M9LXN5c3YKLQkJOzsKLSAgICAgICAgKi1oaWdobGV2ZWwpCi0JCW9zPS1ic2QKLQkJOzsKLQkqLWVuY29yZSkKLQkJb3M9LWJzZAotCQk7OwotICAgICAgICAqLXNnaSkKLQkJb3M9LWlyaXgKLQkJOzsKLSAgICAgICAgKi1zaWVtZW5zKQotCQlvcz0tc3lzdjQKLQkJOzsKLQkqLW1hc3Njb21wKQotCQlvcz0tcnR1Ci0JCTs7Ci0JZjMwMS1mdWppdHN1KQotCQlvcz0tdXhwdgotCQk7OwotCSotcm9tNjhrKQotCQlvcz0tY29mZgotCQk7OwotCSotKmJ1ZykKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLWFwcGxlKQotCQlvcz0tbWFjb3MKLQkJOzsKLQkqLWF0YXJpKikKLQkJb3M9LW1pbnQKLQkJOzsKLQkqKQotCQlvcz0tbm9uZQotCQk7OwotZXNhYwotZmkKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKLSMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCi12ZW5kb3I9dW5rbm93bgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotdW5rbm93bikKLQkJY2FzZSAkb3MgaW4KLQkJCS1yaXNjaXgqKQotCQkJCXZlbmRvcj1hY29ybgotCQkJCTs7Ci0JCQktc3Vub3MqKQotCQkJCXZlbmRvcj1zdW4KLQkJCQk7OwotCQkJLWFpeCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktYmVvcyopCi0JCQkJdmVuZG9yPWJlCi0JCQkJOzsKLQkJCS1ocHV4KikKLQkJCQl2ZW5kb3I9aHAKLQkJCQk7OwotCQkJLW1wZWl4KikKLQkJCQl2ZW5kb3I9aHAKLQkJCQk7OwotCQkJLWhpdXgqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS11bm9zKikKLQkJCQl2ZW5kb3I9Y3JkcwotCQkJCTs7Ci0JCQktZGd1eCopCi0JCQkJdmVuZG9yPWRnCi0JCQkJOzsKLQkJCS1sdW5hKikKLQkJCQl2ZW5kb3I9b21yb24KLQkJCQk7OwotCQkJLWdlbml4KikKLQkJCQl2ZW5kb3I9bnMKLQkJCQk7OwotCQkJLW12cyopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktcHR4KikKLQkJCQl2ZW5kb3I9c2VxdWVudAotCQkJCTs7Ci0JCQktdnhzaW0qIHwgLXZ4d29ya3MqKQotCQkJCXZlbmRvcj13cnMKLQkJCQk7OwotCQkJLWF1eCopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJCS1obXMqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS1tcHcqIHwgLW1hY29zKikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLSptaW50IHwgLSpNaU5UKQotCQkJCXZlbmRvcj1hdGFyaQotCQkJCTs7Ci0JCWVzYWMKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKLQkJOzsKLWVzYWMKLQotZWNobyAkYmFzaWNfbWFjaGluZSRvcwpkaWZmIC0tZ2l0IGEvY29uZmlnL0NoYW5nZUxvZyBiL2NvbmZpZy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNmZjNjAuLjAwMDAwMDAKLS0tIGEvY29uZmlnL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0xOTk5LTA0LTA3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogbXQtZDMwdjogTmV3IGZpbGUsIHBhc3MgLWcgLU9zIC1XYSwtQyBhcyBkZWZhdWx0IG9wdGlvbnMuCi0KLTE5OTktMDItMDggIFN5ZCBQb2xrICA8c3BvbGtAY3lnbnVzLmNvbT4KLQotCSogYWNpbmNsdWRlLm00OiBBZGRlZCBtYWNyb3MgdG8gZmluZCBpdGNsIGZpbGVzLgotCUV4cG9ydCBUQ0xfQ0ZMQUdTIGZyb20gdGNsQ29uZmlnLnNoLgotCUV4cG9ydCBUQ0xfTElCX0ZVTExfUEFUSCwgVEtfTElCX0ZVTExfUEFUSCwgSVRDTF9MSUJfRlVMTF9QQVRILAotCUlUS19MSUJfRlVMTF9QQVRILCBhbmQgVElYX0xJQl9GVUxMX1BBVEgKLQlSZXBsYWNlIFRJWCBtYWNyb3Mgd2l0aCBiZXR0ZXIgb25lcyBmcm9tIHNuYXZpZ2F0b3IuCi0KLVR1ZSBGZWIgIDIgMjI6NTE6MjEgMTk5OSBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBtaC1hcm1waWM6IE5ldyBmaWxlLiAgUGF0Y2ggZnJvbSBKaW0gUGljayA8amltQGppbXBpY2suY29tPi4KLQkqIG10LWFybXBpYzogTGlrZXdpc2UuCi0KLU1vbiBKYW4gMTggMTk6NDE6MDggMTk5OSAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY3lnd2luLm1oOiBBY3RpdmF0ZSBjb21tZW50ZWQgb3V0IGRlcGVuZGVuY2llcyBmb3IKLQlnZGI6IGxpYnRlcm1jYXAuCi0KLVdlZCBOb3YgMTggMjA6Mjk6NDYgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY3lnd2luLm1oOiBBZGQgZXh0cmEgbGlidGVybWNhcCB0YXJnZXQgaW5mb3JtYXRpb24uCi0JQWRkIGNvbW1lbnRlZCBvdXQgZGVwZW5kZW5jeSBmb3IgZ2RiIHRvIGxpYnRlcm1jYXAgZm9yCi0JZnV0dXJlIHJlYWRsaW5lIHJlcXVpcmVtZW50LgotCi1Nb24gTm92ICAyIDE1OjE1OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBtaC1jeWd3aW4zMjogZGVsZXRlCi0gICAgICAgICogbWgtY3lnd2luOiB3YXMgbWgtY3lnd2luMzIKLQotMTk5OC0xMC0yNiAgU3lkIFBvbGsgIDxzcG9sa0BjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IFRDTEhESVIgYW5kIFRLSERJUiBuZWVkIHRvIGJlIHJ1biB0aHJvdWdoCi0JY3lncGF0aCBmb3IgTWljcm9zb2Z0IGJ1aWxkcy4KLQotMTk5OC0xMC0yMCAgU3lkIFBvbGsgIDxzcG9sa0BjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQ6IFJlLWV4cG9ydGVkIFRDTF9MSUJTIGFuZCBUQ0xfTERfU0VBUkNIX0ZMQUdTCi0JYmVjYXVzZSBpdGNsIG5lZWRzIHRoZW0uCi0KLU1vbiBBdWcgMzEgMTc6NTA6NTMgMTk5OCAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+Ci0KLQkqIG1oLWFpeDQzIChOTV9GT1JfVEFSR0VUKTogQWRkIC1YMzJfNjQgYXMgd2VsbC4KLQotU2F0IEF1ZyAyOSAxNDozMjo1NSAxOTk4ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogbWgtYWl4NDM6IE5ldyBmaWxlLgotCi1Nb24gQXVnIDEwIDAwOjE1OjQ3IDE5OTggIEhKIEx1IChoamxAZ251Lm9yZykKLQotCSogbXQtbGludXggKENYWEZMQUdTX0ZPUl9UQVJHRVQpOiBBZGQgLURfR05VX1NPVVJDRS4KLQotMTk5OC0wNS0yOSAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogYWNpbmNsdWRlLm00OiBOZXcgY29sbGVjdGlvbiBvZiBnZW5lcmljIGF1dG9jb25mIG1hY3Jvcy4KLQkKLVdlZCBBcHIgMjIgMTI6MjQ6MjggMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIG10LW9zcGFjZTogTmV3IGZpbGUsIHN1cHBvcnQgdXNpbmcgLU9zIGluc3RlYWQgb2YgLU8yIHRvIGNvbXBpbGUKLQl0aGUgbGlicmFyaWVzLgotCi1XZWQgQXByIDIyIDEwOjUzOjE0IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtdC1saW51eCAoQ1hYRkxBR1NfRk9SX1RBUkdFVCk6IFNldCB0aGlzIGluc3RlYWQgb2YgQ1hYRkxBR1MuCi0KLVNhdCBBcHIgMTEgMjI6NDM6MTcgMTk5OCAgSi4gS2VhbiBKb2huc3RvbiAgPGprakBzY28uY29tPgotCi0JKiBtaC1zdnN2NTogTmV3IGZpbGUgLSBzdXBwb3J0IGZvciBTQ08gVW5peFdhcmUgNyAvIFNWUjUuCi0KLVRodSBNYXIgMjYgMDE6NTQ6MjUgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogbWgtY3lnd2luMzI6IHN0b3AgY29uZmlndXJpbmcgYW5kIGJ1aWxkaW5nIGRvc3JlbC4KLQotVGh1IFNlcCAxMSAxNjo0MzoyNyAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIG1oLWVsZmFscGhhcGljLCBtdC1lbGZhbHBoYXBpYzogTmV3IGZpbGVzLgotCi1XZWQgSnVsIDIzIDEyOjMyOjE4IDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogbWgtZ28zMiAoQ0ZMQUdTKTogRG9uJ3Qgc2V0IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyLgotCi1Nb24gSnVuIDE2IDE5OjA2OjQxIDE5OTcgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIG1oLXBwY3BpYzogTmV3IGZpbGUuCi0JKiBtdC1wcGNwaWM6IE5ldyBmaWxlLgotCi1UaHUgTWFyIDI3IDE1OjUyOjQwIDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIG1oLWN5Z3dpbjMyOiBvdmVycmlkZSBDWFhGTEFHUywgc2V0dGluZyB0byAtTzIgb25seQotCShubyBkZWJ1ZykKLQotVHVlIE1hciAyNSAxODoxNjo0MyAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBtaC1jeWd3aW4zMjogb3ZlcnJpZGUgTElCR0NDMl9ERUJVR19DRkxBR1Mgc28gZGVidWcgaW5mbwotCWlzbid0IGluY2x1ZGVkIGluIGN5Z3dpbjMyLWhvc3RlZCBsaWJnY2MyLmEgYnkgZGVmYXVsdAotCi1XZWQgSmFuICA4IDE5OjU2OjQzIDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBtaC1jeWd3aW4zMjogb3ZlcnJpZGUgQ0ZMQUdTIHNvIGRlYnVnIGluZm8gaXNuJ3QgaW5jbHVkZWQKLSAgICAgICAgaW4gY3lnd2luMzItaG9zdGVkIHRvb2xzIGJ5IGRlZmF1bHQKLQotVHVlIERlYyAzMSAxNjowNDoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1oLWxpbnV4OiBSZW1vdmUuCi0KLU1vbiBOb3YgMTEgMTA6Mjk6NTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBtdC1wcGM6IERlbGV0ZSBmaWxlLCBvcHRpb25zIG1vdmVkIHRvIG5ld2xpYiBjb25maWd1cmUuCi0KLUZyaSBPY3QgIDQgMTI6MjE6MDMgMTk5NiAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIG1oLWRndXgzODY6IE5ldyBmaWxlLiAgeDg2IGRndXggc3BlY2lmaWMgZmxhZ3MKLQotTW9uIFNlcCAzMCAxNToxMDowNyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1taC1tcHcgKEVYVFJBTElCU19QUENfWENPRkYpOiBOZXcsIHdhcyBFWFRSQUxJQlNfUFBDLgotCShFWFRSQUxJQlNfUFBDKTogVXNlIHNoYXJlZCBsaWJyYXJpZXMgaW5zdGVhZCBvZiB4Y29mZi4KLQotU2F0IEF1ZyAxNyAwNDo1NjoyNSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBza2Fyby5jeWdudXMuY29tPgotCi0JKiBtaC1jeWd3aW4zMjogZG9uJ3QgLURfV0lOMzIgaGVyZSBhbnltb3JlCi0KLVRodSBBdWcgMTUgMTk6NDY6NDQgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3IChTRUdGTEFHXzY4SywgU0VHRkxBR19QUEMpOiBSZW1vdmUuCi0JKEVYVFJBTElCU19QUEMpOiBBZGQgbGliZ2NjLnhjb2ZmLgotCi1UaHUgQXVnICA4IDE0OjUxOjQ3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogbXQtcHBjOiBOZXcgZmlsZSwgYWRkIC1tcmVsb2NhdGFibGUtbGliIGFuZCAtbW5vLWVhYmkgdG8gYWxsCi0JdGFyZ2V0IGJ1aWxkcyBmb3IgUG93ZXJQQyBlYWJpIHRhcmdldHMuCi0KLUZyaSBKdWwgMTIgMTI6MDY6MDEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHc6IE5ldyBzdWJkaXIsIE1hYyBNUFcgY29uZmlndXJhdGlvbiBzdXBwb3J0IGJpdHMuCi0KLU1vbiBKdWwgIDggMTc6MzA6NTIgMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBtaC1pcml4NjogTmV3IGZpbGUuCi0KLU1vbiBKdWwgIDggMTU6MTU6MzcgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBtdC1zcGFyY3BpYyAoUElDRkxBR19GT1JfVEFSR0VUKTogVXNlIC1mUElDLgotCi1GcmkgSnVsICA1IDExOjQ5OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtaXJpeDQgKFJBTkxJQik6IERvbid0IGRlZmluZTsgSXJpeCA0IGRvZXMgaGF2ZSByYW5saWIuCi0KLVN1biBKdW4gMjMgMjI6NTk6MjUgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogbWgtY3lnd2luMzI6IG5ldyBmaWxlLiAgTGlrZSBtaC1nbzMyIHdpdGhvdXQgdGhlIENGTEFHUyBlbnRyeS4KLQotVHVlIE1hciAyNiAxNDoxMDo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1oLWdvMzIgKENGTEFHUyk6IERlZmluZS4KLQotVGh1IE1hciAxNCAxOToyMDo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1oLW5lY3Y0OiBOZXcgZmlsZS4KLQotVGh1IEZlYiAxNSAxMzowNzo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1oLWN4dXggKENDKTogTmV3IHZhcmlhYmxlLgotCShDRkxBR1MsIExERkxBR1MpOiBSZW1vdmUuCi0JKiBtaC1uY3JzdnI0MyAoQ0MpOiBOZXcgdmFyaWFibGUuCi0JKENGTEFHUyk6IFJlbW92ZS4KLQkqIG1oLXNvbGFyaXMgKENGTEFHUyk6IFJlbW92ZS4KLQotCSogbWgtZ28zMjogUmVtb3ZlIG1vc3QgdmFyaWFibGUgc2V0dGluZ3MsIHNpbmNlIHRoZXkgcHJlc3VtZWQgYQotCUNhbmFkaWFuIENyb3NzLCB3aGljaCBpcyBub3cgaGFuZGxlZCBjb3JyZWN0bHkgYnkgdGhlIGNvbmZpZ3VyZQotCXNjcmlwdC4KLQotCSogbWgtc3BhcmNwaWMgKFBJQ0ZMQUcpOiBTZXQgdG8gLWZQSUMsIG5vdCAtZnBpYy4KLQotTW9uIEZlYiAxMiAxNDo1MzozOSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbWgtbTY4a3BpYywgbXQtbTY4a3BpYzogTmV3IGZpbGVzLgotCi1UaHUgRmViICAxIDE0OjE1OjQyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1oLW1wdyAoQ0NfTVdDNjhLKTogQWRkIG9wdGlvbnMgc2ltaWxhciB0byB0aG9zZSB1c2VkCi0JaW4gQ0NfTVdDUFBDLCBhbmQgLW1jNjgwMjAgLW1vZGVsIGZhci4KLQkoQVJfTVdMSU5LNjhLKTogQWRkIC14bSBsaWJyYXJ5LgotCShBUl9BUik6IERlZmluZS4KLQkoQ0NfTERfTVdMSU5LNjhLKTogUmVtb3ZlIC1kLgotCShFWFRSQUxJQlNfTVdDNjhLKTogRGVmaW5lLgotCi1UaHUgSmFuIDI1IDE2OjA1OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtbmNyc3ZyNDMgKENGTEFHUyk6IFJlbW92ZSAtSG5vY29weXIuCi0KLVR1ZSBOb3YgIDcgMTU6NDE6MzAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3IChDQ19NV0M2OEssIENDX01XQ1BQQyk6IFJlbW92ZSB1bnVzZWQgaW5jbHVkZSBwYXRoLgotCShDQ19NV0NQUEMpOiBBZGQgLW1wd19jaGFycywgZGlzYWJsZSB3YXJuaW5ncywgYWRkIGNvbW1lbnRzCi0JZXhwbGFpbmluZyByZWFzb25zIGZvciB2YXJpb3VzIGZsYWdzLgotCShFWFRSQUxJQlNfUFBDLCBFWFRSQUxJQlNfTVdDUFBDICk6IFB1dCBydW50aW1lIGxpYnJhcnkgZmlyc3QuCi0JCi1GcmkgT2N0IDEzIDE0OjQ0OjI1IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBtaC1haXgsIG1oLXN1bjogIFJlbW92ZWQuCi0KLQkqIG1oLWRlY3N0YXRpb24gKFgxMV9FWFRSQV9DRkxBR1MpOiBEZWZpbmUuCi0KLQkqIG1oLXNjbywgbWgtc29sYXJpcywgbWgtc3lzdjQgKFgxMV9FWFRSQV9MSUJTKTogRGVmaW5lLgotCi0gICAgICAgICogbWgtaHAzMDAsIG1oLWhwdXgsIG1oLWhwdXg4LCBtaC1zb2xhcmlzLCBtaC1zdW4zLCBtaC1zeXN2NDogRG9uJ3QgCi0JaGFyZGNvZGUgbG9jYXRpb24gb2YgWCBzdHVmZiBoZXJlLgotCi1UaHUgU2VwIDI4IDEzOjE0OjU2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1oLW1wdzogQWRkIGRlZmluaXRpb25zIGZvciB2YXJpb3VzIDY4SyBhbmQgUG93ZXJNYWMKLQljb21waWxlcnMsIGFkZCBkZWZpbml0aW9ucyBmb3IgbGlicmFyeSBhbmQgbGluayBzdGVwcyBmb3IKLQlQb3dlck1hY3MuCi0KLVRodSBTZXAgMTQgMDg6MjA6MDQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG1oLWhwMzAwIChDQyk6IEFkZCAiQ0MgPSBjYyAtV3AsLUgyNTYwMDAiIHRvIGF2b2lkCi0JInRvbyBtdWNoIGRlZmluaW5nIiBlcnJvcnMgZnJvbSB0aGUgSFBVWCBjb21waWxlci4KLQotVGh1IEF1ZyAxNyAxNzoyODo1NiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIG1oLWhwMzAwIChSQU5MSUIpOiBVc2UgImFyIHRzIiwgaW4gY2FzZSBHTlUgYXIgd2FzIHVzZWQgYW5kCi0JZGlkbid0IGJ1aWxkIGEgc3ltYm9sIHRhYmxlLgotCi1UaHUgSnVuIDIyIDE3OjQ3OjI0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1oLW1wdyAoQ0MpOiBEZWZpbmUgQU5TSV9QUk9UT1RZUEVTLgotCi1Nb24gQXByIDEwIDEyOjI5OjQ4IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1oLW1wdyAoRVhUUkFMSUJTKTogQWx3YXlzIGxpbmsgaW4gTWF0aC5vLCBDU0FORUxJQi5vLAotICAgICAgICBhbmQgVG9vbExpYnMuby4KLQotCSogbXB3LW1oLW1wdyAoQ0MpOiBEZWZpbmUgQUxNT1NUX1NUREMuCi0JKENGTEFHUyk6IFJlbW92ZSBBTE1PU1RfU1REQywgLW1jNjg4ODEuCi0JKExERkxBR1MpOiBhZGQgLXcuCi0KLQkqIG1wdy1taC1tcHcgKENGTEFHUyk6IEFkZCAtYiBvcHRpb24gdG8gcHV0IHN0cmluZ3MgYXQgdGhlIGVuZHMgb2YKLQlmdW5jdGlvbnMuCi0KLQkqIG1wdy1taC1tcHc6IE5ldyBmaWxlLCBob3N0IG1ha2VmaWxlIGRlZmluaXRpb25zIGZvciBNUFcuCi0KLUZyaSBNYXIgMzEgMTE6MzU6MTcgMTk5NSAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogbXQtbmV0d2FyZTogTmV3IGZpbGUuCi0KLU1vbiBNYXIgMTMgMTI6MzE6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaC1ocHV4ODogTmV3IGZpbGUuCi0JKiBtaC1ocHV4OiBVc2UgWDExUjUgcmF0aGVyIHRoYW4gWDExUjQuCi0KLVRodSBGZWIgIDkgMTE6MDQ6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaC1saW51eCAoU1lTVik6IERvbid0IGRlZmluZS4KLQkoUkFOTElCKTogRG9uJ3QgZGVmaW5lLgotCi1XZWQgSmFuIDExIDE2OjI5OjM0IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBtPy0qcGljIChMSUJDWFhGTEFHUyk6IEFkZCAtZm5vLWltcGxpY2l0LXRlbXBsYXRlcy4KLQotVGh1IE5vdiAgMyAxNzoyNzoxOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtaC1pcml4NCAoQ0MpOiBJbmNyZWFzZSBtYXhpbXVtIHN0cmluZyBsZW5ndGguCi0KLQkqIG1oLXNjbyAoQ0MpOiBEZWZpbmUgYXdheSBjb25zdCwgaXQgZG9lc24ndCB3b3JrIHJpZ2h0OyBlbGVtZW50cwotCW9mIGFycmF5cyBvZiBwdHItdG8tY29uc3QgYXJlIGNvbnNpZGVyZWQgY29uc3QgdGhlbXNlbHZlcy4KLQotU2F0IEp1bCAxNiAxMjoxNzo0OSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG1oLWN4dXg6IE5ldyBmaWxlLCBmcm9tIEJvYiBSdXNrIChycnVza0BtYWlsLmNzZC5oYXJyaXMuY29tKS4KLQotU2F0IEp1biAgNCAxNzoyMjoxMiAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogbWgtbmNyc3ZyNDM6ICBOZXcgZmlsZSBmcm9tIFRvbSBNY0Nvbm5lbGwKLQk8dG1jY29ubmVAc2Vkb25hLmludGVsLmNvbT4uCi0KLVRodSBNYXkgMTkgMDA6MzI6MTEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG1oLWhwdXggKENDKTogQWRkIC1XcCwtSDI1NjAwMCB0byBhdm9pZCAidG9vIG11Y2ggZGVmaW5pbmciCi0JZXJyb3JzIGZyb20gdGhlIEhQVVggOCBjb21waWxlcnMuCi0KLVdlZCBNYXkgIDQgMjA6MTQ6NDcgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBtaC1seW54cnM2azogc2V0IFNIRUxMIHRvIC9iaW4vYmFzaAotCi1UdWUgQXByIDEyIDEyOjM4OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWgtaXJpeDQgKENDKTogQ2hhbmdlIC1YTmgxNTAwIHRvIC1YTmgyMDAwLgotCi1TYXQgRGVjIDI1IDIwOjAzOjQ1IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBtdC1ocHBhOiBEZWxldGUuCi0KLVR1ZSBOb3YgMTYgMjI6NTQ6MzkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG1oLWE2OGJzZDogRGVmaW5lIENDIHRvIGdjYy4KLQotTW9uIE5vdiAxNSAxNjo1Njo1MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbWgtbGludXg6IERvbid0IHB1dCAtc3RhdGljIGluIExERkxBR1MuICBBZGQgY29tbWVudHMuCi0KLU1vbiBOb3YgMTUgMTM6Mzc6NTggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBtaC1zeXN2NCAoQVJfRkxBR1MpOiBjaGFuZ2UgZnJvbSBjcSB0byBjcgotCi1GcmkgTm92ICA1IDA4OjEyOjMyIDE5OTMgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAYmx1ZXMuY3lnbnVzLmNvbSkKLQotCSogbWgtdW5peHdhcmU6IHJlbW92ZS4gIEl0J3MgdGhlIHNhbWUgYXMgc3lzdjQsIGFuZCBjb25maWcuZ3Vlc3MKLQljYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlLiAgU28gZG9uJ3QgYWxsb3cgc2tldy4KLQotV2VkIE9jdCAyMCAyMDozNToxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbWgtaHAzMDA6IFJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2UsIGJ1dCBhZGQgY29tbWVudCBleHBsYWluaW5nLgotCi1UdWUgT2N0IDE5IDE4OjU4OjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtaC1ocDMwMDogRG9uJ3QgZGVmaW5lIENGTEFHUyB0byBlbXB0eS4gIFdoeSBzaG91bGQgaHAzMDAgYmUKLQlkaWZmZXJlbnQgZnJvbSBhbnl0aGluZyBlbHNlPyAgKCJnZGIgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBuYXRpdmUKLQlkZWJ1ZyBmb3JtYXQiIGlzbid0IGEgZ29vZCBlbm91Z2ggYW5zd2VyIGJlY2F1c2Ugd2UgbWlnaHQgYmUgdXNpbmcKLQlnY2MpLgotCi1UdWUgT2N0ICA1IDEyOjE3OjQwIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogbWgtYWxwaGFvc2Y6IFJlbW92ZSwgbm8gbG9uZ2VyIG5lY2Vzc2FyeSBub3cgdGhhdCBnZGIga25vd3MKLQlob3cgdG8gaGFuZGxlIE9TRi8xIHNoYXJlZCBsaWJyYXJpZXMuCi0KLVR1ZSBKdWwgIDYgMTE6Mjc6MzMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogbWgtYWxwaGFvc2Y6IE5ldyBmaWxlLgotCi1UaHUgSnVsICAxIDE1OjQ5OjMzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtaC1yaXNjb3M6IE5ldyBmaWxlLgotCi1Nb24gSnVuIDE0IDEyOjAzOjE4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogbWgtYWl4LCBtaC1haXgzODYsIG1oLWRlY3N0YXRpb24sIG1oLWRlbHRhODgsIG1oLWhwdXgsIG1oLWlyaXg0LAotCW1oLW5jcjMwMDAsIG1oLXNvbGFyaXMsIG1oLXN5c3YsIG1oLXN5c3Y0OiByZW1vdmUgSU5TVEFMTD1jcCBsaW5lLAotCW5vdyB0aGF0IHdlJ3JlIHVzaW5nIGluc3RhbGwuc2ggZ2xvYmFsbHkKLQotRnJpIEp1biAgNCAxNjowOTozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1oLXN5c3Y0IChJTlNUQUxMKTogVXNlIGNwLCBub3QgL3Vzci91Y2IvaW5zdGFsbC4KLQotVGh1IEFwciAgOCAxMToyMTo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG10LWEyOWssIG10LWVibW9uMjlrLCBtdC1vczY4aywgbXQtb3NlNjgwMDAsIG10LW9zZTY4aywKLQltdC12eHdvcmtzNjgsIG10LXZ4d29ya3M5NjA6IFJlbW92ZWQgb2Jzb2xldGUsIHVudXNlZCB0YXJnZXQKLQlNYWtlZmlsZSBmcmFnbWVudCBmaWxlcy4KLQotTW9uIE1hciAgOCAxNTowNToyNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1oLWFpeDM4NjogTmV3IGZpbGU7IG9sZCBtaC1haXgsIHBsdXMgbm8tb3AgUkFOTElCLgotCi1UaHUgT2N0ICAxIDEzOjUwOjQ4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogbWgtc29sYXJpczogSU5TVEFMTCBpcyBOT1QgL3Vzci91Y2IvaW5zdGFsbAotCi1Nb24gQXVnIDI0IDE0OjI1OjM1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbXQtb3NlNjgwMDAsIG10LW9zZTY4azogcmVuYW1lZCBmcm9tIG10LU9TRSouCi0KLVR1ZSBKdWwgMjEgMDI6MTE6MDEgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBtdC1PU0U2OGssIG10LTY4MDAwMDogbmV3IGNvbmZpZ3MuCi0KLVRodSBKdWwgMTYgMTc6MTI6MDkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtaC1pcml4NDogbWVyZ2VkIGNoYW5nZXMgZnJvbSBwcm9ncmVzc2l2ZS4KLQotVHVlIEp1biAgOSAyMzoyOTozOCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIEV2ZXJ5d2hlcmU6IENoYW5nZSBSQU5MSUI9ZWNobz4vZGV2L251bGwgKHdoaWNoIGNvbmZ1c2VzCi0Jc29tZSBzaGVsbHMgLSBhbmQgSSBkb24ndCBibGFtZSB0aGVtKSB0byBSQU5MSUI9dHJ1ZS4KLQkqIG1oLXNvbGFyaXM6ICBVc2UgL3Vzci91Y2IvaW5zdGFsbCBmb3IgSU5TVEFMTC4KLQotU3VuIE1heSAzMSAxNDo0NToyMyAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQotCi0JKiBtaC1zb2xhcmlzMjogQWRkIG5ldyBjb25maWd1cmF0aW9uIGZvciBTb2xhcmlzIDIgKHN5c3YsIG5vIHJhbmxpYikKLQotRnJpIEFwciAxMCAyMzoxMDowOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbWgtbmNyMzAwMDogIEFkZCBuZXcgY29uZmlndXJhdGlvbiBmb3IgTkNSIDMwMDAuCi0KLVR1ZSBEZWMgMTAgMDA6MTA6NTUgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBDaGFuZ2VMb2c6IGZyZXNoIGNoYW5nZWxvZy4KLQpkaWZmIC0tZ2l0IGEvY29uZmlnL2FjaW5jbHVkZS5tNCBiL2NvbmZpZy9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3OTljZWQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL2FjaW5jbHVkZS5tNAorKysgL2Rldi9udWxsCkBAIC0xLDE5OTQgKzAsMCBAQAotZG5sIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBpbnRvIGFsbCBhbnkgb3RoZXIgYWNpbmNsdWRlIGZpbGUgdGhhdCBuZWVkcwotZG5sIHRvIHVzZSB0aGVzZSBtYWNyb3MuCi0KLWRubCBUaGlzIGlzIGNvcGllZCBmcm9tIGF1dG9jb25mIDIuMTIsIGJ1dCBkb2VzIGNhbGxzIG91ciBvd24gQUNfUFJPR19DQ19XT1JLUywKLWRubCBhbmQgZG9lc24ndCBjYWxsIEFDX1BST0dfQ1hYX0dOVSwgY2F1c2Ugd2UgdGVzdCBmb3IgdGhhdCBpbiAgQUNfUFJPR19DQ19XT1JLUy4KLWRubCBXZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlciwgd2hpY2ggd2lsbCBub3QgYmUgYWJsZSB0byBmdWxseQotZG5sIGxpbmsgYW4gZXhlY3V0YWJsZS4gIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBmaXhlZCBpbiBhdXRvY29uZiBpdHNlbGYuCi1kbmwgRmluZCBhIHdvcmtpbmcgRysrIGNyb3NzIGNvbXBpbGVyLiBUaGlzIG9ubHkgd29ya3MgZm9yIHRoZSBHTlUgQysrIGNvbXBpbGVyLgotQUNfREVGVU4oQ1lHX0FDX1BST0dfQ1hYX0NST1NTLAotW0FDX0JFRk9SRShbJDBdLCBbQUNfUFJPR19DWFhDUFBdKQotQUNfQ0hFQ0tfUFJPR1MoQ1hYLCAkQ0NDIGMrKyBnKysgZ2NjIENDIGN4eCBjYysrLCBnY2MpCi0KLUNZR19BQ19QUk9HX0dYWF9XT1JLUwotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2d4eCA9IHllczsgdGhlbgotICBHWFg9eWVzCi1kbmwgQ2hlY2sgd2hldGhlciAtZyB3b3JrcywgZXZlbiBpZiBDWFhGTEFHUyBpcyBzZXQsIGluIGNhc2UgdGhlIHBhY2thZ2UKLWRubCBwbGF5cyBhcm91bmQgd2l0aCBDWFhGTEFHUyAoc3VjaCBhcyB0byBidWlsZCBib3RoIGRlYnVnZ2luZyBhbmQKLWRubCBub3JtYWwgdmVyc2lvbnMgb2YgYSBsaWJyYXJ5KSwgdGFzdGVsZXNzIGFzIHRoYXQgaWRlYSBpcy4KLSAgYWNfdGVzdF9DWFhGTEFHUz0iJHtDWFhGTEFHUytzZXR9IgotICBhY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCi0gIENYWEZMQUdTPQotICBBQ19QUk9HX0NYWF9HCi0gIGlmIHRlc3QgIiRhY190ZXN0X0NYWEZMQUdTIiA9IHNldDsgdGhlbgotICAgIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyIKLSAgZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2N4eF9nID0geWVzOyB0aGVuCi0gICAgQ1hYRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENYWEZMQUdTPSItTzIiCi0gIGZpCi1lbHNlCi0gIEdYWD0KLSAgdGVzdCAiJHtDWFhGTEFHUytzZXR9IiA9IHNldCB8fCBDWFhGTEFHUz0iLWciCi1maQotXSkKLQotZG5sIFNlZSBpZiB0aGUgRysrIGNvbXBpbGVyIHdlIGZvdW5kIHdvcmtzLgotQUNfREVGVU4oQ1lHX0FDX1BST0dfR1hYX1dPUktTLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgRysrIGNvbXBpbGVyICgkQ1hYICRDWFhGTEFHUyAkTERGTEFHUykgYWN0dWFsbHkgd29ya3NdKQotQUNfTEFOR19TQVZFCi1BQ19MQU5HX0NQTFVTUExVUwotZG5sIFRyeSBhIHRlc3QgY2FzZS4gV2Ugb25seSBjb21waWxlLCBiZWNhdXNlIGl0J3MgY2xvc2UgdG8gaW1wb3NzaWJsZQotZG5sIHRvIGdldCBhIGNvcnJlY3QgZnVsbHkgbGlua2VkIGV4ZWN1dGFibGUgd2l0aCBhIGNyb3NzIGNvbXBpbGVyLiBGb3IKLWRubCBtb3N0IGNyb3NzIGNvbXBpbGVycywgdGhpcyB0ZXN0IGlzIGJvZ3VzLiBGb3IgRysrLCB3ZSBjYW4gdXNlIHZhcmlvdXMKLWRubCBvdGhlciBjb21waWxlIGxpbmUgb3B0aW9ucyB0byBnZXQgYSBkZWNlbnQgaWRlYSB0aGF0IHRoZSBjcm9zcyBjb21waWxlcgotZG5sIGFjdHVhbGx5IGRvZXMgd29yaywgZXZlbiB0aG91Z2ggd2UgY2FuJ3QgcHJvZHVjZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQKLWRubCBtb3JlIGluZm8gYWJvdXQgdGhlIHRhcmdldCBpdCdzIGJlaW5nIGNvbXBpbGVkIGZvci4gVGhpcyBvbmx5IHdvcmtzCi1kbmwgZm9yIHRoZSBHTlUgQysrIGNvbXBpbGVyLgotCi1kbmwgVHJhbnNmb3JtIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlciB0byBpdCdzIGNyb3NzIHZhcmlhbnQsIHVubGVzcwotZG5sIENYWCBpcyBzZXQuIFRoaXMgaXMgYWxzbyB3aGF0IENYWCBnZXRzIHNldCB0byBpbiB0aGUgZ2VuZXJhdGVkCi1kbmwgTWFrZWZpbGUuCi1pZiB0ZXN0IHgiJHtDWFh9IiA9IHhjKysgOyB0aGVuCi0gICAgQ1hYPWBlY2hvIGdjYyB8IHNlZCAtZSAiJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSJgCi1maQotCi1kbmwgR2V0IEcrKydzIGZ1bGwgcGF0aCB0byBsaWJnY2MuYQotbGliZ2NjcGF0aD1gJHtDWFh9IC0tcHJpbnQtbGliZ2NjYAotCi1kbmwgSWYgd2UgZG9uJ3QgaGF2ZSBhIHBhdGggd2l0aCBsaWJnY2MuYSBvbiB0aGUgZW5kLCB0aGlzIGlzbid0IEcrKy4KLWlmIHRlc3QgYGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6Ly4qLzo6J2AgPSBsaWJnY2MuYSA7IHRoZW4KLSAgIGFjX2N2X3Byb2dfZ3h4PXllcwotZWxzZQotICAgYWNfY3ZfcHJvZ19neHg9bm8KLWZpCi0KLWRubCBJZiB3ZSBhcmUgdXNpbmcgRysrLCBsb29rIGZvciB0aGUgZmlsZXMgdGhhdCBuZWVkIHRvIGV4aXN0IGlmIHRoaXMKLWRubCBjb21waWxlciB3b3Jrcy4KLWlmIHRlc3QgeCIke2FjX2N2X3Byb2dfZ3h4fSIgPSB4eWVzIDsgdGhlbgotICAgIGdjY2ZpbGVzPWBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOi9saWJnY2MuYTo6J2AKLSAgICBpZiB0ZXN0IC1mICR7Z2NjZmlsZXN9L3NwZWNzIC1hIC1mICR7Z2NjZmlsZXN9L2NwcCAtYSAtZiAke2djY2ZpbGVzfS9jYzFwbHVzOyB0aGVuCi0JZ2NjZmlsZXM9eWVzCi0gICAgZWxzZQotCWdjY2ZpbGVzPW5vCi0gICAgZmkKLSAgICBnY2NsaWJzPWBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOmxpYi9nY2MtbGliLzo6JyAtZSAnczovbGliZ2NjLmE6OicgLWUgJ3MsXCguKlwpLy4qLFwxLGcnYC9saWIKLSAgICBpZiB0ZXN0IC1kICR7Z2NjbGlic30vbGRzY3JpcHRzIC1hIC1mICR7Z2NjbGlic30vbGliYy5hIC1hIC1mICR7Z2NjbGlic30vbGlic3RkYysrLmEgOyB0aGVuCi0JZ2NjbGlicz15ZXMKLSAgICBlbHNlCi0JZ2NjbGlicz1ubwotICAgIGZpCi1maQotCi1kbmwgSWYgZXZlcnl0aGluZyBpcyBPSywgdGhlbiB3ZSBjYW4gc2FmZWx5IGFzc3VtZSB0aGUgY29tcGlsZXIgd29ya3MuCi1pZiB0ZXN0IHgiJHtnY2NmaWxlc30iID0geG5vIC1vIHgiJHtnY2NsaWJzfSIgPSB4bm87IHRoZW4KLSAgICBhY19jdl9wcm9nX2N4eF93b3Jrcz1ubwotICAgIEFDX01TR19FUlJPUigke0NYWH0gaXMgYSBub24td29ya2luZyBjcm9zcyBjb21waWxlcikKLWVsc2UKLSAgIGFjX2N2X3Byb2dfY3h4X3dvcmtzPXllcyAKLWZpCi0KLUFDX0xBTkdfUkVTVE9SRQotQUNfTVNHX1JFU1VMVCgkYWNfY3ZfcHJvZ19jeHhfd29ya3MpCi1pZiB0ZXN0IHgiJGFjX2N2X3Byb2dfY3h4X3dvcmtzIiA9IHhubzsgdGhlbgotICBBQ19NU0dfRVJST1IoW2luc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMrKyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLl0pCi1maQotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBHKysgY29tcGlsZXIgKCRDWFggJENYWEZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyXSkKLUFDX01TR19SRVNVTFQoJGFjX2N2X3Byb2dfY3h4X2Nyb3NzKQotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2N4eF9jcm9zcwotQUNfU1VCU1QoQ1hYKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgRmluZCBhIHdvcmtpbmcgR0NDIGNyb3NzIGNvbXBpbGVyLiBUaGlzIG9ubHkgd29ya3MgZm9yIHRoZSBHTlUgZ2NjIGNvbXBpbGVyLgotZG5sIFRoaXMgaXMgYmFzZWQgb24gdGhlIG1hY3JvcyBhYm92ZSBmb3IgRysrLgotQUNfREVGVU4oQ1lHX0FDX1BST0dfQ0NfQ1JPU1MsCi1bQUNfQkVGT1JFKFskMF0sIFtBQ19QUk9HX0NDUFBdKQotQUNfQ0hFQ0tfUFJPR1MoQ0MsIGNjLCBnY2MpCi0KLUNZR19BQ19QUk9HX0dDQ19XT1JLUwotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1kbmwgQ2hlY2sgd2hldGhlciAtZyB3b3JrcywgZXZlbiBpZiBDRkxBR1MgaXMgc2V0LCBpbiBjYXNlIHRoZSBwYWNrYWdlCi1kbmwgcGxheXMgYXJvdW5kIHdpdGggQ0ZMQUdTIChzdWNoIGFzIHRvIGJ1aWxkIGJvdGggZGVidWdnaW5nIGFuZAotZG5sIG5vcm1hbCB2ZXJzaW9ucyBvZiBhIGxpYnJhcnkpLCB0YXN0ZWxlc3MgYXMgdGhhdCBpZGVhIGlzLgotICBhY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0KLSAgQUNfUFJPR19DQ19HCi0gIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLSAgZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLU8yIgotICBmaQotZWxzZQotICBHWFg9Ci0gIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0IHx8IENGTEFHUz0iLWciCi1maQotXSkKLQotZG5sIFNlZSBpZiB0aGUgR0NDIGNvbXBpbGVyIHdlIGZvdW5kIHdvcmtzLgotQUNfREVGVU4oQ1lHX0FDX1BST0dfR0NDX1dPUktTLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgR2NjIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgYWN0dWFsbHkgd29ya3NdKQotQUNfTEFOR19TQVZFCi1BQ19MQU5HX0MKLWRubCBUcnkgYSB0ZXN0IGNhc2UuIFdlIG9ubHkgY29tcGlsZSwgYmVjYXVzZSBpdCdzIGNsb3NlIHRvIGltcG9zc2libGUKLWRubCB0byBnZXQgYSBjb3JyZWN0IGZ1bGx5IGxpbmtlZCBleGVjdXRhYmxlIHdpdGggYSBjcm9zcwotZG5sIGNvbXBpbGVyLiBGb3IgbW9zdCBjcm9zcyBjb21waWxlcnMsIHRoaXMgdGVzdCBpcyBib2d1cy4gRm9yIEcrKywKLWRubCB3ZSBjYW4gdXNlIHZhcmlvdXMgb3RoZXIgY29tcGlsZSBsaW5lIG9wdGlvbnMgdG8gZ2V0IGEgZGVjZW50IGlkZWEKLWRubCB0aGF0IHRoZSBjcm9zcyBjb21waWxlciBhY3R1YWxseSBkb2VzIHdvcmssIGV2ZW4gdGhvdWdoIHdlIGNhbid0Ci1kbmwgcHJvZHVjZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgbW9yZSBpbmZvIGFib3V0IHRoZSB0YXJnZXQgaXQncwotZG5sIGJlaW5nIGNvbXBpbGVkIGZvci4gVGhpcyBvbmx5IHdvcmtzIGZvciB0aGUgR05VIEMrKyBjb21waWxlci4KLQotZG5sIFRyYW5zZm9ybSB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZXIgdG8gaXQncyBjcm9zcyB2YXJpYW50LCB1bmxlc3MKLWRubCBDWFggaXMgc2V0LiBUaGlzIGlzIGFsc28gd2hhdCBDQyBnZXRzIHNldCB0byBpbiB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlLgotaWYgdGVzdCB4IiR7Q0N9IiA9IHhjYyA7IHRoZW4KLSAgICBDQz1gZWNobyBnY2MgfCBzZWQgLWUgIiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX0iYAotZmkKLQotZG5sIEdldCBHY2MncyBmdWxsIHBhdGggdG8gbGliZ2NjLmEKLWxpYmdjY3BhdGg9YCR7Q0N9IC0tcHJpbnQtbGliZ2NjYAotCi1kbmwgSWYgd2UgZG9uJ3QgaGF2ZSBhIHBhdGggd2l0aCBsaWJnY2MuYSBvbiB0aGUgZW5kLCB0aGlzIGlzbid0IEcrKy4KLWlmIHRlc3QgYGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6Ly4qLzo6J2AgPSBsaWJnY2MuYSA7IHRoZW4KLSAgIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi0KLWRubCBJZiB3ZSBhcmUgdXNpbmcgR2NjLCBsb29rIGZvciB0aGUgZmlsZXMgdGhhdCBuZWVkIHRvIGV4aXN0IGlmIHRoaXMKLWRubCBjb21waWxlciB3b3Jrcy4KLWlmIHRlc3QgeCIke2FjX2N2X3Byb2dfZ2NjfSIgPSB4eWVzIDsgdGhlbgotICAgIGdjY2ZpbGVzPWBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOi9saWJnY2MuYTo6J2AKLSAgICBpZiB0ZXN0IC1mICR7Z2NjZmlsZXN9L3NwZWNzIC1hIC1mICR7Z2NjZmlsZXN9L2NwcCAtYSAtZiAke2djY2ZpbGVzfS9jYzFwbHVzOyB0aGVuCi0JZ2NjZmlsZXM9eWVzCi0gICAgZWxzZQotCWdjY2ZpbGVzPW5vCi0gICAgZmkKLSAgICBnY2NsaWJzPWBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOmxpYi9nY2MtbGliLzo6JyAtZSAnczovbGliZ2NjLmE6OicgLWUgJ3MsXCguKlwpLy4qLFwxLGcnYC9saWIKLSAgICBpZiB0ZXN0IC1kICR7Z2NjbGlic30vbGRzY3JpcHRzIC1hIC1mICR7Z2NjbGlic30vbGliYy5hIC1hIC1mICR7Z2NjbGlic30vbGlic3RkYysrLmEgOyB0aGVuCi0JZ2NjbGlicz15ZXMKLSAgICBlbHNlCi0JZ2NjbGlicz1ubwotICAgIGZpCi1maQotCi1kbmwgSWYgZXZlcnl0aGluZyBpcyBPSywgdGhlbiB3ZSBjYW4gc2FmZWx5IGFzc3VtZSB0aGUgY29tcGlsZXIgd29ya3MuCi1pZiB0ZXN0IHgiJHtnY2NmaWxlc30iID0geG5vIC1vIHgiJHtnY2NsaWJzfSIgPSB4bm87IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi0gICAgQUNfTVNHX0VSUk9SKCR7Q0N9IGlzIGEgbm9uLXdvcmtpbmcgY3Jvc3MgY29tcGlsZXIpICAgIAotZWxzZQotICAgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi1maQotCi1BQ19MQU5HX1JFU1RPUkUKLUFDX01TR19SRVNVTFQoJGFjX2N2X3Byb2dfY2Nfd29ya3MpCi1pZiB0ZXN0IHgiJGFjX2N2X3Byb2dfY2Nfd29ya3MiID0geG5vOyB0aGVuCi0gIEFDX01TR19FUlJPUihbaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQysrIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuXSkKLWZpCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIEdjYyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXJdKQotQUNfTVNHX1JFU1VMVCgkYWNfY3ZfcHJvZ19jY19jcm9zcykKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotQUNfU1VCU1QoQ0MpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIHRoZSBCRkQgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZS4gVGhpcyBpcyB1c2VkIHRvIGFjY2VzcyBhbmQKLWRubCBtYW5pcHVsYXRlIG9iamVjdCBvciBleGVjdXRhYmxlIGZpbGVzLgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfQkZELCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBiZmQgaGVhZGVyIGluIHRoZSBidWlsZCB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWRubCBMb29rIGZvciB0aGUgaGVhZGVyIGZpbGUKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2JmZGgsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvYmZkL2JmZC5oIiA7IHRoZW4KLQlhY19jdl9jX2JmZGg9YChjZCAkaS9iZmQ7IHB3ZClgCi0JYnJlYWsKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfYmZkaH0iICE9IHg7IHRoZW4KLSAgICBCRkRIRElSPSItSSR7YWNfY3ZfY19iZmRofSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19iZmRofSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoQkZESERJUikKLQotZG5sIExvb2sgZm9yIHRoZSBsaWJyYXJ5Ci1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBiZmQgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2JmZGxpYixbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9iZmQvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2NfYmZkbGliPWAoY2QgJGkvYmZkOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotZG5sIFdlIGxpc3QgdHdvIGRpcmVjdG9yaWVzIGNhdXNlIGJmZCBub3cgdXNlcyBsaWJ0b29sCi1pZiB0ZXN0IHgiJHthY19jdl9jX2JmZGxpYn0iICE9IHg7IHRoZW4KLSAgICBCRkRMSUI9Ii1MJHthY19jdl9jX2JmZGxpYn0gLUwke2FjX2N2X2NfYmZkbGlifS8ubGlicyIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19iZmRsaWJ9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChCRkRMSUIpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIHRoZSBsaWJpYmVydHkgbGlicmFyeS4gVGhpcyBkZWZpbmVzIG1hbnkgY29tbW9ubHkgdXNlZCBDCi1kbmwgZnVuY3Rpb25zIHRoYXQgZXhpc3RzIGluIHZhcmlvdXMgc3RhdGVzIGJhc2VkIG9uIHRoZSB1bmRlcmx5aW5nIE9TLgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCRVJUWSwgWwotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgbGliZXJ0eSBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2xpYmVydHksWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvbGliaWJlcnR5L01ha2VmaWxlIiA7IHRoZW4KLQlhY19jdl9jX2xpYmVydHk9YChjZCAkaS9saWJpYmVydHk7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmVydHl9IiAhPSB4OyB0aGVuCi0gICAgTElCRVJUWT0iLUwke2FjX2N2X2NfbGliZXJ0eX0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfbGliZXJ0eX0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKExJQkVSVFkpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIHRoZSBvcGNvZGVzIGxpYnJhcnkuIFRoaXMgaXMgdXNlZCB0byBkbyBkaXNzYXNlbWJsaWVzLgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfT1BDT0RFUywgWwotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgb3Bjb2RlcyBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX29wYyxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9vcGNvZGVzL01ha2VmaWxlIiA7IHRoZW4KLQlhY19jdl9jX29wYz1gKGNkICRpL29wY29kZXM7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX29wY30iICE9IHg7IHRoZW4KLSAgICBPUENPREVTTElCPSItTCR7YWNfY3ZfY19vcGN9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX29wY30pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKE9QQ09ERVNMSUIpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBMb29rIGZvciB0aGUgRGVqYUdudSBoZWFkZXIgZmlsZSBpbiB0aGUgc291cmNlIHRyZWUuIFRoaXMgZmlsZQotZG5sIGRlZmluZXMgdGhlIGZ1bmN0aW9ucyB1c2VkIHRvIHRlc3Rpbmcgc3VwcG9ydC4KLUFDX0RFRlVOKENZR19BQ19QQVRIX0RFSkFHTlUsIFsKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIHRlc3Rpbmcgc3VwcG9ydCBmaWxlcyBpbiB0aGUgc291cmNlIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfZGVqYWdudSxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkc3JjZGlyLyRpL2VjYy9lY2MvaW5mcmEvdGVzdGxpYi9jdXJyZW50L2luY2x1ZGUvZGVqYWdudS5oIiA7IHRoZW4KLQlhY19jdl9jX2RlamFnbnU9YChjZCAkc3JjZGlyLyRpL2VjYy9lY2MvaW5mcmEvdGVzdGxpYi9jdXJyZW50L2luY2x1ZGU7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2RlamFnbnV9IiAhPSB4OyB0aGVuCi0gICAgREVKQUdOVUhESVI9Ii1JJHthY19jdl9jX2RlamFnbnV9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2RlamFnbnV9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19kZWphZ251bGliLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRzcmNkaXIvJGkvaW5mcmEvdGVzdGxpYi9jdXJyZW50L2xpYi9ob3N0dXRpbC5leHAiIDsgdGhlbgotCWFjX2N2X2NfZGVqYWdudWxpYj1gKGNkICRzcmNkaXIvJGkvaW5mcmEvdGVzdGxpYi9jdXJyZW50L2xpYjsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfZGVqYWdudWxpYn0iICE9IHg7IHRoZW4KLSAgICBERUpBR05VTElCPSIke2FjX2N2X2NfZGVqYWdudWxpYn0iCi1lbHNlCi0gICAgREVKQUdOVUxJQj0iIgotZmkKLUFDX01TR19DSEVDS0lORyhmb3IgcnVudGVzdCBpbiB0aGUgc291cmNlIHRyZWUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19ydW50ZXN0LFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRzcmNkaXIvJGkvZGVqYWdudS9ydW50ZXN0IiA7IHRoZW4KLQlhY19jdl9jX3J1bnRlc3Q9YChjZCAkc3JjZGlyLyRpL2RlamFnbnU7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX3J1bnRlc3R9IiAhPSB4OyB0aGVuCi0gICAgUlVOVEVTVERJUj0iJHthY19jdl9jX3J1bnRlc3R9IgotICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfcnVudGVzdH0pCi1lbHNlCi0gICAgUlVOVEVTVERJUj0iIgotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChSVU5URVNURElSKQotQUNfU1VCU1QoREVKQUdOVUxJQikKLUFDX1NVQlNUKERFSkFHTlVIRElSKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgRmluZCB0aGUgbGliaW50bCBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlLiBUaGlzIGlzIGZvcgotZG5sICBpbnRlcm5hdGlvbmFsaXphdGlvbiBzdXBwb3J0LgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSU5UTCwgWwotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgaW50bCBoZWFkZXIgaW4gdGhlIGJ1aWxkIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotZG5sIExvb2sgZm9yIHRoZSBoZWFkZXIgZmlsZQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaW50bGgsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvaW50bC9saWJpbnRsLmgiIDsgdGhlbgotCWFjX2N2X2NfaW50bGg9YChjZCAkaS9pbnRsOyBwd2QpYAotCWJyZWFrCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2ludGxofSIgIT0geDsgdGhlbgotICAgIElOVExIRElSPSItSSR7YWNfY3ZfY19pbnRsaH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaW50bGh9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChJTlRMSERJUikKLQotZG5sIExvb2sgZm9yIHRoZSBsaWJyYXJ5Ci1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBsaWJpbnRsIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbnRsbGliLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2ludGwvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2NfaW50bGxpYj1gKGNkICRpL2ludGw7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2ludGxsaWJ9IiAhPSB4OyB0aGVuCi0gICAgSU5UTExJQj0iLUwke2FjX2N2X2NfaW50bGxpYn0gLWxpbnRsIgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2ludGxsaWJ9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChJTlRMTElCKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgRmluZCB0aGUgc2ltdWxhdG9yIGxpYnJhcnkuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9TSU0sIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1jYXNlICIkdGFyZ2V0X2NwdSIgaW4KLSAgICBwb3dlcnBjKQl0YXJnZXRfZGlyPXBwYyA7OwotICAgIHNwYXJjKikJdGFyZ2V0X2Rpcj1lcmMzMiA7OwotICAgIG1pcHMqKQl0YXJnZXRfZGlyPW1pcHMgOzsKLSAgICAqKQkJdGFyZ2V0X2Rpcj0kdGFyZ2V0X2NwdSA7OwotZXNhYwotZG5sIEZpcnN0IGxvb2sgZm9yIHRoZSBoZWFkZXIgZmlsZQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgc2ltdWxhdG9yIGhlYWRlciBmaWxlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2Nfc2ltaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJGkvaW5jbHVkZS9yZW1vdGUtc2ltLmgiIDsgdGhlbgotCWFjX2N2X2Nfc2ltaD1gKGNkICR7c3JjZGlyfS8kaS9pbmNsdWRlOyBwd2QpYAotCWJyZWFrCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX3NpbWh9IiAhPSB4OyB0aGVuCi0gICAgU0lNSERJUj0iLUkke2FjX2N2X2Nfc2ltaH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2Nfc2ltaH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKFNJTUhESVIpCi0KLWRubCBTZWUgd2hldGhlciBpdCdzIGEgZGV2byBvciBGb3VuZHJ5IGJyYW5jaCBzaW11bGF0b3IKLUFDX01TR19DSEVDS0lORyhXaGV0aGVyIHRoaXMgaXMgYSBkZXZvIHNpbXVsYXRvciApCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19zaW1kZXZvLFsKLSAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRTSU1IRElSIgotICAgIEFDX0VHUkVQX0hFQURFUihbU0lNX0RFU0Mgc2ltX29wZW4uKnN0cnVjdCBfYmZkXSwgcmVtb3RlLXNpbS5oLAotICAgICAgICBhY19jdl9jX3NpbWRldm89eWVzLAotICAgICAgICBhY19jdl9jX3NpbWRldm89bm8pCi1dKQotaWYgdGVzdCB4IiRhY19jdl9jX3NpbWRldm8iID0geCJ5ZXMiIDsgdGhlbgotICAgIEFDX0RFRklORShIQVZFX0RFVk9fU0lNKQotZmkKLUFDX01TR19SRVNVTFQoJHthY19jdl9jX3NpbWRldm99KQotQUNfU1VCU1QoSEFWRV9ERVZPX1NJTSkKLQotZG5sIE5leHQgbG9vayBmb3IgdGhlIGxpYnJhcnkKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIHNpbXVsYXRvciBsaWJyYXJ5KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2Nfc2ltbGliLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL3NpbS8kdGFyZ2V0X2Rpci9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19zaW1saWI9YChjZCAkaS9zaW0vJHRhcmdldF9kaXI7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX3NpbWxpYn0iICE9IHg7IHRoZW4KLSAgICBTSU1MSUI9Ii1MJHthY19jdl9jX3NpbWxpYn0iCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgIGRubCBGSVhNRTogdGhpcyBpcyBraW5kYSBib2d1cywgY2F1c2UgdW10aW1hdGVseSB0aGUgVE0gd2lsbCBidWlsZAotICAgIGRubCBhbGwgdGhlIGxpYnJhcmllcyBmb3Igc2V2ZXJhbCBhcmNoaXRlY3R1cmVzLiBCdXQgZm9yIG5vdywgdGhpcwotICAgIGRubCB3aWxsIHdvcmsgdGlsbCB0aGVuLgotZG5sICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBzaW11bGF0b3IgaW5zdGFsbGVkIHdpdGggdGhlIGNvbXBpbGVyIGxpYnJhcmllcykKLSAgICBkbmwgVHJhbnNmb3JtIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlciB0byBpdCdzIGNyb3NzIHZhcmlhbnQsIHVubGVzcwotICAgIGRubCBDWFggaXMgc2V0LiBUaGlzIGlzIGFsc28gd2hhdCBDWFggZ2V0cyBzZXQgdG8gaW4gdGhlIGdlbmVyYXRlZAotICAgIGRubCBNYWtlZmlsZS4KLSAgICBDUk9TU19HQ0M9YGVjaG8gZ2NjIHwgc2VkIC1lICJzL14vJHRhcmdldC8iYAotCi0gICAgZG5sIEdldCBHKysncyBmdWxsIHBhdGggdG8gbGliZ2NjLmEKLWNoYW5nZXF1b3RlKCwpCi0gICAgZ2NjcGF0aD1gJHtDUk9TU19HQ0N9IC0tcHJpbnQtbGliZ2NjIHwgc2VkIC1lICdzOlthLXowLTlBLVpcLlwtXSovbGliZ2NjLmE6OicgLWUgJ3M6bGliL2djYy1saWIvOjonYGxpYgotY2hhbmdlcXVvdGUoWyxdKQotICAgIGlmIHRlc3QgLWYgJGdjY3BhdGgvbGlic2ltLmEgLW8gLWYgJGdjY3BhdGgvbGlic2ltLnNvIDsgdGhlbgotICAgICAgICBhY19jdl9jX3NpbWxpYj0iJGdjY3BhdGgvIgotICAgICAgICBTSU1MSUI9Ii1MJHthY19jdl9jX3NpbWxpYn0iCi0JQUNfTVNHX1JFU1VMVCgke2FjX2N2X2Nfc2ltbGlifSkKLSAgICBlbHNlCi0gICAgICAgIEFNX0NPTkRJVElPTkFMKFBTSU0sIHRlc3QgeCRwc2ltID0geG5vKQotCVNJTUxJQj0iIgotCUFDX01TR19SRVNVTFQobm9uZSkKLWRubCAgICAgICAgIGFjX2N2X2Nfc2ltbGliPW5vbmUKLSAgICBmaQotZmkKLUFDX1NVQlNUKFNJTUxJQikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCSUJFUlRZLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBsaWJpYmVydHkgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19saWJpYixbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9saWJpYmVydHkvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2NfbGliaWI9YChjZCAkaS9saWJpYmVydHkvOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJpYn0iICE9IHg7IHRoZW4KLSAgICBMSUJJQkVSVFk9Ii1MJHthY19jdl9jX2xpYmlifSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19saWJpYn0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKExJQklCRVJUWSkKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfREVWTywgWwotQUNfTVNHX0NIRUNLSU5HKGZvciBkZXZvIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2Rldm9oLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9pbmNsdWRlL3JlbW90ZS1zaW0uaCIgOyB0aGVuCi0JYWNfY3ZfY19kZXZvaD1gKGNkICR7c3JjZGlyfS8kaS9pbmNsdWRlOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19kZXZvaH0iICE9IHg7IHRoZW4KLSAgICBERVZPSERJUj0iLUkke2FjX2N2X2NfZGV2b2h9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2Rldm9ofSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoREVWT0hESVIpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBmaW5kIHRoZSBJREUgbGlicmFyeSBhbmQgaGVhZGVycy4KLUFDX0RFRlVOKENZR19BQ19QQVRIX0lERSwgWwotQUNfTVNHX0NIRUNLSU5HKGZvciBJREUgaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotSURFSERJUj0KLUlERUxJQj0KLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lkZWgsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2xpYmlkZS9zcmMvZXZlbnQuaCIgOyB0aGVuCi0JYWNfY3ZfY19pZGVoPWAoY2QgJHtzcmNkaXJ9LyRpL2xpYmlkZS9zcmM7IHB3ZClgOwotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pZGVofSIgIT0geDsgdGhlbgotICAgIElERUhESVI9Ii1JJHthY19jdl9jX2lkZWh9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lkZWh9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgTElCSURFIFRDTCBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lkZXRjbGgsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2xpYmlkZXRjbC9zcmMvaWRldGNsLmgiIDsgdGhlbgotCWFjX2N2X2NfaWRldGNsaD1gKGNkICR7c3JjZGlyfS8kaS9saWJpZGV0Y2wvc3JjOyBwd2QpYDsKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWRldGNsaH0iICE9IHg7IHRoZW4KLSAgICBJREVIRElSPSIke0lERUhESVJ9IC1JJHthY19jdl9jX2lkZXRjbGh9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lkZXRjbGh9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgSURFIGhlYWRlcnMgaW4gdGhlIGJ1aWxkIHRyZWUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pZGVoMixbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9saWJpZGUvc3JjL01ha2VmaWxlIiA7IHRoZW4KLQlhY19jdl9jX2lkZWgyPWAoY2QgJGkvbGliaWRlL3NyYzsgcHdkKWA7Ci0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZWgyfSIgIT0geDsgdGhlbgotICAgIElERUhESVI9IiR7SURFSERJUn0gLUkke2FjX2N2X2NfaWRlaDJ9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lkZWgyfSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1kbmwgbG9vayBmb3IgdGhlIGxpYnJhcnkKLUFDX01TR19DSEVDS0lORyhmb3IgSURFIGxpYnJhcnkpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pZGVsaWIsWwotaWYgdGVzdCB4IiR7YWNfY3ZfY19pZGVsaWJ9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9saWJpZGUvc3JjL01ha2VmaWxlIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pZGVsaWI9YChjZCAkaS9saWJpZGUvc3JjOyBwd2QpYAotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBkb25lCi1maV0pIAotaWYgdGVzdCB4IiR7YWNfY3ZfY19pZGVsaWJ9IiAhPSB4IDsgdGhlbgotICAgICBJREVMSUI9Ii1MJHthY19jdl9jX2lkZWxpYn0iCi0gICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lkZWxpYn0pCi1lbHNlCi0gICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLWRubCBmaW5kIGxpYmlkZGV0Y2wuYSBpZiBpdCBleGlzdHMKLUFDX01TR19DSEVDS0lORyhmb3IgSURFIFRDTCBsaWJyYXJ5KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWRldGNsbGliLFsKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWRldGNsbGlifSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvbGliaWRldGNsL3NyYy9NYWtlZmlsZSIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaWRldGNsbGliPWAoY2QgJGkvbGliaWRldGNsL3NyYzsgcHdkKWAKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotZmkKLV0pIAotaWYgdGVzdCB4IiR7YWNfY3ZfY19pZGV0Y2xsaWJ9IiAhPSB4IDsgdGhlbgotICAgICBJREVMSUI9IiR7SURFTElCfSAtTCR7YWNfY3ZfY19pZGV0Y2xsaWJ9IgotICAgICBJREVUQ0xMSUI9Ii1saWRldGNsIgotICAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pZGV0Y2xsaWJ9KQotZWxzZQotICAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoSURFSERJUikKLUFDX1NVQlNUKElERUxJQikKLUFDX1NVQlNUKElERVRDTExJQikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgYWxsIHRoZSBJTFUgaGVhZGVycyBhbmQgbGlicmFyaWVzCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JTFUsIFsKLUFDX01TR19DSEVDS0lORyhmb3IgSUxVIGtlcm5lbCBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVoLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9pbHUvcnVudGltZS9rZXJuZWwvbWV0aG9kLmgiIDsgdGhlbgotCWFjX2N2X2NfaWx1aD1gKGNkICR7c3JjZGlyfS8kaS9pbHUvcnVudGltZS9rZXJuZWw7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lsdWh9IiAhPSB4OyB0aGVuCi0gICAgSUxVSERJUj0iLUkke2FjX2N2X2NfaWx1aH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWx1aH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUga2VybmVsIGhlYWRlcnMgaW4gdGhlIGJ1aWxkIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1aDUsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvaWx1L3J1bnRpbWUva2VybmVsL2lsdWNvbmYuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbHVoNT1gKGNkICRpL2lsdS9ydW50aW1lL2tlcm5lbDsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWx1aDV9IiAhPSB4OyB0aGVuCi0gICAgSUxVSERJUj0iJHtJTFVIRElSfSAtSSR7YWNfY3ZfY19pbHVoNX0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWx1aDV9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgSUxVIEMrKyBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWgyLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9pbHUvc3R1YmJlcnMvY3BwL3Jlc291cmNlLmgiIDsgdGhlbgotCWFjX2N2X2NfaWx1aDI9YChjZCAke3NyY2Rpcn0vJGkvaWx1L3N0dWJiZXJzL2NwcDsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWx1aDJ9IiAhPSB4OyB0aGVuCi0gICAgSUxVSERJUj0iJHtJTFVIRElSfSAtSSR7YWNfY3ZfY19pbHVoMn0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWx1aDJ9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgSUxVIEMgaGVhZGVycykKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWgzLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9pbHUvc3R1YmJlcnMvYy9yZXNvdXJjZS5oIiA7IHRoZW4KLQlhY19jdl9jX2lsdWgzPWAoY2QgJHtzcmNkaXJ9LyRpL2lsdS9zdHViYmVycy9jICA7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lsdWgzfSIgIT0geDsgdGhlbgotICAgIElMVUhESVI9IiR7SUxVSERJUn0gLUkke2FjX2N2X2NfaWx1aDN9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lsdWgzfSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIElMVSBDIHJ1bnRpbWUgaGVhZGVycykKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWg0LFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9pbHUvcnVudGltZS9jL2lsdWNzdHViLmgiIDsgdGhlbgotCWFjX2N2X2NfaWx1aDQ9YChjZCAke3NyY2Rpcn0vJGkvaWx1L3J1bnRpbWUvYyAgOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVoNH0iICE9IHg7IHRoZW4KLSAgICBJTFVIRElSPSIke0lMVUhESVJ9IC1JJHthY19jdl9jX2lsdWg0fSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVoNH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1cGF0aCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9pbHUvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2NfaWx1cGF0aD1gKGNkICRpL2lsdTsgcHdkKWAKLQlicmVhawotICAgIGZpCi1kb25lCi1dKQotSUxVVE9QPSR7YWNfY3ZfY19pbHVwYXRofQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBJTFUgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWxpYixbCi1pZiB0ZXN0IC1mICIkYWNfY3ZfY19pbHVwYXRoL3J1bnRpbWUva2VybmVsL01ha2VmaWxlIiA7IHRoZW4KLSAgICBhY19jdl9jX2lsdWxpYj1gKGNkICRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9rZXJuZWw7IHB3ZClgCi0gICAgQUNfTVNHX1JFU1VMVChmb3VuZCAke2FjX2N2X2NfaWx1bGlifS9saWJpbHUuYSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vKQotZmldKQotICAgCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBJTFUgQysrIGJpbmRpbmdzIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVsaWIyLFsKLWlmIHRlc3QgLWYgIiRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9jcHAvTWFrZWZpbGUiIDsgdGhlbgotICAgIGFjX2N2X2NfaWx1bGliMj1gKGNkICRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9jcHA7IHB3ZClgCi0gICAgQUNfTVNHX1JFU1VMVChmb3VuZCAke2FjX2N2X2NfaWx1bGliMn0vbGliaWx1LWMrKy5hKQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm8pCi1maV0pCi0KLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIElMVSBDIGJpbmRpbmdzIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVsaWIzLFsKLWlmIHRlc3QgLWYgIiRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9jL01ha2VmaWxlIiA7IHRoZW4KLSAgICBhY19jdl9jX2lsdWxpYjM9YChjZCAkYWNfY3ZfY19pbHVwYXRoL3J1bnRpbWUvYzsgcHdkKWAKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICR7YWNfY3ZfY19pbHVsaWIzfS9saWJpbHUtYy5hKQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm8pCi1maV0pCi0KLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIElMVSBUayBiaW5kaW5ncyBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1bGliNCxbCi1pZiB0ZXN0IC1mICIkYWNfY3ZfY19pbHVwYXRoL3J1bnRpbWUvbWFpbmxvb3AvTWFrZWZpbGUiIDsgdGhlbgotICAgIGFjX2N2X2NfaWx1bGliND1gKGNkICRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9tYWlubG9vcDsgcHdkKWAKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICR7YWNfY3ZfY19pbHVsaWI0fS9saWJpbHUtdGsuYSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vKQotZmldKQotCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lsdWxpYn0iID0geCAtYSB4IiR7YWNfY3ZfY19pbHVsaWIyfSIgPSB4OyB0aGVuCi0gIElMVUhESVI9IiIKLWZpCi0KLWlmIHRlc3QgeCIke2FjX2N2X2NfaWx1bGlifSIgIT0geCAtYSB4IiR7YWNfY3ZfY19pbHVsaWIyfSIgIT0geDsgdGhlbgotICAgIElMVUxJQj0iLUwke2FjX2N2X2NfaWx1bGlifSAtTCR7YWNfY3ZfY19pbHVsaWIyfSAtTCR7YWNfY3ZfY19pbHVsaWIzfSAtTCR7YWNfY3ZfY19pbHVsaWI0fSIKLWVsc2UKLSAgICBJTFVMSUI9IiIKLWZpCi0KLWlmIHRlc3QgeCIke0lMVUxJQn0iID0geDsgdGhlbgotICAgIEFDX01TR19DSEVDS0lORyhmb3IgSUxVIGxpYnJhcmllcyBpbnN0YWxsZWQgd2l0aCB0aGUgY29tcGlsZXIpCi0gICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1bGliNSxbCi0gICAgTkFUSVZFX0dDQz1gZWNobyBnY2MgfCBzZWQgLWUgIiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX0iYAotCi0gICAgZG5sIEdldCBHKysncyBmdWxsIHBhdGggdG8gaXQncyBsaWJyYXJpZXMKLSAgICBhY19jdl9jX2lsdWxpYjU9YCR7TkFUSVZFX0dDQ30gLS1wcmludC1saWJnY2MgfCBzZWQgLWUgJ3M6bGliL2djYy1saWIvLio6OidgbGliCi0gICAgaWYgdGVzdCAtZiAkYWNfY3ZfY19pbHVsaWI1L2xpYmlsdS1jLmEgLW8gLWYgJGFjX2N2X2NfaWx1bGliNS9saWJpbHUtYy5zbyA7IHRoZW4KLSAgICAgICAgaWYgdGVzdCB4IiR7SUxVSERJUn0iID0geDsgdGhlbgotICAgICAgICAgICAgICAgSUxVSERJUj0iLUkke2FjX2N2X2NfaWx1bGliNX0vLi4vaW5jbHVkZSIKLSAgICAgICAgZmkKLSAgICAgICAgSUxVTElCPSItTCR7YWNfY3ZfY19pbHVsaWI1fSIKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWx1bGliNX0pCi0gICAgZWxzZQotICAgICAgICBhY19jdl9jX2lsdWxpYj1ub25lCi0gICAgICAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgICBmaQotZmldKQotQUNfU1VCU1QoSUxVSERJUikKLUFDX1NVQlNUKElMVUxJQikKLUFDX1NVQlNUKElMVVRPUCkKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIFRoaXMgZGVmaW5lcyB0aGUgYnl0ZSBvcmRlciBmb3IgdGhlIGhvc3QuIFdlIGNhbid0IHVzZQotZG5sIEFDX0NfQklHRU5ESUFOLCBjYXVzZSB3ZSB3YW50IHRvIGNyZWF0ZSBhIGNvbmZpZyBmaWxlIGFuZAotZG5sIHN1YnN0aXR1ZSB0aGUgcmVhbCB2YWx1ZSwgc28gdGhlIGhlYWRlciBmaWxlcyB3b3JrIHJpZ2h0Ci1BQ19ERUZVTihDWUdfQUNfQ19FTkRJQU4sIFsKLUFDX01TR19DSEVDS0lORyh0byBzZWUgaWYgdGhpcyBpcyBhIGxpdHRsZSBlbmRpYW4gaG9zdCkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2xpdHRsZV9lbmRpYW4sIFsKLWFjX2N2X2NfbGl0dGxlX2VuZGlhbj11bmtub3duCi0jIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgotQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD5dLCBbCi0jaWYgIUJZVEVfT1JERVIgfHwgIV9CSUdfRU5ESUFOIHx8ICFfTElUVExFX0VORElBTgotIGJvZ3VzIGVuZGlhbiBtYWNyb3MKLSNlbmRpZl0sIFsjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIF9MSVRUTEVfRU5ESUFOIG9yIG5vdC4KLUFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+XSwgWwotI2lmIEJZVEVfT1JERVIgIT0gX0xJVFRMRV9FTkRJQU4KLSBub3QgYmlnIGVuZGlhbgotI2VuZGlmXSwgYWNfY3ZfY19saXR0bGVfZW5kaWFuPXllcywgYWNfY3ZfY19saXR0bGVfZW5kaWFuPW5vKQotXSkKLWlmIHRlc3QgJHthY19jdl9jX2xpdHRsZV9lbmRpYW59ID0gdW5rbm93bjsgdGhlbgotb2xkX2NmbGFncz0kQ0ZMQUdTCi1DRkxBR1M9LWcKLUFDX1RSWV9SVU4oWwotbWFpbiAoKSB7Ci0gIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KLSAgdW5pb24KLSAgewotICAgIGxvbmcgbDsKLSAgICBjaGFyIGNbc2l6ZW9mIChsb25nKV07Ci0gIH0gdTsKLSAgdS5sID0gMTsKLSAgZXhpdCAodS5jWzBdID09IDEpOwotfV0sCi1hY19jdl9jX2xpdHRsZV9lbmRpYW49bm8sCi1hY19jdl9jX2xpdHRsZV9lbmRpYW49eWVzLFsKLWRubCBZZXMsIHRoaXMgaXMgdWdseSwgYW5kIG9ubHkgdXNlZCBmb3IgYSBjYW5hZGlhbiBjcm9zcyBhbnl3YXkuIFRoaXMKLWRubCBpcyBqdXN0IHRvIGtlZXAgY29uZmlndXJlIGZyb20gc3RvcHBpbmcgaGVyZS4KLWNhc2UgIiR7aG9zdH0iIGluCi1jaGFuZ2VxdW90ZSgsKQotICAgaVszNDU2XTg2LSotKikgYWNfY3ZfY19saXR0bGVfZW5kaWFuPXllcyA7OwotICAgc3BhcmMqLSotKikgICAgYWNfY3ZfY19saXR0bGVfZW5kaWFuPW5vIDs7Ci1jaGFuZ2VxdW90ZShbLF0pCi0gICopICAgIEFDX01TR19XQVJOKENhbid0IGNyb3NzIGNvbXBpbGUgdGhpcyB0ZXN0KSA7OwotZXNhY10pCi1DRkxBR1M9JG9sZF9jZmxhZ3MKLWZpXSkKLQotaWYgdGVzdCB4IiR7YWNfY3ZfY19saXR0bGVfZW5kaWFufSIgPSB4eWVzOyB0aGVuCi0gICAgQUNfREVGSU5FKExJVFRMRV9FTkRJQU5fSE9TVCkKLSAgICBFTkRJQU49IkNZR19MU0JGSVJTVCI7Ci1lbHNlCi0gICAgRU5ESUFOPSJDWUdfTVNCRklSU1QiOwotZmkKLUFDX01TR19SRVNVTFQoJHthY19jdl9jX2xpdHRsZV9lbmRpYW59KQotQUNfU1VCU1QoRU5ESUFOKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgTG9vayBmb3IgdGhlIHBhdGggdG8gbGliZ2NjLCBzbyB3ZSBjYW4gdXNlIGl0IHRvIGRpcmVjdGx5IGxpbmsKLWRubCBpbiBsaWJnY2MuYSB3aXRoIExELgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCR0NDLAotW0FDX01TR19DSEVDS0lORyhbTG9va2luZyBmb3IgdGhlIHBhdGggdG8gbGliZ2NjLmFdKQotQUNfTEFOR19TQVZFCi1BQ19MQU5HX0MKLQotZG5sIEdldCBHY2MncyBmdWxsIHBhdGggdG8gbGliZ2NjLmEKLWxpYmdjY3BhdGg9YCR7Q0N9IC0tcHJpbnQtbGliZ2NjYAotCi1kbmwgSWYgd2UgZG9uJ3QgaGF2ZSBhIHBhdGggd2l0aCBsaWJnY2MuYSBvbiB0aGUgZW5kLCB0aGlzIGlzbid0IEcrKy4KLWlmIHRlc3QgYGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6Ly4qLzo6J2AgPSBsaWJnY2MuYSA7IHRoZW4KLSAgIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi0KLWRubCAKLWlmIHRlc3QgeCIke2FjX2N2X3Byb2dfZ2NjfSIgPSB4eWVzIDsgdGhlbgotICAgZ2NjcGF0aD1gZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczovbGliZ2NjLmE6OidgCi0gICBMSUJHQ0M9Ii1MJHtnY2NwYXRofSIKLSAgIEFDX01TR19SRVNVTFQoJHtnY2NwYXRofSkKLWVsc2UKLSAgIExJQkdDQz0iIgotICAgQUNfTVNHX0VSUk9SKE5vdCB1c2luZyBnY2MpCi1maQotCi1BQ19MQU5HX1JFU1RPUkUKLUFDX1NVQlNUKExJQkdDQykKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIE9rLCBsZXRzIGZpbmQgdGhlIHRjbCBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycwotZG5sIFdhcm5pbmc6IHRyYW5zaXRpb24gb2YgdmVyc2lvbiA5IHRvIDEwIHdpbGwgYnJlYWsgdGhpcyBhbGdvcml0aG0KLWRubCBiZWNhdXNlIDEwIHNvcnRzIGJlZm9yZSA5LiBXZSBhbHNvIGxvb2sgZm9yIGp1c3QgdGNsLiBXZSBoYXZlIHRvCi1kbmwgYmUgY2FyZWZ1bCB0aGF0IHdlIGRvbid0IG1hdGNoIHN0dWZmIGxpa2UgdGNsWCBieSBhY2NpZGVudC4KLWRubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtdGNsaW5jbHVkZQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVENMLCBbCi0gICAgQ1lHX0FDX1BBVEhfVENMSAotICAgIENZR19BQ19QQVRIX1RDTENPTkZJRwotICAgIENZR19BQ19MT0FEX1RDTENPTkZJRwotXSkKLUFDX0RFRlVOKENZR19BQ19QQVRIX1RDTEgsIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1ub190Y2w9dHJ1ZQotQUNfTVNHX0NIRUNLSU5HKGZvciBUY2wgaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1BQ19BUkdfV0lUSCh0Y2xpbmNsdWRlLCBbICAtLXdpdGgtdGNsaW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgdGNsIGhlYWRlcnMgYXJlXSwgd2l0aF90Y2xpbmNsdWRlPSR7d2l0aHZhbH0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY190Y2xoLFsKLWRubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRjbGluY2x1ZGUgd2FzIHNwZWNpZmllZAotaWYgdGVzdCB4IiR7d2l0aF90Y2xpbmNsdWRlfSIgIT0geCA7IHRoZW4KLSAgaWYgdGVzdCAtZiAke3dpdGhfdGNsaW5jbHVkZX0vdGNsLmggOyB0aGVuCi0gICAgYWNfY3ZfY190Y2xoPWAoY2QgJHt3aXRoX3RjbGluY2x1ZGV9OyBwd2QpYAotICBlbGlmIHRlc3QgLWYgJHt3aXRoX3RjbGluY2x1ZGV9L2dlbmVyaWMvdGNsLmggOyB0aGVuCi0gICAgYWNfY3ZfY190Y2xoPWAoY2QgJHt3aXRoX3RjbGluY2x1ZGV9L2dlbmVyaWM7IHB3ZClgCi0gIGVsc2UKLSAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90Y2xpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGhlYWRlcnNdKQotICBmaQotZmkKLQotZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIFRjbCBjb25maWd1cmF0aW9uIGZpbGUKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgIT0geCA7IHRoZW4KLSAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAkYWNfY3ZfY190Y2xjb25maWcvJGkvZ2VuZXJpYy90Y2wuaCA7IHRoZW4KLSAgICAgIGFjX2N2X2NfdGNsaD1gKGNkICRhY19jdl9jX3RjbGNvbmZpZy8kaS9nZW5lcmljOyBwd2QpYAotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgotICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgVGNsIHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL3RjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgdGNscGF0aD0kc3JjZGlyLyRpCi0JICAgIGJyZWFrCi0JZmkKLSAgICBkb25lCi0KLSAgICBkbmwgZmluZCB0aGUgZXhhY3QgVGNsIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIFRjbCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICR0Y2xwYXRoL3RjbCogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvZ2VuZXJpYy90Y2wuaCA7IHRoZW4KLSAgICAgICAgICBhY19jdl9jX3RjbGg9YChjZCAkaS9nZW5lcmljOyBwd2QpYAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLQotZG5sIGNoZWNrIGlmIGl0cyBpbnN0YWxsZWQgd2l0aCB0aGUgY29tcGlsZXIKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KLSAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlcgotICAgIGNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL2luY2x1ZGUKLSAgICBpZiB0ZXN0IC1mICRjY3BhdGgvdGNsLmg7IHRoZW4KLSAgICAgICAgYWNfY3ZfY190Y2xoPSRjY3BhdGgKLSAgICBmaQotZmkKLQotZG5sIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiA9IHggOyB0aGVuCi0gICBBQ19NU0dfUkVTVUxUKG5vbmUpCi0gICBBQ19DSEVDS19IRUFERVIodGNsLmgsIGFjX2N2X2NfdGNsaD1pbnN0YWxsZWQsIGFjX2N2X2NfdGNsaD0iIikKLWVsc2UKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX3RjbGh9KQotZmkKLV0pCi0gIFRDTEhESVI9IiIKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgYW55IFRjbCBoZWFkZXJzXSkKLWZpCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiAhPSB4IDsgdGhlbgotICAgIG5vX3RjbD0iIgotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iICE9IHgiaW5zdGFsbGVkIiA7IHRoZW4KLQlpZiB0ZXN0IHgiJHtDQ30iID0geGNsIDsgdGhlbgotCSAgICB0bXA9ImBjeWdwYXRoIC0td2luZG93cyAke2FjX2N2X2NfdGNsaH1gIgotCSAgICBhY19jdl9jX3RjbGg9ImBlY2hvICR0bXAgfCBzZWQgLWUgcyNcXFxcXFxcXCMvI2dgIgotCWZpCi0gICAgICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX3RjbGh9KQotICAgICAgICBUQ0xIRElSPSItSSR7YWNfY3ZfY190Y2xofSIKLSAgICBmaQotZmkKLQotQUNfU1VCU1QoVENMSERJUikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIE9rLCBsZXRzIGZpbmQgdGhlIHRjbCBjb25maWd1cmF0aW9uCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9UQ0xDT05GSUcsIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1kbmwgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLXRjbGNvbmZpZwotaWYgdGVzdCB4IiR7bm9fdGNsfSIgPSB4IDsgdGhlbgotICBkbmwgd2UgcmVzZXQgbm9fdGNsIGluIGNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKLSAgICBub190Y2w9dHJ1ZQotICAgIEFDX0FSR19XSVRIKHRjbGNvbmZpZywgWyAgLS13aXRoLXRjbGNvbmZpZyAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGNsIGNvbmZpZ3VyYXRpb24gKHRjbENvbmZpZy5zaCldLAotICAgICAgICAgd2l0aF90Y2xjb25maWc9JHt3aXRodmFsfSkKLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUY2wgY29uZmlndXJhdGlvbiBzY3JpcHRdKQotICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9jX3RjbGNvbmZpZyxbCi0KLSAgICBkbmwgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10Y2xjb25maWcgd2FzIHNwZWNpZmllZC4KLSAgICBpZiB0ZXN0IHgiJHt3aXRoX3RjbGNvbmZpZ30iICE9IHggOyB0aGVuCi0gICAgICAgIGlmIHRlc3QgLWYgIiR7d2l0aF90Y2xjb25maWd9L3RjbENvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgICAgICBhY19jdl9jX3RjbGNvbmZpZz1gKGNkICR7d2l0aF90Y2xjb25maWd9OyBwd2QpYAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90Y2xjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGNsQ29uZmlnLnNoXSkKLSAgICAgICAgZmkKLSAgICBmaQotCi0gICAgZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIFRjbCBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIHNvdXJjZSB0cmVlCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyLyRpL3VuaXgvdGNsQ29uZmlnLnNoIDsgdGhlbgotICAgICAgICAgICAgICAgIGFjX2N2X2NfdGNsY29uZmlnPWAoY2QgJHNyY2Rpci8kaS91bml4OyBwd2QpYAotCSAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBmaQotICAgIGRubCBjaGVjayBpbiBhIGZldyBvdGhlciBsb2NhdGlvbnMKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBUY2wgc291cmNlIGRpcmVjdG9yeQotICAgICAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJGkvdGNsKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICAgICAgdGNsY29uZnBhdGg9JGkKLQkgICAgICAgIGJyZWFrCi0JICAgIGZpCi0gICAgICAgIGRvbmUKLQotICAgICAgICBkbmwgZmluZCB0aGUgZXhhY3QgVGNsIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIFRjbCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICAgICAgZm9yIGkgaW4gYGxzIC1kciAkdGNsY29uZnBhdGgvdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJGkvdW5peC90Y2xDb25maWcuc2ggOyB0aGVuCi0gICAgICAgICAgICAgICAgYWNfY3ZfY190Y2xjb25maWc9YChjZCAkaS91bml4OyBwd2QpYAotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBmaQotICAgICAgICBkb25lCi0gICAgZmkKLQotICAgIGRubCBDaGVjayB0byBzZWUgaWYgaXQncyBpbnN0YWxsZWQuIFdlIGhhdmUgdG8gbG9vayBpbiB0aGUgJENDIHBhdGgKLSAgICBkbmwgdG8gZmluZCBpdCwgY2F1c2Ugb3VyICRwcmVmaXggbWF5IG5vdCBtYXRjaCB0aGUgY29tcGlsZXJzLgotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlcgotCWNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL2xpYgotICAgICAgICBpZiB0ZXN0IC1mICRjY3BhdGgvdGNsQ29uZmlnLnNoOyB0aGVuCi0JICAgIGFjX2N2X2NfdGNsY29uZmlnPSRjY3BhdGgKLSAgICAgICAgZmkKLSAgICBmaQotICAgIF0pCWRubCBlbmQgb2YgY2FjaGVfdmFsCi0KLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgVENMQ09ORklHPSIiCi0gICAgICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgVGNsIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCi0gICAgZWxzZQotICAgICAgICBub190Y2w9IiIKLSAgICAgICAgVENMQ09ORklHPSR7YWNfY3ZfY190Y2xjb25maWd9L3RjbENvbmZpZy5zaAotICAgICAgICBBQ19NU0dfUkVTVUxUKCR7VENMQ09ORklHfSkKLSAgICAgZmkKLWZpCi1BQ19TVUJTVChUQ0xDT05GSUcpCi1dKQotCi1kbmwgRGVmaW5lZCBhcyBhIHNlcGFyYXRlIG1hY3JvIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FjaGUgdGhlIHZhbHVlcwotZG5sIGZyb20gUEFUSF9UQ0xDT05GSUcgKGJlY2F1c2UgdGhpcyBjYW4gYWxzbyBiZSBjYWNoZWQpLgotQUNfREVGVU4oQ1lHX0FDX0xPQURfVENMQ09ORklHLCBbCi0gICAgLiAkVENMQ09ORklHCi0KLWRubCBBQ19TVUJTVChUQ0xfVkVSU0lPTikKLWRubCBBQ19TVUJTVChUQ0xfTUFKT1JfVkVSU0lPTikKLWRubCBBQ19TVUJTVChUQ0xfTUlOT1JfVkVSU0lPTikKLWRubCBBQ19TVUJTVChUQ0xfQ0MpCi0gICAgQUNfU1VCU1QoVENMX0RFRlMpCi0KLWRubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scwotICAgIEFDX1NVQlNUKFRDTF9MSUJfRklMRSkKLSAgICBBQ19TVUJTVChUQ0xfTElCX0ZVTExfUEFUSCkKLSAgICBBQ19TVUJTVChUQ0xfTElCUykKLWRubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scwotZG5sICAgIEFDX1NVQlNUKFRDTF9QUkVGSVgpCi0KLSAgICBBQ19TVUJTVChUQ0xfQ0ZMQUdTKQotCi1kbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCAgICBBQ19TVUJTVChUQ0xfRVhFQ19QUkVGSVgpCi0KLSAgICBBQ19TVUJTVChUQ0xfU0hMSUJfQ0ZMQUdTKQotICAgIEFDX1NVQlNUKFRDTF9TSExJQl9MRCkKLWRubCBkb24ndCBleHBvcnQsIG5vdCB1c2VkIG91dHNpZGUgb2YgY29uZmlndXJlCi1kbmwgQUNfU1VCU1QoVENMX1NITElCX0xEX0xJQlMpCi1kbmwgQUNfU1VCU1QoVENMX1NITElCX1NVRkZJWCkKLWRubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scwotZG5sIEFDX1NVQlNUKFRDTF9ETF9MSUJTKQotICAgIEFDX1NVQlNUKFRDTF9MRF9GTEFHUykKLSAgICBBQ19TVUJTVChUQ0xfTERfU0VBUkNIX0ZMQUdTKQotZG5sIGRvbid0IGV4cG9ydCwgbm90IHVzZWQgb3V0c2lkZSBvZiBjb25maWd1cmUKLWRubCBBQ19TVUJTVChUQ0xfQ09NUEFUX09CSlMpCi0gICAgQUNfU1VCU1QoVENMX1JBTkxJQikKLSAgICBBQ19TVUJTVChUQ0xfQlVJTERfTElCX1NQRUMpCi0gICAgQUNfU1VCU1QoVENMX0xJQl9TUEVDKQotZG5sIEFDX1NVQlNUKFRDTF9MSUJfVkVSU0lPTlNfT0spCi0KLWRubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scwotZG5sICAgIEFDX1NVQlNUKFRDTF9TSEFSRURfTElCX1NVRkZJWCkKLQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgICAgQUNfU1VCU1QoVENMX1VOU0hBUkVEX0xJQl9TVUZGSVgpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUFDX0RFRlVOKENZR19BQ19QQVRIX1RLLCBbCi0gICAgQ1lHX0FDX1BBVEhfVEtICi0gICAgQ1lHX0FDX1BBVEhfVEtDT05GSUcKLSAgICBDWUdfQUNfTE9BRF9US0NPTkZJRwotXSkKLUFDX0RFRlVOKENZR19BQ19QQVRIX1RLSCwgWwotIwotIyBPaywgbGV0cyBmaW5kIHRoZSB0ayBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycwotIyBJZiB0aGUgZGlyZWN0b3J5IChwcmVzdW1hYmx5IHN5bWxpbmspIG5hbWVkICJ0ayIgZXhpc3RzLCB1c2UgdGhhdCBvbmUKLSMgaW4gcHJlZmVyZW5jZSB0byBhbnkgb3RoZXJzLiAgU2FtZSBsb2dpYyBpcyB1c2VkIHdoZW4gY2hvb3NpbmcgbGlicmFyeQotIyBhbmQgYWdhaW4gd2l0aCBUY2wuIFRoZSBzZWFyY2ggb3JkZXIgaXMgdGhlIGJlc3QgcGxhY2UgdG8gbG9vayBmaXJzdCwgdGhlbiBpbgotIyBkZWNyZWFzaW5nIHNpZ25pZmljYW5jZS4gVGhlIGxvb3AgYnJlYWtzIGlmIHRoZSB0cmlnZ2VyIGZpbGUgaXMgZm91bmQuCi0jIE5vdGUgdGhlIGdyb3NzIGxpdHRsZSBjb252ZXJzaW9uIGhlcmUgb2Ygc3JjZGlyIGJ5IGNkJ2luZyB0byB0aGUgZm91bmQKLSMgZGlyZWN0b3J5LiBUaGlzIGNvbnZlcnRzIHRoZSBwYXRoIGZyb20gYSByZWxhdGl2ZSB0byBhbiBhYnNvbHV0ZSwgc28KLSMgcmVjdXJzaXZlIGNhY2hlIHZhcmlhYmxlcyBmb3IgdGhlIHBhdGggd2lsbCB3b3JrIHJpZ2h0LiBXZSBjaGVjayBhbGwKLSMgdGhlIHBvc3NpYmxlIHBhdGhzIGluIG9uZSBsb29wIHJhdGhlciB0aGFuIG1hbnkgc2VwZXJhdGUgbG9vcHMgdG8gc3BlZWQKLSMgdGhpbmdzIHVwLgotIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtdGtpbmNsdWRlCi0jCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9fdGs9dHJ1ZQotQUNfTVNHX0NIRUNLSU5HKGZvciBUayBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLUFDX0FSR19XSVRIKHRraW5jbHVkZSwgWyAgLS13aXRoLXRraW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgdGsgaGVhZGVycyBhcmVdLCB3aXRoX3RraW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGtoLFsKLWRubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRraW5jbHVkZSB3YXMgc3BlY2lmaWVkCi1pZiB0ZXN0IHgiJHt3aXRoX3RraW5jbHVkZX0iICE9IHggOyB0aGVuCi0gIGlmIHRlc3QgLWYgJHt3aXRoX3RraW5jbHVkZX0vdGsuaCA7IHRoZW4KLSAgICBhY19jdl9jX3RraD1gKGNkICR7d2l0aF90a2luY2x1ZGV9OyBwd2QpYAotICBlbGlmIHRlc3QgLWYgJHt3aXRoX3RraW5jbHVkZX0vZ2VuZXJpYy90ay5oIDsgdGhlbgotICAgIGFjX2N2X2NfdGtoPWAoY2QgJHt3aXRoX3RraW5jbHVkZX0vZ2VuZXJpYzsgcHdkKWAKLSAgZWxzZQotICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RraW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBoZWFkZXJzXSkKLSAgZmkKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGlmIGl0IGNhbWUgd2l0aCBUayBjb25maWd1cmF0aW9uIGZpbGUKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGtjb25maWd9IiAhPSB4IDsgdGhlbgotICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19jdl9jX3RrY29uZmlnLyRpL2dlbmVyaWMvdGsuaCA7IHRoZW4KLSAgICAgIGFjX2N2X2NfdGtoPWAoY2QgJGFjX2N2X2NfdGtjb25maWcvJGkvZ2VuZXJpYzsgcHdkKWAKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotZmkKLQotZG5sIG5leHQgY2hlY2sgaW4gcHJpdmF0ZSBzb3VyY2UgZGlyZWN0b3J5Ci1kbmwgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgPSB4IDsgdGhlbgotICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgVGsgc291cmNlIGRpcmVjdG9yeQotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvdGsqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgIHRrcGF0aD0kc3JjZGlyLyRpCi0JICAgIGJyZWFrCi0JZmkKLSAgICBkb25lCi0KLSAgICBkbmwgZmluZCB0aGUgZXhhY3QgVGsgc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgVGssIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCi0gICAgZm9yIGkgaW4gYGxzIC1kciAkdGtwYXRoL3RrKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL3RrLmggOyB0aGVuCi0gICAgICAgICAgYWNfY3ZfY190a2g9YChjZCAkaS9nZW5lcmljOyBwd2QpYAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLQotZG5sIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi0gICAgZG5sIEdldCB0aGUgcGF0aCB0byB0aGUgY29tcGlsZXIuIFdlIGRvIGl0IHRoaXMgd2F5IGluc3RlYWQgb2YgdXNpbmcKLSAgICBkbmwgQUNfQ0hFQ0tfSEVBREVSLCBjYXVzZSB0aGlzIGRvZXNuJ3QgZGVwZW5kIGluIGhhdmluZyBYIGNvbmZpZ3VyZWQuCi0gICAgY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2AvaW5jbHVkZQotICAgIGlmIHRlc3QgLWYgJGNjcGF0aC90ay5oOyB0aGVuCi0JYWNfY3ZfY190a2g9JGNjcGF0aAotICAgIGZpCi1lbHNlCi0gICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY190a2h9KQotZmkKLV0pCi0gIFRLSERJUj0iIgotaWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIGFueSBUayBoZWFkZXJzXSkKLWZpCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iICE9IHggOyB0aGVuCi0gICAgbm9fdGs9IiIKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iICE9IHgiaW5zdGFsbGVkIiA7IHRoZW4KLQlpZiB0ZXN0IHgiJHtDQ30iID0geGNsIDsgdGhlbgotCSAgICB0bXA9ImBjeWdwYXRoIC0td2luZG93cyAke2FjX2N2X2NfdGtofWAiCi0JICAgIGFjX2N2X2NfdGtoPSJgZWNobyAkdG1wIHwgc2VkIC1lIHMjXFxcXFxcXFwjLyNnYCIKLQlmaQotICAgICAgICBBQ19NU0dfUkVTVUxUKFtmb3VuZCBpbiAke2FjX2N2X2NfdGtofV0pCi0gICAgICAgIFRLSERJUj0iLUkke2FjX2N2X2NfdGtofSIKLSAgICBmaQotZmkKLQotQUNfU1VCU1QoVEtIRElSKQotXSkKLQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVEtDT05GSUcsIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1kbmwgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLXRrY29uZmlnCi1pZiB0ZXN0IHgiJHtub190a30iID0geCA7IHRoZW4KLSAgZG5sIHdlIHJlc2V0IG5vX3RrIGluIGNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKLSAgICBub190az10cnVlCi0gICAgQUNfQVJHX1dJVEgodGtjb25maWcsIFsgIC0td2l0aC10a2NvbmZpZyAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGsgY29uZmlndXJhdGlvbiAodGtDb25maWcuc2gpXSwKLSAgICAgICAgIHdpdGhfdGtjb25maWc9JHt3aXRodmFsfSkKLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUayBjb25maWd1cmF0aW9uIHNjcmlwdF0pCi0gICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGtjb25maWcsWwotCi0gICAgZG5sIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGtjb25maWcgd2FzIHNwZWNpZmllZC4KLSAgICBpZiB0ZXN0IHgiJHt3aXRoX3RrY29uZmlnfSIgIT0geCA7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt3aXRoX3RrY29uZmlnfS90a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgICAgICBhY19jdl9jX3RrY29uZmlnPWAoY2QgJHt3aXRoX3RrY29uZmlnfTsgcHdkKWAKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGtjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGtDb25maWcuc2hdKQotICAgICAgICBmaQotICAgIGZpCi0KLSAgICBkbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggVGsgY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZSBzb3VyY2UgdHJlZQotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtjb25maWd9IiA9IHggOyB0aGVuCi0gICAgICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyLyRpL3VuaXgvdGtDb25maWcuc2ggOyB0aGVuCi0gICAgICAgICAgICAgICAgYWNfY3ZfY190a2NvbmZpZz1gKGNkICRzcmNkaXIvJGkvdW5peDsgcHdkKWAKLQkgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBmaQotICAgICAgICBkb25lCi0gICAgZmkKLSAgICBkbmwgY2hlY2sgaW4gYSBmZXcgb3RoZXIgbG9jYXRpb25zCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBUayBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkaS90ayogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgICAgIHRrY29uZnBhdGg9JGkKLQkgICAgICAgIGJyZWFrCi0JICAgIGZpCi0gICAgICAgIGRvbmUKLQotICAgICAgICBkbmwgZmluZCB0aGUgZXhhY3QgVGsgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKLSAgICAgICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgVGssIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCi0gICAgICAgIGZvciBpIGluIGBscyAtZHIgJHRrY29uZnBhdGgvdGsqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICAgICAgaWYgdGVzdCAtZiAkaS91bml4L3RrQ29uZmlnLnNoIDsgdGhlbgotICAgICAgICAgICAgICAgIGFjX2N2X2NfdGtjb25maWc9YChjZCAkaS91bml4OyBwd2QpYAotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBmaQotICAgICAgICBkb25lCi0gICAgZmkKLQotICAgIGRubCBDaGVjayB0byBzZWUgaWYgaXQncyBpbnN0YWxsZWQuIFdlIGhhdmUgdG8gbG9vayBpbiB0aGUgJENDIHBhdGgKLSAgICBkbmwgdG8gZmluZCBpdCwgY2F1c2Ugb3VyICRwcmVmaXggbWF5IG5vdCBtYXRjaCB0aGUgY29tcGlsZXJzLgotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtjb25maWd9IiA9IHggOyB0aGVuCi0gICAgICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0JY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2AvbGliCi0gICAgICAgIGlmIHRlc3QgLWYgJGNjcGF0aC90a0NvbmZpZy5zaDsgdGhlbgotCSAgICBhY19jdl9jX3RrY29uZmlnPSRjY3BhdGgKLSAgICAgICAgZmkKLSAgICBmaQotICAgIF0pCWRubCBlbmQgb2YgY2FjaGVfdmFsCi0KLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBUS0NPTkZJRz0iIgotICAgICAgICBBQ19NU0dfV0FSTihDYW4ndCBmaW5kIFRrIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCi0gICAgZWxzZQotICAgICAgICBub190az0iIgotICAgICAgICBUS0NPTkZJRz0ke2FjX2N2X2NfdGtjb25maWd9L3RrQ29uZmlnLnNoCi0gICAgICAgIEFDX01TR19SRVNVTFQoJHtUS0NPTkZJR30pCi0gICAgIGZpCi1maQotQUNfU1VCU1QoVEtDT05GSUcpCi1dKQotCi1kbmwgRGVmaW5lZCBhcyBhIHNlcGFyYXRlIG1hY3JvIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FjaGUgdGhlIHZhbHVlcwotZG5sIGZyb20gUEFUSF9US0NPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCi1BQ19ERUZVTihDWUdfQUNfTE9BRF9US0NPTkZJRywgWwotICAgIGlmIHRlc3QgLWYgIiRUS0NPTkZJRyIgOyB0aGVuCi0gICAgICAuICRUS0NPTkZJRwotICAgIGZpCi0KLSAgICBBQ19TVUJTVChUS19WRVJTSU9OKQotZG5sIG5vdCBhY3R1YWxseSB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgICAgQUNfU1VCU1QoVEtfTUFKT1JfVkVSU0lPTikKLWRubCAgICBBQ19TVUJTVChUS19NSU5PUl9WRVJTSU9OKQotICAgIEFDX1NVQlNUKFRLX0RFRlMpCi0KLWRubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scwotICAgIEFDX1NVQlNUKFRLX0xJQl9GSUxFKQotICAgIEFDX1NVQlNUKFRLX0xJQl9GVUxMX1BBVEgpCi0gICAgQUNfU1VCU1QoVEtfTElCUykKLWRubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scwotZG5sICAgIEFDX1NVQlNUKFRLX1BSRUZJWCkKLQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgICAgQUNfU1VCU1QoVEtfRVhFQ19QUkVGSVgpCi0gICAgQUNfU1VCU1QoVEtfQlVJTERfSU5DTFVERVMpCi0gICAgQUNfU1VCU1QoVEtfWElOQ0xVREVTKQotICAgIEFDX1NVQlNUKFRLX1hMSUJTVykKLSAgICBBQ19TVUJTVChUS19CVUlMRF9MSUJfU1BFQykKLSAgICBBQ19TVUJTVChUS19MSUJfU1BFQykKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIE9rLCBsZXRzIGZpbmQgdGhlIGl0Y2wgc291cmNlIHRyZWVzIHNvIHdlIGNhbiB1c2UgdGhlIGhlYWRlcnMKLWRubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtaXRjbGluY2x1ZGUKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0wsIFsKLSAgICBDWUdfQUNfUEFUSF9JVENMSAotICAgIENZR19BQ19QQVRIX0lUQ0xMSUIKLSAgICBDWUdfQUNfUEFUSF9JVENMU0gKLSAgICBDWUdfQUNfUEFUSF9JVENMTUtJRFgKLV0pCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JVENMSCwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLW5vX2l0Y2w9dHJ1ZQotQUNfTVNHX0NIRUNLSU5HKGZvciBJdGNsIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQVJHX1dJVEgoaXRjbGluY2x1ZGUsIFsgIC0td2l0aC1pdGNsaW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgaXRjbCBoZWFkZXJzIGFyZV0sIHdpdGhfaXRjbGluY2x1ZGU9JHt3aXRodmFsfSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2l0Y2xoLFsKLWRubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLWl0Y2xpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfaXRjbGluY2x1ZGV9IiAhPSB4IDsgdGhlbgotICBpZiB0ZXN0IC1mICR7d2l0aF9pdGNsaW5jbHVkZX0vaXRjbC5oIDsgdGhlbgotICAgIGFjX2N2X2NfaXRjbGg9YChjZCAke3dpdGhfaXRjbGluY2x1ZGV9OyBwd2QpYAotICBlbGlmIHRlc3QgLWYgJHt3aXRoX2l0Y2xpbmNsdWRlfS9zcmMvaXRjbC5oIDsgdGhlbgotICAgIGFjX2N2X2NfaXRjbGg9YChjZCAke3dpdGhfaXRjbGluY2x1ZGV9L3NyYzsgcHdkKWAKLSAgZWxzZQotICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2l0Y2xpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGhlYWRlcnNdKQotICBmaQotZmkKLQotZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIEl0Y2wgY29uZmlndXJhdGlvbiBmaWxlCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xjb25maWd9IiAhPSB4IDsgdGhlbgotICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19jdl9jX2l0Y2xjb25maWcvJGkvc3JjL2l0Y2wuaCA7IHRoZW4KLSAgICAgIGFjX2N2X2NfaXRjbGg9YChjZCAkYWNfY3ZfY19pdGNsY29uZmlnLyRpL3NyYzsgcHdkKWAKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotZmkKLQotZG5sIG5leHQgY2hlY2sgaW4gcHJpdmF0ZSBzb3VyY2UgZGlyZWN0b3J5Ci1kbmwgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiA9IHggOyB0aGVuCi0gICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBJdGNsIHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL2l0Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgIGl0Y2xwYXRoPSRzcmNkaXIvJGkKLQkgICAgYnJlYWsKLQlmaQotICAgIGRvbmUKLQotICAgIGRubCBmaW5kIHRoZSBleGFjdCBJdGNsIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIEl0Y2wsIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCi0gICAgZm9yIGkgaW4gYGxzIC1kciAkaXRjbHBhdGgvaXRjbCogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvc3JjL2l0Y2wuaCA7IHRoZW4KLSAgICAgICAgICBhY19jdl9jX2l0Y2xoPWAoY2QgJGkvc3JjOyBwd2QpYAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLQotZG5sIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xofSIgPSB4IDsgdGhlbgotICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgQUNfQ0hFQ0tfSEVBREVSKGl0Y2wuaCwgYWNfY3ZfY19pdGNsaD1pbnN0YWxsZWQsIGFjX2N2X2NfaXRjbGg9IiIpCi1lbHNlCi0gICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pdGNsaH0pCi1maQotXSkKLSAgSVRDTEhESVI9IiIKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIGFueSBJdGNsIGhlYWRlcnNdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiAhPSB4IDsgdGhlbgotICAgIG5vX2l0Y2w9IiIKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgotICAgICAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pdGNsaH0pCi0gICAgICAgIElUQ0xIRElSPSItSSR7YWNfY3ZfY19pdGNsaH0iCi0gICAgZmkKLWZpCi0KLUFDX1NVQlNUKElUQ0xIRElSKQotXSkKLQotZG5sIE9rLCBsZXRzIGZpbmQgdGhlIGl0Y2wgbGlicmFyeQotZG5sIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKLWRubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC1pdGNsbGliCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JVENMTElCLCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotaWYgdGVzdCB4IiR7bm9faXRjbH0iID0geCA7IHRoZW4KLSAgICBkbmwgd2UgcmVzZXQgbm9faXRjbCBpbmNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKLSAgICBub19pdGNsPXRydWUKLSAgICBBQ19BUkdfV0lUSChpdGNsbGliLAotCVsgIC0td2l0aC1pdGNsbGliICAgICAgICAgICBkaXJlY3Rvcnkgd2hlcmUgdGhlIGl0Y2wgbGlicmFyeSBpc10sCi0gICAgICAgIHdpdGhfaXRjbGxpYj0ke3dpdGh2YWx9KQotICAgIEFDX01TR19DSEVDS0lORyhbZm9yIEl0Y2wgbGlicmFyeV0pCi0gICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRjbGxpYixbCi0gICAgZG5sIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRjbGxpYiB3YXMgc3BlY2lmaWVkLgotICAgIGlmIHRlc3QgeCIke3dpdGhfaXRjbGxpYn0iICE9IHggOyB0aGVuCi0gICAgICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGNsbGlifS9saWJpdGNsJFRDTF9TSEFSRURfTElCX1NVRkZJWCIgOyB0aGVuCi0gICAgICAgICAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAke3dpdGhfaXRjbGxpYn07IHB3ZClgL2xpYml0Y2wkVENMX1NIQVJFRF9MSUJfU1VGRklYCi0JZWxzZQotCSAgICBpZiB0ZXN0IC1mICIke3dpdGhfaXRjbGxpYn0vbGliaXRjbCRUQ0xfVU5TSEFSRURfTElCX1NVRkZJWCI7IHRoZW4KLQkgCWFjX2N2X2NfaXRjbGxpYj1gKGNkICR7d2l0aF9pdGNsbGlifTsgcHdkKWAvbGliaXRjbCRUQ0xfVU5TSEFSRURfTElCX1NVRkZJWAotCSAgICBmaQotCWZpCi0gICAgZmkKLSAgICBkbmwgdGhlbiBjaGVjayBmb3IgYSAgSXRjbCBsaWJyYXJ5LiBTaW5jZSB0aGVzZSBhcmUgdW5pbnN0YWxsZWQsCi0gICAgZG5sIHVzZSB0aGUgc2ltcGxlIGxpYiBuYW1lIHJvb3QuIAotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGxpYn0iID0geCA7IHRoZW4KLSAgICAgICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBJdGNsIGJ1aWxkIGRpcmVjdG9yeQotICAgICAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJGkvaXRjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgICAgIGl0Y2xwYXRoPSRpL2l0Y2wKLQkgICAgICAgIGJyZWFrCi0JICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICAgICAgZG5sIEl0Y2wgNy41IGFuZCBncmVhdGVyIHB1dHMgbGlicmFyeSBpbiBzdWJkaXIuICBMb29rIHRoZXJlIGZpcnN0LgotICAgICAgICBpZiB0ZXN0IC1mICIkaXRjbHBhdGgvc3JjL2xpYml0Y2wuJFRDTF9TSExJQl9TVUZGSVgiIDsgdGhlbgotCSAgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJGl0Y2xwYXRoL3NyYzsgcHdkKWAKLSAgICAgICAgZWxpZiB0ZXN0IC1mICIkaXRjbHBhdGgvc3JjL2xpYml0Y2wuYSI7IHRoZW4KLQkgICAgIGFjX2N2X2NfaXRjbGxpYj1gKGNkICRpdGNscGF0aC9zcmM7IHB3ZClgCi0JZmkKLSAgICBmaQotICAgIGRubCBjaGVjayBpbiBhIGZldyBvdGhlciBwcml2YXRlIGxvY2F0aW9ucwotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGxpYn0iID0geCA7IHRoZW4KLSAgICAgICAgZm9yIGkgaW4gJHtkaXJsaXN0fTsgZG8KLSAgICAgICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHtzcmNkaXJ9LyRpL2l0Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgICAgICBpdGNscGF0aD0ke3NyY2Rpcn0vJGkKLQkgICAgICAgIGJyZWFrCi0JICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICAgICAgZm9yIGkgaW4gYGxzIC1kciAke2l0Y2xwYXRofS9pdGNsKiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgICAgICAgZG5sIEl0Y2wgNy41IGFuZCBncmVhdGVyIHB1dHMgbGlicmFyeSBpbiBzdWJkaXIuICBMb29rIHRoZXJlIGZpcnN0LgotICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGkvc3JjL2xpYml0Y2wkVENMX1NITElCX1NVRkZJWCIgOyB0aGVuCi0JICAgICAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAkaS9zcmM7IHB3ZClgCi0JICAgICAgICBicmVhawotICAgICAgICAgICAgZWxpZiB0ZXN0IC1mICIkaS9zcmMvbGliaXRjbC5hIjsgdGhlbgotCSAgICAgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJGkvc3JjOyBwd2QpYAotCSAgICAgICAgYnJlYWsKLQkgICAgZmkJCi0gICAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgZG5sIHNlZSBpZiBvbmUgaXMgY29udmVuaWVudGx5IGluc3RhbGxlZCB3aXRoIHRoZSBjb21waWxlcgotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGxpYn0iID0geCA7IHRoZW4KLSAgICAgICAgZG5sIEdldCB0aGUgcGF0aCB0byB0aGUgY29tcGlsZXIKLQljY3BhdGg9YHdoaWNoICR7Q0N9ICB8IHNlZCAtZSAnczovYmluLy4qOjonYC9saWIKLSAgICAgICAgZG5sIEl0Y2wgNy41IGFuZCBncmVhdGVyIHB1dHMgbGlicmFyeSBpbiBzdWJkaXIuICBMb29rIHRoZXJlIGZpcnN0LgotICAgICAgICBpZiB0ZXN0IC1mICIke2NjcGF0aH0vbGliaXRjbCRUQ0xfU0hMSUJfU1VGRklYIiA7IHRoZW4KLQkgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJHtjY3BhdGh9OyBwd2QpYAotICAgICAgICBlbGlmIHRlc3QgLWYgIiR7Y2NwYXRofS9saWJpdGNsLmEiOyB0aGVuCi0JICAgIGFjX2N2X2NfaXRjbGxpYj1gKGNkICR7Y2NwYXRofTsgcHdkKWAKLSAgICAgICAgZmkKLSAgICBmaQotICAgIF0pCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbGlifSIgPSB4IDsgdGhlbgotICAgICAgICBJVENMTElCPSIiCi0gICAgICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgSXRjbCBsaWJyYXJ5KQotICAgIGVsc2UKLSAgICAgICAgSVRDTExJQj0iLUwke2FjX2N2X2NfaXRjbGxpYn0iCi0gICAgICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xsaWJ9KQotICAgICAgICBub19pdGNsPSIiCi0gICAgZmkKLWZpCi0KLUFDX1BST1ZJREUoWyQwXSkKLUFDX1NVQlNUKElUQ0xMSUIpCi1dKQotCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIE9rLCBsZXRzIGZpbmQgdGhlIGl0Y2wgc291cmNlIHRyZWVzIHNvIHdlIGNhbiB1c2UgdGhlIGl0Y2xfc2ggc2NyaXB0Ci1kbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2xrZWQgYnkgLS13aXRoLWl0Y2xpbmNsdWRlCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JVENMU0gsIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1ub19pdGNsPXRydWUKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGl0Y2xfc2ggc2NyaXB0KQotQUNfQVJHX1dJVEgoaXRjbGluY2x1ZGUsIFsgIC0td2l0aC1pdGNsaW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgaXRjbCBoZWFkZXJzIGFyZV0sIHdpdGhfaXRjbGluY2x1ZGU9JHt3aXRodmFsfSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2l0Y2xzaCxbCi1kbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGNsaW5jbHVkZSB3YXMgc3BlY2lmaWVkCi1pZiB0ZXN0IHgiJHt3aXRoX2l0Y2xpbmNsdWRlfSIgIT0geCA7IHRoZW4KLSAgaWYgdGVzdCAtZiAke3dpdGhfaXRjbGluY2x1ZGV9L2l0Y2xfc2ggOyB0aGVuCi0gICAgYWNfY3ZfY19pdGNsc2g9YChjZCAke3dpdGhfaXRjbGluY2x1ZGV9OyBwd2QpYAotICBlbGlmIHRlc3QgLWYgJHt3aXRoX2l0Y2xpbmNsdWRlfS9zcmMvaXRjbF9zaCA7IHRoZW4KLSAgICBhY19jdl9jX2l0Y2xzaD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX0vc3JjOyBwd2QpYAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFske3dpdGhfaXRjbGluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRjbF9zaF0pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKLWRubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsc2h9IiA9IHggOyB0aGVuCi0gICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBJdGNsIHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL2l0Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgIGl0Y2xwYXRoPSRzcmNkaXIvJGkKLQkgICAgYnJlYWsKLQlmaQotICAgIGRvbmUKLQotICAgIGRubCBmaW5kIHRoZSBleGFjdCBJdGNsIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIEl0Y2wsIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCi0gICAgZm9yIGkgaW4gYGxzIC1kciAkaXRjbHBhdGgvaXRjbCogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvc3JjL2l0Y2xfc2ggOyB0aGVuCi0gICAgICAgICAgYWNfY3ZfY19pdGNsc2g9YChjZCAkaS9zcmM7IHB3ZClgL2l0Y2xfc2gKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi0KLWRubCBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsc2h9IiA9IHggOyB0aGVuCi0gICBBQ19NU0dfUkVTVUxUKG5vbmUpCi0gICBBQ19QQVRIX1BST0coYWNfY3ZfY19pdGNsc2gsIGl0Y2xfc2gpCi1lbHNlCi0gICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pdGNsc2h9KQotZmkKLV0pCi0KLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbHNofSIgPSB4IDsgdGhlbgotICAgIEFDX01TR19FUlJPUihbQ2FuJ3QgZmluZCB0aGUgaXRjbF9zaCBzY3JpcHRdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbHNofSIgIT0geCA7IHRoZW4KLSAgICBub19pdGNsPSIiCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaXRjbHNofSkKLSAgICBJVENMU0g9IiR7YWNfY3ZfY19pdGNsc2h9IgotZmkKLUFDX1NVQlNUKElUQ0xTSCkKLV0pCi0KLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgaXRjbCBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaXRjbF9zaCBzY3JpcHQKLWRubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtaXRjbGluY2x1ZGUKLUFDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0xNS0lEWCwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLW5vX2l0Y2w9dHJ1ZQotQUNfTVNHX0NIRUNLSU5HKGZvciBpdGNsX21raW5kZXgudGNsIHNjcmlwdCkKLUFDX0FSR19XSVRIKGl0Y2xpbmNsdWRlLCBbICAtLXdpdGgtaXRjbGluY2x1ZGUgICAgICAgZGlyZWN0b3J5IHdoZXJlIGl0Y2wgaGVhZGVycyBhcmVdLCB3aXRoX2l0Y2xpbmNsdWRlPSR7d2l0aHZhbH0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGNsbWtpZHgsWwotZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRjbGluY2x1ZGUgd2FzIHNwZWNpZmllZAotaWYgdGVzdCB4IiR7d2l0aF9pdGNsaW5jbHVkZX0iICE9IHggOyB0aGVuCi0gIGlmIHRlc3QgLWYgJHt3aXRoX2l0Y2xpbmNsdWRlfS9pdGNsX3NoIDsgdGhlbgotICAgIGFjX2N2X2NfaXRjbG1raWR4PWAoY2QgJHt3aXRoX2l0Y2xpbmNsdWRlfTsgcHdkKWAKLSAgZWxpZiB0ZXN0IC1mICR7d2l0aF9pdGNsaW5jbHVkZX0vc3JjL2l0Y2xfc2ggOyB0aGVuCi0gICAgYWNfY3ZfY19pdGNsbWtpZHg9YChjZCAke3dpdGhfaXRjbGluY2x1ZGV9L3NyYzsgcHdkKWAKLSAgZWxzZQotICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2l0Y2xpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGl0Y2xfc2hdKQotICBmaQotZmkKLQotZG5sIG5leHQgY2hlY2sgaW4gcHJpdmF0ZSBzb3VyY2UgZGlyZWN0b3J5Ci1kbmwgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbG1raWR4fSIgPSB4IDsgdGhlbgotICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgSXRjbCBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHNyY2Rpci8kaS9pdGNsKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICBpdGNscGF0aD0kc3JjZGlyLyRpCi0JICAgIGJyZWFrCi0JZmkKLSAgICBkb25lCi0KLSAgICBkbmwgZmluZCB0aGUgZXhhY3QgSXRjbCBzb3VyY2UgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKLSAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBJdGNsLCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgotICAgIGZvciBpIGluIGBscyAtZHIgJGl0Y2xwYXRoL2l0Y2wqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRpL2xpYnJhcnkvaXRjbF9ta2luZGV4LnRjbCA7IHRoZW4KLSAgICAgICAgICBhY19jdl9jX2l0Y2xta2lkeD1gKGNkICRpL2xpYnJhcnk7IHB3ZClgL2l0Y2xfbWtpbmRleC50Y2wKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xta2lkeH0iID0geCA7IHRoZW4KLSAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlcgotICAgIGNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL3NoYXJlCi0gICAgZG5sIEl0Y2wgNy41IGFuZCBncmVhdGVyIHB1dHMgbGlicmFyeSBpbiBzdWJkaXIuICBMb29rIHRoZXJlIGZpcnN0LgotICAgIGZvciBpIGluIGBscyAtZHIgJGNjcGF0aC9pdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9pdGNsX21raW5kZXgudGNsIDsgdGhlbgotICAgICAgICAgICAgYWNfY3ZfY19pdGNsbWtpZHg9YChjZCAkaTsgcHdkKWAvaXRjbF9ta2luZGV4LnRjbAotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotXSkKLQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbWtpZHh9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIHRoZSBpdGNsX21raW5kZXgudGNsIHNjcmlwdF0pCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbWtpZHh9IiAhPSB4IDsgdGhlbgotICAgIG5vX2l0Y2w9IiIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pdGNsbWtpZHh9KQotICAgIElUQ0xNS0lEWD0iJHthY19jdl9jX2l0Y2xta2lkeH0iCi1lbHNlCi0gICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoSVRDTE1LSURYKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgdGl4IHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCi1kbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2xrZWQgYnkgLS13aXRoLXRpeGluY2x1ZGUKLUFDX0RFRlVOKENZR19BQ19QQVRIX1RJWCwgWwotICAgIENZR19BQ19QQVRIX1RJWEgKLSAgICBDWUdfQUNfUEFUSF9USVhMSUIKLV0pCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9USVhILCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9fdGl4PXRydWUKLUFDX01TR19DSEVDS0lORyhmb3IgVGl4IGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQVJHX1dJVEgodGl4aW5jbHVkZSwgWyAgLS13aXRoLXRpeGluY2x1ZGUgICAgICAgZGlyZWN0b3J5IHdoZXJlIHRpeCBoZWFkZXJzIGFyZV0sIHdpdGhfdGl4aW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGl4aCxbCi1kbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10aXhpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfdGl4aW5jbHVkZX0iICE9IHggOyB0aGVuCi0gIGlmIHRlc3QgLWYgJHt3aXRoX3RpeGluY2x1ZGV9L3RpeC5oIDsgdGhlbgotICAgIGFjX2N2X2NfdGl4aD1gKGNkICR7d2l0aF90aXhpbmNsdWRlfTsgcHdkKWAKLSAgZWxpZiB0ZXN0IC1mICR7d2l0aF90aXhpbmNsdWRlfS9nZW5lcmljL3RpeC5oIDsgdGhlbgotICAgIGFjX2N2X2NfdGl4aD1gKGNkICR7d2l0aF90aXhpbmNsdWRlfS9nZW5lcmljOyBwd2QpYAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGl4aW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBoZWFkZXJzXSkKLSAgZmkKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGlmIGl0IGNhbWUgd2l0aCBUaXggY29uZmlndXJhdGlvbiBmaWxlCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iICE9IHggOyB0aGVuCi0gIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgJGFjX2N2X2NfdGl4Y29uZmlnLyRpL2dlbmVyaWMvdGl4LmggOyB0aGVuCi0gICAgICBhY19jdl9jX3RpeGg9YChjZCAkYWNfY3ZfY190aXhjb25maWcvJGkvZ2VuZXJpYzsgcHdkKWAKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotZmkKLQotZG5sIG5leHQgY2hlY2sgaW4gcHJpdmF0ZSBzb3VyY2UgZGlyZWN0b3J5Ci1kbmwgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGl4aH0iID0geCA7IHRoZW4KLSAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIFRpeCBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHNyY2Rpci8kaS90aXgqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgIHRpeHBhdGg9JHNyY2Rpci8kaQotCSAgICBicmVhawotCWZpCi0gICAgZG9uZQotCi0gICAgZG5sIGZpbmQgdGhlIGV4YWN0IFRpeCBzb3VyY2UgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKLSAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBUaXgsIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCi0gICAgZm9yIGkgaW4gYGxzIC1kciAkdGl4cGF0aC90aXgqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvdGl4LmggOyB0aGVuCi0gICAgICAgICAgYWNfY3ZfY190aXhoPWAoY2QgJGkvZ2VuZXJpYzsgcHdkKWAKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi0KLWRubCBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAotaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgPSB4IDsgdGhlbgotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlcgotCi0gICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlci4gV2UgZG8gaXQgdGhpcyB3YXkgaW5zdGVhZCBvZiB1c2luZwotICAgIGRubCBBQ19DSEVDS19IRUFERVIsIGNhdXNlIHRoaXMgZG9lc24ndCBkZXBlbmQgaW4gaGF2aW5nIFggY29uZmlndXJlZC4KLSAgICBjY3BhdGg9YHdoaWNoICR7Q0N9ICB8IHNlZCAtZSAnczovYmluLy4qOjonYC9pbmNsdWRlCi0gICAgaWYgdGVzdCAtZiAkY2NwYXRoL3RpeC5oOyB0aGVuCi0JYWNfY3ZfY190aXhoPWluc3RhbGxlZAotICAgIGZpCi1lbHNlCi0gICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY190aXhofSkKLWZpCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgPSB4IDsgdGhlbgotICAgIEFDX01TR19FUlJPUihbQ2FuJ3QgZmluZCBhbnkgVGl4IGhlYWRlcnNdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGl4aH0iICE9IHggOyB0aGVuCi0gICAgbm9fdGl4PSIiCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfdGl4aH0pCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgotICAgICAgICBUSVhIRElSPSItSSR7YWNfY3ZfY190aXhofSIKLSAgICBmaQotZmkKLQotQUNfU1VCU1QoVElYSERJUikKLV0pCi0KLUFDX0RFRlVOKENZR19BQ19QQVRIX1RJWENPTkZJRywgWwotIwotIyBPaywgbGV0cyBmaW5kIHRoZSB0aXggY29uZmlndXJhdGlvbgotIyBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCi0jIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLXRpeGNvbmZpZwotIwotCi1pZiB0ZXN0IHgiJHtub190aXh9IiA9IHggOyB0aGVuCi0gICMgd2UgcmVzZXQgbm9fdGl4IGluIGNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKLSAgbm9fdGl4PXRydWUKLSAgQUNfQVJHX1dJVEgodGl4Y29uZmlnLCBbICAtLXdpdGgtdGl4Y29uZmlnICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyB0aXggY29uZmlndXJhdGlvbiAodGl4Q29uZmlnLnNoKV0sCi0gICAgICAgICB3aXRoX3RpeGNvbmZpZz0ke3dpdGh2YWx9KQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUaXggY29uZmlndXJhdGlvbl0pCi0gIEFDX0NBQ0hFX1ZBTChhY19jdl9jX3RpeGNvbmZpZyxbCi0KLSAgIyBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRpeGNvbmZpZyB3YXMgc3BlY2lmaWVkLgotICBpZiB0ZXN0IHgiJHt3aXRoX3RpeGNvbmZpZ30iICE9IHggOyB0aGVuCi0gICAgaWYgdGVzdCAtZiAiJHt3aXRoX3RpeGNvbmZpZ30vdGl4Q29uZmlnLnNoIiA7IHRoZW4KLSAgICAgIGFjX2N2X2NfdGl4Y29uZmlnPWAoY2QgJHt3aXRoX3RpeGNvbmZpZ307IHB3ZClgCi0gICAgZWxzZQotICAgICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGl4Y29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHRpeENvbmZpZy5zaF0pCi0gICAgZmkKLSAgZmkKLQotICAjIHRoZW4gY2hlY2sgZm9yIGEgcHJpdmF0ZSBUaXggbGlicmFyeQotICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBcCi0JCS4uL3RpeCBcCi0JCWBscyAtZHIgLi4vdGl4W1s0XV0qIDI+L2Rldi9udWxsYCBcCi0JCS4uLy4uL3RpeCBcCi0JCWBscyAtZHIgLi4vLi4vdGl4W1s0XV0qIDI+L2Rldi9udWxsYCBcCi0JCS4uLy4uLy4uL3RpeCBcCi0JCWBscyAtZHIgLi4vLi4vLi4vdGl4W1s0XV0qIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS90aXhDb25maWcuc2giIDsgdGhlbgotICAgICAgICBhY19jdl9jX3RpeGNvbmZpZz1gKGNkICRpOyBwd2QpYAotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmkKLSAgIyBjaGVjayBpbiBhIGZldyBjb21tb24gaW5zdGFsbCBsb2NhdGlvbnMKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhjb25maWd9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gYGxzIC1kICR7cHJlZml4fS9saWIgL3Vzci9sb2NhbC9saWIgMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL3RpeENvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfdGtjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gICMgY2hlY2sgaW4gYSBmZXcgb3RoZXIgcHJpdmF0ZSBsb2NhdGlvbnMKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhjb25maWd9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gXAotCQkke3NyY2Rpcn0vLi4vdGl4IFwKLQkJYGxzIC1kciAke3NyY2Rpcn0vLi4vdGl4W1s0LTldXSogMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL3RpeENvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfdGl4Y29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICBdKQotICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBUSVhDT05GSUc9IiMgbm8gVGl4IGNvbmZpZ3MgZm91bmQiCi0gICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBUaXggY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKLSAgZWxzZQotICAgIG5vX3RpeD0KLSAgICBUSVhDT05GSUc9JHthY19jdl9jX3RpeGNvbmZpZ30vdGl4Q29uZmlnLnNoCi0gICAgQUNfTVNHX1JFU1VMVChmb3VuZCAkVElYQ09ORklHKQotICBmaQotZmkKLQotXSkKLQotIyBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCi0jIGZyb20gUEFUSF9USVhDT05GSUcgKGJlY2F1c2UgdGhpcyBjYW4gYWxzbyBiZSBjYWNoZWQpLgotQUNfREVGVU4oQ1lHX0FDX0xPQURfVElYQ09ORklHLCBbCi0gICAgaWYgdGVzdCAtZiAiJFRJWENPTkZJRyIgOyB0aGVuCi0gICAgICAuICRUSVhDT05GSUcKLSAgICBmaQotCi0gICAgQUNfU1VCU1QoVElYX0JVSUxEX0xJQl9TUEVDKQotICAgIEFDX1NVQlNUKFRJWF9MSUJfRlVMTF9QQVRIKQotXSkKLQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSVRDTENPTkZJRywgWwotIwotIyBPaywgbGV0cyBmaW5kIHRoZSBpdGNsIGNvbmZpZ3VyYXRpb24KLSMgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAotIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC1pdGNsY29uZmlnCi0jCi0KLWlmIHRlc3QgeCIke25vX2l0Y2x9IiA9IHggOyB0aGVuCi0gICMgd2UgcmVzZXQgbm9faXRjbCBpbiBjYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCi0gIG5vX2l0Y2w9dHJ1ZQotICBBQ19BUkdfV0lUSChpdGNsY29uZmlnLCBbICAtLXdpdGgtaXRjbGNvbmZpZyAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgaXRjbCBjb25maWd1cmF0aW9uIChpdGNsQ29uZmlnLnNoKV0sCi0gICAgICAgICB3aXRoX2l0Y2xjb25maWc9JHt3aXRodmFsfSkKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSXRjbCBjb25maWd1cmF0aW9uXSkKLSAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRjbGNvbmZpZyxbCi0KLSAgIyBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLWl0Y2xjb25maWcgd2FzIHNwZWNpZmllZC4KLSAgaWYgdGVzdCB4IiR7d2l0aF9pdGNsY29uZmlnfSIgIT0geCA7IHRoZW4KLSAgICBpZiB0ZXN0IC1mICIke3dpdGhfaXRjbGNvbmZpZ30vaXRjbENvbmZpZy5zaCIgOyB0aGVuCi0gICAgICBhY19jdl9jX2l0Y2xjb25maWc9YChjZCAke3dpdGhfaXRjbGNvbmZpZ307IHB3ZClgCi0gICAgZWxzZQotICAgICAgQUNfTVNHX0VSUk9SKFske3dpdGhfaXRjbGNvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBpdGNsQ29uZmlnLnNoXSkKLSAgICBmaQotICBmaQotCi0gICMgdGhlbiBjaGVjayBmb3IgYSBwcml2YXRlIGl0Y2wgbGlicmFyeQotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gXAotCQkuLi9pdGNsL2l0Y2wgXAotCQlgbHMgLWRyIC4uL2l0Y2wvaXRjbFtbM11dKiAyPi9kZXYvbnVsbGAgXAotCQkuLi8uLi9pdGNsL2l0Y2wgXAotCQlgbHMgLWRyIC4uLy4uL2l0Y2wvaXRjbFtbM11dKiAyPi9kZXYvbnVsbGAgXAotCQkuLi8uLi8uLi9pdGNsL2l0Y2wgXAotCQlgbHMgLWRyIC4uLy4uLy4uL2l0Y2wvaXRjbFtbM11dKiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvaXRjbENvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaXRjbGNvbmZpZz1gKGNkICRpOyBwd2QpYAotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmkKLSAgIyBjaGVjayBpbiBhIGZldyBjb21tb24gaW5zdGFsbCBsb2NhdGlvbnMKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIGBscyAtZCAke3ByZWZpeH0vbGliIC91c3IvbG9jYWwvbGliIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pdGNsY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICAjIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBcCi0JCSR7c3JjZGlyfS8uLi9pdGNsL2l0Y2wgXAotCQlgbHMgLWRyICR7c3JjZGlyfS8uLi9pdGNsL2l0Y2xbWzNdXSogMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2l0Y2wvaXRjbENvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaXRjbGNvbmZpZz1gKGNkICRpOyBwd2QpYAotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmkKLSAgXSkKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIElUQ0xDT05GSUc9IiMgbm8gaXRjbCBjb25maWdzIGZvdW5kIgotICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgaXRjbCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zKQotICBlbHNlCi0gICAgbm9faXRjbD0KLSAgICBJVENMQ09ORklHPSR7YWNfY3ZfY19pdGNsY29uZmlnfS9pdGNsQ29uZmlnLnNoCi0gICAgQUNfTVNHX1JFU1VMVChmb3VuZCAkSVRDTENPTkZJRykKLSAgZmkKLWZpCi0KLV0pCi0KLSMgRGVmaW5lZCBhcyBhIHNlcGFyYXRlIG1hY3JvIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FjaGUgdGhlIHZhbHVlcwotIyBmcm9tIFBBVEhfSVRDTENPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCi1BQ19ERUZVTihDWUdfQUNfTE9BRF9JVENMQ09ORklHLCBbCi0gICAgaWYgdGVzdCAtZiAiJElUQ0xDT05GSUciIDsgdGhlbgotICAgICAgLiAkSVRDTENPTkZJRwotICAgIGZpCi0KLSAgICBBQ19TVUJTVChJVENMX0JVSUxEX0xJQl9TUEVDKQotICAgIEFDX1NVQlNUKElUQ0xfU0gpCi0gICAgQUNfU1VCU1QoSVRDTF9MSUJfRklMRSkKLSAgICBBQ19TVUJTVChJVENMX0xJQl9GVUxMX1BBVEgpCi0KLV0pCi0KLQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSVRLQ09ORklHLCBbCi0jCi0jIE9rLCBsZXRzIGZpbmQgdGhlIGl0ayBjb25maWd1cmF0aW9uCi0jIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKLSMgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtaXRrY29uZmlnCi0jCi0KLWlmIHRlc3QgeCIke25vX2l0a30iID0geCA7IHRoZW4KLSAgIyB3ZSByZXNldCBub19pdGsgaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICBub19pdGs9dHJ1ZQotICBBQ19BUkdfV0lUSChpdGtjb25maWcsIFsgIC0td2l0aC1pdGtjb25maWcgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIGl0ayBjb25maWd1cmF0aW9uIChpdGtDb25maWcuc2gpXSwKLSAgICAgICAgIHdpdGhfaXRrY29uZmlnPSR7d2l0aHZhbH0pCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEl0ayBjb25maWd1cmF0aW9uXSkKLSAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRrY29uZmlnLFsKLQotICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRrY29uZmlnIHdhcyBzcGVjaWZpZWQuCi0gIGlmIHRlc3QgeCIke3dpdGhfaXRrY29uZmlnfSIgIT0geCA7IHRoZW4KLSAgICBpZiB0ZXN0IC1mICIke3dpdGhfaXRrY29uZmlnfS9pdGtDb25maWcuc2giIDsgdGhlbgotICAgICAgYWNfY3ZfY19pdGtjb25maWc9YChjZCAke3dpdGhfaXRrY29uZmlnfTsgcHdkKWAKLSAgICBlbHNlCi0gICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9pdGtjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRrQ29uZmlnLnNoXSkKLSAgICBmaQotICBmaQotCi0gICMgdGhlbiBjaGVjayBmb3IgYSBwcml2YXRlIGl0ayBsaWJyYXJ5Ci0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIFwKLQkJLi4vaXRjbC9pdGsgXAotCQlgbHMgLWRyIC4uL2l0Y2wvaXRrW1szXV0qIDI+L2Rldi9udWxsYCBcCi0JCS4uLy4uL2l0Y2wvaXRrIFwKLQkJYGxzIC1kciAuLi8uLi9pdGNsL2l0a1tbM11dKiAyPi9kZXYvbnVsbGAgXAotCQkuLi8uLi8uLi9pdGNsL2l0ayBcCi0JCWBscyAtZHIgLi4vLi4vLi4vaXRjbC9pdGtbWzNdXSogMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2l0a0NvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaXRrY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICAjIGNoZWNrIGluIGEgZmV3IGNvbW1vbiBpbnN0YWxsIGxvY2F0aW9ucwotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBgbHMgLWQgJHtwcmVmaXh9L2xpYiAvdXNyL2xvY2FsL2xpYiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvaXRjbC9pdGtDb25maWcuc2giIDsgdGhlbgotICAgICAgICBhY19jdl9jX2l0a2NvbmZpZz1gKGNkICRpOyBwd2QpYAotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmkKLSAgIyBjaGVjayBpbiBhIGZldyBvdGhlciBwcml2YXRlIGxvY2F0aW9ucwotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBcCi0JCSR7c3JjZGlyfS8uLi9pdGNsL2l0ayBcCi0JCWBscyAtZHIgJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRrW1szXV0qIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9pdGtDb25maWcuc2giIDsgdGhlbgotICAgICAgICBhY19jdl9jX2l0a2NvbmZpZz1gKGNkICRpOyBwd2QpYAotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmkKLSAgXSkKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGtjb25maWd9IiA9IHggOyB0aGVuCi0gICAgSVRDTENPTkZJRz0iIyBubyBpdGsgY29uZmlncyBmb3VuZCIKLSAgICBBQ19NU0dfV0FSTihDYW4ndCBmaW5kIGl0ayBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zKQotICBlbHNlCi0gICAgbm9faXRrPQotICAgIElUS0NPTkZJRz0ke2FjX2N2X2NfaXRrY29uZmlnfS9pdGtDb25maWcuc2gKLSAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICRJVEtDT05GSUcpCi0gIGZpCi1maQotCi1dKQotCi0jIERlZmluZWQgYXMgYSBzZXBhcmF0ZSBtYWNybyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNhY2hlIHRoZSB2YWx1ZXMKLSMgZnJvbSBQQVRIX0lUS0NPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCi1BQ19ERUZVTihDWUdfQUNfTE9BRF9JVEtDT05GSUcsIFsKLSAgICBpZiB0ZXN0IC1mICIkSVRLQ09ORklHIiA7IHRoZW4KLSAgICAgIC4gJElUS0NPTkZJRwotICAgIGZpCi0KLSAgICBBQ19TVUJTVChJVEtfQlVJTERfTElCX1NQRUMpCi0gICAgQUNfU1VCU1QoSVRLX0xJQl9GSUxFKQotICAgIEFDX1NVQlNUKElUS19MSUJfRlVMTF9QQVRIKQotXSkKLQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBPaywgbGV0cyBmaW5kIHRoZSBsaWJndWkgc291cmNlIHRyZWVzIHNvIHdlIGNhbiB1c2UgdGhlIGhlYWRlcnMKLWRubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtbGliZ3VpaW5jbHVkZQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCR1VJLCBbCi0gICAgQ1lHX0FDX1BBVEhfTElCR1VJSAotICAgIENZR19BQ19QQVRIX0xJQkdVSUxJQgotXSkKLUFDX0RFRlVOKENZR19BQ19QQVRIX0xJQkdVSUgsIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLW5vX2xpYmd1aT10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIExpYmd1aSBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLUFDX0FSR19XSVRIKGxpYmd1aWluY2x1ZGUsIFsgIC0td2l0aC1saWJndWlpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSBsaWJndWkgaGVhZGVycyBhcmVdLCB3aXRoX2xpYmd1aWluY2x1ZGU9JHt3aXRodmFsfSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2xpYmd1aWgsWwotZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtbGliZ3VpaW5jbHVkZSB3YXMgc3BlY2lmaWVkCi1pZiB0ZXN0IHgiJHt3aXRoX2xpYmd1aWluY2x1ZGV9IiAhPSB4IDsgdGhlbgotICBpZiB0ZXN0IC1mICR7d2l0aF9saWJndWlpbmNsdWRlfS9ndWl0Y2wuaCA7IHRoZW4KLSAgICBhY19jdl9jX2xpYmd1aWg9YChjZCAke3dpdGhfbGliZ3VpaW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfbGliZ3VpaW5jbHVkZX0vc3JjL2d1aXRjbC5oIDsgdGhlbgotICAgIGFjX2N2X2NfbGliZ3VpaD1gKGNkICR7d2l0aF9saWJndWlpbmNsdWRlfS9zcmM7IHB3ZClgCi0gIGVsc2UKLSAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9saWJndWlpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGhlYWRlcnNdKQotICBmaQotZmkKLQotZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIExpYmd1aSBjb25maWd1cmF0aW9uIGZpbGUKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpY29uZmlnfSIgIT0geCA7IHRoZW4KLSAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAkYWNfY3ZfY19saWJndWljb25maWcvJGkvc3JjL2d1aXRjbC5oIDsgdGhlbgotICAgICAgYWNfY3ZfY19saWJndWloPWAoY2QgJGFjX2N2X2NfbGliZ3VpY29uZmlnLyRpL3NyYzsgcHdkKWAKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotZmkKLQotZG5sIG5leHQgY2hlY2sgaW4gcHJpdmF0ZSBzb3VyY2UgZGlyZWN0b3J5Ci1kbmwgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iID0geCA7IHRoZW4KLSAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIExpYmd1aSBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHNyY2Rpci8kaS9saWJndWkqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgIGxpYmd1aXBhdGg9JHNyY2Rpci8kaQotCSAgICBicmVhawotCWZpCi0gICAgZG9uZQotCi0gICAgZG5sIGZpbmQgdGhlIGV4YWN0IExpYmd1aSBzb3VyY2UgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKLSAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBMaWJndWksIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCi0gICAgZm9yIGkgaW4gYGxzIC1kciAkbGliZ3VpcGF0aC9saWJndWkqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRpL3NyYy9ndWl0Y2wuaCA7IHRoZW4KLSAgICAgICAgICBhY19jdl9jX2xpYmd1aWg9YChjZCAkaS9zcmM7IHB3ZClgCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotCi1kbmwgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iID0geCA7IHRoZW4KLSAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgIEFDX0NIRUNLX0hFQURFUihndWl0Y2wuaCwgYWNfY3ZfY19saWJndWloPWluc3RhbGxlZCwgYWNfY3ZfY19saWJndWloPSIiKQotZmkKLV0pCi1MSUJHVUlIRElSPSIiCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWh9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX1dBUk4oW0Nhbid0IGZpbmQgYW55IExpYmd1aSBoZWFkZXJzXSkKLWZpCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWh9IiAhPSB4IDsgdGhlbgotICAgIG5vX2xpYmd1aT0iIgotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iICE9IHgiaW5zdGFsbGVkIiA7IHRoZW4KLSAgICAgICAgTElCR1VJSERJUj0iLUkke2FjX2N2X2NfbGliZ3VpaH0iCi0gICAgZmkKLWZpCi1BQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19saWJndWlofSkKLUFDX1NVQlNUKExJQkdVSUhESVIpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBmaW5kIHRoZSBHVUkgbGlicmFyeQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCR1VJTElCLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIEdVSSBsaWJyYXJ5ICBpbiB0aGUgYnVpbGQgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1kbmwgbG9vayBmb3IgdGhlIGxpYnJhcnkKLUFDX01TR19DSEVDS0lORyhmb3IgR1VJIGxpYnJhcnkpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19saWJndWlsaWIsWwotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlsaWJ9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9saWJndWkvc3JjL01ha2VmaWxlIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19saWJndWlsaWI9YChjZCAkaS9saWJndWkvc3JjOyBwd2QpYAotICAgICAgICBicmVhawotICAgICAgZmkKLSAgICBkb25lCi1maQotXSkgCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWxpYn0iICE9IHggOyB0aGVuCi0gICAgIEdVSUxJQj0iJHtHVUlMSUJ9IC1MJHthY19jdl9jX2xpYmd1aWxpYn0iCi0gICAgIExJQkdVSUxJQj0iLWxndWkiCi0gICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2xpYmd1aWxpYn0pCi1lbHNlCi0gICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLUFDX1NVQlNUKEdVSUxJQikKLUFDX1NVQlNUKExJQkdVSUxJQikKLV0pCmRpZmYgLS1naXQgYS9jb25maWcvbWgtYTY4YnNkIGIvY29uZmlnL21oLWE2OGJzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5MTI4OS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtYTY4YnNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotUkFOTElCPXRydWUKLQotI05vbmUgb2YgdGhlIEFwb2xsbyBjb21waWxlcnMgY2FuIGNvbXBpbGUgZ2FzIG9yIGJpbnV0aWxzLiAgVGhlIHByZXByb2Nlc3NvcgotIyBjaG9rZXMgb24gYmZkLCB0aGUgY29tcGlsZXIgd29uJ3QgbGV0IHlvdSBhc3NpZ24gaW50ZWdlcnMgdG8gZW51bXMsIGFuZAotIyBvdGhlciBwcm9ibGVtcy4gIERlZmluaW5nIENDIHRvIGdjYyBpcyBhIHF1ZXN0aW9uYWJsZSB3YXkgdG8gc2F5ICJkb24ndCB1c2UKLSMgdGhlIGFwb2xsbyBjb21waWxlciIgKHRoZSBwcmVmZXJyZWQgdmVyc2lvbiBvZiBHQ0MgY291bGQgYmUgY2FsbGVkIGNjLAotIyBvciB3aGF0ZXZlciksIGJ1dCBJJ20gbm90IHN1cmUgbGVhdmluZyBDQyBhcyBjYyBpcyBhbnkgYmV0dGVyLi4uCi0KLSNDQz1jYyAtQSBhbnNpIC1BIHJ1bnR5cGUsYW55IC1BIHN5c3R5cGUsYW55IC1VX19TVERDX18gLUROT19TVERBUkcKLUNDPWdjYwotCi1CSVNPTj15YWNjCmRpZmYgLS1naXQgYS9jb25maWcvbWgtYWl4Mzg2IGIvY29uZmlnL21oLWFpeDM4NgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjY2QxYy4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtYWl4Mzg2CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUkFOTElCID0gQDoKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1haXg0MyBiL2NvbmZpZy9taC1haXg0MwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViNzUwYy4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtYWl4NDMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgQUlYIDQuMyBhbmQgYWJvdmUgcmVxdWlyZXMgLVgzMl82NCBmbGFnIHRvIGFsbCBhciBhbmQgbm0gY29tbWFuZHMKLSMgdG8gaGFuZGxlIGJvdGggMzItYml0IGFuZCA2NC1iaXQgb2JqZWN0cy4KLUFSX0ZPUl9UQVJHRVQ9YXIgLVgzMl82NAotTk1fRk9SX1RBUkdFVD1ubSAtWDMyXzY0CmRpZmYgLS1naXQgYS9jb25maWcvbWgtYXBvbGxvNjggYi9jb25maWcvbWgtYXBvbGxvNjgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OTdlZDkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWFwb2xsbzY4CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1IREVGSU5FUyA9IC1EVVNHCi1SQU5MSUI9dHJ1ZQotQ0M9IGNjIC1BIGFuc2kgLUEgcnVudHlwZSxhbnkgLUEgc3lzdHlwZSxhbnkgLVVfX1NURENfXyAtRFVTRwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWFybXBpYyBiL2NvbmZpZy9taC1hcm1waWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWFybXBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1jeHV4IGIvY29uZmlnL21oLWN4dXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjJhMTYuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWN4dXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZm9yIEhhcnJpcyBDWC9VWCA3IChhbmQgbWF5YmUgNiksIGJhc2VkIG9uIHN5c3Y0IGNvbmZpZ3VyYXRpb24uCi0KLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTViAtRFNWUjQKLVJBTkxJQiA9IHRydWUKLQotIyBDKysgZGVidWdnaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIHVuZGVyIFNWUjQgKERXQVJGKQotQ1hYRkxBR1M9LU8KLQotIyBUaGUgbCBmbGFnIGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSB0aGUgU1ZSNCBhcmNoaXZlciwgcmVtb3ZlIGl0LgotQVJfRkxBR1MgPSBjcQotCi0jIFVuZGVyIENYL1VYLCB3ZSB3YW50IHRvIHRlbGwgdGhlIGNvbXBpbGVyIHRvIHVzZSBBTlNJIG1vZGUuCi1DQz1jYyAtWGEKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1jeWd3aW4gYi9jb25maWcvbWgtY3lnd2luCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDEwMjdmLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1jeWd3aW4KKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTPWFsbC1saWJ0ZXJtY2FwCi1FWFRSQV9UQVJHRVRfSE9TVF9JTlNUQUxMX01PRFVMRVM9aW5zdGFsbC1saWJ0ZXJtY2FwCi0KLWFsbC1nZGI6IGFsbC1saWJ0ZXJtY2FwCi0KLWluc3RhbGwtZ2RiOiBhbGwtbGlidGVybWNhcApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRlY3N0YXRpb24gYi9jb25maWcvbWgtZGVjc3RhdGlvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyMDE5Mi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtZGVjc3RhdGlvbgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQ0MgPSBjYyAtV2YsLVhOZzEwMDAKLQotIyBmb3IgWDExLCBzaW5jZSB0aGUgbmF0aXZlIERFQ3dpbmRvd3MgaW5jbHVkZSBmaWxlcyBhcmUgcmVhbGx5IGJyb2tlbiB3aGVuCi0jIGl0IGNvbWVzIHRvIGZ1bmN0aW9uIHByb3RvdHlwZXMuICAKLVgxMV9FWFRSQV9DRkxBR1MgPSAiLUROZWVkRnVuY3Rpb25Qcm90b3R5cGVzPTAiCmRpZmYgLS1naXQgYS9jb25maWcvbWgtZGVsdGE4OCBiL2NvbmZpZy9taC1kZWx0YTg4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzljNDUzLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1kZWx0YTg4CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1SQU5MSUIgPSB0cnVlCi0KLQotCmRpZmYgLS1naXQgYS9jb25maWcvbWgtZGd1eCBiL2NvbmZpZy9taC1kZ3V4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Q4NWQ2Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1kZ3V4CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1IREVGSU5FUz0tREhPU1RfU1lTPURHVVhfU1lTCi1DQz1nY2MgLVdhbGwgLWFuc2kgLURfX3VzaW5nX0RHVVgKLVJBTkxJQj10cnVlCi0KZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1kZ3V4Mzg2IGIvY29uZmlnL21oLWRndXgzODYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ODg1YzMuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWRndXgzODYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIGZyb20gbWgtZGd1eAotSERFRklORVM9LURIT1NUX1NZUz1ER1VYX1NZUwotQ0M9Z2NjIC1XYWxsIC1hbnNpIC1EX191c2luZ19ER1VYCi1SQU5MSUIgPSB0cnVlCi0KLSMgZnJvbSBtaC1zeXN2NAotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWIC1EU1ZSNAotUkFOTElCID0gdHJ1ZQotCi0jIEMrKyBkZWJ1Z2dpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWQgdW5kZXIgU1ZSNCAoRFdBUkYpCi1DWFhGTEFHUz0tTwotCi0jIFRoZSBsIGZsYWcgZ2VuZXJhdGVzIGEgd2FybmluZyBmcm9tIHRoZSBTVlI0IGFyY2hpdmVyLCByZW1vdmUgaXQuCi1BUl9GTEFHUyA9IGNyCi0KLVgxMV9FWFRSQV9MSUJTID0gLWxuc2wKLQotIyBmcm9tIGFuZ2VsYQotIyBubyBkZWJ1Z2dpbmcgZHVlIHRvIGJyb2tlbiBjb21waWxlciwgdXNlIEJTRCBzdHlsZSB0aW1lb2ZkYXkKLUNGTEFHUz0tTyAtRF9CU0RfVElNRU9GREFZX0ZMQVZPUgotCmRpZmYgLS1naXQgYS9jb25maWcvbWgtZGpncHAgYi9jb25maWcvbWgtZGpncHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjAwN2IuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWRqZ3BwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIFdlIGRvbid0IHdhbnQgdG8gdXNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvbiBET1MuICBVbmZvcnR1bmF0ZWx5LAotIyB0aGlzIHJlcXVpcmVzIHRoYXQgd2Ugc2V0IENGTEFHUy4KLSMgVGhpcyB1c2VkIHRvIHNldCAtZm5vLW9taXQtZnJhbWUtcG9pbnRlci4KLUNGTEFHUz0tTzIKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1lbGZhbHBoYXBpYyBiL2NvbmZpZy9taC1lbGZhbHBoYXBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjZjJjOC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtZWxmYWxwaGFwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbWgtaHAzMDAgYi9jb25maWcvbWgtaHAzMDAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTcyNGQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWhwMzAwCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWCi0jIEF2b2lkICJ0b28gbXVjaCBkZWZpbmluZyIgZXJyb3JzIGZyb20gSFBVWCBjb21waWxlci4KLUNDID0gY2MgLVdwLC1IMjU2MDAwCi0jIElmICJhciIgaW4gJFBBVEggaXMgR05VIGFyLCB0aGUgc3ltYm9sIHRhYmxlIG1heSBuZWVkIHJlYnVpbGRpbmcuCi0jIElmIGl0J3MgSFAvVVggYXIsIHRoaXMgc2hvdWxkIGJlIGhhcm1sZXNzLgotUkFOTElCID0gYXIgdHMKLQotIyBOYXRpdmUgY2MgY2FuJ3QgYm9vdHN0cmFwIGdjYyB3aXRoIC1nLiAgRGVmaW5pbmcgQ0ZMQUdTIGhlcmUgbG9zZXMgKGEpCi0jIGZvciBub24tZ2NjIGRpcmVjdG9yaWVzLCAoYikgaWYgd2UgYXJlIGNvbXBpbGluZyB3aXRoIGdjYywgbm90Ci0jIG5hdGl2ZSBjYy4gIE5laXRoZXIgKGEpIG5vciAoYikgaGFzIGEgdHJpdmlhbCBmaXggdGhvdWdoLgotCi1DRkxBR1MgPQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWhwdXggYi9jb25maWcvbWgtaHB1eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3MWM5ZC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtaHB1eAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1DQyA9IGNjIC1XcCwtSDI1NjAwMAotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWhwdXg4IGIvY29uZmlnL21oLWhwdXg4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDcxYzlkLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1ocHV4OAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1DQyA9IGNjIC1XcCwtSDI1NjAwMAotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWludGVyaXggYi9jb25maWcvbWgtaW50ZXJpeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliOGVjZi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtaW50ZXJpeAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMgVGhlIHNoZWxsIG1heSBub3QgYmUgaW4gL2Jpbi4gCi1TSEVMTCA9IHNoCi1SQU5MSUIgPSB0cnVlCi0KLSMgV2UgZG9uJ3Qgd2FudCBkZWJ1Z2dpbmcgaW5mbyBpbiBJbnRlcml4LWhvc3RlZCB0b29sY2hhaW5zLgotIyBBY2NvbXBsaXNoIHRoaXMgYnkgb3ZlcnJpZGluZyBDRkxBR1MuIFRoaXMgaXMgYWxzbyBhIHdvcmthcm91bmQKLSMgZm9yIExEIGNyYXNoIHdoZW4gYnVpbGRpbmcgc2hhcmVkIGxpYnN0ZGMrKy4KLUNGTEFHUz0tTzIKLUNYWEZMQUdTPS1PMgotCi0jIFdlIGFsc28gbmVlZCB0byBvdmVycmlkZSBMSUJHQ0MyX0RFQlVHX0NGTEFHUyBzbyBsaWJnY2MyIHdpbGwgYmUKLSMgYnVpbHQgd2l0aG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLQotTElCR0NDMl9ERUJVR19DRkxBR1M9CmRpZmYgLS1naXQgYS9jb25maWcvbWgtaXJpeDQgYi9jb25maWcvbWgtaXJpeDQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NzIxNDUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWlyaXg0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIE1ha2VmaWxlIGNoYW5nZXMgZm9yIFNHSSdzIHJ1bm5pbmcgSVJJWC00LnguCi0jIFRlbGwgY29tcGlsZXIgdG8gdXNlIEsmUiBDLiAgV2UgY2FuJ3QgY29tcGlsZSB1bmRlciB0aGUgU0dJIEFuc2kKLSMgZW52aXJvbm1lbnQuICBBbHNvIGJ1bXAgc3dpdGNoIHRhYmxlIHNpemUgc28gdGhhdCBjcC1wYXJzZSB3aWxsCi0jIGNvbXBpbGUuICBCdW1wIHN0cmluZyBsZW5ndGggbGltaXQgc28gbGlua2VyIGJ1aWxkcy4KLQotQ0MgPSBjYyAtY2NrciAtV2YsLVhOZzE1MDAgLVdmLC1YTmsxMDAwIC1XZiwtWE5oMjAwMCAtV2YsLVhObDgxOTIKLVNZU1YgPSAtRFNZU1YKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1pcml4NSBiL2NvbmZpZy9taC1pcml4NQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkN2M5OS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtaXJpeDUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgTWFrZWZpbGUgY2hhbmdlcyBmb3IgU0dJJ3MgcnVubmluZyBJUklYLTUueC4KLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1pcml4NiBiL2NvbmZpZy9taC1pcml4NgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQyNWMxNi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtaXJpeDYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgTWFrZWZpbGUgY2hhbmdlcyBmb3IgU0dJJ3MgcnVubmluZyBJUklYLTYueC4KLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKLSMgU3BlY2lmeSB0aGUgQUJJLCB0byBlbnN1cmUgdGhhdCBhbGwgSXJpeCA2IHN5c3RlbXMgd2lsbCBiZWhhdmUgdGhlIHNhbWUuCi0jIEFsc28sIHVzaW5nIC0zMiBhdm9pZHMgYnVncyB0aGF0IGV4aXN0IGluIHRoZSBuMzIvbjY0IHN1cHBvcnQgaW4gc29tZQotIyB2ZXJzaW9ucyBvZiB0aGUgU0dJIGNvbXBpbGVyLgotQ0MgPSBjYyAtMzIKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1seW54b3MgYi9jb25maWcvbWgtbHlueG9zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZjYjc5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1seW54b3MKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgL2Jpbi9jYyBpcyBsZXNzIHRoYW4gdXNlZnVsIGZvciBvdXIgcHVycG9zZXMuICBBbHdheXMgdXNlIEdDQwotQ0MgPSAvYmluL2djYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWx5bnhyczZrIGIvY29uZmlnL21oLWx5bnhyczZrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjc5Mzk5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1seW54cnM2aworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBMeW54T1MgcnVubmluZyBvbiB0aGUgcnM2MDAwIGRvZXNuJ3QgaGF2ZSByYW5saWIKLVJBTkxJQiA9IHRydWUKLQotIyAvYmluL2NjIGlzIGxlc3MgdGhhbiB1c2VmdWwgZm9yIG91ciBwdXJwb3Nlcy4gIEFsd2F5cyB1c2UgR0NDCi1DQyA9IC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlL2Jpbi9nY2MKLQotIyAvYmluL3NoIGlzIHRvbyBidWdneSwgc28gdXNlIC9iaW4vYmFzaCBpbnN0ZWFkLgotU0hFTEwgPSAvYmluL2Jhc2gKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1tNjhrcGljIGIvY29uZmlnL21oLW02OGtwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZTQ4ZDkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLW02OGtwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHPS1mcGljCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbWluZ3czMiBiL2NvbmZpZy9taC1taW5ndzMyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzQ4MzlkLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1taW5ndzMyCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBXZSBkb24ndCB3YW50IGRlYnVnZ2luZyBpbmZvIGluIFdpbjMyLWhvc3RlZCB0b29sY2hhaW5zLgotIyBBY2NvbXBsaXNoIHRoaXMgYnkgb3ZlcnJpZGluZyBDRkxBR1MuCi1DRkxBR1M9LU8yCi1DWFhGTEFHUz0tTzIKLQotIyBXZSBhbHNvIG5lZWQgdG8gb3ZlcnJpZGUgTElCR0NDMl9ERUJVR19DRkxBR1Mgc28gbGliZ2NjMiB3aWxsIGJlCi0jIGJ1aWx0IHdpdGhvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0KLUxJQkdDQzJfREVCVUdfQ0ZMQUdTPQotCi0jIGN1c3RvbSBpbnN0YWxsYXRpb24gcnVsZXMgZm9yIG1pbmd3MzIgKGFwcGVuZCAuZXhlIHRvIGJpbmFyaWVzLCBldGMuKQotIyBJTlNUQUxMX0RPU1JFTD1pbnN0YWxsLWRvc3JlbApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLW5jcjMwMDAgYi9jb25maWcvbWgtbmNyMzAwMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiZDgwMy4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtbmNyMzAwMAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgSG9zdCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIGFuIE5DUiAzMDAwIChpNDg2L1NWUjQpIHN5c3RlbS4KLQotIyBUaGUgTkNSIDMwMDAgc2hpcHMgd2l0aCBhIE1ldGFXYXJlIGNvbXBpbGVyIGluc3RhbGxlZCBhcyAvYmluL2NjLgotIyBUaGlzIGNvbXBpbGVyIG5vdCBvbmx5IGVtaXRzIG9ibm94aW91cyBjb3B5cmlnaHQgbWVzc2FnZXMgZXZlcnkgdGltZQotIyB5b3UgcnVuIGl0LCBidXQgaXQgY2hva2VzIGFuZCBkaWVzIG9uIGEgd2hvbGUgYnVuY2ggb2YgR05VIHNvdXJjZQotIyBmaWxlcy4gIERlZmF1bHQgdG8gdXNpbmcgdGhlIEFUJlQgY29tcGlsZXIgaW5zdGFsbGVkIGluIC91c3IvY2NzL0FUVC9jYy4KLSMgVW5mb3J0dW5hdGVseSB0aG91Z2gsIHRoZSBBVCZUIGNvbXBpbGVyIHNvbWV0aW1lcyBnZW5lcmF0ZXMgY29kZSB0aGF0Ci0jIHRoZSBhc3NlbWJsZXIgYmFyZnMgb24gaWYgLWcgaXMgdXNlZCwgc28gZGlzYWJsZSBpdCBieSBkZWZhdWx0IGFzIHdlbGwuCi1DQyA9IC91c3IvY2NzL0FUVC9jYwotQ0ZMQUdTID0KLQotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWIC1EU1ZSNAotUkFOTElCID0gdHJ1ZQotCi0jIFRoZSBsIGZsYWcgZ2VuZXJhdGVzIGEgd2FybmluZyBmcm9tIHRoZSBTVlI0IGFyY2hpdmVyLCByZW1vdmUgaXQuCi1BUl9GTEFHUyA9IGNxCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbmNyc3ZyNDMgYi9jb25maWcvbWgtbmNyc3ZyNDMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYjA5OTEuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLW5jcnN2cjQzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jIEhvc3QgY29uZmlndXJhdGlvbiBmaWxlIGZvciBhbiBOQ1IgMzAwMCAoaTQ4Ni9TVlI0Mykgc3lzdGVtLgotCi0jIFRoZSBNZXRhV2FyZSBjb21waWxlciB3aWxsIGdlbmVyYXRlIGEgY29weXJpZ2h0IG1lc3NhZ2UgdW5sZXNzIHlvdQotIyB0dXJuIGl0IG9mZiBieSBhZGRpbmcgdGhlIC1Ibm9jb3B5ciBmbGFnLgotQ0MgPSBjYyAtSG5vY29weXIKLQotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWIC1EU1ZSNAotUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLW5lY3Y0IGIvY29uZmlnL21oLW5lY3Y0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODg3NzM2Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1uZWN2NAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMgSG9zdCBNYWtlZmlsZSBmcmFnbWVudCBmb3IgTkVDIE1JUFMgU1ZSNC4KLQotIyBUaGUgQyBjb21waWxlciBvbiBORUMgTUlQUyBTVlI0IG5lZWRzIGJpZ2dlciB0YWJsZXMuCi1DQyA9IGNjIC1aWE5kPTUwMDAgLVpYTmc9MTAwMAotCi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgTkVDIC1sWDExIG5lZWRzIHNvbWUgb3RoZXIgbGlicmFyaWVzLgotWDExX0VYVFJBX0xJQlMgPSAtbHNvY2tldCAtbG5zbApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXBhcGljIGIvY29uZmlnL21oLXBhcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNmMmM4Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1wYXBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1wcGNwaWMgYi9jb25maWcvbWgtcHBjcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNmMmM4Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1wcGNwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbWgtcmlzY29zIGIvY29uZmlnL21oLXJpc2NvcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU4NmIzMC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtcmlzY29zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyBUaGlzIGlzIGZvciBhIE1JUFMgcnVubmluZyBSSVNDL29zIDQuNTJDLgotCi0jIFRoaXMgaXMgbmVlZGVkIGZvciBHREIsIGJ1dCBuZWVkcyB0byBiZSBpbiB0aGUgdG9wLWxldmVsIG1ha2UgYmVjYXVzZQotIyBpZiBhIGxpYnJhcnkgaXMgY29tcGlsZWQgd2l0aCB0aGUgYnNkIGhlYWRlcnMgYW5kIGdldHMgbGlua2VkIHdpdGggdGhlCi0jIHN5c3Ygc3lzdGVtIGxpYnJhcmllcyBhbGwgaGVsbCBjYW4gYnJlYWsgbG9vc2UgKGUuZy4gYSBqbXBfYnVmIG1pZ2h0IGJlCi0jIGEgZGlmZmVyZW50IHNpemUpLgotIyBwdHJhY2UoMikgYXBwYXJlbnRseSBoYXMgcHJvYmxlbXMgaW4gdGhlIEJTRCBlbnZpcm9ubWVudC4gIE5vIHdvcmthcm91bmQgaXMKLSMga25vd24gZXhjZXB0IHRvIHNlbGVjdCB0aGUgc3lzdiBlbnZpcm9ubWVudC4gIENvdWxkIHdlIHVzZSAvcHJvYyBpbnN0ZWFkPwotIyBUaGVzZSAic3lzdiBlbnZpcm9ubWVudHMiIGFuZCAiYnNkIGVudmlyb25tZW50cyIgb2Z0ZW4gZW5kIHVwIGJlaW5nIGEgcGFpbi4KLSMKLSMgVGhpcyBpcyBub3QgcGFydCBvZiBDRkxBR1MgYmVjYXVzZSBwZXJoYXBzIG5vdCBhbGwgQyBjb21waWxlcnMgaGF2ZSB0aGlzCi0jIG9wdGlvbi4KLUNDPSBjYyAtc3lzdHlwZSBzeXN2Ci0KLVJBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zY28gYi9jb25maWcvbWgtc2NvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzMzN2M5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zY28KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKLSMgWW91IG1heSBuZWVkIHRoaXMgaWYgeW91IGRvbid0IGhhdmUgYmlzb24uCi0jIEJJU09OID0geWFjYyAtU20xMDQwMAotIyBUaGUgbmF0aXZlIEMgY29tcGlsZXIgYm90Y2hlcyBzb21lIHNpbXBsZSB1c2VzIG9mIGNvbnN0LiAgVW5mb3J0dW5hdGVseSwKLSMgaXQgZG9lc24ndCBkZWZpbmVkIGFueXRoaW5nIGxpa2UgIl9fc2NvX18iIGZvciB1cyB0byB0ZXN0IGZvciBpbiBhbnNpZGVjbC5oLgotQ0MgPSBjYyAtRGNvbnN0PQotCi1YMTFfRVhUUkFfTElCUyA9IC1sc29ja2V0IC1sbSAtbGludGwgLWxtYWxsb2MKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zb2xhcmlzIGIvY29uZmlnL21oLXNvbGFyaXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYmVhNTQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXNvbGFyaXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgTWFrZWZpbGUgY2hhbmdlcyBmb3IgU3VucyBydW5uaW5nIFNvbGFyaXMgMgotCi1TWVNWID0gLURTWVNWCi1SQU5MSUIgPSB0cnVlCi0KLVgxMV9FWFRSQV9MSUJTID0gLWxuc2wgLWxzb2NrZXQKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zcGFyY3BpYyBiL2NvbmZpZy9taC1zcGFyY3BpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkYmMyMi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtc3BhcmNwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHPWBjYXNlICIke0xJQkNGTEFHU30gJHtMSUJDWFhGTEFHU30iIGluICotZnBpYyogKSBlY2hvIC1mcGljIDs7ICogKSBlY2hvIC1mUElDIDs7IGVzYWNgCmRpZmYgLS1naXQgYS9jb25maWcvbWgtc3VuMyBiL2NvbmZpZy9taC1zdW4zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Q1MTU1Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zdW4zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIFN1bidzIEMgY29tcGlsZXIgbmVlZHMgdGhlIC1KIGZsYWcgdG8gYmUgYWJsZSB0byBjb21waWxlIGNwLXBhcnNlLmMKLSMgd2l0aG91dCBvdmVyZmxvd2luZyB0aGUganVtcCB0YWJsZXMgKC1KIHNheXMgdG8gdXNlIGEgMzIgYml0IHRhYmxlKQotQ0MgPSBjYyAtSgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXN5c3YgYi9jb25maWcvbWgtc3lzdgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiMTE4Ny4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtc3lzdgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWCi1SQU5MSUIgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbWgtc3lzdjQgYi9jb25maWcvbWgtc3lzdjQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMDY2NTEuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXN5c3Y0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWIC1EU1ZSNAotUkFOTElCID0gdHJ1ZQotCi0jIEMrKyBkZWJ1Z2dpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWQgdW5kZXIgU1ZSNCAoRFdBUkYpCi1DWFhGTEFHUz0tTwotCi0jIFRoZSBsIGZsYWcgZ2VuZXJhdGVzIGEgd2FybmluZyBmcm9tIHRoZSBTVlI0IGFyY2hpdmVyLCByZW1vdmUgaXQuCi1BUl9GTEFHUyA9IGNyCi0KLVgxMV9FWFRSQV9MSUJTID0gLWxuc2wKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zeXN2NSBiL2NvbmZpZy9taC1zeXN2NQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhMzhlNS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtc3lzdjUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTViAtRFNWUjQgLURTVlI1Ci1SQU5MSUIgPSB0cnVlCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3IKLQotWDExX0VYVFJBX0xJQlMgPSAtbG5zbApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXZheHVsdDIgYi9jb25maWcvbWgtdmF4dWx0MgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlMmRjOC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtdmF4dWx0MgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUaGUgb2xkIEJTRCBwY2MgaXNuJ3QgdXAgdG8gY29tcGlsaW5nIHBhcnRzIG9mIGdkYiBzbyB1c2UgZ2NjCi1DQyA9IGdjYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXg4NnBpYyBiL2NvbmZpZy9taC14ODZwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZTQ4ZDkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXg4NnBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUc9LWZwaWMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHctbWgtbXB3IGIvY29uZmlnL21wdy1taC1tcHcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0M2VmNGYuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy1taC1tcHcKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotIyBUaGlzIGlzIGFuIE1QVyBtYWtlZmlsZSBmcmFnbWVudC4KLQotIyBTaW5jZSB0aGVyZSBhcmUgYSBtdWx0aXBsaWNpdHkgb2YgTWFjIGNvbXBpbGVycyBhbmQgdHdvIGRpZmZlcmVudAotIyBwcm9jZXNzb3JzLCB0aGlzIGZpbGUgaXMgcHJpbWFyaWx5IGEgbGlicmFyeSBvZiBvcHRpb25zIGZvciBlYWNoCi0jIGNvbXBpbGVyLiAgU29tZWJvZHkgZWxzZSAoc3VjaCBhcyBhIGNvbmZpZ3VyZSBvciBidWlsZCBzY3JpcHQpIHdpbGwKLSMgbWFrZSB0aGUgYWN0dWFsIGNob2ljZS4KLQotIyBDb21waWxlciB0byB1c2UgZm9yIGNvbXBpbGluZy4KLQotQ0NfTVBXX0MgPSBDIC1kIE1QV19DIC1kIEFMTU9TVF9TVERDIC1kIEFOU0lfUFJPVE9UWVBFUyAtZCBNUFcgLW1jNjgwMjAgLW1vZGVsIGZhciAtYiAtdwotCi1DQ19TQyA9IFNDIC1kIEFMTU9TVF9TVERDIC1kIEFOU0lfUFJPVE9UWVBFUyAtZCBNUFcgLW1jNjgwMjAgLW1vZGVsIGZhciAtYiAtaSAnJyAtaSA6Ci0KLUNDX01XQzY4SyA9IE1XQzY4SyAtZCBNUFcgLWVudW0gaW50IC1tcHdfY2hhcnMgLXN5bSBvbiAtdyBvZmYgLW1jNjgwMjAgLW1vZGVsIGZhcgotCi1DQ19QUENDID0gUFBDQyAtZCBwb3dlcmM9MSAtZCBwYXNjYWw9IC1kIEFMTU9TVF9TVERDIC1kIEFOU0lfUFJPVE9UWVBFUyAtZCBNUFcgLXcKLQotQ0NfTVJDID0gTXJDIC1kIHBvd2VyYz0xIC1kIHBhc2NhbD0gLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtaSAnJyAtaSA6IC1qbQotCi1DQ19TTXJDID0gU01yQyAtZCBNUFcKLQotIyAiLW1wd19jaGFycyIgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgR05VIHNvdXJjZXMgb2Z0ZW4gbWl4IHNpZ25lZCBhbmQKLSMgdW5zaWduZWQgY2FzdWFsbHkuCi0jICItdyBvZmYiIGlzIG5vdCBhIGdyZWF0IGlkZWEsIGJ1dCBDVzcgaXMgY29tcGxhaW5pbmcgYWJvdXQgZW51bQotIyBhc3NpZ25tZW50cy4KLSMgIi1vcHQgZ2xvYmFsLHBlZXAsbDQsc3BlZWQiIGlzIHNvbWV0aW1lcyBnb29kLCBhbmQgc29tZXRpbWVzIGJhZC4KLSMgV2UgbXVzdCB1c2Uge0NJbmNsdWRlc30gc28gdGhhdCBNUFcgdG9vbHMgd2lsbCB3b3JrOyB7TVdDSW5jbHVkZXN9Ci0jIGRlZmluZXMgc3Rkb3V0LCBpc2xvd2VyLCBldGMsIGluIHdheXMgdGhhdCBhcmUgaW5jb21wYXRpYmxlIHdpdGggTVBXJ3MKLSMgcnVudGltZS4gIEhvd2V2ZXIsIHRoaXMgY2Fubm90IGJlIGRvbmUgdmlhICAtaSAie0NJbmNsdWRlc30iLCBzaW5jZQotIyB0aGF0IGRvZXMgbm90IGFmZmVjdCBob3cgPD4tdHlwZSBpbmNsdWRlcyBoYXBwZW47IGluc3RlYWQsIHRoZSB2YXJpYWJsZQotIyBNV0NJbmNsdWRlcyBtdXN0IGJlIHNldCB0byBwb2ludCBhdCB7Q0luY2x1ZGVzfS4KLQotQ0NfTVdDUFBDID0gTVdDUFBDIC1kIE1QVyAtZW51bSBpbnQgLW1wd19jaGFycyAtc3ltIG9uIC13IG9mZgotCi0jIE5vdGUgdGhhdCBHQ0MgZG9lcyAqbm90KiB3aXJlIGluIGEgZGVmaW5pdGlvbiBvZiAicGFzY2FsIiwgc28gdGhhdAotIyBpdCBjYW4gYmUgaGFuZGxlZCBpbiBhbm90aGVyIHdheSBpZiBkZXNpcmVkLgotCi1DQ182OEtfR0NDID0gZ0MgLURwYXNjYWw9IC1EQU5TSV9QUk9UT1RZUEVTIC1ETVBXCi0KLUNDX1BQQ19HQ0MgPSBnQyAtRHBvd2VyYz0xIC1EcGFzY2FsPSAtREFOU0lfUFJPVE9UWVBFUyAtRE1QVwotCi0jIE5vdGhpbmcgZm9yIHRoZSBkZWZhdWx0IENGTEFHUy4KLQotQ0ZMQUdTID0gCi0KLSMgVG9vbCB0byB1c2UgZm9yIG1ha2luZyBsaWJyYXJpZXMvYXJjaGl2ZXMuCi0KLUFSX0xJQiA9IExpYgotCi1BUl9NV0xJTks2OEsgPSBNV0xpbms2OEsgLXhtIGxpYnJhcnkKLQotQVJfUFBDTElOSyA9IFBQQ0xpbmsgLXhtIGxpYnJhcnkKLQotQVJfTVdMSU5LUFBDID0gTVdMaW5rUFBDIC14bSBsaWJyYXJ5Ci0KLUFSX0FSID0gYXIKLQotQVJfRkxBR1MgPSAtbwotCi1SQU5MSUJfTlVMTCA9IG51bGwtY29tbWFuZAotCi1SQU5MSUJfUkFOTElCID0gcmFubGliCi0KLSMgQ29tcGlsZXIgYW5kL29yIGxpbmtlciB0byB1c2UgZm9yIGxpbmtpbmcuCi0KLUNDX0xEX0xJTksgPSBMaW5rIC13IC1kIC1tb2RlbCBmYXIge0NDX0xEX1RPT0xfRkxBR1N9Ci0KLUNDX0xEX01XTElOSzY4SyA9IE1XTGluazY4SyAtdyB7Q0NfTERfVE9PTF9GTEFHU30gLXN5bSBvbiAtbW9kZWwgZmFyCi0KLUNDX0xEX1BQQ0xJTksgPSBQUENMaW5rIC1tYWluIF9fc3RhcnQgLW91dHB1dGZvcm1hdCB4Y29mZgotCi1DQ19MRF9NV0xJTktQUEMgPSBNV0xpbmtQUEMgLXcge0NDX0xEX1RPT0xfRkxBR1N9IC1zeW0gb24KLQotQ0NfTERfR0xEID0gZ0MKLQotIyBFeHRlbnNpb24gZm9yIGxpbmtlciBvdXRwdXQuCi0KLVBST0dfRVhUXzY4SyA9Ci0KLVBST0dfRVhUX1hDT0ZGID0gLnhjb2ZmCi0KLSMgTm90aGluZyBmb3IgdGhlIGRlZmF1bHQgTERGTEFHUy4KLQotTERGTEFHUyA9IC13Ci0KLUNDX0xEX1RPT0xfRkxBR1MgPSAtYyAnTVBTICcgLXQgTVBTVAotCi0jIExpYnJhcmllcyB0byBsaW5rIGFnYWluc3QuCi0KLSMgSXQgd291bGQgYXBwZWFyIHRoYXQgdGhlIG1hdGggbGlicmFyaWVzIGFyZSBub3QKLSMgbmVlZGVkIGV4Y2VwdCB0byBwcm92aWRlIGEgZGVmaW5pdGlvbiBmb3Igc2NhbGIsCi0jIHdoaWNoIGlzIGNhbGxlZCBmcm9tIGxkZXhwLCB3aGljaCBpcyByZWZlcmVuY2VkCi0jIGluIHRoZSBtNjhrIG9wY29kZXMgbGlicmFyeS4KLQotRVhUUkFMSUJTX0MgPSBcT3B0aW9uLWQKLQkie0NMaWJyYXJpZXN9IlN0ZENsaWIubyBcT3B0aW9uLWQKLQkie0NMaWJyYXJpZXN9Ik1hdGgubyBcT3B0aW9uLWQKLQkie0NMaWJyYXJpZXN9IkNTQU5FTGliLm8gXE9wdGlvbi1kCi0JIntMaWJyYXJpZXN9IlN0dWJzLm8gXE9wdGlvbi1kCi0JIntMaWJyYXJpZXN9IlJ1bnRpbWUubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iSW50ZXJmYWNlLm8gXE9wdGlvbi1kCi0JIntMaWJyYXJpZXN9IlRvb2xMaWJzLm8KLQotRVhUUkFMSUJTX01XQzY4SyA9IFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iU3RkQ2xpYi5vIFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iTWF0aC5vIFxPcHRpb24tZAotCSJ7Q0xpYnJhcmllc30iQ1NBTkVMaWIubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iU3R1YnMubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iUnVudGltZS5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJJbnRlcmZhY2UubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iVG9vbExpYnMubyBcT3B0aW9uLWQKLQkie01XNjhLTGlicmFyaWVzfU1QVyBBTlNJICg0aSkgQy42OEsuTGliIgotCi1FWFRSQUxJQlNfUFBDX1hDT0ZGID0gXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlN0ZENSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IkludGVyZmFjZUxpYi54Y29mZiBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iTWF0aExpYi54Y29mZiBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iU3RkQ0xpYi54Y29mZiBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iUFBDVG9vbExpYnMubyBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iUFBDQ1J1bnRpbWUubyBcT3B0aW9uLWQKLQkie0dDQ1BQQ0xpYnJhcmllc30ibGliZ2NjLnhjb2ZmCi0KLUVYVFJBTElCU19QUEMgPSBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iU3RkQ1J1bnRpbWUubyBcT3B0aW9uLWQKLQkie1NoYXJlZExpYnJhcmllc30iSW50ZXJmYWNlTGliIFxPcHRpb24tZAotCSJ7U2hhcmVkTGlicmFyaWVzfSJNYXRoTGliIFxPcHRpb24tZAotCSJ7U2hhcmVkTGlicmFyaWVzfSJTdGRDTGliIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENUb29sTGlicy5vIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7R0NDUFBDTGlicmFyaWVzfSJsaWJnY2MueGNvZmYKLQotRVhUUkFMSUJTX01XQ1BQQyA9IFxPcHRpb24tZAotCSJ7TVdQUENMaWJyYXJpZXN9Ik1XU3RkQ1J1bnRpbWUuTGliIFxPcHRpb24tZAotCSJ7TVdQUENMaWJyYXJpZXN9IkludGVyZmFjZUxpYiBcT3B0aW9uLWQKLQkie01XUFBDTGlicmFyaWVzfSJTdGRDTGliIFxPcHRpb24tZAotCSJ7TVdQUENMaWJyYXJpZXN9Ik1hdGhMaWIgXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iUFBDVG9vbExpYnMubwotCi0jIFRvb2wgdG8gbWFrZSBQRUYgd2l0aCwgaWYgbmVlZGVkLgotCi1NQUtFUEVGX05VTEwgPSBudWxsLWNvbW1hbmQKLQotTUFLRVBFRl9QUEMgPSBNYWtlUEVGCi0KLU1BS0VQRUZfRkxBR1MgPSBcT3B0aW9uLWQKLQktbCBJbnRlcmZhY2VMaWIueGNvZmY9SW50ZXJmYWNlTGliIFxPcHRpb24tZAotCS1sIE1hdGhMaWIueGNvZmY9TWF0aExpYiBcT3B0aW9uLWQKLQktbCBTdGRDTGliLnhjb2ZmPVN0ZENMaWIKLQotTUFLRVBFRl9UT09MX0ZMQUdTID0gLWZ0IE1QU1QgLWZjICdNUFMgJwotCi0jIFJlc291cmNlIGNvbXBpbGVyIHRvIHVzZS4KLQotUkVaXzY4SyA9IFJlegotCi1SRVpfUFBDID0gUmV6IC1kIFdBTlRfQ0ZSRwotCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L0NoYW5nZUxvZyBiL2NvbmZpZy9tcHcvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2RlZmJmLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotVHVlIE5vdiAyNiAxMjozNDoxMiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBGaXggc29tZSBjb21tZW50cy4KLQotTW9uIFNlcCAxNiAxNDo0Mjo1MiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkIChITERFTlYpOiBFZGl0IG91dCBhbGwgcmVmZXJlbmNlcy4KLQotVGh1IEF1ZyAxNSAxOTo0OToyMyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIHRydWU6IE5ldyBzY3JpcHQsIGlkZW50aWNhbCB0byBtcHctdHJ1ZS4KLQkqIGctbXB3LW1ha2Uuc2VkOiBBZGQgQERBU0hfQ19GTEFHQCBhbmQgQFNFR01FTlRfRkxBRygpQAotCXRvIHRoZSBlZGl0b3JzIGZvciBjb21waWxlIGNvbW1hbmRzLgotCi1UaHUgQXVnICAxIDE1OjAxOjQyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LXRydWUsIG1wdy10b3VjaCwgbnVsbC1jb21tYW5kOiBOZXcgc2NyaXB0cy4KLQkqIFJFQURNRTogRGVzY3JpYmUgdXNhZ2UgaW4gbW9yZSBkZXRhaWwuCi0KLVR1ZSBEZWMgMTIgMTQ6NTE6NTEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBnLW1wdy1tYWtlLnNlZDogRG9uJ3QgZWRpdCBvdXQgInZlcnNpb249IiBvY2N1cnJlbmNlcy4KLQotRnJpIERlYyAgMSAxMTo0NjoxOCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkIChiaW5kaXIsIGxpYmRpcik6IEVkaXQgdGhlIHBvc2l0aW9ucyBvZgotCXBhdGhuYW1lIHNlcGFyYXRvcnMgdG8gd29yayB3aXRoIG90aGVyIHBhdGhuYW1lcyBiZXR0ZXIuCi0KLVR1ZSBOb3YgIDcgMTU6MDg6MDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBnLW1wdy1tYWtlLnNlZDogQWRkIGNvbW1lbnQgYWJvdXQgRHVwbGljYXRlIHZzIENhdGVuYXRlLAotCWFkZCBhZGRpdGlvbmFsIHBhdHRlcm4gZm9yIGVkaXRpbmcgbGluay1jb21waWxlIGNvbW1hbmRzLgotCi1UdWUgT2N0IDI0IDE0OjI4OjUxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQ6IEFkZCBoYW5kbGluZyBmb3IgKi50YWIuW2hjXSBmaWxlcy4KLQkoQ0hJTExfRk9SX1RBUkdFVCwgQ0hJTExfTElCKTogRWRpdCBvdXQgdHJpY2t5IGRlZmluaXRpb25zCi0Jb2YgdGhlc2UuCi0KLVRodSBTZXAgMjggMjE6MDU6MTAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBnLW1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIGdlbmVyaWMgc2VkIGNvbW1hbmRzIHRvIHRyYW5zbGF0ZQotCVVuaXggbWFrZWZpbGVzIGludG8gTVBXIG1ha2VmaWxlIHN5bnRheC4KLQotRnJpIE1hciAxNyAxMTo1MToyMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIFJFQURNRTogQ2xhcmlmeSBpbnN0cnVjdGlvbnMuCi0JKiBmaTogUmVtb3ZlLgotCi1XZWQgRGVjIDIxIDE1OjQ1OjUzIDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogTW92ZUlmQ2hhbmdlLCBSRUFETUUsIGZpLCBmb3J3YXJkLWluY2x1ZGUsIG9wZW4tYnJhY2UsCi0gICAgICAgIHRyLTd0bzgtc3JjOiBOZXcgZmlsZXMuCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L01vdmVJZkNoYW5nZSBiL2NvbmZpZy9tcHcvTW92ZUlmQ2hhbmdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGJjMTI1Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvTW92ZUlmQ2hhbmdlCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBSZW5hbWUgYSBmaWxlIG9ubHkgaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gYSBwcmV2aW91c2x5IGV4aXN0aW5nCi0jIGZpbGUgb2YgdGhlIHNhbWUgbmFtZS4gIFRoaXMgaXMgdXNlZnVsIGZvciBrZWVwaW5nIG1ha2UgZnJvbSBkb2luZwotIyB0b28gbXVjaCB3b3JrIGlmIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgaGF2ZW4ndCBjaGFuZ2VkLgotCi0jIFRoaXMgaXMgYW4gTVBXIHRyYW5zbGF0aW9uIG9mIHRoZSBzdGFuZGFyZCBHTlUgc2ggc2NyaXB0IG1vdmUtaWYtY2hhbmdlLgotCi1TZXQgZXhpdCAwCi0KLUlmICJgZXhpc3RzIC1mICJ7Mn0iYCIKLSAgQ29tcGFyZSAiezF9IiAiezJ9IiA+ZGV2Om51bGwKLSAgSWYge3N0YXR1c30gIT0gMAotICAgIFJlbmFtZSAteSAiezF9IiAiezJ9IgotICBFbHNlCi0gICAgRWNobyAiezJ9IiBpcyB1bmNoYW5nZWQKLSAgICBEZWxldGUgLWkgLXkgInsxfSIKLSAgRW5kCi1FbHNlCi0gIFJlbmFtZSAteSAiezF9IiAiezJ9IgotRW5kCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L1JFQURNRSBiL2NvbmZpZy9tcHcvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTQ3MDBhLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgTVBXIHNjcmlwdHMgYW5kIHJlbGF0ZWQgZmlsZXMgdGhhdCBhcmUgbmVlZGVkIHRvCi1idWlsZCBDeWdudXMgR05VIHRvb2xzIGZvciBNUFcuICBUaGUgc2NyaXB0cyBzaG91bGQgYmUgc29tZXdoZXJlIG9uIHRoZQotY29tbWFuZCBwYXRoOyBvdXIgdXN1YWwgcHJhY3RpY2UgaGFzIGJlZW4gdG8gaGF2ZSBhIHNlcGFyYXRlIGRpcmVjdG9yeQotZm9yIHRoZSBzY3JpcHRzLCBhbmQgcHV0IHRoZSB0b29scyAoYnlhY2MsIGZsZXgsIGFuZCBzZWQgYXQgbGVhc3QpIHRoZXJlCi1hbHNvOyB0aGVuIGl0J3MgZWFzaWVyIHRvIGRyYWcgdGhlIHN1cHBvcnQgYml0cyBhcm91bmQgYXMgYSBncm91cCwgb3IgdG8KLXVwZ3JhZGUgTVBXIHZlcnNpb25zLiAgVGhlIGNvbXBsZXRlIHBhY2thZ2Ugb2Ygc2NyaXB0cyBhbmQgdG9vbCBiaW5hcmllcwotaXMgdXN1YWxseSBhdmFpbGFibGUgYXMgcHViL21hYy9idWlsZHRvb2xzLmNwdC5ocXggb24gZnRwLmN5Z251cy5jb20uCi0KLSJ0ci03dG84LXNyYyIgaXMgYWN0dWFsbHkgdGhlIHNvdXJjZSB0byBhbiBNUFcgc2NyaXB0IHRoYXQgdHJhbnNmb3Jtcwotc2VxdWVuY2VzIGxpa2UgIlxPcHRpb24tZCIgaW50byB0aGUgYWN0dWFsIDgtYml0IGNoYXJzIHRoYXQgTVBXIG5lZWRzLgotSXQncyBvbmx5IHRoZSBzb3VyY2UgYmVjYXVzZSBpdCBjYW4ndCBpdHNlbGYgaW5jbHVkZSBhbnkgOC1iaXQgY2hhcnMuCi1JdCAqY2FuKiBiZSBwcm9jZXNzZWQgaW50byBhIGdlbnVpbmUgInRyLTd0bzgiIGJ5IHVzaW5nIGl0c2VsZjoKLQotCXRyLTd0bzggdHItN3RvOC1zcmMgfCBzZWQgLWUgJ3MvU3JjLy8nID5uZXctdHItN3RvOAotCi1Vc2UgdGhpcyB0byB2ZXJpZnk6Ci0KLQljb21wYXJlIHRyLTd0bzggbmV3LXRyLTd0bzgKLQotSWYgeW91IGRvbid0IGhhdmUgYSB3b3JraW5nIHRyLTd0bzgsIHRoZW4geW91IHdpbGwgaGF2ZSB0byBtYW51YWxseQotcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgIlxPcHRpb24tZCIgd2l0aCByZWFsIE9wdGlvbi1kICh3aGljaCBsb29rcwotbGlrZSBhIGRlbHRhKSwgdGhlbiBkbyBzaW1pbGFybHkgd2l0aCBhbGwgdGhlIG90aGVyICJcT3B0aW9uLS4uLiIKLXN0cmluZ3MsIGFuZCB0aGVuIGNoYW5nZSAiXFNyY09wdGlvbi1kIiBpbnRvIHRoZSBzdHJpbmcgIlxPcHRpb24tZCIuCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L2ZvcndhcmQtaW5jbHVkZSBiL2NvbmZpZy9tcHcvZm9yd2FyZC1pbmNsdWRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGQ2YmQ3Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvZm9yd2FyZC1pbmNsdWRlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1FY2hvICcjaW5jbHVkZScgtiIiezF9IrYiID4iezJ9Ii50ZW0KLU1vdmVJZkNoYW5nZSAiezJ9Ii50ZW0gInsyfSIKLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9nLW1wdy1tYWtlLnNlZCBiL2NvbmZpZy9tcHcvZy1tcHctbWFrZS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDNjNzcuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9nLW1wdy1tYWtlLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0byB0cmFuc2xhdGUgVW5peCBtYWtlZmlsZXMgaW50byBNUFcgbWFrZWZpbGVzLgotIyBUaGVzZSBhcmUgbm9taW5hbGx5IGdlbmVyaWMsIGJ1dCB3b3JrIGJlc3Qgb24gdGhlIG1ha2VmaWxlcyB1c2VkCi0jIGZvciBHTlUgcHJvZ3JhbXMuCi0KLSMgV2hhY2sgb3V0IGFueSBjb21tZW50ZWQtb3V0IGxpbmVzIHRoYXQgYXJlIHByb2JhYmx5IGNvbW1hbmRzOwotIyB0aGV5IGNhbiBvbmx5IGNhdXNlIHRyb3VibGUgbGF0ZXIgb24uCi0vXiMJL2QKLQotIyBDaGFuZ2UgZGVwZW5kZW5jeSBjaGFyLgotLzokL3MvOi8gXFxPcHRpb24tZi9nCi0vXlteIAk6I11bXjpdKjovcy9cKFsgCV0qXCk6XChbIAldKlwpLyBcXE9wdGlvbi1mIC9nCi0KLSMgQ2hhbmdlIHN5bnRheCBvZiBNYWtlZmlsZSB2YXJzLgotL1wkL3MvXCR7XChbYS16QS1aMC05Xy1dKlwpfS97XDF9L2cKLS9cJC9zL1wkKFwoW2EtekEtWjAtOV8tXSpcKSkve1wxfS9nCi0vICRAL3MvICRALyB7VGFyZ30vCi0KLSMgRG91YmxlLSQgYXJlIGxpdGVyYWxzIHRvIFVuaXggYnV0IG5vdCB0byBNUFcgbWFrZS4KLS9cJFwkL3MvXCRcJC8kL2cKLQotIyBDaGFuZ2UgcGF0aG5hbWUgc3ludGF4LgotL1wvL3MsXC5cLi9cL1wuXC4vLDo6OixnCi0vXC8vcyxcLlwuLyw6OixnCi0vXC5cLy9zLFwuLyw6LGcKLS9cLy9zLC8sOixnCi0jIFVuZG8gZXhjZXNzIGNoYW5nZXMuCi0vYW5kL3MsYW5kOm9yJCxhbmQvb3IsCi0vYW5kL3MsYW5kOm9yICxhbmQvb3IgLAotL3dhbnQvcyx3YW50Om5lZWQsd2FudC9uZWVkLAotIyBGaXhpbmcgdXAgc2VkIGNvbW1hbmRzLgotLy1lL3NfIjpcKFteOl0qXCk6ZCJfIi9cMS9kIl9nCi0vLWUvc18iOlwoW146XSpcKTosOlwoW146XSpcKTpkIl8iL1wxLywvXDIvZCJfZwotCi0vPS9zLyA9IFwuJC8gPSA6LwotCi0jIE1ha2UgdGhlc2UgZ28gYXdheSBzbyB0aGF0IGxhdGVyIGVkaXRzIG5vdCBjb25mdXNlZC4KLS9ITERFTlYvcy97SExERU5WfS8vCi0KLSMgQ29tbWVudCBvdXQgYW55IGV4cGxpY2l0IHNyY2RpciBzZXR0aW5nLgotL3NyY2Rpci9zL15zcmNkaXIvIyBzcmNkaXIvCi0KLS9CQVNFRElSL3MvXkJBU0VESVIgPS4qJC9CQVNFRElSID0gIntzcmNyb290fSIvCi0ve0JBU0VESVJ9Oi9zL3tCQVNFRElSfTove0JBU0VESVJ9L2cKLS97c3JjZGlyfTovcy97c3JjZGlyfTovIntzcmNkaXJ9Ii9nCi0vIntzcmNkaXJ9Ijovcy8ie3NyY2Rpcn0iOi8ie3NyY2Rpcn0iL2cKLQotIyBUd2VhayBzb21lIGNvbnZlbnRpb25zIHRoYXQgYXJlIGJhY2t3YXJkcyBmb3IgdGhlIE1hYy4KLS9iaW5kaXIvcy97ZXhlY19wcmVmaXh9OmJpbi97ZXhlY19wcmVmaXh9YmluOi8KLS9saWJkaXIvcy97ZXhlY19wcmVmaXh9OmxpYi97ZXhlY19wcmVmaXh9bGliOi8KLQotIyBDb21tZW50IG91dCBzZXR0aW5ncyBvZiBhbnl0aGluZyBzZXQgYnkgbXB3IGhvc3QgY29uZmlnLgotL0NDL3MvXkNDICo9LyNDQyA9LwotL0NGTEFHUy9zL15DRkxBR1MgKj0vI0NGTEFHUyA9LwotL0FSL3MvXkFSICo9LyNBUiA9LwotL0FSX0ZMQUdTL3MvXkFSX0ZMQUdTICo9LyNBUl9GTEFHUyA9LwotL1JBTkxJQi9zL15SQU5MSUIgKj0vI1JBTkxJQiA9LwotL0NDX0xEL3MvXkNDX0xEICo9LyNDQ19MRCA9LwotL0xERkxBR1Mvcy9eTERGTEFHUyAqPS8jTERGTEFHUyA9LwotCi0jIENoYW5nZSAtSSB1c2FnZXMuCi0vLUkvcy8tSVwuLy1pIDovZwotLy1JL3MvLUk6OmJmZC8taSA6OmJmZDovZwotLy1JL3MvLUk6OmluY2x1ZGUvLWkgOjppbmNsdWRlOi9nCi0vLUkvcy8tSS8taSAvZwotCi0jIENoYW5nZSAtRCB1c2FnZS4KLS8tRC9zL1woWyA9XVwpLURcKFteIF0qXCkvXDEtZCBcMi9nCi0KLSMgQ2hhbmdlIGNvbnRpbnVhdGlvbiBjaGFyLgotL1xcJC9zL1xcJC9cXE9wdGlvbi1kLwotCi0jIENoYW5nZSB3aWxkY2FyZCBjaGFyLgotL1wqL3MvXCovXFxPcHRpb24teC9nCi0KLSMgQ2hhbmdlIHBhdGggb2YgdmFyaW91cyB0eXBlcyBvZiBzb3VyY2UgZmlsZXMuICBUaGlzIHJ1bGUgZG9lcyBub3QgYWxsb3cKLSMgZm9yIGZpbGUgbmFtZXMgd2l0aCBtdWx0aXBsZSBkb3RzIGluIHRoZSBuYW1lLgotL1wuW2NobHldL3MvXChbIAk+PD1dXClcKFstYS16QS1aMC05XyR7fToiXSpcKVwuXChbY2hseV1cKS9cMSJ7c30iXDIuXDMvZwotL1wuW2NobHldL3MvXlwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5cKFtjaGx5XVwpLyJ7c30iXDEuXDIvCi0jIEFsbG93IGZpbGVzIG5hbWVkICoudGFiLltjaF0gYXMgYSBzcGVjaWFsIGNhc2UuCi0vXC50YWJcLltjaF0vcy9cKFsgCT48PV1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwudGFiXClcLlwoW2NoXVwpL1wxIntzfSJcMi5cMy9nCi0vXC50YWJcLltjaF0vcy9eXChbLWEtekEtWjAtOV8ke306Il0qXC50YWJcKVwuXChbY2hdXCkvIntzfSJcMS5cMi8KLSMgRml4IHNvbWUgb3ZlcmVudGh1c2lhc21zLgotL3tzfS9zLyJ7c30iIntzcmNkaXJ9Ii8ie3NyY2Rpcn0iL2cKLS97c30vcy8ie3N9IntcKFthLXpBLVowLTlfXSpcKWRpcn0vIntcMWRpcn0iL2cKLS97c30vcy8ie3N9IntcKFthLXpBLVowLTlfXSpcKURJUn0vIntcMURJUn0iL2cKLS97c30vcy8ie3N9IiJ7XChbYS16QS1aMC05X10qXClkaXJ9Ii8ie1wxZGlyfSIvZwotL3tzfS9zLyJ7c30iIntcKFthLXpBLVowLTlfXSpcKURJUn0iLyJ7XDFESVJ9Ii9nCi0ve3N9L3MvIntzfSI6LzovZwotL3tzfS9zL14ie3N9Ii8vZwotL3tzfS9zLyJ7c30iIntzfSIvIntzfSIvZwotL3tzfS9zLyJ7c30iIntzcmNkaXJ9Ii8ie3N9Ii9nCi0ve3N9L3MvIntzcmNkaXJ9IiJ7c30iLyJ7c30iL2cKLQotIyBUaGUgLmRlZiBmaWxlcyBhcmUgYWxzbyB0eXBpY2FsbHkgc291cmNlIGZpbGVzLgotL1wuZGVmL3MvXChbIAk+PF1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5kZWYvXDEie3N9IlwyLmRlZi9nCi0vXC5kZWYvcy9eXChbLWEtekEtWjAtOV8ke306Il0qXClcLmRlZi8ie3N9IlwxLmRlZi9nCi0KLSMgQ2hhbmdlIGV4dGVuc2lvbiBhbmQgcGF0aCBvZiBvYmplY3RzLgotL1wuby9zL1woWyAJPV1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5vL1wxIntvfSJcMi5jLm8vZwotL1wuby9zL15cKFstYS16QS1aMC05XyR7fToiXSpcKVwuby8ie299IlwxLmMuby8KLSMgQWxsb3cgKi50YWIubyBmaWxlcyBhcyBhIHNwZWNpYWwgY2FzZSBvZiBhIDItZG90LW5hbWUgZmlsZS4KLS9cLm8vcy9cKFsgCT1dXClcKFstYS16QS1aMC05XyR7fToiXSpcKVwudGFiXC5vL1wxIntvfSJcMi50YWIuYy5vL2cKLS9cLm8vcy9eXChbLWEtekEtWjAtOV8ke306Il0qXClcLnRhYlwuby8ie299IlwxLnRhYi5jLm8vCi0jIENsZWFuIHVwLgotLyJ7b30iL3MvIntvfSIie299Ii8ie299Ii9nCi0vIntvfSIvcy9eIntvfSJcKFthLXpBLVowLTlfXSpcKT0vXDE9LwotCi0jIENoYW5nZSBleHRlbnNpb24gb2YgbGlicy4KLS9cLmEvcy9saWJcKFthLXpdKlwpXC5hL2xpYlwxLm8vZwotCi0jIFJlbW92ZSBub24tZmFpbCBvcHRpb24uCi0vLS9zL15cKFsgCV0qXCktL1wxLwotIyBGaXggb3ZlcmVhZ2VybmVzc2VzIC0gYXNzdW1lcyBubyBvbmUtbGV0dGVyIGNvbW1hbmRzLgotL15bIAldKlthLXpdIC9zL15cKFsgCV0qXClcKFthLXpdXCkgL1wxLVwyIC8KLQotIyBSZW1vdmUgbm9uLWVjaG8gb3B0aW9uLiAod2F0Y2ggb3V0IGZvciBhdXRvY29uZiB0aGluZ3MpCi0vQC9zL15cKFsgCV0qXClAL1wxLwotCi0jIENoYW5nZSBjcCB0byBEdXBsaWNhdGUuCi0jIENhdGVuYXRlIGlzIHBlcmhhcHMgbW9yZSBhY2N1cmF0ZSwgYnV0IHRoZSBwYXR0ZXJuIHdvdWxkIGhhdmUgdG8KLSMgaWRlbnRpZnkgdGhlIG91dHB1dCBmaWxlIGFuZCBhZGQgYSAnPicgcmVkaXJlY3Rpb24gaW50byBpdC4KLS9jcC9zL15cKFsgCV0qXCljcCAvXDFEdXBsaWNhdGUgLWQgLXkgLwotIyBDaGFuZ2UgbXYgdG8gUmVuYW1lLgotL212L3MvXlwoWyAJXSpcKW12IC9cMVJlbmFtZSAteSAvCi0vUmVuYW1lL3MvXlwoWyAJXSpcKVJlbmFtZSAteSAtZi9cMVJlbmFtZSAteS8KLSMgQ2hhbmdlIHJtIHRvIERlbGV0ZS4KLS9ybSAtcmYvcy9eXChbIAldKlwpcm0gLXJmIC9cMURlbGV0ZSAtaSAteSAvCi0vcm0gLWYvcy9eXChbIAldKlwpcm0gLWYgL1wxRGVsZXRlIC1pIC15IC8KLS9ybS9zL15cKFsgCV0qXClybSAvXDFEZWxldGUgLWkgLXkgLwotIyBOb3RlIHRoYXQgd2UgZG9uJ3QgbWVzcyB3aXRoIGxuIC0gZGlyZWN0b3J5LXNwZWNpZmljIHNjcmlwdHMKLSMgbXVzdCBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHN5bWxpbmtzLgotIyBDaGFuZ2UgY2F0IHRvIENhdGVuYXRlLgotL2NhdC9zL15cKFsgCV0qXCljYXQgL1wxQ2F0ZW5hdGUgLwotIyBDaGFuZ2UgdG91Y2ggdG8gbXB3LXRvdWNoLgotL3RvdWNoL3MvXlwoWyAJXSpcKXRvdWNoIC9cMW1wdy10b3VjaCAvCi0jIENoYW5nZSBta2RpciB0byBOZXdGb2xkZXIuCi0vbWtkaXIvcy9eXChbIAldKlwpbWtkaXIgL1wxTmV3Rm9sZGVyIC8KLSMgQ2hhbmdlIHZhciBzZXR0aW5nIHRvIFNldC4KLS89L3MvXlwoWyAJXSpcKVwoWy1hLXpBLVowLTlfXSpcKT1cKFteO10qXCk7IFxcT3B0aW9uLWQvXDFTZXQgXDIgXDMvCi0KLSMgQ2hhbmdlIHRlc3RzLgotL2lmIC9zL2lmIFxbICotZiBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgIT0gIiIvCi0vaWYgL3MvaWYgXFsgKi1mIFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiAhPSAiIi8KLS9pZiAvcy9pZiBcWyAhICotZiBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgPT0gIiIvCi0vaWYgL3MvaWYgXFsgISAqLWYgXChbXiBdKlwpIF0gKjsgKnRoZW4gXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgPT0gIiIvCi0KLS9pZiAvcy9pZiBcWyAqLWQgXChbXiBdKlwpIF0gKjsgKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiICE9ICIiLwotL2lmIC9zL2lmIFxbICotZCBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgIT0gIiIvCi0vaWYgL3MvaWYgXFsgISAqLWQgXChbXiBdKlwpIF0gKjsgKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiID09ICIiLwotL2lmIC9zL2lmIFxbICEgKi1kIFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiA9PSAiIi8KLQotL2lmIC9zL2lmIFxbIC1kIFwoW14gXSpcKSBdICo7IHRoZW4gdHJ1ZSAqOyBlbHNlIG1rZGlyIFwoW14gO10qXCkgKjsgZmkvSWYgImBFeGlzdHMgIlwxImAiICE9ICIiIE5ld0ZvbGRlciBcMiBFbmQgSWYvCi0KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgPSBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiXDEiID09ICJcMiIvCi0vaWYgL3MvaWYgXFsgXChbXiBdKlwpID0gXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgIlwxIiA9PSAiXDIiLwotCi0vaWYgL3MvaWYgXFsgXChbXiBdKlwpICE9IFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJcMSIgIT0gIlwyIi8KLS9pZiAvcy9pZiBcWyBcKFteIF0qXCkgIT0gXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgIlwxIiAhPSAiXDIiLwotCi0vaWYgL3MvaWYgXFsgXChbXiBdKlwpIC1lcSBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiXDEiICE9ICJcMiIvCi0vaWYgL3MvaWYgXFsgXChbXiBdKlwpIC1lcSBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiXDEiICE9ICJcMiIvCi0KLS9eWyAJXSplbHNlIHRydWUkL2NcCi0JRWxzZVwKLQkJbXB3LXRydWVcCi0KLQotL2Vsc2Uvcy9eXChbIAldKlwpZWxzZVsgCV0qJC9cMUVsc2UvCi0vZWxzZS9zL15cKFsgCV0qXCllbHNlWzsgCV0qXFxPcHRpb24tZCQvXDFFbHNlLwotCi0vXlsgCV0qZWxzZVsgCV0qdHJ1ZVsgCV0qJC9jXAotCUVsc2VcCi0JCW1wdy10cnVlCi0KLS9eWyAJXSplbHNlWyAJXSp0cnVlWzsgCV0qZmkkL2NcCi0JRWxzZVwKLQkJbXB3LXRydWVcCi0JRW5kIElmCi0KLS9maS9zL15cKFsgCV0qXClmaSAqJC9cMUVuZC8KLS9maS9zL15cKFsgCV0qXClmaSAqOyAqXFxPcHRpb24tZC9cMUVuZC8KLQotIyBDaGFuZ2UgbG9vcGluZy4KLS9mb3Ivcy9eXChbIAldKlwpZm9yIFwoWy1hLXpBLVowLTlfXSpcKSBpbiBcKFteO10qXCk7ICpkbyAqXFxPcHRpb24tZC9cMUZvciBcMiBJbiBcMy8KLS9eXChbIAldKlwpZG8gKlxcT3B0aW9uLWQvZAotL2RvbmUvcy9eXChbIAldKlwpZG9uZSAqOyAqXFxPcHRpb24tZC9cMUVuZC8KLS9kb25lL3MvXlwoWyAJXSpcKWRvbmUkL1wxRW5kLwotCi0jIFRyYWlsaW5nIHNlbWljb2xvbnMgYW5kIGNvbnRpbnVlZCBsaW5lcyBhcmUgdW5uZWVkZWQgc2ggc3ludGF4LgotLzsgXFxPcHRpb24tZC9zLzsgXFxPcHRpb24tZC8vCi0KLSMgQ2hhbmdlIG1vdmUtaWYtY2hhbmdlIHRvIE1vdmVJZkNoYW5nZS4KLS9tb3ZlLWlmLWNoYW5nZS9zL1woW14gCV0qXCltb3ZlLWlmLWNoYW5nZS9Nb3ZlSWZDaGFuZ2UvZwotCi0jIENoYW5nZSAkKFNIRUxMKSB0byB0aGUgc2NyaXB0IG5hbWUgYnkgaXRzZWxmLgotL1NIRUxML3MvXlwoWyAJXSpcKXtTSEVMTH0gL1wxLwotCi0jIENoYW5nZSBzeW50YXggb2YgZGVmYXVsdCBydWxlIGRlcGVuZGVuY3kuCi0vXlwuY1wuby9zL15cLmNcLm8gXFxPcHRpb24tZiQvLmMubyBcXE9wdGlvbi1mIC5jLwotCi0jIENoYW5nZSBkZWZhdWx0IHJ1bGUncyBhY3Rpb24uCi0ve0NDfSAtYy9zL3tDQ30gLWMgXCguKlwpIFwkPCQve0NDfSBAREFTSF9DX0ZMQUdAIHtEZXBEaXJ9e0RlZmF1bHR9LmMgXDEgQFNFR01FTlRfRkxBRyh7RGVmYXVsdH0pQCAtbyB7VGFyZ0Rpcn17RGVmYXVsdH0uYy5vLwotCi0jIFRoaXMgaXMgcHJldHR5IGRpc2d1c3RpbmcsIGJ1dCBJIGNhbid0IHNlZW0gdG8gZGV0ZWN0IGVtcHR5IHJ1bGVzLgotL09wdGlvbi1mJC9zL09wdGlvbi1mJC9PcHRpb24tZiBfb2xkZXN0L2cKLQotIyBSZW1vdmUgLWMgZnJvbSBleHBsaWNpdCBjb21waWxlciBjYWxscy4gKGJ1dCBzaG91bGQgbm90IGlmIEdDQykKLSMgSGFuZGxlIHRoZSBjYXNlIG9mIGEgc291cmNlIGZpbGUgdGhhdCBpcyAie3h4eH0iZmlsZS5jLgotLyAtYyAvcy97XChbQS1aX10qXClDQ31cKC4qXCkgLWMgXCguKlwpIlwoW14iXSpcKSJcKFstYS16X10qXClcLmMve1wxQ0N9XDIgQERBU0hfQ19GTEFHQCBcMyJcNCJcNS5jIC1vICJ7b30iXDUuYy5vLwotIyBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBzb3VyY2UgZmlsZSB0aGF0IGlzICJ7eHh4fSJkaXI6ZmlsZS5jLgotLyAtYyAvcy97XChbQS1aX10qXClDQ31cKC4qXCkgLWMgXCguKlwpIlwoW14iXSpcKSJcKFstYS16X10qXCk6XChbLWEtel9dKlwpXC5jL3tcMUNDfVwyIEBEQVNIX0NfRkxBR0AgXDMiXDQiXDU6XDYuYyAtbyAie299Ilw2LmMuby8KLQotIyBDaGFuZ2UgbGlua2luZyBjYyB0byBsaW5raW5nIHNlcXVlbmNlLgotLy1vL3MvXlwoWyAJXSpcKXtDQ30gXCguKlwpe1woW0EtWl9dKlwpQ0ZMQUdTfSBcKC4qXCl7TERGTEFHU30gXCguKlwpLW8gXChbXiBdKlwpIFwoLipcKSQvXDF7Q0NfTER9IFwyIHtcM0NGTEFHU30gXDQge0xERkxBR1N9IFw1IC1vIFw2e1BST0dfRVhUfSBcN1wKLVwxe01BS0VQRUZ9IFw2e1BST0dfRVhUfSAtbyBcNiB7TUFLRVBFRl9UT09MX0ZMQUdTfSB7TUFLRVBFRl9GTEFHU31cCi1cMXtSRVp9ICJ7c30iXDYuciAtbyBcNiAtYXBwZW5kIC1kIFBST0dfTkFNRT0nIidcNiciJyAtZCBWRVJTSU9OX1NUUklORz0nIid7dmVyc2lvbn0nIicvCi0vLW8vcy9eXChbIAldKlwpe0NDfSBcKC4qXCl7XChbQS1aX10qXClDRkxBR1N9IFwoLipcKS1vIFwoW14gXSpcKSBcKC4qXCl7TERGTEFHU30gXCguKlwpJC9cMXtDQ19MRH0gXDIge1wzQ0ZMQUdTfSBcNCB7TERGTEFHU30gXDYgLW8gXDV7UFJPR19FWFR9IFw3XAotXDF7TUFLRVBFRn0gXDV7UFJPR19FWFR9IC1vIFw1IHtNQUtFUEVGX1RPT0xfRkxBR1N9IHtNQUtFUEVGX0ZMQUdTfVwKLVwxe1JFWn0gIntzfSJcNS5yIC1vIFw1IC1hcHBlbmQgLWQgUFJPR19OQU1FPSciJ1w1JyInIC1kIFZFUlNJT05fU1RSSU5HPSciJ3t2ZXJzaW9ufSciJy8KLS8tby9zL15cKFsgCV0qXCl7SE9TVF9DQ30gXCguKlwpLW8gXChbXiBdKlwpIFwoLipcKSQvXDF7SE9TVF9DQ19MRH0gXDIgLW8gXDN7UFJPR19FWFR9IFw0XAotXDF7TUFLRVBFRn0gXDN7UFJPR19FWFR9IC1vIFwzIHtNQUtFUEVGX1RPT0xfRkxBR1N9IHtNQUtFUEVGX0ZMQUdTfVwKLVwxe1JFWn0gIntzfSJcMy5yIC1vIFwzIC1hcHBlbmQgLWQgUFJPR19OQU1FPSciJ1wzJyInIC1kIFZFUlNJT05fU1RSSU5HPSciJ3t2ZXJzaW9ufSciJy8KLQotIyBDb21tZW50IG91dCAuTk9FWFBPUlQgcnVsZXMuCi0vXC5OT0VYUE9SVC9zL15cLk5PRVhQT1JULyNcLk5PRVhQT1JULwotIyBDb21tZW50IG91dCAuUEhPTlkgcnVsZXMuCi0vXC5QSE9OWS9zL15cLlBIT05ZLyNcLlBIT05ZLwotIyBDb21tZW50IG91dCAuUFJFQ0lPVVMgcnVsZXMuCi0vXC5QUkVDSU9VUy9zL15cLlBSRUNJT1VTLyNcLlBSRUNJT1VTLwotIyBDb21tZW50IG91dCAuU1VGRklYRVMgcnVsZXMuCi0vXC5TVUZGSVhFUy9zL15cLlNVRkZJWEVTLyNcLlNVRkZJWEVTLwotCi0jIFNldCB0aGUgaW5zdGFsbCBwcm9ncmFtIGFwcHJvcHJpYXRlbHkuCi0vSU5TVEFMTC9zL15JTlNUQUxMICo9ICpgLipgOmluc3RhbGwuc2ggLWMvSU5TVEFMTCA9IER1cGxpY2F0ZSAteS8KLQotIyBEb24ndCB0cnkgdG8gZGVjaWRlIHdoZXRoZXIgdG8gdXNlIHRoZSB0cmVlJ3Mgb3duIHRvb2xzLgotL2Jpc29uL3MvYC4qYmlzb246Ymlzb24uKmAvYmlzb24gLXkvCi0vYnlhY2Mvcy9gLipieWFjYzpieWFjYy4qYC9ieWFjYy8KLS9mbGV4L3MvYC4qZmxleDpmbGV4LipgL2ZsZXgvCi0KLSMgVHVybiB0cmFuc2Zvcm1lZCBDIGNvbW1lbnRzIGluIGVjaG8gY29tbWFuZHMgYmFjayBpbnRvIGNvbW1lbnRzLgotL2VjaG8vcyxlY2hvICdcKC4qXCk6XFxPcHRpb24teFwoLipcKVxcT3B0aW9uLXg6XCguKlwpJyxlY2hvICdcMS8qXDIqL1wzJywKLQotIyBXaGFjayBvdXQgdmFyaW91cyBjbGV2ZXIgZXhwcmVzc2lvbnMgdGhhdCBzZWFyY2ggZm9yIHRvb2xzLCBzaW5jZQotIyB0aGUgY2xldmVyIGNvZGUgaXMgdG9vIC9iaW4vc2ggc3BlY2lmaWMuCi0KLS9eQVJfRk9SX1RBUkdFVCA9IGAvLC9gJC9jXAotQVJfRk9SX1RBUkdFVCA9IDo6YmludXRpbHM6YXJcCi0KLQotL15SQU5MSUJfRk9SX1RBUkdFVCA9IGAvLC9gJC9jXAotUkFOTElCX0ZPUl9UQVJHRVQgPSA6OmJpbnV0aWxzOnJhbmxpYlwKLQotCi0vXlJBTkxJQl9URVNUX0ZPUl9UQVJHRVQgPSAvLC9yYW5saWIgXSApJC9jXAotUkFOTElCX1RFU1RfRk9SX1RBUkdFVCA9IFwKLQotCi0vXkVYUEVDVCA9IGAvLC9gJC9jXAotRVhQRUNUID0gXAotCi0KLS9eUlVOVEVTVCA9IGAvLC9gJC9jXAotUlVOVEVTVCA9IFwKLQotCi0vXkNDX0ZPUl9UQVJHRVQgPSBgLywvYCQvY1wKLUNDX0ZPUl9UQVJHRVQgPSBcCi0KLQotL15DWFhfRk9SX1RBUkdFVCA9IGAvLC9gJC9jXAotQ1hYX0ZPUl9UQVJHRVQgPSBcCi0KLQotL15DSElMTF9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1DSElMTF9GT1JfVEFSR0VUID0gXAotCi0KLS9eQ0hJTExfTElCID0gYC8sL2AkL2NcCi1DSElMTF9MSUIgPSBcCi0KLS9zYW5pdC9zL3tzdGFydC1zYW5pdC4uLi1bYS16MC05XSp9Ly8KLS9zYW5pdC9zL3tlbmQtc2FuaXQuLi4tW2EtejAtOV0qfS8vCi0KLSMgQWRkIHN0YW5kYXJkIGRlZmluZXMgYW5kIGRlZmF1bHQgcnVsZXMuCi0vXiMgc3JjZGlyL2FcCi1cCi1zID0gIntzcmNkaXJ9IlwKLVwKLW8gPSA6XAotXAotIntvfSIgXFxPcHRpb24tZiA6ICJ7c30iCi0KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvbXB3LXRvdWNoIGIvY29uZmlnL21wdy9tcHctdG91Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDNhNTEuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9tcHctdG91Y2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgIlRvdWNoIiBjb21tYW5kLgotCi1JZiAiYEV4aXN0cyAiezF9ImAiICE9ICIiCi0JU2V0RmlsZSAtbSAuICJ7MX0iCi1FbHNlCi0JRWNobyAnICcgPiAiezF9IgotRW5kIElmCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L21wdy10cnVlIGIvY29uZmlnL21wdy9tcHctdHJ1ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUwNjUzMC4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L21wdy10cnVlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRXhpdCAwCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L251bGwtY29tbWFuZCBiL2NvbmZpZy9tcHcvbnVsbC1jb21tYW5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODQ0YzhlLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvbnVsbC1jb21tYW5kCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBUaGlzIGNvbW1hbmQgZG9lcyBub3RoaW5nLgpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9vcGVuLWJyYWNlIGIvY29uZmlnL21wdy9vcGVuLWJyYWNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODQ2NWRjLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvb3Blbi1icmFjZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBNUFcgbWFrZWZpbGVzIHNlZW0gbm90IHRvIGhhdmUgYW55IHdheSB0byBnZXQgYSBsaXRlcmFsIG9wZW4KLSMgYnJhY2UgaW50byBhIHJ1bGUgYW55d2hlcmUsIHNvIHRoaXMgZG9lcyB0aGUgam9iLgotCi1FY2hvICd7JwpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy90ci03dG84LXNyYyBiL2NvbmZpZy9tcHcvdHItN3RvOC1zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMGI2NDkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy90ci03dG84LXNyYworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotU3RyZWFtRWRpdCAtZSBcT3B0aW9uLWQKLSAgJy9cT3B0aW9uLXgvIFxPcHRpb24tZAotICAgIFJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tZC8gIlxPcHRpb24tZFxPcHRpb24tZCIgLWMgXE9wdGlvbi01IDsgXE9wdGlvbi1kCi0gICAgUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi1mLyAiXE9wdGlvbi1kXE9wdGlvbi1mIiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKLQlSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLTgvICJcT3B0aW9uLWRcT3B0aW9uLTgiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAotCVJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tNS8gIlxPcHRpb24tZFxPcHRpb24tNSIgLWMgXE9wdGlvbi01IDsgXE9wdGlvbi1kCi0JUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi14LyAiXE9wdGlvbi1kXE9wdGlvbi14IiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKLQlSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLXIvICJcT3B0aW9uLWRcT3B0aW9uLXIiIC1jIFxPcHRpb24tNScgIFxPcHRpb24tZAotICAiezF9IgpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy90cnVlIGIvY29uZmlnL21wdy90cnVlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTA2NTMwLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvdHJ1ZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUV4aXQgMApkaWZmIC0tZ2l0IGEvY29uZmlnL210LWFybXBpYyBiL2NvbmZpZy9tdC1hcm1waWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjhjOWUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LWFybXBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LWQzMHYgYi9jb25maWcvbXQtZDMwdgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0Yjc3NC4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtZDMwdgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBCdWlsZCBsaWJyYXJpZXMgb3B0aW1pemluZyBmb3Igc3BhY2UsIG5vdCBzcGVlZC4KLSMgVHVybiBvZmYgd2FybmluZ3MgYWJvdXQgc3ltYm9scyBuYW1lZCB0aGUgc2FtZSBhcyByZWdpc3RlcnMKLSBDRkxBR1NfRk9SX1RBUkdFVCA9IC1nIC1PcyAtV2EsLUMKLSBDWFhGTEFHU19GT1JfVEFSR0VUID0gLWcgLU9zIC1XYSwtQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LWVsZmFscGhhcGljIGIvY29uZmlnL210LWVsZmFscGhhcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI4YzllLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1lbGZhbHBoYXBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LWxpbnV4IGIvY29uZmlnL210LWxpbnV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDllNmYxLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1saW51eAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBXaGVuIHVzaW5nIGdsaWJjIDIgb24gTGludXggd2UgbXVzdCBhbHdheXMgdXNlIHZ0YWJsZSB0aHVua3MuCi1DWFhGTEFHU19GT1JfVEFSR0VUID0gJChDWFhGTEFHUykgLWZ2dGFibGUtdGh1bmtzIC1EX0dOVV9TT1VSQ0UKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1tNjhrcGljIGIvY29uZmlnL210LW02OGtwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOTg3MjcuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LW02OGtwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9LWZwaWMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1uZXR3YXJlIGIvY29uZmlnL210LW5ldHdhcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ODJmOWIuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LW5ldHdhcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1HREJfTkxNX0RFUFMgPSBhbGwtZ2NjIGFsbC1sZApkaWZmIC0tZ2l0IGEvY29uZmlnL210LW9zcGFjZSBiL2NvbmZpZy9tdC1vc3BhY2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDkxMDQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LW9zcGFjZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBCdWlsZCBsaWJyYXJpZXMgb3B0aW1pemluZyBmb3Igc3BhY2UsIG5vdCBzcGVlZC4KLSBDRkxBR1NfRk9SX1RBUkdFVCA9IC1nIC1PcwotIENYWEZMQUdTX0ZPUl9UQVJHRVQgPSAtZyAtT3MKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1wYXBpYyBiL2NvbmZpZy9tdC1wYXBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViOGM5ZS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtcGFwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1wcGNwaWMgYi9jb25maWcvbXQtcHBjcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI4YzllLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1wcGNwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1zcGFyY3BpYyBiL2NvbmZpZy9tdC1zcGFyY3BpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwZWMyNy4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtc3BhcmNwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9YGNhc2UgIiR7TElCQ0ZMQUdTfSAke0xJQkNYWEZMQUdTfSIgaW4gKi1mcGljKiApIGVjaG8gLWZwaWMgOzsgKiApIGVjaG8gLWZQSUMgOzsgZXNhY2AKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC12ODEwIGIvY29uZmlnL210LXY4MTAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZGE2YzIuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LXY4MTAKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUNDX0ZPUl9UQVJHRVQgPSBjYTczMiAtYW5zaQotQVNfRk9SX1RBUkdFVCA9IGFzNzMyCi1BUl9GT1JfVEFSR0VUID0gYXI3MzIKLVJBTkxJQl9GT1JfVEFSR0VUID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXg4NnBpYyBiL2NvbmZpZy9tdC14ODZwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOTg3MjcuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LXg4NnBpYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVBJQ0ZMQUdfRk9SX1RBUkdFVD0tZnBpYwpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYzdiNjUwLi4wMDAwMDAwCi0tLSBhL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDE1OTggKzAsMCBAQAotIyEvYmluL3NoCi0KLSMjIyBXQVJOSU5HOiB0aGlzIGZpbGUgY29udGFpbnMgZW1iZWRkZWQgdGFicy4gIERvIG5vdCBydW4gdW50YWJpZnkgb24gdGhpcyBmaWxlLgotCi0jIENvbmZpZ3VyYXRpb24gc2NyaXB0Ci0jIENvcHlyaWdodCAoQykgMTk4OCwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSy4gUmljaGFyZCBQaXhsZXkuCi0KLSMKLSMgU2hlbGwgc2NyaXB0IHRvIGNyZWF0ZSBwcm9wZXIgbGlua3MgdG8gbWFjaGluZS1kZXBlbmRlbnQgZmlsZXMgaW4KLSMgcHJlcGFyYXRpb24gZm9yIGNvbXBpbGF0aW9uLgotIwotIyBJZiBjb25maWd1cmUgc3VjY2VlZHMsIGl0IGxlYXZlcyBpdHMgc3RhdHVzIGluIGNvbmZpZy5zdGF0dXMuCi0jIElmIGNvbmZpZ3VyZSBmYWlscyBhZnRlciBkaXN0dXJiaW5nIHRoZSBzdGF0dXMgcXVvLCAKLSMgICAgICAgY29uZmlnLnN0YXR1cyBpcyByZW1vdmVkLgotIwotCi1leHBvcnQgUEFUSCB8fCAoZWNobyAiT09QUywgdGhpcyBpc24ndCBzaC4gIERlc3BlcmF0aW9uIHRpbWUuICBJIHdpbGwgZmVlZCBteXNlbGYgdG8gc2guIjsgc2ggJDAgJGFyZ3Y7IGtpbGwgJCQpCi0KLXJlbW92ZT1ybQotaGFyZF9saW5rPWxuCi1zeW1ib2xpY19saW5rPSdsbiAtcycKLQotI2ZvciBUZXN0Ci0jcmVtb3ZlPSJlY2hvIHJtIgotI2hhcmRfbGluaz0iZWNobyBsbiIKLSNzeW1ib2xpY19saW5rPSJlY2hvIGxuIC1zIgotCi0jIGNsZWFyIHNvbWUgdGhpbmdzIHBvdGVudGlhbGx5IGluaGVyaXRlZCBmcm9tIGVudmlyb25tZW50LgotCi1NYWtlZmlsZT1NYWtlZmlsZQotTWFrZWZpbGVfaW49TWFrZWZpbGUuaW4KLWFyZ3VtZW50cz0KLWJ1aWxkX2FsaWFzPQotY2FjaGVfZmlsZT1jb25maWcuY2FjaGUKLWNhY2hlX2ZpbGVfb3B0aW9uPQotY29uZmlnZGlycz0KLWV4dHJhY29uZmlnZGlycz0KLWRpcm9wdGlvbnM9Ci1leGVjX3ByZWZpeD0KLWV4ZWNfcHJlZml4b3B0aW9uPQotZmF0YWw9Ci1mbG9hdGluZ19wb2ludD1kZWZhdWx0Ci1nYXM9ZGVmYXVsdAotZ2NjX3ZlcnNpb249Ci1nY2NfdmVyc2lvbl90cmlnZ2VyPQotaG9zdF9hbGlhcz1OT0hPU1QKLWhvc3RfbWFrZWZpbGVfZnJhZz0KLW1vdmVpZmNoYW5nZT0KLW5vcmVjdXJzaW9uPQotb3RoZXJfb3B0aW9ucz0KLXBhY2thZ2VfbWFrZWZpbGVfZnJhZz0KLXBhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZz0KLXByZWZpeD0vdXNyL2xvY2FsCi1wcm9nbmFtZT0KLXByb2dyYW1fcHJlZml4PQotcHJvZ3JhbV9wcmVmaXhvcHRpb249Ci1wcm9ncmFtX3N1ZmZpeD0KLXByb2dyYW1fc3VmZml4b3B0aW9uPQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLXByb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb249Ci1yZWRpcmVjdD0KLXJlbW92aW5nPQotc2l0ZT0KLXNpdGVfbWFrZWZpbGVfZnJhZz0KLXNpdGVfb3B0aW9uPQotc3JjZGlyPQotc3JjdHJpZ2dlcj0KLXN1YmRpcnM9Ci10YXJnZXRfYWxpYXM9Tk9UQVJHRVQKLXRhcmdldF9tYWtlZmlsZV9mcmFnPQotdW5kZWZzPU5PVU5ERUZTCi12ZXJzaW9uPSIkUmV2aXNpb24kIgoteDExPWRlZmF1bHQKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIyMgd2UgbWlnaHQgbmVlZCB0byB1c2Ugc29tZSBvdGhlciBzaGVsbCB0aGFuIC9iaW4vc2ggZm9yIHJ1bm5pbmcgc3Vic2hlbGxzCi0KLSMjIyBJZiB3ZSBhcmUgb24gV2luZG93cywgc2VhcmNoIGZvciB0aGUgc2hlbGwuICBUaGlzIHdpbGwgcGVybWl0IHBlb3BsZQotIyMjIHRvIG5vdCBoYXZlIC9iaW4vc2gsIGJ1dCB0byBiZSBhYmxlIHRvIHNlZSAvU09NRS9QQVRIL3NoIGNvbmZpZ3VyZQotIyMjIHdpdGhvdXQgYWxzbyBoYXZpbmcgdG8gc2V0IENPTkZJR19TSEVMTC4gIFRoaXMgY29kZSB3aWxsIHdvcmsgd2hlbgotIyMjIHVzaW5nIGJhc2gsIHdoaWNoIHNldHMgT1NUWVBFLgotY2FzZSAiJHtPU1RZUEV9IiBpbgotKndpbjMyKikKLSAgaWYgWyB4JHtDT05GSUdfU0hFTEx9ID0geCBdOyB0aGVuCi0gICAgaWYgWyAhIC1mIC9iaW4vc2ggXTsgdGhlbgotICAgICAgaWYgWyB4JHtTSEVMTH0gIT0geCBdICYmIFsgLWYgJHtTSEVMTH0gXTsgdGhlbgotCUNPTkZJR19TSEVMTD0ke1NIRUxMfQotCWV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgIGVsc2UKLQlmb3IgcHJvZyBpbiBzaCBzaC5leGUgYmFzaCBiYXNoLmV4ZTsgZG8KLQkgIElGUz0iJHtJRlM9CX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLQkgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0JICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0JICAgIGlmIHRlc3QgLWYgJGRpci8kcHJvZzsgdGhlbgotCSAgICAgIENPTkZJR19TSEVMTD0kZGlyLyRwcm9nCi0JICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotCSAgICAgIGJyZWFrCi0JICAgIGZpCi0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgIHRlc3QgLW4gIiR7Q09ORklHX1NIRUxMfSIgJiYgYnJlYWsKLQlkb25lCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLWNvbmZpZ19zaGVsbD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotCi1OT19FRElUPSJUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gIERvIG5vdCBlZGl0LiIKLQotIyMgdGhpcyBpcyBhIGxpdHRsZSB0b3VjaHkgYW5kIHdvbid0IGFsd2F5cyB3b3JrLCBidXQuLi4KLSMjCi0jIyBpZiB0aGUgYXJndlswXSBzdGFydHMgd2l0aCBhIHNsYXNoIHRoZW4gaXQgaXMgYW4gYWJzb2x1dGUgbmFtZSB0aGF0IGNhbiAoYW5kCi0jIyBtdXN0KSBiZSB1c2VkIGFzIGlzLgotIyMKLSMjIG90aGVyd2lzZSwgaWYgYXJndlswXSBoYXMgbm8gc2xhc2ggaW4gaXQsIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyBvbiB0aGUKLSMjIHBhdGguICBTaW5jZSBQQVRIIG1pZ2h0IGluY2x1ZGUgIi4iIHdlIGFsc28gYWRkIGBwd2RgIHRvIHRoZSBlbmQgb2YgUEFUSC4KLSMjCi0KLXByb2duYW1lPSQwCi0jIGlmIFBXRCBhbHJlYWR5IGhhcyBhIHZhbHVlLCBpdCBpcyBwcm9iYWJseSB3cm9uZy4KLWlmIFsgLW4gIiRQV0QiIF07IHRoZW4gUFdEPWBwd2RgOyBmaQotCi1jYXNlICIke3Byb2duYW1lfSIgaW4KLS8qKSA7OwotKi8qKSA7OwotKikKLSAgICAgICAgUEFUSD0kUEFUSDoke1BXRD1gcHdkYH0gOyBleHBvcnQgUEFUSAotICAgICAgICA7OwotZXNhYwotCi0jIExvb3Agb3ZlciBhbGwgYXJncwotCi13aGlsZSA6Ci1kbwotCi0jIEJyZWFrIG91dCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBhcmdzCi0JY2FzZSAkIyBpbgotCTApCi0JCWJyZWFrCi0JCTs7Ci0JZXNhYwotCi0jIEdldCB0aGUgZmlyc3QgYXJnLCBhbmQgc2h1ZmZsZQotCW9wdGlvbj0kMQotCXNoaWZ0Ci0KLSMgTWFrZSBhbGwgb3B0aW9ucyBoYXZlIHR3byBoeXBoZW5zCi0Jb3JpZ19vcHRpb249JG9wdGlvbgkjIFNhdmUgb3JpZ2luYWwgZm9yIGVycm9yIG1lc3NhZ2VzCi0JY2FzZSAkb3B0aW9uIGluCi0JLS0qKSA7OwotCS0qKSBvcHRpb249LSRvcHRpb24gOzsKLQllc2FjCi0JCQotIyBTcGxpdCBvdXQgdGhlIGFyZ3VtZW50IGZvciBvcHRpb25zIHRoYXQgdGFrZSB0aGVtCi0JY2FzZSAkb3B0aW9uIGluCi0JLS0qPSopCi0JCW9wdGFyZz1gZWNobyAkb3B0aW9uIHwgc2VkIC1lICdzL15bXj1dKj0vLydgCi0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uIgotCQk7OwotIyBUaGVzZSBvcHRpb25zIGhhdmUgbWFuZGF0b3J5IHZhbHVlcy4gIFNpbmNlIHdlIGRpZG4ndCBmaW5kIGFuID0gc2lnbiwKLSMgdGhlIHZhbHVlIG11c3QgYmUgaW4gdGhlIG5leHQgYXJndW1lbnQKLQktLWJ1KiB8IC0tY2FjaGUqIHwgLS1leCogfCAtLWhvKiB8IC0tcHJlKiB8IC0tcHJvZ3JhbS1wKiB8IC0tcHJvZ3JhbS1zKiB8IC0tcHJvZ3JhbS10KiB8IC0tc2kqIHwgLS1zciogfCAtLXRhKiB8IC0tdG0qIHwgLS14LSogfCAtLWJpKiB8IC0tc2IqIHwgLS1saSogfCAtLWRhKiB8IC0tc3kqIHwgLS1zaCogfCAtLWxvKiB8IC0taW4qIHwgLS1vbCogfCAtLW1hKikKLQkJb3B0YXJnPSQxCi0JCXNoaWZ0Ci0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uPSRvcHRhcmciCi0JCTs7Ci0JLS12KQotCQlhcmd1bWVudHM9IiRhcmd1bWVudHMgLXYiCi0JCTs7Ci0JLS0qKQotCQlhcmd1bWVudHM9IiRhcmd1bWVudHMgJG9wdGlvbiIKLQkJOzsKLQllc2FjCi0KLSMgTm93LCBwcm9jZXNzIHRoZSBvcHRpb25zCi0JY2FzZSAkb3B0aW9uIGluCi0KLQktLWJpKikKLQkJYmluZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1iaW5kaXI9JG9wdGFyZyIKLQkJOzsKLQktLWJ1aWxkKiB8IC0tYnUqKQotCQljYXNlICIkYnVpbGRfYWxpYXMiIGluCi0JCSIiKSBidWlsZF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgYnVpbGQgbWFjaGluZSBhdCBhIHRpbWUuICAxPiYyCi0JCSAgIGZhdGFsPXllcwotCQkgICA7OwotCQllc2FjCi0JCTs7Ci0JLS1jYWNoZSopCi0JCWNhY2hlX2ZpbGU9JG9wdGFyZwotCQk7OwotCS0tZGEqKQotCQlkYXRhZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1kYXRhZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1kaXNhYmxlLSopCi0JCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tZGlzYWJsZS06ZW5hYmxlXzo7czotOl86ZydgCi0JCWV2YWwgJGVuYWJsZW9wdD1ubwotCQlkaXNhYmxlb3B0aW9ucz0iJGRpc2FibGVvcHRpb25zICRvcHRpb24iCi0JCTs7Ci0JLS1lbmFibGUtKikKLQkJY2FzZSAiJG9wdGlvbiIgaW4KLQkJKj0qKQk7OwotCQkqKQlvcHRhcmc9eWVzIDs7Ci0JCWVzYWMKLQotCQllbmFibGVvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6PS4qJDo6O3M6LTpfOmcnYAotCQlldmFsICIkZW5hYmxlb3B0PSckb3B0YXJnJyIKLQkJZW5hYmxlb3B0aW9ucz0iJGVuYWJsZW9wdGlvbnMgJyRvcHRpb24nIgotCQk7OwotCS0tZXhlYy1wcmVmaXgqIHwgLS1leCopCi0JCWV4ZWNfcHJlZml4PSRvcHRhcmcKLQkJZXhlY19wcmVmaXhvcHRpb249Ii0tZXhlYy1wcmVmaXg9JG9wdGFyZyIKLQkJOzsKLQktLWdhcyB8IC0tZyopCi0JCWdhcz15ZXMKLQkJOzsKLQktLWhlbHAgfCAtLWhlKikKLQkJZmF0YWw9eWVzCi0JCTs7Ci0JLS1ob3N0KiB8IC0taG8qKQotCQljYXNlICRob3N0X2FsaWFzIGluCi0JCU5PSE9TVCkgaG9zdF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhdCBhIHRpbWUuICAxPiYyCi0JCSAgIGZhdGFsPXllcwotCQkgICA7OwotCQllc2FjCi0JCTs7Ci0JLS1pbmMqKQotCQlpbmNsdWRlZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1pbmNsdWRlZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1pbmYqKQotCQlpbmZvZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1pbmZvZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1saWJkKikKLQkJbGliZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1saWJkaXI9JG9wdGFyZyIKLQkJOzsKLQktLWxpYmUqKQotCQlsaWJleGVjZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1saWJleGVjZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1sbyopCi0JCWxvY2Fsc3RhdGVkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWxvY2Fsc3RhdGVkaXI9JG9wdGFyZyIKLQkJOzsKLQktLW1hKikKLQkJbWFuZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1tYW5kaXI9JG9wdGFyZyIKLQkJOzsKLQktLW5mcCB8IC0tbmYqKQotCQlmbG9hdGluZ19wb2ludD1ubwotCQlmbG9hdGluZ19wb2ludG9wdGlvbj0iLS1uZnAiCi0JCTs7Ci0JLS1ub3JlY3Vyc2lvbiB8IC0tbm8qKQotCQlub3JlY3Vyc2lvbj15ZXMKLQkJOzsKLQktLW9sKikKLQkJb2xkaW5jbHVkZWRpcj0kb3B0YXJnCi0JCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tb2xkaW5jbHVkZWRpcj0kb3B0YXJnIgotCQk7OwotCS0tcHJlZml4KiB8IC0tcHJlKikKLQkJcHJlZml4PSRvcHRhcmcKLQkJcHJlZml4b3B0aW9uPSItLXByZWZpeD0kb3B0YXJnIgotCQk7OwotCS0tcHJvZ3JhbS1wcmVmaXgqIHwgLS1wcm9ncmFtLXAqKQotCQlwcm9ncmFtX3ByZWZpeD0kb3B0YXJnCi0JCXByb2dyYW1fcHJlZml4b3B0aW9uPSItLXByb2dyYW0tcHJlZml4PSRvcHRhcmciCi0JCTs7Ci0JLS1wcm9ncmFtLXN1ZmZpeCogfCAtLXByb2dyYW0tcyopCi0JCXByb2dyYW1fc3VmZml4PSRvcHRhcmcKLQkJcHJvZ3JhbV9zdWZmaXhvcHRpb249Ii0tcHJvZ3JhbS1zdWZmaXg9JG9wdGFyZyIKLQkJOzsKLQktLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUqIHwgLS1wcm9ncmFtLXQqKQotCQkjIERvdWJsZSBhbnkgYmFja3NsYXNoZXMgb3IgZG9sbGFyIHNpZ25zIGluIHRoZSBhcmd1bWVudAotCQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9IC1lIGBlY2hvICR7b3B0YXJnfSB8IHNlZCAtZSAncy9cXFxcL1xcXFxcXFxcL2cnIC1lICdzL1xcXCQvJCQvZydgIgotCQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9uPSIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb259IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0nJG9wdGFyZyciCi0JCTs7Ci0JLS1ybSkKLQkJcmVtb3Zpbmc9LS1ybQotCQk7OwotCS0tc2IqKQotCQlzYmluZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zYmluZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1zaCopCi0JCXNoYXJlZHN0YXRlZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zaGFyZWRzdGF0ZWRpcj0kb3B0YXJnIgotCQk7OwotCS0tc2lsZW50IHwgLS1zaWwqIHwgLS1xdWlldCB8IC0tcSopCi0JCXJlZGlyZWN0PSI+L2Rldi9udWxsIgotCQl2ZXJib3NlPS0tc2lsZW50Ci0JCTs7Ci0JLS1zaXRlKiB8IC0tc2l0KikKLQkJc2l0ZT0kb3B0YXJnCi0JCXNpdGVfb3B0aW9uPSItLXNpdGU9JG9wdGFyZyIKLQkJOzsKLQktLXNyY2RpciovIHwgLS1zciovKQotICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuICBPdGhlcndpc2UsIHdoZW4gdGhlIGZpbGUgbmFtZSBnZXRzCi0gICAgICAgICAgICAgICAgIyBib2x0ZWQgaW50byBhbiBvYmplY3QgZmlsZSBhcyBkZWJ1ZyBpbmZvLCBpdCBoYXMgdHdvIHNsYXNoZXMKLSAgICAgICAgICAgICAgICAjIGluIGl0LiAgT3JkaW5hcmlseSB0aGlzIGlzIG9rLCBidXQgZW1hY3MgdGFrZXMgZG91YmxlIHNsYXNoCi0gICAgICAgICAgICAgICAgIyB0byBtZWFuICJmb3JnZXQgdGhlIGZpcnN0IHBhcnQiLgotCQlzcmNkaXI9YGVjaG8gJG9wdGFyZyB8IHNlZCAtZSAnczovJDo6J2AKLQkJOzsKLQktLXNyY2RpciogfCAtLXNyKikKLQkJc3JjZGlyPSRvcHRhcmcKLQkJOzsKLQktLXN5KikKLQkJc3lzY29uZmRpcj0kb3B0YXJnCi0JCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tc3lzY29uZmRpcj0kb3B0YXJnIgotCQk7OwotCS0tdGFyZ2V0KiB8IC0tdGEqKQotCQljYXNlICR0YXJnZXRfYWxpYXMgaW4KLQkJTk9UQVJHRVQpIHRhcmdldF9hbGlhcz0kb3B0YXJnIDs7Ci0JCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQktLXRtcGRpciogfCAtLXRtKikKLQkJVE1QRElSPSRvcHRhcmcKLQkJdG1wZGlyb3B0aW9uPSItLXRtcGRpcj0kb3B0YXJnIgotCQk7OwotCS0tdmVyYm9zZSB8IC0tdiB8IC0tdmVyYiopCi0JCXJlZGlyZWN0PQotCQl2ZXJib3NlPS0tdmVyYm9zZQotCQk7OwotCS0tdmVyc2lvbiB8IC0tViB8IC0tdmVycyopCi0JCWVjaG8gIlRoaXMgaXMgQ3lnbnVzIENvbmZpZ3VyZSB2ZXJzaW9uIiBgZWNobyAke3ZlcnNpb259IHwgc2VkICdzL1sgJDpdLy9nJ2AKLQkJZXhpdCAwCi0JCTs7Ci0JLS13aXRoLSopCi0JCWNhc2UgIiRvcHRpb24iIGluCi0JCSo9KikJOzsKLQkJKikJb3B0YXJnPXllcyA7OwotCQllc2FjCi0KLQkJd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCi0JCWV2YWwgJHdpdGhvcHQ9IiRvcHRhcmciCi0JCXdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgJG9wdGlvbiIKLQkJOzsKLQktLXdpdGhvdXQtKikKLQkJd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czpvdXQ6OjtzOi06XzpnJ2AKLQkJZXZhbCAkd2l0aG9wdD1ubwotCQl3aXRob3V0b3B0aW9ucz0iJHdpdGhvdXRvcHRpb25zICRvcHRpb24iCi0JCTs7Ci0JLS14KQl3aXRoX3g9eWVzCi0JCXdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLXgiCi0JCTs7Ci0JLS14LWkqIHwgLS14LWwqKSBvdGhlcl9vcHRpb25zPSIkb3RoZXJfb3B0aW9ucyAkb3JpZ19vcHRpb24iCi0JCTs7Ci0JLS0qKQotCQllY2hvICJjb25maWd1cmU6IFVucmVjb2duaXplZCBvcHRpb246IFwiJG9yaWdfb3B0aW9uXCI7IHVzZSAtLWhlbHAgZm9yIHVzYWdlLiIgPiYyCi0JCWV4aXQgMQotCQk7OwotCSopCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykgdW5kZWZzPSRvcHRpb24gOzsKLQkJKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQllc2FjCi1kb25lCi0KLSMgcHJvY2VzcyBob3N0IGFuZCB0YXJnZXQKLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIFVOREVGUwotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlbid0IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgdW5kZWZzIGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gdW5kZWZzLgotIyAzLiBJZiB1bmRlZnMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgZGVmYXVsdHMgdG8gdW5kZWZzLgotIyA1LiBJZiB1bmRlZnMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgZGVmYXVsdHMgdG8gaG9zdC4KLQotY2FzZSAiJHtmYXRhbH0iIGluCi0iIikKLQkjIE1ha2Ugc3VyZSB0aGF0IGhvc3QsIHRhcmdldCAmIHVuZGVmcyBhcmVuJ3QgYWxsIHNwZWNpZmllZCBhdCB0aGUKLQkjIHNhbWUgdGltZS4KLQljYXNlICRob3N0X2FsaWFzLS0tJHRhcmdldF9hbGlhcy0tLSR1bmRlZnMgaW4KLQlOT0hPU1QtLS0qLS0tKiB8ICotLS1OT1RBUkdFVC0tLSogfCAqLS0tKi0tLU5PVU5ERUZTKQotCQk7OwotCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUuICAxPiYyCi0JICAgZmF0YWw9eWVzCi0JICAgYnJlYWsgMgotCQk7OwotCWVzYWMKLQotCSMgTm93LCBkbyBkZWZhdWx0aW5nIGZvciBob3N0LgotCWNhc2UgJGhvc3RfYWxpYXMgaW4KLQlOT0hPU1QpCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykKLQkJCSMgTmVpdGhlciAtLWhvc3Qgb3B0aW9uIG5vciB1bmRlZnMgd2VyZSBwcmVzZW50LgotCQkJIyBDYWxsIGNvbmZpZy5ndWVzcy4KLQkJCWd1ZXNzc3lzPWBlY2hvICR7cHJvZ25hbWV9IHwgc2VkICdzL2NvbmZpZ3VyZSQvY29uZmlnLmd1ZXNzLydgCi0JCQlpZiBob3N0X2FsaWFzPWAke2NvbmZpZ19zaGVsbH0gJHtndWVzc3N5c31gCi0JCQl0aGVuCi0JCQkJIyBJZiB0aGUgc3RyaW5nIHdlIGFyZSBnb2luZyB0byB1c2UgZm9yCi0JCQkJIyB0aGUgdGFyZ2V0IGlzIGEgcHJlZml4IG9mIHRoZSBzdHJpbmcKLQkJCQkjIHdlIGp1c3QgZ3Vlc3NlZCBmb3IgdGhlIGhvc3QsIHRoZW4KLQkJCQkjIGFzc3VtZSB3ZSBhcmUgcnVubmluZyBuYXRpdmUsIGFuZCBmb3JjZQotCQkJCSMgdGhlIHNhbWUgc3RyaW5nIGZvciBib3RoIHRhcmdldCBhbmQgaG9zdC4KLQkJCQljYXNlICR0YXJnZXRfYWxpYXMgaW4KLQkJCQlOT1RBUkdFVCkgOzsKLQkJCQkqKQotCQkJCQlpZiBleHByICRob3N0X2FsaWFzIDogJHRhcmdldF9hbGlhcyA+L2Rldi9udWxsCi0JCQkJCXRoZW4KLQkJCQkJCWhvc3RfYWxpYXM9JHRhcmdldF9hbGlhcwotCQkJCQlmaQotCQkJCQk7OwotCQkJCWVzYWMKLQkJCQllY2hvICJDb25maWd1cmluZyBmb3IgYSAke2hvc3RfYWxpYXN9IGhvc3QuIiAxPiYyCi0JCQkJYXJndW1lbnRzPSItLWhvc3Q9JGhvc3RfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCWVsc2UKLQkJCQllY2hvICdDb25maWcuZ3Vlc3MgZmFpbGVkIHRvIGRldGVybWluZSB0aGUgaG9zdCB0eXBlLiAgWW91IG5lZWQgdG8gc3BlY2lmeSBvbmUuJyAxPiYyCi0JCQkJZmF0YWw9eWVzCi0JCQlmaQotCQkJOzsKLQkJKikKLQkJCWhvc3RfYWxpYXM9JHVuZGVmcwotCQkJYXJndW1lbnRzPSItLWhvc3Q9JGhvc3RfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCXVuZGVmcz1OT1VOREVGUwotCQkJOzsKLQkJZXNhYwotCWVzYWMKLQotCSMgRG8gZGVmYXVsdGluZyBmb3IgdGFyZ2V0LiAgSWYgLS10YXJnZXQgb3B0aW9uIGlzbid0IHByZXNlbnQsIGRlZmF1bHQKLQkjIHRvIHVuZGVmcy4gIElmIHVuZGVmcyBpc24ndCBwcmVzZW50LCBkZWZhdWx0IHRvIGhvc3QuCi0JY2FzZSAkdGFyZ2V0X2FsaWFzIGluCi0JTk9UQVJHRVQpCi0JCWNhc2UgJHVuZGVmcyBpbgotCQlOT1VOREVGUykKLQkJCXRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcwotCQkJOzsKLQkJKikKLQkJCXRhcmdldF9hbGlhcz0kdW5kZWZzCi0JCQlhcmd1bWVudHM9Ii0tdGFyZ2V0PSR0YXJnZXRfYWxpYXMgJGFyZ3VtZW50cyIKLQkJCTs7Ci0JCWVzYWMKLQllc2FjCi0JOzsKLSopIDs7Ci1lc2FjCi0KLWlmIFsgLW4gIiR7ZmF0YWx9IiAtbyAiJHtob3N0X2FsaWFzfSIgPSAiaGVscCIgXSA7IHRoZW4KLQlleGVjIDE+JjIKLQllY2hvIFVzYWdlOiBjb25maWd1cmUgW09QVElPTlNdIFtIT1NUXQotCWVjaG8KLQllY2hvIE9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0c10KLQllY2hvICcgLS1wcmVmaXg9TVlESVIJCSBpbnN0YWxsIGludG8gTVlESVIgWy91c3IvbG9jYWxdJwotCWVjaG8gJyAtLWV4ZWMtcHJlZml4PU1ZRElSCSBpbnN0YWxsIGhvc3QtZGVwZW5kZW50IGZpbGVzIGludG8gTVlESVIgWy91c3IvbG9jYWxdJwotCWVjaG8gJyAtLWhlbHAJCQkgcHJpbnQgdGhpcyBtZXNzYWdlIFtub3JtYWwgY29uZmlnXScKLQllY2hvICcgLS1idWlsZD1CVUlMRAkJIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdJwotCWVjaG8gJyAtLWhvc3Q9SE9TVAkJIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZGV0ZXJtaW5lZCB2aWEgY29uZmlnLmd1ZXNzXScKLQllY2hvICcgLS1ub3JlY3Vyc2lvbgkJIGNvbmZpZ3VyZSB0aGlzIGRpcmVjdG9yeSBvbmx5IFtyZWN1cnNlXScKLQllY2hvICcgLS1wcm9ncmFtLXByZWZpeD1GT08JIHByZXBlbmQgRk9PIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzIFsiIl0nCi0JZWNobyAnIC0tcHJvZ3JhbS1zdWZmaXg9Rk9PCSBhcHBlbmQgRk9PIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzIFsiIl0nCi0JZWNobyAnIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QIHRyYW5zZm9ybSBpbnN0YWxsZWQgbmFtZXMgYnkgc2VkIHBhdHRlcm4gUCBbIiJdJwotCWVjaG8gJyAtLXNpdGU9U0lURQkJIGNvbmZpZ3VyZSB3aXRoIHNpdGUtc3BlY2lmaWMgbWFrZWZpbGUgZm9yIFNJVEUnCi0JZWNobyAnIC0tc3JjZGlyPURJUgkJIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFsuIG9yIC4uXScKLQllY2hvICcgLS10YXJnZXQ9VEFSR0VUCSBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdJwotCWVjaG8gJyAtLXRtcGRpcj1UTVBESVIJIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZXMgaW4gVE1QRElSIFsvdG1wXScKLQllY2hvICcgLS1uZnAJCQkgY29uZmlndXJlIGZvciBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBbaGFyZCBmbG9hdF0nCi0JZWNobyAnIC0td2l0aC1GT08sIC0td2l0aC1GT089QkFSIHBhY2thZ2UgRk9PIGlzIGF2YWlsYWJsZSAocGFyYW1ldGVyIEJBUiknCi0JZWNobyAnIC0td2l0aG91dC1GT08JCSBwYWNrYWdlIEZPTyBpcyBOT1QgYXZhaWxhYmxlJwotCWVjaG8gJyAtLWVuYWJsZS1GT08sIC0tZW5hYmxlLUZPTz1CQVIgaW5jbHVkZSBmZWF0dXJlIEZPTyAocGFyYW1ldGVyIEJBUiknCi0JZWNobyAnIC0tZGlzYWJsZS1GT08JCSBkbyBub3QgaW5jbHVkZSBmZWF0dXJlIEZPTycKLQllY2hvCi0JZWNobyAnV2hlcmUgSE9TVCBhbmQgVEFSR0VUIGFyZSBzb21ldGhpbmcgbGlrZSAic3BhcmMtc3Vub3MiLCAibWlwcy1zZ2ktaXJpeDUiLCBldGMuJwotCWVjaG8KLQlpZiBbIC1yIGNvbmZpZy5zdGF0dXMgXSA7IHRoZW4KLQkJY2F0IGNvbmZpZy5zdGF0dXMKLQlmaQotCi0JZXhpdCAxCi1maQotCi1jb25maWdzdWI9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9jb25maWcuc3ViLydgCi1tb3ZlaWZjaGFuZ2U9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9tb3ZlLWlmLWNoYW5nZS8nYAotdG9wc3JjZGlyPWBjZCBcYGRpcm5hbWUgJHtwcm9nbmFtZX1cYDsgcHdkYAotCi0KLSMgdGhpcyBpcyBhIGhhY2suICBzdW40IG11c3QgYWx3YXlzIGJlIGEgdmFsaWQgaG9zdCBhbGlhcyBvciB0aGlzIHdpbGwgZmFpbC4KLWlmICR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gc3VuNCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0gICAgICAgIHRydWUKLWVsc2UKLSAgICAgICAgZWNobyAnKioqJyBjYW5ub3QgZmluZCBjb25maWcuc3ViLiAgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi0KLXRvdWNoIGNvbmZpZy5qdW5rCi1pZiAke2NvbmZpZ19zaGVsbH0gJHttb3ZlaWZjaGFuZ2V9IGNvbmZpZy5qdW5rIGNvbmZpZy50cmFzaCA7IHRoZW4KLSAgICAgICAgdHJ1ZQotZWxzZQotICAgICAgICBlY2hvICcqKionIGNhbm5vdCBmaW5kIG1vdmUtaWYtY2hhbmdlLiAgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi1ybSAtZiBjb25maWcuanVuayBjb25maWcudHJhc2gKLQotY2FzZSAiJHtzcmNkaXJ9IiBpbgotIiIpCi0gICAgICAgIGlmIFsgLXIgY29uZmlndXJlLmluIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgc3JjZGlyPS4KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlmIFsgLXIgJHtwcm9nbmFtZX0uaW4gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY2Rpcj1gZWNobyAke3Byb2duYW1lfSB8IHNlZCAnczovY29uZmlndXJlJDo6J2AKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICJDYW4ndCBmaW5kIGNvbmZpZ3VyZS5pbi4gIFRyeSB1c2luZyAtLXNyY2Rpcj1zb21lX2RpciIgIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0qKQotCSMgU2V0IHNyY2RpciB0byAiLiIgaWYgdGhhdCdzIHdoYXQgaXQgaXMuCi0JIyBUaGlzIGlzIGltcG9ydGFudCBmb3IgbXVsdGlsaWIgc3VwcG9ydC4KLQlpZiBbICEgLWQgJHtzcmNkaXJ9IF0gOyB0aGVuCi0JCWVjaG8gIkludmFsaWQgc291cmNlIGRpcmVjdG9yeSAke3NyY2Rpcn0iID4mMgotCQlleGl0IDEKLQlmaQotCXB3ZD1gcHdkYAotCXNyY3B3ZD1gY2QgJHtzcmNkaXJ9IDsgcHdkYAotCWlmIFsgIiR7cHdkfSIgPSAiJHtzcmNwd2R9IiBdIDsgdGhlbgotCQlzcmNkaXI9LgotCWZpCi1lc2FjCi0KLSMjIyB3YXJuIGFib3V0IHNvbWUgY29uZmxpY3RpbmcgY29uZmlndXJhdGlvbnMuCi0KLWNhc2UgIiR7c3JjZGlyfSIgaW4KLSIuIikgOzsKLSopCi0gICAgICAgIGlmIFsgLWYgJHtzcmNkaXJ9L2NvbmZpZy5zdGF0dXMgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBlY2hvICcqKionIENhbm5vdCBjb25maWd1cmUgaGVyZSBpbiBcIiR7UFdEPWBwd2RgfVwiIHdoZW4gXCIke3NyY2Rpcn1cIiBpcyBjdXJyZW50bHkgY29uZmlndXJlZC4gMT4mMgotICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICBmaQotZXNhYwotCi0KLSMgZGVmYXVsdCBleGVjX3ByZWZpeAotY2FzZSAiJHtleGVjX3ByZWZpeG9wdGlvbn0iIGluCi0iIikgZXhlY19wcmVmaXg9IlwkKHByZWZpeCkiIDs7Ci0qKSA7OwotZXNhYwotCi0jIERlZmluZSB0aGUgdHJpZ2dlciBmaWxlIHRvIG1ha2Ugc3VyZSBjb25maWd1cmUgd2lsbCByZS1ydW4gd2hlbmV2ZXIKLSMgdGhlIGdjYyB2ZXJzaW9uIG51bWJlciBjaGFuZ2VzLgotaWYgWyAiJHt3aXRoX2djY192ZXJzaW9uX3RyaWdnZXIrc2V0fSIgPSBzZXQgXTsgdGhlbgotICAgIGdjY192ZXJzaW9uX3RyaWdnZXI9IiR3aXRoX2djY192ZXJzaW9uX3RyaWdnZXIiCi0gICAgZ2NjX3ZlcnNpb249YHNlZCAtZSAncy8uKlwiXChbXiBcIl0qXClbIFwiXS4qL1wxLycgPCAke3dpdGhfZ2NjX3ZlcnNpb25fdHJpZ2dlcn1gCi1lbHNlCi0gICAgIyBJZiBnY2MncyBzb3VyY2VzIGFyZSBhdmFpbGFibGUsIGRlZmluZSB0aGUgdHJpZ2dlciBmaWxlLgotICAgIGlmIFsgLWYgJHt0b3BzcmNkaXJ9L2djYy92ZXJzaW9uLmMgXSA7IHRoZW4KLQlnY2NfdmVyc2lvbl90cmlnZ2VyPSR7dG9wc3JjZGlyfS9nY2MvdmVyc2lvbi5jCi0JZ2NjX3ZlcnNpb249YHNlZCAtZSAncy8uKlwiXChbXiBcIl0qXClbIFwiXS4qL1wxLycgPCAke2djY192ZXJzaW9uX3RyaWdnZXJ9YAotCWNhc2UgIiRhcmd1bWVudHMiIGluCi0JICAqLS13aXRoLWdjYy12ZXJzaW9uLXRyaWdnZXI9JGdjY192ZXJzaW9uX3RyaWdnZXIqICkKLQkgICAgOzsKLQkgICogKQotCSAgICAjIE1ha2Ugc3VyZSBjb25maWd1cmUuaW4ga25vd3MgYWJvdXQgdGhpcy4KLQkgICAgYXJndW1lbnRzPSItLXdpdGgtZ2NjLXZlcnNpb24tdHJpZ2dlcj0kZ2NjX3ZlcnNpb25fdHJpZ2dlciAkYXJndW1lbnRzIgotCSAgICA7OwotCWVzYWMKLQl3aXRob3B0aW9ucz0iLS13aXRoLWdjYy12ZXJzaW9uLXRyaWdnZXI9JGdjY192ZXJzaW9uX3RyaWdnZXIgJHdpdGhvcHRpb25zIgotICAgIGZpCi1maQotCi0jIyMgYnJlYWsgdXAgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbi4KLWNhc2UgImBncmVwICdeIyBwZXJcLWhvc3Q6JyAke3NyY2Rpcn0vY29uZmlndXJlLmluYCIgaW4KLSIiKQotICAgICAgICBlY2hvICcqKionICR7c3JjZGlyfS9jb25maWd1cmUuaW4gaGFzIG5vIFwicGVyLWhvc3Q6XCIgbGluZS4gMT4mMgotCSMgQ2hlY2sgZm9yIGEgZGlyZWN0b3J5IHRoYXQncyBiZWVuIGNvbnZlcnRlZCB0byB1c2UgYXV0b2NvbmYgc2luY2UKLQkjIGl0IHdhcyBsYXN0IGNvbmZpZ3VyZWQuCi0JaWYgZ3JlcCBBQ19PVVRQVVQgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+L2Rldi9udWxsIDsgdGhlbgotCSAgZWNobyAnKioqJyBIbW0sIGxvb2tzIGxpa2UgdGhpcyBkaXJlY3RvcnkgaGFzIGJlZW4gYXV0b2NvbmZpc2NhdGVkLiAxPiYyCi0JICBpZiBbIC1yICR7c3JjZGlyfS9jb25maWd1cmUgXSA7IHRoZW4KLQkgICAgZWNobyAnKioqJyBSdW5uaW5nIHRoZSBsb2NhbCBjb25maWd1cmUgc2NyaXB0LiAxPiYyCi0JICAgIGNhc2UgIiR7Y2FjaGVfZmlsZX0iIGluCi0JICAgICIiKSBjYWNoZV9maWxlX29wdGlvbj0gOzsKLQkgICAgKikgIGNhY2hlX2ZpbGVfb3B0aW9uPSItLWNhY2hlLWZpbGU9JHtjYWNoZV9maWxlfSIgOzsKLQkgICAgZXNhYwotCSAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSR7c3JjZGlyfSIKLQkgICAgY2FzZSAiJHtidWlsZF9hbGlhc30iIGluCi0JICAgICIiKSBidWlsZG9wdD0gOzsKLQkgICAgKikgIGJ1aWxkb3B0PSItLWJ1aWxkPSR7YnVpbGRfYWxpYXN9IiA7OwotCSAgICBlc2FjCi0JICAgIGV2YWwgZXhlYyAke2NvbmZpZ19zaGVsbH0gJHtzcmNkaXJ9L2NvbmZpZ3VyZSAke3ZlcmJvc2V9IFwKLQkJJHtidWlsZG9wdH0gLS1ob3N0PSR7aG9zdF9hbGlhc30gLS10YXJnZXQ9JHt0YXJnZXRfYWxpYXN9IFwKLQkJJHtwcmVmaXhvcHRpb259ICR7dG1wZGlyb3B0aW9ufSAke2V4ZWNfcHJlZml4b3B0aW9ufSBcCi0JCSR7c3JjZGlyb3B0aW9ufSAke2Rpcm9wdGlvbnN9IFwKLQkJJHtwcm9ncmFtX3ByZWZpeG9wdGlvbn0gJHtwcm9ncmFtX3N1ZmZpeG9wdGlvbn0gXAotCQkke3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb259ICR7c2l0ZV9vcHRpb259IFwKLQkJJHt3aXRob3B0aW9uc30gJHt3aXRob3V0b3B0aW9uc30gXAotCQkke2VuYWJsZW9wdGlvbnN9ICR7ZGlzYWJsZW9wdGlvbnN9ICR7ZmxvYXRpbmdfcG9pbnRvcHRpb259IFwKLQkJJHtjYWNoZV9maWxlX29wdGlvbn0gJHtyZW1vdmluZ30gJHtvdGhlcl9vcHRpb25zfSAke3JlZGlyZWN0fQotCSAgZWxzZQotCSAgICBlY2hvICcqKionIFRoZXJlIGlzIG5vIGNvbmZpZ3VyZSBzY3JpcHQgcHJlc2VudCB0aG91Z2guIDE+JjIKLQkgIGZpCi0JZmkKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0qKSA7OwotZXNhYwotCi1jYXNlICJgZ3JlcCAnXiMgcGVyXC10YXJnZXQ6JyAke3NyY2Rpcn0vY29uZmlndXJlLmluYCIgaW4KLSIiKQotICAgICAgICBlY2hvICcqKionICR7c3JjZGlyfS9jb25maWd1cmUuaW4gaGFzIG5vIFwicGVyLXRhcmdldDpcIiBsaW5lLiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgICA7OwotKikgOzsKLWVzYWMKLQotY2FzZSAiJHtUTVBESVJ9IiBpbgotIiIpIFRNUERJUj0vdG1wIDsgZXhwb3J0IFRNUERJUiA7OwotKikgOzsKLWVzYWMKLQotIyBrZWVwIHRoaXMgZmlsZW5hbWUgc2hvcnQgZm9yICYlKiUkKiMgMTQgY2hhciBmaWxlIG5hbWVzIGFuZCA4KzMgZmlsZSBuYW1lcwotdG1wZmlsZT0ke1RNUERJUn0vY05mJCQKLSMgTm90ZSB0aGF0IHVuZGVyIG1hbnkgdmVyc2lvbnMgb2Ygc2ggYSB0cmFwIGhhbmRsZXIgZm9yIDAgd2lsbCAqb3ZlcnJpZGUqIGFueQotIyBleGl0IHN0YXR1cyB5b3UgZXhwbGljaXRseSBzcGVjaWZ5ISAgQXQgdGhpcyBwb2ludCwgdGhlIG9ubHkgbm9uLWVycm9yIGV4aXQKLSMgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc2NyaXB0OyB0aGVzZSBhY3Rpb25zIGFyZSBkdXBsaWNhdGVkIHRoZXJlLCBtaW51cwotIyB0aGUgImV4aXQgMSIuICBEb24ndCB1c2UgImV4aXQgMCIgYW55d2hlcmUgYWZ0ZXIgdGhpcyB3aXRob3V0IHJlc2V0dGluZyB0aGUKLSMgdHJhcCBoYW5kbGVyLCBvciB5b3UnbGwgbG9zZS4KLXRyYXAgInJtIC1mIE1ha2VmaWxlLnRlbSAke3RtcGZpbGV9LmNvbSAke3RtcGZpbGV9LnRndCAke3RtcGZpbGV9LmhzdCAke3RtcGZpbGV9LnBvczsgZXhpdCAxIiAwIDEgMiAxNQotCi0jIHNwbGl0ICR7c3JjZGlyfS9jb25maWd1cmUuaW4gaW50byBjb21tb24sIHBlci1ob3N0LCBwZXItdGFyZ2V0LAotIyBhbmQgcG9zdC10YXJnZXQgcGFydHMuICBQb3N0LXRhcmdldCBpcyBvcHRpb25hbC4KLXNlZCAtZSAnL14jIHBlclwtaG9zdDovLCRkJyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4gJHt0bXBmaWxlfS5jb20KLXNlZCAtZSAnMSwvXiMgcGVyXC1ob3N0Oi9kJyAtZSAnL14jIHBlclwtdGFyZ2V0Oi8sJGQnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LmhzdAotaWYgZ3JlcCAnXiMgcG9zdC10YXJnZXQ6JyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4vZGV2L251bGwgOyB0aGVuCi0gIHNlZCAtZSAnMSwvXiMgcGVyXC10YXJnZXQ6L2QnIC1lICcvXiMgcG9zdFwtdGFyZ2V0Oi8sJGQnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LnRndAotICBzZWQgLWUgJzEsL14jIHBvc3RcLXRhcmdldDovZCcgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+ICR7dG1wZmlsZX0ucG9zCi1lbHNlCi0gIHNlZCAtZSAnMSwvXiMgcGVyXC10YXJnZXQ6L2QnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LnRndAotICBlY2hvID4ke3RtcGZpbGV9LnBvcwotZmkKLQotIyMjIGRvIGNvbW1vbiBwYXJ0IG9mIGNvbmZpZ3VyZS5pbgotCi0jIElmIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlciBkb2VzIG5vdCBleGlzdCwgYnV0IHRoZSAiZ2NjIiBkaXJlY3RvcnkgZG9lcywKLSMgd2Ugd2lsbCBza2lwIHRoaXMgZGlyZWN0b3J5OyBpbiB0aGlzIGNhc2UgdGhlIHN1Yi1kaXJlY3RvcnkncyBjb21tb24gcGFydAotIyBvZiBjb25maWd1cmUuaW4gd2lsbCBjcmVhdGUgYSBzbWFsbCBzaGVsbCBzY3JpcHQgInNraXAtdGhpcy1kaXIiIGNvbnRhaW5pbmcKLSMgY29tbWFuZHMgdG8gY29tcGxldGVseSBjbGVhbiB1cCBhbnkgdGVtcG9yYXJ5IG9yIGNyZWF0ZWQgZmlsZXMuCi0KLS4gJHt0bXBmaWxlfS5jb20KLQotaWYgdGVzdCAtZiBza2lwLXRoaXMtZGlyOyB0aGVuCi0JIyBQZXJmb3JtIHRoZSBzYW1lIGNsZWFudXAgYXMgdGhlIHRyYXAgaGFuZGxlciwgbWludXMgdGhlICJleGl0IDEiIG9mIGNvdXJzZSwKLQkjIGFuZCByZXNldCB0aGUgdHJhcCBoYW5kbGVyLgotCXRyYXAgMAotCXJtIC1mIE1ha2VmaWxlKiAke3RtcGZpbGV9LmNvbSAke3RtcGZpbGV9LnRndCAke3RtcGZpbGV9LmhzdCAke3RtcGZpbGV9LnBvcwotCSMgRXhlY3V0ZSB0aGUgZmluYWwgY2xlYW4tdXAgYWN0aW9ucwotCSR7Y29uZmlnX3NoZWxsfSBza2lwLXRoaXMtZGlyCi0JIyBhbmQgc3RvcCBjb25maWd1cmluZyB0aGlzIGRpcmVjdG9yeS4KLQlleGl0IDAKLWZpCi0KLSMgc29tZSBzYW5pdHkgY2hlY2tzIG9uIGNvbmZpZ3VyZS5pbgotY2FzZSAiJHtzcmN0cmlnZ2VyfSIgaW4KLSIiKQotICAgICAgICBlY2hvICcqKionIHNyY3RyaWdnZXIgbm90IHNldCBpbiAke1BXRD1gcHdkYH0vY29uZmlndXJlLmluLiAgMT4mMgotICAgICAgICBleGl0IDEKLSAgICAgICAgOzsKLSopIDs7Ci1lc2FjCi0KLWNhc2UgIiR7YnVpbGRfYWxpYXN9IiBpbgotIiIpCi0JaWYgcmVzdWx0PWAke2NvbmZpZ19zaGVsbH0gJHtjb25maWdzdWJ9ICR7aG9zdF9hbGlhc31gIDsgdGhlbgotCSAgICBidWlsZF9jcHU9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi0JICAgIGJ1aWxkX3ZlbmRvcj1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLQkgICAgYnVpbGRfb3M9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi0JICAgIGJ1aWxkPSR7YnVpbGRfY3B1fS0ke2J1aWxkX3ZlbmRvcn0tJHtidWlsZF9vc30KLQkgICAgYnVpbGRfYWxpYXM9JHtob3N0X2FsaWFzfQotCWZpCi0JOzsKLSopCi0JaWYgcmVzdWx0PWAke2NvbmZpZ19zaGVsbH0gJHtjb25maWdzdWJ9ICR7YnVpbGRfYWxpYXN9YCA7IHRoZW4KLQkgICAgYnVpbGRvcHQ9Ii0tYnVpbGQ9JHtidWlsZF9hbGlhc30iCi0JICAgIGJ1aWxkX2NwdT1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLQkgICAgYnVpbGRfdmVuZG9yPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotCSAgICBidWlsZF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLQkgICAgYnVpbGQ9JHtidWlsZF9jcHV9LSR7YnVpbGRfdmVuZG9yfS0ke2J1aWxkX29zfQotCWVsc2UKLQkgICAgZWNobyAiVW5yZWNvZ25pemVkIGJ1aWxkIHN5c3RlbSBuYW1lICR7YnVpbGRfYWxpYXN9LiIgMT4mMgotCSAgICBleGl0IDEKLQlmaQotCTs7Ci1lc2FjCi0KLWlmIHJlc3VsdD1gJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSAke2hvc3RfYWxpYXN9YCA7IHRoZW4KLSAgICB0cnVlCi1lbHNlCi0gICAgZWNobyAiVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIG5hbWUgJHtob3N0X2FsaWFzfS4iIDE+JjIKLSAgICBleGl0IDEKLWZpCi1ob3N0X2NwdT1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWhvc3Q9JHtob3N0X2NwdX0tJHtob3N0X3ZlbmRvcn0tJHtob3N0X29zfQotCi0uICR7dG1wZmlsZX0uaHN0Ci0KLWlmIHJlc3VsdD1gJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSAke3RhcmdldF9hbGlhc31gIDsgdGhlbgotICAgIHRydWUKLWVsc2UKLSAgICBlY2hvICJVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSBuYW1lICR7dGFyZ2V0X2FsaWFzfS4iIDE+JjIKLSAgICBleGl0IDEKLWZpCi10YXJnZXRfY3B1PWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLXRhcmdldD0ke3RhcmdldF9jcHV9LSR7dGFyZ2V0X3ZlbmRvcn0tJHt0YXJnZXRfb3N9Ci0KLS4gJHt0bXBmaWxlfS50Z3QKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotY2FzZSAiJHtzcmNkaXJ9IiBpbgotIiIpCi0gICAgICAgIHNyY2RpcmRlZmF1bHRlZD0xCi0gICAgICAgIHNyY2Rpcj0uCi0gICAgICAgIGlmIFsgISAtciAke3NyY3RyaWdnZXJ9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgc3JjZGlyPS4uCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0qKSA7OwotZXNhYwotCi1pZiBbICEgLXIgJHtzcmNkaXJ9LyR7c3JjdHJpZ2dlcn0gXSA7IHRoZW4KLSAgICAgICAgY2FzZSAiJHtzcmNkaXJkZWZhdWx0ZWR9IiBpbgotICAgICAgICAiIikgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IENhbid0IGZpbmQgJHtzcmNuYW1lfSBzb3VyY2VzIGluICR7UFdEPWBwd2RgfS8ke3NyY2Rpcn0iIDE+JjIgOzsKLSAgICAgICAgKikgIGVjaG8gJyoqKicgIiR7cHJvZ25hbWV9OiBDYW4ndCBmaW5kICR7c3JjbmFtZX0gc291cmNlcyBpbiAke1BXRD1gcHdkYH0vLiBvciAke1BXRD1gcHdkYH0vLi4iIDE+JjIgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGVjaG8gJyoqKicgXChBdCBsZWFzdCAke3NyY3RyaWdnZXJ9IGlzIG1pc3NpbmcuXCkgMT4mMgotICAgICAgICBleGl0IDEKLWZpCi0KLSMgU29tZSBzeXN0ZW1zIChlLmcuLCBvbmUgb2YgdGhlIGkzODYtYWl4IHN5c3RlbXMgdGhlIGdhcyB0ZXN0ZXJzIGFyZQotIyB1c2luZykgZG9uJ3QgaGFuZGxlICJcJCIgY29ycmVjdGx5LCBzbyBkb24ndCB1c2UgaXQgaGVyZS4KLXRvb2xkaXI9JyQoZXhlY19wcmVmaXgpJy8ke3RhcmdldF9hbGlhc30KLQotaWYgWyAiJHtob3N0X2FsaWFzfSIgIT0gIiR7dGFyZ2V0X2FsaWFzfSIgXSA7IHRoZW4KLSAgICBpZiBbICIke3Byb2dyYW1fcHJlZml4b3B0aW9ufSIgPSAiIiBdIDsgdGhlbgotICAgICAgICBpZiBbICIke3Byb2dyYW1fc3VmZml4b3B0aW9ufSIgPSAiIiBdIDsgdGhlbiAKLSAgICAgICAgICAgIGlmIFsgIiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbn0iID0gIiIgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tIDsKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgZmkKLWZpCi0KLSMgTWVyZ2UgcHJvZ3JhbV9wcmVmaXggYW5kIHByb2dyYW1fc3VmZml4IG9udG8gcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZS4KLSMgKHByb2dyYW1fc3VmZml4IHVzZWQgdG8gdXNlICQsIGJ1dCBpdCdzIGhhcmQgdG8gcHJlc2VydmUgJCB0aHJvdWdoIGJvdGgKLSMgbWFrZSBhbmQgc2guKQotaWYgWyAiJHtwcm9ncmFtX3N1ZmZpeH0iICE9ICIiIF0gOyB0aGVuCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iLWUgcyxcXFxcKC4qXFxcXCksXFxcXDEke3Byb2dyYW1fc3VmZml4fSwgJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSIKLWZpCi0KLWlmIFsgIiR7cHJvZ3JhbV9wcmVmaXh9IiAhPSAiIiBdIDsgdGhlbgotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ii1lIHMsXiwke3Byb2dyYW1fcHJlZml4fSwgJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSIKLWZpCi0KLSMgSWYgQ0MgYW5kIENYWCBhcmUgbm90IHNldCBpbiB0aGUgZW52aXJvbm1lbnQsIGFuZCB0aGUgTWFrZWZpbGUKLSMgZXhpc3RzLCB0cnkgdG8gZXh0cmFjdCB0aGVtIGZyb20gaXQuICBUaGlzIGlzIHRvIGhhbmRsZSBydW5uaW5nCi0jIC4vY29uZmlnLnN0YXR1cyBieSBoYW5kLgotaWYgWyAteiAiJHtDQ30iIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCi0gIHNlZCAtbiAtZSAnOmxvb3AKLS9cXCQvIE4KLXMvXFxcbi8vZwotdCBsb29wCi0vXkNDWyAJXSo9LyBzL0NDWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgPCBNYWtlZmlsZSA+IE1ha2VmaWxlLmNjCi0gIENDPWB0YWlsIC0xIE1ha2VmaWxlLmNjYAotICBybSAtZiBNYWtlZmlsZS5jYwotZmkKLQotaWYgWyAteiAiJHtDRkxBR1N9IiBdICYmIFsgLXIgTWFrZWZpbGUgXTsgdGhlbgotICBzZWQgLW4gLWUgJzpsb29wCi0vXFwkLyBOCi1zL1xcXG4vL2cKLXQgbG9vcAotL15DRkxBR1NbIAldKj0vIHMvQ0ZMQUdTWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgPCBNYWtlZmlsZSA+IE1ha2VmaWxlLmNjCi0gIENGTEFHUz1gdGFpbCAtMSBNYWtlZmlsZS5jY2AKLSAgcm0gLWYgTWFrZWZpbGUuY2MKLWZpCi0KLWlmIFsgLXogIiR7Q1hYfSIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KLSAgc2VkIC1uIC1lICc6bG9vcAotL1xcJC8gTgotcy9cXFxuLy9nCi10IGxvb3AKLS9eQ1hYWyAJXSo9LyBzL0NYWFsgCV0qPVsgCV0qXCguKlwpL1wxL3AnIDwgTWFrZWZpbGUgPiBNYWtlZmlsZS5jYwotICBDWFg9YHRhaWwgLTEgTWFrZWZpbGUuY2NgCi0gIHJtIC1mIE1ha2VmaWxlLmNjCi1maQotCi1pZiBbIC16ICIke0NYWEZMQUdTfSIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KLSAgc2VkIC1uIC1lICc6bG9vcAotL1xcJC8gTgotcy9cXFxuLy9nCi10IGxvb3AKLS9eQ1hYRkxBR1NbIAldKj0vIHMvQ1hYRkxBR1NbIAldKj1bIAldKlwoLipcKS9cMS9wJyA8IE1ha2VmaWxlID4gTWFrZWZpbGUuY2MKLSAgQ1hYRkxBR1M9YHRhaWwgLTEgTWFrZWZpbGUuY2NgCi0gIHJtIC1mIE1ha2VmaWxlLmNjCi1maQotCi0jIEdlbmVyYXRlIGEgZGVmYXVsdCBkZWZpbml0aW9uIGZvciBZQUNDLiAgVGhpcyBpcyB1c2VkIGlmIHRoZSBtYWtlZmlsZSBjYW4ndAotIyBsb2NhdGUgYmlzb24gb3IgYnlhY2MgaW4gb2JqZGlyLgotCi1mb3IgcHJvZyBpbiAnYmlzb24gLXknIGJ5YWNjIHlhY2MKLWRvCi0gIHNldCBkdW1teSAkcHJvZzsgdG1wPSQyCi0gIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvJHRtcDsgdGhlbgotICAgICAgREVGQVVMVF9ZQUNDPSIkcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICB0ZXN0IC1uICIkREVGQVVMVF9ZQUNDIiAmJiBicmVhawotZG9uZQotCi0jIEdlbmVyYXRlIGEgZGVmYXVsdCBkZWZpbml0aW9uIGZvciBNNC4gIFRoaXMgaXMgdXNlZCBpZiB0aGUgbWFrZWZpbGUgY2FuJ3QKLSMgbG9jYXRlIG00IGluIG9iamRpci4KLQotZm9yIHByb2cgaW4gZ200IGdudW00IG00Ci1kbwotICBzZXQgZHVtbXkgJHByb2c7IHRtcD0kMgotICBJRlM9IiR7SUZTPSAgIH0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci8kdG1wOyB0aGVuCi0gICAgICBERUZBVUxUX000PSIkcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICB0ZXN0IC1uICIkREVGQVVMVF9NNCIgJiYgYnJlYWsKLWRvbmUKLQotIyBHZW5lcmF0ZSBhIGRlZmF1bHQgZGVmaW5pdGlvbiBmb3IgTEVYLiAgVGhpcyBpcyB1c2VkIGlmIHRoZSBtYWtlZmlsZSBjYW4ndAotIyBsb2NhdGUgZmxleCBpbiBvYmpkaXIuCi0KLWZvciBwcm9nIGluIGZsZXggbGV4Ci1kbwotICBzZXQgZHVtbXkgJHByb2c7IHRtcD0kMgotICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgaWYgdGVzdCAtZiAkZGlyLyR0bXA7IHRoZW4KLSAgICAgIERFRkFVTFRfTEVYPSIkcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICB0ZXN0IC1uICIkREVGQVVMVF9MRVgiICYmIGJyZWFrCi1kb25lCi0KLSMgQklOVVRJTFMgTE9DQUw6IFRoaXMgaXMgaW5jbHVkZWQgaW4gdGhlIGRlZmF1bHQgQ0ZMQUdTIHdoZW4gdXNpbmcgZ2NjLgotd2Fybl9jZmxhZ3M9Ii1XIC1XYWxsIgotCi1pZiBbICIke2J1aWxkfSIgIT0gIiR7aG9zdH0iIF07IHRoZW4KLSAgIyBJZiB3ZSBhcmUgZG9pbmcgYSBDYW5hZGlhbiBDcm9zcywgaW4gd2hpY2ggdGhlIGhvc3QgYW5kIGJ1aWxkIHN5c3RlbXMKLSAgIyBhcmUgbm90IHRoZSBzYW1lLCB3ZSBzZXQgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHRvb2xzLgotCi0gIHRvb2xzPSJBUiBBUl9GT1JfVEFSR0VUIEFTIEFTX0ZPUl9UQVJHRVQgQklTT04gQ0NfRk9SX0JVSUxEIgotICB0b29scz0iJHt0b29sc30gQ0NfRk9SX1RBUkdFVCBDWFhfRk9SX1RBUkdFVCIKLSAgdG9vbHM9IiR7dG9vbHN9IERMTFRPT0wgRExMVE9PTF9GT1JfVEFSR0VUIEdDQ19GT1JfVEFSR0VUIEhPU1RfUFJFRklYIgotICB0b29scz0iJHt0b29sc30gSE9TVF9QUkVGSVhfMSBMRCBMRF9GT1JfVEFSR0VUIExFWCBNQUtFSU5GTyBOTSIKLSAgdG9vbHM9IiR7dG9vbHN9IE5NX0ZPUl9UQVJHRVQgUkFOTElCIFJBTkxJQl9GT1JfVEFSR0VUIgotICB0b29scz0iJHt0b29sc30gV0lORFJFUyBXSU5EUkVTX0ZPUl9UQVJHRVQgWUFDQyIKLQotICBmb3IgdmFyIGluICR7dG9vbHN9OyBkbwotICAgIGlmIFsgLXogImBldmFsICdlY2hvICQnIiR7dmFyfSJgIiBdICYmIFsgLXIgTWFrZWZpbGUgXTsgdGhlbgotICAgICAgc2VkIC1uIC1lICc6bG9vcAotL1xcJC8gTgotcy9cXFxuLy9nCi10IGxvb3AKLS9eJyIke3Zhcn0iJ1sgCV0qPS8gcy8nIiR7dmFyfSInWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgXAotCTwgTWFrZWZpbGUgPiBNYWtlZmlsZS52Ci0gICAgICB0PWB0YWlsIC0xIE1ha2VmaWxlLnZgCi0gICAgICBpZiBbIC1uICIke3R9IiBdOyB0aGVuCi0JZXZhbCAiJHt2YXJ9PScke3R9JyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBNYWtlZmlsZS52Ci0gICAgZmkKLSAgZG9uZQotCi0gIEFSPSR7QVItJHtob3N0X2FsaWFzfS1hcn0KLSAgQVJfRk9SX1RBUkdFVD0ke0FSX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWFyfQotICBBUz0ke0FTLSR7aG9zdF9hbGlhc30tYXN9Ci0gIEFTX0ZPUl9UQVJHRVQ9JHtBU19GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1hc30KLSAgQklTT049JHtCSVNPTi1iaXNvbn0KLSAgQ0M9JHtDQy0ke2hvc3RfYWxpYXN9LWdjY30KLSAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZyAtTzIgJHt3YXJuX2NmbGFnc30ifQotICBDWFg9JHtDWFgtJHtob3N0X2FsaWFzfS1jKyt9Ci0gIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1nIC1PMiJ9Ci0gIENDX0ZPUl9CVUlMRD0ke0NDX0ZPUl9CVUlMRC1nY2N9Ci0gIENDX0ZPUl9UQVJHRVQ9JHtDQ19GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1nY2N9Ci0gIENYWF9GT1JfVEFSR0VUPSR7Q1hYX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWMrK30KLSAgRExMVE9PTD0ke0RMTFRPT0wtJHtob3N0X2FsaWFzfS1kbGx0b29sfQotICBETExUT09MX0ZPUl9UQVJHRVQ9JHtETExUT09MX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWRsbHRvb2x9Ci0gIEdDQ19GT1JfVEFSR0VUPSR7R0NDX0ZPUl9UQVJHRVQtJHtDQ19GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1nY2N9fQotICBIT1NUX1BSRUZJWD0ke2J1aWxkX2FsaWFzfS0KLSAgSE9TVF9QUkVGSVhfMT0ke2J1aWxkX2FsaWFzfS0KLSAgTEQ9JHtMRC0ke2hvc3RfYWxpYXN9LWxkfQotICBMRF9GT1JfVEFSR0VUPSR7TERfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tbGR9Ci0gIE1BS0VJTkZPPSR7TUFLRUlORk8tbWFrZWluZm99Ci0gIE5NPSR7Tk0tJHtob3N0X2FsaWFzfS1ubX0KLSAgTk1fRk9SX1RBUkdFVD0ke05NX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LW5tfQotICBSQU5MSUI9JHtSQU5MSUItJHtob3N0X2FsaWFzfS1yYW5saWJ9Ci0gIFJBTkxJQl9GT1JfVEFSR0VUPSR7UkFOTElCX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LXJhbmxpYn0KLSAgV0lORFJFUz0ke1dJTkRSRVMtJHtob3N0X2FsaWFzfS13aW5kcmVzfQotICBXSU5EUkVTX0ZPUl9UQVJHRVQ9JHtXSU5EUkVTX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LXdpbmRyZXN9Ci0KLSAgaWYgWyAteiAiJHtZQUNDfSIgXTsgdGhlbgotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvYmlzb247IHRoZW4KLQlZQUNDPSJiaXNvbiAteSIKLQlicmVhawotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgLWYgJGRpci9ieWFjYzsgdGhlbgotCVlBQ0M9YnlhY2MKLQlicmVhawotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgLWYgJGRpci95YWNjOyB0aGVuCi0JWUFDQz15YWNjCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotICAgIGlmIFsgLXogIiR7WUFDQ30iIF07IHRoZW4KLSAgICAgIFlBQ0M9ImJpc29uIC15IgotICAgIGZpCi0gIGZpCi0KLSAgaWYgWyAteiAiJHtMRVh9IiBdOyB0aGVuCi0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9mbGV4OyB0aGVuCi0JTEVYPWZsZXgKLQlicmVhawotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgLWYgJGRpci9sZXg7IHRoZW4KLQlMRVg9bGV4Ci0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotICAgIExFWD0ke0xFWC1mbGV4fQotICBmaQotCi0gICMgRXhwb3J0IHZhcmlhYmxlcyB3aGljaCBhdXRvY29uZiBtaWdodCB0cnkgdG8gc2V0LgotICBleHBvcnQgQVMKLSAgZXhwb3J0IEFSCi0gIGV4cG9ydCBDQ19GT1JfQlVJTEQKLSAgZXhwb3J0IERMTFRPT0wKLSAgZXhwb3J0IExECi0gIGV4cG9ydCBOTQotICBleHBvcnQgUkFOTElCCi0gIGV4cG9ydCBXSU5EUkVTCi1lbHNlCi0gICMgSWYgQ0MgaXMgc3RpbGwgbm90IHNldCwgdHJ5IHRvIGdldCBnY2MuCi0gIGlmIFsgLXogIiR7Q0N9IiBdOyB0aGVuCi0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9nY2M7IHRoZW4KLQlDQz0iZ2NjIgotCWVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotCWlmIHRlc3QgLXogImAke0NDfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotCSAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZyAtTzIgJHt3YXJuX2NmbGFnc30ifQotCSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLWcgLU8yIn0KLQllbHNlCi0JICBDRkxBR1M9JHtDRkxBR1MtIi1PMiAke3dhcm5fY2ZsYWdzfSJ9Ci0JICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItTzIifQotCWZpCi0Jcm0gLWYgY29uZnRlc3QqCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotICAgIENDPSR7Q0MtY2N9Ci0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIke0NGTEFHU30iOyB0aGVuCi0gICAgICAjIEhlcmUgQ0MgaXMgc2V0IGJ1dCBDRkxBR1MgaXMgbm90LiAgVXNlIGEgcXVpY2sgaGFjayB0byB1c2UgLU8yIGlmIENDCi0gICAgICAjIGlzIHNldCB0byBhIHZlcnNpb24gb2YgZ2NjLgotICAgICAgY2FzZSAiJHtDQ30iIGluCi0gICAgICAqZ2NjKQotCWVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotCWlmIHRlc3QgLXogImAke0NDfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotCSAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZyAtTzIgJHt3YXJuX2NmbGFnc30ifQotCSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLWcgLU8yIn0KLQllbHNlCi0JICBDRkxBR1M9JHtDRkxBR1MtIi1PMiAke3dhcm5fY2ZsYWdzfSJ9Ci0JICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItTzIifQotCWZpCi0Jcm0gLWYgY29uZnRlc3QqCi0JOzsKLSAgICAgIGVzYWMKLSAgICBmaQotICBmaQotCi0gIENYWD0ke0NYWC0iYysrIn0KLSAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZyJ9Ci0gIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1nIC1PMiJ9Ci1maQotCi1leHBvcnQgQ0MKLWV4cG9ydCBDWFgKLWV4cG9ydCBDRkxBR1MKLWV4cG9ydCBDWFhGTEFHUwotCi0KLWZvciBzdWJkaXIgaW4gLiAke3N1YmRpcnN9IDsgZG8KLQotICAgICMgJHtzdWJkaXJ9IGlzIHJlbGF0aXZlIHBhdGggZnJvbSAuIHRvIHRoZSBkaXJlY3Rvcnkgd2UncmUgY3VycmVudGx5Ci0gICAgIyBjb25maWd1cmluZy4KLSAgICAjICR7aW52c3ViZGlyfSBpcyBpbnZlcnNlIG9mICR7c3ViZGlyKSwgKndpdGgqIHRyYWlsaW5nIC8sIGlmIG5lZWRlZC4KLSAgICBpbnZzdWJkaXI9YGVjaG8gJHtzdWJkaXJ9LyB8IHNlZCAtZSAnc3xcLi98fGcnIC1lICdzfFteL10qL3wuLi98ZydgCi0KLSAgICAjIyMgZmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGggc3JjZGlyCi0gICAgY2FzZSAiJHtzcmNkaXJ9IiBpbgotICAgICAgICAiLiIpICAjIG5vIC1zcmNkaXIgb3B0aW9uLiAgV2UncmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgICAgICAgICAgICAgbWFrZXNyY2Rpcj0uIDs7Ci0gICAgICAgIC8qKSAjIGFic29sdXRlIHBhdGgKLSAgICAgICAgICAgICAgICBtYWtlc3JjZGlyPWBlY2hvICR7c3JjZGlyfS8ke3N1YmRpcn0gfCBzZWQgLWUgJ3N8L1wuJHx8J2AKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICAqKSAjIG90aGVyd2lzZSByZWxhdGl2ZQotICAgICAgICAgICAgICAgIGNhc2UgIiR7c3ViZGlyfSIgaW4KLSAgICAgICAgICAgICAgICAuKSBtYWtlc3JjZGlyPSR7c3JjZGlyfSA7OwotICAgICAgICAgICAgICAgICopIG1ha2VzcmNkaXI9JHtpbnZzdWJkaXJ9JHtzcmNkaXJ9LyR7c3ViZGlyfSA7OwotICAgICAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICAgICA7OwotICAgIGVzYWMKLQotICAgIGlmIFsgIiR7c3ViZGlyfS8iICE9ICIuLyIgXSA7IHRoZW4KLSAgICAgICAgTWFrZWZpbGU9JHtzdWJkaXJ9L01ha2VmaWxlCi0gICAgZmkKLQotICAgIGlmIFsgISAtZCAke3N1YmRpcn0gXSA7IHRoZW4KLSAgICAgICAgaWYgbWtkaXIgJHtzdWJkaXJ9IDsgdGhlbgotICAgICAgICAgICAgICAgIHRydWUKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgIiR7cHJvZ25hbWV9OiBjb3VsZCBub3QgbWFrZSAke1BXRD1gcHdkYH0vJHtzdWJkaXJ9IiAxPiYyCi0gICAgICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgIGZpCi0gICAgZmkKLQotICAgIGNhc2UgIiR7cmVtb3Zpbmd9IiBpbgotICAgICIiKQotICAgICAgICBjYXNlICIke3N1YmRpcn0iIGluCi0gICAgICAgIC4pIDs7Ci0gICAgICAgICopIGV2YWwgZWNobyBCdWlsZGluZyBpbiAke3N1YmRpcn0gJHtyZWRpcmVjdH0gOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgICMgRklYTUUgU2hvdWxkIHRoaXMgYmUgZG9uZSByZWN1cnNpdmVseSA/Pz8gKFVzZWZ1bCBmb3IgZS5nLiBnZGJ0ZXN0KQotICAgICAgICAjIFNldCB1cCB0aGUgbGlzdCBvZiBsaW5rcyB0byBiZSBtYWRlLgotICAgICAgICAjICR7bGlua3N9IGlzIHRoZSBsaXN0IG9mIGxpbmsgbmFtZXMsIGFuZCAke2ZpbGVzfSBpcyB0aGUgbGlzdCBvZiBuYW1lcyB0byBsaW5rIHRvLgotCi0gICAgICAgICMgTWFrZSB0aGUgbGlua3MuCi0gICAgICAgIGNvbmZpZ2xpbmtzPSIke2xpbmtzfSIKLSAgICAgICAgaWYgWyAtciAke3N1YmRpcn0vY29uZmlnLnN0YXR1cyBdIDsgdGhlbgotICAgICAgICAgICAgICAgIG12IC1mICR7c3ViZGlyfS9jb25maWcuc3RhdHVzICR7c3ViZGlyfS9jb25maWcuYmFjawotICAgICAgICBmaQotICAgICAgICB3aGlsZSBbIC1uICIke2ZpbGVzfSIgXSA7IGRvCi0gICAgICAgICAgICAgICAgIyBzZXQgZmlsZSB0byBjYXIgb2YgZmlsZXMsIGZpbGVzIHRvIGNkciBvZiBmaWxlcwotICAgICAgICAgICAgICAgIHNldCAke2ZpbGVzfTsgZmlsZT0kMTsgc2hpZnQ7IGZpbGVzPSQqCi0gICAgICAgICAgICAgICAgc2V0ICR7bGlua3N9OyBsaW5rPSQxOyBzaGlmdDsgbGlua3M9JCoKLQotICAgICAgICAgICAgICAgIGlmIFsgISAtciAke3NyY2Rpcn0vJHtmaWxlfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgaWYgWyAhIC1yICR7ZmlsZX0gXSA7IHRoZW4KLQkJICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IGNhbm5vdCBjcmVhdGUgYSBsaW5rIFwiJHtsaW5rfVwiLCIgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyAic2luY2UgdGhlIGZpbGUgXCIke3NyY2Rpcn0vJHtmaWxlfVwiIGRvZXMgbm90IGV4aXN0LiIgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAxCi0JCSAgZWxzZQotCQkJc3JjZmlsZT0ke2ZpbGV9Ci0JCSAgZmkKLQkJZWxzZQotCQkJc3JjZmlsZT0ke3NyY2Rpcn0vJHtmaWxlfQotICAgICAgICAgICAgICAgIGZpCi0KLSAgICAgICAgICAgICAgICAke3JlbW92ZX0gLWYgJHtsaW5rfQotCQkjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rCi0JCWlmICR7c3ltYm9saWNfbGlua30gJHtzcmNmaWxlfSAke2xpbmt9ID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkJCXRydWUKLQkJZWxzZQotCQkJIyBXZSBuZWVkIHRvIHJlLXJlbW92ZSB0aGUgZmlsZSBiZWNhdXNlIEx5bnggbGVhdmVzIGEgCi0JCQkjIHZlcnkgc3RyYW5nZSBkaXJlY3RvcnkgdGhlcmUgd2hlbiBpdCBmYWlscyBhbiBORlMgc3ltbGluay4KLQkJCSR7cmVtb3ZlfSAtciAtZiAke2xpbmt9Ci0JCQkke2hhcmRfbGlua30gJHtzcmNmaWxlfSAke2xpbmt9Ci0JCWZpCi0gICAgICAgICAgICAgICAgaWYgWyAhIC1yICR7bGlua30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgIiR7cHJvZ25hbWV9OiB1bmFibGUgdG8gbGluayBcIiR7bGlua31cIiB0byBcIiR7c3JjZmlsZX1cIi4iIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgICAgICAgIGZpCi0KLSAgICAgICAgICAgICAgICBlY2hvICJMaW5rZWQgXCIke2xpbmt9XCIgdG8gXCIke3NyY2ZpbGV9XCIuIgotICAgICAgICBkb25lCi0KLSAgICAgICAgIyBDcmVhdGUgYSAuZ2RiaW5pdCBmaWxlIHdoaWNoIHJ1bnMgdGhlIG9uZSBpbiBzcmNkaXIKLSAgICAgICAgIyBhbmQgdGVsbHMgR0RCIHRvIGxvb2sgdGhlcmUgZm9yIHNvdXJjZSBmaWxlcy4KLQotICAgICAgICBpZiBbIC1yICR7c3JjZGlyfS8ke3N1YmRpcn0vLmdkYmluaXQgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBjYXNlICR7c3JjZGlyfSBpbgotICAgICAgICAgICAgICAgIC4pIDs7Ci0gICAgICAgICAgICAgICAgKikgY2F0ID4gJHtzdWJkaXJ9Ly5nZGJpbml0IDw8RU9GCi0jICR7Tk9fRURJVH0KLWRpciAke21ha2VzcmNkaXJ9Ci1kaXIgLgotc291cmNlICR7bWFrZXNyY2Rpcn0vLmdkYmluaXQKLUVPRgotICAgICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICBlc2FjCi0gICAgICAgIGZpCi0KLSAgICAgICAgIyBJbnN0YWxsIGEgbWFrZWZpbGUsIGFuZCBtYWtlIGl0IHNldCBWUEFUSAotICAgICAgICAjIGlmIG5lY2Vzc2FyeSBzbyB0aGF0IHRoZSBzb3VyY2VzIGFyZSBmb3VuZC4KLSAgICAgICAgIyBBbHNvIGNoYW5nZSBpdHMgdmFsdWUgb2Ygc3JjZGlyLgotICAgICAgICAjIE5PVEU6IE1ha2VmaWxlIGdlbmVyYXRpb24gY29uc3RpdHV0ZXMgdGhlIG1ham9yaXR5IG9mIHRoZSB0aW1lIGluIGNvbmZpZ3VyZS4gIEhlbmNlLCB0aGlzIHNlY3Rpb24gaGFzCi0gICAgICAgICMgYmVlbiBzb21ld2hhdCBvcHRpbWl6ZWQgYW5kIGlzIHBlcmhhcHMgYSBiaXQgdHdpc3R5LgotCi0gICAgICAgICMgY29kZSBpcyBvcmRlciBzbyBhcyB0byB0cnkgdG8gc2VkIHRoZSBzbWFsbGVzdCBpbnB1dCBmaWxlcyB3ZSBrbm93LgotICAgICAgICAjIHNvIGRvIHRoZXNlIHNlcGFyYXRlbHkgYmVjYXVzZSBJIGRvbid0IHRydXN0IHRoZSBvcmRlciBvZiBzZWQgLWUgZXhwcmVzc2lvbnMuCi0KLSAgICAgICAgIyB0aGUgZml2ZSBtYWtlZmlsZSBmcmFnbWVudHMgTVVTVCBlbmQgdXAgaW4gdGhlIHJlc3VsdGluZyBNYWtlZmlsZSBpbiB0aGlzIG9yZGVyOiAKLSAgICAgICAgIyBwYWNrYWdlIG1hY3JvcywgdGFyZ2V0LCBob3N0LCBzaXRlLCBhbmQgcGFja2FnZSBydWxlcy4KLQotICAgICAgICBpZiBbIC1mICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtNYWtlZmlsZV9pbn0gXSA7IHRoZW4KLQotICAgICAgICAgICAgIyBDb25kaXRpb25hbGl6ZSB0aGUgbWFrZWZpbGUgZm9yIHRoaXMgcGFja2FnZSBmcm9tICJNYWtlZmlsZS5pbiIgKG9yIHdoYXRldmVyIGl0J3MgY2FsbGVkKSBpbnRvIE1ha2VmaWxlLnRlbS4KLSAgICAgICAgICAgIHJtIC1mICR7c3ViZGlyfS8ke01ha2VmaWxlfS50ZW0KLSAgICAgICAgICAgIGNhc2UgIiR7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIGNwICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtNYWtlZmlsZV9pbn0gJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSA7OwotICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgISAtZiAke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZz0ke3NyY2Rpcn0vJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9Ci0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbIC1mICR7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICIvXiMjIyMvICByICR7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfSIgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSA+ICR7TWFrZWZpbGV9LnRlbQotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgRXhwZWN0ZWQgcGFja2FnZSBtYWtlZmlsZSBydWxlcyBmcmFnbWVudCBcIiR7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfVwiIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgaXMgbWlzc2luZyBpbiAke1BXRD1gcHdkYH0uIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtNYWtlZmlsZV9pbn0gJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICAjIHdvcmtpbmcgY29weSBub3cgaW4gJHtNYWtlZmlsZX0udGVtCi0KLSAgICAgICAgICAgICMgQ29uZGl0aW9uYWxpemUgZm9yIHRoaXMgc2l0ZS4KLSAgICAgICAgICAgIHJtIC1mICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICAgIGNhc2UgIiR7c2l0ZX0iIGluCi0gICAgICAgICAgICAgICIiKSBtdiAke3N1YmRpcn0vTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgc2l0ZV9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS9jb25maWcvbXMtJHtzaXRlfQotCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke3NpdGVfbWFrZWZpbGVfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZCAtZSAiL14jIyMjLyAgciAke3NpdGVfbWFrZWZpbGVfZnJhZ30iICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+ICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSAke01ha2VmaWxlfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZV9tYWtlZmlsZV9mcmFnPQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgd29ya2luZyBjb3B5IG5vdyBpbiAke01ha2VmaWxlfQotCi0gICAgICAgICAgICAjIENvbmRpdGlvbmFsaXplIHRoZSBtYWtlZmlsZSBmb3IgdGhpcyBob3N0LgotICAgICAgICAgICAgcm0gLWYgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotICAgICAgICAgICAgY2FzZSAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgbXYgJHtNYWtlZmlsZX0gJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSA7OwotICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgISAtZiAke2hvc3RfbWFrZWZpbGVfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0ke3NyY2Rpcn0vJHtob3N0X21ha2VmaWxlX2ZyYWd9Ci0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbIC1mICR7aG9zdF9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICIvXiMjIyMvICByICR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgJHtNYWtlZmlsZX0gPiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBFeHBlY3RlZCBob3N0IG1ha2VmaWxlIGZyYWdtZW50IFwiJHtob3N0X21ha2VmaWxlX2ZyYWd9XCIgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBpcyBtaXNzaW5nIGluICR7UFdEPWBwd2RgfS4gMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYgJHtNYWtlZmlsZX0gJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICAjIHdvcmtpbmcgY29weSBub3cgaW4gJHtzdWJkaXIpL01ha2VmaWxlLnRlbQotCi0gICAgICAgICAgICAjIENvbmRpdGlvbmFsaXplIHRoZSBtYWtlZmlsZSBmb3IgdGhpcyB0YXJnZXQuCi0gICAgICAgICAgICBybSAtZiAke01ha2VmaWxlfQotICAgICAgICAgICAgY2FzZSAiJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSBtdiAke3N1YmRpcn0vTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0ke3NyY2Rpcn0vJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZCAtZSAiL14jIyMjLyAgciAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSIgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSA+ICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSAke01ha2VmaWxlfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9Ci0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgIyB3b3JraW5nIGNvcHkgbm93IGluICR7TWFrZWZpbGV9Ci0KLSAgICAgICAgICAgICMgRW1pdCB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhpcyBwYWNrYWdlJ3MgbWFjcm9zLgotICAgICAgICAgICAgcm0gLWYgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotICAgICAgICAgICAgY2FzZSAiJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgbXYgJHtNYWtlZmlsZX0gJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSA7OwotICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgISAtZiAke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VfbWFrZWZpbGVfZnJhZz0ke3NyY2Rpcn0vJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9Ci0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbIC1mICR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICIvXiMjIyMvICByICR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSIgJHtNYWtlZmlsZX0gPiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBFeHBlY3RlZCBwYWNrYWdlIG1ha2VmaWxlIGZyYWdtZW50IFwiJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9XCIgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBpcyBtaXNzaW5nIGluICR7UFdEPWBwd2RgfS4gMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYgJHtNYWtlZmlsZX0gJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICAjIHJlYWwgY29weSBub3cgaW4gJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotCi0gICAgICAgICAgICAjIHByZXBlbmQgd2FybmluZyBhYm91dCBlZGl0dGluZywgYW5kIGEgYnVuY2ggb2YgdmFyaWFibGVzLgotICAgICAgICAgICAgcm0gLWYgJHtNYWtlZmlsZX0KLSAgICAgICAgICAgIGNhdCA+ICR7TWFrZWZpbGV9IDw8RU9GCi0jICR7Tk9fRURJVH0KLVZQQVRIID0gJHttYWtlc3JjZGlyfQotbGlua3MgPSAke2NvbmZpZ2xpbmtzfQotaG9zdF9hbGlhcyA9ICR7aG9zdF9hbGlhc30KLWhvc3RfY3B1ID0gJHtob3N0X2NwdX0KLWhvc3RfdmVuZG9yID0gJHtob3N0X3ZlbmRvcn0KLWhvc3Rfb3MgPSAke2hvc3Rfb3N9Ci1ob3N0X2Nhbm9uaWNhbCA9ICR7aG9zdF9jcHV9LSR7aG9zdF92ZW5kb3J9LSR7aG9zdF9vc30KLXRhcmdldF9hbGlhcyA9ICR7dGFyZ2V0X2FsaWFzfQotdGFyZ2V0X2NwdSA9ICR7dGFyZ2V0X2NwdX0KLXRhcmdldF92ZW5kb3IgPSAke3RhcmdldF92ZW5kb3J9Ci10YXJnZXRfb3MgPSAke3RhcmdldF9vc30KLXRhcmdldF9jYW5vbmljYWwgPSAke3RhcmdldF9jcHV9LSR7dGFyZ2V0X3ZlbmRvcn0tJHt0YXJnZXRfb3N9Ci1FT0YKLQkgICAgY2FzZSAiJHtidWlsZH0iIGluCi0JICAgICAgIiIpIDs7Ci0JICAgICAgKikgIGNhdCA+PiAke01ha2VmaWxlfSA8PCBFT0YKLWJ1aWxkX2FsaWFzID0gJHtidWlsZF9hbGlhc30KLWJ1aWxkX2NwdSA9ICR7YnVpbGRfY3B1fQotYnVpbGRfdmVuZG9yID0gJHtidWlsZF92ZW5kb3J9Ci1idWlsZF9vcyA9ICR7YnVpbGRfb3N9Ci1idWlsZF9jYW5vbmljYWwgPSAke2J1aWxkX2NwdX0tJHtidWlsZF92ZW5kb3J9LSR7YnVpbGRfb3N9Ci1FT0YKLQkgICAgZXNhYwotCi0gICAgICAgICAgICBjYXNlICIke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSA7OwotICAgICAgICAgICAgICAvKikgZWNobyBwYWNrYWdlX21ha2VmaWxlX2ZyYWcgPSAke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgICAqKSAgZWNobyBwYWNrYWdlX21ha2VmaWxlX2ZyYWcgPSAke2ludnN1YmRpcn0ke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgZXNhYwotCi0gICAgICAgICAgICBjYXNlICIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIDs7Ci0gICAgICAgICAgICAgIC8qKSBlY2hvIHRhcmdldF9tYWtlZmlsZV9mcmFnID0gJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgICAqKSAgZWNobyB0YXJnZXRfbWFrZWZpbGVfZnJhZyA9ICR7aW52c3ViZGlyfSR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9ID4+JHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgIGVzYWMKLQotICAgICAgICAgICAgY2FzZSAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgOzsKLSAgICAgICAgICAgICAgLyopIGVjaG8gaG9zdF9tYWtlZmlsZV9mcmFnID0gJHtob3N0X21ha2VmaWxlX2ZyYWd9ID4+JHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgICAgKikgIGVjaG8gaG9zdF9tYWtlZmlsZV9mcmFnID0gJHtpbnZzdWJkaXJ9JHtob3N0X21ha2VmaWxlX2ZyYWd9ID4+JHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgIGVzYWMKLQotICAgICAgICAgICAgaWYgWyAiJHtzaXRlX21ha2VmaWxlX2ZyYWd9IiAhPSAiIiBdIDsgdGhlbgotICAgICAgICAgICAgICAgIGVjaG8gc2l0ZV9tYWtlZmlsZV9mcmFnID0gJHtpbnZzdWJkaXJ9JHtzaXRlX21ha2VmaWxlX2ZyYWd9ID4+JHtNYWtlZmlsZX0KLSAgICAgICAgICAgIGZpIAotCi0JICAgICMgcmVjb3JkIGlmIHdlIHdhbnQgdG8gYnVpbGQgc2hhcmVkIGxpYnMuCi0JICAgIGlmIHRlc3QgLXogIiR7ZW5hYmxlX3NoYXJlZH0iOyB0aGVuCi0JICAgICAgICBlY2hvIGVuYWJsZV9zaGFyZWQgPSBubyA+PiAke01ha2VmaWxlfQotCSAgICBlbHNlCi0JICAgICAgICBlY2hvIGVuYWJsZV9zaGFyZWQgPSAke2VuYWJsZV9zaGFyZWR9ID4+ICR7TWFrZWZpbGV9Ci0JICAgIGZpCi0JICAgICMgcmVjb3JkIGlmIHdlIHdhbnQgdG8gcnVtdGltZSBsaWJyYXJ5IHN0dWZmIGluc3RhbGxlZCBpbiBsaWJzdWJkaXIuCi0JICAgIGlmIHRlc3QgLXogIiR7ZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzfSI7IHRoZW4KLQkgICAgICAgIGVjaG8gZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzID0gbm8gPj4gJHtNYWtlZmlsZX0KLQkgICAgZWxzZQotCSAgICAgICAgZWNobyBlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnMgPSAke2VuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlic30gPj4gJHtNYWtlZmlsZX0KLQkgICAgZmkKLQotCSAgICAjIEVtaXQgYSBtYWNybyB3aGljaCBkZXNjcmliZXMgdGhlIGZpbGUgY29udGFpbmluZyBnY2MncwotCSAgICAjIHZlcnNpb24gbnVtYmVyLgotCSAgICBlY2hvIGdjY192ZXJzaW9uX3RyaWdnZXIgPSAke2djY192ZXJzaW9uX3RyaWdnZXJ9ID4+ICR7TWFrZWZpbGV9Ci0JICAgICMgQW5kIGVtaXQgYSBtYWNybyBkZWZpbmluZyBnY2MncyB2ZXJzaW9uIG51bWJlci4KLQkgICAgZWNobyBnY2NfdmVyc2lvbiA9ICR7Z2NjX3ZlcnNpb259ID4+ICR7TWFrZWZpbGV9Ci0KLSAgICAgICAgICAgICMgcmVzZXQgcHJlZml4LCBleGVjX3ByZWZpeCwgc3JjZGlyLCBTVUJESVJTLCBOT05TVUJESVJTLAotICAgICAgICAgICAgIyByZW1vdmUgYW55IGZvcm0gZmVlZHMuCi0gICAgICAgICAgICBpZiBbIC16ICIke3N1YmRpcnN9IiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgcm0gLWYgJHtzdWJkaXJ9L01ha2VmaWxlLnRtMgotICAgICAgICAgICAgICAgIHNlZCAtZSAiczpeU1VCRElSU1sgCV0qPS4qJDpTVUJESVJTID0gJHtjb25maWdkaXJzfToiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInM6Xk5PTlNVQkRJUlNbIAldKj0uKiQ6Tk9OU1VCRElSUyA9ICR7bm9jb25maWdkaXJzfToiIFwKLSAgICAgICAgICAgICAgICAgICAgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSA+ICR7c3ViZGlyfS9NYWtlZmlsZS50bTIKLSAgICAgICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0gICAgICAgICAgICAgICAgbXYgJHtzdWJkaXJ9L01ha2VmaWxlLnRtMiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCi0JICAgIGZpCi0JICAgIHNlZCAgICAgLWUgInN8XnByZWZpeFsgCV0qPS4qJHxwcmVmaXggPSAke3ByZWZpeH18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5leGVjX3ByZWZpeFsgCV0qPS4qJHxleGVjX3ByZWZpeCA9ICR7ZXhlY19wcmVmaXh9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xeYmluZGlyWyAJXSo9LiokfGJpbmRpciA9ICR7YmluZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XnNiaW5kaXJbIAldKj0uKiR8c2JpbmRpciA9ICR7c2JpbmRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5saWJleGVjZGlyWyAJXSo9LiokfGxpYmV4ZWNkaXIgPSAke2xpYmV4ZWNkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xeZGF0YWRpclsgCV0qPS4qJHxkYXRhZGlyID0gJHtkYXRhZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XnN5c2NvbmZkaXJbIAldKj0uKiR8c3lzY29uZmRpciA9ICR7c3lzY29uZmRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5zaGFyZWRzdGF0ZWRpclsgCV0qPS4qJHxzaGFyZWRzdGF0ZWRpciA9ICR7c2hhcmVkc3RhdGVkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xebG9jYWxzdGF0ZWRpclsgCV0qPS4qJHxsb2NhbHN0YXRlZGlyID0gJHtsb2NhbHN0YXRlZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmxpYmRpclsgCV0qPS4qJHxsaWJkaXIgPSAke2xpYmRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5pbmNsdWRlZGlyWyAJXSo9LiokfGluY2x1ZGVkaXIgPSAke2luY2x1ZGVkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xeb2xkaW5jbHVkZWRpclsgCV0qPS4qJHxvbGRpbmNsdWRlZGlyID0gJHtvbGRpbmNsdWRlZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmluZm9kaXJbIAldKj0uKiR8aW5mb2RpciA9ICR7aW5mb2Rpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5tYW5kaXJbIAldKj0uKiR8bWFuZGlyID0gJHttYW5kaXJ9fCIgXAotCQkgICAgLWUgIi9eQ0NbIAldKj0vewotCQkJOmxvb3AxCi0JCQkvXFxcXCQvIE4KLQkJCXMvXFxcXFxcbi8vZwotCQkJdCBsb29wMQotCQkJcyVeQ0NbIAldKj0uKiQlQ0MgPSAke0NDfSUKLQkJCX0iIFwKLQkJICAgIC1lICIvXkNYWFsgCV0qPS97Ci0JCQk6bG9vcDIKLQkJCS9cXFxcJC8gTgotCQkJcy9cXFxcXFxuLy9nCi0JCQl0IGxvb3AyCi0JCQlzJV5DWFhbIAldKj0uKiQlQ1hYID0gJHtDWFh9JQotCQkJfSIgXAotCQkgICAgLWUgIi9eQ0ZMQUdTWyAJXSo9L3sKLQkJCTpsb29wMwotCQkJL1xcXFwkLyBOCi0JCQlzL1xcXFxcXG4vL2cKLQkJCXQgbG9vcDMKLQkJCXMlXkNGTEFHU1sgCV0qPS4qJCVDRkxBR1MgPSAke0NGTEFHU30lCi0JCQl9IiBcCi0JCSAgICAtZSAiL15DWFhGTEFHU1sgCV0qPS97Ci0JCQk6bG9vcDQKLQkJCS9cXFxcJC8gTgotCQkJcy9cXFxcXFxuLy9nCi0JCQl0IGxvb3A0Ci0JCQlzJV5DWFhGTEFHU1sgCV0qPS4qJCVDWFhGTEFHUyA9ICR7Q1hYRkxBR1N9JQotCQkJfSIgXAotCQkgICAgLWUgInN8XlNIRUxMWwkgXSo9LiokfFNIRUxMID0gJHtjb25maWdfc2hlbGx9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xec3JjZGlyWyAJXSo9LiokfHNyY2RpciA9ICR7bWFrZXNyY2Rpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzLwwvLyIgXAotICAgICAgICAgICAgICAgICAgICAtZSAiczpecHJvZ3JhbV9wcmVmaXhbIAldKj0uKiQ6cHJvZ3JhbV9wcmVmaXggPSAke3Byb2dyYW1fcHJlZml4fToiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInM6XnByb2dyYW1fc3VmZml4WyAJXSo9LiokOnByb2dyYW1fc3VmZml4ID0gJHtwcm9ncmFtX3N1ZmZpeH06IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzOl5wcm9ncmFtX3RyYW5zZm9ybV9uYW1lWyAJXSo9LiokOnByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSAke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9OiIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xedG9vbGRpclsgCV0qPS4qJHx0b29sZGlyID0gJHt0b29sZGlyfXwiIFwKLQkJICAgIC1lICJzOl5ERUZBVUxUX1lBQ0NbCSBdKj0uKiQ6REVGQVVMVF9ZQUNDID0gJHtERUZBVUxUX1lBQ0N9OiIgXAotCQkgICAgLWUgInM6XkRFRkFVTFRfTEVYWwkgXSo9LiokOkRFRkFVTFRfTEVYID0gJHtERUZBVUxUX0xFWH06IiBcCi0JCSAgICAtZSAiczpeREVGQVVMVF9NNFsgIF0qPS4qJDpERUZBVUxUX000ID0gJHtERUZBVUxUX000fToiIFwKLSAgICAgICAgICAgICAgICAgICAgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSA+PiAke01ha2VmaWxlfQotICAKLQotCSAgICAjIElmIHRoaXMgaXMgYSBDYW5hZGlhbiBDcm9zcywgcHJlc2V0IHRoZSB2YWx1ZXMgb2YgbWFueSBtb3JlCi0JICAgICMgdG9vbHMuCi0JICAgIGlmIFsgIiR7YnVpbGR9IiAhPSAiJHtob3N0fSIgXTsgdGhlbgotCQlmb3IgdmFyIGluICR7dG9vbHN9OyBkbwotCQkgICAgdmFsPWBldmFsICdlY2hvICQnIiR7dmFyfSJgCi0JCSAgICBzZWQgLWUgIi9eJHt2YXJ9WyAJXSo9L3sKLQkJCSAgIDpsb29wMQotCQkJICAgL1xcXFwkLyBOCi0JCQkgICAvXFxcXCQvIGIgbG9vcDEKLQkJCSAgIHMvXFxcXFxcbi8vZwotCQkJICAgcyVeJHt2YXJ9WyAJXSo9LiokJSR7dmFyfSA9ICR7dmFsfSUKLQkJCSAgIH0iICR7TWFrZWZpbGV9ID4gJHtNYWtlZmlsZX0udGVtCi0JCSAgICBtdiAtZiAke01ha2VmaWxlfS50ZW0gJHtNYWtlZmlsZX0KLQkJZG9uZQotCSAgICBmaQotCi0gICAgICAgICAgICAjIGZpbmFsIGNvcHkgbm93IGluICR7TWFrZWZpbGV9Ci0KLSAgICAgICAgZWxzZQotICAgICAgICAgICBlY2hvICJObyBNYWtlZmlsZS5pbiBmb3VuZCBpbiAke3NyY2Rpcn0vJHtzdWJkaXJ9LCB1bmFibGUgdG8gY29uZmlndXJlIiAxPiYyCi0gICAgICAgIGZpCi0KLSAgICAgICAgcm0gLWYgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotCi0gICAgICAgIGNhc2UgIiR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgIiIpIHVzaW5nPSA7OwotICAgICAgICAqKSB1c2luZz0iYW5kIFwiJHtob3N0X21ha2VmaWxlX2ZyYWd9XCIiIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBjYXNlICIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgIiIpIDs7Ci0gICAgICAgICopIHVzaW5nPSIke3VzaW5nfSBhbmQgXCIke3RhcmdldF9tYWtlZmlsZV9mcmFnfVwiIiA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgY2FzZSAiJHtzaXRlX21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAiIikgOzsKLSAgICAgICAgKikgdXNpbmc9IiR7dXNpbmd9IGFuZCBcIiR7c2l0ZV9tYWtlZmlsZV9mcmFnfVwiIiA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgbmV3dXNpbmc9YGVjaG8gIiR7dXNpbmd9IiB8IHNlZCAncy9hbmQvdXNpbmcvJ2AKLSAgICAgICAgdXNpbmc9JHtuZXd1c2luZ30KLSAgICAgICAgZWNobyAiQ3JlYXRlZCBcIiR7TWFrZWZpbGV9XCIgaW4iICR7UFdEPWBwd2RgfSAke3VzaW5nfQotCi0gICAgICAgIC4gJHt0bXBmaWxlfS5wb3MKLQotICAgICAgICAjIGRlc2NyaWJlIHRoZSBjaG9zZW4gY29uZmlndXJhdGlvbiBpbiBjb25maWcuc3RhdHVzLgotICAgICAgICAjIE1ha2UgdGhhdCBmaWxlIGEgc2hlbGxzY3JpcHQgd2hpY2ggd2lsbCByZWVzdGFibGlzaAotICAgICAgICAjIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24uICBVc2VkIGluIE1ha2VmaWxlcyB0byByZWJ1aWxkCi0gICAgICAgICMgTWFrZWZpbGVzLgotCi0gICAgICAgIGNhc2UgIiR7bm9yZWN1cnNpb259IiBpbgotICAgICAgICAiIikgYXJndW1lbnRzPSIke2FyZ3VtZW50c30gLS1ub3JlY3Vyc2lvbiIgOzsKLSAgICAgICAgKikgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGlmIFsgJHtzdWJkaXJ9ID0gLiBdIDsgdGhlbgotICAgICAgICAgICAgZWNobyAiIyEvYmluL3NoCi0jICR7Tk9fRURJVH0KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93czoKLSR7cHJvZ25hbWV9IiAke2FyZ3VtZW50c30gICIKLSMgJHt1c2luZ30iID4gJHtzdWJkaXJ9L2NvbmZpZy5uZXcKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyAiIyEvYmluL3NoCi0jICR7Tk9fRURJVH0KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93czoKLWNkICR7aW52c3ViZGlyfQotJHtwcm9nbmFtZX0iICR7YXJndW1lbnRzfSAgIgotIyAke3VzaW5nfSIgPiAke3N1YmRpcn0vY29uZmlnLm5ldwotICAgICAgICBmaQotICAgICAgICBjaG1vZCBhK3ggJHtzdWJkaXJ9L2NvbmZpZy5uZXcKLSAgICAgICAgaWYgWyAtciAke3N1YmRpcn0vY29uZmlnLmJhY2sgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBtdiAtZiAke3N1YmRpcn0vY29uZmlnLmJhY2sgJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMKLSAgICAgICAgZmkKLQkke2NvbmZpZ19zaGVsbH0gJHttb3ZlaWZjaGFuZ2V9ICR7c3ViZGlyfS9jb25maWcubmV3ICR7c3ViZGlyfS9jb25maWcuc3RhdHVzCi0gICAgICAgIDs7Ci0KLSAgICAqKSAgcm0gLWYgJHtNYWtlZmlsZX0gJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMgJHtsaW5rc30gOzsKLSAgICBlc2FjCi1kb25lCi0KLSMgSWYgdGhlcmUgYXJlIHN1YmRpcmVjdG9yaWVzLCB0aGVuIHJlY3VyLgotaWYgWyAteiAiJHtub3JlY3Vyc2lvbn0iIF0gJiYgWyAtbiAiJHtjb25maWdkaXJzfSIgXSA7IHRoZW4gCi0gICAgICAgIGZvciBjb25maWdkaXIgaW4gJHtjb25maWdkaXJzfSAke2V4dHJhY29uZmlnZGlyc30gOyBkbwotCi0JCSMgSWYgY29uZmlnZGlyIGNvbnRhaW5zICcsJyBpdCBpcwotCQkjIHNyY2RpcixidWlsZGRpcix0YXJnZXRfYWxpYXMKLQkJIyBUaGVzZSBjb21lIGZyb20gZXh0cmFjb25maWdkaXJzLgotCQljYXNlICR7Y29uZmlnZGlyfSBpbgotCQkqLCopCi0JCSAgICBldmFsIGBlY2hvICR7Y29uZmlnZGlyfSB8IHNlZCAtZSAncy9cKFteLF0qXCksXChbXixdKlwpLFwoLipcKS9jZmdfZGlyPVwxIGJsZF9kaXI9XDIgdGd0X2FsaWFzPVwzLydgCi0JCSAgICA7OwotCQkqKQotCQkgICAgY2ZnX2Rpcj0ke2NvbmZpZ2Rpcn0KLQkJICAgIGJsZF9kaXI9JHtjb25maWdkaXJ9Ci0JCSAgICB0Z3RfYWxpYXM9JHt0YXJnZXRfYWxpYXN9Ci0JCSAgICA7OwotCQllc2FjCi0KLSAgICAgICAgICAgICAgICBpZiBbIC1kICR7c3JjZGlyfS8ke2NmZ19kaXJ9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBldmFsIGVjaG8gQ29uZmlndXJpbmcgJHtjb25maWdkaXJ9Li4uICR7cmVkaXJlY3R9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NyY2Rpcn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAiLiIpIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBbICEgLWQgLi8ke2JsZF9kaXJ9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWtkaXIgLi8ke2JsZF9kaXJ9IDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgIiR7cHJvZ25hbWV9OiBjb3VsZCBub3QgbWFrZSAke1BXRD1gcHdkYH0vJHtibGRfZGlyfSIgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMKLQotICAgICAgICAgICAgICAgICAgICAgICAgUE9QRElSPSR7UFdEPWBwd2RgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2QgJHtibGRfZGlyfSAKLQotIyMjIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIHNyY2RpcgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzcmNkaXJ9IiBpbgotICAgICAgICAgICAgICAgICAgICAgICAgIi4iKSBuZXdzcmNkaXI9JHtzcmNkaXJ9IDs7ICMgbm8gLXNyY2RpciBvcHRpb24uICBXZSdyZSBidWlsZGluZyBpbiBwbGFjZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKSAjIGFic29sdXRlIHBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3c3JjZGlyPSR7c3JjZGlyfS8ke2NmZ19kaXJ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2Rpcm9wdGlvbj0iLS1zcmNkaXI9JHtuZXdzcmNkaXJ9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgICAgICAgICAgPzoqKSAjIGFic29sdXRlIHBhdGggb24gd2luMzIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3c3JjZGlyPSR7c3JjZGlyfS8ke2NmZ19kaXJ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2Rpcm9wdGlvbj0iLS1zcmNkaXI9JHtuZXdzcmNkaXJ9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgICAgICAgICAgKikgIyBvdGhlcndpc2UgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3c3JjZGlyPS4uLyR7c3JjZGlyfS8ke2NmZ19kaXJ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2Rpcm9wdGlvbj0iLS1zcmNkaXI9JHtuZXdzcmNkaXJ9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgICAgICAgICAgICAgZXNhYwotCi0JCQkjIEhhbmRsZSAtLWNhY2hlLWZpbGU9Li4vWFhYCi0JCQljYXNlICIke2NhY2hlX2ZpbGV9IiBpbgotCQkJIiIpICMgZW1wdHkKLQkJCQk7OwotCQkJLyopICMgYWJzb2x1dGUgcGF0aAotCQkJCWNhY2hlX2ZpbGVfb3B0aW9uPSItLWNhY2hlLWZpbGU9JHtjYWNoZV9maWxlfSIKLQkJCQk7OwotCQkJPzoqKSAjIGFic29sdXRlIHBhdGggb24gd2luMzIKLQkJCQljYWNoZV9maWxlX29wdGlvbj0iLS1jYWNoZS1maWxlPSR7Y2FjaGVfZmlsZX0iCi0JCQkJOzsKLQkJCSopICMgcmVsYXRpdmUgcGF0aAotCQkJCWNhY2hlX2ZpbGVfb3B0aW9uPSItLWNhY2hlLWZpbGU9Li4vJHtjYWNoZV9maWxlfSIKLQkJCQk7OwotCQkJZXNhYwotCi0jIyMgY2hlY2sgZm9yIGd1ZXN0ZWQgY29uZmlndXJlLCBvdGhlcndpc2UgZml4IHBvc3NpYmx5IHJlbGF0aXZlIHByb2duYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiBbIC1mICR7bmV3c3JjZGlyfS9jb25maWd1cmUgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjcHJvZz0ke25ld3NyY2Rpcn0vY29uZmlndXJlCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGlmIFsgLWYgJHtuZXdzcmNkaXJ9L2NvbmZpZ3VyZS5pbiBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3Byb2duYW1lfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyopICAgICByZWNwcm9nPSR7cHJvZ25hbWV9IDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID86KikgICAgcmVjcHJvZz0ke3Byb2duYW1lfSA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKSAgICAgIHJlY3Byb2c9Li4vJHtwcm9nbmFtZX0gOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNhYwotCQkJZWxzZQotCQkJCWV2YWwgZWNobyBObyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGluICR7Y2ZnX2Rpcn0gJHtyZWRpcmVjdH0KLQkJCQlyZWNwcm9nPQotICAgICAgICAgICAgICAgICAgICAgICAgZmkKLQotIyMjIFRoZSByZWN1cnNpb24gbGluZSBpcyBoZXJlLgotCQkJaWYgWyAhIC16ICIke3JlY3Byb2d9IiBdIDsgdGhlbgotCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIGV2YWwgJHtjb25maWdfc2hlbGx9ICR7cmVjcHJvZ30gJHt2ZXJib3NlfSAke2J1aWxkb3B0fSAtLWhvc3Q9JHtob3N0X2FsaWFzfSAtLXRhcmdldD0ke3RndF9hbGlhc30gXAotICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgJHtwcmVmaXhvcHRpb259ICR7dG1wZGlyb3B0aW9ufSAke2V4ZWNfcHJlZml4b3B0aW9ufSBcCi0gICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAke3NyY2Rpcm9wdGlvbn0gJHtkaXJvcHRpb25zfSAke3Byb2dyYW1fcHJlZml4b3B0aW9ufSAke3Byb2dyYW1fc3VmZml4b3B0aW9ufSAke3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb259ICR7c2l0ZV9vcHRpb259ICR7d2l0aG9wdGlvbnN9ICR7d2l0aG91dG9wdGlvbnN9ICR7ZW5hYmxlb3B0aW9uc30gJHtkaXNhYmxlb3B0aW9uc30gJHtmbG9hdGluZ19wb2ludG9wdGlvbn0gJHtjYWNoZV9maWxlX29wdGlvbn0gJHtyZW1vdmluZ30gJHtvdGhlcl9vcHRpb25zfSAke3JlZGlyZWN0fSA7IHRoZW4KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUKLSAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlCi0JCQkJCWVjaG8gQ29uZmlndXJlIGluIGBwd2RgIGZhaWxlZCwgZXhpdGluZy4gMT4mMgotICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgICAgICAgICAgICAgICAJZmkKLQkJCWZpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNkICR7UE9QRElSfQotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLWZpCi0KLSMgUGVyZm9ybSB0aGUgc2FtZSBjbGVhbnVwIGFzIHRoZSB0cmFwIGhhbmRsZXIsIG1pbnVzIHRoZSAiZXhpdCAxIiBvZiBjb3Vyc2UsCi0jIGFuZCByZXNldCB0aGUgdHJhcCBoYW5kbGVyLgotcm0gLWYgJHt0bXBmaWxlfS5jb20gJHt0bXBmaWxlfS50Z3QgJHt0bXBmaWxlfS5oc3QgJHt0bXBmaWxlfS5wb3MKLXRyYXAgMAotCi1leGl0IDAKLQotIwotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIGZpbGwtY29sdW1uOiAxMzEKLSMgRW5kOgotIwotCi0jIGVuZCBvZiBjb25maWd1cmUKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyMjFhNi4uMDAwMDAwMAotLS0gYS9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMTkxICswLDAgQEAKLSMhIC9iaW4vYmFzaAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCBmcmFnbWVudCB0aGF0IHN1cHBsaWVzIHRoZSBpbmZvcm1hdGlvbgotIyMgbmVjZXNzYXJ5IHRvIHRhaWxvciBhIHRlbXBsYXRlIGNvbmZpZ3VyZSBzY3JpcHQgaW50byB0aGUgY29uZmlndXJlCi0jIyBzY3JpcHQgYXBwcm9wcmlhdGUgZm9yIHRoaXMgZGlyZWN0b3J5LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNoZWNrCi0jIyBhbnkgZXhpc3RpbmcgY29uZmlndXJlIHNjcmlwdC4gIAotCi0jIyBCZSB3YXJuZWQsIHRoZXJlIGFyZSB0d28gdHlwZXMgb2YgY29uZmlndXJlLmluIGZpbGVzLiAgVGhlcmUgYXJlIHRob3NlCi0jIyB1c2VkIGJ5IEF1dG9jb25mLCB3aGljaCBhcmUgbWFjcm9zIHdoaWNoIGFyZSBleHBhbmRlZCBpbnRvIGEgY29uZmlndXJlCi0jIyBzY3JpcHQgYnkgYXV0b2NvbmYuICBUaGUgb3RoZXIgc29ydCwgb2Ygd2hpY2ggdGhpcyBpcyBvbmUsIGlzIGV4ZWN1dGVkCi0jIyBieSBDeWdudXMgY29uZmlndXJlLiAgCi0KLSMjIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlIHR3byBzeXN0ZW1zLCBjaGVjayBvdXQgdGhlIGRvY3VtZW50YXRpb24KLSMjIGZvciAnQXV0b2NvbmYnIChhdXRvY29uZi50ZXhpKSBhbmQgJ0NvbmZpZ3VyZScgKGNvbmZpZ3VyZS50ZXhpKS4gIAotCi0jICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyMgVG8gYWRkIGEgbmV3IGRpcmVjdG9yeSB0byB0aGUgdHJlZSwgZmlyc3QgY2hvb3NlIHdoZXRoZXIgaXQgaXMgYSB0YXJnZXQKLSMjIyBvciBhIGhvc3QgZGVwZW5kZW50IHRvb2wuICBUaGVuIHB1dCBpdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBsaXN0Ci0jIyMgKGxpYnJhcnkgb3IgdG9vbHMsIGhvc3Qgb3IgdGFyZ2V0KSwgZG9pbmcgYSBkZXBlbmRlbmN5IHNvcnQuICBGb3IKLSMjIyBleGFtcGxlLCBnZGIgcmVxdWlyZXMgdGhhdCBieWFjYyAob3IgYmlzb24pIGJlIGJ1aWx0IGZpcnN0LCBzbyBpdCBpcyBpbgotIyMjIHRoZSAke2hvc3RfdG9vbHN9IGxpc3QgYWZ0ZXIgYnlhY2MgYW5kIGJpc29uLiAgCi0KLQotIyB0aGVzZSBsaWJyYXJpZXMgYXJlIHVzZWQgYnkgdmFyaW91cyBwcm9ncmFtcyBidWlsdCBmb3IgdGhlIGhvc3QgZW52aXJvbm1lbnQKLSMKLWhvc3RfbGlicz0iaW50bCBtbWFsbG9jIGxpYmliZXJ0eSBvcGNvZGVzIGJmZCByZWFkbGluZSBnYXNoIGRiIHRjbCB0ayB0Y2w4LjEgdGs4LjEgdGNsWCBpdGNsIHRpeCBsaWJndWkiCi0KLWlmIFsgIiR7ZW5hYmxlX2dkYmd1aX0iID0gInllcyIgXSA7IHRoZW4KLQlob3N0X2xpYnM9IiR7aG9zdF9saWJzfSBsaWJndWkiCi1maQotCi0jIHRoZXNlIHRvb2xzIGFyZSBidWlsdCBmb3IgdGhlIGhvc3QgZW52aXJvbm1lbnQKLSMgTm90ZSwgdGhlIHBvd2VycGMtZWFiaSBidWlsZCBkZXBlbmRzIG9uIHNpbSBvY2N1cnJpbmcgYmVmb3JlIGdkYiBpbiBvcmRlciB0bwotIyBrbm93IHRoYXQgd2UgYXJlIGJ1aWxkaW5nIHRoZSBzaW11bGF0b3IuCi1ob3N0X3Rvb2xzPSJ0ZXhpbmZvIGJ5YWNjIGZsZXggYmlzb24gYmludXRpbHMgbGQgZ2FzIGdjYyBzaW0gZ2RiIG1ha2UgcGF0Y2ggcHJtcyBzZW5kLXByIGdwcm9mIGdkYnRlc3QgdGdhcyBldGMgZXhwZWN0IGRlamFnbnUgYXNoIGJhc2ggYnppcDIgbTQgYXV0b2NvbmYgYXV0b21ha2UgbGlidG9vbCBpc3BlbGwgZ3JlcCBkaWZmIHJjcyBjdnNzcmMgZmlsZXV0aWxzIHNoZWxsdXRpbHMgdGltZSB0ZXh0dXRpbHMgd2RpZmYgZmluZCBlbWFjcyBlbWFjczE5IHV1ZGVjb2RlIGhlbGxvIHRhciBnemlwIGluZGVudCByZWNvZGUgcmVsZWFzZSBzZWQgdXRpbHMgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBnYXdrIGZpbmR1dGlscyBzbmF2aWdhdG9yIGxpYnRvb2wgZ2V0dGV4dCB6aXAiCi0KLSMgdGhlc2UgbGlicmFyaWVzIGFyZSBidWlsdCBmb3IgdGhlIHRhcmdldCBlbnZpcm9ubWVudCwgYW5kIGFyZSBidWlsdCBhZnRlcgotIyB0aGUgaG9zdCBsaWJyYXJpZXMgYW5kIHRoZSBob3N0IHRvb2xzICh3aGljaCBtYXkgYmUgYSBjcm9zcyBjb21waWxlcikKLSMKLXRhcmdldF9saWJzPSJ0YXJnZXQtbGliaWJlcnR5IFwKLQkJdGFyZ2V0LWxpYmdsb3NzIFwKLQkJdGFyZ2V0LW5ld2xpYiBcCi0JCXRhcmdldC1saWJpbyBcCi0JCXRhcmdldC1saWJyeCBcCi0JCXRhcmdldC1saWJzdGRjKysgXAotCQl0YXJnZXQtbGliZysrIgotCi0jIHRoZXNlIHRvb2xzIGFyZSBidWlsdCB1c2luZyB0aGUgdGFyZ2V0IGxpYnMsIGFuZCBhcmUgaW50ZW5kZWQgdG8gcnVuIG9ubHkKLSMgaW4gdGhlIHRhcmdldCBlbnZpcm9ubWVudAotIwotIyBub3RlOiBhbnkgcHJvZ3JhbSB0aGF0ICp1c2VzKiBsaWJyYXJpZXMgdGhhdCBhcmUgaW4gdGhlICJ0YXJnZXRfbGlicyIKLSMgbGlzdCBiZWxvbmdzIGluIHRoaXMgbGlzdC4gIHRob3NlIHByb2dyYW1zIGFyZSBhbHNvIHZlcnkgbGlrZWx5Ci0jIGNhbmRpZGF0ZXMgZm9yIHRoZSAibmF0aXZlX29ubHkiIGxpc3Qgd2hpY2ggZm9sbG93cwotIwotdGFyZ2V0X3Rvb2xzPSJ0YXJnZXQtZXhhbXBsZXMgdGFyZ2V0LWdyb2ZmIHRhcmdldC1ncGVyZiIKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMgVGhlc2UgdHdvIGxpc3RzIGFyZSBvZiBkaXJlY3RvcmllcyB0aGF0IGFyZSB0byBiZSByZW1vdmVkIGZyb20gdGhlCi0jIyAke2NvbmZpZ2RpcnN9IGxpc3QgZm9yIGVpdGhlciBjcm9zcy1jb21waWxhdGlvbnMgb3IgZm9yIG5hdGl2ZS0KLSMjIGNvbXBpbGF0aW9ucy4gIEZvciBleGFtcGxlLCBpdCBkb2Vzbid0IG1ha2UgdGhhdCBtdWNoIHNlbnNlIHRvCi0jIyBjcm9zcy1jb21waWxlIEVtYWNzLCBub3IgaXMgaXQgdGVycmlibHkgdXNlZnVsIHRvIGNvbXBpbGUgdGFyZ2V0LWxpYmliZXJ0eSBpbgotIyMgYSBuYXRpdmUgZW52aXJvbm1lbnQuICAKLQotIyBkaXJlY3RvcmllcyB0byBiZSBidWlsdCBpbiB0aGUgbmF0aXZlIGVudmlyb25tZW50IG9ubHkKLSMKLSMgVGhpcyBtdXN0IGJlIGEgc2luZ2xlIGxpbmUgYmVjYXVzZSBvZiB0aGUgd2F5IGl0IGlzIHNlYXJjaGVkIGJ5IGdyZXAgaW4KLSMgdGhlIGNvZGUgYmVsb3cuCi1uYXRpdmVfb25seT0iYXV0b2NvbmYgYXV0b21ha2UgbGlidG9vbCBjdnNzcmMgZW1hY3MgZW1hY3MxOSBmaWxldXRpbHMgZmluZCBnYXdrIGdldHRleHQgZ3JlcCBnemlwIGhlbGxvIGluZGVudCBpc3BlbGwgbTQgcmNzIHJlY29kZSBzZWQgc2hlbGx1dGlscyB0YXIgdGV4dHV0aWxzIGdhc2ggdXVkZWNvZGUgd2RpZmYgZ3Byb2YgdGFyZ2V0LWdyb2ZmIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgdGltZSBhc2ggYmFzaCBiemlwMiBwcm1zIHNuYXZpZ2F0b3IgZ251c2VydiB0YXJnZXQtZ3BlcmYiCi0KLSMgZGlyZWN0b3JpZXMgdG8gYmUgYnVpbHQgaW4gYSBjcm9zcyBlbnZpcm9ubWVudCBvbmx5Ci0jCi1jcm9zc19vbmx5PSJ0YXJnZXQtbGliZ2xvc3MgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtY3lnbW9uIHRhcmdldC1vcGNvZGVzIHRhcmdldC1saWJzdHViIgotCi0jIyBBbGwgdG9vbHMgYmVsb25nIGluIG9uZSBvZiB0aGUgZm91ciBjYXRlZ29yaWVzLCBhbmQgYXJlIGFzc2lnbmVkIGFib3ZlCi0jIyBXZSBhc3NpZ24gJHtjb25maWdkaXJzfSB0aGlzIHdheSB0byByZW1vdmUgYWxsIGVtYmVkZGVkIG5ld2xpbmVzLiAgVGhpcwotIyMgaXMgaW1wb3J0YW50IGJlY2F1c2UgY29uZmlndXJlIHdpbGwgY2hva2UgaWYgdGhleSBldmVyIGdldCB0aHJvdWdoLgotIyMgJHtjb25maWdkaXJzfSBpcyBkaXJlY3RvcmllcyB3ZSBidWlsZCB1c2luZyB0aGUgaG9zdCB0b29scy4KLSMjICR7dGFyZ2V0X2NvbmZpZ2RpcnN9IGlzIGRpcmVjdG9yaWVzIHdlIGJ1aWxkIHVzaW5nIHRoZSB0YXJnZXQgdG9vbHMuCi0jCi1jb25maWdkaXJzPWBlY2hvICR7aG9zdF9saWJzfSAke2hvc3RfdG9vbHN9YAotdGFyZ2V0X2NvbmZpZ2RpcnM9YGVjaG8gJHt0YXJnZXRfbGlic30gJHt0YXJnZXRfdG9vbHN9YAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1zcmN0cmlnZ2VyPW1vdmUtaWYtY2hhbmdlCi1zcmNuYW1lPSJnbnUgZGV2ZWxvcG1lbnQgcGFja2FnZSIKLQotIyBUaGlzIGdldHMgc2V0IG5vbi1lbXB0eSBmb3Igc29tZSBuZXQgcmVsZWFzZXMgb2YgcGFja2FnZXMuCi1hcHBkaXJzPSIiCi0KLSMgcGVyLWhvc3Q6Ci0KLSMgV29yayBpbiBkaXN0cmlidXRpb25zIHRoYXQgY29udGFpbiBubyBjb21waWxlciB0b29scywgbGlrZSBBdXRvY29uZi4KLWlmIFsgLWQgJHtzcmNkaXJ9L2NvbmZpZyBdOyB0aGVuCi1jYXNlICIke2hvc3R9IiBpbgotICBtNjhrLWhwLWhwdXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1ocDMwMCIKLSAgICA7OwotICBtNjhrLWFwb2xsby1zeXN2KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtYXBvbGxvNjgiCi0gICAgOzsKLSAgbTY4ay1hcG9sbG8tYnNkKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtYTY4YnNkIgotICAgIDs7Ci0gIG04OGstZGctZGd1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWRndXgiCi0gICAgOzsKLSAgbTg4ay1oYXJyaXMtY3h1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWN4dXgiCi0gICAgOzsKLSAgbTg4ay1tb3Rvcm9sYS1zeXN2KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGVsdGE4OCIKLSAgICA7OwotICBtaXBzKi1kZWMtdWx0cml4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGVjc3RhdGlvbiIKLSAgICA7OwotICBtaXBzKi1uZWMtc3lzdjQqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1uZWN2NCIKLSAgICA7OwotICBtaXBzKi1zZ2ktaXJpeDYqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1pcml4NiIKLSAgICA7OwotICBtaXBzKi1zZ2ktaXJpeDUqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1pcml4NSIKLSAgICA7OwotICBtaXBzKi1zZ2ktaXJpeDQqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1pcml4NCIKLSAgICA7OwotICBtaXBzKi1zZ2ktaXJpeDMqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2IgotICAgIDs7Ci0gIG1pcHMqLSotc3lzdjQqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2NCIKLSAgICA7OwotICBtaXBzKi0qLXN5c3YqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1yaXNjb3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc3lzdjUqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2NSIKLSAgICA7OwotICBpWzM0NTZdODYtKi1kZ3V4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGd1eDM4NiIKLSAgICA7OwotICBpWzM0NTZdODYtbmNyLXN5c3Y0LjMqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1uY3JzdnI0MyIKLSAgICA7OwotICBpWzM0NTZdODYtbmNyLXN5c3Y0KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtbmNyMzAwMCIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zY28zLjJ2NSopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3YiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc2NvKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc2NvIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXVkayopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y1IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWlzYyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3YiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc29sYXJpczIqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2NCIKLSAgICA7OwotICBpWzM0NTZdODYtKi1haXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1haXgzODYiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbXNkb3NkamdwcCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWRqZ3BwIgotICAgIDs7Ci0gICotY3lnd2luKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtY3lnd2luIgotICAgIDs7Ci0gICotbWluZ3czMiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLW1pbmd3MzIiCi0gICAgOzsKLSAgKi1pbnRlcml4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtaW50ZXJpeCIKLSAgICA7OwotICAqLXdpbmRvd3MqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC13aW5kb3dzIgotICAgIDs7Ci0gIHZheC0qLXVsdHJpeDIqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC12YXh1bHQyIgotICAgIDs7Ci0gICotKi1zb2xhcmlzMiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXNvbGFyaXMiCi0gICAgOzsKLSAgbTY4ay1zdW4tc3Vub3MqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zdW4zIgotICAgIDs7Ci0gICotaHAtaHB1eFs3OF0qKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1ocHV4OCIKLSAgICA7OwotICAqLWhwLWhwdXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1ocHV4IgotICAgIDs7Ci0gICotKi1oaXV4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtaHB1eCIKLSAgICA7OwotICByczYwMDAtKi1seW54b3MqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1seW54cnM2ayIKLSAgICA7OwotICAqLSotbHlueG9zKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtbHlueG9zIgotICAgIDs7Ci0gICotKi1haXg0LlszNDU2Nzg5XSogfCAqLSotYWl4WzU2Nzg5XS4qKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1haXg0MyIKLSAgICA7OwotICAqLSotc3lzdjQqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2NCIKLSAgICA7OwotICAqLSotc3lzdiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3YiCi0gICAgOzsKLWVzYWMKLWZpCi0KLSMgSWYgd2UgYXJlbid0IGdvaW5nIHRvIGJlIHVzaW5nIGdjYywgc2VlIGlmIHdlIGNhbiBleHRyYWN0IGEgZGVmaW5pdGlvbgotIyBvZiBDQyBmcm9tIHRoZSBmcmFnbWVudC4KLWlmIFsgLXogIiR7Q0N9IiBdICYmIFsgIiR7YnVpbGR9IiA9ICIke2hvc3R9IiBdOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvdW5kPQotICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgaWYgdGVzdCAtZiAkZGlyL2djYzsgdGhlbgotICAgICAgZm91bmQ9eWVzCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkc2F2ZV9pZnMiCi0gIGlmIFsgLXogIiR7Zm91bmR9IiBdICYmIFsgLW4gIiR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgXSAmJiBbIC1mICIke3NyY2Rpcn0vJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBdOyB0aGVuCi0gICAgeHg9YHNlZCAtbiAtZSAncy9eWyAJXSpDQ1sgCV0qPVsgCV0qXCguKlwpJC9cMS9wJyA8ICR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ31gCi0gICAgaWYgWyAtbiAiJHt4eH0iIF0gOyB0aGVuCi0gICAgICBDQz0keHgKLSAgICBmaQotICBmaQotZmkKLQotIyBXZSBkZWZhdWx0IHRvIC0td2l0aC1zaGFyZWQgb24gcGxhdGZvcm1zIHdoZXJlIC1mcGljIGlzIG1lYW5pbmdsZXNzLgotIyBXZWxsLCB3ZSBkb24ndCB5ZXQsIGJ1dCB3ZSB3aWxsLgotaWYgZmFsc2UgJiYgWyAiJHtob3N0fSIgPSAiJHt0YXJnZXR9IiBdICYmIFsgeCR7ZW5hYmxlX3NoYXJlZH0gPSB4IF07IHRoZW4KLSAgY2FzZSAiJHt0YXJnZXR9IiBpbgotICAgIGFscGhhKi1kZWMtb3NmKikJZW5hYmxlX3NoYXJlZD15ZXMgOzsKLSAgICBhbHBoYSotKi1saW51eCopCWVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci0gICAgbWlwcy1zZ2ktaXJpeDUqKQllbmFibGVfc2hhcmVkPXllcyA7OwotICAgICopCQkJZW5hYmxlX3NoYXJlZD1ubyA7OwotICBlc2FjCi1maQotCi1jYXNlICIke2VuYWJsZV9zaGFyZWR9IiBpbgotICB5ZXMpIHNoYXJlZD15ZXMgOzsKLSAgbm8pIHNoYXJlZD1ubyA7OwotICAiIikgc2hhcmVkPW5vIDs7Ci0gICopIHNoYXJlZD15ZXMgOzsKLWVzYWMKLQotaWYgWyB4JHtzaGFyZWR9ID0geHllcyBdOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0gICAgYWxwaGEqLSotbGludXgqKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWVsZmFscGhhcGljIgotICAgICAgOzsKLSAgICBhcm0qLSotKikKLSAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1hcm1waWMiCi0gICAgICA7OwotICAgIGhwcGEqLSotKikKLSAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1wYXBpYyIKLSAgICAgIDs7Ci0gICAgaVszNDU2XTg2LSotY3lnd2luKikKLSAgICAgICMgV2UgZG9uJ3Qgd2FudCAtZlBJQyBvbiBDeWd3aW4uCi0gICAgICA7OwotICAgIGlbMzQ1Nl04Ni0qLSopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgteDg2cGljIgotICAgICAgOzsKLSAgICBzcGFyYzY0LSotKikKLSAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zcGFyY3BpYyIKLSAgICAgIDs7Ci0gICAgcG93ZXJwYyotKi1haXgqKQotICAgICAgIyBXZSBkb24ndCB3YW50IC1mUElDIG9uIEFJWC4KLSAgICAgIDs7Ci0gICAgcG93ZXJwYyotKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXBwY3BpYyIKLSAgICAgIDs7Ci0gICAgKi0qLSopCi0gICAgICBpZiB0ZXN0IC1mICR7c3JjZGlyfS9jb25maWcvbWgtJHtob3N0X2NwdX1waWM7IHRoZW4KLSAgICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLSR7aG9zdF9jcHV9cGljIgotICAgICAgZmkKLSAgICAgIDs7Ci0gIGVzYWMKLWZpCi0KLXJtIC1mIG1oLWZyYWcKLWlmIFsgLW4gIiR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgXSA7IHRoZW4KLSAgZm9yIGYgaW4gJHtob3N0X21ha2VmaWxlX2ZyYWd9Ci0gIGRvCi0gICAgY2F0ICR7c3JjZGlyfS8kZiA+PiBtaC1mcmFnCi0gIGRvbmUKLSAgaG9zdF9tYWtlZmlsZV9mcmFnPW1oLWZyYWcKLWZpCi0KLSMgcGVyLXRhcmdldDoKLQotY2FzZSAiJHt0YXJnZXR9IiBpbgotICB2ODEwKikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LXY4MTAiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbmV0d2FyZSopCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1uZXR3YXJlIgotICAgIDs7Ci0gIHBvd2VycGMtKi1uZXR3YXJlKikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LW5ldHdhcmUiCi0gICAgOzsKLSAgKi0qLWxpbnV4LWdudSkKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LWxpbnV4IgotICAgIDs7Ci1lc2FjCi0KLSMgSWYgLS1lbmFibGUtdGFyZ2V0LW9wdHNwYWNlIGFsd2F5cyB1c2UgLU9zIGluc3RlYWQgb2YgLU8yIHRvIGJ1aWxkCi0jIHRoZSB0YXJnZXQgbGlicmFyaWVzLCBzaW1pbGFybHkgaWYgaXQgaXMgbm90IHNwZWNpZmllZCwgdXNlIC1PcwotIyBvbiBzZWxlY3RlZCBwbGF0Zm9ybXMuCi1jYXNlICIke2VuYWJsZV90YXJnZXRfb3B0c3BhY2V9OiR7dGFyZ2V0fSIgaW4KLSAgeWVzOiopCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1vc3BhY2UiCi0gICAgOzsKLSAgIyBDWUdOVVMgTE9DQUwgZDEwdiwgZDMwdiwgZnIzMAotICA6ZDMwdi0qKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtZDMwdiIKLSAgICA7OwotICA6bTMyci0qIHwgOmQxMHYtKiB8IDpmcjMwLSopCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1vc3BhY2UiCi0gICAgOzsKLSAgbm86KiB8IDoqKQotICAgIDs7Ci0gICopCi0gICAgZWNobyAiKioqIGJhZCB2YWx1ZSBcIiR7ZW5hYmxlX3RhcmdldF9vcHRzcGFjZX1cIiBmb3IgLS1lbmFibGUtdGFyZ2V0LW9wdHNwYWNlIGZsYWc7IGlnbm9yZWQiIDE+JjIKLSAgICA7OwotZXNhYwotCi1za2lwZGlycz0KLWdhc2Rpcj1nYXMKLXVzZV9nbnVfbGQ9Ci11c2VfZ251X2FzPQotCi0jIHNvbWUgdG9vbHMgYXJlIHNvIGRlcGVuZGVudCB1cG9uIFgxMSB0aGF0IGlmIHdlJ3JlIG5vdCBidWlsZGluZyB3aXRoIFgsIAotIyBpdCdzIG5vdCBldmVuIHdvcnRoIHRyeWluZyB0byBjb25maWd1cmUsIG11Y2ggbGVzcyBidWlsZCwgdGhhdCB0b29sLgotCi1jYXNlICR7d2l0aF94fSBpbgotICB5ZXMgfCAiIikgICMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgdHJlZSBpcyB0aGF0IFgxMSBpcyBhdmFpbGFibGUKLQk7OwotICBubykKLQlza2lwZGlycz0iJHtza2lwZGlyc30gdGsgbGliZ3VpIGdhc2giCi0JOzsKLSAgKikKLSAgICAJZWNobyAiKioqIGJhZCB2YWx1ZSBcIiR7d2l0aF94fVwiIGZvciAtd2l0aC14IGZsYWc7IGlnbm9yZWQiIDE+JjIKLSAgICAJOzsKLWVzYWMKLQotIyBTb21lIHRvb2xzIGFyZSBvbmx5IHN1aXRhYmxlIGZvciBidWlsZGluZyBpbiBhICJuYXRpdmUiIHNpdHVhdGlvbi4KLSMgVGhvc2UgYXJlIGFkZGVkIHdoZW4gd2UgaGF2ZSBhIGhvc3Q9PXRhcmdldCBjb25maWd1cmF0aW9uLiAgRm9yIGNyb3NzCi0jIHRvb2xjaGFpbnMsIHdlIGFkZCBzb21lIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZnVsIGluIGEKLSMgY3Jvc3MtY29tcGlsZXIuCi0KLWlzX2Nyb3NzX2NvbXBpbGVyPQotCi1pZiBbIHgiJHtob3N0fSIgPSB4IiR7dGFyZ2V0fSIgXSA7IHRoZW4KLQkjIHdoZW4gZG9pbmcgYSBuYXRpdmUgdG9vbGNoYWluLCBkb24ndCBidWlsZCB0aGUgdGFyZ2V0cwotCSMgdGhhdCBhcmUgaW4gdGhlICdjcm9zcyBvbmx5JyBsaXN0Ci0Jc2tpcGRpcnM9IiR7c2tpcGRpcnN9ICR7Y3Jvc3Nfb25seX0iCi0JaXNfY3Jvc3NfY29tcGlsZXI9bm8KLWVsc2UKLQkjIHNpbWlsYXJseSwgZG9uJ3QgYnVpbGQgdGhlIHRhcmdldHMgaW4gdGhlICduYXRpdmUgb25seScgCi0JIyBsaXN0IHdoZW4gYnVpbGRpbmcgYSBjcm9zcyBjb21waWxlcgotCXNraXBkaXJzPSIke3NraXBkaXJzfSAke25hdGl2ZV9vbmx5fSIKLQlpc19jcm9zc19jb21waWxlcj15ZXMKLWZpCQotCi0jIFdlIGFsd2F5cyB3YW50IHRvIHVzZSB0aGUgc2FtZSBuYW1lIGZvciB0aGlzIGRpcmVjdG9yeSwgc28gdGhhdCBkZWphZ251Ci0jIGNhbiByZWxpYWJseSBmaW5kIGl0LgotdGFyZ2V0X3N1YmRpcj0ke3RhcmdldF9hbGlhc30KLQotaWYgWyAhIC1kICR7dGFyZ2V0X3N1YmRpcn0gXSA7IHRoZW4KLSAgaWYgbWtkaXIgJHt0YXJnZXRfc3ViZGlyfSA7IHRoZW4gdHJ1ZQotICBlbHNlCi0gICAgZWNobyAiJyoqKiBjb3VsZCBub3QgbWFrZSAke1BXRD1gcHdkYH0vJHt0YXJnZXRfc3ViZGlyfSIgMT4mMgotICAgIGV4aXQgMQotICBmaQotZmkKLQotY29weV9kaXJzPQotCi0jIEhhbmRsZSAtLXdpdGgtaGVhZGVycz1YWFguICBUaGUgY29udGVudHMgb2YgdGhlIG5hbWVkIGRpcmVjdG9yeSBhcmUKLSMgY29waWVkIHRvICQodG9vbGRpcikvc3lzLWluY2x1ZGUuCi1pZiBbIHgiJHt3aXRoX2hlYWRlcnN9IiAhPSB4IF07IHRoZW4KLSAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gPSB4bm8gXTsgdGhlbgotICAgIGVjaG8gMT4mMiAnKioqJyAtLXdpdGgtaGVhZGVycyBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIGNyb3NzIGNvbXBpbGluZwotICAgIGV4aXQgMQotICBmaQotICBjYXNlICIke2V4ZWNfcHJlZml4b3B0aW9ufSIgaW4KLSAgIiIpIHg9JHtwcmVmaXh9IDs7Ci0gICopIHg9JHtleGVjX3ByZWZpeH0gOzsKLSAgZXNhYwotICBjb3B5X2RpcnM9IiR7Y29weV9kaXJzfSAke3dpdGhfaGVhZGVyc30gJHgvJHt0YXJnZXRfYWxpYXN9L3N5cy1pbmNsdWRlIgotZmkKLQotIyBIYW5kbGUgLS13aXRoLWxpYnM9WFhYLiAgTXVsdGlwbGUgZGlyZWN0b3JpZXMgYXJlIHBlcm1pdHRlZC4gIFRoZQotIyBjb250ZW50cyBhcmUgY29waWVkIHRvICQodG9vbGRpcikvbGliLgotaWYgWyB4IiR7d2l0aF9saWJzfSIgIT0geCBdOyB0aGVuCi0gIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ID0geG5vIF07IHRoZW4KLSAgICBlY2hvIDE+JjIgJyoqKicgLS13aXRoLWxpYnMgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiBjcm9zcyBjb21waWxpbmcKLSAgICBleGl0IDEKLSAgZmkKLSAgIyBDb3B5IHRoZSBsaWJyYXJpZXMgaW4gcmV2ZXJzZSBvcmRlciwgc28gdGhhdCBmaWxlcyBpbiB0aGUgZmlyc3QgbmFtZWQKLSAgIyBsaWJyYXJ5IG92ZXJyaWRlIGZpbGVzIGluIHN1YnNlcXVlbnQgbGlicmFyaWVzLgotICBjYXNlICIke2V4ZWNfcHJlZml4b3B0aW9ufSIgaW4KLSAgIiIpIHg9JHtwcmVmaXh9IDs7Ci0gICopIHg9JHtleGVjX3ByZWZpeH0gOzsKLSAgZXNhYwotICBmb3IgbCBpbiAke3dpdGhfbGlic307IGRvCi0gICAgY29weV9kaXJzPSIkbCAkeC8ke3RhcmdldF9hbGlhc30vbGliICR7Y29weV9kaXJzfSIKLSAgZG9uZQotZmkKLQotIyBJZiBib3RoIC0td2l0aC1oZWFkZXJzIGFuZCAtLXdpdGgtbGlicyBhcmUgc3BlY2lmaWVkLCBkZWZhdWx0IHRvCi0jIC0td2l0aG91dC1uZXdsaWIuCi1pZiBbIHgiJHt3aXRoX2hlYWRlcnN9IiAhPSB4IF0gJiYgWyB4IiR7d2l0aF9saWJzfSIgIT0geCBdOyB0aGVuCi0gIGlmIFsgeCIke3dpdGhfbmV3bGlifSIgPSB4IF07IHRoZW4KLSAgICB3aXRoX25ld2xpYj1ubwotICBmaQotZmkKLQotIyBSZWNvZ25pemUgLS13aXRoLW5ld2xpYi8tLXdpdGhvdXQtbmV3bGliLgotaWYgWyB4JHt3aXRoX25ld2xpYn0gPSB4bm8gXTsgdGhlbgotICBza2lwZGlycz0iJHtza2lwZGlyc30gdGFyZ2V0LW5ld2xpYiIKLWVsaWYgWyB4JHt3aXRoX25ld2xpYn0gPSB4eWVzIF07IHRoZW4KLSAgc2tpcGRpcnM9YGVjaG8gIiAke3NraXBkaXJzfSAiIHwgc2VkIC1lICdzLyB0YXJnZXQtbmV3bGliIC8gLydgCi1maQotCi0jIERlZmF1bHQgdG8gdXNpbmcgLS13aXRoLXN0YWJzIGZvciBjZXJ0YWluIHRhcmdldHMuCi1pZiBbIHgke3dpdGhfc3RhYnN9ID0geCBdOyB0aGVuCi0gIGNhc2UgIiR7dGFyZ2V0fSIgaW4KLSAgbWlwcyotKi1pcml4NiopCi0gICAgOzsKLSAgbWlwcyotKi0qIHwgYWxwaGEqLSotb3NmKikKLSAgICB3aXRoX3N0YWJzPXllczsKLSAgICB3aXRob3B0aW9ucz0iJHt3aXRob3B0aW9uc30gLS13aXRoLXN0YWJzIgotICAgIDs7Ci0gIGVzYWMKLWZpCi0KLSMgSGFuZGxlICR7Y29weV9kaXJzfQotc2V0IGZub3JkICR7Y29weV9kaXJzfQotc2hpZnQKLXdoaWxlIFsgJCMgIT0gMCBdOyBkbwotICBpZiBbIC1mICQyL0NPUElFRCBdICYmIFsgeCJgY2F0ICQyL0NPUElFRGAiID0geCIkMSIgXTsgdGhlbgotICAgIDoKLSAgZWxzZQotICAgIGVjaG8gQ29weWluZyAkMSB0byAkMgotCi0gICAgIyBVc2UgdGhlIGluc3RhbGwgc2NyaXB0IHRvIGNyZWF0ZSB0aGUgZGlyZWN0b3J5IGFuZCBhbGwgcmVxdWlyZWQKLSAgICAjIHBhcmVudCBkaXJlY3Rvcmllcy4KLSAgICBpZiBbIC1kICQyIF07IHRoZW4KLSAgICAgIDoKLSAgICBlbHNlCi0gICAgICBlY2hvID5jb25maWcudGVtcAotICAgICAgJHtzcmNkaXJ9L2luc3RhbGwtc2ggLWMgLW0gNjQ0IGNvbmZpZy50ZW1wICQyL0NPUElFRAotICAgIGZpCi0KLSAgICAjIENvcHkgdGhlIGRpcmVjdG9yeSwgYXNzdW1pbmcgd2UgaGF2ZSB0YXIuCi0gICAgIyBGSVhNRTogU2hvdWxkIHdlIHVzZSBCIGluIHRoZSBzZWNvbmQgdGFyPyAgTm90IGFsbCBzeXN0ZW1zIHN1cHBvcnQgaXQuCi0gICAgKGNkICQxOyB0YXIgLWNmIC0gLikgfCAoY2QgJDI7IHRhciAteHBmIC0pCi0KLSAgICAjIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdXNlciB0byBjb3JyZWN0bHkgYWRqdXN0IGFsbAotICAgICMgc3ltbGlua3MuICBJZiBzb21lYm9keSBjYW4gZmlndXJlIG91dCBob3cgdG8gaGFuZGxlIHRoZW0gY29ycmVjdGx5Ci0gICAgIyBoZXJlLCBmZWVsIGZyZWUgdG8gYWRkIHRoZSBjb2RlLgotCi0gICAgZWNobyAkMSA+ICQyL0NPUElFRAotICBmaQotICBzaGlmdDsgc2hpZnQKLWRvbmUKLQotIyBDb25maWd1cmUgZXh0cmEgZGlyZWN0b3JpZXMgd2hpY2ggYXJlIGhvc3Qgc3BlY2lmaWMKLQotY2FzZSAiJHtob3N0fSIgaW4KLQlpWzM0NTZdODYtKi1nbzMyKikKLQkgIGNvbmZpZ2RpcnM9IiRjb25maWdkaXJzIGRvc3JlbCIgOzsKLQlpWzM0NTZdODYtKi1taW5ndzMyKikKLQkgIGNvbmZpZ2RpcnM9IiRjb25maWdkaXJzIGRvc3JlbCIgOzsKLQkqLWN5Z3dpbiopCi0JICBjb25maWdkaXJzPSIkY29uZmlnZGlycyBsaWJ0ZXJtY2FwIGRvc3JlbCIgOzsKLWVzYWMKLQotIyBSZW1vdmUgbW9yZSBwcm9ncmFtcyBmcm9tIGNvbnNpZGVyYXRpb24sIGJhc2VkIG9uIHRoZSBob3N0IG9yIAotIyB0YXJnZXQgdGhpcyB1c3VhbGx5IG1lYW5zIHRoYXQgYSBwb3J0IG9mIHRoZSBwcm9ncmFtIGRvZXNuJ3QKLSMgZXhpc3QgeWV0LgotCi1ub2NvbmZpZ2RpcnM9IiIKLQotY2FzZSAiJHtob3N0fSIgaW4KLSAgaVszNDU2XTg2LSotdnN0YSkKLSAgICBub2NvbmZpZ2RpcnM9InRjbCBleHBlY3QgZGVqYWdudSBtYWtlIHRleGluZm8gYmlzb24gcGF0Y2ggZmxleCBieWFjYyBzZW5kLXByIGdwcm9mIHV1ZGVjb2RlIGRlamFnbnUgZGlmZiBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiBnZXR0ZXh0IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWdvMzIqIHwgaVszNDU2XTg2LSotbXNkb3NkamdwcCopCi0gICAgbm9jb25maWdkaXJzPSJ0Y2wgdGsgZXhwZWN0IGRlamFnbnUgbWFrZSB0ZXhpbmZvIGJpc29uIHBhdGNoIGZsZXggYnlhY2Mgc2VuZC1wciB1dWRlY29kZSBkZWphZ251IGRpZmYgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYgZ2V0dGV4dCIKLQk7OwotICBpWzM0NTZdODYtKi1taW5ndzMyKikKLSAgICAjIG5vY29uZmlnZGlycz0idGNsIHRrIGV4cGVjdCBkZWphZ251IG1ha2UgdGV4aW5mbyBiaXNvbiBwYXRjaCBmbGV4IGJ5YWNjIHNlbmQtcHIgdXVkZWNvZGUgZGVqYWdudSBkaWZmIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgICBub2NvbmZpZ2RpcnM9ImV4cGVjdCBkZWphZ251IGN2cyBhdXRvY29uZiBhdXRvbWFrZSBzZW5kLXByIHJjcyBndWlsZSBwZXJsIHRleGluZm8gYXBhY2hlIGluZXQgbGlidG9vbCIKLQk7OwotICBpWzM0NTZdODYtKi1iZW9zKikKLSAgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRrIGl0Y2wgdGl4IGxpYmd1aSBnZGIiCi0gICAgIDs7Ci0gICotKi1jeWd3aW4qKQotICAgICBub2NvbmZpZ2RpcnM9ImF1dG9jb25mIGF1dG9tYWtlIHNlbmQtcHIgcmNzIGd1aWxlIHBlcmwgdGV4aW5mbyBhcGFjaGUgaW5ldCIKLSAgICA7OwotICAqLSotbmV0YnNkKikKLSAgICBub2NvbmZpZ2RpcnM9InJjcyIKLSAgICA7OwotICBwcGMqLSotcGUpCi0gICAgIG5vY29uZmlnZGlycz0icGF0Y2ggZGlmZiBtYWtlIHRrIHRjbCBleHBlY3QgZGVqYWdudSBjdnNzcmMgYXV0b2NvbmYgYXV0b21ha2UgdGV4aW5mbyBiaXNvbiBzZW5kLXByIGdwcm9mIHJjcyBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKLSAgICA7OwotZXNhYwotCi0KLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSAgKi0qLW5ldHdhcmUpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGlicnggdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliaWJlcnR5IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICAqLSotcnRlbXMqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgKi0qLXZ4d29ya3MqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBhbHBoYSotZGVjLW9zZiopCi0gICAgIyBsZCB3b3JrcywgYnV0IGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4gIGVtYWNzIGRvZXNuJ3QKLSAgICAjIHdvcmsuICBuZXdsaWIgaXMgbm90IDY0IGJpdCByZWFkeS4gIEknbSBub3Qgc3VyZSBhYm91dCBmaWxldXRpbHMuCi0gICAgIyBnYXMgZG9lc24ndCBnZW5lcmF0ZSBleGNlcHRpb24gaW5mb3JtYXRpb24uCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdhcyBsZCBlbWFjcyBmaWxldXRpbHMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYWxwaGEqLSotKnZtcyopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiBsZCB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBhbHBoYSotKi1saW51eCopCi0gICAgIyBuZXdsaWIgaXMgbm90IDY0IGJpdCByZWFkeQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICAjIGxpbnV4IGhhcyByeCBpbiBsaWJjCi0gICAgc2tpcGRpcnM9IiRza2lwZGlycyB0YXJnZXQtbGlicngiCi0gICAgOzsKLSAgYWxwaGEqLSotKikKLSAgICAjIG5ld2xpYiBpcyBub3QgNjQgYml0IHJlYWR5Ci0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFyYy0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBhcm0tKi1wZSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBhcm0tKi1jb2ZmKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBhcm0tKi1lbGYqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIGFybS0qLW9hYmkqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYzR4LSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIHRhcmdldC1saWJpbyB0YXJnZXQtbGlicnggdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHRodW1iLSotY29mZikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0jIENZR05VUyBMT0NBTCBjbG0vYXJtLWVsZgotICB0aHVtYi0qLWVsZikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHRodW1iLSotb2FiaSkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0jIEVORCBDWUdOVVMgTE9DQUwKLSMgQ1lHTlVTIExPQ0FMIG5pY2tjL3N0cm9uZ2FybQotICBzdHJvbmdhcm0tKi1lbGYpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgc3Ryb25nYXJtLSotY29mZikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotIyBFTkQgQ1lHTlVTIExPQ0FMCi0gIHRodW1iLSotcGUpICMgQ1lHTlVTIExPQ0FMIG5pY2tjL3RodW1iCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBhcm0tKi1yaXNjaXgqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgZDEwdi0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIgotICAgIDs7Ci0jIENZR05VUyBMT0NBTCBkMzB2Ci0gIGQzMHYtKi0qKQotICAgIDs7Ci0jIEVORCBDWUdOVVMgTE9DQUwKLSMgQ1lHTlVTIExPQ0FMIGZyMzAKLSAgZnIzMC0qLWVsZiopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0jIEVORCBDWUdOVVMgTE9DQUwKLSAgaDgzMDAqLSotKiB8IFwKLSAgaDg1MDAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaHBwYSotKi0qZWxmKiB8IFwKLSAgaHBwYSotKi1saW51eC1nbnUqIHwgXAotICBocHBhKi0qLWxpdGVzKikKLSAgICAjIERvIGNvbmZpZ3VyZSBsZC9iaW51dGlscy9nYXMgZm9yIHRoZSBhYm92ZSBjYXNlcy4KLSAgICA7OwotICBocHBhKi0qLSopCi0gICAgIyBIUCdzIEMgY29tcGlsZXIgZG9lc24ndCBoYW5kbGUgRW1hY3MgY29ycmVjdGx5IChidXQgb24gQlNEIGFuZCBNYWNoCi0gICAgIyBjYyBpcyBnY2MsIGFuZCBvbiBhbnkgc3lzdGVtIGEgdXNlciBzaG91bGQgYmUgYWJsZSB0byBsaW5rIGNjIHRvCi0gICAgIyB3aGF0ZXZlciB0aGV5IHdhbnQuICBGSVhNRSwgZW1hY3MgZW1hY3MxOSkuCi0gICAgY2FzZSAiJHtDQ30iIGluCi0JIiIgfCBjYyopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBlbWFjcyBlbWFjczE5IiA7OwotICAgICAgICAqKSA7OwotICAgIGVzYWMKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgc2hlbGx1dGlscyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1jb2ZmIHwgaVszNDU2XTg2LSotZWxmKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotICAgICAgICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBpWzM0NTZdODYtKi1nbzMyKiB8IGlbMzQ1Nl0tKi1tc2Rvc2RqZ3BwKikKLSAgICAjIGJ1dCBkb24ndCBidWlsZCBnZGIKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYnJ4IgotICAgIDs7Ci0gICotKi1saW51eCopCi0gICAgIyBsaW51eCBoYXMgcnggaW4gbGliYwotICAgIHNraXBkaXJzPSIkc2tpcGRpcnMgdGFyZ2V0LWxpYnJ4IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKQotICAgIHRhcmdldF9jb25maWdkaXJzPSIkdGFyZ2V0X2NvbmZpZ2RpcnMgdGFyZ2V0LW1pbmd3IgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBleHBlY3QgdGFyZ2V0LWxpYmdsb3NzIgotCi0gICAgIyBDYW4ndCBidWlsZCBnZGIgZm9yIG1pbmd3MzIgaWYgbm90IG5hdGl2ZS4KLSAgICBjYXNlICIke2hvc3R9IiBpbgotICAgICAgaVszNDU2XTg2LSotbWluZ3czMikgOzsgIyBrZWVwIGdkYiB0Y2wgdGsgZXhwZWN0IGV0Yy4KLSAgICAgICopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGNsIHRrIGV4cGVjdCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgICAgICA7OwotICAgIGVzYWMKLSAgICA7OyAgICAKLSAgKi0qLWN5Z3dpbiopCi0gICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR0YXJnZXRfY29uZmlnZGlycyB0YXJnZXQtbGlidGVybWNhcCB0YXJnZXQtd2luc3VwIgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgIyBhbHdheXMgYnVpbGQgbmV3bGliLgotICAgIHNraXBkaXJzPWBlY2hvICIgJHtza2lwZGlyc30gIiB8IHNlZCAtZSAncy8gdGFyZ2V0LW5ld2xpYiAvIC8nYAotCi0gICAgIyBDYW4ndCBidWlsZCBnZGIgZm9yIEN5Z3dpbiBpZiBub3QgbmF0aXZlLgotICAgIGNhc2UgIiR7aG9zdH0iIGluCi0gICAgICAqLSotY3lnd2luKikgOzsgIyBrZWVwIGdkYiB0Y2wgdGsgZXhwZWN0IGV0Yy4KLSAgICAgICopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGNsIHRrIGV4cGVjdCBpdGNsIHRpeCBsaWJndWkgZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsgICAgCi0gIGlbMzQ1Nl04Ni0qLXBlKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqKQotICAgICMgVGhlIGxpbmtlciBkb2VzIG5vdCB5ZXQga25vdyBhYm91dCB3ZWFrIHN5bWJvbHMgaW4gQ09GRiwKLSAgICAjIGFuZCBpcyBub3QgY29uZmlndXJlZCB0byBoYW5kbGUgbWl4ZWQgRUxGIGFuZCBDT0ZGLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc2NvKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXNvbGFyaXMyKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXN5c3Y0KikKLSAgICAjIFRoZSBTWVNWNCBDIGNvbXBpbGVyIGRvZXNuJ3QgaGFuZGxlIEVtYWNzIGNvcnJlY3RseQotICAgIGNhc2UgIiR7Q0N9IiBpbgotCSIiIHwgY2MqKSBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZW1hY3MgZW1hY3MxOSIgOzsKLSAgICAgICAgKikgOzsKLSAgICBlc2FjCi0gICAgIyBidXQgdGhhdCdzIG9rYXkgc2luY2UgZW1hY3MgZG9lc24ndCB3b3JrIGFueXdheQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBlbWFjcyBlbWFjczE5IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1iZW9zKikKLSAgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICAgOzsKLSAgbTY4ay0qLWVsZiopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIG02OGstKi1jb2ZmKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgbW4xMDIwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgbW4xMDMwMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBwb3dlcnBjLSotYWl4KikKLSAgICAjIGNvcGllZCBmcm9tIHJzNjAwMC0qLSogZW50cnkKLSAgICAjIFRoZSBjb25maWd1cmUgYW5kIGJ1aWxkIG9mIGxkIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQgYmVjYXVzZQotICAgICMgR05VIGxkIGlzIGtub3duIHRvIGJlIGJyb2tlbiBmb3IgQUlYIDQuMiBhbmQgNC4zIChhdCBsZWFzdCkKLSAgICAjIFRoZSBzeW1wdG9tIGlzIHRoYXQgR0RCdGsgNC4xOCBmYWlscyBhdCBzdGFydHVwIHdpdGggYSBzZWdmYXVsdAotICAgICMgaWYgbGlua2VkIGJ5IEdOVSBsZCwgYnV0IG5vdCBpZiBsaW5rZWQgYnkgdGhlIG5hdGl2ZSBsZC4KLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YgY3Zzc3JjIHRhcmdldC1saWJnbG9zcyBsZCIKLSAgICB1c2VfZ251X2xkPW5vCi0gICAgOzsKLSAgcG93ZXJwYyotKi13aW5udCogfCBwb3dlcnBjKi0qLXBlKiB8IHBwYyotKi1wZSkKLSAgICB0YXJnZXRfY29uZmlnZGlycz0iJHRhcmdldF9jb25maWdkaXJzIHRhcmdldC13aW5zdXAiCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiB0Y2wgdGsgbWFrZSBleHBlY3QgdGFyZ2V0LWxpYmdsb3NzIGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKLSAgICAjIGFsd2F5cyBidWlsZCBuZXdsaWIuCi0gICAgc2tpcGRpcnM9YGVjaG8gIiAke3NraXBkaXJzfSAiIHwgc2VkIC1lICdzLyB0YXJnZXQtbmV3bGliIC8gLydgCi0gICAgOzsKLSAgICAjIFRoaXMgaXMgdGVtcG9yYXJ5IHVudGlsIHdlIGNhbiBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcwotICBwb3dlcnBjbGUtKi1zb2xhcmlzKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHNpbSBtYWtlIHRjbCB0ayBleHBlY3QgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgIDs7Ci0gIHBvd2VycGMtKi1lYWJpKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICByczYwMDAtKi1seW54b3MqKQotICAgICMgVGhlIENWUyBzZXJ2ZXIgY29kZSBkb2Vzbid0IHdvcmsgb24gdGhlIFJTLzYwMDAKLSAgICAjIE5ld2xpYiBtYWtlcyBwcm9ibGVtcyBmb3IgbGliZysrIGluIGNyb3NzZXMuCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgZ3Byb2YgY3Zzc3JjIgotICAgIDs7Ci0gIHJzNjAwMC0qLWFpeCopCi0gICAgIyBUaGUgY29uZmlndXJlIGFuZCBidWlsZCBvZiBsZCBhcmUgY3VycmVudGx5IGRpc2FibGVkIGJlY2F1c2UKLSAgICAjIEdOVSBsZCBpcyBrbm93biB0byBiZSBicm9rZW4gZm9yIEFJWCA0LjIgYW5kIDQuMyAoYXQgbGVhc3QpCi0gICAgIyBUaGUgc3ltcHRvbSBpcyB0aGF0IEdEQnRrIDQuMTggZmFpbHMgYXQgc3RhcnR1cCB3aXRoIGEgc2VnZmF1bHQKLSAgICAjIGlmIGxpbmtlZCBieSBHTlUgbGQsIGJ1dCBub3QgaWYgbGlua2VkIGJ5IHRoZSBuYXRpdmUgbGQuCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIGxkIgotICAgIHVzZV9nbnVfbGQ9bm8KLSAgICA7OwotICByczYwMDAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiIKLSAgICA7OwotICBtNjhrLWFwb2xsby0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCBiaW51dGlscyBncHJvZiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgbWlwcyotKi1pcml4NSopCi0gICAgIyBUaGUgR05VIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuCi0gICAgIyBlbWFjcyBpcyBlbWFjcyAxOCwgd2hpY2ggZG9lcyBub3Qgd29yayBvbiBJcml4IDUgKGVtYWNzMTkgZG9lcyB3b3JrKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCBncHJvZiBlbWFjcyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgbWlwcyotKi1pcml4NiopCi0gICAgIyBUaGUgR05VIGFzc2VtYmxlciBkb2VzIG5vdCBzdXBwb3J0IElSSVggNi4KLSAgICAjIGVtYWNzIGlzIGVtYWNzIDE4LCB3aGljaCBkb2VzIG5vdCB3b3JrIG9uIElyaXggNSAoZW1hY3MxOSBkb2VzIHdvcmspCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdhcyBncHJvZiBlbWFjcyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgbWlwcyotZGVjLWJzZCopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBtaXBzKi0qLWJzZCopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBtaXBzdHgzOS0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIiAgICMgc2FtZSBhcyBnZW5lcmljIG1pcHMKLSAgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgOzsKLSAgbWlwcyotKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiIKLSAgICA7OwotICByb21wLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgYmZkIGJpbnV0aWxzIGxkIGdhcyBvcGNvZGVzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBzaC0qLSopCi0gICAgY2FzZSAiJHtob3N0fSIgaW4KLSAgICAgIGlbMzQ1Nl04Ni0qLXZzdGEpIDs7ICMgZG9uJ3QgYWRkIGdwcm9mIGJhY2sgaW4KLSAgICAgIGlbMzQ1Nl04Ni0qLWdvMzIqKSA7OyAjIGRvbid0IGFkZCBncHJvZiBiYWNrIGluCi0gICAgICBpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikgOzsgIyBkb24ndCBhZGQgZ3Byb2YgYmFjayBpbgotICAgICAgKikgc2tpcGRpcnM9YGVjaG8gIiAke3NraXBkaXJzfSAiIHwgc2VkIC1lICdzLyBncHJvZiAvIC8nYCA7OwotICAgIGVzYWMKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHNwYXJjLSotZWxmKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIHNwYXJjNjQtKi1lbGYqKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgc3BhcmNsaXRlLSotKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgc3BhcmMtKi1zdW5vczQqKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotICAgICAgICAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIGdkYnRlc3QgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgZWxzZQotICAgICAgICAgICB1c2VfZ251X2xkPW5vCi0gICAgZmkKLSAgICA7OwotICB2ODEwLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgYmZkIGJpbnV0aWxzIGdhcyBnY2MgZ2RiIGxkIHRhcmdldC1saWJpbyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgb3Bjb2RlcyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdjg1MC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB2ODUwZS0qLSopICMgQ1lHTlVTIExPQ0FMIHY4NTBlCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB2ODUwZWEtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsgICAgICAgIyBFTkQgQ1lHTlVTIExPQ0FMCi0gIHZheC0qLXZtcykKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgYmZkIGJpbnV0aWxzIGdkYiBsZCB0YXJnZXQtbmV3bGliIG9wY29kZXMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHZheC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gICotKi1seW54b3MqKQotICAgICMgTmV3bGliIG1ha2VzIHByb2JsZW1zIGZvciBsaWJnKysgaW4gY3Jvc3Nlcy4KLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsgCi0gICotKi1tYWNvcyogfCBcCi0gICotKi1tcHcqKQotICAgICMgTWFjcyB3YW50IGEgcmVzb3VyY2UgY29tcGlsZXIuCi0gICAgY29uZmlnZGlycz0iJGNvbmZpZ2RpcnMgZ3JleiIKLSAgICA7OyAgICAKLWVzYWMKLQotIyBJZiB3ZSBhcmVuJ3QgYnVpbGRpbmcgbmV3bGliLCB0aGVuIGRvbid0IGJ1aWxkIGxpYmdsb3NzLCBzaW5jZSBsaWJnbG9zcwotIyBkZXBlbmRzIHVwb24gc29tZSBuZXdsaWIgaGVhZGVyIGZpbGVzLgotY2FzZSAiJHtub2NvbmZpZ2RpcnN9IiBpbgotICAqdGFyZ2V0LWxpYmdsb3NzKikgOzsKLSAgKnRhcmdldC1uZXdsaWIqKSBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIiA7OwotZXNhYwotCi0jIE1ha2Ugc3VyZSB3ZSBkb24ndCBsZXQgR05VIGxkIGJlIGFkZGVkIGlmIHdlIGRpZG4ndCB3YW50IGl0LgotaWYgWyB4JHdpdGhfZ251X2xkID0geG5vIF07IHRoZW4KLSAgdXNlX2dudV9sZD1ubwotICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQiCi1maQotCi0jIE1ha2Ugc3VyZSB3ZSBkb24ndCBsZXQgR05VIGFzIGJlIGFkZGVkIGlmIHdlIGRpZG4ndCB3YW50IGl0LgotaWYgWyB4JHdpdGhfZ251X2FzID0geG5vIF07IHRoZW4KLSAgdXNlX2dudV9hcz1ubwotICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2FzIgotZmkKLQotIyBSZW1vdmUgdGhlIGVudHJpZXMgaW4gJHNraXBkaXJzIGFuZCAkbm9jb25maWdkaXJzIGZyb20gJGNvbmZpZ2RpcnMgYW5kCi0jICR0YXJnZXRfY29uZmlnZGlycy4KLSMgSWYgd2UgaGF2ZSB0aGUgc291cmNlIGZvciAkbm9jb25maWdkaXJzIGVudHJpZXMsIGFkZCB0aGVtIHRvICRub3RzdXBwLgotCi1ub3RzdXBwPSIiCi1mb3IgZGlyIGluIC4gJHNraXBkaXJzICRub2NvbmZpZ2RpcnMgOyBkbwotICBkaXJuYW1lPWBlY2hvICRkaXIgfCBzZWQgLWUgcy90YXJnZXQtLy9nYAotICBpZiBbICRkaXIgIT0gLiBdICAmJiBlY2hvICIgJHtjb25maWdkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIGNvbmZpZ2RpcnM9YGVjaG8gIiAke2NvbmZpZ2RpcnN9ICIgfCBzZWQgLWUgInMvICR7ZGlyfSAvIC8iYAotICAgIGlmIFsgLXIgJHNyY2Rpci8kZGlybmFtZS9jb25maWd1cmUgXSBcCi0JfHwgWyAtciAkc3JjZGlyLyRkaXJuYW1lL2NvbmZpZ3VyZS5pbiBdOyB0aGVuCi0gICAgICBpZiBlY2hvICIgJHtza2lwZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQl0cnVlCi0gICAgICBlbHNlCi0Jbm90c3VwcD0iJG5vdHN1cHAgJGRpciIKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLSAgaWYgWyAkZGlyICE9IC4gXSAgJiYgZWNobyAiICR7dGFyZ2V0X2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgdGFyZ2V0X2NvbmZpZ2RpcnM9YGVjaG8gIiAke3RhcmdldF9jb25maWdkaXJzfSAiIHwgc2VkIC1lICJzLyAke2Rpcn0gLyAvImAKLSAgICBpZiBbIC1yICRzcmNkaXIvJGRpcm5hbWUvY29uZmlndXJlIF0gXAotCXx8IFsgLXIgJHNyY2Rpci8kZGlybmFtZS9jb25maWd1cmUuaW4gXTsgdGhlbgotICAgICAgaWYgZWNobyAiICR7c2tpcGRpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JdHJ1ZQotICAgICAgZWxzZQotCW5vdHN1cHA9IiRub3RzdXBwICRkaXIiCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi1kb25lCi0KLSMgU29tZXRpbWVzIHRoZSB0b29scyBhcmUgZGlzdHJpYnV0ZWQgd2l0aCBsaWJpYmVydHkgYnV0IHdpdGggbm8gb3RoZXIKLSMgbGlicmFyaWVzLiAgSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGJ1aWxkIHRhcmdldC1saWJpYmVydHkuCi1pZiBbIC1uICIke3RhcmdldF9jb25maWdkaXJzfSIgXTsgdGhlbgotICBvdGhlcnM9Ci0gIGZvciBpIGluIGBlY2hvICR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHwgc2VkIC1lIHMvdGFyZ2V0LS8vZ2AgOyBkbwotICAgIGlmIFsgIiRpIiAhPSAibGliaWJlcnR5IiBdOyB0aGVuCi0gICAgICBpZiBbIC1yICRzcmNkaXIvJGkvY29uZmlndXJlIF0gfHwgWyAtciAkc3JjZGlyLyRpL2NvbmZpZ3VyZS5pbiBdOyB0aGVuCi0Jb3RoZXJzPXllczsKLQlicmVhazsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBpZiBbIC16ICIke290aGVyc30iIF07IHRoZW4KLSAgICB0YXJnZXRfY29uZmlnZGlycz0KLSAgZmkKLWZpCi0KLSMgRGVjb25maWd1cmUgYWxsIHN1YmRpcmVjdG9yaWVzLCBpbiBjYXNlIHdlIGFyZSBjaGFuZ2luZyB0aGUKLSMgY29uZmlndXJhdGlvbiBmcm9tIG9uZSB3aGVyZSBhIHN1YmRpcmVjdG9yeSBpcyBzdXBwb3J0ZWQgdG8gb25lIHdoZXJlIGl0Ci0jIGlzIG5vdC4KLWlmIFsgLXogIiR7bm9yZWN1cnNpb259IiBdICYmIFsgLW4gIiR7Y29uZmlnZGlyc30iIF07IHRoZW4KLSAgZm9yIGkgaW4gYGVjaG8gJHtjb25maWdkaXJzfSB8IHNlZCAtZSBzL3RhcmdldC0vL2dgIDsgZG8KLSAgICBybSAtZiAkaS9NYWtlZmlsZQotICBkb25lCi1maQotaWYgWyAteiAiJHtub3JlY3Vyc2lvbn0iIF0gJiYgWyAtbiAiJHt0YXJnZXRfY29uZmlnZGlyc30iIF07IHRoZW4KLSAgZm9yIGkgaW4gYGVjaG8gJHt0YXJnZXRfY29uZmlnZGlyc30gfCBzZWQgLWUgcy90YXJnZXQtLy9nYCA7IGRvCi0gICAgcm0gLWYgJHt0YXJnZXRfc3ViZGlyfS8kaS9NYWtlZmlsZQotICBkb25lCi1maQotCi0jIFByb2R1Y2UgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHRoZSBzdWJkaXJzIHdlIGNhbid0IGNvbmZpZ3VyZS4KLSMgVGhpcyBpc24ndCBlc3BlY2lhbGx5IGludGVyZXN0aW5nIGluIHRoZSBDeWdudXMgdHJlZSwgYnV0IGluIHRoZSBpbmRpdmlkdWFsCi0jIEZTRiByZWxlYXNlcywgaXQncyBpbXBvcnRhbnQgdG8gbGV0IHBlb3BsZSBrbm93IHdoZW4gdGhlaXIgbWFjaGluZSBpc24ndAotIyBzdXBwb3J0ZWQgYnkgdGhlIG9uZSBvciB0d28gcHJvZ3JhbXMgaW4gYSBwYWNrYWdlLgotCi1pZiBbIC1uICIke25vdHN1cHB9IiBdICYmIFsgLXogIiR7bm9yZWN1cnNpb259IiBdOyB0aGVuCi0gICMgSWYgJGFwcGRpcnMgaXMgbm9uLWVtcHR5LCBhdCBsZWFzdCBvbmUgb2YgdGhvc2UgZGlyZWN0b3JpZXMgbXVzdCBzdGlsbAotICAjIGJlIGNvbmZpZ3VyZWQsIG9yIHdlIGVycm9yIG91dC4gIChFLmcuLCBpZiB0aGUgZ2FzIHJlbGVhc2Ugc3VwcG9ydHMgYQotICAjIHNwZWNpZmllZCB0YXJnZXQgaW4gc29tZSBzdWJkaXJzIGJ1dCBub3QgdGhlIGdhcyBzdWJkaXIsIHdlIHNob3VsZG4ndAotICAjIHByZXRlbmQgdGhhdCBhbGwgaXMgd2VsbC4pCi0gIGlmIFsgLW4gIiRhcHBkaXJzIiBdOyB0aGVuCi0gICAgZm9yIGRpciBpbiAkYXBwZGlycyA7IGRvCi0gICAgICBpZiBbIC1yICRkaXIvTWFrZWZpbGUuaW4gXTsgdGhlbgotCWlmIGVjaG8gIiAke2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICBhcHBkaXJzPSIiCi0JICBicmVhawotCWZpCi0JaWYgZWNobyAiICR7dGFyZ2V0X2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICBhcHBkaXJzPSIiCi0JICBicmVhawotCWZpCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBpZiBbIC1uICIkYXBwZGlycyIgXTsgdGhlbgotICAgICAgZWNobyAiKioqIFRoaXMgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcGFja2FnZS4iIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0gIGZpCi0gICMgT2theSwgc29tZSBhcHBsaWNhdGlvbiB3aWxsIGJ1aWxkLCBvciB3ZSBkb24ndCBjYXJlIHRvIGNoZWNrLiAgU3RpbGwKLSAgIyBub3RpZnkgb2Ygc3ViZGlycyBub3QgZ2V0dGluZyBidWlsdC4KLSAgZWNobyAiKioqIFRoaXMgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBmb2xsb3dpbmcgc3ViZGlyZWN0b3JpZXM6IiAxPiYyCi0gIGVjaG8gIiAgICAke25vdHN1cHB9IiAxPiYyCi0gIGVjaG8gIiAgICAoQW55IG90aGVyIGRpcmVjdG9yaWVzIHNob3VsZCBzdGlsbCB3b3JrIGZpbmUuKSIgMT4mMgotZmkKLQotIyBTZXQgd2l0aF9nbnVfYXMgYW5kIHdpdGhfZ251X2xkIGFzIGFwcHJvcHJpYXRlLgotIwotIyBUaGlzIGlzIGRvbmUgYnkgZGV0ZXJtaW5pbmcgd2hldGhlciBvciBub3QgdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeQotIyBpcyBhdmFpbGFibGUsIGFuZCBieSBjaGVja2luZyB3aGV0aGVyIG9yIG5vdCBzcGVjaWZpYyBjb25maWd1cmF0aW9ucwotIyBoYXZlIHJlcXVlc3RlZCB0aGF0IHRoaXMgbWFnaWMgbm90IGhhcHBlbi4KLSMgCi0jIFRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbHdheXMgb3ZlcnJpZGUgdGhlIGV4cGxpY2l0IHNldHRpbmdzIGluIAotIyBjb25maWd1cmUuaW4sIGFuZCB0aGUgc2V0dGluZ3MgaW4gY29uZmlndXJlLmluIG92ZXJyaWRlIHRoaXMgbWFnaWMuCi0jCi0jIElmIHRoZSBkZWZhdWx0IGZvciBhIHRvb2xjaGFpbiBpcyB0byB1c2UgR05VIGFzIGFuZCBsZCwgYW5kIHlvdSBkb24ndCAKLSMgd2FudCB0byBkbyB0aGF0LCB0aGVuIHlvdSBzaG91bGQgdXNlIHRoZSAtLXdpdGhvdXQtZ251LWFzIGFuZAotIyAtLXdpdGhvdXQtZ251LWxkIG9wdGlvbnMgZm9yIHRoZSBjb25maWd1cmUgc2NyaXB0LgotCi1pZiBbIHgke3VzZV9nbnVfYXN9ID0geCBdIDsgdGhlbgotICBpZiBbIHgke3dpdGhfZ251X2FzfSAhPSB4bm8gXSAmJiBlY2hvICIgJHtjb25maWdkaXJzfSAiIHwgZ3JlcCAiICR7Z2FzZGlyfSAiID4gL2Rldi9udWxsIDI+JjEgJiYgWyAtZCAke3NyY2Rpcn0vJHtnYXNkaXJ9IF0gOyB0aGVuCi0gICAgd2l0aF9nbnVfYXM9eWVzCi0gICAgd2l0aG9wdGlvbnM9IiR3aXRob3B0aW9ucyAtLXdpdGgtZ251LWFzIgotICBmaQotZmkKLQotaWYgWyB4JHt1c2VfZ251X2xkfSA9IHggXSA7IHRoZW4KLSAgaWYgWyB4JHt3aXRoX2dudV9sZH0gIT0geG5vIF0gJiYgZWNobyAiICR7Y29uZmlnZGlyc30gIiB8IGdyZXAgIiBsZCAiID4gL2Rldi9udWxsIDI+JjEgJiYgWyAtZCAke3NyY2Rpcn0vbGQgXSA7IHRoZW4KLSAgICB3aXRoX2dudV9sZD15ZXMKLSAgICB3aXRob3B0aW9ucz0iJHdpdGhvcHRpb25zIC0td2l0aC1nbnUtbGQiCi0gIGZpCi1maQotCi0jIElmIHVzaW5nIG5ld2xpYiwgYWRkIC0td2l0aC1uZXdsaWIgdG8gdGhlIHdpdGhvcHRpb25zIHNvIHRoYXQgZ2NjL2NvbmZpZ3VyZQotIyBjYW4gZGV0ZWN0IHRoaXMgY2FzZS4KLQotaWYgWyB4JHt3aXRoX25ld2xpYn0gIT0geG5vIF0gJiYgZWNobyAiICR7dGFyZ2V0X2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgdGFyZ2V0LW5ld2xpYiAiID4gL2Rldi9udWxsIDI+JjEgJiYgWyAtZCAke3NyY2Rpcn0vbmV3bGliIF0gOyB0aGVuCi0gIHdpdGhfbmV3bGliPXllcwotICB3aXRob3B0aW9ucz0iJHdpdGhvcHRpb25zIC0td2l0aC1uZXdsaWIiCi1maQotCi1pZiBbIHgke3NoYXJlZH0gPSB4eWVzIF07IHRoZW4KLSAgY2FzZSAiJHt0YXJnZXR9IiBpbgotICAgIGhwcGEqKQotICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1wYXBpYyIKLSAgICAgIDs7Ci0gICAgaVszNDU2XTg2LSopCi0gICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LXg4NnBpYyIKLSAgICAgIDs7Ci0gICAgcG93ZXJwYyotKikKLSAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtcHBjcGljIgotICAgICAgOzsKLSAgICBhbHBoYSotKi1saW51eCopCi0gICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LWVsZmFscGhhcGljIgotICAgICAgOzsKLSAgICAqKQotICAgICAgaWYgdGVzdCAtZiAke3NyY2Rpcn0vY29uZmlnL210LSR7dGFyZ2V0X2NwdX1waWM7IHRoZW4KLSAgICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC0ke3RhcmdldF9jcHV9cGljIgotICAgICAgZmkKLSAgICAgIDs7Ci0gIGVzYWMKLWZpCi0KLXJtIC1mIG10LWZyYWcKLWlmIFsgLW4gIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBdIDsgdGhlbgotICBmb3IgZiBpbiAke3RhcmdldF9tYWtlZmlsZV9mcmFnfQotICBkbwotICAgIGNhdCAke3NyY2Rpcn0vJGYgPj4gbXQtZnJhZwotICBkb25lCi0gIHRhcmdldF9tYWtlZmlsZV9mcmFnPW10LWZyYWcKLWZpCi0KLSMgcG9zdC10YXJnZXQ6Ci0KLSMgTWFrZSBzdXJlIHRoYXQgdGhlIGNvbXBpbGVyIGlzIGFibGUgdG8gZ2VuZXJhdGUgYW4gZXhlY3V0YWJsZS4gIElmIGl0Ci0jIGNhbid0LCB3ZSBhcmUgcHJvYmFibHkgaW4gdHJvdWJsZS4gIFdlIGRvbid0IGNhcmUgd2hldGhlciB3ZSBjYW4gcnVuIHRoZQotIyBleGVjdXRhYmxlLS13ZSBtaWdodCBiZSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLS13ZSBvbmx5IGNhcmUgd2hldGhlciBpdAotIyBjYW4gYmUgY3JlYXRlZC4gIEF0IHRoaXMgcG9pbnQgdGhlIG1haW4gY29uZmlndXJlIHNjcmlwdCBoYXMgc2V0IENDLgotZWNobyAiaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfSIgPiBjb25mdGVzdC5jCi0ke0NDfSAtbyBjb25mdGVzdCAke0NGTEFHU30gJHtDUFBGTEFHU30gJHtMREZMQUdTfSBjb25mdGVzdC5jCi1pZiBbICQ/ID0gMCBdICYmIFsgLXMgY29uZnRlc3QgLW8gLXMgY29uZnRlc3QuZXhlIF07IHRoZW4KLSAgOgotZWxzZQotICBlY2hvIDE+JjIgIioqKiBUaGUgY29tbWFuZCAnJHtDQ30gLW8gY29uZnRlc3QgJHtDRkxBR1N9ICR7Q1BQRkxBR1N9ICR7TERGTEFHU30gY29uZnRlc3QuYycgZmFpbGVkLiIKLSAgZWNobyAxPiYyICIqKiogWW91IG11c3Qgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBDQyB0byBhIHdvcmtpbmcgY29tcGlsZXIuIgotICBybSAtZiBjb25mdGVzdCoKLSAgZXhpdCAxCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLSMgVGhlIFNvbGFyaXMgL3Vzci91Y2IvY2MgY29tcGlsZXIgZG9lcyBub3QgYXBwZWFyIHRvIHdvcmsuCi1jYXNlICIke2hvc3R9IiBpbgotICBzcGFyYy1zdW4tc29sYXJpczIqKQotICAgICAgQ0NCQVNFPSJgZWNobyAke0NDLWNjfSB8IHNlZCAncy8gLiokLy8nYCIKLSAgICAgIGlmIFsgImAvdXNyL2Jpbi93aGljaCAkQ0NCQVNFYCIgPSAiL3Vzci91Y2IvY2MiIF0gOyB0aGVuCi0gICAgICAgICAgY291bGRfdXNlPQotICAgICAgICAgIFsgLWQgL29wdC9TVU5Xc3Byby9iaW4gXSAmJiBjb3VsZF91c2U9Ii9vcHQvU1VOV3Nwcm8vYmluIgotICAgICAgICAgIGlmIFsgLWQgL29wdC9jeWdudXMvYmluIF0gOyB0aGVuCi0gICAgICAgICAgICAgIGlmIFsgIiRjb3VsZF91c2UiID0gIiIgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgIGNvdWxkX3VzZT0iL29wdC9jeWdudXMvYmluIgotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBjb3VsZF91c2U9IiRjb3VsZF91c2Ugb3IgL29wdC9jeWdudXMvYmluIgotICAgICAgICAgICAgICBmaQotICAgICAgICAgIGZpCi0gICAgICAgIGlmIFsgIiRjb3VsZF91c2UiID0gIiIgXSA7IHRoZW4KLSAgICAgICAgICAgIGVjaG8gIldhcm5pbmc6IGNvbXBpbGF0aW9uIG1heSBmYWlsIGJlY2F1c2UgeW91J3JlIHVzaW5nIgotICAgICAgICAgICAgZWNobyAiL3Vzci91Y2IvY2MuICBZb3Ugc2hvdWxkIGNoYW5nZSB5b3VyIFBBVEggb3IgQ0MgIgotICAgICAgICAgICAgZWNobyAidmFyaWFibGUgYW5kIHJlcnVuIGNvbmZpZ3VyZS4iCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVjaG8gIldhcm5pbmc6IGNvbXBpbGF0aW9uIG1heSBmYWlsIGJlY2F1c2UgeW91J3JlIHVzaW5nIgotICAgICAgICAgICAgZWNobyAiL3Vzci91Y2IvY2MsIHdoZW4geW91IHNob3VsZCB1c2UgdGhlIEMgY29tcGlsZXIgZnJvbSIKLSAgICAgICAgICAgIGVjaG8gIiRjb3VsZF91c2UuICBZb3Ugc2hvdWxkIGNoYW5nZSB5b3VyIgotICAgICAgICAgICAgZWNobyAiUEFUSCBvciBDQyB2YXJpYWJsZSBhbmQgcmVydW4gY29uZmlndXJlLiIKLSAgICAgICAgZmkKLSAgICAgIGZpCi0gIDs7Ci1lc2FjCi0KLSMgSWYgLS1lbmFibGUtc2hhcmVkIHdhcyBzZXQsIHdlIG11c3Qgc2V0IExEX0xJQlJBUllfUEFUSCBzbyB0aGF0IHRoZQotIyBiaW51dGlscyB0b29scyB3aWxsIGZpbmQgbGliYmZkLnNvLgotaWYgWyAiJHtzaGFyZWR9IiA9ICJ5ZXMiIF07IHRoZW4KLSAgc2VkIC1lICdzL15TRVRfTElCX1BBVEhbIAldKj0uKiQvU0VUX0xJQl9QQVRIID0gJChSRUFMTFlfU0VUX0xJQl9QQVRIKS8nIFwKLSAgICAgIE1ha2VmaWxlID4gTWFrZWZpbGUudGVtCi0gIHJtIC1mIE1ha2VmaWxlCi0gIG12IC1mIE1ha2VmaWxlLnRlbSBNYWtlZmlsZQotCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0gICotKi1ocHV4KikKLSAgICBzZWQgLWUgJ3MvXlJQQVRIX0VOVlZBUlsgCV0qPS4qJC9SUEFUSF9FTlZWQVIgPSBTSExJQl9QQVRILycgXAotCU1ha2VmaWxlID4gTWFrZWZpbGUudGVtCi0gICAgcm0gLWYgTWFrZWZpbGUKLSAgICBtdiAtZiBNYWtlZmlsZS50ZW0gTWFrZWZpbGUKLSAgICA7OwotICBlc2FjCi1maQotCi0jIFJlY29yZCB0YXJnZXRfY29uZmlnZGlycyBhbmQgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMgaW4gTWFrZWZpbGUuCi10YXJnZXRfY29uZmlnZGlycz1gZWNobyAiJHt0YXJnZXRfY29uZmlnZGlyc30iIHwgc2VkIC1lICdzL3RhcmdldC0vL2cnYAotdGFyZ2FyZ3M9YGVjaG8gIiR7YXJndW1lbnRzfSIgfCBcCi0Jc2VkIC1lICdzLy0tbm9bXiAJXSovLycgXAotCSAgICAtZSAncy8tLWNhY2hlW2Etei1dKj1bXiAJXSovLycgXAotCSAgICAtZSAncy8tLWhvW2Etei1dKj1bXiAJXSovLycgXAotCSAgICAtZSAncy8tLWJ1W2Etei1dKj1bXiAJXSovLycgXAotCSAgICAtZSAncy8tLXRhW2Etei1dKj1bXiAJXSovLydgCi0KLSMgUGFzc2luZyBhIC0td2l0aC1jcm9zcy1ob3N0IGFyZ3VtZW50IGxldHMgdGhlIHRhcmdldCBsaWJyYXJpZXMga25vdwotIyB3aGV0aGVyIHRoZXkgYXJlIGJlaW5nIGJ1aWx0IHdpdGggYSBjcm9zcy1jb21waWxlciBvciBiZWluZyBidWlsdAotIyBuYXRpdmUuICBIb3dldmVyLCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gdXNlIG90aGVyIG1lY2hhbmlzbXMgdG8gbWFrZSB0aGUKLSMgc29ydHMgb2YgZGVjaXNpb25zIHRoZXkgd2FudCB0byBtYWtlIG9uIHRoaXMgYmFzaXMuICBQbGVhc2UgY29uc2lkZXIKLSMgdGhpcyBvcHRpb24gdG8gYmUgZGVwcmVjYXRlZC4gIEZJWE1FLgotaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gPSB4eWVzIF07IHRoZW4KLSAgdGFyZ2FyZ3M9Ii0td2l0aC1jcm9zcy1ob3N0PSR7aG9zdF9hbGlhc30gJHt0YXJnYXJnc30iCi1maQotCi0jIERlZmF1bHQgdG8gLS1lbmFibGUtbXVsdGlsaWIuCi1pZiBbIHgke2VuYWJsZV9tdWx0aWxpYn0gPSB4IF07IHRoZW4KLSAgdGFyZ2FyZ3M9Ii0tZW5hYmxlLW11bHRpbGliICR7dGFyZ2FyZ3N9IgotZmkKLQotIyBQYXNzIC0td2l0aC1uZXdsaWIgaWYgYXBwcm9wcmlhdGUuICBOb3RlIHRoYXQgdGFyZ2V0X2NvbmZpZ2RpcnMgaGFzCi0jIGNoYW5nZWQgZnJvbSB0aGUgZWFybGllciBzZXR0aW5nIG9mIHdpdGhfbmV3bGliLgotaWYgWyB4JHt3aXRoX25ld2xpYn0gIT0geG5vIF0gJiYgZWNobyAiICR7dGFyZ2V0X2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgbmV3bGliICIgPiAvZGV2L251bGwgMj4mMSAmJiBbIC1kICR7c3JjZGlyfS9uZXdsaWIgXSA7IHRoZW4KLSAgdGFyZ2FyZ3M9Ii0td2l0aC1uZXdsaWIgJHt0YXJnYXJnc30iCi1maQotCi0jIHByb3ZpZGUgYSBwcm9wZXIgZ3h4X2luY2x1ZGVfZGlyLgotIyBOb3RlLCBpZiB5b3UgY2hhbmdlIHRoZSBkZWZhdWx0LCBtYWtlIHN1cmUgdG8gZml4IGJvdGggaGVyZSBhbmQgaW4KLSMgdGhlIGdjYywgbGliaW8sIGxpYnN0ZGMrKyBhbmQgbGliZysrIHN1YmRpcmVjdG9yaWVzLgotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1neHgtaW5jbHVkZS1kaXIgb3IgLS13aXRob3V0LWd4eC1pbmNsdWRlLWRpciB3YXMgZ2l2ZW4uCi1neHhfaW5jbHVkZV9kaXI9Ci1pZiB0ZXN0IC1uICIke3dpdGhfZ3h4X2luY2x1ZGVfZGlyfSI7IHRoZW4KLSAgY2FzZSAiJHt3aXRoX2d4eF9pbmNsdWRlX2Rpcn0iIGluCi0gICAgeWVzICkKLSAgICAgIGVjaG8gImNvbmZpZ3VyZS5pbjogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGdpdmVuIGZvciBnKysgaW5jbHVkZSBkaXJlY3RvcnkiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgICAgOzsKLSAgICBubyApCi0gICAgICA7OwotICAgICogKQotICAgICAgZ3h4X2luY2x1ZGVfZGlyPSR7d2l0aF9neHhfaW5jbHVkZV9kaXJ9Ci0gICAgICA7OwotICBlc2FjCi1maQotaWYgdGVzdCB4JHtneHhfaW5jbHVkZV9kaXJ9ID0geDsgdGhlbgotICBpZiB0ZXN0IHgke2VuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlic30gPSB4eWVzOyB0aGVuCi0gICAgZ3h4X2luY2x1ZGVfZGlyPScke2xpYnN1YmRpcn0vaW5jbHVkZS9nKysnCi0gIGVsc2UKLSAgICAuICR7dG9wc3JjZGlyfS9jb25maWcuaWYKLSAgICBneHhfaW5jbHVkZV9kaXI9JyR7cHJlZml4fS9pbmNsdWRlL2crKyctJHtsaWJzdGRjeHhfaW50ZXJmYWNlfQotICBmaQotZWxzZQotICBneHhfaW5jbHVkZV9kaXI9JHtneHhfaW5jbHVkZV9kaXJ9Ci1maQotCi10YXJnYXJncz0iLS1ob3N0PSR7dGFyZ2V0X2FsaWFzfSAtLWJ1aWxkPSR7YnVpbGRfYWxpYXN9ICR7dGFyZ2FyZ3N9Igotc2VkIC1lICJzOl5UQVJHRVRfQ09ORklHRElSU1sgCV0qPS4qJDpUQVJHRVRfQ09ORklHRElSUyA9ICR7dGFyZ2V0X2NvbmZpZ2RpcnN9OiIgXAotICAgIC1lICJzJV5DT05GSUdfQVJHVU1FTlRTWyAJXSo9LiokJUNPTkZJR19BUkdVTUVOVFMgPSAke3RhcmdhcmdzfSUiIFwKLSAgICAtZSAicyVeVEFSR0VUX1NVQkRJUlsgCV0qPS4qJCVUQVJHRVRfU1VCRElSID0gJHt0YXJnZXRfc3ViZGlyfSUiIFwKLSAgICAtZSAicyVeZ3h4X2luY2x1ZGVfZGlyWyAJXSo9LiokJWd4eF9pbmNsdWRlX2Rpcj0ke2d4eF9pbmNsdWRlX2Rpcn0lIiBcCi0gICAgICAgTWFrZWZpbGUgPiBNYWtlZmlsZS50ZW0KLXJtIC1mIE1ha2VmaWxlCi1tdiAtZiBNYWtlZmlsZS50ZW0gTWFrZWZpbGUKLQotIwotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIGZpbGwtY29sdW1uOiAxMzEKLSMgRW5kOgotIwpkaWZmIC0tZ2l0IGEvZXRjL0NoYW5nZUxvZyBiL2V0Yy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTNhM2UuLjAwMDAwMDAKLS0tIGEvZXRjL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDUwNyArMCwwIEBACi0xOTk5LTA0LTAxICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGFkZC1sb2cuZWwsIGFkZC1sb2cudmk6IE5ldyBmaWxlcy4KLQotV2VkIEphbiAyMCAwMTozMzo1MCAxOTk5ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogY29tcC10b29scy12ZXJpZnk6IFJlbW92ZSBzb21lIGNoZWNrcyB0aGF0IGFyZSBubyBsb25nZXIgdmFsaWQuCi0KLTE5OTgtMTItMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldGRvYy9mcjMwLnRleGk6IE5ldyBkb2N1bWVudC4KLQkKLVRodSBPY3QgIDEgMjE6MTU6NTkgMTk5OCAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIGNvbXAtdG9vbHMtZml4LCBjcm9zcy10b29scy1maXg6IFJlcGxhY2UgL3Vzci9pbmNsdWRlCi0Jd2l0aCAke0ZJWElOQ0RJUn0uCi0KLVR1ZSBBdWcgMTEgMTk6MjI6MTEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbWFrZS1yZWwtc3ltLXRyZWUgKHZlcnNpb24pOiBVcGRhdGUgY2FsY3VsYXRpb24uCi0KLUZyaSBKdW4gMTIgMjE6MzQ6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGV4aTogVmFyaW91cyBhZGRpdGlvbnMuCi0JKiBNYWtlZmlsZS5pbiAoVEVYSTJIVE1MLCBEVklQUyk6IE5ldyB2YXJpYWJsZXMuCi0JKHN0YW5kYXJkcy5wcyk6IE5ldyB0YXJnZXQuCi0JKGNvbmZpZ3VyZS5kdmkpOiBDb3B5IC50aW4gZmlsZXMgaW4gYXMgd2VsbC4KLQkoY29uZmlndXJlLnBzLCBjb25maWd1cmUuaHRtbCk6IE5ldyB0YXJnZXRzLgotCShjbGVhbik6IFJlbW92ZSBjb25maWdkZXYuanBnIGFuZCBjb25maWdidWlsZC5qcGcuCi0JKiBjb25maWdkZXYuZmlnOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ2Rldi5laW46IE5ldyBmaWxlIChFUFMgdmVyc2lvbiBvZiBjb25maWdkZXYuZmlnKS4KLQkqIGNvbmZpZ2Rldi5qaW46IE5ldyBmaWxlIChKUEVHIHZlcnNpb24gb2YgY29uZmlnZGV2LmZpZykuCi0JKiBjb25maWdidWlsZC5maWc6IE5ldyBmaWxlLgotCSogY29uZmlnYnVpbGQuZWluOiBOZXcgZmlsZSAoRVBTIHZlcnNpb24gb2YgY29uZmlnYnVpbGQuZmlnKS4KLQkqIGNvbmZpZ2J1aWxkLmppbjogTmV3IGZpbGUgKEpQRUcgdmVyc2lvbiBvZiBjb25maWdidWlsZC5maWcpLgotCi1XZWQgSnVuIDEwIDE0OjQxOjI1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRleGk6IE5ldyBmaWxlLgotCSogY29uZmlnZGV2LnRpbjogTmV3IGZpbGUuCi0JKiBjb25maWdidWlsZC50aW46IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKE1BS0VJTkZPKTogVXNlIG1ha2VpbmZvIGZyb20gdGV4aW5mbyBkaXJlY3RvcnkgaWYKLQlpdCBleGlzdHMuCi0JKFRFWEkyRFZJKTogTGlrZXdpc2UgZm9yIHRleGkyZHZpLgotCShJTkZPRklMRVMpOiBBZGQgY29uZmlndXJlLmluZm8uCi0JKERWSUZJTEVTKTogQWRkIGNvbmZpZ3VyZS5kdmkuCi0JKGluZm8pOiBPbmx5IGJ1aWxkIGluZm8gZmlsZXMgaWYgdGhlIHNvdXJjZSBmaWxlcyBleGlzdC4KLQkoaW5zdGFsbC1pbmZvKTogT25seSBpbnN0YWxsIGluZm8gZmlsZXMgaWYgdGhleSBleGlzdC4KLQkoZHZpKTogT25seSBidWlsZCBEVkkgZmlsZXMgaWYgdGhlIHNvdXJjZXMgZmlsZXMgZXhpc3QuCi0JKGNvbmZpZ3VyZS5pbmZvKTogTmV3IHRhcmdldC4KLQkoY29uZmlndXJlLmR2aSk6IE5ldyB0YXJnZXQuCi0JKGNsZWFuKTogUmVtb3ZlIGNvbmZpZ2RldiBhbmQgY29uZmlnYnVpbGQgZGVyaXZlZCBmaWxlcy4KLQotCVJlbW92ZSBvYnNvbGV0ZSBkb2N1bWVudGF0aW9uLgotCSogaW50cm8udGV4aTogUmVtb3ZlLgotCSogaW5zdGFsbC50ZXhpOiBSZW1vdmUuCi0JKiBjb25maWctbmFtZXMudGV4aTogUmVtb3ZlLgotCSogc2NyZWVuMS5lcHM6IFJlbW92ZS4KLQkqIHNjcmVlbjEub2JqOiBSZW1vdmUuCi0JKiBzY3JlZW4yLmVwczogUmVtb3ZlLgotCSogc2NyZWVuMi5vYmo6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgcmVmZXJlbmNlcyB0byB0aGUgYWJvdmUuCi0KLVRodSBNYXkgMjEgMTQ6MzQ6NTEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0ZG9jL2FybS1pbnRlcndvcmsudGV4aTogQWRkIG5vdGUgYWJvdXQgaWdub3JpbmcgbGlua2VyCi0Jd2FybmluZyBtZXNzYWdlIHdoZW4gdXNpbmcgLS1zdXBwb3J0LW9sZC1jb2RlLgotCi1Nb24gTWF5IDE4IDE0OjI3OjM3IDE5OTggIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluLCBjb21wLXRvb2xzLWZpeCwgY29tcC10b29scy12ZXJpZnksIGNyb3NzLXRvb2xzLWZpeDoKLQlVc2UgJEdDQ3ZuIHJhdGhlciB0aGFuIHN1YnN0aXR1dGUgZXZlcnl3aGVyZS4KLQotVGh1IE1heSAxNCAxNDo0MzoxMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB0YXJnZXRkb2MvYXJtLWludGVyd29yay50ZXhpOiBEb2N1bWVudCBkbGx0b29sIHN1cHBvcnQgb2YKLQlpbnRlcndvcmtpbmcuIAotCi1UaHUgTWF5ICA3IDE2OjQ5OjM4IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBSZW1vdmUgcmVmZXJlbmNlcyB0byBUQ0xfTElCUkFSWSwgVEtfTElCUkFSWSwKLQlhbmQgR0RCVEtfRklMRU5BTUUuCi0KLVdlZCBBcHIgIDEgMTc6MTE6NDQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0ZG9jL2FybS1pbnRlcndvcmsudGV4aTogRG9jdW1lbnQgQVJNL3RodW1iIGludGVyd29ya2luZy4gCi0KLVR1ZSBNYXIgMzEgMTU6Mjg6MjAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFuZGFyZHMudGV4aSwgbWFrZS1zdGRzLnRleGk6IFVwZGF0ZSB0byBjdXJyZW50IEZTRiB2ZXJzaW9ucy4KLQkqIE1ha2VmaWxlLmluIChzdGFuZGFyZHMuaW5mbyk6IERlcGVuZCB1cG9uIG1ha2Utc3RkLnRleGkuCi0KLVR1ZSBNYXIgMjQgMTY6MTM6MjYgMTk5OCAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmh1bmEuY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi4xMi4xIHRvIGZpeCBzaGVsbCBpc3N1ZXMKLQlmb3IgTlQgbmF0aXZlIGJ1aWxkcy4gCi0KLU1vbiBNYXIgIDkgMTY6NDE6MDQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbWFrZS1yZWwtc3ltLXRyZWUgKGJpbnByb2dzKTogQWRkIG9iamNvcHkuCi0KLVR1ZSBGZWIgMjQgMTg6MTE6NTggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbWFrZS1yZWwtc3ltLXRyZWU6IGFzLm5ldyAtPiBhcy1uZXcsIGxkLm5ldyAtPiBsZC1uZXcKLQlubS5uZXcgLT4gbm0tbmV3LiAgTWFrZSBzeW1saW5rcyB0byBjcnQqLm8uCi0KLUZyaSBOb3YgMjEgMTI6NTQ6NTggMTk5NyAgTWFuZnJlZCBIb2xsc3RlaW4gPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgLS1uby1zcGxpdCBhcmd1bWVudCB0byBhdm9pZCBjcmVhdGluZyBmaWxlcwotCXdpdGggbmFtZXMgbG9uZ2VyIHRoYW4gMTQgY2hhcmFjdGVycy4KLQotVGh1IFNlcCAyNSAxMzoxMzoxMSAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGVybi5jeWdudXMuY29tKQotCi0JKiBpbnRyby50ZXhpOiBBZGQgY2xvc2luZyBpZnNldC4KLQotTW9uIFNlcCAgMSAxMDozMTozMiAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogTW92ZSBzZXR0aW5nIEhPU1QgYW5kIFRBUkdFVCB0byB0aGUgYmVnaW5uaW5nCi0Jb2YgdGhlIGZpbGUgZm9yIGVkaXRpbmcgY29udmVuaWVuY2UuCi0KLU1vbiBTZXAgIDEgMTA6Mjg6MzcgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW4uOiBNb3JlIGZyaWVuZGx5IG9wdGlvbnMvbWVzc2FnZXMgd2hlbiBleHRyYWN0aW5nCi0JZnJvbSBhIGZpbGUgaW5zdGVhZCBvZiBhIHRhcGUgZGV2aWNlLgotCi1UdWUgSnVuIDE3IDE1OjUwOjIzIDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBBZGQgL3Vzci9ic2QgdG8gUEFUSCBmb3IgSXJpeCAoaG9tZSBvZiBjb21wcmVzcykKLQotVGh1IEp1biAxMiAxMzo0NzowMCAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIEluc3RhbGwuaW4gKHNob3dfZXhlY19wcmVmaXhfbXNnKTogZml4IHF1b3RpbmcKLQotV2VkIEp1biAgNCAxNTozMTo0MyAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiByZWJ1aWxkaW5nLnRleGk6IFJlbW92ZWQuCi0KLVNhdCBNYXkgMjQgMTg6MDI6MjAgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIGNyb3NzLXRvb2xzLWZpeDogIFJlbW92ZSBob3N0IGNoZWNrIHNpbmNlIGl0IGRvZXNuJ3QgbWF0dGVyCi0JZm9yIHRoaXMgY2FzZS4KLQkqIEluc3RhbGwuaW4gKGd1ZXNzX3N5c3RlbSk6IGNsZWFuIHVwIG1vcmUgdW51c2VkIGhvc3RzLgotCSogSW5zdGFsbC5pbiwgY3Jvc3MtdG9vbHMtZml4LCBjb21wLXRvb2xzLWZpeCwgY29tcC10b29scy12ZXJpZnk6Ci0JSGFjayBmb3IgaG9zdCBjaGVjayB0byBub3Qgd2FybiB0aGUgdXNlciBmb3IgY2VydGFpbiBjYXNlcy4KLQotRnJpIE1heSAyMyAyMzo0NjoxMCAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogc3Vic3Qtc3RyaW5nczogUmVtb3ZlIGEgbG90IG9mIHVudXNlZCBjb2RlCi0JKiBJbnN0YWxsLmluOiBSZW1vdmUgcmVmZXJlbmNlIHRvIFRBUEVkZmx0LCB1c2UgdmFyaWFibGVzIGluc3RlYWQgb2YKLQlzdHJpbmcgc3Vic3RpdHV0aW9uIHdoZW4gYWJsZS4KLQotRnJpIEFwciAxMSAxNzoyNTo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGZpbGUgbmFtZWQgaW4gQUNfSU5JVCB0byBNYWtlZmlsZS5pbi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEFwciAxMSAxODoxMjo0MiAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBJbnN0YWxsLmluIChndWVzc19zeXN0ZW0pOiBCYWNrIG91dCBjaGFuZ2UgdG8gSU5TVEFMTEhPU1QgdG8KLQljYWxsIGFsbCBJUklYIHN5c3RlbXMgIm1pcHMtc2dpLWlyaXg0IgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gY29uZmlndXJlLnRleGkgYW5kIGNmZy1wYXBlci50ZXhpLgotCi1UaHUgQXByIDEwIDIzOjI2OjQ1IDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIHNyY3RyZWUudGV4aSwgZW1hY3MtcmVsbm90ZXMudGV4aSwgY2ZnLXBhcGVyLnRleGk6IFJlbW92ZS4KLQkqIEluc3RhbGwuaW46IFJlbW92ZSBVbHRyaXgtc3BlY2lmaWMgaGFja3MuCi0JVXBkYXRlIEN5Z251cyBwaG9uZSBudW1iZXJzLgotCShndWVzc19zeXN0ZW0pOiBSZW1vdmUgc29tZSBvbGQgc3lzdGVtcyAoVWx0cml4LCBPU0YxIHYxICYgMiwKLQltNjhrLUhQVVgsIG02OGsgU3VuT1MsIGV0Yy4pCi0JKHNob3dfZ251X3Jvb3RfbXNnKTogUmVtb3ZlLgotCVJlbW92ZWQgYWxsIHRoZSByZW1vdmUgb3B0aW9uIGNvZGUuCi0KLVRodSBBcHIgMTAgMjM6MjM6MzMgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogY29uZmlndXJlLm1hbiwgY29uZmlndXJlLnRleGk6IFJlbW90ZS4KLQotTW9uIEFwciAgNyAxODoxNTowMCAxOTk3ICBCcmVuZGFuIEtlaG9lIDxicmVuZGFuQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBGaXggdGhlIHZlcnNpb24gc3RyaW5nIGZvciBPU0YxIDQuMCB0byByZWNvZ25pemUgZWl0aGVyCi0gICAgICAgIFY0Liogb3IgWDQuKgotCi1Nb24gQXByICA3IDE1OjM0OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhbmRhcmRzLnRleGksIG1ha2Utc3Rkcy50ZXhpOiBVcGRhdGUgdG8gY3VycmVudCBGU0YgdmVyc2lvbnMuCi0KLVR1ZSBOb3YgMTkgMTU6MzY6MTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbWFrZS1yZWwtc3ltLXRyZWU6IE5ldyBmaWxlLgotCi1XZWQgT2N0IDIzIDAwOjM0OjA3IDE5OTYgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBMb3RzIG9mIHBhdGNoZXMgZnJvbSBwcm9ncmVzc2l2ZS4uLgotIAkqIEluc3RhbGwuaW46IHJlc3RvcmUgRERPUFRTIGZvciBBSVggNC54Ci0gCSogSW5zdGFsbC5pbiwgc3Vic3Qtc3RyaW5nczogYWRkIGNhc2UgZm9yIERHIEF2aWlvbgotIAkqIHN1YnN0LXN0cmluZ3M6IGZpeCB0eXBvIGluIElOU1RBTExkaXIgdmFyIHNldHRpbmcKLSAJKiBjb21wLXRvb2xzLXZlcmlmeTogc2V0IFNITElCX1BBVEggZm9yIHNoYXJlZCBsaWJzCi0gCSogSW5zdGFsbC5pbiwgc3Vic3Qtc3RyaW5nczogIGFkZCBjYXNlIGZvciBzb2xhcmlzMi41Ci0gCSogSW5zdGFsbC5pbjogZml4IHJlZ3Jlc3Npb24gZm9yIGhwcGExLjEgY2hlY2sKLSAJKiBjb21wLXRvb2xzLWZpeDogc2V0IExEX0xJQlJBUllfUEFUSAotIAkqIGNvbXAtdG9vbHMtZml4OiBJZiBmaXhpbmNsdWRlcyBmaXhlcyAvdXNyL2luY2x1ZGUvbGltaXRzLmgsCi0gCWluc3RhbGwgaXQgYXMgc3lzbGltaXRzLmguCi0KLVdlZCBPY3QgMTYgMTk6MjA6NDIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBJbnN0YWxsLmluIChndWVzc19zeXN0ZW0pOiBUcmVhdCBwb3dlcnBjLWlibS1haXg0LjEgdGhlIHNhbWUgYXMKLQlyczYwMDAtaWJtLWFpeDQuMSwgc2luY2UgdGhlIGNvbXBpbGVyIG5vdyB1c2VzIGNvbW1vbiBtb2RlIGJ5Ci0JZGVmYXVsdC4KLQotV2VkIE9jdCAgMiAxNTozOTowNyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBjb25maWd1cmUuaW4gKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUuCi0KLVdlZCBPY3QgIDIgMTQ6MzM6NTggMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogY29uZmlndXJlLmluOiBTd2l0Y2ggdG8gYXV0b2NvbmYgY29uZmlndXJlLmluLgotCSogY29uZmlndXJlOiBOZXcuCi0JKiBNYWtlZmlsZS5pbjogVXNlIGF1dG9jb25mLXN1YnN0aXR1dGVkIHZhbHVlcy4KLQotVHVlIEp1biAyNSAxODo1NjowOCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoZGF0YWRpcik6IENoYW5nZWQgdG8gJChwcmVmaXgpL3NoYXJlLgotCi1GcmkgTWFyIDI5IDExOjM4OjAxIDE5OTYgIEouVC4gQ29ua2xpbiAgKGp0Y0BsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5tYW46IENoYW5nZWQgdG8gYmUgcmVjb2duaXplZCBieSBjYXRtYW4gLXcgb24gU29sYXJpcy4KLQotV2VkIERlYyAgNiAxNTo0MDoyOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb21wLXRvb2xzLWZpeCAoZml4aW5jbHVkZXMpOiBEZWZpbmUgRklYUFJPVE9fREVGSU5FUyBmcm9tCi0JLi4uL2luc3RhbGwtdG9vbHMvZml4cHJvdG8tZGVmaW5lcy4KLQotU3VuIE5vdiAxMiAxOTozMToyNyAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29tcC10b29scy12ZXJpZnkgKHZlcmlmeV9jeHhfaW5pdGlhbGl6ZXJzKTogZGVsZXRlIGFyZ3YsCi0JYXJnYyBkZWNsYXJhdGlvbnMsIGFkZCAtc3RhdGljIHRvIGNvbXBpbGUgbGluZS4KLQkodmVyaWZ5X2N4eF9oZWxsb193b3JsZCk6IGRlbGV0ZSBhcmd2LCBhcmdjIGRlY2xhcmF0aW9ucywgYWRkCi0JLXN0YXRpYyB0byBjb21waWxlIGxpbmUuCi0KLVdlZCBTZXAgMjAgMTM6MjE6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQsIHN5bm9ueW0gZm9yCi0JcmVhbGNsZWFuLgotCi1Nb24gQXVnIDI4IDE3OjI1OjQ5IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluIChQQVRIKTogIGFkZCAvdXNyL3VjYiB0byAkUEFUSCAoZm9yIFN1bk9TIDQuMS54KS4KLQotVHVlIEF1ZyAxNSAyMTo1MTo1OCAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbiAoZ3Vlc3Nfc3lzdGVtKTogTWF0Y2ggT1NGLzEgdjMueCBhcyB0aGUgc2FtZSBhcyAKLSAgICAgICAgdjIueC0tdjIueCBiaW5hcmllcyBhcmUgdXB3YXJkIGNvbXBhdGlibGUuCi0KLVR1ZSBBdWcgMTUgMjE6NDY6NTQgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW4gKGd1ZXNzX3N5c3RlbSk6IHJlY29nbml6ZSBIUCA5MDAwLzgwMCBzeXN0ZW1zIGFzIHRoZQotCXNhbWUgYXMgSFAgOTAwMC83MDAgc3lzdGVtcy4KLQotVHVlIEF1ZyAgOCAxMzoxMTo1NiAxOTk1ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIEluc3RhbGwuaW46IEZvciBlbWFjcywgcnVuIHNob3dfZW1hY3NfYWx0ZXJuYXRlX21zZyBhbmQgZXhpdC4KLQkoc2hvd19lbWFjc19hbHRlcm5hdGVfbXNnKTogTmV3IG1lc3NhZ2Ugc2F5aW5nIGhvdyBlbWFjcyBjYW4ndCBiZQotCWluc3RhbGxlZCBpbiBhbiBhbHRlcm5hdGUgcHJlZml4LgotCi1UaHUgSnVuICA4IDAwOjQyOjU2IDE5OTUgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgIDxhbmdlbGFAY2lyZGFuLmN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzdWJzdC1zdHJpbmdzOiBjaGFuZ2UgZHUgY29tbWFuZHMgdG8gJEJJTkRJUi8uICYgJFNSQ0RJUi8uIGp1c3QKLSAgICAgICAgaW4gY2FzZSB0aGV5IGFyZSBzeW1saW5rcy4KLQotVHVlIEFwciAxOCAxNDoyMzoxMCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNkay1maXg6IEV4dHJhY3RlZCB0YWJsZSBvZiB0YXJnZXRzIHRoYXQgZG9uJ3QgbmVlZCB0aGVpcgotCSAgaGVhZGVycyBmaXhlZCBmcm9tIGdjYydzIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLQkqIGNkay1maXgsIGNkay12ZXJpZnk6IFVzZSAke0hPU1R9IGluc3RlYWQgb2YgfHxIT1NUc3RyfHwKLQotCSogY2RrLWZpeCwgY2RrLXZlcmlmeTogTmV3IGZpbGVzLCBpbnN0YWxsIHNjcmlwdCBmcmFnbWVudHMgdXNlZAotCSAgZm9yIEN5Z251cyBEZXZlbG9wZXIncyBLaXQuCi0KLQkqIEluc3RhbGwuaW4gKGRvX21rZGlyKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBJbnN0YWxsLmluOiBBZGRlZCBzdXBwb3J0IGZvciAtLXdpdGggYW5kIC0td2l0aG91dCBvcHRpb25zLgotCSAgQ2hhbmdlZCBzbyB0aGF0IHRhcGUgY29tbWFuZHMgYXJlIG5vdCBydW4gd2hlbiBleHRyYWN0aW5nIAotCSAgZnJvbSBhIGZpbGUuCi0JICAoZG9fbXQpOiBDaGFuZ2VkIHRvIHRha2Ugb25seSBvbmUgYXJndW1lbnQuCi0KLVdlZCBNYXIgMjkgMTE6MTY6MzggMTk5NSAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogY2F0Y2ggVU5BTUU9PWFscGhhLWRlYy1vc2YyLnggYW5kIGNvcnJlY3QgZW50cnkgZm9yCi0JYWxwaGEtZGVjLW9zZjEueAotCQotRnJpIEphbiAyNyAxMjowNDoyOSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHN1YnN0LXN0cmluZ3MgKG1pcHMtc2dpLWlyaXg1KTogTmV3IGVudHJ5IGluIHRhYmxlLgotCi1UaHUgSmFuIDE5IDEyOjE1OjQ0IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogSW5zdGFsbC5pbjogTWFqb3IgcmV3cml0ZSwgYnVuZGxlIGRlcGVuZGVudCBjb2RlIChmb3IgZXhhbXBsZSwKLQkgIGZpeGluY2x1ZGVzIGZvciBjb21wLXRvb2xzKSB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIEluc3RhbGwKLQkgIHNjcmlwdCB3aGVuIGl0IGlzIGdlbmVyYXRlZC4KLQotVHVlIEphbiAxNyAxNjo1MTozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IFJlYnVpbGQgdXNpbmcgJChTSEVMTCkuCi0KLVRodSBOb3YgIDMgMTk6MzA6MzMgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IERlcGVuZCBvbiBpbmZvLgotCi1GcmkgQXVnIDE5IDE2OjE2OjM4IDE5OTQgIEphc29uIE1vbGVuZGEgICAgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBzZXQgJEZJWF9IRUFERVIgc28gZml4cHJvdG8gY2FuIGZpbmQgZml4LWhlYWRlci4KLQotRnJpIE1heSAgNiAxNjoxODo1OCAxOTk0ICBKYXNvbiBNb2xlbmRhICAgICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBhZGQgYSBzZW1pY29sb24gaW4gdGhlIGlmIHN0YXRlbWVudC4KLQotRnJpIEFwciAyOSAxNjo1NjowNyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNmZy1wYXBlci50ZXhpOiBVcGRhdGUgc29tZSBvdXRkYXRlZCBpbmZvcm1hdGlvbi4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IFBhc3MgZmlsZSwgbm90IGRpcmVjdG9yeSwgYXMgbGFzdAotCWFyZyB0byBJTlNUQUxMX0RBVEEuCi0JKHVuaW5zdGFsbCk6IE5ldyB0YXJnZXQuCi0KLVRodSBBcHIgMjggMTQ6NDI6MjIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUudGV4aTogQ29tbWVudCBvdXQgQHNtYWxsYm9vay4KLQotCSogTWFrZWZpbGUuaW46IERlZmluZSBURVhJMkRWSSBhbmQgVEVYSURJUiwgYW5kIHVzZSB0aGUgbGF0dGVyLgotCVJlbW92ZSBpbmZvIGZpbGVzIGluIHJlYWxjbGVhbiwgbm90IGNsZWFuLCBwZXIgY29kaW5nIHN0YW5kYXJkcy4KLQlSZW1vdmUgVGVYIG91dHB1dCBpbiBjbGVhbi4KLQotVHVlIEFwciAyNiAxNzoxODowMyAxOTk0ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIEluc3RhbGwuaW46ICBmaXhpbmNsdWRlcyBvdXRwdXQgaXMgYWN0dWFsbHkgcHV0IGluIGZpeGluY2x1ZGVzLmxvZywKLSAgICAgICAgYnV0IGVjaG8nZWQgbWVzc2FnZXMgY2xhaW0gaXQgaXMgZml4aW5jLmxvZy4gIFRoaXMgaXMgdGhlIHNhbWUKLQltZXNzYWdlcyBhcyBJIGxvZ2dlZCBpbiBNYXJjaCA0IDE5OTQsIGJ1dCBmb3Igc29tZSByZWFzb24gd2UgZm91bmQKLQl0aGUgY2hhbmdlIGhhZG4ndCBiZWVuIGRvbmUuICBJJ2xsIGhhdmUgdG8gZGlnIHRocm91Z2ggdGhlIGxvZ3MKLQlhbmQgZmluZCBvdXQgd2hhdCBJIHJlYWxseSBkaWQgZG8gdGhhdCBkYXkuIDopCi0KLU1vbiBBcHIgMjUgMjA6Mjg6MTkgMTk5NCAgSmFzb24gTW9sZW5kYSAgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogIHVzZSBldmFsIHRvIGNhbGwgZG9fbXQoKSBmb3IgVWx0cml4IGJyb2tlbm5lc3MuCi0KLU1vbiBBcHIgMjUgMjA6MDA6MDAgMTk5NCAgSmFzb24gTW9sZW5kYSAgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbihkb19tdCk6IGV4aXQgd2l0aCBlcnJvciBzdGF0dXMgMSBpZiAjIG9mIHBhcmFtZXRlcnMKLQkhPSAzLgotCi1Nb24gQXByIDI1IDE5OjQyOjM2IDE5OTQgIEphc29uIE1vbGVuZGEgICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46ICBsb3NlIFRBUEVfRk9SV0FSRCBhbmQgVEFQRV9SRVdJTkQsIGFkZCBkb19tdCgpCi0JdG8gZG8gYWxsIHRhcGUgbW92ZW1lbnQgb3BlcmF0aW9ucy4gIEN1cnJlbnRseSB1bnRlc3RlZC4gIEFkZHJlc3NlcwotCVBSICMgNDg4NiBmcm9tIGJ1bGwuCi0KLQkqIEluc3RhbGwuaW46IGFkZCAxOTk0IHRvIHRoZSBjb3B5cmlnaHQgdGhpbmcuCi0KLUZyaSBBcHIgMjIgMTk6MDU6MTMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdGFuZGFyZHMudGV4aTogVXBkYXRlIGZyb20gRlNGLgotCi1GcmkgQXByIDIyIDE1OjQ2OjEwIDE5OTQgIEphc29uIE1vbGVuZGEgKGNyYXNoQGN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IEFkZCAkRERPUFRTLCBoYXMgYGBicz0xMjRiJycgZm9yIGFsbCBzeXN0ZW1zIGV4Y2VwdAotCUFJWCAoc29tZSB2ZXJzaW9ucyBvZiBBSVggZG9uJ3QgdW5kZXJzdGFuZCBicz0xMjRiLiAgU2lsbHkgT1MpLgotCi1Nb24gQXByICA0IDIyOjU1OjA1IDE5OTQgIEphc29uIE1vbGVuZGEgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBudWxsIG91dCAkVE9PTFMgYmVmb3JlIGFkZGluZyBzdHVmZiB0byBpdAotCW5vbi1kZXN0cnVjdGl2ZWx5LgotCi1XZWQgTWFyIDMwIDIxOjQ1OjM1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGk6IEZpeCB0eXBvLgotCi0JKiBjb25maWd1cmUudGV4aSwgY29uZmlndXJlLm1hbjogRG9jdW1lbnQgLS1kaXNhYmxlLS4KLQotTW9uIE1hciAyOCAxMzoyMjoxNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiBVcGRhdGUgZnJvbSBGU0YuCi0KLVNhdCBNYXIgMjYgMDk6MjE6NDQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdGFuZGFyZHMudGV4aSwgbWFrZS1zdGRzLnRleGk6IFVwZGF0ZSBmcm9tIEZTRi4KLQotRnJpIE1hciAyNSAyMjo1OTo0NSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS50ZXhpLCBjb25maWd1cmUubWFuOiBEb2N1bWVudCAtLWVuYWJsZS0qIG9wdGlvbnMuCi0KLVdlZCBNYXIgMjMgMjM6Mzg6MjQgMTk5NCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBzZXQgQ1BQIHRvIGJlIGdjYyAtRSBmb3IgZml4aW5jbHVkZXMuCi0KLVdlZCBNYXIgMjMgMTM6NDI6NDggMTk5NCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0gICAgICAgICogSW5zdGFsbC5pbjogc2V0IFBBVEggdG8gJFBBVEg6L2JpbjovdXNyL2JpbiBzbyB3ZSBjYW4gcGljawotICAgICAgICB1cCBuYXRpdmUgdG9vbHMgZXZlbiBpZiB0aGUgdXNlciBkb2Vzbid0IGhhdmUgdGhlbSBpbiBoaXMKLSAgICAgICAgcGF0aC4KLQotICAgICAgICAqIEluc3RhbGwuaW46IGBgaHBwYS0xLjEtaHAtaHB1eCcnIC0+IGBgaHBwYTEuMS1ocC1ocHV4JycuCi0KLVR1ZSBNYXIgMTUgMjI6MDk6MjAgMTk5NCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotICAgICAgICAKLSAgICAgICAgKiBJbnN0YWxsLmluOiBUQVBFX1JFV0lORCBhbmQgVEFQRV9GT1JXQVJEIHZhcmlhYmxlcyBmb3IgVW5peHVuYXdhcmUsCi0gICAgICAgIGFkZGVkIHN3aXRjaCBzdGF0ZW1lbnQgdG8gZGV0ZWN0IGlmIHN5c3RlbSBpcyBVbml4dW5hd2FyZS4KLQotRnJpIE1hciAgNCAxMjoxMDozMCAxOTk0ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIEluc3RhbGwuaW46ICBmaXhpbmNsdWRlcyBvdXRwdXQgaXMgYWN0dWFsbHkgcHV0IGluIGZpeGluY2x1ZGVzLmxvZywKLSAgICAgICAgYnV0IGVjaG8nZWQgbWVzc2FnZXMgY2xhaW0gaXQgaXMgZml4aW5jLmxvZy4KLQotV2VkIE5vdiAgMyAwMjo1ODowMiAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3Vic3Qtc3RyaW5nczogIG91dHB1dCBURVhCVU5ETEUgZm9yIG1vcmUgaW5zdGFsbCBub3RlcyBtYXRjaGluZwotCSogaW5zdGFsbC10ZXhpLmluOiAgUFJNUyBpbmZvIG5vdyBleGlzdHMKLQotVHVlIE9jdCAyNiAxNjo1NzoxMiAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIHN1YnN0LXN0cmluZ3M6IG1hdGNoIHNvbGFyaXMqLiAgQWxzbywgYWRkIGRlZmF1bHQgY2FzZSB0byBjYXRjaAotCSAgYW5kIGVycm9yIG91dCBmb3IgdW5yZWNvZ25pemVkIHN5c3RlbXMuCi0KLVRodSBBdWcgMTkgMTg6MjE6MzEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBoYW5kbGUgdGhlIG5ldyBmaXhwcm90byB3b3JrCi0KLU1vbiBKdWwgMTkgMTI6MDU6NDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiByZW1vdmUgIk1UPXRjdGwiIGZvciBBSVggKG5vdCBuZWVkZWQsIGFuZCBiYXJlbHkKLQl3b3JrZWQgYW55d2F5KQotCi1Nb24gSnVuIDE0IDE5OjA5OjIyIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLQkqIHN1YnN0LXN0cmluZ3M6IGNoYW5nZWQgSE9TVCB0byByZWNvZ25pemUgU29sYXJpcyBmb3IgaW5zdGFsbCBub3RlcwotCi1UaHUgSnVuIDEwIDE2OjAxOjI1IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLQkqIGRvcy1pbnN0LnRleGk6ICBuZXcgZmlsZS4KLQotV2VkIEp1biAgOSAxOToyMzo1OSAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBydGwuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGluc3RhbGwtdGV4aS5pbjogICAgICAgIGFkZGVkIGNvbmRpdGlvbmFscyAobmVhcmx5IGNvbXBsZXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuZWQgdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBzdXBwb3J0IGZvciBvdGhlciByZWxlYXNlcyAobm90IGRvbmUpCi0KLVdlZCBKdW4gIDkgMTU6NTM6NTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBVc2UgSU5TVEFMTF9EQVRBLgotCSh7ZGlzdCxyZWFsfWNsZWFuKTogQWxzbyBkZWxldGUgTWFrZWZpbGUgYW5kIGNvbmZpZy5zdGF0dXMuCi0KLUZyaSBKdW4gIDQgMTc6MDk6NTYgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogc3Vic3Qtc3RyaW5nczogIGFkZGVkIGRhdGEgZm9yIE9TX1NUUklORwotCi0JKiBzdWJzdC1zdHJpbmdzOiAgYWRkZWQgc3VwcG9ydCBmb3IgT1NfU1RSSU5HCi0KLVRodSBKdW4gIDMgMDA6Mzc6MDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBwdWxsIENPUFlJTkcgYW5kIENPUFlJTkcuTElCIG9mZiBvZiB0aGUgdGFwZSAKLQotVHVlIEp1biAgMSAxNjo1MjowOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHN1YnN0LXN0cmluZ3M6IHJlcGxhY2UgUkVMRUFTRV9ESVIgdG9vCi0KLU1vbiBNYXIgMjIgMjM6NTU6MjcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGxjaGVjayB0YXJnZXQKLQotV2VkIE1hciAxNyAwMjoyMToxNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IGZpeCAnc291cmNlIG9ubHknIGV4dHJhY3Rpb24gYnVnIHdoZXJlIGl0IGxvb2tlZCBmb3IKLQl0aGUgc3JjIGRpciB1bmRlciBILTxob3N0Pi9zcmMgaW5zdGVhZCBvZiBzcmM7IGFsc28gcmVtb3ZlIHN0cmF5Ci0JcmVmZXJlbmNlIHRvIEVNQUNTSElCSU4KLQotTW9uIE1hciAxNSAwMToyNTo0NSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIG1ha2Utc3Rkcy50ZXhpOiBhZGRlZCAnaW5zdGFsbGNoZWNrJyB0byB0aGUgc3RhbmRhcmQgdGFyZ2V0cwotCi1UdWUgTWFyICA5IDE5OjQ4OjI4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGk6IGFkZGVkIElORk8tRElSLUVOVFJZLCB1cGRhdGVkIHZlcnNpb24gZnJvbSB0aGUgRlNGCi0KLVR1ZSBGZWIgIDkgMTI6NDA6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3RhbmRhcmRzLmluZm8pOiBBZGRlZCAtSSQoc3JjZGlyKSB0byBmaW5kCi0JbWFrZS1zdGRzLnRleGkuCi0KLU1vbiBGZWIgIDEgMTY6MzI6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBzdGFuZGFyZHMudGV4aTogdXBkYXRlZCB0byBsYXRlc3QgRlNGIHZlcnNpb24sIHdoaWNoIGluY2x1ZGVzOgotCi0JKiBtYWtlLXN0ZHMudGV4aTogbmV3IGZpbGUKLQotTW9uIE5vdiAzMCAwMTozMTo0MCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwtdGV4aS5pbiwgcmVsbm90ZXMudGV4aSwgaW50cm8udGV4aTogY2hhbmdlZCBDeWdudXMgcGhvbmUKLQludW1iZXJzIGZyb20gdGhlIG9sZCBQYWxvIEFsdG8gb25lcyB0byB0aGUgbmV3IE10bi4gVmlldyBudW1iZXJzCi0KLU1vbiBOb3YgMTYgMTY6NTA6NDMgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lICQoUk0pIHRvICJybSAtZiIKLQotU3VuIE9jdCAxMSAxNjowNTo0OCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGludHJvLnRleGk6IGFkZGVkIElORk8tRElSLUVOVFJZCi0KZGlmZiAtLWdpdCBhL2V0Yy9NYWtlZmlsZS5pbiBiL2V0Yy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVkYzhjOS4uMDAwMDAwMAotLS0gYS9ldGMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotIyAKLSMgTWFrZWZpbGUuaW4gZm9yIGV0YwotIwotCi1wcmVmaXggCQk9IEBwcmVmaXhACi1leGVjX3ByZWZpeCAJPSBAZXhlY19wcmVmaXhACi0KLXNyY2RpciAgPSBAc3JjZGlyQAotVlBBVEgJPSBAc3JjZGlyQAotCi1iaW5kaXIgID0gQGJpbmRpckAKLWxpYmRpciAgPSBAbGliZGlyQAotdG9vbGRpciA9ICQobGliZGlyKQotZGF0YWRpciA9IEBkYXRhZGlyQAotCi1tYW5kaXIgID0gQG1hbmRpckAKLW1hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQotbWFuMmRpciA9ICQobWFuZGlyKS9tYW4yCi1tYW4zZGlyID0gJChtYW5kaXIpL21hbjMKLW1hbjRkaXIgPSAkKG1hbmRpcikvbWFuNAotbWFuNWRpciA9ICQobWFuZGlyKS9tYW41Ci1tYW42ZGlyID0gJChtYW5kaXIpL21hbjYKLW1hbjdkaXIgPSAkKG1hbmRpcikvbWFuNwotbWFuOGRpciA9ICQobWFuZGlyKS9tYW44Ci1tYW45ZGlyID0gJChtYW5kaXIpL21hbjkKLWluZm9kaXIgPSBAaW5mb2RpckAKLQotU0hFTEwgPSAvYmluL3NoCi0KLUlOU1RBTEwgCT0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9EQVRBICAgID0gQElOU1RBTExfREFUQUAKLQotTUFLRUlORk8gPSBgaWYgWyAtZiAuLi90ZXhpbmZvL21ha2VpbmZvL21ha2VpbmZvIF07IFwKLQl0aGVuIGVjaG8gLi4vdGV4aW5mby9tYWtlaW5mby9tYWtlaW5mbzsgXAotCWVsc2UgZWNobyBtYWtlaW5mbzsgZmlgCi1URVhJMkRWSSA9IGBpZiBbIC1mIC4uL3RleGluZm8vdXRpbC90ZXhpMmR2aSBdOyBcCi0JdGhlbiBlY2hvIC4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgXAotCWVsc2UgZWNobyB0ZXhpMmR2aTsgZmlgCi1URVhJMkhUTUwgPSB0ZXhpMmh0bWwKLURWSVBTID0gZHZpcHMKLQotIyBXaGVyZSB0byBmaW5kIHRleGluZm8udGV4IHRvIGZvcm1hdCBkb2N1bWVudGF0aW9uIHdpdGggVGVYLgotVEVYSURJUiA9ICQoc3JjZGlyKS8uLi90ZXhpbmZvCi0KLSMjIyMgSG9zdCwgdGFyZ2V0LCBhbmQgc2l0ZSBzcGVjaWZpYyBNYWtlZmlsZSBmcmFnbWVudHMgY29tZSBpbiBoZXJlLgotIyMjCi0KLUlORk9GSUxFUyA9IHN0YW5kYXJkcy5pbmZvIGNvbmZpZ3VyZS5pbmZvCi1EVklGSUxFUyA9IHN0YW5kYXJkcy5kdmkgY29uZmlndXJlLmR2aQotCi1hbGw6Ci0KLWluc3RhbGw6Ci0KLXVuaW5zdGFsbDoKLQotaW5mbzoKLQlmb3IgZiBpbiAkKElORk9GSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJChzcmNkaXIpL2BlY2hvICQkZiB8IHNlZCAtZSAncy8uaW5mbyQkLy50ZXhpLydgOyB0aGVuIFwKLQkgICAgaWYgJChNQUtFKSAiTUFLRUlORk89JChNQUtFSU5GTykiICQkZjsgdGhlbiBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBlbHNlIFwKLQkgICAgICBleGl0IDE7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1pbnN0YWxsLWluZm86IGluZm8KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbWtpbnN0YWxsZGlycyAkKGluZm9kaXIpCi0JaWYgdGVzdCAhIC1mIHN0YW5kYXJkcy5pbmZvOyB0aGVuIGNkICQoc3JjZGlyKTsgZmk7IFwKLQlpZiB0ZXN0IC1mIHN0YW5kYXJkcy5pbmZvOyB0aGVuIFwKLQkgIGZvciBpIGluIHN0YW5kYXJkcy5pbmZvKjsgZG8gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRpICQoaW5mb2RpcikvJCRpOyBcCi0JICBkb25lOyBcCi0JZmkKLQlpZiB0ZXN0ICEgLWYgY29uZmlndXJlLmluZm87IHRoZW4gY2QgJChzcmNkaXIpOyBmaTsgXAotCWlmIHRlc3QgLWYgY29uZmlndXJlLmluZm87IHRoZW4gXAotCSAgZm9yIGkgaW4gY29uZmlndXJlLmluZm8qOyBkbyBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGkgJChpbmZvZGlyKS8kJGk7IFwKLQkgIGRvbmU7IFwKLQlmaQotCi1kdmk6Ci0JZm9yIGYgaW4gJChEVklGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJChzcmNkaXIpL2BlY2hvICQkZiB8IHNlZCAtZSAncy8uZHZpJCQvLnRleGkvJ2A7IHRoZW4gXAotCSAgICBpZiAkKE1BS0UpICJURVhJMkRWST0kKFRFWEkyRFZJKSIgJCRmOyB0aGVuIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGV4aXQgMTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0KLXN0YW5kYXJkcy5pbmZvOiAkKHNyY2Rpcikvc3RhbmRhcmRzLnRleGkgJChzcmNkaXIpL21ha2Utc3Rkcy50ZXhpCi0JJChNQUtFSU5GTykgLS1uby1zcGxpdCAtSSQoc3JjZGlyKSAtbyBzdGFuZGFyZHMuaW5mbyAkKHNyY2Rpcikvc3RhbmRhcmRzLnRleGkKLQotc3RhbmRhcmRzLmR2aTogJChzcmNkaXIpL3N0YW5kYXJkcy50ZXhpCi0JVEVYSU5QVVRTPSQoVEVYSURJUik6JCRURVhJTlBVVFMgJChURVhJMkRWSSkgJChzcmNkaXIpL3N0YW5kYXJkcy50ZXhpCi0KLXN0YW5kYXJkcy5wczogc3RhbmRhcmRzLmR2aQotCSQoRFZJUFMpIHN0YW5kYXJkcy5kdmkgLW8gc3RhbmRhcmRzLnBzCi0KLSMgbWFrZWluZm8gcmVxdWlyZXMgaW1hZ2VzIHRvIGJlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLWNvbmZpZ3VyZS5pbmZvOiAkKHNyY2RpcikvY29uZmlndXJlLnRleGkgJChzcmNkaXIpL2NvbmZpZ2Rldi50aW4gJChzcmNkaXIpL2NvbmZpZ2J1aWxkLnRpbgotCXJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVpbGQudHh0Ci0JY3AgJChzcmNkaXIpL2NvbmZpZ2Rldi50aW4gY29uZmlnZGV2LnR4dAotCWNwICQoc3JjZGlyKS9jb25maWdidWlsZC50aW4gY29uZmlnYnVpbGQudHh0Ci0JJChNQUtFSU5GTykgLUkkKHNyY2RpcikgLW8gY29uZmlndXJlLmluZm8gJChzcmNkaXIpL2NvbmZpZ3VyZS50ZXhpCi0Jcm0gLWYgY29uZmlnZGV2LnR4dCBjb25maWdidWlsZC50eHQKLQotIyB0ZXhpMmR2aSB3YW50cyBib3RoIHRoZSAudHh0IGFuZCB0aGUgLmVwcyBmaWxlcy4KLWNvbmZpZ3VyZS5kdmk6ICQoc3JjZGlyKS9jb25maWd1cmUudGV4aSAkKHNyY2RpcikvY29uZmlnZGV2LnRpbiAkKHNyY2RpcikvY29uZmlnYnVpbGQudGluICQoc3JjZGlyKS9jb25maWdkZXYuZWluICQoc3JjZGlyKS9jb25maWdidWlsZC5laW4KLQlybSAtZiBjb25maWdkZXYudHh0IGNvbmZpZ2J1aWxkLnR4dAotCWNwICQoc3JjZGlyKS9jb25maWdkZXYudGluIGNvbmZpZ2Rldi50eHQKLQljcCAkKHNyY2RpcikvY29uZmlnYnVpbGQudGluIGNvbmZpZ2J1aWxkLnR4dAotCXJtIC1mIGNvbmZpZ2Rldi5lcHMgY29uZmlnYnVpbGQuZXBzCi0JY3AgJChzcmNkaXIpL2NvbmZpZ2Rldi5laW4gY29uZmlnZGV2LmVwcwotCWNwICQoc3JjZGlyKS9jb25maWdidWlsZC5laW4gY29uZmlnYnVpbGQuZXBzCi0JVEVYSU5QVVRTPSQoVEVYSURJUik6JCRURVhJTlBVVFMgJChURVhJMkRWSSkgJChzcmNkaXIpL2NvbmZpZ3VyZS50ZXhpCi0Jcm0gLWYgY29uZmlnZGV2LnR4dCBjb25maWdidWlsZC50eHQKLQlybSAtZiBjb25maWdkZXYuZXBzIGNvbmZpZ2J1aWxkLmVwcwotCi0jIGR2aXBzIHJlcXVpcmVzIGltYWdlcyB0byBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkKLWNvbmZpZ3VyZS5wczogY29uZmlndXJlLmR2aSAkKHNyY2RpcikvY29uZmlnZGV2LmVpbiAkKHNyY2RpcikvY29uZmlnYnVpbGQuZWluCi0Jcm0gLWYgY29uZmlnZGV2LmVwcyBjb25maWdidWlsZC5lcHMKLQljcCAkKHNyY2RpcikvY29uZmlnZGV2LmVpbiBjb25maWdkZXYuZXBzCi0JY3AgJChzcmNkaXIpL2NvbmZpZ2J1aWxkLmVpbiBjb25maWdidWlsZC5lcHMKLQkkKERWSVBTKSBjb25maWd1cmUuZHZpIC1vIGNvbmZpZ3VyZS5wcwotCXJtIC1mIGNvbmZpZ2Rldi5lcHMgY29uZmlnYnVpbGQuZXBzCi0KLWNvbmZpZ3VyZS5odG1sOiAkKHNyY2RpcikvY29uZmlndXJlLnRleGkKLQkkKFRFWEkySFRNTCkgLXNwbGl0X2NoYXB0ZXIgJChzcmNkaXIpL2NvbmZpZ3VyZS50ZXhpCi0KLWNsZWFuOgotCXJtIC1mICouYXV4ICouY3AgKi5jcHMgKi5kdmkgKi5mbiAqLmZucyAqLmt5ICoua3lzICoubG9nCi0Jcm0gLWYgKi5wZyAqLnBncyAqLnRvYyAqLnRwICoudHBzICoudnIgKi52cnMKLQlybSAtZiBjb25maWdkZXYudHh0IGNvbmZpZ2J1aWxkLnR4dCBjb25maWdkZXYuZXBzIGNvbmZpZ2J1aWxkLmVwcwotCXJtIC1mIGNvbmZpZ2Rldi5qcGcgY29uZmlnYnVpbGQuanBnCi0KLW1vc3RseWNsZWFuOiBjbGVhbgotCi1kaXN0Y2xlYW46ICAgY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBjb25maWcuc3RhdHVzIGNvbmZpZy5jYWNoZQotCi1tYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogICBkaXN0Y2xlYW4KLQlybSAtZiAqLmluZm8qCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChob3N0X21ha2VmaWxlX2ZyYWcpICQodGFyZ2V0X21ha2VmaWxlX2ZyYWcpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMjIHRoZXNlIGxhc3QgdGFyZ2V0cyBhcmUgZm9yIHN0YW5kYXJkcy50ZXhpIGNvbmZvcm1hbmNlCi1kaXN0OgotY2hlY2s6Ci1pbnN0YWxsY2hlY2s6Ci1UQUdTOgpkaWZmIC0tZ2l0IGEvZXRjL2FkZC1sb2cuZWwgYi9ldGMvYWRkLWxvZy5lbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjODhlOC4uMDAwMDAwMAotLS0gYS9ldGMvYWRkLWxvZy5lbAorKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi07OzsgPT09PT09PT09PT09IE5PVEUgV0VMTCEgPT09PT09PT09PT09PQotOzs7Ci07OzsgWW91IG9ubHkgbmVlZCB0byB1c2UgdGhpcyBmaWxlIGlmIHlvdSdyZSB1c2luZyBhIHZlcnNpb24gb2YgRW1hY3MKLTs7OyBwcmlvciB0byAyMC4xIHRvIHdvcmsgb24gR0RCLiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMKLTs7OyBhbmQgdGhlIHN0YW5kYXJkIGFkZC1sb2cuZWwgcHJvdmlkZWQgd2l0aCAxOS4zNCBpcyB0aGF0IGl0Ci07OzsgZ2VuZXJhdGVzIGRhdGVzIHVzaW5nIHRoZSB0ZXJzZXIgZm9ybWF0IHVzZWQgYnkgRW1hY3MgMjAuICBUaGlzIGlzCi07OzsgdGhlIGZvcm1hdCByZWNvbW1lbmRlZCBmb3IgdXNlIGluIEdEQiBDaGFuZ2VMb2dzLgotOzs7Ci07OzsgVG8gdXNlIHRoaXMgY29kZSwgeW91IHNob3VsZCBjcmVhdGUgYSBkaXJlY3RvcnkgYH4vZWxpc3AnLCBzYXZlIHRoZSBjb2RlCi07OzsgYmVsb3cgaW4gYH4vZWxpc3AvYWRkLWxvZy5lbCcsIGFuZCB0aGVuIHB1dCBzb21ldGhpbmcgbGlrZSB0aGlzIGluCi07OzsgeW91ciBgfi8uZW1hY3MnIGZpbGUsIHRvIHRlbGwgRW1hY3Mgd2hlcmUgdG8gZmluZCBpdDoKLTs7OyAKLTs7OyAoc2V0cSBsb2FkLXBhdGgKLTs7OyAgICAgICAoY29ucyAoZXhwYW5kLWZpbGUtbmFtZSAifi9lbGlzcCIpCi07OzsgICAgICAgICAgICAgbG9hZC1wYXRoKSkKLTs7OyAKLTs7OyBJZiB5b3Ugd2FudCwgeW91IGNhbiBhbHNvIGJ5dGUtY29tcGlsZSBpdCAtLS0gaXQnbGwgcnVuIGEgbGl0dGxlCi07OzsgZmFzdGVyLCBhbmQgdXNlIGEgbGl0dGxlIGxlc3MgbWVtb3J5LiAgKE5vdCB0aGF0IHRob3NlIG1hdHRlciBtdWNoIGZvcgotOzs7IHRoaXMgZmlsZS4pICBUbyBkbyB0aGF0LCBhZnRlciB5b3UndmUgc2F2ZWQgdGhlIHRleHQgYXMKLTs7OyB+L2VsaXNwL2FkZC1sb2cuZWwsIGJyaW5nIGl0IHVwIGluIEVtYWNzLCBhbmQgdHlwZQotOzs7IAotOzs7ICAgICBDLXUgTS14IGJ5dGUtY29tcGlsZS1maWxlCi07OzsKLTs7OyAtLS0gSmltIEJsYW5keQotCi07OzsgYWRkLWxvZy5lbCAtLS0gY2hhbmdlIGxvZyBtYWludGVuYW5jZSBjb21tYW5kcyBmb3IgRW1hY3MKLQotOzsgQ29weXJpZ2h0IChDKSAxOTg1LCAxOTg2LCAxOTg4LCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi07OyBLZXl3b3JkczogbWFpbnQKLQotOzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEVtYWNzLgotCi07OyBHTlUgRW1hY3MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotOzsgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLTs7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLTs7IGFueSBsYXRlciB2ZXJzaW9uLgotCi07OyBHTlUgRW1hY3MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLTs7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi07OyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi07OyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi07OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotOzsgYWxvbmcgd2l0aCBHTlUgRW1hY3M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKLTs7IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotOzsgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLTs7OyBDb21tZW50YXJ5OgotCi07OyBUaGlzIGZhY2lsaXR5IGlzIGRvY3VtZW50ZWQgaW4gdGhlIEVtYWNzIE1hbnVhbC4KLQotOzs7IENvZGU6Ci0KLShkZWZ2YXIgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUgbmlsCi0gICIqTmFtZSBvZiBhIGNoYW5nZSBsb2cgZmlsZSBmb3IgXFxbYWRkLWNoYW5nZS1sb2ctZW50cnldLiIpCi0KLShkZWZ2YXIgYWRkLWxvZy1jdXJyZW50LWRlZnVuLWZ1bmN0aW9uIG5pbAotICAiXAotKklmIG5vbi1uaWwsIGZ1bmN0aW9uIHRvIGd1ZXNzIG5hbWUgb2YgY3VycmVudCBmdW5jdGlvbiBmcm9tIHN1cnJvdW5kaW5nIHRleHQuCi1cXFthZGQtY2hhbmdlLWxvZy1lbnRyeV0gY2FsbHMgdGhpcyBmdW5jdGlvbiAoaWYgbmlsLCBgYWRkLWxvZy1jdXJyZW50LWRlZnVuJwotaW5zdGVhZCkgd2l0aCBubyBhcmd1bWVudHMuICBJdCByZXR1cm5zIGEgc3RyaW5nIG9yIG5pbCBpZiBpdCBjYW5ub3QgZ3Vlc3MuIikKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ2YXIgYWRkLWxvZy1mdWxsLW5hbWUgbmlsCi0gICIqRnVsbCBuYW1lIG9mIHVzZXIsIGZvciBpbmNsdXNpb24gaW4gQ2hhbmdlTG9nIGRhaWx5IGhlYWRlcnMuCi1UaGlzIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYHVzZXItZnVsbC1uYW1lJyBmdW5jdGlvbi4iKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnZhciBhZGQtbG9nLW1haWxpbmctYWRkcmVzcyBuaWwKLSAgIipFbGVjdHJvbmljIG1haWwgYWRkcmVzcyBvZiB1c2VyLCBmb3IgaW5jbHVzaW9uIGluIENoYW5nZUxvZyBkYWlseSBoZWFkZXJzLgotVGhpcyBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgYHVzZXItbWFpbC1hZGRyZXNzJy4iKQotCi0oZGVmdmFyIGNoYW5nZS1sb2ctZm9udC1sb2NrLWtleXdvcmRzCi0gICcoKCJeW1NNVFdGXS4rIiAuIGZvbnQtbG9jay1mdW5jdGlvbi1uYW1lLWZhY2UpCTsgRGF0ZSBsaW5lLgotICAgICgiXlx0XFwqIFxcKFteIDpcbl0rXFwpIiAxIGZvbnQtbG9jay1jb21tZW50LWZhY2UpCTsgRmlsZSBuYW1lLgotICAgICgiKFxcKFteKVxuXStcXCkpOiIgMSBmb250LWxvY2sta2V5d29yZC1mYWNlKSkJOyBGdW5jdGlvbiBuYW1lLgotICAiQWRkaXRpb25hbCBleHByZXNzaW9ucyB0byBoaWdobGlnaHQgaW4gQ2hhbmdlIExvZyBtb2RlLiIpCi0KLShkZWZ2YXIgY2hhbmdlLWxvZy1tb2RlLW1hcCBuaWwKLSAgIktleW1hcCBmb3IgQ2hhbmdlIExvZyBtYWpvciBtb2RlLiIpCi0oaWYgY2hhbmdlLWxvZy1tb2RlLW1hcAotICAgIG5pbAotICAoc2V0cSBjaGFuZ2UtbG9nLW1vZGUtbWFwIChtYWtlLXNwYXJzZS1rZXltYXApKQotICAoZGVmaW5lLWtleSBjaGFuZ2UtbG9nLW1vZGUtbWFwICJcTS1xIiAnY2hhbmdlLWxvZy1maWxsLXBhcmFncmFwaCkpCi0KLShkZWZ1biBjaGFuZ2UtbG9nLW5hbWUgKCkKLSAgKG9yIGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lCi0gICAgICAoaWYgKGVxIHN5c3RlbS10eXBlICd2YXgtdm1zKSAKLQkgICIkQ0hBTkdFX0xPRyQuVFhUIiAKLQkoaWYgKG9yIChlcSBzeXN0ZW0tdHlwZSAnbXMtZG9zKSAoZXEgc3lzdGVtLXR5cGUgJ3dpbmRvd3MtbnQpKQotCSAgICAiY2hhbmdlbG8iCi0JICAiQ2hhbmdlTG9nIikpKSkKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBwcm9tcHQtZm9yLWNoYW5nZS1sb2ctbmFtZSAoKQotICAiUHJvbXB0IGZvciBhIGNoYW5nZSBsb2cgbmFtZS4iCi0gIChsZXQqICgoZGVmYXVsdCAoY2hhbmdlLWxvZy1uYW1lKSkKLQkgKG5hbWUgKGV4cGFuZC1maWxlLW5hbWUKLQkJKHJlYWQtZmlsZS1uYW1lIChmb3JtYXQgIkxvZyBmaWxlIChkZWZhdWx0ICVzKTogIiBkZWZhdWx0KQotCQkJCW5pbCBkZWZhdWx0KSkpKQotICAgIDs7IEhhbmRsZSBzb21ldGhpbmcgdGhhdCBpcyBzeW50YWN0aWNhbGx5IGEgZGlyZWN0b3J5IG5hbWUuCi0gICAgOzsgTG9vayBmb3IgQ2hhbmdlTG9nIG9yIHdoYXRldmVyIGluIHRoYXQgZGlyZWN0b3J5LgotICAgIChpZiAoc3RyaW5nPSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBuYW1lKSAiIikKLQkoZXhwYW5kLWZpbGUtbmFtZSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBkZWZhdWx0KQotCQkJICBuYW1lKQotICAgICAgOzsgSGFuZGxlIHNwZWNpZnlpbmcgYSBmaWxlIHRoYXQgaXMgYSBkaXJlY3RvcnkuCi0gICAgICAoaWYgKGZpbGUtZGlyZWN0b3J5LXAgbmFtZSkKLQkgIChleHBhbmQtZmlsZS1uYW1lIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGRlZmF1bHQpCi0JCQkgICAgKGZpbGUtbmFtZS1hcy1kaXJlY3RvcnkgbmFtZSkpCi0JbmFtZSkpKSkKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBmaW5kLWNoYW5nZS1sb2cgKCZvcHRpb25hbCBmaWxlLW5hbWUpCi0gICJGaW5kIGEgY2hhbmdlIGxvZyBmaWxlIGZvciBcXFthZGQtY2hhbmdlLWxvZy1lbnRyeV0gYW5kIHJldHVybiB0aGUgbmFtZS4KLQotT3B0aW9uYWwgYXJnIEZJTEUtTkFNRSBzcGVjaWZpZXMgdGhlIGZpbGUgdG8gdXNlLgotSWYgRklMRS1OQU1FIGlzIG5pbCwgdXNlIHRoZSB2YWx1ZSBvZiBgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUnLgotSWYgJ2NoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJyBpcyBuaWwsIGJlaGF2ZSBhcyB0aG91Z2ggaXQgd2VyZSAnQ2hhbmdlTG9nJwotXChvciB3aGF0ZXZlciB3ZSB1c2Ugb24gdGhpcyBvcGVyYXRpbmcgc3lzdGVtKS4KLQotSWYgJ2NoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJyBjb250YWlucyBhIGxlYWRpbmcgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbgotc2ltcGx5IGZpbmQgaXQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgT3RoZXJ3aXNlLCBzZWFyY2ggaW4gdGhlIGN1cnJlbnQgCi1kaXJlY3RvcnkgYW5kIGl0cyBzdWNjZXNzaXZlIHBhcmVudHMgZm9yIGEgZmlsZSBzbyBuYW1lZC4KLQotT25jZSBhIGZpbGUgaXMgZm91bmQsIGBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScgaXMgc2V0IGxvY2FsbHkgaW4gdGhlCi1jdXJyZW50IGJ1ZmZlciB0byB0aGUgY29tcGxldGUgZmlsZSBuYW1lLiIKLSAgOzsgSWYgdXNlciBzcGVjaWZpZWQgYSBmaWxlIG5hbWUgb3IgaWYgdGhpcyBidWZmZXIga25vd3Mgd2hpY2ggb25lIHRvIHVzZSwKLSAgOzsganVzdCB1c2UgdGhhdC4KLSAgKG9yIGZpbGUtbmFtZQotICAgICAgKHNldHEgZmlsZS1uYW1lIChhbmQgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUKLQkJCSAgIChmaWxlLW5hbWUtZGlyZWN0b3J5IGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lKQotCQkJICAgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUpKQotICAgICAgKHByb2duCi0JOzsgQ2hhc2UgbGlua3MgaW4gdGhlIHNvdXJjZSBmaWxlCi0JOzsgYW5kIHVzZSB0aGUgY2hhbmdlIGxvZyBpbiB0aGUgZGlyIHdoZXJlIGl0IHBvaW50cy4KLQkoc2V0cSBmaWxlLW5hbWUgKG9yIChhbmQgYnVmZmVyLWZpbGUtbmFtZQotCQkJCSAoZmlsZS1uYW1lLWRpcmVjdG9yeQotCQkJCSAgKGZpbGUtY2hhc2UtbGlua3MgYnVmZmVyLWZpbGUtbmFtZSkpKQotCQkJICAgIGRlZmF1bHQtZGlyZWN0b3J5KSkKLQkoaWYgKGZpbGUtZGlyZWN0b3J5LXAgZmlsZS1uYW1lKQotCSAgICAoc2V0cSBmaWxlLW5hbWUgKGV4cGFuZC1maWxlLW5hbWUgKGNoYW5nZS1sb2ctbmFtZSkgZmlsZS1uYW1lKSkpCi0JOzsgQ2hhc2UgbGlua3MgYmVmb3JlIHZpc2l0aW5nIHRoZSBmaWxlLgotCTs7IFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHVzZSBhIHNpbmdsZSBjaGFuZ2UgbG9nIGZpbGUKLQk7OyBmb3Igc2V2ZXJhbCByZWxhdGVkIGRpcmVjdG9yaWVzLgotCShzZXRxIGZpbGUtbmFtZSAoZmlsZS1jaGFzZS1saW5rcyBmaWxlLW5hbWUpKQotCShzZXRxIGZpbGUtbmFtZSAoZXhwYW5kLWZpbGUtbmFtZSBmaWxlLW5hbWUpKQotCTs7IE1vdmUgdXAgaW4gdGhlIGRpciBoaWVyYXJjaHkgdGlsbCB3ZSBmaW5kIGEgY2hhbmdlIGxvZyBmaWxlLgotCShsZXQgKChmaWxlMSBmaWxlLW5hbWUpCi0JICAgICAgcGFyZW50LWRpcikKLQkgICh3aGlsZSAoYW5kIChub3QgKG9yIChnZXQtZmlsZS1idWZmZXIgZmlsZTEpIChmaWxlLWV4aXN0cy1wIGZpbGUxKSkpCi0JCSAgICAgIChwcm9nbiAoc2V0cSBwYXJlbnQtZGlyCi0JCQkJICAgKGZpbGUtbmFtZS1kaXJlY3RvcnkKLQkJCQkgICAgKGRpcmVjdG9yeS1maWxlLW5hbWUKLQkJCQkgICAgIChmaWxlLW5hbWUtZGlyZWN0b3J5IGZpbGUxKSkpKQotCQkJICAgICA7OyBHaXZlIHVwIGlmIHdlIGFyZSBhbHJlYWR5IGF0IHRoZSByb290IGRpci4KLQkJCSAgICAgKG5vdCAoc3RyaW5nPSAoZmlsZS1uYW1lLWRpcmVjdG9yeSBmaWxlMSkKLQkJCQkJICAgcGFyZW50LWRpcikpKSkKLQkgICAgOzsgTW92ZSB1cCB0byB0aGUgcGFyZW50IGRpciBhbmQgdHJ5IGFnYWluLgotCSAgICAoc2V0cSBmaWxlMSAoZXhwYW5kLWZpbGUtbmFtZSAKLQkJCSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSAoY2hhbmdlLWxvZy1uYW1lKSkKLQkJCSBwYXJlbnQtZGlyKSkpCi0JICA7OyBJZiB3ZSBmb3VuZCBhIGNoYW5nZSBsb2cgaW4gYSBwYXJlbnQsIHVzZSB0aGF0LgotCSAgKGlmIChvciAoZ2V0LWZpbGUtYnVmZmVyIGZpbGUxKSAoZmlsZS1leGlzdHMtcCBmaWxlMSkpCi0JICAgICAgKHNldHEgZmlsZS1uYW1lIGZpbGUxKSkpKSkKLSAgOzsgTWFrZSBhIGxvY2FsIHZhcmlhYmxlIGluIHRoaXMgYnVmZmVyIHNvIHdlIG5lZWRuJ3Qgc2VhcmNoIGFnYWluLgotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZSkgZmlsZS1uYW1lKQotICBmaWxlLW5hbWUpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gYWRkLWNoYW5nZS1sb2ctZW50cnkgKCZvcHRpb25hbCB3aG9hbWkgZmlsZS1uYW1lIG90aGVyLXdpbmRvdyBuZXctZW50cnkpCi0gICJGaW5kIGNoYW5nZSBsb2cgZmlsZSBhbmQgYWRkIGFuIGVudHJ5IGZvciB0b2RheS4KLU9wdGlvbmFsIGFyZyAoaW50ZXJhY3RpdmUgcHJlZml4KSBub24tbmlsIG1lYW5zIHByb21wdCBmb3IgdXNlciBuYW1lIGFuZCBzaXRlLgotU2Vjb25kIGFyZyBpcyBmaWxlIG5hbWUgb2YgY2hhbmdlIGxvZy4gIElmIG5pbCwgdXNlcyBgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUnLgotVGhpcmQgYXJnIE9USEVSLVdJTkRPVyBub24tbmlsIG1lYW5zIHZpc2l0IGluIG90aGVyIHdpbmRvdy4KLUZvdXJ0aCBhcmcgTkVXLUVOVFJZIG5vbi1uaWwgbWVhbnMgYWx3YXlzIGNyZWF0ZSBhIG5ldyBlbnRyeSBhdCB0aGUgZnJvbnQ7Ci1uZXZlciBhcHBlbmQgdG8gYW4gZXhpc3RpbmcgZW50cnkuIgotICAoaW50ZXJhY3RpdmUgKGxpc3QgY3VycmVudC1wcmVmaXgtYXJnCi0JCSAgICAgKHByb21wdC1mb3ItY2hhbmdlLWxvZy1uYW1lKSkpCi0gIChvciBhZGQtbG9nLWZ1bGwtbmFtZQotICAgICAgKHNldHEgYWRkLWxvZy1mdWxsLW5hbWUgKHVzZXItZnVsbC1uYW1lKSkpCi0gIChvciBhZGQtbG9nLW1haWxpbmctYWRkcmVzcwotICAgICAgKHNldHEgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MgdXNlci1tYWlsLWFkZHJlc3MpKQotICAoaWYgd2hvYW1pCi0gICAgICAocHJvZ24KLQkoc2V0cSBhZGQtbG9nLWZ1bGwtbmFtZSAocmVhZC1pbnB1dCAiRnVsbCBuYW1lOiAiIGFkZC1sb2ctZnVsbC1uYW1lKSkKLQkgOzsgTm90ZSB0aGF0IHNvbWUgc2l0ZXMgaGF2ZSByb29tIGFuZCBwaG9uZSBudW1iZXIgZmllbGRzIGluCi0JIDs7IGZ1bGwgbmFtZSB3aGljaCBsb29rIHNpbGx5IHdoZW4gaW5zZXJ0ZWQuICBSYXRoZXIgdGhhbiBkbwotCSA7OyBhbnl0aGluZyBhYm91dCB0aGF0IGhlcmUsIGxldCB1c2VyIGdpdmUgcHJlZml4IGFyZ3VtZW50IHNvIHRoYXQKLQkgOzsgcy9oZSBjYW4gZWRpdCB0aGUgZnVsbCBuYW1lIGZpZWxkIGluIHByb21wdGVyIGlmIHMvaGUgd2FudHMuCi0JKHNldHEgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MKLQkgICAgICAocmVhZC1pbnB1dCAiTWFpbGluZyBhZGRyZXNzOiAiIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzKSkpKQotICAobGV0ICgoZGVmdW4gKGZ1bmNhbGwgKG9yIGFkZC1sb2ctY3VycmVudC1kZWZ1bi1mdW5jdGlvbgotCQkJICAgICdhZGQtbG9nLWN1cnJlbnQtZGVmdW4pKSkKLQlwYXJhZ3JhcGgtZW5kIGVudHJ5KQotCi0gICAgKHNldHEgZmlsZS1uYW1lIChleHBhbmQtZmlsZS1uYW1lIChmaW5kLWNoYW5nZS1sb2cgZmlsZS1uYW1lKSkpCi0KLSAgICA7OyBTZXQgRU5UUlkgdG8gdGhlIGZpbGUgbmFtZSB0byB1c2UgaW4gdGhlIG5ldyBlbnRyeS4KLSAgICAoYW5kIGJ1ZmZlci1maWxlLW5hbWUKLQkgOzsgTmV2ZXIgd2FudCB0byBhZGQgYSBjaGFuZ2UgbG9nIGVudHJ5IGZvciB0aGUgQ2hhbmdlTG9nIGZpbGUgaXRzZWxmLgotCSAobm90IChzdHJpbmc9IGJ1ZmZlci1maWxlLW5hbWUgZmlsZS1uYW1lKSkKLQkgKHNldHEgZW50cnkgKGlmIChzdHJpbmctbWF0Y2gKLQkJCSAgKGNvbmNhdCAiXiIgKHJlZ2V4cC1xdW90ZSAoZmlsZS1uYW1lLWRpcmVjdG9yeQotCQkJCQkJICAgICBmaWxlLW5hbWUpKSkKLQkJCSAgYnVmZmVyLWZpbGUtbmFtZSkKLQkJCSAoc3Vic3RyaW5nIGJ1ZmZlci1maWxlLW5hbWUgKG1hdGNoLWVuZCAwKSkKLQkJICAgICAgIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGJ1ZmZlci1maWxlLW5hbWUpKSkpCi0KLSAgICAoaWYgKGFuZCBvdGhlci13aW5kb3cgKG5vdCAoZXF1YWwgZmlsZS1uYW1lIGJ1ZmZlci1maWxlLW5hbWUpKSkKLQkoZmluZC1maWxlLW90aGVyLXdpbmRvdyBmaWxlLW5hbWUpCi0gICAgICAoZmluZC1maWxlIGZpbGUtbmFtZSkpCi0gICAgKG9yIChlcSBtYWpvci1tb2RlICdjaGFuZ2UtbG9nLW1vZGUpCi0JKGNoYW5nZS1sb2ctbW9kZSkpCi0gICAgKHVuZG8tYm91bmRhcnkpCi0gICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKLSAgICAobGV0ICgoaGVhZGluZyAoZm9ybWF0ICIlcyAgJXMgIDwlcz4iCi0JCQkgICAoZm9ybWF0LXRpbWUtc3RyaW5nICIlWS0lbS0lZCIpCi0JCQkgICBhZGQtbG9nLWZ1bGwtbmFtZQotCQkJICAgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MpKSkKLSAgICAgIChpZiAobG9va2luZy1hdCAocmVnZXhwLXF1b3RlIGhlYWRpbmcpKQotCSAgKGZvcndhcmQtbGluZSAxKQotCShpbnNlcnQgaGVhZGluZyAiXG5cbiIpKSkKLQotICAgIDs7IFNlYXJjaCBvbmx5IHdpdGhpbiB0aGUgZmlyc3QgcGFyYWdyYXBoLgotICAgIChpZiAobG9va2luZy1hdCAiXG4qW15cbiogXHRdIikKLQkoc2tpcC1jaGFycy1mb3J3YXJkICJcbiIpCi0gICAgICAoZm9yd2FyZC1wYXJhZ3JhcGggMSkpCi0gICAgKHNldHEgcGFyYWdyYXBoLWVuZCAocG9pbnQpKQotICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCi0KLSAgICA7OyBOb3cgaW5zZXJ0IHRoZSBuZXcgbGluZSBmb3IgdGhpcyBlbnRyeS4KLSAgICAoY29uZCAoKHJlLXNlYXJjaC1mb3J3YXJkICJeXFxzICpcXCpcXHMgKiQiIHBhcmFncmFwaC1lbmQgdCkKLQkgICA7OyBQdXQgdGhpcyBmaWxlIG5hbWUgaW50byB0aGUgZXhpc3RpbmcgZW1wdHkgZW50cnkuCi0JICAgKGlmIGVudHJ5Ci0JICAgICAgIChpbnNlcnQgZW50cnkpKSkKLQkgICgoYW5kIChub3QgbmV3LWVudHJ5KQotCQkobGV0IChjYXNlLWZvbGQtc2VhcmNoKQotCQkgIChyZS1zZWFyY2gtZm9yd2FyZAotCQkgICAoY29uY2F0IChyZWdleHAtcXVvdGUgKGNvbmNhdCAiKiAiIGVudHJ5KSkKLQkJCSAgIDs7IERvbid0IGFjY2VwdCBgZm9vLmJhcicgd2hlbgotCQkJICAgOzsgbG9va2luZyBmb3IgYGZvbyc6Ci0JCQkgICAiXFwoXFxzIFxcfFsoKSw6XVxcKSIpCi0JCSAgIHBhcmFncmFwaC1lbmQgdCkpKQotCSAgIDs7IEFkZCB0byB0aGUgZXhpc3RpbmcgZW50cnkgZm9yIHRoZSBzYW1lIGZpbGUuCi0JICAgKHJlLXNlYXJjaC1mb3J3YXJkICJeXFxzICokXFx8XlxccyBcXCoiKQotCSAgIChnb3RvLWNoYXIgKG1hdGNoLWJlZ2lubmluZyAwKSkKLQkgICA7OyBEZWxldGUgZXhjZXNzIGVtcHR5IGxpbmVzOyBtYWtlIGp1c3QgMi4KLQkgICAod2hpbGUgKGFuZCAobm90IChlb2JwKSkgKGxvb2tpbmctYXQgIl5cXHMgKiQiKSkKLQkgICAgIChkZWxldGUtcmVnaW9uIChwb2ludCkgKHNhdmUtZXhjdXJzaW9uIChmb3J3YXJkLWxpbmUgMSkgKHBvaW50KSkpKQotCSAgIChpbnNlcnQgIlxuXG4iKQotCSAgIChmb3J3YXJkLWxpbmUgLTIpCi0JICAgKGluZGVudC1yZWxhdGl2ZS1tYXliZSkpCi0JICAodAotCSAgIDs7IE1ha2UgYSBuZXcgZW50cnkuCi0JICAgKGZvcndhcmQtbGluZSAxKQotCSAgICh3aGlsZSAobG9va2luZy1hdCAiXFxzVyIpCi0JICAgICAoZm9yd2FyZC1saW5lIDEpKQotCSAgICh3aGlsZSAoYW5kIChub3QgKGVvYnApKSAobG9va2luZy1hdCAiXlxccyAqJCIpKQotCSAgICAgKGRlbGV0ZS1yZWdpb24gKHBvaW50KSAoc2F2ZS1leGN1cnNpb24gKGZvcndhcmQtbGluZSAxKSAocG9pbnQpKSkpCi0JICAgKGluc2VydCAiXG5cblxuIikKLQkgICAoZm9yd2FyZC1saW5lIC0yKQotCSAgIChpbmRlbnQtdG8gbGVmdC1tYXJnaW4pCi0JICAgKGluc2VydCAiKiAiIChvciBlbnRyeSAiIikpKSkKLSAgICA7OyBOb3cgaW5zZXJ0IHRoZSBmdW5jdGlvbiBuYW1lLCBpZiB3ZSBoYXZlIG9uZS4KLSAgICA7OyBQb2ludCBpcyBhdCB0aGUgZW50cnkgZm9yIHRoaXMgZmlsZSwKLSAgICA7OyBlaXRoZXIgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBvciBhdCB0aGUgZmlyc3QgYmxhbmsgbGluZS4KLSAgICAoaWYgZGVmdW4KLQkocHJvZ24KLQkgIDs7IE1ha2UgaXQgZWFzeSB0byBnZXQgcmlkIG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotCSAgKHVuZG8tYm91bmRhcnkpCi0JICAoaW5zZXJ0IChpZiAoc2F2ZS1leGN1cnNpb24KLQkJCShiZWdpbm5pbmctb2YtbGluZSAxKQotCQkJKGxvb2tpbmctYXQgIlxccyAqJCIpKSAKLQkJICAgICAgIiIKLQkJICAgICIgIikKLQkJICAiKCIgZGVmdW4gIik6ICIpKQotICAgICAgOzsgTm8gZnVuY3Rpb24gbmFtZSwgc28gcHV0IGluIGEgY29sb24gdW5sZXNzIHdlIGhhdmUganVzdCBhIHN0YXIuCi0gICAgICAoaWYgKG5vdCAoc2F2ZS1leGN1cnNpb24KLQkJIChiZWdpbm5pbmctb2YtbGluZSAxKQotCQkgKGxvb2tpbmctYXQgIlxccyAqXFwoXFwqXFxzICpcXCk/JCIpKSkKLQkgIChpbnNlcnQgIjogIikpKSkpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gYWRkLWNoYW5nZS1sb2ctZW50cnktb3RoZXItd2luZG93ICgmb3B0aW9uYWwgd2hvYW1pIGZpbGUtbmFtZSkKLSAgIkZpbmQgY2hhbmdlIGxvZyBmaWxlIGluIG90aGVyIHdpbmRvdyBhbmQgYWRkIGFuIGVudHJ5IGZvciB0b2RheS4KLU9wdGlvbmFsIGFyZyAoaW50ZXJhY3RpdmUgcHJlZml4KSBub24tbmlsIG1lYW5zIHByb21wdCBmb3IgdXNlciBuYW1lIGFuZCBzaXRlLgotU2Vjb25kIGFyZyBpcyBmaWxlIG5hbWUgb2YgY2hhbmdlIGxvZy4gIFwKLUlmIG5pbCwgdXNlcyBgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUnLiIKLSAgKGludGVyYWN0aXZlIChpZiBjdXJyZW50LXByZWZpeC1hcmcKLQkJICAgKGxpc3QgY3VycmVudC1wcmVmaXgtYXJnCi0JCQkgKHByb21wdC1mb3ItY2hhbmdlLWxvZy1uYW1lKSkpKQotICAoYWRkLWNoYW5nZS1sb2ctZW50cnkgd2hvYW1pIGZpbGUtbmFtZSB0KSkKLTs7OyMjI2F1dG9sb2FkIChkZWZpbmUta2V5IGN0bC14LTQtbWFwICJhIiAnYWRkLWNoYW5nZS1sb2ctZW50cnktb3RoZXItd2luZG93KQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnVuIGNoYW5nZS1sb2ctbW9kZSAoKQotICAiTWFqb3IgbW9kZSBmb3IgZWRpdGluZyBjaGFuZ2UgbG9nczsgbGlrZSBJbmRlbnRlZCBUZXh0IE1vZGUuCi1QcmV2ZW50cyBudW1lcmljIGJhY2t1cHMgYW5kIHNldHMgYGxlZnQtbWFyZ2luJyB0byA4IGFuZCBgZmlsbC1jb2x1bW4nIHRvIDc0LgotTmV3IGxvZyBlbnRyaWVzIGFyZSB1c3VhbGx5IG1hZGUgd2l0aCBcXFthZGQtY2hhbmdlLWxvZy1lbnRyeV0gb3IgXFxbYWRkLWNoYW5nZS1sb2ctZW50cnktb3RoZXItd2luZG93XS4KLUVhY2ggZW50cnkgYmVoYXZlcyBhcyBhIHBhcmFncmFwaCwgYW5kIHRoZSBlbnRyaWVzIGZvciBvbmUgZGF5IGFzIGEgcGFnZS4KLVJ1bnMgYGNoYW5nZS1sb2ctbW9kZS1ob29rJy4iCi0gIChpbnRlcmFjdGl2ZSkKLSAgKGtpbGwtYWxsLWxvY2FsLXZhcmlhYmxlcykKLSAgKGluZGVudGVkLXRleHQtbW9kZSkKLSAgKHNldHEgbWFqb3ItbW9kZSAnY2hhbmdlLWxvZy1tb2RlCi0JbW9kZS1uYW1lICJDaGFuZ2UgTG9nIgotCWxlZnQtbWFyZ2luIDgKLQlmaWxsLWNvbHVtbiA3NAotICAgIGluZGVudC10YWJzLW1vZGUgdAotICAgIHRhYi13aWR0aCA4KQotICAodXNlLWxvY2FsLW1hcCBjaGFuZ2UtbG9nLW1vZGUtbWFwKQotICA7OyBMZXQgZWFjaCBlbnRyeSBiZWhhdmUgYXMgb25lIHBhcmFncmFwaDoKLSAgOzsgV2UgcmVhbGx5IGRvIHdhbnQgIl4iIGluIHBhcmFncmFwaC1zdGFydCBiZWxvdzogaXQgaXMgb25seSB0aGUgbGluZXMgdGhhdAotICA7OyBiZWdpbiBhdCBjb2x1bW4gMCAoZGVzcGl0ZSB0aGUgbGVmdC1tYXJnaW4gb2YgOCkgdGhhdCB3ZSBhcmUgbG9va2luZyBmb3IuCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3BhcmFncmFwaC1zdGFydCkgIlxccyAqJFxcfFxmXFx8Xlxcc3ciKQotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdwYXJhZ3JhcGgtc2VwYXJhdGUpICJcXHMgKiRcXHxcZlxcfF5cXHN3IikKLSAgOzsgTGV0IGFsbCBlbnRyaWVzIGZvciBvbmUgZGF5IGJlaGF2ZSBhcyBvbmUgcGFnZS4KLSAgOzsgTWF0Y2ggbnVsbCBzdHJpbmcgb24gdGhlIGRhdGUtbGluZSBzbyB0aGF0IHRoZSBkYXRlLWxpbmUKLSAgOzsgaXMgZ3JvdXBlZCB3aXRoIHdoYXQgZm9sbG93cy4KLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAncGFnZS1kZWxpbWl0ZXIpICJeXFw8XFx8XlxmIikKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAndmVyc2lvbi1jb250cm9sKSAnbmV2ZXIpCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2FkYXB0aXZlLWZpbGwtcmVnZXhwKSAiXFxzICoiKQotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdmb250LWxvY2stZGVmYXVsdHMpCi0gICAgICAgJyhjaGFuZ2UtbG9nLWZvbnQtbG9jay1rZXl3b3JkcyB0KSkKLSAgKHJ1bi1ob29rcyAnY2hhbmdlLWxvZy1tb2RlLWhvb2spKQotCi07OyBJdCBtaWdodCBiZSBuaWNlIHRvIGhhdmUgYSBnZW5lcmFsIGZlYXR1cmUgdG8gcmVwbGFjZSB0aGlzLiAgVGhlIGlkZWEgSQotOzsgaGF2ZSBpcyBhIHZhcmlhYmxlIGdpdmluZyBhIHJlZ2V4cCBtYXRjaGluZyB0ZXh0IHdoaWNoIHNob3VsZCBub3QgYmUKLTs7IG1vdmVkIGZyb20gYm9sIGJ5IGZpbGxpbmcuICBjaGFuZ2UtbG9nLW1vZGUgd291bGQgc2V0IHRoaXMgdG8gIl5cXHMgKlxccygiLgotOzsgQnV0IEkgZG9uJ3QgZmVlbCB1cCB0byBpbXBsZW1lbnRpbmcgdGhhdCB0b2RheS4KLShkZWZ1biBjaGFuZ2UtbG9nLWZpbGwtcGFyYWdyYXBoICgmb3B0aW9uYWwganVzdGlmeSkKLSAgIkZpbGwgdGhlIHBhcmFncmFwaCwgYnV0IHByZXNlcnZlIG9wZW4gcGFyZW50aGVzZXMgYXQgYmVnaW5uaW5nIG9mIGxpbmVzLgotUHJlZml4IGFyZyBtZWFucyBqdXN0aWZ5IGFzIHdlbGwuIgotICAoaW50ZXJhY3RpdmUgIlAiKQotICAobGV0ICgoZW5kIChzYXZlLWV4Y3Vyc2lvbiAoZm9yd2FyZC1wYXJhZ3JhcGgpIChwb2ludCkpKQotCShiZWcgKHNhdmUtZXhjdXJzaW9uIChiYWNrd2FyZC1wYXJhZ3JhcGgpKHBvaW50KSkpCi0JKHBhcmFncmFwaC1zdGFydCAoY29uY2F0IHBhcmFncmFwaC1zdGFydCAiXFx8XFxzICpcXHMoIikpKQotICAgIChmaWxsLXJlZ2lvbiBiZWcgZW5kIGp1c3RpZnkpKSkKLQwKLShkZWZ2YXIgYWRkLWxvZy1jdXJyZW50LWRlZnVuLWhlYWRlci1yZWdleHAKLSAgIl5cXChbQS1aXVtBLVpfIF0qW0EtWl9dXFx8Wy1fYS16QS1aXStcXClbIFx0XSpbOj1dIgotICAiKkhldXJpc3RpYyByZWdleHAgdXNlZCBieSBgYWRkLWxvZy1jdXJyZW50LWRlZnVuJyBmb3IgdW5rbm93biBtYWpvciBtb2Rlcy4iKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnVuIGFkZC1sb2ctY3VycmVudC1kZWZ1biAoKQotICAiUmV0dXJuIG5hbWUgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBwb2ludCBpcyBpbiwgb3IgbmlsLgotCi1VbmRlcnN0YW5kcyBDLCBMaXNwLCBMYVRlWCAoXCJmdW5jdGlvbnNcIiBhcmUgY2hhcHRlcnMsIHNlY3Rpb25zLCAuLi4pLAotVGV4aW5mbyAoQG5vZGUgdGl0bGVzKSwgUGVybCwgYW5kIEZvcnRyYW4uCi0KLU90aGVyIG1vZGVzIGFyZSBoYW5kbGVkIGJ5IGEgaGV1cmlzdGljIHRoYXQgbG9va3MgaW4gdGhlIDEwSyBiZWZvcmUKLXBvaW50IGZvciB1cHBlcmNhc2UgaGVhZGluZ3Mgc3RhcnRpbmcgaW4gdGhlIGZpcnN0IGNvbHVtbiBvcgotaWRlbnRpZmllcnMgZm9sbG93ZWQgYnkgYDonIG9yIGA9Jywgc2VlIHZhcmlhYmxlCi1gYWRkLWxvZy1jdXJyZW50LWRlZnVuLWhlYWRlci1yZWdleHAnLgotCi1IYXMgYSBwcmVmZXJlbmNlIG9mIGxvb2tpbmcgYmFja3dhcmRzLiIKLSAgKGNvbmRpdGlvbi1jYXNlIG5pbAotICAgICAgKHNhdmUtZXhjdXJzaW9uCi0JKGxldCAoKGxvY2F0aW9uIChwb2ludCkpKQotCSAgKGNvbmQgKChtZW1xIG1ham9yLW1vZGUgJyhlbWFjcy1saXNwLW1vZGUgbGlzcC1tb2RlIHNjaGVtZS1tb2RlCi0JCQkJCQkgICAgbGlzcC1pbnRlcmFjdGlvbi1tb2RlKSkKLQkJIDs7IElmIHdlIGFyZSBub3cgcHJlY2lzZWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBkZWZ1biwKLQkJIDs7IG1ha2Ugc3VyZSBiZWdpbm5pbmctb2YtZGVmdW4gZmluZHMgdGhhdCBvbmUKLQkJIDs7IHJhdGhlciB0aGFuIHRoZSBwcmV2aW91cyBvbmUuCi0JCSAob3IgKGVvYnApIChmb3J3YXJkLWNoYXIgMSkpCi0JCSAoYmVnaW5uaW5nLW9mLWRlZnVuKQotCQkgOzsgTWFrZSBzdXJlIHdlIGFyZSByZWFsbHkgaW5zaWRlIHRoZSBkZWZ1biBmb3VuZCwgbm90IGFmdGVyIGl0LgotCQkgKGlmIChhbmQgKGxvb2tpbmctYXQgIlxccygiKQotCQkJICAocHJvZ24gKGVuZC1vZi1kZWZ1bikKLQkJCQkgKDwgbG9jYXRpb24gKHBvaW50KSkpCi0JCQkgIChwcm9nbiAoZm9yd2FyZC1zZXhwIC0xKQotCQkJCSAoPj0gbG9jYXRpb24gKHBvaW50KSkpKQotCQkgICAgIChwcm9nbgotCQkgICAgICAgKGlmIChsb29raW5nLWF0ICJcXHMoIikKLQkJCSAgIChmb3J3YXJkLWNoYXIgMSkpCi0JCSAgICAgICAoZm9yd2FyZC1zZXhwIDEpCi0JCSAgICAgICAoc2tpcC1jaGFycy1mb3J3YXJkICIgJyIpCi0JCSAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpCi0JCQkJCSAocHJvZ24gKGZvcndhcmQtc2V4cCAxKSAocG9pbnQpKSkpKSkKLQkJKChhbmQgKG1lbXEgbWFqb3ItbW9kZSAnKGMtbW9kZSBjKystbW9kZSBjKystYy1tb2RlIG9iamMtbW9kZSkpCi0JCSAgICAgIChzYXZlLWV4Y3Vyc2lvbiAoYmVnaW5uaW5nLW9mLWxpbmUpCi0JCQkJICAgICAgOzsgVXNlIGVxIGluc3RlYWQgb2YgPSBoZXJlIHRvIGF2b2lkCi0JCQkJICAgICAgOzsgZXJyb3Igd2hlbiBhdCBib2IgYW5kIGNoYXItYWZ0ZXIKLQkJCQkgICAgICA7OyByZXR1cm5zIG5pbC4KLQkJCQkgICAgICAod2hpbGUgKGVxIChjaGFyLWFmdGVyICgtIChwb2ludCkgMikpID9cXCkKLQkJCQkJKGZvcndhcmQtbGluZSAtMSkpCi0JCQkJICAgICAgKGxvb2tpbmctYXQgIlsgXHRdKiNbIFx0XSpkZWZpbmVbIFx0XSIpKSkKLQkJIDs7IEhhbmRsZSBhIEMgbWFjcm8gZGVmaW5pdGlvbi4KLQkJIChiZWdpbm5pbmctb2YtbGluZSkKLQkJICh3aGlsZSAoZXEgKGNoYXItYWZ0ZXIgKC0gKHBvaW50KSAyKSkgP1xcKSA7bm90ID07IG5vdGUgYWJvdmUKLQkJICAgKGZvcndhcmQtbGluZSAtMSkpCi0JCSAoc2VhcmNoLWZvcndhcmQgImRlZmluZSIpCi0JCSAoc2tpcC1jaGFycy1mb3J3YXJkICIgXHQiKQotCQkgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50KQotCQkJCSAgIChwcm9nbiAoZm9yd2FyZC1zZXhwIDEpIChwb2ludCkpKSkKLQkJKChtZW1xIG1ham9yLW1vZGUgJyhjLW1vZGUgYysrLW1vZGUgYysrLWMtbW9kZSBvYmpjLW1vZGUpKQotCQkgKGJlZ2lubmluZy1vZi1saW5lKQotCQkgOzsgU2VlIGlmIHdlIGFyZSBpbiB0aGUgYmVnaW5uaW5nIHBhcnQgb2YgYSBmdW5jdGlvbiwKLQkJIDs7IGJlZm9yZSB0aGUgb3BlbiBicmFjZS4gIElmIHNvLCBhZHZhbmNlIGZvcndhcmQuCi0JCSAod2hpbGUgKG5vdCAobG9va2luZy1hdCAie1xcfFxcKFxccyAqJFxcKSIpKQotCQkgICAoZm9yd2FyZC1saW5lIDEpKQotCQkgKG9yIChlb2JwKQotCQkgICAgIChmb3J3YXJkLWNoYXIgMSkpCi0JCSAoYmVnaW5uaW5nLW9mLWRlZnVuKQotCQkgKGlmIChwcm9nbiAoZW5kLW9mLWRlZnVuKQotCQkJICAgICg8IGxvY2F0aW9uIChwb2ludCkpKQotCQkgICAgIChwcm9nbgotCQkgICAgICAgKGJhY2t3YXJkLXNleHAgMSkKLQkJICAgICAgIChsZXQgKGJlZyB0ZW0pCi0KLQkJCSAoZm9yd2FyZC1saW5lIC0xKQotCQkJIDs7IFNraXAgYmFjayBvdmVyIHR5cGVkZWZzIG9mIGFyZ2xpc3QuCi0JCQkgKHdoaWxlIChhbmQgKG5vdCAoYm9icCkpCi0JCQkJICAgICAobG9va2luZy1hdCAiWyBcdFxuXSIpKQotCQkJICAgKGZvcndhcmQtbGluZSAtMSkpCi0JCQkgOzsgU2VlIGlmIHRoaXMgaXMgdXNpbmcgdGhlIERFRlVOIG1hY3JvIHVzZWQgaW4gRW1hY3MsCi0JCQkgOzsgb3IgdGhlIERFRlVOIG1hY3JvIHVzZWQgYnkgdGhlIEMgbGlicmFyeS4KLQkJCSAoaWYgKGNvbmRpdGlvbi1jYXNlIG5pbAotCQkJCSAoYW5kIChzYXZlLWV4Y3Vyc2lvbgotCQkJCQkoZW5kLW9mLWxpbmUpCi0JCQkJCSh3aGlsZSAoPSAocHJlY2VkaW5nLWNoYXIpID9cXCkKLQkJCQkJICAoZW5kLW9mLWxpbmUgMikpCi0JCQkJCShiYWNrd2FyZC1zZXhwIDEpCi0JCQkJCShiZWdpbm5pbmctb2YtbGluZSkKLQkJCQkJKHNldHEgdGVtIChwb2ludCkpCi0JCQkJCShsb29raW5nLWF0ICJERUZVTlxcYiIpKQotCQkJCSAgICAgICg+PSBsb2NhdGlvbiB0ZW0pKQotCQkJICAgICAgIChlcnJvciBuaWwpKQotCQkJICAgICAocHJvZ24KLQkJCSAgICAgICAoZ290by1jaGFyIHRlbSkKLQkJCSAgICAgICAoZG93bi1saXN0IDEpCi0JCQkgICAgICAgKGlmICg9IChjaGFyLWFmdGVyIChwb2ludCkpID9cIikKLQkJCQkgICAocHJvZ24KLQkJCQkgICAgIChmb3J3YXJkLXNleHAgMSkKLQkJCQkgICAgIChza2lwLWNoYXJzLWZvcndhcmQgIiAsIikpKQotCQkJICAgICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkKLQkJCQkJCSAocHJvZ24gKGZvcndhcmQtc2V4cCAxKSAocG9pbnQpKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGxvb2tpbmctYXQgIl5bKy1dIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0LW1ldGhvZC1kZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBPcmRpbmFyeSBDIGZ1bmN0aW9uIHN5bnRheC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgYmVnIChwb2ludCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoYW5kIChjb25kaXRpb24tY2FzZSBuaWwKLQkJCQkJICA7OyBQcm90ZWN0IGFnYWluc3QgIlVuYmFsYW5jZWQgcGFyZW5zIiBlcnJvci4KLQkJCQkJICAocHJvZ24KLQkJCQkJICAgIChkb3duLWxpc3QgMSkgOyBpbnRvIGFyZ2xpc3QKLQkJCQkJICAgIChiYWNrd2FyZC11cC1saXN0IDEpCi0JCQkJCSAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiIFx0IikKLQkJCQkJICAgIHQpCi0JCQkJCShlcnJvciBuaWwpKQotCQkJCSAgICAgIDs7IFZlcmlmeSBpbml0aWFsIHBvcyB3YXMgYWZ0ZXIKLQkJCQkgICAgICA7OyByZWFsIHN0YXJ0IG9mIGZ1bmN0aW9uLgotCQkJCSAgICAgIChzYXZlLWV4Y3Vyc2lvbgotCQkJCQkoZ290by1jaGFyIGJlZykKLQkJCQkJOzsgRm9yIHRoaXMgcHVycG9zZSwgaW5jbHVkZSB0aGUgbGluZQotCQkJCQk7OyB0aGF0IGhhcyB0aGUgZGVjbCBrZXl3b3Jkcy4gIFRoaXMKLQkJCQkJOzsgbWF5IGFsc28gaW5jbHVkZSBzb21lIG9mIHRoZQotCQkJCQk7OyBjb21tZW50cyBiZWZvcmUgdGhlIGZ1bmN0aW9uLgotCQkJCQkod2hpbGUgKGFuZCAobm90IChib2JwKSkKLQkJCQkJCSAgICAoc2F2ZS1leGN1cnNpb24KLQkJCQkJCSAgICAgIChmb3J3YXJkLWxpbmUgLTEpCi0JCQkJCQkgICAgICAobG9va2luZy1hdCAiW15cblxmXSIpKSkKLQkJCQkJICAoZm9yd2FyZC1saW5lIC0xKSkKLQkJCQkJKD49IGxvY2F0aW9uIChwb2ludCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgQ29uc2lzdGVuY3kgY2hlY2s6IGdvaW5nIGRvd24gYW5kIHVwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBzaG91bGRuJ3QgdGFrZSB1cyBiYWNrIGJlZm9yZSBCRUcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPiAocG9pbnQpIGJlZykpCi0JCQkJIChsZXQgKGVuZCBtaWRkbGUpCi0JCQkJICAgOzsgRG9uJ3QgaW5jbHVkZSBhbnkgZmluYWwgbmV3bGluZQotCQkJCSAgIDs7IGluIHRoZSBuYW1lIHdlIHVzZS4KLQkJCQkgICAoaWYgKD0gKHByZWNlZGluZy1jaGFyKSA/XG4pCi0JCQkJICAgICAgIChmb3J3YXJkLWNoYXIgLTEpKQotCQkJCSAgIChzZXRxIGVuZCAocG9pbnQpKQotCQkJCSAgIChiYWNrd2FyZC1zZXhwIDEpCi0JCQkJICAgOzsgTm93IGZpbmQgdGhlIHJpZ2h0IGJlZ2lubmluZyBvZiB0aGUgbmFtZS4KLQkJCQkgICA7OyBJbmNsdWRlIGNlcnRhaW4ga2V5d29yZHMgaWYgdGhleQotCQkJCSAgIDs7IHByZWNlZGUgdGhlIG5hbWUuCi0JCQkJICAgKHNldHEgbWlkZGxlIChwb2ludCkpCi0JCQkJICAgKGZvcndhcmQtd29yZCAtMSkKLQkJCQkgICA7OyBJZ25vcmUgdGhlc2Ugc3VicGFydHMgb2YgYSBjbGFzcyBkZWNsCi0JCQkJICAgOzsgYW5kIG1vdmUgYmFjayB0byB0aGUgY2xhc3MgbmFtZSBpdHNlbGYuCi0JCQkJICAgKHdoaWxlIChsb29raW5nLWF0ICJwdWJsaWMgXFx8cHJpdmF0ZSAiKQotCQkJCSAgICAgKHNraXAtY2hhcnMtYmFja3dhcmQgIiBcdDoiKQotCQkJCSAgICAgKHNldHEgZW5kIChwb2ludCkpCi0JCQkJICAgICAoYmFja3dhcmQtc2V4cCAxKQotCQkJCSAgICAgKHNldHEgbWlkZGxlIChwb2ludCkpCi0JCQkJICAgICAoZm9yd2FyZC13b3JkIC0xKSkKLQkJCQkgICAoYW5kIChib2xwKQotCQkJCQkobG9va2luZy1hdCAic3RydWN0IFxcfHVuaW9uIFxcfGNsYXNzICIpCi0JCQkJCShzZXRxIG1pZGRsZSAocG9pbnQpKSkKLQkJCQkgICAoYnVmZmVyLXN1YnN0cmluZyBtaWRkbGUgZW5kKSkpKSkpKSkpCi0JCSgobWVtcSBtYWpvci1tb2RlCi0JCSAgICAgICAnKFRlWC1tb2RlIHBsYWluLVRlWC1tb2RlIExhVGVYLW1vZGU7OyB0ZXgtbW9kZS5lbAotCQkJCSAgcGxhaW4tdGV4LW1vZGUgbGF0ZXgtbW9kZTs7IGNtdXRleC5lbAotCQkJCSAgKSkKLQkJIChpZiAocmUtc2VhcmNoLWJhY2t3YXJkCi0JCSAgICAgICJcXFxcXFwoc3ViXFwpKlxcKHNlY3Rpb25cXHxwYXJhZ3JhcGhcXHxjaGFwdGVyXFwpIiBuaWwgdCkKLQkJICAgICAocHJvZ24KLQkJICAgICAgIChnb3RvLWNoYXIgKG1hdGNoLWJlZ2lubmluZyAwKSkKLQkJICAgICAgIChidWZmZXItc3Vic3RyaW5nICgxKyAocG9pbnQpKTs7IHdpdGhvdXQgaW5pdGlhbCBiYWNrc2xhc2gKLQkJCQkJIChwcm9nbgotCQkJCQkgICAoZW5kLW9mLWxpbmUpCi0JCQkJCSAgIChwb2ludCkpKSkpKQotCQkoKGVxIG1ham9yLW1vZGUgJ3RleGluZm8tbW9kZSkKLQkJIChpZiAocmUtc2VhcmNoLWJhY2t3YXJkICJeQG5vZGVbIFx0XStcXChbXixcbl0rXFwpIiBuaWwgdCkKLQkJICAgICAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDEpCi0JCQkJICAgICAgIChtYXRjaC1lbmQgMSkpKSkKLQkJKChlcSBtYWpvci1tb2RlICdwZXJsLW1vZGUpCi0JCSAoaWYgKHJlLXNlYXJjaC1iYWNrd2FyZCAiXnN1YlsgXHRdK1xcKFteIFx0XG5dK1xcKSIgbmlsIHQpCi0JCSAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAxKQotCQkJCSAgICAgICAobWF0Y2gtZW5kIDEpKSkpCi0gICAgICAgICAgICAgICAgKChlcSBtYWpvci1tb2RlICdmb3J0cmFuLW1vZGUpCi0gICAgICAgICAgICAgICAgIDs7IG11c3QgYmUgaW5zaWRlIGZ1bmN0aW9uIGJvZHkgZm9yIHRoaXMgdG8gd29yawotICAgICAgICAgICAgICAgICAoYmVnaW5uaW5nLW9mLWZvcnRyYW4tc3VicHJvZ3JhbSkKLSAgICAgICAgICAgICAgICAgKGxldCAoKGNhc2UtZm9sZC1zZWFyY2ggdCkpIDsgY2FzZS1pbnNlbnNpdGl2ZQotICAgICAgICAgICAgICAgICAgIDs7IHNlYXJjaCBmb3IgZm9ydHJhbiBzdWJwcm9ncmFtIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgKGlmIChyZS1zZWFyY2gtZm9yd2FyZAotCQkJICJeWyBcdF0qXFwocHJvZ3JhbVxcfHN1YnJvdXRpbmVcXHxmdW5jdGlvblwKLVxcfFsgXHRhLXowLTkqXSpbIFx0XStmdW5jdGlvblxcKSIKLQkJCSBuaWwgdCkKLSAgICAgICAgICAgICAgICAgICAgICAgKHByb2duCi0gICAgICAgICAgICAgICAgICAgICAgICAgOzsgbW92ZSB0byBFT0wgb3IgYmVmb3JlIGZpcnN0IGxlZnQgcGFyZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKHJlLXNlYXJjaC1mb3J3YXJkICJbKFxuXSIgbmlsIHQpCi0JCQkgICAgIChwcm9nbiAoZm9yd2FyZC1jaGFyIC0xKQotCQkJCSAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiIFx0IikpCi0JCQkgICAoZW5kLW9mLWxpbmUpKQotCQkJIDs7IFVzZSB0aGUgbmFtZSBwcmVjZWRpbmcgdGhhdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2duIChmb3J3YXJkLXNleHAgLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludCkpKSkpKSkKLQkJKHQKLQkJIDs7IElmIGFsbCBlbHNlIGZhaWxzLCB0cnkgaGV1cmlzdGljcwotCQkgKGxldCAoY2FzZS1mb2xkLXNlYXJjaCkKLQkJICAgKGVuZC1vZi1saW5lKQotCQkgICAoaWYgKHJlLXNlYXJjaC1iYWNrd2FyZCBhZGQtbG9nLWN1cnJlbnQtZGVmdW4taGVhZGVyLXJlZ2V4cAotCQkJCQkgICAoLSAocG9pbnQpIDEwMDAwKQotCQkJCQkgICB0KQotCQkgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAxKQotCQkJCQkgKG1hdGNoLWVuZCAxKSkpKSkpKSkKLSAgICAoZXJyb3IgbmlsKSkpCi0KLShkZWZ2YXIgZ2V0LW1ldGhvZC1kZWZpbml0aW9uLW1kKQotCi07OyBTdWJyb3V0aW5lIHVzZWQgd2l0aGluIGdldC1tZXRob2QtZGVmaW5pdGlvbi4KLTs7IEFkZCB0aGUgbGFzdCBtYXRjaCBpbiB0aGUgYnVmZmVyIHRvIHRoZSBlbmQgb2YgYG1kJywKLTs7IGZvbGxvd2VkIGJ5IHRoZSBzdHJpbmcgRU5EOyBtb3ZlIHRvIHRoZSBlbmQgb2YgdGhhdCBtYXRjaC4KLShkZWZ1biBnZXQtbWV0aG9kLWRlZmluaXRpb24tMSAoZW5kKQotICAoc2V0cSBnZXQtbWV0aG9kLWRlZmluaXRpb24tbWQKLQkoY29uY2F0IGdldC1tZXRob2QtZGVmaW5pdGlvbi1tZCAKLQkJKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAxKSAobWF0Y2gtZW5kIDEpKQotCQllbmQpKQotICAoZ290by1jaGFyIChtYXRjaC1lbmQgMCkpKQotCi07OyBGb3Igb2JqZWN0aXZlIEMsIHJldHVybiB0aGUgbWV0aG9kIG5hbWUgaWYgd2UgYXJlIGluIGEgbWV0aG9kLgotKGRlZnVuIGdldC1tZXRob2QtZGVmaW5pdGlvbiAoKQotICAobGV0ICgoZ2V0LW1ldGhvZC1kZWZpbml0aW9uLW1kICJbIikpCi0gICAgKHNhdmUtZXhjdXJzaW9uCi0gICAgICAoaWYgKHJlLXNlYXJjaC1iYWNrd2FyZCAiXkBpbXBsZW1lbnRhdGlvblxccy0qXFwoW0EtWmEtel9dKlxcKSIgbmlsIHQpCi0JICAoZ2V0LW1ldGhvZC1kZWZpbml0aW9uLTEgIiAiKSkpCi0gICAgKHNhdmUtZXhjdXJzaW9uCi0gICAgICAoY29uZAotICAgICAgICgocmUtc2VhcmNoLWZvcndhcmQgIl5cXChbLStdXFwpWyBcdFxuXGZccl0qXFwoKFteKV0qKVxcKT9cXHMtKiIgbmlsIHQpCi0JKGdldC1tZXRob2QtZGVmaW5pdGlvbi0xICIiKQotCSh3aGlsZSAobm90IChsb29raW5nLWF0ICJbeztdIikpCi0JICAobG9va2luZy1hdAotCSAgICJcXChbQS1aYS16X10qOj9cXClcXHMtKlxcKChbXildKilcXCk/W0EtWmEtel9dKlsgXHRcblxmXHJdKiIpCi0JICAoZ2V0LW1ldGhvZC1kZWZpbml0aW9uLTEgIiIpKQotCShjb25jYXQgZ2V0LW1ldGhvZC1kZWZpbml0aW9uLW1kICJdIikpKSkpKQotCi0KLShwcm92aWRlICdhZGQtbG9nKQotCi07OzsgYWRkLWxvZy5lbCBlbmRzIGhlcmUKZGlmZiAtLWdpdCBhL2V0Yy9hZGQtbG9nLnZpIGIvZXRjL2FkZC1sb2cudmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjhjNzcuLjAwMDAwMDAKLS0tIGEvZXRjL2FkZC1sb2cudmkKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnYnVpbGQuZWluIGIvZXRjL2NvbmZpZ2J1aWxkLmVpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EwZTIxNC4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnYnVpbGQuZWluCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLSUhUFMtQWRvYmUtMi4wIEVQU0YtMi4wCi0lJVRpdGxlOiBjb25maWdidWlsZC5maWcKLSUlQ3JlYXRvcjogZmlnMmRldiBWZXJzaW9uIDMuMSBQYXRjaGxldmVsIDEKLSUlQ3JlYXRpb25EYXRlOiBGcmkgSnVuIDEyIDIwOjEzOjE2IDE5OTgKLSUlRm9yOiBpYW5AdGl0by5jeWdudXMuY29tIChJYW4gTGFuY2UgVGF5bG9yKQotJSVPcmllbnRhdGlvbjogUG9ydHJhaXQKLSUlQm91bmRpbmdCb3g6IDAgMCAzMjIgMTczCi0lJVBhZ2VzOiAwCi0lJUJlZ2luU2V0dXAKLSUlSW5jbHVkZUZlYXR1cmU6ICpQYWdlU2l6ZSBMZXR0ZXIKLSUlRW5kU2V0dXAKLSUlRW5kQ29tbWVudHMKLS8kRjJwc0RpY3QgMjAwIGRpY3QgZGVmCi0kRjJwc0RpY3QgYmVnaW4KLSRGMnBzRGljdCAvbXRyeCBtYXRyaXggcHV0Ci0vY29sLTEge30gZGVmCi0vY29sMCB7MC4wMDAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wxIHswLjAwMCAwLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDIgezAuMDAwIDEuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMyB7MC4wMDAgMS4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w0IHsxLjAwMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDUgezEuMDAwIDAuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNiB7MS4wMDAgMS4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w3IHsxLjAwMCAxLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDggezAuMDAwIDAuMDAwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sOSB7MC4wMDAgMC4wMDAgMC42OTAgc3JnYn0gYmluZCBkZWYKLS9jb2wxMCB7MC4wMDAgMC4wMDAgMC44MjAgc3JnYn0gYmluZCBkZWYKLS9jb2wxMSB7MC41MzAgMC44MTAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wxMiB7MC4wMDAgMC41NjAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wxMyB7MC4wMDAgMC42OTAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wxNCB7MC4wMDAgMC44MjAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wxNSB7MC4wMDAgMC41NjAgMC41NjAgc3JnYn0gYmluZCBkZWYKLS9jb2wxNiB7MC4wMDAgMC42OTAgMC42OTAgc3JnYn0gYmluZCBkZWYKLS9jb2wxNyB7MC4wMDAgMC44MjAgMC44MjAgc3JnYn0gYmluZCBkZWYKLS9jb2wxOCB7MC41NjAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wxOSB7MC42OTAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyMCB7MC44MjAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyMSB7MC41NjAgMC4wMDAgMC41NjAgc3JnYn0gYmluZCBkZWYKLS9jb2wyMiB7MC42OTAgMC4wMDAgMC42OTAgc3JnYn0gYmluZCBkZWYKLS9jb2wyMyB7MC44MjAgMC4wMDAgMC44MjAgc3JnYn0gYmluZCBkZWYKLS9jb2wyNCB7MC41MDAgMC4xOTAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyNSB7MC42MzAgMC4yNTAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyNiB7MC43NTAgMC4zODAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyNyB7MS4wMDAgMC41MDAgMC41MDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyOCB7MS4wMDAgMC42MzAgMC42MzAgc3JnYn0gYmluZCBkZWYKLS9jb2wyOSB7MS4wMDAgMC43NTAgMC43NTAgc3JnYn0gYmluZCBkZWYKLS9jb2wzMCB7MS4wMDAgMC44ODAgMC44ODAgc3JnYn0gYmluZCBkZWYKLS9jb2wzMSB7MS4wMDAgMC44NDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLQotZW5kCi1zYXZlCi0tNjIuMCAyMjYuMCB0cmFuc2xhdGUKLTEgLTEgc2NhbGUKLQotL2NscCB7Y2xvc2VwYXRofSBiaW5kIGRlZgotL2VmIHtlb2ZpbGx9IGJpbmQgZGVmCi0vZ3Ige2dyZXN0b3JlfSBiaW5kIGRlZgotL2dzIHtnc2F2ZX0gYmluZCBkZWYKLS9sIHtsaW5ldG99IGJpbmQgZGVmCi0vbSB7bW92ZXRvfSBiaW5kIGRlZgotL24ge25ld3BhdGh9IGJpbmQgZGVmCi0vcyB7c3Ryb2tlfSBiaW5kIGRlZgotL3NsYyB7c2V0bGluZWNhcH0gYmluZCBkZWYKLS9zbGoge3NldGxpbmVqb2lufSBiaW5kIGRlZgotL3NsdyB7c2V0bGluZXdpZHRofSBiaW5kIGRlZgotL3NyZ2Ige3NldHJnYmNvbG9yfSBiaW5kIGRlZgotL3JvdCB7cm90YXRlfSBiaW5kIGRlZgotL3NjIHtzY2FsZX0gYmluZCBkZWYKLS90ciB7dHJhbnNsYXRlfSBiaW5kIGRlZgotL3RudCB7ZHVwIGR1cCBjdXJyZW50cmdiY29sb3IKLSAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkCi0gIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZAotICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQgc3JnYn0KLSAgYmluZCBkZWYKLS9zaGQge2R1cCBkdXAgY3VycmVudHJnYmNvbG9yIDQgLTIgcm9sbCBtdWwgNCAtMiByb2xsIG11bAotICA0IC0yIHJvbGwgbXVsIHNyZ2J9IGJpbmQgZGVmCi0vJEYycHNCZWdpbiB7JEYycHNEaWN0IGJlZ2luIC8kRjJwc0VudGVyZWRTdGF0ZSBzYXZlIGRlZn0gZGVmCi0vJEYycHNFbmQgeyRGMnBzRW50ZXJlZFN0YXRlIHJlc3RvcmUgZW5kfSBkZWYKLSUlRW5kUHJvbG9nCi0KLSRGMnBzQmVnaW4KLTEwIHNldG1pdGVybGltaXQKLSAwLjA2MDAwIDAuMDYwMDAgc2MKLTcuNTAwIHNsdwotJSBQb2x5bGluZQotbiAxMDUwIDkwMCBtIDIxMDAgOTAwIGwgIDIxMDAgMTQyNSBsICAxMDUwIDE0MjUgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAxNTAwIDE0MjUgbSAxNTAwIDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMTUzMC4wMCAxOTgwLjAwIG0gMTUwMC4wMCAyMTAwLjAwIGwgMTQ3MC4wMCAxOTgwLjAwIGwgIDE1MDAuNTAgMTk4MC41MCBsIDE1MzAuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAxNTAwIDI2MjUgbSAxNTAwIDMzMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMTUzMC4wMCAzMTgwLjAwIG0gMTUwMC4wMCAzMzAwLjAwIGwgMTQ3MC4wMCAzMTgwLjAwIGwgIDE1MDAuNTAgMzE4MC41MCBsIDE1MzAuMDAgMzE4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAyOTI1IDkwMCBtIDM4MjUgOTAwIGwgIDM4MjUgMTQyNSBsICAyOTI1IDE0MjUgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAxMTU1IDIxMDAgbSAxMDUwIDIxMDAgMTA1MCAyNTIwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAxMDUwIDI2MjUgMjIyMCAyNjI1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAyMzI1IDI2MjUgMjMyNSAyMjA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAyMzI1IDIxMDAgMTE1NSAyMTAwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDI4NTAgMjEwMCBtIDQxMjUgMjEwMCBsICA0MTI1IDI2MjUgbCAgMjg1MCAyNjI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMzM3NSAxNDI1IG0gMzM3NSAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDM0MDUuMDAgMTk4MC4wMCBtIDMzNzUuMDAgMjEwMC4wMCBsIDMzNDUuMDAgMTk4MC4wMCBsICAzMzc1LjUwIDE5ODAuNTAgbCAzNDA1LjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNTEwMCA5MDAgbSA2MzAwIDkwMCBsICA2MzAwIDEzNTAgbCAgNTEwMCAxMzUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gNTYyNSAxMzUwIG0gNTYyNSAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDU2NTUuMDAgMTk4MC4wMCBtIDU2MjUuMDAgMjEwMC4wMCBsIDU1OTUuMDAgMTk4MC4wMCBsICA1NjI1LjUwIDE5ODAuNTAgbCA1NjU1LjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNTIwNSAyMTAwIG0gNTEwMCAyMTAwIDUxMDAgMjUyMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNTEwMCAyNjI1IDYyNzAgMjYyNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNjM3NSAyNjI1IDYzNzUgMjIwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNjM3NSAyMTAwIDUyMDUgMjEwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiA1NjI1IDI2MjUgbSA1NjI1IDMzMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gNTY1NS4wMCAzMTgwLjAwIG0gNTYyNS4wMCAzMzAwLjAwIGwgNTU5NS4wMCAzMTgwLjAwIGwgIDU2MjUuNTAgMzE4MC41MCBsIDU2NTUuMDAgMzE4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiA1MTAwIDMzMDAgbSA2MjI1IDMzMDAgbCAgNjIyNSAzNzUwIGwgIDUxMDAgMzc1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi0JWzEgNTAuMF0gNTAuMDAwMDAwIHNldGRhc2gKLW4gMjg1MCAyNDAwIG0gMjMyNSAyNDAwIGwgIGdzIGNvbC0xIHMgZ3IgCVtdIDAgc2V0ZGFzaAotbiAyNDQ1LjAwIDI0MzAuMDAgbSAyMzI1LjAwIDI0MDAuMDAgbCAyNDQ1LjAwIDIzNzAuMDAgbCAgMjQ0NS41MCAyNDAwLjUwIGwgMjQ0NS4wMCAyNDMwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi0JWzEgNTAuMF0gNTAuMDAwMDAwIHNldGRhc2gKLW4gNDEyNSAyNDAwIG0gNTEwMCAyNDAwIGwgIGdzIGNvbC0xIHMgZ3IgCVtdIDAgc2V0ZGFzaAotbiA0OTgwLjAwIDIzNzAuMDAgbSA1MTAwLjAwIDI0MDAuMDAgbCA0OTgwLjAwIDI0MzAuMDAgbCAgNDk4MC41MCAyNDAwLjUwIGwgNDk4MC4wMCAyMzcwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDEwNTAgMzMwMCBtIDE5NTAgMzMwMCBsICAxOTUwIDM3NTAgbCAgMTA1MCAzNzUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTEyMDAgMTIwMCBtCi1ncyAxIC0xIHNjIChjb25maWcuaW4pIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTMwMDAgMTIwMCBtCi1ncyAxIC0xIHNjIChjb25maWd1cmUpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTMwMDAgMjQwMCBtCi1ncyAxIC0xIHNjIChjb25maWcuc3RhdHVzKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0xMjAwIDI0MDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLnN0YXR1cykgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMTIwMCAzNjAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZy5oKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci01MjUwIDEyMDAgbQotZ3MgMSAtMSBzYyAoTWFrZWZpbGUuaW4pIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTUyNTAgMjQwMCBtCi1ncyAxIC0xIHNjIChjb25maWcuc3RhdHVzKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci01MjUwIDM2MDAgbQotZ3MgMSAtMSBzYyAoTWFrZWZpbGUpIGNvbC0xIHNob3cgZ3IKLSRGMnBzRW5kCi1yZXN0b3JlCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnYnVpbGQuZmlnIGIvZXRjL2NvbmZpZ2J1aWxkLmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3NTkyZC4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnYnVpbGQuZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotI0ZJRyAzLjEKLVBvcnRyYWl0Ci1DZW50ZXIKLUluY2hlcwotMTIwMCAyCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDEwNTAgOTAwIDIxMDAgOTAwIDIxMDAgMTQyNSAxMDUwIDE0MjUgMTA1MCA5MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDE1MDAgMTQyNSAxNTAwIDIxMDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDE1MDAgMjYyNSAxNTAwIDMzMDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMjkyNSA5MDAgMzgyNSA5MDAgMzgyNSAxNDI1IDI5MjUgMTQyNSAyOTI1IDkwMAotMiA0IDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgNyAwIDAgNQotCSAyMzI1IDI2MjUgMjMyNSAyMTAwIDEwNTAgMjEwMCAxMDUwIDI2MjUgMjMyNSAyNjI1Ci0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDI4NTAgMjEwMCA0MTI1IDIxMDAgNDEyNSAyNjI1IDI4NTAgMjYyNSAyODUwIDIxMDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzNzUgMTQyNSAzMzc1IDIxMDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgNTEwMCA5MDAgNjMwMCA5MDAgNjMwMCAxMzUwIDUxMDAgMTM1MCA1MTAwIDkwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNTYyNSAxMzUwIDU2MjUgMjEwMAotMiA0IDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgNyAwIDAgNQotCSA2Mzc1IDI2MjUgNjM3NSAyMTAwIDUxMDAgMjEwMCA1MTAwIDI2MjUgNjM3NSAyNjI1Ci0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA1NjI1IDI2MjUgNTYyNSAzMzAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDUxMDAgMzMwMCA2MjI1IDMzMDAgNjIyNSAzNzUwIDUxMDAgMzc1MCA1MTAwIDMzMDAKLTIgMSAyIDEgLTEgNyAwIDAgLTEgMy4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDI4NTAgMjQwMCAyMzI1IDI0MDAKLTIgMSAyIDEgLTEgNyAwIDAgLTEgMy4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDQxMjUgMjQwMCA1MTAwIDI0MDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMTA1MCAzMzAwIDE5NTAgMzMwMCAxOTUwIDM3NTAgMTA1MCAzNzUwIDEwNTAgMzMwMAotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA2NDUgMTIwMCAxMjAwIGNvbmZpZy5pblwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgNzA1IDMwMDAgMTIwMCBjb25maWd1cmVcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDk5MCAzMDAwIDI0MDAgY29uZmlnLnN0YXR1c1wwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgOTkwIDEyMDAgMjQwMCBjb25maWcuc3RhdHVzXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA2MDAgMTIwMCAzNjAwIGNvbmZpZy5oXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA4NTUgNTI1MCAxMjAwIE1ha2VmaWxlLmluXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA5OTAgNTI1MCAyNDAwIGNvbmZpZy5zdGF0dXNcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDY3NSA1MjUwIDM2MDAgTWFrZWZpbGVcMDAxCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnYnVpbGQuamluIGIvZXRjL2NvbmZpZ2J1aWxkLmppbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjZDkzOS4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnYnVpbGQuamluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2J1aWxkLnRpbiBiL2V0Yy9jb25maWdidWlsZC50aW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZGQ2ZmUuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2J1aWxkLnRpbgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotICAgY29uZmlnLmluICAgICAgICAqY29uZmlndXJlKiAgICAgIE1ha2VmaWxlLmluCi0gICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICB2ICAgICAgICAgICAgICAgfAotICAgICAgfCAgICAgICAgICAgICBjb25maWcuc3RhdHVzICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKLSAgICpjb25maWcuc3RhdHVzKjw9PT09PT0rPT09PT09PT09PT4qY29uZmlnLnN0YXR1cyoKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ci0gICBjb25maWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdkZXYuZWluIGIvZXRjL2NvbmZpZ2Rldi5laW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmODM3ODUuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2Rldi5laW4KKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotJSFQUy1BZG9iZS0yLjAgRVBTRi0yLjAKLSUlVGl0bGU6IGNvbmZpZ2Rldi5maWcKLSUlQ3JlYXRvcjogZmlnMmRldiBWZXJzaW9uIDMuMSBQYXRjaGxldmVsIDEKLSUlQ3JlYXRpb25EYXRlOiBNb24gSnVuIDE1IDE3OjM1OjE5IDE5OTgKLSUlRm9yOiBpYW5AdGl0by5jeWdudXMuY29tIChJYW4gTGFuY2UgVGF5bG9yKQotJSVPcmllbnRhdGlvbjogUG9ydHJhaXQKLSUlQm91bmRpbmdCb3g6IDAgMCAzNDQgMzE3Ci0lJVBhZ2VzOiAwCi0lJUJlZ2luU2V0dXAKLSUlSW5jbHVkZUZlYXR1cmU6ICpQYWdlU2l6ZSBMZXR0ZXIKLSUlRW5kU2V0dXAKLSUlRW5kQ29tbWVudHMKLS8kRjJwc0RpY3QgMjAwIGRpY3QgZGVmCi0kRjJwc0RpY3QgYmVnaW4KLSRGMnBzRGljdCAvbXRyeCBtYXRyaXggcHV0Ci0vY29sLTEge30gZGVmCi0vY29sMCB7MC4wMDAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wxIHswLjAwMCAwLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDIgezAuMDAwIDEuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMyB7MC4wMDAgMS4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w0IHsxLjAwMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDUgezEuMDAwIDAuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNiB7MS4wMDAgMS4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w3IHsxLjAwMCAxLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDggezAuMDAwIDAuMDAwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sOSB7MC4wMDAgMC4wMDAgMC42OTAgc3JnYn0gYmluZCBkZWYKLS9jb2wxMCB7MC4wMDAgMC4wMDAgMC44MjAgc3JnYn0gYmluZCBkZWYKLS9jb2wxMSB7MC41MzAgMC44MTAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wxMiB7MC4wMDAgMC41NjAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wxMyB7MC4wMDAgMC42OTAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wxNCB7MC4wMDAgMC44MjAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wxNSB7MC4wMDAgMC41NjAgMC41NjAgc3JnYn0gYmluZCBkZWYKLS9jb2wxNiB7MC4wMDAgMC42OTAgMC42OTAgc3JnYn0gYmluZCBkZWYKLS9jb2wxNyB7MC4wMDAgMC44MjAgMC44MjAgc3JnYn0gYmluZCBkZWYKLS9jb2wxOCB7MC41NjAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wxOSB7MC42OTAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyMCB7MC44MjAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyMSB7MC41NjAgMC4wMDAgMC41NjAgc3JnYn0gYmluZCBkZWYKLS9jb2wyMiB7MC42OTAgMC4wMDAgMC42OTAgc3JnYn0gYmluZCBkZWYKLS9jb2wyMyB7MC44MjAgMC4wMDAgMC44MjAgc3JnYn0gYmluZCBkZWYKLS9jb2wyNCB7MC41MDAgMC4xOTAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyNSB7MC42MzAgMC4yNTAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyNiB7MC43NTAgMC4zODAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyNyB7MS4wMDAgMC41MDAgMC41MDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyOCB7MS4wMDAgMC42MzAgMC42MzAgc3JnYn0gYmluZCBkZWYKLS9jb2wyOSB7MS4wMDAgMC43NTAgMC43NTAgc3JnYn0gYmluZCBkZWYKLS9jb2wzMCB7MS4wMDAgMC44ODAgMC44ODAgc3JnYn0gYmluZCBkZWYKLS9jb2wzMSB7MS4wMDAgMC44NDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLQotZW5kCi1zYXZlCi0tNjIuMCAzNzAuMCB0cmFuc2xhdGUKLTEgLTEgc2NhbGUKLQotL2NscCB7Y2xvc2VwYXRofSBiaW5kIGRlZgotL2VmIHtlb2ZpbGx9IGJpbmQgZGVmCi0vZ3Ige2dyZXN0b3JlfSBiaW5kIGRlZgotL2dzIHtnc2F2ZX0gYmluZCBkZWYKLS9sIHtsaW5ldG99IGJpbmQgZGVmCi0vbSB7bW92ZXRvfSBiaW5kIGRlZgotL24ge25ld3BhdGh9IGJpbmQgZGVmCi0vcyB7c3Ryb2tlfSBiaW5kIGRlZgotL3NsYyB7c2V0bGluZWNhcH0gYmluZCBkZWYKLS9zbGoge3NldGxpbmVqb2lufSBiaW5kIGRlZgotL3NsdyB7c2V0bGluZXdpZHRofSBiaW5kIGRlZgotL3NyZ2Ige3NldHJnYmNvbG9yfSBiaW5kIGRlZgotL3JvdCB7cm90YXRlfSBiaW5kIGRlZgotL3NjIHtzY2FsZX0gYmluZCBkZWYKLS90ciB7dHJhbnNsYXRlfSBiaW5kIGRlZgotL3RudCB7ZHVwIGR1cCBjdXJyZW50cmdiY29sb3IKLSAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkCi0gIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZAotICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQgc3JnYn0KLSAgYmluZCBkZWYKLS9zaGQge2R1cCBkdXAgY3VycmVudHJnYmNvbG9yIDQgLTIgcm9sbCBtdWwgNCAtMiByb2xsIG11bAotICA0IC0yIHJvbGwgbXVsIHNyZ2J9IGJpbmQgZGVmCi0vJEYycHNCZWdpbiB7JEYycHNEaWN0IGJlZ2luIC8kRjJwc0VudGVyZWRTdGF0ZSBzYXZlIGRlZn0gZGVmCi0vJEYycHNFbmQgeyRGMnBzRW50ZXJlZFN0YXRlIHJlc3RvcmUgZW5kfSBkZWYKLSUlRW5kUHJvbG9nCi0KLSRGMnBzQmVnaW4KLTEwIHNldG1pdGVybGltaXQKLSAwLjA2MDAwIDAuMDYwMDAgc2MKLTcuNTAwIHNsdwotJSBQb2x5bGluZQotbiAxMDUwIDkwMCBtIDIxMDAgOTAwIGwgIDIxMDAgMTQyNSBsICAxMDUwIDE0MjUgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAyOTI1IDkwMCBtIDM5NzUgOTAwIGwgIDM5NzUgMTQyNSBsICAyOTI1IDE0MjUgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiA1NTUwIDkwMCBtIDY3NTAgOTAwIGwgIDY3NTAgMTM1MCBsICA1NTUwIDEzNTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAzNzUwIDE4MDAgbSA1MDI1IDE4MDAgbCAgNTAyNSAyMjUwIGwgIDM3NTAgMjI1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDExNTUgMjEwMCBtIDEwNTAgMjEwMCAxMDUwIDI1MjAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDEwNTAgMjYyNSAyMDcwIDI2MjUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDIxNzUgMjYyNSAyMTc1IDIyMDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDIxNzUgMjEwMCAxMTU1IDIxMDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gNTU1MCAzMzAwIG0gNjY3NSAzMzAwIGwgIDY2NzUgMzc1MCBsICA1NTUwIDM3NTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiA1NjU1IDIxMDAgbSA1NTUwIDIxMDAgNTU1MCAyNTIwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA1NTUwIDI2MjUgNjQ5NSAyNjI1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA2NjAwIDI2MjUgNjYwMCAyMjA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA2NjAwIDIxMDAgNTY1NSAyMTAwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDM3NTAgMzYwMCBtIDQ4NzUgMzYwMCBsICA0ODc1IDQwNTAgbCAgMzc1MCA0MDUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMzg1NSAyNzAwIG0gMzc1MCAyNzAwIDM3NTAgMzA0NSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMzc1MCAzMTUwIDQ1NDUgMzE1MCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNDY1MCAzMTUwIDQ2NTAgMjgwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNDY1MCAyNzAwIDM4NTUgMjcwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAyODUwIDU3MDAgbSAzNzUwIDU3MDAgbCAgMzc1MCA2MTUwIGwgIDI4NTAgNjE1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDMwMzAgNDgwMCBtIDI5MjUgNDgwMCAyOTI1IDUxNDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDI5MjUgNTI1MCAzNjQ1IDUyNTAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDM3NTAgNTI1MCAzNzUwIDQ5MDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDM3NTAgNDgwMCAzMDMwIDQ4MDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMTUwMCAxNDI1IG0gMTUwMCAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDE1MzAuMDAgMTk4MC4wMCBtIDE1MDAuMDAgMjEwMC4wMCBsIDE0NzAuMDAgMTk4MC4wMCBsICAxNTAwLjUwIDE5ODAuNTAgbCAxNTMwLjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMzMwMCAxNDI1IG0gMzMwMCA0ODAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDMzMzAuMDAgNDY4MC4wMCBtIDMzMDAuMDAgNDgwMC4wMCBsIDMyNzAuMDAgNDY4MC4wMCBsICAzMzAwLjUwIDQ2ODAuNTAgbCAzMzMwLjAwIDQ2ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMzMwMCAxNTc1IG0gMTg3NSAxNTc1IGwgIDE4NzUgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiAxOTA1LjAwIDE5ODAuMDAgbSAxODc1LjAwIDIxMDAuMDAgbCAxODQ1LjAwIDE5ODAuMDAgbCAgMTg3NS41MCAxOTgwLjUwIGwgMTkwNS4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDMzMDAgMTU3NSBtIDU3MDAgMTU3NSBsICA1NzAwIDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gNTczMC4wMCAxOTgwLjAwIG0gNTcwMC4wMCAyMTAwLjAwIGwgNTY3MC4wMCAxOTgwLjAwIGwgIDU3MDAuNTAgMTk4MC41MCBsIDU3MzAuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiA2MjI1IDEzNTAgbSA2MjI1IDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gNjI1NS4wMCAxOTgwLjAwIG0gNjIyNS4wMCAyMTAwLjAwIGwgNjE5NS4wMCAxOTgwLjAwIGwgIDYyMjUuNTAgMTk4MC41MCBsIDYyNTUuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiA2MDc1IDI2MjUgbSA2MDc1IDMzMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gNjEwNS4wMCAzMTgwLjAwIG0gNjA3NS4wMCAzMzAwLjAwIGwgNjA0NS4wMCAzMTgwLjAwIGwgIDYwNzUuNTAgMzE4MC41MCBsIDYxMDUuMDAgMzE4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiA0MjAwIDIyNTAgbSA0MjAwIDI3MDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gNDIzMC4wMCAyNTgwLjAwIG0gNDIwMC4wMCAyNzAwLjAwIGwgNDE3MC4wMCAyNTgwLjAwIGwgIDQyMDAuNTAgMjU4MC41MCBsIDQyMzAuMDAgMjU4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiA0MjAwIDMxNTAgbSA0MjAwIDM2MDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gNDIzMC4wMCAzNDgwLjAwIG0gNDIwMC4wMCAzNjAwLjAwIGwgNDE3MC4wMCAzNDgwLjAwIGwgIDQyMDAuNTAgMzQ4MC41MCBsIDQyMzAuMDAgMzQ4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiA0MjAwIDQwNTAgbSA0MjAwIDQ1MDAgbCAgMzY3NSA0NTAwIGwgIDM2NzUgNDgwMCBsICBncyBjb2wtMSBzIGdyIAotbiAzNzA1LjAwIDQ2ODAuMDAgbSAzNjc1LjAwIDQ4MDAuMDAgbCAzNjQ1LjAwIDQ2ODAuMDAgbCAgMzY3NS41MCA0NjgwLjUwIGwgMzcwNS4wMCA0NjgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDMzNzUgNTI1MCBtIDMzNzUgNTcwMCBsICBncyBjb2wtMSBzIGdyIAotbiAzNDA1LjAwIDU1ODAuMDAgbSAzMzc1LjAwIDU3MDAuMDAgbCAzMzQ1LjAwIDU1ODAuMDAgbCAgMzM3NS41MCA1NTgwLjUwIGwgMzQwNS4wMCA1NTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDMzMDAgMjkyNSBtIDM3NTAgMjkyNSBsICBncyBjb2wtMSBzIGdyIAotbiAzNjMwLjAwIDI4OTUuMDAgbSAzNzUwLjAwIDI5MjUuMDAgbCAzNjMwLjAwIDI5NTUuMDAgbCAgMzYzMC41MCAyOTI1LjUwIGwgMzYzMC4wMCAyODk1LjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDE1MDAgMjYyNSBtIDE1MDAgMzMwMCBsICBncyBjb2wtMSBzIGdyIAotbiAxNTMwLjAwIDMxODAuMDAgbSAxNTAwLjAwIDMzMDAuMDAgbCAxNDcwLjAwIDMxODAuMDAgbCAgMTUwMC41MCAzMTgwLjUwIGwgMTUzMC4wMCAzMTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDEwNTAgMzMwMCBtIDIxMDAgMzMwMCBsICAyMTAwIDM3NTAgbCAgMTA1MCAzNzUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gNDg3NSAzODI1IG0gNTI1MCAzODI1IGwgIDUyNTAgMjQwMCBsICA1NTUwIDI0MDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gNTQzMC4wMCAyMzcwLjAwIG0gNTU1MC4wMCAyNDAwLjAwIGwgNTQzMC4wMCAyNDMwLjAwIGwgIDU0MzAuNTAgMjQwMC41MCBsIDU0MzAuMDAgMjM3MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMTIwMCAxMjAwIG0KLWdzIDEgLTEgc2MgKGFjY29uZmlnLmgpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTMwMDAgMTIwMCBtCi1ncyAxIC0xIHNjIChjb25maWd1cmUuaW4pIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTU3MDAgMTIwMCBtCi1ncyAxIC0xIHNjIChNYWtlZmlsZS5hbSkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzkwMCAyMTAwIG0KLWdzIDEgLTEgc2MgKGFjaW5jbHVkZS5tNCkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMTIwMCAyNDAwIG0KLWdzIDEgLTEgc2MgKGF1dG9oZWFkZXIpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTEyMDAgMzYwMCBtCi1ncyAxIC0xIHNjIChjb25maWcuaW4pIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTU3MDAgMzYwMCBtCi1ncyAxIC0xIHNjIChNYWtlZmlsZS5pbikgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotNTcwMCAyNDAwIG0KLWdzIDEgLTEgc2MgKGF1dG9tYWtlKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zOTAwIDM5MDAgbQotZ3MgMSAtMSBzYyAoYWNsb2NhbC5tNCkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzkwMCAzMDAwIG0KLWdzIDEgLTEgc2MgKGFjbG9jYWwpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTMwMDAgNjAwMCBtCi1ncyAxIC0xIHNjIChjb25maWd1cmUpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTMwMDAgNTEwMCBtCi1ncyAxIC0xIHNjIChhdXRvY29uZikgY29sLTEgc2hvdyBncgotJEYycHNFbmQKLXJlc3RvcmUKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdkZXYuZmlnIGIvZXRjL2NvbmZpZ2Rldi5maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMzg2ZWMuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2Rldi5maWcKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jRklHIDMuMQotUG9ydHJhaXQKLUNlbnRlcgotSW5jaGVzCi0xMjAwIDIKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMTA1MCA5MDAgMjEwMCA5MDAgMjEwMCAxNDI1IDEwNTAgMTQyNSAxMDUwIDkwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAyOTI1IDkwMCAzOTc1IDkwMCAzOTc1IDE0MjUgMjkyNSAxNDI1IDI5MjUgOTAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDU1NTAgOTAwIDY3NTAgOTAwIDY3NTAgMTM1MCA1NTUwIDEzNTAgNTU1MCA5MDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMzc1MCAxODAwIDUwMjUgMTgwMCA1MDI1IDIyNTAgMzc1MCAyMjUwIDM3NTAgMTgwMAotMiA0IDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgNyAwIDAgNQotCSAyMTc1IDI2MjUgMjE3NSAyMTAwIDEwNTAgMjEwMCAxMDUwIDI2MjUgMjE3NSAyNjI1Ci0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDU1NTAgMzMwMCA2Njc1IDMzMDAgNjY3NSAzNzUwIDU1NTAgMzc1MCA1NTUwIDMzMDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgNjYwMCAyNjI1IDY2MDAgMjEwMCA1NTUwIDIxMDAgNTU1MCAyNjI1IDY2MDAgMjYyNQotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAzNzUwIDM2MDAgNDg3NSAzNjAwIDQ4NzUgNDA1MCAzNzUwIDQwNTAgMzc1MCAzNjAwCi0yIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1Ci0JIDQ2NTAgMzE1MCA0NjUwIDI3MDAgMzc1MCAyNzAwIDM3NTAgMzE1MCA0NjUwIDMxNTAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMjg1MCA1NzAwIDM3NTAgNTcwMCAzNzUwIDYxNTAgMjg1MCA2MTUwIDI4NTAgNTcwMAotMiA0IDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgNyAwIDAgNQotCSAzNzUwIDUyNTAgMzc1MCA0ODAwIDI5MjUgNDgwMCAyOTI1IDUyNTAgMzc1MCA1MjUwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAxNTAwIDE0MjUgMTUwMCAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAzMzAwIDE0MjUgMzMwMCA0ODAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMwotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAzMzAwIDE1NzUgMTg3NSAxNTc1IDE4NzUgMjEwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDMKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMzMwMCAxNTc1IDU3MDAgMTU3NSA1NzAwIDIxMDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDYyMjUgMTM1MCA2MjI1IDIxMDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDYwNzUgMjYyNSA2MDc1IDMzMDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDQyMDAgMjI1MCA0MjAwIDI3MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDQyMDAgMzE1MCA0MjAwIDM2MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCA0Ci0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDQyMDAgNDA1MCA0MjAwIDQ1MDAgMzY3NSA0NTAwIDM2NzUgNDgwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMzM3NSA1MjUwIDMzNzUgNTcwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMzMwMCAyOTI1IDM3NTAgMjkyNQotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMTUwMCAyNjI1IDE1MDAgMzMwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAxMDUwIDMzMDAgMjEwMCAzMzAwIDIxMDAgMzc1MCAxMDUwIDM3NTAgMTA1MCAzMzAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgNAotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA0ODc1IDM4MjUgNTI1MCAzODI1IDUyNTAgMjQwMCA1NTUwIDI0MDAKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgNzgwIDEyMDAgMTIwMCBhY2NvbmZpZy5oXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA4ODUgMzAwMCAxMjAwIGNvbmZpZ3VyZS5pblwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgOTQ1IDU3MDAgMTIwMCBNYWtlZmlsZS5hbVwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgOTkwIDM5MDAgMjEwMCBhY2luY2x1ZGUubTRcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDg0MCAxMjAwIDI0MDAgYXV0b2hlYWRlclwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgNjQ1IDEyMDAgMzYwMCBjb25maWcuaW5cMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDg1NSA1NzAwIDM2MDAgTWFrZWZpbGUuaW5cMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDczNSA1NzAwIDI0MDAgYXV0b21ha2VcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDgxMCAzOTAwIDM5MDAgYWNsb2NhbC5tNFwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgNTQwIDM5MDAgMzAwMCBhY2xvY2FsXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA3MDUgMzAwMCA2MDAwIGNvbmZpZ3VyZVwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgNjYwIDMwMDAgNTEwMCBhdXRvY29uZlwwMDEKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdkZXYuamluIGIvZXRjL2NvbmZpZ2Rldi5qaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTFhNzEuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2Rldi5qaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnZGV2LnRpbiBiL2V0Yy9jb25maWdkZXYudGluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWI2ZjM0Li4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdkZXYudGluCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotICAgYWNjb25maWcuaCAgICAgICBjb25maWd1cmUuaW4gICAgICAgICAgICAgICAgIE1ha2VmaWxlLmFtCi0gICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgIHwgIC0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIHwKLSAgICAgICB8ICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8ICAgICB8Ci0gICAgICAgdiAgdiAgICAgICAgICAgICB8ICAgIGFjaW5jbHVkZS5tNCAgICAgfCAgICAgfAotICAgKmF1dG9oZWFkZXIqICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHYgICAgIHYKLSAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICB2ICAgICAgLS0tPiphdXRvbWFrZSogCi0gICAgICAgdiAgICAgICAgICAgICAgICB8LS0tPiphY2xvY2FsKiAgIHwgICAgICAgfCAgICAgIAotICAgY29uZmlnLmluICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICB8ICAgICAgIHYgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB2ICAgICAgfCAgIE1ha2VmaWxlLmluCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgIGFjbG9jYWwubTQtLS0KLSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHYgICAgIHYKLSAgICAgICAgICAgICAgICAgICAgICAgKmF1dG9jb25mKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdgotICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWd1cmUgYi9ldGMvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDFmY2VmLi4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw4NjIgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTU1OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIERFRlMuCi0jIFByb3RlY3QgYWdhaW5zdCBzaGVsbCBleHBhbnNpb24gd2hpbGUgZXhlY3V0aW5nIE1ha2VmaWxlIHJ1bGVzLgotIyBQcm90ZWN0IGFnYWluc3QgTWFrZWZpbGUgbWFjcm8gZXhwYW5zaW9uLgotY2F0ID4gY29uZnRlc3QuZGVmcyA8PFxFT0YKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJS1EXDE9XDIlZwotcyVbIAlgfiMkXiYqKCl7fVxcfDsnIjw+P10lXFwmJWcKLXMlXFslXFwmJWcKLXMlXF0lXFwmJWcKLXMlXCQlJCQlZwotRU9GCi1ERUZTPWBzZWQgLWYgY29uZnRlc3QuZGVmcyBjb25mZGVmcy5oIHwgdHIgJ1wwMTInICcgJ2AKLXJtIC1mIGNvbmZ0ZXN0LmRlZnMKLQotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ3VyZS5pbiBiL2V0Yy9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ODUwNjguLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1BQ19QUkVSRVEoMi41KQotQUNfSU5JVChNYWtlZmlsZS5pbikKLQotQUNfUFJPR19JTlNUQUxMCi0KLUFDX09VVFBVVChNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWd1cmUudGV4aSBiL2V0Yy9jb25maWd1cmUudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0MDE2Ny4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlndXJlLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQ0ICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvCi1AYyAlKipzdGFydCBvZiBoZWFkZXIKLUBzZXRmaWxlbmFtZSBjb25maWd1cmUuaW5mbwotQHNldHRpdGxlIFRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0KLUBzZXRjaGFwdGVybmV3cGFnZSBvZmYKLUBjICUqKmVuZCBvZiBoZWFkZXIKLQotQGRpcmNhdGVnb3J5IEdOVSBhZG1pbgotQGRpcmVudHJ5Ci0qIGNvbmZpZ3VyZTogKGNvbmZpZ3VyZSkuCVRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0KLUBlbmQgZGlyZW50cnkKLQotQGlmaW5mbwotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtLgotCi1Db3B5cmlnaHQgKEMpIDE5OTggQ3lnbnVzIFNvbHV0aW9ucy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotCi0KLUBlbmQgaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQotcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLAotZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgc3RhdGVkIGluIGEgdHJhbnNsYXRpb24gYXBwcm92ZWQKLWJ5IHRoZSBGb3VuZGF0aW9uLgotQGVuZCBpZmluZm8KLQotQHRpdGxlcGFnZQotQHRpdGxlIFRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0KLUBhdXRob3IgSWFuIExhbmNlIFRheWxvcgotCi1AcGFnZQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTk4IEN5Z251cyBTb2x1dGlvbnMKLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQotcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLAotZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgc3RhdGVkIGluIGEgdHJhbnNsYXRpb24KLWFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi1AZW5kIHRpdGxlcGFnZQotCi1AaWZpbmZvCi1Abm9kZSBUb3AKLUB0b3AgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCi0KLVRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0uCi0KLUBtZW51Ci0qIEludHJvZHVjdGlvbjo6CQlJbnRyb2R1Y3Rpb24uCi0qIEdldHRpbmcgU3RhcnRlZDo6CQlHZXR0aW5nIFN0YXJ0ZWQuCi0qIEZpbGVzOjoJCQlGaWxlcy4KLSogQ29uZmlndXJhdGlvbiBOYW1lczo6CQlDb25maWd1cmF0aW9uIE5hbWVzLgotKiBDcm9zcyBDb21waWxhdGlvbiBUb29sczo6CUNyb3NzIENvbXBpbGF0aW9uIFRvb2xzLgotKiBDYW5hZGlhbiBDcm9zczo6CQlDYW5hZGlhbiBDcm9zcy4KLSogQ3lnbnVzIENvbmZpZ3VyZTo6CQlDeWdudXMgQ29uZmlndXJlLgotKiBNdWx0aWxpYnM6OgkJCU11bHRpbGlicy4KLSogRkFROjoJCQkJRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMuCi0qIEluZGV4OjoJCQlJbmRleC4KLUBlbmQgbWVudQotCi1AZW5kIGlmaW5mbwotCi1Abm9kZSBJbnRyb2R1Y3Rpb24KLUBjaGFwdGVyIEludHJvZHVjdGlvbgotCi1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtcy4gIEl0Ci1kZXNjcmliZXMgaG93IGF1dG9jb25mLCBhdXRvbWFrZSwgbGlidG9vbCwgYW5kIG1ha2UgZml0IHRvZ2V0aGVyLiAgSXQKLWFsc28gaW5jbHVkZXMgYSBkaXNjdXNzaW9uIG9mIHRoZSBvbGRlciBDeWdudXMgY29uZmlndXJlIHN5c3RlbS4KLQotVGhpcyBkb2N1bWVudCBkb2VzIG5vdCBkZXNjcmliZSBpbiBkZXRhaWwgaG93IHRvIHVzZSBlYWNoIG9mIHRoZSB0b29sczsKLXNlZSB0aGUgcmVzcGVjdGl2ZSBtYW51YWxzIGZvciB0aGF0LiAgSW5zdGVhZCwgaXQgZGVzY3JpYmVzIHdoaWNoIGZpbGVzCi10aGUgZGV2ZWxvcGVyIG11c3Qgd3JpdGUsIHdoaWNoIGZpbGVzIGFyZSBtYWNoaW5lIGdlbmVyYXRlZCBhbmQgaG93IHRoZXkKLWFyZSBnZW5lcmF0ZWQsIGFuZCB3aGVyZSBjZXJ0YWluIGNvbW1vbiBwcm9ibGVtcyBzaG91bGQgYmUgYWRkcmVzc2VkLgotCi1AaWZub3RodG1sCi1UaGlzIGRvY3VtZW50IGRyYXdzIG9uIHNldmVyYWwgc291cmNlcywgaW5jbHVkaW5nIHRoZSBhdXRvY29uZiBtYW51YWwgYnkKLURhdmlkIE1hY0tlbnppZSAoQHB4cmVme1RvcCwgLCBhdXRvY29uZiBvdmVydmlldywgYXV0b2NvbmYsIEF1dG9jb25mfSksCi10aGUgYXV0b21ha2UgbWFudWFsIGJ5IERhdmlkIE1hY0tlbnppZSBhbmQgVG9tIFRyb21leSAoQHB4cmVme1RvcCwgLAotYXV0b21ha2Ugb3ZlcnZpZXcsIGF1dG9tYWtlLCBHTlUgQXV0b21ha2V9KSwgdGhlIGxpYnRvb2wgbWFudWFsIGJ5Ci1Hb3Jkb24gTWF0emlna2VpdCAoQHB4cmVme1RvcCwgLCBsaWJ0b29sIG92ZXJ2aWV3LCBsaWJ0b29sLCBHTlUKLWxpYnRvb2x9KSwgYW5kIHRoZSBDeWdudXMgY29uZmlndXJlIG1hbnVhbCBieSBLLiBSaWNoYXJkIFBpeGxleS4KLUBlbmQgaWZub3RodG1sCi1AaWZodG1sCi1UaGlzIGRvY3VtZW50IGRyYXdzIG9uIHNldmVyYWwgc291cmNlcywgaW5jbHVkaW5nCi1AdXJlZntodHRwOi8vd3d3LmRlbG9yaWUuY29tL2dudS9kb2NzL2F1dG9jb25mL2F1dG9jb25mX3RvYy5odG1sLCB0aGUKLWF1dG9jb25mIG1hbnVhbH0gYnkgRGF2aWQgTWFjS2VuemllLAotQHVyZWZ7aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9hdXRvbWFrZS9hdXRvbWFrZV90b2MuaHRtbCwgdGhlCi1hdXRvbWFrZSBtYW51YWx9IGJ5IERhdmlkIE1hY0tlbnppZSBhbmQgVG9tIFRyb21leSwKLUB1cmVme2h0dHA6Ly93d3cuZGVsb3JpZS5jb20vZ251L2RvY3MvbGlidG9vbC9saWJ0b29sX3RvYy5odG1sLCB0aGUKLWxpYnRvb2wgbWFudWFsfSBieSBHb3Jkb24gTWF0emlna2VpdCwgYW5kIHRoZSBDeWdudXMgY29uZmlndXJlIG1hbnVhbCBieQotSy4gUmljaGFyZCBQaXhsZXkuCi1AZW5kIGlmaHRtbAotCi1AbWVudQotKiBHb2Fsczo6CQkJR29hbHMuCi0qIFRvb2xzOjoJCQlUaGUgdG9vbHMuCi0qIEhpc3Rvcnk6OgkJCUhpc3RvcnkuCi0qIEJ1aWxkaW5nOjoJCQlCdWlsZGluZy4KLUBlbmQgbWVudQotCi1Abm9kZSBHb2FscwotQHNlY3Rpb24gR29hbHMKLUBjaW5kZXggZ29hbHMKLQotVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSBoYXMgdHdvIG1haW4gZ29hbHMuCi0KLVRoZSBmaXJzdCBpcyB0byBzaW1wbGlmeSB0aGUgZGV2ZWxvcG1lbnQgb2YgcG9ydGFibGUgcHJvZ3JhbXMuICBUaGUKLXN5c3RlbSBwZXJtaXRzIHRoZSBkZXZlbG9wZXIgdG8gY29uY2VudHJhdGUgb24gd3JpdGluZyB0aGUgcHJvZ3JhbSwKLXNpbXBsaWZ5aW5nIG1hbnkgZGV0YWlscyBvZiBwb3J0YWJpbGl0eSBhY3Jvc3MgVW5peCBhbmQgZXZlbiBXaW5kb3dzCi1zeXN0ZW1zLCBhbmQgcGVybWl0dGluZyB0aGUgZGV2ZWxvcGVyIHRvIGRlc2NyaWJlIGhvdyB0byBidWlsZCB0aGUKLXByb2dyYW0gdXNpbmcgc2ltcGxlIHJ1bGVzIHJhdGhlciB0aGFuIGNvbXBsZXggTWFrZWZpbGVzLgotCi1UaGUgc2Vjb25kIGlzIHRvIHNpbXBsaWZ5IHRoZSBidWlsZGluZyBvZiBwcm9ncmFtcyBkaXN0cmlidXRlZCBhcyBzb3VyY2UKLWNvZGUuICBBbGwgcHJvZ3JhbXMgYXJlIGJ1aWx0IHVzaW5nIGEgc2ltcGxlLCBzdGFuZGFyZGl6ZWQsIHR3byBzdGVwCi1wcm9jZXNzLiAgVGhlIHByb2dyYW0gYnVpbGRlciBuZWVkIG5vdCBpbnN0YWxsIGFueSBzcGVjaWFsIHRvb2xzIGluCi1vcmRlciB0byBidWlsZCB0aGUgcHJvZ3JhbS4KLQotQG5vZGUgVG9vbHMKLUBzZWN0aW9uIFRvb2xzCi0KLVRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gaXMgY29tcHJpc2VkIG9mIHNldmVyYWwgZGlmZmVyZW50Ci10b29scy4gIFByb2dyYW0gZGV2ZWxvcGVycyBtdXN0IGJ1aWxkIGFuZCBpbnN0YWxsIGFsbCBvZiB0aGVzZSB0b29scy4KLQotUGVvcGxlIHdobyBqdXN0IHdhbnQgdG8gYnVpbGQgcHJvZ3JhbXMgZnJvbSBkaXN0cmlidXRlZCBzb3VyY2VzIG5vcm1hbGx5Ci1kbyBub3QgbmVlZCBhbnkgc3BlY2lhbCB0b29scyBiZXlvbmQgYSBVbml4IHNoZWxsLCBhIG1ha2UgcHJvZ3JhbSwgYW5kIGEKLUMgY29tcGlsZXIuCi0KLUB0YWJsZSBAYXNpcwotQGl0ZW0gYXV0b2NvbmYKLXByb3ZpZGVzIGEgZ2VuZXJhbCBwb3J0YWJpbGl0eSBmcmFtZXdvcmssIGJhc2VkIG9uIHRlc3RpbmcgdGhlIGZlYXR1cmVzCi1vZiB0aGUgaG9zdCBzeXN0ZW0gYXQgYnVpbGQgdGltZS4KLUBpdGVtIGF1dG9tYWtlCi1hIHN5c3RlbSBmb3IgZGVzY3JpYmluZyBob3cgdG8gYnVpbGQgYSBwcm9ncmFtLCBwZXJtaXR0aW5nIHRoZSBkZXZlbG9wZXIKLXRvIHdyaXRlIGEgc2ltcGxpZmllZCBAZmlsZXtNYWtlZmlsZX0uCi1AaXRlbSBsaWJ0b29sCi1hIHN0YW5kYXJkaXplZCBhcHByb2FjaCB0byBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotQGl0ZW0gZ2V0dGV4dAotcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIHRyYW5zbGF0aW9uIG9mIHRleHQgbWVzc2FnZXMgaW50byBvdGhlcgotbGFuZ3VhZ2VzOyBub3QgcmVhbGx5IGRpc2N1c3NlZCBpbiB0aGlzIGRvY3VtZW50LgotQGl0ZW0gbTQKLWF1dG9jb25mIHJlcXVpcmVzIHRoZSBHTlUgdmVyc2lvbiBvZiBtNDsgdGhlIHN0YW5kYXJkIFVuaXggbTQgZG9lcyBub3QKLXN1ZmZpY2UuCi1AaXRlbSBwZXJsCi1hdXRvbWFrZSByZXF1aXJlcyBwZXJsLgotQGVuZCB0YWJsZQotCi1Abm9kZSBIaXN0b3J5Ci1Ac2VjdGlvbiBIaXN0b3J5Ci1AY2luZGV4IGhpc3RvcnkKLQotVGhpcyBpcyBhIHZlcnkgYnJpZWYgYW5kIHByb2JhYmx5IGluYWNjdXJhdGUgaGlzdG9yeS4KLQotQXMgdGhlIG51bWJlciBvZiBVbml4IHZhcmlhbnRzIGluY3JlYXNlZCBkdXJpbmcgdGhlIDE5ODBzLCBpdCBiZWNhbWUKLWhhcmRlciB0byB3cml0ZSBwcm9ncmFtcyB3aGljaCBjb3VsZCBydW4gb24gYWxsIHZhcmlhbnRzLiAgV2hpbGUgaXQgd2FzCi1vZnRlbiBwb3NzaWJsZSB0byB1c2UgQGNvZGV7I2lmZGVmfSB0byBpZGVudGlmeSBwYXJ0aWN1bGFyIHN5c3RlbXMsCi1kZXZlbG9wZXJzIGZyZXF1ZW50bHkgZGlkIG5vdCBoYXZlIGFjY2VzcyB0byBldmVyeSBzeXN0ZW0sIGFuZCB0aGUKLWNoYXJhY3RlcmlzdGljcyBvZiBzb21lIHN5c3RlbXMgY2hhbmdlZCBmcm9tIHZlcnNpb24gdG8gdmVyc2lvbi4KLQotQnkgMTk5MiwgYXQgbGVhc3QgdGhyZWUgZGlmZmVyZW50IGFwcHJvYWNoZXMgaGFkIGJlZW4gZGV2ZWxvcGVkOgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSBNZXRhY29uZmlnIHByb2dyYW0sIGJ5IExhcnJ5IFdhbGwsIEhhcmxhbiBTdGVubiwgYW5kIFJhcGhhZWwKLU1hbmZyZWRpLgotQGl0ZW0KLVRoZSBDeWdudXMgY29uZmlndXJlIHNjcmlwdCwgYnkgSy4gUmljaGFyZCBQaXhsZXksIGFuZCB0aGUgZ2NjIGNvbmZpZ3VyZQotc2NyaXB0LCBieSBSaWNoYXJkIFN0YWxsbWFuLiAgVGhlc2UgdXNlIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFwcHJvYWNoLAotYW5kIHRoZSBkZXZlbG9wZXJzIGNvbW11bmljYXRlZCByZWd1bGFybHkuCi1AaXRlbQotVGhlIGF1dG9jb25mIHByb2dyYW0sIGJ5IERhdmlkIE1hY0tlbnppZS4KLUBlbmQgaXRlbWl6ZQotCi1UaGUgTWV0YWNvbmZpZyBwcm9ncmFtIGlzIHN0aWxsIHVzZWQgZm9yIFBlcmwgYW5kIGEgZmV3IG90aGVyIHByb2dyYW1zLgotSXQgaXMgcGFydCBvZiB0aGUgRGlzdCBwYWNrYWdlLiAgSSBkbyBub3Qga25vdyBpZiBpdCBpcyBiZWluZyBkZXZlbG9wZWQuCi0KLUluIDE5OTQsIERhdmlkIE1hY0tlbnppZSBhbmQgb3RoZXJzIG1vZGlmaWVkIGF1dG9jb25mIHRvIGluY29ycG9yYXRlIGFsbAotdGhlIGZlYXR1cmVzIG9mIEN5Z251cyBjb25maWd1cmUuICBTaW5jZSB0aGVuLCB0aGVyZSBoYXMgYmVlbiBhIHNsb3cgYnV0Ci1zdGVhZHkgY29udmVyc2lvbiBvZiBHTlUgcHJvZ3JhbXMgZnJvbSBDeWdudXMgY29uZmlndXJlIHRvIGF1dG9jb25mLiBnY2MKLWhhcyBiZWVuIGNvbnZlcnRlZCwgZWxpbWluYXRpbmcgdGhlIGdjYyBjb25maWd1cmUgc2NyaXB0LgotCi1HTlUgYXV0b2NvbmYgd2FzIHJlZ3VsYXJseSBtYWludGFpbmVkIHVudGlsIGxhdGUgMTk5Ni4gIEFzIG9mIHRoaXMKLXdyaXRpbmcgaW4gSnVuZSwgMTk5OCwgaXQgaGFzIG5vIHB1YmxpYyBtYWludGFpbmVyLgotCi1Nb3N0IHByb2dyYW1zIGFyZSBidWlsdCB1c2luZyB0aGUgbWFrZSBwcm9ncmFtLCB3aGljaCByZXF1aXJlcyB0aGUKLWRldmVsb3BlciB0byB3cml0ZSBNYWtlZmlsZXMgZGVzY3JpYmluZyBob3cgdG8gYnVpbGQgdGhlIHByb2dyYW1zLgotU2luY2UgbW9zdCBwcm9ncmFtcyBhcmUgYnVpbHQgaW4gcHJldHR5IG11Y2ggdGhlIHNhbWUgd2F5LCB0aGlzIGxlZCB0byBhCi1sb3Qgb2YgZHVwbGljYXRpb24uCi0KLVRoZSBYIFdpbmRvdyBzeXN0ZW0gaXMgYnVpbHQgdXNpbmcgdGhlIGltYWtlIHRvb2wsIHdoaWNoIHVzZXMgYSBkYXRhYmFzZQotb2YgcnVsZXMgdG8gZWxpbWluYXRlIHRoZSBkdXBsaWNhdGlvbi4gIEhvd2V2ZXIsIGJ1aWxkaW5nIGEgdG9vbCB3aGljaAotd2FzIGRldmVsb3BlZCB1c2luZyBpbWFrZSByZXF1aXJlcyB0aGF0IHRoZSBidWlsZGVyIGhhdmUgaW1ha2UKLWluc3RhbGxlZCwgdmlvbGF0aW5nIG9uZSBvZiB0aGUgZ29hbHMgb2YgdGhlIEdOVSBzeXN0ZW0uCi0KLVRoZSBuZXcgQlNEIG1ha2UgcHJvdmlkZXMgYSBzdGFuZGFyZCBsaWJyYXJ5IG9mIE1ha2VmaWxlIGZyYWdtZW50cywKLXdoaWNoIHBlcm1pdHMgZGV2ZWxvcGVycyB0byB3cml0ZSB2ZXJ5IHNpbXBsZSBNYWtlZmlsZXMuICBIb3dldmVyLCB0aGlzCi1yZXF1aXJlcyB0aGF0IHRoZSBidWlsZGVyIGluc3RhbGwgdGhlIG5ldyBCU0QgbWFrZSBwcm9ncmFtLgotCi1JbiAxOTk0LCBEYXZpZCBNYWNLZW56aWUgd3JvdGUgdGhlIGZpcnN0IHZlcnNpb24gb2YgYXV0b21ha2UsIHdoaWNoCi1wZXJtaXR0ZWQgd3JpdGluZyBhIHNpbXBsZSBidWlsZCBkZXNjcmlwdGlvbiB3aGljaCB3YXMgY29udmVydGVkIGludG8gYQotTWFrZWZpbGUgd2hpY2ggY291bGQgYmUgdXNlZCBieSB0aGUgc3RhbmRhcmQgbWFrZSBwcm9ncmFtLiAgSW4gMTk5NSwgVG9tCi1Ucm9tZXkgY29tcGxldGVseSByZXdyb3RlIGF1dG9tYWtlIGluIFBlcmwsIGFuZCBoZSBjb250aW51ZXMgdG8gZW5oYW5jZQotaXQuCi0KLVZhcmlvdXMgZnJlZSBwYWNrYWdlcyBidWlsdCBsaWJyYXJpZXMsIGFuZCBieSBhcm91bmQgMTk5NSBzZXZlcmFsCi1pbmNsdWRlZCBzdXBwb3J0IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgb24gdmFyaW91cyBwbGF0Zm9ybXMuCi1Ib3dldmVyLCB0aGVyZSB3YXMgbm8gY29uc2lzdGVudCBhcHByb2FjaC4gIEluIGVhcmx5IDE5OTYsIEdvcmRvbgotTWF0emlna2VpdCBiZWdhbiB3b3JraW5nIG9uIGxpYnRvb2wsIHdoaWNoIHByb3ZpZGVkIGEgc3RhbmRhcmRpemVkCi1hcHByb2FjaCB0byBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLiAgVGhpcyB3YXMgaW50ZWdyYXRlZCBpbnRvCi1hdXRvbWFrZSBmcm9tIHRoZSBzdGFydC4KLQotVGhlIGRldmVsb3BtZW50IG9mIGF1dG9tYWtlIGFuZCBsaWJ0b29sIHdhcyBkcml2ZW4gYnkgdGhlIEdOSVRTIHByb2plY3QsCi1hIGdyb3VwIG9mIEdOVSBtYWludGFpbmVycyB3aG8gZGVzaWduZWQgc3RhbmRhcmRpemVkIHRvb2xzIHRvIGhlbHAgbWVldAotdGhlIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgotCi1Abm9kZSBCdWlsZGluZwotQHNlY3Rpb24gQnVpbGRpbmcKLQotTW9zdCByZWFkZXJzIG9mIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGFscmVhZHkga25vdyBob3cgdG8gYnVpbGQgYSB0b29sIGJ5Ci1ydW5uaW5nIEBzYW1we2NvbmZpZ3VyZX0gYW5kIEBzYW1we21ha2V9LiAgVGhpcyBzZWN0aW9uIG1heSBzZXJ2ZSBhcyBhCi1xdWljayBpbnRyb2R1Y3Rpb24gb3IgcmVtaW5kZXIuCi0KLUJ1aWxkaW5nIGEgdG9vbCBpcyBub3JtYWxseSBhcyBzaW1wbGUgYXMgcnVubmluZyBAc2FtcHtjb25maWd1cmV9Ci1mb2xsb3dlZCBieSBAc2FtcHttYWtlfS4gIFlvdSBzaG91bGQgbm9ybWFsbHkgcnVuIEBzYW1we2NvbmZpZ3VyZX0gZnJvbQotYW4gZW1wdHkgZGlyZWN0b3J5LCB1c2luZyBzb21lIHBhdGggdG8gcmVmZXIgdG8gdGhlIEBzYW1we2NvbmZpZ3VyZX0KLXNjcmlwdCBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggeW91IHJ1bgotQHNhbXB7Y29uZmlndXJlfSBpcyBjYWxsZWQgdGhlIEBkZm57b2JqZWN0IGRpcmVjdG9yeX0uCi0KLUluIG9yZGVyIHRvIHVzZSBhIG9iamVjdCBkaXJlY3Rvcnkgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdGhlIHNvdXJjZQotZGlyZWN0b3J5LCB5b3UgbXVzdCBiZSB1c2luZyB0aGUgR05VIHZlcnNpb24gb2YgQHNhbXB7bWFrZX0sIHdoaWNoIGhhcwotdGhlIHJlcXVpcmVkIEBzYW1we1ZQQVRIfSBzdXBwb3J0LiAgRGVzcGl0ZSB0aGlzIHJlc3RyaWN0aW9uLCB1c2luZyBhCi1kaWZmZXJlbnQgb2JqZWN0IGRpcmVjdG9yeSBpcyBoaWdobHkgcmVjb21tZW5kZWQ6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotSXQga2VlcHMgdGhlIGZpbGVzIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGJ1aWxkIGZyb20gY2x1dHRlcmluZyB1cCB5b3VyCi1zb3VyY2VzLgotQGl0ZW0gCi1JdCBwZXJtaXRzIHlvdSB0byByZW1vdmUgdGhlIGJ1aWx0IGZpbGVzIGJ5IHNpbXBseSByZW1vdmluZyB0aGUgZW50aXJlCi1idWlsZCBkaXJlY3RvcnkuCi1AaXRlbQotSXQgcGVybWl0cyB5b3UgdG8gYnVpbGQgZnJvbSB0aGUgc2FtZSBzb3VyY2VzIHdpdGggc2V2ZXJhbCBzZXRzIG9mCi1jb25maWd1cmUgb3B0aW9ucyBzaW11bHRhbmVvdXNseS4KLUBlbmQgaXRlbWl6ZQotCi1JZiB5b3UgZG9uJ3QgaGF2ZSBHTlUgQHNhbXB7bWFrZX0sIHlvdSB3aWxsIGhhdmUgdG8gcnVuIEBzYW1we2NvbmZpZ3VyZX0KLWluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgQWxsIEdOVSBwYWNrYWdlcyBzaG91bGQgc3VwcG9ydCB0aGlzOyBpbgotcGFydGljdWxhciwgR05VIHBhY2thZ2VzIHNob3VsZCBub3QgYXNzdW1lIHRoZSBwcmVzZW5jZSBvZiBHTlUKLUBzYW1we21ha2V9LgotCi1BZnRlciBydW5uaW5nIEBzYW1we2NvbmZpZ3VyZX0sIHlvdSBjYW4gYnVpbGQgdGhlIHRvb2xzIGJ5IHJ1bm5pbmcKLUBzYW1we21ha2V9LgotCi1UbyBpbnN0YWxsIHRoZSB0b29scywgcnVuIEBzYW1we21ha2UgaW5zdGFsbH0uICBJbnN0YWxsaW5nIHRoZSB0b29scwotd2lsbCBjb3B5IHRoZSBwcm9ncmFtcyBhbmQgYW55IHJlcXVpcmVkIHN1cHBvcnQgZmlsZXMgdG8gdGhlCi1AZGZue2luc3RhbGxhdGlvbiBkaXJlY3Rvcnl9LiAgVGhlIGxvY2F0aW9uIG9mIHRoZSBpbnN0YWxsYXRpb24KLWRpcmVjdG9yeSBpcyBjb250cm9sbGVkIGJ5IEBzYW1we2NvbmZpZ3VyZX0gb3B0aW9ucywgYXMgZGVzY3JpYmVkIGJlbG93LgotCi1JbiB0aGUgQ3lnbnVzIHRyZWUgYXQgcHJlc2VudCwgdGhlIGluZm8gZmlsZXMgYXJlIGJ1aWx0IGFuZCBpbnN0YWxsZWQgYXMKLWEgc2VwYXJhdGUgc3RlcC4gIFRvIGJ1aWxkIHRoZW0sIHJ1biBAc2FtcHttYWtlIGluZm99LiAgVG8gaW5zdGFsbCB0aGVtLAotcnVuIEBzYW1we21ha2UgaW5zdGFsbC1pbmZvfS4KLQotQWxsIEBzYW1we2NvbmZpZ3VyZX0gc2NyaXB0cyBzdXBwb3J0IGEgd2lkZSB2YXJpZXR5IG9mIG9wdGlvbnMuICBUaGUKLW1vc3QgaW50ZXJlc3Rpbmcgb25lcyBhcmUgQHNhbXB7LS13aXRofSBhbmQgQHNhbXB7LS1lbmFibGV9IG9wdGlvbnMKLXdoaWNoIGFyZSBnZW5lcmFsbHkgc3BlY2lmaWMgdG8gcGFydGljdWxhciB0b29scy4gIFlvdSBjYW4gdXN1YWxseSB1c2UKLXRoZSBAc2FtcHstLWhlbHB9IG9wdGlvbiB0byBnZXQgYSBsaXN0IG9mIGludGVyZXN0aW5nIG9wdGlvbnMgZm9yIGEKLXBhcnRpY3VsYXIgY29uZmlndXJlIHNjcmlwdC4KLQotVGhlIG9ubHkgZ2VuZXJpYyBvcHRpb25zIHlvdSBhcmUgbGlrZWx5IHRvIHVzZSBhcmUgdGhlIEBzYW1wey0tcHJlZml4fQotYW5kIEBzYW1wey0tZXhlYy1wcmVmaXh9IG9wdGlvbnMuICBUaGVzZSBvcHRpb25zIGFyZSB1c2VkIHRvIHNwZWNpZnkgdGhlCi1pbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCi1UaGUgZGlyZWN0b3J5IG5hbWVkIGJ5IHRoZSBAc2FtcHstLXByZWZpeH0gb3B0aW9uIHdpbGwgaG9sZCBtYWNoaW5lCi1pbmRlcGVuZGVudCBmaWxlcyBzdWNoIGFzIGluZm8gZmlsZXMuCi0KLVRoZSBkaXJlY3RvcnkgbmFtZWQgYnkgdGhlIEBzYW1wey0tZXhlYy1wcmVmaXh9IG9wdGlvbiwgd2hpY2ggaXMKLW5vcm1hbGx5IGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBAc2FtcHstLXByZWZpeH0gZGlyZWN0b3J5LCB3aWxsIGhvbGQKLW1hY2hpbmUgZGVwZW5kZW50IGZpbGVzIHN1Y2ggYXMgZXhlY3V0YWJsZXMuCi0KLVRoZSBkZWZhdWx0IGZvciBAc2FtcHstLXByZWZpeH0gaXMgQGZpbGV7L3Vzci9sb2NhbH0uICBUaGUgZGVmYXVsdCBmb3IKLUBzYW1wey0tZXhlYy1wcmVmaXh9IGlzIHRoZSB2YWx1ZSB1c2VkIGZvciBAc2FtcHstLXByZWZpeH0uCi0KLVRoZSBjb252ZW50aW9uIHVzZWQgaW4gQ3lnbnVzIHJlbGVhc2VzIGlzIHRvIHVzZSBhIEBzYW1wey0tcHJlZml4fQotb3B0aW9uIG9mIEBmaWxley91c3IvY3lnbnVzL0B2YXJ7cmVsZWFzZX19LCB3aGVyZSBAdmFye3JlbGVhc2V9IGlzIHRoZQotbmFtZSBvZiB0aGUgcmVsZWFzZSwgYW5kIHRvIHVzZSBhIEBzYW1wey0tZXhlYy1wcmVmaXh9IG9wdGlvbiBvZgotQGZpbGV7L3Vzci9jeWdudXMvQHZhcntyZWxlYXNlfS9ILUB2YXJ7aG9zdH19LCB3aGVyZSBAdmFye2hvc3R9IGlzIHRoZQotY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBob3N0IHN5c3RlbSAoQHB4cmVme0NvbmZpZ3VyYXRpb24gTmFtZXN9KS4KLQotRG8gbm90IHVzZSBlaXRoZXIgdGhlIHNvdXJjZSBvciB0aGUgb2JqZWN0IGRpcmVjdG9yeSBhcyB0aGUgaW5zdGFsbGF0aW9uCi1kaXJlY3RvcnkuICBUaGF0IHdpbGwganVzdCBsZWFkIHRvIGNvbmZ1c2lvbi4KLQotQG5vZGUgR2V0dGluZyBTdGFydGVkCi1AY2hhcHRlciBHZXR0aW5nIFN0YXJ0ZWQKLQotVG8gc3RhcnQgdXNpbmcgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSB3aXRoIHlvdXIgc29mdHdhcmUKLXBhY2thZ2UsIHlvdSBtdXN0IHdyaXRlIHRocmVlIGZpbGVzLCBhbmQgeW91IG11c3QgcnVuIHNvbWUgdG9vbHMgdG8KLW1hbnVhbGx5IGdlbmVyYXRlIGFkZGl0aW9uYWwgZmlsZXMuCi0KLUBtZW51Ci0qIFdyaXRlIGNvbmZpZ3VyZS5pbjo6CQlXcml0ZSBjb25maWd1cmUuaW4uCi0qIFdyaXRlIE1ha2VmaWxlLmFtOjoJCVdyaXRlIE1ha2VmaWxlLmFtLgotKiBXcml0ZSBhY2NvbmZpZy5oOjoJCVdyaXRlIGFjY29uZmlnLmguCi0qIEdlbmVyYXRlIGZpbGVzOjoJCUdlbmVyYXRlIGZpbGVzLgotKiBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZTo6CUV4YW1wbGUuCi1AZW5kIG1lbnUKLQotQG5vZGUgV3JpdGUgY29uZmlndXJlLmluCi1Ac2VjdGlvbiBXcml0ZSBjb25maWd1cmUuaW4KLUBjaW5kZXggQGZpbGV7Y29uZmlndXJlLmlufSwgd3JpdGluZwotCi1Zb3UgbXVzdCBmaXJzdCB3cml0ZSB0aGUgZmlsZSBAZmlsZXtjb25maWd1cmUuaW59LiAgVGhpcyBpcyBhbiBhdXRvY29uZgotaW5wdXQgZmlsZSwgYW5kIHRoZSBhdXRvY29uZiBtYW51YWwgZGVzY3JpYmVzIGluIGRldGFpbCB3aGF0IHRoaXMgZmlsZQotc2hvdWxkIGxvb2sgbGlrZS4KLQotWW91IHdpbGwgd3JpdGUgdGVzdHMgaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgdG8gY2hlY2sgZm9yCi1jb25kaXRpb25zIHRoYXQgbWF5IGNoYW5nZSBmcm9tIG9uZSBzeXN0ZW0gdG8gYW5vdGhlciwgc3VjaCBhcyB0aGUKLXByZXNlbmNlIG9mIHBhcnRpY3VsYXIgaGVhZGVyIGZpbGVzIG9yIGZ1bmN0aW9ucy4KLQotRm9yIGV4YW1wbGUsIG5vdCBhbGwgc3lzdGVtcyBzdXBwb3J0IHRoZSBAc2FtcHtnZXR0aW1lb2ZkYXl9IGZ1bmN0aW9uLgotSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBAc2FtcHtnZXR0aW1lb2ZkYXl9IGZ1bmN0aW9uIHdoZW4gaXQgaXMKLWF2YWlsYWJsZSwgYW5kIHRvIHVzZSBzb21lIG90aGVyIGZ1bmN0aW9uIHdoZW4gaXQgaXMgbm90LCB5b3Ugd291bGQKLWNoZWNrIGZvciB0aGlzIGJ5IHB1dHRpbmcgQHNhbXB7QUNfQ0hFQ0tfRlVOQ1MoZ2V0dGltZW9mZGF5KX0gaW4KLUBmaWxle2NvbmZpZ3VyZS5pbn0uCi0KLVdoZW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaXMgcnVuIGF0IGJ1aWxkIHRpbWUsIHRoaXMgd2lsbCBhcnJhbmdlIHRvCi1kZWZpbmUgdGhlIHByZXByb2Nlc3NvciBtYWNybyBAc2FtcHtIQVZFX0dFVFRJTUVPRkRBWX0gdG8gdGhlIHZhbHVlIDEgaWYKLXRoZSBAc2FtcHtnZXR0aW1lb2ZkYXl9IGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgYW5kIHRvIG5vdCBkZWZpbmUgdGhlCi1tYWNybyBhdCBhbGwgaWYgdGhlIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUuICBZb3VyIGNvZGUgY2FuIHRoZW4gdXNlCi1Ac2FtcHsjaWZkZWZ9IHRvIHRlc3Qgd2hldGhlciBpdCBpcyBzYWZlIHRvIGNhbGwgQHNhbXB7Z2V0dGltZW9mZGF5fS4KLQotSWYgeW91IGhhdmUgYW4gZXhpc3RpbmcgYm9keSBvZiBjb2RlLCB0aGUgQHNhbXB7YXV0b3NjYW59IHByb2dyYW0gbWF5Ci1oZWxwIGlkZW50aWZ5IHBvdGVudGlhbCBwb3J0YWJpbGl0eSBwcm9ibGVtcywgYW5kIGhlbmNlIGNvbmZpZ3VyZSB0ZXN0cwotdGhhdCB5b3Ugd2lsbCB3YW50IHRvIHVzZS4KLUBpZm5vdGh0bWwKLUB4cmVme0ludm9raW5nIGF1dG9zY2FuLCAsICwgYXV0b2NvbmYsIHRoZSBhdXRvY29uZiBtYW51YWx9LgotQGVuZCBpZm5vdGh0bWwKLUBpZmh0bWwKLVNlZSBAdXJlZntodHRwOi8vd3d3LmRlbG9yaWUuY29tL2dudS9kb2NzL2F1dG9jb25mL2F1dG9jb25mXzQuaHRtbCwgdGhlCi1hdXRvc2NhbiBkb2N1bWVudGF0aW9ufS4KLUBlbmQgaWZodG1sCi0KLUFub3RoZXIgaGFuZHkgdG9vbCBmb3IgYW4gZXhpc3RpbmcgYm9keSBvZiBjb2RlIGlzIEBzYW1we2lmbmFtZXN9LiAgVGhpcwotd2lsbCBzaG93IHlvdSBhbGwgdGhlIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMgdGhhdCB0aGUgY29kZSBhbHJlYWR5Ci11c2VzLgotQGlmbm90aHRtbAotQHhyZWZ7SW52b2tpbmcgaWZuYW1lcywgLCAsIGF1dG9jb25mLCB0aGUgYXV0b2NvbmYgbWFudWFsfS4KLUBlbmQgaWZub3RodG1sCi1AaWZodG1sCi1TZWUgQHVyZWZ7aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9hdXRvY29uZi9hdXRvY29uZl81Lmh0bWwsIHRoZQotaWZuYW1lcyBkb2N1bWVudGF0aW9ufS4KLUBlbmQgaWZodG1sCi0KLUJlc2lkZXMgdGhlIHBvcnRhYmlsaXR5IHRlc3RzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byB5b3VyIHBhcnRpY3VsYXIKLXBhY2thZ2UsIGV2ZXJ5IEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBzaG91bGQgY29udGFpbiB0aGUgZm9sbG93aW5nCi1tYWNyb3MuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gQUNfSU5JVAotQGNpbmRleCBAc2FtcHtBQ19JTklUfQotVGhpcyBtYWNybyB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCwgd2hpY2ggaXMgdGhlIG5hbWUgb2YgYSBmaWxlIGluIHlvdXIKLXBhY2thZ2UuICBGb3IgZXhhbXBsZSwgQHNhbXB7QUNfSU5JVChmb28uYyl9LgotCi1AaXRlbSBBQ19QUkVSRVEoQHZhcntWRVJTSU9OfSkKLUBjaW5kZXggQHNhbXB7QUNfUFJFUkVRfQotVGhpcyBtYWNybyBpcyBvcHRpb25hbC4gIEl0IG1heSBiZSB1c2VkIHRvIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mCi1Ac2FtcHthdXRvY29uZn0gdGhhdCB5b3UgYXJlIHVzaW5nLiAgVGhpcyB3aWxsIHByZXZlbnQgdXNlcnMgZnJvbQotcnVubmluZyBhbiBlYXJsaWVyIHZlcnNpb24gb2YgQHNhbXB7YXV0b2NvbmZ9IGFuZCBwZXJoYXBzIGdldHRpbmcgYW4KLWludmFsaWQgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQuICBGb3IgZXhhbXBsZSwgQHNhbXB7QUNfUFJFUkVRKDIuMTIpfS4KLQotQGl0ZW0gQU1fSU5JVF9BVVRPTUFLRQotQGNpbmRleCBAc2FtcHtBTV9JTklUX0FVVE9NQUtFfQotVGhpcyBtYWNybyB0YWtlcyB0d28gYXJndW1lbnRzOiB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSwgYW5kIGEgdmVyc2lvbgotbnVtYmVyLiAgRm9yIGV4YW1wbGUsIEBzYW1we0FNX0lOSVRfQVVUT01BS0UoZm9vLCAxLjApfS4gIChUaGlzIG1hY3JvIGlzCi1ub3QgbmVlZGVkIGlmIHlvdSBhcmUgbm90IHVzaW5nIGF1dG9tYWtlKS4KLQotQGl0ZW0gQU1fQ09ORklHX0hFQURFUgotQGNpbmRleCBAc2FtcHtBTV9DT05GSUdfSEVBREVSfQotVGhpcyBtYWNybyBuYW1lcyB0aGUgaGVhZGVyIGZpbGUgd2hpY2ggd2lsbCBob2xkIHRoZSBwcmVwcm9jZXNzb3IgbWFjcm8KLWRlZmluaXRpb25zIGF0IHJ1biB0aW1lLiAgTm9ybWFsbHkgdGhpcyBzaG91bGQgYmUgQGZpbGV7Y29uZmlnLmh9LiAgWW91cgotc291cmNlcyB3b3VsZCB0aGVuIHVzZSBAc2FtcHsjaW5jbHVkZSAiY29uZmlnLmgifSB0byBpbmNsdWRlIGl0LgotCi1UaGlzIG1hY3JvIG1heSBvcHRpb25hbGx5IG5hbWUgdGhlIGlucHV0IGZpbGUgZm9yIHRoYXQgaGVhZGVyIGZpbGU7IGJ5Ci1kZWZhdWx0LCB0aGlzIGlzIEBmaWxle2NvbmZpZy5oLmlufSwgYnV0IHRoYXQgZmlsZSBuYW1lIHdvcmtzIHBvb3JseSBvbgotRE9TIGZpbGVzeXN0ZW1zLiAgVGhlcmVmb3JlLCBpdCBpcyBvZnRlbiBiZXR0ZXIgdG8gbmFtZSBpdCBleHBsaWNpdGx5IGFzCi1AZmlsZXtjb25maWcuaW59LgotCi1UaGlzIGlzIHdoYXQgeW91IHNob3VsZCBub3JtYWxseSBwdXQgaW4gQGZpbGV7Y29uZmlndXJlLmlufToKLUBleGFtcGxlCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLUBlbmQgZXhhbXBsZQotCi1AY2luZGV4IEBzYW1we0FDX0NPTkZJR19IRUFERVJ9Ci0oSWYgeW91IGFyZSBub3QgdXNpbmcgYXV0b21ha2UsIHVzZSBAc2FtcHtBQ19DT05GSUdfSEVBREVSfSByYXRoZXIgdGhhbgotQHNhbXB7QU1fQ09ORklHX0hFQURFUn0pLgotCi1AaXRlbSBBTV9NQUlOVEFJTkVSX01PREUKLUBjaW5kZXggQHNhbXB7QU1fTUFJTlRBSU5FUl9NT0RFfQotVGhpcyBtYWNybyBhbHdheXMgYXBwZWFycyBpbiBDeWdudXMgY29uZmlndXJlIHNjcmlwdHMuICBPdGhlciBwcm9ncmFtcwotbWF5IG9yIG1heSBub3QgdXNlIGl0LgotCi1JZiB0aGlzIG1hY3JvIGlzIHVzZWQsIHRoZSBAc2FtcHstLWVuYWJsZS1tYWludGFpbmVyLW1vZGV9IG9wdGlvbiBpcwotcmVxdWlyZWQgdG8gZW5hYmxlIGF1dG9tYXRpYyByZWJ1aWxkaW5nIG9mIGdlbmVyYXRlZCBmaWxlcyB1c2VkIGJ5IHRoZQotY29uZmlndXJlIHN5c3RlbS4gIFRoaXMgb2YgY291cnNlIHJlcXVpcmVzIHRoYXQgZGV2ZWxvcGVycyBiZSBhd2FyZSBvZiwKLWFuZCB1c2UsIHRoYXQgb3B0aW9uLgotCi1JZiB0aGlzIG1hY3JvIGlzIG5vdCB1c2VkLCB0aGVuIHRoZSBnZW5lcmF0ZWQgZmlsZXMgd2lsbCBhbHdheXMgYmUKLXJlYnVpbHQgYXV0b21hdGljYWxseS4gIFRoaXMgd2lsbCBjYXVzZSBwcm9ibGVtcyBpZiB0aGUgd3JvbmcgdmVyc2lvbnMKLW9mIGF1dG9jb25mLCBhdXRvbWFrZSwgb3Igb3RoZXJzIGFyZSBpbiB0aGUgYnVpbGRlcidzIEBzYW1we1BBVEh9LgotCi0oSWYgeW91IGFyZSBub3QgdXNpbmcgYXV0b21ha2UsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgdGhpcyBtYWNybykuCi0KLUBpdGVtIEFDX0VYRUVYVAotQGNpbmRleCBAc2FtcHtBQ19FWEVFWFR9Ci1AY2luZGV4IEBzYW1we0FNX0VYRUVYVH0KLUVpdGhlciB0aGlzIG1hY3JvIG9yIEBzYW1we0FNX0VYRUVYVH0gYWx3YXlzIGFwcGVhcnMgaW4gQ3lnbnVzIGNvbmZpZ3VyZQotZmlsZXMuICBPdGhlciBwcm9ncmFtcyBtYXkgb3IgbWF5IG5vdCB1c2Ugb25lIG9mIHRoZW0uCi0KLVRoaXMgbWFjcm8gbG9va3MgZm9yIHRoZSBleGVjdXRhYmxlIHN1ZmZpeCB1c2VkIG9uIHRoZSBob3N0IHN5c3RlbS4gIE9uCi1Vbml4IHN5c3RlbXMsIHRoaXMgaXMgdGhlIGVtcHR5IHN0cmluZy4gIE9uIFdpbmRvd3Mgc3lzdGVtcywgdGhpcyBpcwotQHNhbXB7LmV4ZX0uICBUaGlzIG1hY3JvIGRpcmVjdHMgYXV0b21ha2UgdG8gdXNlIHRoZSBleGVjdXRhYmxlIHN1ZmZpeAotYXMgYXBwcm9wcmlhdGUgd2hlbiBjcmVhdGluZyBwcm9ncmFtcy4gIFRoaXMgbWFjcm8gZG9lcyBub3QgdGFrZSBhbnkKLWFyZ3VtZW50cy4KLQotVGhlIEBzYW1we0FDX0VYRUVYVH0gZm9ybSBpcyBuZXcsIGFuZCBpcyBwYXJ0IG9mIGEgQ3lnbnVzIHBhdGNoIHRvCi1hdXRvY29uZiB0byBzdXBwb3J0IGNvbXBpbGluZyB3aXRoIFZpc3VhbCBDKysuICBPbGRlciBwcm9ncmFtcyB1c2UKLUBzYW1we0FNX0VYRUVYVH0gaW5zdGVhZC4KLQotKFByb2dyYW1zIHdoaWNoIGRvIG5vdCB1c2UgYXV0b21ha2UgdXNlIG5laXRoZXIgQHNhbXB7QUNfRVhFRVhUfSBub3IKLUBzYW1we0FNX0VYRUVYVH0pLgotCi1AaXRlbSBBQ19QUk9HX0NDCi1AY2luZGV4IEBzYW1we0FDX1BST0dfQ0N9Ci1JZiB5b3UgYXJlIHdyaXRpbmcgQyBjb2RlLCB5b3Ugd2lsbCBub3JtYWxseSB3YW50IHRvIHVzZSB0aGlzIG1hY3JvLiAgSXQKLWxvY2F0ZXMgdGhlIEMgY29tcGlsZXIgdG8gdXNlLiAgSXQgZG9lcyBub3QgdGFrZSBhbnkgYXJndW1lbnRzLgotCi1Ib3dldmVyLCBpZiB0aGlzIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBpcyBmb3IgYSBsaWJyYXJ5IHdoaWNoIGlzIHRvCi1iZSBjb21waWxlZCBieSBhIGNyb3NzIGNvbXBpbGVyIHdoaWNoIG1heSBub3QgZnVsbHkgd29yaywgdGhlbiB5b3Ugd2lsbAotbm90IHdhbnQgdG8gdXNlIEBzYW1we0FDX1BST0dfQ0N9LiAgSW5zdGVhZCwgeW91IHdpbGwgd2FudCB0byB1c2UgYQotdmFyaWFudCB3aGljaCBkb2VzIG5vdCBjYWxsIHRoZSBtYWNybyBAc2FtcHtBQ19QUk9HX0NDX1dPUktTfS4gIEV4YW1wbGVzCi1jYW4gYmUgZm91bmQgaW4gdmFyaW91cyBAZmlsZXtjb25maWd1cmUuaW59IGZpbGVzIGZvciBsaWJyYXJpZXMgdGhhdCBhcmUKLWNvbXBpbGVkIHdpdGggY3Jvc3MgY29tcGlsZXJzLCBzdWNoIGFzIGxpYmliZXJ0eSBvciBsaWJnbG9zcy4gIFRoaXMgaXMKLWVzc2VudGlhbGx5IGEgYnVnIGluIGF1dG9jb25mLCBhbmQgdGhlcmUgd2lsbCBwcm9iYWJseSBiZSBhIGJldHRlcgotd29ya2Fyb3VuZCBhdCBzb21lIHBvaW50LgotCi1AaXRlbSBBQ19QUk9HX0NYWAotQGNpbmRleCBAc2FtcHtBQ19QUk9HX0NYWH0KLUlmIHlvdSBhcmUgd3JpdGluZyBDKysgY29kZSwgeW91IHdpbGwgd2FudCB0byB1c2UgdGhpcyBtYWNyby4gIEl0Ci1sb2NhdGVzIHRoZSBDKysgY29tcGlsZXIgdG8gdXNlLiAgSXQgZG9lcyBub3QgdGFrZSBhbnkgYXJndW1lbnRzLiAgVGhlCi1zYW1lIGNyb3NzIGNvbXBpbGVyIGNvbW1lbnRzIGFwcGx5IGFzIGZvciBAc2FtcHtBQ19QUk9HX0NDfS4KLQotQGl0ZW0gQU1fUFJPR19MSUJUT09MCi1AY2luZGV4IEBzYW1we0FNX1BST0dfTElCVE9PTH0KLUlmIHlvdSB3YW50IHRvIGJ1aWxkIGxpYnJhcmllcywgYW5kIHlvdSB3YW50IHRvIHBlcm1pdCB0aGVtIHRvIGJlCi1zaGFyZWQsIG9yIHlvdSB3YW50IHRvIGxpbmsgYWdhaW5zdCBsaWJyYXJpZXMgd2hpY2ggd2VyZSBidWlsdCB1c2luZwotbGlidG9vbCwgdGhlbiB5b3Ugd2lsbCBuZWVkIHRoaXMgbWFjcm8uICBUaGlzIG1hY3JvIGlzIHJlcXVpcmVkIGluIG9yZGVyCi10byB1c2UgbGlidG9vbC4KLQotQGNpbmRleCBAc2FtcHtBTV9ESVNBQkxFX1NIQVJFRH0KLUJ5IGRlZmF1bHQsIHRoaXMgd2lsbCBjYXVzZSBhbGwgbGlicmFyaWVzIHRvIGJlIGJ1aWx0IGFzIHNoYXJlZAotbGlicmFyaWVzLiAgVG8gcHJldmVudCB0aGlzLS10byBjaGFuZ2UgdGhlIGRlZmF1bHQtLXVzZQotQHNhbXB7QU1fRElTQUJMRV9TSEFSRUR9IGJlZm9yZSBAc2FtcHtBTV9QUk9HX0xJQlRPT0x9LiAgVGhlIGNvbmZpZ3VyZQotb3B0aW9ucyBAc2FtcHstLWVuYWJsZS1zaGFyZWR9IGFuZCBAc2FtcHstLWRpc2FibGUtc2hhcmVkfSBtYXkgYmUgdXNlZAotdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYXQgYnVpbGQgdGltZS4KLQotQGl0ZW0gQUNfREVGSU5FKF9HTlVfU09VUkNFKQotQGNpbmRleCBAc2FtcHtfR05VX1NPVVJDRX0KLUdOVSBwYWNrYWdlcyBzaG91bGQgbm9ybWFsbHkgaW5jbHVkZSB0aGlzIGxpbmUgYmVmb3JlIGFueSBvdGhlciBmZWF0dXJlCi10ZXN0cy4gIFRoaXMgZGVmaW5lcyB0aGUgbWFjcm8gQHNhbXB7X0dOVV9TT1VSQ0V9IHdoZW4gY29tcGlsaW5nLCB3aGljaAotZGlyZWN0cyB0aGUgbGliYyBoZWFkZXIgZmlsZXMgdG8gcHJvdmlkZSB0aGUgc3RhbmRhcmQgR05VIHN5c3RlbQotaW50ZXJmYWNlcyBpbmNsdWRpbmcgYWxsIEdOVSBleHRlbnNpb25zLiAgSWYgdGhpcyBtYWNybyBpcyBub3QgZGVmaW5lZCwKLWNlcnRhaW4gR05VIGV4dGVuc2lvbnMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCi0KLUBpdGVtIEFDX09VVFBVVAotQGNpbmRleCBAc2FtcHtBQ19PVVRQVVR9Ci1UaGlzIG1hY3JvIHRha2VzIGEgbGlzdCBvZiBmaWxlIG5hbWVzIHdoaWNoIHRoZSBjb25maWd1cmUgcHJvY2VzcyBzaG91bGQKLXByb2R1Y2UuICBUaGlzIGlzIG5vcm1hbGx5IGEgbGlzdCBvZiBvbmUgb3IgbW9yZSBAZmlsZXtNYWtlZmlsZX0gZmlsZXMKLWluIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4gIElmIHlvdXIgcGFja2FnZSBsaXZlcyBlbnRpcmVseSBpbiBhIHNpbmdsZQotZGlyZWN0b3J5LCB5b3Ugd291bGQgdXNlIHNpbXBseSBAc2FtcHtBQ19PVVRQVVQoTWFrZWZpbGUpfS4gIElmIHlvdSBhbHNvCi1oYXZlLCBmb3IgZXhhbXBsZSwgYSBAZmlsZXtsaWJ9IHN1YmRpcmVjdG9yeSwgeW91IHdvdWxkIHVzZQotQHNhbXB7QUNfT1VUUFVUKE1ha2VmaWxlIGxpYi9NYWtlZmlsZSl9LgotQGVuZCB0YWJsZQotCi1JZiB5b3Ugd2FudCB0byB1c2UgbG9jYWxseSBkZWZpbmVkIG1hY3JvcyBpbiB5b3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0KLWZpbGUsIHRoZW4geW91IHdpbGwgbmVlZCB0byB3cml0ZSBhIEBmaWxle2FjaW5jbHVkZS5tNH0gZmlsZSB3aGljaAotZGVmaW5lcyB0aGVtIChpZiBub3QgdXNpbmcgYXV0b21ha2UsIHRoaXMgZmlsZSBpcyBjYWxsZWQKLUBmaWxle2FjbG9jYWwubTR9KS4gIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gcHV0IHNlcGFyYXRlIG1hY3JvcyBpbiBhbgotQGZpbGV7bTR9IHN1YmRpcmVjdG9yeSwgYW5kIHB1dCBAc2FtcHtBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNH0gaW4geW91cgotQGZpbGV7TWFrZWZpbGUuYW19IGZpbGUgc28gdGhhdCB0aGUgQHNhbXB7YWNsb2NhbH0gcHJvZ3JhbSB3aWxsIGJlIGFibGUKLXRvIGZpbmQgdGhlbS4KLQotVGhlIGRpZmZlcmVudCBtYWNybyBwcmVmaXhlcyBpbmRpY2F0ZSB3aGljaCB0b29sIGRlZmluZXMgdGhlIG1hY3JvLgotTWFjcm9zIHdoaWNoIHN0YXJ0IHdpdGggQHNhbXB7QUNffSBhcmUgcGFydCBvZiBhdXRvY29uZi4gIE1hY3JvcyB3aGljaAotc3RhcnQgd2l0aCBAc2FtcHtBTV99IGFyZSBwcm92aWRlZCBieSBhdXRvbWFrZSBvciBsaWJ0b29sLgotCi1Abm9kZSBXcml0ZSBNYWtlZmlsZS5hbQotQHNlY3Rpb24gV3JpdGUgTWFrZWZpbGUuYW0KLUBjaW5kZXggQGZpbGV7TWFrZWZpbGUuYW19LCB3cml0aW5nCi0KLVlvdSBtdXN0IHdyaXRlIHRoZSBmaWxlIEBmaWxle01ha2VmaWxlLmFtfS4gIFRoaXMgaXMgYW4gYXV0b21ha2UgaW5wdXQKLWZpbGUsIGFuZCB0aGUgYXV0b21ha2UgbWFudWFsIGRlc2NyaWJlcyBpbiBkZXRhaWwgd2hhdCB0aGlzIGZpbGUgc2hvdWxkCi1sb29rIGxpa2UuCi0KLVRoZSBhdXRvbWFrZSBjb21tYW5kcyBpbiBAZmlsZXtNYWtlZmlsZS5hbX0gbW9zdGx5IGxvb2sgbGlrZSB2YXJpYWJsZQotYXNzaWdubWVudHMgaW4gYSBAZmlsZXtNYWtlZmlsZX0uICBhdXRvbWFrZSByZWNvZ25pemVzIHNwZWNpYWwgdmFyaWFibGUKLW5hbWVzLCBhbmQgYXV0b21hdGljYWxseSBhZGQgbWFrZSBydWxlcyB0byB0aGUgb3V0cHV0IGFzIG5lZWRlZC4KLQotVGhlcmUgd2lsbCBiZSBvbmUgQGZpbGV7TWFrZWZpbGUuYW19IGZpbGUgZm9yIGVhY2ggZGlyZWN0b3J5IGluIHlvdXIKLXBhY2thZ2UuICBGb3IgZWFjaCBkaXJlY3Rvcnkgd2l0aCBzdWJkaXJlY3RvcmllcywgdGhlIEBmaWxle01ha2VmaWxlLmFtfQotZmlsZSBzaG91bGQgY29udGFpbiB0aGUgbGluZQotQHNtYWxsZXhhbXBsZQotU1VCRElSUyA9IEB2YXJ7ZGlyfSBAdmFye2Rpcn0gQGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotd2hlcmUgZWFjaCBAdmFye2Rpcn0gaXMgdGhlIG5hbWUgb2YgYSBzdWJkaXJlY3RvcnkuCi0KLUZvciBlYWNoIEBmaWxle01ha2VmaWxlLmFtfSwgdGhlcmUgc2hvdWxkIGJlIGEgY29ycmVzcG9uZGluZwotQGZpbGV7TWFrZWZpbGV9IGluIHRoZSBAc2FtcHtBQ19PVVRQVVR9IG1hY3JvIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0uCi0KLUV2ZXJ5IEBmaWxle01ha2VmaWxlLmFtfSB3cml0dGVuIGF0IEN5Z251cyBzaG91bGQgY29udGFpbiB0aGUgbGluZQotQHNtYWxsZXhhbXBsZQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhpcyBwdXRzIGF1dG9tYWtlIGludG8gQ3lnbnVzIG1vZGUuICBTZWUgdGhlIGF1dG9tYWtlIG1hbnVhbCBmb3IKLWRldGFpbHMuCi0KLVlvdSBtYXkgdG8gaW5jbHVkZSB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQHNhbXB7YXV0b21ha2V9IHRoYXQgeW91IGFyZQotdXNpbmcgb24gdGhlIEBzYW1we0FVVE9NQUtFX09QVElPTlN9IGxpbmUuICBGb3IgZXhhbXBsZSwKLUBzbWFsbGV4YW1wbGUKLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgMS4zCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIHdpbGwgcHJldmVudCB1c2VycyBmcm9tIHJ1bm5pbmcgYW4gZWFybGllciB2ZXJzaW9uIG9mCi1Ac2FtcHthdXRvbWFrZX0gYW5kIHBlcmhhcHMgZ2V0dGluZyBhbiBpbnZhbGlkIEBmaWxle01ha2VmaWxlLmlufS4KLQotSWYgeW91ciBwYWNrYWdlIGJ1aWxkcyBhIHByb2dyYW0sIHRoZW4gaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGF0Ci1wcm9ncmFtIGlzIGJ1aWx0IHlvdSB3aWxsIG5vcm1hbGx5IHdhbnQgYSBsaW5lIGxpa2UKLUBzbWFsbGV4YW1wbGUKLWJpbl9QUk9HUkFNUyA9IEB2YXJ7cHJvZ3JhbX0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdoZXJlIEB2YXJ7cHJvZ3JhbX0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0uICBZb3Ugd2lsbCB0aGVuIHdhbnQgYQotbGluZSBsaWtlCi1Ac21hbGxleGFtcGxlCi1AdmFye3Byb2dyYW19X1NPVVJDRVMgPSBAdmFye2ZpbGV9IEB2YXJ7ZmlsZX0gQGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotd2hlcmUgZWFjaCBAdmFye2ZpbGV9IGlzIHRoZSBuYW1lIG9mIGEgc291cmNlIGZpbGUgdG8gbGluayBpbnRvIHRoZQotcHJvZ3JhbSAoZS5nLiwgQHNhbXB7Zm9vLmN9KS4KLQotSWYgeW91ciBwYWNrYWdlIGJ1aWxkcyBhIGxpYnJhcnksIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGxpYnJhcnkgdG8KLWV2ZXIgYmUgYnVpbHQgYXMgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoYXQKLWxpYnJhcnkgaXMgYnVpbHQgeW91IHdpbGwgbm9ybWFsbHkgd2FudCBhIGxpbmUgbGlrZQotQHNtYWxsZXhhbXBsZQotbGliX0xJQlJBUklFUyA9IGxpYkB2YXJ7bmFtZX0uYQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotd2hlcmUgQHNhbXB7bGliQHZhcntuYW1lfS5hfSBpcyB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeS4gIFlvdSB3aWxsIHRoZW4KLXdhbnQgYSBsaW5lIGxpa2UKLUBzbWFsbGV4YW1wbGUKLWxpYkB2YXJ7bmFtZX1fYV9TT1VSQ0VTID0gQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdoZXJlIGVhY2ggQHZhcntmaWxlfSBpcyB0aGUgbmFtZSBvZiBhIHNvdXJjZSBmaWxlIHRvIGFkZCB0byB0aGUKLWxpYnJhcnkuCi0KLUlmIHlvdXIgcGFja2FnZSBidWlsZHMgYSBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgdG8gcGVybWl0IGJ1aWxkaW5nIHRoZQotbGlicmFyeSBhcyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhhdCBsaWJyYXJ5IGlzCi1idWlsdCB5b3Ugd2lsbCBub3JtYWxseSB3YW50IGEgbGluZSBsaWtlCi1Ac21hbGxleGFtcGxlCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJAdmFye25hbWV9LmxhCi1AZW5kIHNtYWxsZXhhbXBsZQotVGhlIHVzZSBvZiBAc2FtcHtMVExJQlJBUklFU30sIGFuZCB0aGUgQHNhbXB7LmxhfSBleHRlbnNpb24sIGluZGljYXRlIGEKLWxpYnJhcnkgdG8gYmUgYnVpbHQgdXNpbmcgbGlidG9vbC4gIEFzIHVzdWFsLCB5b3Ugd2lsbCB0aGVuIHdhbnQgYSBsaW5lCi1saWtlCi1Ac21hbGxleGFtcGxlCi1saWJAdmFye25hbWV9X2xhX1NPVVJDRVMgPSBAdmFye2ZpbGV9IEB2YXJ7ZmlsZX0gQGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIHN0cmluZ3MgQHNhbXB7YmlufSBhbmQgQHNhbXB7bGlifSB0aGF0IGFwcGVhciBhYm92ZSBpbgotQHNhbXB7YmluX1BST0dSQU1TfSBhbmQgQHNhbXB7bGliX0xJQlJBUklFU30gYXJlIG5vdCBhcmJpdHJhcnkuICBUaGV5Ci1yZWZlciB0byBwYXJ0aWN1bGFyIGRpcmVjdG9yaWVzLCB3aGljaCBtYXkgYmUgc2V0IGJ5IHRoZSBAc2FtcHstLWJpbmRpcn0KLWFuZCBAc2FtcHstLWxpYmRpcn0gb3B0aW9ucyB0byBAZmlsZXtjb25maWd1cmV9LiAgSWYgdGhvc2Ugb3B0aW9ucyBhcmUKLW5vdCB1c2VkLCB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIGJhc2VkIG9uIHRoZSBAc2FtcHstLXByZWZpeH0gb3IKLUBzYW1wey0tZXhlYy1wcmVmaXh9IG9wdGlvbnMgdG8gQGZpbGV7Y29uZmlndXJlfS4gIEl0IGlzIHBvc3NpYmxlIHRvIHVzZQotb3RoZXIgbmFtZXMgaWYgdGhlIHByb2dyYW0gb3IgbGlicmFyeSBzaG91bGQgYmUgaW5zdGFsbGVkIGluIHNvbWUgb3RoZXIKLWRpcmVjdG9yeS4KLQotVGhlIEBmaWxle01ha2VmaWxlLmFtfSBmaWxlIG1heSBhbHNvIGNvbnRhaW4gYWxtb3N0IGFueXRoaW5nIHRoYXQgbWF5Ci1hcHBlYXIgaW4gYSBub3JtYWwgQGZpbGV7TWFrZWZpbGV9LiAgYXV0b21ha2UgYWxzbyBzdXBwb3J0cyBtYW55IG90aGVyCi1zcGVjaWFsIHZhcmlhYmxlcywgYXMgd2VsbCBhcyBjb25kaXRpb25hbHMuCi0KLVNlZSB0aGUgYXV0b21ha2UgbWFudWFsIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1Abm9kZSBXcml0ZSBhY2NvbmZpZy5oCi1Ac2VjdGlvbiBXcml0ZSBhY2NvbmZpZy5oCi1AY2luZGV4IEBmaWxle2FjY29uZmlnLmh9LCB3cml0aW5nCi0KLUlmIHlvdSBhcmUgZ2VuZXJhdGluZyBhIHBvcnRhYmlsaXR5IGhlYWRlciBmaWxlLCAoaS5lLiwgeW91IGFyZSB1c2luZwotQHNhbXB7QU1fQ09ORklHX0hFQURFUn0gaW4gQGZpbGV7Y29uZmlndXJlLmlufSksIHRoZW4geW91IHdpbGwgaGF2ZSB0bwotd3JpdGUgYSBAZmlsZXthY2NvbmZpZy5ofSBmaWxlLiAgSXQgd2lsbCBoYXZlIHRvIGNvbnRhaW4gdGhlIGZvbGxvd2luZwotbGluZXMuCi0KLUBzbWFsbGV4YW1wbGUKLS8qIE5hbWUgb2YgcGFja2FnZS4gICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG9mIHBhY2thZ2UuICAqLwotI3VuZGVmIFZFUlNJT04KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoaXMgcmVxdWlyZW1lbnQgaXMgcmVhbGx5IGEgYnVnIGluIHRoZSBzeXN0ZW0sIGFuZCB0aGUgcmVxdWlyZW1lbnQgbWF5Ci1iZSBlbGltaW5hdGVkIGF0IHNvbWUgbGF0ZXIgZGF0ZS4KLQotVGhlIEBmaWxle2FjY29uZmlnLmh9IGZpbGUgd2lsbCBhbHNvIHNpbWlsYXIgY29tbWVudCBhbmQgQHNhbXB7I3VuZGVmfQotbGluZXMgZm9yIGFueSB1bnVzdWFsIG1hY3JvcyBpbiB0aGUgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlLCBpbmNsdWRpbmcKLWFueSBtYWNybyB3aGljaCBhcHBlYXJzIGluIGEgQHNhbXB7QUNfREVGSU5FfSBtYWNyby4KLQotSW4gcGFydGljdWxhciwgaWYgeW91IGFyZSB3cml0aW5nIGEgR05VIHBhY2thZ2UgYW5kIHRoZXJlZm9yZSBpbmNsdWRlCi1Ac2FtcHtBQ19ERUZJTkUoX0dOVV9TT1VSQ0UpfSBpbiBAZmlsZXtjb25maWd1cmUuaW59IGFzIHN1Z2dlc3RlZCBhYm92ZSwKLXlvdSB3aWxsIG5lZWQgbGluZXMgbGlrZSB0aGlzIGluIEBmaWxle2FjY29uZmlnLmh9OgotQHNtYWxsZXhhbXBsZQotLyogRW5hYmxlIEdOVSBleHRlbnNpb25zLiAgKi8KLSN1bmRlZiBfR05VX1NPVVJDRQotQGVuZCBzbWFsbGV4YW1wbGUKLQotTm9ybWFsbHkgdGhlIEBzYW1we2F1dG9oZWFkZXJ9IHByb2dyYW0gd2lsbCBpbmZvcm0geW91IG9mIGFueSBzdWNoCi1yZXF1aXJlbWVudHMgYnkgcHJpbnRpbmcgYW4gZXJyb3IgbWVzc2FnZSB3aGVuIGl0IGlzIHJ1bi4gIEhvd2V2ZXIsIGlmCi15b3UgZG8gYW55dGhpbmcgcGFydGljdWxhciBvZGQgaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUsIHlvdQotd2lsbCBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSByaWdodCBlbnRyaWVzIGFwcGVhciBpbgotQGZpbGV7YWNjb25maWcuaH0sIHNpbmNlIG90aGVyd2lzZSB0aGUgcmVzdWx0cyBvZiB0aGUgdGVzdHMgbWF5IG5vdCBiZQotYXZhaWxhYmxlIGluIHRoZSBAZmlsZXtjb25maWcuaH0gZmlsZSB3aGljaCB5b3VyIGNvZGUgd2lsbCB1c2UuCi0KLShUaGVlIEBzYW1we1BBQ0tBR0V9IGFuZCBAc2FtcHtWRVJTSU9OfSBsaW5lcyBhcmUgbm90IHJlcXVpcmVkIGlmIHlvdQotYXJlIG5vdCB1c2luZyBhdXRvbWFrZSwgYW5kIGluIHRoYXQgY2FzZSB5b3UgbWF5IG5vdCBuZWVkIGEKLUBmaWxle2FjY29uZmlnLmh9IGZpbGUgYXQgYWxsKS4KLQotQG5vZGUgR2VuZXJhdGUgZmlsZXMKLUBzZWN0aW9uIEdlbmVyYXRlIGZpbGVzCi0KLU9uY2UgeW91IGhhdmUgd3JpdHRlbiBAZmlsZXtjb25maWd1cmUuaW59LCBAZmlsZXtNYWtlZmlsZS5hbX0sCi1AZmlsZXthY2NvbmZpZy5ofSwgYW5kIHBvc3NpYmx5IEBmaWxle2FjaW5jbHVkZS5tNH0sIHlvdSBtdXN0IHVzZQotYXV0b2NvbmYgYW5kIGF1dG9tYWtlIHByb2dyYW1zIHRvIHByb2R1Y2UgdGhlIGZpcnN0IHZlcnNpb25zIG9mIHRoZQotZ2VuZXJhdGVkIGZpbGVzLiAgVGhpcyBpcyBkb25lIGJ5IGV4ZWN1dGluZyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIG9mCi1jb21tYW5kcy4KLQotQHNtYWxsZXhhbXBsZQotYWNsb2NhbAotYXV0b2NvbmYKLWF1dG9oZWFkZXIKLWF1dG9tYWtlCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQHNhbXB7YWNsb2NhbH0gYW5kIEBzYW1we2F1dG9tYWtlfSBjb21tYW5kcyBhcmUgcGFydCBvZiB0aGUgYXV0b21ha2UKLXBhY2thZ2UsIGFuZCB0aGUgQHNhbXB7YXV0b2NvbmZ9IGFuZCBAc2FtcHthdXRvaGVhZGVyfSBjb21tYW5kcyBhcmUgcGFydAotb2YgdGhlIGF1dG9jb25mIHBhY2thZ2UuCi0KLUlmIHlvdSBhcmUgdXNpbmcgYSBAZmlsZXttNH0gc3ViZGlyZWN0b3J5IGZvciB5b3VyIG1hY3JvcywgeW91IHdpbGwgbmVlZAotdG8gdXNlIHRoZSBAc2FtcHstSSBtNH0gb3B0aW9uIHdoZW4geW91IHJ1biBAc2FtcHthY2xvY2FsfS4KLQotSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIEN5Z251cyB0cmVlLCB1c2UgdGhlIEBzYW1wey1hfSBvcHRpb24gd2hlbgotcnVubmluZyBAc2FtcHthdXRvbWFrZX0gY29tbWFuZCBpbiBvcmRlciB0byBjb3B5IHRoZSByZXF1aXJlZCBzdXBwb3J0Ci1maWxlcyBpbnRvIHlvdXIgc291cmNlIGRpcmVjdG9yeS4KLQotSWYgeW91IGFyZSB1c2luZyBsaWJ0b29sLCB5b3UgbXVzdCBidWlsZCBhbmQgaW5zdGFsbCB0aGUgbGlidG9vbCBwYWNrYWdlCi13aXRoIHRoZSBzYW1lIEBzYW1wey0tcHJlZml4fSBhbmQgQHNhbXB7LS1leGVjLXByZWZpeH0gb3B0aW9ucyBhcyB5b3UKLXVzZWQgd2l0aCB0aGUgYXV0b2NvbmYgYW5kIGF1dG9tYWtlIHBhY2thZ2VzLiAgWW91IG11c3QgZG8gdGhpcyBiZWZvcmUKLXJ1bm5pbmcgYW55IG9mIHRoZSBhYm92ZSBjb21tYW5kcy4gIElmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBDeWdudXMKLXRyZWUsIHlvdSB3aWxsIG5lZWQgdG8gcnVuIHRoZSBAc2FtcHtsaWJ0b29saXplfSBwcm9ncmFtIHRvIGNvcHkgdGhlCi1saWJ0b29sIHN1cHBvcnQgZmlsZXMgaW50byB5b3VyIGRpcmVjdG9yeS4KLQotT25jZSB5b3UgaGF2ZSBtYW5hZ2VkIHRvIHJ1biB0aGVzZSBjb21tYW5kcyB3aXRob3V0IGdldHRpbmcgYW55IGVycm9ycywKLXlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGVtcHR5IGRpcmVjdG9yeSwgYW5kIHJ1biB0aGUgQHNhbXB7Y29uZmlndXJlfQotc2NyaXB0IHdoaWNoIHdpbGwgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgQHNhbXB7YXV0b2NvbmZ9IHdpdGggdGhlCi1Ac2FtcHstLWVuYWJsZS1tYWludGFpbmVyLW1vZGV9IG9wdGlvbi4gIFRoaXMgd2lsbCBnaXZlIHlvdSBhIHNldCBvZgotTWFrZWZpbGVzIHdoaWNoIHdpbGwgaW5jbHVkZSBydWxlcyB0byBhdXRvbWF0aWNhbGx5IHJlYnVpbGQgYWxsIHRoZQotZ2VuZXJhdGVkIGZpbGVzLgotCi1BZnRlciBkb2luZyB0aGF0LCB3aGVuZXZlciB5b3UgaGF2ZSBjaGFuZ2VkIHNvbWUgb2YgdGhlIGlucHV0IGZpbGVzIGFuZAotd2FudCB0byByZWdlbmVyYXRlZCB0aGUgb3RoZXIgZmlsZXMsIGdvIHRvIHlvdXIgb2JqZWN0IGRpcmVjdG9yeSBhbmQgcnVuCi1Ac2FtcHttYWtlfS4gIERvaW5nIHRoaXMgaXMgbW9yZSByZWxpYWJsZSB0aGFuIHRyeWluZyB0byByZWJ1aWxkIHRoZQotZmlsZXMgbWFudWFsbHksIGJlY2F1c2UgdGhlcmUgYXJlIGNvbXBsZXggb3JkZXIgZGVwZW5kZW5jaWVzIGFuZCBpdCBpcwotZWFzeSB0byBmb3JnZXQgc29tZXRoaW5nLgotCi1Abm9kZSBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZQotQHNlY3Rpb24gRXhhbXBsZQotCi1MZXQncyBjb25zaWRlciBhIHRyaXZpYWwgZXhhbXBsZS4KLQotU3VwcG9zZSB3ZSB3YW50IHRvIHdyaXRlIGEgc2ltcGxlIHZlcnNpb24gb2YgQHNhbXB7dG91Y2h9LiAgT3VyIHByb2dyYW0sCi13aGljaCB3ZSB3aWxsIGNhbGwgQHNhbXB7cG9rZX0sIHdpbGwgdGFrZSBhIHNpbmdsZSBmaWxlIG5hbWUgYXJndW1lbnQsCi1hbmQgdXNlIHRoZSBAc2FtcHt1dGltZX0gc3lzdGVtIGNhbGwgdG8gc2V0IHRoZSBtb2RpZmljYXRpb24gYW5kIGFjY2VzcwotdGltZXMgb2YgdGhlIGZpbGUgdG8gdGhlIGN1cnJlbnQgdGltZS4gIFdlIHdhbnQgdGhpcyBwcm9ncmFtIHRvIGJlCi1oaWdobHkgcG9ydGFibGUuCi0KLVdlJ2xsIGZpcnN0IHNlZSB3aGF0IHRoaXMgbG9va3MgbGlrZSB3aXRob3V0IHVzaW5nIGF1dG9jb25mIGFuZAotYXV0b21ha2UsIGFuZCB0aGVuIHNlZSB3aGF0IGl0IGxvb2tzIGxpa2Ugd2l0aCB0aGVtLgotCi1AbWVudQotKiBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZSAxOjoJCUZpcnN0IFRyeS4KLSogR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMjo6CQlTZWNvbmQgVHJ5LgotKiBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZSAzOjoJCVRoaXJkIFRyeS4KLSogR2VuZXJhdGUgRmlsZXMgaW4gRXhhbXBsZTo6CQlHZW5lcmF0ZSBGaWxlcy4KLUBlbmQgbWVudQotCi1Abm9kZSBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZSAxCi1Ac3Vic2VjdGlvbiBGaXJzdCBUcnkKLQotSGVyZSBpcyBvdXIgZmlyc3QgdHJ5IGF0IEBzYW1we3Bva2UuY30uICBOb3RlIHRoYXQgd2UndmUgd3JpdHRlbiBpdAotd2l0aG91dCBBTlNJL0lTTyBDIHByb3RvdHlwZXMsIHNpbmNlIHdlIHdhbnQgaXQgdG8gYmUgaGlnaGx5IHBvcnRhYmxlLgotCi1AZXhhbXBsZQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbWUuaD4KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci1AewotICBpZiAoYXJnYyAhPSAyKQotICAgIEB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogcG9rZSBmaWxlXG4iKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIEB9Ci0KLSAgaWYgKHV0aW1lIChhcmd2WzFdLCBOVUxMKSA8IDApCi0gICAgQHsKLSAgICAgIHBlcnJvciAoInV0aW1lIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICBAfQotCi0gIGV4aXQgKDApOwotQH0KLUBlbmQgZXhhbXBsZQotCi1XZSBhbHNvIHdyaXRlIGEgc2ltcGxlIEBmaWxle01ha2VmaWxlfS4KLQotQGV4YW1wbGUKLUNDID0gZ2NjCi1DRkxBR1MgPSAtZyAtTzIKLQotYWxsOiBwb2tlCi0KLXBva2U6IHBva2UubwotCSQoQ0MpIC1vIHBva2UgJChDRkxBR1MpICQoTERGTEFHUykgcG9rZS5vCi1AZW5kIGV4YW1wbGUKLQotU28gZmFyLCBzbyBnb29kLgotCi1VbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgYSBmZXcgcHJvYmxlbXMuCi0KLU9uIG9sZGVyIFVuaXggc3lzdGVtcyBkZXJpdmVkIGZyb20gQlNEIDQuMywgdGhlIEBzYW1we3V0aW1lfSBzeXN0ZW0gY2FsbAotZG9lcyBub3QgYWNjZXB0IGEgc2Vjb25kIGFyZ3VtZW50IG9mIEBzYW1we05VTEx9LiAgT24gdGhvc2Ugc3lzdGVtcywgd2UKLW5lZWQgdG8gcGFzcyBhIHBvaW50ZXIgdG8gQHNhbXB7c3RydWN0IHV0aW1idWZ9IHN0cnVjdHVyZS4KLVVuZm9ydHVuYXRlbHksIGV2ZW4gb2xkZXIgc3lzdGVtcyBkb24ndCBkZWZpbmUgdGhhdCBzdHJ1Y3R1cmU7IG9uIHRob3NlCi1zeXN0ZW1zLCB3ZSBuZWVkIHRvIHBhc3MgYW4gYXJyYXkgb2YgdHdvIEBzYW1we2xvbmd9IHZhbHVlcy4KLQotVGhlIGhlYWRlciBmaWxlIEBmaWxle3N0ZGxpYi5ofSB3YXMgaW52ZW50ZWQgYnkgQU5TSSBDLCBhbmQgb2xkZXIKLXN5c3RlbXMgZG9uJ3QgaGF2ZSBhIGNvcHkuICBXZSBpbmNsdWRlZCBpdCBhYm92ZSB0byBnZXQgYSBkZWNsYXJhdGlvbiBvZgotQHNhbXB7ZXhpdH0uCi0KLVdlIGNhbiBmaW5kIHNvbWUgb2YgdGhlc2UgcG9ydGFiaWxpdHkgcHJvYmxlbXMgYnkgcnVubmluZwotQHNhbXB7YXV0b3NjYW59LCB3aGljaCB3aWxsIGNyZWF0ZSBhIEBmaWxle2NvbmZpZ3VyZS5zY2FufSBmaWxlIHdoaWNoIHdlCi1jYW4gdXNlIGFzIGEgcHJvdG90eXBlIGZvciBvdXIgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlLiAgSSB3b24ndCBzaG93Ci10aGUgb3V0cHV0LCBidXQgaXQgd2lsbCBub3RpY2UgdGhlIHBvdGVudGlhbCBwcm9ibGVtcyB3aXRoIEBzYW1we3V0aW1lfQotYW5kIEBmaWxle3N0ZGxpYi5ofS4KLQotSW4gb3VyIEBmaWxle01ha2VmaWxlfSwgd2UgZG9uJ3QgcHJvdmlkZSBhbnkgd2F5IHRvIGluc3RhbGwgdGhlIHByb2dyYW0uCi1UaGlzIGRvZXNuJ3QgbWF0dGVyIG11Y2ggZm9yIHN1Y2ggYSBzaW1wbGUgZXhhbXBsZSwgYnV0IGEgcmVhbCBwcm9ncmFtCi13aWxsIG5lZWQgYW4gQHNhbXB7aW5zdGFsbH0gdGFyZ2V0LiAgRm9yIHRoYXQgbWF0dGVyLCB3ZSB3aWxsIGFsc28gd2FudAotYSBAc2FtcHtjbGVhbn0gdGFyZ2V0LgotCi1Abm9kZSBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZSAyCi1Ac3Vic2VjdGlvbiBTZWNvbmQgVHJ5Ci0KLUhlcmUgaXMgb3VyIHNlY29uZCB0cnkgYXQgdGhpcyBwcm9ncmFtLgotCi1XZSBtb2RpZnkgQGZpbGV7cG9rZS5jfSB0byB1c2UgcHJlcHJvY2Vzc29yIG1hY3JvcyB0byBjb250cm9sIHdoYXQKLWZlYXR1cmVzIGFyZSBhdmFpbGFibGUuICAoSSd2ZSBjaGVhdGVkIGEgYml0IGJ5IHVzaW5nIHRoZSBzYW1lIG1hY3JvCi1uYW1lcyB3aGljaCBhdXRvY29uZiB3aWxsIHVzZSkuCi0KLUBleGFtcGxlCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmZGVmIEhBVkVfVVRJTUVfSAotI2luY2x1ZGUgPHV0aW1lLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1VUSU1FX05VTEwKLQotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2lmbmRlZiBIQVZFX1NUUlVDVF9VVElNQlVGCi0KLXN0cnVjdCB1dGltYnVmCi1AewotICBsb25nIGFjdGltZTsKLSAgbG9uZyBtb2R0aW1lOwotQH07Ci0KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci11dGltZV9ub3cgKGZpbGUpCi0gICAgIGNoYXIgKmZpbGU7Ci1AewotICBzdHJ1Y3QgdXRpbWJ1ZiBub3c7Ci0KLSAgbm93LmFjdGltZSA9IG5vdy5tb2R0aW1lID0gdGltZSAoTlVMTCk7Ci0gIHJldHVybiB1dGltZSAoZmlsZSwgJm5vdyk7Ci1AfQotCi0jZGVmaW5lIHV0aW1lKGYsIHApIHV0aW1lX25vdyAoZikKLQotI2VuZGlmIC8qIEhBVkVfVVRJTUVfTlVMTCAgKi8KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci1AewotICBpZiAoYXJnYyAhPSAyKQotICAgIEB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogcG9rZSBmaWxlXG4iKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIEB9Ci0KLSAgaWYgKHV0aW1lIChhcmd2WzFdLCBOVUxMKSA8IDApCi0gICAgQHsKLSAgICAgIHBlcnJvciAoInV0aW1lIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICBAfQotCi0gIGV4aXQgKDApOwotQH0KLUBlbmQgZXhhbXBsZQotCi1IZXJlIGlzIHRoZSBhc3NvY2lhdGVkIEBmaWxle01ha2VmaWxlfS4gIFdlJ3ZlIGFkZGVkIHN1cHBvcnQgZm9yIHRoZQotcHJlcHJvY2Vzc29yIGZsYWdzIHdlIHVzZS4gIFdlJ3ZlIGFsc28gYWRkZWQgQHNhbXB7aW5zdGFsbH0gYW5kCi1Ac2FtcHtjbGVhbn0gdGFyZ2V0cy4KLQotQGV4YW1wbGUKLSMgU2V0IHRoaXMgdG8geW91ciBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotYmluZGlyID0gL3Vzci9sb2NhbC9iaW4KLQotIyBVbmNvbW1lbnQgdGhpcyBpZiB5b3UgaGF2ZSB0aGUgc3RhbmRhcmQgQU5TSS9JU08gQyBoZWFkZXIgZmlsZXMuCi0jIFNURENfSERSUyA9IC1EU1REQ19IRUFERVJTCi0KLSMgVW5jb21tZW50IHRoaXMgaWYgeW91IGhhdmUgdXRpbWUuaC4KLSMgVVRJTUVfSCA9IC1ESEFWRV9VVElNRV9ICi0KLSMgVW5jb21tZW50IHRoaXMgaWYgdXRpbWUgKEZJTEUsIE5VTEwpIHdvcmtzIG9uIHlvdXIgc3lzdGVtLgotIyBVVElNRV9OVUxMID0gLURIQVZFX1VUSU1FX05VTEwKLQotIyBVbmNvbW1lbnQgdGhpcyBpZiBzdHJ1Y3QgdXRpbWJ1ZiBpcyBkZWZpbmVkIGluIHV0aW1lLmguCi0jIFVUSU1CVUYgPSAtREhBVkVfU1RSVUNUX1VUSU1CVUYKLQotQ0MgPSBnY2MKLUNGTEFHUyA9IC1nIC1PMgotCi1BTExfQ0ZMQUdTID0gJChTVERDX0hEUlMpICQoVVRJTUVfSCkgJChVVElNRV9OVUxMKSAkKFVUSU1CVUYpICQoQ0ZMQUdTKQotCi1hbGw6IHBva2UKLQotcG9rZTogcG9rZS5vCi0JJChDQykgLW8gcG9rZSAkKEFMTF9DRkxBR1MpICQoTERGTEFHUykgcG9rZS5vCi0KLS5jLm86Ci0JJChDQykgLWMgJChBTExfQ0ZMQUdTKSBwb2tlLmMKLQotaW5zdGFsbDogcG9rZQotCWNwIHBva2UgJChiaW5kaXIpL3Bva2UKLQotY2xlYW46Ci0Jcm0gcG9rZSBwb2tlLm8KLUBlbmQgZXhhbXBsZQotCi1Tb21lIHByb2JsZW1zIHdpdGggdGhpcyBhcHByb2FjaCBzaG91bGQgYmUgY2xlYXIuCi0KLVVzZXJzIHdobyB3YW50IHRvIGNvbXBpbGUgcG9rZSB3aWxsIGhhdmUgdG8ga25vdyBob3cgQHNhbXB7dXRpbWV9IHdvcmtzCi1vbiB0aGVpciBzeXN0ZW1zLCBzbyB0aGF0IHRoZXkgY2FuIHVuY29tbWVudCB0aGUgQGZpbGV7TWFrZWZpbGV9Ci1jb3JyZWN0bHkuCi0KLVRoZSBpbnN0YWxsYXRpb24gaXMgZG9uZSB1c2luZyBAc2FtcHtjcH0sIGJ1dCBtYW55IHN5c3RlbXMgaGF2ZSBhbgotQHNhbXB7aW5zdGFsbH0gcHJvZ3JhbSB3aGljaCBtYXkgYmUgdXNlZCwgYW5kIHdoaWNoIHN1cHBvcnRzIG9wdGlvbmFsCi1mZWF0dXJlcyBzdWNoIGFzIHN0cmlwcGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb3V0IG9mIHRoZSBpbnN0YWxsZWQKLWJpbmFyeS4KLQotVGhlIHVzZSBvZiBAZmlsZXtNYWtlZmlsZX0gdmFyaWFibGVzIGxpa2UgQHNhbXB7Q0N9LCBAc2FtcHtDRkxBR1N9IGFuZAotQHNhbXB7TERGTEFHU30gZm9sbG93cyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBHTlUgc3RhbmRhcmRzLiAgVGhpcyBpcwotY29udmVuaWVudCBmb3IgYWxsIHBhY2thZ2VzLCBzaW5jZSBpdCByZWR1Y2VzIHN1cnByaXNlcyBmb3IgdXNlcnMuCi1Ib3dldmVyLCBpdCBpcyBlYXN5IHRvIGdldCB0aGUgZGV0YWlscyB3cm9uZywgYW5kIHdpbmQgdXAgd2l0aCBhCi1zbGlnaHRseSBub25zdGFuZGFyZCBkaXN0cmlidXRpb24uCi0KLUBub2RlIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlIDMKLUBzdWJzZWN0aW9uIFRoaXJkIFRyeQotCi1Gb3Igb3VyIHRoaXJkIHRyeSBhdCB0aGlzIHByb2dyYW0sIHdlIHdpbGwgd3JpdGUgYSBAZmlsZXtjb25maWd1cmUuaW59Ci1zY3JpcHQgdG8gZGlzY292ZXIgdGhlIGNvbmZpZ3VyYXRpb24gZmVhdHVyZXMgb24gdGhlIGhvc3Qgc3lzdGVtLCByYXRoZXIKLXRoYW4gcmVxdWlyaW5nIHRoZSB1c2VyIHRvIGVkaXQgdGhlIEBmaWxle01ha2VmaWxlfS4gIFdlIHdpbGwgYWxzbyB3cml0ZQotYSBAZmlsZXtNYWtlZmlsZS5hbX0gcmF0aGVyIHRoYW4gYSBAZmlsZXtNYWtlZmlsZX0uCi0KLVRoZSBvbmx5IGNoYW5nZSB0byBAZmlsZXtwb2tlLmN9IGlzIHRvIGFkZCBhIGxpbmUgYXQgdGhlIHN0YXJ0IG9mIHRoZQotZmlsZToKLUBzbWFsbGV4YW1wbGUKLSNpbmNsdWRlICJjb25maWcuaCIKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBuZXcgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIGlzIGFzIGZvbGxvd3MuCi0KLUBleGFtcGxlCi1BQ19JTklUKHBva2UuYykKLUFNX0lOSVRfQVVUT01BS0UocG9rZSwgMS4wKQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi1BQ19QUk9HX0NDCi1BQ19IRUFERVJfU1REQwotQUNfQ0hFQ0tfSEVBREVSUyh1dGltZS5oKQotQUNfRUdSRVBfSEVBREVSKHV0aW1idWYsIHV0aW1lLmgsIEFDX0RFRklORShIQVZFX1NUUlVDVF9VVElNQlVGKSkKLUFDX0ZVTkNfVVRJTUVfTlVMTAotQUNfT1VUUFVUKE1ha2VmaWxlKQotQGVuZCBleGFtcGxlCi0KLVRoZSBmaXJzdCBmb3VyIG1hY3JvcyBpbiB0aGlzIGZpbGUsIGFuZCB0aGUgbGFzdCBvbmUsIHdlcmUgZGVzY3JpYmVkCi1hYm92ZTsgc2VlIEByZWZ7V3JpdGUgY29uZmlndXJlLmlufS4gIElmIHdlIG9taXQgdGhlc2UgbWFjcm9zLCB0aGVuIHdoZW4KLXdlIHJ1biBAc2FtcHthdXRvbWFrZX0gd2Ugd2lsbCBnZXQgYSByZW1pbmRlciB0aGF0IHdlIG5lZWQgdGhlbS4KLQotVGhlIG90aGVyIG1hY3JvcyBhcmUgc3RhbmRhcmQgYXV0b2NvbmYgbWFjcm9zLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIEFDX0hFQURFUl9TVERDCi1DaGVjayBmb3Igc3RhbmRhcmQgQyBoZWFkZXJzLgotQGl0ZW0gQUNfQ0hFQ0tfSEVBREVSUwotQ2hlY2sgd2hldGhlciBhIHBhcnRpY3VsYXIgaGVhZGVyIGZpbGUgZXhpc3RzLgotQGl0ZW0gQUNfRUdSRVBfSEVBREVSCi1DaGVjayBmb3IgYSBwYXJ0aWN1bGFyIHN0cmluZyBpbiBhIHBhcnRpY3VsYXIgaGVhZGVyIGZpbGUsIGluIHRoaXMgY2FzZQotY2hlY2tpbmcgZm9yIEBzYW1we3V0aW1idWZ9IGluIEBmaWxle3V0aW1lLmh9LgotQGl0ZW0gQUNfRlVOQ19VVElNRV9OVUxMCi1DaGVjayB3aGV0aGVyIEBzYW1we3V0aW1lfSBhY2NlcHRzIGEgTlVMTCBzZWNvbmQgYXJndW1lbnQgdG8gc2V0IHRoZQotZmlsZSBjaGFuZ2UgdGltZSB0byB0aGUgY3VycmVudCB0aW1lLgotQGVuZCB0YWJsZQotCi1TZWUgdGhlIGF1dG9jb25mIG1hbnVhbCBmb3IgYSBtb3JlIGNvbXBsZXRlIGRlc2NyaXB0aW9uLgotCi1UaGUgbmV3IEBmaWxle01ha2VmaWxlLmFtfSBmaWxlIGlzIGFzIGZvbGxvd3MuICBOb3RlIGhvdyBzaW1wbGUgdGhpcyBpcwotY29tcGFyZWQgdG8gb3VyIGVhcmxpZXIgQGZpbGV7TWFrZWZpbGV9LgotCi1AZXhhbXBsZQotYmluX1BST0dSQU1TID0gcG9rZQotCi1wb2tlX1NPVVJDRVMgPSBwb2tlLmMKLUBlbmQgZXhhbXBsZQotCi1UaGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIGJ1aWxkIGEgc2luZ2xlIHByb2dyYW0gbmFtZSBAc2FtcHtwb2tlfS4gIEl0Ci1zaG91bGQgYmUgaW5zdGFsbGVkIGluIHRoZSBiaW5hcnkgZGlyZWN0b3J5LCB3aGljaCB3ZSBjYWxsZWQKLUBzYW1we2JpbmRpcn0gZWFybGllci4gIFRoZSBwcm9ncmFtIEBzYW1we3Bva2V9IGlzIGJ1aWx0IGZyb20gdGhlIHNvdXJjZQotZmlsZSBAZmlsZXtwb2tlLmN9LgotCi1XZSBtdXN0IGFsc28gd3JpdGUgYSBAZmlsZXthY2NvbmZpZy5ofSBmaWxlLiAgQmVzaWRlcyBAc2FtcHtQQUNLQUdFfSBhbmQKLUBzYW1we1ZFUlNJT059LCB3aGljaCBtdXN0IGJlIG1lbnRpb25lZCBmb3IgYWxsIHBhY2thZ2VzIHdoaWNoIHVzZQotYXV0b21ha2UsIHdlIG11c3QgaW5jbHVkZSBAc2FtcHtIQVZFX1NUUlVDVF9VVElNQlVGfSwgc2luY2Ugd2UgbWVudGlvbmVkCi1pdCBpbiBhbiBAc2FtcHtBQ19ERUZJTkV9LgotCi1AZXhhbXBsZQotLyogTmFtZSBvZiBwYWNrYWdlLiAgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gb2YgcGFja2FnZS4gICovCi0jdW5kZWYgVkVSU0lPTgotCi0vKiBXaGV0aGVyIHV0aW1lLmggZGVmaW5lcyBzdHJ1Y3QgdXRpbWJ1Zi4gICovCi0jdW5kZWYgSEFWRV9TVFJVQ1RfVVRJTUJVRgotQGVuZCBleGFtcGxlCi0KLUBub2RlIEdlbmVyYXRlIEZpbGVzIGluIEV4YW1wbGUKLUBzdWJzZWN0aW9uIEdlbmVyYXRlIEZpbGVzCi0KLVdlIG11c3Qgbm93IGdlbmVyYXRlIHRoZSBvdGhlciBmaWxlcywgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kcy4KLQotQHNtYWxsZXhhbXBsZQotYWNsb2NhbAotYXV0b2NvbmYKLWF1dG9oZWFkZXIKLWF1dG9tYWtlCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1XaGVuIHdlIHJ1biBAc2FtcHthdXRvaGVhZGVyfSwgaXQgd2lsbCByZW1pbmQgdXMgb2YgYW55IG1hY3JvcyB3ZSBmb3Jnb3QKLXRvIGFkZCB0byBAZmlsZXthY2NvbmZpZy5ofS4KLQotV2hlbiB3ZSBydW4gQHNhbXB7YXV0b21ha2V9LCBpdCB3aWxsIHdhbnQgdG8gYWRkIHNvbWUgZmlsZXMgdG8gb3VyCi1kaXN0cmlidXRpb24uICBJdCB3aWxsIGFkZCB0aGVtIGF1dG9tYXRpY2FsbHkgaWYgd2UgdXNlIHRoZQotQHNhbXB7LS1hZGQtbWlzc2luZ30gb3B0aW9uLgotCi1CeSBkZWZhdWx0LCBAc2FtcHthdXRvbWFrZX0gd2lsbCBydW4gaW4gR05VIG1vZGUsIHdoaWNoIG1lYW5zIHRoYXQgaXQKLXdpbGwgd2FudCB1cyB0byBjcmVhdGUgY2VydGFpbiBhZGRpdGlvbmFsIGZpbGVzOyBhcyBvZiB0aGlzIHdyaXRpbmcsIGl0Ci13aWxsIHdhbnQgQGZpbGV7TkVXU30sIEBmaWxle1JFQURNRX0sIEBmaWxle0FVVEhPUlN9LCBhbmQKLUBmaWxle0NoYW5nZUxvZ30sIGFsbCBvZiB3aGljaCBhcmUgZmlsZXMgd2hpY2ggc2hvdWxkIGFwcGVhciBpbiBhCi1zdGFuZGFyZCBHTlUgZGlzdHJpYnV0aW9uLiAgV2UgY2FuIGVpdGhlciBhZGQgdGhvc2UgZmlsZXMsIG9yIHJ1bgotQHNhbXB7YXV0b21ha2V9IHdpdGggdGhlIEBzYW1wey0tZm9yZWlnbn0gb3B0aW9uLgotCi1SdW5uaW5nIHRoZXNlIHRvb2xzIHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBmaWxlcywgYWxsIG9mIHdoaWNoIGFyZQotZGVzY3JpYmVkIGluIHRoZSBuZXh0IGNoYXB0ZXIuCi0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1AZmlsZXthY2xvY2FsLm00fQotQGl0ZW0KLUBmaWxle2NvbmZpZ3VyZX0KLUBpdGVtCi1AZmlsZXtjb25maWcuaW59Ci1AaXRlbQotQGZpbGV7TWFrZWZpbGUuaW59Ci1AaXRlbQotQGZpbGV7c3RhbXAtaC5pbn0KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBGaWxlcwotQGNoYXB0ZXIgRmlsZXMKLQotQXMgd2FzIHNlZW4gaW4gdGhlIHByZXZpb3VzIGNoYXB0ZXIsIHRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0KLXVzZXMgYSBudW1iZXIgb2YgZGlmZmVyZW50IGZpbGVzLiAgVGhlIGRldmVsb3BlciBtdXN0IHdyaXRlIGEgZmV3IGZpbGVzLgotVGhlIG90aGVycyBhcmUgZ2VuZXJhdGVkIGJ5IHZhcmlvdXMgdG9vbHMuCi0KLVRoZSBzeXN0ZW0gaXMgcmF0aGVyIGZsZXhpYmxlLCBhbmQgY2FuIGJlIHVzZWQgaW4gbWFueSBkaWZmZXJlbnQgd2F5cy4KLUluIGRlc2NyaWJpbmcgdGhlIGZpbGVzIHRoYXQgaXQgdXNlcywgSSB3aWxsIGRlc2NyaWJlIHRoZSBjb21tb24gY2FzZSwKLWFuZCBtZW50aW9uIHNvbWUgb3RoZXIgY2FzZXMgdGhhdCBtYXkgYXJpc2UuCi0KLUBtZW51Ci0qIERldmVsb3BlciBGaWxlczo6CQlEZXZlbG9wZXIgRmlsZXMuCi0qIEJ1aWxkIEZpbGVzOjoJCQlCdWlsZCBGaWxlcy4KLSogU3VwcG9ydCBGaWxlczo6CQlTdXBwb3J0IEZpbGVzLgotQGVuZCBtZW51Ci0KLUBub2RlIERldmVsb3BlciBGaWxlcwotQHNlY3Rpb24gRGV2ZWxvcGVyIEZpbGVzCi0KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGZpbGVzIHdyaXR0ZW4gb3IgZ2VuZXJhdGVkIGJ5IHRoZSBkZXZlbG9wZXIKLW9mIGEgcGFja2FnZS4KLQotQG1lbnUKLSogRGV2ZWxvcGVyIEZpbGVzIFBpY3R1cmU6OglEZXZlbG9wZXIgRmlsZXMgUGljdHVyZS4KLSogV3JpdHRlbiBEZXZlbG9wZXIgRmlsZXM6OglXcml0dGVuIERldmVsb3BlciBGaWxlcy4KLSogR2VuZXJhdGVkIERldmVsb3BlciBGaWxlczo6CUdlbmVyYXRlZCBEZXZlbG9wZXIgRmlsZXMuCi1AZW5kIG1lbnUKLQotQG5vZGUgRGV2ZWxvcGVyIEZpbGVzIFBpY3R1cmUKLUBzdWJzZWN0aW9uIERldmVsb3BlciBGaWxlcyBQaWN0dXJlCi0KLUhlcmUgaXMgYSBwaWN0dXJlIG9mIHRoZSBmaWxlcyB3aGljaCBhcmUgd3JpdHRlbiBieSB0aGUgZGV2ZWxvcGVyLCB0aGUKLWdlbmVyYXRlZCBmaWxlcyB3aGljaCB3b3VsZCBiZSBpbmNsdWRlZCB3aXRoIGEgY29tcGxldGUgc291cmNlCi1kaXN0cmlidXRpb24sIGFuZCB0aGUgdG9vbHMgd2hpY2ggY3JlYXRlIHRob3NlIGZpbGVzLgotQGlmaW5mbwotVGhlIGZpbGUgbmFtZXMgYXJlIHBsYWluIHRleHQgYW5kIHRoZSB0b29sIG5hbWVzIGFyZSBlbmNsb3NlZCBieQotQHNhbXB7Kn0gY2hhcmFjdGVycwotQGVuZCBpZmluZm8KLUBpZm5vdGluZm8KLVRoZSBmaWxlIG5hbWVzIGFyZSBpbiByZWN0YW5nbGVzIHdpdGggc3F1YXJlIGNvcm5lcnMgYW5kIHRoZSB0b29sIG5hbWVzCi1hcmUgaW4gcmVjdGFuZ2xlcyB3aXRoIHJvdW5kZWQgY29ybmVycwotQGVuZCBpZm5vdGluZm8KLShlLmcuLCBAc2FtcHthdXRvaGVhZGVyfSBpcyB0aGUgbmFtZSBvZiBhIHRvb2wsIG5vdCB0aGUgbmFtZSBvZiBhIGZpbGUpLgotCi1AaW1hZ2V7Y29uZmlnZGV2fQotCi1Abm9kZSBXcml0dGVuIERldmVsb3BlciBGaWxlcwotQHN1YnNlY3Rpb24gV3JpdHRlbiBEZXZlbG9wZXIgRmlsZXMKLQotVGhlIGZvbGxvd2luZyBmaWxlcyB3b3VsZCBiZSB3cml0dGVuIGJ5IHRoZSBkZXZlbG9wZXIuCi0KLUB0YWJsZSBAZmlsZQotQGl0ZW0gY29uZmlndXJlLmluCi1AY2luZGV4IEBmaWxle2NvbmZpZ3VyZS5pbn0KLVRoaXMgaXMgdGhlIGNvbmZpZ3VyYXRpb24gc2NyaXB0LiAgVGhpcyBzY3JpcHQgY29udGFpbnMgaW52b2NhdGlvbnMgb2YKLWF1dG9jb25mIG1hY3Jvcy4gIEl0IG1heSBhbHNvIGNvbnRhaW4gb3JkaW5hcnkgc2hlbGwgc2NyaXB0IGNvZGUuICBUaGlzCi1maWxlIHdpbGwgY29udGFpbiBmZWF0dXJlIHRlc3RzIGZvciBwb3J0YWJpbGl0eSBpc3N1ZXMuICBUaGUgbGFzdCB0aGluZwotaW4gdGhlIGZpbGUgd2lsbCBub3JtYWxseSBiZSBhbiBAc2FtcHtBQ19PVVRQVVR9IG1hY3JvIGxpc3Rpbmcgd2hpY2gKLWZpbGVzIHRvIGNyZWF0ZSB3aGVuIHRoZSBidWlsZGVyIHJ1bnMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuICBUaGlzIGZpbGUKLWlzIGFsd2F5cyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSBHTlUgY29uZmlndXJlIHN5c3RlbS4gIEB4cmVme1dyaXRlCi1jb25maWd1cmUuaW59LgotCi1AaXRlbSBNYWtlZmlsZS5hbQotQGNpbmRleCBAZmlsZXtNYWtlZmlsZS5hbX0KLVRoaXMgaXMgdGhlIGF1dG9tYWtlIGlucHV0IGZpbGUuICBJdCBkZXNjcmliZXMgaG93IHRoZSBjb2RlIHNob3VsZCBiZQotYnVpbHQuICBJdCBjb25zaXN0cyBvZiBkZWZpbml0aW9ucyBvZiBhdXRvbWFrZSB2YXJpYWJsZXMuICBJdCBtYXkgYWxzbwotY29udGFpbiBvcmRpbmFyeSBNYWtlZmlsZSB0YXJnZXRzLiAgVGhpcyBmaWxlIGlzIG9ubHkgbmVlZGVkIHdoZW4gdXNpbmcKLWF1dG9tYWtlIChuZXdlciB0b29scyBub3JtYWxseSB1c2UgYXV0b21ha2UsIGJ1dCB0aGVyZSBhcmUgc3RpbGwgb2xkZXIKLXRvb2xzIHdoaWNoIGhhdmUgbm90IGJlZW4gY29udmVydGVkLCBpbiB3aGljaCB0aGUgZGV2ZWxvcGVyIHdyaXRlcwotQGZpbGV7TWFrZWZpbGUuaW59IGRpcmVjdGx5KS4gIEB4cmVme1dyaXRlIE1ha2VmaWxlLmFtfS4KLQotQGl0ZW0gYWNjb25maWcuaAotQGNpbmRleCBAZmlsZXthY2NvbmZpZy5ofQotV2hlbiB0aGUgY29uZmlndXJlIHNjcmlwdCBjcmVhdGVzIGEgcG9ydGFiaWxpdHkgaGVhZGVyIGZpbGUsIGJ5IHVzaW5nCi1Ac2FtcHtBTV9DT05GSUdfSEVBREVSfSAob3IsIGlmIG5vdCB1c2luZyBhdXRvbWFrZSwKLUBzYW1we0FDX0NPTkZJR19IRUFERVJ9KSwgdGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVzY3JpYmUgbWFjcm9zIHdoaWNoIGFyZQotbm90IHJlY29nbml6ZWQgYnkgdGhlIEBzYW1we2F1dG9oZWFkZXJ9IGNvbW1hbmQuICBUaGlzIGlzIG5vcm1hbGx5IGEKLWZhaXJseSB1bmludGVyZXN0aW5nIGZpbGUsIGNvbnNpc3Rpbmcgb2YgYSBjb2xsZWN0aW9uIG9mIEBzYW1weyN1bmRlZn0KLWxpbmVzIHdpdGggY29tbWVudHMuICBOb3JtYWxseSBhbnkgY2FsbCB0byBAc2FtcHtBQ19ERUZJTkV9IGluCi1AZmlsZXtjb25maWd1cmUuaW59IHdpbGwgcmVxdWlyZSBhIGxpbmUgaW4gdGhpcyBmaWxlLiBAeHJlZntXcml0ZQotYWNjb25maWcuaH0uCi0KLUBpdGVtIGFjaW5jbHVkZS5tNAotQGNpbmRleCBAZmlsZXthY2luY2x1ZGUubTR9Ci1UaGlzIGZpbGUgaXMgbm90IGFsd2F5cyByZXF1aXJlZC4gIEl0IGRlZmluZXMgbG9jYWwgYXV0b2NvbmYgbWFjcm9zLgotVGhlc2UgbWFjcm9zIG1heSB0aGVuIGJlIHVzZWQgaW4gQGZpbGV7Y29uZmlndXJlLmlufS4gIElmIHlvdSBkb24ndCBuZWVkCi1hbnkgbG9jYWwgYXV0b2NvbmYgbWFjcm9zLCB0aGVuIHlvdSBkb24ndCBuZWVkIHRoaXMgZmlsZSBhdCBhbGwuICBJbgotZmFjdCwgaW4gZ2VuZXJhbCwgeW91IG5ldmVyIG5lZWQgbG9jYWwgYXV0b2NvbmYgbWFjcm9zLCBzaW5jZSB5b3UgY2FuCi1wdXQgZXZlcnl0aGluZyBpbiBAZmlsZXtjb25maWd1cmUuaW59LCBidXQgc29tZXRpbWVzIGEgbG9jYWwgbWFjcm8gaXMKLWNvbnZlbmllbnQuCi0KLU5ld2VyIHRvb2xzIG1heSBvbWl0IEBmaWxle2FjaW5jbHVkZS5tNH0sIGFuZCBpbnN0ZWFkIHVzZSBhCi1zdWJkaXJlY3RvcnksIHR5cGljYWxseSBuYW1lZCBAZmlsZXttNH0sIGFuZCBkZWZpbmUKLUBzYW1we0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00fSBpbiBAZmlsZXtNYWtlZmlsZS5hbX0gdG8gZm9yY2UKLUBzYW1we2FjbG9jYWx9IHRvIGxvb2sgdGhlcmUgZm9yIG1hY3JvIGRlZmluaXRpb25zLiAgVGhlIG1hY3JvCi1kZWZpbml0aW9ucyBhcmUgdGhlbiBwbGFjZWQgaW4gc2VwYXJhdGUgZmlsZXMgaW4gdGhhdCBkaXJlY3RvcnkuCi0KLVRoZSBAZmlsZXthY2luY2x1ZGUubTR9IGZpbGUgaXMgb25seSB1c2VkIHdoZW4gdXNpbmcgYXV0b21ha2U7IGluIG9sZGVyCi10b29scywgdGhlIGRldmVsb3BlciB3cml0ZXMgQGZpbGV7YWNsb2NhbC5tNH0gZGlyZWN0bHksIGlmIGl0IGlzIG5lZWRlZC4KLUBlbmQgdGFibGUKLQotQG5vZGUgR2VuZXJhdGVkIERldmVsb3BlciBGaWxlcwotQHN1YnNlY3Rpb24gR2VuZXJhdGVkIERldmVsb3BlciBGaWxlcwotCi1UaGUgZm9sbG93aW5nIGZpbGVzIHdvdWxkIGJlIGdlbmVyYXRlZCBieSB0aGUgZGV2ZWxvcGVyLgotCi1XaGVuIHVzaW5nIGF1dG9tYWtlLCB0aGVzZSBmaWxlcyBhcmUgbm9ybWFsbHkgbm90IGdlbmVyYXRlZCBtYW51YWxseQotYWZ0ZXIgdGhlIGZpcnN0IHRpbWUuICBJbnN0ZWFkLCB0aGUgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfSBjb250YWlucwotcnVsZXMgdG8gYXV0b21hdGljYWxseSByZWJ1aWxkIHRoZSBmaWxlcyBhcyByZXF1aXJlZC4gIFdoZW4KLUBzYW1we0FNX01BSU5UQUlORVJfTU9ERX0gaXMgdXNlZCBpbiBAZmlsZXtjb25maWd1cmUuaW59ICh0aGUgbm9ybWFsCi1jYXNlIGluIEN5Z251cyBjb2RlKSwgdGhlIGF1dG9tYXRpYyByZWJ1aWxkaW5nIHJ1bGVzIHdpbGwgb25seSBiZQotZGVmaW5lZCBpZiB5b3UgY29uZmlndXJlIHVzaW5nIHRoZSBAc2FtcHstLWVuYWJsZS1tYWludGFpbmVyLW1vZGV9Ci1vcHRpb24uCi0KLVdoZW4gdXNpbmcgYXV0b21hdGljIHJlYnVpbGRpbmcsIGl0IGlzIGltcG9ydGFudCB0byBlbnN1cmUgdGhhdCBhbGwgdGhlCi12YXJpb3VzIHRvb2xzIGhhdmUgYmVlbiBidWlsdCBhbmQgaW5zdGFsbGVkIG9uIHlvdXIgQHNhbXB7UEFUSH0uICBVc2luZwotYXV0b21hdGljIHJlYnVpbGRpbmcgaXMgaGlnaGx5IHJlY29tbWVuZGVkLCBzbyBtdWNoIHNvIHRoYXQgSSdtIG5vdAotZ29pbmcgdG8gZXhwbGFpbiB3aGF0IHlvdSBoYXZlIHRvIGRvIGlmIHlvdSBkb24ndCB1c2UgaXQuCi0KLUB0YWJsZSBAZmlsZQotQGl0ZW0gY29uZmlndXJlCi1AY2luZGV4IEBmaWxle2NvbmZpZ3VyZX0KLVRoaXMgaXMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2ggd2lsbCBiZSBydW4gd2hlbiBidWlsZGluZyB0aGUKLXBhY2thZ2UuICBUaGlzIGlzIGdlbmVyYXRlZCBieSBAc2FtcHthdXRvY29uZn0gZnJvbSBAZmlsZXtjb25maWd1cmUuaW59Ci1hbmQgQGZpbGV7YWNsb2NhbC5tNH0uICBUaGlzIGlzIGEgc2hlbGwgc2NyaXB0LgotCi1AaXRlbSBNYWtlZmlsZS5pbgotQGNpbmRleCBAZmlsZXtNYWtlZmlsZS5pbn0KLVRoaXMgaXMgdGhlIGZpbGUgd2hpY2ggdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCB0dXJuIGludG8gdGhlCi1AZmlsZXtNYWtlZmlsZX0gYXQgYnVpbGQgdGltZS4gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkKLUBzYW1we2F1dG9tYWtlfSBmcm9tIEBmaWxle01ha2VmaWxlLmFtfS4gIElmIHlvdSBhcmVuJ3QgdXNpbmcgYXV0b21ha2UsCi15b3UgbXVzdCB3cml0ZSB0aGlzIGZpbGUgeW91cnNlbGYuICBUaGlzIGZpbGUgaXMgcHJldHR5IG11Y2ggYSBub3JtYWwKLUBmaWxle01ha2VmaWxlfSwgd2l0aCBzb21lIGNvbmZpZ3VyZSBzdWJzdGl0dXRpb25zIGZvciBjZXJ0YWluCi12YXJpYWJsZXMuCi0KLUBpdGVtIGFjbG9jYWwubTQKLUBjaW5kZXggQGZpbGV7YWNsb2NhbC5tNH0KLVRoaXMgZmlsZSBpcyBjcmVhdGVkIGJ5IHRoZSBAc2FtcHthY2xvY2FsfSBwcm9ncmFtLCBiYXNlZCBvbiB0aGUKLWNvbnRlbnRzIG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0gYW5kIEBmaWxle2FjaW5jbHVkZS5tNH0gKG9yLCBhcyBub3RlZCBpbgotdGhlIGRlc2NyaXB0aW9uIG9mIEBmaWxle2FjaW5jbHVkZS5tNH0gYWJvdmUsIG9uIHRoZSBjb250ZW50cyBvZiBhbgotQGZpbGV7bTR9IHN1YmRpcmVjdG9yeSkuICBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgb2YgYXV0b2NvbmYKLW1hY3JvcyB3aGljaCBAc2FtcHthdXRvY29uZn0gd2lsbCB1c2Ugd2hlbiBnZW5lcmF0aW5nIHRoZSBmaWxlCi1AZmlsZXtjb25maWd1cmV9LiAgVGhlc2UgYXV0b2NvbmYgbWFjcm9zIG1heSBiZSBkZWZpbmVkIGJ5IHlvdSBpbgotQGZpbGV7YWNpbmNsdWRlLm00fSBvciB0aGV5IG1heSBiZSBkZWZpbmVkIGJ5IG90aGVyIHBhY2thZ2VzIHN1Y2ggYXMKLWF1dG9tYWtlLCBsaWJ0b29sIG9yIGdldHRleHQuICBJZiB5b3UgYXJlbid0IHVzaW5nIGF1dG9tYWtlLCB5b3Ugd2lsbAotbm9ybWFsbHkgd3JpdGUgdGhpcyBmaWxlIHlvdXJzZWxmOyBpbiB0aGF0IGNhc2UsIGlmIEBmaWxle2NvbmZpZ3VyZS5pbn0KLXVzZXMgb25seSBzdGFuZGFyZCBhdXRvY29uZiBtYWNyb3MsIHRoaXMgZmlsZSB3aWxsIG5vdCBiZSBuZWVkZWQgYXQgYWxsLgotCi1AaXRlbSBjb25maWcuaW4KLUBjaW5kZXggQGZpbGV7Y29uZmlnLmlufQotQGNpbmRleCBAZmlsZXtjb25maWcuaC5pbn0KLVRoaXMgZmlsZSBpcyBjcmVhdGVkIGJ5IEBzYW1we2F1dG9oZWFkZXJ9IGJhc2VkIG9uIEBmaWxle2FjY29uZmlnLmh9IGFuZAotQGZpbGV7Y29uZmlndXJlLmlufS4gIEF0IGJ1aWxkIHRpbWUsIHRoZSBjb25maWd1cmUgc2NyaXB0IHdpbGwgZGVmaW5lCi1zb21lIG9mIHRoZSBtYWNyb3MgaW4gaXQgdG8gY3JlYXRlIEBmaWxle2NvbmZpZy5ofSwgd2hpY2ggbWF5IHRoZW4gYmUKLWluY2x1ZGVkIGJ5IHlvdXIgcHJvZ3JhbS4gIFRoaXMgcGVybWl0cyB5b3VyIEMgY29kZSB0byB1c2UgcHJlcHJvY2Vzc29yCi1jb25kaXRpb25hbHMgdG8gY2hhbmdlIGl0cyBiZWhhdmlvdXIgYmFzZWQgb24gdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUKLWhvc3Qgc3lzdGVtLiAgVGhpcyBmaWxlIG1heSBhbHNvIGJlIGNhbGxlZCBAZmlsZXtjb25maWcuaC5pbn0uCi0KLUBpdGVtIHN0YW1wLmgtaW4KLUBjaW5kZXggQGZpbGV7c3RhbXAtaC5pbn0KLVRoaXMgcmF0aGVyIHVuaW50ZXJlc3RpbmcgZmlsZSwgd2hpY2ggSSBvbWl0dGVkIGZyb20gdGhlIHBpY3R1cmUsIGlzCi1nZW5lcmF0ZWQgYnkgQHNhbXB7YXV0b21ha2V9LiAgSXQgYWx3YXlzIGNvbnRhaW5zIHRoZSBzdHJpbmcKLUBzYW1we3RpbWVzdGFtcH0uICBJdCBpcyB1c2VkIGFzIGEgdGltZXN0YW1wIGZpbGUgaW5kaWNhdGluZyB3aGV0aGVyCi1AZmlsZXtjb25maWcuaW59IGlzIHVwIHRvIGRhdGUuICBVc2luZyBhIHRpbWVzdGFtcCBmaWxlIG1lYW5zIHRoYXQKLUBmaWxle2NvbmZpZy5pbn0gY2FuIGJlIG1hcmtlZCBhcyB1cCB0byBkYXRlIHdpdGhvdXQgYWN0dWFsbHkgY2hhbmdpbmcKLWl0cyBtb2RpZmljYXRpb24gdGltZS4gIFRoaXMgaXMgdXNlZnVsIHNpbmNlIEBmaWxle2NvbmZpZy5pbn0gZGVwZW5kcwotdXBvbiBAZmlsZXtjb25maWd1cmUuaW59LCBidXQgaXQgaXMgZWFzeSB0byBjaGFuZ2UgQGZpbGV7Y29uZmlndXJlLmlufQotaW4gYSB3YXkgd2hpY2ggZG9lcyBub3QgYWZmZWN0IEBmaWxle2NvbmZpZy5pbn0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJ1aWxkIEZpbGVzCi1Ac2VjdGlvbiBCdWlsZCBGaWxlcwotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBmaWxlcyB3aGljaCBhcmUgY3JlYXRlZCBhdCBjb25maWd1cmUgYW5kCi1idWlsZCB0aW1lLiAgVGhlc2UgYXJlIHRoZSBmaWxlcyB3aGljaCBzb21lYm9keSB3aG8gYnVpbGRzIHRoZSBwYWNrYWdlCi13aWxsIHNlZS4KLQotT2YgY291cnNlLCB0aGUgZGV2ZWxvcGVyIHdpbGwgYWxzbyBidWlsZCB0aGUgcGFja2FnZS4gIFRoZSBkaXN0aW5jdGlvbgotYmV0d2VlbiBkZXZlbG9wZXIgZmlsZXMgYW5kIGJ1aWxkIGZpbGVzIGlzIG5vdCB0aGF0IHRoZSBkZXZlbG9wZXIgZG9lcwotbm90IHNlZSB0aGUgYnVpbGQgZmlsZXMsIGJ1dCB0aGF0IHNvbWVib2R5IHdobyBvbmx5IGJ1aWxkcyB0aGUgcGFja2FnZQotZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgZGV2ZWxvcGVyIGZpbGVzLgotCi1AbWVudQotKiBCdWlsZCBGaWxlcyBQaWN0dXJlOjoJCUJ1aWxkIEZpbGVzIFBpY3R1cmUuCi0qIEJ1aWxkIEZpbGVzIERlc2NyaXB0aW9uOjoJQnVpbGQgRmlsZXMgRGVzY3JpcHRpb24uCi1AZW5kIG1lbnUKLQotQG5vZGUgQnVpbGQgRmlsZXMgUGljdHVyZQotQHN1YnNlY3Rpb24gQnVpbGQgRmlsZXMgUGljdHVyZQotCi1IZXJlIGlzIGEgcGljdHVyZSBvZiB0aGUgZmlsZXMgd2hpY2ggd2lsbCBiZSBjcmVhdGVkIGF0IGJ1aWxkIHRpbWUuCi1AZmlsZXtjb25maWcuc3RhdHVzfSBpcyBib3RoIGEgY3JlYXRlZCBmaWxlIGFuZCBhIHNoZWxsIHNjcmlwdCB3aGljaCBpcwotcnVuIHRvIGNyZWF0ZSBvdGhlciBmaWxlcywgYW5kIHRoZSBwaWN0dXJlIGF0dGVtcHRzIHRvIHNob3cgdGhhdC4KLQotQGltYWdle2NvbmZpZ2J1aWxkfQotCi1Abm9kZSBCdWlsZCBGaWxlcyBEZXNjcmlwdGlvbgotQHN1YnNlY3Rpb24gQnVpbGQgRmlsZXMgRGVzY3JpcHRpb24KLQotVGhpcyBpcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWxlcyB3aGljaCBhcmUgY3JlYXRlZCBhdCBidWlsZCB0aW1lLgotCi1AdGFibGUgQGZpbGUKLUBpdGVtIGNvbmZpZy5zdGF0dXMKLUBjaW5kZXggQGZpbGV7Y29uZmlnLnN0YXR1c30KLVRoZSBmaXJzdCBzdGVwIGluIGJ1aWxkaW5nIGEgcGFja2FnZSBpcyB0byBydW4gdGhlIEBmaWxle2NvbmZpZ3VyZX0KLXNjcmlwdC4gIFRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCB3aWxsIGNyZWF0ZSB0aGUgZmlsZQotQGZpbGV7Y29uZmlnLnN0YXR1c30sIHdoaWNoIGlzIGl0c2VsZiBhIHNoZWxsIHNjcmlwdC4gIFdoZW4geW91IGZpcnN0Ci1ydW4gQGZpbGV7Y29uZmlndXJlfSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHJ1biBAZmlsZXtjb25maWcuc3RhdHVzfS4KLUFuIEBmaWxle01ha2VmaWxlfSBkZXJpdmVkIGZyb20gYW4gYXV0b21ha2UgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlLmlufQotd2lsbCBjb250YWluIHJ1bGVzIHRvIGF1dG9tYXRpY2FsbHkgcnVuIEBmaWxle2NvbmZpZy5zdGF0dXN9IGFnYWluIHdoZW4KLW5lY2Vzc2FyeSB0byByZWNyZWF0ZSBjZXJ0YWluIGZpbGVzIGlmIHRoZWlyIGlucHV0cyBjaGFuZ2UuCi0KLUBpdGVtIE1ha2VmaWxlCi1AY2luZGV4IEBmaWxle01ha2VmaWxlfQotVGhpcyBpcyB0aGUgZmlsZSB3aGljaCBtYWtlIHdpbGwgcmVhZCB0byBidWlsZCB0aGUgcHJvZ3JhbS4gIFRoZQotQGZpbGV7Y29uZmlnLnN0YXR1c30gc2NyaXB0IHdpbGwgdHJhbnNmb3JtIEBmaWxle01ha2VmaWxlLmlufSBpbnRvCi1AZmlsZXtNYWtlZmlsZX0uCi0KLUBpdGVtIGNvbmZpZy5oCi1AY2luZGV4IEBmaWxle2NvbmZpZy5ofQotVGhpcyBmaWxlIGRlZmluZXMgQyBwcmVwcm9jZXNzb3IgbWFjcm9zIHdoaWNoIEMgY29kZSBjYW4gdXNlIHRvIGFkanVzdAotaXRzIGJlaGF2aW91ciBvbiBkaWZmZXJlbnQgc3lzdGVtcy4gIFRoZSBAZmlsZXtjb25maWcuc3RhdHVzfSBzY3JpcHQKLXdpbGwgdHJhbnNmb3JtIEBmaWxle2NvbmZpZy5pbn0gaW50byBAZmlsZXtjb25maWcuaH0uCi0KLUBpdGVtIGNvbmZpZy5jYWNoZQotQGNpbmRleCBAZmlsZXtjb25maWcuY2FjaGV9Ci1UaGlzIGZpbGUgZGlkIG5vdCBmaXQgbmVhdGx5IGludG8gdGhlIHBpY3R1cmUsIGFuZCBJIG9taXR0ZWQgaXQuICBJdCBpcwotdXNlZCBieSB0aGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgdG8gY2FjaGUgcmVzdWx0cyBiZXR3ZWVuIHJ1bnMuICBUaGlzCi1jYW4gYmUgYW4gaW1wb3J0YW50IHNwZWVkdXAuICBJZiB5b3UgbW9kaWZ5IEBmaWxle2NvbmZpZ3VyZS5pbn0gaW4gc3VjaAotYSB3YXkgdGhhdCB0aGUgcmVzdWx0cyBvZiBvbGQgdGVzdHMgc2hvdWxkIGNoYW5nZSAocGVyaGFwcyB5b3UgaGF2ZQotYWRkZWQgYSBuZXcgbGlicmFyeSB0byBAc2FtcHtMREZMQUdTfSksIHRoZW4geW91IHdpbGwgaGF2ZSB0byByZW1vdmUKLUBmaWxle2NvbmZpZy5jYWNoZX0gdG8gZm9yY2UgdGhlIHRlc3RzIHRvIGJlIHJlcnVuLgotCi1UaGUgYXV0b2NvbmYgbWFudWFsIGV4cGxhaW5zIGhvdyB0byBzZXQgdXAgYSBzaXRlIHNwZWNpZmljIGNhY2hlIGZpbGUuCi1UaGlzIGNhbiBzcGVlZCB1cCBydW5uaW5nIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0cyBvbiB5b3VyIHN5c3RlbS4KLQotQGl0ZW0gc3RhbXAuaAotQGNpbmRleCBAZmlsZXtzdGFtcC1ofQotVGhpcyBmaWxlLCB3aGljaCBJIG9taXR0ZWQgZnJvbSB0aGUgcGljdHVyZSwgaXMgc2ltaWxhciB0bwotQGZpbGV7c3RhbXAtaC5pbn0uICBJdCBpcyB1c2VkIGFzIGEgdGltZXN0YW1wIGZpbGUgaW5kaWNhdGluZyB3aGV0aGVyCi1AZmlsZXtjb25maWcuaH0gaXMgdXAgdG8gZGF0ZS4gIFRoaXMgaXMgdXNlZnVsIHNpbmNlIEBmaWxle2NvbmZpZy5ofQotZGVwZW5kcyB1cG9uIEBmaWxle2NvbmZpZy5zdGF0dXN9LCBidXQgaXQgaXMgZWFzeSBmb3IKLUBmaWxle2NvbmZpZy5zdGF0dXN9IHRvIGNoYW5nZSBpbiBhIHdheSB3aGljaCBkb2VzIG5vdCBhZmZlY3QKLUBmaWxle2NvbmZpZy5ofS4KLUBlbmQgdGFibGUKLQotQG5vZGUgU3VwcG9ydCBGaWxlcwotQHNlY3Rpb24gU3VwcG9ydCBGaWxlcwotCi1UaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIHJlcXVpcmVzIHNldmVyYWwgc3VwcG9ydCBmaWxlcyB0byBiZQotaW5jbHVkZWQgd2l0aCB5b3VyIGRpc3RyaWJ1dGlvbi4gIFlvdSBkbyBub3Qgbm9ybWFsbHkgbmVlZCB0byBjb25jZXJuCi15b3Vyc2VsZiB3aXRoIHRoZXNlLiAgSWYgeW91IGFyZSB1c2luZyB0aGUgQ3lnbnVzIHRyZWUsIG1vc3QgYXJlIGFscmVhZHkKLXByZXNlbnQuICBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSBpbnN0YWxsZWQgd2l0aCB5b3VyIHNvdXJjZSBieQotQHNhbXB7YXV0b21ha2V9ICh3aXRoIHRoZSBAc2FtcHstLWFkZC1taXNzaW5nfSBvcHRpb24pIGFuZAotQHNhbXB7bGlidG9vbGl6ZX0uCi0KLVlvdSBkb24ndCBoYXZlIHRvIHB1dCB0aGUgc3VwcG9ydCBmaWxlcyBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeS4gIFlvdQotY2FuIHB1dCB0aGVtIGluIGEgc3ViZGlyZWN0b3J5LCBhbmQgdXNlIHRoZSBAc2FtcHtBQ19DT05GSUdfQVVYX0RJUn0KLW1hY3JvIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0gdG8gdGVsbCBAc2FtcHthdXRvbWFrZX0gYW5kIHRoZQotQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgd2hlcmUgdGhleSBhcmUuCi0KLUluIHRoaXMgc2VjdGlvbiwgSSBkZXNjcmliZSB0aGUgc3VwcG9ydCBmaWxlcywgc28gdGhhdCB5b3UgY2FuIGtub3cgd2hhdAotdGhleSBhcmUgYW5kIHdoeSB0aGV5IGFyZSB0aGVyZS4KLQotQHRhYmxlIEBmaWxlCi1AaXRlbSBBQk9VVC1OTFMKLUFkZGVkIGJ5IGF1dG9tYWtlIGlmIHlvdSBhcmUgdXNpbmcgZ2V0dGV4dC4gIFRoaXMgaXMgYSBkb2N1bWVudGF0aW9uCi1maWxlIGFib3V0IHRoZSBnZXR0ZXh0IHByb2plY3QuCi1AaXRlbSBhbnNpMmtuci5jCi1Vc2VkIGJ5IGFuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0gaWYgeW91IHB1dCBAc2FtcHthbnNpMmtucn0KLWluIEBzYW1we0FVVE9NQUtFX09QVElPTlN9IGluIEBmaWxle01ha2VmaWxlLmFtfS4gIFRoaXMgcGVybWl0cwotY29tcGlsaW5nIEFOU0kgQyBjb2RlIHdpdGggYSBLJlIgQyBjb21waWxlci4KLUBpdGVtIGFuc2kya25yLjEKLVRoZSBtYW4gcGFnZSB3aGljaCBnb2VzIHdpdGggQGZpbGV7YW5zaTJrbnIuY30uCi1AaXRlbSBjb25maWcuZ3Vlc3MKLUEgc2hlbGwgc2NyaXB0IHdoaWNoIGRldGVybWluZXMgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBmb3IgdGhlIHN5c3RlbSBvbgotd2hpY2ggaXQgaXMgcnVuLgotQGl0ZW0gY29uZmlnLnN1YgotQSBzaGVsbCBzY3JpcHQgd2hpY2ggY2Fub25pY2FsaXplcyBhIGNvbmZpZ3VyYXRpb24gbmFtZSBlbnRlcmVkIGJ5IGEKLXVzZXIuCi1AaXRlbSBlbGlzcC1jb21wCi1Vc2VkIHRvIGNvbXBpbGUgRW1hY3MgTElTUCBmaWxlcy4KLUBpdGVtIGluc3RhbGwtc2gKLUEgc2hlbGwgc2NyaXB0IHdoaWNoIGluc3RhbGxzIGEgcHJvZ3JhbS4gIFRoaXMgaXMgdXNlZCBpZiB0aGUgY29uZmlndXJlCi1zY3JpcHQgY2FuIG5vdCBmaW5kIGFuIGluc3RhbGwgYmluYXJ5LgotQGl0ZW0gbHRjb25maWcKLVVzZWQgYnkgbGlidG9vbC4gIFRoaXMgaXMgYSBzaGVsbCBzY3JpcHQgd2hpY2ggY29uZmlndXJlcyBsaWJ0b29sIGZvcgotdGhlIHBhcnRpY3VsYXIgc3lzdGVtIG9uIHdoaWNoIGl0IGlzIHVzZWQuCi1AaXRlbSBsdG1haW4uc2gKLVVzZWQgYnkgbGlidG9vbC4gIFRoaXMgaXMgdGhlIGFjdHVhbCBsaWJ0b29sIHNjcmlwdCB3aGljaCBpcyB1c2VkLCBhZnRlcgotaXQgaXMgY29uZmlndXJlZCBieSBAZmlsZXtsdGNvbmZpZ30gdG8gYnVpbGQgYSBsaWJyYXJ5LgotQGl0ZW0gbWRhdGUtc2gKLUEgc2hlbGwgc2NyaXB0IHVzZWQgYnkgYW4gYXV0b21ha2UgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfSB0byBwcmV0dHkKLXByaW50IHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiBhIGZpbGUuICBUaGlzIGlzIHVzZWQgdG8gbWFpbnRhaW4gdmVyc2lvbgotbnVtYmVycyBmb3IgdGV4aW5mbyBmaWxlcy4KLUBpdGVtIG1pc3NpbmcKLUEgc2hlbGwgc2NyaXB0IHVzZWQgaWYgc29tZSB0b29sIGlzIG1pc3NpbmcgZW50aXJlbHkuICBUaGlzIGlzIHVzZWQgYnkKLWFuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0gdG8gYXZvaWQgY2VydGFpbiBzb3J0cyBvZgotdGltZXN0YW1wIHByb2JsZW1zLgotQGl0ZW0gbWtpbnN0YWxsZGlycwotQSBzaGVsbCBzY3JpcHQgd2hpY2ggY3JlYXRlcyBhIGRpcmVjdG9yeSwgaW5jbHVkaW5nIGFsbCBwYXJlbnQKLWRpcmVjdG9yaWVzLiAgVGhpcyBpcyB1c2VkIGJ5IGFuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0KLWR1cmluZyBpbnN0YWxsYXRpb24uCi1AaXRlbSB0ZXhpbmZvLnRleAotUmVxdWlyZWQgaWYgeW91IGhhdmUgYW55IHRleGluZm8gZmlsZXMuICBUaGlzIGlzIHVzZWQgd2hlbiBjb252ZXJ0aW5nCi1UZXhpbmZvIGZpbGVzIGludG8gRFZJIHVzaW5nIEBzYW1we3RleGkyZHZpfSBhbmQgQFRlWHt9LgotQGl0ZW0geWx3cmFwCi1BIHNoZWxsIHNjcmlwdCB1c2VkIGJ5IGFuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0gdG8gcnVuCi1wcm9ncmFtcyBsaWtlIEBzYW1we2Jpc29ufSwgQHNhbXB7eWFjY30sIEBzYW1we2ZsZXh9LCBhbmQgQHNhbXB7bGV4fS4KLVRoZXNlIHByb2dyYW1zIGRlZmF1bHQgdG8gcHJvZHVjaW5nIG91dHB1dCBmaWxlcyB3aXRoIGEgZml4ZWQgbmFtZSwgYW5kCi10aGUgQGZpbGV7eWx3cmFwfSBzY3JpcHQgcnVucyB0aGVtIGluIGEgc3ViZGlyZWN0b3J5IHRvIGF2b2lkIGZpbGUgbmFtZQotY29uZmxpY3RzIHdoZW4gdXNpbmcgYSBwYXJhbGxlbCBtYWtlIHByb2dyYW0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIENvbmZpZ3VyYXRpb24gTmFtZXMKLUBjaGFwdGVyIENvbmZpZ3VyYXRpb24gTmFtZXMKLUBjaW5kZXggY29uZmlndXJhdGlvbiBuYW1lcwotQGNpbmRleCBjb25maWd1cmF0aW9uIHRyaXBsZXRzCi1AY2luZGV4IHRyaXBsZXRzCi1AY2luZGV4IGhvc3QgbmFtZXMKLUBjaW5kZXggaG9zdCB0cmlwbGV0cwotQGNpbmRleCBjYW5vbmljYWwgc3lzdGVtIG5hbWVzCi1AY2luZGV4IHN5c3RlbSBuYW1lcwotQGNpbmRleCBzeXN0ZW0gdHlwZXMKLQotVGhlIEdOVSBjb25maWd1cmUgc3lzdGVtIG5hbWVzIGFsbCBzeXN0ZW1zIHVzaW5nIGEgQGRmbntjb25maWd1cmF0aW9uCi1uYW1lfS4gIEFsbCBzdWNoIG5hbWVzIHVzZWQgdG8gYmUgdHJpcGxldHMgKHRoZXkgbWF5IG5vdyBjb250YWluIGZvdXIKLXBhcnRzIGluIGNlcnRhaW4gY2FzZXMpLCBhbmQgdGhlIHRlcm0gQGRmbntjb25maWd1cmF0aW9uIHRyaXBsZXR9IGlzCi1zdGlsbCBzZWVuLgotCi1AbWVudQotKiBDb25maWd1cmF0aW9uIE5hbWUgRGVmaW5pdGlvbjo6CUNvbmZpZ3VyYXRpb24gTmFtZSBEZWZpbml0aW9uLgotKiBVc2luZyBDb25maWd1cmF0aW9uIE5hbWVzOjoJCVVzaW5nIENvbmZpZ3VyYXRpb24gTmFtZXMuCi1AZW5kIG1lbnUKLQotQG5vZGUgQ29uZmlndXJhdGlvbiBOYW1lIERlZmluaXRpb24KLUBzZWN0aW9uIENvbmZpZ3VyYXRpb24gTmFtZSBEZWZpbml0aW9uCi0KLVRoaXMgaXMgYSBzdHJpbmcgb2YgdGhlIGZvcm0KLUB2YXJ7Y3B1fS1AdmFye21hbnVmYWN0dXJlcn0tQHZhcntvcGVyYXRpbmdfc3lzdGVtfS4gIEluIHNvbWUgY2FzZXMsCi10aGlzIGlzIGV4dGVuZGVkIHRvIGEgZm91ciBwYXJ0IGZvcm06Ci1AdmFye2NwdX0tQHZhcnttYW51ZmFjdHVyZXJ9LUB2YXJ7a2VybmVsfS1AdmFye29wZXJhdGluZ19zeXN0ZW19LgotCi1XaGVuIHVzaW5nIGEgY29uZmlndXJhdGlvbiBuYW1lIGluIGEgY29uZmlndXJlIG9wdGlvbiwgaXQgaXMgbm9ybWFsbHkKLW5vdCBuZWNlc3NhcnkgdG8gc3BlY2lmeSBhbiBlbnRpcmUgbmFtZS4gIEluIHBhcnRpY3VsYXIsIHRoZQotQHZhcnttYW51ZmFjdHVyZXJ9IGZpZWxkIGlzIG9mdGVuIG9taXR0ZWQsIGxlYWRpbmcgdG8gc3RyaW5ncyBzdWNoIGFzCi1Ac2FtcHtpMzg2LWxpbnV4fSBvciBAc2FtcHtzcGFyYy1zdW5vc30uICBUaGUgc2hlbGwgc2NyaXB0Ci1AZmlsZXtjb25maWcuc3VifSB3aWxsIHRyYW5zbGF0ZSB0aGVzZSBzaG9ydGVuZWQgc3RyaW5ncyBpbnRvIHRoZQotY2Fub25pY2FsIGZvcm0uICBhdXRvY29uZiB3aWxsIGFycmFuZ2UgZm9yIEBmaWxle2NvbmZpZy5zdWJ9IHRvIGJlIHJ1bgotYXV0b21hdGljYWxseSB3aGVuIGl0IGlzIG5lZWRlZC4KLQotVGhlIGZpZWxkcyBvZiBhIGNvbmZpZ3VyYXRpb24gbmFtZSBhcmUgYXMgZm9sbG93czoKLQotQHRhYmxlIEB2YXIKLUBpdGVtIGNwdQotVGhlIHR5cGUgb2YgcHJvY2Vzc29yLiAgVGhpcyBpcyB0eXBpY2FsbHkgc29tZXRoaW5nIGxpa2UgQHNhbXB7aTM4Nn0gb3IKLUBzYW1we3NwYXJjfS4gIE1vcmUgc3BlY2lmaWMgdmFyaWFudHMgYXJlIHVzZWQgYXMgd2VsbCwgc3VjaCBhcwotQHNhbXB7bWlwc2VsfSB0byBpbmRpY2F0ZSBhIGxpdHRsZSBlbmRpYW4gTUlQUyBwcm9jZXNzb3IuCi1AaXRlbSBtYW51ZmFjdHVyZXIKLUEgc29tZXdoYXQgZnJlZWZvcm0gZmllbGQgd2hpY2ggaW5kaWNhdGVzIHRoZSBtYW51ZmFjdHVyZXIgb2YgdGhlCi1zeXN0ZW0uICBUaGlzIGlzIG9mdGVuIHNpbXBseSBAc2FtcHt1bmtub3dufS4gIE90aGVyIGNvbW1vbiBzdHJpbmdzIGFyZQotQHNhbXB7cGN9IGZvciBhbiBJQk0gUEMgY29tcGF0aWJsZSBzeXN0ZW0sIG9yIHRoZSBuYW1lIG9mIGEgd29ya3N0YXRpb24KLXZlbmRvciwgc3VjaCBhcyBAc2FtcHtzdW59LgotQGl0ZW0gb3BlcmF0aW5nX3N5c3RlbQotVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2hpY2ggaXMgcnVuIG9uIHRoZSBzeXN0ZW0uICBUaGlzIHdpbGwKLWJlIHNvbWV0aGluZyBsaWtlIEBzYW1we3NvbGFyaXMyLjV9IG9yIEBzYW1we2lyaXg2LjN9LiAgVGhlcmUgaXMgbm8KLXBhcnRpY3VsYXIgcmVzdHJpY3Rpb24gb24gdGhlIHZlcnNpb24gbnVtYmVyLCBhbmQgc3RyaW5ncyBsaWtlCi1Ac2FtcHthaXg0LjEuNC4wfSBhcmUgc2Vlbi4gIEZvciBhbiBlbWJlZGRlZCBzeXN0ZW0sIHdoaWNoIGhhcyBubwotb3BlcmF0aW5nIHN5c3RlbSwgdGhpcyBmaWVsZCBub3JtYWxseSBpbmRpY2F0ZXMgdGhlIHR5cGUgb2Ygb2JqZWN0IGZpbGUKLWZvcm1hdCwgc3VjaCBhcyBAc2FtcHtlbGZ9IG9yIEBzYW1we2NvZmZ9LgotQGl0ZW0ga2VybmVsCi1UaGlzIGlzIHVzZWQgbWFpbmx5IGZvciBHTlUvTGludXguICBBIHR5cGljYWwgR05VL0xpbnV4IGNvbmZpZ3VyYXRpb24KLW5hbWUgaXMgQHNhbXB7aTU4Ni1wYy1saW51eC1nbnVsaWJjMX0uICBJbiB0aGlzIGNhc2UgdGhlIGtlcm5lbCwKLUBzYW1we2xpbnV4fSwgaXMgc2VwYXJhdGVkIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0sIEBzYW1we2dudWxpYmMxfS4KLUBlbmQgdGFibGUKLQotVGhlIHNoZWxsIHNjcmlwdCBAZmlsZXtjb25maWcuZ3Vlc3N9IHdpbGwgbm9ybWFsbHkgcHJpbnQgdGhlIGNvcnJlY3QKLWNvbmZpZ3VyYXRpb24gbmFtZSBmb3IgdGhlIHN5c3RlbSBvbiB3aGljaCBpdCBpcyBydW4uICBJdCBkb2VzIGJ5Ci1ydW5uaW5nIEBzYW1we3VuYW1lfSBhbmQgYnkgZXhhbWluaW5nIG90aGVyIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUKLXN5c3RlbS4KLQotQmVjYXVzZSBAZmlsZXtjb25maWcuZ3Vlc3N9IGNhbiBub3JtYWxseSBkZXRlcm1pbmUgdGhlIGNvbmZpZ3VyYXRpb24KLW5hbWUgZm9yIGEgbWFjaGluZSwgaXQgaXMgbm9ybWFsbHkgb25seSBuZWNlc3NhcnkgdG8gc3BlY2lmeSBhCi1jb25maWd1cmF0aW9uIG5hbWUgd2hlbiBidWlsZGluZyBhIGNyb3NzLWNvbXBpbGVyIG9yIHdoZW4gYnVpbGRpbmcgdXNpbmcKLWEgY3Jvc3MtY29tcGlsZXIuCi0KLUBub2RlIFVzaW5nIENvbmZpZ3VyYXRpb24gTmFtZXMKLUBzZWN0aW9uIFVzaW5nIENvbmZpZ3VyYXRpb24gTmFtZXMKLQotQSBjb25maWd1cmUgc2NyaXB0IHdpbGwgc29tZXRpbWVzIGhhdmUgdG8gbWFrZSBhIGRlY2lzaW9uIGJhc2VkIG9uIGEKLWNvbmZpZ3VyYXRpb24gbmFtZS4gIFlvdSB3aWxsIG5lZWQgdG8gZG8gdGhpcyBpZiB5b3UgaGF2ZSB0byBjb21waWxlCi1jb2RlIGRpZmZlcmVudGx5IGJhc2VkIG9uIHNvbWV0aGluZyB3aGljaCBjYW4gbm90IGJlIHRlc3RlZCB1c2luZyBhCi1zdGFuZGFyZCBhdXRvY29uZiBmZWF0dXJlIHRlc3QuCi0KLUl0IGlzIG5vcm1hbGx5IGJldHRlciB0byB0ZXN0IGZvciBwYXJ0aWN1bGFyIGZlYXR1cmVzLCByYXRoZXIgdGhhbiB0bwotdGVzdCBmb3IgYSBwYXJ0aWN1bGFyIHN5c3RlbS4gIFRoaXMgaXMgYmVjYXVzZSBhcyBVbml4IGV2b2x2ZXMsCi1kaWZmZXJlbnQgc3lzdGVtcyBjb3B5IGZlYXR1cmVzIGZyb20gb25lIGFub3RoZXIuICBFdmVuIGlmIHlvdSBuZWVkIHRvCi1kZXRlcm1pbmUgd2hldGhlciB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYmFzZWQgb24gYSBjb25maWd1cmF0aW9uCi1uYW1lLCB5b3Ugc2hvdWxkIGRlZmluZSBhIG1hY3JvIHdoaWNoIGRlc2NyaWJlcyB0aGUgZmVhdHVyZSwgcmF0aGVyIHRoYW4KLWRlZmluaW5nIGEgbWFjcm8gd2hpY2ggZGVzY3JpYmVzIHRoZSBwYXJ0aWN1bGFyIHN5c3RlbSB5b3UgYXJlIG9uLgotCi1UZXN0aW5nIGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtIGlzIG5vcm1hbGx5IGRvbmUgdXNpbmcgYSBjYXNlIHN0YXRlbWVudAotaW4gQGZpbGV7Y29uZmlndXJlLmlufS4gIFRoZSBjYXNlIHN0YXRlbWVudCBtaWdodCBsb29rIHNvbWV0aGluZyBsaWtlCi10aGUgZm9sbG93aW5nLCBhc3N1bWluZyB0aGF0IEBzYW1we2hvc3R9IGlzIGEgc2hlbGwgdmFyaWFibGUgaG9sZGluZyBhCi1jYW5vbmljYWwgY29uZmlndXJhdGlvbiBuYW1lICh3aGljaCB3aWxsIGJlIHRoZSBjYXNlIGlmCi1AZmlsZXtjb25maWd1cmUuaW59IHVzZXMgdGhlIEBzYW1we0FDX0NBTk9OSUNBTF9IT1NUfSBvcgotQHNhbXB7QUNfQ0FOT05JQ0FMX1NZU1RFTX0gbWFjcm8pLgotCi1Ac21hbGxleGFtcGxlCi1jYXNlICIkQHtob3N0QH0iIGluCi1pWzM0NTZdODYtKi1saW51eC1nbnUqKSBkbyBzb21ldGhpbmcgOzsKLXNwYXJjKi1zdW4tc29sYXJpczIuWzU2Nzg5XSopIGRvIHNvbWV0aGluZyA7Owotc3BhcmMqLXN1bi1zb2xhcmlzKikgZG8gc29tZXRoaW5nIDs7Ci1taXBzKi0qLWVsZiopIGRvIHNvbWV0aGluZyA7OwotZXNhYwotQGVuZCBzbWFsbGV4YW1wbGUKLQotSXQgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCB0byB1c2UgQHNhbXB7Kn0gYWZ0ZXIgdGhlIG9wZXJhdGluZyBzeXN0ZW0KLWZpZWxkLCBpbiBvcmRlciB0byBtYXRjaCB0aGUgdmVyc2lvbiBudW1iZXIgd2hpY2ggd2lsbCBiZSBnZW5lcmF0ZWQgYnkKLUBmaWxle2NvbmZpZy5ndWVzc30uCi0KLUluIG1vc3QgY2FzZXMgeW91IG11c3QgYmUgY2FyZWZ1bCB0byBtYXRjaCBhIHJhbmdlIG9mIHByb2Nlc3NvciB0eXBlcy4KLUZvciBtb3N0IHByb2Nlc3NvciBmYW1pbGllcywgYSB0cmFpbGluZyBAc2FtcHsqfSBzdWZmaWNlcywgYXMgaW4KLUBzYW1we21pcHMqfSBhYm92ZS4gIEZvciB0aGUgaTM4NiBmYW1pbHksIHNvbWV0aGluZyBhbG9uZyB0aGUgbGluZXMgb2YKLUBzYW1we2lbMzQ1Nl04Nn0gc3VmZmljZXMgYXQgcHJlc2VudC4gIEZvciB0aGUgbTY4ayBmYW1pbHksIHlvdSB3aWxsCi1uZWVkIHNvbWV0aGluZyBsaWtlIEBzYW1we202OCp9LiAgT2YgY291cnNlLCBpZiB5b3UgZG8gbm90IG5lZWQgdG8gbWF0Y2gKLW9uIHRoZSBwcm9jZXNzb3IsIGl0IGlzIHNpbXBsZXIgdG8ganVzdCByZXBsYWNlIHRoZSBlbnRpcmUgZmllbGQgYnkgYQotQHNhbXB7Kn0sIGFzIGluIEBzYW1weyotKi1pcml4Kn0uCi0KLUBub2RlIENyb3NzIENvbXBpbGF0aW9uIFRvb2xzCi1AY2hhcHRlciBDcm9zcyBDb21waWxhdGlvbiBUb29scwotQGNpbmRleCBjcm9zcyB0b29scwotCi1UaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIEBkZm57Y3Jvc3MKLWNvbXBpbGF0aW9ufSB0b29scy4gIEEgY3Jvc3MgY29tcGlsYXRpb24gdG9vbCBpcyBhIHRvb2wgd2hpY2ggcnVucyBvbgotb25lIHN5c3RlbSBhbmQgcHJvZHVjZXMgY29kZSB3aGljaCBydW5zIG9uIGFub3RoZXIgc3lzdGVtLgotCi1AbWVudQotKiBDcm9zcyBDb21waWxhdGlvbiBDb25jZXB0czo6CQlDcm9zcyBDb21waWxhdGlvbiBDb25jZXB0cy4KLSogSG9zdCBhbmQgVGFyZ2V0OjoJCQlIb3N0IGFuZCBUYXJnZXQuCi0qIFVzaW5nIHRoZSBIb3N0IFR5cGU6OgkJCVVzaW5nIHRoZSBIb3N0IFR5cGUuCi0qIFNwZWNpZnlpbmcgdGhlIFRhcmdldDo6ICAgICAgIAlTcGVjaWZ5aW5nIHRoZSBUYXJnZXQuCi0qIFVzaW5nIHRoZSBUYXJnZXQgVHlwZTo6CQlVc2luZyB0aGUgVGFyZ2V0IFR5cGUuCi0qIENyb3NzIFRvb2xzIGluIHRoZSBDeWdudXMgVHJlZTo6CUNyb3NzIFRvb2xzIGluIHRoZSBDeWdudXMgVHJlZQotQGVuZCBtZW51Ci0KLUBub2RlIENyb3NzIENvbXBpbGF0aW9uIENvbmNlcHRzCi1Ac2VjdGlvbiBDcm9zcyBDb21waWxhdGlvbiBDb25jZXB0cwotCi1AY2luZGV4IGNyb3NzIGNvbXBpbGVyCi1BIGNvbXBpbGVyIHdoaWNoIHByb2R1Y2VzIHByb2dyYW1zIHdoaWNoIHJ1biBvbiBhIGRpZmZlcmVudCBzeXN0ZW0gaXMgYQotY3Jvc3MgY29tcGlsYXRpb24gY29tcGlsZXIsIG9yIHNpbXBseSBhIEBkZm57Y3Jvc3MgY29tcGlsZXJ9LgotU2ltaWxhcmx5LCB3ZSBzcGVhayBvZiBjcm9zcyBhc3NlbWJsZXJzLCBjcm9zcyBsaW5rZXJzLCBldGMuCi0KLUluIHRoZSBub3JtYWwgY2FzZSwgYSBjb21waWxlciBwcm9kdWNlcyBjb2RlIHdoaWNoIHJ1bnMgb24gdGhlIHNhbWUKLXN5c3RlbSBhcyB0aGUgb25lIG9uIHdoaWNoIHRoZSBjb21waWxlciBydW5zLiAgV2hlbiBpdCBpcyBuZWNlc3NhcnkgdG8KLWRpc3Rpbmd1aXNoIHRoaXMgY2FzZSBmcm9tIHRoZSBjcm9zcyBjb21waWxhdGlvbiBjYXNlLCBzdWNoIGEgY29tcGlsZXIKLWlzIGNhbGxlZCBhIEBkZm57bmF0aXZlIGNvbXBpbGVyfS4gIFNpbWlsYXJseSwgd2Ugc3BlYWsgb2YgbmF0aXZlCi1hc3NlbWJsZXJzLCBldGMuCi0KLUFsdGhvdWdoIHRoZSBkZWJ1Z2dlciBpcyBub3Qgc3RyaWN0bHkgc3BlYWtpbmcgYSBjb21waWxhdGlvbiB0b29sLCBpdCBpcwotbmV2ZXJ0aGVsZXNzIG1lYW5pbmdmdWwgdG8gc3BlYWsgb2YgYSBjcm9zcyBkZWJ1Z2dlcjogYSBkZWJ1Z2dlciB3aGljaAotaXMgdXNlZCB0byBkZWJ1ZyBjb2RlIHdoaWNoIHJ1bnMgb24gYW5vdGhlciBzeXN0ZW0uICBFdmVyeXRoaW5nIHRoYXQgaXMKLXNhaWQgYmVsb3cgYWJvdXQgY29uZmlndXJpbmcgY3Jvc3MgY29tcGlsYXRpb24gdG9vbHMgYXBwbGllcyB0byB0aGUKLWRlYnVnZ2VyIGFzIHdlbGwuCi0KLUBub2RlIEhvc3QgYW5kIFRhcmdldAotQHNlY3Rpb24gSG9zdCBhbmQgVGFyZ2V0Ci1AY2luZGV4IGhvc3Qgc3lzdGVtCi1AY2luZGV4IHRhcmdldCBzeXN0ZW0KLQotV2hlbiBidWlsZGluZyBjcm9zcyBjb21waWxhdGlvbiB0b29scywgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgc3lzdGVtcwotaW52b2x2ZWQ6IHRoZSBzeXN0ZW0gb24gd2hpY2ggdGhlIHRvb2xzIHdpbGwgcnVuLCBhbmQgdGhlIHN5c3RlbSBmb3IKLXdoaWNoIHRoZSB0b29scyBnZW5lcmF0ZSBjb2RlLgotCi1UaGUgc3lzdGVtIG9uIHdoaWNoIHRoZSB0b29scyB3aWxsIHJ1biBpcyBjYWxsZWQgdGhlIEBkZm57aG9zdH0gc3lzdGVtLgotCi1UaGUgc3lzdGVtIGZvciB3aGljaCB0aGUgdG9vbHMgZ2VuZXJhdGUgY29kZSBpcyBjYWxsZWQgdGhlIEBkZm57dGFyZ2V0fQotc3lzdGVtLgotCi1Gb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGF2ZSBhIGNvbXBpbGVyIHdoaWNoIHJ1bnMgb24gYSBHTlUvTGludXgKLXN5c3RlbSBhbmQgZ2VuZXJhdGVzIEVMRiBwcm9ncmFtcyBmb3IgYSBNSVBTIGVtYmVkZGVkIHN5c3RlbS4gIEluIHRoaXMKLWNhc2UgdGhlIEdOVS9MaW51eCBzeXN0ZW0gaXMgdGhlIGhvc3QsIGFuZCB0aGUgTUlQUyBFTEYgc3lzdGVtIGlzIHRoZQotdGFyZ2V0LiAgU3VjaCBhIGNvbXBpbGVyIGNvdWxkIGJlIGNhbGxlZCBhIEdOVS9MaW51eCBjcm9zcyBNSVBTIEVMRgotY29tcGlsZXIsIG9yLCBlcXVpdmFsZW50bHksIGEgQHNhbXB7aTM4Ni1saW51eC1nbnV9IGNyb3NzCi1Ac2FtcHttaXBzLWVsZn0gY29tcGlsZXIuCi0KLU5hdHVyYWxseSwgbW9zdCBwcm9ncmFtcyBhcmUgbm90IGNyb3NzIGNvbXBpbGF0aW9uIHRvb2xzLiAgRm9yIHRob3NlCi1wcm9ncmFtcywgaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBzcGVhayBvZiBhIHRhcmdldC4gIEl0IG9ubHkgbWFrZXMKLXNlbnNlIHRvIHNwZWFrIG9mIGEgdGFyZ2V0IGZvciB0b29scyBsaWtlIEBzYW1we2djY30gb3IgdGhlCi1Ac2FtcHtiaW51dGlsc30gd2hpY2ggYWN0dWFsbHkgcHJvZHVjZSBydW5uaW5nIGNvZGUuICBGb3IgZXhhbXBsZSwgaXQKLWRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gc3BlYWsgb2YgdGhlIHRhcmdldCBvZiBhIHRvb2wgbGlrZSBAc2FtcHtiaXNvbn0KLW9yIEBzYW1we21ha2V9LgotCi1Nb3N0IGNyb3NzIGNvbXBpbGF0aW9uIHRvb2xzIGNhbiBhbHNvIHNlcnZlIGFzIG5hdGl2ZSB0b29scy4gIEZvciBhCi1uYXRpdmUgY29tcGlsYXRpb24gdG9vbCwgaXQgaXMgc3RpbGwgbWVhbmluZ2Z1bCB0byBzcGVhayBvZiBhIHRhcmdldC4KLUZvciBhIG5hdGl2ZSB0b29sLCB0aGUgdGFyZ2V0IGlzIHRoZSBzYW1lIGFzIHRoZSBob3N0LiAgRm9yIGV4YW1wbGUsIGZvcgotYSBHTlUvTGludXggbmF0aXZlIGNvbXBpbGVyLCB0aGUgaG9zdCBpcyBHTlUvTGludXgsIGFuZCB0aGUgdGFyZ2V0IGlzCi1hbHNvIEdOVS9MaW51eC4KLQotQG5vZGUgVXNpbmcgdGhlIEhvc3QgVHlwZQotQHNlY3Rpb24gVXNpbmcgdGhlIEhvc3QgVHlwZQotCi1JbiBhbG1vc3QgYWxsIGNhc2VzIHRoZSBob3N0IHN5c3RlbSBpcyB0aGUgc3lzdGVtIG9uIHdoaWNoIHlvdSBydW4gdGhlCi1Ac2FtcHtjb25maWd1cmV9IHNjcmlwdCwgYW5kIG9uIHdoaWNoIHlvdSBidWlsZCB0aGUgdG9vbHMgKGZvciB0aGUgY2FzZQotd2hlbiB0aGV5IGRpZmZlciwgQHB4cmVme0NhbmFkaWFuIENyb3NzfSkuCi0KLUBjaW5kZXggQHNhbXB7QUNfQ0FOT05JQ0FMX0hPU1R9Ci1JZiB5b3VyIGNvbmZpZ3VyZSBzY3JpcHQgbmVlZHMgdG8ga25vdyB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZQotaG9zdCBzeXN0ZW0sIGFuZCB0aGUgcGFja2FnZSBpcyBub3QgYSBjcm9zcyBjb21waWxhdGlvbiB0b29sIGFuZAotdGhlcmVmb3JlIGRvZXMgbm90IGhhdmUgYSB0YXJnZXQsIHB1dCBAc2FtcHtBQ19DQU5PTklDQUxfSE9TVH0gaW4KLUBmaWxle2NvbmZpZ3VyZS5pbn0uICBUaGlzIG1hY3JvIHdpbGwgYXJyYW5nZSB0byBkZWZpbmUgYSBmZXcgc2hlbGwKLXZhcmlhYmxlcyB3aGVuIHRoZSBAc2FtcHtjb25maWd1cmV9IHNjcmlwdCBpcyBydW4uCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gaG9zdAotVGhlIGNhbm9uaWNhbCBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIGhvc3QuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUKLWRldGVybWluZWQgYnkgcnVubmluZyB0aGUgQGZpbGV7Y29uZmlnLmd1ZXNzfSBzaGVsbCBzY3JpcHQsIGFsdGhvdWdoIHRoZQotdXNlciBpcyBwZXJtaXR0ZWQgdG8gb3ZlcnJpZGUgdGhpcyBieSB1c2luZyBhbiBleHBsaWNpdCBAc2FtcHstLWhvc3R9Ci1vcHRpb24uCi1AaXRlbSBob3N0X2FsaWFzCi1JbiB0aGUgdW51c3VhbCBjYXNlIHRoYXQgdGhlIHVzZXIgdXNlZCBhbiBleHBsaWNpdCBAc2FtcHstLWhvc3R9IG9wdGlvbiwKLXRoaXMgd2lsbCBiZSB0aGUgYXJndW1lbnQgdG8gQHNhbXB7LS1ob3N0fS4gIEluIHRoZSBub3JtYWwgY2FzZSwgdGhpcwotd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgQHNhbXB7aG9zdH0gdmFyaWFibGUuCi1AaXRlbSBob3N0X2NwdQotQGl0ZW14IGhvc3RfdmVuZG9yCi1AaXRlbXggaG9zdF9vcwotVGhlIGZpcnN0IHRocmVlIHBhcnRzIG9mIHRoZSBjYW5vbmljYWwgY29uZmlndXJhdGlvbiBuYW1lLgotQGVuZCB0YWJsZQotCi1UaGUgc2hlbGwgdmFyaWFibGVzIG1heSBiZSB1c2VkIGJ5IHB1dHRpbmcgc2hlbGwgY29kZSBpbgotQGZpbGV7Y29uZmlndXJlLmlufS4gIEZvciBhbiBleGFtcGxlLCBzZWUgQHJlZntVc2luZyBDb25maWd1cmF0aW9uCi1OYW1lc30uCi0KLUBub2RlIFNwZWNpZnlpbmcgdGhlIFRhcmdldAotQHNlY3Rpb24gU3BlY2lmeWluZyB0aGUgVGFyZ2V0Ci0KLUJ5IGRlZmF1bHQsIHRoZSBAc2FtcHtjb25maWd1cmV9IHNjcmlwdCB3aWxsIGFzc3VtZSB0aGF0IHRoZSB0YXJnZXQgaXMKLXRoZSBzYW1lIGFzIHRoZSBob3N0LiAgVGhpcyBpcyB0aGUgbW9yZSBjb21tb24gY2FzZTsgZm9yIGV4YW1wbGUsIGl0Ci1sZWFkcyB0byBhIG5hdGl2ZSBjb21waWxlciByYXRoZXIgdGhhbiBhIGNyb3NzIGNvbXBpbGVyLgotCi1AY2luZGV4IEBzYW1wey0tdGFyZ2V0fSBvcHRpb24KLUBjaW5kZXggdGFyZ2V0IG9wdGlvbgotQGNpbmRleCBjb25maWd1cmUgdGFyZ2V0Ci1JZiB5b3Ugd2FudCB0byBidWlsZCBhIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2wsIHlvdSBtdXN0IHNwZWNpZnkgdGhlCi10YXJnZXQgZXhwbGljaXRseSBieSB1c2luZyB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiB3aGVuIHlvdSBydW4KLUBzYW1we2NvbmZpZ3VyZX0uICBUaGUgYXJndW1lbnQgdG8gQHNhbXB7LS10YXJnZXR9IGlzIHRoZSBjb25maWd1cmF0aW9uCi1uYW1lIG9mIHRoZSBzeXN0ZW0gZm9yIHdoaWNoIHlvdSB3aXNoIHRvIGdlbmVyYXRlIGNvZGUuCi1AeHJlZntDb25maWd1cmF0aW9uIE5hbWVzfS4KLQotRm9yIGV4YW1wbGUsIHRvIGJ1aWxkIHRvb2xzIHdoaWNoIGdlbmVyYXRlIGNvZGUgZm9yIGEgTUlQUyBFTEYgZW1iZWRkZWQKLXN5c3RlbSwgeW91IHdvdWxkIHVzZSBAc2FtcHstLXRhcmdldCBtaXBzLWVsZn0uCi0KLUBub2RlIFVzaW5nIHRoZSBUYXJnZXQgVHlwZQotQHNlY3Rpb24gVXNpbmcgdGhlIFRhcmdldCBUeXBlCi0KLUBjaW5kZXggQHNhbXB7QUNfQ0FOT05JQ0FMX1NZU1RFTX0KLVdoZW4gd3JpdGluZyBAZmlsZXtjb25maWd1cmUuaW59IGZvciBhIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2wsIHlvdSB3aWxsCi1uZWVkIHRvIHVzZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFyZ2V0LiAgVG8gZG8gdGhpcywgcHV0Ci1Ac2FtcHtBQ19DQU5PTklDQUxfU1lTVEVNfSBpbiBAZmlsZXtjb25maWd1cmUuaW59LgotCi1Ac2FtcHtBQ19DQU5PTklDQUxfU1lTVEVNfSB3aWxsIGxvb2sgZm9yIGEgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiBhbmQKLWNhbm9uaWNhbGl6ZSBpdCB1c2luZyB0aGUgQGZpbGV7Y29uZmlnLnN1Yn0gc2hlbGwgc2NyaXB0LiAgSXQgd2lsbCBhbHNvCi1ydW4gQHNhbXB7QUNfQ0FOT05JQ0FMX0hPU1R9IChAcHhyZWZ7VXNpbmcgdGhlIEhvc3QgVHlwZX0pLgotCi1UaGUgdGFyZ2V0IHR5cGUgd2lsbCBiZSByZWNvcmRlZCBpbiB0aGUgZm9sbG93aW5nIHNoZWxsIHZhcmlhYmxlcy4gIE5vdGUKLXRoYXQgdGhlIGhvc3QgdmVyc2lvbnMgb2YgdGhlc2UgdmFyaWFibGVzIHdpbGwgYWxzbyBiZSBkZWZpbmVkIGJ5Ci1Ac2FtcHtBQ19DQU5PTklDQUxfSE9TVH0uCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gdGFyZ2V0Ci1UaGUgY2Fub25pY2FsIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgdGFyZ2V0LgotQGl0ZW0gdGFyZ2V0X2FsaWFzCi1UaGUgYXJndW1lbnQgdG8gdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24uICBJZiB0aGUgdXNlciBkaWQgbm90IHNwZWNpZnkKLWEgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiwgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIEBzYW1we2hvc3RfYWxpYXN9LgotQGl0ZW0gdGFyZ2V0X2NwdQotQGl0ZW14IHRhcmdldF92ZW5kb3IKLUBpdGVteCB0YXJnZXRfb3MKLVRoZSBmaXJzdCB0aHJlZSBwYXJ0cyBvZiB0aGUgY2Fub25pY2FsIHRhcmdldCBjb25maWd1cmF0aW9uIG5hbWUuCi1AZW5kIHRhYmxlCi0KLU5vdGUgdGhhdCBpZiBAc2FtcHtob3N0fSBhbmQgQHNhbXB7dGFyZ2V0fSBhcmUgdGhlIHNhbWUgc3RyaW5nLCB5b3UgY2FuCi1hc3N1bWUgYSBuYXRpdmUgY29uZmlndXJhdGlvbi4gIElmIHRoZXkgYXJlIGRpZmZlcmVudCwgeW91IGNhbiBhc3N1bWUgYQotY3Jvc3MgY29uZmlndXJhdGlvbi4KLQotSXQgaXMgYXJndWFibHkgcG9zc2libGUgZm9yIEBzYW1we2hvc3R9IGFuZCBAc2FtcHt0YXJnZXR9IHRvIHJlcHJlc2VudAotdGhlIHNhbWUgc3lzdGVtLCBidXQgZm9yIHRoZSBzdHJpbmdzIHRvIG5vdCBiZSBpZGVudGljYWwuICBGb3IgZXhhbXBsZSwKLWlmIEBzYW1we2NvbmZpZy5ndWVzc30gcmV0dXJucyBAc2FtcHtzcGFyYy1zdW4tc3Vub3M0LjEuNH0sIGFuZCBzb21lYm9keQotY29uZmlndXJlcyB3aXRoIEBzYW1wey0tdGFyZ2V0IHNwYXJjLXN1bi1zdW5vczQuMX0sIHRoZW4gdGhlIHNsaWdodAotZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIG9mIFN1bk9TIG1heSBiZSB1bmltcG9ydGFudCBmb3IKLXlvdXIgdG9vbC4gIEhvd2V2ZXIsIGluIHRoZSBnZW5lcmFsIGNhc2UgaXQgY2FuIGJlIHF1aXRlIGRpZmZpY3VsdCB0bwotZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIGNvbmZpZ3VyYXRpb24gbmFtZXMgYXJlCi1zaWduaWZpY2FudCBvciBub3QuICBUaGVyZWZvcmUsIGJ5IGNvbnZlbnRpb24sIGlmIHRoZSB1c2VyIHNwZWNpZmllcyBhCi1Ac2FtcHstLXRhcmdldH0gb3B0aW9uIHdpdGhvdXQgc3BlY2lmeWluZyBhIEBzYW1wey0taG9zdH0gb3B0aW9uLCBpdCBpcwotYXNzdW1lZCB0aGF0IHRoZSB1c2VyIHdhbnRzIHRvIGNvbmZpZ3VyZSBhIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2wuCi0KLVRoZSB2YXJpYWJsZXMgQHNhbXB7dGFyZ2V0fSBhbmQgQHNhbXB7dGFyZ2V0X2FsaWFzfSBzaG91bGQgYmUgaGFuZGxlZAotZGlmZmVyZW50bHkuCi0KLUluIGdlbmVyYWwsIHdoZW5ldmVyIHRoZSB1c2VyIG1heSBhY3R1YWxseSBzZWUgYSBzdHJpbmcsCi1Ac2FtcHt0YXJnZXRfYWxpYXN9IHNob3VsZCBiZSB1c2VkLiAgVGhpcyBpbmNsdWRlcyBhbnl0aGluZyB3aGljaCBtYXkKLWFwcGVhciBpbiB0aGUgZmlsZSBzeXN0ZW0sIHN1Y2ggYXMgYSBkaXJlY3RvcnkgbmFtZSBvciBwYXJ0IG9mIGEgdG9vbAotbmFtZS4gIEl0IGFsc28gaW5jbHVkZXMgYW55IHRvb2wgb3V0cHV0LCB1bmxlc3MgaXQgaXMgY2xlYXJseSBsYWJlbGxlZAotYXMgdGhlIGNhbm9uaWNhbCB0YXJnZXQgY29uZmlndXJhdGlvbiBuYW1lLiAgVGhpcyBwZXJtaXRzIHRoZSB1c2VyIHRvCi11c2UgdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gdG8gc3BlY2lmeSBob3cgdGhlIHRvb2wgd2lsbCBhcHBlYXIgdG8KLXRoZSBvdXRzaWRlIHdvcmxkLgotCi1PbiB0aGUgb3RoZXIgaGFuZCwgd2hlbiBjaGVja2luZyBmb3IgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSB0YXJnZXQKLXN5c3RlbSwgQHNhbXB7dGFyZ2V0fSBzaG91bGQgYmUgdXNlZC4gIFRoaXMgaXMgYmVjYXVzZSBhIHdpZGUgdmFyaWV0eSBvZgotQHNhbXB7LS10YXJnZXR9IG9wdGlvbnMgbWF5IG1hcCBpbnRvIHRoZSBzYW1lIGNhbm9uaWNhbCBjb25maWd1cmF0aW9uCi1uYW1lLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byBkdXBsaWNhdGUgdGhlIGNhbm9uaWNhbGl6YXRpb24gZG9uZSBieQotQHNhbXB7Y29uZmlnLnN1Yn0gaW4geW91ciBvd24gY29kZS4KLQotQnkgY29udmVudGlvbiwgY3Jvc3MgdG9vbHMgYXJlIGluc3RhbGxlZCB3aXRoIGEgcHJlZml4IG9mIHRoZSBhcmd1bWVudAotdXNlZCB3aXRoIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uLCBhbHNvIGtub3duIGFzIEBzYW1we3RhcmdldF9hbGlhc30KLShAcHhyZWZ7VXNpbmcgdGhlIFRhcmdldCBUeXBlfSkuICBJZiB0aGUgdXNlciBkb2VzIG5vdCB1c2UgdGhlCi1Ac2FtcHstLXRhcmdldH0gb3B0aW9uLCBhbmQgdGh1cyBpcyBidWlsZGluZyBhIG5hdGl2ZSB0b29sLCBubyBwcmVmaXggaXMKLXVzZWQuCi0KLUZvciBleGFtcGxlLCBpZiBnY2MgaXMgY29uZmlndXJlZCB3aXRoIEBzYW1wey0tdGFyZ2V0IG1pcHMtZWxmfSwgdGhlbgotdGhlIGluc3RhbGxlZCBiaW5hcnkgd2lsbCBiZSBuYW1lZCBAc2FtcHttaXBzLWVsZi1nY2N9LiAgSWYgZ2NjIGlzCi1jb25maWd1cmVkIHdpdGhvdXQgYSBAc2FtcHstLXRhcmdldH0gb3B0aW9uLCB0aGVuIHRoZSBpbnN0YWxsZWQgYmluYXJ5Ci13aWxsIGJlIG5hbWVkIEBzYW1we2djY30uCi0KLVRoZSBhdXRvY29uZiBtYWNybyBAc2FtcHtBQ19BUkdfUFJPR1JBTX0gd2lsbCBoYW5kbGUgdGhpcyBmb3IgeW91LiAgSWYKLXlvdSBhcmUgdXNpbmcgYXV0b21ha2UsIG5vIG1vcmUgbmVlZCBiZSBkb25lOyB0aGUgcHJvZ3JhbXMgd2lsbAotYXV0b21hdGljYWxseSBiZSBpbnN0YWxsZWQgd2l0aCB0aGUgY29ycmVjdCBwcmVmaXhlcy4gIE90aGVyd2lzZSwgc2VlCi10aGUgYXV0b2NvbmYgZG9jdW1lbnRhdGlvbiBmb3IgQHNhbXB7QUNfQVJHX1BST0dSQU19LgotCi1Abm9kZSBDcm9zcyBUb29scyBpbiB0aGUgQ3lnbnVzIFRyZWUKLUBzZWN0aW9uIENyb3NzIFRvb2xzIGluIHRoZSBDeWdudXMgVHJlZQotCi1UaGUgQ3lnbnVzIHRyZWUgaXMgdXNlZCBmb3IgdmFyaW91cyBwYWNrYWdlcyBpbmNsdWRpbmcgZ2RiLCB0aGUgR05VCi1iaW51dGlscywgYW5kIGVnY3MuICBJdCBpcyBhbHNvLCBvZiBjb3Vyc2UsIHVzZWQgZm9yIEN5Z251cyByZWxlYXNlcy4KLQotSW4gdGhlIEN5Z251cyB0cmVlLCB0aGUgdG9wIGxldmVsIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHVzZXMgdGhlIG9sZAotQ3lnbnVzIGNvbmZpZ3VyZSBzeXN0ZW0sIG5vdCBhdXRvY29uZi4gIFRoZSB0b3AgbGV2ZWwgQGZpbGV7TWFrZWZpbGUuaW59Ci1pcyB3cml0dGVuIHRvIGJ1aWxkIHBhY2thZ2VzIGJhc2VkIG9uIHdoYXQgaXMgaW4gdGhlIHNvdXJjZSB0cmVlLCBhbmQKLXN1cHBvcnRzIGJ1aWxkaW5nIGEgbGFyZ2UgbnVtYmVyIG9mIHRvb2xzIGluIGEgc2luZ2xlCi1Ac2FtcHtjb25maWd1cmV9L0BzYW1we21ha2V9IHN0ZXAuCi0KLVRoZSBDeWdudXMgdHJlZSBtYXkgYmUgY29uZmlndXJlZCB3aXRoIGEgQHNhbXB7LS10YXJnZXR9IG9wdGlvbi4gIFRoZQotQHNhbXB7LS10YXJnZXR9IG9wdGlvbiBhcHBsaWVzIHJlY3Vyc2l2ZWx5IHRvIGV2ZXJ5IHN1YmRpcmVjdG9yeSwgYW5kCi1wZXJtaXRzIGJ1aWxkaW5nIGFuIGVudGlyZSBzZXQgb2YgY3Jvc3MgdG9vbHMgYXQgb25jZS4KLQotQG1lbnUKLSogSG9zdCBhbmQgVGFyZ2V0IExpYnJhcmllczo6CQlIb3N0IGFuZCBUYXJnZXQgTGlicmFyaWVzLgotKiBUYXJnZXQgTGlicmFyeSBDb25maWd1cmUgU2NyaXB0czo6CVRhcmdldCBMaWJyYXJ5IENvbmZpZ3VyZSBTY3JpcHRzLgotKiBNYWtlIFRhcmdldHMgaW4gQ3lnbnVzIFRyZWU6OiAgICAgICAgIE1ha2UgVGFyZ2V0cyBpbiBDeWdudXMgVHJlZS4KLSogVGFyZ2V0IGxpYmliZXJ0eTo6CQkJVGFyZ2V0IGxpYmliZXJ0eQotQGVuZCBtZW51Ci0KLUBub2RlIEhvc3QgYW5kIFRhcmdldCBMaWJyYXJpZXMKLUBzdWJzZWN0aW9uIEhvc3QgYW5kIFRhcmdldCBMaWJyYXJpZXMKLQotVGhlIEN5Z251cyB0cmVlIGRpc3Rpbmd1aXNoZXMgaG9zdCBsaWJyYXJpZXMgZnJvbSB0YXJnZXQgbGlicmFyaWVzLgotCi1Ib3N0IGxpYnJhcmllcyBhcmUgYnVpbHQgd2l0aCB0aGUgY29tcGlsZXIgdXNlZCB0byBidWlsZCB0aGUgcHJvZ3JhbXMKLXdoaWNoIHJ1biBvbiB0aGUgaG9zdCwgd2hpY2ggaXMgY2FsbGVkIHRoZSBob3N0IGNvbXBpbGVyLiAgVGhpcyBpbmNsdWRlcwotbGlicmFyaWVzIHN1Y2ggYXMgQHNhbXB7YmZkfSBhbmQgQHNhbXB7dGNsfS4gIFRoZXNlIGxpYnJhcmllcyBhcmUgYnVpbHQKLXdpdGggdGhlIGhvc3QgY29tcGlsZXIsIGFuZCBhcmUgbGlua2VkIGludG8gcHJvZ3JhbXMgbGlrZSB0aGUgYmludXRpbHMKLW9yIGdjYyB3aGljaCBydW4gb24gdGhlIGhvc3QuCi0KLVRhcmdldCBsaWJyYXJpZXMgYXJlIGJ1aWx0IHdpdGggdGhlIHRhcmdldCBjb21waWxlci4gIElmIGdjYyBpcyBwcmVzZW50Ci1pbiB0aGUgc291cmNlIHRyZWUsIHRoZW4gdGhlIHRhcmdldCBjb21waWxlciBpcyB0aGUgZ2NjIHRoYXQgaXMgYnVpbHQKLXVzaW5nIHRoZSBob3N0IGNvbXBpbGVyLiAgVGFyZ2V0IGxpYnJhcmllcyBhcmUgbGlicmFyaWVzIHN1Y2ggYXMKLUBzYW1we25ld2xpYn0gYW5kIEBzYW1we2xpYnN0ZGMrK30uICBUaGVzZSBsaWJyYXJpZXMgYXJlIG5vdCBsaW5rZWQgaW50bwotdGhlIGhvc3QgcHJvZ3JhbXMsIGJ1dCBhcmUgaW5zdGVhZCBtYWRlIGF2YWlsYWJsZSBmb3IgdXNlIHdpdGggcHJvZ3JhbXMKLWJ1aWx0IHdpdGggdGhlIHRhcmdldCBjb21waWxlci4KLQotRm9yIHRoZSByZXN0IG9mIHRoaXMgc2VjdGlvbiwgYXNzdW1lIHRoYXQgZ2NjIGlzIHByZXNlbnQgaW4gdGhlIHNvdXJjZQotdHJlZSwgc28gdGhhdCBpdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgdGhlIHRhcmdldCBsaWJyYXJpZXMuCi0KLVRoZXJlIGlzIGEgY29tcGxpY2F0aW9uIGhlcmUuICBUaGUgY29uZmlndXJlIHByb2Nlc3MgbmVlZHMgdG8ga25vdyB3aGljaAotY29tcGlsZXIgeW91IGFyZSBnb2luZyB0byB1c2UgdG8gYnVpbGQgYSB0b29sOyBvdGhlcndpc2UsIHRoZSBmZWF0dXJlCi10ZXN0cyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseS4gIFRoZSBDeWdudXMgdHJlZSBoYW5kbGVzIHRoaXMgYnkgbm90Ci1jb25maWd1cmluZyB0aGUgdGFyZ2V0IGxpYnJhcmllcyB1bnRpbCB0aGUgdGFyZ2V0IGNvbXBpbGVyIGlzIGJ1aWx0LiAgSW4KLW9yZGVyIHRvIHBlcm1pdCBldmVyeXRoaW5nIHRvIGJ1aWxkIHVzaW5nIGEgc2luZ2xlCi1Ac2FtcHtjb25maWd1cmV9L0BzYW1we21ha2V9LCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFyZ2V0IGxpYnJhcmllcwotaXMgYWN0dWFsbHkgdHJpZ2dlcmVkIGR1cmluZyB0aGUgbWFrZSBzdGVwLgotCi1XaGVuIHRoZSB0YXJnZXQgbGlicmFyaWVzIGFyZSBjb25maWd1cmVkLCB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiBpcwotbm90IHVzZWQuICBJbnN0ZWFkLCB0aGUgQHNhbXB7LS1ob3N0fSBvcHRpb24gaXMgdXNlZCB3aXRoIHRoZSBhcmd1bWVudAotb2YgdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gZm9yIHRoZSBvdmVyYWxsIGNvbmZpZ3VyYXRpb24uICBJZiBubwotQHNhbXB7LS10YXJnZXR9IG9wdGlvbiB3YXMgdXNlZCBmb3IgdGhlIG92ZXJhbGwgY29uZmlndXJhdGlvbiwgdGhlCi1Ac2FtcHstLWhvc3R9IG9wdGlvbiB3aWxsIGJlIHBhc3NlZCB3aXRoIHRoZSBvdXRwdXQgb2YgdGhlCi1AZmlsZXtjb25maWcuZ3Vlc3N9IHNoZWxsIHNjcmlwdC4gIEFueSBAc2FtcHstLWJ1aWxkfSBvcHRpb24gaXMgcGFzc2VkCi1kb3duIHVuY2hhbmdlZC4KLQotVGhpcyB0cmFuc2xhdGlvbiBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMgaXMgZG9uZSBiZWNhdXNlIHNpbmNlIHRoZQotdGFyZ2V0IGxpYnJhcmllcyBhcmUgY29tcGlsZWQgd2l0aCB0aGUgdGFyZ2V0IGNvbXBpbGVyLCB0aGV5IGFyZSBiZWluZwotYnVpbHQgaW4gb3JkZXIgdG8gcnVuIG9uIHRoZSB0YXJnZXQgb2YgdGhlIG92ZXJhbGwgY29uZmlndXJhdGlvbi4gIEJ5Ci10aGUgZGVmaW5pdGlvbiBvZiBob3N0LCB0aGlzIG1lYW5zIHRoYXQgdGhlaXIgaG9zdCBzeXN0ZW0gaXMgdGhlIHNhbWUgYXMKLXRoZSB0YXJnZXQgc3lzdGVtIG9mIHRoZSBvdmVyYWxsIGNvbmZpZ3VyYXRpb24uCi0KLVRoZSBzYW1lIHByb2Nlc3MgaXMgdXNlZCBmb3IgYm90aCBhIG5hdGl2ZSBjb25maWd1cmF0aW9uIGFuZCBhIGNyb3NzCi1jb25maWd1cmF0aW9uLiAgRXZlbiB3aGVuIHVzaW5nIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24sIHRoZSB0YXJnZXQKLWxpYnJhcmllcyB3aWxsIGJlIGNvbmZpZ3VyZWQgYW5kIGJ1aWx0IHVzaW5nIHRoZSBuZXdseSBidWlsdCBjb21waWxlci4KLVRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgdGhlIEMrKyBsaWJyYXJpZXMsIHNpbmNlIHRoZXJlIGlzIG5vCi1yZWFzb24gdG8gYXNzdW1lIHRoYXQgdGhlIEMrKyBjb21waWxlciB1c2VkIHRvIGJ1aWxkIHRoZSBob3N0IHRvb2xzIChpZgotdGhlcmUgZXZlbiBpcyBvbmUpIHVzZXMgdGhlIHNhbWUgQUJJIGFzIHRoZSBnKysgY29tcGlsZXIgd2hpY2ggd2lsbCBiZQotdXNlZCB0byBidWlsZCB0aGUgdGFyZ2V0IGxpYnJhcmllcy4KLQotVGhlcmUgaXMgb25lIGRpZmZlcmVuY2UgYmV0d2VlbiBhIG5hdGl2ZSBjb25maWd1cmF0aW9uIGFuZCBhIGNyb3NzCi1jb25maWd1cmF0aW9uLiAgSW4gYSBuYXRpdmUgY29uZmlndXJhdGlvbiwgdGhlIHRhcmdldCBsaWJyYXJpZXMgYXJlCi1ub3JtYWxseSBjb25maWd1cmVkIGFuZCBidWlsdCBhcyBzaWJsaW5ncyBvZiB0aGUgaG9zdCB0b29scy4gIEluIGEgY3Jvc3MKLWNvbmZpZ3VyYXRpb24sIHRoZSB0YXJnZXQgbGlicmFyaWVzIGFyZSBub3JtYWxseSBidWlsdCBpbiBhIHN1YmRpcmVjdG9yeQotd2hvc2UgbmFtZSBpcyB0aGUgYXJndW1lbnQgdG8gQHNhbXB7LS10YXJnZXR9LiAgVGhpcyBpcyBtYWlubHkgZm9yCi1oaXN0b3JpY2FsIHJlYXNvbnMuCi0KLVRvIHN1bW1hcml6ZSwgcnVubmluZyBAc2FtcHtjb25maWd1cmV9IGluIHRoZSBDeWdudXMgdHJlZSBjb25maWd1cmVzIGFsbAotdGhlIGhvc3QgbGlicmFyaWVzIGFuZCB0b29scywgYnV0IGRvZXMgbm90IGNvbmZpZ3VyZSBhbnkgb2YgdGhlIHRhcmdldAotbGlicmFyaWVzLiAgUnVubmluZyBAc2FtcHttYWtlfSB0aGVuIGRvZXMgdGhlIGZvbGxvd2luZyBzdGVwczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUJ1aWxkIHRoZSBob3N0IGxpYnJhcmllcy4KLUBpdGVtCi1CdWlsZCB0aGUgaG9zdCBwcm9ncmFtcywgaW5jbHVkaW5nIGdjYy4gIE5vdGUgdGhhdCB3ZSBjYWxsIGdjYyBib3RoIGEKLWhvc3QgcHJvZ3JhbSAoc2luY2UgaXQgcnVucyBvbiB0aGUgaG9zdCkgYW5kIGEgdGFyZ2V0IGNvbXBpbGVyIChzaW5jZSBpdAotZ2VuZXJhdGVzIGNvZGUgZm9yIHRoZSB0YXJnZXQpLgotQGl0ZW0KLVVzaW5nIHRoZSBuZXdseSBidWlsdCB0YXJnZXQgY29tcGlsZXIsIGNvbmZpZ3VyZSB0aGUgdGFyZ2V0IGxpYnJhcmllcy4KLUBpdGVtCi1CdWlsZCB0aGUgdGFyZ2V0IGxpYnJhcmllcy4KLUBlbmQgaXRlbWl6ZQotCi1UaGUgc3RlcHMgbmVlZCBub3QgYmUgZG9uZSBpbiBwcmVjaXNlbHkgdGhpcyBvcmRlciwgc2luY2UgdGhleSBhcmUKLWFjdHVhbGx5IGNvbnRyb2xsZWQgYnkgQGZpbGV7TWFrZWZpbGV9IHRhcmdldHMuCi0KLUBub2RlIFRhcmdldCBMaWJyYXJ5IENvbmZpZ3VyZSBTY3JpcHRzCi1Ac3Vic2VjdGlvbiBUYXJnZXQgTGlicmFyeSBDb25maWd1cmUgU2NyaXB0cwotCi1UaGVyZSBhcmUgYSBmZXcgdGhpbmdzIHlvdSBtdXN0IGtub3cgaW4gb3JkZXIgdG8gd3JpdGUgYSBjb25maWd1cmUKLXNjcmlwdCBmb3IgYSB0YXJnZXQgbGlicmFyeS4gIFRoaXMgaXMganVzdCBhIHF1aWNrIHNrZXRjaCwgYW5kIGJlZ2lubmVycwotc2hvdWxkbid0IHdvcnJ5IGlmIHRoZXkgZG9uJ3QgZm9sbG93IGV2ZXJ5dGhpbmcgaGVyZS4KLQotVGhlIHRhcmdldCBsaWJyYXJpZXMgYXJlIGNvbmZpZ3VyZWQgYW5kIGJ1aWx0IHVzaW5nIGEgbmV3bHkgYnVpbHQgdGFyZ2V0Ci1jb21waWxlci4gIFRoZXJlIG1heSBub3QgYmUgYW55IHN0YXJ0dXAgZmlsZXMgb3IgbGlicmFyaWVzIGZvciB0aGlzCi10YXJnZXQgY29tcGlsZXIuICBJbiBmYWN0LCB0aG9zZSBmaWxlcyB3aWxsIHByb2JhYmx5IGJlIGJ1aWx0IGFzIHBhcnQgb2YKLXNvbWUgdGFyZ2V0IGxpYnJhcnksIHdoaWNoIG5hdHVyYWxseSBtZWFucyB0aGF0IHRoZXkgd2lsbCBub3QgZXhpc3Qgd2hlbgoteW91ciB0YXJnZXQgbGlicmFyeSBpcyBjb25maWd1cmVkLgotCi1UaGlzIG1lYW5zIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIGEgdGFyZ2V0IGxpYnJhcnkgbWF5IG5vdCB1c2UKLWFueSB0ZXN0IHdoaWNoIHJlcXVpcmVzIGRvaW5nIGEgbGluay4gIFRoaXMgdW5mb3J0dW5hdGVseSBpbmNsdWRlcyBtYW55Ci11c2VmdWwgYXV0b2NvbmYgbWFjcm9zLCBzdWNoIGFzIEBzYW1we0FDX0NIRUNLX0ZVTkNTfS4gIGF1dG9jb25mIG1hY3Jvcwotd2hpY2ggZG8gYSBjb21waWxlIGJ1dCBub3QgYSBsaW5rLCBzdWNoIGFzIEBzYW1we0FDX0NIRUNLX0hFQURFUlN9LCBtYXkKLWJlIHVzZWQuCi0KLVRoaXMgaXMgYSBzZXZlcmUgcmVzdHJpY3Rpb24sIGJ1dCBub3JtYWxseSBub3QgYSBmYXRhbCBvbmUsIGFzIHRhcmdldAotbGlicmFyaWVzIGNhbiBvZnRlbiBhc3N1bWUgdGhlIHByZXNlbmNlIG9mIG90aGVyIHRhcmdldCBsaWJyYXJpZXMsIGFuZAotdGh1cyBrbm93IHdoaWNoIGZ1bmN0aW9ucyB3aWxsIGJlIGF2YWlsYWJsZS4KLQotQXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgYXV0b2NvbmYgbWFjcm8gQHNhbXB7QUNfUFJPR19DQ30gZG9lcyBhIGxpbmsgdG8KLW1ha2Ugc3VyZSB0aGF0IHRoZSBjb21waWxlciB3b3Jrcy4gIFRoaXMgbWF5IGZhaWwgaW4gYSB0YXJnZXQgbGlicmFyeSwKLXNvIHRhcmdldCBsaWJyYXJpZXMgbXVzdCB1c2UgYSBkaWZmZXJlbnQgc2V0IG9mIG1hY3JvcyB0byBsb2NhdGUgdGhlCi1jb21waWxlci4gIFNlZSB0aGUgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIGluIGEgZGlyZWN0b3J5IGxpa2UKLUBmaWxle2xpYmliZXJ0eX0gb3IgQGZpbGV7bGliZ2xvc3N9IGZvciBhbiBleGFtcGxlLgotCi1BcyBub3RlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgdGFyZ2V0IGxpYnJhcmllcyBhcmUgc29tZXRpbWVzIGJ1aWx0Ci1pbiBkaXJlY3RvcmllcyB3aGljaCBhcmUgc2libGluZ3MgdG8gdGhlIGhvc3QgdG9vbHMsIGFuZCBhcmUgc29tZXRpbWVzCi1idWlsdCBpbiBhIHN1YmRpcmVjdG9yeS4gIFRoZSBAc2FtcHstLXdpdGgtdGFyZ2V0LXN1YmRpcn0gY29uZmlndXJlCi1vcHRpb24gd2lsbCBiZSBwYXNzZWQgd2hlbiB0aGUgbGlicmFyeSBpcyBjb25maWd1cmVkLiAgSXRzIHZhbHVlIHdpbGwgYmUKLWFuIGVtcHR5IHN0cmluZyBpZiB0aGUgdGFyZ2V0IGxpYnJhcnkgaXMgYSBzaWJsaW5nLiAgSXRzIHZhbHVlIHdpbGwgYmUKLXRoZSBuYW1lIG9mIHRoZSBzdWJkaXJlY3RvcnkgaWYgdGhlIHRhcmdldCBsaWJyYXJ5IGlzIGluIGEgc3ViZGlyZWN0b3J5LgotCi1JZiB0aGUgb3ZlcmFsbCBidWlsZCBpcyBub3QgYSBuYXRpdmUgYnVpbGQgKGkuZS4sIHRoZSBvdmVyYWxsIGNvbmZpZ3VyZQotdXNlZCB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiksIHRoZW4gdGhlIGxpYnJhcnkgd2lsbCBiZSBjb25maWd1cmVkCi13aXRoIHRoZSBAc2FtcHstLXdpdGgtY3Jvc3MtaG9zdH0gb3B0aW9uLiAgVGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uIHdpbGwKLWJlIHRoZSBob3N0IHN5c3RlbSBvZiB0aGUgb3ZlcmFsbCBidWlsZC4gIFJlY2FsbCB0aGF0IHRoZSBob3N0IHN5c3RlbSBvZgotdGhlIGxpYnJhcnkgd2lsbCBiZSB0aGUgdGFyZ2V0IG9mIHRoZSBvdmVyYWxsIGJ1aWxkLiAgSWYgdGhlIG92ZXJhbGwKLWJ1aWxkIGlzIGEgbmF0aXZlIGJ1aWxkLCB0aGUgQHNhbXB7LS13aXRoLWNyb3NzLWhvc3R9IG9wdGlvbiB3aWxsIG5vdCBiZQotdXNlZC4KLQotQSBsaWJyYXJ5IHdoaWNoIGNhbiBiZSBidWlsdCBib3RoIHN0YW5kYWxvbmUgYW5kIGFzIGEgdGFyZ2V0IGxpYnJhcnkgbWF5Ci13YW50IHRvIGluc3RhbGwgaXRzZWxmIGludG8gZGlmZmVyZW50IGRpcmVjdG9yaWVzIGRlcGVuZGluZyB1cG9uIHRoZQotY2FzZS4gIFdoZW4gYnVpbHQgc3RhbmRhbG9uZSwgb3Igd2hlbiBidWlsdCBuYXRpdmUsIHRoZSBsaWJyYXJ5IHNob3VsZAotYmUgaW5zdGFsbGVkIGluIEBzYW1weyQobGliZGlyKX0uICBXaGVuIGJ1aWx0IGFzIGEgdGFyZ2V0IGxpYnJhcnkgd2hpY2gKLWlzIG5vdCBuYXRpdmUsIHRoZSBsaWJyYXJ5IHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gQHNhbXB7JCh0b29sZGlyKS9saWJ9LgotVGhlIEBzYW1wey0td2l0aC1jcm9zcy1ob3N0fSBvcHRpb24gbWF5IGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhlc2UKLWNhc2VzLgotCi1UaGlzIHNhbWUgdGVzdCBvZiBAc2FtcHstLXdpdGgtY3Jvc3MtaG9zdH0gbWF5IGJlIHVzZWQgdG8gc2VlIHdoZXRoZXIgaXQKLWlzIE9LIHRvIHVzZSBsaW5rIHRlc3RzIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LiAgSWYgdGhlCi1Ac2FtcHstLXdpdGgtY3Jvc3MtaG9zdH0gb3B0aW9uIGlzIG5vdCB1c2VkLCB0aGVuIHRoZSBsaWJyYXJ5IGlzIGJlaW5nCi1idWlsdCBlaXRoZXIgc3RhbmRhbG9uZSBvciBuYXRpdmUsIGFuZCBhIGxpbmsgc2hvdWxkIHdvcmsuCi0KLUBub2RlIE1ha2UgVGFyZ2V0cyBpbiBDeWdudXMgVHJlZQotQHN1YnNlY3Rpb24gTWFrZSBUYXJnZXRzIGluIEN5Z251cyBUcmVlCi0KLVRoZSB0b3AgbGV2ZWwgQGZpbGV7TWFrZWZpbGV9IGluIHRoZSBDeWdudXMgdHJlZSBkZWZpbmVzIHRhcmdldHMgZm9yCi1ldmVyeSBrbm93biBzdWJkaXJlY3RvcnkuCi0KLUZvciBldmVyeSBzdWJkaXJlY3RvcnkgQHZhcntkaXJ9IHdoaWNoIGhvbGRzIGEgaG9zdCBsaWJyYXJ5IG9yIHByb2dyYW0sCi10aGUgQGZpbGV7TWFrZWZpbGV9IHRhcmdldCBAc2FtcHthbGwtQHZhcntkaXJ9fSB3aWxsIGJ1aWxkIHRoYXQgbGlicmFyeQotb3IgcHJvZ3JhbS4KLQotVGhlcmUgYXJlIGRlcGVuZGVuY2llcyBhbW9uZyBob3N0IHRvb2xzLiAgRm9yIGV4YW1wbGUsIGJ1aWxkaW5nIGdjYwotcmVxdWlyZXMgZmlyc3QgYnVpbGRpbmcgZ2FzLCBiZWNhdXNlIHRoZSBnY2MgYnVpbGQgcHJvY2VzcyBpbnZva2VzIHRoZQotdGFyZ2V0IGFzc2VtYmxlci4gIFRoZXNlIGRlcGVuZGVuY2llcyBhcmUgcmVmbGVjdGVkIGluIHRoZSB0b3AgbGV2ZWwKLUBmaWxle01ha2VmaWxlfS4KLQotRm9yIGV2ZXJ5IHN1YmRpcmVjdG9yeSBAdmFye2Rpcn0gd2hpY2ggaG9sZHMgYSB0YXJnZXQgbGlicmFyeSwgdGhlCi1AZmlsZXtNYWtlZmlsZX0gdGFyZ2V0IEBzYW1we2NvbmZpZ3VyZS10YXJnZXQtQHZhcntkaXJ9fSB3aWxsIGNvbmZpZ3VyZQotdGhhdCBsaWJyYXJ5LiAgVGhlIEBmaWxle01ha2VmaWxlfSB0YXJnZXQgQHNhbXB7YWxsLXRhcmdldC1AdmFye2Rpcn19Ci13aWxsIGJ1aWxkIHRoYXQgbGlicmFyeS4KLQotRXZlcnkgQHNhbXB7Y29uZmlndXJlLXRhcmdldC1AdmFye2Rpcn19IHRhcmdldCBkZXBlbmRzIHVwb24KLUBzYW1we2FsbC1nY2N9LCBzaW5jZSBnY2MsIHRoZSB0YXJnZXQgY29tcGlsZXIsIGlzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZQotdGhlIHRvb2wuICBFdmVyeSBAc2FtcHthbGwtdGFyZ2V0LUB2YXJ7ZGlyfX0gdGFyZ2V0IGRlcGVuZHMgdXBvbiB0aGUKLWNvcnJlc3BvbmRpbmcgQHNhbXB7Y29uZmlndXJlLXRhcmdldC1AdmFye2Rpcn19IHRhcmdldC4KLQotVGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgdGFyZ2V0cyB3aGljaCBtYXkgYmUgb2YgaW50ZXJlc3QgZm9yIGVhY2gKLWRpcmVjdG9yeTogQHNhbXB7aW5zdGFsbC1AdmFye2Rpcn19LCBAc2FtcHtjbGVhbi1AdmFye2Rpcn19LCBhbmQKLUBzYW1we2NoZWNrLUB2YXJ7ZGlyfX0uICBUaGVyZSBhcmUgYWxzbyBjb3JyZXNwb25kaW5nIEBzYW1we3RhcmdldH0KLXZlcnNpb25zIG9mIHRoZXNlIGZvciB0aGUgdGFyZ2V0IGxpYnJhcmllcyAsIHN1Y2ggYXMKLUBzYW1we2luc3RhbGwtdGFyZ2V0LUB2YXJ7ZGlyfX0uCi0KLUBub2RlIFRhcmdldCBsaWJpYmVydHkKLUBzdWJzZWN0aW9uIFRhcmdldCBsaWJpYmVydHkKLQotVGhlIEBmaWxle2xpYmliZXJ0eX0gc3ViZGlyZWN0b3J5IGlzIGN1cnJlbnRseSBhIHNwZWNpYWwgY2FzZSwgaW4gdGhhdAotaXQgaXMgdGhlIG9ubHkgZGlyZWN0b3J5IHdoaWNoIGlzIGJ1aWx0IGJvdGggdXNpbmcgdGhlIGhvc3QgY29tcGlsZXIgYW5kCi11c2luZyB0aGUgdGFyZ2V0IGNvbXBpbGVyLgotCi1UaGlzIGlzIGJlY2F1c2UgdGhlIGZpbGVzIGluIEBmaWxle2xpYmliZXJ0eX0gYXJlIHVzZWQgd2hlbiBidWlsZGluZyB0aGUKLWhvc3QgdG9vbHMsIGFuZCB0aGV5IGFyZSBhbHNvIGluY29ycG9yYXRlZCBpbnRvIHRoZSBAZmlsZXtsaWJzdGRjKyt9Ci10YXJnZXQgbGlicmFyeSBhcyBzdXBwb3J0IGNvZGUuCi0KLVRoaXMgZHVhbGl0eSBkb2VzIG5vdCBwb3NlIGFueSBwYXJ0aWN1bGFyIGRpZmZpY3VsdGllcy4gIEl0IG1lYW5zIHRoYXQKLXRoZXJlIGFyZSB0YXJnZXRzIGZvciBib3RoIEBzYW1we2FsbC1saWJpYmVydHl9IGFuZAotQHNhbXB7YWxsLXRhcmdldC1saWJpYmVydHl9LgotCi1JbiBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLCB3aGVuIHRhcmdldCBsaWJyYXJpZXMgYXJlIG5vdCBidWlsdCBpbiBhCi1zdWJkaXJlY3RvcnksIHRoZSBzYW1lIG9iamVjdHMgYXJlIG5vcm1hbGx5IHVzZWQgYXMgYm90aCB0aGUgaG9zdCBidWlsZAotYW5kIHRoZSB0YXJnZXQgYnVpbGQuICBUaGlzIGlzIG5vcm1hbGx5IE9LLCBzaW5jZSBsaWJpYmVydHkgY29udGFpbnMKLW9ubHkgQyBjb2RlLCBhbmQgaW4gYSBuYXRpdmUgY29uZmlndXJhdGlvbiB0aGUgcmVzdWx0cyBvZiB0aGUgaG9zdAotY29tcGlsZXIgYW5kIHRoZSB0YXJnZXQgY29tcGlsZXIgYXJlIG5vcm1hbGx5IGludGVyb3BlcmFibGUuCi0KLUlyaXggNiBpcyBhZ2FpbiBhbiBleGNlcHRpb24gaGVyZSwgc2luY2UgdGhlIFNHSSBuYXRpdmUgY29tcGlsZXIKLWRlZmF1bHRzIHRvIHVzaW5nIHRoZSBAc2FtcHtPMzJ9IEFCSSwgYW5kIGdjYyBkZWZhdWx0cyB0byB1c2luZyB0aGUKLUBzYW1we04zMn0gQUJJLiAgT24gSXJpeCA2LCB0aGUgdGFyZ2V0IGxpYnJhcmllcyBhcmUgYnVpbHQgaW4gYQotc3ViZGlyZWN0b3J5IGV2ZW4gZm9yIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24sIGF2b2lkaW5nIHRoaXMgcHJvYmxlbS4KLQotVGhlcmUgYXJlIGN1cnJlbnRseSBubyBvdGhlciBsaWJyYXJpZXMgYnVpbHQgZm9yIGJvdGggdGhlIGhvc3QgYW5kIHRoZQotdGFyZ2V0LCBidXQgdGhlcmUgaXMgbm8gY29uY2VwdHVhbCBwcm9ibGVtIHdpdGggYWRkaW5nIG1vcmUuCi0KLUBub2RlIENhbmFkaWFuIENyb3NzCi1AY2hhcHRlciBDYW5hZGlhbiBDcm9zcwotQGNpbmRleCBjYW5hZGlhbiBjcm9zcwotQGNpbmRleCBidWlsZGluZyB3aXRoIGEgY3Jvc3MgY29tcGlsZXIKLUBjaW5kZXggY3Jvc3MgY29tcGlsZXIsIGJ1aWxkaW5nIHdpdGgKLQotSXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gdG8gYnVpbGQgYQotcHJvZ3JhbSB3aGljaCB3aWxsIHJ1biBvbiBhIHN5c3RlbSB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3lzdGVtIG9uCi13aGljaCB0aGUgdG9vbHMgYXJlIGJ1aWx0LiAgSW4gb3RoZXIgd29yZHMsIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkCi1wcm9ncmFtcyB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotCi1UaGlzIGlzIHJlZmVycmVkIHRvIGFzIGEgQGRmbntDYW5hZGlhbiBDcm9zc30uCi0KLUBtZW51Ci0qIENhbmFkaWFuIENyb3NzIEV4YW1wbGU6OgkJQ2FuYWRpYW4gQ3Jvc3MgRXhhbXBsZS4KLSogQ2FuYWRpYW4gQ3Jvc3MgQ29uY2VwdHM6OgkJQ2FuYWRpYW4gQ3Jvc3MgQ29uY2VwdHMuCi0qIEJ1aWxkIENyb3NzIEhvc3QgVG9vbHM6OgkJQnVpbGQgQ3Jvc3MgSG9zdCBUb29scy4KLSogQnVpbGQgYW5kIEhvc3QgT3B0aW9uczo6CQlCdWlsZCBhbmQgSG9zdCBPcHRpb25zLgotKiBDQ3Jvc3Mgbm90IGluIEN5Z251cyBUcmVlOjoJCUNhbmFkaWFuIENyb3NzIG5vdCBpbiBDeWdudXMgVHJlZS4KLSogQ0Nyb3NzIGluIEN5Z251cyBUcmVlOjoJCUNhbmFkaWFuIENyb3NzIGluIEN5Z251cyBUcmVlLgotKiBTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzOjoJCVN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MuCi1AZW5kIG1lbnUKLQotQG5vZGUgQ2FuYWRpYW4gQ3Jvc3MgRXhhbXBsZQotQHNlY3Rpb24gQ2FuYWRpYW4gQ3Jvc3MgRXhhbXBsZQotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBDYW5hZGlhbiBDcm9zcy4KLQotV2hpbGUgcnVubmluZyBvbiBhIEdOVS9MaW51eCwgeW91IGNhbiBidWlsZCBhIHByb2dyYW0gd2hpY2ggd2lsbCBydW4gb24KLWEgU29sYXJpcyBzeXN0ZW0uICBZb3Ugd291bGQgdXNlIGEgR05VL0xpbnV4IGNyb3NzIFNvbGFyaXMgY29tcGlsZXIgdG8KLWJ1aWxkIHRoZSBwcm9ncmFtLgotCi1PZiBjb3Vyc2UsIHlvdSBjb3VsZCBub3QgcnVuIHRoZSByZXN1bHRpbmcgcHJvZ3JhbSBvbiB5b3VyIEdOVS9MaW51eAotc3lzdGVtLiAgWW91IHdvdWxkIGhhdmUgdG8gY29weSBpdCBvdmVyIHRvIGEgU29sYXJpcyBzeXN0ZW0gYmVmb3JlIHlvdQotd291bGQgcnVuIGl0LgotCi1PZiBjb3Vyc2UsIHlvdSBjb3VsZCBhbHNvIHNpbXBseSBidWlsZCB0aGUgcHJvZ3JhbXMgb24gdGhlIFNvbGFyaXMKLXN5c3RlbSBpbiB0aGUgZmlyc3QgcGxhY2UuICBIb3dldmVyLCBwZXJoYXBzIHRoZSBTb2xhcmlzIHN5c3RlbSBpcyBub3QKLWF2YWlsYWJsZSBmb3Igc29tZSByZWFzb247IHBlcmhhcHMgeW91IGFjdHVhbGx5IGRvbid0IGhhdmUgb25lLCBidXQgeW91Ci13YW50IHRvIGJ1aWxkIHRoZSB0b29scyBmb3Igc29tZWJvZHkgZWxzZSB0byB1c2UuICBPciBwZXJoYXBzIHlvdXIKLUdOVS9MaW51eCBzeXN0ZW0gaXMgbXVjaCBmYXN0ZXIgdGhhbiB5b3VyIFNvbGFyaXMgc3lzdGVtLgotCi1BIENhbmFkaWFuIENyb3NzIGJ1aWxkIGlzIG1vc3QgZnJlcXVlbnRseSB1c2VkIHdoZW4gYnVpbGRpbmcgcHJvZ3JhbXMgdG8KLXJ1biBvbiBhIG5vbi1Vbml4IHN5c3RlbSwgc3VjaCBhcyBET1Mgb3IgV2luZG93cy4gIEl0IG1heSBiZSBzaW1wbGVyIHRvCi1jb25maWd1cmUgYW5kIGJ1aWxkIG9uIGEgVW5peCBzeXN0ZW0gdGhhbiB0byBzdXBwb3J0IHRoZSBjb25maWd1cmF0aW9uCi1tYWNoaW5lcnkgb24gYSBub24tVW5peCBzeXN0ZW0uCi0KLUBub2RlIENhbmFkaWFuIENyb3NzIENvbmNlcHRzCi1Ac2VjdGlvbiBDYW5hZGlhbiBDcm9zcyBDb25jZXB0cwotCi1XaGVuIGJ1aWxkaW5nIGEgQ2FuYWRpYW4gQ3Jvc3MsIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gZGlmZmVyZW50IHN5c3RlbXMKLWludm9sdmVkOiB0aGUgc3lzdGVtIG9uIHdoaWNoIHRoZSB0b29scyBhcmUgYmVpbmcgYnVpbHQsIGFuZCB0aGUgc3lzdGVtCi1vbiB3aGljaCB0aGUgdG9vbHMgd2lsbCBydW4uCi0KLVRoZSBzeXN0ZW0gb24gd2hpY2ggdGhlIHRvb2xzIGFyZSBiZWluZyBidWlsdCBpcyBjYWxsZWQgdGhlIEBkZm57YnVpbGR9Ci1zeXN0ZW0uCi0KLVRoZSBzeXN0ZW0gb24gd2hpY2ggdGhlIHRvb2xzIHdpbGwgcnVuIGlzIGNhbGxlZCB0aGUgaG9zdCBzeXN0ZW0uCi0KLUZvciBleGFtcGxlLCBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgU29sYXJpcyBwcm9ncmFtIG9uIGEgR05VL0xpbnV4Ci1zeXN0ZW0sIGFzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCB0aGUgYnVpbGQgc3lzdGVtIHdvdWxkIGJlIEdOVS9MaW51eCwKLWFuZCB0aGUgaG9zdCBzeXN0ZW0gd291bGQgYmUgU29sYXJpcy4KLQotSXQgaXMsIG9mIGNvdXJzZSwgcG9zc2libGUgdG8gYnVpbGQgYSBjcm9zcyBjb21waWxlciB1c2luZyBhIENhbmFkaWFuCi1Dcm9zcyAoaS5lLiwgYnVpbGQgYSBjcm9zcyBjb21waWxlciB1c2luZyBhIGNyb3NzIGNvbXBpbGVyKS4gIEluIHRoaXMKLWNhc2UsIHRoZSBzeXN0ZW0gZm9yIHdoaWNoIHRoZSByZXN1bHRpbmcgY3Jvc3MgY29tcGlsZXIgZ2VuZXJhdGVzIGNvZGUKLWlzIGNhbGxlZCB0aGUgdGFyZ2V0IHN5c3RlbS4gIChGb3IgYSBtb3JlIGNvbXBsZXRlIGRpc2N1c3Npb24gb2YgaG9zdAotYW5kIHRhcmdldCBzeXN0ZW1zLCBAcHhyZWZ7SG9zdCBhbmQgVGFyZ2V0fSkuCi0KLUFuIGV4YW1wbGUgb2YgYnVpbGRpbmcgYSBjcm9zcyBjb21waWxlciB1c2luZyBhIENhbmFkaWFuIENyb3NzIHdvdWxkIGJlCi1idWlsZGluZyBhIFdpbmRvd3MgY3Jvc3MgTUlQUyBFTEYgY29tcGlsZXIgb24gYSBHTlUvTGludXggc3lzdGVtLiAgSW4KLXRoaXMgY2FzZSB0aGUgYnVpbGQgc3lzdGVtIHdvdWxkIGJlIEdOVS9MaW51eCwgdGhlIGhvc3Qgc3lzdGVtIHdvdWxkIGJlCi1XaW5kb3dzLCBhbmQgdGhlIHRhcmdldCBzeXN0ZW0gd291bGQgYmUgTUlQUyBFTEYuCi0KLVRoZSBuYW1lIENhbmFkaWFuIENyb3NzIGNvbWVzIGZyb20gdGhlIGNhc2Ugd2hlbiB0aGUgYnVpbGQsIGhvc3QsIGFuZAotdGFyZ2V0IHN5c3RlbXMgYXJlIGFsbCBkaWZmZXJlbnQuICBBdCB0aGUgdGltZSB0aGF0IHRoZXNlIGlzc3VlcyB3ZXJlCi1hbGwgYmVpbmcgaGFzaGVkIG91dCwgQ2FuYWRhIGhhZCB0aHJlZSBuYXRpb25hbCBwb2xpdGljYWwgcGFydGllcy4KLQotQG5vZGUgQnVpbGQgQ3Jvc3MgSG9zdCBUb29scwotQHNlY3Rpb24gQnVpbGQgQ3Jvc3MgSG9zdCBUb29scwotCi1JbiBvcmRlciB0byBjb25maWd1cmUgYSBwcm9ncmFtIGZvciBhIENhbmFkaWFuIENyb3NzIGJ1aWxkLCB5b3UgbXVzdAotZmlyc3QgYnVpbGQgYW5kIGluc3RhbGwgdGhlIHNldCBvZiBjcm9zcyB0b29scyB5b3Ugd2lsbCB1c2UgdG8gYnVpbGQgdGhlCi1wcm9ncmFtLgotCi1UaGVzZSB0b29scyB3aWxsIGJlIGJ1aWxkIGNyb3NzIGhvc3QgdG9vbHMuICBUaGF0IGlzLCB0aGV5IHdpbGwgcnVuIG9uCi10aGUgYnVpbGQgc3lzdGVtLCBhbmQgd2lsbCBwcm9kdWNlIGNvZGUgdGhhdCBydW5zIG9uIHRoZSBob3N0IHN5c3RlbS4KLQotSXQgaXMgZWFzeSB0byBjb25mdXNlIHRoZSBtZWFuaW5nIG9mIGJ1aWxkIGFuZCBob3N0IGhlcmUuICBBbHdheXMKLXJlbWVtYmVyIHRoYXQgdGhlIGJ1aWxkIHN5c3RlbSBpcyB3aGVyZSB5b3UgYXJlIGRvaW5nIHRoZSBidWlsZCwgYW5kIHRoZQotaG9zdCBzeXN0ZW0gaXMgd2hlcmUgdGhlIHJlc3VsdGluZyBwcm9ncmFtIHdpbGwgcnVuLiAgVGhlcmVmb3JlLCB5b3UKLW5lZWQgYSBidWlsZCBjcm9zcyBob3N0IGNvbXBpbGVyLgotCi1JbiBnZW5lcmFsLCB5b3UgbXVzdCBoYXZlIGEgY29tcGxldGUgY3Jvc3MgZW52aXJvbm1lbnQgaW4gb3JkZXIgdG8gZG8KLXRoZSBidWlsZC4gIFRoaXMgbm9ybWFsbHkgbWVhbnMgYSBjcm9zcyBjb21waWxlciwgY3Jvc3MgYXNzZW1ibGVyLCBhbmQKLXNvIGZvcnRoLCBhcyB3ZWxsIGFzIGxpYnJhcmllcyBhbmQgaW5jbHVkZSBmaWxlcyBmb3IgdGhlIGhvc3Qgc3lzdGVtLgotCi1Abm9kZSBCdWlsZCBhbmQgSG9zdCBPcHRpb25zCi1Ac2VjdGlvbiBCdWlsZCBhbmQgSG9zdCBPcHRpb25zCi1AY2luZGV4IGNvbmZpZ3VyaW5nIGEgY2FuYWRpYW4gY3Jvc3MKLUBjaW5kZXggY2FuYWRpYW4gY3Jvc3MsIGNvbmZpZ3VyaW5nCi0KLVdoZW4geW91IHJ1biBAZmlsZXtjb25maWd1cmV9LCB5b3UgbXVzdCB1c2UgYm90aCB0aGUgQHNhbXB7LS1idWlsZH0gYW5kCi1Ac2FtcHstLWhvc3R9IG9wdGlvbnMuCi0KLUBjaW5kZXggQHNhbXB7LS1idWlsZH0gb3B0aW9uCi1AY2luZGV4IGJ1aWxkIG9wdGlvbgotQGNpbmRleCBjb25maWd1cmUgYnVpbGQgc3lzdGVtCi1UaGUgQHNhbXB7LS1idWlsZH0gb3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mCi10aGUgYnVpbGQgc3lzdGVtLiAgVGhpcyBjYW4gbm9ybWFsbHkgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZQotQGZpbGV7Y29uZmlnLmd1ZXNzfSBzaGVsbCBzY3JpcHQsIGFuZCBpdCBpcyByZWFzb25hYmxlIHRvIHVzZQotQHNhbXB7LS1idWlsZD1gY29uZmlnLmd1ZXNzYH0uCi0KLUBjaW5kZXggQHNhbXB7LS1ob3N0fSBvcHRpb24KLUBjaW5kZXggaG9zdCBvcHRpb24KLUBjaW5kZXggY29uZmlndXJlIGhvc3QKLVRoZSBAc2FtcHstLWhvc3R9IG9wdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZgotdGhlIGhvc3Qgc3lzdGVtLgotCi1BcyB3ZSBleHBsYWluZWQgZWFybGllciwgQGZpbGV7Y29uZmlnLmd1ZXNzfSBpcyB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdAotdmFsdWUgZm9yIHRoZSBAc2FtcHstLWhvc3R9IG9wdGlvbiAoQHB4cmVme1VzaW5nIHRoZSBIb3N0IFR5cGV9KS4gIFdlCi1jYW4gbm93IHNlZSB0aGF0IHNpbmNlIEBmaWxle2NvbmZpZy5ndWVzc30gcmV0dXJucyB0aGUgdHlwZSBvZiBzeXN0ZW0gb24KLXdoaWNoIGl0IGlzIHJ1biwgaXQgcmVhbGx5IGlkZW50aWZpZXMgdGhlIGJ1aWxkIHN5c3RlbS4gIFNpbmNlIHRoZSBob3N0Ci1zeXN0ZW0gaXMgbm9ybWFsbHkgdGhlIHNhbWUgYXMgdGhlIGJ1aWxkIHN5c3RlbSAoaS5lLiwgcGVvcGxlIGRvIG5vdAotbm9ybWFsbHkgYnVpbGQgdXNpbmcgYSBjcm9zcyBjb21waWxlciksIGl0IGlzIHJlYXNvbmFibGUgdG8gdXNlIHRoZQotcmVzdWx0IG9mIEBmaWxle2NvbmZpZy5ndWVzc30gYXMgdGhlIGRlZmF1bHQgZm9yIHRoZSBob3N0IHN5c3RlbSB3aGVuCi10aGUgQHNhbXB7LS1ob3N0fSBvcHRpb24gaXMgbm90IHVzZWQuCi0KLUl0IG1pZ2h0IHNlZW0gdGhhdCBpZiB0aGUgQHNhbXB7LS1ob3N0fSBvcHRpb24gd2VyZSB1c2VkIHdpdGhvdXQgdGhlCi1Ac2FtcHstLWJ1aWxkfSBvcHRpb24gdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBjb3VsZCBydW4KLUBmaWxle2NvbmZpZy5ndWVzc30gdG8gZGV0ZXJtaW5lIHRoZSBidWlsZCBzeXN0ZW0sIGFuZCBwcmVzdW1lIGEKLUNhbmFkaWFuIENyb3NzIGlmIHRoZSByZXN1bHQgb2YgQGZpbGV7Y29uZmlnLmd1ZXNzfSBkaWZmZXJlZCBmcm9tIHRoZQotQHNhbXB7LS1ob3N0fSBvcHRpb24uICBIb3dldmVyLCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLCBzb21lIGNvbmZpZ3VyZQotc2NyaXB0cyBhcmUgcm91dGluZWx5IHJ1biB1c2luZyBhbiBleHBsaWNpdCBAc2FtcHstLWhvc3R9IG9wdGlvbiwgcmF0aGVyCi10aGFuIHVzaW5nIHRoZSBkZWZhdWx0IGZyb20gQGZpbGV7Y29uZmlnLmd1ZXNzfS4gIEFzIG5vdGVkIGVhcmxpZXIsIGl0Ci1pcyBkaWZmaWN1bHQgb3IgaW1wb3NzaWJsZSB0byByZWxpYWJseSBjb21wYXJlIGNvbmZpZ3VyYXRpb24gbmFtZXMKLShAcHhyZWZ7VXNpbmcgdGhlIFRhcmdldCBUeXBlfSkuICBUaGVyZWZvcmUsIGJ5IGNvbnZlbnRpb24sIGlmIHRoZQotQHNhbXB7LS1ob3N0fSBvcHRpb24gaXMgdXNlZCwgYnV0IHRoZSBAc2FtcHstLWJ1aWxkfSBvcHRpb24gaXMgbm90IHVzZWQsCi10aGVuIHRoZSBidWlsZCBzeXN0ZW0gZGVmYXVsdHMgdG8gdGhlIGhvc3Qgc3lzdGVtLgotCi1Abm9kZSBDQ3Jvc3Mgbm90IGluIEN5Z251cyBUcmVlCi1Ac2VjdGlvbiBDYW5hZGlhbiBDcm9zcyBub3QgaW4gQ3lnbnVzIFRyZWUuCi0KLUlmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBDeWdudXMgdHJlZSwgeW91IG11c3QgZXhwbGljaXRseSBzcGVjaWZ5IHRoZQotY3Jvc3MgdG9vbHMgd2hpY2ggeW91IHdhbnQgdG8gdXNlIHRvIGJ1aWxkIHRoZSBwcm9ncmFtLiAgVGhpcyBpcyBkb25lIGJ5Ci1zZXR0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBiZWZvcmUgcnVubmluZyB0aGUgQGZpbGV7Y29uZmlndXJlfQotc2NyaXB0LgotCi1Zb3UgbXVzdCBub3JtYWxseSBzZXQgYXQgbGVhc3QgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBAc2FtcHtDQ30sCi1Ac2FtcHtBUn0sIGFuZCBAc2FtcHtSQU5MSUJ9IHRvIHRoZSBjcm9zcyB0b29scyB3aGljaCB5b3Ugd2FudCB0byB1c2UgdG8KLWJ1aWxkLgotCi1Gb3Igc29tZSBwcm9ncmFtcywgeW91IG11c3Qgc2V0IGFkZGl0aW9uYWwgY3Jvc3MgdG9vbHMgYXMgd2VsbCwgc3VjaCBhcwotQHNhbXB7QVN9LCBAc2FtcHtMRH0sIG9yIEBzYW1we05NfS4KLQotWW91IHdvdWxkIHNldCB0aGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gdGhlIGJ1aWxkIGNyb3NzIHRvb2xzIHdoaWNoCi15b3UgYXJlIGdvaW5nIHRvIHVzZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBTb2xhcmlzIHByb2dyYW0gb24gYSBHTlUvTGludXgKLXN5c3RlbSwgYW5kIHlvdXIgR05VL0xpbnV4IGNyb3NzIFNvbGFyaXMgY29tcGlsZXIgd2VyZSBuYW1lZAotQHNhbXB7c29sYXJpcy1nY2N9LCB0aGVuIHlvdSB3b3VsZCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi1Ac2FtcHtDQ30gdG8gQHNhbXB7c29sYXJpcy1nY2N9LgotCi1Abm9kZSBDQ3Jvc3MgaW4gQ3lnbnVzIFRyZWUKLUBzZWN0aW9uIENhbmFkaWFuIENyb3NzIGluIEN5Z251cyBUcmVlCi1AY2luZGV4IGNhbmFkaWFuIGNyb3NzIGluIGN5Z251cyB0cmVlCi0KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgY29uZmlndXJpbmcgYW5kIGJ1aWxkaW5nIGEgQ2FuYWRpYW4gQ3Jvc3Mgd2hlbgotdXNpbmcgdGhlIEN5Z251cyB0cmVlLgotCi1AbWVudQotKiBTdGFuZGFyZCBDeWdudXMgQ0Nyb3NzOjoJQnVpbGRpbmcgYSBOb3JtYWwgUHJvZ3JhbS4KLSogQ3Jvc3MgQ3lnbnVzIENDcm9zczo6CQlCdWlsZGluZyBhIENyb3NzIFByb2dyYW0uCi1AZW5kIG1lbnUKLQotQG5vZGUgU3RhbmRhcmQgQ3lnbnVzIENDcm9zcwotQHN1YnNlY3Rpb24gQnVpbGRpbmcgYSBOb3JtYWwgUHJvZ3JhbQotCi1XaGVuIGNvbmZpZ3VyaW5nIGEgQ2FuYWRpYW4gQ3Jvc3MgaW4gdGhlIEN5Z251cyB0cmVlLCBhbGwgdGhlCi1hcHByb3ByaWF0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGF1dG9tYXRpY2FsbHkgc2V0IHRvCi1Ac2FtcHtAdmFye2hvc3R9LUB2YXJ7dG9vbH19LCB3aGVyZSBAdmFye2hvc3R9IGlzIHRoZSB2YWx1ZSB1c2VkIGZvciB0aGUKLUBzYW1wey0taG9zdH0gb3B0aW9uLCBhbmQgQHZhcnt0b29sfSBpcyB0aGUgbmFtZSBvZiB0aGUgdG9vbCAoZS5nLiwKLUBzYW1we2djY30sIEBzYW1we2FzfSwgZXRjLikuICBUaGVzZSB0b29scyBtdXN0IGJlIG9uIHlvdXIgQHNhbXB7UEFUSH0uCi0KLUFkZGluZyBhIHByZWZpeCBvZiBAdmFye2hvc3R9IHdpbGwgZ2l2ZSB0aGUgdXN1YWwgbmFtZSBmb3IgdGhlIGJ1aWxkCi1jcm9zcyBob3N0IHRvb2xzLiAgVG8gc2VlIHRoaXMsIGNvbnNpZGVyIHRoYXQgd2hlbiB0aGVzZSBjcm9zcyB0b29scwotd2VyZSBidWlsdCwgdGhleSB3ZXJlIGNvbmZpZ3VyZWQgdG8gcnVuIG9uIHRoZSBidWlsZCBzeXN0ZW0gYW5kIHRvCi1wcm9kdWNlIGNvZGUgZm9yIHRoZSBob3N0IHN5c3RlbS4gIFRoYXQgaXMsIHRoZXkgd2VyZSBjb25maWd1cmVkIHdpdGggYQotQHNhbXB7LS10YXJnZXR9IG9wdGlvbiB0aGF0IGlzIHRoZSBzYW1lIGFzIHRoZSBzeXN0ZW0gd2hpY2ggd2UgYXJlIG5vdwotY2FsbGluZyB0aGUgaG9zdC4gIFJlY2FsbCB0aGF0IHRoZSBkZWZhdWx0IG5hbWUgZm9yIGluc3RhbGxlZCBjcm9zcwotdG9vbHMgdXNlcyB0aGUgdGFyZ2V0IHN5c3RlbSBhcyBhIHByZWZpeCAoQHB4cmVme1VzaW5nIHRoZSBUYXJnZXQKLVR5cGV9KS4gIFNpbmNlIHRoYXQgaXMgdGhlIHN5c3RlbSB3aGljaCB3ZSBhcmUgbm93IGNhbGxpbmcgdGhlIGhvc3QsCi1AdmFye2hvc3R9IGlzIHRoZSByaWdodCBwcmVmaXggdG8gdXNlLgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGNvbmZpZ3VyZSB3aXRoIEBzYW1wey0tYnVpbGQ9aTM4Ni1saW51eC1nbnV9IGFuZAotQHNhbXB7LS1ob3N0PXNvbGFyaXN9LCB0aGVuIHRoZSBDeWdudXMgdHJlZSB3aWxsIGF1dG9tYXRpY2FsbHkgZGVmYXVsdAotdG8gdXNpbmcgdGhlIGNvbXBpbGVyIEBzYW1we3NvbGFyaXMtZ2NjfS4gIFlvdSBtdXN0IGhhdmUgcHJldmlvdXNseQotYnVpbHQgYW5kIGluc3RhbGxlZCB0aGlzIGNvbXBpbGVyLCBwcm9iYWJseSBieSBkb2luZyBhIGJ1aWxkIHdpdGggbm8KLUBzYW1wey0taG9zdH0gb3B0aW9uIGFuZCB3aXRoIGEgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiBvZgotQHNhbXB7c29sYXJpc30uCi0KLUBub2RlIENyb3NzIEN5Z251cyBDQ3Jvc3MKLUBzdWJzZWN0aW9uIEJ1aWxkaW5nIGEgQ3Jvc3MgUHJvZ3JhbQotCi1UaGVyZSBhcmUgYWRkaXRpb25hbCBjb25zaWRlcmF0aW9ucyBpZiB5b3Ugd2FudCB0byBidWlsZCBhIGNyb3NzCi1jb21waWxlciwgcmF0aGVyIHRoYW4gYSBuYXRpdmUgY29tcGlsZXIsIGluIHRoZSBDeWdudXMgdHJlZSB1c2luZyBhCi1DYW5hZGlhbiBDcm9zcy4KLQotV2hlbiB5b3UgYnVpbGQgYSBjcm9zcyBjb21waWxlciB1c2luZyB0aGUgQ3lnbnVzIHRyZWUsIHRoZW4gdGhlIHRhcmdldAotbGlicmFyaWVzIHdpbGwgbm9ybWFsbHkgYmUgYnVpbHQgd2l0aCB0aGUgbmV3bHkgYnVpbHQgdGFyZ2V0IGNvbXBpbGVyCi0oQHB4cmVme0hvc3QgYW5kIFRhcmdldCBMaWJyYXJpZXN9KS4gIEhvd2V2ZXIsIHRoaXMgd2lsbCBub3Qgd29yayB3aGVuCi1idWlsZGluZyB3aXRoIGEgQ2FuYWRpYW4gQ3Jvc3MuICBUaGlzIGlzIGJlY2F1c2UgdGhlIG5ld2x5IGJ1aWx0IHRhcmdldAotY29tcGlsZXIgd2lsbCBiZSBhIHByb2dyYW0gd2hpY2ggcnVucyBvbiB0aGUgaG9zdCBzeXN0ZW0sIGFuZCB0aGVyZWZvcmUKLXdpbGwgbm90IGJlIGFibGUgdG8gcnVuIG9uIHRoZSBidWlsZCBzeXN0ZW0uCi0KLVRoZXJlZm9yZSwgd2hlbiBidWlsZGluZyBhIGNyb3NzIGNvbXBpbGVyIHdpdGggdGhlIEN5Z251cyB0cmVlLCB5b3UgbXVzdAotZmlyc3QgaW5zdGFsbCBhIHNldCBvZiBidWlsZCBjcm9zcyB0YXJnZXQgdG9vbHMuICBUaGVzZSB0b29scyB3aWxsIGJlCi11c2VkIHdoZW4gYnVpbGRpbmcgdGhlIHRhcmdldCBsaWJyYXJpZXMuCi0KLU5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhIHJlcXVpcmVtZW50IG9mIGEgQ2FuYWRpYW4gQ3Jvc3MgaW4gZ2VuZXJhbC4gIEZvcgotZXhhbXBsZSwgaXQgd291bGQgYmUgcG9zc2libGUgdG8gYnVpbGQganVzdCB0aGUgaG9zdCBjcm9zcyB0YXJnZXQgdG9vbHMKLW9uIHRoZSBidWlsZCBzeXN0ZW0sIHRvIGNvcHkgdGhlIHRvb2xzIHRvIHRoZSBob3N0IHN5c3RlbSwgYW5kIHRvIGJ1aWxkCi10aGUgdGFyZ2V0IGxpYnJhcmllcyBvbiB0aGUgaG9zdCBzeXN0ZW0uICBUaGUgcmVxdWlyZW1lbnQgZm9yIGJ1aWxkCi1jcm9zcyB0YXJnZXQgdG9vbHMgaXMgaW1wb3NlZCBieSB0aGUgQ3lnbnVzIHRyZWUsIHdoaWNoIGV4cGVjdHMgdG8gYmUKLWFibGUgdG8gYnVpbGQgYm90aCBob3N0IHByb2dyYW1zIGFuZCB0YXJnZXQgbGlicmFyaWVzIGluIGEgc2luZ2xlCi1Ac2FtcHtjb25maWd1cmV9L0BzYW1we21ha2V9IHN0ZXAuICBCZWNhdXNlIGl0IGJ1aWxkcyB0aGVzZSBpbiBhIHNpbmdsZQotc3RlcCwgaXQgZXhwZWN0cyB0byBiZSBhYmxlIHRvIGJ1aWxkIHRoZSB0YXJnZXQgbGlicmFyaWVzIG9uIHRoZSBidWlsZAotc3lzdGVtLCB3aGljaCBtZWFucyB0aGF0IGl0IG11c3QgdXNlIGEgYnVpbGQgY3Jvc3MgdGFyZ2V0IHRvb2xjaGFpbi4KLQotRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IHdhbnQgdG8gYnVpbGQgYSBXaW5kb3dzIGNyb3NzIE1JUFMgRUxGIGNvbXBpbGVyCi1vbiBhIEdOVS9MaW51eCBzeXN0ZW0uICBZb3UgbXVzdCBoYXZlIHByZXZpb3VzbHkgaW5zdGFsbGVkIGJvdGggYQotR05VL0xpbnV4IGNyb3NzIFdpbmRvd3MgY29tcGlsZXIgYW5kIGEgR05VL0xpbnV4IGNyb3NzIE1JUFMgRUxGCi1jb21waWxlci4KLQotSW4gb3JkZXIgdG8gYnVpbGQgdGhlIFdpbmRvd3MgKGNvbmZpZ3VyYXRpb24gbmFtZSBAc2FtcHtpMzg2LWN5Z3dpbjMyfSkKLWNyb3NzIE1JUFMgRUxGIChjb25maWd1cmUgbmFtZSBAc2FtcHttaXBzLWVsZn0pIGNvbXBpbGVyLCB5b3UgbWlnaHQKLWV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kcyAobG9uZyBjb21tYW5kIGxpbmVzIGFyZSBicm9rZW4gYWNyb3NzCi1saW5lcyB3aXRoIGEgdHJhaWxpbmcgYmFja3NsYXNoIGFzIGEgY29udGludWF0aW9uIGNoYXJhY3RlcikuCi0KLUBleGFtcGxlCi1ta2RpciBsaW51eC14LWN5Z3dpbjMyCi1jZCBsaW51eC14LWN5Z3dpbjMyCi1AdmFye3NyY2Rpcn0vY29uZmlndXJlIC0tdGFyZ2V0IGkzODYtY3lnd2luMzIgLS1wcmVmaXg9QHZhcntpbnN0YWxsZGlyfSBcCi0gIC0tZXhlYy1wcmVmaXg9QHZhcntpbnN0YWxsZGlyfS9ILWkzODYtbGludXgKLW1ha2UKLW1ha2UgaW5zdGFsbAotY2QgLi4KLW1rZGlyIGxpbnV4LXgtbWlwcy1lbGYKLWNkIGxpbnV4LXgtbWlwcy1lbGYKLUB2YXJ7c3JjZGlyfS9jb25maWd1cmUgLS10YXJnZXQgbWlwcy1lbGYgLS1wcmVmaXg9QHZhcntpbnN0YWxsZGlyfSBcCi0gIC0tZXhlYy1wcmVmaXg9QHZhcntpbnN0YWxsZGlyfS9ILWkzODYtbGludXgKLW1ha2UKLW1ha2UgaW5zdGFsbAotY2QgLi4KLW1rZGlyIGN5Z3dpbjMyLXgtbWlwcy1lbGYKLWNkIGN5Z3dpbjMyLXgtbWlwcy1lbGYKLUB2YXJ7c3JjZGlyfS9jb25maWd1cmUgLS1idWlsZD1pMzg2LWxpbnV4LWdudSAtLWhvc3Q9aTM4Ni1jeWd3aW4zMiBcCi0gIC0tdGFyZ2V0PW1pcHMtZWxmIC0tcHJlZml4PUB2YXJ7d2luaW5zdGFsbGRpcn0gXAotICAtLWV4ZWMtcHJlZml4PUB2YXJ7d2luaW5zdGFsbGRpcn0vSC1pMzg2LWN5Z3dpbjMyCi1tYWtlCi1tYWtlIGluc3RhbGwKLUBlbmQgZXhhbXBsZQotCi1Zb3Ugd291bGQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZiBAdmFye3dpbmluc3RhbGxkaXJ9IG92ZXIgdG8gdGhlCi1XaW5kb3dzIG1hY2hpbmUsIGFuZCBydW4gdGhlIHJlc3VsdGluZyBwcm9ncmFtcy4KLQotQG5vZGUgU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcwotQHNlY3Rpb24gU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcwotCi1JZiB5b3Ugd2FudCB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIGEgcHJvZ3JhbSB5b3UgYXJlIGRldmVsb3BpbmcKLXVzaW5nIGEgQ2FuYWRpYW4gQ3Jvc3MsIHlvdSBtdXN0IHRha2Ugc29tZSBjYXJlIHdoZW4gd3JpdGluZyB5b3VyCi1jb25maWd1cmUgYW5kIG1ha2UgcnVsZXMuICBTaW1wbGUgY2FzZXMgd2lsbCBub3JtYWxseSB3b3JrIGNvcnJlY3RseS4KLUhvd2V2ZXIsIGl0IGlzIG5vdCBoYXJkIHRvIHdyaXRlIGNvbmZpZ3VyZSBhbmQgbWFrZSB0ZXN0cyB3aGljaCB3aWxsCi1mYWlsIGluIGEgQ2FuYWRpYW4gQ3Jvc3MuCi0KLUBtZW51Ci0qIENDcm9zcyBpbiBDb25maWd1cmU6OgkJU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcyBpbiBDb25maWd1cmUgU2NyaXB0cy4KLSogQ0Nyb3NzIGluIE1ha2U6OgkJU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcyBpbiBNYWtlZmlsZXMuCi1AZW5kIG1lbnUKLQotQG5vZGUgQ0Nyb3NzIGluIENvbmZpZ3VyZQotQHN1YnNlY3Rpb24gU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcyBpbiBDb25maWd1cmUgU2NyaXB0cwotQGNpbmRleCBjYW5hZGlhbiBjcm9zcyBpbiBjb25maWd1cmUKLQotSW4gYSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUsIGFmdGVyIGNhbGxpbmcgQHNhbXB7QUNfUFJPR19DQ30sIHlvdSBjYW4KLWZpbmQgb3V0IHdoZXRoZXIgdGhpcyBpcyBhIENhbmFkaWFuIENyb3NzIGNvbmZpZ3VyZSBieSBleGFtaW5pbmcgdGhlCi1zaGVsbCB2YXJpYWJsZSBAc2FtcHtjcm9zc19jb21waWxpbmd9LiAgSW4gYSBDYW5hZGlhbiBDcm9zcywgd2hpY2ggbWVhbnMKLXRoYXQgdGhlIGNvbXBpbGVyIGlzIGEgY3Jvc3MgY29tcGlsZXIsIEBzYW1we2Nyb3NzX2NvbXBpbGluZ30gd2lsbCBiZQotQHNhbXB7eWVzfS4gIEluIGEgbm9ybWFsIGNvbmZpZ3VyYXRpb24sIEBzYW1we2Nyb3NzX2NvbXBpbGluZ30gd2lsbCBiZQotQHNhbXB7bm99LgotCi1Zb3Ugb3JkaW5hcmlseSBkbyBub3QgbmVlZCB0byBrbm93IHRoZSB0eXBlIG9mIHRoZSBidWlsZCBzeXN0ZW0gaW4gYQotY29uZmlndXJlIHNjcmlwdC4gIEhvd2V2ZXIsIGlmIHlvdSBkbyBuZWVkIHRoYXQgaW5mb3JtYXRpb24sIHlvdSBjYW4gZ2V0Ci1pdCBieSB1c2luZyB0aGUgbWFjcm8gQHNhbXB7QUNfQ0FOT05JQ0FMX1NZU1RFTX0sIHRoZSBzYW1lIG1hY3JvIHRoYXQgaXMKLXVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0YXJnZXQgc3lzdGVtLiAgVGhpcyBtYWNybyB3aWxsIHNldCB0aGUgdmFyaWFibGVzCi1Ac2FtcHtidWlsZH0sIEBzYW1we2J1aWxkX2FsaWFzfSwgQHNhbXB7YnVpbGRfY3B1fSwgQHNhbXB7YnVpbGRfdmVuZG9yfSwKLWFuZCBAc2FtcHtidWlsZF9vc30sIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlIHNpbWlsYXIgQHNhbXB7dGFyZ2V0fSBhbmQKLUBzYW1we2hvc3R9IHZhcmlhYmxlcywgZXhjZXB0IHRoYXQgdGhleSBkZXNjcmliZSB0aGUgYnVpbGQgc3lzdGVtLgotCi1XaGVuIHdyaXRpbmcgdGVzdHMgaW4gQGZpbGV7Y29uZmlndXJlLmlufSwgeW91IG11c3QgcmVtZW1iZXIgdGhhdCB5b3UKLXdhbnQgdG8gdGVzdCB0aGUgaG9zdCBlbnZpcm9ubWVudCwgbm90IHRoZSBidWlsZCBlbnZpcm9ubWVudC4KLQotTWFjcm9zIGxpa2UgQHNhbXB7QUNfQ0hFQ0tfRlVOQ1N9IHdoaWNoIHVzZSB0aGUgY29tcGlsZXIgd2lsbCB0ZXN0IHRoZQotaG9zdCBlbnZpcm9ubWVudC4gIFRoYXQgaXMgYmVjYXVzZSB0aGUgdGVzdHMgd2lsbCBiZSBkb25lIGJ5IHJ1bm5pbmcgdGhlCi1jb21waWxlciwgd2hpY2ggaXMgYWN0dWFsbHkgYSBidWlsZCBjcm9zcyBob3N0IGNvbXBpbGVyLiAgSWYgdGhlCi1jb21waWxlciBjYW4gZmluZCB0aGUgZnVuY3Rpb24sIHRoYXQgbWVhbnMgdGhhdCB0aGUgZnVuY3Rpb24gaXMgcHJlc2VudAotaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQuCi0KLVRlc3RzIGxpa2UgQHNhbXB7dGVzdCAtZiAvZGV2L3B0eXAwfSwgb24gdGhlIG90aGVyIGhhbmQsIHdpbGwgdGVzdCB0aGUKLWJ1aWxkIGVudmlyb25tZW50LiAgUmVtZW1iZXIgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBpcyBydW5uaW5nIG9uIHRoZQotYnVpbGQgc3lzdGVtLCBub3QgdGhlIGhvc3Qgc3lzdGVtLiAgSWYgeW91ciBjb25maWd1cmUgc2NyaXB0cyBleGFtaW5lcwotZmlsZXMsIHRob3NlIGZpbGVzIHdpbGwgYmUgb24gdGhlIGJ1aWxkIHN5c3RlbS4gIFdoYXRldmVyIHlvdSBkZXRlcm1pbmUKLWJhc2VkIG9uIHRob3NlIGZpbGVzIG1heSBvciBtYXkgbm90IGJlIHRoZSBjYXNlIG9uIHRoZSBob3N0IHN5c3RlbS4KLQotTW9zdCBhdXRvY29uZiBtYWNyb3Mgd2lsbCB3b3JrIGNvcnJlY3RseSBmb3IgYSBDYW5hZGlhbiBDcm9zcy4gIFRoZSBtYWluCi1leGNlcHRpb24gaXMgQHNhbXB7QUNfVFJZX1JVTn0uICBUaGlzIG1hY3JvIHRyaWVzIHRvIGNvbXBpbGUgYW5kIHJ1biBhCi10ZXN0IHByb2dyYW0uICBUaGlzIHdpbGwgZmFpbCBpbiBhIENhbmFkaWFuIENyb3NzLCBiZWNhdXNlIHRoZSBwcm9ncmFtCi13aWxsIGJlIGNvbXBpbGVkIGZvciB0aGUgaG9zdCBzeXN0ZW0sIHdoaWNoIG1lYW5zIHRoYXQgaXQgd2lsbCBub3QgcnVuCi1vbiB0aGUgYnVpbGQgc3lzdGVtLgotCi1UaGUgQHNhbXB7QUNfVFJZX1JVTn0gbWFjcm8gcHJvdmlkZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdG8gdGVsbCB0aGUKLWNvbmZpZ3VyZSBzY3JpcHQgd2hhdCB0byBkbyBpbiBhIENhbmFkaWFuIENyb3NzLiAgSWYgdGhhdCBhcmd1bWVudCBpcwotbm90IHByZXNlbnQsIHlvdSB3aWxsIGdldCBhIHdhcm5pbmcgd2hlbiB5b3UgcnVuIEBzYW1we2F1dG9jb25mfToKLUBzbWFsbGV4YW1wbGUKLXdhcm5pbmc6IEFDX1RSWV9SVU4gY2FsbGVkIHdpdGhvdXQgZGVmYXVsdCB0byBhbGxvdyBjcm9zcyBjb21waWxpbmcKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoaXMgdGVsbHMgeW91IHRoYXQgdGhlIHJlc3VsdGluZyBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCB3aWxsIG5vdCB3b3JrCi13aXRoIGEgQ2FuYWRpYW4gQ3Jvc3MuCi0KLUluIHNvbWUgY2FzZXMgd2hpbGUgaXQgbWF5IGJldHRlciB0byBwZXJmb3JtIGEgdGVzdCBhdCBjb25maWd1cmUgdGltZSwKLWl0IGlzIGFsc28gcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgdGVzdCBhdCBydW4gdGltZS4gIEluIHN1Y2ggYSBjYXNlIHlvdQotY2FuIHVzZSB0aGUgY3Jvc3MgY29tcGlsaW5nIGFyZ3VtZW50IHRvIEBzYW1we0FDX1RSWV9SVU59IHRvIHRlbGwgeW91cgotcHJvZ3JhbSB0aGF0IHRoZSB0ZXN0IGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgYXQgY29uZmlndXJlIHRpbWUuCi0KLVRoZXJlIGFyZSBhIGZldyBvdGhlciBhdXRvY29uZiBtYWNyb3Mgd2hpY2ggd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgd2l0aAotYSBDYW5hZGlhbiBDcm9zczogYSBwYXJ0aWFsIGxpc3QgaXMgQHNhbXB7QUNfRlVOQ19HRVRQR1JQfSwKLUBzYW1we0FDX0ZVTkNfU0VUUEdSUH0sIEBzYW1we0FDX0ZVTkNfU0VUVkJVRl9SRVZFUlNFRH0sIGFuZAotQHNhbXB7QUNfU1lTX1JFU1RBUlRBQkxFX1NZU0NBTExTfS4gIFRoZSBAc2FtcHtBQ19DSEVDS19TSVpFT0Z9IG1hY3JvIGlzCi1nZW5lcmFsbHkgbm90IHZlcnkgdXNlZnVsIHdpdGggYSBDYW5hZGlhbiBDcm9zczsgaXQgcGVybWl0cyBhbiBvcHRpb25hbAotYXJndW1lbnQgaW5kaWNhdGluZyB0aGUgZGVmYXVsdCBzaXplLCBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgd2hhdAotdGhlIGNvcnJlY3QgZGVmYXVsdCBzaG91bGQgYmUuCi0KLUBub2RlIENDcm9zcyBpbiBNYWtlCi1Ac3Vic2VjdGlvbiBTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzIGluIE1ha2VmaWxlcy4KLUBjaW5kZXggY2FuYWRpYW4gY3Jvc3MgaW4gbWFrZWZpbGUKLQotVGhlIG1haW4gQ2FuYWRpYW4gQ3Jvc3MgaXNzdWUgaW4gYSBAZmlsZXtNYWtlZmlsZX0gYXJpc2VzIHdoZW4geW91IHdhbnQKLXRvIHVzZSBhIHN1YnNpZGlhcnkgcHJvZ3JhbSB0byBnZW5lcmF0ZSBjb2RlIG9yIGRhdGEgd2hpY2ggeW91IHdpbGwgdGhlbgotaW5jbHVkZSBpbiB5b3VyIHJlYWwgcHJvZ3JhbS4KLQotSWYgeW91IGNvbXBpbGUgdGhpcyBzdWJzaWRpYXJ5IHByb2dyYW0gdXNpbmcgQHNhbXB7JChDQyl9IGluIHRoZSB1c3VhbAotd2F5LCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBydW4gaXQuICBUaGlzIGlzIGJlY2F1c2UgQHNhbXB7JChDQyl9IHdpbGwKLWJ1aWxkIGEgcHJvZ3JhbSBmb3IgdGhlIGhvc3Qgc3lzdGVtLCBidXQgdGhlIHByb2dyYW0gaXMgYmVpbmcgYnVpbHQgb24KLXRoZSBidWlsZCBzeXN0ZW0uCi0KLVlvdSBtdXN0IGluc3RlYWQgdXNlIGEgY29tcGlsZXIgZm9yIHRoZSBidWlsZCBzeXN0ZW0sIHJhdGhlciB0aGFuIHRoZQotaG9zdCBzeXN0ZW0uICBJbiB0aGUgQ3lnbnVzIHRyZWUsIHRoaXMgbWFrZSB2YXJpYWJsZQotQHNhbXB7JChDQ19GT1JfQlVJTEQpfSB3aWxsIGhvbGQgYSBjb21waWxlciBmb3IgdGhlIGJ1aWxkIHN5c3RlbS4KLQotTm90ZSB0aGF0IHlvdSBzaG91bGQgbm90IGluY2x1ZGUgQGZpbGV7Y29uZmlnLmh9IGluIGEgZmlsZSB5b3UgYXJlCi1jb21waWxpbmcgd2l0aCBAc2FtcHskKENDX0ZPUl9CVUlMRCl9LiAgVGhlIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHdpbGwKLWJ1aWxkIEBmaWxle2NvbmZpZy5ofSB3aXRoIGluZm9ybWF0aW9uIGZvciB0aGUgaG9zdCBzeXN0ZW0uICBIb3dldmVyLAoteW91IGFyZSBjb21waWxpbmcgdGhlIGZpbGUgdXNpbmcgYSBjb21waWxlciBmb3IgdGhlIGJ1aWxkIHN5c3RlbSAoYQotbmF0aXZlIGNvbXBpbGVyKS4gIFN1YnNpZGlhcnkgcHJvZ3JhbXMgYXJlIG5vcm1hbGx5IHNpbXBsZSBmaWx0ZXJzIHdoaWNoCi1kbyBubyB1c2VyIGludGVyYWN0aW9uLCBhbmQgaXQgaXMgbm9ybWFsbHkgcG9zc2libGUgdG8gd3JpdGUgdGhlbSBpbiBhCi1oaWdobHkgcG9ydGFibGUgZmFzaGlvbiBzbyB0aGF0IHRoZSBhYnNlbmNlIG9mIEBmaWxle2NvbmZpZy5ofSBpcyBub3QKLWNydWNpYWwuCi0KLUBjaW5kZXggQHNhbXB7SE9TVF9DQ30KLVRoZSBnY2MgQGZpbGV7TWFrZWZpbGUuaW59IHNob3dzIGEgY29tcGxleCBzaXR1YXRpb24gaW4gd2hpY2ggY2VydGFpbgotZmlsZXMsIHN1Y2ggYXMgQGZpbGV7cnRsLmN9LCBtdXN0IGJlIGNvbXBpbGVkIGludG8gYm90aCBzdWJzaWRpYXJ5Ci1wcm9ncmFtcyBydW4gb24gdGhlIGJ1aWxkIHN5c3RlbSBhbmQgaW50byB0aGUgZmluYWwgcHJvZ3JhbS4gIFRoaXMKLWFwcHJvYWNoIG1heSBiZSBvZiBpbnRlcmVzdCBmb3IgYWR2YW5jZWQgYnVpbGQgc3lzdGVtIGhhY2tlcnMuICBOb3RlCi10aGF0IHRoZSBidWlsZCBzeXN0ZW0gY29tcGlsZXIgaXMgcmF0aGVyIGNvbmZ1c2luZ2x5IGNhbGxlZAotQHNhbXB7SE9TVF9DQ30uCi0KLUBub2RlIEN5Z251cyBDb25maWd1cmUKLUBjaGFwdGVyIEN5Z251cyBDb25maWd1cmUKLUBjaW5kZXggY3lnbnVzIGNvbmZpZ3VyZQotCi1UaGUgQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHQgcHJlZGF0ZXMgYXV0b2NvbmYuICBBbGwgb2YgaXRzIGludGVyZXN0aW5nCi1mZWF0dXJlcyBoYXZlIGJlZW4gaW5jb3Jwb3JhdGVkIGludG8gYXV0b2NvbmYuICBObyBuZXcgcHJvZ3JhbXMgc2hvdWxkCi1iZSB3cml0dGVuIHRvIHVzZSB0aGUgQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLUhvd2V2ZXIsIHRoZSBDeWdudXMgY29uZmlndXJlIHNjcmlwdCBpcyBzdGlsbCB1c2VkIGluIGEgZmV3IHBsYWNlczogYXQKLXRoZSB0b3Agb2YgdGhlIEN5Z251cyB0cmVlIGFuZCBpbiBhIGZldyB0YXJnZXQgbGlicmFyaWVzIGluIHRoZSBDeWdudXMKLXRyZWUuICBVbnRpbCB0aG9zZSB1c2VzIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIGF1dG9jb25mLCBzb21lIGJyaWVmCi1ub3RlcyBhcmUgYXBwcm9wcmlhdGUgaGVyZS4gIFRoaXMgaXMgbm90IGNvbXBsZXRlIGRvY3VtZW50YXRpb24sIGJ1dCBpdAotc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSB0aGlzIGFzIGEgZ3VpZGUgd2hpbGUgZXhhbWluaW5nIHRoZSBzY3JpcHRzCi10aGVtc2VsdmVzLgotCi1AbWVudQotKiBDeWdudXMgQ29uZmlndXJlIEJhc2ljczo6CQlDeWdudXMgQ29uZmlndXJlIEJhc2ljcy4KLSogQ3lnbnVzIENvbmZpZ3VyZSBpbiBDKysgTGlicmFyaWVzOjoJQ3lnbnVzIENvbmZpZ3VyZSBpbiBDKysgTGlicmFyaWVzLgotQGVuZCBtZW51Ci0KLUBub2RlIEN5Z251cyBDb25maWd1cmUgQmFzaWNzCi1Ac2VjdGlvbiBDeWdudXMgQ29uZmlndXJlIEJhc2ljcwotCi1DeWdudXMgY29uZmlndXJlIGRvZXMgbm90IHVzZSBhbnkgZ2VuZXJhdGVkIGZpbGVzOyB0aGVyZSBpcyBubyBwcm9ncmFtCi1jb3JyZXNwb25kaW5nIHRvIEBzYW1we2F1dG9jb25mfS4gIEluc3RlYWQsIHRoZXJlIGlzIGEgc2luZ2xlIHNoZWxsCi1zY3JpcHQgbmFtZWQgQHNhbXB7Y29uZmlndXJlfSB3aGljaCBtYXkgYmUgZm91bmQgYXQgdGhlIHRvcCBvZiB0aGUKLUN5Z251cyB0cmVlLiAgVGhpcyBzaGVsbCBzY3JpcHQgd2FzIHdyaXR0ZW4gYnkgaGFuZDsgaXQgd2FzIG5vdAotZ2VuZXJhdGVkIGJ5IGF1dG9jb25mLCBhbmQgaXQgaXMgaW5jb3JyZWN0LCBhbmQgaW5kZWVkIGhhcm1mdWwsIHRvIHJ1bgotQHNhbXB7YXV0b2NvbmZ9IGluIHRoZSB0b3AgbGV2ZWwgb2YgYSBDeWdudXMgdHJlZS4KLQotQ3lnbnVzIGNvbmZpZ3VyZSB3b3JrcyBpbiBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5IGJ5IGV4YW1pbmluZyB0aGUgZmlsZQotQGZpbGV7Y29uZmlndXJlLmlufSBpbiB0aGF0IGRpcmVjdG9yeS4gIFRoYXQgZmlsZSBpcyBicm9rZW4gaW50byBmb3VyCi1zZXBhcmF0ZSBzaGVsbCBzY3JpcHRzLgotCi1UaGUgZmlyc3QgaXMgdGhlIGNvbnRlbnRzIG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0gdXAgdG8gYSBsaW5lIHRoYXQKLXN0YXJ0cyB3aXRoIEBzYW1weyMgcGVyLWhvc3Q6fS4gIFRoaXMgaXMgdGhlIGNvbW1vbiBwYXJ0LgotCi1UaGUgc2Vjb25kIGlzIHRoZSByZXN0IG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0gdXAgdG8gYSBsaW5lIHRoYXQgc3RhcnRzCi13aXRoIEBzYW1weyMgcGVyLXRhcmdldDp9LiAgVGhpcyBpcyB0aGUgcGVyIGhvc3QgcGFydC4KLQotVGhlIHRoaXJkIGlzIHRoZSByZXN0IG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0gdXAgdG8gYSBsaW5lIHRoYXQgc3RhcnRzCi13aXRoIEBzYW1weyMgcG9zdC10YXJnZXQ6fS4gIFRoaXMgaXMgdGhlIHBlciB0YXJnZXQgcGFydC4KLQotVGhlIGZvdXJ0aCBpcyB0aGUgcmVtYWluZGVyIG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0uICBUaGlzIGlzIHRoZSBwb3N0Ci10YXJnZXQgcGFydC4KLQotSWYgYW55IG9mIHRoZXNlIGNvbW1lbnQgbGluZXMgYXJlIG1pc3NpbmcsIHRoZSBjb3JyZXNwb25kaW5nIHNoZWxsCi1zY3JpcHQgaXMgZW1wdHkuCi0KLUN5Z251cyBjb25maWd1cmUgd2lsbCBmaXJzdCBleGVjdXRlIHRoZSBjb21tb24gcGFydC4gIFRoaXMgbXVzdCBzZXQgdGhlCi1zaGVsbCB2YXJpYWJsZSBAc2FtcHtzcmN0cmlnZ2VyfSB0byB0aGUgbmFtZSBvZiBhIHNvdXJjZSBmaWxlLCB0bwotY29uZmlybSB0aGF0IEN5Z251cyBjb25maWd1cmUgaXMgbG9va2luZyBhdCB0aGUgcmlnaHQgZGlyZWN0b3J5LiAgVGhpcwotbWF5IHNldCB0aGUgc2hlbGwgdmFyaWFibGVzIEBzYW1we3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30gYW5kCi1Ac2FtcHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9LgotCi1DeWdudXMgY29uZmlndXJlIHdpbGwgbmV4dCBzZXQgdGhlIEBzYW1we2J1aWxkfSBhbmQgQHNhbXB7aG9zdH0gc2hlbGwKLXZhcmlhYmxlcywgYW5kIGV4ZWN1dGUgdGhlIHBlciBob3N0IHBhcnQuICBUaGlzIG1heSBzZXQgdGhlIHNoZWxsCi12YXJpYWJsZSBAc2FtcHtob3N0X21ha2VmaWxlX2ZyYWd9LgotCi1DeWdudXMgY29uZmlndXJlIHdpbGwgbmV4dCBzZXQgdGhlIEBzYW1we3RhcmdldH0gdmFyaWFibGUsIGFuZCBleGVjdXRlCi10aGUgcGVyIHRhcmdldCBwYXJ0LiAgVGhpcyBtYXkgc2V0IHRoZSBzaGVsbCB2YXJpYWJsZQotQHNhbXB7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9LgotCi1Bbnkgb2YgdGhlc2Ugc2NyaXB0cyBtYXkgc2V0IHRoZSBAc2FtcHtzdWJkaXJzfSBzaGVsbCB2YXJpYWJsZS4gIFRoaXMKLXZhcmlhYmxlIGlzIGEgbGlzdCBvZiBzdWJkaXJlY3RvcmllcyB3aGVyZSBhIEBmaWxle01ha2VmaWxlLmlufSBmaWxlIG1heQotYmUgZm91bmQuICBDeWdudXMgY29uZmlndXJlIHdpbGwgYXV0b21hdGljYWxseSBsb29rIGZvciBhCi1AZmlsZXtNYWtlZmlsZS5pbn0gZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBUaGUgQHNhbXB7c3ViZGlyc30KLXNoZWxsIHZhcmlhYmxlIGlzIG5vdCBub3JtYWxseSB1c2VkLCBhbmQgSSBiZWxpZXZlIHRoYXQgdGhlIG9ubHkKLWRpcmVjdG9yeSB3aGljaCB1c2VzIGl0IGF0IHByZXNlbnQgaXMgQGZpbGV7bmV3bGlifS4KLQotRm9yIGVhY2ggQGZpbGV7TWFrZWZpbGUuaW59LCBDeWdudXMgY29uZmlndXJlIHdpbGwgYXV0b21hdGljYWxseSBjcmVhdGUKLWEgQGZpbGV7TWFrZWZpbGV9IGJ5IGFkZGluZyBkZWZpbml0aW9ucyBmb3IgQHNhbXB7bWFrZX0gdmFyaWFibGVzIHN1Y2gKLWFzIEBzYW1we2hvc3R9IGFuZCBAc2FtcHt0YXJnZXR9LCBhbmQgYXV0b21hdGljYWxseSBlZGl0aW5nIHRoZSB2YWx1ZXMKLW9mIEBzYW1we21ha2V9IHZhcmlhYmxlcyBzdWNoIGFzIEBzYW1we3ByZWZpeH0gaWYgdGhleSBhcmUgcHJlc2VudC4KLQotQWxzbywgaWYgYW55IG9mIHRoZSBAc2FtcHttYWtlZmlsZV9mcmFnfSBzaGVsbCB2YXJpYWJsZXMgYXJlIHNldCwgQ3lnbnVzCi1jb25maWd1cmUgd2lsbCBpbnRlcnByZXQgdGhlbSBhcyBmaWxlIG5hbWVzIHJlbGF0aXZlIHRvIGVpdGhlciB0aGUKLXdvcmtpbmcgZGlyZWN0b3J5IG9yIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCBhbmQgd2lsbCByZWFkIHRoZSBjb250ZW50cyBvZgotdGhlIGZpbGUgaW50byB0aGUgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfS4gIFRoZSBmaWxlIGNvbnRlbnRzIHdpbGwgYmUKLXJlYWQgaW4gYWZ0ZXIgdGhlIGZpcnN0IGxpbmUgaW4gQGZpbGV7TWFrZWZpbGUuaW59IHdoaWNoIHN0YXJ0cyB3aXRoCi1Ac2FtcHsjIyMjfS4KLQotVGhlc2UgQGZpbGV7TWFrZWZpbGV9IGZyYWdtZW50cyBhcmUgdXNlZCB0byBjdXN0b21pemUgYmVoYXZpb3VyIGZvciBhCi1wYXJ0aWN1bGFyIGhvc3Qgb3IgdGFyZ2V0LiAgVGhleSBzZXJ2ZSB0byBzZWxlY3QgcGFydGljdWxhciBmaWxlcyB0bwotY29tcGlsZSwgYW5kIHRvIGRlZmluZSBwYXJ0aWN1bGFyIHByZXByb2Nlc3NvciBtYWNyb3MgYnkgcHJvdmlkaW5nCi12YWx1ZXMgZm9yIEBzYW1we21ha2V9IHZhcmlhYmxlcyB3aGljaCBhcmUgdGhlbiB1c2VkIGR1cmluZyBjb21waWxhdGlvbi4KLUN5Z251cyBjb25maWd1cmUsIHVubGlrZSBhdXRvY29uZiwgbm9ybWFsbHkgZG9lcyBub3QgZG8gZmVhdHVyZSB0ZXN0cywKLWFuZCBub3JtYWxseSByZXF1aXJlcyBzdXBwb3J0IHRvIGJlIGFkZGVkIG1hbnVhbGx5IGZvciBlYWNoIG5ldyBob3N0LgotCi1UaGUgQGZpbGV7TWFrZWZpbGV9IGZyYWdtZW50IHN1cHBvcnQgaXMgc2ltaWxhciB0byB0aGUgYXV0b2NvbmYKLUBzYW1we0FDX1NVQlNUX0ZJTEV9IG1hY3JvLgotCi1BZnRlciBjcmVhdGluZyBlYWNoIEBmaWxle01ha2VmaWxlfSwgdGhlIHBvc3QgdGFyZ2V0IHNjcmlwdCB3aWxsIGJlIHJ1bgotKGkuZS4sIGl0IG1heSBiZSBydW4gc2V2ZXJhbCB0aW1lcykuICBUaGlzIHNjcmlwdCBtYXkgZnVydGhlciBjdXN0b21pemUKLXRoZSBAZmlsZXtNYWtlZmlsZX0uICBXaGVuIGl0IGlzIHJ1biwgdGhlIHNoZWxsIHZhcmlhYmxlIEBzYW1we01ha2VmaWxlfQotd2lsbCBob2xkIHRoZSBuYW1lIG9mIHRoZSBAZmlsZXtNYWtlZmlsZX0sIGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUKLWRpcmVjdG9yeSBjb21wb25lbnQuCi0KLUxpa2UgYW4gYXV0b2NvbmYgZ2VuZXJhdGVkIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0LCBDeWdudXMgY29uZmlndXJlCi13aWxsIGNyZWF0ZSBhIGZpbGUgbmFtZWQgQGZpbGV7Y29uZmlnLnN0YXR1c30gd2hpY2gsIHdoZW4gcnVuLCB3aWxsCi1hdXRvbWF0aWNhbGx5IHJlY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uLiAgVGhlIEBmaWxle2NvbmZpZy5zdGF0dXN9IGZpbGUKLXdpbGwgc2ltcGx5IGV4ZWN1dGUgdGhlIEN5Z251cyBjb25maWd1cmUgc2NyaXB0IGFnYWluIHdpdGggdGhlCi1hcHByb3ByaWF0ZSBhcmd1bWVudHMuCi0KLUFueSBvZiB0aGUgcGFydHMgb2YgQGZpbGV7Y29uZmlndXJlLmlufSBtYXkgc2V0IHRoZSBzaGVsbCB2YXJpYWJsZXMKLUBzYW1we2ZpbGVzfSBhbmQgQHNhbXB7bGlua3N9LiAgQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIHNldCB1cCBzeW1saW5rcwotZnJvbSB0aGUgbmFtZXMgaW4gQHNhbXB7bGlua3N9IHRvIHRoZSBmaWxlcyBuYW1lZCBpbiBAc2FtcHtmaWxlc30uICBUaGlzCi1pcyBzaW1pbGFyIHRvIHRoZSBhdXRvY29uZiBAc2FtcHtBQ19MSU5LX0ZJTEVTfSBtYWNyby4KLQotRmluYWxseSwgYW55IG9mIHRoZSBwYXJ0cyBvZiBAZmlsZXtjb25maWd1cmUuaW59IG1heSBzZXQgdGhlIHNoZWxsCi12YXJpYWJsZSBAc2FtcHtjb25maWdkaXJzfSB0byBhIHNldCBvZiBzdWJkaXJlY3Rvcmllcy4gIElmIGl0IGlzIHNldCwKLUN5Z251cyBjb25maWd1cmUgd2lsbCByZWN1cnNpdmVseSBydW4gdGhlIGNvbmZpZ3VyZSBwcm9jZXNzIGluIGVhY2gKLXN1YmRpcmVjdG9yeS4gIElmIHRoZSBzdWJkaXJlY3RvcnkgdXNlcyBDeWdudXMgY29uZmlndXJlLCBpdCB3aWxsCi1jb250YWluIGEgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIGJ1dCBubyBAZmlsZXtjb25maWd1cmV9IGZpbGUsIGluCi13aGljaCBjYXNlIEN5Z251cyBjb25maWd1cmUgd2lsbCBpbnZva2UgaXRzZWxmIHJlY3Vyc2l2ZWx5LiAgSWYgdGhlCi1zdWJkaXJlY3RvcnkgaGFzIGEgQGZpbGV7Y29uZmlndXJlfSBmaWxlLCBDeWdudXMgY29uZmlndXJlIGFzc3VtZXMgdGhhdAotaXQgaXMgYW4gYXV0b2NvbmYgZ2VuZXJhdGVkIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0LCBhbmQgc2ltcGx5IGludm9rZXMKLWl0IGRpcmVjdGx5LgotCi1Abm9kZSBDeWdudXMgQ29uZmlndXJlIGluIEMrKyBMaWJyYXJpZXMKLUBzZWN0aW9uIEN5Z251cyBDb25maWd1cmUgaW4gQysrIExpYnJhcmllcwotQGNpbmRleCBAZmlsZXtsaWJzdGRjKyt9IGNvbmZpZ3VyZQotQGNpbmRleCBAZmlsZXtsaWJpb30gY29uZmlndXJlCi1AY2luZGV4IEBmaWxle2xpYmcrK30gY29uZmlndXJlCi0KLVRoZSBDKysgbGlicmFyeSBjb25maWd1cmUgc3lzdGVtLCB3cml0dGVuIGJ5IFBlciBCb3RobmVyLCBkZXNlcnZlcwotc3BlY2lhbCBtZW50aW9uLiAgSXQgdXNlcyBDeWdudXMgY29uZmlndXJlLCBidXQgaXQgZG9lcyBmZWF0dXJlIHRlc3RpbmcKLWxpa2UgdGhhdCBkb25lIGJ5IGF1dG9jb25mIGdlbmVyYXRlZCBAZmlsZXtjb25maWd1cmV9IHNjcmlwdHMuICBUaGlzCi1hcHByb2FjaCBpcyB1c2VkIGluIHRoZSBsaWJyYXJpZXMgQGZpbGV7bGliaW99LCBAZmlsZXtsaWJzdGRjKyt9LCBhbmQKLUBmaWxle2xpYmcrK30uCi0KLU1vc3Qgb2YgdGhlIEBmaWxle01ha2VmaWxlfSBpbmZvcm1hdGlvbiBpcyB3cml0dGVuIG91dCBieSB0aGUgc2hlbGwKLXNjcmlwdCBAZmlsZXtsaWJpby9jb25maWcuc2hhcmVkfS4gIEVhY2ggQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIHNldHMKLWNlcnRhaW4gc2hlbGwgdmFyaWFibGVzLCBhbmQgdGhlbiBpbnZva2VzIEBmaWxle2NvbmZpZy5zaGFyZWR9IHRvIGNyZWF0ZQotdHdvIHBhY2thZ2UgQGZpbGV7TWFrZWZpbGV9IGZyYWdtZW50cy4gIFRoZXNlIGZyYWdtZW50cyBhcmUgdGhlbgotaW5jb3Jwb3JhdGVkIGludG8gdGhlIHJlc3VsdGluZyBAZmlsZXtNYWtlZmlsZX0gYnkgdGhlIEN5Z251cyBjb25maWd1cmUKLXNjcmlwdC4KLQotVGhlIGZpbGUgQGZpbGV7X0dfY29uZmlnLmh9IGlzIGNyZWF0ZWQgaW4gdGhlIEBmaWxle2xpYmlvfSBvYmplY3QKLWRpcmVjdG9yeSBieSBydW5uaW5nIHRoZSBzaGVsbCBzY3JpcHQgQGZpbGV7bGliaW8vZ2VuLXBhcmFtc30uICBUaGlzCi1zaGVsbCBzY3JpcHQgdXNlcyBmZWF0dXJlIHRlc3RzIHRvIGRlZmluZSBtYWNyb3MgYW5kIHR5cGVkZWZzIGluCi1AZmlsZXtfR19jb25maWcuaH0uCi0KLUBub2RlIE11bHRpbGlicwotQGNoYXB0ZXIgTXVsdGlsaWJzCi1AY2luZGV4IG11bHRpbGlicwotCi1Gb3Igc29tZSB0YXJnZXRzIGdjYyBtYXkgaGF2ZSBkaWZmZXJlbnQgcHJvY2Vzc29yIHJlcXVpcmVtZW50cyBkZXBlbmRpbmcKLXVwb24gY29tbWFuZCBsaW5lIG9wdGlvbnMuICBBbiBvYnZpb3VzIGV4YW1wbGUgaXMgdGhlCi1Ac2FtcHstbXNvZnQtZmxvYXR9IG9wdGlvbiBzdXBwb3J0ZWQgb24gc2V2ZXJhbCBwcm9jZXNzb3JzLiAgVGhpcyBvcHRpb24KLW1lYW5zIHRoYXQgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBhcmUgbm90IGF2YWlsYWJsZSwgd2hpY2ggbWVhbnMKLXRoYXQgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucyBtdXN0IGJlIGRvbmUgYnkgY2FsbGluZyBhbiBlbXVsYXRpb24KLXN1YnJvdXRpbmUgcmF0aGVyIHRoYW4gYnkgdXNpbmcgbWFjaGluZSBpbnN0cnVjdGlvbnMuCi0KLUZvciBzdWNoIG9wdGlvbnMsIGdjYyBpcyBvZnRlbiBjb25maWd1cmVkIHRvIGNvbXBpbGUgdGFyZ2V0IGxpYnJhcmllcwotdHdpY2U6IG9uY2Ugd2l0aCBAc2FtcHstbXNvZnQtZmxvYXR9IGFuZCBvbmNlIHdpdGhvdXQuICBXaGVuIGdjYwotY29tcGlsZXMgdGFyZ2V0IGxpYnJhcmllcyBtb3JlIHRoYW4gb25jZSwgdGhlIHJlc3VsdGluZyBsaWJyYXJpZXMgYXJlCi1jYWxsZWQgQGRmbnttdWx0aWxpYnN9LgotCi1NdWx0aWxpYnMgYXJlIG5vdCByZWFsbHkgcGFydCBvZiB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtLCBidXQKLXdlIGRpc2N1c3MgdGhlbSBoZXJlIHNpbmNlIHRoZXkgcmVxdWlyZSBzdXBwb3J0IGluIHRoZSBAZmlsZXtjb25maWd1cmV9Ci1zY3JpcHRzIGFuZCBAZmlsZXtNYWtlZmlsZX1zIHVzZWQgZm9yIHRhcmdldCBsaWJyYXJpZXMuCi0KLUBtZW51Ci0qIE11bHRpbGlicyBpbiBnY2M6OgkJICAgICAgICBNdWx0aWxpYnMgaW4gZ2NjLgotKiBNdWx0aWxpYnMgaW4gVGFyZ2V0IExpYnJhcmllczo6CU11bHRpbGlicyBpbiBUYXJnZXQgTGlicmFyaWVzLgotQGVuZCBtZW51Ci0KLUBub2RlIE11bHRpbGlicyBpbiBnY2MKLUBzZWN0aW9uIE11bHRpbGlicyBpbiBnY2MKLQotSW4gZ2NjLCBtdWx0aWxpYnMgYXJlIGRlZmluZWQgYnkgc2V0dGluZyB0aGUgdmFyaWFibGUKLUBzYW1we01VTFRJTElCX09QVElPTlN9IGluIHRoZSB0YXJnZXQgQGZpbGV7TWFrZWZpbGV9IGZyYWdtZW50LiAgU2V2ZXJhbAotb3RoZXIgQHNhbXB7TVVMVElMSUJ9IHZhcmlhYmxlcyBtYXkgYWxzbyBiZSBkZWZpbmVkIHRoZXJlLiAgQHhyZWZ7VGFyZ2V0Ci1GcmFnbWVudCwgLCBUaGUgVGFyZ2V0IE1ha2VmaWxlIEZyYWdtZW50LCBnY2MsIFVzaW5nIGFuZCBQb3J0aW5nIEdOVQotQ0N9LgotCi1JZiB5b3UgaGF2ZSBidWlsdCBnY2MsIHlvdSBjYW4gc2VlIHdoYXQgbXVsdGlsaWJzIGl0IHVzZXMgYnkgcnVubmluZyBpdAotd2l0aCB0aGUgQHNhbXB7LXByaW50LW11bHRpLWxpYn0gb3B0aW9uLiAgVGhlIG91dHB1dCBAc2FtcHsuO30gbWVhbnMKLXRoYXQgbm8gbXVsdGlsaWJzIGFyZSB1c2VkLiAgSW4gZ2VuZXJhbCwgdGhlIG91dHB1dCBpcyBhIHNlcXVlbmNlIG9mCi1saW5lcywgb25lIHBlciBtdWx0aWxpYi4gIFRoZSBmaXJzdCBwYXJ0IG9mIGVhY2ggbGluZSwgdXAgdG8gdGhlCi1Ac2FtcHs7fSwgaXMgdGhlIG5hbWUgb2YgdGhlIG11bHRpbGliIGRpcmVjdG9yeS4gIFRoZSBzZWNvbmQgcGFydCBpcyBhCi1saXN0IG9mIGNvbXBpbGVyIG9wdGlvbnMgc2VwYXJhdGVkIGJ5IEBzYW1we0BAfSBjaGFyYWN0ZXJzLgotCi1NdWx0aWxpYnMgYXJlIGJ1aWx0IGluIGEgdHJlZSBvZiBkaXJlY3Rvcmllcy4gIFRoZSB0b3Agb2YgdGhlIHRyZWUsCi1yZXByZXNlbnRlZCBieSBAc2FtcHsufSBpbiB0aGUgbGlzdCBvZiBtdWx0aWxpYiBkaXJlY3RvcmllcywgaXMgdGhlCi1kZWZhdWx0IGxpYnJhcnkgdG8gdXNlIHdoZW4gbm8gc3BlY2lhbCBjb21waWxlciBvcHRpb25zIGFyZSB1c2VkLiAgVGhlCi1zdWJkaXJlY3RvcmllcyBvZiB0aGUgdHJlZSBob2xkIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IHRvIHVzZSB3aGVuCi1wYXJ0aWN1bGFyIGNvbXBpbGVyIG9wdGlvbnMgYXJlIHVzZWQuCi0KLUBub2RlIE11bHRpbGlicyBpbiBUYXJnZXQgTGlicmFyaWVzCi1Ac2VjdGlvbiBNdWx0aWxpYnMgaW4gVGFyZ2V0IExpYnJhcmllcwotCi1UaGUgdGFyZ2V0IGxpYnJhcmllcyBpbiB0aGUgQ3lnbnVzIHRyZWUgYXJlIGF1dG9tYXRpY2FsbHkgYnVpbHQgd2l0aAotbXVsdGlsaWJzLiAgVGhhdCBtZWFucyB0aGF0IGVhY2ggbGlicmFyeSBpcyBidWlsdCBtdWx0aXBsZSB0aW1lcy4KLQotVGhpcyBkZWZhdWx0IGlzIHNldCBpbiB0aGUgdG9wIGxldmVsIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSwgYnkgYWRkaW5nCi1Ac2FtcHstLWVuYWJsZS1tdWx0aWxpYn0gdG8gdGhlIGxpc3Qgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBjb25maWd1cmUKLXdoZW4gaXQgaXMgcnVuIGZvciB0aGUgdGFyZ2V0IGxpYnJhcmllcyAoQHB4cmVme0hvc3QgYW5kIFRhcmdldAotTGlicmFyaWVzfSkuCi0KLUVhY2ggdGFyZ2V0IGxpYnJhcnkgdXNlcyB0aGUgc2hlbGwgc2NyaXB0IEBmaWxle2NvbmZpZy1tbC5pbn0sIHdyaXR0ZW4KLWJ5IERvdWcgRXZhbnMsIHRvIHByZXBhcmUgdG8gYnVpbGQgdGFyZ2V0IGxpYnJhcmllcy4gIFRoaXMgc2hlbGwgc2NyaXB0Ci1pcyBpbnZva2VkIGFmdGVyIHRoZSBAZmlsZXtNYWtlZmlsZX0gaGFzIGJlZW4gY3JlYXRlZCBieSB0aGUKLUBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0LiAgSWYgbXVsdGlsaWJzIGFyZSBub3QgZW5hYmxlZCwgaXQgZG9lcyBub3RoaW5nLAotb3RoZXJ3aXNlIGl0IG1vZGlmaWVzIHRoZSBAZmlsZXtNYWtlZmlsZX0gdG8gc3VwcG9ydCBtdWx0aWxpYnMuCi0KLVRoZSBAZmlsZXtjb25maWctbWwuaW59IHNjcmlwdCBtYWtlcyBvbmUgY29weSBvZiB0aGUgQGZpbGV7TWFrZWZpbGV9IGZvcgotZWFjaCBtdWx0aWxpYiBpbiB0aGUgYXBwcm9wcmlhdGUgc3ViZGlyZWN0b3J5LiAgV2hlbiBjb25maWd1cmluZyBpbiB0aGUKLXNvdXJjZSBkaXJlY3RvcnkgKHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCksIGl0IHdpbGwgYnVpbGQgYSBzeW1saW5rCi10cmVlIG9mIHRoZSBzb3VyY2VzIGluIGVhY2ggc3ViZGlyZWN0b3J5LgotCi1UaGUgQGZpbGV7Y29uZmlnLW1sLmlufSBzY3JpcHQgc2V0cyBzZXZlcmFsIHZhcmlhYmxlcyBpbiB0aGUgdmFyaW91cwotQGZpbGV7TWFrZWZpbGV9cy4gIFRoZSBAZmlsZXtNYWtlZmlsZS5pbn0gbXVzdCBoYXZlIGRlZmluaXRpb25zIGZvcgotdGhlc2UgdmFyaWFibGVzIGFscmVhZHk7IEBmaWxle2NvbmZpZy1tbC5pbn0gc2ltcGx5IGNoYW5nZXMgdGhlIGV4aXN0aW5nCi12YWx1ZXMuICBUaGUgQGZpbGV7TWFrZWZpbGV9IHNob3VsZCB1c2UgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZXNlCi12YXJpYWJsZXMgd2hpY2ggd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcgaW4gdGhlIHN1YmRpcmVjdG9yaWVzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIE1VTFRJU1JDVE9QCi1AZmlsZXtjb25maWctbWwuaW59IHdpbGwgc2V0IHRoaXMgdG8gYSBzZXF1ZW5jZSBvZiBAc2FtcHsuLi99IHN0cmluZ3MsCi13aGVyZSB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaXMgdGhlIG51bWJlciBvZiBtdWx0aWxpYiBsZXZlbHMgaW4gdGhlCi1zb3VyY2UgdHJlZS4gIFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSB0aGUgZW1wdHkgc3RyaW5nLgotQGl0ZW0gTVVMVElCVUlMRFRPUAotQGZpbGV7Y29uZmlnLW1sLmlufSB3aWxsIHNldCB0aGlzIHRvIGEgc2VxdWVuY2Ugb2YgQHNhbXB7Li4vfSBzdHJpbmdzLAotd2hlcmUgdGhlIG51bWJlciBvZiBzdHJpbmdzIGlzIG51bWJlciBvZiBtdWx0aWxpYiBsZXZlbHMgaW4gdGhlIG9iamVjdAotZGlyZWN0b3J5LiAgVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHRoZSBlbXB0eSBzdHJpbmcuICBUaGlzIHdpbGwKLWRpZmZlciBmcm9tIEBzYW1we01VTFRJU1JDVE9QfSB3aGVuIGNvbmZpZ3VyaW5nIGluIHRoZSBzb3VyY2UgdHJlZQotKHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuCi1AaXRlbSBNVUxUSURJUlMKLUluIHRoZSB0b3AgbGV2ZWwgQGZpbGV7TWFrZWZpbGV9IG9ubHksIEBmaWxle2NvbmZpZy1tbC5pbn0gd2lsbCBzZXQgdGhpcwotdG8gdGhlIGxpc3Qgb2YgbXVsdGlsaWIgc3ViZGlyZWN0b3JpZXMuICBUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgdGhlCi1lbXB0eSBzdHJpbmcuCi1AaXRlbSBNVUxUSVNVQkRJUgotQGZpbGV7Y29uZmlnLW1sLmlufSB3aWxsIHNldCB0aGlzIHRvIHRoZSBpbnN0YWxsZWQgc3ViZGlyZWN0b3J5IG5hbWUgdG8KLXVzZSBmb3IgdGhpcyBzdWJkaXJlY3RvcnksIHdpdGggYSBsZWFkaW5nIEBzYW1wey99LiAgVGhlIGRlZmF1bHQgdmFsdWUKLXNob2xkIGJlIHRoZSBlbXB0eSBzdHJpbmcuCi1AaXRlbSBNVUxUSURPCi1AaXRlbXggTVVMVElDTEVBTgotSW4gdGhlIHRvcCBsZXZlbCBAZmlsZXtNYWtlZmlsZX0gb25seSwgQGZpbGV7Y29uZmlnLW1sLmlufSB3aWxsIHNldAotdGhlc2UgdmFyaWFibGVzIHRvIGNvbW1hbmRzIHRvIHVzZSB3aGVuIGRvaW5nIGEgcmVjdXJzaXZlIG1ha2UuICBUaGVzZQotdmFyaWFibGVzIHNob3VsZCBib3RoIGRlZmF1bHQgdG8gdGhlIHN0cmluZyBAc2FtcHt0cnVlfSwgc28gdGhhdCBieQotZGVmYXVsdCBub3RoaW5nIGhhcHBlbnMuCi1AZW5kIHRhYmxlCi0KLUFsbCByZWZlcmVuY2VzIHRvIHRoZSBwYXJlbnQgb2YgdGhlIHNvdXJjZSBkaXJlY3Rvcnkgc2hvdWxkIHVzZSB0aGUKLXZhcmlhYmxlIEBzYW1we01VTFRJU1JDVE9QfS4gIEluc3RlYWQgb2Ygd3JpdGluZyBAc2FtcHskKHNyY2RpcikvLi59LAoteW91IG11c3Qgd3JpdGUgQHNhbXB7JChzcmNkaXIpLyQoTVVMVElTUkNUT1ApLi59LgotCi1TaW1pbGFybHksIHJlZmVyZW5jZXMgdG8gdGhlIHBhcmVudCBvZiB0aGUgb2JqZWN0IGRpcmVjdG9yeSBzaG91bGQgdXNlCi10aGUgdmFyaWFibGUgQHNhbXB7TVVMVElCVUlMRFRPUH0uCi0KLUluIHRoZSBpbnN0YWxsYXRpb24gdGFyZ2V0LCB0aGUgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gdGhlCi1zdWJkaXJlY3RvcnkgQHNhbXB7TVVMVElTVUJESVJ9LiAgSW5zdGVhZCBvZiBpbnN0YWxsaW5nCi1Ac2FtcHskKGxpYmRpcikvbGliZm9vLmF9LCBpbnN0YWxsCi1Ac2FtcHskKGxpYmRpcikkKE1VTFRJU1VCRElSKS9saWJmb28uYX0uCi0KLVRoZSBAZmlsZXtjb25maWctbWwuaW59IHNjcmlwdCBhbHNvIG1vZGlmaWVzIHRoZSB0b3AgbGV2ZWwKLUBmaWxle01ha2VmaWxlfSB0byBhZGQgQHNhbXB7bXVsdGktZG99IGFuZCBAc2FtcHttdWx0aS1jbGVhbn0gdGFyZ2V0cwotd2hpY2ggYXJlIHVzZWQgd2hlbiBidWlsZGluZyBtdWx0aWxpYnMuCi0KLVRoZSBkZWZhdWx0IHRhcmdldCBvZiB0aGUgQGZpbGV7TWFrZWZpbGV9IHNob3VsZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcKLWNvbW1hbmQ6Ci1Ac21hbGxleGFtcGxlCi1AQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBETz1hbGwgbXVsdGktZG8KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoaXMgYXNzdW1lcyB0aGF0IEBzYW1weyQoRkxBR1NfVE9fUEFTUyl9IGlzIGRlZmluZWQgYXMgYSBzZXQgb2YKLXZhcmlhYmxlcyB0byBwYXNzIHRvIGEgcmVjdXJzaXZlIGludm9jYXRpb24gb2YgQHNhbXB7bWFrZX0uICBUaGlzIHdpbGwKLWJ1aWxkIGFsbCB0aGUgbXVsdGlsaWJzLiAgTm90ZSB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIEBzYW1we01VTFRJRE99Ci1pcyBAc2FtcHt0cnVlfSwgc28gYnkgZGVmYXVsdCB0aGlzIGNvbW1hbmQgd2lsbCBkbyBub3RoaW5nLiAgSXQgd2lsbAotb25seSBkbyBzb21ldGhpbmcgaW4gdGhlIHRvcCBsZXZlbCBAZmlsZXtNYWtlZmlsZX0gaWYgbXVsdGlsaWJzIHdlcmUKLWVuYWJsZWQuCi0KLVRoZSBAc2FtcHtpbnN0YWxsfSB0YXJnZXQgb2YgdGhlIEBmaWxle01ha2VmaWxlfSBzaG91bGQgaW5jbHVkZSB0aGUKLWZvbGxvd2luZyBjb21tYW5kOgotQHNtYWxsZXhhbXBsZQotQEAkKE1VTFRJRE8pICQoRkxBR1NfVE9fUEFTUykgRE89aW5zdGFsbCBtdWx0aS1kbwotQGVuZCBzbWFsbGV4YW1wbGUKLQotSW4gZ2VuZXJhbCwgYW55IG9wZXJhdGlvbiwgb3RoZXIgdGhhbiBjbGVhbiwgd2hpY2ggc2hvdWxkIGJlIHBlcmZvcm1lZAotb24gYWxsIHRoZSBtdWx0aWxpYnMgc2hvdWxkIHVzZSBhIEBzYW1weyQoTVVMVElETyl9IGxpbmUsIHNldHRpbmcgdGhlCi12YXJpYWJsZSBAc2FtcHtET30gdG8gdGhlIHRhcmdldCBvZiBlYWNoIHJlY3Vyc2l2ZSBjYWxsIHRvIEBzYW1we21ha2V9LgotCi1UaGUgQHNhbXB7Y2xlYW59IHRhcmdldHMgKEBzYW1we2NsZWFufSwgQHNhbXB7bW9zdGx5Y2xlYW59LCBldGMuKSBzaG91bGQKLXVzZSBAc2FtcHskKE1VTFRJQ0xFQU4pfS4gIEZvciBleGFtcGxlLCB0aGUgQHNhbXB7Y2xlYW59IHRhcmdldCBzaG91bGQKLWRvIHRoaXM6Ci1Ac21hbGxleGFtcGxlCi1AQCQoTVVMVElDTEVBTikgRE89Y2xlYW4gbXVsdGktY2xlYW4KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIEZBUQotQGNoYXB0ZXIgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMKLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBXaGljaCBkbyBJIHJ1biBmaXJzdCwgQHNhbXB7YXV0b2NvbmZ9IG9yIEBzYW1we2F1dG9tYWtlfT8KLUV4Y2VwdCB3aGVuIHlvdSBmaXJzdCBhZGQgYXV0b2NvbmYgb3IgYXV0b21ha2Ugc3VwcG9ydCB0byBhIHBhY2thZ2UsIHlvdQotc2hvdWxkbid0IHJ1biBlaXRoZXIgYnkgaGFuZC4gIEluc3RlYWQsIGNvbmZpZ3VyZSB3aXRoIHRoZQotQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIGFuZCBsZXQgQHNhbXB7bWFrZX0gdGFrZSBjYXJlIG9mCi1pdC4KLQotQGNpbmRleCB1bmRlZmluZWQgbWFjcm9zCi1AaXRlbSBAc2FtcHthdXRvY29uZn0gc2F5cyBzb21ldGhpbmcgYWJvdXQgdW5kZWZpbmVkIG1hY3Jvcy4KLVRoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZSBtYWNyb3MgaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59IHdoaWNoIGFyZQotbm90IGRlZmluZWQgYnkgQHNhbXB7YXV0b2NvbmZ9LiAgWW91IG1heSBiZSB1c2luZyBhbiBvbGQgdmVyc2lvbiBvZgotQHNhbXB7YXV0b2NvbmZ9OyB0cnkgYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgYSBuZXdlciBvbmUuICBNYWtlIHN1cmUgdGhlCi1uZXdseSBpbnN0YWxsbGVkIEBzYW1we2F1dG9jb25mfSBpcyBmaXJzdCBvbiB5b3VyIEBzYW1we1BBVEh9LiAgQWxzbywKLXNlZSB0aGUgbmV4dCBxdWVzdGlvbi4KLQotQGNpbmRleCBAc2FtcHtDWV9HTlVfR0VUVEVYVH0gaW4gQGZpbGV7Y29uZmlndXJlfQotQGNpbmRleCBAc2FtcHtBTV9QUk9HX0xJQlRPT0x9IGluIEBmaWxle2NvbmZpZ3VyZX0KLUBpdGVtIE15IEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IGhhcyBzdHVmZiBsaWtlIEBzYW1we0NZX0dOVV9HRVRURVhUfSBpbiBpdC4KLVRoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZSBtYWNyb3MgaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59IHdoaWNoIHNob3VsZAotYmUgZGVmaW5lZCBpbiB5b3VyIEBmaWxle2FjbG9jYWwubTR9IGZpbGUsIGJ1dCBhcmVuJ3QuICBUaGlzIHVzdWFsbHkKLW1lYW5zIHRoYXQgQHNhbXB7YWNsb2NhbH0gd2FzIG5vdCBhYmxlIHRvIGFwcHJvcHJpYXRlIGRlZmluaXRpb25zIG9mIHRoZQotbWFjcm9zLiAgTWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgaW5zdGFsbGVkIGFsbCB0aGUgcGFja2FnZXMgeW91IG5lZWQuCi1JbiBwYXJ0aWN1bGFyLCBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBpbnN0YWxsZWQgbGlidG9vbCAodGhpcyBpcyB3aGVyZQotQHNhbXB7QU1fUFJPR19MSUJUT09MfSBpcyBkZWZpbmVkKSBhbmQgZ2V0dGV4dCAodGhpcyBpcyB3aGVyZQotQHNhbXB7Q1lfR05VX0dFVFRFWFR9IGlzIGRlZmluZWQsIGF0IGxlYXN0IGluIHRoZSBDeWdudXMgdmVyc2lvbiBvZgotZ2V0dGV4dCkuCi0KLUBjaW5kZXggQGZpbGV7TWFrZWZpbGV9LCBnYXJiYWdlIGNoYXJhY3RlcnMKLUBpdGVtIE15IEBmaWxle01ha2VmaWxlfSBoYXMgQHNhbXB7QEB9IGNoYXJhY3RlcnMgaW4gaXQuCi1UaGlzIG1heSBtZWFuIHRoYXQgeW91IHRyaWVkIHRvIHVzZSBhbiBhdXRvY29uZiBzdWJzdGl0dXRpb24gaW4geW91cgotQGZpbGV7TWFrZWZpbGUuaW59IHdpdGhvdXQgYWRkaW5nIHRoZSBhcHByb3ByaWF0ZSBAc2FtcHtBQ19TVUJTVH0gY2FsbAotdG8geW91ciBAZmlsZXtjb25maWd1cmV9IHNjcmlwdC4gIE9yIGl0IG1heSBqdXN0IG1lYW4gdGhhdCB5b3UgbmVlZCB0bwotcmVidWlsZCBAZmlsZXtNYWtlZmlsZX0gaW4geW91ciBidWlsZCBkaXJlY3RvcnkuICBUbyByZWJ1aWxkCi1AZmlsZXtNYWtlZmlsZX0gZnJvbSBAZmlsZXtNYWtlZmlsZS5pbn0sIHJ1biB0aGUgc2hlbGwgc2NyaXB0Ci1AZmlsZXtjb25maWcuc3RhdHVzfSB3aXRoIG5vIGFyZ3VtZW50cy4gIElmIHlvdSBuZWVkIHRvIGZvcmNlCi1AZmlsZXtjb25maWd1cmV9IHRvIHJ1biBhZ2FpbiwgZmlyc3QgcnVuIEBzYW1we2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrfS4KLVRoZXNlIHJ1bnMgYXJlIG5vcm1hbGx5IGRvbmUgYXV0b21hdGljYWxseSBieSBAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0cywKLWJ1dCBpZiB5b3VyIEBmaWxle01ha2VmaWxlfSBoYXMgZ290dGVuIG1lc3NlZCB1cCB5b3UnbGwgbmVlZCB0byBoZWxwCi10aGVtIGFsb25nLgotCi1AY2luZGV4IEBzYW1we2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrfQotQGl0ZW0gV2h5IGRvIEkgaGF2ZSB0byBydW4gYm90aCBAc2FtcHtjb25maWcuc3RhdHVzIC0tcmVjaGVja30gYW5kIEBzYW1we2NvbmZpZy5zdGF0dXN9PwotTm9ybWFsbHksIHlvdSBkb24ndDsgdGhleSB3aWxsIGJlIHJ1biBhdXRvbWF0aWNhbGx5IGJ5IEBmaWxle01ha2VmaWxlfQotdGFyZ2V0cy4gIElmIHlvdSBkbyBuZWVkIHRvIHJ1biB0aGVtLCB1c2UgQHNhbXB7Y29uZmlnLnN0YXR1cyAtLXJlY2hlY2t9Ci10byBydW4gdGhlIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IGFnYWluIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzIGFzIHRoZQotZmlyc3QgdGltZSB5b3UgcmFuIGl0LiAgVXNlIEBzYW1we2NvbmZpZy5zdGF0dXN9ICh3aXRoIG5vIGFyZ3VtZW50cykgdG8KLXJlZ2VuZXJhdGUgYWxsIGZpbGVzIChAZmlsZXtNYWtlZmlsZX0sIEBmaWxle2NvbmZpZy5ofSwgZXRjLikgYmFzZWQgb24KLXRoZSByZXN1bHRzIG9mIHRoZSBjb25maWd1cmUgc2NyaXB0LiAgVGhlIHR3byBjYXNlcyBhcmUgc2VwYXJhdGUgYmVjYXVzZQotaXQgaXNuJ3QgYWx3YXlzIG5lY2Vzc2FyeSB0byByZWdlbmVyYXRlIGFsbCB0aGUgZmlsZXMgYWZ0ZXIgcnVubmluZwotQHNhbXB7Y29uZmlnLnN0YXR1cyAtLXJlY2hlY2t9LiAgVGhlIEBmaWxle01ha2VmaWxlfSB0YXJnZXRzIGdlbmVyYXRlZAotYnkgYXV0b21ha2Ugd2lsbCB1c2UgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBAc2FtcHtDT05GSUdfRklMRVN9IGFuZAotQHNhbXB7Q09ORklHX0hFQURFUlN9IHRvIG9ubHkgcmVnZW5lcmF0ZSBmaWxlcyBhcyB0aGV5IGFyZSBuZWVkZWQuCi0KLUBpdGVtIFdoYXQgaXMgdGhlIEN5Z251cyB0cmVlPwotVGhlIEN5Z251cyB0cmVlIGlzIHVzZWQgZm9yIHZhcmlvdXMgcGFja2FnZXMgaW5jbHVkaW5nIGdkYiwgdGhlIEdOVQotYmludXRpbHMsIGFuZCBlZ2NzLiAgSXQgaXMgYWxzbywgb2YgY291cnNlLCB1c2VkIGZvciBDeWdudXMgcmVsZWFzZXMuCi1JdCBpcyB0aGUgYnVpbGQgc3lzdGVtIHdoaWNoIHdhcyBkZXZlbG9wZWQgYXQgQ3lnbnVzLCB1c2luZyB0aGUgQ3lnbnVzCi1jb25maWd1cmUgc2NyaXB0LiAgSXQgcGVybWl0cyBidWlsZGluZyBtYW55IGRpZmZlcmVudCBwYWNrYWdlcyB3aXRoIGEKLXNpbmdsZSBjb25maWd1cmUgYW5kIG1ha2UuICBUaGUgY29uZmlndXJlIHNjcmlwdHMgaW4gdGhlIHRyZWUgYXJlIGJlaW5nCi1jb252ZXJ0ZWQgdG8gYXV0b2NvbmYsIGJ1dCB0aGUgZ2VuZXJhbCBidWlsZCBzdHJ1Y3R1cmUgcmVtYWlucyBpbnRhY3QuCi0KLUBpdGVtIFdoeSBkbyBJIGhhdmUgdG8ga2VlcCByZWJ1aWxkaW5nIGFuZCByZWluc3RhbGxpbmcgdGhlIHRvb2xzPwotSSBrbm93LCBpdCdzIGEgcGFpbi4gIFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBidWdzIGluIHRoZSB0b29scwotdGhlbXNlbHZlcyB3aGljaCBuZWVkIHRvIGJlIGZpeGVkLCBhbmQgZWFjaCB0aW1lIHRoYXQgaGFwcGVucyBldmVyeWJvZHkKLXdobyB1c2VzIHRoZSB0b29scyBuZWVkIHRvIHJlaW5zdGFsbCBuZXcgdmVyc2lvbnMgb2YgdGhlbS4gIEkgZG9uJ3Qga25vdwotaWYgdGhlcmUgaXMgZ29pbmcgdG8gYmUgYSBjbGV2ZXIgZml4IHVudGlsIHRoZSB0b29scyBzdGFiaWxpemUuCi0KLUBpdGVtIFdoeSBub3QganVzdCBoYXZlIGEgQ3lnbnVzIHRyZWUgQHNhbXB7bWFrZX0gdGFyZ2V0IHRvIHVwZGF0ZSB0aGUgdG9vbHM/Ci1UaGUgdG9vbHMgdW5mb3J0dW5hdGVseSBuZWVkIHRvIGJlIGluc3RhbGxlZCBiZWZvcmUgdGhleSBjYW4gYmUgdXNlZC4KLVRoYXQgbWVhbnMgdGhhdCB0aGV5IG11c3QgYmUgYnVpbHQgdXNpbmcgYW4gYXBwcm9wcmlhdGUgcHJlZml4LCBhbmQgaXQKLXNlZW1zIHVud2lzZSB0byBhc3N1bWUgdGhhdCBldmVyeSBjb25maWd1cmF0aW9uIHVzZXMgYW4gYXBwcm9wcmlhdGUKLXByZWZpeC4gIEl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIG1ha2UgdGhlbSB3b3JrIGluIHBsYWNlLCBvciBpdCBtaWdodCBiZQotcG9zc2libGUgdG8gaW5zdGFsbCB0aGVtIGluIHNvbWUgc3ViZGlyZWN0b3J5OyBzbyBmYXIgdGhlc2UgYXBwcm9hY2hlcwotaGF2ZSBub3QgYmVlbiBpbXBsZW1lbnRlZC4KLUBlbmQgdGFibGUKLQotQG5vZGUgSW5kZXgKLUB1bm51bWJlcmVkIEluZGV4Ci0KLUBwcmludGluZGV4IGNwCi0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvZXRjL21ha2Utc3Rkcy50ZXhpIGIvZXRjL21ha2Utc3Rkcy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTQ5NzY0Li4wMDAwMDAwCi0tLSBhL2V0Yy9tYWtlLXN0ZHMudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCwwIEBACi1AY29tbWVudCBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgYm90aCBzdGFuZGFyZHMudGV4aSBhbmQgbWFrZS50ZXhpbmZvLgotQGNvbW1lbnQgSXQgd2FzIGJyb2tlbiBvdXQgb2Ygc3RhbmRhcmRzLnRleGkgb24gMS82LzkzIGJ5IHJvbGFuZC4KLQotQG5vZGUgTWFrZWZpbGUgQ29udmVudGlvbnMKLUBjaGFwdGVyIE1ha2VmaWxlIENvbnZlbnRpb25zCi1AY29tbWVudCBzdGFuZGFyZHMudGV4aSBkb2VzIG5vdCBwcmludCBhbiBpbmRleCwgYnV0IG1ha2UudGV4aW5mbyBkb2VzLgotQGNpbmRleCBtYWtlZmlsZSwgY29udmVudGlvbnMgZm9yCi1AY2luZGV4IGNvbnZlbnRpb25zIGZvciBtYWtlZmlsZXMKLUBjaW5kZXggc3RhbmRhcmRzIGZvciBtYWtlZmlsZXMKLQotVGhpcwotQGlmaW5mbwotbm9kZQotQGVuZCBpZmluZm8KLUBpZnRleAotQGlmc2V0IENPREVTVEQKLXNlY3Rpb24KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIENPREVTVEQKLWNoYXB0ZXIKLUBlbmQgaWZjbGVhcgotQGVuZCBpZnRleAotZGVzY3JpYmVzIGNvbnZlbnRpb25zIGZvciB3cml0aW5nIHRoZSBNYWtlZmlsZXMgZm9yIEdOVSBwcm9ncmFtcy4KLQotQG1lbnUKLSogTWFrZWZpbGUgQmFzaWNzOjoJCUdlbmVyYWwgQ29udmVudGlvbnMgZm9yIE1ha2VmaWxlcwotKiBVdGlsaXRpZXMgaW4gTWFrZWZpbGVzOjoJVXRpbGl0aWVzIGluIE1ha2VmaWxlcwotKiBDb21tYW5kIFZhcmlhYmxlczo6CQlWYXJpYWJsZXMgZm9yIFNwZWNpZnlpbmcgQ29tbWFuZHMKLSogRGlyZWN0b3J5IFZhcmlhYmxlczo6CQlWYXJpYWJsZXMgZm9yIEluc3RhbGxhdGlvbiBEaXJlY3RvcmllcwotKiBTdGFuZGFyZCBUYXJnZXRzOjoJCVN0YW5kYXJkIFRhcmdldHMgZm9yIFVzZXJzCi0qIEluc3RhbGwgQ29tbWFuZCBDYXRlZ29yaWVzOjogIFRocmVlIGNhdGVnb3JpZXMgb2YgY29tbWFuZHMgaW4gdGhlIGBpbnN0YWxsJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGU6IG5vcm1hbCwgcHJlLWluc3RhbGwgYW5kIHBvc3QtaW5zdGFsbC4KLUBlbmQgbWVudQotCi1Abm9kZSBNYWtlZmlsZSBCYXNpY3MKLUBzZWN0aW9uIEdlbmVyYWwgQ29udmVudGlvbnMgZm9yIE1ha2VmaWxlcwotCi1FdmVyeSBNYWtlZmlsZSBzaG91bGQgY29udGFpbiB0aGlzIGxpbmU6Ci0KLUBleGFtcGxlCi1TSEVMTCA9IC9iaW4vc2gKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXRvIGF2b2lkIHRyb3VibGUgb24gc3lzdGVtcyB3aGVyZSB0aGUgQGNvZGV7U0hFTEx9IHZhcmlhYmxlIG1pZ2h0IGJlCi1pbmhlcml0ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQuICAoVGhpcyBpcyBuZXZlciBhIHByb2JsZW0gd2l0aCBHTlUKLUBjb2Rle21ha2V9LikKLQotRGlmZmVyZW50IEBjb2Rle21ha2V9IHByb2dyYW1zIGhhdmUgaW5jb21wYXRpYmxlIHN1ZmZpeCBsaXN0cyBhbmQKLWltcGxpY2l0IHJ1bGVzLCBhbmQgdGhpcyBzb21ldGltZXMgY3JlYXRlcyBjb25mdXNpb24gb3IgbWlzYmVoYXZpb3IuICBTbwotaXQgaXMgYSBnb29kIGlkZWEgdG8gc2V0IHRoZSBzdWZmaXggbGlzdCBleHBsaWNpdGx5IHVzaW5nIG9ubHkgdGhlCi1zdWZmaXhlcyB5b3UgbmVlZCBpbiB0aGUgcGFydGljdWxhciBNYWtlZmlsZSwgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotVGhlIGZpcnN0IGxpbmUgY2xlYXJzIG91dCB0aGUgc3VmZml4IGxpc3QsIHRoZSBzZWNvbmQgaW50cm9kdWNlcyBhbGwKLXN1ZmZpeGVzIHdoaWNoIG1heSBiZSBzdWJqZWN0IHRvIGltcGxpY2l0IHJ1bGVzIGluIHRoaXMgTWFrZWZpbGUuCi0KLURvbid0IGFzc3VtZSB0aGF0IEBmaWxley59IGlzIGluIHRoZSBwYXRoIGZvciBjb21tYW5kIGV4ZWN1dGlvbi4gIFdoZW4KLXlvdSBuZWVkIHRvIHJ1biBwcm9ncmFtcyB0aGF0IGFyZSBhIHBhcnQgb2YgeW91ciBwYWNrYWdlIGR1cmluZyB0aGUKLW1ha2UsIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCBpdCB1c2VzIEBmaWxley4vfSBpZiB0aGUgcHJvZ3JhbSBpcyBidWlsdCBhcwotcGFydCBvZiB0aGUgbWFrZSBvciBAZmlsZXskKHNyY2RpcikvfSBpZiB0aGUgZmlsZSBpcyBhbiB1bmNoYW5naW5nIHBhcnQKLW9mIHRoZSBzb3VyY2UgY29kZS4gIFdpdGhvdXQgb25lIG9mIHRoZXNlIHByZWZpeGVzLCB0aGUgY3VycmVudCBzZWFyY2gKLXBhdGggaXMgdXNlZC4KLQotVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gQGZpbGV7Li99ICh0aGUgQGRmbntidWlsZCBkaXJlY3Rvcnl9KSBhbmQKLUBmaWxleyQoc3JjZGlyKS99ICh0aGUgQGRmbntzb3VyY2UgZGlyZWN0b3J5fSkgaXMgaW1wb3J0YW50IGJlY2F1c2UKLXVzZXJzIGNhbiBidWlsZCBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSB1c2luZyB0aGUgQHNhbXB7LS1zcmNkaXJ9IG9wdGlvbgotdG8gQGZpbGV7Y29uZmlndXJlfS4gIEEgcnVsZSBvZiB0aGUgZm9ybToKLQotQHNtYWxsZXhhbXBsZQotZm9vLjEgOiBmb28ubWFuIHNlZHNjcmlwdAotICAgICAgICBzZWQgLWUgc2Vkc2NyaXB0IGZvby5tYW4gPiBmb28uMQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aWxsIGZhaWwgd2hlbiB0aGUgYnVpbGQgZGlyZWN0b3J5IGlzIG5vdCB0aGUgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZQotQGZpbGV7Zm9vLm1hbn0gYW5kIEBmaWxle3NlZHNjcmlwdH0gYXJlIGluIHRoZSB0aGUgc291cmNlIGRpcmVjdG9yeS4KLQotV2hlbiB1c2luZyBHTlUgQGNvZGV7bWFrZX0sIHJlbHlpbmcgb24gQHNhbXB7VlBBVEh9IHRvIGZpbmQgdGhlIHNvdXJjZQotZmlsZSB3aWxsIHdvcmsgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgYSBzaW5nbGUgZGVwZW5kZW5jeSBmaWxlLAotc2luY2UgdGhlIEBjb2Rle21ha2V9IGF1dG9tYXRpYyB2YXJpYWJsZSBAc2FtcHskPH0gd2lsbCByZXByZXNlbnQgdGhlCi1zb3VyY2UgZmlsZSB3aGVyZXZlciBpdCBpcy4gIChNYW55IHZlcnNpb25zIG9mIEBjb2Rle21ha2V9IHNldCBAc2FtcHskPH0KLW9ubHkgaW4gaW1wbGljaXQgcnVsZXMuKSAgQSBNYWtlZmlsZSB0YXJnZXQgbGlrZQotCi1Ac21hbGxleGFtcGxlCi1mb28ubyA6IGJhci5jCi0gICAgICAgICQoQ0MpIC1JLiAtSSQoc3JjZGlyKSAkKENGTEFHUykgLWMgYmFyLmMgLW8gZm9vLm8KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotc2hvdWxkIGluc3RlYWQgYmUgd3JpdHRlbiBhcwotCi1Ac21hbGxleGFtcGxlCi1mb28ubyA6IGJhci5jCi0gICAgICAgICQoQ0MpIC1JLiAtSSQoc3JjZGlyKSAkKENGTEFHUykgLWMgJDwgLW8gJEBACi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLWluIG9yZGVyIHRvIGFsbG93IEBzYW1we1ZQQVRIfSB0byB3b3JrIGNvcnJlY3RseS4gIFdoZW4gdGhlIHRhcmdldCBoYXMKLW11bHRpcGxlIGRlcGVuZGVuY2llcywgdXNpbmcgYW4gZXhwbGljaXQgQHNhbXB7JChzcmNkaXIpfSBpcyB0aGUgZWFzaWVzdAotd2F5IHRvIG1ha2UgdGhlIHJ1bGUgd29yayB3ZWxsLiAgRm9yIGV4YW1wbGUsIHRoZSB0YXJnZXQgYWJvdmUgZm9yCi1AZmlsZXtmb28uMX0gaXMgYmVzdCB3cml0dGVuIGFzOgotCi1Ac21hbGxleGFtcGxlCi1mb28uMSA6IGZvby5tYW4gc2Vkc2NyaXB0Ci0gICAgICAgIHNlZCAtZSAkKHNyY2Rpcikvc2Vkc2NyaXB0ICQoc3JjZGlyKS9mb28ubWFuID4gJEBACi1AZW5kIHNtYWxsZXhhbXBsZQotCi1HTlUgZGlzdHJpYnV0aW9ucyB1c3VhbGx5IGNvbnRhaW4gc29tZSBmaWxlcyB3aGljaCBhcmUgbm90IHNvdXJjZQotZmlsZXMtLS1mb3IgZXhhbXBsZSwgSW5mbyBmaWxlcywgYW5kIHRoZSBvdXRwdXQgZnJvbSBBdXRvY29uZiwgQXV0b21ha2UsCi1CaXNvbiBvciBGbGV4LiAgU2luY2UgdGhlc2UgZmlsZXMgbm9ybWFsbHkgYXBwZWFyIGluIHRoZSBzb3VyY2UKLWRpcmVjdG9yeSwgdGhleSBzaG91bGQgYWx3YXlzIGFwcGVhciBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSwgbm90IGluIHRoZQotYnVpbGQgZGlyZWN0b3J5LiAgU28gTWFrZWZpbGUgcnVsZXMgdG8gdXBkYXRlIHRoZW0gc2hvdWxkIHB1dCB0aGUKLXVwZGF0ZWQgZmlsZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuCi0KLUhvd2V2ZXIsIGlmIGEgZmlsZSBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIGRpc3RyaWJ1dGlvbiwgdGhlbiB0aGUKLU1ha2VmaWxlIHNob3VsZCBub3QgcHV0IGl0IGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIGJ1aWxkaW5nIGEKLXByb2dyYW0gaW4gb3JkaW5hcnkgY2lyY3Vtc3RhbmNlcyBzaG91bGQgbm90IG1vZGlmeSB0aGUgc291cmNlIGRpcmVjdG9yeQotaW4gYW55IHdheS4KLQotVHJ5IHRvIG1ha2UgdGhlIGJ1aWxkIGFuZCBpbnN0YWxsYXRpb24gdGFyZ2V0cywgYXQgbGVhc3QgKGFuZCBhbGwgdGhlaXIKLXN1YnRhcmdldHMpIHdvcmsgY29ycmVjdGx5IHdpdGggYSBwYXJhbGxlbCBAY29kZXttYWtlfS4KLQotQG5vZGUgVXRpbGl0aWVzIGluIE1ha2VmaWxlcwotQHNlY3Rpb24gVXRpbGl0aWVzIGluIE1ha2VmaWxlcwotCi1Xcml0ZSB0aGUgTWFrZWZpbGUgY29tbWFuZHMgKGFuZCBhbnkgc2hlbGwgc2NyaXB0cywgc3VjaCBhcwotQGNvZGV7Y29uZmlndXJlfSkgdG8gcnVuIGluIEBjb2Rle3NofSwgbm90IGluIEBjb2Rle2NzaH0uICBEb24ndCB1c2UgYW55Ci1zcGVjaWFsIGZlYXR1cmVzIG9mIEBjb2Rle2tzaH0gb3IgQGNvZGV7YmFzaH0uCi0KLVRoZSBAY29kZXtjb25maWd1cmV9IHNjcmlwdCBhbmQgdGhlIE1ha2VmaWxlIHJ1bGVzIGZvciBidWlsZGluZyBhbmQKLWluc3RhbGxhdGlvbiBzaG91bGQgbm90IHVzZSBhbnkgdXRpbGl0aWVzIGRpcmVjdGx5IGV4Y2VwdCB0aGVzZToKLQotQGMgZGQgZmluZAotQGMgZ3VuemlwIGd6aXAgbWQ1c3VtCi1AYyBta2ZpZm8gbWtub2QgdGVlIHVuYW1lIAotCi1AZXhhbXBsZQotY2F0IGNtcCBjcCBkaWZmIGVjaG8gZWdyZXAgZXhwciBmYWxzZSBncmVwIGluc3RhbGwtaW5mbwotbG4gbHMgbWtkaXIgbXYgcHdkIHJtIHJtZGlyIHNlZCBzbGVlcCBzb3J0IHRhciB0ZXN0IHRvdWNoIHRydWUKLUBlbmQgZXhhbXBsZQotCi1UaGUgY29tcHJlc3Npb24gcHJvZ3JhbSBAY29kZXtnemlwfSBjYW4gYmUgdXNlZCBpbiB0aGUgQGNvZGV7ZGlzdH0gcnVsZS4KLQotU3RpY2sgdG8gdGhlIGdlbmVyYWxseSBzdXBwb3J0ZWQgb3B0aW9ucyBmb3IgdGhlc2UgcHJvZ3JhbXMuICBGb3IKLWV4YW1wbGUsIGRvbid0IHVzZSBAc2FtcHtta2RpciAtcH0sIGNvbnZlbmllbnQgYXMgaXQgbWF5IGJlLCBiZWNhdXNlCi1tb3N0IHN5c3RlbXMgZG9uJ3Qgc3VwcG9ydCBpdC4KLQotSXQgaXMgYSBnb29kIGlkZWEgdG8gYXZvaWQgY3JlYXRpbmcgc3ltYm9saWMgbGlua3MgaW4gbWFrZWZpbGVzLCBzaW5jZSBhCi1mZXcgc3lzdGVtcyBkb24ndCBzdXBwb3J0IHRoZW0uCi0KLVRoZSBNYWtlZmlsZSBydWxlcyBmb3IgYnVpbGRpbmcgYW5kIGluc3RhbGxhdGlvbiBjYW4gYWxzbyB1c2UgY29tcGlsZXJzCi1hbmQgcmVsYXRlZCBwcm9ncmFtcywgYnV0IHNob3VsZCBkbyBzbyB2aWEgQGNvZGV7bWFrZX0gdmFyaWFibGVzIHNvIHRoYXQgdGhlCi11c2VyIGNhbiBzdWJzdGl0dXRlIGFsdGVybmF0aXZlcy4gIEhlcmUgYXJlIHNvbWUgb2YgdGhlIHByb2dyYW1zIHdlCi1tZWFuOgotCi1AZXhhbXBsZQotYXIgYmlzb24gY2MgZmxleCBpbnN0YWxsIGxkIGxkY29uZmlnIGxleAotbWFrZSBtYWtlaW5mbyByYW5saWIgdGV4aTJkdmkgeWFjYwotQGVuZCBleGFtcGxlCi0KLVVzZSB0aGUgZm9sbG93aW5nIEBjb2Rle21ha2V9IHZhcmlhYmxlcyB0byBydW4gdGhvc2UgcHJvZ3JhbXM6Ci0KLUBleGFtcGxlCi0kKEFSKSAkKEJJU09OKSAkKENDKSAkKEZMRVgpICQoSU5TVEFMTCkgJChMRCkgJChMRENPTkZJRykgJChMRVgpCi0kKE1BS0UpICQoTUFLRUlORk8pICQoUkFOTElCKSAkKFRFWEkyRFZJKSAkKFlBQ0MpCi1AZW5kIGV4YW1wbGUKLQotV2hlbiB5b3UgdXNlIEBjb2Rle3JhbmxpYn0gb3IgQGNvZGV7bGRjb25maWd9LCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZQotbm90aGluZyBiYWQgaGFwcGVucyBpZiB0aGUgc3lzdGVtIGRvZXMgbm90IGhhdmUgdGhlIHByb2dyYW0gaW4gcXVlc3Rpb24uCi1BcnJhbmdlIHRvIGlnbm9yZSBhbiBlcnJvciBmcm9tIHRoYXQgY29tbWFuZCwgYW5kIHByaW50IGEgbWVzc2FnZSBiZWZvcmUKLXRoZSBjb21tYW5kIHRvIHRlbGwgdGhlIHVzZXIgdGhhdCBmYWlsdXJlIG9mIHRoaXMgY29tbWFuZCBkb2VzIG5vdCBtZWFuCi1hIHByb2JsZW0uICAoVGhlIEF1dG9jb25mIEBzYW1we0FDX1BST0dfUkFOTElCfSBtYWNybyBjYW4gaGVscCB3aXRoCi10aGlzLikKLQotSWYgeW91IHVzZSBzeW1ib2xpYyBsaW5rcywgeW91IHNob3VsZCBpbXBsZW1lbnQgYSBmYWxsYmFjayBmb3Igc3lzdGVtcwotdGhhdCBkb24ndCBoYXZlIHN5bWJvbGljIGxpbmtzLgotCi1BZGRpdGlvbmFsIHV0aWxpdGllcyB0aGF0IGNhbiBiZSB1c2VkIHZpYSBNYWtlIHZhcmlhYmxlcyBhcmU6Ci0KLUBleGFtcGxlCi1jaGdycCBjaG1vZCBjaG93biBta25vZAotQGVuZCBleGFtcGxlCi0KLUl0IGlzIG9rIHRvIHVzZSBvdGhlciB1dGlsaXRpZXMgaW4gTWFrZWZpbGUgcG9ydGlvbnMgKG9yIHNjcmlwdHMpCi1pbnRlbmRlZCBvbmx5IGZvciBwYXJ0aWN1bGFyIHN5c3RlbXMgd2hlcmUgeW91IGtub3cgdGhvc2UgdXRpbGl0aWVzCi1leGlzdC4KLQotQG5vZGUgQ29tbWFuZCBWYXJpYWJsZXMKLUBzZWN0aW9uIFZhcmlhYmxlcyBmb3IgU3BlY2lmeWluZyBDb21tYW5kcwotCi1NYWtlZmlsZXMgc2hvdWxkIHByb3ZpZGUgdmFyaWFibGVzIGZvciBvdmVycmlkaW5nIGNlcnRhaW4gY29tbWFuZHMsIG9wdGlvbnMsCi1hbmQgc28gb24uCi0KLUluIHBhcnRpY3VsYXIsIHlvdSBzaG91bGQgcnVuIG1vc3QgdXRpbGl0eSBwcm9ncmFtcyB2aWEgdmFyaWFibGVzLgotVGh1cywgaWYgeW91IHVzZSBCaXNvbiwgaGF2ZSBhIHZhcmlhYmxlIG5hbWVkIEBjb2Rle0JJU09OfSB3aG9zZSBkZWZhdWx0Ci12YWx1ZSBpcyBzZXQgd2l0aCBAc2FtcHtCSVNPTiA9IGJpc29ufSwgYW5kIHJlZmVyIHRvIGl0IHdpdGgKLUBjb2RleyQoQklTT04pfSB3aGVuZXZlciB5b3UgbmVlZCB0byB1c2UgQmlzb24uCi0KLUZpbGUgbWFuYWdlbWVudCB1dGlsaXRpZXMgc3VjaCBhcyBAY29kZXtsbn0sIEBjb2Rle3JtfSwgQGNvZGV7bXZ9LCBhbmQKLXNvIG9uLCBuZWVkIG5vdCBiZSByZWZlcnJlZCB0byB0aHJvdWdoIHZhcmlhYmxlcyBpbiB0aGlzIHdheSwgc2luY2UgdXNlcnMKLWRvbid0IG5lZWQgdG8gcmVwbGFjZSB0aGVtIHdpdGggb3RoZXIgcHJvZ3JhbXMuCi0KLUVhY2ggcHJvZ3JhbS1uYW1lIHZhcmlhYmxlIHNob3VsZCBjb21lIHdpdGggYW4gb3B0aW9ucyB2YXJpYWJsZSB0aGF0IGlzCi11c2VkIHRvIHN1cHBseSBvcHRpb25zIHRvIHRoZSBwcm9ncmFtLiAgQXBwZW5kIEBzYW1we0ZMQUdTfSB0byB0aGUKLXByb2dyYW0tbmFtZSB2YXJpYWJsZSBuYW1lIHRvIGdldCB0aGUgb3B0aW9ucyB2YXJpYWJsZSBuYW1lLS0tZm9yCi1leGFtcGxlLCBAY29kZXtCSVNPTkZMQUdTfS4gIChUaGUgbmFtZXMgQGNvZGV7Q0ZMQUdTfSBmb3IgdGhlIEMKLWNvbXBpbGVyLCBAY29kZXtZRkxBR1N9IGZvciB5YWNjLCBhbmQgQGNvZGV7TEZMQUdTfSBmb3IgbGV4LCBhcmUKLWV4Y2VwdGlvbnMgdG8gdGhpcyBydWxlLCBidXQgd2Uga2VlcCB0aGVtIGJlY2F1c2UgdGhleSBhcmUgc3RhbmRhcmQuKQotVXNlIEBjb2Rle0NQUEZMQUdTfSBpbiBhbnkgY29tcGlsYXRpb24gY29tbWFuZCB0aGF0IHJ1bnMgdGhlCi1wcmVwcm9jZXNzb3IsIGFuZCB1c2UgQGNvZGV7TERGTEFHU30gaW4gYW55IGNvbXBpbGF0aW9uIGNvbW1hbmQgdGhhdAotZG9lcyBsaW5raW5nIGFzIHdlbGwgYXMgaW4gYW55IGRpcmVjdCB1c2Ugb2YgQGNvZGV7bGR9LgotCi1JZiB0aGVyZSBhcmUgQyBjb21waWxlciBvcHRpb25zIHRoYXQgQGVtcGh7bXVzdH0gYmUgdXNlZCBmb3IgcHJvcGVyCi1jb21waWxhdGlvbiBvZiBjZXJ0YWluIGZpbGVzLCBkbyBub3QgaW5jbHVkZSB0aGVtIGluIEBjb2Rle0NGTEFHU30uCi1Vc2VycyBleHBlY3QgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IEBjb2Rle0NGTEFHU30gZnJlZWx5IHRoZW1zZWx2ZXMuCi1JbnN0ZWFkLCBhcnJhbmdlIHRvIHBhc3MgdGhlIG5lY2Vzc2FyeSBvcHRpb25zIHRvIHRoZSBDIGNvbXBpbGVyCi1pbmRlcGVuZGVudGx5IG9mIEBjb2Rle0NGTEFHU30sIGJ5IHdyaXRpbmcgdGhlbSBleHBsaWNpdGx5IGluIHRoZQotY29tcGlsYXRpb24gY29tbWFuZHMgb3IgYnkgZGVmaW5pbmcgYW4gaW1wbGljaXQgcnVsZSwgbGlrZSB0aGlzOgotCi1Ac21hbGxleGFtcGxlCi1DRkxBR1MgPSAtZwotQUxMX0NGTEFHUyA9IC1JLiAkKENGTEFHUykKLS5jLm86Ci0gICAgICAgICQoQ0MpIC1jICQoQ1BQRkxBR1MpICQoQUxMX0NGTEFHUykgJDwKLUBlbmQgc21hbGxleGFtcGxlCi0KLURvIGluY2x1ZGUgdGhlIEBzYW1wey1nfSBvcHRpb24gaW4gQGNvZGV7Q0ZMQUdTfSwgYmVjYXVzZSB0aGF0IGlzIG5vdAotQGVtcGh7cmVxdWlyZWR9IGZvciBwcm9wZXIgY29tcGlsYXRpb24uICBZb3UgY2FuIGNvbnNpZGVyIGl0IGEgZGVmYXVsdAotdGhhdCBpcyBvbmx5IHJlY29tbWVuZGVkLiAgSWYgdGhlIHBhY2thZ2UgaXMgc2V0IHVwIHNvIHRoYXQgaXQgaXMKLWNvbXBpbGVkIHdpdGggR0NDIGJ5IGRlZmF1bHQsIHRoZW4geW91IG1pZ2h0IGFzIHdlbGwgaW5jbHVkZSBAc2FtcHstT30KLWluIHRoZSBkZWZhdWx0IHZhbHVlIG9mIEBjb2Rle0NGTEFHU30gYXMgd2VsbC4KLQotUHV0IEBjb2Rle0NGTEFHU30gbGFzdCBpbiB0aGUgY29tcGlsYXRpb24gY29tbWFuZCwgYWZ0ZXIgb3RoZXIgdmFyaWFibGVzCi1jb250YWluaW5nIGNvbXBpbGVyIG9wdGlvbnMsIHNvIHRoZSB1c2VyIGNhbiB1c2UgQGNvZGV7Q0ZMQUdTfSB0bwotb3ZlcnJpZGUgdGhlIG90aGVycy4KLQotQGNvZGV7Q0ZMQUdTfSBzaG91bGQgYmUgdXNlZCBpbiBldmVyeSBpbnZvY2F0aW9uIG9mIHRoZSBDIGNvbXBpbGVyLAotYm90aCB0aG9zZSB3aGljaCBkbyBjb21waWxhdGlvbiBhbmQgdGhvc2Ugd2hpY2ggZG8gbGlua2luZy4KLQotRXZlcnkgTWFrZWZpbGUgc2hvdWxkIGRlZmluZSB0aGUgdmFyaWFibGUgQGNvZGV7SU5TVEFMTH0sIHdoaWNoIGlzIHRoZQotYmFzaWMgY29tbWFuZCBmb3IgaW5zdGFsbGluZyBhIGZpbGUgaW50byB0aGUgc3lzdGVtLgotCi1FdmVyeSBNYWtlZmlsZSBzaG91bGQgYWxzbyBkZWZpbmUgdGhlIHZhcmlhYmxlcyBAY29kZXtJTlNUQUxMX1BST0dSQU19Ci1hbmQgQGNvZGV7SU5TVEFMTF9EQVRBfS4gIChUaGUgZGVmYXVsdCBmb3IgZWFjaCBvZiB0aGVzZSBzaG91bGQgYmUKLUBjb2RleyQoSU5TVEFMTCl9LikgIFRoZW4gaXQgc2hvdWxkIHVzZSB0aG9zZSB2YXJpYWJsZXMgYXMgdGhlIGNvbW1hbmRzCi1mb3IgYWN0dWFsIGluc3RhbGxhdGlvbiwgZm9yIGV4ZWN1dGFibGVzIGFuZCBub25leGVjdXRhYmxlcwotcmVzcGVjdGl2ZWx5LiAgVXNlIHRoZXNlIHZhcmlhYmxlcyBhcyBmb2xsb3dzOgotCi1AZXhhbXBsZQotJChJTlNUQUxMX1BST0dSQU0pIGZvbyAkKGJpbmRpcikvZm9vCi0kKElOU1RBTExfREFUQSkgbGliZm9vLmEgJChsaWJkaXIpL2xpYmZvby5hCi1AZW5kIGV4YW1wbGUKLQotT3B0aW9uYWxseSwgeW91IG1heSBwcmVwZW5kIHRoZSB2YWx1ZSBvZiBAY29kZXtERVNURElSfSB0byB0aGUgdGFyZ2V0Ci1maWxlbmFtZS4gIERvaW5nIHRoaXMgYWxsb3dzIHRoZSBpbnN0YWxsZXIgdG8gY3JlYXRlIGEgc25hcHNob3Qgb2YgdGhlCi1pbnN0YWxsYXRpb24gdG8gYmUgY29waWVkIG9udG8gdGhlIHJlYWwgdGFyZ2V0IGZpbGVzeXN0ZW0gbGF0ZXIuICBEbyBub3QKLXNldCB0aGUgdmFsdWUgb2YgQGNvZGV7REVTVERJUn0gaW4geW91ciBNYWtlZmlsZSwgYW5kIGRvIG5vdCBpbmNsdWRlIGl0Ci1pbiBhbnkgaW5zdGFsbGVkIGZpbGVzLiAgV2l0aCBzdXBwb3J0IGZvciBAY29kZXtERVNURElSfSwgdGhlIGFib3ZlCi1leGFtcGxlcyBiZWNvbWU6Ci0KLUBleGFtcGxlCi0kKElOU1RBTExfUFJPR1JBTSkgZm9vICQoREVTVERJUikkKGJpbmRpcikvZm9vCi0kKElOU1RBTExfREFUQSkgbGliZm9vLmEgJChERVNURElSKSQobGliZGlyKS9saWJmb28uYQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotQWx3YXlzIHVzZSBhIGZpbGUgbmFtZSwgbm90IGEgZGlyZWN0b3J5IG5hbWUsIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YKLXRoZSBpbnN0YWxsYXRpb24gY29tbWFuZHMuICBVc2UgYSBzZXBhcmF0ZSBjb21tYW5kIGZvciBlYWNoIGZpbGUgdG8gYmUKLWluc3RhbGxlZC4KLQotQG5vZGUgRGlyZWN0b3J5IFZhcmlhYmxlcwotQHNlY3Rpb24gVmFyaWFibGVzIGZvciBJbnN0YWxsYXRpb24gRGlyZWN0b3JpZXMKLQotSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIHNob3VsZCBhbHdheXMgYmUgbmFtZWQgYnkgdmFyaWFibGVzLCBzbyBpdCBpcwotZWFzeSB0byBpbnN0YWxsIGluIGEgbm9uc3RhbmRhcmQgcGxhY2UuICBUaGUgc3RhbmRhcmQgbmFtZXMgZm9yIHRoZXNlCi12YXJpYWJsZXMgYXJlIGRlc2NyaWJlZCBiZWxvdy4gIFRoZXkgYXJlIGJhc2VkIG9uIGEgc3RhbmRhcmQgZmlsZXN5c3RlbQotbGF5b3V0OyB2YXJpYW50cyBvZiBpdCBhcmUgdXNlZCBpbiBTVlI0LCA0LjRCU0QsIExpbnV4LCBVbHRyaXggdjQsIGFuZAotb3RoZXIgbW9kZXJuIG9wZXJhdGluZyBzeXN0ZW1zLgotCi1UaGVzZSB0d28gdmFyaWFibGVzIHNldCB0aGUgcm9vdCBmb3IgdGhlIGluc3RhbGxhdGlvbi4gIEFsbCB0aGUgb3RoZXIKLWluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyBzaG91bGQgYmUgc3ViZGlyZWN0b3JpZXMgb2Ygb25lIG9mIHRoZXNlIHR3bywKLWFuZCBub3RoaW5nIHNob3VsZCBiZSBkaXJlY3RseSBpbnN0YWxsZWQgaW50byB0aGVzZSB0d28gZGlyZWN0b3JpZXMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gcHJlZml4Ci1BIHByZWZpeCB1c2VkIGluIGNvbnN0cnVjdGluZyB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIHZhcmlhYmxlcyBsaXN0ZWQKLWJlbG93LiAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7cHJlZml4fSBzaG91bGQgYmUgQGZpbGV7L3Vzci9sb2NhbH0uCi1XaGVuIGJ1aWxkaW5nIHRoZSBjb21wbGV0ZSBHTlUgc3lzdGVtLCB0aGUgcHJlZml4IHdpbGwgYmUgZW1wdHkgYW5kCi1AZmlsZXsvdXNyfSB3aWxsIGJlIGEgc3ltYm9saWMgbGluayB0byBAZmlsZXsvfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQHByZWZpeEBAfS4pCi0KLVJ1bm5pbmcgQHNhbXB7bWFrZSBpbnN0YWxsfSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIG9mIEBjb2Rle3ByZWZpeH0KLWZyb20gdGhlIG9uZSB1c2VkIHRvIGJ1aWxkIHRoZSBwcm9ncmFtIHNob3VsZCBAdmFye25vdH0gcmVjb21waWxlCi10aGUgcHJvZ3JhbS4KLQotQGl0ZW0gZXhlY19wcmVmaXgKLUEgcHJlZml4IHVzZWQgaW4gY29uc3RydWN0aW5nIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiBzb21lIG9mIHRoZQotdmFyaWFibGVzIGxpc3RlZCBiZWxvdy4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIEBjb2Rle2V4ZWNfcHJlZml4fSBzaG91bGQKLWJlIEBjb2RleyQocHJlZml4KX0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBleGVjX3ByZWZpeEBAfS4pCi0KLUdlbmVyYWxseSwgQGNvZGV7JChleGVjX3ByZWZpeCl9IGlzIHVzZWQgZm9yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbgotbWFjaGluZS1zcGVjaWZpYyBmaWxlcyAoc3VjaCBhcyBleGVjdXRhYmxlcyBhbmQgc3Vicm91dGluZSBsaWJyYXJpZXMpLAotd2hpbGUgQGNvZGV7JChwcmVmaXgpfSBpcyB1c2VkIGRpcmVjdGx5IGZvciBvdGhlciBkaXJlY3Rvcmllcy4KLQotUnVubmluZyBAc2FtcHttYWtlIGluc3RhbGx9IHdpdGggYSBkaWZmZXJlbnQgdmFsdWUgb2YgQGNvZGV7ZXhlY19wcmVmaXh9Ci1mcm9tIHRoZSBvbmUgdXNlZCB0byBidWlsZCB0aGUgcHJvZ3JhbSBzaG91bGQgQHZhcntub3R9IHJlY29tcGlsZSB0aGUKLXByb2dyYW0uCi1AZW5kIHRhYmxlCi0KLUV4ZWN1dGFibGUgcHJvZ3JhbXMgYXJlIGluc3RhbGxlZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBkaXJlY3Rvcmllcy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBiaW5kaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgZXhlY3V0YWJsZSBwcm9ncmFtcyB0aGF0IHVzZXJzIGNhbiBydW4uCi1UaGlzIHNob3VsZCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2xvY2FsL2Jpbn0sIGJ1dCB3cml0ZSBpdCBhcwotQGZpbGV7JChleGVjX3ByZWZpeCkvYmlufS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGJpbmRpckBAfS4pCi0KLUBpdGVtIHNiaW5kaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgZXhlY3V0YWJsZSBwcm9ncmFtcyB0aGF0IGNhbiBiZSBydW4gZnJvbQotdGhlIHNoZWxsLCBidXQgYXJlIG9ubHkgZ2VuZXJhbGx5IHVzZWZ1bCB0byBzeXN0ZW0gYWRtaW5pc3RyYXRvcnMuICBUaGlzCi1zaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9zYmlufSwgYnV0IHdyaXRlIGl0IGFzCi1AZmlsZXskKGV4ZWNfcHJlZml4KS9zYmlufS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQHNiaW5kaXJAQH0uKQotCi1AaXRlbSBsaWJleGVjZGlyCi1AY29tbWVudCBUaGlzIHBhcmFncmFwaCBhZGp1c3RlZCB0byBhdm9pZCBvdmVyZnVsbCBoYm94IC0tcm9sYW5kIDVqdWw5NAotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBleGVjdXRhYmxlIHByb2dyYW1zIHRvIGJlIHJ1biBieSBvdGhlcgotcHJvZ3JhbXMgcmF0aGVyIHRoYW4gYnkgdXNlcnMuICBUaGlzIGRpcmVjdG9yeSBzaG91bGQgbm9ybWFsbHkgYmUKLUBmaWxley91c3IvbG9jYWwvbGliZXhlY30sIGJ1dCB3cml0ZSBpdCBhcyBAZmlsZXskKGV4ZWNfcHJlZml4KS9saWJleGVjfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGxpYmV4ZWNkaXJAQH0uKQotQGVuZCB0YWJsZQotCi1EYXRhIGZpbGVzIHVzZWQgYnkgdGhlIHByb2dyYW0gZHVyaW5nIGl0cyBleGVjdXRpb24gYXJlIGRpdmlkZWQgaW50bwotY2F0ZWdvcmllcyBpbiB0d28gd2F5cy4KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVNvbWUgZmlsZXMgYXJlIG5vcm1hbGx5IG1vZGlmaWVkIGJ5IHByb2dyYW1zOyBvdGhlcnMgYXJlIG5ldmVyIG5vcm1hbGx5Ci1tb2RpZmllZCAodGhvdWdoIHVzZXJzIG1heSBlZGl0IHNvbWUgb2YgdGhlc2UpLgotCi1AaXRlbQotU29tZSBmaWxlcyBhcmUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGFuZCBjYW4gYmUgc2hhcmVkIGJ5IGFsbAotbWFjaGluZXMgYXQgYSBzaXRlOyBzb21lIGFyZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGFuZCBjYW4gYmUgc2hhcmVkCi1vbmx5IGJ5IG1hY2hpbmVzIG9mIHRoZSBzYW1lIGtpbmQgYW5kIG9wZXJhdGluZyBzeXN0ZW07IG90aGVycyBtYXkgbmV2ZXIKLWJlIHNoYXJlZCBiZXR3ZWVuIHR3byBtYWNoaW5lcy4KLUBlbmQgaXRlbWl6ZQotCi1UaGlzIG1ha2VzIGZvciBzaXggZGlmZmVyZW50IHBvc3NpYmlsaXRpZXMuICBIb3dldmVyLCB3ZSB3YW50IHRvCi1kaXNjb3VyYWdlIHRoZSB1c2Ugb2YgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcywgYXNpZGUgZnJvbSBvYmplY3QKLWZpbGVzIGFuZCBsaWJyYXJpZXMuICBJdCBpcyBtdWNoIGNsZWFuZXIgdG8gbWFrZSBvdGhlciBkYXRhIGZpbGVzCi1hcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQsIGFuZCBpdCBpcyBnZW5lcmFsbHkgbm90IGhhcmQuCi0KLVRoZXJlZm9yZSwgaGVyZSBhcmUgdGhlIHZhcmlhYmxlcyBNYWtlZmlsZXMgc2hvdWxkIHVzZSB0byBzcGVjaWZ5Ci1kaXJlY3RvcmllczoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBkYXRhZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHJlYWQtb25seSBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgZGF0YQotZmlsZXMuICBUaGlzIHNob3VsZCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2xvY2FsL3NoYXJlfSwgYnV0IHdyaXRlIGl0IGFzCi1AZmlsZXskKHByZWZpeCkvc2hhcmV9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAZGF0YWRpckBAfS4pCi1BcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBzZWUgQGZpbGV7JChpbmZvZGlyKX0KLWFuZCBAZmlsZXskKGluY2x1ZGVkaXIpfSBiZWxvdy4KLQotQGl0ZW0gc3lzY29uZmRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyByZWFkLW9ubHkgZGF0YSBmaWxlcyB0aGF0IHBlcnRhaW4gdG8gYQotc2luZ2xlIG1hY2hpbmUtLXRoYXQgaXMgdG8gc2F5LCBmaWxlcyBmb3IgY29uZmlndXJpbmcgYSBob3N0LiAgTWFpbGVyCi1hbmQgbmV0d29yayBjb25maWd1cmF0aW9uIGZpbGVzLCBAZmlsZXsvZXRjL3Bhc3N3ZH0sIGFuZCBzbyBmb3J0aCBiZWxvbmcKLWhlcmUuICBBbGwgdGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSBvcmRpbmFyeSBBU0NJSSB0ZXh0Ci1maWxlcy4gIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2xvY2FsL2V0Y30sIGJ1dAotd3JpdGUgaXQgYXMgQGZpbGV7JChwcmVmaXgpL2V0Y30uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBzeXNjb25mZGlyQEB9LikKLQotRG8gbm90IGluc3RhbGwgZXhlY3V0YWJsZXMgaGVyZSBpbiB0aGlzIGRpcmVjdG9yeSAodGhleSBwcm9iYWJseSBiZWxvbmcKLWluIEBmaWxleyQobGliZXhlY2Rpcil9IG9yIEBmaWxleyQoc2JpbmRpcil9KS4gIEFsc28gZG8gbm90IGluc3RhbGwKLWZpbGVzIHRoYXQgYXJlIG1vZGlmaWVkIGluIHRoZSBub3JtYWwgY291cnNlIG9mIHRoZWlyIHVzZSAocHJvZ3JhbXMKLXdob3NlIHB1cnBvc2UgaXMgdG8gY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBzeXN0ZW0gZXhjbHVkZWQpLgotVGhvc2UgcHJvYmFibHkgYmVsb25nIGluIEBmaWxleyQobG9jYWxzdGF0ZWRpcil9LgotCi1AaXRlbSBzaGFyZWRzdGF0ZWRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBmaWxlcyB3aGljaAotdGhlIHByb2dyYW1zIG1vZGlmeSB3aGlsZSB0aGV5IHJ1bi4gIFRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlCi1AZmlsZXsvdXNyL2xvY2FsL2NvbX0sIGJ1dCB3cml0ZSBpdCBhcyBAZmlsZXskKHByZWZpeCkvY29tfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQHNoYXJlZHN0YXRlZGlyQEB9LikKLQotQGl0ZW0gbG9jYWxzdGF0ZWRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBkYXRhIGZpbGVzIHdoaWNoIHRoZSBwcm9ncmFtcyBtb2RpZnkgd2hpbGUKLXRoZXkgcnVuLCBhbmQgdGhhdCBwZXJ0YWluIHRvIG9uZSBzcGVjaWZpYyBtYWNoaW5lLiAgVXNlcnMgc2hvdWxkIG5ldmVyCi1uZWVkIHRvIG1vZGlmeSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSB0byBjb25maWd1cmUgdGhlIHBhY2thZ2Uncwotb3BlcmF0aW9uOyBwdXQgc3VjaCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGluIHNlcGFyYXRlIGZpbGVzIHRoYXQgZ28KLWluIEBmaWxleyQoZGF0YWRpcil9IG9yIEBmaWxleyQoc3lzY29uZmRpcil9LiAgQGZpbGV7JChsb2NhbHN0YXRlZGlyKX0KLXNob3VsZCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2xvY2FsL3Zhcn0sIGJ1dCB3cml0ZSBpdCBhcwotQGZpbGV7JChwcmVmaXgpL3Zhcn0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBsb2NhbHN0YXRlZGlyQEB9LikKLQotQGl0ZW0gbGliZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBvYmplY3QgZmlsZXMgYW5kIGxpYnJhcmllcyBvZiBvYmplY3QgY29kZS4gIERvIG5vdAotaW5zdGFsbCBleGVjdXRhYmxlcyBoZXJlLCB0aGV5IHByb2JhYmx5IG91Z2h0IHRvIGdvIGluIEBmaWxleyQobGliZXhlY2Rpcil9Ci1pbnN0ZWFkLiAgVGhlIHZhbHVlIG9mIEBjb2Rle2xpYmRpcn0gc2hvdWxkIG5vcm1hbGx5IGJlCi1AZmlsZXsvdXNyL2xvY2FsL2xpYn0sIGJ1dCB3cml0ZSBpdCBhcyBAZmlsZXskKGV4ZWNfcHJlZml4KS9saWJ9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAbGliZGlyQEB9LikKLQotQGl0ZW0gaW5mb2RpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyB0aGUgSW5mbyBmaWxlcyBmb3IgdGhpcyBwYWNrYWdlLiAgQnkKLWRlZmF1bHQsIGl0IHNob3VsZCBiZSBAZmlsZXsvdXNyL2xvY2FsL2luZm99LCBidXQgaXQgc2hvdWxkIGJlIHdyaXR0ZW4KLWFzIEBmaWxleyQocHJlZml4KS9pbmZvfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGluZm9kaXJAQH0uKQotCi1AaXRlbSBsaXNwZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGFueSBFbWFjcyBMaXNwIGZpbGVzIGluIHRoaXMgcGFja2FnZS4gIEJ5Ci1kZWZhdWx0LCBpdCBzaG91bGQgYmUgQGZpbGV7L3Vzci9sb2NhbC9zaGFyZS9lbWFjcy9zaXRlLWxpc3B9LCBidXQgaXQKLXNob3VsZCBiZSB3cml0dGVuIGFzIEBmaWxleyQocHJlZml4KS9zaGFyZS9lbWFjcy9zaXRlLWxpc3B9LgotCi1JZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSB0aGUgZGVmYXVsdCBhcyBAc2FtcHtAQGxpc3BkaXJAQH0uCi1JbiBvcmRlciB0byBtYWtlIEBzYW1we0BAbGlzcGRpckBAfSB3b3JrLCB5b3UgbmVlZCB0aGUgZm9sbG93aW5nIGxpbmVzCi1pbiB5b3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZToKLQotQGV4YW1wbGUKLWxpc3BkaXI9JyRAe2RhdGFkaXJAfS9lbWFjcy9zaXRlLWxpc3AnCi1BQ19TVUJTVChsaXNwZGlyKQotQGVuZCBleGFtcGxlCi0KLUBpdGVtIGluY2x1ZGVkaXIKLUBjIHJld3JpdHRlbiB0byBhdm9pZCBvdmVyZnVsbCBoYm94IC0tcm9sYW5kCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGhlYWRlciBmaWxlcyB0byBiZSBpbmNsdWRlZCBieSB1c2VyCi1wcm9ncmFtcyB3aXRoIHRoZSBDIEBzYW1weyNpbmNsdWRlfSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlLiAgVGhpcwotc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvaW5jbHVkZX0sIGJ1dCB3cml0ZSBpdCBhcwotQGZpbGV7JChwcmVmaXgpL2luY2x1ZGV9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAaW5jbHVkZWRpckBAfS4pCi0KLU1vc3QgY29tcGlsZXJzIG90aGVyIHRoYW4gR0NDIGRvIG5vdCBsb29rIGZvciBoZWFkZXIgZmlsZXMgaW4gZGlyZWN0b3J5Ci1AZmlsZXsvdXNyL2xvY2FsL2luY2x1ZGV9LiAgU28gaW5zdGFsbGluZyB0aGUgaGVhZGVyIGZpbGVzIHRoaXMgd2F5IGlzCi1vbmx5IHVzZWZ1bCB3aXRoIEdDQy4gIFNvbWV0aW1lcyB0aGlzIGlzIG5vdCBhIHByb2JsZW0gYmVjYXVzZSBzb21lCi1saWJyYXJpZXMgYXJlIG9ubHkgcmVhbGx5IGludGVuZGVkIHRvIHdvcmsgd2l0aCBHQ0MuICBCdXQgc29tZSBsaWJyYXJpZXMKLWFyZSBpbnRlbmRlZCB0byB3b3JrIHdpdGggb3RoZXIgY29tcGlsZXJzLiAgVGhleSBzaG91bGQgaW5zdGFsbCB0aGVpcgotaGVhZGVyIGZpbGVzIGluIHR3byBwbGFjZXMsIG9uZSBzcGVjaWZpZWQgYnkgQGNvZGV7aW5jbHVkZWRpcn0gYW5kIG9uZQotc3BlY2lmaWVkIGJ5IEBjb2Rle29sZGluY2x1ZGVkaXJ9LgotCi1AaXRlbSBvbGRpbmNsdWRlZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIEBzYW1weyNpbmNsdWRlfSBoZWFkZXIgZmlsZXMgZm9yIHVzZSB3aXRoCi1jb21waWxlcnMgb3RoZXIgdGhhbiBHQ0MuICBUaGlzIHNob3VsZCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2luY2x1ZGV9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHlvdSBjYW4gd3JpdGUgaXQgYXMgQHNhbXB7QEBvbGRpbmNsdWRlZGlyQEB9LikKLQotVGhlIE1ha2VmaWxlIGNvbW1hbmRzIHNob3VsZCBjaGVjayB3aGV0aGVyIHRoZSB2YWx1ZSBvZgotQGNvZGV7b2xkaW5jbHVkZWRpcn0gaXMgZW1wdHkuICBJZiBpdCBpcywgdGhleSBzaG91bGQgbm90IHRyeSB0byB1c2UKLWl0OyB0aGV5IHNob3VsZCBjYW5jZWwgdGhlIHNlY29uZCBpbnN0YWxsYXRpb24gb2YgdGhlIGhlYWRlciBmaWxlcy4KLQotQSBwYWNrYWdlIHNob3VsZCBub3QgcmVwbGFjZSBhbiBleGlzdGluZyBoZWFkZXIgaW4gdGhpcyBkaXJlY3RvcnkgdW5sZXNzCi10aGUgaGVhZGVyIGNhbWUgZnJvbSB0aGUgc2FtZSBwYWNrYWdlLiAgVGh1cywgaWYgeW91ciBGb28gcGFja2FnZQotcHJvdmlkZXMgYSBoZWFkZXIgZmlsZSBAZmlsZXtmb28uaH0sIHRoZW4gaXQgc2hvdWxkIGluc3RhbGwgdGhlIGhlYWRlcgotZmlsZSBpbiB0aGUgQGNvZGV7b2xkaW5jbHVkZWRpcn0gZGlyZWN0b3J5IGlmIGVpdGhlciAoMSkgdGhlcmUgaXMgbm8KLUBmaWxle2Zvby5ofSB0aGVyZSBvciAoMikgdGhlIEBmaWxle2Zvby5ofSB0aGF0IGV4aXN0cyBjYW1lIGZyb20gdGhlIEZvbwotcGFja2FnZS4KLQotVG8gdGVsbCB3aGV0aGVyIEBmaWxle2Zvby5ofSBjYW1lIGZyb20gdGhlIEZvbyBwYWNrYWdlLCBwdXQgYSBtYWdpYwotc3RyaW5nIGluIHRoZSBmaWxlLS0tcGFydCBvZiBhIGNvbW1lbnQtLS1hbmQgQGNvZGV7Z3JlcH0gZm9yIHRoYXQgc3RyaW5nLgotQGVuZCB0YWJsZQotCi1Vbml4LXN0eWxlIG1hbiBwYWdlcyBhcmUgaW5zdGFsbGVkIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIG1hbmRpcgotVGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgdGhlIG1hbiBwYWdlcyAoaWYgYW55KSBmb3IgdGhpcwotcGFja2FnZS4gIEl0IHdpbGwgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9tYW59LCBidXQgeW91IHNob3VsZAotd3JpdGUgaXQgYXMgQGZpbGV7JChwcmVmaXgpL21hbn0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBtYW5kaXJAQH0uKQotCi1AaXRlbSBtYW4xZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHNlY3Rpb24gMSBtYW4gcGFnZXMuICBXcml0ZSBpdCBhcwotQGZpbGV7JChtYW5kaXIpL21hbjF9LgotQGl0ZW0gbWFuMmRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBzZWN0aW9uIDIgbWFuIHBhZ2VzLiAgV3JpdGUgaXQgYXMKLUBmaWxleyQobWFuZGlyKS9tYW4yfQotQGl0ZW0gQGRvdHN7fQotCi1Ac3Ryb25ne0Rvbid0IG1ha2UgdGhlIHByaW1hcnkgZG9jdW1lbnRhdGlvbiBmb3IgYW55IEdOVSBzb2Z0d2FyZSBiZSBhCi1tYW4gcGFnZS4gIFdyaXRlIGEgbWFudWFsIGluIFRleGluZm8gaW5zdGVhZC4gIE1hbiBwYWdlcyBhcmUganVzdCBmb3IKLXRoZSBzYWtlIG9mIHBlb3BsZSBydW5uaW5nIEdOVSBzb2Z0d2FyZSBvbiBVbml4LCB3aGljaCBpcyBhIHNlY29uZGFyeQotYXBwbGljYXRpb24gb25seS59Ci0KLUBpdGVtIG1hbmV4dAotVGhlIGZpbGUgbmFtZSBleHRlbnNpb24gZm9yIHRoZSBpbnN0YWxsZWQgbWFuIHBhZ2UuICBUaGlzIHNob3VsZCBjb250YWluCi1hIHBlcmlvZCBmb2xsb3dlZCBieSB0aGUgYXBwcm9wcmlhdGUgZGlnaXQ7IGl0IHNob3VsZCBub3JtYWxseSBiZSBAc2FtcHsuMX0uCi0KLUBpdGVtIG1hbjFleHQKLVRoZSBmaWxlIG5hbWUgZXh0ZW5zaW9uIGZvciBpbnN0YWxsZWQgc2VjdGlvbiAxIG1hbiBwYWdlcy4KLUBpdGVtIG1hbjJleHQKLVRoZSBmaWxlIG5hbWUgZXh0ZW5zaW9uIGZvciBpbnN0YWxsZWQgc2VjdGlvbiAyIG1hbiBwYWdlcy4KLUBpdGVtIEBkb3Rze30KLVVzZSB0aGVzZSBuYW1lcyBpbnN0ZWFkIG9mIEBzYW1we21hbmV4dH0gaWYgdGhlIHBhY2thZ2UgbmVlZHMgdG8gaW5zdGFsbCBtYW4KLXBhZ2VzIGluIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBvZiB0aGUgbWFudWFsLgotQGVuZCB0YWJsZQotCi1BbmQgZmluYWxseSwgeW91IHNob3VsZCBzZXQgdGhlIGZvbGxvd2luZyB2YXJpYWJsZToKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBzcmNkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIHRoZSBzb3VyY2VzIGJlaW5nIGNvbXBpbGVkLiAgVGhlIHZhbHVlIG9mIHRoaXMKLXZhcmlhYmxlIGlzIG5vcm1hbGx5IGluc2VydGVkIGJ5IHRoZSBAY29kZXtjb25maWd1cmV9IHNoZWxsIHNjcmlwdC4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dGNvbmYsIHVzZSBAc2FtcHtzcmNkaXIgPSBAQHNyY2RpckBAfS4pCi1AZW5kIHRhYmxlCi0KLUZvciBleGFtcGxlOgotCi1Ac21hbGxleGFtcGxlCi1AYyBJIGhhdmUgY2hhbmdlZCBzb21lIG9mIHRoZSBjb21tZW50cyBoZXJlIHNsaWdodGx5IHRvIGZpeCBhbiBvdmVyZnVsbAotQGMgaGJveCwgc28gdGhlIG1ha2UgbWFudWFsIGNhbiBmb3JtYXQgY29ycmVjdGx5LiAtLXJvbGFuZAotIyBDb21tb24gcHJlZml4IGZvciBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi0jIE5PVEU6IFRoaXMgZGlyZWN0b3J5IG11c3QgZXhpc3Qgd2hlbiB5b3Ugc3RhcnQgdGhlIGluc3RhbGwuCi1wcmVmaXggPSAvdXNyL2xvY2FsCi1leGVjX3ByZWZpeCA9ICQocHJlZml4KQotIyBXaGVyZSB0byBwdXQgdGhlIGV4ZWN1dGFibGUgZm9yIHRoZSBjb21tYW5kIGBnY2MnLgotYmluZGlyID0gJChleGVjX3ByZWZpeCkvYmluCi0jIFdoZXJlIHRvIHB1dCB0aGUgZGlyZWN0b3JpZXMgdXNlZCBieSB0aGUgY29tcGlsZXIuCi1saWJleGVjZGlyID0gJChleGVjX3ByZWZpeCkvbGliZXhlYwotIyBXaGVyZSB0byBwdXQgdGhlIEluZm8gZmlsZXMuCi1pbmZvZGlyID0gJChwcmVmaXgpL2luZm8KLUBlbmQgc21hbGxleGFtcGxlCi0KLUlmIHlvdXIgcHJvZ3JhbSBpbnN0YWxscyBhIGxhcmdlIG51bWJlciBvZiBmaWxlcyBpbnRvIG9uZSBvZiB0aGUKLXN0YW5kYXJkIHVzZXItc3BlY2lmaWVkIGRpcmVjdG9yaWVzLCBpdCBtaWdodCBiZSB1c2VmdWwgdG8gZ3JvdXAgdGhlbQotaW50byBhIHN1YmRpcmVjdG9yeSBwYXJ0aWN1bGFyIHRvIHRoYXQgcHJvZ3JhbS4gIElmIHlvdSBkbyB0aGlzLCB5b3UKLXNob3VsZCB3cml0ZSB0aGUgQGNvZGV7aW5zdGFsbH0gcnVsZSB0byBjcmVhdGUgdGhlc2Ugc3ViZGlyZWN0b3JpZXMuCi0KLURvIG5vdCBleHBlY3QgdGhlIHVzZXIgdG8gaW5jbHVkZSB0aGUgc3ViZGlyZWN0b3J5IG5hbWUgaW4gdGhlIHZhbHVlIG9mCi1hbnkgb2YgdGhlIHZhcmlhYmxlcyBsaXN0ZWQgYWJvdmUuICBUaGUgaWRlYSBvZiBoYXZpbmcgYSB1bmlmb3JtIHNldCBvZgotdmFyaWFibGUgbmFtZXMgZm9yIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyBpcyB0byBlbmFibGUgdGhlIHVzZXIgdG8KLXNwZWNpZnkgdGhlIGV4YWN0IHNhbWUgdmFsdWVzIGZvciBzZXZlcmFsIGRpZmZlcmVudCBHTlUgcGFja2FnZXMuICBJbgotb3JkZXIgZm9yIHRoaXMgdG8gYmUgdXNlZnVsLCBhbGwgdGhlIHBhY2thZ2VzIG11c3QgYmUgZGVzaWduZWQgc28gdGhhdAotdGhleSB3aWxsIHdvcmsgc2Vuc2libHkgd2hlbiB0aGUgdXNlciBkb2VzIHNvLgotCi1Abm9kZSBTdGFuZGFyZCBUYXJnZXRzCi1Ac2VjdGlvbiBTdGFuZGFyZCBUYXJnZXRzIGZvciBVc2VycwotCi1BbGwgR05VIHByb2dyYW1zIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgdGFyZ2V0cyBpbiB0aGVpciBNYWtlZmlsZXM6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYWxsCi1Db21waWxlIHRoZSBlbnRpcmUgcHJvZ3JhbS4gIFRoaXMgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IHRhcmdldC4gIFRoaXMKLXRhcmdldCBuZWVkIG5vdCByZWJ1aWxkIGFueSBkb2N1bWVudGF0aW9uIGZpbGVzOyBJbmZvIGZpbGVzIHNob3VsZAotbm9ybWFsbHkgYmUgaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiwgYW5kIERWSSBmaWxlcyBzaG91bGQgYmUgbWFkZQotb25seSB3aGVuIGV4cGxpY2l0bHkgYXNrZWQgZm9yLgotCi1CeSBkZWZhdWx0LCB0aGUgTWFrZSBydWxlcyBzaG91bGQgY29tcGlsZSBhbmQgbGluayB3aXRoIEBzYW1wey1nfSwgc28KLXRoYXQgZXhlY3V0YWJsZSBwcm9ncmFtcyBoYXZlIGRlYnVnZ2luZyBzeW1ib2xzLiAgVXNlcnMgd2hvIGRvbid0IG1pbmQKLWJlaW5nIGhlbHBsZXNzIGNhbiBzdHJpcCB0aGUgZXhlY3V0YWJsZXMgbGF0ZXIgaWYgdGhleSB3aXNoLgotCi1AaXRlbSBpbnN0YWxsCi1Db21waWxlIHRoZSBwcm9ncmFtIGFuZCBjb3B5IHRoZSBleGVjdXRhYmxlcywgbGlicmFyaWVzLCBhbmQgc28gb24gdG8KLXRoZSBmaWxlIG5hbWVzIHdoZXJlIHRoZXkgc2hvdWxkIHJlc2lkZSBmb3IgYWN0dWFsIHVzZS4gIElmIHRoZXJlIGlzIGEKLXNpbXBsZSB0ZXN0IHRvIHZlcmlmeSB0aGF0IGEgcHJvZ3JhbSBpcyBwcm9wZXJseSBpbnN0YWxsZWQsIHRoaXMgdGFyZ2V0Ci1zaG91bGQgcnVuIHRoYXQgdGVzdC4KLQotRG8gbm90IHN0cmlwIGV4ZWN1dGFibGVzIHdoZW4gaW5zdGFsbGluZyB0aGVtLiAgRGV2aWwtbWF5LWNhcmUgdXNlcnMgY2FuCi11c2UgdGhlIEBjb2Rle2luc3RhbGwtc3RyaXB9IHRhcmdldCB0byBkbyB0aGF0LgotCi1JZiBwb3NzaWJsZSwgd3JpdGUgdGhlIEBjb2Rle2luc3RhbGx9IHRhcmdldCBydWxlIHNvIHRoYXQgaXQgZG9lcyBub3QKLW1vZGlmeSBhbnl0aGluZyBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBwcm9ncmFtIHdhcyBidWlsdCwgcHJvdmlkZWQKLUBzYW1we21ha2UgYWxsfSBoYXMganVzdCBiZWVuIGRvbmUuICBUaGlzIGlzIGNvbnZlbmllbnQgZm9yIGJ1aWxkaW5nIHRoZQotcHJvZ3JhbSB1bmRlciBvbmUgdXNlciBuYW1lIGFuZCBpbnN0YWxsaW5nIGl0IHVuZGVyIGFub3RoZXIuCi0KLVRoZSBjb21tYW5kcyBzaG91bGQgY3JlYXRlIGFsbCB0aGUgZGlyZWN0b3JpZXMgaW4gd2hpY2ggZmlsZXMgYXJlIHRvIGJlCi1pbnN0YWxsZWQsIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBleGlzdC4gIFRoaXMgaW5jbHVkZXMgdGhlIGRpcmVjdG9yaWVzCi1zcGVjaWZpZWQgYXMgdGhlIHZhbHVlcyBvZiB0aGUgdmFyaWFibGVzIEBjb2Rle3ByZWZpeH0gYW5kCi1AY29kZXtleGVjX3ByZWZpeH0sIGFzIHdlbGwgYXMgYWxsIHN1YmRpcmVjdG9yaWVzIHRoYXQgYXJlIG5lZWRlZC4KLU9uZSB3YXkgdG8gZG8gdGhpcyBpcyBieSBtZWFucyBvZiBhbiBAY29kZXtpbnN0YWxsZGlyc30gdGFyZ2V0Ci1hcyBkZXNjcmliZWQgYmVsb3cuCi0KLVVzZSBAc2FtcHstfSBiZWZvcmUgYW55IGNvbW1hbmQgZm9yIGluc3RhbGxpbmcgYSBtYW4gcGFnZSwgc28gdGhhdAotQGNvZGV7bWFrZX0gd2lsbCBpZ25vcmUgYW55IGVycm9ycy4gIFRoaXMgaXMgaW4gY2FzZSB0aGVyZSBhcmUgc3lzdGVtcwotdGhhdCBkb24ndCBoYXZlIHRoZSBVbml4IG1hbiBwYWdlIGRvY3VtZW50YXRpb24gc3lzdGVtIGluc3RhbGxlZC4KLQotVGhlIHdheSB0byBpbnN0YWxsIEluZm8gZmlsZXMgaXMgdG8gY29weSB0aGVtIGludG8gQGZpbGV7JChpbmZvZGlyKX0KLXdpdGggQGNvZGV7JChJTlNUQUxMX0RBVEEpfSAoQHB4cmVme0NvbW1hbmQgVmFyaWFibGVzfSksIGFuZCB0aGVuIHJ1bgotdGhlIEBjb2Rle2luc3RhbGwtaW5mb30gcHJvZ3JhbSBpZiBpdCBpcyBwcmVzZW50LiAgQGNvZGV7aW5zdGFsbC1pbmZvfQotaXMgYSBwcm9ncmFtIHRoYXQgZWRpdHMgdGhlIEluZm8gQGZpbGV7ZGlyfSBmaWxlIHRvIGFkZCBvciB1cGRhdGUgdGhlCi1tZW51IGVudHJ5IGZvciB0aGUgZ2l2ZW4gSW5mbyBmaWxlOyBpdCBpcyBwYXJ0IG9mIHRoZSBUZXhpbmZvIHBhY2thZ2UuCi1IZXJlIGlzIGEgc2FtcGxlIHJ1bGUgdG8gaW5zdGFsbCBhbiBJbmZvIGZpbGU6Ci0KLUBjb21tZW50IFRoaXMgZXhhbXBsZSBoYXMgYmVlbiBjYXJlZnVsbHkgZm9ybWF0dGVkIGZvciB0aGUgTWFrZSBtYW51YWwuCi1AY29tbWVudCBQbGVhc2UgZG8gbm90IHJlZm9ybWF0IGl0IHdpdGhvdXQgdGFsa2luZyB0byByb2xhbmRAZ251LmFpLm1pdC5lZHUuCi1Ac21hbGxleGFtcGxlCi0kKERFU1RESVIpJChpbmZvZGlyKS9mb28uaW5mbzogZm9vLmluZm8KLSAgICAgICAgJChQT1NUX0lOU1RBTEwpCi0jIFRoZXJlIG1heSBiZSBhIG5ld2VyIGluZm8gZmlsZSBpbiAuIHRoYW4gaW4gc3JjZGlyLgotICAgICAgICAtaWYgdGVzdCAtZiBmb28uaW5mbzsgdGhlbiBkPS47IFwKLSAgICAgICAgIGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0gICAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvZm9vLmluZm8gJChERVNURElSKSRAQDsgXAotIyBSdW4gaW5zdGFsbC1pbmZvIG9ubHkgaWYgaXQgZXhpc3RzLgotIyBVc2UgYGlmJyBpbnN0ZWFkIG9mIGp1c3QgcHJlcGVuZGluZyBgLScgdG8gdGhlCi0jIGxpbmUgc28gd2Ugbm90aWNlIHJlYWwgZXJyb3JzIGZyb20gaW5zdGFsbC1pbmZvLgotIyBXZSB1c2UgYCQoU0hFTEwpIC1jJyBiZWNhdXNlIHNvbWUgc2hlbGxzIGRvIG5vdAotIyBmYWlsIGdyYWNlZnVsbHkgd2hlbiB0aGVyZSBpcyBhbiB1bmtub3duIGNvbW1hbmQuCi0gICAgICAgIGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uJyBcCi0gICAgICAgICAgID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0gICAgICAgICAgaW5zdGFsbC1pbmZvIC0tZGlyLWZpbGU9JChERVNURElSKSQoaW5mb2RpcikvZGlyIFwKLSAgICAgICAgICAgICAgICAgICAgICAgJChERVNURElSKSQoaW5mb2RpcikvZm9vLmluZm87IFwKLSAgICAgICAgZWxzZSB0cnVlOyBmaQotQGVuZCBzbWFsbGV4YW1wbGUKLQotV2hlbiB3cml0aW5nIHRoZSBAY29kZXtpbnN0YWxsfSB0YXJnZXQsIHlvdSBtdXN0IGNsYXNzaWZ5IGFsbCB0aGUKLWNvbW1hbmRzIGludG8gdGhyZWUgY2F0ZWdvcmllczogbm9ybWFsIG9uZXMsIEBkZm57cHJlLWluc3RhbGxhdGlvbn0KLWNvbW1hbmRzIGFuZCBAZGZue3Bvc3QtaW5zdGFsbGF0aW9ufSBjb21tYW5kcy4gIEB4cmVme0luc3RhbGwgQ29tbWFuZAotQ2F0ZWdvcmllc30uCi0KLUBpdGVtIHVuaW5zdGFsbAotRGVsZXRlIGFsbCB0aGUgaW5zdGFsbGVkIGZpbGVzLS0tdGhlIGNvcGllcyB0aGF0IHRoZSBAc2FtcHtpbnN0YWxsfQotdGFyZ2V0IGNyZWF0ZXMuCi0KLVRoaXMgcnVsZSBzaG91bGQgbm90IG1vZGlmeSB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgY29tcGlsYXRpb24gaXMgZG9uZSwKLW9ubHkgdGhlIGRpcmVjdG9yaWVzIHdoZXJlIGZpbGVzIGFyZSBpbnN0YWxsZWQuCi0KLVRoZSB1bmluc3RhbGxhdGlvbiBjb21tYW5kcyBhcmUgZGl2aWRlZCBpbnRvIHRocmVlIGNhdGVnb3JpZXMsIGp1c3QgbGlrZQotdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kcy4gIEB4cmVme0luc3RhbGwgQ29tbWFuZCBDYXRlZ29yaWVzfS4KLQotQGl0ZW0gaW5zdGFsbC1zdHJpcAotTGlrZSBAY29kZXtpbnN0YWxsfSwgYnV0IHN0cmlwIHRoZSBleGVjdXRhYmxlIGZpbGVzIHdoaWxlIGluc3RhbGxpbmcKLXRoZW0uICBJbiBtYW55IGNhc2VzLCB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIHRhcmdldCBjYW4gYmUgdmVyeSBzaW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLWluc3RhbGwtc3RyaXA6Ci0gICAgICAgICQoTUFLRSkgSU5TVEFMTF9QUk9HUkFNPSckKElOU1RBTExfUFJPR1JBTSkgLXMnIFwKLSAgICAgICAgICAgICAgICBpbnN0YWxsCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Ob3JtYWxseSB3ZSBkbyBub3QgcmVjb21tZW5kIHN0cmlwcGluZyBhbiBleGVjdXRhYmxlIHVubGVzcyB5b3UgYXJlIHN1cmUKLXRoZSBwcm9ncmFtIGhhcyBubyBidWdzLiAgSG93ZXZlciwgaXQgY2FuIGJlIHJlYXNvbmFibGUgdG8gaW5zdGFsbCBhCi1zdHJpcHBlZCBleGVjdXRhYmxlIGZvciBhY3R1YWwgZXhlY3V0aW9uIHdoaWxlIHNhdmluZyB0aGUgdW5zdHJpcHBlZAotZXhlY3V0YWJsZSBlbHNld2hlcmUgaW4gY2FzZSB0aGVyZSBpcyBhIGJ1Zy4KLQotQGNvbW1lbnQgVGhlIGdyYXR1aXRvdXMgYmxhbmsgbGluZSBoZXJlIGlzIHRvIG1ha2UgdGhlIHRhYmxlIGxvb2sgYmV0dGVyCi1AY29tbWVudCBpbiB0aGUgcHJpbnRlZCBNYWtlIG1hbnVhbC4gIFBsZWFzZSBsZWF2ZSBpdCBpbi4KLUBpdGVtIGNsZWFuCi0KLURlbGV0ZSBhbGwgZmlsZXMgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkgdGhhdCBhcmUgbm9ybWFsbHkgY3JlYXRlZCBieQotYnVpbGRpbmcgdGhlIHByb2dyYW0uICBEb24ndCBkZWxldGUgdGhlIGZpbGVzIHRoYXQgcmVjb3JkIHRoZQotY29uZmlndXJhdGlvbi4gIEFsc28gcHJlc2VydmUgZmlsZXMgdGhhdCBjb3VsZCBiZSBtYWRlIGJ5IGJ1aWxkaW5nLCBidXQKLW5vcm1hbGx5IGFyZW4ndCBiZWNhdXNlIHRoZSBkaXN0cmlidXRpb24gY29tZXMgd2l0aCB0aGVtLgotCi1EZWxldGUgQGZpbGV7LmR2aX0gZmlsZXMgaGVyZSBpZiB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGUgZGlzdHJpYnV0aW9uLgotCi1AaXRlbSBkaXN0Y2xlYW4KLURlbGV0ZSBhbGwgZmlsZXMgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkgdGhhdCBhcmUgY3JlYXRlZCBieQotY29uZmlndXJpbmcgb3IgYnVpbGRpbmcgdGhlIHByb2dyYW0uICBJZiB5b3UgaGF2ZSB1bnBhY2tlZCB0aGUgc291cmNlCi1hbmQgYnVpbHQgdGhlIHByb2dyYW0gd2l0aG91dCBjcmVhdGluZyBhbnkgb3RoZXIgZmlsZXMsIEBzYW1we21ha2UKLWRpc3RjbGVhbn0gc2hvdWxkIGxlYXZlIG9ubHkgdGhlIGZpbGVzIHRoYXQgd2VyZSBpbiB0aGUgZGlzdHJpYnV0aW9uLgotCi1AaXRlbSBtb3N0bHljbGVhbgotTGlrZSBAc2FtcHtjbGVhbn0sIGJ1dCBtYXkgcmVmcmFpbiBmcm9tIGRlbGV0aW5nIGEgZmV3IGZpbGVzIHRoYXQgcGVvcGxlCi1ub3JtYWxseSBkb24ndCB3YW50IHRvIHJlY29tcGlsZS4gIEZvciBleGFtcGxlLCB0aGUgQHNhbXB7bW9zdGx5Y2xlYW59Ci10YXJnZXQgZm9yIEdDQyBkb2VzIG5vdCBkZWxldGUgQGZpbGV7bGliZ2NjLmF9LCBiZWNhdXNlIHJlY29tcGlsaW5nIGl0Ci1pcyByYXJlbHkgbmVjZXNzYXJ5IGFuZCB0YWtlcyBhIGxvdCBvZiB0aW1lLgotCi1AaXRlbSBtYWludGFpbmVyLWNsZWFuCi1EZWxldGUgYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkgdGhhdCBjYW4gYmUKLXJlY29uc3RydWN0ZWQgd2l0aCB0aGlzIE1ha2VmaWxlLiAgVGhpcyB0eXBpY2FsbHkgaW5jbHVkZXMgZXZlcnl0aGluZwotZGVsZXRlZCBieSBAY29kZXtkaXN0Y2xlYW59LCBwbHVzIG1vcmU6IEMgc291cmNlIGZpbGVzIHByb2R1Y2VkIGJ5Ci1CaXNvbiwgdGFncyB0YWJsZXMsIEluZm8gZmlsZXMsIGFuZCBzbyBvbi4KLQotVGhlIHJlYXNvbiB3ZSBzYXkgYGBhbG1vc3QgZXZlcnl0aGluZycnIGlzIHRoYXQgcnVubmluZyB0aGUgY29tbWFuZAotQHNhbXB7bWFrZSBtYWludGFpbmVyLWNsZWFufSBzaG91bGQgbm90IGRlbGV0ZSBAZmlsZXtjb25maWd1cmV9IGV2ZW4gaWYKLUBmaWxle2NvbmZpZ3VyZX0gY2FuIGJlIHJlbWFkZSB1c2luZyBhIHJ1bGUgaW4gdGhlIE1ha2VmaWxlLiAgTW9yZSBnZW5lcmFsbHksCi1Ac2FtcHttYWtlIG1haW50YWluZXItY2xlYW59IHNob3VsZCBub3QgZGVsZXRlIGFueXRoaW5nIHRoYXQgbmVlZHMgdG8KLWV4aXN0IGluIG9yZGVyIHRvIHJ1biBAZmlsZXtjb25maWd1cmV9IGFuZCB0aGVuIGJlZ2luIHRvIGJ1aWxkIHRoZQotcHJvZ3JhbS4gIFRoaXMgaXMgdGhlIG9ubHkgZXhjZXB0aW9uOyBAY29kZXttYWludGFpbmVyLWNsZWFufSBzaG91bGQKLWRlbGV0ZSBldmVyeXRoaW5nIGVsc2UgdGhhdCBjYW4gYmUgcmVidWlsdC4KLQotVGhlIEBzYW1we21haW50YWluZXItY2xlYW59IHRhcmdldCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGEgbWFpbnRhaW5lciBvZgotdGhlIHBhY2thZ2UsIG5vdCBieSBvcmRpbmFyeSB1c2Vycy4gIFlvdSBtYXkgbmVlZCBzcGVjaWFsIHRvb2xzIHRvCi1yZWNvbnN0cnVjdCBzb21lIG9mIHRoZSBmaWxlcyB0aGF0IEBzYW1we21ha2UgbWFpbnRhaW5lci1jbGVhbn0gZGVsZXRlcy4KLVNpbmNlIHRoZXNlIGZpbGVzIGFyZSBub3JtYWxseSBpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uLCB3ZSBkb24ndAotdGFrZSBjYXJlIHRvIG1ha2UgdGhlbSBlYXN5IHRvIHJlY29uc3RydWN0LiAgSWYgeW91IGZpbmQgeW91IG5lZWQgdG8KLXVucGFjayB0aGUgZnVsbCBkaXN0cmlidXRpb24gYWdhaW4sIGRvbid0IGJsYW1lIHVzLgotCi1UbyBoZWxwIG1ha2UgdXNlcnMgYXdhcmUgb2YgdGhpcywgdGhlIGNvbW1hbmRzIGZvciB0aGUgc3BlY2lhbAotQGNvZGV7bWFpbnRhaW5lci1jbGVhbn0gdGFyZ2V0IHNob3VsZCBzdGFydCB3aXRoIHRoZXNlIHR3bzoKLQotQHNtYWxsZXhhbXBsZQotQEBlY2hvICdUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsgaXQnCi1AQGVjaG8gJ2RlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgbmVlZCBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuJwotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0gVEFHUwotVXBkYXRlIGEgdGFncyB0YWJsZSBmb3IgdGhpcyBwcm9ncmFtLgotQGMgQURSOiBob3c/Ci0KLUBpdGVtIGluZm8KLUdlbmVyYXRlIGFueSBJbmZvIGZpbGVzIG5lZWRlZC4gIFRoZSBiZXN0IHdheSB0byB3cml0ZSB0aGUgcnVsZXMgaXMgYXMKLWZvbGxvd3M6Ci0KLUBzbWFsbGV4YW1wbGUKLWluZm86IGZvby5pbmZvCi0KLWZvby5pbmZvOiBmb28udGV4aSBjaGFwMS50ZXhpIGNoYXAyLnRleGkKLSAgICAgICAgJChNQUtFSU5GTykgJChzcmNkaXIpL2Zvby50ZXhpCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLVlvdSBtdXN0IGRlZmluZSB0aGUgdmFyaWFibGUgQGNvZGV7TUFLRUlORk99IGluIHRoZSBNYWtlZmlsZS4gIEl0IHNob3VsZAotcnVuIHRoZSBAY29kZXttYWtlaW5mb30gcHJvZ3JhbSwgd2hpY2ggaXMgcGFydCBvZiB0aGUgVGV4aW5mbwotZGlzdHJpYnV0aW9uLgotCi1Ob3JtYWxseSBhIEdOVSBkaXN0cmlidXRpb24gY29tZXMgd2l0aCBJbmZvIGZpbGVzLCBhbmQgdGhhdCBtZWFucyB0aGUKLUluZm8gZmlsZXMgYXJlIHByZXNlbnQgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBUaGVyZWZvcmUsIHRoZSBNYWtlCi1ydWxlIGZvciBhbiBpbmZvIGZpbGUgc2hvdWxkIHVwZGF0ZSBpdCBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIFdoZW4KLXVzZXJzIGJ1aWxkIHRoZSBwYWNrYWdlLCBvcmRpbmFyaWx5IE1ha2Ugd2lsbCBub3QgdXBkYXRlIHRoZSBJbmZvIGZpbGVzCi1iZWNhdXNlIHRoZXkgd2lsbCBhbHJlYWR5IGJlIHVwIHRvIGRhdGUuCi0KLUBpdGVtIGR2aQotR2VuZXJhdGUgRFZJIGZpbGVzIGZvciBhbGwgVGV4aW5mbyBkb2N1bWVudGF0aW9uLgotRm9yIGV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLWR2aTogZm9vLmR2aQotCi1mb28uZHZpOiBmb28udGV4aSBjaGFwMS50ZXhpIGNoYXAyLnRleGkKLSAgICAgICAgJChURVhJMkRWSSkgJChzcmNkaXIpL2Zvby50ZXhpCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLVlvdSBtdXN0IGRlZmluZSB0aGUgdmFyaWFibGUgQGNvZGV7VEVYSTJEVkl9IGluIHRoZSBNYWtlZmlsZS4gIEl0IHNob3VsZAotcnVuIHRoZSBwcm9ncmFtIEBjb2Rle3RleGkyZHZpfSwgd2hpY2ggaXMgcGFydCBvZiB0aGUgVGV4aW5mbwotZGlzdHJpYnV0aW9uLkBmb290bm90ZXtAY29kZXt0ZXhpMmR2aX0gdXNlcyBAVGVYe30gdG8gZG8gdGhlIHJlYWwgd29yawotb2YgZm9ybWF0dGluZy4gQFRlWHt9IGlzIG5vdCBkaXN0cmlidXRlZCB3aXRoIFRleGluZm8ufSAgQWx0ZXJuYXRpdmVseSwKLXdyaXRlIGp1c3QgdGhlIGRlcGVuZGVuY2llcywgYW5kIGFsbG93IEdOVSBAY29kZXttYWtlfSB0byBwcm92aWRlIHRoZSBjb21tYW5kLgotCi1AaXRlbSBkaXN0Ci1DcmVhdGUgYSBkaXN0cmlidXRpb24gdGFyIGZpbGUgZm9yIHRoaXMgcHJvZ3JhbS4gIFRoZSB0YXIgZmlsZSBzaG91bGQgYmUKLXNldCB1cCBzbyB0aGF0IHRoZSBmaWxlIG5hbWVzIGluIHRoZSB0YXIgZmlsZSBzdGFydCB3aXRoIGEgc3ViZGlyZWN0b3J5Ci1uYW1lIHdoaWNoIGlzIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGl0IGlzIGEgZGlzdHJpYnV0aW9uIGZvci4gIFRoaXMKLW5hbWUgY2FuIGluY2x1ZGUgdGhlIHZlcnNpb24gbnVtYmVyLgotCi1Gb3IgZXhhbXBsZSwgdGhlIGRpc3RyaWJ1dGlvbiB0YXIgZmlsZSBvZiBHQ0MgdmVyc2lvbiAxLjQwIHVucGFja3MgaW50bwotYSBzdWJkaXJlY3RvcnkgbmFtZWQgQGZpbGV7Z2NjLTEuNDB9LgotCi1UaGUgZWFzaWVzdCB3YXkgdG8gZG8gdGhpcyBpcyB0byBjcmVhdGUgYSBzdWJkaXJlY3RvcnkgYXBwcm9wcmlhdGVseQotbmFtZWQsIHVzZSBAY29kZXtsbn0gb3IgQGNvZGV7Y3B9IHRvIGluc3RhbGwgdGhlIHByb3BlciBmaWxlcyBpbiBpdCwgYW5kCi10aGVuIEBjb2Rle3Rhcn0gdGhhdCBzdWJkaXJlY3RvcnkuCi0KLUNvbXByZXNzIHRoZSB0YXIgZmlsZSBmaWxlIHdpdGggQGNvZGV7Z3ppcH0uICBGb3IgZXhhbXBsZSwgdGhlIGFjdHVhbAotZGlzdHJpYnV0aW9uIGZpbGUgZm9yIEdDQyB2ZXJzaW9uIDEuNDAgaXMgY2FsbGVkIEBmaWxle2djYy0xLjQwLnRhci5nen0uCi0KLVRoZSBAY29kZXtkaXN0fSB0YXJnZXQgc2hvdWxkIGV4cGxpY2l0bHkgZGVwZW5kIG9uIGFsbCBub24tc291cmNlIGZpbGVzCi10aGF0IGFyZSBpbiB0aGUgZGlzdHJpYnV0aW9uLCB0byBtYWtlIHN1cmUgdGhleSBhcmUgdXAgdG8gZGF0ZSBpbiB0aGUKLWRpc3RyaWJ1dGlvbi4KLUBpZnNldCBDT0RFU1RECi1AeHJlZntSZWxlYXNlcywgLCBNYWtpbmcgUmVsZWFzZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgQ09ERVNURAotQHhyZWZ7UmVsZWFzZXMsICwgTWFraW5nIFJlbGVhc2VzLCBzdGFuZGFyZHMsIEdOVSBDb2RpbmcgU3RhbmRhcmRzfS4KLUBlbmQgaWZjbGVhcgotCi1AaXRlbSBjaGVjawotUGVyZm9ybSBzZWxmLXRlc3RzIChpZiBhbnkpLiAgVGhlIHVzZXIgbXVzdCBidWlsZCB0aGUgcHJvZ3JhbSBiZWZvcmUKLXJ1bm5pbmcgdGhlIHRlc3RzLCBidXQgbmVlZCBub3QgaW5zdGFsbCB0aGUgcHJvZ3JhbTsgeW91IHNob3VsZCB3cml0ZQotdGhlIHNlbGYtdGVzdHMgc28gdGhhdCB0aGV5IHdvcmsgd2hlbiB0aGUgcHJvZ3JhbSBpcyBidWlsdCBidXQgbm90Ci1pbnN0YWxsZWQuCi1AZW5kIHRhYmxlCi0KLVRoZSBmb2xsb3dpbmcgdGFyZ2V0cyBhcmUgc3VnZ2VzdGVkIGFzIGNvbnZlbnRpb25hbCBuYW1lcywgZm9yIHByb2dyYW1zCi1pbiB3aGljaCB0aGV5IGFyZSB1c2VmdWwuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gaW5zdGFsbGNoZWNrCi1QZXJmb3JtIGluc3RhbGxhdGlvbiB0ZXN0cyAoaWYgYW55KS4gIFRoZSB1c2VyIG11c3QgYnVpbGQgYW5kIGluc3RhbGwKLXRoZSBwcm9ncmFtIGJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0cy4gIFlvdSBzaG91bGQgbm90IGFzc3VtZSB0aGF0Ci1AZmlsZXskKGJpbmRpcil9IGlzIGluIHRoZSBzZWFyY2ggcGF0aC4KLQotQGl0ZW0gaW5zdGFsbGRpcnMKLUl0J3MgdXNlZnVsIHRvIGFkZCBhIHRhcmdldCBuYW1lZCBAc2FtcHtpbnN0YWxsZGlyc30gdG8gY3JlYXRlIHRoZQotZGlyZWN0b3JpZXMgd2hlcmUgZmlsZXMgYXJlIGluc3RhbGxlZCwgYW5kIHRoZWlyIHBhcmVudCBkaXJlY3Rvcmllcy4KLVRoZXJlIGlzIGEgc2NyaXB0IGNhbGxlZCBAZmlsZXtta2luc3RhbGxkaXJzfSB3aGljaCBpcyBjb252ZW5pZW50IGZvcgotdGhpczsgeW91IGNhbiBmaW5kIGl0IGluIHRoZSBUZXhpbmZvIHBhY2thZ2UuCi1AYyBJdCdzIGluIC9nZC9nbnUvbGliL21raW5zdGFsbGRpcnMuCi1Zb3UgY2FuIHVzZSBhIHJ1bGUgbGlrZSB0aGlzOgotCi1AY29tbWVudCBUaGlzIGhhcyBiZWVuIGNhcmVmdWxseSBmb3JtYXR0ZWQgdG8gbG9vayBkZWNlbnQgaW4gdGhlIE1ha2UgbWFudWFsLgotQGNvbW1lbnQgUGxlYXNlIGJlIHN1cmUgbm90IHRvIG1ha2UgaXQgZXh0ZW5kIGFueSBmdXJ0aGVyIHRvIHRoZSByaWdodC4tLXJvbGFuZAotQHNtYWxsZXhhbXBsZQotIyBNYWtlIHN1cmUgYWxsIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyAoZS5nLiAkKGJpbmRpcikpCi0jIGFjdHVhbGx5IGV4aXN0IGJ5IG1ha2luZyB0aGVtIGlmIG5lY2Vzc2FyeS4KLWluc3RhbGxkaXJzOiBta2luc3RhbGxkaXJzCi0gICAgICAgICQoc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoYmluZGlyKSAkKGRhdGFkaXIpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChsaWJkaXIpICQoaW5mb2RpcikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG1hbmRpcikKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoaXMgcnVsZSBzaG91bGQgbm90IG1vZGlmeSB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgY29tcGlsYXRpb24gaXMgZG9uZS4KLUl0IHNob3VsZCBkbyBub3RoaW5nIGJ1dCBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgotQGVuZCB0YWJsZQotCi1Abm9kZSBJbnN0YWxsIENvbW1hbmQgQ2F0ZWdvcmllcwotQHNlY3Rpb24gSW5zdGFsbCBDb21tYW5kIENhdGVnb3JpZXMKLQotQGNpbmRleCBwcmUtaW5zdGFsbGF0aW9uIGNvbW1hbmRzCi1AY2luZGV4IHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzCi1XaGVuIHdyaXRpbmcgdGhlIEBjb2Rle2luc3RhbGx9IHRhcmdldCwgeW91IG11c3QgY2xhc3NpZnkgYWxsIHRoZQotY29tbWFuZHMgaW50byB0aHJlZSBjYXRlZ29yaWVzOiBub3JtYWwgb25lcywgQGRmbntwcmUtaW5zdGFsbGF0aW9ufQotY29tbWFuZHMgYW5kIEBkZm57cG9zdC1pbnN0YWxsYXRpb259IGNvbW1hbmRzLgotCi1Ob3JtYWwgY29tbWFuZHMgbW92ZSBmaWxlcyBpbnRvIHRoZWlyIHByb3BlciBwbGFjZXMsIGFuZCBzZXQgdGhlaXIKLW1vZGVzLiAgVGhleSBtYXkgbm90IGFsdGVyIGFueSBmaWxlcyBleGNlcHQgdGhlIG9uZXMgdGhhdCBjb21lIGVudGlyZWx5Ci1mcm9tIHRoZSBwYWNrYWdlIHRoZXkgYmVsb25nIHRvLgotCi1QcmUtaW5zdGFsbGF0aW9uIGFuZCBwb3N0LWluc3RhbGxhdGlvbiBjb21tYW5kcyBtYXkgYWx0ZXIgb3RoZXIgZmlsZXM7Ci1pbiBwYXJ0aWN1bGFyLCB0aGV5IGNhbiBlZGl0IGdsb2JhbCBjb25maWd1cmF0aW9uIGZpbGVzIG9yIGRhdGEgYmFzZXMuCi0KLVByZS1pbnN0YWxsYXRpb24gY29tbWFuZHMgYXJlIHR5cGljYWxseSBleGVjdXRlZCBiZWZvcmUgdGhlIG5vcm1hbAotY29tbWFuZHMsIGFuZCBwb3N0LWluc3RhbGxhdGlvbiBjb21tYW5kcyBhcmUgdHlwaWNhbGx5IHJ1biBhZnRlciB0aGUKLW5vcm1hbCBjb21tYW5kcy4KLQotVGhlIG1vc3QgY29tbW9uIHVzZSBmb3IgYSBwb3N0LWluc3RhbGxhdGlvbiBjb21tYW5kIGlzIHRvIHJ1bgotQGNvZGV7aW5zdGFsbC1pbmZvfS4gIFRoaXMgY2Fubm90IGJlIGRvbmUgd2l0aCBhIG5vcm1hbCBjb21tYW5kLCBzaW5jZQotaXQgYWx0ZXJzIGEgZmlsZSAodGhlIEluZm8gZGlyZWN0b3J5KSB3aGljaCBkb2VzIG5vdCBjb21lIGVudGlyZWx5IGFuZAotc29sZWx5IGZyb20gdGhlIHBhY2thZ2UgYmVpbmcgaW5zdGFsbGVkLiAgSXQgaXMgYSBwb3N0LWluc3RhbGxhdGlvbgotY29tbWFuZCBiZWNhdXNlIGl0IG5lZWRzIHRvIGJlIGRvbmUgYWZ0ZXIgdGhlIG5vcm1hbCBjb21tYW5kIHdoaWNoCi1pbnN0YWxscyB0aGUgcGFja2FnZSdzIEluZm8gZmlsZXMuCi0KLU1vc3QgcHJvZ3JhbXMgZG9uJ3QgbmVlZCBhbnkgcHJlLWluc3RhbGxhdGlvbiBjb21tYW5kcywgYnV0IHdlIGhhdmUgdGhlCi1mZWF0dXJlIGp1c3QgaW4gY2FzZSBpdCBpcyBuZWVkZWQuCi0KLVRvIGNsYXNzaWZ5IHRoZSBjb21tYW5kcyBpbiB0aGUgQGNvZGV7aW5zdGFsbH0gcnVsZSBpbnRvIHRoZXNlIHRocmVlCi1jYXRlZ29yaWVzLCBpbnNlcnQgQGRmbntjYXRlZ29yeSBsaW5lc30gYW1vbmcgdGhlbS4gIEEgY2F0ZWdvcnkgbGluZQotc3BlY2lmaWVzIHRoZSBjYXRlZ29yeSBmb3IgdGhlIGNvbW1hbmRzIHRoYXQgZm9sbG93LgotCi1BIGNhdGVnb3J5IGxpbmUgY29uc2lzdHMgb2YgYSB0YWIgYW5kIGEgcmVmZXJlbmNlIHRvIGEgc3BlY2lhbCBNYWtlCi12YXJpYWJsZSwgcGx1cyBhbiBvcHRpb25hbCBjb21tZW50IGF0IHRoZSBlbmQuICBUaGVyZSBhcmUgdGhyZWUKLXZhcmlhYmxlcyB5b3UgY2FuIHVzZSwgb25lIGZvciBlYWNoIGNhdGVnb3J5OyB0aGUgdmFyaWFibGUgbmFtZQotc3BlY2lmaWVzIHRoZSBjYXRlZ29yeS4gIENhdGVnb3J5IGxpbmVzIGFyZSBuby1vcHMgaW4gb3JkaW5hcnkgZXhlY3V0aW9uCi1iZWNhdXNlIHRoZXNlIHRocmVlIE1ha2UgdmFyaWFibGVzIGFyZSBub3JtYWxseSB1bmRlZmluZWQgKGFuZCB5b3UKLUBlbXBoe3Nob3VsZCBub3R9IGRlZmluZSB0aGVtIGluIHRoZSBtYWtlZmlsZSkuCi0KLUhlcmUgYXJlIHRoZSB0aHJlZSBwb3NzaWJsZSBjYXRlZ29yeSBsaW5lcywgZWFjaCB3aXRoIGEgY29tbWVudCB0aGF0Ci1leHBsYWlucyB3aGF0IGl0IG1lYW5zOgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICQoUFJFX0lOU1RBTEwpICAgICAjIEBye1ByZS1pbnN0YWxsIGNvbW1hbmRzIGZvbGxvdy59Ci0gICAgICAgICQoUE9TVF9JTlNUQUxMKSAgICAjIEBye1Bvc3QtaW5zdGFsbCBjb21tYW5kcyBmb2xsb3cufQotICAgICAgICAkKE5PUk1BTF9JTlNUQUxMKSAgIyBAcntOb3JtYWwgY29tbWFuZHMgZm9sbG93Ln0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUlmIHlvdSBkb24ndCB1c2UgYSBjYXRlZ29yeSBsaW5lIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIEBjb2Rle2luc3RhbGx9Ci1ydWxlLCBhbGwgdGhlIGNvbW1hbmRzIGFyZSBjbGFzc2lmaWVkIGFzIG5vcm1hbCB1bnRpbCB0aGUgZmlyc3QgY2F0ZWdvcnkKLWxpbmUuICBJZiB5b3UgZG9uJ3QgdXNlIGFueSBjYXRlZ29yeSBsaW5lcywgYWxsIHRoZSBjb21tYW5kcyBhcmUKLWNsYXNzaWZpZWQgYXMgbm9ybWFsLgotCi1UaGVzZSBhcmUgdGhlIGNhdGVnb3J5IGxpbmVzIGZvciBAY29kZXt1bmluc3RhbGx9OgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICQoUFJFX1VOSU5TVEFMTCkgICAgICMgQHJ7UHJlLXVuaW5zdGFsbCBjb21tYW5kcyBmb2xsb3cufQotICAgICAgICAkKFBPU1RfVU5JTlNUQUxMKSAgICAjIEBye1Bvc3QtdW5pbnN0YWxsIGNvbW1hbmRzIGZvbGxvdy59Ci0gICAgICAgICQoTk9STUFMX1VOSU5TVEFMTCkgICMgQHJ7Tm9ybWFsIGNvbW1hbmRzIGZvbGxvdy59Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UeXBpY2FsbHksIGEgcHJlLXVuaW5zdGFsbCBjb21tYW5kIHdvdWxkIGJlIHVzZWQgZm9yIGRlbGV0aW5nIGVudHJpZXMKLWZyb20gdGhlIEluZm8gZGlyZWN0b3J5LgotCi1JZiB0aGUgQGNvZGV7aW5zdGFsbH0gb3IgQGNvZGV7dW5pbnN0YWxsfSB0YXJnZXQgaGFzIGFueSBkZXBlbmRlbmNpZXMKLXdoaWNoIGFjdCBhcyBzdWJyb3V0aW5lcyBvZiBpbnN0YWxsYXRpb24sIHRoZW4geW91IHNob3VsZCBzdGFydAotQGVtcGh7ZWFjaH0gZGVwZW5kZW5jeSdzIGNvbW1hbmRzIHdpdGggYSBjYXRlZ29yeSBsaW5lLCBhbmQgc3RhcnQgdGhlCi1tYWluIHRhcmdldCdzIGNvbW1hbmRzIHdpdGggYSBjYXRlZ29yeSBsaW5lIGFsc28uICBUaGlzIHdheSwgeW91IGNhbgotZW5zdXJlIHRoYXQgZWFjaCBjb21tYW5kIGlzIHBsYWNlZCBpbiB0aGUgcmlnaHQgY2F0ZWdvcnkgcmVnYXJkbGVzcyBvZgotd2hpY2ggb2YgdGhlIGRlcGVuZGVuY2llcyBhY3R1YWxseSBydW4uCi0KLVByZS1pbnN0YWxsYXRpb24gYW5kIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzIHNob3VsZCBub3QgcnVuIGFueQotcHJvZ3JhbXMgZXhjZXB0IGZvciB0aGVzZToKLQotQGV4YW1wbGUKLVsgYmFzZW5hbWUgYmFzaCBjYXQgY2hncnAgY2htb2QgY2hvd24gY21wIGNwIGRkIGRpZmYgZWNobwotZWdyZXAgZXhwYW5kIGV4cHIgZmFsc2UgZmdyZXAgZmluZCBnZXRvcHQgZ3JlcCBndW56aXAgZ3ppcAotaG9zdG5hbWUgaW5zdGFsbCBpbnN0YWxsLWluZm8ga2lsbCBsZGNvbmZpZyBsbiBscyBtZDVzdW0KLW1rZGlyIG1rZmlmbyBta25vZCBtdiBwcmludGVudiBwd2Qgcm0gcm1kaXIgc2VkIHNvcnQgdGVlCi10ZXN0IHRvdWNoIHRydWUgdW5hbWUgeGFyZ3MgeWVzCi1AZW5kIGV4YW1wbGUKLQotQGNpbmRleCBiaW5hcnkgcGFja2FnZXMKLVRoZSByZWFzb24gZm9yIGRpc3Rpbmd1aXNoaW5nIHRoZSBjb21tYW5kcyBpbiB0aGlzIHdheSBpcyBmb3IgdGhlIHNha2UKLW9mIG1ha2luZyBiaW5hcnkgcGFja2FnZXMuICBUeXBpY2FsbHkgYSBiaW5hcnkgcGFja2FnZSBjb250YWlucyBhbGwgdGhlCi1leGVjdXRhYmxlcyBhbmQgb3RoZXIgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIGluc3RhbGxlZCwgYW5kIGhhcyBpdHMgb3duCi1tZXRob2Qgb2YgaW5zdGFsbGluZyB0aGVtLS0tc28gaXQgZG9lcyBub3QgbmVlZCB0byBydW4gdGhlIG5vcm1hbAotaW5zdGFsbGF0aW9uIGNvbW1hbmRzLiAgQnV0IGluc3RhbGxpbmcgdGhlIGJpbmFyeSBwYWNrYWdlIGRvZXMgbmVlZCB0bwotZXhlY3V0ZSB0aGUgcHJlLWluc3RhbGxhdGlvbiBhbmQgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMuCi0KLVByb2dyYW1zIHRvIGJ1aWxkIGJpbmFyeSBwYWNrYWdlcyB3b3JrIGJ5IGV4dHJhY3RpbmcgdGhlCi1wcmUtaW5zdGFsbGF0aW9uIGFuZCBwb3N0LWluc3RhbGxhdGlvbiBjb21tYW5kcy4gIEhlcmUgaXMgb25lIHdheSBvZgotZXh0cmFjdGluZyB0aGUgcHJlLWluc3RhbGxhdGlvbiBjb21tYW5kczoKLQotQHNtYWxsZXhhbXBsZQotbWFrZSAtbiBpbnN0YWxsIC1vIGFsbCBcCi0gICAgICBQUkVfSU5TVEFMTD1wcmUtaW5zdGFsbCBcCi0gICAgICBQT1NUX0lOU1RBTEw9cG9zdC1pbnN0YWxsIFwKLSAgICAgIE5PUk1BTF9JTlNUQUxMPW5vcm1hbC1pbnN0YWxsIFwKLSAgfCBnYXdrIC1mIHByZS1pbnN0YWxsLmF3awotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVyZSB0aGUgZmlsZSBAZmlsZXtwcmUtaW5zdGFsbC5hd2t9IGNvdWxkIGNvbnRhaW4gdGhpczoKLQotQHNtYWxsZXhhbXBsZQotJDAgfiAvXlx0WyBcdF0qKG5vcm1hbF9pbnN0YWxsfHBvc3RfaW5zdGFsbClbIFx0XSokLyBAe29uID0gMEB9Ci1vbiBAe3ByaW50ICQwQH0KLSQwIH4gL15cdFsgXHRdKnByZV9pbnN0YWxsWyBcdF0qJC8gQHtvbiA9IDFAfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIHJlc3VsdGluZyBmaWxlIG9mIHByZS1pbnN0YWxsYXRpb24gY29tbWFuZHMgaXMgZXhlY3V0ZWQgYXMgYSBzaGVsbAotc2NyaXB0IGFzIHBhcnQgb2YgaW5zdGFsbGluZyB0aGUgYmluYXJ5IHBhY2thZ2UuCmRpZmYgLS1naXQgYS9ldGMvc3RhbmRhcmRzLnRleGkgYi9ldGMvc3RhbmRhcmRzLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGJmOGIuLjAwMDAwMDAKLS0tIGEvZXRjL3N0YW5kYXJkcy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMzA5MyArMCwwIEBACi1caW5wdXQgdGV4aW5mbyBAYyAtKi10ZXhpbmZvLSotCi1AYyAlKipzdGFydCBvZiBoZWFkZXIKLUBzZXRmaWxlbmFtZSBzdGFuZGFyZHMuaW5mbwotQHNldHRpdGxlIEdOVSBDb2RpbmcgU3RhbmRhcmRzCi1AYyBUaGlzIGRhdGUgaXMgYXV0b21hZ2ljYWxseSB1cGRhdGVkIHdoZW4geW91IHNhdmUgdGhpcyBmaWxlOgotQHNldCBsYXN0dXBkYXRlIE1hcmNoIDEzLCAxOTk4Ci1AYyAlKiplbmQgb2YgaGVhZGVyCi0KLUBpZmluZm8KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIFN0YW5kYXJkczogKHN0YW5kYXJkcykuICAgICAgICBHTlUgY29kaW5nIHN0YW5kYXJkcy4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBjIEBzZXRjaGFwdGVybmV3cGFnZSBvZGQKLUBzZXRjaGFwdGVybmV3cGFnZSBvZmYKLQotQGMgVGhpcyBpcyB1c2VkIGJ5IGEgY3Jvc3MgcmVmIGluIG1ha2Utc3Rkcy50ZXhpCi1Ac2V0IENPREVTVEQgIDEKLUBpZnRleAotQHNldCBDSEFQVEVSIGNoYXB0ZXIKLUBlbmQgaWZ0ZXgKLUBpZmluZm8KLUBzZXQgQ0hBUFRFUiBub2RlCi1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1HTlUgQ29kaW5nIFN0YW5kYXJkcwotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRlWCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi1AZW5kIGlnbm9yZQotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQotcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLAotZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgc3RhdGVkIGluIGEgdHJhbnNsYXRpb24gYXBwcm92ZWQKLWJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi1AZW5kIGlmaW5mbwotCi1AdGl0bGVwYWdlCi1AdGl0bGUgR05VIENvZGluZyBTdGFuZGFyZHMKLUBhdXRob3IgUmljaGFyZCBTdGFsbG1hbgotQGF1dGhvciBsYXN0IHVwZGF0ZWQgQHZhbHVle2xhc3R1cGRhdGV9Ci1AcGFnZQotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKLWV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uIGFwcHJvdmVkCi1ieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotQGVuZCB0aXRsZXBhZ2UKLQotQGlmaW5mbwotQG5vZGUgVG9wLCBQcmVmYWNlLCAoZGlyKSwgKGRpcikKLUB0b3AgVmVyc2lvbgotCi1MYXN0IHVwZGF0ZWQgQHZhbHVle2xhc3R1cGRhdGV9LgotQGVuZCBpZmluZm8KLQotQG1lbnUKLSogUHJlZmFjZTo6ICAgICAgICAgICAgICAgICAgICAgQWJvdXQgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzCi0qIEludGVsbGVjdHVhbCBQcm9wZXJ0eTo6ICAgICAgIEtlZXBpbmcgRnJlZSBTb2Z0d2FyZSBGcmVlCi0qIERlc2lnbiBBZHZpY2U6OiAgICAgICAgICAgICAgIEdlbmVyYWwgUHJvZ3JhbSBEZXNpZ24KLSogUHJvZ3JhbSBCZWhhdmlvcjo6ICAgICAgICAgICAgUHJvZ3JhbSBCZWhhdmlvciBmb3IgQWxsIFByb2dyYW1zCi0qIFdyaXRpbmcgQzo6ICAgICAgICAgICAgICAgICAgIE1ha2luZyBUaGUgQmVzdCBVc2Ugb2YgQwotKiBEb2N1bWVudGF0aW9uOjogICAgICAgICAgICAgICBEb2N1bWVudGluZyBQcm9ncmFtcwotKiBNYW5hZ2luZyBSZWxlYXNlczo6ICAgICAgICAgICBUaGUgUmVsZWFzZSBQcm9jZXNzCi1AZW5kIG1lbnUKLQotQG5vZGUgUHJlZmFjZQotQGNoYXB0ZXIgQWJvdXQgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzCi0KLVRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcyB3ZXJlIHdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiBhbmQgb3RoZXIgR05VCi1Qcm9qZWN0IHZvbHVudGVlcnMuICBUaGVpciBwdXJwb3NlIGlzIHRvIG1ha2UgdGhlIEdOVSBzeXN0ZW0gY2xlYW4sCi1jb25zaXN0ZW50LCBhbmQgZWFzeSB0byBpbnN0YWxsLiAgVGhpcyBkb2N1bWVudCBjYW4gYWxzbyBiZSByZWFkIGFzIGEKLWd1aWRlIHRvIHdyaXRpbmcgcG9ydGFibGUsIHJvYnVzdCBhbmQgcmVsaWFibGUgcHJvZ3JhbXMuICBJdCBmb2N1c2VzIG9uCi1wcm9ncmFtcyB3cml0dGVuIGluIEMsIGJ1dCBtYW55IG9mIHRoZSBydWxlcyBhbmQgcHJpbmNpcGxlcyBhcmUgdXNlZnVsCi1ldmVuIGlmIHlvdSB3cml0ZSBpbiBhbm90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlLiAgVGhlIHJ1bGVzIG9mdGVuCi1zdGF0ZSByZWFzb25zIGZvciB3cml0aW5nIGluIGEgY2VydGFpbiB3YXkuCi0KLUNvcnJlY3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvciB0aGlzIGRvY3VtZW50IHNob3VsZCBiZSBzZW50IHRvCi1AZW1haWx7Z251QEBnbnUub3JnfS4gIElmIHlvdSBtYWtlIGEgc3VnZ2VzdGlvbiwgcGxlYXNlIGluY2x1ZGUgYQotc3VnZ2VzdGVkIG5ldyB3b3JkaW5nIGZvciBpdDsgb3VyIHRpbWUgaXMgbGltaXRlZC4gIFdlIHByZWZlciBhIGNvbnRleHQKLWRpZmYgdG8gdGhlIEBmaWxle3N0YW5kYXJkcy50ZXhpfSBvciBAZmlsZXttYWtlLXN0ZHMudGV4aX0gZmlsZXMsIGJ1dCBpZgoteW91IGRvbid0IGhhdmUgdGhvc2UgZmlsZXMsIHBsZWFzZSBtYWlsIHlvdXIgc3VnZ2VzdGlvbiBhbnl3YXkuCi0KLVRoaXMgcmVsZWFzZSBvZiB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMgd2FzIGxhc3QgdXBkYXRlZAotQHZhbHVle2xhc3R1cGRhdGV9LgotCi1Abm9kZSBJbnRlbGxlY3R1YWwgUHJvcGVydHkKLUBjaGFwdGVyIEtlZXBpbmcgRnJlZSBTb2Z0d2FyZSBGcmVlCi0KLVRoaXMgQHZhbHVle0NIQVBURVJ9IGRpc2N1c3NlcyBob3cgeW91IGNhbiBtYWtlIHN1cmUgdGhhdCBHTlUgc29mdHdhcmUKLXJlbWFpbnMgdW5lbmN1bWJlcmVkLgotCi1AbWVudQotKiBSZWFkaW5nIE5vbi1GcmVlIENvZGU6OiAgICAgICBSZWZlcnJpbmcgdG8gUHJvcHJpZXRhcnkgUHJvZ3JhbXMKLSogQ29udHJpYnV0aW9uczo6ICAgICAgICAgICAgICAgQWNjZXB0aW5nIENvbnRyaWJ1dGlvbnMKLUBlbmQgbWVudQotCi1Abm9kZSBSZWFkaW5nIE5vbi1GcmVlIENvZGUKLUBzZWN0aW9uIFJlZmVycmluZyB0byBQcm9wcmlldGFyeSBQcm9ncmFtcwotCi1Eb24ndCBpbiBhbnkgY2lyY3Vtc3RhbmNlcyByZWZlciB0byBVbml4IHNvdXJjZSBjb2RlIGZvciBvciBkdXJpbmcKLXlvdXIgd29yayBvbiBHTlUhICAoT3IgdG8gYW55IG90aGVyIHByb3ByaWV0YXJ5IHByb2dyYW1zLikKLQotSWYgeW91IGhhdmUgYSB2YWd1ZSByZWNvbGxlY3Rpb24gb2YgdGhlIGludGVybmFscyBvZiBhIFVuaXggcHJvZ3JhbSwKLXRoaXMgZG9lcyBub3QgYWJzb2x1dGVseSBtZWFuIHlvdSBjYW4ndCB3cml0ZSBhbiBpbWl0YXRpb24gb2YgaXQsIGJ1dAotZG8gdHJ5IHRvIG9yZ2FuaXplIHRoZSBpbWl0YXRpb24gaW50ZXJuYWxseSBhbG9uZyBkaWZmZXJlbnQgbGluZXMsCi1iZWNhdXNlIHRoaXMgaXMgbGlrZWx5IHRvIG1ha2UgdGhlIGRldGFpbHMgb2YgdGhlIFVuaXggdmVyc2lvbgotaXJyZWxldmFudCBhbmQgZGlzc2ltaWxhciB0byB5b3VyIHJlc3VsdHMuCi0KLUZvciBleGFtcGxlLCBVbml4IHV0aWxpdGllcyB3ZXJlIGdlbmVyYWxseSBvcHRpbWl6ZWQgdG8gbWluaW1pemUKLW1lbW9yeSB1c2U7IGlmIHlvdSBnbyBmb3Igc3BlZWQgaW5zdGVhZCwgeW91ciBwcm9ncmFtIHdpbGwgYmUgdmVyeQotZGlmZmVyZW50LiAgWW91IGNvdWxkIGtlZXAgdGhlIGVudGlyZSBpbnB1dCBmaWxlIGluIGNvcmUgYW5kIHNjYW4gaXQKLXRoZXJlIGluc3RlYWQgb2YgdXNpbmcgc3RkaW8uICBVc2UgYSBzbWFydGVyIGFsZ29yaXRobSBkaXNjb3ZlcmVkIG1vcmUKLXJlY2VudGx5IHRoYW4gdGhlIFVuaXggcHJvZ3JhbS4gIEVsaW1pbmF0ZSB1c2Ugb2YgdGVtcG9yYXJ5IGZpbGVzLiAgRG8KLWl0IGluIG9uZSBwYXNzIGluc3RlYWQgb2YgdHdvICh3ZSBkaWQgdGhpcyBpbiB0aGUgYXNzZW1ibGVyKS4KLQotT3IsIG9uIHRoZSBjb250cmFyeSwgZW1waGFzaXplIHNpbXBsaWNpdHkgaW5zdGVhZCBvZiBzcGVlZC4gIEZvciBzb21lCi1hcHBsaWNhdGlvbnMsIHRoZSBzcGVlZCBvZiB0b2RheSdzIGNvbXB1dGVycyBtYWtlcyBzaW1wbGVyIGFsZ29yaXRobXMKLWFkZXF1YXRlLgotCi1PciBnbyBmb3IgZ2VuZXJhbGl0eS4gIEZvciBleGFtcGxlLCBVbml4IHByb2dyYW1zIG9mdGVuIGhhdmUgc3RhdGljCi10YWJsZXMgb3IgZml4ZWQtc2l6ZSBzdHJpbmdzLCB3aGljaCBtYWtlIGZvciBhcmJpdHJhcnkgbGltaXRzOyB1c2UKLWR5bmFtaWMgYWxsb2NhdGlvbiBpbnN0ZWFkLiAgTWFrZSBzdXJlIHlvdXIgcHJvZ3JhbSBoYW5kbGVzIE5VTHMgYW5kCi1vdGhlciBmdW5ueSBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dCBmaWxlcy4gIEFkZCBhIHByb2dyYW1taW5nIGxhbmd1YWdlCi1mb3IgZXh0ZW5zaWJpbGl0eSBhbmQgd3JpdGUgcGFydCBvZiB0aGUgcHJvZ3JhbSBpbiB0aGF0IGxhbmd1YWdlLgotCi1PciB0dXJuIHNvbWUgcGFydHMgb2YgdGhlIHByb2dyYW0gaW50byBpbmRlcGVuZGVudGx5IHVzYWJsZSBsaWJyYXJpZXMuCi1PciB1c2UgYSBzaW1wbGUgZ2FyYmFnZSBjb2xsZWN0b3IgaW5zdGVhZCBvZiB0cmFja2luZyBwcmVjaXNlbHkgd2hlbgotdG8gZnJlZSBtZW1vcnksIG9yIHVzZSBhIG5ldyBHTlUgZmFjaWxpdHkgc3VjaCBhcyBvYnN0YWNrcy4KLQotCi1Abm9kZSBDb250cmlidXRpb25zCi1Ac2VjdGlvbiBBY2NlcHRpbmcgQ29udHJpYnV0aW9ucwotCi1JZiBzb21lb25lIGVsc2Ugc2VuZHMgeW91IGEgcGllY2Ugb2YgY29kZSB0byBhZGQgdG8gdGhlIHByb2dyYW0geW91IGFyZQotd29ya2luZyBvbiwgd2UgbmVlZCBsZWdhbCBwYXBlcnMgdG8gdXNlIGl0LS0tdGhlIHNhbWUgc29ydCBvZiBsZWdhbAotcGFwZXJzIHdlIHdpbGwgbmVlZCB0byBnZXQgZnJvbSB5b3UuICBAZW1waHtFYWNofSBzaWduaWZpY2FudAotY29udHJpYnV0b3IgdG8gYSBwcm9ncmFtIG11c3Qgc2lnbiBzb21lIHNvcnQgb2YgbGVnYWwgcGFwZXJzIGluIG9yZGVyCi1mb3IgdXMgdG8gaGF2ZSBjbGVhciB0aXRsZSB0byB0aGUgcHJvZ3JhbS4gIFRoZSBtYWluIGF1dGhvciBhbG9uZSBpcyBub3QKLWVub3VnaC4KLQotU28sIGJlZm9yZSBhZGRpbmcgaW4gYW55IGNvbnRyaWJ1dGlvbnMgZnJvbSBvdGhlciBwZW9wbGUsIHBsZWFzZSB0ZWxsCi11cywgc28gd2UgY2FuIGFycmFuZ2UgdG8gZ2V0IHRoZSBwYXBlcnMuICBUaGVuIHdhaXQgdW50aWwgd2UgdGVsbCB5b3UKLXRoYXQgd2UgaGF2ZSByZWNlaXZlZCB0aGUgc2lnbmVkIHBhcGVycywgYmVmb3JlIHlvdSBhY3R1YWxseSB1c2UgdGhlCi1jb250cmlidXRpb24uCi0KLVRoaXMgYXBwbGllcyBib3RoIGJlZm9yZSB5b3UgcmVsZWFzZSB0aGUgcHJvZ3JhbSBhbmQgYWZ0ZXJ3YXJkLiAgSWYKLXlvdSByZWNlaXZlIGRpZmZzIHRvIGZpeCBhIGJ1ZywgYW5kIHRoZXkgbWFrZSBzaWduaWZpY2FudCBjaGFuZ2VzLCB3ZQotbmVlZCBsZWdhbCBwYXBlcnMgZm9yIHRoYXQgY2hhbmdlLgotCi1UaGlzIGFsc28gYXBwbGllcyB0byBjb21tZW50cyBhbmQgZG9jdW1lbnRhdGlvbiBmaWxlcy4gIEZvciBjb3B5cmlnaHQKLWxhdywgY29tbWVudHMgYW5kIGNvZGUgYXJlIGp1c3QgdGV4dC4gIENvcHlyaWdodCBhcHBsaWVzIHRvIGFsbCBraW5kcyBvZgotdGV4dCwgc28gd2UgbmVlZCBsZWdhbCBwYXBlcnMgZm9yIGFsbCBraW5kcy4KLQotWW91IGRvbid0IG5lZWQgcGFwZXJzIGZvciBjaGFuZ2VzIG9mIGEgZmV3IGxpbmVzIGhlcmUgb3IgdGhlcmUsIHNpbmNlCi10aGV5IGFyZSBub3Qgc2lnbmlmaWNhbnQgZm9yIGNvcHlyaWdodCBwdXJwb3Nlcy4gIEFsc28sIHlvdSBkb24ndCBuZWVkCi1wYXBlcnMgaWYgYWxsIHlvdSBnZXQgZnJvbSB0aGUgc3VnZ2VzdGlvbiBpcyBzb21lIGlkZWFzLCBub3QgYWN0dWFsIGNvZGUKLXdoaWNoIHlvdSB1c2UuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdyaXRlIGEgZGlmZmVyZW50IHNvbHV0aW9uIHRvIHRoZQotcHJvYmxlbSwgeW91IGRvbid0IG5lZWQgdG8gZ2V0IHBhcGVycy4KLQotV2Uga25vdyB0aGlzIGlzIGZydXN0cmF0aW5nOyBpdCdzIGZydXN0cmF0aW5nIGZvciB1cyBhcyB3ZWxsLiAgQnV0IGlmCi15b3UgZG9uJ3Qgd2FpdCwgeW91IGFyZSBnb2luZyBvdXQgb24gYSBsaW1iLS0tZm9yIGV4YW1wbGUsIHdoYXQgaWYgdGhlCi1jb250cmlidXRvcidzIGVtcGxveWVyIHdvbid0IHNpZ24gYSBkaXNjbGFpbWVyPyAgWW91IG1pZ2h0IGhhdmUgdG8gdGFrZQotdGhhdCBjb2RlIG91dCBhZ2FpbiEKLQotVGhlIHZlcnkgd29yc3QgdGhpbmcgaXMgaWYgeW91IGZvcmdldCB0byB0ZWxsIHVzIGFib3V0IHRoZSBvdGhlcgotY29udHJpYnV0b3IuICBXZSBjb3VsZCBiZSB2ZXJ5IGVtYmFycmFzc2VkIGluIGNvdXJ0IHNvbWUgZGF5IGFzIGEKLXJlc3VsdC4KLQotV2UgaGF2ZSBtb3JlIGRldGFpbGVkIGFkdmljZSBmb3IgbWFpbnRhaW5lcnMgb2YgcHJvZ3JhbXM7IGlmIHlvdSBoYXZlCi1yZWFjaGVkIHRoZSBzdGFnZSBvZiBhY3R1YWxseSBtYWludGFpbmluZyBhIHByb2dyYW0gZm9yIEdOVSAod2hldGhlcgotcmVsZWFzZWQgb3Igbm90KSwgcGxlYXNlIGFzayB1cyBmb3IgYSBjb3B5LgotCi1Abm9kZSBEZXNpZ24gQWR2aWNlCi1AY2hhcHRlciBHZW5lcmFsIFByb2dyYW0gRGVzaWduCi0KLVRoaXMgQHZhbHVle0NIQVBURVJ9IGRpc2N1c3NlcyBzb21lIG9mIHRoZSBpc3N1ZXMgeW91IHNob3VsZCB0YWtlIGludG8KLWFjY291bnQgd2hlbiBkZXNpZ25pbmcgeW91ciBwcm9ncmFtLgotCi1AbWVudQotKiBDb21wYXRpYmlsaXR5OjogICAgICAgICAgICAgICBDb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgaW1wbGVtZW50YXRpb25zCi0qIFVzaW5nIEV4dGVuc2lvbnM6OiAgICAgICAgICAgIFVzaW5nIG5vbi1zdGFuZGFyZCBmZWF0dXJlcwotKiBBTlNJIEM6OiAgICAgICAgICAgICAgICAgICAgICBVc2luZyBBTlNJIEMgZmVhdHVyZXMKLSogU291cmNlIExhbmd1YWdlOjogICAgICAgICAgICAgVXNpbmcgbGFuZ3VhZ2VzIG90aGVyIHRoYW4gQwotQGVuZCBtZW51Ci0KLUBub2RlIENvbXBhdGliaWxpdHkKLUBzZWN0aW9uIENvbXBhdGliaWxpdHkgd2l0aCBPdGhlciBJbXBsZW1lbnRhdGlvbnMKLQotV2l0aCBvY2Nhc2lvbmFsIGV4Y2VwdGlvbnMsIHV0aWxpdHkgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcyBmb3IgR05VCi1zaG91bGQgYmUgdXB3YXJkIGNvbXBhdGlibGUgd2l0aCB0aG9zZSBpbiBCZXJrZWxleSBVbml4LCBhbmQgdXB3YXJkCi1jb21wYXRpYmxlIHdpdGggQHNje2Fuc2l9IEMgaWYgQHNje2Fuc2l9IEMgc3BlY2lmaWVzIHRoZWlyIGJlaGF2aW9yLCBhbmQKLXVwd2FyZCBjb21wYXRpYmxlIHdpdGggQHNje1BPU0lYfSBpZiBAc2N7UE9TSVh9IHNwZWNpZmllcyB0aGVpcgotYmVoYXZpb3IuCi0KLVdoZW4gdGhlc2Ugc3RhbmRhcmRzIGNvbmZsaWN0LCBpdCBpcyB1c2VmdWwgdG8gb2ZmZXIgY29tcGF0aWJpbGl0eQotbW9kZXMgZm9yIGVhY2ggb2YgdGhlbS4KLQotQHNje2Fuc2l9IEMgYW5kIEBzY3tQT1NJWH0gcHJvaGliaXQgbWFueSBraW5kcyBvZiBleHRlbnNpb25zLiAgRmVlbCBmcmVlCi10byBtYWtlIHRoZSBleHRlbnNpb25zIGFueXdheSwgYW5kIGluY2x1ZGUgYSBAc2FtcHstLWFuc2l9LAotQHNhbXB7LS1wb3NpeH0sIG9yIEBzYW1wey0tY29tcGF0aWJsZX0gb3B0aW9uIHRvIHR1cm4gdGhlbSBvZmYuCi1Ib3dldmVyLCBpZiB0aGUgZXh0ZW5zaW9uIGhhcyBhIHNpZ25pZmljYW50IGNoYW5jZSBvZiBicmVha2luZyBhbnkgcmVhbAotcHJvZ3JhbXMgb3Igc2NyaXB0cywgdGhlbiBpdCBpcyBub3QgcmVhbGx5IHVwd2FyZCBjb21wYXRpYmxlLiAgVHJ5IHRvCi1yZWRlc2lnbiBpdHMgaW50ZXJmYWNlLgotCi1NYW55IEdOVSBwcm9ncmFtcyBzdXBwcmVzcyBleHRlbnNpb25zIHRoYXQgY29uZmxpY3Qgd2l0aCBQT1NJWCBpZiB0aGUKLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle1BPU0lYTFlfQ09SUkVDVH0gaXMgZGVmaW5lZCAoZXZlbiBpZiBpdCBpcwotZGVmaW5lZCB3aXRoIGEgbnVsbCB2YWx1ZSkuICBQbGVhc2UgbWFrZSB5b3VyIHByb2dyYW0gcmVjb2duaXplIHRoaXMKLXZhcmlhYmxlIGlmIGFwcHJvcHJpYXRlLgotCi1XaGVuIGEgZmVhdHVyZSBpcyB1c2VkIG9ubHkgYnkgdXNlcnMgKG5vdCBieSBwcm9ncmFtcyBvciBjb21tYW5kCi1maWxlcyksIGFuZCBpdCBpcyBkb25lIHBvb3JseSBpbiBVbml4LCBmZWVsIGZyZWUgdG8gcmVwbGFjZSBpdAotY29tcGxldGVseSB3aXRoIHNvbWV0aGluZyB0b3RhbGx5IGRpZmZlcmVudCBhbmQgYmV0dGVyLiAgKEZvciBleGFtcGxlLAotQGNvZGV7dml9IGlzIHJlcGxhY2VkIHdpdGggRW1hY3MuKSAgQnV0IGl0IGlzIG5pY2UgdG8gb2ZmZXIgYSBjb21wYXRpYmxlCi1mZWF0dXJlIGFzIHdlbGwuICAoVGhlcmUgaXMgYSBmcmVlIEBjb2Rle3ZpfSBjbG9uZSwgc28gd2Ugb2ZmZXIgaXQuKQotCi1BZGRpdGlvbmFsIHVzZWZ1bCBmZWF0dXJlcyBub3QgaW4gQmVya2VsZXkgVW5peCBhcmUgd2VsY29tZS4KLQotQG5vZGUgVXNpbmcgRXh0ZW5zaW9ucwotQHNlY3Rpb24gVXNpbmcgTm9uLXN0YW5kYXJkIEZlYXR1cmVzCi0KLU1hbnkgR05VIGZhY2lsaXRpZXMgdGhhdCBhbHJlYWR5IGV4aXN0IHN1cHBvcnQgYSBudW1iZXIgb2YgY29udmVuaWVudAotZXh0ZW5zaW9ucyBvdmVyIHRoZSBjb21wYXJhYmxlIFVuaXggZmFjaWxpdGllcy4gIFdoZXRoZXIgdG8gdXNlIHRoZXNlCi1leHRlbnNpb25zIGluIGltcGxlbWVudGluZyB5b3VyIHByb2dyYW0gaXMgYSBkaWZmaWN1bHQgcXVlc3Rpb24uCi0KLU9uIHRoZSBvbmUgaGFuZCwgdXNpbmcgdGhlIGV4dGVuc2lvbnMgY2FuIG1ha2UgYSBjbGVhbmVyIHByb2dyYW0uCi1PbiB0aGUgb3RoZXIgaGFuZCwgcGVvcGxlIHdpbGwgbm90IGJlIGFibGUgdG8gYnVpbGQgdGhlIHByb2dyYW0KLXVubGVzcyB0aGUgb3RoZXIgR05VIHRvb2xzIGFyZSBhdmFpbGFibGUuICBUaGlzIG1pZ2h0IGNhdXNlIHRoZQotcHJvZ3JhbSB0byB3b3JrIG9uIGZld2VyIGtpbmRzIG9mIG1hY2hpbmVzLgotCi1XaXRoIHNvbWUgZXh0ZW5zaW9ucywgaXQgbWlnaHQgYmUgZWFzeSB0byBwcm92aWRlIGJvdGggYWx0ZXJuYXRpdmVzLgotRm9yIGV4YW1wbGUsIHlvdSBjYW4gZGVmaW5lIGZ1bmN0aW9ucyB3aXRoIGEgYGBrZXl3b3JkJycgQGNvZGV7SU5MSU5FfQotYW5kIGRlZmluZSB0aGF0IGFzIGEgbWFjcm8gdG8gZXhwYW5kIGludG8gZWl0aGVyIEBjb2Rle2lubGluZX0gb3IKLW5vdGhpbmcsIGRlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIuCi0KLUluIGdlbmVyYWwsIHBlcmhhcHMgaXQgaXMgYmVzdCBub3QgdG8gdXNlIHRoZSBleHRlbnNpb25zIGlmIHlvdSBjYW4KLXN0cmFpZ2h0Zm9yd2FyZGx5IGRvIHdpdGhvdXQgdGhlbSwgYnV0IHRvIHVzZSB0aGUgZXh0ZW5zaW9ucyBpZiB0aGV5Ci1hcmUgYSBiaWcgaW1wcm92ZW1lbnQuCi0KLUFuIGV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUgYXJlIHRoZSBsYXJnZSwgZXN0YWJsaXNoZWQgcHJvZ3JhbXMgKHN1Y2ggYXMKLUVtYWNzKSB3aGljaCBydW4gb24gYSBncmVhdCB2YXJpZXR5IG9mIHN5c3RlbXMuICBTdWNoIHByb2dyYW1zIHdvdWxkCi1iZSBicm9rZW4gYnkgdXNlIG9mIEdOVSBleHRlbnNpb25zLgotCi1Bbm90aGVyIGV4Y2VwdGlvbiBpcyBmb3IgcHJvZ3JhbXMgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mCi1jb21waWxhdGlvbjogYW55dGhpbmcgdGhhdCBtdXN0IGJlIGNvbXBpbGVkIHdpdGggb3RoZXIgY29tcGlsZXJzIGluCi1vcmRlciB0byBib290c3RyYXAgdGhlIEdOVSBjb21waWxhdGlvbiBmYWNpbGl0aWVzLiAgSWYgdGhlc2UgcmVxdWlyZQotdGhlIEdOVSBjb21waWxlciwgdGhlbiBubyBvbmUgY2FuIGNvbXBpbGUgdGhlbSB3aXRob3V0IGhhdmluZyB0aGVtCi1pbnN0YWxsZWQgYWxyZWFkeS4gIFRoYXQgd291bGQgYmUgbm8gZ29vZC4KLQotQG5vZGUgQU5TSSBDCi1Ac2VjdGlvbiBAc2N7YW5zaX0gQyBhbmQgcHJlLUBzY3thbnNpfSBDCi0KLURvIG5vdCBldmVyIHVzZSB0aGUgYGB0cmlncmFwaCcnIGZlYXR1cmUgb2YgQHNje2Fuc2l9IEMuCi0KLUBzY3thbnNpfSBDIGlzIHdpZGVzcHJlYWQgZW5vdWdoIG5vdyB0aGF0IGl0IGlzIG9rIHRvIHdyaXRlIG5ldyBwcm9ncmFtcwotdGhhdCB1c2UgQHNje2Fuc2l9IEMgZmVhdHVyZXMgKGFuZCB0aGVyZWZvcmUgd2lsbCBub3Qgd29yayBpbgotbm9uLUBzY3thbnNpfSBjb21waWxlcnMpLiAgQW5kIGlmIGEgcHJvZ3JhbSBpcyBhbHJlYWR5IHdyaXR0ZW4gaW4KLUBzY3thbnNpfSBDLCB0aGVyZSdzIG5vIG5lZWQgdG8gY29udmVydCBpdCB0byBzdXBwb3J0IG5vbi1Ac2N7YW5zaX0KLWNvbXBpbGVycy4KLQotSG93ZXZlciwgaXQgaXMgZWFzeSB0byBzdXBwb3J0IG5vbi1Ac2N7YW5zaX0gY29tcGlsZXJzIGluIG1vc3QgcHJvZ3JhbXMsCi1zbyB5b3UgbWlnaHQgc3RpbGwgY29uc2lkZXIgZG9pbmcgc28gd2hlbiB5b3Ugd3JpdGUgYSBwcm9ncmFtLiAgSW5zdGVhZAotb2Ygd3JpdGluZyBmdW5jdGlvbiBkZWZpbml0aW9ucyBpbiBAc2N7YW5zaX0gcHJvdG90eXBlIGZvcm0sCi0KLUBleGFtcGxlCi1pbnQKLWZvbyAoaW50IHgsIGludCB5KQotQGRvdHN7fQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd3JpdGUgdGhlIGRlZmluaXRpb24gaW4gcHJlLUBzY3thbnNpfSBzdHlsZSBsaWtlIHRoaXMsCi0KLUBleGFtcGxlCi1pbnQKLWZvbyAoeCwgeSkKLSAgICAgaW50IHgsIHk7Ci1AZG90c3t9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1hbmQgdXNlIGEgc2VwYXJhdGUgZGVjbGFyYXRpb24gdG8gc3BlY2lmeSB0aGUgYXJndW1lbnQgcHJvdG90eXBlOgotCi1AZXhhbXBsZQotaW50IGZvbyAoaW50LCBpbnQpOwotQGVuZCBleGFtcGxlCi0KLVlvdSBuZWVkIHN1Y2ggYSBkZWNsYXJhdGlvbiBhbnl3YXksIGluIGEgaGVhZGVyIGZpbGUsIHRvIGdldCB0aGUgYmVuZWZpdAotb2YgQHNje2Fuc2l9IEMgcHJvdG90eXBlcyBpbiBhbGwgdGhlIGZpbGVzIHdoZXJlIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuCi1BbmQgb25jZSB5b3UgaGF2ZSBpdCwgeW91IGxvc2Ugbm90aGluZyBieSB3cml0aW5nIHRoZSBmdW5jdGlvbgotZGVmaW5pdGlvbiBpbiB0aGUgcHJlLUBzY3thbnNpfSBzdHlsZS4KLQotSWYgeW91IGRvbid0IGtub3cgbm9uLUBzY3thbnNpfSBDLCB0aGVyZSdzIG5vIG5lZWQgdG8gbGVhcm4gaXQ7IGp1c3QKLXdyaXRlIGluIEBzY3thbnNpfSBDLgotCi1Abm9kZSBTb3VyY2UgTGFuZ3VhZ2UKLUBzZWN0aW9uIFVzaW5nIExhbmd1YWdlcyBPdGhlciBUaGFuIEMKLQotVXNpbmcgYSBsYW5ndWFnZSBvdGhlciB0aGFuIEMgaXMgbGlrZSB1c2luZyBhIG5vbi1zdGFuZGFyZCBmZWF0dXJlOiBpdAotd2lsbCBjYXVzZSB0cm91YmxlIGZvciB1c2Vycy4gIEV2ZW4gaWYgR0NDIHN1cHBvcnRzIHRoZSBvdGhlciBsYW5ndWFnZSwKLXVzZXJzIG1heSBmaW5kIGl0IGluY29udmVuaWVudCB0byBoYXZlIHRvIGluc3RhbGwgdGhlIGNvbXBpbGVyIGZvciB0aGF0Ci1vdGhlciBsYW5ndWFnZSBpbiBvcmRlciB0byBidWlsZCB5b3VyIHByb2dyYW0uICBGb3IgZXhhbXBsZSwgaWYgeW91Ci13cml0ZSB5b3VyIHByb2dyYW0gaW4gQysrLCBwZW9wbGUgd2lsbCBoYXZlIHRvIGluc3RhbGwgdGhlIEMrKyBjb21waWxlcgotaW4gb3JkZXIgdG8gY29tcGlsZSB5b3VyIHByb2dyYW0uICBUaHVzLCBpdCBpcyBiZXR0ZXIgaWYgeW91IHdyaXRlIGluIEMuCi0KLUJ1dCB0aGVyZSBhcmUgdGhyZWUgc2l0dWF0aW9ucyB3aGVuIHRoZXJlIGlzIG5vIGRpc2FkdmFudGFnZSBpbiB1c2luZwotc29tZSBvdGhlciBsYW5ndWFnZToKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUl0IGlzIG9rYXkgdG8gdXNlIGFub3RoZXIgbGFuZ3VhZ2UgaWYgeW91ciBwcm9ncmFtIGNvbnRhaW5zIGFuCi1pbnRlcnByZXRlciBmb3IgdGhhdCBsYW5ndWFnZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdXIgcHJvZ3JhbSBsaW5rcyB3aXRoIEdVSUxFLCBpdCBpcyBvayB0byB3cml0ZSBwYXJ0IG9mCi10aGUgcHJvZ3JhbSBpbiBTY2hlbWUgb3IgYW5vdGhlciBsYW5ndWFnZSBzdXBwb3J0ZWQgYnkgR1VJTEUuCi0KLUBpdGVtCi1JdCBpcyBva2F5IHRvIHVzZSBhbm90aGVyIGxhbmd1YWdlIGluIGEgdG9vbCBzcGVjaWZpY2FsbHkgaW50ZW5kZWQgZm9yCi11c2Ugd2l0aCB0aGF0IGxhbmd1YWdlLgotCi1UaGlzIGlzIG9rYXkgYmVjYXVzZSB0aGUgb25seSBwZW9wbGUgd2hvIHdhbnQgdG8gYnVpbGQgdGhlIHRvb2wgd2lsbCBiZQotdGhvc2Ugd2hvIGhhdmUgaW5zdGFsbGVkIHRoZSBvdGhlciBsYW5ndWFnZSBhbnl3YXkuCi0KLUBpdGVtCi1JZiBhbiBhcHBsaWNhdGlvbiBpcyBvZiBpbnRlcmVzdCB0byBhIG5hcnJvdyBjb21tdW5pdHksIHRoZW4gcGVyaGFwcwotaXQncyBub3QgaW1wb3J0YW50IGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBpbmNvbnZlbmllbnQgdG8gaW5zdGFsbC4KLUBlbmQgaXRlbWl6ZQotCi1DIGhhcyBvbmUgb3RoZXIgYWR2YW50YWdlIG92ZXIgQysrIGFuZCBvdGhlciBjb21waWxlZCBsYW5ndWFnZXM6IG1vcmUKLXBlb3BsZSBrbm93IEMsIHNvIG1vcmUgcGVvcGxlIHdpbGwgZmluZCBpdCBlYXN5IHRvIHJlYWQgYW5kIG1vZGlmeSB0aGUKLXByb2dyYW0gaWYgaXQgaXMgd3JpdHRlbiBpbiBDLgotCi1Abm9kZSBQcm9ncmFtIEJlaGF2aW9yCi1AY2hhcHRlciBQcm9ncmFtIEJlaGF2aW9yIGZvciBBbGwgUHJvZ3JhbXMKLQotVGhpcyBAdmFsdWV7Q0hBUFRFUn0gZGVzY3JpYmVzIGhvdyB0byB3cml0ZSByb2J1c3Qgc29mdHdhcmUuIEl0IGFsc28KLWRlc2NyaWJlcyBnZW5lcmFsIHN0YW5kYXJkcyBmb3IgZXJyb3IgbWVzc2FnZXMsIHRoZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLAotYW5kIGhvdyBsaWJyYXJpZXMgc2hvdWxkIGJlaGF2ZS4KLQotQG1lbnUKLSogU2VtYW50aWNzOjogICAgICAgICAgICAgICAgICAgV3JpdGluZyByb2J1c3QgcHJvZ3JhbXMKLSogTGlicmFyaWVzOjogICAgICAgICAgICAgICAgICAgTGlicmFyeSBiZWhhdmlvcgotKiBFcnJvcnM6OiAgICAgICAgICAgICAgICAgICAgICBGb3JtYXR0aW5nIGVycm9yIG1lc3NhZ2VzCi0qIFVzZXIgSW50ZXJmYWNlczo6ICAgICAgICAgICAgIFN0YW5kYXJkcyBmb3IgY29tbWFuZCBsaW5lIGludGVyZmFjZXMKLSogT3B0aW9uIFRhYmxlOjogICAgICAgICAgICAgICAgVGFibGUgb2YgbG9uZyBvcHRpb25zLgotKiBNZW1vcnkgVXNhZ2U6OiAgICAgICAgICAgICAgICBXaGVuIGFuZCBob3cgdG8gY2FyZSBhYm91dCBtZW1vcnkgbmVlZHMKLUBlbmQgbWVudQotCi1Abm9kZSBTZW1hbnRpY3MKLUBzZWN0aW9uIFdyaXRpbmcgUm9idXN0IFByb2dyYW1zCi0KLUF2b2lkIGFyYml0cmFyeSBsaW1pdHMgb24gdGhlIGxlbmd0aCBvciBudW1iZXIgb2YgQGVtcGh7YW55fSBkYXRhCi1zdHJ1Y3R1cmUsIGluY2x1ZGluZyBmaWxlIG5hbWVzLCBsaW5lcywgZmlsZXMsIGFuZCBzeW1ib2xzLCBieSBhbGxvY2F0aW5nCi1hbGwgZGF0YSBzdHJ1Y3R1cmVzIGR5bmFtaWNhbGx5LiAgSW4gbW9zdCBVbml4IHV0aWxpdGllcywgYGBsb25nIGxpbmVzCi1hcmUgc2lsZW50bHkgdHJ1bmNhdGVkJycuICBUaGlzIGlzIG5vdCBhY2NlcHRhYmxlIGluIGEgR05VIHV0aWxpdHkuCi0KLVV0aWxpdGllcyByZWFkaW5nIGZpbGVzIHNob3VsZCBub3QgZHJvcCBOVUwgY2hhcmFjdGVycywgb3IgYW55IG90aGVyCi1ub25wcmludGluZyBjaGFyYWN0ZXJzIEBlbXBoe2luY2x1ZGluZyB0aG9zZSB3aXRoIGNvZGVzIGFib3ZlIDAxNzd9LiAgVGhlCi1vbmx5IHNlbnNpYmxlIGV4Y2VwdGlvbnMgd291bGQgYmUgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBpbnRlbmRlZCBmb3IKLWludGVyZmFjZSB0byBjZXJ0YWluIHR5cGVzIG9mIHByaW50ZXJzIHRoYXQgY2FuJ3QgaGFuZGxlIHRob3NlIGNoYXJhY3RlcnMuCi0KLUNoZWNrIGV2ZXJ5IHN5c3RlbSBjYWxsIGZvciBhbiBlcnJvciByZXR1cm4sIHVubGVzcyB5b3Uga25vdyB5b3Ugd2lzaCB0bwotaWdub3JlIGVycm9ycy4gIEluY2x1ZGUgdGhlIHN5c3RlbSBlcnJvciB0ZXh0IChmcm9tIEBjb2Rle3BlcnJvcn0gb3IKLWVxdWl2YWxlbnQpIGluIEBlbXBoe2V2ZXJ5fSBlcnJvciBtZXNzYWdlIHJlc3VsdGluZyBmcm9tIGEgZmFpbGluZwotc3lzdGVtIGNhbGwsIGFzIHdlbGwgYXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgaWYgYW55IGFuZCB0aGUgbmFtZSBvZiB0aGUKLXV0aWxpdHkuICBKdXN0IGBgY2Fubm90IG9wZW4gZm9vLmMnJyBvciBgYHN0YXQgZmFpbGVkJycgaXMgbm90Ci1zdWZmaWNpZW50LgotCi1DaGVjayBldmVyeSBjYWxsIHRvIEBjb2Rle21hbGxvY30gb3IgQGNvZGV7cmVhbGxvY30gdG8gc2VlIGlmIGl0Ci1yZXR1cm5lZCB6ZXJvLiAgQ2hlY2sgQGNvZGV7cmVhbGxvY30gZXZlbiBpZiB5b3UgYXJlIG1ha2luZyB0aGUgYmxvY2sKLXNtYWxsZXI7IGluIGEgc3lzdGVtIHRoYXQgcm91bmRzIGJsb2NrIHNpemVzIHRvIGEgcG93ZXIgb2YgMiwKLUBjb2Rle3JlYWxsb2N9IG1heSBnZXQgYSBkaWZmZXJlbnQgYmxvY2sgaWYgeW91IGFzayBmb3IgbGVzcyBzcGFjZS4KLQotSW4gVW5peCwgQGNvZGV7cmVhbGxvY30gY2FuIGRlc3Ryb3kgdGhlIHN0b3JhZ2UgYmxvY2sgaWYgaXQgcmV0dXJucwotemVyby4gIEdOVSBAY29kZXtyZWFsbG9jfSBkb2VzIG5vdCBoYXZlIHRoaXMgYnVnOiBpZiBpdCBmYWlscywgdGhlCi1vcmlnaW5hbCBibG9jayBpcyB1bmNoYW5nZWQuICBGZWVsIGZyZWUgdG8gYXNzdW1lIHRoZSBidWcgaXMgZml4ZWQuICBJZgoteW91IHdpc2ggdG8gcnVuIHlvdXIgcHJvZ3JhbSBvbiBVbml4LCBhbmQgd2lzaCB0byBhdm9pZCBsb3NzYWdlIGluIHRoaXMKLWNhc2UsIHlvdSBjYW4gdXNlIHRoZSBHTlUgQGNvZGV7bWFsbG9jfS4KLQotWW91IG11c3QgZXhwZWN0IEBjb2Rle2ZyZWV9IHRvIGFsdGVyIHRoZSBjb250ZW50cyBvZiB0aGUgYmxvY2sgdGhhdCB3YXMKLWZyZWVkLiAgQW55dGhpbmcgeW91IHdhbnQgdG8gZmV0Y2ggZnJvbSB0aGUgYmxvY2ssIHlvdSBtdXN0IGZldGNoIGJlZm9yZQotY2FsbGluZyBAY29kZXtmcmVlfS4KLQotSWYgQGNvZGV7bWFsbG9jfSBmYWlscyBpbiBhIG5vbmludGVyYWN0aXZlIHByb2dyYW0sIG1ha2UgdGhhdCBhIGZhdGFsCi1lcnJvci4gIEluIGFuIGludGVyYWN0aXZlIHByb2dyYW0gKG9uZSB0aGF0IHJlYWRzIGNvbW1hbmRzIGZyb20gdGhlCi11c2VyKSwgaXQgaXMgYmV0dGVyIHRvIGFib3J0IHRoZSBjb21tYW5kIGFuZCByZXR1cm4gdG8gdGhlIGNvbW1hbmQKLXJlYWRlciBsb29wLiAgVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8ga2lsbCBvdGhlciBwcm9jZXNzZXMgdG8gZnJlZSB1cAotdmlydHVhbCBtZW1vcnksIGFuZCB0aGVuIHRyeSB0aGUgY29tbWFuZCBhZ2Fpbi4KLQotVXNlIEBjb2Rle2dldG9wdF9sb25nfSB0byBkZWNvZGUgYXJndW1lbnRzLCB1bmxlc3MgdGhlIGFyZ3VtZW50IHN5bnRheAotbWFrZXMgdGhpcyB1bnJlYXNvbmFibGUuCi0KLVdoZW4gc3RhdGljIHN0b3JhZ2UgaXMgdG8gYmUgd3JpdHRlbiBpbiBkdXJpbmcgcHJvZ3JhbSBleGVjdXRpb24sIHVzZQotZXhwbGljaXQgQyBjb2RlIHRvIGluaXRpYWxpemUgaXQuICBSZXNlcnZlIEMgaW5pdGlhbGl6ZWQgZGVjbGFyYXRpb25zCi1mb3IgZGF0YSB0aGF0IHdpbGwgbm90IGJlIGNoYW5nZWQuCi1AYyBBRFI6IHdoeT8KLQotVHJ5IHRvIGF2b2lkIGxvdy1sZXZlbCBpbnRlcmZhY2VzIHRvIG9ic2N1cmUgVW5peCBkYXRhIHN0cnVjdHVyZXMgKHN1Y2gKLWFzIGZpbGUgZGlyZWN0b3JpZXMsIHV0bXAsIG9yIHRoZSBsYXlvdXQgb2Yga2VybmVsIG1lbW9yeSksIHNpbmNlIHRoZXNlCi1hcmUgbGVzcyBsaWtlbHkgdG8gd29yayBjb21wYXRpYmx5LiAgSWYgeW91IG5lZWQgdG8gZmluZCBhbGwgdGhlIGZpbGVzCi1pbiBhIGRpcmVjdG9yeSwgdXNlIEBjb2Rle3JlYWRkaXJ9IG9yIHNvbWUgb3RoZXIgaGlnaC1sZXZlbCBpbnRlcmZhY2UuCi1UaGVzZSB3aWxsIGJlIHN1cHBvcnRlZCBjb21wYXRpYmx5IGJ5IEdOVS4KLQotQnkgZGVmYXVsdCwgdGhlIEdOVSBzeXN0ZW0gd2lsbCBwcm92aWRlIHRoZSBzaWduYWwgaGFuZGxpbmcgZnVuY3Rpb25zIG9mCi1Ac2N7QlNEfSBhbmQgb2YgQHNje1BPU0lYfS4gIFNvIEdOVSBzb2Z0d2FyZSBzaG91bGQgYmUgd3JpdHRlbiB0byB1c2UKLXRoZXNlLgotCi1JbiBlcnJvciBjaGVja3MgdGhhdCBkZXRlY3QgYGBpbXBvc3NpYmxlJycgY29uZGl0aW9ucywganVzdCBhYm9ydC4KLVRoZXJlIGlzIHVzdWFsbHkgbm8gcG9pbnQgaW4gcHJpbnRpbmcgYW55IG1lc3NhZ2UuICBUaGVzZSBjaGVja3MKLWluZGljYXRlIHRoZSBleGlzdGVuY2Ugb2YgYnVncy4gIFdob2V2ZXIgd2FudHMgdG8gZml4IHRoZSBidWdzIHdpbGwgaGF2ZQotdG8gcmVhZCB0aGUgc291cmNlIGNvZGUgYW5kIHJ1biBhIGRlYnVnZ2VyLiAgU28gZXhwbGFpbiB0aGUgcHJvYmxlbSB3aXRoCi1jb21tZW50cyBpbiB0aGUgc291cmNlLiAgVGhlIHJlbGV2YW50IGRhdGEgd2lsbCBiZSBpbiB2YXJpYWJsZXMsIHdoaWNoCi1hcmUgZWFzeSB0byBleGFtaW5lIHdpdGggdGhlIGRlYnVnZ2VyLCBzbyB0aGVyZSBpcyBubyBwb2ludCBtb3ZpbmcgdGhlbQotZWxzZXdoZXJlLgotCi1EbyBub3QgdXNlIGEgY291bnQgb2YgZXJyb3JzIGFzIHRoZSBleGl0IHN0YXR1cyBmb3IgYSBwcm9ncmFtLgotQGVtcGh7VGhhdCBkb2VzIG5vdCB3b3JrfSwgYmVjYXVzZSBleGl0IHN0YXR1cyB2YWx1ZXMgYXJlIGxpbWl0ZWQgdG8gOAotYml0cyAoMCB0aHJvdWdoIDI1NSkuICBBIHNpbmdsZSBydW4gb2YgdGhlIHByb2dyYW0gbWlnaHQgaGF2ZSAyNTYKLWVycm9yczsgaWYgeW91IHRyeSB0byByZXR1cm4gMjU2IGFzIHRoZSBleGl0IHN0YXR1cywgdGhlIHBhcmVudCBwcm9jZXNzCi13aWxsIHNlZSAwIGFzIHRoZSBzdGF0dXMsIGFuZCBpdCB3aWxsIGFwcGVhciB0aGF0IHRoZSBwcm9ncmFtIHN1Y2NlZWRlZC4KLQotSWYgeW91IG1ha2UgdGVtcG9yYXJ5IGZpbGVzLCBjaGVjayB0aGUgQGNvZGV7VE1QRElSfSBlbnZpcm9ubWVudAotdmFyaWFibGU7IGlmIHRoYXQgdmFyaWFibGUgaXMgZGVmaW5lZCwgdXNlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci1pbnN0ZWFkIG9mIEBmaWxley90bXB9LgotCi1Abm9kZSBMaWJyYXJpZXMKLUBzZWN0aW9uIExpYnJhcnkgQmVoYXZpb3IKLQotVHJ5IHRvIG1ha2UgbGlicmFyeSBmdW5jdGlvbnMgcmVlbnRyYW50LiAgSWYgdGhleSBuZWVkIHRvIGRvIGR5bmFtaWMKLXN0b3JhZ2UgYWxsb2NhdGlvbiwgYXQgbGVhc3QgdHJ5IHRvIGF2b2lkIGFueSBub25yZWVudHJhbmN5IGFzaWRlIGZyb20KLXRoYXQgb2YgQGNvZGV7bWFsbG9jfSBpdHNlbGYuCi0KLUhlcmUgYXJlIGNlcnRhaW4gbmFtZSBjb252ZW50aW9ucyBmb3IgbGlicmFyaWVzLCB0byBhdm9pZCBuYW1lCi1jb25mbGljdHMuCi0KLUNob29zZSBhIG5hbWUgcHJlZml4IGZvciB0aGUgbGlicmFyeSwgbW9yZSB0aGFuIHR3byBjaGFyYWN0ZXJzIGxvbmcuCi1BbGwgZXh0ZXJuYWwgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIG5hbWVzIHNob3VsZCBzdGFydCB3aXRoIHRoaXMKLXByZWZpeC4gIEluIGFkZGl0aW9uLCB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgb2YgdGhlc2UgaW4gYW55IGdpdmVuCi1saWJyYXJ5IG1lbWJlci4gIFRoaXMgdXN1YWxseSBtZWFucyBwdXR0aW5nIGVhY2ggb25lIGluIGEgc2VwYXJhdGUKLXNvdXJjZSBmaWxlLgotCi1BbiBleGNlcHRpb24gY2FuIGJlIG1hZGUgd2hlbiB0d28gZXh0ZXJuYWwgc3ltYm9scyBhcmUgYWx3YXlzIHVzZWQKLXRvZ2V0aGVyLCBzbyB0aGF0IG5vIHJlYXNvbmFibGUgcHJvZ3JhbSBjb3VsZCB1c2Ugb25lIHdpdGhvdXQgdGhlCi1vdGhlcjsgdGhlbiB0aGV5IGNhbiBib3RoIGdvIGluIHRoZSBzYW1lIGZpbGUuCi0KLUV4dGVybmFsIHN5bWJvbHMgdGhhdCBhcmUgbm90IGRvY3VtZW50ZWQgZW50cnkgcG9pbnRzIGZvciB0aGUgdXNlcgotc2hvdWxkIGhhdmUgbmFtZXMgYmVnaW5uaW5nIHdpdGggQHNhbXB7X30uICBUaGV5IHNob3VsZCBhbHNvIGNvbnRhaW4KLXRoZSBjaG9zZW4gbmFtZSBwcmVmaXggZm9yIHRoZSBsaWJyYXJ5LCB0byBwcmV2ZW50IGNvbGxpc2lvbnMgd2l0aAotb3RoZXIgbGlicmFyaWVzLiAgVGhlc2UgY2FuIGdvIGluIHRoZSBzYW1lIGZpbGVzIHdpdGggdXNlciBlbnRyeQotcG9pbnRzIGlmIHlvdSBsaWtlLgotCi1TdGF0aWMgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgY2FuIGJlIHVzZWQgYXMgeW91IGxpa2UgYW5kIG5lZWQgbm90Ci1maXQgYW55IG5hbWluZyBjb252ZW50aW9uLgotCi1Abm9kZSBFcnJvcnMKLUBzZWN0aW9uIEZvcm1hdHRpbmcgRXJyb3IgTWVzc2FnZXMKLQotRXJyb3IgbWVzc2FnZXMgZnJvbSBjb21waWxlcnMgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotQHZhcntzb3VyY2UtZmlsZS1uYW1lfTpAdmFye2xpbmVub306IEB2YXJ7bWVzc2FnZX0KLUBlbmQgZXhhbXBsZQotCi1FcnJvciBtZXNzYWdlcyBmcm9tIG90aGVyIG5vbmludGVyYWN0aXZlIHByb2dyYW1zIHNob3VsZCBsb29rIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLUB2YXJ7cHJvZ3JhbX06QHZhcntzb3VyY2UtZmlsZS1uYW1lfTpAdmFye2xpbmVub306IEB2YXJ7bWVzc2FnZX0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdoZW4gdGhlcmUgaXMgYW4gYXBwcm9wcmlhdGUgc291cmNlIGZpbGUsIG9yIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLUB2YXJ7cHJvZ3JhbX06IEB2YXJ7bWVzc2FnZX0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdoZW4gdGhlcmUgaXMgbm8gcmVsZXZhbnQgc291cmNlIGZpbGUuCi0KLUluIGFuIGludGVyYWN0aXZlIHByb2dyYW0gKG9uZSB0aGF0IGlzIHJlYWRpbmcgY29tbWFuZHMgZnJvbSBhCi10ZXJtaW5hbCksIGl0IGlzIGJldHRlciBub3QgdG8gaW5jbHVkZSB0aGUgcHJvZ3JhbSBuYW1lIGluIGFuIGVycm9yCi1tZXNzYWdlLiAgVGhlIHBsYWNlIHRvIGluZGljYXRlIHdoaWNoIHByb2dyYW0gaXMgcnVubmluZyBpcyBpbiB0aGUKLXByb21wdCBvciB3aXRoIHRoZSBzY3JlZW4gbGF5b3V0LiAgKFdoZW4gdGhlIHNhbWUgcHJvZ3JhbSBydW5zIHdpdGgKLWlucHV0IGZyb20gYSBzb3VyY2Ugb3RoZXIgdGhhbiBhIHRlcm1pbmFsLCBpdCBpcyBub3QgaW50ZXJhY3RpdmUgYW5kCi13b3VsZCBkbyBiZXN0IHRvIHByaW50IGVycm9yIG1lc3NhZ2VzIHVzaW5nIHRoZSBub25pbnRlcmFjdGl2ZSBzdHlsZS4pCi0KLVRoZSBzdHJpbmcgQHZhcnttZXNzYWdlfSBzaG91bGQgbm90IGJlZ2luIHdpdGggYSBjYXBpdGFsIGxldHRlciB3aGVuCi1pdCBmb2xsb3dzIGEgcHJvZ3JhbSBuYW1lIGFuZC9vciBmaWxlIG5hbWUuICBBbHNvLCBpdCBzaG91bGQgbm90IGVuZAotd2l0aCBhIHBlcmlvZC4KLQotRXJyb3IgbWVzc2FnZXMgZnJvbSBpbnRlcmFjdGl2ZSBwcm9ncmFtcywgYW5kIG90aGVyIG1lc3NhZ2VzIHN1Y2ggYXMKLXVzYWdlIG1lc3NhZ2VzLCBzaG91bGQgc3RhcnQgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLiAgQnV0IHRoZXkgc2hvdWxkIG5vdAotZW5kIHdpdGggYSBwZXJpb2QuCi0KLUBub2RlIFVzZXIgSW50ZXJmYWNlcwotQHNlY3Rpb24gU3RhbmRhcmRzIGZvciBDb21tYW5kIExpbmUgSW50ZXJmYWNlcwotCi1QbGVhc2UgZG9uJ3QgbWFrZSB0aGUgYmVoYXZpb3Igb2YgYSB1dGlsaXR5IGRlcGVuZCBvbiB0aGUgbmFtZSB1c2VkCi10byBpbnZva2UgaXQuICBJdCBpcyB1c2VmdWwgc29tZXRpbWVzIHRvIG1ha2UgYSBsaW5rIHRvIGEgdXRpbGl0eQotd2l0aCBhIGRpZmZlcmVudCBuYW1lLCBhbmQgdGhhdCBzaG91bGQgbm90IGNoYW5nZSB3aGF0IGl0IGRvZXMuCi0KLUluc3RlYWQsIHVzZSBhIHJ1biB0aW1lIG9wdGlvbiBvciBhIGNvbXBpbGF0aW9uIHN3aXRjaCBvciBib3RoCi10byBzZWxlY3QgYW1vbmcgdGhlIGFsdGVybmF0ZSBiZWhhdmlvcnMuCi0KLUxpa2V3aXNlLCBwbGVhc2UgZG9uJ3QgbWFrZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHByb2dyYW0gZGVwZW5kIG9uIHRoZQotdHlwZSBvZiBvdXRwdXQgZGV2aWNlIGl0IGlzIHVzZWQgd2l0aC4gIERldmljZSBpbmRlcGVuZGVuY2UgaXMgYW4KLWltcG9ydGFudCBwcmluY2lwbGUgb2YgdGhlIHN5c3RlbSdzIGRlc2lnbjsgZG8gbm90IGNvbXByb21pc2UgaXQKLW1lcmVseSB0byBzYXZlIHNvbWVvbmUgZnJvbSB0eXBpbmcgYW4gb3B0aW9uIG5vdyBhbmQgdGhlbi4KLQotSWYgeW91IHRoaW5rIG9uZSBiZWhhdmlvciBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBvdXRwdXQgaXMgdG8gYQotdGVybWluYWwsIGFuZCBhbm90aGVyIGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIG91dHB1dCBpcyBhIGZpbGUgb3IgYQotcGlwZSwgdGhlbiBpdCBpcyB1c3VhbGx5IGJlc3QgdG8gbWFrZSB0aGUgZGVmYXVsdCBiZWhhdmlvciB0aGUgb25lIHRoYXQKLWlzIHVzZWZ1bCB3aXRoIG91dHB1dCB0byBhIHRlcm1pbmFsLCBhbmQgaGF2ZSBhbiBvcHRpb24gZm9yIHRoZSBvdGhlcgotYmVoYXZpb3IuCi0KLUNvbXBhdGliaWxpdHkgcmVxdWlyZXMgY2VydGFpbiBwcm9ncmFtcyB0byBkZXBlbmQgb24gdGhlIHR5cGUgb2Ygb3V0cHV0Ci1kZXZpY2UuICBJdCB3b3VsZCBiZSBkaXNhc3Ryb3VzIGlmIEBjb2Rle2xzfSBvciBAY29kZXtzaH0gZGlkIG5vdCBkbyBzbwotaW4gdGhlIHdheSBhbGwgdXNlcnMgZXhwZWN0LiAgSW4gc29tZSBvZiB0aGVzZSBjYXNlcywgd2Ugc3VwcGxlbWVudCB0aGUKLXByb2dyYW0gd2l0aCBhIHByZWZlcnJlZCBhbHRlcm5hdGUgdmVyc2lvbiB0aGF0IGRvZXMgbm90IGRlcGVuZCBvbiB0aGUKLW91dHB1dCBkZXZpY2UgdHlwZS4gIEZvciBleGFtcGxlLCB3ZSBwcm92aWRlIGEgQGNvZGV7ZGlyfSBwcm9ncmFtIG11Y2gKLWxpa2UgQGNvZGV7bHN9IGV4Y2VwdCB0aGF0IGl0cyBkZWZhdWx0IG91dHB1dCBmb3JtYXQgaXMgYWx3YXlzCi1tdWx0aS1jb2x1bW4gZm9ybWF0LgotCi1JdCBpcyBhIGdvb2QgaWRlYSB0byBmb2xsb3cgdGhlIEBzY3tQT1NJWH0gZ3VpZGVsaW5lcyBmb3IgdGhlCi1jb21tYW5kLWxpbmUgb3B0aW9ucyBvZiBhIHByb2dyYW0uICBUaGUgZWFzaWVzdCB3YXkgdG8gZG8gdGhpcyBpcyB0byB1c2UKLUBjb2Rle2dldG9wdH0gdG8gcGFyc2UgdGhlbS4gIE5vdGUgdGhhdCB0aGUgR05VIHZlcnNpb24gb2YgQGNvZGV7Z2V0b3B0fQotd2lsbCBub3JtYWxseSBwZXJtaXQgb3B0aW9ucyBhbnl3aGVyZSBhbW9uZyB0aGUgYXJndW1lbnRzIHVubGVzcyB0aGUKLXNwZWNpYWwgYXJndW1lbnQgQHNhbXB7LS19IGlzIHVzZWQuICBUaGlzIGlzIG5vdCB3aGF0IEBzY3tQT1NJWH0KLXNwZWNpZmllczsgaXQgaXMgYSBHTlUgZXh0ZW5zaW9uLgotCi1QbGVhc2UgZGVmaW5lIGxvbmctbmFtZWQgb3B0aW9ucyB0aGF0IGFyZSBlcXVpdmFsZW50IHRvIHRoZQotc2luZ2xlLWxldHRlciBVbml4LXN0eWxlIG9wdGlvbnMuICBXZSBob3BlIHRvIG1ha2UgR05VIG1vcmUgdXNlcgotZnJpZW5kbHkgdGhpcyB3YXkuICBUaGlzIGlzIGVhc3kgdG8gZG8gd2l0aCB0aGUgR05VIGZ1bmN0aW9uCi1AY29kZXtnZXRvcHRfbG9uZ30uCi0KLU9uZSBvZiB0aGUgYWR2YW50YWdlcyBvZiBsb25nLW5hbWVkIG9wdGlvbnMgaXMgdGhhdCB0aGV5IGNhbiBiZQotY29uc2lzdGVudCBmcm9tIHByb2dyYW0gdG8gcHJvZ3JhbS4gIEZvciBleGFtcGxlLCB1c2VycyBzaG91bGQgYmUgYWJsZQotdG8gZXhwZWN0IHRoZSBgYHZlcmJvc2UnJyBvcHRpb24gb2YgYW55IEdOVSBwcm9ncmFtIHdoaWNoIGhhcyBvbmUsIHRvIGJlCi1zcGVsbGVkIHByZWNpc2VseSBAc2FtcHstLXZlcmJvc2V9LiAgVG8gYWNoaWV2ZSB0aGlzIHVuaWZvcm1pdHksIGxvb2sgYXQKLXRoZSB0YWJsZSBvZiBjb21tb24gbG9uZy1vcHRpb24gbmFtZXMgd2hlbiB5b3UgY2hvb3NlIHRoZSBvcHRpb24gbmFtZXMKLWZvciB5b3VyIHByb2dyYW0gKEBweHJlZntPcHRpb24gVGFibGV9KS4KLQotSXQgaXMgdXN1YWxseSBhIGdvb2QgaWRlYSBmb3IgZmlsZSBuYW1lcyBnaXZlbiBhcyBvcmRpbmFyeSBhcmd1bWVudHMgdG8KLWJlIGlucHV0IGZpbGVzIG9ubHk7IGFueSBvdXRwdXQgZmlsZXMgd291bGQgYmUgc3BlY2lmaWVkIHVzaW5nIG9wdGlvbnMKLShwcmVmZXJhYmx5IEBzYW1wey1vfSBvciBAc2FtcHstLW91dHB1dH0pLiAgRXZlbiBpZiB5b3UgYWxsb3cgYW4gb3V0cHV0Ci1maWxlIG5hbWUgYXMgYW4gb3JkaW5hcnkgYXJndW1lbnQgZm9yIGNvbXBhdGliaWxpdHksIHRyeSB0byBwcm92aWRlIGFuCi1vcHRpb24gYXMgYW5vdGhlciB3YXkgdG8gc3BlY2lmeSBpdC4gIFRoaXMgd2lsbCBsZWFkIHRvIG1vcmUgY29uc2lzdGVuY3kKLWFtb25nIEdOVSB1dGlsaXRpZXMsIGFuZCBmZXdlciBpZGlvc3luY3JhY2llcyBmb3IgdXNlcnMgdG8gcmVtZW1iZXIuCi0KLUFsbCBwcm9ncmFtcyBzaG91bGQgc3VwcG9ydCB0d28gc3RhbmRhcmQgb3B0aW9uczogQHNhbXB7LS12ZXJzaW9ufQotYW5kIEBzYW1wey0taGVscH0uCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLS12ZXJzaW9uCi1UaGlzIG9wdGlvbiBzaG91bGQgZGlyZWN0IHRoZSBwcm9ncmFtIHRvIGluZm9ybWF0aW9uIGFib3V0IGl0cyBuYW1lLAotdmVyc2lvbiwgb3JpZ2luIGFuZCBsZWdhbCBzdGF0dXMsIGFsbCBvbiBzdGFuZGFyZCBvdXRwdXQsIGFuZCB0aGVuIGV4aXQKLXN1Y2Nlc3NmdWxseS4gIE90aGVyIG9wdGlvbnMgYW5kIGFyZ3VtZW50cyBzaG91bGQgYmUgaWdub3JlZCBvbmNlIHRoaXMKLWlzIHNlZW4sIGFuZCB0aGUgcHJvZ3JhbSBzaG91bGQgbm90IHBlcmZvcm0gaXRzIG5vcm1hbCBmdW5jdGlvbi4KLQotVGhlIGZpcnN0IGxpbmUgaXMgbWVhbnQgdG8gYmUgZWFzeSBmb3IgYSBwcm9ncmFtIHRvIHBhcnNlOyB0aGUgdmVyc2lvbgotbnVtYmVyIHByb3BlciBzdGFydHMgYWZ0ZXIgdGhlIGxhc3Qgc3BhY2UuICBJbiBhZGRpdGlvbiwgaXQgY29udGFpbnMKLXRoZSBjYW5vbmljYWwgbmFtZSBmb3IgdGhpcyBwcm9ncmFtLCBpbiB0aGlzIGZvcm1hdDoKLQotQGV4YW1wbGUKLUdOVSBFbWFjcyAxOS4zMAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotVGhlIHByb2dyYW0ncyBuYW1lIHNob3VsZCBiZSBhIGNvbnN0YW50IHN0cmluZzsgQGVtcGh7ZG9uJ3R9IGNvbXB1dGUgaXQKLWZyb20gQGNvZGV7YXJndlswXX0uICBUaGUgaWRlYSBpcyB0byBzdGF0ZSB0aGUgc3RhbmRhcmQgb3IgY2Fub25pY2FsCi1uYW1lIGZvciB0aGUgcHJvZ3JhbSwgbm90IGl0cyBmaWxlIG5hbWUuICBUaGVyZSBhcmUgb3RoZXIgd2F5cyB0byBmaW5kCi1vdXQgdGhlIHByZWNpc2UgZmlsZSBuYW1lIHdoZXJlIGEgY29tbWFuZCBpcyBmb3VuZCBpbiBAY29kZXtQQVRIfS4KLQotSWYgdGhlIHByb2dyYW0gaXMgYSBzdWJzaWRpYXJ5IHBhcnQgb2YgYSBsYXJnZXIgcGFja2FnZSwgbWVudGlvbiB0aGUKLXBhY2thZ2UgbmFtZSBpbiBwYXJlbnRoZXNlcywgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotZW1hY3NzZXJ2ZXIgKEdOVSBFbWFjcykgMTkuMzAKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLUlmIHRoZSBwYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIHRoaXMKLXByb2dyYW0ncyB2ZXJzaW9uIG51bWJlciwgeW91IGNhbiBtZW50aW9uIHRoZSBwYWNrYWdlIHZlcnNpb24gbnVtYmVyCi1qdXN0IGJlZm9yZSB0aGUgY2xvc2UtcGFyZW50aGVzaXMuCi0KLUlmIHlvdSBAc3Ryb25ne25lZWR9IHRvIG1lbnRpb24gdGhlIHZlcnNpb24gbnVtYmVycyBvZiBsaWJyYXJpZXMgd2hpY2gKLWFyZSBkaXN0cmlidXRlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIHBhY2thZ2Ugd2hpY2ggY29udGFpbnMgdGhpcyBwcm9ncmFtLAoteW91IGNhbiBkbyBzbyBieSBwcmludGluZyBhbiBhZGRpdGlvbmFsIGxpbmUgb2YgdmVyc2lvbiBpbmZvIGZvciBlYWNoCi1saWJyYXJ5IHlvdSB3YW50IHRvIG1lbnRpb24uICBVc2UgdGhlIHNhbWUgZm9ybWF0IGZvciB0aGVzZSBsaW5lcyBhcyBmb3IKLXRoZSBmaXJzdCBsaW5lLgotCi1QbGVhc2UgZG8gbm90IG1lbnRpb24gYWxsIG9mIHRoZSBsaWJyYXJpZXMgdGhhdCB0aGUgcHJvZ3JhbSB1c2VzIGBganVzdAotZm9yIGNvbXBsZXRlbmVzcycnLS0tdGhhdCB3b3VsZCBwcm9kdWNlIGEgbG90IG9mIHVuaGVscGZ1bCBjbHV0dGVyLgotUGxlYXNlIG1lbnRpb24gbGlicmFyeSB2ZXJzaW9uIG51bWJlcnMgb25seSBpZiB5b3UgZmluZCBpbiBwcmFjdGljZSB0aGF0Ci10aGV5IGFyZSB2ZXJ5IGltcG9ydGFudCB0byB5b3UgaW4gZGVidWdnaW5nLgotCi1UaGUgZm9sbG93aW5nIGxpbmUsIGFmdGVyIHRoZSB2ZXJzaW9uIG51bWJlciBsaW5lIG9yIGxpbmVzLCBzaG91bGQgYmUgYQotY29weXJpZ2h0IG5vdGljZS4gIElmIG1vcmUgdGhhbiBvbmUgY29weXJpZ2h0IG5vdGljZSBpcyBjYWxsZWQgZm9yLCBwdXQKLWVhY2ggb24gYSBzZXBhcmF0ZSBsaW5lLgotCi1OZXh0IHNob3VsZCBmb2xsb3cgYSBicmllZiBzdGF0ZW1lbnQgdGhhdCB0aGUgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlLAotYW5kIHRoYXQgdXNlcnMgYXJlIGZyZWUgdG8gY29weSBhbmQgY2hhbmdlIGl0IG9uIGNlcnRhaW4gY29uZGl0aW9ucy4gIElmCi10aGUgcHJvZ3JhbSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR1BMLCBzYXkgc28gaGVyZS4gIEFsc28gbWVudGlvbiB0aGF0Ci10aGVyZSBpcyBubyB3YXJyYW50eSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LgotCi1JdCBpcyBvayB0byBmaW5pc2ggdGhlIG91dHB1dCB3aXRoIGEgbGlzdCBvZiB0aGUgbWFqb3IgYXV0aG9ycyBvZiB0aGUKLXByb2dyYW0sIGFzIGEgd2F5IG9mIGdpdmluZyBjcmVkaXQuCi0KLUhlcmUncyBhbiBleGFtcGxlIG9mIG91dHB1dCB0aGF0IGZvbGxvd3MgdGhlc2UgcnVsZXM6Ci0KLUBzbWFsbGV4YW1wbGUKLUdOVSBFbWFjcyAxOS4zNC41Ci1Db3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1HTlUgRW1hY3MgY29tZXMgd2l0aCBOTyBXQVJSQU5UWSwKLXRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdy4KLVlvdSBtYXkgcmVkaXN0cmlidXRlIGNvcGllcyBvZiBHTlUgRW1hY3MKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBtYXR0ZXJzLAotc2VlIHRoZSBmaWxlcyBuYW1lZCBDT1BZSU5HLgotQGVuZCBzbWFsbGV4YW1wbGUKLQotWW91IHNob3VsZCBhZGFwdCB0aGlzIHRvIHlvdXIgcHJvZ3JhbSwgb2YgY291cnNlLCBmaWxsaW5nIGluIHRoZSBwcm9wZXIKLXllYXIsIGNvcHlyaWdodCBob2xkZXIsIG5hbWUgb2YgcHJvZ3JhbSwgYW5kIHRoZSByZWZlcmVuY2VzIHRvCi1kaXN0cmlidXRpb24gdGVybXMsIGFuZCBjaGFuZ2luZyB0aGUgcmVzdCBvZiB0aGUgd29yZGluZyBhcyBuZWNlc3NhcnkuCi0KLVRoaXMgY29weXJpZ2h0IG5vdGljZSBvbmx5IG5lZWRzIHRvIG1lbnRpb24gdGhlIG1vc3QgcmVjZW50IHllYXIgaW4KLXdoaWNoIGNoYW5nZXMgd2VyZSBtYWRlLS0tdGhlcmUncyBubyBuZWVkIHRvIGxpc3QgdGhlIHllYXJzIGZvciBwcmV2aW91cwotdmVyc2lvbnMnIGNoYW5nZXMuICBZb3UgZG9uJ3QgaGF2ZSB0byBtZW50aW9uIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIGluCi10aGVzZSBub3RpY2VzLCBpZiB0aGF0IGlzIGluY29udmVuaWVudCwgc2luY2UgaXQgYXBwZWFyZWQgaW4gdGhlIGZpcnN0Ci1saW5lLgotCi1AaXRlbSAtLWhlbHAKLVRoaXMgb3B0aW9uIHNob3VsZCBvdXRwdXQgYnJpZWYgZG9jdW1lbnRhdGlvbiBmb3IgaG93IHRvIGludm9rZSB0aGUKLXByb2dyYW0sIG9uIHN0YW5kYXJkIG91dHB1dCwgdGhlbiBleGl0IHN1Y2Nlc3NmdWxseS4gIE90aGVyIG9wdGlvbnMgYW5kCi1hcmd1bWVudHMgc2hvdWxkIGJlIGlnbm9yZWQgb25jZSB0aGlzIGlzIHNlZW4sIGFuZCB0aGUgcHJvZ3JhbSBzaG91bGQKLW5vdCBwZXJmb3JtIGl0cyBub3JtYWwgZnVuY3Rpb24uCi0KLU5lYXIgdGhlIGVuZCBvZiB0aGUgQHNhbXB7LS1oZWxwfSBvcHRpb24ncyBvdXRwdXQgdGhlcmUgc2hvdWxkIGJlIGEgbGluZQotdGhhdCBzYXlzIHdoZXJlIHRvIG1haWwgYnVnIHJlcG9ydHMuICBJdCBzaG91bGQgaGF2ZSB0aGlzIGZvcm1hdDoKLQotQGV4YW1wbGUKLVJlcG9ydCBidWdzIHRvIEB2YXJ7bWFpbGluZy1hZGRyZXNzfS4KLUBlbmQgZXhhbXBsZQotQGVuZCB0YWJsZQotCi1Abm9kZSBPcHRpb24gVGFibGUKLUBzZWN0aW9uIFRhYmxlIG9mIExvbmcgT3B0aW9ucwotCi1IZXJlIGlzIGEgdGFibGUgb2YgbG9uZyBvcHRpb25zIHVzZWQgYnkgR05VIHByb2dyYW1zLiAgSXQgaXMgc3VyZWx5Ci1pbmNvbXBsZXRlLCBidXQgd2UgYWltIHRvIGxpc3QgYWxsIHRoZSBvcHRpb25zIHRoYXQgYSBuZXcgcHJvZ3JhbSBtaWdodAotd2FudCB0byBiZSBjb21wYXRpYmxlIHdpdGguICBJZiB5b3UgdXNlIG5hbWVzIG5vdCBhbHJlYWR5IGluIHRoZSB0YWJsZSwKLXBsZWFzZSBzZW5kIEBlbWFpbHtnbnVAQGdudS5vcmd9IGEgbGlzdCBvZiB0aGVtLCB3aXRoIHRoZWlyCi1tZWFuaW5ncywgc28gd2UgY2FuIHVwZGF0ZSB0aGUgdGFibGUuCi0KLUBjIFBsZWFzZSBsZWF2ZSBuZXdsaW5lcyBiZXR3ZWVuIGl0ZW1zIGluIHRoaXMgdGFibGU7IGl0J3MgbXVjaCBlYXNpZXIKLUBjIHRvIHVwZGF0ZSB3aGVuIGl0IGlzbid0IGNvbXBsZXRlbHkgc3F1YXNoZWQgdG9nZXRoZXIgYW5kIHVucmVhZGFibGUuCi1AYyBXaGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc2hvcnQgb3B0aW9uIGZvciBhIGxvbmcgb3B0aW9uIG5hbWUsIHB1dAotQGMgYSBzZW1pY29sb24gYmV0d2VlbiB0aGUgbGlzdHMgb2YgdGhlIHByb2dyYW1zIHRoYXQgdXNlIHRoZW0sIG5vdCBhCi1AYyBwZXJpb2QuICAgLS1mcmllZG1hbgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGFmdGVyLWRhdGUKLUBzYW1wey1OfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBhbGwKLUBzYW1wey1hfSBpbiBAY29kZXtkdX0sIEBjb2Rle2xzfSwgQGNvZGV7bm19LCBAY29kZXtzdHR5fSwgQGNvZGV7dW5hbWV9LAotYW5kIEBjb2Rle3VuZXhwYW5kfS4KLQotQGl0ZW0gYWxsLXRleHQKLUBzYW1wey1hfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gYWxtb3N0LWFsbAotQHNhbXB7LUF9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gYXBwZW5kCi1Ac2FtcHstYX0gaW4gQGNvZGV7ZXRhZ3N9LCBAY29kZXt0ZWV9LCBAY29kZXt0aW1lfTsKLUBzYW1wey1yfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBhcmNoaXZlCi1Ac2FtcHstYX0gaW4gQGNvZGV7Y3B9LgotCi1AaXRlbSBhcmNoaXZlLW5hbWUKLUBzYW1wey1ufSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gYXJnbGVuZ3RoCi1Ac2FtcHstbH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBhc2NpaQotQHNhbXB7LWF9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBhc3NpZ24KLUBzYW1wey12fSBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gYXNzdW1lLW5ldwotQHNhbXB7LVd9IGluIE1ha2UuCi0KLUBpdGVtIGFzc3VtZS1vbGQKLUBzYW1wey1vfSBpbiBNYWtlLgotCi1AaXRlbSBhdXRvLWNoZWNrCi1Ac2FtcHstYX0gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gYXV0by1wYWdlcgotQHNhbXB7LWF9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gYXV0by1yZWZlcmVuY2UKLUBzYW1wey1BfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSBhdm9pZC13cmFwcwotQHNhbXB7LW59IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gYmFja3dhcmQtc2VhcmNoCi1Ac2FtcHstQn0gaW4gQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSBiYXNlbmFtZQotQHNhbXB7LWZ9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBiYXRjaAotVXNlZCBpbiBHREIuCi0KLUBpdGVtIGJhdWQKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBiZWZvcmUKLUBzYW1wey1ifSBpbiBAY29kZXt0YWN9LgotCi1AaXRlbSBiaW5hcnkKLUBzYW1wey1ifSBpbiBAY29kZXtjcGlvfSBhbmQgQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGJpdHMtcGVyLWNvZGUKLUBzYW1wey1ifSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gYmxvY2stc2l6ZQotVXNlZCBpbiBAY29kZXtjcGlvfSBhbmQgQGNvZGV7dGFyfS4KLQotQGl0ZW0gYmxvY2tzCi1Ac2FtcHstYn0gaW4gQGNvZGV7aGVhZH0gYW5kIEBjb2Rle3RhaWx9LgotCi1AaXRlbSBicmVhay1maWxlCi1Ac2FtcHstYn0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gYnJpZWYKLVVzZWQgaW4gdmFyaW91cyBwcm9ncmFtcyB0byBtYWtlIG91dHB1dCBzaG9ydGVyLgotCi1AaXRlbSBieXRlcwotQHNhbXB7LWN9IGluIEBjb2Rle2hlYWR9LCBAY29kZXtzcGxpdH0sIGFuZCBAY29kZXt0YWlsfS4KLQotQGl0ZW0gY0B0eysrfQotQHNhbXB7LUN9IGluIEBjb2Rle2V0YWdzfS4KLQotQGl0ZW0gY2F0ZW5hdGUKLUBzYW1wey1BfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBjZAotVXNlZCBpbiB2YXJpb3VzIHByb2dyYW1zIHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB0byB1c2UuCi0KLUBpdGVtIGNoYW5nZXMKLUBzYW1wey1jfSBpbiBAY29kZXtjaGdycH0gYW5kIEBjb2Rle2Nob3dufS4KLQotQGl0ZW0gY2xhc3NpZnkKLUBzYW1wey1GfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGNvbG9ucwotQHNhbXB7LWN9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIGNvbW1hbmQKLUBzYW1wey1jfSBpbiBAY29kZXtzdX07Ci1Ac2FtcHsteH0gaW4gR0RCLgotCi1AaXRlbSBjb21wYXJlCi1Ac2FtcHstZH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gY29tcGF0Ci1Vc2VkIGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBjb21wcmVzcwotQHNhbXB7LVp9IGluIEBjb2Rle3Rhcn0gYW5kIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBjb25jYXRlbmF0ZQotQHNhbXB7LUF9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGNvbmZpcm1hdGlvbgotQHNhbXB7LXd9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGNvbnRleHQKLVVzZWQgaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGNvcHlsZWZ0Ci1Ac2FtcHstVyBjb3B5bGVmdH0gaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIGNvcHlyaWdodAotQHNhbXB7LUN9IGluIEBjb2Rle3B0eH0sIEBjb2Rle3JlY29kZX0sIGFuZCBAY29kZXt3ZGlmZn07Ci1Ac2FtcHstVyBjb3B5cmlnaHR9IGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBjb3JlCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gY291bnQKLUBzYW1wey1xfSBpbiBAY29kZXt3aG99LgotCi1AaXRlbSBjb3VudC1saW5rcwotQHNhbXB7LWx9IGluIEBjb2Rle2R1fS4KLQotQGl0ZW0gY3JlYXRlCi1Vc2VkIGluIEBjb2Rle3Rhcn0gYW5kIEBjb2Rle2NwaW99LgotCi1AaXRlbSBjdXQtbWFyawotQHNhbXB7LWN9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBjeHJlZgotQHNhbXB7LXh9IGluIEBjb2Rle2N0YWdzfS4KLQotQGl0ZW0gZGF0ZQotQHNhbXB7LWR9IGluIEBjb2Rle3RvdWNofS4KLQotQGl0ZW0gZGVidWcKLUBzYW1wey1kfSBpbiBNYWtlIGFuZCBAY29kZXttNH07Ci1Ac2FtcHstdH0gaW4gQmlzb24uCi0KLUBpdGVtIGRlZmluZQotQHNhbXB7LUR9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gZGVmaW5lcwotQHNhbXB7LWR9IGluIEJpc29uIGFuZCBAY29kZXtjdGFnc30uCi0KLUBpdGVtIGRlbGV0ZQotQHNhbXB7LUR9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGRlcmVmZXJlbmNlCi1Ac2FtcHstTH0gaW4gQGNvZGV7Y2hncnB9LCBAY29kZXtjaG93bn0sIEBjb2Rle2NwaW99LCBAY29kZXtkdX0sCi1AY29kZXtsc30sIGFuZCBAY29kZXt0YXJ9LgotCi1AaXRlbSBkZXJlZmVyZW5jZS1hcmdzCi1Ac2FtcHstRH0gaW4gQGNvZGV7ZHV9LgotCi1AaXRlbSBkaWFjcml0aWNzCi1Ac2FtcHstZH0gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gZGljdGlvbmFyeS1vcmRlcgotQHNhbXB7LWR9IGluIEBjb2Rle2xvb2t9LgotCi1AaXRlbSBkaWZmCi1Ac2FtcHstZH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gZGlnaXRzCi1Ac2FtcHstbn0gaW4gQGNvZGV7Y3NwbGl0fS4KLQotQGl0ZW0gZGlyZWN0b3J5Ci1TcGVjaWZ5IHRoZSBkaXJlY3RvcnkgdG8gdXNlLCBpbiB2YXJpb3VzIHByb2dyYW1zLiAgSW4gQGNvZGV7bHN9LCBpdAotbWVhbnMgdG8gc2hvdyBkaXJlY3RvcmllcyB0aGVtc2VsdmVzIHJhdGhlciB0aGFuIHRoZWlyIGNvbnRlbnRzLiAgSW4KLUBjb2Rle3JtfSBhbmQgQGNvZGV7bG59LCBpdCBtZWFucyB0byBub3QgdHJlYXQgbGlua3MgdG8gZGlyZWN0b3JpZXMKLXNwZWNpYWxseS4KLQotQGl0ZW0gZGlzY2FyZC1hbGwKLUBzYW1wey14fSBpbiBAY29kZXtzdHJpcH0uCi0KLUBpdGVtIGRpc2NhcmQtbG9jYWxzCi1Ac2FtcHstWH0gaW4gQGNvZGV7c3RyaXB9LgotCi1AaXRlbSBkcnktcnVuCi1Ac2FtcHstbn0gaW4gTWFrZS4KLQotQGl0ZW0gZWQKLUBzYW1wey1lfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gZWxpZGUtZW1wdHktZmlsZXMKLUBzYW1wey16fSBpbiBAY29kZXtjc3BsaXR9LgotCi1AaXRlbSBlbmQtZGVsZXRlCi1Ac2FtcHsteH0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBlbmQtaW5zZXJ0Ci1Ac2FtcHsten0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBlbnRpcmUtbmV3LWZpbGUKLUBzYW1wey1OfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gZW52aXJvbm1lbnQtb3ZlcnJpZGVzCi1Ac2FtcHstZX0gaW4gTWFrZS4KLQotQGl0ZW0gZW9mCi1Ac2FtcHstZX0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSBlcG9jaAotVXNlZCBpbiBHREIuCi0KLUBpdGVtIGVycm9yLWxpbWl0Ci1Vc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KLQotQGl0ZW0gZXJyb3Itb3V0cHV0Ci1Ac2FtcHstb30gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBlc2NhcGUKLUBzYW1wey1ifSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGV4Y2x1ZGUtZnJvbQotQHNhbXB7LVh9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGV4ZWMKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBleGl0Ci1Ac2FtcHsteH0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSBleGl0LTAKLUBzYW1wey1lfSBpbiBAY29kZXt1bnNoYXJ9LgotCi1AaXRlbSBleHBhbmQtdGFicwotQHNhbXB7LXR9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBleHByZXNzaW9uCi1Ac2FtcHstZX0gaW4gQGNvZGV7c2VkfS4KLQotQGl0ZW0gZXh0ZXJuLW9ubHkKLUBzYW1wey1nfSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIGV4dHJhY3QKLUBzYW1wey1pfSBpbiBAY29kZXtjcGlvfTsKLUBzYW1wey14fSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBmYWNlcwotQHNhbXB7LWZ9IGluIEBjb2Rle2Zpbmdlcn0uCi0KLUBpdGVtIGZhc3QKLUBzYW1wey1mfSBpbiBAY29kZXtzdX0uCi0KLUBpdGVtIGZhdGFsLXdhcm5pbmdzCi1Ac2FtcHstRX0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBmaWxlCi1Ac2FtcHstZn0gaW4gQGNvZGV7aW5mb30sIEBjb2Rle2dhd2t9LCBNYWtlLCBAY29kZXttdH0sIGFuZCBAY29kZXt0YXJ9OwotQHNhbXB7LW59IGluIEBjb2Rle3NlZH07Ci1Ac2FtcHstcn0gaW4gQGNvZGV7dG91Y2h9LgotCi1AaXRlbSBmaWVsZC1zZXBhcmF0b3IKLUBzYW1wey1GfSBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gZmlsZS1wcmVmaXgKLUBzYW1wey1ifSBpbiBCaXNvbi4KLQotQGl0ZW0gZmlsZS10eXBlCi1Ac2FtcHstRn0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBmaWxlcy1mcm9tCi1Ac2FtcHstVH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gZmlsbC1jb2x1bW4KLVVzZWQgaW4gQGNvZGV7bWFrZWluZm99LgotCi1AaXRlbSBmbGFnLXRydW5jYXRpb24KLUBzYW1wey1GfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSBmaXhlZC1vdXRwdXQtZmlsZXMKLUBzYW1wey15fSBpbiBCaXNvbi4KLQotQGl0ZW0gZm9sbG93Ci1Ac2FtcHstZn0gaW4gQGNvZGV7dGFpbH0uCi0KLUBpdGVtIGZvb3Rub3RlLXN0eWxlCi1Vc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KLQotQGl0ZW0gZm9yY2UKLUBzYW1wey1mfSBpbiBAY29kZXtjcH0sIEBjb2Rle2xufSwgQGNvZGV7bXZ9LCBhbmQgQGNvZGV7cm19LgotCi1AaXRlbSBmb3JjZS1wcmVmaXgKLUBzYW1wey1GfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gZm9ybWF0Ci1Vc2VkIGluIEBjb2Rle2xzfSwgQGNvZGV7dGltZX0sIGFuZCBAY29kZXtwdHh9LgotCi1AaXRlbSBmcmVlemUtc3RhdGUKLUBzYW1wey1GfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIGZ1bGxuYW1lCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gZ2FwLXNpemUKLUBzYW1wey1nfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSBnZXQKLUBzYW1wey14fSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBncmFwaGljCi1Ac2FtcHstaX0gaW4gQGNvZGV7dWx9LgotCi1AaXRlbSBncmFwaGljcwotQHNhbXB7LWd9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIGdyb3VwCi1Ac2FtcHstZ30gaW4gQGNvZGV7aW5zdGFsbH0uCi0KLUBpdGVtIGd6aXAKLUBzYW1wey16fSBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtzaGFyfS4KLQotQGl0ZW0gaGFzaHNpemUKLUBzYW1wey1IfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIGhlYWRlcgotQHNhbXB7LWh9IGluIEBjb2Rle29iamR1bXB9IGFuZCBAY29kZXtyZWNvZGV9Ci0KLUBpdGVtIGhlYWRpbmcKLUBzYW1wey1IfSBpbiBAY29kZXt3aG99LgotCi1AaXRlbSBoZWxwCi1Vc2VkIHRvIGFzayBmb3IgYnJpZWYgdXNhZ2UgaW5mb3JtYXRpb24uCi0KLUBpdGVtIGhlcmUtZGVsaW1pdGVyCi1Ac2FtcHstZH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGhpZGUtY29udHJvbC1jaGFycwotQHNhbXB7LXF9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gaWRsZQotQHNhbXB7LXV9IGluIEBjb2Rle3dob30uCi0KLUBpdGVtIGlmZGVmCi1Ac2FtcHstRH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGlnbm9yZQotQHNhbXB7LUl9IGluIEBjb2Rle2xzfTsKLUBzYW1wey14fSBpbiBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSBpZ25vcmUtYWxsLXNwYWNlCi1Ac2FtcHstd30gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGlnbm9yZS1iYWNrdXBzCi1Ac2FtcHstQn0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBpZ25vcmUtYmxhbmstbGluZXMKLUBzYW1wey1CfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gaWdub3JlLWNhc2UKLUBzYW1wey1mfSBpbiBAY29kZXtsb29rfSBhbmQgQGNvZGV7cHR4fTsKLUBzYW1wey1pfSBpbiBAY29kZXtkaWZmfSBhbmQgQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBpZ25vcmUtZXJyb3JzCi1Ac2FtcHstaX0gaW4gTWFrZS4KLQotQGl0ZW0gaWdub3JlLWZpbGUKLUBzYW1wey1pfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSBpZ25vcmUtaW5kZW50YXRpb24KLUBzYW1wey1JfSBpbiBAY29kZXtldGFnc30uCi0KLUBpdGVtIGlnbm9yZS1pbml0LWZpbGUKLUBzYW1wey1mfSBpbiBPbGVvLgotCi1AaXRlbSBpZ25vcmUtaW50ZXJydXB0cwotQHNhbXB7LWl9IGluIEBjb2Rle3RlZX0uCi0KLUBpdGVtIGlnbm9yZS1tYXRjaGluZy1saW5lcwotQHNhbXB7LUl9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpZ25vcmUtc3BhY2UtY2hhbmdlCi1Ac2FtcHstYn0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGlnbm9yZS16ZXJvcwotQHNhbXB7LWl9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGluY2x1ZGUKLUBzYW1wey1pfSBpbiBAY29kZXtldGFnc307Ci1Ac2FtcHstSX0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBpbmNsdWRlLWRpcgotQHNhbXB7LUl9IGluIE1ha2UuCi0KLUBpdGVtIGluY3JlbWVudGFsCi1Ac2FtcHstR30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gaW5mbwotQHNhbXB7LWl9LCBAc2FtcHstbH0sIGFuZCBAc2FtcHstbX0gaW4gRmluZ2VyLgotCi1AaXRlbSBpbml0aWFsCi1Ac2FtcHstaX0gaW4gQGNvZGV7ZXhwYW5kfS4KLQotQGl0ZW0gaW5pdGlhbC10YWIKLUBzYW1wey1UfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gaW5vZGUKLUBzYW1wey1pfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGludGVyYWN0aXZlCi1Ac2FtcHstaX0gaW4gQGNvZGV7Y3B9LCBAY29kZXtsbn0sIEBjb2Rle212fSwgQGNvZGV7cm19OwotQHNhbXB7LWV9IGluIEBjb2Rle200fTsKLUBzYW1wey1wfSBpbiBAY29kZXt4YXJnc307Ci1Ac2FtcHstd30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gaW50ZXJtaXgtdHlwZQotQHNhbXB7LXB9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBqb2JzCi1Ac2FtcHstan0gaW4gTWFrZS4KLQotQGl0ZW0ganVzdC1wcmludAotQHNhbXB7LW59IGluIE1ha2UuCi0KLUBpdGVtIGtlZXAtZ29pbmcKLUBzYW1wey1rfSBpbiBNYWtlLgotCi1AaXRlbSBrZWVwLWZpbGVzCi1Ac2FtcHsta30gaW4gQGNvZGV7Y3NwbGl0fS4KLQotQGl0ZW0ga2lsb2J5dGVzCi1Ac2FtcHsta30gaW4gQGNvZGV7ZHV9IGFuZCBAY29kZXtsc30uCi0KLUBpdGVtIGxhbmd1YWdlCi1Ac2FtcHstbH0gaW4gQGNvZGV7ZXRhZ3N9LgotCi1AaXRlbSBsZXNzLW1vZGUKLUBzYW1wey1sfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIGxldmVsLWZvci1nemlwCi1Ac2FtcHstZ30gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGxpbmUtYnl0ZXMKLUBzYW1wey1DfSBpbiBAY29kZXtzcGxpdH0uCi0KLUBpdGVtIGxpbmVzCi1Vc2VkIGluIEBjb2Rle3NwbGl0fSwgQGNvZGV7aGVhZH0sIGFuZCBAY29kZXt0YWlsfS4KLQotQGl0ZW0gbGluawotQHNhbXB7LWx9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSBsaW50Ci1AaXRlbXggbGludC1vbGQKLVVzZWQgaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIGxpc3QKLUBzYW1wey10fSBpbiBAY29kZXtjcGlvfTsKLUBzYW1wey1sfSBpbiBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSBsaXN0Ci1Ac2FtcHstdH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gbGl0ZXJhbAotQHNhbXB7LU59IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gbG9hZC1hdmVyYWdlCi1Ac2FtcHstbH0gaW4gTWFrZS4KLQotQGl0ZW0gbG9naW4KLVVzZWQgaW4gQGNvZGV7c3V9LgotCi1AaXRlbSBtYWNoaW5lCi1ObyBsaXN0aW5nIG9mIHdoaWNoIHByb2dyYW1zIGFscmVhZHkgdXNlIHRoaXM7Ci1zb21lb25lIHNob3VsZCBjaGVjayB0bwotc2VlIGlmIGFueSBhY3R1YWxseSBkbywgYW5kIHRlbGwgQGVtYWlse2dudUBAZ251Lm9yZ30uCi0KLUBpdGVtIG1hY3JvLW5hbWUKLUBzYW1wey1NfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSBtYWlsCi1Ac2FtcHstbX0gaW4gQGNvZGV7aGVsbG99IGFuZCBAY29kZXt1bmFtZX0uCi0KLUBpdGVtIG1ha2UtZGlyZWN0b3JpZXMKLUBzYW1wey1kfSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gbWFrZWZpbGUKLUBzYW1wey1mfSBpbiBNYWtlLgotCi1AaXRlbSBtYXBwZWQKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBtYXgtYXJncwotQHNhbXB7LW59IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gbWF4LWNoYXJzCi1Ac2FtcHstbn0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSBtYXgtbGluZXMKLUBzYW1wey1sfSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIG1heC1sb2FkCi1Ac2FtcHstbH0gaW4gTWFrZS4KLQotQGl0ZW0gbWF4LXByb2NzCi1Ac2FtcHstUH0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSBtZXNnCi1Ac2FtcHstVH0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gbWVzc2FnZQotQHNhbXB7LVR9IGluIEBjb2Rle3dob30uCi0KLUBpdGVtIG1pbmltYWwKLUBzYW1wey1kfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gbWl4ZWQtdXVlbmNvZGUKLUBzYW1wey1NfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbW9kZQotQHNhbXB7LW19IGluIEBjb2Rle2luc3RhbGx9LCBAY29kZXtta2Rpcn0sIGFuZCBAY29kZXtta2ZpZm99LgotCi1AaXRlbSBtb2RpZmljYXRpb24tdGltZQotQHNhbXB7LW19IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIG11bHRpLXZvbHVtZQotQHNhbXB7LU19IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIG5hbWUtcHJlZml4Ci1Ac2FtcHstYX0gaW4gQmlzb24uCi0KLUBpdGVtIG5lc3RpbmctbGltaXQKLUBzYW1wey1MfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIG5ldC1oZWFkZXJzCi1Ac2FtcHstYX0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIG5ldy1maWxlCi1Ac2FtcHstV30gaW4gTWFrZS4KLQotQGl0ZW0gbm8tYnVpbHRpbi1ydWxlcwotQHNhbXB7LXJ9IGluIE1ha2UuCi0KLUBpdGVtIG5vLWNoYXJhY3Rlci1jb3VudAotQHNhbXB7LXd9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBuby1jaGVjay1leGlzdGluZwotQHNhbXB7LXh9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBuby1jb21tb24KLUBzYW1wey0zfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIG5vLWNyZWF0ZQotQHNhbXB7LWN9IGluIEBjb2Rle3RvdWNofS4KLQotQGl0ZW0gbm8tZGVmaW5lcwotQHNhbXB7LUR9IGluIEBjb2Rle2V0YWdzfS4KLQotQGl0ZW0gbm8tZGVsZXRlZAotQHNhbXB7LTF9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gbm8tZGVyZWZlcmVuY2UKLUBzYW1wey1kfSBpbiBAY29kZXtjcH0uCi0KLUBpdGVtIG5vLWluc2VydGVkCi1Ac2FtcHstMn0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBuby1rZWVwLWdvaW5nCi1Ac2FtcHstU30gaW4gTWFrZS4KLQotQGl0ZW0gbm8tbGluZXMKLUBzYW1wey1sfSBpbiBCaXNvbi4KLQotQGl0ZW0gbm8tcGlwaW5nCi1Ac2FtcHstUH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIG5vLXByb2YKLUBzYW1wey1lfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIG5vLXJlZ2V4Ci1Ac2FtcHstUn0gaW4gQGNvZGV7ZXRhZ3N9LgotCi1AaXRlbSBuby1zb3J0Ci1Ac2FtcHstcH0gaW4gQGNvZGV7bm19LgotCi1AaXRlbSBuby1zcGxpdAotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIG5vLXN0YXRpYwotQHNhbXB7LWF9IGluIEBjb2Rle2dwcm9mfS4KLQotQGl0ZW0gbm8tdGltZQotQHNhbXB7LUV9IGluIEBjb2Rle2dwcm9mfS4KLQotQGl0ZW0gbm8tdGltZXN0YW1wCi1Ac2FtcHstbX0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIG5vLXZhbGlkYXRlCi1Vc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KLQotQGl0ZW0gbm8td2FpdAotVXNlZCBpbiBAY29kZXtlbWFjc2NsaWVudH0uCi0KLUBpdGVtIG5vLXdhcm4KLVVzZWQgaW4gdmFyaW91cyBwcm9ncmFtcyB0byBpbmhpYml0IHdhcm5pbmdzLgotCi1AaXRlbSBub2RlCi1Ac2FtcHstbn0gaW4gQGNvZGV7aW5mb30uCi0KLUBpdGVtIG5vZGVuYW1lCi1Ac2FtcHstbn0gaW4gQGNvZGV7dW5hbWV9LgotCi1AaXRlbSBub25tYXRjaGluZwotQHNhbXB7LWZ9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSBuc3R1ZmYKLUBzYW1wey1ufSBpbiBAY29kZXtvYmpkdW1wfS4KLQotQGl0ZW0gbnVsbAotQHNhbXB7LTB9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gbnVtYmVyCi1Ac2FtcHstbn0gaW4gQGNvZGV7Y2F0fS4KLQotQGl0ZW0gbnVtYmVyLW5vbmJsYW5rCi1Ac2FtcHstYn0gaW4gQGNvZGV7Y2F0fS4KLQotQGl0ZW0gbnVtZXJpYy1zb3J0Ci1Ac2FtcHstbn0gaW4gQGNvZGV7bm19LgotCi1AaXRlbSBudW1lcmljLXVpZC1naWQKLUBzYW1wey1ufSBpbiBAY29kZXtjcGlvfSBhbmQgQGNvZGV7bHN9LgotCi1AaXRlbSBueAotVXNlZCBpbiBHREIuCi0KLUBpdGVtIG9sZC1hcmNoaXZlCi1Ac2FtcHstb30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gb2xkLWZpbGUKLUBzYW1wey1vfSBpbiBNYWtlLgotCi1AaXRlbSBvbmUtZmlsZS1zeXN0ZW0KLUBzYW1wey1sfSBpbiBAY29kZXt0YXJ9LCBAY29kZXtjcH0sIGFuZCBAY29kZXtkdX0uCi0KLUBpdGVtIG9ubHktZmlsZQotQHNhbXB7LW99IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIG9ubHktcHJvZgotQHNhbXB7LWZ9IGluIEBjb2Rle2dwcm9mfS4KLQotQGl0ZW0gb25seS10aW1lCi1Ac2FtcHstRn0gaW4gQGNvZGV7Z3Byb2Z9LgotCi1AaXRlbSBvdXRwdXQKLUluIHZhcmlvdXMgcHJvZ3JhbXMsIHNwZWNpZnkgdGhlIG91dHB1dCBmaWxlIG5hbWUuCi0KLUBpdGVtIG91dHB1dC1wcmVmaXgKLUBzYW1wey1vfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gb3ZlcnJpZGUKLUBzYW1wey1vfSBpbiBAY29kZXtybX0uCi0KLUBpdGVtIG92ZXJ3cml0ZQotQHNhbXB7LWN9IGluIEBjb2Rle3Vuc2hhcn0uCi0KLUBpdGVtIG93bmVyCi1Ac2FtcHstb30gaW4gQGNvZGV7aW5zdGFsbH0uCi0KLUBpdGVtIHBhZ2luYXRlCi1Ac2FtcHstbH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHBhcmFncmFwaC1pbmRlbnQKLVVzZWQgaW4gQGNvZGV7bWFrZWluZm99LgotCi1AaXRlbSBwYXJlbnRzCi1Ac2FtcHstcH0gaW4gQGNvZGV7bWtkaXJ9IGFuZCBAY29kZXtybWRpcn0uCi0KLUBpdGVtIHBhc3MtYWxsCi1Ac2FtcHstcH0gaW4gQGNvZGV7dWx9LgotCi1AaXRlbSBwYXNzLXRocm91Z2gKLUBzYW1wey1wfSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gcG9ydAotQHNhbXB7LVB9IGluIEBjb2Rle2Zpbmdlcn0uCi0KLUBpdGVtIHBvcnRhYmlsaXR5Ci1Ac2FtcHstY30gaW4gQGNvZGV7Y3Bpb30gYW5kIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHBvc2l4Ci1Vc2VkIGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBwcmVmaXgtYnVpbHRpbnMKLUBzYW1wey1QfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIHByZWZpeAotQHNhbXB7LWZ9IGluIEBjb2Rle2NzcGxpdH0uCi0KLUBpdGVtIHByZXNlcnZlCi1Vc2VkIGluIEBjb2Rle3Rhcn0gYW5kIEBjb2Rle2NwfS4KLQotQGl0ZW0gcHJlc2VydmUtZW52aXJvbm1lbnQKLUBzYW1wey1wfSBpbiBAY29kZXtzdX0uCi0KLUBpdGVtIHByZXNlcnZlLW1vZGlmaWNhdGlvbi10aW1lCi1Ac2FtcHstbX0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIHByZXNlcnZlLW9yZGVyCi1Ac2FtcHstc30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gcHJlc2VydmUtcGVybWlzc2lvbnMKLUBzYW1wey1wfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBwcmludAotQHNhbXB7LWx9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBwcmludC1jaGFycwotQHNhbXB7LUx9IGluIEBjb2Rle2NtcH0uCi0KLUBpdGVtIHByaW50LWRhdGEtYmFzZQotQHNhbXB7LXB9IGluIE1ha2UuCi0KLUBpdGVtIHByaW50LWRpcmVjdG9yeQotQHNhbXB7LXd9IGluIE1ha2UuCi0KLUBpdGVtIHByaW50LWZpbGUtbmFtZQotQHNhbXB7LW99IGluIEBjb2Rle25tfS4KLQotQGl0ZW0gcHJpbnQtc3ltZGVmcwotQHNhbXB7LXN9IGluIEBjb2Rle25tfS4KLQotQGl0ZW0gcHJpbnRlcgotQHNhbXB7LXB9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gcHJvbXB0Ci1Ac2FtcHstcH0gaW4gQGNvZGV7ZWR9LgotCi1AaXRlbSBxdWVyeS11c2VyCi1Ac2FtcHstWH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHF1ZXN0aW9uCi1Ac2FtcHstcX0gaW4gTWFrZS4KLQotQGl0ZW0gcXVpZXQKLVVzZWQgaW4gbWFueSBwcm9ncmFtcyB0byBpbmhpYml0IHRoZSB1c3VhbCBvdXRwdXQuICBAc3Ryb25ne05vdGU6fSBldmVyeQotcHJvZ3JhbSBhY2NlcHRpbmcgQHNhbXB7LS1xdWlldH0gc2hvdWxkIGFjY2VwdCBAc2FtcHstLXNpbGVudH0gYXMgYQotc3lub255bS4KLQotQGl0ZW0gcXVpZXQtdW5zaGFyCi1Ac2FtcHstUX0gaW4gQGNvZGV7c2hhcn0KLQotQGl0ZW0gcXVvdGUtbmFtZQotQHNhbXB7LVF9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gcmNzCi1Ac2FtcHstbn0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHJlLWludGVydmFsCi1Vc2VkIGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSByZWFkLWZ1bGwtYmxvY2tzCi1Ac2FtcHstQn0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gcmVhZG5vdwotVXNlZCBpbiBHREIuCi0KLUBpdGVtIHJlY29uCi1Ac2FtcHstbn0gaW4gTWFrZS4KLQotQGl0ZW0gcmVjb3JkLW51bWJlcgotQHNhbXB7LVJ9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHJlY3Vyc2l2ZQotVXNlZCBpbiBAY29kZXtjaGdycH0sIEBjb2Rle2Nob3dufSwgQGNvZGV7Y3B9LCBAY29kZXtsc30sIEBjb2Rle2RpZmZ9LAotYW5kIEBjb2Rle3JtfS4KLQotQGl0ZW0gcmVmZXJlbmNlLWxpbWl0Ci1Vc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KLQotQGl0ZW0gcmVmZXJlbmNlcwotQHNhbXB7LXJ9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIHJlZ2V4Ci1Ac2FtcHstcn0gaW4gQGNvZGV7dGFjfSBhbmQgQGNvZGV7ZXRhZ3N9LgotCi1AaXRlbSByZWxlYXNlCi1Ac2FtcHstcn0gaW4gQGNvZGV7dW5hbWV9LgotCi1AaXRlbSByZWxvYWQtc3RhdGUKLUBzYW1wey1SfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIHJlbG9jYXRpb24KLUBzYW1wey1yfSBpbiBAY29kZXtvYmpkdW1wfS4KLQotQGl0ZW0gcmVuYW1lCi1Ac2FtcHstcn0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIHJlcGxhY2UKLUBzYW1wey1pfSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIHJlcG9ydC1pZGVudGljYWwtZmlsZXMKLUBzYW1wey1zfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gcmVzZXQtYWNjZXNzLXRpbWUKLUBzYW1wey1hfSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gcmV2ZXJzZQotQHNhbXB7LXJ9IGluIEBjb2Rle2xzfSBhbmQgQGNvZGV7bm19LgotCi1AaXRlbSByZXZlcnNlZC1lZAotQHNhbXB7LWZ9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSByaWdodC1zaWRlLWRlZnMKLUBzYW1wey1SfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSBzYW1lLW9yZGVyCi1Ac2FtcHstc30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gc2FtZS1wZXJtaXNzaW9ucwotQHNhbXB7LXB9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHNhdmUKLUBzYW1wey1nfSBpbiBAY29kZXtzdHR5fS4KLQotQGl0ZW0gc2UKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBzZW50ZW5jZS1yZWdleHAKLUBzYW1wey1TfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSBzZXBhcmF0ZS1kaXJzCi1Ac2FtcHstU30gaW4gQGNvZGV7ZHV9LgotCi1AaXRlbSBzZXBhcmF0b3IKLUBzYW1wey1zfSBpbiBAY29kZXt0YWN9LgotCi1AaXRlbSBzZXF1ZW5jZQotVXNlZCBieSBAY29kZXtyZWNvZGV9IHRvIGNob3NlIGZpbGVzIG9yIHBpcGVzIGZvciBzZXF1ZW5jaW5nIHBhc3Nlcy4KLQotQGl0ZW0gc2hlbGwKLUBzYW1wey1zfSBpbiBAY29kZXtzdX0uCi0KLUBpdGVtIHNob3ctYWxsCi1Ac2FtcHstQX0gaW4gQGNvZGV7Y2F0fS4KLQotQGl0ZW0gc2hvdy1jLWZ1bmN0aW9uCi1Ac2FtcHstcH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHNob3ctZW5kcwotQHNhbXB7LUV9IGluIEBjb2Rle2NhdH0uCi0KLUBpdGVtIHNob3ctZnVuY3Rpb24tbGluZQotQHNhbXB7LUZ9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBzaG93LXRhYnMKLUBzYW1wey1UfSBpbiBAY29kZXtjYXR9LgotCi1AaXRlbSBzaWxlbnQKLVVzZWQgaW4gbWFueSBwcm9ncmFtcyB0byBpbmhpYml0IHRoZSB1c3VhbCBvdXRwdXQuCi1Ac3Ryb25ne05vdGU6fSBldmVyeSBwcm9ncmFtIGFjY2VwdGluZwotQHNhbXB7LS1zaWxlbnR9IHNob3VsZCBhY2NlcHQgQHNhbXB7LS1xdWlldH0gYXMgYSBzeW5vbnltLgotCi1AaXRlbSBzaXplCi1Ac2FtcHstc30gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBzb3J0Ci1Vc2VkIGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gc291cmNlCi1Ac2FtcHstVyBzb3VyY2V9IGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBzcGFyc2UKLUBzYW1wey1TfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBzcGVlZC1sYXJnZS1maWxlcwotQHNhbXB7LUh9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBzcGxpdC1hdAotQHNhbXB7LUV9IGluIEBjb2Rle3Vuc2hhcn0uCi0KLUBpdGVtIHNwbGl0LXNpemUtbGltaXQKLUBzYW1wey1MfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gc3F1ZWV6ZS1ibGFuawotQHNhbXB7LXN9IGluIEBjb2Rle2NhdH0uCi0KLUBpdGVtIHN0YXJ0LWRlbGV0ZQotQHNhbXB7LXd9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gc3RhcnQtaW5zZXJ0Ci1Ac2FtcHsteX0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBzdGFydGluZy1maWxlCi1Vc2VkIGluIEBjb2Rle3Rhcn0gYW5kIEBjb2Rle2RpZmZ9IHRvIHNwZWNpZnkgd2hpY2ggZmlsZSB3aXRoaW4KLWEgZGlyZWN0b3J5IHRvIHN0YXJ0IHByb2Nlc3Npbmcgd2l0aC4KLQotQGl0ZW0gc3RhdGlzdGljcwotQHNhbXB7LXN9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gc3RkaW4tZmlsZS1saXN0Ci1Ac2FtcHstU30gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHN0b3AKLUBzYW1wey1TfSBpbiBNYWtlLgotCi1AaXRlbSBzdHJpY3QKLUBzYW1wey1zfSBpbiBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSBzdHJpcAotQHNhbXB7LXN9IGluIEBjb2Rle2luc3RhbGx9LgotCi1AaXRlbSBzdHJpcC1hbGwKLUBzYW1wey1zfSBpbiBAY29kZXtzdHJpcH0uCi0KLUBpdGVtIHN0cmlwLWRlYnVnCi1Ac2FtcHstU30gaW4gQGNvZGV7c3RyaXB9LgotCi1AaXRlbSBzdWJtaXR0ZXIKLUBzYW1wey1zfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gc3VmZml4Ci1Ac2FtcHstU30gaW4gQGNvZGV7Y3B9LCBAY29kZXtsbn0sIEBjb2Rle212fS4KLQotQGl0ZW0gc3VmZml4LWZvcm1hdAotQHNhbXB7LWJ9IGluIEBjb2Rle2NzcGxpdH0uCi0KLUBpdGVtIHN1bQotQHNhbXB7LXN9IGluIEBjb2Rle2dwcm9mfS4KLQotQGl0ZW0gc3VtbWFyaXplCi1Ac2FtcHstc30gaW4gQGNvZGV7ZHV9LgotCi1AaXRlbSBzeW1ib2xpYwotQHNhbXB7LXN9IGluIEBjb2Rle2xufS4KLQotQGl0ZW0gc3ltYm9scwotVXNlZCBpbiBHREIgYW5kIEBjb2Rle29iamR1bXB9LgotCi1AaXRlbSBzeW5jbGluZXMKLUBzYW1wey1zfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIHN5c25hbWUKLUBzYW1wey1zfSBpbiBAY29kZXt1bmFtZX0uCi0KLUBpdGVtIHRhYnMKLUBzYW1wey10fSBpbiBAY29kZXtleHBhbmR9IGFuZCBAY29kZXt1bmV4cGFuZH0uCi0KLUBpdGVtIHRhYnNpemUKLUBzYW1wey1UfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIHRlcm1pbmFsCi1Ac2FtcHstVH0gaW4gQGNvZGV7dHB1dH0gYW5kIEBjb2Rle3VsfS4KLUBzYW1wey10fSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIHRleHQKLUBzYW1wey1hfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gdGV4dC1maWxlcwotQHNhbXB7LVR9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSB0aW1lCi1Vc2VkIGluIEBjb2Rle2xzfSBhbmQgQGNvZGV7dG91Y2h9LgotCi1AaXRlbSB0by1zdGRvdXQKLUBzYW1wey1PfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSB0b3RhbAotQHNhbXB7LWN9IGluIEBjb2Rle2R1fS4KLQotQGl0ZW0gdG91Y2gKLUBzYW1wey10fSBpbiBNYWtlLCBAY29kZXtyYW5saWJ9LCBhbmQgQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gdHJhY2UKLUBzYW1wey10fSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIHRyYWRpdGlvbmFsCi1Ac2FtcHstdH0gaW4gQGNvZGV7aGVsbG99OwotQHNhbXB7LVcgdHJhZGl0aW9uYWx9IGluIEBjb2Rle2dhd2t9OwotQHNhbXB7LUd9IGluIEBjb2Rle2VkfSwgQGNvZGV7bTR9LCBhbmQgQGNvZGV7cHR4fS4KLQotQGl0ZW0gdHR5Ci1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gdHlwZWRlZnMKLUBzYW1wey10fSBpbiBAY29kZXtjdGFnc30uCi0KLUBpdGVtIHR5cGVkZWZzLWFuZC1jKysKLUBzYW1wey1UfSBpbiBAY29kZXtjdGFnc30uCi0KLUBpdGVtIHR5cGVzZXQtbW9kZQotQHNhbXB7LXR9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIHVuY29tcHJlc3MKLUBzYW1wey16fSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSB1bmNvbmRpdGlvbmFsCi1Ac2FtcHstdX0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIHVuZGVmaW5lCi1Ac2FtcHstVX0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSB1bmRlZmluZWQtb25seQotQHNhbXB7LXV9IGluIEBjb2Rle25tfS4KLQotQGl0ZW0gdXBkYXRlCi1Ac2FtcHstdX0gaW4gQGNvZGV7Y3B9LCBAY29kZXtjdGFnc30sIEBjb2Rle212fSwgQGNvZGV7dGFyfS4KLQotQGl0ZW0gdXNhZ2UKLVVzZWQgaW4gQGNvZGV7Z2F3a307IHNhbWUgYXMgQHNhbXB7LS1oZWxwfS4KLQotQGl0ZW0gdXVlbmNvZGUKLUBzYW1wey1CfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gdmFuaWxsYS1vcGVyYXRpb24KLUBzYW1wey1WfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gdmVyYm9zZQotUHJpbnQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwcm9ncmVzcy4gIE1hbnkgcHJvZ3JhbXMgc3VwcG9ydCB0aGlzLgotCi1AaXRlbSB2ZXJpZnkKLUBzYW1wey1XfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSB2ZXJzaW9uCi1QcmludCB0aGUgdmVyc2lvbiBudW1iZXIuCi0KLUBpdGVtIHZlcnNpb24tY29udHJvbAotQHNhbXB7LVZ9IGluIEBjb2Rle2NwfSwgQGNvZGV7bG59LCBAY29kZXttdn0uCi0KLUBpdGVtIHZncmluZAotQHNhbXB7LXZ9IGluIEBjb2Rle2N0YWdzfS4KLQotQGl0ZW0gdm9sdW1lCi1Ac2FtcHstVn0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gd2hhdC1pZgotQHNhbXB7LVd9IGluIE1ha2UuCi0KLUBpdGVtIHdob2xlLXNpemUtbGltaXQKLUBzYW1wey1sfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gd2lkdGgKLUBzYW1wey13fSBpbiBAY29kZXtsc30gYW5kIEBjb2Rle3B0eH0uCi0KLUBpdGVtIHdvcmQtcmVnZXhwCi1Ac2FtcHstV30gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gd3JpdGFibGUKLUBzYW1wey1UfSBpbiBAY29kZXt3aG99LgotCi1AaXRlbSB6ZXJvcwotQHNhbXB7LXp9IGluIEBjb2Rle2dwcm9mfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgTWVtb3J5IFVzYWdlCi1Ac2VjdGlvbiBNZW1vcnkgVXNhZ2UKLQotSWYgaXQgdHlwaWNhbGx5IHVzZXMganVzdCBhIGZldyBtZWcgb2YgbWVtb3J5LCBkb24ndCBib3RoZXIgbWFraW5nIGFueQotZWZmb3J0IHRvIHJlZHVjZSBtZW1vcnkgdXNhZ2UuICBGb3IgZXhhbXBsZSwgaWYgaXQgaXMgaW1wcmFjdGljYWwgZm9yCi1vdGhlciByZWFzb25zIHRvIG9wZXJhdGUgb24gZmlsZXMgbW9yZSB0aGFuIGEgZmV3IG1lZyBsb25nLCBpdCBpcwotcmVhc29uYWJsZSB0byByZWFkIGVudGlyZSBpbnB1dCBmaWxlcyBpbnRvIGNvcmUgdG8gb3BlcmF0ZSBvbiB0aGVtLgotCi1Ib3dldmVyLCBmb3IgcHJvZ3JhbXMgc3VjaCBhcyBAY29kZXtjYXR9IG9yIEBjb2Rle3RhaWx9LCB0aGF0IGNhbgotdXNlZnVsbHkgb3BlcmF0ZSBvbiB2ZXJ5IGxhcmdlIGZpbGVzLCBpdCBpcyBpbXBvcnRhbnQgdG8gYXZvaWQgdXNpbmcgYQotdGVjaG5pcXVlIHRoYXQgd291bGQgYXJ0aWZpY2lhbGx5IGxpbWl0IHRoZSBzaXplIG9mIGZpbGVzIGl0IGNhbiBoYW5kbGUuCi1JZiBhIHByb2dyYW0gd29ya3MgYnkgbGluZXMgYW5kIGNvdWxkIGJlIGFwcGxpZWQgdG8gYXJiaXRyYXJ5Ci11c2VyLXN1cHBsaWVkIGlucHV0IGZpbGVzLCBpdCBzaG91bGQga2VlcCBvbmx5IGEgbGluZSBpbiBtZW1vcnksIGJlY2F1c2UKLXRoaXMgaXMgbm90IHZlcnkgaGFyZCBhbmQgdXNlcnMgd2lsbCB3YW50IHRvIGJlIGFibGUgdG8gb3BlcmF0ZSBvbiBpbnB1dAotZmlsZXMgdGhhdCBhcmUgYmlnZ2VyIHRoYW4gd2lsbCBmaXQgaW4gY29yZSBhbGwgYXQgb25jZS4KLQotSWYgeW91ciBwcm9ncmFtIGNyZWF0ZXMgY29tcGxpY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzLCBqdXN0IG1ha2UgdGhlbSBpbgotY29yZSBhbmQgZ2l2ZSBhIGZhdGFsIGVycm9yIGlmIEBjb2Rle21hbGxvY30gcmV0dXJucyB6ZXJvLgotCi1Abm9kZSBXcml0aW5nIEMKLUBjaGFwdGVyIE1ha2luZyBUaGUgQmVzdCBVc2Ugb2YgQwotCi1UaGlzIEB2YWx1ZXtDSEFQVEVSfSBwcm92aWRlcyBhZHZpY2Ugb24gaG93IGJlc3QgdG8gdXNlIHRoZSBDIGxhbmd1YWdlCi13aGVuIHdyaXRpbmcgR05VIHNvZnR3YXJlLgotCi1AbWVudQotKiBGb3JtYXR0aW5nOjogICAgICAgICAgICAgICAgICBGb3JtYXR0aW5nIFlvdXIgU291cmNlIENvZGUKLSogQ29tbWVudHM6OiAgICAgICAgICAgICAgICAgICAgQ29tbWVudGluZyBZb3VyIFdvcmsKLSogU3ludGFjdGljIENvbnZlbnRpb25zOjogICAgICAgQ2xlYW4gVXNlIG9mIEMgQ29uc3RydWN0cwotKiBOYW1lczo6ICAgICAgICAgICAgICAgICAgICAgICBOYW1pbmcgVmFyaWFibGVzIGFuZCBGdW5jdGlvbnMKLSogU3lzdGVtIFBvcnRhYmlsaXR5OjogICAgICAgICAgUG9ydGFiaWxpdHkgYmV0d2VlbiBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXMKLSogQ1BVIFBvcnRhYmlsaXR5OjogICAgICAgICAgICAgU3VwcG9ydGluZyB0aGUgcmFuZ2Ugb2YgQ1BVIHR5cGVzCi0qIFN5c3RlbSBGdW5jdGlvbnM6OiAgICAgICAgICAgIFBvcnRhYmlsaXR5IGFuZCBgYHN0YW5kYXJkJycgbGlicmFyeSBmdW5jdGlvbnMKLSogSW50ZXJuYXRpb25hbGl6YXRpb246OiAgICAgICAgVGVjaG5pcXVlcyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24KLSogTW1hcDo6ICAgICAgICAgICAgICAgICAgICAgICAgSG93IHlvdSBjYW4gc2FmZWx5IHVzZSBAY29kZXttbWFwfS4KLUBlbmQgbWVudQotCi1Abm9kZSBGb3JtYXR0aW5nCi1Ac2VjdGlvbiBGb3JtYXR0aW5nIFlvdXIgU291cmNlIENvZGUKLQotSXQgaXMgaW1wb3J0YW50IHRvIHB1dCB0aGUgb3Blbi1icmFjZSB0aGF0IHN0YXJ0cyB0aGUgYm9keSBvZiBhIEMKLWZ1bmN0aW9uIGluIGNvbHVtbiB6ZXJvLCBhbmQgYXZvaWQgcHV0dGluZyBhbnkgb3RoZXIgb3Blbi1icmFjZSBvcgotb3Blbi1wYXJlbnRoZXNpcyBvciBvcGVuLWJyYWNrZXQgaW4gY29sdW1uIHplcm8uICBTZXZlcmFsIHRvb2xzIGxvb2sKLWZvciBvcGVuLWJyYWNlcyBpbiBjb2x1bW4gemVybyB0byBmaW5kIHRoZSBiZWdpbm5pbmdzIG9mIEMgZnVuY3Rpb25zLgotVGhlc2UgdG9vbHMgd2lsbCBub3Qgd29yayBvbiBjb2RlIG5vdCBmb3JtYXR0ZWQgdGhhdCB3YXkuCi0KLUl0IGlzIGFsc28gaW1wb3J0YW50IGZvciBmdW5jdGlvbiBkZWZpbml0aW9ucyB0byBzdGFydCB0aGUgbmFtZSBvZiB0aGUKLWZ1bmN0aW9uIGluIGNvbHVtbiB6ZXJvLiAgVGhpcyBoZWxwcyBwZW9wbGUgdG8gc2VhcmNoIGZvciBmdW5jdGlvbgotZGVmaW5pdGlvbnMsIGFuZCBtYXkgYWxzbyBoZWxwIGNlcnRhaW4gdG9vbHMgcmVjb2duaXplIHRoZW0uICBUaHVzLAotdGhlIHByb3BlciBmb3JtYXQgaXMgdGhpczoKLQotQGV4YW1wbGUKLXN0YXRpYyBjaGFyICoKLWNvbmNhdCAoczEsIHMyKSAgICAgICAgLyogTmFtZSBzdGFydHMgaW4gY29sdW1uIHplcm8gaGVyZSAqLwotICAgICBjaGFyICpzMSwgKnMyOwotQHsgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuIGJyYWNlIGluIGNvbHVtbiB6ZXJvIGhlcmUgKi8KLSAgQGRvdHN7fQotQH0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLW9yLCBpZiB5b3Ugd2FudCB0byB1c2UgQHNje2Fuc2l9IEMsIGZvcm1hdCB0aGUgZGVmaW5pdGlvbiBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1zdGF0aWMgY2hhciAqCi1jb25jYXQgKGNoYXIgKnMxLCBjaGFyICpzMikKLUB7Ci0gIEBkb3Rze30KLUB9Ci1AZW5kIGV4YW1wbGUKLQotSW4gQHNje2Fuc2l9IEMsIGlmIHRoZSBhcmd1bWVudHMgZG9uJ3QgZml0IG5pY2VseSBvbiBvbmUgbGluZSwKLXNwbGl0IGl0IGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWludAotbG90c19vZl9hcmdzIChpbnQgYW5faW50ZWdlciwgbG9uZyBhX2xvbmcsIHNob3J0IGFfc2hvcnQsCi0gICAgICAgICAgICAgIGRvdWJsZSBhX2RvdWJsZSwgZmxvYXQgYV9mbG9hdCkKLUBkb3Rze30KLUBlbmQgZXhhbXBsZQotCi1Gb3IgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLCB3ZSBwcmVmZXIgY29kZSBmb3JtYXR0ZWQgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotaWYgKHggPCBmb28gKHksIHopKQotICBoYWhhID0gYmFyWzRdICsgNTsKLWVsc2UKLSAgQHsKLSAgICB3aGlsZSAoeikKLSAgICAgIEB7Ci0gICAgICAgIGhhaGEgKz0gZm9vICh6LCB6KTsKLSAgICAgICAgei0tOwotICAgICAgQH0KLSAgICByZXR1cm4gKyt4ICsgYmFyICgpOwotICBAfQotQGVuZCBleGFtcGxlCi0KLVdlIGZpbmQgaXQgZWFzaWVyIHRvIHJlYWQgYSBwcm9ncmFtIHdoZW4gaXQgaGFzIHNwYWNlcyBiZWZvcmUgdGhlCi1vcGVuLXBhcmVudGhlc2VzIGFuZCBhZnRlciB0aGUgY29tbWFzLiAgRXNwZWNpYWxseSBhZnRlciB0aGUgY29tbWFzLgotCi1XaGVuIHlvdSBzcGxpdCBhbiBleHByZXNzaW9uIGludG8gbXVsdGlwbGUgbGluZXMsIHNwbGl0IGl0Ci1iZWZvcmUgYW4gb3BlcmF0b3IsIG5vdCBhZnRlciBvbmUuICBIZXJlIGlzIHRoZSByaWdodCB3YXk6Ci0KLUBleGFtcGxlCi1pZiAoZm9vX3RoaXNfaXNfbG9uZyAmJiBiYXIgPiB3aW4gKHgsIHksIHopCi0gICAgJiYgcmVtYWluaW5nX2NvbmRpdGlvbikKLUBlbmQgZXhhbXBsZQotCi1UcnkgdG8gYXZvaWQgaGF2aW5nIHR3byBvcGVyYXRvcnMgb2YgZGlmZmVyZW50IHByZWNlZGVuY2UgYXQgdGhlIHNhbWUKLWxldmVsIG9mIGluZGVudGF0aW9uLiAgRm9yIGV4YW1wbGUsIGRvbid0IHdyaXRlIHRoaXM6Ci0KLUBleGFtcGxlCi1tb2RlID0gKGlubW9kZVtqXSA9PSBWT0lEbW9kZQotICAgICAgICB8fCBHRVRfTU9ERV9TSVpFIChvdXRtb2RlW2pdKSA+IEdFVF9NT0RFX1NJWkUgKGlubW9kZVtqXSkKLSAgICAgICAgPyBvdXRtb2RlW2pdIDogaW5tb2RlW2pdKTsKLUBlbmQgZXhhbXBsZQotCi1JbnN0ZWFkLCB1c2UgZXh0cmEgcGFyZW50aGVzZXMgc28gdGhhdCB0aGUgaW5kZW50YXRpb24gc2hvd3MgdGhlIG5lc3Rpbmc6Ci0KLUBleGFtcGxlCi1tb2RlID0gKChpbm1vZGVbal0gPT0gVk9JRG1vZGUKLSAgICAgICAgIHx8IChHRVRfTU9ERV9TSVpFIChvdXRtb2RlW2pdKSA+IEdFVF9NT0RFX1NJWkUgKGlubW9kZVtqXSkpKQotICAgICAgICA/IG91dG1vZGVbal0gOiBpbm1vZGVbal0pOwotQGVuZCBleGFtcGxlCi0KLUluc2VydCBleHRyYSBwYXJlbnRoZXNlcyBzbyB0aGF0IEVtYWNzIHdpbGwgaW5kZW50IHRoZSBjb2RlIHByb3Blcmx5LgotRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgaW5kZW50YXRpb24gbG9va3MgbmljZSBpZiB5b3UgZG8gaXQgYnkgaGFuZCwKLWJ1dCBFbWFjcyB3b3VsZCBtZXNzIGl0IHVwOgotCi1AZXhhbXBsZQotdiA9IHJ1cC0+cnVfdXRpbWUudHZfc2VjKjEwMDAgKyBydXAtPnJ1X3V0aW1lLnR2X3VzZWMvMTAwMAotICAgICsgcnVwLT5ydV9zdGltZS50dl9zZWMqMTAwMCArIHJ1cC0+cnVfc3RpbWUudHZfdXNlYy8xMDAwOwotQGVuZCBleGFtcGxlCi0KLUJ1dCBhZGRpbmcgYSBzZXQgb2YgcGFyZW50aGVzZXMgc29sdmVzIHRoZSBwcm9ibGVtOgotCi1AZXhhbXBsZQotdiA9IChydXAtPnJ1X3V0aW1lLnR2X3NlYyoxMDAwICsgcnVwLT5ydV91dGltZS50dl91c2VjLzEwMDAKLSAgICAgKyBydXAtPnJ1X3N0aW1lLnR2X3NlYyoxMDAwICsgcnVwLT5ydV9zdGltZS50dl91c2VjLzEwMDApOwotQGVuZCBleGFtcGxlCi0KLUZvcm1hdCBkby13aGlsZSBzdGF0ZW1lbnRzIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWRvCi0gIEB7Ci0gICAgYSA9IGZvbyAoYSk7Ci0gIEB9Ci13aGlsZSAoYSA+IDApOwotQGVuZCBleGFtcGxlCi0KLVBsZWFzZSB1c2UgZm9ybWZlZWQgY2hhcmFjdGVycyAoY29udHJvbC1MKSB0byBkaXZpZGUgdGhlIHByb2dyYW0gaW50bwotcGFnZXMgYXQgbG9naWNhbCBwbGFjZXMgKGJ1dCBub3Qgd2l0aGluIGEgZnVuY3Rpb24pLiAgSXQgZG9lcyBub3QgbWF0dGVyCi1qdXN0IGhvdyBsb25nIHRoZSBwYWdlcyBhcmUsIHNpbmNlIHRoZXkgZG8gbm90IGhhdmUgdG8gZml0IG9uIGEgcHJpbnRlZAotcGFnZS4gIFRoZSBmb3JtZmVlZHMgc2hvdWxkIGFwcGVhciBhbG9uZSBvbiBsaW5lcyBieSB0aGVtc2VsdmVzLgotCi0KLUBub2RlIENvbW1lbnRzCi1Ac2VjdGlvbiBDb21tZW50aW5nIFlvdXIgV29yawotCi1FdmVyeSBwcm9ncmFtIHNob3VsZCBzdGFydCB3aXRoIGEgY29tbWVudCBzYXlpbmcgYnJpZWZseSB3aGF0IGl0IGlzIGZvci4KLUV4YW1wbGU6IEBzYW1we2ZtdCAtIGZpbHRlciBmb3Igc2ltcGxlIGZpbGxpbmcgb2YgdGV4dH0uCi0KLVBsZWFzZSB3cml0ZSB0aGUgY29tbWVudHMgaW4gYSBHTlUgcHJvZ3JhbSBpbiBFbmdsaXNoLCBiZWNhdXNlIEVuZ2xpc2gKLWlzIHRoZSBvbmUgbGFuZ3VhZ2UgdGhhdCBuZWFybHkgYWxsIHByb2dyYW1tZXJzIGluIGFsbCBjb3VudHJpZXMgY2FuCi1yZWFkLiAgSWYgeW91IGRvIG5vdCB3cml0ZSBFbmdsaXNoIHdlbGwsIHBsZWFzZSB3cml0ZSBjb21tZW50cyBpbgotRW5nbGlzaCBhcyB3ZWxsIGFzIHlvdSBjYW4sIHRoZW4gYXNrIG90aGVyIHBlb3BsZSB0byBoZWxwIHJld3JpdGUgdGhlbS4KLUlmIHlvdSBjYW4ndCB3cml0ZSBjb21tZW50cyBpbiBFbmdsaXNoLCBwbGVhc2UgZmluZCBzb21lb25lIHRvIHdvcmsgd2l0aAoteW91IGFuZCB0cmFuc2xhdGUgeW91ciBjb21tZW50cyBpbnRvIEVuZ2xpc2guCi0KLVBsZWFzZSBwdXQgYSBjb21tZW50IG9uIGVhY2ggZnVuY3Rpb24gc2F5aW5nIHdoYXQgdGhlIGZ1bmN0aW9uIGRvZXMsCi13aGF0IHNvcnRzIG9mIGFyZ3VtZW50cyBpdCBnZXRzLCBhbmQgd2hhdCB0aGUgcG9zc2libGUgdmFsdWVzIG9mCi1hcmd1bWVudHMgbWVhbiBhbmQgYXJlIHVzZWQgZm9yLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkdXBsaWNhdGUgaW4KLXdvcmRzIHRoZSBtZWFuaW5nIG9mIHRoZSBDIGFyZ3VtZW50IGRlY2xhcmF0aW9ucywgaWYgYSBDIHR5cGUgaXMgYmVpbmcKLXVzZWQgaW4gaXRzIGN1c3RvbWFyeSBmYXNoaW9uLiAgSWYgdGhlcmUgaXMgYW55dGhpbmcgbm9uc3RhbmRhcmQgYWJvdXQKLWl0cyB1c2UgKHN1Y2ggYXMgYW4gYXJndW1lbnQgb2YgdHlwZSBAY29kZXtjaGFyICp9IHdoaWNoIGlzIHJlYWxseSB0aGUKLWFkZHJlc3Mgb2YgdGhlIHNlY29uZCBjaGFyYWN0ZXIgb2YgYSBzdHJpbmcsIG5vdCB0aGUgZmlyc3QpLCBvciBhbnkKLXBvc3NpYmxlIHZhbHVlcyB0aGF0IHdvdWxkIG5vdCB3b3JrIHRoZSB3YXkgb25lIHdvdWxkIGV4cGVjdCAoc3VjaCBhcywKLXRoYXQgc3RyaW5ncyBjb250YWluaW5nIG5ld2xpbmVzIGFyZSBub3QgZ3VhcmFudGVlZCB0byB3b3JrKSwgYmUgc3VyZQotdG8gc2F5IHNvLgotCi1BbHNvIGV4cGxhaW4gdGhlIHNpZ25pZmljYW5jZSBvZiB0aGUgcmV0dXJuIHZhbHVlLCBpZiB0aGVyZSBpcyBvbmUuCi0KLVBsZWFzZSBwdXQgdHdvIHNwYWNlcyBhZnRlciB0aGUgZW5kIG9mIGEgc2VudGVuY2UgaW4geW91ciBjb21tZW50cywgc28KLXRoYXQgdGhlIEVtYWNzIHNlbnRlbmNlIGNvbW1hbmRzIHdpbGwgd29yay4gIEFsc28sIHBsZWFzZSB3cml0ZQotY29tcGxldGUgc2VudGVuY2VzIGFuZCBjYXBpdGFsaXplIHRoZSBmaXJzdCB3b3JkLiAgSWYgYSBsb3dlci1jYXNlCi1pZGVudGlmaWVyIGNvbWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBzZW50ZW5jZSwgZG9uJ3QgY2FwaXRhbGl6ZSBpdCEKLUNoYW5naW5nIHRoZSBzcGVsbGluZyBtYWtlcyBpdCBhIGRpZmZlcmVudCBpZGVudGlmaWVyLiAgSWYgeW91IGRvbid0Ci1saWtlIHN0YXJ0aW5nIGEgc2VudGVuY2Ugd2l0aCBhIGxvd2VyIGNhc2UgbGV0dGVyLCB3cml0ZSB0aGUgc2VudGVuY2UKLWRpZmZlcmVudGx5IChlLmcuLCBgYFRoZSBpZGVudGlmaWVyIGxvd2VyLWNhc2UgaXMgQGRvdHN7fScnKS4KLQotVGhlIGNvbW1lbnQgb24gYSBmdW5jdGlvbiBpcyBtdWNoIGNsZWFyZXIgaWYgeW91IHVzZSB0aGUgYXJndW1lbnQKLW5hbWVzIHRvIHNwZWFrIGFib3V0IHRoZSBhcmd1bWVudCB2YWx1ZXMuICBUaGUgdmFyaWFibGUgbmFtZSBpdHNlbGYKLXNob3VsZCBiZSBsb3dlciBjYXNlLCBidXQgd3JpdGUgaXQgaW4gdXBwZXIgY2FzZSB3aGVuIHlvdSBhcmUgc3BlYWtpbmcKLWFib3V0IHRoZSB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgdmFyaWFibGUgaXRzZWxmLiAgVGh1cywgYGB0aGUgaW5vZGUKLW51bWJlciBOT0RFX05VTScnIHJhdGhlciB0aGFuIGBgYW4gaW5vZGUnJy4KLQotVGhlcmUgaXMgdXN1YWxseSBubyBwdXJwb3NlIGluIHJlc3RhdGluZyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gaW4KLXRoZSBjb21tZW50IGJlZm9yZSBpdCwgYmVjYXVzZSB0aGUgcmVhZGVyIGNhbiBzZWUgdGhhdCBmb3IgaGltc2VsZi4KLVRoZXJlIG1pZ2h0IGJlIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZSBjb21tZW50IGlzIHNvIGxvbmcgdGhhdCB0aGUgZnVuY3Rpb24KLWl0c2VsZiB3b3VsZCBiZSBvZmYgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLgotCi1UaGVyZSBzaG91bGQgYmUgYSBjb21tZW50IG9uIGVhY2ggc3RhdGljIHZhcmlhYmxlIGFzIHdlbGwsIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLS8qIE5vbnplcm8gbWVhbnMgdHJ1bmNhdGUgbGluZXMgaW4gdGhlIGRpc3BsYXk7Ci0gICB6ZXJvIG1lYW5zIGNvbnRpbnVlIHRoZW0uICAqLwotaW50IHRydW5jYXRlX2xpbmVzOwotQGVuZCBleGFtcGxlCi0KLUV2ZXJ5IEBzYW1weyNlbmRpZn0gc2hvdWxkIGhhdmUgYSBjb21tZW50LCBleGNlcHQgaW4gdGhlIGNhc2Ugb2Ygc2hvcnQKLWNvbmRpdGlvbmFscyAoanVzdCBhIGZldyBsaW5lcykgdGhhdCBhcmUgbm90IG5lc3RlZC4gIFRoZSBjb21tZW50IHNob3VsZAotc3RhdGUgdGhlIGNvbmRpdGlvbiBvZiB0aGUgY29uZGl0aW9uYWwgdGhhdCBpcyBlbmRpbmcsIEBlbXBoe2luY2x1ZGluZwotaXRzIHNlbnNlfS4gIEBzYW1weyNlbHNlfSBzaG91bGQgaGF2ZSBhIGNvbW1lbnQgZGVzY3JpYmluZyB0aGUgY29uZGl0aW9uCi1AZW1waHthbmQgc2Vuc2V9IG9mIHRoZSBjb2RlIHRoYXQgZm9sbG93cy4gIEZvciBleGFtcGxlOgotCi1AZXhhbXBsZQotQGdyb3VwCi0jaWZkZWYgZm9vCi0gIEBkb3Rze30KLSNlbHNlIC8qIG5vdCBmb28gKi8KLSAgQGRvdHN7fQotI2VuZGlmIC8qIG5vdCBmb28gKi8KLUBlbmQgZ3JvdXAKLUBncm91cAotI2lmZGVmIGZvbwotICBAZG90c3t9Ci0jZW5kaWYgLyogZm9vICovCi1AZW5kIGdyb3VwCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1idXQsIGJ5IGNvbnRyYXN0LCB3cml0ZSB0aGUgY29tbWVudHMgdGhpcyB3YXkgZm9yIGEgQHNhbXB7I2lmbmRlZn06Ci0KLUBleGFtcGxlCi1AZ3JvdXAKLSNpZm5kZWYgZm9vCi0gIEBkb3Rze30KLSNlbHNlIC8qIGZvbyAqLwotICBAZG90c3t9Ci0jZW5kaWYgLyogZm9vICovCi1AZW5kIGdyb3VwCi1AZ3JvdXAKLSNpZm5kZWYgZm9vCi0gIEBkb3Rze30KLSNlbmRpZiAvKiBub3QgZm9vICovCi1AZW5kIGdyb3VwCi1AZW5kIGV4YW1wbGUKLQotQG5vZGUgU3ludGFjdGljIENvbnZlbnRpb25zCi1Ac2VjdGlvbiBDbGVhbiBVc2Ugb2YgQyBDb25zdHJ1Y3RzCi0KLVBsZWFzZSBleHBsaWNpdGx5IGRlY2xhcmUgYWxsIGFyZ3VtZW50cyB0byBmdW5jdGlvbnMuCi1Eb24ndCBvbWl0IHRoZW0ganVzdCBiZWNhdXNlIHRoZXkgYXJlIEBjb2Rle2ludH1zLgotCi1EZWNsYXJhdGlvbnMgb2YgZXh0ZXJuYWwgZnVuY3Rpb25zIGFuZCBmdW5jdGlvbnMgdG8gYXBwZWFyIGxhdGVyIGluIHRoZQotc291cmNlIGZpbGUgc2hvdWxkIGFsbCBnbyBpbiBvbmUgcGxhY2UgbmVhciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlCi0oc29tZXdoZXJlIGJlZm9yZSB0aGUgZmlyc3QgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiB0aGUgZmlsZSksIG9yIGVsc2UKLXNob3VsZCBnbyBpbiBhIGhlYWRlciBmaWxlLiAgRG9uJ3QgcHV0IEBjb2Rle2V4dGVybn0gZGVjbGFyYXRpb25zIGluc2lkZQotZnVuY3Rpb25zLgotCi1JdCB1c2VkIHRvIGJlIGNvbW1vbiBwcmFjdGljZSB0byB1c2UgdGhlIHNhbWUgbG9jYWwgdmFyaWFibGVzICh3aXRoCi1uYW1lcyBsaWtlIEBjb2Rle3RlbX0pIG92ZXIgYW5kIG92ZXIgZm9yIGRpZmZlcmVudCB2YWx1ZXMgd2l0aGluIG9uZQotZnVuY3Rpb24uICBJbnN0ZWFkIG9mIGRvaW5nIHRoaXMsIGl0IGlzIGJldHRlciBkZWNsYXJlIGEgc2VwYXJhdGUgbG9jYWwKLXZhcmlhYmxlIGZvciBlYWNoIGRpc3RpbmN0IHB1cnBvc2UsIGFuZCBnaXZlIGl0IGEgbmFtZSB3aGljaCBpcwotbWVhbmluZ2Z1bC4gIFRoaXMgbm90IG9ubHkgbWFrZXMgcHJvZ3JhbXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQsIGl0IGFsc28KLWZhY2lsaXRhdGVzIG9wdGltaXphdGlvbiBieSBnb29kIGNvbXBpbGVycy4gIFlvdSBjYW4gYWxzbyBtb3ZlIHRoZQotZGVjbGFyYXRpb24gb2YgZWFjaCBsb2NhbCB2YXJpYWJsZSBpbnRvIHRoZSBzbWFsbGVzdCBzY29wZSB0aGF0IGluY2x1ZGVzCi1hbGwgaXRzIHVzZXMuICBUaGlzIG1ha2VzIHRoZSBwcm9ncmFtIGV2ZW4gY2xlYW5lci4KLQotRG9uJ3QgdXNlIGxvY2FsIHZhcmlhYmxlcyBvciBwYXJhbWV0ZXJzIHRoYXQgc2hhZG93IGdsb2JhbCBpZGVudGlmaWVycy4KLQotRG9uJ3QgZGVjbGFyZSBtdWx0aXBsZSB2YXJpYWJsZXMgaW4gb25lIGRlY2xhcmF0aW9uIHRoYXQgc3BhbnMgbGluZXMuCi1TdGFydCBhIG5ldyBkZWNsYXJhdGlvbiBvbiBlYWNoIGxpbmUsIGluc3RlYWQuICBGb3IgZXhhbXBsZSwgaW5zdGVhZAotb2YgdGhpczoKLQotQGV4YW1wbGUKLUBncm91cAotaW50ICAgIGZvbywKLSAgICAgICBiYXI7Ci1AZW5kIGdyb3VwCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13cml0ZSBlaXRoZXIgdGhpczoKLQotQGV4YW1wbGUKLWludCBmb28sIGJhcjsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLW9yIHRoaXM6Ci0KLUBleGFtcGxlCi1pbnQgZm9vOwotaW50IGJhcjsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLShJZiB0aGV5IGFyZSBnbG9iYWwgdmFyaWFibGVzLCBlYWNoIHNob3VsZCBoYXZlIGEgY29tbWVudCBwcmVjZWRpbmcgaXQKLWFueXdheS4pCi0KLVdoZW4geW91IGhhdmUgYW4gQGNvZGV7aWZ9LUBjb2Rle2Vsc2V9IHN0YXRlbWVudCBuZXN0ZWQgaW4gYW5vdGhlcgotQGNvZGV7aWZ9IHN0YXRlbWVudCwgYWx3YXlzIHB1dCBicmFjZXMgYXJvdW5kIHRoZSBAY29kZXtpZn0tQGNvZGV7ZWxzZX0uCi1UaHVzLCBuZXZlciB3cml0ZSBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1pZiAoZm9vKQotICBpZiAoYmFyKQotICAgIHdpbiAoKTsKLSAgZWxzZQotICAgIGxvc2UgKCk7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1hbHdheXMgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotaWYgKGZvbykKLSAgQHsKLSAgICBpZiAoYmFyKQotICAgICAgd2luICgpOwotICAgIGVsc2UKLSAgICAgIGxvc2UgKCk7Ci0gIEB9Ci1AZW5kIGV4YW1wbGUKLQotSWYgeW91IGhhdmUgYW4gQGNvZGV7aWZ9IHN0YXRlbWVudCBuZXN0ZWQgaW5zaWRlIG9mIGFuIEBjb2Rle2Vsc2V9Ci1zdGF0ZW1lbnQsIGVpdGhlciB3cml0ZSBAY29kZXtlbHNlIGlmfSBvbiBvbmUgbGluZSwgbGlrZSB0aGlzLAotCi1AZXhhbXBsZQotaWYgKGZvbykKLSAgQGRvdHN7fQotZWxzZSBpZiAoYmFyKQotICBAZG90c3t9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aXRoIGl0cyBAY29kZXt0aGVufS1wYXJ0IGluZGVudGVkIGxpa2UgdGhlIHByZWNlZGluZyBAY29kZXt0aGVufS1wYXJ0LAotb3Igd3JpdGUgdGhlIG5lc3RlZCBAY29kZXtpZn0gd2l0aGluIGJyYWNlcyBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1pZiAoZm9vKQotICBAZG90c3t9Ci1lbHNlCi0gIEB7Ci0gICAgaWYgKGJhcikKLSAgICAgIEBkb3Rze30KLSAgQH0KLUBlbmQgZXhhbXBsZQotCi1Eb24ndCBkZWNsYXJlIGJvdGggYSBzdHJ1Y3R1cmUgdGFnIGFuZCB2YXJpYWJsZXMgb3IgdHlwZWRlZnMgaW4gdGhlCi1zYW1lIGRlY2xhcmF0aW9uLiAgSW5zdGVhZCwgZGVjbGFyZSB0aGUgc3RydWN0dXJlIHRhZyBzZXBhcmF0ZWx5Ci1hbmQgdGhlbiB1c2UgaXQgdG8gZGVjbGFyZSB0aGUgdmFyaWFibGVzIG9yIHR5cGVkZWZzLgotCi1UcnkgdG8gYXZvaWQgYXNzaWdubWVudHMgaW5zaWRlIEBjb2Rle2lmfS1jb25kaXRpb25zLiAgRm9yIGV4YW1wbGUsCi1kb24ndCB3cml0ZSB0aGlzOgotCi1AZXhhbXBsZQotaWYgKChmb28gPSAoY2hhciAqKSBtYWxsb2MgKHNpemVvZiAqZm9vKSkgPT0gMCkKLSAgZmF0YWwgKCJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLWluc3RlYWQsIHdyaXRlIHRoaXM6Ci0KLUBleGFtcGxlCi1mb28gPSAoY2hhciAqKSBtYWxsb2MgKHNpemVvZiAqZm9vKTsKLWlmIChmb28gPT0gMCkKLSAgZmF0YWwgKCJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKTsKLUBlbmQgZXhhbXBsZQotCi1Eb24ndCBtYWtlIHRoZSBwcm9ncmFtIHVnbHkgdG8gcGxhY2F0ZSBAY29kZXtsaW50fS4gIFBsZWFzZSBkb24ndCBpbnNlcnQgYW55Ci1jYXN0cyB0byBAY29kZXt2b2lkfS4gIFplcm8gd2l0aG91dCBhIGNhc3QgaXMgcGVyZmVjdGx5IGZpbmUgYXMgYSBudWxsCi1wb2ludGVyIGNvbnN0YW50LCBleGNlcHQgd2hlbiBjYWxsaW5nIGEgdmFyYXJncyBmdW5jdGlvbi4KLQotQG5vZGUgIE5hbWVzCi1Ac2VjdGlvbiBOYW1pbmcgVmFyaWFibGVzIGFuZCBGdW5jdGlvbnMKLQotVGhlIG5hbWVzIG9mIGdsb2JhbCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBpbiBhIHByb2dyYW0gc2VydmUgYXMKLWNvbW1lbnRzIG9mIGEgc29ydC4gIFNvIGRvbid0IGNob29zZSB0ZXJzZSBuYW1lcy0tLWluc3RlYWQsIGxvb2sgZm9yCi1uYW1lcyB0aGF0IGdpdmUgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpYWJsZSBvcgotZnVuY3Rpb24uICBJbiBhIEdOVSBwcm9ncmFtLCBuYW1lcyBzaG91bGQgYmUgRW5nbGlzaCwgbGlrZSBvdGhlcgotY29tbWVudHMuCi0KLUxvY2FsIHZhcmlhYmxlIG5hbWVzIGNhbiBiZSBzaG9ydGVyLCBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgb25seSB3aXRoaW4KLW9uZSBjb250ZXh0LCB3aGVyZSAocHJlc3VtYWJseSkgY29tbWVudHMgZXhwbGFpbiB0aGVpciBwdXJwb3NlLgotCi1QbGVhc2UgdXNlIHVuZGVyc2NvcmVzIHRvIHNlcGFyYXRlIHdvcmRzIGluIGEgbmFtZSwgc28gdGhhdCB0aGUgRW1hY3MKLXdvcmQgY29tbWFuZHMgY2FuIGJlIHVzZWZ1bCB3aXRoaW4gdGhlbS4gIFN0aWNrIHRvIGxvd2VyIGNhc2U7IHJlc2VydmUKLXVwcGVyIGNhc2UgZm9yIG1hY3JvcyBhbmQgQGNvZGV7ZW51bX0gY29uc3RhbnRzLCBhbmQgZm9yIG5hbWUtcHJlZml4ZXMKLXRoYXQgZm9sbG93IGEgdW5pZm9ybSBjb252ZW50aW9uLgotCi1Gb3IgZXhhbXBsZSwgeW91IHNob3VsZCB1c2UgbmFtZXMgbGlrZSBAY29kZXtpZ25vcmVfc3BhY2VfY2hhbmdlX2ZsYWd9OwotZG9uJ3QgdXNlIG5hbWVzIGxpa2UgQGNvZGV7aUNhbnRSZWFkVGhpc30uCi0KLVZhcmlhYmxlcyB0aGF0IGluZGljYXRlIHdoZXRoZXIgY29tbWFuZC1saW5lIG9wdGlvbnMgaGF2ZSBiZWVuCi1zcGVjaWZpZWQgc2hvdWxkIGJlIG5hbWVkIGFmdGVyIHRoZSBtZWFuaW5nIG9mIHRoZSBvcHRpb24sIG5vdCBhZnRlcgotdGhlIG9wdGlvbi1sZXR0ZXIuICBBIGNvbW1lbnQgc2hvdWxkIHN0YXRlIGJvdGggdGhlIGV4YWN0IG1lYW5pbmcgb2YKLXRoZSBvcHRpb24gYW5kIGl0cyBsZXR0ZXIuICBGb3IgZXhhbXBsZSwKLQotQGV4YW1wbGUKLUBncm91cAotLyogSWdub3JlIGNoYW5nZXMgaW4gaG9yaXpvbnRhbCB3aGl0ZXNwYWNlICgtYikuICAqLwotaW50IGlnbm9yZV9zcGFjZV9jaGFuZ2VfZmxhZzsKLUBlbmQgZ3JvdXAKLUBlbmQgZXhhbXBsZQotCi1XaGVuIHlvdSB3YW50IHRvIGRlZmluZSBuYW1lcyB3aXRoIGNvbnN0YW50IGludGVnZXIgdmFsdWVzLCB1c2UKLUBjb2Rle2VudW19IHJhdGhlciB0aGFuIEBzYW1weyNkZWZpbmV9LiAgR0RCIGtub3dzIGFib3V0IGVudW1lcmF0aW9uCi1jb25zdGFudHMuCi0KLVVzZSBmaWxlIG5hbWVzIG9mIDE0IGNoYXJhY3RlcnMgb3IgbGVzcywgdG8gYXZvaWQgY3JlYXRpbmcgZ3JhdHVpdG91cwotcHJvYmxlbXMgb24gb2xkZXIgU3lzdGVtIFYgc3lzdGVtcy4gIFlvdSBjYW4gdXNlIHRoZSBwcm9ncmFtCi1AY29kZXtkb3NjaGt9IHRvIHRlc3QgZm9yIHRoaXMuICBAY29kZXtkb3NjaGt9IGFsc28gdGVzdHMgZm9yIHBvdGVudGlhbAotbmFtZSBjb25mbGljdHMgaWYgdGhlIGZpbGVzIHdlcmUgbG9hZGVkIG9udG8gYW4gTVMtRE9TIGZpbGUKLXN5c3RlbS0tLXNvbWV0aGluZyB5b3UgbWF5IG9yIG1heSBub3QgY2FyZSBhYm91dC4KLQotQG5vZGUgU3lzdGVtIFBvcnRhYmlsaXR5Ci1Ac2VjdGlvbiBQb3J0YWJpbGl0eSBiZXR3ZWVuIFN5c3RlbSBUeXBlcwotCi1JbiB0aGUgVW5peCB3b3JsZCwgYGBwb3J0YWJpbGl0eScnIHJlZmVycyB0byBwb3J0aW5nIHRvIGRpZmZlcmVudCBVbml4Ci12ZXJzaW9ucy4gIEZvciBhIEdOVSBwcm9ncmFtLCB0aGlzIGtpbmQgb2YgcG9ydGFiaWxpdHkgaXMgZGVzaXJhYmxlLCBidXQKLW5vdCBwYXJhbW91bnQuCi0KLVRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgR05VIHNvZnR3YXJlIGlzIHRvIHJ1biBvbiB0b3Agb2YgdGhlIEdOVSBrZXJuZWwsCi1jb21waWxlZCB3aXRoIHRoZSBHTlUgQyBjb21waWxlciwgb24gdmFyaW91cyB0eXBlcyBvZiBAc2N7Y3B1fS4gIFRoZQotYW1vdW50IGFuZCBraW5kcyBvZiB2YXJpYXRpb24gYW1vbmcgR05VIHN5c3RlbXMgb24gZGlmZmVyZW50IEBzY3tjcHV9cwotd2lsbCBiZSBjb21wYXJhYmxlIHRvIHRoZSB2YXJpYXRpb24gYW1vbmcgTGludXgtYmFzZWQgR05VIHN5c3RlbXMgb3IKLWFtb25nIEJTRCBzeXN0ZW1zIHRvZGF5LiAgU28gdGhlIGtpbmRzIG9mIHBvcnRhYmlsaXR5IHRoYXQgYXJlIGFic29sdXRlbHkKLW5lY2Vzc2FyeSBhcmUgcXVpdGUgbGltaXRlZC4KLQotQnV0IG1hbnkgdXNlcnMgZG8gcnVuIEdOVSBzb2Z0d2FyZSBvbiBub24tR05VIFVuaXggb3IgVW5peC1saWtlIHN5c3RlbXMuCi1TbyBzdXBwb3J0aW5nIGEgdmFyaWV0eSBvZiBVbml4LWxpa2Ugc3lzdGVtcyBpcyBkZXNpcmFibGUsIGFsdGhvdWdoIG5vdAotcGFyYW1vdW50LgotCi1UaGUgZWFzaWVzdCB3YXkgdG8gYWNoaWV2ZSBwb3J0YWJpbGl0eSB0byBtb3N0IFVuaXgtbGlrZSBzeXN0ZW1zIGlzIHRvCi11c2UgQXV0b2NvbmYuICBJdCdzIHVubGlrZWx5IHRoYXQgeW91ciBwcm9ncmFtIG5lZWRzIHRvIGtub3cgbW9yZQotaW5mb3JtYXRpb24gYWJvdXQgdGhlIGhvc3QgcGxhdGZvcm0gdGhhbiBBdXRvY29uZiBjYW4gcHJvdmlkZSwgc2ltcGx5Ci1iZWNhdXNlIG1vc3Qgb2YgdGhlIHByb2dyYW1zIHRoYXQgbmVlZCBzdWNoIGtub3dsZWRnZSBoYXZlIGFscmVhZHkgYmVlbgotd3JpdHRlbi4KLQotQXZvaWQgdXNpbmcgdGhlIGZvcm1hdCBvZiBzZW1pLWludGVybmFsIGRhdGEgYmFzZXMgKGUuZy4sIGRpcmVjdG9yaWVzKQotd2hlbiB0aGVyZSBpcyBhIGhpZ2hlci1sZXZlbCBhbHRlcm5hdGl2ZSAoQGNvZGV7cmVhZGRpcn0pLgotCi1BcyBmb3Igc3lzdGVtcyB0aGF0IGFyZSBub3QgbGlrZSBVbml4LCBzdWNoIGFzIE1TRE9TLCBXaW5kb3dzLCB0aGUKLU1hY2ludG9zaCwgVk1TLCBhbmQgTVZTLCBzdXBwb3J0aW5nIHRoZW0gaXMgdXN1YWxseSBzbyBtdWNoIHdvcmsgdGhhdCBpdAotaXMgYmV0dGVyIGlmIHlvdSBkb24ndC4KLQotVGhlIHBsYW5uZWQgR05VIGtlcm5lbCBpcyBub3QgZmluaXNoZWQgeWV0LCBidXQgeW91IGNhbiB0ZWxsIHdoaWNoCi1mYWNpbGl0aWVzIGl0IHdpbGwgcHJvdmlkZSBieSBsb29raW5nIGF0IHRoZSBHTlUgQyBMaWJyYXJ5IE1hbnVhbC4gIFRoZQotR05VIGtlcm5lbCBpcyBiYXNlZCBvbiBNYWNoLCBzbyB0aGUgZmVhdHVyZXMgb2YgTWFjaCB3aWxsIGFsc28gYmUKLWF2YWlsYWJsZS4gIEhvd2V2ZXIsIGlmIHlvdSB1c2UgTWFjaCBmZWF0dXJlcywgeW91J2xsIHByb2JhYmx5IGhhdmUKLXRyb3VibGUgZGVidWdnaW5nIHlvdXIgcHJvZ3JhbSB0b2RheS4KLQotQG5vZGUgQ1BVIFBvcnRhYmlsaXR5Ci1Ac2VjdGlvbiBQb3J0YWJpbGl0eSBiZXR3ZWVuIEBzY3tjcHV9cwotCi1FdmVuIEdOVSBzeXN0ZW1zIHdpbGwgZGlmZmVyIGJlY2F1c2Ugb2YgZGlmZmVyZW5jZXMgYW1vbmcgQHNje2NwdX0KLXR5cGVzLS0tZm9yIGV4YW1wbGUsIGRpZmZlcmVuY2UgaW4gYnl0ZSBvcmRlcmluZyBhbmQgYWxpZ25tZW50Ci1yZXF1aXJlbWVudHMuICBJdCBpcyBhYnNvbHV0ZWx5IGVzc2VudGlhbCB0byBoYW5kbGUgdGhlc2UgZGlmZmVyZW5jZXMuCi1Ib3dldmVyLCBkb24ndCBtYWtlIGFueSBlZmZvcnQgdG8gY2F0ZXIgdG8gdGhlIHBvc3NpYmlsaXR5IHRoYXQgYW4KLUBjb2Rle2ludH0gd2lsbCBiZSBsZXNzIHRoYW4gMzIgYml0cy4gIFdlIGRvbid0IHN1cHBvcnQgMTYtYml0IG1hY2hpbmVzCi1pbiBHTlUuCi0KLURvbid0IGFzc3VtZSB0aGF0IHRoZSBhZGRyZXNzIG9mIGFuIEBjb2Rle2ludH0gb2JqZWN0IGlzIGFsc28gdGhlCi1hZGRyZXNzIG9mIGl0cyBsZWFzdC1zaWduaWZpY2FudCBieXRlLiAgVGhpcyBpcyBmYWxzZSBvbiBiaWctZW5kaWFuCi1tYWNoaW5lcy4gIFRodXMsIGRvbid0IG1ha2UgdGhlIGZvbGxvd2luZyBtaXN0YWtlOgotCi1AZXhhbXBsZQotaW50IGM7Ci1AZG90c3t9Ci13aGlsZSAoKGMgPSBnZXRjaGFyKCkpICE9IEVPRikKLSAgd3JpdGUoZmlsZV9kZXNjcmlwdG9yLCAmYywgMSk7Ci1AZW5kIGV4YW1wbGUKLQotV2hlbiBjYWxsaW5nIGZ1bmN0aW9ucywgeW91IG5lZWQgbm90IHdvcnJ5IGFib3V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLXBvaW50ZXJzIG9mIHZhcmlvdXMgdHlwZXMsIG9yIGJldHdlZW4gcG9pbnRlcnMgYW5kIGludGVnZXJzLiAgT24gbW9zdAotbWFjaGluZXMsIHRoZXJlJ3Mgbm8gZGlmZmVyZW5jZSBhbnl3YXkuICBBcyBmb3IgdGhlIGZldyBtYWNoaW5lcyB3aGVyZQotdGhlcmUgaXMgYSBkaWZmZXJlbmNlLCBhbGwgb2YgdGhlbSBzdXBwb3J0IEBzY3thbnNpfSBDLCBzbyB5b3UgY2FuIHVzZQotcHJvdG90eXBlcyAoY29uZGl0aW9uYWxpemVkIHRvIGJlIGFjdGl2ZSBvbmx5IGluIEBzY3thbnNpfSBDKSB0byBtYWtlCi10aGUgY29kZSB3b3JrIG9uIHRob3NlIHN5c3RlbXMuCi0KLUluIGNlcnRhaW4gY2FzZXMsIGl0IGlzIG9rIHRvIHBhc3MgaW50ZWdlciBhbmQgcG9pbnRlciBhcmd1bWVudHMKLWluZGlzY3JpbWluYXRlbHkgdG8gdGhlIHNhbWUgZnVuY3Rpb24sIGFuZCB1c2Ugbm8gcHJvdG90eXBlIG9uIGFueQotc3lzdGVtLiAgRm9yIGV4YW1wbGUsIG1hbnkgR05VIHByb2dyYW1zIGhhdmUgZXJyb3ItcmVwb3J0aW5nIGZ1bmN0aW9ucwotdGhhdCBwYXNzIHRoZWlyIGFyZ3VtZW50cyBhbG9uZyB0byBAY29kZXtwcmludGZ9IGFuZCBmcmllbmRzOgotCi1AZXhhbXBsZQotZXJyb3IgKHMsIGExLCBhMiwgYTMpCi0gICAgIGNoYXIgKnM7Ci0gICAgIGludCBhMSwgYTIsIGEzOwotQHsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZXJyb3I6ICIpOwotICBmcHJpbnRmIChzdGRlcnIsIHMsIGExLCBhMiwgYTMpOwotQH0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLUluIHByYWN0aWNlLCB0aGlzIHdvcmtzIG9uIGFsbCBtYWNoaW5lcywgYW5kIGl0IGlzIG11Y2ggc2ltcGxlciB0aGFuIGFueQotYGBjb3JyZWN0JycgYWx0ZXJuYXRpdmUuICBCZSBzdXJlIEBlbXBoe25vdH0gdG8gdXNlIGEgcHJvdG90eXBlCi1mb3Igc3VjaCBmdW5jdGlvbnMuCi0KLUhvd2V2ZXIsIGF2b2lkIGNhc3RpbmcgcG9pbnRlcnMgdG8gaW50ZWdlcnMgdW5sZXNzIHlvdSByZWFsbHkgbmVlZCB0by4KLVRoZXNlIGFzc3VtcHRpb25zIHJlYWxseSByZWR1Y2UgcG9ydGFiaWxpdHksIGFuZCBpbiBtb3N0IHByb2dyYW1zIHRoZXkKLWFyZSBlYXN5IHRvIGF2b2lkLiAgSW4gdGhlIGNhc2VzIHdoZXJlIGNhc3RpbmcgcG9pbnRlcnMgdG8gaW50ZWdlcnMgaXMKLWVzc2VudGlhbC0tLXN1Y2ggYXMsIGEgTGlzcCBpbnRlcnByZXRlciB3aGljaCBzdG9yZXMgdHlwZSBpbmZvcm1hdGlvbiBhcwotd2VsbCBhcyBhbiBhZGRyZXNzIGluIG9uZSB3b3JkLS0taXQgaXMgb2sgdG8gZG8gc28sIGJ1dCB5b3UnbGwgaGF2ZSB0bwotbWFrZSBleHBsaWNpdCBwcm92aXNpb25zIHRvIGhhbmRsZSBkaWZmZXJlbnQgd29yZCBzaXplcy4KLQotQG5vZGUgU3lzdGVtIEZ1bmN0aW9ucwotQHNlY3Rpb24gQ2FsbGluZyBTeXN0ZW0gRnVuY3Rpb25zCi0KLUMgaW1wbGVtZW50YXRpb25zIGRpZmZlciBzdWJzdGFudGlhbGx5LiAgQHNje2Fuc2l9IEMgcmVkdWNlcyBidXQgZG9lcyBub3QKLWVsaW1pbmF0ZSB0aGUgaW5jb21wYXRpYmlsaXRpZXM7IG1lYW53aGlsZSwgbWFueSB1c2VycyB3aXNoIHRvIGNvbXBpbGUKLUdOVSBzb2Z0d2FyZSB3aXRoIHByZS1Ac2N7YW5zaX0gY29tcGlsZXJzLiAgVGhpcyBjaGFwdGVyIGdpdmVzCi1yZWNvbW1lbmRhdGlvbnMgZm9yIGhvdyB0byB1c2UgdGhlIG1vcmUgb3IgbGVzcyBzdGFuZGFyZCBDIGxpYnJhcnkKLWZ1bmN0aW9ucyB0byBhdm9pZCB1bm5lY2Vzc2FyeSBsb3NzIG9mIHBvcnRhYmlsaXR5LgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotRG9uJ3QgdXNlIHRoZSB2YWx1ZSBvZiBAY29kZXtzcHJpbnRmfS4gIEl0IHJldHVybnMgdGhlIG51bWJlciBvZgotY2hhcmFjdGVycyB3cml0dGVuIG9uIHNvbWUgc3lzdGVtcywgYnV0IG5vdCBvbiBhbGwgc3lzdGVtcy4KLQotQGl0ZW0KLUBjb2Rle21haW59IHNob3VsZCBiZSBkZWNsYXJlZCB0byByZXR1cm4gdHlwZSBAY29kZXtpbnR9LiAgSXQgc2hvdWxkCi10ZXJtaW5hdGUgZWl0aGVyIGJ5IGNhbGxpbmcgQGNvZGV7ZXhpdH0gb3IgYnkgcmV0dXJuaW5nIHRoZSBpbnRlZ2VyCi1zdGF0dXMgY29kZTsgbWFrZSBzdXJlIGl0IGNhbm5vdCBldmVyIHJldHVybiBhbiB1bmRlZmluZWQgdmFsdWUuCi0KLUBpdGVtCi1Eb24ndCBkZWNsYXJlIHN5c3RlbSBmdW5jdGlvbnMgZXhwbGljaXRseS4KLQotQWxtb3N0IGFueSBkZWNsYXJhdGlvbiBmb3IgYSBzeXN0ZW0gZnVuY3Rpb24gaXMgd3Jvbmcgb24gc29tZSBzeXN0ZW0uCi1UbyBtaW5pbWl6ZSBjb25mbGljdHMsIGxlYXZlIGl0IHRvIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIHRvIGRlY2xhcmUKLXN5c3RlbSBmdW5jdGlvbnMuICBJZiB0aGUgaGVhZGVycyBkb24ndCBkZWNsYXJlIGEgZnVuY3Rpb24sIGxldCBpdAotcmVtYWluIHVuZGVjbGFyZWQuCi0KLVdoaWxlIGl0IG1heSBzZWVtIHVuY2xlYW4gdG8gdXNlIGEgZnVuY3Rpb24gd2l0aG91dCBkZWNsYXJpbmcgaXQsIGluCi1wcmFjdGljZSB0aGlzIHdvcmtzIGZpbmUgZm9yIG1vc3Qgc3lzdGVtIGxpYnJhcnkgZnVuY3Rpb25zIG9uIHRoZQotc3lzdGVtcyB3aGVyZSB0aGlzIHJlYWxseSBoYXBwZW5zOyB0aHVzLCB0aGUgZGlzYWR2YW50YWdlIGlzIG9ubHkKLXRoZW9yZXRpY2FsLiAgQnkgY29udHJhc3QsIGFjdHVhbCBkZWNsYXJhdGlvbnMgaGF2ZSBmcmVxdWVudGx5IGNhdXNlZAotYWN0dWFsIGNvbmZsaWN0cy4KLQotQGl0ZW0KLUlmIHlvdSBtdXN0IGRlY2xhcmUgYSBzeXN0ZW0gZnVuY3Rpb24sIGRvbid0IHNwZWNpZnkgdGhlIGFyZ3VtZW50IHR5cGVzLgotVXNlIGFuIG9sZC1zdHlsZSBkZWNsYXJhdGlvbiwgbm90IGFuIEBzY3thbnNpfSBwcm90b3R5cGUuICBUaGUgbW9yZSB5b3UKLXNwZWNpZnkgYWJvdXQgdGhlIGZ1bmN0aW9uLCB0aGUgbW9yZSBsaWtlbHkgYSBjb25mbGljdC4KLQotQGl0ZW0KLUluIHBhcnRpY3VsYXIsIGRvbid0IHVuY29uZGl0aW9uYWxseSBkZWNsYXJlIEBjb2Rle21hbGxvY30gb3IKLUBjb2Rle3JlYWxsb2N9LgotCi1Nb3N0IEdOVSBwcm9ncmFtcyB1c2UgdGhvc2UgZnVuY3Rpb25zIGp1c3Qgb25jZSwgaW4gZnVuY3Rpb25zCi1jb252ZW50aW9uYWxseSBuYW1lZCBAY29kZXt4bWFsbG9jfSBhbmQgQGNvZGV7eHJlYWxsb2N9LiAgVGhlc2UKLWZ1bmN0aW9ucyBjYWxsIEBjb2Rle21hbGxvY30gYW5kIEBjb2Rle3JlYWxsb2N9LCByZXNwZWN0aXZlbHksIGFuZAotY2hlY2sgdGhlIHJlc3VsdHMuCi0KLUJlY2F1c2UgQGNvZGV7eG1hbGxvY30gYW5kIEBjb2Rle3hyZWFsbG9jfSBhcmUgZGVmaW5lZCBpbiB5b3VyIHByb2dyYW0sCi15b3UgY2FuIGRlY2xhcmUgdGhlbSBpbiBvdGhlciBmaWxlcyB3aXRob3V0IGFueSByaXNrIG9mIHR5cGUgY29uZmxpY3QuCi0KLU9uIG1vc3Qgc3lzdGVtcywgQGNvZGV7aW50fSBpcyB0aGUgc2FtZSBsZW5ndGggYXMgYSBwb2ludGVyOyB0aHVzLCB0aGUKLWNhbGxzIHRvIEBjb2Rle21hbGxvY30gYW5kIEBjb2Rle3JlYWxsb2N9IHdvcmsgZmluZS4gIEZvciB0aGUgZmV3Ci1leGNlcHRpb25hbCBzeXN0ZW1zIChtb3N0bHkgNjQtYml0IG1hY2hpbmVzKSwgeW91IGNhbiB1c2UKLUBzdHJvbmd7Y29uZGl0aW9uYWxpemVkfSBkZWNsYXJhdGlvbnMgb2YgQGNvZGV7bWFsbG9jfSBhbmQKLUBjb2Rle3JlYWxsb2N9LS0tb3IgcHV0IHRoZXNlIGRlY2xhcmF0aW9ucyBpbiBjb25maWd1cmF0aW9uIGZpbGVzCi1zcGVjaWZpYyB0byB0aG9zZSBzeXN0ZW1zLgotCi1AaXRlbQotVGhlIHN0cmluZyBmdW5jdGlvbnMgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudC4gIFNvbWUgVW5peCBzeXN0ZW1zIGhhdmUKLWEgaGVhZGVyIGZpbGUgQGZpbGV7c3RyaW5nLmh9OyBvdGhlcnMgaGF2ZSBAZmlsZXtzdHJpbmdzLmh9LiAgTmVpdGhlcgotZmlsZSBuYW1lIGlzIHBvcnRhYmxlLiAgVGhlcmUgYXJlIHR3byB0aGluZ3MgeW91IGNhbiBkbzogdXNlIEF1dG9jb25mIHRvCi1maWd1cmUgb3V0IHdoaWNoIGZpbGUgdG8gaW5jbHVkZSwgb3IgZG9uJ3QgaW5jbHVkZSBlaXRoZXIgZmlsZS4KLQotQGl0ZW0KLUlmIHlvdSBkb24ndCBpbmNsdWRlIGVpdGhlciBzdHJpbmdzIGZpbGUsIHlvdSBjYW4ndCBnZXQgZGVjbGFyYXRpb25zIGZvcgotdGhlIHN0cmluZyBmdW5jdGlvbnMgZnJvbSB0aGUgaGVhZGVyIGZpbGUgaW4gdGhlIHVzdWFsIHdheS4KLQotVGhhdCBjYXVzZXMgbGVzcyBvZiBhIHByb2JsZW0gdGhhbiB5b3UgbWlnaHQgdGhpbmsuICBUaGUgbmV3ZXIgQHNje2Fuc2l9Ci1zdHJpbmcgZnVuY3Rpb25zIHNob3VsZCBiZSBhdm9pZGVkIGFueXdheSBiZWNhdXNlIG1hbnkgc3lzdGVtcyBzdGlsbAotZG9uJ3Qgc3VwcG9ydCB0aGVtLiAgVGhlIHN0cmluZyBmdW5jdGlvbnMgeW91IGNhbiB1c2UgYXJlIHRoZXNlOgotCi1AZXhhbXBsZQotc3RyY3B5ICAgc3RybmNweSAgIHN0cmNhdCAgIHN0cm5jYXQKLXN0cmxlbiAgIHN0cmNtcCAgICBzdHJuY21wCi1zdHJjaHIgICBzdHJyY2hyCi1AZW5kIGV4YW1wbGUKLQotVGhlIGNvcHkgYW5kIGNvbmNhdGVuYXRlIGZ1bmN0aW9ucyB3b3JrIGZpbmUgd2l0aG91dCBhIGRlY2xhcmF0aW9uIGFzCi1sb25nIGFzIHlvdSBkb24ndCB1c2UgdGhlaXIgdmFsdWVzLiAgVXNpbmcgdGhlaXIgdmFsdWVzIHdpdGhvdXQgYQotZGVjbGFyYXRpb24gZmFpbHMgb24gc3lzdGVtcyB3aGVyZSB0aGUgd2lkdGggb2YgYSBwb2ludGVyIGRpZmZlcnMgZnJvbQotdGhlIHdpZHRoIG9mIEBjb2Rle2ludH0sIGFuZCBwZXJoYXBzIGluIG90aGVyIGNhc2VzLiAgSXQgaXMgdHJpdmlhbCB0bwotYXZvaWQgdXNpbmcgdGhlaXIgdmFsdWVzLCBzbyBkbyB0aGF0LgotCi1UaGUgY29tcGFyZSBmdW5jdGlvbnMgYW5kIEBjb2Rle3N0cmxlbn0gd29yayBmaW5lIHdpdGhvdXQgYSBkZWNsYXJhdGlvbgotb24gbW9zdCBzeXN0ZW1zLCBwb3NzaWJseSBhbGwgdGhlIG9uZXMgdGhhdCBHTlUgc29mdHdhcmUgcnVucyBvbi4KLVlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gZGVjbGFyZSB0aGVtIEBzdHJvbmd7Y29uZGl0aW9uYWxseX0gb24gYQotZmV3IHN5c3RlbXMuCi0KLVRoZSBzZWFyY2ggZnVuY3Rpb25zIG11c3QgYmUgZGVjbGFyZWQgdG8gcmV0dXJuIEBjb2Rle2NoYXIgKn0uICBMdWNraWx5LAotdGhlcmUgaXMgbm8gdmFyaWF0aW9uIGluIHRoZSBkYXRhIHR5cGUgdGhleSByZXR1cm4uICBCdXQgdGhlcmUgaXMKLXZhcmlhdGlvbiBpbiB0aGVpciBuYW1lcy4gIFNvbWUgc3lzdGVtcyBnaXZlIHRoZXNlIGZ1bmN0aW9ucyB0aGUgbmFtZXMKLUBjb2Rle2luZGV4fSBhbmQgQGNvZGV7cmluZGV4fTsgb3RoZXIgc3lzdGVtcyB1c2UgdGhlIG5hbWVzCi1AY29kZXtzdHJjaHJ9IGFuZCBAY29kZXtzdHJyY2hyfS4gIFNvbWUgc3lzdGVtcyBzdXBwb3J0IGJvdGggcGFpcnMgb2YKLW5hbWVzLCBidXQgbmVpdGhlciBwYWlyIHdvcmtzIG9uIGFsbCBzeXN0ZW1zLgotCi1Zb3Ugc2hvdWxkIHBpY2sgYSBzaW5nbGUgcGFpciBvZiBuYW1lcyBhbmQgdXNlIGl0IHRocm91Z2hvdXQgeW91cgotcHJvZ3JhbS4gIChOb3dhZGF5cywgaXQgaXMgYmV0dGVyIHRvIGNob29zZSBAY29kZXtzdHJjaHJ9IGFuZAotQGNvZGV7c3RycmNocn0gZm9yIG5ldyBwcm9ncmFtcywgc2luY2UgdGhvc2UgYXJlIHRoZSBzdGFuZGFyZCBAc2N7YW5zaX0KLW5hbWVzLikgIERlY2xhcmUgYm90aCBvZiB0aG9zZSBuYW1lcyBhcyBmdW5jdGlvbnMgcmV0dXJuaW5nIEBjb2Rle2NoYXIKLSp9LiAgT24gc3lzdGVtcyB3aGljaCBkb24ndCBzdXBwb3J0IHRob3NlIG5hbWVzLCBkZWZpbmUgdGhlbSBhcyBtYWNyb3MKLWluIHRlcm1zIG9mIHRoZSBvdGhlciBwYWlyLiAgRm9yIGV4YW1wbGUsIGhlcmUgaXMgd2hhdCB0byBwdXQgYXQgdGhlCi1iZWdpbm5pbmcgb2YgeW91ciBmaWxlIChvciBpbiBhIGhlYWRlcikgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBuYW1lcwotQGNvZGV7c3RyY2hyfSBhbmQgQGNvZGV7c3RycmNocn0gdGhyb3VnaG91dDoKLQotQGV4YW1wbGUKLSNpZm5kZWYgSEFWRV9TVFJDSFIKLSNkZWZpbmUgc3RyY2hyIGluZGV4Ci0jZW5kaWYKLSNpZm5kZWYgSEFWRV9TVFJSQ0hSCi0jZGVmaW5lIHN0cnJjaHIgcmluZGV4Ci0jZW5kaWYKLQotY2hhciAqc3RyY2hyICgpOwotY2hhciAqc3RycmNociAoKTsKLUBlbmQgZXhhbXBsZQotQGVuZCBpdGVtaXplCi0KLUhlcmUgd2UgYXNzdW1lIHRoYXQgQGNvZGV7SEFWRV9TVFJDSFJ9IGFuZCBAY29kZXtIQVZFX1NUUlJDSFJ9IGFyZQotbWFjcm9zIGRlZmluZWQgaW4gc3lzdGVtcyB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbnMgZXhpc3QuCi1PbmUgd2F5IHRvIGdldCB0aGVtIHByb3Blcmx5IGRlZmluZWQgaXMgdG8gdXNlIEF1dG9jb25mLgotCi1Abm9kZSBJbnRlcm5hdGlvbmFsaXphdGlvbgotQHNlY3Rpb24gSW50ZXJuYXRpb25hbGl6YXRpb24KLQotR05VIGhhcyBhIGxpYnJhcnkgY2FsbGVkIEdOVSBnZXR0ZXh0IHRoYXQgbWFrZXMgaXQgZWFzeSB0byB0cmFuc2xhdGUgdGhlCi1tZXNzYWdlcyBpbiBhIHByb2dyYW0gaW50byB2YXJpb3VzIGxhbmd1YWdlcy4gIFlvdSBzaG91bGQgdXNlIHRoaXMKLWxpYnJhcnkgaW4gZXZlcnkgcHJvZ3JhbS4gIFVzZSBFbmdsaXNoIGZvciB0aGUgbWVzc2FnZXMgYXMgdGhleSBhcHBlYXIKLWluIHRoZSBwcm9ncmFtLCBhbmQgbGV0IGdldHRleHQgcHJvdmlkZSB0aGUgd2F5IHRvIHRyYW5zbGF0ZSB0aGVtIGludG8KLW90aGVyIGxhbmd1YWdlcy4KLQotVXNpbmcgR05VIGdldHRleHQgaW52b2x2ZXMgcHV0dGluZyBhIGNhbGwgdG8gdGhlIEBjb2Rle2dldHRleHR9IG1hY3JvCi1hcm91bmQgZWFjaCBzdHJpbmcgdGhhdCBtaWdodCBuZWVkIHRyYW5zbGF0aW9uLS0tbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotcHJpbnRmIChnZXR0ZXh0ICgiUHJvY2Vzc2luZyBmaWxlIGAlcycuLi4iKSk7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGlzIHBlcm1pdHMgR05VIGdldHRleHQgdG8gcmVwbGFjZSB0aGUgc3RyaW5nIEBjb2RleyJQcm9jZXNzaW5nIGZpbGUKLWAlcycuLi4ifSB3aXRoIGEgdHJhbnNsYXRlZCB2ZXJzaW9uLgotCi1PbmNlIGEgcHJvZ3JhbSB1c2VzIGdldHRleHQsIHBsZWFzZSBtYWtlIGEgcG9pbnQgb2Ygd3JpdGluZyBjYWxscyB0bwotQGNvZGV7Z2V0dGV4dH0gd2hlbiB5b3UgYWRkIG5ldyBzdHJpbmdzIHRoYXQgY2FsbCBmb3IgdHJhbnNsYXRpb24uCi0KLVVzaW5nIEdOVSBnZXR0ZXh0IGluIGEgcGFja2FnZSBpbnZvbHZlcyBzcGVjaWZ5aW5nIGEgQGRmbnt0ZXh0IGRvbWFpbgotbmFtZX0gZm9yIHRoZSBwYWNrYWdlLiAgVGhlIHRleHQgZG9tYWluIG5hbWUgaXMgdXNlZCB0byBzZXBhcmF0ZSB0aGUKLXRyYW5zbGF0aW9ucyBmb3IgdGhpcyBwYWNrYWdlIGZyb20gdGhlIHRyYW5zbGF0aW9ucyBmb3Igb3RoZXIgcGFja2FnZXMuCi1Ob3JtYWxseSwgdGhlIHRleHQgZG9tYWluIG5hbWUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZQotcGFja2FnZS0tLWZvciBleGFtcGxlLCBAc2FtcHtmaWxldXRpbHN9IGZvciB0aGUgR05VIGZpbGUgdXRpbGl0aWVzLgotCi1UbyBlbmFibGUgZ2V0dGV4dCB0byB3b3JrIHdlbGwsIGF2b2lkIHdyaXRpbmcgY29kZSB0aGF0IG1ha2VzCi1hc3N1bXB0aW9ucyBhYm91dCB0aGUgc3RydWN0dXJlIG9mIHdvcmRzIG9yIHNlbnRlbmNlcy4gIFdoZW4geW91IHdhbnQKLXRoZSBwcmVjaXNlIHRleHQgb2YgYSBzZW50ZW5jZSB0byB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgZGF0YSwgdXNlIHR3byBvcgotbW9yZSBhbHRlcm5hdGl2ZSBzdHJpbmcgY29uc3RhbnRzIGVhY2ggY29udGFpbmluZyBhIGNvbXBsZXRlIHNlbnRlbmNlcywKLXJhdGhlciB0aGFuIGluc2VydGluZyBjb25kaXRpb25hbGl6ZWQgd29yZHMgb3IgcGhyYXNlcyBpbnRvIGEgc2luZ2xlCi1zZW50ZW5jZSBmcmFtZXdvcmsuCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBvZiB3aGF0IG5vdCB0byBkbzoKLQotQGV4YW1wbGUKLXByaW50ZiAoIiVkIGZpbGUlcyBwcm9jZXNzZWQiLCBuZmlsZXMsCi0gICAgICAgIG5maWxlcyAhPSAxID8gInMiIDogIiIpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotVGhlIHByb2JsZW0gd2l0aCB0aGF0IGV4YW1wbGUgaXMgdGhhdCBpdCBhc3N1bWVzIHRoYXQgcGx1cmFscyBhcmUgbWFkZQotYnkgYWRkaW5nIGBzJy4gIElmIHlvdSBhcHBseSBnZXR0ZXh0IHRvIHRoZSBmb3JtYXQgc3RyaW5nLCBsaWtlIHRoaXMsCi0KLUBleGFtcGxlCi1wcmludGYgKGdldHRleHQgKCIlZCBmaWxlJXMgcHJvY2Vzc2VkIiksIG5maWxlcywKLSAgICAgICAgbmZpbGVzICE9IDEgPyAicyIgOiAiIik7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci10aGUgbWVzc2FnZSBjYW4gdXNlIGRpZmZlcmVudCB3b3JkcywgYnV0IGl0IHdpbGwgc3RpbGwgYmUgZm9yY2VkIHRvIHVzZQotYHMnIGZvciB0aGUgcGx1cmFsLiAgSGVyZSBpcyBhIGJldHRlciB3YXk6Ci0KLUBleGFtcGxlCi1wcmludGYgKChuZmlsZXMgIT0gMSA/ICIlZCBmaWxlcyBwcm9jZXNzZWQiCi0gICAgICAgICA6ICIlZCBmaWxlIHByb2Nlc3NlZCIpLAotICAgICAgICBuZmlsZXMpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyB3YXksIHlvdSBjYW4gYXBwbHkgZ2V0dGV4dCB0byBlYWNoIG9mIHRoZSB0d28gc3RyaW5ncwotaW5kZXBlbmRlbnRseToKLQotQGV4YW1wbGUKLXByaW50ZiAoKG5maWxlcyAhPSAxID8gZ2V0dGV4dCAoIiVkIGZpbGVzIHByb2Nlc3NlZCIpCi0gICAgICAgICA6IGdldHRleHQgKCIlZCBmaWxlIHByb2Nlc3NlZCIpKSwKLSAgICAgICAgbmZpbGVzKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoaXMgY2FuIGJlIGFueSBtZXRob2Qgb2YgZm9ybWluZyB0aGUgcGx1cmFsIG9mIHRoZSB3b3JkIGZvciBgYGZpbGUnJywgYW5kCi1hbHNvIGhhbmRsZXMgbGFuZ3VhZ2VzIHRoYXQgcmVxdWlyZSBhZ3JlZW1lbnQgaW4gdGhlIHdvcmQgZm9yCi1gYHByb2Nlc3NlZCcnLgotCi1BIHNpbWlsYXIgcHJvYmxlbSBhcHBlYXJzIGF0IHRoZSBsZXZlbCBvZiBzZW50ZW5jZSBzdHJ1Y3R1cmUgd2l0aCB0aGlzCi1jb2RlOgotCi1AZXhhbXBsZQotcHJpbnRmICgiIyAgSW1wbGljaXQgcnVsZSBzZWFyY2ggaGFzJXMgYmVlbiBkb25lLlxuIiwKLSAgICAgICAgZi0+dHJpZWRfaW1wbGljaXQgPyAiIiA6ICIgbm90Iik7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1BZGRpbmcgQGNvZGV7Z2V0dGV4dH0gY2FsbHMgdG8gdGhpcyBjb2RlIGNhbm5vdCBnaXZlIGNvcnJlY3QgcmVzdWx0cyBmb3IKLWFsbCBsYW5ndWFnZXMsIGJlY2F1c2UgbmVnYXRpb24gaW4gc29tZSBsYW5ndWFnZXMgcmVxdWlyZXMgYWRkaW5nIHdvcmRzCi1hdCBtb3JlIHRoYW4gb25lIHBsYWNlIGluIHRoZSBzZW50ZW5jZS4gIEJ5IGNvbnRyYXN0LCBhZGRpbmcKLUBjb2Rle2dldHRleHR9IGNhbGxzIGRvZXMgdGhlIGpvYiBzdHJhaWdodGZvd2FyZGx5IGlmIHRoZSBjb2RlIHN0YXJ0cwotb3V0IGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLXByaW50ZiAoZi0+dHJpZWRfaW1wbGljaXQKLSAgICAgICAgPyAiIyAgSW1wbGljaXQgcnVsZSBzZWFyY2ggaGFzIGJlZW4gZG9uZS5cbiIsCi0gICAgICAgIDogIiMgIEltcGxpY2l0IHJ1bGUgc2VhcmNoIGhhcyBub3QgYmVlbiBkb25lLlxuIik7Ci1AZW5kIGV4YW1wbGUKLQotQG5vZGUgTW1hcAotQHNlY3Rpb24gTW1hcAotCi1Eb24ndCBhc3N1bWUgdGhhdCBAY29kZXttbWFwfSBlaXRoZXIgd29ya3Mgb24gYWxsIGZpbGVzIG9yIGZhaWxzCi1mb3IgYWxsIGZpbGVzLiAgSXQgbWF5IHdvcmsgb24gc29tZSBmaWxlcyBhbmQgZmFpbCBvbiBvdGhlcnMuCi0KLVRoZSBwcm9wZXIgd2F5IHRvIHVzZSBAY29kZXttbWFwfSBpcyB0byB0cnkgaXQgb24gdGhlIHNwZWNpZmljIGZpbGUgZm9yCi13aGljaCB5b3Ugd2FudCB0byB1c2UgaXQtLS1hbmQgaWYgQGNvZGV7bW1hcH0gZG9lc24ndCB3b3JrLCBmYWxsIGJhY2sgb24KLWRvaW5nIHRoZSBqb2IgaW4gYW5vdGhlciB3YXkgdXNpbmcgQGNvZGV7cmVhZH0gYW5kIEBjb2Rle3dyaXRlfS4KLQotVGhlIHJlYXNvbiB0aGlzIHByZWNhdXRpb24gaXMgbmVlZGVkIGlzIHRoYXQgdGhlIEdOVSBrZXJuZWwgKHRoZSBIVVJEKQotcHJvdmlkZXMgYSB1c2VyLWV4dGVuc2libGUgZmlsZSBzeXN0ZW0sIGluIHdoaWNoIHRoZXJlIGNhbiBiZSBtYW55Ci1kaWZmZXJlbnQga2luZHMgb2YgYGBvcmRpbmFyeSBmaWxlcy4nJyAgTWFueSBvZiB0aGVtIHN1cHBvcnQKLUBjb2Rle21tYXB9LCBidXQgc29tZSBkbyBub3QuICBJdCBpcyBpbXBvcnRhbnQgdG8gbWFrZSBwcm9ncmFtcyBoYW5kbGUKLWFsbCB0aGVzZSBraW5kcyBvZiBmaWxlcy4KLQotQG5vZGUgRG9jdW1lbnRhdGlvbgotQGNoYXB0ZXIgRG9jdW1lbnRpbmcgUHJvZ3JhbXMKLQotQG1lbnUKLSogR05VIE1hbnVhbHM6OiAgICAgICAgICAgICAgICAgV3JpdGluZyBwcm9wZXIgbWFudWFscy4KLSogTWFudWFsIFN0cnVjdHVyZSBEZXRhaWxzOjogICAgU3BlY2lmaWMgc3RydWN0dXJlIGNvbnZlbnRpb25zLgotKiBORVdTIEZpbGU6OiAgICAgICAgICAgICAgICAgICBORVdTIGZpbGVzIHN1cHBsZW1lbnQgbWFudWFscy4KLSogQ2hhbmdlIExvZ3M6OiAgICAgICAgICAgICAgICAgUmVjb3JkaW5nIENoYW5nZXMKLSogTWFuIFBhZ2VzOjogICAgICAgICAgICAgICAgICAgTWFuIHBhZ2VzIGFyZSBzZWNvbmRhcnkuCi0qIFJlYWRpbmcgb3RoZXIgTWFudWFsczo6ICAgICAgIEhvdyBmYXIgeW91IGNhbiBnbyBpbiBsZWFybmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG90aGVyIG1hbnVhbHMuCi1AZW5kIG1lbnUKLQotQG5vZGUgR05VIE1hbnVhbHMKLUBzZWN0aW9uIEdOVSBNYW51YWxzCi0KLVRoZSBwcmVmZXJyZWQgd2F5IHRvIGRvY3VtZW50IHBhcnQgb2YgdGhlIEdOVSBzeXN0ZW0gaXMgdG8gd3JpdGUgYQotbWFudWFsIGluIHRoZSBUZXhpbmZvIGZvcm1hdHRpbmcgbGFuZ3VhZ2UuICBTZWUgdGhlIFRleGluZm8gbWFudWFsLAotZWl0aGVyIHRoZSBoYXJkY29weSwgb3IgdGhlIG9uLWxpbmUgdmVyc2lvbiBhdmFpbGFibGUgdGhyb3VnaAotQGNvZGV7aW5mb30gb3IgdGhlIEVtYWNzIEluZm8gc3Vic3lzdGVtIChAa2Jke0MtaCBpfSkuCi0KLVByb2dyYW1tZXJzIG9mdGVuIGZpbmQgaXQgbW9zdCBuYXR1cmFsIHRvIHN0cnVjdHVyZSB0aGUgZG9jdW1lbnRhdGlvbgotZm9sbG93aW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB3aGljaCB0aGV5IGtub3cuICBCdXQKLXRoaXMgc3RydWN0dXJlIGlzIG5vdCBuZWNlc3NhcmlseSBnb29kIGZvciBleHBsYWluaW5nIGhvdyB0byB1c2UgdGhlCi1wcm9ncmFtOyBpdCBtYXkgYmUgaXJyZWxldmFudCBhbmQgY29uZnVzaW5nIGZvciBhIHVzZXIuCi0KLUF0IGV2ZXJ5IGxldmVsLCBmcm9tIHRoZSBzZW50ZW5jZXMgaW4gYSBwYXJhZ3JhcGggdG8gdGhlIGdyb3VwaW5nIG9mCi10b3BpY3MgaW50byBzZXBhcmF0ZSBtYW51YWxzLCB0aGUgcmlnaHQgd2F5IHRvIHN0cnVjdHVyZSBkb2N1bWVudGF0aW9uCi1pcyBhY2NvcmRpbmcgdG8gdGhlIGNvbmNlcHRzIGFuZCBxdWVzdGlvbnMgdGhhdCBhIHVzZXIgd2lsbCBoYXZlIGluIG1pbmQKLXdoZW4gcmVhZGluZyBpdC4gIFNvbWV0aW1lcyB0aGlzIHN0cnVjdHVyZSBvZiBpZGVhcyBtYXRjaGVzIHRoZQotc3RydWN0dXJlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc29mdHdhcmUgYmVpbmcgZG9jdW1lbnRlZC0tLWJ1dAotb2Z0ZW4gdGhleSBhcmUgZGlmZmVyZW50LiAgT2Z0ZW4gdGhlIG1vc3QgaW1wb3J0YW50IHBhcnQgb2YgbGVhcm5pbmcgdG8KLXdyaXRlIGdvb2QgZG9jdW1lbnRhdGlvbiBpcyBsZWFybmluZyB0byBub3RpY2Ugd2hlbiB5b3UgYXJlIHN0cnVjdHVyaW5nCi10aGUgZG9jdW1lbnRhdGlvbiBsaWtlIHRoZSBpbXBsZW1lbnRhdGlvbiwgYW5kIHRoaW5rIGFib3V0IGJldHRlcgotYWx0ZXJuYXRpdmVzLgotCi1Gb3IgZXhhbXBsZSwgZWFjaCBwcm9ncmFtIGluIHRoZSBHTlUgc3lzdGVtIHByb2JhYmx5IG91Z2h0IHRvIGJlCi1kb2N1bWVudGVkIGluIG9uZSBtYW51YWw7IGJ1dCB0aGlzIGRvZXMgbm90IG1lYW4gZWFjaCBwcm9ncmFtIHNob3VsZAotaGF2ZSBpdHMgb3duIG1hbnVhbC4gIFRoYXQgd291bGQgYmUgZm9sbG93aW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlCi1pbXBsZW1lbnRhdGlvbiwgcmF0aGVyIHRoYW4gdGhlIHN0cnVjdHVyZSB0aGF0IGhlbHBzIHRoZSB1c2VyCi11bmRlcnN0YW5kLgotCi1JbnN0ZWFkLCBlYWNoIG1hbnVhbCBzaG91bGQgY292ZXIgYSBjb2hlcmVudCBAZW1waHt0b3BpY30uICBGb3IgZXhhbXBsZSwKLWluc3RlYWQgb2YgYSBtYW51YWwgZm9yIEBjb2Rle2RpZmZ9IGFuZCBhIG1hbnVhbCBmb3IgQGNvZGV7ZGlmZjN9LCB3ZQotaGF2ZSBvbmUgbWFudWFsIGZvciBgYGNvbXBhcmlzb24gb2YgZmlsZXMnJyB3aGljaCBjb3ZlcnMgYm90aCBvZiB0aG9zZQotcHJvZ3JhbXMsIGFzIHdlbGwgYXMgQGNvZGV7Y21wfS4gIEJ5IGRvY3VtZW50aW5nIHRoZXNlIHByb2dyYW1zCi10b2dldGhlciwgd2UgY2FuIG1ha2UgdGhlIHdob2xlIHN1YmplY3QgY2xlYXJlci4KLQotVGhlIG1hbnVhbCB3aGljaCBkaXNjdXNzZXMgYSBwcm9ncmFtIHNob3VsZCBkb2N1bWVudCBhbGwgb2YgdGhlCi1wcm9ncmFtJ3MgY29tbWFuZC1saW5lIG9wdGlvbnMgYW5kIGFsbCBvZiBpdHMgY29tbWFuZHMuICBJdCBzaG91bGQgZ2l2ZQotZXhhbXBsZXMgb2YgdGhlaXIgdXNlLiAgQnV0IGRvbid0IG9yZ2FuaXplIHRoZSBtYW51YWwgYXMgYSBsaXN0IG9mCi1mZWF0dXJlcy4gIEluc3RlYWQsIG9yZ2FuaXplIGl0IGxvZ2ljYWxseSwgYnkgc3VidG9waWNzLiAgQWRkcmVzcyB0aGUKLXF1ZXN0aW9ucyB0aGF0IGEgdXNlciB3aWxsIGFzayB3aGVuIHRoaW5raW5nIGFib3V0IHRoZSBqb2IgdGhhdCB0aGUKLXByb2dyYW0gZG9lcy4KLQotSW4gZ2VuZXJhbCwgYSBHTlUgbWFudWFsIHNob3VsZCBzZXJ2ZSBib3RoIGFzIHR1dG9yaWFsIGFuZCByZWZlcmVuY2UuCi1JdCBzaG91bGQgYmUgc2V0IHVwIGZvciBjb252ZW5pZW50IGFjY2VzcyB0byBlYWNoIHRvcGljIHRocm91Z2ggSW5mbywKLWFuZCBmb3IgcmVhZGluZyBzdHJhaWdodCB0aHJvdWdoIChhcHBlbmRpeGVzIGFzaWRlKS4gIEEgR05VIG1hbnVhbAotc2hvdWxkIGdpdmUgYSBnb29kIGludHJvZHVjdGlvbiB0byBhIGJlZ2lubmVyIHJlYWRpbmcgdGhyb3VnaCBmcm9tIHRoZQotc3RhcnQsIGFuZCBzaG91bGQgYWxzbyBwcm92aWRlIGFsbCB0aGUgZGV0YWlscyB0aGF0IGhhY2tlcnMgd2FudC4KLQotVGhhdCBpcyBub3QgYXMgaGFyZCBhcyBpdCBmaXJzdCBzb3VuZHMuICBBcnJhbmdlIGVhY2ggY2hhcHRlciBhcyBhCi1sb2dpY2FsIGJyZWFrZG93biBvZiBpdHMgdG9waWMsIGJ1dCBvcmRlciB0aGUgc2VjdGlvbnMsIGFuZCB3cml0ZSB0aGVpcgotdGV4dCwgc28gdGhhdCByZWFkaW5nIHRoZSBjaGFwdGVyIHN0cmFpZ2h0IHRocm91Z2ggbWFrZXMgc2Vuc2UuICBEbwotbGlrZXdpc2Ugd2hlbiBzdHJ1Y3R1cmluZyB0aGUgYm9vayBpbnRvIGNoYXB0ZXJzLCBhbmQgd2hlbiBzdHJ1Y3R1cmluZyBhCi1zZWN0aW9uIGludG8gcGFyYWdyYXBocy4gIFRoZSB3YXRjaHdvcmQgaXMsIEBlbXBoe2F0IGVhY2ggcG9pbnQsIGFkZHJlc3MKLXRoZSBtb3N0IGZ1bmRhbWVudGFsIGFuZCBpbXBvcnRhbnQgaXNzdWUgcmFpc2VkIGJ5IHRoZSBwcmVjZWRpbmcgdGV4dC59Ci0KLUlmIG5lY2Vzc2FyeSwgYWRkIGV4dHJhIGNoYXB0ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1hbnVhbCB3aGljaAotYXJlIHB1cmVseSB0dXRvcmlhbCBhbmQgY292ZXIgdGhlIGJhc2ljcyBvZiB0aGUgc3ViamVjdC4gIFRoZXNlIHByb3ZpZGUKLXRoZSBmcmFtZXdvcmsgZm9yIGEgYmVnaW5uZXIgdG8gdW5kZXJzdGFuZCB0aGUgcmVzdCBvZiB0aGUgbWFudWFsLiAgVGhlCi1CaXNvbiBtYW51YWwgcHJvdmlkZXMgYSBnb29kIGV4YW1wbGUgb2YgaG93IHRvIGRvIHRoaXMuCi0KLURvbid0IHVzZSBVbml4IG1hbiBwYWdlcyBhcyBhIG1vZGVsIGZvciBob3cgdG8gd3JpdGUgR05VIGRvY3VtZW50YXRpb247Ci1tb3N0IG9mIHRoZW0gYXJlIHRlcnNlLCBiYWRseSBzdHJ1Y3R1cmVkLCBhbmQgZ2l2ZSBpbmFkZXF1YXRlCi1leHBsYW5hdGlvbiBvZiB0aGUgdW5kZXJseWluZyBjb25jZXB0cy4gIChUaGVyZSBhcmUsIG9mIGNvdXJzZQotZXhjZXB0aW9ucy4pICBBbHNvIFVuaXggbWFuIHBhZ2VzIHVzZSBhIHBhcnRpY3VsYXIgZm9ybWF0IHdoaWNoIGlzCi1kaWZmZXJlbnQgZnJvbSB3aGF0IHdlIHVzZSBpbiBHTlUgbWFudWFscy4KLQotUGxlYXNlIGRvIG5vdCB1c2UgdGhlIHRlcm0gYGBwYXRobmFtZScnIHRoYXQgaXMgdXNlZCBpbiBVbml4Ci1kb2N1bWVudGF0aW9uOyB1c2UgYGBmaWxlIG5hbWUnJyAodHdvIHdvcmRzKSBpbnN0ZWFkLiAgV2UgdXNlIHRoZSB0ZXJtCi1gYHBhdGgnJyBvbmx5IGZvciBzZWFyY2ggcGF0aHMsIHdoaWNoIGFyZSBsaXN0cyBvZiBmaWxlIG5hbWVzLgotCi1QbGVhc2UgZG8gbm90IHVzZSB0aGUgdGVybSBgYGlsbGVnYWwnJyB0byByZWZlciB0byBlcnJvbmVvdXMgaW5wdXQgdG8gYQotY29tcHV0ZXIgcHJvZ3JhbS4gIFBsZWFzZSB1c2UgYGBpbnZhbGlkJycgZm9yIHRoaXMsIGFuZCByZXNlcnZlIHRoZSB0ZXJtCi1gYGlsbGVnYWwnJyBmb3IgdmlvbGF0aW9ucyBvZiBsYXcuCi0KLUBub2RlIE1hbnVhbCBTdHJ1Y3R1cmUgRGV0YWlscwotQHNlY3Rpb24gTWFudWFsIFN0cnVjdHVyZSBEZXRhaWxzCi0KLVRoZSB0aXRsZSBwYWdlIG9mIHRoZSBtYW51YWwgc2hvdWxkIHN0YXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtcyBvcgotcGFja2FnZXMgZG9jdW1lbnRlZCBpbiB0aGUgbWFudWFsLiAgVGhlIFRvcCBub2RlIG9mIHRoZSBtYW51YWwgc2hvdWxkCi1hbHNvIGNvbnRhaW4gdGhpcyBpbmZvcm1hdGlvbi4gIElmIHRoZSBtYW51YWwgaXMgY2hhbmdpbmcgbW9yZQotZnJlcXVlbnRseSB0aGFuIG9yIGluZGVwZW5kZW50IG9mIHRoZSBwcm9ncmFtLCBhbHNvIHN0YXRlIGEgdmVyc2lvbgotbnVtYmVyIGZvciB0aGUgbWFudWFsIGluIGJvdGggb2YgdGhlc2UgcGxhY2VzLgotCi1FYWNoIHByb2dyYW0gZG9jdW1lbnRlZCBpbiB0aGUgbWFudWFsIHNob3VsZCBzaG91bGQgaGF2ZSBhIG5vZGUgbmFtZWQKLUBzYW1we0B2YXJ7cHJvZ3JhbX0gSW52b2NhdGlvbn0gb3IgQHNhbXB7SW52b2tpbmcgQHZhcntwcm9ncmFtfX0uICBUaGlzCi1ub2RlICh0b2dldGhlciB3aXRoIGl0cyBzdWJub2RlcywgaWYgYW55KSBzaG91bGQgZGVzY3JpYmUgdGhlIHByb2dyYW0ncwotY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgaG93IHRvIHJ1biBpdCAodGhlIHNvcnQgb2YgaW5mb3JtYXRpb24gcGVvcGxlCi13b3VsZCBsb29rIGluIGEgbWFuIHBhZ2UgZm9yKS4gIFN0YXJ0IHdpdGggYW4gQHNhbXB7QEBleGFtcGxlfQotY29udGFpbmluZyBhIHRlbXBsYXRlIGZvciBhbGwgdGhlIG9wdGlvbnMgYW5kIGFyZ3VtZW50cyB0aGF0IHRoZSBwcm9ncmFtCi11c2VzLgotCi1BbHRlcm5hdGl2ZWx5LCBwdXQgYSBtZW51IGl0ZW0gaW4gc29tZSBtZW51IHdob3NlIGl0ZW0gbmFtZSBmaXRzIG9uZSBvZgotdGhlIGFib3ZlIHBhdHRlcm5zLiAgVGhpcyBpZGVudGlmaWVzIHRoZSBub2RlIHdoaWNoIHRoYXQgaXRlbSBwb2ludHMgdG8KLWFzIHRoZSBub2RlIGZvciB0aGlzIHB1cnBvc2UsIHJlZ2FyZGxlc3Mgb2YgdGhlIG5vZGUncyBhY3R1YWwgbmFtZS4KLQotVGhlcmUgd2lsbCBiZSBhdXRvbWF0aWMgZmVhdHVyZXMgZm9yIHNwZWNpZnlpbmcgYSBwcm9ncmFtIG5hbWUgYW5kCi1xdWlja2x5IHJlYWRpbmcganVzdCB0aGlzIHBhcnQgb2YgaXRzIG1hbnVhbC4KLQotSWYgb25lIG1hbnVhbCBkZXNjcmliZXMgc2V2ZXJhbCBwcm9ncmFtcywgaXQgc2hvdWxkIGhhdmUgc3VjaCBhIG5vZGUgZm9yCi1lYWNoIHByb2dyYW0gZGVzY3JpYmVkLgotCi1Abm9kZSBORVdTIEZpbGUKLUBzZWN0aW9uIFRoZSBORVdTIEZpbGUKLQotSW4gYWRkaXRpb24gdG8gaXRzIG1hbnVhbCwgdGhlIHBhY2thZ2Ugc2hvdWxkIGhhdmUgYSBmaWxlIG5hbWVkCi1AZmlsZXtORVdTfSB3aGljaCBjb250YWlucyBhIGxpc3Qgb2YgdXNlci12aXNpYmxlIGNoYW5nZXMgd29ydGgKLW1lbnRpb25pbmcuICBJbiBlYWNoIG5ldyByZWxlYXNlLCBhZGQgaXRlbXMgdG8gdGhlIGZyb250IG9mIHRoZSBmaWxlIGFuZAotaWRlbnRpZnkgdGhlIHZlcnNpb24gdGhleSBwZXJ0YWluIHRvLiAgRG9uJ3QgZGlzY2FyZCBvbGQgaXRlbXM7IGxlYXZlCi10aGVtIGluIHRoZSBmaWxlIGFmdGVyIHRoZSBuZXdlciBpdGVtcy4gIFRoaXMgd2F5LCBhIHVzZXIgdXBncmFkaW5nIGZyb20KLWFueSBwcmV2aW91cyB2ZXJzaW9uIGNhbiBzZWUgd2hhdCBpcyBuZXcuCi0KLUlmIHRoZSBAZmlsZXtORVdTfSBmaWxlIGdldHMgdmVyeSBsb25nLCBtb3ZlIHNvbWUgb2YgdGhlIG9sZGVyIGl0ZW1zCi1pbnRvIGEgZmlsZSBuYW1lZCBAZmlsZXtPTkVXU30gYW5kIHB1dCBhIG5vdGUgYXQgdGhlIGVuZCByZWZlcnJpbmcgdGhlCi11c2VyIHRvIHRoYXQgZmlsZS4KLQotQG5vZGUgQ2hhbmdlIExvZ3MKLUBzZWN0aW9uIENoYW5nZSBMb2dzCi0KLUtlZXAgYSBjaGFuZ2UgbG9nIHRvIGRlc2NyaWJlIGFsbCB0aGUgY2hhbmdlcyBtYWRlIHRvIHByb2dyYW0gc291cmNlCi1maWxlcy4gIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgc28gdGhhdCBwZW9wbGUgaW52ZXN0aWdhdGluZyBidWdzIGluIHRoZQotZnV0dXJlIHdpbGwga25vdyBhYm91dCB0aGUgY2hhbmdlcyB0aGF0IG1pZ2h0IGhhdmUgaW50cm9kdWNlZCB0aGUgYnVnLgotT2Z0ZW4gYSBuZXcgYnVnIGNhbiBiZSBmb3VuZCBieSBsb29raW5nIGF0IHdoYXQgd2FzIHJlY2VudGx5IGNoYW5nZWQuCi1Nb3JlIGltcG9ydGFudGx5LCBjaGFuZ2UgbG9ncyBjYW4gaGVscCB5b3UgZWxpbWluYXRlIGNvbmNlcHR1YWwKLWluY29uc2lzdGVuY2llcyBiZXR3ZWVuIGRpZmZlcmVudCBwYXJ0cyBvZiBhIHByb2dyYW0sIGJ5IGdpdmluZyB5b3UgYQotaGlzdG9yeSBvZiBob3cgdGhlIGNvbmZsaWN0aW5nIGNvbmNlcHRzIGFyb3NlIGFuZCB3aG8gdGhleSBjYW1lIGZyb20uCi0KLUBtZW51Ci0qIENoYW5nZSBMb2cgQ29uY2VwdHM6OiAgICAgICAgIAotKiBTdHlsZSBvZiBDaGFuZ2UgTG9nczo6ICAgICAgICAKLSogU2ltcGxlIENoYW5nZXM6OiAgICAgICAgICAgICAgCi0qIENvbmRpdGlvbmFsIENoYW5nZXM6OiAgICAgICAgIAotQGVuZCBtZW51Ci0KLUBub2RlIENoYW5nZSBMb2cgQ29uY2VwdHMKLUBzdWJzZWN0aW9uIENoYW5nZSBMb2cgQ29uY2VwdHMKLQotWW91IGNhbiB0aGluayBvZiB0aGUgY2hhbmdlIGxvZyBhcyBhIGNvbmNlcHR1YWwgYGB1bmRvIGxpc3QnJyB3aGljaAotZXhwbGFpbnMgaG93IGVhcmxpZXIgdmVyc2lvbnMgd2VyZSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCB2ZXJzaW9uLgotUGVvcGxlIGNhbiBzZWUgdGhlIGN1cnJlbnQgdmVyc2lvbjsgdGhleSBkb24ndCBuZWVkIHRoZSBjaGFuZ2UgbG9nCi10byB0ZWxsIHRoZW0gd2hhdCBpcyBpbiBpdC4gIFdoYXQgdGhleSB3YW50IGZyb20gYSBjaGFuZ2UgbG9nIGlzIGEKLWNsZWFyIGV4cGxhbmF0aW9uIG9mIGhvdyB0aGUgZWFybGllciB2ZXJzaW9uIGRpZmZlcmVkLgotCi1UaGUgY2hhbmdlIGxvZyBmaWxlIGlzIG5vcm1hbGx5IGNhbGxlZCBAZmlsZXtDaGFuZ2VMb2d9IGFuZCBjb3ZlcnMgYW4KLWVudGlyZSBkaXJlY3RvcnkuICBFYWNoIGRpcmVjdG9yeSBjYW4gaGF2ZSBpdHMgb3duIGNoYW5nZSBsb2csIG9yIGEKLWRpcmVjdG9yeSBjYW4gdXNlIHRoZSBjaGFuZ2UgbG9nIG9mIGl0cyBwYXJlbnQgZGlyZWN0b3J5LS1pdCdzIHVwIHRvCi15b3UuCi0KLUFub3RoZXIgYWx0ZXJuYXRpdmUgaXMgdG8gcmVjb3JkIGNoYW5nZSBsb2cgaW5mb3JtYXRpb24gd2l0aCBhIHZlcnNpb24KLWNvbnRyb2wgc3lzdGVtIHN1Y2ggYXMgUkNTIG9yIENWUy4gIFRoaXMgY2FuIGJlIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5Ci10byBhIEBmaWxle0NoYW5nZUxvZ30gZmlsZS4KLQotVGhlcmUncyBubyBuZWVkIHRvIGRlc2NyaWJlIHRoZSBmdWxsIHB1cnBvc2Ugb2YgdGhlIGNoYW5nZXMgb3IgaG93IHRoZXkKLXdvcmsgdG9nZXRoZXIuICBJZiB5b3UgdGhpbmsgdGhhdCBhIGNoYW5nZSBjYWxscyBmb3IgZXhwbGFuYXRpb24sIHlvdSdyZQotcHJvYmFibHkgcmlnaHQuICBQbGVhc2UgZG8gZXhwbGFpbiBpdC0tLWJ1dCBwbGVhc2UgcHV0IHRoZSBleHBsYW5hdGlvbgotaW4gY29tbWVudHMgaW4gdGhlIGNvZGUsIHdoZXJlIHBlb3BsZSB3aWxsIHNlZSBpdCB3aGVuZXZlciB0aGV5IHNlZSB0aGUKLWNvZGUuICBGb3IgZXhhbXBsZSwgYGBOZXcgZnVuY3Rpb24nJyBpcyBlbm91Z2ggZm9yIHRoZSBjaGFuZ2UgbG9nIHdoZW4KLXlvdSBhZGQgYSBmdW5jdGlvbiwgYmVjYXVzZSB0aGVyZSBzaG91bGQgYmUgYSBjb21tZW50IGJlZm9yZSB0aGUKLWZ1bmN0aW9uIGRlZmluaXRpb24gdG8gZXhwbGFpbiB3aGF0IGl0IGRvZXMuCi0KLUhvd2V2ZXIsIHNvbWV0aW1lcyBpdCBpcyB1c2VmdWwgdG8gd3JpdGUgb25lIGxpbmUgdG8gZGVzY3JpYmUgdGhlCi1vdmVyYWxsIHB1cnBvc2Ugb2YgYSBiYXRjaCBvZiBjaGFuZ2VzLgotCi1UaGUgZWFzaWVzdCB3YXkgdG8gYWRkIGFuIGVudHJ5IHRvIEBmaWxle0NoYW5nZUxvZ30gaXMgd2l0aCB0aGUgRW1hY3MKLWNvbW1hbmQgQGtiZHtNLXggYWRkLWNoYW5nZS1sb2ctZW50cnl9LiAgQW4gZW50cnkgc2hvdWxkIGhhdmUgYW4KLWFzdGVyaXNrLCB0aGUgbmFtZSBvZiB0aGUgY2hhbmdlZCBmaWxlLCBhbmQgdGhlbiBpbiBwYXJlbnRoZXNlcyB0aGUgbmFtZQotb2YgdGhlIGNoYW5nZWQgZnVuY3Rpb25zLCB2YXJpYWJsZXMgb3Igd2hhdGV2ZXIsIGZvbGxvd2VkIGJ5IGEgY29sb24uCi1UaGVuIGRlc2NyaWJlIHRoZSBjaGFuZ2VzIHlvdSBtYWRlIHRvIHRoYXQgZnVuY3Rpb24gb3IgdmFyaWFibGUuCi0KLUBub2RlIFN0eWxlIG9mIENoYW5nZSBMb2dzCi1Ac3Vic2VjdGlvbiBTdHlsZSBvZiBDaGFuZ2UgTG9ncwotCi1IZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGNoYW5nZSBsb2cgZW50cmllczoKLQotQGV4YW1wbGUKLSogcmVnaXN0ZXIuZWwgKGluc2VydC1yZWdpc3Rlcik6IFJldHVybiBuaWwuCi0oanVtcC10by1yZWdpc3Rlcik6IExpa2V3aXNlLgotCi0qIHNvcnQuZWwgKHNvcnQtc3Vicik6IFJldHVybiBuaWwuCi0KLSogdGV4LW1vZGUuZWwgKHRleC1iaWJ0ZXgtZmlsZSwgdGV4LWZpbGUsIHRleC1yZWdpb24pOgotUmVzdGFydCB0aGUgdGV4IHNoZWxsIGlmIHByb2Nlc3MgaXMgZ29uZSBvciBzdG9wcGVkLgotKHRleC1zaGVsbC1ydW5uaW5nKTogTmV3IGZ1bmN0aW9uLgotCi0qIGV4cHIuYyAoc3RvcmVfb25lX2FyZyk6IFJvdW5kIHNpemUgdXAgZm9yIG1vdmVfYmxvY2tfdG9fcmVnLgotKGV4cGFuZF9jYWxsKTogUm91bmQgdXAgd2hlbiBlbWl0dGluZyBVU0UgaW5zbnMuCi0qIHN0bXQuYyAoYXNzaWduX3Bhcm1zKTogUm91bmQgc2l6ZSB1cCBmb3IgbW92ZV9ibG9ja19mcm9tX3JlZy4KLUBlbmQgZXhhbXBsZQotCi1JdCdzIGltcG9ydGFudCB0byBuYW1lIHRoZSBjaGFuZ2VkIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIGluIGZ1bGwuICBEb24ndAotYWJicmV2aWF0ZSBmdW5jdGlvbiBvciB2YXJpYWJsZSBuYW1lcywgYW5kIGRvbid0IGNvbWJpbmUgdGhlbS4KLVN1YnNlcXVlbnQgbWFpbnRhaW5lcnMgd2lsbCBvZnRlbiBzZWFyY2ggZm9yIGEgZnVuY3Rpb24gbmFtZSB0byBmaW5kIGFsbAotdGhlIGNoYW5nZSBsb2cgZW50cmllcyB0aGF0IHBlcnRhaW4gdG8gaXQ7IGlmIHlvdSBhYmJyZXZpYXRlIHRoZSBuYW1lLAotdGhleSB3b24ndCBmaW5kIGl0IHdoZW4gdGhleSBzZWFyY2guCi0KLUZvciBleGFtcGxlLCBzb21lIHBlb3BsZSBhcmUgdGVtcHRlZCB0byBhYmJyZXZpYXRlIGdyb3VwcyBvZiBmdW5jdGlvbgotbmFtZXMgYnkgd3JpdGluZyBAc2FtcHsqIHJlZ2lzdGVyLmVsIChAe2luc2VydCxqdW1wLXRvQH0tcmVnaXN0ZXIpfTsKLXRoaXMgaXMgbm90IGEgZ29vZCBpZGVhLCBzaW5jZSBzZWFyY2hpbmcgZm9yIEBjb2Rle2p1bXAtdG8tcmVnaXN0ZXJ9IG9yCi1AY29kZXtpbnNlcnQtcmVnaXN0ZXJ9IHdvdWxkIG5vdCBmaW5kIHRoYXQgZW50cnkuCi0KLVNlcGFyYXRlIHVucmVsYXRlZCBjaGFuZ2UgbG9nIGVudHJpZXMgd2l0aCBibGFuayBsaW5lcy4gIFdoZW4gdHdvCi1lbnRyaWVzIHJlcHJlc2VudCBwYXJ0cyBvZiB0aGUgc2FtZSBjaGFuZ2UsIHNvIHRoYXQgdGhleSB3b3JrIHRvZ2V0aGVyLAotdGhlbiBkb24ndCBwdXQgYmxhbmsgbGluZXMgYmV0d2VlbiB0aGVtLiAgVGhlbiB5b3UgY2FuIG9taXQgdGhlIGZpbGUKLW5hbWUgYW5kIHRoZSBhc3RlcmlzayB3aGVuIHN1Y2Nlc3NpdmUgZW50cmllcyBhcmUgaW4gdGhlIHNhbWUgZmlsZS4KLQotQG5vZGUgU2ltcGxlIENoYW5nZXMKLUBzdWJzZWN0aW9uIFNpbXBsZSBDaGFuZ2VzCi0KLUNlcnRhaW4gc2ltcGxlIGtpbmRzIG9mIGNoYW5nZXMgZG9uJ3QgbmVlZCBtdWNoIGRldGFpbCBpbiB0aGUgY2hhbmdlCi1sb2cuCi0KLVdoZW4geW91IGNoYW5nZSB0aGUgY2FsbGluZyBzZXF1ZW5jZSBvZiBhIGZ1bmN0aW9uIGluIGEgc2ltcGxlIGZhc2hpb24sCi1hbmQgeW91IGNoYW5nZSBhbGwgdGhlIGNhbGxlcnMgb2YgdGhlIGZ1bmN0aW9uLCB0aGVyZSBpcyBubyBuZWVkIHRvIG1ha2UKLWluZGl2aWR1YWwgZW50cmllcyBmb3IgYWxsIHRoZSBjYWxsZXJzIHRoYXQgeW91IGNoYW5nZWQuICBKdXN0IHdyaXRlIGluCi10aGUgZW50cnkgZm9yIHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQsIGBgQWxsIGNhbGxlcnMgY2hhbmdlZC4nJwotCi1AZXhhbXBsZQotKiBrZXlib2FyZC5jIChGY29tbWFuZF9leGVjdXRlKTogTmV3IGFyZyBTUEVDSUFMLgotQWxsIGNhbGxlcnMgY2hhbmdlZC4KLUBlbmQgZXhhbXBsZQotCi1XaGVuIHlvdSBjaGFuZ2UganVzdCBjb21tZW50cyBvciBkb2Mgc3RyaW5ncywgaXQgaXMgZW5vdWdoIHRvIHdyaXRlIGFuCi1lbnRyeSBmb3IgdGhlIGZpbGUsIHdpdGhvdXQgbWVudGlvbmluZyB0aGUgZnVuY3Rpb25zLiAgSnVzdCBgYERvYwotZml4ZXMnJyBpcyBlbm91Z2ggZm9yIHRoZSBjaGFuZ2UgbG9nLgotCi1UaGVyZSdzIG5vIG5lZWQgdG8gbWFrZSBjaGFuZ2UgbG9nIGVudHJpZXMgZm9yIGRvY3VtZW50YXRpb24gZmlsZXMuCi1UaGlzIGlzIGJlY2F1c2UgZG9jdW1lbnRhdGlvbiBpcyBub3Qgc3VzY2VwdGlibGUgdG8gYnVncyB0aGF0IGFyZSBoYXJkCi10byBmaXguICBEb2N1bWVudGF0aW9uIGRvZXMgbm90IGNvbnNpc3Qgb2YgcGFydHMgdGhhdCBtdXN0IGludGVyYWN0IGluIGEKLXByZWNpc2VseSBlbmdpbmVlcmVkIGZhc2hpb24uICBUbyBjb3JyZWN0IGFuIGVycm9yLCB5b3UgbmVlZCBub3Qga25vdwotdGhlIGhpc3Rvcnkgb2YgdGhlIGVycm9uZW91cyBwYXNzYWdlOyBpdCBpcyBlbm91Z2ggdG8gY29tcGFyZSB3aGF0IHRoZQotZG9jdW1lbnRhdGlvbiBzYXlzIHdpdGggdGhlIHdheSB0aGUgcHJvZ3JhbSBhY3R1YWxseSB3b3Jrcy4KLQotQG5vZGUgQ29uZGl0aW9uYWwgQ2hhbmdlcwotQHN1YnNlY3Rpb24gQ29uZGl0aW9uYWwgQ2hhbmdlcwotCi1DIHByb2dyYW1zIG9mdGVuIGNvbnRhaW4gY29tcGlsZS10aW1lIEBjb2RleyNpZn0gY29uZGl0aW9uYWxzLiAgTWFueQotY2hhbmdlcyBhcmUgY29uZGl0aW9uYWw7IHNvbWV0aW1lcyB5b3UgYWRkIGEgbmV3IGRlZmluaXRpb24gd2hpY2ggaXMKLWVudGlyZWx5IGNvbnRhaW5lZCBpbiBhIGNvbmRpdGlvbmFsLiAgSXQgaXMgdmVyeSB1c2VmdWwgdG8gaW5kaWNhdGUgaW4KLXRoZSBjaGFuZ2UgbG9nIHRoZSBjb25kaXRpb25zIGZvciB3aGljaCB0aGUgY2hhbmdlIGFwcGxpZXMuCi0KLU91ciBjb252ZW50aW9uIGZvciBpbmRpY2F0aW5nIGNvbmRpdGlvbmFsIGNoYW5nZXMgaXMgdG8gdXNlIHNxdWFyZQotYnJhY2tldHMgYXJvdW5kIHRoZSBuYW1lIG9mIHRoZSBjb25kaXRpb24uCi0KLUhlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZSwgZGVzY3JpYmluZyBhIGNoYW5nZSB3aGljaCBpcyBjb25kaXRpb25hbCBidXQKLWRvZXMgbm90IGhhdmUgYSBmdW5jdGlvbiBvciBlbnRpdHkgbmFtZSBhc3NvY2lhdGVkIHdpdGggaXQ6Ci0KLUBleGFtcGxlCi0qIHh0ZXJtLmMgW1NPTEFSSVMyXTogSW5jbHVkZSBzdHJpbmcuaC4KLUBlbmQgZXhhbXBsZQotCi1IZXJlIGlzIGFuIGVudHJ5IGRlc2NyaWJpbmcgYSBuZXcgZGVmaW5pdGlvbiB3aGljaCBpcyBlbnRpcmVseQotY29uZGl0aW9uYWwuICBUaGlzIG5ldyBkZWZpbml0aW9uIGZvciB0aGUgbWFjcm8gQGNvZGV7RlJBTUVfV0lORE9XX1B9IGlzCi11c2VkIG9ubHkgd2hlbiBAY29kZXtIQVZFX1hfV0lORE9XU30gaXMgZGVmaW5lZDoKLQotQGV4YW1wbGUKLSogZnJhbWUuaCBbSEFWRV9YX1dJTkRPV1NdIChGUkFNRV9XSU5ET1dfUCk6IE1hY3JvIGRlZmluZWQuCi1AZW5kIGV4YW1wbGUKLQotSGVyZSBpcyBhbiBlbnRyeSBmb3IgYSBjaGFuZ2Ugd2l0aGluIHRoZSBmdW5jdGlvbiBAY29kZXtpbml0X2Rpc3BsYXl9LAotd2hvc2UgZGVmaW5pdGlvbiBhcyBhIHdob2xlIGlzIHVuY29uZGl0aW9uYWwsIGJ1dCB0aGUgY2hhbmdlcyB0aGVtc2VsdmVzCi1hcmUgY29udGFpbmVkIGluIGEgQHNhbXB7I2lmZGVmIEhBVkVfTElCTkNVUlNFU30gY29uZGl0aW9uYWw6Ci0KLUBleGFtcGxlCi0qIGRpc3BuZXcuYyAoaW5pdF9kaXNwbGF5KSBbSEFWRV9MSUJOQ1VSU0VTXTogSWYgWCwgY2FsbCB0Z2V0ZW50LgotQGVuZCBleGFtcGxlCi0KLUhlcmUgaXMgYW4gZW50cnkgZm9yIGEgY2hhbmdlIHRoYXQgdGFrZXMgYWZmZWN0IG9ubHkgd2hlbgotYSBjZXJ0YWluIG1hY3JvIGlzIEBlbXBoe25vdH0gZGVmaW5lZDoKLQotQGV4YW1wbGUKLShnZXRob3N0bmFtZSkgWyFIQVZFX1NPQ0tFVFNdOiBSZXBsYWNlIHdpdGggd2luc29jayB2ZXJzaW9uLgotQGVuZCBleGFtcGxlCi0KLUBub2RlIE1hbiBQYWdlcwotQHNlY3Rpb24gTWFuIFBhZ2VzCi0KLUluIHRoZSBHTlUgcHJvamVjdCwgbWFuIHBhZ2VzIGFyZSBzZWNvbmRhcnkuICBJdCBpcyBub3QgbmVjZXNzYXJ5IG9yCi1leHBlY3RlZCBmb3IgZXZlcnkgR05VIHByb2dyYW0gdG8gaGF2ZSBhIG1hbiBwYWdlLCBidXQgc29tZSBvZiB0aGVtIGRvLgotSXQncyB5b3VyIGNob2ljZSB3aGV0aGVyIHRvIGluY2x1ZGUgYSBtYW4gcGFnZSBpbiB5b3VyIHByb2dyYW0uCi0KLVdoZW4geW91IG1ha2UgdGhpcyBkZWNpc2lvbiwgY29uc2lkZXIgdGhhdCBzdXBwb3J0aW5nIGEgbWFuIHBhZ2UKLXJlcXVpcmVzIGNvbnRpbnVhbCBlZmZvcnQgZWFjaCB0aW1lIHRoZSBwcm9ncmFtIGlzIGNoYW5nZWQuICBUaGUgdGltZQoteW91IHNwZW5kIG9uIHRoZSBtYW4gcGFnZSBpcyB0aW1lIHRha2VuIGF3YXkgZnJvbSBtb3JlIHVzZWZ1bCB3b3JrLgotCi1Gb3IgYSBzaW1wbGUgcHJvZ3JhbSB3aGljaCBjaGFuZ2VzIGxpdHRsZSwgdXBkYXRpbmcgdGhlIG1hbiBwYWdlIG1heSBiZQotYSBzbWFsbCBqb2IuICBUaGVuIHRoZXJlIGlzIGxpdHRsZSByZWFzb24gbm90IHRvIGluY2x1ZGUgYSBtYW4gcGFnZSwgaWYKLXlvdSBoYXZlIG9uZS4KLQotRm9yIGEgbGFyZ2UgcHJvZ3JhbSB0aGF0IGNoYW5nZXMgYSBncmVhdCBkZWFsLCB1cGRhdGluZyBhIG1hbiBwYWdlIG1heQotYmUgYSBzdWJzdGFudGlhbCBidXJkZW4uICBJZiBhIHVzZXIgb2ZmZXJzIHRvIGRvbmF0ZSBhIG1hbiBwYWdlLCB5b3UgbWF5Ci1maW5kIHRoaXMgZ2lmdCBjb3N0bHkgdG8gYWNjZXB0LiAgSXQgbWF5IGJlIGJldHRlciB0byByZWZ1c2UgdGhlIG1hbgotcGFnZSB1bmxlc3MgdGhlIHNhbWUgcGVyc29uIGFncmVlcyB0byB0YWtlIGZ1bGwgcmVzcG9uc2liaWxpdHkgZm9yCi1tYWludGFpbmluZyBpdC0tLXNvIHRoYXQgeW91IGNhbiB3YXNoIHlvdXIgaGFuZHMgb2YgaXQgZW50aXJlbHkuICBJZgotdGhpcyB2b2x1bnRlZXIgbGF0ZXIgY2Vhc2VzIHRvIGRvIHRoZSBqb2IsIHRoZW4gZG9uJ3QgZmVlbCBvYmxpZ2VkIHRvCi1waWNrIGl0IHVwIHlvdXJzZWxmOyBpdCBtYXkgYmUgYmV0dGVyIHRvIHdpdGhkcmF3IHRoZSBtYW4gcGFnZSBmcm9tIHRoZQotZGlzdHJpYnV0aW9uIHVudGlsIHNvbWVvbmUgZWxzZSBhZ3JlZXMgdG8gdXBkYXRlIGl0LgotCi1XaGVuIGEgcHJvZ3JhbSBjaGFuZ2VzIG9ubHkgYSBsaXR0bGUsIHlvdSBtYXkgZmVlbCB0aGF0IHRoZQotZGlzY3JlcGFuY2llcyBhcmUgc21hbGwgZW5vdWdoIHRoYXQgdGhlIG1hbiBwYWdlIHJlbWFpbnMgdXNlZnVsIHdpdGhvdXQKLXVwZGF0aW5nLiAgSWYgc28sIHB1dCBhIHByb21pbmVudCBub3RlIG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFuCi1wYWdlIGV4cGxhaW5pbmcgdGhhdCB5b3UgZG9uJ3QgbWFpbnRhaW4gaXQgYW5kIHRoYXQgdGhlIFRleGluZm8gbWFudWFsCi1pcyBtb3JlIGF1dGhvcml0YXRpdmUuICBUaGUgbm90ZSBzaG91bGQgc2F5IGhvdyB0byBhY2Nlc3MgdGhlIFRleGluZm8KLWRvY3VtZW50YXRpb24uCi0KLUBub2RlIFJlYWRpbmcgb3RoZXIgTWFudWFscwotQHNlY3Rpb24gUmVhZGluZyBvdGhlciBNYW51YWxzCi0KLVRoZXJlIG1heSBiZSBub24tZnJlZSBib29rcyBvciBkb2N1bWVudGF0aW9uIGZpbGVzIHRoYXQgZGVzY3JpYmUgdGhlCi1wcm9ncmFtIHlvdSBhcmUgZG9jdW1lbnRpbmcuCi0KLUl0IGlzIG9rIHRvIHVzZSB0aGVzZSBkb2N1bWVudHMgZm9yIHJlZmVyZW5jZSwganVzdCBhcyB0aGUgYXV0aG9yIG9mIGEKLW5ldyBhbGdlYnJhIHRleHRib29rIGNhbiByZWFkIG90aGVyIGJvb2tzIG9uIGFsZ2VicmEuICBBIGxhcmdlIHBvcnRpb24KLW9mIGFueSBub24tZmljdGlvbiBib29rIGNvbnNpc3RzIG9mIGZhY3RzLCBpbiB0aGlzIGNhc2UgZmFjdHMgYWJvdXQgaG93Ci1hIGNlcnRhaW4gcHJvZ3JhbSB3b3JrcywgYW5kIHRoZXNlIGZhY3RzIGFyZSBuZWNlc3NhcmlseSB0aGUgc2FtZSBmb3IKLWV2ZXJ5b25lIHdobyB3cml0ZXMgYWJvdXQgdGhlIHN1YmplY3QuICBCdXQgYmUgY2FyZWZ1bCBub3QgdG8gY29weSB5b3VyCi1vdXRsaW5lIHN0cnVjdHVyZSwgd29yZGluZywgdGFibGVzIG9yIGV4YW1wbGVzIGZyb20gcHJlZXhpc3Rpbmcgbm9uLWZyZWUKLWRvY3VtZW50YXRpb24uICBDb3B5aW5nIGZyb20gZnJlZSBkb2N1bWVudGF0aW9uIG1heSBiZSBvazsgcGxlYXNlIGNoZWNrCi13aXRoIHRoZSBGU0YgYWJvdXQgdGhlIGluZGl2aWR1YWwgY2FzZS4KLQotQG5vZGUgTWFuYWdpbmcgUmVsZWFzZXMKLUBjaGFwdGVyIFRoZSBSZWxlYXNlIFByb2Nlc3MKLQotTWFraW5nIGEgcmVsZWFzZSBpcyBtb3JlIHRoYW4ganVzdCBidW5kbGluZyB1cCB5b3VyIHNvdXJjZSBmaWxlcyBpbiBhCi10YXIgZmlsZSBhbmQgcHV0dGluZyBpdCB1cCBmb3IgRlRQLiAgWW91IHNob3VsZCBzZXQgdXAgeW91ciBzb2Z0d2FyZSBzbwotdGhhdCBpdCBjYW4gYmUgY29uZmlndXJlZCB0byBydW4gb24gYSB2YXJpZXR5IG9mIHN5c3RlbXMuICBZb3VyIE1ha2VmaWxlCi1zaG91bGQgY29uZm9ybSB0byB0aGUgR05VIHN0YW5kYXJkcyBkZXNjcmliZWQgYmVsb3csIGFuZCB5b3VyIGRpcmVjdG9yeQotbGF5b3V0IHNob3VsZCBhbHNvIGNvbmZvcm0gdG8gdGhlIHN0YW5kYXJkcyBkaXNjdXNzZWQgYmVsb3cuICBEb2luZyBzbwotbWFrZXMgaXQgZWFzeSB0byBpbmNsdWRlIHlvdXIgcGFja2FnZSBpbnRvIHRoZSBsYXJnZXIgZnJhbWV3b3JrIG9mCi1hbGwgR05VIHNvZnR3YXJlLgotCi1AbWVudQotKiBDb25maWd1cmF0aW9uOjogICAgICAgICAgICAgICBIb3cgQ29uZmlndXJhdGlvbiBTaG91bGQgV29yawotKiBNYWtlZmlsZSBDb252ZW50aW9uczo6CU1ha2VmaWxlIENvbnZlbnRpb25zCi0qIFJlbGVhc2VzOjogICAgICAgICAgICAgICAgICAgIE1ha2luZyBSZWxlYXNlcwotQGVuZCBtZW51Ci0KLUBub2RlIENvbmZpZ3VyYXRpb24KLUBzZWN0aW9uIEhvdyBDb25maWd1cmF0aW9uIFNob3VsZCBXb3JrCi0KLUVhY2ggR05VIGRpc3RyaWJ1dGlvbiBzaG91bGQgY29tZSB3aXRoIGEgc2hlbGwgc2NyaXB0IG5hbWVkCi1AY29kZXtjb25maWd1cmV9LiAgVGhpcyBzY3JpcHQgaXMgZ2l2ZW4gYXJndW1lbnRzIHdoaWNoIGRlc2NyaWJlIHRoZQota2luZCBvZiBtYWNoaW5lIGFuZCBzeXN0ZW0geW91IHdhbnQgdG8gY29tcGlsZSB0aGUgcHJvZ3JhbSBmb3IuCi0KLVRoZSBAY29kZXtjb25maWd1cmV9IHNjcmlwdCBtdXN0IHJlY29yZCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHNvCi10aGF0IHRoZXkgYWZmZWN0IGNvbXBpbGF0aW9uLgotCi1PbmUgd2F5IHRvIGRvIHRoaXMgaXMgdG8gbWFrZSBhIGxpbmsgZnJvbSBhIHN0YW5kYXJkIG5hbWUgc3VjaCBhcwotQGZpbGV7Y29uZmlnLmh9IHRvIHRoZSBwcm9wZXIgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgY2hvc2VuIHN5c3RlbS4KLUlmIHlvdSB1c2UgdGhpcyB0ZWNobmlxdWUsIHRoZSBkaXN0cmlidXRpb24gc2hvdWxkIEBlbXBoe25vdH0gY29udGFpbiBhCi1maWxlIG5hbWVkIEBmaWxle2NvbmZpZy5ofS4gIFRoaXMgaXMgc28gdGhhdCBwZW9wbGUgd29uJ3QgYmUgYWJsZSB0bwotYnVpbGQgdGhlIHByb2dyYW0gd2l0aG91dCBjb25maWd1cmluZyBpdCBmaXJzdC4KLQotQW5vdGhlciB0aGluZyB0aGF0IEBjb2Rle2NvbmZpZ3VyZX0gY2FuIGRvIGlzIHRvIGVkaXQgdGhlIE1ha2VmaWxlLiAgSWYKLXlvdSBkbyB0aGlzLCB0aGUgZGlzdHJpYnV0aW9uIHNob3VsZCBAZW1waHtub3R9IGNvbnRhaW4gYSBmaWxlIG5hbWVkCi1AZmlsZXtNYWtlZmlsZX0uICBJbnN0ZWFkLCBpdCBzaG91bGQgaW5jbHVkZSBhIGZpbGUgQGZpbGV7TWFrZWZpbGUuaW59IHdoaWNoCi1jb250YWlucyB0aGUgaW5wdXQgdXNlZCBmb3IgZWRpdGluZy4gIE9uY2UgYWdhaW4sIHRoaXMgaXMgc28gdGhhdCBwZW9wbGUKLXdvbid0IGJlIGFibGUgdG8gYnVpbGQgdGhlIHByb2dyYW0gd2l0aG91dCBjb25maWd1cmluZyBpdCBmaXJzdC4KLQotSWYgQGNvZGV7Y29uZmlndXJlfSBkb2VzIHdyaXRlIHRoZSBAZmlsZXtNYWtlZmlsZX0sIHRoZW4gQGZpbGV7TWFrZWZpbGV9Ci1zaG91bGQgaGF2ZSBhIHRhcmdldCBuYW1lZCBAZmlsZXtNYWtlZmlsZX0gd2hpY2ggY2F1c2VzIEBjb2Rle2NvbmZpZ3VyZX0KLXRvIGJlIHJlcnVuLCBzZXR0aW5nIHVwIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gdGhhdCB3YXMgc2V0IHVwIGxhc3QKLXRpbWUuICBUaGUgZmlsZXMgdGhhdCBAY29kZXtjb25maWd1cmV9IHJlYWRzIHNob3VsZCBiZSBsaXN0ZWQgYXMKLWRlcGVuZGVuY2llcyBvZiBAZmlsZXtNYWtlZmlsZX0uCi0KLUFsbCB0aGUgZmlsZXMgd2hpY2ggYXJlIG91dHB1dCBmcm9tIHRoZSBAY29kZXtjb25maWd1cmV9IHNjcmlwdCBzaG91bGQKLWhhdmUgY29tbWVudHMgYXQgdGhlIGJlZ2lubmluZyBleHBsYWluaW5nIHRoYXQgdGhleSB3ZXJlIGdlbmVyYXRlZAotYXV0b21hdGljYWxseSB1c2luZyBAY29kZXtjb25maWd1cmV9LiAgVGhpcyBpcyBzbyB0aGF0IHVzZXJzIHdvbid0IHRoaW5rCi1vZiB0cnlpbmcgdG8gZWRpdCB0aGVtIGJ5IGhhbmQuCi0KLVRoZSBAY29kZXtjb25maWd1cmV9IHNjcmlwdCBzaG91bGQgd3JpdGUgYSBmaWxlIG5hbWVkIEBmaWxle2NvbmZpZy5zdGF0dXN9Ci13aGljaCBkZXNjcmliZXMgd2hpY2ggY29uZmlndXJhdGlvbiBvcHRpb25zIHdlcmUgc3BlY2lmaWVkIHdoZW4gdGhlCi1wcm9ncmFtIHdhcyBsYXN0IGNvbmZpZ3VyZWQuICBUaGlzIGZpbGUgc2hvdWxkIGJlIGEgc2hlbGwgc2NyaXB0IHdoaWNoLAotaWYgcnVuLCB3aWxsIHJlY3JlYXRlIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24uCi0KLVRoZSBAY29kZXtjb25maWd1cmV9IHNjcmlwdCBzaG91bGQgYWNjZXB0IGFuIG9wdGlvbiBvZiB0aGUgZm9ybQotQHNhbXB7LS1zcmNkaXI9QHZhcntkaXJuYW1lfX0gdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlIHNvdXJjZXMgYXJlIGZvdW5kCi0oaWYgaXQgaXMgbm90IHRoZSBjdXJyZW50IGRpcmVjdG9yeSkuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGJ1aWxkCi10aGUgcHJvZ3JhbSBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSwgc28gdGhhdCB0aGUgYWN0dWFsIHNvdXJjZSBkaXJlY3RvcnkKLWlzIG5vdCBtb2RpZmllZC4KLQotSWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBAc2FtcHstLXNyY2Rpcn0sIHRoZW4gQGNvZGV7Y29uZmlndXJlfSBzaG91bGQKLWNoZWNrIGJvdGggQGZpbGV7Ln0gYW5kIEBmaWxley4ufSB0byBzZWUgaWYgaXQgY2FuIGZpbmQgdGhlIHNvdXJjZXMuICBJZgotaXQgZmluZHMgdGhlIHNvdXJjZXMgaW4gb25lIG9mIHRoZXNlIHBsYWNlcywgaXQgc2hvdWxkIHVzZSB0aGVtIGZyb20KLXRoZXJlLiAgT3RoZXJ3aXNlLCBpdCBzaG91bGQgcmVwb3J0IHRoYXQgaXQgY2Fubm90IGZpbmQgdGhlIHNvdXJjZXMsIGFuZAotc2hvdWxkIGV4aXQgd2l0aCBub256ZXJvIHN0YXR1cy4KLQotVXN1YWxseSB0aGUgZWFzeSB3YXkgdG8gc3VwcG9ydCBAc2FtcHstLXNyY2Rpcn0gaXMgYnkgZWRpdGluZyBhCi1kZWZpbml0aW9uIG9mIEBjb2Rle1ZQQVRIfSBpbnRvIHRoZSBNYWtlZmlsZS4gIFNvbWUgcnVsZXMgbWF5IG5lZWQgdG8KLXJlZmVyIGV4cGxpY2l0bHkgdG8gdGhlIHNwZWNpZmllZCBzb3VyY2UgZGlyZWN0b3J5LiAgVG8gbWFrZSB0aGlzCi1wb3NzaWJsZSwgQGNvZGV7Y29uZmlndXJlfSBjYW4gYWRkIHRvIHRoZSBNYWtlZmlsZSBhIHZhcmlhYmxlIG5hbWVkCi1AY29kZXtzcmNkaXJ9IHdob3NlIHZhbHVlIGlzIHByZWNpc2VseSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQotVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IHNob3VsZCBhbHNvIHRha2UgYW4gYXJndW1lbnQgd2hpY2ggc3BlY2lmaWVzIHRoZQotdHlwZSBvZiBzeXN0ZW0gdG8gYnVpbGQgdGhlIHByb2dyYW0gZm9yLiAgVGhpcyBhcmd1bWVudCBzaG91bGQgbG9vayBsaWtlCi10aGlzOgotCi1AZXhhbXBsZQotQHZhcntjcHV9LUB2YXJ7Y29tcGFueX0tQHZhcntzeXN0ZW19Ci1AZW5kIGV4YW1wbGUKLQotRm9yIGV4YW1wbGUsIGEgU3VuIDMgbWlnaHQgYmUgQHNhbXB7bTY4ay1zdW4tc3Vub3M0LjF9LgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgbmVlZHMgdG8gYmUgYWJsZSB0byBkZWNvZGUgYWxsIHBsYXVzaWJsZQotYWx0ZXJuYXRpdmVzIGZvciBob3cgdG8gZGVzY3JpYmUgYSBtYWNoaW5lLiAgVGh1cywgQHNhbXB7c3VuMy1zdW5vczQuMX0KLXdvdWxkIGJlIGEgdmFsaWQgYWxpYXMuICBGb3IgbWFueSBwcm9ncmFtcywgQHNhbXB7dmF4LWRlYy11bHRyaXh9IHdvdWxkCi1iZSBhbiBhbGlhcyBmb3IgQHNhbXB7dmF4LWRlYy1ic2R9LCBzaW1wbHkgYmVjYXVzZSB0aGUgZGlmZmVyZW5jZXMKLWJldHdlZW4gVWx0cml4IGFuZCBAc2N7QlNEfSBhcmUgcmFyZWx5IG5vdGljZWFibGUsIGJ1dCBhIGZldyBwcm9ncmFtcwotbWlnaHQgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGVtLgotQGMgUmVhbCA0LjRCU0Qgbm93IHJ1bnMgb24gc29tZSBTdW5zLgotCi1UaGVyZSBpcyBhIHNoZWxsIHNjcmlwdCBjYWxsZWQgQGZpbGV7Y29uZmlnLnN1Yn0gdGhhdCB5b3UgY2FuIHVzZQotYXMgYSBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIHN5c3RlbSB0eXBlcyBhbmQgY2Fub25pY2FsaXplIGFsaWFzZXMuCi0KLU90aGVyIG9wdGlvbnMgYXJlIHBlcm1pdHRlZCB0byBzcGVjaWZ5IGluIG1vcmUgZGV0YWlsIHRoZSBzb2Z0d2FyZQotb3IgaGFyZHdhcmUgcHJlc2VudCBvbiB0aGUgbWFjaGluZSwgYW5kIGluY2x1ZGUgb3IgZXhjbHVkZSBvcHRpb25hbAotcGFydHMgb2YgdGhlIHBhY2thZ2U6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gLS1lbmFibGUtQHZhcntmZWF0dXJlfUBye1t9PUB2YXJ7cGFyYW1ldGVyfUBye119Ci1Db25maWd1cmUgdGhlIHBhY2thZ2UgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb3B0aW9uYWwgdXNlci1sZXZlbAotZmFjaWxpdHkgY2FsbGVkIEB2YXJ7ZmVhdHVyZX0uICBUaGlzIGFsbG93cyB1c2VycyB0byBjaG9vc2Ugd2hpY2gKLW9wdGlvbmFsIGZlYXR1cmVzIHRvIGluY2x1ZGUuICBHaXZpbmcgYW4gb3B0aW9uYWwgQHZhcntwYXJhbWV0ZXJ9IG9mCi1Ac2FtcHtub30gc2hvdWxkIG9taXQgQHZhcntmZWF0dXJlfSwgaWYgaXQgaXMgYnVpbHQgYnkgZGVmYXVsdC4KLQotTm8gQHNhbXB7LS1lbmFibGV9IG9wdGlvbiBzaG91bGQgQHN0cm9uZ3tldmVyfSBjYXVzZSBvbmUgZmVhdHVyZSB0bwotcmVwbGFjZSBhbm90aGVyLiAgTm8gQHNhbXB7LS1lbmFibGV9IG9wdGlvbiBzaG91bGQgZXZlciBzdWJzdGl0dXRlIG9uZQotdXNlZnVsIGJlaGF2aW9yIGZvciBhbm90aGVyIHVzZWZ1bCBiZWhhdmlvci4gIFRoZSBvbmx5IHByb3BlciB1c2UgZm9yCi1Ac2FtcHstLWVuYWJsZX0gaXMgZm9yIHF1ZXN0aW9ucyBvZiB3aGV0aGVyIHRvIGJ1aWxkIHBhcnQgb2YgdGhlIHByb2dyYW0KLW9yIGV4Y2x1ZGUgaXQuCi0KLUBpdGVtIC0td2l0aC1AdmFye3BhY2thZ2V9Ci1AYyBAcntbfT1AdmFye3BhcmFtZXRlcn1AcntdfQotVGhlIHBhY2thZ2UgQHZhcntwYWNrYWdlfSB3aWxsIGJlIGluc3RhbGxlZCwgc28gY29uZmlndXJlIHRoaXMgcGFja2FnZQotdG8gd29yayB3aXRoIEB2YXJ7cGFja2FnZX0uCi0KLUBjICBHaXZpbmcgYW4gb3B0aW9uYWwgQHZhcntwYXJhbWV0ZXJ9IG9mCi1AYyBAc2FtcHtub30gc2hvdWxkIG9taXQgQHZhcntwYWNrYWdlfSwgaWYgaXQgaXMgdXNlZCBieSBkZWZhdWx0LgotCi1Qb3NzaWJsZSB2YWx1ZXMgb2YgQHZhcntwYWNrYWdlfSBpbmNsdWRlIAotQHNhbXB7Z251LWFzfSAob3IgQHNhbXB7Z2FzfSksIEBzYW1we2dudS1sZH0sIEBzYW1we2dudS1saWJjfSwKLUBzYW1we2dkYn0sCi1Ac2FtcHt4fSwgCi1hbmQKLUBzYW1we3gtdG9vbGtpdH0uCi0KLURvIG5vdCB1c2UgYSBAc2FtcHstLXdpdGh9IG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgdG8gdXNlIHRvCi1maW5kIGNlcnRhaW4gZmlsZXMuICBUaGF0IGlzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHdoYXQgQHNhbXB7LS13aXRofQotb3B0aW9ucyBhcmUgZm9yLgotCi1AaXRlbSAtLW5mcAotVGhlIHRhcmdldCBtYWNoaW5lIGhhcyBubyBmbG9hdGluZyBwb2ludCBwcm9jZXNzb3IuCi0KLUBpdGVtIC0tZ2FzCi1UaGUgdGFyZ2V0IG1hY2hpbmUgYXNzZW1ibGVyIGlzIEdBUywgdGhlIEdOVSBhc3NlbWJsZXIuCi1UaGlzIGlzIG9ic29sZXRlOyB1c2VycyBzaG91bGQgdXNlIEBzYW1wey0td2l0aC1nbnUtYXN9IGluc3RlYWQuCi0KLUBpdGVtIC0teAotVGhlIHRhcmdldCBtYWNoaW5lIGhhcyB0aGUgWCBXaW5kb3cgU3lzdGVtIGluc3RhbGxlZC4KLVRoaXMgaXMgb2Jzb2xldGU7IHVzZXJzIHNob3VsZCB1c2UgQHNhbXB7LS13aXRoLXh9IGluc3RlYWQuCi1AZW5kIHRhYmxlCi0KLUFsbCBAY29kZXtjb25maWd1cmV9IHNjcmlwdHMgc2hvdWxkIGFjY2VwdCBhbGwgb2YgdGhlc2UgYGBkZXRhaWwnJwotb3B0aW9ucywgd2hldGhlciBvciBub3QgdGhleSBtYWtlIGFueSBkaWZmZXJlbmNlIHRvIHRoZSBwYXJ0aWN1bGFyCi1wYWNrYWdlIGF0IGhhbmQuICBJbiBwYXJ0aWN1bGFyLCB0aGV5IHNob3VsZCBhY2NlcHQgYW55IG9wdGlvbiB0aGF0Ci1zdGFydHMgd2l0aCBAc2FtcHstLXdpdGgtfSBvciBAc2FtcHstLWVuYWJsZS19LiAgVGhpcyBpcyBzbyB1c2VycyB3aWxsCi1iZSBhYmxlIHRvIGNvbmZpZ3VyZSBhbiBlbnRpcmUgR05VIHNvdXJjZSB0cmVlIGF0IG9uY2Ugd2l0aCBhIHNpbmdsZSBzZXQKLW9mIG9wdGlvbnMuCi0KLVlvdSB3aWxsIG5vdGUgdGhhdCB0aGUgY2F0ZWdvcmllcyBAc2FtcHstLXdpdGgtfSBhbmQgQHNhbXB7LS1lbmFibGUtfQotYXJlIG5hcnJvdzogdGhleSBAc3Ryb25ne2RvIG5vdH0gcHJvdmlkZSBhIHBsYWNlIGZvciBhbnkgc29ydCBvZiBvcHRpb24KLXlvdSBtaWdodCB0aGluayBvZi4gIFRoYXQgaXMgZGVsaWJlcmF0ZS4gIFdlIHdhbnQgdG8gbGltaXQgdGhlIHBvc3NpYmxlCi1jb25maWd1cmF0aW9uIG9wdGlvbnMgaW4gR05VIHNvZnR3YXJlLiAgV2UgZG8gbm90IHdhbnQgR05VIHByb2dyYW1zIHRvCi1oYXZlIGlkaW9zeW5jcmF0aWMgY29uZmlndXJhdGlvbiBvcHRpb25zLgotCi1QYWNrYWdlcyB0aGF0IHBlcmZvcm0gcGFydCBvZiB0aGUgY29tcGlsYXRpb24gcHJvY2VzcyBtYXkgc3VwcG9ydCBjcm9zcy1jb21waWxhdGlvbi4KLUluIHN1Y2ggYSBjYXNlLCB0aGUgaG9zdCBhbmQgdGFyZ2V0IG1hY2hpbmVzIGZvciB0aGUgcHJvZ3JhbSBtYXkgYmUKLWRpZmZlcmVudC4gIFRoZSBAY29kZXtjb25maWd1cmV9IHNjcmlwdCBzaG91bGQgbm9ybWFsbHkgdHJlYXQgdGhlCi1zcGVjaWZpZWQgdHlwZSBvZiBzeXN0ZW0gYXMgYm90aCB0aGUgaG9zdCBhbmQgdGhlIHRhcmdldCwgdGh1cyBwcm9kdWNpbmcKLWEgcHJvZ3JhbSB3aGljaCB3b3JrcyBmb3IgdGhlIHNhbWUgdHlwZSBvZiBtYWNoaW5lIHRoYXQgaXQgcnVucyBvbi4KLQotVGhlIHdheSB0byBidWlsZCBhIGNyb3NzLWNvbXBpbGVyLCBjcm9zcy1hc3NlbWJsZXIsIG9yIHdoYXQgaGF2ZSB5b3UsIGlzCi10byBzcGVjaWZ5IHRoZSBvcHRpb24gQHNhbXB7LS1ob3N0PUB2YXJ7aG9zdHR5cGV9fSB3aGVuIHJ1bm5pbmcKLUBjb2Rle2NvbmZpZ3VyZX0uICBUaGlzIHNwZWNpZmllcyB0aGUgaG9zdCBzeXN0ZW0gd2l0aG91dCBjaGFuZ2luZyB0aGUKLXR5cGUgb2YgdGFyZ2V0IHN5c3RlbS4gIFRoZSBzeW50YXggZm9yIEB2YXJ7aG9zdHR5cGV9IGlzIHRoZSBzYW1lIGFzCi1kZXNjcmliZWQgYWJvdmUuCi0KLUJvb3RzdHJhcHBpbmcgYSBjcm9zcy1jb21waWxlciByZXF1aXJlcyBjb21waWxpbmcgaXQgb24gYSBtYWNoaW5lIG90aGVyCi10aGFuIHRoZSBob3N0IGl0IHdpbGwgcnVuIG9uLiAgQ29tcGlsYXRpb24gcGFja2FnZXMgYWNjZXB0IGEKLWNvbmZpZ3VyYXRpb24gb3B0aW9uIEBzYW1wey0tYnVpbGQ9QHZhcntob3N0dHlwZX19IGZvciBzcGVjaWZ5aW5nIHRoZQotY29uZmlndXJhdGlvbiBvbiB3aGljaCB5b3Ugd2lsbCBjb21waWxlIHRoZW0sIGluIGNhc2UgdGhhdCBpcyBkaWZmZXJlbnQKLWZyb20gdGhlIGhvc3QuCi0KLVByb2dyYW1zIGZvciB3aGljaCBjcm9zcy1vcGVyYXRpb24gaXMgbm90IG1lYW5pbmdmdWwgbmVlZCBub3QgYWNjZXB0IHRoZQotQHNhbXB7LS1ob3N0fSBvcHRpb24sIGJlY2F1c2UgY29uZmlndXJpbmcgYW4gZW50aXJlIG9wZXJhdGluZyBzeXN0ZW0gZm9yCi1jcm9zcy1vcGVyYXRpb24gaXMgbm90IGEgbWVhbmluZ2Z1bCB0aGluZy4KLQotU29tZSBwcm9ncmFtcyBoYXZlIHdheXMgb2YgY29uZmlndXJpbmcgdGhlbXNlbHZlcyBhdXRvbWF0aWNhbGx5LiAgSWYKLXlvdXIgcHJvZ3JhbSBpcyBzZXQgdXAgdG8gZG8gdGhpcywgeW91ciBAY29kZXtjb25maWd1cmV9IHNjcmlwdCBjYW4gc2ltcGx5Ci1pZ25vcmUgbW9zdCBvZiBpdHMgYXJndW1lbnRzLgotCi1AY29tbWVudCBUaGUgbWFrZWZpbGUgc3RhbmRhcmRzIGFyZSBpbiBhIHNlcGFyYXRlIGZpbGUgdGhhdCBpcyBhbHNvCi1AY29tbWVudCBpbmNsdWRlZCBieSBtYWtlLnRleGluZm8uICBEb25lIGJ5IHJvbGFuZEBnbnUuYWkubWl0LmVkdSBvbiAxLzYvOTMuCi1AY29tbWVudCBGb3IgdGhpcyBkb2N1bWVudCwgdHVybiBjaGFwdGVycyBpbnRvIHNlY3Rpb25zLCBldGMuCi1AbG93ZXJzZWN0aW9ucwotQGluY2x1ZGUgbWFrZS1zdGRzLnRleGkKLUByYWlzZXNlY3Rpb25zCi0KLUBub2RlIFJlbGVhc2VzCi1Ac2VjdGlvbiBNYWtpbmcgUmVsZWFzZXMKLQotUGFja2FnZSB0aGUgZGlzdHJpYnV0aW9uIG9mIEBjb2Rle0ZvbyB2ZXJzaW9uIDY5Ljk2fSB1cCBpbiBhIGd6aXBwZWQgdGFyCi1maWxlIHdpdGggdGhlIG5hbWUgQGZpbGV7Zm9vLTY5Ljk2LnRhci5nen0uICBJdCBzaG91bGQgdW5wYWNrIGludG8gYQotc3ViZGlyZWN0b3J5IG5hbWVkIEBmaWxle2Zvby02OS45Nn0uCi0KLUJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIHRoZSBwcm9ncmFtIHNob3VsZCBuZXZlciBtb2RpZnkgYW55IG9mIHRoZSBmaWxlcwotY29udGFpbmVkIGluIHRoZSBkaXN0cmlidXRpb24uICBUaGlzIG1lYW5zIHRoYXQgYWxsIHRoZSBmaWxlcyB0aGF0IGZvcm0KLXBhcnQgb2YgdGhlIHByb2dyYW0gaW4gYW55IHdheSBtdXN0IGJlIGNsYXNzaWZpZWQgaW50byBAZGZue3NvdXJjZQotZmlsZXN9IGFuZCBAZGZue25vbi1zb3VyY2UgZmlsZXN9LiAgU291cmNlIGZpbGVzIGFyZSB3cml0dGVuIGJ5IGh1bWFucwotYW5kIG5ldmVyIGNoYW5nZWQgYXV0b21hdGljYWxseTsgbm9uLXNvdXJjZSBmaWxlcyBhcmUgcHJvZHVjZWQgZnJvbQotc291cmNlIGZpbGVzIGJ5IHByb2dyYW1zIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBNYWtlZmlsZS4KLQotTmF0dXJhbGx5LCBhbGwgdGhlIHNvdXJjZSBmaWxlcyBtdXN0IGJlIGluIHRoZSBkaXN0cmlidXRpb24uICBJdCBpcyBva2F5Ci10byBpbmNsdWRlIG5vbi1zb3VyY2UgZmlsZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbiwgcHJvdmlkZWQgdGhleSBhcmUKLXVwLXRvLWRhdGUgYW5kIG1hY2hpbmUtaW5kZXBlbmRlbnQsIHNvIHRoYXQgYnVpbGRpbmcgdGhlIGRpc3RyaWJ1dGlvbgotbm9ybWFsbHkgd2lsbCBuZXZlciBtb2RpZnkgdGhlbS4gIFdlIGNvbW1vbmx5IGluY2x1ZGUgbm9uLXNvdXJjZSBmaWxlcwotcHJvZHVjZWQgYnkgQmlzb24sIEBjb2Rle2xleH0sIEBUZVh7fSwgYW5kIEBjb2Rle21ha2VpbmZvfTsgdGhpcyBoZWxwcyBhdm9pZAotdW5uZWNlc3NhcnkgZGVwZW5kZW5jaWVzIGJldHdlZW4gb3VyIGRpc3RyaWJ1dGlvbnMsIHNvIHRoYXQgdXNlcnMgY2FuCi1pbnN0YWxsIHdoaWNoZXZlciBwYWNrYWdlcyB0aGV5IHdhbnQgdG8gaW5zdGFsbC4KLQotTm9uLXNvdXJjZSBmaWxlcyB0aGF0IG1pZ2h0IGFjdHVhbGx5IGJlIG1vZGlmaWVkIGJ5IGJ1aWxkaW5nIGFuZAotaW5zdGFsbGluZyB0aGUgcHJvZ3JhbSBzaG91bGQgQHN0cm9uZ3tuZXZlcn0gYmUgaW5jbHVkZWQgaW4gdGhlCi1kaXN0cmlidXRpb24uICBTbyBpZiB5b3UgZG8gZGlzdHJpYnV0ZSBub24tc291cmNlIGZpbGVzLCBhbHdheXMgbWFrZQotc3VyZSB0aGV5IGFyZSB1cCB0byBkYXRlIHdoZW4geW91IG1ha2UgYSBuZXcgZGlzdHJpYnV0aW9uLgotCi1NYWtlIHN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGRpc3RyaWJ1dGlvbiB1bnBhY2tzIChhcwotd2VsbCBhcyBhbnkgc3ViZGlyZWN0b3JpZXMpIGFyZSBhbGwgd29ybGQtd3JpdGFibGUgKG9jdGFsIG1vZGUgNzc3KS4KLVRoaXMgaXMgc28gdGhhdCBvbGQgdmVyc2lvbnMgb2YgQGNvZGV7dGFyfSB3aGljaCBwcmVzZXJ2ZSB0aGUKLW93bmVyc2hpcCBhbmQgcGVybWlzc2lvbnMgb2YgdGhlIGZpbGVzIGZyb20gdGhlIHRhciBhcmNoaXZlIHdpbGwgYmUKLWFibGUgdG8gZXh0cmFjdCBhbGwgdGhlIGZpbGVzIGV2ZW4gaWYgdGhlIHVzZXIgaXMgdW5wcml2aWxlZ2VkLgotCi1NYWtlIHN1cmUgdGhhdCBhbGwgdGhlIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24gYXJlIHdvcmxkLXJlYWRhYmxlLgotCi1NYWtlIHN1cmUgdGhhdCBubyBmaWxlIG5hbWUgaW4gdGhlIGRpc3RyaWJ1dGlvbiBpcyBtb3JlIHRoYW4gMTQKLWNoYXJhY3RlcnMgbG9uZy4gIExpa2V3aXNlLCBubyBmaWxlIGNyZWF0ZWQgYnkgYnVpbGRpbmcgdGhlIHByb2dyYW0KLXNob3VsZCBoYXZlIGEgbmFtZSBsb25nZXIgdGhhbiAxNCBjaGFyYWN0ZXJzLiAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcwotdGhhdCBzb21lIHN5c3RlbXMgYWRoZXJlIHRvIGEgZm9vbGlzaCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgUE9TSVgKLXN0YW5kYXJkLCBhbmQgcmVmdXNlIHRvIG9wZW4gYSBsb25nZXIgbmFtZSwgcmF0aGVyIHRoYW4gdHJ1bmNhdGluZyBhcwotdGhleSBkaWQgaW4gdGhlIHBhc3QuCi0KLURvbid0IGluY2x1ZGUgYW55IHN5bWJvbGljIGxpbmtzIGluIHRoZSBkaXN0cmlidXRpb24gaXRzZWxmLiAgSWYgdGhlIHRhcgotZmlsZSBjb250YWlucyBzeW1ib2xpYyBsaW5rcywgdGhlbiBwZW9wbGUgY2Fubm90IGV2ZW4gdW5wYWNrIGl0IG9uCi1zeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBzeW1ib2xpYyBsaW5rcy4gIEFsc28sIGRvbid0IHVzZSBtdWx0aXBsZQotbmFtZXMgZm9yIG9uZSBmaWxlIGluIGRpZmZlcmVudCBkaXJlY3RvcmllcywgYmVjYXVzZSBjZXJ0YWluIGZpbGUKLXN5c3RlbXMgY2Fubm90IGhhbmRsZSB0aGlzIGFuZCB0aGF0IHByZXZlbnRzIHVucGFja2luZyB0aGUKLWRpc3RyaWJ1dGlvbi4KLQotVHJ5IHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgZmlsZSBuYW1lcyB3aWxsIGJlIHVuaXF1ZSBvbiBNUy1ET1MuICBBCi1uYW1lIG9uIE1TLURPUyBjb25zaXN0cyBvZiB1cCB0byA4IGNoYXJhY3RlcnMsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYQotcGVyaW9kIGFuZCB1cCB0byB0aHJlZSBjaGFyYWN0ZXJzLiAgTVMtRE9TIHdpbGwgdHJ1bmNhdGUgZXh0cmEKLWNoYXJhY3RlcnMgYm90aCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBwZXJpb2QuICBUaHVzLAotQGZpbGV7Zm9vYmFyaGFja2VyLmN9IGFuZCBAZmlsZXtmb29iYXJoYWNrZXIub30gYXJlIG5vdCBhbWJpZ3VvdXM7IHRoZXkKLWFyZSB0cnVuY2F0ZWQgdG8gQGZpbGV7Zm9vYmFyaGEuY30gYW5kIEBmaWxle2Zvb2JhcmhhLm99LCB3aGljaCBhcmUKLWRpc3RpbmN0LgotCi1JbmNsdWRlIGluIHlvdXIgZGlzdHJpYnV0aW9uIGEgY29weSBvZiB0aGUgQGZpbGV7dGV4aW5mby50ZXh9IHlvdSB1c2VkCi10byB0ZXN0IHByaW50IGFueSBAZmlsZXsqLnRleGluZm99IG9yIEBmaWxleyoudGV4aX0gZmlsZXMuCi0KLUxpa2V3aXNlLCBpZiB5b3VyIHByb2dyYW0gdXNlcyBzbWFsbCBHTlUgc29mdHdhcmUgcGFja2FnZXMgbGlrZSByZWdleCwKLWdldG9wdCwgb2JzdGFjaywgb3IgdGVybWNhcCwgaW5jbHVkZSB0aGVtIGluIHRoZSBkaXN0cmlidXRpb24gZmlsZS4KLUxlYXZpbmcgdGhlbSBvdXQgd291bGQgbWFrZSB0aGUgZGlzdHJpYnV0aW9uIGZpbGUgYSBsaXR0bGUgc21hbGxlciBhdAotdGhlIGV4cGVuc2Ugb2YgcG9zc2libGUgaW5jb252ZW5pZW5jZSB0byBhIHVzZXIgd2hvIGRvZXNuJ3Qga25vdyB3aGF0Ci1vdGhlciBmaWxlcyB0byBnZXQuCi0KLUBjb250ZW50cwotCi1AYnllCi1Mb2NhbCB2YXJpYWJsZXM6Ci11cGRhdGUtZGF0ZS1sZWFkaW5nLXJlZ2V4cDogIkBjIFRoaXMgZGF0ZSBpcyBhdXRvbWFnaWNhbGx5IHVwZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGlzIGZpbGU6XG5Ac2V0IGxhc3R1cGRhdGUgIgotdXBkYXRlLWRhdGUtdHJhaWxpbmctcmVnZXhwOiAiIgotZXZhbDogKGxvYWQgIi9nZC9nbnVvcmcvdXBkYXRlLWRhdGUuZWwiKQotZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd1cGRhdGUtZGF0ZSkKLUVuZDoKZGlmZiAtLWdpdCBhL2dhcy9DT05UUklCVVRPUlMgYi9nYXMvQ09OVFJJQlVUT1JTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2ZkMDNlLi4wMDAwMDAwCi0tLSBhL2dhcy9DT05UUklCVVRPUlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotKFRoaXMgZmlsZSBpcyB1bmRlciBjb25zdHJ1Y3Rpb24uKQkJCS0qLSB0ZXh0IC0qLQotCi1JZiB5b3UndmUgY29udHJpYnV0ZWQgdG8gZ2FzIGFuZCB5b3VyIG5hbWUgaXNuJ3QgbGlzdGVkIGhlcmUsIGl0IGlzCi1ub3QgbWVhbnQgYXMgYSBzbGlnaHQuICBJIGp1c3QgZG9uJ3Qga25vdyBhYm91dCBpdC4gIEVtYWlsIG1lLAotcmFlYnVybkBjeWdudXMuY29tIGFuZCBJJ2xsIGNvcnJlY3QgdGhlIHNpdHVhdGlvbi4KLQotVGhpcyBmaWxlIHdpbGwgZXZlbnR1YWxseSBiZSBkZWxldGVkOiBUaGUgZ2VuZXJhbCBpbmZvIHdpbGwgZ28gaW50bwotdGhlIGRvY3VtZW50YXRpb24sIGFuZCBpbmZvIG9uIHNwZWNpZmljIGZpbGVzIHdpbGwgZ28gaW50byBhbiBBVVRIT1JTCi1maWxlLCBhcyByZXF1ZXN0ZWQgYnkgdGhlIEZTRi4KLQotKysrKysrKysrKysrKysrKwotCi1EZWFuIEVsc25lciB3cm90ZSB0aGUgb3JpZ2luYWwgZ2FzIGZvciB2YXguICBbbW9yZSBkZXRhaWxzP10KLQotSmF5IEZlbmxhc29uIG1haW50YWluZWQgZ2FzIGZvciBhIHdoaWxlLCBhZGRpbmcgc3VwcG9ydCBmb3IKLWdkYi1zcGVjaWZpYyBkZWJ1ZyBpbmZvcm1hdGlvbiBhbmQgdGhlIDY4ayBzZXJpZXMgbWFjaGluZXMsIG1vc3Qgb2YKLXRoZSBwcmVwcm9jZXNzaW5nIHBhc3MsIGFuZCBleHRlbnNpdmUgY2hhbmdlcyBpbiBtZXNzYWdlcy5jLAotaW5wdXQtZmlsZS5jLCB3cml0ZS5jLgotCi1LLiBSaWNoYXJkIFBpeGxleSBtYWludGFpbmVkIGdhcyBmb3IgYSB3aGlsZSwgYWRkaW5nIHZhcmlvdXMKLWVuaGFuY2VtZW50cyBhbmQgbWFueSBidWcgZml4ZXMsIGluY2x1ZGluZyBtZXJnaW5nIHN1cHBvcnQgZm9yIHNldmVyYWwKLXByb2Nlc3NvcnMsIGJyZWFraW5nIGdhcyB1cCB0byBoYW5kbGUgbXVsdGlwbGUgb2JqZWN0IGZpbGUgZm9ybWF0Ci1iYWNrZW5kcyAoaW5jbHVkaW5nIGhlYXZ5IHJld3JpdGUsIHRlc3RpbmcsIGFuIGludGVncmF0aW9uIG9mIHRoZSBjb2ZmCi1hbmQgYi5vdXQgYmFja2VuZHMpLCBhZGRpbmcgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgaGVhdnkgdGVzdGluZyBhbmQKLXZlcmlmaWNhdGlvbiBvZiBjcm9zcyBhc3NlbWJsZXJzIGFuZCBmaWxlIHNwbGl0cyBhbmQgcmVuYW1pbmcsCi1jb252ZXJ0ZWQgZ2FzIHRvIHN0cmljdGx5IGFuc2kgQyBpbmNsdWRpbmcgZnVsbCBwcm90b3R5cGVzLCBhZGRlZAotc3VwcG9ydCBmb3IgbTY4MFszNF0wICYgY3B1MzIsIGNvbnNpZGVyYWJsZSB3b3JrIG9uIGk5NjAgaW5jbHVkaW5nIGEKLWNvZmYgcG9ydCAoaW5jbHVkaW5nIGNvbnNpZGVyYWJsZSBhbW91bnRzIG9mIHJldmVyc2UgZW5naW5lZXJpbmcpLCBhCi1zcGFyYyBvcGNvZGUgZmlsZSByZXdyaXRlLCBkZWNzdGF0aW9uLCByczYwMDAsIGFuZCBocDMwMGhwdXggaG9zdAotcG9ydHMsIHVwZGF0ZWQgImtub3ciIGFzc2VydGlvbnMgYW5kIG1hZGUgdGhlbSB3b3JrLCBtdWNoIG90aGVyCi1yZW9yZ2FuaXphdGlvbiwgY2xlYW51cCwgYW5kIGxpbnQuCi0KLUtlbiBSYWVidXJuIGN1cnJlbnRseSBtYWludGFpbnMgZ2FzLCBhbmQgd3JvdGUgdGhlIGhpZ2gtbGV2ZWwgQkZECi1pbnRlcmZhY2UgY29kZSB0byByZXBsYWNlIG1vc3Qgb2YgdGhlIGNvZGUgaW4gZm9ybWF0LXNwZWNpZmljIEkvTwotbW9kdWxlcy4KLQotVGhlIG9yaWdpbmFsIFZheC1WTVMgc3VwcG9ydCB3YXMgY29udHJpYnV0ZWQgYnkgRGF2aWQgTC4gS2FzaHRhbi4KLUVyaWMgWW91bmdkYWxlIGFuZCBQYXQgUmFua2luIGhhdmUgZG9uZSBtdWNoIHdvcmsgd2l0aCBpdCBzaW5jZS4KLQotVGhlIEludGVsIDgwMzg2IG1hY2hpbmUgZGVzY3JpcHRpb24gd2FzIHdyaXR0ZW4gYnkgRWxpb3QgRHJlc3NlbGhhdXMuCi0KLU1pbmggVHJhbi1MZSBhdCBJbnRlbGxpQ29ycCBjb250cmlidXRlZCBzb21lIEFJWCAzODYgc3VwcG9ydC4KLQotVGhlIE1vdG9yb2xhIDg4ayBtYWNoaW5lIGRlc2NyaXB0aW9uIHdhcyBjb250cmlidXRlZCBieSBEZXZvbiBCb3dlbiBvZgotQnVmZmFsbyBVbml2ZXJzaXR5IGFuZCBUb3Jiam9ybiBHcmFubHVuZCBvZiB0aGUgU3dlZGlzaCBJbnN0aXR1dGUgb2YKLUNvbXB1dGVyIFNjaWVuY2UuCi0KLUtlaXRoIEtub3dsZXMgYXQgdGhlIE9wZW4gU29mdHdhcmUgRm91bmRhdGlvbiB3cm90ZSB0aGUgb3JpZ2luYWwgTUlQUwotYmFjayBlbmQgKHRjLW1pcHMuYywgdGMtbWlwcy5oKSwgYW5kIGNvbnRyaWJ1dGVkIFJvc2UgZm9ybWF0IHN1cHBvcnQKLXRoYXQgaGFzbid0IGJlZW4gbWVyZ2VkIGluIHlldC4gIFJhbHBoIENhbXBiZWxsIHdvcmtlZCB3aXRoIHRoZSBNSVBTCi1jb2RlIHRvIHN1cHBvcnQgYS5vdXQgZm9ybWF0LgotCi1TdXBwb3J0IGZvciB0aGUgWmlsb2cgWjhrIGFuZCBIaXRhY2hpIEg4LzMwMCwgSDgvNTAwIGFuZCBTSCBwcm9jZXNzb3JzCi0odGMtejhrLCB0Yy1oODMwMCwgdGMtaDg1MDAsIHRjLXNoKSwgYW5kIElFRUUgNjk1IG9iamVjdCBmaWxlIGZvcm1hdAotKG9iai1pZWVlKSwgd2FzIHdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFNvbHV0aW9ucy4KLVN0ZXZlIGFsc28gbW9kaWZpZWQgdGhlIENPRkYgYmFjayBlbmQgKG9iai1jb2ZmYmZkKSB0byB1c2UgQkZEIGZvcgotc29tZSBsb3ctbGV2ZWwgb3BlcmF0aW9ucywgZm9yIHVzZSB3aXRoIHRoZSBIaXRhY2hpLCAyOWsgYW5kIFppbG9nCi10YXJnZXRzLgotCi1Kb2huIEdpbG1vcmUgYnVpbHQgdGhlIEFNRCAyOTAwMCBzdXBwb3J0LCBhZGRlZCAuaW5jbHVkZSBzdXBwb3J0LCBhbmQKLXNpbXBsaWZpZWQgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygd2hpY2ggdmVyc2lvbnMgYWNjZXB0IHdoaWNoCi1wc2V1ZG8tb3BzLiAgSGUgdXBkYXRlZCB0aGUgNjhrIG1hY2hpbmUgZGVzY3JpcHRpb24gc28gdGhhdCBNb3Rvcm9sYSdzCi1vcGNvZGVzIGFsd2F5cyBwcm9kdWNlZCBmaXhlZC1zaXplIGluc3RydWN0aW9ucyAoZS5nLiBqc3IpLCB3aGlsZQotc3ludGhldGljIGluc3RydWN0aW9ucyByZW1haW5lZCBzaHJpbmthYmxlIChqYnNyKS4gIEpvaG4gZml4ZWQgbWFueQotYnVncywgaW5jbHVkaW5nIHRydWUgdGVzdGVkIGNyb3NzLWNvbXBpbGF0aW9uIHN1cHBvcnQsIGFuZCBvbmUgYnVnIGluCi1yZWxheGF0aW9uIHRoYXQgdG9vayBhIHdlZWsgYW5kIHJlcXVpcmVkIHRoZSBwcm92ZXJiaWFsIG9uZS1iaXQgZml4LgotCi1JYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cyBTb2x1dGlvbnMgbWVyZ2VkIHRoZSBNb3Rvcm9sYSBhbmQgTUlUCi1zeW50YXhlcyBmb3IgdGhlIDY4aywgY29tcGxldGVkIHN1cHBvcnQgZm9yIHNvbWUgQ09GRiB0YXJnZXRzICg2OGssCi1pMzg2IFNWUjMsIGFuZCBTQ08gVW5peCksIHdyb3RlIHRoZSBFQ09GRiBzdXBwb3J0IGJhc2VkIG9uIE1pY2hhZWwKLU1laXNzbmVyJ3MgbWlwcy10ZmlsZSBwcm9ncmFtLCB3cm90ZSB0aGUgUG93ZXJQQyBhbmQgUlMvNjAwMCBzdXBwb3J0LAotYW5kIG1hZGUgYSBmZXcgb3RoZXIgbWlub3IgcGF0Y2hlcy4gIEhlIGhhbmRsZWQgdGhlIGJpbnV0aWxzIHJlbGVhc2VzCi1mb3IgdmVyc2lvbnMgMi43IHRocm91Z2ggMi45LgotCi1EYXZpZCBFZGVsc29obiBjb250cmlidXRlZCBmaXhlcyBmb3IgdGhlIFBvd2VyUEMgYW5kIEFJWCBzdXBwb3J0LgotCi1TdGV2ZSBDaGFtYmVybGFpbiBtYWRlIGdhcyBhYmxlIHRvIGdlbmVyYXRlIGxpc3RpbmdzLgotCi1TdXBwb3J0IGZvciB0aGUgSFA5MDAwLzMwMCB3YXMgY29udHJpYnV0ZWQgYnkgR2xlbm4gRW5nZWwgb2YgSFAuCi0KLVN1cHBvcnQgZm9yIEVMRiBmb3JtYXQgZmlsZXMgaGFzIGJlZW4gd29ya2VkIG9uIGJ5IE1hcmsgRWljaGluIG9mCi1DeWdudXMgU29sdXRpb25zIChvcmlnaW5hbCwgaW5jb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiksIFBldGUKLUhvb2dlbmJvb20gYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCAoSFBQQSBtYWlubHkpLCBNaWNoYWVsIE1laXNzbmVyCi1vZiB0aGUgT3BlbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIChpMzg2IG1haW5seSksIGFuZCBLZW4gUmFlYnVybiBvZgotQ3lnbnVzIFNvbHV0aW9ucyAoc3BhcmMsIGluaXRpYWwgNjQtYml0IHN1cHBvcnQpLgotCi1TZXZlcmFsIGVuZ2luZWVycyBhdCBDeWdudXMgU29sdXRpb25zIGhhdmUgYWxzbyBwcm92aWRlZCBtYW55IHNtYWxsCi1idWcgZml4ZXMgYW5kIGNvbmZpZ3VyYXRpb24gZW5oYW5jZW1lbnRzLgotCi1UaGUgaW5pdGlhbCBBbHBoYSBzdXBwb3J0IHdhcyBjb250cmlidXRlZCBieSBDYXJuZWdpZS1NZWxsb24KLVVuaXZlcnNpdHkuICBBZGRpdGlvbmFsIHdvcmsgd2FzIGRvbmUgYnkgS2VuIFJhZWJ1cm4gb2YgQ3lnbnVzCi1Tb2x1dGlvbnMuICBSaWNoYXJkIEhlbmRlcnNvbiB0aGVuIHJld3JvdGUgbXVjaCBvZiB0aGUgQWxwaGEgc3VwcG9ydC4KLQotSWFuIERhbGwgdXBkYXRlZCB0aGUgc3VwcG9ydCBjb2RlIGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAzMjAwMAotc2VyaWVzLCBhbmQgYWRkZWQgc3VwcG9ydCBmb3IgTWFjaCAzIGFuZCBOZXRCU0QgcnVubmluZyBvbiB0aGUgUEM1MzIuCi0KLUtsYXVzIEthZW1wZiBwb3J0ZWQgdGhlIGFzc2VtYmxlciBhbmQgdGhlIGJpbnV0aWxzIHRvIG9wZW5WTVMvQWxwaGEuCi0KLVN0ZXZlIEhhd29ydGggY29udHJpYnV0ZWQgdGhlIHN1cHBvcnQgZm9yIHRoZSBUZXhhcyBJbnN0cnVjdGlvbiBjMzAKLSh0bXMzMjBjMzApLgotCi1ILkouIEx1IGhhcyBjb250cmlidXRlZCBtYW55IHBhdGNoZXMgYW5kIG11Y2ggdGVzdGluZy4KLQotQWxhbiBNb2RyYSByZXdvcmtlZCBtdWNoIG9mIHRoZSBpMzg2IGJhY2tlbmQsIGltcHJvdmluZyB0aGUgZXJyb3IKLWNoZWNraW5nLCB1cGRhdGluZyB0aGUgY29kZSwgYW5kIGltcHJvdmluZyB0aGUgMTYgYml0IHN1cHBvcnQsIHVzaW5nCi1wYXRjaGVzIGZyb20gdGhlIHdvcmsgb2YgTWFydHluYXMgS3VuaWdlbGlzIGFuZCBILkouIEx1LgotCi1NYW55IG90aGVycyBoYXZlIGNvbnRyaWJ1dGVkIGxhcmdlIG9yIHNtYWxsIGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMuICBJZgoteW91J3ZlIGNvbnRyaWJ1dGVkIHNpZ25pZmljYW50IHdvcmsgYW5kIGFyZSBub3QgbWVudGlvbmVkIG9uIHRoaXMgbGlzdCwgYW5kCi13YW50IHRvIGJlLCBsZXQgdXMga25vdy4gIFNvbWUgb2YgdGhlIGhpc3RvcnkgaGFzIGJlZW4gbG9zdDsgd2UgYXJlbid0Ci1pbnRlbnRpb25hbGx5IGxlYXZpbmcgYW55b25lIG91dC4KZGlmZiAtLWdpdCBhL2dhcy9DT1BZSU5HIGIvZ2FzL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvZ2FzL0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwotdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQotdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCi15b3VyIHByb2dyYW1zLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91Ci1kaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgotcmlnaHRzLgotCi0gIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKLSgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCi1kaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgotCi0gIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwotdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKLWF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCi1wcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCi1wcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKLXBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuCi0MCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0MCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCi1TZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCi0gICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCi0gICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCi0gICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQotICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCi0gICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKLSAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Ci1hc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KLWNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQotYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCi1hY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50Ci1hY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQwKLSAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1leGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0Ci1vdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKLXZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KLUhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCi10aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAotcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KLXRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotCi0gIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KLWFwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQwKLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0JICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKLWZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi0gIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Ci10byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9nYXMvQ2hhbmdlTG9nIGIvZ2FzL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmODg0NC4uMDAwMDAwMAotLS0gYS9nYXMvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNDg0NiArMCwwIEBACi1UdWUgTm92IDMwIDIyOjU5OjAwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICIuYW0zMyIgcHNldWRvLW9wLgotCShyX3JlZ2lzdGVycywgeHJfcmVnaXN0ZXJzKTogRGVmaW5lLgotCShyX3JlZ2lzdGVyX25hbWUsIHhyX3JlZ2lzdGVyX25hbWUpOiBOZXcgZnVuY3Rpb25zLgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSBuZXcgYW0zMyBvcGVyYW5kIHR5cGVzIGFuZCBpbnN0cnVjdGlvbgotCWZvcm1hdHMuCi0JKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQsIGNoZWNrX29wZXJhbmQpOiBMaWtld2lzZS4KLQotMTk5OS0xMS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jICh0aHVtYl9tb2RlKTogVHVybiBpbnRvIGEgdHJpc3RhdGUgdmFyaWFibGUuCi0JKHNfZm9yY2VfdGh1bWIpOiBTZXQgdGh1bWJfbW9kZSB0byAyLgotCShtZF9hc3NlbWJsZSk6IERvIG5vdCBjb21wbGFpbiBhYm91dCB0aHVtYiBpbnN0cnVjdGlvbnMgb24gYQotCW5vbi10aHVtYiB0YXJnZXQgaWYgdGh1bWJfbW9kZSBpcyBzZXQgdG8gMi4KLQotMTk5OS0xMS0yOCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jICh0b3BsZXZlbCk6IEluY2x1ZGUgc3RydWMtc3ltYm9sLmguCi0JKGFscGhhX21hY3JvX2FyZyk6IEFkZCBNQUNST197TElURVJBTCxCQVNFLEJZVE9GRixKU1J9IGNhc2VzLgotCShPXy4uLik6IEFkZCBuZXcgbWFjaGluZSBkZXBlbmRlbnQgZXhwcmVzc2lvbnMgaWYgd2UgYXJlIGhhbmRsaW5nCi0JZXhwbGljaXQgcmVsb2NhdGlvbnMuCi0JKGFscGhhX3JlbG9jX29wKTogTmV3IHN0YXRpYyB0YWJsZSBob2xkaW5nIHRoZSBleHBsaWNpdCByZWxvY2F0aW9uCi0JaW5mb3JtYXRpb24uCi0JKGFscGhhX2xpdGVyYWxfaGFzaCk6IE5ldyBzdGF0aWMgdG8gaG9sZCB0aGUgaGFzaCB0YWJsZSBmb3IKLQlleHBsaWNpdCByZWxvY2F0aW9ucy4KLQkoYWxwaGFfbWFjcm9zKTogQWRkIHN1cHBvcnQgZm9yIGV4cGxpY2l0IHJlbG9jYXRpb25zLgotCShtZF9iZWdpbik6IElmIGV4cGxpY2l0IHJlbG9jYXRpb25zLCBpbml0aWFsaXplIGhhc2ggdGFibGUuCi0JKG1kX2Fzc2VtYmxlKTogRG9uJ3QgcHJpbnQgYSBzZWNvbmQgZXJyb3IgaWYgdG9rZW5pemVfYXJndW1lbnRzCi0JYWxyZWFkeSBwcmludGVkIGFuIGVycm9yIG1lc3NhZ2UuCi0JKG1kX2FwcGx5X2ZpeCk6IEFkZCBzdXBwb3J0IGZvciBleHBsaWNpdCByZWxvY2F0aW9ucy4KLQkoYWxwaGFfZm9yY2VfcmVsb2NhdGlvbik6IERpdHRvLgotCShhbHBoYV9maXhfYWRqdXN0YWJsZSk6IERpdHRvLgotCShhbHBoYV9hZGp1c3Rfc3ltdGFiKTogTmV3IGZ1bmN0aW9uIHRvIHN1cHBvcnQgZXhwbGljaXQKLQlyZWxvY2F0aW9ucy4KLQkoYWxwaGFfYWRqdXN0X3N5bXRhYl9yZWxvY3MpOiBEaXR0by4KLQkoZGVidWdfZXhwKTogRGVidWcgc3R1YiBjb21waWxlZCBpZiBERUJVR19BTFBIQSBpcyBkZWZpbmVkLgotCSh0b2tlbml6ZV9hcmd1bWVudHMpOiBBZGQgZGVidWcgY29kZSBpZiBERUJVR19BTFBIQSBpcyBkZWZpbmVkLgotCUFkZCBzdXBwb3J0IGZvciBleHBsaWNpdCByZWxvY2F0aW9ucy4gIFJldHVybiAtMiBpZiBhbiBlcnJvcgotCW1lc3NhZ2Ugd2FzIGFscmVhZHkgcHJpbnRlZC4KLQkoZmluZF9tYWNyb19tYXRjaCk6IEFkZCBzdXBwb3J0IGZvciBleHBsaWNpdCByZWxvY2F0aW9ucy4gIENvbW1lbnQKLQllYWNoIG9mIHRoZSBjYXNlcy4KLQkoZW1pdF9pbnNuKTogQWRkIHN1cHBvcnQgZm9yIGV4cGxpY2l0IHJlbG9jYXRpb25zLgotCShhc3NlbWJsZV90b2tlbnMpOiBEaXR0by4KLQkoZW1pdF9sZGdwKTogRGl0dG8uCi0JKGxvYWRfZXhwcmVzc2lvbik6IERpdHRvLgotCShlbWl0X2xkYSk6IERpdHRvLgotCShlbWl0X2xkYWgpOiBEaXR0by4KLQkoZW1pdF9pcl9sb2FkKTogRGl0dG8uCi0JKGVtaXRfbG9hZHN0b3JlKTogRGl0dG8uCi0JKGVtaXRfbGRYdSk6IERpdHRvLgotCShlbWl0X2xkaWwpOiBEaXR0by4KLQkoZW1pdF9zZXh0WCk6IERpdHRvLgotCShlbWl0X2RpdmlzaW9uKTogRGl0dG8uCi0JKGVtaXRfanNyam1wKTogRGl0dG8uCi0JKGVtaXRfcmV0amNyKTogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChSRUxPQ19PUF9QKTogRW5hYmxlIGV4cGxpY2l0IHJlbG9jYXRpb25zIGlmCi0JRUxGIG9iamVjdCBmb3JtYXQuCi0JKHRjX2FkanVzdF9zeW10YWIpOiBJZiBleHBsaWNpdCByZWxvY2F0aW9ucywgY2FsbCB0aGUgZnVuY3Rpb24KLQlhbHBoYV9hZGp1c3Rfc3ltdGFiLgotCShUQ19GSVhfVFlQRSk6IEFkZCBmaWVsZHMgdG8gYmUgYWJsZSB0byBtb3ZlIGV4cGxpY2l0IGxpdHVzZQotCXJlbG9jYXRpb25zIG5leHQgdG8gdGhlIGxpdGVyYWwgcmVsb2NhdGlvbiB0aGV5IHJlZmVyZW5jZS4KLQkoVENfSU5JVF9GSVhfREFUQSk6IEluaXRpYWxpemUgdGhlIG5ldyBmaWVsZHMuCi0JKFRDX0ZJWF9EQVRBX1BSSU5UKTogUHJpbnQgdGhlIG5ldyBmaWVsZHMgaWYgREVCVUc1IGlzIGRlZmluZWQuCi0KLVdlZCBOb3YgMjQgMjA6Mjc6NTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEhhbmRsZSBQQTIuMCB1bml0IGNvbXBsZXRlcnMuICBIYW5kbGUKLQknQicgb3BlcmFuZCBmb3IgUEEyLjAgYmIgaW5zdHJ1Y3Rpb24uCi0JCi0xOTk5LTExLTE4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZSBmb3IgTWNvcmUtcGUKLQl0YXJnZXQuCi0JCi0JKiBjb25maWcvdGMtbWNvcmUuYyAodGNfZ2VuX3JlbG9jKTogU3VwcG9ydCBnZW5lcmF0aW9uIG9mIFJWQQotCXJlbG9jcy4KLQkobWNvcmVfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIHJlbG9jYXRpb25zIHRvIGJlIGdlbmVyYXRlZCBmb3IKLQlSVkEgcmVsb2NzLgotCi0xOTk5LTExLTE2ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfaW1tZWRpYXRlKTogRGlzYWxsb3cgT19iaWcgaW1tZWRpYXRlcy4KLQkoaTM4Nl9kaXNwbGFjZW1lbnQpOiBEaXNhbGxvdyBPX2JpZyBkaXNwbGFjZW1lbnRzLgotCi1Nb24gTm92IDE1IDIwOjEyOjQzIDE5OTkgIERvbmFsZCBMaW5kc2F5ICA8ZGxpbmRzYXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChkb19taWEsZG9fbWFyLGRvX21yYSxkb19wbGQsZG9fbGRybCxkb19jb19yZWcpOiBTbWFsbAotCWltcHJvdmVtZW50cyBpbiBlcnJvciBjaGVja2luZy4KLQkobWRfYXNzZW1ibGUpOiBTdXBwb3J0IGZvciB1bmNvbmRpdGlvbmFsIEFSTSBpbnN0cnVjdGlvbnMuCi0JKG1kX3BhcnNlX29wdGlvbik6IFN1cHBvcnQgZm9yIC1tW2FybV12NWUgZmxhZy4KLQotMTk5OS0xMS0xMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWFjcm8uYyAoYnVmZmVyX2FuZF9uZXN0KTogRG8gbm90IGNoZWNrIGJleW9uZCB0aGUgZW5kIG9mIHRoZQotCWJ1ZmZlci4gCi0KLTE5OTktMTEtMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1hY3JvLmMgKGJ1ZmZlcl9hbmRfbmVzdCk6IExvb2sgZm9yIHNlcGVyYXRvciBhZnRlciBUTyBhbmQKLQlGUk9NIHRva2Vucy4KLQotMTk5OS0xMS0wOCAgQW5kcmV3IEhhbGV5ICA8YXBoQGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IFdoZW4gaW4gU3RhdGUgMTAsIHRyZWF0IGJhY2tzbGFzaAotCWNoYXJhY3RlcnMgaW4gdGhlIHNhbWUgd2F5IGFzIGFzIHN5bWJvbCBjaGFyYWN0ZXJzLgotCi0xOTk5LTExLTA3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfYWxpZ24pOiBDaGVjaywgZG9uJ3QgYXNzZXJ0LCB0aGF0Ci0JdGhlIHByZXZpb3VzIGxhYmVsIHdhcyBpbiB0aGUgY3VycmVudCBzZWN0aW9uIGJlZm9yZSBwbGF5aW5nCi0Jd2l0aCBhdXRvLWFsaWdubWVudC4KLQotMTk5OS0xMS0wNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgcmVsb2NhdGlvbgotICAgICAgICBmb3Igd2VhayBzeW1ib2xzLgotCSh2ODUwX3BjcmVsX2Zyb21fc2VsZWN0aW9uKTogRG8gbm90IGNvbXB1dGUgYSBwY3JlbCBvZmZzZXQgaWYKLSAgICAgICAgdGhlIHN5bWJvbCBpcyB3ZWFrLgotCi0xOTk5LTExLTA1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZXhwci5oIChvcGVyYXRvclQpOiBJbmNyZWFzZSBtYWNoaW5lIGRlcGVuZGVudCBvcGVyYXRvcnMgdG8gMTYuCi0JKiBleHByLmMgKG9wX3JhbmspOiBEaXR0by4KLQotMTk5OS0xMS0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHJlYWQuYyAocHNldWRvX3NldCk6IFJlamVjdCBhdHRlbXB0cyB0byBzZXQgdGhlIHZhbHVlIG9mIGEKLQlzZWN0aW9uIHN5bWJvbC4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pZGVudCk6IENhbGwgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLQlpZiBpdCBpcyBkZWZpbmVkLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfc2V0X2luZGV4KTogQWRkIEFUVFJJQlVURV9VTlVTRUQuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogRG9uJ3QgcGFzcyBOVUxMCi0JdG8gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzLgotCi0xOTk5LTExLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBDaGFuZ2UgdG8gZmFsc2UuCi0KLTE5OTktMTEtMDEgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IFVzZSBPUENPREVfSVNfTUVNQkVSLgotCShtaXBzX2lwKTogVXNlIE9QQ09ERV9JU19NRU1CRVIuCi0KLVdlZCBPY3QgMjcgMTY6NTA6NDQgMTk5OSAgRG9uIExpbmRzYXkgIDxkbGluZHNheUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHJlZ19yZXF1aXJlZF9oZXJlKTogSW1wcm92ZSBjb21tZW50cy4KLQotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYyAodGh1bWJfb3Bjb2RlKTogQWRkICJ2YXJpYW50cyIgZmllbGQuCi0gICAgICAgICh0aW5zbnMpOiBJbml0aWFsaXplIHZhcmlhbnRzIGZpZWxkLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGJhZF9hcmdzLCBiYWRfcGMpOiBSZW5hbWVkIHRvIEJBRF9BUkdTIGFuZAotCUJBRF9QQyByZXNwZWN0aXZlbHkuCi0KLTE5OTktMTAtMjcgIFNjb3R0IEJhbWJyb3VnaCAgPHNjb3R0YkBuZXR3aW5kZXIub3JnPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHJlbG9jX21hcFtdKTogRml4IGNvbXBpbGVyIHdhcm5pbmcuCi0JKiBjb25maWcvdGMtYXJtLmg6IEZpeCBjb21waWxlIHRpbWUgd2FybmluZ3MuCi0KLU1vbiBPY3QgMTggMTg6MTE6MTAgTURUIDE5OTkJRGllZ28gTm92aWxsbyA8ZG5vdmlsbG9AY3lnbnVzLmNvbT4KLQotCSogdGNfZDEwdi5jIChmaW5kX29wY29kZSk6IEFsbG93IEFUU0lHTiB0byBtYXRjaCBleHByZXNzaW9ucyBvZiB0aGUKLQlmb3JtIEBhYnMxNiwgQChhYnMxNikgYW5kIEAoYWJzMTYgKyBpbW0pLgotCi0xOTk5LTEwLTIxICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoSVNBX0hBU19DT1BST0NfREVMQVlTKSA6IE5ldy4KLQkoSVNBX0hBU182NF9CSVRfUkVHUykgTmV3LgotCShncHJfaW50ZXJsb2NrcyxtZF9iZWdpbixyZWdfbmVlZHNfZGVsYXksYXBwZW5kX2luc24sCi0JbWlwc19lbWl0X2RlbGF5cyxtYWNyb19idWlsZCxsb2FkX3JlZ2lzdGVyLGxvYWRfYWRkcmVzc3MsCi0JbWFjcm8sbWFjcm8yLG1pcHNfaXAsc19jcHJlc3RvcmUsc19jcGFkZCk6IFNpbXBsaWZ5Ci0JYW5kL29yIHVzZSBuZXcgSVNBX3h4eCBtYWNyb3MgaW4gZXhwcmVzc2lvbnMgaW52b2x2aW5nCi0JSVNBLCBwYXJ0aWN1bGFybHkgbWlwc19vcHRzLmlzYS4KLQotMTk5OS0xMC0xOCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuaCAob3BlcmF0b3JUKTogQWRkIG1hY2hpbmUgZGVwZW5kZW50IG9wZXJhdG9ycyBtZDEuLm1kOC4KLQkoZXhwcmVzc2lvblMpOiBNYWtlIFhfb3AgOCBiaXRzIGluc3RlYWQgb2YgNy4gIEFkZCBhIFhfbWQgZmllbGQKLQlmb3IgdGhlIG1hY2hpbmUgZGVwZW5kZW50IG9wZXJhdG9ycyB0byB1c2UuCi0KLQkqIGV4cHIuYyAob3BfcmFuayk6IEFkZCBtYWNoaW5lIGRlcGVuZGVudCBvcGVyYXRvcnMuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChPX3ByZWdpc3Rlcik6IERlZmluZSBhcyBhIG1hY2hpbmUgZGVwZW5kZW50Ci0Jb3BlcmF0b3IuCi0JKE9fY3ByZWdpc3Rlcik6IERpdHRvLgotCShtZF9iZWdpbik6IENoYW5nZSBYX29wIHRlc3QgdGhhdCBmaWVsZCBpcyB3aWRlIGVub3VnaCB0byB1c2UKLQlPX21heCBpbnN0ZWFkIG9mIE9fYWxwaGFfbWF4LgotCShjcHVfdHlwZXMpOiBGaWxsIGluIG1pc3NpbmcgaW5pdGlhbGl6ZXIuCi0JKGFscGhhX251bV9tYWNyb3MpOiBNYWtlIHVuc2lnbmVkLgotCShtZF9hc3NlbWJsZSk6IE1ha2Ugb3BuYW1lbGVuIGJlIHNpemVfdC4KLQkobWRfYXBwbHlfZml4KTogQ2FzdCBhbHBoYV9udW1fb3BlcmFuZHMgdG8gaW50IGJlZm9yZSB0ZXN0aW5nLgotCShhbHBoYV9mb3JjZV9yZWxvY2F0aW9uKTogRGl0dG8uCi0JKGFscGhhX2ZpeF9hZGp1c3RhYmxlKTogRGl0dG8uCi0JKGFscGhhX2ZpeF9hZGp1c3RhYmxlKTogTWFyayB1bnVzZWQgYXJndW1lbnRzIEFUVFJJQlVURV9VTlVTRUQuCi0JKHRjX2dlbl9yZWxvYyk6IERpdHRvLgotCSh0Y19nZXRfcmVnaXN0ZXIpOiBEaXR0by4KLQkoZW1pdF9sZGdwKTogRGl0dG8uCi0JKGVtaXRfbGRhKTogRGl0dG8uCi0JKGVtaXRfbGRhaCk6IERpdHRvLgotCShlbWl0X2xkaWwpOiBEaXR0by4KLQkoc19hbHBoYV9lbnQpOiBEaXR0by4KLQkoc19hbHBoYV9lbmQpOiBEaXR0by4KLQkoc19hbHBoYV9mcmFtZSk6IERpdHRvLgotCShzX2FscGhhX3Byb2xvZ3VlKTogRGl0dG8uCi0JKHNfYWxwaGFfZmlsZSk6IERpdHRvLgotCShzX2FscGhhX2dwcmVsMzIpOiBEaXR0by4KLQkoc19hbHBoYV9wcm9jKTogRGl0dG8uCi0JKHNfYWxwaGFfc2V0KTogRGl0dG8uCi0JKHNfYWxwaGFfYmFzZSk6IERpdHRvLgotCShzX2FscGhhX2FsaWduKTogRGl0dG8uCi0JKHNfYWxwaGFfYXJjaCk6IERpdHRvLgotCShhbHBoYV9hbGlnbik6IERpdHRvLgotCShhc3NlbWJsZV9pbnNuKTogU3VwcHJlc3MgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcuCi0JKGVtaXRfaW5zbik6IERpdHRvLgotCShhc3NlbWJsZV9pbnNuKTogRG9uJ3QgYXNzdW1lIFhfb3AgYW5kIFhfdW5zaWduZWQgYXJlIGluIGEgZ2l2ZW4KLQlvcmRlciBpbiB0aGUgc3RydWN0dXJlLgotCShzX2FscGhhX2NvZmZfd3JhcHBlcik6IEF2b2lkIGludC91bnNpZ25lZCBjb21wYXJpc29uLgotCi1TdW4gT2N0IDE3IDE3OjE1OjU4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogTWFrZSAiZm10IiBhbiBpbnQuCi0KLTE5OTktMTAtMTIgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbmRleF9jaGVjayk6IENvcnJlY3QgI2VuZGlmIGxvY2F0aW9uLgotCi1Nb24gT2N0IDExIDE0OjAyOjQwIDE5OTkgIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IERvY3VtZW50IG5ldyBvcHRpb25zLgotCShwYXJzZV9hcmdzKTogQWRkIC0tbm8td2FybiwgLS13YXJuLCAtLWZhdGFsLXdhcm5pbmdzLAotCXdoaWNoIGJlY29tZSAnVycsIE9QVElPTl9XQVJOLCBhbmQgT1BUSU9OX1dBUk5fRkFUQUwuCi0JKHBhcnNlX2FyZ3MpOiBQYXJzZSB0aGUgbmV3IG9wdGlvbnMuCi0JKG1haW4pOiBJZiB0aGVyZSB3ZXJlIHdhcm5pbmdzLCBhbmQgLS1mYXRhbC13YXJuaW5ncwotCXdhcyBzcGVjaWZpZWQsIHByaW50IGFuIGVycm9yLgotCSogYXMuaDogTmV3IHZhcmlhYmxlLCBmbGFnX2ZhdGFsX3dhcm5pbmdzLCBmb3IgbmV3IG9wdGlvbi4KLQotU3VuIE9jdCAxMCAwMTo0NzoyMyAxOTk5ICBKZXJyeSBRdWlubiA8amVycnkucXVpbm4uYWR2OTFAYWx1bS5kYXJ0bW91dGgub3JnPgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6ICBBZGQgbmV3IGNvZGVzICdjYycsICdjZCcsICdjQycsICdjbycsCi0JJ0AnLiAgQ2hhbmdlIGF1dG9pbmNyZW1lbnQgY29tcGxldGVycyB0byBmYWxsIHRocm91Z2ggdG8gY2FjaGUgY29udHJvbAotCWNvbXBsZXRlcnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogIFJlbW92ZSB1bnVzZWQgYXJncy4gIEFkZCBjb2RlIHRvICc/VycKLQlhcmcuIAotCShwYV9wYXJzZV9hZGRiXzY0X2NtcGx0cik6ICBOZXcgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogIENoYW5nZSBlcnJvciBtZXNzYWdlLgotCShwYV9pcCxwYV9wYXJzZV9jbXBiXzY0X2NtcGx0cixwYV9wYXJzZV9jbXBpYl82NF9jbXBsdHIpICBGaXggJz9OJyBhbmQKLQknP1EnIGFyZ3MgdG8gYWxsb3cgZmFsbGluZyB0aHJvdWdoLgotCi0JKiBjb25maWd0Yy1ocHBhLmMgKHBhX2lwKTogIEltcGxlbWVudCBjb25kaXRpb25hbCBjb2RlcyAiP04iLCAiP1EiLgotCVJlbW92ZSB1bnVzZWQgY29uZGl0aW9uYWwgY29kZXMuCi0JKHBhX3BhcnNlX2NtcGJfNjRfY21wbHRyLHBhX3BhcnNlX2NtcGliXzY0X2NtcGx0cik6ICBOZXcuCi0KLVRodSBPY3QgIDcgMDA6MjM6NTMgTURUIDE5OTkJRGllZ28gTm92aWxsbyA8ZG5vdmlsbG9AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoQ0hBUl9CSVQpOiBEZWZpbmUuCi0JKGNoZWNrX3JhbmdlKTogRml4IGJpdCBvcGVyYXRpb25zIHRvIHN1cHBvcnQgaW50ZWdlcnMgYmlnZ2VyIHRoYW4KLQkzMiBiaXRzLgotCi1UaHUgT2N0ICA3IDAwOjExOjUwIE1EVCAxOTk5CURpZWdvIE5vdmlsbG8gPGRub3ZpbGxvQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGNoZWNrX3JhbmdlKTogQ2hlY2sgcmFuZ2UgZm9yIFJFU1RSSUNURURfTlVNMwotCW9wZXJhbmRzLgotCi1Nb24gT2N0ICA0IDE3OjI0OjIzIDE5OTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0JCQkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY3lnbnVzLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBtMzJyeC4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKGVuYWJsZV9tMzJyeCk6IE5ldyBzdGF0aWMgZ2xvYmFsLgotCShlbmFibGVfc3BlY2lhbCx3YXJuX2V4cGxpY2l0X3BhcmFsbGVsX2NvbmZsaWN0cyxvcHRpbWl6ZSk6IERpdHRvLgotCShhbGxvd19tMzJyeCk6IE5ldyBmdW5jdGlvbi4KLQkoTTMyUl9TSE9SVE9QVFMpOiBBZGQgYE8nLgotCShtZF9sb25nb3B0cyk6IEFkZCAtLW0zMnJ4IHBsdXMgc2V2ZXJhbCB3YXJuaW5nIG9wdGlvbnMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBuZXcgb3B0aW9ucy4KLQkobWRfc2hvd191c2FnZSk6IFByaW50IHRoZW0uCi0JKG1kX2JlZ2luKTogRW5hYmxlIG0zMnJ4LgotCShPUEVSQU5EX0lTX0NPTkRfQklUKTogTmV3IG1hY3JvLgotCShmaXJzdF93cml0ZXNfdG9fc2Vjb25kc19vcGVyYW5kcyk6IE5ldyBmdW5jdGlvbi4KLQkod3JpdGVzX3RvX3BjLGNhbl9tYWtlX3BhcmFsbGVsLG1ha2VfcGFyYWxsZWwpOiBOZXcgZnVuY3Rpb25zLgotCSh0YXJnZXRfbWFrZV9wYXJhbGxlbCxhc3NlbWJsZV90d29faW5zbnMpOiBOZXcgZnVuY3Rpb25zLgotCShtZF9hc3NlbWJsZSk6IFJlY29nbml6ZSAiaW5zbjEgLT4gaW5zbjIiIGFuZCAiaW5zbjEgfHwgaW5zbjIiLgotCUlmIG9wdGltaXppbmcgYW5kIG0zMnJ4LCB0cnkgdG8gbWFrZSBjb25zZWN1dGl2ZSBpbnNucyBwYXJhbGxlbC4KLQotVHVlIFNlcCAyOCAxNDowNjo0NCAxOTk5ICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG5vcGljX25lZWRfcmVsYXgpOiBBbGxvdyBmb3IgdGhlCi0JLnNkYXRhLmZvbyBzZWN0aW9ucyBnZW5lcmF0ZWQgYnkgLWZkYXRhLXNlY3Rpb25zLAotCWFuZCBmb3IgdGhlIC5nbnUubGlua29uY2UucyBzZWN0aW9ucyBnZW5lcmF0ZWQgYnkgQysrLgotCi1UaHUgU2VwIDIzIDA3OjEzOjQ1IDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IFJlcGxhY2UgJ0InLCAnTScsICdsJyBhbmQgJ2cnIGhhbmRsaW5nCi0Jd2l0aCBjbGVhbmVyIGNvZGUgdXNpbmcgY29tcGxldGVyIHByZWZpeGVzLiAgIEFkZCAnWScuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogIEFkZCBwYXJlbnMgdG8gc2lsZW5jZSBjb21waWxlci4KLQotV2VkIFNlcCAyMiAwOTozNzoxOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEF2b2lkIEFOU0kgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uCi0JKHBhX2lwLCBjYXNlICdtJyk6IEZhaWx1cmUgdG8gZ2V0IGEgQ0JJVCBzcGVjaWZpZXIganVzdCBtZWFucyB0aGUKLQlpbnNuIGRvZXMgbm90IG1hdGNoIGFuZCB3ZSBzaG91bGQgdHJ5IHRoZSBuZXh0IGluc24gaW4gdGhlIHRhYmxlLgotCi0xOTk5LTA5LTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKE1VTFRJX1NFVF9QU1IpOiBSZW5hbWUgdG8gTERNX1RZUEVfMl9PUl8zLgotCi1Nb24gU2VwIDIwIDA0OjAxOjQxIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBGaXggdGhpbmtvcyBpbiByZWNlbnQgY2xlYW51cAotCW9mIFBBMi4wIHN1cHBvcnQuCi0KLTE5OTktMDktMTkgIEFsZXhhbmRyZSBPbGl2YSAgPG9saXZhQGxzZC5pYy51bmljYW1wLmJyPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9zaG9ydG9wdHMpOiBDaGVjayBPQkpfTUFZQkVfRUxGIGFzIHdlbGwgYXMKLQlPQkpfRUxGLiAgSWYgRUxGLCBhZGQgInNxIi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSWYgRUxGLCBpZ25vcmUgLXMgYW5kIC1xLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiBFTEYgb3B0aW9ucy4KLQotU3VuIFNlcCAxOSAxMDo0MzozMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogSGFuZGxlICdKJywgJ0snIGFuZCAnY2MnIAotCW9wZXJhbmRzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk7IEhhbmRsZSAiZmUiLCBhbmQgJ2NKJy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBIYW5kbGUgJ2QnLCAnIycgYW5kICdjcScuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHN0cnVjdCBwYV9pdCk6IE5ldyBmaWVsZCAidHJ1bmMiLgotCShwYV9pcCk6IEhhZG5sZSAnaCcsICdtJywgJz0nLCAneycsIGFuZCAnXycgb3BlcmFuZHMuCi0JKHBhX3BhcnNlX2Z0ZXN0X2dmeF9jb21wbGV0ZXIpOiBOZXcgZnVuY3Rpb24KLQkocGFfcGFyc2VfZnBfY252X2Zvcm1hdCk6IE5ldyBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBIYW5kbGUgJ1gnIG9wZXJhbmQuCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSAyMmJpdCBwYy1yZWwgYnJhbmNoZXMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogSGFuZGxlICdCJyBvcGVyYW5kLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEhhbmRsZSAnTCcgYW5kICdNJyBvcGVyYW5kcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBIYW5kbGUgJ2wnIG9wZXJhbmQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogSGFuZGxlICdnJyBvcGVyYW5kLgotCi1hdCBTZXAgMTggMTI6MTM6MjggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hc3NlbWJsZSk6IEZpeCBkd2FyZjIgbGluZSBoYW5kbGluZy4KLQkocGFfaXApOiBIYW5kbGUgJ2ZYJy4KLQotU2F0IFNlcCAxOCAxMjoxMzoyOCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtaHBwYS5jIChtZF9hc3NlbWJsZSk6IEZpeCBkd2FyZjIgbGluZSBoYW5kbGluZy4KLSAgICAgICAgKHBhX2lwKTogSGFuZGxlICdmWCcuCi0KLUZyaSBTZXAgMTcgMTE6NTc6MzQgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBEbyBub3QgYnVpbGQKLQl1bndpbmRzIHVubGVzcyB0aGUgZnVuY3Rpb24gaXMgaW4gdGhlIHRleHQgc3BhY2UuCi0JKHBhX3R5cGVfYXJncyk6IFNldCBCU0ZfRlVOQ1RJT04gZm9yIGFuIGV4cHJvdGVkIGRhdGEgc3ltYm9sLgotCi1XZWQgU2VwIDE1IDA1OjE0OjMyIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBNb3ZlIGR3YXJmMiBzdHVmZiBmcm9tIGhlcmUuCi0JKG1kX2Fzc2VtYmxlKTogVG8gaGVyZS4gIFR3ZWFrIGFkZHJlc3MgZ2VuZXJhdGlvbi4KLQotCSogY29uZmlnL3RjLWhwcGEuYzogSW5jbHVkZSBkd2FyZjJkYmcuaCBpZiBPQkpfRUxGLiAgRGVjbGFyZQotCWRlYnVnX2xpbmUuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCAuZmlsZSBhbmQgLmxpbmUgcHNldWRvLW9wcyBmb3IgT0JKX0VMRi4KLQkobWRfYXNzZW1ibGUpOiBDYWxsIGR3YXJmMl93aGVyZSBmb3IgT0JKX0VMRi4KLQkocGFfaXApOiBDYWxsIGR3YXJmMl9nZW5fbGluZV9pbmZvIGZvciBPQkpfRUxGLgotCShwYV9lbmRfb2Zfc291cmNlKTogTmV3IGZ1bmN0aW9uLgotCSogdGMtaHBwYS5oIChtZF9lbmQpOiBEZWZpbmUgZm9yIE9CSl9FTEYuCi0KLTE5OTktMDktMTQgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKENhbm9uaWNhbGl6YXRpb24gb2YgdGFyZ2V0IG5hbWVzKTogUmVtb3ZlIGFkZGluZwotCSR7Q09ORklHX1NIRUxMfSBpbiBmcm9udCBvZiAkYWNfY29uZmlnX3N1Yiwgc2luY2UgYXV0b2NvbmZpZyAyLjE0Ci0JZ2VuZXJhdGVzICRhY19jb25maWdfc3ViIHdpdGggYSAke0NPTkZJR19TSEVMTH0gYWxyZWFkeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMTk5OS0wOS0xNCAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGNvbmZpZy90ZS1pbnRlcml4LmggKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk6IERlZmluZS4KLQotMTk5OS0wOS0xMyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSAiam1wL2NhbGwgY29uc3RhbnQiIGFzIGEKLQlwYy1yZWxhdGl2ZSBqbXAvY2FsbCB0byBhbiBhYnNvbHV0ZSBzeW1ib2wuCi0JKG1kX2FwcGx5X2ZpeDMpOiBXaGVuIE9CSl9FTEYsIGRvbid0IGFkZCB0aGUgdmFsdWVzIGluIHR3aWNlIGZvcgotCWFic29sdXRlIHNlY3Rpb24gc3ltYm9scy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBDb3JyZWN0IGZyYWdfdmFyIHNpemUuICBUaWR5Ci0JanVtcCBoYW5kbGluZyBjb2RlIGFuZCBjb21tZW50cy4KLQotMTk5OS0wOS0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgaG9ycmlibGUgYWRqdXN0bWVudHMgdG8KLQl0aGUgdmFsdWUgaWYgVEVfUEUgYW5kIGEgZ2xvYmFsIGRlZmluZWQgc3ltYm9sLgotCi0xOTk5LTA5LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogd3JpdGUuYyAoZHVtcF9zZWN0aW9uX3JlbG9jcyk6IENhbGwgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgdG8KLQlwcmludCB0aGUgc3ltYm9sLCByYXRoZXIgdGhhbiBwcmludGluZyBpdCBoZXJlLgotCi0xOTk5LTA5LTExICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdAotCUJGRF9SRUxPQ19SVkEgcmVsb2NhdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3VuZGVmaW5lZF9zeW1ib2wpOiBDb21wYXJlIHRoZSBuYW1lIGFnYWluc3QKLQl0aGUgbWFjcm8gR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FLCByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGF0IGl0Ci0Jc3RhcnRzIHdpdGggIl9HIi4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogQ2FsbCBTRVRfU0VDVElPTl9SRUxPQ1MgaWYgaXQgaXMKLQlkZWZpbmVkLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNFVF9TRUNUSU9OX1JFTE9DUyk6IERlZmluZS4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoT2JqZWN0IGZvcm1hdCBiYWNrZW5kKTogRG9jdW1lbnQKLQlTRVRfU0VDVElPTl9SRUxPQ1MuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QKLQlyZWxvY2F0aW9ucyBhZ2FpbnN0IGdsb2JhbCBzeW1ib2xzIGlmIFRFX1BFLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfaWRlbnQpOiBBZGQgQkZEX0FTU0VNQkxFUiB2ZXJzaW9uLgotCShvYmpfcHNldWRvX3RhYmxlKTogQWx3YXlzIGhhbmRsZSAiLmlkZW50IiB3aXRoIG9iai1jb2ZmX2lkZW50LgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IFByb2hpYml0IHdlYWsgY29tbW9uCi0Jc3ltYm9scy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2VuZGVmKTogRG9uJ3QgbWVyZ2UgbGFiZWxzLCBvcgotCXN5bWJvbHMgd2hpY2ggZG8gbm90IGhhdmUgYSBjb25zdGFudCB2YWx1ZSwgb3IgdGFncyB3aXRoCi0Jbm9uLXRhZ3MuICBSZW1vdmUgdGhlIHN5bWJvbCBmcm9tIHRoZSBsaXN0IGJlZm9yZSBhZGRpbmcgaXQgYXQgdGhlCi0JZW5kLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZW5kZWYpIFtCRkRfQVNTRU1CTEVSXTogSGFuZGxlIC5lZgotCUNfRkNOIHN5bWJvbCBkaWZmZXJlbnRseSBpZiBURV9QRS4KLQkob2JqX2NvZmZfbGluZSkgW0JGRF9BU1NFTUJMRVJdOiBBbHdheXMgdXNlIHRoZSBsaW5lIG51bWJlciB3aGljaAotCWFwcGVhcnMgaW4gdGhlIHBzZXVkby1vcCwgcmF0aGVyIGNvZmZfbGluZV9iYXNlIHdoaWNoIGlzIG9ubHkgc2V0Ci0JZm9yIGEgLmJmIHN5bWJvbC4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2xvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgImxvYyIuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChhZGRfbGluZW5vKTogQ2hlY2sgdGhhdCB0aGUgbGluZSBudW1iZXIgaXMKLQlwb3NpdGl2ZS4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChhdG9mX2llZWUpOiBDaGFuZ2Ugd2hhdF9raW5kIHRvIGludC4KLQkqIGNvbmZpZy9hdG9mLXZheC5jIChmbG9udW1fZ2VuMnZheCk6IENoYW5nZSBmb3JtYXRfbGV0dGVyIHRvCi0JaW50LgotCShtZF9hdG9mKTogUmV0dXJuIE5VTEwgcmF0aGVyIHRoYW4gMC4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2F0b2YpOiBDaGFuZ2UgdHlwZSB0byBpbnQuCi0JKiBleHByLmMgKGV4cHIpOiBDaGFuZ2UgZmlyc3QgcGFyYW1ldGVyIHRvIGludC4KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBBZGQgZGVjbGFyYXRpb25zIGZvciBzdGF0aWMgZnVuY3Rpb25zLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogVXNlIFNZTV9BVVhFTlQuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChmbGFnXzE2Yml0X2NvZGUpOiBEb24ndCBkZWNsYXJlLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbik6IERlZmF1bHQgdG8gc2V0dGluZwotCVNFQ19MT0FELiAgRG9uJ3Qgc2V0IFNFQ19EQVRBIGZvciAndycgbW9kaWZpZXIuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogUHJpbnQgYWRqdXN0ZWQgZml4dXAuCi0KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IENvcnJlY3QgdG9vX21hbnlfZGlnaXRzIGNhbGN1bGF0aW9uCi0JaW4gYmFzZSAxMCBjYXNlLgotCi0xOTk5LTA5LTA5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBkb2MvYy1hcm0udGV4aTogRml4IGFyZ3VtZW50cyBvZiBAdmFyIHRvIG5vdCBjb250YWluCi0JcHVuY3R1YXRpb24uCi0KLTE5OTktMDktMDggIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHNfdGh1bWJfc2V0KTogT25seSBzdXBwb3J0IGludGVyd29ya2luZyBmb3IgRUxGIAotCWFuZCBDT0ZGIHRhcmdldHMuCi0JKG1kX3BhcnNlX29wdGlvbik6IE9ubHkgc3VwcG9ydCAtayBmbGFnIGZvciBFTEYgYW5kIENPRkYgdGFyZ2V0cy4KLQotVHVlIFNlcCAgNyAxMzoyODo1OSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogUHV0IHN0cmljdCByZWdpc3RlciBjaGVja3MgYmVmb3JlCi0JY2FsbCB0byBwYV9wYXJzZV9udW1iZXIuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogU3VwcG9ydCAnWicgYXJndW1lbnQuCi0KLTE5OTktMDktMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYzogQWRkIEFUVFJJQlVURV9VTlVTRUQgYXMgbmVlZGVkIGZvcgotCUJGRF9BU1NFTUJMRVIgY29kZS4KLQotMTk5OS0wOS0wNiAgRG9ubiBUZXJyeSAgPGRvbm5AaW50ZXJpeC5jb20+Ci0KLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IFNldCBTRUNfREFUQSBmb3IgZGF0YV9zZWN0aW9uLgotCi1Nb24gU2VwICA2IDA0OjI2OjU2IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBHZXQgc3RyaWN0L25vbi1zdHJpY3QgbW9kZSBmcm9tIHRoZQotCWNhbmRpZGF0ZSBpbnN0cnVjdGlvbi4gIFJlcXVpcmUgcmVnaXN0ZXJzIGZvciByZWdpc3RlciBhcmd1bWVudHMKLQl3aGVuIGluIHN0cmljdCBtb2RlLiAgUmVxdWlyZSBhc3NlbWJsZS10aW1lIGNvbnN0YW50cyBmb3IKLQljb25zdGFudHMgd2hlbiBpbiBzdHJpY3QgbW9kZS4KLQkocGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24pOiBSZXF1aXJlIGEgY29uc3RhbnQgd2hlbiBpbiBzdHJpY3QKLQltb2RlLgotCQotMTk5OS0wOS0wNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfbG9uZ29wdHMpOiBGaXggdmFsdWUgZm9yIC1XbnVoLgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wai5jOiBOZXcgZmlsZSwgc3VwcG9ydHMgcGljb0phdmEgaW4gRUxGLgotCSogY29uZmlnL3RjLXBqLmg6IERpdHRvLgotCSogY29uZmlndXJlLmluIChwamwqLCBwaiopOiBOZXcgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ1BVX1RZUEVTKTogQWRkIHBqLgotCShUQVJHRVRfQ1BVX0NGSUxFUyk6IEFkZCBjb25maWcvdGMtcGouYy4KLQkoVEFSR0VUX0NQVV9IRklMRVMpOiBBZGQgY29uZmlnL3RjLXBqLmguCi0JKiBkb2MvYy1wai50ZXhpOiBOZXcgZmlsZS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgc29tZSBQSiBzcGVjaWZpY3MuCi0JKiBkb2MvYWxsLnRleGk6IEFkZCBQSiB0byB0aGUgbGlzdCBvZiBhbGwgYXJjaGl0ZWN0dXJlcywgc29ydCB0aGVtCi0JYWxsIGFscGhhYmV0aWNhbGx5LgotCSogZG9jL01ha2VmaWxlLmluIChDUFVfRE9DUyk6IEFkZCBjLXBqLnRleGkuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDktMDIgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL29iai1tdWx0aS5oOiBJbmNsdWRlIG9iai1lbGYuaCBpZiBPQkpfTUFZQkVfRUxGLiBSZWZvcm1hdC4KLQkob2JqX2Zyb2JfZmlsZSk6IFRlc3QgZm9yIG51bGwgcG9pbnRlci4KLQkoT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMpOiBIZXJlIHRvby4KLQkoT0JKX1BST0NFU1NfU1RBQik6IEFuZCBoZXJlLgotCShlbGZfb2JqX3N5KTogUmVtb3ZlCi0KLQkqIGNvbmZpZy9vYmotZWxmLmg6ICNpZm5kZWYgZXZlcnl0aGluZyBkZWZpbmVkIGluIG9iai1tdWx0aS5oLAotCWV4Y2VwdCBPQkpfUFJPQ0VTU19TVEFCLCB3aGljaCB3ZSAjdW5kZWYgZm9yIGVjb2ZmLgotCShlbGZfb2JqX3N5KTogUmVtb3ZlICNpZm5kZWYgT0JKX1NZTUZJRUxEX1RZUEUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChub19mdW5jKTogUmVtb3ZlLgotCShjb2ZmX2Zvcm1hdF9vcHMpOiBDaGFuZ2Ugb2NjdXJyZW5jZXMgb2Ygbm9fZnVuYyB0byAwLCBhcyB3ZSB0ZXN0Ci0JZm9yIDAgaW4gb2JqLW11bHRpLmguCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEVuYWJsZSBiZmQgZm9yIGkzODYtY29mZiB3aGVuIHByaW1hcnkgdGFyZ2V0IGlzCi0JYmZkLiAgRW5hYmxlIGkzODYgZWxmLGNvZmYgZW11bGF0aW9uIHN1cHBvcnQuICBEb24ndCBzZXQKLQlVU0VfRU1VTEFUSU9OUz0xIG9yIHRlX2ZpbGU9bXVsdGkgdW5sZXNzIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKLQllbXVsYXRpb24gdG8gc3VwcG9ydC4KLQkqY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0xOTk5LTA5LTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWNvcmVfc19zZWN0aW9uKTogRG8gbm90IGR1bXAgbGl0ZXJhbHMgaWYgYQotCS5zZWN0aW9uIC5saW5lIGRpcmVjdGl2ZSBpcyBlbmNvdW50ZXJlZC4KLQotMTk5OS0wOS0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9zZWN0aW9uX2FsaWduKTogRG8gbm90IGFsaWduIHNlY3Rpb25zIGluIEVMRgotCWZvcm1hdC4gCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBBZGQgLS1nZHdhcmYyIHRvIGxpc3Qgb2Ygb3B0aW9ucyBkaXNwbGF5ZWQuCi0JKiBhcy50ZXhpbmZvOiBEb2N1bWVudCAtLWdkd2FyZjIgY29tbWFuZCBsaW5lIG9wdGlvbi4KLQlBZGQgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uIG9mIEFSTSBjb21tYW5kIGxpbmUgc3dpdGNoZXMuCi0KLTE5OTktMDgtMzAgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCk6IENvbWJpbmUKLQlpMzg2X2lzX3JlZyBhbmQgcGFyc2VfcmVnaXN0ZXIgY2FsbHMuICBSZW1vdmUgRU5EX1NUUklOR19BTkRfU0FWRQotCWFuZCBSRVNUT1JFX0VORF9TVFJJTkcgYXJvdW5kIHBhcnNlX3JlZ2lzdGVyIGNhbGxzLgotCShpMzg2X29wZXJhbmQpOiBIZXJlIHRvby4KLQkoaTM4Nl9pc19yZWcpOiBSZW1vdmUuCi0JKHBhcnNlX3JlZ2lzdGVyKTogTW92ZSBhc19iYWQgY2FsbHMgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbiB0bwotCWNhbGxlcnMuCi0KLTE5OTktMDgtMjkgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0JKiBjb25maWcvdGMtaTM4Ni5jIChwYXJzZV9yZWdpc3Rlcik6IEhhbmRsZSBGUCByZWdzIHNwZWNpYWxseS4KLQkobWRfYmVnaW4pOiBSZW1vdmUgJygnIGFuZCAnKScgZnJvbSByZWdpc3Rlcl9jaGFycy4KLQotMTk5OS0wOC0yOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9wYXJzZV9vcHRpb24pOiBEZWxldGUgdW5yZWNvZ25pemVkIG9wdGlvbgotCWVycm9yIG1lc3NhZ2UgKGRvbmUgZWxzZXdoZXJlKS4KLQotU2F0IEF1ZyAyOCAwMToyMzoxMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogRG8gbm90IGFsbG93ICcqJyBpbiAzMmJpdCBjb21wbGV0ZXJzLgotCi1TYXQgQXVnIDI4IDAwOjI2OjI2IDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBSZXBsYWNlICdmJyBieSAndicuICBQcmVmaXggZmxvYXQgcmVnaXN0ZXIKLQlhcmdzIGJ5ICdmJy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBBZGQgYXJncyBxLCAlLCBhbmQgfC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiAgQWJzb3JiIHdoaXRlIHNwYWNlIGluIGluc3RydWN0aW9ucwotCWJldHdlZW4gYXJncy4KLQlBZGQgbmV3IGNvbXBsZXRlcnMuICBGaXggYnVnIGluIDY0IGJpdCBjb25kaXRpb24gaGFuZGxpbmcuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogIEFkZCBjb21wbGV0ZXIgY29kZXMgJ2EnLCAnY2gnLCAnY0gnLAotCSdjUycsIGFuZCAnYyonLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IFBsYWNlIGNvbXBsZXRlcnMgYmVoaW5kIHByZWZpeCAnYycuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogIEFkZCBjYXNlcyBmb3IgJy4nLCAnficuICckJy4gYW5kICchJwotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6ICBBZGQgY2FzZSBmb3IgJ0knLiAgCi0KLTE5OTktMDgtMjcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyZGJnLmMgKE1BWF9TUEVDSUFMX0FERFJfREVMVEEpOiBDb3JyZWN0IHR5cG8gaW4gY29tbWVudC4KLQkoc3RydWN0IGxzKTogQWRkIGZyYWcgZmllbGQuICBJbml0aWFsaXplIGl0IHRvIHplcm8uCi0JKG91dF9lbmRfc2VxdWVuY2UpOiBOZXcgbG9jYWwgdGV4dF9mcmFnLiAgU2V0IGl0IHdoaWxlIGluIHRleHQgc2VjdGlvbi4KLQlSZXBsYWNlIGFkZHJlc3MgY2hlY2sgd2l0aCBmcmFnIGNoZWNrLiAgU2V0IGxzLmZyYWcgdG8gdGV4dF9mcmFnIGlmCi0Jb3V0X3NldF9hZGRyIGNhbGxlZC4KLQkoZHdhcmYyX2dlbl9saW5lX2luZm8pOiBBZGQgZXhwbGFuYXRvcnkgY29tbWVudC4gIE5ldyBsb2NhbCBzYXZlZF9mcmFnLgotCVNldCBpdCBiZWZvcmUgc3dpdGNoaW5nIHNlY3Rpb25zLiAgUmVwbGFjZSBhZGRyZXNzIGNoZWNrIHdpdGggZnJhZwotCWNoZWNrLiAgU2V0IGxzLmZyYWcgdG8gc2F2ZWRfZnJhZyBpZiBvdXRfc2V0X2FkZHIgY2FsbGVkLgotCi0xOTk5LTA4LTI2ICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotICAgICAgICAqIGR3YXJmMmRiZy5jIChvdXRfZW5kX3NlcXVlbmNlKTogSWYgYWRkcmVzcyBjaGFuZ2VkLCBkaXJlY3RseQotCW91dHB1dCAiYWR2YW5jZV9wYyIgb3Bjb2RlIGluc3RlYWQgb2YgY2FsbGluZyBnZW5fYWRkcl9saW5lKCkuCi0JVGhlIGxhdHRlciBoYXMgdGhlIHVuZGVzaXJlZCBzaWRlLWVmZmVjdCBvZiBjcmVhdGluZyBhIG5ldyByb3cKLQlpbiB0aGUgZGVidWcgbGluZSBpbmZvIG1hdHJpeC4gCi0KLTE5OTktMDgtMjYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyZGJnLmMgKG91dF9lbmRfc2VxdWVuY2UpOiBDb3JyZWN0IGNvbW1lbnRzLiAgU2V0IGxhc3QgdG8KLQlscy5sYXN0X2ZpbGVuYW1lIGlmIGxhc3QgaXMgbGVzcyB0aGFuIHplcm8uICBTZXQgbHMubGFzdF9maWxlbmFtZQotCXdoZW4gYWxsb2NhdGluZyBuZXcgZW50cnkuCi0JKGR3YXJmMl9nZW5fbGluZV9pbmZvKTogU2F2ZSBzZWcgYW5kIHN1YnNlZyBpbmZvIGJlZm9yZSBzdWJzZWdfbmV3Ci0JY2FsbC4KLQotMTk5OS0wOC0yMCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2luZGV4X2NoZWNrKTogRml4IHRoZSBkaXNwbGFjZW1lbnQgc2l6ZQotCXdoZW4gSU5GRVJfQUREUl9QUkVGSVguCi0KLTE5OTktMDgtMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IElmIGFuIG9mZnNldCBpcyBpbnZhbGlkLAotCWRpc3BsYXkgaXRzIHZhbHVlLgotCi0xOTk5LTA4LTE3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hc3NlbWJsZSk6IFRyaW0gQGhhIGNvbnN0YW50IHRvIDE2IGJpdHMsIHRvCi0JaGFuZGxlIDB4ZmZmZk5OTk4gY29uc3RhbnRzIGNvcnJlY3RseS4KLQotMTk5OS0wOC0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChkb19sZHN0KTogTG9vayBmb3IgcmVnaXN0ZXIgY29uZmxpY3RzIG9uIHN0b3JlcwotCWFzIHdlbGwgYXMgbG9hZHMuCi0KLTE5OTktMDgtMTMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAodmFsaWRhdGVfb2Zmc2V0X2ltbSk6IFdvcmsgb24gdW5zaWduZWQgdmFsdWVzLgotCShtZF9hcHBseV9maXgzKTogQWx3YXlzIHBhc3MgcG9zaXRpdmUgdmFsdWVzIHRvCi0JdmFsaWRhdGVfb2Zmc2V0X2ltbS4KLQotMTk5OS0wOC0xMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChza2lwX3doaXRlc3BhY2UpOiBOZXcgbWFjcm8uCi0JRm9ybWF0dGluZyB0aWR5IHVwcy4KLQkKLQkobWRfYXBwbHlfZml4Myk6IFN0b3JlIHJlbG9jYXRpb24gb2Zmc2V0IGluIGFkZGVuZCBmb3IgRUxGIGJhc2VkCi0JcmVsb2NzLgotCShhcm1fZm9yY2VfcmVsb2NhdGlvbik6IEFsd2F5cyBnZW5lcmF0ZSByZWxvY3MgZm9yIFRodW1iIGZ1bmN0aW9uCi0JY2FsbHMuIAotCQotMTk5OS0wOC0xMSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFJlbW92ZSBkZWFkIGNvZGUuICBpbnRlbF9zeW50YXgKLQlMT05HX0RPVUJMRV9NTkVNX1NVRkZJWCBmbG9hdGluZyBwb2ludCBpcyBkb25lIGluIG9wY29kZS9pMzg2LmgKLQotVHVlIEF1ZyAxMCAxMjo1ODozMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IFVzZSBzYW5lIHNlY3Rpb24KLQlmbGFncyBmb3IgdGhlIHVud2luZCBzdWJzcGFjZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoVU5XSU5EX1NFQ1RJT05fTkFNRSk6IERlZmluZSBmb3IgRUxGLgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBSZW1vdmUgI2lmIDAgd3JhcHBlci4gIFNlbGVjdCBhCi0Jc3VpdGFibGUgcmVsb2NhdGlvbiBiYXNlZCBvbiB0aGUgc2l6ZSBvZiB0aGUgdGFyZ2V0J3MgcG9pbnRlci4KLQlBbHdheXMgVXNlIHN1YnNlZ21lbnQgemVybyBmb3IgdGhlIHVud2luZGVycy4KLQkocGFfbGV2ZWwpOiBIYW5kbGUgIjIuMHciLgotCi1Nb24gQXVnICA5IDIwOjAyOjIyIDE5OTggIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHdyaXRlXzJfc2hvcnQpOiBEb24ndCBncm91cCByZXBlYXQgaW5zdHJ1Y3Rpb25zCi0Jd2l0aCB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uIHVubGVzcyB0aGlzIHdhcyBzcGVjaWZpZWQuCi0KLTE5OTktMDgtMDkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChTVUJfU0VHTUVOVF9BTElHTik6IElmIFRFX0dPMzIsIHJldHVybiA0IGZvcgotCWNlcnRhaW4gc2VjdGlvbnMsIHRvIG1hdGNoIEJGRCBjaGFuZ2VzLgotCi0xOTk5LTA4LTA4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogTWFrZWZpbGUuYW0gKG5vaW5zdF9TQ1JJUFRTKTogQ2hhbmdlIC5nZGJpbml0IHRvICQoR0RCSU5JVCkuCi0JKEVYVFJBX1NDUklQVFMpOiBEZWZpbmUgdG8ga2VlcCBhdXRvbWFrZSBoYXBweS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA4LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlbmFtZSAuZGVwKiBmaWxlcyB0byBERVAqLgotCShNS0RFUCk6IFJlbmFtZSBmcm9tIERFUC4gIENoYW5nZSBhbGwgdXNlcy4gIFVzZSAkJHtzcmNkaXJ9IHJhdGhlcgotCXRoYW4gJChzcmNkaXIpLiAgUmVuYW1lIFRDREVQIHRhcmdldHMgdG8gREVQVEMuICBSZW5hbWUgT0JKREVQCi0JdGFyZ2V0cyB0byBERVBPQkouCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wOC0wOCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBbGxvdyBhc3NlbWJseSBvZiAlbG8oKSslcmVnLgotCi0xOTk5LTA4LTA4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFrZWZpbGUuYW06IENoYW5nZSBhbGwgdXNlcyBvZiBpdGJsLXRlc3Qtb3BzIHRvIGl0YmwtdG9wcyB0bwotCWF2b2lkIHByb2JsZW1zIG9uIERPUyBmaWxlc3lzdGVtcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBkb2MvYXMudGV4aW5mbyAoU2VjdGlvbik6IERvY3VtZW50ICdzJyBmbGFnIGZvciBDT0ZGIHZlcnNpb24uCi0KLTE5OTktMDgtMDggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbik6IEhhbmRsZSAncycgKHNoYXJlZCkKLQlzZWN0aW9uIGZsYWcuCi0KLTE5OTktMDgtMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBhbmQgc3Vic3RpdHV0ZSBHREJJTklULiAgQ2hhbmdlIEFDX09VVFBVVAotCWxpbmUgdG8gY3JlYXRlICR7R0RCSU5JVH0gcmF0aGVyIHRoYW4gLmdkYmluaXQuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBdWcgIDYgMTI6MTI6NDQgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAnPycpOiBBZGQgbWlzc2luZyBicmVhay4KLQotRnJpIEF1ZyAgNiAwOTo0NjozNSAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiAgQWRkIDY0IGJpdCBjb25kaXRpb24gY29tcGxldGVycy4KLQotMTk5OS0wOC0wNiAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpOiBGaXggY2hlY2sgZm9yIFBJQyBsb2NhbAotCW5vbi1hZGp1c3RhYmxlIHN5bWJvbHMuCi0KLVRodSBBdWcgIDUgMTY6NTI6NTEgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogQ2hhbmdlIGNvbmRpdGlvbiBhcmdzIHRvIGhhdmUgJz8nIHByZWZpeC4KLQotVGh1IEF1ZyAgNSAyMzowNTo1NiAxOTk5ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXNzZW1ibGUpOiAgQ2FsbCBhc19iYWQgd2hlbiB0aGVyZSBhcmUgZXhjZXNzCi0Jb3BlcmFuZHMuCi0KLTE5OTktMDgtMDUgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBjb25maWcvdGUtaW50ZXJpeC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWludGVyaXgqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEF1ZyAgNCAxMzoxMjoxNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2Noa19maWVsZF9zZWxlY3Rvcik6IEFsbG93IDMgYnl0ZQotCXNlbGVjdG9ycyBmb3IgRUxGIHRvby4KLQkoc2VsZWN0b3JfdGFibGUpOiBBZGQgImx0cCIgYW5kICJydHAiIHNlbGVjdG9ycy4KLQotMTk5OS0wOC0wNCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBObyBuZWVkIHRvIGNoYW5nZQotCW9wZXJhbmRfc3RyaW5nIHBvaW50ZXIgaW4gc2VnbWVudCByZWcgY2FzZSBiZWZvcmUgZ290bwotCWRvX21lbW9yeV9yZWZlcmVuY2UuICBJbml0aWFsaXNlIGRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQgYW5kCi0JZGlzcGxhY2VtZW50X3N0cmluZ19lbmQgYWZ0ZXIgZG9fbWVtb3J5X3JlZmVyZW5jZSBsYWJlbC4KLQkoaTM4Nl9pbmRleF9jaGVjayk6IEFkZCBvcGVyYW5kX3N0cmluZyBwYXJhbSwgYW5kIHByaW50IGVycm9yCi0JbWVzc2FnZSBvbiBmYWlsdXJlIGhlcmUuCi0JKGkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQpOiBJbnN0ZWFkIG9mIGhlcmUuCi0JKGkzODZfb3BlcmFuZCk6IEFuZCBoZXJlLgotCShJTkZFUl9BRERSX1BSRUZJWCk6IEVuYWJsZS4KLQotCSogZG9jL2MtaTM4Ni50ZXhpIChpMzg2LTE2Yml0KTogRG9jdW1lbnQgLmNvZGUxNmdjYy4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoRGVmYXVsdFNpemUpOiBEZWZpbmUuICBSZW51bWJlciBmb2xsb3dpbmcKLQlvcGNvZGVfbW9kaWZpZXIgZGVmaW5lcy4KLQotCUZyb20gRXRpZW5uZSBMb3JyYWluICA8ZXRpZW5uZS5sb3JyYWluQGlibS5uZXQ+Ci0JKiBjb25maWcvdGMtaTM4Ni5jIChzdGFja29wX3NpemUpOiBOZXcgdmFyaWFibGUuCi0JKHNldF8xNmJpdF9jb2RlX2ZsYWcpOiBDbGVhciBpdCBoZXJlLgotCShzZXRfMTZiaXRfZ2NjX2NvZGVfZmxhZyk6IE5ldyBmdW5jdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkICJjb2RlMTZnY2MiIGVudHJ5LgotCShtZF9hc3NlbWJsZSk6IFNldCBpLnN1ZmZpeCBmb3IgaW5zbnMgd2l0aCBEZWZhdWx0U2l6ZSBtb2RpZmllci4KLQotMTk5OS0wOC0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogQWx3YXlzIHVwZGF0ZSBzZXRfZW5kIHdpdGgKLQluZXh0X3NldF9lbmQgZXZlbiBpZiB0aGUgZW5kIHN5bWJvbCBpcyBiZWluZyBkaXNjYXJkZWQuCi0KLQkqIGdhc3AuYzogQWRkIEFUVFJJQlVURV9VTlVTRUQgYXMgbmVlZGVkIGZvciBub24tQkZEX0FTU0VNQkxFUi4KLQkqIG91dHB1dC1maWxlLmMsIHN5bWJvbHMuYywgY29uZmlnL3RjLWkzODYuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWNvZmYuYzogTGlrZXdpc2UuCi0JKHNlZ19pbmZvX3R5cGUpOiBSZW1vdmUuCi0JKHNlZ19pbmZvX29mZl9ieV80KTogQ2hhbmdlIHRvIGFycmF5IG9mIHNlZ1QuCi0JKHNfZ2V0X3NlZ21lbnQpOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBGdWxseSBpbml0aWFsaXplIHNlbnRpbmVsIGVudHJ5LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IENvcnJlY3QgSU5TTl9TWU5DIHRlc3QuICBGcm9tCi0JUmFsZiBCYWVjaGxlIDxyYWxmQHVuaS1rb2JsZW56LmRlPi4KLQotMTk5OS0wOC0wMyAgRXRpZW5uZSBMb3JyYWluICA8ZXRpZW5uZS5sb3JyYWluQGlibS5uZXQ+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGYxNl8zKTogTmV3LiBGaXhlcyAxNiBiaXQgMyBieXRlIG5vcC4KLQotMTk5OS0wOC0wMyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBJbmRlbnRhdGlvbiBhbmQgd2hpdGUgc3BhY2UgY2hhbmdlcy4KLQkoaTM4Nl9pbmRleF9jaGVjayk6IE5ldyBmdW5jdGlvbi4gIEFkZCBJTkZFUl9BRERSX1BSRUZJWCBjb2RlLCBidXQKLQlkb24ndCBlbmFibGUgaXQgYnkgZGVmYXVsdC4KLQkoaTM4Nl9pbnRlbF9vcGVyYW5kKTogUmVtb3ZlIHJlZHVuZGFudCBwcm90b3R5cGUuCi0JTW92ZSBjaGVjayBvbiBudW1iZXIgb2YgbWVtb3J5IG9wZXJhbmRzLCBhbmQgaS5tZW1fb3BlcmFuZHMrKwotCShpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kKTogVG8gaGVyZS4KLQlSZW1vdmUgaTM4Nl9pbW1lZGlhdGUgY29kZSBmcm9tIGhlcmUuICBSZW1vdmUgc3BlY2lhbCBjYXNlIGNvZGUKLQlmb3IgaW5wdXQgYW5kIG91dHB1dCB1c2luZyAoJWR4KS4gIFJlbW92ZSBiYXNlL2luZGV4IGNoZWNrcyBhbmQKLQljYWxsIGkzODZfaW5kZXhfY2hlY2sgaW5zdGVhZC4gIFNhdmUgaW5pdGlhbCBvcGVyYW5kX3N0cmluZwotCWFyZ3VtZW50IGZvciBlcnJvciBtZXNzYWdlLgotCShpMzg2X29wZXJhbmQpOiBSZW1vdmUgcmVkdW5kYW50IHByb3RvdHlwZS4gIE1vdmUgYmFzZS9pbmRleAotCWNoZWNrcyB0byBpMzg2X2luZGV4X2NoZWNrLgotCShpMzg2X2Rpc3BsYWNlbWVudCk6IE1vdmUgaW50ZWwgbW9kZSBjaGVjayBmb3Igbm9uLXplcm8KLQlpLmRpc3Bfb3BlcmFuZAotCShpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kKTogVG8gaGVyZS4KLQotMTk5OS0wNy0zMCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfbG9uZ29wdHMpOiBBZGQgLS1uby11bmRlY2xhcmVkLXJlZ3Mgb3B0aW9uLgotCShzcGFyY19pcCk6IFdhcm4gaWYgJWcyIG9yICVnMyByZWdpc3RlciBpcyB1c2VkIGFuZCBub3QgY292ZXJlZAotCWJ5IC5yZWdpc3RlciBwc2V1ZG8tb3AgaWYgLTY0IGFuZCAtLW5vLXVuZGVjbGFyZWQtcmVncy4KLQkoc19yZWdpc3Rlciwgc3BhcmNfYWRqdXN0X3N5bXRhYik6IE5ldyBmdW5jdGlvbnMuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfYWRqdXN0X3N5bXRhYiwgc3BhcmNfYWRqdXN0X3N5bXRhYik6Ci0JRGVjbGFyZSBzcGFyY19hZGp1c3Rfc3ltdGFiIGFzIHRjX2FkanVzdF9zeW10YWIuCi0JKiBkb2MvYy1zcGFyYy50ZXhpOiBBZGQgZGVzY3JpcHRpb24gb2YgI2lnbm9yZSBzcGVjaWFsIGxpdGVyYWwKLQlmb3IgLnJlZ2lzdGVyIHBzZXVkby1vcC4KLQotMTk5OS0wNy0zMCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAodGNfZ2VuX3JlbG9jKTogIFJlY29yZCB0aGUgdnRhYmxlIGVudHJ5IGluCi0JdGhlIHJlbG9jYXRpb24ncyBzZWN0aW9uIG9mZnNldC4KLQotMTk5OS0wNy0yOSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRml4IGdlbmVyaWMgZXJyb3IgY2hlY2sgb3ZlcmZsb3cgdGVzdC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAocGUpOiBDaGFuZ2UgJWQgdG8gJWxkLCAleCB0byAlbHgsIGFuZCBjYXN0Ci0JWF9hZGRfbnVtYmVyIHRvIGxvbmcuCi0KLVdlZCBKdWwgMjggMDI6MDQ6MjQgMTk5OSAgIkplcnJ5IFF1aW5uIiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiAgQWRkICdKJyBhbmQgJ0snIGNvZGUKLQlwcm9jZXNzaW5nLiAKLQotMTk5OS0wNy0yNyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCBHT1QsIFBMVCwgb3IKLQlWVEFCTEUgcmVsb2NhdGlvbnMuCi0KLTE5OTktMDctMjEgIE1hcmsgRWxicmVjaHQgIDxzbm93YmFsbDNAYmlnZm9vdC5jb20+Ci0KLQkqIGNvbmZpZy90ZS1nbzMyLmggKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCi0JKiBjb25maWd1cmUuYmF0OiBSZW1vdmU7IG9ic29sZXRlLgotCSogY29uZmlnL2dvMzIuY2ZnOiBMaWtld2lzZS4KLQotMTk5OS0wNy0yMSAgQnJhZCBNLiBHYXJjaWEgIDxiZ2FyY2lhQGZvcmUuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi12eHdvcmtzKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDctMTYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogZG9jL2Mtc3BhcmMudGV4aTogRG9jdW1lbnQgLnJlZ2lzdGVyIGFuZCAubndvcmQgcHNldWRvLW9wcy4KLQotMTk5OS0wNy0xNiAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBbGxvdyBPTE8xMCByZWxvY2F0aW9ucwotCW9uIC02NCBhbmQgbm90IHBpYy4KLQkob3V0cHV0X2luc24pOiBQdXQgT0xPMTAncyBzZWNvbmRhcnkgYWRkZW5kIGludG8gdGNfZml4X2RhdGEuCi0JKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgQkZEX1JFTE9DX1NQQVJDX09MTzEwLgotCSh0Y19nZW5fcmVsb2MpOiBSZXR1cm4gdHdvIHJlbG9jcyBmb3IgT0xPMTAsIExPMTAgYW5kIFNQQVJDMTMuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFLAotCU1BWF9SRUxPQ19FWFBBTlNJT04pOiBEZWZpbmUuCi0JKFRDX0ZJWF9UWVBFLCBUQ19JTklUX0ZJWF9EQVRBLCBUQ19GSVhfREFUQV9QUklOVCk6IExpa2V3aXNlLgotCi0xOTk5LTA3LTE2ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGludGVsX2Zsb2F0X29wZXJhbmQpOiBBZGQgcHJvdG90eXBlLCBtYWtlIHN0YXRpYy4KLQkobWRfYXNzZW1ibGUpOiBMb2NhbGl6ZSAqZXhwIHZhcmlhYmxlIHRvIGlmIChmYWtlX3plcm9fZGlzcGxhY2VtZW50KQotCWJsb2NrLiAgUHJpbnQgYSB3YXJuaW5nIGlmIGFuIDgtYml0IG9yIDE2LWJpdCBjb25zdGFudAotCWRpc3BsYWNlbWVudCBvciBpbW1lZGlhdGUgaXMgdHJ1bmNhdGVkIG9uIG91dHB1dC4KLQkoaTM4Nl9pbW1lZGlhdGUpOiBFbnN1cmUgSW1tMTYgaXMgYWx3YXlzIGxlZ2FsIGZvciBhIDE2LWJpdCBtb2RlCi0JaW1tZWRpYXRlLgotCShpMzg2X29wZXJhbmQpOiBEaXNhbGxvdyBpbW1lZGlhdGUganVtcCBhYnNvbHV0ZSBvcGVyYW5kLgotCi0xOTk5LTA3LTE1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlndXJlLmluOiBCdW1wIHZlcnNpb24gbnVtYmVyIHRvIDIuOS41LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBkd2FyZjJkYmcuYyAoZHdhcmYyX2dlbl9saW5lX2luZm8pOiBEb24ndCBhc3N1bWUgdGhhdCBsb25nIGxvbmcKLQlvciAlbGx4IHdvcmsuCi0KLVRodSBKdWwgMTUgMDI6NDU6MzAgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgIi5kd29yZCIgcHNldWRvLW9wLgotCShjb25zX2ZpeF9uZXdfaHBwYSk6IERlcml2ZSBzaXplIG9mIGZpeHVwIGZyb20gc2l6ZSBvZiB0aGUgb2JqZWN0LgotCi0xOTk5LTA3LTE0ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogc3ltYm9scy5jIChkb2xsYXJfbGFiZWxfbmFtZSk6IFByZXBlbmQgTE9DQUxfTEFCRUxfUFJFRklYIGlmIGl0Ci0JaXMgZGVmaW5lZC4KLQkqIGNvbmZpZy90Yy1hcm0uaCAoTE9DQUxfTEFCRUxfUFJFRklYKTogRGVmaW5lIHRvICcuJyBmb3IgRUxGLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2JlZ2luKTogU2V0IEZfU09GVEZMT0FUIGluIHRoZSBvdXRwdXQgZmlsZQotCWlmIC1tbm8tZnB1IHdhcyBnaXZlbi4KLQkodGNfZ2VuX3JlbG9jKTogRml4IHR5cG8uICBEZWxldGUgYm9ndXMgY29kZSByZWxhdGVkIHRvIEdPVFBDCi0JcmVsb2NzLgotCShjb25zX2ZpeF9uZXdfYXJtKTogUmVtb3ZlIG1pc2xlYWRpbmcgY29tbWVudHMuCi0KLTE5OTktMDctMTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogVXNlIGZyYWcgZmlsZSBhbmQgbGluZSBpbiByc19vcmcKLQllcnJvciBtZXNzYWdlLgotCShyZWxheF9zZWdtZW50KTogTGlrZXdpc2UuICBBZnRlciBnaXZpbmcgYSByc19vcmcgZXJyb3IsIGNvbnZlcnQKLQl0aGUgZnJhZyB0byByc19hbGlnbiB0byBhdm9pZCBjYXNjYWRpbmcgZXJyb3JzLgotCi0xOTk5LTA3LTEyICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBzdXNlLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBBZGQgc29tZSBBVFRSSUJVVEVfVU5VU0VELgotCi0xOTk5LTA3LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFueSBmaWxlczogQ2hhbmdlcyB0byBhdm9pZCBnY2Mgd2FybmluZ3M6IEFkZCBBVFRSSUJVVEVfVU5VU0VECi0JYXMgYXBwcm9wcmlhdGUuICBGaWxsIGluIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMuICBBZGQgdmFyaWFibGUKLQlpbml0aWFsaXphdGlvbnMuICBBZGQgY2FzdHMuCi0JKiBkd2FyZjJkYmcuYyAocHJpbnRfc3RhdHMpOiBDaGFuZ2UgaSB0byBzaXplX3QuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbGlzdGluZyk6IENoYW5nZSBsaXN0X2xpbmUgdG8gdW5zaWduZWQgaW50LgotCi0xOTk5LTA3LTEwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSkgW09CSl9FTEZdOiBDYWxsIFNfSVNfTE9DQUwKLQlyYXRoZXIgdGhhbiBjaGVja2luZyBmb3IgXDAwMSBhbmQgXDAwMiBpbiBzeW1ib2wgbmFtZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19maXhfYWRqdXN0YWJsZSkgW09CSl9FTEZdOiBMaWtld2lzZS4KLQotVGh1IEp1bCAgOCAxMjozMjoyMyAxOTk5ICBKb2huIERhdmlkIEFuZ2xpbiA8ZGF2ZUBoaWF1bHkxLmhpYS5ucmMuY2E+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotbGludXgtZ251Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLTE5OTktMDctMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWFybS50ZXhpIChBUk0gRGlyZWN0aXZlcyk6IERvY3VtZW50IC50aHVtYl9zZXQgZGlyZWN0aXZlLiAKLQotMTk5OS0wNy0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9jb21tKTogVXNlIHN5bWJvbF9nZXRfb2JqKCkgcmF0aGVyIHRoYW4KLQlhY2Nlc3Npbmcgc3ltYm9sUCBkaXJlY3RseS4KLQotVHVlIEp1bCAgNiAxMDo0MTo0MiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHRjX2Zyb2Jfc3ltYm9sKTogQWx3YXlzIHB1bnQgIiRnbG9iYWwkIiBzeW1ib2wKLQlmb3IgRUxGLgotCi0xOTk5LTA3LTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKEFSTV9FWFRfVjUpOiBEZWZpbmUuCi0JKEFSTV9BUkNIX1Y1LCBBUk1fQVJDSF9WNVQpOiBEZWZpbmUuCi0JKG1kX2JlZ2luKTogRGV0ZWN0IEFSTSB2NSBhcmNoaXRlY3R1cmVzLgotCShtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgYXJtIHY1IHNwZWNpZmljYXRpb24uCi0JKG1kX3Nob3dfdXNhZ2UpOiBEb2N1bW1lbnQgLW1hcm12NSBzd2l0Y2guCi0KLQkqIGRvYy9jLWFybS50ZXhpOiBEb2N1bWVudCAtbWFybXY1IGNvbW1hbmQgbGluZSBvcHRpb24uCi0JCi0JKiBjb25maWcvdGMtYXJtLmMgKGRvX2FkcmwpOiBOZXcgZnVuY3Rpb24uICBJbXBsZW1lbnQgQURSTCBwc2V1ZG8KLQlvcC4KLQkodmFsaWRhdGVfaW1tZWRpYXRlX3R3b3BhcnQpOiBOZXcgZnVuY3Rpb24uICBEZXRlcm1pbmUgaWYgYQotCWNvbnN0YW50IGNhbiBiZSBjb21wdXRlZCBieSB0d28gQUREIGluc3RydWN0aW9ucy4KLQkob3V0cHV0X2luc3QpOiBSZW1vdmUgaXRzIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgLSBpdCB3YXMgbmV2ZXIKLQl1c2VkLgotCShtZF9hcHBseV9maXgzKTogU3VwcG9ydCBCRkRfUkVMT0NfQVJNX0FEUkxfSU1NRURJQVRFLCB1c2VkIHRvCi0JaW1wbGVtZW10IHRoZSBBRFJMIHBzZXVkbyBvcC4KLQkodGNfZ2VuX3JlbG9jKTogR2VuZXJhdGUgYSBzdWl0YWJsZSBlcnJvciBtZXNzYWdlIGlmIGFuIEFEUkwKLQlpbnN0cnVjdGlvbiB0cmllcyB0byBnZW5lcmF0ZSBhIHJlYWwgcmVsb2MuCi0KLQkqIGRvYy9jLWFybS50ZXhpOiBEb2N1bWVudCBOT1AsIEFEUiBhbmQgQURSTCBwc2V1ZG8gb3BzLgotCi1UaHUgSnVsICAxIDE1OjMzOjEwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBDb252ZXJ0IHRoZSBvcGNvZGUgYW5kIGFsbCBjb21wbGV0ZXJzCi0JaW50byBsb3dlciBjYXNlLgotCi0xOTk5LTA2LTI3ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3RleHRfcCk6IFVzZSAxLzAgaW5zdGVhZCBvZiB0cnVlL2ZhbHNlIGZvcgotCW5vbiBCRkRfQVNTRU1CTEVSIGNhc2UuCi0KLTE5OTktMDYtMjYgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbik6IE1hcmsgd3JpdGFibGUgc2VjdGlvbnMgYXMKLQlkYXRhLgotCi0xOTk5LTA2LTI2ICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyZGJnLmMgKGR3YXJmMl9nZW5fbGluZV9pbmZvKTogRG9uJ3QgY2FsbAotCW91dF9lbmRfc2VxdWVuY2UoKSB3aGVuIHRoZSBhZGRyZXNzIGRlY3JlYXNlcyBkdWUgdG8gYSBuZXcgZnJhZy4KLQkoZ2VuX2Rpcl9saXN0KTogU2V0IGxzLmZpbGVbaV0uZGlyIHRvIGogKyAxIChub3QgaikgYmVjYXVzZSBmaWxlCi0JbnVtYmVyaW5nIHN0YXJ0cyB3aXRoIDEuCi0KLTE5OTktMDYtMjMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgLmNvbW0gZm9yIEVMRiBhbmQgYWxsb3cKLQkuc2VjdGlvbiBmb3IgQ09GRi4KLQkobWNvcmVfc190ZXh0KTogQ2FsbCBvYmpfZWxmX3RleHQgZm9yIEVMRiB0YXJnZXQuCi0JKG1jb3JlX3NfZGF0YSk6IENhbGwgb2JqX2VsZl9kYXRhIGZvciBFTEYgdGFyZ2V0LgotCShtY29yZV9zX3NlY3Rpb24pOiBObyBsb25nZXIgRUxGIHNwZWNpZmljLiAgQ2FsbCBvYmpfY29mZl9zZWN0aW9uCi0JZm9yIENPRkYgdGFyZ2V0LgotCShtY29yZV9zX2Jzcyk6IE5ldyBmdW5jdGlvbjogIER1bXAgbGl0ZXJhbCB0YWJsZSBiZWZvcmUgY2hhbmdpbmcKLQlzZWN0aW9ucy4KLQkobWNvcmVfc19jb21tKTogTmV3IGZ1bmN0aW9uOiAgRHVtcCBsaXRlcmFsIHRhYmxlIGJlZm9yZSBjaGFuZ2luZwotCXNlY3Rpb25zLgotCQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24sIG9ial9lbGZfZGF0YSwgb2JqX2VsZl90ZXh0KToKLQlObyBsb25nZXIgc3RhdGljIGZ1bmN0aW9ucy4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9lbGZfY29tbW9uLCBvYmpfZWxmX2RhdGEsIG9ial9lbGZfdGV4dCk6Ci0JUHJvdmlkZSBwcm90b3R5cGVzIGZvciB0aGVzZSBmdW5jdGlvbnMuCi0KLTE5OTktMDYtMjIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ190ZXh0X3ApOiBSZXdyaXRlIG5vbiBCRkRfQVNTRU1CTEVSIGNhc2UgdG8gdXNlCi0JYSBsaXN0IG9mIG5hbWVzLCB0byB0cnkgb2JqX3NlZ21lbnRfbmFtZSwgYW5kIHRvIHRyeSBhYmJyZXZpYXRlZAotCW5hbWVzIHdoZW4gdXNpbmcgQ09GRiB3aXRob3V0IGxvbmcgc2VjdGlvbiBuYW1lcy4KLQotCSogY29uZmlnL3RjLWFscGhhLmM6IE1vcmUgdXNlIG9mIHN5bWJvbCBhY2Nlc3NvciBmdW5jdGlvbnMuCi0JKiBjb25maWcvdGMtYXJjLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWQzMHYuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtZnIzMC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1pODYwLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW04OGsuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWNvcmUuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbnMzMmsuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc3BhcmMuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdjg1MC5jOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWFyYy5jIChnZXRfYXJjX2V4cF9yZWxvY190eXBlKTogQ2hhbmdlIHVzZXMgb2YKLQlzeV92YWx1ZSB3aXRoIGFwcHJvcHJpYXRlIGFjY2Vzc29yIGZ1bmN0aW9ucy4KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWQxMHYuYyAoQVRfV09SRF9QKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdjg1MC5jIChyZWdfbmFtZV9zZWFyY2gpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfZWNvZmZfc2V0X2V4dCk6IENoYW5nZSB1c2VzIG9mIGJzeW0gdG8KLQl1c2Ugc3ltYm9sX2dldF9iZmRzeW0gaW5zdGVhZC4KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfY29tbSk6IExpa2V3aXNlLgotCi0xOTk5LTA2LTIyICBKb25hdGhhbiBMYXJtb3VyICA8amxhcm1vdXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtYXJjLmMgKHRjX2dlbl9yZWxvYyk6IFVzZSBzeW1ib2xfZ2V0X2JmZHN5bSB0byBnZXQgYXQKLQl0aGUgc3ltYm9sLCByYXRoZXIgdGhhbiBhY2Nlc3NpbmcgdGhlIGJzeW0gbWVtYmVyLgotCSogY29uZmlnL3RjLWQxMHYuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtZDMwdi5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tY29yZS5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdGljMzAuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdjg1MC5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQotTW9uIEp1biAyMSAxNjo0NToxOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAoZWxmX2hwcGFfcmVsb2NfdHlwZSk6IFJlbmFtZWQgZnJvbSBlbGYzMl9ocHBhX3JlbG9jX3R5cGUuCi0JKGhwcGFfZ2VuX3JlbG9jX3R5cGUpOiBDb25kaXRpb25hbGl6ZSBvbiBCRkQ2NC4KLQkodGNfZ2VuX3JlbG9jKTogUmUtZW5hYmxlIEVMRiByZWxvY2F0aW9ucy4KLQkqIHRjLWhwcGEuaCAoVEFSR0VUX0ZPUk1BVCk6IEhhbmRsZSBlbGY2NC1ocHBhIGZvcm1hdC4KLQotMTk5OS0wNi0yMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobGRzdF9leHRlbmQpOiBBZGQgcGFyZW50aGVzZXMgdG8gYXZvaWQKLQl3YXJuaW5nLgotCShkb19sZHN0KTogTW92ZSBhc3NpZ25tZW50IG91dCBvZiBpZiBjb25kaXRpb24uCi0JKG1kX2FwcGx5X2ZpeDMpOiBBZGQgY2FzdHMgdG8gYXZvaWQgcHJpbnRmIGZvcm1hdCB3YXJuaW5ncy4gIEFkZAotCXBhcmVudGhlc2VzIHRvIGF2b2lkIHdhcm5pbmcuCi0KLTE5OTktMDYtMjEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYXJtX2FkanVzdF9zeW10YWIpOiBVc2Ugc3ltYm9sX2dldF9iZmRzeW0oKQotCW1hY3JvIHRvIGdldCBhdCB0aGUgQkZEIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYSBHQVMgc3ltYm9sLgotCi0xOTk5LTA2LTE5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jOiBVcGRhdGUgZm9yIHN5bWJvbCBoYW5kbGluZyBjaGFuZ2VzLgotCSogY29uZmlnL29iai1jb2ZmLmM6IExpa2V3aXNlLgotCi1GcmkgSnVuIDE4IDE0OjM0OjE4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jOiBHZW5lcmFsIGNsZWFudXBzIG9mIEVMRiBzdXBwb3J0LiAgTm8gbW9yZSBzcGFjZXMKLQlhbmQgc3Vic3BhY2VzIGZvciBFTEYuCi0JKEdEQl9ERUJVR19TUEFDRV9OQU1FKTogRGVsZXRlIGRlZmluaXRpb24gZm9yIEVMRi4KLQkoR0RCX1NUUklOR1NfU1VCU1BBQ0VfTkFNRSk6IExpa2V3aXNlLgotCShHREJfU1lNQk9MU19TVUJTUEFDRV9OQU1FKTogTGlrZXdpc2UKLQkoVU5XSU5EX1NFQ1RJT05fTkFNRSk6IExpa2V3aXNlLgotCShzcGFjZS9zdWJzcGFjZSByZWxhdGVkIHN0cnVjdHVyZXMpOiBDb25kaXRpb25hbGl6ZSBkZWZpbml0aW9ucwotCW9uIE9CSl9TT00uCi0JKHNwYWNlL3N1YnNwYWNlIGRpcmVjdGl2ZXMgYW5kIHN1cHBvcnQgcm91dGluZXMpOiBDb25kaXRpb25hbGl6ZQotCWRlZmluaXRpb25zIGFuZCByZWZlcmVuY2VzL3VzZXMgb24gT0JKX1NPTS4KLQkobGFiZWxfc3ltYm9sX3N0cnVjdCk6IEZvciBFTEYsIHRyYWNrIHRoZSBzeW1ib2wncyBzZWdtZW50LiAgRm9yCi0JU09NIHRyYWNrIGl0cyBzcGFjZS4KLQkocGFfZGVmaW5lX2xhYmVsLCBwYV91bmRlZmluZV9sYWJlbCwgcGFfZ2V0X2xhYmVsKTogQ29ycmVzcG9uZGluZwotCWNoYW5nZXMuCi0JKFVTRV9BTElBU0VTKTogS2lsbCBmb3IgYm90aCBTT00gJiBFTEYuCi0JKHBhX2RlZl9zdWJzcGFjZXMsIHBhX2RlZl9zcGFjZXMpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKHBhX3NwYWNlLCBwYV9zdWJzcGFjZSk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkocGFfc3BhY2VzX2JlZ2luKTogQ29ycmVzcG9uZGluZyBjaGFnbmVzLgotCShtZF9iZWdpbik6IERvIG5vdCBtdWNrIGFyb3VuZCB3aXRoIHNwYWNlL3N1YnNwYWNlIHN0dWZmIGZvcgotCU9CSl9FTEYuCi0JKG1kX2FwcGx5X2ZpeCk6IFRlbXBvcmFyaWx5IGRpc2FibGUgYXJndW1lbnQgcmVsb2NhdGlvbiBzdHVmZgotCWZvciBPQkpfRUxGLgotCSh0Y19nZW5fcmVsb2MpOiBUZW1wb3JhcmlseSBkaXNhYmxlIHJlbG9jYXRpb24gZ2VuZXJhdGlvbiBmb3IKLQlPQkpfRUxGCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IFNpbWlsYXJseS4KLQotMTk5OS0wNi0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jICh0aHVtYl9zZXQpOiBOZXcgcHNldWRvIG9wLgotCSh0ZXh0LCBkYXRhLCBzZWN0aW9uKTogT3ZlcnJpZGUgdGhlc2UgcHNldWRvIG9wcyB3aXRoIEFSTQotCXNwZWNpZmljIHZlcnNpb25zLgotCShzX3RodW1iX3NldCk6IE5ldyBmdW5jdGlvbjogUGVyZm9ybSB0aGUgc2FtZSBhcyBhIC5zZXQgcHNldWRvCi0Jb3AsIGJ1dCBhbHNvIG1hcmsgdGhlIGFsaWFzJ2VkIHN5bWJvbCBhcyBiZWluZyBhIFRodW1iCi0JZnVuY3Rpb24uCi0JKGFybV9zX3RleHQpOiBOZXcgZnVuY3Rpb246IFBlcmZvcm0gdGhlIHNhbWUgYXMgdGhlIC50ZXh0Ci0JcHNldWRvIG9wLCBidXQgZHVtcCB0aGUgbGl0ZXJhbCBwb29sIGJlZm9yZSBjaGFuZ2luZwotCXNlY3Rpb25zLiAKLQkoYXJtX3NfZGF0YSk6IE5ldyBmdW5jdGlvbjogUGVyZm9ybSB0aGUgc2FtZSBhcyB0aGUgLmRhdGEKLQlwc2V1ZG8gb3AsIGJ1dCBkdW1wIHRoZSBsaXRlcmFsIHBvb2wgYmVmb3JlIGNoYW5naW5nCi0Jc2VjdGlvbnMuIAotCShhcm1fc19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uOiBQZXJmb3JtIHRoZSBzYW1lIGFzIHRoZQotCS5zZWN0aW9uIHBzZXVkbyBvcCwgYnV0IGR1bXAgdGhlIGxpdGVyYWwgcG9vbCBiZWZvcmUgY2hhbmdpbmcgCi0Jc2VjdGlvbnMuIAotCShhcm1fY2xlYW51cCk6IERvIG5vdCByZXNldCB0aGUgY3VycmVudCBzZWN0aW9uIGJlZm9yZSBkdW1waW5nCi0JdGhlIGxpdGVyYWwgcG9vbC4KLQotMTk5OS0wNi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfbG9uZ29wdHMpOiBGaXggT1BUSU9OX1dBUk5fVU5NQVRDSEVEIGFuZAotCU9QVElPTl9OT19XQVJOX1VOTUFUQ0hFRCBlbnRyaWVzLgotCShtZF9wYXJzZV9vcHRpb24pOiBHZW5lcmF0ZSBhIHdhcm5pbmcgbWVzc2FnZSBpZiBhbiB1bnJlY29nbmlzZWQKLQlvcHRpb24gaXMgZW5jb3VudGVyZWQuCi0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGRvX25vdF9pZ25vcmVfaGFzaCk6IE5ldyB2YXJpYWJsZS4KLQkoZ2V0X29wZXJhbmRzKTogV2hlbiBwYXJzaW5nIGFuIGV4cHJlc3Npb24gYWZ0ZXIgYW4gJ0AnIHN5bWJvbAotCWhhcyBiZWVuIGRldGVjdGVkLCBkbyBub3QgaWdub3JlICcjJyBzeW1ib2xzLgotCShtZF9vcGVyYW5kKTogT25seSBpZ25vcmUgJyMnIHN5bWJvbHMgaWYgZG9fbm90X2lnbm9yZV9oYXNoIGlzCi0JZmFsc2UuIAotCi0xOTk5LTA2LTEzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gSy4gUmljaGFyZCBQaXhsZXkgPHJpY2hAbm9pci5jb20+OgotCSogY29uZmlndXJlLmluIChwcGMtKi12eHdvcmtzKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDYtMTIgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAodGNfZ2VuX3JlbG9jKTogRml4IGhhbmRsaW5nIG9mIEdPVFBDIHJlbG9jcy4KLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogUmF0aGVyIHRoYW4gbmV2ZXIgcmVkdWNpbmcgcmVsb2MKLQl3aGljaCByZWZlciB0byBzeW1ib2xzIGluIGxpbmtvbmNlIHNlY3Rpb25zLCBwZXJtaXQgcmVkdWNpbmcgdGhlCi0JcmVsb2NzIGlmIHRoZSBzeW1ib2wgaXMgbG9jYWwuCi0KLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ190ZXh0X3ApOiBOZXcgZnVuY3Rpb24uCi0JKiBhcy5oIChzdWJzZWdfdGV4dF9wKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAoZG9fYWxpZ24pOiBVc2Ugc3Vic2VnX3RleHRfcCB0byBzZXQgdGhlIGRlZmF1bHQgZmlsbC4KLQkqIHdyaXRlLmMgKHN1YnNlZ3NfZmluaXNoKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX21heWJlX3RleHQpOiBEb24ndCBkZWZpbmUuCi0JKG1kX2RvX2FsaWduKTogVXNlIHN1YnNlZ190ZXh0X3AgdG8gc2V0IHRoZSBkZWZhdWx0IGZpbGwuCi0JKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChtZF9kb19hbGlnbik6IExpa2V3aXNlLgotCi0xOTk5LTA2LTEyICBEYXZpZCBPJ0JyaWVuICA8b2JyaWVuQGZyZWVic2Qub3JnPgotCi0JKiBjb25maWd1cmUuaW46IChpWzM0NTZdODYtKi1mcmVlYnNkKik6IE5vdyBkZWZhdWx0cyB0byBFTEYuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkd2FyZjJkYmcuYzogSW5jbHVkZSBlbGYvZHdhcmYyLmggd2l0aCAiIiwgbm90IDw+LgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfaW1tZWRpYXRlKTogUmVtb3ZlIHVudXNlZCBsYWJlbAotCXNlZ191bmltcGxlbWVudGVkLgotCi0JKiBzdHJ1Yy1zeW1ib2wuaDogUHV0IGxvY2FsX3N5bWJvbCBjb2RlIGluIGlmZGVmIEJGRF9BU1NFTUJMRVIuCi0JKiBzeW1ib2xzLmM6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBSZWZlciBkaXJlY3RseSB0bwotCXN5X25leHQgZmllbGQgd2hlbiB0YWtpbmcgYWRkcmVzcywgcmF0aGVyIHRoYW4gc3ltYm9sX25leHQuCi0KLQkqIGR3YXJmMmRiZy5jOiBDaGFuZ2UgYmZkX3ZtYSB0byBhZGRyZXNzVCBhbmQgYmZkX3NpZ25lZF92bWEgdG8KLQlvZmZzZXRULgotCShvdXRfc2V0X2FkZHIpOiBEb24ndCB1c2UgQllURVNfUEVSX0FERFJFU1MuICBJbnN0ZWFkLCBnZXQgdGhlCi0JdmFsdWUgZnJvbSB0aGUgb3V0cHV0IGZpbGUgYXJjaGl0ZWN0dXJlLgotCShkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IElmZGVmIEJGRF9BU1NFTUJMRVIgc3BlY2lmaWMgY29kZS4KLQkqIGR3YXJmMmRiZy5oOiBDaGFuZ2UgYmZkX3ZtYSB0byBhZGRyZXNzVC4KLQotMTk5OS0wNi0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGR3YXJmMmRiZy5oOiBVc2UgUEFSQU1TIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQotMTk5OS0wNi0xMSAgTWFydGluIERvcmV5ICA8bWRvcmV5QG1hZGdlLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGFkZCBzeW1ib2wgdmFsdWUgZm9yIGk5NjAgRUxGLgotCSogY29uZmlnL3RjLWk5NjAuYyAoc19sZWFmcHJvYyk6IERvbid0IGNhbGwgdGNfc2V0X2JhbF9vZl9jYWwgaWYKLQlPQkpfRUxGLgotCShtZF9hcHBseV9maXgpOiBTaW1wbGlmeSBCRkRfQVNTRU1CTEVSIGhhbmRsaW5nLgotCi0xOTk5LTA2LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gc3dpdGNoLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKTogUmVtb3ZlIHB1c2hzZWN0aW9uIGFuZAotCXBvcHNlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gcmVsb2Mgc3dpdGNoLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IE9ubHkgZGVjbGFyZSBpbmVzY2FwZSBpZgotCVFVT1RFU19JTl9JTlNOLgotCi0JKiBpdGJsLW9wcy5jIChpdGJsX2Rpc2Fzc2VtYmxlKTogQ2hhbmdlIHNwcmludGYgZm9ybWF0IHN0cmluZ3MgdG8KLQltYXRjaCBwYXJhbWV0ZXJzLgotCShmaW5kX2VudHJ5X2J5dmFsKTogQWRkIHBhcmVucyB0byBhdm9pZCB3YXJuaW5nLgotCi0JKiBhcy5jOiBJZiBIQVZFX0lUQkxfQ1BVLCBpbmNsdWRlICJpdGJsLW9wcy5oIi4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IERvbid0IHBlcm1pdCBzdWJ0cmFjdGlvbiBvZgotCXVuZGVmaW5lZCBzeW1ib2xzLgotCi0xOTk5LTA2LTEwICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBEb24ndCB1c2Ugc2lkZS1lZmZlY3QgZXhwcmVzc2lvbgotCXdpdGggaXNvY3RhbC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHN5bnRoZXRpemVfc2V0dXcsIHN5bnRoZXRpemVfc2V0c3csCi0Jc3ludGhldGl6ZV9zZXR4KTogTmV3IGZ1bmN0aW9ucy4KLQkobWRfYXNzZW1ibGUpOiBCcm9rZW4gdGhlIHNwZWNpYWwgY2FzZXMgaW50byB0aGUgYWJvdmUKLQlmdW5jdGlvbnMuIE1ha2UgY29tcGlsZXIgaGFwcHkgaWYgc2l6ZW9mKGJmZF92bWEpPT00LgotCUZpeCBzZXRoaSBnZW5lcmF0ZWQgZnJvbSBzZXQvc2V0dXcuIElmIGluc3RydWN0aW9ucyBoYXZlIGEgcmVsbG9jLAotCWFsd2F5cyBjbGVhciB0aGUgZmllbGRzIHRvIGJlIHJlbG9jYXRlZCBpbiB0aGUgb3Bjb2RlLgotCShzcGFyY19pcCk6IFJlbW92ZSBzcGVjaWFsX2Nhc2UgZ2xvYmFsIHZhcmlhYmxlLgotCi0xOTk5LTA2LTEwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBKb2huIFcuIFdvem5hY2sgPGp3b3puYWNrQGNvbmNlbnRyaWMubmV0PjoKLQkqIGl0Ymwtb3BzLmMgKGl0YmxfZ2V0X3JlZ192YWwpOiBBZGQgcHZhbCBwYXJhbWV0ZXIuICBSZXR1cm4KLQlpbmRpY2F0aW9uIG9mIHN1Y2Nlc3MgcmF0aGVyIHRoYW4gYSB2YWx1ZS4KLQkoaXRibF9nZXRfdmFsKTogTGlrZXdpc2UuCi0JKGl0YmxfZ2V0X2ZpZWxkKTogVXNlIHN0cmNzcG4uICBDaGFuZ2UgZGVsaW1pdGVycyB0byBpbmNsdWRlCi0JcGFyZW5zLgotCSogaXRibC1vcHMuaCAoaXRibF9nZXRfcmVnX3ZhbCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoaXRibF9nZXRfdmFsKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogVXBkYXRlIGNhbGwgdG8gaXRibF9nZXRfcmVnX3ZhbC4KLQotCSogc3ltYm9scy5jIChjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzKTogQ29udmVydCBsb2NhbCBzeW1ib2xzIHRvCi0JcmVndWxhciBzeW1ib2xzLgotCi0xOTk5LTA2LTEwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciBBUk05MjAgYW5kCi0JQVJNOTIwdC4gCi0KLTE5OTktMDYtMDcgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2Fzc2VtYmxlKTogRml4IHVwIHNldHgsIHN1cHBvcnQgc2V0c3cuCi0JT3B0aW1pemUgc2V0IGlmIHNpemVvZihiZmRfdm1hKSA9PSA2NC4KLQkoc3BhcmNfaXApOiBGaXggc2V0aGkgLSB3aXRob3V0ICVoaSgpIGl0IHNob3VsZCBnZW5lcmF0ZQotCVJfU1BBUkNfMjIgcmVsb2MsIG5vdCBSX1NQQVJDX0hJMjIuCi0JKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBCRkRfUkVMT0NfU1BBUkMyMi4KLQotMTk5OS0wNi0wNyAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYmVnaW4pOiBIYW5kbGUgbmF0aXZlIHdvcmRzaXplIGFsaWFzZXMuCi0JKHNfbmNvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKG5hdGl2ZV9vcF90YWJsZSk6IE5ldyB0YWJsZS4KLQkoc3BhcmNfaXApOiBCZSBtb3JlIHN0cmljdCBvbiAlaGkoKSBldGMuOyBwcmVwYXJlIGFzc2VtYmxlciBmb3IKLQlSX1NQQVJDX09MTzEwIGhhbmRsaW5nLgotCi1Nb24gSnVuICA3IDEwOjIyOjE2IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuaCAoc3RydWN0IGV4cHJlc3Npb25TKTogUmV2ZXJ0IGxhc3QgY2hhbmdlOyB3aWRlbiBYX29wLgotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX2JlZ2luKTogQ2hlY2sgdGhlIGZpZWxkIGlzIHdpZGUgZW5vdWdoLgotCi1Nb24gSnVuICA3IDExOjI1OjE2IDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuYW0gKFRBUkdFVF9DUFVfQ0ZJTEVTKTogQWRkIGNvbmZpZy90Yy1mcjMwLmMuCi0JKFRBUkdFVF9DUFVfSEZJTEVTKTogQWRkIGNvbmZpZy90Yy1mcjMwLmguCi0JKFRBUkdfRU5WX0hGSUxFUyk6IEFkZCBjb25maWcvdGUtZXBvYy1wZS5oLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IEluIE1SSSBtb2RlIGlmIGNhbGxlZCBhcwotCWBjb21tb24nIHBhc3Mgb24gdG8gc19tcmlfY29tbW9uLgotCShlbGZfcHNldWRvX3RhYmxlKTogUGFzcyAxIHRvIG9ial9lbGZfY29tbW9uIGZvciBgY29tbW9uJy4gCi0KLTE5OTktMDYtMDYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IERvbid0IGZyZWUgdGhlIHJldHVybgotCXZhbHVlIG9mIGRlbWFuZF9jb3B5X0Nfc3RyaW5nLgotCi0xOTk5LTA2LTA1ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBkd2FyZjJkYmcuYyAoZHdhcmYyX2dlbl9saW5lX2luZm8pOiBNaXJyb3IgdGhlIHNlY3Rpb24gc3ltYm9sCi0JY3JlYXRpb24gbG9naWMgZnJvbSBvYmpfZWxmX2NyZWF0ZV9zZWN0aW9uLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfcHNldWRvX3RhYik6IEFkZCBwdXNoc2VjdGlvbi9wb3BzZWN0aW9uLgotCShzZWN0aW9uX3N0YWNrKTogTmV3LgotCShzcGVjaWFsX3NlY3Rpb25zKTogTWFrZSBjb25zdC4KLQkob2JqX2VsZl9zZWN0aW9uKTogR3V0IGFuZCByZXdyaXRlIHBhcnNpbmcuCi0JKG9ial9lbGZfY2hhbmdlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24gYnJva2VuIG91dCBvZiBvYmpfZWxmX3NlY3Rpb24uCi0JKG9ial9lbGZfcGFyc2Vfc2VjdGlvbl9sZXR0ZXJzKTogTGlrZXdpc2UuCi0JKG9ial9lbGZfc2VjdGlvbl93b3JkKTogTGlrZXdpc2UuCi0JKG9ial9lbGZfc2VjdGlvbl90eXBlKTogTGlrZXdpc2UuCi0JKG9ial9lbGZfcHJldmlvdXMpOiBUcmVhdCBhcyBhIHRvZ2dsZS4KLQkob2JqX2VsZl9wb3BzZWN0aW9uKTogTmV3LgotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfc2VjdGlvbl93b3JkKTogVGFrZSBzdHIrbGVuIG5vdCBwdHJfc3RyLgotCShwcGNfc2VjdGlvbl90eXBlKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtcHBjLmg6IExpa2V3aXNlLgotCi0JKiBleHByLmggKHN0cnVjdCBleHByZXNzaW9uUyk6IERvbid0IG1ha2UgWF9vcCBhIGJpdGZpZWxkLgotCSogY29uZmlnL3RjLWFscGhhLmM6IFVwZGF0ZSBmb3Igc3ltYm9sIGhhbmRsaW5nIGNoYW5nZXMuCi0JKG1kX2FwcGx5X2ZpeCkgW2Nhc2UgR1BSRUxdOiBVc2Ugbm93X3NlZyBpbnN0ZWFkIG9mIGFic29sdXRlX3NlY3Rpb24uCi0JKGxvYWRfZXhwcmVzc2lvbiwgZW1pdF9pcl9sb2FkLCBlbWl0X2xvYWRzdG9yZSwgZW1pdF9qc3JqbXApOiBMaWtld2lzZS4KLQotMTk5OS0wNi0wNSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyZGJnLmMgKCopOiBDb252ZXJ0IHRvIEsmUiArIHByb3RvdHlwZXMuCi0JKGR3YXJmMl9nZW5fbGluZV9pbmZvKTogS2lsbCB1bnVzZWQgdmFyaWFibGVzLgotCShkd2FyZjJfZmluaXNoKTogTGlrZXdpc2UuCi0JKGR3YXJmMl93aGVyZSk6IExpa2V3aXNlLgotCShkd2FyZjJfZGlyZWN0aXZlX2ZpbGUpOiBJZiB3ZSd2ZSBvbmx5IGdvdCBhIHN0cmluZywKLQloYW5kIG9mZiB0byBzX2FwcF9maWxlLgotCSogZWNvZmYuYzogTW92ZSB0aGUgaW5jbHVkZSBvZiBlY29mZi5oLgotCSogc3ltYm9scy5oIChTX0lTX0ZVTkNUSU9OKTogUHJvdG90eXBlLgotCi0JKiByZWFkLmMgKExFWF9IQVNIKTogU3VwcGx5IGEgZGVmYXVsdC4KLQkobGV4X3R5cGUpOiBVc2UgaXQuCi0JKHNfZ2xvYmwpOiBVcGRhdGUgYGMnIGFmdGVyIHNraXBwaW5nIHdoaXRlc3BhY2UuCi0JKiByZWFkLmggKExFWF9FTkRfTkFNRSwgaXNfbmFtZV9lbmRlcik6IE5ldy4KLQkqIGV4cHIuYyAoZ2V0X3N5bWJvbF9lbmQpOiBSZXNwZWN0IGl0LgotCi0xOTk5LTA2LTA0ICBNYXJrIEtsZWluIDxta2xlaW5AZGlzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYmVnaW4pOiBDb252ZXJ0IGxvY2FsIHN5bWJvbCBkdW1teV9zeW1ib2wKLQl0byByZWFsIGlmIE9CSl9TT00KLQkodGNfZ2VuX3JlbG9jKTogU3RpbGwgbmVlZCBiZmRfYWJzX3N5bWJvbCBpbiBzb21lIHJlbG9jcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYzogVXBkYXRlIGZvciBzeW1ib2wgaGFuZGxpbmcgY2hhbmdlcy4KLQotMTk5OS0wNi0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNnZW4uYzogVXBkYXRlIGZvciBzeW1ib2wgaGFuZGxpbmcgY2hhbmdlcy4KLQkqIGNvbmZpZy90Yy1tMzJyLmM6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBVcGRhdGUgZm9yIHN5bWJvbCBoYW5kbGluZyBjaGFuZ2VzLgotCSogY29uZmlnL3RjLWhwcGEuYzogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1hcm0uaDogVXBkYXRlIGZvciBzeW1ib2wgaGFuZGxpbmcgY2hhbmdlcy4KLQkqIGNvbmZpZy90Yy1hcm0uYzogTGlrZXdpc2UuCi0JKHN5bWJvbF9tYWtlX2VtcHR5KTogUmVtb3ZlLiAgSnVzdCB1c2Ugc3ltYm9sX2NyZWF0ZS4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfc2V0X3RjKTogQ29ycmVjdCBuYW1lLgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKCQoT0JKUykpOiBEb24ndCBkZXBlbmQgdXBvbiBzdHJ1Yy1zeW1ib2wuaC4KLQkoLmRlcDEsIC50Y2RlcCwgLm9iamRlcCk6IENyZWF0ZSBpdGJsLXBhcnNlLmguCi0JKiBkZXAtaW4uc2VkOiBEb24ndCByZW1vdmUgc3RydWMtc3ltYm9sLmguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogZG9jL2ludGVybmFscy50ZXhpIChTeW1ib2xzKTogRGVzY3JpYmUgY2hhbmdlcyBpbiBzeW1ib2wKLQloYW5kbGluZy4KLQotMTk5OS0wNi0wMyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyZGJnLmMgKGR3YXJmMl9nZW5fbGluZV9pbmZvKTogVXNlIHNlY3Rpb25fc3ltYm9sCi0JaW5zdGVhZCBvZiBkb2luZyB0aGUgd29yayBieSBoYW5kLgotCi0xOTk5LTA2LTAzICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyZGJnLmMgKElOSVRJQUxfU1RBVEUpOiBOZXcgbWFjcm8gZW5jYXBzdWxhdGluZyBpbml0aWFsCi0Jc3RhdGUgb2YgbGluZSBzdGF0ZS1tYWNoaW5lLgotCShzdHJ1Y3QgbHMpOiBDb2xsZWN0IERXQVJGMiBsaW5lIHN0YXRlLW1hY2hpbmUgc3RhdGUgaW4gbmV3IG1lbWJlcgotCVNNLiAgQWRkIG1lbWJlciBFTVBUWV9TRVFVRU5DRSB0byBrZWVwIHRyYWNrIGlmIGEgY29kZSBzZXF1ZW5jZQotCXJlc3VsdGVkIGluIGFueSBEV0FSRjIgZGlyZWN0aXZlcy4KLQkocmVzZXRfc3RhdGVfbWFjaGluZSk6IE5ldyBmdW5jdGlvbi4KLQkob3V0X2VuZF9zZXF1ZW5jZSk6IERpdHRvLgotCShkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IFdoZW4gc3dpdGNoaW5nIHNlY3Rpb25zIG9yIHN3aXRjaGluZyB0byBhCi0JbG93ZXIgdGV4dCBhZGRyZXNzLCBjYWxsIG91dF9lbmRfc2VxdWVuY2UoKSBmaXJzdCB0byB0ZXJtaW5hdGUgdGhlCi0JcHJldmlvdXMgY29kZSBzZXF1ZW5jZSBhcyBjb2RlIHNlcXVlbmNlcyBNVVNUIGhhdmUgbW9ub3RvbmljYWxseQotCWluY3JlYXNpbmcgYWRkcmVzc2VzLgotCShkd2FyZjJfZmluaXNoKTogQ2FsbCBvdXRfZW5kX3NlcXVlbmNlKCkgaW5zdGVhZCBvZiBvcGVuIGNvZGluZyBpdC4KLQotMTk5OS0wNi0wMyAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBBZGQgb3B0aW9uIC1nZHdhcmYyIHRvIGFsbG93IHJlcXVlc3RpbmcKLQlEV0FSRjIgZGVidWcgaW5mbyAobGluZSBpbmZvcm1hdGlvbiBvbmx5LCBhdCB0aGlzIHBvaW50KS4KLQkqIGFzLmg6IFVwZGF0ZSBjb21tZW50IGFib3V0IHN1cHBvcnRlZCBkZWJ1ZyBmb3JtYXRzLgotCSogZHdhcmYyZGJnLmMsIGR3YXJmMmRiZy5oOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5hbSAoR0FTX0NGSUxFUywgSEZJTEVTLCBHRU5FUklDX09CSlMpOiBBZGQgdGhlbS4KLQotCSogZXhwci5jIChvcGVyYW5kKTogRG9uJ3QgdXNlIFsgZm9yIHBhcmVucyBpZiB3ZSB3YW50IGFuIGluZGV4IG9wLgotCShvcF9lbmNvZGluZyk6IFN3aXRjaCBbIGludG8gT19pbmRleCwgaWYgZGVzaXJlZC4KLQkob3BfcmFuayk6IFJlbnVtYmVyIHdpdGggT19pbmRleCBvbiBib3R0b20uCi0JKGV4cHIpOiBJZiBPX2luZGV4LCBtYXRjaCBjbG9zaW5nIGJyYWNrZXQuCi0JKiBleHByLmggKE9faW5kZXgpOiBOZXcuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogQ29uZGl0aW9uYWxseSBhbGxvdyBtYXRjaGVkICIKLQlpbiBsaW5lcyBwYXNzZWQgdG8gbWRfYXNzZW1ibGUuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9wc2V1ZG9fdGFibGUpOiBBZGQgYGNvbW1vbicuCi0KLTE5OTktMDYtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JQWRkIHN1cHBvcnQgZm9yIHN0b3JpbmcgbG9jYWwgc3ltYm9scyBpbiBhIHNtYWxsIHN0cnVjdHVyZSB0byBzYXZlCi0JbWVtb3J5IHdoZW4gYXNzZW1ibGluZyBsYXJnZSBmaWxlcy4KLQkqIGFzLmg6IERvbid0IGluY2x1ZGUgc3RydWMtc3ltYm9sLmguCi0JKHN5bWJvbFMpOiBBZGQgdHlwZWRlZi4KLQkqIHN5bWJvbHMuYzogSW5jbHVkZSBzdHJ1Yy1zeW1ib2wuaC4KLQkobG9jYWxfaGFzaCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNhdmVfc3ltYm9sX25hbWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBmcm9tIHN5bWJvbF9jcmVhdGUuCi0JKHN5bWJvbF9jcmVhdGUpOiBDYWxsIHNhdmVfc3ltYm9sX25hbWUuCi0JKGxvY2FsX3N5bWJvbF9jb3VudCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvY2FsX3N5bWJvbF9jb252ZXJzaW9uX2NvdW50KTogTGlrZXdpc2UuCi0JKExPQ0FMX1NZTUJPTF9DSEVDSyk6IERlZmluZS4KLQkobG9jYWxfc3ltYm9sX21ha2UpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsb2NhbF9zeW1ib2xfY29udmVydCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvbG9uKTogSGFuZGxlIGxvY2FsIHN5bWJvbHMuICBDcmVhdGUgbG9jYWwgc3ltYm9sIGZvciBsb2NhbAotCWxhYmVsIG5hbWUuCi0JKHN5bWJvbF90YWJsZV9pbnNlcnQpOiBIYW5kbGUgbG9jYWwgc3ltYm9scy4KLQkoc3ltYm9sX2ZpbmRfb3JfbWFrZSk6IENyZWF0ZSBsb2NhbCBzeW1ib2wgZm9yIGxvY2FsIGxhYmVsIG5hbWUuCi0JKHN5bWJvbF9maW5kX2Jhc2UpOiBDaGVjayBmb3IgbG9jYWwgc3ltYm9sLgotCShzeW1ib2xfYXBwZW5kLCBzeW1ib2xfaW5zZXJ0KTogQ2hlY2sgZm9yIGxvY2FsIHN5bWJvbHMuCi0JKHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzLCBzeW1ib2xfcmVtb3ZlKTogTGlrZXdpc2UuCi0JKHZlcmlmeV9zeW1ib2xfY2hhaW4pOiBMaWtld2lzZS4KLQkoY29weV9zeW1ib2xfYXR0cmlidXRlcyk6IExpa2V3aXNlLgotCShyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEhhbmRsZSBsb2NhbCBzeW1ib2xzLgotCShyZXNvbHZlX2xvY2FsX3N5bWJvbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHJlc29sdmVfbG9jYWxfc3ltYm9sX3ZhbHVlcyk6IE5ldyBmdW5jdGlvbi4KLQkoU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKTogSGFuZGxlIGxvY2FsIHN5bWJvbHMuCi0JKFNfSVNfRlVOQ1RJT04sIFNfSVNfRVhURVJOQUwsIFNfSVNfV0VBSywgU19JU19DT01NT04pOiBMaWtld2lzZS4KLQkoU19JU19ERUZJTkVELCBTX0lTX0RFQlVHLCBTX0lTX0xPQ0FMLCBTX0dFVF9OQU1FKTogTGlrZXdpc2UuCi0JKFNfR0VUX1NFR01FTlQsIFNfU0VUX1NFR01FTlQsIFNfU0VUX0VYVEVSTkFMKTogTGlrZXdpc2UuCi0JKFNfQ0xFQVJfRVhURVJOQUwsIFNfU0VUX1dFQUssIFNfU0VUX05BTUUpOiBMaWtld2lzZS4KLQkoc3ltYm9sX3ByZXZpb3VzLCBzeW1ib2xfbmV4dCk6IE5ldyBmdW5jdGlvbnMuCi0JKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbik6IExpa2V3aXNlLgotCShzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24pOiBMaWtld2lzZS4KLQkoc3ltYm9sX3NldF9mcmFnLCBzeW1ib2xfZ2V0X2ZyYWcpOiBMaWtld2lzZS4KLQkoc3ltYm9sX21hcmtfdXNlZCwgc3ltYm9sX2NsZWFyX3VzZWQsIHN5bWJvbF91c2VkX3ApOiBMaWtld2lzZS4KLQkoc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyk6IExpa2V3aXNlLgotCShzeW1ib2xfY2xlYXJfdXNlZF9pbl9yZWxvYywgc3ltYm9sX3VzZWRfaW5fcmVsb2NfcCk6IExpa2V3aXNlLgotCShzeW1ib2xfbWFya19tcmlfY29tbW9uLCBzeW1ib2xfY2xlYXJfbXJpX2NvbW1vbik6IExpa2V3aXNlLgotCShzeW1ib2xfbXJpX2NvbW1vbl9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9tYXJrX3dyaXR0ZW4sIHN5bWJvbF9jbGVhcl93cml0dGVuKTogTGlrZXdpc2UuCi0JKHN5bWJvbF93cml0dGVuX3ApOiBMaWtld2lzZS4KLQkoc3ltYm9sX21hcmtfcmVzb2x2ZWQsIHN5bWJvbF9yZXNvbHZlZF9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9zZWN0aW9uX3AsIHN5bWJvbF9lcXVhdGVkX3ApOiBMaWtld2lzZS4KLQkoc3ltYm9sX2NvbnN0YW50X3ApOiBMaWtld2lzZS4KLQkoc3ltYm9sX2dldF9iZmRzeW0sIHN5bWJvbF9zZXRfYmZkc3ltKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9nZXRfb2JqLCBzeW1ib2xfc2V0X29iaik6IExpa2V3aXNlLgotCShzeW1ib2xfZ2V0X3RjLCBzeW1ib2xfc2V0X3RjKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9iZWdpbik6IEluaXRpYWxpemUgbG9jYWxfaGFzaC4KLQkocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBIYW5kbGUgbG9jYWwgc3ltYm9scy4KLQkoc3ltYm9sX3ByaW50X3N0YXRpc3RpY3MpOiBQcmludCBsb2NhbCBzeW1ib2wgc3RhdGlzdGljcy4KLQkqIHN5bWJvbHMuaDogSW5jbHVkZSAic3RydWMtc3ltYm9sLmgiIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCURlY2xhcmUgbmV3IHN5bWJvbHMuYyBmdW5jdGlvbnMuICBNb3ZlIG1hbnkgZGVjbGFyYXRpb25zIGhlcmUgZnJvbQotCXN0cnVjLXN5bWJvbC5oLgotCShTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTKTogRGVmaW5lIGlmIG5lZWRlZC4KLQkqIHN0cnVjLXN5bWJvbC5oIChTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTKTogRG9uJ3Qgc2V0LgotCShzdHJ1Y3Qgc3ltYm9sKTogTW92ZSBic3ltIHRvIG1ha2UgaXQgY2xlYXJseSB0aGUgZmlyc3QgZmllbGQuCi0JUmVtb3ZlIFRBUkdFVF9TWU1CT0xfRklFTERTLgotCShzeW1ib2xTKTogRG9uJ3QgdHlwZWRlZi4KLQkoc3RydWN0IGJyb2tlbl93b3JkKTogUmVtb3ZlLgotCShOX1RZUEVfc2VnLCBzZWdfTl9UWVBFKTogTW92ZSB0byBzeW1ib2wuaC4KLQkoU0VHTUVOVF9UT19TWU1CT0xfVFlQRSwgTl9SRUdJU1RFUik6IExpa2V3aXNlLgotCShzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyk6IExpa2V3aXNlLgotCShzeW1ib2xfaW5zZXJ0LCBzeW1ib2xfcmVtb3ZlKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9wcmV2aW91cywgc3ltYm9sX2FwcGVuZCk6IExpa2V3aXNlLgotCSh2ZXJpZnlfc3ltYm9sX2NoYWluLCB2ZXJpZnlfc3ltYm9sX2NoYWluXzIpOiBMaWtld2lzZS4KLQkoc3RydWN0IGxvY2FsX3N5bWJvbCk6IERlZmluZS4KLQkobG9jYWxfc3ltYm9sX2NvbnZlcnRlZF9wLCBsb2NhbF9zeW1ib2xfbWFya19jb252ZXJ0ZWQpOiBEZWZpbmUuCi0JKGxvY2FsX3N5bWJvbF9yZXNvbHZlZF9wLCBsb2NhbF9zeW1ib2xfbWFya19yZXNvbHZlZCk6IERlZmluZS4KLQkobG9jYWxfc3ltYm9sX2dldF9mcmFnLCBsb2NhbF9zeW1ib2xfc2V0X2ZyYWcpOiBEZWZpbmUuCi0JKGxvY2FsX3N5bWJvbF9nZXRfcmVhbF9zeW1ib2wpOiBEZWZpbmUuCi0JKGxvY2FsX3N5bWJvbF9zZXRfcmVhbF9zeW1ib2wpOiBEZWZpbmUuCi0JRGVmaW5lLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIHJlc29sdmVfbG9jYWxfc3ltYm9sX3ZhbHVlcy4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoT0JKX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUuCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX1NZTUZJRUxEX1RZUEUpOiBBZGQgbG9jYWwgZmllbGQuICBJZgotCUVDT0ZGX0RFQlVHR0lORywgYWRkIEVDT0ZGIGZpZWxkcy4KLQkoRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTLCBUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9vYmotbXVsdGkuaCAoc3RydWN0IGVsZl9vYmpfc3kpOiBBZGQgbG9jYWwgZmllbGQuICBJZgotCUVDT0ZGX0RFQlVHR0lORywgYWRkIEVDT0ZGIGZpZWxkcy4KLQkoRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTLCBUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IERvbid0IGRlZmluZS4KLQkoRUNPRkZfREVCVUdfVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtbWNvcmUuaDogRG9uJ3QgaW5jbHVkZSBzdHJ1Yy1zeW1ib2wuaC4KLQkoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBEb24ndCBkZWZpbmUuCi0JKHN0cnVjdCBtY29yZV90Y19zeSk6IERlZmluZS4KLQkoVENfU1lNRklFTERfVFlQRSk6IERlZmluZS4KLQkqIE1hbnkgZmlsZXM6IFVzZSBzeW1ib2xTIGluc3RlYWQgb2Ygc3RydWN0IHN5bWJvbC4gIFVzZSBuZXcKLQlhY2Nlc3NvciBmdW5jdGlvbnMgcmF0aGVyIHRoYW4gcmVmZXJyaW5nIHRvIHN5bWJvbFMgZmllbGRzCi0JZGlyZWN0bHkuCi0KLQkqIHJlYWQuYyAoc19tcmlfY29tbW9uKTogRG9uJ3QgYWRkIGluIHZhbHVlIG9mIGxpbmVfbGFiZWwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IENvcnJlY3QgcGFyZW50aGVzaXphdGlvbiB3aGVuCi0JY2hlY2tpbmcgZm9yIFNFQ19MSU5LX09OQ0UuCi0KLQkqIGNvbmZpZy90Yy1zaC5oIChzaF9maXhfYWRqdXN0YWJsZSk6IERlY2xhcmUuCi0KLQkqIGFwcC5jIChpbnB1dF9idWZmZXIpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShhcHBfcHVzaCk6IFNhdmUgc2F2ZWRfaW5wdXQgaW4gYWxsb2NhdGVkIGJ1ZmZlci4KLQkoYXBwX3BvcCk6IFJlc3RvcmVkIHNhdmVkX2lucHV0LgotCShkb19zY3J1Yl9jaGFycyk6IENoYW5nZSBnZXQgcGFyYW1ldGVyIHRvIHRha2UgY2hhciAqIGFuZCBpbnQgYXMKLQlhcmd1bWVudHMuICBDaGFuZ2UgR0VUIG1hY3JvIHRvIHBhc3MgaW5wdXRfYnVmZmVyIHRvIGdldAotCWZ1bmN0aW9uLiAgRG9uJ3Qgc2F2ZSBpbnB1dCBpbnRvIGFsbG9jYXRlZCBidWZmZXIuCi0JKiBhcy5oIChkb19zY3J1Yl9jaGFycyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9nZXQpOiBDaGFuZ2UgdG8gdGFrZSBjaGFyICogYW5kIGludC4KLQlSZWFkIGRhdGEgaW50byBwYXNzZWQgaW4gYnVmZmVyLiAgUmVtb3ZlIHN0YXRpYyBidWZmZXIuCi0JKiByZWFkLmMgKHNjcnViX2Zyb21fc3RyaW5nKTogQ2hhbmdlIHRvIHRha2UgY2hhciAqIGFuZCBpbnQuICBDb3B5Ci0JZGF0YSBpbnRvIHBhc3NlZCBpbiBidWZmZXIuCi0KLQkqIGhhc2guaDogTmVhdGVuLiAgRGVjbGFyZSBoYXNoX3RyYXZlcnNlLgotCSogaGFzaC5jOiBDb21wbGV0ZSByZXdyaXRlIGJhc2VkIG9uIEJGRCBoYXNoaW5nIGNvZGUuCi0JKiBnYXNwLmMgKGNodW5rc2l6ZSk6IE5ldyB2YXJpYWJsZS4KLQkqIG1hY3JvLmMgKG1hY3JvX2V4cGFuZF9ib2R5KTogQ2FsbCBoYXNoX2phbSB3aXRoIE5VTEwgcmF0aGVyIHRoYW4KLQloYXNoX2RlbGV0ZS4KLQotMTk5OS0wNS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogQWRkIHBpcGVsaW5lIG9mZnNldCBpbnRvIHJlbG9jCi0JYWRkZW5kIHVubGVzcyB0aGUgdGFyZ2V0IHVzZXMgYW4gb2xkIEFCSS4KLQotTW9uIE1heSAyNCAxMzozNjo1NSAxOTk5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JLVdjaGFyLXN1YnNjcmlwdHMgY2xlYW51cAotCSogbGlzdGluZy5jIChsaXN0aW5nX25ld2xpbmUpOiBVc2UgdW5zaWduZWQgY2hhciB2YXJpYWJsZSwgc28KLSAJY2FsbHMgdG8gaXNhc2NpaSxpc2NudHJsIGFyZSBjb3JyZWN0LgotCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IENhc3QgYXJnIHRvIGlzZGlnaXQsIGV0LiBhbC4gd2l0aAotCSh1bnNpZ25lZCBjaGFyKS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9lbnQsZWNvZmZfc3RhYik6IERpdHRvLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl92dGFibGVfaW5oZXJpdCk6IERpdHRvLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCxtaXBzMTZfaXApOiBEaXR0by4KLQkobXlfZ2V0U21hbGxFeHByZXNzaW9uLGdldF9udW1iZXIsc19taXBzX2VudCk6IERpdHRvLgotCi0xOTk5LTA1LTI4ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAbWF0ZW1hdGlrLnN1LnNlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQ2hlY2sgZm9yIGRpc2FsbG93ZWQgaW5kZXggcmVnaXN0ZXIKLQl3aWR0aCBmb3IgQ29sZGZpcmUuCi0JKGFyY2hfY29sZGZpcmVfcCk6IE5ldyAjZGVmaW5lLgotCShtNjhrX2lwLCBtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IFVzZSBhcmNoX2NvbGRmaXJlX3AuCi0KLTE5OTktMDUtMjggIExpbnVzIE5vcmRiZXJnICA8bGludXMubm9yZGJlcmdAY2FuaXQuc2U+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluc3RhbGxfb3BlcmFuZCk6IEFkZCBwbGFjZXMgYG4nLCBgbycuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBBZGQgZm9ybWF0cyBgRScsIGBHJywgYEgnLgotCShpbnN0YWxsX29wZXJhbmQpOiBBZGQgcGxhY2UgYE4nLgotCShpbml0X3RhYmxlKTogQWRkIHJlZ2lzdGVycyBBQ0MsIE1BQ1NSLCBNQVNLLgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS5oIChtNjhrX3JlZ2lzdGVyKTogQWRkIEFDQywgTUFDU1IsIE1BU0suCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IENoYW5nZSBtY2Y1MjAwIC0tPiBtY2YuCi0JKGFyY2hzKTogQWRkIG1jZjUyMDZlLCBtY2Y1MzA3LgotCShtNjhrX2lwKTogQWRkIGZvcm1hdCBgdScuCi0JKGluc3RhbGxfb3BlcmFuZCk6IEFkZCBwbGFjZSBgbScsIGBNJywgYGgnLgotCShpbml0X3RhYmxlKTogQWRkIHVwcGVyL2xvd2VyIHJlZ2lzdGVycy4KLQotCSogY29uZmlnL202OGstcGFyc2UuaCAobTY4a19yZWdpc3Rlcik6IEFkZCB1cHBlci9sb3dlciByZWdpc3RlcnMuCi0KLTE5OTktMDUtMjggIE1hcnRpbiBEb3JleSAgPG1kb3JleUBtYWRnZS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pOTYwLmM6IFNldmVyYWwgbWlub3IgY2hhbmdlcyB0byBhZGQgRUxGIGFuZAotCUJGRF9BU1NFTUJMRVIgc3VwcG9ydC4KLQkqIGNvbmZpZy90Yy1pOTYwLmg6IExpa2V3aXNlLgotCSogY29uZmlndXJlLmluIChpOTYwLSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDUtMjUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IE9ubHkgZG8gMTk5OS0wNS0xNyBmeF9wY3JlbAotCXJlbG9jIGNoYW5nZXMgd2hlbiBkZWZpbmVkKEJGRF9BU1NFTUJMRVIpLgotCi0xOTk5LTA1LTE3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2dlbl9yZWxvYyk6IFJlbW92ZSBGIGFuZCBNQVAgbWFjcm9zLgotCi0JKiB3cml0ZS5jICh3cml0ZV9wcmludF9zdGF0aXN0aWNzKTogT3V0cHV0IHRvIGZpbGUsIG5vdCBzdGRlcnIuCi0KLQkqIGV4cHIuYyAoZ2VuZXJpY19iaWdudW1fdG9faW50MzIsNjQpOiBQcm90b3R5cGUuCi0KLQkqIHJlYWQuYyAoc19sY29tbV9pbnRlcm5hbCwgc2l6ZW9mX3NsZWIxMjgsIHNpemVvZl91bGViMTI4LAotCW91dHB1dF9zbGViMTI4LCBvdXRwdXRfdWxlYjEyOCwgb3V0cHV0X2JpZ19zbGViMTI4LAotCW91dHB1dF9iaWdfdWxlYjEyOCwgb3V0cHV0X2JpZ19sZWIxMjgpOiBQcm90b3R5cGUuCi0JKG91dHB1dF9iaWdfc2xlYjEyOCwgb3V0cHV0X2JpZ191bGViMTI4KTogTWFrZSBpbmxpbmUuCi0JKG91dHB1dF9iaWdfbGViMTI4KTogUmVtb3ZlIGlubGluZQotCi0JRnJvbSBNYWNpZWogVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBDb252ZXJ0IEJGRF9SRUxPQ18xNiB3aXRoCi0JZnhfcGNyZWwgc2V0IHRvIEJGRF9SRUxPQ18xNl9QQ1JFTC4gIFNpbWlsYXJseSBmb3IgQkZEX1JFTE9DXzguCi0JSGFuZGxlIEJGRF9SRUxPQ18xNl9QQ1JFTCBhbmQgQkZEX1JFTE9DXzhfUENSRUwuICBSZXR1cm4gY2hhbmdlZAotCXZhbHVlIGZvciBjb3JyZWN0IG92ZXJmbG93IGNoZWNrIGluIHdyaXRlLmM6Zml4dXBfc2VnbWVudC4KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBNb3ZlIGJpdGZpZWxkIG92ZXJmbG93IGNoZWNrcyB0byBhZnRlcgotCXRoZSBtZF9hcHBseV9maXggY2FsbC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogTWVudGlvbiBtZF9hcHBseV9maXggbW9kaWZ5aW5nCi0JdmFsdWVUICp2YWwgYXJndW1lbnQuCi0KLUZyaSBNYXkgMTQgMTA6NTI6MTMgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGdlbl90b193b3Jkcyk6IENvcnJlY3RseSByb3VuZCBhCi0JZGVub3JtYWxpemVkIG51bWJlci4gIEZpeCBvZmYtYnktb25lIGluIHJhbmdlIGNoZWNraW5nIGZvcgotCWV4cG9uZW50IGluIGEgZGVub3JtYWwuIAotCi0xOTk5LTA1LTEwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAocGFyc2VfcmVnKTogQWNjZXB0ICdzcCcgYXMgYSB2YWxpZCByZWdpc3RlcgotCW5hbWUuIAotCi1UaHUgTWF5IDEzIDA5OjQ2OjU5IDE5OTkgIEpvZWwgU2hlcnJpbGwgKGpvZWxAT0FSY29ycC5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLXJ0ZW1zZWxmKiwgc2gtKi1ydGVtc2VsZiopOiBOZXcgdGFyZ2V0cy4KLQotMTk5OS0wNS0xMiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChJbnZNZW0pOiBOZXcgZmxhZy4gIEFkZCB0byBBbnlNZW0uCi0JKFJldmVyc2VSZWdSZWdtZW0pOiBSZW1vdmUuCi0JKEltbUV4dCk6IE5ldyBmbGFnLiAgUmVudW1iZXIgc29tZSBvZiB0aGUgb3Bjb2RlX21vZGlmaWVyIGJpdHMuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFRlc3QgZm9yIFBJSUkgU0lNRCBhbmQgQU1ECi0JM0ROb3chIHZpYSBJbW1FeHQgb3Bjb2RlX21vZGlmaWVyLiAgUmVtb3ZlIFJldmVyc2VSZWdSZWdtZW0KLQlrbHVkZ2UuCi0KLQlGcm9tICBEb3VnIExlZGZvcmQgPGRsZWRmb3JkQHJlZGhhdC5jb20+Ci0JKiBjb25maWcvdGMtaTM4Ni5oIChSZWdYTU0pOiBOZXcgZm9yIFAvSUlJLgotCSogY29uZmlnL3RjLWkzODYuYzogQWRkIHN1cHBvcnQgZm9yIFAvSUlJLgotCi1TYXQgTWF5ICA4IDIzOjI4OjUwIDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogUmVjb2duaXplIC1tcHBjNjRicmlkZ2UuCi0JKG1kX2JlZ2luKTogQWxsb3cgcHBjMzIgaW5zbnMgaW4gcHBjNjRicmlkZ2UgbW9kZS4KLQkocHBjX2luc2VydF9vcGVyYW5kKTogQWNjZXB0IFNJR05PUFQgaW4gcHBjNjQgbW9kZS4KLQotVGh1IE1heSAgNiAyMzoxMzozOSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2ltbWVkaWF0ZSk6IFNraXAgd2hpdGVzcGFjZSBiZWZvcmUKLQljb21wbGFpbmluZyBhYm91dCBqdW5rIGFmdGVyIGV4cHJlc3Npb24uCi0JKGkzODZfZGlzcGxhY2VtZW50KTogTGlrZXdpc2UuCi0KLVRodSBNYXkgIDYgMTk6NTA6MTQgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfZmluZF9iYXNlKTogVXNlIG1lbWNweSBpbnN0ZWFkIG9mIHN0cmNweS4KLQlEb24ndCBjb3B5IGJlZm9yZSBkb3duY2FzZWluZy4KLQotMTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogdGMtbTY4ay5jOiBJbmNsdWRlIGVsZi9tNjhrLmguCi0gICAgICAgIChtNjhrX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogTmV3IHJvdXRpbmUuCi0gICAgICAgICogdGMtbTY4ay5oIChlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyBtNjhrX2VsZl9maW5hbF9wcm9jZXNzaW5nKToKLSAgICAgICAgRGVmaW5lLgotIAotTW9uIE1heSAgMyAxMDoyNjowMyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSAyMiBiaXQgZm10IGluc24gbGlrZSBhCi0JMTcgYml0IGZtdCBpbnNuLgotCi0xOTk5LTA0LTMwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWNvcmVfc19zZWN0aW9uKTogRHVtcCBsaXRlcmFscyBiZWZvcmUKLQljaGFuZ2luZyBzZWN0aW9uLgotCi0xOTk5LTA0LTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWRfYXBwbHlfZml4Myk6IEluc2VydCByZWxvYyBhZGRlbmQgaW50byBpbnNuCi0JZm9yIENPRkYvUEUgcG9ydC4KLQotTW9uIEFwciAyNiAxMjozNDozNyAxOTk5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5oIChUQ19GSVhfVFlQRSk6IERlbGV0ZSwgY2dlbiBmaWVsZHMgbW92ZWQgdG8gd3JpdGUuaC4KLQkoVENfSU5JVF9GSVhfREFUQSk6IERlbGV0ZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmggKFRDX0ZJWF9UWVBFKTogRGVsZXRlLCBjZ2VuIGZpZWxkcyBtb3ZlZCB0byB3cml0ZS5oLgotCShUQ19JTklUX0ZJWF9EQVRBKTogRGVsZXRlLgotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IE5ldyBtZW1iZXIgZnhfY2dlbiwgaWZkZWYgVVNJTkdfQ0dFTi4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBJbml0aWFsaXplIGZ4X2NnZW4gbWVtYmVyLgotCSogY2dlbi5jIChnYXNfY2dlbl9yZWNvcmRfZml4dXAsZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IFVwZGF0ZS4KLQkoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IFVwZGF0ZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogVXBkYXRlLgotCShtZF9jZ2VuX3JlY29yZF9maXh1cF9leHApOiBVcGRhdGUuCi0JKEZYX09QSU5GT19SX1RZUEUpOiBVcGRhdGUuCi0KLQkqIGZyYWdzLmMgKGZyYWdfdmFyLGZyYWdfdmFyaWFudCk6IEluaXRpYWxpemUgZnJfY2dlbiBoZXJlLgotCSogY29uZmlnL3RjLWZyMzAuaCAoVENfRlJBR19JTklUKTogRGVsZXRlLgotCSogY29uZmlnL3RjLW0zMnIuaCAoVENfRlJBR19JTklUKTogRGVsZXRlLgotCSogZnJhZ3MuaCAoc3RydWN0IGZyYWcpOiBNYWtlIG9waW5kZXgsIG9waW5mbyBpbnRzLgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChGWF9PUElORk9fUl9UWVBFKTogRGVsZXRlLCB1bnVzZWQuCi0KLTE5OTktMDQtMjYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBVcGRhdGVkIGZvciBuZXcgdmVyc2lvbiBvZiBsaWJ0b29sLgotCi0xOTk5LTA0LTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWRfYXBwbHlfZml4Myk6IFJlbmFtZWQgZnVuY3Rpb24gZnJvbQotCW1kX2FwcGx5X2ZpeC4gCi0JKG1kX2FwcGx5X2ZpeDMpOiBEbyBub3QgZml4IHVwIGFic29sdXRlIHJlbG9jYXRpb25zIGFnYWluc3QKLQlzeW1ib2xpYyB2YWx1ZXMuCi0KLQkqIGNvbmZpZy90Yy1tY29yZS5oIChNRF9BUFBMWV9GSVgzKTogRGVmaW5lLgotCi0xOTk5LTA0LTIwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIGludGVyY2VwdHMgZm9yIHNlY3Rpb24KLQljaGFuZ2VzIGFuZCBkYXRhLWluLXRleHQgZGlyZWN0aXZlcy4KLQkobWNvcmVfY29ucyk6IE5ldyBmdW5jdGlvbjogaW50ZXJjZXB0IGNvbnMoKSBvcGVyYXRpb25zLgotCShtY29yZV9mbG9hdF9jb25zKTogTmV3IGZ1bmN0aW9uOiBpbnRlcmNlcHQgZmxvYXRfY29ucygpCi0Jb3BlcmF0aW9ucy4gCi0JKG1jb3JlX3N0cmluZ2VyKTogTmV3IGZ1bmN0aW9uOiBpbnRlcmNlcHQgc3RyaW5nZXIoKSBvcGVyYXRpb25zLgotCi0xOTk5LTA0LTE4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogb2JqLmggKHN0cnVjdCBmb3JtYXRfb3BzKTogQ2hhbmdlIGdlbmVyYXRlX2FzbV9saW5lbm8gZmllbGQgdG8KLQl0YWtlIG5vIHBhcmFtZXRlcnMuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKE9CSl9HRU5FUkFURV9BU01fTElORU5PKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoZmluZF9vcGNvZGVfbWF0Y2gpOiBBZGQgZGVmYXVsdCBjYXNlIHRvCi0Jc3dpdGNoLgotCShmaW5kX21hY3JvX21hdGNoKTogTGlrZXdpc2UuCi0JKGxvYWRfZXhwcmVzc2lvbik6IFBhcmVudGhlc2l6ZSAmJiB3aXRoaW4gfHwuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUuCi0KLTE5OTktMDQtMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgb3ZlcnJpZGVzIGZvciAuYnNzCi0JLnRleHQgLmRhdGEgLnNlY3Rpb24gcHNldWRvIG9wcy4KLQkobWNvcmVfc19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLiAgRHVtcCBsaXRzIGJlZm9yZSBjaGFuZ2luZyBzZWNzLiAKLQkobWNvcmVfc190ZXh0KTogTmV3IGZ1bmN0aW9uLiAgRHVtcCBsaXRzIGJlZm9yZSBjaGFuZ2luZyBzZWNzLiAKLQkobWNvcmVfc19kYXRhKTogTmV3IGZ1bmN0aW9uLiAgRHVtcCBsaXRzIGJlZm9yZSBjaGFuZ2luZyBzZWNzLiAKLQotMTk5OS0wNC0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfMzJiaXRtb2RlKTogTmV3LgotCShtZF9iZWdpbik6IFNldCBtaXBzXzMyYml0bW9kZSBpZiBuZWVkZWQuCi0JKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBEb24ndCBzZXQgRUZfTUlQU19BUkNILgotCVNldCBFRl9NSVBTXzMyQklUTU9ERS4KLQotRnJpIEFwciAxNiAxMjoyNjozOSAxOTk5ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc2VjdGlvbl9zeW1ib2wpOiBGaXggdHlwbyBpbiBwcmV2aW91cwotCWNoYW5nZS4KLQotMTk5OS0wNC0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmggKExPQ0FMX0xBQkVMU19GQik6IERlZmluZSB0byAxLgotCi1UaHUgQXByIDE1IDE2OjUyOjA5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwYV9nZXRfYWJzb2x1dGVfZXhyZXNzaW9uKTogVHJ5IHRvIGhhbmRsZSAiNSAlcjMiIAotCWV4cHJlc3Npb25zIGNvcnJlY3RseS4KLQotCi0xOTk5LTA0LTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IFNldCBFRl9NSVBTX0FSQ0guCi0KLU1vbiBBcHIgMTIgMjM6NDU6MDcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICczJyk6IE5ldyBjYXNlIGZvciBQQTIuMCBmbXB5ZmFkZAotCWFuZCBmbXB5bmZhZGQgaW5zdHJ1Y3Rpb25zLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcy5oIChlbnZpcm9uKTogRGVjbGFyZSBpdCwgaWYgbmVlZGVkLgotCSogYXMuYyAoZHVtcF9zdGF0aXN0aWNzKTogRG9uJ3QgZGVjbGFyZSBlbnZpcm9uLgotCSogY29uZmlndXJlLmluIChlbnZpcm9uKTogRGV0ZWN0IGRlY2xhcmF0aW9uLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQKLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbW1lZGlhdGUpOiBBY2NlcHQgQEdPVCByZWxvY2F0aW9ucy4KLQkoaTM4Nl9kaXNwbGFjZW1lbnQpOiBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHJlcGxhY2VtZW50IGJ1ZmZlci4KLQlDbGVhbiB1cCByZXBsYWNlbWVudCBidWZmZXIgaW5pdGlhbGl6YXRpb24uCi0KLTE5OTktMDQtMTEgIEJvYiBNYW5zb24gPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+OgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogRG9uJ3QgY3JlYXRlIGEgbmV3IHN5bWJvbCBpZiBvbmUKLQlhbHJlYWR5IGV4aXN0czsgaW5zdGVhZCwgdXNlIHRoZSBleGlzdGluZyBvbmUsIGJ1dCBzZXQgaXRzIHNlZ21lbnQKLQlhbmQgZnJhZyBkYXRhIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZGVmaW5lZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX3NlY3Rpb25fc3ltYm9sKTogTGlrZXdpc2UuCi0KLVNhdCBBcHIgMTAgMjA6MTA6MDIgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogQ2FsbCBhc19iYWQgaW5zdGVhZCBvZiBhYm9ydC4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmM6IE5ldyBGaWxlOiBTdXBwb3J0IHJvdXRpbmVzIGZvciBNQ29yZQotCWFzc2VtYmxlci4KLQkqIGNvbmZpZy90Yy1tY29yZS5oOiBOZXcgRmlsZTogRGVmaW5pdGlvbnMgZm9yIE1Db3JlIGFzc2VtYmxlci4gCi0JKiBjb25maWcvb2JqLWNvZmYuYzogQWRkIHN1cHBvcnQgZm9yIG1jb3JlLXBlIHRhcmdldC4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBkb2MvYWxsLnRleGk6IFNldCBNQ09SRS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBNQ29yZSBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQkKLQkqIHdyaXRlLmg6IFByZXZlbnQgbXVsdGlwbGUgaW5jbHVzaW9uLgotCi0xOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYXNpbnRsLmggKExDX01FU1NBR0VTKTogTmV2ZXIgZGVmaW5lLgotCSogYXMuYyAobWFpbik6IERvbid0IHBhc3MgTENfTUVTU0FHRVMgdG8gc2V0bG9jYWxlIGlmIHRoZSBzeXN0ZW0KLQlkb2VzIG5vdCBkZWZpbmUgaXQuCi0JKiBnYXNwLmMgKG1haW4pOiBEb24ndCBwYXNzIExDX01FU1NBR0VTIHRvIHNldGxvY2FsZSBpZiB0aGUgc3lzdGVtCi0JZG9lcyBub3QgZGVmaW5lIGl0LgotCi0JKiBNYWtlZmlsZS5hbSAobTY4ay1wYXJzZS5jKTogSWYgY29uZmlndXJpbmcgaW4gdGhlIHNvdXJjZQotCWRpcmVjdG9yeSwgY29weSBtNjhrLXBhcnNlLnkgaW50byB0aGUgbG9jYWwgZGlyZWN0b3J5IGJlZm9yZQotCXJ1bm5pbmcgeWx3cmFwLCB0byByZW1vdmUgc3B1cmlvdXMgZGlmZmVyZW5jZXMgd2hlbiBnZW5lcmF0aW5nCi0Jc25hcHNob3RzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChtZF9kb19hbGlnbik6IEp1c3QgYWxsb2NhdGUgdGhlIG51bWJlciBvZgotCWJ5dGVzIG5lY2Vzc2FyeSwgcmF0aGVyIHRoYW4gYWx3YXlzIGFsbG9jYXRpbmcgMTAyNC4KLQotMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkqIHJlYWQuYyAoZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogQWRkIGNhc2VzIHRvIHN3aXRjaC4gIFJlaW5kZW50LgotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9zY2FsZSk6IEFkZCByZXR1cm4gdmFsdWUuCi0JKGJ1aWxkX2Rpc3BsYWNlbWVudF9zdHJpbmcpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHRlbXBfZGlzcDIuCi0JKGkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQpOiBBZGQgcGFyZW50aGVzZXMgdG8gYXZvaWQgd2FybmluZy4KLQkoaTM4Nl9pbnRlbF9vcGVyYW5kKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcuCi0JKGkzODZfb3BlcmFuZCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgb3BlcmFuZF9tb2RpZmllci4KLQkoaTM4Nl9vcGVyYW5kKTogQWRkIHBhcmVucyB0byBhdm9pZCB3YXJuaW5nLgotCi0xOTk5LTA0LTA0ICBEb24gQm93bWFuIDxkb25AcGl4c2NpLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbWlwcyotKi12eHdvcmtzKiB0YXJnZXQ7IGhhdmUgaXQgZGVmaW5lCi0JTUlQU19TVEFCU19FTEYuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wMy0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogQWRkIHN1cHBvcnQgZm9yIGFybS1lcG9jLXBlLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogY29uZmlnL3RlLWVwb2MtcGUuaDogTmV3IGZpbGUuICBEZWZpbmUgbWFjcm9zIHNwZWNpZmljIHRvCi0JYXJtLWVwb2MtcGUgdGFyZ2V0LgotCSogY29uZmlnL3RjLWFybS5oOiBTZWxlY3QgZXBvYy1wZS1hcm0gdGFyZ2V0IGZvcm1hdCBpZiBjb25maWd1cmVkCi0JZm9yIGFybS1lcG9jLXBlIHRhcmdldC4KLQotTW9uIE1hciAyOSAxMDoxNTo0MCBDU1QgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIHRjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogIEFkanVzdCB2YWx1ZSBmb3IgbGlua29uY2Ugc2VjdGlvbnMuCi0KLVdlZCBNYXIgMjQgMTQ6MTE6MTAgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyKTogQ2xlYW4gdXAgY29kZSB0bwotCWRldGVjdCAiLG4iIHdpdGhvdXQgYSBjb25kaXRpb24uCi0JKHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyKTogTGlrZXdpc2UuCi0KLQotVHVlIE1hciAyMyAxMToyODoyMyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ34nKTogVGhlIGNvbmRpdGlvbiBmb3IgYSBicmFuY2ggb24gYml0Ci0JaW5zdHJ1Y3Rpb24gaXMgZW5jb2RlZCB3aXRoIG9uZSBiaXQuCi0KLQotMTk5OS0wMy0yMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBNZW50aW9uIHRoYXQKLQlsaW5lX3NlcGFyYXRvcl9jaGFycyBzaG91bGQgbm90IGluY2x1ZGUgbmV3bGluZS4gIEZyb20gdGhpCi0JPHR0bkBtaW5nbGUuZ2x1Zy5vcmc+LgotCi0xOTk5LTAzLTIyICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2JlZ2luKTogVXBkYXRlIGNhbGwgdG8gZnIzMF9jZ2VuX2NwdV9vcGVuLgotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfYmVnaW4pOiBVcGRhdGUgY2FsbCB0byBtMzJyX2NnZW5fY3B1X29wZW4uCi0KLVN1biBNYXIgMjEgMTg6MDg6MTggMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtYWxwaGEuYyAobWRfYXNzZW1ibGUpOiBBbGxvdyAnNicgaW4gYW4gb3Bjb2RlLgotCi1UaHUgTWFyIDE4IDEwOjU1OjMwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAnYScpOiBEbyBub3QgY2FsbCBwYV9wYXJzZV8uLi5fY21wc3ViX2NtcGx0ci4KLQotCi1UaHUgTWFyIDE4IDAyOjMwOjA3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAnZCcpOiBEbyBub3QgYWxsb3cgIixuIi4KLQkKLTE5OTktMDMtMTUgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBDaGFuZ2UgJy0nIGJhY2sgdG8gYSBzeW1ib2wgY2hhcgotCXNvIHdlIGNhbiB1c2UgbXVsdGlwbGUgb3Bjb2RlcyBvbiBhIGxpbmUgYWdhaW4uCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmM6IEJ5IGRlZmF1bHQsIHdhcm4gaWYgYSBzeW1ib2wgaGFzCi0JdGhlIHNhbWUgbmFtZSBhcyBhIHJlZ2lzdGVyLiAgUGx1cyBzb21lIG1pbm9yCi0JdXBkYXRlcyBmcm9tIHRoZSBicmFuY2guCi0KLTE5OTktMDMtMTMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgQkZEX1JFTE9DXzgsCi0JQkZEX1JFTE9DXzE2IGFuZCBCRkRfUkVMT0NfNjQuCi0KLTE5OTktMDMtMTIgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZXhwci5jIChleHByKTogQWRkIG1pc3NpbmcgZWxzZS4KLQotMTk5OS0wMy0xMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogSW1wcm92ZSBlcnJvciBtZXNzYWdlLgotCi0xOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChDUFVfVFlQRVMpOiBBZGQgZnIzMC4KLQkoY2dlbi5vKTogQWRkICQoQ0dFTl9DUFVfUFJFRklYKS1kZXNjLmggZGVwZW5kZW5jeS4KLQkoZnIzMCxtMzJyIGRlcGVuZGVuY2llcyk6IFVwZGF0ZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjZ2VuLmMgKGdhc19jZ2VuX3JlY29yZF9maXh1cCk6IFVwZGF0ZSB1c2Ugb2Ygb3BlcmFuZC0+dHlwZS4KLQkoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERpdHRvLgotCShnYXNfY2dlbl9maW5pc2hfaW5zbik6IENhbGwgY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0uCi0JKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiBEaXR0by4gIFVwZGF0ZSBjYWxsIHRvIHNldF92bWFfb3BlcmFuZC4KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2JlZ2luKTogVXBkYXRlIGNhbGwgdG8gZnIzMF9jZ2VuX2NwdV9vcGVuLgotCShtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IFVwZGF0ZSB1c2Ugb2Ygb3BlcmFuZC0+dHlwZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2JlZ2luKTogVXBkYXRlIGNhbGwgdG8gZnIzMF9jZ2VuX2NwdV9vcGVuLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBDYWxsIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtLgotCShtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IFVwZGF0ZSB1c2Ugb2Ygb3BlcmFuZC0+dHlwZS4KLQkobTMycl9jZ2VuX3JlY29yZF9maXh1cF9leHApOiBEaXR0by4KLQotMTk5OS0wMy0wOSAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9zaG93X3VzYWdlKTogRml4IG1lc3NhZ2UuCi0KLTE5OTktMDMtMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWFybS50ZXhpIChBUk0gU3ludGF4KTogRG9jdW1lbnQgbmV3IGNvbW1hbmQgbGluZSBzd2l0Y2hlcwotCWFuZCBMRFIgcmVnLD08ZXhwcj4gaW5zdHJ1Y3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1hcm0uYzogQWRkIHN1cHBvcnQgZm9yIC1tY3B1PWFybTgxMCwgLW1jcHU9YXJtOSBhbmQKLQktbWNwdT1hcm05dGRtaS4KLQotRnJpIEZlYiAxOSAwOTozNjozMCAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWFybS50ZXhpIChBUk0tQ2hhcnMpOiBGaXggdHlwbyBpbiB1c2Ugb2YgJ0AnLgotCi0xOTk5LTAyLTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JVGhpcyBwYXRjaCB3YXMgY3JlYXRlZCBieTogU2NvdHQgQmFtYnJvdWdoCi0JPHNjb3R0YkBjb3JlbGNvbXB1dGVyLmNvbT4KLQkKLQkqIGFwcC5jOiAKLQkgIFNwZWNpYWwgY2FzZWQgJ0AnIGNoYXJhY3Rlci4gIFRoZSAnQCcgY2hhcmFjdGVyIGlzIHVzZWQgYXMgdGhlCi0JICBBUk0gYXNzZW1ibGVyIGNvbW1lbnQgY2hhcmFjdGVyLCBhcyBhIHNwZWNpYWwgY2hhcmFjdGVyIAotCSAgYW5kIGluIEVMRiAuc3ltdmVyIHBzZXVkby1vcCdzLCBhbmQgYXMgYSBzcGVjaWFsIGNoYXJhY3RlciBpbgotCSAgLnR5cGUgYW5kIC5zZWN0aW9uIHBzZXVkby1vcHMuCi0JKHN5bXZlcl9wc2V1ZG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzeW12ZXJfc3RhdGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzdHJ1Y3QgYXBwX3NhdmUpOiBBZGQgZmllbGQgJ3N5bXZlcl9zdGF0ZScuCi0JKGFwcF9wdXNoKTogU2F2ZSBnbG9iYWwgc3ltdmVyX3N0YXRlIGludCBzdHJ1Y3QgYXBwX3NhdmUuCi0JKGFwcF9wb3ApOiBSZXN0b3JlIGdsb2JhbCBzeW12ZXJfc3RhdGUgZnJvbSBzdHJ1Y3QgYXBwX3NhdmUuCi0gIAkoZG9fc2NydWJfY2hhcnMpOiBTcGVjaWFsIGNhc2UgaGFuZGxpbmcgb2YgJ0AnIGNoYXJhY3RlciBpbgotCS5zeW12ZXIgcHNldWRvLW9wcy4gCi0KLQkqIGNvbmZpZ3VyZS5pbjogTW9kaWZpZWQgdG8gcmVjb2duaXplIGFybXYqIHVuYW1lIHN5bnRheCBmcm9tIEFSTQotCUxpbnV4IGtlcm5lbC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBBbGxvdyAnJScgYXMgd2VsbCBhcyAnQCcgYXMKLQlhIHByZWZpeCB0byB0aGUgc2VjdGlvbidzIHR5cGUuCi0JKG9ial9lbGZfdHlwZSk6IEFsbG93ICclJyBhcyB3ZWxsIGFzICdAJyBhbmQgJyMnIGFzIHByZWZpeGVzIHRvCi0JdGhlIHR5cGUncyB0eXBlbmFtZS4KLQotCSogY29uZmlnL3RjLWFybS5oOiBBZGQgc3VwcG9ydCBmb3IgUElDIGdlbmVyYXRpb246Ci0JKHBpY19jb2RlKTogTmV3IGJvb2xlYW4uCi0JKG9ial9yZWxvY2F0ZV9leHRlcm4pOiBEZWZpbmUuCi0JKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERlZmluZQotCShUQ19DT05TX0ZJWF9ORVcpOiBEZWZpbmUuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogRGVmaW5lLgotCShHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpOiBEZWZpbmUuCi0JCi0JKiBjb25maWcvdGMtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciBQSUMgZ2VuZXJhdGlvbjoKLQkobGluZV9zZXBlcmF0b3JfY2hhcnMpOiBBbGxvdyAnOycgYXMgYSBzZXBlcmF0b3IgZm9yIExpbnV4LgotCShpc19pbW1lZGlhdGVfcHJlZml4KTogTmV3IG1hY3JvLgotCShhcm1fcGFyc2VfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKHNfYXJtX2VsZl9jb25zKTogTmV3IGZ1bmN0aW9uLgotCShkb19icmFuY2gpOiBTcGVjaWFsIGNhc2UgZm9yIEJGRF9SRUxPQ19BUk1fUExUMzIuCi0JKG1kX3VuZGVmaW5lZF9zeW1ib2wpOiBTcGVjaWFsIGNhc2UgaGFuZGxpbmcgZm9yIHRoZSBHbG9iYWwgT2Zmc2V0Ci0JICBUYWJsZSdzIHN5bWJvbC4KLQkobWRfYXBwbHlfZml4Myk6IEhhbmRsZSBQSUMgcmVsb2NzLgotCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgUElDIHJlbG9jcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yICctaycgY29tbWFuZCBsaW5lIHN3aXRjaCB0bwotCSAgZW5hYmxlIFBJQyBnZW5lcmF0aW9uLgotCShjb25zX2ZpeF9uZXdfYXJtKTogTmV3IGZ1bmN0aW9uLgotCShzX2FybV9lbGZfY29ucyk6IE5ldyBmdW5jdGlvbi4KLQotVHVlIEZlYiAxNiAxNjozMTo1MyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNvbW1lbnRzIGZvciB1c2VzIG9mIEFDX0RFRklORS4KLQkqIGFjaW5jbHVkZS5tNDogTGlrZXdpc2UuCi0JKiBhY2NvbmZpZy5oOiBSZW1vdmUuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBjb25maWcuaW46IFJlYnVpbGQuCi0KLTE5OTktMDItMTUgIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwOiBjYXNlICdvJyk6IEZpeCBhc3NlcnRpb24gZmFpbHVyZSBmb3IKLQlub24tY29uc3RhbnQgb2Zmc2V0IGZyb20gYSBiYXNlIHJlZ2lzdGVyLgotCi0xOTk5LTAyLTE0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AcmFlYnVybi5vcmc+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG93X3VzYWdlKTogUHV0IFwgYmVmb3JlIG5ld2xpbmUgaW4KLQlzdHJpbmdzIGFsd2F5cy4KLQotU2F0IEZlYiAxMyAxNDoxMDoxMCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoY3B1X3R5cGVzKTogRW5hYmxlIEVWNiBQQUxjb2RlIHdpdGggLW0yMTI2NC4KLQkoZW1pdF9pbnNuKTogTG9vayBmb3IgcGMtcmVsYXRpdmUgYW5kIG5vLW92ZXJmbG93IHNwZWNpZmllcnMgb24KLQlpbnRlcm5hbCByZWxvY2F0aW9uIHR5cGVzLgotCi0xOTk5LTAyLTEzICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLW1pcHMudGV4aSAoTUlQUyBPcHRzKTogVXBkYXRlZCBsaXN0IG9mIC1tTk5OTiBhbmQKLQktbWNwdT1OTk5OIGZsYWdzLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBSZW1vdmUgYWxsIHRoZSBtaXBzX05OTk4gdmFyaWFibGVzOyBqdXN0IHVzZQotCW1pcHNfY3B1IGluc3RlYWQuCi0JKG1pcHNfNDY1MCwgbWlwc180MDEwLCBtaXBzXzQxMDApOiBWYXJpYWJsZXMgcmVtb3ZlZC4KLQkoaGlsb19pbnRlcmxvY2tzLCBncHJfaW50ZXJsb2NrcywgYXBwZW5kX2luc24sIG1hY3JvX2J1aWxkLCBtYWNybywKLQltYWNybzIsIG1pcHMxNl9tYWNybywgbWlwc19pcCk6IFRlc3QgbWlwc19jcHUsIG5vdCB0aGUgbWlwc19OTk5OCi0JdmFyaWFibGVzLgotCShtZF9iZWdpbik6IERvbid0IGJvdGhlciBpbml0aWFsaXppbmcgdGhlIG1pcHNfTk5OTiB2YXJpYWJsZXM7Ci0JbWlwc19jcHUgaXMgc2V0LCBhbmQgdGhhdCdzIGdvb2QgZW5vdWdoIG5vdy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGF2ZSB0aGUgLW1OTk5OIG9wdGlvbnMgc2V0IG1pcHNfY3B1IGluc3RlYWQgb2YKLQl0aGUgbWlwc19OTk5OIHZhcmlhYmxlLiAgVGhlIC1uby1tTk5OTiBmbGFncyBhcmUgbm93IG5vLW9wcy4KLQkoc2hvdyk6IE5ldyBmdW5jdGlvbiwgdG8gaGFuZGxlIHdyYXBwaW5nIGluIHRoZSBDUFUgbGlzdHMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGUgbGlzdHMgb2YgLW1jcHUgYW5kIC1tTk5OTiBzd2l0Y2hlcy4KLQotU2F0IEZlYiAxMyAwMDoxNzoyNiAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2ludGVsX29wZXJhbmQpOiBJZ25vcmUgYFNIT1JUJyByYXRoZXIKLQl0aGFuIHRyZWF0IGFzIGFuIGltbWVkaWF0ZSBzcGVjaWZpZXIuCi0KLVRodSBGZWIgMTEgMTY6MTg6MzEgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYzogUHJvdG90eXBlIG1hbnkgZnVuY3Rpb25zLgotCShzZXRfaW50ZWxfc3ludGF4KTogQWNjZXB0IGBwcmVmaXgnL2Bub3ByZWZpeCcgc3BlY2lmaWVycy4KLQkoaTM4Nl9pbW1lZGlhdGUpOiBSZW1vdmUgdW51c2VkIHNlY29uZCBhcmd1bWVudC4KLQkoaTM4Nl9pbnRlbF9vcGVyYW5kKTogRml4IGkzODZfaXNfcmVnIHR5cG8uCi0JKGkzODZfb3BlcmFuZCk6IFVzZSBhbGxvd19uYWtlZF9yZWcuCi0JKG91dHB1dF9pbnZhbGlkKTogTWFrZSBvcGVyYW5kIGludCBmb3IgSyZSLgotCi1UaHUgRmViIDExIDExOjIxOjAyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX2FzX25ld19TT1VSQ0VTKTogVW5jb21tZW50LS1maXhlZCBieSBhdXRvbWFrZQotCXBhdGNoLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDItMDkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKERJU1RDTEVBTkZJTEVTKTogQ2hhbmdlIGNnZW4tb3BjLmggdG8gY2dlbi1kZXNjLmguCi0JKGNnZW4ubyk6IERpdHRvLgotCShFWFRSQV9hc19uZXdfU09VUkNFUyk6IENvbW1lbnQgb3V0LgotCSgudGNkZXApOiA8YXJjaD4tb3BjLmggcmVuYW1lZCB0byA8YXJjaD4tZGVzYy5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXV0b2NvbmYgMi4xMy4gIFJlZG8gdXNpbmdfY2dlbiBoYW5kbGluZy4KLQlEZWxldGUgY2FsbCB0byBBTV9DWUdXSU4zMi4gIFJlcGxhY2UgQU1fRVhFRVhUIHdpdGggQUNfRVhFRVhULgotCShBQ19PVVRQVVQpOiA8YXJjaD4tb3BjLmggcmVuYW1lZCB0byA8YXJjaD4tZGVzYy5oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogYWNsb2NhbC5tNDogUmVidWlsZC4KLQkqIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGNnZW4uYzogSW5jbHVkZSBjZ2VuLWRlc2MuaCwgbm90IGNnZW4tb3BjLmguCi0JKCopOiBDR0VOX09QQ09ERV9ERVNDIHJlbmFtZWQgdG8gQ0dFTl9DUFVfREVTQy4KLQkoZ2FzX2NnZW5fY3B1X2Rlc2MpOiBSZW5hbWVkIGZyb20gZ2FzX2NnZW5fb3Bjb2RlX2Rlc2MuCi0JQ0dFTl9JTlNOX0FUVFIgcmVuYW1lZCB0byBDR0VOX0lOU05fQVRUUl9WQUxVRS4KLQlDR0VOX09QRVJBTkRfQVRUUiByZW5hbWVkIHRvIENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFLgotCShnYXNfY2dlbl9yZWNvcmRfZml4dXApOiBSZW1vdmUgdW5uZWNlc3NhcnkgIT0gMCB0ZXN0LgotCShnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogRGl0dG8uCi0JKGdhc19jZ2VuX2ZpbmlzaF9pbnNuKTogRGl0dG8uICBSZWZlciB0byBvcGVyYW5kIHRhYmxlIHZpYSBjcHUKLQlkZXNjcmlwdG9yLCBub3QgZ2xvYmFsIHZhcmlhYmxlLgotCShnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogUmVmZXIgdG8gb3BlcmFuZF90YWJsZSB2aWEgY3B1Ci0JZGVzY3JpcHRvciwgbm90IGdsb2JhbCB2YXJpYWJsZS4gIFJlZmVyIHRvIGluc2VydF9vcGVyYW5kIGhhbmRsZXIKLQl2aWEgY3B1IGRlc2NyaXB0b3IsIG5vdCBnbG9iYWwgZnVuY3Rpb24uCi0JKiBjZ2VuLmggKCopOiBDR0VOX09QQ09ERV9ERVNDIHJlbmFtZWQgdG8gQ0dFTl9DUFVfREVTQy4KLQkqIGNvbmZpZy90Yy1mcjMwLmM6IEluY2x1ZGUgb3Bjb2Rlcy9mcjMwLWRlc2MuaC4KLQkoKik6IGdhc19jZ2VuX29wY29kZV9kZXNjIHJlbmFtZWQgdG8gZ2FzX2NnZW5fY3B1X2Rlc2MuCi0JQ0dFTl9JTlNOX0FUVFIgcmVuYW1lZCB0byBDR0VOX0lOU05fQVRUUl9WQUxVRS4KLQlVcGRhdGUgY2FsbCB0byBDR0VOX09QRVJBTkRfVFlQRSxDR0VOX0lOU05fT1BFUkFORFMuCi0JKiBjb25maWcvdGMtbTMyci5jOiBEaXR0by4KLQkoYXNzZW1ibGVfdHdvX2luc25zKTogVXBkYXRlIGNhbGxzIHRvIGNnZW5fbG9va3VwX2dldF9pbnNuX29wZXJhbmRzLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBVcGRhdGUgY2FsbCB0byBDR0VOX09QRVJBTkRfRU5UUlkuCi0KLTE5OTktMDItMDkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEZpeCBoYW5kbGluZyBvZiBsYWJlbDEgLSBsYWJlbDIKLQlyZWxvY2F0aW9ucyBmb3IgRUxGIHRhcmdldHMuCi0KLTE5OTktMDItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIFN0cm9uZ0FSTSB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDItMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaDogVGlkeSBPQkpfRUxGIGFuZCBPQkpfQ09GRiBkZWZpbml0aW9ucy4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogRml4IEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNICi0JZm9yIENPRkYgcG9ydHMuCi0KLVdlZCBGZWIgIDMgMTE6MzU6NDcgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX3Nob3dfdXNhZ2UpOiBEb2N1bWVudCBwY2E1NiBhbmQgZXY2IG9wdGlvbnMuCi0KLU1vbiBGZWIgIDEgMjA6Mzc6MzAgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtaTM4Ni5oIChMT05HX0RPVUJMRV9NTkVNX1NVRkZJWCk6ICBEZWZpbmUuCi0gICAgICAgIChJTlRFTF9EV09SRF9NTkVNX1NVRkZJWCk6ICBEZWZpbmUuCi0gICAgICAgIChCWVRFX1BUUik6ICBEZWZpbmUuCi0gICAgICAgIChXT1JEX1BUUik6ICBEZWZpbmUuCi0gICAgICAgIChEV09SRF9QVFIpOiAgRGVmaW5lLgotICAgICAgICAoWFdPUkRfUFRSKTogIERlZmluZS4KLSAgICAgICAgKFNIT1JUKTogIERlZmluZS4KLSAgICAgICAgKE9GRlNFVF9GTEFUKTogIERlZmluZS4KLSAgICAgICAgKEZMQVQpOiAgRGVmaW5lLgotICAgICAgICAoTk9ORV9GT1VORCk6ICBEZWZpbmUuCi0gICAgICAgIChOb19kU3VmKTogIERlZmluZS4KLSAgICAgICAgKE5vX3hTdWYpOiAgRGVmaW5lLgotICAgICAgICAqIGNvbmZpZy90Yy1pMzg2LmMgIChzZXRfaW50ZWxfc3ludGF4KTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaW50ZWxfc3ludGF4KTogIERlY2xhcmUuCi0gICAgICAgIChhbGxvd19uYWtlZF9yZWcpOiAgRGVjbGFyZS4KLSAgICAgICAgKG1kX3BzZXVkb190YWJsZSk6ICBTdXBwb3J0IC5pbnRlbF9zeW50YXggYW5kIC5hdHRfc3ludGF4LgotICAgICAgICAoaW50ZWxfZmxvYXRfb3BlcmFuZCk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKG1kX2Fzc2VtYmxlKTogIEhhbmRsZSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWC4KLSAgICAgICAgSGFuZGxlIGJyYWNrZXRzIGFzIHdlbGwgYXMgcGFyZW5zLiAgQ2FsbCBpMzg2X2ludGVsX29wZXJhbmQgZm9yCi0gICAgICAgIGludGVsIHN5bnRheC4gIFJldmVyc2Ugb3BlcmFuZHMgaWYgYXBwcm9wcmlhdGUuICBIYW5kbGUgbmV3Ci0gICAgICAgIHN1ZmZpeGVzLiAgSGFuZGxlIG1vdnp4IGFuZCBtb3ZzeC4KLSAgICAgICAgKGkzODZfaXNfcmVnKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9pbW1lZGlhdGUpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChpMzg2X3NjYWxlKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9kaXNwbGFjZW1lbnQpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChpMzg2X29wZXJhbmRfbW9kaWZpZXIpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChidWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9wYXJzZV9zZWcpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9pbnRlbF9vcGVyYW5kKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9vcGVyYW5kKTogIENhbGwgaTM4Nl9kaXNwbGFjZW1lbnQsIGkzODZfaW1tZWRpYXRlLAotICAgICAgICBpMzg2X3NjYWxlLCBldGMuICBpbnN0ZWFkIG9mIGhhbmRsaW5nIGlubGluZS4KLSAgICAgICAgKHBhcnNlX3JlZ2lzdGVyKTogIEhhbmRsZSByZWdpc3RlcnMgd2l0aG91dCBwcmVmaXguCi0KLU1vbiBGZWIgIDEgMTI6MjQ6NTggMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoYXJtLSotb2FiaSk6ICBOZXcuCi0gICAgICAgICh0aHVtYi0qLW9hYmkpOiAgTmV3LgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYyAodGFyZ2V0X29hYmkpOiAgRGVjbGFyZS4KLSAgICAgICAgKG1kX2FwcGx5X2ZpeDMpOiBTdXBwb3J0IFJFTCByZWxvY3MuCi0gICAgICAgIChtZF9wYXJzZV9vcHRpb24pOiAgSGFuZGxlIC1vYWJpLgotICAgICAgICAoZWxmMzJfYXJtX3RhcmdldF9mb3JtYXQpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChtZF9sb25nb3B0cyk6ICBBZGQgT1BUSU9OX09BQkkuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5oOiAgUmVkZWZpbmUgVEFSR0VUX0ZPUk1BVC4KLQotCi0xOTk5LTAxLTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBIYW5kbGUgb3V0IG9mIHJhbmdlIGVycm9yLgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChmcjMwX2ZpeF9hZGp1c3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCShmcjMwX2ZvcmNlX3JlbG9jYXRpb24pOiBEZWZhdWx0IHRvIDAuCi0KLQkqIGNvbmZpZy90Yy1mcjMwLmggKG9ial9maXhfYWRqdXN0YWJsZSk6IERlZmluZS4KLQkoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZS4KLQotCSogY2dlbi5jIChnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogRG8gbm90IGFwcGx5IGZpeGVzIHRvIFZUQUJMRQotCXJlbG9jcy4gCi0KLTE5OTktMDEtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHdyaXRlXzJfc2hvcnQpOiBEbyBub3QgZ2VuZXJhdGUgYSBzZXF1ZW50aWFsCi0JbWVyZ2Ugb2YgdHdvIGluc3RydWN0aW9ucyBpZiB0aGUgbGVmdCBpbnN0cnVjaXRvbiBraWxscyB0aGUgcmlnaHQuCi0KLTE5OTktMDEtMTEgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmUuaW46IFJlZG8gdGVzdCBmb3IgdXNpbmcgY2dlbi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMS0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKG9ial9hZGp1c3Rfc3ltdGFiKTogUHJldmVudCBhY2NpZGVudGFsCi0JcmVkZWZpbml0aW9uIG9mIHRoaXMgbWFjcm8uCi0KLVR1ZSBKYW4gIDUgMjE6NTg6MDMgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19mcm9iX2ZpbGUpOiBEaXNhYmxlICJVbm1hdGNoZWQgJWhpIHJlbG9jIgotCXdhcm5pbmcuCi0KLTE5OTgtMTItMjkgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IEZvciBtaXBzMTYsIGluc2VydCBhIG5vcCBiZXR3ZWVuCi0JYSByZWFkIG9mIEhJIG9yIExPIGFuZCBhbiBpbW1lZGlhdGx5IGZvbGxvd2luZyBicmFuY2guCi0KLTE5OTgtMTItMjkgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IEFub3RoZXIgY29ycmVjdGlvbiB0byB0aGUgc2V0dGluZyBvZgotCW1pcHNfZWFiaTY0LgotCi0xOTk4LTEyLTIzICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBDb3JyZWN0IHR5cGUtbyBpbiBzZXR0aW5nIG9mIG1pcHNfZWFiaTY0LgotCi0xOTk4LTEyLTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9hc3NlbWJsZSk6IEVtaXQgYSBOT1AgYWZ0ZXIgYSByZWxheGFibGUgMTYKLQliaXQgaW5zbiB3aGVuIG9wdGltaXppbmcsIHNvIHRoYXQgcGFyYWxsZWxpc2VkIGluc3RydWN0aW9ucyB3aWxsCi0Jc3RhcnQgb24gYSAzMiBiaXQgYm91bmRhcnkuCi0KLTE5OTgtMTItMTkgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2VhYmk2NCk6IE5ldy4KLQkobWRfYmVnaW4pOiBTZXQgbWlwc19lYWJpNjQuCi0JKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBVc2UgaXQuCi0KLTE5OTgtMTItMTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogCi0JQ29ycmVjdCBzZXR0aW5nIG9mIEFCSSBpbiBlX2ZsYWdzLgotCi1XZWQgRGVjIDE2IDE2OjE3OjIyIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfYXNzZW1ibGUpOiBXYXJuIGFib3V0IGludmFsaWQgaW5zdHJ1Y3Rpb25zIGluIGRlbGF5IHNsb3RzLgotCi0xOTk4LTEyLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4sbWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIHZyNDExMS4KLQkKLTE5OTgtMTItMTUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogTWFyayBhcyBhbiBlcnJvciwgcmF0aGVyIHRoYW4gYQotCXdhcm5pbmcsIHZhbHVlcyB0aGF0IGRvbid0IGZpdCBpbiB0aGUgZmllbGQuCi0KLTE5OTgtMTItMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2FiaV9zdHJpbmcpOiBOZXcuCi0JKG1kX3BhcnNlX29wdGlvbixtZF9sb25nb3B0cyk6IEFkZCBtYWJpLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogU2V0IGVfZmxhZ3MgYmFzZWQgb24gbWFiaSBmbGFnLgotCi0xOTk4LTEyLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIHZyNDExMS4gCi0KLTk4LTEyLTExICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGJ1aWxkX2J5dGVzKTogQ2hhbmdlIG1lc3NhZ2UgZ2l2ZW4gaWYgdGhlCi0JaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgSDgvMzAwSCBtb2RlIGFuZCB3ZSdyZSBub3QgaW4gSG1vZGUsIHRvCi0Jc3VnZ2VzdCB0aGF0IGl0IG1heSBiZSB0aGUgb3BlcmFuZCBtb2RlcyB0aGF0IGFyZSB0aGUgcHJvYmxlbSwgbm90Ci0JbmVjZXNzYXJpbHkgdGhlIG9wY29kZS4KLQotMTk5OC0xMi0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYzogQWRkIGxpbmUgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLQotVHVlIERlYyAgOCAxOTo1MTo1MCAxOTk4ICBNYXJrIEtsZWluICA8bWtsZWluQGRpcy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYS0qLW1wZWl4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvb2JqLXNvbS5oIChvYmpfc29tX2NvbXBpbGVyKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotc29tLmMgKGNvbXBpbGVyX3NlZW4pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShvYmpfc29tX2NvbXBpbGVyKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWhwcGEuYzogVXBkYXRlIHRjX2RhdGEgdXNlcyBmb3IgY2hhbmdlIHRvIGJmZC9zb20uaC4KLSAJKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiY29tcGlsZXIiIGlmIE9CSl9TT00uCi0JKHBhX3R5cGVfYXJncyk6IFNldCBocHBhX3ByaXZfbGV2ZWwuCi0JKHBhX2NvbXBpbGVyKTogTmV3IHN0YXRpYyBmdW5jdGlvbiBpZiBPQkpfU09NLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgRGVjICA4IDE1OjAwOjUwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChvdXRwdXRfbGViMTI4KTogRG9uJ3QgbWFyayBhcyBpbmxpbmUuCi0KLTE5OTgtMTItMDggIEFuZHJldyBNYWNMZW9kICA8YW1hY2xlb2RAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfdmJ5dGUpOiBQcm90b3R5cGUgYW5kIG5ldyBmdW5jdGlvbiBmb3IgCi0JQUlYIC52Ynl0ZSB1bmFsaWduZWQgZGF0YSBzdXBwb3J0LgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgJ3ZieXRlJyB0byBsaXN0IG9mIHZhbGlkIHBzZXVkb3MuCi0JKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWRkIGVoX2ZyYW1lIHRvIGxpc3Qgb2YgRUxGIHJlbG9jYXRhYmxlIAotCXNlY3Rpb25zLgotCi0xOTk4LTEyLTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hc3NlbWJsZSwgZG9fYXNzZW1ibGUpOiBJbXByb3ZlIGVycm9uZW91cwotCWlucHV0IGhhbmRsaW5nLiAKLQotTW9uIERlYyAgNyAwOTo0ODozNCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYyAoZWxmMzJfYXJtX2ZvcmNlX3JlbG9jYXRpb24pOiAgQ2hlY2sgZm9yCi0gICAgICAgIEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILgotCi1TdW4gRGVjICA2IDEyOjQ2OjM2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEZWZpbmUgVEFSR0VUX0JZVEVTX3tCSUcsTElUVExFfV9FTkRJQU4gYWZ0ZXIKLQljaGVja2luZyB0aGUgdGFyZ2V0IHR5cGUuCi0JKG1pcHMtZGVjLWJzZCopOiBTZXQgZW5kaWFuIHRvIGxpdHRsZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCUNPRkYgd2VhayBzeW1ib2wgc3VwcG9ydCwgYmFzZWQgb24gcGF0Y2hlcyBmcm9tIE1hcmsgRWxicmVjaHQKLQk8c25vd2JhbGwzQHVzYS5uZXQ+OgotCSogY29uZmlnL29iai1jb2ZmLmggKFNfSVNfV0VBSyk6IERlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl93ZWFrKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob2JqX2NvZmZfZW5kZWYpIFtib3RoIHZlcnNpb25zXTogSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IExpa2V3aXNlLgotCSh5YW5rX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkob2JqX3BzZXVkb190YWJsZSk6IEFkZCAid2VhayIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLWdudSopOiBOZXcgdGFyZ2V0LiAgRnJvbSBBeW1lcmljIFZpbmNlbnQKLQk8YXltZXJpYy52aW5jZW50QGVtaS51LWJvcmRlYXV4LmZyPi4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBjdXJyZW50IHRvb2xzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoZW1pdF9sZGdwKTogR2l2ZSBhbiBlcnJvciBtZXNzYWdlIHJhdGhlciB0aGFuCi0JYW4gYXNzZXJ0aW9uIGZhaWx1cmUgZm9yIGEgY2FzZSB3ZSBjYW4ndCBoYW5kbGUgd2hlbiBPQkpfRUNPRkYuCi0KLQkqIGV4cHIuYyAob3BlcmF0b3IpOiBBbmQgd2l0aCAweGZmIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggc2lnbmVkCi0JY2hhci4KLQotMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBHZW5lcmF0ZQotCUJGRF9SRUxPQ19GUjMwXzQ4IGluc3RlYWQgb2YgQkZEX1JFTE9DX0ZSMzBfMzIuCi0KLTE5OTgtMTItMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogRW5hYmxlIHJlbG9jcyBmb3IKLQlMREk6MjAgaW5zbi4KLQotVGh1IE5vdiAyNiAxMToyMzo0OCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IFJlc3RvcmUgcHJldmlvdXMgY2FsY3VsYXRpb24KLQlvZiBwY3JlbCBwb2ludC4KLQotVHVlIE5vdiAyNCAxNzoyMTo1MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBGaXggY2FsY3VsYXRpb24gb2YKLQlwY3JlbCBwb2ludC4KLQotVHVlIE5vdiAyNCAxNDo1NDozOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hc3NlbWJsZSk6IE1ha2Ugc3RhdGljICdldHlwZScgaGF2ZSBmaWxlCi0Jc2NvcGUuCi0JKGQxMHZfY2xlYW51cCk6IE9ubHkgZ2VuZXJhdGUgcHJldmlvdXMgaW5zbiBpZiBhIG11bHRpbGluZSBpbnNuIGlzCi0Jbm90IHBlbmRpbmcuCi0KLUZyaSBOb3YgMjAgMTE6NDE6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBBZGQgc3VwcG9ydCBmb3IKLQlGUjMwX09QRVJBTkRfSTMyLiAKLQotVGh1IE5vdiAxOSAxNTowMToyOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAtbWFybTd4eHggYW5kCi0JLW1hcm02eHh4IGNvbW1hbmQgbGluZSBzd2l0Y2hlcy4KLQotMTk5OC0xMS0xOCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoREVQKTogVXNlICQoc3JjZGlyKS8uLi9ta2RlcC4KLQkoaXRibC1vcHMubyk6IERlbGV0ZSBkdXBsaWNhdGUgZGVwZW5kZW5jaWVzLgotCVJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCUFkZCBmcjMwIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgTm92IDE3IDEzOjQyOjQyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QKLQlvcGNvZGUgbGlzdC4KLQkqIGxpc3RpbmcuYzogSWdub3JlIGxpbmUgdGVybWluYXRvciBjaGFyYWN0ZXJzIGZvdW5kIGluc2lkZQotCXN0cmluZ3MuIAotCi1UaHUgTm92IDEyIDE5OjIxOjI0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vZ2FzLnBvdDogUmVnZW5lcmF0ZWQuCi0KLVRodSBOb3YgMTIgMTA6NTQ6MTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAoZnIzMF9pc19jb2xvbl9pbnNuKTogTmV3IG5hbWUgZm9yCi0JZnIzMF9pc19sYWJlbF9zdGFydCgpLiAgQWxzbyBjaGVja3MgZm9yIGRlbGF5IHNsb3QgaW5zbnMuCi0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKGZyMzBfaXNfbGFiZWxfc3RhcnQpOiBOZXcgZnVuY3Rpb246IEhhbmRsZQotCUZSMzAgaW5zdHJ1Y3Rpb25zIHdoaWNoIGNvbnRhaW4gYSBjb2xvbiBpbiB0aGUgbW5lbW9uaWMuCi0KLQkqIGNvbmZpZy90Yy1mcjMwLmggKFRDX1NUQVJUX0xBQkVMKTogRGVmaW5lIHRoaXMgbWFjcm8uCi0KLVdlZCBOb3YgMTEgMDk6NTg6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYzogUmVtb3ZlZCBjdXJyZW50bHkgc3VwZXJmbG91cyBjb2RlLgotCi1UdWUgTm92IDEwIDEzOjEzOjA1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLWZyMzAuYzogVHdlYWtpbmcgc28gdGhhdCBpdCB3aWxsIGNvbXBpbGUuCi0KLVR1ZSBOb3YgMTAgMTQ6NDE6MzMgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtZDEwdi5oIChvYmpfZml4X2FkanVzdGFibGUpOiAgRGVmaW5lLgotICAgICAgICAoVENfRk9SQ0VfUkVMT0NBVElPTik6ICBEZWZpbmUuCi0gICAgICAgIChkMTB2X2ZvcmNlX3JlbG9jYXRpb24pOiAgRGVjbGFyZS4KLSAgICAgICAgKiBjb25maWcvdGMtZDEwdi5jICh0Y19nZW5fcmVsb2MpOiAgSGFuZGxlIFZ0YWJsZSByZWxvY3MuCi0gICAgICAgIChtZF9hcHBseV9maXgzKTogIEhhbmRsZSBWdGFibGUgcmVsb2NzLgotICAgICAgICAoZDEwdl9maXhfYWRqdXN0YWJsZSk6ICBOZXcuCi0gICAgICAgIChkMTB2X2ZvcmNlX3JlbG9jYXRpb24pOiAgTmV3LgotCi1Nb24gTm92ICA5IDE0OjI1OjA2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmM6IENoYW5nZSBkZWZhdWx0IGJlaGF2aW91ciB0byBpZ25vcmUgcG90ZW50aWFsCi0JY29uZmxpY3RzIGJldHdlZW4gcmVnaXN0ZXIgbmFtZSBhbmQgc3ltYm9sIG5hbWVzLgotCi1XZWQgTm92ICA0IDE4OjQyOjAwIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgZnIzMC0qLSouCi0JKiBjb25maWcvdGMtZnIzMC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogZG9jL01ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQkqIHBvL2dhcy5wb3Q6IFJlZ2VuZXJhdGVkLgotCi1Nb24gTm92ICAyIDIwOjU0OjE2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKGFzc2VtYmxlX3R3b19pbnNucyk6IEVuc3VyZSBib3RoIGluc25zCi0JYXJlIDE2IGJpdCBpbnNucy4KLQotTW9uIE5vdiAgMiAyMDoxMDoxOCAxOTk4ICBNYXJ0aW4gdm9uIExvZXdpcyAgPGxvZXdpc0BpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogU2V0IGNoYXJhY3RlcnMgYWJvdmUgMTI3IHRvIGJlIHN5bWJvbAotCWNoYXJhY3RlcnMuCi0JKGRvX3NjcnViX2NoYXJzKTogQWRkIHNvbWUgY2FzdHMgdG8gdW5zaWduZWQgY2hhciB0byBhdm9pZAotCXVud2FudGVkIHNpZ24gZXh0ZW5zaW9uLgotCSogcmVhZC5jIChsZXhfdHlwZSk6IFNldCBjaGFyYWN0ZXJzIGFib3V0IDEyNyB0byBiZSBzeW1ib2wKLQljaGFyYWN0ZXJzLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYmVnaW4pOiBTZXQgaWRlbnRpZmllcl9jaGFycyBhbmQKLQlvcGVyYW5kX2NoYXJzIGZvciB2YWx1ZXMgYWJvdmUgMTI3LgotCi1Nb24gTm92ICAyIDE1OjA1OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IGRldGVjdCBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqCi0gICAgICAgICogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVR1ZSBPY3QgMjcgMTM6MTg6NDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jOiBBZGQgc3VwcG9ydCBmb3IgcHJvZHVjaW5nIGEgbGlzdGluZyBmcm9tIHBpcGVkCi0JaW5wdXQuIAotCi1UdWUgT2N0IDI3IDA4OjU2OjQ0IDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChoaWxvX2ludGVybG9ja3MpOiBSZW1vdmUgbWlwc18zOTAwLgotCShhcHBlbmRfaW5zbik6IEFjY291bnQgZm9yIHRoZSB0eDM5J3MgbXVsdGlwbHkgYmVoYXZpb3IuCi0KLTE5OTgtMTAtMjYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChhc3NlbWJsZV90d29faW5zbnMpOiBSZW5hbWUgYXNzZW1ibGVfdHdvX2luc25zCi0JZnJvbSBhc3NlbWJsZV9wYXJhbGxlbF9pbnNucy4gIEFkZCBzdXBwb3J0IGZvciAnLT4nIHRvIGluZGljYXRlCi0JZXhwbGljaXRseSBzZXJpYWxpemluZyB0aGUgaW5zdHJ1Y3Rpb25zLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCi1TYXQgT2N0IDI0IDE1OjEyOjE5IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLXNoLmMgKHNoX2ZpeF9hZGp1c3RhYmxlKTogIEFkanVzdCBFWFRFUk4gYW5kCi0gICAgICAgIFdFQUsgaGFuZGxpbmcuCi0KLVRodSBPY3QgMjIgMTI6NDE6MzMgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjZ2VuLmMgKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiAgUmV2ZXJ0IGxhc3QgY2hhbmdlLgotCi1UaHUgT2N0IDIyIDEwOjAzOjE1IDE5OTggIFJvbiBVbnJhdSAgPHJ1bnJhdUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIDogc3VwcG9ydCBmcmFtZSBhbmQgcmVnbWFzay9mcmVnbWFzayB3aGVuCi0JICBNSVBTX1NUQUJTX0VMRiBpcyBzcGVjaWZpZWQuCi0KLVdlZCBPY3QgMjEgMTE7MzQ6NTEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtc2guYyAoc2hfZml4X2FkanVzdGFibGUpOiAgT25seSBpbmNsdWRlIGlmIE9CSl9FTEYuCi0gICAgICAgIChtZF9hcHBseV9maXgpOiAgRG9uJ3QgcmV0dXJuIDEgZm9yIFZUQUJMRSByZWxvY3MuCi0gICAgICAgICogY29uZmlnL3RjLXNoLmggKG9ial9maXhfYWRqdXN0YWJsZSk6ICBEZWZpbmUgb25seSBpZiBPQkpfRUxGLgotCi1UdWUgT2N0IDIwIDExOjE4OjI4IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZG9jL2MtaTM4Ni50ZXhpOiBSZXBsYWNlIG9jY3VyZW5jZXMgb2YgIm9wY29kZSIgd2l0aAotCSJpbnN0cnVjdGlvbiBtbmVtb25pYyIsICJpbnN0cnVjdGlvbiIsIG9yICJtbmVtb25pYyIgd2hlbgotCXJlZmVycmluZyB0byB0aGUgbmFtZSBvZiBhbiBpbnN0cnVjdGlvbi4gIFVzZSAib3Bjb2RlIiB3aGVuCi0JcmVmZXJyaW5nIHRvIHRoZSBzZXF1ZW5jZSBvZiBtYWNoaW5lIGJ5dGVzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChvcGNvZGVfY2hhcnMpOiBSZW5hbWUgdG8gbW5lbW9uaWNfY2hhcnMuCi0JKGlzX29wY29kZV9jaGFyKTogUmVuYW1lIHRvIGlzX21uZW1vbmljX2NoYXIuCi0JKG1kX2Fzc2VtYmxlIGFuZCBpMzg2X29wZXJhbmQpOiBDb3JyZWN0IGVycm9yIG1lc3NhZ2VzIGZyb20KLSAgICAgICAgIm9wY29kZSIgdG8gImluc3RydWN0aW9uIG1uZW1vbmljIgotCVJlbmFtZSB0aHJvdWdob3V0IG9wY29kZVtdIC0+IG1uZW1vbmljW10sIG9wcCAtPiBtbmVtX3AsCi0JTUFYX09QQ09ERV9TSVpFIC0+IE1BWF9NTkVNX1NJWkUsCi0JRFdPUkRfT1BDT0RFX1NVRkZJWCAtPiBEV09SRF9NTkVNX1NVRkZJWCwKLQlXT1JEX09QQ09ERV9TVUZGSVggLT4gV09SRF9NTkVNX1NVRkZJWCwKLQlCWVRFX09QQ09ERV9TVUZGSVggLT4gQllURV9NTkVNX1NVRkZJWCwKLQlTSE9SVF9PUENPREVfU1VGRklYIC0+IFNIT1JUX01ORU1fU1VGRklYCi0JTE9OR19PUENPREVfU1VGRklYIC0+IExPTkdfTU5FTV9TVUZGSVgKLQotCSogY29uZmlnL3RjLWkzODYuaCAoKl9NTkVNX1NVRkZJWCk6IFJlbmFtZSBmcm9tICpfT1BDT0RFX1NVRkZJWC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogQ2hlY2sgZm9yIGdhcmJhZ2UgYWZ0ZXIKLQlyZWdpc3RlciBuYW1lLgotCi1UdWUgT2N0IDIwIDEwOjQ5OjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IENoYW5nZSBoYW5kbGluZyBvZiBQQ1JFTCByZWxvYwotIAlmb3IgQkZEX0FTU0VNQkxFUiB0byBvbmx5IGNoYW5nZSB2YWx1ZSB3aGVuIENPRkYgaWYgVEVfUEUuCi0KLU1vbiBPY3QgMTkgMjA6MjA6NDIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtc2guaCAob2JqX2ZpeF9hZGp1c3RhYmxlKTogIERlZmluZS4KLSAgICAgICAgKiBjb25maWcvdGMtc2guYyAoc2hfZm9yY2VfcmVsb2NhdGlvbik6ICBIYW5kbGUgVlQgcmVsb2NzLgotICAgICAgICAobWRfYXBwbHlfZml4KTogIExpa2V3aXNlLgotICAgICAgICAodGNfZ2VuX3JlbG9jKTogIExpa2V3aXNlLgotICAgICAgICAoc2hfZml4X2FkanVzdGFibGUpOiAgTmV3LgotCi1Nb24gT2N0IDE5IDEyOjM1OjQzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGdhc19jZ2VuX2ZpbmlzaF9pbnNuKTogVXBkYXRlIGhhbmRsaW5nIG9mIENHRU5fSU5UX0lOU05fUC4KLQkqIGNnZW4uaCAoZ2FzX2NnZW5fZmluaXNoX2luc24pOiBVcGRhdGUgcHJvdG90eXBlLgotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9pbnNuKTogQ0dFTl9JTlRfSU5TTiAtPiBDR0VOX0lOVF9JTlNOX1AuCi0JY2dlbl9pbnNuX3QgLT4gQ0dFTl9JTlNOX0lOVC4KLQkobWFrZV9wYXJhbGxlbCk6IFVwZGF0ZSBoYW5kbGluZyBvZiBDR0VOX0lOVF9JTlNOX1AuCi0JKGFzc2VtYmxlX3BhcmFsbGVsX2luc24pOiBEaXR0by4KLQkodGFyZ2V0X21ha2VfcGFyYWxsZWwpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogVXNlIGl0LgotCi1Nb24gT2N0IDE5IDEzOjE2OjEyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLW0zMnIuYyAobTMycl9mb3JjZV9yZWxvY2F0aW9uKTogIEZpeCB0eXBvLgotCi1TdW4gT2N0IDE4IDE4OjQ4OjU3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2Fzc2VtYmxlKTogTWFrZSBzdXJlIHRoZSBlbnRpcmUgb3Bjb2RlIGlzCi0JY29udmVydGVkIGludG8gbG93ZXIgY2FzZS4KLQotRnJpIE9jdCAxNiAxMzozNjozNCBDRFQgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjZ2VuLmMgKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiAgSGFuZGxlIFZUQUJMRSByZWxvY3MuCi0gICAgICAgIChnYXNfY2dlbl90Y19nZW5fcmVsb2MpOiAgTGlrZXdpc2UuCi0gICAgICAgICogY29uZmlnL3RjLW0zMnIuaCAob2JqX2ZpeF9hZGp1c3RhYmxlKTogIERlZmluZS4KLSAgICAgICAgKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2ZpeF9hZGp1c3RhYmxlKTogIE5ldy4KLSAgICAgICAgKG0zMnJfZm9yY2VfcmVsb2NhdGlvbik6ICBIYW5kbGUgVlRBQkxFIHJlbG9jcy4KLQotV2VkIE9jdCAxNCAxMTozMzozOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy1hcm0udGV4aSAoQVJNIERpcmVjdGl2ZXMpOiBEb2N1bWVudCAubHRvcm4gZGlyZWN0aXZlLgotCi1Nb24gT2N0IDEyIDExOjA3OjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKGFzc2VtYmxlX3BhcmFsbGVsX2luc24pOiBDb252ZXJ0IHNlY29uZCBvcGNvZGUKLQl0byBsb3dlciBjYXNlIGJlZm9yZSBwYXJzaW5nLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IElnbm9yZSBjb25mbGljdHMgd2hlbiBleHBsaWNpdGx5Ci0JcGFyYWxsZWwgaW5zbnMgbW9kaWZ0IGJ1dHMgaW4gdGhlIFBTVyBhcyBhIHNpZGUgZWZmZWN0LgotCi1UaHUgT2N0ICA4IDEwOjE4OjMzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGZpbmRfZm9ybWF0KTogVGVzdCBmb3IgbWlzc2luZyBmbGFnIGFuZAotCWNvbnRyb2wgcmVnaXN0ZXJzLgotCQotCShtZF9hcHBseV9maXgzKTogRml4IGVycm9yIG1lc3NhZ2VzIHRvIGF2b2lkCi0JYXNzdW1wdGlvbiBhYm91dCBwcmVzZW5jZSBvZiBhIHN5bWJvbC4KLQotCShwYXJhbGxlbF9vayk6IERpc2FsbG93IHBhcmFsbGVsIGluc3RydWN0aW9ucyB0aGF0IGJvdGggbW9kaWZ5IHRoZQotCXNhbWUgZmxhZyByZWdpc3Rlci4KLQotCShmaW5kX2Zvcm1hdCk6IEdlbmVyYXRlIGEgd2FybmluZyBpZiBhbiBvZGQgbnVtYmVyZWQgcmVnaXN0ZXIgaXMKLQl1c2VkIGFzIHRoZSBmaXJzdCByZWdpc3RlciBpbiBhIG11dGxpLXJlZ2lzdGVyIGluc3RydWN0aW9uLgotCi1XZWQgT2N0ICA3IDE0OjA5OjE0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBEbyBub3QgYXNzdW1lIHRoYXQgYmFkCi0JcmVsb2NhdGlvbnMgYXJlIGFsd2F5cyBhc3NvY2lhdGVkIHdpdGggYSBzeW1ib2wuCi0KLVR1ZSBPY3QgIDYgMDk6MzE6MTUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiB0Yy1zcGFyYy5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogIERlZmluZS4KLSAgICAgICAgKGVsZjMyX3NwYXJjX2ZvcmNlX3JlbG9jYXRpb24pOiAgRGVjbGFyZS4KLSAgICAgICAgKiB0Yy1zcGFyYy5jIChtZF9hcHBseV9maXgzKTogIEhhbmRsZSB2dGFibGUgcmVsb2NzLgotICAgICAgICAodGNfZ2VuX3JlbG9jKTogIEhhbmRsZSB2dGFibGUgcmVsb2NzLgotICAgICAgICAoZWxmMzJfc3BhcmNfZm9yY2VfcmVsb2NhdGlvbik6ICBOZXcuCi0KLU1vbiBPY3QgIDUgMDk6MjU6MzIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z25zdS5jb20+Ci0KLSAgICAgICAgKiBzeW1ib2xzLmMgKFNfSVNfRlVOQ1RJT04pOiAgTmV3LgotICAgICAgICAqIGNvbmZpZy90Yy12ODUwLmggKG9ial9maXhfYWRqdXN0YWJsZSk6ICBEZWZpbmUuCi0gICAgICAgIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogIERlZmluZS4KLSAgICAgICAgKHY4NTBfZm9yY2VfcmVsb2NhdGlvbik6ICBEZWNsYXJlLgotICAgICAgICAqIGNvbmZpZy90Yy12ODUwLmMgKHRjX2dlbl9yZWxvYyk6ICBVc2Ugb2Zmc2V0IGluc3RlYWQKLSAgICAgICAgb2YgZnhfYWRkbnVtYmVyIGZvciBWVEFCTEUgcmVsb2MgYWRkZW5kcy4KLSAgICAgICAgKG1kX2FwcGx5X2ZpeDMpOiAgSGFuZGxlIFZUQUJMRSByZWxvY3MuCi0gICAgICAgICh2ODUwX2ZpeF9hZGp1c3RhYmxlKTogIE5ldy4KLSAgICAgICAgKHY4NTBfZm9yY2VfcmVsb2NhdGlvbik6ICBOZXcuCi0KLU1vbiBPY3QgIDUgMDA6NDg6NTIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKGZwX29wZXJhbmRfZm9ybWF0KTogQWRkIHNvbWUgYWRkaXRpb25hbCBmb3JtYXRzLgotCShwYV9pcCk6IERvIG5vdCBhdXRvbWF0aWNhbGx5IHByb21vdGUgaW50byBwYTIuMCBtb2RlLgotCShwYV9sZXZlbCk6IEhhbmRsZSAiLmxldmVsIDIuMCIuCi0KLVN1biBPY3QgIDQgMjA6NTc6NDMgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBBTURfM0ROT1dfT1BDT0RFLgotCSogY29uZmlnL3RjLWkzODYuaCAodGVtcGxhdGUuZXh0ZW5zaW9uX29wY29kZSk6IENoYW5nZSB0bwotICAgICAgICB1bnNpZ25lZCBpbnQgdG8gYWxsb3cgZnVsbCByYW5nZSBvZiA4LWJpdCBvcGNvZGUgc3VmZml4ZXMuCi0JKE5vbmUpOiBSZWRlZmluZSBhcyAweGZmZmYuCi0KLQlGcm9tIEplZmYgQiBFcGxlciA8amVwbGVyQHVzZ3MuZ292PgotCSogZG9jL2MtaTM4Ni50ZXhpIChpMzg2LVNJTUQpOiBOZXcgc2VjdGlvbi4KLQotVGh1IE9jdCAgMSAxNTozNzo1NCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKGRpc2NhcmRfcmVzdF9vZl9saW5lKTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5oOiBEZWNsYXJlIGl0LgotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfbWFzaywgc19hbHBoYV9mcmFtZSk6IFVzZSBpdC4KLQotVGh1IE9jdCAgMSAxMDozMzo1MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX3N5bWJvbF9tYXRjaGluZ19yZWdpc3Rlcik6IE5ldyBmdW5jdGlvbi4KLQkoZmluZF9vcGNvZGUpOiBDb3BlIHdpdGggdGhlIGNhc2Ugd2hlcmUgYSByZWdpc3RlciBuYW1lIG1hdGNoZXMKLQlhIHN5bWJvbCBuYW1lLgotCi1XZWQgU2VwIDMwIDEwOjUyOjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3BjcmVsX2Zyb20pOiBSZW5hbWUgdG8KLQl2ODUwX3BjcmVsX2Zyb21fc2VjdGlvbi4KLQkodjg1MF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBEbyBub3QgcmVzb2x2ZXMgc3ltYm9scyBpbiBvdGhlcgotCXNlY3Rpb25zLiAKLQotCSogY29uZmlnL3RjLXY4NTAuaCAoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogRGVmaW5lLgotCi1Nb24gU2VwIDI4IDExOjAxOjIwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogR2VuZXJhdGUgYW4gZXJyb3IgaWYgYSByZWdpc3RlcgotCWlzIHN1cHBsaWVkIGZvciBhbiBvcGVyYW5kIHRoYXQgc2hvdWxkIG5vdCBiZSBhIHJlZ2lzdGVyLgotCi1GcmkgU2VwIDI1IDEwOjA0OjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHdyaXRlXzJfc2hvcnQpOiBCdXQgZG8gYWxsb3cgZGVsYXllZCBicmFuY2gKLQlpbnN0cnVjdGlvbnMgdG8gaGF2ZSBhbm90aGVyIGluc3RydWN0aW9uIGluIHRoZSByaWdodCBiaW4uCi0KLVRodSBTZXAgMjQgMDk6Mjg6MzQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAod3JpdGVfMl9zaG9ydCk6IERvIG5vdCBhbGxvdyBpbnN0cnVjdGlvbnMgaW4KLQl0aGUgcmlnaHQgY29udGFpbmVyIGlmIHRoZSBsZWZ0IGNvbnRhaW5lciBob2xkcyBhIGJyYW5jaAotCWluc3RydWN0aW9uLiAKLQotV2VkIFNlcCAyMyAxMDo1NDoyOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChyZWdfbmFtZV9zZWFyY2gpOiBPbmx5IHdhcm4gaWYgYSBuYW1lIG1hdGNoZXMKLQlib3RoIGEgcmVnaXN0ZXIgbmFtZSBhbmQgc3ltYm9sIG5hbWUuCi0JKGZpbmRfZm9ybWF0KTogQWxsb3cgY29ycmVjdCBwYXJzaW5nIG9mIE1WVFNZUyBhbmQgTVZGU1lTIGluc25zLgotCi1UdWUgU2VwIDIyIDE3OjQ5OjE2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHdyaXRlXzJfc2hvcnQpOiBJbXBsZW1lbnQgRUlUSEVSX0JVVF9QUkVGRVJfTVUKLQlleGVjdXRpb24gdW5pdCBjbGFzcy4KLQotCShyZWdfbmFtZV9zZWFyY2gpOiBJZiBhIG5hbWUgbWF0Y2hlcyBhIHJlZ2lzdGVyIGFuZCBhIHN5bWJvbCwKLQlwcmVmZXIgdGhlIHJlZ2lzdGVyLgotCShmaW5kX2Zvcm1hdCk6IERpc2FsbG93IGZsYWcgcmVnaXN0ZXJzIHdoZW4gYSBnZW5lcmFsIHB1cnBvc2UKLQlyZWdpc3RlciBpcyByZXF1aXJlZC4KLQlJZiBhIG51bWJlciBpcyByZXF1aXJlZCwgYnV0IGEgcmVnaXN0ZXIgaGFzIGJlZW4gZ2l2ZW4sIGNoZWNrIHRvCi0Jc2VlIGlmIGEgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgcmVnaXN0ZXIgZXhpc3RzLCBhbmQgaWYKLQlzbywgdXNlIHRoYXQgc3ltYm9sLgotCi1UdWUgU2VwIDIyIDE2OjQwOjUyIDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuaCAoRUNPRkZfREVCVUdHSU5HKTogQWRkIG1pc3NpbmcgcGFyZW5zLgotCi1UdWUgU2VwIDIyIDE1OjQ0OjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGZpbmRfZm9ybWF0KTogRG8gbm90IGFjY2VwdCBmbGFnIHJlZ2lzdGVycyBhcwotCWdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMuCi0JKGZpbmRfZm9ybWF0KTogSWYgYW4gaW1tZWRpYXRlIHZhbHVlIGlzIGV4cGVjdGVkIGF0IGEgZ2l2ZW4gcGxhY2UKLQlpbiBhIGZvcm1hdCwgYnV0IGEgcmVnaXN0ZXIgbmFtZSBoYXMgYmVlbiBwcm92aWRlZCBpbnN0ZWFkLCBjaGVjawotCXRvIHNlZSBpZiB0aGF0IHJlZ2lzdGVyIG5hbWUgbWF0Y2hlcyB0aGUgbmFtZSBvZiBhIHByZWRlZmluZWQKLQlzeW1ib2wgYW5kIGlmIGl0IGRvZXMsIHRoZW4gdXNlIHRoZSBzeW1ib2wgaW5zdGVhZC4KLQkocmVnX25hbWVfc2VhcmNoKTogSWYgYSByZWdpc3RlciBuYW1lIG1hdGNoZXMgYSBzeW1ib2wgbmFtZSwKLQlwcmVmZXIgdGhlIHJlZ2lzdGVyIG5hbWUgdG8gdGhlIHN5bWJvbCBuYW1lLgotCi1Nb24gU2VwIDIxIDEwOjQyOjU3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZG9fYWxpZ24pOiBBZnRlciBpbnNlcnRpbmcgTk9QcywgcmVzZXQKLQl0aGUgcHJldmlvdXMgaW5zbiB0byBlbXB0eS4KLQotMTk5OC0wOS0yMCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IERvIG5vdCBicmVhayBzdHJpbmcgaW50byB0d28KLQlwaWVjZXMsIGZvcmNpbmcgdGhlIHVzZSBvZiBhbiBBTlNJIGNvbXBpbGVyLgotCi1TdW4gU2VwIDIwIDAwOjU4OjEyIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogTmV3IG1hY3JvLiAgRm9yY2UgdnRhYmxlCi0JcmVsb2NzLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBEbyBub3RoaW5nIGZvciB2dGFibGUgcmVsb2NzLgotCi1UdWUgU2VwIDE1IDA4OjUxOjA3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdnRhYmxlX2luaGVyaXQpOiAgSGFuZGxlIGFybQotICAgICAgICBhc3NlbWJsZXIgc3ludGF4LgotICAgICAgICAob2JqX2VsZl92dGFibGVfZW50cnkpOiAgTGlrZXdpc2UuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5oOiAgRGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04gZm9yIE9CSl9FTEYuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogSGFuZGxlIFZUQUJMRSByZWxvY2F0aW9ucy4KLSAgICAgICAgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotICAgICAgICAoYXJtX2ZpeF9hZGp1c3RhYmxlKTogTGlrZXdpc2UuCi0gICAgICAgIChlbGYzMl9hcm1fZm9yY2VfcmVsb2NhdGlvbik6IE5ldy4KLSAgICAgICAgKGFybWVsZl9mcm9iX3N5bWJvbCk6ICBSZW1vdmUgY29mZi1zdHlsZSBzeW1ib2wgc3VwcG9ydC4KLQotV2VkIFNlcCAgOSAxMToyNzoxNiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBGaXggdHlwbyBpbiBsYXN0IHBhdGNoLgotCi1UdWUgU2VwICA4IDE4OjEwOjAxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYyAoYXJtX2FkanVzdF9zeW10YWIpOiAgTW92ZSAjaWZkZWYKLSAgICAgICAgT0JKX0NPRkYgc28gdGhhdCByb3V0aW5lIGlzIGRlZmluZWQgZm9yIGEub3V0IGZvcm1hdC4KLQotVHVlIFNlcCAgOCAxNTo1NjoxOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBEZXRlY3Qgbm9uLXNlZ21lbnQgcmVnaXN0ZXJzCi0JdXNlZCBhcyBzZWdtZW50IHByZWZpeGVzLgotCi1TYXQgU2VwICA1IDE5OjAwOjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWhvcHQuYyAoY2hlY2tfZWhfZnJhbWUpOiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgRkRFLCBhbmQgZG9uJ3QKLQlvcHRpbWl6ZSBhY3Jvc3MgRkRFIGJvdW5kYXJpZXMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogUHJlc2VydmUgYW55IGxpbmsgb25jZQotCWZsYWdzIHdoZW4gc2V0dGluZyB0aGUgc2VjdGlvbiBmbGFncy4KLQotRnJpIFNlcCAgNCAxNzowNzoxNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmggKG9ial9hZGp1c3Rfc3ltdGFiKTogRml4ZWQgdHlwby4KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYXJtZWxmX2FkanVzdF9zeW10YWIpOiBSZWZvcm1hdHRlZC4KLQotRnJpIFNlcCAgNCAxMzo1Nzo0MyAxOTk4ICBKYWt1YiBKZWxpbmVrIDxqakBzdW5zaXRlLm1zLm1mZi5jdW5pLmN6PgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoaW5fc2lnbmVkX3JhbmdlKTogU2lnbiBleHRlbmQgMzItYml0IHdvcmRzCi0JdG8gdGhlIGhvc3Qgd2lkdGguCi0KLVdlZCBTZXAgIDIgMTE6MzE6MTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZnJhZ3MuYyAoZnJhZ19ncm93KTogSW5jbHVkZSB0aGUgc2l6ZSBvZiB0aGUgZnJhZyBzdHJ1Y3QgaW4gdGhlCi0Jb2JzdGFjayBjaHVuayBzaXplLgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IEFkanVzdCB0aGUgc2VnaW5mbyBmcmNoYWluIHN0YXJ0Ci0JaWYgdGhlIG5ldyBzdWJzZWcgY29tZXMgYmVmb3JlIHRoZSBvbGQuCi0KLVR1ZSBTZXAgIDEgMTU6MDE6MzMgMTk5OCAgSmFrdWIgSmVsaW5layA8ampAc3Vuc2l0ZS5tcy5tZmYuY3VuaS5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWxsb3cgYWxsIGRpZ2l0cyBpbiBhbiBpbnN0cnVjdGlvbgotCXRvIGhhbmRsZSBlZGdlOCBhbmQgZWRnZTE2LgotCi1Nb24gQXVnIDMxIDA5OjUxOjE0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdnRhYmxlX2luaGVyaXQpOiBQcmludCBlcnJvciBtZXNzYWdlCi0JYmVmb3JlIHdlIGNsb2JiZXIgdGhlIHN5bWJvbCBpbnZvbHZlZC4KLQotTW9uIEF1ZyAzMSAxMDo1ODowNiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYzogIFJlbW92ZSBPQkpfRUxGIGRlZmluaXRpb25zIGZvciAKLSAgICAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyBhbmQgU19TRVRfU1RPUkFHRV9DTEFTUy4gIE9ubHkKLSAgICAgICAgdXNlIGFybV9hZGp1c3Rfc3ltdGFiIGZvciBPQkpfQ09GRi4KLSAgICAgICAgKGFybWVsZl9hZGp1c3Rfc3ltdGFiKTogIE5ldyBSb3V0aW5lLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIERlZmluZSBvYmpfYWRqdXN0X3N5bXRhYiB0bwotICAgICAgICBhcm1lbGZfYWRqdXN0X3N5bXRhYiBmb3IgT0JKX0VMRi4KLSAgICAgICAgCi1TYXQgQXVnIDI5IDIyOjE4OjUxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSBhbGwgaTM4Ni1lbGYgdGFyZ2V0cyB1c2UgYmZkX2dhcy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZm9yY2VfcmVsb2NhdGlvbik6IE5ldy4KLQkodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERvbid0IGZpeCB2dGFibGUgcmVsb2NzLgotCShtZF9hcHBseV9maXgzKTogTGlrZXdpc2UuCi0JKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSB0aGVtLgotCSogY29uZmlnL3RjLWkzODYuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IEFsd2F5cyBkZWZpbmUsIGNhbGxpbmcKLQl0Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24uCi0KLU1vbiBBdWcgMjQgMTM6NDA6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9zaG93X3VzYWdlKTogSW1wcm92ZSBmb3JtYXR0aW5nIG9mIC0taGVscCBvdXRwdXQuCi0KLUZyaSBBdWcgMjEgMTg6NDM6NDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUpOiBDb3B5IHByZXZpb3VzIG9wY29kZSBvdmVyCi0JY3VycmVudCBvcGNvZGUgYWZ0ZXIgd3JpdGluZyB0aGUgZmlyc3QgaW5zdHVyY3Rpb24gb2YgYSByZXZlcnNlCi0Jc2VxdWVudGlhbCBwYWlyLiAKLQkKLUZyaSBBdWcgMjEgMDc6MzA6MzUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcmVhZC5oIChnZW5lcmF0ZV9saW5lbm9fZGVidWcpOiBBZGQgcHJvdG90eXBlLgotCSogcmVhZC5jIChnZW5lcmF0ZV9saW5lbm9fZGVidWcpOiBNYWtlIG5vbi1zdGF0aWMuCi0KLVRodSBBdWcgMjAgMjM6MTc6MDQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IE9ubHkgd2FybiBmb3IgYWRkcmVzcy9kYXRhIHNpemUKLQlwcmVmaXhlcy4KLQotVGh1IEF1ZyAyMCAxNDo0NTowOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGFybV9maXhfYWRqdXN0YWJsZSk6IERvIG5vdCBhZGp1c3QgcmVsb2NhdGlvbnMKLQlhZ2FpbnN0IFRodW1iIGZ1bmN0aW9uIG5hbWVzLCBhcyB0aGUgbGlua2VyIG5lZWRzIHRoaXMgaW5mb3JtYXRpb24uCi0KLTE5OTgtMDgtMjAgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBDaGVjayBhbHNvIHRoYXQgdGhlcmUgaXMgbm8gYWR2YW5jZSBpbiBvcGVyYW5kCi0JYWZ0ZXIgYXRvZl9nZW5lcmljIGluIG9yZGVyIHRvIGRlY2lkZSAiaXMgaXQgbGFiZWwgMGYgb3IgZmxvYXRpbmcKLQlwb2ludCBudW1iZXI/Ii4KLQotV2VkIEF1ZyAxOSAwOTozMDoxNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jOiBSZXBsYWNlIGRvdWJsZSBkYXNoIHByZWZpeCB0byBNMzJSIHNwZWNpZmljCi0JY29tbWFuZCBsaW5lIG9wdGlvbnMgd2l0aCBhIHNpbmdsZSBkYXNoLgotCSogZG9jL2MtbTMyci50ZXhpOiBSZXBsYWNlIGRvdWJsZSBkYXNoIHByZWZpeCB3aXRoIGEgc2luZ2xlIGRhc2guCi0KLVR1ZSBBdWcgMTggMTE6NTk6NDMgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIHRjLWFybS5oOiBEZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlIGZvciBPQkpfRUxGLgotICAgICAgICogdGMtYXJtLmMgKGFybV9maXhfYWRqdXN0YWJsZSk6IE5ldyByb3V0aW5lLgotCi0xOTk4LTA4LTEzICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2FsaWduLCBzX2NvbW0sIHNfbXJpX2NvbW1vbiwgc19mYWlsLCBzX2dsb2JsLCBzX3NwYWNlLAotCXNfZmxvYXRfc3BhY2UsIHNfc3RydWN0LCBjb25zX3dvcmtlcik6IE1vdmUgaWdub3JlX3Jlc3Rfb2ZfbGluZSBvcgotCWRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgYmVmb3JlIG1yaV9jb21tZW50X2VuZC4KLQkoZXF1YWxzKTogQ2hlY2sgZ2FyYmFnZSBhZnRlciBleHByZXNzaW9uIGJlZm9yZQotCW1yaV9jb21tZW50X2VuZCBpbiBNUkkgbW9kZS4KLQotVGh1IEF1ZyAxMyAxNTowODo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogQ29ycmVjdCBNX1NHRV9JL01fU0dFVUlfSSBjYXNlIGZvciBhCi0Jc21hbGwgaW1tZWRpYXRlIGNvbnN0YW50IHRvIHVzZSB0aGUgY29uc3RhbnQgaXRzZWxmIHJhdGhlciB0aGFuCi0JYWx3YXlzIHVzaW5nIDEuCi0KLVdlZCBBdWcgMTIgMTg6NDc6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9lbnRlcik6IENhbGwgYXNfYmFkIHJhdGhlciB0aGFuIGFib3J0LgotCShwYV9sZWF2ZSk6IExpa2V3aXNlLgotCi1XZWQgQXVnIDEyIDEzOjI1OjAzIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBFbWl0IGEgd2FybmluZyBmb3Igc3RhbmQtYWxvbmUKLQlwcmVmaXhlcy4KLQkoaTM4Nl9vcGVyYW5kKTogRml4IGFuIGVycm9yIG1lc3NhZ2UuCi0KLVR1ZSBBdWcgMTEgMTQ6NDQ6MzIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtYXJtLnRleGkgKEFSTSBEaXJlY3RpdmVzKTogRG9jdW1lbnQgLnJlcSBkaXJlY3RpdmUuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAocmVnX3JlcXVpcmVkX2hlcmUpOiBEaXNwbGF5IGVycm9uZW91cyBzdHJpbmcgaWYKLQl0aGUgcmVnaXN0ZXIgbmFtZSBjb3VsZCBub3QgYmUgZGVjb2RlZC4KLQlEbyBub3Qgc2V0IGluc3QuaW5zdHJ1Y3Rpb24gaWYgdGhlIHNpZnQgaXMgLTEuCi0KLU1vbiBBdWcgMTAgMTU6Mzk6NTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHRjX2dlbl9yZWxvYyk6IEJpYXMgV0VBSyBzeW1ib2xzIGp1c3QgYXMKLQl3ZSBkbyBmb3IgRVhURVJOLgotCi1Nb24gQXVnIDEwIDE1OjA2OjE4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGQzMHZfYWxpZ24pOiBBbHdheXMgcGVyZm9ybSBhbGlnbm1lbnQgcmVxdWVzdCwKLQlldmVuIGlmIGl0IGlzIGJlbGl2ZWQgdG8gYmUgdW5uZWNlc3NhcnkuCi0KLU1vbiBBdWcgMTAgMTc6NDg6MDkgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogU2l6ZSBpbW1lZGlhdGUgY29uc3RhbnRzIGJ5Ci0Jc3VmZml4IChlcnJvbmVvdXNseSByZW1vdmVkIGFzIHBhcnQgb2YgSnVseSA3IGNoYW5nZSkuCi0KLVN1biBBdWcgIDkgMjA6NDU6MzIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvb2JqLWVsZi5oOiAgQ2hlY2sgZm9yIHJlZGVmaW5pdGlvbiBvZiBvYmpfZnJvYl9zeW1ib2wuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5jOiAgRGVmaW5lIFNfR0VUX1NUT1JBR0VfQ0xBU1MgYW5kIFNfU0VUX1NUT1JBR0VfQ0xBU1MuCi0gICAgICAgIChhcm1lbGZfZnJvYl9zeW1ib2wpOiAgTmV3IFJvdXRpbmUuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5oOiAgRGVmaW5lIG9ial9mcm9iX3N5bWJvbCBpZiBPQkpfRUxGLgotCi1TYXQgQXVnICA4IDE1OjIxOjI4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCB3ZWFrIHN5bXMuCi0KLVdlZCBBdWcgIDUgMTU6NTQ6MTQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9iZWdpbik6IFNldCBCRkQgcHJpdmF0ZSBmbGFncyBkZXBlbmRpbmcgdXBvbgotCWNvbW1hbmQgbGluZSBzd2l0Y2hlcyBwYXNzZWQgdG8gYXNzZW1ibGVyLgotCi1Nb24gQXVnICAzIDE0OjAyOjUyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKEdBU19DR0VOX01BWF9GSVhVUFMpOiBHQVNfIHByZXBlbmRlZCwgYWxsIHVzZXMgdXBkYXRlZC4KLQkoZ2FzX2NnZW5fb3Bjb2RlX2Rlc2MpOiBEZWNsYXJlLgotCShnYXNfY2dlbl9wYXJzZV9vcGVyYW5kKTogRGVjbGFyZS4KLQkoKik6IFByZXBlbmQgZ2FzXyB0byBnYXMgc3BlY2lmaWMgZm5zIHRvIGRlbm90ZSB0aGVtIGFzIHN1Y2guCi0JQWxsIHVzZXMgdXBkYXRlZC4KLQkqIGNnZW4uYyAoZ2FzX2NnZW5fb3Bjb2RlX2Rlc2MpOiBOZXcgZ2xvYmFsCi0JKGdhc19jZ2VuX2luaXRfcGFyc2UpOiBSZW5hbWVkIGZyb20gY2dlbl9hc21faW5pdF9wYXJzZS4KLQkocXVldWVfZml4dXApOiBSZW5hbWVkIGZyb20gY2dlbl9xdWV1ZV9maXh1cC4KLQkoKik6IFByZXBlbmQgZ2FzXyB0byBnYXMgc3BlY2lmaWMgZm5zIHRvIGRlbm90ZSB0aGVtIGFzIHN1Y2guCi0JQWxsIHVzZXMgdXBkYXRlZC4KLQkoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IFVwZGF0ZSBjYWxsIHRvIGluc2VydF9vcGVyYW5kLgotCShnYXNfY2dlbl9maW5pc2hfaW5zbik6IFJlbmFtZWQgZnJvbSBjZ2VuX2FzbV9maW5pc2hfaW5zbi4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2JlZ2luKTogUmVtb3ZlIHVzZSBvZiBDR0VOX1NZTS4KLQlPcGVuIG9wY29kZSB0YWJsZSBhbmQgaW5pdGlhbGl6ZSBpdC4KLQkobWFrZV9wYXJhbGxlbCk6IFVzZSBnYXNfY2dlbl9vcGNvZGVfZGVzYy4KLQkoYXNzZW1ibGVfcGFyYWxsZWxfaW5zbik6IERpdHRvLiAgUmVtb3ZlIHVzZSBvZiBDR0VOX1NZTS4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQotU2F0IEF1ZyAgMSAxOToyNzozMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcy5oIChkZWJ1Z19pbmZvX3R5cGUpOiBBZGQgZW50cmllcyBmb3IgdW5zcGVjaWZpZWQgYW5kIGR3YXJmKi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBUYWtlIG5vIGFyZ3VtZW50czsgY2FsbAotCWFzX3doZXJlIG91cnNlbHZlcy4gIFByb3ZpZGUgYSBzdHViIGZvciAhRUNPRkZfREVCVUdHSU5HLgotCSogZWNvZmYuaDogTW92ZSBFQ09GRl9ERUJVR0dJTkcgcHJvdGVjdGlvbiBpbnNpZGUgR0FTX0VDT0ZGX0guCi0JTW92ZSBlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vIG91dHNpZGUgRUNPRkZfREVCVUdHSU5HIHByb3RlY3Rpb24uCi0JKiByZWFkLmMgKGdlbmVyYXRlX2xpbmVub19kZWJ1Zyk6IFRpZHkgRUNPRkYgYml0cy4gIFVzZQotCURFQlVHX1VOU1BFQ0lGSUVEIHJhdGhlciB0aGFuIERFQlVHX05PTkUgZm9yIGluaXRpYWwgdGVzdC4KLQkqIGNvbmZpZy9vYmotZWxmLmggKEVDT0ZGX0RFQlVHR0lORykgW1RDX0FMUEhBXTogRGVmaW5lIHRvIGEgdmFyaWFibGUuCi0JKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBDb25kaXRpb25hbGl6ZSBvbiB2YWx1ZSBvZiBFQ09GRl9ERUJVR0dJTkcuCi0JKElOSVRfU1RBQl9TRUNUSU9OKTogTGlrZXdpc2UuCi0JKE9CSl9QUk9DRVNTX1NUQUIpOiBMaWtld2lzZS4KLQkKLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9sb25nb3B0cyk6IE5ldyBvcHRpb25zIC1tZGVidWcvLW5vLW1kZWJ1Zy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogV2F0Y2ggZm9yIHRoZW0uCi0JKGFscGhhX2N1cl9lbnRfc3ltLCBhbHBoYV9mbGFnX21kZWJ1Zyk6IE5ldyB2YXJpYWJsZXMuCi0JKG1kX2JlZ2luKTogS2lsbCBuZXZlcmRlZiBjb2RlLgotCShzX2FscGhhX2VudCwgc19hbHBoYV9lbmQsIHNfYWxwaGFfbWFzaywgc19hbHBoYV9mcmFtZSk6IE5ldy4KLQkoc19hbHBoYV9wcm9sb2d1ZSk6IFdhdGNoIGFscGhhX2N1cl9lbnRfc3ltLgotCShzX2FscGhhX2NvZmZfd3JhcHBlcik6IE5ldy4KLQkobWRfcHNldWRvX3RhYmxlKTogVHJhcCBhbGwgRUNPRkYgcHNldWRvcy4KLQkKLUZyaSBKdWwgMzEgMTY6NDU6NTQgMTk5OCAgUm9uIFVucmF1IDxydW5yYXVAY3lnbnVzLmNvbT4KLQotCVN0YXJ0IG9mIGNoYW5nZXMgdG8gcmVtb3ZlIG1kZWJ1ZyBzZWN0aW9uIGZyb20gbWlwcyotZWxmCi0JQmFzZWQgb24gTUlQU19TVEFCX0VMRiBkZWZpbml0aW9uCi0JKiBhY2NvbmZpZy5oOiB1bmRlZiBpZiBub3QgY29uZmlndXJlZAotCSogY29uZmlnLmluOiB1bmRlZiBpZiBub3QgY29uZmlndXJlZAotCSogY29uZmlnL21pcHMtZWxmLmg6IG9ubHkgc2V0IEVDT0ZGIGRlYnVnZ2luZyBpZiBub3Qgc3RhYnMtaW4tZWxmCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX2VudCk6IHNldCBCU0ZfRlVOQ1RJT04KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogZmx1c2ggZnJhZwotCi1GcmkgSnVsIDMxIDE2OjE0OjQ1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiAoYXJtLSotZWxmKTogIEhhbmRsZS4KLSAgICAgICAgKHRodW1iLSotZWxmKTogSGFuZGxlLgotICAgICAgICAqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUuCi0gICAgICAgICogcmVhZC5jIChzdHJpbmdlcik6IEZpeCB0eXBvIGluIGNvbW1lbnQuCi0gICAgICAgICogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGFkZCBzeW1ib2wgdmFsdWUgdG8gYWRkZW5kIGlmCi0gICAgICAgIFRDX0FSTSBhbmQgT0JKX0VMRi4KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiAgRG9uJ3QgYWxpZ24gZHdhcmYgZGVidWcKLSAgICAgICAgc2VjdGlvbnMuCi0gICAgICAgICh0Y19nZW5fcmVsb2MpOiAgQWx3YXlzIHNldCB0aGUgcmVsb2MgYWRkZW5kIHRvIGZpeHAtPmZ4X29mZnNldAotICAgICAgICBmb3IgT0JKX0VMRi4KLQotVGh1IEp1bCAzMCAyMTozODo0MyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh7Y3VyLHByZXZ9X2xlZnRfa2lsbHNfcmlnaHRfcCk6IE5ldyB2YXJpYWJsZXMuCi0JKHdyaXRlXzJfc2hvcnQpOiBFbWl0IHdhcm5pbmcgaWYgbmV3IGZsYWcgaXMgc2V0LgotCShkb19hc3NlbWJsZSk6IFNldCBmbGFncyBpZiBsZWZ0IGluc3RydWN0aW9uIGlzIG9uZSBvZiBzcGVjaWFsCi0JInJpZ2h0LWluc3RydWN0aW9uLWtpbGxlciIgdHlwZS4KLQotVHVlIEp1biAyOCAxODoxMjoyOCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQkKLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9udW1iZXJfdG9fY2hhcnMsIGNvbnNfZml4X25ld19zcGFyYyk6Ci0JQWx3YXlzIG91dHB1dCB3b3JkcyBpbiBkZWJ1Z19pbmZvIHNlY3Rpb24gYXMgYmlnIGVuZGlhbi4KLQkoc3BhcmNfdGFyZ2V0X2Zvcm1hdCk6IENob29zZSBjb3JyZWN0IGJmZCB0YXJnZXQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWUgQkZEX1JFTE9DX1NQQVJDXzMyTEUgdG8gQkZEX1JFTE9DX1NQQVJDX1JFVjMyLgotCQotVHVlIEp1bCAyOCAxMTowMToyMSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogRml4ICJlcnJtc2ciIGluaXRpYWxpemF0aW9uCi0JdG8gd29yayB3aXRoIGludGVybmF0aW9uYWxpemF0aW9uIGNvZGUuICBJc3N1ZSBhbiBlcnJvciB3aGVuIHR3bwotCW9wZXJhbmRzIG1hdGNoIHRoYXQgYXJlIG5vdCBhbGxvd2VkIHRvIG1hdGNoLgotCi1Nb24gSnVsIDI3IDE2OjI1OjU4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaW5zdGFsbF90b29sZGlyKTogQWxsb3cgdGFyZ2V0IHRvIHNwZWNpZnkgd2hldGhlcgotCWl0IHdhbnRzIHRvIGJlIGluc3RhbGxlZCBpbiAkKHRvb2xkaXIpL2Jpbi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBTZXQgaW5zdGFsbC1leGVjLXRvb2xkaXIKLQlkZXBlbmRlbmN5IHZpYSBjb25maWd1cmUuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotRnJpIEp1bCAyNCAxOTo1ODo1OSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogU3BsaXQgaW50byB0d28gLi4uCi0JKGluc3RhbGwtZXhlYy1iaW5kaXIsaW5zdGFsbC1leGVjLXRvb2xkaXIpOiBOZXcgcnVsZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotRnJpIEp1bCAyNCAxNjozMTo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCByZW1vdmUgdGhlIGZpbGUgYmVmb3JlCi0JY2hlY2tpbmcgd2hldGhlciAkKGJpbmRpcikgPT0gJCh0b29sZGlyKS9iaW4uICBGcm9tIE1hY2llagotCVcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBKdWwgMjQgMDk6MTM6NDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShjZ2VuX21kX2FwcGx5X2ZpeDMpOiBVcGRhdGUgY2FsbCB0byBtZF9jZ2VuX2xvb2t1cF9yZWxvYy4KLQkoY2dlbl90Y19nZW5fcmVsb2MpOiBVc2UgeG1hbGxvYywgbm90IGJmZF9hbGxvYy4KLQkqIGNnZW4uaCAoY2dlbl9tZF9hcHBseV9maXgzLGNnZW5fdGNfZ2VuX3JlbG9jKTogRGVjbGFyZS4KLQkobWRfY2dlbl9sb29rdXBfcmVsb2MpKTogRGVjbGFyZS4KLQkobWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmggKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IERlY2xhcmUuCi0JKG0zMnJfcmVsYXhfZnJhZyk6IERlY2xhcmUuCi0JKGNnZW5fbWRfYXBwbHlfZml4Myk6IERlY2xzIG1vdmVkIHRvIGNnZW4uaC4KLQkoY2dlbl9yZWNvcmRfZml4dXBfZXhwLGNnZW5fdGNfZ2VuX3JlbG9jKTogRGl0dG8uCi0JKG0zMnJfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogRGVsZXRlIGRlY2wuCi0JKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2NwdV9kZXNjKTogI2lmIDAgb3V0LgotCShhc3NlbWJsZV9ub3ApOiBEZWxldGUuCi0JKGV4cGFuZF9kZWJ1Z19zeW1zKTogRGVsZXRlIHVudXNlZCBgZXhwJy4KLQkobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBSZW5hbWVkIGZyb20gQ0dFTl9TWU0gKGxvb2t1cF9yZWxvYykuCi0JQWRkIGRlZmF1bHQgY2FzZSBmb3IgLVdhbGwuCi0JKG0zMnJfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogQWRkIGRlZmF1bHQgY2FzZSBmb3IgLVdhbGwuCi0JKG1kX2F0b2YpOiBEZWxldGUgdW51c2VkIHdvcmRQLgotCi1UaHUgSnVsIDIzIDEzOjE5OjUwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBNYWtlIHN1cmUgImVycm1zZyIgaGFzIGEgbm9uLU5VTEwKLQl2YWx1ZS4KLQotV2VkIEp1bCAyMiAxNDozNjo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgLmVuZCwgLmV4aXRtLCAuZmFpbCwKLQkuaWZjLCAuaWZlcXMsIC5pZmdlLCAuaWZndCwgLmlmbGUsIC5pZmx0LCAuaWZuYywgLmlmbmUsIC5pZm5lcywKLQkucHJpbnQsIC5wdXJnZW0sIGFuZCAuc3RydWN0LiAgUmVtb3ZlIGRvY3VtZW50YXRpb24gZm9yCi0JLmFwcC1maWxlLgotCi1UdWUgSnVsIDIxIDE2OjUwOjUyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fbWRfYXBwbHlfZml4Myk6IHNldF9vcGVyYW5kIHJlbmFtZWQgdG8gc2V0X3ZtYV9vcGVyYW5kLgotCVVwZGF0ZSBjYWxsIHRvIGluc2VydF9vcGVyYW5kLgotCi1GcmkgSnVsIDE3IDExOjQyOjIwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1zX3Nob3dfdXNhZ2UpOiBGb3JtYXR0aW5nIGNoYW5nZXMuCi0KLVdlZCBKdWwgMTUgMTU6Mzg6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IERvbid0IGdldCBjb25mdXNlZCBieSB0cmFpbGluZwotCXdoaXRlc3BhY2UgYWZ0ZXIgYSBwcmVmaXggb3BlcmF0b3IuCi0KLVR1ZSBKdWwgMTQgMTU6MzI6NTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotYmVvc3twZSxlbGYsfSopOiBSZWNvZ25pemUuCi0KLVR1ZSBKdWwgMTQgMTI6MzM6NDQgMTk5OCAgQ2hyaXMgVG9yZWsgIDx0b3Jla0Bic2RpLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGxvZzIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX3Jlc2VydmUpOiBVc2UgbG9nMiB0byBjb252ZXJ0IGFsaWdubWVudCBiZWZvcmUgY2FsbGluZwotCXJlY29yZF9hbGlnbm1lbnQuCi0JKHNfY29tbW9uKTogVXNlIGxvZzIgdG8gY29udmVydCBhbGlnbm1lbnQgYmVmb3JlIGNhbGxpbmcKLQlyZWNvcmRfYWxpZ25tZW50IGFuZCBmcmFnX2FsaWduLgotCShzcGFyY19jb25zX2FsaWduKTogVXNlIGxvZzIuCi0KLVR1ZSBKdWwgMTQgMTE6NTg6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogU2V0IHN5bWJvbCBzaXplIGlmIE9CSl9FTEYuCi0JKHNfY29tbW9uKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19oYW5kbGVfYWxpZ24pOiBSZWluZGVudCBhIGJpdC4gIENvcnJlY3QKLQlpbml0aWFsaXphdGlvbiBvZiB3YWRkci4KLQkoc3BhcmNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KLQotVHVlIEp1bCAxNCAxMTowMDoxNiAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGRvYy9jLWkzODYudGV4aTogRml4IGEgdHlwby4gIFVzZSB0aGUgdGVybSA4MC1iaXQgcmVhbCByYXRoZXIKLQl0aGFuIHRlbXBvcmFyeSByZWFsLgotCi1Nb24gSnVsIDEzIDEzOjU1OjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoc3Vic2Vnc19maW5pc2gpOiBEb24ndCBhbGlnbiB0aGUgc2VnbWVudHMgaWYgdGhlcmUgd2VyZQotCWFueSBlcnJvcnMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX3N5bWJvbF9tZXJnZSk6IENvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzIHdoZW4KLQljb3B5aW5nIGF1eCBpbmZvcm1hdGlvbi4KLQotCSogZXhwci5jIChtYWtlX2V4cHJfc3ltYm9sKTogQ2F0Y2ggYXR0ZW1wdHMgdG8gdHVybiBhbiBPX2JpZwotCWV4cHJlc3Npb24gaW50byBhIHN5bWJvbC4KLQotTW9uIEp1bCAxMyAxMzoyOTowNCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1vZGVfZnJvbV9kaXNwX3NpemUpOiBDaGFuZ2UgYXJnIGFuZCByZXR1cm4KLQl0eXBlIHRvIHVuc2lnbmVkIGludC4KLQkobWRfYXNzZW1ibGUpOiBDaGFuZ2UgdHlwZSB1c2VkIHRvIHN0b3JlIG9mZnNldHMgZnJvbSB1bnNpZ25lZAotCWxvbmcgdG8gbG9uZy4KLQkoaTM4Nl9vcGVyYW5kKTogU3dpdGNoIGVycm9yIGNoZWNrIHRvIG9ubHkgY2FsbCBSRVNUT1JFX0VORF9TVFJJTkcKLQlvbmNlIGFmdGVyIHBhcnNlX3JlZ2lzdGVyLgotCi1GcmkgSnVsIDEwIDE2OjAwOjA0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3Nob3dfdXNhZ2UpOiBDaGFuZ2VkIGZvcm1hdCB0byBtYXRjaCB0aGF0Ci0Jb2YgZ2NjLCBsZCwgZXRjLgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogQ2hhbmdlZCBmb3JtYXQgdG8gbWF0Y2ggdGhhdCBvZiBnY2MsIGxkLCBldGMuCi0KLVRodSBKdWwgIDkgMTI6MDk6NTcgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHRjX202OGtfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgdnRhYmxlCi0JcmVsb2NzLgotCShtZF9hcHBseV9maXhfMik6IEZvcmNlIHRoZSBzeW1ib2wgb2YgdGhlIHZ0YWJsZSByZWxvYyB0byBiZQotCXdlYWsuCi0KLVRodSBKdWwgIDkgMTE6MzE6NTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvTWFrZWZpbGUuYW0gKE1BSU5UQUlORVJDTEVBTkZJTEVTKTogRGVmaW5lLgotCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgSnVsICA4IDEyOjE4OjU2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXAsIGNhc2UgJ2knIGFuZCAnaicpOiBNYXNrIG9mZiBoaWdoIGJpdHMKLSAgICAgICAgZm9yICVsbyBleHByZXNzaW9ucy4KLSAgICAgICAgKG1pcHNfaXAsIGNhc2UgJ3UnKTogTW92ZSByYW5nZSBjaGVjayBhZnRlciBjb2RlIHRvIG1hc2sKLSAgICAgICAgb2ZmIGJpdHMgaW4gJWhpLyVsbyBleHByZXNzaW9ucy4gIE1hc2sgb2ZmIGhpZ2ggYml0cyBmb3IKLSAgICAgICAgJWxvIGV4cHJlc3Npb25zLgotCi1UdWUgSnVsICA3IDE3OjU3OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL01ha2VmaWxlLmFtIChnYXN2ZXIudGV4aSk6IE5ldyB0YXJnZXQuCi0JKGFzLmluZm8sIGFzLmR2aSk6IERlcGVuZHMgdXBvbiBnYXN2ZXIudGV4aS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBJbmNsdWRlIGdhc3Zlci50ZXhpLiAgTWVudGlvbiB2ZXJzaW9uIG51bWJlciBvbgotCXRpdGxlIHBhZ2UgYW5kIGluIHRvcCBub2RlLgotCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgSnVsICA3IDExOjQyOjE2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19saXN0aW5nKTogRm9yIEVESUNUX0xJU1QsIHNraXAgYWxsIGxpbmVzIHVwIHRvCi0JYnV0IG5vdCBpbmNsdWRpbmcgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgZWRpY3QuCi0JKiBsaXN0aW5nLmggKExJU1RJTkdfRU9GKTogTmV3LgotCSogaW5wdXQtc2NydWIuYyAoaW5wdXRfc2NydWJfbmV4dF9idWZmZXIpOiBDYWxsIGl0LgotCi1UdWUgSnVsICA3IDEzOjAwOjM3IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogRG9uJ3Qgc2V0IHRoZSBzaXplIG9mIGFuCi0gCWltbWVkaWF0ZSBhZGRyZXNzIGJhc2VkIHNvbGVseSBvbiB0aGUgc3VmZml4IGFuZCB0aGUgbW9kZS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBBZGQgYXNzZXJ0aW9uIHRvIG1ha2Ugc3VyZQotCW92ZXJsYXAyIGRvZXMgbm90IHNldCBJbW0uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHNwYWNlX2NoYXJzKTogUmVtb3ZlLiBUaGUgc2NydWJiZXIgY29udmVydHMKLQlzZXF1ZW5jZXMgb2Ygd2hpdGVzcGFjZSB0byBhIHNpbmdsZSBzcGFjZS4KLQkoaXNfc3BhY2VfY2hhcnMpOiBKdXN0IGNvbXBhcmUgd2l0aCBzcGFjZS4KLQkobWRfYmVnaW4pOiBEb24ndCBpbml0aWFsaXplIHNwYWNlX2NoYXJzLgotCShtZF9hc3NlbWJsZSk6IEp1c3Qgc2tpcCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4KLQkoaTM4Nl9vcGVyYW5kKTogUmV3cml0ZSBiYXNlLWluZGV4IHBhcnNpbmcgdG8gdXNlIG5ldwotCXBhcnNlX3JlZ2lzdGVyLCBhbmQgdG8gc2tpcCB3aGl0ZSBzcGFjZS4gIFNraXAgd2hpdGUgc3BhY2UgaW4gYQotCW51bWJlciBvZiBvdGhlciBwbGFjZXMgdG9vLiAgRG9uJ3QgZ2l2ZSBlcnJvciBtZXNzYWdlIGlmCi0JcGFyc2VfcmVnaXN0ZXIgZmFpbHMuCi0JKHBhcnNlX3JlZ2lzdGVyKTogQ2hhbmdlIHJlZ19zdHJpbmcgcGFyYW1ldGVyIHRvIGJlIG5vbi1jb25zdC4KLQlBZGQgZW5kX29wIHBhcmFtZXRlci4gIFNraXAgd2hpdGUgc3BhY2UgYWZ0ZXIgdGhlIGAlJywgYW5kIHJldHVybgotCWVuZCBvZiByZWdpc3RlciBzdHJpbmcuICBHaXZlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRoZXIgdGhhbgotCWNhbGxlci4KLQotRnJpIEp1bCAgMyAxNTozNDozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIE1hdHQgU2VtZXJza3kgPG1hdHRzQHNjZC5ocC5jb20+OgotCSogZXhwci5jIChvcF9lbmNvZGluZyk6IE1ha2UgY29uc3QuCi0JKGV4cHJfc2V0X3ByZWNlZGVuY2UpOiBOZXcgZnVuY3Rpb24uCi0JKGV4cHJfYmVnaW4pOiBEb24ndCBzZXQgb3BlcmF0b3IgcmFua2luZ3MsIGp1c3QgY2FsbAotCWV4cHJfc2V0X3ByZWNlZGVuY2UuCi0JKiBleHByLmggKGV4cHJfc2V0X3ByZWNlZGVuY2UpOiBEZWNsYXJlLgotCSogcmVhZC5jIChzX21yaSk6IENhbGwgZXhwcl9zZXRfcHJlY2VkZW5jZS4KLQotVGh1IEp1bCAgMiAxNjoyNDo1OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChTdGF0ZW1lbnRzKTogUmVtb3ZlIHBhcmFncmFwaCBkaXNjdXNzaW5nCi0JY29udGludWluZyBsaW5lcyB3aXRoIGEgYmFja3NsYXNoLiAgVGhpcyBoYXNuJ3Qgd29ya2VkIGZvciB5ZWFycywKLQlpZiBpdCBldmVyIGRpZC4KLQotVGh1IEp1bCAgMiAxNDowNjoyMiAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHJtaS5kZT4KLQotICAgICAgICAqIG9iai12bXMuYzogQWRkIEMrKyBzdXBwb3J0IHdpdGggY3RvcnMvZHRvcnMgc2VjdGlvbnMuICBBZGQgd2VhawotCXN5bWJvbCBkZWZpbml0aW9ucy4KLQkoQ3RvcnNfU3ltYm9scywgRHRvcnNfU3ltYm9scyk6IE5ldyBzeW1ib2wgY2hhaW5zLgotCShwc19DVE9SUywgcHNfRFRPUlMpOiBOZXcgc2VjdGlvbiB0eXBlcy4KLQkodm1zX2ZpeHVwX3h0b3JzX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24KLQkoQ3RvcnNfUHNlY3QsIER0b3JzX1BzZWN0KTogRGVmaW5lLgotCShJU19HWFhfWFRPUik6IERlZmluZQotCShnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSk6IENoYW5nZSBjaGVjayBvZiBneHhfYnVnX2ZpeGVkIHRvIDAuCi0JRmlsdGVyIHN0YXRpYyBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgYW5kIGFkZCB0bwotCUN0b3JzX1N5bWJvbHMvRHRvcnNfU3ltYm9scyBjaGFpbi4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlKTogV3JpdGUgQ3RvcnNfU3ltYm9scy9EdG9yc19TeW1ib2xzIHRvCi0JYXBwcm9wcmlhdGUgc2VjdGlvbi4KLQotICAgICAgICAqIHRjLWFscGhhLmggKFRBUkdFVF9GT1JNQVQpOiBSZW5hbWUgImV2YXgtYWxwaGEiIHRvICJ2bXMtYWxwaGEiLgotCSogbWFrZWZpbGUudm1zOiBNZXJnZSB2YXgvdm1zIHN1cHBvcnQuCi0KLVdlZCBKdWwgIDEgMjA6MDY6MjAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl92dGFibGVfaW5oZXJpdCwgb2JqX2VsZl92dGFibGVfZW50cnkpOiBOZXcuCi0JKGVsZl9wc2V1ZG9fdGFibGUpOiBBZGQgdGhlbS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIHZ0YWJsZSByZWxvY3MuCi0JKG1kX2FwcGx5X2ZpeCk6IEFjY2VwdCB0aGVtLgotCShtaXBzX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHRoZW0uCi0JKHRjX2dlbl9yZWxvYyk6IE11bmcgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSBmb3IgUmVsLgotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogQWNjZXB0IHZ0YWJsZSByZWxvY3MuCi0JKiBjb25maWcvdGMtcHBjLmggKFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTik6IEZvcmNlIHZ0YWJsZSByZWxvY3MuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHRoZW0uCi0KLVdlZCBKdWwgIDEgMTY6MzU6MzIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChDR0VOX0NQVV9QUkVGSVgpOiBOZXcgdmFyaWFibGUuCi0JKGNnZW4ubyk6IFVzZSBpdC4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluOiBBQ19TVUJTVCBjZ2VuX2NwdV9wcmVmaXguCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVdlZCBKdWwgIDEgMjE6Mzg6NTYgMTk5OCAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLXNoIChDT05EX0pVTVBfREVMQVksIENPTkQxMl9ERUxBWV9MRU5HVEgpOiBEZWZpbmUuCi0JQ2hhbmdlZCBhbGwgdXNlcnMgb2YgQ09ORDEyX0RFTEFZLgotCi1GcmkgSnVuIDI2IDExOjIxOjExIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAoc2V0X2FyY2hfbWFjaCk6IE5ldyBmdW5jdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIHBzZXVkby1vcHMgdG8gc2V0IHRoZSBjdXJyZW50IG1hY2hpbmUgdHlwZS4KLQkobWRfYmVnaW4pOiBEZWZhdWx0IHRvIG1uMTAzMDAgbW9kZS4KLQkobWRfYXNzZW1ibGUpOiBPbmx5IGFjY2VwdCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBjb3JlIG1uMTAzMDAKLQljaGlwIGFuZCB0aGUgYWN0aXZlIG1hY2hpbmUgdHlwZS4KLQotV2VkIEp1biAyNCAxOTowNjowNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBHaXZlIHRoZSBzdHJ1Y3QgYSBuYW1lLgotCSogY29uZmlnL3RjLWg4MzAwLmggKHRjX3JlbG9jX21hbmdsZSk6IEFkZCBwcm90b3R5cGUuCi0JKiBjb25maWcvdGMtaDg1MDAuaCAodGNfcmVsb2NfbWFuZ2xlKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1zaC5oIChzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IEFkZCBwcm90b3R5cGUuCi0JKiBjb25maWcvdGMtdzY1LmggKHRjX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtejhrLmggKHRjX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCi0KLVdlZCBKdW4gMjQgMTM6NDU6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2NvbW0pOiAgUmVzdG9yZSBvbGQgc2VjdGlvbgotICAgICAgICBhZnRlciBjb21tb24gcHJvY2Vzc2luZy4KLQotV2VkIEp1biAyNCAxMTo1MDo1NCAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlnL29iai12bXMuYyAoQ3JlYXRlX1ZNU19PYmplY3RfRmlsZSk6IEZvcmNlIGJpbmFyeSBmaWxlLgotCi1UdWUgSnVuIDIzIDE3OjQ3OjMxIDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGRvX2FfZml4X2ltbSwgYnVpbGRfYnl0ZXMpOiBSZXBsYWNlIGNhc3QgdG8KLQljaGFyIHdpdGggY29kZSB0aGF0IGV4cGxpY2l0bHkgc2lnbi1leHRlbmRzLgotCi1UdWUgSnVuIDIzIDEzOjU0OjU3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0JCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9iZWdpbik6IFJlc3RvcmUgdGV4dCBzZWN0aW9uIGFzIHRoZSBjdXJyZW50Ci0Jc2VjdGlvbiBhZnRlciBjcmVhdGluZyBjYWxsIHRhYmxlIHNlY3Rpb25zLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNZTV9BVVhJTkZPKTogTmV3IG1hY3JvIHRvIGNvbmNlYWwgdWdseQotCWNvZGUuIAotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zeW1ib2xfbWVyZ2UpOiBSZXBsYWNlIGNvbXBsZXggZXhwcmVzaW9uCi0Jd2l0aCBjYWxsIHRvIG1hY3JvIFNZTV9BVVhJTkZPLgotCi1UdWUgSnVuIDIzIDE1OjA5OjI3IDE5OTggIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IERvbid0IGxldCBFWEVFWFQgaW50ZXJmZXJlCi0Jd2l0aCB0aGUgcHJvZ3JhbSB0cmFuc2Zvcm0gbmFtZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gSnVuIDIyIDE5OjUyOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc3ltYm9sX21lcmdlKTogRml4IGNvcHlpbmcgb2YgYXV4aWxpYXJ5Ci0JaW5mb3JtYXRpb24uCi0KLU1vbiBKdW4gMjIgMTU6MTg6NTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBCZSBwcmVwYXJlZCBmb3IgYSBzcGFjZSBiZXR3ZWVuCi0JdGhlIG9wZW4gcGFyZW50aGVzaXMgYW5kIHRoZSBzdGFydCBvZiB0aGUgcmVnaXN0ZXIgb3BlcmFuZCwKLQliZWNhdXNlIG9mIHRoZSBKdW5lIDE2IGNoYW5nZS4KLQotU3VuIEp1biAyMSAyMToyNzowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hcHBseV9maXgpOiBIYW5kbGUgd2VhayBzeW1ib2xzIGNvcnJlY3RseSBpZgotCUJGRF9BU1NFTUJMRVIuCi0KLVN1biBKdW4gMjEgMTI6MjY6MzYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZDMwdl9hbGlnbik6IEFsd2F5cyBwZXJmb3JtIGFsaWdubWVudCByZXF1ZXN0LAotCWV2ZW4gaWYgaXQgaXMgYmVsaXZlZCB0byBiZSB1bm5lY2Vzc2FyeS4KLQotRnJpIEp1biAxOSAxMzo1NzowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogTmV2ZXIgYWRqdXN0IHJlbG9jcyBhZ2FpbnN0IHdlYWsKLQlzeW1ib2xzLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogQWRqdXN0IGFjY29yZGluZ2x5LgotCi1GcmkgSnVuIDE5IDA5OjUwOjE3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IERvIG5vdCBoYXJkY29kZSB0aGUKLQlzaGlmdCBhbW91bnQgZm9yIGEgcmVwZWF0ZWQgb3BlcmFuZC4gIFRoZSBzaGlmdCBhbW91bnQgZm9yIHRoZQotCXJlcGVhdGVkIGNvcHkgY29tZXMgZnJvbSB0aGUgc2l6ZSBvZiB0aGUgb3BlcmFuZC4KLQotRnJpIEp1biAxOSAwMDo0NDoxOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChnZXRfb3BlcmFuZCk6IEZpeCB0eXBvcyBpbiBsZG0vc3RtIHN1cHBvcnQuCi0KLVdlZCBKdW4gMTcgMTM6MDc6MDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9zaG93X3VzYWdlKTogRml4IC1taXBzTiB1c2FnZS4KLQotVHVlIEp1biAxNiAxMzowNjoyMSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IElmIHRjX3N5bWJvbF9jaGFycyBpcyBkZWZpbmVkLCB0cmVhdCBhbGwKLQljaGFyYWN0ZXJzIGluIGl0IGFzIExFWF9JU19TWU1CT0xfQ09NUE9ORU5ULgotCSogY29uZmlnL3RjLWkzODYuaCAodGNfc3ltYm9sX2NoYXJzKTogRGVmaW5lLgotCShleHRyYV9zeW1ib2xfY2hhcnMpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWkzODYuYyAoZXh0cmFfc3ltYm9sX2NoYXJzKTogRGVmaW5lLgotCShjb21tZW50X2NoYXJzKTogRG9uJ3QgdXNlICcvJyBhcyBjb21tZW50IHN0YXJ0IGlmIFRFX0xJTlVYLgotCShsaW5lX2NvbW1lbnRfY2hhcnMpOiBTZXQgdG8gJy8nIGlmIFRFX0xJTlVYLgotCSogZG9jL2MtaTM4Ni50ZXhpIChpMzg2LXByZWZpeGVzKTogVXBkYXRlLgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IERvY3VtZW50IHRjX3N5bWJvbF9jaGFycy4KLQotRnJpIEp1biAxMiAxMzozNjo1NCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBJZiBtYWludGFpbmVyIG1vZGUsIGRlcGVuZCBvbiAucG90IGZpbGUuCi0JKCQoUEFDS0FHRSkucG90KTogVW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBQT1RGSUxFUy4KLQotMTk5OC0wNi0xMiAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBDaGVja2luZyBkaXNwbGFjZW1lbnQKLQljb25zdHJhaW50IGluIGluc3RydWN0aW9ucyBSRVAgJiBSRVBJLgotCi1UaHUgSnVuIDExIDA4OjU2OjQ2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBDYXRjaCBCRkRfUkVMT0NfOCwKLQlCRkRfUkVMT0NfMTYsIEJGRF9SRUxPQ182NCBhbmQgaXNzdWUgYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZXMuICAKLQotCShjaGVja19yYW5nZSk6IElmIHRoZSBvcGVyYW5kIGlzIHNoaWZ0ZWQsIHRoZW4gc2hpZnQgdGhlIG51bWJlcgotCWJlZm9yZSBjaGVja2luZyBpdHMgcmFuZ2UuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogQWRkIG1vcmUgY2hlY2tzIGZvciBOVUxMIHBvaW50ZXJzLiAKLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9jb21tKTogU2V0IFNFQ19DT01NT04gYml0IG9uIHNwZWNpYWwKLQljb21tb24gc2VjdGlvbnMuCi0KLVdlZCBKdW4gMTAgMTc6MjY6MzUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9jb21tKTogQ3JlYXRlIHNwZWNpYWwgc2VjdGlvbnMgYXMgbmVlZGVkLgotCi0xOTk4LTA2LTEwICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAod3JpdGVfMl9zaG9ydCk6IEFkZGl0aW9uIG9mIHN3YXBwaW5nCi0JaW5zdHJ1Y3Rpb25zIGZvciBzZXF1ZW50aWFsIGFuZCByZXZlcnNlIHNlcXVlbnRpYWwgb3JkZXIgd2hlbgotCWdpdmVuIG9yZGVyIGlzIG5vdCBwb3NzaWJsZS4KLQotVHVlIEp1biAgOSAxMzo1Mjo1MyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKERFUF9JTkNMVURFUyk6IEZpeCByZWZlcmVuY2UgdG8gaW50bCBidWlsZCBkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEp1biAgOSAxMjoyMDowNSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGRvYy9jLWkzODYudGV4aTogVXBkYXRlIDE2IGJpdCBkb2N1bWVudGF0aW9uLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oOiBDaGFuZ2UgRGF0YTE2IHRvIFNpemUxNiwgRGF0YTMyIHRvIFNpemUzMiwKLQlJZ25vcmVEYXRhU2l6ZSB0byBJZ25vcmVTaXplIGFzIHRoZXkgYXJlIHVzZWQgZm9yIGFkZHJlc3Mgc2l6ZSBhcwotCXdlbGwgYXMgZGF0YSBzaXplLgotCSogY29uZmlnL3RjLWkzODYuYzogTGlrZXdpc2UuICBBZGQgY29kZSB0byByZWplY3QgYWRkcjMyL2RhdGEzMiBpbgotCTMyLWJpdCBtb2RlLCBzaW1pbGFybHkgYWRkcjE2L2RhdGExNiBhbmQgdmFyaWFudHMuCi0KLU1vbiBKdW4gIDggMTg6MzI6MDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUpOiBGaXggaGFuZGxpbmcgb2YgcmV2ZXJzZQotCXNlcXVlbnRpYWwgd29yZCBtdWx0aXBseSBpbnN0cnVjdGlvbnMuCi0JCi0JKGRvX2Fzc2VtYmxlKTogQWRkIGV4dHJhIGNvbW1hbmQgbGluZSBhcmd1bWVudCwgdG8gYWxsb3cgbXVsMzIKLQlhdHRyaWJ1dGUgdG8gYmUgcHJlc2VydmVkIGFjcm9zcyBwYXJhbGxlbCBpbnNucy4KLQkobWRfYXNzZW1ibGUpOiBJbnNlcnQgTk9QcyBiZXR3ZWVuIGV4cGxpY2l0bHkgcGFyYWxsZWwgaW5zbnMgd2hpY2gKLQljb250YWluIGFuIDMyIGJpdCBtdWx0aXBseSBhbmQgYSAxNiBtdWx0aXBseS4KLQotTW9uIEp1biAgOCAxMjoyMDozMCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IFJFUE5FIHJlbmFtZWQgdG8gUkVQTkVfUFJFRklYX09QQ09ERSwgYW5kCi0JbGlrZXdpc2UgZm9yIFJFUEUuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHJlbG9jKTogQWRkIGJyYWNlcy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoc3RydWN0IF9pMzg2X2luc24pOiBSZW5hbWUgYmkgdG8gc2liIHRvIGJlCi0JY29uc2lzdGVudCB3aXRoIEludGVsIG5hbWluZy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKGJhc2VfaW5kZXhfYnl0ZSk6IFJlbmFtZSB0byBzaWJfYnl0ZS4gIERvbid0Ci0JdXNlIGJpdGZpZWxkcyBpbiBzaWJfYnl0ZS4KLQkobW9kcm1fYnl0ZSk6IERvbid0IHVzZSBiaXRmaWVsZHMgaGVyZSBlaXRoZXIuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGN1cnJlbnRfdGVtcGxhdGVzKTogQWRkIGNvbnN0LgotCShwYXJzZV9yZWdpc3Rlcik6IEFkZCBjb25zdCB0byByZXR1cm4sIHBhcmFtLCBhbmQgY2hhciAqcy4KLQkoaTM4Nl9vcGVyYW5kKTogQWRkIGNvbnN0IHRvIHJlZ19lbnRyeSAqci4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHRlbXBsYXRlcyk6IEFkZCBjb25zdCB0byBzdGFydCwgZW5kLgotCi0JSW5zcGlyZWQgYnkgY29kZSBmb3IgMTYgYml0IGdhcyBzdXBwb3J0IGZyb20gTWFydHluYXMgS3VuaWdlbGlzCi0JPG1hcnR5bmFzQG5tMy5rdHUubHQ+OgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBBZGQgZnVsbCBzdXBwb3J0IGZvciAxNiBiaXQKLQltb2RybSwgYW5kIEp1bXAsIEp1bXBCeXRlLCBKdW1wRHdvcmQsIEp1bXBJbnRlclNlZ21lbnQgaW5zbnMuCi0JKHVzZXNfbWVtX2FkZHJtb2RlKTogUmVtb3ZlLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEFkZCBzdXBwb3J0IGhlcmUgdG9vLgotCShtZF9yZWxheF90YWJsZSk6IFJld3JpdGUgaW50ZXJmYWNlIHRvIG1kX3JlbGF4IGZvciAxNiBiaXQKLQlzdXBwb3J0LgotCShCWVRFLCBXT1JELCBEV09SRCwgVU5LTk9XTl9TSVpFKTogUmVtb3ZlLgotCShvcGNvZGVfc3VmZml4X3RvX3R5cGUpOiBSZW1vdmUuCi0JKENPREUxNiwgU01BTEwsIFNNQUxMMTYsIEJJRywgQklHMTYpOiBEZWZpbmUuCi0JKFNJWkVfRlJPTV9SRUxBWF9TVEFURSk6IE1vZGlmeSB0byBzdWl0IGFib3ZlLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkoaTM4Nl9vcGVyYW5kKTogQWRkIHN1cHBvcnQgZm9yIDE2IGJpdCBiYXNlL2luZGV4IHJlZ3MsCi0JaW1tZWRpYXRlcywgYW5kIGRpc3BsYWNlbWVudHMuICBSZW1vdmUgc29tZSB1bm5lY2Vzc2FyeSBjYXN0cywgYW5kCi0JbG9jYWxpc2UgZW5kX29mX29wZXJhbmRfc3RyaW5nLCBkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0LAotCWRpc3BsYWNlbWVudF9zdHJpbmdfZW5kIHZhcmlhYmxlcy4gIEFkZCBHQ0NfQVNNX09fSEFDSy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKE5PX0JBU0VfUkVHSVNURVJfMTYpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHByZWZpeF9oYXNoKTogUmVtb3ZlLgotCShtZF9iZWdpbik6IFJld3JpdGUgd2l0aG91dCBvYnN0YWNrcy4gIFJlbW92ZSBwcmVmaXggaGFzaCB0YWJsZQotCWhhbmRsaW5nLiAgUmV3cml0ZSBsZXhpY2FsIHRhYmxlIGhhbmRsaW5nLgotCShpMzg2X3ByaW50X3N0YXRpc3RpY3MpOiBEb24ndCBwcmludCBwcmVmaXggc3RhdGlzdGljcy4KLQkobWRfYXNzZW1ibGUpOiBSZXdyaXRlIGluc3RydWN0aW9uIHBhcnNlciBzbyB0aGF0IGxpbmUgaXMgbm90Ci0JY29udmVydGVkIHRvIGxvd2VyIGNhc2UuICBEb24ndCBkbyBhIGhhc2hfZmluZCBmb3IgcHJlZml4ZXMsCi0JaW5zdGVhZCByZWNvZ25pc2UgdGhlbSB2aWEgb3Bjb2RlIG1vZGlmaWVyLgotCShleHBlY3Rpbmdfb3BlcmFuZCwgcGFyZW5fbm90X2JhbGFuY2VkKTogTG9jYWxpc2UgdmFyaWFibGVzLgotCSogY29uZmlnL3RjLWkzODYuaCAoSXNQcmVmaXgpOiBEZWZpbmUuCi0JKHByZWZpeF9lbnRyeSk6IFJlbW92ZS4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoUFJFRklYX1NFUEVSQVRPUik6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKFBSRUZJWF9TRVBBUkFUT1IpOiBEZWZpbmUgaGVyZSBpbnN0ZWFkLCB1c2luZwotCSdcXCcgaW4gY2FzZSB3aGVyZSBjb21tZW50X2NoYXJzIGNvbnRhaW5zICcvJy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoTUFUQ0gpOiBFbnN1cmUgZ2l2ZW4gb3BlcmFuZCBhbmQgdGVtcGxhdGUKLQltYXRjaCBmb3IgSnVtcEFic29sdXRlLiAgTWFrZXMgZS5nLiBgbGptcCB0YWJsZSglZWJ4KScgaW52YWxpZDsKLQl5b3UgbXVzdCB3cml0ZSBgbGptcCAqdGFibGUoJWVieCknLgotCi0JRnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBjb25maWcvdGMtaTM4Ni5jIChCRkRfUkVMT0NfMTYsIEJGRF9SRUxPQ18xNl9QQ1JFTCk6IERlZmluZQotCWFzIDAgaWZuZGVmIEJGRF9BU1NFTUJMRVIuCi0JKG1kX2Fzc2VtYmxlKTogQWxsb3cgaW1tZWRpYXRlIG9wZXJhbmRzIHdpdGhvdXQgc3VmZml4IG9yCi0Jb3RoZXIgcmVnIG9wZXJhbmQgdG8gZGVmYXVsdCBpbiBzaXplIHRvIHRoZSBjdXJyZW50IGNvZGUgc2l6ZS4KLQotTW9uIEp1biAgOCAwOTo0NTowMCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvdGMtdjg1MC5jIChtZF9iZWdpbik6ICBSZXN0b3JlIGNyZWF0aW9uIG9mCi0gICAgICAgIC5jYWxsX3RhYmxlX3RleHQgYW5kIC5jYWxsX3RhYmxlX2RhdGEgc2VjdGlvbnMuCi0KLVNhdCBKdW4gIDYgMDA6MDI6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUpOiBTZXQgZXhlY3V0aW9uIHR5cGUgdG8gdW5rbm93bgotCWFmdGVyIGVtaXR0aW5nIGEgd29yZCBvZiBub29wcy4KLQotRnJpIEp1biAgNSAyMzoyNzowNCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1vZGVfZnJvbV9kaXNwX3NpemUpOiBEaXNwMTYgaXMgbW9kZSAyLgotCShpMzg2X29wZXJhbmQpOiBTaW1wbGlmeSBjaGVja3MgZm9yIHZhbGlkIGJhc2UvaW5kZXggY29tYmluYXRpb25zLgotCURpc2FsbG93IGBpbiA0KCVkeCksJWFsJy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoc3RydWN0IF9pMzg2X2luc24pOiBNYWtlIHJlZ3MsIGJhc2VfcmVnLCBhbmQKLQlpbmRleF9yZWcgY29uc3QuCi0JKGFkZF9wcmVmaXgpOiBDaGFuZ2UgcGFyYW1ldGVyIGZyb20gY2hhciB0byBpbnQuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFVnaCk6IERlZmluZSBvcGNvZGUgbW9kaWZpZXIuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFByaW50IHdhcm5pbmdzIGZvciBVZ2ggaW5zbnMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogUmV3cml0ZSBNQVRDSCBhbmQKLQlDT05TSVNURU5UX1JFR0lTVEVSX01BVENIIG1hY3JvcyB0byBjaGVjayByZWdpc3RlciB0eXBlcyBtb3JlCi0JdGhvcm91Z2hseS4gIENoZWNrIGZvciBpbGxlZ2FsIHN1ZmZpeC9vcGVyYW5kIGNvbWJpbmF0aW9ucwotCXdoZW4gbWF0Y2hpbmcgaW5zbnMgd2l0aCBvcGVyYW5kcy4gIEhhbmRsZSBuZXcgYHMnIHN1ZmZpeCwgYW5kCi0JYXNzb2NpYXRlZCBGbG9hdE1GIG9wY29kZSBtb2RpZmllciBmb3IgZmxvYXQgaW5zbnMgd2l0aCBtZW1vcnkKLQlvcGVyYW5kcy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKEZsb2F0TUYpOiBEZWZpbmUgbmV3IG9wY29kZSBtb2RpZmllci4KLQkoTm9fc1N1ZiwgTm9fYlN1ZiwgTm9fd1N1ZiwgTm9fbFN1Zik6IExpa2V3aXNlLgotCShTSE9SVF9PUENPREVfU1VGRklYLCBMT05HX09QQ09ERV9TVUZGSVgpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBSZW5hbWUgV09SRF9QUkVGSVhfT1BDT0RFIHRvCi0JREFUQV9QUkVGSVhfT1BDT0RFIHRocm91Z2hvdXQuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKFJFR0lTVEVSX1dBUk5JTkdTKTogRGVmaW5lLgotCShtZF9hc3NlbWJsZSk6IFJld3JpdGUgc3VmZml4L3JlZ2lzdGVyIG9wZXJhbmQgY2hlY2tpbmcgY29kZSB0byBiZQotCW1vcmUgdGhvcm91Z2guICBSZW1vdmUgQWJzOCwxNiwzMi4gIENoYW5nZSBvY2N1cnJlbmNlcyBvZiBNZW0gdG8KLQlBbnlNZW0sIHRoZSBiZXR0ZXIgdG8gZ3JlcC4KLQkocGkpOiBSZW1vdmUgQWJzLgotCShpMzg2X29wZXJhbmQpOiBEb24ndCBzZXQgTWVtIGJpdHMgaW4gaS50eXBlc1t0aGlzX29wZXJhbmRdIHdoZW4KLQlnaXZlbiBhIG1lbW9yeSBvcGVyYW5kLiAgRG9uJ3Qgc2V0IEFicyBiaXRzIGVpdGhlci4KLQkodHlwZV9uYW1lcyk6IFJlbW92ZSBNZW0qLCBBYnMqLgotCSogY29uZmlnL3RjLWkzODYuaCAoTWVtOCwgTWVtMTYsIE1lbTMyLCBBYnM4LCBBYnMxNiwgQWJzMzIpOiBEb24ndAotCWRlZmluZSBvcGNvZGVfbW9kaWZpZXJzIGFzIHRoZXNlIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IERpc3A4LAotCURpc3AxNiwgRGlzcDMyIGFuZCBzdWZmaXggY2hlY2tzLgotCShDT01FU19JTl9CT1RIX0RJUkVDVElPTlMpOiBSZW1vdmUuCi0JKEZsb2F0Uik6IERlZmluZS4gSXQncyBPSyB0byBzaGFyZSB0aGUgYml0IHdpdGggUmV2ZXJzZVJlZ1JlZ21lbS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBEb24ndCBlbWl0IG9wZXJhbmQgc2l6ZSBwcmVmaXgKLQlpZiBJZ25vcmVEYXRhU2l6ZSBtb2RpZmllciBnaXZlbi4gIFJlbW92ZSBTaG9ydGZvcm1XIG1vZGlmaWVyCi0JdGVzdC4gIEFkZCB0ZXN0IGZvciBTaG9ydEZvcm0gaW4gVyBiYXNlX29wY29kZSBtb2RpZmljYXRpb24uCi0JTWVyZ2UgU2VnMlNob3J0Rm9ybSBhbmQgU2VnM1Nob3J0Rm9ybSBjb2RlLgotCSogY29uZmlnL3RjLWkzODYuaCAoU2hvcnRGb3JtVyk6IFJlbW92ZS4KLQkoSWdub3JlRGF0YVNpemUpOiBEZWZpbmUuCi0KLUZyaSBKdW4gIDUgMTA6NTA6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUpOiBTdG9yZSBwcmV2aW91cyBzZWdtZW50IHN0YXRlCi0Jd2l0aCBwcmV2aW91cyBpbnN0cnVjdGlvbi4KLQotV2VkIEp1bgkgMyAxODoyMTo1NiAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKFNDQUxFMV9XSEVOX05PX0lOREVYKTogRGVmaW5lLgotCShlYnAsIGVzcCk6IFJlbW92ZSBzdGF0aWMgdmFyaWFibGVzLgotCShNQVRDSCk6IFJlbW92ZSB0ZXN0IGZvciBJbk91dFBvcnRSZWcuCi0JKGkzODZfb3BlcmFuZCk6IFByb3Blcmx5IGhhbmRsZSBJbk91dFBvcnRSZWcgaGVyZSBpbnN0ZWFkLgotCURpc2FsbG93cyBgaW5iICglZHgsMiknLCBgaW5iICVlczooJWR4KScgYW5kIGBtb3YgKCVkeCksJWF4JwotCShtZF9hc3NlbWJsZSk6IFNpbXBsaWZ5IGFuZCBjb3JyZWN0IG1vZHJtIGFuZCBzaWIgZ2VuZXJhdGlvbi4KLQkoaTM4Nl9vcGVyYW5kKTogQWRkIHdhcm5pbmcgZm9yIHNjYWxlIHdpdGhvdXQgaW5kZXguCi0JUmV3cml0ZSBjaGVja3MgZm9yIHZhbGlkIGJhc2UvaW5kZXggY29tYmluYXRpb25zLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChFTkRfU1RSSU5HX0FORF9TQVZFKTogUHJvdGVjdCBhcmd1bWVudHMgb2YKLQltYWNyb3MgYW5kIGVuY2xvc2UgaW4gZG8gd2hpbGUoMCkuCi0JKFJFU1RPUkVfRU5EX1NUUklORyk6IExpa2V3aXNlLgotCShtZF9hc3NlbWJsZSk6IEFkZCBvbmUgdG8gcHJpbnRlZCBvcGVyYW5kIG51bWJlciBzbyB3ZSBzdGFydAotCWZyb20gMSBub3QgMC4gIEFkZCBzb21lIG1vcmUgZ2V0dGV4dCBpbnZvY2F0aW9ucy4KLQkoaTM4Nl9vcGVyYW5kKTogRml4IGAlJXMnIC0+IGAlJSVzJy4gSW5jIHByaW50ZWQgb3BlcmFuZAotCW51bWJlciBoZXJlIHRvby4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoV0FJVF9QUkVGSVgsIExPQ0tSRVBfUFJFRklYLCBBRERSX1BSRUZJWCwKLQlEQVRBX1BSRUZJWCwgU0VHX1BSRUZJWCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogUmVtb3ZlIHdhaXRfcHJlZml4IGZpZWxkLgotCShjaGVja19wcmVmaXgpOiBSZW1vdmUgZnVuY3Rpb24uCi0JKGFkZF9wcmVmaXgpOiBOZXcgZnVuY3Rpb24uICBBZGQgcHJlZml4IHRvIGkucHJlZml4IGFzIHdlbGwgYXMKLQlkb2luZyBjaGVja3MuCi0JKG1kX2Fzc2VtYmxlKTogQ2hhbmdlcyBmb3IgYWRkX3ByZWZpeC4JUmVtb3ZlIGhhY2sgZm9yIHdhaXQKLQlwcmVmaXgsIGluc3RlYWQgYWx3YXlzIG91dHB1dCBwcmVmaXhlcyBpbiBmaXhlZCBvcmRlci4JVGVzdAotCWZvciBqY3h6L2xvb3Agd2hlbiBzZWxlY3RpbmcgYmV0d2VlbiB3b3JkICYgZHdvcmQgb3BlcmF0aW9ucywKLQlhbmQgYWRkIGFkZHJlc3Mgc2l6ZSBwcmVmaXggcmF0aGVyIHRoYW4gb3BlcmFuZCBzaXplIHByZWZpeC4KLQlSZW1vdmUgb3BlcmFuZCAtPiBhZGRyZXNzIHNpemUgaGFjayB3aGVuIGVtaXR0aW5nIGpjeHovbG9vcC4KLQkoaTM4Nl9vcGVyYW5kKTogUmVtb3ZlIE9fQWJzZW50IGNoZWNrIGFzIGl0J3MgZG9uZSBpbiBleHByLgotCi1XZWQgSnVuICAzIDE1OjA5OjEwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbTUyMDAgYXMgYSBjcHVfdHlwZSBvZiBtNjhrLgotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGN1cnJlbnQgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEp1biAgMyAxNDoxMTo1OSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBBZGQgbW9yZSBjYWxscwotCXRvIHJlbGF4YWJsZV9zeW1ib2wgdG8gcHJldmVudCByZWZlcmVuY2VzIHRvIGV4dGVybmFsIHN5bWJvbCBmcm9tCi0JYmVpbmcgcmVsYXhlZC4KLQotV2VkIEp1biAgMyAxNDoxMDozNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHJlbGF4YWJsZV9zeW1ib2wpOiBJZiBUQVJHRVRfT1MgaXMgImVsZiIsIGFsbAotCXN5bWJvbHMgYXJlIHJlbGF4YWJsZS4KLQotV2VkIEp1biAgMyAwOToxNjowMCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvdGMtdjg1MC5jIChtZF9iZWdpbik6ICBEb24ndCBjcmVhdGUgc3BlY2lhbAotICAgICAgICBzZWN0aW9ucyBieSBkZWZhdWx0LgotIAotVHVlIEp1biAgMiAxNDo1Mjo1NiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRm9yIGRpdiBhbmQgdWRpdiwgY2xvc2UgdGhlCi0JcmVvcmRlciBibG9jayBhcyBzb29uIGFzIHBvc3NpYmxlLgotCi1UdWUgSnVuICAyIDE1OjM2OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gTWF0dCBTZW1lcnNreSA8bWF0dHNAc2NkLmhwLmNvbT46Ci0JKiBtYWNyby5jIChtYWNyb19tcmlfbW9kZSk6IE5ldyBmdW5jdGlvbi4KLQkqIG1hY3JvLmggKG1hY3JvX21yaV9tb2RlKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAoc19tcmkpOiBDYWxsIG1hY3JvX21yaV9tb2RlIHdoZW4gc3dpdGNoaW5nIGluIGFuZCBvdXQgb2YKLQlNUkkgbW9kZS4KLQotVHVlIEp1biAgMiAxMzozMjoyMiAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfY29tbSk6IEFsbG93IGFsaWdubWVudCBwYXJhbWV0ZXIgaW4KLQlPQkpfRVZBWCBjYXNlLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV9jb21tKTogRGVmZXIgcmVzdG9yaW5nIGNoYXJhY3RlcgotCXVudGlsIGFmdGVyIHhzdHJkdXAgaW4gT0JKX0VWQVggY2FzZS4KLQotVHVlIEp1biAgMiAxMzoxMToxMyAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL3RjLXZheC5jIChtZF9jcmVhdGVfc2hvcnRfanVtcCk6IEZpeCBvZmYgYnkgdHdvIGJ1ZyBpbgotCW9mZnNldCBjYWxjdWxhdGlvbi4gIEFsc28sIHVzZSBWQVhfQlJXIGZyb20gdmF4LWluc3QuaCBpbnN0ZWFkCi0Jb2YgaGFyZGNvZGVkIG1hZ2ljIG51bWJlci4KLQkobWRfY3JlYXRlX2xvbmdfanVtcCk6IFVzZSBWQVhfSk1QIGFuZCBWQVhfQUJTT0xVVEVfTU9ERSBtYWNyb3MuCi0KLVR1ZSBKdW4gIDIgMDk6MjU6MzQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChkb19zX2Z1bmMpOiBOZXcgZnVuY3Rpb24uCi0JKHNfZnVuYyk6IENhbGwgaXQuCi0JKiByZWFkLmggKGRvX3NfZnVuYyk6IEFkZCBwcm90b3R5cGUuCi0KLU1vbiBKdW4gIDEgMTI6NDc6MzAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9kb19hbGlnbik6IE9ubHkgZmlsbCBjb2RlIHNlY3Rpb25zIHdpdGgKLQlub3BzIGlmIGZpbGwgcGF0dGVybiBub3Qgc3BlY2lmaWVkLgotCi1Nb24gSnVuICAxIDE0OjA4OjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gQW5kcmV3IENyYWJ0cmVlIDxhbmRyZXdjQHR5cGhvb24ucm9zZS5ocC5jb20+OgotCSogY29uZmlnL3RlLWdvMzIuaCAoVEVfR08zMik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKExPQ0FMX0xBQkVMKTogRG9uJ3QgZGVmaW5lIGlmIFRFX0dPMzIuCi0KLVN1biBNYXkgMzEgMTU6NDM6MDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCUltcGxlbWVudCAuZnVuYy8uZW5kZnVuYyBwc2V1ZG8tb3BzLgotCSogcmVhZC5oIChzdGFic19nZW5lcmF0ZV9hc21fZnVuYyxzdGFic19nZW5lcmF0ZV9hc21fZW5kZnVuYyk6IERlY2xhcmUuCi0JKHNfZnVuYyk6IERlY2xhcmUuCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgLmZ1bmMsLmVuZGZ1bmMuCi0JKHNfZnVuYyk6IE5ldyBmdW5jdGlvbi4KLQkqIHN0YWJzLmMgKHN0YWJzX2dlbmVyYXRlX2FzbV9mdW5jLHN0YWJzX2dlbmVyYXRlX2FzbV9lbmRmdW5jKTogTmV3Ci0JZnVuY3Rpb25zLgotCShpbl9kb2NfZnVuY19wLGN1cnJlbnRfZnVuY3Rpb25fbGFiZWwpOiBOZXcgc3RhdGljIGdsb2JhbHMuCi0JKHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBFbWl0IGZ1bmN0aW9uIHJlbGF0aXZlIHN0YWJzIGlmIGluIC5mdW5jLgotCi1GcmkgTWF5IDI5IDE4OjEzOjEyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWEyOWsuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWFybS5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWg4MzAwLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaDg1MDAuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTg2MC5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWk5NjAuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy10aWMzMC5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXc2NS5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXo4ay5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWEyOWsuYzogRG9uJ3QgZGVmaW5lIG1kX3Nob3J0X2p1bXBfc2l6ZSwKLSAJbWRfbG9uZ19qdW1wX3NpemUsIG1kX2NyZWF0ZV9zaG9ydF9qdW1wIG9yIG1kX2NyZWF0ZV9sb25nX2p1bXAuCi0JKiBjb25maWcvdGMtYWxwaGEuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtYWxwaGEuaDogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtYXJtLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWg4MzAwLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWg4NTAwLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWhwcGEuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTg2MC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXBwYy5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zaC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy10aWMzMC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy13NjUuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtejhrLmM6IExpa2V3aXNlLgotCi1GcmkgTWF5IDI5IDE2OjAzOjI2IDE5OTggIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvdGMtdmF4LmMgKF8pOiBEZWxldGUgdGhpcyBtYWNybyB1c2VkIGZvciBwbGFjZWhvbGRlcgotCXZhbHVlcyBpbiB2YXhfb3BlcmFuZF93aWR0aF9zaXplOyBpdCBjb25mbGljdHMgd2l0aCB0aGUgXygpIG1hY3JvCi0JdXNlZCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0KLUZyaSBNYXkgMjkgMTM6NDY6MDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9maW5kX2Jhc2UpOiBGaXggY2FzZSBpbnNlbnNpdGl2ZSBzeW1ib2wgbmFtZQotCWNvZGUuICBGcm9tIENocmlzIE1vbGxlciA8bW9sbGVyQGJvcHMuY29tPi4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gS2xhdXMgS2FlbXBmIDxra2FlbXBmQHByb2dpcy5kZT46Ci0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IGJyb2tlbl93b3JkKTogQWRkIHNlZyBhbmQgc3Vic2VnIGZpZWxkcy4KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogSW5pdGlhbGl6ZSBzZWcgYW5kIHN1YnNlZyBmaWVsZHMgb2YgYSBuZXcKLQlicm9rZW4gd29yZC4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogU3dpdGNoIHRvIHRoZSBhcHByb3ByaWF0ZSBzZWdtZW50Ci0JYW5kIHN1YnNlZ21lbnQgd2hlbiBwcm9jZXNzaW5nIGEgYnJva2VuIHdvcmQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1yaV9hc3NlbWJsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQpOiBDYWxsIG1yaV9hc3NlbWJsZSByYXRoZXIgdGhhbgotCW1kX2Fzc2VtYmxlLgotCShzX21yaV9lbHNlLCBzX21yaV9icmVhaywgc19tcmlfbmV4dCwgc19tcmlfZm9yKTogTGlrZXdpc2UuCi0JKHNfbXJpX2VuZGYsIHNfbXJpX2VuZHcpOiBMaWtld2lzZS4KLQotV2VkIE1heSAyNyAxMToxNjoyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19vcmcpOiBDYWxsIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IGlmIGl0IGlzIGRlZmluZWQuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zaG93X3VzYWdlKTogQWRkIFxuXCB0byBuZXcgc3RyaW5nLgotCi1UdWUgTWF5IDI2IDE5OjI3OjUyIDE5OTggIFN0YW4gQ294ICA8c2NveEBlcXVpbm94LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChPUFRJT05fTElUVExFX0VORElBTl9EQVRBKTogTmV3LgotCShtZF9wYXJzZV9vcHRpb24pOiBBZGQgZm9yIHNhbWUuCi0JKHNwYXJjX21kX2VuZCk6IFNldCBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUuCi0JKG1kX2FwcGx5X2ZpeDMsIHRjX2dlbl9yZWxvYyk6IEFsbG93IEJGRF9SRUxPQ19TUEFSQ18zMkxFLgotCShjb25zX2ZpeF9uZXdfc3BhcmMpOiBBZGRlZCB0byBjcmVhdGUgQkZEX1JFTE9DX1NQQVJDXzMyTEUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChjb25zX2ZpeF9uZXdfc3BhcmMpOiBBZGRlZC4KLQkKLVRodSBNYXkgMjEgMTU6MDI6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChmaW5kX3JlYWxfc3RhcnQpOiBSZWxheCBkZWZpbml0aW9uIG9mIGxvY2FsCi0JbGFiZWxzLgotCi1UdWUgTWF5IDE5IDE2OjU5OjQ0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGQzMHZfYWxpZ24pOiBBcHBseSBhZGRyZXNzIGFkanVzdG1lbnQgdG8gYWxsCi0Jc3ltYm9scyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcywgbm90IGp1c3QgdGhlIGxhc3Qgb25lIHNwZWNpZmllZC4KLQotVHVlIE1heSAxOSAwODoyNToxOSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2hhbmRsZV9hbGlnbik6IFVzZSBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuCi0gICAgICAgIG9yIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gdG8gd3JpdGUgZGF0YS4KLQotTW9uIE1heSAxOCAxNzowOTozMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IFJlbW92ZSBhcnRpZmljaWFsbHkgY3JlYXRlZAotCXJlZ2lzdGVyIG5hbWUgc3ltYm9scy4KLQotTW9uIE1heSAxOCAxMzo0NzowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogQ2hhbmdlICJzZWdtZW50IiB0byAic2VjdGlvbiIgaW4KLQllcnJvciBtZXNzYWdlLgotCi1Nb24gTWF5IDE4IDE2OjU1OjQwIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogQ2hhbmdlIHN5bTEtc3ltMiBtZXNzYWdlIGFnYWluLgotCi1Nb24gTWF5IDE4IDA5OjMxOjQzIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogSW1wcm92ZSBlcnJvciBtZXNzYWdlIGZvciBzeW0xLXN5bTIKLQllcnJvcnMgd2hlbiBzeW0xIGlzIGluIGEgZGlmZmVyZW50IHNlZ21lbnQgZnJvbSBzeW0yLgotCi1XZWQgTWF5IDEzIDEwOjE2OjM3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKHdhcm5fdW5tYXRjaGVkX2hpZ2gpOiBOZXcgc3RhdGljIGxvY2FsLgotCShPUFRJT05fV0FSTl9QQVJBTExFTCk6IFJlbmFtZSBmcm9tIE9QVElPTl9XQVJOLgotCShPUFRJT05fTk9fV0FSTl9QQVJBTExFTCk6IFJlbmFtZSBmcm9tIE9QVElPTl9OT19XQVJOLgotCShtZF9sb25nb3B0cyk6IFJlY29nbml6ZSAtLXtuby0sfXdhcm4tdW5tYXRjaGVkLWhpZ2guCi0JKG1kX3BhcnNlX29wdGlvbik6IExpa2V3aXNlLgotCShtZF9zaG93X3VzYWdlKTogTGlrZXdpc2UuCi0JKG0zMnJfZnJvYl9maWxlKTogTGlrZXdpc2UuCi0KLQkqIHJlYWQuYyAoZ2VuZXJhdGVfZmlsZV9kZWJ1ZyxnZW5lcmF0ZV9saW5lbm9fZGVidWcpOiBOZXcgZnVuY3Rpb25zLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBDYWxsIHRoZW0uCi0JKiByZWFkLmggKHN0YWJzX2dlbmVyYXRlX2FzbV9maWxlKTogRGVjbGFyZS4KLQkqIHN0YWJzLmMgKHN0YWJzX2dlbmVyYXRlX2FzbV9maWxlKTogTmV3IGZ1bmN0aW9uLgotCShnZW5lcmF0ZV9hc21fZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkoc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IE1vdmUgZmlsZSBuYW1lIGhhbmRsaW5nIGludG8KLQlnZW5lcmF0ZV9hc21fZmlsZS4KLQotVHVlIE1heSAxMiAxMjowMzo0NCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChjdXJfbXVsMzJfcCwgcHJldl9tdWwzMl9wKTogTWFrZSBzdGF0aWMuCi0gICAgICAgIChkMzB2X2N1cnJlbnRfYWxpZ24sIGQzMHZfY3VycmVudF9hbGlnbl9zZWcpOiBOZXcgdmFyaWFibGVzLgotICAgICAgICAoZDMwdl9sYXN0X2xhYmVsKTogTmV3IHZhcmlhYmxlLgotICAgICAgICAoZDMwdl9hbGlnbiwgc19kMzB2X2FsaWduLCBzX2QzMHZfdGV4dCk6IE5ldyBmdW5jdGlvbnMuCi0gICAgICAgIChzX2QzMHZfZGF0YSwgc19kMzB2X3NlY3Rpb24pOiBMaWtld2lzZS4KLSAgICAgICAgKG1kX3BzZXVkb190YWJsZSk6IENhbGwgdGhlbS4KLSAgICAgICAgKG1kX2JlZ2luKTogSW5pdGlhbGl6ZSBkMzB2X2N1cnJlbnRfYWxpZ25fc2VnLgotICAgICAgICAobWRfYXNzZW1ibGUpOiBDYWxsIGQzMHZfYWxpZ24gd2hlbiBuZWVkZWQgYnkga25vd24gY3VycmVudCBhbGlnbm1lbnQuCi0gICAgICAgIChkMzB2X2Zyb2JfbGFiZWwsIGQzMHZfY29uc19hbGlnbik6IE5ldyBmdW5jdGlvbnMuCi0gICAgICAgICogY29uZmlnL3RjLWQzMHYuaCAobWRfZG9fYWxpZ24pOiBSZW1vdmUuCi0gICAgICAgICh0Y19mcm9iX2xhYmVsKTogQ2FsbCBkMzB2X2Zyb2JfbGFiZWwuCi0gICAgICAgIChtZF9jb25zX2FsaWduKTogTmV3LgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChmaW5kX2Zvcm1hdCk6IENvbnZlcnQgY29tcGxleCBleHByZXNzaW9ucyB0byAKLQlleHByZXNzaW9uIHN5bWJvbHMgYmVmb3JlIHByb2Nlc3NpbmcuICBDbGVhbiB1cCBjb2RlIGZvcm1hdHRpbmcuCi0KLVN1biBNYXkgMTAgMjI6MzU6MDIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBwby9NYWtlLWluIChpbnN0YWxsLWluZm8pOiBOZXcgdGFyZ2V0LgotCi1UaHUgTWF5ICA3IDE1OjQ5OjA3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgImJyYSIganVzdCBsaWtlICJqbXAiCi0JaW5zdHJ1Y3Rpb25zLgotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQotVGh1IE1heSAgNyAxMTo0NzoyMiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogVXBkYXRlIHdpdGggYG1ha2UgZGVwLWFtJy4KLQkoSEZJTEVTKTogQWRkIGNnZW4uaC4KLQkoY2dlbi5vKTogRGVwZW5kIG9uIGNnZW4uaC4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi0JKiBjZ2VuLmMgKGNnZW5fbWRfYXBwbHlfZml4Myk6IERvbid0IHBhc3MgbmV3bGluZSB0byBhc193YXJuX3doZXJlLgotCi1UaHUgTWF5ICA3IDEzOjIwOjU2IDE5OTggIEFuZGVycyBCbG9tZGVsbCAgPGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZT4KLQotCSogZ2FzcC5jIChncmFiX2xhYmVsKTogUGVybWl0IGEgbGFiZWwgdG8gYmUgYSBwcmVwcm9jZXNzb3IKLQl2YXJpYWJsZSBieSBwZXJtaXR0aW5nIGEgbGFiZWwgdG8gc3RhcnQgd2l0aCBhIGJhY2tzbGFzaC4KLQotVGh1IE1heSAgNyAxMjo1MDozMyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jICh2YWxpZGF0ZV9taXBzX2luc24pOiBSZW1vdmVkIGhhY2sKLQlmb3IgcHJldmlvdXNseSBpbmFjY2Vzc2libGUgYml0ZmllbGRzIGluIHNvbWUgSU5TTl9UUkFQCi0JaW5zdHJ1Y3Rpb25zLgotCi1UaHUgTWF5ICA3IDExOjEzOjAwIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogQWJvcnQgd2l0aCBlcnJvciBtZXNzYWdlCi0JaWYgb3Bjb2RlIG9wZXJhbmRzIGRvIG5vdCBtYXRjaC4KLQkKLVRodSBNYXkgIDcgMDk6MzY6MDYgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQsIHZhbGlkYXRlX21pcHNfaW5zbik6IEltcGxlbWVudAotCSdxJyBvcGVyYW5kIGZvcm1hdCBmb3IgMjAtYml0ICJicmVhayIvInNkYmJwIiBpbnN0cnVjdGlvbnMuCi0JKG1pcHNfaXApOiBUcnVuY2F0ZSBvdmVyZmxvd2VkICJicmVhayIgJ2MnIG9wZXJhbmQuICBJbXBsZW1lbnQKLQlzaW1pbGFyIG5ldyAncScgb3BlcmFuZC4KLQotVGh1IE1heSAgNyAwNzo0NzoxNCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChjZ2VuX2FzbV9maW5pc2hfaW5zbik6IEZpeCB0eXBvLgotCi1UaHUgTWF5ICA3IDAyOjE5OjE0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmg6IE5ldyBmaWxlLgotCSogY2dlbi5jOiBJbmNsdWRlIGl0LgotCShNQVhfRklYVVBTKTogUmVuYW1lZCB0byBDR0VOX01BWF9GSVhVUFMuCi0JKGNnZW5fYXNtX2ZpbmlzaF9pbnNuKTogUmVzdWx0IGlzIG5vdyB2b2lkLiAgTmV3IGFyZyBgcmVzdWx0Jy4KLQlBbGwgY2FsbGVycyB1cGRhdGVkLgotCSogY29uZmlnL3RjLW0zMnIuYzogSW5jbHVkZSBjZ2VuLmguCi0JKG0yM3JfaW5zbik6IE5ldyBtZW1iZXJzIG51bV9maXh1cHMsZml4dXBzLgotCi1XZWQgTWF5ICA2IDE2OjI5OjE5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogU2xpZ2h0bHkgcmV3b3JrIHNvbWUgY29kZQotCXRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuCi0KLVdlZCBNYXkgIDYgMTU6MjY6MzQgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogUnVuIGRlYyBjIHdpdGggL25vZGVidWcuICBQYXNzIENDIHZhbHVlIHdoZW4KLQljYWxsaW5nIG1ha2UuCi0KLSAgICAgICAgKiBtYWtlZmlsZS52bXMgKE9CSlMpOiBBZGQgZWhvcHQub2JqCi0KLVdlZCBNYXkgIDYgMTU6MTE6MTIgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGRvYy9jLXZheC50ZXhpOiBDb3JyZWN0IGFuZCBleHRlbmQgdmF4L3ZtcyBkb2N1bWVudGF0aW9uLgotCi1XZWQgTWF5ICA2IDExOjUxOjUxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogQWNjZXB0IGEgbmV3IHBhcmFtZXRlciByZXF1ZXN0aW5nCi0JYSBzaG9ydCBmb3JtYXQgaW5zbi4KLQkobWRfYXNzZW1ibGUpOiBTZXQgaXQgZm9yIGV4cGxpY2l0bHkgcGFja2VkIGluc25zLgotCQotVHVlIE1heSAgNSAxMzoyMzoxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zeW1ib2xfbWVyZ2UpOiBEbyBub3QgdGFrZSBhZGRyZXNzIG9mCi0JbmF0aXZlIGZpZWxkcyB3aGVuIHBlcmZvcm1pbmcgdGhlIG1lbWNweS4KLQotVHVlIE1heSAgNSAxMzoxMDo0MSAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8sbWFjcm8yKTogSW1wbGVtZW50IAotCU1fRE1VTE9fSSwgTV9NVUxPX0ksIE1fRE1VTE9VX0ksIGFuZCBNX01VTE9VX0kuCi0KLU1vbiBNYXkgIDQgMTc6NDk6MTQgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IENoYW5nZWQgdG8ga2VlcAotCXJlbG9jYXRpb25zIGFnYWluc3QgZ2xvYmFsbHkgdmlzaWJsZSBzeW1ib2xzLgotCSogY29uZmlnL3RjLW02OGsuYyAocmVsYXhhYmxlX3N5bWJvbCk6IE5ldyBtYWNyby4KLQkobTY4a19pcCwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBVc2UgaXQuCi0JKHRjX202OGtfZml4X2FkanVzdGFibGUpOiBBbHNvIGhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0KLU1vbiBNYXkgIDQgMTY6MTI6MjMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBLZWVwIHJlbG9jcyBmb3IgYWxsCi0JcmVmZXJlbmNlcyB0byBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBXaGVuIE9CSl9FTEYsIGRvbid0IGFkZCB0aGUKLSAJdmFsdWVzIGluIHR3aWNlIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGlmIHRoZSBzeW1ib2wgaXMKLSAJZXh0ZXJuYWxseSBkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpIFtPQkpfQU9VVF06IFdoZW4gUElDLAotCWRvbid0IGFkanVzdCBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYW4gZXh0ZXJuYWxseSB2aXNpYmxlCi0Jc3ltYm9sLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeDMpOiBXaGVuIGdlbmVyYXRpbmcgYS5vdXQgUElDLAotCWZvciBhIFBDIHJlbGF0aXZlIGZpeHVwIGFnYWluc3QgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIGRlZmluZWQKLQlzeW1ib2wsIGFycmFuZ2UgdG8gc3RvcmUgb2JqZWN0IGZpbGUgYW5kIGFkZGVuZCB2YWx1ZXMgYXMgdGhvdWdoCi0JdGhlIHN5bWJvbCB3ZXJlIG5vdCBkZWZpbmVkLgotCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQotVGh1IEFwciAzMCAxMzowOTozOSAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KLQotCSogcmVhZC5jIChzaXplb2ZfbGViMTI4KTogUmVmZXJlbmNlZCBleHRlcm5hbGx5IGJ5IHdyaXRlLmMgc28KLQlkb24ndCBpbmxpbmUuCi0KLVdlZCBBcHIgMjkgMTU6NDU6NTcgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKHssZXhwYW5kX31kZWJ1Z19zeW0pOiBOZXcgZnVuY3Rpb25zIHRvIHJlY29yZAotCWFuZCBleHBhbmQgYSAnZGVidWcnIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhlIG5leHQgaW5zdHJ1Y3Rpb24KLQl0aGF0IGRvZXMgbm90IGNhdXNlIGEgc2hvcnQgaW5zdHJ1Y3Rpb24gdG8gYmUgZmlsbGVkIHdpdGggYSBOT1AuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBzdXBwb3J0IGZvciAuZGVidWdzeW0uCi0JKGFzc2VtYmxlX3BhcmFsbGVsX2luc24pOiBBZGQgY2FsbHMgdG8gZXhwYW5kX2RlYnVnX3N5bSBhcwotCWFwcHJvcHJpYXRlLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCi1UdWUgQXByIDI4IDE5OjE2OjI2IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYXMuYyAobWFpbik6IENvbmRpdGlvbmFsbHkgY2FsbCBzZXRsb2NhbGUuCi0JKiBnYXNwLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGFzaW50bC5oOiBJbmNsdWRlIDxsb2NhbGUuaD4gaWYgSEFWRV9MT0NBTEVfSC4KLQkoTENfTUVTU0FHRVMpOiBOb3cgY2FuIGJlIGRlZmluZWQgZXZlbiB3aGVuIEVOQUJMRV9OTFMuCi0KLVR1ZSBBcHIgMjggMTg6MzM6MjMgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfc2hvd191c2FnZSk6IENvcnJlY3QgZ2V0dGV4dCB0eXBvLgotCQotVHVlIEFwciAyOCAxMjoxNjozMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IENoYW5nZSBhbGwgY2FsbHMgdG8gYnplcm8gdG8gdXNlIG1lbXNldC4KLQkocGFfaXApOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCSh0Y19nZW5fcmVsb2MsIG1kX2FwcGx5X2ZpeCk6IExpa2V3aXNlLgotCShwYV9maW5kX3NwYWNlX2J5X251bWJlcik6IExpa2V3aXNlLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkocGFfYmxvY2spOiBDaGFuZ2UgaSB0byB1bnNpZ25lZCBpbnQuCi0JKiBjb25maWcvb2JqLXNvbS5oIChvYmpfc29tX2NvcHlyaWdodCk6IERlY2xhcmUuCi0KLVR1ZSBBcHIgMjggMTE6MzU6NTYgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfbGluZW5vKTogRG8gbm90IHVzZSBkdW1teSBmaXJzdF9saW5lbm8KLQlmb3IgbGluZSBudW1iZXJzIGZvciBhc3NlbWJseSBzb3VyY2UuCi0KLU1vbiBBcHIgMjcgMTU6NTg6NDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSB2ZXJzaW9uIG51bWJlciB0byAyLjkuNAotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gQXByIDI3IDEyOjA3OjMzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fYXNtX2ZpbmlzaF9pbnNuKTogTmV3IGFyZyByZWxheF9wLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQotTW9uIEFwciAyNyAxNToxNjoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmg6IENoYW5nZSBzeW1ib2xTIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHRvIHN0cnVjdAotCXN5bWJvbC4KLQotU3VuIEFwciAyNiAxMzo0NDoyMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChwYXJzZV9yZWcpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IEZpeCBpMThuIHR5cG8uCi0KLVNhdCBBcHIgMjUgMjA6MTI6MDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfZ2V0X2N1cl9wcm9jX3N5bSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVjb2ZmLmg6IFByb3RveXBlIGl0LgotCSogY29uZmlnL3RjLWFscGhhLmMgW0VMRl0gKHNfYWxwaGFfcHJvbG9ndWUpOiBOZXcgZnVuY3Rpb24uCi0JW0VWQVhdIChzX2FscGhhX3Byb2xvZ3VlKTogRGVsZXRlLgotCShtZF9wc2V1ZG9fdGFibGUpOiBVcGRhdGUuCi0KLVNhdCBBcHIgMjUgMTQ6MDA6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZF9hc3NlbWJsZSk6IENoYW5nZSBicF9lcnJvcl9tc2cgZnJvbSBzdGF0aWMKLQlhcnJheSB0byBsb2NhbCBwb2ludGVyLgotCShnZXRfYXJncywgcGFyc2VfZXhwcik6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQotRnJpIEFwciAyNCAxMjo0Nzo0MiAxOTk4ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KLQotCSogcmVhZC5jIChzX3NldCk6IENhc3QgeG1hbGxvYyByZXR1cm4gdmFsdWUgdG8gZnJhZ1MgKi4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBGdW5jdGlvbiBtYWRlIHN0YXRpYyB0byBtYXRjaAotCXByZXZpb3VzIGZvcndhcmQgZGVjbGFyYXRpb24uCi0JKGluc2VydF9yZWcsIGluaXRfcmVndGFibGUsIG1kX2NvbnZlcnRfZnJhZ18xKTogTGlrZXdpc2UuCi0KLUZyaSBBcHIgMjQgMDk6MjY6NDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogQWRkIGludGVybmF0aW9uYWxpc2F0aW9uIG1hY3JvcyB0byBlcnJvcgotCXN0cmluZ3MuICAKLQotCSogY29uZmlnL3RjLW0zMnIuYyAoY2FuX21ha2VfcGFyYWxsZWwpOiBBZGQgaW50ZXJuYXRpb25hbGlzYXRpb24KLQltYWNyb3MgdG8gZXJyb3Igc3RyaW5ncy4KLQotVGh1IEFwciAyMyAxOToyMzoyMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZpeF9hZGp1c3RhYmxlKTogQ29ycmVjdCB0ZXN0IG9mIHdoZXRoZXIgYQotCXJlbG9jIGlzIGluIHRoZSBUT0MgY3NlY3QuCi0JKG1kX2FwcGx5X2ZpeDMpOiBDb3JyZWN0IGdldHRleHQgdHlwby4KLQotVGh1IEFwciAyMyAxNDo1ODozMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGZpbmRfcmVhbF9zdGFydCk6IElnbm9yZSBzeW1ib2xzIHN0YXJ0aW5nIHdpdGgKLQkuTCAtIHRoZXkgYXJlIGxvY2FsIGxhYmVscyBhbmQgdGhlIGJyYW5jaGVzIGFyZSBub3QgcmVhbGx5Ci0JZnVuY3Rpb24gY2FsbHMgYnV0IHJhdGhlciBmYXIganVtcHMuCi0KLVdlZCBBcHIgMjIgMTU6NTc6MjEgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChNS0lOU1RBTExESVJTKTogRG9uJ3QgbG9vayBpbiAkKHRvcF9zcmNkaXIpLgotCi1XZWQgQXByIDIyIDE0OjUyOjM2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBQcmludCBvcGVyYW5kIG51bWJlciByYXRoZXIgdGhhbgotCXVzaW5nIG9yZGluYWxfbmFtZXMuCi0JKGkzODZfb3BlcmFuZCk6IExpa2V3aXNlLgotCi1UdWUgQXByIDIxIDIyOjM0OjI1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChJTlRMTElCUyk6IERlZmluZSB0byB3b3JrIGFyb3VuZCBhcHBhcmVudCBhdXRvbWFrZQotCWJ1Zy4KLQlBbGwgTWFrZWZpbGVzOiBSZWdlbmVyYXRlZC4KLQotCSogTWFueSBmaWxlczogQWRkZWQgZ2V0dGV4dCBpbnZvY2F0aW9ucyBhcm91bmQgdXNlci12aXNpYmxlCi0Jc3RyaW5ncy4KLQkqIGFjY29uZmlnLmggKEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRURVhULCBIQVZFX1NUUENQWSwKLQlIQVZFX0xDX01FU1NBR0VTKTogRGVmaW5lLgotCSogZGVwLWluLnNlZDogQWRkZWQgYXNpbnRsLmguCi0JKiBwby9NYWtlLWluOiBOZXcgZmlsZS4KLQkqIGdhc3AuYyAobWFpbik6IENhbGwgc2V0bG9jYWxlLCBiaW5kdGV4dGRvbWFpbiwgYW5kIHRleHRkb21haW4uCi0JSW5jbHVkZSAiYXNpbnRsLmgiLgotCSogcmVhZC5jIChaXyk6IFJlbmFtZWQgZnJvbSBgXycuCi0JKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IEFkZGVkIHBvLgotCShQT1RGSUxFUyk6IG5ldyBtYWNyby4KLQkocG8vUE9URklMRVMuaW4pOiBOZXcgdGFyZ2V0LgotCSgkKE9CSlMpKTogQWRkZWQgYXNpbnRsLmguCi0JKEhGSUxFUyk6IExpa2V3aXNlLgotCShJTkNMVURFUyk6IEFkZGVkIC1ETE9DQUxFRElSLCAtSSQodG9wX3NyY2RpcikvLi4vaW50bC4KLQkoYXNfbmV3X0xEQUREKTogQWRkZWQgJChJTlRMTElCUykuCi0JKGFzX25ld19ERVBFTkRFTkNJRVMpOiBBZGRlZCAkKElOVExERVBTKS4KLQkoZ2FzcF9uZXdfTERBREQpOiBBZGRlZCAkKElOVExMSUJTKS4KLQkoZ2FzcF9uZXdfREVQRU5ERU5DSUVTKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWx0LgotCSogY29uZmlndXJlLmluOiBDYWxsIENZX0dOVV9HRVRURVhULiAgR2VuZXJhdGUgcG8vTWFrZWZpbGUuaW4gYW5kCi0JcG8vTWFrZWZpbGUuCi0JKEFMTF9MSU5HVUFTKTogRGVmaW5lLgotCSogbWFjcm8uYzogSW5jbHVkZSAiYXNpbnRsLmgiLgotCSogYXMuYyAobWFpbik6IENhbGwgc2V0bG9jYWxlLCBiaW5kdGV4dGRvbWFpbiwgYW5kIHRleHRkb21haW4uCi0JKiBhcy5oOiBJbmNsdWRlICJhc2ludGwuaCIuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChvcmRpbmFsX25hbWVzKTogUmVtb3ZlZC4KLQkobWRfYXNzZW1ibGUpOiBDaGFuZ2VkIGVycm9yIHRleHQgdG8gYXZvaWQgb3JkaW5hbF9uYW1lcy4KLQkoaTM4Nl9vcGVyYW5kKTogTGlrZXdpc2UuCi0JKHJlbG9jKTogQWRkZWQgYXNfYmFkIHRvIGF2b2lkIGkxOG4gcHJvYmxlbXMuCi0JKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWFybS5jIChiYWRfYXJncyk6IE5vdyBhICNkZWZpbmUuCi0JKGJhZF9wYyk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3N0YWJfcGFyc2UpOiBDaGFuZ2VkIHR5cGUgb2YKLQlgbG9uZ19jb25zdF9tc2cnLgotCShnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSk6IFVuaWZpZWQgc3RyaW5ncyB0byBhdm9pZCBpMThuCi0JcHJvYmxlbXMuCi0JKiBjb25maWcvdGMtbTY4ay5jIChnZXRfcmVsb2NfY29kZSk6IEFkZGVkIHNvbWUgYXNfYmFkIGNhbGxzIHRvCi0JYXZvaWQgaTE4biBwcm9ibGVtcy4KLQkqIGNvbmZpZy90Yy1uczMyay5jIChyZWxvYyk6IEFkZGVkIGFzX2JhZCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogQWRkZWQgYXNfYmFkX3doZXJlIHRvIGF2b2lkCi0JaTE4biBwcm9ibGVtcy4KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBBZGRlZCBhc19iYWQgdG8gYXZvaWQgaTE4bgotCXByb2JsZW1zLgotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDaGFuZ2VkIEMrKyBjb21tZW50IGludG8gQwotCWNvbW1lbnQuCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2Fzc2VtYmxlKTogQWRkZWQgYXNfd2FybiB0byBhdm9pZCBpMThuCi0JcHJvYmxlbXMuCi0JKiBhcy5jIChwcmludF92ZXJzaW9uX2lkKTogQWRkZWQgYW4gZnByaW50ZiB0byBhdm9pZCBpMThuCi0JcHJvYmxlbXMuCi0JKiBjb25kLmMgKGNvbmRfZmluaXNoX2NoZWNrKTogQWRkZWQgYXNfYmFkIGNhbGwgdG8gYXZvaWQgaTE4bgotCXByb2JsZW1zLgotCSogZXhwci5jIChleHByKTogQWRkZWQgYXNfd2FybiBjYWxsIHRvIGF2b2lkIGkxOG4gcHJvYmxlbXMuCi0JKiBtZXNzYWdlcy5jIChhc19hc3NlcnQpOiBDaGFuZ2VkIGNvZGUgdG8gYXZvaWQgaTE4biBwcm9ibGVtcy4KLQkoYXNfYWJvcnQpOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAocHNldWRvX3NldCk6IEFkZGVkIGFzX2JhZCBjYWxsIHRvIGF2b2lkIGkxOG4gcHJvYmxlbXMuCi0JKHNfc3BhY2UpOiBMaWtld2lzZS4KLQkqIHBvL01ha2UtaW4sIHBvL1BPVEZJTEVTLmluLCBwby9nYXMucG90OiBOZXcgZmlsZXMuCi0KLVR1ZSBBcHIgMjEgMTc6MDE6MjIgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChjaGVja19wcmVmaXgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBzcGxpdCBvdXQKLQlmcm9tIG1kX2Fzc2VtYmxlLgotCShzdHJ1Y3QgX2kzODZfaW5zbik6IEFkZCB3YWl0X3ByZWZpeCBmaWVsZC4KLQkobWRfYXNzZW1ibGUpOiBSZW1vdmUgd2FpdF9wcmVmaXggbG9jYWwgdmFyaWFibGUuICBVc2UKLQljaGVja19wcmVmaXggd2hlbiBhZGRpbmcgYSBwcmVmaXguCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGN1cnJlbnRfdGVtcGxhdGVzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYXNzZW1ibGUpOiBSZW1vdmUgY3VycmVudF90ZW1wbGF0ZXMgbG9jYWwgdmFyaWFibGUuCi0JKG1kX2Fzc2VtYmxlLCBpMzg2X29wZXJhbmQpOiBJbXByb3ZlIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIGluCi0JbWFueSBwbGFjZXMuICBBZGQgUkVTVE9SRV9FTkRfU1RSSU5HIGluIG1hbnkgcGxhY2VzIGJlZm9yZSBlcnJvcgotCXJldHVybi4gIENsYXJpZnkgc29tZSBjb21tZW50cy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoc3RydWN0IF9pMzg2X2luc24pOiBDaGFuZ2Ugc2VnIGZpZWxkIHRvIGEgdHdvCi0JZWxlbWVudCBhcnJheS4KLQkobWRfYXNzZW1ibGUpOiBQYXJzZSBzdHJpbmcgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMsIGxvb2tpbmcgZm9yCi0Jc2VnbWVudCBvdmVycmlkZSBwcmVmaXhlcy4gIENoZWNrIGZvciBpbnZhbGlkIHNlZ21lbnQgcHJlZml4ZXMgb24KLQlzdHJpbmcgaW5zdHJ1Y3Rpb24uCi0JKGkzODZfb3BlcmFuZCk6IGkuc2VnW10gYW5kIG1heCBtZW1fb3BlcmFuZCBjaGFuZ2VzIGZvciBzdHJpbmcKLQlpbnNucy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKEVzU2VnKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChyZWdLbHVkZ2UpOiBEZWZpbmUuCi0JKGljbHJLbHVkZ2UsIGltdWxLbHVkZ2UpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IE1lcmdlIGltdWxLbHVkZ2UgYW5kIGljbHJLbHVkZ2UKLQljb2RlLiAgTW92ZSBSZXZlcnNlUmVnUmVnbWVtIGZ1ZGdlcyBpbnRvIE1vZHJtIGNhc2UuICBSZW9yZGVyCi0Jb3Bjb2RlX21vZGlmaWVyIGNoZWNrcyB0byBsb29rIGZvciBtb3JlIGNvbW1vbiBjYXNlcyBmaXJzdC4gIEFkZAotCWRlZmF1bHRfc2VnIGZvciBJc1N0cmluZyBjYXNlLgotCi1UdWUgQXByIDIxIDE2OjE4OjEyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFNX1BST0dfTEVYIHJhdGhlciB0aGFuIEFDX1BST0dfTEVYIGFuZAotCUFDX0RFQ0xfWVlURVhULgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbmV3IGF1dG9tYWtlIGFuZCBsaWJ0b29sLgotCSogYWNsb2NhbC5tNCwgTWFrZWZpbGUuaW46IExpa2V3aXNlLgotCi0JKiBkb2MvTWFrZWZpbGUuYW0gKGFzLmR2aSk6IE5ldyB0YXJnZXQuCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVNhdCBBcHIgMTggMDE6MjE6MDQgMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgc3BhcmM4Nnggc3VwcG9ydC4KLQkKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkKLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChsb29rdXBfYXJjaCk6IEFkZGVkIGFyY2hfdHlwZSB0byBzdHJ1Y3QKLQlzcGFyY19hcmNoLgotCShtZF9wYXJzZV9vcHRpb24pOiBXYXJuIGlmIC1FTCBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFNQQVJDX0JJRU5ESUFOKSBBbHdheXMgZGVmaW5lLgotCQotU2F0IEFwciAxOCAwMToxOTowMSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogTm90ZSB3aGVuIHdlIHVzZSBnZXQgbWF0Y2ggb24KLSAgICAgICAgdGhlIGZ1bGwgaW5zdHJ1Y3Rpb24gbmFtZS4KLQotV2VkIEFwciAxNSAxNToxNzoyNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKSBbT19zeW1ib2xdOiBBbHNvIHN0b3JlIHRoZSBzeW1ib2wKLQliYWNrIGludG8gdGhlIGV4cHJlc3Npb24gdG8gaGFuZGxlIGFkZC9zdWIgc2ltcGxpZmljYXRpb24gY29ycmVjdGx5LgotCi1XZWQgQXByIDE1IDA3OjA2OjA0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAoaGlsb19pbnRlcmxvY2tzKTogUmVtb3ZlIDQzMDAuCi0KLU1vbiBBcHIgMTMgMTY6NTE6MDQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChkb19tc3IpOiBTdXBwb3J0IHVuZG9jdW1lbnRlZCAnbXNyIGNwc3JfZmxnLAotCSM8bj4nIGluc3RydWN0aW9uLgotCi1UaHUgQXByICA5IDEwOjI5OjQyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAobWF4X2luZGVudF9sZXZlbCk6IE5ldyBnbG9iYWwuCi0JKHByaW50X3N5bWJvbF92YWx1ZV8xKTogVXNlIGl0LgotCSogZXhwci5oIChleHByX2J1aWxkX2RvdCk6IERlY2xhcmUuCi0JKiBleHByLmMgKGV4cHJfYnVpbGRfZG90KTogTmV3IGZ1bmN0aW9uLgotCi1XZWQgQXByICA4IDE2OjE2OjExIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocHJpbnRfYmluYXJ5KTogTmV3IGZ1bmN0aW9uLgotCShwcmludF9leHByXzEpOiBDYWxsIGl0LgotCi1Nb24gQXByICA2IDEyOjA2OjM5IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwLCBjYXNlICIjQiIpOiBJbnN0YWxsIHRoZSBvZmZzZXQgb2YgdGhlCi0Jb3BlcmFuZCBpbiB0aGUgb3Bjb2RlLgotCi1GcmkgQXByICAzIDExOjU4OjE5IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaDogUmVvcmRlciBvcGVyYW5kIGZsYWdzIGFuZCBvcGNvZGUgbW9kaWZpZXIKLQlmbGFncyBmb3IgY2xhcml0eS4gIFJlbW92ZSB1bnVzZWQgZGVmaW5pdGlvbnM6IFVua25vd24sCi0JSW1tVW5rbm93biwgRGlzcFVua25vd24sIE5vTW9kcm0uCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0eXBlX25hbWVzKTogQWRkIG1pc3NpbmcgRGVidWcgdHlwZS4KLQkobWRfYXNzZW1ibGUpOiBCZXR0ZXIgZHVwbGljYXRlIHByZWZpeCBjaGVja2luZy4gIFF1aWNrZXIgc3RyaW5nCi0JaW5zdHJ1Y3Rpb24gY2hlY2sgdmlhIG5ldyBvcGNvZGVfbW9kaWZpZXIgZmxhZy4KLQotRnJpIEFwciAgMyAxMTo0NDozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChJbnZva2luZyk6IENsYXJpZnkgLVdhIGV4YW1wbGUuCi0KLUZyaSBBcHIgIDMgMDk6MTI6MjMgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGNldHVzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfcHNldWRvX3RhYmxlKTogQWRkIHdlYWtleHQgZW50cnkuIAotCShzX21pcHNfd2Vha2V4dCk6IERlZmluZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0KTogRG9uJ3QgZGVmaW5lIGlmIGRlZmluZWQoVENfTUlQUykuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBEb24ndCBhZGQgd2Vha2V4dCBpZiAKLQlkZWZpbmVkKFRDX01JUFMpLgkKLQkKLVRodSBBcHIgIDIgMjI6NDI6MDIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jICh0Y19nZW5fcmVsb2MpOiBUaGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scwotCWlzIGFuIGVycm9yIGlmIHRoZSB2YWx1ZSBjYW4gbm90IGJlIGNvbXB1dGVkIGF0IGFzc2VtYmx5IHRpbWUuCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jICh0Y19nZW4tcmVsb2MpOiBMaWtld2lzZS4KLQotVGh1IEFwciAgMiAxNjozNjo0NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAobWFpbik6IFNldCBuZXh0IGZpZWxkIG9mIG5ldyBpbmNsdWRlX3BhdGggc3RydWN0dXJlIHRvCi0JTlVMTC4gIEZyb20gQXZlcnkgUGVubmFydW4gPGF2ZXJ5cEBnZGMuY2E+LgotCi0JKiByZWFkLmMgKHNfbXJpX3NlY3QpOiBDYWxsIGFzX2JhZCByYXRoZXIgdGhhbiBhYm9ydCBmb3IgYW4KLQl1bnN1cHBvcnRlZCBNUkkgdGFyZ2V0LgotCi1XZWQgQXByICAxIDExOjA4OjI3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYXJtX3ZhbGlkYXRlX2ZpeCk6IE5ldyBmdW5jdGlvbi4gIERldGVybWluZSBpZgotCXRoZSBkZXN0aW5hdGlvbiBvZiBhIGJyYW5jaCBpbnN0cnVjdGlvbiBzaG91bGQgYmUgYWx0ZXJlZC4KLQkoZmluZF9yZWFsX3N0YXJ0KTogTmV3IGZ1bmN0aW9uOiAgTG9jYXRlIHRoZSByZWFsLCBUaHVtYiBjb2RlZAotCXN0YXJ0IG9mIGEgVGh1bWIgZnVuY3Rpb24uCi0JKGRvX3RfYnJhbmNoMjMpOiBBbHRlciB0aGUgZGVzdGluYXRpb24gb2YgYnJhbmNoZXMgdG8gVGh1bWIKLQlmdW5jdGlvbnMuIAotCi0JKiBjb25maWcvdGMtYXJtLmg6IERlZmluZSBUQ19WQUxJREFURV9GSVguCi0KLVR1ZSBNYXIgMzEgMTM6Mjc6MzMgMTk5OCAgRGVhbiBNLiBEZWF2ZXIgIDxkZWF2ZXJAYW10LnRheTEuZGVjLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChkZWNvZGVfc2hpZnQpOiBIYW5kbGUgYWRkcmVzc2luZyBtb2RlIDIgdy9ycngKLQlhbHNvLgotCi1XZWQgQXByICAxIDEzOjEzOjIwIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBkb2MvYXMudGV4aW5mbzogVXNlIEBpdGVteCBmb3IgYSBzZWNvbmRhcnkgaXRlbSBpbiBhIHRhYmxlLgotCSogZG9jL2MtaHBwYS50ZXhpOiBMaWtld2lzZS4KLQotVHVlIE1hciAzMSAxNzo1Mjo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbSAoREVQX0lOQ0xVREVTKTogTmV3IHZhcmlhYmxlLgotCSguZGVwMSk6IENoYW5nZSB0byB3b3JrIHdoZW4gc3JjZGlyIGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoLgotCSgudGNkZXAsIC5vYmpkZXAsIC5kZXAyLCBkZXAuc2VkKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIE1hciAzMCAxMjo0Njo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmgsIGNvbmZpZy90Yy1pMzg2LmM6IFJldmVydCBNYXJjaCAyNAotCUxpbmVhckFkZHJlc3MgcGF0Y2guCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IHZlcnNpb24gdG8gMi45LjEuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KLQotTW9uIE1hciAzMCAxMToyMjowOCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKEZXYWl0KTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBFbWl0IGZ3YWl0IHByZWZpeCBiZWZvcmUgYW55Ci0Jb3RoZXIgcHJlZml4ZXMuICBDaGVjayBGV2FpdCBmbGFnIGluIG9wY29kZSB0YWJsZSB0byBzZWUgd2hpY2gKLQlpbnN0cnVjdGlvbnMgcmVxdWlyZSBhbiBmd2FpdCBwcmVmaXguCi0KLU1vbiBNYXIgMzAgMTA6MTI6MDAgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHN0YWJzLmMgKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBBbHdheXMgY3JlYXRlIGEgc3RhYiBzdHJpbmcKLQlzZWN0aW9uLgotCi1TYXQgTWFyIDI4IDIyOjI4OjAyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZpeCBzb21lIGdjYyAtV2FsbCB3YXJuaW5nczoKLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBlaG9wdC5jIChlaF9mcmFtZV9jb2RlX2FsaWdubWVudCk6IExpa2V3aXNlLgotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50LCBvcGVyYW5kKTogTGlrZXdpc2UuCi0JKiBmcmFncy5jIChmcmFnX2FsaWduKTogTGlrZXdpc2UuCi0JKiBnYXNwLmMgKGxldmVsXzAsIGNoYW5nZV9iYXNlLCBkb2luc3RyKTogTGlrZXdpc2UuCi0JKiBoYXNoLmMgKGhhc2hfYXNrKTogTGlrZXdpc2UuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfcGFnZSwgY2FsY19oZXgsIHByaW50X2xpbmVzKTogTGlrZXdpc2UuCi0JKGRlYnVnZ2luZ19wc2V1ZG8pOiBMaWtld2lzZS4KLQkqIG1hY3JvLmMgKGRlZmluZV9tYWNybywgY2hlY2tfbWFjcm8pOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlLCBzX2FsaWduLCBzX2Zsb2F0X3NwYWNlKTogTGlrZXdpc2UuCi0JKGlnbm9yZV9yZXN0X29mX2xpbmUsIGZsb2F0X2NvbnMpOiBMaWtld2lzZS4KLQkqIHN5bWJvbHMuYyAoZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUpOiBMaWtld2lzZS4KLQkqIHdyaXRlLmMgKHJlY29yZF9hbGlnbm1lbnQsIGN2c19mcmFnX3RvX2ZpbGwpOiBMaWtld2lzZS4KLQkoZml4dXBfc2VnbWVudCwgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbik6IExpa2V3aXNlLgotCShudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuKTogTGlrZXdpc2UuCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGdlbl90b193b3Jkcyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2JlZ2luLCBtZF9hc3NlbWJsZSk6IExpa2V3aXNlLgotCShzcGFyY19pcCwgcGFyc2Vfa2V5d29yZF9hcmcsIHNfY29tbW9uKTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKG91dHB1dF9iaWdfc2xlYjEyOCk6IEluaXRpYWxpemUgbG9jYWxzIHRvIGF2b2lkCi0Jd2FybmluZ3MuCi0JKG91dHB1dF9iaWdfdWxlYjEyOCwgZXF1YWxzKTogTGlrZXdpc2UuCi0JKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogQ2hhbmdlIG51bWJlcl9vZl9kaWdpdHNfKiBsb2NhbHMKLQl0byB1bnNpZ25lZCBpbnQuICBDaGFuZ2UgemVyb3MgdG8gdW5zaWduZWQgaW50LgotCSogY29uZC5jIChzX2lmKTogQWRkIHJldHVybiB0byBkZWZhdWx0IGNhc2UuCi0JKiBmcmFncy5jIChmcmFnX25vd19maXgpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYWRkcmVzc1QuCi0JKiBmcmFncy5oIChmcmFnX25vd19maXgpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBsaXN0aW5nLmMgKGZpbGVfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgbGluZW51bSB0byB1bnNpZ25lZCBpbnQuCi0JKHN0cnVjdCBsaXN0X2luZm9fc3RydWN0KTogQ2hhbmdlIGhsbF9saW5lIHRvIHVuc2lnbmVkIGludC4KLQkocHJpbnRfc291cmNlKTogVXBkYXRlIGZvcm1hdCBzdHJpbmcuCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IENoYW5nZSBzY2FuIHRvIHVuc2lnbmVkIGludCwgYW5kIGRvbid0Ci0JYm90aGVyIHRvIGluaXRpYWxpemUgaXQuCi0JKiBzeW1ib2xzLmMgKGRvbGxhcl9sYWJlbF9jb3VudCk6IENoYW5nZSB0byB1bnNpZ25lZCBsb25nLgotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBSZW1vdmUgdW51c2VkIGxhYmVsIHJlZHVjZV9maXh1cC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19tZW1vcnlfbW9kZWwpOiBPbmx5IGRlZmluZSBpZiBPQkpfRUxGLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEFkZCByZXR1cm4gdG8gZGVmYXVsdCBjYXNlLgotCi1GcmkgTWFyIDI3IDEyOjQ2OjQ3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IENoZWNrIGxlZ2FsIGFkZHJlc3NpbmcgbW9kZXMgZm9yCi0gCW1jZjUyMDAganVzdCBhcyB3ZSBkbyBmb3IgbTY4MDAwLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IExpa2V3aXNlLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IExpa2V3aXNlLgotCi1GcmkgTWFyIDI3IDEwOjMwOjAxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6ICBTdG9yZSByZWxvY2F0aW9uIGFkZGVuZCBpbgotCWZpeHVwIGluc3RlYWQgb2YgaW5zdHJ1Y3Rpb24uCi0KLVRodSBNYXIgMjYgMjM6MDc6MTggMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFN3YXAgdGVtcGxhdGUgYXJndW1lbnRzIHRvCi0JQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSCBtYWNybyBpbiByZXZlcnNlIGRpcmVjdGlvbiB0ZXN0LgotCVRoaXMgbWFjcm8gaXMgY3VycmVudGx5IHN5bW1ldHJpYywgc28gcGFzc2luZyB0aGVtIHRoZSB3cm9uZwotCXdheSBkaWRuJ3QgY2F1c2UgYW55IHByb2JsZW0sIGJ1dCBtYXkgaWYgdGhlIG1hY3JvIGlzIGNoYW5nZWQKLQlpbiB0aGUgZnV0dXJlLgotCUFmdGVyIGNvcHlpbmcgdGVtcGxhdGUgdG8gaS50bSwgdXNlIGkudG0uIHJhdGhlciB0aGFuIHQtPiB0bwotCWFjY2VzcyBmaWVsZHMsIGFuZCBtYWtlIHQgYSBjb25zdCoKLQlNb3ZlIGkudG0ub3BlcmFuZF90eXBlc1tdIHN3YXAgdG8gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvcHkuCi0KLVdlZCBNYXIgMjUgMTM6NDQ6MTggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZXhwci5oIChleHByX2J1aWxkX3Vjb25zdGFudCk6IEFkZCBwcm90b3R5cGUuCi0JKGV4cHJfYnVpbGRfdW5hcnksZXhwcl9idWlsZF9iaW5hcnkpOiBBZGQgcHJvdG90eXBlcy4KLQkqIGV4cHIuYyAoZXhwcl9idWlsZF91Y29uc3RhbnQpOiBOZXcgZnVuY3Rpb24uCi0JKGV4cHJfYnVpbGRfdW5hcnksZXhwcl9idWlsZF9iaW5hcnkpOiBOZXcgZnVuY3Rpb25zLgotCi1XZWQgTWFyIDI1IDEzOjEwOjQyIDE5OTggIEJydW5vIEhhaWJsZSAgPGJydW5vQGxpbnVpeC5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+Ci0KLSAgICAgICAgKiBnYXNwLmMgKElTKik6IENhc3QgYXJndW1lbnQgdG8gdW5zaWduZWQgY2hhciwgbm90IHVuc2lnbmVkIGludC4KLSAgICAgICAgKiBtYWNyby5jIChtYWNyb19leHBhbmRfYm9keSk6IEluY3JlYXNlIGJ1ZmZlciBzaXplLgotICAgICAgICAqIG1lc3NhZ2VzLmMgKGFzX3dhcm4pOiBMaWtld2lzZS4KLQkoYXNfd2Fybl93aGVyZSwgYXNfYmFkLCBhc19iYWRfd2hlcmUpOiBMaWtld2lzZS4KLQotV2VkIE1hciAyNSAxMjo1OTowNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEguSi4gTHUgIDxoamxAZ251Lm9yZz46Ci0JKiBNYWtlZmlsZS5hbSAoRElTVFNUVUZGKTogTmV3IHZhcmlhYmxlLgotCShkaXN0c3R1ZmYpOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBNYXIgMjQgMTY6NTE6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuaCAobWRfY2xlYW51cCwgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2spOiBDYWxsCi0JbTMycl9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vay4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayk6IE5ldyBmdW5jdGlvbiB0bwotCWVtaXQgYSBub3AgaWYgYSBzZWN0aW9uIGVuZHMgd2l0aCBhIDE2IGJpdCBpbnN0cnVjdGlvbi4KLQotVHVlIE1hciAyNCAxOTo0ODowOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9ic3MpOiBDb21waWxlIHVuY29uZGl0aW9uYWxseS4gIENhbGwKLQlzX2xjb21tIHJhdGhlciB0aGFuIG9ial9jb2ZmX2xjb21tLgotCShvYmpfcHNldWRvX3RhYmxlKTogQ29tcGlsZSAuYnNzIHBzZXVkby1vcCB1bmNvbmRpdGlvbmFsbHkuCi0KLVR1ZSBNYXIgMjQgMTg6MzA6NTggMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChMaW5lYXJBZGRyZXNzKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBJZiBMaW5lYXJBZGRyZXNzIGlzIHNldCBmb3IgdGhlCi0JaW5zdHJ1Y3Rpb24sIGRvbid0IHVzZSBhIGRlZmF1bHQgc2VnbWVudC4KLQotTW9uIE1hciAyMyAxODo1Mzo0MCAxOTk4ICBKb2VsIFNoZXJyaWxsICA8am9lbEBPQVJjb3JwLmNvbT4KLQotCSogY29uZmlndXJlLmluOiAoc2gqLSotcnRlbXMqKTogU3dpdGNoZWQgZnJvbSBFTEYgdG8gQ09GRi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyMCAxOToxNTo0NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxpYnRvb2wgMS4yLgotCi1UaHUgTWFyIDE5IDE2OjAzOjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IGZpeCBjb2RlIHRvIHRlc3QgdGhlIHJhbmdlIG9mCi0JUEMgcmVsYXRpdmUgYnJhbmNoZXMuICBQYXRjaCBjb3VydGVzeSBvZiBKb25hdGhhbiBXYWx0b24uIAotCi0JCi1XZWQgTWFyIDE4IDA5OjI5OjUxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCB0aHVtYi1wZSB0YXJnZXQuCi0KLQkqIGNvbmZpZ3VyZSAoZW11bGF0aW9ucyk6IEFkZCB0aHVtYi1wZSB0YXJnZXQuCi0KLTE5OTgtMDMtMTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpdGJsLWxleC5sICh5eXdyYXApOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkIGFzIGEKLQltYWNyby4KLQotRnJpIE1hciAxMyAxNjozMTozOCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGRlcGVuZC5jIChxdW90ZV9zdHJpbmdfZm9yX21ha2UpOiBOZXcgZnVuY3Rpb24uCi0JKHdyYXBfb3V0cHV0KTogVXNlIGl0LgotCi1UaHUgTWFyIDEyIDE4OjI4OjIyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IFNldCBic3MgZmxhZyBpbiBzZWdfaW5mbwotCXN0cnVjdHVyZSBpZiB0eXBlIGlzIFNIVF9OT0JJVFMuICBbQnVnIGZpeCBjb3VydGVzeSBvZiBydGhdCi0KLVNhdCBGZWIgMjggMTc6Mjg6NTUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX3Nob3J0b3B0cywgbWRfbG9uZ29wdHMsIG1kX3BhcnNlX29wdGlvbik6Ci0JUmVjb2duaXplIC1HTiBhbmQgLXJlbGF4LgotCShtZF9iZWdpbik6IEluaXRpYWxpemUgZ3Agc2l6ZSBmcm9tIC1HIHN3aXRjaC4KLQkoYWxwaGFfZm9yY2VfcmVsb2NhdGlvbik6IEFsd2F5cyBmb3JjZSBpZiAtcmVsYXguCi0JKGFscGhhX2FsaWduKTogVGFrZSBhIG5ldyBhcmd1bWVudCB0aGF0IHdpbGwgc3BlY2lmeSB3aGVuIHRvIAotCWVtaXQgYW4gUl9BTFBIQV9BTElHTiByZWxvY2F0aW9uICh0aG91Z2ggd2UgZG9uJ3QgZG8gdGhhdCBub3cpLgotCUNoYW5nZSBhbGwgY2FsbGVycy4gIEVtaXQgbm9wIGFsaWdubWVudCBwYWRkaW5nIGFzIG5vcCt1bm9wIHBhaXIuCi0KLVNhdCBGZWIgMjggMTc6MDY6MjIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyBbVENfQUxQSEFdOiBJbmNsdWRlIDxlbGYvYWxwaGEuaD4uCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBOZXcuCi0KLVRodSBGZWIgMjYgMTU6NDk6MDQgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHdyaXRlXzJfc2hvcnQpOiBEZWxheWVkIGpzciBpbnN0cnVjdGlvbnMgZG9uJ3QKLQlyZXF1aXJlIHBhZGRpbmcgdG8gdGhlIG5leHQgbG9uZyB3b3JkIGJvdW5kYXJ5LgotCi1Nb24gRmViIDIzIDExOjI5OjA2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmM6ICNpbmNsdWRlIHN5bWNhdC5oLgotCSogY29uZmlnL3RjLW0zMnIuYzogTGlrZXdpc2UuCi0KLU1vbiBGZWIgMjMgMTA6Mjc6NDAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwLCBjYXNlICdQJyk6IE1ha2UgJ1AnIGFyZ3VtZW50cyBiZQotCWFic29sdXRlIGV4cHJlc3Npb25zIGluc3RlYWQgb2YgJyQnIHByZWZpeGVkIHJlZ2lzdGVyIG5hbWVzLgotCi1TYXQgRmViIDIxIDIyOjM2OjUyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19zZXQpOiBSZWNvcmQgZmlsZSBhbmQgbGluZSBpbmZvIGZvciBzeW1ib2xzIHdoZW4gLWFzLgotCShwc2V1ZG9fc2V0KTogRG9uJ3Qgb3ZlcndyaXRlIHRoYXQgZHVtbXkgZnJhZ21lbnQuCi0KLUZyaSBGZWIgMjAgMTU6MDM6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAic2VjdGlvbiIuCi0JKHBwY19uYW1lZF9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotVGh1IEZlYiAxOSAyMjoyNTo0MiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0Yy1wcGMuYyAocHBjX2JpZWkpOiBDYWNoZSB0aGUgbGFzdCBzeW1ib2wgd2UgaW5zZXJ0ZWQKLQlzbyB3ZSBkb24ndCBoYXZlIHRvIHNjYW4gdGhlIGVudGlyZSBsaXN0LgotCi1UdWUgRmViIDE3IDE3OjAyOjE1IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IEZvciB0aGUgZXhwbGljaXRseSBwYXJhbGxlbAotIAljYXNlLCBhbGxvdyB0aGUgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIHRvIG1vZGlmeSB0aGUgc2FtZSBmbGFnCi0gCWJpdHMuCi0KLVRodSBGZWIgMTkgMTY6MDg6MTUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IENhdGVnb3JpemUgc3ltYm9scyBieQotCXVuZGVmaW5lZF9zZWN0aW9uIHJhdGhlciB0aGFuIHN5X2ZyYWctPmxpbmUgPT0gTlVMTC4KLQotV2VkIEZlYiAxOCAyMzozOTo0NiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogSW5zdGFsbCBwcm9wZXJseSB3aGVuIGxuCi0JZmFpbHMgb3IgdG9vbGRpciA9PSBwcmVmaXguCi0KLVR1ZSBGZWIgMTcgMTg6NTg6NTEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoY2dlbl9tZF9hcHBseV9maXgzKTogRGVsZXRlIGNhbGwgdG8gdmFsaWRhdGVfb3BlcmFuZC4KLQlUZXN0IHJlc3VsdCBvZiBpbnNlcnRfb3BlcmFuZCBmb3IgZXJyb3IuCi0KLUZyaSBGZWIgMTMgMTY6NDE6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IEFkZCBjeWdudXMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KLQkqIGRvYy9NYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IERlZmluZS4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEZlYiAxMyAwMDo0Nzo0NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogSGFuZGxlIG9wZXJhbmQgdHlwZSAnQycuCi0JKG1hY3JvKTogRml4IGhhbmRsaW5nIG9mIE1fQ09QWzAtM10uCi0KLVRodSBGZWIgMTIgMTQ6MDY6NTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFJvc3MgSGFydmV5IDxyb3NzQHRlcmFmbG9wLmNvbT46Ci0JKiBtYWNyby5jIChJU1NFUCk6IE9ubHkgdHJlYXQgJzwnIGFuZCAnPicgYXMgc2VwYXJhdG9yIGNoYXJhY3RlcnMKLQlpZiBtYWNyb19hbHRlcm5hdGUgb3IgbWFjcm9fbXJpLgotCShnZXRzdHJpbmcpOiBSZW1vdmUgc3VwcG9ydCBmb3IgYnl0ZSBjb25zdGFudHMgYmV0d2VlbiA8IGFuZCA+LgotCShnZXRfYW55X3N0cmluZyk6ICc8JyBvbmx5IHN0YXJ0cyBhIHN0cmluZyBpZiBtYWNyb19hbHRlcm5hdGUgb3IKLQltYWNyb19tcmkuCi0JKG1hY3JvX2V4cGFuZF9ib2R5KTogUGVybWl0IGtleXdvcmQgcGFyYW1ldGVycyBmb2xsb3dpbmcKLQlwb3NpdGlvbmFsIHBhcmFtZXRlcnMuCi0KLQlOZXRCU0QgcGF0Y2hlcyBmcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEqLSotbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvdGUtbmJzZC5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGFzLmggKGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApOiBNb3ZlIGZyb20gaGVyZS4uLgotCSogY29uZmlnL3RjLWQxMHYuYyAoZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCk6IC4uLnRvCi0JaGVyZSwgYW5kIG1ha2Ugc3RhdGljLgotCi0JKiBlaG9wdC5jIChlaF9mcmFtZV9jb2RlX2FsaWdubWVudCk6IE9ubHkgdXNlIHNlZ19pbmZvIGlmCi0JQkZEX0FTU0VNQkxFUiBvciBNQU5ZX1NFR01FTlRTLgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogVXBkYXRlIGJ1Zy1nbnUtdXRpbHMgYWRkcmVzcy4KLQkqIGdhc3AuYyAoc2hvd191c2FnZSk6IExpa2V3aXNlLgotCSogZG9jL2FzLnRleGluZm8gKEJ1ZyBSZXBvcnRpbmcpOiBMaWtld2lzZS4KLQotV2VkIEZlYiAxMSAyMzoyNjoyOCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX2FkZHJlc3MpOiBEb24ndCB1c2UgbWlwcyBJSUkgb3IgbWlwcyBJVgotCWluc25zIHJlZ2FyZGxlc3Mgb2YgdGhlIHNpemUgb2YgYSBwb2ludGVyIGlmIHdlJ3JlIGluIG1pcHMgSSBvcgotCU1JUFMgSUkgbW9kZS4KLSAgICAgICAgKG1hY3JvLCBtYWNybzIsIHNfY3ByZXN0b3JlLCBzX2NwYWRkKTogTGlrZXdpc2UuCi0KLVRodSBGZWIgMTIgMDM6NDE6MDAgMTk5OCAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotRml4IHJhYyB0byBhY2NlcHQgb25seSBhMDoKLQkqIHRjLWQxMHYuYyAocGFyYWxsZWxfb2ssIGZpbmRfb3Bjb2RlKToKLQlTcGxpdCBPUEVSQU5EX0FDQyBpbnRvIE9QRVJBTkRfQUNDMCBhbmQgT1BFUkFORF9BQ0MxLgotCUludHJvZHVjZSBPUEVSQU5EX0dQUi4KLQotV2VkIEZlYiAxMSAxNjoyODoxMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfZmlsbCk6IEhhbmRsZSBub24tY29uc3RhbnQgcmVwZWF0IGNvdW50cyBieSBjcmVhdGluZwotCWFuIHJzX3NwYWNlIGZyYWdtZW50LgotCi1UdWUgRmViIDEwIDE4OjMxOjMxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogQ2hhbmdlIGVycm9yIGFkZGVkIEphbiAyIDE5OTgKLQlmcm9tIGFzX2JhZCB0byBhc193YXJuLgotCi1UdWUgRmViIDEwIDE4OjA0OjAwIDE5OTggIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBhcy5jOiAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogVXNlIFtURVhUfERBVEF8QlNTXV9TRUNUSU9OX05BTUUKLQkqIGFzLmg6IERlZmluZSBkZWZhdWx0IHZhbHVlcyBvZiBbVEVYVHxEQVRBfEJTU11fU0VDVElPTl9OQU1FCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfYmVnaW4pOiBVc2UgW1RFWFR8REFUQXxCU1NdX1NFQ1RJT05fTkFNRQotCi1UdWUgRmViIDEwIDE3OjU4OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWhvcHQuYyAoZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQpOiBJZiBub3QgQkZEX0FTU0VNQkxFUiwgdXNlCi0Jc2VnX2ZpeF9yb3RQIHJhdGhlciB0aGFuIGZpeF9yb290IGZyb20gc2VnX2luZm8uCi0KLVR1ZSBGZWIgMTAgMTU6MzI6MjIgMTk5OCAgSWFuIENhcm1pY2hhZWwgIDxpYW5jYXJtQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYzogQWRkIHN1cHBvcnQgZm9yIDB4MV8yXzNfNCBiaWdudW1zLgotCi1UdWUgRmViIDEwIDE0OjQzOjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLWxpbnV4KiB0byAtbGludXgtZ251Ki4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogVHJlYXQgXHIgYXMgd2hpdGVzcGFjZS4KLQotTW9uIEZlYiAgOSAxNDoxNjoxMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVNhdCBGZWIgIDcgMTU6MzM6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotRnJpIEZlYiAgNiAxNjowODozMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IElmIG1pcHNfY3B1IGlzIHNldCwgdGhlbiB1c2UgaXQgYXMKLSAgICAgICAgdGhlIGFyZ3VtZW50IHRvIGJmZF9zZXRfYXJjaF9tYWNoLgotICAgICAgICAobG9hZF9hZGRyZXNzKTogVXNlIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgdG8gZGV0ZXJtaW5lIHRoZQotICAgICAgICBiaXQgc2l6ZSBvZiBhbiBhZGRyZXNzIGluc3RlYWQgb2YgbG9va2luZyBhdCB0aGUgaXNhIGxldmVsLgotICAgICAgICAobWFjcm8sIG1hY3JvMiwgc19jcHJlc3RvcmUsIHNfY3BhZGQpOiBMaWtld2lzZS4KLQotRnJpIEZlYiAgNiAxNDo0NDozNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgLW12ODUwYW55IGNvbW1hbmQgbGluZSBvcHRpb24uCi0KLVRodSBGZWIgIDUgMTI6Mzk6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlaG9wdC5jOiBOZXcgZmlsZS4KLQkqIGFzLmggKGVudW0gX3JlbGF4X3N0YXRlKTogQWRkIHJzX2NmYS4KLQkoY2hlY2tfZWhfZnJhbWUsIGVoX2ZyYW1lX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogRGVjbGFyZS4KLQkoZWhfZnJhbWVfcmVsYXhfZnJhZywgZWhfZnJhbWVfY29udmVydF9mcmFnKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogQ2FsbCBjaGVja19laF9mcmFtZS4KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBIYW5kbGUgcnNfY2ZhLgotCShyZWxheF9zZWdtZW50KTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShHQVNfQ0ZJTEVTKTogQWRkIGVob3B0LmMuCi0JKEdFTkVSSUNfT0JKUyk6IEFkZCBlaG9wdC5vLgotCSogZG9jL2ludGVybmFscy50ZXhpIChGcmFncyk6IERvY3VtZW50IHJzX2NmYS4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IE1lbnRpb24gLS10cmFkaXRpb25hbC1mb3JtYXQuCi0JKHBhcnNlX2FyZ3MpOiBBY2NlcHQgLS10cmFkaXRpb25hbC1mb3JtYXQuCi0JKiBhcy5oIChmbGFnX3RyYWRpdGlvbmFsX2Zvcm1hdCk6IERlY2xhcmUuCi0JKiBvdXRwdXQtZmlsZS5jIChvdXRwdXRfZmlsZV9jcmVhdGUpOiBJZiBmbGFnX3RyYWRpdGlvbmFsX2Zvcm1hdCwKLQlzZXQgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBvbiBzdGRvdXRwdXQuCi0JKiBkb2MvYXMudGV4aW5mbywgZG9jL2FzLjE6IERvY3VtZW50IC0tdHJhZGl0aW9uYWwtZm9ybWF0LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IE1ha2Ugc3VyZSB0aGF0IGlmIHdlIGhhdmUgYQotCWZpeHVwIGZvciBhbiB1bm1hdGNoZWQgJWhpIHJlbG9jLCBpdCBkb2VzIG5vdCBhc3NvY2lhdGVkIHdpdGggYQotCXZhcmlhbnQgZnJhZy4KLQotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogZG9jL01ha2VmaWxlLmluOiBMaWtld2lzZS4KLQotV2VkIEZlYiAgNCAxNTo0MTo1NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChjaGVja19mb3Jfc2lkZV9lZmZlY3RzKTogTmV3IGZ1bmN0aW9uLgotCShjYW5fbWFrZV9wYXJhbGxlbCk6IEFkZCBjaGVja3MgZm9yIGluc3RydWN0aW9uIHNpZGUgZWZmZWN0cwotCWNsYXNoaW5nIHdpdGggdGhlIG90aGVyIGluc3RydWN0aW9uLgotCShhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogSW1wcm92ZSB3YXJuaW5nIG1lc3NhZ2VzLiAgUmV0dXJuIGVycm9yCi0JbWVzc2FnZSBmcm9tIG5vbi1zd2FwcGVkIGluc3RydWN0aW9uIG9yZGVyLgotCi1XZWQgRmViICA0IDIwOjAwOjI2IDE5OTggIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHRla25lbWEuZGVtb24uY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYzogUmVuYW1lIGFybV9hZnRlcl9wYXNzX2hvb2soKSB0byBhcm1fY2xlYW51cCgpLgotCi0JKiBjb25maWcvdGMtYXJtLmg6IFJlcGxhY2UgbWRfYWZ0ZXJfcGFzc19ob29rIGRlZmluaXRpb24gd2l0aCBhCi0gCW1kX2NsZWFudXAgZGVmaW5pdGlvbi4gIFRoaXMgbW92ZXMgdGhlIGZvcmNlZCBsaXRlcmFsIG91dHB1dCB0bwotIAl0aGUgZW5kIG9mIHRoZSBzb3VyY2UgcGFzcywgYW5kIGF2b2lkcyBtYWNybydzIGluc2VydGluZyBsaXRlcmFscwotIAlpbnRvIHRoZSBjb2RlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYWNybyBleHBhbnNpb24uCi0KLVdlZCBGZWIgIDQgMTM6MTc6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpIFtPQkpfRUxGXTogQSByZWxvYyBhZ2FpbnN0Ci0JYSBnYXMgaW50ZXJuYWwgc3ltYm9sIGlzIGFkanVzdGFibGUuCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogTGlrZXdpc2UuCi0KLQkqIGFzLmg6IElmIGdjYyB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiAyLjYsIHVzZSBgX19mb3JtYXRfXycgYW5kCi0JYF9fcHJpbnRmX18nIGluIGZ1bmN0aW9uIGF0dHJpYnV0ZXMsIHJhdGhlciB0aGFuIGBmb3JtYXQnIGFuZAotCWBwcmludGYnLgotCi1Nb24gRmViICAyIDE4OjM4OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmM6IE9ubHkgaW5jbHVkZSBlbGYvc3BhcmMuaCBpZiBPQkpfRUxGLgotCi1Nb24gRmViICAyIDE4OjMwOjM0IDE5OTggIFN0ZXZlIEhhd29ydGggIDxzdGV2ZUBwbS5jc2Uucm1pdC5FRFUuQVU+Ci0KLQlBZGQgdG1zMzIwYzMwIHN1cHBvcnQ6Ci0JKiBjb25maWcvdGMtdGljMzAuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtdGljMzAuYzogTmV3IGZpbGUuCi0JKiBjb25maWcvb2JqLWNvZmYuaDogSWYgVENfVElDMzAsIGluY2x1ZGUgY29mZi90aWMzMC5oIGFuZCBkZWZpbmUKLQlUQVJHRVRfRk9STUFUIGFzICJjb2ZmLXRpYzMwIi4KLQkqIGNvbmZpZ3VyZS5pbiAodGljMzAtKi0qYW91dCosIHRpYzMwLSotKmNvZmYqKTogTmV3IHRhcmdldHMuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENQVV9UWVBFUyk6IEFkZCB0aWMzMC4KLQkoQ1BVX09CSl9WQUxJRCk6IHRpYzMwLWFvdXQgaXMgdmFsaWQuCi0JKFRBUkdFVF9DUFVfQ0ZJTEVTKTogQWRkIGNvbmZpZy90Yy10aWMzMC5jLgotCShUQVJHRVRfQ1BVX0hGSUxFUyk6IEFkZCBjb25maWcvdGMtdGljMzAuaC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBGZWIgIDIgMTA6MjA6MzcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBJbXByb3ZlbWVudHMgdG8gZXJyb3IgbWVzc2FnZXMuCi0KLU1vbiBGZWIgIDIgMTI6Mzk6MDUgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogQ2hhbmdlIEJGRF9SRUxPQ19ISTE2IGFuZAotIAlCRkRfUkVMT0NfSEkxNl9TIHRvIHN0b3JlIHRoZSBoaWdoIGJpdHMgb2YgYW55IHZhbHVlLgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogVW5kbyBjaGFuZ2Ugb2YgRnJpIEp1biAyNy4KLQkoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRG9uJ3QgbGV0IHRoZQotCWFzc2VtYmxlciBjYWxjdWxhdGUgcmVsb2NhdGlvbnMgdG8gYW55IGV4dGVybmFsIHN5bWJvbCBhdCBhbGwuCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpIFtPQkpfRUxGXTogQ29ycmVjdCBidWdzCi0JaW52b2x2aW5nIGdlbmVyYXRpb24gb2YgcGMtcmVsYXRpdmUgcmVsb2NzLgotCShtZF9wY3JlbF9mcm9tX3NlY3Rpb24pIFtPQkpfRUxGXTogVGhlIGpvYiB0aGlzIGNvZGUgdXNlZCB0byBkbwotCWhhcyBiZWVuIG1vdmVkIHRvIG1kX2FwcGx5X2ZpeDMuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEZpeCB0ZXN0IGZvciB0b28tZmFyIGJyYW5jaC4KLQkocHBjX2VsZl9zdWZmaXgpOiBXYXJuIGFib3V0ICdpZGVudGlmaWVyK2NvbnN0YW50QGdvdCcgc3ludGF4LAotCXdoaWNoIGFjdHVhbGx5IG1lYW5zICh0aGUgYWRkcmVzcyBvZiBpZGVudGlmaWVyJ3MgR09UIGVudHJ5KSArCi0JY29uc3RhbnQsIHdoaWNoIGlzIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsLgotCi1GcmkgSmFuIDMwIDExOjAyOjM1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuaCAoaW5jbHVkZV9kaXJzKTogRGVjbGFyZS4KLQkoaW5jbHVkZV9kaXJfY291bnQsaW5jbHVkZV9kaXJfbWF4bGVuKTogRGVjbGFyZS4KLQotRnJpIEphbiAzMCAxMTo0NzowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29ycmVjdCBjaGVjayBmb3Igc2hhcmVkIG9wY29kZXMgbGlicmFyeS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogbGlzdGluZy5jIChidWZmZXJfbGluZSk6IElmIHdlIGNhbid0IG9wZW4gdGhlIGZpbGUsIHNldCBhdF9lbmQuCi0JKGxpc3RpbmdfcHJpbnQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGZpLgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55IChyZWdsaXN0cGFpcik6IEhhbmRsZSByZWdpc3RlciBsaXN0IGluCi0JZWl0aGVyIG9yZGVyLgotCi0JKiBjb25maWcvdm1zLWNvbmYuaDogRG9uJ3QgdW5kZWYgVkVSU0lPTi4KLQotVGh1IEphbiAyOSAxNDo0Mjo0NCAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogTWFrZWZpbGUuYW0gKENPTkZJR19PQkpTKTogTmV3IHZhcmlhYmxlLCBjb250YWluaW5nIHBhcnQgb2Ygb2xkCi0JT0JKUyB2YXJpYWJsZS4KLQkoR0VORVJJQ19PQkpTKTogTmV3IHZhcmlhYmxlLCB3aXRoIHRoZSByZXN0IG9mIHRoZSBvbGQgT0JKUwotCXZhcmlhYmxlLgotCShPQkpTKTogTm93IGp1c3QgJChDT05GSUdfT0JKUykgYW5kICQoR0VORVJJQ19PQkpTKS4KLQkoJChzcmNkaXIpL21ha2UtZ2FzLmNvbSk6IFJlbmFtZSBmcm9tIG1ha2UtZ2FzLmNvbS4KLQkoc3RhbXAtbWsuY29tKTogUmVwbGFjZSAkKE9CSlMpIHdpdGggJChHRU5FUklDX09CSlMpLgotCShFWFRSQV9ESVNUKTogRGVmaW5lLgotCSogdm1zY29uZi5zaDogSGFuZGxlIHt0YXJnLWNwdSwgb2JqLWZvcm1hdCwgYXRvZi10YXJnfSBtb2R1bGVzCi0JZXhwbGljaXRseSByYXRoZXIgdGhhbiB2aWEgdGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzLgotCShnY2MtYXMub3B0KTogTmV3IGZpbGUgY3JlYXRlZCB3aGVuIG1ha2UtZ2FzLmNvbSBpcyBydW4uCi0JKiBjb25maWctZ2FzLmNvbTogQ3JlYXRlIHt0YXJnLWNwdS5oLCBvYmotZm9ybWF0LmgsIHRhcmctZW52LmgsCi0JaXRibC1jcHUuaH0gdG8gI2luY2x1ZGUgYXBwcm9wcmlhdGUgZmlsZSByYXRoZXIgdGhhbiBjb3B5aW5nIHRoYXQKLQlmaWxlLgotCSogY29uZmlnL3Ztcy1jb25mLmg6IFN5bmNocm9uaXplIHdpdGggY3VycmVudCBjb25maWcuaW4uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEphbiAyOSAxODo0ODoxOSAxOTk4ICBCaWxsIE1veWVyICA8YmlsbG1AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZG9fYXNzZW1ibGUpOiBBZGRlZCBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwuCi0JKHBhcmFsbGVsX29rKTogUmVsYXhlZCBwYXJhbGxlbCBzdWJpbnN0cnVjdGlvbiBkZXBlbmRlbmN5IGNoZWNrLgotCi1XZWQgSmFuIDI4IDE0OjM1OjAwIDE5OTggIEJpbGwgTW95ZXIgPGJpbGxtQGN5Z251cy5jb20+Ci0KLQkqIGFzLmggKGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApOiBhZGRlZCBuZXcgZmxhZy4KLQkqIHRjLWQxMHYuYyAobWRfcGFyc2Vfb3B0aW9uLG1kX2xvbmdvcHRzKTogYWRkZWQgIi0tbm93YXJuc3dhcCIgCi0JY29tbWFuZCBsaW5lIGFyZ3VtZW50LgotCSogdGMtZDEwdi5jICh3cml0ZV8yX3Nob3J0KTogZW1pdCAiU3dhcHBpbmcgaW5zdHJ1Y3Rpb25zIgotCXdhcm5pbmcgb25seSBpZiBmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwIGlzIGZhbHNlLgotCi1XZWQgSmFuIDI4IDE2OjQxOjE5IDE5OTggIEouSi4gdmFuIGRlciBIZWlqZGVuICA8Si5KLnZhbmRlckhlaWpkZW5Ac3R1ZGVudC51dHdlbnRlLm5sPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1taW5ndzMyKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBKYW4gMjggMTQ6NTE6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogRG9uJ3Qgc2V0IHRoZSBzZWdtZW50IGlmIGl0Ci0JaGFzbid0IGNoYW5nZWQsIGFuZCB0aGlzIGlzIE9CSl9BT1VUIHdpdGhvdXQgQkZEX0FTU0VNQkxFUi4KLQotCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfTE9DQUwpOiBDb3JyZWN0IHR5cG8tLXBhc3MgYXJndW1lbnQgdG8KLQlTX0dFVF9TRUdNRU5ULgotCi1XZWQgSmFuIDI4IDEzOjU0OjUwIDE5OTggIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JYXMuaCAodW5saW5rKTogUmV2ZXJzZSAxMy1GZWItOTcgY2hhbmdlOyB1c2Ugb2YgdW5saW5rIHZzIHJlbW92ZQotCWRlcGVuZHMgdXBvbiBIQVZFX3tVTkxJTkssUkVNT1ZFfSB2YWx1ZXMgcmF0aGVyIHRoYW4gaG9zdAotCWNvbXBpbGVyLgotCi1XZWQgSmFuIDI4IDEzOjQ4OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTik6IERlZmluZS4KLQotV2VkIEphbiAyOCAwOTo1MjowMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2luc2VydF9vcGVyYW5kKTogRGlzcGxheSBpbnN0cnVjdGlvbiB3aGVuCi0JYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCi0KLVR1ZSBKYW4gMjcgMTM6MzI6MDEgMTk5OCAgUm9iZXJ0IExpcGUgIDxyb2JlcnRsQGRnaWkuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1zY28zLjJ2NSopOiBEZWZhdWx0cyB0byBFTEYgbm93LgotCShpMzg2LSotc2NvMy4ydjUqY29mZik6IE5ldyB0YXJnZXQuCi0JKGkzODYtKi1zY28zLjIqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEphbiAyNyAxMTowNjo1MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jOiBUaWR5IGVycm9yIG1lc3NhZ2UgcHJvZHVjdGlvbi4KLQotVHVlIEphbiAyNyAxMjoyNDozMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEFkZCBuZXcgdmFyaWFibGUgbmV3aW1tIHRvIGhvbGQKLQl2YWxpZGF0ZV9pbW1lZGlhdGUgcmV0dXJuIHZhbHVlIGluIHRoZSByaWdodCB0eXBlIGZvciBjb21wYXJpc29ucwotCXRvIEZBSUwuCi0KLVR1ZSBKYW4gMjcgMDY6NTE6NTkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChNQVhfQllURVMpOiBVc2UgbGlzdGluZyB2YXJpYWJsZXMgbm90IGNvbnN0YW50cy4KLQkoZGF0YV9idWZmZXIpOiBObyBsb25nZXIgYW4gYXJyYXksIGJ1dCBhIHBvaW50ZXIuCi0JKGNhbGNfaGV4KTogc2l6ZW9mKGRhdGFfYnVmZmVyKSAtPiBNQVhfQllURVMuCi0JKGxpc3RpbmdfbGlzdGluZyk6IEFsbG9jYXRlIGRhdGFfYnVmZmVyLgotCi1UdWUgSmFuIDI3IDA2OjM4OjM1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBBZGQgLS1saXN0aW5nLWxocy13aWR0aCwgLS1saXN0aW5nLWxocy13aWR0aDIsCi0JLS1saXN0aW5nLXJocy13aWR0aCwgLS1saXN0aW5nLWNvbnQtbGluZXMuCi0JKHNob3dfdXNhZ2UpOiBVcGRhdGUuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbGhzX3dpZHRoLCBsaXN0aW5nX2xoc193aWR0aF9zZWNvbmQpOiBOZXcgdmFycy4KLQkobGlzdGluZ19saHNfY29udF9saW5lcywgbGlzdGluZ19yaHNfd2lkdGgpOiBOZXcgdmFycy4KLQkocHJpbnRfbGluZXMpOiBVc2UgdGhlIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIHRoZSBjb25zdGFudHMuCi0JKGxpc3RpbmdfbGlzdGluZyk6IExpa2V3aXNlLgkKLQkqIGxpc3RpbmcuaDogRGVjbGFyZSB0aGUgbmV3IHZhcnMuCi0JCi1UdWUgSmFuIDI3IDA1OjMyOjA1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBBZGQgLS1rZWVwLWxvY2FscyBhbGlhcyBmb3IgLUwuCi0JQWRkIC0tc3RyaXAtbG9jYWwtYWJzb2x1dGUuCi0JKHNob3dfdXNhZ2UpOiBVcGRhdGUuCi0JKiBhcy5oIChmbGFnX3N0cmlwX2xvY2FsX2Fic29sdXRlKTogTmV3IGZsYWcuCi0JKiBzeW1ib2xzLmMgKFNfSVNfTE9DQUwpOiBVc2UgaXQuCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoU19JU19MT0NBTCk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1ib3V0LmggKFNfSVNfTE9DQUwpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX0xPQ0FMKTogTGlrZXdpc2UuCi0KLU1vbiBKYW4gMjYgMTM6MDc6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYzogRGV0ZWN0IGlmIGV4cGxpY2l0bHkgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zCi0JbWlnaHQgaGF2ZSBhbiBpbyBjb25mbGljdCBhbmQgaXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2UuIAotCi1UaHUgSmFuIDIyIDE3OjUxOjQ0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoY2dlbl9zYXZlX2ZpeHVwcywgY2dlbl9yZXN0b3JlX2ZpeHVwcywKLQljZ2VuX3N3YXBfZml4dXBzKTogRnVuY3Rpb25zIHRvIHNhdmUsIHJlc3RvcmUgYW5kIHN3YXAgdGhlIGZpeHVwCi0JY2hhaW4gd2l0aCBhIGJhY2t1cCBjb3B5LgotCShjZ2VuX2FzbV9maW5pc2hfaW5zbik6IFJldHVybnMgYWRkcmVzcyBvZiBjb25zdHJ1Y3RlZCBpbnNuLgotCi1XZWQgSmFuIDIxIDE2OjQ5OjEwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAoZmlsZV9pbmZvX3N0cnVjdCk6IFJlbW92ZSBGSUxFLCBhZGQgUE9TLgotCShsYXN0X29wZW5fZmlsZV9pbmZvLCBsYXN0X29wZW5fZmlsZSk6IE5ldzsgYSBvbmUgZW50cnkgRklMRSogY2FjaGUuCi0JKGZpbGVfaW5mbyk6IERvbid0IG9wZW4gdGhlIGZpbGUuCi0JKGJ1ZmZlcl9saW5lKTogQ2hlY2sgZm9yIHRoZSBmaWxlIGluIHRoZSBsYXN0X29wZW4gY2FjaGUsIHVwZGF0aW5nCi0JYXMgbmVjZXNzYXJ5LgotCShwcmludF9zb3VyY2UpOiBEb24ndCByZWZlcmVuY2UgZmlsZV9pbmZvLT5maWxlLgotCShsaXN0aW5nX2xpc3RpbmcpOiBMaWtld2lzZS4KLQkobGlzdGluZ19wcmludCk6IENsb3NlIHRoZSBmaWxlIGluIHRoZSBjYWNoZSwgaWYgYW55LgotCi1GcmkgSmFuIDE2IDE0OjUxOjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChkd2FyZl9maWxlX3N0cmluZyk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZS4KLQkoZW1pdF9leHByKTogTG9vayBmb3IgY29uc3RhbnQgc2VxdWVuY2UgdGhhdCBsZWFkcyB1cCB0byBhIGZpbGUKLQluYW1lIGluIERXQVJGIGRlYnVnZ2luZyBvdXRwdXQuCi0JKHN0cmluZ2VyKTogVXNlIGR3YXJmX2ZpbGVfc3RyaW5nIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGFjY2VwdCBhCi0Jc3RyaW5nIGFzIGEgZmlsZSBuYW1lLgotCi1GcmkgSmFuIDE2IDExOjMwOjM3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLW02OGsuYyAobTY4a19pcCk6IFJlbW92ZSBhYnNsLT5yZWdsc3QgTVJJIGhhY2suCi0JKGNyYWNrX29wZXJhbmQpOiBBZGQgcmVnLT5yZWdsc3QgTVJJIGhhY2suCi0JKHJfc2VnKTogUHV0IHJlZ2xzdCBzeW1ib2xzIGluIHJlZ19zZWN0aW9uLgotCShtNjhrX2Zyb2Jfc3ltYm9sKTogRnJvYiByZWdsc3Qgc3ltYm9scyBpbnRvIGFic29sdXRlX3NlY3Rpb24uCi0KLVRodSBKYW4gMTUgMTQ6MTk6MDEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtc2guYyAoZ2V0X3NwZWNpZmljKTogSGFuZGxlIFNHUiAmIERCUi4KLQotVGh1IEphbiAxNSAxMzo0Njo0OCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0Yy1oODMwMC5jIChwYXJzZV9yZWcpOiBUYWtlIHRoZSBsZW5ndGggb2YgdGhlIHN5bWJvbCBpbnRvCi0JYWNjb3VudCB3aGVuIGF0dGVtcHRpbmcgdG8gbWF0Y2ggYSByZWdpc3RlciBuYW1lLgotCSogdGMtaDg1MDAuYyAocGFyc2VfcmVnKTogTGlrZXdpc2UuCi0KLVdlZCBKYW4gMTQgMTc6NTI6MzMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jOiBGb3JtYXR0aW5nIGNoYW5nZXMgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KLQotV2VkIEphbiAxNCAxNTo0MTo0MSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogUmV3b3JrIGRpdmlzaW9uIGNvZGUgdG8gYXZvaWQgdW5maWxsZWQKLQlkZWxheSBzbG90LgotCi1XZWQgSmFuIDE0IDE4OjA0OjIwIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gYSBwYXRjaCBmcm9tIEppbSBXaWxzb24KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogUmVtb3ZlIG5vbi1hbnNpIGRlZmF1bHQgY2FzZS4KLQkodGNfZ2VuX3JlbG9jKTogSGFuZGxlIGNyb3NzIHNlY3Rpb24gUEMgcmVsYXRpdmUgcmVsb2NzCi0JY29ycmVjdGx5LgotCi1XZWQgSmFuIDE0IDE1OjAyOjE5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRG9uJ3QgdGVzdCBwaW5mbyBmbGFncyBpZiBJTlNOX01BQ1JPLgotCi1Nb24gSmFuIDEyIDEzOjA0OjU3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmM6ICNpbmNsdWRlIHNldGptcC5oLiAgQ2xlYW4gdXAgcGFzcyBvdmVyIGBzdHJ1Y3QgZm9vJyB1c2FnZS4KLQkoZXhwcl9qbXBfYnVmKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoY2dlbl9wYXJzZV9vcGVyYW5kKTogQWxsb3cgdXNlIG9mIGxvbmdqbXAgaW4gcGFyc2luZyB0byBoYW5kbGUgZXJyb3JzLgotCShjZ2VuX21kX29wZXJhbmQpOiBOZXcgZnVuY3Rpb24uCi0JKiB0Yy1tMzJyLmM6IENsZWFuIHVwIHBhc3Mgb3ZlciBgc3RydWN0IGZvbycgdXNhZ2UuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVXNlIENHRU5fSU5TTl9NTkVNT05JQy4KLQotVHVlIEphbiAgNiAxNTozNjowMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKFNfU0VUX1NFR01FTlQpOiBEb24ndCBzZXQgdGhlIHNlZ21lbnQgZm9yIHNlY3Rpb24gc3ltcy4KLQkoU19JU19FWFRFUk5BTCwgU19JU19MT0NBTCk6IENvcnJlY3QgcGFyZW50aGV0aWNhdGlvbi4KLQotRnJpIEphbiAgMiAxNjowODo1NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IEdpdmUgYW4gZXJyb3IgaWYgdGhlcmUgYXJlCi0JdW5yZWNvZ25pemVkIGNoYXJhY3RlcnMgYWZ0ZXIgYW4gZXhwcmVzc2lvbi4KLQotRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05Njk3CmRpZmYgLS1naXQgYS9nYXMvQ2hhbmdlTG9nLTkyOTUgYi9nYXMvQ2hhbmdlTG9nLTkyOTUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTQ4ZTYuLjAwMDAwMDAKLS0tIGEvZ2FzL0NoYW5nZUxvZy05Mjk1CisrKyAvZGV2L251bGwKQEAgLTEsMTMxMTAgKzAsMCBAQAotU2F0IERlYyAzMCAyMzo0Mjo1MSAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBTaW1wbGlmeS4gIENvcnJlY3RseSBoYW5kbGUgc3ltICsgb2Zmc2V0Ci0JYWRkcmVzc2VzIGZvciBzdGF0aWMgdmFyaWFibGVzLgotCi1UaHUgRGVjIDIxIDEyOjU0OjMyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtYXBwaW5nKTogTWFrZSBAZ290IGdpdmUgYSByZWFsIEdPVCByZWxvY2F0aW9uLAotCWFuZCB4Z290IGdpdmUgdGhlIG9sZCB0b2MxNiByZWxvY2F0aW9uLgotCShtZF9hcHBseV9maXgzKTogU3VwcG9ydCBhbGwgR09UIHJlbG9jYXRpb25zLgotCi1XZWQgRGVjIDIwIDE0OjU3OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogQ29ycmVjdGx5IGhhbmRsZSBhIGNvbnN0YW50IGluCi0JU1ZSNF9QSUMgY2FzZS4gIEZyb20gUmljaGFyZCBLZW5uZXIgPGtlbm5lckB2bHNpMS51bHRyYS5ueXUuZWR1Pi4KLQotRnJpIERlYyAxNSAxNDoyNTowNyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChwYXJzZV9yZWcpOiBSZWNvZ25pemUgU0gzIHJlZ2lzdGVycy4KLQkoZ2V0X3NwZWNpZmljKTogSGFuZGxlIEFfU1NSLCBBX1NQQyBhbmQgQV9SRUdfQi4KLQkoYnVpbGRfTWJ5dGVzKTogSGFuZGxlIFJFR19CLgotCi1GcmkgRGVjIDE1IDE2OjA3OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfYXV4KTogVXNlIG5ldyBiZmRfYmlnX2VuZGlhbiBtYWNyby4KLQotRnJpIERlYyAxNSAxMjoxMTo0OCAxOTk1ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IElmIGxpbmtpbmcsIGVkaXQgQUxMX0NGTEFHUyB0byBDRkxBR1MuCi0KLVRodSBEZWMgMTQgMTU6MDk6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBTZXQgdGhlIHNfYWxpZ24gZmllbGQgdG8KLQl0aGUgbnVtYmVyIG9mIGJ5dGVzLCByYXRoZXIgdGhhbiB0byB0aGUgcG93ZXIgb2YgMi4KLQotVHVlIERlYyAxMiAxMjoxOTozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUQ0xFQU5fSEVSRSk6IE5ldyB2YXJpYWJsZS4KLQkoZGlzdGNsZWFuKTogVXNlIGl0LgotCShtYWludGFpbmVyLWNsZWFuKTogRGVwZW5kIHVwb24gY2xlYW4taGVyZSByYXRoZXIgdGhhbiBjbGVhbiwKLQlkaXN0Y2xlYW4sIGFuZCBjbGVhbi1pbmZvLiAgUnVuIG1ha2UgbWFpbnRhaW5lci1jbGVhbiBpbiBkb2MuCi0JUmVtb3ZlIGZpbGVzIGxpc3RlZCBpbiBESVNUQ0xFQU5fSEVSRS4KLQkqIGRvYy9NYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiBTcGxpdCBvdXQgZnJvbQotCWRpc3RjbGVhbi4gIERlcGVuZCB1cG9uIGNsZWFuLWluZm8gYW5kIGRpc3RjbGVhbi4KLQotTW9uIERlYyAxMSAxNjoyMzo1MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1hYy1hcy5yOiBGaXggY29weXJpZ2h0IGFuZCB2ZXJzaW9uIHN0cmluZ3MuCi0JKGNmcmcpOiBVc2UgUFJPR19OQU1FIGluc3RlYWQgb2YgbGl0ZXJhbCBuYW1lLgotCi1Nb24gRGVjIDExIDE0OjE0OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJZiB0Y191bnJlY29nbml6ZWRfbGluZSBpcyBkZWZpbmVkLAotCWNhbGwgaXQuCi0JKiBjb25maWcvdGMtYTI5ay5oICh0Y191bnJlY29nbml6ZWRfbGluZSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKGEyOWtfdW5yZWNvZ25pemVkX2xpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX29wZXJhbmQpOiBIYW5kbGUgYTI5ayBzdHlsZSBsb2NhbCBkb2xsYXIgbGFiZWxzLgotCi1XZWQgRGVjICA2IDE3OjUyOjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1tdWx0aS5oOiBJZiBPQkpfTUFZQkVfRUxGLCBkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUuCi0KLVR1ZSBEZWMgIDUgMTM6MjY6MzQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19maWxsKTogSWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgaXMgZGVmaW5lZCwgY2FsbAotCWl0LgotCi1Nb24gRGVjICA0IDE1OjEwOjUzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc2l6ZV9zZWN0aW9uLCBmaWxsX3NlY3Rpb24sIGZpeHVwX21kZXBzKToKLQlUcmVhdCByc19hbGlnbl9jb2RlIGxpa2UgcnNfYWxpZ24uCi0KLVN1biBEZWMgIDMgMTY6NDY6NTQgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBjb25maWcvdGMtYXJtLmMgKGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSk6IFNldCBwcmVfaW5jIHdoZW4KLQljb252ZXJ0aW5nIGFuIGFic29sdXRlIGFkZHJlc3MgaW50byBhIFBDLXJlbGF0aXZlIG9uZS4KLQotRnJpIERlYyAgMSAxMTo1Nzo1NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IERvbid0IGFsd2F5cyB1c2UgdGUtZ2VuZXJpYy5oIGZvciBlbXVsYXRpb24uCi0JKHBvd2VycGMtYXBwbGUtbWFjb3MpOiBVc2UgZW11bGF0aW9uIHRlLW1hY29zLmguCi0JKiBtcHctbWFrZS5zZWQgKGluc3RhbGwsIGluc3RhbGwtb25seSk6IEVkaXQgaW4gTWFjLXNwZWNpZmljCi0JaW5zdGFsbCBwcm9jZWR1cmUuCi0KLUZyaSBEZWMgIDEgMTA6NTk6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEltcHJvdmUgbWVzc2FnZSBhYm91dCB1bnN1cHBvcnRlZCBFTEYgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLW04OGsuYyAobTg4a19kb19hbGlnbik6IENvcnJlY3QgY2hlY2sgZm9yIHdoZXRoZXIgZmlsbAotCXBhdHRlcm4gaXMgemVyby4gIEZyb20gTWFuZnJlZCBIb2xsc3RlaW4uCi0KLVRodSBOb3YgMzAgMTM6MjU6NDkgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3BlX3NlY3Rpb24pOiBUbyBnZXQgdGhlIGFsaWdubWVudCByaWdodCBmb3IKLQl0aGUgdmFyaW91cyBpZGF0YSBzZWN0aW9ucywgd2UgY2hlY2sgdGhlIG5hbWUgb24gdGhlIC5zZWN0aW9uIHBzZXVkby4KLQotVGh1IE5vdiAzMCAxMToyMzo0MiAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBJZiBUQ19NODhLIGlzIGRlZmluZWQsIGRvIG5vdAotCWFkZCBzZWN0aW9uJ3MgcGFkZHIgdG8gYWRkX251bWJlcjsgY29tcGF0aWJpbGl0eSB0byBuYXRpdmUgYXMgYW5kCi0JbGQgZm9yYmlkcy4KLQotV2VkIE5vdiAyOSAyMzoxNDoyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBUcmVhdCBtNjhrLXN5c3Y0IGxpa2UgbTY4ay1lbGYsIG5vdCBtNjhrLXN5c3YzLgotCi0JKiBoYXNoLmMgKHN0cnVjdCBoYXNoX2VudHJ5KTogTW92ZWQgaGVyZS4uLgotCSogaGFzaC5oIChzdHJ1Y3QgaGFzaF9lbnRyeSk6IC4uLmZyb20gaGVyZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgZnJlZSBhbmQgY2xlYXIgc3lfb2JqCi0JaWYgaXQncyBhbHJlYWR5IGtub3duIHRvIGJlIG51bGwuCi0KLVdlZCBOb3YgMjkgMTM6MDA6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBEb24ndCBhZGp1c3QgdGhlIHZhbHVlIGZvciAzMgotCWJpdCByZWxvY3MgY29udmVydGVkIHRvIFBDIHJlbGF0aXZlIHJlbG9jcy4gIFRoaXMgdHVybmVkIG91dCB0bwotCWFkZCB0aGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiAudGV4dCB0d2ljZS4KLQotVHVlIE5vdiAyOCAxMDo0MjozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBJbiAncycgY2FzZSwgZnJlZSBzdHJpbmcgZnJvbQotCW9ic3RhY2suCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IFJlbW92ZSB1bnVzZWQgZmllbGQKLQlzeV9uYW1lX29mZnNldC4KLQkqIGNvbmZpZy9vYmotbXVsdGkuaCAoRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTKSBbT0JKX01BWUJFX0VMRl06Ci0JRGl0dG8uCi0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBNYWtlIGJpdGZpZWxkcyB1bnNpZ25lZC4KLQotCSogZXhwci5oIChzdHJ1Y3QgZXhwcmVzc2lvblMpOiBNYWtlIFhfb3AgYW5kIFhfdW5zaWduZWQgYml0ZmllbGRzLAotCWFuZCBtb3ZlIHRoZW0gdG9nZXRoZXIuICBPbiBtb3N0IHN5c3RlbXMgdGhpcyB3aWxsIHJlZHVjZSB0aGUKLQlzdHJ1Y3R1cmUgc2l6ZSBieSBvbmUgd29yZC4KLQkob3BlcmF0b3JUKTogRGVmaW5lIE9fbWF4LgotCSogZXhwci5jIChleHByX2JlZ2luKTogVmVyaWZ5IHRoYXQgWF9vcCBpcyB3aWRlIGVub3VnaCB0byBob2xkCi0JT19tYXguCi0KLQkqIHJlYWQuYyAocG9wX2luc2VydCk6IFByaW50IGVycm9yIHJldHVybmVkIGJ5IGhhc2ggdGFibGUKLQlpbnNlcnRpb24gY29kZS4KLQotCSogYXMuYyAoZHVtcF9zdGF0aXN0aWNzKTogU3BsaXQgb3V0IGZyb20gbWFpbjsgZHVtcCBzb21lIGhhc2gKLQl0YWJsZSBzdGF0cyBhbmQgdGFyZ2V0LXNwZWNpZmljIHN0YXRzLgotCShzdGFydF90aW1lKTogTm8gbG9uZ2VyIGF1dG9tYXRpYyB0byBtYWluLgotCShtYWluKTogU2V0IGZpbGUtbGV2ZWwgc3RhcnRfdGltZSBhbmQgY2FsbCBkdW1wX3N0YXRpc3RpY3MgYXQKLQlleGl0LiAgRXhpdCBieSBjYWxsaW5nIHhleGl0LgotCShzaG93X3VzYWdlKTogTWFrZSAtLXN0YXRpc3RpY3MgZGVzY3JpcHRpb24gbGVzcyBzcGVjaWZpYy4KLQkqIHN1YnNlZ3MuYyAoc3Vic2Vnc19wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogd3JpdGUuYyAod3JpdGVfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBmdW5jdGlvbi4KLQkobl9maXh1cHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShmaXhfbmV3X2ludGVybmFsKTogSW5jcmVtZW50IGl0LgotCSogcmVhZC5jIChyZWFkX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiByZWFkLmggKHJlYWRfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCi0JKiBzeW1ib2wuYyAoc3ltYm9sX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBzeW1ib2wuaCAoc3ltYm9sX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCSogaGFzaC5jIChoYXNoX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBoYXNoLmggKGhhc2hfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaTM4Ni5oIChpMzg2X3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCSh0Y19wcmludF9zdGF0aXN0aWNzKTogTmV3IG1hY3JvLgotCSogbWVzc2FnZXMuYyAoYXNfZmF0YWwsIGFzX2Fzc2VydCwgYXNfYWJvcnQpOiBVc2UgeGV4aXQsIG5vdAotCWV4aXQuCi0KLQkqIGhhc2guYyAoREVMRVRFRCk6IFJld3JpdGUgdG8gdXNlIGEgdmFsaWQgYnV0IHVuaXF1ZSBhZGRyZXNzLgotCShTVEFSVF9QT1dFUik6IFJlZHVjZSB0byAxMC4KLQkoZW51bSBzdGF0X2VudW0pOiBOZXcgZW51bWVyYXRvciwgcmVwbGFjaW5nIFNUQVRfKiBpbmRleCBtYWNyb3MuCi0JQWRkIG5ldyB2YWx1ZXMgZm9yIGNvdW50aW5nIHN0cmNtcCBjYWxscy4KLQkoR1JPV19GQUNUT1IpOiBOZXcgbWFjcm8uCi0JKGhhc2hfZ3Jvdyk6IFVzZSBHUk9XX0ZBQ1RPUi4gIFJld3JpdGUgZm9yIHF1aWNrIHJldHVybnMgaW5zdGVhZAotCW9mIG5lc3RpbmcgYmxvY2tzLgotCShGVUxMX1ZBTFVFKTogTmV3IG1hY3JvLiAgVXNlIDEvNCBvZiB0YWJsZSBzaXplIGluc3RlYWQgb2YgMS8yLgotCShoYXNoX25ldyk6IFVzZSBGVUxMX1ZBTFVFLgotCShzdHJ1Y3QgaGFzaF9jb250cm9sKTogRGVmaW5pdGlvbiBtb3ZlZCBoZXJlLgotCShoYXNoX2NvZGUpOiBEb24ndCBtYXNrIHRvIGxvdyBiaXRzLgotCShoYXNoX2Fzayk6IE1hc2sgcmV0dXJuZWQgaGFzaCBjb2RlIGhlcmUuICBDaGVjayBoYXNoIHZhbHVlIGJlZm9yZQotCWNhbGxpbmcgc3RyY21wOyBjb3VudCBzdHJjbXAgY2FsbHMuCi0JKiBoYXNoLmggKHN0cnVjdCBoYXNoX2NvbnRyb2wpOiBEZWNsYXJlLCBkb24ndCBkZWZpbmUsIGhlcmUuCi0JKEhBU0hfU1RBVExFTkdUSCk6IERlbGV0ZWQuCi0JKHN0cnVjdCBoYXNoX2VudHJ5KTogQWRkIGZpZWxkIGZvciBoYXNoIGNvZGUuCi0JKGhhc2hfc2F5LCBoYXNoX2FwcGx5KTogRG9uJ3QgZGVjbGFyZS4KLQotCSogaGFzaC5jIChkZXN0cm95KTogUmV0dXJuIHZvaWQuCi0JKGFwcGxpY2F0ZWUpOiBEaXR0by4KLQkobWFpbik6IEZpeCBkZWNsYXJhdGlvbnMuCi0JKGhhc2hfYXBwbHkpOiBSZXR1cm4gdm9pZC4gIEFyZ3VtZW50IGBmdW5jdGlvbicgcmV0dXJucyB2b2lkLiAgUHV0Ci0JaW5zaWRlICIjaWZkZWYgVEVTVCIuCi0JKGhhc2hfc2F5KTogRGVmaW5lIG9ubHkgaWYgVEVTVCBpcyBkZWZpbmVkLgotCSogaGFzaC5oIChoYXNoX2FwcGx5LCBoYXNoX3NheSk6IERlY2xhcmF0aW9ucyBkZWxldGVkLgotCi1Nb24gTm92IDI3IDEzOjE4OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi43LgotCi1UdWUgTm92IDIxIDE4OjM5OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCAoQUNfUFJPR19DQyk6IFJlbW92ZSBsb2NhbCBkZWZpbml0aW9uLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi42LgotCi1Nb24gTm92IDIwIDE3OjI2OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZGVidWdfbmFtZV9zZWN0aW9uX3NpemUpOiBSZW1vdmUuCi0JKHBwY19zdGFieCk6IERvbid0IGluY3JlbWVudCBwcGNfZGVidWdfbmFtZV9zZWN0aW9uX3NpemUuCi0JKHBwY19iYyk6IExpa2V3aXNlLgotCShwcGNfZnJvYl9maWxlKTogUmVtb3ZlLgotCSogY29uZmlnL3RjLXBwYy5oICh0Y19mcm9iX2ZpbGUpOiBEb24ndCBkZWZpbmUuCi0JKHBwY19mcm9iX2ZpbGUpOiBEb24ndCBkZWNsYXJlLgotCi1Nb24gTm92IDIwIDEzOjM3OjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVEFSR19DUFVfREVQX2FscGhhKTogTWVudGlvbiBhbHBoYS1vcGNvZGUuaC4KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogSW5jbHVkZSBvbmUtb3BlcmFuZCB2YXJpYW50cyBvZiBqbXAgYW5kCi0JanNyLgotCi0JKiBjb25maWcvdGUtZGVsdDg4Lmg6IFJlbmFtZWQgZnJvbSB0ZS1kZWx0YTg4LmgsIHRvIGF2b2lkIGNvbmZsaWN0Ci0Jd2l0aCB0ZS1kZWx0YS5oIGluIDguMyBmaWxlIHN5c3RlbXMuCi0JKiBjb25maWd1cmUuaW46IEFkanVzdGVkLgotCi1UaHUgTm92IDE2IDEyOjQ5OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc19lcnIpOiBSZW1vdmU7IGp1c3QgdXNlIHRoZSBvbmUgaW4gcmVhZC5jLgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55ICh5eWxleCk6IEluIE1SSSBtb2RlLCAnQCcgY2FuIHN0YXJ0IGFuIG9jdGFsCi0JbnVtYmVyLgotCSogZXhwci5jIChvcGVyYW5kKTogSGFuZGxlIE1SSSBzdWZmaXhlcyBhZnRlciB1bmFkb3JuZWQgMC4KLQotVGh1IE5vdiAxNiAwMDoyMTo0NCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCVZlcnNpb24gMi42IHJlbGVhc2VkLgotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIHRvIDIuNi4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2hhbmdlIHVzZSBvZiBtZF9kb19hbGlnbgotCXRvIHBhc3MgYSBwb2ludGVyIHJhdGhlciB0aGFuIGEgZmlsbCB2YWx1ZSwgdG8gbWF0Y2ggb3RoZXIgdXNlcy4KLQotV2VkIE5vdiAxNSAwMzo1MjowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW5zMzJrLmggKFRDX0ZJWF9UWVBFKTogQWRkIG1pc3Npbmcgc2VtaWNvbG9uLgotCi0JKiBhcy5jIChtYWluKTogTW92ZSBtZF9lbmQgY2FsbCB0byBqdXN0IGFmdGVyIGNhbGwgdG8KLQlwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MuICBEZWxldGUgY3B1LXNwZWNpZmljIGNvZGUgaGVyZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKG1kX2VuZCk6IE5ldyBtYWNybywgY2FsbHMgYnJ0YWJfZW1pdC4KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfZW5kKTogVW51c2VkIGZ1bmN0aW9uIGRlbGV0ZWQuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfZW5kKTogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfYWxpZ25fY29kZSk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaGVyZQotCWZyb20gSEFORExFX0FMSUdOIG1hY3JvLgotCSogY29uZmlnL3RjLWkzODYuaCAoSEFORExFX0FMSUdOKTogQ2FsbCBpdC4KLQotCU1vbiBKdWwgMzEgMTQ6NTM6MTkgMTk5NSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9kb19hbGlnbik6IGNhc3QgZmlsbCBhbmQgMHg5MCB0byBjaGFyCi0gCWJlZm9yZSBjb21wYXJpbmcKLQotCU1vbiBNYXkgIDEgMTA6OTE6NDkgMTk5NSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9kb19hbGlnbik6ICBNYWtlICIuYWxpZ24gbiwweDkwIiBnZW5lcmF0ZQotCW11bHRpLWJ5dGUgbm9wcyB0byBhdm9pZCBjaGFuZ2luZyBnY2MuICBUaGUgbmVjZXNzYXJ5IGdjYyBjaGFuZ2UKLQltaWdodCBicmVhayBvbGQgYXNzZW1ibGVycy4KLQotCVNhdCBBcHIgMjIgMjA6NTM6MDUgMTk5NSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9kb19hbGlnbiwgSEFORExFX0FMSUdOKTogIEFkZCBtYWNyb3MgdG8KLQlnZW5lcmF0ZSBvcHRpbWFsIG11bHRpLWJ5dGUgbm9wIGluc3RydWN0aW9ucyBmb3IgIi5hbGlnbiBuIgotCSIuYWxpZ24gbiwweDkwIiwgYW5kIGFsaWducyByZXF1aXJpbmcgbW9yZSB0aGFuIDE1IGJ5dGVzIG9mCi0JcGFkZGluZyBzdGlsbCBnZW5lcmF0ZSBtdWx0aXBsZSAweDkwJ3MgYXMgYmVmb3JlLgotCi1Nb24gTm92IDEzIDE3OjQwOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc19tcmlfdW50aWwpOiBDYWxsIHBvcF9tcmlfY29udHJvbC4KLQotTW9uIE5vdiAxMyAyMDozOTowNiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocHBjLSotbWFjb3MqLCBwcGMtKi1tcHcqKTogTmV3IGNvbmZpZ3VyYXRpb25zLgotCSogY29uZmlndXJlOiBVcGRhdGUuCi0JKiBtcHctbWFrZS5zZWQ6IFJlb3JkZXIgY29tbWFuZHMgdG8gbWFrZSBzZWQgaGFwcGllci4KLQkqIGNvbmZpZy90ZS1tYWNvcy5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1wcGMuaCAoVEFSR0VUX0ZPUk1BVCk6IFNldCBjb3JyZWN0bHkgZm9yIFBvd2VyTWFjLgotCi1TdW4gTm92IDEyIDIxOjE0OjU2IDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBGaXggb2ZmLWJ5LTIgYnVnIGluIGxlbmd0aCBjaGVjayBmb3IKLQljb25kaXRpb25hbCBicmFuY2hlcy4KLQkobWRfYXBwbHlfZml4KTogTGlrZXdpc2UuCi0KLVRodSBOb3YgIDkgMTY6MTQ6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9hcHBseV9maXgpOiBXYXJuIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0bwotCWdlbmVyYXRlIGEgcmVsb2Mgd2hpY2ggdGhlIGxpbmtlciB3aWxsIG5vdCBoYW5kbGUgY29ycmVjdGx5LiAgRml4Ci0Jb3ZlcmZsb3cgY2hlY2tpbmctLVJfSVJFTCBpcyAxOCBiaXRzLCBub3QgMTcuCi0KLVdlZCBOb3YgIDggMTk6NTk6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IHN1YnRyYWN0IG1kX3BjcmVsX2Zyb20KLQlmcm9tIGEgUEMgcmVsYXRpdmUgcmVsb2MgaWYgVENfQTI5Sy4KLQotCSogY29uZmlnL3RjLWEyOWsuYyAobGluZV9zZXBhcmF0b3JfY2hhcnMpOiBSZXN0b3JlICdAJy4gIEV4aXN0aW5nCi0JY29kZSBkZXBlbmRzIHVwb24gaXQuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX29wZXJhbmQpOiBIYW5kbGUgJGZsb2F0LCAkZG91YmxlLCBhbmQKLQkkZXh0ZW5kLiAgQmFzZWQgb24gY29kZSBmcm9tIEVyaWMgRnJldWRlbnRoYWwKLQk8ZnJldWRlbnRoYWxAbnl1LmVkdT4uCi0JKiBjb25maWcvdGMtYTI5ay5oIChMRVhfRE9MTEFSKTogRGVmaW5lLgotCSogcmVhZC5jIChMRVhfRE9MTEFSKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShsZXhfdHlwZSk6IFVzZSBMRVhfRE9MTEFSLgotCi1XZWQgTm92ICA4IDE2OjM4OjE0IDE5OTUgIEVyaWMgRnJldWRlbnRoYWwgPGZyZXVkZW50aGFsQG55dS5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYTI5ay1ueXUtc3ltMSk6IE5ldyB0YXJnZXQsIGp1c3QgbGlrZSBvdGhlciBhMjlrCi0JdGFyZ2V0cy4KLQotV2VkIE5vdiAgOCAxMTozODo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX2RvdF9maWxlX3N5bWJvbCk6IENhc3QgeG1hbGxvYyByZXR1cm4uCi0KLVR1ZSBOb3YgIDcgMDk6MTQ6MzUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEFkZGVkIEJGRF9SRUxPQ19SVkEuIEN1cnJlbnRseQotCXVzZWQgb25seSBieSAiZGxsdG9vbC5jIi4KLQotTW9uIE5vdiAgNiAxODo1MToyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBVbmRlZmluZSBpbmxpbmUgaWYgbm90IF9fR05VQ19fLgotCShtZF9wc2V1ZG9fdGFibGUpOiBEb24ndCBkZWZpbmUgImV4dGVybiIuCi0KLVNhdCBOb3YgIDQgMDA6NTE6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19iaWVpKTogRm9yY2Ugc3ltYm9sIGludG8gdGV4dF9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3Nob3dfdXNhZ2UpOiBQdXQgYmFja3NsYXNoIGF0IGVuZCBvZiBsaW5lLgotCi1GcmkgTm92ICAzIDEzOjAyOjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWFjcm8uYyAobWFjcm9fZXhwYW5kX2JvZHkpOiBEb24ndCB3YXJuIGFib3V0ID09IHdpdGggYQotCW5vbmV4aXN0ZW50IHBhcmFtZXRlciwgaW4gY2FzZSBpdCBpcyBpbiBhIGNvbW1lbnQgZmllbGQuCi0KLQkqIGFzLmMgKG1haW4pOiBPbiBUQ19BMjlLLCBjYWxsIG1hY3JvX2luaXQgd2l0aCBtYWNyb19hbHRlcm5hdGUKLQlzZXQgdG8gMS4KLQkqIG1hY3JvLmMgKGdldF9hbnlfc3RyaW5nKTogRG9uJ3Qga2VlcCBxdW90ZXMgaWYgbWFjcm9fc3RyaXBfYXQgaXMKLQlzZXQsIGV2ZW4gaWYgbWFjcm9fYWx0ZXJuYXRlIGlzIHNldC4KLQkoZ2V0X2Fwb3N0X3Rva2VuKTogSWYgbWFjcm9fc3RyaXBfYXQsIG9ubHkgc2tpcCBraW5kIGlmIGl0IGlzICdAJy4KLQkoc3ViX2FjdHVhbCk6IElmIG1hY3JvX3N0cmlwX2F0LCBhbmQga2luZCBpcyAnQCcsIGRvbid0IGxvb2sgdXAKLQl0aGUgdG9rZW4gdW5sZXNzIGl0IGVuZGVkIGluICdAJy4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKGxpbmVfc2VwYXJhdG9yX2NoYXJzKTogUmVtb3ZlICdAJy4KLQkqIGRvYy9jLWEyOWsudGV4aTogRG9jdW1lbnQgbWFjcm8gdXNhZ2Ugb24gQTI5Sy4KLQotVGh1IE5vdiAgMiAyMzowNzo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBIYW5kbGUgbmV3ICdXJyBwbGFjZSwgbWVhbmluZyBhCi0Jc2lnbmVkIHdvcmQuCi0JKGluc3RhbGxfb3BlcmFuZCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlY29mZl9kZWJ1Z19wc2V1ZG9fdGFibGUpOiBBZGQgImV4dGVybiIuCi0KLVdlZCBOb3YgIDEgMTU6MTc6MDIgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTg4ay1tb3Rvcm9sYS1zeXN2Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGUtZGVsdGE4OC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFVzZSBtZF9kb19hbGlnbiBpZiBpdCBpcwotCWRlZmluZWQuCi0JKiBjb25maWcvdGMtbTg4ay5oIChTVUJfU0VHTUVOVF9BTElHTik6IERlZmluZS4KLQkobWRfZG9fYWxpZ24pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTg4ay5jOiBJbmNsdWRlICJzdWJzZWdzLmgiLgotCShtODhrX2RvX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBjb25maWcvdGUtZGVsdGEuaCAoU1RSSVBfVU5ERVJTQ09SRSk6IERvbid0IGRlZmluZS4KLQkoQ09GRl9OT0xPQURfUFJPQkxFTSk6IERlZmluZS4KLQkoTE9DQUxfTEFCRUxTX0RPTExBUiwgTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLgotCi1XZWQgTm92ICAxIDE2OjA3OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEZvciBhIGp1bXAgaW5zdHJ1Y3Rpb24gd2l0aAotCW5vbi1jb25zdGFudCB0YXJnZXQsIHJlcXVpcmUgNyBhdmFpbGFibGUgYnl0ZXMgaW4gdGhlIGN1cnJlbnQKLQlmcmFnLCBub3QgNi4KLQotVHVlIE9jdCAzMSAxNTozNzoxNiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmg6IEluY2x1ZGUgYmZkL2VsZi1iZmQuaCByYXRoZXIgdGhhbgotCWJmZC9saWJlbGYuaC4KLQotVHVlIE9jdCAzMSAxNjozNDoyOCAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLSotbGludXgqKTogVXNlIGVjb2ZmLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX2V4dGVybik6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBIYW5kbGUgd2VhayBzeW1ib2xzLgotCShlY29mZl9zZXR1cF9leHQpOiBMaWtld2lzZS4KLQkoZWNvZmZfZnJvYl9zeW1ib2wpOiBXYXJuIGFib3V0IHdlYWsgY29tbW9uIHN5bWJvbHMuCi0JKiBlY29mZi5oIChlY29mZl9kaXJlY3RpdmVfZXh0ZXJuKTogRGVjbGFyZS4KLQkoZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQpOiBEZWNsYXJlLgotCSogc3ltYm9scy5jIChTX0lTX1dFQUspOiBOZXcgZnVuY3Rpb24uCi0JKiBzeW1ib2xzLmggKFNfSVNfV0VBSyk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgImV4dGVybiIgYW5kCi0JIndlYWtleHQiLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19wc2V1ZG9fdGFibGUpOiBSZW1vdmUgImV4dGVybiIuCi0JKHNfZXh0ZXJuKTogUmVtb3ZlLgotCi1UdWUgT2N0IDMxIDEzOjI5OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfbGdsb2JsKTogRG8gdGhlIHJpZ2h0IHRoaW5nLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19iYik6IENhbGwgU0ZfU0VUX1BST0NFU1MuCi0JKHBwY19lYik6IExpa2V3aXNlLiAgU2V0IHRoZSBzdG9yYWdlIGNsYXNzIHRvIENfQkxPQ0ssIG5vdCBDX0ZDTi4KLQkocHBjX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgY2hhbmdlIENfQkxPQ0sgc3ltYm9scyB0byBDX0hJREVYVC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgY2FsbAotCVNBX1NFVF9TWU1fRU5ETkRYIHdpdGggdGhlIGN1cnJlbnQgc3ltYm9sOyBjYWxsIGl0IHdpdGggdGhlIG5leHQKLQlvbmUuICBJZiBPQkpfWENPRkYsIHRyeSB0byBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIHN5bWJvbCBpcyBnb2luZwotCXRvIGJlIGRyb3BwZWQuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJiYyIgYW5kICJlYyIuCi0JKHBwY19zdGFiX3N5bWJvbCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHBwY19jaGFuZ2VfY3NlY3QpOiBDaGVjayB0aGF0IHBwY190b2NfY3NlY3QgaXMgbm90IE5VTEwuCi0JKHBwY19zdGFieCk6IFNldCBwcGNfc3RhYl9zeW1ib2wgYXJvdW5kIGNhbGwgdG8gc3ltYm9sX21ha2UuICBTZXQKLQlzeV90Yy5yZWFsX25hbWUgdG8gdGhlIHN0YWIgc3RyaW5nLgotCShwcGNfYmMsIHBwY19lYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShwcGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKTogSWYgcHBjX3N0YWJfc3ltYm9sIGlzIHNldCwgZG9uJ3QKLQlkbyBhbnl0aGluZy4KLQkocHBjX3N5bWJvbF9uZXdfaG9vayk6IElmIHBwY19zdGFiX3N5bWJvbCBpcyBzZXQsIGRvbid0IGxvb2sgZm9yIGEKLQlzdWZmaXguCi0JKHBwY19mcm9iX3N5bWJvbCk6IFNldCBCU0ZfTk9UX0FUX0VORCBmb3Igc3ltYm9scyB3aXRoIGNzZWN0IGF1eAotCWVudHJpZXMuCi0KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX3B1c2gpOiBSZXNldCBzYl9pbmRleC4KLQotTW9uIE9jdCAzMCAxNzo1Mjo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogRG9uJ3QgY3JlYXRlIGEgZnJhZyBpbiB0aGUgYWJzb2x1dGUKLQlzZWN0aW9uLgotCi1TYXQgT2N0IDI4IDAxOjAyOjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImRhdGEiIGFuZCAidGV4dCIuCi0JKHBwY19jc2VjdCk6IE1vdmUgbW9zdCBvZiB0aGUgY29kZSB0byBwcGNfY2hhbmdlX2NzZWN0LCBhbmQgY2FsbAotCWl0LgotCShwcGNfY2hhbmdlX2NzZWN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgdGFrZW4gZnJvbSBwcGNfY3NlY3QuCi0JKHBwY19zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHBjX3Nhd19hYnMpOiBOZXcgc3RhdGljIHZhcmFibGUuCi0JKHBwY19mcm9iX3N5bWJvbCk6IENyZWF0ZSBhdXggZW50cnkgZm9yIGFic29sdXRlIHN5bWJvbHMuICBXYXJuIGlmCi0JYSBzeW1ib2wgaGFzIG5vIGNzZWN0LgotCShwcGNfYWRqdXN0X3N5bXRhYik6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfYWRqdXN0X3N5bXRhYik6IERlZmluZSBpZiBPQkpfWENPRkYuCi0JKHBwY19hZGp1c3Rfc3ltdGFiKTogRGVjbGFyZSBpZiBPQkpfWENPRkYuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgdGNfYWRqdXN0X3N5bXRhYiBpcyBkZWZpbmVkLAotCWNhbGwgaXQganVzdCBiZWZvcmUgdGhlIGNhbGwgdG8gb2JqX2FkanVzdF9zeW10YWIuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2ZpbmRfb3JfbWFrZSk6IENoYW5nZSBuYW1lIHRvIGJlIGNvbnN0LgotCSogc3ltYm9scy5oIChzeW1ib2xfZmluZF9vcl9tYWtlKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi1UaHUgT2N0IDI2IDE5OjE4OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoQWxpZ24pOiBNZW50aW9uIFNILgotCSogZG9jL2MtbTY4ay50ZXhpIChNNjhLLURpcmVjdGl2ZXMsIC5ldmVuKTogRGVzY3JpYmUgYmVoYXZpb3IsIG5vdAotCS5hbGlnbiB2YWx1ZS4KLQkqIGRvYy9jLXo4ay50ZXhpIChaODAwMCBEaXJlY3RpdmVzLCBnbG9iYWwpOiBGaXggbWlub3IgdHlwby4KLQkoWjgwMDAgRGlyZWN0aXZlcywgZXZlbik6IERvbid0IGdpdmUgbnVtZXJpYyBhbGlnbiB2YWx1ZSwgaW5zdGVhZAotCWV4cGxhaW4gYmVoYXZpb3IuCi0KLVRodSBPY3QgMjYgMTE6NDU6MDMgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiB0Yy1hcm0uYyAoZG9fbGRzdCk6IEFzc2VtYmxlIGxkci9zdHIgcjAsIFtyMV0gYXMgYSBwcmUtaW5jcmVtZW50Ci0JaW5zdHJ1Y3Rpb24uCi0KLVdlZCBPY3QgMjUgMTE6NTk6MjQgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiAgQWxzbyBtYWtlIGluZm8uCi0JKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogIEFsc28gbWFrZSBjbGVhbi1pbmZvLgotCi1UdWUgT2N0IDI0IDE1OjIxOjMzIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIG5ldyAiLm5zdWJzcGEiIG9wY29kZS4KLQkocGFfc3Vic3BhY2UpOiBGb3IgIi5uc3Vic3BhIiwgYWx3YXlzIGNyZWF0ZSBhIG5ldyBzdWJzcGFjZQotCXdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMsIGV2ZW4gaWYgb25lIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlCi0Jc2FtZSBuYW1lLgotCi1UdWUgT2N0IDI0IDE0OjUwOjM4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04pOiBSZW5hbWUgZnJvbQotCVRDX0ZPUkNFX1JFTE9DQVRJT04sIHRha2luZyBhbiBhZGRpdGlvbmFsIHNlY3Rpb24gYXJndW1lbnQuICBJZgotCXRoZSBzZWN0aW9uIG9mIHRoZSB0YXJnZXQgc3ltYm9sIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgY3VycmVudAotCXNlY3Rpb24sIGFsd2F5cyBmb3JjZSB0aGUgcmVsb2NhdGlvbiB0byBiZSB1c2VkLgotCShNRF9QQ1JFTF9GUk9NX1NFQ1RJT04pOiBOZXcgbWFjcm8gdG8gY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogUmVuYW1lIGZyb20gdGhlCi0JbWRfcGNyZWxfZnJvbSBmdW5jdGlvbiwgdGFraW5nIGFuIGFkZGl0aW9uYWwgc2VjdGlvbiBhcmd1bWVudC4KLQlJbnZva2UgVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OIGluc3RlYWQgb2YgVENfRk9SQ0VfUkVMT0NBVElPTi4KLQotCSogd3JpdGUuYyAoVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OKTogRGVmaW5lIGluIHRlcm1zIG9mIHRoZQotCW9sZGVyIFRDX0ZPUkNFX1JFTE9DQVRJT04gaWYgbm90IGRlZmluZWQuCi0JKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IElmIG5vdCBkZWZpbmVkLCBpbnZva2UgbWRfcGNyZWxfZnJvbS4KLQkoZml4dXBfc2VnbWVudCk6IFVzZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04gaW5zdGVhZCBvZgotCW1kX3BjcmVsX2Zyb20sIGFuZCBUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04gaW5zdGVhZCBvZgotCVRDX0ZPUkNFX1JFTE9DQVRJT04uCi0JCi1Nb24gT2N0IDIzIDE2OjIwOjA0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpbnB1dC1zY3J1Yi5jIChhc193aGVyZSk6IFNldCBuYW1lIHRvIG51bGwgcG9pbnRlciBpZiB3ZSBkb24ndAotCWhhdmUgYSBmaWxlIG5hbWUuCi0JKiBtZXNzYWdlcy5jIChpZGVudGlmeSk6IE9ubHkgcHJpbnQgZmlsZW5hbWUgaWYgbm9uLW51bGwuCi0JKGFzX3Nob3dfd2hlcmUpOiBEaXR0bywgZm9yIGxpbmUgbnVtYmVyIHRvby4KLQkoYXNfd2Fybl9pbnRlcm5hbCwgYXNfYmFkX2ludGVybmFsKTogRGl0dG8uCi0KLQkqIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9vcGVuKTogSWYgdGhlIGlucHV0IGZpbGUgY2FuJ3QgYmUKLQlvcGVuZWQsIGNvbnNpZGVyIGl0IGFuIGVycm9yLgotCi1Nb24gT2N0IDIzIDExOjE1OjQ0IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHBhc2FuZGEuY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBBZGRlZCBtaXBzXzQxMDAgY29udHJvbCwgYW5kIHN1cHBvcnQgZm9yCi0gCWFjY2VwdGluZyB0aGUgNDEwMCBhcyBhIE1JUFMgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgKG1kX2JlZ2luLAotIAltYWNyb19idWlsZCwgbWlwc19pcCwgbWRfcGFyc2Vfb3B0aW9uKS4gQWRkaW5nIHN1aXRhYmxlCi0gCWNvbW1hbmQtbGluZSBPUFRJT05zLCBhbmQgdXBkYXRpbmcgdGhlIGhlbHAgdGV4dCAobWRfc2hvd191c2FnZSkuCi0JCi1XZWQgT2N0IDE4IDEzOjIwOjMyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19iZWdpbik6IE9ubHkgc2V0IGFic29sdXRlX2ZyY2hhaW4uZml4Xyogd2hlbgotCUJGRF9BU1NFTUJMRVIgaXMgZGVmaW5lZC4KLQotCSogVXNlIG9uZSBhY3RpdmUgZnJhZyBhbmQgb25lIG9ic3RhY2sgcGVyIGZyYWcgY2hhaW46Ci0JKiBmcmFncy5jIChmcmFncyk6IFZhcmlhYmxlIGRlbGV0ZWQuCi0JKGZyYWdfYWxsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKGZyYWdfZ3JvdywgZnJhZ19tb3JlLCBmcmFnX3ZhcmlhbnQsIGZyYWdfbm93X2ZpeCwKLQlmcmFnX2FwcGVuZF8xX2NoYXIpOiBSZWZlciB0byBmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrIGluc3RlYWQgb2YKLQlmcmFncyB2YXJpYWJsZS4KLQkoZnJhZ19uZXcpOiBEaXR0by4gIFZlcmlmeSB0aGF0IGZyY2hfbGFzdCBhbmQgZnJhZ19ub3cgbWF0Y2ggb24KLQllbnRyeSBhbmQgZXhpdCwgYW5kIHRoYXQgb2xkIGZyYWdfbm93IGhhcyBub24temVybyB0eXBlLiAgUmVwbGFjZQotCSJrbm93IiB1c2VzIHdpdGggImFzc2VydCIuICBVc2UgZnJhZ19hbGxvYyBpbnN0ZWFkIG9mIG11Y2tpbmcgd2l0aAotCW9ic3RhY2sgYWxpZ25tZW50LgotCSogZnJhZ3MuaCAoZnJhZ3MpOiBEZWNsYXJhdGlvbiBkZWxldGVkLgotCSogc3Vic2Vncy5oIChzdHJ1Y3QgZnJjaGFpbik6IEFkZCBuZXcgZmllbGQgZnJjaF9mcmFnX25vdy4KLQkqIHN1YnNlZ3MuYyAoZnJjaGFpbnMsIGR1bW15X2ZyYWcsIGFic29sdXRlX2ZyY2hhaW4pOiBOZXcgc3RhdGljCi0JdmFyaWFibGVzLgotCShzdWJzZWdzX2JlZ2luKTogSW5pdGlhbGl6ZSBmcmNoYWlucyBvYnN0YWNrLiAgVW5kZXIgZ2NjLCBkb24ndAotCWdpdmUgaXQgYW55IHN0cmljdGVyIGFsaWdubWVudCB0aGFuIGZyY2hhaW5TIHN0cnVjdHVyZXMgbmVlZC4gIERvCi0Jbm90IGluaXRpYWxpemUgZnJhZ3Mgb2JzdGFjay4gIFNldCBmcmFnX25vdyB0byBwb2ludCB0bwotCWR1bW15X29ic3RhY2suICBJbml0aWFsaXplIGFic29sdXRlX2ZyY2hhaW4uCi0JKHN1YnNlZ19zZXRfcmVzdCk6IFNhdmUgYW5kIHJlc3RvcmUgZnJhZ19ub3cgaW4gZnJjaF9mcmFnX25vdwotCWZpZWxkIG9mIGZyY2hhaW5TLiAgRG9uJ3QgY3JlYXRlIG5ldyBmcmFncyBvbiBzZWN0aW9uIHN3aXRjaCwgYW5kCi0JdXNlIGZyYWdfYWxsb2Mgd2hlbiBjcmVhdGluZyBhIG5ldyBmcmFnIGNoYWluLiAgRm9yIGFic29sdXRlCi0Jc2VjdGlvbiwgc2V0IGZyY2hhaW5fbm93IHRvIGFic29sdXRlX2ZyY2hhaW4uICBWZXJpZnkgdGhhdAotCWZyY2hfbGFzdCBhbmQgZnJhZ19ub3cgbWF0Y2ggb24gZW50cnkgYW5kIGV4aXQuICBJbml0aWFsaXplCi0JcGVyLWNoYWluIG9ic3RhY2ssIGFuZCB1bmRlciBnY2MsIHNldCByZXF1aXJlZCBhbGlnbm1lbnQgdG8gdGhhdAotCW5lZWRlZCBieSBmcmFnUyBzdHJ1Y3R1cmUuCi0KLQkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBWZXJpZnkgZnJfdHlwZSBpcyBub256ZXJvLgotCi0JKiBzdGFicy5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogT25seSBjb3B5IGlucHV0IHN0cmluZyBpZiBhCi0JZnJlc2ggY29weSBpcyBuZWVkZWQsIG5vdCBpZiB0aGUgc2VjdGlvbiBhbHJlYWR5IGV4aXN0cy4KLQkoc19zdGFiX2dlbmVyaWMpOiBDYWNoZSBzdGFiIHNlY3Rpb24gbmFtZSB0byBieXBhc3MgbG9va3Vwcywgc2luY2UKLQl1c3VhbGx5IGl0IHdpbGwgbWF0Y2guICBDb3VsZCBiZSBtYWRlIGZhc3RlciBzdGlsbCBieSBjaGFuZ2luZyB0aGUKLQltZW1vcnkgYWxsb2NhdGlvbiBydWxlcy4KLQkoc194c3RhYik6IENhY2hlIHNlY3Rpb24gbmFtZSB0byBieXBhc3MgcmVwZWF0ZWQgc3RyaW5nCi0JYWxsb2NhdGlvbi4KLQotCSogZnJhZ3MuYyAoZnJhZ19uZXcpOiBEZWxldGVkIHJlZ2lzdGVyIGRlY2xhcmF0aW9ucy4KLQotCSogbGlzdGluZy5jIChmcmFnX25vdyk6IERvbid0IGRlY2xhcmUuCi0KLQkqIGFzLmMgKGNodW5rc2l6ZSk6IE5ldyB2YXJpYWJsZS4KLQkoZGVidWdfbWVtb3J5KTogTmV3IHZhcmlhYmxlLgotCShtYWluKTogSWYgZGVidWdfbWVtb3J5IGlzIHNldCwgcmVkdWNlIGNodW5rc2l6ZSBhbmQKLQlfYmZkX2NodW5rc2l6ZS4KLQkqIGFzLmggKGNodW5rc2l6ZSk6IERlY2xhcmUgaXQuCi0JKiByZWFkLmMgKHJlYWRfYmVnaW4pOiBVc2UgaXQuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG9ydG9wdHMpOiBJbmNsdWRlICdnJy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSWdub3JlIGl0LgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIE1ha2VmaWxlIGFuZCBjb25maWcuc3RhdHVzIGZyb20KLQl0ZXN0c3VpdGUgZGlyZWN0b3J5LgotCShjbGVhbi1oZXJlKTogRG9uJ3QgZGVsZXRlIHRlc3RzdWl0ZS4gIEluc3RlYWQsIGRlbGV0ZSBvbmx5IHRoZQotCWZpbGVzIHdpdGhpbiBpdCB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZCBieSBydW5uaW5nIHRlc3RzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbik6IENhbGwKLQlmcmFnX25vd19maXggaW5zdGVhZCBvZiBhY2Nlc3Npbmcgb2JzdGFjayBpbmZvIGRpcmVjdGx5LgotCSogY29uZmlnL3RjLWFybS5jIChzX2x0b3JnKTogRGl0dG8uCi0JKG1kX2Fzc2VtYmxlKTogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQ2FsbCBmcmFnX2dyb3cgaW5zdGVhZCBvZgotCW9ic3RhY2tfcm9vbS4KLQotV2VkIE9jdCAxOCAxMjoyMjo1OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoYW91dF9wcm9jZXNzX3N0YWIpOiBJbnNlcnQgZGVidWcgc3ltYm9sIGludG8gc3ltYm9sCi0JY2hhaW4gYWZ0ZXIgcGFyc2luZyB2YWx1ZSBleHByZXNzaW9uLCBpZiBhbnksIHRvIGF2b2lkIHNlcGFyYXRpbmcKLQljb250aW51ZWQgLnN0YWJzIGxpbmVzLgotCi1Nb24gT2N0IDE2IDEwOjU2OjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lbGZfcHNldWRvX3RhYmxlKTogUmVtb3ZlLgotCShtaXBzX3BvcF9pbnNlcnQpOiBEb24ndCBjYWxsIHBvcF9pbnNlcnQgb24gbWlwc19lbGZfcHNldWRvX3RhYmxlLgotCi1Nb24gT2N0IDE2IDA3OjA3OjM3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYmVnaW4pOiBVc2UgbmV3IGZsYWdzIFBQQ19PUENPREVfQ09NTU9OIGZvcgotCS1tY29tIHN1cHBvcnQgYW5kIFBQQ19PUENPREVfQU5ZIGZvciAtbWFueS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogRGl0dG8uCi0JKHBwY19hcmNoKTogRGl0dG8uCi0JKG1kX2JlZ2luKTogRm9yIGR1cGxpY2F0ZSBpbnN0cnVjdGlvbnMsIHByaW50IGFsbCBkdXBsaWNhdGVzCi0JYmVmb3JlIGFib3J0aW5nLgotCi1TdW4gT2N0IDE1IDIyOjA2OjE0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IFN1cHBvcnQgZm9yIC1tY29tIHRvIHR1cm4gb24KLQljb21tb24gbW9kZSBvcGVyYXRpb24uCi0JKG1kX3Nob3dfdXNhZ2UpOiBBZGQgLW1jb20gdG8gdXNhZ2UgbWVzc2FnZS4KLQotRnJpIE9jdCAxMyAxMzozMjo0NSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBleHByLmMgKG9wX3JhbmspOiBBZGQgT19zeW1ib2xfcnZhLgotCSogZXhwci5oIChvcGVyYXRvclQpOiBBZGQgT19zeW1ib2xfcnZhLgotCSogcmVhZC5jIChjb25zX3dvcmtlcik6IFNldCBPX3N5bWJvbF9ydmEgd2hlbiBuZWNlc3NhcnkuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IFVuZGVyc3RhbmQgT19zeW1ib2xfcnZhLgotCi1UdWUgT2N0IDEwIDExOjM0OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogQ29ycmVjdCBzX2NvbnMgYXJndW1lbnRzLiAgRnJvbSBNaWNoYWVsCi0JSm9vc3RlbiA8am9vc3RAb3JpLmNhZGxhYi5kZT4uCi0KLU1vbiBPY3QgIDkgMTk6NTk6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19tYWNybyk6IE1ha2UgY291bnQgdW5zaWduZWQuCi0JKHBwY19iaWVpKTogU2V0IHNlZ21lbnQgdG8gbm93X3NlZyBhbmQgdmFsdWUgdG8gY29mZl9uX2xpbmVfbm9zLgotCShwcGNfZnJvYl9zeW1ib2wpOiBIYW5kbGUgQ19CSU5DTCBhbmQgQ19FSU5DTCBzeW1ib2xzIGJ5IHNldHRpbmcKLQl0aGUgZml4X2xpbmUgZmllbGQuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9uX2xpbmVfbm9zKTogUmVuYW1lIGZyb20gbl9saW5lX25vcywgYW5kCi0JbWFrZSBub24tc3RhdGljLiAgQ2hhbmdlIGFsbCB1c2Vycy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmX25fbGluZV9ub3MpOiBEZWNsYXJlLgotCi1GcmkgT2N0ICA2IDE2OjI0OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLmluIChBQ19BUkdfV0lUSChiZmQtYXNzZW1ibGVyKSk6IEZpeCBoZWxwIG1lc3NhZ2UuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogQ29udmVydCBzcGVjaWZpZWQgYnl0ZQotCWFsaWdubWVudCB0byBwb3dlciBvZiB0d28uICBTZXQgc2l6ZSBvZiBsb2NhbCBic3Mgc3ltYm9sLgotCi0JKiBjb25maWcvdGMtbTY4ay5jICh0Y19nZW5fcmVsb2MpOiBGaXggdHlwbyBpbiB2YXJpYWJsZSBuYW1lLgotCi1GcmkgT2N0ICA2IDE1OjIyOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2IuYywgbWFjcm8uYzogRGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSA8c3RyaW5nLmg+IG9yCi0JPHN0cmluZ3MuaD4ganVzdCBhcyBhcy5oIGRvZXMuCi0KLUZyaSBPY3QgIDYgMDk6NTU6MzMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHNpdGUuZXhwKTogRml4IHNldHRpbmcgb2YgJHNyY2Rpci4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hdG9mKTogRml4IGxpdHRsZS1lbmRpYW4gb3V0cHV0LgotCSogY29uZmlnL3RjLWFybS5oIChBUk1fQklfRU5ESUFOKTogTW92ZSBkZWZpbml0aW9uIHNvIGRlZmluZWQgZm9yCi0JYWxsIGNvZmYgdGFyZ2V0cy4KLQotVGh1IE9jdCAgNSAyMDoxNzozMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IFNwbGl0IG91dCB0aGUgTlMzMmsgZmFtaWx5IGRvY3VtZW50YXRpb24sCi0JZGVzcGl0ZSBpdHMgYmVpbmcgY29tbWVudGVkIG91dCBmb3Igbm93LgotCSogZG9jL2MtbnMzMmsudGV4aTogTmV3IGZpbGUuCi0KLQkqIHNiLmMsIG1hY3JvLmM6IEluY2x1ZGUgc3RyaW5nLmguCi0KLQkqIE1ha2VmaWxlLmluIChjb21wYXJpc29uKTogT25seSBjaGVjayAqLm87IHdlIGRvbid0IGNhcmUgaWYKLQl0aW1lc3RhbXBzIGluc2VydGVkIGJ5IHRoZSBuYXRpdmUgbGlua2VyIGRpZmZlci4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2FsaWduKTogT25seSBmaWxsIHdpdGggYSBuby1vcCBwYXR0ZXJuCi0JaWYgYWxpZ25tZW50IHN0cmljdGVyIHRoYW4gNCBieXRlcyBpcyByZXF1ZXN0ZWQ7IGluIHRoYXQgY2FzZSwKLQlhbGlnbiB0byBhIDQtYnl0ZSBib3VuZGFyeSBmaXJzdC4KLQotCVRodSBTZXAgMjggMTk6MzU6MjcgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19SU1lNX1BhcnNlKTogZWxpbWluYXRlICJtaWdodCBiZSB1c2VkCi0JdW5pbml0aWFsaXplZCIgd2FybmluZyBmb3IgYE1heF9Tb3VyY2VfT2Zmc2V0Jy4KLQotV2VkIE9jdCAgNCAxNjoxNzowMiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwYXJzZV90b2NfZW50cnkpOiBOZXcgZnVuY3Rpb24gdG8gcGFyc2UgW3RvY10KLQlxdWFsaWZpZXJzIGFuZCBkZXRlY3QgZXJyb3JzIGlmIHByZXNlbnQuCi0JKG1kX2Fzc2VtYmxlKTogQWRkIGNhbGwgdG8gcGFyc2VfdG9jX2VudHJ5LiBBbHNvIGFkZGVkIHNvbWUgc3VwcG9ydAotCWZvciB0aGUgW3RvY3ZdIHF1YWxpZmllci4KLQkocHBjX3BlX3RvY2QpOiBOZXcgZnVuY3Rpb24gdG8gc3VwcG9ydCBkYXRhIGluIHRoZSB0b2Mgc2VjdGlvbi4KLQotV2VkIE9jdCAgNCAxNDowMzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgY3JlYXRlIGFuIGF1eCBlbnRyeSBmb3IKLQlhbiBhYnNvbHV0ZSBzeW1ib2wuCi0KLVR1ZSBPY3QgIDMgMTI6MTg6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpc3dvcmQpOiBBY2NlcHQgYWxsIHZhbHVlcyBmcm9tIC02NTUzNiB0bwotCSs2NTUzNSwJc28gflZBTCB3aWxsIG5vdCBiZSByZWplY3RlZC4KLQotCSogY29uZC5jIChzX2VuZGlmKTogQ2FsbCBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLiAgSW4gTVJJIG1vZGUsCi0Jc2tpcCBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBwc2V1ZG8tb3AuCi0JKHNfZWxzZSk6IExpa2V3aXNlLgotCSogcmVhZC5jIChnZXRfbGluZV9zYik6IERvbid0IGxvb2sgcGFzdCBidWZmZXJfbGltaXQuCi0JKHNfaW5jbHVkZSk6IEluIE1SSSBtb2RlLCBza2lwIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGZpbGUgbmFtZS4KLQotTW9uIE9jdCAgMiAxNjoxNToyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKG02OGtfcmVnX3BhcnNlKTogSW4gTVJJIG1vZGUsIHBlcm1pdAotCXBlcmlvZHMgaW4gcmVnaXN0ZXIgbmFtZXMuCi0KLVNhdCBTZXAgMzAgMjM6MDM6MzEgMTk5NSAgSmVmZiBMYXcgIChsYXdAaHVybC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9hZGp1c3RhYmxlKTogRFAgcmVsYXRpdmUgcmVsb2NzCi0JYXJlIG5vdCBhZGp1c3RhYmxlIGluIFNPTSB0byBhdm9pZCBjb25mdXNpbmcgdGhlIG9wdGltaXppbmcKLQlsaW5rZXIuCi0KLUZyaSBTZXAgMjkgMTU6MTg6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIHNvbWUgc3VwcG9ydCBmb3IgaTk2MCBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLgotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIGVuZGlhbi4KLQkoZ2V0X2FyZ3MpOiBEb24ndCBkaXNjYXJkIGEgc3BhY2UgYmV0d2VlbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KLQkoZ2V0X2NkaXNwKTogQ2hhbmdlIHRleHRfc2VjdGlvbiB0byBub3dfc2VnLgotCShzX2VuZGlhbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaTk2MC5oIChNUklfTU9ERV9ORUVEU19QU0VVRE9fRE9UKTogRGVmaW5lLgotCSogZXhwci5oIChvcGVyYXRvclQpOiBBZGQgT19sb2dpY2FsX25vdCwgT19sb2dpY2FsX2FuZCwgYW5kCi0JT19sb2dpY2FsX29yLgotCSogZXhwci5jIChvcGVyYW5kKTogVHJlYXQgJyEnIGFzIGxvZ2ljYWwgbm90IG9wZXJhdG9yLiAgSWYKLQlUQ19JOTYwLCBpbiBNUkkgbW9kZSBwZXJtaXQgYHNpemVvZiBzZWNuYW1lJyBhbmQgYHN0YXJ0b2YKLQlzZWNuYW1lJy4KLQkob3BfcmFuayk6IEJ1bXAgdmFsdWVzIGJ5IDIgdG8gbWFrZSByb29tIGZvciAmJiBhbmQgfHwuICBBZGQKLQllbnRyaWVzIGZvciAhLCAmJiwgYW5kIHx8LgotCShleHByX2JlZ2luKTogT25seSBkbyBNUkkgY2hhbmdlcyBpZiBUQ19NNjhLLgotCShvcGVyYXRvcik6IFJlY29nbml6ZSB8fCBhbmQgJiYuCi0JKGV4cHIpOiBIYW5kbGUgbmV3IG9wZXJhdG9yVCB2YWx1ZXMuCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIG5ldyBvcGVyYXRvclQgdmFsdWVzLgotCShwcmludF9leHByXzEpOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBkZWJ1ZywgZXJyLCBpcmVwLCBpcmVwYywgcHJpbnQsIHB1cmdlbSwKLQlhbmQgcmVwLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBIYW5kbGUgTVJJX01PREVfTkVFRFNfUFNFVURPX0RPVC4KLQkobXJpX2NvbW1lbnRfZmllbGQpOiBPbmx5IGhhbmRsZSB3ZWlyZCBjb21tZW50cyBpZiBUQ19NNjhLLgotCShzX2Vycik6IE5ldyBmdW5jdGlvbi4KLQkoc19vcmcpOiBPbmx5IHB1bnQgaW4gTVJJIG1vZGUgaWYgVENfTTY4Sy4KLQkoc19tcmlfc2VjdCk6IFdyaXRlIFRDX0k5NjAgdmVyc2lvbi4KLQkoc19wcmludCwgc19wdXJnZW0pOiBOZXcgZnVuY3Rpb25zLgotCSogcmVhZC5oIChzX2Vyciwgc19wcmludCwgc19wdXJnZW0pOiBEZWNsYXJlLgotCSogY29uZC5jIChzX2lmZXFzKTogSW1wbGVtZW50LgotCShpZ25vcmVfaW5wdXQpOiBIYW5kbGUgTVJJX01PREVfTkVFRFNfUFNFVURPX0RPVC4KLQkqIG1hY3JvLmMgKG1hY3JvX3N0cmlwX2F0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWFjcm9faW5pdCk6IEFkZCBzdHJpcF9hdCBwYXJhbWV0ZXIuCi0JKGRvX2Zvcm1hbHMpOiBJZiBtYWNyb19zdHJpcF9hdCwgY2hhbmdlIE5BUkcgdG8gJE5BUkcuCi0JKGRlZmluZV9tYWNybyk6IFNraXAgYSBjb21tYSBhZnRlciB0aGUgbWFjcm8gbmFtZS4KLQkoZ2V0X2Fwb3N0X3Rva2VuKTogU2tpcCBjaGFyYWN0ZXIgaWYgbWFjcm9fc3RyaXBfYXQsIGV2ZW4gaWYKLQltYWNyb19tcmkuCi0JKG1hY3JvX2V4cGFuZF9ib2R5KTogSWYgbWFjcm9fc3RyaXBfYXQsIGRvbid0IHJlY29nbml6ZSBwYXJhbWV0ZXJzCi0JaW4gc3RyaW5ncyB1bmxlc3MgdGhleSBhcmUgcHJlY2VkZWQgYnkgYW4gJ0AnLiAgSWYgbWFjcm9fc3RyaXBfYXQsCi0JcGFzcyAnQCcgYXMgc3RyaXAgY2hhcmFjdGVyIHRvIHN1Yl9hY3R1YWwuICBJZiBtYWNyb19zdHJpcF9hdCwKLQlzdHJpcCAnQCcgY2hhcmFjdGVycy4KLQkobWFjcm9fZXhwYW5kKTogSWYgbWFjcm9fc3RyaXBfYXQsIGNoYW5nZSBOQVJHIHRvICROQVJHLgotCShkZWxldGVfbWFjcm8pOiBOZXcgZnVuY3Rpb24uCi0JKGV4cGFuZF9pcnApOiBTa2lwIGxlYWRpbmcgYW5kIHRyYWlsaW5nICciJyBjaGFyYWN0ZXJzIGlmIGlycGMuCi0JKiBtYWNyby5oIChtYWNyb19pbml0KTogTWVudGlvbiBuZXcgc3RyaXBfYXQgcGFyYW1ldGVyLgotCShkZWxldGVfbWFjcm8pOiBEZWNsYXJlLgotCSogYXMuYyAobWFpbik6IElmIFRDX0k5NjAsIHBhc3MgZmxhZ19tcmkgdG8gbWFjcm9faW5pdCBhcwotCXN0cmlwX2F0OyBvdGhlcndpc2UsIHBhc3MgMC4KLQkqIGdhc3AuYyAocHJvY2Vzc19wc2V1ZG9fb3ApOiBQYXNzIDAgdG8gbWFjcm9faW5pdCBhcyBzdHJpcF9hdC4KLQkobWFpbik6IExpa2V3aXNlLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IGk5NjAgTVJJIG1vZGUuCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBNZW50aW9uIC0tZGVmc3ltLgotCi1UaHUgU2VwIDI4IDE5OjI1OjA0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogVHJhbnNsYXRlICJwb3dlcnBjIiBpbnRvICJwcGMiLCByZW1vdmUgZ2VuIG9mCi0JVkVSU0lPTiwgbW92ZSBnZW4gb2YgImNvbmYiIGhlcmUgZnJvbSBtYWtlZmlsZS4KLQkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIHNlZCBjb21tYW5kcyB0byB0cmFuc2xhdGUgVW5peCBtYWtlZmlsZQotCWludG8gTVBXIHN5bnRheC4KLQkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCi0JKiBtYWMtYXMucjogTmV3IGZpbGUsIE1hYyByZXNvdXJjZSBmaWxlLgotCSogYXMuaCAoaW5saW5lKTogRG9uJ3QgZGVjaWRlIGFib3V0IGRlZmluaW5nIGlmIF9fTVdFUktTX18sCi0JcmVtb3ZlIHJlZHVuZGFudCBjb25kaXRpb25hbCBhbmQgZGVmaW5pdGlvbi4KLQotCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBGaXggc3ludGF4IGZvciBPQkpfUFJPQ0VTU19TVEFCLgotCi1UaHUgU2VwIDI4IDE1OjQzOjE1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IFJlbW92ZWQgc29tZSBURV9QRSBzcGVjaWZpYyAKLQltYW5pcHVsYXRpb25zLCBzaW5jZSBJIGNhbid0IHByb3ZlIHRoZXkncmUgbmVlZGVkLgotCShtZF9iZWdpbik6IFJlbW92ZWQgaW5pdF9yZWd0YWJsZSwgaW5zZXJ0X3JlZywgYW5kIHRoZSBjYWxsIHBvaW50cy4KLQkocmVnaXN0ZXJfbmFtZSk6IE5ldyBmdW5jdGlvbi4gUGFyc2VzIGEgcmVnaXN0ZXIgbmFtZSwgaWYgYXBwcm9wcmlhdGUuCi0JKG1kX2Fzc2VtYmxlKTogQWRkZWQgY2FsbCB0byByZWdpc3Rlcl9uYW1lIHRvIGhhbmRsZSBzeW1ib2xpYyBuYW1lcy4KLQkocHBjX3BlX3NlY3Rpb24pOiBSZW1vdmVkIGFsbCBkdXBsaWNhdGUgSU1BR0UgZGVmaW5lcywgYW5kIGluY2x1ZGUKLQljb2ZmL3BlLmggaW5zdGVhZC4KLQotVGh1IFNlcCAyOCAxMjowOToxOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZml4X2FkanVzdGFibGUpOiBEZWZpbmUuCi0JKHBwY19wZV9maXhfYWRqdXN0YWJsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19wZV9maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQotVGh1IFNlcCAyOCAwMToxMTo1OCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaCAoVEFSR0VUX0ZPUk1BVCk6IERlZmluZSBmb3IgYXJtLWNvZmYuCi0KLVdlZCBTZXAgMjcgMTI6NTM6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKFNfSVNfTE9DQUwpOiBBbGwgc3ltYm9scyBpbiByZWdfc2VjdGlvbiBhcmUgbG9jYWwuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoT0JKX1hDT0ZGKTogRGVmaW5lIGlmIE9CSl9DT0ZGIGFuZCBub3QgVEVfUEUuCi0JQ2hhbmdlIE9CSl9DT0ZGIGNoZWNrcyB0byBjaGVjayBPQkpfWENPRkYgaW5zdGVhZC4KLQkoVEFSR0VUX0ZPUk1BVCk6IEZ1bGx5IHBhcmVudGhlc2l6ZS4KLQkoTEVYX1FNKTogRGVmaW5lIGlmIFRFX1BFLgotCSogY29uZmlnL3RjLXBwYy5jOiBSZXBsYWNlIE9CSl9DT0ZGIGJ5IE9CSl9YQ09GRiB0aHJvdWdob3V0LgotCVJlbW92ZSBjaGVja3Mgb2YgVEVfUEUgd2l0aGluICNpZmRlZiBPQkpfWENPRkYgc2VjdGlvbnMuCi0JKGluaXRfcmVndGFibGUpOiBNYWtlIGkgdW5zaWduZWQuCi0JKHBwY19zZXRfY3VycmVudF9zZWN0aW9uKTogUmVuYW1lIGZyb20gc2V0Q3VycmVudFNlY3Rpb24uICBDaGFuZ2UKLQlhbGwgY2FsbGVycy4KLQkocHBjX2FyY2gpOiBSZXR1cm4gYWZ0ZXIgYXNfZmF0YWwgdG8gYXZvaWQgZ2NjIHdhcm5pbmcuCi0JKG1kX2Fzc2VtYmxlKTogT25seSBkZWNsYXJlIHJlbG9jIGlmIE9CSl9FTEYuICBBZGQgZGVmYXVsdCB0bwotCXN3aXRjaCBvbiBmaXh1cHNbaV0ucmVsb2MgdG8gYXZvaWQgZ2NjIHdhcm5pbmcuCi0JKElNQUdFX1NHTl9MTktfT1RIRVIpOiBGaXggbmVzdGVkIGNvbW1lbnQuCi0JKHBwY19wZV9mdW5jdGlvbik6IERvbid0IGNhbGwgcHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZS4KLQkocHBjX2Zyb2Jfc3ltYm9sKTogUmVtb3ZlIFRFX1BFIHNlY3Rpb24gY2hlY2tzLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFJldHVybiBhZnRlciBhYm9ydCB0byBhdm9pZCBnY2MKLQl3YXJuaW5nLgotCShtZF9hcHBseV9maXgzKTogQWRkIEJGRF9SRUxPQ18xNl9HT1RfUENSRUwgdG8gc3dpdGNoLgotCSogcmVhZC5jIChMRVhfUU0pOiBEZWZpbmUgYXMgMCBpZiBub3QgZGVmaW5lZC4KLQkobGV4X3R5cGUpOiBVc2UgTEVYX1FNIGZvciAnPycuCi0KLQkqIGNvbmZpZ3VyZS5pbjogTm8gbmVlZCB0byBjaGVjayB3aGV0aGVyICR7Y3B1X3R5cGV9IGlzIHBvd2VycGM7Ci0JaXQgbmV2ZXIgd2lsbCBiZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIFNlcCAyNyAxMTozMzozOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IFJlbW92ZSBTZXAgMjYgY2hhbmdlcyB0byB0aGlzCi0JZnVuY3Rpb24sIGtlZXBpbmcgb3RoZXIgU2VwLiAyNiBjaGFuZ2VzLgotCi1XZWQgU2VwIDI3IDEwOjI5OjEzIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+Ci0KLQkqIGNvbmZpZ3VyZSAoZW11bGF0aW9ucyk6IEFkZGVkIHN1cHBvcnQgZm9yIHBwY2xlLSotW3BlfHdpbm50XQotCSh0YXJnZXRfZnJhZyk6IFJlbW92ZWQgYW4gZXh0cmFuZW91cyBQUEMgZGVmaW5pdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IFNhbWUKLQkqIGNvbmZpZy90Yy1wcGMuaDoKLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogQmFzZSBzdXBwb3J0IGZvciBuZXcgb3IgYWx0ZXJlZAotCXBzZXVkbyBvcHMgLSA8cHJldmlvdXMsIHBkYXRhLCB5ZGF0YSwgcmVsZGF0YSwgcmRhdGEsIHVhbG9uZywgem5vcCwKLQlzZWN0aW9uLCBjb21tLCBmdW5jdGlvbj4gVGhlcmUgd2lsbCBiZSBtb3JlLgotCShwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBQcmVkZWZpbmVkIHJlZyB0YWJsZSB0byBuYW1lIHJlZ2lzdGVycywgZXRjCi0JKG1kX2JlZ2luKTogU2V0dXAgcmVnIHRhYmxlIGluaXRpYWxpemF0aW9uCi0JKG1kX2Fzc2VtYmxlKTogSW5pdGlhbCBbdG9jXXgocnRvYykgc3VwcG9ydAotCShwcGNfZnJvYl9sYWJlbCk6IFJlbW92ZWQgc29tZSB4Y29mZiBzcGVjaWZpYyBwcm9jZXNzaW5nIGZyb20gVEVfUEUKLQkocHBjX2Zyb2Jfc3ltYm9sKTogUmVtb3ZlZCBzb21lIHhjb2ZmIHNwZWNpZmljIHByb2Nlc3NpbmcgZnJvbSBURV9QRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgbW9yZSBwcmVkZWZpbmVkIHNlY3Rpb25zCi0gICAgICAgIChwcGNfZnJvYl9zZWN0aW9uKTogUmVtb3ZlZCBzb21lIHhjb2ZmIHNwZWNpZmljIHByb2Nlc3NpbmcgZnJvbSBURV9QRQotCShwcGNfZml4X2FkanVzdGFibGUpOiBSZW1vdmVkIGZyb20gVEVfUEUgbWFpbmxpbmUKLQkobWRfYXBwbHlfZml4Myk6IEZvciBURV9QRSB0b2MgZW50cmllcywgd2UgZG9uJ3QgbmVlZCB0byBtZXNzIAotICAgICAgICB3aXRoIGZ4X2FkZG51bWJlci4gUmVtb3ZlZCBmb3IgdGhlIHRpbWUgYmVpbmcuCi0JKGxvdHMpOiBQdXQgYmFjayBtaXNzaW5nIGFzc2lnbm1lbnRzIHRvIHBwY19jdXJyZW50X2NzZWN0LgotCi1UdWUgU2VwIDI2IDE0OjU3OjU5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IFN1cHBvcnQgYWxsIG9mIHRoZSBWLjQKLQlyZWxvY2F0aW9ucy4KLQkocHBjX2VsZl9jb25zKTogUmVtb3ZlIHJlc3RyaWN0aW9uIHRoYXQgQCBzdWZmaXhlcyBtdXN0IGJlIGRvbmUKLQl3aXRoIC5sb25nLiAgQWRkIGVycm9yIGlmIHJlbG9jYXRpb24gZG9lcyBub3QgZml0IGluIHRoZSBudW1iZXIgb2YKLQlieXRlcyBwcm92aWRlZC4KLQkobWRfYXNzZW1ibGUpOiBGb3IgYWJzb2x1dGUgYnJhbmNoZXMsIG1hcCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucwotCWJhY2sgaW50byBhbiBlcXVpdmFsZW50IGFic29sdXRlIHJlbG9jYXRpb24uCi0JKG1kX3BjcmVsX2Zyb20pOiBJZiBUQ19GT1JDRV9SRUxPQ0FUSU9OIGlzIHRydWUsIHJlbG9jYXRpb24gb2Zmc2V0Ci0JaXMgMCwgbm90IHNlZ21lbnQgc3RhcnQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBEb24ndCBib3RoZXIgd3JpdGluZyBhZGRlbmQgaW50byB0aGUgaW5zdHJ1Y3Rpb24sCi0Jc2luY2UgaXQgaXMgaWdub3JlZCwgZ2l2ZW4gdGhhdCB3ZSB1c2UgUkVMQSByZWxvY2F0aW9ucyBmb3IgRUxGLgotCi0JKiBjb25maWcvdGMtcHBjLmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUgdG8gZm9yY2UgYWxsCi0JYnJhbmNoIHByZWRpY3Rpb24gcmVsb2NhdGlvbnMgdG8gYWx3YXlzIGJlIGVtaXR0ZWQuCi0KLU1vbiBTZXAgMjUgMTY6MDg6NDMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogTG93ZXIgY2FzZSByZWxvYyBiZWZvcmUKLQl0ZXN0aW5nLgotCShtZF9hc3NlbWJsZSk6IEJlIG1vcmUgcm9idXN0IGluIHRlcm1zIG9mIHJlbG9jYXRpb25zLgotCShtZF9hcHBseV9maXgzKTogQWxsb3cgMTQgYml0IHJlbG9jcyB0byBiZSBlbWl0dGVkIGZvciBleHRlcm5hbAotCXN5bWJvbHMgaW4gYWRkaXRpb24gdG8gMjYgYml0IHJlbG9jcy4gIFByb3Blcmx5IGluc2VydCAyNi8xNCBiaXQKLQlyZWxvYyB2YWx1ZSBmaWVsZHMgaW50byB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLgkKLQotTW9uIFNlcCAyNSAwMDoyMzoxNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXRvZik6IE91dHB1dCBsaXR0bGUgZW5kaWFuIGNvbnN0YW50cyBpbgotCWxpdHRsZSBlbmRpYW4gbW9kZS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBQYXNzICZ0eXBlLCBub3QgdHlwZSwKLQlzX21yaV9zZWN0LgotCi0JKiBjb25maWd1cmUuaW46IEZpeCB0eXBvOiBmbXQtZWxmIHRvIGZtdD1lbGYuCi0KLUZyaSBTZXAgMjIgMTY6MzQ6NDYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogUmV3cml0ZSB0byB1c2UgYSB0YWJsZSBvZgotCXN0cmluZ3MgYW5kIHJlbG9jYXRpb25zIHRoZXkgcmVwcmVzZW50LiAgQWRkIEBicnssbn10YWtlbiBmb3IKLQlicmFuY2ggdGFrZW4vbm90IHRha2VuIHN1cHBvcnQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBBZGQgQkZEX1JFTE9DX1BQQ19CMTZfQlJ7LE59VEFLRU4gc3VwcG9ydC4KLQotVGh1IFNlcCAyMSAyMToxMDoxNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiAtbXJlbG9jYXRhYmxlLWxpYiBub3cgb25seQotCXNldHMgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQiBhbmQgbm90IGFsc28gRUZfUFBDX1JFTE9DQVRBQkxFLgotCi1UaHUgU2VwIDIxIDE2OjMwOjU2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0KTogUGVybWl0IFNFR19BQlNPTFVURSBpbiBrbm93IGV4cHJlc3Npb24uCi0JKiBleHByLmMgKGV4cHIpOiBBY2NvdW50IGZvciBuZXcgb3BlcmF0b3JUIHZhbHVlcyBpbiBrbm93Ci0JZXhwcmVzc2lvbi4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENsZWFyIGZpeHAtPmZ4X3N1YnN5IGlmIHRoZSByZWxvY2F0aW9uCi0JaXMgZnVsbHkgcmVzb2x2ZWQuCi0KLVRodSBTZXAgMjEgMTQ6MTE6NDkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZsYWdzKTogTmV3IHZhcmlhYmxlIHRvIGhvbGQgdGhlIGZsYWcgYml0cwotCXRvIHNldCBpbiB0aGUgRUxGIGhlYWRlci4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIC1tcmVsb2NhdGFibGUtbGliLiAgTWFrZSBib3RoCi0JLW1yZWxvY2F0YWJsZSBhbmQgLW1yZWxvY2F0YWJsZS1saWIgc2V0IHBwY19mbGFncy4KLQkobWRfYmVnaW4pOiBTZXQgRUxGIGZsYWdzIHdpdGggcHBjX2ZsYWdzLgotCi1XZWQgU2VwIDIwIDEzOjAxOjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LCBzeW5vbnltIGZvcgotCXJlYWxjbGVhbi4gIEFkZCBHTlUgc3RhbmRhcmQgbWFpbnRhaW5lci1jbGVhbiBlY2hvcy4KLQkqIGRvYy9NYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQsIHN5bm9ueW0gZm9yCi0JcmVhbGNsZWFuLgotCi1UdWUgU2VwIDE5IDExOjMxOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFJlamVjdCBpbW1lZGlhdGUgb3BlcmFuZHMgZm9yICclJy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFJlamVjdCBpbW1lZGlhdGUgb3BlcmFuZHMgZm9yICd8Jy4KLQlSZXBsYWNlICdQJyB3aXRoICcwJywgJzEnLCBhbmQgJzInLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kKTogQ2hhbmdlIGxlZnRzdG9wCi0JYW5kIHJpZ2h0c3RvcCB0byBub3QgYmUgY29uc3QuCi0JKHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24pOiBMaWtld2lzZS4KLQkoYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IExpa2V3aXNlLiAgVXNlIG02OGtfaXBfb3AgdG8gZXhhbWluZQotCXRoZSBvcGVyYW5kLCBub3QgbTY4a19yZWdfcGFyc2UuCi0JKHNfbXJpX2lmKTogSW4gTVJJIG1vZGUsIHN0b3AgYXQgdGhlIGZpcnN0ICcqJy4KLQkoc19tcmlfd2hpbGUpOiBMaWtld2lzZS4KLQkoc19tcmlfZWxzZSk6IEluIE1SSSBtb2RlLCBpZ25vcmUgdHJhaWxpbmcgY2hhcmFjdGVycy4KLQkoc19tcmlfZW5kaSwgc19tcmlfYnJlYWssIHNfbXJpX25leHQsIHNfbXJpX2Zvcik6IExpa2V3aXNlLgotCShzX21yaV9lbmRmLCBzX21yaV9yZXBlYXQsIHNfbXJpX3VudGlsLCBzX21yaV9lbmR3KTogTGlrZXdpc2UuCi0JKiBjb25maWcvbTY4ay1wYXJzZS55OiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLgotCSogY29uZmlnL202OGstcGFyc2UuaDogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZS4KLQotTW9uIFNlcCAxOCAxNToyMjoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQpOiBDaGFuZ2UgbGVmdHN0YXJ0Ci0JYW5kIHJpZ2h0c3RhcnQgdG8gbm90IGJlIGNvbnN0LgotCShwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uKTogTGlrZXdpc2UuCi0JKGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQpOiBMaWtld2lzZS4gIElmIHRoZSBsZWZ0IHNpZGUgb2YgdGhlCi0JY29tcGFyaXNvbiBpcyBhIHJlZ2lzdGVyLCBhbmQgdGhlIHJpZ2h0IHNpZGUgaXMgbm90LCBzd2FwIHRoZSB0d28KLQlzaWRlcy4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKG02OGtfcmVnX3BhcnNlKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCSogY29uZmlnL202OGstcGFyc2UuaCAobTY4a19yZWdfcGFyc2UpOiBEZWNsYXJlLgotCi0JKiByZWFkLmMgKG1yaV9jb21tZW50X2ZpZWxkKTogTmV3IGZ1bmN0aW9uLgotCShtcmlfY29tbWVudF9lbmQpOiBOZXcgZnVuY3Rpb24uCi0JKHNfYWxpZ25fYnl0ZXMpOiBVc2UgbXJpX2NvbW1lbnRfZmllbGQuCi0JKHNfYWxpZ25fcHR3bywgc19jb21tLCBzX21yaV9jb21tb24sIHNfZmFpbCwgc19nbG9ibCk6IExpa2V3aXNlLgotCShzX2Zsb2F0X3NwYWNlLCBzX3N0cnVjdCk6IExpa2V3aXNlLgotCShzX3NwYWNlKTogVXNlIG1yaV9jb21tZW50X2ZpZWxkIHJhdGhlciB0aGFuIGRvaW5nIGl0IGJ5IGhhbmQuCi0JKGNvbnNfd29ya2VyLCBlcXVhbHMpOiBMaWtld2lzZS4KLQkoc19lbmQpOiBJZ25vcmUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCAnKicgb3IgJyEnLgotCSogcmVhZC5oIChtcmlfY29tbWVudF9maWVsZCk6IERlY2xhcmUuCi0JKG1yaV9jb21tZW50X2VuZCk6IERlY2xhcmUuCi0JKiBjb25kLmMgKHNfaWYpOiBVc2UgbXJpX2NvbW1lbnRfZmllbGQuCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX2NoaXAsIHNfcmVnKTogTGlrZXdpc2UuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBIYW5kbGUgQUJTLXN5bSBpbiAtc3ltIGNhc2UgcmF0aGVyIHRoYW4KLQlzeW0tc3ltIGNhc2UuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLiAgUGVybWl0IG5lZ2F0aXZlCi0Jc3ltYm9scyBpZiBUQ19NNjhLLgotCSogY29uZmlnL3RjLW02OGsuYyAodGNfY29mZl9maXgycnR5cGUpOiBJZiBmeF90Y2JpdCBpcyBzZXQsIHJldHVybgotCVJfUkVMTE9OR19ORUcuCi0JKHRjX2dlbl9yZWxvYyk6IElmIGZ4X3RjYml0IGlzIHNldCwgYWJvcnQuCi0JKG1kX2FwcGx5X2ZpeF8yKTogRm9yIGEgbmVnYXRpdmUgcmVsb2MsIG1vdmUgZnhfc3Vic3kgdG8gZnhfYWRkc3ksCi0JYW5kIHNldCBmeF90Y2JpdC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc19yZWcpOiBJZ25vcmUgY29tbWVudCBmaWVsZCBpbiBNUkkgbW9kZS4KLQotTW9uIFNlcCAxOCAxNDo0NDowNCAxOTk1ICBBcm5lIEguIEp1dWwgIDxhcm5lakBwdnYudW5pdC5ubz4KLQotCSogY29uZmlndXJlLmluIChtaXBzLWRlYy1uZXRic2QqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotU3VuIFNlcCAxNyAyMjoxNzo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGVuZGlhbiB0byBsaXR0bGUgZm9yIG1pcHMtKi11bHRyaXgqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgU2VwIDE1IDEzOjE2OjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChjdXJyZW50X2xvY2F0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4gIEhhbmRsZSBtYWdpYwotCXN5bWJvbCBgLic7IGluIGFic29sdXRlIHNlY3Rpb24sIHJldHVybiBhIGNvbnN0YW50LgotCShvcGVyYW5kKTogQ2FsbCBjdXJyZW50X2xvY2F0aW9uIGZvciAnLicgYW5kICckJywgaW5zdGVhZCBvZiBkb2luZwotCWl0IGlubGluZS4gIEluIE1SSSBtb2RlLCBjYWxsIGN1cnJlbnRfbG9jYXRpb24gZm9yICcqJy4KLQotRnJpIFNlcCAxNSAyMTozOToyOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLW02OGsuYzogQ2hhbmdlIHNvbWUgIkNPTlNUIiByZWZlcmVuY2VzIHRvICJjb25zdCIuCi0KLUZyaSBTZXAgMTUgMTc6Mjc6NDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlUdWUgU2VwIDEyIDE3OjA4OjIzIDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfc3RhYl9wYXJzZSk6IHNpbXBsaWZ5IGZpcnN0IGxvb3A7Ci0JdXNlIFNfR0VUX05BTUUvbW9kaWZ5L1NfU0VUX05BTUUgc2VxdWVuY2UgaW5zdGVhZCBvZiBhYnVzaW5nCi0JU19HRVRfTkFNRSB3aGVuIHVwZGF0aW5nIHN5bWJvbCBuYW1lLgotCShsb2NhbF9zeW1ib2xzX0RTVCk6IGZpcnN0IHByZWZpeC9wb3N0Zml4IHR5cG8gZnJvbSBKdWx5IDIxc3QuCi0JW3BsdXMgY29tbWVudCByZWZvcm1hdHRpbmcgLS1rcl0KLQotV2VkIFNlcCAxMyAxMjozMzowMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFBFQ1QpOiBOZXcgdmFyaWFibGUuCi0JKENIRUNLRkxBR1MpOiBSZW1vdmUuCi0JKHNpdGUuZXhwKTogTmV3IHRhcmdldC4KLQkoY2hlY2spOiBSZXdyaXRlIHRvIGludm9rZSBydW50ZXN0IGRpcmVjdGx5LCByYXRoZXIgdGhhbiByZWN1cnJpbmcKLQlkb3duIGludG8gdGVzdHN1aXRlLgotCShjbGVhbi1oZXJlKTogUmVtb3ZlIHRlc3RzdWl0ZSBkaXJlY3RvcnkuCi0JKGNsZWFuLCBkaXN0Y2xlYW4pOiBEb24ndCByZWN1ciBpbnRvIHRlc3RzdWl0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBBQ19DT05GSUdfU1VCRElSUyh0ZXN0c3VpdGUpLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpOiBDaGFuZ2UgdG8gdGhlIHNlZ21lbnQgd2UgYXJlCi0JcmVsYXhpbmcsIGluIGNhc2UgbWRfY29udmVydF9mcmFnLCBjYWxsZWQgYnkgY3Z0X2ZyYWdfdG9fZmlsbCwKLQl3YW50cyB0byBjYWxsIGZpeF9uZXcuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUGVybWl0IFBDIHJlbGF0aXZlIGNvZGUgaWYgdGhlCi0Jc2VnbWVudCBvZiB0aGUgc3ltYm9sIGlzIHRoZSBjdXJyZW50IHNlZ21lbnQsIG5vdCBqdXN0IGluCi0JdGV4dF9zZWN0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWdfMSk6IERvbid0IGNhbGwgc3Vic2VnX2NoYW5nZS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBMaWtld2lzZS4KLQotVHVlIFNlcCAxMiAxMDozNjo0MCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2F0b2YpOiBGaXggZGVidWdnaW5nIHByaW50ZiwgYW5kIGxlYXZlIGl0Ci0Jb3V0IGJ5IGRlZmF1bHQuCi0KLU1vbiBTZXAgMTEgMTE6Mzk6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvY29uZmlndXJlLmluOiBSZW1vdmUgdW51c2VkIGZpbGUuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEdyYWIgYWxsIGF2YWlsYWJsZSBzcGFjZXMgYXQgc3RhcnQgb2YKLQlsaW5lIGJlZm9yZSBwcmVzZXJ2aW5nIGEgc2luZ2xlIHNwYWNlLiAgUmVtb3ZlIHN0YXRlID09IDAgdGVzdAotCXdoaWNoIHdpbGwgbmV2ZXIgc3VjY2VlZC4KLQkqIG1hY3JvLmMgKG1hY3JvX2V4cGFuZF9ib2R5KTogRGVsZXRlIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZQotCWZvcm1hbCBoYXNoIHRhYmxlLgotCShtYWNyb19leHBhbmQpOiBJbiBNUkkgbW9kZSwgc3RvcCB3aGVuIHdoaXRlc3BhY2UgaXMgc2VlbiBpbiB0aGUKLQlhcmd1bWVudCBsaXN0LgotCi0JKiBzYi5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCi0JKiBtYWNyby5jOiBMaWtld2lzZS4gIEFsc28gaW5jbHVkZSA8c3RkbGliLmg+IGlmIGl0IGV4aXN0cy4KLQotRnJpIFNlcCAgOCAwMDoyNzo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEluIE1SSSBtb2RlLCBrZWVwIGEgc3BhY2UgYmVmb3JlIGEKLQlwb3NzaWJsZSBjb21tZW50IGNoYXJhY3Rlci4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBJbiBNUkkgbW9kZSwgaWdub3JlIGFueXRoaW5nIGFmdGVyCi0JYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggdGFrZXMgbm8gb3BlcmFuZHMuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBnYXNwIGluICQodG9vbGRpcikuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogSGFuZGxlIGEgbm9uIHplcm8gYmFzZSByZWdpc3RlciBmb3IKLQlNX1V7TCxTfXtELFcsSH1fQS4KLQotCSogZ2FzcC5jIChzaG93X3VzYWdlKTogUHV0IHByb2dyYW1fbmFtZSBhcmd1bWVudCBpbiBmaXJzdCBmcHJpbnRmLAotCW5vdCBzZWNvbmQuCi0KLVRodSBTZXAgIDcgMTI6MzM6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBIYW5kbGUgMDggYW5kIDA5IGluIE1SSSBtb2RlLgotCSogbWFjcm8uYyAoSVNTRVApOiBSZW1vdmUgZHVwbGljYXRlZCBgIicgY2hhcmFjdGVyLgotIAkoZ2V0X2FueV9zdHJpbmcpOiBDb3B5IHNvbWUgY2hhcmFjdGVycyBmb3Igd2hpY2ggSVNTRVAgaXMgdHJ1ZToKLQknOycsICc+JywgJygnLCAnKScuICBPdGhlcndpc2Ugd2UgY2FuIGdldCBpbiBhbiBpbmZpbml0ZSBsb29wLgotCSogcmVhZC5jIChzX3NwYWNlKTogSW4gTVJJIG1vZGUsIHRoZSBleHByZXNzaW9ucyBzdG9wIGF0IHRoZSBmaXJzdAotCXVucXVvdGVkIHNwYWNlLgotCShjb25zX3dvcmtlcik6IEluIE1SSSBtb2RlLCByZXN0b3JlIHRoZSB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgYXQKLQl0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4KLQotCSogcmVhZC5jIChjb25zX3dvcmtlcik6IERvbid0IHVzZSAjZWxpZjsgb2xkIGNvbXBpbGVycyBkb24ndAotCXN1cHBvcnQgaXQuCi0KLVdlZCBTZXAgIDYgMjE6MTM6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJbiBNUkkgbW9kZSwgc2lsZW50bHkgZW5kIHF1b3RlZCBzdHJpbmdzCi0JYXQgbmV3bGluZSBjaGFyYWN0ZXJzLiAgSW4gTVJJIG1vZGUsIGFsd2F5cyBrZWVwIHNwYWNlcyBpbiB0aGUKLQlvcGVyYW5kcyBmaWVsZC4gIEluIE1SSSBtb2RlLCB0cmVhdCBhIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIgYXMgYQotCXJlZ3VsYXIgY29tbWVudCBjaGFyYWN0ZXIgZm9sbG93aW5nIGEgc3BhY2UuCi0JKiBjb25kLmMgKGlnbm9yZV9pbnB1dCk6IFVzZSBzdHJuY2FzZWNtcCByYXRoZXIgdGhhbiBzdHJuY21wIHdoZW4KLQlsb29raW5nIGZvciBzcGVjaWFsIHBzZXVkby1vcHMuCi0JKiByZWFkLmMgKGNvbnNfd29ya2VyKTogSW4gTVJJIG1vZGUsIHRoZSBleHByZXNzaW9ucyBzdG9wIGF0IHRoZQotCWZpcnN0IHVucXVvdGVkIHNwYWNlLgotCShlcXVhbHMpOiBMaWtld2lzZS4KLQotV2VkIFNlcCAgNiAxNTowMzo1MyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChnZXRfb3BlcmFuZHMpOiBSZWFkIHRoaXJkIGFyZyBpZiBpdCBleGlzdHMuCi0JT3RoZXJ3aXNlLCBjbGVhciBpdC4KLQkoZ2V0X3NwZWNpZmljLCBjYXNlIEZfRlIwKTogQWRkLgotCi1XZWQgU2VwICA2IDE1OjAzOjUzIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKGdldF9zcGVjaWZpYyk6IERlbGV0ZSBhcmdfdG9fdGVzdC4KLQkobWRfYXNzZW1ibGUpOiBJbmNyZWFzZSBvcGVyYW5kIGFycmF5IGZyb20gMiB0byAzLgotCi1UdWUgU2VwICA1IDE2OjQ3OjM2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogUmVtb3ZlIENZR05VUyBMT0NBTCBjb21tZW50cy4KLQkobWRfYmVnaW4pOiBVc2UgMC8xIGluc3RlYWQgb2YgVFJVRS9GQUxTRS4KLQkobWRfc2hvd191c2FnZSk6IEJyZWFrIHVwIGxvbmcgZm9ybWF0IHN0cmluZyBmb3IgdGhlIGJlbmVmaXQKLQlvZiBsYW1lIGNvbXBpbGVycy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3Nob3dfdXNhZ2UpOiBEaXR0by4KLQkqIGdhc3AuYyAoc2hvd191c2FnZSk6IERpdHRvLgotCSogbWFjcm8uYyAoY2hlY2tfbWFjcm8pOiBDYXN0IHJlc3VsdCBvZiBoYXNoX2ZpbmQuCi0KLVR1ZSBTZXAgIDUgMTQ6NDY6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogV2hlbiB0ZXN0aW5nIGZvciBhIGZyZWUoKSBkZWNsYXJhdGlvbiBpbiBzeXN0ZW0KLQloZWFkZXIgZmlsZXMsIGNhc3QgdGhlIGFkZHJlc3MgdG8gYSBmdW5jdGlvbiBwb2ludGVyLCBub3QgdG8gYW4KLQlpbnRlZ2VyLgotCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogQ2FsbCBUQ19JTklUX0ZJWF9EQVRBIGlmIFRDX0ZJWF9UWVBFCi0JaXMgZGVmaW5lZC4gIERvbid0IGluaXRpYWxpemUgZnhfYnNyLiAgVmVyaWZ5IHRoYXQgZnhfc2l6ZSBmaWVsZAotCWlzIHdpZGUgZW5vdWdoIHRvIGhvbGQgc3RvcmVkIHZhbHVlLgotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IENoYW5nZSB0Y19maXhfZGF0YSB0byB0eXBlIFRDX0ZJWF9UWVBFIGlmCi0JdGhhdCBpcyBkZWZpbmVkLCBvdGhlcndpc2Ugb21pdCBpdC4gIERlbGV0ZSBmeF9ic3IuICBDaGFuZ2UKLQlmeF9zaXplIHRvIHVuc2lnbmVkIGNoYXIuCi0JKiBjb25maWcvdGMtaTk2MC5oIChUQ19GSVhfVFlQRSwgZnhfYnNyLCBUQ19JTklUX0ZJWF9EQVRBKTogTmV3Ci0JbWFjcm9zLgotCSogY29uZmlnL3RjLW5zMzJrLmggKFRDX0ZJWF9UWVBFLCBmeF9ic3IsIFRDX0lOSVRfRklYX0RBVEEpOiBOZXcKLQltYWNyb3MuCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19GSVhfVFlQRSk6IERlZmluZSBhcyBQVFIuCi0KLQkqIGNvbmZpZy90Yy1pODYwLmMgKG1kX2FwcGx5X2ZpeCk6IERlbGV0ZSBjb2RlIGZvciBjaGVja2luZwotCWZ4X2ltX2Rpc3AsIGFuZCBmb3IgaGFuZGxpbmcgbm9uLXplcm8gdmFsdWVzLCBzaW5jZSBpdCBuZXZlciBnZXRzCi0Jc2V0IGFmdGVyIGJlaW5nIGluaXRpYWxpemVkIHRvIHplcm8uCi0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBNYWtlIGZ4X2ltX2Rpc3AgYWx3YXlzIDIgYml0cywgc2luY2UgdGhlCi0Jb25seSB0Yy0qIGZpbGVzIGFjdHVhbGx5IHVzaW5nIGl0IG5lZWQgdGhhdCBtdWNoLgotCi0JTlMzMksgY2hhbmdlcyBmcm9tIElhbiBEYWxsOgotCSogY29uZmlndXJlLmluOiBUcmVhdCBuczMyay1wYzUzMi11eCogbGlrZSBuczMyay1wYzUzMi1tYWNoKiwgYW5kCi0JbnMzMmstcGM1MzItbGl0ZXMqIGxpa2UgbnMzMmstcGM1MzItbmV0YnNkKi4KLQkqIGNvbmZpZy90Yy1uczMyay5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUgdG8gMS4KLQotRnJpIFNlcCAgMSAxNzowMjoxNSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogR2V0IFRDX0ZPUkNFX1JFTE9DQVRJT04gdXAgdGhlCi0JcmlnaHQgd2F5IQotCi1GcmkgU2VwICAxIDA4OjIwOjE5IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGJlYXV0eS5jeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uLCBtZF9iZWdpbiwgbWRfc2hvd191c2FnZSk6Ci0JQWRkIHN1cHBvcnQgZm9yICItbWNwdT12cjQzMDAiIGFzIHByb2Nlc3NvciBpZGVudGlmaWVyLgotCi1UaHUgQXVnIDMxIDE2OjQxOjA2IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBSZW1vdmUgY2hhbmdlIG9mIDI5dGguCi0JKiBjb25maWcvdGMte2kzODYsYXJtfS5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogS2VlcCBSVkEgcmVsb2NzLgotCi1UdWUgQXVnIDI5IDE5OjQyOjU4IDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKSBbY2FzZSBQT1NUL1BSRS9CQVNFXTogRml4IHR5cG8gd2hlbgotIAlsb29raW5nIGF0IG91dGVyIGRpc3BsYWNlbWVudC4gIERvbid0IHNldCB0aGUgcG9zdGluZGV4IGJpdCBpZiB0aGUKLSAJaW5kZXggc3VwcHJlc3MgYml0IGlzIHNldCAoZm9yIG1lbW9yeSBpbmRpcmVjdCBhZGRyZXNzaW5nIG1vZGUpLgotCi1UaHUgQXVnIDMxIDA2OjQ5OjM3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAodGNfZ2VuX3JlbG9jKTogRGVsZXRlIGR1cGxpY2F0ZWQgY29kZS4KLQotV2VkIEF1ZyAzMCAyMzo1MTo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEZyZWUgc2F2ZWRfaW5wdXQgd2hlbiB0aGUgZnJvbSBidWZmZXIKLQlleGFjdGx5IGZpbGxzIHRoZSB0byBidWZmZXIuCi0KLVdlZCBBdWcgMzAgMTM6NDY6MzkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHBhcnNlX2tleXdvcmRfYXJnLCBwYXJzZV9jb25zdF9leHByX2FyZyk6IE5ldyBmbnMuCi0JKHNwYXJjX2lwKTogQ2FsbCB0aGVtIGZvciBhc2ksIG1lbWJhciwgYW5kIHByZWZldGNoIHBhcnNpbmcuCi0KLVR1ZSBBdWcgMjkgMTU6NDU6MzcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1lbWJhcl9tYXNrcyk6IERlbGV0ZWQuCi0JKHNwYXJjX2lwKTogQ2xlYW4gdXAgQVNJIGFuZCBtZW1iYXIgc3VwcG9ydC4KLQotVHVlIEF1ZyAyOSAxMzoyMDoyNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBSdmEgaXMgbmV3IGVudHJ5LgotCShjb25zX3dvcmtlcik6IE5ldywgc3BsaXQgZnJvbSBjb25zLiAgSGFuZGxlcyBydmEuCi0JKGNvbnMsIHNfcnZhKTogQ2FsbCBjb25zX3dvcmtlci4KLQkqIHJlYWQuaCAoc19ydmEpOiBOZXcgZGVjbGFyYXRpb24uCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgdGhyb3cgYXdheSBydmEgcmVsb2NzLgotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgsIHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBSVkEuCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19jb2ZmX2ZpeDJ0eXBlKTogSGFuZGxlIFJWQS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX0NPVU5UX1JFTE9DKTogUmVtZW1iZXIgUlZBcy4KLQkoVENfUlZBX1JFTE9DKTogTmV3IGRlZmluaXRpb24uCi0KLVN1biBBdWcgMjcgMTc6NDE6MDUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChkb19zd2kpOiBBbGxvdyBvcHRpb25hbCBsZWFkaW5nICcjJy4KLQotU2F0IEF1ZyAyNiAxNzoyNDoyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGNvbW1lbnRfY2hhcnMpOiBJZiBURV9ERUxUQSBpcyBkZWZpbmVkLAotCWluY2x1ZGUgJyMnLgotCSogY29uZmlnL3RjLW02OGsuaCAoTk9fUFNFVURPX0RPVCk6IERlZmluZSBpZiBURV9ERUxUQSBpcwotCWRlZmluZWQuCi0KLQkqIGNvbmZpZy90ZS1kZWx0YS5oOiBJbmNsdWRlIG9iai1mb3JtYXQuaC4KLQkqIGNvbmZpZy90ZS1zY28zODYuaDogTGlrZXdpc2UuCi0JKiBjb25maWcvdGUtc3lzdjMyLmg6IExpa2V3aXNlLgotCi0JKiBhcHAuYyAoc2NydWJfZmlsZSk6IFJlbW92ZS4KLQkoc2NydWJfZnJvbV9maWxlLCBzY3J1Yl90b19maWxlKTogUmVtb3ZlLgotCShzY3J1Yl9zdHJpbmcsIHNjcnViX2xhc3Rfc3RyaW5nKTogUmVtb3ZlLgotCShzY3J1Yl9mcm9tX3N0cmluZywgc2NydWJfdG9fc3RyaW5nKTogUmVtb3ZlLgotCShzYXZlZF9pbnB1dCwgc2F2ZWRfaW5wdXRfbGVuKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHN0cnVjdCBhcHBfc2F2ZWQpOiBSZW1vdmUgc2NydWJfc3RyaW5nLCBzY3J1Yl9sYXN0X3N0cmluZywgYW5kCi0Jc2NydWJfZmlsZSBmaWVsZHMuICBBZGQgc2F2ZWRfaW5wdXQgYW5kIHNhdmVkX2lucHV0X2xlbiBmaWVsZHMuCi0JKGFwcF9wdXNoKTogQWRqdXN0IHNhdmVkIGZpZWxkcyBmb3IgY2hhbmdlcyBpbiBzdHJ1Y3QgYXBwX3NhdmUuCi0JSW5pdGlhbGl6ZSBzdGF0ZSBhbmQgc2F2ZWRfaW5wdXQuCi0JKGFwcF9wb3ApOiBBZGp1c3Qgc2F2ZWQgZmllbGRzIGZvciBjaGFuZ2VzIGluIHN0cnVjdCBhcHBfc2F2ZS4KLQkoZG9fc2NydWJfY2hhcnMpOiBSZW5hbWUgZnJvbSBkb19zY3J1Yl9uZXh0X2NoYXIgYW5kIHJld3JpdGUgdG8KLQlwcm9jZXNzIGEgYnVmZmVyIGF0IGEgdGltZSByYXRoZXIgdGhhbiBhIGNoYXJhY3RlciBhdCBhIHRpbWUuCi0JKG1haW4sIGFzX3dhcm4pOiBSZW1vdmUgb2Jzb2xldGUgdGVzdGluZyBjb2RlLgotCSogYXMuaCAoZG9fc2NydWJfbmV4dF9jaGFyKTogRG9uJ3QgZGVjbGFyZS4KLQkoZG9fc2NydWJfY2hhcnMpOiBEZWNsYXJlLgotCShzY3J1Yl9mcm9tX2ZpbGUsIHNjcnViX2Zyb21fc3RyaW5nKTogRG9uJ3QgZGVjbGFyZS4KLQkoc2NydWJfdG9fZmlsZSwgc2NydWJfdG9fc3RyaW5nKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9nZXQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIpOiBDYWxsIGRvX3NjcnViX2NoYXJzIHJhdGhlciB0aGFuCi0JZG9fc2NydWJfbmV4dF9jaGFyLgotCSogcmVhZC5jIChzY3J1Yl9zdHJpbmcsIHNjcnViX3N0cmluZ19lbmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoc2NydWJfZnJvbV9zdHJpbmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBDYWxsIGRvX3NjcnViX2NoYXJzIHJhdGhlciB0aGFuCi0JZG9fc2NydWJfbmV4dF9jaGFyLgotCi1UaHUgQXVnIDI0IDE4OjUwOjE5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jIChhc19hYm9ydCk6IE5ldyBmdW5jdGlvbi4KLQkqIHNiLmMgKHNiX2J1aWxkKTogUmV2ZXJ0IHllc3RlcmRheSdzIHBhdGNoLgotCi0JKiBNYWtlZmlsZS5pbiAoZ2FzcC5uZXcpOiBEZXBlbmQgdXBvbiAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEuCi0JSnVzdCBsaW5rIGFnYWluc3QgbGliaWJlcnR5LCBub3QgYWdhaW5zdCAkKExJQlMpLgotCi1XZWQgQXVnIDIzIDE1OjE4OjIwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2IuYyAoc2JfYnVpbGQpOiBVbmRlZmluZSBhYm9ydCBiZWZvcmUgY2FsbGluZyBpdCwgc2luY2UgZ2FzcAotCWRvZXMgbm90IHByb3ZpZGUgYXNfYWJvcnQuCi0KLVdlZCBBdWcgMjMgMTA6NDA6NDEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHNldF90YXJnZXRfZW5kaWFuKTogTmV3IHN0YXRpYyB0byBzYXkgd2hldGhlcgotCXdlJ3ZlIGluaXRpYWxpemVkIHRhcmdldF9iaWdfZW5kaWFuIG9yIG5vdC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IHNldF90YXJnZXRfZW5kaWFuIGlmIHdlIHNldCB0aGUgdmFyaWFibGUKLQl0YXJnZXRfYmlnX2VuZGlhbi4KLQkobWRfYmVnaW4pOiBPbmx5IHNldCB0YXJnZXRfYmlnX2VuZGlhbiBpZiAhc2V0X3RhcmdldF9lbmRpYW4uCi0KLVR1ZSBBdWcgMjIgMDM6MDA6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JU2F0IEF1ZyAxOSAxODowODoxNiAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuaCAoRFNUX1NfQ19TUkNfU0VUUkVDX1csIERTVF9TX0NfU1JDX0RFRkxJTkVTX0IpOgotCU5ldyBtYWNyb3MuCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24sCi0JVk1TX1RCVF9Tb3VyY2VfTGluZXMpOiBNYWtlIHRyYWNlYmFjayBpbmZvIGJlIHJvYnVzdCBlbm91Z2ggdG8KLQloYW5kbGUgaHVnZSBzb3VyY2UgZmlsZXMuCi0JKFZNU19UQlRfU291cmNlX0ZpbGUpOiBSZW9yZ2FuaXplIHRoZSBuYXRpdmUtIHZzIGNyb3NzLWFzc2VtYmx5Ci0Jc3VwcG9ydCBzbyB0aGF0IGFjdHVhbCBvYmplY3QgZmlsZSBvdXRwdXQgaXMgY2xlYXJlci4KLQkoVk1TX1RCVF9Tb3VyY2VfRmlsZTogRmFiLCBOYW0sIERhdGVfWGFiLCBGaWxlX0hlYWRlcl9YYWIpOgotCVJlcGxhY2Ugc3RhdGljIHZhcmlhYmxlcyB3aXRoIGF1dG9tYXRpYyBvbmVzLgotCi0JU2F0IEF1ZyAxMiAyMDoxODoxNSAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoTW9kdWxlX05hbWUpOiBuZXcgZmlsZSBzY29wZSB2YXJpYWJsZS4KLQkoVk1TX1RCVF9Nb2R1bGVfQmVnaW4pOiB1c2UgaXQgaW5zdGVhZCBvZiBsb2NhbCB2YXJpYWJsZS4KLQkoV3JpdGVfVk1TX01IRF9SZWNvcmRzKTogZGl0dG87IGFzc2lnbiBpdHMgdmFsdWUgaGVyZS4KLQkoV3JpdGVfVk1TX0VPTV9SZWNvcmQpOiBzZWNvbmQgYXJndW1lbnQgaGFzIHR5cGUgdmFsdWVULgotCShWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplKTogIHNpbXBsaWZ5IHNlYXJjaCBsb29wOyByZXR1cm4KLQl0eXBlIGlzIG9mZnNldFQ7IHNlY29uZCBhcmd1bWVudCBpcyB1bnNpZ25lZC4KLQotCVNhdCBKdW4gMTcgMTk6MDU6MjUgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3BlcnJvcik6IFVzZSB4c3RyZXJyb3IgaW5zdGVhZCBvZiBzdHJlcnJvci4KLQotTW9uIEF1ZyAyMSAxMzo1NzoyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBBY2NlcHQgLS1kZWZzeW0gU1lNPVZBTFVFLgotCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy4xOiBEb2N1bWVudCAtLWRlZnN5bS4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgZW5kIHRoZQotCXN0YXRlbWVudCBpbnNpZGUgYSBxdW90YXRpb24uCi0JKHNfc3BhY2UpOiBEb24ndCB3YXJuIGFib3V0IGEgemVybyByZXBlYXQgY291bnQgaW4gTVJJIG1vZGUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChjcmFja19vcGVyYW5kKTogSW4gTVJJIG1vZGUsIGRvbid0IGNvdW50Ci0JcGFyZW50aGVzZXMgaW5zaWRlIHF1b3Rlcy4KLQkobWRfYXNzZW1ibGUpOiBJbiBNUkkgbW9kZSwgYW55dGhpbmcgYWZ0ZXIgdGhlIG9wZXJhbmRzIGZpZWxkIGlzIGEKLQljb21tZW50LgotCShwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kKTogQWRqdXN0IHN0YXJ0IGFuZCBzdG9wIHRvIHJlbW92ZQotCXNwYWNlcy4KLQkoc19tcmlfZm9yKTogTGlrZXdpc2UuCi0KLQkqIGNvbmQuYyAoc19pZmRlZik6IFJlc3RvcmUgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgc3ltYm9sIG5hbWUsCi0JaW4gY2FzZSBpdCBpcyBhIG5ld2xpbmUuCi0JKHNfaWYpOiBJZiBpZ25vcmluZyB0aGUgY3VycmVudCB0cmVlLCBkb24ndCB0cnkgdG8gcGFyc2UgdGhlCi0JZXhwcmVzc2lvbi4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IElmIExFWF9JU19TVFJJTkdRVU9URSBvcgotCUxFWF9JU19PTkVDSEFSX1FVT1RFIGlzIHNlZW4gaW4Jc3RhdGUgMTAsIHByZXNlcnZlIG9uZSBzcGFjZS4KLQotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IGlycCwgaXJwYywgbWFjcm8sIGFuZCByZXB0LiBNUkkgbW9kZQotCW5vdyBzdXBwb3J0cyBtYWNyb3MsIGlmYywgaWZuYywgaXJwLCBpcnBjLCByZXB0LCBhbmQgZW5kciwgd2l0aG91dAotCXVzaW5nIGdhc3AuCi0KLQlBZGQgc3VwcG9ydCBmb3IgbWFjcm9zLgotCSogYXMuYzogSW5jbHVkZSBzYi5oIGFuZCBtYWNyby5oLgotCShtYXhfbWFjcm9fbmV4dCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKG1haW4pOiBDYWxsIG1hY3JvX2luaXQuCi0JKG1hY3JvX2V4cHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogYXMuaCAobWF4X21hY3JvX25lc3QpOiBEZWNsYXJlLgotCSogcmVhZC5jIChsaW5lX2xhYmVsKTogUmVuYW1lIGZyb20gbXJpX2xpbmVfbGFiZWwuICBDaGFuZ2UgYWxsCi0JdXNlcy4KLQkocG90YWJsZSk6IEFkZCBleGl0bSwgaXJwLCBpcnBjLCBtYWNybywgbWV4aXQsIHJlcHQuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEFsd2F5cyBjbGVhciBsaW5lX2xhYmVsIGF0IHRoZSBzdGFydCBvZiBhCi0JbGluZSwgbm90IGp1c3Qgd2hlbiBmbGFnX21yaSBvciBMQUJFTFNfV0lUSE9VVF9DT0xPTlMuICBGaXgKLQlNUkkvTEFCRUxTX1dJVEhPVVRfQ09MT05TIGhhbmRsaW5nLiAgSW4gTVJJIG1vZGUsIHBlcm1pdCBsYWJlbDoKLQllcXUgdmFsLiAgU2V0IGxpbmVfbGFiZWwgd2hlbiBjYWxsaW5nIGNvbG9uLiAgSW4gTVJJIG1vZGUsIGEKLQlsZWFkaW5nICcuJyBkb2VzIG5vdCBpbXBseSBhIHBzZXVkby1vcC4gIENoZWNrIGZvciBtYWNybyBleHBhbnNpb24KLQliZWZvcmUgY2FsbGluZyBtZF9hc3NlbWJsZS4KLQkoc19pcnApOiBOZXcgZnVuY3Rpb24uCi0JKGdldF9saW5lX3NiKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc19tYWNybyk6IE5ldyBmdW5jdGlvbi4KLQkoc19tZXhpdCk6IE5ldyBmdW5jdGlvbi4KLQkoc19yZXB0KTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5oIChsaW5lX2xhYmVsKTogUmVuYW1lIGZyb20gbXJpX2xpbmVfbGFiZWwuCi0JKHNfaXJwLCBzX3JlcHQpOiBEZWNsYXJlLgotCShzX21hY3JvLCBzX21leGl0KTogRGVjbGFyZS4KLQkqIGlucHV0LXNjcnViLmM6IEluY2x1ZGUgc2IuaC4KLQkoc2JfaW5kZXgsIGZyb21fc2IpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobWFjcm9fbmVzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHN0cnVjdCBpbnB1dF9zYXZlKTogQWRkIHNiX2luZGV4IGFuZCBmcm9tX3NiIGZpZWxkcy4gIENoYW5nZQotCW5leHRfc2F2ZWRfZmlsZSBmaWVsZCB0byBiZSBzdHJ1Y3QgaW5wdXRfc2F2ZSAqLgotCShuZXh0X3NhdmVkX2ZpbGUpOiBDaGFuZ2VkIHRvIGJlIHN0cnVjdCBpbnB1dF9zYXZlICouCi0JKGlucHV0X3NjcnViX3B1c2gpOiBDaGFuZ2UgdG8gcmV0dXJuIHR5cGUgc3RydWN0IGlucHV0X3NhdmUgKi4KLQlTYXZlIHNiX2luZGV4IGFuZCBmcm9tX3NiLgotCShpbnB1dF9zY3J1Yl9wb3ApOiBDaGFuZ2UgcGFyYW1ldGVyIHR5cGUgdG8gc3RydWN0IGlucHV0X3NhdmUgKi4KLQlSZXN0b3JlIHNiX2luZGV4IGFuZCBmcm9tX3NiLgotCShpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiKTogTmV3IGZ1bmN0aW9uLgotCShpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlcik6IEhhbmRsZSByZWFkaW5nIGZyb20gZnJvbV9zYi4KLQkoYnVtcF9saW5lX2NvdW50ZXJzKTogT25seSBpbmNyZW1lbnQgbGluZXMgaWYgbm90IHVzaW5nIGZyb21fc2IuCi0JKiBjb25maWcvdGMtbTY4ay5jIChvcHRfdGFibGUpOiBBZGQgbmVzdC4KLQkob3B0X25lc3QpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogZ2FzcC5jOiBJbmNsdWRlIHNiLmggYW5kIG1hY3JvLmguICBNb3ZlIGFsbCBzYiByZWxhdGVkIGZ1bmN0aW9ucwotCWFuZCBkZWZpbml0aW9ucyB0byBzYi5oIGFuZCBzYi5jLiAgTW92ZSBhbGwgbWFjcm8gcmVsYXRlZAotCWZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbnMgdG8gbWFjcm8uaCBhbmQgbWFjcm8uYy4KLQkqIHNiLmgsIHNiLmM6IE5ldyBmaWxlcywgZXh0cmFjdGVkIGZyb20gZ2FzcC5jLgotCSogbWFjcm8uaCwgbWFjcm8uYzogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbiAoT0JKUyk6IEFkZCBzYi5vIGFuZCBtYWNyby5vCi0JKEdBU1BPQkpTKTogRGVmaW5lLgotCShnYXNwLm5ldyk6IERlcGVuZCB1cG9uICQoR0FTUE9CSlMpLiAgVXNlICQoR0FTUE9CSlMpIHRvIGxpbmsuCi0JKFRBUkdfQ1BVX0RFUF9tNjhrKTogRGVwZW5kIHVwb24gc3Vic2Vncy5oLgotCShnYXNwLm8pOiBEZXBlbmQgdXBvbiBzYi5oIGFuZCBtYWNyby5oLgotCShzYi5vKTogTmV3IHRhcmdldC4KLQkobWFjcm8ubyk6IE5ldyB0YXJnZXQuCi0JKGFzLm8pOiBEZXBlbmQgdXBvbiBzYi5oIGFuZCBtYWNyby5oLgotCShpbnB1dC1zY3J1Yi5vKTogRGVwZW5kIHVwb24gc2IuaC4KLQkocmVhZC5vKTogRGVwZW5kIHVwb24gc2IuaCBhbmQgbWFjcm8uaC4KLQotCSogY29uZC5jIChnZXRfbXJpX3N0cmluZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNfaWZjKTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIGlmYyBhbmQgaWZuYy4KLQkqIHJlYWQuaCAoc19pZmMpOiBEZWNsYXJlLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBJbiBNUkkgbW9kZSwgc2V0IGxleCBvZiAnIHRvCi0JTEVYX0lTX1NUUklOR1FVT1RFLgotCi1Nb24gQXVnIDIxIDEzOjQxOjMzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogQWxsb3cgQEhBLCBATCwgYW5kIEBIIHN1ZmZpeGVzIG9uCi0JY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0KLVN1biBBdWcgMjAgMTU6NTQ6MzcgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX3JlbG9jX3NpemUpOiBBZGQgY29uc3QgdG8gZGVjbGFyYXRpb24uCi0KLUZyaSBBdWcgMTggMTA6NTg6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfaW5jbHVkZSk6IEluIE1SSSBtb2RlLCBkb24ndCBleHBlY3QgcXVvdGVzIGFyb3VuZCB0aGUKLQlmaWxlIG5hbWUuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfdGl0bGUpOiBEb24ndCByZXF1aXJlIHRoZSB0aXRsZSB0byBiZSBxdW90ZWQuCi0KLQkqIGdhc3AuYyAoaW5jbHVkZV9wcmludF93aGVyZV9saW5lKTogQWx3YXlzIHN1YnRyYWN0IDEgZnJvbQotCWxpbmVjb3VudCBiZWZvcmUgcHJpbnRpbmcgaXQuCi0JKHByb2Nlc3NfZmlsZSk6IEluIE1SSSBtb2RlLCBsaW5lcyBiZWdpbm5pbmcgd2l0aCAnKicgb3IgJyEnIGFyZQotCWNvbW1lbnRzLgotCShkb19yZWcpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgcmVxdWlyZSBwYXJlbnRoZXNlcy4KLQkoZG9faW5jbHVkZSk6IEluIE1SSSBtb2RlLCBkb24ndCByZXF1aXJlcyBxdW90ZXMuICBJZiB0aGUgZmlsZSBjYW4KLQlub3QgYmUgZm91bmQgaW4gdGhlIGluY2x1ZGUgcGF0aCwgdHJ5IG9wZW5pbmcgaXQgaW4gdGhlIGN1cnJlbnQKLQlkaXJlY3RvcnkuICBQcmludCB0aGUgZmlsZSBuYW1lIGNvcnJlY3RseSBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkoY2hhcnR5cGVfaW5pdCk6IEluIE1SSSBtb2RlLCBzZXQgRklSU1RCSVQgZm9yICcuJy4KLQkobWFpbik6IFNldCBjb21tZW50X2NoYXIgdG8gJzsnIHdoZW4gZW50ZXJpbmcgTVJJIG1vZGUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IEluY2x1ZGUgc3Vic2Vncy5oLgotCShtNjhrX2lwKTogUGFzcyA2NCByYXRoZXIgdGhhbiAtMSB0byBhZGRfRml4IGluICdCJyAnQicgY2FzZS4KLQkobWRfcGNyZWxfZnJvbSk6IElmIGZ4X3BjcmVsX2FkanVzdCBpcyA2NCwgdXNlIC0xIGluc3RlYWQuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IEZvciBPQkpfQU9VVCBjYXNlLCBhZGp1c3QKLQlCRkRfUkVMT0NfMTYgYW5kIEJGRF9SRUxPQ18zMiByZWxvY3MuCi0KLVdlZCBBdWcgMTYgMTQ6NDg6NDQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBhcy5oIChhbGxvY2EpOiBVc2Ugdm9pZCogZGVjbGFyYXRpb24gb24gSFAvVVguCi0KLVdlZCBBdWcgMTYgMTI6NDk6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogSWYgUElDLCBvbmx5IGNoYW5nZSBQQ1JFTF9TMgotCXRvIFdQTFQzMCBmb3IgYW4gdW5kZWZpbmVkIG9yIGV4dGVybmFsIHN5bWJvbC4gIERvbid0IGNvbnNpZGVyCi0JUEMxMCBvciBQQzIyIHRvIGJlIGEgUEMgcmVsYXRpdmUgcmVsb2Mgd2hlbiBjaG9vc2luZyBiZXR3ZWVuCi0JZnhfYWRkbnVtYmVyIGFuZCBmeF9vZmZzZXQuCi0KLQkqIGNvbmZpZy90Yy16OGsuYyAobWRfbnVtYmVyX3RvX2NoYXJzKTogRG9uJ3QgZG8gaXQgaGVyZSwgY2FsbAotCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4uCi0JKiBjb25maWcvdGMtejhrLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBBZGQgc3VwcG9ydCBmb3IgLnN0YXJ0b2YuIGFuZCAuc2l6ZW9mLiBieQotCXVzaW5nIG1hZ2ljIHN5bWJvbCBuYW1lcyB3aGljaCB0aGUgbGlua2VyIHdpbGwgcmVjb2duaXplCi0Jc3BlY2lhbGx5LgotCSogZG9jL2FzLnRleGluZm86IFRha2Ugb3V0IG5vdGUgdGhhdCAuc3RhcnRvZi4gYW5kIC5zaXplb2YuIGFyZQotCW5vdCBzdXBwb3J0ZWQuCi0KLVR1ZSBBdWcgMTUgMTU6MDg6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgTVJJIHN0cnVjdHVyZWQgY29udHJvbAotCWRpcmVjdGl2ZXM6IGlmLCBpZi5iLCBpZi53LCBpZi5sLCBlbHNlLCBlbHNlLnMsIGVsc2UubCwgZW5kaSwKLQlicmVhaywgYnJlYWsucywgYnJlYWsubCwgbmV4dCwgbmV4dC5zLCBuZXh0LmwsIGZvciwgZm9yLmIsIGZvci53LAotCWZvci5sLCBlbmRmLCByZXBlYXQsIHVudGlsLCB1bnRpbC5iLCB1bnRpbC53LCB1bnRpbC5sLCB3aGlsZSwKLQl3aGlsZS5iLCB3aGlsZS53LCB3aGlsZS5sLCBlbmR3LgotCShlbnVtIG1yaV9jb250cm9sX3R5cGUpOiBEZWZpbmUuCi0JKHN0cnVjdCBtcmlfY29udHJvbF9pbmZvKTogRGVmaW5lLgotCShtcmlfY29udHJvbF9zdGFjayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1yaV9jb250cm9sX2luZGV4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobXJpX2NvbnRyb2xfbGFiZWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwdXNoX21yaV9jb250cm9sLCBwb3BfbXJpX2NvbnRyb2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkocGFyc2VfbXJpX2NvbmRpdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzd2FwX21yaV9jb25kaXRpb24sIHJldmVyc2VfbXJpX2NvbmRpdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNfbXJpX2lmLCBzX21yaV9lbHNlLCBzX21yaV9lbmRpKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHNfbXJpX2JyZWFrLCBzX21yaV9uZXh0KTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHNfbXJpX2Zvciwgc19tcmlfZW5kZik6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzX21yaV9yZXBlYXQsIHNfbXJpX3VudGlsKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHNfbXJpX3doaWxlLCBzX21yaV9lbmR3KTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKiBnYXNwLmMgKG1yaWtpbmZvKTogUmVtb3ZlIElGLgotCSogZXhwci5jIChnZXRfc3ltYm9sX2VuZCk6IEFjY2VwdCBcMDAxIGFzIHBhcnQgb2YgYSBuYW1lLgotCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2hhbmdlIHBhcmFtZXRlciB0byBjb25zdCBjaGFyICouCi0JKiBzeW1ib2xzLmggKGNvbG9uKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi1Nb24gQXVnIDE0IDIwOjUxOjU2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBBbHdheXMgZG8gaXQgdGhlIEJGRF9GQVNUX1NFQ1RJT05fRklMTAotCXdheS4gIFJlZm9ybWF0IGFuZCByZWluZGVudCB0aGF0IGNvZGUgdG8gR05VIHN0YW5kYXJkcy4KLQkoQkZEX0ZBU1RfU0VDVElPTl9GSUxMKTogRG9uJ3QgZGVmaW5lLgotCi1Nb24gQXVnIDE0IDE0OjA4OjA3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBEb24ndCB0cnkgdG8gYXBwbHkgQkVHSU5fQlJUQUIKLQlvciBFTkRfQlJUQUIgZml4dXBzLgotCi1Nb24gQXVnIDE0IDE1OjQ1OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChkb19hbGlnbiwgZ2V0X2FueV9zdHJpbmcpOiBNYXJrIGFzIHN0YXRpYy4KLQkoZG9fYXNzaWduYSwgZG9fYXNzaWduYywgbmV3X2ZpbGUpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc19yZWcpOiBSZW5hbWUgbG9jYWwgb3AgdG8gcm9wIHRvIGF2b2lkCi0JY29uZnVzaW9uIHdpdGggbWFjcm8gb3AuCi0KLQkqIGdhc3AuYyAoc3RyaXBfY29tbWVudHMpOiBDb21tZW50IG91dDsgaXQncyBub3QgdXNlZC4KLQkoZG9fZW5kKTogQWRkIHBhcmFtZXRlci4gIEluIE1SSSBtb2RlLCBwcmludCBpdCBvdXQuCi0JKGRvX2lycCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN1Yl9hY3R1YWwpOiBDaGFuZ2UgcGFyYW1ldGVyIG0gdG8gZm9ybWFsX2hhc2gsIGNoYW5naW5nIHR5cGUKLQlmcm9tIG1hY3JvX2VudHJ5aCAqIHRvIGhhc2hfdGFibGUgKi4KLQkobWFjcm9fZXhwYW5kX2JvZHkpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JbWFjcm9fZXhwYW5kLgotCShtYWNyb19leHBhbmQpOiBDYWxsIG1hY3JvX2V4cGFuZF9ib2R5LgotCShLXyopOiBGdWxseSBwYXJlbnRoZXNpemUuCi0JKEtfSVJQLCBLX0lSUEMpOiBEZWZpbmUuCi0JKG1yaWtpbmZvKTogQWRkIElSUCBhbmQgSVJQQy4KLQkocHJvY2Vzc19wc2V1ZG9fb3ApOiBJbiBNUkkgbW9kZSwgcHJpbnQgb3V0IEVORCBwc2V1ZG8tb3AuICBQYXNzCi0JbGluZSB0byBkb19lbmQuICBIYW5kbGUgS19JUlAgYW5kIEtfSVJQQy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc19vcHQpOiBSZXNldCAqaW5wdXRfbGluZV9wb2ludGVyIGV2ZW4gaWYgd2UKLQlkb24ndCBkbyBhbnl0aGluZyB3aXRoIHRoZSBvcHRpb24uCi0KLVN1biBBdWcgMTMgMTc6MDM6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmcmFncy5jIChmcmFnX2FsaWduKTogSGFuZGxlIGFic29sdXRlX3NlY3Rpb24uCi0JKiB3cml0ZS5jIChyZWNvcmRfYWxpZ25tZW50KTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogU2tpcCBpbnNucyB3aXRoIGFuIGluYXBwcm9wcmlhdGUKLQlJU0EgbGV2ZWwuCi0KLVN1biBBdWcgMTMgMDA6MzU6MDIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBlbnRyaWVzIGZvcgotCSJiZWdpbl9icnRhYiIgYW5kICJlbmRfYnJ0YWIiIHBzZXVkby1vcHMuCi0JKHBhX2JydGFiKTogTmV3IGZ1bmN0aW9uLgotCSh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogSGFuZGxlIFJfQkVHSU5fQlJUQUIgYW5kIFJfRU5EX0JSVEFCLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSByZWxvY2F0aW9ucyBmb3IgQlJUQUIgZml4dXBzCi0Jd2hlbiBPQkpfU09NIGlzIGRlZmluZWQuCi0KLUZyaSBBdWcgMTEgMjA6MzQ6MDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVEVfT0JKUyk6IEFkZCBlbXB0eSBkZWZpbml0aW9uLgotCi1GcmkgQXVnIDExIDE5OjE2OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChjaGFuZ2VfYmFzZSk6IERvbid0IHRyZWF0ICcgc3BlY2lhbGx5IGluIE1SSSBtb2RlLgotCShwcm9jZXNzX2ZpbGUpOiBEb24ndCB3YXJuIGFib3V0IG1pc3NpbmcgRU5EIGluIE1SSSBtb2RlLgotCShkb19pZik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdldF9tcmlfc3RyaW5nLCBkb19pZmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoYnVmZmVyX2FuZF9uZXN0KTogVHJlYXQgTVJJIG1vZGUgbGlrZSBhbHRlcm5hdGUgc3ludGF4IG1vZGUuCi0JKGRvX2FlbmRyKTogQ2hhbmdlIGVycm9yIG1lc3NhZ2UgaW4gTVJJIG1vZGUuCi0JKGRvX2FyZXBlYXQpOiBVc2UgUkVQVC9FTkRSIGluIE1SSSBtb2RlLgotCShkb19mb3JtYWxzKTogSW4gTVJJIG1vZGUsIGFkZCBzcGVjaWFsIE5BUkcgZm9ybWFsLgotCShtYWNyb19leHBhbmQpOiBWYXJpb3VzIGNoYW5nZXMgZm9yIE1SSSBtb2RlOiBwZXJtaXQgYSBxdWFsaWZpZXIKLQlvbiB0aGUgbWFjcm8gbmFtZTsgc2V0IHNwZWNpYWwgTkFSRyBmb3JtYWw7IHBlcm1pdCB1bm5hbWVkCi0JcG9zaXRpb25hbCBhcmd1bWVudHM7IHVzZSAmJiB0byBjb25jYXRlbmF0ZSBuYW1lZCBwYXJhbWV0ZXJzOwotCXBlcm1pdCBcZCB0byBzcGVjaWZ5IGFuIHVubmFtZWQgcGFyYW1ldGVyOyBwZXJtaXQgbmFtZWQgcGFyYW1ldGVycwotCXRvIG5vdCBzdGFydCB3aXRoIFw7IHVzZSA9PSB0byBzZWUgaWYgYSBwYXJhbWV0ZXIgZXhpc3RzLgotCShnZXRzdHJpbmcpOiBJbiBNUkkgbW9kZSwgYWxsb3cgPD4gdG8gcXVvdGUgYSBzdHJpbmcuCi0JKEtfSUZFUSwgS19JRk5FLCBLX0lGTFQsIEtfSUZMRSwgS19JRkdFLCBLX0lGR1QpOiBEZWZpbmUuCi0JKEtfSUZDLCBLX0lGTkMpOiBEZWZpbmUuCi0JKHN0cnVjdCBrZXl3b3JkKTogTmFtZSBzdHJ1Y3R1cmUgdXNlZCBpbiBraW5mbyBhcnJheS4KLQkobXJpa2luZm8pOiBOZXcgc3RhdGljIGFycmF5LgotCShwcm9jZXNzX3BzZXVkb19vcCk6IERvbid0IHJlcXVpcmUgbGVhZGluZyAnLicgaW4gTVJJIG1vZGUuCi0JSGFuZGxlIG5ldyBNUkkgcHNldWRvLW9wIGRlZmluaXRpb25zLgotCShhZGRfa2V5d29yZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgcHJvY2Vzc19pbml0LgotCShwcm9jZXNzX2luaXQpOiBVc2UgYWRkX2tleXdvcmQuICBJbiBNUkkgbW9kZSwgYWRkIG1yaWtpbmZvIHRhYmxlLgotCShsb25nX29wdGlvbnMpOiBBZGQgIm1yaSIuCi0JKHNob3dfdXNhZ2UpOiBNZW50aW9uIC1NLy0tbXJpLgotCShtYWluKTogQ2FsbCBwcm9jZXNzX2luaXQgYWZ0ZXIgcHJvY2Vzc2luZyBhcmd1bWVudHMuICBIYW5kbGUgLU0uCi0JKiBkb2MvZ2FzcC50ZXhpOiBEb2N1bWVudCAtTS8tLW1yaS4KLQotCSogZ2FzcC5jOiBJbmNsdWRlIGFuc2lkZWNsLmguICBNYWtlIGFsbCBsb2NhbCBmdW5jdGlvbnMgc3RhdGljLgotICAgICAgICBBZGQgcHJvdG90eXBlcyBmb3IgYWxsIHN0YXRpYyBmdW5jdGlvbnMuCi0JKG1yaSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHNiX2FkZF9jaGFyKTogQ2hhbmdlIHBhcmFtZXRlciBjIGZyb20gY2hhciB0byBpbnQuCi0JKHNiX2FkZF9zdHJpbmcpOiBNYWtlIHBhcmFtZXRlciBzIGludG8gYSBjb25zdCBwb2ludGVyLgotCShzYl9hZGRfYnVmZmVyKTogTGlrZXdpc2UuCi0JKGNoZWNrY29uc3QpOiBDaGFuZ2UgcGFyYW1ldGVyIG9wIGZyb20gY2hhciB0byBpbnQuCi0JKGV4cF9nZXRfYWJzKTogTWFrZSBwYXJhbWV0ZXIgZW1zZyBpbnRvIGEgY29uc3QgcG9pbnRlci4KLQkoZG9fcmVzKTogQ2hhbmdlIHBhcmFtZXRlciB0eXBlIGZyb20gY2hhciB0byBpbnQuCi0JKGJ1ZmZlcl9hbmRfbmVzdCk6IE1ha2UgcGFyYW1ldGVycyBmcm9tIGFuZCB0byBpbnRvIGNvbnN0Ci0JcG9pbnRlcnMuCi0JKGRvX3NkYXRhKTogQ2hhbmdlIHBhcmFtZXRlciB0eXBlIGZyb20gY2hhciB0byBpbnQuCi0JKG5ld19maWxlKTogTWFrZSBwYXJhbWV0ZXIgbmFtZSBpbnRvIGEgY29uc3QgcG9pbnRlci4KLQkoZG9fZGVmaW5lKTogTWFrZSBwYXJhbWV0ZXIgc3RyaW5nIGludG8gYSBjb25zdCBwb2ludGVyLgotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAobWRfbnVtYmVyX3RvX2NoYXJzKTogRG9uJ3QgZG8gaXQgaGVyZSwgY2FsbAotCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4uCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0KLUZyaSBBdWcgMTEgMTM6MjM6NTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBBZGQgbmV3IGZpZWxkIGZ4X25vX292ZXJmbG93LgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogSWYgZnhfbm9fb3ZlcmZsb3cgaXMgbm9uLXplcm8sIGRvbid0Ci0JY29tcGxhaW4gaWYgdGhlIGFkZGVuZCBpcyB0b28gbGFyZ2UuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXNzZW1ibGUpOiBTZXQgZnhfbm9fb3ZlcmZsb3cgaWYgdGhlIGhhbGYKLQl3b3JkIHJlbG9jYXRpb25zIEJGRF9SRUxPQ197TE8xNixISTE2LEhJMTZfU30uCi0KLVRodSBBdWcgMTAgMjA6NTY6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19tcmlfc2VjdCkgW0JGRF9BU1NFTUJMRVJdOiBGaXggdHlwb3MgaW4gY2hvb3NpbmcgYW5kCi0Jc2V0dGluZyBzZWN0aW9uIGZsYWdzLgotCi1UaHUgQXVnIDEwIDAwOjM4OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IEFkZCBkb2N1bWVudGF0aW9uIGZvciBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLgotCSogZG9jL2FzLjE6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogV2hlbiByZWNvZ25pemluZyAnIycsIHVzZSBpc2J5dGUgYW5kCi0JaXdvcmQgcmF0aGVyIHRoYW4gZXhwcjggYW5kIGV4cHIxNi4gIFdoZW4gcmVjb2duaXppbmcgJ00nLCB1c2UKLQlpc3NieXRlIHJhdGhlciB0aGFuIGV4cHI4LiAgV2hlbiByZWNvZ25pemluZyAnUScgYW5kICd0JywganVzdAotCWNoZWNrIGZvciBPX2NvbnN0YW50IHJhdGhlciB0aGFuIHVzaW5nIGV4cHI4LgotCSogY29uZmlnL202OGstcGFyc2UuaCAoZXhwcjgsIGV4cHIxNik6IERvbid0IGRlZmluZS4KLQkqIE1ha2VmaWxlLmluIChtNjhrLXBhcnNlLm8pOiBEZXBlbmQgdXBvbiBtNjhrLXBhcnNlLmgsIG5vdAotCW02OGstcGFyc2UueS4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIHNwYywgdHRsLCB4Y29tLCB4cmVmLgotCShzX21yaV9zZWN0KTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5oIChzX21yaV9zZWN0KTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKSAoYm90aCB2ZXJzaW9ucyk6IEluIE1SSQotCW1vZGUsIGNhbGwgc19tcmlfc2VjdC4KLQkob2JqX3BzZXVkb190YWJsZSk6IEFkZCBzZWN0LnMgYW5kIHNlY3Rpb24ucy4gIE1vdmUgc2VjdCBvdXRzaWRlCi0Jb2YgaWZuZGVmIEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfcHNldWRvX3RhYmxlKTogQWRkIHNlY3Rpb24ucywgc2VjdCwKLQlzZWN0LnMuCi0JKG9ial9lbGZfc2VjdGlvbik6IEluIE1SSSBtb2RlLCBjYWxsIHNfbXJpX3NlY3QuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgcmVzdG9yZSwgc2F2ZS4KLQkoc3RydWN0IHNhdmVfb3B0cyk6IERlZmluZS4KLQkoc2F2ZV9zdGFjayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNfc2F2ZSwgc19yZXN0b3JlKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0KLQkqIHJlYWQuYyAoc19zZXQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHB0ci4KLQkoaGV4X2Zsb2F0KTogQ2hlY2sgdGFyZ2V0X2JpZ19lbmRpYW4uCi0JKGVxdWFscyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgcC4KLQotCSogY29uZmlnL3RjLWEyOWsuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaDg1MDAuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pODYwLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTg4ay5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy10YWhvZS5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChsaXR0bGUpOiBTZXQgdGFyZ2V0X2JpZ19lbmRpYW4uCi0JKG1kX2JlZ2luKTogTGlrZXdpc2UuCi0JKG1kX3BhcnNlX29wdGlvbik6IExpa2V3aXNlLgotCShidWlsZF9yZWxheCk6IENoZWNrIHRhcmdldF9iaWdfZW5kaWFuIHJhdGhlciB0aGFuIHNobC4KLQkoYnVpbGRfTXl0ZXMsIG1kX2F0b2YpOiBMaWtld2lzZS4KLQkobWRfY29udmVydF9mcmFnLCBtZF9hcHBseV9maXgpOiBMaWtld2lzZS4KLQkobWRfbnVtYmVyX3RvX2NoYXJzKTogTGlrZXdpc2UuCi0JCi1XZWQgQXVnICA5IDEwOjUxOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19hYnNwY2FkZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG02OGtfcXVpY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtNjhrX3JlbDMyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIG9wdCBhbmQgcmVnLgotCShtNjhrX2lwKTogUGVybWl0IGFic29sdXRlIHN5bWJvbHMgaW4gJ2wnLydMJyByZWNvZ25pdGlvbi4gIENoZWNrCi0JbTY4a19xdWljayBpbiAnTScgYW5kICdRJyByZWNvZ25pdGlvbi4gIENoZWNrIG02OGtfYWJzcGNhZGQgaW4KLQlESVNQIGhhbmRsaW5nLiAgQ2hlY2sgbTY4a19yZWwzMiBpbiBCQVNFL1BPU1QvUFJFIGhhbmRsaW5nLgotCShtZF9iZWdpbik6IEluIE1SSSBtb2RlLCBpbml0aWFsaXplIG02OGtfYWJzcGNhZGQgYW5kIG02OGtfcmVsMzIuCi0JSW4gTVJJIG1vZGUsIGNoYW5nZSB1bnNpemVkIGJyYW5jaCBhbGlhc2VzIHRvIGJlIHZhcmlhYmxlIHNpemVkLgotCShzdHJ1Y3Qgb3B0X2FjdGlvbik6IERlZmluZS4KLQkob3B0X3RhYmxlKTogRGVmaW5lLgotCShzX29wdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNraXBfdG9fY29tbWEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvcHRfY2hpcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9wdF9saXN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob3B0X2xpc3Rfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNfcmVnKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGFzLmggKGZsYWdfa2VlcF9sb2NhbHMpOiBDaGFuZ2UgZnJvbSB1bnNpZ25lZCBjaGFyIHRvIGludC4KLQkoZmxhZ19ub193YXJuaW5ncyk6IExpa2V3aXNlLgotCi0JKiByZWFkLmMgKG1yaV9saW5lX2xhYmVsKTogTWFrZSBub24tc3RhdGljLgotCShwb3RhYmxlKTogQWRkIG5vcGFnZSwgcGFnZSwgcGxlbi4KLQkoc19vcmcpOiBFcnJvciBpZiBpbiBNUkkgbW9kZS4KLQkqIHJlYWQuaCAobXJpX2xpbmVfbGFiZWwpOiBEZWNsYXJlLgotCSogbGlzdGluZy5jIChsaXN0aW5nX25vcGFnZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpc3RpbmcuaCAobGlzdGluZ19ub3BhZ2UpOiBEZWNsYXJlLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9iZWdpbik6IFNldCBzeV9mcmFnIG9mIGFic19zeW1ib2wgdG8KLQkmemVyb19hZGRyZXNzX2ZyYWcuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogQ2hlY2sgdGhhdCBzeW1ib2wgaXMgbm90IE5VTEwKLQliZWZvcmUgY2hlY2tpbmcgc3lfbXJpX2NvbW1vbi4KLQkoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChhYnNfc2VjdGlvbl9vZmZzZXQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShwb3RhYmxlKTogQWRkIG9mZnNldCwgc3RydWN0LgotCShkb19vcmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uOyBoYW5kbGUgY2hhbmdpbmcgdGhlIG9yaWdpbiBpbiB0aGUKLQlhYnNvbHV0ZSBzZWN0aW9uLgotCShzX29yZyk6IFVzZSBkb19vcmcuCi0JKHNfc2V0KTogTGlrZXdpc2UuCi0JKGVxdWFscyk6IExpa2V3aXNlLgotCShzX3NwYWNlKTogSW4gYWJzb2x1dGVfc2VjdGlvbiwganVzdCBpbmNyZWFzZSBhYnNfc2VjdGlvbl9vZmZzZXQuCi0JKHNfc3RydWN0KTogTmV3IGZ1bmN0aW9uLgotCShlbWl0X2V4cHIpOiBIYW5kbGUgYWJzb2x1dGVfc2VjdGlvbiBzcGVjaWFsbHkuCi0JKiByZWFkLmggKGFic19zZWN0aW9uX29mZnNldCk6IERlY2xhcmUuCi0JKHNfc3RydWN0KTogRGVjbGFyZS4KLQkqIGZyYWdzLmMgKGZyYWdfbW9yZSk6IFdhcm4gaWYgaW4gYWJzb2x1dGVfc2VjdGlvbi4KLQkoZnJhZ19ub3dfZml4KTogSW4gYWJzb2x1dGVfc2VjdGlvbiwgcmV0dXJuIGFic19zZWN0aW9uX29mZnNldC4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSk6IElmIHN3aXRjaGluZyB0byBhYnNvbHV0ZV9zZWN0aW9uLAotCWp1c3Qgc2V0IG5vd19zZWcgYW5kIG5vd19zdWJzZWcuCi0JKHN1YnNlZ19zZXRfcmVzdCk6IFNwZWNpYWwgaGFuZGxpbmcgd2hlbiBzd2l0Y2hpbmcgdG8gb3IgZnJvbQotCWFic29sdXRlX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfZmxvYXRfY29wbnVtKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIGZvcHQgYW5kIG1hc2syLgotCShtNjhrX2lwKTogVXNlIG02OGtfZmxvYXRfY29wbnVtLCBub3QgQ09QTlVNLCB3aGVuIHNldHRpbmcKLQljb3Byb2Nlc3NvciByZWdpc3RlciB0byB1c2UuICBJbiBjYXNlICdJJyB3aGVuIGNoZWNraW5nIG9wZXJhbmRzLAotCWNvcnJlY3QgY29wcm9jZXNzb3IgcmVnaXN0ZXIgbnVtYmVycy4gIEluIGNhc2UgJ0knIHdoZW4gc2V0dGluZwotCW9wZXJhbmRzLCBkb24ndCBhZGQgMS4KLQkoc19mb3B0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKENPUE5VTSk6IERvbid0IGRlZmluZS4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIGlmZXEsIGlmZ2UsIGlmZ3QsIGlmbGUsIGlmbHQsIGlmbmUuCi0JQ2hhbmdlIGlmIHRvIHBhc3MgT19uZSB0byBzX2lmLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBEb24ndCBkZWZpbmUgYW4gbGFiZWwgd2l0aG91dCBhIGNvbG9uIGlmCi0JaWdub3JlX2lucHV0IHJldHVybnMgdHJ1ZS4KLQkqIGNvbmQuYyAoc19pZik6IFRyZWF0IGFyZ3VtZW50IGFzIGFuIG9wZXJhdG9yVCBkZXNjcmliaW5nIGhvdyB0bwotCWNvbXBhcmUgdGhlIGFyZ3VtZW50IGFnYWluc3QgemVyby4KLQkoaWdub3JlX2lucHV0KTogRG9uJ3QgcmVxdWlyZSBhbiBpbml0aWFsIGRvdCBpbiBNUkkgbW9kZSwgb3IgaWYKLQlOT19QU0VVRE9fRE9UIGlzIGRlZmluZWQuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBkY2IsIGRjYi5iLCBkY2IuZCwgZGNiLmwsIGRjYi5zLCBkY2IudywKLQlkY2IueCwgZHMuZCwgZHMucCwgZHMucywgZHMueCwgZWxzZWMsIGVuZGMsIGZhaWwsIGZvcm1hdCwgbGxlbiwKLQlub2Zvcm1hdC4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgcHNldWRvLW9wIGhhbmRsZXIgaXMgc19lbmQsIHF1aXQKLQlpbW1lZGlhdGVseS4KLQkoc19lbmQpOiBOZXcgZnVuY3Rpb24uCi0JKHNfZmFpbCk6IE5ldyBmdW5jdGlvbi4KLQkoc19mbG9hdF9zcGFjZSk6IE5ldyBmdW5jdGlvbi4KLQkoaGV4X2Zsb2F0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZmxvYXRfY29ucyk6IFVzZSBoZXhfZmxvYXQuCi0JKiByZWFkLmggKHNfZmFpbCk6IERlY2xhcmUuCi0JKHNfZmxvYXRfc3BhY2UpOiBEZWNsYXJlLgotCSogY29uZC5jIChzX2VuZCk6IFJlbW92ZS4KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19wc2l6ZSk6IFRyZWF0IGFyZ3VtZW50IGFzIGluZGljYXRpbmcgd2hldGhlcgotCWEgaGVpZ2h0IGlzIGV4cGVjdGVkLgotCi0JKiByZWFkLmMgKG1yaV9wZW5kaW5nX2FsaWduKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogSGFuZGxlIG1yaV9wZW5kaW5nX2FsaWduLgotCShjb25zKTogU2V0IG1yaV9wZW5kaW5nX2FsaWduIGlmIGFwcHJvcHJpYXRlLgotCi0JKiBjb25maWd1cmUuaW46IE1vdmUgcmFuZG9tIHNwZWNpYWwgdGFyZ2V0IGhhbmRsaW5nIGJlZm9yZQotCXBvc3NpYmxlIGJyZWFrLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgQXVnICA4IDIzOjQxOjI1IDE5OTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlndXJlLmluOiBDb25zaXN0ZW50bHkgdXNlICR7dGFyZ2V0X2NwdV90eXBlfSByYXRoZXIgdGhhbgotCSR7Y3B1X3R5cGV9IGFmdGVyIHRoZSBsb29wLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKHRhcmctY3B1Lm8pOiBVc2UgQHRhcmdldF9jcHVfdHlwZUAgcmF0aGVyIHRoYW4KLQlAY3B1X3R5cGVALgotCi1UdWUgQXVnICA4IDE3OjI3OjE3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBleHByLmggKG9wZXJhdG9yVCk6IFJlbW92ZSBjb21tYSBhZnRlciBsYXN0IGVudW1lcmF0b3IgdmFsdWUuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmM6IFNvbWUgd2hpdGVzcGFjZSBjbGVhbnVwIGZyb20gUGF0IFJhbmtpbi4KLQotCSogYXMuaCAoYWxsb2NhKTogSWYgX19TVERDX18sIGRlY2xhcmUgdm9pZCogaW5zdGVhZCBvZiBjaGFyKi4KLQotCVdlZCBBdWcgIDIgMTg6NTQ6MzcgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciwKLQlDbG9zZV9WTVNfT2JqZWN0X0ZpbGUpOiBSZW9yZ2FuaXplIHRoZSBgI2lmICFWTVMnIGNyb3NzLWFzc21lYmxlcgotCXN1cHBvcnQgY29kZS4KLQkoQ2xvc2VfVk1TX09iamVjdF9GaWxlKTogQ2FsbCBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCB0byBmbHVzaAotCW91dHB1dCBidWZmZXItLWp1c3QgaW4gY2FzZS0tYmVmb3JlIGNsb3NpbmcgdGhlIGZpbGUuCi0KLVR1ZSBBdWcgIDggMTM6MDc6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChhcmNocyk6IEFkZCA2OGVjMDAwLCA2OGhjMDAwLCA2OGhjMDAxLAotCTY4ZWMwMjAsIDY4ZWMwMzAsIDY4ZWMwNDAsIGFuZCA2ODMzMC4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIGNoaXAgYW5kIGNvbWxpbmUuCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogVXNlIHN0cmNhc2VjbXAgd2hlbiBjb21wYXJpbmcgZGVmYXVsdF9jcHUKLQlhZ2FpbnN0IGFyY2hpdGVjdHVyZXMuCi0JKG1yaV9jaGlwLCBzX2NoaXApOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpOiBBZGQgc3lfbXJpX2NvbW1vbiBiaXQuCi0JKiByZWFkLmggKG1yaV9jb21vbl9zeW1ib2wpOiBEZWNsYXJlLgotCShzX21yaV9jb21tb24pOiBEZWNsYXJlLgotCSogcmVhZC5jIChtcmlfbGluZV9sYWJlbCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1yaV9jb21tb25fc3ltYm9sKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkocG90YWJsZSk6IEFkZCAiY29tbW9uIiBhbmQgImNvbW1vbi5zIi4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogSW4gTVJJIG1vZGUsIHNldCBtcmlfbGluZV9sYWJlbCBmb3IgYSBsYWJlbAotCWF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCi0JKHNfbXJpX2NvbW1vbik6IE5ldyBmdW5jdGlvbi4KLQkoc19zcGFjZSk6IEhhbmRsZSBtcmlfY29tbW9uX3N5bWJvbC4KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDaGFuZ2UgcmV0dXJuIHZhbHVlIGZyb20gdm9pZCB0byBzeW1ib2xTICosCi0JYW5kIHJldHVybiBuZXcgc3ltYm9sLiAgSWYgbXJpX2NvbW1vbl9zeW1ib2wgaXMgc2V0LCBhdHRhY2ggdGhlCi0JbmV3IHN5bWJvbCB0byBpdC4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgYW4gc3lfbXJpX2NvbW1vbiBzeW1ib2wuCi0JKiBzeW1ib2xzLmggKGNvbG9uKTogQ2hhbmdlIHJldHVybiB2YWx1ZSBpbiBkZWNsYXJhdGlvbi4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogQ2xlYXIgbXJpX2NvbW1vbl9zeW1ib2wuCi0JKHN1YnNlZ19zZXQgKGJvdGggdmVyc2lvbnMpKTogTGlrZXdpc2UuCi0JKiBmcmFncy5jIChmcmFnX21vcmUpOiBXYXJuIGlmIG1yaV9jb21tb25fc3ltYm9sIGlzIG5vdCBOVUxMLgotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBTa2lwIHN5X21yaV9jb21tb24gc3ltYm9scy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXNjYXJkIHN5X21yaV9jb21tb24gc3ltYm9scy4KLQkoZml4dXBfc2VnbWVudCk6IENoYW5nZSByZWxvY2F0aW9ucyBhZ2FpbnN0IHN5X21yaV9jb21tb24gc3ltYm9scwotCXRvIGJlIGFnYWluc3QgdGhlIGNvbW1vbiBzeW1ib2wgaXRzZWxmLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHlhbmtfc3ltYm9scyk6IERpc2NhcmQgc3lfbXJpX2NvbW1vbiBzeW1ib2xzLgotCShmaXh1cF9zZWdtZW50KTogQ2hhbmdlIHJlbG9jYXRpb25zIGFnYWluc3Qgc3lfbXJpX2NvbW1vbiBzeW1ib2xzCi0JdG8gYmUgYWdhaW5zdCB0aGUgY29tbW9uIHN5bWJvbCBpdHNlbGYuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IERpc2NhcmQKLQlzeV9tcmlfY29tbW9uIHN5bWJvbHMuCi0KLQkqIGRvYy9jLW02OGsudGV4aTogQWRkIGRvY3VtZW50YXRpb24gZm9yIENQVSBzcGVjaWZpYyBvcHRpb25zLCBhbmQKLQlmb3IgTW90b3JvbGEgc3ludGF4LgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55IChtb3Rvcm9sYV9vcGVyYW5kKTogRm9yICglcGMpLCBzZXQgbW9kZSB0bwotCURJU1AsIG5vdCBCQVNFLgotCi1UdWUgQXVnICA4IDAyOjMxOjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChyZWxheF9hbGlnbik6IEFkZCBleHRyYSBwYWRkaW5nIGZvciBsaW5rcmVsYXggb25seSBpZgotCUxJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkgaXMgZGVmaW5lZC4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkpOiBEZWZpbmUgaXQuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKFJlbGF4YXRpb24pOiBXcml0ZSB1cCBzb21lIHN0dWZmIG9uIGxpbmtlcgotCXJlbGF4aW5nIGFuZCBMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZLgotCi1Nb24gQXVnICA3IDE3OjE4OjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL202OGstcGFyc2UueTogTmV3IGZpbGU6IGJpc29uIGdyYW1tYXIgZm9yIG02OGsgb3BlcmFuZHMsCi0JaW5jbHVkaW5nIHN1cHBvcnQgZm9yIE1vdG9yb2xhIHN5bnRheC4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmg6IE5ldyBmaWxlOyBkZWZpbml0aW9ucyBzaGFyZWQgYmV0d2VlbgotCW02OGstcGFyc2UueSBhbmQgdGMtbTY4ay5jLgotCSogY29uZmlnL3RjLW02OGsuYzogSW5jbHVkZSBtNjhrLXBhcnNlLmguCi0JKGVudW0gb3BlcmFuZF90eXBlKTogTW92ZSB0byBtNjhrLXBhcnNlLmgsIHdoZXJlIGl0IGlzIG5hbWVkCi0JbTY4a19vcGVyYW5kX3R5cGUuICBSZW5hbWUgYWxsIHVzZXMuICBSZWFycmFuZ2Ugc29tZXdoYXQuICBBZGQKLQlGUFJFRy4gIFJlbmFtZSBBT0ZGIHRvIERJU1AuICBSZW5hbWUgQUlORFggdG8gQkFTRS4gIFJlbmFtZSBBUE9EWAotCXRvIFBPU1QuICBSZW5hbWUgQVBSRFggdG8gUFJFLiAgUmVtb3ZlIEFNSU5ELiAgUmVuYW1lIE1TQ1IgdG8KLQlDT05UUk9MLiAgUmVtb3ZlIERJTkRSLgotCShzdHJ1Y3QgbTY4a19leHApOiBNb3ZlIHRvIG02OGstcGFyc2UuaC4gIFJlbW92ZSBlX2JlZywgZV9lbmQgYW5kCi0JZV9zZWcgZmllbGRzLiAgUmVuYW1lIGVfZXhwIHRvIGV4cC4gIFJlbmFtZSBlX3NpeiB0byBzaXplLCBhbmQKLQljaGFuZ2UgdHlwZSB0byBlbnVtIG02OGtfc2l6ZS4gIENoYW5nZSBhbGwgdXNlcy4KLQkoZW51bSBfcmVnaXN0ZXIpOiBNb3ZlIHRvIG02OGstcGFyc2UuaCwgd2hlcmUgaXQgaXMgbmFtZWQKLQltNjhrX3JlZ2lzdGVyLiAgUmVuYW1lIGFsbCB1c2VzLiAgQWRkIFpEQVRBMC03IGFuZCBaQUREUjAtNy4KLQkoc3RydWN0IG02OGtfb3ApOiBNb3ZlIHRvIG02OGstcGFyc2UuaC4gIENoYW5nZSBhbGwgZmllbGRzLgotCShzZWcpOiBEb24ndCBkZWZpbmUuCi0JKGFkZF9leHApOiBSZW1vdmUuCi0JKEZBSUwsIE9LKTogUmVtb3ZlLgotCShtNjhrX3JlZ19wYXJzZSk6IE1vdmUgdG8gbTY4ay1wYXJzZS55LCBhbmQgcmV3cml0ZS4KLQkoU0tJUF9XSElURSwgU0tJUF9XKTogUmVtb3ZlLgotCSh0cnlfbW90b19pbmRleCwgdHJ5X2luZGV4KTogUmVtb3ZlLgotCShtNjhrX2lwX29wKTogTW92ZSB0byBtNjhrLXBhcnNlLnksIGFuZCByZXdyaXRlIHRvIHVzZSBncmFtbWFyLgotCShtYWluKTogUmVtb3ZlIG9ic29sZXRlIHRlc3QgZnVuY3Rpb24uCi0JKG02OGtfaXApOiBFeHRlbnNpdmUgY2hhbmdlcyB0byB1c2UgbmV3IGdyYW1tYXIuCi0JKGdldF9yZWdzKTogUmVtb3ZlLgotCShjcmFja19vcGVyYW5kKTogbTY4a19pcF9vcCBub3cgcmV0dXJucyAwIG9uIHN1Y2Nlc3MuCi0JKGluaXRfdGFibGUpOiBBZGQgc3NwLCB6ZDAtNyBhbmQgemEwLTcuCi0JKG1kX2Fzc2VtYmxlKTogTWFrZSBlciBjb25zdC4gIENvcnJlY3QgbG9vcCBvdmVyIG9wZXJhbmRzIHdoZW4KLQlsb29raW5nIGZvciBlcnJvciBtZXNzYWdlLgotCShtZF9iZWdpbik6IFNldCBhbHRfbm90ZW5kX3RhYmxlIGZvciAnKCcgYW5kICdAJy4KLQkoZ2V0X251bSk6IEV4cHJlc3Npb24gaXMgYWxyZWFkeSBwYXJzZWQuICBEb24ndCBzZXQgc2VnLgotCSogY29uZmlndXJlLmluOiBJZiBjcHVfdHlwZSBpcyBtNjhrLCBwdXQgbTY4ay1wYXJzZS5vIGluCi0JZXh0cmEtb2JqZWN0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBBZGQgbTY4ay1wYXJzZS5jLgotCShCSVNPTik6IFVzZSAuLi9iaXNvbi9iaXNvbiBpZiBpdCBleGlzdHMuCi0JKEJJU09ORkxBR1MpOiBEZWZpbmUgYXMgZW1wdHkuCi0JKFRBUkdfQ1BVX0RFUF9tNjhrKTogRGVwZW5kIHVwb24gJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmguCi0JKG02OGstcGFyc2UuYywgbTY4ay1wYXJzZS5vKTogTmV3IHRhcmdldHMuCi0KLU1vbiBBdWcgIDcgMDI6NTQ6MjAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChwYXJzZV9yZWcpOiBIYW5kbGUgbmV3IEZQIHJlZ2lzdGVycy4KLQkoZ2V0X3NwZWNpZmljKTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGVzLgotCi1GcmkgQXVnICA0IDEyOjI5OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcF9lbmNvZGluZyk6IE1ha2Ugbm9uLWNvbnN0LiAgRG9uJ3Qgc2V0ICciJyB0bwotICAgICAgICBPX2JpdF9ub3QuCi0JKGV4cHJfYmVnaW4pOiBTZXQgb3BfZW5jb2RpbmdbJyInXSBpbiBNUkkgbW9kZS4KLQotV2VkIEF1ZyAgMiAxODozOTo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IFJlbW92ZSBCUkVBS19VUF9CSUdfREVDTCBzdHVmZi4KLQkoc3RydWN0IG02OGtfaW5jYW50KTogQ2hhbmdlIG1fb3BlcmFuZHMgZmllbGQgdG8gYmUgY29uc3QuCi0JKHN0cnVjdCBtNjhrX2l0KTogQ2hhbmdlIGFyZ3MgZmllbGQgdG8gYmUgY29uc3QuCi0JKG02OGtfaXApOiBDaGFuZ2UgbG9jYWwgdmFyaWFibGUgcyB0byBiZSBjb25zdC4KLQkob3Bjb2RlX3B0cik6IFJlbW92ZS4KLQkobWRfYmVnaW4pOiBVc2UgbTY4a19udW1vcGNvZGVzLCBub3QgbnVtb3Bjb2Rlcy4gIFVzZQotCW02OGtfb3Bjb2Rlcywgbm90IHJlbW92ZWQgb3Bjb2RlX3B0ci4gIFVzZSBtNjhrX251bWFsaWFzZXMsIG5vdAotCW51bWFsaWFzZXMuCi0KLVR1ZSBBdWcgIDEgMTc6MzU6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbml0X3RhYmxlKTogQWRkICJjb250cm9sIiwgInN0YXR1cyIsICJpYWRkciIsCi0JInNmY3IiLCBhbmQgImRmY3IiIGFzIHN5bm9ueW1zIGZvciBleGlzdGluZyBlbnRyaWVzLgotCShtZF9iZWdpbik6IEluIE1SSSBtb2RlLCBmb3JjZSBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgdG8gMS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUmVtb3ZlZCB1bnVzZWQgbG9jYWxzIGkgYW5kIGFyY2guICBDaGFuZ2UgdHlwZQotCW9mIGFyY2ggKGFub3RoZXIgb25lKSB0byB1bnNpZ25lZCBsb25nLgotCSh0Y19jb2ZmX3NpemVtYWNoZGVwKTogQWRkIHJldHVybiBhZnRlciBhYm9ydCB0byBhdm9pZCB3YXJuaW5nLgotCi0JSW5pdGlhbCBzdXBwb3J0IGZvciBNUkkgc3R5bGUgbGFiZWxzIGFuZCBleHByZXNzaW9ucy4KLQkqIGFzLmggKGZsYWdfbXJpKTogRGVjbGFyZS9kZWZpbmUuCi0JKiBhcy5jIChzaG93X3VzYWdlKTogTWVudGlvbiAtTSBhbmQgaXRzIHN5bm9ueW0gLS1tcmkuCi0JKHBhcnNlX2FyZ3MpOiBBZGQgJ00nIHRvIHN0ZF9zaG9ydG9wdHMuICBBZGQgIm1yaSIgdG8KLQlzdGRfbG9uZ29wdHMuICBTZXQgZmxhZ19tcmkgaWYgLU0gaXMgc2Vlbi4KLQkobWFpbik6IENhbGwgcGFyc2VfYXJncyBiZWZvcmUgaW5wdXRfc2NydWJfYmVnaW4uICBDYWxsCi0JZXhwcl9iZWdpbi4KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IERvbid0IHNldCBsZXggZm9yICciJyBvciAnXCcnIGluIE1SSQotCW1vZGUuICBEbyBzZXQgbGV4IGZvciAnOycsICcqJywgYW5kICchJyBpbiBNUkkgbW9kZS4KLQkoZG9fc2NydWJfbmV4dF9jaGFyKTogUmVtb3ZlIE1SSSBpZmRlZiBpbiBMRVhfSVNfV0hJVEVTUEFDRSBjYXNlLgotCUluIE1SSSBtb2RlLCBrZWVwIHNwYWNlcyBiZXR3ZWVuIGxhYmVscyBhbmQgY29sb25zLiAgUmVtb3ZlIE1SSQotCWlmbmRlZiBhcm91bmQgTEVYX0lTX09ORUNIQVJfUVVPVEUgY2FzZS4gIEluIE1SSSBtb2RlLCBkb24ndCB1c2UKLQknIScgb3IgJyonIGFzIGNvbW1lbnQgY2hhcmFjdGVycyBldmVuIGlmIHRoZXkgYXJlIGluCi0JY29tbWVudF9jaGFycy4KLQkqIHJlYWQuaCAobGV4X3R5cGUpOiBObyBsb25nZXIgY29uc3QuCi0JKiByZWFkLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKGxleF90eXBlKTogTm8gbG9uZ2VyIGNvbnN0LgotCShyZWFkX2JlZ2luKTogSW4gTVJJIG1vZGUsIHNldCBsZXhfdHlwZSBvZiAnPycgdG8gMy4KLQkocG90YWJsZSk6IEFkZCBkYywgZGMuYiwgZGMuZCwgZGMubCwgZGMucywgZGMudywgZGMueCwgZHMsIGRzLmIsCi0JZHMubCwgZHMudywgYW5kIHhkZWYuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENoYW5nZSBMQUJFTFNfV0lUSE9VVF9DT0xPTiBpZmRlZiB0byBjaGVjawotCWZvciBNUkkgbW9kZSBhdCBydW50aW1lIHJhdGhlciB0aGFuIGNvbXBpbGUgdGltZS4gIEhhbmRsZSB0aGUgRVFVCi0JcHNldWRvLW9wIGluIE1SSSBtb2RlLiAgUmVtb3ZlIGJvZ3VzIE1SSSBpZmRlZiBhcm91bmQgZG9uZV9wc2V1ZG8uCi0JQ2hhbmdlIE5PX1BTRVVET19ET1QgaWZkZWYgdG8gYWxzbyB0YWtlIGVmZmVjdCBmb3IgTVJJIG1vZGUgYXQKLQlydW50aW1lLgotCShjb25zKTogSW4gTVJJIG1vZGUsIGFsd2F5cyBjYWxsIHBhcnNlX21yaV9jb25zIHJhdGhlciB0aGFuCi0JVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OLgotCShwYXJzZV9tcmlfY29ucyk6IEFsd2F5cyBjb21waWxlLCBub3QganVzdCB3aGVuIE1SSSBpcyBkZWZpbmVkLgotCUNhbGwgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OLCBub3QgZXhwcmVzc2lvbiwgd2hlbiB0aGUgaW5wdXQgaXMKLQlub3QgYSBzdHJpbmcgY29uc3RhbnQuICBIYW5kbGUgQSBhbmQgRSBtb2RpZmllcnMuCi0JKGZsb2F0X2NvbnMpOiBBY2NlcHQgOnh4eHgsIHdoZXJlIHRoZSB4J3MgYXJlIGhleCBkaWdpdHMuCi0JKiBleHByLmggKG9wZXJhdG9yVCk6IEFkZCBPX2VxLCBPX25lLCBPX2x0LCBPX2xlLCBPX2dlLCBPX2d0LgotCShleHByX2JlZ2luKTogRGVjbGFyZS4KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IEluIE1SSSBtb2RlLCBpZiB0aGUgYmFzZSB3YXMgbm90Ci0Jc3BlY2lmaWVkLCBsb29rIGZvciBhIHN1ZmZpeCBvbiB0aGUgbnVtYmVyIHRvIHNldCB0aGUgYmFzZS4KLQkobXJpX2NoYXJfY29uc3RhbnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvcGVyYW5kKTogUmVtb3ZlIE1SSSBpZmRlZi4gIEluIE1SSSBtb2RlLCBkbyB2YXJpb3VzIHRoaW5nczogUGFzcwotCTAgYXMgdGhlIGJhc2Ugd2hlbiBjYWxsaW5nIGludGVnZXJfY29uc3RhbnQgaWYgdGhlcmUgd2FzIG5vCi0JcHJlZml4LiAgQ2hlY2sgZm9yIGEgaGV4IGNvbnN0YW50IHN1ZmZpeCBpZiB3aGVuIGEgbGVhZGluZyAnMCcgaXMKLQlzZWVuLiAgRG9uJ3QgYWNjZXB0IDB4IG9yIDBiIGFzIGEgcHJlZml4LiAgQ2hlY2sgZm9yIEUnY2hhcnMnIGFuZAotCUEnY2hhcnMnLiAgSGFuZGxlIE1SSSBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgVHJlYXQgJyInIGFzIHRoZQotCXVuYXJ5IGJpdHdpc2Ugbm90IG9wZXJhdG9yLiAgVHJlYXQgJCBhcyB0aGUgcHJvZ3JhbSBjb3VudGVyLCBvciBhcwotCXRoZSBwcmVmaXggZm9yIGEgaGV4IGNvbnN0YW50LiAgVHJlYXQgJSBhcyB0aGUgcHJlZml4IGZvciBhIGJpbmFyeQotCWNvbnN0YW50IGFuZCBAIGFzIHRoZSBwcmVmaXggZm9yIGFuIG9jdGFsIGNvbnN0YW50LiAgVHJlYXQgOiBhcwotCXRoZSBwcmVmaXggZm9yIGEgaGV4IGNvbnN0YW50LgotCShvcF9lbmNvZGluZyk6IFNldCAnIicgdG8gT19iaXRfbm90LCAnPCcgdG8gT19sdCwgYW5kICc+JyB0byBPX2d0LgotCShvcF9yYW5rKTogTm8gbG9uZ2VyIGNvbnN0LiAgQ2hhbmdlIHJhbmsgdmFsdWVzLgotCShleHByX2JlZ2luKTogTmV3IGZ1bmN0aW9uLgotCShvcGVyYXRvcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGV4cHIpOiBVc2Ugb3BlcmF0b3IuICBEb24ndCBib3RoZXIgdG8gbWVudGlvbiB0aGUgb3BlcmF0b3IgaW4KLQl3YXJuaW5ncy4gIFJlbW92ZSBib2d1cyAjaWYgMCBjb2RlLiAgSGFuZGxlIG5ldyBvcGVyYXRvclQgdmFsdWVzLgotCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IEluIE1SSSBtb2RlLCBhY2NlcHQgdW5kZXJzY29yZXMKLQlhcm91bmQgdGhlIGV4cG9uZW50IGluIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCi0JKiBzeW1ib2xzLmggKHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUpOiBEZWNsYXJlLgotCSogc3ltYm9scy5jIChzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoc3ltYm9sX2NyZWF0ZSk6IENoZWNrIHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUuCi0JKHN5bWJvbF9maW5kX2Jhc2UpOiBMaWtld2lzZS4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgbmV3IG9wZXJhdG9yVCB2YWx1ZXMuCi0JKHByaW50X2V4cHJfMSk6IExpa2V3aXNlLgotCShTX0lTX0xPQ0FMKTogSW4gTVJJIG1vZGUsIG5hbWVzIGJlZ2lubmluZyB3aXRoIHR3byAnPycgY2hhcmFjdGVycwotCWFyZSBsb2NhbC4KLQotVHVlIEF1ZyAgMSAxMTozNToxOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB0Yy1zaC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBNYWtlIHNvbWUgZXJyb3IgbWVzc2FnZXMgbW9yZQotCWV4cGxpY3QuCi0KLU1vbiBKdWwgMzEgMjE6NDA6NDcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlTYXQgSnVsIDI5IDE4OjU1OjIzIDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChDT1BZX1NIT1JULCBDT1BZX0xPTkcsIFBVVF9TSE9SVCwgUFVUX0xPTkcpOgotCU1ha2UgZXhwYW5zaW9uIGJlIHNhZmUgZm9yIHVzZSBpbiBleHByZXNzaW9ucy4KLQkoUFVUX0NPVU5URURfU1RSSU5HKTogQnJhY2tldCBleHBhbnNpb24gd2l0aCBgZG8gey4uLn0gd2hpbGUgKDApJwotCXJhdGhlciB0aGFuIGp1c3QgYHsuLi59Jy4KLQotTW9uIEp1bCAzMSAxODoxOToyNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBnYXNwLmMgKG1haW4pOiBQYXJzZSAtSSBvcHRpb24uCi0JKGRvX2luY2x1ZGUpOiBMb29rIHRocm91Z2ggaW5jbHVkZSBsaXN0LgotCSogZ2FzcC5jIChjaGFuZ2VfYmFzZSk6IERvbid0IG1vZGlmeSBudW1iZXJzIGluIHN0cmluZ3MuIAotCi1Nb24gSnVsIDMxIDEyOjE2OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5oIChTVUJfU0VHTUVOVF9BTElHTik6IERlZmluZS4gIEZyb20gTmljbGFzCi0JQW5kZXJzc29uIDxuaWNhbkBpZGEubGl1LnNlPi4KLQotVGh1IEp1bCAyNyAyMDo0NzoxMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBkbyBmdXJ0aGVyIHBjcmVsCi0JcHJvY2Vzc2luZyBhZnRlciBjb252ZXJ0aW5nIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gdGhlCi0Jc2FtZSBzZWdtZW50LiAgRnJvbSBKaW0gV2lsc29uLgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1saW51eG9sZGxkKTogQWRkIGFzIHN5bm9ueW0gZm9yCi0JaTM4Ni0qLWxpbnV4KmFvdXQqLiAgRnJvbSBGcmVkIEZpc2guCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UaHUgSnVsIDI3IDE2OjE0OjU2IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChlbnVtIHBzX3R5cGUge3BzX1RFWFQscHNfREFUQSxwc19DT01NT04sCi0JcHNfQ09OU1R9KTogTmV3IGNvbnN0YW50cy4KLQkoVk1TX1BzZWN0X1NwZWMpOiBVc2UgdGhlbSBpbnN0ZWFkIG9mIGxpdGVyYWwgc3RyaW5ncy4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlLCBnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSk6IEFkanVzdCBjYWxsZXJzLgotCi1XZWQgSnVsIDI2IDE4OjMxOjM1IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChjb25zdF9mbGFnKTogQ2hhbmdlIGZyb20gY2hhciB0byB1bnNpZ25lZCBjaGFyLgotCSogY29uZmlnL29iai12bXMuaCAoY29uc3RfZmxhZyk6IERpdHRvLgotCShzdHJ1Y3Qgbmxpc3QpOiBSZXBsYWNlIHVuaW9uIG5fdW4gYW5kIG5fdW4ue25fbmFtZSxuX25leHQsbl9zdHJ4fQotCWZpZWxkcyB3aXRoIGp1c3Qgbl9uYW1lOyBkZWxldGUgZmllbGQgbl92YWx1ZTsgY2hhbmdlIG5fb3RoZXIgZnJvbQotCWNoYXIgdG8gdW5zaWduZWQgY2hhciBhbmQgbl9kZXNjIGZyb20gc2hvcnQgdG8gaW50OyBpbnNlcnQgZXhwbGljaXQKLQlwYWRkaW5nIGZvciBhbGlnbm1lbnQuCi0KLU1vbiBKdWwgMjQgMjA6MDY6MTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuaCAoc3RydWN0IHNlZ19pbmZvX3RyYXNoKTogTWFrZSBiaXRmaWVsZCB0eXBlcyB2YWxpZC4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMb2NhbCBhZGRfbnVtYmVyIHNob3VsZCBub3QKLQliZSBkZWNsYXJlZCByZWdpc3RlciBzaW5jZSBpdHMgYWRkcmVzcyBpcyB0YWtlbiBmb3IKLQlNRF9BUFBMWV9GSVgzLgotCi0JRnJpIEp1bCAyMSAxNToyODoxOCAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCVNwbGl0IGh1Z2Ugdm1zX3dyaXRlX29iamVjdF9maWxlIHJvdXRpbmUgaW50byBtYW5hZ2FibGUgcGllY2VzLgotCi0JKiBjb25maWcvb2JqLXZtcy5jICh2bXNfZml4dXBfdGV4dF9zZWN0aW9uLCBzeW50aGVzaXplX2RhdGFfc2VnbWVudCwKLQl2bXNfZml4dXBfZGF0YV9zZWN0aW9uLCBnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSwgbG9jYWxfc3ltYm9sc19EU1QsCi0Jdm1zX2J1aWxkX0RTVCk6IE5ldyByb3V0aW5lcy4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlKTogQ2FsbCB0aGVtLgotCShzdHJ1Y3Qgdm1zX29ial9zdGF0ZSk6IE5ldyBmaWxlIHNjb3BlIHZhcmlhYmxlIHVzZWQgYnkgdGhlIGFib3ZlLgotCi1Nb24gSnVsIDI0IDE0OjEwOjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAidXNlcyIuCi0JKHNfdXNlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNoX2NvZmZfZnJvYl9maWxlKTogTmV3IGZ1bmN0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBDYWxsIHN1YnNlZ19jaGFuZ2UgYmVmb3JlIGNhbGxpbmcgZml4X25ldy4KLQkoc2hfaGFuZGxlX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCShTV0lUQ0hfVEFCTEUpOiBEZWZpbmUuCi0JKHNoX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBSX1NIX1VTRVMsIFJfU0hfQ09VTlQgYW5kIFJfU0hfQUxJR04uCi0JKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogTGlrZXdpc2UuICBBbHNvIGhhbmRsZSBzd2l0Y2ggdGFibGUKLQllbnRyaWVzLgotCSogY29uZmlnL3RjLXNoLmggKEhBTkRMRV9BTElHTik6IERlZmluZS4KLQkoc2hfaGFuZGxlX2FsaWduKTogRGVjbGFyZS4KLQkoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZS4KLQkoc2hfZm9yY2VfcmVsb2NhdGlvbik6IERlY2xhcmUuCi0JKFRDX0NPVU5UX1JFTE9DKTogU2ltcGxpZnk7IHJlbHkgb24gVENfRk9SQ0VfUkVMT0NBVElPTiBpbnN0ZWFkLgotCSh0Y19mcm9iX2ZpbGUpOiBEZWZpbmUuCi0JKHNoX2NvZmZfZnJvYl9maWxlKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgdGNfZnJvYl9maWxlIGlmIGl0Ci0JaXMgZGVmaW5lZC4KLQkoZml4dXBfbWRlcHMpOiBDYWxsIEhBTkRMRV9BTElHTiBpZiBpdCBpcyBkZWZpbmVkLgotCShUQ19GT1JDRV9SRUxPQ0FUSU9OKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShmaXh1cF9zZWdtZW50KTogVXNlIFRDX0ZPUkNFX1JFTE9DQVRJT04gdG8gZGVjaWRlIHdoZXRoZXIgdG8KLQljbGVhciB0aGUgc3ltYm9sIGZpZWxkcyBvZiBmaXhQLgotCi1GcmkgSnVsIDIxIDIyOjM4OjAwIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogQWRkIHN1cHBvcnQgZm9yIFJfUFBDX1NEQVJFTAotCXJlbG9jYXRpb24uCi0JKG1kX2FwcGx5X2ZpeDMpOiBEaXR0by4KLQotVGh1IEp1bCAyMCAxMzowMDo1NiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfY29udmVydF9mcmFnKTogUmVuYW1lIGFyZ3VtZW50IHNlZyB0byBzZWMsCi0Jc2luY2Ugc2VnIGlzIGEgbWFjcm8gbmFtZSBpbiB0aGlzIGZpbGUuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYXJtLSotcmlzY2l4Kik6IERvbid0IHNldCBlbXVsYXRpb24uCi0KLVdlZCBKdWwgMTkgMTY6MDg6MjkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKFRFX1BFKTogRGVsZXRlLgotCSogY29uZmlnL3RjLWFybS5oIChCWVRFX09SREVSKTogRGVsZXRlLgotCShUQVJHRVRfRk9STUFUKTogUHJvdmlkZSB2YWx1ZSBmb3IgT0JKX0NPRkYgYW5kIFRFX1BFLgotCShBUk1fQklfRU5ESUFOKTogRGVmaW5lIGlmIE9CSl9DT0ZGIGFuZCBURV9QRS4KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYnl0ZV9vcmRlcik6IERlbGV0ZS4KLQkobWRfbnVtYmVyX3RvX2NoYXJzKTogUmVmZXJlbmNlIHRhcmdldF9iaWdfZW5kaWFuLCBub3QgYnl0ZV9vcmRlci4KLQkobWRfY2hhcnNfdG9fbnVtYmVyKTogTGlrZXdpc2UuCi0JKG1kX2xvbmdvcHRzKTogQWRkIC1FQi8tRUwgaWYgQVJNX0JJX0VORElBTi4KLQkobWRfcGFyc2Vfb3B0aW9ucyk6IFJlY29nbml6ZSAtRUIvLUVMLgotCShtZF9zaG93X3VzYWdlKTogTGlzdCAtRUIvLUVMLgotCi1XZWQgSnVsIDE5IDExOjQ5OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChwcm9jZXNzX2Fzc2lnbnMpOiBVc2UgdG91cHBlciBiZWZvcmUgY29tcGFyaW5nIGFnYWluc3QKLQl1cHBlciBjYXNlIGxldHRlci4KLQkod2hhdGNvbmQpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLXNoLmMgKHNoX3JlbGF4KTogUmVuYW1lIGZyb20gcmVsYXgsIGFuZCBtYWtlIGdsb2JhbC4KLQlSZW5hbWVkIGFsbCB1c2VzLgotCShpbnNlcnQpOiBQYXNzIGEgc2l6ZSBvZiAyLCBub3QgNC4KLQkoYnVpbGRfcmVsYXgpOiBSZW1vdmUgdW51c2VkIGxlbiB2YXJpYWJsZS4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLWxpdHRsZSBvcHRpb24uCi0JKG1kX2NvbnZlcnRfZnJhZyk6IEFkZCBzZWdUIGFyZ3VtZW50LiAgUmV3cml0ZSB0byBnZW5lcmF0ZSByZWxvY3MKLQlyYXRoZXIgdGhhbiB0byBnZW5lcmF0ZSBjb21wbGV0ZSBpbnN0cnVjdGlvbnMgaGVyZS4KLQkobWRfYXBwbHlfZml4KTogQWRqdXN0IGFuZCBjbGFyaWZ5IFJfU0hfUENSRUxJTU04Qlk0IGNhc2UgZm9yCi0JY2hhbmdlcyBpbiBpbnNlcnQgYW5kIG1kX3BjcmVsX2Zyb20uICBBZGQgY2FzZXMgZm9yIFJfU0hfUENESVNQCi0JYW5kIFJfU0hfUENESVNQOEJZMi4KLQkobWRfcGNyZWxfZnJvbSk6IERvbid0IHN1YnRyYWN0IDEsIGFkZCAyLgotCSh0Y19jb2ZmX2ZpeDJydHlwZSk6IFJlbW92ZS4KLQkoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtc2guaCAoVENfQ09GRl9GSVgyUlRZUEUpOiBKdXN0IHJldHVybiBmeF9yX3R5cGUuCi0JKHNoX3JlbGF4KTogRGVjbGFyZS4KLQkoVENfQ09VTlRfUkVMT0MpOiBJZiByZWxheGluZywgY291bnQgUEMgcmVsYXRpdmUgcmVsb2NzLgotCShUQ19SRUxPQ19NQU5HTEUpOiBEZWZpbmUuCi0JKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogRGVjbGFyZS4KLQkodGNfY29mZl9zaXplbWFjaGRlcCk6IERlY2xhcmUuCi0JKiB0Yy5oIChtZF9jb252ZXJ0X2ZyYWcpOiBBZGQgc2VnVCBwYXJhbWV0ZXIgdG8gbm9uIEJGRF9BU1NFTUJMRVIKLQlkZWNsYXJhdGlvbi4KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBBZGQgc2VjIGFyZ3VtZW50IHRvIG5vbgotCUJGRF9BU1NFTUJMRVIgdmVyc2lvbi4gIFBhc3MgaXQgdG8gbWRfY29udmVydF9mcmFnLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IFBhc3MgU0VHX1RFWFQgdG8gY3ZzX2ZyYWdfdG9fZmlsbC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogUGFzcyBzZWdtZW50IGluZm8gdG8KLQlUQ19SRUxPQ19NQU5HTEUuCi0JKGZpeHVwX21kZXBzKTogUGFzcyBzZWdtZW50IHR5cGUgdG8gbWRfY29udmVydF9mcmFnLgotCSogY29uZmlnL3RjLWEyOWsuYyAobWRfY29udmVydF9mcmFnKTogQWRkIHNlZ1QgYXJndW1lbnQuCi0JKiBjb25maWcvdGMtaDgzMDAuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaDg1MDAuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1pODYwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tODhrLmggKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXRhaG9lLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXZheC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy13NjUuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtejhrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWg4MzAwLmggKFRDX1JFTE9DX01BTkdMRSk6IEFkZCBzZWdtZW50IGFyZ3VtZW50LgotCSogY29uZmlnL3RjLWg4NTAwLmggKFRDX1JFTE9DX01BTkdMRSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXc2NS5oIChUQ19SRUxPQ19NQU5HTEUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy16OGsuaCAoVENfUkVMT0NfTUFOR0xFKTogTGlrZXdpc2UuCi0KLU1vbiBKdWwgMTcgMTU6MDI6NTQgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk6IERlbGV0ZSBhcyBmaWxlCi0Jc2NvcGUgdmFyaWFibGVzLgotCShEZWZpbmVfUm91dGluZSwgRGVmaW5lX0xvY2FsX1N5bWJvbHMpOiBUYWtlIEN1cnJlbnRfUm91dGluZSBhbmQKLQlUZXh0X1BzZWN0IGFzIGFyZ3VtZW50cy4KLQkoVk1TX0RCR19EZWZpbmVfUm91dGluZSk6IERlbGV0ZS4KLQkoVk1TX1RCVF9CbG9ja19FbmQpOiBDaGFuZ2UgYFNpemUnIGFyZ3VtZW50IGZyb20gaW50IHRvIHZhbHVlVC4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlOiB0ZXh0IGFuZCBkYXRhIGZpeHVwIGxvb3BzKTogRGlmZmVyZW5jZQotCW9mIHR3byBzeW1ib2xzIGhhcyB0eXBlIG9mZnNldFQgcmF0aGVyIHRoYW4gaW50OyBjb252ZXJ0IHdpdGgKLQltZF9udW1iZXJfdG9fY2hhcnMgYmVmb3JlIHBhc3NpbmcgdG8gVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhLgotCSh2bXNfd3JpdGVfb2JqZWN0X2ZpbGU6IGRlYnVnIHN5bWJvbCBsb29wKTogQ2FsbCBEZWZpbmVfUm91dGluZQotCWluc3RlYWQgb2YgVk1TX0RCR19EZWZpbmVfUm91dGluZS4KLQotU2F0IEp1bCAxNSAwMDowMTozNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IEFkZCBAZml4dXAgc28gdGhhdCB0aGUKLQljb21waWxlciBjYW4gbWFyayB3aGljaCByZWxvY3Mgbm90IHRvIGNvbXBsYWluIGFib3V0IHdpdGgKLQktbXJlbG9jYXRhYmxlLgotCShwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFkZCAuZml4dXAgdG8gc2VjdGlvbnMgbm90IHRvIGNvbXBsYWluCi0JYWJvdXQsIGFuZCBhbHNvIGRvbid0IGNvbXBsYWluIGZvciBCRkRfUkVMT0NfQ1RPUiByZWxvY2F0aW9ucyBpbgotCXdyaXRhYmxlIG5vbi1jb2RlIHNlZ21lbnRzLgotCShtZF9hcHBseV9maXgpOiBUcmVhdCBCRkRfUkVMT0NfQ1RPUiBqdXN0IGxpa2UgQkZEX1JFTE9DXzMyLgotCi1GcmkgSnVsIDE0IDE5OjU0OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBTUEFSQyBTdW5PUyBQSUM6Ci0JKiBjb25maWcvdGMtc3BhcmMuaCAoc3BhcmNfcGljX2NvZGUpOiBBbHdheXMgZGVjbGFyZSwgbm90IGp1c3QKLQl3aGVuIE9CSl9FTEYuCi0JKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERlZmluZSB3aGVuIE9CSl9BT1VULgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IE5ldyBkZWZpbml0aW9uIGZvciBPQkpfQU9VVC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19waWNfY29kZSk6IEFsd2F5cyBkZWZpbmUsIG5vdCBqdXN0IHdoZW4KLQlPQkpfRUxGLgotCShtZF9hcHBseV9maXgpOiBBZGp1c3QgcmVsb2MgYWRkZW5kIGZvciBPQkpfQU9VVCBhbmQgUElDLiAgSW4KLQlCRkRfUkVMT0NfMzJfUENSRUxfUzIgY2FzZSwgZG9uJ3QgaW5jcmVtZW50IHZhbCBmb3IgYW4gZXh0ZXJuYWwKLQlzeW1ib2wgd2hlbiBQSUMuCi0JKHRjX2dlbl9yZWxvYyk6IEdlbmVyYXRlIGRpZmZlcmVudCBQSUMgcmVsb2NzIHdoZW4gT0JKX0FPVVQsIGFzCi0Jd2VsbCBhcyB3aGVuIE9CSl9FTEYuCi0JKG1kX3Nob3J0b3B0cyk6IElmIE9CSl9BT1VULCBpbmNsdWRlIGBrJy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSWYgT0JKX0FPVVQsIGhhbmRsZSAnaycuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC1rIGlmIE9CSl9BT1VULCBhbmQgLUtQSUMgaWYgT0JKX0VMRi4KLQkobWRfcGNyZWxfZnJvbSk6IERvbid0IGFkZCBpbiBzaXplIGZvciBhbiBleHRlcm5hbCBzeW1ib2wgd2hlbgotCVBJQy4KLQotVGh1IEp1bCAxMyAyMToxNjo0MyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuaCAoVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0spOiBEZWZpbmUgZm9yIFNPTS4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogU2V0IHN5X3VzZWRfaW5fcmVsb2MgZm9yIGJvdGgKLQlzeW1ib2xzIGluIGEgZml4dXAgd2hlcmUgYSBkZWZpbmVkIHN5bWJvbCBpcyBzdWJ0cmFjdGVkIGZyb20gYW4KLQl1bmRlZmluZWQgc3ltYm9sICh3aGVuIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LIGlzIGRlZmluZWQpLgotCShmaXh1cF9zZWdtZW50KTogRG8gbm90aGluZyBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaWYKLQlVTkRFRklORURfRElGRkVSRU5DRV9PSyBpcyBkZWZpbmVkLgotCi1XZWQgSnVsIDEyIDIzOjMzOjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBTdXBwb3J0IE1EX0FQUExZX0ZJWDMuCi0KLVdlZCBKdWwgMTIgMDE6MTI6MTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeF9uZXcpOiBVc2UgaW50LCBub3Qgc2hvcnQgaW50LCBmb3IgYXJndW1lbnQgdHlwZS4KLQkoZml4X25ld19leHApOiBEaXR0by4KLQotCSogY29uZmlndXJlLmluIChhcm0tKi1yaXNjaXgqKTogRG9uJ3Qgc2V0IGVtdWxhdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKE5PX0VDT0ZGX0RFQlVHR0lORyk6IERlZmluZSBpZiBFQ09GRl9ERUJVR0dJTkcKLQl3YXNuJ3QgcHJldmlvdXNseSBkZWZpbmVkLgotCShzX2V4dGVybik6IERvbid0IHNldCBlY29mZl9leHRlcm5fc2l6ZSBpZiBOT19FQ09GRl9ERUJVR0dJTkcuCi0JKG5vcGljX25lZWRfcmVsYXgpOiBEb24ndCBjaGVjayBpdCBpZiBOT19FQ09GRl9ERUJVR0dJTkcuCi0JKG1hY3JvX2J1aWxkKSBbIVVTRV9TVERBUkddOiBEb24ndCB1c2UgdmFyaWFkaWMgcHJvdG90eXBlLgotCShtaXBzX2xvY2FsX2xhYmVsKSBbTk9fRUNPRkZfREVCVUdHSU5HXTogRG9uJ3QgcHJlc2VydmUgcG90ZW50aWFsCi0JRUNPRkYgZGVidWdnaW5nIHN5bWJvbHMuCi0KLQkqIGVtdWwuaCAoc3RydWN0IGVtdWxhdGlvbik6IFVzZSB1bnNpZ25lZCwgbm90IHVuc2lnbmVkIGNoYXIsIGZvcgotCWJpdGZpZWxkcy4KLQkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcyk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHN5bWJvbF9tYWtlX2VtcHR5KSBbQkZEX0FTU0VNQkxFUl06IFNldAotCXVkYXRhLnAsIG5vdCB1ZGF0YS4KLQotVHVlIEp1bCAxMSAxNDozMDoxOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLW1pcHMudGV4aTogRG9jdW1lbnQgLW00MDEwIGFuZCAtbW5vLTQwMTAuCi0KLVR1ZSBKdWwgMTEgMTQ6Mjg6NTUgMTk5NSAgSmVmZiBTcGllZ2VsICA8amVmZnNAbHNpbC5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfNDAxMCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGludGVybG9ja3MpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9iZWdpbik6IENoZWNrIGZvciBhIGNwdSBvZiAicjQwMTAiLiAgU2V0IG1pcHNfNDAxMCBjb3JyZWN0bHkuCi0JSWYgbWlwc180NjUwIG9yIG1pcHNfNDAxMCwgc2V0IGludGVybG9ja3MuCi0JKGFwcGVuZF9pbnNuKTogQ2hlY2sgaW50ZXJsb2Nrcywgbm90IG1pcHNfNDY1MC4KLQkobWlwc19lbWl0X2RlbGF5cyk6IExpa2V3aXNlLgotCShtaXBzX2lwKTogT25seSBwZXJtaXQgSU5TTl80MDEwIGluc3RydWN0aW9ucyBpZiBtaXBzXzQwMTAuCi0JKG1kX2xvbmdvcHRzKTogQWRkICJtNDAxMCIgYW5kICJuby1tNDAxMCIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCAtbWNwdT1yNDAxMC4gIEhhbmRsZSAtbTQwMTAgYW5kCi0JLW5vLW00MDEwLgotCShtZF9zaG93X3VzYWdlKTogRG9jdW1lbnQgLW00MDEwIGFuZCAtbm8tbTQwMTAuCi0KLVR1ZSBKdWwgMTEgMTM6MjI6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChzdHJ1Y3QgZWZkcik6IEFkZCBuZXcgZmllbGQgZmFrZS4KLQkoaW5pdF9maWxlKTogSW5pdGlhbGl6ZSBmYWtlLgotCShhZGRfZmlsZSk6IEFkZCBuZXcgcGFyYW1ldGVyIGZha2UuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGVjb2ZmX2J1aWxkX2RlYnVnKTogRG9uJ3Qgd2FybiBhYm91dCBhIG1pc3NpbmcgLmVuZCBmb3IgYSBmYWtlCi0JZmlsZS4KLQotTW9uIEp1bCAxMCAxNjowMTozMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IFNwbGl0IG91dCBtb3N0IGNwdSBjaGFwdGVycy4uLgotCSogZG9jL2MtKi50ZXhpOiAuLi50byBoZXJlLgotCi0JKiByZWFkLmMgKHBvX2hhc2gpOiBOb3cgc3RhdGljLgotCi1Nb24gSnVsIDEwIDEzOjQ3OjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBILkouIEx1IDxoamxAbnluZXhzdC5jb20+OgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IFJlbmFtZSBmcm9tIG1kX2FwcGx5X2ZpeDEuCi0JQWNjZXB0IHBvaW50ZXIgdG8gdmFsdWUgYW5kIHNlZ21lbnQuICBGaXggT0JKX0VMRiBQQ1JFTCBjYXNlIHRvCi0JaGFuZGxlIGdsb2JhbCBkZWZpbmVkIHN5bWJvbHMgY29ycmVjdGx5LgotCShtZF9hcHBseV9maXgpOiBSZW1vdmUgYm90aCB2ZXJzaW9ucy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKE1EX0FQUExZX0ZJWDMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogV2hlbiBzd2l0Y2hpbmcgb24gJHtjcHV9LCB1c2UgJHtjcHV9LCBub3QKLQkkW3RhcmdldF9jcHV9LCBpbiBkZWZhdWx0IGNhc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVNhdCBKdWwgIDggMTM6Mjc6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogQ2FsbCByZXNvbHZlX3N5bWJvbF92YWx1ZSBvbgotCXN1Yl9zeW1ib2xQLCBpbiBjYXNlIGl0IGlzbid0IGluIHRoZSBzeW1ib2wgdGFibGUuCi0KLUZyaSBKdWwgIDcgMTE6MTc6MjcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBGb3IgLmxjb21tIDEsIHNldCBhbGlnbiB0byAwLCBub3QgMS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBJZiBTRl9HRVRfRlVOQ1RJT04sIHNldAotCUJTRl9GVU5DVElPTi4KLQkoc3ltYm9sX2dsb2JhbFAsIHN5bWJvbF9nbG9iYWxfbGFzdFApOiBOZXcgZ2xvYmFsIHZhcmlhYmxlcy4KLQkoeWFua19zeW1ib2xzKTogU29ydCBkZWZpbmVkIGdsb2JhbCBzeW1ib2xzIHRvIHRoZSBlbmQsIGp1c3QKLQliZWZvcmUgdGhlIHVuZGVmaW5lZCBzeW1ib2xzLgotCShnbHVlX3N5bWJvbHMpOiBBZGQgdHdvIGFyZ3VtZW50cywgYW5kIHVzZSB0aGVtIGluc3RlYWQgb2YKLQlyZWZlcnJpbmcgZGlyZWN0bHkgdG8gZ2xvYmFsIHZhcmlhYmxlcy4KLQkoY3Jhd2xfc3ltYm9scyk6IENhbGwgZ2x1ZV9zeW1ib2xzIHR3aWNlLCBvbmNlIGZvciBkZWZpbmVkIGdsb2JhbHMKLQlhbmQgb25jZSBmb3IgdW5kZWZpbmVkLiAgQWRkIGNvcnJlc3BvbmRpbmcga25vdyBjYWxscy4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFsd2F5cyBhY2NlcHQgXHYuICBEb24ndCBtYWtlIGl0Ci0JY29uZGl0aW9uYWwgb24gQkFDS1NMQVNIX1YuCi0JKiByZWFkLmMgKG5leHRfY2hhcl9vZl9zdHJpbmcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChCQUNLU0xBU0hfVik6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKEJBQ0tTTEFTSF9WKTogRG9uJ3QgZGVmaW5lLgotCi0JQWRkIFNQQVJDIEVMRiBQSUMgc3VwcG9ydC4KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBQYXNzIGZpeFAgdG8gVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQLAotCW5vdCBmaXhQLT5meF9yX3R5cGUuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfcGljX2NvZGUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLiAKLQkobWRfYXBwbHlfZml4KTogSWYgZ2VuZXJhdGluZyBQSUMsIGFkanVzdCBmeF9hZGRudW1iZXIgZm9yIGFueSBub24KLQlQQyByZWxhdGl2ZSByZWxvYy4KLQkodGNfZ2VuX3JlbG9jKTogSWYgZ2VuZXJhdGluZyBQSUMsIGFkanVzdCB2YXJpb3VzIHJlbG9jIHR5cGVzLgotCVJlbW92ZSBmeF9wY3JlbCBhc3NlcnQsIHNpbmNlIGl0IGlzIG5vIGxvbmdlciB0cnVlLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLUsgUElDLgotCSogY29uZmlnL3RjLXNwYXJjLmggKHNwYXJjX3BpY19jb2RlKTogRGVjbGFyZSBpZiBPQkpfRUxGLgotCShUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUgaWYgT0JKX0VMRi4KLQkodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgUEMgcmVsYXRpdmUgcmVsb2NzIGlmIFBJQy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IFRha2UgYSBmaXhwLCBub3QgYQotCXJlbG9jIHR5cGUuCi0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IEFkZCBkZXBlbmRlbmN5IG9uIGNvbmYuaW4sIHNvIHRoYXQgY29uZgotCWlzIHJlYnVpbHQgd2hlbiBjb25mLmluIGNoYW5nZXMuCi0KLVRodSBKdWwgIDYgMTY6NDk6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIEFsbCBmaWxlczogVXBkYXRlZCBGU0YgYWRkcmVzcy4KLQotVGh1IEp1bCAgNiAxNjozMDozNCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGFkZF9maWxlKTogRG9uJ3QgY29sbGFwc2UgbXVsdGlwbGUgLmZpbGUgY29tbWFuZHMgaW50bwotCWEgc2luZ2xlIGZpbGUgc3RydWN0dXJlLgotCShlY29mZl9idWlsZF9saW5lbm8pOiBTZXQgaWxpbmVCYXNlIHRvIHN1bSBvZiBwcmV2aW91cyBmaWxlJ3MKLQlpbGluZUJhc2UgYW5kIGNsaW5lLgotCi1UaHUgSnVsICA2IDEyOjU0OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVBhdGNoZXMgZnJvbSBKZXJyeSBCbGFrZWx5IDxnZXJyeV9ibGFrbGV5QHdlbGxmbGVldC5jb20+OgotCSogYXMuYyAobGlzdGluZ19maWxlbmFtZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNob3dfdXNhZ2UpOiBNZW50aW9uIC1hPWZpbGUuCi0JKHBhcnNlX2FyZ3MpOiBTdXBwb3J0ID0gb3B0aW9uIG9mIC1hIHRvIHNldCBuYW1lIG9mIGxpc3RpbmcgZmlsZS4KLQkobWFpbik6IFBhc3MgbGlzdGluZ19maWxlbmFtZSB0byBsaXN0aW5nX3ByaW50LgotCSogbGlzdGluZy5jIChsaXN0X2ZpbGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCSh2YXJpb3VzKTogUmVwbGFjZSBwcmludGYgd2l0aCBmcHJpbnRmIHRvIGxpc3RfZmlsZS4KLQkobGlzdGluZ19wcmludCk6IElmIG5hbWUgYXJndW1lbnQgaXMgbm90IE5VTEwsIG9wZW4gaXQgYXMKLQlsaXN0X2ZpbGUuCi0JKiBkb2MvYXMudGV4aW5mbywgZG9jL2FzLjE6IERvY3VtZW50IC1hPWZpbGUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3Jlc2VydmUpOiBEb24ndCBwZXJtaXQgcmVkZWZpbml0aW9uLCBldmVuCi0JaWYgdGhlIHN5bWJvbCB3YXMgYWxyZWFkeSBpbiBic3Nfc2VjdGlvbi4gIEZpeCB3YXJuaW5nIG1lc3NhZ2UuCi0KLQkqIGxpc3RpbmcuYyAoc3RydWN0IGZpbGVfaW5mb19zdHJ1Y3QpOiBSZW5hbWUgZW5kX3BlbmRpbmcgZmllbGQgdG8KLQlhdF9lbmQuCi0JKGZpbGVfaW5mbyk6IEluaXRpYWxpemUgYXRfZW5kLCBub3QgZW5kX3BlbmRpbmcuCi0JKGJ1ZmZlcl9saW5lKTogSWYgYXRfZW5kIHNldCwganVzdCByZXR1cm4gaW1tZWRpYXRlbHkuICBEb24ndAotCXdvcnJ5IGFib3V0IGVuZF9wZW5kaW5nIGNhc2VzLiAgU2V0IGF0X2VuZCB3aGVuIEVPRiBpcyByZWFkLgotCShwcmludF9zb3VyY2UpOiBDaGVjayBhdF9lbmQsIG5vdCBlbmRfcGVuZGluZy4KLQkobGlzdGluZ19saXN0aW5nKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChhbHBoYV9kb19hbGlnbik6IERvbid0IGRlY2xhcmUuCi0JKG1kX2RvX2FsaWduKTogRG9uJ3QgZGVmaW5lLgotCSh0Y19mcm9iX2xhYmVsKTogRGVmaW5lLgotCShhbHBoYV9kZWZpbmVfbGFiZWwpOiBEZWNsYXJlLgotCShtZF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlZmluZS4KLQkoYWxwaGFfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWFscGhhLmMgKGluc25fbGFiZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShhdXRvX2FsaWduKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIGNhc2VzIGZvciAudGV4dCwgLmRhdGEsIC5hbGlnbiwgLmJ5dGUsCi0JLmh3b3JkLCAuaW50LCAubG9uZywgLm9jdGEsIC5xdWFkLCAuc2hvcnQsIC53b3JkLCAuZG91YmxlLCAuZmxvYXQsCi0JYW5kIC5zaW5nbGUuICBDaGFuZ2UgLnRfZmxvYXRpbmcsIC5zX2Zsb2F0aW5nLCAuZl9mbG9hdGluZywKLQkuZ19mbG9hdGluZywgYW5kIC5kX2Zsb2F0aW5nIHRvIHVzZSBzX2FscGhhX2Zsb2F0X2NvbnMgcmF0aGVyIHRoYW4KLQlmbG9hdF9jb25zLgotCShzX2FscGhhX3RleHQsIHNfYWxwaGFfZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzX3JkYXRhLCBzX3NkYXRhKTogQ2xlYXIgaW5zbl9sYWJlbCBhbmQgc2V0IGF1dG9fYWxpZ24uCi0JKHNfZ3ByZWwzMik6IElmIGF1dG9fYWxpZ24sIGFsaWduLiAgQ2xlYXIgaW5zbl9sYWJlbC4KLQkoZW1pdF9pbnNuKTogQ2xlYXIgaW5zbl9sYWJlbC4KLQkoc19hbHBoYV9hbGlnbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2FsaWduKTogTWFrZSBzdGF0aWMuICBUYWtlIGxhYmVsIGFyZ3VtZW50LgotCShhbHBoYV9mbHVzaF9wZW5kaW5nX291dHB1dCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNfYWxwaGFfY29ucywgc19hbHBoYV9mbG9hdF9jb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGFscGhhX2RlZmluZV9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIEp1bCAgNSAyMjo0OTozMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZi5pbjogUmVnZW5lcmF0ZSB3aXRoIGF1dG9yZWNvbmYuCi0KLQlNb24gSnVsICAzIDE5OjQ3OjUzIDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oICh2bXNfcmVzb2x2ZV9zeW1ib2xfcmVkZWYpOiBVc2UgZnVsbCBwcm90b3R5cGUuCi0JKHZtc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCwgdGNfZnJvYl9sYWJlbCk6IE1vdmUgdGhlbSB0byBncm91cAotCXdpdGggb3RoZXIgcHJvdG90eXBlcy4KLQlbV0FOVF9WTVNfT0JKX0RFRlNdOiBPbmx5IGRlZmluZSB0aGUgbWFueSBPQkpfeCwgREJHX3gsIGFuZCBEU1RfeAotCW1hY3JvcyB3aGVuIHRoaXMgaXMgZGVmaW5lZC4KLQkqIGNvbmZpZy9vYmotdm1zLmM6IEZ1bGx5IHByb3RvdHlwZSBhbGwgbG9jYWwgZnVuY3Rpb25zLgotCVtzeW1ib2xTLCBmcmFnU106IFVzZSBjb25zaXN0ZW50bHkgaW5zdGVhZCBvZiB0aGVpciBzdHJ1Y3QgdGFncy4KLQlbV0FOVF9WTVNfT0JKX0RFRlNdOiBEZWZpbmUgdGhpcy4KLQkoc19jb25zdCk6IE1ha2UgZGVmaW5pdGlvbiBjb3JyZWN0bHkgbWF0Y2ggYWN0dWFsIHVzYWdlLgotCShWTVNfc3RhYl9wYXJzZSk6IE1ha2UgYGV4cGVjdGVkX3R5cGUnIGFyZyBiZSBpbnQgcmF0aGVyIHRoYW4gY2hhci4KLQkoZ2V0X1ZNU190aW1lX29uX3VuaXgpOiBEZWZpbmUgYXMgYHN0YXRpYyB2b2lkJy4KLQkoaGFzaF9zdHJpbmcpOiBNYWtlIGRlZmluaXRpb24gbWF0Y2ggYWN0dWFsIHVzYWdlOyBhcmd1bWVudCBpcwotCWBjaGFyIGNvbnN0IConIHJhdGhlciB0aGFuIGB1bnNpZ25lZCBjaGFyIConLgotCShWTVNfQ2FzZV9IYWNrX1N5bWJvbCwgVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzLCBWTVNfUHNlY3RfU3BlYywKLQlWTVNfR2xvYmFsX1N5bWJvbF9TcGVjKTogRGVjbGFyZSBzdHJpbmcgYXJncyBhcyBgY29uc3QgY2hhciAqJy4KLQlbSVNfR1hYX1ZUQUJMRV06IE5ldyBtYWNyby4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlOiBHU0QgbG9vcCk6IFVzZSBpdC4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlOiBkYXRhIHNlZ21lbnQpOiBSZW9yZ2FuaXplIGBmaWxsJyBsb29wLgotCi1XZWQgSnVsICA1IDEyOjAxOjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3Nob3J0b3B0cyk6IEFkZCAiSzoiIGlmIE9CSl9FTEYuCi0JKG1kX3BhcnNlX29wdGlvbik6IElmIE9CSl9FTEYsIGNoZWNrIGZvciAtSy4gIERpZSBpZiAtSyBQSUMsIHNpbmNlCi0JUElDIGNvZGUgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCi0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBDaGFuZ2Ugc3RkX3Nob3J0b3B0cyB0byBiZSBhbiBhcnJheSByYXRoZXIKLQl0aGFuIGEgY29uc3RhbnQgc3RyaW5nLiAgT25seSBpbmNsdWRlICdLJyBpZiBXT1JLSU5HX0RPVF9XT1JEIGlzCi0Jbm90IGRlZmluZWQuICBPbmx5IGNoZWNrIGZvciAnSycgaW4gdGhhdCBjYXNlIGFzIHdlbGwuCi0JKiBhcy5oIChmbGFnX3dhcm5fZGlzcGxhY2VtZW50KTogT25seSBkZWNsYXJlIGlmIFdPUktJTkdfRE9UX1dPUkQKLQlpcyBub3QgZGVmaW5lZC4KLQotCSogY29uZi5pbjogQWRkIHVuZGVmIG9mIEhBVkVfU0JSSy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2xpbmUpOiBDYWxsIGxpc3Rpbmdfc291cmNlX2xpbmUsIGluCi0JYm90aCBCRkRfQVNTRU1CTEVSIGFuZCBub24gQkZEX0FTU0VNQkxFUiB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24uCi0KLQkqIHN5bWJvbHMuYyAoU19TRVRfRVhURVJOQUwpOiBXYXJuIGlmIHN5bWJvbCBpcyB3ZWFrLgotCShTX0NMRUFSX0VYVEVSTkFMKTogTGlrZXdpc2UuCi0JKFNfU0VUX1dFQUspOiBXYXJuIGlmIHN5bWJvbCBpcyBnbG9iYWwuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFdhcm4gYWJvdXQgYW4gYXR0ZW1wdAotCXRvIHB1dCBhbiB1bmRlZmluZWQgc3ltYm9sIGludG8gYSBzZXQuCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgQGNvbmZpZ3VyZV9pbnB1dEA7IGl0J3Mgbm90IG5lZWRlZCBpbgotCWZpbGVzIG5hbWVkIE1ha2VmaWxlLgotCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgIi5zZXQiIHNvIHRoYXQgdGhlCi0JZXhwbGljaXQgcHNldWRvLW9wIHdvcmtzLCB3aGlsZSBjb250aW51aW5nIHRvIHRyZWF0ICJzZXQiIGFzIGFuCi0JaW5zdHJ1Y3Rpb24uCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RlYnVnZ2luZ19zZWVuKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoZWNvZmZfZGlyZWN0aXZlX2RlZik6IFNldCBlY29mZl9kZWJ1Z2dpbmdfc2Vlbi4KLQkoZWNvZmZfc3RhYik6IExpa2V3aXNlLgotCSogZWNvZmYuaDogTWFrZSBpZGVtcG90ZW50LgotCShlY29mZl9kZWJ1Z2dpbmdfc2Vlbik6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJbmNsdWRlIGVjb2ZmLmguCi0JKG1pcHNfZGVidWcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX3N0cmluZ2VyLCBzX21pcHNfc3BhY2UpOiBSZW1vdmUgdW5uZWVkZWQgZGVjbGFyYXRpb25zLgotCShtZF9wYXJzZV9vcHRpb24pOiBJbiBjYXNlICdnJywgc2V0IG1pcHNfZGVidWcgdG8gZGVidWdnaW5nIGxldmVsLgotCShtaXBzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCSogdGMtbWlwcy5oIChMT0NBTF9MQUJFTCk6IENhbGwgbWlwc19sb2NhbF9sYWJlbC4KLQkobWlwc19sb2NhbF9sYWJlbCk6IERlY2xhcmUuCi0KLVdlZCBKdWwgIDUgMDA6NTk6MjIgMTk5NSAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGFzLmMgKG1haW4pOiAgT25seSB1c2Ugc2JyayB3aGVuIEhBVkVfU0JSSyBkZWZpbmVkLgotCSogY29uZmlndXJlLmluOiAgQWRkIHRlc3QgZm9yIHNicmsuCi0JKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlIHVzaW5nIGF1dG9jb25mIDIuNC4KLQotTW9uIEp1bCAgMyAxNTo1ODoxNiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuaCAoTUFYX1JFTE9DX0VYUEFOU0lPTik6IEJ1bXAgdG8gNi4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBIYW5kbGUKLQlyZWxvY2F0aW9ucyBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIChwb3NzaWJseSBleHRlcm5hbCkKLQlzeW1ib2xzLgotCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogRm9yIFNPTSwgcmVqZWN0IHJlZHVjdGlvbnMgaW52b2x2aW5nCi0JdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIHJlbG9jYXRpb25zIGZvciBleHByZXNzaW9ucwotCWludm9sdmluZyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scy4KLQotTW9uIEp1bCAgMyAxNDoyMjo1OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmVbLmluXSAoaTM4Ni0qLXdpbjMyKTogTmV3IGhvc3QgYW5kIHRhcmdldC4KLQotVGh1IEp1biAyOSAxNzoyNTo0MyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JU3VwcG9ydCBmb3IgbG9uZyBmaWxlbmFtZXMgbm9uLWJmZCBjb2ZmLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpbGVuYW1lX2xpc3RfaGVhZCwgZmlsZW5hbWVfbGlzdF90YWlsKTogTmV3LgotCSh5YW5rX3N5bWJvbHMpOiBOb3RpY2UgYW5kIHJlY29yZCBmaWxlbmFtZXMgd2hpY2ggYXJlIHRvbyBsb25nLgotCSh3X3N0cmluZ3MpOiBXcml0ZSBvdXQgZmlsZW5hbWUgc3RyaW5ncy4KLQkoY19kb3RfZmlsZV9zeW1ib2xzKTogUHV0IGxvbmcgZmlsZW5hbWVzIG9udG8gbGlzdC4KLQotV2VkIEp1biAyOCAxNzozMzoxMyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IFBFIGRvZXNuJ3QgdXNlCi0JdGhlIHN0cmFuZ2UgY29tbW9uIHN5bWJvbCBmb3JtYXQgdGhhdCBvdGhlciAzODZzIGZvcm1hdHMKLQlkby4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2JlZ2luKTogSWYgTEVYX0FUIGRlZmluZWQgdGhlbgotCSdAJyBpcyBpbiB0aGUgc2V0IG9mIGlkZW50aWZpZXJzLgotCShpMzg2X29wZXJhbmQpOiBJZiBMRVhfQVQsIHRoZW4gZG9uJ3QgbG9vayBmb3IgQGdvdG8gc3R1ZmYuCi0JKiBjb25maWcvdGUtcGUuaDogRGVmaW5lIExFWF9BVC4KLQotV2VkIEp1biAyOCAxNzo0OTo1OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKEg4LzUwMCBGbG9hdGluZyBQb2ludCk6IEluZGljYXRlIHRoYXQgSUVFRSBGUAotCW51bWJlcnMgYXJlIGZvciB0aGUgc3RhbmRhcmQgZW11bGF0aW9uIGNvZGUuCi0JKFNIIEZsb2F0aW5nIFBvaW50KTogRGl0dG8uCi0JKE92ZXJ2aWV3KTogRGVzY3JpYmUgbmV3IC0tZW11bGF0aW9uIG9wdGlvbiBmb3IgTUlQUy4KLQkqIGRvYy8qLm00OiBEZWxldGVkLgotCi1UaHUgSnVuIDIyIDE5OjI2OjI1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTdW4gTWF5ICA3IDExOjUzOjQxIE1EVCAxOTk1ICBCcnlhbiBGb3JkICA8YmFmb3JkQGNzLnV0YWguZWR1PgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGkzODYtKi1tb3NzKiB0YXJnZXQuCi0KLVRodSBKdW4gMjIgMTQ6NDE6MjMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENhc3QgZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUKLQlhcmd1bWVudCB0byBjaGFyICogdG8gYXZvaWQgd2FybmluZy4KLQotV2VkIEp1biAyMSAxODowNzo1OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyBmcm9tIEFuZHJlYXMgU2Nod2FiIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+OgotCSogY29uZmlnL3RjLW02OGsuYyAoaW5zd29yZCk6IEluY3JlbWVudCB0aGUgZnJhZyBvZmZzZXRzLgotCShzdHJ1Y3QgbTY4a19pdCk6IEFkZCByZWxvY1tdLnBjcmVsX2ZpeCBmaWVsZCB0byBob2xkIHBjLXJlbAotCWZpeHVwLgotCShhZGRfZml4KTogQWNjZXB0IGFkZGl0aW9uYWwgcGFyYW1ldGVyLCB0aGUgcGMtcmVsIGZpeHVwLiBBbGwKLQljYWxsZXJzIGNoYW5nZWQuICBGaXggb2Zmc2V0IGFkZHJlc3MgaWYgd2lkdGggPT0gJ2InLgotCShtNjhrX2lwKSBbY2FzZSBBSU5EWF06IEFsbG93IGV4cGxpY2l0IHNpemUgc3BlYy4gIERvbid0IG1ha2UgdGhlCi0Jb3V0ZXIgZGlzcGxhY2VtZW50IHBjLXJlbGF0aXZlLgotCShtZF9wY3JlbF9mcm9tKTogTWFrZSBpdCByZWxhdGl2ZSB0byB0aGUgZmlyc3QgZXh0ZW5zaW9uIHdvcmQgb2YKLQl0aGUgb3BlcmFuZC4KLQkob3Bjb2RlX3B0cik6IE1ha2UgaXQgYSBtYWNybyBpZiBET19CUkVBS19VUF9CSUdfREVDTCBpcwotCXVuZGVmaW5lZC4KLQkobWRfY29udmVydF9mcmFnXzEpOiBEb24ndCByZWZlcmVuY2UgZnJhZ1AtPmZyX29wY29kZVsyLi5dLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCkgW2Nhc2UgVEFCIChGQlJBTkNILCBTWl9VTkRFRildOgotCVR1cm4gb24gbG9uZyBiaXQuCi0JKG02OGtfaXApIFtjYXNlICdDJ106IERvbid0IHNldCBzZXQgbG9uZyBiaXQsIHNldCBpdCBpbiB0aGUgb3Bjb2RlCi0gCXRhYmxlLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCkgW2Nhc2UgVEFCIChQQ0lOREVYLCBTWl9VTkRFRildOgotCVZhcmlhYmxlIHBhcnQgaW5jcmVhc2VzIGJ5IGZvdXIsIG5vdCBzaXguCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KSBbVENfTTY4S106IERvbid0IGRvIGZ1cnRoZXIgcGNyZWwKLQlwcm9jZXNzaW5nIGFmdGVyIGNvbnZlcnRpbmcgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiB0aGUKLQlzYW1lIHNlZ21lbnQuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBjb25kaXRpb25hbGl6ZSB0aGUgcGNyZWwgZml4IG9uCi0JVENfTTY4Sy4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwLCBjYXNlICdBJyk6IElmIEFTSSBpcyBub3QgYSAiIyIKLQl2YWx1ZSwgZG9uJ3Qgc2hpZnQgaXQgYW4gZXh0cmEgdGltZS4KLQotV2VkIEp1biAyMSAxNDoxODozNyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBnYXNwLmMgKGRvX3ByaW50LCBkb19mb3JtLCBidWZmZXJfYW5kX25lc3QpOiBVc2UgY2FzZSBpbnNlbnNpdGl2ZQotCXN0cmluZyBjb21wYXJlcy4KLQotVHVlIEp1biAyMCAxNDo1NTowMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYXN0IHRpbWUoKSBhcmd1bWVudCB0bwotCXRpbWVfdCAqLgotCi1UdWUgSnVuIDIwIDEyOjAwOjUzIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBGaXggdHlwbyBpbiBsYXN0Ci0JY2hhbmdlLgotCi1Nb24gSnVuIDE5IDE1OjI3OjE3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBaZXJvIG91dCBtZW1vcnkKLQlmcm9tIGZyYWdfbW9yZSBjYWxscy4KLQotVGh1IEp1biAxNSAxNjo1MzozNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBEb24ndCB1c2UgImJmZC8iIHdoZW4gaW5jbHVkaW5nIGxpYmJmZC5oCi0JYW5kIGxpYmNvZmYuaC4KLQkoZmlsbF9zZWN0aW9uKTogQ2FsbCBQUk9HUkVTUy4KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6IEFkZCBiZmQgc3JjZGlyLgotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgYmZkX2dhcyBmbGFnIGFuZCBzZXQgZm9yIGVhY2ggY29uZmlnLgotCShpMzg2LXVua25vd24tZ28zMiwgbTY4ay11bmtub3duLWNvZmYpOiBSZWNvZ25pemUuCi0JKiBtcHctbWFrZS5pbiAoSEFDS19PX1JBTUEsIE9CSl9DT0ZGX09NSVRfVElNRVNUQU1QKTogQWRkIHRvCi0JY29uZmlnLmguCi0KLVRodSBKdW4gMTUgMTA6MDQ6MjYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5oIChMT0NBTF9MQUJFTCk6IFByZXBlbmQgJy4nIGlmIG5vdCBPQkpfQU9VVC4KLQkoRkFLRV9MQUJFTF9OQU1FKTogTGlrZXdpc2UuCi0KLU1vbiBKdW4gMTIgMjI6MjU6MzkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogQ2hlY2sgZm9yIGludmFsaWQgcmVnaXN0ZXIgaW4gc2luZ2xlCi0JcHJlY2lzaW9uIGZtcHlhZGQgYW5kIGZtcHlzdWIgaW5zdHJ1Y3Rpb25zLgotCi1UaHUgSnVuICA4IDE5OjMzOjAyIDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5jIChteW5hbWUpOiBEZWxldGUgYWxsIHJlZmVyZW5jZXMuCi0JKFZNU19zdGFiX3BhcnNlLCBXcml0ZV9WTVNfTUhEX1JlY29yZHMsIFZNU19DYXNlX0hhY2tfU3ltYm9sKToKLQlSZXBsYWNlIHByaW50ZiBjYWxscyB3aXRoIGFzX3Rza3Rzay4KLQkoUFVUX0xPTkcsIFBVVF9TSE9SVCk6IFVzZSBDT1BZX0xPTkcsIENPUFlfU0hPUlQuCi0JKFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSk6IE1vdmUgc2Vjb25kIGJ1ZmZlciBjYXBhY2l0eSBjaGVjawotCWJlbG93IGJvdHRvbSBvZiBsb29wOyBmaXJzdCBjaGVjayBhdCB0b3Agc3VmZmljZXMgZm9yIGxvb3AgaXRzZWxmLgotCShmaW5kX2ZpbGUpOiBSZW1vdmUgcmVkdW5kYW50IHBvaW50ZXIgY2hlY2tzIGluIGZpcnN0IHR3byBsb29wczsKLQlyZXBsYWNlIHRoaXJkIGxvb3Agd2l0aCBwb2ludGVyIHRvIGxhc3QgbGlzdCBlbGVtZW50IGRldGVybWluZWQKLQlpbiBmaXJzdCBsb29wLgotCi1UdWUgSnVuICA2IDEzOjUzOjA2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEhhbmRsZSBkZWZpbmVkIGFic29sdXRlIHN5bWJvbHMgYXMKLQlBU0kgdmFsdWVzLgotCi0JKiBjb25maWcvb2JqLXZtcy5jICh2bXNfd3JpdGVfb2JqZWN0X2ZpbGUsIGNhc2UgTl9EQVRBKTogVXNlCi0Jc3RyY21wIGFnYWluc3QgRkFLRV9MQUJFTF9OQU1FIGluc3RlYWQgb2YgY2hlY2tpbmcgdGhpcmQKLQljaGFyYWN0ZXIuICAoU3VnZ2VzdGVkIGJ5IFBhdCBSYW5raW4uKQotCi1Nb24gSnVuICA1IDIwOjEwOjQ2IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JQWRkIHN1cHBvcnQgZm9yIE5fQUJTIGFuZCBOX0FCU3xOX0VYVCB0eXBlIHN5bWJvbHMuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKExTWV9TX01fe0RFRixSRUx9LCBFTlZfU19NX3tERUYsTkVTVEVEfSk6Ci0JTmV3IG1hY3JvcyBmb3IgbG9jYWwgc3ltYm9scyAoZnJvbSA8bHN5ZGVmLmg+IGFuZCA8ZW52ZGVmLmg+KS4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKEN1cnJlbnRfRW52aXJvbm1lbnQpOiBOZXcgZmlsZS1zY29wZSB2YXJpYWJsZS4KLQkoVk1TX0xvY2FsX0Vudmlyb25tZW50X1NldHVwKTogTmV3IHJvdXRpbmUuCi0JKEdCTFNZTV9MQ0wpOiBOZXcgbWFjcm8uCi0JKFZNU19HbG9iYWxfU3ltYm9sX1NwZWMpOiBIYW5kbGUgbG9jYWwgc3ltYm9scyB0b28uCi0JKFZNU19Qc2VjdF9TcGVjKTogU2V0IEdMT0JBTFZBTFVFX0JJVCBmb3IgYWJzb2x1dGUgc3ltYm9scy4KLQkoVk1TX0VtaXRfR2xvYmFsdmFsdWVzKTogSGFuZGxlIGxvY2FsIGFuZCBnbG9iYWwgYWJzb2x1dGUgc3ltYm9scy4KLQkoVk1TX1N0b3JlX1BJQ19TeW1ib2xfUmVmZXJlbmNlKTogRGl0dG8uCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZTogR1NEIHN5bWJvbCBsb29wKTogRGl0dG8uCi0KLU1vbiBKdW4gIDUgMTY6MTA6NDAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUuCi0KLU1vbiBKdW4gIDUgMDI6MTc6NTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1nbnUqKTogQWx3YXlzIHVzZSBHTlUgRUxGIGNvbmZpZy4KLQotV2VkIE1heSAzMSAxNzo0OToxOCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFVwZGF0ZSAqc3ltYm9sUFAKLQlpbiBgZWxzZScgY2xhdXNlIHdoZW4gcmVtb3ZpbmcgYSBzeW1ib2wuICBBbHNvLCByZXZpc2UgY29tbWVudHMKLQl0byBtYXRjaCB0aGUgY29kZS4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlIChHU0Qgc3ltYm9sIGxvb3AsIGNhc2UgTl9EQVRBKSk6IE5ldmVyCi0Jb3V0cHV0IHN5bWJvbCBkZWZpbml0aW9ucyBmb3IgbG9jYWwgbnVtZXJpYyBsYWJlbHMuCi0KLVR1ZSBNYXkgMzAgMTg6Mjk6MTAgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBjb25maWd1cmUuaW4gKGFyY2hpdGVjdHVyZSB2YXJpYW50cywgY2FzZXMgYXJtZWIgYW5kIGFybSopOiBSZW1vdmUKLQlzcGFjZXMgcm91bmQgYXNzaWdubWVudCB0byBlbmRpYW4uCi0KLVR1ZSBNYXkgMzAgMTI6MzE6MzEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDaGVjayBmb3IgdW5kZWZpbmVkIGxvY2FsIGRvbGxhcgotCWFuZCBmYiBsYWJlbHMuCi0KLQkqIHN5bWJvbHMuYyAoZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUpOiBFeHRyYWN0IGluc3RhbmNlIG51bWJlcgotCWZyb20gdGhlIGNvcnJlY3QgbG9jYXRpb24uCi0KLVNhdCBNYXkgMjcgMjE6Mjg6NDkgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGUtZHB4Mi5oOiBJbmNsdWRlIG9iai1mb3JtYXQuaC4KLQkoQ09GRl9NQUdJQyk6IFJlbmFtZWQgZnJvbSBGSUxFX0hFQURFUl9NQUdJQy4KLQotV2VkIE1heSAyNCAxMzo0NTozMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbiwgY29uZmlnL29iai1jb2ZmLmMsIGNvbmZpZy9vYmotY29mZi5oOgotCUFkZCBzdXBwb3J0IGZvciBBUk0gcGUKLQotVHVlIE1heSAyMyAxNzowMDozMiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE2Ci0JYW5kIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5LgotCi1UdWUgTWF5IDIzIDE5OjE4OjMzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpIFshIFVTRV9FTVVMQVRJT05TXTogQWx3YXlzIHByaW50IGFuIGVycm9yCi0JbWVzc2FnZS4KLQotCSogZG9jL2ludGVybmFscy50ZXhpOiBEb2N1bWVudCBvYmpfYXBwX2ZpbGUgYW5kCi0JVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4uCi0KLU1vbiBNYXkgMjIgMjA6MDM6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IEFkZCBleHRyYSBsZWFkaW5nIGFyZ3VtZW50LCBmb3IgNCBNYXkKLQljaGFuZ2UuCi0JKiBlY29mZi5oIChlY29mZl9zdGFiKTogRml4IGRlY2xhcmF0aW9uLgotCSogb2JqLmggKGZvcm1hdF9vcHMucHJvY2Vzc19zdGFiKTogSW5jbHVkZSBwcm90b3R5cGUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChPQkpfUFJPQ0VTU19TVEFCKTogUGFzcyB0aHJvdWdoIHNlZyBhcmd1bWVudC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoT0JKX1BST0NFU1NfU1RBQik6IERpdHRvLgotCi0JKiBjb25maWcvZS1taXBzZWxmLmMgKG1pcHNlbGYpOiBOZXcgZW11bGF0aW9uIG1vZGUsIGRvZXNuJ3QgY2hhbmdlCi0JZW5kaWFubmVzcyBmcm9tIGNvbmZpZ3VyZWQgZGVmYXVsdC4KLQkqIGNvbmZpZy9lLW1pcHNlY29mZi5jIChtaXBzZWNvZmYpOiBEaXR0by4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyBlY29mZi9lbGYgdGFyZ2V0cyk6IEluY2x1ZGUgdGhlbS4KLQkqIGFzLmMgKG1pcHNlbGYsIG1pcHNlY29mZik6IERlY2xhcmUuCi0KLQkqIGFzLmMgKGVtdWxhdGlvbl9uYW1lKTogTmV3IHZhcmlhYmxlLgotCShzZWxlY3RfZW11bGF0aW9uX21vZGUpOiBTZXQgZW11bGF0aW9uX25hbWUuICBEb24ndCBjaGFuZ2UgYXJndi4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSAtLWVtdWxhdGlvbjsgY29tcGxhaW4gaWYgdGhlIHN1cHBsaWVkIG5hbWUKLQlpc24ndCB3aGF0IHNlbGVjdF9lbXVsYXRpb25fbmFtZSBjYW1lIHVwIHdpdGguCi0KLVN1biBNYXkgMjEgMjE6MzY6MTcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFJldmVyc2UgY2hhbmdlcyBmcm9tIERlYy4gMTl0aCB3aGljaAotCWNoYW5nZWQgdGhlIHdheSB1bndpbmRzIHdlcmUgYnVpbHQgZm9yIEVMRi4gIFJlbHkgb24gcmVsb2NhdGlvbgotCXN5bWJvbCByZWR1Y3Rpb25zIHRvIGF2b2lkIHBsYWNpbmcgdGhlIGVuZCBvZiBmdW5jdGlvbiBtYXJrZXIKLQlzeW1ib2xzIGludG8gdGhlIG9iamVjdCBmaWxlJ3Mgc3ltYm9sIHRhYmxlLgotCi1TYXQgTWF5IDIwIDEyOjMxOjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCUFkZGVkIGltcHJvdmVkIFZNUyBzdXBwb3J0IGZyb20gUGF0IFJhbmtpbjoKLQotCUZyaSAxOSBNYXkgMTY6NTE6NDAgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKEFPVVRfU1RBQlMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKGZwdXNoLCBycHVzaCk6IE5ldyByb3V0aW5lcy4KLQkocHVzaCk6IFJlcGxhY2VkIGJ5IHRoZSBhYm92ZS4KLQkoZmluZF9zeW1ib2wpOiBTbGlnaHQgcmVvcmdhbml6YXRpb24gdG8gZXhwb3NlIHRhaWwgcmVjdXJzaW9uLgotCi0JRnJpIE1hciAxNyAxODo0MDozNiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKFZNU19PVEhFUl9PQkpTKTogIGRlbGV0ZSB0aGlzLgotCSogdm1zY29uZi5zaCAobWFrZS1nYXMuY29tKTogIGJ1aWxkIC4uL2xpYmliZXJ0eS9saWJlcnR5Lm9sYgotCWZpcnN0IGlmIG5lY2Vzc2FyeTsgbGluayBnYXMgYWdhaW5zdCBpdC4KLQotRnJpIE1heSAxOSAxNjozNzozOSAxOTk1ICBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGdhc3AuYyAoaXN0cnVlKTogQ29ycmVjdGx5IHRlc3QgZm9yIHN0cmluZyBpbmVxdWFsaXR5LgotCi1UaHUgTWF5IDE4IDA0OjI1OjExIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoQ1BfVF97UHJlLFVELFdCfSk6IERlZmluZSwgYml0cyBpbiBjby1wcm9jZXNzb3IKLQlpbnN0cnVjdGlvbnMuCi0JKFtsc11mbV9mbGFncyk6IENvcnJlY3QgZXJyb3IgaW4gYml0bWFza3MuCi0JKGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSk6IERlbGV0ZSBzZWNvbmQgcGFyYW1ldGVyLCBGTEFHUy4gIEFsbAotCWNhbGxlcnMgY2hhbmdlZC4gIFJlbW92ZSBhbGwgZGVhZCBjb2RlIHJlZmVycmluZyB0byBGTEFHUy4gIElmCi0JYWRkcmVzcyBpcyBqdXN0ICJbUmVnXSIgdGhlbiBjb252ZXJ0IGludG8gYSBQUkUtSU5DUkVNRU5UIFVQIGZvcm1hdC4KLQkoZG9fZnBfbGRtc3RtKTogSGFuZGxlIGZ1bGwtZGVzY2VuZGluZyBhbmQgZW1wdHktYXNjZW5kaW5nIHN0YWNrCi0JZm9ybWF0cyBleHBsaWNpdGx5LgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGludGVybmFsRXJyb3IpOiBEZWZpbmUuCi0JKEFSTV97MSwyLDI1MCwzLDYsNyw3RE0sQU5ZLDJVUCxBTEwsM1VQLDZVUCxMT05HTVVMfSk6IERlZmluZSBwcm9jZXNzb3IKLQl2YXJpYW50cy4KLQkoRlBVX3tDT1JFLEZQQTEwLEZQQTExLE5PTkUsQUxMLE1FTU1VTFRJfSk6IERlZmluZSBmbG9hdGluZyBwb2ludAotCXZhcmlhbnRzLgotCSh7Q1BVLEZQVX1fREVGQVVMVCk6IERlZmluZS4KLQkoY3B1X3ZhcmlhbnQpOiBOZXcgdmFyaWFibGUuCi0JKGFzbV9mbGcpOiBDaGFuZ2UgbW9yZV9mbGFncyB0byBmbGFnX2JpdHMuCi0JQWRkIHByb3RvdHlwZXMgZm9yIG5ldyBmdW5jdGlvbnMuCi0JKEZMQUdfe1MsUCxCLFQsRUQsRkQsRkEsRUEsSUIsSUEsREIsREEsTH0pOiBEZWxldGUuCi0JKHNfZmxhZ1tdLCBsZHN0X2ZsYWdzW10sIGJ5dGVfZmxhZ1tdLCBjbXBfZmxhZ3NbXSwgbGRtX2ZsYWdzW10sCi0JIHN0bV9mbGFnc1tdLCBsZm1fZmxhZ3NbXSwgc2ZtX2ZsYWdzW10sIHJvdW5kX2ZsYWdzW10sIGV4Y2VwdF9mbGFnc1tdLAotCSBjcGxvbmdfZmxhZ1tdKTogTmV3IHZhcmlhYmxlcy4KLQkoYXNtX29wY29kZSwgaW5zbnNbXSk6IE5ldyBmb3JtYXQsIGFkZCB2ZXJzaW9uIHN1cHBvcnQuCi0JKGFybV9mbGdfaHNoKTogRGVsZXRlLgotCShkb19tdWwsIGRvX21sYSk6IFJlbW92ZSAiV2FybmluZyIgZnJvbSB3YXJuaW5nIG1lc3NhZ2VzLgotCShkb19hcml0KTogU2ltcGxpZnkuCi0JKGRvX3N3YXApOiBNYWtlIGVycm9yIG1lc3NhZ2UgbW9yZSBhcHByb3ByaWF0ZS4KLQkobWRfYmVnaW4pOiBCdWlsZCBoYXNoIHRhYmxlcyBzdGFydGluZyBhdCBmaXJzdCBlbnRyeSBpbiB0YWJsZXMuCi0JKG1kX251bWJlcl90b19jaGFycyk6IENvcGUgd2l0aCBiaWcvbGl0dGxlLWVuZGlhbiBzZWxlY3Rpb24uCi0JKG1kX2NoYXJzX3RvX251bWJlcik6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXBwbHlfZml4KTogUmV3cml0ZSB0byBtYWtlIGVuZGlhbiBpbmRlcGVuZGVudC4KLQkodGNfZ2VuX3JlbG9jKTogQmV0dGVyIGVycm9yIG1lc3NhZ2VzLgotCShtZF9hc3NlbWJsZSk6IFJlamVjdCBvcGNvZGVzIGZvcmJpZGRlbiBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNwdQotCXZhcmlhbnQuICBSZXdyaXRlIGhhbmRsaW5nIGNvZGUgZm9yIGluc3RydWN0aW9uIGZsYWdzLgotCShtZF9zaG9ydG9wdHMpOiBBZGQgb3B0aW9uICJtOiIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEdldCB0aGUgZGVzaXJlZCBjcHUvZnB1IHZhcmlhbnQuCi0KLQlGcm9tOiBEYXZpZCBUYXlsb3IgKGR0YXlsb3JAYXJtbHRkLmNvLnVrKQotCSogY29uZmlndXJlLmluIChhcmNoaXRlY3R1cmUgdmFyaWFudHMpOiBDaGVjayBmb3IgImFybWViIiBhbmQgImFybSoiLAotCXNldCBlbmRpYW5uZXNzIGFjY29yZGluZ2x5LgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBOZXcgaG9va3MgbWRfc3RhcnRfbGluZV9ob29rIGFuZAotCW1kX2FmdGVyX3Bhc3NfaG9vay4KLQkqIGNvbmZpZy9hcm0te2JpZyxsaXR9Lm10OiBOZXcgZmlsZXMKLQkqIGNvbmZpZy90Yy1hcm0uaCAoe0xJVFRMRSxCSUd9X0VORElBTiwgQllURV9PUkRFUik6IERlZmluZS4KLQkoVEFSR0VUX0ZPUk1BVCk6IFNlbGVjdCBkZXBlbmRpbmcgb24gZW5kaWFubmVzcyBhbmQgZW11bGF0aW9uIGFuZAotCW9iamVjdCBmb3JtYXQuCi0JKG1kX2FmdGVyX3Bhc3NfaG9vaywgbWRfc3RhcnRfbGluZV9ob29rKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWFybS5jOiBJbmNsdWRlIHN1YnNlZ3MuaCwgc3ltYm9scy5oIGFuZCBsaXN0aW5nLmguCi0JKHNoaWZ0W10pOiBBZGQgdXBwcGVyIGNhc2UgZXF1aXZhbGVudHMuCi0JKENQX1RfW1hZXSwgVFJBTlNfQklUKTogRGVmaW5lLgotCShjb25kc1tdKTogRGVsZXRlIGluaXRpYWwgTlVMTCBlbnRyeSwgYWRkICJsbyIgZW50cnkgYXMgc3lub255bSBmb3IKLQkiY2MiLgotCShMT05HRVNUX0ZMQUcsIGZsYWdzW10pOiBEZWxldGUuCi0JKGFybV9wc3IpOiBOZXcgc3RydWN0dXJlLgotCShwc3JzW10pOiBOZXcgdmFyaWFibGUuCi0JKFBTUl9BTEwpOiBEZWZpbmUuCi0JKExPTkdFU1RfSU5TVCk6IEJ1bXAgdG8gNS4KLQkoTElURVJBTF9NQVNLLCBDT05EX01BU0ssIE9QQ09ERV9NQVNLLCBEQVRBX09QX1NISUZUKTogRGVmaW5lLgotCShPUENPREVfe0FORCxFT1IsU1VCLFJTQixBREQsQURDLFNCQyxSU0MsVFNULFRFUSxDTVAsQ01OLE9SUixNT1YsQklDLAotCSBNVk59KTogRGVmaW5lLgotCShpbnNuc1tdKTogQWRkIHNtdWxsLCB1bXVsbCwgc21sYWwsIHVtbGFsLCBsZGZtLCBzdGZtLCBtc3IgYW5kIG1ycwotCWluc3RydWN0aW9ucy4gIEFkZCBub3AgYW5kIGFkciBwc2V1ZG8gb3BzLgotCShyZWdfdGFibGUpOiBBZGQgQVBDUyByZWdpc3RlciBuYW1lIHZhcmlhbnRzLgotCShhcm1fcHNyX2hzaCk6IE5ldyBoYXNoIHRhYmxlLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImx0b3JnIiwgInBvb2wiLCAiZXh0ZW5kIiwgImxkb3VibGUiIGFuZAotCSJwYWNrZWQiLgotCShNQVhfTElURVJBTF9QT09MX1NJWkUpOiBEZWZpbmUuCi0JKHN0cnVjdCBsaXRlcmFsUyk6IE5ldyBzdHJ1Y3R1cmUuCi0JKGxpdGVyYWxzLCBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSwgbGl0X3Bvb2xfbnVtLCBjdXJyZW50X3Bvb2xQKTogTmV3Ci0JdmFyaWFibGVzLgotCShhZGRfdG9fbGl0X3Bvb2wsIHN5bWJvbF9sb2NhdGUsIHN5bWJvbF9tYWtlX2VtcHR5KTogTmV3IGZ1bmN0aW9ucy4KLQkodmFsaWRhdGVfaW1tZWRpYXRlKTogUmV0dXJuIEZBSUwgb24gZmFpbHVyZS4KLQkoc19sdG9yZyk6IE5ldyBmdW5jdGlvbi4KLQkocHNyX3JlcXVpcmVkX2hlcmUsIHBzcmZfcmVxdWlyZWRfaGVyZSk6IE5ldyBmdW5jdGlvbnMuCi0JKGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSk6IE5ldyBwYXJhbWV0ZXIsIGZsYWcsIGFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JSWYgZmxhZyBpcyBub24temVybywgcmVzdHJpY3QgdGhlIGxlZ2FsIGFkZHJlc3NpbmcgbW9kZXMuCi0JKGRvX25vcCwgZG9fbXJzLCBkb19tc3IsIGRvX211bGwpOiBOZXcgZnVuY3Rpb25zLgotCShuZWdhdGVfZGF0YV9vcCk6IE5ldyBmdW5jdGlvbi4KLQkoZGF0YV9vcDIpOiBhY2NlcHQgI3gseSBtZWFuaW5nIHggcm90YXRlZCByaWdodCBieSB5LCBidXQgb25seSB3aGVuCi0Jc3VpdGFibGUgY29uc3RhbnRzLiAgSWYgaW1tZWRpYXRlIGlzIG5vdCBsZWdhbCwgdHJ5IGNoYW5naW5nIHRoZQotCW9wY29kZS4KLQkoZG9fYWRyKTogTmV3IGZ1bmN0aW9uLgotCShkb19sZHN0KTogYWNjZXB0ICJsZHIgcmVnLCA9ZXhwciIuICBQdXQgZXhwciBpbiB0aGUgcG9vbCBpZiBpdCBjYW4ndAotCWJlIGRvbmUgYXMgYW4gaW1tZWRpYXRlLgotCShkb19mcF9sZHN0KTogVXNlIENQX1RfW1hZXSwgbm90IGltbWVkaWF0ZSB2YWx1ZXMuCi0JKGRvX2ZwX2xkbXN0bSk6IE5ldyBmdW5jdGlvbi4KLQkoYXJtX3Bzcl9wYXJzZSk6IE5ldyBmdW5jdGlvbi4KLQkob3V0cHV0X2luc3QpOiBVc2UgSU5TTl9TSVpFIGluIGNhbGwgdG8gbWRfbnVtYmVyX3RvX2NoYXJzLgotCShtZF9hc3NlbWJsZSk6IEFkZCBoYWNrIHNvIHRoYXQgIkxhYmVsIGluc3RydWN0aW9uIiBjYXVzZXMgYWxpZ25tZW50IG9mCi0JdGhlIGxhYmVsLgotCShhcm1fYWZ0ZXJfcGFzc19ob29rLCBhcm1fc3RhcnRfbGluZV9ob29rLCBhcm1fZnJvYl9zeW1ib2wpOiBOZXcKLQlmdW5jdGlvbnMuCi0KLVdlZCBNYXkgMTcgMDU6MjU6MTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3Nob3dfdXNhZ2UpOiBBZGQgXCdzIGF0IGVuZCBvZiBsaW5lcyBpbgotCXN0cmluZ3MgZm9yIG5vbi1HQ0MgY29tcGlsZXJzLgotCi1UdWUgTWF5IDE2IDE5OjM2OjAwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfcG9wX2luc2VydCk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfZm9ybWF0X29wcyk6IFVzZSBpdC4KLQkob2JqX2Vjb2ZmX2Zyb2Jfc3ltYm9sKTogTm93IHN0YXRpYy4KLQotV2VkIE1heSAxNyAwMDo1OToxMiAxOTk1ICBBbmRyZXcgQ2FnbmV5IC0gYWthIE5vaWQgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2JlZ2luKTogV2FzIGFzc3VtaW5nIHRoYXQgYW4gaW5zdHJ1Y3Rpb24gd2FzCi0JYmlnZW5kaWFuIGFuZCBoZW5jZSAxNmJpdCByZWxvY3Mgd2l0aGluZyBpbnN0cnVjdGlvbnMgd291bGQKLQlBTFdBWVMgYmUgYXQgYWRkcmVzc2VzIGkrMi1pKzMuICBJbiBMRSBtb2RlIGl0IGlzIGkrMC1pKzEuCi0KLVR1ZSBNYXkgMTYgMTY6Mjk6NTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1tdWx0aS5oIChvYmpfZnJvYl9zeW1ib2wsIG9ial9mcm9iX2ZpbGUsIFNfR0VUX1NJWkUsCi0JU19TRVRfU0laRSwgU19HRVRfQUxJR04sIFNfU0VUX0FMSUdOLCBvYmpfY29weV9zeW1ib2xfYXR0cmlidXRlcywKLQlPQkpfUFJPQ0VTU19TVEFCKTogTmV3IG1hY3Jvcy4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFByb3RlY3QgYWdhaW5zdCByZWRlZmluaW5nIHRoZW0gYWxzbyB3aGVuCi0JaW5jbHVkaW5nIG9iai1lbGYuaC4gIFRlc3Qgb25seSBPQkpfRUxGIGZvciBpbmNsdWRpbmcgZWxmL21pcHMuaC4KLQkobWlwc19pbml0X2FmdGVyX2FyZ3MpOiBOZXcgZnVuY3Rpb24uICBTZXQgYnl0ZV9vcmRlciBoZXJlLgotCShtZF9wYXJzZV9vcHRpb24pOiBOb3QgaGVyZS4KLQkoYnl0ZV9vcmRlcik6IERvbid0IGJvdGhlciBpbml0aWFsaXppbmcuCi0JKiBjb25maWcvdGMtbWlwcy5oIChtaXBzX2luaXRfYWZ0ZXJfYXJncyk6IERlY2xhcmUuCi0JKHRjX2luaXRfYWZ0ZXJfYXJncyk6IE5ldyBtYWNyby4KLQotCSogcmVhZC5jIChzX2xjb21tKTogRG8gRUxGL0VDT0ZGIHRlc3QgYXQgcnVuIHRpbWUsIG5vdCBjb21waWxlCi0JdGltZS4KLQotRnJpIE1heSAxMiAxNDoxNzo0NyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JSW5pdGlhbCBzdXBwb3J0IGZvciBQRSBvYmplY3QgZmlsZXMuCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZSAoaTM4Ni0qLXBlLCBpMzg2LSotKm50KTogQWRkLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBDb3BlIHdpdGggUEUgd2llcmRuZXNzLgotCSogY29uZmlnL29iai1jb2ZmLmggKFRFX1BFKTogTmV3IHRhcmdldCBmb3JtYXQuCi0KLVRodSBNYXkgMTEgMTQ6NTg6MjEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoTkVFRF9FQ09GRl9ERUJVRyk6IERlZmluZSBpZiBFQ09GRl9ERUJVR0dJTkcKLQl3YXMgZGVmaW5lZCBieSBoZWFkZXIgZmlsZXMuICBUZXN0IGluIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMKLQlpbnN0ZWFkIG9mIEVDT0ZGX0RFQlVHR0lORy4KLQkoZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlKTogTWFrZSBlbXB0eSBpZiBORUVEX0VDT0ZGX0RFQlVHIGlzIG5vdAotCWRlZmluZWQuCi0JKG9ial9yZWFkX2JlZ2luX2hvb2ssIG9ial9zeW1ib2xfbmV3X2hvb2ssIGVsZl9mcm9iX3N5bWJvbCwKLQllbGZfZnJvYl9maWxlKTogT25seSBjYWxsIGVjb2ZmIHJvdXRpbmVzIGlmIE5FRURfRUNPRkZfREVCVUcgaXMKLQlkZWZpbmVkLgotCShlbGZfZWNvZmZfc2V0X2V4dCwgZWxmX2dldF9leHRyLCBlbGZfc2V0X2luZGV4KTogRGVmaW5lIG9ubHkgaWYKLQlORUVEX0VDT0ZGX0RFQlVHIGlzIGRlZmluZWQuCi0JKGVsZl9mb3JtYXRfb3BzKTogUmVmZXJlbmNlIGVsZl9lY29mZl9zZXRfZXh0IG9ubHkgaWYKLQlORUVEX0VDT0ZGX0RFQlVHLgotCi1XZWQgTWF5IDEwIDE4OjA5OjEyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChPQkpTKTogSW5jbHVkZSBAZXh0cmFfb2JqZWN0c0AuCi0JKG9iai1lbGYubywgb2JqLWVjb2ZmLm8sIGUtbWlwc2VsZi5vLCBlLW1pcHNlY29mZi5vKTogTmV3IHJ1bGVzCi0JZm9yIGJ1aWxkaW5nIHRoZXNlIGluZGVwZW5kZW50bHkuCi0JKiBlbXVsLXRhcmdldC5oLCBjb25maWcvZS1taXBzZWxmLmMsIGNvbmZpZy9lLW1pcHNlY29mZi5jOiBOZXcKLQlmaWxlcy4KLQotCSogYWNjb25maWcuaCAoREVGQVVMVF9FTVVMQVRJT04sIEVNVUxBVElPTlMsIFVTRV9FTVVMQVRJT05TLAotCU9CSl9NQVlCRV8qLCBJMzg2Q09GRiwgTTY4S0NPRkYsIE04OEtDT0ZGKTogTmV3IG1hY3Jvcy4KLQkqIGFjbG9jYWwubTQgKEdBU19VTklRKTogTmV3IG1hY3JvLgotCi0JKiBhcy5jIChlbXVsYXRpb25zLCBuX2VtdWxhdGlvbnMpIFtVU0VfRU1VTEFUSU9OU106IE5ldyB2YXJpYWJsZS4KLQkoc2VsZWN0X2VtdWxhdGlvbl9tb2RlLCBkZWZhdWx0X2VtdWxfYmZkX25hbWUsIGNvbW1vbl9lbXVsX2luaXQpCi0JW1VTRV9FTVVMQVRJT05TXTogTmV3IGZ1bmN0aW9ucy4KLQkobWFpbikgW1VTRV9FTVVMQVRJT05TXTogQ2FsbCBzZWxlY3RfZW11bGF0aW9uX21vZGUgYmVmb3JlIG90aGVyCi0JaW5pdGlhbGl6YXRpb24uCi0JKiBlbXVsLmg6IE5ldyBmaWxlLgotCSogYXMuaCBbVVNFX0VNVUxBVElPTlNdOiBJbmNsdWRlIGl0LgotCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBlbmFibGUtdGFyZ2V0cyBvcHRpb24uICBJdGVyYXRlIG92ZXIgdGFyZ2V0Ci0JbGlzdCwgYnVpbGRpbmcgdXAgYSBsaXN0IG9mIG9iamVjdCBmaWxlIGZvcm1hdHMgYW5kIGVtdWxhdGlvbgotCWNvbmZpZ3VyYXRpb25zLiAgKE9ubHkgc3VwcG9ydHMgZW11bGF0aW9ucyBmb3IgTUlQUyBDUFUgc28gZmFyLikKLQlJZiBtdWx0aXBsZSBmb3JtYXRzIGFyZSBuZWVkZWQsIHNldCBvYmpfZm9ybWF0IHRvIG11bHRpIGFuZCBhZGQKLQlmb3JtYXQgY29uZmlnIGZpbGVzIHRvIGV4dHJhX2ZpbGVzLiAgSWYgZW11bGF0aW9uIG1vZGVzIGFyZQotCW5lZWRlZCwgYWRkIHRoZSByZWxldmFudCBmaWxlcyB0byBleHRyYV9maWxlcy4KLQotCSogY29uZmlndXJlLmluOiBEZWZpbmUgSTM4NkNPRkYsIE02OEtDT0ZGLCBNODhLQ09GRiBmb3IgdGhvc2UKLQljb25maWd1cmF0aW9ucy4KLQotCSogZWNvZmYuYyAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IEZpbGVuYW1lIGFyZ3VtZW50IG5vdwotCXBvaW50cyB0byBjb25zdC4KLQkqIGVjb2ZmLmggKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBVcGRhdGVkIGRlY2xhcmF0aW9uLgotCi0JKiBvYmouaCAob2JqX3JlYWRfYmVnaW5faG9vayk6IERvbid0IGRlY2xhcmUgZnVuY3Rpb24gaWYgaXQncwotCWFscmVhZHkgYSBtYWNyby4KLQotCSogcmVhZC5jIChzX3NwYWNlLCBjb25zLCBzdHJpbmdlcik6IElmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IGlzCi0JZGVmaW5lZCwgY2FsbCBpdCBvbiBlbnRyeS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IElmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0JaXMgZGVmaW5lZCwgY2FsbCBpdCBvbiBlbnRyeS4gIElmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rIGlzCi0JZGVmaW5lZCwgY2FsbCBpdCBiZWZvcmUgcmV0dXJuaW5nIG5vcm1hbGx5LgotCi0JKiByZWFkLmggKHRhcmdldF9iaWdfZW5kaWFuKTogRGVjbGFyZS4KLQotCSogb2JqLmggKHN0cnVjdCBmb3JtYXRfb3BzKTogQWRkZWQgbmV3IGZ1bmN0aW9uIHBvaW50ZXIgZmllbGRzCi0JZWNvZmZfc2V0X2V4dCwgcmVhZF9iZWdpbl9ob29rLCBzeW1ib2xfbmV3X2hvb2suCi0JKGVjb2ZmX2Zvcm1hdF9vcHMsIGVsZl9mb3JtYXRfb3BzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9zX2dldF9zaXplLCBlbGZfc19zZXRfc2l6ZSwKLQllbGZfc19nZXRfYWxpZ24sIGVsZl9zX3NldF9hbGlnbiwgZWxmX2NvcHlfc3ltYm9sX2F0dHJpYnV0ZXMsCi0JZWxmX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogTmV3IGZ1bmN0aW9ucy4KLQkoZWxmX2Zvcm1hdF9vcHMpOiBOZXcgdmFyaWFibGUuCi0JKGVsZl9mcm9iX3N5bWJvbCk6IE5vdyB0YWtlcyBhZGRpdGlvbmFsIGludCogYXJndW1lbnQuCi0JKiBjb25maWcvb2JqLWVsZi5oIChlbGZfZnJvYl9zeW1ib2wpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGVsZl9wb3BfaW5zZXJ0KTogRGVjbGFyZS4KLQkob2JqX3BvcF9pbnNlcnQpOiBEZWZpbmUgdG8gY2FsbCBlbGZfcG9wX2luc2VydC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MsCi0Jb2JqX2Vjb2ZmX2Zyb2Jfc3ltYm9sKTogTmV3IGZ1bmN0aW9ucy4KLQkoZWNvZmZfZm9ybWF0X29wcyk6IE5ldyB2YXJpYWJsZS4KLQotCSogY29uZmlnL3RlLWdlbmVyaWMuaDogSWYgT0JKX0hFQURFUiBpcyBkZWZpbmVkLCB1c2UgaXQgYXMgdGhlCi0JZmlsZW5hbWUgdG8gaW5jbHVkZSBpbiBwbGFjZSBvZiBvYmotZm9ybWF0LmguCi0JKiBjb25maWcvdGUtbXVsdGkuaDogTmV3IGZpbGUsIGNvcGllZCBmcm9tIHRlLWdlbmVyaWMuaC4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKE9CSl9IRUFERVIpOiBEZWZpbmUgaXQgdG8gIm9iai1lbGYuaCIuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKE9CSl9IRUFERVIpOiBEZWZpbmUgaXQgdG8gIm9iai1lY29mZi5oIi4KLQotCSogY29uZmlnL29iai1lbGYuYyAoRUNPRkZfREVCVUdHSU5HKTogRGVmYXVsdCB0byAwLgotCShvYmpfcmVhZF9iZWdpbl9ob29rLCBvYmpfc3ltYm9sX25ld19ob29rLCBlbGZfZnJvYl9zeW1ib2wsCi0JZWxmX2Zyb2JfZmlsZSk6IFRlc3QgaXQgYXQgcnVuIHRpbWUuCi0JKG9ial9lY29mZl9zZXRfZXh0LCBlbGZfZ2V0X2V4dHIsIGVsZl9zZXRfaW5kZXgpOiBEZWZpbmUKLQl1bmNvbmRpdGlvbmFsbHkuCi0JKGVsZl9wc2V1ZG9fdGFibGUpOiBSZW5hbWVkIGZyb20gb2JqX3BzZXVkb190YWJsZSwgbm93IHN0YXRpYy4KLQkoZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlKTogU3BsaXQgb2ZmIGludG8gc2VwYXJhdGUgdGFibGUuICBEZWZpbmUKLQlpdCB1bmNvbmRpdGlvbmFsbHkuCi0JKGVsZl9wb3BfaW5zZXJ0KTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1lbGYuaCAoZWxmX3BvcF9pbnNlcnQpOiBEZWNsYXJlLgotCShvYmpfcG9wX2luc2VydCk6IE5ldyBtYWNyby4KLQkob2JqX2Vjb2ZmX3NldF9leHQpIFshT0JKX01BWUJFX0VMRl06IERlZmluZSB0byBlbGZfZWNvZmZfc2V0X2V4dC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX2Vjb2ZmX3NldF9leHQpOiBEZWZpbmUgdG8gZWNvZmZfc2V0X2V4dC4KLQotCSogY29uZmlnL3RjLW1pcHMuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbnMuCi0JKG1pcHNfcG9wX2luc2VydCk6IERlY2xhcmUuCi0JKG1kX3BvcF9pbnNlcnQpOiBDYWxsIGl0LgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJZiBPQkpfTUFZQkVfRUxGIGlzIGRlZmluZWQsIGluY2x1ZGUKLQlvYmotZWxmLmgsIGJ1dCBwcmVzZXJ2ZSBPVVRQVVRfRkxBVk9SIGFuZCBwcm90ZWN0IHNvbWUgb3RoZXIKLQltYWNyb3MgZnJvbSByZWRlZmluaXRpb24uCi0JKEVDT0ZGX0RFQlVHR0lORyk6IERlZmF1bHQgdG8gMC4gIEFsbCByZWZlcmVuY2VzIGNoYW5nZWQgdG8KLQlydW4tdGltZSB0ZXN0cyBvciBtYWRlIHVuY29uZGl0aW9uYWwuCi0JKHNfc3RyaW5nZXIsIHNfbWlwc19zcGFjZSwgc19lbGZfc2VjdGlvbik6IERlbGV0ZWQuCi0JKG1kX3BzZXVkb190YWJsZSk6IERvbid0IHJlZmVyIHRvIHRoZW0uICBTcGxpdCB0YWJsZSBpbnRvIHRocmVlCi0Jc2VjdGlvbnMsIGZvciBNSVBTLCBub24tRUNPRkZfREVCVUdHSU5HLCBhbmQgRUxGLgotCShtaXBzX3BvcF9pbnNlcnQpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZW5hYmxlX2F1dG9fYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtbWlwcy5oIChtaXBzX3BvcF9pbnNlcnQpOiBEZWNsYXJlLgotCShtZF9wb3BfaW5zZXJ0KTogTmV3IG1hY3JvLgotCShtaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVjbGFyZS4KLQkobWRfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBOZXcgbWFjcm8uCi0JKG1pcHNfZW5hYmxlX2F1dG9fYWxpZ24pOiBEZWNsYXJlLgotCShtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayk6IE5ldyBtYWNybywgY2FsbHMKLQltaXBzX2VuYWJsZV9hdXRvX2FsaWduLgotCi1UdWUgTWF5ICA5IDE3OjA3OjQxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbGl0dGxlIGVuZGlhbiBQb3dlclBDIHN1cHBvcnQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZi4KLQkqIGNvbmZpZy9wcGMtYmlnLm10OiBOZXcgZmlsZSBmb3IgYmlnIGVuZGlhbiBQb3dlclBDIHN5c3RlbXMuCi0JKiBjb25maWcvcHBjLWxpdC5tdDogTmV3IGZpbGUgZm9yIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBzeXN0ZW1zLgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRhcmdldF9iaWdfZW5kaWFuKTogRGVjbGFyZS4KLQkoVEFSR0VUX0ZPUk1BVCk6IERlYWwgd2l0aCBsaXR0bGUgYW5kIGJpZyBlbmRpYW4gRUxGIHZhcmlhbnRzLgotCShUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZSBhcyAxLCBub3QgZW1wdHkuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2JpZ19lbmRpYW4pOiBEZWxldGUgdmFyaWFibGUsIHVzZQotCXRhcmdldF9iaWdfZW5kaWFuIGluc3RlYWQuCi0JKG1kX3BhcnNlX29wdGlvbik6IFBhcnNlIC1tbGl0dGxlIGFuZCAtbWxpdHRsZS1lbmRpYW4gdG8gdXNlCi0JbGl0dGxlIGVuZGlhbiBzdXBwb3J0LiAgUGFyc2UgLW1iaWcgYW5kIC1tYmlnLWVuZGlhbiB0byB1c2UgYmlnCi0JZW5kaWFuIHN1cHBvcnQuCi0JKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGUgdG8gcmVmbGVjdCBjdXJyZW50IHN3aXRjaGVzLgotCShwcGNfc2V0X2NwdSk6IFJlY29nbml6ZSBwb3dlcnBjbGUgYXMgbGl0dGxlIGVuZGlhbiBQb3dlclBDLiAgVXNlCi0JYXNfZmF0YWwsIG5vdCBhYm9ydCBpZiB1bmtub3duIG1hY2hpbmUuCi0KLVR1ZSBNYXkgIDkgMTA6NTg6NDEgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IENhc3QgKnZhbHAgdG8gYW4gaW50ZWdlciB3aGVuCi0JY29tcGFyaW5nIGFnYWluc3Qgc2lnbmVkIHZhbHVlcy4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogTWFrZSAiZGlzdGFuY2UiIGFuIGludGVnZXIuCi0KLVR1ZSBNYXkgIDkgMDA6NDc6MDMgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcykgW0JGRF9BU1NFTUJMRVJdOiBOZXcgdHlwZS4KLQkodGhpc19mb3JtYXQpIFtCRkRfQVNTRU1CTEVSXTogRGVjbGFyZSBuZXcgdmFyaWFibGUsIGlmIG5vdAotCWFscmVhZHkgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi1Nb24gTWF5ICA4IDIxOjQ0OjEzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuaCAoc2VnX2luZm8pOiBQcm92aWRlIGR1bW15IHZlcnNpb24gZm9yCi0Jbm9uLUJGRF9BU1NFTUJMRVIsIG5vbi1NQU5ZX1NFR01FTlRTIGNvbmZpZ3VyYXRpb24uICBJdCBzaG91bGQKLQluZXZlciBnZXQgaW52b2tlZCwgYnV0IHRoaXMgaXMgZWFzaWVyIHRoYW4gY29uZGl0aW9uYWxpemluZyBzb21lCi0Jb2YgdGhlIHVzZXMuCi0JKHN0cnVjdCBzZWdfaW5mb190cmFzaCk6IER1bW15IHR5cGUgdXNlZCBieSBhYm92ZSB0byBtYWtlIGNvZGUKLQljb21waWxlLgotCi1GcmkgTWF5ICA1IDE0OjQ3OjEzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogRGVmaW5lIHRvIDEsIG5vdAotCWVtcHR5LgotCSogY29uZmlnL29iai1lbGYuaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERpdHRvLgotCSogY29uZmlnL29iai1zb20uaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERpdHRvLgotCi1UaHUgTWF5ICA0IDE5OjI2OjU1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBBbHdheXMgZGVmaW5lLiAgSWYKLQlTRVBBUkFURV9TVEFCX1NFQ1RJT05TIGlzbid0IHNldCwgYWJvcnQuCi0JKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEZWZhdWx0IHRvIHplcm8uCi0JKGFvdXRfcHJvY2Vzc19zdGFiKTogTmV3IGZ1bmN0aW9uLCBzcGxpdCBvdXQgZnJvbSBzX3N0YWJfZ2VuZXJpYy4KLQkoT0JKX1BST0NFU1NfU1RBQikgW0FPVVRfU1RBQlNdOiBEZWZpbmUgdG8gY2FsbCBhb3V0X3Byb2Nlc3Nfc3RhYiwKLQlpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShzX3N0YWJfZ2VuZXJpYyk6IFRlc3QgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyBhdCBydW4gdGltZS4gIElmCi0JaXQncyBub3Qgc2V0LCBhbmQgT0JKX1BST0NFU1NfU1RBQiBpc24ndCBkZWZpbmVkLCBhYm9ydC4gIEFsd2F5cwotCXBhc3Mgc2l4IGFyZ3VtZW50cyB0byBPQkpfUFJPQ0VTU19TVEFCLgotCSogcmVhZC5oIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogRGVjbGFyZSB1bmNvbmRpdGlvbmFsbHkuCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoQU9VVF9TVEFCUyk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChBT1VUX1NUQUJTKTogRGVmaW5lLgotCSogY29uZmlnL29iai1lY29mZi5oIChPQkpfUFJPQ0VTU19TVEFCKTogQWRkIG5ldyBmaXJzdCBhcmd1bWVudCwKLQlpZ25vcmVkLgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX1BST0NFU1NfU1RBQikgW0VDT0ZGX0RFQlVHR0lOR106IERpdHRvLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKEVDT0ZGX0RFQlVHR0lORyk6IERlZmluZSB0byAxLCBub3QgZW1wdHkuCi0JKiBjb25maWcvb2JqLWVsZi5oIChFQ09GRl9ERUJVR0dJTkcpOiBEaXR0by4gIFRlc3QgdmFsdWUsIG5vdAotCXdoZXRoZXIgaXQncyBkZWZpbmVkLgotCi1XZWQgTWF5ICAzIDIxOjM4OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFzLmggKExPQ0FMX0xBQkVMU19ET0xMQVIsIExPQ0FMX0xBQkVMU19GQik6IElmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZCwgZGVmaW5lIHRoZW0gdG8gemVyby4KLQkqIGNvbmZpZy90Yy0qLmgsIGNvbmZpZy90ZS0qLmg6IElmIGRlZmluaW5nIHRoZW0sIGRlZmluZSB0aGVtIHRvCi0JYmUgMSBpbnN0ZWFkIG9mIGVtcHR5LgotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50LCBvcGVyYW5kKTogVGVzdCB0aGVtIGF0IHJ1biB0aW1lCi0JaW5zdGVhZCBvZiBjb21waWxlIHRpbWUuCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IERpdHRvLgotCSogc3ltYm9scy5jIChjb2xvbik6IERpdHRvLgotCShkb2xsYXJfKiwgZGVmaW5lX2RvbGxhcl9sYWJlbCwgZmJfKik6IERlZmluZSB1bmNvbmRpdGlvbmFsbHkuCi0JKiBzeW1ib2xzLmggKGRvbGxhcl8qLCBkZWZpbmVfZG9sbGFyX2xhYmVsLCBmYl8qKTogRGVjbGFyZQotCXVuY29uZGl0aW9uYWxseS4KLQotV2VkIE1heSAgMyAxMzowODo1MyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRG8gbm90aGluZyBmb3IgYW4gb3V0IG9mIHJhbmdlCi0JUEMgcmVsYXRpdmUgY2FsbCBzaW5jZSB0aG9zZSBvbmx5IG9jY3VyIGluIGNhc2VzIHdoZXJlIHRoZSBsaW5rZXIKLQljYW4gZml4IHRoZW0gdXAuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIHJlbG9jYXRpb25zIGZvciBvdXQgb2YgcmFuZ2UgUEMKLQlyZWxhdGl2ZSBjYWxscy4KLQotVHVlIE1heSAgMiAxNjozNDo0NyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlIChocHBhKi0qLWxpdGVzKik6IEhhbmRsZSBqdXN0IGxpa2UgaHBwYSotKi0qZWxmKi4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0KLVR1ZSBNYXkgIDIgMTE6MjI6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3BfaW5zZXJ0KTogTmV3IGZ1bmN0aW9uLgotCShwb3Bfb3ZlcnJpZGVfb2ssIHBvcF90YWJsZV9uYW1lKTogTmV3IHZhcmlhYmxlcy4KLQkobWRfcG9wX2luc2VydCwgb2JqX3BvcF9pbnNlcnQpOiBOZXcgbWFjcm9zLgotCShwb2JlZ2luKTogVXNlIHRoZW0uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFVzZSBVU0VfU1REQVJHIGFuZCBVU0VfVkFSQVJHUyBpbnN0ZWFkIG9mCi0JTk9fU1REQVJHICZjLgotCi0JKiByZWFkLmMgKHRhcmdldF9iaWdfZW5kaWFuKTogSWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gaXMKLQlkZWZpbmVkLCBpbml0aWFsaXplIHRvIDEuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3RhcmdldF9mb3JtYXQpOiBDaGFuZ2VkIHRvIGEgZnVuY3Rpb24sCi0JY2hlY2tpbmcgZmxhdm9yIGFuZCBieXRlIG9yZGVyIGF0IHJ1biB0aW1lLgotCShtZF9wYXJzZV9vcHRpb24sIGNhc2VzIE9QVElPTl9FQiBhbmQgT1BUSU9OX0VMKTogU2V0Ci0JdGFyZ2V0X2JpZ19lbmRpYW4gaGVyZS4KLQkobWRfYmVnaW4pOiBOb3QgaGVyZS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IEFkanVzdCBkZWNsYXJhdGlvbi4KLQkoVEFSR0VUX0ZPUk1BVCk6IENhbGwgbWlwc190YXJnZXRfZm9ybWF0LgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUKTogRGVmaW5lIGluIHRlcm1zIG9mCi0JT1VUUFVUX0ZMQVZPUi4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGdfc3dpdGNoX3ZhbHVlLCBnX3N3aXRjaF9zZWVuKTogRGVmaW5lCi0JdW5jb25kaXRpb25hbGx5LgotCShtZF9iZWdpbiwgbWlwc19pcCwgbWRfcGFyc2Vfb3B0aW9uLCBzX2NoYW5nZV9zZWMsIHNfb3B0aW9uLAotCXNfYWJpY2FsbHMsIG5vcGljX25lZWRfcmVsYXgpOiBDaGVjayBVU0VfR0xPQkFMX1BPSU5URVJfT1BUIGF0IHJ1bgotCXRpbWUsIGluc3RlYWQgb2YgY29tcGlsaW5nIGNvbmRpdGlvbmFsbHkgb24gR1BPUFQuCi0JKEdQT1BUKTogRG9uJ3QgZGVmaW5lLgotCShtZF9zaG9ydG9wdHMpOiBBbHdheXMgaW5jbHVkZSAtRy4KLQkoUkRBVEFfU0VDVElPTl9OQU1FKTogU2VsZWN0IGF0IHJ1biB0aW1lLgotCShtZF9iZWdpbik6IFRlc3QgZm9yIEVMRiBmb3JtYXQgYXQgcnVuIHRpbWUgaW5zdGVhZCBvZiBjb21waWxlIHRpbWUuCi0JKG1pcHNfaXAsIHNfY2hhbmdlX3NlYyk6IERpdHRvLgotCShtZF9wYXJzZV9vcHRpb24sIGNhc2VzIE9QVElPTl9DQUxMX1NIQVJFRCBhbmQgT1BUSU9OX05PTl9TSEFSRUQpOgotCURpdHRvLgotCShPUFRJT05fQ0FMTF9TSEFSRUQsIE9QVElPTl9OT05fU0hBUkVELCBtaXBzX3JlZ21hc2tfZnJhZyk6IERlZmluZQotCXVuY29uZGl0aW9uYWxseS4KLQotVHVlIE1heSAgMiAwMDoxNzowNCAxOTk1ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBUkdfQ1BVX0RFUF8qKTogTmV3IHZhcmlhYmxlcy4KLQkodGFyZy1jcHUubyk6IERlcGVuZCBvbiBvbmUsIHNlbGVjdGVkIGJ5IGF1dG9jb25mIHN1YnN0aXR1dGlvbiwKLQlpbnN0ZWFkIG9mIFRBUkdfQ1BVX0RFUEVOREVOVFMuCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgJGNwdV90eXBlLCAkb2JqX2Zvcm1hdCwgJGF0b2YsIGFuZAotCSRlbXVsYXRpb24gaW50byBNYWtlZmlsZS5pbi4KLQkqIGNvbmZpZy9oODMwMC5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy9oODUwMC5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy9pMzg2Y29mZi5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvbTY4ay5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy9tNjhrY29mZi5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvbTg4a2NvZmYubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBEZWxldGVkLgotCSogY29uZmlnL21pcHMtYmlnLm10IChUQVJHX0NQVV9ERVBFTkRFTlRTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9taXBzLWxpdC5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvc2gubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvdzY1Lm10OiBEZWxldGVkLgotCSogY29uZmlnL3o4ay5tdDogRGVsZXRlZC4KLQotCSogY29uZmlnL3RlLWRweDIuaCAoZHB4Mik6IERlbGV0ZWQgdW51c2VkIG1hY3JvLgotCSogY29uZmlnL3RlLWdlbmVyaWMuaCAoVEVfR0VORVJJQyk6IERpdHRvLgotCSogY29uZmlnL3RlLWdvMzIuaCAoVEVfR08zMik6IERpdHRvLgotCSogY29uZmlnL3RlLWhwMzAwLmggKFRFX0hQMzAwKTogRGl0dG8uCi0JKiBjb25maWcvdGUtaHBwYS5oIChQQSwgX1RFX1BBX0gpOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1pYzk2MC5oIChURV9JQzk2MCk6IERpdHRvLgotCSogY29uZmlnL3RlLW5ic2Q1MzIuaCAoVEVfTkVUQlNENTMyKTogRGl0dG8uCi0JKiBjb25maWcvdGUtcGM1MzJtYWNoLmggKFRFX1BDNTMyTUFDSCk6IERpdHRvLgotCSogY29uZmlnL3RlLXBwY253LmggKFRFX1BQQ05XKTogRGl0dG8uCi0JKiBjb25maWcvdGUtc2NvMzg2LmggKHNjb3VuaXgpOiBEaXR0by4KLQotTW9uIE1heSAgMSAxNTo1OTo1NiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfYXBwX2ZpbGUpOiBJZiBvYmpfYXBwX2ZpbGUgaXMgZGVmaW5lZCwgY2FsbCBpdCB3aXRoCi0Jc3RyaW5nIGFzIGFyZ3VtZW50LiAgRG9uJ3QgY2FsbCBjX2RvdF9maWxlX3N5bWJvbCBvcgotCWVsZl9maWxlX3N5bWJvbC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfYXBwX2ZpbGUpOiBEZWZpbmUgYXMgY19kb3RfZmlsZV9zeW1ib2wuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfYXBwX2ZpbGUpOiBEZWZpbmUgYXMgZWxmX2ZpbGVfc3ltYm9sLgotCi0JKiBhcy5oIChPVVRQVVRfRkxBVk9SKTogRG9uJ3QgZGVmaW5lIGhlcmUuCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoT1VUUFVUX0ZMQVZPUikgW0JGRF9BU1NFTUJMRVJdOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoT1VUUFVUX0ZMQVZPUik6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChPVVRQVVRfRkxBVk9SKSBbQkZEX0FTU0VNQkxFUl06IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoT1VUUFVUX0ZMQVZPUik6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKE9VVFBVVF9GTEFWT1IpOiBEZWZpbmUuCi0KLVRodSBBcHIgMjcgMjA6MDc6MzMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFJVTlRFU1QpOiBVc2Ugb25lIGluIHNyY2RpciBpZiBwcmVzZW50LgotCShSVU5URVNURkxBR1MpOiBEZWZpbmUuCi0KLVdlZCBBcHIgMjYgMTU6NTQ6MTAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIG1vcmUgcG9ydGFibGUgYWxpZ25tZW50IGhhbmRsaW5nIGluIGFzc2VtYmx5IGNvZGUsCi0JYmFzZWQgb24gcGF0Y2hlcyBmcm9tIEJyeWFuIEZvcmQgPGJhZm9yZEBzY2hpcmYuY3MudXRhaC5lZHU+OgotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkZWQgYmFsaWduIGFuZCBwMmFsaWduLCBmb3IgYWxpZ25pbmcgYnkKLQlieXRlcyBvciBwb3dlcnMgb2YgdHdvIGluZGVwZW5kZW50IG9mIHdoYXQgIi5hbGlnbiIgZG9lcyBmb3IgYQotCWdpdmVuIHRhcmdldC4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCB0aGVtLgotCi1UdWUgQXByIDI1IDExOjEyOjA0IDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAdGhlcHViLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBMb29rIGZvciBtNjhrLSotdnh3b3JrcyogcmF0aGVyIHRoYW4KLQlqdXN0IG02OGstd3JzLXZ4d29ya3Mgc28gZ2FzIGNhbiBiZSBjb25maWd1cmVkIGZvcgotCW02OGstdnh3b3JrczUuMS4KLQotRnJpIEFwciAyMSAxNToxOTowNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXBwbHlfZml4KTogSWYgZnhfcl90eXBlIGlzIHplcm8sIGhhbmRsZQotCWZ4X3NpemUgb2YgMSwgYW5kIGFib3J0IG9uIHVucmVjb2duaXplZCBzaXplcy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEZpeCBidWcgaW4gbGFzdCBjaGFuZ2UgcmVnYXJkaW5nCi0Jbm9uLWlzdmFyIGNhc2UuCi0KLVN1biBBcHIgMTYgMDE6NTI6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChtZF9yZWxheF90YWJsZSwgVENfR0VORVJJQ19SRUxBWF9UQUJMRSk6Ci0JTWlzc2VkIHRoaXMgb25lIGluIDExIEFwciBjaGFuZ2VzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19HRU5FUklDX1JFTEFYX1RBQkxFKTogRml4IHR5cG8uCi0KLVRodSBBcHIgMTMgMTg6MTg6MDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2NvbnZlcnRfZnJhZyk6IEluc3RlYWQgb2YgYWJvcnRpbmcgb24gbGFyZ2UKLQlkaXNwbGFjZW1lbnRzLCBwcmludCBhbiBlcnJvciBtZXNzYWdlLiAgRG9uJ3QgaW52b2tlIHRoZSBjb2RlIHRoYXQKLQlmb2xsb3dlZCB0aGUgYWJvcnQgY2FsbCB1bnRpbCBpdCdzIGJlZW4gdmVyaWZpZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3Nob3dfdXNhZ2UpOiBBZGQgNjgwNjAgdG8gbGlzdC4gIFNwbGl0IGNwdQotCWxpc3QgaW50byB0aHJlZSBsaW5lcy4KLQotVGh1IEFwciAxMyAxNDozNDozNiAxOTk1ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAYWRkZXIuY3lnbnVzLmNvbT4KLQotCSogdGMtbTY4ay5jIChtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IFRlc3QgZm9yIG02ODM2MC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTGlrZXdpc2UuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIG02ODM2MC4KLQkqIHRjLW02OGsuaCAoVEFSR0VUX1dPUkRfU0laRSk6IERlZmluZS4KLQkoVEFSR0VUX0FSQ0gpOiBEZWZpbmUuCi0KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IElmIFRBUkdFVF9XT1JEX1NJWkUgaXMgZGVmaW5lZCwKLQlzaWduLWV4dGVuZCBhcHByb3ByaWF0ZWx5LgotCi1UaHUgQXByIDEzIDExOjIwOjE3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IFByb3Blcmx5IHVzZSBQQVJBTVMgdG8KLQloaWRlIHByb3RvdHlwZSBmcm9tIG5vbi1BTlNJIGNvbXBpbGVycywgYW5kIGRvbid0IHVzZSBBTlNJIHN5bnRheAotCWZvciBhcmd1bWVudHMuCi0KLVdlZCBBcHIgMTIgMTI6MjA6MTkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluIChUREVGSU5FUyk6IFB1dCBlbXB0eSBkZWZpbml0aW9uIGludG8KLQltYWtlZmlsZSBmcmFnbWVudC4KLQkqIG1wdy1tYWtlLmluICh4bWFsbG9jLmMubyk6IFJlbW92ZS4KLQkoYXMubmV3KTogRGVwZW5kIG9uIFZlcnNpb24uci4KLQkoVmVyc2lvbi5yKTogR2VuZXJhdGUgZnJvbSB2ZXJzaW9uIGluZm8uCi0KLQkqIG1wdy1tYWtlLmluOiBEZWxldGUgcmVmZXJlbmNlcyB0byBoZXgtdmFsdWUuYy4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIG1hcHBpbmcgZnJvbSBjb25maWdzIHRvIG9iamVjdCBmaWxlIGZvcm1hdHMsCi0JZ2V0IFZFUlNJT04gZnJvbSBNYWtlZmlsZS5pbiBhbmQgYWRkIHRvIG1rLnRtcC4KLQkobWlwcy1pZHQtZWNvZmYpIFtUREVGSU5FU106IEFkZCBUQVJHRVRfQllURVNfQklHX0VORElBTi4KLQkqIG1wdy1tYWtlLmluIChWRVJTSU9OLCBnQyk6IERvbid0IGRlZmluZS4KLQkoQUxMX0NGTEFHUyk6IFJlbW92ZSAtZCBmbGFncy4KLQkoY29uZmlnLmgpOiBSZW1vdmUgZGVmaW5pdGlvbiBvZiBNUFcsIGFkZCBIQVZFX1NUREFSR19ILAotCUJGRF9BU1NFTUJMRVIuCi0KLQkqIG1wdy1tYWtlLmluIChBTExfQ0ZMQUdTKTogQWRkIGRlZmluaXRpb24gb2YgSEFWRV9TVERBUkdfSCwKLQlpbmNsdWRlIG9mIDo6bGliaWJlcnR5Oi4KLQkoY29uZmlnLmgpOiBJZmRlZiBjb250ZW50cyBvbiBHQVNfVkVSU0lPTi4KLQotCSogbXB3LW1ha2UuaW4gKGFzLmMpOiBDb21waWxlIHdpdGggQyBub3QgZ0MuCi0JKGNvbmZpZy1zdGFtcCk6IFRvdWNoIGNvcnJlY3RseS4KLQkoaW5zdGFsbC1vbmx5KTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbCk6IERlcGVuZCBvbiBhbGwgYW5kIGluc3RhbGwtb25seS4KLQotCSogbXB3LWNvbmZpZy5pbjogUGFyc2UgdGFyZ2V0IGFuZCB1c2UgdG8gZ2VuZXJhdGUgZm9yd2FyZCBpbmNsdWRlcwotCXRvIHRjLSwgb2JqLSwgYW5kIGF0b2YtIGZpbGVzLCB1c2UgdGUtZ2VuZXJpYy5oIGZvciBlbXVsYXRpb24uCi0JKiBtcHctbWFrZS5pbiAoVkVSU0lPTik6IERlZmluZS4KLQkoYXMuYyk6IENvbXBpbGUgd2l0aCBHQ0MuCi0JKFRBUkdfT0JKRUNUUywgQ0xJQlMpOiBEZWZpbmUuCi0JKGFzLm5ldyk6IFVzZSBMREZMQUdTLCBUQVJHX09CSkVDVFMsIENMSUJTIGFuZCBFWFRSQUxJQlMgaW4gbGluawotCWNvbW1hbmQuCi0JKGNvbmZpZy5oLCBjb25maWctc3RhbXApOiBCdWlsZC4KLQotCSogbXB3LW1ha2UuaW4gKEMsIENGTEFHUyk6IFJlbW92ZWQgZGVmaW5pdGlvbnMuCi0JKEFMTF9DRkxBR1MpOiBEZWZpbmUuCi0JU2V0IGRlZmF1bHQgcnVsZSB0byB1c2Uge0NDfSBpbnN0ZWFkIG9mIHtDfS4KLQotCSogbXB3LW1ha2UuaW4gKGluc3RhbGwpOiBNb3ZlZCBoZXJlIGZyb20gbXB3LWJ1aWxkLmluLgotCSogbXB3LWJ1aWxkLmluOiBSZW1vdmVkLCBmdW5jdGlvbmFsaXR5IGluIG1wdy1tYWtlLmluCi0KLQkqIG1wdy1tYWtlLmluIChDRkxBR1MpOiBBZGQgbW9yZSBpbmNsdWRlIHBhdGhzLgotCi0JKiBtcHctY29uZmlnLmluICh2YXJhcmdzLmgsIHN5cy8qLmgpOiBEb24ndCBjcmVhdGUgd2hlbgotCWNvbmZpZ3VyaW5nLgotCSogbXB3LW1ha2UuaW4gKENGTEFHUyk6IEFkZCAtdyBmbGFnLgotCi0JKiBtcHctbWFrZS5pbjogUmVwbGFjZSA4LWJpdCBjaGFycyB3aXRoIHRoZWlyIG5hbWVzLgotCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgY29uZmlndXJlLmluLgotCSogbXB3LW1ha2UuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBNYWtlZmlsZS5pbi4KLQotVHVlIEFwciAxMSAwMTo0MjozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXQgbGVhc3QgYXV0b2NvbmYgMi4zLCBiZWNhdXNlIGVhcmxpZXIKLQl2ZXJzaW9ucyBsb3NlIG9uIHNvbWUgQUlYIHZlcnNpb25zLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbTY4ay0qLWVsZi4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGNvbW1lbnRfY2hhcnMpIFtPQkpfRUxGXTogSW5jbHVkZSAnIycuCi0JKG1kX3BzZXVkb190YWJsZSkgW09CSl9FTEZdOiBJZ25vcmUgInN3YmVnIi4KLQkobWRfYmVnaW4pOiBTZXQgYWx0X25vdGVuZF90YWJsZVsnJiddLCBzbyBzdnI0LXN0eWxlIGltbWVkaWF0ZQotCW9wZXJhbmRzIGFyZSBhY2NlcHRlZC4KLQkobWRfYXBwbHlfZml4KTogQXJndW1lbnQgVkFMUCBzaG91bGQgcG9pbnQgdG8gdmFsdWVULgotCShtZF9jb252ZXJ0X2ZyYWcpOiBBcmd1bWVudCBTRUMgc2hvdWxkIGJlIHR5cGUgc2VnVC4KLQkobWRfc2hvcnRvcHRzKSBbT0JKX0VMRl06IEFjY2VwdCAnUScgd2l0aCBhbiBhcmd1bWVudC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSWdub3JlIGl0LgotCShtZF9jb252ZXJ0X2ZyYWdfMSk6IEFkZCBpbiBmcmFnIGFkZHJlc3MgZm9yIHRoZSBzeW1ib2wgaW4gdGhlCi0JZGlzcGxhY2VtZW50IGNhbGN1bGF0aW9uLgotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCkgW09CSl9FTEZdOiBVc2UgImVsZjMyLW02OGsiLgotCShUQVJHRVRfQVJDSCk6IERlZmluZS4KLQkoUkVHSVNURVJfUFJFRklYX09QVElPTkFMKSBbT0JKX0VMRl06IERlZmF1bHQgdG8gMC4KLQkoTE9DQUxfTEFCRUwsIEZBS0VfTEFCRUxfTkFNRSwgUkVHSVNURVJfUFJFRklYX09QVElPTkFMKTogSGFuZGxlCi0JdGhlc2UgdGhlIHNhbWUgd2F5IGZvciBPQkpfRUxGIGFzIGZvciBNNjhLQ09GRi4KLQotCSogZ2RiaW5pdC5pbjogQWRkIGJyZWFrcG9pbnQgaW4gYXNfYWJvcnQuCi0KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBJZiBvZmZzZXQgaXMgbGVzcyB0aGFuIHplcm8sCi0JY29tcGxhaW4gYWJvdXQgaXQgc3BlY2lmaWNhbGx5LCBpbnN0ZWFkIG9mIHJlcG9ydGluZyBhbiBhc3NlcnRpb24KLQlmYWlsdXJlLgotCShyZWxheF9zZWdtZW50KTogQ29tcGxhaW4gYWJvdXQgLm9yZyBiYWNrd2FyZHMsIHRoZW4gaWdub3JlIGl0LgotCURvIGdlbmVyaWMgcnNfbWFjaGluZV9kZXBlbmRlbnQgcmVsYXhhdGlvbiBvbmx5IGlmCi0JVENfR0VORVJJQ19SRUxBWF9UQUJMRSBpcyBkZWZpbmVkLCBhbmQgdXNlIGl0cyB2YWx1ZSBmb3IgdGhlIGJhc2UKLQlvZiB0aGUgdGFibGUuCi0JKiB0Yy5oIChtZF9yZWxheF90YWJsZSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkqIGFzLmggKHN0cnVjdCByZWxheF90eXBlKTogQWRkIGZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHR5cGUuCi0JKiBjb25maWcvdGMtYTI5ay5jOiBEZWxldGVkIG1kX3JlbGF4X3RhYmxlLgotCSogY29uZmlnL3RjLXthbHBoYSxhcm0saDgzMDAsaHBwYSxpODYwLG04OGssbWlwcyxwcGMsc3BhcmMsejhrfS5jOgotCURpdHRvLgotCSogY29uZmlnL3RjLXtoODUwMCxpMzg2LGk5NjAsbnMzMmssc2gsdGFob2UsdmF4LHc2NX0uaDogRGVjbGFyZQotCW1kX3JlbGF4X3RhYmxlIGhlcmUsIGFuZCBkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSB0byBleHBhbmQKLQl0byBtZF9yZWxheF90YWJsZS4KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChtZF9yZWxheF90YWJsZSk6IE5vIGxvbmdlciBjb25zdC4KLQkqIGNvbmZpZy90Yy13NjUuYyAobWRfcmVsYXhfdGFibGUpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zaG9ydF9qdW1wX3NpemUsIG1kX2xvbmdfanVtcF9zaXplKToKLQlEZWxldGVkLgotCSogZG9jL2ludGVybmFscy50ZXhpOiBEZXNjcmliZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIGFuZAotCVdPUktJTkdfRE9UX1dPUkQuICBNZW50aW9uIG1kXypfanVtcF9zaXplIChidXQgZGVzY3JpcHRpb24gbmVlZHMKLQl0byBiZSBmbGVzaGVkIG91dCBsYXRlcikuICBOb3RlIG02OGsgUENJTkRFWCBtb2RlIGhhcyBiZWVuIGNoZWNrZWQKLQlpbi4KLQotTW9uIEFwciAxMCAxNTo1Nzo0MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChub3BpY19uZWVkX3JlbGF4KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgc3BsaXQKLQlvdXQgZnJvbSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheC4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBDYWxsIGl0LgotCShsb2FkX2FkZHJlc3MsIG1hY3JvKTogSW4gTk9fUElDIGJyYW5jaGVzLCBpZiBub3BpY19uZWVkX3JlbGF4Ci0JcmV0dXJucyBub256ZXJvLCBkb24ndCBhdHRlbXB0IEdQIG9wdGltaXphdGlvbi4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoUENJTkRFWCk6IE5ldyBtYWNyby4KLQkobWRfcmVsYXhfdGFibGUpOiBObyBsb25nZXIgY29uc3QuICBBZGQgUENJTkRFWCBlbnRyaWVzLgotCShtNjhrX2lwKTogRm9yIEFJTkRYIHdpdGggc2ltcGxlIHN5bWJvbCBvcGVyYW5kLCBnZW5lcmF0ZSBhCi0JUENJTkRFWCBmcmFnIGlmIFBDIGlzIHVzZWQsIG9yIGRvIG5vcm1hbCBub24tQUlORFggcHJvY2Vzc2luZyBmb3IKLQlhZGRyZXNzIHJlZ2lzdGVyLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IElmIGNwdSBpcyA2ODAwMCBvciA2ODAxMCwgZml4Ci0JbWRfcmVsYXhfdGFibGUgdG8gcHJldmVudCByZWxheGF0aW9uIG9mIFBDSU5ERVgvQllURSBtb2RlIHRvCi0JU0hPUlQsIHNpbmNlIHRoZXkgZG9uJ3Qgc3VwcG9ydCB0aGF0IG1vZGUuCi0JKG1kX2NvbnZlcnRfZnJhZ18xLCBjYXNlIFBDTEVBL0xPTkcpOiBBZGQgNCB0byBvZmZzZXQsIG5vdCAyLiAgQWRkCi0Jc3VwcG9ydCBmb3IgbmV3IFBDSU5ERVggbW9kZXMuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogUHJvY2VzcyBQQ0lOREVYL1NaX1VOREVGIG1vZGUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2NvbnZlcnRfZnJhZ18xLCBjYXNlIFBDTEVBL1NIT1JUKTogQWRkIDIgdG8KLQlvZmZzZXQuCi0JKG02OGtfaXAsIGNhc2UgbW9zdCBwdW5jdHVhdGlvbi9BT0ZGKTogSWYgdXNpbmcgUEMsIGNhbGwgYWRkX2ZyYWcKLQl1c2luZyBQQ0xFQS4KLQotCSogY29uZmlnL3RjLW02OGsuYzogRG9uJ3QgZXhwbGljaXRseSBpbmNsdWRlIGNvbmZpZy5oLiAgRGVsZXRlZCBhCi0JYnVuY2ggb2YgIiNpZiAwIiBjb2RlIGFuZCB1c2VsZXNzIGNvbW1lbnRzLgotCShzdHJ1Y3QgbTY4a19jcHUpOiBOZXcgdHlwZS4KLQkoYXJjaHMsIG5fYXJjaHMpOiBOZXcgdmFyaWFibGVzLCB3aXRoIHNpbmdsZSBsaXN0IG9mIG5hbWUvZW51bQotCW1hcHBpbmcgYW5kIGFsaWFzZXMuCi0JKG02OGtfaXApOiBEZWxldGUgdGhlIHRhYmxlIGhlcmUuCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogVXNlIHRoZSBuZXcgdGFibGUgaGVyZSBpbnN0ZWFkIG9mCi0Jb3Blbi1jb2RpbmcgaXQuCi0JKG1kX3BhcnNlX29wdGlvbiwgY2FzZSAnbScpOiBEaXR0by4KLQotCSogZG9jL01ha2VmaWxlLmluIChNYWtlZmlsZSk6IEZpeCBydWxlIGZvciBydW5uaW5nIGNvbmZpZy5zdGF0dXMuCi0JKGludGVybmFscy5kdmksIGludGVybmFscy5wcywgaW50ZXJuYWxzLnBzNCk6IE5ldyB0YXJnZXRzLCBub3QKLQlidWlsdCBieSBkZWZhdWx0LgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGk6IEFkZCBsb3VkIGRpc2NsYWltZXIuICBSZWZpbGwgdG8gNzkgY29sdW1ucywKLQlzcGVjaWZ5IGZpbGwtY29sdW1uIGluIGxvY2FsLXZhcmlhYmxlcyBzZWN0aW9uLiAgQ2hhbmdlCi0Jc3ViaGVhZGluZ3MgdG8gc3Vic2VjdGlvbnMgc28gdGhleSBjYW4gYmUgY3Jvc3MtcmVmZXJlbmNlZC4KLQlEZXNjcmliZSBicm9rZW4gd29yZHMsIGZyYWdzLCBmcmFnIGNoYWlucywgZ2VuZXJpYyByZWxheGF0aW9uLAotCXJlbGF4IHRhYmxlLCBtNjhrIHJlbGF4YXRpb24sIG02OGsgYWRkcmVzc2luZyBtb2RlcywgdGVzdCBzdWl0ZQotCWNvZGUuICBBZGQgYSBmZXcgd29yZHMgYWJvdXQgdmFyaW91cyBmaWxlIGZvcm1hdHMuCi0KLQkqIGRvYy9hcy50ZXhpbmZvIChtNjhrKTogUmVjb21tZW5kIHVzaW5nIGAlJyB3aXRoIHJlZ2lzdGVycyBhcyB0aGUKLQlub3JtYWwgY2FzZSwgaW5zdGVhZCBvZiB0aGUgZXhjZXB0aW9uYWwgY2FzZS4KLQotVGh1IE1hciAzMCAxNDozODo0NyAxOTk1ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGxpbnV4IHRvIGRlZmF1bHQgdG8gZWxmLiAgVXNpbmcKLQlpWzM0NV04Ni0qLWxpbnV4YW91dCB3aWxsIGRlZmF1bHRzIHRvIGEub3V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgTWFyIDI5IDE3OjE2OjMwIDE5OTUgIFRvcmJqb3JuIEdyYW5sdW5kICA8dGVnZUBhZGRlci5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IENhc3QgbmVnYXRpdmUgb2Zmc2V0cyB0byBvZmZzZXRUCi0JKGZvciBob3N0aW5nIG9uIDY0IGJpdCBtYWNoaW5lcykuCi0KLVR1ZSBNYXIgMjEgMTY6NTM6MjcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtbWlwczQgYW5kIC1tNDY1MC4KLQotRnJpIE1hciAxNyAxNjo0NzoxMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQWRkIFBST0dSRVNTIG1hY3Jvcy4KLQotRnJpIE1hciAxNyAxMjo0MDozNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IE1ha2Ugc3VyZSB0byBhbHdheXMgcmVzZXQgdGhlIGZyYWcKLQlhbmQgc2VjdGlvbiBmb3IgY29tbW9uIHN5bWJvbHMuCi0KLVRodSBNYXIgMTYgMTc6MjY6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBBbGxvdyBub24gUEMgcmVsYXRpdmUKLQlwb2ludGVycyBpbiB0aGUgLmN0b3JzIGFuZCAuZHRvcnMgc2VjdGlvbiBhbHNvIHdoZW4gdXNpbmcgdGhlCi0JLW1yZWxvY2F0YWJsZSBvcHRpb24uCi0JKG1kX3BhcnNlX29wdGlvbik6IFN1cHBvcnQgLW00MDMgYXMgYSBQb3dlclBDIGNvbXB1dGVyLgotCShtZF9zaG93X3VzYWdlKTogRGl0dG8uCi0KLVdlZCBNYXIgMTUgMTQ6NDU6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9kZWJ1Zyk6IFRoZSBjdXJfc2NvcGUgZmllbGQgb2YgYSBmaWxfcHRyCi0JbWF5IGJlIE5VTEwgd2hlbiBnaXZlbiBzdHJhbmdlIGlucHV0LiAgRG9uJ3QgY29yZSBkdW1wLgotCi1UdWUgTWFyIDE0IDIxOjM2OjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IERvbid0IHVzZSBhZGRpdSBmb3IgZGxpIG9mIGFuCi0JdW5zaWduZWQgc2VlbWluZ2x5IG5lZ2F0aXZlIG51bWJlci4gIERvbid0IGJvdGhlciBzaGlmdGluZyBhIHplcm8KLQl2YWx1ZS4KLQkobWlwc19pcCk6IEZvciBjYXNlICdqJywgaWYgdGhlcmUgYXJlIG1vcmUgYWx0ZXJuYXRpdmVzLCBhbmQgdGhlCi0JSVNBIGxldmVsIGlzIGF0IGxlYXN0IDMsIGRvbid0IGFjY2VwdCBhbiB1bnNpZ25lZCBzZWVtaW5nbHkKLQluZWdhdGl2ZSBudW1iZXIuCi0KLVR1ZSBNYXIgMTQgMTk6MTY6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2FwcF9saW5lKTogRml4IGxhc3QgcGF0Y2ggdG8gZGVhbCB3aXRoIGEgbGluZSBudW1iZXIKLQlvZiAxLgotCi1UdWUgTWFyIDE0IDE3OjAwOjU3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IFVzZSBhc193YXJuX3doZXJlLCBub3QKLQlhc19iYWRfd2hlcmUgdG8gZ2l2ZSBhIHdhcm5pbmcgaW5zdGVhZCBvZiBhbiBlcnJvci4KLQotTW9uIE1hciAxMyAxNzowMzo0NiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6ICBpc3N1ZSBhIHdhcm5pbmcgaWYgYSBjb25zdGFudAotCWlzIHVzZWQgYXMgYW4gb3BlcmFuZCB3aGVyZSBhbiBpbW1lZGlhdGUgdmFsdWUgaXMgbm90IGFsbG93ZWQuCi0KLUZyaSBNYXIgMTAgMTk6MjE6MTkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmM6IFJlZG8gbXkgMTAgSmFuIGNoYW5nZSwgYnV0IGdldCBpdCByaWdodCB0aGlzCi0JdGltZS4gOi0pCi0JKGZpeHVwX3NlZ21lbnQpOiBJZiBsaW5rcmVsYXggaXMgc2V0LCBqdXN0IHJldHVybi4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBEb24ndCB0cmVhdCBoODMwMCBhbmQgejhrIHNwZWNpYWxseSB3aXRoCi0JcmVnYXJkIHRvIGZpeHVwcy4KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9iZWdpbik6IFNldCBsaW5rcmVsYXguCi0JKiBjb25maWcvdGMtejhrLmMgKG1kX2JlZ2luKTogRGl0dG8uCi0KLVRodSBNYXIgIDkgMTg6MDE6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9oZWFkZXJfYXBwZW5kKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0LgotCi1UaHUgTWFyICA5IDEzOjUxOjMwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQlEZWxldGUgdGhpcyBwYXRjaCwgaXQgYnJlYWtzIHRoZSBoODMwMCBhc3NlbWJsZXIuCi0JVHVlIEphbiAxMCAxMzozNDoxNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgdHJlYXQgaDgzMDAgYW5kIHo4awotCXNwZWNpYWxseSB3aXRoIHJlZ2FyZCB0byBmaXh1cHMuCi0KLVRodSBNYXIgIDkgMTI6Mjg6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1yZWxvY2F0YWJsZSk6IENoYW5nZSB0eXBlIHRvIGJvb2xlYW4uCi0JKG1kX2JlZ2luKTogU2V0IHRoZSBFRl9QUENfUkVMT0NBVEFCTEUgaWYgLW1yZWxvY2F0YWJsZS4KLQotV2VkIE1hciAgOCAxNTozOTozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogQ2hlY2sgZm9yIGEgY3B1IHN0cmluZyBvZiByODAwMCBvcgotCXIxMDAwMC4gIElmIG1pcHNfaXNhIGlzIDQsIHNldCB0aGUgbWFjaGluZSBudW1iZXIgdG8gODAwMC4KLQkoYXBwZW5kX2luc24pOiBJZiBtaXBzX2lzYSBpcyBhdCBsZWFzdCA0LCBkb24ndCBnZW5lcmF0ZSBub3BzIGZvcgotCWNvcHJvY2Vzc29yIGRlbGF5cy4gIENoZWNrIElOU05fUkVBRF9GUFJfUiB3aGVuIHNldHRpbmcKLQltaXBzX2Nwcm1hc2tbMV0uCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBJZiBtaXBzX2lzYSBpcyBhdCBsZWFzdCA0LCBkb24ndCBnZW5lcmF0ZSBub3BzCi0JZm9yIGNvcHJvY2Vzc29yIGRlbGF5cy4KLQkobWlwc19pcCk6IENoZWNrIGZvciBJTlNOX0lTQTQgaW5zdHJ1Y3Rpb25zLiAgSGFuZGxlIG5ldyBhcmd1bWVudAotCXR5cGVzICdoJywgJ1InLCAnTicsIGFuZCAnTScuCi0JKG1kX2xvbmdvcHRzKTogQWNjZXB0ICJtaXBzNCIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAtbWlwczQsIGFuZCAtbWNwdT0xMDAwMCBhbmQgLW1jcHU9ODAwMC4KLQkoc19taXBzc2V0KTogUGVybWl0IC5zZXQgbWlwczQuCi0KLVdlZCBNYXIgIDggMDk6MzY6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWxsb3cgLnN0YWIgc2VjdGlvbnMgdG8KLQloYXZlIG5vbiBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aXRoIC1tcmVsb2NhdGFibGUuCi0KLVdlZCBNYXIgIDggMDI6NTc6NTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAob3Bjb2RlX3B0cik6IFJldHVybiBwb2ludGVyIHRvIGNvbnN0LgotCShtZF9iZWdpbik6IE1ha2UgaGFzaCB0YWJsZSBlcnJvcnMgZmF0YWwuICBQcm9jZXNzIG9wY29kZSBhbGlhc2VzCi0JYWZ0ZXIgbWFpbiBvcGNvZGUgdGFibGUuCi0JKG1kX2FwcGx5X2ZpeF8yLCBjYXNlIDQpOiBSZWNvZGUgc2V0dGluZyBvZiBsb3dlcl9saW1pdCB0byBhdm9pZAotCWdjYyB3YXJuaW5nLgotCi1UdWUgTWFyICA3IDE2OjA3OjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IEFkZCBkb2N1bWVudGF0aW9uIGZvciBTUEFSQyBWOSwgZnJvbSBEb3VnIEV2YW5zCi0JPGRqZUBjeWdudXMuY29tPi4KLQotTW9uIE1hciAgNiAwOTo1ODozNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogQ2hhbmdlIGFsbCBvY2N1cmVuY2VzIG9mIHBhLTg5IHdpdGggcGEtMTEgdG8KLQliZSBjb25zaXN0ZW50IHdpdGggY3VycmVudCBuYW1pbmcgY29udmVudGlvbnMuCi0JKG1kX2JlZ2luKTogU2V0IGEgZGVmYXVsdCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZS4KLQkocGFfaXApOiBJZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBzcGVjaWZpZXMgYSBuZXdlciBtYWNoaW5lIHR5cGUKLQl0aGFuIHRoZSBjdXJyZW50IG1hY2hpbmUgdHlwZSwgdGhlbiB1cGRhdGUgdGhlIGN1cnJlbnQgbWFjaGluZQotCXR5cGUuCi0JKG5lZWRfcGExMV9vcGNvZGUpOiBMaWtld2lzZS4KLQotU3VuIE1hciAgNSAxOTozODowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ3onKTogRG9uJ3QgbG9zZSBhcmd1bWVudAotCXJlbG9jYXRpb24gYml0cyBmb3IgYWJzb2x1dGUgY2FsbHMuCi0KLUZyaSBNYXIgIDMgMTc6NDE6NTAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLiogKG1kX29wZXJhbmQpOiBDaGFuZ2UgZW1wdHkgZnVuY3Rpb24gdG8gZW1wdHkKLQltYWNyby4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGJ1aWxkX2J5dGVzKTogTWFrZSBIOC8zMDAtSCB3YXJuaW5nIG1lc3NhZ2UKLQljbGVhcmVyLgotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IElmIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyBmYWlscywKLQlwcmludCBhIG1lc3NhZ2UgYW5kIGV4aXQsIGluc3RlYWQgb2YgYWJvcnRpbmcuCi0KLUZyaSBNYXIgIDMgMTY6MjY6MTkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB0Yy5oIChtZF9hcHBseV9maXgzKTogSWYgTURfQVBQTFlfRklYMyBpcyBkZWZpbmVkLCBkZWNsYXJlCi0JbWRfYXBwbHlfZml4My4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IElmIE1EX0FQUExZX0ZJWDMgaXMgZGVmaW5lZCwgY2FsbAotCW1kX2FwcGx5X2ZpeDMgd2l0aCB0aGUgbm9ybWFsIDIgYXJndW1lbnRzIGFuZCB0aGUgY3VycmVudCBzZWdtZW50Ci0JcG9pbnRlciBpbnN0ZWFkIG9mIG1kX2FwcGx5X2ZpeC4KLQotCSogY29uZmlnL3RjLXBwYy5oIChNRF9BUFBMWV9GSVgzKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogV2FybiBpZiAtbXJlbG9jYXRhYmxlCi0JYW5kIGEgbm9uIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gdGhhdCBpc24ndCBpbiB0aGUgLmdvdDIgc2VnbWVudAotCXdhcyBwZXJmb3JtZWQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWUgZnJvbSBtZF9hcHBseV9maXggYW5kIHRha2Ugc2VnbWVudCBwb2ludGVyCi0JYXMgdGhpcmQgYXJndW1lbnQuICBJZiBFTEYgb2JqZWN0IGZvcm1hdCwgY2FsbCBwcGNfZWxmX3ZhbGlkYXRlX2ZpeAotCWZvciBub3JtYWwgcmVsb2NhdGlvbnMuCi0JKG1kX3BhcnNlX29wdGlvbik6IElmIEVMRiBvYmplY3QgZm9ybWF0LCByZWNvZ25pemUgdGhlCi0JLW1yZWxvY2F0YWJsZSBzd2l0Y2guCi0KLVRodSBNYXIgIDIgMTY6MzQ6NDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChBT1VUX01BQ0hUWVBFKTogRGVmaW5lIGFzIDEwMCwgbm90IDAuCi0KLVR1ZSBGZWIgMjggMTg6Mjk6MjcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jLCBjb25maWcvdGMtYXJtLmggKG1kX29wZXJhbmQpOiBSZXBsYWNlZCBlbXB0eQotCWZ1bmN0aW9uIGluIC5jIGZpbGUgd2l0aCBlbXB0eSBtYWNybyBpbiAuaCBmaWxlLgotCSogY29uZmlnL3RjLWg4NTAwLiosIGNvbmZpZy90Yy1ocHBhLiosIGNvbmZpZy90Yy1pMzg2LiosCi0JY29uZmlnL3RjLWk4NjAuKiwgY29uZmlnL3RjLWk5NjAuKiwgY29uZmlnL3RjLW5zMzJrLiosCi0JY29uZmlnL3RjLXBwYy4qLCBjb25maWcvdGMtc2guKiwgY29uZmlnL3RjLXNwYXJjLiosCi0JY29uZmlnL3RjLXRhaG9lLiosIGNvbmZpZy90Yy12YXguKiwgY29uZmlnL3RjLXc2NS4qLAotCWNvbmZpZy90Yy16OGsuKjogRGl0dG8uCi0JKiBjb25maWcvdGMtbTY4ay4qOiBEaXR0by4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobW90ZV9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIGRvdHMgZnJvbSBvcGNvZGUKLQluYW1lcy4KLQotCSogcmVhZC5jIChzX2FwcF9saW5lKTogSWdub3JlIG5vbi1wb3NpdGl2ZSBsaW5lIG51bWJlcnMuCi0KLVR1ZSBGZWIgMjggMTU6MzQ6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IFBMVCBvcgotCUdPVCByZWxvY3MgZWl0aGVyLgotCi1Nb24gRmViIDI3IDEzOjAzOjQxIDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIGEyOWstKi12eHdvcmtzIGNvbmZpZ3VyYXRpb24uCi0KLUZyaSBGZWIgMjQgMTQ6NDE6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogVGFrZSBkYmwgYXJndW1lbnQgdG8gZGV0ZXJtaW5lCi0JaGFuZGxpbmcgb2Ygc2lnbmVkIDMyIGJpdCB2YWx1ZXMgaW4gNjQgYml0IG1vZGVzLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKG1hY3JvKTogSGFuZGxlIE1fRExJIGFuZCBNX0RMQV9BQi4KLQotV2VkIEZlYiAyMiAyMzoxMDo1NiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRG9uJ3Qgc3VidHJhY3QgdGhlIHZhbHVlIG9mIHRoZQotCWFkZCBzeW1ib2wgaWYgaXQncyBhIGNvbW1vbiBzeW1ib2wgKHRoZSB2YWx1ZSBvZiBhIGNvbW1vbiBzeW1ib2wKLQlpcyBpdHMgc2l6ZSwgbm90IGEgdmFsdWUgaW4gdGhlIHRyYWRpdGlvbmFsIHNlbnNlKS4KLQotV2VkIEZlYiAyMiAyMToxMjoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogSWYgbGlzdGluZ19wcmV2X2xpbmUgaXMgY2FsbGVkLAotCWNhbGwgZnJhZ19ncm93IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBzdGlsbCByb29tIGZvciBhIHZhcmlhbnQuCi0KLUZyaSBGZWIgMTcgMTQ6NTA6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgMmJ5dGUsIDRieXRlIGFuZCA4Ynl0ZQotCWlmIE9CSl9FTEYuICBGcm9tIGdhcnlASW50cmVwaWQuQ09NIChHYXJ5IEZ1bmNrKS4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogV2FybiBpZiBhIHN5bWJvbCBpcyBib3RoCi0Jd2VhayBhbmQgY29tbW9uLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogTGlrZXdpc2UuCi0KLUZyaSBGZWIgMTcgMTI6NDM6NDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IERvbid0IHJlZGVmaW5lIGJ5dGUgdW5kZXIKLQlFTEYuCi0JKHBwY19lbGZfY29ucyk6IERvbid0IHN1cHBvcnQgQHBjcmVsIGFueSBtb3JlLCBzaW5jZSBESUZGX0VYUFJfT0sKLQlhbGxvd3MgdGhlIG5vcm1hbCBleHByZXNzaW9ucyB0byBnZW5lcmF0ZSBpdC4KLQkobWRfYXBwbHlfZml4KTogQ29udmVydCBCRkRfUkVMT0NfMzIgd2l0aCBwY3JlbCBiaXQgc2V0IGludG8KLQlCRkRfUkVMT0NfMzJfUENSRUwuICBBYm9ydCBpZiBlaXRoZXIgQkZEX1JFTE9DXzE2IG9yIEJGRF9SRUxPQ184Ci0JbmVlZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucy4KLQotCSogY29uZmlnL3RjLXBwYy5oIChESUZGX0VYUFJfT0spOiBEZWZpbmUgdG8gYWxsb3cgUEMgcmVsYXRpdmUKLQlleHByZXNzaW9ucyB0byBiZSBoYW5kbGVkLgotCi1UaHUgRmViIDE2IDE0OjMwOjEzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcGVyYW5kKTogTW92ZSBtZF9vcGVyYW5kIGhhbmRsaW5nIHRvIGRlZmF1bHQgY2FzZQotCShzbyBpdCB3b3JrcykuCi0KLVdlZCBGZWIgMTUgMTY6MDg6NDcgMTk5NSAgSmFzb24gTW9sZW5kYSAgPGNyYXNoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODUwMC5jICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBBZGQgaWdub3JlZAotCXBhcmFtZXRlciwgdG8gbWF0Y2ggcHJvdG90eXBlLgotCi1XZWQgRmViIDE1IDE1OjA3OjAwIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBJZiBFTEYsIGdvIHRvIHBwY19lbGZfY29ucwotCWluc3RlYWQgb2YgY29ucy4KLQkobWRfc2hvd191c2FnZSk6IFNob3cgYWxsIG9mIHRoZSBQb3dlclBjIG9wdGlvbnMuCi0JKHBwY19lbGZfc3VmZml4KTogTmV3IGZ1bmN0aW9uIHRvIHJlY29nbml6ZSBFTEYgc3VmZml4ZXMgdGhhdAotCXNwZWNpZnkgYSByZWxvY2F0aW9uLCBzdWNoIGFzIEBHT1QuCi0JKHBwY19lbGZfY29ucyk6IFJlcGxhY2VtZW50IGZvciB0aGUgc3RhbmRhcmQgY29ucyBmdW5jdGlvbiB0aGF0Ci0Ja25vd3MgYWJvdXQgdGhlIEVMRiBzdWZmaXhlcy4KLQkocHBjX2ZpeHVwKTogQWRkIHJlbG9jIGZpZWxkIHRvIGhvbGQgbm9uLXN0YW5kYXJkIHJlbG9jYXRpb24uCi0JKG1kX2Fzc2VtYmxlKTogSGFuZGxlIEVMRiBzdWZmaXhlcyBsaWtlIEBHT1QuCi0JKG1kX2NyZWF0ZV9zaG9ydF9qdW1wKTogRHVtbXkgaW4gY2FzZSBXT1JLSU5HX0RPVF9XT1JEIGlzIG5vdAotCWRlZmluZWQuCi0JKG1kX2NyZWF0ZV9sb25nX2p1bXApOiBEaXR0by4KLQkobWRfc2hvcnRfanVtcF9zaXplKTogRGl0dG8uCi0JKG1kX2xvbmdfanVtcF9zaXplKTogRGl0dG8uCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBCRkRfUkVMT0NfMzJfUENSRUwsIEJGRF9SRUxPQ19MTzE2LAotCUJGRF9SRUxPQ19ISTE2LCBCRkRfUkVMT0NfSEkxNl9TLCBCRkRfUkVMT0NfUFBDX1RPQzE2LCBhbmQKLQlCRkRfUkVMT0NfMTYgcmVsb2NhdGlvbnMuICBJZiByZWxvY2F0aW9uIGNhbiBub3QgYmUgZm91bmQsIHByaW50Ci0JdGhlIGRlY2ltYWwgdmFsdWUgb2YgdGhlIHJlbG9jYXRpb24uCi0KLVdlZCBGZWIgMTUgMTE6NDY6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiBBY2NlcHQgQkZEX1JFTE9DXzE2LCBmb3IKLQlEV0FSRi4gIEZyb20gZ2FyeUBJbnRyZXBpZC5DT00gKEdhcnkgRnVuY2spLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEhhbmRsZSBNX1V7TCxTfURbX0FdICh1bmFsaWduZWQgZG91YmxlCi0JbG9hZHMgYW5kIHN0b3JlcykuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEbyBhZGp1c3QgZ2xvYmFsCi0Jc3ltYm9scyBpZiBPQkpfQU9VVC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBEb24ndCB1c2UgdGhlIHRhcmdldCByZWdpc3RlciBhcyBhCi0JYmFzZSByZWdpc3RlciB3aGVuIGJ1aWxkaW5nIHRoZSBhZGRyZXNzIGZvciBNX0x7VyxEfXtMLFJ9X0FCLgotCi1Nb24gRmViIDEzIDE0OjQ0OjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoS1QwLCBLVDEpOiBEZWZpbmUuCi0JKG1pcHNfaXApOiBSZWNvZ25pemUgJGt0MCBhbmQgJGt0MSBhcyByZWdpc3RlciBuYW1lcy4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRGVmaW5lIGlmIE9CSl9FTEYuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4KTogSWYgT0JKX0VMRiwgc3VidHJhY3Qgb3V0IHRoZQotCXZhbHVlIG9mIGEgZGVmaW5lZCBzeW1ib2w7IHRoZSB2YWx1ZSB3YXMgYWRkZWQgaW4gYnkKLQlmaXh1cF9zZWdtZW50LiAgVGhpcyB3YXMgcHJldmlvdXNseSBjb3JyZWN0ZWQsIGlmIHRoZSByZWxvYyB3YXMKLQljaGFuZ2VkIHRvIGJlIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgaW4gdGNfZ2VuX3JlbG9jLgotCi1GcmkgRmViIDEwIDE0OjA0OjA0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IFVzZSBTX0lTX0VYVEVSTgotCXJhdGhlciB0aGFuICFTX0lTX0xPQ0FMLgotCi1UaHUgRmViICA5IDE4OjE2OjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBBZGp1c3QgY29uZGl0aW9ucyBmb3IgY2hhbmdpbmcKLQlCRkRfUkVMT0NfMzIgdG8gQkZEX1JFTE9DXzM4Nl9HT1RQQyB0byBoYW5kbGUgYSBzd2l0Y2ggaW4gZnJhZ3MuCi0JUGF0Y2ggb3JpZ2luYWxseSBmcm9tIFJvYiBSeWFuIDxyb2JyQGNtdS5lZHU+LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERlY2xhcmUgcmV0dXJuIHZhbHVlLgotCShpMzg2X29wZXJhbmQpOiBEb24ndCB1c2UgYW4gYXNzaWdubWVudCBkaXJlY3RseSBhcyBhIGNvbmRpdGlvbi4KLQotVGh1IEZlYiAgOSAxMDozNzoxMyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogSW4gc29tZSBjYXNlcyBzdWJ0cmFjdCB0aGUKLQl2YWx1ZSBvZiB0aGUgYWRkIHN5bWJvbCBmcm9tIHZhbHAuICBPZmZzZXRzIGJyYWluZGFtYWdlIGluIHRoZQotCSJtYWNoaW5lIGluZGVwZW5kZW50IiBmaXh1cF9zZWdtZW50LgotCi1XZWQgRmViICA4IDE4OjUxOjIzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG1lc3NhZ2VzLmMgKGFzX2Fib3J0KTogTmV3IGZ1bmN0aW9uLgotCSogYXMuaCAoYXNfYWJvcnQpOiBEZWNsYXJlIGl0LgotCShhYm9ydCk6IE5ldyBtYWNyby4KLQotCVRodSBKYW4gMTkgMTg6MTA6MDUgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy92bXMtY29uZi5oIChIQVZFX1VOSVNURF9IKTogIGRlZmluZSBpdCB1bmNvbmRpdGlvbmFsbHkuCi0JKiBjb25maWctZ2FzLmNvbTogIHRlc3QgZm9yIGF2YWlsYWJpbGl0eSBvZiA8dW5pc3RkLmg+OyBjcmVhdGUgYQotCXJ1ZGltZW50YXJ5IG9uZSBpZiBuZWNlc3NhcnkuCi0KLVR1ZSBGZWIgIDcgMTM6MzQ6NDYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBwb3dlcnBjLSotZWFiaSBzdXBwb3J0LCB3aGljaCBpcyB0aGUgc2FtZSBhcwotCXBvd2VycGMtKi1lbGYuCi0JKGNvbmZpZ3VyZSk6IFJlYnVpbGQgd2l0aCBhdXRvY29uZi4KLQotTW9uIEZlYiAgNiAwMzozNzowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyBmcm9tIEJyeWFuIEZvcmQgPGJhZm9yZEBzY2hpcmYuY3MudXRhaC5lZHU+IGZvciBpMzg2Ci0JMTYtYml0IGFuZCBtc2RvcyBzdXBwb3J0OgotCSogY29uZmlnL3RjLWkzODYuYyAoZmxhZ18xNmJpdF9jb2RlKTogTmV3IHZhcmlhYmxlLgotCShzZXRfMTZiaXRfY29kZV9mbGFnKTogTmV3IGZ1bmN0aW9uLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGRlZCBlbnRyaWVzICJjb2RlMTYiIGFuZCAiY29kZTMyIi4KLQkobWRfYXNzZW1ibGUpOiBFbnN1cmUgdGhhdCBjb3JyZWN0IGRhdGEtc2l6ZSBwcmVmaXhlcyBnZXQgZW1pdHRlZCwKLQliYXNlZCBvbiB0aGUgY3VycmVudCBtb2RlLiAgRW5zdXJlIHRoYXQgMzItYml0IGFkZHJlc3Npbmcgd2lsbAotCWFsd2F5cyBiZSBkb25lLiAgTW92ZSBzZWdtZW50LXByZWZpeCBoYW5kbGluZyBjb2RlLiAgKFdoeT8pICBVc2UKLQkxNi1iaXQganVtcHMgZm9yIDE2LWJpdCBjb2RlLCAzMi1iaXQganVtcHMgZm9yIDMyLWJpdCBjb2RlLgotCSogY29uZmlnL3RjLWkzODYuaCAoTUFYX1BSRUZJWEVTKTogQnVtcCB0byA1LgotCShEYXRhMTYsIERhdGEzMik6IERlZmluZS4KLQkqIGRvYy9hcy50ZXhpbmZvIChpMzg2LTE2Yml0KTogTmV3IG5vZGUuCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1tc2RvcyopOiBOZXcgdGFyZ2V0LCB1c2luZyBhLm91dCBmb3JtYXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UaHUgRmViICAyIDE1OjIxOjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGNwdTMyX2NvbnRyb2xfcmVncyk6IE5ldyBtYWNyby4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBVc2UgaXQsIGZvciBjcHUzMiBwcm9jZXNzb3JzLgotCi0JVHVlIEphbiAzMSAxNzoyMDo0NSAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuYyAodm1zX3Rpcl9zdGFja19wc2VjdCk6ICBuZXcgcm91dGluZTsKLQkoVk1TX1NldF9EYXRhLCBWTVNfU2V0X1BzZWN0LCBWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UsCi0JVk1TX1RCVF9Sb3V0aW5lX0JlZ2luLCBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24pOiAgdXNlIGl0OwotCShWTVNfR2xvYmFsX1N5bWJvbF9TcGVjLCBWTVNfUHJvY2VkdXJlX0VudHJ5X1B0KTogIHRyZWF0Ci0JUHNlY3RfTnVtYmVyIGFzIGB1bnNpZ25lZCcuCi0KLQlUaHUgSmFuIDI2IDE3OjA2OjI4IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5jOiAgcGVyZm9ybWFuY2UgdHVuaW5nLgotCShWTVNfU3ltYm9sX3R5cGVfbGlzdCk6ICBjb252ZXJ0IGZyb20gc2luZ2xlIGxpc3QgaGVhZCB0byBzbWFsbAotCWFycmF5IG9mIGxpc3QgaGVhZHM7Ci0JKFNZTVRZUF9IQVNIKTogIG5ldyBtYWNybyBmb3IgYWNjZXNzaW5nIFZNU19TeW1ib2xfdHlwZV9saXN0W107Ci0JKGZpbmRfc3ltYm9sLCBzZXR1cF9iYXNpY190eXBlLCBWTVNfdHlwZWRlZl9wYXJzZSk6ICB1c2UgaXQ7Ci0JKFZNU19SU1lNX1BhcnNlKTogIG1vdmUgU19HRVRfVkFMVUUoKSBpbnNpZGUgc3dpdGNoIHRvIGF2b2lkCi0JY2FsbGluZyBpdCBmb3IgdW5pbnRlcmVzdGluZyBjYXNlcy4KLQotV2VkIEZlYiAgMSAyMzo1Mjo0NSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogR28gYWhlYWQgYW5kIGNhbGwKLQlocHBhX2ZpZWxkX2FkanVzdCB0byBnZXQgYSBuZXcgdmFsdWUgZm9yIFJfREFUQV9PTkVfU1lNQk9MCi0JcmVsb2NhdGlvbnMgaW4gU09NLgotCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogUmVmaW5lIHNvbWV3aGF0LgotCi1GcmkgSmFuIDI3IDIxOjI5OjUzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5oIChOT19TVFJJTkdfRVNDQVBFUyk6IERvbid0IGRlZmluZSBpZiB3ZSBhcmUKLQl1c2luZyBFTEYuCi0KLVRodSBKYW4gMjYgMTk6MDM6NDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGdldF9zcGVjaWZpYyk6IEFkZCBwYXJlbnMgYXJvdW5kIHwgaW5zaWRlICYuCi0JKHNraXBfY29sb250aGluZyk6IFNldCBMXzggaWYgIjo4IiBpcyBzcGVjaWZpZWQuCi0KLVRodSBKYW4gMjYgMTg6Mzg6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2JlZ2luKTogUGVybWl0IG1mZGVjIHRvIGJlIGR1cGxpY2F0ZWQgb24gdGhlCi0JNjAxLiAgQ2hlY2sgdGhhdCB0aGUgZXJyb3IgcmV0dXJuIGZyb20gaGFzaF9pbnNlcnQgaXMgImV4aXN0cyIuCi0KLVRodSBKYW4gMjYgMTE6MzU6MzMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQWRkIHN1cHBvcnQgZm9yIGNvbmZpZ3VyaW5nIHBvd2VycGMtKi1lYWJpLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKEdPVF9zeW1ib2wpOiBEZWZpbmUgaWYgb2JqZWN0IGZvcm1hdCBpcyBFTEYuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVmaW5lIGlmIG9iamVjdAotCWZvcm1hdCBpcyBFTEYgYW5kIG5vdCBkZWZpbmVkIHRvIGJlICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iLgotCi1XZWQgSmFuIDI1IDE2OjIzOjEzIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogdGMtc2guYyAobGl0dGxlKTogQWRkIGFyZ3VtZW50IElHTk9SRSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIHNwYWNlIGZvciBjb25zaXN0ZW50IGZvcm1hdHRpbmcuCi0JKENPTkQ4X1JBTkdFLCBDT05EMTJfUkFOR0UpOiBEZWxldGUgdW51c2VkIG1hY3Jvcy4KLQkoQ09ORDhfRiwgQ09ORDhfTSwgQ09ORDEyX0YsIENPTkQxMl9NLCBVTkNPTkQxMl9GLCBVTkNPTkQxMl9NKToKLQlDb3JyZWN0IG1pbmltdW0gYW5kIG1heGltdW0gYnJhbmNoIG9mZnNldHMuICBBZGQgY29tbWVudHMgZXhwbGFpbmluZwotCXdoeSB0aGVzZSBudW1iZXJzIGFyZSBjb3JyZWN0LgotCi1XZWQgSmFuIDI1IDE1OjMyOjA5IDE5OTUgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCBtcHdyMiBhcyBhIHN5bm9ueW0gZm9yCi0JbXB3cng7IG1wcGMzMiwgbTYwMywgYW5kIG02MDQgYXMgc3lub255bXMgZm9yIG1wcGM7IGFuZCBtcHBjNjQgYW5kCi0JbTYyMCBmb3IgUG93ZXJQQzY0IG1vZGUuCi0JKHBwY19zeW1ib2xfbmV3X2hvb2spOiBBZGQgVDAgYXMgc3lub255bSBmb3IgVEMwIHN1ZmZpeC4KLQotVHVlIEphbiAyNCAxNjo0NDoyMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdmF4LmMgKHZpcCk6IEludHJvZHVjZSBuZXcgcHRyLXRvLWNvbnN0IGxvY2FsIHZhcmlhYmxlCi0JZm9yIHNjYW5uaW5nIG9wZXJhbmQgc3RyaW5nLgotCi0JU2F0IEphbiAyMSAxNzo1MDozOCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL3ZheC1pbnN0LmggKHN0cnVjdCB2b3AsIGZpZWxkcyBgdm9wX3dhcm4nLCBgdm9wX2Vycm9yJyk6Ci0JbWFrZSB0aGVtIHBvaW50ZXJzIHRvIGNvbnN0IGNoYXI7Ci0JKHN0cnVjdCB2aXQsIGZpZWxkIGB2aXRfZXJyb3InKTogIGRpdHRvLgotCSogY29uZmlnL2F0b2YtdmF4LmMgKG1kX2F0b2YpOiAgcmVuYW1lIGxvY2FsIGBsaXR0bGVudW1fcG9pbnRlcicKLQl0byBgbGl0dGxlbnVtUCcgdG8gYXZvaWQgc2hhZG93aW5nIGZpbGUgc2NvcGUgdmFyaWFibGUuCi0JKiBjb25maWcvdGMtdmF4LmMgKHZpcF9iZWdpbiwgdmlwX29wX2RlZmF1bHRzLCB2aXBfb3BfMSk6ICBtYWtlCi0Jc3RyaW5nIGFyZ3VtZW50cyBiZSBwb2ludGVycyB0byBjb25zdCBjaGFyOwotCSh2aXApOiAgbWFrZSBgYWxsb3BlcnInIGNvbnN0IGNoYXIgKjsKLQkodmlwX29wKTogbWFrZSBgZXJyJyBhbmQgYHdybicgY29uc3QgY2hhciAqOyByZW5hbWUgYGFjY2VzcycgdG8KLQlgYWNjZXNzX21vZGUnIHRvIGF2b2lkIHNoYWRvd2luZyBsaWJyYXJ5IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai12bXMuYyAoYHN5bWJvbF9uYW1lJyk6ICBtYWtlIGl0IGNvbnN0IGNoYXIgKjsKLQkoZ2V0X3N0cnVjdF9uYW1lKTogIGNhc3Qgb25lIHVzZSBvZiBgc3ltYm9sX25hbWUnIHRvIGNoYXIgKgotCVtjYWxsZXIgZ3VhcmFudGVlcyB0aGF0IGl0IHdvbid0IG1vZGlmeSB0aGUgcG9pbnRlcidzIHRhcmdldF07Ci0JKFBVVF9DT1VOVEVEX1NUUklORyk6ICB1c2UgcG9pbnRlciB0byBjb25zdCBjaGFyOwotCShWTVNfdHlwZWRlZl9wYXJzZSk6ICBtYWtlIGBwbnQyJyBjb25zdCBjaGFyICo7Ci0JKFdyaXRlX1ZNU19NSERfUmVjb3Jkcyk6ICBtYWtlIGBjcCcgY29uc3QgY2hhciAqOwotCShWTVNfTW9kaWZ5X1BzZWN0X0F0dHJpYnV0ZXMsIGFycmF5IGBBdHRyaWJ1dGVzJyk6ICBtYWtlIGNvbnN0LAotCWFuZCBtYWtlIGZpZWxkIGBOYW1lJyBwb2ludGVyIHRvIGNvbnN0IGNoYXI7Ci0KLQkqIGFzLmggKGBzZWdfbmFtZVtdJyBkZWNsYXJhdGlvbik6ICBwb2ludGVycyB0byBjb25zdCBjaGFyOwotCShzdHJ1Y3QgX3BzZXVkb190eXBlLCBmaWVsZCBgcG9jX25hbWUnKTogIHBvaW50ZXIgdG8gY29uc3QgY2hhci4KLQkqIHN1YnNlZ3MuYyAoYHNlZ19uYW1lW10nIGRlZmluaXRpb24pOiAgZGl0dG87Ci0JKiBoYXNoLmMgKGhhc2hfYXNrKTogIHJlbmFtZSBhcmd1bWVudCBgYWNjZXNzJyB0byBgYWNjZXNzX3R5cGUnCi0JdG8gYXZvaWQgc2hhZG93aW5nIGxpYnJhcnkgZnVuY3Rpb24uCi0JKiB3cml0ZS5jICh2YXJpYWJsZSBgdGhlX29iamVjdF9maWxlJyk6ICBtb3ZlIGZyb20gZmlsZSBzY29wZQotCXRvIGJsb2NrIHNjb3BlIHdpdGhpbiB3cml0ZV9vYmplY3RfZmlsZSgpOyBmcmVlIGl0IGFmdGVyIHVzZTsKLQkoZml4dXBfc2VnbWVudCk6ICBjb25kaXRpb25hbGx5IGV4Y2x1ZGUgaXQgZm9yIE9CSl9WTVMuCi0JKGN2dF9mcmFnX3RvX2ZpbGwpOiAgcmVuYW1lIGFyZ3VtZW50IGBoZWFkZXJzJyB0byBgaGVhZGVyc1AnCi0JdG8gYXZvaWQgc2hhZG93aW5nIGZpbGUgc2NvcGUgdmFyaWFibGUuCi0KLU1vbiBKYW4gMjMgMjE6NDI6MzkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICdEJyk6IEZpeCB0eXBvIHdoaWNoIGNhdXNlZAotCW1pc2NvbXBpbGF0aW9uIG9mICJkaWFnIiBpbnN0cnVjdGlvbnMuCi0KLU1vbiBKYW4gMjMgMTU6NTE6NDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQotTW9uIEphbiAyMyAxNDowNzo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5oICh0Y19pbml0X2FmdGVyX2FyZ3MpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtc2guYyAobWRfYmVnaW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHRhYmxlLgotCShtZF9hc3NlbWJsZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgcC4KLQkobWRfY29udmVydF9mcmFnKTogQ2FzdCBmcl9hZGRyZXNzIHRvIHVuc2lnbmVkIGxvbmcgZm9yIHByaW50Zi4KLQkobWRfYXBwbHlfZml4KTogVXNlIGFzX3dhcm5fd2hlcmUgcmF0aGVyIHRoYW4gYXNfd2Fybi4KLQkoc2hfaW5pdF9hZnRlcl9hcmdzKTogUmVtb3ZlIGVtcHR5IGZ1bmN0aW9uLgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1nbnUqZWxmKik6IE5ldyB0YXJnZXQuCi0KLVNhdCBKYW4gMjEgMTk6MDI6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tPgotCi0JKiBoYXNoLmMgKGhhc2hfYXNrKTogSWYgd2UgZmluZCB0aGUgc2xvdCBhZnRlciB3cmFwcGluZyBhcm91bmQsCi0JYnJlYWsgb3V0IG9mIHRoZSBsb29wLiAgRml4ZXMgYnVnIGluIEphbiAxOCBjaGFuZ2UuCi0KLUZyaSBKYW4gMjAgMTc6MDc6MzEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogaGFzaC5jIChoYXNoX2NvZGUpOiBVbmRvIGxhc3QgY2hhbmdlLgotCi1UaHUgSmFuIDE5IDE0OjQ5OjQ3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCk6IEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzIHRvIGtlZXAKLQlnY2MgcXVpZXQuCi0JKGdwZGlzcF9oaTE2X2hvd3RvKTogRG9uJ3QgdXNlICJjb25zdCIgd2l0aCByZWxvY19ob3d0b190eXBlLgotCShpbl9yYW5nZV9zaWduZWQpOiBBZGQgcGFyZW5zIGFyb3VuZCBzdWJ0cmFjdGlvbiBpbnNpZGUgc2hpZnQuCi0JKiBnYXNwLmMgKGRvX2RhdGEpOiBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlICJvcG5hbWUiLgotCShpc3RydWUpOiBQcm92aWRlIGEgZGVmYXVsdCBjYXNlIHRvIHNldCAicmVzIiBhbmQga2VlcCAiZ2NjIC1XYWxsIgotCXF1aWV0LgotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBEZWxldGVkIHVudXNlZCB2YXJpYWJsZS4KLQkocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBEZWNsYXJlLgotCSogaGFzaC5jIChoYXNoX2Fzayk6IERlbGV0ZSBkaXNhYmxlZCBub24tc3RyY21wIHZlcnNpb24gb2YgdGhlCi0JY29kZSwgYW5kIGF1dG9tYXRpYyB2YXJpYWJsZXMgdXNlZCBvbmx5IGluIHRob3NlIHNlY3Rpb25zLgotCSogd3JpdGUuYyAoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSk6IE9ubHkgZGVmaW5lIGxvY2FsIHZhcmlhYmxlCi0JInByZXZfZml4IiBpZiBCRkRfQVNTRU1CTEVSLgotCSogZmxvbnVtLWtvbnN0LmMgKGR1bW15MSk6IFJldHVybiB2b2lkLgotCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IFJlbW92ZSB0d28gY29tcGFyaXNvbnMgb2YKLQl1bnNpZ25lZCBudW1iZXJzIHZlcnN1cyB6ZXJvLgotCSogYXMuaCAoYmNvcHkpOiBJZiBuZWl0aGVyIG1lbWNweSBub3IgYmNvcHkgaXMgZGVmaW5lZCBhcyBhIG1hY3JvLAotCWRlZmluZSB0byB1c2UgbWVtY3B5LgotCi0JKiBjb25maWcvdGMtYWxwaGEuYywgY29uZmlnL2FscGhhLW9wY29kZS5oOiBSZXZlcnQgMiBKdW5lIGNoYW5nZXMuCi0JVHVybnMgb3V0IHdlIG5ldmVyIGdvdCB0aGUgYXNzaWdubWVudCBkb25lIGFmdGVyIGFsbC4KLQotCUNsZWFudXAgb2YgVkFYIGFuZCBWTVMgY29kZSwgZnJvbSBQYXQgUmFua2luOgotCSogY29uZmlnL29iai12bXMuYzogQ2hhbmdlZCBleHBvcnRlZCBmdW5jdGlvbiBuYW1lcyB0byBsb3dlciBjYXNlLgotCShDaGFuZ2VkIGNhbGwgc2l0ZXMgaW4gd3JpdGUuYy4pICBEZWNsYXJlIFZNUyBzeXN0ZW0gZnVuY3Rpb24KLQluYW1lcyB1c2VkLCBjb25kaXRpb25hbCBvbiBhY3R1YWxseSBiZWluZyBvbiBWTVMuICBDaGFuZ2VkIG1hbnkKLQlmdW5jdGlvbnMgdGhhdCByZXR1cm5lZCBubyB1c2VmdWwgdmFsdWUgdG8gbm93IGJlIGRlY2xhcmVkIHRvCi0JcmV0dXJuIHZvaWQuICBSZW1vdmVkIG1hbnkgdW51c2VkIHZhcmlhYmxlcy4gIFN1cHBseSBtaXNzaW5nCi0JcmV0dXJuIHN0YXRlbWVudHMgb3IgdmFsdWVzLiAgU3VwcGx5IGBkZWZhdWx0JyBjYXNlIGluIHN3aXRjaAotCXN0YXRlbWVudHMuICBFbnN1cmUgbG9jYWwgdmFyaWFibGVzIGdldCBpbml0aWFsaXplZC4KLQkqIGNvbmZpZy90Yy12YXguYzogTWlub3IgY2hhbmdlcyB0byBzaWxlbmNlICJnY2MgLVdhbGwiLgotCSogY29uZmlnL29iai12bXMuaCwgY29uZmlnL3RjLXZheC5oOiBBZGRlZCBzb21lIG1pc3NpbmcKLQlkZWNsYXJhdGlvbnMuCi0KLVdlZCBKYW4gMTggMTM6NDk6MjYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXRvZi1nZW5lcmljLmMgKGZsb251bV9wcmludCkgW1RSQUNFXTogTmV3IGZ1bmN0aW9uLgotCShhdG9mX2dlbmVyaWMpIFtUUkFDRV06IFByaW50IG11bHRpcGxpZXIgYmVmb3JlIG11bHRpcGxpY2F0aW9uLAotCWFuZCBwcmludCBtdWx0aXBsaWNhdGlvbiByZXN1bHQgYmVmb3JlIGFuZCBhZnRlciBjb3B5LgotCi0JKiBmbG9udW0tbXVsdC5jIChmbG9udW1fbXVsdGlwKTogQXZvaWQgc2lnbiBleHRlbnNpb24gcHJvYmxlbXMKLQlhcm91bmQgbXVsdGlwbGljYXRpb24gb3BlcmF0aW9uLgotCi0JKiBhdG9mLWdlbmVyaWMuYyAoQVNTVU1FX0RFQ0lNQUxfTUFSS19JU19ET1QpOiBEZWZpbmUuCi0JKGF0b2ZfZ2VuZXJpYykgW0FTU1VNRV9ERUNJTUFMX01BUktfSVNfRE9UXTogQ2hlY2sgZm9yICcuJwotCWV4cGxpY2l0bHkgaW5zdGVhZCBvZiBjYWxsaW5nIHN0cmNoci4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogV2hlbiBzY2FubmluZyBzdWNjZXNzaXZlIG9wY29kZQotCXRhYmxlIGVudHJpZXMsIGNoZWNrIG5hbWVzIGZvciBwb2ludGVyIGVxdWFsaXR5IGJlZm9yZSBkb2luZwotCXN0cmluZyBjb21wYXJpc29ucy4KLQotCSogaGFzaC5jIChoYXNoX2Fzayk6IENhbGwgc3RyY21wIGluc3RlYWQgb2YgZXhwYW5kaW5nIGl0IGlubGluZS4KLQkoaGFzaF9jb2RlKTogUmVwbGFjZWQgd2l0aCBhIHZlcnNpb24gZnJvbSBiZmQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIENPRkZfRkxBR1MgaXNuJ3QKLQlkZWZpbmVkLCBkZWZhdWx0IGl0IHRvIHplcm8uCi0KLVdlZCBKYW4gMTggMTI6MTY6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogQ2xlYXIgZnhfYnNyIG9uIHRob3NlIHRhcmdldHMgd2hpY2gKLQl1c2UgaXQuCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IFBhcmVudGhlc2l6ZSAmJiB3aXRoaW4gfHwuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IExpa2V3aXNlLgotCShsaXN0X3N5bWJvbF90YWJsZSk6IFVzZSAlbHUgdG8gcHJpbnQgc2l6ZW9mLgotCSogc3ltYm9scy5jOiBDb21tZW50IG91dCB1bnVzZWQgZnVuY3Rpb24gaW5kZW50LgotCShwcmludF9zeW1ib2xfdmFsdWVfMSk6IENhc3QgcG9pbnRlciB0byB1bnNpZ25lZCBsb25nIGZvciBwcmludGYuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IE9ubHkgZGVjbGFyZSBzeW1ib2xfcHRyIGlmIGl0Ci0Jd2lsbCBiZSB1c2VkLgotCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX2JlZ2luKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSByZWcuCi0JKGdldF9vcGVyYW5kKTogRGVjbGFyZSB0eXBlIG9mIHBhcmFtZXRlciBkaXJlY3Rpb24uICBSZW1vdmUgdW51c2VkCi0JdmFyaWFibGUgc2l6ZS4KLQkoZ2V0X3NwZWNpZmljKTogRml4IGNvbW1lbnQgdG8gYXZvaWQgbmVzdGVkIGNvbW1lbnRzLgotCShjaGVja19vcGVyYW5kKTogQ2FzdCBYX2FkZF9udW1iZXIgdG8gdW5zaWduZWQgbG9uZyBmb3IgcHJpbnRmLgotCShidWlsZF9ieXRlcyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzIG91dHB1dF9wdHIsIHBhcnQsIGFuZAotCWhpZ2guCi0JKGJ1aWxkX2J5dGVzKTogQ2FzdCBYX2FkZF9udW1iZXIgdG8gdW5zaWduZWQgbG9uZyBmb3IgcHJpbnRmLgotCShjbGV2ZXJfbWVzc2FnZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgc2Nhbi4KLQkobWRfYXNzZW1ibGUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGkuCi0JKHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uLgotCSogdGMtaDgzMDAuaCAodGNfcmVsb2NfbWFuZ2xlKTogRGVjbGFyZS4KLQotVHVlIEphbiAxNyAxMDo1ODowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfNDY1MCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2JlZ2luKTogSGFuZGxlIGEgY3B1IHN0cmluZyBvZiAiNDY1MCIuICBJZiBtaXBzXzQ2NTAgd2FzIG5vdAotCWluaXRpYWxpemVkLCBzZXQgaXQgdG8gMC4KLQkoYXBwZW5kX2luc24pOiBEb24ndCBpbnNlcnQgbm9wcyBhcm91bmQgSEkgYW5kIExPIG9uIGEgNDY1MC4KLQkobWlwc19lbWl0X2RlbGF5cyk6IExpa2V3aXNlLgotCShtaXBzX2lwKTogVXNlIElOU05fSVNBIG1hc2sgdG8gY2hlY2sgSVNBIG9mIGluc3RydWN0aW9uLiAgQ2hlY2sKLQlmb3IgSU5TTl80NjUwLgotCShtZF9sb25nb3B0cyk6IEFkZCBtNDY1MCBhbmQgbm8tbTQ2NTAuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBtaXBzLWNwdT00NjUwLiAgSGFuZGxlIC1tNDY1MCBhbmQKLQktbm8tbTQ2NTAuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgbmV3IE1JUFMgb3B0aW9ucy4KLQotU2F0IEphbiAxNCAyMzo0ODoxMyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bqb25ueT4KLQotCSogY29uZmlnL3RjLXc2NS5jLCBjb25maWcvdGMtdzY1LmgsIGNvbmZpZy93NjUubXQ6IE5ld2ZpbGVzLgotCSogY29uZmlnL29iai1jb2ZmLmg6IENvcGUgd2l0aCB3NjUuCi0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIHc2NS4KLQotVGh1IEphbiAxMiAxNzo1NjoyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKSBbX19HTlVDX18gJiYgX19PUFRJTUlaRV9fXTogSWYgYGdldCcKLQlmdW5jdGlvbiBpcyBzY3J1Yl9mcm9tX2ZpbGUsIGNhbGwgc2NydWJfZnJvbV9maWxlIGRpcmVjdGx5LCBhbmQKLQlnZXQgZ2NjJ3MgaW5saW5pbmcgY2FwYWJpbGl0eSBpbnRvIHRoZSBhY3QuCi0KLQkqIE1ha2VmaWxlLmluIChWTVNfT1RIRVJfT0JKUyk6IEFkZCAuLi9saWJpYmVydHkvaGV4Lm8uCi0JKE9CSlMpOiBEZWxldGUgaGV4LXZhbHVlLm8uCi0JKFJFQUxfU09VUkNFUyk6IERlbGV0ZSBoZXgtdmFsdWUuYy4KLQkoaGV4LXZhbHVlLm8pOiBEZWxldGUgZGVwZW5kZW5jaWVzLgotCSogaGV4LXZhbHVlLmM6IERlbGV0ZWQuCi0JKiBhcy5jIChtYWluKTogQ2FsbCBoZXhfaW5pdC4KLQkqIGV4cHIuYywgY29uZmlnL3RjLW1pcHMuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4gIFJlcGxhY2UKLQloZXhfdmFsdWUgYXJyYXkgcmVmZXJlbmNlcyB3aXRoIGhleF8qIG1hY3Jvcy4KLQotV2VkIEphbiAxMSAxNzo1MTozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoQ09GRl9GTEFHUyk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy1oODUwMC5oIChDT0ZGX0ZMQUdTKSwgY29uZmlnL3RjLXNoLmggKENPRkZfRkxBR1MpLAotCWNvbmZpZy90Yy16OGsuaCAoQ09GRl9GTEFHUyk6IERpdHRvLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoS0VFUF9SRUxPQ19JTkZPKTogTWFrZSBzdXJlIGl0J3MgYWx3YXlzCi0JZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCwgY2FzZXMgQU9GRiBhbmQgQUlOREVYKTogRG9uJ3QKLQlnZW5lcmF0ZSA2ODAyMCBhZGRyZXNzaW5nIG1vZGVzIGZvciBhIDY4MDAwIHByb2Nlc3Nvci4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIGNhc2VzIFBDUkVMIGFuZCBQQ0xFQSk6IERpdHRvLgotCi1UdWUgSmFuIDEwIDEzOjM0OjE0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IHRyZWF0IGg4MzAwIGFuZCB6OGsKLQlzcGVjaWFsbHkgd2l0aCByZWdhcmQgdG8gZml4dXBzLgotCi1Nb24gSmFuICA5IDE2OjIyOjI4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKFJFTEFYX1JFTE9DMSwgUkVMQVhfUkVMT0MyKTogQ2FzdCB2YWx1ZXMgdG8KLQliZmRfdm1hIGJlZm9yZSBzdWJ0cmFjdGluZy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHNpemVfc2VjdGlvbik6IEhhbmRsZSByc19zcGFjZSBsaWtlIHJzX2ZpbGwsCi0JYnV0IG1ha2Ugc3VyZSBmcl9zeW1ib2wgaXMgbnVsbC4KLQkoZmlsbF9zZWN0aW9uKTogRGl0dG8uCi0KLVN1biBKYW4gIDggMTY6MTQ6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRml4IGhhbmRsaW5nIG9mIGZsb2F0aW5nIHBvaW50Ci0JdmFsdWVzIHdoZW4gR1BPUFQgaXMgbm90IGRlZmluZWQuCi0KLUZyaSBKYW4gIDYgMTY6NTk6NDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jOiBJbmNsdWRlIHN0cmluZy5oLiAgUHV0IGNvbmZpZy5oIGJlZm9yZSBvdGhlciBpbmNsdWRlcy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwKTogRGVsYXkgY2FsbHMgdG8gZW1pdF9hZGQ2NCB1bnRpbAotCWFmdGVyIGFueSByZW1haW5pbmcgb3BlcmFuZHMgYXJlIGFsc28ga25vd24gdG8gbWF0Y2guCi0KLUZyaSBEZWMgMzAgMTg6MjE6NDEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IEJ1aWxkIGEgZm9ybWF0IHN0cmluZyBiYXNlZCBvbgotCXRoZSBzaXplIG9mIHRoZSB2YWx1ZSB0byBiZSBwcmludGVkLCBhcyBsb25nIGFzICJ1bnNpZ25lZCBsb25nIiBpcwotCWF0IGxlYXN0IGFzIHdpZGUsIGFmdGVyIGhhbmRsaW5nIHRoZSBzcGVjaWFsIGNhc2Ugb2YgNC1ieXRlCi0JdmFsdWVzLgotCi0JKiBNYWtlZmlsZS5pbiAoZGVwZW5kZW5jaWVzKTogTWFrZSAkKE9CSlMpIGRlcGVuZCBvbiBhcy5oIGFuZAotCWV2ZXJ5dGhpbmcgaXQgaW5jbHVkZXMuICBEZWxldGUgdGhvc2UgZmlsZXMgZnJvbSBwZXItZmlsZQotCWRlcGVuZGVuY2llcy4KLQotCSogYXMuaCAocmVsYXhfc3Vic3RhdGVUKTogTm93IGRlZmluZWQgdG8gYmUgdW5zaWduZWQgaW50LgotCShyZWxheF9zdGF0ZVQpOiBTZXBhcmF0ZSB0eXBlZGVmIGZyb20gZW51bSBkZWZpbml0aW9uLgotCShlbnVtIF9yZWxheF9zdGF0ZSk6IFJlb3JkZXJlZCBmb3IgYmV0dGVyIHB1bmN0dWF0aW9uLiAgQWRkZWQgbmV3Ci0JdmFsdWVzIHJzX2FsaWduX2NvZGUgYW5kIHJzX3NwYWNlLgotCShsaW5lbm8sIHN0cnVjdCBsaW5lbm9fc3RydWN0KTogVW51c2VkLCBkZWxldGVkLgotCi0JKiBhcy5oOiBObyBsb25nZXIgaW5jbHVkZSBhc3NlcnQuaC4KLQkoYXNfYXNzZXJ0KTogRGVjbGFyZS4KLQkoYXNzZXJ0KTogTmV3IGRlZmluaXRpb24sIGNhbGxzIGFzX2Fzc2VydCBsb25nZXIgbmVlZGVkLgotCShfX1BSRVRUWV9GVU5DVElPTl9fKTogUHJvdmlkZSBkZWZhdWx0IGZvciBvbGRlciB2ZXJzaW9ucyBvZiBnY2MuCi0JKiBtZXNzYWdlcy5jIChhc19hc3NlcnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBnZGJpbml0LmluOiBQdXQgYSBicmVha3BvaW50IHRoZXJlLgotCi0JKiByZWFkLmMgKHNfc3BhY2UpOiBSZXdyaXRlIHRvIGhhbmRsZSBnZW5lcmFsIGV4cHJlc3Npb25zLgotCUdlbmVyYXRlIHJzX3NwYWNlIGZyYWdzIGZvciBub24tY29uc3RhbnQgdmFsdWVzLgotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IFRyZWF0IHJzX2FsaWduX2NvZGUgYW5kIHJzX3NwYWNlCi0JbGlrZSByc19hbGlnbiBhbmQgcnNfb3JnLiAgVmVyaWZ5IHRoYXQgZnJfb2Zmc2V0IGlzIG5vbi1uZWdhdGl2ZSwKLQlhbmQgZm9yY2UgZnJhZyB0eXBlIHRvIHJzX2ZpbGwgb25seSBhZnRlciBhc3NlcnRpb24gY2hlY2tzLgotCShyZWxheF9zZWdtZW50KTogVHJlYXQgcnNfYWxpZ25fY29kZSBsaWtlIHJzX2FsaWduLiAgVHJlYXQKLQlyc19zcGFjZSBsaWtlIHJzX29yZyBpbiB0aGUgZmlyc3Qgc3dpdGNoOyBpbiB0aGUgc2Vjb25kLCBmb3JjZSB0aGUKLQlvcGVyYW5kIHRvIGEgY29uc3RhbnQsIGFuZCB1c2UgaXQgZm9yIHRoZSBncm93dGggc2l6ZS4KLQotV2VkIERlYyAyOCAyMDo1NzozNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3Vic3BhY2UpOiBGb3Igc2VjdGlvbnMgd2l0aCB0aGUgWkVSTwotCWF0dHJpYnV0ZSwgc2V0IHRoZSAiYnNzIiBmaWVsZCBpbiB0aGUgYXBwcm9wcmlhdGUgc2VnaW5mbyBzdHJ1Y3R1cmUuCi0KLVdlZCBEZWMgMjggMTU6MDE6MDEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5oOiBJbmNsdWRlIG9ic3RhY2suaC4KLQotVHVlIERlYyAyNyAxODoxNjowNCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IEVuYWJsZSBhbGlnbiogY29tcG9uZW50cyBub3cuCi0KLVR1ZSBEZWMgMjAgMTQ6NTY6MzEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZnJhZ3MuYyAoZnJhZ19pbml0KTogQ2FsbCBvYnN0YWNrX2JlZ2luIG9uIGBmcmFncycuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ3NfYmVnaW4pOiBEb24ndCBkbyBpdCBoZXJlLgotCSogYXMuYyAobWFpbik6IENhbGwgZnJhZ19pbml0IGJlZm9yZSBzdWJzZWdzX2JlZ2luLgotCi0JKiBmcmFncy5jIChmcmFnX2FwcGVuZF8xX2NoYXIpOiBOZXcgZnVuY3Rpb24uCi0JKiBmcmFncy5oIChmcmFnX2FwcGVuZF8xX2NoYXIpOiBEZWNsYXJlIGl0LgotCShGUkFHX0FQUEVORF8xX0NIQVIpOiBDYWxsIGl0LiAgT2xkIGRlZmluaXRpb24gaXMgY29tbWVudGVkIG91dAotCWZvciBub3cuCi0KLQkqIGFzLmggKHN0cnVjdCBmcmFnKTogQWRkZWQgKGJ1dCBjb21tZW50ZWQgb3V0KSBuZXcgZmllbGRzIGZvcgotCXRyYWNraW5nIGN1cnJlbnQgYWxpZ25tZW50LgotCShmcmFnX25vd19maXgpOiBDaGFuZ2VkIG1hY3JvIHRvIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgotCSogZnJhZ3MuYyAoZnJhZ19ub3dfZml4KTogRGVmaW5lIGZ1bmN0aW9uIGhlcmUuCi0JKGZyYWdfbmV3KTogVXNlIGl0IGluc3RlYWQgb2YgYWNjZXNzaW5nIGBmcmFncycgZGlyZWN0bHkuCi0JKiBmcmFncy5oIChmcmFncyk6IENoYW5nZSBjb21tZW50IHRvIGluZGljYXRlIGl0IHNob3VsZG4ndCBiZQotCWFjY2Vzc2VkIGRpcmVjdGx5LgotCSogc3Vic2Vncy5oIChzdHJ1Y3QgZnJjaGFpbik6IE5ldyBmaWVsZCBmcmNoX29ic3RhY2ssIGludGVuZGVkIHRvCi0JZXZlbnR1YWxseSByZXBsYWNlIGdsb2JhbCBgZnJhZ3MnIG9ic3RhY2suCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IFVzZSBmcmFnX25vd19maXggaW5zdGVhZCBvZgotCWFjY2Vzc2luZyBgZnJhZ3MnIGRpcmVjdGx5LiAgSW5pdGlhbGl6ZSBmaWVsZHMgb2YgbmV3IGZyY2hhaW5TCi0JZXhwbGljaXRseSBpbnN0ZWFkIG9mIHdpdGggbWVtc2V0LgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2xuKSBbIUJGRF9BU1NFTUJMRVJdOiBVc2UKLQlmcmFnX25vd19maXguCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX2xvYyksIGNvbmZpZy9vYmotdm1zLmMKLQkodm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKSwgc3ltYm9scy5jIChjb2xvbik6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IFVzZSBvZmZzZXRUIGFuZCBhZGRyZXNzVAotCWluc3RlYWQgb2YgbG9uZyBhbmQgdW5zaWduZWQgbG9uZy4KLQkobWRfYXBwbHlfZml4KTogQ2FzdCB2YWx1ZSBiZWZvcmUgcGFzc2luZyBpdC4KLQotCSogY29uZmlnL29iai1hb3V0LmgsIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWVsZi5oLAotCWNvbmZpZy9vYmotc29tLmgsIGNvbmZpZy90Yy1oODUwMC5jLCBjb25maWcvdGMtaHBwYS5jLAotCWNvbmZpZy90Yy1ocHBhLmgsIGNvbmZpZy90Yy1zaC5jLCBjb25maWcvdGMtejhrLmM6IERvbid0IHJlbHkgb24KLQl1c2Ugb2YgIi4uIiB3aGVuIGluY2x1ZGluZyBoZWFkZXIgZmlsZXMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogUmVmb3JtYXQgY29uZGl0aW9uIGluIGFuIGBpZicKLQlzdGF0ZW1lbnQuCi0KLQkqIE1ha2VmaWxlLmluIChTVUJESVJfSU5DTFVERVMpOiBEZWxldGVkLgotCi1UdWUgRGVjIDIwIDEzOjQwOjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmg6IEluY2x1ZGUgYmZkL2xpYmNvZmYuaCwgbm90IGxpYmNvZmYuaC4KLQotTW9uIERlYyAxOSAxNjo1MzozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBSZXdyaXRlIHRvIGhhbmRsZSBPX2JpZyA2NCBiaXQKLQljb25zdGFudHMuCi0JKG1pcHNfaXApOiBBY2NlcHQgT19iaWcgY29uc3RhbnRzIGluIGNhc2UgJ0knLiAgQ2hhbmdlIGNhc2UKLQknaScvJ2onIHRvIHRyZWF0IGFuIE9fYmlnIGNvbnN0YW50IGFzIGFuIG91dCBvZiByYW5nZSB2YWx1ZS4KLQotTW9uIERlYyAxOSAxNDoxNTowNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3Vic3BhY2UpOiBNYWtlIHN1cmUgU0VDX0hBU19DT05URU5UUyBpcwotCWNsZWFyIGZvciBhIHNlY3Rpb24gd2l0aCB0aGUgIlpFUk8iIGF0dHJpYnV0ZS4KLQotCSogUmVkdWNlIHVzZWxlc3Mgc3ltYm9scyBmb3IgRUxGIGluIGFuIGF0dGVtcHQgdG8gbWFrZSBzbWFsbGVyCi0Jb2JqZWN0cyBhbmQgc3BlZWQgdXAgdGhlIGxpbmtlci4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHN0cnVjdCBjYWxsX2luZm8pOiBSZXBsYWNlIGVuZF9zeW1ib2wgZmllbGQKLQl3aXRoIGEgc2l6ZSBmaWVsZC4KLQkoaHBwYV9lbGZfbWFya19lbmRfZnVuY3Rpb24pOiBEZWxldGUgdW5uZWVkZWQgZnVuY3Rpb24uCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IEZvciB0aGUgMm5kIHVud2luZCByZWxvY2F0aW9uLCB1c2UKLQl0aGUgZnVuY3Rpb24gc3ltYm9sICsgZnVuY3Rpb24gc2l6ZSBpbnN0ZWFkIG9mIGEgc3BlY2lhbCBzeW1ib2wKLQlmb3IgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCi0JKHByb2Nlc3NfZXhpdCk6IENvbXB1dGUgdGhlIGZ1bmN0aW9uIHNpemUgaGVyZS4gIERvbid0IGNhbGwKLQlocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbiBhbnltb3JlLgotCShwYV9wcm9jZW5kKTogTGlrZXdpc2UuCi0JKGhwcGFfZml4X2FkanVzdGFibGUpOiBPbmx5IHJlamVjdCAzMmJpdCByZWxvY2F0aW9ucyBmb3IgU09NLgotCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogU2ltcGxpZnkuCi0KLU1vbiBEZWMgMTkgMTM6NDk6MDcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbWlwcy1zb255LWJzZCBhbmQgbWlwcy1kZWMtYnNkLCBidXQKLQlyZWplY3Qgb3RoZXIgdmVuZG9ycyB1bnRpbCB3ZSBjYW4gYmUgc3VyZSB3ZSdyZSBjb25zaXN0ZW50IHdpdGgKLQliZmQuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKENyZWF0ZV9WTVNfT2JqZWN0X0ZpbGUpOiBJbnN0ZWFkIG9mIGZvcm1hdHRpbmcKLQlhIGJ1ZmZlciB0byBwYXNzIHRvIGBlcnJvcicsIGp1c3QgY2FsbCBgYXNfZmF0YWwnIGRpcmVjdGx5LgotCShWTVNfUHNlY3RfU3BlYyk6IERpdHRvLgotCShWTVNfVEJUX01vZHVsZV9CZWdpbiwgVk1TX1RCVF9Tb3VyY2VfRmlsZSwgZ2VuMSwKLQlWTVNfdHlwZWRlZl9wYXJzZSwgVk1TX0xTWU1fUGFyc2UsIFZNU19FbWl0X0dsb2JhbHZhbHVlcyk6IENhbGwKLQlhc190c2t0c2sgaW5zdGVhZCBvZiBwcmludGYuCi0JKFZNU19UQlRfTW9kdWxlX0JlZ2luLCBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24sCi0JVk1TX1RCVF9Tb3VyY2VfRmlsZSwgVk1TX1RCVF9Tb3VyY2VfTGluZXMsCi0JVk1TX1N0b3JlX1JlcGVhdGVkX0RhdGEsIFZNU19DaGVja19Gb3JfTWFpbik6IFVzZSBleHBsaWNpdAotCWludGVnZXJzIHJhdGhlciB0aGFuIHNpemVvZiBleHByZXNzaW9ucyB1c2luZyBiYXNpYyBpbnRlZ2VyIHR5cGVzLAotCWluIGNhc2UgaG9zdCBhbmQgdGFyZ2V0IGFyZW4ndCB0aGUgc2FtZS4gIFVzZSBtZW1jcHkgb3IgQ09QWV8qCi0JbWFjcm9zIGluc3RlYWQgb2YgcG9zc2libHkgdW5hbGlnbmVkIHdvcmQgb3IgbG9uZ3dvcmQgYXNzaWdubWVudC4KLQotCSogY29uZmlnL29iai12bXMuaCAoT0JKX1NZTUZJRUxEX1RZUEUpOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UsCi0JVk1TX0NoZWNrX0Zvcl9NYWluLCBWTVNfd3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2Ugc3lfb2JqIGluc3RlYWQgb2YKLQlmb3JjaW5nIHN5X251bWJlciB0byBob2xkIGEgcG9pbnRlci4KLQotRnJpIERlYyAxNiAxNDo0MDoxNiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYmVnaW4pOiBEb24ndCBmaWxsIGluIG1kX3JlbGF4X3RhYmxlIGhlcmUuCi0JKG1kX3JlbGF4X3RhYmxlKTogVXNlIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKHBhcnNlX2V4cCwgZ2V0X29wZXJhbmRzLCBjbGV2ZXJfbWVzc2FnZSwKLQltZF9hc3NlbWJsZSwgdGNfY3Jhd2xfc3ltYm9sX2NoYWluLCBtZF91bmRlZmluZWRfc3ltYm9sLAotCXRjX2hlYWRlcnNfaG9vaywgbWRfb3BlcmFuZCwgbWRfbnVtYmVyX3RvX2NoYXJzKTogRG9uJ3QgdXNlIERFRlVOLgotCi0JKiBNYWtlZmlsZS5pbiAoQ0hFQ0tGTEFHUyk6IERvbid0IHBhc3MgQVNfRk9SX1RBUkdFVCwKLQlDQ19GT1JfVEFSR0VULCBPQkpEVU1QX0ZPUl9UQVJHRVQsIE5NX0ZPUl9UQVJHRVQ7IHRoZXkncmUgbm90Ci0JdXNlZC4KLQkoQVNfRk9SX1RBUkdFVCwgQ0NfRk9SX1RBUkdFVCwgT0JKRFVNUCwgT0JKRFVNUF9GT1JfVEFSR0VULCBOTSwKLQlOTV9GT1JfVEFSR0VUKTogRG9uJ3QgZGVmaW5lLgotCShWTVNfT1RIRVJfT0JKUyk6IEFkZCB4bWFsbG9jLm8gYW5kIHhleGl0Lm8gZnJvbSBsaWJpYmVydHkuCi0JKHRvb2xkaXIpOiBVc2UgZXhlY19wcmVmaXgsIG5vdCBsaWJkaXIuCi0KLUZyaSBEZWMgMTYgMTE6MDc6MTAgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaDogSW5jbHVkZSBsaWJjb2ZmLmgsIG5vdCAuLi9iZmQvbGliY29mZi5oLgotCi0JKiBhcy5oOiBJbmNsdWRlIHByb2dyZXNzLmguCi0JKiBhcy5jIChtYWluKTogQ2FsbCBTVEFSVF9QUk9HUkVTUyBhbmQgRU5EX1BST0dSRVNTLgotCShtYWluLCBwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBDYWxsIFBST0dSRVNTLgotCi1GcmkgRGVjIDE2IDAwOjQ2OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBVc2UgYmZkX2lzX3VuZF9zZWN0aW9uIGFuZAotCWJmZF9pc19hYnNfc2VjdGlvbiByYXRoZXIgdGhhbiBjb21wYXJpbmcgYWdhaW5zdCAmYmZkX3VuZF9zZWN0aW9uCi0JYW5kICZiZmRfYWJzX3NlY3Rpb24uCi0KLVRodSBEZWMgMTUgMTU6Mjc6MTQgMTk5NCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYmVnaW4pOiBVc2UgYSBsb2NhbCB2YXJpYWJsZSB3aGVuCi0JaW5pdGlhbGl6aW5nIG1kX3JlbGF4X3RhYmxlIHRvIGF2b2lkIGVycm9ycyBhYm91dCBtb2RpZnlpbmcgYQotCWNvbnN0IGRhdGEgc3RydWN0dXJlLgotCi1UdWUgRGVjIDEzIDE1OjQyOjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jICh0Y19nZW5fcmVsb2MpOiBSZW1vdmUgT0JKX0VMRiBoYWNrIHdoaWNoCi0JYXBwZWFycyB0byBubyBsb25nZXIgYmUgbmVlZGVkLgotCi1UdWUgRGVjIDEzIDA4OjA0OjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBBY2NlcHQgQkZEX1JFTE9DX1BDUkVMKiB3aXRob3V0Ci0JcmVxdWlyaW5nIHRoYXQgdGhlIFhfb3Bfc3ltYm9sIGJlIGluIHRoZSB0ZXh0X3NlY3Rpb24uCi0JKG1hY3JvKTogQ2hhbmdlIHRoZSB0ZXN0IGZvciBhIGxlZ2VsIGV4cHJlc3Npb24gZGlmZmVyZW5jZSB0bwotCWNvcnJlc3BvbmQgdG8gY2hhbmdlcyBpbiBwc2V1ZG9fc2V0IGluIHJlYWQuYy4KLQotRnJpIERlYyAgOSAyMTowNDoxNyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpIFtSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEVdOiBVc2UKLQliZmRfaW5zdGFsbF9yZWxvY2F0aW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUpOiBJZiB0aGVyZSBpcyBubyBjdXJyZW50Ci0Jcm91dGluZSwganVzdCByZXR1cm4uCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCwgY2FzZSAnQicsIHN1YmNhc2UgJ2MnKTogVXNlIG9wY29kZQotCXZhbHVlIGZyb20gcGF0dGVybiBpbnN0ZWFkIG9mIGFzc3VtaW5nIGpzci4KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaCAoam1wKTogQWRkIGEgIjEsQmMiIGZvcm0uCi0KLVRodSBEZWMgIDggMTc6NDg6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE5NX0ZPUl9UQVJHRVQpOiBVc2UgLi4vYmludXRpbHMvbm0ubmV3LCBub3QganVzdAotCXBsYWluIG5tLgotCi0JKiBjb25maWd1cmUuaW4gKG5zMzJrLXBjNTMyLW1hY2gqKTogU2VsZWN0IGNvcnJlY3QgZW11bGF0aW9uLgotCShtaXBzLXNvbnktYnNkKik6IFVzZSBlY29mZi4KLQkobWlwcy0qLWdudSopOiBOZXcgdGFyZ2V0LCB1c2luZyBhb3V0IGZvcm1hdCwgZnJvbSBSb2xhbmQgTWNHcmF0aC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBOb3YgMjkgMTM6NTg6MTAgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCVVzZSBsaWJpYmVydHkgdmVyc2lvbiBvZiB4bWFsbG9jOgotCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUyk6IERlbGV0ZSB4bWFsbG9jLmMuCi0JKE9CSlMpOiBEZWxldGUgeG1hbGxvYy5vLgotCSh4bWFsbG9jLm8pOiBEZWxldGUgZGVwZW5kZW5jaWVzLgotCSogYXMuYyAobWFpbik6IENhbGwgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIG9uY2UgcHJvZ3JhbSBuYW1lIGlzCi0Ja25vd24uCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChpbl9yYW5nZV9zaWduZWQsIGluX3JhbmdlX3Vuc2lnbmVkKTogTmV3Ci0Jcm91dGluZXMsIHNwbGl0IGZyb20gaW5fcmFuZ2UuCi0JKGluX3JhbmdlKTogRGVsZXRlZC4gIEFsbCBjYWxscyBjaGFuZ2VkIHRvIGluX3JhbmdlXypzaWduZWQuCi0JKGNyZWF0ZV9saXRhX3NlY3Rpb24pOiBNYWNybyBkZWxldGVkLiAgU2luZ2xlIHVzZSBleHBhbmRlZCBpbgotCXBsYWNlLgotCShhbHBoYV9pcCk6IEhhbmRsZSBgdCcgYW5kIGA4JyBvcGVyYW5kIHR5cGVzLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DXzEyX1BDUkVMLiAgUHJpbnQgbmFtZSBvZgotCXVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGVzLgotCSogY29uZmlnL2FscGhhLW9wY29kZS5oOiBBZGRlZCBIQUxUIGFuZCBEUkFJTkEuICBEaXNhYmxlZCBNT1ZJLAotCXNpbmNlIGl0IGRvZXNuJ3Qgd29yaywgYW5kIGlzbid0IHN1cHBvcnRlZCBieSB0aGUgbmF0aXZlCi0JYXNzZW1ibGVyLgotCi0JKiBpbnB1dC1zY3J1Yi5jOiBDaGFuZ2Ugd29yZGluZyBvZiBhIGNvbW1lbnQgdG8gYXZvaWQgaW50ZXJmZXJlbmNlCi0Jd2l0aCBDeWdudXMgc291cmNlLWNvbnRyb2wgdG9vbHMuCi0KLQkqIGFzLmggKGVycm5vKSBbTkVFRF9ERUNMQVJBVElPTl9FUlJOT106IERlY2xhcmUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluaXRfdGFibGUpOiBMaXN0IGJ1c2NyIGFuZCBwY3IgY29udHJvbAotCXJlZ2lzdGVycy4KLQkobTY4a19pcCwgY2FzZSAnSicpOiBIYW5kbGUgdGhlbS4KLQotCURlbGV0ZSBzaWduYWwgaGFuZGxlciBjb2RlLiAgSXQncyBiZWVuIGRpc2FibGVkIHNpbmNlIE1hcmNoIDE5OTMKLQl3aXRob3V0IGNvbXBsYWludHMuCi0JKiBhcy5jOiBEb24ndCBpbmNsdWRlIHNpZ25hbC5oLgotCShnb3Rfc2lnKTogVW51c2VkIGZ1bmN0aW9uIGRlbGV0ZWQsIGRlY2xhcmF0aW9uIGRlbGV0ZWQuCi0JKFNJR1RZKTogTWFjcm8gZGVsZXRlZC4KLQkobWFpbik6IERlbGV0ZWQgZGlzYWJsZWQgY29kZSBmb3IgZXN0YWJsaXNoaW5nIHNpZ25hbCBoYW5kbGVyLgotCi1Nb24gTm92IDI4IDExOjM3OjM1IDE5OTQgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBJbnNlcnQgbWlzc2luZyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCi0JbGlrZSB3YXJuaW5nIHNheXMgd2UgZG8uCi0KLU1vbiBOb3YgMjggMDA6MTE6MTUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHBhX2NoZWNrX2VvZik6IERlY2xhcmUgbmV3IGV4dGVybiBmdW5jdGlvbi4KLQkodGNfZnJvYl9maWxlKTogRGVmaW5lIHRvIGNhbGwgcGFfY2hlY2tfZW9mLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSk6IE5ldwotCWZ1bmN0aW9uIHRvIHZlcmlmeSB0aGUgY3VycmVudCBzcGFjZSBhbmQgc3Vic3BhY2UgYXJlIHJlYXNvbmFibGUuCi0JQ2FsbCBmb3IgdGhlIGFwcHJvcHJpYXRlIHBzZXVkby1vcHMgYW5kIGJlZm9yZSBpbnN0cnVjdGlvbiBwYXJzaW5nLgotCShwYV9jaGVja19lb2YpOiBOZXcgZnVuY3Rpb24gdG8gdmVyaWZ5IGVudGVyL2V4aXQgYW5kIHByb2MvcHJvY2VuZAotCXBhaXJzIG1hdGNoIGF0IEVPRi4KLQkocGFfY29kZSk6IFNpbXBsaWZ5LgotCi0JKiBjb25maWcvb2JqLXNvbS5jOiBEZWxldGUgI2lmIDAgY29kZS4KLQotV2VkIE5vdiAyMyAxOTozNjowOSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVEFSR0VUX0ZPUk1BVCk6IFNlbGVjdCBiZXR3ZWVuIGNvZmYtc2hsIGFuZAotCWNvZmYtc2guCi0JKiBjb25maWcvc2gubWggKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBHZXQgaXQgcmlnaHQuCi0JKiBjb25maWcvdGMtc2guYyAgKGxpdHRsZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTm90aWNlIG5ldyBvcHRpb24uCi0JKGJ1aWxkX3JlbGF4LCBidWlsZF9NeXRlcywgbWRfYXRvZiwgbWRfY29udmVydF9mcmFnLCBtZF9hcHBseV9maXgpOgotCUNvcGUgd2l0aCBsaXR0bGUgZW5kaWFuIGRhdGEuCi0JKiBjb25maWcvdGMtc2guaCAoQ09GRl9NQUdJQywgTElTVElOR19IRUFERVIpOiBFbmRpYW4gZGVwZW5kZW50LgotCi1XZWQgTm92IDIzIDEwOjU0OjM4IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MsIEVMRiB2YXJpYW50KTogUmV2ZXJ0IGxhc3QKLQljaGFuZ2UuICBUaGUgcmVhbCBidWcgd2FzIGluIGJmZC9lbGZjb2RlLmggYW5kIGhhcyBiZWVuIGZpeGVkLgotCi1UdWUgTm92IDIyIDIzOjMxOjIwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MsIEVMRiB2YXJpYW50KTogQWRkIHNlY3Rpb24tPnZtYQotCXRvIHRoZSByZWxvY2F0aW9uJ3Mgb2Zmc2V0LgotCi1UdWUgTm92IDIyIDE0OjM3OjU4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1hGT1JNKTogRml4IHR5cG8uCi0KLVR1ZSBOb3YgMjIgMTA6MjM6MjUgMTk5NCAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV9zZXQpOiBJZ25vcmUgdGhlIC5zZXQgKG5vKW1vdmUgYW5kCi0JICAuc2V0IChubyl2b2xhdGlsZSBkaXJlY3RpdmVzLgotCi1UdWUgTm92IDE1IDIxOjQ0OjEzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zdWJzcGFjZSk6IE1ha2Ugc3VyZSB0byBhbHdheXMgcmVzZXQKLQljdXJyZW50X3N1YnNwYWNlLgotCShwYV90ZXh0LCBwYV9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2FsaWduKTogTmV3IGZ1bmN0aW9uLiAgQWxpZ25zIHRoZSBjdXJyZW50Ci0Jb2Zmc2V0IHdpdGhpbiB0aGUgY3VycmVudCBzdWJzcGFjZSBhbG9uZyB3aXRoIHVwZGF0aW5nIHRoZQotCWFsaWdubWVudCBvZiB0aGUgc3Vic3BhY2UgaXRzZWxmLgotCShwYV9zdWJzcGFjZSk6IERlZmF1bHQgYWxpZ25tZW50IHRvIG9uZSBieXRlIHJhdGhlcm4gdGhhbiB6ZXJvCi0JYnl0ZXMgdG8gYXZvaWQgc2V0dGluZyBhbGlnbm1lbnQgdG8gbG9nMigwKS4KLQkobWRfcHNldWRvX3RhYmxlKTogVXNlIHBhX2FsaWdubWVudCBmb3IgLmFsaWduLgotCi1UdWUgTm92IDE1IDE1OjI0OjQ1IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG1lc3NhZ2VzLmMgKGFzX2ZhdGFsKTogQWx3YXlzIHB1dCBhIHNwYWNlIGFmdGVyICJmYXRhbCBlcnJvcjoiCi0Jd2hlbiBwcmludGluZyBtZXNzYWdlLgotCi1UdWUgTm92IDE1IDExOjEwOjQzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5oIChvYmpfZnJvYl9zeW1ib2wpOiBEZWxldGUuCi0JKHRjX2Zyb2Jfc3ltYm9sKTogTWFrZSBkZWZpbml0aW9uIGNvbmRpdGlvbmFsIG9uIE9CSl9TT00gb3IKLQlPQkpfRUxGLiAgRm9yIEVMRiBzdWJ0cmFjdCBvdXQgc3ltYm9sLT5zZWN0aW9uLT52bWEgZm9yIG5vbiBjb21tb24KLQlzeW1ib2xzLgotCi1XZWQgTm92ICA5IDE0OjUzOjAzIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90ZS1kZWx0YS5oOiBOZXcgZmlsZSwgZGVyaXZlZCBmcm9tIHRlLXN5c3YzMi5oLgotCi1XZWQgTm92ICA5IDExOjUyOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfYmYpOiBBbHdheXMgc2V0IGNvZmZfbGluZV9iYXNlLgotCi1Nb24gTm92ICA3IDAxOjU4OjQ5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB0byAyLjUuMy4KLQotCSogY29uZmlndXJlLmluOiBDb21wYXJlIGdlbmVyaWMgY3B1IG5hbWUgYWdhaW5zdCAic3BhcmMiLCBub3QKLQkic3BhcmMqIiwgc2luY2Ugc3BhcmMgdmFyaWFudHMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gInNwYXJjIi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZiAyLjEuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG9jdGFsLCB0b0hleCk6IFZhcmlhYmxlcyBkZWxldGVkLgotCShpc29jdGFsKTogTWFjcm8gZGVsZXRlZC4KLQkobWRfYmVnaW4pOiBEb24ndCBpbml0aWFsaXplIHRoZW0uCi0JKG1hY2hpbmVfaXAsIGNhc2UgJ1AnLydBJyk6IEZvciBhYnNvbHV0ZSBvcGVyYW5kLCBnZW5lcmF0ZSBhbgotCWVycm9yIG1lc3NhZ2UgaWYgaXQncyBvdXQgb2YgcmFuZ2UuCi0JKG1kX2FwcGx5X2ZpeCwgY2FzZSBSRUxPQ19KVU1QVEFSRyk6IENoZWNrIHJhbmdlIGZvciBQQy1yZWxhdGl2ZQotCWp1bXBzLgotCShtZF9hcHBseV9maXgpOiBEZWxldGUgY29kZSBpbnNpZGUgIiNpZiAwIi4KLQotVGh1IE5vdiAgMyAyMDoyMDo0MCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvZ28zMi5taDogVW51c2VkIGZpbGUgZGVsZXRlZC4KLQotCSogcmVhZC5jIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbik6IEluZGljYXRlIHRoYXQgdGhlIGVycm9yIG1heQotCW1lcmVseSBiZSB0aGF0IHRoZSBleHByZXNzaW9uIGNhbid0IGN1cnJlbnRseSBiZSByZWR1Y2VkLgotCi1UaHUgTm92ICAzIDE2OjA5OjU5IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCk6IElmIFRFX05ldEJTRCBkZWZpbmUgYXMKLQkgICJhLm91dC1tNjhrLW5ldGJzZCIuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCk6IElmIFRFX05ldEJTRCBkZWZpbmUgYXMKLQkgICJhLm91dC1zcGFyYy1uZXRic2QiLgotCi0JKiBjb25maWcvdGUtbmJzZC5oOiBOZXcgZmlsZSwgTmV0QlNEIHRhcmdldCBlbXVsYXRpb24KLQkqIGNvbmZpZy90ZS1uZXRic2QuaDogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1uZXRic2QqLG02OCotKi1uZXRic2QqLHNwYXJjKi0qLW5ldGJzZCopOgotCSAgU2V0IGJmZF9nYXMuICBVc2UgbmJzZCBlbXVsYXRpb24uCi0KLVRodSBOb3YgIDMgMTc6NDQ6NDcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCUNoYW5nZXMgZnJvbSBuZXQgMi41LjIgcmVsZWFzZSBicmFuY2g6Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUHV0IEFDX0RFRklORShzcGFyY3Y5KSBvbiBpdHMgb3duIGxpbmUsIHNvIHRoYXQKLQl0aGUgc2hlbGwgdmFyaWFibGUgc2V0dGluZ3MgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBwZXJtYW5lbnQuICBGb3IKLQlDUFVzIHJlcXVpcmluZyBiZmRfZ2FzPXllcywgc2VsZWN0IGl0IGJhc2VkIG9uIENQVSBvbmx5LCBub3QKLQlpbmRpdmlkdWFsIHRhcmdldCBuYW1lcy4gIEhhbmRsZSBtNjhrLWhwLWhwdXgqLCBub3QganVzdCAtaHB1eC4KLQotCSogY29uZmlnL3RjLXo4ay5jICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBBZGQgZHVtbXkgYXJndW1lbnQKLQl0byBtYXRjaCBwcm90b3R5cGUgaW4gb2JqLWNvZmYuaC4KLQotCSogY29uZmlndXJlLmluOiBTa2lwIHRlc3RzIGZvciBkZWZpbmluZyBXQU5UX0ZPUEVOX0JJTiBhbmQKLQlJQk1fQ09NUElMRVJfU1VYLgotCSogYWNjb25maWcuaDogRGVsZXRlZCB0aGVtLgotCSogY29uZmlndXJlLCBjb25mLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4wLgotCSogY29uZmlnL2dvMzIuY2ZnLCBjb25maWcvdm1zLWNvbmYuaDogVXBkYXRlZC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIsIG1kX2NvbnZlcnRfZnJhZ18xKTogQWx3YXlzIHVzZQotCUlCTV9DT01QSUxFUl9TVVggdmVyc2lvbiBvZiBjb2RlLCB3aXRoIGNvbW1lbnRzIGluZGljYXRpbmcgd2h5LgotCi0JKiBsaXN0aW5nLmMgKGZpbGVfaW5mbyk6IFVzZSB0ZXh0IG1vZGUgd2hlbiBvcGVuaW5nIGZpbGUgZm9yIHJlYWQuCi0JVXNlICJyIiBkaXJlY3RseSwgbm8gbWFjcm8uCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfb3Blbik6IERvbid0IHVzZSBGT1BFTl9SVCwganVzdCB1c2UKLQkiciIuCi0JKiByZWFkLmMgKHNfaW5jbHVkZSk6IERpdHRvLgotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogVHJ5IGJvdGggIndiIiBhbmQgInciLCBkb24ndAotCWJvdGhlciB3aXRoIEZPUEVOXyogbWFjcm9zLgotCSogYXMuaDogRG9uJ3QgaW5jbHVkZSBmb3Blbi0qLmguCi0KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogTWFrZSAicmV0IiB3aXRoIG5vIG9wZXJhbmRzIGVxdWl2YWxlbnQgdG8KLQkicmV0IHplcm8sKHJhKSIsIHRvIG1hdGNoIE9TRjEgYW5kIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBib3RoCi0Jb25lLW9wZXJhbmQgZm9ybXMuCi0KLQlQYXRjaGVzIGZyb20gREogRGVsb3JpZToKLQkqIGFzLmggKGFsbG9jYSk6IHVuZGVmIGFsbG9jYSBiZWZvcmUgZGVmaW5pbmcgaXQganVzdCBpbiBjYXNlCi0JKiBjb25maWcvZ28zMi5jZmc6IG5ldyBmaWxlIGZvciBhdXRvY29uZiB2YWx1ZXMKLQkqIGNvbmZpZy90ZS1nbzMyLmg6IG5ldyBmaWxlCi0JKiBjb25maWd1cmUuYmF0OiBuZXcgZm9yIGF1dG9jb25mCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRml4IHR5cG8gaW4gR09UUEMgY2hlY2s7IGhhZCA9Ci0JZm9yID09LgotCi0JKiBjb25maWd1cmUuaW46IElmIHRhcmdldF9mcmFnIGRvZXNuJ3QgZXhpc3QsIHVzZSAvZGV2L251bGwuCi0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBGb3Igbm9uLVZNUyBzeXN0ZW1zLCByZS1hZGQgYHYnIHRvCi0Jc3RkX3Nob3J0b3B0cy4gIEFkZCAidmVyYm9zZSIgdG8gbGlzdCBvZiBsb25nIG9wdGlvbnMuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogV2hlbiBnZW5lcmF0aW5nIGFuIGFic29sdXRlIHNlY3Rpb24KLQlzeW1ib2wgYXMgYSBwbGFjZWhvbGRlciwgZG9uJ3QgbWFyayBpdCBhcyB1c2VkIGluIGEgcmVsb2NhdGlvbgotCWVudHJ5LCBoZXJlLgotCi0JKiBNYWtlZmlsZS5pbiAoY29tcGFyaXNvbik6IENvbXBhcmUgdXNpbmcgbWFrZWZpbGUgY29kZSBmcm9tIGdjYywKLQlzdHJpcHBlZCBkb3duIHRvIGRpc2NhcmQgc3ViZGlyIHN0dWZmIGFuZCBhZGFwdGVkIHRvIGdpdmUgYQotCW5vbi16ZXJvIGV4aXQgc3RhdHVzIGlmIGVpdGhlciBmaWxlIGRpZmZlcnMuCi0KLVRodSBOb3YgIDMgMTU6NDM6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX2FkZHJlc3MpOiBGaXggUkVMQVhfRU5DT0RFIGFyZ3VtZW50cyBmb3IKLQlOT19QSUMgY2FzZS4KLQotVHVlIE5vdiAgMSAxNjoxMDo1OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfY2hhbmdlX3NlYyk6IElmIG5vdCBHUE9QVCwgZG9uJ3QgcGVybWl0Ci0Jc3dpdGNoaW5nIHRvIHRoZSByZWFkb25seSBkYXRhIHNlY3Rpb24uCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV90eXBlKTogRml4IHdhcm5pbmcgbWVzc2FnZS4KLQotU3VuIE9jdCAzMCAwMDo1NzozNSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcHJvYyk6IERlbGV0ZSBkaXNhYmxlZCBjb2RlIHRvIHB1dCBlYWNoCi0JcHJvYyBpbiBpdHMgb3duIHN1YnNwYWNlLCB3ZSdyZSBub3QgZ29pbmcgdG8gdXNlIGl0LgotCi1UdWUgT2N0IDI1IDE0OjQ0OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBFbnN1cmUgdGhhdCBtaXBzMiBjYXNlIG9mIE1fTElfREQgaW4KLQkucmRhdGEgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2NwdSk6IEluaXRpYWxpemUgdG8gLTEuCi0JKG1kX2JlZ2luKTogRG9uJ3QgbWlwc19jcHUgaWYgaXQgd2FzIGFscmVhZHkgc2V0LgotCShtZF9wYXJzZV9vcHRpb24pOiBGb3IgLW1pcHNOLCBkb24ndCBzZXQgbWlwc19jcHUgaWYgaXQgd2FzCi0JYWxyZWFkeSBzZXQuICBGb3IgLW1jcHU9LCBqdXN0IHNldCBtaXBzX2NwdSwgbm90IG1pcHNfaXNhLgotCi1GcmkgT2N0IDIxIDIwOjQyOjI5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogSWYgT0JKX0VMRiwgaGFuZGxlIC5zZWN0aW9uLgotCShzX2VsZl9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBEb24ndCBhYm9ydCBpZiB3ZSBkb24ndCByZWNvZ25pemUKLQl0aGUgc2VjdGlvbiB3aGVuIHNldHRpbmcgdGhlIHN0b3JhZ2UgY2xhc3M7IGRlZmF1bHQgdG8gc2NfRGF0YS4KLQotVGh1IE9jdCAyMCAwMDo0MzozOCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogU2V0IG5ld192YWwgdG8gOCBmb3IgYWxsCi0JZml4dXBzIHRvIGJyYW5jaCBpbnN0cnVjdGlvbnMgKG5vdCBqdXN0IHBjLXJlbGF0aXZlIG9uZXMpIHdoaWNoCi0Jd2lsbCBnZW5lcmF0ZSBTT00gcmVsb2NhdGlvbnMuCi0KLVdlZCBPY3QgMTkgMTM6NDE6NTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYTI5ay5jOiBJbmNsdWRlIGN0eXBlLmggd2l0aCBhbmdsZSBicmFja2V0cy4KLQkoZGVmaW5lX3NvbWVfcmVncyk6IEFkZCBuZXcgc3BlY2lhbCByZWdpc3RlciBuYW1lcyBkZWZpbmVkIG9uIHRoZQotCTI5MDQwLgotCShwYXJzZV9vcGVyYW5kKTogQWRkIGFyZ3VtZW50IG9wdC4gIElmIG5vbi16ZXJvLCBkb24ndCB3YXJuIGFib3V0Ci0JYSBtaXNzaW5nIG9wZXJhbmQuCi0JKG1hY2hpbmVfaXApOiBJZiBoYW5kbGluZyBhcmd1bWVudCB0eXBlICdJJywgcGFzcyBvcHQgYXMgbm9uLXplcm8KLQl0byBwYXJzZV9vcGVyYW5kLiAgSGFuZGxlIG5ldyBvcHRpb25hbCBvcGVyYW5kIHR5cGUgJ0knLgotCShtZF91bmRlZmluZWRfc3ltYm9sKTogSGFuZGxlIHNwZWNpYWwgcmVnaXN0ZXIgbmFtZXMgKHNyTk4pLgotCi1UdWUgT2N0IDE4IDAwOjQ1OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAocmVudW1iZXJfc2VjdGlvbnMpOiBOZXcgc3RhdGljIEJGRF9BU1NFTUJMRVIgZnVuY3Rpb24uCi0JKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCBpdCBhZnRlciByZW1vdmluZyBnYXMgY3JlYXRlZCBzZWN0aW9ucy4KLQotTW9uIE9jdCAxNyAxODowNjowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2NyZWF0ZSk6IFVzZSB1ZGF0YS5wLCBub3QganVzdCB1ZGF0YS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lY29mZl9zZXRfZXh0KTogTGlrZXdpc2UuCi0JKGVsZl9nZXRfZXh0cik6IExpa2V3aXNlLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYXNfd2hlcmUgaXMKLQl1bnNpZ25lZCBpbnQgKiwgbm90IGludCAqLgotCi1Nb24gT2N0IDE3IDAyOjI2OjMyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBFbGltaW5hdGUgYWxsIHVzZXMgb2YgZnhfYWRkbnVtYmVyLgotCSh0Y19nZW5fcmVsb2MpOiBTaW1wbGlmeS4gIEl0J3Mgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBzZXQgYQotCXJlbG9jJ3MgYWRkZW5kIGZpZWxkIHRvIHplcm8gZm9yIGZ1bmN0aW9uIHN5bWJvbHMuCi0JKG1kX2FwcGx5X2ZpeCk6IFNpbXBsaWZ5LiAgRm9yIGZpeHVwcyB3aGljaCB3aWxsIHJlcXVpcmUgYSBTT00KLQlyZWxvYywganVzdCBjbGVhciBvdXQgdGhlIG5lY2Vzc2FyeSBiaXRzIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotRnJpIE9jdCAxNCAxOTowNjo0NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT04pOiBVc2UgYmlzb24gLXksIG5vdCBiaXNvbi4KLQotVGh1IE9jdCAxMyAxOToyMjo1NCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgdG8gMi41LgotCShjbGVhbi1oZXJlKTogRGVsZXRlIHN0YW1wLW1rLmNvbS4KLQkoZGlzdGNsZWFuKTogRGVsZXRlIC5nZGJpbml0LgotCSogVmVyc2lvbiAyLjUgcmVsZWFzZWQuCi0KLVdlZCBPY3QgMTIgMjA6MzA6NTEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RlLW5ic2Q1MzIuaDogUmVuYW1lZCBmcm9tIHRlLW5ldGJzZDUzMi5oLgotCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6IEFkanVzdGVkLgotCi1XZWQgT2N0IDEyIDE2OjMzOjM4IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2NwbHVzLWRlbS5jOiBSZW1vdmVkLiAgSXQgaXNuJ3QgdXNlZC4gIEV2ZW4gaWYgaXQgd2FzLAotCSAgaXQncyBiZXR0ZXIgdG8gdXNlIHRoZSBvbmUgaW4gbGliaWJlcnR5LgotCi1XZWQgT2N0IDEyIDE4OjQ4OjM5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUsIGNhc2UgT19zeW1ib2wpOiBVbmRvIGxhc3QKLQljaGFuZ2U7IGl0IGJyZWFrcyB0aGUgcnM2MDAwIHN1cHBvcnQsIGFuZCBkb2Vzbid0IHNlZW0gdG8gYmUKLQluZWVkZWQuCi0KLVdlZCBPY3QgMTIgMTE6NTY6NTAgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTM4Ni5oLHRlLW5ldGJzZDUzMi5oIChUQVJHRVRfRk9STUFUKTogQ2hhbmdlZCB0bwotCSAgYS5vdXQtPGFyY2g+LW5ldGJzZCB0byBtYXRjaCBjb3JyZXNwb25kaW5nIGNoYW5nZXMgaW4gQkZELgotCi1XZWQgT2N0IDEyIDExOjA2OjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZml4X2FkanVzdGFibGUpOiBSZXNvbHZlIHN5bWJvbCB2YWx1ZXMKLQlyYXRoZXIgdGhhbiBleHBsaWNpdGx5IGFkZGluZyB0aGUgZnJhZyBhZGRyZXNzLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBBZGQgYSB6ZXJvIGVudHJ5IHRvIG1hcmsKLQl0aGUgZW5kIG9mIHRoZSBsaW5lIG51bWJlcnM7IHRoaXMgcmVwbGFjZXMgdGhlIHplcm8gZW50cnkgd2hpY2gKLQl1c2VkIHRvIGJlIGFkZGVkIGJ5IGNvZmZfYWRkX2xpbmVzeW0sIHJlbW92ZWQgT2N0IDcuCi0JKGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyk6IElnbm9yZSBzZWN0aW9ucyB3aXRoIG5vIHNlZ2luZm8uCi0KLVdlZCBPY3QgMTIgMDE6NDE6MzcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCwgYm9vdHN0cmFwMiwgYm9vdHN0cmFwMyk6IENyZWF0ZSBhCi0JInN0YWdlIiBzeW1saW5rIHRvIHRoZSBhcHByb3ByaWF0ZSBzdGFnZSogZGlyZWN0b3J5LCBhbmQgdXNlIGl0Ci0JaW5zdGVhZCBpbiB0aGUgLUIgb3B0aW9ucy4KLQkoY29tcGFyaXNvbik6IFJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0KLVR1ZSBPY3QgMTEgMTY6NDg6MTEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEZvciBub24tYS5vdXQgcmVsb2NhdGlvbnMsIGlmCi0JcGMtcmVsYXRpdmUsIHVzZSBmeF9vZmZzZXQgb25seSwgaWdub3JlIGFkZHJlc3Mgb2YgcmVsb2NhdGlvbi4KLQotVHVlIE9jdCAxMSAxNToyNDowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCB1c2UgU19JU19MT0NBTCB3aGVuIGNoZWNraW5nCi0JZm9yIGFuIGVtYmVkZGVkIFBJQyBzd2l0Y2ggZXhwcmVzc2lvbiwgc2luY2UgdGhlIGRlZmluaXRpb24gb2YKLQlTX0lTX0xPQ0FMIHdhcyBjaGFuZ2VkLgotCi1UdWUgT2N0IDExIDE1OjA1OjExIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY29tcGFyaXNvbik6IFdoZW4gY29tcGFyaW5nIGFzLm5ldyBvciBnYXNwLm5ldywgdHJ5Ci0JcnVubmluZyB0aGUgYmluYXJ5IHRocm91Z2ggc2VkIHRvIGF2b2lkIGRpZmZlcmVuY2VzIGR1ZSB0bwotCSJzdGFnZTEiIG9yICJzdGFnZTIiIGhhdmluZyBiZWVuIHdyaXR0ZW4gaW50byB0aGUgYmluYXJ5LgotCi1TYXQgT2N0ICA4IDAxOjQ4OjA0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JRUxGIHN5bWJvbCBzaXplIGhhbmRsaW5nLCBiYXNlZCBvbiBjb2RlIGZyb20gRXJpYyBZb3VuZ2RhbGU6Ci0JKiBjb25maWcvb2JqLWVsZi5oIChPQkpfU1lNRklFTERfVFlQRSk6IE5ldyBtYWNyby4gIEFkZHMgYW4KLQlleHByZXNzaW9uIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCBzdHJ1Y3R1cmUsIHVzZWQgZm9yIGBzaXplJwotCWV4cHJlc3Npb25zIHRoYXQgY291bGRuJ3QgYmUgcmVkdWNlZCB0byBjb25zdGFudHMgd2hlbiBpbml0aWFsbHkKLQlwcm9jZXNzZWQuCi0JKGVsZl9mcm9iX3N5bWJvbCk6IERlY2xhcmUuCi0JKG9ial9mcm9iX3N5bWJvbCk6IENhbGwgZWxmX2Zyb2Jfc3ltYm9sIGFsd2F5cywgcmF0aGVyIHRoYW4KLQllY29mZl9mcm9iX3N5bWJvbCBvbmx5IGlmIEVDT0ZGX0RFQlVHR0lORyBkZWZpbmVkLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX3N5bWJvbF9uZXdfaG9vayk6IERlbGV0ZWQgdW51c2VkIGNvZGUuCi0JQ2xlYXIgc3lfb2JqIGZpZWxkLgotCShvYmpfZWxmX3NpemUpOiBEZWxldGVkIHVudXNlZCBjb2RlLiAgSWYgc2l6ZSBpcyBub24tcmVkdWNpYmxlCi0JZXhwcmVzc2lvbiwgYWxsb2NhdGUgc29tZSBzdG9yYWdlIGZvciB0aGUgc3lfb2JqIGZpZWxkIGFuZCBjb3B5Ci0JdGhlIGV4cHJlc3Npb24uCi0JKGVsZl9mcm9iX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4gIENvbXB1dGVzIHNpemVzLCBjYWxscwotCWVjb2ZmX2Zyb2Jfc3ltYm9sIGlmIGFwcHJvcHJpYXRlLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRm9yIGkzODYgZWxmIGFuZCBjb2ZmIChmb3Igbm93KSwgZG9uJ3QKLQlhZGQgaW4gdmFsdWUgb2Ygc3ltYm9sIGZyb20gYW5vdGhlciBkZWZpbmVkIHNlY3Rpb24gb2YgdGhlIGZpbGUuCi0KLUZyaSBPY3QgIDcgMTc6NTQ6MDIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW04OGsuaCAoVENfS0VFUF9GWF9PRkZTRVQpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IFRlc3Qgb25seSBUQ19LRUVQX0ZYX09GRlNFVCwKLQlyYXRoZXIgdGhhbiBib3RoIGl0IGFuZCBUQ19NODhLLgotCShjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfZnJvYl9zZWN0aW9uKTogRm9yIG5vbi1lbXB0eSBzZWN0aW9ucywgY3JlYXRlIGF1eCBlbnRyeSBmb3IKLQl0aGUgc2VjdGlvbiBzeW1ib2wsIGluZGljYXRpbmcgdGhlIHNpemUuCi0JKG5fbGluZV9ub3MpOiBOZXcgdmFyaWFibGUuCi0JKGFkZF9saW5lbm8pOiBJbmNyZW1lbnQgaXQuCi0JKGNvZmZfYWRkX2xpbmVzeW0pOiBJbmNyZW1lbnQgbl9saW5lX25vcywgZG9uJ3QgY2FsbCBhZGRfbGluZW5vLgotCShjb2ZmX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbjsgbWFwIGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyBvdmVyCi0Jc2VjdGlvbnMuCi0JKG9ial9jb2ZmX2xpbmUpOiBPbmx5IHJlc2V0IGxpbmVfYmFzZSBmb3IgLmJmIHN5bWJvbHMuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zLCBjb2ZmX2Zyb2JfZmlsZSk6Ci0JRGVjbGFyZS4KLQkob2JqX2Zyb2JfZmlsZSk6IE5ldyBtYWNyby4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogUmVuYW1lZCBmcm9tCi0Jb2JqX2Zyb2JfZm9yd2FyZF9zeW1ib2wsIGFuZCByZXdyaXR0ZW4gZm9yIG5ldyBwYXJhbWV0ZXIgbGlzdC4KLQotCU1vbiBPY3QgIDMgMjE6MDI6MzggMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKFNfSVNfTE9DQUwpOiBmaXggb2Jzb2xldGUgZmxhZ3NlZW5bXSByZWZlcmVuY2UuCi0KLVdlZCBPY3QgIDUgMTE6NDk6MjYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBBY2NlcHQgLmVzaXplIGFuZCAuZXR5cGUKLQlhcyBzeW5vbnltcyBmb3IgLnNpemUgYW5kIC50eXBlLgotCi1XZWQgT2N0ICA1IDAwOjA4OjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zZWN0aW9uKTogUmVtb3ZlIGFzc2VydCBhYm91dAotCXNlY3Rpb24gYWxpZ25tZW50LgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBVc2Ugc2VjdGlvbiBhbGlnbm1lbnQsIG5vdAotCXh2ZWMgYWxpZ25fcG93ZXJfbWluIGZpZWxkLgotCi1GcmkgU2VwIDMwIDE5OjA1OjIwIDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiB2bXNjb25mLnNoIChtYWtlLWdhcy5jb20pOiBoYW5kbGUgRENMIHZlcmlmaWNhdGlvbiB0byBlbmFibGUKLQlzZW5zaWJsZSBmZWVkYmFjayB0byB0aGUgdXNlciB3aGlsZSBnYXMgaXMgYmVpbmcgYnVpbHQuCi0KLUZyaSBTZXAgMzAgMTY6MjM6MzEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IE5ldyB2YXJpYWJsZSwgbGlzdGluZyBvbmx5IG1ha2UtZ2FzLmNvbQotCWZvciBub3cuCi0JKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQ7IGJ1aWxkcyBESVNUU1RVRkYuCi0JKHJlYWxjbGVhbik6IFNlcGFyYXRlIHRhcmdldCwgZGVwZW5kIG9uIGNsZWFuIGFuZCBkaXN0Y2xlYW4sIHRoZW4KLQlkZWxldGUgRElTVFNUVUZGLgotCSogbWFrZS1nYXMuY29tOiBEZWxldGVkLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X3ZhbGlkYXRlX2ZpeCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcKLQlmdW5jdGlvbi4gIENvbnZlcnRzIHJlbG9jIGZvciAiZm9vLUdPVCIgdG8gQkZEX1JFTE9DXzM4Nl9HT1RPRkYKLQlyZWxvYyBmb3IgImZvbyIuCi0JKGkzODZfb3BlcmFuZCk6IERvbid0IGxvb2sgdXAgc2VjdGlvbiBzeW1ib2wgZm9yCi0JdW5kZWZpbmVkX3NlY3Rpb24uCi0JKHJlbG9jKTogQWx3YXlzIHBlcm1pdCByZXR1cm4gb2YgOC0gYW5kIDE2LWJpdCByZWxvY2F0aW9uIHR5cGVzLgotCUFkZCBhIHNwYWNlIGFmdGVyICJwYy1yZWxhdGl2ZSIgaW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JKHRjX2kzODZfZml4X2FkanVzdGFibGUpIFtCRkRfQVNTRU1CTEVSXTogUmVqZWN0Ci0JQkZEX1JFTE9DXzM4Nl9HT1RPRkYgcmVsb2NzLgotCShpMzg2X29wZXJhbmQpOiBGb3IgYW55IEdPVE9GRiByZWxvYywgY29udmVydCBpdCB0byBhIEJGRF9SRUxPQ18zMgotCXdpdGggYSAiZm9vLUdPVCIgdmFsdWUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChpMzg2X3ZhbGlkYXRlX2ZpeCk6IERlY2xhcmUgaXQuCi0JKFRDX1ZBTElEQVRFX0ZJWCk6IE5ldyBtYWNybyAtLSBjYWxsIGl0LgotCShOT1BfT1BDT0RFKTogQ2FzdCB0byBgY2hhcicgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIGFzLmg6IElmIF9fU1REQ19fIGlzIG5vdCBkZWZpbmVkIGFuZCB2YXJhcmdzLmggaXMgYXZhaWxhYmxlLCB1c2UKLQlpdCByYXRoZXIgdGhhbiBzdGRhcmcuaC4KLQotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IEFkZGVkIG5ldyBiaXRmaWVsZCBmeF9wbHQsIGZvciBmaXh1cHMKLQlyZWZlcnJpbmcgdG8gUExUIGVudHJpZXMuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSW5pdGlhbGl6ZSBmeF9wbHQgdG8gemVyby4KLQkoYWRqdXN0X3JlbG9jX3N5bXMpOiBSZS1mZXRjaCBgc3ltJyBhZnRlciB0b3Agb2YgcmVkdWN0aW9uIGxvb3AuCi0JRG9uJ3QgYWRqdXN0IGZ4X29mZnNldCBieSBmcmFnIGFkZHJlc3MsIHNpbmNlIFNfR0VUX1ZBTFVFIG5vdwotCWluY2x1ZGVzIHRoZSBmcmFnIGFkZHJlc3MuCi0JKGZpeHVwX3NlZ21lbnQpOiBDaGFuZ2VkIGxvY2FsIHZhciBQQ1JFTCB0byB0eXBlIGludCwgYWRkZWQgUExULgotCUlmIFBDLXJlbGF0aXZlIGZpeHVwIHJlZmVycyB0byBhIFBMVCBlbnRyeSBmb3IgYSBzeW1ib2wgaW4gdGhlCi0JY3VycmVudCBzZWN0aW9uLCBkb24ndCByZWR1Y2UgaXQuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogIEV4aXQgbG9vcCB0aHJvdWdoIGEgbGFiZWwuICBJZgotCURFQlVHNSBpcyBkZWZpbmVkLCBwcmludCBvdXQgZWFjaCBmaXh1cCBiZWZvcmUgYW5kIGFmdGVyCi0JcHJvY2Vzc2luZy4KLQkoZml4dXBfc2VnbWVudCk6IElmIERFQlVHNSBpcyBkZWZpbmVkLCBwcmludCBvdXQgZWFjaCBmaXh1cCBiZWZvcmUKLQlhbmQgYWZ0ZXIgcHJvY2Vzc2luZy4KLQkocHJpbnRfZml4dXApOiBBZGRlZCBwcm90b3R5cGUuICBTaG93IGFkZHJlc3Mgb24gZmlyc3QgbGluZS4gIFNob3cKLQlmeF9vZmZzZXQgYW5kIGZ4X3N1YnN5LiAgWyFCRkRfQVNTRU1CTEVSXTogT25seSBzaG93IGZ4X3JfdHlwZSBpZgotCU5FRURfRlhfUl9UWVBFIGlzIGRlZmluZWQuCi0KLQkqIHN5bWJvbHMuYyAocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBDaGVjayBTX0lTX0xPQ0FMLCBTX0lTX0VYVEVSTiwKLQlTX0lTX0RFQlVHLCBTX0lTX0RFRklORUQgYWxzby4KLQotVGh1IFNlcCAyOSAxODo1NzowNiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsKTogRGVwZW5kIG9uIC5nZGJpbml0LgotCSguZ2RiaW5pdCk6IFJlYnVpbGQgZnJvbSBnZGJpbml0LmluIGJ5IHJ1bm5pbmcgY29uZmlnLnN0YXR1cy4KLQotCSogZ2RiaW5pdC5pbjogRGVmaW5lIG5ldyBmdW5jdGlvbiAicGYiLiAgRml4IGRvYyBvbiAicGUiIGFuZCAicHMiLgotCi0JKiB3cml0ZS5jIChwcmludF9maXh1cCk6IFByaW50IHNvdXJjZSBsb2NhdGlvbiBvbiBmaXJzdCBsaW5lLgotCVNob3cgZnhfcl90eXBlIGFuZCBmeF9hZGRzeSBmaWVsZHMuCi0KLVdlZCBTZXAgMjggMTQ6NTY6MzkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgYmZkX2dhcyBmb3IgYWxsIHNwYXJjIHRhcmdldHMgaW4gb25lIHBsYWNlLAotCWluc3RlYWQgb2Ygc2VwYXJhdGVseSBmb3IgZWFjaC4gIENvcnJlY3RseSBoYW5kbGUgdXNlci1zdXBwbGllZAotCSItLWVuYWJsZS1iZmQtZ2FzIiBvcHRpb24uCi0KLQkqIGdkYmluaXQuaW46IE1vdmUgImJyZWFrIGFib3J0IiB0byBlbmQsIGluIGNhc2UgZ2RiIGNvbXBsYWlucy4KLQotCSogYXMuaCAoUFJJTlRGX1dIRVJFX0xJS0UsIFBSSU5UX0xJS0UpIFtVU0VfU1REQVJHLCAhX19HTlVDX19dOgotCVVzZSBQQVJBTVMgbWFjcm8uCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUsIGNhc2UgT19zeW1ib2wpOiBEb24ndCBkbyBhbnkKLQlwcm9jZXNzaW5nIGlmIGFkZF9zeW1ib2wgaXMgdW5kZWZpbmVkIG9yIGluIGV4cHJfc2VjdGlvbi4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUsIGNhc2UgT19hZGQpOiBGb3Igc3ltYm9sIHBsdXMKLQljb25zdGFudC12YWx1ZWQgc3ltYm9sLCBjb252ZXJ0IHRvIE9fc3ltYm9sIGFuZCByZS1yZWR1Y2UuCi0JKFNfR0VUX1ZBTFVFKTogSWYgc3ltYm9sIG5lZWRzIHJlc29sdmluZywgcmVzb2x2ZSBpdC4KLQkoaW5kZW50X2xldmVsKTogTm8gbG9uZ2VyIHN0YXRpYy4KLQkocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBEb24ndCBwcmludCBmcmFnIGFkZHJlc3MgaWYgaXQgbWF0Y2hlcwotCXplcm9fYWRkcmVzc19mcmFnLiAgRG9uJ3QgcHJpbnQgInJlc29sdmluZyIgaWYgYWxyZWFkeSByZXNvbHZlZC4KLQlQcmludCBzZWdtZW50IG5hbWUuICBEb24ndCBjYWxsIHByaW50X2V4cHJfMSBvbiBhbiB1bmRlZmluZWQKLQlzeW1ib2wuCi0JKHByaW50X2V4cHJfMSk6IEZpeCB3aGl0ZXNwYWNlIGJlZm9yZSBwcmludGluZyBYX2FkZF9udW1iZXIuCi0KLQkqIGV4cHIuYyAobWFrZV9leHByX3N5bWJvbCk6IE5vIGxvbmdlciBzdGF0aWMuICBVc2Ugc3ltYm9sX2NyZWF0ZSwKLQlub3Qgc3ltYm9sX25ldywgZm9yIHN5bWJvbHMgaG9sZGluZyBleHByZXNzaW9uIHZhbHVlcy4KLQkqIGV4cHIuaCAobWFrZV9leHByX3N5bWJvbCk6IE1vdmUgZGVjbGFyYXRpb24gaGVyZS4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogSGFuZGxlIE9fYWRkIGJ5IGNyZWF0aW5nIGFuCi0JZXhwcmVzc2lvbi12YWx1ZWQgc3ltYm9sLCBhbmQgY2FsbGluZyBmaXhfbmV3X2V4cCByZWN1cnNpdmVseS4KLQkoYWRqdXN0X3JlbG9jX3N5bXMpOiBJZiBhIGZpeHVwJ3Mgc3ltYm9sIHZhbHVlIGlzIGEgc3VtIG9mIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCBhbmQgYSBjb25zdGFudCwgZm9sZCB0aGUgY29uc3RhbnQgaW50byB0aGUgZml4dXAsCi0JYW5kIHJlZmVyIHRvIHRoZSB1bmRlZmluZWQgc3ltYm9sIGRpcmVjdGx5LiAgVGhlbiBwcm9jZXNzIHRoZQotCWZpeHVwIGFnYWluIGZyb20gc2NyYXRjaC4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBCZWZvcmUgY2FsbGluZyBhZGp1c3RfcmVsb2Nfc3ltcywgbWFrZSBhIHBhc3MKLQl0aHJvdWdoIHRoZSBzeW1ib2wgbGlzdCB0cnlpbmcgdG8gcmVzb2x2ZSB2YWx1ZXMuCi0KLQkqIHdyaXRlLmMgKHByaW50X2ZpeHVwKTogTmV3IHJvdXRpbmUsIGZvciBkZWJ1Z2dpbmcuCi0JKHdyaXRlX3JlbG9jcyk6IENhbGwgYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gIERlbGV0ZWQgdmFyaW91cwotCWhhY2tzIGZvciB3b3JraW5nIGFyb3VuZCBwcm9ibGVtcyB3aXRoIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uCi0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlIHRvIDIuNC45MC4KLQotV2VkIFNlcCAyOCAxMTo1MDo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChnYXNwLm8pOiBEZXBlbmRzIHVwb24gY29uZmlnLmguCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEluY2x1ZGUgc3Vic2Vncy5oLgotCShtZF9hcHBseV9maXgpOiBJZiBhbiB1bmNvbmRpdGlvbmFsIGIgb3IgYmFsIG92ZXJmbG93cywgYW5kIHdlIGFyZQotCW5vdCBhc3NlbWJsaW5nIFBJQyBjb2RlLCByZXBsYWNlIGl0IHdpdGggYSBqIG9yIGphbC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogQ29ycmVjdCBicmFuY2ggb3ZlcmZsb3cgdGVzdC4KLQlVc2UgYXNfYmFkX3doZXJlIGFuZCBhc193YXJuX3doZXJlIHJhdGhlciB0aGFuIGFzX2JhZCBhbmQgYXNfd2Fybi4KLQotTW9uIFNlcCAyNiAxNzoxNTo1OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IEFkZCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIHRvCi0JYXNfZmF0YWwgY2FsbHMuICBIYW5kbGUgYmZkX3JlbG9jX292ZXJmbG93IGNhc2Ugc3BlY2lmaWNhbGx5IHdoZW4KLQlSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUuCi0KLUZyaSBTZXAgMjMgMTY6MTE6MjggMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoVVNFX1NUREFSRywgVVNFX1ZBUkFSR1MpOiBEZWZpbmUgb25lIG9yIG5laXRoZXIgb2YgdGhlc2UKLQloZXJlLiAgVXNlIHRoZW0gZm9yIGRlY2lkaW5nIHdoaWNoIFBSSU5URipMSUtFIG1hY3JvIGRlZmluaXRpb25zCi0JdG8gdXNlLgotCSogbWVzc2FnZXMuYzogVXNlIHRoZW0sIGluc3RlYWQgb2YgTk9fU1REQVJHLCBOT19WQVJBUkdTLgotCVshVVNFX1NUREFSRyAmJiAhVVNFX1ZBUkFSR1NdICh2YV9hbGlzdCwgdmFfZGNsLCAuLi4pOiBQcm92aWRlCi0JZGVmYXVsdCBkZWZpbml0aW9ucyBtYXRjaGluZyB3aGF0IHdlIHdlcmUgZG9pbmcgYmVmb3JlLgotCShhc190c2t0c2spOiBSZW1vdmUgdGhlIG5vbi1zdGRhcmcsIG5vbi12YXJhcmdzIHZlcnNpb24sIGFuZAotCWFsd2F5cyB1c2UgdGhlIHZhcmFyZ3MgZm9ybSBpZiBub3QgdXNpbmcgc3RkYXJnLiAgSXQncyBzYWZlIHRvCi0JYWx3YXlzIHVzZSB2ZnByaW50ZiwgYmVjYXVzZSBsaWJpYmVydHkgd2lsbCBwcm92aWRlIGl0IGlmIHRoZQotCW5hdGl2ZSBzeXN0ZW0gZG9lc24ndC4gIEFsc28sIGFsd2F5cyBtYWtlIGZvcm1hdCBiZSBjb25zdC4KLQkoYXNfd2FybiwgYXNfd2Fybl93aGVyZSwgYXNfYmFkLCBhc19iYWRfd2hlcmUsIGFzX2ZhdGFsKTogRGl0dG8uCi0KLUZyaSBTZXAgMjMgMTQ6NDI6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogQWx3YXlzIHVzZSBhZGRpdSB3aGVuIGFkZGluZyBhCi0JY29uc3RhbnQgdG8gJHplcm8tLW5vIG5lZWQgdG8gdXNlIGRhZGRpdS4KLQkobWFjcm8pOiBIYWNrIHRoZSAtbWlwczMgb3ZlcmZsb3cgdGVzdHMgdG8gbm90IGZhaWwgd2hlbiBvZmZzZXRUCi0JaXMgb25seSAzMiBiaXRzLgotCi0JKiBzeW1ib2xzLmggKGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpOiBEZWNsYXJlLgotCi1UaHUgU2VwIDIyIDIxOjU4OjI0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYzogQnVnZml4ZXMgYmFzZWQgaW4gcGFydCBvbiBwYXRjaGVzIGZyb20gUGF1bAotCUtyYW5lbmJ1cmcuCi0JKGxpc3RpbmdfbmV3bGluZSk6IENoZWNrIGZpbGVuYW1lIGFzIHdlbGwgYXMgbGluZSBudW1iZXIgd2hlbgotCWRlY2lkaW5nIHdoZXRoZXIgdG8gcmVjb3JkIGl0LgotCShsaXN0X3N5bWJvbF90YWJsZSkgW1NfSVNfUkVHSVNURVJdOiBDaGVjayB0aGF0IFNfSVNfUkVHSVNURVIgaXMKLQlmYWxzZSAoaWYgZGVmaW5lZCkgYXMgd2VsbCBhcyBjaGVja2luZyBmb3IgcmVnX3NlY3Rpb24uCi0JKGxpc3RpbmdfbGlzdGluZyk6IEl0ZXJhdGUgZmV0Y2hpbmcgbGluZXMgd2hpbGUgbGluZSBudW1iZXIgaXMgdG9vCi0JbG93LCBhbmQgd2UgaGF2ZW4ndCBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuCi0KLQkqIGNvbmZpZy92bXMtY29uZi5oOiBDaGFuZ2VkIEhBVkVfREVMRVRFIHRvIEhBVkVfUkVNT1ZFLgotCi1UaHUgU2VwIDIyIDEzOjM5OjEwIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0B4MS5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogY2hlY2sgaWYKLQljdXJyZW50X3N0YWJzX2ZpbGVuYW1lIGlzIE5VTEwgYmVmb3JlIHN0cmNtcC4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogZml4IGEgYnVnIGluIGdlbmVyYXRlX2FzbV9saW5lbm8KLQljaGVja2luZy4KLQotV2VkIFNlcCAyMSAxODoxNzozNSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvaG8tKi5oOiBOb3ctdW51c2VkIGZpbGVzIGRlbGV0ZWQuCi0KLQkqIHN5bWJvbHMuYyAoY29weV9zeW1ib2xfYXR0cmlidXRlcyk6IE5ldyBmdW5jdGlvbi4gIENvcGllcyBCRkQKLQlzeW1ib2wgZmxhZ3MgYW5kIGNhbGxzIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTLgotCShyZXNvbHZlX3N5bWJvbF92YWx1ZSwgY2FzZSBPX3N5bWJvbCk6IENhbGwgaXQsIGlmIFhfYWRkX251bWJlciBpcwotCXplcm8uICBEb24ndCBjYWxsIG9ial9mcm9iX2ZvcndhcmRfc3ltYm9sLgotCSogcmVhZC5jIChwc2V1ZG9fc2V0KTogQ2FsbCBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzLCBidXQgb25seSBpZgotCVhfYWRkX251bWJlciBpcyB6ZXJvLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2Zyb2JfZm9yd2FyZF9zeW1ib2wpOiBEZWxldGVkLgotCi0JKiBjb25maWcvdGMtaTk2MC5jOiBMb3RzIG9mIHdoaXRlc3BhY2UsIGNvbW1lbnQgcmVmb3JtYXR0aW5nLAotCXVzaW5nIEdOVSBpbmRlbnQuCi0JKHN0cmNocik6IERvbid0IGRlY2xhcmUuCi0JW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBjb21waWxlIG1kX2NvbnZlcnRfZnJhZywKLQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfcmlfdG9fY2hhcnMsCi0JbWRfY3JlYXRlX3Nob3J0X2p1bXAsIG1kX2NyZWF0ZV9sb25nX2p1bXAuCi0JKGJydGFiX2VtaXQpOiBVc2UgZGF0YV9zZWN0aW9uLCBub3QgU0VHX0RBVEEuCi0KLQlNb24gU2VwIDE5IDE3OjE0OjQ0IDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvdm1zLWNvbmYuaDogbmV3IGZpbGUsIG1hbnVhbGx5IGRlcml2ZWQgZnJvbSBjb25mLmluLgotCSogY29uZmlnLWdhcy5jb206IHVzZSBpdCwgYW5kIGVsaW1pbmF0ZSBvYnNvbGV0ZSAiaG9zdC5oIi4KLQotV2VkIFNlcCAyMSAxMToxMTozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2N1cnJlbnRfYmxvY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcGNfc3RhYngpOiBTZXQgc3lfdGMud2l0aGluIG9mIGEgQ19TVFNZTSBzeW1ib2wgdG8KLQlwcGNfY3VycmVudF9ibG9jay4gIERvbid0IG1vdmUgYXJvdW5kIGFueSBzdGFiIHN5bWJvbCwganVzdCB0aG9zZQotCWZvciBjb21tb24gc3ltYm9scy4KLQkocHBjX2JzKTogU2V0IHBwY19jdXJyZW50X2Jsb2NrLgotCShwcGNfZXMpOiBDbGVhciBwcGNfY3VycmVudF9ibG9jay4KLQkocHBjX2Zyb2Jfc3ltYm9sKTogU2V0IHRoZSB2YWx1ZSBvZiBhIENfU1RTWU0gc3ltYm9sIHRvIHRoZSBvZmZzZXQKLQlmcm9tIHRoZSBjc2VjdCBvZiB0aGUgZW5jbG9zaW5nIGJsb2NrLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChpbnNuc19zaW5jZV9jYWNoZV9hY2Nlc3MpOiBSZW1vdmUuCi0JKGFwcGVuZF9pbnNuKTogUmVtb3ZlIHNldHRpbmcgb2YgaW5zbnNfc2luY2VfY2FjaGVfYWNjZXNzLCBhbmQKLQlzcGVjaWFsIDQ2MDAgaGFuZGxpbmc7IGl0IHR1cm5zIG91dCBub3QgdG8gYmUgcmVxdWlyZWQuCi0KLVR1ZSBTZXAgMjAgMTY6MTM6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9zaG9ydG9wdHMpOiBSZW1vdmUgRS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgRUIgYW5kIEVMLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLUVCIGFuZCAtRUwgYXMgc2VwYXJhdGUgb3B0aW9ucywgcmF0aGVyCi0JdGhhbiBhcyBhIHNpbmdsZSAtRSBvcHRpb24gd2l0aCBhbiBhcmd1bWVudC4KLQotTW9uIFNlcCAxOSAxMjo0MjowNSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IFJlamVjdCByZWR1Y3Rpb25zCi0JaW52b2x2aW5nIGdsb2JhbCBzeW1ib2xzIHRvby4KLQotTW9uIFNlcCAxOSAxMjoxMjo0NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBhcy5oOiBUZXN0IE5FRURfREVDTEFSQVRJT05fKiwgbm90IE5FRURfKl9ERUNMQVJBVElPTi4KLQotCSogY29uZmlndXJlLmluOiBUZXN0IGZvciByZW1vdmUsIG5vdCBkZWxldGUuICBGaXggY3Jvc3MtYXNzZW1ibGVyCi0JdGVzdC4KLQkqIGFzLmg6IFRlc3QgSEFWRV9SRU1PVkUsIG5vdCBIQVZFX0RFTEVURTsgZGVmaW5lIHVubGluayB0bwotCXJlbW92ZSwgbm90IGRlbGV0ZS4KLQotCSogcmVhZC5jIChwc2V1ZG9fc2V0LCBjYXNlIE9fc3ltYm9sKTogSWYKLQlPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyBpcyBkZWZpbmVkLCBpbnZva2UgaXQuCi0JW0JGRF9BU1NFTUJMRVJdOiBDb3B5IEJTRl9GVU5DVElPTiBzZXR0aW5nIHRvby4KLQkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogRGVmaW5lLgotCi0JV2VkIEF1ZyAxMCAxOToxNTozMCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuaCAoRFNHX1NfQ19VQklUVSwgRFNUX0tfVkZMQUdTX0RTQywgRFNUX0tfVFNfQVRPTSwKLQltYW55IG90aGVycyk6IG5ldyBtYWNyb3M7IHZhbHVlcyBvYnRhaW5lZCBmcm9tICJEU1RSRUNSRFMuU0RMIi4KLQkqIGNvbmZpZy9vYmotdm1zLmggKHZhcmlvdXMpOiB1c2UgdGhlbS4KLQkoVVNFX0JJVFNUUklOR19ERVNDUklQVE9SKTogbmV3IG1hY3JvLCBmb3Igc2VsZWN0aW5nIGJpdGZpZWxkCi0JcmVwcmVzZW50YXRpb24gKG9ubHkgZW51bSBiaXRmaWVsZHMgY2FuIGF2b2lkIGJlaW5nIGJpdHN0cmluZ3MpLgotCShiaXRmaWVsZF9zdWZmaXgsIHNldHVwX2Jhc2ljX3R5cGUpOiBuZXcgcm91dGluZXMuCi0JKFZNU190eXBlZGVmX3BhcnNlKTogdXNlIHRoZW0uICBOb3cgcmVjb2duaXplIGJpdGZpZWxkcyBvZiBhbGwKLQlpbnRlZ3JhbCB0eXBlcywgbm90IGp1c3QgdHlwZSBgaW50Jy4gIENhdmVhdDogIHRoZSByZXByZXNlbnRhdGlvbgotCXVzZWQgZm9yIGJpdGZpZWxkcyBzdGlsbCBkb2VzIG5vdCB3b3JrIGZvciBvYmplY3RzIHBsYWNlZCBpbgotCXJlZ2lzdGVycywgYW5kIGdjYydzIG9wdGltaXplciBzb21ldGltZXMgcHV0cyBzbWFsbCBzdHJ1Y3RzIHRoZXJlLgotCi0JVHVlIEp1biAxNCAxNzozMTo0NCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogcmVhZC5jIChzX3RleHQpIFsjaWYgT0JKX1ZNU106IGNsZWFyIHRoZSBJTl9ERUZBVUxUX1NFQ1RJT04KLQliaXQgZnJvbSBjb25zdF9mbGFnLgotCSogY29uZmlnL29iai12bXMuaCAoSU5fREVGQVVMVF9TRUNUSU9OKTogZGVmaW5lIHRoaXMgbWFjcm8uCi0JKHRjX2Zyb2JfbGFiZWwpOiBkZWZpbmUgdGhpcyB0byBjYWxsIHZtc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCwKLQlhbmQgZGVjbGFyZSB0aGUgbGF0dGVyLgotCSogY29uZmlnL29iai12bXMuYyAodmF4X2dfZG91Ymxlcyk6IGRlY2xhcmUgdGhpcyBmaWxlLXNjb3BlCi0JdmFyaWFibGUuCi0JKGNvbnN0X2ZsYWcpOiBpbml0aWFsaXplIHRvIElOX0RFRkFVTFRfU0VDVElPTiBpbnN0ZWFkIG9mIDAuCi0JKHZtc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCk6IG5ldyByb3V0aW5lICh0Y19mcm9iX2xhYmVsKS4KLQkoVk1TX1RCVF9Sb3V0aW5lX0VuZCk6IGRvbid0IGJvdGhlciBjaGVja2luZyBmb3IgYGdjY19jb21waWxlZC4nCi0JYW5kIGBnY2MyX2NvbXBpbGVkLicgbGFiZWxzOyB0aGV5IHdvbid0IHJlYWNoIGhlcmUgYW55IG1vcmUuCi0JKFZNU190eXBlZGVmX3BhcnNlKSBbY2FzZSAnciddOiBmb3IgdHlwZXMgYGRvdWJsZScgYW5kIGBjb21wbGV4Ci0JZG91YmxlJywgdXNlIGB2YXhfZ19kb3VibGVzJyBmbGFnIHRvIHNlbGVjdCB0eXBlIG9mIGRvdWJsZS4KLQkoVk1TX3dyaXRlX29iamVjdF9maWxlKSBbdHJhY2ViYWNrIHNldHVwXTogZG9uJ3QgcGFzcyBzeW1ib2xzCi0Jd2l0aCB0aGUgSU5fREVGQVVMVF9TRUNUSU9OIGF0dHJpYnV0ZSB0byB0aGUgVEJUX1JvdXRpbmVfQmVnaW4KLQlhbmQgVEJUX1JvdXRpbmVfRW5kIGZ1bmN0aW9ucy4KLQotCU1vbiBKdW4gIDYgMjA6NTI6MjAgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19UQlRfUm91dGluZV9FbmQpOiBjYWNoZSB0aGUgcmVzdWx0IG9mCi0JU19HRVRfVkFMVUUoKSB0byBhdm9pZCBtYW55IHJlcGVhdGVkIGZ1bmN0aW9uIGNhbGxzLgotCShWTVNfQ2hlY2tfRm9yX01haW4pIFsjaWYgSEFDS19ERUNfQ19TVEFSVFVQXTogY2FwaXRhbGl6ZQotCV9DJE1BSU5fQVJHUyBpbiBhZHZhbmNlLCBpbiBjYXNlIC1oMyAobGVhdmUgc3ltYm9sIG5hbWUgYXMtaXMpCi0JZ2V0cyByZXF1ZXN0ZWQuICBbQWxsIHRoZSBIQUNLX0RFQ19DX1NUQVJUVVAgY29kZSBhcHBlYXJzIHRvCi0JYmUgb2Jzb2xldGU7IGdjYyBkb2VzIGl0IGF1dG9tYXRpY2FsbHkgZm9yIHZtcyB0YXJnZXQuICBJdCdzCi0JYWxzbyBtaXNuYW1lZCwgYmVjYXVzZSBpdCBpcyBmb3IgdGhlICJWQVggQyIgcnVuLXRpbWUgbGlicmFyeSwKLQlub3QgdGhlIG5ld2VyICJERUMgQyIgb25lIHdoaWNoIGhhcyBtdWNoIGRpZmZlcmVudCBzdGFydHVwIGNvZGUuXQotCXt2YXJpb3VzfTogdXNlIGBTX1NFVF94eHgoc3ltYm9sLG5ld192YWx1ZSknIHJhdGhlciB0aGFuCi0JYFNfR0VUX3h4eChzeW1ib2wpID0gbmV3X3ZhbHVlJy4KLQotTW9uIFNlcCAxOSAxMjowNTowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX2RvdF9maWxlX3N5bWJvbCk6IFVzZSBiZmRfYWJzX3NlY3Rpb25fcHRyLAotCW5vdCAmYmZkX2Fic19zZWN0aW9uLgotCi1UaHUgU2VwIDE1IDE4OjM2OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChjbGVhbl91cF9leHByZXNzaW9uKTogVXNlIGFkZHJlc3NULCBub3QgYmZkX3ZtYS4KLQotVHVlIFNlcCAxMyAyMDowNTo0NyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZXhwci5jIChleHByKTogRG9uJ3QgcmVkdWNlIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHRoZQotCXNhbWUgZnJhZyBpZiB0aGUgc3ltYm9scyBhcmUgbm90IGluIG5vcm1hbCBzZWN0aW9ucy4KLQotCSogY29uZmlnL29iai1zb20uaCAoU19TRVRfT1RIRVIsIFNfU0VUX1RZUEUpOiBEZWxldGUgYS5vdXQgY3J1ZC4KLQkoU19TRVRfREVTQywgU19HRVRfT1RIRVIsIFNfR0VUX1RZUEUsIFNfR0VUX0RFU0MpOiBMaWtld2lzZS4KLQkob2JqX2F0dGFjaF91bndpbmRfaW5mbyk6IERvIG5vdCBkZWZpbmUuICBOb3QgbmVlZGVkIGFueW1vcmUuCi0JKiBjb25maWcvdGMtaHBwYS5jOiBEZWxldGUgd2hpdGVzcGFjZSBhdCBFT0wuCi0JKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QpOiBEZWxldGUgZnhfdW53aW5kIGZpZWxkIGFuZCBhbGwgcmVmZXJlbmNlcy4KLQkoZml4X25ld19ocHBhKTogTGFzdCBhcmcgaXMgbm93IGEgcG9pbnRlciB0byBhbiBpbnQuICBEbyBub3QKLQljYWxsIG9ial9hdHRhY2hfdW53aW5kX2luZm8gYW55bW9yZS4gIEZvciBTT00gUl9FTlRSWSBhbmQgUl9FWElUCi0JZml4dXBzLCBzdG9yZSAzMmJpdHMgb2YgdW53aW5kIGluZm9ybWF0aW9uIGluIHRoZSBmeF9hZGRudW1iZXIKLQlmaWVsZCBvZiB0aGUgZml4dXAuCi0JKG1kX2Fzc2VtYmxlLCBwYV9lbnRyeSwgcHJvY2Vzc19leGl0LCBwYV9wcm9jZW5kKTogRm9yIFNPTSBSX0VOVFJZCi0JYW5kIFJfRVhJVCBmaXh1cHMsIHBhc3MgYSBOVUxMIHBvaW50ZXIgdG8gZml4X25ld19ocHBhLCBhbmQgYQotCXBvaW50ZXIgdG8gMzIgYml0cyBvZiB1bndpbmQgaW5mby4KLQkodGNfZ2VuX3JlbG9jKTogRm9yIFNPTSBSX0VOVFJZIGFuZCBSX0VYSVQgZml4dXBzLCBzZXQgdGhlIHN5bWJvbAotCXBvaW50ZXIgdG8gdGhlIGR1bW15IHN5bWJvbDsgc2V0IHRoZSBhZGRlbmQgZmllbGQgdG8gZnhfYWRkbnVtYmVyLgotCShwYV9jb21tLCBwYV9lcXUsIHBhX3R5cGVfYXJncywgcGFfaW1wb3J0KTogVXNlIGJmZF9YWFhfc2VjdGlvbl9wdHIKLQlyYXRoZXIgdGhhbiAmYmZkX1hYWF9zZWN0aW9uLgotCi1UdWUgU2VwIDEzIDIxOjE1OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeF8xKTogRm9yIEdPVFBDIHJlbG9jcywgZGVjcmVtZW50Ci0JdmFsdWUgYnkgb25lOyBkaXNjYXJkIGFkanVzdG1lbnRzIHByZXZpb3VzbHkgYmVpbmcgbWFkZS4gIEZyb20KLQlFcmljIFlvdW5nZGFsZS4KLQotCVZNUy0gYW5kIFZheC1yZWxhdGVkIGNoYW5nZXMgZnJvbSBQYXQgUmFua2luOgotCSogTWFrZWZpbGUuaW4gKFZNU19PVEhFUl9PQkpTKTogYWRkIGNvbmNhdCwgZ2V0b3B0LCBhbmQgZ2V0b3B0MS4KLQkqIHZtc2NvbmYuc2g6IG5vIGxvbmdlciBoYXZlIG1ha2UtZ2FzLmNvbSBlY2hvIHRleHQgYWJvdXQgbmVlZGluZwotCXRvIG1vZGlmeSB0aGUgZ2NjLXZtcyBkcml2ZXIgd2hlbiBpbnRlbmRpbmcgdG8gdXNlIHdpdGggZ2NjIDEueC4KLQkqIGFzLmMgKHBhcnNlX29wdGlvbnMpOiBzdXBwcmVzcyAndicgZnJvbSBzdGRfc2hvcnRfb3B0aW9ucyBhbmQKLQllbGltaW5hdGUgVk1TLXNwZWNpZmljIGNvbmRpdGlvbmFsIGluaXRpYWxpemF0aW9uOwotCVtkZWZhdWx0IGNhc2VdOiBjaGVjayBmb3IgJy12JyBpZiBtZF9wYXJzZV9vcHRpb25zIGRvZXNuJ3QgcmVjb2duaXplCi0JYW4gb3B0aW9uOwotCVtkZWZhdWx0IGNhc2UsICNpZiBWTVNdOiBjaGVjayBmb3IgZmlsZW5hbWUgYXJndW1lbnQgd2hlbiAnLXYnIHNlZW47Ci0JW2Nhc2UgJ3YnXTogZGVsZXRlLgotCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IGRvbid0IHJlbHkgb24gYHRoaXNfYWRkX251bWJlcicKLQlmb3IgT19iaWcgbGl0ZXJhbCBvcGVyYW5kcyAoZG91YmxlIGZsb2F0cyBhbmQgbG9uZyBsb25nIGludHMpOwotCVtWTVMsIG1kX3Nob3J0b3B0c106IGFkZCBzZWNvbmQgY29sb24gYWZ0ZXIgJ3YnOwotCShtZF9wYXJzZV9vcHRpb25zKSBbVk1TLCBjYXNlICd2J106ICBjaGVjayBmb3IgYXJndW1lbnQsIHNvCi0JY2FsbGVyIGNhbiBoYW5kbGUgYC12JyB3L28gYXJnLgotCi1UdWUgU2VwIDEzIDE2OjQ1OjA4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogIElmIFRDX0tFRVBfRlhfT0ZGU0VUCi0JaXMgZGVmaW5lZCwgcHV0IHRoZSB0eF9vZmZzZXQgaW50byB0aGUgcl9vZmZzZXQuCi0JKiBjb25maWcvdGMtc2guYyAobGluZV9jb21tZW50X2NoYXJzKTogQWRkICMKLQkodGNfcmVsb2NfbWFuZ2xlKTogRGVsZXRlZC4KLQkqIGNvbmZpZy90Yy1zaC5oIChUQ19LRUVQX0ZYX09GRlNFVCk6IERlZmluZS4KLQkoVENfUkVMT0NfTUFOR0xFKTogRGVsZXRlLgotCi1UdWUgU2VwIDEzIDE2OjIwOjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGZsb251bS1rb25zdC5jOiBDaGFuZ2UgcHJlcHJvY2Vzc29yIHRlc3RzIG9mIEhPX1ZNUyB0byBqdXN0IFZNUy4KLQkqIGhleC12YWx1ZS5jOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotdm1zLmM6IERpdHRvLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBSZXBsYWNlIGFzX2JhZC9leGl0IHNlcXVlbmNlIHdpdGgKLQlhIGNhbGwgdG8gYXNfZmF0YWwuCi0JKiBjb25maWcvdGMtaTg2MC5jIChpODYwX2lwKTogRGl0dG8uCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IERpdHRvLgotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwKTogRGl0dG8uCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBSZXBsYWNlIGFzX3dhcm4vZXhpdCBzZXF1ZW5jZSB3aXRoIGEKLQljYWxsIHRvIGFzX2ZhdGFsLgotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IFVzZSBFWElUX0ZBSUxVUkUuCi0JKiBvdXRwdXQtZmlsZS5jIChvdXRwdXRfZmlsZV9jcmVhdGUsIG91dHB1dF9maWxlX2Nsb3NlLAotCW91dHB1dF9maWxlX2NyZWF0ZSwgb3V0cHV0X2ZpbGVfY2xvc2UpOiBEaXR0by4KLQkqIG1lc3NhZ2VzLmMgKGFzX2ZhdGFsKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX3ZlcnNpb24sIG9ial9zb21fY29weXJpZ2h0KTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWllZWUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERpdHRvLgotCSogY29uZmlnL3RjLXZheC5jIChtYWluKTogVXNlIEVYSVRfU1VDQ0VTUy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1haW4pOiBEaXR0by4KLQotCSogaGFzaC5jIChtYWluKTogUGFzcyBhIHZhbHVlIHRvIGV4aXQoKS4KLQotCSogYXMuaCAoRVhJVF9TVUNDRVNTLCBFWElUX0ZBSUxVUkUpOiBNb3ZlZCBoZXJlLgotCSogYXMuYzogLi4uZnJvbSBoZXJlLgotCShwYXJzZV9hcmdzKTogVXNlIHRoZW0gYWx3YXlzLgotCShtYWluKTogVXNlIGV4aXQgcmF0aGVyIHRoYW4gcmV0dXJuLgotCi0JKiBNYWtlZmlsZS5pbiAoKl9GT1JfVEFSR0VULCBJTlNUQUxMX1hGT1JNLCBpbnN0YWxsLCB1bmluc3RhbGwpOgotCVJld3JpdGUgaGFuZGxpbmcgb2YgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZS4KLQotCSogY29uZmlndXJlLmluOiBUZXN0IGZvciBmdW5jdGlvbnMgdW5saW5rIGFuZCBkZWxldGUuCi0JKiBhcy5oOiBJZiB1bmxpbmsgaXNuJ3QgYXZhaWxhYmxlIGJ1dCBkZWxldGUgaXMsIGRlZmluZSB1bmxpbmsgdG8KLQliZSBkZWxldGUuCi0KLQlVcGRhdGUgZm9yIGF1dG9jb25mIDEuMTE4OgotCSogZ2RiaW5pdC5pbjogTmV3IGZpbGUsIGNyZWF0ZWQgZnJvbSBvbGQgLmdkYmluaXQuCi0JKiAuZ2RiaW5pdDogRGVsZXRlZC4KLQkqIGFjbG9jYWwubTQgKEdBU19HREJJTklUKTogRGVsZXRlZC4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdXNlIGl0LiAgSW5zdGVhZCwgZ2VuZXJhdGUgLmdkYmluaXQgZnJvbQotCWdkYmluaXQuaW4uICBEb24ndCBzdWJzdGl0dXRlIGNwdV90eXBlLCBvYmpfZm9ybWF0LCBlbXVsYXRpb24sCi0JYXRvZi4gIFN3aXRjaGVkIG9yZGVyIG9mIEFDX0xJTktfRklMRVMgYXJndW1lbnRzLiAgVXNlIEFDX1BSRVJFUQotCXRvIGVuc3VyZSB0aGF0IG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mIGFyZW4ndCB1c2VkLgotCSogTWFrZWZpbGUuaW46IEFkZGVkIEBjb25maWd1cmVfaW5wdXRAIGxpbmUuCi0JKGNvbmZpZ3VyZSk6IERlbGV0ZWQgcnVsZS4KLQotVHVlIFNlcCAxMyAxMjowODoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQWZ0ZXIgaGFuZGxpbmcgdGhlIGRpZmZlcmVuY2UKLQlvZiB0d28gc3ltYm9scyBmcm9tIHRoZSBzYW1lIHNlZ21lbnQsIHNldCBmeF9zdWJzeSB0byBOVUxMLCB0bwotCXNhdGlzZnkgZXhpc3RpbmcgVENfQ09VTlRfUkVMT0MgbWFjcm9zLgotCi1UdWUgU2VwIDEzIDAxOjQ3OjA4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFjbG9jYWwubTQgKEdBU19HREJJTklUKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLmluOiBVc2UgaXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1Nb24gU2VwIDEyIDIwOjU2OjM4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbSkKLQotCSogLmdkYmluaXQgKHBlLCBwcyk6IERlZmluZSBuZXcgY29tbWFuZHMuCi0JKiBzeW1ib2xzLmMgKGluZGVudF9sZXZlbCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGluZGVudCwgcHJpbnRfZXhwcl8xLCBwcmludF9zeW1ib2xfdmFsdWVfMSwgcHJpbnRfc3ltYm9sX3ZhbHVlLAotCXByaW50X2V4cHIpOiBOZXcgZnVuY3Rpb25zLgotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLXN0YW1wKTogQWRkIGEgInRoaXMgZmlsZSBnZW5lcmF0ZWQgYnkgbWFrZSIKLQltZXNzYWdlIHRvIGNvbmZpZy5oLgotCi0JUElDIGltcGxlbWVudGF0aW9uIGZvciBpMzg2LWxpbnV4LCBiYXNlZCBvbiBjb2RlIGZyb20gRXJpYwotCVlvdW5nZGFsZSBhbmQgUGF1bCBLcmFuZW5idXJnLCB3aXRoIHNvbWUgd29yayBvZiBteSBvd246Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBUZXN0IFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCBvbiBmaXh1cAotCWJlZm9yZSBwcm9jZXNzaW5nIHNhbWUtc2VjdGlvbiBwY3JlbCByZWxvY2F0aW9ucy4KLQkoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmYXVsdCB0byAxLgotCi0JKiBleHByLmMgKG1ha2VfZXhwcl9zeW1ib2wpOiBJZiBvcGVyYXRvciBpcyBPX3N5bWJvbCBhbmQKLQlYX2FkZF9udW1iZXIgaXMgemVybywganVzdCByZXR1cm4gdGhlIHN5bWJvbC4gIElmIG9wZXJhdG9yIGlzCi0JT19jb25zdGFudCwgcmVzb2x2ZSB0aGUgc3ltYm9sJ3MgdmFsdWUgYmVmb3JlIHJldHVybmluZy4KLQkob3BlcmFuZCk6IFBlcm1pdCB1c2Ugb2YgIltdIiBmb3IgZ3JvdXBpbmcuCi0JKGNsZWFuX3VwX2V4cHJlc3Npb24pOiBGb3IgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiB0aGUgc2FtZQotCWZyYWcsIGFkZCB0aGUgZGlmZmVyZW5jZSBvZiB0aGVpciBvZmZzZXRzIGludG8gWF9hZGRfbnVtYmVyLgotCShleHByKTogUmVkdWNlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gc2FtZSBmcmFnIHRvIHRoZWlyCi0JZGlmZmVyZW5jZS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoVENfUkVMT0MpOiBOZXcgbWFjcm8uCi0JKHN0cnVjdCBfaTM4Nl9pbnNuKTogTmV3IGZpZWxkIGRpc3BfcmVsb2MuCi0JKEdPVF9zeW1ib2wpOiBOZXcgdmFyaWFibGUuCi0JKG9wZXJhbmRfc3BlY2lhbF9jaGFycyk6IEFkZGVkIHNxdWFyZS1icmFja2V0cyBhbmQgYXQtc2lnbi4KLQkocmVsb2MpIFtCRkRfQVNTRU1CTEVSXTogQWRkZWQgbmV3IGFyZ3VtZW50IE9USEVSOyBpZiBpdCBpcyBub3QKLQlOT19SRUxPQywganVzdCByZXR1cm4gaXQuCi0JKHJlbG9jKSBbISBCRkRfQVNTRU1CTEVSXTogQWRkIHRoaXJkIGFyZ3VtZW50IHRvIGR1bW15IG1hY3JvLgotCShCRkRfUkVMT0NfMzg2X1BMVDMyLCBfR09UMzIsIF9HT1RPRkYpIFshIEJGRF9BU1NFTUJMRVJdOiBNb3JlCi0JZHVtbXkgbWFjcm9zLgotCSh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogTmV3IGZ1bmN0aW9uLiAgUmV0dXJucyB6ZXJvIGlmIHN5bWJvbCBpbgotCWZpeHVwIGlzIG5vdCBsb2NhbCwgdG8gcHJldmVudCByZWxvY2F0aW9ucyBhZ2FpbnN0IGV4dGVybmFscyBmcm9tCi0JYmVpbmcgZHJvcHBlZC4KLQkobWRfYXNzZW1ibGUpOiBJbml0aWFsaXplIGRpc3BfcmVsb2MgZmllbGQgdG8gTk9fUkVMT0MuICBQYXNzCi0JZGlzcF9yZWxvYyBmaWVsZCB0byByZWxvYygpIGZ1bmN0aW9uLCBhbmQgdXNlIFRDX1JFTE9DIHRvIGdlbmVyYXRlCi0JdmFsdWUgdG8gcGFzcyB0byBmaXhfbmV3X2V4cC4KLQkobWRfYXNzZW1ibGUpOiBDaGFuZ2UgMzItYml0IHJlbG9jIGFnYWluc3QgR09UX3N5bWJvbCBpbnRvIGEgR09UUEMKLQlyZWxvYy4KLQkoaTM4Nl9vcGVyYW5kKTogSW5pdGlhbGl6ZSBkaXNwX3JlbG9jIGZpZWxkIHRvIE5PX1JFTE9DLiAgSGFuZGxlCi0JQEdPVE9GRiwgQFBMVCwgQEdPVCBvcGVyYW5kcy4gIEZvciBHT1RPRkYgcmVsb2NhdGlvbnMgd2l0aCBsb2NhbAotCXN5bWJvbHMsIGZvcmNlIGdlbmVyYXRpb24gb2YgdGhlIHNlY3Rpb24gc3ltYm9sLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IElmIEdPVF9zeW1ib2wgZXhpc3RzLCBkZWNpZGUKLQl3ZSdyZSBnZW5lcmF0aW5nIFBJQyBjb2RlLCBhbmQgY29udmVydCByZWxvY2F0aW9ucyBhZ2FpbnN0Ci0JdW5kZWZpbmVkIHN5bWJvbHMgZnJvbSBQQ1JFTCB0byBQTFQzMi4KLQkobWRfYXBwbHlfZml4XzEpIFtPQkpfRUxGXTogRml4IHVwIHZhbHVlcyBmb3IgZHluYW1pYy1saW5raW5nCi0JcmVsb2NzLgotCShtZF91bmRlZmluZWRfc3ltYm9sKTogTm90aWNlIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSBhbmQgc2V0Ci0JYW5kIHJldHVybiBHT1Rfc3ltYm9sIGlmIGl0IG1hdGNoZXMuCi0JKEYsIE1BUCk6IE1vdmUgbWFjcm8gZGVmaW5pdGlvbnMgb3V0c2lkZSBmdW5jdGlvbi4KLQkodGNfZ2VuX3JlbG9jKTogT25seSBzd2l0Y2ggb24gc2l6ZSBhbmQgcGNyZWwgaWYgY29kZSB3YXNuJ3QKLQlhbHJlYWR5IHN1cHBsaWVkIGFzIFBMVDMyLiBHT1QzMiwgR09UT0ZGLCBvciBHT1RQQy4gIENvbnZlcnQKLQlCRkRfUkVMT0NfMzIgdXNpbmcgR09UX3N5bWJvbCBpbnRvIEdPVFBDLgotCSogY29uZmlnL3RjLWkzODYuaCAoVENfUkVMT0MsIHRjX2ZpeF9hZGp1c3RhYmxlLAotCVRDX1JFTE9DX0dMT0JBTF9PRkZTRVRfVEFCTEUsIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IE5ldwotCW1hY3Jvcy4KLQkoTkVFRF9GWF9SX1RZUEUpOiBEZWZpbmUuCi0JKExPQ0FMX0xBQkVMKTogQWNjZXB0ICIuWCIgcHJlZml4IHRvby4KLQkoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVmYXVsdCB0byAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIi4KLQotTW9uIFNlcCAxMiAxNzo1MTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdHlwZSk6IFJld3JpdGUgdG8gYWNjZXB0IHN5bnRheAotCXJlcG9ydGVkbHkgdG8gYmUgdXNlZCBvbiBJcml4IDYuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IEhhbmRsZSAuZ2xvYmwgYW5kIC5nbG9iYWwuCi0JKHNfbWlwc19nbG9ibCk6IE5ldyBzdGF0aWMgZnVuY3Rpb247IG5lZWRlZCBmb3IgSXJpeCA1IHN1cHBvcnQuCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogSWYgQlNGX0ZVTkNUSU9OIGlzIHNldCBmb3IgYW4KLQlleHRlcm5hbCBzeW1ib2wgd2l0aCBubyB0eXBlLCBzZXQgdGhlIHR5cGUgdG8gc3RfUHJvYyByYXRoZXIgdGhhbgotCXN0X0dsb2JhbC4gIERvbid0IHNldCB0aGUgaW5kZXggb2YgYW4gZXh0ZXJuYWwgc3RfUHJvYyBvcgotCXN0X1N0YXRpY1Byb2Mgc3ltYm9sIHVubGVzcyBpdCBpcyBhbHNvIGEgbG9jYWwgc3ltYm9sLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYXNfd2hlcmUgaXMKLQl1bnNpZ25lZCBpbnQgKiwgbm90IGludCAqLgotCi1UaHUgU2VwICA4IDE3OjE4OjI0IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCA6IENoYW5nZSBuYW1lcyB0byAgT0JKX0dFTkVSQVRFX0FTTV9MSU5FTk8sCi0JYW5kIGdlbmVyYXRlX2FzbV9saW5lbm8uCi0JKiBjb25maWcvb2JqLWVsZi5oIDogZGl0dG8uCi0JKiByZWFkLmggOiBkaXR0by4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogaWYgbm8gZmlsZSB3aGVuIGluc3QgaXMgcmVhZCwgc2V0Ci0JZ2VuZXJhdGVfYXNtX2xpbmVubyB0byB0cnVlLgotCSogZWNvZmYuaCA6IGNoYW5nZSBuYW1lIHRvIGdlbmVyYXRlX2FzbV9saW5lbm8gYW5kIGFkZCBmdW5jdGlvbgotCWVjb2ZmX25vX2N1cnJlbnRfZmlsZS4KLQkqIGVjb2ZmLmMgOiBjaGFuZ2UgbmFtZSB0byBnZW5lcmF0ZV9hc21fbGluZW5vLgotCSogZWNvZmYuYyAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubykgOiBuZXcgZnVuY3Rpb24sIHRvIGdlbmVyYXRlCi0JZWNvZmYgc3R5bGUgbGluZSBmb3IgYXNtIGZpbGUuCi0KLVRodSBTZXAgIDggMTk6NDM6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc2l6ZV9zZWN0aW9uKTogRG8gYW4gZnByaW50ZiB0byBzdGRlcnIgcmF0aGVyCi0JdGhhbiBhIHByaW50Zi4KLQkoZml4dXBfc2VnbWVudCk6IFVzZSBhc19iYWRfd2hlcmUgcmF0aGVyIHRoYW4gYXNfYmFkLgotCi1XZWQgU2VwICA3IDE3OjIxOjEyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy17aDgzMDAsc2h9LltjaF0gKHRjX2NvZmZfc3ltYm9sX2VtaXQpOiBGdW5jdGlvbiBkb2luZwotCW5vdGhpbmcgYmVjb21lcyBtYWNybyBkb2luZyBub3RoaW5nLgotCi1XZWQgU2VwICA3IDE5OjEwOjA5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IERlcGVuZCBvbiBjb25maWcuc3RhdHVzLgotCShjb25maWcuc3RhdHVzKTogUnVuIGNvbmZpZy5zdGF0dXMgZnJvbSAuIGluc3RlYWQgb2Ygc3JjZGlyLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19nZW5fcmVsb2MpOiBVc2UgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgdG8KLQlkaXNwbGF5IHRoZSBuYW1lIG9mIHRoZSByZWxvY2F0aW9uIHR5cGUgdGhhdCBjb3VsZG4ndCBiZSBoYW5kbGVkLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWFscGhhLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLiAgRGVsZXRlZCBhYm9ydCBjYWxsCi0JYWZ0ZXIgY2FsbCB0byBhc19mYXRhbC4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbGludXgqKTogRG9uJ3Qgc2V0IGJmZF9nYXMuCi0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VULCBOTV9GT1JfVEFSR0VULCBPQkpEVU1QX0ZPUl9UQVJHRVQsCi0JaW5zdGFsbCwgdW5pbnN0YWxsKTogRG9uJ3QgdXNlICJicm9rZW5zZWQiIGhhY2sgYW55IG1vcmUsIHRoZSBuZXcKLQlhdXRvY29uZiBjb2RlIHNob3VsZCBuZXZlciBsZXQgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBiZSBlbXB0eS4KLQotCVVwZGF0ZSBmb3IgYXV0b2NvbmYgYmV0YSAxLjExMjoKLQkqIGFjbG9jYWwubTQgKEdBU19DSEVDS19ERUNMX05FRURFRCwgR0FTX1dPUktJTkdfQVNTRVJUKTogTmV3Ci0JbWFjcm9zLgotCSogY29uZmlndXJlLmluOiBVc2UgdGhlbS4gIFVzZSBBQ19BUkdfUFJPR1JBTSAobm93IHByb3ZpZGVkIGJ5Ci0JYXV0b2NvbmYpIGluc3RlYWQgb2YgbXkgaGFja2VkLXVwIEFDX1BST0dSQU1fVFJBTlNGT1JNX05BTUUuICBNb3ZlCi0JdGVzdCBmb3IgQ1JPU1NfQ09NUElMRSBqdXN0IGJlZm9yZSBBQ19GVU5DX0FMTE9DQSwgYW5kIGVtaXQgYQotCW1lc3NhZ2UgdG8gdHJ5IHRvIGVhc2UgY29uZnVzaW9uIGFib3V0IGF1dG9jb25mJ3MKLQkiY3Jvc3MtY29tcGlsaW5nIiBtZXNzYWdlLgotCSogYWNjb25maWcuaCAoTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MsIE5FRURfREVDTEFSQVRJT05fRlJFRSwKLQlORUVEX0RFQ0xBUkFUSU9OX0VSUk5PKTogUmVuYW1lZCBmcm9tIE5FRURfKl9ERUNMQVJBVElPTi4KLQkqIGNvbmZpZ3VyZSwgY29uZi5pbjogUmVnZW5lcmF0ZWQuCi0KLVdlZCBTZXAgIDcgMTI6NDk6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoZWNrICR7aG9zdH0gYW5kICR7dGFyZ2V0fSByYXRoZXIgdGhhbgotCSR7aG9zdF9jYW5vbn0gYW5kICR7dGFyZ2V0X2Nhbm9ufS4KLQkqIGNvbmZpZ3VyZTogTGlrZXdpc2UuCi0KLVR1ZSBTZXAgIDYgMTE6NDI6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2NwdSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGluc25zX3NpbmNlX2NhY2hlX2FjY2Vzcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2JlZ2luKTogU2V0IG1pcHNfY3B1IGFzIHdlbGwgYXMgbWlwc19pc2EuCi0JKGFwcGVuZF9pbnNuKTogSWYgbWlwc19jcHUgaXMgNDYwMCwgcmVxdWlyZSBmb3VyIG5vcCBpbnN0cnVjdGlvbnMKLQliZXR3ZWVuIGFuIGluc3RydWN0aW9uIHdoaWNoIGFjY2Vzc2VzIHRoZSBjYWNoZSBhbmQgY2VydGFpbiBDQUNIRQotCWluc3RydWN0aW9ucy4gIEtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgc2VlbiBzaW5jZQotCWFuIGluc3RydWN0aW9uIHdoaWNoIGFjY2Vzc2VzIHRoZSBjYWNoZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IG1pcHNfY3B1IGFzIHdlbGwgYXMgbWlwc19pc2EuCi0KLU1vbiBTZXAgIDUgMDc6MDk6MDAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoVlBBVEgpOiBEZWZpbmUgdXNpbmcgQHNyY2RpckAuCi0JKHByZWZpeCwgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSwgZXhlY19wcmVmaXgpOiBVc2UgYXV0b2NvbmYgc3R5bGUKLQlALXN1YnN0aXR1dGlvbnMuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogY29uZmlnL2hvLXJpc2NpeC5oLCBjb25maWcvdGMtYXJtLmMsIGNvbmZpZy90Yy1hcm0uaDogTmV3IGZpbGVzCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSB0aGUgYXJtLgotCi1GcmkgU2VwICAyIDE2OjA1OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoYWRkX2ZpbGUpOiBEb24ndCB0cnkgdG8gZ2VuZXJhdGUgbGluZSBudW1iZXJzIGlmIHRoZQotCXN5bWJvbCB0YWJsZSBoYXMgYmVlbiBmcm96ZW4uCi0KLVRodSBTZXAgIDEgMTk6NDg6MDEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYWNsb2NhbC5tNCAoQUNfUFJPR19DQyk6IFVzZSBBQ19ERUZVTiwgYW5kIG9taXQgQUNfUFJPVklERS4KLQotCSogY29uZmlndXJlLmluOiBIYW5kbGUgdXNlci1zcGVjaWZpZWQgYmZkLWFzc2VtYmxlciBvcHRpb24gd2l0aAotCXNlcGFyYXRlIHZhcmlhYmxlIGZyb20gcHJlZmVycmVkIGNvbmZpZ3VyYXRpb24sIHVudGlsIHRoZSB0d28gYXJlCi0JcmVzb2x2ZWQuICBJbmRpY2F0ZSBiZmRfZ2FzPXByZWZlcnJlZCBmb3IgbGludXggYS5vdXQuICBVc2UKLQlBQ19QUk9HUkFNX1RSQU5TRk9STV9OQU1FLCBmb3Igd2hpY2ggYSBwYXRjaCBoYXMgYmVlbiBzZW50IHRvIGRqbS4KLQkqIE1ha2VmaWxlLmluICh0YXJnZXRfYWxpYXMsIHByb2dyYW1fdHJhbnNmb3JtX25hbWUpOiBEZWZpbmUsCi0JdXNpbmcgYXV0b2NvbmYgQC1zdWJzdGl0dXRpb25zLgotCi1XZWQgQXVnIDMxIDE3OjQzOjA2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGF0b2YtZ2VuZXJpYy5jOiBEZWxldGVkIGFsbG9jYSBoYW5kbGluZyBoZXJlLgotCi0JKiBNYWtlZmlsZS5pbiAocHJlZml4LCBleGVjX3ByZWZpeCk6IFVzZSBALXN1YnRpdHV0aW9ucy4KLQotCSogYWNsb2NhbC5tNCAoQUNfT1VUUFVUX0xJTktTKTogRGVsZXRlZCByZWRlZmluaXRpb24sIHNpbmNlCi0JYXV0b2NvbmYgMS4xMDkgaGFzIHRoaXMgZml4ZWQuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNoYW5nZSBxdW90ZSBjaGFyYWN0ZXJzIGFyb3VuZCBBQ19NU0dfRVJST1IKLQlpbnZvY2F0aW9uLiAgRG9uJ3QgdXNlIEFDX0hFQURFUl9TVERDLCBzaW5jZSBpdCByZXF1aXJlcyBydW5uaW5nIGEKLQlwcm9ncmFtLiAgQ2FjaGUgTkVFRF8qX0RFQ0xBUkFUSU9OIHZhbHVlcy4KLQkqIGNvbmZpZ3VyZSwgY29uZi5pbjogUmVnZW5lcmF0ZWQgd2l0aCBhIG1vZGlmaWVkIGF1dG9jb25mIDEuMTA5LgotCi0JKiBhcy5oICh2b2xhdGlsZSk6IERvbid0IHRlc3Qgb3IgZGVmaW5lIGhlcmU7IG5vdCBuZWVkZWQuCi0JKGFsbG9jYSk6IFJlcGxhY2UgYWxsb2NhLWNvbmYuaCBpbmNsdXNpb24gd2l0aCBjb2RlIHJlY29tbWVuZGVkIGluCi0JYXV0b2NvbmYgZG9jdW1lbnRhdGlvbi4gIEluY2x1ZGUgY29uZmlnLmggZmlyc3QuCi0KLVdlZCBBdWcgMzEgMTE6MjA6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19ERUZJTkVEKTogQWJzb2x1dGUgc3ltYm9scyBhcmUgZGVmaW5lZAotCWFsc28uCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBJbml0aWFsaXplIGJmZF9nYXMgdG8gbm8uCi0KLVR1ZSBBdWcgMzAgMTk6MzE6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYXMuaDogSW5jbHVkZSBhbGxvY2EtY29uZi5oIGZyb20gImxpYmliZXJ0eSIsIG5vdAotCSIuLi9saWJpYmVydHkiLgotCi1Nb24gQXVnIDI5IDE2OjExOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgpOiBEb24ndCBnZW5lcmF0ZSBhIHJlbG9jIHdoZW4gYQotCXN5bWJvbCBpcyB1c2VkIGFzIGFuIG9mZnNldCBpbnRvIGEgQ1NFQ1QgdGhhdCBpcyBub3QgYSBUT0MuICBUaGVzZQotCXR5cGVzIG9mIGxvYWRzIGFyZSBnZW5lcmF0ZWQgYnkgZ2NjIC1tbWluaW1hbC10b2MuCi0KLVN1biBBdWcgMjggMTM6MjI6NTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcy5oIChmbGFnXyopOiBBZGRlZCBjb21tZW50cyBkZXNjcmliaW5nIG1lYW5pbmdzIG9mIHNvbWUgb2YKLQl0aGVzZSB2YXJpYWJsZXMuCi0JKHN0cnVjdCBmcmFnKTogQWRkIHNvbWUgY29tbWVudHMgYWJvdXQgdGhlIG5zMzJrLXNwZWNpZmljIGZpZWxkcwotCWFuZCB3aHkgdGhleSdyZSBoZXJlLgotCShTSVpFT0ZfU1RSVUNUX0ZSQUcpOiBDYXN0IGFkZHJlc3NlcyB0byBjaGFyKiwgbm90IGludC4KLQkoZmxhZ19wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQotCSogYXMuYyAocGFyc2VfYXJncyk6IFNldCBmbGFnX3ByaW50X3N0YXRpc3RpY3MgaW5zdGVhZCBvZgotCXN0YXRpc3RpY3NfZmxhZy4gIE9wdGlvbnMgYXJyYXkgaXMgbm93IGNvbnN0LiAgQWRkZWQgbmV3IG9wdGlvbgotCSJkdW1wLWNvbmZpZyI7IGlmIHNwZWNpZmllZCwgcHJpbnQgVEFSR0VUX0FMSUFTLCBUQVJHRVRfQ0FOT05JQ0FMLAotCVRBUkdFVF9DUFUsIFRBUkdFVF9PQkpfRk9STUFULCBhbmQgVEFSR0VUX0ZPUk1BVCwgaWYgZGVmaW5lZC4KLQkobWFpbik6IENoYW5nZSB0ZXN0IHRvIGNoZWNrIGZsYWdfcHJpbnRfc3RhdGlzdGljcy4KLQkoc3RhdGlzdGljc19mbGFnKTogRGVsZXRlZC4KLQotCSogZnJhZ3MuYyAoZnJhZ192YXJpYW50KTogUmVtb3ZlZCBQQ1JFTF9BREpVU1QgYW5kIEJTUiBhcmd1bWVudHMuCi0JQWx3YXlzIGluaXRpYWxpemUgdGhlbSB0byB6ZXJvLgotCSogZnJhZ3MuaCAoZnJhZ192YXJpYW50KTogRml4ZWQgcHJvdG90eXBlLgotCSogY29uZmlnL3RjLWk5NjAuYyAoZ2V0X2NkaXNwKTogRG9uJ3QgcGFzcyB0aGUgZXh0cmEgemVybyBhcmdzLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKGNvbnZlcnRfaWlmKTogRG9uJ3QgcGFzcyB0aGUgYXJndW1lbnRzOyBjYWNoZQotCXRoZSB2YWx1ZSBvZiBmcmFnX25vdyBhbmQgZmlsbCBpbiB0aGUgZmllbGRzIGxhdGVyLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuLCByZWFsY2xlYW4pOiBSZW1vdmUgbmV3Ci0JY29uZmlndXJlLWdlbmVyYXRlZCBmaWxlcy4KLQotU2F0IEF1ZyAyNyAyMDoyNjoxMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20pCi0KLQlDb252ZXJzaW9uIHRvIGF1dG9jb25mOgotCSogYWNjb25maWcuaCwgYWNsb2NhbC5tNDogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmluOiBSZXdyaXR0ZW4gKGV4Y2VwdCBmb3Igc29tZSB0YXJnZXQtc3BlY2lmaWMgY29kZSkKLQlmb3IgYXV0b2NvbmYuCi0JKiBjb25mLmluLCBjb25maWd1cmU6IE5ldyBmaWxlcywgZ2VuZXJhdGVkIGZyb20gdGhlIGFib3ZlLgotCSogTWFrZWZpbGUuaW46IENoYW5nZWQgbWFnaWMgc2VxdWVuY2UgaW5kaWNhdGluZyBpbnNlcnRpb24gb2YKLQltYWtlZmlsZSBmcmFnbWVudHMuCi0JKFZQQVRILCBzcmNkaXIsIENDLCBMSUJTLCBPQkpTIGRlcGVuZGVuY2llcyk6IFVzZSBALXN1YnN0aXR1dGlvbnMKLQlmcm9tIGNvbmZpZ3VyZS4KLQkoTElOS0VEX0hFQURFUlMpOiBEZWxldGVkIGEub3V0LmdudS5oLCBhLm91dC5oLCBhbmQgaG9zdC5oLgotCShjb25maWcuc3RhdHVzLCBjb25maWd1cmUpOiBSZXdyaXRlIHJ1bGVzLgotCShjb25maWctc3RhbXApOiBEZXBlbmQgb24gY29uZi4gIFNraXAgdmFyaWFibGVzIHRoYXQgY29uZmlndXJlIGlzCi0Jbm93IHN1YnN0aXR1dGluZyBpdHNlbGYuCi0JKCoubyBkZXBlbmRlbmNpZXMpOiBEZWxldGVkIGhvc3QuaC4KLQkoZGlzdGNsZWFuLCByZWFsY2xlYW4pOiBEb24ndCBkZWxldGUgaG9zdC5oLgotCSogYXMuYzogRG9uJ3QgaW5jbHVkZSBzdGRpby5oLCBzdHJpbmcuaCwgc3lzL3R5cGVzLmguICBJbmNsdWRlCi0Jc2lnbmFsLmggYWZ0ZXIgYXMuaC4KLQkqIGFzLmg6IEluY2x1ZGUgYWxsb2NhLWNvbmYuaCBmaXJzdC4gIEluY2x1ZGUgY3R5cGUuaCwgc3RyaW5nLmgsCi0Jc3RyaW5ncy5oLCBzdGRsaWIuaCwgdW5pc3RkLmgsIHN5cy90eXBlcy5oLCBmb3Blbi1iaW4uaCwKLQlmb3Blbi1zYW1lLmgsIGFzIHN1Z2dlc3RlZCBieSBhdXRvY29uZiB0ZXN0IHJlc3VsdHMuCi0JW0JST0tFTl9BU1NFUlRdOiBEb24ndCBpbmNsdWRlIGFzc2VydC5oLgotCShzdHJkdXApOiBEZWNsYXJlLgotCSh2b2xhdGlsZSwgY29uc3QpOiBEZWZpbmUgaWYgbm90IF9fU1REQ19fIGFuZCBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShtYWxsb2MsIHJlYWxsb2MpIFtORUVEX01BTExPQ19ERUNMQVJBVElPTl06IERlY2xhcmUuCi0JKGZyZWUpIFtORUVEX0ZSRUVfREVDTEFSQVRJT05dOiBEZWNsYXJlLgotCSogZ2FzcC5jOiBJbmNsdWRlIGNvbmZpZy5oLCBzdGRsaWIuaCAoaWYgSEFWRV9TVERMSUJfSCkuICBEb24ndAotCWluY2x1ZGUgaG9zdC5oLgotCShtYWxsb2MpIFtORUVEX01BTExPQ19ERUNMQVJBVElPTl06IERlY2xhcmUuCi0JKiBtZXNzYWdlcy5jOiBJbmNsdWRlIGFzLmggZmlyc3QuICBJbmNsdWRlIGVycm5vLmggb25seSBpZgotCUhBVkVfRVJSTk9fSC4gIElmIEhBVkVfVkFSQVJHU19IIGFuZCBub3QgX19TVERDX18sIHVuZGVmaW5lCi0JSEFWRV9TVERBUkdfSC4gIFNldCBOT19TVERBUkcgYW5kIE5PX1ZBUkFSR1MgYXMgYXBwcm9wcmlhdGUuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKHNyY2RpciwgSU5TVEFMTCwgSU5TVEFMTF9QUk9HUkFNLAotCUlOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZiBALXN1YnN0aXR1dGlvbnMuCi0KLQkqIGlucHV0LWZpbGUuYzogRG9uJ3QgaW5jbHVkZSBhc3NlcnQuaCBoZXJlLCAnY2F1c2UgYXMuaCBhbHJlYWR5Ci0JaW5jbHVkZXMgaXQuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBBZGRlZCB2YXJpb3VzIHByb3RvdHlwZXMgZm9yIHN0YXRpYwotCWZ1bmN0aW9ucy4KLQkoaW5fcmFuZ2UpOiBOZXcgZnVuY3Rpb24sIHRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBjYW4gZml0IGluIGFuCi0JTi1iaXQgZmllbGQuCi0JKGJ1aWxkX21lbSwgYnVpbGRfb3BlcmF0ZV9uKTogTmV3IGZ1bmN0aW9ucyBmb3IgY29uc3RydWN0aW5nCi0Jb3Bjb2RlIHZhbHVlcy4KLQkoZW1pdF9zbGxfbiwgZW1pdF9sZGFoX251bSwgZW1pdF9hZGRxX3IsIGVtaXRfbGRhX24pOiBOZXcKLQlmdW5jdGlvbnMgZm9yIGVtaXR0aW5nIHNpbmdsZSBpbnN0cnVjdGlvbnMsIG5vIGxvbmdlciByZXF1aXJpbmcgYQotCXJlY3Vyc2l2ZSBjYWxsIHRvIG1kX2Fzc2VtYmxlLgotCShlbWl0X2FkZDY0KTogTmV3IGZ1bmN0aW9uIGZvciBleHBhbmRpbmcgYSBSRUc6PVJFRytDT05TVAotCW9wZXJhdGlvbiBpbnRvIG9uZSBvciBtb3JlIGluc3RydWN0aW9ucywgdG8gaGFuZGxlIHdpZGUgY29uc3RhbnRzLgotCShjbGVhcl9pbnNuKTogTmV3IHZhcmlhYmxlLgotCShtZF9iZWdpbik6IEZpbGwgaXQgaW4gd2l0aCB6ZXJvcyBhbmQgQkZEX1JFTE9DX05PTkUgdmFsdWVzLgotCShhbHBoYV9pcCk6IFVzZSBpdCB0byBpbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlIGluc25zLgotCShhbHBoYV9pcCwgbGFiZWwgImltbWVkaWF0ZSIgYW5kIGNhc2VzICdQJywgJ0cnKTogVXNlIGVtaXRfYWRkNjQKLQlmb3IgY2FsY3VsYXRpb25zLgotCi1GcmkgQXVnIDI2IDE0OjQ2OjE1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IFJldmVyc2Ugc3RpbGwtd3JvbmcgdGVzdCBvZgotCUVNSVRfU0VDVElPTl9TWU1CT0xTLgotCi0JKiB3cml0ZS5jIChCRkRfRkFTVF9TRUNUSU9OX0ZJTEwpOiBBbHdheXMgZGVmaW5lLgotCSh3cml0ZV9jb250ZW50cyk6IElmIGZpbGxfc2l6ZSBpcyAxLCB1c2UgbWVtc2V0IGluc3RlYWQgb2YgbG9vcGluZwotCWNhbGxpbmcgbWVtY3B5LgotCi1XZWQgQXVnIDI0IDEyOjQ2OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUwpOiBEZWZpbmUgYXMgMCwgZm9yIGNvbXBhdGliaWxpdHkKLQl3aXRoIG5hdGl2ZSBNSVBTIGFzc2VtYmxlci4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWlyaXgqKTogRG9uJ3Qgc2V0IGVtdWxhdGlvbi4KLQkqIGNvbmZpZy90ZS1pcml4Lmg6IFJlbW92ZS4KLQotCSogZWNvZmYuYyAoZWNvZmZfc3ltYm9sX25ld19ob29rKTogRG9uJ3QgYWRkIGEgbmV3IGZpbGUgaWYgd2UKLQloYXZlbid0IHNlZW4gYW55IGlucHV0IGZpbGVzIHlldC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9iZWdpbik6IEp1c3QgY2FsbCBzeW1ib2xfY3JlYXRlLCByYXRoZXIKLQl0aGFuIGNhbGxpbmcgc3ltYm9sX25ldyBhbmQgdGhlbiByZW1vdmluZyB0aGUgc3ltYm9sIGZyb20gdGhlCi0JbGlzdC4KLQotCSogYXMuYyAobWFpbik6IE1vdmUgYSBpbnNpZGUgdGhlICNpZiAwIGJsb2NrIHdoaWNoIHVzZXMgaXQuCi0JKiBlY29mZi5jIChjdXJyZW50X3N0YWJzX2ZpbGVuYW1lKTogTWFrZSBjb25zdC4KLQkqIGZyYWdzLmggKGZyYWdfYWxpZ25fcGF0dGVybik6IERlY2xhcmUuCi0JKiBnYXNwLmMgKG5ld19maWxlKTogQ2FzdCBpc3AgdG8gbG9uZywgYW5kIHVzZSAlbGQgdG8gcHJpbnQgaXQuCi0JKiBjb25maWcvdGMtYWxwaGEuaCAobWRfb3BlcmFuZCk6IEFkZCBjYXN0IHRvIHZvaWQuCi0JKGFscGhhX2RvX2FsaWduKTogRGVjbGFyZSBhcmd1bWVudCB0eXBlcy4KLQkodGNfZ2V0X3JlZ2lzdGVyKTogRGVjbGFyZS4KLQkoYWxwaGFfZnJvYl9lY29mZl9kYXRhKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkoc19tYXNrKTogRG9uJ3QgZGVjbGFyZTsgZG9lcyBub3QgZXhpc3QuCi0JKGxpbmVfY29tbWVudF9jaGFycyk6IFJlbW92ZSAvKiBmcm9tIGRlc2NyaXB0aXZlIGNvbW1lbnQuCi0JKHRjX2dldF9yZWdpc3Rlcik6IFJlbW92ZSB1bnVzZWQgbG9jYWwgcmVnLgotCSh0Y19nZW5fcmVsb2MpOiBEb24ndCBib3RoZXIgdG8gY29tcGFyZSB1bnNpZ25lZCB0byB6ZXJvLgotCShzX2Jhc2UpOiBDb3JyZWN0IHdhcm5pbmcgdG8gYWN0dWFsbHkgcHJpbnQgcmVnaXN0ZXIgbnVtYmVyLgotCShtZF9iZWdpbik6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIHJldHZhbCwgbG9zZSwgYW5kIGkuCi0JKGFscGhhX2ZpeF9hZGp1c3RhYmxlKTogTW92ZSBkZWZhdWx0IGNhc2UgaW5zaWRlIHN3aXRjaCB0byBhdm9pZAotCXdhcm5pbmcuCi0JKGxvYWRfc3ltYm9sX2FkZHJlc3MpOiBSZW1vdmUgdW51c2VkIGxvY2FscyByZWxvY19hZGRyLCBwLCBzeW0sCi0JYW5kIGFkZGVuZC4KLQkoZW1pdF9ieXRlX21hbmlwX3IpOiBEZWNsYXJlIHR5cGVzIGZvciBhbGwgYXJndW1lbnRzLgotCShlbWl0X2V4dHJhY3RfciwgZW1pdF9pbnNlcnRfciwgZW1pdF9tYXNrX3IpOiBMaWtld2lzZS4KLQkoZW1pdF9zaWduX2V4dGVuZCwgZW1pdF9iaXNfciwgc19wcm9jKTogTGlrZXdpc2UuCi0JKGFscGhhX2lwKTogVXNlIHNwcmludF92YWx1ZSB0byBwcmludCBvZmZzZXRUIHZhbHVlLiAgUmVtb3ZlCi0JdW51c2VkIGxvY2FsIHNpemUuICBSZW1vdmUgdW51c2VkIGxhYmVsIGdldF9tYWNyby4KLQkoYWxwaGFfZG9fYWxpZ24pOiBNYWtlIGZpbGwgY29uc3QuCi0JKG1kX2FwcGx5X2ZpeCk6IFJlbW92ZSB1bnVzZWQgbGFiZWwgY2hlY2tfem92LgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBpNTg2IGFzIGEgc3lub255bSBmb3IgaVszNF04Ni4KLQotVHVlIEF1ZyAyMyAxMjozMjoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX2xpbmVfbmV3KTogQ2hhbmdlIGxpbmVfbnVtYmVyIGFyZ3VtZW50IGZyb20KLQl1bnNpZ25lZCBzaG9ydCB0byBpbnQgc28gdGhhdCB0aGUgdHlwZSBpbiB0aGUgcHJvdG90eXBlIG1hdGNoZXMKLQl0aGUgcHJvbW90ZWQgdHlwZSBpbiB0aGUgZGVmaW5pdGlvbi4KLQkoc3RhY2tfZGVsZXRlKTogQ29tbWVudCBvdXQ7IG5vdCB1c2VkLgotCSogY29uZmlnL29iai1jb2ZmLmggKHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IERlY2xhcmUgaWYgbm90Ci0JQkZEX0FTU0VNQkxFUiwgbm90IGlmIEJGRF9BU1NFTUJMRVIuICBEZWNsYXJlIGFyZ3VtZW50IHR5cGUuCi0JKiBjb25maWcvdGMtbTY4ay5oICh0Y19jb2ZmX3NpemVtYWNoZGVwKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IEFkZCBpZ25vcmVkCi0JYXJndW1lbnQuCi0KLVR1ZSBBdWcgMTYgMDE6NDg6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9jb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogVW5kbyBsYXN0IGNoYW5nZS4gIFNldCBzeV9mcmFnIGZvcgotCXRoZSBjb21tb24gc3ltYm9sIHRvIHRoZSB6ZXJvIGFkZHJlc3MgZnJhZyAodGhlIGNvcnJlY3QgZml4KS4KLQotVHVlIEF1ZyAxNiAwMTo0ODoyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2NvbmZpZy90Yy1ocHBhLmMgKHBhX2NvbW0pOiBVbmRvIGxhc3QgY2hhbmdlLiAgU2V0IHN5X2ZyYWcgZm9yCi0JdGhlIGNvbW1vbiBzeW1ib2wgdG8gdGhlIHplcm8gYWRkcmVzcyBmcmFnICh0aGUgY29ycmVjdCBmaXgpLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogU2V0IHN5X3Jlc29sdmVkIGZvciB0aGUgY29tbW9uCi0Jc3ltYm9sLgotCi1GcmkgQXVnIDEyIDE3OjUxOjQ4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBEcm9wICJlbCIgZnJvbSB0aGUgZW5kIG9mCi0JVEFSR0VUX0NQVS4gIENoZWNrIGZvciBtaXBzNjRvcmlvbi4KLQotVHVlIEF1ZyAgOSAxOTo0Mzo0NSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgcHBjLSotbmV0d2FyZS4KLQkqIGNvbmZpZy90ZS1wcGNudy5oOiAgTmV3IGZpbGUgdG8gc3VwcG9ydCBQb3dlci1QQy9OZXR3YXJlCi0JY29uZmlndXJhdGlvbnMuICBDdXJyZW50bHksIGl0IGp1c3QgZW5hYmxlcyB0aGUgdXNlIG9mIGJhY2tzbGFzaAotCWVzY2FwZXMgaW4gc3RyaW5nIGRpcmVjdGl2ZXMuCi0KLVR1ZSBBdWcgIDkgMTE6MTI6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19zdGFieCk6IENhbGwgZXhwcmVzc2lvbiBkaXJlY3RseSwgcmF0aGVyCi0JdGhhbiB2aWEgcHNldWRvX3NldC4gIElmIGV4cHJlc3Npb24gaXMgYSBzeW1ib2wsIG1vdmUgc3RhYiBzeW1ib2wKLQl0byBqdXN0IGFmdGVyIHN5bWJvbCBmcm9tIGV4cHJlc3Npb24uCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3Byb2NzKTogRG9uJ3QgZm9yY2UgYWRyIG9mIGZpcnN0IGZkciB0byBiZQotCXplcm8uICBVbmRvZXMgY2hhbmdlIG9mIEp1bmUgNCwgMTk5My4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IC1tY3B1PTQ0MDAsIDQ2MDAsIGFuZAotCW9yaW9uLgotCi1Nb24gQXVnICA4IDE2OjI4OjA4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGFzLmg6IFJlbW92ZSBGT1BFTl9XQiBwYXRjaCBvZiBBdWcgNi4KLQkqIGNvbmZpZ3VyZS5pbjogQ29uZmlndXJlIGZvciBoby1nbzMyIGNvcnJlY3RseS4KLQkqIGNvbmZpZy9oby1nbzMyLmg6IEZpeCBjb3B5cmlnaHQuCi0KLU1vbiBBdWcgIDggMTE6NTk6NTEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9jb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBEZWxldGUgcmVkdW5kYW50Ci0JdXBwZXItY2FzZSB2ZXJzaW9ucyBvZiB0aGUgcHNldWRvLW9wcy4KLQotTW9uIEF1ZyAgOCAxMzo0MjoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgpOiBJZiB3ZSBhcmUgZ29pbmcgdG8gZ2VuZXJhdGUgYQotCW5vbiBQQyByZWxhdGl2ZSByZWxvYywgZG9uJ3QgcHV0IHRoZSBhZGRlbmQgaW4gdGhlIG9iamVjdCBmaWxlLgotCi1TYXQgQXVnICA2IDAxOjE1OjAyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGFzLmg6IElmIEZPUEVOX1dCIGlzIG5vdCBkZWZpbmVkLCBkbyB0aGUgcmlnaHQgdGhpbmcgaW4gYSBnbzMyCi0JZW52aXJvbm1lbnQuCi0KLU1vbiBKdWwgMTEgMTE6MzQ6NTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKHBpbnQpOiBOZXcgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHZhcnlpbmcKLQlzaXplIG9mIGludCBwc2V1ZG8gb3AuCi0JKiBkb2MvYXMudGV4aW5mbzogRml4IHR5cG8gZGVzY3JpYmluZyAuaDgzMDBoIHBzZWR1b3AuCi0KLU1vbiBBdWcgIDEgMDI6NDA6NDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGNyZWF0ZV9uZXdfc3BhY2UpOiBJbml0aWFsaXplIHNkX3N1YnNwYWNlcwotCWZpZWxkIGluIHRoZSBzcGFjZSBjaGFpbi4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbQotCWhwcGFfZ2VuX3JlbG9jX3R5cGUuCi0KLVRodSBKdWwgMjggMTU6NDU6MzcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQ2hlY2sgbW9yZSBjYXJlZnVsbHkgZm9yCi0JY29uZmxpY3RpbmcgYXJjaGl0ZWN0dXJlcy4KLQkobWRfcGFyc2Vfb3B0aW9uKSBbTk9fVjldOiBDb21wbGFpbiBpZiB2OSB3YXMgc2VsZWN0ZWQuCi0JKG1kX3Nob3dfdXNhZ2UpOiBEZXJpdmUgYXJjaGl0ZWN0dXJlIGxpc3QgaW4gdXNhZ2UgbWVzc2FnZSBmcm9tCi0JYXJjaGl0ZWN0dXJlX3BuYW1lIGFycmF5LgotCShjeXByZXNzKTogTWFjcm8gZGVsZXRlZC4KLQkob3BfaGFzaCk6IERvbid0IGluaXRpYWxpemUuCi0JKHNfY29tbW9uKTogVXNlIGJmZF91bmRfc2VjdGlvbl9wdHIgaW5zdGVhZCBvZiBiZmRfdW5kX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChCU1IpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2lwKTogVXNlIGl0IGZvciByaWdodC1zaGlmdCBvcGVyYXRpb25zIG9mIDMyIGJpdHMgb3IgbW9yZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogSW1wbGVtZW50IG5ldyBvcGVyYW5kIHR5cGUgJ3gnLgotCi1UdWUgSnVsIDI2IDE4OjIxOjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBNb3ZlZCBjb21tb24gaW5jbHVkZXMgYW5kIFRBUkdFVF9GT1JNQVQKLQlkZWZpbml0aW9ucyB0b2dldGhlci4KLQkoV09SS0lOR19ET1RfV09SRCwgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRCwKLQlPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUiwgQkZEX0hFQURFUlMsIEJGRCkgWyFCRkRfQVNTRU1CTEVSXToKLQlNb3ZlZCB0aGVzZSBkZWZpbml0aW9ucyB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIGJlZm9yZSB0aGUKLQlpbmNsdWRlcy4KLQkoU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUywgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMpOiBBbHdheXMKLQlkZWZpbmUgdGhlc2UuCi0JKFNfR0VUX1pFUk9FUyk6IERlbGV0ZWQuCi0JKFNfU0VUX1pFUk9FUyk6IE1vdmVkIHRvIG9iai1jb2ZmLmMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl8qIHBzdWVkby1vcCBmbnMpOiBEZWxldGVkCi0JZm9yd2FyZCBkZWNsYXJhdGlvbnMuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBNb3ZlZCB0byBvbmUgdmVyc2lvbiBlbmQgb2YgZmlsZSwKLQljb25kaXRpb25hbGl6ZWQgaW50ZXJuYWxseS4KLQkoc3RhY2sgdHlwZWRlZiwgc3RhY2tfaW5pdCwgc3RhY2tfZGVsZXRlLCBzdGFja19wdXNoLCBzdGFja19wb3AsCi0JdGFnX2hhc2gsIHRhZ19pbml0LCB0YWdfaW5zZXJ0LCB0YWdfZmluZCwgdGFnX2ZpbmRfb3JfbWFrZSk6IE1vdmVkCi0JdG8gb25lIGNvbWJpbmVkIHZlcnNpb24gYXQgdG9wIG9mIGZpbGUsIHVuY29uZGl0aW9uYWwuICBEZWxldGVkCi0JZm9yd2FyZCBkZWNsYXJhdGlvbnMuCi0JKHNfZ2V0X25hbWUpOiBNb3ZlZCBvbmUgY29weSBvZiBkZWNsYXJhdGlvbnMgdG8gc3RhcnQgb2YgZmlsZS4KLQkoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk6IERpdHRvLiAgRG9uJ3QgaW5pdGlhbGl6ZS4KLQkoU19TRVRfWkVST0VTKTogTW92ZWQgaGVyZSBmcm9tIG9iai1jb2ZmLmguCi0JKHdyaXRlX29iamVjdF9maWxlKTogSWYgVENfQ09GRl9TRVRfTUFDSElORSBpcyBkZWZpbmVkLCBjYWxsIGl0IG9uCi0JdGhlIGZpbGUgaGVhZGVycy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHNlZ19pbmZvX29mZl9ieV80KTogTm93IGNvbnN0IGFuZCBzdGF0aWMuCi0JKFNFR19JTkZPX0ZST01fU0VHX05VTUJFUik6IFVudXNlZCBtYWNybyBkZWxldGVkLgotCShwcmV2aW91c19maWxlX3N5bWJvbCwgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX2V4dGVyblAsCi0Jc3ltYm9sX2V4dGVybl9sYXN0UCwgbGFzdF9mdW5jdGlvblApIFshQkZEX0FTU0VNQkxFUl06IERvbid0Ci0JYm90aGVyIGV4cGxpY2l0bHkgaW5pdGlhbGl6aW5nIHRvIHplcm8gdmFsdWUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KSBbVENfSTk2MF06IFVzZSBTRl9HRVRfQkFMTkFNRQotCWFuZCBTRl9HRVRfQ0FMTE5BTUUgaW5zdGVhZCBvZiB0aGUgVENfU19JU18gdmVyc2lvbnMuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmggKFRDX0NPRkZfU0VUX01BQ0hJTkUpOiBOZXcgbWFjcm8uICBDYWxscwotCXRjX2hlYWRlcnNfaG9vay4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAodGFyZ19oYXNfaWNsYXNzKTogVXNlIElfQ1ggfCBJX0NYMiB3aGVyZSBJX0NYCi0Jd2FzIHVzZWQgcHJldmlvdXNseS4KLQkodGNfaGVhZGVyc19ob29rKTogSWYgSV9DWDIgaXMgZm91bmQsIHNldCBmbGFncyB0byBGX0k5NjBDQS4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAocG9faGFzaCk6IERlY2xhcmF0aW9uIGRlbGV0ZWQuCi0JKG5leHRfb2JqZWN0X2ZpbGVfY2hhclApOiBEaXR0by4KLQkocmVnbmFtZXMsIGFyZWdzLCBjb2opOiBOb3cgY29uc3QuCi0JKHBhcnNlX21lbW9wKTogU3RhdGljIGFycmF5IGRlZl9zY2FsZSBub3cgY29uc3QuCi0JKG1kX2JlZ2luKTogQ2FzdCBhd2F5IGNvbnN0IHdoZW4gcGFzc2luZyBoYXNoIHJvdXRpbmVzIGFkZHJlc3NlcwotCW9mIHZhbHVlcyBpbiByZWduYW1lcyBvciBhcmVncy4KLQkobWRfbG9uZ29wdHMpOiBBZGRlZCAibGluay1yZWxheCIgYW5kICJuby1yZWxheCIgaHlwaGVuYXRlZCBmb3Jtcy4KLQlDb250aW51ZSB0byBhY2NlcHQgb25lLXdvcmQgZm9ybXMuCi0JKHN0cnVjdCB0YWJlbnRyeSwgYXJjaF90YWIpOiBNb3ZlZCB0byB0b3AgbGV2ZWwgZnJvbSBpbnNpZGUKLQltZF9wYXJzZV9vcHRpb24uICBOb3cgY29uc3QuCi0JKG1kX3Nob3dfdXNhZ2UpOiBVc2UgYXJjaF90YWIgdG8gZ2VuZXJhdGUgdXNhZ2UgbWVzc2FnZS4gIFByaW50Ci0JaHlwaGVuYXRlZCBmb3JtcyBvZiByZWxheCBvcHRpb25zLgotCi0JKiBjb25maWcvdGMtaTk2MC5oIChERUZJTkVfSTk2MF9BT1VULCBUQ19TX0lTXyosIFRDX1NfKl9TWVNQUk9DLAotCVRDX1NfRk9SQ0VfVE9fKik6IE1vdmVkIGZyb20gaGVyZS4uLgotCSogY29uZmlnL3RjLWk5NjAuYzogLi4uIHRvIGhlcmUuICBDaGFuZ2VkIERFRklORV9JOTYwX0FPVVQgc3R1ZmYKLQl0byB0ZXN0IE9CSl9BT1VUIGFuZCBPQkpfQk9VVCBkaXJlY3RseS4KLQotCSogY29uZmlnL3RjLWk5NjAuaCAoQ1RSTCwgQ09CUiwgQ09KLCBSRUcsIE1FTSosIEZCUkEsIENBTExKLAotCU0xLU0zLCBSRUdfT1BDLCBSXyosIFNGUiwgTElULCBGUCwgT1AsIFIsIFJTLCBSTCwgUlNMLCBGLAotCXtSLEZ9eyxMfXsyLDR9LCBNLCBTRlJfT0ssIExJVF9PSywgRlBfT0ssIFJFR19BTElHTiwgTUVNT1AsIElfKik6Ci0JTWFjcm9zIGRlbGV0ZWQuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKEFSQ0hfSlgpOiBEZWZpbmUuCi0JKGFyY2hfdGFiKTogSW5jbHVkZSBKWC4KLQkodGFyZ19oYXNfc2ZyLCB0YXJnX2hhc19pY2xhc3MpOiBIYW5kbGUgSlguCi0JKHRjX2hlYWRlcnNfaG9vayk6IFNldCBmbGFncyB0byBGX0k5NjBKWCBmb3IgaTk2MEpYLgotCi1GcmkgSnVsIDE1IDE1OjM2OjUxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBIYWQgbGFzdCBjaGFuZ2UgYmFja3dhcmRzLgotCi1UaHUgSnVsIDE0IDEzOjIxOjA2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9hdG9mLW5zMzJrLmM6IERlbGV0ZWQuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFVzZQotCWJmZF9pbmRfc2VjdGlvbl9wdHIgYW5kIGJmZF91bmRfc2VjdGlvbl9wdHIuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogQ29tcGFyZSBzZWdUIHZhbHVlcyBkaXJlY3RseSwKLQl3aXRob3V0IGNhc3RpbmcgdG8gaW50IGZpcnN0LgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfYmVnaW4pOiBSZXR1cm4gdmFsdWUgZnJvbSBoYXNoX2luc2VydAotCXNob3VsZCBiZSBwb2ludGVyIHRvIGNvbnN0LiAgRG9uJ3QgY2FsbCBleGl0IGV4cGxpY2l0bHkgYWZ0ZXIKLQljYWxsaW5nIGFzX2ZhdGFsOyBpdCB3b24ndCByZXR1cm4uCi0JKGNvbnZlcnRfaWlmKTogTWFrZSBsb2NhbCB2YXJpYWJsZSBqIGJlIHBvaW50ZXIgdG8gYml0X2ZpeFMsIHNpbmNlCi0JdGhhdCdzIGhvdyBpdCdzIHVzZWQuCi0JKGVuY29kZV9vcGVyYW5kLCBjYXNlICdiJyk6IElnbm9yZSBzcHJpbnRmIHJldHVybiB2YWx1ZS4gIERvbid0IHRyeQotCWNvbnZlcnRpbmcgZnJlZXB0ciB0byBpbnQgYW5kIGJhY2suCi0KLQlNZXJnZWQgaW4gTlMzMksgc3VwcG9ydCB1cGRhdGUgZnJvbSBJYW4gRGFsbCAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KToKLQotCSogY29uZmlnL3RlLXBjNTMybWFjaC5oOiBOZXcgZmlsZS4gcGM1MzItbWFjaCB0YXJnZXQgZW11bGF0aW9uLgotCi0JKiBjb25maWcvdGUtbmV0YnNkNTMyLmg6IE5ldyBmaWxlLiBOZXRic2Q1MzIgdGFyZ2V0IGVtdWxhdGlvbi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmg6IEFkZCBkZWZpbml0aW9uIG9mIE5PUF9PUENPREUuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5oOiBBZGQgcHJvdG90eXBlIGZvciBmaXhfbmV3X25zMzJrX2V4cC4KLQotCSogY29uZmlnL3RjLW5zMzJrLmg6IEFkZCBCRkRfQVNTRU1CTEVSIHN1cHBvcnQuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jICh0Y19nZW5fcmVsb2MpOiBOZXcgZnVuY3Rpb24gZm9yIEJGRF9BU1NFTUJMRVIuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChmaXhfbmV3X25zMzJrX2V4cCk6IEdldCByZWxvYyB0eXBlCi0JZGlmZmVyZW50bHkgZm9yIEJGRF9BU1NFTUJMRVIuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEdldCByZWxvYwotCXR5cGUgZGlmZmVyZW50bHkgZm9yIEJGRF9BU1NFTUJMRVIuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9jcmVhdGVfbG9uZ19qdW1wKTogU2l6ZSBvZiBvcGNvZGUgaXMgb25lCi0Jbm90IDIuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBDb2RlIGZvciB0aGUgQkZEX0FTU0VNQkxFUgotCWNhc2UuIEFsc28gdXNlIHNtYXJ0IG1kX3BjcmVsX2FkanVzdCBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2FwcGx5X2ZpeCk6IENvZGUgZm9yIHRoZSBCRkRfQVNTRU1CTEVSCi0JY2FzZS4gQWxzbyB1c2Ugc21hcnQgbWRfZml4X3BjcmVsX2FkanVzdCBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2ZpeF9wY3JlbF9hZGp1c3QpOiBOZXcgZnVuY3Rpb24gd2hpY2ggY2FuCi0JZmluZCBvZmZzZXQgZnJvbSBvcGNvZGUgdG8gb3BlcmFuZCBldmVuIGlmIGluIGFub3RoZXIgZnJhZwotCWFuZCBpbiB0aGUgcHJlc2VuY2Ugb2YgcmVsYXhpbmcuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9wY3JlbF9hZGp1c3QpOiBOZXcgZnVuY3Rpb24gd2hpY2ggY2FuCi0JZmluZCBvZmZzZXQgZnJvbSBvcGNvZGUgdG8gb3BlcmFuZCBldmVuIGlmIGluIGFub3RoZXIgZnJhZwotCWFuZCBpbiB0aGUgcHJlc2VuY2Ugb2YgcmVsYXhpbmcuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9udW1iZXJfdG9fZGlzcCk6IENoZWNrIHJhbmdlcyBwcm9wZXJseS4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2F0b2YpOiB1c2UgYXRvZl9pZWVlIGluc3RlYWQgb2Ygc3BlY2lhbAotCWF0b2ZfbnMzMmsuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChyZWxvYyk6IE5ldyAoc3RhdGljKSBmdW5jdGlvbiBmb3IKLQlCRkRfQVNTRU1CTEVSLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoY29udmVydF9paWYpOiBNb3JlIGNvcnJlY3QgcGMgcmVsYXRpdmUgY29kZS4KLQltZF9yZWxheCBtdXN0IGJlIGFibGUgdG8gZmluZCBvcGNvZGUgYWRkcmVzcyBldmVuIGlmIGluIGFub3RoZXIgZnJhZy4KLQotCSogY29uZmlnL3RjLW5zMzJrLmM6IE1vcmUgZXh0ZW5zaXZlIGNvbW1lbnRzLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoZW5jb2RlX29wZXJhbmQpOiBTdXBwb3J0IG5ldyBvcGVyYW5kIGNsYXNzZXMgSQotCWFuZCBaLiBEcm9wIFEuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChmaXhfbmV3X25zMzJrX2V4cCk6IG5ldyBmdW5jdGlvbiBhbmQKLQljb3JyZXNwb25kaW5nIHByb3RvdHlwZS4KLQotCSogY29uZmlnL3RjLW5zMzJrLmM6IG1ha2UgMzI1MzIgZGVmYXVsdCBtYWNoaW5lIGluc3RlYWQgb2YgMzIwMzIuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBpbmNsdWRlIG9wY29kZS9uczMyay5oIGFmdGVyIGFzLmgKLQotCSogYW91dF9nbnUuaDogcl9kaXNwIG5lZWRzIHRvIGJlIDIgYml0cyBmb3IgVENfTlMzMksKLQotCSogd3JpdGUuaDogZnhfaW1fZGlzcCBuZWVkcyB0byBiZSAyIGJpdHMgYmlnIGZvciBUQ19OUzMySwotCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogVXNlIFRDX1BDUkVMX0FESlVTVCBtYWNybyAoaWYgZGVmaW5lZCkKLQlpbnN0ZWFkIG9mIGFkZGluZyBwY3JlbF9hZGp1c3QuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQWRqdXN0IHRvX2FkZHIgZm9yIHRoZQotCUJST0tFTl9ET1RfV09SRCBmZWF0dXJlIGZvciB0aGUgQkZEX0FTU0VNQkxFUiBjYXNlLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFVzZSBUQ19DT05TX0ZJWF9ORVcgaWYgaXQgaXMgZGVmaW5lZC4KLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBBZGQgY29kZSAoY3VycmVudGx5IGlmCi0JQkZEX0ZBU1RfU0VDVElPTl9GSUxMIGlzIGRlZmluZWQpIHRvIG1ha2UgbGFyZ2UgZmlsbHMgYSBsb3QgZmFzdGVyLgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBuczMyayBmcm9tIHNwZWNpYWwgRlAgbGlzdC4gQWxsIHRoZSBuczMyawotCXNlcmllcyB1c2UgaWVlZSBmbG9hdC4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbnMzMmstcGM1MzItbWFjaCBhbmQgbnMzMmstcGM1MzItbmV0YnNkIHRhcmdldHMKLQotCSogYXMuaDogaW5jbHVkZSBleHByLmggYmVmb3JlIHRhcmctZW52LmguIFNvbWUgdGFyZ2V0IGRlcGVuZGVudCBmaWxlCi0Jd2FudCB0byB1c2UgZXhwciBzdHJ1Y3R1cmVzLgotCi1XZWQgSnVsIDEzIDE0OjQ5OjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IENoYW5nZSBycCB0byBiZSBhIGNvbnN0IHBvaW50ZXIuCi0JKG1kX3BhcnNlX29wdGlvbik6IENsZWFyIGNwdSBmaWVsZCBvZiBjdXJyZW50X2FyY2hpdGVjdHVyZSBiZWZvcmUKLQlzZXR0aW5nIGEgbmV3IGNwdSB0eXBlLiAgQ2xlYXIgbm9fNjg4ODEgZm9yIG02ODg4MSBvciBtNjg4ODIuCi0JQ2xlYXIgbm9fNjg4NTEgZm9yIG02ODg1MS4KLQotVHVlIEp1bCAxMiAyMToyNzowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tc3lzdi5oIChyZWFsbG9jKTogRGVjbGFyZS4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfY3JlYXRlKTogTmV3IGZ1bmN0aW9uLCBtb3N0IG9mIHRoZSBndXRzIG9mIHRoZQotCW9sZCBzeW1ib2xfbmV3IGZ1bmN0aW9uLgotCShzeW1ib2xfbmV3KTogTm93IGp1c3QgY2hlY2tzIHN5bWJvbF90YWJsZV9mcm96ZW4sIGNhbGxzCi0Jc3ltYm9sX2NyZWF0ZSwgYW5kIGVudGVycyB0aGUgc3ltYm9sIGludG8gdGhlIHN5bWJvbCB0YWJsZS4KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBJZiBFTUlUX1NFQ1RJT05fU1lNQk9MUyBpcyBub3QgdHJ1ZSwKLQlhbmQgdGhlIHN5bWJvbCB0YWJsZSBpcyBmcm96ZW4sIGNhbGwgc3ltYm9sX2NyZWF0ZSBpbnN0ZWFkIG9mCi0Jc3ltYm9sX25ldy4KLQkqIHN5bWJvbHMuaCAoc3ltYm9sX2NyZWF0ZSwgc3ltYm9sX3RhYmxlX2Zyb3plbik6IERlY2xhcmUuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMpOiBBbHdheXMgYSBmdW5jdGlvbiBub3cuCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMpOiBEZWxldGVkIG1hY3JvCi0JdmVyc2lvbi4KLQotCSogc3ltYm9scy5jIChkZWJ1Z192ZXJpZnlfc3ltY2hhaW4pOiBOZXcgbWFjcm8sIGRlZmluZWQgdG8gYmUKLQl2ZXJpZnlfc3ltYm9sX2NoYWluIG9yIGEgY2FzdCB0byB2b2lkLCBkZXBlbmRpbmcgb24gREVCVUdfU1lNUy4KLQkobWFueSBmdW5jdGlvbnMpOiBJbnZva2UgZGVidWdfdmVyaWZ5X3N5bWNoYWluIHVuY29uZGl0aW9uYWxseS4KLQotVHVlIEp1bCAxMiAxMjowNjo0MiAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAeDEuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5oOiBjaGFuZ2UgY2FsbGluZyBpbnRlcmZhY2Ugb2YKLQlPQkpfR0VORVJBVEVfQVNNX0xJTkVfU1RBQi4KLQkqIGNvbmZpZy9vYmotZWxmLmg6IGRpdHRvLgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBkaXR0by4KLQkqIGVjb2ZmLmg6IGNoYW5nZSBjYWxsaW5nIGludGVyZmFjZSBvZgotCWVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lX3N0YWIuCi0JKiBlY29mZi5jIChhZGRfZmlsZSk6IHJlY29yZCBvZiBmaWxlbmFtZSB0byBoYW5kbGUgY2FzZSBvZiBpbmNsdWRlCi0JZmlsZXMsIGFsc28gY2hhbmdlIGRlZmF1bHQgYnVpbHQtaW4gdHlwZSBmcm9tIGludCB0byB2b2lkIGZvcgotCWFzbSBmaWxlLgotCSogZWNvZmYuYyAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYik6IGhhbmRsZSBjYXNlIG9mIGluY2x1ZGUKLQlmaWxlcy4KLQotTW9uIEp1bCAxMSAxNzoyMDoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogSW4gY2FzZSBNX0xBX0FCLCBTVlI0X1BJQywgbGFyZ2UKLQljb25zdGFudCwgYW5kIGNhc2UgbGRkX3N0ZCwgc2V0IG1pcHNfb3B0aW1pemUgdG8gMiB0ZW1wb3JhcmlseSB0bwotCWF2b2lkIGluc2VydGluZyBhbiB1bmV4cGVjdGVkIG5vcCBpbnN0cnVjdGlvbi4KLQotU2F0IEp1bCAgOSAwMDowNToxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2xpbmVubyk6IEhhbmRsZSBjb3VudCBjb3JyZWN0bHkgZm9yIGxhc3QKLQlsaW5lIG51bWJlci4KLQotRnJpIEp1bCAgOCAxNToyMjowNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBnYXNwLmMgKHByb2Nlc3NfcHNldWRvX29wKTogUGFzcyByaWdodCBhcmdzIHRvIGRvIGRvX2FpZi4KLQkoZ2V0X2FueV9zdHJpbmcpOiBOZXcgYXJnICdwcmV0ZW5kX3F1b3RlJy4KLQkoZ2V0X2FuZF9wcm9jZXNzLCBkb19mb3JtYWxzLCBtYWNyb19leHBhbmQsIGRvX3NkYXRhLAotCXByb2Nlc3NfcHNldWRvX29wKTogVXNlIG5ldyBhcmcuCi0KLUZyaSBKdWwgIDggMTI6MjM6NDQgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5oOiBkZWZpbmUgbWFjcm8gT0JKX0dFTkVSQVRFX0FTTV9MSU5FX1NUQUIuCi0JKiBjb25maWcvb2JqLWVsZi5oOiBkaXR0by4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogZ2VuZXJhdGUgbGluZSBzdGFicyBmb3IgYXNtIGZpbGUuCi0JKiByZWFkLmg6IGFkZCBleHRlcm4gZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYi4KLQkqIGVjb2ZmLmggOiBhZGQgcHJvdG90eXBlIGZvciBlY29mZl9nZW5lcmF0ZV9hc21fbGluZV9zdGFiKCkuCi0JKiBlY29mZi5jIChhZGRfZmlsZSk6IGlmIHRoZXJlJ3Mgbm8gZmlsZW5hbWUgcHJvdmlkZWQsIHNldCBzd2l0Y2gKLQl0byBnZW5lcmF0ZSBsaW5lIHN0YWJzIGZvciAucyBmaWxlLgotCSogZWNvZmYuYyAoYWRkX3Byb2NlZHVyZSk6IGFkZCBzdGFicyBzeW1ib2wgZm9yIC5lbnQgZGlyZWN0aXZlLgotCSogZWNvZmYuYyAoZ2VuZXJhdGVfZWNvZmZfc3RhYik6IGNyZWF0ZXMgYW4gYXJ0aWZpY2lhbCBzdGFicy4KLQkqIGVjb2ZmLmMgKGdlbmVyYXRlX2FzbV9saW5lX3N0YWIpOiBnZW5lcmF0ZSBhIGFydGlmaXRpYWwgbGFiZWwKLQlmb3IgZWFjaCBsaW5lIGFuZCBnZW5lcmF0ZSBhIHN0YWJuIGZvciB0aGUgbGluZS4KLQotVGh1IEp1bCAgNyAxNzowNDowMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBnYXNwLmMgKGdldF9hbnlfc3RyaW5nKTogQ29wZSB3aXRoIGdldHRpbmcgYSBzdHJpbmcgd2l0aCBhbgotCWFsdGVybmF0ZSBiYXNlIHNwZWNpZmllci4KLQkoZG9fYWlmLCBkb19hZWxzZSk6IE9ubHkgZW5hYmxlIG91dHB1dCBpZiBleHByZXNzaW9uIGlzIHRydWUgYW5kIHByZXZpb3VzCi0JbGV2ZWwgd2FzIG9uLgotCShjaGFydHlwZV9pbml0KTogIEFkZCBCQVNFQklUIGNoYXJ0eXBlLgotCShwcm9jZXNzX3BzZXVkb19vcCk6ICBOb3RpY2UgbmVzdGVlZCBBSUZzLgotCi1UaHUgSnVsICA3IDEyOjMwOjIyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmMgKGRvX2FfZml4X2ltbSk6IENvZGUgZm9yIDIgYml0IHJlbG9jIHR5cGUgdXNpbmcgaW4gdHJhcGEKLQlpbnNuLiAgKGZpeCBwciA1MTY1LCA1MTc0KQotCi1UaHUgSnVsICA3IDExOjMxOjMyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChSX0RMVF9SRUwpOiBJZiBpdCBpc24ndCBkZWZpbmVkLCB0aGVuIGRlZmluZQotCXRvIGFuIGFwcHJvcHJpYXRlIHZhbHVlIHRvIGF2b2lkIGxvc2luZyBvbiBvbGQgaHB1eCBzeXN0ZW1zLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9hZGp1c3RhYmxlKTogUmVqZWN0IHJlZHVjdGlvbnMgZm9yCi0Jc3ltYm9scyBpbiBETFQgcmVsYXRpdmUgcmVsb2NzLgotCSh0Y19nZW5fcmVsb2MpOiBaZXJvIG91dCB0aGUgYWRkZW5kIGZpZWxkIGZvciBETFQgcmVsYXRpdmUgcmVsb2NzLgotCi1XZWQgSnVsICA2IDAxOjA3OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfdGMpOiBJZiBub3QgT0JKX0NPRkYsIGZvcmNlIFRPQyBlbnRyeSB0bwotCWFsaWduIHRvIGEgZm91ciBieXRlIGJvdW5kYXJ5LgotCi1UdWUgSnVsICA1IDE1OjQyOjA5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBIYW5kbGUgMzItYml0IGFkZGVuZHMuCi0JKGdwZGlzcF9oaTE2X2hvd3RvKTogTm93IHBvaW50cyB0byBjb25zdC4KLQkobG9hZF9pbnNuX3RhYmxlLCBhbHBoYV9pcCk6IEZpeCB1c2VzIG9mIGNvbnN0LgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGk6IFVwZGF0ZXMgdG8gQ09GRiBkZXNjcmlwdGlvbi4gIEFkZGVkICJAZW5kCi0JZGVmbWFjIiBhcyBuZWVkZWQsIGFuZCBzb21lIGV4dHJhIGhlYWRpbmcgYW5kICJAYnllIiBzbyBpdCdsbAotCWZvcm1hdCBhcyBhIHNlcGFyYXRlIGRvY3VtZW50LgotCi1UdWUgSnVsICA1IDEzOjU0OjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuaCAoU19HRVRfQUxJR04sIFNfU0VUX0FMSUdOKTogRGVmaW5lLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBTZXQgYWxpZ25tZW50IG9mIGNvbW1vbgotCXN5bWJvbC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2NvbW1vbik6IElmIE9CSl9FTEYsIHNldCBhbGlnbm1lbnQgb2YKLQljb21tb24gc3ltYm9sLgotCi1Nb24gSnVsICA0IDE4OjI5OjQzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChpc19jb21wbGV4KTogTmV3IG1hY3JvLgotCShjb25zX2ZpeF9uZXdfaHBwYSk6ICJIYW5kbGUiIGNvbXBsZXggZXhwcmVzc2lvbnMuCi0KLUZyaSBKdWwgIDEgMDA6NDg6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBTZXQgc19hbGlnbiBmaWVsZCBmcm9tCi0Jc2VjdGlvbl9hbGlnbm1lbnQgYXJyYXkuCi0KLVRodSBKdW4gMzAgMTU6MDU6MjggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgYmZkX2NvbV9zZWN0aW9uX3B0ci4KLQkqIGFzLmggKGFic29sdXRlX3NlY3Rpb24sIHVuZGVmaW5lZF9zZWN0aW9uKTogVXNlIG5ldyBCRkQgbWFjcm9zCi0JYmZkX2Fic19zZWN0aW9uX3B0ciBhbmQgYmZkX3VuZF9zZWN0aW9uX3B0ci4KLQotVGh1IEp1biAzMCAxNDozNjozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRm9yIE1fTElfU1MsIGRlY2lkZSBob3cgdG8gaGFuZGxlIGl0Ci0JYmFzZWQgb24gY29udGVudHMgb2YgaW1tX2V4cHIgYW5kIG9mZnNldF9leHByLCByYXRoZXIgdGhhbgotCW1pcHNfcGljLiAgRm9yIE1fTElfREQsIGRlY2lkZSBob3cgdG8gaGFuZGxlIGl0IGJhc2VkIG9uIHNlZ21lbnQKLQluYW1lIG9mIG9mZnNldF9leHByLCByYXRoZXIgdGhhbiBtaXBzX3BpYy4KLQkobWlwc19pcCk6IElmIGdfc3dpdGNoX3ZhbHVlIDwgNCwgdXNlIGltbWVkaWF0ZSB2YWx1ZXMgZm9yICdsJy4KLQlJZiBnX3N3aXRjaF92YWx1ZSA8IDgsIHVzZSAucmRhdGEgcmF0aGVyIHRoYW4gLmxpdCBmb3IgJ0wnLgotCi1XZWQgSnVuIDI5IDE3OjMwOjQ2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAoc2hvd191c2FnZSk6IEJyZWFrIGxvbmcgc3RyaW5nIGludG8gc2hvcnRlciBvbmVzLgotCShwYXJzZV9hcmdzKTogQWRkIC12LCBwcmludHMgdmVyc2lvbiBpZCBhbmQgY29udGludWVzLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEJyZWFrIGxvbmcgc3RyaW5nLgotCi1Nb24gSnVuIDI3IDA5OjQ3OjE2IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAiLVYiIGFuZCAiLVEiIGlmCi0JT0JKX0VMRiBpcyBkZWZpbmVkLgotCi1TdW4gSnVuIDI2IDE2OjMwOjQ4IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAobWFpbikgW0hPU1RfU1BFQ0lBTF9JTklUXTogTmV3IGhvb2ssIGZvciBob3N0LXNwZWNpZmljCi0JaW5pdGlhbGl6YXRpb24uCi0KLVdlZCBKdW4gMjIgMDA6MjQ6NTUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKG9ial9mcm9iX3N5bWJvbCk6IERlZmluZSBmb3IgT0JKX0VMRi4KLQlNb3JlIGdhcy9iZmQgbG9zc2FnZSBleHBvc2VkIGJ5IHRoZSBuZXcgbGlua2VyIGNvZGUuCi0KLVR1ZSBKdW4gMjEgMTE6MzI6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpOiBDbGVhciBzZWdpbmZvIGFmdGVyIGFsbG9jYXRpbmcgaXQuCi0JKHN1YnNlZ19nZXQpOiBQYXNzIGFjdHVhbCBzaXplIG9mIHNlZ2luZm8gdG8gbWVtc2V0LgotCi0JKiBzdWJzZWdzLmMgKGFic19zZWdfaW5mbywgdW5kX3NlZ19pbmZvKTogRGVmaW5lIGlmIEJGRF9BU1NFTUJMRVIuCi0JKHN1YnNlZ19jaGFuZ2UpOiBTdG9yZSBzZWdfaW5mbyBmb3IgYmZkX2Fic19zZWN0aW9uX3B0ciBpbgotCWFic19zZWdfaW5mbywgYW5kIHN0b3JlIHNlZ19pbmZvIGZvciBiZmRfdW5kX3NlY3Rpb25fcHRyIGluCi0JdW5kX3NlZ19pbmZvLgotCShzdWJzZWdfZ2V0KTogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBzZXQgb3V0cHV0X3NlY3Rpb24gaWYgaXQgaXMKLQlhbHJlYWR5IHNldC4KLQkoc2VnX2luZm8pOiBEZWZpbmUgYXMgZnVuY3Rpb24uCi0JKiBzdWJzZWdzLmggKHNlZ19pbmZvKTogRGVjbGFyZSBhcyBmdW5jdGlvbiByYXRoZXIgdGhhbiBkZWZpbmluZwotCWFzIG1hY3JvLgotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogQ2FsbCBzZWdfaW5mbyByYXRoZXIgdGhhbgotCWJmZF9nZXRfc2VjdGlvbl91c2VyZGF0YS4KLQotTW9uIEp1biAyMCAxNjozMDo1NCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHBwYy0qLWVsZiopOiBOZXcgdGFyZ2V0LCBsaWtlIC1zeXN2NCouCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IElmICIwZiIgaXMgZm9sbG93ZWQgYnkgJ1wwJywgZG9uJ3QgZG8gZW9sCi0JY2hlY2tzLgotCi1Nb24gSnVuIDIwIDE1OjE3OjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfYXV4KTogQ2FsbCBzd2FwX3Rpcl9vdXQgYW5kIHN3YXBfcm5keF9vdXQKLQl2aWEgYmFja2VuZCBwb2ludGVyLCBub3QgZGlyZWN0bHkuCi0KLUZyaSBKdW4gMTcgMTg6MDU6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLXN0YW1wKTogTWFrZSBzdXJlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQotCWVsZW1lbnQgaW4gdGhlIGZvciBsb29wLgotCi1GcmkgSnVuIDE3IDExOjAxOjA0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBNaXNjIHRyaXZpYWwgY2hhbmdlcyB0byBtYWtlIGdjYyAtV2FsbCBoYXBweS4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IERlY2xhcmUuCi0KLVdlZCBKdW4gMTUgMjA6NDQ6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYXMuYyAocGFyc2VfYXJncyk6IENhc3QgeG1hbGxvYyByZXR1cm4gdmFsdWUuCi0KLQkqIE1ha2VmaWxlLmluIChjb25maWctc3RhbXApOiBJZiAkKGRlZnMpIGNvbnRhaW5zIG11bHRpcGxlIHdvcmRzLAotCWVtaXQgYSAjZGVmaW5lIGxpbmUgZm9yIGVhY2guCi0JKiBjb25maWd1cmUuaW46IEZvciBzcGFyYzY0IHRhcmdldCwgdXNlIHNwYXJjIGNwdSBmaWxlcyBhbmQgYWRkCi0Jc3BhcmN2OSB0byBleHRyYV9kZWZzLiAgTm8gbG9uZ2VyIHRyZWF0IHNwYXJjNjQtKi1hb3V0KiBzcGVjaWFsbHkuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZW1iYXJfbWFza3MpOiBOb3cgc3RhdGljIGFuZCBjb25zdC4KLQkobWRfc2hvd191c2FnZSkgWyFOT19WOV06IEFkZCAtQXY5IHRvIHVzYWdlIG1lc3NhZ2UuCi0JKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSBbc3BhcmN2OV06IEluaXRpYWxpemUgdG8gdjkuCi0JKG1kX2JlZ2luKSBbc3BhcmN2OV06IERvbid0IGJvdGhlciBjaGFuZ2luZyBpdCB1bmNvbmRpdGlvbmFsbHkKLQloZXJlLgotCShzX3Jlc2VydmUpOiBEb24ndCBwYXNzIHVuZXhwZWN0ZWQgYXJndW1lbnQgdG8gYXNfYmFkIHdpdGgKLQliYWQtc2VnbWVudCBtZXNzYWdlLgotCi0JKiBhcy5oIChiZmRfYWxsb2NfYnlfc2l6ZV90KSBbQkZEX0FTU0VNQkxFUl06IERlY2xhcmUuCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAoaW50X3RvX2dlbik6IENvbW1lbnRlZCBvdXQgdW51c2VkIHJvdXRpbmUuCi0KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiBSZW1vdmVkIGNoZWNrIG9mIG9wZXJhbmQgc2VjdGlvbi4KLQotCUZyaSBKdW4gIDMgMTc6MjU6MDggMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKERCR19TX0NfQ09NUExYNCwgREJHX1NfQ19DT01QTFg4KTogZGVmaW5lCi0JdGhlc2UgbmV3IFZNUyBzeW1ib2wtdHlwZSBtYWNyb3MgZm9yIGBjb21wbGV4IGZsb2F0JyBhbmQKLQlgY29tcGxleCBkb3VibGUnIHN1cHBvcnQuICBUaGVpciB2YWx1ZXMgY29tZSBmcm9tIHRoZSBleGlzdGluZwotCURTQyRLX0RUWVBFX0ZDIGFuZCBEU0MkS19EVFlQRV9EQyBtYWNyb3MgaW4gPGRlc2NyaXAuaD4uCi0JKERCR19TX0NfUkVBTDhfRywgREJHX1NfQ19DT01QTFg4X0cpOiBHX2Zsb2F0IHZlcnNpb25zIG9mCi0JUkVBTDggYW5kIENPTVBMWDg7IG5vdCB1c2VkIHlldCwgYmVjYXVzZSBnY2Mgb3V0cHV0cyB0aGUgc2FtZQotCS5zdGFicyBmb3IgYGRvdWJsZScgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGAtbWcnIGlzIHVzZWQuCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfdHlwZWRlZl9wYXJzZSkgW2Nhc2UgJ3InXTogYWRkIGVudHJpZXMKLQlmb3IgZ2NjMidzIHByZWRlZmluZWQgdHlwZXMgImNvbXBsZXggZmxvYXQiLCAiY29tcGxleCBkb3VibGUiLAotCWFuZCAiY29tcGxleCBsb25nIGRvdWJsZSIgKGlkZW50aWNhbCB0byBjb21wbGV4IGRvdWJsZSkuCi0KLVdlZCBKdW4gMTUgMTI6MzI6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IFVzZSBDX1NUQVQgZm9yIHRoZSAudGV4dAotCXNlY3Rpb24gc3ltYm9sLCBub3QgQ19MQUJFTC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IFBlcm1pdCBhIG1vZGlmaWVyIGluICdvJyBjYXNlLCBhbmQKLQlwZXJtaXQgbm9uIGNvbnN0YW50IGV4cHJlc3Npb25zIGluICd1JyBjYXNlLiAgTGV0cyBgYGx1aQotCSQ4LCVoaShmb28pOyBsdyAkOCwlbG8oZm9vKSgkOCknJyB3b3JrIGNvcnJlY3RseS4KLQotTW9uIEp1biAxMyAxMjowODo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFdhcm4gYWJvdXQgYW4gYXR0ZW1wdAotCXRvIHB1dCBhIGNvbW1vbiBzeW1ib2wgaW4gYSBzZXQuCi0KLVNhdCBKdW4gMTEgMTY6NDE6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkIHdlYWsgc3ltYm9scyBhcyBhbiBleHRlbnNpb24gdG8gYS5vdXQuCi0JKiByZWFkLmMgKHBzZXVkb19zZXQpOiBPbmx5IHByZXNlcnZlIGV4dGVybmFsIGJpdCBmb3IgT0JKX0FPVVQgYW5kCi0JT0JKX0JPVVQgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWcvYW91dF9nbnUuaCAoTl9XRUFLVSwgTl9XRUFLQSwgTl9XRUFLVCwgTl9XRUFLRCwgTl9XRUFLQik6Ci0JRGVmaW5lIGFzIGluIC4uL2luY2x1ZGUvYW91dC9hb3V0NjQuaC4KLQkqIGNvbmZpZy9vYmotYW91dC5oIChPQkpfU1lNRklFTERfVFlQRSk6IElmIG5vdCBCRkRfQVNTRU1CTEVSLAotCWRlZmluZSBhcyBjaGFyLgotCShTX0dFVF9XRUFLLCBTX1NFVF9XRUFLKTogRGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgIndlYWsiLgotCShvYmpfZW1pdF9zeW1ib2xzKTogQWRqdXN0IHR5cGUgb2Ygd2VhayBzeW1ib2xzLgotCShvYmpfYW91dF93ZWFrKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotRnJpIEp1biAxMCAxMzo0ODo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IERvbid0IHNldCBhbnkgZmxhZ3MgYmFzZWQgb24KLQl0aGUgdHlwZSBvZiBhIHNwZWNpYWwgc2VjdGlvbi4KLQotCSogY29uZmlnL2hvLXN1bm9zLmg6IEluY2x1ZGUgPHN0ZGxpYi5oPi4gIERvbid0IGRlY2xhcmUgbWFsbG9jLAotCXJlYWxsb2MsIGZyZWUsIG9yIGF0b2wuCi0KLVdlZCBKdW4gIDggMDY6Mjg6MzcgMTk5NCAgQmlsbCBDb3ggIChiaWxsQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IERlbGV0ZSBhcy5uZXcgZGVwZW5kZW5jeSwgc28gdGhhdAotCXJlZ3Jlc3Npb24gdGVzdCBkb2Vzbid0IHRyaWdnZXIgYW4gYXNzZW1ibGVyIGJ1aWxkLgotCi1UdWUgSnVuICA3IDEzOjMzOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuLCByZWFsY2xlYW4pOiBOZXcgdGFyZ2V0cy4KLQkqIGRvYy9NYWtlZmlsZS5pbiwgdGVzdHN1aXRlL01ha2VmaWxlLmluOiBMaWtld2lzZS4KLQotTW9uIEp1biAgNiAxMzoxMDo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKFJEQVRBX1NFQ1RJT05fTkFNRSk6IERlZmluZS4KLQkobWFjcm8pOiBDb3JyZWN0IE1fTElfU1MgU1ZSNF9QSUMvRU1CRURERURfUElDIGNhc2UuICBBZnRlciBNX0xJX0QKLQlvciBNX0xfRE9CIG9yIGxhYmVsIGRvYiwgZm9yY2UgYSBuZXcgZnJhZyB0byBhdm9pZCBnZXR0aW5nCi0JY29uZnVzZWQgaW4gdGNfZ2VuX3JlbG9jLgotCShtaXBzX2lwKTogVXNlIFJEQVRBX1NFQ1RJT05fTkFNRSwgbm90IC5yZGF0YS4KLQkoc19jaGFuZ2Vfc2VjKTogTGlrZXdpc2UuCi0KLUZyaSBKdW4gIDMgMjM6MzU6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IFVzZSBtZW1zZXQgdG8gemVybyBvdXQgbWVtb3J5LCByYXRoZXIgdGhhbgotCWdvaW5nIHRocm91Z2ggbWRfbnVtYmVyX3RvX2NoYXJzLiAgVGhpcyBwZXJtaXRzIGhhbmRsaW5nIHN5bWJvbGljCi0JYXJndW1lbnRzIHdoZW4gdGhlIHNpemUgaXMgbGFyZ2VyIHRoYW4gc2l6ZW9mICh2YWx1ZVQpLCBpZgotCVRDX0NPTlNfRklYX05FVyBpcyBwcmVwYXJlZCB0byBoYW5kbGUgdGhlIGNhc2UgKGFzIGl0IGlzIG9uIE1JUFMpLgotCi1GcmkgSnVuICAzIDEyOjUwOjEzIDE5OTQgIERhdmlkIEouIE1hY0tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAoc2hvd191c2FnZSksIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG93X3VzYWdlKSwKLQljb25maWcvdGMtbWlwcy5jIChtZF9zaG93X3VzYWdlKTogRml4IHVwIG1lc3NhZ2VzLgotCi0JKiBhcy5oOiBSZXBsYWNlIGZsYWdzZWVuIHdpdGggc2VwYXJhdGUgdmFyaWFibGVzLgotCSogYXMuYyAocGFyc2VfYXJncyk6IFNldCB0aGVtLiAgRG9uJ3QgYWNjZXB0IC0xIG9wdGlvbiwgb3IgLXYKLQlleHBsaWNpdGx5IChpdCdzIGEgc3lub255bSBmb3IgLS12ZXJzaW9uKS4KLQkqIGFzLmMsIGlucHV0LXNjcnViLmMsIG1lc3NhZ2VzLmMsIHJlYWQuYywgc3ltYm9scy5jLCB3cml0ZS5jLAotCWNvbmZpZy9vYmotYW91dC5jLCBjb25maWcvb2JqLWFvdXQuaCwgY29uZmlnL29iai1ib3V0LmMsCi0JY29uZmlnL29iai1ib3V0LmgsIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWNvZmYuaCwKLQljb25maWcvb2JqLXZtcy5jLCBjb25maWcvdGMtaHBwYS5jLCBjb25maWcvdGMtaTM4Ni5jLAotCWNvbmZpZy90Yy1pOTYwLmMsIGNvbmZpZy90Yy1tNjhrLmMsIGNvbmZpZy90Yy1taXBzLmMsCi0JY29uZmlnL3RjLXZheC5jOiBVc2UgdGhlIG5ldyBmbGFnIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIGZsYWdzZWVuLgotCSogY29uZmlnL3RjLXZheC5jIFtPQkpfVk1TXTogUmVjb2duaXplIC0rLCAtMSwgLXYsIGFuZCBkb2N1bWVudCBpbgotCXVzYWdlLgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogUmVtb3ZlIHRhcmdldCBzcGVjaWZpYyBtZXNzYWdlczsKLQlpbnN0ZWFkLCBjYWxsIG1kX3Nob3dfdXNhZ2UuCi0JKHBhcnNlX2FyZ3MpOiBVc2UgZ2V0b3B0X2xvbmdfb25seS4gIFRha2UgcG9pbnRlcnMgdG8gYXJnYyBhbmQKLQlhcmd2LgotCShtYWluKTogUGFzcyBwYXJzZV9hcmdzIHBvaW50ZXJzLgotCSogYXMuaDogUmVtb3ZlIDMgdmFyaWFibGVzIHRoYXQgYXJlIHJlZHVuZGFudCB3aXRoIGZsYWdzZWVuLgotCSogYXMuYywgbWVzc2FnZXMuYzogQ2hhbmdlIHRoZWlyIHVzZXJzIHRvIHVzZSBmbGFnc2Vlbi4KLQlEZWZpbmUgZ2V0b3B0IHN0dWZmLgotCSogdGMuaDogVXBkYXRlIG1kX3BhcnNlX29wdGlvbiBkZWNsLiAgQWRkIG1kX3Nob3dfdXNhZ2UgZGVjbC4KLQkqIGNvbmZpZy90Yy0qLmM6IEFkZCBtZF9zaG9ydG9wdHMsIG1kX2xvbmdvcHRzLAotCW1kX2xvbmdvcHRzX3NpemUsIG1kX3Nob3dfdXNhZ2UuICBDaGFuZ2UgY2FsbGluZyBjb252ZW50aW9uIGZvcgotCW1kX3BhcnNlX29wdGlvbi4gIFJlbW92ZSBtZF9wYXJzZV9sb25nX29wdGlvbi4KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBSZW5hbWUgYHN0cnVjdCBvcHRpb24nIHRvIGBzdHJ1Y3QgbnMzMmtfb3B0aW9uJy4KLQkqIGNvbmZpZy90Yy1pMzg2Lmg6IERvbid0IGRlZmluZSBtZF9wYXJzZV9vcHRpb24uCi0KLVRodSBKdW4gIDIgMTM6NTQ6NDYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogTmV3IGZ1bmN0aW9uLgotCShwYXJzZV9hcmdzKTogQ29kZSBtb3ZlZCBmcm9tIG1haW4uCi0JUmVjb2duaXplIC0taGVscCBhbmQgLS12ZXJzaW9uLgotCSogY29uZmlnL3RjLW5zMzJrLmg6IERlZmluZSBUQ19OUzMySy4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBhbGwgb2YgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBjb21tYW5kCi0JbGluZSBvcHRpb25zLgotCi1UaHUgSnVuICAyIDEyOjA3OjI1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdhc3AuYyAoaGFzaF9uZXdfdGFibGUpOiBDbGVhciBuZXdseSBhbGxvY2F0ZWQgdGFibGUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGVudW0gX3JlZ2lzdGVyKTogQWRkIDY4MDYwIGNvbnRyb2wgcmVnaXN0ZXJzCi0JQlVTQ1IgYW5kIFBDUi4KLQkobGFzdF9tb3ZlY19yZWcpOiBOZXcgbWFjcm8uCi0JKG02ODAwMF9jb250cm9sX3JlZ3MsIG02ODAxMF9jb250cm9sX3JlZ3MsIG02ODAyMF9jb250cm9sX3JlZ3MsCi0JbTY4MDQwX2NvbnRyb2xfcmVncywgbTY4MDYwX2NvbnRyb2xfcmVncyk6IE5ldyBhcnJheXMuCi0JKGNvbnRyb2xfcmVncyk6IE5ldyBwb2ludGVyLgotCShtNjhrX2lwKTogVXNlIGNvbnRyb2xfcmVncyBpbnN0ZWFkIG9mIHRlc3RpbmcgQ1BVIGV2ZXJ5IHRpbWUuCi0JVXNlIGxhc3RfbW92ZWNfcmVnIHRvby4gIEluIGVycm9yIG1lc3NhZ2VzLCBoYW5kbGUgNjgwNjAsIGFuZAotCXByaW50IDY4MDYwIGZvciBtZmxvYXQsIHRvby4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBIYW5kbGUgIjY4MDYwIi4gIFVzZSBtNjgwNDB1cCBmb3IgbWFraW5nCi0JbTY4ODUxIGNob2ljZS4gIFNldCBjb250cm9sX3JlZ3MuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAiNjgwNjAiLgotCSogY29uZmlndXJlLmluOiBTZXR0aW5nIGNwdV90eXBlLCByZWNvZ25pemUgbTY4MDYwIHRvby4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpIFshQkZEX0FTU0VNQkxFUl0KLQlbRElGRl9FWFBSX09LXTogRG8gY29udmVyc2lvbiB0byBwYy1yZWxhdGl2ZSBmb3IgZGlmZmVyZW5jZSwgZXZlbgotCWlmIHBjcmVsIGlzIGFscmVhZHkgc2V0LgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgdGhpc19nY2NfcmVxdWlyZXNfdGhlX2dudV9hc3NlbWJsZXIgaW4gYWxsCi0JbG93ZXItY2FzZSwgaW4gY2FzZSB3ZSdyZSBpZ25vcmluZyBjYXNlIG9mIG9wY29kZXMgaW4gdGhlIGlucHV0Ci0JZmlsZS4KLQotCSogZG9jL2FzLnRleGluZm8gKC5zZWN0aW9uKTogRG9jdW1lbnQgYXMgdW5hdmFpbGFibGUgZm9yIGEub3V0Ci0JdHlwZSBmb3JtYXRzLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWFjaGluZSk6IE5ldyB2YXJpYWJsZS4KLQkobG9hZF9pbnNuKTogTmV3IG1hY3JvLgotCShsb2FkX2luc25fdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2JlZ2luKTogQ2FsbCBsb2FkX2luc25fdGFibGUsIG9uY2UgZm9yIGJhc2ljIGluc3RydWN0aW9ucyBhbmQKLQlvbmNlIGZvciBhcHByb3ByaWF0ZSBQQUwgaW5zdHJ1Y3Rpb24gdGFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBgbWFjaGluZScgYmFzZWQgb24gLW0jIyMjIyBhcmd1bWVudHMuCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmggKGFscGhhX3BhbDIxMDY0X29wY29kZXMpOiBTcGxpdCBvdXQgZnJvbQotCWFscGhhX29wY29kZXMuCi0JKGFscGhhX3BhbDIxMTY0X29wY29kZXMpOiBOZXcgdGFibGUuCi0JKE5VTTIxMDY0T1BDT0RFUywgTlVNMjExNjRPUENPREVTKTogTmV3IG1hY3Jvcy4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXQgaTM4Ni0qLW5ldGJzZDAuOCk6IFVzZSAzODZic2QgZW11bGF0aW9uLgotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mby1nYXNwKTogVXNlICQkZGlyIHdoZW4gaW5zdGFsbGluZwotCWZpbGUuCi0KLVdlZCBKdW4gIDEgMTA6NDg6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRm9yY2UgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIHRvIGJlCi0JYWxpZ25lZCBjb3JyZWN0bHkuCi0KLUZyaSBNYXkgMjcgMTA6MDU6NTMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQlNZXJnZWQgaW4gY2hhbmdlcyBmcm9tIGdhcy0yLjMgbmV0IHJlbGVhc2U6Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCB0byBjeWdudXMtMi4zLjEuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmM6IFJlcGxhY2VkIHVuY2hlY2tlZCB1c2VzIG9mIG1hbGxvYyB3aXRoCi0JeG1hbGxvYy4KLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IE9ubHkgdGVzdCBCRkQ2NCwgbm90Ci0JQkZEX0FTU0VNQkxFUiB0b28uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KSBbQkZEX0FTU0VNQkxFUl0KLQlbRElGRl9FWFBSX09LXTogRG9uJ3QgY2hlY2sgcGNyZWwsIGp1c3QgY29udmVydCBpdC4KLQotCSogY29uZmlnL29iai12bXMuYzogUmVtb3ZlZCBsb3RzIG9mIGV4dHJhIHNlbWljb2xvbnMgYWZ0ZXIKLQljb21wb3VuZCBzdGF0ZW1lbnRzLgotCShzdHJjaHIpOiBEb24ndCBkZWNsYXJlIGhlcmUuCi0KLQkqIGNvbmZpZy9oby12YXguaCAocmVhbGxvYyk6IERlY2xhcmUuCi0KLQkqIGNvbmZpZy9oby12bXMuaCAoc3RyY2hyLCBzdHJkdXApOiBEZWNsYXJlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcGFyc2Vfb3B0aW9uKSBbT0JKX0VMRl06IEFjY2VwdCBhbmQgaWdub3JlCi0Jb3B0aW9uIGAtcScuCi0KLQlXZWQgTWF5IDE4IDIwOjUwOjM1IDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oIChEQkdfU19DX1NRVUFELCBEQkdfU19DX1VRVUFEKTogZGVmaW5lIHRoZXNlCi0JbmV3IFZNUyBzeW1ib2wtdHlwZSBtYWNyb3M7IHNpZ25lZCBhbmQgdW5zaWduZWQgcXVhZHdvcmQgaW50ZWdlcnMsCi0JZm9yIGBsb25nIGxvbmcnIHN1cHBvcnQuICBUaGVpciB2YWx1ZXMgY29tZSBmcm9tIHRoZSBleGlzdGluZwotCURTQyRLX0RUWVBFX1FVIGFuZCBEU0MkS19EVFlQRV9RIG1hY3JvcyBpbiA8ZGVzY3JpcC5oPi4gIFRoZQotCVZNUyBkZWJ1Z2dlciBub3cgcmVjb2duaXplcyBgbG9uZyBsb25nJyB2YXJpYWJsZXMgY29ycmVjdGx5LgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3R5cGVkZWZfcGFyc2UpIFtjYXNlICdyJ106IGFkZCBlbnRyaWVzCi0JZm9yIGdjYzIncyBwcmVkZWZpbmVkIHR5cGVzICJsb25nIGRvdWJsZSIgKHNhbWUgYXMgZG91YmxlLCBhcwotCXBlciBnY2MncyBjdXJyZW50IHN0YXRlKSwgImxvbmcgbG9uZyBpbnQiLCAibG9uZyBsb25nIHVuc2lnbmVkCi0JaW50IiwgYW5kIGZpbmFsIGBvdGhlcndpc2UnIGNhc2UgKHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgdHlwZQotCWFuZCBzaXplIGZpZWxkcykuICBbY2F2ZWF0OiAgcHJlZGVmaW5lZCB0eXBlcyAiY29tcGxleCBpbnQiLAotCSJjb21wbGV4IGZsb2F0IiwgImNvbXBsZXggZG91YmxlIiwgYW5kICJjb21wbGV4IGxvbmcgZG91YmxlIiBhcmUKLQlzdGlsbCBtaXNzaW5nLl0KLQotCSogY29uZmlnL2hvLXZtcy5oIChFWElUX0ZBSUxVUkUpOiBkZWZpbmUgYXMgMHgxMDAwMDAwMiBpbnN0ZWFkCi0Jb2YgMCwgYmVjYXVzZSB0aGUgbGF0dGVyIGluZGljYXRlcyBzdWNjZXNzIHJhdGhlciB0aGFuIGZhaWx1cmUKLQl3aGVuIHBhc3NlZCB0byBgZXhpdCcgb3IgcmV0dXJuIGZyb20gYG1haW4nIGNvbXBpbGVkIGJ5IGdjYzIuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKGFycmF5X3N1ZmZpeCwgZ2VuZXJhdGVfc3VmZml4KTogcmVwbGFjZSB0d28KLQloYXJkY29kZWQgYDB4YTMncyB3aXRoIG1hY3JvIERCR19TX0NfQURWQU5DRURfVFlQRSBmcm9tIG9iai12bXMuaC4KLQkoVk1TX3R5cGVkZWZfcGFyc2UpOiBlbGltaW5hdGUgcmVkdW5kYW50IGlmLXRoZW4tZWxzZSB3aGVuCi0JYWxsb2NhdGluZyBuZXcgc3ltYm9sIGVudHJ5IGFuZCBsaW5raW5nIGl0IHRvIFZNU19TeW1ib2xfdHlwZV9saXN0LgotCi0JVHVlIE1heSAxNyAyMDo0NzozMSAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuYyAoV3JpdGVfVk1TX01IRF9SZWNvcmRzKTogZG9uJ3QgdHJ5IHRvIGludGVycHJldAotCXRoZSBjb250ZW50cyBvZiB0aGUgR0FTX1ZFUlNJT04gc3RyaW5nIHdoZW4gZmFsbGluZyBiYWNrIHRvIGl0IGZvcgotCWxhbmd1YWdlIHByb2Nlc3NvciBpZGVudGlmaWNhdGlvbi4KLQotCSogbWFrZS1nYXMuY29tLCB2bXNjb25mLnNoIChFTlZJUk9OKTogZml4IG1pc3NwZWxsaW5nIG9mCi0JYHBzZWN0X2F0dHInIGluIGxpbmtlciBvcHRpb25zLgotCi0JV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSB0byBsYXRlc3QgbWFrZWZpbGUuaW4KLQkqIGNvbmZpZy90ZS1nbzMyLmg6IFtuZXddIGdvMzIncyBlbnZpcm9ubWVudAotCi1GcmkgTWF5IDIwIDE3OjU5OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXMuaDogRG9uJ3QgZGVjbGFyZSBwYXJhbWV0ZXJzIGZvciBzdHJzdHIuCi0KLVRodSBNYXkgMTkgMTU6NDA6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2VjdGlvbl9hbGlnbik6IERvbid0IGNoYW5nZSB0aGUgc2l6ZSBpZgotCU9CSl9FTEYuCi0KLVdlZCBNYXkgMTggMTM6MDg6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlZGlyZWN0IGxuIG91dHB1dCB0byAvZGV2L251bGwuICBJZiBsbgotCWZhaWxzIG9uIGdhc3AsIGluc3RhbGwgZ2FzcC5uZXcsIG5vdCBnYXNwLgotCi1XZWQgTWF5IDE4IDA5OjE2OjM2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IFVzZSBSX0hQUEFfQUJTX0NBTEwsIG5vdCBSX0hQUEEgZm9yCi0JYWJzb2x1dGUgY2FsbHMuCi0KLVR1ZSBNYXkgMTcgMTI6NTA6NDYgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3BhcnNlX2ZwX2NtcF9jb25kKTogUmVwb3J0IGFuIGVycm9yCi0Jb24gYSBwYXJ0aWFsIGNvbXBsZXRlciBtYXRjaC4KLQotTW9uIE1heSAxNiAxMjowMzo0OSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogQ2hhbmdlIC5ocHBhX3Vud2luZCB0byAuUEFSSVNDLnVud2luZAotCXRocm91Z2hvdXQgY29kZS4KLQkoaXNfY29tcGxleCk6IERlbGV0ZSBkZWZpbml0aW9uIGFuZCBzdXBwb3J0IGZvciBjb21wbGV4IHJlbG9jYXRpb24KLQl0eXBlcy4KLQkodGNfZ2VuX3JlbG9jKTogRGVsZXRlIHNwZWNpYWwgdW53aW5kIGNydWQgZm9yIEVMRi4gIFNpbXBsaWZ5IGFuZAotCXJld3JpdGUgRUxGIGNvZGUgYmFzZWQgb24gOTQtMDItMDIgUEEgRUxGIGRyYWZ0IHNwZWMuCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IFVzZSBzdGFuZGFyZCBQQVJJU0NfRElSMzIgcmVsb2NzIGZvcgotCXRoZSB1bndpbmQgZGVzY3JpcHRvcnMuCi0KLUZyaSBNYXkgIDYgMTQ6MTM6MTUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2dvMzIubWg6IE5ldyBtYWtlZmlsZSBmcmFnbWVudCBmb3IgZ28zMiBjcm9zc2luZy4KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdD09Z28zMik6IFVzZSBuZXcgZnJhZ21lbnQuCi0KLUZyaSBNYXkgIDYgMTQ6MzU6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBnYXNwLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKG1haW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGkuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYmVnaW4pOiBXaGVuIHVzaW5nIC1tYW55LCBwZXJtaXQgY29tcGFyaXNvbgotCWluc3RydWN0aW9ucyB0byBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gdGhlIG9wY29kZSB0YWJsZS4KLQotVGh1IE1heSAgNSAxOToxNDo0MyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZSB0byAyLjIuOTAuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldykgW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBwZXJtaXQgYWRkaXRpb25zCi0JdG8gdGhlIHN5bWJvbCB0YWJsZSBpZiBpdCdzIGFscmVhZHkgYmVlbiBzZXQgaW4gdGhlIG91dHB1dCBiZmQuCi0JKHN5bWJvbF9iZWdpbikgWyEgRU1JVF9TRUNUSU9OX1NZTUJPTFNdIFtSRUxPQ19SRVFVSVJFU19TWU1CT0xdOgotCURvbid0IHVzZSBiZmRfYWJzX3NlY3Rpb24uc3ltYm9sIGZvciBnYXMgYWJzb2x1dGUgc3ltYm9sLgotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGRpc3RjbGVhbiwgY2xlYW4tZHZpLCBjbGVhbi1pbmZvKTogRGVsZXRlIGdhc3AKLQlmaWxlcyB0b28uCi0KLVRodSBNYXkgIDUgMTg6MTI6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2VtaXRfZGVsYXlzKTogTWFrZSBjYWxsIHRvCi0JbWlwc19ub19wcmV2X2luc24gdW5jb25kaXRpb25hbC4KLQotVGh1IE1heSAgNSAxNzoyNTozOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYqLio6IE1lcmdlZCBjb2ZmYmZkIHZlcnNpb25zIGludG8gY29mZiB2ZXJzaW9ucywKLQl3aXRoIGEgc2luZ2xlICIjaWZkZWYgQkZEX0FTU0VNQkxFUiIgY29udHJvbGxpbmcgbW9zdCBvZiBpdCBmb3IKLQlub3cuICBEZWxldGVkIG9iai1jb2ZmYmZkLiogZmlsZXMuCi0JKiBjb25maWd1cmUuaW46IEFsd2F5cyB1c2Ugb2JqLWNvZmYuKiBmb3IgQ09GRiB0YXJnZXRzLgotCi1XZWQgTWF5ICA0IDEzOjM0OjExIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90ZS1kcHgyLmggKFRBUkdFVF9GT1JNQVQsIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCk6Ci0JRGVmaW5lLgotCSogY29uZmlndXJlLmluIChtNjhrLWJ1bGwtc3lzdjMqKTogRW5hYmxlLgotCi0JKiBjb25maWcvY29mZl9nbnUuaDogRGVsZXRlZC4KLQotV2VkIE1heSAgNCAxMToyOToxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBJZiBub3QgVEVfU1VOMywgZGVmaW5lIGFzCi0JImEub3V0LXplcm8uYmlnIi4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpeHVwX3NlZ21lbnQpOiBNYWtlIGNvbW1vbiBzeW1ib2wgYW5kIFBDCi0JcmVsYXRpdmUgYWRqdXN0bWVudHMgd2hlbiBURV9MWU5YIGlzIGRlZmluZWQgYXMgd2VsbCBhcyB3aGVuCi0JVENfSTM4NiBpcyBkZWZpbmVkLgotCi1XZWQgTWF5ICA0IDAyOjI5OjIxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBhcy5oIChzdHJzdHIpOiBSZXN0b3JlIGRlY2xhcmF0aW9uLgotCShzdWJzZWdfZ2V0KSBbQkZEX0FTU0VNQkxFUl06IERlY2xhcmUuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgb2JqX2FkanVzdF9zeW10YWIgaXMgZGVmaW5lZCwKLQlpbnZva2UgaXQuICBUaGVuIGNhbGwgc2V0X3N5bXRhYiwgYW5kIGZpbmFsbHkgaW52b2tlICpfZnJvYl9maWxlCi0JaG9va3MuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9hZGp1c3Rfc3ltdGFiKTogUmVuYW1lZCBmcm9tCi0JY29mZl9mcm9iX2ZpbGUuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9hZGp1c3Rfc3ltdGFiKTogQ2hhbmdlZCBkZWNsYXJhdGlvbgotCWFjY29yZGluZ2x5LgotCShvYmpfYWRqdXN0X3N5bXRhYik6IE1hY3JvIGFsc28gY2hhbmdlZC4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotZ251Kik6IE5ldyB0YXJnZXQsIGhhbmRsZWQgbGlrZSBpMzg2LW1hY2guCi0KLVR1ZSBNYXkgIDMgMjE6MDQ6MTYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmggKFRBUkdFVF9GT1JNQVQpIFtUQ19JOTYwXTogU2VsZWN0IGxpdHRsZQotCWVuZGlhbiB2ZXJzaW9uLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoVEFSR0VUX0ZPUk1BVCkgW1RDX0k5NjBdOiBEaXR0by4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zZWN0aW9uKTogUm91bmQgdXAgdGhlIHNpemUgb2YKLQlldmVyeSBzZWN0aW9uIHRvIGEgbXVsdGlwbGUgb2YgdGhlIGFsaWdubWVudCwgc28gdGhhdCBCRkQgZG9lc24ndAotCXN1cnByaXNlIHVzLgotCi0JRWxpbWluYXRlIG1hbnkgc2ltcGxlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBDT0ZGIGJhY2sgZW5kczoKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IFJlbW92ZWQgYWxsIHVzZXMgb2YgREVGVU4gYW5kIERFRlVOX1ZPSUQuCi0JTWFkZSBtaW5vciBzdHlsaXN0aWMgY2hhbmdlcywgZGVsZXRlZCBzb21lIHJlZ2lzdGVyIGRlY2xhcmF0aW9ucy4KLQkoc3RhY2tfdG9wKTogRGVsZXRlZC4KLQkoc3ltYm9sX3RvX2NoYXJzKTogVXNlIGFic29sdXRlX3NlY3Rpb24gYW5kIHJlZ19zZWN0aW9uIGluc3RlYWQgb2YKLQl0aGUgY29ycmVzcG9uZGluZyBTRUdfKiBzeW1ib2xzLgotCShvYmpfY29mZl9lbmRlZiwgdGFnX2ZpbmRfb3JfbWFrZSwgZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCShzdGFjayB0eXBlZGVmLCBzdGFja19pbml0LCBzdGFja19kZWxldGUsIHN0YWNrX3B1c2gsIHN0YWNrX3BvcCk6Ci0JTW92ZWQgdG8ganVzdCBhZnRlciBwc2V1ZG8tb3AgdGFibGUuICBBbGwgZnVuY3Rpb25zIG5vdyBzdGF0aWMuCi0JKHN0YWNrX2RlbGV0ZSk6IFJlbW92ZWQgZGVjbGFyYXRpb24uCi0JKHRhZ19pbml0LCB0YWdfaW5zZXJ0LCB0YWdfZmluZF9vcl9tYWtlLCB0YWdfZmluZCk6IE1vdmVkIHRvIGp1c3QKLQlhZnRlciBzdGFjayBmdW5jdGlvbnMuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaDogUmVvcmRlcmVkIHNvbWUgZGVjbGFyYXRpb25zIGFuZCBtYWNyb3MuCi0JKHN0YWNrX2luaXQsIHN0YWNrX2RlbGV0ZSwgc3RhY2tfcHVzaCwgc3RhY2tfcG9wKTogRG9uJ3QgZGVjbGFyZS4KLQkoc3RhY2sgdHlwZWRlZik6IERlbGV0ZWQuCi0JKFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMpOiBBbHdheXMgdW5kZWYgdGhlbiBkZWZpbmU7IGRvbid0IHRlc3QuCi0JKFNZTV9BVVhFTlQpOiBOZXcgbWFjcm8uCi0JKFNBX0dFVF8qLCBTQV9TRVRfKik6IERlZmluZSBpbiB0ZXJtcyBvZiBTWU1fQVVYRU5UIHdoZW4gZmVhc2libGUuCi0JKFNGX0dFVF8qLCBTRl9TRVRfKik6IERlZmluZSBpbiB0ZXJtcyBvZiBTRl9HRVQgd2hlbiBmZWFzaWJsZS4KLQkoU0FfR0VUX1NZTV9UQUdORFgsIFNBX0dFVF9TWU1fRU5ETkRYLCBTQV9TRVRfU1lNX1RBR05EWCwKLQlTQV9TRVRfU1lNX0VORE5EWCwgb2JqZWN0X2hlYWRlcnMgdHlwZWRlZiwgZGF0YV9zZWN0aW9uX2hlYWRlciwKLQl0ZXh0X3NlY3Rpb25faGVhZGVyKTogRGVsZXRlIG5vbi1CRkRfSEVBREVSUyB2ZXJzaW9ucywgc2luY2Ugd2UKLQlhbHdheXMgZGVmaW5lIHRoYXQgc3ltYm9sIG5vdy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHN0YWNrX3RvcCk6IERlbGV0ZWQuCi0JKG9ial9jb2ZmX2VuZGVmLCBvYmpfY29mZl9kaW0sIG9ial9jb2ZmX2xpbmUsIG9ial9jb2ZmX3NpemUsCi0Jb2JqX2NvZmZfc2NsLCBvYmpfY29mZl90YWcsIG9ial9jb2ZmX3R5cGUsIG9ial9jb2ZmX3ZhbCk6IENoYW5nZQotCWFyZ3VtZW50IG5hbWUgZnJvbSAiaWdub3JlZCIgdG8gImlnbm9yZSIuCi0JKG9ial9jb2ZmX3ZhbCk6IFVzZSBmcmFnX25vd19maXguCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIElHTk9SRV9ERUJVRyB2ZXJzaW9uLCBzaW5jZSBpdCBkb2Vzbid0Ci0JZ2V0IHVzZWQuCi0JKHN0YWNrIHR5cGVkZWYsIHN0YWNrX2luaXQsIHN0YWNrX2RlbGV0ZSwgc3RhY2tfcHVzaCwgc3RhY2tfcG9wKToKLQlNb3ZlZCB0byBqdXN0IGFmdGVyIHBzZXVkby1vcCB0YWJsZS4gIEFsbCBmdW5jdGlvbnMgbm93IHN0YXRpYy4KLQkodGFnX2luaXQsIHRhZ19pbnNlcnQsIHRhZ19maW5kX29yX21ha2UsIHRhZ19maW5kKTogTW92ZWQgdG8ganVzdAotCWFmdGVyIHN0YWNrIGZ1bmN0aW9ucy4KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBSZW9yZGVyZWQgc29tZSBkZWNsYXJhdGlvbnMgYW5kIG1hY3Jvcy4KLQlQcm90ZWN0ZWQgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCShzdGFja19pbml0LCBzdGFja19kZWxldGUsIHN0YWNrX3B1c2gsIHN0YWNrX3BvcCk6IERvbid0IGRlY2xhcmUuCi0JKHN0YWNrIHR5cGVkZWYpOiBEZWxldGVkLgotCShTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTKTogQWx3YXlzIHVuZGVmIHRoZW4gZGVmaW5lOyBkb24ndCB0ZXN0LgotCShzdGRvdXRwdXQpOiBEZWxldGVkIGRlY2xhcmF0aW9uLgotCShUQVJHRVRfRk9STUFUKSBbVENfSTM4Nl06IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCi0KLU1vbiBNYXkgIDIgMTc6MDk6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogVXNlIGZpeF90YWlsIGZpZWxkIGV2ZW4gaWYKLQlCRkRfQVNTRU1CTEVSLgotCSogc3Vic2Vncy5jIChzdWJzZWdfY2hhbmdlKTogSW5pdGlhbGl6ZSBmaXhfdGFpbCBmaWVsZC4KLQkoc3Vic2VnX2dldCk6IExpa2V3aXNlLgotCSogd3JpdGUuYyAoZnJhZ3NfY2hhaW5lZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGZpeF9uZXdfaW50ZXJuYWwpOiBJZiBmcmFnc19jaGFpbmVkIGlzIHNldCwgdXNlIGZpeF9yb290IGFuZAotCWZpeF90YWlsIGZyb20gc2VnX2luZm8gKG5vd19zZWcpLCByYXRoZXIgdGhhbiBmcmNoYWluX25vdy4KLQkoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSk6IFNldCBmaXhfdGFpbCBmaWVsZC4KLQkoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIpOiBTZXQgZnJhZ3NfY2hhaW5lZC4KLQotVGh1IEFwciAyOCAwMTozOToxNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc19vcHRpb24pOiBPbmx5IHJlZmVyIHRvIGdfc3dpdGNoXyogdmFyaWFibGVzCi0JaWYgR1BPUFQgaXMgZGVmaW5lZC4KLQkoc19hYmljYWxscyk6IERpdHRvLgotCShtZF9hcHBseV9maXgpOiBDYXN0IGNoYXIqIHRvIHVuc2lnbmVkIGNoYXIqIHRvIGF2b2lkIHBvaW50ZXIKLQltaXNtYXRjaC4KLQotV2VkIEFwciAyNyAxMTowNjozMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1nbzMyKTogVXNlcyBjb2ZmIG5vdy4KLQkqIGdhc3AuYyAobWFpbik6IE5vdyB0YWtlcyAtRCBvbiBjb21tYW5kIGxpbmUuCi0JKHNob3dfdXNhZ2UpOiBEZXNjcmliZSBuZXcgb3B0aW9ucy4KLQotVHVlIEFwciAyNiAxNzoxMDozMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogUHJpbnQgIk5PIERFRklORUQgU1lNQk9MUyIgYW5kCi0JIk5PIFVOREVGSU5FRCBTWU1CT0xTIiBpZiB0aGVyZSBhcmVuJ3QgYW55LCBpbnN0ZWFkIG9mIGRpc3BsYXlpbmcKLQl0aGUgaGVhZGVyIHdpdGggYW4gZW1wdHkgbGlzdC4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6IENoZWNrIENPRkZfTk9MT0FEX1BST0JMRU0KLQlhbHNvIGJlZm9yZSBzZXR0aW5nIFNUWVBfTk9MT0FEIGZvciAuYnNzIHNlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCk6IE5ldyB2YXJpYWJsZS4KLQlJbml0aWFsaXplZCB0byB2YWx1ZSBvZiBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwsIGlmIGRlZmluZWQsIG9yCi0JemVyby4KLQkobTY4a19yZWdfcGFyc2UpOiBJZiBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgaXMgc2V0LCBwZXJtaXQKLQlyZWdpc3RlciBwcmVmaXggdG8gYmUgYWJzZW50LgotCShtNjhrX2lwX29wKTogQWNjZXB0IGAmJyBhbHNvIGZvciBpbW1lZGlhdGUgY29uc3RhbnRzLgotCShpbnNlcnRfcmVnKTogRG9uJ3QgYm90aGVyIHdpdGggKHR3byE/KSBzYW5pdHkgY2hlY2tzIG9mIHRoZQotCXN5bWJvbCB0YWJsZSB3aGVuIGluc2VydGluZyBlYWNoIHJlZ2lzdGVyLgotCShtNjhrX3BhcnNlX2xvbmdfb3B0aW9uKTogTmV3IGZ1bmN0aW9uLiAgU2V0Ci0JZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsIGlmICJyZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWwiIGlzIHBhc3NlZC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFJFR0lTVEVSX1BSRUZJWCk6IEFsd2F5cyBkZWZpbmUgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCShPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVgpOiBEb24ndCBkZWZpbmUuCi0JKFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCk6IElmIG5vdCBhbHJlYWR5IGRlZmluZWQsIGRlZmluZSBhcyB6ZXJvCi0Jb3Igb25lIGRlcGVuZGluZyBvbiBNNjhLQ09GRi4KLQotCVNvbWUgY2hhbmdlcyB0byBoZWxwIEFwb2xsbyBzdXBwb3J0LCBmcm9tIHRyb3lAY2JtZS51bnN3LmVkdS5hdToKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKERBVEEsIEFERFIsIFNQLCBGUFJFRywgQ09QTlVNLCBCQUQsIEJBQyk6Ci0JRGVmaW5lIGFzIG1hY3JvcyBpbnN0ZWFkIG9mIGVudW1lcmF0b3JzLCBzaW5jZSB0aGUgQXBvbGxvIGNvbXBpbGVyCi0JY2FuJ3QgaGFuZGxlICJlbnVtVmFsMSwgZW51bVZhbDIgPSBlbnVtVmFsMSIgd2hlbiBkZWZpbmluZyBhbiBlbnVtCi0JdHlwZS4KLQkobWFrZV9wY3JlbF9hYnNvbHV0ZSkgW05PX1BDUkVMX1JFTE9DU106IE5ldyBmdW5jdGlvbi4KLQkodGNfY29mZl9maXgycnR5cGUpIFtOT19QQ1JFTF9SRUxPQ1NdOiBHZW5lcmF0ZSBvbmx5IFJfUkVMQllURSwKLQlSX0RJUjE2LCBhbmQgUl9ESVIzMiByZWxvY3MuCi0JKiBjb25maWcvdGMtbTY4ay5oIFtURV9BUE9MTE9dIChDT0ZGX01BR0lDLCBDT0ZGX0FPVVRIRFJfTUFHSUMpOgotCVVzZSBBcG9sbG8gdmVyc2lvbnMuCi0JW1RFX0FQT0xMT10gKE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSKTogVW5kZWZpbmUuICBUaGF0IGlzLAotCWRvIGluY2x1ZGUgdGhlIG9wdGlvbmFsIGhlYWRlciBmb3IgQXBvbGxvIHRhcmdldC4KLQkoQ09GRl9NQUdJQyk6IERvbid0IGRlZmluZSBhcyBNQzY4TUFHSUMgaWYgaXQncyBhbHJlYWR5IGRlZmluZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggW1RFX0RFTFRBXSAoTEVYX1BDVCk6IERlZmluZSBhcyAxLCBzbyB0aGF0IGAlJwotCWNhbiBiZSB1c2VkIHdpdGhpbiBhIGxhYmVsIG5hbWUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogRGVjbGFyZS4KLQkodGNfaW5pdF9hZnRlcl9hcmdzKTogRGVmaW5lIGFzIG02OGtfaW5pdF9hZnRlcl9hcmdzLgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBOZXcgZnVuY3Rpb24sCi0JY29udGFpbmluZyBvbmUtc2hvdCBjb2RlIGZyb20gbWRfYXNzZW1ibGUuICBBZGRlZCB3YXJuaW5nIGZvcgotCWNvbWJpbmF0aW9uIG9mIDY4MDQwIGFuZCA2ODg1MS4KLQkobWRfYXNzZW1ibGUpOiBTdGFydHVwLXRpbWUgY29kZSBkZWxldGVkLgotCi1Nb24gQXByIDI1IDE2OjE5OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluIChjbGVhbiwgZGlzdGNsZWFuKTogUmVtb3ZlIGFzY29uZmlnLnRleGkuCi0KLVN1biBBcHIgMjQgMDA6MTM6MDggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogMTMgYml0IGltbWVkaWF0ZSBjb25zdGFudCAoZm9yIGJyZWFrCi0JaW5zdHJ1Y3Rpb24pIGlzIHVuc2lnbmVkLgotCi1GcmkgQXByIDIyIDE3OjU4OjIyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBVc2UgYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZQotCWFuZCBiZmRfZWNvZmZfc2V0X3JlZ21hc2tzIHRvIHNldCB0aGUgR1AgdmFsdWUgYW5kIHRoZSByZWdpc3RlcgotCW1hc2tzLCByYXRoZXIgdGhhbiB1c2luZyB0aGUgbm93IG9ic29sZXRlIGZha2UgLnJlZ2luZm8gc2VjdGlvbi4KLQotRnJpIEFwciAyMiAxNToxNzowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogRG9uJ3QgcHJpbnQgcmVnaXN0ZXIgc3ltYm9scyBhcwotCXVuZGVmaW5lZC4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEb24ndCBuZWVkIHRvIHN0cmlwCi0JdW5kZXJzY29yZXMsIHNpbmNlIHN5bWJvbF9uZXcgd2lsbCBhbHJlYWR5IGhhdmUgZG9uZSBpdC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfc3ltYm9sX25ld19ob29rKTogRGl0dG8uCi0KLQkqIGFzLmMgKG1haW4pOiBJZiB0Y19pbml0X2FmdGVyX2FyZ3MgaXMgZGVmaW5lZCwgaW52b2tlIGl0IGFmdGVyCi0JYWxsIGFyZ3VtZW50cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgotCi0JU29tZSBjaGFuZ2VzIHRvIGhlbHAgQXBvbGxvIHN1cHBvcnQsIGZyb20gdHJveUBjYm1lLnVuc3cuZWR1LmF1OgotCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKSBbVEVfQVBPTExPXTogQ3JlYXRlIC53dGV4dAotCXNlY3Rpb24gaW5zdGVhZCBvZiAudGV4dC4gIENhbGwgY3JlYXRlX3RhcmdldF9zZWdtZW50cy4KLQkqIHJlYWQuYyAoZGVtYW5kX2NvcHlfc3RyaW5nKTogTm8gbG9uZ2VyIHN0YXRpYy4KLQotVGh1IEFwciAyMSAxNTo1MDowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogUGVybWl0IGJyYW5jaGVzIHRvIGJlIHN3aXRjaGVkCi0Jd2l0aCB0aGUgcHJlY2VkaW5nIGluc3RydWN0aW9uIGV2ZW4gaWYgLnNldCBub2JvcHQgaGFzIGJlZW4gc2Vlbi4KLQkuc2V0IG5vYm9wdCBhY3R1YWxseSBjb250cm9scyB3aGV0aGVyIHRvIGJyaW5nIHVwIGFuIGluc3RydWN0aW9uCi0JZnJvbSB0aGUgYnJhbmNoIHRhcmdldCwgd2hpY2ggZ2FzIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0LgotCi1XZWQgQXByIDIwIDE4OjQ2OjE0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oLCBjb25maWcvb2JqLWNvZmYuYzogRGVsZXRlZCBhbGwgY29kZSB1c2VkIG9ubHkKLQl3aGVuIEJGRF9BU1NFTUJMRVIgaXMgbm90IGRlZmluZWQsIGFuZCBhbGwgY29uZGl0aW9uYWxzIHJlbGF0aW5nCi0JdG8gc3VjaCBjb2RlLiAgTm8gc3VjaCB0YXJnZXRzIHJlbWFpbi4KLQotCUZpeGVzIGZvciBzdGFicy1pbi1jb2ZmOgotCSogY29uZmlnL29iai1jb2ZmLmM6IEluY2x1ZGUgc3Vic2Vncy5oLgotCShjb2ZmX2Zyb2Jfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24sCi0JY29mZl9mcm9iX3NlY3Rpb24pOiBEZWNsYXJlLgotCShvYmpfZnJvYl9zZWN0aW9uKTogTmV3IG1hY3JvOyB1c2VzIGNvZmZfZnJvYl9zZWN0aW9uLgotCShJTklUX1NUQUJfU0VDVElPTik6IE5ldyBtYWNybzsgdXNlcyBvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBBbHdheXMgcm91bmQgdXAgdG8KLQltdWx0aXBsZSBvZiBhbGlnbm1lbnQgcG93ZXIgc3BlY2lmaWVkIGluIGJmZCB0YXJnZXQgdmVjdG9yLgotCi0JKiBnYXNwLmM6IEluY2x1ZGUgY3R5cGUuaC4KLQotTW9uIEFwciAxOCAyMTowODowMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW4sIGRvYy9hcy50ZXhpbmZvOiBSZW5hbWVkIGFzZG9jLWNvbmZpZy50ZXhpIHRvCi0JYXNjb25maWcudGV4aS4KLQotCSogZG9jL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8tYXMsIGluc3RhbGwtaW5mby1nYXNwKTogR2V0IGZpbGUKLQluYW1lcyBmcm9tIHNvdXJjZSBkaXJlY3Rvcnkgd2l0aG91dCBwYXRobmFtZS4KLQotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3dyaXRlX29iamVjdF9maWxlKTogV2hpbGUgbG9va2luZyBmb3IKLQlyZWdpc3RlciBtYXNrLCBza2lwIGVtcHR5IGZpbGwgZnJhZ3MgY2F1c2VkIGJ5IGVuYWJsaW5nIGxpc3RpbmcKLQlvdXRwdXQuCi0KLQkqIGNvbmZpZy9oby1zeXN2Lmg6IEluY2x1ZGUgc3RyaW5nLmguCi0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogTmV3ICh3ZWxsLCByZWNlbnRseSBhZGRlZCkgZmlsZS4gIEp1c3QgYWRkZWQKLQlpbmZvIG9uIGFzX3dhcm4gYW5kIGZyaWVuZHMuCi0KLU1vbiBBcHIgMTggMTQ6Mjg6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiBVc2UgdGhlIGJ1aWx0LWluCi0JZGVmYXVsdHMgZm9yIGRlZmluZWQsIHByaXZhdGUsIGFuZCBzcG51bSBmaWVsZHMgZm9yIHRoZQotCSRURVhUJCBhbmQgJFBSSVZBVEUkIHNwYWNlcy4gIERvIG5vdCBjbG9iYmVyIHNwbnVtLiAgRG8KLQlub3QgcmVzZXQgdGhlIHNlZ21lbnQgaWYganVzdCB1cGRhdGluZyBhIHNwYWNlLgotCShwYV9zcGFjZXNfYmVnaW4pOiBTZXQgQkZEIHNlY3Rpb24gZmxhZ3MgZm9yIGFsbCBidWlsdC1pbgotCXN1YnNwYWNlcy4KLQotRnJpIEFwciAxNSAxMDo1MTo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGZpcnN0X3Byb2NfcHRyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYWRkX3Byb2NlZHVyZSk6IFNldCBmaXJzdF9wcm9jX3B0ciBpZiBpdCBoYXNuJ3QgYmVlbiBzZXQuCi0JKGVjb2ZmX2J1aWxkX2xpbmVubyk6IElmIHRoZSBmaXJzdCBwcm9jZWR1cmUgZG9lcyBub3Qgc3RhcnQgYXQKLQlhZGRyZXNzIHplcm8sIGluc2VydCBhIGR1bW15IGxpbmUgdG8gY29tcGVuc2F0ZS4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCwgYm9vdHN0cmFwMiwgYm9vdHN0cmFwMyk6IE1ha2UgZ2FzcC5uZXcKLQlhcyB3ZWxsIGFzIGFzLm5ldy4KLQotVGh1IEFwciAxNCAxNToxMjozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBUcnkgdG8gcGFyc2UgIjBmIiBhbmQgIjBiIiBzZXF1ZW5jZXMgYXMKLQlmbG9hdGluZyBwb2ludCBhbmQgYmluYXJ5IG51bWJlcnMgcmVzcGVjdGl2ZWx5OyBpZiBpdCBkb2Vzbid0Ci0Jd29yaywgdHJlYXQgdGhlbSBhcyBsb2NhbCBsYWJlbHMuCi0KLQkqIE1ha2VmaWxlLmluOiBNYWtlICQoT0JKUykgZGVwZW5kIG9uICQoQUxMX09CSl9ERVBTKS4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEFMTF9PQkpfREVQUyBpbiBvdXRwdXQgTWFrZWZpbGUuCi0KLQlCYXNlZCBvbiBzdWdnZXN0aW9ucyBmcm9tIDxCQUlMRVlAaG1pdmF4Lmh1bWdlbi51cGVubi5lZHU+Ci0JKENoYXJsZXMgQmFpbGV5KToKLQkqIHZtc2NvbmYuc2g6IEluIGdlbmVyYXRlZCBmaWxlLCBnZXQgIi5vYmoiIHN1ZmZpeCByaWdodCwgYnVpbGQKLQlzb3VyY2UgZmlsZXMgZnJvbSBvdGhlciBkaXJlY3RvcmllcyBpbnRvIG9iamVjdHMgaW4gdGhlIGN1cnJlbnQKLQlkaXJlY3RvcnksIGFuZCBzcGVjaWZ5IFBTRUNUIGF0dHJpYnV0ZXMgZXhwbGljaXRseSB0byBsaW5rZXIuCi0JQWxzbyBhZGRlZCBtaXNzaW5nIGxhYmVsLgotCSogTWFrZWZpbGUuaW4gKHN0YW1wLW1rLmNvbSk6IFJlZmVyZW5jZSBuZXcgdmFyaWFibGUKLQlWTVNfT1RIRVJfT0JKUyBmb3IgbGlzdCBvZiBub24tbG9jYWwgb2JqZWN0IGZpbGVzLCBpbnN0ZWFkIG9mCi0JbGlzdGluZyB0aGVtIGhlcmUuCi0JKFZNU19PVEhFUl9PQkpTKTogTmV3IHZhcmlhYmxlLCBhZGRlZCBtb3JlIGxpYmliZXJ0eSBmaWxlcy4KLQkqIG1ha2UtZ2FzLmNvbTogUmVnZW5lcmF0ZWQuCi0KLQkqIGNvbmZpZy9oby12bXMuaCAodW5saW5rKTogRGVmaW5lIGFzIGRlbGV0ZS4KLQotCSogY29uZmlnLWdhcy5jb206IEZpeCBxdW90aW5nIG9uIFRBUkdFVF9DQU5PTklDQUwgZGVmaW5pdGlvbi4KLQlEZWxldGUgZmlsZXMgYmVmb3JlIGNyZWF0aW5nIHRoZW0uCi0KLVRodSBBcHIgMTQgMTM6MzQ6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGUtc3RhZ2UxLCBkZS1zdGFnZTIsIGRlLXN0YWdlMyk6IFVzZSBybSAtZi4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoRElGRl9FWFBSX09LKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBQZXJtaXQgQkZEX1JFTE9DX1BDUkVMX0xPMTYgZm9yCi0JY2VydGFpbiBjYXNlcyBvZiAnaScsICdqJyBhbmQgJ28nLiAgQ2hhbmdlICd1JyB0byB0YWtlIGFuCi0JYXJndW1lbnQsIHRoZSByZWxvYyB0eXBlLgotCShsb2FkX3JlZ2lzdGVyKTogUGFzcyByZWxvYyB0eXBlIHRvIG1hY3JvX2J1aWxkIGZvciAndScuCi0JKG1hY3JvKTogTGlrZXdpc2UuICBGb3IgTV9MQV9BQiBwZXJtaXQgYSBkaWZmZXJlbmNlIGV4cHJlc3Npb24KLQl3aGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUgYmV0d2VlbiBhbiBhcmJpdHJhcnkgc3ltYm9sIGFuZAotCWEgc3ltYm9sIGluIHRoZSAudGV4dCBzZWN0aW9uLgotCShtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TIGFuZAotCUJGRF9SRUxPQ19QQ1JFTF9MTzE2IHRvIGJlIGVtaXR0ZWQuCi0JKG1kX2FwcGx5X2ZpeCk6IENoZWNrIHRoYXQgbW9zdCByZWxvY3MgYXJlIG5vdCBQQyByZWxhdGl2ZS4KLQlIYW5kbGUgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyBhbmQgQkZEX1JFTE9DX1BDUkVMX0xPMTYuCi0JKHRjX2dlbl9yZWxvYyk6IENoYW5nZSAjZXJyb3IgdG8gYXNfZmF0YWwuICBIYW5kbGUKLQlCRkRfUkVMT0NfUENSRUxfTE8xNiBhbmQgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUy4KLQotVHVlIEFwciAxMiAxODoyNToxMyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2Vnc19iZWdpbik6IENhbGwgbWVtc2V0IHdpdGggYXJncyBpbiB0aGUgY29ycmVjdAotCW9yZGVyLgotCShzdWJzZWdfZ2V0KTogQ2xlYXIgbmV3bHkgYWxsb2NhdGVkIHNlZ2luZm8sIHNldCBpdHMgcG9pbnRlciBzbG90cwotCXRvIE5VTEwgaW5zdGVhZCBvZiAwLgotCi1Nb24gQXByIDExIDA5OjAwOjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wcm9jZW5kKTogSGFuZGxlIGNhc2Ugd2hlcmUgbGFiZWwgd2FzCi0JZGVmaW5lZCBhZnRlciB0aGUgLnByb2MgZGlyZWN0aXZlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wcm9jZW5kKTogR2l2ZSBhbiBlcnJvciBpZiB3ZSBlbmNvdW50ZXIgYQotCXByb2NlbmQgZm9yIGEgcHJvY2VkdXJlIHdpdGhvdXQgYSBuYW1lLgotCi1UaHUgQXByICA3IDE0OjI4OjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBQYXNzIE5VTEwgZm9yIGV4cHJlc3Npb24gYXJndW1lbnQgdG8KLQltYWNyb19idWlsZCBmb3Igbm9yaSBjYXNlLgotCShTV0lUQ0hfVEFCTEUpOiBEZWZpbmUuCi0JKG1pcHNfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIGEgcmVsb2NhdGlvbiBmb3IgYSBzd2l0Y2ggdGFibGUKLQllbnRyeS4KLQkobWRfYXBwbHlfZml4KTogV3JpdGUgc3dpdGNoIHRhYmxlIGVudHJ5IHZhbHVlIGludG8gZmlsZS4KLQkodGNfZ2VuX3JlbG9jKTogVXNlIEJGRF9SRUxPQ19HUFJFTDMyIGZvciBhIHN3aXRjaCB0YWJsZSBlbnRyeSwKLQlhbmQgc2V0IHRoZSBhZGRlbmQgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQKLQl0aGUgc3VidHJhaGVuZC4KLQotVGh1IEFwciAgNyAxMDozODoxOCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuaCAoZWxmX3RjX3N5bWJvbCk6IERlbGV0ZS4gIE5vIGxvbmdlciB1c2VkLgotCShlbGZfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShocHBhX3RjX21ha2Vfc2VjdGlvbnMsIGhwcGFfdGNfc3ltYm9sKTogRGVsZXRlIGV4dGVybiBkZWNscy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogRGVsZXRlIGZ1bmN0aW9uLgotCShocHBhX3RjX3N5bWJvbCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9maWxlKTogRGVsZXRlIGVsZl90Y19zeW1ib2wgYW5kCi0JZWxmX3RjX21ha2Vfc2VjdGlvbnMgc3R1ZmYuICBJdCB3YXMgdGhlcmUgdG8gc3VwcG9ydCBQQSBicmFpbmRhbWFnZQotCXdoaWNoIGhhcyBiZWVuIGZpeGVkLCBhbmQgaW4gdGhlIGNhc2Ugb2YgZWxmX3RjX21ha2Vfc2VjdGlvbnMgaXMKLQlyZWR1bmRhbnQgd2l0aCBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZy4KLQotV2VkIEFwciAgNiAyMDo0ODozMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLSplbGYqKTogRG9uJ3QgcmVxdWlyZSAiLWhwLSIgZm9yIHRoZQotCW1hbnVmYWN0dXJlci4KLQotVHVlIEFwciAgNSAxNTo0ODowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBGb3IgY2FzZSAnbycsIHdoZW4gZ2VuZXJhdGluZwotCWVtYmVkZGVkIFBJQyBjb2RlLCBhY2NlcHQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gbG9jYWwgc3ltYm9scwotCWFzIGJlaW5nIGNvbnN0YW50LgotCShtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBPbmx5IGZvcmNlIGEgcmVsb2MgdG8gYmUgZ2VuZXJhdGVkIGZvciBhCi0JUEMgcmVsYXRpdmUgZml4dXAuCi0JKG1kX2FwcGx5X2ZpeCk6IEZvciBCRkRfUkVMT0NfMzIgYW5kIEJGRF9SRUxPQ19MTzE2LCBwdXQgdGhlIGZpeHVwCi0JdmFsdWUgaW50byB0aGUgZmlsZSBpZiB0aGUgZml4dXAgd2lsbCBub3QgZ2VuZXJhdGUgYSByZWxvYy4KLQotVHVlIEFwciAgNSAxMToxNDoxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3Jlc2VydmUpOiBJZiBzZWN0aW9uIHBhc3NlZCBpc24ndCBic3MsCi0JZG9uJ3Qgc3BldyByZW1haW5kZXIgb2YgaW5wdXQgZmlsZSBpbiBlcnJvciBtZXNzYWdlLgotCSh0Y19nZW5fcmVsb2MpOiBJZiBiZmRfcmVsb2NfdHlwZV9sb29rdXAgcmV0dXJucyBudWxsLCBwcmludCBlcnJvcgotCW1lc3NhZ2Ugd2l0aCByZWxvYyB0eXBlIGFuZCB0cnkgdG8gcHJvY2VzcyByZW1haW5kZXIgb2YgZmlsZS4KLQotCSogZG9jL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8tYXMsIGluc3RhbGwtaW5mby1nYXNwKTogTmV3Ci0JdGFyZ2V0cywgbm93IGV4cGxpY2l0bHkgY2hlY2tpbmcgJChzcmNkaXIpIGZvciBpbmZvIGZpbGVzLgotCShpbnN0YWxsLWluZm8pOiBEZXBlbmQgb24gYm90aCBvZiB0aGVtOyBkbyBub3RoaW5nIG1vcmUuCi0KLU1vbiBBcHIgIDQgMTc6MDY6MDQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogRml4IHRoaW5rbyBpbiBFTEYgdmVyc2lvbi4KLQotTW9uIEFwciAgNCAxMjozOToyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2luc2VydF9vcGVyYW5kKTogQ2hlY2sgUFBDX09QRVJBTkRfU0lHTkVECi0JZmxhZyByYXRoZXIgdGhhbiBzaWduZWRwIGZpZWxkLiAgT25seSBwZXJtaXQgZXh0ZW5kZWQgcmFuZ2UgaWYKLQlQUENfT1BFUkFORF9TSUdOT1BUIGZsYWcgaXMgc2V0IGFuZCBhc3NlbWJsaW5nIGluIDMyIGJpdCBtb2RlLgotCUJhc2VkIG9uIHBhdGNoIGZyb20gRGF2aWQgRWRlbHNvaG4gKGVkZWxzb2huQG5wYWMuc3lyLmVkdSkuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3NpemUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcGNfYXJjaCk6IENoZWNrIGZvciBQUENfT1BDT0RFX1BQQyBiZWZvcmUgUFBDX09QQ09ERV9QT1dFUi4KLQkobWRfYmVnaW4pOiBJZiBhbiBpbnN0cnVjdGlvbiBoYXMgYSBzaXplIHNwZWNpZmljIGZsYWcgc2V0LCBvbmx5Ci0JYWRkIGl0IGlmIHdlIGFyZSBhc3NlbWJsaW5nIHRoYXQgc2l6ZS4KLQotVGh1IE1hciAzMSAxNjo1MToxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBBZGQgYSBncnVlc29tZSBoYWNrIHRvIGdldAotCWNyb3NzIHNlY3Rpb24gUEMgcmVsYXRpdmUgcmVsb2NzIHJpZ2h0IGZvciBDT0ZGIGFuZCBFTEYuCi0KLU1vbiBNYXIgMjggMTQ6Mzg6MjMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBBbHdheXMgZGVmaW5lLgotCShPQkpfUFJPQ0VTU19TVEFCKTogRG9uJ3QgZGVmaW5lLgotCi1Nb24gTWFyIDI4IDEyOjQwOjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9scyk6IERvbid0IGxldCBCRkQgY2xvYmJlcgotCXRoZSB0eXBlIG9mIHN5bWJvbCBzZXQgc3ltYm9scyB3aGljaCBoYXBwZW4gdG8gYmUgaW4gdGhlIGFic29sdXRlCi0Jb3IgdW5kZWZpbmVkIHNlY3Rpb24uCi0KLU1vbiBNYXIgMjggMTI6MzU6MDAgMTk5NCAgRGF2aWQgRWRlbHNvaG4gIChlZGVsc29obkBucGFjLnN5ci5lZHUpCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIC1tcHdyeCAoUE9XRVIvMiBha2EKLQlSSU9TMiksIC1tcHdyIChQT1dFUiBha2EgUklPUzEpLCAtbXBwYyAoUG93ZXJQQyBha2EgTVBDNjAzLzYwNCksCi0JYW5kIC1tYW55IChhbGwgYXJjaGl0ZWN0dXJlcykuCi0KLVN1biBNYXIgMjcgMTQ6MDQ6MTkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IFNldCBhZGRlbmQgZm9yIHJlbG9jYXRpb24KLQlpbnZvbHZpbmcgYSBmdW5jdGlvbiBzeW1ib2wgd2hpY2ggaXMgbm90IGEgcGxhYmVsIHRvIHplcm8uCi0JKG1kX2FwcGx5X2ZpeCk6IE5ldmVyIHBhc3MgYSBmdW5jdGlvbiBzeW1ib2wgdG8gZmllbGRfYWRqdXN0LgotCi1GcmkgTWFyIDI1IDE3OjM1OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogSWYgTl9FWFQgaXMgc2V0IGZvciBhbgotCU5fSU5EUiBzeW1ib2wsIHNldCBCU0ZfRVhQT1JUIGFuZCBjbGVhciBCU0ZfTE9DQUwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogSWYgRU1CRURERURfUElDLCBkb24ndCBzd2FwIGEKLQlicmFuY2ggd2l0aCBhbiBpbnN0cnVjdGlvbiB0aGF0IHVzZXMgJGF0LCBpbiBjYXNlIHRoZSBicmFuY2ggaXMKLQlsYXRlciBleHBhbmRlZC4KLQkobWFjcm8pOiBJZiBFTUJFRERFRF9QSUMsIGNhc2UgTV9KQUxfQSBtYXkgdXNlICRhdC4KLQkobWRfcGNyZWxfZnJvbSk6IElmIG5vdCBPQkpfQU9VVCwgcmV0dXJuIDQgZm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wKLQl0byBtYWtlIGl0IHBjcmVsX29mZnNldC4KLQkodGNfZ2VuX3JlbG9jKTogSWYgbm90IE9CSl9BT1VULCBzZXQgdGhlIHJlbG9jIGFkZGVuZCB0bwotCXJlbG9jLT5hZGRyZXNzOyBhbm90aGVyIGdydWVzb21lIGhhY2sgdG8gZ2V0IGdhcyByZWxvYyBoYW5kbGluZyB0bwotCWRvIHRoZSByaWdodCB0aGluZy4KLQotVGh1IE1hciAyNCAyMToyOToyOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfaXApOiBPbmx5IHNldCBHUCBwcm9sb2cgc2l6ZSBpZiB1c2luZwotCVBWIHJlZ2lzdGVyLgotCShUMTIpOiBOZXcgbWFjcm8uCi0JKGVtaXRfaW5zbik6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBDYWxsIGl0LgotCShhbHBoYV9mb3JjZV9yZWxvY2F0aW9uKTogSGFuZGxlIEJGRF9SRUxPQ18yNiwgZm9yIGNhbGxfcGFsCi0JaW5zdHJ1Y3Rpb25zLgotCShsaXR1c2VfcGVuZGluZyk6IE5ldyB2YXJpYWJsZS4gIFNldCBieSBhbnl0aGluZyB0aGF0IGdlbmVyYXRlcyBhCi0JTElURVJBTCByZWxvYywgY2xlYXJlZCBieSBhbnl0aGluZyB0aGF0IGdlbmVyYXRlcyBhIExJVFVTRSByZWxvYywKLQl0ZXN0ZWQgYnkgY29kZSB0aGF0IG1pZ2h0IHdhbnQgdG8gZW1pdCBhIExJVFVTRSByZWxvYy4KLQkoZW1pdF91bmFsaWduZWRfaW8pOiBOZXcgZnVuY3Rpb24uICBDdXJyZW50bHkgY2FsbHMgbWRfYXNzZW1ibGUsCi0JYnV0IGl0IHNob3VsZCBldmVudHVhbGx5IGJlIGNvbnZlcnRlZCB0byBnZW5lcmF0ZSB0aGUgaW5zbiBpdHNlbGYKLQlhbmQgY2FsbCBlbWl0X2luc24gZGlyZWN0bHkuCi0JKGVtaXRfbG9hZF91bmFsLCBlbWl0X3N0b3JlX3VuYWwsIGVtaXRfYnl0ZV9tYW5pcF9yLAotCWVtaXRfZXh0cmFjdF9yLCBlbWl0X2luc2VydF9yLCBlbWl0X21hc2tfciwgZW1pdF9zaWduX2V4dGVuZCwKLQllbWl0X2Jpc19yKTogTGlrZXdpc2UuCi0JKGFscGhhX2lwLCBjYXNlICdJJyk6IEhhbmRsZSB3aXRoIEJGRF9SRUxPQ18yMy4KLQkoYWxwaGFfaXAsIGxhYmVsIGdldF9tYWNybyk6IERvbid0IGVtaXQgdGhlIGZpbmFsIGluc3RydWN0aW9uIGlmCi0JdGhlIG9wY29kZSBpcyB6ZXJvLgotCShhbHBoYV9pcCwgY2FzZSAnQicsIHN1YmNhc2UgJ2QnKTogTmV3IGNhc2UsIGZvciBzdWJ3b3JkIGFuZAotCXVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIG1hY3Jvcy4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ18yNi4gIEdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UgaWYKLQl0aGUgdmFsdWUgY2FuJ3QgYmUgcmVzb2x2ZWQuCi0KLVdlZCBNYXIgMjMgMTY6MDY6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wYXJzZV9vcHRpb24pOiBGb3IgLW1lbWJlZGRlZC1waWMsIGZvcmNlCi0JdGhlIC1HIHZhbHVlIHRvIDB4N2ZmZmZmZmYuICBGb3IgU1ZSNCBQSUMgb3B0aW9ucywgZG9uJ3QgY2FsbAotCWJmZF9zZXRfZ3Bfc2l6ZSBoZXJlLCBpdCdzIGRvbmUgaW4gbWRfYmVnaW4uICBEb24ndCBwZXJtaXQgLUcgd2l0aAotCS1tZW1iZWRkZWQtcGljLgotCShtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2FwcGx5X2ZpeCk6IFNldCBmaXhQLT5meF9kb25lIGFwcHJvcHJpYXRlbHkuCi0JKHNfY2hhbmdlX3NlYyk6IEZvciBFTUJFRERFRF9QSUMsIGNoYW5nZSAuZGF0YSBhbmQgLnJkYXRhIHRvCi0JLnNkYXRhLgotCSogY29uZmlnL3RjLW1pcHMuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZS4KLQkobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogRGVjbGFyZS4KLQkoVENfSEFORExFX0ZYX0RPTkUpOiBEZWZpbmUuCi0KLVR1ZSBNYXIgMjIgMTM6NTg6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChlbnVtIG1pcHNfcGljX2xldmVsKTogTmV3IGVudW0uCi0JKG1pcHNfcGljKTogQ2hhbmdlIGZyb20gaW50IHRvIGVudW0gbWlwc19waWNfbGV2ZWwuICBDaGFuZ2UgYWxsCi0JdXNlcyAoMCBiZWNvbWVzIE5PX1BJQywgMiBiZWNvbWVzIFNWUjRfUElDKS4KLQkobG9hZF9hZGRyZXNzKTogSGFuZGxlIEVNQkVEREVEX1BJQy4KLQkobWFjcm8pOiBIYW5kbGUgRU1CRURERURfUElDIGluIGFsbCBQSUMgY2FzZXMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCAtbWVtYmVkZGVkLXBpYyB0byB1c2UgRU1CRURERURfUElDLiAgSWYKLQlPQkpfRUxGLCBhY2NlcHQgLUtQSUMgYW5kIC1jYWxsX3NoYXJlZCB0byB1c2UgU1ZSNF9QSUMgYW5kIGFjY2VwdAotCS1ub25fc2hhcmVkIHRvIHVzZSBOT19QSUMgKHRoaXMgaXMgaG93IHRoZSBJcml4IDUgYXNzZW1ibGVyCi0Jd29ya3MpLiAgRG8gbm90IHBlcm1pdCAtRyB3aXRoIFNWUjRfUElDLgotCShzX2FiaWNhbGxzKTogV2FybiBpZiAtRyB3YXMgdXNlZCwgYW5kIGZvcmNlIC1HIDAuCi0JKHRjX2dlbl9yZWxvYyk6IFNldCByZWxvYy0+YWRkZW5kIHRvIDAgZm9yIGEgUEMgcmVsYXRpdmUgcmVsb2MgZm9yCi0JYW55dGhpbmcgYnV0IGEub3V0LCBub3QganVzdCBmb3IgRUxGLiAgRm9yIEVDT0ZGLCBkb24ndCBnZW5lcmF0ZSBhCi0JQkZEX1JFTE9DXzE2X1BDUkVMX1MyIHJlbG9jIHVubGVzcyB1c2luZyBFTUJFRERFRF9QSUMuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogRGVmaW5lIHRvIGJlIDEuCi0KLVN1biBNYXIgMjAgMTY6MzE6NTUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGNyZWF0ZV9uZXdfc3BhY2UpOiBVc2UgaW50cywgbm90IGNoYXJzIGFzCi0JcGFyYW1ldGVycyB0byBhdm9pZCBsb3Npbmcgd2hlbiBjb21waWxpbmcgd2l0aCBIUCBDQy4KLQkoY3JlYXRlX25ld19zdWJzcGFjZSwgdXBkYXRlX3N1YnNwYWNlLCBmaXhfbmV3X2hwcGEpOiBMaWtld2lzZS4KLQotU3VuIE1hciAyMCAxNDo0MzoxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLXN0YW1wKTogSWYgYGRlZnMnIGlzIGRlZmluZWQsIGVtaXQgYQotCXByZXByb2Nlc3NvciBkaXJlY3RpdmUgdG8gY3JlYXRlIGEgbWFjcm8gbmFtZWQgYnkgdGhpcyB2YWx1ZSBpbnRvCi0JY29uZmlnLm5ldzsgZG9uJ3QgZXhwbGljaXRseSBnbyBmb3IgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIGBkZWZzJywgbm90IGBCRkRERUYnLiAgU2V0IGl0IHRvCi0JTUFOWV9TRUdNRU5UUyBmb3IgYW55IG9iai1jb2ZmYmZkIHRhcmdldC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChCRkRfSEVBREVSUywgQkZEKTogRGVmaW5lLgotCSogY29uZmlnL2kzODZjb2ZmLm10IChUREVGSU5FUyk6IERvbid0IGRlZmluZSBCRkQsIE1BTllfU0VHTUVOVFMsCi0Jb3IgQkZEX0hFQURFUlMuCi0JKExPQ0FMX0xPQURMSUJFUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvbTY4a2NvZmYubXQgKFRERUZJTkVTKTogRG9uJ3QgZGVmaW5lIHRob3NlIG1hY3Jvcy4KLQkqIGNvbmZpZy9tODhrY29mZi5tdCAoVERFRklORVMpOiBEaXR0by4KLQkqIGNvbmZpZy9lYm1vbjI5ay5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy9oODMwMGhkcy5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy9pYzk2MGNvZmYubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvc3BhcmMubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaDgzMDAubXQgKExPQ0FMX0xPQURMSUJFUywgVERFRklORVMpOiBEZWxldGVkLgotCSogY29uZmlnL2g4NTAwLm10IChMT0NBTF9MT0FETElCRVMsIFRERUZJTkVTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9zaC5tdCAoTE9DQUxfTE9BRExJQkVTLCBUREVGSU5FUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvejhrLm10IChMT0NBTF9MT0FETElCRVMpOiBEZWxldGVkLgotCShUREVGSU5FUyk6IERvbid0IGRlZmluZSB0aGUgY29mZmJmZCBtYWNyb3MuCi0KLQkqIE1ha2VmaWxlLmluOiBJbnNlcnQgbWFrZWZpbGUgZnJhZ21lbnRzIGJlZm9yZSBPQkpTIGRlZmluaXRpb24uCi0JKE9CSlMpOiBBZGQgJChURV9PQkpTKS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBTdXBwbHkgInNlY3Rpb24iCi0JdW5jb25kaXRpb25hbGx5LgotCi0JKiB3cml0ZS5jIChzZXRfc3ltdGFiKTogRGVmaW5lIG9ubHkgaWYgQkZEX0FTU0VNQkxFUi4KLQotU3VuIE1hciAyMCAxMjowNjowNSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKFNUQUdFU1RVRkYpOiBBZGQgZ2FzcC5uZXcuCi0KLUZyaSBNYXIgMTggMjA6MDk6MTYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoc3ltYm9sX3RhYmxlX2Zyb3plbik6IE5ldyB2YXJpYWJsZSwgdG8gYmUgc2V0IGFmdGVyCi0JYmZkX3NldF9zeW10YWIgaXMgY2FsbGVkLgotCShkdW1wX3NlY3Rpb25fcmVsb2NzKTogTm90ZSB3aGV0aGVyIGEgc3ltYm9sIGlzIGEgc2VjdGlvbiBzeW1ib2wKLQlvciBub3QuCi0JKGFkanVzdF9yZWxvY19zeW1zKTogRm9yIG5vdywgYWx3YXlzIHN1cHBseSBhbiBhYnNvbHV0ZSBzeW1ib2wgZm9yCi0JZml4dXBzIHdpdGhvdXQgc3ltYm9scyBidXQgbm90IHlldCBgZG9uZScuICBVc2Ugc2VjdGlvbl9zeW1ib2wgdG8KLQlnZXQgdGhlIHN5bWJvbCwgaW5zdGVhZCBvZiBnb2luZyBkaXJlY3RseSBmb3IgYWJzX3N5bWJvbC4KLQkod3JpdGVfcmVsb2NzKSBbREVCVUc0XTogQWJvcnQgaWYgYW55IHN5bWJvbCByZWZlcnJlZCB0byBieSBhCi0JcmVsb2MgaXMgbm90IGEgc2VjdGlvbiBzeW1ib2wgYW5kIGlzIG5vdCBpbiB0aGUgc3ltYm9sIHRhYmxlLgotCShzZXRfc3ltdGFiKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IGZyb20gd3JpdGVfb2JqZWN0X2ZpbGUuCi0JQ291bnRzIHN5bWJvbCB0YWJsZSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYW4gZWFybGllciBjb3VudC4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIHNldF9zeW10YWIsIGJ1dCBkbyBpdCBhZnRlciBwb3RlbnRpYWxseQotCWludm9raW5nIHRoZSAqX2Zyb2JfZmlsZSBtYWNyb3MuICBEb24ndCBib3RoZXIgY291bnRpbmcgc3ltYm9scy4KLQlDYWxsIHN5bWJvbF9yZW1vdmUsIGluc3RlYWQgb2YgZXhwYW5kaW5nIGl0IGluIHBsYWNlLiAgTW92ZWQgdGhlCi0JY29uZGl0aW9uYWxpemVkIGBvYmplY3RfZmlsZV9zaXplJyBkZWNsYXJhdGlvbiBkb3duIHRvCi0JY29uZGl0aW9uYWxpemVkIGJsb2NrIHdoZXJlIGl0J3MgdXNlZC4gIFdoZW4gdXNpbmcgdGhlIGFic29sdXRlCi0Jc3ltYm9sIGZvciBhIGZpeHVwIHdpdGhvdXQgYSBzeW1ib2wsIHNldCBzeV91c2VkX2luX3JlbG9jLgotCSh3cml0ZV9vYmplY3RfZmlsZSkgW0JGRF9BU1NFTUJMRVJdOiBDYWxsIHNlY3Rpb25fc3ltYm9sIHRvIGdldAotCXRoZSBjb3JyZWN0IHN5bWJvbCBmb3IgdGhlIGFic29sdXRlIHNlY3Rpb24uCi0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBVc2Ugc3ltYm9sX25ldyBpbnN0ZWFkIG9mCi0Jc3ltYm9sX21ha2UsIHNpbmNlIHdlIG1heSB3YW50IGl0IHRvIGdvIGludG8gdGhlIHN5bWJvbCB0YWJsZS4KLQlNYWtlIHRoZSBuZXcgc3ltYm9sIGhhdmUgaW50ZXJuYWwgbGlua2FnZS4gIElmCi0Jb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jIHNheXMgaXQncyBva2F5LCB1c2UgdGhlIEJGRCBzZWN0aW9uCi0Jc3ltYm9sIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgR0FTIHN5bWJvbC4KLQkob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogRGVmYXVsdCB0byBhbHdheXMgcmV0dXJuaW5nIDAuCi0JKiBjb25maWcvb2JqLWFvdXQuaCAob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKSBbQkZEX0FTU0VNQkxFUl06Ci0JTmV3IG1hY3JvLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogTmV3IG1hY3JvLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYzogSW5jbHVkZSBzdWJzZWdzLmguCi0JKGluX3NpZ25lZF9yYW5nZSk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfaXApOiBVc2UgaXQuCi0JKHNwYXJjX2lwLCBjYXNlICdpJyk6IFVzZSBCRkRfUkVMT0NfU1BBUkMxMywgbm90IF9CQVNFMTMuCi0JKHNwYXJjX2lwLCBsYWJlbCAiaW1tZWRpYXRlIik6IFJlamVjdCBjb25zdGFudHMgZm9yIHBjcmVsCi0JaW5zdHJ1Y3Rpb25zIG9ubHkgaWYgdGhlIHJlbG9jYXRpb24gdHlwZSBpbmRpY2F0ZXMgYSAiY2FsbCIKLQlpbnN0cnVjdGlvbiBhbmQgdGhlIG9mZnNldCBpcyB3aXRoaW4gcmFuZ2Ugb2YgYSAiam1wbCAlZzAiLiAgSWYKLQlpdCdzIG5vdCBpbiByYW5nZSwgdXNlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbCBwbHVzIGFuIG9mZnNldC4KLQkobWRfYXBwbHlfZml4KTogVXNlIGluX3NpZ25lZF9yYW5nZS4gIENvbWJpbmVkIF9TUEFSQzEzIGFuZAotCV9CQVNFMTMgY2FzZXMuCi0JKHRjX2dlbl9yZWxvYyk6IFBlcm1pdCBCRkRfUkVMT0NfU1BBUkMxMy4KLQotCSogY29uZmlnL2ljOTYwY29mZi5tdCAoVERFRklORVMpOiBGaXhlZCB0eXBvIChNQU5ZX1NFQ1RJT05TLCBub3QKLQlNQU5ZX1NFR01FTlRTKS4KLQotCSogY29uZmlndXJlLmluOiBFbGltaW5hdGVkIGFsbCB0YXJnZXRzIHVzaW5nIG9iai1jb2ZmIGJ1dCBub3QKLQlkZWZpbmluZyBCRkRfQVNTRU1CTEVSOyBJIHRoaW5rIGFsbCBzdWNoIHRhcmdldHMgdGhhdCBhcmUKLQlzdXBwb3J0ZWQgd2lsbCBiZSBtYXRjaGVkIGJ5IHJlYWwgQ1BVLU9TIGNvbWJpbmF0aW9ucyBlYXJsaWVyIGluCi0JdGhlIGNhc2Ugc3RhdGVtZW50LgotCSh0YXJnZXRzICotKi1jb2ZmKiwgKi1zeXN2KiwgKi0qLXNjbyosICotKi1zeXN2MzIpOiBEZWxldGVkLiAgTWFkZQotCXNvbWUgY29tbWVudHMgYWJvdXQgdGhlIGRweDIgY29uZmlndXJhdGlvbiwgYnV0IGxlZnQgaXQgZGlzYWJsZWQsCi0Jc2luY2UgaXQgY291bGRuJ3QgYmUgcmVhY2hlZCBiZWZvcmUuCi0JKHRhcmdldCBhMjlrLWFtZC1lYm1vbm9sZCk6IERlbGV0ZWQuCi0KLVRodSBNYXIgMTcgMTM6MzY6MDkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2ltcG9ydCk6IENvcnJlY3RseSBoYW5kbGUgaW1wb3J0aW5nIG9mIGFuCi0JYWxyZWFkeSBkZWZpbmVkIHN5bWJvbC4KLQotV2VkIE1hciAxNiAxNzoxMTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBPbmx5IGFjY2VwdCBvdmVybHkgbGFyZ2UgdmFsdWVzIGZvcgotCXRoZSAnaicgb3BlcmFuZCBpZiB0aGVyZSBhcmUgbm8gZnVydGhlciBhbHRlcm5hdGl2ZXMgZm9yIHRoaXMKLQlpbnN0cnVjdGlvbi4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGFkanVzdF9zdGFiX3NlY3Rpb24pOiBJbml0aWFsaXplCi0Jc3RhYnN0cnNlZyB0byBTRUdfVU5LTk9XTiwgbm90IC0xLiAgQWZ0ZXIgbG9vcCwgY2hlY2sgd2hldGhlciBpdAotCWlzIG5vdCBTRUdfVU5LTk9XTiByYXRoZXIgdGhhbiBjaGVja2luZyB3aGV0aGVyIGl0IGlzID49IDAuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfYWxpZ24pOiBUYWtlIG5ldyBhcmd1bWVudCwgbGFiZWwsIGFuZCB1c2UKLQlpdCBpbnN0ZWFkIG9mIGdsb2JhbCBpbnNuX2xhYmVsLgotCShzX2FsaWduLCBzX2NvbnMsIHNfZmxvYXRfY29ucywgc19ncHdvcmQpOiBTYXZlIGluc25fbGFiZWwgYmVmb3JlCi0JY2FsbCB0byBtaXBzX2VtaXRfZGVsYXkgYW5kIHBhc3MgaXQgdG8gbWlwc19hbGlnbi4KLQotV2VkIE1hciAxNiAxMTo1NDoxMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZXF1KTogSGFuZGxlIGJvdGggLnJlZyBhbmQgLmVxdSBjb3JyZWN0bHkuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NhbGxpbmZvKTogQWNjZXB0ICJtaWxsaWNvZGUiIGFzIGFuCi0JYXJndW1lbnQgdG8gYSAuY2FsbGluZm8gZGlyZWN0aXZlLiAgRG9uJ3QgbG9vcCBmb3JldmVyIG9uIGVycm9ycy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZXF1KTogVXNlIHBhX3BhcnNlX251bWJlciBzbyB0aGF0IHdlIGNhbgotCXVzZSBwcmUtZGVmaW5lZCByZWdpc3RlcnMgYXMgYXJndW1lbnRzLgotCi1Nb24gTWFyIDE0IDE0OjI5OjQ1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2hlY2sgYm90aCBTX0lTX0xPQ0FMIGFuZAotCVNfSVNfRVhURVJOQUwgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGRpc2NhcmQgYSBzeW1ib2wuCi0KLQkqIGNvbmZpZy1nYXMuY29tOiBTY2FuIE1ha2VmaWxlLmluLCBub3QgdmVyc2lvbi5jLCBmb3IgY3VycmVudAotCXZlcnNpb24gbnVtYmVyLiAgRGVsZXRlIGFsbCB2ZXJzaW9ucyBvZiB0ZW1wIGZpbGVzIHdoZW4gZmluaXNoZWQKLQl3aXRoIHRoZW0uICBDcmVhdGUgY29uZmlnLmguCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19Jbml0aWFsaXplZF9EYXRhX1NpemUpOiBDYWNoZSBzeW1ib2wKLQl2YWx1ZXMgdG8gcmVkdWNlIG51bWJlciBvZiBsb29rdXBzIHdpdGggU19HRVRfVkFMVUUuICBTa2lwIGRlYnVnCi0Jc3ltYm9scyB0byBhdm9pZCAiYSByZWFsbHkgbmFzdHkgYnVnIi4gIChGcm9tIEhvbGdlciBUZXV0c2NoLAotCWhvbGdlckBib3Ric28ucmhlaW4tbWFpbi5kZS4pCi0JKFZNU193cml0ZV9vYmplY3RfZmlsZSk6IEZvciAiX192dC4qIiBzeW1ib2xzLCBzZXQgU19HRVRfT1RIRVIKLQlmaWVsZC4gIChBbHNvIGZyb20gSG9sZ2VyIFRldXRzY2guKSAgV2F0Y2ggZm9yIGEgd291bGQtYmUgcmVnaXN0ZXIKLQltYXNrIHRoYXQgc3BhbnMgZnJhZ3MuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9saW5lKTogU2V0IHN5bWJvbCBsbm5vIGZpZWxkIHdpdGgKLQl0aGlzX2Jhc2UsIG5vdCBsaW5lX2Jhc2UuICAoUGF0Y2ggZnJvbSBBbmRyZWFzIEFyZW5zLAotCWFyaUBvYmVsaXguYXYucnd0aC1hYWNoZW4uZGUuKQotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFJldGFpbiBzeW1ib2xzIHRoYXQKLQlsb29rIGxvY2FsIGlmIHRoZXkncmUgZXhwb3J0ZWQgb3IgdW5kZWZpbmVkLiAgVXNlZCB0byBiZSBkb25lIGZvcgotCWk5NjAgb25seS4KLQotCSogcmVhZC5jIChzX2xjb21tLCBzX2NvbW0pOiBQcmludCBzeW1ib2wgbmFtZSBiZWluZyByZWRlZmluZWQuCi0JR2V0IGl0IGZyb20gdGhlIGxvb2tlZC11cCBzeW1ib2wsIGluc3RlYWQgb2YgdXNpbmcgdGhlIHN0cmluZyBmcm9tCi0JdGhlIGlucHV0IHN0cmVhbSwgd2hpY2ggaXMgbm8gbG9uZ2VyIG51bGwtdGVybWluYXRlZC4KLQkoTEVYX1BDVCk6IE5ldyBtYWNybywgZGVmYXVsdHMgdG8gMC4KLQkobGV4X3R5cGUpOiBVc2UgaXQgZm9yIGAlJy4KLQotCSogY29uZmlnL3RjLXZheC5jIChtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgYC1oIycgb3B0aW9uIGZvciBWTVMuCi0JKHZpcF9vcCk6IE5vdyBzdGF0aWMsIGFuZCByZXR1cm5zIHZvaWQuICBDYWxsZXJzIGNoYW5nZWQuICBBZGRlZAotCWZvcndhcmQgZGVjbC4KLQkodmlwKTogRGl0dG8uICBDYWxsIGFzX2ZhdGFsIGRpcmVjdGx5IGlmIGEgcHJvZ3JhbSBidWcgaXMKLQlkZXRlY3RlZC4KLQkob3BfaGFzaCk6IExldCBkZWZhdWx0IGluaXRpYWxpemF0aW9uIHN1ZmZpY2UuCi0KLQkqIE1ha2VmaWxlLmluIChsaXRlcmFsLm8pOiBQcm92aWRlIGRlcGVuZGVuY2llcy4KLQotCSogY29uZmlndXJlLmluOiBTZXQgbmV3IG1ha2VmaWxlIHZhcmlhYmxlIE9QQ09ERVNfTElCLgotCSogTWFrZWZpbGUuaW4gKExJQlMpOiBVc2UgaXQuCi0KLQkqIE1ha2VmaWxlLmluIChtYWtlLWdhcy5jb20sIHN0YW1wLW1rLmNvbSk6IE5ldyB0YXJnZXRzLgotCSogdm1zY29uZi5zaDogTmV3IGZpbGUuCi0JKiBtYWtlLWdhcy5jb206IFJlZ2VuZXJhdGVkIGZyb20gbmV3IHNjcmlwdC4KLQotCSogY29uZmlndXJlLmluIChzcGFyYyotKi1seW54b3MqKTogSGFuZGxlIGFueSB2ZXJzaW9uIG51bWJlcgotCXN1ZmZpeCBhZnRlciAibHlueG9zIi4gIFNldCBlbXVsYXRpb24gdG8gbHlueC4KLQotTW9uIE1hciAxNCAxMTozMDo0OSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBEZWxldGUgZGVjbGFyYXRpb24uCi0KLUZyaSBNYXIgMTEgMjI6MjU6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BjcmVsX2Zyb20pOiBSZXR1cm4gMCBmb3IgdW5kZWZpbmVkIEVMRgotCXN5bWJvbHMuCi0JKHBwY19pc190b2Nfc3ltKTogQ2hhbmdlIC50b2MgdG8gLmdvdC4KLQkobWRfYXBwbHlfZml4KTogQ2hhbmdlIGhhbmRsaW5nIG9mIEVMRiByZWxvY3MuCi0JKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCi1GcmkgTWFyIDExIDE3OjQyOjIwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKENsb3NlX1ZNU19PYmplY3RfRmlsZSk6IEFkZCBjb21tZW50IHBvaW50aW5nCi0Jb3V0IHNvbWUgY29kZSB0aGF0IGRvZXNuJ3QgYmVsb25nIGluIHRoaXMgZmlsZS4KLQotCSogY29uZmlnL29iai12bXMuaDogSW5jbHVkZSBhb3V0L3N0YWJfZ251LmguCi0JKE5fR1NZTSwgLi4uLCBOX0xFTkcpOiBEZWxldGVkLgotCShOT19SRUxPQyk6IFVuZGVmaW5lIGJlZm9yZSBkZWZpbmluZyBhcyBwYXJ0IG9mIGVudW0gcmVsb2NfdHlwZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmM6IEFkZCBjb21tZW50IHF1ZXN0aW9uaW5nIG5lZWQgZm9yIGFsbCB0aGUKLQljaGFyYWN0ZXJzIGluIEZMVF9DSEFSUy4KLQotCSogYXMuYyAobWFpbikgW09CSl9WTVNdOiBEb24ndCBjYWxsIG91dHB1dF9maWxlX2Nsb3NlLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSk6IFNldCBzdHJpY3Qgb3JkZXIgZm9yCi0Jc2VjdGlvbnMgd2l0aCByZWNvZ25pemVkIG5hbWVzLCBiZWZvcmUgY29tcHV0aW5nIFZNQSB2YWx1ZXMuCi0KLUZyaSBNYXIgMTEgMTc6NTY6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogQWNjZXB0IG51bWJlcnMgYmV0d2VlbiAweDgwMDAgYW5kCi0JMHhmZmZmIGZvciAnaicgdG8gYmUgY29tcGF0aWJsZSB3aXRoIE1JUFMgYXNzZW1ibGVyLiAgVGhlc2UKLQludW1iZXJzIGFyZSBhY3R1YWxseSB0cmVhdGVkIGFzIG5lZ2F0aXZlLgotCi1UaHUgTWFyIDEwIDEzOjM2OjI5IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChMT0NBTF9MQUJFTCk6IExvY2FsIGxhYmVscyBhcmUgLkxmb28uCi0KLVR1ZSBNYXIgIDggMjE6MTc6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmM6IE1pbm9yIGZvcm1hdHRpbmcvc3R5bGlzdGljIGNoYW5nZXMsIHBsdXM6Ci0JKG9ial9jb2ZmX3NlY3Rpb24pOiBEZWNsYXJlLgotCShvYmpfcHNldWRvX3RhYmxlKTogTWFrZSBpdCBhdmFpbGFibGUgb25seSBpZiBNQU5ZX1NFQ1RJT05TLgotCShvYmpfc3ltYm9sX3RvX2NoYXJzKSBbQ1JPU1NfQ09NUElMRV06IFNvbWUgYXR0ZW1wcyB0byBtYWtlIHRoaXMKLQl3b3JrLiAgSXQgc3RpbGwgZG9lc24ndC4gIEl0IG5vdyBmYWlscyB0byBjb21waWxlLCBpbnN0ZWFkIG9mCi0Jc2lsZW50bHkgY29tcGlsaW5nIHRvIGRvIG5vdGhpbmcuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERlZmluZSBvbmx5IGlmCi0JTUFOWV9TRUNUSU9OUy4KLQkoT0JKX1BST0NFU1NfU1RBQikgWyEgTUFOWV9TRUNUSU9OU106IE5ldyBtYWNybywganVzdCBlbWl0cwotCXdhcm5pbmcuCi0KLQlIYW5kbGUgQWxwaGEgbG9hZC1pbW1lZGlhdGUtRlAgcHNldWRvLWluc3RydWN0aW9uczoKLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaCAobGRpZiwgbGRpZywgbGRpcywgbGRpdCk6IE5ldyBwYXR0ZXJucy4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsaXQ4X3NlYywgbGl0NF9zZWMsIGxpdDhfc3ltLCBsaXQ0X3N5bSk6IE5ldwotCXZhcmlhYmxlcy4KLQkoY3JlYXRlX2xpdGVyYWxfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoY3JlYXRlX2xpdGFfc2VjdGlvbik6IE5vdyBhIG1hY3JvLgotCShnZXRfbGl0OF9vZmZzZXQsIGdldF9saXQ0X29mZnNldCk6IE5ldyBmdW5jdGlvbnMuCi0JKG1heWJlX3NldF9ncCk6IE5ldyBmdW5jdGlvbi4KLQkoc2VsZWN0X2dwX3ZhbHVlKTogQ2FsbCBpdC4KLQkobG9hZF9leHByZXNzaW9uKTogUHJlc2VydmUgYWRkZW5kIGlmIHN5bWJvbCBpcyBhIHNlY3Rpb24gc3ltYm9sLgotCShhbHBoYV9pcCk6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlIGBGJyBmb3IgZmxvYXRpbmctcG9pbnQKLQljb25zdGFudHM7IHN0b3JlIHRoZW0gaW4gLmxpdHs0LDh9IHNlY3Rpb25zLgotCShhbHBoYV9pcCwgY2FzZSAnRycpOiBFbWl0IExJVFVTRSByZWxvY2F0aW9ucyBmb3Igc3ltYm9sIGV4cHJzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzbWFsbGVzdF9pbW1fdHlwZSk6IE5ldmVyIHJldHVybiBJbW0xLgotCi1UdWUgTWFyICA4IDE0OjE4OjE1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jICh3X3N0cmluZ3MpOiBPbmx5IGNvcHkgc3RyaW5ncyBvdXQgaWYKLQl0aGVpciBzeW1ib2xzIGFyZSBnb2luZyB0byBiZSB3cml0dGVuLgotCi1UdWUgTWFyICA4IDExOjQ5OjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYyAoYXNfcGVycm9yKTogRGVjbGFyZSBhcmd1bWVudHMgY29uc3QuCi0JKiBhcy5oIChhc19wZXJyb3IpOiBDaGFuZ2UgZGVjbGFyYXRpb24uCi0KLU1vbiBNYXIgIDcgMTY6MDg6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX2FkZHJlc3MpOiBXaGVuIGNhbGxpbmcgZnJhZ19ncm93LCBhbGxvdwotCWZvciB0aGUgKHVwIHRvKSB0d28gbm9wcyB3aGljaCBtYXkgYmUgaW5zZXJ0ZWQgYnkgYXBwZW5kX2luc24gaWYKLQltaXBzX29wdGltaXplIGlzIDAuCi0JKG1hY3JvKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgIDMgMTE6Mzc6NTUgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKToKLQlBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nIGZyb20gZ2NjLgotCi1XZWQgTWFyICAyIDEwOjMxOjAxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBBZGQgYSBmZXcgY2FzdHMgdG8gbWFrZSBIUCBDIGNvbXBpbGVyIGhhcHB5LgotCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX3ZlcnNpb24sIG9ial9zb21fY29weXJpZ2h0KTogQmUKLQlwcmVwYXJlZAotCXRvIGhhbmRsZSBhbiBlcnJvciBmcm9tIGJmZF9zb21fYXR0YWNoX2F1eF9oZHIuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IFdyYXAgRUxGIHNwZWNpZmljIGRlY2xzIGluc2lkZSBhbiBpZmRlZi4KLQotTW9uIEZlYiAyOCAxNTowMzoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYXRvZik6IE9taXQgd2FybmluZyBhYm91dCBGUCB2YWx1ZXMuCi0JKGxpbmVfY29tbWVudF9jaGFycyk6IEFkZCAhIHRvIGxpc3QuCi0JKG1kX2FwcGx5X2ZpeCk6IERvIHByb2Nlc3MgMzItIGFuZCA2NC1iaXQgcmVsb2NhdGlvbnMuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9sY29tbSk6IFB1dCAiI2lmIDAiIGFyb3VuZCB0aGUKLQl1bnVzZWQgcGFydHMgKG1vc3Qgb2YgdGhlIGZ1bmN0aW9uKS4KLQkob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBDYXN0IGFsbG9jYSByZXN1bHQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTk2MC0qLWNvZmYsIGk5NjAtKi12eHdvcmtzNS4qKTogVXNlIGNvZmZiZmQsIGFuZAotCWdhc190YXJnZXQgaWM5NjBjb2ZmLgotCSogY29uZmlnL2ljOTYwY29mZi5tdDogTmV3IGZpbGUuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCBbVENfSTk2MF06IEluY2x1ZGUgY29mZi9pOTYwLmguCi0JKFRBUkdFVF9GT1JNQVQpIFtUQ19JOTYwXTogVXNlIGNvZmYtSW50ZWwtbGl0dGxlLgotCSogY29uZmlnL3RlLWljOTYwLmggKENST1NTX0NPTVBJTEUpOiBEb24ndCB1bmRlZiB0aGlzLiAgV2UnbGwKLQlhbHdheXMgYnVpbGQgbGl0dGxlLWVuZGlhbiBvYmplY3QgZmlsZXMuCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZF9yZWxvY19zaXplKTogRG9uJ3QgZGVmaW5lIGF0IGFsbCBpZiBCRkQgb3IKLQlCRkRfQVNTRU1CTEVSIGlzIGRlZmluZWQuCi0JKG1lbV9mbXQpOiBTaW5jZSBDT0ZGIGRvZXNuJ3QgaGFuZGxlIGNhbGx4IHJlbG9jYXRpb25zIHlldCwgdHJlYXQKLQl0aGVtIGxpa2Ugbm9ybWFsIDMyLWJpdCByZWxvY2F0aW9ucy4KLQkobWRfYXBwbHlfZml4KTogRm9yIGNhbGx4IHJlbG9jYXRpb25zLCBzdG9yZSB6ZXJvLgotCSh0Y19ib3V0X2ZpeF90b19jaGFycyk6IFN0b3JlIHN5bWJvbCBpbmRleCBmb3IgYWxsIGNhbGx4Ci0JcmVsb2NhdGlvbnMsIHJlZ2FyZGxlc3Mgb2YgbGluay1yZWxheCBzZXR0aW5nLgotCSh0Y19jb2ZmX2ZpeDJydHlwZSwgdGNfY29mZl9zaXplbWFjaGRlcCk6IE5ldyBmdW5jdGlvbnMuCi0JKGk5NjBfaGFuZGxlX2FsaWduKSBbISBPQkpfQk9VVF06IElmIGxpbmstcmVsYXggb3B0aW9uIGlzCi0Jc2VsZWN0ZWQsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGNsZWFyIGl0LgotCSogY29uZmlnL3RjLWk5NjAuaCAoQkZEX0FSQ0gsIENPRkZfRkxBR1MsIENPRkZfTUFHSUMsCi0JVENfQ09VTlRfUkVMT0MsIFRDX0NPRkZfRklYMlJUWVBFLCBUQ19DT0ZGX1NJWkVNQUNIREVQLAotCXRjX2ZpeF9hZGp1c3RhYmxlKTogTmV3IG1hY3Jvcy4KLQkodGNfY29mZl9maXgycnR5cGUsIHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBEZWNsYXJlLgotCi1GcmkgRmViIDI1IDIwOjU2OjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX3N5bWJvbCk6IENhbGwgUEEgRUxGIEJGRCB2ZXJzaW9uLgotCShocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkocGFfYnVpbGRfc3ltZXh0bl9zZWN0aW9uKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KLQkoaHBwYV90Y19tYWtlX3N5bWV4dG5fc2VjdGlvbik6IExpa2V3aXNlLgotCShwYV9leHBvcnQpOiBEZWxldGUgY2FsbCB0byBwYV9idWlsZF9zeW1leHRuX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGhwcGFfdGNfc3ltYm9sKTogQWRkIGV4dGVybiBkZWNsLgotCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogRGVsZXRlIGV4dGVybiBkZWNsLgotCShocHBhX3RjX3N5bWJvbCk6IERlbGV0ZSBleHRlcm4gZGVjbC4KLQotRnJpIEZlYiAyNSAxMzoxNTozMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBDb3JyZWN0IHRlc3QgZm9yIHdoZXRoZXIgdG8KLQlmaWxsIGEgc2VjdGlvbiAoZnJvbSBNaW5oIFRyYW4tTGUgPFRSQU5MRUBpbnRlbGxpY29ycC5jb20+KS4KLQotVGh1IEZlYiAyNCAxMTozMDoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHJlcXVpcmUgdmVyc2lvbiBudW1iZXIgZm9yIGkzODYtKi1tYWNoLgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGRlZCAiLnRoaXNfR0NDX3JlcXVpcmVzX3RoZV9HTlVfYXNzZW1ibGVyIiwKLQl3aGljaCBpcyBpZ25vcmVkIGJ5IGdhcywgYnV0IHdpbGwgY2F1c2Ugb3RoZXIgYXNzZW1ibGVycyB0byBjaG9rZS4KLQlJbnRlbmRlZCBmb3IgdXNlIGJ5IGdjYyBwb3J0cyB0aGF0IHJlcXVpcmUgZ2FzIGluc3RlYWQgb2YgbmF0aXZlCi0JYXNzZW1ibGVycy4KLQotVGh1IEZlYiAyNCAwNzoxMDozMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL2hvLWhwcGFvc2YuaDogRml4IGJyYWlubyBpbiB0ZXN0IGZvciBBTlNJLUMuCi0KLVdlZCBGZWIgMjMgMTY6NTE6NDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogR2l2ZSB0aGUgdXNlciBhIHJlYXNvbmFibGUgZXJyb3IKLQltZXNzYWdlIHJhdGhlciB0aGFuICJhc3NlcnRpb24gZmFpbGVkIiBpZiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMKLQlmYWlscy4KLQotVHVlIEZlYiAyMiAxMDowNzozMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oby1tYWNoMy5oOiBOZXcgZmlsZS4KLQotTW9uIEZlYiAyMSAxMTo0MToxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2RlYnVnKTogRG9uJ3Qgc2V0IGhkci0+bWFnaWMgaGVyZS4gIEl0IGlzCi0Jbm93IHNldCBpbiBiZmQvZWNvZmZsaW5rLmM6ZWNvZmZfd3JpdGVfc3ltaGRyLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiB1c2UgYmZkX2dldF9lcnJvciAoKSwKLQlub3QgYmZkX2Vycm9yLgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IExpa2V3aXNlLgotCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBVc2UgYW4gYWxpZ25tZW50IHBvd2VyIG9mIDMgZm9yIDggYnl0ZSAubGNvbW0KLQl2YXJpYWJsZXMuCi0KLQkqIGNvbmZpZy9oby1ocHV4LmggKEJST0tFTl9BU1NFUlQpOiBEZWZpbmUgaWYgbm90IF9fR05VQ19fLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFVzZSBjb3JyZWN0IGFyZ3VtZW50cyB0byBtZW1jcHkKLQkoYnJva2VuIDE5IEp1bCAxOTkzKS4gIEZyb20ga2pkQHBlc2NhZGVyby5zdGFuZm9yZC5lZHUgKEtlbm5ldGgKLQlEdWRhKS4KLQotU3VuIEZlYiAyMCAxODowMTo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmggKG9ial9jb2ZmX3NlY3Rpb24pOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBGb3IgInNlY3Rpb24iLCB1c2UKLQlvYmpfY29mZl9zZWN0aW9uLgotCShvYmpfY29mZl9zZWN0aW9uKTogUmV3cml0ZS4KLQotRnJpIEZlYiAxOCAxNDoxNjozMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1tYWNoMyopOiBOZXcgdGFyZ2V0OyB1c2VzIEJGRC4KLQkqIGNvbmZpZy90ZS1tYWNoLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotYW91dC5oIChvYmpfYW91dF9mcm9iX2ZpbGUpOiBEZWNsYXJlIGl0LgotCShmcm9iX2ZpbGUpOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXhfMSkgW1RFX01hY2hdOiBEb24ndCBhZGp1c3QKLQlwY3JlbDMyIHJlbG9jYXRpb25zLgotCSogY29uZmlnL3RjLWkzODYuaCAoVEFSR0VUX0ZPUk1BVCkgW1RFX01hY2hdOiBVc2UgYS5vdXQtbWFjaDMuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogUmVtb3ZlZCByZWdpc3RlciBkZWNsYXJhdGlvbnMuCi0KLVRodSBGZWIgMTcgMTY6MjU6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JU29tZSBzdXBwb3J0IGZvciBQb3dlclBDIEVMRi4KLQkqIGNvbmZpZ3VyZS5pbjogSWYgY3B1IGlzIHBvd2VycGMqLCB1c2UgcHBjLgotCShwcGMtKi1zeXN2NCopOiBVc2Ugb2JqZWN0IGZvcm1hdCBlbGYuCi0JKiBjb25maWcvdGMtcHBjLmg6IE9ubHkgZGVjbGFyZSBhIG51bWJlciBvZiB0aGluZ3MgaWYgT0JKX0NPRkYgaXMKLQlkZWZpbmVkLgotCShUQVJHRVRfQVJDSCk6IE1ha2UgaXQgY2FsbCBwcGNfYXJjaC4KLQkocHBjX2FyY2gpOiBEZWNsYXJlLgotCShUQVJHRVRfRk9STUFUKTogU2V0IGJhc2VkIG9uIE9CSl9DT0ZGIG9yIE9CSl9FTEYuCi0JKE5PX1NUUklOR19FU0NBUEVTKTogRGVmaW5lLgotCShMT0NBTF9MQUJFTCwgRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lIGZvciBPQkpfRUxGLgotCSogY29uZmlnL3RjLXBwYy5jOiBPbmx5IGRlZmluZSBhIG51bWJlciBvZiBmdW5jdGlvbnMgb2YgT0JKX0NPRkYKLQlpcyBkZWZpbmVkLgotCShtZF9wc2V1ZG9fdGFibGUpOiBNb3N0IHBzZXVkby1vcHMgYXJlIE9CSl9DT0ZGIHNwZWNpZmljLiAgQWRkZWQKLQlPQkpfQ09GRiBzcGVjaWZpYyAiYmkiIGFuZCAiZWkiLgotCShtZF9wYXJzZV9vcHRpb24pOiBGaXggaGFuZGxpbmcgb2YgLXUuICBNYWtlIC1tNjAxIHNldAotCVBQQ19PUENPREVfNjAxLiAgSWYgT0JKX0VMRiwgYWNjZXB0IC1WIGFuZCAtUS4KLQkocHBjX3NldF9jcHUpOiBOZXcgZnVuY3Rpb24uCi0JKHBwY19hcmNoKTogTmV3IGZ1bmN0aW9uLgotCShtZF9iZWdpbik6IENhbGwgcHBjX3NldF9jcHUuCi0JKHBwY19pbnNlcnRfb3BlcmFuZCk6IEZvciBhIHNpZ25lZCBvcGVyYW5kIGFjY2VwdCBhbiB1bnNpZ25lZAotCXZhbHVlLCBmb3IgSUJNIGNvbXBhdGliaWxpdHkuCi0JKHBwY19ieXRlKTogRG9uJ3QgY2FsbCBzdHJpbmdlciBmb3Igc3RyaW5nczsgaW5zdGVhZCwgdHJlYXQgdHdvCi0JZG91YmxlIHF1b3RlcyBhcyBhIHNpbmdsZSBkb3VibGUgcXVvdGUuCi0JKHBwY19jb21tKTogU2V0IHN5X3RjLm91dHB1dCBmb3IgYSAubGNvbW0gc3ltYm9sLgotCShwcGNfYmllaSk6IE5ldyBmdW5jdGlvbi4KLQkocHBjX3RjKTogSWYgbm90IE9CSl9DT0ZGLCBpZ25vcmUgZmlyc3QgYXJndW1lbnQuCi0JKHBwY19maXhfYWRqdXN0YWJsZSk6IENhbGwgYXNfYmFkX3doZXJlLCBub3QgYXNfYmFkLgotCShwcGNfaXNfdG9jX3N5bSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXBwbHlfZml4KTogVXNlIHBwY19pc190b2Nfc3ltLiAgSGFuZGxlIEJGRF9SRUxPQ18xNiBhbmQKLQlCRkRfUkVMT0NfOC4KLQotVGh1IEZlYiAxNyAwOToyOTozNyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3BlcnJvcikgW0JGRF9BU1NFTUJMRVJdOiBVc2UgYmZkX2dldF9lcnJvciBhbmQKLQliZmRfc2V0X2Vycm9yIGFuZCBuZXcgZXJyb3IgbmFtZXMuCi0KLVR1ZSBGZWIgMTUgMjA6MjM6MjAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBTdXBwb3J0IGk5NjAtdnh3b3JrcyB2ZXJzaW9ucyA+IDUuMCBhcyBjb2ZmLgotCURlZmF1bHQgaXMgc3RpbGwgYm91dCBpZiBubyB2ZXJzaW9uIGlzIHNwZWNpZmllZC4KLQotCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IFVzZSBzd2l0Y2ggYW5kIHN0cmNhc2VjbXAgaW5zdGVhZAotCW9mIGxhcmdlIG51bWJlciBvZiBjb21wYXJlcyB3aGVuIGxvb2tpbmcgZm9yIGluZi9uYW4gdmFsdWVzLgotCi1GcmkgRmViIDExIDEzOjEzOjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBEbyB1bmFsaWduZWQgbG9hZHMgYW5kIHN0b3JlcwotCWNvcnJlY3RseSB3aGVuIGJpZyBlbmRpYW4sIGFuZCBnaXZlIGVycm9ycyBvbiBvdmVyZmxvdyByYXRoZXIgdGhhbgotCWdlbmVyYXRpbmcgaW5jb3JyZWN0IGNvZGUuCi0KLVRodSBGZWIgMTAgMTE6MjQ6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcy5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCi0JKiByZWFkLmMgKGRvX2FsaWduKTogRG9uJ3QgZGVmaW5lIGxhYmVsIGp1c3RfcmVjb3JkX2FsaWdubWVudAotCXVubGVzcyBpdCBtaWdodCBiZSB1c2VkLgotCi0JKiBhcy5jIChtYWluKTogSWYgbWRfcGFyc2VfbG9uZ19vcHRpb24gaXMgZGVmaW5lZCwgY2FsbCBpdCB3aXRoIGEKLQlsb25nIG9wdGlvbi4KLQkqIGNvbmZpZy90Yy1taXBzLmggKG1kX3BhcnNlX2xvbmdfb3B0aW9uKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc190cmFwKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBSZXBvcnQgYW4gZXJyb3IgaWYgbWlwc190cmFwIGlzIHNldCBhdCBJU0EgbGV2ZWwgMS4KLQkobWFjcm8pOiBJZiBtaXBzX3RyYXAsIHVzZSB0cmFwIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mIGJyZWFrCi0JaW5zdHJ1Y3Rpb25zIGZvciBvdmVyZmxvdyBhbmQgZGl2aWRlIGJ5IHplcm8gZGV0ZWN0aW9uLgotCShtaXBzX3BhcnNlX2xvbmdfb3B0aW9uKTogTmV3IGZ1bmN0aW9uLiAgU3VwcG9ydCAtLXRyYXAsCi0JLS1uby1icmVhaywgLS1icmVhayBhbmQgLS1uby10cmFwLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IG5ldyBvcHRpb25zLgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgInplcm8iLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKTogUmVtb3ZlICJ6ZXJvIi4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG1kX3BzZXVkb190YWJsZSk6IExpa2V3aXNlLgotCi1UaHUgRmViIDEwIDAxOjI0OjI3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFJlamVjdCBpbnRlZ2VyIHZhbHVlcyBmb3IKLQlwYy1yZWxhdGl2ZSBvcGVyYW5kIGZpZWxkcy4gIFRoaXMgZm9yY2VzICJjYWxsIDAiIHRvIGJlY29tZSAiam1wbAotCSVnMCwlbzciIHdpdGggbm8gcmVsb2NhdGlvbnMgbmVlZGVkLgotCi1XZWQgRmViICA5IDEzOjA4OjMyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXMuaCAoeG1hbGxvYywgeHJlYWxsb2MpOiBEZWNsYXJlIHVzaW5nIFBUUiByYXRoZXIgdGhhbiBjaGFyICouCi0JKiB4bWFsbG9jLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogVXNlIFBUUiByYXRoZXIgdGhhbiBjaGFyICouCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBJZiBOT19TVFJJTkdfRVNDQVBFUyBpcyBkZWZpbmVkLAotCWRvbid0IHRyZWF0IGJhY2tzbGFzaCBzcGVjaWFsbHkgaW5zaWRlIHN0cmluZ3MuCi0JKiByZWFkLmMgKG5leHRfY2hhcl9vZl9zdHJpbmcpOiBMaWtld2lzZS4KLQotV2VkIEZlYiAgOSAwOTo0Mjo0NSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IFVzZSBtZW1zZXQKLQlpbnN0ZWFkIG9mIG1lbWNweSB0byB6ZXJvIHRoZSBpbml0aWFsIHN0YWIgc3ltYm9sLCBkdWguCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uKTogRGl0dG8uCi0KLVR1ZSBGZWIgIDggMTc6MjU6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogVXNlIGFzX2JhZF93aGVyZSwgbm90IGFzX2JhZC4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBDYWxsIG1lbXNldCB3aXRoIHRoZSBhcmd1bWVudHMgaW4KLQl0aGUgcmlnaHQgb3JkZXIuICBFeHBsaWNpdGx5IGNsZWFyIGZpeF9yb290IGFuZCBmaXhfdGFpbCBmaWVsZHMuCi0KLVR1ZSBGZWIgIDggMTY6MDA6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBGb3IgYWJzX3N5bWJvbCwgc2V0ICpwdW50Ci0JYW5kIGRvIG5vdGhpbmcgZWxzZS4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfYmVnaW4pOiBJbml0aWFsaXplIHZhbHVlIG9mIGFic19zeW1ib2wKLQlwcm9wZXJseS4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBVc2UgYWJzX3N5bWJvbCBpbnN0ZWFkIG9mIGNhbGxpbmcKLQlzZWN0aW9uX3N5bWJvbC4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfZGVidWcpOiBGaXggIi8qIiBpbiBjb21tZW50IHRvIHNpbGVuY2UKLQljb21wbGFpbnQgZnJvbSAiZ2NjIC1XYWxsIi4KLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLW5ldHdhcmUqKTogTmV3IHRhcmdldCwgbGlrZSBhbHBoYS0qLW9zZiouCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChHUF9BREpVU1RNRU5UKTogTW92ZSBkZWZpbml0aW9uIHRvIHN0YXJ0IG9mCi0JZmlsZS4KLQkodGNfZ2VuX3JlbG9jKTogUmVtb3ZlIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgYGNvZGUnLCBhbmQgY29kZQotCXRoYXQgdHJpZWQgdG8gdXNlIGl0IChpbmNvcnJlY3RseSkuICBGb3IgTElURVJBTCByZWxvYywgc2V0IGFkZGVuZAotCXRvIG5lZ2F0aXZlIG9mIEdQIHZhbHVlLgotCShsb2FkX3N5bWJvbF9hZGRyZXNzKTogRG9uJ3QgYWRqdXN0IHJldHVybiB2YWx1ZSBieSBHUF9BREpVU1RNRU5ULgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBQcmludCBzb21lIHNlbnNpYmxlIGVycm9yIG1lc3NhZ2UgaWYKLQliZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHJldHVybnMgYmZkX3JlbG9jX292ZXJmbG93LgotCi1Nb24gRmViICA3IDE1OjQ5OjI0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSplbGYqKTogTmV3IGNvbmZpZ3VyYXRpb24gZm9yIFBBIEVMRi4KLQkoaHBwYSotKi1vc2YqKTogRGVmYXVsdCBvYmplY3QgZm9ybWF0IGlzIFNPTS4KLQotTW9uIEZlYiAgNyAxNjowNzozNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYXRvZik6IFdhcm4gdGhhdCBmbG9hdGluZy1wb2ludCB2YWx1ZXMKLQltaWdodCBub3QgYXNzZW1ibGUgcHJvcGVybHkuCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0IGFscGhhLSotb3NmKik6IERvbid0IHNldCAiZGV2PXllcyIgYW55Ci0JbW9yZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IFBhcmVudGhlc2l6ZSBvcGVyYXRpb25zIGluCi0JcmFuZ2UgY2hlY2tpbmcsIHRvIGF2b2lkIHByZWNlZGVuY2UgcXVlc3Rpb25zLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWRkcjMyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IGl0IGZvciAiLTMyYWRkciIuCi0JKGxvYWRfc3ltYm9sX2FkZHJlc3MpOiBJZiBhZGRyMzIgaXMgc2V0LCB1c2UgbGRsIGluc3RlYWQgb2YgbGRxLgotCi0JKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogQ2FsY3VsYXRlIG1heGltdW1fdXNlZnVsX2RpZ2l0cwotCWFuZCBtb3JlX3RoYW5fZW5vdWdoX2JpdHNfZm9yX2RpZ2l0cyBpbiBpbnRlZ2VyIGFyaXRobWV0aWMsIHRvCi0JZWxpbWluYXRlIHRoZSBvbmx5IHNvdXJjZXMgb2YgZGVwZW5kZW5jZSBvbiBmbG9hdGluZyBwb2ludAotCXN1cHBvcnQsIHdoaWNoIGRvZXNuJ3Qgd29yayB5ZXQgb24gdGhlIEFscGhhLgotCi1Nb24gRmViICA3IDAzOjU2OjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfZGVidWcpIFtUQ19BTFBIQV06IFNwZWNpZnkgdmVyc2lvbiBzdGFtcCBhcwotCTB4MzBiIGZvciBBbHBoYSBmb3Igbm93LCB1bnRpbCAiLnZlcnN0YW1wIiBpcyBoYW5kbGVkLgotCi0JKiBsaXRlcmFsLmMgKGFkZF90b19saXRlcmFsX3Bvb2wpOiBVc2Ugc2VnaW5mby0+ZnJjaGFpblAsIHdoaWNoCi0JYWN0dWFsbHkgcmVmZXJzIHRvIHRoZSBsaXRlcmFsIHBvb2wgc2VjdGlvbiwgcmF0aGVyIHRoYW4KLQlmcmNoYWluX25vdywgd2hpY2ggcmVmZXJzIHRvIHdoYXRldmVyIHNlY3Rpb24gdGhlIGFzc2VtYmxlciB3YXMKLQlpbi4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IE9ubHkgZG8gcmFuZ2UgY2hlY2tpbmcgaWYgc2l6ZSBvZiBmaXh1cAotCWlzIHNtYWxsZXIgdGhhbiB3b3JkIHNpemUuICBPdGhlcndpc2UsIHdlIGFsd2F5cyB3aW5kIHVwIHdpdGgKLQl6ZXJvcy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBDaGFuZ2Ugc2Vjb25kIGFyZ3VtZW50IGFuZAotCXJldHVybiB0eXBlIHRvIHZhbHVlVCwgdG8gYWdyZWUgd2l0aCB0Yy5oLgotCShhbHBoYV9kb19hbGlnbik6IExvY2FsIHN0YXRpYyBhcnJheSBub3BfcGF0dGVybiBpcyBub3cgdW5zaWduZWQKLQljaGFyLCB0byBhdm9pZCBvdmVyZmxvdyB3YXJuaW5ncy4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChtZF9zZWN0aW9uX2FsaWduKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSk6IEVuc3VyZSB0aGF0IGVjb2ZmX2RhdGEgZm9yCi0Jb3V0cHV0IGJmZCBpcyBub24tbnVsbCBiZWZvcmUgaW5kaXJlY3RpbmcgdGhyb3VnaCBpdC4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2Zyb2JfZWNvZmZfZGF0YSk6IFJlbmFtZWQgZnJvbQotCWFscGhhX2Zyb2JfZmlsZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oICh0Y19mcm9iX2ZpbGUpOiBNYWNybyBkZWxldGVkLgotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpIFtUQ19BTFBIQV06IENhbGwKLQlhbHBoYV9mcm9iX2Vjb2ZmX2RhdGEsIHRoZW4gZmlsbCBpbiBvcHRpb25hbC1oZWFkZXIgaW5mbyB3aXRoIGdwCi0JdmFsdWUgYW5kIHJlZ2lzdGVyIG1hc2tzLgotCi1TdW4gRmViICA2IDE2OjEzOjQ3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW4gKGhpdXgpOiBGaXhlcyBmcm9tIG0ta2FzYWhyQHNyYW1oYy5zcmEuY28uSlAuCi0KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24pOiBTYW1lIGNoYW5nZQotCWFzIGNvZmZiZmQgYW5kIGVsZiBiZWxvdy4gIFplcm8gdGhlIGluaXRpYWwgc3RhYiBzeW1ib2wgYWZ0ZXIKLQlhbGxvY2F0aW5nIGl0LgotCi1TYXQgRmViICA1IDEyOjMwOjMyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogWmVybyB0aGUKLQlpbml0aWFsIHN0YWIgc3ltYm9sIGFmdGVyIGFsbG9jYXRpbmcgaXQuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogRGl0dG8uCi0KLVNhdCBGZWIgIDUgMTE6NTM6MzEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogYWRkYlt0Zl0gc2hvdWxkIG9ubHkgYWNjZXB0Ci0Jbm9uLW5lZ2F0ZWQgY29uZGl0aW9uIGNvbXBsZXRlcnMuICBBZGQgc3VwcG9ydCBmb3IgYWRkYiBwc2V1ZG8tb3AKLQl3aGljaCBhY2NlcHRzIGJvdGggbmVnYXRlZCBhbmQgbm9uLW5lZ2F0ZWQgY29tcGxldGVycy4KLQotU2F0IEZlYiAgNSAwMDoxNTo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocnM2MDAwKik6IFVzZSBjcHVfdHlwZSBwcGMuCi0JKHBwYy0qLWFpeCopOiBOZXcgdGFyZ2V0OyB1c2UgY29mZiBhbmQgZm9yY2UgYmZkX2dhcy4KLQkqIGNvbmZpZy90Yy1wcGMuaCwgY29uZmlnL3RjLXBwYy5jOiBOZXcgZmlsZXMgZm9yIFBvd2VyUEMvUE9XRVIKLQkoUlMvNjAwMCkgc3VwcG9ydC4gIEF0IHRoZSBtb21lbnQsIG9ubHkgWENPRkYgaXMgc3VwcG9ydGVkLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoU0FfU0VUX1NZTV9FTkRORFgpOiBNYWRlIG5vbi1zdGF0aWMuCi0JKFNfU0VUX0RBVEFfVFlQRSk6IExpa2V3aXNlLgotCShjb2ZmX2xhc3RfZnVuY3Rpb24pOiBSZW5hbWVkIGZyb20gbG9jYWwgc3RhdGljIGxhc3RfZnVuY3Rpb25QIGluCi0JY29mZl9mcm9iX3N5bWJvbCBhbmQgbWFkZSBleHRlcm5hbGx5IHZpc2libGUuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBOZXcgbG9jYWwgc3RhdGljIHNldF9lbmQ7IHVzZSBpdCB0byB0cnkgdG8KLQlhdm9pZCBjYWxsaW5nIFNBX1NFVF9TWU1fRU5ETkRYIG9uIGEgc3ltYm9sIHRoYXQgd2lsbCBiZSBwdW50ZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19TRVRfREFUQV9UWVBFKTogRGVjbGFyZS4KLQkoU0FfU0VUX1NZTV9FTkRORFgpOiBEZWNsYXJlLgotCShjb2ZmX2xhc3RfZnVuY3Rpb24pOiBEZWNsYXJlLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJZiBET0xMQVJfRE9UIGlzIGRlZmluZWQsIGFjY2VwdCBgJCcgYXMKLQllcXVpdmFsZW50IHRvIGAuJyB0byBtZWFuIHRoZSBjdXJyZW50IGxvY2F0aW9uLgotCi0JKiByZWFkLmMgKExFWF9CUik6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMC4KLQkobGV4X3R5cGUpOiBVc2UgTEVYX0JSIGFzIHRoZSB0eXBlIG9mIGB7JyxgfScsYFsnLGBdJy4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogSWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIGlzCi0JZGVmaW5lZCwgY2FsbCBpdCB3aXRoIHByZXNlcnZlZF9jb3B5X29mX25hbWUuICBJZgotCXRjX3N5bWJvbF9uZXdfaG9vayBpcyBkZWZpbmVkLCBjYWxsIGl0IG9uIHRoZSBuZXcgc3ltYm9sLgotCShzeW1ib2xfZmluZF9iYXNlKTogSWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIGlzIGRlZmluZWQsCi0JY2FsbCBpdCBvbiBhIGNvcHkgb2YgdGhlIG5hbWUgYXJndW1lbnQuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogU2ltcGxpZmllZCB1c2FnZSBvZiBvYmpfZnJvYl9zeW1ib2wKLQlhbmQgdGNfZnJvYl9zeW1ib2wuICBBbHdheXMgY2FsbCBib3RoIGlmIHRoZSBzeW1ib2wgaXMgZ29pbmcgdG8gYmUKLQlvdXRwdXQuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X3NlZ21lbnQpOiBVc2UgJWxkIHJhdGhlciB0aGFuICVkIHdoZW4gcHJpbnRpbmcKLQlmcmFnUC0+ZnJfdmFyLCBhbmQgY2FzdCBpdCB0byBsb25nLgotCi0JQ2hhbmdlZCByZWxvY3MgdG8gYmUgYmFzZWQgb24gc3Vic2VnbWVudHMgKHdoZW4gQkZEX0FTU0VNQkxFUikuCi0JKiBzdWJzZWdzLmggKHN0cnVjdCBmcmNoYWluKTogSWYgQkZEX0FTU0VNQkxFUiwgYWRkZWQgbmV3IGZpZWxkcwotCWZpeF9yb290IGFuZCBmaXhfdGFpbC4KLQkoc2VnbWVudF9pbmZvX3R5cGUpOiBJZiBCRkRfQVNTRU1CTEVSLCBkb24ndCBkZWZpbmUgZml4X3RhaWwKLQlmaWVsZC4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBJZiBCRkRfQVNTRU1CTEVSLCBzZXQgZml4X3Jvb3RQIGFuZAotCWZpeF90YWlsUCBiYXNlZCBvbiBmcmNoYWluX25vdywgbm90IHNlZ19pbmZvIChub3dfc2VnKS4KLQkoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSk6IENoYWluIHRoZSBzdWJzZWdtZW50IHJlbG9jcyB0b2dldGhlci4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSk6IERvbid0IGNsZWFyIGZpeF90YWlsIGZpZWxkLgotCShzdWJzZWdfZ2V0KTogTGlrZXdpc2UuCi0JKiBsaXRlcmFsLmMgKGFkZF90b19saXRlcmFsX3Bvb2wpOiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyB2aWEKLQlmcmNoYWluX25vdywgbm90IHNlZ2luZm8uCi0KLVRodSBGZWIgIDMgMjM6MDc6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKFRBUkdFVF9TWU1CT0xfRklFTERTKTogQ2hhbmdlZAotCWVjb2ZmX3VuZGVmaW5lZCB0byBlY29mZl9leHRlcm5fc2l6ZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuYyAoc19leHRlcm4pOiBTZXQgZWNvZmZfZXh0ZXJuX3NpemUgdG8gdGhlCi0JZXh0ZXJuYWwgc3ltYm9sIHNpemUsIHJhdGhlcm4gdGhhbiBzZXR0aW5nIHRoZSBzeW1ib2wgdmFsdWUuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQ2hlY2sgYm90aCBlY29mZl9leHRlcm5fc2l6ZSBhbmQKLQlzeW1ib2wgdmFsdWUgdG8gc2VlIGlmIEdQIHJlZmVyZW5jaW5nIGNhbiBiZSB1c2VkLgotCSogZWNvZmYuYyAoZWNvZmZfc3ltYm9sX25ld19ob29rKTogQ2xlYXIgZWNvZmZfZXh0ZXJuX3NpemUsIG5vdAotCWVjb2ZmX3VuZGVmaW5lZC4KLQkoZWNvZmZfZnJvYl9zeW1ib2wpOiBEb24ndCBjaGVjayBlY29mZl91bmRlZmluZWQuCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBHZXQgc2l6ZSBvZiBhbiB1bmRlZmluZWQgc3ltYm9sIGZyb20KLQlzeW0tPmVjb2ZmX2V4dGVybl9zaXplLCBub3QgU19HRVRfVkFMVUUgKHN5bSkuCi0KLVdlZCBGZWIgIDIgMTM6NTU6MDggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluOiAgQXZvaWQgYnVnIGluIGxvc2luZyBocHV4IHNlZC4KLQotV2VkIEZlYiAgMiAxMTo0MDoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGZpbGVfbWlwc19pc2EpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9iZWdpbik6IFNldCBpdC4KLQkoc19taXBzc2V0KTogQWRkIHN1cHBvcnQgZm9yIC5zZXQgbWlwTiB0byBzZXQgdGhlIElTQSBsZXZlbC4KLQotCSogZ2FzcC5jIChraW5mbyk6IEZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6ZXIuCi0KLVR1ZSBGZWIgIDEgMTk6Mjg6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jIChtYWxsb2MpOiBEb24ndCBkZWNsYXJlLCBzaW5jZSBob3N0Lmggb3Igc3lzdGVtIGhlYWRlcgotCWZpbGVzIG1heSBkZWNsYXJlIGl0IGRpZmZlcmVudGx5LgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGludF90b19nZW4pOiBOb3cgc3RhdGljLgotCi0JKiBjb25maWcvaG8taTM4NmFpeC5oOiBJbmNsdWRlIHN5cy90eXBlcy5oIGFuZCBzdGRsaWIuaCwgbm90Ci0JaG8tc3lzdi5oLiAgQmFzZWQgbG9vc2VseSBvbiBhIHBhdGNoIGZyb20gTWluaCBUcmFuLUxlLgotCi1UdWUgRmViICAxIDEwOjUwOjE3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGdhc3AuYzogSW5jbHVkZSBob3N0LmguCi0KLVR1ZSBGZWIgIDEgMTI6MTM6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogTWFrZSBhbiB1bnN1cHBvcnRlZCBpbnN0cnVjdGlvbiBhCi0Jd2FybmluZywgbm90IGFuIGVycm9yLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG90X3RleHRfc3ltYm9sLCBkb3RfZGF0YV9zeW1ib2wsCi0JZG90X2Jzc19zeW1ib2wpOiBEb24ndCBkZWZpbmUgaWYgQkZEX0FTU0VNQkxFUi4KLQkob2JqX3N5bWJvbF90b19jaGFycyk6IGJmZF9jb2ZmX3N3YXBfYXV4X291dCBub3cgdGFrZXMgbW9yZQotCWFyZ3VtZW50cy4KLQkoY29mZl9saW5lX2Jhc2UpOiBSZW5hbWVkIGZyb20gbGluZV9iYXNlLiAgQ2hhbmdlZCBhbGwgdXNlcy4KLQkoY29mZl9hZGRfbGluZXN5bSk6IFJlbmFtZWQgZnJvbSBhZGRfbGluZV9zeW0uICBNYWRlIG5vbi1zdGF0aWMuCi0JQ2hhbmdlZCBhbGwgdXNlcy4KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBJZiBUQ19QUEMsIGluY2x1ZGUgY29mZi9yczYwMDAuaC4KLQkoU19TRVRfU1RPUkFHRV9DTEFTUywgU19HRVRfU1RPUkFHRV9DTEFTUyk6IERlY2xhcmUgaWYKLQlCRkRfQVNTRU1CTEVSLgotCShjb2ZmX2xpbmVfYmFzZSk6IERlY2xhcmUuCi0JKGNvZmZfYWRkX2xpbmVzeW0pOiBEZWNsYXJlIGlmIEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoc3ltYm9sX3RvX2NoYXJzKTogYmZkX2NvZmZfc3dhcF9hdXhfb3V0Ci0Jbm93IHRha2VzIG1vcmUgYXJndW1lbnRzLgotCi1Nb24gSmFuIDMxIDE3OjU1OjE0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAoc3RhdGlzdGljc19mbGFnKTogUmVuYW1lZCBmcm9tIHF1aWV0X2ZsYWcuCi0JKG1haW4pOiBHZXQgc3RhdGlzdGljcyB3aXRoIC0tc3RhdGlzdGljcyBpbnN0ZWFkIG9mIC1ub3F1aWV0LgotCi1Nb24gSmFuIDMxIDA3OjE5OjMwIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBTdXBwb3J0IGZvciBHbnUgQVNzZW1ibGVyIFByZXByb2Nlc3Nvci4KLQkqIGdhc3AuYzogTmV3IGZpbGUuCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBBbGlnbiBsY29tbSBkYXRhLgotCSogY29uZmlnL3RjLXo4ay5jICh0Y19yZWxvY19tYW5nbGUpOiBEb24ndCBhbGxvdyBzdWJ0cmFjdGlvbgotCWZyb20gZGlmZmVyZW50IHNlY3Rpb25zLgotCi1TdW4gSmFuIDMwIDE0OjU4OjI2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgdGNfZnJvYl9maWxlIGlzIGRlZmluZWQsIGNhbGwgaXQKLQlqdXN0IGJlZm9yZSBjYWxsaW5nIG9ial9mcm9iX2ZpbGUuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZ3BfdmFsdWUpOiBSZW5hbWVkIGZyb20gZ3BfdmFsdWUKLQkocmVmZXJlbmNlcyBjaGFuZ2VkKSwgYW5kIG1hZGUgbm9uLXN0YXRpYy4KLQkoZ2V0RXhwcmVzc2lvbik6IFJldHVybiB2b2lkLgotCShzZWxlY3RfZ3BfdmFsdWUpOiBBYm9ydCBpZiBncF92YWx1ZSBpcyBub24temVyby4gIERlbGV0ZSBjYWxsIHRvCi0Jbm9uLWV4aXN0ZW50IGJmZF9zZXRfZ3BfdmFsdWUuCi0JKGFscGhhX3ZhbGlkYXRlX2ZpeCk6IEZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGFscGhhX2Zyb2Jfc3ltYm9sKTogRnVuY3Rpb24gZGVsZXRlZC4KLQkoYWxwaGFfbG9jYWxfbGFiZWwpOiBGdW5jdGlvbiBkZWxldGVkLgotCShhbHBoYV9mcm9iX2ZpbGUpOiBSZW5hbWVkIGZyb20gYWxwaGFfZW5kLgotCSogY29uZmlnL3RjLWFscGhhLmggKGFscGhhX2Zyb2Jfc3ltYm9sLCBhbHBoYV92YWxpZGF0ZV9maXgsCi0JYWxwaGFfbG9jYWxfbGFiZWwsIGFscGhhX2VuZCk6IERlY2xhcmF0aW9ucyBkZWxldGVkLgotCShhbHBoYV9ncF92YWx1ZSwgYWxwaGFfZnJvYl9maWxlKTogRGVjbGFyZS4KLQkodGNfZnJvYl9zeW1ib2wsIFRDX1ZBTElEQVRFX0ZJWCwgbWRfZW5kKTogTWFjcm9zIGRlbGV0ZWQuCi0JKExPQ0FMX0xBQkVMKTogTW92ZSBjb2RlIGhlcmUgZnJvbSB0Yy1hbHBoYS5jOmFscGhhX2xvY2FsX2xhYmVsLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBTaW1wbGlmaWVkIHNsaWdodGx5LgotCSh0Y19mcm9iX2ZpbGUpOiBOZXcgbWFjcm8uCi0KLQkqIHJlYWQuYyAoZG9fYWxpZ24pOiBOZXcgZnVuY3Rpb24sIG1vc3Qgb2YgZ3V0cyBvZiBzX2FsaWduXyoKLQlmdW5jdGlvbnMuICBMb29rIGZvciBtZF9kb19hbGlnbiBtYWNybywgZ2l2ZSBpdCBhIGNoYW5jZSB0byBieXBhc3MKLQlhbGwgYnV0IHJlY29yZGluZyBvZiBzZWN0aW9uIGFsaWdubWVudC4KLQkoc19hbGlnbl9ieXRlcywgc19hbGlnbl9wdHdvKTogQ2FsbCBkb19hbGlnbi4KLQkoc19sY29tbSkgW1RDX0FMUEhBXTogQWxpZ24gb2JqZWN0IHRvIGxhcmdlc3QgcG93ZXIgb2YgdHdvIHRoYXQKLQlkaXZpZGVzIG9iamVjdCBzaXplLgotCi0JKiBmcmFncy5jIChmcmFnX2FsaWduX3BhdHRlcm4pOiBOZXcgZnVuY3Rpb24uCi0JKGZyYWdfYWxpZ24pOiBSZXdyaXRlIGZvciBjbGFyaXR5LgotCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIE9fY29uc3RhbnQgZXhwcmVzc2lvbi4KLQkodmlwX2JlZ2luKTogUmV0dXJucyBwb2ludGVyIHRvIGNvbnN0IGNoYXIuICBDYXN0IGhhc2hfaW5zZXJ0IGFyZwotCXRvIFBUUiB0byBhdm9pZCBjb21waWxlciBjb21wbGFpbnRzIGFib3V0IGNvbnN0LgotCShtZF9iZWdpbik6IExvY2FsIHZhcmlhYmxlIGVycnR4dCBtdXN0IHBvaW50IHRvIGNvbnN0LgotCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBob3N0IHZheC0qLXVsdHJpeCogbGlrZSB2YXgtKi1ic2QqLiAgRG9uJ3QKLQlib3RoZXIgd2l0aCAqLSotdWx0cml4IG9yICotKi1zeXN2KiwgZXhjZXB0ICotKi1zeXN2LCBzaW5jZSBvbmx5Ci0JdGhlIGxhc3QgaGFzIGFuIGV4aXN0aW5nIGhvc3Qgc3VwcG9ydCBmaWxlLiAgRG8gaGFuZGxlIHZheC1ic2QgYW5kCi0JdmF4LXVsdHJpeCB0YXJnZXRzLgotCi1GcmkgSmFuIDI4IDExOjI2OjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb25faGVhZGVyX2FwcGVuZCk6IERvIG5vdAotCWRlY2xhcmUgaWYgQkZEX0FTU0VNQkxFUi4KLQkoc3RhY2tfcG9wKTogQ29ycmVjdCB0ZXN0IGZvciBzdGFjayB1bmRlcmZsb3cuCi0JKG9ial9jb2ZmX2VuZGVmLCBvYmpfY29mZl9kaW0sIG9ial9jb2ZmX2xpbmUsIG9ial9jb2ZmX3NpemUsCi0Jb2JqX2NvZmZfc2NsLCBvYmpfY29mZl90YWcsIG9ial9jb2ZmX3R5cGUsIG9ial9jb2ZmX3ZhbCk6IERlY2xhcmUKLQl0eXBlIG9mIGlnbm9yZWQgYXJndW1lbnQgdG8gYXZvaWQgZ2NjIHdhcm5pbmcuCi0JKGFsaWduKTogUmVtb3ZlZCB1bnVzZWQgZnVuY3Rpb24uCi0KLVRodSBKYW4gMjcgMTg6MTQ6MTkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWFscGhhLmMsIGNvbmZpZy90Yy1hbHBoYS5oLCBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IE5ldwotCWZpbGVzLCBiYXNlZCBvbiBwb3J0IG9mIGdhcy0xLjM4IGNvbnRyaWJ1dGVkIGJ5IENNVSwgdXNpbmcgYS5vdXQKLQl2YXJpYW50LiAgVXBkYXRlZCBmb3IgZ2FzLTIueCBhbmQgRUNPRkYuICBGbG9hdGluZy1wb2ludCBjb25zdGFudHMKLQlhcmUgc3RpbGwgYnJva2VuLCBib290c3RyYXAgdGVzdGluZyBpbmNvbXBsZXRlLgotCi0JKiBsaXRlcmFsLmM6IENvbW1lbnQgY2hhbmdlcy4KLQotCSogbGlzdGluZy5jIChsaXN0aW5nX3NvdXJjZV9maWxlKTogQ2hlY2sgZm9yIG51bGwgbGlzdGluZ190YWlsCi0JYmVmb3JlIGluZGlyZWN0aW5nIHRocm91Z2ggaXQuCi0KLQkqIGV4cHIuaCAoc3RydWN0IGV4cHJlc3Npb25TKTogQWRkZWQgc3RydWN0IHRhZy4KLQotCSogYXMuaDogSWYgX19HTlVDX18gYW5kIGlubGluZSBhcmUgYm90aCB1bmRlZmluZWQsIGRlZmluZSBpbmxpbmUKLQlhd2F5LgotCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogRG9uJ3QgYXNzdW1lIHRoYXQgZnJfdmFyIGZvcgotCXJzX2FsaWduIG9yIHJzX29yZyBmcmFncyB3aWxsIGJlIDEuCi0JKHJlbGF4X3NlZ21lbnQpOiBGb3IgcnNfYWxpZ24sIGlmIGZyX3ZhciBpcyBub3QgMSwgY29tcGxhaW4gaWYKLQlyZXF1aXJlZCBwYWRkaW5nIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBzaXplIG9mIHRoZSBwYWQgcGF0dGVybi4KLQkoZml4dXBfc2VnbWVudCk6IExlYXZlIGdwLXJlbGF0aXZlIHJlbG9jYXRpb25zIGFsb25lLiAgRm9yIHBjcmVsCi0JcmVsb2NhdGlvbnMgcmVmZXJyaW5nIHRvIHRoZSBzYW1lIHNlZ21lbnQsIGNsZWFyIGZ4X3BjcmVsIHdoZW4KLQljbGVhcmluZyBmeF9hZGRzeS4KLQkqIGFzLmg6IEFkanVzdCBjb21tZW50cyBvbiByc19hbGlnbi4KLQotCSogYXRvZi1nZW5lcmljLmM6IFNvbWUgcmVmb3JtYXR0aW5nLgotCShhdG9mX2dlbmVyaWMpOiBCZSBjYXJlZnVsIHdoZW4gbWl4aW5nIHNpZ25lZC91bnNpZ25lZCB2YWx1ZXMgb2YKLQlkaWZmZXJlbnQgc2l6ZXMuCi0KLQkqIHdyaXRlLmMsIGNvbmZpZy9vYmote2FvdXQsYm91dCxjb2ZmKn0uYywgY29uZmlnL3RjLXNwYXJjLmM6Ci0JUXVlcnkgdGhlIGZ4X2RvbmUgZmllbGQgaW5zdGVhZCBvZiBmeF9hZGRzeSB0byBzZWUgaWYgdGhlIGZpeHVwCi0Jc3RpbGwgbmVlZHMgdG8gYmUgYXBwbGllZC4gIFNldCBmeF9kb25lIGFuZCBjbGVhciBmeF9hZGRzeSBib3RoLAotCWZvciBub3cuICBJZiBUQ19IQU5ETEVTX0ZYX0RPTkUgaXNuJ3QgZGVmaW5lZCwgYXNzdW1lIG1kX2FwcGx5X2ZpeAotCXdpbGwgb25seSBjbGVhciBmeF9hZGRzeSwgYW5kIHNldCBmeF9kb25lIGFjY29yZGluZ2x5IGFmdGVyCi0JcmV0dXJuaW5nLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRDX0hBTkRMRVNfRlhfRE9ORSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgpOiBTZXQgZnhfZG9uZSBmb3Igbm9uLXBjcmVsIGZpeAotCXdpdGggbm8gZnhfYWRkc3kuCi0KLQkqIHN5bWJvbHMuYyAoZG90X3RleHRfc3ltYm9sLCBkb3RfZGF0YV9zeW1ib2wsIGRvdF9ic3Nfc3ltYm9sKToKLQlEZWxldGVkLgotCShzeW1ib2xfYmVnaW4pOiBNb3ZlZCB0byBlbmQgb2YgZmlsZSwgc28gZnVuY3Rpb24gaW5saW5pbmcgY2FuCi0Jd29yayBiZXR0ZXIuCi0JKGZiX2xhYmVsX2NvdW50LCBmYl9sYWJlbF9tYXgpOiBEZWZhdWx0IEMgc3RhdGljIGluaXRpYWxpemVycyBhcmUKLQlzdWZmaWNpZW50LgotCSogc3ltYm9scy5oIChkb3RfdGV4dF9zeW1ib2wsIGRvdF9kYXRhX3N5bWJvbCwgZG90X2Jzc19zeW1ib2wpOgotCURlY2xhcmF0aW9ucyBkZWxldGVkLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvdF90ZXh0X3N5bWJvbCwgZG90X2RhdGFfc3ltYm9sLAotCWRvdF9ic3Nfc3ltYm9sKTogRGVmaW5lZCBoZXJlLCBzdGF0aWMuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIFtCRkRfQVNTRU1CTEVSXTogVW5kZWYgTk9fUkVMT0MgYmVmb3JlCi0JaW5jbHVkaW5nIGFvdXQvYW91dDY0LmguCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMgaXMgZmFsc2UsCi0JZG9uJ3Qgd3JpdGUgb3V0IGEgc2VjdGlvbiBzeW1ib2wgZXZlbiBpZiBpdCdzIHVzZWQgaW4gYQotCXJlbG9jYXRpb247IGFzc3VtZSByZWxvY2F0aW9ucyB3aWxsIGhhbmRsZSBzZWN0aW9uIG51bWJlcnMKLQlzb21laG93LiAgUmVuYW1lICJwdW50X2l0IiBsYWJlbCB0byAicHVudF9pdF9pZl91bnVzZWQiIHRvIHJlZmxlY3QKLQlpdCdzIHRydWUgdXNlLgotCShFTUlUX1NFQ1RJT05fU1lNQk9MUyk6IERlZmF1bHQgdG8gMS4KLQkoYWRqdXN0X3JlbG9jX3N5bXMpOiBEb24ndCBjcmVhdGUgYSBuZXcgc3ltYm9sIGZvciBhbiBhYnNvbHV0ZQotCXJlZmVyZW5jZTsganVzdCB1c2UgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sLgotCSh3cml0ZV9yZWxvY3MpOiBNYWtlIHByaW50b3V0IG9mIHJlbG9jIHZhbHVlcyBkZXBlbmRlbnQgb24gZmxhZwotCURFQlVHMywgbm90IERFQlVHMi4KLQkqIGNvbmZpZy9vYmotYW91dC5oIChFTUlUX1NFQ1RJT05fU1lNQk9MUyk6IERlZmluZSBhcyAwLgotCSogY29uZmlnL29iai1lY29mZi5oIChFTUlUX1NFQ1RJT05fU1lNQk9MUyk6IERpdHRvLgotCi1UaHUgSmFuIDI3IDE2OjQzOjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChsZXhfdHlwZSk6IE5vIGxvbmdlciBtYWtlICd7JyBhIHZhbGlkIGNoYXJhY3RlciBmb3IKLQlzeW1ib2wgbmFtZXMuCi0KLQkqIGFzLmMgKG1haW4pOiBQcmludCBsb25nIHZhbHVlcyB1c2luZyAlbGQuCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3dhcm5faW50ZXJuYWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhc193YXJuLCAzIHZlcnNpb25zKTogVXNlIGFzX3dhcm5faW50ZXJuYWwuCi0JKGFzX3dhcm5fd2hlcmUsIDMgdmVyc2lvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKiBhcy5oIChhc193YXJuX3doZXJlKTogRGVjbGFyZS4KLQotVHVlIEphbiAyNSAxODozMDozNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHF1aWV0X2ZsYWcpOiBOZXcgZmxhZy4KLQkobWFpbik6IElmIC1ub3F1aWV0IGdpdmVuLCBkaXNwbGF5IGV4ZWN1dGlvbiB0aW1lIGFuZCBtZW1vcnkgdXNlZC4KLQotVHVlIEphbiAyNSAxNTo1MzoxMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZG9jL3thbGwudGV4aSxhcy50ZXhpbmZvfTogQWRkIGRvY3VtZW50YXRpb24gZm9yIEhQUEEgcG9ydC4KLQotTW9uIEphbiAyNCAxOToxODoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2Zyb2Jfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLiAgUHV0IHVuZGVmaW5lZAotCXN5bWJvbHMgb2Yga25vd24gc2l6ZSBpbiB0aGUgdW5kZWZpbmVkIHNlY3Rpb24uICBQdXQgc21hbGwgY29tbW9uCi0Jc3ltYm9scyBpbiBhIC5zY29tbW9uIHNlY3Rpb24uCi0JKiBlY29mZi5oIChlY29mZl9mcm9iX3N5bWJvbCk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9mcm9iX3N5bWJvbCk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfd3JpdGVfc3ltYm9sX3AsIG9ial9lbGZfd3JpdGVfc3ltYm9sLAotCW9ial9lbGZfZnJvYl9zeW1ib2wpOiBSZW1vdmVkIHVudXNlZCBmdW5jdGlvbnMuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZnJvYl9zeW1ib2wsIG9ial93cml0ZV9zeW1ib2wpOiBSZW1vdmVkCi0JdW51c2VkIG1hY3Jvcy4KLQkob2JqX2VsZl9mcm9iX3N5bWJvbCwgb2JqX2VsZl93cml0ZV9zeW1ib2wpOiBSZW1vdmVkIGRlY2xhcmF0aW9ucwotCW9mIHVudXNlZCBmdW5jdGlvbnMuCi0JKG9ial9mcm9iX3N5bWJvbCk6IERlZmluZSBpZiBFQ09GRl9ERUJVR0dJTkcuCi0KLQkqIHRjLW1pcHMuYyAoZ19zd2l0Y2hfc2Vlbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBnX3N3aXRjaF9zZWVuIGZvciAtRyBvcHRpb24uCi0JKHNfb3B0aW9uKTogSWYgY3JlYXRpbmcgUElDIGNvZGUsIGZvcmNlIHRoZSBHUCBzaXplIHRvIGJlIDAuICBXYXJuCi0JaWYgLUcgc3dpdGNoIHVzZWQgd2l0aCBhIG5vbi16ZXJvIHZhbHVlLgotCi0JKiBzeW1ib2xzLmMgKFNfSVNfQ09NTU9OKTogVXNlIGJmZF9pc19jb21fc2VjdGlvbiByYXRoZXIgdGhhbgotCWNvbXBhcmluZyBhZ2FpbnN0IGJmZF9jb21fc2VjdGlvbi4KLQotTW9uIEphbiAyNCAxNDoxMjoyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBUcmVhdCBBbHBoYSBsaWtlIE1JUFMgaW4gaGFuZGxpbmcgb2YgLnNic3MKLQlzZWN0aW9uLgotCi1UaHUgSmFuIDIwIDEzOjE3OjU4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEZvciBmbG9hdGluZyBwb2ludCBvcGVyYW5kIHdpdGggdW51c3VhbCBmcAotCWNoYXIgZnJvbSBGTFRfQ0hBUlMsIHByZXNlcnZlIHRoZSBjaGFyYWN0ZXIuICBQYXRjaCBmcm9tIExpc2EKLQlSZXBrYS4KLQotV2VkIEphbiAxOSAyMzoxNToyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBhbGwgZGF0YSBhbGxvY2F0aW9uCi0JcHNldWRvLW9wczogLmh3b3JkLCAuaW50LCAubG9uZywgLm9jdGEsIC5xdWFkLCAuc2hvcnQsIC5zaW5nbGUuCi0KLVR1ZSBKYW4gMTggMTU6NTE6NTkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2VuZGVmKTogRm9yIENfRUZDTiwgQ19CTE9DSyBhbmQKLQlDX0ZDTiBhc3N1bWUgLnZhbCBoYXMgYmVlbiBzZXQgdG8gLgotCi1UdWUgSmFuIDE4IDE2OjE5OjU4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBEaXNhYmxlIG11bHRpcGxlICRDT0RFJCBzdWJzcGFjZSBjb2RlLiAgSXQKLQljb25mdXNlcyBHREIgZm9yIHNvbWUgdW5rbm93biByZWFzb24uCi0JKiBjb2ZuaWcvb2JqLXNvbS5jOiBMaWtld2lzZS4KLQotVHVlIEphbiAxOCAxOTowNTozMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaXRlcmFsLmMgKGFkZF90b19saXRlcmFsX3Bvb2wpOiBIYW5kbGUgZHVwbGljYXRlcyBvZiB2YWx1ZXMKLQlhbHJlYWR5IHdyaXR0ZW4gdG8gbGl0ZXJhbCBwb29sLgotCi1UdWUgSmFuIDE4IDE3OjIzOjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogVHJ5IHRvIGdldCBzeW1ib2xzCi0Jd2l0aCBleHBsaWNpdGx5IG1hcmtlZCBzdGFicyB0aHJvdWdoIEJGRDogaWYgYSBzeW1ib2wgbWFya2VkCi0JTl9VTkRGIHwgTl9FWFQgaXMgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24sIG1vdmUgaXQgdG8gdGhlCi0JdW5kZWZpbmVkIHNlY3Rpb247IG1vdmUgYSBzeW1ib2wgbWFya2VkIE5fSU5EUiBpbnRvCi0JYmZkX2luZF9zZWN0aW9uIGFuZCBzZXQgdGhlIEJTRl9JTkRJUkVDVCBmbGFnOyBzZXQgdGhlCi0JQlNGX1dBUk5JTkcgZmxhZyBmb3IgYSBzeW1ib2wgbWFrcmVkIE5fV0FSTklORy4KLQotTW9uIEphbiAxNyAxNTo0MDoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKGVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSk6IERlY2xhcmUuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUpOiBSZXR1cm4gdHlwZSBpcyB2b2lkLgotCi1Nb24gSmFuIDE3IDAwOjE4OjU1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEV4cGxpY2l0bHkgY2hlY2sgZm9yIGNvbW1hIGJlZm9yZSAndScKLQlhbmQgJ2YnIHRlbXBsYXRlIG9wZXJhbmQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogSGFuZGxlICdOJywgJ08nLCAnbycsICcwJywgJzEnLCAndScsCi0JYW5kICcyJyBpbiBjb3ByIGFuZCBzZnUgaW5zdHJ1Y3Rpb24gdGVtcGxhdGVzLgotCi1TdW4gSmFuIDE2IDE2OjQ0OjIzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBhcy5oIChzdWJzZWdfZm9yY2VfbmV3KTogQWRkIHByb3RvdHlwZS4KLQotU2F0IEphbiAxNSAwOToyMDo1NSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogQWxsb3cgbGluZXMgbGlrZSAiIGZvb2xhYiA6Ii4KLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBGaXggY29tcHV0YXRpb24gb2YgbWFzay4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IEZpeCBsb29wIHRlcm1pbmF0aW9uIHRlc3QuCi0KLVRodSBKYW4gMTMgMTY6MTU6MTUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplKTogTmV3IGZ1bmN0aW9uLgotCShjdXJyZW50X2ZpbGVfaWR4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYWRkX2ZpbGUpOiBVc2UgYW5kIGluY3JlbWVudCBjdXJyZW50X2ZpbGVfaWR4IGluc3RlYWQgb2YgaW5keAotCXBhcmFtZXRlci4KLQotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpOiBNYWtlIGFsbCBiaXRmaWVsZHMgdW5zaWduZWQuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKGk5NjBfdmFsaWRhdGVfZml4KTogQWRkZWQgYXJndW1lbnQKLQlhZGRfc3ltYm9sUFAuICBJbmRpcmVjdCB0aHJvdWdoIGl0IHRvIGdldCAiYWRkX3N5bWJvbFAiLgotCSogY29uZmlnL3RjLWk5NjAuaCAoaTk2MF92YWxpZGF0ZV9maXgpOiBTdXBwbHkgcHJvdG90eXBlLgotCShUQ19WQUxJREFURV9GSVgpOiBQYXNzIGFkZHJlc3Mgb2YgYWRkX3N5bWJvbFAuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LCB1c2luZyB0ZS1uZXRic2QuaC4KLQkoaTM4Ni0qLW5ldGJzZDAuOCk6IE5ldyB0YXJnZXQsIGxpa2UgMzg2YnNkLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBCRkRERUYgaW4gTWFrZWZpbGUgdG8gImRlZmluZSIgb3IgInVuZGVmIi4KLQkqIE1ha2VmaWxlLmluIChjb25maWcuaCk6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCURlZmluZSBvciB1bmRlZiBCRkRfQVNTRU1CTEVSIGFzIHNwZWNpZmllZCBieSAkKEJGRERFRikuCi0JKEFMTF9DRkxBR1MpOiBPbWl0ICQoQkZEREVGKS4KLQkqIGFzLmg6IEluY2x1ZGUgY29uZmlnLmguCi0JKHN0cnVjdCBzeW1ib2wpOiBBZGRlZCBmb3J3YXJkIGRlY2xhcmF0aW9uLgotCShhZGRfdG9fbGl0ZXJhbF9wb29sKTogRml4IGRlY2xhcmF0aW9uLgotCSogYXMuYzogRG9uJ3QgaW5jbHVkZSBjb25maWcuaC4KLQotCSogbGl0ZXJhbC5jIChhZGRfdG9fbGl0ZXJhbF9wb29sKTogVGFrZSBzeW1ib2wgYW5kIGFkZGVuZCBhcwotCWFyZ3VtZW50cywgaW5zdGVhZCBvZiBleHByZXNzaW9uLCBmb3Igbm93LiAgRml4IGNhbGN1bGF0aW9uIG9mCi0Jb2Zmc2V0IHRvIHJldHVybi4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSkgW05FRURfTElURVJBTF9QT09MXTogQWRkIGZpZWxkCi0JbGl0ZXJhbF9wb29sX3NpemUuCi0KLVRodSBKYW4gMTMgMTI6MTQ6MjEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUKLQotCSogc3Vic2Vncy5jIChzdWJzZWdfZ2V0KTogQWNjZXB0IG5ldyBhcmd1bWVudCAiZm9yY2VfbmV3Ii4gIElmCi0Jc2V0IHRoZW4gYSBuZXcgc2VnbWVudCBpcyBhbHdheXMgY3JlYXRlZC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JKHN1YnNlZ19mb3JjZV9uZXcpOiBOZXcgZnVuY3Rpb24uICBTaW1pbGFyIHRvIHN1YnNlZ19uZXcsIGJ1dAotCWFsd2F5cyBmb3JjZSBhIG5ldyBzZWdtZW50IHRvIGJlIGNyZWF0ZWQuCi0KLQkqIGNvbmZpZy9vYmotc29tLmMgKHNvbV9mcm9iX2ZpbGUpOiBDYWxsIGFkanVzdF9jb2RlX3NlY3Rpb25zCi0JZm9yIGVhY2ggc2VjdGlvbi4KLQkoYWRqdXN0X2NvZGVfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24uICBBZGp1c3RzIHRoZSBWTUEgZm9yIGFsbCB0aGUKLQkkQ09ERSQgc3Vic3BhY2VzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hc3NlbWJsZSk6IEFsc28gaGFuZGxlIGNyZWF0aW5nIGEgZml4dXAKLQlmb3IgdGhlIHVud2luZCBkZXNjcmlwdG9ycyBpZiBhIGZ1bmN0aW9uJ3MgbGFiZWwgZm9sbG93cyB0aGUKLQkuUFJPQyBhbmQgLkVOVFJZIGRpcmVjdGl2ZXMuCi0JKHBhX2VudHJ5KTogRG9uJ3Qgc2V0IEJTRl9GVU5DVElPTiBmb3IgdGhlIGxhYmVsIHN5bWJvbCBoZXJlOyBpdAotCWlzIGRvbmUgZWxzZXdoZXJlLiAgRG9uJ3QgY3JlYXRlIGEgZml4dXAgZm9yIHRoZSB1bndpbmQKLQlkZXNjcmlwdG9ycyBpZiB0aGUgZnVuY3Rpb24ncyBsYWJlbCBoYXMgbm90IGJlZW4gZGVmaW5lZCB5ZXQuCi0JKHBhX3Byb2MpOiBGb3IgU09NLCBwbGFjZSBlYWNoIHByb2NlZHVyZSB3aXRoaW4gYSBuZXcgJENPREUkCi0Jc3Vic3BhY2UuICBBZGp1c3QgdGhlIHNlZ21lbnQgYW5kIGZyYWcgZm9yIHRoZSBhc3NvY2lhdGVkCi0JZnVuY3Rpb24gbGFiZWwgaWYgaXQgZXhpc3RzLgotCi1XZWQgSmFuIDEyIDIyOjA1OjMzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9zdHJ1Y3QpOiBBZGQgbmV3ICJzZWdtZW50IiBmaWVsZC4KLQkoaHBwYV9maXhfbmV3KTogSW5pdGlhbGl6ZSBzZWdtZW50IGZpZWxkLgotCShtZF9hcHBseV9maXgpOiBEbyBub3RoaW5nIGZvciBwYy1yZWxhdGl2ZSBmaXh1cCB3aGljaCBpbnZvbHZlcwotCWNyb3NzaW5nIGEgc2VnbWVudCBib3VuZGFyeS4KLQkocGFfcHJvY2VuZCk6IFVuZGVmaW5lIHRoZSBjdXJyZW50IGxhYmVsIGFmdGVyIGhhbmRsaW5nIC5QUk9DCi0JYW5kIC5QUk9DRU5EIGRpcmVjdGl2ZXMuCi0JKGR1bW15X3N5bWJvbCk6IE1ha2UgdHlwZSAic3ltYm9sUyAqIi4gIENoYW5nZSByZWZlcmVuY2VzIGFzCi0JYXBwcm9wcmlhdGUuCi0KLVdlZCBKYW4gMTIgMTM6Mjk6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENhc3QgYXJyYXkgYXJndW1lbnQgdG8gdW5zaWduZWQKLQljaGFyLgotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHN5bXNlZ2luZm8uCi0JKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgZGVmaW5lIHB1bnRfaXQgaWYgaXQgd29uJ3QgYmUgdXNlZC4KLQkoZml4dXBfc2VnbWVudCk6IERvbid0IGRlZmluZSBza2lwIGlmIGl0IHdvbid0IGJlIHVzZWQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgYXMgbWlwc190YXJnZXRfZm9ybWF0LgotCShtaXBzX3RhcmdldF9mb3JtYXQpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc190YXJnZXRfZm9ybWF0KTogRGVmaW5lIHdpdGggYXBwcm9wcmlhdGUKLQlkZWZhdWx0IGRlZmluaXRpb24uCi0JKG1kX3BhcnNlX29wdGlvbik6IElmIC1FTCBvciAtRUIgaXMgdXNlZCwgY2hhbmdlIGJ5dGVfb3JkZXIgYW5kCi0JbWlwc190YXJnZXRfZm9ybWF0IGFzIGFwcHJvcHJpYXRlLgotCi1UdWUgSmFuIDExIDIxOjUyOjM2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogQW5vdGhlciBhdHRlbXB0IHRvIGZpeCBidWdzCi0JZGVhbGluZyB3aXRoIGxhYmVscyB3aXRob3V0IGNvbG9ucyAoZm9yIEhQUEEgYW5kIE1SSSkuCi0KLVR1ZSBKYW4gMTEgMTc6MDE6MDYgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogVHJ1bmNhdGUgYXJncyB0byAlaGkvJWxvIHRvIDMyIGJpdHMuCi0KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IEZpeCBjb21wdXRhdGlvbiBvZiB0b29fbWFueV9kaWdpdHMuCi0JVmFyaWFibGUgZGlnaXRfMiByZW5hbWVkIHRvIHN0YXJ0LiAgRml4IGNoZWNrIGZvciB3aGV0aGVyIG51bWJlcgotCXdpbGwgZml0IGluIDMyIGJpdHMuCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IFVzZSB2YWx1ZVQgaW5zdGVhZCBvZiBsb25nLgotCi1UdWUgSmFuIDExIDEzOjAxOjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYzogSWYgVENfTUlQUywgaW5jbHVkZSBlbGYvbWlwcy5oLgotCShzcGVjaWFsX3NlY3Rpb25zKTogRGVmaW5lLgotCShvYmpfZWxmX3NwZWNpYWxfc2VjdGlvbik6IEdldCBkZWZhdWx0IHR5cGVzIGFuZCBhdHRyaWJ1dGVzIGZyb20KLQlsaXN0IG9mIHNwZWNpYWwgc2VjdGlvbnMuCi0JKiBjb25maWcvdGMtbWlwcy5jIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IERlZmluZS4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBGb3JjZSAuc2RhdGEgYW5kIC5zYnNzCi0Jc2VjdGlvbnMgdG8gYmUgY2xvc2UgdG9nZXRoZXIuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogQ29ycmVjdGVkICRhdCB3YXJuaW5ncyBpbiBhIGNvdXBsZSBvZgotCXNwb3RzLgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfcHJldl9saW5lKTogTmV3IGZ1bmN0aW9uLgotCSogbGlzdGluZy5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkobGlzdGluZ19wcmV2X2xpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKGNhbGNfaGV4KTogUmVzZXQgYnl0ZV9pbl9mcmFnIHRvIHplcm8gZm9yIGVhY2ggbmV3IGZyYWcuCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IENhbGwgbGlzdGluZ19wcmV2X2xpbmUgYWZ0ZXIKLQllbWl0dGluZyBub3AgaW5zdHJ1Y3Rpb25zLgotCSogTWFrZWZpbGUuaW4gKGxpc3Rpbmcubyk6IERlcGVuZHMgdXBvbiBzdWJzZWdzLmguCi0KLU1vbiBKYW4gMTAgMDk6NTI6MjMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogUHV0IGNoZWNrIGZvciBtaXNzaW5nIGxhYmVsIG9uIC5QUk9DCi0JaGVyZS4gIEhhbmRsZSBjYXNlIHdoZXJlIGxhYmVsIG1heSBiZSBkZWZpbmVkIGFmdGVyIHRoZSAuUFJPQy4KLQkocGFfcHJvYyk6IEl0IGlzIG5vdCBhbiBlcnJvciBpZiB0aGUgcHJvY2VkdXJlJ3MgbGFiZWwgaXNuJ3QKLQlkZWZpbmVkIGJlZm9yZSB0aGUgLlBST0MgZGlyZWN0aXZlLgotCi1TdW4gSmFuICA5IDA0OjQzOjMwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGUtbmV0YnNkLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLWkzODYuaCAoVEFSR0VUX0ZPUk1BVCkgW1RFX05ldEJTRF06IFVzZSBiZmQgdGFyZ2V0Ci0JYS5vdXQtbmV0YnNkLTM4NiBmb3IgdGhpcyBjb25maWd1cmF0aW9uLgotCi1GcmkgSmFuICA3IDE3OjM4OjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IERvbid0IGNsb2JiZXIgdGhlIEVDT0ZGIHN5bWJvbCBpbmZvcm1hdGlvbgotCXdpdGggdGhlIGFzc29jaWF0ZWQgc3RhYnMgaW5mb3JtYXRpb24uCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBOZXZlciBzZXQgdGhlIHR5cGUgb2Ygc3RhYnMgc3ltYm9scyB0bwotCXN0X0dsb2JhbC4gIERvbid0IHVwZGF0ZSB0aGUgc3ltYm9sIGluZGV4IG9yIGlmZCBpZiB0aGUgZ2FzIHN5bWJvbAotCWlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgRUNPRkYgc3ltYm9sICh3aGljaCBpcyBub3cgdGhlIGNhc2UgZm9yCi0Jc3RhYnMgc3ltYm9scykuCi0KLUZyaSBKYW4gIDcgMTE6MTQ6MDcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEFkZCBhIExPU0lOR19DT01QSUxFUiBpZmRlZiB0aGF0Ci0Jc3BsaXRzIHRoZSBmdW5jdGlvbi4KLQkobWFjcm8yKTogTmV3IGZ1bmN0aW9uLCBpZiBMT1NJTkdfQ09NUElMRVIgZGVmaW5lZC4KLQotRnJpIEphbiAgNyAwOTozODoyNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogIERvbid0IGV2ZXIgZmlsbCBwYXN0IHRoZQotCWVuZCBvZiBhIHNlY3Rpb24uICh3cml0ZV9vYmplY3RfZmlsZSk6IFRlbXBvcmFyeSBmaXggLSBzZXR1cAotCXN0ZG91dHB1dC4KLQotVGh1IEphbiAgNiAxODowNToyMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogRml4IGhhbmRsaW5nIG9mIGFkZGVuZHMgaW4KLQlub24tcGNyZWxfb2Zmc2V0IHJlbG9jYXRpb25zLgotCi1UaHUgSmFuICA2IDAxOjA2OjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IFdhcm4gYWJvdXQgdXNpbmcgJDEgYXMgd2VsbCBhcyAkYXQKLQl3aXRob3V0IC5zZXQgbm9hdC4KLQotV2VkIEphbiAgNSAxNDoyMjoyMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaXRlcmFsLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUywgT0JKUyk6IExpc3QgaXQuCi0KLQkqIGFzLmggKERFQlVHKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgZXhwcmVzc2lvblMsIHN0cnVjdCBmaXgpOiBEZWNsYXJlIGluIGNhc2UgdGhleSdyZSB1c2VkIGluCi0JcHJvdG90eXBlcy4KLQkoYWRkX3RvX2xpdGVyYWxfcG9vbCkgW0JGRF9BU1NFTUJMRVJdOiBEZWNsYXJlLgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChUQVJHRVRfRk9STUFUKSBbT0JKX0FPVVRdOiBGaXggZm9yIG5ldyBuYW1lcwotCWluIGJmZC4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfZ2V0KTogTmV3IGZ1bmN0aW9uLiAgQ3JlYXRlcyBzZWdtZW50IGlmCi0JbmVlZGVkLCByZXR1cm5zIHBvaW50ZXIsIGJ1dCBkb2Vzbid0IGNoYW5nZSBjdXJyZW50IHNlZ21lbnQuCi0JKHN1YnNlZ19uZXcpOiBVc2UgaXQuCi0KLVR1ZSBKYW4gIDQgMTU6MTI6NDMgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBBZGQgJChzcmNkaXIpLy4uIHRvIHBsYWNlcyB0byBzZWFyY2guCi0JKiBjb25maWcvb2JqLWVjb2ZmLmM6IEluY2x1ZGUgZmlsZXMgYXMgImJmZC8iIGluc3RlYWQgb2YgIi4uL2JmZC8iLgotCSogYXBwLmMsIGZsb251bS5oLCBoZXgtdmFsdWUuYyAoY29uc3QpOiBDaGFuZ2UgI2lmIHRvIGJlIG1vcmUKLQlwb3J0YWJsZS4KLQotVHVlIEphbiAgNCAyMjoxMTozNCAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oby12c3RhLmgsIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIFZTVGEKLQltaWNyby1rZXJuZWwuCi0KLVRodSBEZWMgMzAgMTU6Mjc6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIG5vdyB0YWtlcyBhbgotCWFkZGl0aW9uYWwgYXJndW1lbnQsIHRvIHJldHVybiBhbiBlcnJvciBzdHJpbmcgKHdoaWNoIHdlIGlnbm9yZSkuCi0KLVdlZCBEZWMgMjkgMTQ6Mzc6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IEZpZWxkIHRjX2ZpeF9kYXRhIHNob3VsZCBiZSB0eXBlIFBUUiwgbm90Ci0Jdm9pZCosIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLUFOU0kgY29tcGlsZXJzLiAgQWRkZWQKLQlzaW5nbGUtYml0IGZpZWxkICJmeF9kb25lIi4KLQotU3VuIERlYyAyNiAxNDozMTo0NyAxOTkzICBUb3Jiam9ybiBHcmFubHVuZCAgKHRlZ2VAYWRkZXIuY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBDb252ZXJ0IHRvIGxvd2VyIGNhc2UuCi0JRGVsZXRlIHNwdXJpb3VzIHJlZ2lzdGVyIG5hbWVzICIlcjRMIiwgZXRjLgotCShzZWxlY3Rvcl90YWJsZSk6IFNvcnQgYW5kIGNvbnZlcnQgdG8gbG93ZXIgY2FzZS4KLQkoY29uc19maXhfbmV3X2hwcGEpOiBgcmVsb2NfdHlwZScgPT4gYHJlbF90eXBlJy4KLQkocGFfaXApOiBBbHdheXMgdXNlIHN0cmNtcCBmb3Igbm9uLXRleHQgYW5kIHN0cmNhc2VjbXAgZm9yIHRleHQuCi0JKHJlZ19uYW1lX3NlYXJjaCk6IFJld3JpdGUgdG8gY2FsbCBzdHJjYXNlY21wIG9ubHkgb25jZSBwZXIKLQlpdGVyYXRpb24uCi0JKHBhX2Noa19maWVsZF9zZWxlY3Rvcik6IFJld3JpdGUgdG8gdXNlIGJpbmFyeSBzZWFyY2guCi0JKHBhX3BhcnNlX25lZ19hZGRfY21wbHRyKTogVXNlIHN0cmNhc2VjbXAgZm9yIGNvbXBsZXRlciBjb21wYXJpc29ucy4KLQkocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6ICRURVhUJCBhbmQgJFBSSVZBVEUkIGFyZSBzeW1ib2xzOyB1c2UgY2FzZQotCXNlbnNpdGl2ZSBjb21wYXJpc29ucy4KLQkocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IENhbm9uaWNhbGl6ZSBzdHJuY2FzZWNtcCBhcmcgdG8gbG93ZXIgY2FzZS4KLQkocGFfc3BhY2UpOiAiJHRleHQkIiA9PiAiJFRFWFQkIjsgIiRwcml2YXRlJCIgPT4gIiRQUklWQVRFJCIuICBVc2UKLQljYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uIGZvciBhbGwgc3ltYm9saWMgbmFtZXMuCi0JKHBhX3N1YnNwYWNlKTogQ2Fub25pY2FsaXplIHN0cm5jYXNlY21wIGFyZyB0byBsb3dlciBjYXNlLgotCShwYV9zdWJzcGFjZV9zdGFydCk6IFVzZSBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uIGZvciBzeW1ib2xpYyBuYW1lcy4KLQotTW9uIERlYyAyMCAxMDozNzo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcykgW1JFTE9DX1JFUVVJUkVTX1NZTUJPTF06IElmIG5vCi0Jc3ltYm9sIGlzIHByZXNlbnQgKGkuZS4sIHJlbG9jYXRpb24gYWdhaW5zdCBhYnNvbHV0ZSksIGNyZWF0ZSBhCi0JcGhvbnkgbG9jYWwgc3ltYm9sLCBhbmQgdXNlIGl0IGluIHRoZSByZWxvYy4KLQkoZml4dXBfc2VnbWVudCk6IFdoZW4gYWRqdXN0aW5nIGEgcmVsb2Mgd2l0aCBhbiBhYnNvbHV0ZSBzeW1ib2wsCi0JaGF2ZSBUQ19GT1JDRV9SRUxPQ0FUSU9OIGNvbnRyb2wgY2xlYXJpbmcgYWRkX3N5bWJvbFAgdG9vLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFJFTE9DX1JFUVVJUkVTX1NZTUJPTCk6IERlZmluZSwgZm9yIE9CSl9DT0ZGLgotCi0JKiBzeW1ib2xzLmMgKFNfSVNfRVhURVJOQUwsIFNfSVNfTE9DQUwpOiBEb24ndCB1c2UgYm90aCBCU0ZfRVhQT1JUCi0JYW5kIEJTRl9HTE9CQUwsIHNpbmNlIHRoZXkncmUgdGhlIHNhbWUuCi0KLQkqIGFzLmMgKG1haW4pOiBPbmx5IGludm9rZSBtZF9lbmQgaWYgaXQncyBkZWZpbmVkIGFzIGEgbWFjcm8uCi0JKiB0Yy5oIChtZF9lbmQpOiBEb24ndCBkZWNsYXJlIGl0LgotCSogY29uZmlnL3RjLSouW2NoXSAobWRfZW5kKTogRGVsZXRlZCwgaW4gY2FzZXMgd2hlcmUgaXQgZG9lc24ndCBkbwotCWFueXRoaW5nLgotCSogY29uZmlnL3RjLXZheC5jICh2aXBfZW5kKTogRGVsZXRlZCBudWxsIGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfbWlwc19lbmQpOiBSZW5hbWVkIGZyb20gbWRfZW5kLgotCSogY29uZmlnL3RjLW1pcHMuaCAobWRfbWlwc19lbmQpOiBEZWNsYXJlLgotCShtZF9lbmQpOiBOZXcgbWFjcm8sIGNhbGxzIG1kX21pcHNfZW5kLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IGNsb3NlIG91dHB1dCBmaWxlLgotCSogYXMuYyAobWFpbik6IENsb3NlIG91dHB1dCBmaWxlIChpZiBuZWVkZWQpIGFmdGVyIGNhbGxpbmcKLQlsaXN0aW5nX3ByaW50LCB3aGljaCBzaG91bGQgYmUgYWZ0ZXIgY2FsbGluZyB3cml0ZV9vYmplY3RfZmlsZSwKLQl3aGljaCBzZXRzIHRoZSBmcmFnIGFkZHJlc3Nlcy4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2RpbSwgb2JqX2NvZmZfZW5kZWYsIG9ial9jb2ZmX2xpbmUsCi0Jb2JqX2NvZmZfc2NsLCBvYmpfY29mZl9zaXplLCBvYmpfY29mZl90YWcsIG9ial9jb2ZmX3R5cGUsCi0Jb2JqX2NvZmZfdmFsKTogQWRkIHVudXNlZCBpbnQgYXJndW1lbnQgdG8gc2F0aXNmeSBwcm90b3R5cGVzOyBnb2VzCi0Jd2l0aCBJYW4ncyAxMCBTZXAgY2hhbmdlcy4KLQkoU19HRVRfREFUQV9UWVBFLCBTX1NFVF9EQVRBX1RZUEUsIFNfR0VUX1NUT1JBR0VfQ0xBU1MsCi0JU19TRVRfU1RPUkFHRV9DTEFTUyk6IE5vdyBmdW5jdGlvbiBpbnN0ZWFkIG9mIG1hY3Jvcy4KLQkob2JqX2VtaXRfbGluZW5vKSBbQkZEX0FTU0VNQkxFUl06IERlbGV0ZWQuCi0JKHRhZ19pbnNlcnQpOiBMb2NhbCB2YXIgRVJST1JfU1RSSU5HIGlzIGNvbnN0LiAgVXNlICJjb25zdCIgbm90Ci0JIkNPTlNUIiBmb3IgYXJndW1lbnQgTkFNRS4gIEZpeGVkIHByb3RvdHlwZS4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IFJlbW92ZWQgZXhwbGljaXQgIiNpZiAxIiBkaXJlY3RpdmUuICBJZgotCVNfSVNfRVhURVJOQUwsIHNldCBzdG9yYWdlIGNsYXNzIHRvIENfRVhULgotCShzX2dldF9uYW1lKTogVXNlICJjb25zdCIgbm90ICJDT05TVCIuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19HRVRfREFUQV9UWVBFLCBTX1NFVF9EQVRBX1RZUEUsCi0JU19HRVRfU1RPUkFHRV9DTEFTUywgU19TRVRfU1RPUkFHRV9DTEFTUyk6IERlbGV0ZWQuCi0JKG9ial9lbWl0X2xpbmVubyk6IERlY2xhcmUgb25seSBmb3Igbm9uLUJGRF9BU1NFTUJMRVIuICBGb3IKLQlCRkRfQVNTRU1CTEVSLCBkZWZpbmUgYXMgbWFjcm8gdGhhdCBhYm9ydHMuCi0JKG9ial9leHRyYV9zdHVmZiwgdGNfaGVhZGVyc19ob29rKTogRGVjbGFyZSBvbmx5IGZvcgotCW5vbi1CRkRfQVNTRU1CTEVSLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogRml4IHByb3RvdHlwZS4KLQotU3VuIERlYyAxOSAwMDozNzoyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBUZXN0IG9mIHBjcmVsX29mZnNldCBoYWQgc2Vuc2UKLQlyZXZlcnNlZC4KLQotVGh1IERlYyAxNiAyMToxMzoxMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYmVnaW4pOiBJbml0aWFsaXplICJkdW1teV9sYWJlbCIuCi0JKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBGb3IgcmVsb2NhdGlvbnMgd2hpY2ggaGF2ZSBubyBzeW1ib2wsCi0Jc2V0IHN5bV9wdHJfcHRyIHRvIGR1bW15X2xhYmVsLiAgQXZvaWRzIGxvc3NhZ2UgaW4gZ2VuZXJpYyBCRkQgY29kZS4KLQotVGh1IERlYyAxNiAxNjowNzo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGxleF90eXBlKTogTm8gbG9uZ2VyIG1ha2UgJ1snIGEgdmFsaWQgY2hhcmFjdGVyIGZvcgotCXN5bWJvbCBuYW1lcy4KLQotCSogY29uZmlnL3RjLXZheC5jICh0Y19hb3V0X2ZpeF90b19jaGFycyk6IExvY2FsIHZhcmlhYmxlCi0JTkJZVEVTX1JfTEVOR1RIIG5vdyBjb25zdC4KLQotCSogY29uZmlnL29iai0qLmMsIGNvbmZpZy90Yy0qLmM6IE9taXQgc3VwZXJmbHVvdXMgInJldHVybiIKLQlzdGF0ZW1lbnRzIGF0IGVuZHMgb2YgZnVuY3Rpb25zLiAgRG9uJ3QgY2hlY2sgZm9yIG51bGwgcmV0dXJuIGZyb20KLQloYXNoX25ldywgc2luY2UgaXQgd29uJ3QgcmV0dXJuIGF0IGFsbCBpZiB0aGVyZSdzIG5vIG1lbW9yeQotCWF2YWlsYWJsZS4gIEFsc28sIGNoZWNrIGZvciBudWxsIHJldHVybiBmcm9tIGhhc2hfaW5zZXJ0LCByYXRoZXIKLQl0aGFuIHplcm8tbGVuZ3RoIHN0cmluZywgYXMgc3VjY2VzcyBpbmRpY2F0b3IuCi0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKiBzdWJzZWdzLmggKHNlY3Rpb25fc3ltYm9sKTogRGVjbGFyZS4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogVXNlIGl0LgotCi1XZWQgRGVjIDE1IDE1OjM5OjUzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChSVU5URVNUKTogTmV3IHZhcmlhYmxlLgotCShDSEVDS0ZMQUdTKTogUGFzcyBpdCBkb3duLgotCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfZnJhbWUpOiBQZXJtaXQgZXh0cmEgdHJhaWxpbmcgb3BlcmFuZHM7Ci0JdW51c2VkIGZvciBub3csIGJ1dCBzdXBwbGllZCBieSBBbHBoYSBPU0YxIGNvbXBpbGVyLgotCi0JKiBhcy5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQkoaW50X3RvX2dlbik6IERvbid0IGRlY2xhcmUuCi0KLQkqIGNvbmZpZy9hdG9mLXZheC5jIChhdG9mX3ZheCk6IE5VTEwgaXMgbm90IGEgdmFsaWQgY2hhcmFjdGVyCi0JY29uc3RhbnQuCi0KLVR1ZSBEZWMgMTQgMjE6Mzg6MjUgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1vc2YqKTogRG8gbm90IGNvbnNpZGVyIHRoaXMgYSBkZXZlbG9wbWVudGFsCi0JY29uZmlndXJhdGlvbi4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogSGFuZGxlIGNhc2VzIHdoZXJlIG5vCi0JcmVsb2NhdGlvbiB3aWxsIGJlIGVtaXR0ZWQgZm9yIDMyYml0IGZvcm1hdHMuCi0KLU1vbiBEZWMgMTMgMjM6MzM6NDAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IERvIG5vdCBjYWxsIGhwcGFfZmllbGRfYWRqdXN0Ci0JZm9yIGFueSBvZiB0aGUgJ1QnIGZpZWxkIHNlbGVjdG9ycy4KLQotU2F0IERlYyAxMSAxMToyMzoxMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4NTAwLmMgKGJ1aWxkX2J5dGVzKTogR2V0IHJlbG9jIHR5cGUgcmlnaHQgZm9yIGEKLQklcGFnZSBvcGVyYXRpb24uIChtZF9hc3NlbWJsZSk6IERvbid0IG1vZGlmeSBpbnB1dF9saW5lX3BvaW50ZXIuCi0JKG1kY29mZl9zaXplbWFjaGRlcCk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1oODUwMC5oIChUQ19DT0ZGX1NJWkVNQUNIREVQKTogTmV3IG1hY3JvLgotCSogY29uZmlnL3RjLXo4ay5jIChnZXRfb3BlcmFuZCk6IERlbGV0ZSBib2d1cyBjaGVjay4KLQotV2VkIERlYyAgOCAxNjozMTo1MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKG51bWJlcl90b19jaGFyc18qKTogRGVsZXRlIGJvZ3VzIHJhbmdlIGNoZWNrLgotCi0JKiBvdXRwdXQtZmlsZS5jIChUQVJHRVRfQVJDSCk6IE5vIGRlZmF1bHQuCi0KLVR1ZSBEZWMgIDcgMTY6MDI6NTMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2NvbnZlcnRfZnJhZyk6IFRydW5jYXRlIGRpc3BzIGJlZm9yZSBjYWxsaW5nCi0JbWRfbnVtYmVyX3RvX2NoYXJzLiAgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgbW9kaWZ5Ci0JaW5wdXRfbGluZV9wb2ludGVyLgotCi1Nb24gRGVjICA2IDExOjQ5OjAzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9hc3NlbWJsZSk6IERvbid0IHVwZGF0ZSBpbnB1dF9saW5lX3BvaW50ZXIuCi0KLU1vbiBEZWMgIDYgMTE6MjA6MDIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotc29tLltjaF0gKG9ial9yZWFkX2JlZ2luX2hvb2spOiBSZW1vdmUgbGFzdCBjaGFuZ2UuCi0JQnJlYWtzIHdpdGggdGhlIEhQIGNvbXBpbGVycy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoc3RydWN0IGNhbGxfaW5mbyk6IFJlbW92ZSBmaWVsZHMgd2hpY2ggd2VyZQotCXNldCBidXQgbmV2ZXIgdXNlZC4gIFJlbW92ZSBhbGwgY29kZSB3aGljaCBzZXRzIHRob3NlIGZpZWxkcy4KLQkoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4pOiBMaWtld2lzZS4KLQkoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4pOiBMaWtld2lzZS4KLQkocGFfZGVzYyk6IERlbGV0ZSB1c2VsZXNzIGZ1bmN0aW9uLiAgRGVsZXRlIGFsbCByZWZlcmVuY2VzLgotCShocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBObyBuZWVkIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBmb3IKLQl0aGUgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uLgotCi1TdW4gRGVjICA1IDE3OjA1OjI5IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX3ZlcnNpb24pOiBQYXNzIHZlcnNpb24gc3RyaW5nIHRvCi0JU09NIEJGRCBiYWNrZW5kLgotCShvYmpfc29tX2NvcHlyaWdodCk6IE5ldyBmdW5jdGlvbi4gIE11Y2ggbGlrZSBvYmpfc29tX3ZlcnNpb24uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG9ial9jb3B5cmlnaHQpOiBEZWZpbmUgYXMgYXBwcm9wcmlhdGUgZm9yCi0JU09NIGFuZCBFTEYuCi0JKHBhX2NvcHlyaWdodCk6IEp1c3QgYSBzdHViIG5vdy4KLQotCSogY29uZmlnL29iai1zb20uYyAob2JqX3JlYWRfYmVnaW5faG9vayk6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLXNvbS5oIChvYmpfcmVhZF9iZWdpbl9ob29rKTogUHJvdmlkZSBkdW1teSBkZWZpbml0aW9uLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IERlbGV0ZS4gIFNPTSBpc24ndCBtYWtpbmcgdXNlIG9mIHRoZW0uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBIYW5kbGUgcmVsb2NhdGlvbgotCWV4cGFuc2lvbiBkdWUgdG8gcm91bmRpbmcgbW9kZSBzZWxlY3RvcnMuICBIYW5kbGUgUl9bUkRTTl1fTU9ERQotCXJlbG9jYXRpb25zIGZvciBzZWxlY3RpbmcgdGhlIGN1cnJlbnQgcm91bmRpbmcgbW9kZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoZXZhbHVhdGVfYWJzb2x1dGUpOiBTdXBwb3J0IGVfcnJzZWwgYW5kCi0JZV9ybHNlbCBmaWVsZCBzZWxlY3RvcnMuCi0KLUZyaSBEZWMgIDMgMTg6MzM6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5oOiBJZiBFQ09GRl9ERUJVR0dJTkcsIHVuZGVmCi0JU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyBhbmQgSU5JVF9TVEFCX1NFQ1RJT04sIGFuZCBkZWZpbmUKLQlPQkpfUFJPQ0VTU19TVEFCIHRvIGNhbGwgZWNvZmZfc3RhYi4KLQkqIGNvbmZpZy9vYmotZWxmLmM6IERvbid0IGNvbXBpbGUgb2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbiBpZgotCUlOSVRfU1RBQl9TRUNUSU9OIGlzIG5vdCBkZWZpbmVkLgotCi1GcmkgRGVjICAzIDEwOjU2OjQwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBEZWxldGUgb2xkIHdyYXBwZXIgZnVuY3Rpb24uCi0JKG1kX2FwcGx5X2ZpeF8xKTogUmVuYW1lIHRvIG1kX2FwcGx5X2ZpeC4gIEZpeCBhcmd1bWVudCBkZWNscy4KLQlGaXggY29tbWVudHMgaW4gdmFyaW91cyBwbGFjZXMuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JQXZvaWQgZGVyZWZlcmVuY2luZyBhIE5VTEwgZnhfYWRkc3kuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEF2b2lkIGRlcmVmZXJlbmNpbmcgYSBOVUxMIGZ4X2FkZHN5LgotCi0JRnJpIERlYyAgMyAwOTo0NzozMCAxOTkzICBQZXRlIEhvb2dlbmJvb20gIChob29nZW5AY3MudXRhaC5lZHUpCi0KLQkqIHRjLWhwcGEuYzogKHRjX2dlbl9yZWxvYyk6IEFkZGVuZCBmb3IgYSBwbGFiZWwgcmVsb2NhdGlvbiBzaG91bGQKLQliZSBlaXRoZXIgMCBvciAyIChubyBzdGF0aWMgbGluayBvciBzdGF0aWMgbGluayByZXF1aXJlZCkuICBBbHdheXMKLQlhc3N1bWUgbm8gc3RhdGljIGxpbmsuCi0KLVRodSBEZWMgIDIgMTE6NTI6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBNYWtlIGFkanVzdG1lbnQgdG8gYWRkZW5kIGJlCi0JZGVwZW5kZW50IG9uIGhvd3RvIGZpZWxkcywgbm90IG9uIGZvcm1hdCBmbGF2b3VyLgotCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IHN5bWJvbCk6IE5ldyBmaWVsZHMgc3lfb2JqIGFuZCBzeV90YywKLQlkZWZpbmVkIGFzIHR5cGVzIE9CSl9TWU1GSUVMRF9UWVBFIGFuZCBUQ19TWU1GSUVMRF9UWVBFLCBpZiB0aG9zZQotCW1hY3JvcyBhcmUgZGVmaW5lZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChUQ19TWU1GSUVMRF9UWVBFLCBPQkpfU1lNRklFTERfVFlQRSk6IERlZmluZS4KLQkoVEFSR0VUX1NZTUJPTF9GSUVMRFMsIEk5NjBfU1lNX0ZJRUxEUyk6IERvbid0IGRlZmluZS4KLQkoc3lfdGMsIHN5X29iaik6IERlZmluZSBzbyB0aGF0IHRoZSBmaWVsZHMgbG9vayBsaWtlIHRoZXkgdXNlZCB0bywKLQl1bnRpbCBhbGwgcmVmZXJlbmNlcyBnZXQgY2hhbmdlZC4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IExvdHMgb2YgdmFyaWFibGVzIG5vIGxvbmdlciByZWdpc3Rlci4KLQlSZW9yZGVyZWQgc29tZSBjb2RlIGZvciBlYXNpZXIgcmVhZGluZy4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9kaW0pOiBkaW1faW5kZXggbm8gbG9uZ2VyIHJlZ2lzdGVyLgotCURlbGV0ZWQgc3VwZXJmbHVvdXMgcmV0dXJuIHN0YXRlbWVudC4KLQkob2JqX2NvZmZfbGluZSwgb2JqX2NvZmZfc2l6ZSwgb2JqX2NvZmZfc2NsLCBvYmpfY29mZl90eXBlLAotCW9ial9jb2ZmX3ZhbCwgdGFnX2luaXQsIHRhZ19pbnNlcnQpOiBEZWxldGVkIHN1cGVyZmx1b3VzIHJldHVybgotCXN0YXRlbWVudC4KLQkoYWxpZ24sIG9ial9jb2ZmX3NlY3Rpb24pOiBEZWxldGVkIGRlYnVnZ2luZyBwcmludGZzLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBEaXNjYXJkIHNvbWUgcmVnaXN0ZXIgZGVjbHMuCi0JVXNlIGFzc2lnbm1lbnQgcmF0aGVyIHRoYW4gbWVtY3B5IHRvIGNvcHkgdGVtcGxhdGUuCi0JKG9wX2hhc2gsIHJlZ19oYXNoLCBwcmVmaXhfaGFzaCk6IERlZmF1bHQgQyBpbml0aWFsaXphdGlvbiBvZgotCXN0YXRpY3MgaXMgc3VmZmljaWVudC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChwcmludF9pbnNuKTogQXJyYXkgUmVsb2MgaXMgbm93IGNvbnN0LCBhbmQKLQlwb2ludHMgdG8gY29uc3QuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChUQVJHRVRfRk9STUFUKTogT25seSB1c2UgY29mZi1zcGFyYy1seW54IGlmCi0JVEVfTFlOWDsgdXNlIGNvZmYtc3BhcmMgb3RoZXJ3aXNlLgotCVtVU0VfTkFUSVZFX0hFQURFUlNdOiBEZWxldGUgdGhpcyBjb2RlOyBpdCBpc24ndCB1c2VkLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogQ2FsbCBUQ19WQUxJREFURV9GSVgsIGlmIGRlZmluZWQsCi0JYmVmb3JlIHByb2Nlc3NpbmcgYSBmaXh1cC4gIENhbGwgVENfQURKVVNUX1JFTE9DX0NPVU5UIGp1c3QgYmVmb3JlCi0JcmV0dXJuaW5nLiAgUmVtb3ZlIHNvbWUgaTk2MC1jb2ZmLXNwZWNpZmljIGNvZGUuCi0JKFRDX0FESlVTVF9SRUxPQ19DT1VOVCk6IERlZmF1bHQgdG8gZG9pbmcgbm90aGluZy4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKFRDX0FESlVTVF9SRUxPQ19DT1VOVCkgW09CSl9DT0ZGXTogRGVmaW5lLgotCShpOTYwX3ZhbGlkYXRlX2ZpeCk6IERlY2xhcmUuCi0JKFRDX1ZBTElEQVRFX0ZJWCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKGk5NjBfdmFsaWRhdGVfZml4KTogTmV3IGZ1bmN0aW9uLgotCi0JKiB3cml0ZS5jIChudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuKTogTmV3IGZ1bmN0aW9uLiAgV3JpdGUgb3V0Ci0JYnl0ZXMgaW4gbGl0dGxlIGVuZGlhbiBvcmRlciwgZG9pbmcgc2l6ZSBhbmQgcmFuZ2UgY2hlY2tpbmcuCi0JKG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4pOiBOZXcgZnVuY3Rpb24sIHNpbWlsYXIuCi0JKiB3cml0ZS5oOiBEZWNsYXJlIHRoZW0uCi0JKiBjb25maWcvdGMtKi5jIChtZF9udW1iZXJfdG9fY2hhcnMpOiBVc2UgdGhlbS4KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXBwbHlfZml4KTogRGl0dG8uCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgpOiBEaXR0by4KLQotCSogY29uZmlnL29iai1jb2ZmLmM6IFJlYXJyYW5nZWQgY29kZSBmb3IgaGFuZGxpbmcgbGluZSBudW1iZXIKLQlkYXRhLgotCShsaW5lX2ZzeW0pOiBSZW5hbWVkIGZyb20gZnVuY3Rpb25fbGluZW9mZiBpbiBCRkRfQVNTRU1CTEVSIGNhc2UsCi0Jc2luY2UgdGhlIHVzYWdlIGlzIGRpZmZlcmVudCBmcm9tIG5vbi1CRkRfQVNTRU1CTEVSIGNhc2UuCi0JKGluX2Z1bmN0aW9uLCBjbGVhcl9mdW5jdGlvbiwgc2V0X2Z1bmN0aW9uKTogTmV3IG1hY3JvcywgdG8KLQljb21iaW5lIHNvbWUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgaW1wbGVtZW50ZWQgaW4gZGlmZmVybmV0IHdheXMgaW4KLQlCRkRfQVNTRU1CTEVSIGFuZCBub24tLi4uIGNvZGUuICBVc2VkIGluIG90aGVyIGZ1bmN0aW9ucyB0aGF0IHVzZWQKLQl0byBjaGVjayBmdW5jdGlvbl9saW5lb2ZmICZjLgotCShvYmpfZW1pdF9saW5lbm8pOiBTcGxpdCBpbnRvIHR3byBjb3BpZXMsIG9uZSBmb3IgQkZEX0FTU0VNQkxFUiwKLQlvbmUgZm9yIG5vdC4gIE5vbi1CRkRfQVNTRU1CTEVSIHZlcnNpb24gbm93IGhhcyB0ZW1wb3JhcnkgdmFyaWFibGUKLQl0byBjb250YWluIGNoYXIqIHBvaW50ZXIgcG9pbnRlZCB0byBieSBjaGFyKiogYXJndW1lbnQuICBBbHdheXMKLQlmb2xsb3cgQ1JPU1NfQ09NUElMRSBjb2RlOyBlYXNpZXIgdG8gcmVhZCB0aGF0IHdheS4KLQkob2JqX2NvZmZfbG4pOiBEb24ndCBjYWxsIGFkZF9saW5lbm8gb3IgY19saW5lX25ldyBpZiBhcHBsaW5lIGlzCi0Jc2V0LgotCShvYmpfY29mZl9lbmRlZikgW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIGZvcgotCSIuYmYiLCBpdCdzIGJlZW4gZG9uZSBlbHNld2hlcmUuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBJZiBpbG5lIG51bWJlciBkYXRhIGlzIHBlbmRpbmcsIGNhbGwKLQlhZGRfbGluZXN5bSB0byBmbHVzaCBpdC4KLQkoY29mZl9mcm9iX2ZpbGUpOiBEb24ndCBkbyB0aGF0IGhlcmUuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9mcm9iX2ZpbGUpOiBEZWNsYXJlLgotCShvYmpfZnJvYl9maWxlKTogRGVmaW5lLCB0byBjYWxsIGl0LgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfY3JlYXRlX3Nob3J0X2p1bXAsIG1kX2NyZWF0ZV9sb25nX2p1bXAsCi0JbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXg6IERlZmluZSB0aGVtIGFzIG1hY3JvcyBjYWxsaW5nCi0JYXNfZmF0YWwuCi0JKiBjb25maWcvdGMtc3BhcmMuYzogRG9uJ3QgZGVmaW5lIHRoZW0gYXMgZnVuY3Rpb25zLgotCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSB0YXJnZXQgYWxwaGEtKi1vc2YqLiAgKE5vIGNwdSBmaWxlcyB5ZXQuKQotCi1XZWQgRGVjICAxIDIzOjM3OjE0IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZSAoY2xlYW4pOiBEZXBlbmQgb24gY2xlYW4taGVyZS4KLQotV2VkIERlYyAgMSAxMTozNToyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tZ28zMi5oOiBJbmNsdWRlIGZvcGVuLWJpbi5oLgotCSogYXMuaDogSWYgRk9QRU5fV0IgaXNuJ3QgZGVmaW5lZCwgaW5jbHVkZSBmb3Blbi1zYW1lLmguCi0JKiBvdXRwdXQtZmlsZS5jIChvdXRwdXRfZmlsZV9jcmVhdGUpOiBVc2UgRk9QRU5fV0IgaW5zdGVhZCBvZiAidyIuCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfb3Blbik6IFVzZSBGT1BFTl9SVCBpbnN0ZWFkIG9mICJyIi4KLQkqIGxpc3RpbmcuYyAoZmlsZV9pbmZvKTogVXNlIEZPUEVOX1JCIGluc3RlYWQgb2YgInJiIi4KLQkqIHJlYWQuYyAoc19pbmNsdWRlKTogVXNlIEZPUEVOX1JUIGluc3RlYWQgb2YgInIiLgotCi0JKiBzdGFicy5jOiBJbmNsdWRlIG9ic3RhY2suaC4KLQotCSogdGMuaCAobWRfY3JlYXRlX2xvbmdfanVtcCk6IERvbid0IGRlY2xhcmUgaWYgaXQncyBhbHJlYWR5Ci0JZGVmaW5lZCBhcyBhIG1hY3JvLgotCShtZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBEaXR0by4KLQotCSogbWVzc2FnZXMuYyAoYXNfcGVycm9yKSBbQkZEX0FTU0VNQkxFUl06IFVzZSBiZmRfZXJybXNnIGluc3RlYWQKLQlvZiBzdHJlcnJvci4gIENsZWFyIGJmZF9lcnJvci4KLQotCSogY29uZmlnL3RlLWx5bnguaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLCBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0KLVdlZCBEZWMgIDEgMTA6NDE6NTYgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShwYV9wcm9jZXNzX2V4aXQsIHBhX3Byb2NlbmQpOiBDYWxsIGl0IGZvciBFTEYgb2JqZWN0cy4KLQotV2VkIERlYyAgMSAxMjoxMDo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogU3VidHJhY3QgOCBmcm9tIG9mZnNldCBpbiBub24gUElDIGwuZAotCWNhc2UuICBTZWUgY29tbWVudC4gIEZyb20gd2lsc29uQGN5Z251cy5jb206IGZvciBNX0xfREFCLCBzZXQKLQljb3Byb2MgYmVmb3JlIGRvaW5nIGdvdG8gbGQuCi0KLVR1ZSBOb3YgMzAgMTM6NDA6MzAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHdyaXRlLmMgKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBQcm92aWRlIGEgZGVmYXVsdCBkZWZpbml0aW9uLgotCShmaXh1cF9zZWdtZW50KTogQWxsb3cgdGhlIHRhcmdldCBtYWNoaW5lIHRvIHNwZWNpZnkgdGhhdCBhCi0JcmVsb2NhdGlvbiBtdXN0IGJlIGdlbmVyYXRlZCBmb3IgYSBwYXJ0aWN1bGFyIGZpeHVwLiAgUmVtb3ZlCi0JI2lmbmRlZiBUQ19IUFBBIGhhY2suCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeF8xKTogTmV2ZXIgY2hhbmdlIGZ4X2FkZHN5IHRvCi0JYmUgTlVMTC4gIE9ubHkgZml4dXBfc2VnbWVudCBpcyBzdXBwb3NlZCB0byBkbyB0aGF0LgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBOb3YgMzAgMTE6MjE6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3RhYnMubyk6IEFkZGVkIGRlcGVuZGVuY2llcy4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBEb24ndCBjYWxsIGJmZF9zZXRfc3ltdGFiLgotCi1TdW4gTm92IDI4IDEyOjExOjQwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogT3V0cHV0IGEgVEFCIGJlZm9yZSBhbnkKLQkuYXBwKiBkaXJlY3RpdmUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IE1ha2Ugc3VyZSBhIHN1Yl9zeW1ib2wKLQlleGlzdHMgYmVmb3JlIHRyeWluZyB0byBwZWVrIGF0IGl0cyBuYW1lLgotCShwYV9zcGFjZSk6IERvIG5vdCBjYWxsIHBhX2FsaWduX3N1YnNlZy4gIFNlZSBocHBhL3Vuc29ydGVkL2FsaWduMy5zCi0JZm9yIHRlc3RjYXNlLgotCShwYV9hbGlnbl9zdWJzZWcpOiBEZWxldGUgdW51c2VkL3Vud2FudGVkIGZ1bmN0aW9uLgotCi1TYXQgTm92IDI3IDIyOjQ5OjA3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEZpeCB0ZXN0IGZvciB3aGVuIHRvIHN0aWNrIGEgY29sb24KLQlvbiB0aGUgZW5kIG9mIGEgbGFiZWwuICBNYWtlIGNvZGUgY29uZGl0aW9uYWwgb24gZWl0aGVyIE1SSSBvcgotCUxBQkVMU19XSVRIT1VUX0NPTE9OUy4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IElmIGEgbGluZSBiZWdpbnMgd2l0aCB3aGl0ZXNwYWNlLCBsZWF2ZQotCXRoZSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgYWxvbmUuICBFYXQgYWxsIG90aGVycy4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoTEFCRUxTX1dJVEhPVVRfQ09MT05TKTogRGVmaW5lLgotCi1XZWQgTm92IDI0IDAxOjIyOjU0IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wcm9jZW5kKTogRG8gbm90IGNhbGwgcHJvY2Vzc19leGl0LgotCShleGl0X3Byb2Nlc3NpbmdfY29tcGxldGUpOiBEZWxldGUgdW53YW50ZWQgdmFyaWFibGUgYW5kIGFsbAotCXJlZmVyZW5jZXMuCi0KLVdlZCBOb3YgMjQgMDI6MzE6MzggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zZXR1cF9leHQpOiBSZW5hbWVkIGZyb20gZWNvZmZfYnVpbGRfZXh0LgotCUNoYW5nZWQgdG8gbm90IGFjdHVhbGx5IGJ1aWxkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24sIGFzCi0JdGhhdCBpcyBub3cgZG9uZSBieSB0aGUgRUNPRkYgYmFjayBlbmQuCi0JKGVjb2ZmX2J1aWxkX2RlYnVnKTogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQkqIGVjb2ZmLmggKG9ial9lY29mZl9zZXRfZXh0KTogRGVjbGFyZS4gICBvYmotZm9ybWF0LmMgZnVuY3Rpb24KLQljYWxsZWQgYnkgZWNvZmZfc2V0dXBfZXh0LgotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBJZiBkZWJ1Z19pbmZvIGNvdW50IGlzIDAsCi0Jc2V0IGNvcnJlc3BvbmRpbmcgcG9pbnRlciB0byBOVUxMLiAgRG9uJ3Qgc2V0IHJhd19zaXplIGFuZAotCXJhd19zeW1lbnRzLgotCShvYmpfZWNvZmZfc2V0X3N5bV9pbmRleCk6IFJlbW92ZWQuCi0JKG9ial9lY29mZl9zZXRfZXh0KTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1lY29mZi5oIChvYmpfc2V0X3N5bV9pbmRleCk6IERvbid0IGRlZmluZS4KLQkob2JqX2Vjb2ZmX3NldF9zeW1faW5kZXgpOiBEb24ndCBkZWNsYXJlLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2Vjb2ZmX3NldF9leHQsIGVsZl9nZXRfZXh0ciwKLQllbGZfc2V0X2luZGV4KTogTmV3IGZ1bmN0aW9ucyB1c2VkIGZvciBFQ09GRl9ERUJVR0dJTkcuCi0JKGVsZl9mcm9iX2ZpbGUpOiBSZXdvcmtlZCBFQ09GRiBkZWJ1ZyBnZW5lcmF0aW9uIHRvIHVzZQotCW5ldyBmdW5jdGlvbnMgaW4gYmZkL2Vjb2ZmbGluay5jLgotCi1TdW4gTm92IDIxIDIzOjU0OjUyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9kZWZfc3Vic3BhY2VzKTogT25seSBjcmVhdGUgdGhlIHVud2luZAotCXN1YnNwYWNlIGZvciBFTEYuICBJbiB0aGUgU09NIHdvcmxkLCB0aGUgbGlua2VyIGlzIHJlc3BvbnNpYmxlCi0JZm9yIGNyZWF0aW5nIHRoZSB1bndpbmQgc3Vic3BhY2VzLgotCi1GcmkgTm92IDE5IDE2OjI1OjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IFVzZSBQQVJBTVMgcmF0aGVyIHRoYW4gRVhGVU4uCi0JKHlhbmtfc3ltYm9scyk6IERvbid0IGNhbGwgU19TRVRfRVhURVJOQUwgaWYgdGhlIHN0b3JhZ2UgY2xhc3MgaXMKLQlhbHJlYWR5IHNldC4gIEZpeGVzIC5kZWYgdmFyOyAudmFsIGV4dGVybmFsX3ZhcjsgLnNjbCAzOyAuZW5kZWYuCi0JKGFkanVzdF9zdGFiX3NlY3Rpb24pOiBNYWtlIHN0YXRpYy4gIERlY2xhcmUgcmV0dXJuIHR5cGUuICBSZW1vdmUKLQl1bnVzZWQgdmFyaWFibGVzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oOiBEZWNsYXJlIHRjX2NvZmZfZml4MnJ0eXBlIGFuZAotCXRjX2NvZmZfc2l6ZW1hY2hkZXAuCi0KLUZyaSBOb3YgMTkgMDQ6MzM6NTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERpc2FibGUgb2JqX2NoZWNrX2ZpbGVfc3ltYm9scwotCWhvb2s7IG9ubHkgYmFjayBlbmQgdXNpbmcgaXQgd2Fzbid0IHVzaW5nIGl0IGNvcnJlY3RseS4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBBbHdheXMgY2FsbCBvYmpfZnJvYl9zeW1ib2wgYW5kCi0JdGNfZnJvYl9zeW1ib2w7IGFsd2F5cyByZXRhaW4gc3ltYm9sIGlmIGl0J3MgdXNlZCBieSBhIHJlbG9jYXRpb24sCi0JcmVnYXJkbGVzcyBvZiB3aGF0IHRoZXNlIHJvdXRpbmVzIGluZGljYXRlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBSZW5hbWVkIGZyb20KLQljb2ZmX2NoZWNrX2ZpbGVfc3ltYm9scy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfY2hlY2tfZmlsZV9zeW1ib2xzKTogRGVsZXRlZC4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IERlY2xhcmUuCi0JKG9ial9mcm9iX3N5bWJvbCk6IENhbGwgaXQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY3Jhd2xfc3ltYm9sX2NoYWluLCBvYmpfZW1pdF9zdHJpbmdzLAotCW9ial9wcmVfd3JpdGVfaG9vayk6IERvbid0IGRlZmluZSBmb3IgQkZEX0FTU0VNQkxFUi4KLQkoY19zZWN0aW9uX2hlYWRlcik6IERpdHRvLiAgRGVsZXRlIHN1cGVyZmx1b3VzIHJldHVybiBhdCBlbmQgb2YKLQlmdW5jdGlvbi4KLQotCSogY29uZmlnL29iai1jb2ZmLmggW1RDX1NQQVJDXTogSW5jbHVkZSBjb2ZmL3NwYXJjLmgsIGFuZCBzcGVjaWZ5Ci0JY29mZi1zcGFyYy1seW54LgotCShTQV9HRVRfU1lNX1RBR05EWCk6IFVzZSBCRkRfSEVBREVSUyB2ZXJzaW9uIGZvciBCRkRfQVNTRU1CTEVSCi0JdG9vLgotCShjX3NlY3Rpb25faGVhZGVyKTogUmV3cml0ZSBwcm90b3R5cGUgc28gdGhhdCBpdCBjb250YWlucyBubwotCXByZXByb2Nlc3NpbmcgZGlyZWN0aXZlcy4gIERvbid0IGRlY2xhcmUgaXQgYXQgYWxsIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQotCSogY29uZmlndXJlLmluIChzcGFyYyotKi1seW54b3MpOiBOZXcgdGFyZ2V0LCB1c2luZyBjb2ZmIGFuZAotCUJGRF9BU1NFTUJMRVIuCi0KLQkqIHN0YWJzLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUywgT0JKUyk6IExpc3QgaXQuCi0JKiByZWFkLmMgKFNUQUJfU0VDVElPTl9OQU1FLCBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUsCi0JZ2V0X3N0YWJfc3RyaW5nX29mZnNldCwgc19zdGFiX2dlbmVyaWMsIHNfc3RhYiwgc194c3RhYiwgc19kZXNjKToKLQlNb3ZlZCB0byBuZXcgZmlsZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBjb2ZmIGZpbGVzIGxpa2UgZWxmCi0JZmlsZXMuCi0KLVdlZCBOb3YgMTcgMTc6MjM6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1pcml4NSopOiBOZXcgdGFyZ2V0LiAgVXNlIGVsZiBhbmQgbWlwcy1iaWcuCi0JKiBjb25maWcvb2JqLWVsZi5jOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGluY2x1ZGUgZWNvZmYuaC4KLQkob2JqX3BzZXVkb190YWJsZSk6IElmIEVDT0ZGX0RFQlVHR0lORywgZGVmaW5lIEVDT0ZGCi0JcHNldWRvLW9wcy4KLQkob2JqX3JlYWRfYmVnaW5faG9vayk6IElmIEVDT0ZGX0RFQlVHR0lORywgY2FsbAotCWVjb2ZmX3JlYWRfYmVnaW5faG9vay4KLQkob2JqX3N5bWJvbF9uZXdfaG9vayk6IElmIEVDT0ZGX0RFQlVHR0lORywgY2FsbAotCWVjb2ZmX3N5bWJvbF9uZXdfaG9vay4KLQkob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IENhc3QgYWxsb2NhIHJlc3VsdC4KLQkoZWxmX2Zyb2JfZmlsZSk6IElmIEVDT0ZGX0RFQlVHR0lORywgZmluaXNoIHVwIEVDT0ZGIGRlYnVnZ2luZwotCWluZm9ybWF0aW9uIGFuZCB3cml0ZSBpdCBvdXQgaW50byAubWRlYnVnIHNlY3Rpb24uCi0JKiBjb25maWcvb2JqLWVsZi5oIChFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBOZXcgbWFjcm8uCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTKTogVXNlIEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUy4KLQkoRUNPRkZfREVCVUdHSU5HKTogRGVmaW5lIGlmIFRDX01JUFMuCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTKTogSWYgRUNPRkZfREVCVUdHSU5HLCBvdmVycmlkZSB0byBhZGQKLQlmaWVsZHMgcmVxdWlyZWQgYnkgRUNPRkYuCi0JKiBjb25maWcvdGMtbWlwcy5jOiBDaGVjayBFQ09GRl9ERUJVR0dJTkcgcmF0aGVyIHRoYW4KLQlPQkpfRUNPRkYgaW4gbWFueSBjYXNlcy4KLQkobWlwc19hbnlfbm9yZW9yZGVyKTogTmV3IHZhcmlhYmxlLgotCShtaXBzX2NwcmVzdG9yZV9vZmZzZXQpOiBJbml0aWFsaXplIHRvIC0xLgotCShtaXBzX2ZyYW1lX3JlZyk6IE5ldyB2YXJpYWJsZS4KLQkoUkVMQVhfRU5DT0RFLCBSRUxBWF9PTEQsIFJFTEFYX05FVywgUkVMQVhfUkVMT0MxLAotCVJFTEFYX1JFTE9DMiwgUkVMQVhfUkVMT0MzLCBSRUxBWF9XQVJOKTogTmV3IG1hY3Jvcy4KLQkobWRfcHNldWRvX3RhYmxlKTogSGFuZGxlICJncHdvcmQiIGFuZCAiY3BhZGQiLgotCShtZF9iZWdpbik6IEluaXRpYWxpemUgb2sgdG8gZmFsc2UuICBJZiBPQkpfRUxGLCBzZXQgYWxpZ25tZW50Ci0Jb2YgdGV4dCwgZGF0YSBhbmQgYnNzIHNlY3Rpb25zIHRvIDQuICBTZXQgYWxpZ25tZW50IG9mCi0JLnJlZ2luZm8gc2VjdGlvbiB0byAyLiAgSWYgRUNPRkZfREVCVUdHSU5HLCBjcmVhdGUgLm1kZWJ1ZwotCXNlY3Rpb24uCi0JKEFMSUdOX0VSUiwgQUxJR05fRVJSMik6IFJlbW92ZWQgdW51c2VkIGFuZCB1c2VsZXNzIGFsaWdubWVudAotCWNoZWNrLgotCShhcHBlbmRfaW5zbiwgbWFjcm9fYnVpbGQsIG1hY3JvX2J1aWxkX2x1aSk6IFRha2UgcGxhY2UKLQlhcmd1bWVudC4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKGFwcGVuZF9pbnNuKTogSWYgYXBwZW5kaW5nIGEgbm9wLCBkb24ndCBlbWl0IG9uZS4KLQkobWFjcm9fYnVpbGQpOiBDaGFuZ2VkIGFzc2VydGlvbiBmb3IgJ2knLCAnaicsICdvJyBjYXNlLgotCShncF9yZWZlcmVuY2UpOiBSZW1vdmVkLgotCShsb2FkX2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uCi0JKG1hY3JvKTogSWYgbWlwc19ub3Jlb3JkZXIgaXMgdXNlZCwgc2V0IG1pcHNfYW55X25vcmVvcmRlci4KLQlFeHRlbnNpdmUgY2hhbmdlcyB0byBoYW5kbGUgR1AgYW5kIFBJQyBzeW1ib2xzIGRpZmZlcmVudGx5LgotCUJ1aWxkIGJvdGggcG9zc2libGUgY29kZSBjaG9pY2VzIHVzaW5nIGEgdmFyaWFudCBmcmFnLCBhbmQKLQltYWtlIGEgZmluYWwgZGVjaXNpb24gYXQgdGhlIGVuZCBvZiBhc3NlbWJseSB3aGVuIGFsbAotCWluZm9ybWF0aW9uIGlzIGtub3duLiAgQWRkZWQgUElDIHN1cHBvcnQgZm9yIGFsbCBzeW1ib2wKLQlyZWZlcmVuY2VzLgotCShtaXBzX2lwKTogRG9uJ3QgcGVybWl0IGFueXRoaW5nIGJ1dCBhIG51bWJlciBhZnRlciAkIGZvciBhCi0JY29wcm9jZXNzb3IgcmVnaXN0ZXIuICBEb24ndCB1c2UgLmxpdDQgb3IgLmxpdDggc2VjdGlvbnMgd2hlbgotCWdlbmVyYXRpbmcgUElDIGNvZGUuICBJZiBPQkpfRUxGLCBzZXQgYWxpZ25tZW50IG9mIC5saXQ0IG9yCi0JLmxpdDggc2VjdGlvbiB0byA0LgotCShtZF9hcHBseV9maXgpOiBBY2NlcHQgYW5kIGlnbm9yZSBHT1QxNiBhbmQgR1BSRUwzMiByZWxvY3MuCi0JKHNfY2hhbmdlX3NlYyk6IFNldCBhbGlnbm1lbnQgb2YgRUxGIC5yb2RhdGEgb3IgLnNkYXRhIHNlY3Rpb24KLQl0byA0LgotCShzX21pcHNzZXQpOiBJZiAuc2V0IG5vcmVvcmRlciwgc2V0IG1pcHNfYW55X25vcmVvcmRlci4KLQkoc19jcGxvYWQpOiBJZ25vcmUgLmNwbG9hZCBpZiBub3QgZ2VuZXJhdGluZyBQSUMgY29kZS4gIFdhcm4KLQlpZiAuY3Bsb2FkIGlzIG5vdCBpbiBub3Jlb3JkZXIgc2VjdGlvbi4KLQkoc19jcHJlc3RvcmUpOiBJZ25vcmUgLmNwcmVzdG9yZSBpZiBub3QgZ2VuZXJhdGluZyBQSUMgY29kZS4KLQkoc19ncHdvcmQsIHNfY3BhZGQpOiBOZXcgZnVuY3Rpb25zLgotCSh0Y19nZXRfcmVnaXN0ZXIpOiBBZGRlZCBmcmFtZSBhcmd1bWVudDsgaWYgdHJ1ZSwgc2V0Ci0JbWlwc19mcmFtZV9yZWcgdG8gcmV0dXJuIHZhbHVlLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBEb24ndCBlcnJvciBvdXQsIGJ1dCBpbnN0ZWFkCi0JZGV0ZXJtaW5lIGhvdyBtdWNoIGEgZnJhZyBzaG91bGQgZ3Jvdy4KLQkodGNfZ2VuX3JlbG9jKTogUmV0dXJuIG11bHRpcGxlIHJlbG9jcyBpZiBhcHByb3ByaWF0ZSwgYXMKLQlkZXRlcm1pbmVkIGJ5IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LgotCShtZF9jb252ZXJ0X2ZyYWcpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBTZXQgRUxGIGhlYWRlciBmbGFncyBiYXNlZCBvbgotCW1pcHNfYW55X25vcmVvcmRlciBhbmQgbWlwc19waWMuCi0JKiBjb25maWcvdGMtbWlwcy5oIChSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUpOiBEZWZpbmUuCi0JKE1BWF9SRUxPQ19FWFBBTlNJT04pOiBEZWZpbmUgdG8gYmUgMy4KLQkobWRfcmVsYXhfZnJhZyk6IERlZmluZSB0byBiZSAwLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBEb24ndCBkZWZpbmUuCi0JKHRjX2dldF9yZWdpc3Rlcik6IENoYW5nZWQgZGVjbGFyYXRpb24uCi0KLQkqIGVjb2ZmLmgsIGVjb2ZmLmM6IE5ldyBmaWxlcyBwdWxsZWQgb3V0IG9mIGNvbmZpZy9vYmotZWNvZmYuYyB0bwotCXN1cHBvcnQgZ2VuZXJhdGluZyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIE1JUFMgRUxGCi0JdGFyZ2V0cy4gIENvbXBpbGVkIG9ubHkgaWYgRUNPRkZfREVCVUdHSU5HIGlzIGRlZmluZWQuICBDaGFuZ2VkCi0JaGFuZGxpbmcgb2YgZXh0ZXJuYWwgc3ltYm9sczogaXQgbm93IGFsd2F5cyBnZW5lcmF0ZXMgZXhhY3RseQotCXRob3NlIGV4dGVybmFsIHN5bWJvbHMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIHN5bWJvbCBsaXN0LgotCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUyk6IEFkZGVkIGVjb2ZmLmMuCi0JKFJFQUxfSEVBREVSUyk6IEFkZGVkIGVjb2ZmLmguCi0JKE9CSlMpOiBBZGRlZCBlY29mZi5vLgotCShlY29mZi5vKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYzogQWxtb3N0IGVudGlyZWx5IG1vdmVkIGludG8gZWNvZmYuYy4KLQlSZW1haW5pbmcgY29kZSBtb3N0bHkganVzdCBjYWxscyBlY29mZi5jIGNvZGUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmg6IERlZmluZSBFQ09GRl9ERUJVR0dJTkcuCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTKTogTWFrZSBlY29mZl9zeW1ib2wgYSBwb2ludGVyIHRvIGEKLQlzdHJ1Y3QgbG9jYWxzeW0uCi0JKG9ial9yZWFkX2JlZ2luX2hvb2ssIG9ial9zeW1ib2xfbmV3X2hvb2spOiBEZWZpbmUgdG8gY2FsbAotCWZ1bmN0aW9ucyBpbiBlY29mZi5jLgotCShlY29mZl9zdGFiKTogRG9uJ3QgZGVjbGFyZSAobm93IGRlY2xhcmVkIGluIGVjb2ZmLmgpLgotCShvYmpfc2V0X3N5bV9pbmRleCk6IERlZmluZS4KLQkob2JqX2Vjb2ZmX3NldF9zeW1faW5kZXgpOiBEZWNsYXJlLgotCi0JKiBmcmFncy5oIChmcmFnX2dyb3cpOiBEZWNsYXJlLgotCSogZnJhZ3MuYyAoZnJhZ19ncm93KTogTWFkZSBub24tc3RhdGljLgotCi0JKiB3cml0ZS5jIChpc19kbnJhbmdlKTogRG8gbm90IGRlZmluZSBpZiBtZF9yZWxheF9mcmFnIGlzIGRlZmluZWQuCi0JKHJlbGF4X3NlZ21lbnQpOiBJZiBtZF9yZWxheF9mcmFnIGlzIGRlZmluZWQsIHVzZSBpdCB0byBoYW5kbGUgYQotCWZyYWcgb2YgdHlwZSByc19tYWNoaW5lX2RlcGVuZGVudCByYXRoZXIgdGhhbiBsb29raW5nIHRocm91Z2gKLQltZF9yZWxheF90YWJsZS4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJZiB3ZSBmaW5kIGEgYmFkIHBzZXVkby1vcCwKLQlkbyBhIGNvbnRpbnVlIHRvIGdvIG9uIHRvIHRoZSBuZXh0IGxpbmUgcmF0aGVyIHRoYW4gYSBicmVhay4KLQlSZW1vdmVkIGR1cGxpY2F0ZSBiYWQgcHNldWRvLW9wIGNvZGUgd2hpY2ggd2FzIG5ldmVyIGV4ZWN1dGVkLgotCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBEbyBub3QgcmVxdWlyZSBhIGNvbW1hIGFmdGVyIHRoZSBuYW1lLgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogQ2hhbmdlZCBoYWRvbmUgZmllbGQgdG8gYml0ZmllbGQuCi0JQWRkZWQgYnNzIGJpdGZpZWxkLgotCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogU2V0IGJzcyBmbGFnIGZvciBic3Nfc2VjdGlvbi4KLQkqIHJlYWQuYyAoc19sY29tbSk6IFNldCBic3MgZmxhZyBmb3IgLnNic3Mgc2VjdGlvbiBpZiB1c2VkLgotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogRG9uJ3Qgc2V0IFNFQ19IQVNfQ09OVEVOVFMgZm9yIGEKLQlic3Mgc2VjdGlvbi4gIFNldCBTRUNfUkVMT0MgaWYgdGhlcmUgYXJlIGFueSByZWxvY2F0aW9ucywgZXZlbiBmb3IKLQlhIHplcm8gc2l6ZSBzZWN0aW9uLgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBJbiBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUgY2FzZSwgYmFzZQotCWRhdGEgb2Zmc2V0IG9uIHJlbG9jWzBdLT5hZGRyZXNzIHJhdGhlciB0aGFuIHJlbG9jW2pdLT5hZGRyZXNzLCBzbwotCXRoYXQgbXVsdGlwbGUgcmVsb2NzIGNhbiBhZmZlY3QgZGlmZmVyZW50IG1lbW9yeSBsb2NhdGlvbnMuCi0KLQkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyLCByZWxheF9hbmRfc2l6ZV9zZWcsCi0JYWRqdXN0X3JlbG9jX3N5bXMsIHdyaXRlX3JlbG9jcyk6IE1ha2UgdGhpcmQgYXJndW1lbnQgUFRSLCBub3QKLQljaGFyICosIHRvIG1hdGNoIGRlZmluaXRpb24gb2YgYmZkX21hcF9vdmVyX3NlY3Rpb25zLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogRG9uJ3QgaW50ZXJwcmV0IGEgY29tbWVudCBjaGFyYWN0ZXIKLQlhcyBzdGFydGluZyBhIENQUCBsaW5lIGRpcmVjdGl2ZSB1bmxlc3MgaXQgaXMgYSAnIycgYW5kIGlzIHRoZQotCXZlcnkgZmlyc3QgY2hhcmFjdGVycyBvbiB0aGUgbGluZSAoaS5lLiwgZG8gbm90IHBlcm1pdCBsZWFkaW5nCi0Jd2hpdGVzcGFjZSkuCi0KLQkqIG1lc3NhZ2VzLmMgKGlkZW50aWZ5KTogTWFrZSBmaWxlIGFyZ3VtZW50IG5vbi1jb25zdCwgdG8gbWF0Y2gKLQljYWxsZXJzLgotCi1UdWUgTm92IDE2IDIwOjM4OjIxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEZpeCB0aGlua28gaW4gMjFiaXQgcmFuZ2UgY2hlY2suCi0KLVNhdCBOb3YgMTMgMTg6MjI6NDggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2FwcGx5X2ZpeCk6IENvcGUgd2l0aCBJTU0xNiB0eXBlIHRvby4KLQkqIGNvbmZpZy90Yy16OGsuYyAoYnVpbGRfYnl0ZXMsIG1kX2FwcGx5X2ZpeCk6IFVuZGVyc3RhbmQgbkRJU1A3Ci0JcmVsb2NzLgotCi1GcmkgTm92IDEyIDE2OjUxOjQ3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5bY2hdOiBGaXggYXNzb3J0ZWQgdHJpdmlhbCBpbmRlbnRpb24gcHJvYmxlbXMuCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX3ZlcnNpb24pOiBBZGQgbWlzc2luZyAnOycuCi0JKHNvbV9mcm9iX2ZpbGUpOiBEZWxldGUgd2hpdGVzcGFjZSBhdCBFT0wuCi0KLUZyaSBOb3YgMTIgMTU6MjY6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCBmb2xsb3dpbmcgMi4yIHJlbGVhc2UuCi0KLUZyaSBOb3YgMTIgMTQ6NTI6MTcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X3N0cnVjdCk6IFVzZSBhIHJlYWwgdHlwZSBmb3IgdGhlCi0JZmllbGQgc2VsZWN0b3IsIHJhdGhlciB0aGFuIGFuIGludC4gIEFsbCB1c2VzIG9mIGZpZWxkIHNlbGVjdG9ycwotCWZpeGVkLgotCSh0Y19nZW5fcmVsb2MpOiBGb3IgU09NIFBMQUJFTHMsIGFsd2F5cyBzZXQgYWRkZW5kIHRvIHplcm8gZm9yIG5vdy4KLQkobWRfYXBwbHlfZml4XzEpOiBEbyBub3QgY2FsbCBocHBhX2ZpZWxkX2FkanVzdCBmb3IgYW55IFBMQUJFTAotCWZpZWxkLgotCi0JVGh1IE5vdiAxMSAxNTo0OTowOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfdHlwZV9hcmdzKTogRm9yIC5pbXBvcnQgc3RhdGVtZW50cywKLQlzaWxlbnRseSBpZ25vcmUgYXR0ZW1wdCB0byBjaGFuZ2UgdGhlIHN5bWJvbCB0eXBlIGZvciBhIGZ1bmN0aW9uCi0JZnJvbSBTVF9FTlRSWSB0byBTVF9DT0RFIG9uIC5pbXBvcnQuCi0KLVdlZCBOb3YgMTAgMTY6MTk6MTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5oIChmaXhTKTogUmVuYW1lIGZ4X2NhbGxqIGZpZWxkIHRvIGZ4X3RjYml0LgotCSogd3JpdGUuYywgY29uZmlnL29iai1jb2ZmLmMsIGNvbmZpZy9vYmotY29mZmJmZC5jLAotCWNvbmZpZy90Yy1pOTYwLmM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVHVlIE5vdiAgOSAwMDo0OTowMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERlbGV0ZSBjb25maWctc3RhbXAgYW5kIGNvbmZpZy5oCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGV2YWx1YXRlX2Fic29sdXRlKTogQXZvaWQgcmVseWluZyBvbgotCUFOU0ktQyBmZWF0dXJlcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfdHlwZV9hcmdzKTogUmVuYW1lZCBmcm9tIHBhX2V4cG9ydF9hcmdzLgotCUFjY2VwdCBuZXcgYXJndW1lbnQgImlzX2V4cG9ydCIuICBBbGwgY2FsbGVycyBjaGFuZ2VkLiAgV2hlbgotCXByb2Nlc3NpbmcgYSAuZXhwb3J0IGRpcmVjdGl2ZSBmb3IgYSBmdW5jdGlvbiwgZG8gbm90IGFsbG93Ci0JdGhlIHVzZXIgdG8gc2V0IHRoZSB0eXBlIHRvICJDT0RFIiwgaW5zdGVhZCB3YXJuIGFuZCBzZXQgdGhlCi0JdHlwZSB0byAiRU5UUlkiLgotCi1Nb24gTm92ICA4IDEyOjA1OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCwgcHJpbnRJbnNuKTogSGFuZGxlICdrJyAoZnJvbSBUZWQKLQlMZW1vbiA8bWVsbG9uQHBlcHBlci5uY2QuY29tPikuCi0JKG1pcHNfaXApOiBQZXJtaXQgb2RkIG51bWJlcmVkIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBpZiAtbWlwczMuCi0JKG1hY3JvKTogVXNlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwgcmVsb2NhdGlvbiBmb3IgTV9MSV9TUy4KLQotTW9uIE5vdiAgOCAwNzo0NTowMSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBoODMwMGgsIHdlIGhhdmUgbXVsdGlsaWIgbm93LgotCi1Nb24gTm92ICA4IDA2OjA5OjE4IDE5OTMgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3VwcG9ydCBnZW5lcmljIG5ldHdhcmUgYXMgYmVpbmcgRUxGIGZvcm1hdC4KLQkJCVJlY29nbmlzZSB1bml4d2FyZSBpZiB0aGUgdXNlciBzdXBwbGllcyBpdC4KLQotU3VuIE5vdiAgNyAwMTowMjowOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogRmlyc3QgY3V0IGF0IGNsZWFuaW5nIHVwIFBBIGluc3RydWN0aW9uIHBhcnNpbmcuCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbik6IEFjY2VwdCBwb2ludGVyIHRvCi0JaW5zbiBzdHJ1Y3R1cmUgYXMgYW4gYXJndW1lbnQsIGFuZCBhIHBvaW50ZXIgdG8gYSBzdHJpbmcuICBBbGwKLQljYWxsZXJzIGNoYW5nZWQuICBBbHdheXMgcmVhZCBhbnkgZmllbGQgc2VsZWN0b3IgaGVyZS4gIENhbGwKLQlldmFsdWF0ZSBhYnNvbHV0ZSB0byBnZXQgYSByZXR1cm4gdmFsdWUuCi0JKGV2YWx1YXRlX2Fic29sdXRlKTogQWRkZXB0IHBvaW50ZXIgdG8gaW5zbiBzdHJ1Y3R1cmUgYXMgaXRzCi0JYXJndW1lbnQuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFKTogTmV3IG1hY3JvIGZvciBpbnNlcnRpbmcgYSBiaXRmaWVsZAotCWludG8gYW4gaW5zdHJ1Y3Rpb24gYW5kIGNvbnRpbnVpbmcgdGhlIG1haW4gcGFfaXAgbG9vcC4KLQkoQ0hFQ0tfRklFTEQpOiBOZXcgbWFjcm8gZm9yIHNpbXBsZSByYW5nZSBjaGVja2luZyBvZiBmaWVsZHMuCi0JKHBhX2lwKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMuICBVc2UgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRQotCWFuZCBDSEVDS19GSUVMRC4gIEFsbCBpbW1lZGlhdGUgZmllbGRzIG5vdyBwYXNzIHRocm91Z2gKLQlwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiB3aGljaCB3aWxsIGFsc28gaGFuZGxlIGZpZWxkIHNlbGVjdG9ycy4KLQlEZWxldGUgZGVhZCBjb2RlLiAgU2ltcGxpZnkuCi0JKG1kX2FwcGx5X2ZpeF8xKTogVXNlIENIRUNLX0ZJRUxEIHRvIHZlcmlmeSBhbnkgZml4ZXMgdGhhdCBhcmUKLQlhcHBsaWVkIGFyZSBpbiByYW5nZS4gIFVzZSBiZmRfcHV0XzMyIHJhdGhlciB0aGFuIGluc2VydGluZyBlYWNoCi0JYnl0ZSBvZiB0aGUgZml4ZWQgaW5zdHJ1dGlvbiBpbnRvIHRoZSBidWZmZXIgb3Vyc2VsdmVzLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRGVsZXRlIHtTRUcsR0xPQkFMfV9ESUZGX0FMTE9XRUQgY29kZSwKLQlpdCB3YXMgUEEgc3BlY2lmaWMgYW5kIGlzIG5vIGxvbmdlciBuZWVkZWQgKGl0J3Mgbm93IGhhbmRsZWQKLQl3aXRoaW4gdGhlIFBBIGJhY2tlbmQpLgotCSogY29uZmlnL3RjLWhwcGEuaCAoU0VHX0RJRkZfQUxMT1dFRCk6IERlbGV0ZSBkZWZpbml0aW9uLgotCSogY29uZmlnL3RjLWhwcGEuYyAoZml4X25ld19ocHBhKTogSWYgdGhlIHN1YnRyYWN0IHN5bWJvbCBmb3IKLQlhIGZpeHVwIGlzICRnbG9iYWwkIGNoYW5nZSBpdCB0byBOVUxMIGFzICRnbG9iYWwkIGlzIHJlYWxseSBvbmx5Ci0JbmVlZGVkIGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB0aGUgYmFzZSB0eXBlIG9mIHJlbG9jYXRpb24gdG8gdXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChjcmVhdGVfbmV3X3N1YnNwYWNlKTogSW5pdGlhbGl6ZSBzdWJzcGFjZV9kZWZpbmVkLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYS1pcCwgY2FzZSAneicpOiBNYWtlIGZpZWxkIHNlbGVjdG9ycyB3b3JrCi0JZm9yICd6JyBvcGVyYW5kcyAodGFyZ2V0IG9mIGJsZSBicmFuY2gpLgotCi1TYXQgTm92ICA2IDIyOjQxOjU3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiAodXBkYXRlX3N1YnNwYWNlKTogRml4IHR5cGUgYW5kIG5hbWUgb2YgbGFzdAotCXBhcmFtZXRlci4gIEFsbCBjYWxsZXJzIGZpeGVkLgotCShtZF9iZWdpbiwgcGFfY2hrX2ZpZWxkX3NlbGVjdG9yLCBwYV9lbnRyeSk6IExpbnQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGNvbnNfZml4X25ld19ocHBhKTogUmVzZXQgZmllbGQgc2VsZWN0b3IKLQl0byBkZWZhdWx0IHN0YXRlIGFmdGVyIGl0J3MgYmVlbiB1c2VkLgotCi1GcmkgTm92ICA1IDEyOjA4OjIxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uKTogQ2hhbmdlCi0Jc3BhY2Uvc3Vic3BhY2Ugc29ydCBrZXlzIGZvciB0aGUgc3RhYiBzZWN0aW9ucyBzbyBhcyB0byBhdm9pZAotCWJ1Z3MgaW4gdGhlIGhwIGxpbmtlciBhbmQgcHhkYi4KLQotVGh1IE5vdiAgNCAxNzowMDowNSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogd3JpdGUuYyAoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIpOiBVcGRhdGUgcG9pbnRlciB0byBsYXN0Ci0JZnJhZyBmb3IgYSBzZWdtZW50IGluIHRoZSBzZWdpbmZvIHN0cnVjdHVyZS4KLQotVGh1IE5vdiAwNCAwOTowOTozNSAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiAgTWFrZWZpbGUuaW46IENoYW5nZWQgUlVOVEVTVEZMQUdTIHRvIFJVTlRFU1RfRkxBR1MKLQotV2VkIE5vdiAgMyAxMjoxNjoyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEhhbmRsZSBjb252ZXJzaW9uIG9mIHN1YnRyYWN0aW9uIHRvCi0JcGMtcmVsYXRpdmUgYWRkcmVzc2luZyBldmVuIGlmIHBjLXJlbGF0aXZlIGZsYWcgaXMgYWxyZWFkeSBzZXQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXBfb3ApOiBVc2Ugc3RyY2hyLCBub3QgaW5kZXguICBEb24ndAotCWRlY2xhcmUgZWl0aGVyLgotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERlbGV0ZSBpbnRlcm1lZGlhdGUgZmlsZXMgZnJvbSBkdmkKLQlidWlsZCwgYnV0IG5vdCB0aGUgZHZpIG9yIGluZm8gZmlsZXMuCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4taGVyZSk6IE5ldyB0YXJnZXQ7IGNsZWFucyB1cCBjdXJyZW50Ci0JZGlyZWN0b3J5IG9ubHkuCi0JKGRpc3RjbGVhbik6IFVzZSBpdCBpbnN0ZWFkIG9mIGNsZWFuLgotCi0JKiByZWFkLmMgKHNfeHN0YWIpOiBEb24ndCB1c2UgYWxsb2NhLgotCi0JKiBtZXNzYWdlcy5jIChpZGVudGlmeSk6IE5ldyByb3V0aW5lOyBwcmludCBtZXNzYWdlIGlkZW50aWZ5aW5nCi0JZm9sbG93aW5nIG1lc3NhZ2VzIGFzIGNvbWluZyBmcm9tIGFzc2VtYmxlci4KLQkoYXNfc2hvd193aGVyZSwgYXNfYmFkX2ludGVybmFsLCBhc19iYWRfd2hlcmUpOiBDYWxsIGl0LgotCShhc19mYXRhbCk6IERvbid0IG5lZWQgdG8gaWRlbnRpZnkgcHJvZ3JhbSBhbnkgbW9yZS4KLQotVHVlIE5vdiAgMiAxODowNDoxMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gcmVsb2Mgc3dpdGNoLgotCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBQdXQgc21hbGwgb2JqZWN0cyBpbiAuc2JzcyBmb3IgTUlQUyBFTEYgYXMKLQl3ZWxsIGFzIE1JUFMgRUNPRkYuCi0JKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGFsaWduZWQuCi0KLVR1ZSBOb3YgIDIgMTU6MDc6MDcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHRjLWhwcGEuYzogQWRkICVkcCBhbmQgJXJwIGFzIHN5bm9ueW1zIGZvciAlcjI3IGFuZCAlcjIgaW4gdGhlCi0JcHJlZGVmaW5lZCByZWdpc3RlciB0YWJsZS4KLQkocGFfcGFyc2VfbnVtYmVyKTogSGFuZGxlICVycCBpbiBjb21tb24gcmVnaXN0ZXIgc2hvcnRjdXQgY29kZS4KLQlDb25zaXN0ZW50bHkgc2V0IHJldHVybiB2YWx1ZSB0byAtMSBmb3IgYW4gZXJyb3IuICBDbGVhbiB1cCBlcnJvcgotCW1lc3NhZ2VzIGFuZCBvbmx5IHByaW50IHRoZW0gd2hlbiAicHJpbnRfZXJyb3JzIiBpcyB0cnVlLiAgSGFuZGxlCi0JZW1wdHkgc3RyaW5nIGNhc2UgbGlrZSB0aGUgSFAgYXNzZW1ibGVyIC0tIGFzc3VtZSBhIHZhbHVlIG9mCi0JemVyby4KLQotCSogY29uZmlnL2hvLWhwdXguaDogRG8gbm90IGluY2x1ZGUgaG8tc3lzdi5oLiAgSW5zdGVhZCBpbmNsdWRlCi0Jc3RhbmRhcmQgaHB1eCBpbmNsdWRlIGZpbGVzIHRvIHBpY2sgdXAgdmFyaW91cyBmdW5jdGlvbiBkZWNscy4KLQotCSogY29uZmlnL2hvLWhwcGFvc2YuaDogRGVsZXRlIF9JTyogbWFjcm9zLiAgVGhleSBhcmUgZGVmaW5lZCBpbgotCXN0ZGlvLmguICBEZWxldGUgYm9ndXMgZGVjbGFyYXRpb24gb2YgZnJlZS4gIEdldCBwYXRoIHRvCi0JYWxsb2NhLWNvbmYuaCByaWdodC4KLQotVHVlIE5vdiAgMiAxMzo1NzozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChvcGVyYW5kKTogRml4IGNoZWNrcyBmb3IgY2hhcmFjdGVycyBmb2xsb3dpbmcgIjBiIiBvcgotCSIwZiIuCi0KLU1vbiBOb3YgIDEgMjE6Mzc6MDQgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotc29tLmggKG9ial9hdHRhY2hfdW53aW5kX2luZm8pOiBEZWZpbmUgYXMgYSBob29rCi0Jc28gR0FTIGNhbiBhdHRhY2ggdW53aW5kIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24gdG8gYSBCRkQgc3ltYm9sLgotCSogY29uZmlnL3RjLWhwcGEuYyAoZml4X25ld19ocHBhKTogSWYgbmVjZXNzYXJ5IGF0dGFjaCB1bndpbmQKLQlkZXNjcmlwdG9yIGluZm9ybWF0aW9uIHRvIHRoZSBCRkQgc3ltYm9sLgotCShtZF9hcHBseV9maXgpOiBSX0hQUEFfRU5UUlkgYW5kIFJfSFBQQV9FWElUIGNhbiBuZXZlciBiZSAiYXBwbGllZCIsCi0JdGhleSBhcmUgc2ltcGx5IG1hcmtlcnMuICBNYWtlIFJfSFBQQV9VTldJTkRfKiBoYW5kbGluZyBPQkpfRUxGCi0JZGVwZW5kZW50LgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBXaG9sZSBmdW5jdGlvbiBpcyBPQkpfRUxGIGRlcGVuZGVudC4KLQkocGFfZW50cnkpOiBCdWlsZCBhIFJfSFBQQV9FTlRSWSByZWxvY2F0aW9uIHdoZW4gY29uZmlndXJlZCBmb3IgU09NLgotCShwYV9leGl0KTogTGlrZXdpc2UsIGJ1dCBidWlsdCBhIFJfSFBQQV9FWElUIHJlbG9jYXRpb24uICBEbyBub3QKLQlidWlsZCAiZW5kLW9mLWZ1bmN0aW9uIiBzeW1ib2xzIGZvciBTT00sIHRoZXkgYXJlIG5vdCBuZWVkZWQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHByb2Nlc3NfZXhpdCk6IENyZWF0ZSB0ZW1wb3Jhcnkgc3ltYm9scyB3aXRoCi0JY29ycmVjdCBwcmVmaXhlcyBzbyB0aGV5IGNhbiBiZSBlbGltaW5hdGVkIGxhdGVyLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChjYWxsX2luZm8gc3RydWN0KTogRGVsZXRlIHVudXNlZCAiZnJhbWUiIGZpZWxkLgotCShwYV9jYWxsaW5mbyk6IEluc2VydCBmcmFtZXNpemUgaW50byB0aGUgdW53aW5kIGluZm9ybWF0aW9uIGFzCi0Jc29vbiBhcyBpdCdzIGF2YWlsYWJsZS4KLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogRG8gbm90IGluc2VydCBmcmFtZXNpemUgaW50byB0aGUgdW53aW5kCi0JaW5mb3JtYXRpb24gaGVyZS4KLQotCSogQWRkIHN1cHBvcnQgZm9yIG1hcmtlciB0eXBlIHJlbG9jYXRpb25zLiAgVGhlc2UgbWFyayBhcmVhcwotCW9mIGludGVyZXN0IHRvIHRoZSBsaW5rZXIuICBFTlRSWS9FWElUIHJlbG9jYXRpb25zIGZvciBTT00gYXJlCi0JYW4gZXhhbXBsZSBvZiBtYXJrZXIgcmVsb2NhdGlvbnMuCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBJbnN0ZWFkIG9mIGFzc3VtaW5nIHNpemUgb2YgYSByZWxvY2F0aW9uCi0JaXMgNCBieXRlcywgcGljayB1cCB0aGUgc2l6ZSBmcm9tIHJlbG9jYXRpb24gaXRzZWxmLgotCShmaXh1cF9zZWdtZW50KTogRG8gbm90IGNvbXBsYWluIHRoYXQgYSB2YWx1ZSBpcyB0b28gc21hbGwgZm9yCi0JbWFya2VyIHJlbG9jYXRpb25zLgotCi0JKiBzdHJ1Yy1zeW1ib2wuaDogQWRkIG5ldyAic3lfdXNlZCIgZmllbGQgdG8gdGhlIHN5bWJvbCBzdHJ1Y3R1cmUuCi0JKiBleHByLmMgKG9wZXJhbmQpOiBTZXQgc3lfdXNlZCBmb3IgYW55IHN5bWJvbCB1c2VkIGFzIGFuIG9wZXJhbmQuCi0JKGV4cHIpOiBMaWtld2lzZSBmb3IgYW55IHN5bWJvbCB1c2VkIGluIGFuIGV4cHJlc3Npb24uCi0JKiBjb25maWcvdGMtaHBwYS5oICh0Y19mcm9iX3N5bWJvbCk6IERlZmluZS4gIFB1bnQgaW1wb3J0ZWQKLQlzeW1ib2xzIHdoaWNoIGFyZSBuZXZlciB1c2VkIGFuZCBhYnNvbHV0ZSBzeW1ib2xzIHdoaWNoIGxvY2FsIHNjb3BlLgotCi0JKiBjb25maWcvb2JqLXNvbS5oIChvYmpfZnJvYl9maWxlKTogRGVmaW5lLgotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbik6IFNldCBhbGlnbm1lbnQKLQlvZiBzdGFiIHNlY3Rpb25zLiAgTWFrZSBzcGFjZSBmb3IgdGhlIHNwZWNpYWwgc3RhYiBlbnRyeS4KLQkoYWRqdXN0X3N0YWJfc2VjdGlvbnMpOiBBZGp1c3QgdGhlIHNwZWNpYWwgZW50cnkgaW4gdGhlCi0Jc3RhYnMgc2VjdGlvbi4KLQkoc29tX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbi4gIFNpbXBseSBjYWxscyBhZGp1c3Rfc3RhYl9zZWN0aW9ucwotCWZvciBlYWNoIHNlY3Rpb24uCi0KLU1vbiBOb3YgIDEgMTc6NTQ6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChQSUNfQ0FMTF9SRUcsIFNQLCBGUCk6IERlZmluZS4KLQkobWlwc19waWMsIG1pcHNfY3ByZXN0b3JlX29mZnNldCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShtZF9wc2V1ZG9fdGFibGUpOiBIYW5kbGUgLmFiaWNhbGxzLCAuY3Bsb2FkLCBhbmQgLmNwcmVzdG9yZS4KLQlJZ25vcmUgLmJnbmIgYW5kIC5lbmRiLgotCShncF9yZWZlcmVuY2UpOiBfZ3BfZGlzcCBpcyBuZXZlciBhZGRyZXNzZWQgb2ZmIEdQLgotCShtYWNyb19idWlsZCk6IElnbm9yZSBtYWNyb3Mgd2hpbGUgc2VhcmNoaW5nIGZvciBpbnNuLiAgRm9yIGNhc2VzCi0JaSwgaiwgYW5kIG8sIGFjY2VwdCB0aGUgcmVsb2MgdHlwZSBhcyBhbiBhcmd1bWVudCByYXRoZXIgdGhhbgotCWFzc3VtaW5nIEJGRF9SRUxPQ19MTzE2LiAgRG9uJ3QgdHJ5IHRvIGNvbnZlcnQgQkZEX1JFTE9DX0xPMTYgdG8KLQlCRkRfUkVMT0NfTUlQU19HUFJFTC4gIEFkZGVkIG5ldyBjYXNlIGEuCi0JKHNldF9hdCwgbG9hZF9yZWdpc3RlciwgbWFjcm8pOiBDaGFuZ2VkIGNhbGxzIHRvIG1hY3JvX2J1aWxkIHRvCi0JcGFzcyBuZXcgYXJndW1lbnQgZm9yIGksIGogYW5kIG8gY2FzZXMuCi0JKG1hY3JvKTogSGFuZGxlIE1fSkFMXzEsIE1fSkFMXzIgYW5kIE1fSkFMX0EuICBUaGVzZSByZXF1aXJlCi0Jc3BlY2lhbCBoYW5kbGluZyB3aGVuIGdlbmVyYXRpbmcgU1ZSNCBQSUMgY29kZS4KLQkobWlwc19pcCwgdGNfZ2V0X3JlZ2lzdGVyLCBzX2ZyYW1lKTogVXNlIG1hY3JvcyBGUCwgU1AsIEdQIGFuZCBBVAotCXJhdGhlciB0aGFuIGhhcmQgY29kZWQgY29uc3RhbnRzLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DX01JUFNfTElURVJBTCBhbmQKLQlCRkRfUkVMT0NfTUlQU19DQUxMMTYuCi0JKHNfb3B0aW9uKTogU2V0IG1pcHNfcGljIGJhc2VkIG9uIC5vcHRpb24gcGljTi4KLQkoc19hYmljYWxscyk6IE5ldyBmdW5jdGlvbjsgc2V0IG1pcHNfcGljIHRvIDIuCi0JKHNfY3Bsb2FkKTogTmV3IGZ1bmN0aW9uOyBoYW5kbGUgLmNwbG9hZC4KLQkoc19jcHJlc3RvcmUpOiBOZXcgZnVuY3Rpb247IGhhbmRsZSAuY3ByZXN0b3JlLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IgLmJnbmIsCi0JLmVuZGIgYW5kIC52ZXJzdGFtcCwgc2V0dGluZyB0aGVtIHRvIHNfaWdub3JlLgotCi1TdW4gT2N0IDMxIDAwOjM2OjQwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChzdWJzcGFjZV9kaWN0aW9uYXJ5X2NoYWluKTogQWRkIG5ldyBzc2RfZGVmaW5lZAotCWZpZWxkLiAgRGVmaW5lIFNVQlNQQUNFX0RFRklORUQgYWNjZXNzb3IgbWFjcm8uCi0JKHBhX3N1YnNwYWNlKTogQWxsb3cgdXNlciB0byBvdmVycmlkZSBzdWJzcGFjZSBhdHRyaWJ1dGVzIGZvcgotCWJ1aWx0LWluIHN1YnNwYWNlcy4gIFNldCBzc2RfZGVmaW5lZCBhdCB0aGUgZW5kIG9mIGZjbiAtLSB0aGF0Ci0Jd2F5IHRoZSBhdHRyaWJ1dGVzIGNhbiBvbmx5IGJlIGNoYW5nZWQgb25jZS4gIFBhc3MgbmV3bHkgYWxsb2NhdGVkCi0JbmFtZSB0byBpc19kZWZpbmVkX3N1YnNwYWNlLCBub3QgYSBwb2ludGVyIHRvIHRoZSBpbnB1dCBsaW5lLgotCUZpeCB0eXBvIGluIHNwYWNlL3N1YnNwYWNlIHJld29yay4KLQkoaXNfZGVmaW5lZF9zdWJzcGFjZSk6IERlbGV0ZSB1bnVzZWQgMm5kIGFyZy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2ltcG9ydCk6IElmIGN1cnJlbnRseSBpbiB0aGUgdGV4dCBzZWdtZW50Ci0JYW5kIGEgc3ltYm9sIGlzIGltcG9ydGVkIHdpdGhvdXQgdHlwZSBpbmZvcm1hdGlvbiwgc2V0IEJTRl9GVU5DVElPTgotCWZvciB0aGUgc3ltYm9sLgotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogQ29ycmVjdCB0ZXN0IHRvIGRldGVybWluZSBpZgotCXRoZSBzZWN0aW9uJ3Mgc2l6ZSB3YXMgcm91bmRlZCB1cC4KLQotCSogY29uZmlnL29iai1zb20uaCAob2JqX3NldF9zeW1ib2xfdHlwZSk6IERlZmluZSBhIGhvb2sgc28gR0FTCi0JY2FuIHByb3Blcmx5IHNldCBhbGwgdGhlIFNPTSBzeW1ib2wgdHlwZXMuCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zeW1ib2xfdHlwZSk6IE5ldyBlbnVtIHRvIHJlcHJlc2VudCB0aGUKLQlzeW1ib2wgdHlwZXMgd2hpY2ggY2FuIGJlIHNldCBmcm9tIGFuIElNUE9SVC9FWFBPUlQgc3RhdGVtZW50LgotCShwYV9leHBvcnRfYXJncyk6IFNldCB0aGUgcGFfc3ltYm9sX3R5cGUgdHlwZSBiYXNlZCBvbiBhcmd1bWVudHMuCi0JSWYgZGVmaW5lZCwgY2FsbCBvYmpfc2V0X3N5bWJvbF90eXBlIHRvIHBhc3MgdGhpcyBpbmZvcm1hdGlvbiBvbgotCXRvIHRoZSBCRkQgYmFja2VuZC4KLQotCSogcmVhZC5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogU2V0IFNFQ19ERUJVR0dJTkcgZm9yIGFueQotCXN0YWIgc2VjdGlvbiB3ZSBtYWtlLgotCShzX3N0YWJfZ2VuZXJpYyk6IExpa2V3aXNlLgotCi1TYXQgT2N0IDMwIDE0OjI2OjIwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBBbGxvdyBiYWNrZW5kcyB0byBvdmVycmlkZSB0aGUgdmFsdWUgb2YgdGhlIGZha2UgbGFiZWwuCi0JKiB3cml0ZS5oIChMT0NBTF9MQUJFTCk6IERlbGV0ZSBET1RfTEFCRUxfUFJFRklYIGNvZGUuICBJbnN0ZWFkCi0JYXNzdW1lIGJhY2tlbmRzIHdpbGwgZGVmaW5lIExPQ0FMX0xBQkVMIGlmIGFueXRoaW5nIG90aGVyIHRoYW4KLQknTCcgaXMgdXNlZCB0byBkZW5vdGUgYSBsb2NhbCBsYWJlbC4KLQkoRkFLRV9MQUJFTF9OQU1FKTogTmV3IG1hY3JvLiAgRGVmaW5lcyB0aGUgZGVmYXVsdCBuYW1lIHVzZWQgZm9yCi0JdGhlICJmYWtlIiBsYWJlbC4KLQkqIGV4cHIuYyAobWFrZV9leHByX3N5bWJvbCk6IERlbGV0ZSBET1RfTEFCRUxfUFJFRklYIGNvZGUKLQlhbmQgaW5zdGVhZCBzaW1wbHkgdXNlIHRoZSBzdHJpbmcgZGVmaW5lZCBieSBGQUtFX0xBQkVMX05BTUUuCi0JKG9wZXJhbmQpOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAoc19zdGFiX2dlbmVyaWMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZSBhcyBMJDBcMDAxIHNvIGl0J3MKLQlrbm93biB0byBiZSBhIGxvY2FsIGxhYmVsLgotCSogY29uZmlnL3RjLWkzODYuaCAoRE9UX0xBQkVMX1BSRUZJWCk6IERlbGV0ZS4KLQkoTE9DQUxfTEFCRUwsIEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKERPVF9MQUJFTF9QUkVGSVgpOiBEZWxldGUuCi0JKExPQ0FMX0xBQkVMLCBGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUuCi0JKiBjb25maWcvdGUtc2NvMzg2LmggKERPVF9MQUJFTF9QUkVGSVgpOiBEZWxldGUuCi0JKExPQ0FMX0xBQkVMLCBGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUuCi0KLQlSZXdvcmsgc3BhY2Uvc3Vic3BhY2UgaGFuZGxpbmcgaW4gUEEgY29kZSB0byBmdWxseSBzdXBwb3J0Ci0JU09NIHNwYWNlcy9zdWJzcGFjZXMuCi0JKiBjb25maWcvdGMtaHBwYS5jIChVU0VfQUxJQVNFUyk6IE5ldyBvYmplY3QtZm9ybWF0IGRlcGVuZGVudCBkZWZpbmUKLQl0byBjb250cm9sIHRoZSB1c2Ugb2Ygc3BhY2Uvc3Vic3BhY2UgbmFtZSBhbGlhc2VzLgotCSh1cGRhdGVfc3Vic3BhY2UpOiBBY2NlcHQgc3BhY2UgY2hhaW4gZW50cnkgZm9yIGNvbnRhaW5pbmcgc3BhY2UKLQlhcyBhIG5ldyBwYXJhbWV0ZXIuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShwYV9nZXRfbGFiZWwpOiBVc2UgY3VycmVudF9zcGFjZSByYXRoZXIgdGhhbiBwYV9zZWdtZW50X3RvX3NwYWNlLgotCShwYV9kZWZpbmVfbGFiZWwpOiBMaWtld2lzZS4KLQkocGFfdW5kZWZpbmVfbGFiZWwpOiBMaWtld2lzZS4KLQkobWRfYmVnaW4pOiBDaGFuZ2UgaW50byB0aGUgKHBvc3NpYmx5IG1vZGlmaWVkKSB0ZXh0X3NlY3Rpb24uCi0JKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiBDcmVhdGUgYSBuZXcgc2VnbWVudC9zcGFjZSBpZiBjcmVhdGVfZmxhZwotCWlzIHRydWUsIGFuZCB0aGUgc3BhY2UgbmFtZSBpcyBub3Qgb25lIG9mIHRoZSB0d28gcHJlZGVmaW5lZCBzcGFjZXMuCi0JKHBhX3N1YnNwYWNlKTogVXNlIGN1cnJlbnRfc3BhY2UgcmF0aGVyIHRoYW4gYSBsb29rdXAgdmlhCi0JcGFfc2VnbWVudF90b19zcGFjZS4gIFJlc2V0IEJGRCBzZWN0aW9uIGZsYWdzIGFzIHJlcXVpcmVkIGJ5Ci0JdGhlIC5zdWJzcGFjZSBkaXJlY3RpdmUuICBMaWtld2lzZSBmb3IgdGhlIHNlY3Rpb24gYWxpZ25tZW50LgotCVBhc3MgdGhlIGN1cnJlbnQgc3BhY2UgdG8gdXBkYXRlX3N1YnNwYWNlIGFuZCBjcmVhdGVfbmV3X3N1YnNwYWNlLgotCShwYV9zcGFjZXNfYmVnaW4pOiBPbmx5IHVzZSBzcGFjZS9zdWJzcGFjZSBhbGlhc2VzIGlmIFVTRV9BTElBU0VTCi0JaXMgdHJ1ZS4gIFdoZW4gbm90IHVzaW5nIGFsaWFzZXMsIGNyZWF0ZSBhIEJGRCBzZWN0aW9uIGZvciBlYWNoCi0Jc3Vic3BhY2UgZW5jb3VudGVyZWQuICBXaGVuIG5vdCB1c2luZyBhbGlhc2VzIHJlcGxhY2UgdGhlIGRlZmF1bHQKLQl0ZXh0LCBkYXRhLCBhbmQgYnNzIHNlZ21lbnRzIHdpdGggbmV3IG9uZXMuCi0JKGNyZWF0ZV9uZXdfc3Vic3BhY2UpOiBXaGVuIG5vdCB1c2luZyBhbGlhc2VzIGVhY2ggc3Vic3BhY2UgaGFzIGEKLQlzZWN0aW9uL3NlZ21lbnQgYW5kIHN1YnNlZ21lbnRzIGFyZSBub3QgbmVlZGVkLCBzbyBzZXQgdGhlIHN1YnNlZ21lbnQKLQl0byB6ZXJvLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9zcGFjZV9zdG10KTogSWYgbmVlZGVkLCBjYWxsCi0Jb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgdG8gcGFzcyBzcGFjZSBhdHRyaWJ1dGVzIHRvIHRoZQotCUJGRCBiYWNrZW5kLgotCShjcmVhdGVfbmV3X3NwYWNlKTogTGlrZXdpc2UuCi0JKGNyZWF0ZV9uZXdfc3Vic3BhY2UpOiBMaWtld2lzZSBmb3Igc3Vic3BhY2UgYXR0cmlidXRlcyB1c2luZwotCW9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzLgotCSh1cGRhdGVfc3Vic3BhY2UpOiBMaWtld2lzZSBmb3Igc3Vic3BhY2UgYXR0cmlidXRlcyB1c2luZwotCW9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9zcGFjZV9zdG10KTogR2V0IHNlZ21lbnQgYW5kIHNvcnQga2V5Ci0JZm9yICRURVhUJCBhbmQgJFBSSVZBVEUkIGZyb20gdGhlIGRlZmF1bHQgc3BhY2Ugc3RydWN0dXJlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9leHBvcnRfYXJncyk6IEFsd2F5cyBzZXQgQlNGX0ZVTkNUSU9OCi0JYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiB0eXBlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBQcmVsaW1pbmFyeSBzdGFiIGF0IGhhbmRsaW5nCi0JU09NIHJlbG9jYXRpb25zLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogRGVsZXRlIGluY29ycmVjdCBjaGVjayBmb3Igc3ltYm9sCi0JcmVkZWZpbml0aW9uLgotCi0JKiBjb25maWcvb2JqLXNvbS5bY2hdOiBOZXcgZmlsZXMgZm9yIFNPTSBzdXBwb3J0LiAgTm90ZSBTT00KLQlzdXBwb3J0IGlzIG5vdCB5ZXQgY29tcGxldGUgaW4gR0FTIG9yIEJGRC4KLQotCSogY29uZmlnL2hvLWhwcGFic2QuaDogIERlbGV0ZSBJTyogbWFjcm9zLCB0aGV5IGFyZSBkZWZpbmVkIGluCi0Jc3RkaW8uaC4gIERlbGV0ZSBkZWNsYXJhdGlvbiBvZiBmcmVlLiAgSW5jbHVkZSBzdGRsaWIuaCwgdW5pc3RkLmgsCi0JYW5kIHN0cmluZy5oLgotCi1GcmkgT2N0IDI5IDEzOjI2OjEyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBBbGxvdyBiYWNrZW5kcyB0byBvdmVycmlkZSB0aGUgc2VjdGlvbiBuYW1lcyB1c2VkIGZvciBlbWJlZGRlZAotCXN0YWJzIHN1cHBvcnQuICBOZWVkZWQgZm9yIFNPTS4KLQkqIHJlYWQuYyAoU1RBQl9TRUNUSU9OX05BTUUpOiBEZWZhdWx0IHRoZSBuYW1lIG9mIHRoZSBzdGFiIHNlY3Rpb24KLQl0byAiLnN0YWIiLgotCShTVEFCX1NUUklOR19TRUNUSU9OX05BTUUpOiBMaWtld2lzZSBmb3IgdGhlIHN0YWIgc3RyaW5ncyBzZWN0aW9uLgotCShnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogSXMgbm93IHBhc3NlZCB0aGUgZnVsbCBuYW1lIGZvciB0aGUKLQlzdGFiIHN0cmluZyBzZWN0aW9uIHJhdGhlciB0aGFuIGEgbmFtZSBwcmVmaXguICBBbGwgcmVmZXJlbmNlcwotCWNoYW5nZWQuCi0JKHNfc3RhYl9nZW5lcmljKTogTmV3IGFyZ3VtZW50IGZvciB0aGUgc3RhYiBzdHJpbmcgc2VjdGlvbiBuYW1lLgotCWFsbCByZWZlcmVuY2VzIGNoYW5nZWQuCi0JKHNfeHN0YWIpOiBBcHBlbmQgInN0ciIgdG8gdGhlIHN0YWIgc2VjdGlvbiBuYW1lIHRvIGdldCB0aGUKLQlzdGFiIHN0cmluZyBzZWN0aW9uIG5hbWUuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBBcHBlbmQgInN0ciIKLQl0byBzdGFiIHNlY3Rpb24gbmFtZSB0byBnZXQgdGhlIHN0YWIgc3RyaW5nIHNlY3Rpb24gbmFtZS4gIFBhc3MKLQl0aGUgZnVsbCBuYW1lIG9mIHRoZSBzdGFiIHN0cmluZyBzZWN0aW9uIHRvIGdldF9zdGFiX3N0cmluZ19vZmZzZXQuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2JlZ2luKTogRGlzYWJsZSAiLVIiIG9wdGlvbiB0byBmb2xkCi0JdGV4dGFuZCBkYXRhIHNlZ21lbnRzLiAgV2FybiB1c2VyICItUiIgaXMgdW5zdXBwb3J0ZWQgb24gdGhlCi0JUEEuCi0KLVRodSBPY3QgMjggMTI6MzY6MTMgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IERlZmF1bHQgYWxpZ25tZW50IGlzIDggZm9yCi0JLmFsaWduIGFuZCAuQUxJR04gZGlyZWN0aXZlcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3BhY2UpOiBEbyBub3QgcmVwb3J0IGFuIGVycm9yIGZvciBhIC5zcGFjZQotCWRpcmVjdGl2ZSB3aGljaCBkb2VzIG5vdCBkZWZpbmUgYSAid2VsbC1rbm93biIgc3BhY2UgYW5kIGRvZXMKLQlub3QgaW5jbHVkZSBhIHNwYWNlIG51bWJlciBhcyBhbiBhcmd1bWVudC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZGVmX3N1YnNwYWNlcyk6IENvcnJlY3QgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JImRlZmluZWQiLCAibG9hZGFibGUiLCAiY29kZV9vbmx5IiBhbmQgInNwYWNlX2luZGV4IiBmaWVsZHMuCi0JKHBhX2RlZl9zcGFjZXMpOiBDb3JyZWN0IGluaXRpYWxpemF0aW9uIG9mIHRoZSAic3BudW0iLCAiZGVmaW5lZCIsCi0JYW5kICJwcml2YXRlIiBmaWVsZHMuCi0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBBZGQgbmV3IHRjX2ZpeF9kYXRhIGZpZWxkIGZvciB0aGUgdmFyaW91cwotCWJhY2tlbmRzIHRvIGF0dGFjaCBtYWNoaW5lIGRlcGVuZGVudCBmaXh1cCBpbmZvcm1hdGlvbiB0by4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBJbml0aWFsaXplIG5ldyB0Y19maXhfZGF0YSBmaWVsZC4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X3N0cnVjdCk6IERlbGV0ZSB1bm5lY2Vzc2FyeSBmaXhfZml4UCBhbmQKLQlmeF9uZXh0IGZpZWxkcy4KLQkoaHBwYV9maW5kX2hwcGFfZml4KTogRGVsZXRlIHVubmVjZXNzYXJ5IGZ1bmN0aW9uLiAgRml4IGFsbAotCWNhbGxlcnMgdG8gZ2V0IEhQUEEgZml4dXAgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGNfZml4X2RhdGEgZmllbGQKLQlpbiB0aGUgR0FTIGZpeHVwLgotCShocHBhX2ZpeF9yb290KTogRGVsZXRlIHVubmVjZXNzYXJ5IHZhcmlhYmxlLgotCShmaXhfbmV3X2hwcGEpOiBBdHRhY2ggSFBQQSBmaXh1cCBkYXRhIHRvIHRoZSBHQVMgZml4dXAuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3NldF9zdGFydF9zeW1ib2wpOyBEZWxldGUgdW53YW50ZWQKLQlmdW5jdGlvbi4gIEZpeCBhbGwgY2FsbGVycy4KLQkoc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbik6IERlbGV0ZSB1bnVzZWQgc3NkX3N0YXJ0X3N5bSBmaWVsZC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbiB0byBkZXRlcm1pbmUKLQlpZiBhIHBhcnRpY3VsYXIgZml4dXAgaXMgYWRqdXN0YWJsZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogQ2FsbCBocHBhX2ZpeF9hZGp1c3RhYmxlIHRvCi0JcGVyZm9ybSB0aGUgcmVhbCB3b3JrLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUpOiBNb3ZlIGRlZmluaXRpb24gb3V0Ci0Jb2YgT0JKX1hYWCBjb25kaXRpb25hbHMuCi0JKE1BWF9SRUxPQ19FWFBBTlNJT04pOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobG9nMik6IFJlbmFtZWQgZnJvbSBpc19wb3dlcl9vZl8yLiAgRml4IGFsbAotCWNhbGxlcnMuIE5vdyByZXR1cm5zIGxvZzIgKE4pIGZvciBwb3NpdGl2ZSBOIHdoaWNoIGFyZSBhbiBleGFjdAotCXBvd2VyIG9mIHR3byBvciAtMSBmb3IgYW4gZXJyb3IuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NhbGxpbmZvKTogUmFuZ2UgY2hlY2sgdmFsdWVzIHByb3ZpZGVkIGZvcgotCUVOVFJZX0dSLCBFTlRSWV9GUiBhbmQgRU5UUllfU1IuICBQcm9wZXJseSBhZGp1c3QgdmF1ZXMgYmVmb3JlCi0JaW5zZXJ0aW5nIHRoZW0gaW50byB0aGUgdW53aW5kIHRhYmxlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChORUVEU19GSVhVUCk6IERlbGV0ZSBkZWZpbml0aW9uIGFuZCBhbGwgcmVmZXJlbmNlcy4KLQkoaHBwYV9nZW5fcmVsb2NfdHlwZSk6IE5ldyBvYmplY3QgZm9ybWF0IGRlcGVuZGVudCBtYWNyby4KLQkocGFfaXApOiBEZWxldGUgdG9ucyBvZiBjb2RlIHdoaWNoIHdhcyBlaXRoZXIgT0JKX1NPTSBvciBPQkpfRUxGCi0JY29uZGl0aW9uYWwuICBUaGUgY29kZSBjYW4gKGFuZCB3aWxsKSBiZSBzaGFyZWQgYmV0d2VlbiBTT00gJiBFTEYKLQlmb3JtYXRzIGluIHRoZSBuZWFyIGZ1dHVyZS4KLQkoY29uc19maXhfbmV3X2hwcGEsIG1kX2FwcGx5X2ZpeF8xKTogTGlrZXdpc2UuCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSwgcHJvY2Vzc19leGl0LCBwYV9leGl0KTogTGlrZXdpc2UuCi0JKHRjX2dlbl9yZWxvYyk6IFVzZSBocHBhX2dlbl9yZWxvYyByYXRoZXIgdGhhbiBhbiBvYmplY3QgZm9ybWF0Ci0Jc3BlY2lmaWMgY2FsbC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IFNldCB0aGUgc2VnbWVudCBmb3IgYSBjb21tb24gc3ltYm9sCi0JdG8gYmZkX3VuZF9zZWN0aW9uLgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX3ZlcnNpb24pOiBBZGQgZXh0ZXJuIHByb3RvdHlwZS4KLQotCSogY29uZmlndXJlLmluIChocHBhLSotYnNkKik6IE5ldyBjb25maWd1cmF0aW9uLgotCUJGRCBpcyBhbHdheXMgdXNlZCBmb3IgR0FTIGdlbmVyYXRpbmcgU09NIG9iamVjdHMuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogU2V0IHN5X3VzZWRfaW5fcmVsb2MgaWYgYW4KLQlhZGp1c3RtZW50IGlzIHJlamVjdGVkIGJ5IHRoZSB0YXJnZXQgbWFjaGluZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYmlnX2NvbnMpOiBEZWxldGUgZnVuY3Rpb24gYW5kIGl0cwotCWRlY2xhcmF0aW9uLiAgQWxsIGNhbGxlcnMgY2hhbmdlZCB0byB1c2UgcGFfY29ucy4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEZpeCBpbmRlbnRpb24gYW5kIG9wZW4vY2xvc2UgYnJhY2UKLQlwcm9ibGVtLgotCi0JRnJvbSBQZXRlIEhvb2dlbmJvb206Ci0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hdG9mKTogUmV0dXJuIGEgTlVMTCBvbiBzdWNjZXNzIHJhdGhlciB0aGFuCi0JYW4gZW1wdHkgc3RyaW5nLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9zcGFjZV9zdG10KTogQWR2YW5jZQotCWlucHV0X2xpbmVfcG9pdG5lciB3aGVuIGFuIGludmFsaWQgYXJndW1lbnQgaXMgZW5jb3VudGVyZWQuCi0KLVRodSBPY3QgMjggMTM6MDk6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9iZWdpbik6IFdoZW4gb3Bjb2RlcyBhcmUgbWFzaGVkIHRvZ2V0aGVyIGluCi0JdGhlIHRhYmxlLCByZXF1aXJlIHRoYXQgdGhlIG9uZSB3aXRob3V0IGJpdCAweDEwMDAwMDAgc2V0IGNvbWUKLQlmaXJzdC4gIFJlcXVpcmUgZnVydGhlciB0aGF0IGl0IGJlIGNhc2UgJ2InIG9yICdQJy4gIFRoZSBhMjlrCi0Jb3Bjb2RlIHRhYmxlIGFscmVhZHkgbWVldHMgdGhlc2UgY29uc3RyYWludHMuCi0JKG1hY2hpbmVfaXApOiBXaGVuIGhhbmRsaW5nIGNhc2UgJ2knIG9yICdBJywgbWFrZSBzdXJlIHRoYXQgdGhlCi0JYXBwcm9wcmlhdGUgb3Bjb2RlIHJlYWxseSBleGlzdHMgYnkgbG9va2luZyBhdCB0aGUgbmV4dCBlbnRyeSBpbgotCXRoZSBvcGNvZGUgdGFibGUuCi0KLVdlZCBPY3QgMjcgMTE6NDg6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQWRqdXN0IG9mZnNldHMgZm9yIFBDIHJlbGF0aXZlCi0JZml4dXBzLiAgQWRkIDYgZm9yIGxvbmcgNy4zIGNhc2UsIDIgZm9yIHNob3J0IDcuMiBjYXNlLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9lY29mZl9lbnQpOiBJZ25vcmUgYW4gb3B0aW9uYWwgbnVtYmVyCi0JYWZ0ZXIgYSAuZW50IGRpcmVjdGl2ZS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEhhbmRsZSAnPicgY2FzZSAoc2hpZnQgYW1vdW50Ci0JYmV0d2VlbiAzMiBhbmQgNjMgZm9yIGRvdWJsZSBzaGlmdCBpbnN0cnVjdGlvbikuICBEbyAmIDB4MWYgcmF0aGVyCi0JdGhhbiAlIDMyLgotCShwcmludEluc24pOiBIYW5kbGUgJz4nLgotCi1UdWUgT2N0IDI2IDE2OjU4OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKHRjX2FvdXRfZml4X3RvX2NoYXJzKTogT3V0cHV0IHRoZSBzeW1ib2wKLQludW1iZXIgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgVW50ZXN0ZWQuICBQcm9iYWJseSBkb2VzIG5vdCB3b3JrIGZvcgotCWNyb3NzIGFzc2VtYmx5LiAgRnJvbSBjYWduZXlAY3MuYWRlbGFpZGUuZWR1LmF1IChBbmRyZXcgQ2FnbmV5KS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBFcnJvciBpZiBhIHNob3J0IGJyYW5jaCB1c2VzCi0JYW4gaWxsZWdhbCBvZmZzZXQgb2YgMCBvciAtMS4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IEFsaWduIC5zdGFiCi0Jc2VjdGlvbiB0byBhIGxvbmd3b3JkIGJvdW5kYXJ5LgotCi1UdWUgT2N0IDI2IDEwOjI0OjMxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ0hFQ0tGTEFHUyk6IFBhc3MgZG93biBSVU5URVNURkxBR1MuCi0KLQlGcm9tIEplZmYgTGF3OgotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogRUxGMzJfSFBQQV9SX0FEREVORCAtPgotCUhQUEFfUl9BRERFTkQuCi0KLU1vbiBPY3QgMjUgMTQ6MDY6MTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBGaXggdXAgbWVtYmFyIGFyZ3VtZW50IGhhbmRsaW5nLgotCi1Nb24gT2N0IDI1IDExOjE3OjU4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChidWlsZF9NYnl0ZXMpOiBXcml0ZSB0aGUgcmVsb2NzIHRvIHRoZSBjb3JyZWN0Ci0JYWRkcmVzcy4gKG1kX2Fzc2VtYmxlKTogTWFrZSBlcnJvciBoYW5kbGluZyBhIGJpdCBtb3JlIGdyYWNlZnVsLgotCShtZF9hcHBseV9maXgpOiAgRG9uJ3Qgd2FybiBvbiBub24gYWxpZ25lZCBkaXNwbGFjZW1lbnQuCi0KLQkqIGNvbmZpZy90Yy16OGsuYyAoZ2V0X3NwZWNpZmljLCBidWlsdF9ieXRlcyk6ICBVbmRlcnN0YW5kIGFsbCB0aGUKLQlhc3BlY3RzIG9mIGxkYS4KLQotTW9uIE9jdCAyNSAxMDoyMDozMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBVc2UgIiQ8KiIgc28gVlBBVEggd2lsbCBmaW5kCi0JYXMuaW5mbyogZXZlbiBpZiB0aGV5J3JlIGluICQoc3JjZGlyKSAoZS5nLiwgZm9yIEZTRgotCWRpc3RyaWJ1dGlvbnMpLgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBGb3IgcmVsb2NzIHRoYXQgYXJlIHBjX3JlbGF0aXZlIGFuZAotCXBjcmVsX29mZnNldCBhbmQgbm90IHBhcnRpYWxfaW5wbGFjZSwgYWRqdXN0IHJlbG9jLT5hZGRlbmQgdG8KLQljb21wZW5zYXRlIGZvciBhIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gYnVnLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaDogUmVtb3ZlZCByZW1haW5pbmcgbm9uLUJGRF9BU1NFTUJMRVIgY29kZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBEaXR0by4KLQkodGNfZ2VuX3JlbG9jKTogSW5jbHVkZSBmeF9vZmZzZXQgZm9yIHBjcmVsIGZpeHVwcy4KLQotU3VuIE9jdCAyNCAxNjo0OTowMCAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHgxLmN5Z251cy5jb20pCi0KLQkqIHRjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIGR3b3JkIHBzZXVkbyBvcC4KLQotRnJpIE9jdCAyMiAyMDo0MDo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmM6IHJlcGxhY2VkIGFsbCB2YXJpYWJsZXMgY2FsbGVkIEZvcm1hdCB3aXRoICdmb3JtYXQnLAotCSAgZm9yIGNvbnNpc3RlbmN5IHRocm91Z2hvdXQKLQotCSogY29uZmlndXJlLmluOiBoYW5kbGUgbWlwcyotIGluc3RlYWQgb2YgbWlwcywgbWlwcyplbCBmb3IgbGl0dGxlCi0JZW5kaWFuIGNvbmZpZ3VyYXRpb25zCi0KLUZyaSBPY3QgMjIgMTQ6NDU6NDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpbnB1dC1zY3J1Yi5jIChwaHlzaWNhbF9pbnB1dF9maWxlLCBsb2dpY2FsX2lucHV0X2ZpbGUsCi0JcGh5c2ljYWxfaW5wdXRfbGluZSwgbG9naWNhbF9pbnB1dF9saW5lKTogTWFkZSBzdGF0aWMuCi0JKGFzX3doZXJlKTogUmV0dXJuIGN1cnJlbnQgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciwgZG9uJ3QgcHJpbnQKLQl0aGVtIG91dC4KLQkqIG1lc3NhZ2VzLmMgKGFzX3Nob3dfd2hlcmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLiAgT3RoZXIKLQlmdW5jdGlvbnMgdXNlIGl0IGluc3RlYWQgb2YgYXNfd2hlcmUuCi0JKGFzX2JhZF9pbnRlcm5hbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFzX2JhZCk6IFVzZSBhc19iYWRfaW50ZXJuYWwuCi0JKGFzX2JhZF93aGVyZSk6IE5ldyBmdW5jdGlvbiwgbGlrZSBhc19iYWQgYnV0IHRha2luZyBhIGZpbGUgbmFtZQotCWFuZCBsaW5lIG51bWJlci4KLQkqIGFzLmggKGFzX2JhZF93aGVyZSk6IERlY2xhcmUuCi0JKGFzX3doZXJlKTogQ2hhbmdlIHByb3RvdHlwZSBmb3IgbmV3IGFyZ3VtZW50cy4KLQkqIHdyaXRlLmggKGZpeFMpOiBBZGRlZCBmaWVsZHMgZnhfZmlsZSBhbmQgZnhfbGluZS4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBTYXZlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGluIGZpeC4KLQkoZml4dXBfc2VnbWVudCk6IFVzZSBhc19iYWRfd2hlcmUsIG5vdCBhc19iYWQuCi0JKiBpbnB1dC1maWxlLmMgKGZfaW4sIGZpbGVfbmFtZSk6IE1hZGUgc3RhdGljLgotCSogY29uZC5jIChzdHJ1Y3QgZmlsZV9saW5lKTogSnVzdCB1c2UgZmlsZSBhbmQgbGluZSBmaWVsZHMuCi0JKHNfZWxzZSk6IFVzZSBhc193aGVyZSBhbmQgYXNfYmFkX3doZXJlLCBub3QgZ2V0X2ZpbGVfbGluZSBhbmQKLQlzZXRfZmlsZV9saW5lLgotCShnZXRfZmlsZV9saW5lLCBzZXRfZmlsZV9saW5lKTogUmVtb3ZlZC4KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogVXNlIGFzX3doZXJlLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogVXNlIGFzX3doZXJlLgotCSogY29uZmlnL29iai1lY29mZi5jIChhZGRfZmlsZSk6IFVzZSBhc193aGVyZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBVc2UgYXNfd2hlcmUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IFVzZSBhc19iYWRfd2hlcmUuCi0JKiBjb25maWcvdGMtbWlwcy5jICh0Y19nZW5fcmVsb2MpOiBVc2UgYXNfYmFkX3doZXJlLCBub3QgYXNzZXJ0LgotCi1UaHUgT2N0IDIxIDEyOjUyOjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5oOiBEb24ndCBkZWZpbmUgUkVHSVNURVJfUFJFRklYIG9yCi0JT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYIGlmIGVpdGhlciBpcyBhbHJlYWR5IGRlZmluZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBEZWxldGUgc29tZSBjb2RlIGluICIjaWYgMCIuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGJmZF9nYXMgZm9yIGFsbCBzcGFyYyB0YXJnZXRzLiAgQWRkZWQgZmFjaWxpdHkKLQlmb3Iga2VlcGluZyBvciByZWplY3RpbmcgY29uZmlndXJhdGlvbnMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQ7Ci0JZGVmYXVsdCBpcyB0byBhc3N1bWUgcHJvZHVjdGlvbiBlbnZpcm9ubWVudCwgYW5kIHJlamVjdCBjb25maWdzCi0Jc3RpbGwgYmVpbmcgd29ya2VkIG9uLiAgTWFyayBFbGYgY29uZmlndXJhdGlvbnMgKGV4Y2VwdCBzcGFyYyBhbmQKLQlpMzg2KSBhcyBkZXZlbG9wbWVudGFsLiAgRGVsZXRlZCBjYXNlcyBtYXRjaGluZyBzb21lIGdlbmVyaWMgbmFtZXMKLQlpbiBmYXZvciBvZiBtb3JlIHNwZWNpZmljIG5hbWVzLiAgKEUuZy4sIHdoZW4gd2UgZ2V0IEFscGhhCi0Jc3VwcG9ydCwgd2UnbGwgc3RpbGwgb25seSBzdXBwb3J0IFZNUyBmb3IgVmF4LikKLQotCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2VuZCk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9lbmQpOiBGdW5jdGlvbiBkZWxldGVkLgotCShCRkRfUkVMT0NfKik6IERlbGV0ZSBtYWNyb3MgdGhhdCB1c2VkIHRvIGhlbHAga2VlcCB0aGUgbm9uLWJmZAotCXZlcnNpb24gY29tcGlsaW5nLiAgQWxsIHNwYXJjIHRhcmdldHMgd2lsbCB1c2UgYmZkIG5vdy4KLQkqIHRjLmggKG1kX2VuZCk6IERvbid0IGRlY2xhcmUgaWYgaXQncyBkZWZpbmVkIGFzIGEgbWFjcm8uCi0KLQlDaGFuZ2VzIGZyb20gSmVmZiBMYXcgYW5kIFBldGVyIEhvb2dlbmJvb206Ci0KLQkqIHJlYWQuYyAobmV4dF9jaGFyX29mX3N0cmluZyk6IExpbWl0IG9jdGFsIGNoYXJhY3RlciBjb25zdGFudHMgdG8KLQl0aHJlZSBkaWdpdHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IE1ham9yIGNsZWFudXAuICBVc2UgR05VLXN0eWxlIGNvbW1lbnRzLiAgV2FybgotCWFnYWluc3QgcGxhY2luZyBhZGRpdGlvbmFsIG9iamVjdC1maWxlIGRlcGVuZGVudCBjb2RlIGhlcmUuICBXYXJuCi0JYWdhaW5zdCBjb250YW1pbmF0aW5nIGFsbCBvZiBHQVMgd2l0aCB0aGUgaW50ZXJuYWxzIG9mIHRjLWhwcGEuYwotCXRocm91Z2ggaW5jbHVzaW9uIG9mIHRjLWhwcGEuaC4gIERlbGV0ZSBhbGwgZm9yd2FyZCBkZWNsYXJhdGlvbnMKLQlmb3IgZnVuY3Rpb25zIG9ubHkgdXNlZCB3aXRoaW4gdGMtaHBwYS5jLCBsaWtld2lzZSBmb3Igc3RydWN0dXJlcywKLQl2YXJpYWJsZXMsIGFuZCAjZGVmaW5lcy4gIFRyeSB0byBncm91cCBPQkpfRUxGIGFuZCBPQkpfU09NCi0JY29uZGl0aW9uYWwgY29kZSBpbiBhIGZldyBzbWFsbCBwbGFjZXMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IE1ham9yIGNsZWFudXAuICBVc2UgR05VLXN0eWxlIGNvbW1lbnRzLiAgR3JvdXAKLQlzdHJ1Y3R1cmVzLCBnbG9iYWwgdmFyaWFibGVzLCBmb3J3YXJkIGRlY2xhcmF0aW9ucyB0b2dldGhlci4KLQlSZWR1Y2UgKG9yIGluIHNvbWUgY2FzZXMgZWxpbWluYXRlKSBPQkpfRUxGIGFuZCBPQkpfU09NCi0JY29uZGl0aW9uYWwgY29kZSAtLSB0cnkgdG8gZ3JvdXAgY29uZGl0aW9uYWwgY29kZSB0b2dldGhlcgotCWludG8gYSBmZXcgcGxhY2VzLiAgIE1ha2UgYWxsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIHdoaWNoCi0JYXJlIG9ubHkgdXNlZCB3aXRoaW4gdGMtaHBwYS5jIHN0YXRpYy4gIFBBUkFNaXplIGFsbCBmdW5jdGlvbnMuCi0JQWRkIGNvbW1lbnRzIHRvIGZ1bmN0aW9ucy4gIERlbGV0ZSB1bnVzZWQgZnVuY3Rpb25zLCB2YXJpYWJsZXMsCi0JI2RlZmluZXMsIGV0Yy4gIERlbGV0ZSB1bnVzZWQgbWVtYmVycyB3aXRoaW4gc3RydWN0dXJlcy4gIERlbGV0ZQotCWxkaWw7YmxlIGhhY2tzIC0tIGl0IGlzIGJlbGlldmVkIHRoZXkgd2VyZSBpbnN0YWxsZWQgdG8gd29yawotCWFyb3VuZCBvbGQgZ2FzIGJ1Z3MuICAgQXZvaWQgdXNpbmcgbWl4ZWQgY2FzZSBmb3IgbG9jYWwKLQlmdW5jdGlvbnMsIHZhcmlhYmxlcywgYW5kIHN0cnVjdHVyZXMuICBGaXggZm9ybWF0dGluZyBwcm9ibGVtcwotCW5vdCBmb3VuZCBieSBHTlUtaW5kZW50LiAgQWRkIEZJWE1FIG5vdGljZXMgZm9yIHRoaW5ncyB3aGljaAotCXNob3VsZCBiZSB3b3JrZWQgb24gdGhlIG5lYXIgZnV0dXJlLiAgRGVsZXRlIGxvdHMgb2Ygb2xkCi0JdXNlbGVzcyAoMS4zNiBQQS1TT00pIGNvZGUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IChmaXhfbmV3X2hwcGEpOiBJbml0aWFsaXplIHRoZSBmeF9yX3R5cGUKLQlmaWVsZCBvZiB0aGUgZml4UyBzdHJ1Y3R1cmUuICBOZWVkZWQgdG8gYnVpbGQgdW53aW5kCi0JZGVzY3JpcHRvcnMgY29ycmVjdGx5LgotCi0JKiB3cml0ZS5jOiAoZml4dXBfc2VnbWVudCk6IEFsbG93IGV4cHJlc3Npb25zIHN1Y2ggYXMKLQlzeW0xLXN5bTIrY29uc3QgYXMgbG9uZyBhcyBzeW0yIGlzICRnbG9iYWwkLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFByb3ZpZGUgYSBob29rIHNvIHRoYXQgYSB0YXJnZXQKLQljcHUgY29uZmlndXJhdGlvbiBjYW4gcmVqZWN0IGNlcnRhaW4gcmVsb2NhdGlvbiByZWR1Y3Rpb25zLgotCSogdGMtaHBwYS5oICh0Y19maXhfYWRqdXN0YWJsZSk6IE5ldyBtYWNyby4gIE9ubHkgYWNjZXB0IHJlbG9jYXRpb25zCi0Jd2hpY2ggZG8gbm90IGludm9sdmUgZnVuY3Rpb24gc3ltYm9scy4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogUmVpbmRlbnQgd2l0aCBHTlUtaW5kZW50LiAgRGVsZXRlIHJlZmVyZW5jZXMKLQl0byBPQkpfT1NGUk9TRS4gIEZpeCB0eXBvcyAoT0JKX1NPTUUgLT4gT0JKX1NPTSkuICBEZWxldGUgdW51c2VkCi0JU1RBQl9GSVhVUCBtYWNyby4KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXhfMSk6IFVzZSBlbGZfc3ltYm9sX3R5cGUsIGluc3RlYWQKLQlvZiBlbGYzMl9zeW1ib2xfdHlwZS4KLQkocGFfZXhwb3J0X2FyZ3MpOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShwYV9kZXNjKTogRG8gbm90IGNhbGwgb2JqX2VsZl9kZXNjLiAgKElzIHBhX2Rlc2MgZXZlbiBuZWVkZWQKLQlhbnltb3JlPykKLQkoaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogRG8gbm90IGRlY2xhcmUgZWxmX2dldF9zeW10YWJfbWFwIGFueQotCW9yZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYzogKG1kX3NlY3Rpb25fYWxpZ24pOiBBbGlnbiBhbGwgc2VjdGlvbnMgdG8KLQlhIG11bHRpcGxlIG9mIHRoZSBzZWN0aW9uIGFsaWdubWVudCByYXRoZXIgdGhhbiBhbHdheXMgYQotCW11bHRpcGxlIG9mIDguCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfc3ltYm9sKTogSWYgdGhlIGFyZ3VtZW50IHJlbG9jYXRpb24KLQliaXRzIGFyZSB6ZXJvIChlZyB0aGV5IHNwZWNpZnkgbm8gcmVsb2NhdGlvbnMpLCB0aGVuIGRvIG5vdCBldmVuCi0JYm90aGVyIGFkZGluZyB0aGVpciBlbnRyaWVzIHRvIHRoZXN5bWV4dG4gc2VjdGlvbi4KLQotVGh1IE9jdCAyMSAxNTo0NDo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgYW5kIGlnbm9yZSAtc3BhcmMKLQlvcHRpb24sIHdoaWNoIGlzIHVzZWQgYnkgdGhlIFN1bk9TIG1ha2UgZGVmYXVsdCAucy5vIHJ1bGUuCi0KLVdlZCBPY3QgMjAgMTI6MjY6MzMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCwgbGFiZWwgImltbWVkaWF0ZSIpOiBDb252ZXJ0IHJlbG9jcwotCW9wZXJhdGluZyBvbiB1cHBlciAzMiBiaXRzIG9mIGltbWVkaWF0ZSBjb25zdGFudHMgdG8gbG93ZXItaGFsZgotCXJlbG9jcyB3aXRoIGFkanVzdGVkIGNvbnN0YW50cy4KLQotVHVlIE9jdCAxOSAxODoxMzoyNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKEFPVVRfTUFDSFRZUEUpOiBEZWZpbmUgdG8gYmUgZXh0ZXJuYWwgdmFyaWFibGUKLQltNjhrX2FvdXRfbWFjaHR5cGUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChvbWFnaWMpOiBSZW1vdmUgb2Jzb2xldGUgYW5kIHVudXNlZCB2YXJpYWJsZS4KLQkobTY4a19hb3V0X21hY2h0eXBlKTogTmV3IHZhcmlhYmxlLCBpZiBPQkpfQU9VVC4KLQkobWRfYXNzZW1ibGUpOiBJbml0aWFsaXplIG02OGtfYW91dF9tYWNodHlwZSBiYXNlZCBvbgotCWN1cnJlbnRfYXJjaGl0ZWN0dXJlLCBpZiBPQkpfQU9VVC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZSB0byBvbWFnaWMuCi0KLVRodSBPY3QgMTQgMTY6NTE6MDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBJZ25vcmUgLmxpdmVyZWcgcHNldWRvLW9wLgotCShzX29wdGlvbik6IElnbm9yZSAub3B0aW9uIE8qIGFuZCAub3B0aW9uIHBpYyouCi0JKHNfZW50KTogU2tpcCB3aGl0ZXNwYWNlIGJldHdlZW4gc3ltYm9sIGFuZCBvcHRpb25hbCBkaWdpdC4KLQkobXlfZ2V0U21hbGxFeHByZXNzaW9uKTogSGFuZGxlICgkeHgpIGNvcnJlY3RseTogYXNzdW1lIDAoJHh4KS4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFsd2F5cyBhY2NlcHQgJ3gnIGFuZCAnWCcgYXMgZXNjYXBlCi0JY2hhcmFjdGVycyBpbiBzdGF0ZSA2LgotCSogcmVhZC5jIChuZXh0X2NoYXJfb2Zfc3RyaW5nKTogQWNjZXB0IFxYaCogYW5kIFx4aCogd2hlcmUgaCogYXJlCi0JaGV4aWRlY2ltYWwgZGlnaXRzLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXhfMSk6IE1ha2UgY3Jvc3Mgc2VnbWVudCBjYWxscyB3b3JrCi0JZm9yIEVMRiBieSBoYWNraW5nIGFyb3VuZCBiaXphcnJlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gYmVoYXZpb3VyCi0JdGhhdCBJIGRvbid0IGRhcmUgY2hhbmdlLgotCi1UaHUgT2N0IDE0IDExOjMzOjI1IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiAobWRfYmVnaW4pOiBEbyBub3QgemVybyBzdGF0aWMgYXJyYXlzLiAgRG9uJ3QKLQljYWxsIHN0cmNociBmb3IgZWFjaCBjaGFyYWN0ZXIgdG8gc2VlIGlmIGl0IGlzIGEgc3BlY2lhbCBjaGFyLAotCWluc3RlYWQgYWRkIGEgc2Vjb25kIGxvb3Agb3ZlciBzcGVjaWFsX2NoYXJzLiAgU2V0IGFsaWdubWVudAotCW9mIHRleHQsIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB0byA0LgotCShwaSwgdGUsIHB0LCBwZSwgcHMpOiBBZGQgZGVjbGFyYXRpb25zIHNvIHRoYXQgREVCVUczODYgY2FuIGJlCi0JdXNlZCBhZ2Fpbi4KLQkocmVsb2MpOiBEb24ndCByZXR1cm4gOCBhbmQgMTYgYml0IG5vbi1QQyByZWxhdGl2ZSByZWxvY2F0aW9ucyBvbgotCUVMRiwgc2luY2UgdGhlIEVMRiBvYmplY3QgZm9ybWF0IGRvZXMgbm90IGhhdmUgdGhlc2UgdHlwZSBvZgotCXJlbG9jYXRpb25zLiAgQ2hhbmdlIHRoZSBhYm9ydCBpbnRvIGFzIGFzX2JhZCBhbmQgcmV0dXJuCi0JQkZEX1JFTE9DX05PTkUgdG8gc2lsZW5jZSBjb21waWxlciB3YXJuaW5ncy4KLQkobWRfYXNzZW1ibGUpOiBLZWVwIHRyYWNrIG9mIHRoZSBpbnN0cnVjdGlvbiBzaXplLiAgQWxsb3cgd2hpdGUKLQlzcGFjZSBiZXR3ZWVuIHRoZSAkIGFuZCB0aGUgY29uc3RhbnQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlcgotCWdhc2VzIGFuZCBvdGhlciBhc3NlbWJsZXJzLgotCShpMzg2X29wZXJhbmQpOiBTa2lwIHNwYWNlcyBiZXR3ZWVuICQgYW5kIGV4cHJlc3Npb24uCi0JKHRjX2dlbl9yZWxvYyk6IERvbid0IGFsbG93IGFueXRoaW5nIGJ1dCAzMiBiaXQgcmVsb2NhdGlvbnMgb24KLQlFTEYuICBDb252ZXJ0IGFib3J0IGludG8gYW4gYXNfYmFkIGFuZCBhc3NlcnQgaW50byBhc19mYXRhbC4KLQotV2VkIE9jdCAxMyAxNjo1MDo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaXh1cF9zZWdtZW50KSBbRElGRl9FWFBSX09LXTogSWYKLQlzdWJfc3ltYm9sUCBpcyBpbiB0aGUgY3VycmVudCBzZWdtZW50LCBjb252ZXJ0IHRvIGEgUEMtcmVsYXRpdmUKLQlmaXh1cCBhbmQgZGlzY2FyZCB0aGUgc3ltYm9sLgotCi1XZWQgT2N0IDEzIDE0OjAwOjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogSGFuZGxlIHN0X0VuZCBzeW1ib2wKLQlmb3Igc3RfU3RhdGljUHJvYyBqdXN0IGxpa2Ugc3RfUHJvYy4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzKTogTW92ZWQgI2VuZGlmIGZvciBPQkpfQk9VVAotCXNvIHRoYXQgT0JKX0JPVVQgZG9lc24ndCBmb3JnZXQgdG8gYWRqdXN0IGFsbCB0aGUgZnJhZ21lbnRzIGluIHRoZQotCS5ic3Mgc2VjdGlvbi4KLQotVHVlIE9jdCAxMiAxNzoyNjoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IElmIE9CSl9FTEYsIGluY2x1ZGUgZWxmL21pcHMuaC4KLQkobWlwc19yZWdtYXNrX2ZyYWcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLCBpZiBPQkpfRUxGLgotCShtZF9iZWdpbik6IElmIE9CSl9FTEYsIGNyZWF0ZSAucmVnaW5mbyBzZWN0aW9uIGFuZCBzZXQKLQltaXBzX3JlZ21hc2tfZnJhZyB0byBhIGZyYWcuCi0JKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb24sIGlmIE9CSl9FTEYuICBTZXQKLQltaXBzX3JlZ21hc2tfZnJhZyB0byByZWdpc3RlciBtYXNrIGluZm9ybWF0aW9uLgotCSogY29uZmlnL3RjLW1pcHMuaCAoZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcpOiBOZXcgbWFjcm8sIGRlZmluZWQKLQlpZiBPQkpfRUxGLgotCi1UdWUgT2N0IDEyIDAzOjMzOjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYyAoYXNfZmF0YWwpOiBVc2UgbXluYW1lIHdoZW4gcHJpbnRpbmcgbWVzc2FnZXMuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX2JlZ2luKTogVXNlIG51bGwgcG9pbnRlciwgbm90IGVtcHR5IHN0cmluZywKLQlhcyBpbml0aWFsICJyZXR1cm4iIHZhbHVlIGluIGNhc2UgaGFzaGluZyBpc24ndCBuZWVkZWQuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2F0b2YpOiBSZXR1cm4gbnVsbCwgbm90IGVtcHR5IHN0cmluZywgb24KLQlzdWNjZXNzLgotCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX2F0b2YpLCBjb25maWcvdGMtaDg1MDAuYyAobWRfYXRvZiksCi0JY29uZmlnL3RjLWhwcGEuYyAobWRfYXRvZiksIGNvbmZpZy90Yy1pODYwLmMgKG1kX2F0b2YpLAotCWNvbmZpZy90Yy1pOTYwLmMgKG1kX2F0b2YpLCBjb25maWcvdGMtbTg4ay5jIChtZF9hdG9mKSwKLQljb25maWcvdGMtbnMzMmsuYyAobWRfYXRvZiksIGNvbmZpZy90Yy1zaC5jIChtZF9hdG9mKTogRGl0dG8uCi0KLU1vbiBPY3QgMTEgMTY6NDY6MzEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCWZpeCBmb3IgcHIgMzU3MQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGdldF9zcGVjaWZpYyk6IFNwZWNpYWwgYWN0aW9uIGlmIDggYml0Ci0JYWRkcmVzcyBzZWVuLiAoY2hlY2tfb3BlcmFuZCk6IERvbid0IGNvbXBsYWluIGlmIHRydW5jYXRpbmcgdG9wCi0JYml0cyBvZiBhbiA4IGJpdCBhZGRyZXNzLiAgKGJ1aWxkX2J5dGVzKTogQWxsb3cgYW4gaW1tZWRpYXRlIGFuZAotCWFuIGFic29sdXRlIGluIHRoZSBzYW1lIGluc24uCi0KLU1vbiBPY3QgMTEgMTc6MTg6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IERvbid0IGNyYXNoIGlmIHNlZ2luZm8gaXMgTlVMTC4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBXcml0ZSBvdXQgcmVnaXN0ZXIgbWFza3MKLQlieSBtb2RpZnlpbmcgLnJlZ2luZm8gc2VjdGlvbiwgbm90IGJ5IGRpcmVjdGx5IG1vZGlmeWluZyBCRkQKLQliYWNrZW5kIGRhdGEuCi0KLU1vbiBPY3QgMTEgMTQ6MTE6MzIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tc3Vub3MuaDogcmVtb3ZlIGV4dGVybiB0aW1lIGRlY2xhcmF0aW9uCi0KLU1vbiBPY3QgMTEgMTY6MTQ6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jIChhc19mYXRhbCk6IERvIG1lbnRpb24gdGhhdCBpdCdzIHRoZSBhc3NlbWJsZXIgdGhhdAotCWdvdCB0aGUgZmF0YWwgZXJyb3IuCi0KLUZyaSBPY3QgIDggMTQ6MDk6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2dwcm1hc2ssIG1pcHNfY3BybWFzayk6IE5ldyB2YXJpYWJsZXMgdG8KLQlob2xkIHJlZ2lzdGVyIG1hc2tzLgotCShtZF9iZWdpbik6IEluaXRpYWxpemUgdGhlbSB0byB6ZXJvLgotCShhcHBlbmRfaW5zbik6IFVwZGF0ZSBtaXBzX2dwcm1hc2sgYW5kIG1pcHNfY3BybWFzay4gIEFsc28gYWRkCi0JcmVnaXN0ZXIgdmFyaWFibGVzIHBpbmZvIGFuZCBwcmV2X3BpbmZvLgotCSogY29uZmlnL3RjLW1pcHMuaCAobWlwc19ncHJtYXNrLCBtaXBzX2Nwcm1hc2spOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBJZiBUQ19NSVBTLCBzZXQgZ3BybWFzawotCWFuZCBjcHJtYXNrIGZyb20gbWlwc19ncHJtYXNrIGFuZCBtaXBzX2Nwcm1hc2suCi0KLQkqIGNvbmZpZy90Yy1taXBzLmg6IERlZmluZSBUQVJHRVRfRk9STUFUIGlmIE9CSl9FTEYuCi0JKiBjb25maWcvdGMtbWlwcy5jIChHUE9QVCk6IERlZmluZSBpZiBPQkpfRUNPRkYgb3IgT0JKX0VMRi4KLQkodmFyaW91cyk6IENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBHUCByZWZlcmVuY2VzIHRvIGFwcGx5IGlmCi0JR1BPUFQsIG5vdCBpZiBPQkpfRUNPRkYuCi0JKHNfY2hhbmdlX3NlYyk6IFJlYXJyYW5nZSBzb21ld2hhdC4gIElmIE9CSl9FTEYsIHVzZSAucm9kYXRhCi0JaW5zdGVhZCBvZiAucmRhdGEuICBJZiBPQkpfRUxGLCBzZXQgc2VjdGlvbiBmbGFncyBmb3IgLnJvZGF0YSBhbmQKLQkuc2RhdGEgc2VjdGlvbnMuCi0JKHNfZnJhbWUsIHNfbG9jLCBzX21hc2spOiBDb21tZW50IG91dCBlbnRpcmUgZnVuY3Rpb25zLCByYXRoZXIKLQl0aGFuIGp1c3QgYm9keS4gIFRoZXkncmUgbm90IHVzZWQgYW55aG93LgotCSogY29uZmlndXJlLmluOiBTZXQgY3B1X3R5cGUgdG8gbWlwcyBmb3IgbWlwcyouICBBY2NlcHQKLQltaXBzLSotZWxmbCogYW5kIG1pcHMtKi1lbGYqLgotCi1UaHUgT2N0ICA3IDE4OjM2OjI5IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IEFsbG93IHRoZSBhbGlnbm1lbnQgZmllbGQgdG8KLQlub3QgYmUgc3BlY2lmaWVkLgotCi1XZWQgT2N0ICA2IDEzOjAxOjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoY29uc19maXhfbmV3X21pcHMpOiBOZXcgZnVuY3Rpb24uICBUdXJuCi0JQkZEX1JFTE9DXzY0IGludG8gQkZEX1JFTE9DXzMyLgotCSogY29uZmlnL3RjLW1pcHMuaCAoVENfQ09OU19GSVhfTkVXKTogRGVmaW5lLgotCShjb25zX2ZpeF9uZXdfbWlwcyk6IERlY2xhcmUuCi0KLQlDaGFuZ2VzIHRvIGxldCBjb25zIGhhbmRsZSBiaWdudW1zIGxpa2UgZ2VuZXJhbCBleHByZXNzaW9ucy4KLQkqIGV4cHIuaCAoZXhwcmVzc2lvblMpOiBOZXcgZmllbGQgWF91bnNpZ25lZC4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEluaXRpYWxpemUgWF91bnNpZ25lZCB0byAxLiAgU2V0IGl0IHRvIDAgZm9yCi0JdW5hcnkgbWludXMgY2FzZS4KLQkoZXhwcikgRml4IHR5cG8gcmVzdWx0UCB0byByaWdodCBpZiBtaXNzaW5nIG9wZXJhbmQuICBTZXQKLQlYX3Vuc2lnbmVkIHRvIDEgd2hlbiBidWlsZGluZyBuZXcgZXhwcmVzc2lvbi4KLQkqIHJlYWQuYyAocG90YWJsZSk6IE1ha2UgIm9jdGEiIGFuZCAicXVhZCIgY2FsbCBjb25zLCBub3QKLQliaWdfY29ucy4KLQkoY29ucyk6IEhhbmRsZSBiaWdudW1zLiAgSWYgZ2l2ZW4gYW4gT19jb25zdGFudCAoc21hbGwgaW50ZWdlcikgdG8KLQlmaWxsIGEgYmlnIHNwYWNlLCB0dXJuIGl0IGludG8gYSBiaWdudW0uCi0JKHBhcnNlX2JpdGZpZWxkX2NvbnMpOiBTZXQgWF91bnNpZ25lZCBmaWVsZC4KLQkoYmlnbnVtX2xvdywgYmlnbnVtX2xpbWl0LCBiaWdudW1faGlnaCwgZ3Jvd19iaWdudW0sIGJpZ19jb25zKToKLQlSZW1vdmVkLgotCSogcmVhZC5oIChiaWdfY29ucyk6IFJlbW92ZSBwcm90b3R5cGUuCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogRG9uJ3QgZ2l2ZSBhIHdhcm5pbmcgaWYgYQotCXN5bWJvbCBpbiBleHByX3NlY3Rpb24gY2FuIG5vdCBiZSByZXNvbHZlZC4KLQkoU19TRVRfVkFMVUUpOiBDbGVhciBYX3Vuc2lnbmVkLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiByZXNvbHZlX3N5bWJvbF92YWx1ZSBmYWlsZWQgb24gYQotCXN5bWJvbCB3ZSBhcmUgd3JpdGluZyBvdXQsIGdpdmUgYSB3YXJuaW5nLgotCSogY29uZmlnL3RjLWg4NTAwLmMgKHBhcnNlX3JlZ2xpc3QpOiBTZXQgWF91bnNpZ25lZC4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IENoYW5nZSAib2N0YSIgYW5kICJxdWFkIiB0bwotCWNhbGwgcGFfY29ucywgbm90IHBhX2JpZ19jb25zLgotCShwYV9iaWdfY29ucyk6IFJlbW92ZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHBhX2JpZ19jb25zKTogUmVtb3ZlIGRlY2xhcmF0aW9uLgotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfcHNldWRvX3RhYmxlKTogQ2hhbmdlICJxdWFkIiB0byBjYWxsIGNvbnMsCi0Jbm90IGJpZ19jb25zLgotCi1UdWUgT2N0ICA1IDEwOjUzOjM2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogZG9jL2FzLnRleGluZm8gKENvcHlpbmcpOiBuZXcgbm9kZSwgdG8gaGFuZGxlIHRoZSByZWNlbnQgY2hhbmdlcwotCWluIHRoZSB0ZXhpbmZvL2dwbC50ZXhpbmZvIGZpbGUKLQotTW9uIE9jdCAgNCAxNzoxMDoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoYmlnX2NvbnMpOiBIYW5kbGUgIjAiIGNvcnJlY3RseS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBTZXQgdGFyZ2V0X2JpZ19lbmRpYW4gY29ycmVjdGx5LgotCi1Nb24gT2N0ICA0IDE1OjM3OjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IE1vZGUgNy4zIG9wZXJhbmQgdXNpbmcgUEMgc2hvdWxkCi0JaGF2ZSBwYy1yZWxhdGl2ZSBmaXh1cC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTW92ZSAiLWsiIGNhc2UgZG93biBuZWFyICItcGljIiBjYXNlLgotCi0JKiBjb25maWd1cmUuaW46IEFscGhhYmV0aXplIGxpc3Qgb2YgY3B1IHR5cGUgYWx0ZXJuYXRpdmVzLiAgRW5hYmxlCi0JT1MgdmFsdWVzIG9mICJsaW51eCplbGYqIiBhbmQgImxpbnV4KmNvZmYqIiB0byBzZWxlY3QgdGhvc2UKLQlmb3JtYXRzLCB3aXRoIGxpbnV4IGVtdWxhdGlvbi4gIERvbid0IGJvdGhlciBjaGVja2luZyBmb3IgdXBwZXItCi0Jb3IgbWl4ZWQtY2FzZSB2ZXJzaW9ucyBvZiAib3NlIi4KLQotVGh1IFNlcCAzMCAxMTowNTozNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvejhrLmMgKG1kX3BzZXVkb190YWJsZSk6IGFkZCAidW5zZWciLgotCi1XZWQgU2VwIDI5IDE2OjE1OjExIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL204OGstb3Bjb2RlLmggKG04OGtfb3Bjb2Rlcyk6IGNvcnJlY3QgYSBmZXcgbWlzdGFrZXMKLQkgIGZvdW5kIHdoaWxlIGV4dGVuZGluZyB0aGUgZGlzc2Fzc2VtYmxlci4KLQotVHVlIFNlcCAyOCAxMjowMjowNCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3BsaXQgaTM4NiBMeW54T1Mgb3V0IGZyb20gb3RoZXIgY29mZiB0YXJnZXRzLAotCWFkZCBhIHNwZWNpZmljIEx5bnggZW11bGF0aW9uLgotCUFkZCBtNjhrIEx5bnhPUyB0YXJnZXQuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBEZWZpbmUgc3BlY2lmaWMgTHlueCB0YXJnZXQgZm9ybWF0LgotCSogY29uZmlnL3RjLW02OGsuYzogRGVmaW5lIHNwZWNpZmljIEx5bnggdGFyZ2V0IGZvcm1hdC4KLQkqIGNvbmZpZy90ZS1seW54Lmg6IE5ldyBmaWxlLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaDogRG9uJ3Qgc2V0IFRBUkdFVF9GT1JNQVQgdG8gYmUKLQkiY29mZi17aTM4NixtNjhrfSIgaWYgVEFSR0VUX0ZPUk1BVCBhbHJlYWR5IGRlZmluZWQuCi0JKElOSVRfU1RBQl9TRUNUSU9OKTogRGVmaW5lLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IEluY2x1ZGUgPHRpbWUuaD4uCi0JKHdyaXRlX29iamVjdF9maWxlKTogTG9vayBmb3IgLnN0YWIgc2VjdGlvbnMgYW5kIGNhbGwKLQlhZGp1c3Rfc3RhYl9zZWN0aW9uLgotCShhZGp1c3Rfc3RhYl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLCBmaWxscyBpbiB0aGUgZmlyc3Qgc3ltYm9sCi0Jb2YgYSBzdGFiIHNlY3Rpb24gd2l0aCBudW1iZXIgb2Ygc3ltYm9scyBhbmQgc3RyaW5nIHRhYmxlIHNpemUuCi0JKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLCBjcmVhdGVzIHRoZSBpbml0aWFsCi0Jc3ltYm9sIGZvciBhIHN0YWIgc2VjdGlvbi4KLQotTW9uIFNlcCAyNyAxNToyMTo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9hdG9mLXZheC5jIChtZF9hdG9mKTogUmV0dXJuIG51bGwgb24gc3VjY2VzcyBpbnN0ZWFkIG9mCi0JZW1wdHkgc3RyaW5nLgotCSogY29uZmlnL2F0b2YtdGFob2UuYyAobWRfYXRvZik6IERpdHRvLgotCSogcmVhZC5jIChmbG9hdF9jb25zKTogRXhwZWN0IGEgbnVsbCBwb2ludGVyIGZvciBzdWNjZXNzLCBub3QgYW4KLQllbXB0eSBzdHJpbmcuCi0KLQkqIGhhc2guYyAoaGFzaF9pbnNlcnQsIGhhc2hfamFtLCBoYXNoX2dyb3cpOiBSZXR1cm4gbnVsbCBwb2ludGVyCi0Jb24gc3VjY2VzcywgaW5zdGVhZCBvZiBlbXB0eSBzdHJpbmcuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCi0JKiBjb25maWcvdGMtdmF4LmM6IFVzZSBQQVJBTVMgaW4gZGVjbGFyYXRpb25zLgotCSh2aXBfb3ApOiBVc2UgTlVMTCBpbnN0ZWFkIG9mIGVtcHR5IHN0cmluZyBmb3Igc3VjY2VzcyBpbiBlcnJvcgotCWFuZCB3YXJuaW5nIGZpZWxkcy4KLQotU3VuIFNlcCAyNiAyMzo0NToyOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAoZXhwcikgW0RJRkZfRVhQUl9PS106IFBlcm1pdCBzdWJ0cmFjdGlvbiBvZiB0d28gc3ltYm9scwotCWluIGRpZmZlcmVudCBkZWZpbmVkIHNlZ21lbnRzLgotCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogTG9jYWxpemUgImFpbSIgdmFyaWFibGUuICBJZgotCURJRkZfRVhQUl9PSywgZG9uJ3QgaW1wb3NlIGNoZWNrcyBvbiBzeW1ib2wgc2VnbWVudCB0eXBlcy4KLQkoZml4dXBfc2VnbWVudCkgW0RJRkZfRVhQUl9PS106IElmIHN1Yl9zeW1ib2xQIGlzIGluIHRoZSBjdXJyZW50Ci0Jc2VnbWVudCwgY29udmVydCB0byBhIFBDLXJlbGF0aXZlIGZpeHVwIGFuZCBkaXNjYXJkIHRoZSBzeW1ib2wuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGZsYWdfd2FudF9waWMpOiBOZXcgdmFyaWFibGUsIG1vc3RseSBpZ25vcmVkLgotCShtZF9wYXJzZV9vcHRpb24pIFtURV9TVU4zXTogU2V0IGl0IGZvciAiLWsiLgotCShtNjhrX2lwKTogR2VuZXJhdGUgcHJvcGVyIGZpeHVwIGZvciBtb2RlIDcuMy4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKERJRkZfRVhQUl9PSyk6IERlZmluZS4KLQotU2F0IFNlcCAyNSAwNTowODoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHN0cnVjdCBtNjhrX2luY2FudCwgZ2V0b25lLCBnZXR0d28pOiBNb3ZlZAotCWVhcmxpZXIgaW4gdGhlIGZpbGUuCi0JKGluc29wLCBhZGRfZXhwKTogTm93IGRlZmluZWQgYXMgZnVuY3Rpb25zLCBmb3IgcmVhZGFiaWxpdHkuCi0JKGluc29wKTogTm93IHRha2VzIHR3byBhcmd1bWVudHM7IGNhbGxlcnMgY2hhbmdlZC4KLQotRnJpIFNlcCAyNCAxMjozNzo1OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tODhrLmMgKGdldF9vNik6IG5ldyBmdW5jdGlvbi4KLQkgIChnZXRfYmYsIGdldF9jbXAsIGdldF9jbmQsIGdldF9jciwgZ2V0X2ZjciwgZ2V0X2ltbTE2LCBnZXRfcmVnLAotCSAgZ2V0X3ZlYzksIGdldHZhbCwgZ2V0X3BjciwgY2FsY29wLCBtYXRjaF9uYW1lKTogbWFrZSBzdGF0aWMgYW5kCi0JICBwcm90b3R5cGUuCi0JICAoc19maWxlKTogcmVtb3ZlIGV4dHJhbmVvdXMgZm9yd2FyZCBkZWNsLgotCSAgKG1kX2JlZ2luKTogYWRkIGNvbnN0IHRvIHJldHZhbCBkZWNsLgotCSAgKGNhbGNvcCk6IGNvcGUgd2l0aCBpbnN0cnVjdGlvbnMgd2l0aG91dCBhcmd1bWVudHMuICBIYW5kbGUgJ28nCi0JICB0eXBlIGFyZ3VtZW50LCB0aGUgbzYgZmllbGQgb2YgdGhlIHByb3QgaW5zbi4KLQkgIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IHJldHVybiBhIGR1bW15IHZhbHVlLgotCi0JKiBjb25maWcvbTg4ay1vcGNvZGUuaCAobTg4a19vcGNvZGVzKTogY29tbWVudCBjaGFuZ2U7IG82IGZpZWxkIGlzCi0JICBpbiBiaXRzIDEwIHRocm91Z2ggNy4gIGZsdC5bZHhzXXMgcmVxdWlyZXMgYW4gciByZWdpc3RlciBpbiB0aGUKLQkgIHNlY29uZCBhcmd1bWVudC4gIE5ldyBpbnN0cnVjdGlvbiBsZGEueC4gIE5ldyBpbnN0cnVjdGlvbiBtdWxzCi0JICAoYWxpYXMgZm9yIG11bCkuCi0KLUZyaSBTZXAgMjQgMTM6NDM6MzAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVjdXJzZSBsaWtlIGNsZWFuLgotCSogZG9jL01ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBOZXcgdGFyZ2V0LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IFNldCBCRkQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lCi0JYmFzZWQgb24gTUlQUyBJU0EgbGV2ZWwuCi0KLVRodSBTZXAgMjMgMTc6NTg6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcy5jIChtYWluKTogImV4aGF1c3RlZCIsIG5vdCAiZXhodWFzdGVkIi4KLQotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpOiBBZGQgc3lfdXNlZF9pbl9yZWxvYyBmaWVsZC4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogU2V0IHN5X3VzZWRfaW5fcmVsb2MuCi0JKHdyaXRlX29iamVjdF9maWxlKTogTmV2ZXIgc3RyaXAgc3ltYm9scyB3aXRoIHN5X3VzZWRfaW5fcmVsb2MKLQlzZXQuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IFJld3JvdGUgdG8gaGFuZGxlIGJvdGgKLQlTb2xhcmlzIGFuZCBTVlI0IHN0eWxlIC5zZWN0aW9uIHBzZXVkby1vcHMuCi0JKG9ial9lbGZfaWRlbnQpOiBTZXQgU0VDX1JFQURPTkxZIGZvciAuY29tbWVudCBzZWN0aW9uLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCk6IElmIHRoaXMgaXMgRUxGLCBhbmQgd2UncmUKLQlnZW5lcmF0aW5nIGEgcmVsb2MsIGRvbid0IGFwcGx5IGEgZml4LgotCi1UaHUgU2VwIDIzIDEzOjE2OjU4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHJlbGF4X2FsaWduKTogTm93IHN0YXRpYy4KLQotTW9uIFNlcCAyMCAxOToyMzozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IE1ha2Ugbm9uLXN0YXRpYy4gIE1ha2UKLQlhcmd1bWVudHMgY29uc3QuICBEb24ndCBhbGlnbiBzdHJpbmdzIHRvIDQgYnl0ZSBib3VuZGFyaWVzLgotCSogcmVhZC5oOiBEZWNsYXJlIGdldF9zdGFiX3N0cmluZ19vZmZzZXQuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBTZXQgU0VDX0FMTE9DIGFzIHdlbGwgYXMKLQlTRUNfTE9BRCBmb3IgcHJvZ2JpdHMgc2VjdGlvbi4KLQkob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoYWRqdXN0X3N0YWJfc2VjdGlvbnMpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBjb25maWcvb2JqLWVsZi5oIChJTklUX1NUQUJfU0VDVElPTik6IENhbGwKLQlvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uLgotCShPQkpfUFJPQ0VTU19TVEFCKTogUmVtb3ZlZCBkZWZpbml0aW9uLgotCi1GcmkgU2VwIDE3IDE4OjEyOjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuaCAoU19HRVRfU0laRSk6IERlZmluZS4KLQkob2JqX2Zyb2JfZm9yd2FyZF9zeW1ib2wpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChsaW5lX2NvbW1lbnRfY2hhcnMpOiBJbml0aWFsaXplIGluIGFsbCBjYXNlcy4KLQotVGh1IFNlcCAxNiAxNDoyMzowOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHRjLmg6IERlY2xhcmUgdGNfZ2VuX3JlbG9jIGRpZmZlcmVudGx5IGRlcGVuZGluZyB1cG9uCi0JUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogT25seSBzZXQgZmxhZ3Mgd2hlbiBmaXJzdAotCWNyZWF0aW5nIHRoZSBzZWN0aW9uLgotCi1XZWQgU2VwIDE1IDEyOjE1OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGEgdHJhcCBpbnN0cnVjdGlvbgotCXdpdGggYSBicmFuY2guCi0KLVR1ZSBTZXAgMTQgMTM6MzE6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2RhdGEsIG9ial9lbGZfdGV4dCk6IE5ldyBmdW5jdGlvbnM7Ci0Jc2V0IHByZXZpb3VzX3NlY3Rpb24gYW5kIHByZXZpb3VzX3N1YnNlY3Rpb24gYW5kIHRoZW4gY2FsbCBzX2RhdGEKLQlhbmQgc190ZXh0LCByZXNwZWN0aXZlbHkuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgZGF0YSBhbmQgdGV4dC4KLQkob2JqX2VsZl9zZWN0aW9uKTogQWRkIFNFQ19MT0FEIHRvIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gb2YKLQlmbGFncy4gIFRyZWF0IC5yb2RhdGExIGxpa2UgLnJvZGF0YS4gIFNldCBTRUNfTE9BRCBhcyB3ZWxsIGFzCi0JU0VDX0FMTE9DIGZvciAiYWxsb2MiIHN0cmluZy4gIERvbid0IGJvdGhlciB0cnlpbmcgdG8gZmluZCB0aGUKLQlzZWN0aW9uOyBqdXN0IHVzZSBzdWJzZWdfbmV3LgotCi0JKiByZWFkLmMgKGNoYW5nZV90b19zZWN0aW9uKTogUmVtb3ZlZC4gIFRoaXMgaXMgbm93IGRvbmUgYnkKLQlzdWJzZWdfbmV3LgotCShnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogUmVhcnJhbmdlZCBzb21ld2hhdC4gIENyZWF0ZSB0aGUgc2VjdGlvbgotCXVzaW5nIHN1YnNlZ19uZXcuICBTdG9yZSB0aGUgc3RyaW5nIGluZGV4IGluIHNlZ19pbmZvLCByYXRoZXIgdGhhbgotCWluIGEgc3RhdGljIHZhcmlhYmxlLiAgRm9yY2UgdGhlIGZpcnN0IHN0cmluZyB0byBiZSBlbXB0eS4gIFVzZQotCWZyYWdfbW9yZSByYXRoZXIgdGhhbiBGUkFHX0FQUEVORF8xX0NIQVIuCi0JKHNfc3RhYl9nZW5lcmljKTogUmV3cm90ZS4KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBBZGRlZCBzdGFidSB1bmlvbi4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldyk6IEluaXRpYWxpemUgc3RhYl9zdHJpbmdfc2l6ZSB0byAwLgotCSogY29uZmlnL29iai1hb3V0LmM6IERvbid0IGluY2x1ZGUgYW91dC9zdGFiX2dudS5oLgotCShvYmpfYW91dF9zdGFiLCBvYmpfYW91dF9kZXNjKTogUmVtb3ZlZC4KLQkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgZGVzYyBhbmQgc3RhYlggZW50cmllcy4KLQkqIGNvbmZpZy9vYmotYm91dC5jOiBTYW1lIGNoYW5nZXMgYXMgY29uZmlnL29iai1hb3V0LmMuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoU19TRVRfVFlQRSk6IERlZmluZS4KLQkodGNfYm91dF9maXhfdG9fY2hhcnMpOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3N0YWIpOiBSZW1vdmVkLgotCShvYmpfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBkZXNjIGFuZCBzdGFiWCBlbnRyaWVzLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoY3VycmVudF9zdGFiX3N5bWJvbCk6IFJlbW92ZWQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAob2JqX3N5bWJvbF90eXBlKTogUmVtb3ZlZCBuX3N0cngsIG5fdHlwZSwKLQluX290aGVyLCBuX2Rlc2MgYW5kIG5fdmFsdWUgZmllbGRzLgotCShTX3tTLEd9RVRfe09GRlNFVCxPVEhFUixUWVBFLERFU0N9KTogUmVtb3ZlZC4KLQkoTUFLRV9TVEFCX1NZTUJPTCk6IFJlbW92ZWQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9lY29mZl9zdGFiKTogUmVuYW1lZCB0byBlY29mZl9zdGFiLgotCUNoYW5nZWQgYXJndW1lbnRzIGFuZCByZW1vdmVkIHBhcnNpbmcgY29kZS4KLQkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgc3RhYlggZW50cmllcy4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoZWNvZmZfc3RhYik6IERlY2xhcmUuCi0JKE9CSl9QUk9DRVNTX1NUQUIpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5jOiBEb24ndCBpbmNsdWRlIGFvdXQvc3RhYl9nbnUuaC4KLQkob2JqX2VsZl9zdGFiLCBvYmpfZWxmX3hzdGFiLCBvYmpfZWxmX2Rlc2MsCi0JZWxmX3N0YWJfc3ltYm9sX3N0cmluZywgZWxmX3N0YWJfc3ltYm9sLCBvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6Ci0JUmVtb3ZlZC4KLQkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgZGVzYywgc3RhYlggYW5kIHhzdGFicyBlbnRyaWVzLgotCShvYmpfZWxmX3ZlcnNpb24pOiBVc2Ugc3Vic2VnX25ldywgbm90IGJmZF9tYWtlX3NlY3Rpb24uICBEb24ndAotCXNldCBTRUNfTE9BRCBmb3IgLm5vdGUgc2VjdGlvbi4KLQkoYWRqdXN0X3N0YWJfc2VjdGlvbnMpOiBHZXQgZnJhZyBwb2ludGVyIGZyb20gc2VnX2luZm8sIHJhdGhlcgotCXRoYW4gbG9va2luZyB0aHJvdWdoIGZyYWdzLgotCSogY29uZmlnL29iai1lbGYuaCAoU197UyxHfUVUX3tPVEhFUixUWVBFLERFU0N9KTogUmVtb3ZlZC4KLQkoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUywgSU5JVF9TVEFCX1NFQ1RJT04sIE9CSl9QUk9DRVNTX1NUQUIpOgotCURlZmluZS4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKG9ial9hb3V0X3N0YWIpOiBSZW1vdmVkLgotCShvYmpfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBzdGFiWCBlbnRyaWVzLgotCSogY29uZmlnL29iai12bXMuaCAoU19TRVRfVFlQRSk6IERlZmluZS4KLQotCSogYXMuaDogRGVjbGFyZSBsaXN0aW5nLgotCSogcmVhZC5jOiBEb24ndCBkZWNsYXJlIGxpc3RpbmcuCi0JKGVtaXRfZXhwcik6IENhc3QgZml4X25ld19leHAgYXJndW1lbnQuCi0JKHBhcnNlX2JpdGZpZWxkX2NvbnMpOiBDb3JyZWN0IHByaW50ZiBmb3JtYXQuCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCSogd3JpdGUuaDogRGVjbGFyZSB0ZXh0X2xhc3RfZnJhZyBhbmQgZGF0YV9sYXN0X2ZyYWcuCi0JKiBjb25maWcvb2JqLWJvdXQuYyAob2JqX2JvdXRfbGluZSk6IEFkZGVkIGR1bW15IGFyZ3VtZW50LgotCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IEFkZCBzb21lIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogY29uZmlnL3RjLWEyOWsuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTk2MC5jOiBMaWtld2lzZS4gIEFsc28gZnVsbHkgYnJhY2tldCBzdHJ1Y3R1cmUKLQlpbml0aWFsaXphdGlvbnMsIGZpeCBwcmludGYgZm9ybWF0cywgYW5kIHJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCi1Nb24gU2VwIDEzIDE2OjQ4OjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChzX2Rlc2MpOiBPbmx5IGNvbXBpbGUgYW5kIHVzZSBpZiBTX1NFVF9ERVNDIGlzIGRlZmluZWQuCi0JKiBzdHJ1Yy1zeW1ib2wuaDogRGVjbGFyZSB2ZXJpZnlfc3ltYm9sX2NoYWluIGFuZAotCXZlcmlmeV9zeW1ib2xfY2hhaW5fMiBldmVuIGlmIG5vdCBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTLgotCSogc3ltYm9scy5jICh2ZXJpZnlfc3ltYm9sX2NoYWluKTogUmVtb3ZlZCB1c2VsZXNzIGV4cHJlc3Npb24uCi0JKiB3cml0ZS5jIChoZWFkZXJzLCB0aGVfb2JqZWN0X2ZpbGUpOiBPbmx5IHVzZSBpZiBub3QKLQlCRkRfQVNTRU1CTEVSIGFuZCBub3QgQkZELgotCShmaXh1cF9zZWdtZW50LCBjdnNfZnJhZ190b19maWxsKTogT25seSB1c2UgaWYgQkZEX0FTU0VNQkxFUiBvcgotCW5vdCBCRkQuCi0JKG1lcmdlX2RhdGFfaW50b190ZXh0KTogT25seSB1c2UgaWYgQkZEX0FTU0VNQkxFUiBvciAobm90IEJGRCBhbmQKLQlub3QgT0JKX0FPVVQpLgotCSogd3JpdGUuaDogRGVjbGFyZSByZWxheF9zZWdtZW50LgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHN0YWNrX3BvcCwgc3RhY2tfcHVzaCwgc3RhY2tfaW5pdCk6IE1hZGUKLQlzdGF0aWMuCi0JKHN0YWNrX3RvcCk6IENvbW1lbnRlZCBvdXQsIHNpbmNlIGl0J3Mgbm90IHVzZWQuCi0JRml4ZWQgdXAgcHNldWRvLW9wIGZ1bmN0aW9ucyB0byB0YWtlIGFuIGlnbm9yZWQgaW50IGFyZ3VtZW50LgotCShzaXplX3NlY3Rpb24pOiBBZGRlZCBkZWZhdWx0IEJBRF9DQVNFIHRvIHN3aXRjaC4KLQlDaGFuZ2VkIGJ6ZXJvIGNhbGxzIHRvIG1lbXNldC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChTX0lTX0xPQ0FMKTogQ2FsbCBzdHJjaHIgb24gU19HRVRfTkFNRQotCShzKSwgbm90IG9uIHMgaXRzZWxmLgotCSogY29uZmlnL3RjLWEyOWsuYyAoc191c2UpOiBUYWtlIGlnbm9yZWQgaW50IGFyZ3VtZW50LiAgT25seQotCWRlZmluZSBpZiBPQkpfQ09GRiBpcyBub3QgZGVmaW5lZC4KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IChmaXRzX2luX3NpZ25lZF9ieXRlLCBzbWFsbGVzdF9pbW1fdHlwZSk6IE1ha2UKLQlhcmd1bWVudCBzaWduZWQgYWdhaW4uCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX2Jzcywgc19ldmVuLCBzX3Byb2MpOiBUYWtlIGlnbm9yZWQgaW50Ci0JYXJndW1lbnQuCi0JKG02OGtfaXApOiBGdWxseSBicmFja2V0IGluaXRpYWxpemF0aW9uIG9mIGFyY2hzLgotCUNvcnJlY3Qgc2V2ZXJhbCBmb3JtYXRzIGZvciBfX0xJTkVfXyB0byBiZSAlZCByYXRoZXIgdGhhbiAlcy4KLQkoaW5pdF90YWJsZSk6IEZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6YXRpb24uCi0JQ2FzdCB2YWx1ZXMgbGFyZ2VyIHRoYW4gMHg3ZiBhc3NpZ25lZCB0byBmcl9vcGNvZGUgdG8gY2hhci4KLQotCSogc3Vic2Vncy5jOiBSZW5hbWVkIG5vbi1CRkRfQVNTRU1CTEVSIHN1YnNlZ19uZXcgdG8gc3Vic2VnX3NldC4KLQlXcm90ZSBub24tQkZEX0FTU0VNQkxFUiBzdWJzZWdfbmV3LiAgTm93IHN1YnNlZ19uZXcgYWx3YXlzIHRha2VzIGEKLQlzZWN0aW9uIG5hbWUsIGFuZCBzdWJzZWdfc2V0IGFsd2F5cyB0YWtlcyBhIHNlZ1QuICBDaGFuZ2VkIGFsbAotCWNhbGxlcnMgYXMgYXBwcm9wcmlhdGUuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAgKGNoYW5nZV90b19zZWN0aW9uKTogUmVuYW1lZCB0bwotCW9ial9jb2ZmX2FkZF9zZWdtZW50LiAgQ29ycmVjdGVkLiAgTWFkZSBjYWxsZXJzIHVzZSBzdWJzZWdfbmV3LgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKG9ial9zZWdtZW50X25hbWUsIG9ial9hZGRfc2VnbWVudCk6Ci0JRGVmaW5lLgotCi1Nb24gU2VwIDEzIDEzOjE1OjAzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChMT0NBTF9MQUJFTCk6IFJlbW92ZSB0ZXN0IGZvciBuYW1lWzBdID09ICdMJy4KLQotRnJpIFNlcCAxMCAxMToyMjowOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNfU0VUX1NJWkUpOiBBY3R1YWxseSBzZXQgdGhlIHNpemUuCi0KLQlHY2MgbGludC4KLQkqIEFkZGVkIGEgbnVtYmVyIG9mIGNhc3RzIHRvIGZ1bmN0aW9uIGNhbGxzLgotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKSwgYXMuYyAobWFpbiksIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCwKLQlvcGVyYW5kLCBleHByKSwgcmVhZC5jIChyZWFkX2JlZ2luLCBIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFksCi0JcmVhZF9hX3NvdXJjZV9maWxlLCBzX2FsaWduX2J5dGVzLCBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLAotCWlnbm9yZV9yZXN0X29mX2xpbmUsIGJpZ19jb25zLCBpc19pdF9lbmRfb2Zfc3RhdGVtZW50LCBzX2lnbm9yZSksCi0JcmVhZC5oIChpc19uYW1lX2JlZ2lubmVyLCBpc19wYXJ0X29mX25hbWUpLCBjb25maWcvb2JqLWVsZi5jCi0JKG9ial9lbGZfc2VjdGlvbiksIGNvbmZpZy90Yy1pMzg2LmMgKHBhcnNlX3JlZ2lzdGVyKSwKLQljb25maWcvdGMtc3BhcmMuYyAoaXNvY3RhbCwgc19wcm9jKTogQ2FzdCBjaGFyCi0JYXJyYXkgaW5kaWNlcyB0byB1bnNpZ25lZCBjaGFyLgotCSogYXBwLmMgKHByb2Nlc3NfZXNjYXBlKTogTWFrZSBzdGF0aWMuICBBZGQgcHJvdG90eXBlLiAgQ2hhbmdlCi0JYXJndW1lbnQgZnJvbSBjaGFyIHRvIGludC4KLQkqIGFzLmM6IEluY2x1ZGUgb3V0cHV0LWZpbGUuaCBmb3IgcHJvdG90eXBlcy4gIENvbW1lbnQgb3V0IHVudXNlZAotCWZ1bmN0aW9uIGdvdF9zaWcuCi0JKiBNYWtlZmlsZS5pbiAoYXMubyk6IERlcGVuZCBvbiBvdXRwdXQtZmlsZS5oLgotCSogYXMuaCAoQkFEX0NBU0UpOiBDYXN0IHZhbCBhcmd1bWVudCB0byBsb25nLCBhbmQgdXNlICVsZC4KLQkocHNldWRvX3R5cGVTKTogQWRkIHByb3RvdHlwZSB0byBwb2NfaGFuZGxlciBmaWVsZC4KLQkocHJpbnRfdmVyc2lvbl9pZCk6IEFkZCBwcm90b3R5cGUuCi0JKHhtYWxsb2MsIHhyZWFsbG9jKTogQ2hhbmdlIHNpemUgYXJndW1lbnRzIHRvIHVuc2lnbmVkIGxvbmcuCi0JKGRvX3NjcnViX25leHRfY2hhcik6IEFkZCBwcm90b3R5cGVzIGZvciBmdW5jdGlvbiBhcmd1bWVudHMuCi0JKGhhZF9lcnJvcnMsIGhhZF93YXJuaW5ncywgc2NydWJfZnJvbV9maWxlKTogUmVtb3ZlIGR1cGxpY2F0ZQotCWRlY2xhcmF0aW9ucy4KLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBNYWtlIHNpemUgdmFyaWFibGVzIHVuc2lnbmVkLgotCSogY29uZC5jIChpZ25vcmVfaW5wdXQpOiBSZW1vdmVkIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBwdHIuCi0JKiBleHByLmMgKGZsb2F0aW5nX2NvbnN0YW50LCBpbnRlZ2VyX2NvbnN0YW50KTogTWFrZSBzdGF0aWMuICBBZGQKLQlwcm90b3R5cGVzLgotCSogZmxvbnVtLWNvcHkuYyAoZmxvbnVtX2NvcHkpOiBNYWtlIHNpemUgdmFyaWFibGVzIHVuc2lnbmVkLgotCSogZnJhZ3MuaDogQWRkIHByb3RvdHlwZSBmb3IgZnJhZ19pbml0LgotCSogaGFzaC5oLCBoYXNoLmM6IENoYW5nZSBoYXNoIHZhbHVlcyBmcm9tIGNoYXIgKiB0byBQVFIsIG1ha2UgaGFzaAotCXN0cmluZ3MgY29uc3QsIG1ha2UgcmV0dXJuZWQgZXJyb3Igc3RyaW5ncyBjb25zdCBjaGFyICouICBBZGRlZAotCXByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucy4KLQkqIGlucHV0LWZpbGUuaCwgaW5wdXQtZmlsZS5jIChpbnB1dF9maWxlX2J1ZmZlcl9zaXplKTogUmV0dXJuCi0JdW5zaWduZWQgaW50LgotCSogaW5wdXQtc2NydWIuYyAoYnVmZmVyX2xlbmd0aCk6IE1ha2UgdW5zaWduZWQuCi0JKGlucHV0X3NjcnViX3B1c2gsIGlucHV0X3NjcnViX3BvcCk6IE1ha2Ugc3RhdGljLgotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IENhc3Qgc3ByaW50ZiBhcmd1bWVudCB0byB1bnNpZ25lZAotCWxvbmcgYW5kIHVzZSAlbHguICBQcmludCBuYW1lIG9mIHNlZ21lbnQgcmF0aGVyIHRoYW4gYWRkcmVzcyBvZgotCXN0cnVjdHVyZS4KLQkobGlzdGluZ19saXN0LCBsaXN0aW5nX3RpdGxlKTogQ2hhbmdlIGFyZ3VtZW50IHRvIGludC4KLQkobGlzdGluZ19lamVjdCwgbGlzdGluZ19mbGFncywgbGlzdGluZ19wc2l6ZSk6IEFkZCBpbnQgYXJndW1lbnQuCi0JKiBsaXN0aW5nLmg6IENvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb24gY2hhbmdlcy4KLQkqIG9iai5oIChvYmpfZW1pdF9zeW1ib2xzKTogUmVuYW1lIHByb3RvdHlwZSBhcmd1bWVudCB0byBhdm9pZAotCXNoYWRvd2luZy4KLQkqIHJlYWQuaDogQ2hhbmdlIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uIHByb3RvdHlwZSB0byByZXR1cm4KLQlvZmZzZXRULiAgQWRkIHByb3RvdHlwZSBmb3IgbmV4dF9jaGFyX29mX3N0cmluZy4gIFZhcmlvdXMKLQlwcm90b3R5cGUgY2hhbmdlcy4KLQkqIHJlYWQuYzogUmVtb3ZlIHByb3RvdHlwZSBmb3IgbmV4dF9jaGFyX29mX3N0cmluZy4KLQkocG9iZWdpbik6IE1ha2UgZXJydHh0IGNvbnN0LiAgTWFrZSBuZXdfbGVuZ3RoLCB0bXBfbGVuIGFuZCBudW0KLQl1bnNpZ25lZC4KLQkoc19hYm9ydCwgc19hbGlnbl9wdHdvLCBzX2NvbW0sIHNfZGF0YSwgc19hcHBfbGluZSwgc19maWxsLAotCXNfZ2xvYmwsIHNfbHN5bSwgc19vcmcsIHNfc2V0LCBzX3RleHQsIHNfZGVzYyk6IEFkZCBpbnQgYXJndW1lbnQuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShzX2NvbW0pOiBDaGFuZ2UgdGVtcCBmcm9tIHZhbHVlVCB0byBvZmZzZXRULiAgQ2FzdCB0byBsb25nIHdoZW4KLQlwcmludGluZyBhbmQgdXNlICVsZCAob25seSBmb3IgZXJyb3IgbWVzc2FnZXMgYW55aG93KS4KLQkoc19sb25nLCBzX2ludCk6IFJlbW92ZSB1bnVzZWQgZnVuY3Rpb25zLgotCShjb25zKTogQ2hhbmdlIGFyZ3VtZW50IHRvIGludC4KLQkoZW1pdF9leHByKTogVXNlICVseCB3aGVuIHByaW50aW5nIGxvbmdzLgotCShnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbik6IFJldHVybiBvZmZzZXRULCBub3QgbG9uZy4KLQkoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IENvbW1lbnQgb3V0IHVubGVzcwotCVNFUEFSQVRFX1NUQUJfU0VDVElPTlMuCi0JKHNfc3RhYl9nZW5lcmljKTogUmVtb3ZlIHVudXNlZCBvZmZzZXQuICBEZWZpbmUgc2VnX2lzX25ldyBvbmx5Ci0JaWYgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUy4gIFVzZSB0b1Agb25seSBpbiBsb2NhbCBibG9jay4KLQkqIHN0cnVjLXN5bWJvbC5oICh2ZXJpZnlfc3ltYm9sX2NoYWluXzIpOiBBZGQgcHJvdG90eXBlLgotCSogc3ltYm9scy5jOiBSZW1vdmUgbmVzdGVkIGNvbW1lbnQuCi0JKHN5bWJvbF9uZXcpOiBSZW5hbWUgdmFsdWUgdG8gdmFsdS4KLQkoY29sb24pOiBVc2UgJWxkIGFuZCBjYXN0IHRvIGxvbmcgaW4gZXJyb3IgbWVzc2FnZS4KLQkqIHN5bWJvbHMuaDogUmVtb3ZlIGR1cGxpY2F0ZSB2ZXJpZnlfc3ltYm9sX2NoYWluIGRlY2xhcmF0aW9uLgotCSogdGMuaDogUmVtb3ZlIHVudXNlZCBtZF9lbWl0X3JlbG9jYXRpb25zIGRlY2xhcmF0aW9uLgotCSh0Y19nZW5fcmVsb2MpOiBBZGQgZGVjbGFyYXRpb24uCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogQ2hhbmdlIGZpcnN0IGFyZ3VtZW50IG5hbWUgZGVwZW5kaW5nCi0Jb24gQkZEX0FTU0VNQkxFUi4KLQkod3JpdGVfcmVsb2NzKTogUmVtb3ZlIHVudXNlZCBvZmZzZXQsIGZyYWdzLiAgUmVtb3ZlIHRjX2dlbl9yZWxvYwotCWRlY2xhcmF0aW9ucy4gIE1ha2UgbiB1bnNpZ25lZC4KLQkod3JpdGVfY29udGVudHMpOiBSZW1vdmUgdW51c2VkIGksIG4sIHJlbG9jcywgZml4cC4gIFJlbmFtZSBmcmFncwotCXRvIGYgdG8gYXZvaWQgc2hhZG93aW5nLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IERlZmluZSBmcmFnUCBvbmx5IGlmIG5vdCBCRkRfQVNTRU1CTEVSIG9yIG5vdAotCVdPUktJTkdfRE9UX1dPUkQuICBSZW1vdmUgdW51c2VkIGtlZXAuICBPbmx5IGRlY2xhcmUgcHVudCBhbmQKLQlwdW50X2l0IGlmIHRoZXkgd2lsbCBiZSB1c2VkLiAgTWFrZSBpIGFuZCBuIHVuc2lnbmVkLgotCShmaXh1cF9zZWdtZW50KTogQ2FzdCB0byBsb25nIGFuZCB1c2UgJWxkIGluIGVycm9yIG1lc3NhZ2UuCi0JKiB4bWFsbG9jLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogTWFrZSBzaXplIGFyZ3VtZW50IHVuc2lnbmVkLgotCSogY29uZmlnL29iai1hb3V0Lmg6IFJlbW92ZSBuZXN0ZWQgY29tbWVudC4gIEFkZCBwcm90b3R5cGUgZm9yCi0Jb2JqX2FvdXRfZnJvYl9zeW1ib2wuCi0JKG9ial9hb3V0X2xpbmUsIG9ial9hb3V0X2Rlc2MpOiBBZGQgaW50IGFyZ3VtZW50LgotCSogY29uZmlnL29iai1lY29mZi5jOiBDaGFuZ2VkIGJ1aWxkIHJvdXRpbmVzIHRvIHVzZSBhbiB1bnNpZ25lZAotCW9mZnNldC4KLQkoYWRkX3N0cmluZyk6IE1ha2UgbGVuIHVuc2lnbmVkIGxvbmcuCi0JKG9ial9lY29mZl9zdGFiKTogVXNlICVsdSBpbiBlcnJvciBtZXNzYWdlLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBDb21tZW50IG91dCB1bnVzZWQgbGFiZWwKLQlhbGxvY2F0ZV9ic3MuCi0JKG9ial9lbGZfZnJvYl9zeW1ib2wpOiBSZXR1cm4gMCAoY3VycmVudGx5IGJyb2tlbikuCi0JKG9ial9lbGZfZGVzYywgb2JqX2VsZl92ZXJzaW9uLCBvYmpfZWxmX3NpemUsIG9ial9lbGZfdHlwZSwKLQlvYmpfZWxmX2lkZW50LCBvYmpfZWxmX3dlYWssIG9ial9lbGZfbG9jYWwsIG9ial9lbGZfY29tbW9uLAotCW9ial9lbGZfbGluZSwgb2JqX2VsZl9wcmV2aW91cyk6IEFkZCBpbnQgYXJndW1lbnQuCi0JKG9ial9lbGZfd3JpdGVfc3ltYm9sX3ApOiBNYWtlIHN0YXRpYy4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9lbGZfd3JpdGVfc3ltYm9sKTogQWRkIHByb3RvdHlwZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IFJlbW92ZSBkZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb25zIGRlY2xhcmVkIGluCi0JcmVhZC5oLgotCSogY29uZmlnL3RjLWkzODYuYyAoRU5DT0RFX1JFTEFYX1NUQVRFKTogQ2FzdCB0byByZWxheF9zdWJzdGF0ZVQuCi0JKHNfYnNzKTogQWRkIGludCBhcmd1bWVudC4KLQkoZml0c19pbl9zaWduZWRfYnl0ZSwgc21hbGxlc3RfaW1tX3R5cGUpOiBNYWtlIGFyZ3VtZW50IHVuc2lnbmVkLgotCShkdW1teSk6IFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogUmVuYW1lIGxvY2FsIG8gdG8gb3AgdG8gYXZvaWQgc2hhZG93aW5nLgotCSh0Y19nZW5fcmVsb2MpOiBSZW5hbWUgbG9jYWwgcmVsb2MgdG8gcmVsIHRvIGF2b2lkIHNoYWRvd2luZy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfZGF0YTEsIHNfZGF0YTIpOiBBZGQgaW50IGFyZ3VtZW50LgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCwgbWRfYXBwbHlfZml4KTogQ2FzdCB0byBsb25nIGFuZCB1c2UKLQklbGQgaW4gZXJyb3IgbWVzc2FnZXMuCi0JKiBjb25maWcvdGMtc3BhcmMuYzogUmVtb3ZlIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMuCi0JKGdldEV4cHJlc3Npb24pOiBSZXdyaXRlIGNvbmRpdGlvbiB0byBhdm9pZCBlbXB0eSBjb25kaXRpb25hbAotCWJvZHkuCi0JKHNfcmVnLCBzX3Byb2MsIHNfcmVzZXJ2ZSwgc19jb21tb24sIHNfc2VnLCBzX3h3b3JkKTogQWRkIGludAotCWFyZ3VtZW50LgotCi1UaHUgU2VwICA5IDE3OjEwOjAwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgZnJvbSBKZWZmIExhdzoKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXNzZW1ibGUpOiBGaXggdHlwby4KLQkocGFfaXApOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlcyBhbmQgbGFiZWxzLiAgRG8gbm90IGNoZWNrIGZvcgotCXVuc2lnbmVkIHZhbHVlcyBiZWluZyA8IDAsIGl0IGNhbid0IGhhcHBlbi4KLQkoaXNfc2FtZV9mcmFnKTogUmV0dXJuIGEgdmFsdWUgaW4gcmVjdXJzaXZlIGNhbGwgY2FzZS4KLQkocGFfY2FsbGluZm8pOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlcyBhbmQgbGFiZWxzLgotCShwYV9jb21tKTogTGlrZXdpc2UuCi0JKHBhX2NvcHlyaWdodCk6IExpa2V3aXNlLgotCShwYV9leHBvcnQpOiBMaWtld2lzZS4KLQkocGFfaW1wb3J0KTogTGlrZXdpc2UuCi0JKHBhX3BhcmFtKTogTGlrZXdpc2UuCi0JKHBhX3NwYWNlKTogTGlrZXdpc2UuCi0JKHBhX3N1YnNwYWNlKTogTGlrZXdpc2UuCi0KLVRodSBTZXAgIDkgMTU6MDU6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGdldF9zdGFiX3N0cmluZ19vZmZzZXQsIHNfc3RhYl9nZW5lcmljKTogSWYKLQlCRkRfQVNTRU1CTEVSLCBjYWxsIHN1YnNlZ19zZXQgcmF0aGVyIHRoYW4gc3Vic2VnX25ldy4KLQotV2VkIFNlcCAgOCAxNTowOToxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IFNldCBTRUNfTE9BRCB3aGVuIHVzaW5nCi0JZGVmYXVsdCBmbGFnIHZhbHVlcy4KLQotVHVlIFNlcCAgNyAxMDoyMjo1MiAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYzogKGNoYW5nZV90b19zZWN0aW9uKTogRG9uJ3QgaW5jbHVkZSBib2R5IGlmIG5vdCBNQU5ZX1NFQ1RJT05TLgotCi0JKiByZWFkLmM6IChzX3N0YWIsIHNfeHN0YWIsIHNfZGVzYyk6IE5ldyBmdW5jdGlvbnMgdG8gcGFyc2UKLQl2YXJpb3VzIHN0YWItcmVsYXRlZCBkaXJlY3RpdmVzLgotCSogcmVhZC5oOiAoc19zdGFiLCBzX3hzdGFiLCBzX2Rlc2MpOiBOZXcgZnVuY3Rpb24gcHJvdG90eXBlcy4KLQkqIHdyaXRlLmM6IChtZXJnZV9kYXRhX2ludG9fdGV4dCk6IEZpeCBpZmRlZiB0YW5nbGUuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoY3VycmVudF9zdGFiX3N5bWJvbCk6IEZha2Ugc3ltYm9sCi0JZm9yIHN0YWIgcmVhZGVyIHRvIHVzZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZGguaCAob2JqX3N5bWJvbF90eXBlKTogQWRkZWQgZmllbGRzIGZvcgotCXN0YWIgcmVhZGVyLCBtYWNyb3MgdG8gYWNjZXNzLgotCi1GcmkgU2VwICAzIDE2OjQ0OjAzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuaCAoZWxmX3N5bWJvbCk6IE5vIGxvbmdlciBzcGVjaWFsLWNhc2VkIG9uCi0Jc3BhcmN2OSwgc2luY2UgZWxmX3N5bWJvbF90eXBlIGlzIG5vdyBpbmRlcGVuZGVudCBvZiBzaXplLgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChlbGZfc3ltYm9sKTogRml4ZWQgbmFtZSBvZiBlbGZfc3ltYm9sX3R5cGUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHN0cnVjdCBkZWZhdWx0X3N1YnNwYWNlX2RpY3QsIHN0cnVjdAotCWRlZmF1bHRfc3BhY2VfZGljdCk6IEZpZWxkICJzb3J0IiBpcyBub3cgdW5zaWduZWQgY2hhci4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZGVmX3N1YnNwYWNlcywgcGFfZGVmX3NwYWNlcyk6IEFsaWduCi0JY29sdW1ucyBmb3IgZWFzaWVyIHJlYWRpbmcuCi0JKGJjbXAsIGluZGV4KTogRGVsZXRlZCBVU0ctc3BlY2lmaWMgZGVmaW5pdGlvbnMuICBTaG91bGQgYmUgZGVhbHQKLQl3aXRoIGluIGhvLSouaCwgb3IgaW4gbGliaWJlcnR5LiAgQ2hhbmdlZCBtZW50aW9uIG9mIGluZGV4IHRvCi0Jc3RyY2hyLgotCShsYWJlbF9zeW1ib2xQLCBsYWJlbF9zeW1ib2xfZGVmaW5lZCwgY2FsbGluZm9fZm91bmQsCi0Jd2l0aGluX2VudHJ5X2V4aXQsIGV4aXRfcHJvY2Vzc2luZ19jb21wbGV0ZSwgd2l0aGluX3Byb2NlZHVyZSwKLQlwYV9kZWZfc3Vic3BhY2VzLCBwYV9kZWZfc3BhY2VzLCBwYV9wc2V1ZG9fb3BfbW92ZXNfcGMsCi0JbGFiZWxfc3ltYm9sc19yb290UCwgcGFfZ2V0X2xhYmVsLCBwYV9sYWJlbF9pc19kZWZpbmVkLAotCXBhX3VuZGVmaW5lX2xhYmVsKTogTm93IHN0YXRpYy4KLQkobW92ZXJzKTogTm93IGNvbnN0LCBpbiBhZGRpdGlvbiB0byBwb2ludGluZyB0byBjb25zdCBkYXRhLgotCSogY29uZmlnL3RjLWhwcGEuaCAobGFiZWxfc3ltYm9sU19yb290UCwgcGFfZ2V0X2xhYmVsLAotCXBhX2xhYmVsX2lzX2RlZmluZWQsIHBhX3VuZGVmaW5lX2xhYmVsLCBwYV9wc2V1ZG9fb3BfbW92ZXNfcGMpOgotCURlbGV0ZSBkZWNsYXJhdGlvbnMuCi0KLQlNZXJnZWQgbW9yZSBjaGFuZ2VzIGZyb20gSmVmZiBMYXcgYW5kIFBldGUgSG9vZ2VuYm9vbToKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZGVmX3N1YnNwYWNlcywgcGFfZGVmX3N1YnNwYWNlcyk6IFJlbW92ZQotCWVudHJpZXMgZm9yIC5zdGFiIGFuZCAuc3RhYnN0ci4KLQotCSogY29uZmlnL29iai1lbGYuYzogKGVsZl9zdGFiX3N5bWJvbF9zdHJpbmcpOiAgU2V0IHRoZQotCVNFQ19MT0FEIGF0dHJpYnV0ZSBmb3IgdGhlIC5zdGFic3RyIHNlY3Rpb24uCi0JKG9ial9lbGZfc3RhYl9nZW5lcmljKTogIFNldCB0aGUgU0VDX0xPQUQgYXR0cmlidXRlIGZvciB0aGUKLQkuc3RhYiBzZWN0aW9uLgotCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6ICBDaGFuZ2UgJyNpZiAxJyB0byAnI2lmIDAnLgotCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6ICBJbmNvcnJlY3QgYnl0ZSBjb3VudCBvbiBjYWxsIHRvCi0JbWRfbnVtYmVyX3RvX2NoYXJzIGZ1bmN0aW9uLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX3N5bWJvbCk6IFN0YXRpYyBmdW5jdGlvbnMgbmVlZAotCWFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyB0b28uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3N0cmluZ2VyKTogQ29ycmVjdGx5IGhhbmRsZSBlc2NhcGluZwotCWNoYXJhY3RlcnMgd2hpY2ggc2hvdWxkIGFwcGVhciB1bmFsdGVyZWQgaW4gdGhlIG91dHB1dCBzdHJpbmcgKGZvcgotCWV4YW1wbGUgYW4gZXNjYXBlZCBkb3VibGUtcXVvdGUpLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0cik6IEFsd2F5cwotCWluaXRpYWxpemUgbmFtZS4KLQkocGFfcGFyc2VfbmVnX2NtcHN1Yl9jbXBsdHIpOiBMaWtld2lzZS4KLQkocGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIpOiBMaWtld2lzZS4KLQkocGFfcGFyc2VfbmVnX2FkZF9jbXBsdHIpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAocGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEpOiBSZW1vdmUgcHJvdG90eXBlCi0JZm9yIG5vdy4KLQkoY29uc19maXhfbmV3X2hwcGEpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEZpeCB0eXBlIG9mIHZhbHAgdG8gbWF0Y2gKLQlwcm90b3R5cGUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IEluY2x1ZGUgbGliaHBwYS5oLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBEZWxldGUgZXh0ZXJuIGRlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMKLQlmb3VuZCBpbiBsaWJocHBhLmguCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3NwYWNlKTogUmV3b3JrIHRvIGF2b2lkIHVud2FudGVkICNpZmRlZgotCU9CSl9FTEYgY29uZGl0aW9uYWxzLgotCSogY29uZmlnL3RjLWhwcGEuaCAoTE9DQUxfTEFCRUwpOiBDb3JyZWN0bHkgaWRlbnRpZnkgbG9jYWwgbGFiZWxzCi0Jb24gdGhlIFBBLgotCi1UaHUgU2VwICAyIDEwOjQzOjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBBY2NlcHQgJ3onLCBhbmQgaWdub3JlIGl0LgotCShtYWNybyk6IFVzZSAieixzLHQiIGZvciBkaXYgaW5zdHJ1Y3Rpb25zIHRvIG1hdGNoIGNvcnJlc3BvbmRpbmcKLQljaGFuZ2UgaW4gb3Bjb2RlIHRhYmxlLgotCShtaXBzX2lwKTogQWRkZWQgJ3onLS1tdXN0IGJlIHplcm8gcmVnaXN0ZXIuCi0KLVdlZCBTZXAgIDEgMTU6NTY6NDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpIFtSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEVdOiBEZWNsYXJlCi0JdGNfZ2VuX3JlbG9jIGNvcnJlY3RseS4KLQotCSogY29uZmlndXJlLmluOiBVc2UgImNhc2UiIGluc3RlYWQgb2YgImlmIiB3aGVuIHBvc3NpYmxlLiAgUmV3cm90ZQotCU1ha2VmaWxlIGVkaXRpbmcgdG8gcmVkdWNlIHdvcmsgZG9uZS4gIFRyZWF0ICJocHBhKiIgYXMgImhwcGEiLgotCi1XZWQgU2VwICAxIDEyOjE5OjA3IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBhZGQgJ2QnIGFzIGFuIGFsaWFzIGZvcgotCSAgc2VjdGlvbiB0eXBlIG9mIGRhdGEuICAnZCcgc2VlbXMgdG8gYmUgdXNlZCBmb3IgbTg4ay4KLQotV2VkIEF1ZyAyNSAyMjozMzoyMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfYWxpZ24sIHNfc3RyaW5nZXIsIHNfY29ucywgc19mbG9hdF9jb25zLAotCXNfbWlwc19zcGFjZSk6IFNldCBpbnNuX2xhYmVsIHRvIE5VTEwgdG8gYXZvaWQgY2hhbmdpbmcgaXQgYXQgdGhlCi0JbmV4dCAuYWxpZ24gc3RhdGVtZW50LgotCShhcHBlbmRfaW5zbik6IERvbid0IHN3YXAgamFsIHdpdGggaW5zdHJ1Y3Rpb24gdGhhdCBzZXRzIHRoZQotCXJlZ2lzdGVyIHRoYXQgamFsIHNldHMuCi0KLVdlZCBBdWcgMjUgMTY6MTU6NTcgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtODgxMTAuCi0KLVdlZCBBdWcgMjUgMTM6Mzc6NDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JTWVyZ2VkIGNoYW5nZXMgZnJvbSBQZXRlIEhvb2dlbmJvb20gYW5kIEplZmYgTGF3IGF0IFV0YWg6Ci0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBTRUNfQUxMT0Mgc2hvdWxkCi0Jbm90IGJlIG9uIGZvciAuaHBwYV91bndpbmQuCi0JKG1kX3BzZXVkb190YWJsZSk6IC5QQVJBTSBhbmQgLnBhcmFtIGFyZSB2YWxpZCBwc2V1ZG8tb3BzIGZvciBHQVMuCi0JKHBhX3BhcmFtKTogTmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSAuUEFSQU0gZGlyZWN0aXZlcy4KLQkocGFfaXApOiBQYXNzICJpc2JyYW5jaCIgYXJndW1lbnQgZG93biB0byBwYV9wYXJzZV8qX2NvbXBsdHIKLQlmdW5jdGlvbnMuICBIYW5kbGUgJ3wnIGZvciBtb3ZiOyBhbGxvdyBtb3ZiLG4uCi0JKHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyKTogRGVsZXRlIG9sZCB1c2VsZXNzCi0JdmVyc2lvbi4gIEhhbmRsZSBjYXNlcyB3aGVyZSBubyBjb21wbGV0ZXIgZXhpc3RzIGZvcgotCWNvbWIsbiBvciBhZGRiLG4uCi0JKHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyKTogSGFuZGxlIGNhc2VzIHdoZXJlIG5vCi0JY29tcGxldGVyIGV4aXN0cyBmb3IgY29tYixuIG9yIGFkZGIsbi4gIE1ha2UgbG9naWMKLQltaXJyb3IgdGhhdCBvZiBwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0ci4KLQkocGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIpOiBMaWtld2lzZS4KLQkocGFfcGFyc2VfbmVnX2FkZF9jbXBsdHIpOiBMaWtld2lzZS4KLQkqIHRjLWhwcGEuaCAocGFfcGFyYW0pOiBEZWNsYXJlLgotCi1UdWUgQXVnIDI0IDE1OjQxOjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19tYWtlX3N5bWV4dG5fc2VjdGlvbik6IE5vdyBzdGF0aWMuCi0JQWRkZWQgZm9yd2FyZCBkZWNsYXJhdGlvbi4KLQotCU1lcmdlZCBjaGFuZ2VzIGZyb20gUGV0ZSBIb29nZW5ib29tIGFuZCBKZWZmIExhdyBhdCBVdGFoOgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9maWxlKTogQXJndW1lbnRzIHdlcmUgaW5jb3JyZWN0IG9uCi0JY2FsbCB0byBlbGZfdGNfbWFrZV9zZWN0aW9ucy4KLQkob2JqX2VsZl92ZXJzaW9uKTogQSAubm90ZSBzZWN0aW9uIHNob3VsZG4ndCBoYXZlIHRoZSBTRUNfQUxMT0MKLQlhdHRyaWJ1dGUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IEFkZCBzb21lIHByb2Nlc3NpbmcgdG8KLQloYW5kbGUgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9ucy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfc3ltZXh0bl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvCi0JY3JlYXRlIGEgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uLgotCShwYV9leHBvcnRfYXJncyk6IE1ha2UgY2FsbCB0byBwYV9idWlsZF9zeW1leHRuX3NlY3Rpb24uCi0JKGhwcGFfdGNfc3ltYm9sLCBocHBhX3RjX21ha2Vfc2VjdGlvbnMsCi0JaHBwYV90Y19tYWtlX3N5bWV4dG5fc2VjdGlvbik6IE5ldyBmdW5jdGlvbnMuCi0JKiBjb25maWcvdGMtaHBwYS5oOiBVcGRhdGUgZWxmX3RjX3N5bWJvbCBhbmQgZWxmX3RjX21ha2Vfc2VjdGlvbnMKLQltYWNyb3MuCi0KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogUGxhY2UgY2hlY2sgZm9yIFRDX0NPTlNfRklYX05FVyBpbiB0aGUKLQlCRkRfQVNTRU1CTEVSIGJyYW5jaCBhcyB3ZWxsLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBJZiBFTEYgaXMgdGhlIHRhcmdldCBvYmplY3QgZm9ybWF0LCBkZWZpbmUKLQlzb21lIEVMRi0gYW5kIGhwcGEtc3BlY2lmaWMgdHlwZXMgYW5kIGNvbnN0YW50cy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoZ2V0RXhwcmVzc2lvbik6IEZpeCBhIHR5cG8uCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogVXNlIFRDX0VRVUFMX0lOX0lOU04gdG8gZGV0ZXJtaW5lCi0JaWYgYSBgPScgaXMgcGFydCBvZiBhbiBpbnN0cnVjdGlvbi4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogSGFuZGxlIGNhc2Ugd2hlcmUgZW5kLW9mLWxpbmUgbWFya2VycyBhcmUKLQlhbHNvIHVzZWQgd2l0aGluIGluc3RydWN0aW9ucy4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX0VRVUFMX0lOX0lOU04sIFRDX0VPTF9JTl9JTlNOKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXhfMSk6IEtlZXAgcmVsb2NhdGlvbnMgZm9yCi0Jb3V0LW9mLXJhbmdlIGJyYW5jaGVzLydjYWxscyB1c2luZyAiYmwiIG9yIGNhbGxzIHdoaWNoIG1heSBuZWVkCi0JYXJndW1lbnQgcmVsb2NhdGlvbiBzdHVicy4gIERvIG5vdCBuZWVkL2tlZXAgcmVsb2NhdGlvbnMgZm9yCi0JY29uZGl0aW9uYWwgYnJhbmNoZXMuCi0JKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBGaXggY2FsY3VsYXRpb24gb2YgZnVuY3Rpb24gc2l6ZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl92ZXJzaW9uKTogTWFyayAubm90ZSBzZWN0aW9uIGFzCi0JUkVBRE9OTFkuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhKTogUGFzcyBleHAsIG5vdCB0aGUKLQlhZGRyZXNzIG9mIGV4cCwgdG8gZXhwcmVzc2lvbi4KLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogVHVybiBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgb24uCi0JKG1kX2FwcGx5X2ZpeF8xKTogRGVsZXRlIHVud2FudGVkIGNvbW1lbnRzLgotCShwcm9jZXNzX2V4aXQpOiBTeW1ib2xzIG1hcmtpbmcgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIGFyZSBhbHdheXMKLQlCU0ZfTE9DQUwuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IEluY2x1ZGUgZWxmMzItaHBwYS5oIGZyb20gQkZEIHRyZWUuCi0JKHBhX3NwYWNlKTogRGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBnZGJfc2VjdGlvbi4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IENoYW5nZQotCWVsZl90Y19maW5hbF9wcm9jZXNzaW5nX2hvb2sgdG8gZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IEZpeCBhcmd1bWVudCBsaXN0IHRvIG1hdGNoCi0JYXJndW1lbnQgdHlwZSBkZWNsYXJhdGlvbnMuCi0JKGdldEV4cHJlc3Npb24pOiBGaXggdHlwby4KLQkocGFfZXhwb3J0X2FyZ3MpOiBDaGFuZ2UgZWxmX3N5bWJvbF90eXBlIHRvIGVsZjMyX3N5bWJvbF90eXBlLgotCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogTGlrZXdpc2UuICBOYW1lIGNoYW5nZWQgZnJvbQotCWVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vay4KLQkoc3RhcnRfc3ltYm9sX3Jvb3QsIHN0YXJ0X3N5bWJvbF9sYXN0KTogRGVsZXRlZC4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKTogRml4IHR5cG8uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IFJlcGxhY2UgInN5bWJvbFMiIHdpdGggInN0cnVjdCBzeW1ib2wiIHRvCi0JYXZvaWQgY2hhbmdpbmcgaW5jbHVkZSBvcmRlcmluZy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ3knKTogSGFuZGxlIGp1c3QgbGlrZSAndCcuCi0KLU1vbiBBdWcgMjMgMTI6NDc6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChzZXRfYXQpOiBBZGRlZCB1bnNpZ25lZHAgYXJndW1lbnQuICBVc2UKLQlsb2FkX3JlZ2lzdGVyLgotCShzZXRfYXRfdW5zaWduZWQpOiBSZW1vdmVkOyBjaGFuZ2VkIGNhbGxlcnMgdG8gdXNlIHNldF9hdC4KLQkobG9hZF9yZWdpc3Rlcik6IFJlbW92ZWQgdW51c2VkIGlwIGFyZ3VtZW50LiAgQ2hhbmdlZCBjYWxsZXJzLgotCShhcHBlbmRfaW5zbik6IERvbid0IHN3YXAgYnJhbmNoIGFuZCBicmFuY2ggbGlrZWx5LgotCShtYWNyb19idWlsZCk6IEhhbmRsZSAndScuCi0JKGxvYWRfcmVnaXN0ZXIpOiBIYW5kbGUgNjQgYml0IGNvbnN0YW50cy4KLQkobWFjcm8pOiBBZGRlZCBNX0RBQlMsIHJlbW92ZWQgTV9BQlNVLiAgTnVtZXJvdXMgY2hhbmdlcyB0bwotCXN1cHBvcnQgNjQgYml0IGNvbnN0YW50cy4KLQkobWlwc19pcCk6IFVzZSBoZXggY29uc3RhbnRzIGluIHJhbmdlIGNoZWNrcyBmb3IgY2xhcml0eS4KLQkobWRfbnVtYmVyX3RvX2NoYXJzKTogU3VwcG9ydCA4IGJ5dGUgdmFsdWVzLgotCi1GcmkgQXVnIDIwIDE2OjUwOjU5IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW04OGsuaDogdXBkYXRlZCBjb3B5cmlnaHRzLgotCSAgKFRDX0NPTlNfUkVMT0MpOiBkZWNsYXJlIHRvIGJlIFJFTE9DXzMyLgotCi1GcmkgQXVnIDIwIDExOjE2OjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pc2EpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9iZWdpbik6IEluaXRpYWxpemUgbWlwc19pc2EgYmFzZWQgb24gVEFSR0VUX0NQVS4gIERvbid0IHNhbml0eQotCWNoZWNrIG1hY3Jvcy4gIFNldCB0ZXh0IGFsaWdubWVudCBhbmQgR1Agc2l6ZSBoZXJlLgotCShtZF9hc3NlbWJsZSk6IERvbid0IHNldCB0ZXh0IGFsaWdubWVudCBhbmQgR1Agc2l6ZSBoZXJlLgotCShhcHBlbmRfaW5zbik6IERvbid0IGluc2VydCBOT1BzIGZvciBsb2FkIGRlbGF5cyBpZiBtaXBzX2lzYSA+PSAyLgotCVVzZSB0aGUgcmlnaHQgbWFzayBhbmQgc2hpZnQgZm9yIFdSSVRFX0ZQUl9UIGFuZCBXUklURV9GUFJfUy4gIEFkZAotCWEgTk9QIGFmdGVyIGEgYnJhbmNoIGxpa2VseS4KLQkobWlwc19lbWl0X2RlbGF5cyk6IERvbid0IGluc2VydCBOT1BTIGZvciBsb2FkIGRlbGF5cyBpZiBtaXBzX2lzYQotCT49IDIuCi0JKG1hY3JvKTogU3VwcG9ydCByNjAwMCBhbmQgcjQwMDAgbWFjcm9zLgotCShtaXBzX2lwKTogQ2hlY2sgaW5zbiBJU0EgbGV2ZWwgYWdhaW5zdCBtaXBzX2lzYSBiZWZvcmUgdXNpbmcgaXQuCi0JQWRkZWQgJ3gnIGNhc2UgZm9yIGlnbm9yZWQgcmVnaXN0ZXIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAtbWlwc04gYW5kIC1tY3B1PVhYLgotCi1GcmkgQXVnIDIwIDAxOjI2OjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKSBbT0JKX0VMRl06IEhhbmRsZSAiLnplcm8iLgotCi1UaHUgQXVnIDE5IDEyOjE1OjE4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfbG9jYWwpOiBGdW5jdGlvbiBtb3ZlZCBhbmQgcmVuYW1lZC4uLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9sb2NhbCk6IC4uLnRvIGhlcmUuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKSwgY29uZmlnL29iai1lbGYuYwotCShvYmpfcHNldWRvX3RhYmxlKTogTW92ZSBoYW5kbGluZyBvZiAiLmxvY2FsIi4KLQotCSogdGMuaCAobWRfcGFyc2Vfb3B0aW9uKTogRG9uJ3QgZGVjbGFyZSBpZiBkZWZpbmVkIGFzIGEgbWFjcm8uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKE5PX1JFTE9DKSBbQkZEX0FTU0VNQkxFUl06IERlZmluZSBhcwotCUJGRF9SRUxPQ19OT05FLgotCShtZF9wYXJzZV9vcHRpb24pOiBOZXcgbWFjcm8sIGNvbnZlcnRlZCBmcm9tIGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcGFyc2Vfb3B0aW9uKTogRnVuY3Rpb24gZGVsZXRlZC4KLQkoY29tbWVudF9jaGFycykgW09CSl9FTEZdOiBJbmNsdWRlICIvIi4KLQkobGluZV9jb21tZW50X2NoYXJzKSBbT0JKX0VMRiB8fCBURV9JMzg2QUlYXTogRG9uJ3QgaW5jbHVkZSAiLyIuCi0JKG1kX2Fzc2VtYmxlKTogQ2FzdCAweGU5IHRvIGNoYXIgZXhwbGljaXRseSwgdG8gYXZvaWQgY29tcGlsZXIKLQl3YXJuaW5nLgotCShtZF9hc3NlbWJsZSwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX2NyZWF0ZV9sb25nX2p1bXApOgotCUNhbGwgcmVsb2MgZm9yIGZpeF9uZXcgdHlwZSwgb3IgdXNlIGNvcnJlY3QgZW51bWVyYXRvciwgaW5zdGVhZCBvZgotCWFsd2F5cyB1c2luZyBOT19SRUxPQy4KLQkoaTM4Nl9vcGVyYW5kKTogQ2hhbmdlICJpZm5kZWYgSTM4NkNPRkYiIHRvICJpZmRlZiBPQkpfQU9VVCIgZm9yCi0JdGVzdHMgZm9yIHZhbGlkIHNlY3Rpb24uCi0JKG1kX2NvbnZlcnRfZnJhZykgW0JGRF9BU1NFTUJMRVJdOiBDb21wZW5zYXRlIGZvciBmcmFnIHN0YXJ0Ci0JYWRkcmVzcy4KLQkobWRfYXBwbHlfZml4XzEpIFtCRkRfQVNTRU1CTEVSXTogRm9yIHBjLXJlbGF0aXZlIHJlbG9jIHdpdGgKLQlzeW1ib2wsIGNvbXBlbnNhdGUgZm9yIGxvY2F0aW9uIG9mIHJlbG9jLgotCShyZWxvYywgQkZEX1JFTE9DXzMyLCBCRkRfUkVMT0NfMzJfUENSRUwpIFshQkZEX0FTU0VNQkxFUl06IERlZmluZQotCXRvIHJldHVybiB6ZXJvLgotCi1XZWQgQXVnIDE4IDE2OjUxOjI5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYzogVW5kZWYgTk9fUkVMT0MgYmVmb3JlIGluY2x1ZGluZyBhb3V0L2FvdXQ2NC5oLgotCShvYmpfZWxmX3dlYWspOiBOZXcgZnVuY3Rpb24uCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBIYW5kbGUgIi53ZWFrIi4KLQkob2JqX2VsZl9zZWN0aW9uKTogSWYgc2VjdGlvbiBkaXJlY3RpdmUgaW5jbHVkZXMgYSBzdHJpbmcsIGlnbm9yZQotCWl0IGZvciBub3cuICBBY2NlcHQgInByb2diaXRzIiBmbGFnLgotCShvYmpfZWxmX3R5cGUpOiBBY2NlcHQgYEAnIGJlZm9yZSBmbGFnIG5hbWUuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZykgW0JGRF9BU1NFTUJMRVJdOiBHZXQgcmlkIG9mIGBpZigxKScKLQljb25kaXRpb24uCi0JKGZpeHVwX3NlZ21lbnQpIFtCRkRfQVNTRU1CTEVSXTogVXNlIGJmZF9pc19jb21fc2VjdGlvbiwgcmF0aGVyCi0JdGhhbiBjaGVja2luZyBmb3IgYmZkX2NvbV9zZWN0aW9uIGRpcmVjdGx5LgotCShmaXh1cF9zZWdtZW50KTogU2ltcGxpZnkgcmFuZ2UgY2hlY2suCi0JKGZpeHVwX3NlZ21lbnQpIFtPQkpfQ09GRiAmJiBUQ19JOTYwXTogU2ltcGxpZnkgY3BwIGNvbmRpdGlvbgotCXRlc3QuCi0KLQkqIHN5bWJvbHMuaCAoU19TRVRfV0VBSyk6IERlY2xhcmUuCi0JKiBzeW1ib2xzLmMgKFNfU0VUX1dFQUspOiBOZXcgZnVuY3Rpb24uCi0JKFNfU0VUX0VYVEVSTkFMLCBTX0NMRUFSX0VYVEVSTkFMKTogRG9uJ3QgYm90aGVyIHdpdGggQlNGX0VYUE9SVCwKLQlpdCdzIG5vdCBhIHNlcGFyYXRlIGZsYWcgYW55IG1vcmUuICBDbGVhciBCU0ZfV0VBSy4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogVHJlYXQgInN0cmluZyIgbGlrZSAiYXNjaXoiLgotCi1XZWQgQXVnIDE4IDE1OjMwOjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGJyYW5jaCBpbnN0cnVjdGlvbnMKLQlpZiAuc2V0IG5vYm9wdCBvciAuc2V0IHZvbGF0aWxlLgotCShncF9yZWZlcmVuY2UpOiAubGl0OCBhbmQgLmxpdDQgYXJlIGFjY2Vzc2VkIHZpYSB0aGUgR1AgcmVnaXN0ZXIuCi0JKG1hY3JvKTogQWRkZWQgY2FzZXMgTV9MSV9TLCBNX0xJX1NTLiAgRml4ZWQgTV9MSV9EIGFuZCBNX0xJX0RELgotCShtaXBzX2lwKTogQWRkZWQgY2FzZXMgJ0YnLCAnTCcsICdmJywgJ2wnIGZvciBmbG9hdGluZyBwb2ludC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYzogUmVuYW1lZCBzb21lIHZhcmlhYmxlcyB0byBhdm9pZCBzaGFkb3cKLQl3YXJuaW5ncy4KLQotTW9uIEF1ZyAxNiAxNDoxNjowMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX0NPTU1PTik6IGFkZCBtaXNzaW5nIGJhY2tzbGFzaAotCi0JKiBjb25maWd1cmUuaW4gKHo4ay0qLXtjb2ZmLHNpbX0pOiB1c2UgY29mZmJmZCBmb3IgdGhpcyB0YXJnZXQKLQotVGh1IEF1ZyAxMiAxMTo0Nzo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBTdWdnZXN0ZWQgYnkKLQlkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOiBEb24ndCBhY2NlcHQgc3ltYm9saWMKLQluYW1lcyBmb3IgJ0UnIGFuZCAnRycgYXJndW1lbnQgdHlwZXMgKGNvcHJvY2Vzc29yIHJlZ2lzdGVycykgYW5kCi0JZG9uJ3Qgd2FybiBpZiAkMSBpcyB1c2VkIG9uIHRoZSBjb3Byb2Nlc3Nvci4KLQkobWFjcm8pOiBIYW5kbGUgTV97TCxTfVdDezAsMiwzfV9BQiBjb3JyZWN0bHkuCi0KLU1vbiBBdWcgIDkgMTI6MDk6MTQgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBVc2UgQkZEX1JFTE9DXzE2IGZvciAyLWJ5dGUgdmFsdWVzLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCwgdGNfZ2VuX3JlbG9jKTogSGFuZGxlCi0JQkZEX1JFTE9DXzE2LgotCSogY29uZmlnL3RjLXNwYXJjLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0KLU1vbiBBdWcgIDkgMTM6MzY6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChtZXJnZV9kYXRhX2ludG9fdGV4dCk6IERlZmluZSBvbmx5IGlmIEJGRF9BU1NFTUJMRVIgaXMKLQlkZWZpbmVkIG9yIEJGRCBpcyBub3QuCi0JKHJlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyk6IERlY2xhcmUgbG9jYWwgdmFyaWFibGUgZnJhZ1AuCi0KLUZyaSBBdWcgIDYgMTU6MjI6NTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4LCBjYXNlIEJGRF9SRUxPQ18zMik6IEZpbGwgaW4KLQlieXRlcyB3aXRoIHJlYWwgdmFsdWVzLCBub3QgemVyb3MuCi0KLUZyaSBBdWcgIDYgMTA6NTc6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1yaXNjb3MqLCBtaXBzLSotc3lzdiopOiBOZXcgKHVudGVzdGVkKQotCXRhcmdldHMsIHVzaW5nIGVjb2ZmIGFuZCBtaXBzLWJpZy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEZyb20gZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZAotCUpvaG5zb24pOiBBZGRlZCBjYXNlIGZvciAnQycgZm9yIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIGNvZGVzLgotCi1UaHUgQXVnICA1IDEzOjA4OjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCwgY2FzZSBCRkRfUkVMT0NfNjQpOiBGaWxsIGluCi0JYnl0ZXMgd2l0aCByZWFsIHZhbHVlcywgbm90IHplcm9zLgotCShtZF9wc2V1ZG9fdGFibGUpOiBDYWxsIGNvbnMgZm9yIC51YXh3b3JkLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfcHNldWRvX3RhYmxlKTogSGFuZGxlICIuOGJ5dGUiLgotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IFVzZSBCRkRfUkVMT0NfNjQgZm9yIDgtYnl0ZSBleHByZXNzaW9ucy4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBUZXN0IERFQlVHX1NZTVMgaW5zdGVhZCBvZiBERUJVRwotCWZvciB2ZXJpZnlpbmcgc3ltYm9sIGNoYWluLgotCShtZXJnZV9kYXRhX2ludG9fdGV4dCwgcmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzKTogTmV3Ci0JZnVuY3Rpb25zLCBzcGxpdCBvdXQgZnJvbSB3cml0ZV9vYmplY3RfZmlsZS4KLQotVHVlIEF1ZyAgMyAxNTo0Mzo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc3RhYl9nZW5lcmljLCBpbiBkaXNhYmxlZCBjb2RlKTogSWYKLQlkZWJ1ZyBzZWN0aW9uIGlzIG5ldywgYWxsb2NhdGUgYW4gZXh0cmEgMTIgYnl0ZXMgYXQgaXRzIHN0YXJ0LiAgSWYKLQkiLnN0YWJzIiB0eXBlIGlzIE5fU08sIGZpbGwgaW4gZmlsZW5hbWUgc3ltYm9sIGZpZWxkIG9mIHRoYXQgZmlyc3QKLQllbnRyeS4gIFJldHVybiBlYXJseSBpZiAiZ29vZiIsIHRvIHNpbXBsaWZ5IGxhdGVyIGNvZGUgc2xpZ2h0bHkuCi0JKGFkanVzdF9zdGFiX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfZnJvYl9maWxlKTogQXBwbHkgYWRqdXN0X3N0YWJfc2VjdGlvbnMgdG8gZWFjaCBzZWN0aW9uLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24sIG9ial9lbGZfcHJldmlvdXMpOiBObyBsb25nZXIKLQlzdGF0aWMuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX3NlY3Rpb24sIG9ial9lbGZfcHJldmlvdXMpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IENhbGwgdGhlbSBmb3IgInB1c2hzZWN0aW9uIgotCWFuZCAicG9wc2VjdGlvbiIsIGFuZCBjYWxsIGNvbnMgZm9yICJ1YXdvcmQiIGFuZCAidWFoYWxmIi4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl92ZXJzaW9uKTogVXNlIEVuZ2xpc2ggaW4gZXJyb3IKLQltZXNzYWdlcy4KLQotVHVlIEF1ZyAgMyAxMToyOTowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYzogVXBkYXRlZCBmb3IgQkZEIEVDT0ZGIGNoYW5nZXMuICBOb3cgZ2V0cyB0aGUKLQlzd2FwcGluZyByb3V0aW5lcyBhbmQgZXh0ZXJuYWwgc3RydWN0dXJlIHNpemVzIHZpYSB0aGUKLQllY29mZl9iYWNrZW5kIGluZm9ybWF0aW9uLiAgTm8gbG9uZ2VyIGluY2x1ZGVzIGNvZmYvbWlwcy5oLgotCi1Nb24gQXVnICAyIDE3OjM1OjQ4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChnZXRfdGFnKTogU2F2ZSB0YWcgbmFtZSBpbiBwZXJtYW5lbnQgbWVtb3J5Ci0JYW5kIGluIGhhc2hfcHRyLT5zdHJpbmcuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBSZXNldCBzdGF0ZSB0byAwIGFmdGVyIC5hcHBsaW5lIGlmCi0JZmlsZSBuYW1lIGlzIG5vdCBzZWVuLgotCi1Nb24gQXVnICAyIDExOjUxOjQxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCwgY2FzZSBCRkRfUkVMT0NfNjQpOiBOZXcgY2FzZSwKLQlwYXJhbGxlbCB0byBCRkRfUkVMT0NfMzIuCi0JKHRjX2dlbl9yZWxvYyk6IEFjY2VwdCBCRkRfUkVMT0NfNjQuCi0KLVRodSBKdWwgMjkgMjI6MjE6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jOiBEb24ndCB1c2Ugc2hvcnQgaW50IGluIGEgcHJvdG90eXBlLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBNYWtlIHJldHVybiB2YWx1ZSBzaW1wbHkgZGVwZW5kIG9uIGNvbnRlbnRzIG9mCi0JcmV0dXJuZWQgZXhwcmVzc2lvbi4KLQotVGh1IEp1bCAyOSAxODozODozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogc3BhcmMqLWFvdXQgYW5kIHNwYXJjKi12eHdvcmtzIGFyZSBCRkQgYXNzZW1ibGVycwotCi1UaHUgSnVsIDI5IDE4OjM4OjM3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLXN1bm9zLmg6IHJlbW92ZSBzb21lIG9sZCBmdW5jdGlvbiBkZWNscyB0aGF0IGNvbmZsaWN0Ci0Jdy8gQU5TSSwgYW5kIHdoaWNoIHdlcmVuJ3QgbmVlZGVkIGFueXdheQotCi1XZWQgSnVsIDI4IDE2OjM0OjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2Zyb2Jfc3ltYm9sKTogUmVuYW1lZCBmcm9tIHRjX2Zyb2Jfc3ltYm9sLAotCWFuZCBkaXNhYmxlZCBzaW5jZSBpdCBicmVha3MgSWFuJ3MgbmV3IHN5bWJvbC12YWx1ZSBjb2RlLgotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBBY2NlcHQgbW9yZSBkaWdpdHMgaWYgQkZENjQuCi0KLVdlZCBKdWwgMjggMTE6MzA6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSWYgd2UgaGF2ZSBhIG5vcm1hbCBjb25zdGFudCB3aGVuIHdlCi0JZXhwZWN0IGEgYmlnbnVtLCB0dXJuIGl0IGludG8gYSBiaWdudW0uICBPdXRwdXQgZXh0cmEgemVyb2VzCi0JYmVmb3JlIGEgc2hvcnQgYmlnbnVtLCByYXRoZXIgdGhhbiBhZnRlci4KLQotVHVlIEp1bCAyNyAxNTo1NDoyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IENvbmRpdGlvbmFsaXplIHZlcmlmeV9zeW1ib2xfY2hhaW4gY2FsbAotCW9uIERFQlVHX1NZTVMsIG5vdCBERUJVRy4KLQkoc3ltYm9sX3JlbW92ZSk6IExpa2V3aXNlLgotCShzeW1ib2xfaW5zZXJ0KTogTGlrZXdpc2UuCi0KLVR1ZSBKdWwgMjcgMDg6NDU6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX29wdGltaXplKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYXBwZW5kX2luc24pOiBJZiBtaXBzX29wdGltaXplID09IDAsIGFsd2F5cyBpbnNlcnQgTk9QCi0JaW5zdHJ1Y3Rpb25zLiAgSWYgbWlwc19vcHRpbWl6ZSA8IDIsIGRvbid0IHN3YXAgYnJhbmNoZXMuCi0JKG1kX3BhcnNlX29wdGlvbik6IElmIC1PeCBvciAtZ3gsIHNldCBtaXBzX29wdGltaXplIGFjY29yZGluZ2x5LgotCi1Nb24gSnVsIDI2IDE4OjAyOjQzIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogaWYgdGVzdHN1aXRlIGRvZXMgbm90IGV4aXN0LCB0aGVuIHNraXAgaXQuCi0KLUZyaSBKdWwgMjMgMTQ6MTM6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChwcmV2X2luc25fdW5yZW9yZGVyZWQsCi0JcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGJyYW5jaCBpbnN0cnVjdGlvbiBpZgotCXByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkIChzZWUgY29tbWVudCkuCi0JKG1pcHNfbm9fcHJldl9pbnNuKTogQ2xlYXIgdGhlIHVucmVvcmRlcmVkIHZhcmlhYmxlcy4KLQkoc19taXBzc2V0KTogV2hlbiB0dXJuaW5nIG9uIHJlb3JkZXJpbmcsIHNldCB0aGUgdW5yZW9yZGVyZWQKLQl2YXJpYWJsZXMuCi0KLUZyaSBKdWwgMjMgMTM6MDk6NDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBTZWN0aW9ucyAiLmluaXQiIGFuZCAiLmZpbmkiCi0JYXJlIGFsc28gbWFnaWMsIGFuZCBoYXZlIHNwZWNpYWwgZGVmYXVsdCBmbGFnIHNldHRpbmdzLgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sKTogU2luY2UgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgZnVuY3Rpb24KLQlpc24ndCB1c2VkLCBkb24ndCBib3RoZXIgY2FsbGluZyBvYmpfZWxmX3dyaXRlX3N5bWJvbF9wLCBzaW5jZSBpdAotCWRvZXNuJ3QgYWNjb21wbGlzaCBhbnl0aGluZyBlbHNlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2VjdGlvbl9hbGlnbik6IFJvdW5kIHVwIHNlY3Rpb24gc2l6ZSBvbmx5Ci0JZm9yIGEub3V0IGZvcm1hdC4KLQotCSogc3ltYm9scy5jOiBEb24ndCBkZWZpbmUgREVCVUcgYnkgZGVmYXVsdC4KLQotVGh1IEp1bCAyMiAxMjowOTo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogSGFuZGxlIGEgT191bWludXMgZXhwcmVzc2lvbi4KLQotCSogZXhwci5jIChleHByKTogRG9uJ3QgbGV0IGFic29sdXRlX3NlY3Rpb24gb3ZlcnJpZGUKLQl1bmRlZmluZWRfc2VjdGlvbiBmb3IgdGhlIHJldHVybiB2YWx1ZS4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJbiBOT19QU0VVRE9fRE9UIGNhc2UsIGlmIHdlIGZpbmQgYQotCXBzZXVkby1vcCB3aXRoIGEgcG9jX2hhbmRsZXIgZmllbGQgb2YgTlVMTCwgaWdub3JlIGl0IGFuZCB0cmVhdCBpdAotCWFzIGFuIGluc3RydWN0aW9uIGluc3RlYWQuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgInNldCIgd2l0aCBhIE5VTEwKLQlwb2NfaGFuZGxlciBmaWVsZC4KLQotCSogY29uZmlnL3RjLWg4NTAwLmMgKG1kX2JlZ2luKTogVXNlIGEgbG9jYWwgdmFyaWFibGUgd2hlbgotCWluaXRpYWxpemluZyBtZF9yZWxheF90YWJsZSB0byBhdm9pZCB3YXJuaW5ncyBhYm91dCBtb2RpZnlpbmcgYQotCXN1cHBvc2VkbHkgY29uc3QgZGF0YSBzdHJ1Y3R1cmUuCi0KLVRodSBKdWwgMjIgMTA6NTg6NTEgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuYzogT25seSBpbmNsdWRlIGFvdXQvYW91dDY0LmggaWYgQkZEX0FTU0VNQkxFUgotCWlzIGRlZmluZWQuCi0KLVdlZCBKdWwgMjEgMTc6MzI6MDIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoY2FzZSAke2hvc3R9KTogIE1hcCAqLSotc3lzdjQqIHRvIGdhc19ob3N0PXN5c3YuCi0JKiBjb25maWd1cmUuaW4gKGNhc2UgJHtnZW5lcmljX3RhcmdldH0pOiAgQWRkIGlbMzRdODYtKi1zeXN2NCoKLQljYXNlIHRvIHNldCBvYmpfZm9ybWF0PWVsZi4gIE11c3QgZ28gYmVmb3JlIGkzODYtKi1zeXN2KiBjYXNlIHRoYXQKLQlzZXRzIG9ial9mb3JtYXQ9Y29mZmJzZC4gIEFkZCAqLSotc3lzdjQqIHRvICotKi1lbGYgYW5kCi0JKi0qLXNvbGFyaXMgY2FzZSwgYW5kIG1vdmUgdG8gYmVmb3JlICotc3lzdiogY2FzZSB0aGF0IHdhbnRzIHRvCi0Jc2V0IG9ial9mb3JtYXQgdG8gY29mZi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IENoYW5nZSBhbGwgJ2V4cC5YX29wJyB0bwotCSdleHAtPlhfb3AnLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4KTogIEZpeCB2YWxwIHRvIGJlICd2YWx1ZVQgKicgZm9yCi0JQkZEX0FTU0VNQkxFUiBjYXNlLgotCi1XZWQgSnVsIDIxIDEyOjQ3OjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmM6IEluY2x1ZGUgYW91dC9hb3V0NjQuaC4KLQkob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBTZXQgQlNGX0RFQlVHR0lORyBmb3IgYSBjb25zdHJ1Y3RvcgotCXN5bWJvbCwgc28gdGhhdCBCRkQgZG9lc24ndCB0YW1wZXIgd2l0aCB0aGUgdHlwZS4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJZiBOT19QU0VVRE9fRE9UIGlzIGRlZmluZWQsIGxvb2sKLQl1cCBvcGNvZGVzIGFzIHBzZXVkby1vcHMgZXZlbiBpZiB0aGV5IGRvbid0IHN0YXJ0IHdpdGggJy4nLgotCSogY29uZmlnL3RjLW04OGsuaCAoTk9fUFNFVURPX0RPVCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG1kX2Fzc2VtYmxlKTogUmVtb3ZlZCBzcGVjaWFsIHBzZXVkby1vcAotCWhhbmRsaW5nLgotCShtZF9hcHBseV9maXgpOiBTZXQgZnhfb2Zmc2V0IHRvIHRoZSB1cHBlciAxNiBiaXRzIG9mIHRoZSByZWxvYy4KLQlPdXRwdXQgdGhlIGxvdyAxNiBiaXRzIGZvciBSRUxPQ19ISTE2LCBub3QgdGhlIGhpZ2ggMTYgYml0cy4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yKTogSWYgVENfTTg4Sywgc2V0IHRoZQotCXJfb2Zmc2V0IGZpZWxkIG9mIHRoZSByZWxvYyB0byB0aGUgZml4dXAgb2Zmc2V0LgotCShmaXh1cF9zZWdtZW50cyk6IElmIFRDX004OEssIGRvbid0IHdhcm4gYWJvdXQgZml4dXAgb3ZlcmZsb3dzLgotCSogZG9jL2FzLnRleGluZm86IE1pbm9yIHVwZGF0ZXMuCi0KLVR1ZSBKdWwgMjAgMTk6Mjg6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBFeHRlbnNpdmUgY2hhbmdlcyB0byBwZXJtaXQgc3ltYm9scyB0byBjb250YWluIGFueSBleHByZXNzaW9uCi0JdHlwZSBhbmQgdG8gZGVsYXkgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBleHByZXNzaW9uIHVudGlsIHRoZQotCXZhbHVlIGlzIGFjdHVhbGx5IG5lZWRlZC4gIFRoaXMgcGVybWl0cyBzZXR0aW5nIHN5bWJvbHMgdG8gdmFsdWVzCi0JY2FsY3VsYXRlZCBiYXNlZCBvbiBvYmplY3QgY29kZSBzaXplLiAgRXhwcmVzc2lvbnMgd2VyZSBjaGFuZ2VkIHRvCi0Jbm8gbG9uZ2VyIGJlIGluIGEgc2VjdGlvbiwgdG8gc3RvcCB0aGUgb3ZlcmxvYWRpbmcgb2Ygc2VnbWVudCBhbmQKLQlleHByZXNzaW9uIHR5cGUgdGhhdCBwcmV2aW91c2x5IG9jY3VycmVkLgotCi0JKiBhcy5jIChiaWdfc2VjdGlvbiwgcGFzczFfc2VjdGlvbiwgZGlmZl9zZWN0aW9uLCBhYnNlbnRfc2VjdGlvbik6Ci0JUmVtb3ZlZC4KLQkoZXhwcl9zZWN0aW9uKTogQWRkZWQgKHVzZWQgZm9yIGR1bW15IHN5bWJvbHMgd2hpY2ggaG9sZAotCWludGVybWVkaWF0ZSBleHByZXNzaW9uIHZhbHVlcykuCi0JKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IENyZWF0ZSBleHByX3NlY3Rpb24sIGRvIG5vdCBjcmVhdGUgdGhlCi0Jc2VjdGlvbnMgbm93IHJlbW92ZWQuCi0JKiBhcy5oIChzZWdUKTogUmVtb3ZlZCBTRUdfQUJTRU5ULCBTRUdfUEFTUzEsIFNFR19CSUcsIGFuZAotCVNFR19ESUZGRVJFTkNFLiAgQWRkZWQgU0VHX0VYUFIuCi0JKFNFR19OT1JNQUwpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBzdWJzZWdzLmMgKHNlZ19uYW1lLCBzdWJzZWdzX2JlZ2luKTogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWFvdXQuYyAoc2VnX05fVFlQRSk6IERpdHRvLgotCSogY29uZmlnL29iai1ib3V0LmMgKHNlZ19OX1RZUEUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzZWdfTl9UWVBFKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoc2VnX05fVFlQRSk6IERpdHRvLgotCSogY29uZmlnL29iai12bXMuYyAoc2VnX05fVFlQRSk6IERpdHRvLgotCi0JKiBleHByLmggKG9wZXJhdG9yVCk6IE1vdmVkIGluIGZyb20gZXhwci5jLCBhZGRlZCBzb21lIHZhbHVlcy4KLQkoZXhwcmVzc2lvblMpOiBBZGRlZCBYX29wIGZpZWxkLCByZW1vdmVkIFhfc2VnIGZpZWxkOyByZW5hbWVkCi0JWF9zdWJ0cmFjdF9zeW1ib2wgdG8gWF9vcF9zeW1ib2wuCi0JKiBleHByLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIGFzc2lnbiBleHByZXNzaW9uIHR5cGVzIHJhdGhlciB0aGFuCi0Jc2VjdGlvbnMgYW5kIHRvIHNpbXBsaWZ5IHRoZSBwYXJzaW5nLgotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZpeF9uZXcpOiBSZW1vdmVkIHN1Yl9zeW1ib2wgYXJndW1lbnQuCi0JKGZpeF9uZXdfZXhwKTogTmV3IGZ1bmN0aW9uLCB0YWtlcyBleHByZXNzaW9uIGFyZ3VtZW50LgotCSogd3JpdGUuaDogUHJvdG90eXBlIGNoYW5nZXMgZm9yIGZpeF9uZXcgYW5kIGZpeF9uZXdfZXhwLgotCSogY29uZC5jIChzX2lmKTogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQkqIHJlYWQuYyAoc19sc3ltLCBwc2V1ZG9fc2V0LCBlbWl0X2V4cHIsIHBhcnNlX2JpdGZpZWxkX2NvbnMsCi0JcGFyc2VfcmVwZWF0X2NvbnMsIGdldF9zZWdtZW50ZWRfZXhwcmVzc2lvbiwKLQlnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24sIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uKTogRGl0dG8uCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlLCBTX0dFVF9WQUxVRSwgU19TRVRfVkFMVUUpOgotCURpdHRvLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9kZWYsIG9ial9jb2ZmX3ZhbCk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2RlZiwgb2JqX2NvZmZfdmFsLAotCW9ial9jb2ZmX2VuZGVmLCB5YW5rX3N5bWJvbHMpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc3RhYl9nZW5lcmljLCBvYmpfZWxmX3NpemUpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2Fzc2VtYmxlLCBwYXJzZV9vcGVyYW5kLCBtYWNoaW5lX2lwLAotCXByaW50X2luc24sIG1kX29wZXJhbmQpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChwYXJzZV9leHAsIGNvbG9ubW9kMjQsIGNoZWNrX29wZXJhbmQsCi0JZG9fYV9maXhfaW1tLCBidWlsZF9ieXRlcyk6IERpdHRvLgotCSogY29uZmlnL3RjLWg4NTAwLmMgKHBhcnNlX2V4cCwgc2tpcF9jb2xvbnRoaW5nLCBwYXJzZV9yZWdsaXN0LAotCWdldF9zcGVjaWZpYywgY2hlY2ssIGluc2VydCwgbWRfY29udmVydF9mcmFnKTogRGl0dG8uCi0JKiBjb25maWcvdGMtaHBwYS5jICh0aGVfaW5zbiwgZml4X25ld19ocHBhLCBjb25zX2ZpeF9uZXdfaHBwYSwKLQltZF9hc3NlbWJsZSwgcGFfaXAsIGdldEV4cHJlc3Npb24sIGdldEFic29sdXRlRXhwcmVzc2lvbiwKLQlldmFsdWF0ZUFic29sdXRlLCBwYV9idWlsZF91bndpbmRfc3Vic3BhY2UsIHBhX2VudHJ5LAotCXByb2Nlc3NfZXhpdCk6IERpdHRvLgotCSogY29uZmlnL3RjLWhwcGEuaCAoU1RBQl9GSVhVUCwgaXNfRFBfcmVsYXRpdmUsIGlzX1BDX3JlbGF0aXZlLAotCWlzX2NvbXBsZXgpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHBlLCBtZF9hc3NlbWJsZSwgaTM4Nl9vcGVyYW5kLAotCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBtZF9jcmVhdGVfbG9uZ19qdW1wKTogRGl0dG8uCi0JKiBjb25maWcvdGMtaTg2MC5jIChtZF9hc3NlbWJsZSwgZ2V0RXhwcmVzc2lvbiwgcHJpbnRfaW5zbik6Ci0JRGl0dG8uCi0JKiBjb25maWcvdGMtaTk2MC5jIChwYXJzZV9leHByLCBzdWJzLCBzZWdzLCBtZF9jb252ZXJ0X2ZyYWcsCi0JZ2V0X2NkaXNwLCBtZW1fZm10LCBwYXJzZV9sZGNvbnN0LCByZWxheF9jb2JyLCBzX3N5c3Byb2MsCi0JaTk2MF9oYW5kbGVfYWxpZ24pOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHN0cnVjdCBtNjhrX2V4cCwgc3RydWN0IG02OGtfaXQsIHNlZywgb3AsCi0Jc3VicywgYWRkX2ZpeCwgaXN2YXIsIG02OGtfaXAsIG1kX2Fzc2VtYmxlLCBtZF9jb252ZXJ0X2ZyYWdfMSwKLQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfY3JlYXRlX2xvbmdfanVtcCwgZ2V0X251bSk6Ci0JRGl0dG8uCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9hc3NlbWJsZSwgZ2V0X2ltbTE2LCBnZXRfcGNyLAotCW1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wKTogRGl0dG8uCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hc3NlbWJsZSwgYXBwZW5kX2luc24sIGdwX3JlZmVyZW5jZSwKLQltYWNyb19idWlsZCwgbWFjcm8sIG15X2dldEV4cHJlc3Npb24pOiBEaXR0by4gIEFsc28gcmVtb3ZlZAotCWdldF9vcHRpb25hbF9hYnNvbHV0ZV9leHByZXNzaW9uOyBqdXN0IHVzZSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbgotCWluc3RlYWQuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoZ2V0X2FkZHJfbW9kZSwgZXZhbHVhdGVfZXhwciwgY29udmVydF9paWYsCi0JZml4X25ld19uczMyaywgZml4X25ld19uczMya19leHAsIGNvbnNfZml4X25ld19uczMyayk6IERpdHRvLgotCSogY29uZmlnL3RjLW5zMzJrLmggKGZpeF9uZXdfbnMzMmsgcHJvdG90eXBlKTogRGl0dG8uCi0JKiBjb25maWcvdGMtc2guYyAocGFyc2VfZXhwLCBjaGVjaywgaW5zZXJ0LCBtZF9jb252ZXJ0X2ZyYWcpOgotCURpdHRvLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2Fzc2VtYmxlLCBzcGFyY19pcCwgZ2V0RXhwcmVzc2lvbiwKLQlwcmludF9pbnNuKTogRGl0dG8uCi0JKiBjb25maWcvdGMtdGFob2UuYyAoc3RydWN0IHRvcCwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsCi0JdGlwX29wLCBtZF9hc3NlbWJsZSk6IERpdHRvLgotCSogY29uZmlnL3RjLXZheC5jIChzZWdfb2Zfb3BlcmFuZCwgbWRfYXNzZW1ibGUsCi0JbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX2NyZWF0ZV9sb25nX2p1bXApOiBEaXR0by4KLQkqIGNvbmZpZy90Yy16OGsuYyAocGFyc2VfZXhwLCBjaGVja19vcGVyYW5kLCBuZXdmaXgpOiBEaXR0by4KLQotVHVlIEp1bCAyMCAxMjoxNzoxNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogaTM4Ni1seW54IGlzIHRoZSBzYW1lIGFzIGkzODYtY29mZgotCi1Nb24gSnVsIDE5IDE1OjIxOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9wcmV2aW91cyk6IE5ldyBmdW5jdGlvbi4KLQkocHJldmlvdXNfc2VjdGlvbiwgcHJldmlvdXNfc3Vic2VjdGlvbik6IE5ldyB2YXJzLgotCShvYmpfZWxmX3NlY3Rpb24pOiBTYXZlIGN1cnJlbnQgcGxhY2UgaW4gY2FzZSBEV0FSRiBjb2RlIHdhbnRzIHVzCi0JdG8gcG9wIGJhY2sgdG8gaXQuICBIYW5kbGUgdW5xdW90ZWQgc2VjdGlvbiBuYW1lIGFzIHdlbGwgYXMgcXVvdGVkCi0Jc2VjdGlvbiBuYW1lLiAgRG9uJ3QgY3Jhc2ggb24gaW52YWxpZCBzdHJpbmdzLgotCShvYmpfcHNldWRvX3RhYmxlKTogSGFuZGxlIG5ldyBwc2V1ZG9zICJwcmV2aW91cyIsICIyYnl0ZSIsIGFuZAotCSI0Ynl0ZSIuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmg6IERvbid0IGluY2x1ZGUgc3RydWMtc3ltYm9sLmguCi0JKG9ial9lbGZfZnJvYl9zeW1ib2wpOiBEZWNsYXJlIGFyZyBhcyBzdHJ1Y3Qgc3ltYm9sICouCi0KLQkqIHRjLXNwYXJjLmggKExPQ0FMX0xBQkVMKSBbT0JKX0VMRl06IExvY2FsIGxhYmVscyBjYW4gc3RhcnQgd2l0aAotCSJMIiBvciAiXy5MXyIuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb2ZmIGZyb20KLQl3cml0ZV9jb250ZW50cy4gIFVzZSBtZW1zZXQgaW5zdGVhZCBvZiBiemVyby4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBBcHBseSB3cml0ZV9yZWxvY3MgdG8gZWFjaCBzZWN0aW9uIGJlZm9yZQotCWFwcGx5aW5nIHdyaXRlX2NvbnRlbnRzLgotCi0JKiByZWFkLmMgKHJlYWRfYmVnaW4pOiBDYWxsIG9ic3RhY2tfYmVnaW4gd2l0aCB2YWx1ZXMgY2xvc2VyIHRvIDFLCi0JbXVsdGlwbGVzLgotCShyZWFkX2Ffc291cmNlX2ZpbGUsIGJpZ19jb25zLCBmbG9hdF9jb25zKTogVXNlIG1lbWNweSBpbnN0ZWFkIG9mCi0JYmNvcHkuCi0KLU1vbiBKdWwgMTkgMTQ6MzA6MDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwX29wKTogRG9uJ3QgZGVjcmVtZW50IHN0cmVuZCB3aGVuCi0JY2FsY3VsYXRpbmcgb3BQLT5pc2l6OyB0aGlzIHBlcm1pdHMgdGhlIGV4cHJlc3Npb24gc2l6ZSB0byBiZQotCWRldGVybWluZWQgYXMgd2VsbCwgbGF0ZXIgb24uCi0KLQkqIGV4cHIuYyAoY2xlYW5fdXBfZXhwcmVzc2lvbik6IERvbid0IGNhbmNlbCB0aGUgc3VidHJhY3Rpb24gb2YKLQl1bmRlZmluZWQgc3ltYm9scy4KLQotCSogcmVhZC5jIChzX2RhdGEpLCBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfZGF0YSk6IElmIC1SLAotCXN3aXRjaCB0byB0ZXh0IHNlY3Rpb24gcmF0aGVyIHRoYW4gZGF0YSBzZWN0aW9uLgotCi1Nb24gSnVsIDE5IDEyOjM1OjM5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCwgY2FzZSBBSU5EWCk6IEFkZCA2IHRvIG9wZXJhbmQKLQlleHByZXNzaW9uICh0byB0YWtlIHRoZSBwYy1yZWwgaW5zdHJ1Y3Rpb24gaXRzZWxmIGludG8gYWNjb3VudCkKLQliZWZvcmUgdXNpbmcgdGhlIGV4cHJlc3Npb24sIGluc3RlYWQgb2YgYWZ0ZXIuCi0KLUZyaSBKdWwgMTYgMDg6NTY6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGZsb2F0X2NvbnMpOiBTaW1wbGlmaWVkIHBhcnNpbmcgbG9naWMuICBJZgotCVJFUEVBVF9DT05TX0VYUFJFU1NJT05TIGlzIGRlZmluZWQsIGFjY2VwdCBhIHJlcGVhdCBjb3VudC4KLQotCSogc3ltYm9scy5jIChjb2xvbik6IFJhdGhlciB0aGFuIGEgc3BlY2lhbCBjYXNlIGZvciBUQ19IUFBBLAotCXVzZSBuZXcgbWFjcm8gdGNfZnJvYl9sYWJlbC4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IE1hbnkgY2hhbmdlcyB0byBzdXBwb3J0IHNpbXBsZSBhc3NlbWJsZXIKLQlvcHRpbWl6YXRpb24uCi0JKGluc25fbGFiZWwsIHByZXZfaW5zbiwgcHJldl9wcmV2X2luc24sIGR1bW15X29wY29kZSwKLQlwcmV2X2luc25fdmFsaWQsIHByZXZfaW5zbl9mcmFnLCBwcmV2X2luc25fd2hlcmUsCi0JcHJldl9pbnNuX2ZpeHAsIHByZXZfaW5zbl9pc19kZWxheV9zbG90KTogTmV3IHN0YXRpYwotCXZhcmlhYmxlcy4KLQkoaW5zbl91c2VzX3JlZywgbWlwc19ub19wcmV2X2luc24sIG1pcHNfZW1pdF9kZWxheXMsCi0JbWlwc19hbGlnbiwgc19zdHJpbmdlciwgc19taXBzX3NwYWNlKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKG1pcHNfZGVmaW5lX2xhYmVsKTogTmV3IGdsb2JhbCBmdW5jdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKTogRm9yICJhc2NpaSIsICJhc2NpeiIsICJhc2NpaXoiLCBjYWxsCi0Jc19zdHJpbmdlci4gIENoYW5nZWQgYXJndW1lbnQgdG8gZmxvYXRfY29ucyBmcm9tIDAgb3IgMSB0byAnZicKLQlvciAnZCcuICBGb3IgInNwYWNlIiBjYWxsIHNfbWlwc19zcGFjZS4KLQkobWRfYmVnaW4pOiBDYWxsIG1pcHNfbm9fcHJldl9pbnNuLgotCShhcHBlbmRfaW5zbik6IE9ubHkgaW5zZXJ0IG5lY2Vzc2FyeSBOT1AgaW5zdHJ1Y3Rpb25zLgotCShtYWNybyk6IENhbGwgbWlwc19lbWl0X2RlbGF5cyBiZWZvcmUgc2V0dGluZyBtaXBzX25vcmVvcmRlci4KLQlJbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBtaXBzX25vcmVvcmRlciByYXRoZXIgdGhhbiB1c2luZwotCXNhdmVfcmVvcmRlcl9jb25kaXRpb24uICBEb24ndCBib3RoZXIgdG8gdXNlIG5vcmVvcmRlciBpbgotCU1fTF9ET0IgYW5kIE1fTF9EQUIsIHNpbmNlIGFwcGVuZF9pbnNuIHdpbGwgbm90IGluc2VydCBhIE5PUC4KLQkobWRfYXRvZik6IEhhbmRsZSBmbG9hdGluZyBwb2ludCBudW1iZXJzIGNvcnJlY3RseSBmb3IgYm90aAotCWJpZyBhbmQgbGl0dGxlIGVuZGlhbiB0YXJnZXRzLgotCShzX2FsaWduLCBzX2NvbnMpOiBDYWxsIG1pcHNfYWxpZ24gcmF0aGVyIHRoYW4gZnJhZ19hbGlnbi4KLQkoc19jaGFuZ2Vfc2VnLCBzX2NvbnMpOiBDYWxsIG1pcHNfZW1pdF9kZWxheXMuCi0JKHNfZmxvYXRfY29ucyk6IExldCBmbG9hdF9jb25zIGRvIHRoZSB3b3JrLgotCShzX21pcHNzZXQpOiBDYWxsIG1pcHNfZW1pdF9kZWxheXMgd2hlbiBzZXR0aW5nIG5vcmVvcmRlci4KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUgdG8gYmUKLQltaXBzX2RlZmluZV9sYWJlbC4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzLCBlY29mZl9idWlsZF9wcm9jcywKLQllY29mZl9mcm9iX2ZpbGVzKTogQ29uc2lzdGVudGx5IHVzZSBTX0dFVF9WQUxVRSByYXRoZXIgdGhhbgotCWJmZF9hc3ltYm9sX3ZhbHVlLiAgV2FybiBpZiB0YWtpbmcgZGlmZmVyZW5jZSBvZiBzeW1ib2xzIGluCi0JZGlmZmVyZW50IHNlZ21lbnRzLgotCi1UaHUgSnVsIDE1IDExOjUxOjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBEaXNjYXJkIGFsbCBvcGVuIHNjb3BlcywKLQl3aXRoIGEgd2FybmluZy4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpeHVwX3NlZ21lbnQpOiBJZiBUQ19NODhLLCBkb24ndCBhZGp1c3QKLQlieSBtZF9wY3JlbF9mcm9tIGlmIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QgYSBzeW1ib2wgKHdlIHN0aWxsCi0JbmVlZCBtZF9wY3JlbF9mcm9tIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gd2l0aGluIHRoZSBzYW1lCi0JZmlsZSkuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9wY3JlbF9mcm9tKTogQ29ycmVjdGVkIHJldHVybiB2YWx1ZS4KLQkob21hZ2ljKTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUuCi0KLQkqIFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIG04OGstY29mZi4KLQkqIGNvbmZpZ3VyZS5pbiAobTg4ay0qLWNvZmYqKTogTmV3IHRhcmdldC4gIFVzZSBjb2ZmYmZkIGFuZAotCW04OGtjb2ZmLgotCSogY29uZmlnL204OGtjb2ZmLm10OiBOZXcgZmlsZS4KLQkqIHJlYWQuYyAobGV4X3R5cGUpOiBOZXcgbWFjcm8gTEVYX0FUIHRvIHNldCBsZXggdHlwZSBvZiAnQCcuCi0JKHBzZXVkb19zZXQpOiBIYW5kbGUgZGlmZmVyZW5jZSBvZiBzeW1ib2xzIGluIGRpZmZlcmVudCBmcmFnbWVudHMKLQlieSBzYXZpbmcgdGhlIGVudGlyZSBleHByZXNzaW9uIGFzIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IFJlc29sdmUgZGlmZmVyZW5jZQotCWV4cHJlc3Npb25zLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBJZiBUQ19NODhLLCBhY2NlcHQKLQkic2RlZiIgYXMgYSBzeW5vbnltIGZvciAiZGVmIi4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oOiBJZiBUQ19NODhLLCBpbmNsdWRlIGNvZmYvbTg4ay5oIGFuZCBzZXQKLQlUQVJHRVRfRk9STUFULgotCShTX0lTX0xPQ0FMKTogQW55IHN5bWJvbCB3aGljaCBpbmNsdWRlcyBcMDAxIGluIHRoZSBuYW1lIGlzIGxvY2FsLgotCSogY29uZmlnL3RjLW04OGsuYywgY29uZmlnL3RjLW04OGsuaDogTnVtZXJvdXMgY2hhbmdlcyB0byBicmluZwotCW04OGsgcG9ydCB1cCB0byBkYXRlLCBhbmQgdG8gYWRkIENPRkYgc3VwcG9ydC4KLQotV2VkIEp1bCAxNCAxNTowOTozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIFJlbW92ZWQgc3lfZm9yd2FyZCBhbmQgcmVwbGFjZWQgaXQgd2l0aCBhbiB1bmRlZmluZWQgZXhwcmVzc2lvbgotCWFzIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4KLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKTogUmVtb3ZlZCBzeV9mb3J3YXJkIGZpZWxkLiAgQWRkZWQKLQlzeV9yZXNvbHZlZCBhbmQgc3lfcmVzb2x2aW5nIHNpbmdsZSBiaXQgZmllbGRzLgotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogRG9uJ3QgaW5pdGlhbGl6ZSBzeV9mb3J3YXJkIGZpZWxkLgotCShyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IE5ldyBmdW5jdGlvbiB0byBhZGp1c3Qgc3ltYm9sIHZhbHVlIGJ5Ci0JZnJhZ21lbnQgYWRkcmVzcywgdXNpbmcgcmVjdXJzaW9uIHRvIHJlc29sdmUgZm9yd2FyZCBzeW1ib2xzLgotCSogc3ltYm9scy5oOiBBZGRlZCBwcm90b3R5cGUgZm9yIG5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuYyAocHNldWRvX3NldCk6IFNldCBzeW1ib2xQLT5zeV92YWx1ZSB0byBhbiB1bmRlZmluZWQKLQlleHByZXNzaW9uIHJhdGhlciB0aGFuIHNldHRpbmcgc3ltYm9sUC0+c3lfZm9yd2FyZC4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogVXNlIHJlc29sdmVfc3ltYm9sX3ZhbHVlIG9uCi0Jc3ltYm9scywga2VlcGluZyB0aGUgY29tbW9uIGNhc2UgKHRoZSBvbGQgYmVoYXZpb3VyKSBpbmxpbmUuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBSZW1vdmVkIHN5X2ZvcndhcmQKLQloYW5kbGluZyAoc3Vic3VtZWQgYnkgd3JpdGUuYyBjaGFuZ2UpLgotCSogY29uZmlnL29iai1jb2ZmLmMsIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl92YWwpOiBTZXQKLQlzeV92YWx1ZSByYXRoZXIgdGhhbiBzeV9mb3J3YXJkLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2VuZGVmLCB5YW5rX3N5bWJvbHMpOiBDaGVjawotCWV4cHJlc3Npb24gc2VnbWVudCByYXRoZXIgdGhhbiBzeV9mb3J3YXJkLgotCSh5YW5rX3N5bWJvbHMpOiBVc2UgcmVzb2x2ZV9zeW1ib2xfdmFsdWUuCi0JKGNyYXdsX3N5bWJvbHMpOiBSZW1vdmVkIGV4dHJhIHBhc3Mgb3ZlciBzeW1ib2xzLgotCSogY29uZmlnL29iai1hb3V0LmMsIGNvbmZpZy9vYmotYm91dC5jLCBjb25maWcvb2JqLWNvZmYuYywKLQljb25maWcvb2JqLXZtcy5jIChvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogUmVtb3ZlZCBleHRyYSBwYXNzIG92ZXIKLQlzeW1ib2xzIHdoaWNoIGhhbmRsZWQgc3lfZm9yd2FyZDsgdXNlIHJlc29sdmVfc3ltYm9sX3ZhbHVlCi0JaW5zdGVhZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oLCBjb25maWcvb2JqLWNvZmZiZmQuaCAob2JqX2Zyb2JfZm9yd2FyZF9zeW1ib2wpOgotCURlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc3RhYl9nZW5lcmljKTogQ2hlY2sgZXhwcmVzc2lvbgotCXNlZ21lbnQgcmF0aGVyIHRoYW4gc3lfZm9yd2FyZC4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19DaGVja19Gb3JfTWFpbik6IERvbid0IGluaXRpYWxpemUKLQlzeV9mb3J3YXJkOyBkbyBpbml0aWFsaXplIHN5X3Jlc29sdmVkIGFuZCBzeV9yZXNvbHZpbmcuCi0JKiBjb25maWcvdGMtaHBwYS5oIChTVEFCX0ZJWFVQKTogVXNlIHN5X3ZhbHVlLCBub3Qgc3lfZm9yd2FyZC4KLQotCSogQ2hhbmdlcyB0byBrZWVwIGEgZnVsbCBleHByZXNzaW9uIGFzIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCwgbm90Ci0JanVzdCBhIGxvbmd3b3JkOgotCSogc3RydWMtc3ltYm9sLmg6IE5ldyBmaWVsZCBzeV92YWx1ZS4KLQkqIGFzLmg6IEluY2x1ZGUgZXhwci5oIGJlZm9yZSBzdHJ1Yy1zeW1ib2wuaC4KLQkqIGV4cHIuaDogVXNlIHN0cnVjdCBzeW1ib2wgcmF0aGVyIHRoYW4gc3ltYm9sUy4KLQkqIHN5bWJvbHMuYyAoU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKTogUmV3cm90ZSB0byByZXRyaWV2ZSB2YWx1ZQotCW9mIHN5X3ZhbHVlIGZpZWxkOyBjb21waWxlIHVuY29uZGl0aW9uYWxseSwgbm90IGp1c3QgaWYKLQlCRkRfQVNTRU1CTEVSLgotCSogc3ltYm9scy5oOiBDb21waWxlIFNfe1NHfUVUX1ZBTFVFIHByb3RvdHlwZXMgdW5jb25kaXRpb25hbGx5LgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBTZXQgQkZEIHN5bWJvbCB2YWx1ZSB0byBnYXMgc3ltYm9sCi0JdmFsdWUuCi0JKiBjb25maWcvb2JqLWFvdXQuaCwgY29uZmlnL29iai1ib3V0LmgsIGNvbmZpZy9vYmotY29mZi5oLAotCWNvbmZpZy9vYmotY29mZmJmZC5oLCBjb25maWcvb2JqLWdlbmVyaWMuaCwgY29uZmlnL29iai12bXMuaAotCShTX0dFVF9WQUxVRSwgU19TRVRfVkFMVUUpOiBSZW1vdmVkIG1hY3JvIGRlZmluaXRpb25zLgotCSogY29uZmlnL29iai1pZWVlLmMgKFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6IFJlbW92ZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCwgb2JqLWNvZmZiZmQuaDogUmV3cm90ZSBzZXZlcmFsIG1hY3JvcyB0byB1c2UKLQlTX0dFVF9WQUxVRSByYXRoZXIgdGhhbiBvc3RfZW50cnkubl92YWx1ZS4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfc3ltYm9sX3RvX2NoYXJzKSwgY29uZmlnL29iai1ib3V0LmMKLQkob2JqX3N5bWJvbF90b19jaGFycyksIGNvbmZpZy9vYmotY29mZi5jIChvYmpfc3ltYm9sX3RvX2NoYXJzKSwKLQljb25maWcvb2JqLWNvZmZiZmQuYyAoc3ltYm9sX3RvX2NoYXJzKTogR2V0IHZhbHVlIHRvIHdyaXRlIG91dAotCXVzaW5nIFNfR0VUX1ZBTFVFLS1kb24ndCBhc3N1bWUgaXQgaXMgYWxyZWFkeSBzZXQuCi0JKiBjb25maWcvb2JqLWllZWUuYyAoZG9fc3ltYm9scyk6IFNldCBCRkQgc3ltYm9sIHZhbHVlIHRvIGdhcwotCXN5bWJvbCB2YWx1ZS4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKHZhcmlvdXMpOiBEb24ndCBhc3NpZ24gZGlyZWN0bHkgdG8KLQlTX0dFVF9WQUxVRTsgdXNlIFNfU0VUX1ZBTFVFIGluc3RlYWQuCi0KLVdlZCBKdWwgMTQgMDk6MzU6MjMgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBNYWtlIHNwYXJjNjQtKi1hb3V0KiB1c2UgYmZkIGdhcy4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaDgzMDBoLgotCi1UdWUgSnVsIDEzIDEyOjA5OjQ0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChsaW5lX2NvbW1lbnRfY2hhcnMpOiBBZGQgaGFzaC4KLQkocGFyc2VfZXhwLCBza2lwX2NvbG9udGhpbmcsIGJ1aWxkX2J5dGVzKTogQWRkIHN1cHBvcnQgZm9yCi0JUl9IODUwMF9ISUdIMTYgcmVsb2NhdGlvbiB0eXBlLgotCi1Nb24gSnVsIDEyIDExOjE1OjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBBbGxvdyBgQCcgdG8gaW50cm9kdWNlIGFuCi0JYXR0cmlidXRlIG5hbWUuICBIYW5kbGUgYGV4ZWNpbnN0cicgYXR0cmlidXRlLgotCi1Nb24gSnVsIDEyIDA3OjIyOjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IHdhcm4gb24gJ2knIG9yICdqJyBtaXNtYXRjaCBpZgotCXRoZXJlIGlzIGFub3RoZXIgYWx0ZXJuYXRpdmUgZm9yIHRoZSBpbnN0cnVjdGlvbi4KLQotRnJpIEp1bCAgOSAxNzozMTozNCAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBkb2MvYXMudGV4aW5mbzogdXBkYXRlcyBmb3IgSDgvMzAwSAotCi1UaHUgSnVsICA4IDE0OjQxOjQzIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLAotCW1kX251bWJlcl90b19jaGFycywgbWRfc2VjdGlvbl9hbGlnbik6IEFkanVzdGVkIHRvIHVzZSB2YWx1ZVQsCi0JYWRkcmVzc1QsIHRvIG1hdGNoIHRjLmguCi0KLVRodSBKdWwgIDggMTQ6MTU6MDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBSZXZhbXAgdG8gaGFuZGxlIGJvdGggc3ludGF4ZXMsCi0JaW5kZXBlbmRlbnQgb2YgZm9ybWF0LgotCi1UaHUgSnVsICA4IDA3OjI1OjI1IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5oIChUQ19DT05TX1JFTE9DKTogVXNlIFJfUkVMTE9ORyBpZiBoOC8zMDBoLgotCi1XZWQgSnVsICA3IDE4OjExOjA3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkZWZpbmUgQ1JPU1M9LURDUk9TU19DT01QSUxFIGlmIGl0IGlzIGEgY3Jvc3MKLQlidWlsZDsgYWxzbyByZWNvZ25pemUgaDgzMDAtKi1jb2ZmCi0KLVdlZCBKdWwgIDcgMTA6MjE6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzeW1ib2xzLmMgKGZiX2xhYmVsX2luc3RhbmNlLCBmYl9sYWJlbF9pbnN0YW5jZV9pbmMpOiBEb24ndCBkdW1wCi0JY29yZSBqdXN0IGJlY2F1c2Ugc29tZWJvZHkgdXNlcyBhIGxhYmVsIGJlZm9yZSBpdCBpcyBkZWZpbmVkLgotCi0JKiBjb25maWcvbWlwcy1vcGNvZGUuaDogTW92ZWQgdG8gb3Bjb2RlL21pcHMuaC4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEluY2x1ZGUgb3Bjb2RlL21pcHMuaCByYXRoZXIgdGhhbgotCW1pcHMtb3Bjb2RlLmguCi0JKGFwcGVuZF9pbnNuKTogQW4gZXh0cmEgTk9QIGlzIG9ubHkgbmVlZGVkIGFmdGVyIGluc3RydWN0aW9ucwotCXdoaWNoIHNldCBISSBvciBMTywgbm90IGFmdGVyIGluc3RydWN0aW9ucyB3aGljaCByZWFkIGl0LgotCShtYWNyb19idWlsZCwgbWlwc19pcCk6IFN1cHBvcnQgbmV3ICdFJywgJ0cnIGFuZCAnQicgYXJndW1lbnRzLgotCShtYWNybyk6IGNmYzEgYW5kIGN0YzEgbm93IHRha2UgInQsRyIgcmF0aGVyIHRoYW4gInQsZCIuCi0JKiBjb25maWcvdGMtbWlwcy5oIChzdHJ1Y3QgbWlwc19vcGNvZGUpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvbWlwcy1iaWcubXQsIGNvbmZpZy9taXBzLWxpdC5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6Ci0JU2V0IHRvICQoc3JjZGlyKS8uLi9pbmNsdWRlL29wY29kZS9taXBzLmguCi0KLQlHZXQgdGhlIE1JUFMgYXNzZW1ibGVyIHVwIHRvIHNwZWVkIHdpdGggb3RoZXIgZ2FzIGNoYW5nZXM6Ci0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfc2V0X3ZtYSwgZWNvZmZfZnJvYl9zeW1ib2wpOgotCVJlbW92ZWQ7IGRvbid0IGNoYW5nZSB0aGUgc3ltYm9sIHZhbHVlLgotCShlY29mZl9idWlsZF9zeW1ib2xzLCBlY29mZl9idWlsZF9wcm9jcywgZWNvZmZfZnJvYl9maWxlKTogVXNlCi0JYmZkX2FzeW1ib2xfdmFsdWUgcmF0aGVyIHRoYW4gU19HRVRfVkFMVUUgdG8gaW5jbHVkZSBzZWN0aW9uCi0Jdm1hIGluIHN5bWJvbCB2YWx1ZS4KLQkoZWNvZmZfZnJvYl9maWxlKTogSWdub3JlIEJTRl9TRUNUSU9OX1NZTSBzeW1ib2xzLCBzaW5jZSBFQ09GRgotCWRvZXNuJ3Qgb3V0cHV0IHRoZW0uICBTZXQgdGhlIHZtYSBvZiBzZWN0aW9ucy4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaDogRG9uJ3QgZGVmaW5lIG9ial9mcm9iX3N5bWJvbC4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHRjX2dlbl9yZWxvYyk6IEFkanVzdG1lbnQgYnkgc2VjdGlvbiB2bWEgaXMgbm8KLQlsb25nZXIgbmVjZXNzYXJ5LgotCSh2YXJpb3VzKTogdXNlIHZhbHVlVCByYXRoZXIgdGhhbiBsb25nLgotCi1XZWQgSnVsICA3IDA4OjMzOjMwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmggKEVOVjY0KTogRGVmaW5lIGZvciB2OS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfeHdvcmQpOiBGb3IgbnVtYmVycywgY2FsbCBiaWdfY29ucy4KLQkoc3BhcmNfaXAsIG1kX2FwcGx5X2ZpeCwgdGNfZ2VuX3JlbG9jKTogSGFuZGxlIHNvbWUgc3BhcmM2NAotCXJlbG9jYXRpb24gdHlwZXMuCi0JKG1kX251bWJlcl90b19jaGFycyk6IEhhbmRsZSA4LWJ5dGUgdmFsdWUuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9zeW1ib2wpOiBGb3IgdjksIHVzZSA2NC1iaXQgc3ltYm9sIHR5cGUuCi0KLQkqIGFzLmggKHZhbHVlVCk6IFR5cGVkZWYgbW92ZWQgaGVyZS4KLQkqIHN0cnVjLXN5bWJvbC5oICh2YWx1ZVQpOiAuLi5mcm9tIGhlcmUuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IExvY2FscyBmcm9tX2FkZHIsIHRvX2FkZHIsCi0JdGFibGVfYWRkciBhcmUgbm93IGFkZHJlc3NULiAgU3VwcGx5IHByb3RvdHlwZSBmb3IgYmZkX2FsbG9jIGZvcgotCW5vdy4KLQkoZml4dXBfc2VnbWVudCk6IExvY2FsIGFkZF9udW1iZXIgaXMgbm93IHZhbHVlVC4gIENvcnJlY3Qgc29tZQotCXJhbmdlLWNoZWNraW5nIGJ1Z3MuCi0JKHJlbGF4X2FsaWduKTogVHlwZSBgaW50JyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgdGhlIGV4cG9uZW50LgotCShmaXhfbmV3KTogQXJndW1lbnQgb2Zmc2V0IGlzIHR5cGUgb2Zmc2V0VC4gIExvY2FscyBzaXplIGFuZAotCW5ld3NpemUgYXJlIHR5cGUgdmFsdWVULgotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IEZpZWxkcyBmeF9vZmZzZXQgYW5kIGZ4X2FkZG51bWJlciBhcmUgbm93Ci0JdHlwZSB2YWx1ZVQuCi0JKGZpeF9uZXcpOiBGaXggcHJvdG90eXBlLgotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogU3ltYm9sIHZhbHVlIGlzIHR5cGUgdmFsdWVULgotCShTX1NFVF9WQUxVRSwgU19HRVRfVkFMVUUpOiBMaWtld2lzZS4KLQkoU19JU18qKTogU3BlY2lmeSBpbnQgcmV0dXJuIHR5cGUgZXhwbGljaXRseS4KLQkqIHN5bWJvbHMuaCAoc3ltYm9sX25ldywgU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKTogRml4ZWQKLQlwcm90b3R5cGVzLgotCSogcmVhZC5jIChzX2NvbW0pOiBWYWx1ZXMgcmVhZCBhcmUgdHlwZSB2YWx1ZVQuCi0JKiBleHByLmggKGV4cHJlc3Npb25TKTogRmllbGQgWF9hZGRfbnVtYmVyIGlzIGFuIG9mZnNldFQuCi0JKiB0Yy5oIChtZF9jcmVhdGVfbG9uZ19qdW1wLCBtZF9jcmVhdGVfc2hvcnRfanVtcCwKLQltZF9zZWN0aW9uX2FsaWduKTogQWRkcmVzc2VzIGFyZSBub3cgdHlwZSBhZGRyZXNzVC4KLQkobWRfbnVtYmVyX3RvX2NoYXJzLCBtZF9hcHBseV9maXgpOiBQYXNzIHZhbHVlIGFzIHZhbHVlVC4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLAotCW1kX251bWJlcl90b19jaGFycywgbWRfc2VjdGlvbl9hbGlnbik6IEFkanVzdGVkLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogSW5pdGlhbGl6ZSBgbGVuJyB2YXJpYWJsZSB0byBtYWtlCi0JZ2NjIHNodXQgdXAuCi0JKG1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLCBtZF9udW1iZXJfdG9fY2hhcnMsCi0JbWRfc2VjdGlvbl9hbGlnbik6IEFkanVzdGVkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogUGVybWl0IHVzZSBmb3Igb3RoZXIgdGhhbiBhLm91dAotCWZvcm1hdC4KLQkoc19jb21tb24pOiBIYW5kbGUgU29sYXJpcy0yIHZlcnNpb24uCi0KLQkqIGNvbmZpZy9oby1nZW5lcmljLmggKGZyZWUpOiBSZXR1cm5zIHZvaWQgaWYgX19TVERDX18uCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9lbGZfZnJvYl9zeW1ib2wsIGVsZl9mcm9iX2ZpbGUsCi0JZWxmX2ZpbGVfc3ltYm9sKTogRGVjbGFyZS4KLQotCSogZXhwci5jIChmbG9hdGluZ19jb25zdGFudCwgaW50ZWdlcl9jb25zdGFudCk6IE5vdyByZXR1cm4gdm9pZC4KLQotVGh1IEp1bCAgMSAxMjoxMzo0MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWF0Y2ggb24gc3BhcmMqLWZ1aml0c3Utbm9uZSByYXRoZXIgdGhhbgotCXNwYXJjbGl0ZSotZnVqaXRzdS1ub25lLgotCi1XZWQgSnVuIDMwIDExOjEyOjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChjb25zKTogQ29uZGl0aW9uYWxpemUgcGFyc2luZyBvZiBleHByZXNzaW9uLiAgTW92ZQotCXB1dHRpbmcgdmFsdWUgaW50byBvYmplY3QgZmlsZSBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9uLiAgU2VwYXJhdGUKLQlvdXQgTVJJIGFuZCBXQU5UX0JJVEZJRUxEUyBjYXNlcyBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucy4KLQkoZW1pdF9leHByKTogTmV3IGZ1bmN0aW9uIHRvIHdyaXRlIGRhdGEgaW50byBvYmplY3QgZmlsZS4KLQlDb25kaXRpb25hbGl6ZSBvbiBUQ19DT05TX0ZJWF9ORVcgYW5kIFRDX0NPTlNfUkVMT0MgcmF0aGVyIHRoYW4gb24KLQlwcm9jZXNzb3IgdHlwZXMuCi0JKHBhcnNlX2JpdGZpZWxkX2NvbnMpOiBOZXcgZnVuY3Rpb24gdG8gcGFyc2UgYml0ZmllbGQgZXhwcmVzc2lvbnMKLQlhcyB1c2VkIGJ5IGk5NjAgYXNzZW1ibGVycy4gIE9ubHkgY29tcGlsZWQgaWYKLQlCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TIGlzIGRlZmluZWQuCi0JKHBhcnNlX21yaV9jb25zKTogTmV3IGZ1bmN0aW9uIHRvIHBhcnNlIE1SSSBzdHlsZSBzdHJpbmdzLiAgT25seQotCWNvbXBpbGVkIGlmIE1SSSBpcyBkZWZpbmVkLgotCShwYXJzZV9yZXBlYXRfY29ucyk6IE5ldyBmdW5jdGlvbiB0byBwYXJzZSByZXBlYXQgY291bnRzLiAgT25seQotCWNvbXBpbGVkIGlmIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TIGlzIGRlZmluZWQuCi0JKiByZWFkLmggKGVtaXRfZXhwcik6IEFkZGVkIGRlY2xhcmF0aW9uIG9mIG5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1hMjlrLmggKFRDX0NPTlNfUkVMT0MpOiBEZWZpbmUgdG8gYmUgUkVMT0NfMzIuCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoVENfQ09OU19SRUxPQyk6IERlZmluZSB0byBiZSBSX1JFTFdPUkQuCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSk6IE5ldyBmdW5jdGlvbiB0bwotCXBhcnNlIGEgSFBQQSBleHByZXNzaW9uLCByYXRoZXIgdGhhbiBzcGVjaWFsIGNhc2UgaW4gY29ucwotCWZ1bmN0aW9uLgotCShjb25zX2ZpeF9uZXdfaHBwYSk6IE5ldyBmdW5jdGlvbiB0byBlbWl0IGFuIEhQUEEgZml4dXAsIHJhdGhlcgotCXRoYW4gc3BlY2lhbCBjYXNlIGluIGVtaXRfZXhwciBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiwgVENfQ09OU19GSVhfTkVXKToKLQlEZWZpbmUgdG8gdXNlIG5ldyBmdW5jdGlvbnMgZnJvbSB0Yy1ocHBhLmMuCi0JKiBjb25maWcvdGMtaTk2MC5oIChCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TKTogRGVmaW5lLgotCShXQU5UX0JJVEZJRUxEUyk6IFJlbW92ZWQ7IG5vdyBvYnNvbGV0ZS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKFJFUEVBVF9DT05TX0VYUFJFU1NJT05TKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKGNvbnNfZml4X25ld19uczMyayk6IE5ldyBmdW5jdGlvbiB0byBlbWl0IGFuCi0JTlMzMksgZml4dXAsIHJhdGhlciB0aGFuIHNwZWNpYWwgY2FzZSBpbiBlbWl0X2V4cHIgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtbnMzMmsuaCAoVENfQ09OU19GSVhfTkVXKTogRGVmaW5lIHRvIGJlCi0JY29uc19maXhfbmV3X25zMzJrLiAgQWxzbyB1c2UgUEFSQU1TIHJhdGhlciB0aGFuIGNoZWNraW5nCi0JX19TVERDX18uCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVENfQ09OU19SRUxPQyk6IERlZmluZSB0byBSRUxPQ18zMi4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnLCBhZGp1c3RfcmVsb2Nfc3ltcywgd3JpdGVfY29udGVudHMpOgotCURvbid0IGNvcmUgZHVtcCBpZiBnYXMgaGFzIG5vIGluZm9ybWF0aW9uIGFib3V0IGEgc2VjdGlvbi4KLQotV2VkIEp1biAzMCAwNjoyMToyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9iZWdpbik6IElmIHNwYXJjdjkgaXMgZGVmaW5lZCwgcmVzZXQKLQljdXJyZW50X2FyY2hpdGVjdHVyZSB0byB2OSBhdXRvbWF0aWNhbGx5LgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCk6IFVzZSBlbGY2NC1zcGFyYyBmb3IgdjkuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYzY0LmgsIGNvbmZpZy90Yy1zcGFyYzY0LmM6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIHNwYXJjNjQgY3B1IGZpbGVzIGZvciB2OSwgYW5kIGRlZmF1bHQgdG8gZWxmCi0JZm9ybWF0LgotCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpOiBBbHdheXMgZnVsbHkgcHJvY2VzcyBhIHNlY3Rpb24uCi0JU2VjdGlvbiBzaXplIGlzIGxhc3QgZnJhZydzICh2bSlhZGRyZXNzIHBsdXMgaXRzIHNpemUuICBJZiBubwotCXJlbG9jYXRpb25zIGFyZSBwcmVzZW50LCBmb3JjZSBTRUNfUkVMT0MgZmxhZyBjbGVhci4KLQkoZHVtcF9zZWN0aW9uX3JlbG9jcyk6IE5ldyBkZWJ1Z2dpbmcgcm91dGluZS4KLQkoYWRqdXN0X3JlbG9jX3N5bXMpOiBOZXcgcm91dGluZSwgYnJva2VuIG91dCBmcm9tIHdyaXRlX2NvbnRlbnRzLgotCURvbid0IGFkanVzdCByZWxvY3MgdGhhdCBhcmUgYWxyZWFkeSByZWxhdGl2ZSB0byBzZWN0aW9uIHN5bWJvbC4KLQlMb29rIGZvciBvYmpfZml4X2FkanVzdGFibGUgbWFjcm8gdG8ga25vdyB3aGF0IGVsc2UgdG8gc2tpcCwKLQlpbnN0ZWFkIG9mIG9ial93cml0ZV9zeW1ib2wuICBMb29rIGZvciBzZWN0aW9uIHN5bWJvbCBzdG9yZWQgaW4KLQlzZWN0aW9uIGluZm9ybWF0aW9uLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IE1hcCBhZGp1c3RfcmVsb2Nfc3ltcyBvdmVyIGFsbCBzZWN0aW9ucy4KLQkod3JpdGVfY29udGVudHMpOiBDbGVhciBTRUNfUkVMT0MgZmxhZyBpZiBubyByZWxvY2F0aW9ucyBhcmUKLQlmb3VuZC4KLQotCSogYXMuaCAoX19QVFJfVE9fSU5ULCBfX0lOVF9UT19QVFIpOiBOZXcgdmVyc2lvbnMgZm9yIFNhYmVyLCB0bwotCWtlZXAgaXQgcXVpZXQuCi0KLQkqIHdyaXRlLmMgKHJlbW92ZV9zdWJzZWdzKTogRG9uJ3QgZGVmaW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCi1GcmkgSnVuIDI1IDE0OjQyOjUzIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbCwgZHZpLCBpbmZvLCBpbnN0YWxsLWluZm8sIGNsZWFuLWluZm8pOiBkbyBub3QKLQkgIGVjaG8gcmVjdXJzaW9uIGxpbmVzLgotCSAgKGluc3RhbGwtaW5mbywgY2xlYW4taW5mbyk6IGNvbGxhcHNlIGludG8gdGhlIGR2aSBhbmQgaW5mbyBydWxlLgotCi1GcmkgSnVuIDI1IDEwOjQ3OjI0IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFJlbW92ZSBzdXBwb3J0IGZvciAlZC8lcSBmcCByZWdzLgotCUFsbCBmcCByZWdzIGFyZSBub3cgc3BlY2lmaWVkIGFzICVmLgotCShwcml2X3JlZ190YWJsZSk6IGZwcSAtPiBmcS4KLQotRnJpIEp1biAyNSAwMzo0MzowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogYXMuaCAoc3Ryc3RyKTogRGlzYWJsZSBkZWNsYXJhdGlvbiBmb3Igbm93LgotCShmcHJpbnRfdmFsdWUsIHNwcmludF92YWx1ZSk6IERlY2xhcmUuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ld19yZXN0KTogVXNlIG1lbXNldCB0byBjbGVhciBuZXcgZnJhZy4KLQkoc3Vic2VnX25ldykgW0JGRF9BU1NFTUJMRVJdOiBJbml0aWFsaXplIGFsbCBzZWdpbmZvIGZpZWxkcy4KLQotCSogZXhwci5jIChleHByX3BhcnQpOiBNYWRlIHNhbml0eSBjaGVja3MgYS5vdXQtc3BlY2lmaWMuCi0JKGV4cHIpOiBEaXNhYmxlZCBzYW5pdHkgY2hlY2tzLgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKSBbQkZEX0FTU0VNQkxFUl06IEFkZCBmaWVsZCBmb3IKLQlzZWN0aW9uIHN5bWJvbC4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSk6IEluaXRpYWxpemUgc2VjdGlvbiBzeW1ib2wgcG9pbnRlcgotCXdoZW4gc2V0dGluZyB1cCBhIG5ldyBzZWN0aW9uLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpIFtCRkRfQVNTRU1CTEVSXTogUG9pbnQgQkZEIHN5bWJvbCdzIHVkYXRhCi0JZmllbGQgYmFjayBhdCBnYXMgc3ltYm9sIHN0cnVjdHVyZS4KLQotCSogc3ltYm9scy5jIChjb2xvbik6IENhc3Qgb2JzdGFja19uZXh0X2ZyZWUgdmFsdWUgdG8gY2hhciogYmVmb3JlCi0JZG9pbmcgYXJpdGhtZXRpYyBvbiBpdC4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ld19yZXN0KTogTGlrZXdpc2UuCi0JKiBhcy5oIChmcmFnX25vd19maXgpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2ZpbGVfc3ltYm9sKTogVXNlIHN1YnNlZ19uZXcgaW5zdGVhZCBvZgotCWNhbGxpbmcgYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IGRpcmVjdGx5LCBhbmQgY2FsbCBzdWJzZWdfc2V0Ci0JaW5zdGVhZCBvZiBzdWJzZWdfY2hhbmdlLiAgTm93IHJldHVybnMgdm9pZC4KLQkob2JqX2VsZl93cml0ZV9zeW1ib2wpOiBPbmx5IGNoZWNrIGxvY2FsIHN5bWJvbHMgZm9yIG5vdy4KLQkoZWxmX3N0YWJfc3ltYm9sKTogTm93IHN0YXRpYyBhbmQgdm9pZCwgYW5kIGRpc2FibGVkIHVudGlsIGl0Ci0Jd29ya3MgY29tcGxldGVseS4KLQkob2JqX2VsZl9zaXplKTogRm9yIGV4cHJlc3Npb24gdmFsdWVzLCBmYWlsIHNpbGVudGx5IGZvciBub3cuCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEbyBub3RoaW5nLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyCi0JcmVsb2NhdGlvbi4KLQkoc19sb2NhbCkgW09CSl9FTEZdOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSkgW09CSl9FTEZdOiBDYWxsIGl0IGZvciAibG9jYWwiLgotCShzX2NvbW1vbik6IFJlYXJyYW5nZSB0byBoYW5kbGUgU29sYXJpcyAuY29tbW9uIHBzZXVkbywgd2hpY2ggbWF5Ci0Jc29tZXRpbWVzIHVzZSBic3Mgc3BhY2UgaW5zdGVhZCBvZiBjb21tb24uCi0JKiBjb25maWcvb2JqLWVsZi5oIChUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IEFkZCBuZXcgYGxvY2FsJyBmaWVsZC4KLQotVGh1IEp1biAyNCAxNjozMzo1MyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogc2V0IGhvc3QgY29uZmlnIHRvIGhwdXggZm9yIGhwcGEqLWhwLWhwdXgKLQotVGh1IEp1biAyNCAxMzozNTowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGFwcF9wb3AsIGFwcF9wdXNoKTogRml4IGJ1ZyByZXBvcnRlZCBieSBDaHJpcyBBcnRodXIuCi0KLVR1ZSBKdW4gMjIgMDE6MDQ6MjMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldyk6IERvbid0IHNwZWNpYWwtY2FzZSBhLm91dCAtUiBmbGFnIGhlcmUuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAoc19zZWN0KTogRG8gaXQgaGVyZS4KLQotCSogYXMuaCAoQkFEX0NBU0UpOiBEb24ndCBtYWtlIHNvbWUgbGFtZSBjb21waWxlcnMgdGhpbmsgd2Ugd2FudAotCXN1YnN0aXR1dGlvbiBpbnNpZGUgc3RyaW5ncy4KLQotCSogYXMuYyAocHJpbnRfdmVyc2lvbl9pZCk6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb2ZmIGZyb20gbWFpbi4KLQkobWFpbik6IENhbGwgaXQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcGFyc2Vfb3B0aW9uKSBbT0JKX0VMRl06IFByaW50IHZlcnNpb24gaWQKLQlmb3IgLVYuICBJZ25vcmUgLVEgYW5kIC1zIG9wdGlvbnMgZm9yIG5vdy4KLQotTW9uIEp1biAyMSAxNzozNzo1OSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYWtlIGluc3RhbGxhdGlvbiAmIGJ1aWxkcyB3b3JrIGFnYWluIGZvciBjcm9zc2VzCi0KLVN1biBKdW4gMjAgMTg6MTg6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBSZXdyaXRlIHRvIHByaW50IHdpZGUgKD4zMiBiaXRzKQotCXN5bWJvbCB2YWx1ZXMgY29ycmVjdGx5LgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERlbGV0ZWQgdW51c2VkIHZhcmlhYmxlcy4KLQkoZml4dXBfc2VnbWVudCk6IFVzZSBzcHJpbnRfdmFsdWUuCi0KLQkqIG1lc3NhZ2VzLmMgKHNwcmludF92YWx1ZSwgZnByaW50X3ZhbHVlKTogTmV3IHJvdXRpbmVzLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfc3RhYl9zeW1ib2wpOiBOb3cgcmV0dXJucyB2b2lkLgotCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6IEZpeCB0eXBvIGluIGxvZ2ljLgotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBMb29rIGluIC4uL2JmZCBmb3IgYmZkLmguCi0KLQkqIGFzLmggKGFkZHJlc3NULCBvZmZzZXRUKTogTmV3IHR5cGVzLCB1c2luZyBCRkQgdHlwZXMgaWYKLQlhdmFpbGFibGUuCi0JKHJlbGF4X2FkZHJlc3NULCBzdHJ1Y3QgZnJhZyk6IFVzZSB0aGVtLgotCSogc3RydWMtc3ltYm9sLmggKHZhbHVlVCwgc3RydWN0IGJyb2tlbl93b3JkKTogTGlrZXdpc2UuCi0KLQkqIGFzLmggKHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogTmFtZSBhcmd1bWVudCBpcyBjb25zdC4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldykgW0JGRF9BU1NFTUJMRVJdOiBOYW1lIGFyZ3VtZW50IGlzIGNvbnN0LgotCi1UaHUgSnVuIDE3IDE2OjUzOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjYW5vbmljYWxpemUgaW5zdGFsbC5zaDsgZm9yIHVzZSB3aXRoaW4KLQl0aGlzIGRpcmVjdG9yeSAoYW5kIHN1YmRpcnMpCi0KLVN1biBKdW4gMjAgMDI6MzQ6MDQgMTk5MyAgQXNobGV5IFNhdWxzYnVyeSAoYW5zQHNpY3Muc2UpCi0KLQkqIG04OGstb3Bjb2RlLmggOiBmaXhlZCB0aW55IHRpbnkgbWlzdGFrZSAtIHhjciB3YXMgaW5jb3JyZWN0bHkKLQlzcGVjaWZpZWQsIHNob3VsZCBoYXZlIGJvdGggUzEgYW5kIFMyIGZpZWxkcyBpZGVudGljYWwKLQlJZiBvbmx5IGZpbmRpbmcgdGhlIHByb2JsZW0gd2FzIGFzIGZhc3QgYXMgZml4aW5nIHRoZSBidWcgISEhIQotCi1UdWUgSnVuIDE1IDE2OjAxOjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBEbyB3cml0ZSBvdXQgbm9uLWxvYWRhYmxlIHNlY3Rpb25zLgotCURlYnVnIHNlY3Rpb25zIGNhbiBmYWxsIGluIHRoaXMgY2F0ZWdvcnkuCi0KLQkqIHJlYWQuYyAoc19hcHBfZmlsZSk6IENhbGwgZWxmX2ZpbGVfc3ltYm9sIGZvciBFTEYgZmlsZXMuCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZmlsZV9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9zdGFiX3N5bWJvbF9zdHJpbmcpOiBSZW5hbWVkIGZyb20gcGFfLi4uLAotCWFkZGVkIGFyZ3VtZW50IHRvIHNwZWNpZnkgc2VjdGlvbiBiYXNlIG5hbWUuCi0JKG9ial9lbGZfc3RhYl9nZW5lcmljKTogUmVuYW1lZCBmcm9tIC4uLl9zdGFiLiAgTmV3IGFyZ3VtZW50Ci0Jc3BlY2lmaWVzIHNlY3Rpb24gYmFzZSBuYW1lLgotCShvYmpfZWxmX3N0YWIpOiBOZXcgZnVuY3Rpb24sIGNhbGxzIG9ial9lbGZfc3RhYl9nZW5lcmljIHdpdGgKLQkiLnN0YWIiIGFzIHNlY3Rpb24gYmFzZSBuYW1lLgotCShvYmpfZWxmX3hzdGFiKTogTmV3IGZ1bmN0aW9uLCBjYWxscyBvYmpfZWxmX3N0YWJfZ2VuZXJpYy4KLQkob2JqX2VsZl90eXBlKTogSGFuZGxlICJvYmplY3QiLiAgVXNlIGJpdHdpc2Utb3IgdG8gbWVyZ2UgaW4KLQlzeW1ib2wgZmxhZ3MgcmF0aGVyIHRoYW4gc2ltcGx5IHJlcGxhY2luZywgc28gZ2xvYmFsL2xvY2FsIGZsYWdzCi0JYXJlIHByZXNlcnZlZC4KLQkob2JqX2VsZl9pZGVudCk6IFJld3JpdGUuCi0KLVR1ZSBKdW4gMTUgMTc6MDM6MjUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHBhcmVudGRpciBzdXBwb3J0OyB1c2UgSU5TVEFMTF9YRk9STQotCi1XZWQgSnVuICA5IDExOjI2OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKTogLmFsaWduIHVzZXMgYSBwb3dlciBvZiB0d28KLQlmb3IgYW55IGEub3V0IHRhcmdldCwgbm90IGp1c3QgTGludXggYW5kIDM4NkJTRC4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKERPVF9MQUJFTF9QUkVGSVgpOiBEbyBub3QgZGVmaW5lIGZvciBhbnkgYS5vdXQKLQl0YXJnZXQuCi0KLU1vbiBKdW4gIDcgMTM6MzM6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTg4ay5jOiBEb24ndCBpbmNsdWRlIGZsb251bS5oLCBtZC5oLCBtODhrLmguICBUaGV5Ci0JZG9uJ3QgZXhpc3Qgb3IgZHVwbGljYXRlIG90aGVyIGluY2x1c2lvbnMuCi0KLQkqIGNvbmZpZy90Yy12YXguaCAoTk9fUkVMT0MpOiBEZWZpbmUuCi0KLU1vbiBKdW4gIDcgMDk6NTU6MDMgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogRml4IHBhcnNpbmcgb2YgYXNpIG51bWJlci4KLQlGaXggZXJyb3IgbWVzc2FnZS4KLQotU2F0IEp1biAgNSAxOTozMjo1MiAxOTkzICBUb3Jiam9ybiBHcmFubHVuZCAgKHRlZ2VAbmFkYS5rdGguc2UpCi0KLQkqIGdhcy9jb25maWcvbTg4ay1vcGNvZGUuaCAobTg4a19vcGNvZGVzKTogQWRkIDg4MTEwIGluc3RydWN0aW9ucy4KLQkqIGdhcy9jb25maWcvdGMtbTg4ay5jIChnZXRfcmVnKTogTmV3IGFyZyByZWdfcHJlZml4LiAgQ29tcGFyZSBmaXJzdAotCWNoYXIgdG8gcmVnX3ByZWZpeCBpbnN0ZWFkIG9mIHRvICdyJy4KLQkoY2FsY29wKTogQ2hhbmdlIGNhbGxzIHRvIGdldF9yZWcuCi0JKGNhbGNvcCk6IEhhbmRsZSBuZXcgY2FzZSAneCcgdG8gc2V0IHJlZ19wcmVmaXguCi0JKGNhbGNvcCk6IFNldCByZWdfcHJlZml4IHRvICdyJyBhZnRlciBlYWNoIGNhbGwgdG8gZ2V0X3JlZy4KLQkoY21wc2xvdCk6IEFkZCA4ODExMCBjb25kaXRpb25zLgotCi0JKiBnYXMvY29uZmlnL204OGstb3Bjb2RlLmg6IFN3YXAgY2FzZXMgZm9yICJyb3QiIGZvciBjb25zaXN0ZW5jeS4KLQotCSogZ2FzL2NvbmZpZy90Yy1tODhrLmMgKGdldF9iZik6IEFsd2F5cyByZXN0b3JlIGlucHV0X2xpbmVfcG9pbnRlcgotCWJlZm9yZSByZXR1cm5pbmcuCi0KLQkqIGdhcy9jb25maWcvbTg4ay1vcGNvZGUuaCAobTg4a19vcGNvZGVzKTogTWFrZSBlcXVhbCBtbmVtb25pY3MKLQlhZGphY2VudDsgbW92LnMgYW5kIG1vdi5kIHN3YXBwZWQuCi0JKG04OGtfb3Bjb2Rlcyk6IEZpeCB0eXBvIGByMicgLT4gYDInLgotCi1GcmkgSnVuICA0IDE1OjU5OjMxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oODMwMC5jOiBTdXBwb3J0IGZvciBIOC8zMDAtSCBvcGNvZGVzLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAod19zdHJpbmdzKTogU3RyaW5nIHRhYmxlIGxlbmd0aCBpcyA0Ci0JYnl0ZXMsIG5vIG1hdHRlciB3aGF0IHRoZSBob3N0IGludCBzaXplIGlzLgotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLSotb3NmKik6IE5ldy4KLQotRnJpIEp1biAgNCAwNzo1MToxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWVjb2ZmbCopOiBOZXcgdGFyZ2V0OyB1c2UgZWNvZmYgYW5kCi0JbWlwcy1saXQuCi0JKG1pcHMtKi1lY29mZiopOiBBZGRlZCB0cmFpbGluZyAnKicuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfYnVpbGRfcHJvY3MpOiBGb3JjZSB0aGUgYWRyIG9mIHRoZQotCWZpcnN0IEZEUiBpbiBhIGZpbGUgdG8gYmUgemVyby4KLQotVGh1IEp1biAgMyAxNDowOTo1OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogSnVtcCB0byAyLjEuNC4KLQotCSogY29uZmlnL2hvLWhwcGFic2QuaDogTmV3IGZpbGUsIGZyb20gUGV0ZXIgSG9vZ2VuYm9vbS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXNzZW1ibGUpOiBDYWxsIGJmZF9zZXRfZ3Bfc2l6ZSBvbmx5IGZvcgotCUVDT0ZGIGZvcm1hdC4KLQotVHVlIEp1biAgMSAxNToyMTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2Fzc2VtYmxlKTogVGhlIDY4MDQwIGNwdSBkb2Vzbid0IHdhbnQgYQotCXNlcGFyYXRlICc4NTEgbW11LgotCi0JKiBjb25maWcvb2JqLWVsZi5jLCBjb25maWcvb2JqLWVsZi5oOiBVcGRhdGUgZm9yIG5ldyB0eXBlLCBtYWNybywKLQlhbmQgcm91dGluZSBuYW1lcy4gIEFzc3VtaW5nIDMyIGJpdHMgZm9yIG5vdy4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IExvb2sgZm9yIG1hY3JvCi0JZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vaywgaW5zdGVhZCBvZiBhc3N1bWluZyBhIGZ1bmN0aW9uCi0JYWx3YXlzIGV4aXN0cy4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vayk6IFJlbmFtZWQgZnJvbQotCXRjX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vay4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGVsZl90Y19maW5hbF9wcm9jZXNzaW5nX2hvb2spOiBVc2UgaXQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGVsZl90Y19zeW1ib2wsIGVsZl90Y19tYWtlX3NlY3Rpb25zKTogTWFjcm9zCi0JbW92ZWQgaGVyZSBmcm9tIG9iai1lbGYuaC4KLQkqIGNvbmZpZy9vYmotZWxmLmg6IERvbid0IGluY2x1ZGUgQ1BVLXNwZWNpZmljIGhlYWRlciBmaWxlcy4KLQotU3VuIE1heSAzMCAxNjo0OTozNyAxOTkzICBQZXRlciBIb29nZW5ib29tICAoaG9vZ2VuQGZhc3QuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbjogY29uZmlndXJhdGlvbnMgc2hvdWxkIG1hdGNoIG9uICdocHBhKicgbm90ICdocHBhJy4KLQotCSogcmVhZC5jOiBBZGQgc3VwcG9ydCBmb3IgSFBQQSBhc3NlbWJseSBsYW5ndWFnZSBzeW50YXggKGRlbm90ZWQKLQl3aXRoICcjaWZkZWYgVENfSFBQQScpLgotCi0JKiBzeW1ib2xzLmM6IEFkZCBzdXBwb3J0IGZvciBIUFBBIGFzc2VtYmx5IGxhbmd1YWdlIHN5bnRheCAoZGVub3RlZAotCXdpdGggJyNpZmRlZiBUQ19IUFBBJykuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogIEFkZCBzdXBwb3J0IGZvciBIUFBBLXN0eWxlCi0JcmVsb2NhdGlvbnMuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmM6IFN0YWIgc3ltYm9scyB3ZXJlbid0IHdyaXR0ZW4gcHJvcGVybHkuCi0JKG9ial9lbGZfdmVyc2lvbik6Ci0JKG9ial9lbGZfZGVzYyk6Ci0JKG9ial9lbGZfd3JpdGVfc3ltYm9sKToKLQkob2JqX2VsZl93cml0ZV9zeW1ib2xfcCk6Ci0JKG9ial9lbGZfZnJvYl9zeW1ib2wpOgotCShlbGZfc3RhYl9zeW1ib2wpOgotCShlbGZfZnJvYl9maWxlKToKLQotCSogY29uZmlnL3RjLWhwcGEuYzogU3VwcG9ydCBmb3IgSFBQQSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb25zLgotCVJlbW92ZSBzb21lIHVudXNlZCBjb2RlLiAgU3VwcG9ydCBmb3IgSFBQQSBhc3NlbWJseSBsYW5ndWFnZQotCXN5bnRheC4KLQotCSogYXBwLmM6Ci0KLQkqIHN5bWJvbHMuYzoKLQotCSogY29uZmlnL29iai1lbGYuaDoKLQkob2JqX3dyaXRlX3N5bWJvbCk6Ci0JKG9ial9mcm9iX2ZpbGUpOgotCShlbGZfdGNfc3ltYm9sKToKLQkoZWxmX3RjX21ha2Vfc2VjdGlvbnMpOgotCi0JKiBjb25maWcvdGMtaHBwYS5oOgotCi1TdW4gTWF5IDMwIDIxOjQ0OjQ1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9yZWFkX2JlZ2luX2hvb2ssIGFkZF9maWxlKTogQXNzdW1lCi0JaGFzaF9uZXcgd2lsbCBoYXZlIHN1Y2NlZWRlZCBpZiBpdCByZXR1cm5zLgotCSogY29uZmlnL3RjLWEyOWsuYyAobWRfYmVnaW4pOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfYW91dF9maXhfdG9fY2hhcnMpOiBOb3cgbmJ5dGVzX3JfbGVuZ3RoIGlzCi0JY29uc3QuCi0JKG1vZGVfZnJvbV9kaXNwX3NpemUsIG9wY29kZV9zdWZmaWNfdG9fdHlwZSk6IE5vdyBpbmxpbmUgdW5kZXIKLQlnY2MuCi0JKGZpdHNfaW5fe3NpZ25lZCx1bnNpZ25lZH1fe2J5dGUsd29yZH0pOiBMaWtld2lzZS4KLQotCSogZXhwci5jOiBEZWxldGUgcmVnaXN0ZXIgZGVjbGFyYXRpb25zOyBnY2MgaWdub3JlcyB0aGVtIGFueXdheXMuCi0KLUZyaSBNYXkgMjggMTk6MDM6MzIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBoYXNoLmMgKGhhc2hfbmV3KTogVXNlIHhtYWxsb2MsIHNpbmNlIG1hbnkgY2FsbGVycyBkb24ndCBjaGVjawotCWZvciBmYWlsdXJlLgotCi1UaHUgTWF5IDI3IDEzOjAyOjE1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZnJhZ3MuYyAoemVyb19hZGRyZXNzX2ZyYWcsIGJzc19hZGRyZXNzX2ZyYWcpOiBUaGVzZSBhcmUKLQlleHRlcm5hbC4KLQotCSogdGMuaCAobWRfcmVsb2Nfc2l6ZSk6IFRoaXMgaXMgY29uc3QuCi0JKiBjb25maWcvdGMte2EyOWssaDgzMDAsaDg1MDAsaTM4NixpODYwLGk5NjAsbTY4ayxuczMyayx6OGt9LmMKLQkobWRfcmVsb2Nfc2l6ZSk6IE5vdyBjb25zdC4KLQotCSogY29uZmlnL2FvdXRfZ251LmggKGVudW0gbWFjaGluZV90eXBlLCBlbnVtIHJlbG9jX3R5cGUpOiBEZWxldGUKLQl0cmFpbGluZyBjb21tYXMuCi0JKiBhcy5oIChlbnVtIF9zZWdUKTogRGl0dG8uCi0KLQkqIHN0cnVjLXN5bWJvbC5oIChOX1RZUEVfc2VnKTogVGhpcyBzaG91bGQgYmUgY29uc3QuCi0KLVRodSBNYXkgMjcgMTE6NDM6NTkgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoYWRkX2ZpbGUpOiBDYXN0IGZpbGVfbmFtZSB0byBjaGFyICogaW4KLQlsaXN0aW5nX3NvdXJjZV9maWxlIGNhbGwuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9zdGFiX3N5bWJvbF9zdHJpbmcpOiBDYXN0IGZpcnN0IGFyZ3VtZW50Ci0Jb2Ygc3Vic2VnX25ldyBjYWxsIHRvIGVsaW1pbmF0ZSBjb25zdCBhdHRyaWJ1dGUuCi0JKG9ial9lbGZfc3RhYik6IERpdHRvLgotCShvYmpfc3ltYm9sX25ld19ob29rKTogQ2FzdCBmaXJzdCBhcmd1bWVudCBvZiBiemVybyBjYWxsIHRvIGNoYXIgKi4KLQotCSogcmVhZC5jIChzX2FsaWduX2J5dGVzKTogUHJvcGVybHkgcmVjb3JkIGFsaWdubWVudC4KLQotCSogZXhwci5jIChfXyk6IFVuZGVmaW5lIF9fIG1hY3JvIGJlZm9yZSB1c2UsIHNpbmNlIE9TRi8xIHVzZXMgaXQKLQlmb3IgdGhlIHByb3RvdHlwZS9ubyBwcm90b3R5cGUgbWFjcm8uCi0KLQkqIGFzLmMgKGdvdF9zaWcpOiBEb24ndCBkbyByZXR1cm4gKChTSUdUWSkgMCksIFNJR1RZIG1pZ2h0IHdlbGwgYmUKLQl2b2lkLgotCi0JKiBhcy5oIChyZWxheF9zdGF0ZVQgZW51bSk6IERlbGV0ZSB0cmFpbGluZyBjb21tYS4KLQotVGh1IE1heSAyNyAxMTowNzo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IExldCBsaW5lX2NvbW1lbnRfY2hhcnMgb3ZlcnJpZGUKLQljb21tZW50X2NoYXJzLgotCShkb19zY3J1Yl9uZXh0X2NoYXIpOiBJZiBhIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIgaXMgbm90IGF0IHRoZQotCXN0YXJ0IG9mIGEgbGluZSwgdHJlYXQgaXQgYXMgYSBjb21tZW50IGNoYXJhY3RlciBpZiBpdCBpcyBvbmUuCi0JRm9yIGEgQ1BQIGxpbmUgY29tbWVudCB1c2UgcHNldWRvLW9wIC5hcHBsaW5lIHJhdGhlciB0aGFuIC5saW5lLgotCSogaW5wdXQtc2NydWIuYyAobG9naWNhbF9pbnB1dF9saW5lKTogTWFrZSBpbnQgcmF0aGVyIHRoYW4KLQl1bnNpZ25lZC4KLQkoaW5wdXRfc2NydWJfcHVzaCwgaW5wdXRfc2NydWJfYmVnaW4pOiBJbml0aWFsaXplCi0JbG9naWNhbF9pbnB1dF9saW5lIHRvIC0xIHJhdGhlciB0aGFuIDAuCi0JKGJ1bXBfbGluZV9jb3VudGVycyk6IEluY3JlbWVudCBsb2dpY2FsX2lucHV0X2xpbmUuCi0JKG5ld19sb2dpY2FsX2xpbmUpOiBJZiBsaW5lX251bWJlciBpcyAtMiwgZGVjcmVtZW50Ci0JbG9naWNhbF9pbnB1dF9saW5lLgotCShhc193aGVyZSk6IFVzZSBsb2dpY2FsX2lucHV0X2xpbmUgZXZlbiBpZiBpdCBpcyAwLgotCSogcmVhZC5oIChzX2FwcF9maWxlIHByb3RvdHlwZSk6IE5vdyB0YWtlcyBhbiBpbnQgYXJndW1lbnQuCi0JKiByZWFkLmMgKHBvdGFibGUpOiBNYWtlIC5hcHBmaWxlIGNhbGwgc19hcHBfZmlsZSB3aXRoIDEuICBOZXcKLQkuYXBwbGluZSBwc2V1ZG8tb3AgY2FsbHMgc19hcHBfbGluZS4KLQkoc19hcHBfZmlsZSk6IElmIC5hcHBmaWxlLCBjYWxsIG5ld19sb2dpY2FsX2xpbmUgd2l0aCAtMiB0bwotCWFjY291bnQgZm9yIG5ld2xpbmUgaW5zZXJ0ZWQgYnkgZG9fc2NydWJfbmV4dF9jaGFyLiAgSWYgbGlzdGluZywKLQljYWxsIGxpc3Rpbmdfc291cmNlX2ZpbGUuCi0JKHNfYXBwX2xpbmUpOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlIGZha2UgcHNldWRvLW9wIC5hcHBsaW5lLgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBNYWtlIC5hcHBsaW5lIGNhbGwKLQlvYmpfY29mZl9sbi4KLQkob2JqX2NvZmZfbG4pOiBBZGRlZCBhcmd1bWVudCB0byBpbmRpY2F0ZSB3aGV0aGVyIC5hcHBsaW5lLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBNYWtlIC5hcHBsaW5lIGNhbGwKLQlvYmpfY29mZl9sbi4KLQkob2JqX2NvZmZfbG4pOiBBZGRlZCBhcmd1bWVudCB0byBpbmRpY2F0ZSB3aGV0aGVyIC5hcHBsaW5lLgotCSogY29uZmlnL3RjLW1pcHMuYyAoc19maWxlKTogUGFzcyBhcmd1bWVudCB0byBzX2FwcF9maWxlLgotCi1UdWUgTWF5IDI1IDExOjU5OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1ib3V0LmggKFNfR0VUX1ZBTFVFKTogUmVtb3ZlZCB1bm5lY2Vzc2FyeSBjYXN0LgotCi1UaHUgTWF5IDIwIDE5OjE0OjI0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBTdHJhaWdodGVuIG91dCBjaGVjayBmb3IKLQlpbnZhbGlkIHZhbHVlcy4KLQotV2VkIE1heSAxOSAwNzozMzoxNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDUwMDAuYyAoYnVpbGRfYnl0ZXMpOiBVbmRlcnN0YW5kIEByZCBtb2RlIGFuZCBidWlsZAotCXJlbG9jYXRpb25zIGNvcnJlY3RseS4KLQotTW9uIE1heSAxNyAxNTowNjoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBMZWF2ZSBvdXQgVEVYSTJEVkkgZm9yIG5vdywgYmVjYXVzZQotCWl0J3Mgd3JvbmcuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogQXBwbHkgcmFuZ2UgY2hlY2tzIGFuZCB3YXJuCi0JaWYgdmFsdWUgaXMgb3V0IG9mIHJhbmdlLgotCi0JUGF0Y2ggZnJvbSBNaW5oIFRyYW4tTGU6Ci0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBGb3IgaW4vb3V0IHBvcnQgcmVnaXN0ZXIgdXNlZAotCWFzIGJhc2UgcmVnLCBpbmNsdWRlIEluT3V0UG9ydFJlZyBpbiBvcGVyYW5kIHR5cGUuCi0JKE1BVENIKTogQWNjZXB0IG92ZXJsYXAgdmFsdWUgb2YgSW5PdXRQb3J0UmVnLgotCi1Nb24gTWF5IDE3IDA5OjI5OjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChhZGRfZmlsZSwgb2JqX2Vjb2ZmX2xvYywgb2JqX2Vjb2ZmX3N0YWIpOgotCUFkZCBjYWxscyB0byBsaXN0aW5nIHJvdXRpbmVzIHRvIHByb2R1Y2UgY29tYmluZWQgc291cmNlL2Fzc2VtYmxlcgotCWxpc3RpbmdzLgotCShvYmpfZWNvZmZfc3RhYik6IENyZWF0ZSBhIGZpbGUgcG9pbnRlciBpZiBub25lIHVzZWQgeWV0LgotCShlY29mZl9mcm9iX2ZpbGUpOiBTZXQgc3ltY291bnQgdG8gY29ycmVjdCB2YWx1ZS4KLQotRnJpIE1heSAxNCAwNjo1MzozMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBCdW1wIHRvIHZlcnNpb24gMi4xLCBpbiBwcmVwYXJhdGlvbiBmb3IKLQlyZWxlYXNlLgotCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoSF9HRVRfSEVBREVSX1NJWkUsIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFKToKLQlEZWZpbmUgaW4gdGVybXMgb2YgY29uc3RhbnRzLCBub3QgQyBzdHJ1Y3R1cmUgc2l6ZXMuCi0KLQkqIGNvbmZpZy90Yy1yczYwMDAuYywgY29uZmlnL3RjLXJzNjAwMC5oOiBEZWxldGUgZW1wdHkgZmlsZXMuCi0KLVRodSBNYXkgMTMgMTc6MDE6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2hlYWRlcl9hcHBlbmQpOiBEb24ndCBkZWZpbmUgaWYgaXQncwotCWRlZmluZWQgYXMgYSBtYWNyby4KLQkqIGNvbmZpZy9vYmotaHAzMDAuaCAob2JqX2hlYWRlcl9hcHBlbmQpOiBEZWZpbmUgaXQgYXMgYSBtYWNyby4KLQkqIGNvbmZpZy9vYmotaHAzMDAuYyAoaHAzMDBfaGVhZGVyX2FwcGVuZCk6IE5ldyBmdW5jdGlvbi4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERvbid0IGJvdGhlciBjbGVhbmluZyB1cCBkb2MgZmlsZXM7Ci0JdGhleSBhcmVuJ3QgZ29pbmcgdG8gYmUgaW4gdGhpcyBkaXJlY3RvcnkuCi0KLVRodSBNYXkgMTMgMDc6NTE6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBIYW5kbGUgYWJzb2x1dGUKLQlzeW1ib2xzLgotCi0JKiB0Yy5oIChUQ19DT0ZGX1NJWkVNQUNIREVQKTogRG9uJ3QgZGVmaW5lIGhlcmUuCi0JKiBjb25maWcvdGMtc2guaCAoVENfQ09GRl9TSVpFTUFDSERFUCk6IERlZmluZSBoZXJlIGluc3RlYWQuCi0KLU1vbiBNYXkgMTAgMDY6MDE6MTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19TeW1ib2xfdHlwZV9saXN0KTogRG9uJ3QgYm90aGVyIHdpdGgKLQlpbml0aWFsaXphdGlvbi4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRzKTogVHJlYXQgbTY4Ki0qLXN5c3YqIGxpa2UgbTY4ay0qLWNvZmYuCi0KLVdlZCBNYXkgIDUgMTQ6MDA6NDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IENvcnJlY3QgZmxvYXRpbmcgcG9pbnQgZG91YmxlIHdvcmQKLQlsb2FkcyBhbmQgc3RvcmVzIGZvciBiaWcgZW5kaWFuIHRhcmdldC4KLQotV2VkIE1heSAgNSAwODozOToyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWkzODYuYzogUmVwbGFjZSBTRUdfKiB3aXRoICpfc2VjdGlvbiwgZml4IHVwIHN1YnNlZ18qCi0JY2FsbHMuICBEZWxldGVkIHNvbWUgdW51c2VkIGNvZGUuCi0JKiBjb25maWcvb2JqLWNvZmYuYzogTGlrZXdpc2UuCi0KLQlFTEYgc3VwcG9ydCwgbW9zdGx5IGNvbnRyaWJ1dGVkIGJ5IFV0YWg6Ci0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24sIG9ial9lbGZfc3RhYiwgb2JqX2VsZl9saW5lLAotCW9ial9lbGZfdHlwZSk6IFJld3JpdGUuCi0JKG9ial9lbGZfZnJvYl9zeW1ib2wsIGVsZl9zdGFiX3N5bWJvbF9zdHJpbmcsIGVsZl9zdGFiX3N5bWJvbCwKLQlvYmpfZWxmX2Rlc2MsIG9ial9lbGZfdmVyc2lvbiwgb2JqX3N5bWJvbF9uZXdfaG9vaywgb2JqX2VsZl9zaXplKToKLQlOZXcgZnVuY3Rpb25zLgotCShvYmpfZWxmX2lkZW50KTogRHVtbXkuCi0JKiBjb25maWcvb2JqLWVsZi5oIChGQUxTRSwgVFJVRSwgU18qLCB0Y19mcm9iX3N5bWJvbCwKLQlUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IE5ldyBtYWNyb3MuCi0JKGdkYl9zZWN0aW9uKTogTmV3IHZhcmlhYmxlIGRlY2wuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2F0b2YpOiBSZXR1cm4gemVybywgbm90IGVtcHR5IHN0cmluZywgb24KLQlzdWNjZXNzLgotCi0JQkZEX0FTU0VNQkxFUiBjb25kaXRpb25hbCBjaGFuZ2VzOgotCSogY29uZmlnL29iai1jb2ZmLmMgKGxpbmVub19yb290UCwgc2VnX05fVFlQRSwgKl9zZWN0aW9uX2hlYWRlcik6Ci0JRG9uJ3QgZGVmaW5lIHRoZXNlLgotCShTQV9TRVRfU1lNX0VORE5EWCwgU0FfU0VUX1NZTV9UQUdORFgpOiBOZXcgZnVuY3Rpb25zLgotCShmZXRjaF9jb2ZmX2RlYnVnX3NlY3Rpb24pOiBEaXR0by4KLQkob2JqX2NvZmZfZW5kZWYpOiBDYWxsIGZldGNoX2NvZmZfZGVidWdfc2VjdGlvbi4KLQkoc3RydWN0IGxpbmVfbm8pOiBOZXcgdHlwZS4KLQkoY19zeW1ib2xfbWVyZ2UpOiBOZXcgd2F5IGZvciBjb3B5aW5nIGF1eCBmaWVsZHMuCi0JKGNfZG90X2ZpbGVfc3ltYm9sKTogUHV0IHN5bWJvbCBpbiBhYnNvbHV0ZSBzZWN0aW9uLCBhbmQgc2V0IGZsYWcKLQlCU0ZfREVCVUdHSU5HLgotCShmdW5jdGlvbl9saW5lb2ZmKTogTmV3IHN5bWJvbC4KLQkoZnVuY3Rpb25fbGluZW9mZiwgdGV4dF9saW5lbm9fbnVtYmVyLCBvdXJfbGluZW5vX251bWJlciwKLQlsaW5lbm9fbGFzdFApOiBEb24ndCBkZWZpbmUuCi0JKGNfbGluZV9uZXcpOiBEb24ndCBkZWZpbmUuCi0JKG9ial9lbWl0X2xpbmVubywgb2JqX2NvZmZfZW5kZWYpOiBVc2UgYWJvcnQgY2FsbHMgYXMsIHVoLAotCXBsYWNlaG9sZGVycywgdW50aWwKLQlsaW5lLW51bWJlciByZWNvcmRpbmcgZ2V0cyBpbXBsZW1lbnRlZC4KLQkob2JqX25ld19zeW1ib2xfaG9vayk6IE5ldyBjb2RlIGZvciBoYW5kbGluZyBhdXggZmllbGRzLgotCShhZGRfbGluZW5vLCBhZGRfbGluZXN5bSk6IE5ldyBmdW5jdGlvbnMuCi0JKG9ial9jb2ZmX2xuKTogQ2FsbCBhZGRfbGluZW5vLCBub3QgY19saW5lX25ldy4KLQkob2JqX2NvZmZfZW5kZWYpOiBOZXcgY29kZSBmb3IgaGFuZGxpbmcgc3ltYm9sIG5hbWVzLiAgTmV3IGxpbmVubwotCWNvZGUuICBMb29rIGZvciBzZWN0aW9uIG5hbWUgIipERUJVRyoiIGZvciBkZWJ1Z2dpbmcgc2VjdGlvbi4KLQkoYWxpZ24sIGNvZmZfY2hlY2tfZmlsZV9zeW1ib2xzLCBvYmpfY29mZl9zZWN0aW9uLAotCWNvZmZfZnJvYl9maWxlKTogTmV3IGZ1bmN0aW9ucy4KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBSZW9yZGVyZWQgc29tZSBpbmNsdWRlcy4KLQkoQllURV9PUkRFUklORywgRklMRV9IRUFERVJfTUFHSUMsIHNlZ19OX1RZUEUsIE5fVFlQRV9zZWcsCi0JREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFLCBBT1VUSERSLCBBT1VUSERSU0laRSk6IERvbid0Ci0JZGVmaW5lIHRoZXNlLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUywgSTk2MF9TWU1fRklFTERTKTogTmV3IG1hY3Jvcy4KLQkoU1lNX0FVWEVOVCk6IE5ldyBtYWNybyAoZm9yIG5vbi1CRkRfQVNTRU1CTEVSIHRvbykgZm9yIGFjY2Vzc2luZwotCWF1eCBlbnRyaWVzLiAgTW9zdCBTQV8qIG1hY3JvcyBub3cgdXNlIGl0IHVuY29uZGl0aW9uYWxseS4KLQkoU18qKTogVXNlIGBic3ltJyBmaWVsZCwgYW5kIGFjY2VzcyBCRkQgcHJpdmF0ZSBkYXRhLgotCShTRl8qKTogVXNlIGBzeV9mbGFncycgc3ltYm9sIGZpZWxkIGZvciBtb3N0IG9mIHRoZXNlLgotCShIXyosIG9iamVjdF9oZWFkZXJzLCBsaW5lbm8sIGxpbmVub18qUCwgT0JKX0VNSVRfTElORU5PKTogRG9uJ3QKLQlkZWZpbmUuCi0JKCpfc2VjdGlvbl9oZWFkZXIpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9jb252ZXJ0X2ZyYWcsIG1kX2FwcGx5X2ZpeCk6IENoYW5nZWQKLQlpbnRlcmZhY2UuCi0JKHRjX2dlbl9yZWxvYykgW0kzODZDT0ZGXTogTmV3IGZ1bmN0aW9uLgotCSh0Y19hb3V0X2ZpeF90b19jaGFycywgdGNfY29mZl9maXgycnR5cGUpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQVJHRVRfQVJDSCwgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBOZXcKLQltYWNyb3MuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzdGFja19pbml0KTogRG9uJ3QgZG8gYXNzaWdubWVudHMgaW5zaWRlCi0JY29uZGl0aW9ucy4KLQkob2JqX2NvZmZfZGVmKTogU2ltcGxpZmllZCBoYW5kbGluZyBvZiBzeW1ib2wgbmFtZSBhIGJpdC4KLQkodGFnX2luc2VydCk6IE5hbWUgYXJndW1lbnQgaXMgbm93IHBvaW50ZXIgdG8gQ09OU1QuCi0JKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBDb21tZW50ZWQgb3V0LgotCi0JKiBjb25maWcvb2JqLWNvZmYuaDogVXNlIFBBUkFNUyBtYWNybyBpbiBwcm90b3R5cGVzLgotCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgaW5kaXJlY3QKLQl0aHJvdWdoIGZyY2hhaW5QIHBvaW50ZXIgaWYgaXQgaXMgbnVsbC4KLQotCSogY29uZmlndXJlLmluOiBXYXJuIGlmIEJGRCBtb2RlIGlzIGV4cGxpY2l0bHkgdHVybmVkIG9mZiBidXQgaXMKLQlyZXF1aXJlZCBieSBzcGVjaWZpZWQgdGFyZ2V0LgotCShtaXBzIGVjb2ZmIHRhcmdldHMpOiBEb24ndCBuZWVkIHRvIHNldCBiZmRfZ2FzIGhlcmU7IGl0IGdldHMKLQl0YWtlbiBjYXJlIG9mIGxhdGVyLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoY3Jhd2xfc3ltYm9scyk6IERvbid0IGNsZWFyIHN5X2ZvcndhcmQKLQlmaWVsZC4KLQkoeWFua19zeW1ib2xzKTogTWVyZ2Ugc3ltYm9scyBvbmx5IGlmIHN5X2ZvcndhcmQgaXMgbnVsbC4KLQotCSogY29uZmlnL3RjLW02OGsuaCAoQU9VVF9NQUNIVFlQRSk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5Ci0JZGVmaW5lZC4KLQotCSogdGMuaCAobWRfY29udmVydF9mcmFnKSBbQkZEX0FTU0VNQkxFUl06IFNlY3Rpb24gYXJnIGlzIG5vdAotCXBvaW50ZXIuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9jb252ZXJ0X2ZyYWcpIFtCRkRfQVNTRU1CTEVSXTogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChMT0NBTF9MQUJFTCkgW09CSl9FTEZdOiBBbnl0aGluZyBzdGFydGluZwotCXdpdGggIi4iIGlzIGEgbG9jYWwgbGFiZWwuCi0KLQkqIGNvbmZpZy90ZS1ocHBhLmgsIGNvbmZpZy90Yy1ocHBhLmgsIGNvbmZpZy90Yy1ocHBhLmM6IE5ldyBjb25maWcKLQlmaWxlcy4KLQotCSogY29uZmlnL3RlLWxpbnV4LmgsIGNvbmZpZy90ZS0zODZic2QuaDogTmV3IGNvbmZpZyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWxpbnV4LCBpMzg2LSotYnNkKTogVXNlIHRoZW0uCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQVJHRVRfRk9STUFUKTogU2VsZWN0IGZvcm1hdCBiYXNlZCBvbiB0YXJnZXQKLQllbnZpcm9ubWVudC4KLQkoRE9UX0xBQkVMX1BSRUZJWCk6IERvbid0IGRlZmluZSBmb3IgMzg2YnNkIG9yIExpbnV4LgotCi1XZWQgTWF5ICA1IDEzOjE0OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChpbml0X2ZpbGUpOiBTZXQgZk1lcmdlIHRvIDAgc2luY2UgZGJ4IHNlZW1zCi0JdG8gd2FudCBpdCB0aGF0IHdheS4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IFR1cm4gbG9jYWwgc3RfUHJvYyBzeW1ib2xzIGludG8KLQlzdF9TdGF0aWNQcm9jIHN5bWJvbHMuICBTZXQgaW5kZXggZmllbGQgb2YgZXh0ZXJuYWwgc3RfUHJvYyBhbmQKLQlzdF9zdGF0aWNQcm9jIHN5bWJvbHMgY29ycmVjdGx5LgotCSogY29uZmlnL3RjLW1pcHMuaCAoTk9fTElTVElORyk6IERvbid0IGRlZmluZS4gIFBlb3BsZSBtaWdodCB3YW50Ci0JbGlzdGluZ3MuCi0KLVR1ZSBNYXkgIDQgMjE6MjI6NTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWhwMzAwLmgsIGNvbmZpZy9vYmotaHAzMDAuYywgY29uZmlnL3RlLWhwMzAwLmg6IE5ldwotCWZpbGVzLgotCSogY29uZmlndXJlLmluIChtNjhrLSotaHB1eCk6IFVzZSB0aGVtLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX3ByZV93cml0ZV9ob29rKTogVXNlIEFPVVRfVkVSU0lPTiBpZgotCWRlZmluZWQsIG90aGVyd2lzZSB6ZXJvLgotCi0JKiBjb25maWcvYW91dF9nbnUuaCAoT01BR0lDKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQotTW9uIE1heSAgMyAxNTo1OTozMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWxsb3cgYW55IGFicyBleHByZXNzaW9uIGFzIGFuCi0JYWRkcmVzcyBzcGFjZSBudW1iZXIuCi0KLVdlZCBBcHIgMjggMTk6MTE6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oIChUQVJHRVRfREVGQVVMVCk6IERvbid0IGRlZmF1bHQgdGhpcyBhdCBhbGwuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IEluY2x1ZGUgY3R5cGUuaC4KLQkoZGVmaW5lX3NvbWVfcmVncyk6IEFkZGVkIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlcnMgZm9yIDI5MDUwLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChjb21tZW50X2NoYXJzKSBbVEVfSTM4NkFJWF06IEluY2x1ZGUgIi8iLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogRG9uJ3Qgc2V0IFNUWVBfUkVHIGhlcmUuCi0JKGNoYW5nZV90b19zZWN0aW9uKTogU2V0IGl0IGhlcmUgaW5zdGVhZC4KLQotV2VkIEFwciAyOCAxMzo0MDoyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9zeW1ib2xfbmV3X2hvb2spOiBNYWtlIHVwIGEgLmZpbGUgaWYgb25lCi0JaGFzbid0IGJlZW4gc2VlbiB5ZXQuCi0JKGFkZF9lY29mZl9zeW1ib2wpOiBEb24ndCByZWZlciB0byBjdXJfZmlsZV9wdHIgaWYgaXQgaXMgTlVMTC4KLQotTW9uIEFwciAyNiAxODoyOTowNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNoLmNoLCBjb25maWcvdGMtc2guaDogTmV3IGZpbGVzIHN1cHBvcnRpbmcgSGl0YWNoaQotCVNILgotCi1Nb24gQXByIDI2IDEyOjI4OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChvcGVyYW5kKTogRml4IHVuYXJ5IHBsdXMgb3BlcmF0b3IgKHByZXZpb3VzbHkgd2FzIHRoZQotCXNhbWUgYXMgJ34nIG9wZXJhdG9yISkuCi0KLVdlZCBBcHIgMjEgMDA6MjA6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogRGVmaW5lIGV2ZW4gaWYgQkZEIGlzIGRlZmluZWQuCi0JKHdyaXRlX29iamVjdF9maWxlKTogRG8gZGVmaW5lIGlmIEJGRF9BU1NFTUJMRVIuICBJbnZva2UKLQlvYmpfY2hlY2tfZmlsZV9zeW1ib2xzIGlmIGRlZmluZWQuICBDYWxsIHZlcmlmeV9zeW1ib2xfY2hhaW5fMgotCWluc3RlYWQgb2Ygb3Blbi1jb2RpbmcgaXQuICBGaXggc29tZSBidWdzIGluIHBhdGNoaW5nIHVwIHN5bWJvbAotCWNoYWluLgotCShyZWxheF9zZWdtZW50KTogTWFrZSBzb21lIGNvZGUgd2UgIm91Z2h0IHRvIGJlIGFibGUgdG8iIHVzZSBmb3IKLQlhbGwgdGFyZ2V0cyBubyBsb25nZXIgY29uZGl0aW9uYWxpemVkIG9uIG5zMzJrIHRhcmdldDsgaW5zdGVhZCwgZG8KLQlpdCBhbHdheXMsIGFuZCBpZiB0aGUgYXBwcm9wcmlhdGUgY29uZGl0aW9ucyBmYWlsLCBhYm9ydC4KLQotCSogc3ltYm9scy5jIChERUJVRyk6IEVuYWJsZWQuCi0JKHN5bWJvbF9uZXcpOiBNYWtlIHN1cmUgYmZkX21ha2VfZW1wdHlfc3ltYm9sIHdvcmtzLgotCSh2ZXJpZnlfc3ltYm9sX2NoYWluXzIpOiBOZXcgZnVuY3Rpb247IHRha2VzIG9uZSBzeW1ib2wgYXMKLQlhcmd1bWVudCwgYW55d2hlcmUgaW4gdGhlIGNoYWluLgotCShkb2xsYXJfbGFiZWwqKTogVXNlIGRlZmF1bHQgaW5pdGlhbGl6ZXJzLgotCi0JKiBhcy5jIChwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBDYWxsIG1kX2JlZ2luIGhlcmUuLi4KLQkobWFpbik6IC4uLmFuZCBub3QgaGVyZS4KLQotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCk6IFVzZSBhLm91dC1zdW5vcy1iaWcgZm9yIGEub3V0LgotCSh0Y19mcm9iX3N5bWJvbCk6IE5ldyBtYWNybzogR2V0IHJpZCBvZiBzeW1ib2xzIGluIHJlZ19zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChvbWFnaWMpOiBEb24ndCBkZWZpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCi0JKGFkZF9maXgsIGFkZF9mcmFnKTogTm93IGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIG1hY3Jvcy4KLQkobTY4a19yZWdfcGFyc2UsIG02OGtfaXAsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBnZXRfbnVtLAotCXNfZGF0YTEsIHNfZGF0YTIsIHNfYnNzKTogVXNlIG5ldyAqX3NlY3Rpb24gbmFtZXMsIGZvcgotCWNvbXBhdGliaWxpdHkgd2l0aCBCRkRfQVNTRU1CTEVSIG1vZGU7IHJld3JpdGUgc3dpdGNoIHN0YXRlbWVudHMKLQl0byBoYW5kbGUgbm9uLWludGVncmFsIHNlZ1QuCi0JKHRjX2NvZmZfZml4MnJ0eXBlLCB0Y19hb3V0X2ZpeF90b19jaGFycywKLQl0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBEb24ndCBkZWZpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCi0JKHRjX2dlbl9yZWxvYyk6IE5ldyByb3V0aW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCShtZF9hcHBseV9maXgsIG1kX2FwcGx5X2ZpeF8yKTogUmVuYW1lZCBvbGQgbWRfYXBwbHlfZml4IHRvCi0JbWRfYXBwbHlfZml4XzI7IG5ldyBtZF9hcHBseV9maXggZGVmaW5pdGlvbiB2YXJpZXMgaW50ZXJmYWNlCi0JZGVwZW5kaW5nIG9uIEJGRF9BU1NFTUJMRVIuCi0JKG1kX2NvbnZlcnRfZnJhZywgbWRfY29udmVydF9mcmFnXzEpOiBMaWtld2lzZS4gIFVzZSBuZXcgKl9zZWN0aW9uCi0JbmFtZXMuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmM6IEluY2x1ZGUgY29uZmlnLmguCi0JKHZlcnNpb25fc3RyaW5nKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCShXcml0ZV9WTVNfTUhEX1JlY29yZHMpOiBVc2UgR0FTX1ZFUlNJT04gaW5zdGVhZC4KLQkodm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKTogTmV3IGZ1bmN0aW9uLCB0YWtlbiBmcm9tIFZNUyBjb2RlIGluCi0Jc3ltYm9scy5jLgotCShfZG9wcm50KTogRGVsZXRlZC4KLQkoVk1TX1N0b3JlX1N0cnVjdCwgVk1TX0RlZl9TdHJ1Y3QsIFZNU19TZXRfU3RydWN0LAotCVZNU19UQlRfQmxvY2tfRW5kLCBnZXRfVk1TX3RpbWVfb25fdW5peCwgZ2VuZXJhdGVfc3VmZml4LAotCVZNU19Qc2VjdF9TcGVjKTogRml4ZWQgdG8gY29tcGlsZSB1bmRlciB0cmFkaXRpb25hbCBDLgotCSogY29uZmlnL29iai12bXMuaDogVXNlIFBBUkFNUyBtYWNyby4KLQkodm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKTogRGVjbGFyZS4KLQkoUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OKTogTmV3IG1hY3JvLgotCSogc3ltYm9scy5jIChjb2xvbik6IFJlbW92ZSBzb21lIFZNUy1zcGVjaWZpYyBjb2RlLCBsb29rIGZvcgotCVJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTiBtYWNybyBpbnN0ZWFkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRG9uJ3QgdHJ5IGV4cGFuZGluZyBEQmNjCi0JaW5zdHJ1Y3Rpb25zLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBSZW9yZGVyZWQgc29tZSBmdW5jdGlvbnMgc28gaW5saW5pbmcgbWlnaHQKLQl3b3JrLiAgVXNlIFBBUkFNUyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0JKHJlbG9jKTogTmV3IHJvdXRpbmUuCi0JKG1kX2Fzc2VtYmxlKTogUmVhcnJhbmdlIHN3aXRjaCBzdGF0ZW1lbnRzIHRvIHdvcmsgd2l0aAotCW5vbi1pbnRlZ3JhbCBzZWdULgotCi0JKiBzdHJ1Yy1zeW1ib2wuaCBbQkZEX0FTU0VNQkxFUl06IFVuZGVmaW5lCi0JU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyBiZWZvcmUgZGVmaW5pbmcgaXQuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ld19yZXN0KTogTm93IHN0YXRpYy4KLQotCSogcmVhZC5jIChwc2V1ZG9fc2V0KTogQmV0dGVyIGVycm9yIG1lc3NhZ2UgZm9yIGRpZmZlcmVuY2Ugb2YKLQlzeW1ib2xzIGluIGRpZmZlcmVudCBmcmFncy4KLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogUGFzcyBkb3duIHNvbWUgbmV3IHZhcmlhYmxlcywgaW5kaWNhdGluZwotCXBhdGhuYW1lIG9yIHByb2dyYW0gbmFtZSBmb3IgY2MsIG5tLCBvYmpkdW1wLgotCi0JKiBhcy5oIChPVVRQVVRfRkxBVk9SKTogTmV3IG1hY3JvLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IFVzZSBPVVRQVVRfRkxBVk9SLgotCi0JKiBjb25maWd1cmUuaW46IEluaXRpYWxpemUgYmZkX2dhcyBwcm9wZXJseS4gIFdhcm4gdGhhdCBFTEYKLQlzdXBwb3J0IGlzIGluY29tcGxldGUuCi0KLVRodSBBcHIgMTUgMjI6Mzk6MDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGZsb2F0X2NvbnMpOiBBY2NlcHQgbnVsbCBwb2ludGVyIHJldHVybiBmcm9tIG1kX2F0b2YuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hdG9mKTogUmV0dXJuIG51bGwgZm9yIHN1Y2Nlc3MuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXRvZik6IERpdHRvLgotCi1UaHUgQXByIDE1IDE2OjA0OjM5IDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBmb3JtYXR0aW5nIGFuZCBjb21tZW50IGNsZWFudXBzOyBzaG93IFNQQVJDCi0JYWx0ZXJuYXRpdmUgb3B0aW9ucyBpbiBzYW1lIHN0eWxlIGFzIG90aGVyIG1hY2hpbmVzOyBzaW1wbGlmeSBzb21lCi0JY29uZGl0aW9uYWwgdXNlOyBpbmNsdWRlIEdQTCBhcyBzZXBhcmF0ZSBmaWxlIChmcm9tIHRleGluZm8gZGlyKQotCi0JKiBkb2MvTWFrZWZpbGUuaW46IChhcy5pbmZvKSBpbmNsdWRlIGRpcmVjdG9yeSBjb250YWluaW5nIEdQTCBpbgotCW1ha2VpbmZvIHNlYXJjaCBwYXRoCi0KLQkqIGRvYy9oOC50ZXhpOiBuZXcgZmlsZTsgY29uZGl0aW9uYWwgc2V0dGluZ3MgZm9yIEdBUyBtYW51YWwKLQlvbiBIaXRhY2hpIGNoaXBzCi0KLVR1ZSBBcHIgMTMgMTU6MzE6NDAgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogZG9jL2FzLnRleGluZm86IG1lbnRpb24gU1BBUkMgYXJjaGl0ZWN0dXJlIG9wdGlvbnMuCi0KLUZyaSBBcHIgIDkgMTc6NDM6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVhcnJhbmdlZCB3aGl0ZXNwYWNlIGluIHBlci1ob3N0L3Blci10YXJnZXQKLQlzZWN0aW9ucy4gIEFkZGVkIGhvb2tzIGZvciBkcm9wcGluZyBpbiBIUFBBIHN1cHBvcnQgKG5vdCBpbmNsdWRlZAotCXlldCkuICBTZXBhcmF0ZSBvdXQgb3ZlcnJpZGVzIG9mIHZhcmlhYmxlcyBiYXNlZCBvbiB0YXJnZXQgZm9ybWF0Ci0JYW5kIGJmZC1nYXMgc2VsZWN0aW9uIGZyb20gYWN0dWFsIHRhcmdldC1zcGVjaWZpYyBjb21tYW5kcy4gIEFkZAotCWVycm9yIG1lc3NhZ2UgZm9yIHJlY29nbml6ZWQgYnV0IHVuc3VwcG9ydGVkIGZvcm1hdCBuYW1lLgotCi1GcmkgQXByICA5IDA5OjA1OjQ3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5oIChlY29mZl9idWlsZF9saW5lbm8pOiBNYWtlIGlsaW5lTWF4IGluCi0Jc3ltYm9saWMgaGVhZGVyIG1hdGNoIGNsaW5lIGluIEZEUjsgdGhlIG5hdGl2ZSBsaW5rZXIgc2VlbXMgdG8KLQl3YW50IHRoYXQuCi0KLVRodSBBcHIgIDggMTU6NTE6MjggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW46IGFzLnRleGluZm8gaXMgaW4gJChzcmNkaXIpLiAgVXNlCi0JJChzcmNkaXIpL2FzLnRleGluZm8gZXhwbGljaXRseSBpbiBzZXZlcmFsIHBsYWNlcwotCi1UaHUgQXByICA4IDE1OjE1OjAyIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogdXBkYXRlIGR2aSwgY2xlYW4gdGFyZ2V0cyBmb3IgbmV3IHNvdXJjZQotCQkJICAgZmlsZSBzdHJ1Y3R1cmUKLQotVGh1IEFwciAgOCAxMjo1Mjo0NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oby1kZWNzdGF0bi5oOiBEZWZpbmUgQlJPS0VOX0FTU0VSVCBpZiBub3QgX19HTlVDX18sCi0JcmF0aGVyIHRoYW4gdW5kZWZpbmluZyBrbm93LgotCSogY29uZmlndXJlLmluOiBNYXRjaCB1bHRyaXgqLCBub3QganVzdCB1bHRyaXguCi0KLVdlZCBBcHIgIDcgMjA6MTg6MTAgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogZG9jL2FzLnRleGluZm86IGNvbnZlcnRlZCBjb25kaXRpb25hbCBtYXJrdXAgdG8gdXNlIG5ldwotCVRleGluZm8gZmFjaWxpdGllcywgYXZvaWRpbmcgbTQuCi0KLQkqIGRvYy9hcy1hbGwudGV4aW5mbywgYWxsLm00LCBwcmV0ZXgubTQ6IGRlbGV0ZWQuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogcmVjYXN0IGRvYyBjb25maWd1cmF0aW9uIHRvIHVzZSBhIGxpbmsgdG8gYW4KLQlpbmNsdWRlZCB0ZXhpbmZvIGZpbGUuCi0KLQkqIGRvYy9hbGwudGV4aTogc2V0dGluZ3MgZm9yIGdlbmVyaWMgZm9ybSBvZiBkb2N1bWVudGF0aW9uLgotCi1UdWUgQXByICA2IDExOjU2OjIxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChjb25zKTogWmVybyBvdXQgZnJhZyB3aGVuIGNyZWF0aW5nIHJlbG9jLgotCi1Nb24gQXByICA1IDA5OjQxOjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoZ3BfcmVmZXJlbmNlKTogQ2VydGFpbiBtYWdpYyBzeW1ib2xzIGNhbiBuZXZlcgotCWJlIHJlZmVyZW5jZWQgb2ZmIHRoZSBHUCByZWdpc3Rlci4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEhhbmRsZSBzdGF0ZXMgOSBhbmQgMTAgY29ycmVjdGx5Ci0Jd2hlbiBkZWFsaW5nIHdpdGggY2hhcmFjdGVycyBvZiB0eXBlIExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNULAotCUxFWF9JU19TVFJJTkdRVU9URSwgYW5kIExFWF9JU19PTkVDSEFSX1FVT1RFLgotCi0JKiBjb25maWcvdGUtaXJpeC5oOiBOZXcgZmlsZTsgaXJpeCBuZWVkcyBhIGRpZmZlcmVudCBMT0NBTF9MQUJFTAotCWRlZmluaXRpb24gZnJvbSBvdGhlciBNSVBTIHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1pcml4KTogVXNlIGVtdWxhdGlvbiBpcml4LgotCi1TdW4gQXByICA0IDE1OjIxOjA5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDg1MDAuYzogR2V0IHJlbGF4IHNpemUgb2YgYnJhbmNoIGluc3RydWN0aW9ucyByaWdodCwKLQkoZ2V0X29wZXJhbmQpOiBQYXJzZSBAc3ArIGNvcnJlY3RseS4KLQotRnJpIEFwciAgMiAxNTo1OTo0OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgaW5jbHVkZQotCUNPRkYgc2VjdGlvbiBoZWFkZXIgZmllbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUHJpbnQgZXJyb3IgbWVzc2FnZSBpZiBob3N0IG9yIHRhcmdldCBpcyBub3QKLQlzdXBwb3J0ZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgd2l0aC1iZmQtYXNzZW1ibGVyLCB1c2Ugb2JqLWNvZmYgaW5zdGVhZCBvZgotCW9iai1jb2ZmYmZkLgotCi0JKiBjb25maWcvaG8tZ2VuZXJpYy5oOiBJbmNsdWRlIHN0cmluZy5oLgotCi1GcmkgQXByICAyIDA4OjU0OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUwpOiBUcmVhdCBhbnkgbGFiZWwgc3RhcnRpbmcgd2l0aAotCSckJyBhcyBsb2NhbCwgZm9yIGFueSBvYmplY3QgZmlsZSBmb3JtYXQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogT3B0aW1pemF0aW9ucyB0byBicmFuY2hpbmcgY29kZSBhbmQgYQotCWNvdXBsZSBvZiBidWcgZml4ZXMgZnJvbSByYWxwaGNAcHlycHM1LmVuZy5weXJhbWlkLmNvbSAoUmFscGgKLQlDYW1wYmVsbCkuCi0KLQkqIGNvbmZpZy9oby1pcml4Lmg6IE5ldyBmaWxlOyBpZiBub3QgZ2NjLCBkZWZpbmUgQlJPS0VOX0FTU0VSVC4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1zZ2ktaXJpeCopOiBTZXQgZ2FzX2hvc3QgdG8gaXJpeC4KLQotV2VkIE1hciAzMSAxNzo1Mzo1NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldyk6IFNldCBvdXRwdXRfc2VjdGlvbiBvZiBuZXcgc2VjdGlvbi4KLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1seV9wYXNzKTogRG9uJ3Qgc2V0IG91dHB1dF9zZWN0aW9uIGhlcmUuCi0JKiBleHByLmMgKGV4cHJfcGFydCwgZXhwcik6IFR1cm4gb2ZmIHNlY3Rpb24gYXNzZXJ0aW9ucyBmb3IgRUNPRkYsCi0Jc2luY2UgaXQgaGFzIGFkZGl0aW9uYWwgc2VjdGlvbnMuCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBGb3IgTUlQUyBFQ09GRiwgcHV0IHNtYWxsIG9iamVjdHMgaW4gLnNic3MsCi0Jbm90IGJzc19zZWN0aW9uLgotCSogY29uZmlnL29iai1lY29mZi5oIChUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IEFkZGVkCi0JZWNvZmZfdW5kZWZpbmVkIGZpZWxkLgotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfc3ltYm9sX25ld19ob29rKTogSW5pdGlhbGl6ZQotCWVjb2ZmX3VuZGVmaW5lZCBmaWVsZC4KLQkoYWRkX2ZpbGUpOiBJZiB1c2luZyBzdGFicywganVzdCBvdXRwdXQgYSBzdGFicyBzeW1ib2wgcmF0aGVyIHRoYW4KLQljcmVhdGluZyBhIG5ldyBmZHIuCi0JKG9ial9lY29mZl9iZWdpbiwgb2JqX2Vjb2ZmX2JlbmQpOiBJZ25vcmUgbGluZSBudW1iZXIgYnkgcmVhZGluZwotCWl0IHdpdGggZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24sIHJhdGhlciB0aGFuIHNraXBwaW5nIGl0IGJ5IGhhbmQuCi0JKG9ial9lY29mZl9sb2MpOiBJZiB1c2luZyBzdGFicywganVzdCBvdXRwdXQgYSBzdGFicyBzeW1ib2wgcmF0aGVyCi0JdGhhbiBFQ09GRiBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KLQkob2JqX2Vjb2ZmX3N0YWIpOiBBY2NlcHQgbm9uLXplcm8gdmFsdWVzIGZvciBzdGFicyBsaW5lIG51bWJlci4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IFNldCBpZmlsZXN5bSBjb3JyZWN0bHkuICBTZXQgc3RvcmFnZSBjbGFzcwotCXRvIHNtYWxsLCB1bmRlZmluZWQgYW5kL29yIHJlYWRvbmx5IHNlY3Rpb25zIGlmIGFwcHJvcHJpYXRlLgotCURvbid0IG91dHB1dCBzeW1ib2wgbmFtZXMgY29udGFpbmluZyBcMDAxIGNoYXJhY3RlcnMuCi0JKGVjb2ZmX2Zyb2JfZmlsZSk6IE1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgZmRyIGlzIG91dHB1dC4KLQkqIGNvbmZpZy90Yy1taXBzLmg6IERlZmluZSBUQ19NSVBTLgotCSogY29uZmlnL3RjLW1pcHMuYyAoZ19zd2l0Y2hfdmFsdWUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9hc3NlbWJsZSk6IFNldCBncCBzaXplIG9mIG91dHB1dCBCRkQuCi0JKGdwX3JlZmVyZW5jZSk6IE5ldyBmdW5jdGlvbjsgcmV0dXJucyAxIGlmIGV4cHJlc3Npb24gY2FuIGJlCi0JYWNjZXNzc2VkIHZpYSBncC4gIEFsd2F5cyByZXR1cm5zIDAgaWYgbm90IHVzaW5nIEVDT0ZGLgotCShtYWNyb19idWlsZCk6IENvbnZlcnQgQkZEX1JFTE9DX0xPMTYgdG8gQkZEX1JFTE9DX01JUFNfR1BSRUwgaWYKLQlwb3NzaWJsZS4KLQkobWFjcm8pOiBHZW5lcmF0ZSBzZXF1ZW5jZXMgdXNpbmcgZ3AgaWYgcG9zc2libGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IElnbm9yZSAtRUwgYW5kIC1FQi4gIFBhcnNlIC1HLgotCShtZF9hcHBseV9maXgpOiBBZGRlZCBCRkRfUkVMT0NfTUlQU19HUFJFTCB0byBpZ25vcmVkIGNhc2UuCi0JKHNfY2hhbmdlX3NlYyk6IEhhbmRsZSAucmRhdGEgYW5kIC5zZGF0YSBmb3IgRUNPRkYuCi0JKHNfZXh0ZXJuKTogTWFyayBzeW1ib2wgYXMgZXh0ZXJuYWwuICBTZXQgZWNvZmZfdW5kZWZpbmVkIGZpZWxkLgotCi1UdWUgTWFyIDMwIDEwOjExOjQxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogRG9uJ3QgY2FsbCBhc19wZXJyb3IgZm9yCi0JZmlsZW5hbWUgcmVqZWN0ZWQgYnkgYXBwbGljYXRpb24uCi0KLQkqIGFzLmMgKG1haW4pIFtCRkRfQVNTRU1CTEVSXTogSWYgZXJyb3JzIG9jY3VyLCBjbG9zZSBhbmQgdW5saW5rCi0JdGhlIG91dHB1dCBmaWxlLgotCi0JKiBkb2MvYXMudGV4aW5mbzogRG9uJ3QgdXNlIEB2YWx1ZSBpbiBub2RlIG5hbWVzIGZvciB0aGUgbW9tZW50OwotCXJlZmVyZW5jZXMgZG9uJ3QgYXBwZWFyIHRvIHdvcmsgcmlnaHQuCi0KLQkqIGFzLmggKGNvbnN0LCB2b2xhdGlsZSk6IFB1dCB0aGVzZSBkZWZpbml0aW9ucyBiYWNrLCBhbmQgdXNlCi0JdGhlbS4KLQotCSogZG9jL2FzLnRleGluZm86IEZpcnN0IHBhc3MgYXQgdXNpbmcgbmV3IHRleGluZm8gZmVhdHVyZXMgLS0KLQl2YXJpYWJsZXMsIGNvbmRpdGlvbmFsIHRlc3RzLiAgRmFyIGZyb20gY29tcGxldGUuCi0KLU1vbiBNYXIgMjkgMTY6MDU6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWFkLmM6IFRlbXBvcmFyeSBoYWNrIHRvIGhhbmRsZSBzb21lIDY0LWJpdCBjb25zdGFudHMuICBUaGlzCi0Jc2hvdWxkIGJlIHJlZG9uZSBsYXRlci4KLQkodGFyZ2V0X2JpZ19lbmRpYW4pOiBEZWNsYXJlLgotCShiaWdfY29ucyk6IElmIGl0J3Mgc2V0LCByZXZlcnNlIG9yZGVyIG9mIGJ5dGVzIGJlaW5nIGNvcGllZC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9iZWdpbik6IFNldCB0YXJnZXRfYmlnX2VuZGlhbi4KLQotCSogcmVhZC5jIChzX2lnbm9yZSk6IERlbGV0ZSBkZWNsYXJhdGlvbiBvZiBpc19lbmRfb2ZfbGluZS4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHlhbmtfc3ltYm9scyk6IEJ1aWxkIGxpc3Qgb2YgZmlsZSBzeW1ib2wKLQlmb3J3YXJkIHBvaW50ZXJzIHByb3Blcmx5LgotCi1Nb24gTWFyIDI5IDEzOjQ3OjMzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvcik6IEZpeCBidWcgd2hlcmUgbnJlbG9jcwotCXdhc24ndCBiZWluZyBzdG9yZWQgaW50byBzY25oZHIuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaDogQWRkIHByb3RvdHlwZSBvZiBzX2dldF9zZWdtZW50LgotCSogcmVhZC5jIChUQ19TVEFSVF9MQUJFTCk6IERlZmF1bHQgZGVmaW5pdGlvbi4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogVXNlIFRDX1NUQVJUX0xBQkVMIG1hY3JvIHRvIHdvcmsgb3V0Ci0JaWYgYSBsYWJlbCBoYXMgYmVlbiBzZWVuLgotCi1Nb24gTWFyIDI5IDEyOjU2OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBTZXQgQkZEREVGIGFuZCBCRkRMSUIgYXQgdGhlIHRvcCBvZiBNYWtlZmlsZSwgbm90Ci0JdGhlIGJvdHRvbSAobWFrZSBleHBhbmRzIHZhcmlhYmxlcyBpbiBkZXBlbmRlbmNpZXMgd2hlbiB0aGUKLQlkZXBlbmRlbmNpZXMgYXJlIHJlYWQsIG5vdCB3aGVuIHRoZXkgYXJlIHVzZWQpLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogRG9uJ3Qgc2V0IE5PTE9BRCBiaXQgZm9yCi0JYTI5ayAuYnNzIHNlY3Rpb247IHRoZSBtb25kZmUgcHJvZ3JhbSBkb2Vzbid0IGxpa2UgaXQuCi0KLVN1biBNYXIgMjggMDg6MTI6NTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IFVzZSBQQVJBTVMgbWFjcm8sIGFuZCB1c2UgQ09OU1QgaW5zdGVhZCBvZgotCWNvbnN0LgotCShjdXJyZW50X2FyY2hpdGVjdHVyZSk6IERvbid0IG5lZWQgaW5pdGlhbGl6ZXIuCi0KLUZyaSBNYXIgMjYgMDg6MTI6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBkb2Mvbm9uZS5tNDogRGVmaW5lIFo4MDAwLgotCSogZG9jL01ha2VmaWxlLmluIChhcy0qLnRleGluZm8pOiBSZWZlciB0byAkKHNyY2RpcikuICBSZW1vdmUgdGhlCi0JdGV4aW5mbyBmaWxlIGJlZm9yZSByZWNyZWF0aW5nIGl0LgotCShURVhJMkRWSSk6IE5lZWQgdG8gc2V0IFRFWElOUFVUUyBpZiAibWFrZSBhcy5kdmkiIGlzIHRvIHdvcmsgaW4KLQl0aGlzIGRpcmVjdG9yeS4KLQkoc3JjZGlyKTogRGVsZXRlIHNlY29uZCwgYm9ndXMgZGVmaW5pdGlvbi4KLQkoYXMuaW5mbyk6IExvb2sgZm9yIGFzLSoudGV4aW5mbyBpbiBjdXJyZW50IGRpcmVjdG9yeSByYXRoZXIgdGhhbgotCWluICQoc3JjZGlyKS4KLQkoYXMuZHZpKTogRGl0dG8uCi0JKGR2aSk6IE5ldyBydWxlLgotCSogZG9jL2NvbmZpZ3VyZS5pbjogQ3JlYXRlIGxpbmtzIHRvIGFsbCBhcy0qLnRleGluZm8gZmlsZXMgaW4gdGhlCi0Jc291cmNlIGRpcmVjdG9yeSwgaWYgdGhhdCdzIG5vdCB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0KLQkqIGNvbmZpZ3VyZS5pbiAocGVyLWhvc3QpOiAgQWNjZXB0IE1JUFMgaG9zdCB3aXRoIEJTRCB2ZXJzaW9uCi0JbnVtYmVyLgotCShwZXItdGFyZ2V0KTogQ2xhc3NpZnkgaTQ4NiBhcyBpMzg2LiAgVXNlIGdlbmVyaWMgY3B1X3R5cGUgaW5zdGVhZAotCW9mIHRhcmdldF9jcHUgaW4gc2VsZWN0aW5nIGZvcm1hdCBldGMuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBVc2UgLmFwcGZpbGUsIG5vdCAuYXBwLWZpbGUuCi0JKiByZWFkLmMgKHBvdGFibGUpOiBDaGFuZ2UgLmFwcC1maWxlIHRvIC5hcHBmaWxlLgotCi0JKiBjb25maWcvaG8tZGVjc3RhdG4uaDogUmVuYW1lZCBmcm9tIGhvLWRlY3N0YXRpb24uaC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRqdXN0ZWQuCi0KLQkqIGNvbmZpZy9vYmotYmZkLXN1bm9zLio6IFVudXNlZDsgZGVsZXRlZC4KLQotCSogTWFrZWZpbGUuaW4gKHZlcnNpb24uYywgdmVycy1zdGFtcCk6IERlbGV0ZWQuCi0JKGNvbmZpZy5oKTogRGVmaW5lIEdBU19WRVJTSU9OLgotCSogYXMuYyAodmVyc2lvbl9zdHJpbmcpOiBEZWxldGVkIGRlY2xhcmF0aW9uLgotCShtYWluKTogTG9vayBmb3IgR0FTX1ZFUlNJT04gaW5zdGVhZC4KLQotCSogZG9jL2FzLnRleGluZm86IFVwZGF0ZWQgZGVzY3JpcHRpb24gb2YgLWEqIChsaXN0aW5nKSBvcHRpb25zLAotCWFuZCBkZXNjcmliZSBob3cgdG8gcGFzcyB0aGVtIHRocm91Z2ggZnJvbSBnY2MuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yKTogRG9uJ3QgYWxsb2NhdGUgc3RvcmFnZSBvcgotCXByb2Nlc3MgcmVsb2NzIGlmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NzIHRvIHByb2Nlc3MuICBBdm9pZHMKLQltYWxsb2MvZnJlZSBidWcgb24gU0NPIHRvby4KLQotCSogYXMuaDogTW92ZSBsb2NhbCBpbmNsdWRlIGZpbGVzIGJlbG93IHN5c3RlbSBpbmNsdWRlIGZpbGVzLCB0bwotCWF2b2lkIHNvbWUgcmVkZWZpbml0aW9uIGNvbXBsYWludHMgb24gc29tZSBzeXN0ZW1zLgotCShjb25zdCwgdm9sYXRpbGUpOiBEb24ndCBuZWVkIHRoZXNlIGNvbmRpdGlvbmFsbHkgZGVmaW5lZCBpZiB3ZQotCXVzZSBDT05TVCBhbmQgVk9MQVRJTEUgZnJvbSBhbnNpZGVjbC5oLgotCShzZWdfbmFtZSk6IFVzZSBDT05TVCwgbm90IGNvbnN0LgotCi1GcmkgTWFyIDI2IDEwOjIyOjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYzogUmVpbmRlbnRlZCB0byBHTlUgc3RhbmRhcmRzLgotCi1UaHUgTWFyIDI1IDA4OjU5OjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IpOiBSZW1vdmUgYTI5ayBzcGVjaWFsIGNhc2UuCi0JKGZpeHVwX3NlZ21lbnQpOiBBZGQgYTI5ayBzcGVjaWFsIGNhc2U7IHRoZSBsaW5rZXIgaXMgbm90IHByZXBhcmVkCi0JdG8gc2VlIGEgc2VnbWVudCBvZmZzZXQgaGVyZS4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFkZGVkIG5ldyBzdGF0ZSwgMTAsIG1vZGlmeWluZyBzdGF0ZQotCTkgdG8gb25seSBrZWVwIGEgc3BhY2UgaW4gYmV0d2VlbiBpZGVudGlmaWVyIGNoYXJhY3RlcnMuCi0KLVdlZCBNYXIgMjQgMDI6MTY6MjIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgZHZpIHRhcmdldDsgYXMtJChjb25maWcpLnRleGluZm8gbWlnaHQgbGl2ZSBpbgotCXNyY2RpciwgbWlnaHQgYmUgaW4gb2JqZGlyLgotCi0JKiBkb2MvTWFrZWZpbGUuaW46IGR2aSBkZXBlbmRzIG9uIGFzLmR2aQotCi1Nb24gTWFyIDIyIDIzOjU5OjEzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgdGFyZ2V0Ci0KLU1vbiBNYXIgMjIgMTY6MjU6NTcgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBZGQgc3VwcG9ydCBmb3IgbWVtYmFyIG1hc2sgbmFtZXMuCi0JQWRkIG1pc3NpbmcgY29sb25zIGluIHByZWZldGNoIGVycm9yIG1lc3NhZ2VzLiAgQWRkIHN1cHBvcnQgZm9yCi0JQVNJIG5hbWVzLgotCi1Nb24gTWFyIDIyIDEwOjE5OjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBVc2UgJEFUIGZvciBhbnkgZmxvYXRpbmcgcG9pbnQgbG9hZC4KLQotU2F0IE1hciAyMCAxMjo1MDo1MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AdXJ0aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRm9yIG9wZXJhbmQgdHlwZSAnTScsIHJlamVjdAotCWJpZ251bXMsIGJ1dCBkb24ndCBlbWl0IGVycm9yIG1lc3NhZ2UuCi0KLUZyaSBNYXIgMTkgMjE6MDI6MTkgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGFyZy1jcHUubyk6IERlcGVuZCBvbiBjb25maWcuaC4KLQotV2VkIE1hciAxNyAxNjo0NDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBZGRlZCBuZXcgc3RhdGUsIDksIHRvIGF2b2lkCi0JZHJvcHBpbmcgYSBzcGFjZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYW4gaWRlbnRpZmllci4KLQkqIGV4cHIuYywgd3JpdGUuYzogUmV3cm90ZSBhc3NlcnQgZXhwcmVzc2lvbnMgdG8gbm90IHVzZSBtdWx0aXBsZQotCWxpbmVzOyBJIGRvbid0IHRoaW5rIHRoYXQgY2FuIGJlIGRvbmUgcG9ydGFibHkuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFVzZSAkQVQgaWYgdGFyZ2V0IHJlZ2lzdGVyIGlzIHplcm8gaW4KLQlsb2FkIGluc3RydWN0aW9uLCB3aGljaCBpdCBjYW4gYmUgZm9yIGEgZmxvYXRpbmcgcG9pbnQgbG9hZC4KLQotTW9uIE1hciAxNSAxMjoxNzoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogQ29tcHV0ZSB0aGUgcmVsb2NzIGJlZm9yZSB3cml0aW5nIG91dAotCXRoZSBzZWN0aW9uIGNvbnRlbnRzLgotCSogY29uZmlnL29iai1lY29mZi5oLCBjb25maWcvb2JqLWVjb2ZmLmM6IE51bWVyb3VzIGNoYW5nZXMgdG8gZ2V0Ci0Jc3ltYm9sIHRhYmxlIGFuZCB2YWx1ZXMgcmlnaHQuCi0JKiBjb25maWcvdGMtbWlwcy5oIChMT0NBTF9MQUJFTCk6IElmIE9CSl9FQ09GRiwgYW55IGxhYmVsIHN0YXJ0aW5nCi0Jd2l0aCAkTCBpcyBsb2NhbC4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHRjX2dlbl9yZWxvYyk6IElmIE9CSl9FQ09GRiwgYWRqdXN0IHRoZSBhZGRlbmQKLQlieSB0aGUgc2VjdGlvbiB2bWEuCi0KLQkqIGNvbmZpZy96OGsubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBUaGUgcmVsZXZhbnQgZmlsZSBpcwotCXo4ay1vcGMuaCwgbm90IHo4ay5oLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfZW5kZWYpOiBDb3JyZWN0IHRlc3QgZm9yIC5iZgotCXN5bWJvbC4KLQotRnJpIE1hciAxMiAxODozMzozNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIHNwYXJjLXN1bi1zb2xhcmlzMiogaW5zdGVhZCBvZiAtc29sYXJpczIKLQotRnJpIE1hciAxMiAxMjowMDowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGV4cHIuYywgd3JpdGUuYzogVWx0cml4IG5hdGl2ZSA0LjIgY2MgcmVxdWlyZXMgYXNzZXJ0IGNvbmRpdGlvbgotCXRvIGJlIG9uIGEgc2luZ2xlIGxpbmUuCi0KLVRodSBNYXIgMTEgMTc6NTY6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLmgpOiBDcmVhdGUgZmlsZSwgd3JpdGluZyBvdXQgZGVmaW5pdGlvbnMgb2YKLQl0YXJnZXQgY3B1LCBhbGlhcywgYW5kIGNhbm9uaWNhbCBuYW1lLgotCShBTExfQ0ZMQUdTKTogTm8gbG9uZ2VyIGRlZmluZSBUQVJHRVRfQ1BVLgotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBQcmludCBhIG1lc3NhZ2UsIGluc3RlYWQgb2YgcXVpdHRpbmcKLQlzaWxlbnRseS4KLQotCSogYXMuYyAobWFpbik6IERvbid0IGNhdGNoIGFueSBzaWduYWxzLCBmb3Igbm93LgotCi0JKiB2ZXJzaW9uLmM6IERlbGV0ZWQuCi0JKiBNYWtlZmlsZS5pbjogR2VuZXJhdGUgaXQsIHB1dHRpbmcgaW4gb25seSB0aGUgdmVyc2lvbiBudW1iZXIKLQlpdHNlbGYuCi0JKFZFUlNJT04pOiBOZXcgdmFyaWFibGUuCi0JKiBhcy5jOiBJbmNsdWRlIGNvbmZpZy5oLgotCShtYWluKTogUmVmb3JtYXR0ZWQgdmVyc2lvbiBzdHJpbmcuICBJbmNsdWRlIHRhcmdldCBhbGlhcy4gIERvbid0Ci0JcHJpbnQgaWYgbm90IHJlcXVlc3RlZCAoaS5lLiwgdW5rbm93biAtdiBhcmd1bWVudCkuCi0KLQkqIGFzLmMgKHN0cmFsbG9jKTogRGVsZXRlZC4KLQkobWFpbik6IENhbGwgc3RyZHVwIGluc3RlYWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGFsbCA2ODMwMCBzZXJpZXMgY2hpcHMuCi0JKiBjb25maWcvdGMtbTY4ay5jOiBJbmNsdWRlIGNvbmZpZy5oLgotCShtZF9hc3NlbWJsZSk6IEFzc3VtZSBUQVJHRVRfQ1BVIGlzIGRlZmluZWQuICBBY2NlcHQgc29tZSA2ODMwMAotCXNlcmllcyBjcHVzIGFzIGRlZmF1bHRzLgotCShtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgc29tZSBtNjgzMDAgc2VyaWVzIENQVXMgYXMgZGVmYXVsdHMuCi0KLVdlZCBNYXIgMTAgMTc6NDE6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhcy5jIChFWElUX1NVQ0NFU1MsIEVYSVRfRkFJTFVSRSk6IERlZmluZSB0byBub3JtYWwgdmFsdWVzIGlmCi0Jbm90IGFscmVhZHkgZGVmaW5lZC4KLQkobWFpbiwgZ290X3NpZyk6IFVzZSB0aGVtLgotCSogY29uZmlnL2hvLXZtcy5oIChFWElUX1NVQ0NFU1MsIEVYSVRfRkFJTFVSRSk6IFJldmVyc2UgZGVmYXVsdAotCXZhbHVlcy4KLQotVHVlIE1hciAgOSAwNzo0MDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYywgY29uZmlnL29iai1lY29mZi5oOiBQcmVsaW1pbmFyeSBFQ09GRgotCXN1cHBvcnQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgYmFzZWQgb24gT0JKX0FPVVQgdnMuCi0JT0JKX0VDT0ZGIGFzIHdlbGwgYXMgVEFSR0VUX0JZVEVTXypfRU5ESUFOLgotCShzdHJ1Y3QgbG9jLCBzdHJ1Y3QgcHJvYywgc3RydWN0IGZpbGUpOiBNb3ZlZCB0byB0Yy1taXBzLmMgd2l0aGluCi0JI2lmbmRlZiBPQkpfRUNPRkYgYmxvY2ssIHNpbmNlIEVDT0ZGIHVzZXMgZGlmZmVyZW50IHZlcnNpb25zLgotCSogY29uZmlnL3RjLW1pcHMuYzogUmVhcnJhbmdlZCBmb3IgRUNPRkYgc3VwcG9ydC4gIEFkZGVkCi0JcHJvdG90eXBlcyBmb3IgYWxsIHN0YXRpYyBmdW5jdGlvbnMuICBNb3ZlZCBleGlzdGluZyBtaW5pbWFsCi0JZGVidWdnaW5nIGZvcm1hdCBzdXBwb3J0IGluZm8gI2lmbmRlZiBPQkpfRUNPRkYgYmxvY2tzLgotCShtYWNyb19idWlsZF9sdWkpOiBFbGltaW5hdGVkIHNpZ25fZXh0ZW5kIGFyZ3VtZW50LCBiZWNhdXNlIEVDT0ZGCi0JZG9lcyBub3Qgc3VwcG9ydCBhIG5vbiBzaWduIGV4dGVuZGVkIGhpZ2ggMTYgYml0cyByZWxvYy4gIEFkanVzdGVkCi0JYWxsIGNhbGxlcnMgYWNjb3JkaW5nbHkuCi0JKHRjX2dldF9yZWdpc3Rlcik6IFJlbmFtZWQgZnJvbSBnZXRfcmVnaXN0ZXIsIGFuZCBtYWRlIG5vbi1zdGF0aWMuCi0KLQkqIGNvbmZpZy9taXBzLWJpZy5tdCwgY29uZmlnL21pcHMtbGl0Lm10OiBOZXcgZmlsZXMuICBEZWZpbmUKLQlUQVJHRVRfQllURVNfQklHX0VORElBTiBhbmQgVEFSR0VUX0JZVEVTX0xJVFRMRV9FTkRJQU4sCi0JcmVzcGVjdGl2ZWx5LgotCSogY29uZmlndXJlLmluIChtaXBzLSotYnNkKik6IFVzZSBnYXNfdGFyZ2V0IG1pcHMtbGl0LgotCShtaXBzLSotdWx0cml4KiwgbWlwcy0qLWlyaXgqLCBtaXBzLSotZWNvZmYpOiBOZXcgdGFyZ2V0cywgdXNpbmcKLQlvYmpfZm9ybWF0IGVjb2ZmIGFuZCBnYXNfdGFyZ2V0IG1pcHMtbGl0IG9yIG1pcHMtYmlnLgotCi1UdWUgTWFyICA5IDA3OjQzOjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiB2ZXJzaW9uLmM6IEJ1bXAgdG8gdmVyc2lvbiAyLjAuMS4KLQotVHVlIE1hciAgOSAwNzo0MDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyKTogQ2hlY2sgdGhhdCBzZWdfaW5mbyAoc2VjdGlvbikKLQlpcyBub3QgTlVMTC4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIG9ial9mcm9iX2ZpbGUgYWZ0ZXIgc2V0dGluZyB0aGUgc3ltYm9scywKLQlub3QgYmVmb3JlLgotCi1UdWUgTWFyICA5IDAwOjAwOjAwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBWZXJzaW9uIDIuMCByZWxlYXNlZC4KLQotTW9uIE1hciAgOCAxNDo1NzoxMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX0NPVU5UX1JFTE9DKTogTG9vayBmb3IgZnhfYWRkc3kgb25seS4KLQotRnJpIE1hciAgNSAwOTowNTo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlYWQuaDogRGVmaW5lIHN0cmluZ2VyIGhlcmUuCi0JcmVhZC5jLCBjb25maWcvb2JqLWllZWUuYywgY29uZmlnL29iai10Y204OGsuYzogTm90IGFueSBvZiB0aGVzZQotCXBsYWNlcy4KLQotVGh1IE1hciAgNCAxMTo1MjoyMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChzX3NwYWNlKTogTXVsdGlwbHkgcmVwZWF0IGNvdW50IGJ5IG11bHQsIG5vdCBmaWxsLgotCi1UaHUgTWFyICA0IDA1OjIwOjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiByZWFkLmM6IEluY2x1ZGUgY3R5cGUuaC4KLQotV2VkIE1hciAgMyAxMDo0MTo0NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlQYXRjaGVzIGZyb20gRXJpYyBZb3VuZ2RhbGU6Ci0JKiBtYWtlLWdhcy5jb206IEZpbmQgb2JzdGFjay5vYmogaWYgaXQncyBub3QgaW4gdGhlIGN1cnJlbnQKLQlkaXJlY3RvcnkuCi0JKiByZWFkLmMgKHNfaWdub3JlKTogRG9uJ3QgZGVjbGFyZSBpc19lbmRfb2ZfbGluZS4gIEl0J3MKLQlyZWR1bmRhbnQsIGFuZCB0cmlnZ2VycyBhIFZNUyBnY2MgY29tcGlsZXIgYnVnLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IE1hY3JvIFNVQl9TRUdNRU5UX0FMSUdOIG5vdyB0YWtlcwotCWN1cnJlbnQgc2VnbWVudCBhcyBhbiBhcmd1bWVudC4gIChJZ25vcmVkIGluIGFsbCBjYXNlcyBidXQgVk1TLikKLQlBbGwgY2FsbGVycyBhbmQgZGVmaW5pdGlvbnMgY2hhbmdlZC4KLQotVHVlIE1hciAgMiAxMTo1NjoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpc3RpbmcuYzogQ2xlYW5lZCB1cCBhIGJpdCwgYWRkZWQgcHJvdG90eXBlcywgbWFkZSBOT19MSVNUSU5HCi0JY2FzZSBjb21waWxlIGFnYWluLgotCi1UdWUgTWFyICAyIDA4OjUzOjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpc2J5dGUpOiBBY2NlcHQgYWxsIHZhbHVlcyBmcm9tIC0yNTUgdG8gKzI1NSwKLQlzbyAifjB4ODAiIHdvbid0IGJlIHJlamVjdGVkLgotCi0JKiBjb25maWcvb2JqLWVsZi5jOiBObyBsb25nZXIgaW5jbHVkZSBlbGYvcmVsb2MuaC4KLQkob2JqX2VsZl9zZWN0aW9uKTogU2V0IFNFQ19SRUFET05MWSBhbmQgU0VDX0NPREUgZm9yIHRleHQgc2VjdGlvbi4KLQkob2JqX2VsZl9zdGFiLCBvYmpfZWxmX2Rlc2MpOiBEZWxldGVkIGRvLW5vdGhpbmcgYW5kIGNvbW1lbnRlZC1vdXQKLQlyb3V0aW5lcy4KLQkob2JqX2VsZl94c3RhYik6IE5ldyByb3V0aW5lLgotCShvYmpfZWxmX3NldF9zaXplKTogQ2FsbCBhc193YXJuLCBub3QgZnByaW50Zi4gIFBhc3MgZGVzaXJlZAotCWFyZ3VtZW50IHRvIHNfaWdub3JlLiAgUHV0ICIjaWYgMCIgYXJvdW5kIHVudXNlZCBjb2RlLgotCShvYmpfcHNldWRvX3RhYmxlKTogVXNlIHNfaWdub3JlIGluc3RlYWQgb2YgZG8tbm90aGluZyByb3V0aW5lcy4KLQlDYWxsIGVsZl94c3RhYnMgZm9yIC5zdGFicyBhbmQgLnhzdGFicyBvcGVyYXRvcnMuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfRk9STUFUKSBbT0JKX0VMRl06IE5vdyAiZWxmMzItc3BhcmMiLgotCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpOiBTZXQgU0VDX1JFTE9DIG9ubHkgaWYgZml4dXBzIGFyZQotCXByZXNlbnQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogbWlwcy1ic2QgY29uZmlndXJhdGlvbiB3YXMgbWlzc2luZyBmb3JtYXQgc3BlYy4KLQlTaG91bGQgdXNlIGFvdXQuCi0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IERlcGVuZHMgb24gY29uZmlndXJlLmluLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IERvbid0IGNoZWNrIGZvciBhbGlnbm1lbnQgb2YKLQlmcmFnIGluIG1lbW9yeTsgYWxpZ25tZW50IG9mIGluc3RydWN0aW9ucyBpbiBzZWN0aW9uIGlzIGEgc2VwYXJhdGUKLQltYXR0ZXIuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkX2x1aSk6IEZpeCBzb21lIGFzc3VtcHRpb25zIG9mIEFOU0kKLQlDIGF2YWlsYWJpbGl0eS4KLQotCSogbGlzdGluZy5oOiBBbHdheXMgcHJvdmlkZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIG5vdCBtYWNyb3MsIHNvCi0JcGNjIHdvbid0IGxvc2UuCi0KLVR1ZSBNYXIgIDIgMDA6NTA6NDMgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIENPTlRSSUJVVE9SUzogIFVwZGF0ZSBHaWxtb3JlIGVudHJ5LgotCi1Nb24gTWFyICAxIDEyOjAzOjE2IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogIENvcnJlY3RseSBhc3NlbWJsZSBwcmVmZXRjaAotCWluc3RydWN0aW9ucy4gIEFjY2VwdCBpbnRlZ2VyIHByZWZldGNoIGZ1bmN0aW9uIG51bWJlcnMuCi0KLVdlZCBGZWIgMjQgMTQ6NTg6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc194d29yZCk6IE5vdyBjYWxsIGJpZ19jb25zLCBzbyBsYXJnZQotCWNvbnN0YW50cyBhcmUgYWNjZXB0ZWQsIGJ1dCBzeW1ib2xpYyB2YWx1ZXMgYXJlIG5vdC4gIEdDQyB3aWxsIG5vdAotCWdlbmVyYXRlIHRoZSBsYXR0ZXIgY3VycmVudGx5LgotCi0JKiBmcmFncy5jIChmcmFnX2luaXQpOiBOZXcgZnVuY3Rpb24uCi0JKHplcm9fYWRkcmVzc19mcmFnLCBic3NfYWRkcmVzc19mcmFnKTogTm93IGluaXRpYWxpemVkIGF0IHJ1bgotCXRpbWUuCi0JKiBhcy5jIChtYWluKTogQ2FsbCBmcmFnX2luaXQuCi0KLVdlZCBGZWIgMjQgMTA6MzI6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogSW4gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVCBjYXNlOgotCURvbid0IHVuZ2V0IGNoMiBpZiB3ZSBkaWRuJ3QgZ2V0IGl0LgotCi1XZWQgRmViIDI0IDA0OjE0OjA3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKFRFWElESVIpOiBVcGRhdGVkIGZvciBuZXcgbGF5b3V0LgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBBZGQgc3VwcG9ydCBmb3IgRUxGIHZlcnNpb24uCi0JKHRjX2dlbl9yZWxvYykgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0FSQ0gsIFRBUkdFVF9GT1JNQVQpIFtCRkRfQVNTRU1CTEVSXToKLQlOZXcgbWFjcm9zLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBOZXcgbWFjcm8uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBGb3IgUEMtcmVsYXRpdmUgYWRkcmVzc2luZyBvZiBhCi0Jc3ltYm9sLCBmaXggdGhlIG9mZnNldCBzbyAiKzIiIGlzbid0IHJlcXVpcmVkLgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChsaW5lX2NvbW1lbnRfY2hhcnMsIGxpbmVfc2VwYXJhdG9yX2NoYXJzKToKLQlEZWZpbmUgYXMgY29tbW9uL2Jzcy4KLQkob3BfaGFzaCwgcmVnX2hhc2gsIGFyZWdfaGFzaCwgaWNsYXNzZXNfc2VlbiwgYnJfY250KTogRGVmYXVsdCBDCi0JaW5pdGlhbGl6ZXJzIGFyZSBzdWZmaWNpZW50LgotCi0JKiBjb25maWcvb2JqLWFvdXQuaCBbQkZEX0FTU0VNQkxFUl06IEluY2x1ZGUgbGliYW91dC5oIGZyb20gYmZkLgotCShUQVJHRVRfRk9STUFUKSBbQkZEX0FTU0VNQkxFUl06IERlZmF1bHQgdG8gImEub3V0Ii4KLQkoU19TRVRfKiwgU19HRVRfKiwgb2JqX2Zyb2Jfc3ltYm9sKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBtYWNyb3MuCi0JKFNfU0VUX1RZUEUpIFshQkZEX0FTU0VNQkxFUl06IE5ldyBtYWNyby4KLQkqIGNvbmZpZy9vYmotYW91dC5jOiBVc2UgUEFSQU1TIG1hY3JvIGZvciBkZWNsYXJhdGlvbnMuICBSZW1vdmUKLQkiSUdOT1JFX0RFQlVHIiBjb25kaXRpb25hbCwgc2luY2UgYm90aCBicmFuY2hlcyBhcmUgaWRlbnRpY2FsLgotCVVzZSBTX1NFVF9UWVBFLCBTX0dFVF9UWVBFLCBhbmQgU19HRVRfREVTQyBpbnN0ZWFkIG9mIGRpcmVjdGx5Ci0JcmVmZXJlbmNpbmcgc3ltYm9sIHN0cnVjdHVyZSBtZW1iZXJzLgotCShvYmpfYW91dF9mcm9iX3N5bWJvbCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGFzLmggKHN0cnVjdCBmcmFnKTogUmVvcmRlcmVkIGEgY291cGxlIG9mIGZpZWxkcyBmb3IgYmV0dGVyCi0JcGFja2luZy4KLQotCSogd3JpdGUuYyAocmVjb3JkX2FsaWdubWVudCkgW0JGRF9BU1NFTUJMRVJdOiBSZWNvcmQgaXQgaW4gdGhlCi0Jc2VjdGlvbiBpbmZvLgotCSh3cml0ZV9jb250ZW50cykgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb24uCi0JKHdyaXRlX29iamVjdF9maWxlKSBbQkZEX0FTU0VNQkxFUl06IEFsd2F5cyBoYW5kbGUgLVIgaGVyZS4gIENhbGwKLQlmaXhfbmV3IHdpdGggQkZEX1JFTE9DX05PTkUgaW5zdGVhZCBvZiAwIG9yIE5PX1JFTE9DLiAgQ2FsbAotCW9ial9mcm9iX2ZpbGUsIG9ial9mcm9iX3N5bWJvbCwgdGNfZnJvYl9zeW1ib2wgaWYgZGVmaW5lZC4KLQkoZml4dXBfc2VnbWVudCk6IE1ha2Ugc3VyZSBjb21tb24tc2VjdGlvbiBzeW1ib2xzIGdldCB0cmVhdGVkIHRoZQotCXNhbWUgYXMgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKGZpeF9uZXcpIFtCRkRfQVNTRU1CTEVSXTogQXJndW1lbnQgcl90eXBlIGlzIG9mIHR5cGUKLQliZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUuICBVc2Ugc2VnX2ZpeF97cm9vdCx0YWlsfVAgZGVyaXZlZCBmcm9tCi0Jc2VjdGlvbiBpbmZvLgotCSogd3JpdGUuaCAoZml4X25ldyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0KLQkqIHRjLmggKG1kX29wZXJhbmQsIG1kX2NvbnZlcnRfZnJhZywgdGNfaGVhZGVyc19ob29rLAotCW1kX3NlY3Rpb25fYWxpZ24sIG1kX3VuZGVmaW5lZF9zeW1ib2wpOiBEb24ndCBwcm92aWRlIHByb3RvdHlwZXMKLQlpZiB0aGVzZSBhcmUgZGVmaW5lZCBhcyBtYWNyb3MuCi0JKG1kX2NvbnZlcnRfZnJhZykgW0JGRF9BU1NFTUJMRVJdOiBCRkQgdmVyc2lvbiBuZWVkcyBiZmQgYW5kCi0Jc2VjdGlvbiBwYXNzZWQuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IEFyZ3VtZW50IE5BTUUgaXMgbm93IHBvaW50ZXIgdG8gY29uc3QuCi0JU2ltcGxpZmllZCBTVFJJUF9VTkRFUlNDT1JFIGNvZGUuICBSZW1vdmUgYXNzdW1wdGlvbnMgYWJvdXQgbnVsbAotCXBvaW50ZXJzIGluIGZyZXNobHkgYWxsb2NhdGVkIHN0b3JhZ2UuICBbQkZEX0FTU0VNQkxFUl06IEdldCBuZXcKLQlCRkQgc3ltYm9sLgotCShjb2xvbik6IERpc3BsYXkgb3RoZXIvZGVzYyBmaWVsZHMgb2YgcmVkZWZpbmVkIHN5bWJvbCBvbmx5IGlmCi0JU19HRVRfT1RIRVIgYW5kIFNfR0VUX0RFU0MgYXJlIGRlZmluZWQuCi0JKHN5bWJvbF9tYWtlKTogQXJndW1lbnQgTkFNRSBpcyBub3cgcG9pbnRlciB0byBjb25zdC4KLQkoc3ltYm9sX2ZpbmQsIHN5bWJvbF9maW5kX2Jhc2UpOiBMaWtld2lzZS4KLQkoU19JU18qLCBTX0dFVF8qLCBTX1NFVF8qKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBmdW5jdGlvbnMuCi0JKiBzeW1ib2xzLmg6IEZpeCBwcm90b3R5cGVzIGZvciBuZXcgY29uc3QgYXJndW1lbnRzLiAgQWRkCi0JcHJvdG90eXBlcyBmb3IgQkZEX0FTU0VNQkxFUiBTXyogZnVuY3Rpb25zLgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpIFtCRkRfQVNTRU1CTEVSXTogQkZEIHZlcnNpb24gb2YgY29kZQotCWZvciBjaGFuZ2luZyB0byBhbiBleGlzdGluZyBzZWN0aW9uLgotCShzdWJzZWdfbmV3X3Jlc3QpIFtCRkRfQVNTRU1CTEVSXTogU3BsaXQgb2ZmIGZyb20gc3Vic2VnX25ldywKLQljYWxsZWQgYnkgc3Vic2VnX25ldyBhbmQgc3Vic2VnX3NldC4KLQkoc3Vic2VnX25ldykgW0JGRF9BU1NFTUJMRVJdOiBSZXdyaXR0ZW4gdG8gY2hhbmdlIHRvIG5ldyBzZWN0aW9uLAotCWdpdmVuIHNlY3Rpb24gbmFtZSBhbmQgc3Vic2VnIG51bWJlci4KLQkoc3Vic2VnX3NldCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb247IGNoYW5nZSB0byBhIHBvc3NpYmx5Ci0JbmV3IHNlY3Rpb24vc3Vic2VjdGlvbi4KLQotCSogcmVhZC5jOiBEb24ndCBpbmNsdWRlIGN0eXBlLmguCi0JKGNvbnMpIFtCRkRfQVNTRU1CTEVSXTogRm9yIHVuZGVmaW5lZCBzeW1ib2xzLCB1c2UgQkZEX1JFTE9DXzMyCi0JZm9yIG5vdzsgc2hvdWxkIGJlIG1hY2hpbmUtZGVwZW5kZW50LgotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCAqLSotZWxmIGFuZCAqLSotc29sYXJpcyogYXMgRUxGIGZvcm1hdAotCXRhcmdldHMsIGZvcmNpbmcgQkZEIHVzZS4KLQotV2VkIEZlYiAxNyAxODo1OTowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBVc2UgUEFSQU1TIG1hY3JvIGZvciBzdGF0aWMgZnVuY3Rpb24KLQlkZWNsYXJhdGlvbnMuICBVc2UgQkZEX1JFTE9DXyBtYWNyb3MgZXZlcnl3aGVyZSwgd2l0aAotCWNvbXBhdGliaWxpdHkgbWFjcm9zIGRlY2xhcmVkIGZvciBub24tQkZEIG1vZGUuCi0JKHN0cnVjdCBzcGFyY19pdCkgW0JGRF9BU1NFTUJMRVJdOiBVc2UgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi0JaW5zdGVhZCBvZiBlbnVtIHJlbG9jX3R5cGUuCi0JKGVtaXRfc3BhcmNfcmVsb2MpOiBDb21tZW50ZWQtb3V0IGZ1bmN0aW9uIGRlbGV0ZWQuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IERlbGV0ZWQuCi0JKHRjX2FvdXRfcHJlX3dyaXRlX2hvb2spOiBEb24ndCBkZWZpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCi0JKG1kX2FwcGx5X2ZpeCk6IENoYW5nZWQgY2FsbGluZyBzZXF1ZW5jZSAoY29uZGl0aW9uYWxseSkgZm9yIEJGRAotCXZlcnNpb24uCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfY29udmVydF9mcmFnKTogTmV3IG1hY3JvLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfc3RhYik6IFJlZmVyIHRvIHVuZGVmaW5lZF9zZWN0aW9uLAotCW5vdCBTRUdfVU5LTk9XTi4gIFVzZSBTX1NFVF9UWVBFLCBTX0dFVF9UWVBFLCBTX0dFVF9ERVNDIGluc3RlYWQKLQlvZiByZWZlcmVuY2luZyBmaWVsZHMgZGlyZWN0bHkuCi0KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBOZXcgZnVuY3Rpb247IGV4dHJhY3RlZCBmcm9tCi0Jd3JpdGVfb2JqZWN0X2ZpbGUuCi0JKHdyaXRlX29iamVjdF9maWxlKSBbISBCRkRfQVNTRU1CTEVSXTogQ2FsbCBpdC4KLQkocmVsYXhfYW5kX3NpemVfc2VnKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBmdW5jdGlvbjsgcmVsYXggc2VjdGlvbgotCWFuZCBzZXQgaXRzIHNpemUgYW5kIGZsYWdzLgotCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IHN5bWJvbCkgW0JGRF9BU1NFTUJMRVJdOiBSZXBsYWNlIHNvbWUKLQlmaWVsZHMgd2l0aCBCRkQgZXF1aXZhbGVudHMuICBUdXJuIG9uIGJhY2stcG9pbnRlcnMsIGFuZCBhZGQKLQl0YXJnZXQtc3BlY2lmaWMgZmllbGRzIGF0IGVuZC4KLQotVGh1IEZlYiAxMSAwOToyMDozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBEb24ndCBzZXQgdmFkZHIgaGVyZS4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBTZXQgaXQgaGVyZSBpbnN0ZWFkLCBzbyB0aGF0IGZpeHVwX3NlZ21lbnQKLQljYW4gc2VlIHRoZSBjb3JyZWN0IHZhbHVlLgotCi1Nb24gRmViICA4IDEzOjU2OjE3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDaGVjayBmb3IgZXJyb3JzIGFuZCB3YXJuaW5ncyBhbmQKLQliYWlsIG91dCBiZWZvcmUgcHJvY2Vzc2luZyBjb250ZW50cy4KLQkoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSk6IE5ldyBmdW5jdGlvbiwgZG9lcyBtb3N0IG9mIHRoZSB3b3JrCi0Jb2YgcmVtb3ZlX3N1YnNlZ3MuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBmdW5jdGlvbi4KLQkocmVtb3ZlX3N1YnNlZ3MpIFshIEJGRF06IENhbGwgaXQuCi0JKHdyaXRlX29iamVjdF9maWxlKSBbQkZEX0FTU0VNQkxFUl06IENvbnZlcnRlZCB0byB1c2UgQkZECi0Jc3RydWN0dXJlcyBhbmQgcm91dGluZXMuCi0KLQkqIGNvbmZpZy9vYmotZWxmLio6IE5ldyBmaWxlcy4KLQotCSogY29uZmlnL21pcHMubXQsIGNvbmZpZy9yczYwMDAubXQ6IERlbGV0ZWQuCi0KLQkqIGNvbmZpZy9oODMwMC5tdDogRG9uJ3Qgc3BlY2lmeSBjb21waWxlciBoZXJlLgotCi0JKiBjb25maWcvejhrLm10OiBUaGUgejhrIGNvZGUgZGVwZW5kcyBvbiB0aGUgejhrIG9wY29kZSB0YWJsZSwKLQlub3QgdGhlIGg4MzAwIG9uZS4KLQkqIGNvbmZpZy90Yy16OGsuaDogQ29tbWVudCBmaXguCi0KLQkqIHdyaXRlLmM6IFJlb3JkZXJlZCBzb21lIGZ1bmN0aW9ucyBmb3IgYmV0dGVyIGlubGluaW5nLgotCShmaXh1cF9zZWdtZW50KTogTGlua3JlbGF4IGNvZGUgaXMgbm8gbG9uZ2VyIGNvbmRpdGlvbmFsIG9uCi0JVENfSTk2MC4KLQotVGh1IEZlYiAgNCAxMjo0NToxNiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3toODUwMC5tdCwgdGMtaDg1MDAuYywgdGMtaDg1MDAuaCwgb2JqLWNvZmZiZmQuYywKLQlvYmotY29mZmJmZC5ofTogc3VwcG9ydCBmb3IgdGhlIEg4LzUwMAotCi1XZWQgRmViICAzIDE5OjI4OjE4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai12bXMuaCAoU1VCX1NFR01FTlRfQUxJR04pOiBEZWZpbmUgVk1TIHZlcnNpb24gaGVyZS4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogTm90IGhlcmUuCi0JKGZpeF9uZXcpOiBJbml0aWFsaXplIGZ4X2FkZG51bWJlci4KLQotCSogbGlzdGluZy5jOiBEb24ndCBpbmNsdWRlIHRhcmdldC1jcHUuaCBleHBsaWNpdGx5LCBzaW5jZSBhcy5oCi0JaW5jbHVkZXMgaXQuCi0KLVRodSBKYW4gMjggMDA6MzU6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmggW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBkZWNsYXJlIG5leHRfb2JqZWN0X2ZpbGVfY2hhclAsCi0JKl9maXhfcm9vdCwgKl9maXhfdGFpbCwgc2VnX2ZpeF9yb290UCwgc2VnX2ZpeF90YWlsUC4KLQkoc3RydWN0IGZpeCk6IFJlb3JkZXJlZCBmaWVsZHMgZm9yIGNvbXBhY3RuZXNzIGFuZCBlZmZpY2llbmN5LgotCUNvbnZlcnRlZCBzb21lIGxvZ2ljYWwgZmllbGRzIHRvIDEtYml0IGZpZWxkcy4KLQotCSogY29uZmlnL29iai1hb3V0Lmg6IFVzZSBQQVJBTVMuCi0JW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBkZWZpbmUvZGVjbGFyZSBBT1VUX01BQ0hUWVBFLCBzZWdfTl9UWVBFLAotCU5fVFlQRV9zZWcsIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRS4KLQotCSogcmVhZC5jOiBEb24ndCBpbmNsdWRlIGxpc3RpbmcuaDsgYXMuaCBpbmNsdWRlcyBpdC4gIFJlbW92ZWQKLQlET05UREVGIGNvZGUuCi0JW0JGRF9BU1NFTUJMRVJdOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkob2xkX2J1ZmZlciwgbmV3X2Jyb2tlbl93b3Jkcyk6IERlZmF1bHQgaW5pdGlhbGl6YXRpb24gaXMKLQlzdWZmaWNpZW50LgotCi0JKiBvdXRwdXQtZmlsZS5jIFtCRkRfQVNTRU1CTEVSXTogSW5jbHVkZSBiZmQuaCwgZGVmYXVsdCBUQVJHRVRfTUFDSAotCXRvIDAsIGRlZmluZSBzdGRvdXRwdXQuCi0JKG91dHB1dF9maWxlX2NyZWF0ZSkgW0JGRF9BU1NFTUJMRVJdOiBDYWxsIGJmZF9wZXJyb3Igb24gZmFpbHVyZS4KLQlDYWxsIGJmZF9zZXRfYXJjaF9tYWNoLgotCShvdXRwdXRfZmlsZV9jbG9zZSkgW0JGRF9BU1NFTUJMRVJdOiBDYWxsIGJmZF9jbG9zZSwgbm90Ci0JYmZkX2Nsb3NlX2FsbF9kb25lLiAgQ2FsbCBiZmRfcGVycm9yIG9uIGZhaWx1cmUuCi0JKG91dHB1dF9maWxlX2FwcGVuZCkgW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBkZWZpbmUuCi0KLQkqIGNvbmZpZy9tNjhrY29mZi5tdCAoTE9DQUxfTE9BRExJQkVTKTogRGVsZXRlIGRlZmluaXRpb24uCi0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBBbHdheXMgZGVmaW5lLiAgT21pdCBmaWVsZCBzY25oZHIKLQlpZiBub3QgTUFOWV9TRUdNRU5UUy4gIERlZmluZSBuZXcgZmllbGQgYmZkX3NlY3Rpb24gaWYKLQlCRkRfQVNTRU1CTEVSLgotCShzZWdfaW5mbyk6IE5ldyBtYWNyby4KLQotCSogZXhwci5jLCBpbnB1dC1zY3J1Yi5jOiBVc2UgUEFSQU1TIG1hY3JvLiAgRGVsZXRlZCB1bnVzZWQKLQl2YXJpYWJsZXMsIGFuZCBzb21lIGlycmVsZXZhbnQgY29tbWVudHMuCi0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogSW5jbHVkZSAkKEJGRERFRikuCi0JKExJQlMpOiBJbmNsdWRlICQoQkZETElCKS4gIERvbid0IGJvdGhlciB3aXRoICQoQ0xJQikuCi0JKiBjb25maWd1cmUuaW46ICBQZXJtaXQgLS13aXRoLWJmZC1hc3NlbWJsZXIgbm93LCB3aXRoIGEgd2FybmluZy4KLQlWYXJpYWJsZSBuZWVkX2JmZCBpcyBub3cgYSBib29sZWFuLCBhcyBpcyBuZXcgdmFyaWFibGUgYmZkX2dhcy4KLQlTZXQgQkZEREVGIGFuZCBCRkRMSUIgaW4gTWFrZWZpbGUgd2hlbiBhcHByb3ByaWF0ZS4KLQotCSogYXMuYzogUmVtb3ZlZCAiI2lmZGVmIERPTlRERUYiIGFuZCAiI2lmZGVmIGNvbW1lbnQiIGNvZGUuCi0JKG1haW4pOiBSZWZlciB0byBmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQgaW5zdGVhZCBvZgotCWZsYWdzZWVuWydaJ10uCi0KLQkqIGFzLmMgKG1haW4pIFtCRkRfQVNTRU1CTEVSXTogT3BlbiBvdXRwdXQgYmZkLgotCSgqX3NlY3Rpb24pIFtCRkRfQVNTRU1CTEVSXTogRGVmaW5lIHRoZW0uCi0JKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcykgW0JGRF9BU1NFTUJMRVJdOiBJbml0aWFsaXplIHRoZW0sIGFuZAotCXNldCBzZWN0aW9uIGZsYWdzIHdoZW4gYXBwcm9wcmlhdGUuCi0JKiBhcy5oIChTRUdfTk9STUFMKSBbQkZEX0FTU0VNQkxFUl06IFJlcXVpcmUgdGhhdCB0aGUgc3BlY2lmaWVkCi0Jc2VjdGlvbiBpcyBub3QgYWJzb2x1dGUsIHVuZGVmaW5lZCwgb3IgYW4gYXNzZW1ibGVyIGludGVybmFsIG9uZS4KLQkoYWJzb2x1dGVfc2VjdGlvbiwgdW5kZWZpbmVkX3NlY3Rpb24pOiBBbHdheXMgZGVmaW5lLgotCSogZXhwci5jLCByZWFkLmMsIHN5bWJvbHMuYzogUmVmZXIgdG8gKl9zZWN0aW9uLCBub3QgU0VHXyo7IGJyZWFrCi0Jc3dpdGNoIHN0YXRlbWVudHMgaW50byBpZi1lbHNlIHRyZWVzLgotCSogc3ltYm9scy5jIFtNQU5ZX1NFR01FTlRTXTogRGVsZXRlZCByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YKLQlTRUdfQlNTIGFuZCBTRUdfREFUQS4KLQotCSogYXMuaCAoZnJhZ19ub3dfZml4KTogTmV3IG1hY3JvLgotCSogc3ltYm9scy5jIChjb2xvbik6IFVzZSBpdC4KLQotV2VkIEphbiAyNyAyMTo0Mzo1MyBQU1QgMTk5MyAgUmFscGggQ2FtcGJlbGwgIChyYWxwaGNAcHlyYW1pZC5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6ICBBZGRlZCBtaXBzIHN1cHBvcnQgZm9yIG1pcHMtZGVjLWJzZC4KLQkqIGNvbmZpZy90Yy1taXBzLmg6ICBBZGRlZCBtaXBzIHN1cHBvcnQgZm9yIG1pcHMtZGVjLWJzZC4KLQkqIGNvbmZpZy9oby1taXBzYnNkLmg6ICBBZGRlZCBtaXBzIHN1cHBvcnQgZm9yIG1pcHMtZGVjLWJzZC4KLQkqIGNvbmZpZy9taXBzLW9wY29kZS5oOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBjb25maWd1cmUuaW46ICBBZGRlZCBtaXBzIHN1cHBvcnQgZm9yIG1pcHMtZGVjLWJzZC4KLQkqIGF0b2YtZ2VuZXJpYy5jOiAgRGVmaW5lIFRSVUUgYW5kIEZBTFNFIGlmIG5vdCBkZWZpbmVkLgotCi1UaHUgSmFuIDIxIDEyOjQ4OjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogdmVyc2lvbi5jOiBCdW1wZWQgdmVyc2lvbiBudW1iZXIgdG8gMS45My4wNS4KLQotV2VkIEphbiAyMCAxNzoxMTo1MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IERvbid0IHVzZSAjZWxpZi4KLQkob2JqX2VtaXRfbGluZW5vKTogRG9uJ3QgbmVlZCByZXR1cm4gYXQgZW5kIG9mIHZvaWQgZnVuY3Rpb24uCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEaXR0by4KLQotCSogY29uZmlnL3RjLW02OGsuYzogUmVtb3ZlZCBzb21lIHVudXNlZCBjb2RlLgotCSh0Y19hb3V0X2ZpeF90b19jaGFycyk6IEFycmF5IG5ieXRlc19yX2xlbmd0aCBpcyBub3cgY29uc3QuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRDX0NPVU5UX1JFTE9DKTogRG9uJ3QgZW1pdCByZWxvYyBpZiBvbmx5Ci0Jb2Zmc2V0IGZpZWxkIGlzIHNldC4KLQotRnJpIEphbiAgOCAwNTo0NDo0OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEZvciAldWhpIGFuZCAldWxvLCBpZiBub3QKLQlFTlY2NCwgZW1pdCBubyByZWxvYy4KLQkobWRfcHNldWRvX3RhYmxlKTogRm9yICIueHdvcmQiLCBjYWxsIHNfeHdvcmQuCi0JKHNfeHdvcmQpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChhcmNoaXRlY3R1cmVfcmVxdWVzdGVkLCB3YXJuX29uX2J1bXAsCi0JbWRfcmVsYXhfdGFibGUpOiBVc2UgZGVmYXVsdCB6ZXJvIGluaXRpYWxpemF0aW9uLgotCShzX3Jlc2VydmUpOiBTaW5jZSBTRUdfRTIgaXMgZXF1aXZhbGVudCB0byBTRUdfQlNTLCBqdXN0IHVzZSB0aGUKLQlsYXR0ZXIsIGluc3RlYWQgb2Ygc2VsZWN0aW5nIHdpdGggcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscy4KLQotVGh1IEphbiAgNyAwODo1ODoyMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXNlIGFsbCBzcGFyY2xpdGUgdmFyaWFudHMKLQotVGh1IEphbiAgNyAwNToyNToyNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19kYXRhKSBbIUJGRF9BU1NFTUJMRVJdOiBGaXggdHlwbyBpbiA0IEphbiBjaGFuZ2UgLS0KLQlhY2NpZGVudGFsbHkgY2hhbmdlZCB0byB1c2Ugc3Vic2VnX2NoYW5nZSB3aGVyZSBpdCBzaG91bGQgaGF2ZQotCWJlZW4gc3Vic2VnX25ldy4KLQotVHVlIEphbiAgNSAwODo0MjoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IElmIGNoYXJhY3RlciBvdGhlciB0aGFuIGNvbW1hIG9yIG5ld2xpbmUgaXMgYQotCWxvZ2ljYWwgZW5kLW9mLWxpbmUgY2hhcmFjdGVyLCB1c2UgdGhlIG5ld2xpbmUgY2FzZS4KLQlGcm9tIEVyaWMgWW91bmdkYWxlOgotCShvcGVyYW5kKTogU2V0IFhfYWRkX251bWJlciBmaWVsZCBmb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQkob3BlcmFuZCk6IFRyZWF0IHplcm8gYnl0ZSBhcyBlbmQtb2Ytb3BlcmFuZC4KLQotCSogY29uZmlndXJlLmluIChwZXItdGFyZ2V0KTogTG9vayBmb3Igd2l0aF9iZmRfYXNzZW1ibGVyIG9wdGlvbi4KLQlGb3Igbm93LCBvbmx5IGFjY2VwdCAibm8iLCB1bnRpbCB0aGUgbWVyZ2UgaXMgZG9uZS4KLQotCU1lcmdlZCBjaGFuZ2VzIGZyb20gRXJpYyBZb3VuZ2RhbGUgKHlvdW5nZGFsZUB2NjU1MGMubnJsLm5hdnkubWlsKToKLQkqIGFzLmMsIGZsb251bS1rb25zdC5jLCBoZXgtdmFsdWUuYywgaW5wdXQtZmlsZS5jLCB2ZXJzaW9uLmMsCi0JICBjb25maWcvb2JqLWFvdXQuaCwgY29uZmlnL29iai12bXMuYzogVk1TIC0+IEhPX1ZNUy4KLQkqIHJlYWQuYzogRmluaXNoIGNvbnZlcnNpb24gdG8gU18qIG1hY3JvcyBpbiB0aGUgVk1TIG9ubHkKLQkgIHBhcnRzIG9mIHRoZSBwcm9ncmFtLiBBZGQgImNvbnN0IiBtb2RpZmllciB0byBoZXhfdmFsdWUuCi0JKiBhcy5jLCByZWFkLmMsIHN5bWJvbHMuYywgd3JpdGUuYzogQ2hhbmdlICJpZmRlZiBWTVMiIHRvCi0JICAiaWZkZWYgT0JKX1ZNUyIuCi0JKiBleHByLmM6IEFkZCAiY29uc3QiIG1vZGlmaWVyIHRvIGhleF92YWx1ZS4KLQkqIHN5bWJvbHMuYzogRmluaXNoIGNvbnZlcnNpb24gdG8gU18qIG1hY3JvcyBpbiB0aGUgVk1TIG9ubHkKLQkgIHBhcnRzIG9mIHRoZSBwcm9ncmFtLiAgQWRkICJjb25zdCIgbW9kaWZpZXIgdG8KLQkgIG1kX1tsb25nLHNob3J0XV9qdW1wX3NpemUuIFJlbW92ZSBkZWNsYXJhdGlvbiBvZiBjb25zdF9mbGFnCi0JICAod2hpY2ggd2lsbCBiZSBkZWNsYXJlZCBpbiBvYmotdm1zLmgpLgotCSogd3JpdGUuYzogQWRkICJjb25zdCIgbW9kaWZpZXIgdG8gbWRfW2xvbmcsc2hvcnRdX2p1bXBfc2l6ZS4KLQkgIEZpeCBhcmd1bWVudHMgdG8gVk1TX3dyaXRlX29iamVjdF9maWxlLgotCSogY29uZmlnLWdhcy5jb206IE5ldyBmaWxlLiAgU2NyaXB0IGZvciBWTVMgc3lzdGVtcyB0byBzZXQgdXAgdGhlCi0JICBjb25maWd1cmF0aW9uIHRvIGJ1aWxkIGdhcyBmb3IgVk1TLCBhbmQgY3JlYXRlIGNvbmZpZy5zdGF0dXMuCi0JKiBtYWtlLWdhcy5jb206IFJlZG9uZSB0byB3b3JrIHdpdGggbmV3IHNjaGVtZS4KLQkqIG9iai12bXMuYzogUGF0Y2ggdG8gZml4IGJ1ZyB3aGVyZSB3ZSB3ZXJlIG5vdCBjb3JyZWN0bHkgcGFyc2luZyB0aGUKLQkgIHN0YWJzIGRpcmVjdGl2ZXMuCi0JKiBvYmotdm1zLmM6ICBEZWZpbmUgbWFjcm9zIENPUFlfTE9ORyBhbmQgQ09QWV9TSE9SVCB3aGljaAotCSAgd2lsbCBzd2FwIGJ5dGVzIGlmIG5lZWRlZCBvbiBhIGJpZyBlbmRpYW4gc3lzdGVtLiAgVXNlIHRocm91Z2hvdXQKLQkgIGFzIG5lZWRlZC4KLQkqIG9iai12bXMuYyAob2JqX2FvdXRfc3RhYik6ICBBZGQgY29kZSB0byBnZW5lcmF0ZSBsaXN0aW5nIGZpbGUuCi0JKiBvYmotdm1zLmMgKFZNU190eXBlZGVmX3BhcnNlKTogQWRkIGFsaWFzIHRvIGNvcnJlY3RseSBoYW5kbGUgY2VydGFpbgotCSAgdHlwZXMgb2YgbWFsZm9ybWVkIHN0YWJzLiAgQ2hhbmdlIHBhcnNpbmcgYWxnb3JpdGhtIHNvIHRoYXQgd2UgYXJlCi0JICBtb3JlIGNlcnRhaW4gb2YgaGF2aW5nIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCB3ZSBuZWVkIG9uIGhhbmQuCi0JKiBvYmotdm1zLmMgKGZpbmFsX2ZvcndhcmRfcmVmZXJlbmNlKTogIE5ldyBmdW5jdGlvbiwgdXNlZCB0byBoZWxwCi0JICByZXNvbHZlIHRoZSBkYXRhIHR5cGVzIG9mIGFzIG1hbnkgc3RydWN0IGVsZW1lbnRzIGFzIHBvc3NpYmxlCi0JICB3aGVuIHNvbWUgcGFydCBvZiB0aGUgc3RydWN0IGlzIG5vdCBmdWxseSBkZWZpbmVkIGJ5IHRoZSBjb21waWxlci4KLQkqIG9iai12bXMuYyAoVk1TX0xTWU1fUGFyc2UpOiAgQ29ycmVjdGx5IGhhbmRsZSBjYXNlIG9mIGNvbnRpbnVhdGlvbgotCSAgc3RhYnMgZGlyZWN0aXZlcy4KLQkqIG9iai12bXMuYyAoVk1TX3dyaXRlX29iamVjdF9maWxlKTogRGVmaW5lIGFsbCB2dGFibGUgcHNlY3RzCi0JICBhcyBzeW1ib2xzIGFzIHdlbGwgaW4gdGhlIG9iamVjdCBmaWxlLiAgTG9vayBmb3IgZXh0ZXJuYWwgZnVuY3Rpb25zCi0JICB0aGF0IHN0YXJ0IHdpdGggIl9fdnQuIiwgYW5kIHR1cm4gdGhlbSBpbnRvIHZhcmlhYmxlcywgc2luY2UgdGhlCi0JICBnKysgY29tcGlsZXIgaXMgaW5jYXBhYmxlIG9mIGRvaW5nIHRoaXMuCi0JKiB0Yy12YXguYzogQWRkICcxJyBvcHRpb24gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBHQ0MKLQkgIHZlcnNpb25zLgotCSogYmlnbnVtLWNvcHkuYyAoYmlnbnVtX2NvcHkpOiBGaXggYnVnIHdoZXJlIHdlIHBhZCB3aXRoIHplcm9lcy4KLQkqIGlucHV0LXNjcnViLmMgKGFzX3doZXJlKTogRml4IGJ1ZyB3aGVyZSBhcyB3b3VsZCBjcmFzaCBpZiB3ZSBkaWQgbm90Ci0JICBoYXZlIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB5ZXQuCi0JKiBjb25maWcvaG8tdm1zLmg6IGRlZmluZSBIT19WTVMsIG5vdCBIT19WQVguCi0KLU1vbiBKYW4gIDQgMDU6MTc6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19kYXRhKTogQWx3YXlzIHVzZSAiZGF0YV9zZWN0aW9uIiwgc2luY2UgaXQnbGwgbWFwIHRvCi0JU0VHX0RBVEEgb3IgU0VHX0UxIGlmIG5lZWRlZC4KLQkoc19sY29tbSk6IExpa2V3aXNlIHdpdGggYnNzX3NlY3Rpb24uCi0JKHNfZmlsbCk6IFVzZSBtZW1zZXQsIG5vdCBiemVyby4KLQotVGh1IERlYyAzMSAwNDoyOToyNyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jOiBEZWxldGVkIHNvbWUgY29kZSB1bmRlciAiI2lmZGVmIERPTlRERUYiIHRoYXQgd2FzIGZvcgotCWhhbmRsaW5nIEdEQiBzeW1ib2wgdGFibGUgZGF0YS4KLQotCSogY29uZmlnL29iai1hb3V0LmggKHNlZ21lbnRfbmFtZSk6IERlbGV0ZSBkZWZpbml0aW9uLgotCShzZWdfbmFtZSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChzZWdtZW50X25hbWUsIHNlZ19uYW1lKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLXZtcy5oIChzZWdtZW50X25hbWUsIHNlZ19uYW1lKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoc2VnbWVudF9uYW1lKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoc2VnbWVudF9uYW1lKTogRGl0dG8uCi0KLQkqIENoYW5nZXMgZm9yIEJGRF9BU1NFTUJMRVI6Ci0JKiBvYmouaCAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IERlY2xhcmUgb25seSBpZiBub3QKLQlCRkRfQVNTRU1CTEVSLgotCShvYmpfaGVhZGVyX2FwcGVuZCwgb2JqX3ByZV93cml0ZV9ob29rKTogRGl0dG8uCi0JKiBhcy5oIChzdGRvdXRwdXQpOiBOZXcgdmFyLCBkZWZpbmVkIG9ubHkgaWYgQkZEX0FTU0VNQkxFUi4KLQkoc2VnVCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcgdHlwZWRlZiBmb3IgImFzZWN0aW9uICoiLgotCShzZWdtZW50X25hbWUpIElmIEJGRF9BU1NFTUJMRVIsIGxvb2sgdXAgQkZEIHNlY3Rpb24gbmFtZTsKLQlvdGhlcndpc2UsIHVzZSBzZWdfbmFtZSBhcnJheS4KLQkoc2VnX25hbWUpOiBEZWNsYXJlIG9ubHkgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKHNlY3Rpb25fYWxpZ25tZW50KTogRGVjbGFyZSBvbmx5IGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCShiaWdfc2VjdGlvbiwgcmVnX3NlY3Rpb24sIHBhc3MxX3NlY3Rpb24sIGRpZmZfc2VjdGlvbiwKLQlhYnNlbnRfc2VjdGlvbiwgdGV4dF9zZWN0aW9uLCBkYXRhX3NlY3Rpb24sIGJzc19zZWN0aW9uKTogSWYKLQlCRkRfQVNTRU1CTEVSLCBkZWNsYXJlIGFzIHZhcmlhYmxlczsgb3RoZXJ3aXNlLCBkZWNsYXJlIGFzIG1hY3JvcywKLQltYXBwaW5nIHRvIHNlZ1QgZW51bSB2YWx1ZXMuCi0JKHRjX2FvdXRfZml4X3RvX2NoYXJzLCBuZXh0X29iamVjdF9maWxlX2NoYXJQKTogRm9yY2UgcGFyc2UgZXJyb3JzCi0JaWYgdGhlc2UgYXJlIHVzZWQgb3IgZGVmaW5lZCwgaWYgQkZEX0FTU0VNQkxFUi4KLQkoc3Vic2VnX3NldCwgc3Vic2VnX25ldykgW0JGRF9BU1NFTUJMRVJdOiBGdW5jdGlvbmFsaXR5IG9mIG9sZAotCXN1YnNlZ19uZXcgc3BsaXQgaW50byB0d28gZnVuY3Rpb25zLgotCShTRUdfTk9STUFMKTogRm9yIEJGRF9BU1NFTUJMRVIsIGFsd2F5cyByZXR1cm4gdHJ1ZSwgZm9yIG5vdy4KLQotCSogYXMuaCAodm9sYXRpbGUpOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgotCShoYWRfZXJyb3JzLCBoYWRfd2FybmluZ3MpOiBQcm92aWRlIHByb3RvdHlwZXMgZm9yIEFOU0kgQyBldmVuIGlmCi0JTk9fU1REQVJHLgotCShhc19iYWQsIGFzX2ZhdGFsLCBhc190c2t0c2ssIGFzX3dhcm4pOiBGb3IgR05VIEMgdmVyc2lvbiAyLAotCWRlY2xhcmUgd2l0aCBmb3JtYXQgYXR0cmlidXRlIGZvciAtV2Zvcm1hdCBjaGVja2luZy4KLQotV2VkIERlYyAzMCAxMDoxODo1NyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFwcC5jLCBjb25maWcvdGMtKi5jOiBEb24ndCBpbmNsdWRlIHJlYWQuaCwgc2luY2UgaXQgaXMgYWxyZWFkeQotCWluY2x1ZGVkIGJ5IGFzLmguCi0KLQkqIFRoZXNlIGFyZSBiYXNlZCBvbiBwYXRjaGVzIGZyb20gTWluaCBUcmFuLWxlCi0JPG10cmFubGVAcGFyaXMuaW50ZWxsaWNvcnAuY29tPi4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni1pYm0tYWl4Kik6IEFjY2VwdCBpNDg2IGZvciBob3N0LiAgVXNlCi0Jb2JqX2Zvcm1hdCBjb2ZmYmZkIGFuZCBnYXNfdGFyZ2V0IGkzODZjb2ZmIGZvciB0YXJnZXQuCi0JKGlbMzRdODYtKi1pc2MqKTogTmV3IGhvc3QgKHVzZXMgc3lzdikuCi0JKiBjb25maWcvaTM4NmFpeC5tdDogUmVtb3ZlZCAobm8gbG9uZ2VyIHVzZWQpLgotCSogY29uZmlnL21oLWkzODZhaXggKFJBTkxJQik6IFVzZSB0cnVlIHJhdGhlciB0aGFuIC9iaW4vdHJ1ZS4KLQkoTUlOVVNfRyk6IFJlbW92ZWQuCi0JKExERkxBR1MpOiBBZGRlZCwgZGVmaW5lZCBhcyAtc2hsaWIuCi0JKiBjb25maWcvdGUtaTM4NmFpeC5oIChSRVZFUlNFX1NPUlRfUkVMT0NTKTogVW5kZWZpbmUuCi0JKiBjb25maWcvdGUtc2NvMzg2LmggKExPQ0FMX0xBQkVMKTogRG9uJ3QgZGVmaW5lLgotCShET1RfTEFCRUxfUFJFRklYKTogRGVmaW5lLgotCSogZXhwci5jIChvcGVyYW5kKTogSWYgRE9UX0xBQkVMX1BSRUZJWCwgdXNlIC5MMFwwMDEgYXMgYSBsYWJlbAotCW5hbWUgcmF0aGVyIHRoYW4gTDBcMDAxLgotCSogcmVhZC5jIChzX2xjb21tKTogTWFrZSBhIGZyYWcgaW4gU0VHX0JTUyByYXRoZXIgdGhhbiB1c2luZwotCWxvY2FsX2Jzc19jb3VudGVyLgotCSogc3ltYm9scy5jLCBzeW1ib2xzLmggKGxvY2FsX2Jzc19jb3VudGVyKTogUmVtb3ZlZC4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogYnNzIG5vIGxvbmdlciB1c2VzCi0JbG9jYWxfYnNzX2NvdW50ZXIuICBQYXNzIGNvcnJlY3QgZGF0YSBhbmQgYnNzIHNpemUgdG8KLQlWTVNfd3JpdGVfb2JqZWN0X2ZpbGUuCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfd3JpdGVfb2JqZWN0X2ZpbGUpOiBBY2NlcHQgYnNzIHNpemUgYXMKLQlhcmd1bWVudCwgcmF0aGVyIHRoYW4gdXNpbmcgbG9jYWxfYnNzX2NvdW50ZXIuCi0JKiBjb25maWcvdGMtbTg4ay5jIChzX2Jzcyk6IERvbid0IHVzZSBsb2NhbF9ic3NfY291bnRlci4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3Jlc2VydmUpOiBEb24ndCB1c2UgbG9jYWxfYnNzX2NvdW50ZXIuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoaGFkX2xpbmVubywgaGFkX3JlbG9jKTogUmVtb3ZlZC4KLQkoc2l6ZV9zZWN0aW9uKTogUmVzdG9yZWQgc2FuaXR5IGNoZWNrLgotCShkb19yZWxvY3NfZm9yKTogQmFzZSBzZWN0aW9uIGFkZHJlc3Mgb24gc19wYWRkciByYXRoZXIgdGhhbgotCWNvbXB1dGluZyBpdC4gIEFkanVzdCBhMjlrIFJfSUhJSEFMRiBzcGVjaWFsIGNhc2UgdG8gYWNjb3VudCBmb3IKLQlzZWN0aW9uIHBhZGRyICh1c2VkIHRvIHJlcXVpcmUgcGFkZHIgdG8gYmUgemVybykuICBJZiB0aGVyZSBhcmUgbm8KLQlyZWNsb3MsIHNldCBzX3JlbHB0ciB0byAwLiAgU2V0IHJlbG9jYXRpb24gc2l6ZSBpbiBvYmplY3RfaGVhZGVycy4KLQkoZmlsbF9zZWN0aW9uKTogQWx3YXlzIHNldCBzX3ZhZGRyIGhlcmUsIHJlbW92aW5nCi0JWkVST19CQVNFRF9TRUdNRU5UUyBjYXNlLiAgRm9yY2Ugc19zY25wdHIgZm9yIGJzcyB0byAwLiAgRG9uJ3Qgc2V0Ci0JTk9MT0FEIGZvciBpMzg2IC5ic3MsIGJlY2F1c2UgaXQgY29uZnVzZXMgdGhlIFNWUjMgbmF0aXZlIGxpbmtlci4KLQlTZXQgU1RZUF9JTkZPIGZvciAuY29tbWVudC4KLQkoY29mZl9oZWFkZXJfYXBwZW5kKTogVXNlIG9iamVjdCBoZWFkZXJzIGFuZCBIX3tTRVQsR0VUfV8qIG1hY3Jvcy4KLQlNYWtlIGFvdXRoZHIgd3JpdGluZyBkZXBlbmQgb24gT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIuCi0JKGNyYXdsX3N5bWJvbHMpOiBIYW5kbGUgOCBjaGFyYWN0ZXIgc2VjdGlvbiBuYW1lIGNvcnJlY3RseS4gIFVzZQotCUhfe1NFVCxHRVR9XyogbWFjcm9zLgotCShkb19saW5lbm9zX2Zvcik6IFNldCBsaW5lbm8gc2l6ZSBpbiBvYmplY3RfaGVhZGVycy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgSF97U0VULEdFVH1fKiBtYWNyb3MuICBEb24ndCBib3RoZXIgdG8KLQlzZXQgc192YWRkciBoZXJlLiAgSWYgc3RyaW5nX2J5dGVfY291bnQgcmVtYWlucyA0LCBzZXQgaXQgYmFjayB0bwotCTAsIGFuZCBvbmx5IHdyaXRlIHN0cmluZ3Mgb3V0IGlmIHRoZXJlIGFyZSBzb21lLiAgQ2FsbAotCWZpbGxfc2VjdGlvbiBiZWZvcmUgZG9fcmVsb2NzX2ZvciBhbmQgZG9fbGluZW5vc19mb3IuCi0JKG9ial9jb2ZmX3NlY3Rpb24pOiBIYW5kbGUgb3B0aW9uYWwgcXVvdGVkIHNlY29uZCBhcmd1bWVudCBnaXZpbmcKLQlzZWN0aW9uIGNoYXJhY3RlcmlzdGljcy4KLQkob2JqX2NvZmZfYnNzKTogQWRkZWQgdG8gaGFuZGxlIC5ic3MuCi0JKG9ial9jb2ZmX2lkZW50KTogQWRkZWQgdG8gaGFuZGxlIC5pZGVudCAocHV0cyBzdHJpbmcgaW4gLmNvbW1lbnQKLQlzZWN0aW9uKS4KLQkob2JqX2NvZmZfbGNvbW0pOiBQdXQgY29tbW9uIHN5bWJvbHMgaW4gLmJzcywgbm90IC5kYXRhLgotCShmaXh1cF9tZGVwcyk6IENoYW5nZSB0byBzZWdtZW50LiAgQ2FsbCBmcmFnX3dhbmUgYWZ0ZXIKLQltZF9jb252ZXJ0X2ZyYWcuCi0JKGZpeHVwX3NlZ21lbnQpOiBFeHBsaWNpdGx5IGNoZWNrIFNfSVNfQ09NTU9OIGJlZm9yZSBtYWtpbmcgMzg2Ci0JYWRqdXN0bWVudCAoYWxyZWFkeSBoYXBwZW5lZCBvbmx5IGZvciBjb21tb24gc3ltYm9scywgYnV0IHRoaXMgaXMKLQljbGVhcmVyKS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHNfYnNzKTogRG9uJ3QgdXNlIGlmIEkzODZDT0ZGLgotCShtZF9wc2V1ZG9fdGFibGUpOiBJZ25vcmUgLm9wdGltIGFuZCAubm9vcHQuCi0JKHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaTM4Ni5oIChSRVZFUlNFX1NPUlRfUkVMT0NTKTogVW5kZWYsIGZvciBTVlIzCi0JY29tcGF0aWJpbGl0eS4KLQkoTE9DQUxfTEFCRUwpOiBSZW1vdmVkIGRlZmluaXRpb24uCi0JKERPVF9MQUJFTF9QUkVGSVgpOiBEZWZpbmVkLgotCi1Nb24gRGVjIDI4IDEwOjMyOjA1IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhcHAuYyAoYXBwX3B1c2gpOiBVc2UgbWVtY3B5LCBub3QgYmNvcHkuCi0JKGRvX3NjcnViX25leHRfY2hhcik6IEZvciBcIiwgcmV0dXJuICIgbm90ICcuCi0JKHN5bWJvbF9jaGFycyk6IE5vdyBjb25zdC4KLQotCSogZXhwci5jIChvcGVyYW5kKTogSWYgbm90IExPQ0FMX0xBQkVMU19GQiwgZG9uJ3QgbG9vayBmb3IgIjBmIgotCWFuZCAiMGIiLiAgSWYgTE9DQUxfTEFCRUxTX0RPTExBUiwgY2hlY2sgZm9yICIwJCIuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBEb24ndCB1c2UgI2VsaWYuCi0KLQkqIGNvbmZpZy9oby1zdW5vcy5oOiBEb24ndCBpbmNsdWRlIHN5cy9zdGR0eXBlcy5oOyA0LjAuMyBkb2Vzbid0Ci0JaGF2ZSBpdC4gIChSZXBvcnRlZCBieSBOb2FoIEZyaWVkbWFuLCBmcmllZG1hbkBnbnUuYWkubWl0LmVkdS4pCi0KLVdlZCBEZWMgMTYgMTI6MTI6MzMgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jLCBvYmotaWVlZS5jOiBkb24ndCBkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04gaWYgaXQgaXMKLQlhbHJlYWR5IGRlZmluZWQuCi0KLVR1ZSBEZWMgMTUgMTI6NDA6MTEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IGFsbG93IHNpbmdsZSBxdW90ZSBzdHJpbmdzIGlmIHNvCi0JY29uZmlndXJlZC4KLQotCSogY29uZmlnLyp6OGsqOiBjaGVja3BvaW50Ci0KLVN1biBEZWMgMTMgMDA6MDQ6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IGF2b2lkIGNhbGxpbmcgeG1hbGxvYyAoMCkuCi0KLVNhdCBEZWMgMTIgMTU6MjY6MzQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmM6IENhbGwgeG1hbGxvYywgbm90IG1hbGxvYzsgZG9uJ3QgZGVjbGFyZSBtYWxsb2MuCi0KLQkqIENoYW5nZXMgdG8gc3VwcG9ydCBTQ08gMy4ydjQ6Ci0JKiByZWFkLmMgKHNfYWxpZ25fYnl0ZXMsIHNfYWxpZ25fcHR3byk6IElmIG5vdCBTRUdfREFUQSBvcgotCVNFR19CU1MsIGZpbGwgd2l0aCBOT1BfT1BDT0RFLgotCSogY29uZmlnL2kzODZjb2ZmLm10OiBBZGQgb3Bjb2RlL2kzODYuaCB0byBUQVJHX0NQVV9ERVBFTkRFTlRTLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IpOiBJbmNyZW1lbnQgYWRkciBldmVuIGlmIG5vdAotCXVzaW5nIFpFUk9fQkFTRURfU0VHTUVOVFMuCi0JKGZpbGxfc2VjdGlvbik6IElmIFpFUk9fQkFTRURfU0VHTUVOVFMsIHNldCBzZWdtZW50IGFkZHJlc3NlcywgYnV0Ci0JbmV2ZXIgc2V0IHNlZ21lbnQgYWRkcmVzcyBmb3IgU0VHX0UyICguYnNzKSBhbmQgZG9uJ3Qgd3JpdGUgb3V0Ci0JU0VHX0UyIGNvbnRlbnRzLiAgU2V0IC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB0byBTVFlQX1RFWFQuCi0JKG9ial9jb2ZmX2VuZGVmKTogRG9uJ3QgbWVyZ2UgbGFiZWxzIG9yIHN5bWJvbHMgYXdhaXRpbmcgZm9yd2FyZAotCWRlZmluaXRpb25zLCBhbmQgZG9uJ3QgbWVyZ2UgdGFncyB3aXRoIG5vbi10YWdzLiAgQ2hlY2sgZm9yIC5iZgotCXJhdGhlciB0aGFuIGp1c3QgY2hlY2tpbmcgd2hldGhlciB0aGUgc2Vjb25kIGNoYXJhY3RlciBpcyBiIGFuZAotCXRoZSB0aGlyZCBjaGFyYWN0ZXIgaXMgZi4KLQkob2JqX2NvZmZfdmFsKTogZ2NjIGNhbiBnZW5lcmF0ZSB2YWx1ZXMgd2hpY2ggd2UgZG9uJ3QgaGFuZGxlCi0JY29ycmVjdGx5OyBkaXNjYXJkIGluZm9ybWF0aW9uIGZvciBub3csIHNpbmNlIGl0IG9ubHkgYWZmZWN0cyB0aGUKLQlkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0JKHRhZ19maW5kX29yX25hbWUpOiBEb24ndCBpbnNlcnQgdGFncyBpbiB0aGUgc3ltYm9sIHRhYmxlLgotCSh5YW5rX3N5bWJvbHMpOiBEb24ndCBtZXJnZSBsYWJlbHMuCi0JKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOIGlmIGl0IGlzCi0JYWxyZWFkeSBkZWZpbmVkLiAgRmlsbCBzdWJzZWdtZW50cyB3aXRoIE5PUF9PUENPREUsIG5vdCAwLiAgRG9uJ3QKLQlzZXQgc2VnbWVudCBhZGRyZXNzIGlmIFpFUk9fQkFTRURfU0VHTUVOVFMuCi0JKG9ial9jb2ZmX3NlY3Rpb24pOiBBY2NlcHQgYW5kIGlnbm9yZSBhIHRyYWlsaW5nIHF1b3RlZCBzdHJpbmcsIGFzCi0JdXNlZCBpbiBBVCZUIGkzODYgc3ludGF4LgotCShmaXh1cF9zZWdtZW50KTogVGFrZSBzZWdtZW50IGFzIGFyZ3VtZW50LiAgT24gdGhlIGkzODYsIGFkanVzdCBQQwotCXJlbGF0aXZlIGFkZGVuZHMgYnkgdGhlIHNlZ21lbnQgdmFkZHIuCi0JKiB0Yy1pMzg2Lmg6IERlZmluZSBTVUJfU0VHTUVOVF9BTElHTi4KLQkqIHRjLWEyOWsuaDogRGVmaW5lIFpFUk9fQkFTRURfU0VHTUVOVFMuCi0JKiB0Yy1pMzg2LmM6IChpMzg2X29wZXJhbmQpOiBJZiBJMzg2Q09GRiwgYWNjZXB0IGFueSBzZWdtZW50IHR5cGUuCi0KLVR1ZSBEZWMgIDggMDA6MDY6NDggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYzogSW5jbHVkZSBsaWJjb2ZmLmguCi0KLQkqIHZlcnNpb24uYzogTm93IHZlcnNpb24gMS45My4KLQotTW9uIERlYyAgNyAwMDozOTowOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKTogRm9yIDM4NmJzZCBhbmQgbGludXgsIGRvCi0JcG93ZXItb2YtdHdvIGFsaWdubWVudCBmb3IgLmFsaWduLgotCi0JKiBhcy5oOiBJZiBCUk9LRU5fQVNTRVJULCBqdXN0IHJlZGVmaW5lIGBhc3NlcnQnIHRvIGJlIHRyaXZpYWwsCi0JYW5kIGxlYXZlIGV2ZXJ5dGhpbmcgZWxzZSBhbG9uZS4KLQotRnJpIERlYyAgNCAxNjo1ODo0MiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhcy5uZXcpOiBEb24ndCBib3RoZXIgc2F2aW5nIGFzLm9sZC4KLQotCSogd3JpdGUuYzogQ29uZGl0aW9uYWxpemUgb24gT0JKX1ZNUywgbm90IFZNUy4KLQkobWFnaWNfbnVtYmVyX2Zvcl9vYmplY3RfZmlsZSk6IERvbid0IGRlZmluZSBpZiBPQkpfVk1TLgotCi0JKiBjb25maWcvb2JqLXZtcy5jOiBDaGFuZ2VzIGZvciB0cmFkaXRpb25hbCBDLgotCi1UaHUgRGVjICAzIDAxOjI0OjA3IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tZ2VuZXJpYy5oIChtYWxsb2MsIHJlYWxsb2MpOiBEZWNsYXJlLgotCi0JKiBMb3RzIG9mIGNvbW1lbnQvd2hpdGVzcGFjZSBjaGFuZ2VzLgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogU29tZSBmaWVsZHMgcmVvcmRlcmVkLCBuYXJyb3dlZC4KLQotCSogcmVhZC5jIChNQVNLX0NIQVIpOiBEZWZpbmUgdXNpbmcgQyB0eXBlcywgbm90IG1hZ2ljIG51bWJlci4KLQotCSogYXMuYywgaW5wdXQtZmlsZS5jOiBEZWxldGVkIHNvbWUgdW51c2VkIGNvZGUuCi0KLQkqIGFwcC5jLCBhcy5oOiBEb2MgZml4LgotCi0JKiBmbG9udW0ta29uc3QuYywgZmxvbnVtLW11bHQuYzogSW5jbHVkZSBhbnNpZGVjbC5oLgotCi0JKiBhcy5oICh4bWFsbG9jKTogQXJndW1lbnQgaXMgbG9uZy4KLQotCSogeG1hbGxvYy5jIChlcnJvcik6IFJlbW92ZSBkZWNsYXJhdGlvbjsgYXMuaCB0YWtlcyBjYXJlIG9mIGl0LgotCi0JKiBkb2MvYXMudGV4aW5mbzogUmVncm91cGVkIGRvY3VtZW50YXRpb24gb2Ygc29tZSBjb21tYW5kLWxpbmUKLQlvcHRpb25zLiAgVXBkYXRlZCBvcHRpb25zIGRvY3VtZW50YXRpb24gZm9yIG02OGsuICBTb21lIG1pbm9yCi0Jd29yZGluZy9wdW5jdHVhdGlvbiBjaGFuZ2VzLgotCi1Nb24gTm92IDMwIDExOjQyOjExIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBY2NlcHQgdGFyZ2V0IE9TICJ2bXMiLgotCi0JKiBzeW1ib2xzLmM6ICBNZXJnZWQgQU5TSSBhbmQgbm9uLUFOU0kgZnVuY3Rpb24gZGVjbHMsIHVzaW5nCi0JUEFSQU1TIG1hY3JvLgotCi0JKiB4bWFsbG9jLmM6IEp1c3QgaW5jbHVkZSBhcy5oLCBkb24ndCBib3RoZXIgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQKLQlvdGhlciBoZWFkZXIgZmlsZXMuCi0KLQkqIHN0cnN0ci5jLCBzdHJlcnJvci5jOiBEZWxldGVkLgotCSogTWFrZWZpbGUuaW46IERlbGV0ZWQgcmVmZXJlbmNlcy4KLQotCSogY29uZmlnL3RjLW5zMzJrLmM6IERvbid0IGluY2x1ZGUgaGVhZGVyIGZpbGUgZm9yIHN0cmluZwotCWRlY2xhcmF0aW9uczsgbGVhdmUgdGhhdCB0byBoby0qLmguCi0KLUZyaSBOb3YgMjcgMDQ6MTE6MzYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuIGF0IGNhbWJyaWRnZS1sYXB0b3AuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2NvZmZfZ251LmggW1RDX0k4NjBdOiBHdWVzc2VzIGZvciByZWxvYyB0eXBlIHZhbHVlcywKLQlpbXBvcnRlZCBmcm9tIEZTRiBzb3VyY2VzLgotCi0JKiBtZXNzYWdlcy5jIChzdHJlcnJvcik6IERlY2xhcmUgdW5jb25kaXRpb25hbGx5LgotCi0JKiBhcy5oOiBEZWxldGUgYWxsb2NhIGFuZCByZWdpc3RlciBkZWZpbml0aW9ucy4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChtYXNrKTogTm93IGNvbnN0LgotCi0JKiBvYnN0YWNrLmMsIG9ic3RhY2suaDogRGVsZXRlZC4KLQotCSogYXMuaCAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpOiBOZXcgZmxhZy4KLQkqIGFzLmMgKG1haW4pOiBTZXQgaXQgZm9yIC1SLgotCi0JKiBhcy5oIChmbGFnX3N1cHByZXNzX3dhcm5pbmdzKTogTmV3IGZsYWcuCi0JKiBhcy5jIChtYWluKTogU2V0IGl0IGZvciAtVy4KLQkqIG1lc3NhZ2VzLmMgKGFzX3dhcm4pOiBDaGVjayBpdCBpbnN0ZWFkIG9mIGZsYWdzZWVuWydXJ10uCi0KLQkqIGFzLmggKGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dCk6IE5ldyBmbGFnLgotCSogYXMuYyAobWFpbik6IFNldCBpdCBmb3IgLVouCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oOiBEZWZpbmUgTkVFRF9GWF9SX1RZUEUuCi0JKiBjb25maWcvdGMtYTI5ay5oOiBEaXR0by4KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBEb24ndCBjb25kaXRpb25hbGl6ZSBmeF9yX3R5cGUgZmllbGQgb24gVEMKLQltYWNyb3MuCi0KLQkqIGFzLmg6IE1lcmdlZCBBTlNJIGFuZCBub24tQU5TSSBmdW5jdGlvbiBkZWNscywgdXNpbmcgUEFSQU1TCi0JbWFjcm8uCi0JKiBiaWdudW0uaCwgZXhwci5oLCBmbG9udW0uaCwgZnJhZ3MuaCwgaW5wdXQtZmlsZS5oLCBsaXN0aW5nLmgsCi0Jb2JqLmgsIG91dHB1dC1maWxlLmgsIHJlYWQuaCwgc3RydWMtc3ltYm9sLmgsIHN5bWJvbHMuaCwgdGMuaCwKLQl3cml0ZS5oOiBMaWtld2lzZS4KLQkqIHJlYWQuYzogTGlrZXdpc2UuCi0KLQkqIHhtYWxsb2MuYzogQ29uZGl0aW9uYWxpemUgb24gSEFWRV9NQUxMT0NfSCwgbm90IFVTRy4gIEZvbGQgaW4KLQl4cmVhbGxvYyBmcm9tIHhyZWFsbG9jLmMuCi0JKiB4cmVhbGxvYy5jOiBEZWxldGVkLgotCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUywgT0JKUyk6IEFkanVzdGVkLgotCi0JKiBjb25maWd1cmUuaW46IEZvciBob3N0IENQVSBhMjlrLCByczYwMDAsIHZheCwgY29uc2lkZXIgdXNpbmcgYnNkCi0Jb3Igdm1zIGhvLSBmaWxlcy4KLQotCSogY29uZmlnL2hvLXN5c3YuaCAoc2V0YnVmZmVyLCBIT19VU0cpOiBEZWxldGVkLgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGF0b2ZfaWVlZSk6IEV4cG9uZW50IGZpZWxkIGlzbid0IGEgcG9pbnRlcjsKLQlkb24ndCBpbml0aWFsaXplIGl0IHdpdGggTlVMTC4KLQotCSogY29uZmlnL2hvLXZheC5oIChNX1ZBWCk6IERlbGV0ZWQ7IHdhcyB1bnVzZWQuCi0KLQkqIFJFQURNRS12bXMsIGNvbmZpZy9oby12bXMuaCwgY29uZmlnL29iai12bXMuYywgY29uZmlnL29iai12bXMuaDoKLQlOZXcgZmlsZXMgaW1wb3J0ZWQgZnJvbSBGU0YgdmVyc2lvbiwgY29udHJpYnV0ZWQgYnkgRXJpYyBZb3VuZ2RhbGUuCi0JKiBSRUFETUUtdm1zLWRiZywgY29uZmlnL3ZtczogRGVsZXRlZC4KLQotCSogQ2hhbmdlTG9nLCBjb25maWcvQ2hhbmdlTG9nOiBNZXJnZWQuCi0KLQkqIGNvbmZpZy8qdGFob2UqLCBjb25maWd1cmUuaW46IFRhaG9lIHN1cHBvcnQgYnJvdWdodCBpbiBmcm9tIEZTRgotCXZlcnNpb24uCi0KLQkqIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9vcGVuKTogRWxpbWluYXRlIGNhbGwgdG8gc2V0dmJ1Zi4KLQlbVVNHXSAoc2V0YnVmZmVyKTogRGVsZXRlZCBtYWNyby4KLQotTW9uIE5vdiAyMyAxMTowMDoxNiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYWxsIGZpbGVzOiBXaGl0ZXNwYWNlIGNoYW5nZXMgZm9yIEdOVSBpbmRlbnRhdGlvbiBzdHlsZSwgZG9uZSBieQotCUdOVSBgaW5kZW50Jy4gIFNvbWUgY2xlYW51cCBzdGlsbCBuZWVkZWQsIGVzcGVjaWFsbHkgb2YgY29tbWVudHMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogTm8gdGUtMzg2YnNkLmggZmlsZSBleGlzdHM7IGRvbid0IHRyeSB0byB1c2UgaXQuCi0KLQkqIG9iai1jb2ZmLmMgKG9ial9jb2ZmX2VuZGVmKTogVXNlIGFzX3dhcm4sIG5vdCBmcHJpbnRmLgotCi0JKiB0Yy1tNjhrLmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgY29tcGxhaW4gYWJvdXQgNjgwMDAgd2l0aCA2ODg4MTsKLQljb3VsZCBiZSBkb2luZyBlbXVsYXRpb24uCi0KLVRodSBOb3YgMTkgMTE6NDc6MTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQl6ODAwMCBkb2N1bWVudGF0aW9uCi0JKiBkb2MvTWFrZWZpbGUuaW4sIGRvYy9hbGwubTQsIGRvYy9hcy1hbGwudGV4aW5mbywgZG9jL2FzLnRleGluZm86Ci0JYWxsIG1vZGlmaWVkLgotCi1UdWUgTm92IDEwIDA5OjQ5OjI0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFzLm8sIG9iai1mb3JtYXQubyk6IGFkZGVkIGRlcGVuZGVuY3kgb24gc3Vic2Vncy5oLgotCi0JKiBzdWJzZWdzLmg6IGFkZCBleHRlcm4gdG8gc2VnbWVudF9pbmZvIGRlY2xhcmF0aW9uLgotCi0JKiByZWFkLmg6IGFkZGVkIGV4dGVybiBkZWNsYXJhdGlvbnMgZm9yIGNvbW1lbnRfY2hhcnMsCi0JbGluZV9jb21tZW50X2NoYXJzLCBhbmQgbGluZV9zZXBhcmF0b3JfY2hhcnMuCi0JcmVhZC5jLCBhcHAuYzogcmVtb3ZlZCBkZWZpbml0aW9ucyBvZiBjb21tZW50X2NoYXJzLAotCWxpbmVfY29tbWVudF9jaGFycywgYW5kIGxpbmVfc2VwYXJhdG9yX2NoYXJzLgotCi0JKiB0Yy1tNjhrLmMgKG02OGtfcmVnX3BhcnNlKTogSWYgUkVHSVNURVJfUFJFRklYIGlzbid0IGRlZmluZWQsCi0Jc3RpbGwgYWNjZXB0IChidXQgZG9uJ3QgcmVxdWlyZSkgT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYIGJlZm9yZQotCXRoZSByZWdpc3RlciBuYW1lLgotCShpbnNlcnRfcmVnKTogcHV0IFJFR0lTVEVSX1BSRUZJWCBiZWZvcmUgcmVnaXN0ZXIgbmFtZXMgYmVmb3JlCi0JcHV0dGluZyB0aGVtIGluIHRoZSBzeW1ib2wgdGFibGUuCi0JKiB0Yy1tNjhrLmggKE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCk6IERlZmluZSB0byBiZSAiJSIsIGlmIG5vdAotCU02OEtDT0ZGLgotCi0JKiBvYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBzZXQgU1RZUF9OT0xPQUQgYml0IGZvciAuYnNzCi0Jc2VjdGlvbi4KLQotCSogYXRvZi1pZWVlLmMsIGF0b2YtbnMzMmsuYywgdGMtKi5jOiBtYWRlIEVYUF9DSEFSUywgRkxUX0NIQVJTLAotCWNvbW1lbnRfY2hhcnMsIGxpbmVfY29tbWVudF9jaGFycyBhbmQgbGluZV9zZXBlcmF0b3JfY2hhcnMKLQljb25zaXN0ZW50bHkgY29uc3QsIGFuZCBhbHdheXMgaW5pdGlhbGl6ZWQgdGhlbS4gIEluY2x1ZGVkIHJlYWQuaC4KLQotVGh1IE5vdiAgNSAxNzo1NTo0MSAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHRjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWRkIGNvZGUgdG8gZmxhZyBlcnJvciBpZiBhbiBhYnNvbHV0ZQotCWNvbnN0YW50IHdpbGwgbm90IGZpdCBpbiBhbiBpbW1lZGlhdGUgZmllbGQuCi0JKG1kX2FwcGx5X2ZpeCwgUkVMT0NfQkFTRTEzIGNhc2UpOiBDaGVjayBmb3IgcmVsb2NhdGlvbiBvdmVyZmxvdy4KLQotV2VkIE5vdiAgNCAwNzo1MDo0NiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmYuYyAoY2FsbGpfdGFibGUpOiBEZWxldGUgZ2xvYmFsIHZhcmlhYmxlLgotCShvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IERlZmluZSBpdCBsb2NhbGx5IGhlcmUsIGFuZCBvbmx5IGlmCi0JVENfSTk2MCBpcyBkZWZpbmVkLgotCi0JKiB0Yy1tNjhrLmMgKG02OGtfcmVnX3BhcnNlKTogVW5kZXJzY29yZSBpcyBwYXJ0IG9mIGEgc3ltYm9sIG5hbWUuCi0JKG02OGtfaXApOiBEb24ndCB3YXJuIGFib3V0IGJpZ251bSB1c2VkIGFzIGZsb2F0IGJpdC1wYXR0ZXJuLgotCi0JKiBvYmotY29mZi5jOiBSZXBsYWNlZCBBTlNJIGFuZCBub24tQU5TSSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKLQl3aXRoIGEgc2luZ2xlIHNldCB1c2luZyBQQVJBTVMgbWFjcm8uCi0KLQkqIHRjLWk5NjAuYyAodGNfYm91dF9maXhfdG9fY2hhcnMpOiBCaXQtZmllbGQgZml4dXBzIHdhbnQgYSBsZW5ndGgKLQlvZiAyLgotCi0JKiB0Yy1pOTYwLmM6IE1pc3NlZCBhIGNvdXBsZSBvZiAwLT5OT19SRUxPQyBjb252ZXJzaW9ucy4KLQotCSogdGMtaTk2MC5oIChOX0JBTE5BTUUsIE5fQ0FMTE5BTUUpOiBEZWZpbmUgYXMgY2hhci10eXBlIHZhbHVlcywKLQlzbyB3aWRlbmluZyB3b3JrcyBjb25zaXN0ZW50bHkuCi0KLVdlZCBPY3QgMjggMDg6NTI6MzQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHZlcnNpb24uYzogUHV0IGNvbmRpdGlvbmFsICJjb25zdCIgYmVmb3JlIHZlcnNpb25fc3RyaW5nLCBub3QKLQliZWZvcmUgZHVtbXkgZnVuY3Rpb24gZm9yIFZNUy4gIE5vdyB2ZXJzaW9uIDEuOTEuMDMuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBOZWVkIGRvdWJsZS1cIGJlZm9yZSBgMDAwJyB0byBzaG93Ci0JcHJpbnRlZCByZXAgb2YgbnVsbCBjaGFyYWN0ZXIuCi0KLUZyaSBPY3QgMjMgMTQ6NDA6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBvYmotY29mZmJmZC5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGNoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9jbG9zZV9hbGxfZG9uZS4KLQotVHVlIE9jdCAyMCAxMjoxODowOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIFN1cHBvcnQgZm9yIGkzODYtc3lzdi4KLQlvYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yLCB3cml0ZV9vYmplY3RfZmlsZSk6IHNldCBzZWdtZW50Ci0JYWRkcmVzc2VzIHRvIHJlYXNvbmFibGUgc2l6ZXMuICBOZXcgZGVmaW5lIFpFUk9fQkFTRURfU0VHTUVOVFMgY2FuCi0JYmUgdXNlZCB0byBzZXQgdGhlbSBhbGwgdG8gemVybyBhcyB3YXMgZG9uZSBiZWZvcmUuCi0JKGZpbGxfc2VjdGlvbik6IHNlZ21lbnQgYWRkcmVzc2VzIG5vdyBzZXQgaW4gd3JpdGVfb2JqZWN0X2ZpbGUuCi0JKGZpbGxfc2VjdGlvbik6IERvbid0IHNldCBTVFlQX05PTE9BRCBmb3IgLmJzcyBzZWN0aW9uLgotCShmaXh1cF9zZWdtZW50KTogMzg2IHVzZXMgc3RyYW5nZSBjb21tb24gc3ltYm9sIGZvcm1hdC4KLQl0Yy1pMzg2LmMgKHRjX2NvZmZfZml4MnJ0eXBlKTogdXNlIFJfRElSMzIsIG5vdCBSX1JFTExPTkcsIGZvcgotCWNvbXBhdGliaWxpdHkgd2l0aCBTVlIzLjIgbGlua2VyLgotCSogY29uZmlndXJlLmluOiBpMzg2LXN5c3YgYW5kIGkzODYtc2NvIHVzZSBjb2ZmYmZkLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogZGlzY2FyZCB3aGl0ZXNwYWNlIGFmdGVyIGEgbGFiZWwuCi0KLVNhdCBPY3QgMTAgMTI6MzM6NDUgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBTdW5PUyA0IGFuZCBTb2xhcmlzMiBmb3IgU3VuNAotCWhvc3RzLCB1c2UgdGhlIHN5c3YgY29uZmlndXJhdGlvbiBmb3Igc29sYXJpczIKLQotTW9uIE9jdCAgNSAwOToyODo1NyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSBmaXggaTk2MCtub24tYmZkIGNvZmYgYml0IHJvdC4KLQkqIG9iai1jb2ZmLmMgKGNfZG90X2ZpbGVfc3ltYm9sLCBvYmpfY29mZl9sbiwgb2JqX2NvZmZfbGluZSk6Ci0Jc3VwcG9ydCBmb3IgQyBzb3VyY2UgbGlzdGluZ3MuIChvYmpfY29mZl9lbmRlZik6IGxvb2sgaW4gdGhlIHJpZ2h0Ci0JcGFydCBvZiB0aGUgc3ltYm9sIGZvciB0aGUgc3ltYm9sIG5hbWUKLQotCSogdGMtbTY4ay5jIChnZXRfbnVtKTogbWFrZSBpdCB3b3JrIGZvciBhbGwgc2VnbWVudHMsIG5vdCBqdXN0IHRoZQotCWZpcnN0IHRocmVlLgotCi1Nb24gT2N0ICA1IDAzOjMwOjM2IDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgaTM4Ni0qLWJzZCBlbXVsYXRpb24uCi0KLVRodSBPY3QgIDEgMjM6MDU6MTIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSB0aGUgY3B1LXZlbmRvci1vcyB0cmlwbGUgZm9yIGhvc3QgYW5kIHRhcmdldAotCi1UdWUgU2VwIDI5IDEyOjIyOjUyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmotY29mZmJmZC5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGRvbid0IGZpeHVwIGZvciB0aGUgejhrCi0JKiB0Yy16OGsuYzogbG90cyBvZiBidWcgZml4ZXMKLQotVHVlIFNlcCAyOSAxMDo1MTo1NSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHRjLWk5NjAuaCwgdGMtaTk2MC5jOiBhdm9pZCB0aGUgQU5TSSBwcmVwcm9jZXNzb3IgYWRkaXRpb24KLQkjZWxpZiwgc2luY2UgaXQgaXMgbm90IHN1cHBvcnRlZCBieSBvbGQgY29tcGlsZXJzLgotCWhvLXJzNjAwMC5oLCB0Yy1tNjhrLmM6IHRoZSBuYXRpdmUgUlMvNjAwMCBjb21waWxlciBtaXNjb21waWxlcyBhCi0JY291cGxlIG9mIGV4cHJlc3Npb25zIGluIHRjLW02OGsuYy4KLQotTW9uIFNlcCAyOCAyMToxODoyNCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoY29ucyk6IElmIE5PX1JFTE9DIGlzIGRlZmluZWQsIHVzZSBpdC4KLQotCSogdGMtaTk2MC5jIChnZXRfY2Rpc3ApOiBVc2UgTk9fUkVMT0MsIG5vdCAwLCBpbiBjYWxsIHRvIGZpeF9uZXcuCi0KLUZyaSBTZXAgMjUgMTg6MTg6NTIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0Yy1tNjhrLmg6IGlmIE02OEtDT0ZGLCBkZWZpbmUgRE9UX0xBQkVMX1BSRUZJWCAodG8gcmVxdWlyZQotCWxvY2FsIGxhYmVscyB0byBzdGFydCB3aXRoIGEgLikgYW5kIHNldCBSRUdJU1RFUl9QUkVGSVggdG8gJS4KLQl0Yy1tNjhrLmMgKG02OGtfcmVnX3BhcnNlKTogYWNjZXB0IFJFR0lTVEVSX1BSRUZJWCBpZiBkZWZpbmVkLgotCi1GcmkgU2VwIDI1IDE3OjUzOjQzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jOiAgQ29tbWVudCBjaGFuZ2VzLgotCi1GcmkgU2VwIDI1IDE0OjEyOjU4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBreXJpYXRoLmN5Z251cy5jb20pCi0KLQkqIGFzLmg6IFRlc3QgaWYgX19TVERDX18gaXMgZGVmaW5lZCBvbmx5LCBkb24ndCB0ZXN0IGl0cyB2YWx1ZS4KLQkqIG1lc3NhZ2VzLmM6IElmIF9fU1REQ19fIGlzIG5vdCBkZWZpbmVkLCBkZWZpbmUgTk9fU1REQVJHLgotCi1UaHUgU2VwIDI0IDEyOjQyOjMyIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmMgKGRlYnVnZ2luZ19wc2V1ZG8pOiBBZGQgc3RhYnMgYW5kIHN0YWJuIGFzIHRoaW5ncyB0bwotCWlnbm9yZS4KLQotVHVlIFNlcCAyMiAxMzowMjowNyAxOTkyICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2ZvcixmaWxsX3NlY3Rpb24pOiBub3cgYWxsb2NhdGUgYWxsCi0Jc2VjdGlvbnMgc3RhcnRpbmcgZnJvbSB6ZXJvLCByYXRoZXIgdGhhbiBtYWtpbmcgdGhlbSBjb25zZWN1dGl2ZS4KLQlUaGlzIG1ha2VzIHN1YnNlcXVlbnQgcmVsb2MgY2FsY3VsYXRpb25zIGVhc2llciwgZXNwIGlmIHRoZSBvYmplY3QKLQlmb3JtYXQgZG9lc24ndCB1bmRlcnN0YW5kIGFkZGVuZHMuIChvYmpfY29mZl9sY29tbSk6IChtYXliZSB0ZW1wb3JhcmlseSkKLQlhbGxvY2F0ZSBsY29tbSBpbiAuZGF0YSByYXRoZXIgdGhhbiBpbiAuYnNzLiAgSXQgc2VlbXMgdGhhdCBzb21lCi0JdG9vbHMgY2FuJ3QgY29wZSB3aXRoIGEgbm9uLXplcm8gc2l6ZWQgYnNzIGJlZm9yZSBsaW5rYWdlLgotCi1UdWUgU2VwIDIyIDE1OjEwOjUxIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5jOiBSZXBsYWNlICJlbnVtIG02OGtfYXJjaGl0ZWN0dXJlIiB3aXRoICJpbnQiCi0JdGhyb3VnaG91dC4gIFRoYXQgZW51bSBubyBsb25nZXIgbWVhbnMgd2hhdCB3ZSB0aG91Z2h0IGl0IG1lYW50LgotCi0JKiB0Yy1tNjhrLmMgKG1kX2Fzc2VtYmxlLCBtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbmV3Ci0JIi1tbm8tNjg4WzU4XTEiIG9wdGlvbnMuCi0KLQkqIHRjLW02OGsuYzogQWRkZWQgQ1BVMzIgc3VwcG9ydC4KLQotRnJpIFNlcCAxOCAwODowMjoxOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5jIChtNjhrX2lwKTogQW4oZGlzcCkgaXMgbm90IHBjIHJlbGF0aXZlLgotCi1UdWUgU2VwIDE1IDE3OjI1OjA1IDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFzLm5ldyk6IFJlbW92ZSBkZXBlbmRlbmNlIG9uIExPQ0FMX0xPQURMSUJFUy4KLQlDaGFuZ2UgTElCREVQUyBkZXBlbmRlbmNlIHRvIExJQlMuCi0KLVR1ZSBTZXAgMTUgMTU6MzI6MDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGlmICQodG9vbGRpcikgZXhpc3RzLCBpbnN0YWxsIGFzIGluCi0JJCh0b29sZGlyKS9iaW4uCi0KLVN1biBTZXAgMTMgMjA6MzA6MTAgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBBZGRlZCBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JEIGRlZmluZSB0byBnaXZlIGFuIGVycm9yIGlmIGFueQotCS53b3JkIGlzIDwgLTMyNzY4IG9yID4gMzI3NjcuICBUaGUgLUogZmxhZyBjYXVzZXMgdGhlIGVycm9yIHRvIGJlCi0JaWdub3JlZC4gIFRoaXMgaXMgdG8gY2F0Y2ggb3Zlci1zaXplZCBzd2l0Y2hlcyBnZW5lcmF0ZWQgYnkgZ2NjIG9uCi0Jc3lzdGVtcyB3aGljaCBkb24ndCBzdXBwb3J0IHRoZSBicm9rZW4gLndvcmQgaGFjay4KLQlhcy5jIChtYWluKTogcGVybWl0IC1KIGlmIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQuCi0Jd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IGNoZWNrIGZvciBzaWduZWQgLndvcmQgb3ZlcmZsb3cgaWYKLQlXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JELgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogZml4ZWQgbWlzc2luZyBwYXJlbnMgaW4gZXhwcmVzc2lvbgotCWNoZWNraW5nIGZvciBieXRlIG9yIHdvcmQgb3ZlcmZsb3cuCi0KLQkqIG9iai1jb2ZmYmZkLmg6IGRlZmluZSBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JELgotCW9iai1jb2ZmYmZkLmMgKGZpeHVwX3NlZ21lbnQpOiBjaGVjayBmb3Igc2lnbmVkIC53b3JkIG92ZXJmbG93IGlmCi0JV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRC4KLQotCSogb2JqLWNvZmZiZmQuYyAoZml4dXBfc2VnbWVudCk6IGZpeGVkIG1pc3NpbmcgcGFyZW5zIGluCi0JZXhwcmVzc2lvbiBjaGVja2luZyBmb3IgYnl0ZSBvciB3b3JkIG92ZXJmbG93LgotCi1GcmkgU2VwIDExIDEwOjIxOjA0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JU3VwcG9ydCBmb3IgaTM4NiBjb2ZmCi0JKiBvYmotY29mZmJmZC5oIDogYWRkZWQgc3R1ZmYKLQkqIHRjLWkzODYuYyAodGNfY29mZl9maXgycnR5cGUpOiBuZXcgZnVuY3Rpb24KLQkqIHRjLWkzODYuaCA6IG5ldyBjb2ZmIGRlZmluZXMKLQotVGh1IFNlcCAxMCAwOToyMzoxNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX3B1c2gpOiBjYWxsIGlucHV0X2ZpbGVfYmVnaW4sIG5vdAotCWlucHV0X3NjcnViX2JlZ2luLgotCW1lc3NhZ2VzLmMgKGFzX3BlcnJvcik6IHByaW50ICI6ICIgYmV0d2VlbiB0aGUgcGFzc2VkIGluIGVycm9yIGFuZAotCXRoZSBzdHJlcnJvciwgbGlrZSBwZXJyb3IgZG9lcy4KLQotV2VkIFNlcCAgOSAxMTowNjoyNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB1c2UgZ2FzX3RhcmdldCBpbnN0ZWFkIG9mIG1vZGlmeWluZyB0YXJnZXRfY3B1LgotCUZyb20gU3RldmUgQ2hhbWJlcmxhaW46Ci0JTWFrZWZpbGUuaW46IEhhbmRsZSBtNjgqLSotY29mZiouCi0JcmVhZC5jLCByZWFkLmg6IGFkZCBtdWx0IGFyZ3VtZW50IHRvIHNfc3BhY2UKLQotCSogdGMtbTY4ay5jIChtNjhrX2lwLCBtNjhrX2lwX29wLCBnZXRfbnVtLCB0cnlfbW90b19pbmRleCk6IG1lcmdlCi0JIE1vdG9yb2xhIGFuZCBNSVQgc3ludGF4OyBnYXMgY2FuIG5vdyBhc3NlbWJsZSBlaXRoZXIgdHlwZSBvZgotCSBmaWxlLgotCXRjLW02OGttb3RlLmMsIHRjLW02OGttb3RlLmg6IHJlbW92ZWQgbm93IHN1cGVyZmx1b3VzIGZpbGVzLgotCUZyb20gU3RldmUgQ2hhbWJlcmxhaW46Ci0JbTY4a2NvZmYubXQ6IGZvciBtNjhrIENPRkYuCi0Jb2JqLWNvZmZiZmQuYzogKGZpeHVwX21kZXBzKSBhZGRlZAotCSAoc2l6ZV9zZWN0aW9uKSByZW1vdmVkIGJhZCBzYW5pdHkgY2hlY2sKLQkgKGZpbGxfc2VjdGlvbikgYWRkZWQgcnNfbWFjaGluZV9kZXBlbmRlbnQgY2FzZQotCSAod3JpdGVfb2JqZWN0X2ZpbGUpIGNhbGwgZml4dXBfbWRlcHMKLQkgKGZpeHVwX3NlZ21lbnQpIHNldCBmeF9zdWJzeSB0byAwLgotCW9iai1jb2ZmYmZkLmg6IGRlZmluZSBXT1JLSU5HX0RPVF9XT1JEICh0b28gaGFyZCB0byBzdXBwb3J0KSBhbmQKLQkgaGFuZGxlIG02OGsuCi0JdGMtbTY4ay5jLCBjb25maWcvdGMtbTY4ay5oOiBhZGRlZCBtNjhrIENPRkYgc3VwcG9ydCBhbmQgTW90b3JhbGEKLQkgcHNldWRvIG9wcy4KLQotVHVlIFNlcCAgOCAxNzoxMDo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChMSUJTKTogSW5jbHVkZSBvcGNvZGUgbGlicmFyeS4KLQotRnJpIFNlcCAgNCAxODoyMDo1NiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAoZ2V0X251bSwgY2FzZSBTRUdfQklHKTogSWYgb25seSBzbWFsbCBpbnRlZ2VycwotCWluY2x1ZGluZyB6ZXJvIGFyZSBhY2NlcHRlZCwgcGFzcyArMC4wLgotCi1TdW4gQXVnIDMwIDIxOjI0OjQ2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1hcCAiYXMiIHRocm91Z2ggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSB3aGVuCi0JaW5zdGFsbGluZy4KLQotCSogZG9jL01ha2VmaWxlLmluOiBtYXAgImFzIiB0aHJvdWdoIHByb2dyYW1fdHJhbnNmb3JtX25hbWUgd2hlbgotCWluc3RhbGxpbmcuCi0KLVNhdCBBdWcgMjkgMTI6MTE6MTIgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYXMubmV3KTogRGVwZW5kIG9uIExPQ0FMX0xPQURMSUJFUy4KLQotRnJpIEF1ZyAyOCAxNjoyNToyMiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG9iai1ib3V0LmgsIG9iai1ib3V0LmMgKG9ial9oZWFkZXJfYXBwZW5kLCBvYmpfc3ltYm9sX3RvX2NoYXJzKSwKLQl0Yy1pOTYwLmMgKG1kX3JpX3RvX2NoYXJzKTogQWx3YXlzIG91dHB1dCBib3V0IG9iamVjdCBmaWxlIGluCi0JbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyICh1c2VkIHRvIHVzZSBlbmRpYW5uZXNzIG9mIGhvc3QpLgotCi1UdWUgQXVnIDI1IDE1OjUwOjQ4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAoaW5pdF90YWJsZSk6IE5vdyBjb25zdC4gIEFsd2F5cyBpbmNsdWRlIDY4ODUxCi0JZGF0YSwgc28gdGhhdCAiYmMiIGlzIGF2YWlsYWJsZSB0byA2ODA0MCBjYWNoZSBpbnN0cnVjdGlvbnMuCi0JQWRkZWQgInR0MCIsICJ0dDEiLCBhbmQgNjhlYzAzMCB2YXJpYW50cy4KLQkobWRfYXNzZW1ibGUpOiBDb21wbGFpbiBpZiA2ODAwMCAob25seSkgYW5kIDY4ODgxIGFyZSBzcGVjaWZpZWQuCi0JKGVudW0gX3JlZ2lzdGVyKTogQWRkZWQgVFQwLCBUVDEuCi0JKG02OGtfaXAsIGNhc2VzICczJyBhbmQgJ3QnKTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGUgY29kZXMuICBQYXNzCi0JbGluZSBudW1iZXIgY29ycmVjdGx5IGluICJpbnRlcm5hbCBlcnJvciIgbWVzc2FnZXMuICBEb24ndCBwcmludAotCWFyY2hpdGVjdHVyZS1taXNtYXRjaCBtZXNzYWdlIGZvciBvcGVyYW5kIGVycm9ycy4KLQotCUZyb20gQ29saW4gU21pdGggKGNvbGluQHdycy5jb20pOgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCwgY2FzZSAnXycpOiBVc2UgYWRkd29yZCB0d2ljZSByYXRoZXIKLQl0aGFuIGluc3RhbGxfb3BlcmFuZC4KLQotVHVlIEF1ZyAyNSAxNToxMzo0OCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jIChidWZmZXJfbGluZSk6IHJld2luZCB0byB0aGUgc3RhcnQgb2YgaW5jbHVkZQotCWZpbGVzLCB0aGV5IG1pZ2h0IGJlIGluY2x1ZGVkIHR3aWNlLgotCi0JKiB6OGsuYywgejhrLmgsIHo4ay5tdDogejgwMDAgc3VwcG9ydCBzdHVmZgotCi1Nb24gQXVnIDI0IDEyOjQ1OjQzIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZWQgVEFSR0VUX0NQVSBmb3IgQyBjb2RlIHNvIHRoYXQgaXQgY2FuIGNob29zZQotCW9uZSBlbGVtZW50IG9mIGEgZmFtaWx5LgotCi0JKiB0Yy1tNjhrLmM6IHVzZSBUQVJHRVRfQ1BVIHRvIGNob29zZSBkZWZhdWx0IGNwdSB0eXBlLgotCi0JKiB0ZS1nZW5lcmljLmg6IGRlZmF1bHQgdG8gTE9DQUxfTEFCRUxTX0RPTExBUiBhbmQgTE9DQUxfTEFCRUxTX0ZCCi0Jc28gdGhhdCB3ZSBjYW4gYXNzZW1ibGUgaGFuZC13cml0dGVuIGxpYmdjYyBjb2RlLgotCi1GcmkgQXVnIDIxIDE0OjM4OjQ0IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYyAoYXNfd2Fybik6IFVzZSBmcHV0cywgbm90IGZwcmludGYsIHdpdGggYSBidWZmZXIgdGhhdAotCWhhcyBhbHJlYWR5IGJlZW4gZm9ybWF0dGVkIChidXQgbWF5IHN0aWxsIGNvbnRhaW4gJS1jaGFyYWN0ZXJzKS4KLQkoYXNfYmFkKTogTGlrZXdpc2UuCi0KLVdlZCBBdWcgMTkgMTE6MjA6NTkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0Yy1tNjhrLmMsIHRjLW02OGttb3RlLmM6IHRoZSBjYXMyIGluc3RydWN0aW9uIGlzIHN1cHBvc2VkIHRvIGJlCi0Jd3JpdHRlbiB3aXRoIGluZGlyZWN0aW9uIG9uIHRoZSBsYXN0IHR3byBvcGVyYW5kcywgd2hpY2ggY2FuIGJlCi0JZWl0aGVyIGRhdGEgb3IgYWRkcmVzcyByZWdpc3RlcnMuICBBZGRlZCBhIG5ldyBvcGVyYW5kIHR5cGUgJ3InCi0Jd2hpY2ggYWNjZXB0cyBlaXRoZXIgcmVnaXN0ZXIgdHlwZS4gIEFkZGVkICcoJyB0byBub3RlbmQgc3R1ZmYgaW4KLQl0Yy1tNjhrbW90ZS5jIHRvIGFjY2VwdCAoYTApOihhMikgaW4gY2FzMiBpbnN0cnVjdGlvbi4KLQotV2VkIEF1ZyAxOSAwOToyNTowOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYXMuaCAoZW51bSBfcmVsYXhfc3RhdGUpOiBTdGFydCBvZmYgYXQgb25lLCBub3QgemVybywgdG8gYmV0dGVyCi0JY2F0Y2ggdW5pbml0aWFsaXplZC12YXJpYWJsZSBlcnJvcnMuCi0JKGxpbmtyZWxheCk6IERlY2xhcmUgbmV3IHZhcmlhYmxlLgotCi0JKiBtZXNzYWdlcy5jICh3YXJuaW5nX2NvdW50LCBlcnJvcl9jb3VudCk6IERlZmF1bHQgaW5pdGlhbGl6ZXIgaXMKLQlzdWZmaWNpZW50LgotCi0JKiB3cml0ZS5jOiBNZXJnZWQgc29tZSBkZWNsYXJhdGlvbnMsIHVzaW5nIFBBUk1TIG1hY3JvLgotCSh0ZXh0X2ZyYWdfcm9vdCwgZGF0YV9mcmFnX3Jvb3QsIGJzc19mcmFnX3Jvb3QsIHRleHRfbGFzdF9mcmFnLAotCWRhdGFfbGFzdF9mcmFnKTogTm8gbG9uZ2VyIHN0YXRpYy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUsIGNhc2UgcnNfYWxpZ24gb3IgcnNfb3JnKTogSWYgSEFORExFX0FMSUdOIGlzCi0JZGVmaW5lZCwgY2FsbCBpdC4gIENoYW5nZSBzZWdtZW50cyBiZWZvcmUgY2FsbGluZyBmaXh1cF9zZWdtZW50LgotCShyZWxheF9hbGlnbik6IElmIGxpbmtyZWxheCwgcHJvdmlkZSBleHRyYSBwYWRkaW5nLgotCi0JKiBvYmotYm91dC5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IEVtaXQgYWxpZ25tZW50IHJlbG9jcyBkZXNwaXRlCi0JdGhlaXIgbm90IGhhdmluZyBzeW1ib2xzIGFzc29jaWF0ZWQuCi0KLQkqIHRjLWk5NjAuYyAobm9yZWxheCwgaW5zdHJ1bWVudF9icmFuY2hlcyk6IERlZmF1bHQgaW5pdGlhbGl6ZXIgaXMKLQlzdWZmaWNpZW50LgotCShsaW5rcmVsYXgpOiBEZWxldGUgdmFyaWFibGUgZGVmaW5pdGlvbi4KLQkobWVtX2ZtdCk6IENhbGwgZml4X25ldyB3aXRoIE5PX1JFTE9DLgotCSh0Y19ib3V0X2ZpeF90b19jaGFycyk6IEhhbmRsZSBhbGlnbm1lbnQgcmVsb2NzLgotCShpOTYwX2hhbmRsZV9hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQkqIHRjLWk5NjAuaCAobGlua3JlbGF4KTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCShIQU5ETEVfQUxJR04pOiBOZXcgbWFjcm87IGNhbGxzIGk5NjBfaGFuZGxlX2FsaWduLgotCShORUVEX0ZYX1JfVFlQRSwgTk9fUkVMT0MpOiBOZXcgbWFjcm9zLgotCi1UdWUgQXVnIDE4IDE0OjU5OjIxIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvc3BhcmMubXQ6IE5ldyBmaWxlLiAgR3JhYiBzcGFyYyBvcGNvZGUgdGFibGUgZnJvbSBiZmQKLQlsaWJyYXJ5LgotCi1UdWUgQXVnIDE4IDE0OjE2OjM4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLiAgUmVtb3ZlZAotCU1JTlVTX0csIHNldCBDRkxBR1MgdG8gZGVmYXVsdCB0byAtZywgYWRkZWQgRkxBR1NfVE9fUEFTUywgcGFzc2VkCi0JRkxBR1NfVE9fUEFTUyB0byByZWN1cnNpdmUgbWFrZXMuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi0KLU1vbiBBdWcgMTcgMTU6MDk6NTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX3BvcCwgaW5wdXRfc2NydWJfcHVzaCk6IG1lbWNweSB3YXMKLQliZWluZyB1c2VkIHdpdGggYXJncyBzd2FwcGVkLCBjYXVzaW5nIG9jY2FzaW9uYWwgbG9zc2FnZSB3aGVuCi0JcmVmaWxsaW5nIGJ1ZmZlcnMgYWZ0ZXIgYW4gaW5jbHVkZSBmaWxlLgotCi1Nb24gQXVnIDE3IDEzOjE4OjUxIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jIChhc190c2t0c2spOiBVc2UgY29ycmVjdCBBTlNJIGZvcm0gZm9yIHN0ZGFyZwotCXZlcnNpb24uICBEaXNjYXJkIGJvZ3VzIERPTlRERUYgdmVyc2lvbi4KLQkoYXNfd2FybiwgYXNfYmFkLCBhc19mYXRhbCk6IExpa2V3aXNlLgotCi1GcmkgQXVnIDE0IDE4OjMxOjE0IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSWYgaW5zdHJ1Y3Rpb24gaXMgaW52YWxpZCBmb3IgdGhlCi0Jc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlLCBwcmludCBhIG1lc3NhZ2Ugc2F5aW5nIHNvIGFuZCBsaXN0aW5nIHdoYXQKLQlwcm9jZXNzb3JzIHN1cHBvcnQgaXQsIHJhdGhlciB0aGFuIHNheWluZyAib3BlcmFuZHMgbWlzbWF0Y2giLgotCi1UaHUgQXVnIDEzIDEzOjUzOjE5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhcy5oIFtCUk9LRU5fQVNTRVJUXTogSWYgZGVmaW5lZCwgdHVybiBvZmYgYWxsIGFzc2VydGlvbiBjaGVja3MuCi0KLQkqIGNvbmZpZy9oby1yczYwMDAuaCAoTV9SUzYwMDApOiBEb24ndCBkZWZpbmUgaXQuCi0JKGZyZWUpOiBEZWNsYXJlIGl0LgotCShCUk9LRU5fQVNTRVJUKTogRGVmaW5lIGl0IGlmIG5vdCBfX1NURENfXy4KLQotVHVlIEF1ZyAxMSAxMjo1ODoxNCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogc3BhcmMubXQ6IE5ldyBmaWxlLgotCi1Nb24gQXVnIDEwIDE0OjM3OjA4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiB0Yy1tNjhrLmM6ICIuYWxpZ24gTiIgbWVhbnMgYWxpZ24gdG8gTi1ieXRlIGJvdW5kYXJ5ICpvbmx5KgotCWlmIFROX1NVTjM7IG90aGVyd2lzZSBhbGlnbiB0byAyKipOLWJ5dGUgYm91bmFyeS4KLQotVGh1IEF1ZyAgNiAxMjoxMDozOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChzX2ZpbGwpOiBtYWtlIHRoZSAuZmlsbCBzaXplIGNsYW1wZWQgZXJyb3IgYSB3YXJuIGFuZAotCWZpeCBidWcgd2hlcmUgMCdzIHdlcmUgYWx3YXlzIHBsYWNlZC4KLQotCSogY29uZmlnL3RjLWg4MzAwLmM6IGlmIGEgOjggaXMgc2VlbiBhZnRlciBhbiBvcGVyYW5kLCBmaWxsIHRvcAotCXR3byBieXRlcyBvZiBhbnkgY29uc3RhbnQgd2l0aCAweGZmOgotCi1XZWQgQXVnICA1IDEyOjAyOjQwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBmaXggdGhlIC5hbGlnbiB0aGluZwotCXRoZSByaWdodCB3YXk7IGZvciBqdXN0IHRoZSA2OGsuIFN1biAzIC5hbGlnbiBpcyBuYnl0ZXMsIG5vdCBwdHdvLgotCi1XZWQgQXVnICA1IDAxOjU0OjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiB0Yy1tNjhrLmMgKHRyeV9pbmRleCk6ICBFcnJvciBpZiBpbmRleCBzY2FsaW5nIHNwZWNpZmllZCBhbmQKLQlhc3NlbWJsaW5nIGZvciBhbiBvbGRlciBDUFUgdGhhbiBhIDY4MDIwLgotCi1TYXQgQXVnICAxIDE5OjEwOjEzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfYW91dF9maXhfdG9fY2hhcnMpOiBJZiBwYy1yZWxhdGl2ZSwgdGFrZQotCWZ4X29mZnNldCBpbnRvIGFjY291bnQuCi0KLUZyaSBKdWwgMzEgMjE6NTM6MjggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyBob3N0KTogQWNjZXB0ICJ1bHRyaXgiIHdpdGggdmVyc2lvbiBudW1iZXIuCi0KLQkqIGV4cHIuYyAoZmxvYXRpbmdfY29uc3RhbnQpOiBTZXBhcmF0ZSAiPS0iIHRvIGF2b2lkIGNvbmZ1c2luZwotCWFuY2llbnQgb3IgYnJva2VuIGNvbXBpbGVycy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IE1pc21hdGNoIGVycm9yIGNvdWxkIGFsc28gaW5kaWNhdGUKLQlwcm9jZXNzb3Ivb3Bjb2RlIG1pc21hdGNoLCBzbyByZXdvcmQgdGhlIGVycm9yIG1lc3NhZ2UuCi0JKG1kX2Fzc2VtYmxlKTogSWYgbm8gQ1BVIGhhcyBiZWVuIHNldCAoZXZlbiBpZiBGUFUvUE1NVQotCWNoYXJhY3RlcmlzdGljcyBoYXZlIGJlZW4pLCBkZWZhdWx0IHRvIDY4MDIwLiAgRG9uJ3QgbmVlZCBleHRyYQotCXF1b3RlcyBhcm91bmQgZXJyb3Igc3RyaW5nLgotCi1GcmkgSnVsIDMxIDEyOjI2OjM0IDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChwb3RhYmxlKTogUmV2ZXJ0IHNhYydzIGluY29ycmVjdCBjaGFuZ2UgbWFkZSBKdWwgMTMuCi0JQWxpZ24gcmVhbGx5IGlzIHN1cHBvc2VkIHRvIGJlIHB0d28gbm90IG5ieXRlcy4KLQotTW9uIEp1bCAyMCAwMjo1MTo1OSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBfRG9fIGluY2x1ZGUgbGliaWJlcnR5LiAgKGZyb20gc2VmKQotCi1GcmkgSnVsIDE3IDE1OjE1OjI4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBIYW5kbGUgIjBmIiBhbmQgIjBiIiBsYWJlbCByZWZlcmVuY2VzCi0JcHJvcGVybHkuCi0KLVRodSBKdWwgMTYgMDg6MjA6MTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBpZiByZWxheGluZywgZG9uJ3QgZG8gYW55dGhpbmcuCi0JKiBjb25maWcvb2JqLWJvdXQuW2NoXSA6IG1haW50YWluIHRoZSBhX3JlbGF4YWJsZSBmaWxlIGhlYWRlciBpbmZvCi0JKiBjb25maWcvdGMtaTk2MC5jOiBuZXcgb3B0aW9uIC1saW5rcmVsYXgKLQotTW9uIEp1bCAxMyAxNDoxMTozNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChleHByKTogYWxsb3cgU0VHX0JTUyBpbiBleHByZXNzaW9ucwotCSogcmVhZC5jIChwb3RhYmxlKTogYWxpZ24gc2hvdWxkIGJlIG5ieXRlcywgbm90IHB0d28hCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGV4dHJhIGdsdWUgZm9yIG5ldyBic3MgYXR0cmlidXRlcwotCShyZWxheF9zZWdtZW50KTogU0VHX0JTUyBpcyBvayBub3cKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXBfb3ApOiBjYW4gbm93IHBhcnNlIG1vcmUgQCggbW9kZXMKLQotTW9uIEp1bCAgNiAxNzowOTozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBvYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBtYXJrIC5saXQgc2VjdGlvbnMgYXMgU1RZUF9MSVQKLQotTW9uIEp1biAgMSAxNjoyMDoyMiAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG02ODB4MCBhcyBoYXZpbmcgc3VuMyBlbXVsYXRpb24gbW9kZSBmb3IKLQl2eHdvcmtzIGVudmlyb25tZW50LgotCi0KLVR1ZSBKdW4gMzAgMjA6MjU6NTQgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHByb2dyYW1fc3VmZml4IChwYXJhbGxlbCB0byBwcm9ncmFtX3ByZWZpeCkKLQotV2VkIEp1biAyNCAxMDo1Nzo1NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKHByb2Nlc3NfZXNjYXBlKTogbmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSBlc2NhcGVzIHRoZSByaWdodAotCXdheSwgKGRvX3NjcnViX25leHRfY2hhcik6IHVzZSBuZXcgZnVuY3Rpb24KLQkqIGNvbmQuYyAoc19pZmRlZik6IGRvIGlmZGVmL2lmbmRlZiByaWdodAotCSogcmVhZC5jIChzX2ZpbGwpOiBtYWtlIHRoZSAsIGV4cHJlc3Npb25zIG9wdGlvbmFsIGxpa2UgdGhlIGRvYwotCXNheXMKLQkqIGNvbmZpZy90Yy1oODMwMC5bY2hdOiBiZXR0ZXIgd2FybmluZ3MKLQotVHVlIEp1biAgOSAwNzo1NDo1NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5jIChzdWJzZWdzX2JlZ2luKTogY3JlYXRlIGJzczBfZnJjaGFpblAgaW4gdGhlIHNhbWUgd2FzCi0JYXMgZGF0YTBfZnJjaGFpblAKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiB2YXJpb3VzIGNoYW5nZXMgdG8gaGFuZGxlIGRhdGEgaW4KLQl0aGUgQlNTIHNlZ21lbnQgaW4gbXVjaCB0aGUgc2FtZSB3YXMgYXMgc3R1ZmYgaW4gdGhlIERBVEEgc2VnbWVudC4KLQotCSogdGMtbTY4ay5jIChtNjhraXApOiBGaXggdHlwbyBzbyB0aGF0IG9ubHkgYXJjaCdzID49NjgwMjAgZG8KLQlwY3JlbCBkYXRhIHN0dWZmLiAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiB3aGVuIHJlbGF4aW5nIGEKLQk2ODAxMCBieHggaW50byBhIGJyYSs2IGptcHh4LCBwdXQgdGhlIGJ5dGVzIG9mIHRoZSBqbXAgb3Bjb2RlIGludG8KLQl0aGUgcmlnaHQgcGxhY2UuIChzX2Jzcyk6IERvbid0IHB1dCAuYnNzIHN0dWZmIGludG8gU0VHX0RBVEEsIHB1dAotCWl0IGludG8gU0VHX0JTUwotCi1UaHUgSnVuICA0IDExOjU5OjEzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBleHByLmMoZXhwcik6IGFsbG93IFNFR19SRUdJU1RFUiBpbiBleHByZXNzaW9ucy4KLQkqIHJlYWQuYyhwc2V1ZG9fc2V0KTogcmVnaXN0ZXIgZXhwcmVzc2lvbnMgY2FuIGJlIHRoZSBzb3VyY2Ugb2YgYQotCXNldC4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldyk6IE5vdyAtUiBmb3JjZXMgYWxsIGNoYW5nZXMgdG8gU0VHX0RBVEEgdG8KLQlnb3RvIFNFR19URVhUIChpZiBhLm91dCkKLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgYS5vdXQgZG9uJ3QgdXNlIHRoZSBvbGQgd2F5IGZvcgotCS1SLgotCSogY29uZmlnL29iai1hLm91dCAoc19zZWN0KTogY29tcGxhaW4gaWYgdGhlIHVzZXIgdHJpZXMgdG8gdXNlIGEKLQlzdWJzZWdtZW50IHdpdGggYSB2YWx1ZSB3aGljaCBtaWdodCBpbnRlcmZlcmUgd2l0aCBvdXQgLVIgaGFja2VyeS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfcmVnX3BhcnNlKTogbG9va3VwIG5hbWVzIGluIHN5bWJvbCB0YWJsZQotCXJhdGhlciB0aGFuIHVzZSB1Z2x5IGlmIHRyZWUuIChpbml0X3JlZ3RhYmxlKTogaW5zZXJ0IHJlZ2lzdGVyCi0JbmFtZXMgaW50byBzeW1ib2wgdGFibGUuCi0KLVR1ZSBKdW4gIDIgMTY6NDc6MDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gKHNhY0BjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGtlZXAgdGhlIGZpeF90YWlsIGNsZWFuLCB3aGljaAotCWZpeGVzIGEgYnVnIGluIC1SIHdoZXJlIHJlbG9jYXRpb25zIHdlcmUgYmVpbmcgbG9zdC4KLQotTW9uIEp1biAgMSAxNjoyMDoyMiAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG02ODB4MCBhcyBoYXZpbmcgc3VuMyBlbXVsYXRpb24gbW9kZSBmb3IKLQl2eHdvcmtzIGVudmlyb25tZW50LgotCi1TdW4gTWF5IDMxIDA1OjMzOjAwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG02ODB4MCBhcyBhbiBtNjhrCi0KLVRodSBNYXkgMjggMTE6MjI6MDIgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBzcGFyY2xpdGUgYXMgYSBzcGFyYyB2YXJpYW50LgotCi0JKiB0Yy1zcGFyYy5jOiBVc2UgbmV3IEFSQ0hJVEVDVFVSRVNfQ09ORkxJQ1RfUCBtYWNyby4gIE1lbnRpb24gbmV3Ci0JLUFzcGFyY2xpdGUgZmxhZy4KLQotVHVlIE1heSAyNiAxNjo0Nzo1NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWEyOWsuYzogbGludAotCSogbGlzdGluZy5jLCBleHByLmM6IHBhdGNoZXMgZnJvbSBBbmRyZXcgU21pdGgKLQotVGh1IE1heSAxNCAxNzoyMjo0OCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogdXNlIG00IHJhdGhlciB0aGFuIGdtNC4KLQotTW9uIE1heSAgNCAxODo1NjoxOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmZiZmQuYzogdXNlIGlzIGEgc3lub255bSBmb3Igc2VjdGlvbiwgKGRvX3JlbG9jc19mb3IpOgotCWNhbGMgdGhlIGJhc2Ugb2YgcmVsb2NzIGNvcnJlY3RseS4KLQkqIHRjLWEyOWsuYyAocGFyc2Vfb3BlcmFuZCk6IGFsbG93IGV4cHJlc3Npb25zIHRvIGJlIGluIGFueSBzZWN0aW9uLgotCi1Nb24gQXByIDI3IDEzOjEzOjMxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBhcy5jLCB3cml0ZS5jOiB1c2UgLUsgcmF0aGVyIHRoYW4gLWsgZm9yIHRoZSBicm9rZW4gd29yZCB3YXJuaW5nCi0JICBvcHRpb24uCi0KLVR1ZSBBcHIgMjEgMTM6MzU6MzAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkbyBub3QgcHJpbnQgcmVjdXJzaW9uIGxpbmVzLgotCi1XZWQgQXByIDE1IDIxOjE5OjMxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHRoZSB0b29sZGlyIGNvcHkgb2YgZ2FzIGdvZXMgZGlyZWN0bHkgaW4gdG9vbGRpci4KLQotVHVlIEFwciAxNCAxNDo1MDoyMiAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBGb3IgYi5vdXQgZm9ybWF0LCByb3VuZCB1cCBzZWN0aW9uCi0Jc3RhcnQgYWRkcmVzc2VzIHRvIG1hdGNoIHJlcXVpcmVkIGFsaWdubWVudC4KLQotVGh1IEFwciAgOSAwNTo0NToyOSAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBJbnN0YWxsIGludG8gJCh0b29sZGlyKS9iaW4sIHNpbmNlIHRoYXQncwotCXdoZXJlIGdjYyBsb29rcyBmb3IgaXQuCi0KLVR1ZSBBcHIgIDcgMTU6MTI6MTUgMTk5MiAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlZCBzb21lIGxpbmVzIHRvIGJlIGxlc3MgY29uZnVzaW5nIGZvciBzb21lCi0JbWFrZXMuCi0KLQkqIGlucHV0LWZpbGUuYzogIENvbmRpdGlvbmFsaXplIG9uIF9JT0ZCRiwgbm90IFZNUy4KLQotCSogcmVhZC5jLCB3cml0ZS5jOiAgQ2hhbmdlIGEgc2VyaWVzIG9mIGlmZGVmL2VsaWYgdG8KLQlpZmRlZi9lbHNlL2lmZGVmIGV0Yy4KLQotRnJpIE1hciAyNyAxMjoyMToxNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogc3ltYm9scy5jIChmYl9sYWJlbF9pbml0KTogZml4IHNpemVvZiB0byBtZW1zZXQuCi0KLUZyaSBNYXIgMTMgMTU6NDU6NDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbnN0YWxsIHRoZSBtYW4gcGFnZS4KLQotCSogTWFrZWZpbGUuaW46IHBhc3MgZG93biBNQUtFSU5GTyBleHBsaWNpdGx5IG9uIGluZm8uCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogdXNlICQoTUFLRUlORk8pIG5vdCBtYWtlaW5mby4KLQotRnJpIE1hciAxMyAwODowMzowMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZmxvbnVtLWNvbnN0LmM6IHJlbmFtZWQgZmxvbnVtLWtvbnN0LmMgdG8gc3RvcCBkb3MgbmFtZQotCWNvbmZsaWN0LgotCi1UaHUgTWFyIDEyIDA0OjQyOjM4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiB0Yy1tNjhrLmgsIHRlLXN1bjMuaDogbW92ZWQgTE9DQUxfTEFCRUxTX0ZCIGRlZmluaXRpb24gZnJvbQotCSAgdGMtbTY4ay5oIHRvIHRlLXN1bjMuaC4KLQotV2VkIE1hciAxMSAyMzozMjo0MiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB2eHdvcmtzNjggZ2V0cyB0ZS1zdW4zLmguCi0KLQkqIGV4cHIuYzogcmVtb3ZlIGxpbWl0YXRpb24gdGhhdCBsb2NhbF9sYWJlbHNfZG9sbGFyIG9yCi0JICBsb2NhbF9sYWJlbHNfZmIgbXVzdCBiZSA8IDEwLgotCi0JKiBzeW1ib2xzLmM6IHJlbW92ZSBsb2NhbF9sYWJlbHNfZG9sbGFyLCByZXBsYWNlIHdpdGggYSBmdW5jdGlvbgotCSAgaW50ZXJmYWNlIGZvciBhIHNwYXJzZSBhcnJheS4gIEFsbCB1c2VycyBhZGp1c3RlZC4KLQotCSogdGUtc3VuMy5oOiBhZGQgTE9DQUxfTEFCRUxTX0RPTExBUi4KLQotU2F0IE1hciAgNyAwMDowNjoyNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogY29tbWVudGVkIG91dCBsaW5lIGZvciBidWlsZGluZyBhcy1hbGwudGV4aW5mby4KLQkgIFRoaXMgaXMgdGVtcG9yYXJ5LgotCi0JKiBkb2MvYXMudGV4aW5mbywgZG9jL2FzLWFsbC50ZXhpbmZvOiBhZGRlZCBtZW51IGl0ZW0gaG9va3MuCi0KLUZyaSBNYXIgIDYgMjE6NTc6MTggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjaGVjayB0YXJnZXQuCi0KLVR1ZSBNYXIgIDMgMTU6NDU6NTYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgdG9vbGRpciBhbmQgcHJvZ3JhbV9wcmVmaXguCi0KLVN1biBNYXIgIDEgMDQ6NDM6MTkgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS57YyxofSAoZml4X25ldyk6IE1ha2UgdGhlc2UgZGVjbGFyYXRpb25zIGNvbnNpc3RlbnQuCi0KLVNhdCBGZWIgMjkgMTM6NTk6MTAgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3RyZXJyb3Iubyk6IEFkZCBydWxlIHNvIHRoYXQgYnJva2VuIFN1biBtYWtlIGNhbgotCXdvcmsgaW4gc3ViZGlycy4KLQotV2VkIEZlYiAyNiAxOToyNjoyOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jLCBvYmotY29mZmJmZC5jIDogZml4IGg4MzAwIHNwZWNpZmljIGJpdCByb3QKLQotCSogZXhwci5jIChvcGVyYW5kKTogaWYgY2FuJ3Qgd29yayBvdXQgd2hhdCBzb3J0IG9mIG9wZXJhbmQgaXQgaXMsCi0JdGhlbiBsb29rIHRocm91Z2ggRkxUX0NIQVJTIGZvciBhIGhpbnQuCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi0JKiBkb2MvTWFrZWZpbGUuaW4sIGRvYy9jb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1UdWUgRmViIDI1IDE0OjE3OjE1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBleHByLmM6IElmIGFuIGV4cHJlc3Npb24gaXMgc2luZ2xlIGNvbW1hLCB0aGVuIHJldHVybiB3aXRoCi0JU0VHX0FCU0VOVCByYXRoZXIgdGhhbiBhbiBlcnJvciAtIHNpbmNlIHRoZSBzcGFyYyBmcm9udCBlbmQgZG9lcwotCXJlYWxseSBzdHJhbmdlIHRoaW5ncyB3aXRoIHRoaW5ncyBsaWtlIGZiZ2UsYQotCi0JKiBhcy5oOiBpbmNsdWRlIGJmZC5oIGlmIHVzaW5nIG1hbnkgc2VjdGlvbnMKLQkqIGV4cHIuYzogTE9DQUxfTEFCRUxTX0ZCIGhhZCBiZWVuIGNoYW5nZWQgdG8gbG93ZXIgY2FzZSAtIHNvCi0JbG9jYWwgbGFiZWxzIGRpZG4ndCB3b3JrLgotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IGRvbid0IGNvcmUgZHVtcCB3aGVuIHRoZXJlJ3Mgbm8KLQlzeW1ib2wgdGhlcmUuCi0JKiB3cml0ZS5jLCB3cml0ZS5oOiBjYWxsIGZpeF9uZXcgd2l0aCB0aGUgcmlnaHQgbnVtYmVyIG9mIGFyZ3Mgb24KLQl0aGUgSDguCi0JKiBjb25maWcvdGMtaDgzMDAuW2NoXSA6IGZpeCBidWdzIHJlcG9ydGVkIGJ5IEhNU0ksIGFuZCBtYWtlCi0JZXJyb3JzIG5pY2VzCi0KLVNhdCBGZWIgMjIgMTI6MjY6MjggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGFwcC5jOiBNUkkgY29tcGF0aWJpbGl0eSAtIGFsbG93IHNpbmdsZSBxdW90ZSB0byBzdGFydCBhIHN0cmluZy4KLQkqIGFzLmM6IGZpeCB0eXBvIHJlY2VudGx5IGludHJvZHVjZWQuCi0JKiBhcy5oIDogRG9uJ3QgaW5jbHVkZSBhb3V0L3JlbG9jLmggLSBpdCdzIG5vdCByaWdodCBmb3IgQ09GRiEKLQkqIGV4cHIuYzogTXVjaCByZXdyaXRpbmcsIHRvIGFjY29tb2RhdGUgTVJJIHN5bnRheCBmb3IKLQlleHByZXNzaW9ucy4gQWxzbyBlYXNpZXIgdG8gcmVhZCBub3cuCi0JKiBsaXN0aW5nLmM6IFB1dCBiYWNrIGRlZnVucwotCSogcmVhZC5jOiBtb2RpZmllZCB0byBhY2NlcHQgTVJJIHN5bnRheCwgcHV0IGJhY2sgbGlzdGluZyBwc2V1ZG8KLQlvcHMgc28gdGhhdCBhbiBhc3NlbWJsZXIgYnVpbHQgd2l0aCBOT19MSVNUSU5HIGlnbm9yZXMgbGlzdCBvcHMKLQlyYXRoZXIgdGhhbiBwdWtlcy4KLQkqIHdyaXRlLmMsIHdyaXRlLmg6IGZpeHMgLSBvbmx5IGtlZXAgYSByZWxvYyB0eXBlIGluIGEgZml4IGlmIHRoZSB0YXJnZXQKLQltYWNoaW5lIGlzIGEgU1BBUkMgb3IgYSAyOUsuCi0JKiBjb25maWcvb2JqLWFvdXQuYzogYWRkZWQgc19zZWN0IHBzZXVkbyBvcAotCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IGxpbnRzLCBzZXQgdGhlIGZpbGVoZHIgZmxhZ3MgcmlnaHQgYW5kCi0JZmlsbCBpbiB0aGUgdGltZXN0YW1wLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmg6IFNpbmNlIHdlIGRvbid0IGluY2x1ZGUgYW91dC9yZWxvYy5oCi0JYW55bW9yZSwgZGVmaW5lIGFsbCB0aGUgcmVsb2NzIHdoaWNoIHRoZSB0Yy08eD4gYml0IHdpbGwgdXNlIHNvIHdlCi0JY2FuIHRyYW5zbGF0ZSBmcm9tIHRoZW0gdG8gdGhlIGNvZmYgdHlwZXMuCi0JKiBjb25maWcvdGMtYTI5ay5jOiByZWxvY190eXBlIGlzbid0IGFuZSBlbnVtIGFueSBtb3JlCi0JKiBjb25maWcvdGMtbTY4ay5jOiBBZGRlZCBOT19SRUxPQyBkZWZpbml0aW9uLgotCi1GcmkgRmViIDIxIDA2OjIxOjA3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHB1dCBoZWFkZXIgZmlsZXMgYmVmb3JlIEMgc291cmNlIGZvciBUQUdTOyByZW1vdmUKLQkgIHJlZmVyZW5jZXMgdG8gbm9uLWV4aXN0ZW50IHN5c2NhbGxzLmguCi0KLQkqIHJlYWQuYywgd3JpdGUuYyBzdWJzZWdzLmM6IGJhY2sgb3V0IHRoZSAuYnNzIGNoYW5nZXMuCi0KLQkqIG9iai1hb3V0LmM6IGRvIG5vdCBpbmNsdWRlIHN0YWIuZ251LmggaWYgTk9fTElTVElORy4KLQotCSogdGMtaTg2MC5jLCBhLm91dC5nbnUuaDogbW92ZSBpODYwIHJlbG9jcyB0byBhIHByb3BlciBwbGFjZS4KLQotCSogYS5vdXQuaDogcmVtb3ZlZC4KLQotRnJpIEZlYiAyMSAwMTowODo0OCAxOTkyICBNaW5oIFRyYW4tTGUgKFRSQU5MRUBJTlRFTExJQ09SUC5DT00pCi0KLQkqIHN5bWJvbHMuYyAobG9jYWxfbGFiZWxfbmFtZSk6IHN5bWJvbHMgbm93IHN0YXJ0IHdpdGggXkEuCi0KLQkqIHJlYWQuYywgc3Vic2Vncy5jLCB3cml0ZS5jIG9iai1jb2ZmLmM6IGFkZGVkIGhhbmRsaW5nIG9mCi0JICBgLmJzc2AgcHNldWRvIG9wIGZvciB1bml0aWFsaXplZCBkYXRhLiBUaGUgbmV3IGdjYyAoMS4zNy45eCkKLQkgIGdlbmVyYXRlIHRoZXNlIHNlY3Rpb25zLiAgLmFsaWduOiB3aWxsIHVzZSBOT1BfT1BDT0RFIG9yIDAKLQkgIGZvciBwYWRkaW5nLiBUaGlzIGlzIGp1c3QgZm9yIGJlaW5nIG5pY2UgdG8gdGhlCi0JICBkaXNhc3NlbWJsZXIuCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IGNoYW5nZWQgdG8gZ2VuZXJhdGUgbG9jYWwgbGFiZWwgIlwwMDFMMCIKLQkgIHN0YXJ0aW5nIHdpdGggYSBeQSBzbyB0aGF0IGl0IGlzIHJlY29nbml6ZWQgYXMgYSBsb2NhbCBsYWJlbC4KLQotCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogemVybyBic3NfZml4X3Jvb3QsIHRvby4KLQotCSogdGMtaTM4Ni5jOiB0Yy1pMzg2LmM6IGFkZGVkIGhhbmRsaW5nIG9mIHRoZSBmb2xsb3dpbmcgb3Bjb2RlczoKLQkgIGkvbyBvcGNvZGVzIC0gaW5iLCBpbncsIG91dGIgYW5kIG91dHcuICBzdHJpbmcgbWFuaXB1bGF0aW9uIHdpdGgKLQkgIGF0dCBzeW50YXggLSBzY21wLCBzbG9kLCBzbW92LCBzc2NhLCBzc3RvLgotCi0JKiBvYmotY29mZi5jOiAoZm9yIGFpeDM4NikgTW92ZWQgdGhlIHN5bWJvbHMgLnRleHQsIC5kYXRhIGFuZCAuYnNzCi0JICB0byBqdXN0IGFmdGVyIC5maWxlIC4KLQotCSAgSW4gb2JqX2NyYXdsX3N5bWJvbF9jaGFpbigpIHdoZXJlIGl0IHRyaWVzIHRvIHB1dCB0aGUgZXh0ZXJuYWwKLQkgIHN5bWJvbHMgYXBhcnQsIHdpdGggdGhlIGNvbmRpdGlvbjoKLQkgICAgKCFTX0lTX0RFRklORUQoc3ltYm9sUCkgJiYKLQkgICAgICFTX0lTX0RFQlVHKHN5bWJvbFApICYmCi0JICAgICAhU0ZfR0VUX1NUQVRJQ1Moc3ltYm9sUCkpCi0JICBpdCB3YXMgbW92aW5nIHRvbyBtYW55IHN5bWJvbHMgb3V0LiBTbyBJIHN3aXRjaCBpdCBiYWNrIHRvIHRoZQotCSAgY29uZGl0aW9uOgotCSAgICAoU19HRVRfU1RPUkFHRV9DTEFTUyhzeW1ib2xQKSA9PSBDX0VYVCAmJiAhU0ZfR0VUX0ZVTkNUSU9OKHN5bWJvbFApKQotCi0JICBJbiBvYmpfZW1pdF9yZWxvY2F0aW9ucygpIGFkZGVkIHRoZSBjb25kaXRpb25hbCBvbiBLRUVQX1JFTE9DX0lORk8KLQkgIHNvIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBGX1JFTEZMRyB3aGljaCBtYWtlIHRoZSBsaW5rZXIgY29tcGxhaW4KLQkgIHRoYXQgc29tZWJvZHkgaGFzIHN0cmlwcGVkIHRoZSByZWxvY2F0aW9uIGluZm8uCi0KLQkgIEFsc28sIHRoZSBBSVggbGQgcHJvZ3JhbSByZXF1aXJlIHRoYXQgdGhlIHJlbG9jYXRpb24gdGFibGUKLQkgIGlzIHNvcnRlZCBieSByX3ZhZGRyIGxpa2UgdGhlIHN0YW5kYXJkIEFUVCBhc3NlbWJsZXIgZG9lcy4KLQotCSAgW2hlIGFsc28gY2hhbmdlZCB0aGUgc2l6ZW9mKHN0cnVjdCAuLi4pJ3MgaW50byB0aGUgY29mZgotCSAgc3R5bGUgRk9PU1ogbWFjcm9zLiAgSSdtIG5vdCBzdXJlIHRoaXMgaXMgcmlnaHQsIGJ1dCBJIGNhbid0Ci0JICByZW1lbWJlciB3aHkuICB4b3hvcmljaC5dCi0KLUZyaSBGZWIgMjEgMDE6MDg6NDggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIGRvYzogdXNlIHRoZSBkb2MuICBCdWlsZCBpdCwgaW5zdGFsbAotCSAgaXQsIGNsZWFuIGl0LCBldGMuCi0KLVR1ZSBGZWIgMTggMDI6MjE6MjUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWQuYzogd2hpdGUgc3BhY2UgYW5kIGNvbW1lbnRzIG9ubHkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIHRoZSBuZXcgYXRvZi1uczMyLmMgZm9yIG5zMzJrLgotCi0JKiB3cml0ZS5jOiBjb21tZW50IGNoYW5nZSBvbmx5LgotCi0JKiB0Yy1tODhrLltoY106IHB1bGxlZCBpbiBmcm9tIGhhY2sncyB1bmZpbmlzaGVkIHdvcmsuICBUaGVzZQotCSAgYXJlbid0IHlldCBpbnRlZ3JhdGVkLgotCi0JKiB0Yy1pODYwLltoY106IGJsZXcgb2ZmIHRoZSBkdXN0LiAgU29tZXRoaW5nIG11c3Qgc3RpbGwgYmUgZG9uZQotCSAgYWJvdXQgY29uZmxpY3RpbmcgcmVsb2NhdGlvbiB0eXBlcy4KLQotCSogdGMtbnMzMmsuYzogUmVwbGFjZWQgcHJldmlvdXMgdGNfYW91dF9maXhfdG9fY2hhcnMgc3R1YiB3aXRoIHRoZQotCSAgcmVhbCB0aGluZy4KLQotCSogdGMtaTk2MC5jLCB0Yy1zcGFyYy5jOiB3aGl0ZSBzcGFjZSBhbmQgY29tbWVudHMgb25seS4KLQotCSogdGMtYTI5ay5oOiBkZWxldGUgZHVwbGljYXRlIG1hY3JvIGRlZmluaXRpb24uCi0KLQkqIG5ldyBmaWxlIGF0b2YtbnMzMmsuYyBjb3BpZWQgZnJvbSBoYWNrJ3MgbGFzdCB1bnJlbGVhc2VkIGdhcy4KLQotTW9uIEZlYiAxNyAwNzo1MTowNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW5zMzJrLmM6IGFjdHVhbGx5IG1ha2UgdGNfYW91dF9maXhfdG9fY2hhcnMgd29yawotCSAgcmF0aGVyIHRoYW4gYWJvcnQuCi0KLQkqIG5lYXJseSBldmVyeXRoaW5nLiAgZmx1c2ggQ2hhbmdlTG9nLCBwYWNrYWdlIGFzIGdhcy0xLjkyLjEuCi0JICBDaGFuZ2VMb2cncyBwcmlvciB0byB0aGlzIGFyZSBza2V0Y2h5IGF0IGJlc3QuICBJIGhhdmUgbG9ncy4KLQkgIFRoZXkganVzdCBhcmVuJ3QgQ2hhbmdlTG9ncy4KZGlmZiAtLWdpdCBhL2dhcy9DaGFuZ2VMb2ctOTY5NyBiL2dhcy9DaGFuZ2VMb2ctOTY5NwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyYWY4Mi4uMDAwMDAwMAotLS0gYS9nYXMvQ2hhbmdlTG9nLTk2OTcKKysrIC9kZXYvbnVsbApAQCAtMSw1OTYwICswLDAgQEAKLVdlZCBEZWMgMzEgMTI6Mjk6NDcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9yZWxheF90YWJsZSk6IENvcnJlY3QgYnJhbmNoIHJhbmdlcy4KLQotTW9uIERlYyAyMiAxMzowNjowNSAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoaTM4NiotZ28zMi1ydGVtcyopOiBGaXggdG8gYmUgdGhlIHNhbWUgYXMKLQlpWzM0NTZdODYtZ28zMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIERlYyAyMiAxMjo1NDowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogVGhlIDQ2NTAgZG9lc24ndCBwZXJtaXQgTV9MREMxX0FCLAotCU1fU0RDMV9BQiwgTV9MX0RPQiwgTV9MX0RBQiwgTV9TX0RBQiwgb3IgTV9TX0RPQi4KLQkobWlwc19pcCk6IEFsd2F5cyBjaGVjayBmb3IgRlBfRCwgbm90IGp1c3QgZm9yIGluc3RydWN0aW9ucyB0aGF0Ci0JYXJlIG5vdCBwYXJ0IG9mIHRoZSByZWd1bGFyIElTQS4KLQotVGh1IERlYyAxOCAxNjo0OToyOCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChidWlsZF9pbnNuKTogTWFrZSBgbnVtYmVyJyBhIGxvbmcgZm9yIDY0LWJpdCBob3N0cy4KLQotVGh1IERlYyAxOCAxNjo0Mjo1NyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoY3B1X3R5cGVzKTogMjExNjRwYy9wY2E1NiBkb2VzIG5vdCBoYXZlIENJWC4KLQotV2VkIERlYyAxNyAyMToyMzowNyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCAzMmJpdCBiaWdudW0pOiBNYXNrIG9mZiBiaXRzIG91dHNpZGUKLQl0aGUgcmFuZ2Ugd2UgY2FyZSBhYm91dC4KLQotV2VkIERlYyAxNyAxNToyOTowMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfc2hvcnRvcHRzKTogQWRkICduJyBhbmQgJ04nIG9wdGlvbnMuCi0JKGV4ZWNfdHlwZV9lbnVtKTogRW51bWVyYXRpb24gZ2l2aW5nIGFsbCBvZiB0aGUgZXhlYyB0eXBlcy4KLQkod2Fybl9ub3BzKTogTmV3IHN0YXRpYyB2YXJpYWJsZSB0byBnaXZlIG5vcCB3YXJuaW5nIGxldmVsLgotCSh7Y3VyLHByZXZ9X211bDMyX3ApOiBOZXcgc3RhdGljIHZhcmlhYmxlIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlcgotCXRoZSBjdXJyZW50L3ByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgMzItYml0IG11bHRpcGx5LgotCShPcHRpbWl6aW5nKTogTWFrZSBzdGF0aWMuCi0JKE5PUHsyLF9MRUZULF9SSUdIVH0pOiBNYWNyb3MgZm9yIHdvcmQgb2Ygbm9wcyBhbmQgbGVmdC9yaWdodAotCW5vcHMuCi0JKGQzMHZfaW5zZXJ0X29wZXJhbmQpOiBEZWxldGUgZGVjbGFyYXRpb24gb2YgdW51c2VkIGZ1bmN0aW9uLgotCSh3cml0ZV8yX3Nob3J0KTogTWFrZSBleGVjX3R5cGUgYXJndW1lbnQgZW51bSwgbm90IGludC4KLQkocGFyYWxsZWxfb2spOiBEaXR0by4KLQkoY2hlY2tfcmFuZ2UpOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlKHMpLgotCShidWlsZF9pbnNuKTogRGl0dG8uCi0JKGZpbmRfZm9ybWF0KTogRGl0dG8uCi0JKG1kX2FwcGx5X2ZpeDMpOiBEaXR0by4KLQkobWRfc2hvd191c2FnZSk6IERvY3VtZW50IC1uIGFuZCAtTi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUGFyc2UgLW4gYW5kIC1OLgotCSh3cml0ZV8xX3Nob3J0KTogSWYgLW4sIHdhcm4gYWJvdXQgYWRkaW5nIGEgbm9wLiAgVXNlCi0JTk9QX3tMRUZULFJJR0hUfS4KLQkod3JpdGVfMl9zaG9ydCk6IFVzZSBlbnVtZXJhdGlvbiB2YWx1ZXMgaW5zdGVhZCBvZiBoYXJkIGNvZGVkCi0JaW50ZWdlcnMuICBSZXNldCBleGVjX3R5cGUgZm9yIGRlZmF1bHQgb3BlcmF0aW9ucy4gIEZvciBleHBsaWNpdAotCXBhcmFsbGVsIG9wZXJhdGlvbnMsIGNhbGwgcGFyYWxsZWxfb2sgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMKLQlvay4gIElmIHdyaXRpbmcgb3V0IGEgcGFyYWxsZWwgb3BlcmF0aW9uLCBhbmQgdGhlIHByZXZpb3VzCi0JaW5zdHJ1Y3Rpb24gd2FzIGEgMzItYml0IG11bHRpcGx5LCBpbmRpY2F0ZSBjdXJyZW50IGluc3RydWN0aW9uCi0JaXMuCi0JKHBhcmFsbGVsX29rKTogQWxsb3cgYWRkL3R4IC4uLiB0byBiZSBkb25lIGluIHBhcmFsbGVsIHdpdGgKLQlhbm90aGVyIGFkZC90eCAuLi4gYXNzdW1pbmcgdGhlIGdwciByZWdpc3RlcnMgZG9uJ3Qgb3ZlcmxhcC4KLQkobWRfYXNzZW1ibGUpOiBVc2UgZXhlYyB0eXBlIGVudW1lcmF0aW9uIHZhbHVlcywgbm90IGhhcmQgY29kZWQKLQlpbnRzLiAgQ2hlY2sgZm9yIGxvYWRzIG9yIDE2LWJpdCBtdWx0aXBsaWVzIGZvbGxvd2luZyBpbiB0aGUgbmV4dAotCWN5Y2xlIGFmdGVyIGEgMzItYml0IG11bHRpcGx5LiAgQWRkIG5vcHMgaWYgdGhhdCBpcyB0aGUgY2FzZS4KLQkoZG9fYXNzZW1ibGUpOiBDb3B5IHByZXZfbXVsMzJfcCB0byBjdXJfbXVsMzJfcCwgYW5kIHNldAotCWN1cl9tdWwzMl9wIGlmIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gaXMgYSAzMi1iaXQgbXVsdGlwbHkuCi0JKGZpbmRfZm9ybWF0KTogQ2hhbmdlIHNwYWNpbmcgYW5kIGxheW91dC4KLQotVHVlIERlYyAxNiAxNjo1NTo0NSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKHRpYzgwX3JlbGF4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgbmV3IE9QVElPTl9SRUxBWCBhbmQgT1BUSU9OX05PX1JFTEFYIG9wdGlvbnMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBuZXcgcmVsYXggb3B0aW9ucy4KLQkobWRfc2hvd191c2FnZSk6IERvY3VtZW50IG5ldyByZWxheCBvcHRpb25zLgotCShmaW5kX29wY29kZSk6IERvbid0IHVzZSBzaG9ydCBmb3JtcyBvZiBQQyByZWxhdGl2ZSBicmFuY2hlcyBpZgotCXRpYzgwX3JlbGF4IGlzIHNldC4KLQotVHVlIERlYyAxNiAxNToyNjowMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBSZW1vdmUgbm9uLXJlZ2lzdGVyIGJpdHMgZnJvbQotCXVzZWQvc2V0IGZsYWcgZmllbGRzLiAgTWFrZSBmbGFnIHZhcnMgdW5zaWduZWQgbG9uZy4gIFVzZQotCUZMQUdfQXswLDF9IGZvciBhY2N1bXVsYXRvcnMuICBBbGxvdyBhbnkgMiBpbnNucyB0byBiZSBkb25lIGluCi0JcGFyYWxsZWwgaWYgdGhleSB1c2UgdGhlIHNhbWUgY29uZGl0aW9uYWwgZmxhZyB3aXRoIHJldmVyc2VkCi0JbWVhbmluZy4gIEFsbG93IDIgYWRkL3N1YiBpbnNucyB0aGF0IHNldCB0aGUgY2Fycnkgb3Igb3ZlcmZsb3cKLQlmbGFncyBidXQgZG8gbm90IHF1ZXJ5IHRoZW0gdG8gYmUgZG9uZSBpbiBwYXJhbGxlbC4gIERvbid0IGFsbG93IDIKLQl3b3JkIHN0b3JlIG9wZXJhdGlvbnMgdG8gYmUgZG9uZSBpbiBwYXJhbGxlbCB3aXRoIEFERHBwcCBvcgotCVNVQnBwcC4gIERvbid0IGFsbG93IGxvYWRzIHRvIGJlIGRvbmUgaW4gcGFyYWxsZWwgd2l0aCAxNiBiaXQKLQltdWx0aXBsaWVzLgotCi1UdWUgRGVjIDE2IDA5OjIwOjQzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYzogUHJldmVudCB1c2Ugb2YgaW50ZXJ3b3JraW5nIHN1cHBvcnQgZm9yCi0Jbm9uLUNPRkYgdGFyZ2V0cy4KLQotTW9uIERlYyAxNSAxNToyMDozMiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYWxsLnRleGk6IEFkZCBNMzJSIGNwdS4KLQotCSogZG9jL2FzLnRleGluZm86IEFkZCBkb2N1bWVudGF0aW9uIG9mIG0zMnIgcHJvY2Vzc29yLgotCi0JKiBkb2MvYy1tMzJyLnRleGk6IE5ldyBmaWxlLCBkb2N1bWVudGluZyBtMzJyIHNwZWNpZmljIGZlYXR1cmVzLiAgCi0KLQotTW9uIERlYyAxNSAxMDozMjoyOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBDb3JyZWN0bHkgaW5zZXJ0ICdQJyBvcGVyYW5kcyBpbnRvCi0JdGhlIGluc3RydWN0aW9uLgotCi1GcmkgRGVjIDEyIDExOjQ0OjIwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAoYnVpbGRfaW5zbik6IEhhbmRsZSBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlCi0JbG9uZyAoMzIgYml0KSBQQyByZWxhdGl2ZSBvZmZzZXRzLiAgRml4IHBsYWNlcyB0aGF0IHByZXZpb3VzbHkKLQltaXN1c2VkIFJfTVBQQ1IgZm9yIDE1IGJpdCBvZmZzZXRzIHRvIHVzZSB0aGUgbmV3IFJfTVBQQ1IxNVcgdHlwZS4KLQkobWRfYXBwbHlfZml4KTogQWRkIGNhc2UgdG8gaGFuZGxlIGxvbmcgUEMgcmVsYXRpdmUgb2Zmc2V0cy4KLQotRnJpIERlYyAxMiAxMDozNTowMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy1hcm0udGV4aSAoQVJNIE9wdGlvbnMpOiBEb2N1bWVudCBzdXBwb3J0IGZvciBuZXcgQVJNCi0JcHJvY2Vzc29yIG5hbWVzLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciBuZXcgQVJNCi0JcHJvY2Vzc29yIG5hbWVzLgotCi1UaHUgRGVjIDExIDE3OjQ2OjUwIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBEb24ndCBvdmVyd3JpdGUgb3Bjb2RlIHRhYmxlIGRhdGEuCi0JKGluc29wLCBtNjhrX2lwKTogTWFrZSBgb3Bjb2RlJyBjb25zdCBzbyBpdCBkb2Vzbid0IGhhcHBlbiBhZ2Fpbi4KLQotRnJpIERlYyAgNSAxMToyMzo1OSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IEZpeCBCRkRfUkVMT0NfMzIgYWdhaW5zdCBhCi0Jc3ltYm9sICsgb2Zmc2V0LgotCi0JKiBjb25maWcvdGMtdjg1MC5oIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IFVzZQotCVNIVF9WODUwX3tTfFR8Wn1DT01NT04gdG8gbWFyayBzcGVjaWFsIGNvbW1vbiBzZWN0aW9ucy4KLQotVHVlIERlYyAgMiAxNzowNToxMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jOiBCcm91Z2h0IHVwIHRvIGRhdGUgd2l0aCB0aGUgYnJhbmNoLgotCi1Nb24gRGVjICAxIDIwOjI0OjE4IDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLXNoLmMgKFNXSVRDSF9UQUJMRV9DT05TKTogSGFuZGxlIChmaXgpLT5meF9zaXplID09IDEuCi0JKFNXSVRDSF9UQUJMRSk6IEhhbmRsZSBCRkRfUkVMT0NfOC4KLQkobWRfYXBwbHlfZml4KTogI2lmbmRlZiBCRkRfQVNTRU1CTEVSIGNvZGU6IEhhbmRsZSBmaXhQLT5meF9zaXplID09IDEuCi0JKGNvZmZfcmVsb2NfbWFwKTogQWRkIEJGRF9SRUxPQ184X1BDUkVMIGVudHJ5LgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IFNXSVRDSF9UQUJMRSBjYXNlOiBIYW5kbGUgQkZEX1JFTE9DXzguCi0KLVNhdCBOb3YgMjIgMTY6MTk6MjIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtYWxwaGEuYyAocmFuZ2Vfc2lnbmVkXzE2LCByYW5nZV9zaWduZWRfMzIpOiBXb3JrIGFyb3VuZCBhbgotCWFwcGFyZW50IGJ1ZyBpbiBnY2MncyBsb25nIGxvbmcgc3VwcG9ydCBjcm9zc2luZyBmcm9tIHg4Ni4KLQotU2F0IE5vdiAyMiAxNDoyNjowOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmM6IEJyb3VnaHQgdXAgdG8gZGF0ZSB3aXRoIGxhdGVzdCBjaGFuZ2VzIG9uIGFybQotCWJyYW5jaC4gCi0KLVNhdCBOb3YgMjIgMTU6NTA6MDkgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy1nYXMuY29tOiBHZXQgdmVyc2lvbiBpbmZvIGZyb20gY29uZmlndXJlLmluLgotCi0JKiBtYWtlZmlsZS52bXM6IGluY2x1ZGUgZGVwZW5kLm9iaiBpbiBPQkpTLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV9zZWN0aW9uKTogUmVtb3ZlICIubGNvbW0iIGhhbmRsaW5nLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfYmFzZXJlZ19jbG9iYmVyZWQpOiBSZW1vdmUgdmFyaWFibGUgYW5kCi0JYWxsIGNvcnJlc3BvbmRpbmcgY29kZS4KLQotVGh1IE5vdiAyMCAxNTowNjowOCAxOTk3ICBSaWNoYXJkIEVhcm5zaGF3IDxyZWFybnNoYUBhcm0uY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmggKFRBUkdFVF9GT1JNQVQgZm9yIGdlbmVyaWMgYS5vdXQgdGFyZ2V0cyk6IEFsbG93Ci0JcnVuLXRpbWUgZW5kaWFuIHNlbGVjdGlvbi4KLQotV2VkIE5vdiAxOSAxNzo0NDo0MiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0gICAgICAgICogdGMtc2guYyAocGFyc2VfcmVnKTogUHJvcGVybHkgcXVvdGUgZm9yIGZ2NC4KLQotV2VkIE5vdiAxOSAyMzo0NjoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBBZGQgbWlzc2luZyBicmVha3MgaW4gY2FzZSBvbgotCXN5bWJvbCB2YWx1ZSBvcGVyYXRvci4KLQotVHVlIE5vdiAxOCAxODo0NToxNCAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vaywgZmluZF9vcGNvZGUpOiAKLQlTcGxpdCBPUEVSQU5EX0ZMQUcgaW50byBPUEVSQU5EX0ZGTEFHIGFuZCBPUEVSQU5EX0NGTEFHLgotCi1TdW4gTm92IDE2IDEwOjA1OjA3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IENhc3Qgc2Vjb25kIGFyZyBvZgotCW1kX2FwcGx5X2ZpeDMgY2FsbCB0byB0eXBlICJ2YWx1ZVQgKiIuCi0KLVRodSBOb3YgMTMgMTM6NTM6MTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBNYWtlIEZyZWVCU0QgYW4gYW91dCAvIGkzODZic2QKLSAJdmFyaWFudC4KLQkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCi0JCi1UaHUgTm92IDEzIDExOjA3OjE0IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IFVzZSB0aGUgbWVtYmVyc2hpcCBmaWVsZAotCWZvciBJTlNOX01BQ1JPJ3MuCi0JKG1pcHNfaXApOiBTYW1lLgotCi1UaHUgTm92IDEzIDAyOjA0OjU1IDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogRm9yIE9QQ09ERV9GQUtFLCBhZGQgY2hlY2sgZm9yCi0JZmlyc3QgYXJndW1lbnQgaWYgaXQncyBzdXBwb3NlZCB0byBiZSBhIHJlZ2lzdGVyLgotCi1UdWUgTm92IDExIDE5OjI1OjA1IDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6ICBJZiBkMTB2LCByZS1pbnNlcnQgYSBzcGFjZSBiZWZvcmUKLQlhICcjJyB3aGVuIGluIHN0YXRlIDEwLgotCi1UdWUgTm92IDExIDEzOjMzOjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmM6IEluY2x1ZGUgInN1YnNlZ3MuaCIuCi0JKHRjX3JlbG9jX21hbmdsZSk6IEhhbmRsZSByZWZlcmVuY2VzIHRvIHN5bWJvbHMgd2hpY2ggYXJlIG5vdAotCWJlaW5nIG91dHB1dCwgc28gdGhhdCByZWZlcmVuY2VzIHRvIGAuJyB3b3JrLgotCi1Nb24gTm92IDEwIDEzOjQzOjMzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IENhbGwgYWRkX2ZpeCB3aGVuIG5lZWRlZCBmb3IgJ18nCi0JY2FzZS4KLQotCSogbWFjcm8uYyAoc3ViX2FjdHVhbCk6IElmIHdlIGRvbid0IGZpbmQgYSBwYXJhbWV0ZXIgZm9yIGFuICYsCi0JanVzdCBzdWJzdGl0dXRlICYuCi0KLUZyaSBOb3YgIDcgMjE6Mjk6MzIgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBJbiBkZWZhdWx0IGNhc2UsIGNhbGwgYXNfYmFkCi0JaW5zdGVhZCBvZiBmcHJpbnRmLCB0byBnZXQgImFzc2VtYmxlciBtZXNzYWdlczoiIG1lc3NhZ2Ugb3V0cHV0Ci0JYmVmb3JlIGluc3RlYWQgb2YgYWZ0ZXIuCi0KLUZyaSBOb3YgIDcgMTA6MzY6MjIgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZnJhZ3MuaDogSGFuZGxlIG11bHRpcGxlIGluY2x1c2lvbi4KLQotV2VkIE5vdiAgNSAxMDo1MTo0OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JQmFzZWQgb24gYSBwYXRjaCBmcm9tIElhbi5EYWxsQGRzdG8uZGVmZW5jZS5nb3YuYXUuCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZywgZnJhZyBzdXBwb3J0KTogTW92ZWQgZnJvbSBoZXJlLgotCSogZnJhZ3MuaDogVG8gaGVyZS4KLQkoc3RydWN0IGZyYWcsIG1lbWJlciB0Y19mcmFnX2RhdGEpOiBOZXcgbWVtYmVyIGlmIFRDX0ZSQUdfVFlQRQotCWlzIGRlZmluZWQuCi0JKHN0cnVjdCBmcmFnLCBtZW1iZXIgZnJfY2dlbik6IFJlbmFtZWQgZnJvbSBmcl90YXJnLmNnZW4uCi0JKiBjZ2VuLmMgKGNnZW5fYXNtX2ZpbmlzaF9pbnNuKTogVXBkYXRlLgotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBVcGRhdGUuCi0JKiBjb25maWcvdGMtbTMyci5oIChUQ19GUkFHX0lOSVQpOiBSZW5hbWVkIGZyb20gbWRfaW5pdF9mcmFnLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1uczMyay5oIChUQ19GUkFHX1RZUEUpOiBEZWZpbmUuCi0JKGZyYWdfb3Bjb2RlX2ZyYWcsZnJhZ19vcGNvZGVfb2Zmc2V0LGZyYWdfYnNyKTogVXBkYXRlLgotCShUQ19GUkFHX0lOSVQpOiBVcGRhdGUuCi0KLVR1ZSBOb3YgIDQgMTY6MzU6NTcgMTk5NyAgSWFuIERhbGwgIDxJYW4uRGFsbEBkc3RvLmRlZmVuY2UuZ292LmF1PgotCi0JKiB3cml0ZS5jIChwcmludF9maXh1cCk6IFVzZSBUQ19GSVhfREFUQV9QUklOVCAoaWYgZGVmaW5lZCkgdG8KLQlwcmludCBvdXQgTUQgZmllbGRzIG9mIGZpeC4KLQkqIGZyYWdzLmMgKGZyYWdfdmFyLCBmcmFnX3ZhcmlhbnQpOiBVc2UgVENfRlJBR19JTklUIG1hY3JvIChpZgotIAlkZWZpbmVkKSB0byBpbml0aWFsaXplIE1EIGZpZWxkcyBpbiBmcmFnLgotCSogYXMuaCAoc3RydWN0IGZyYWcsIG5zMzJrIHN1cHBvcnQpOiBSZW5hbWUgbnMzMmsgdG8gZnJfbnMzMmsuCi0JRGVsZXRlIHBjcmVsX2FkanVzdC4gIEFkZCBmcl9vcGNvZGVfZnJhZ1AsIGZyX29wY29kZV9vZmZzZXQuCi0JKiBjb25maWcvdGMtbnMzMmsuaDogQWRkIGNvbW1lbnRzLiBSZW1vdmUgb2Jzb2xldGUKLSAJQkZEX0ZBU1RfU0VDVElPTl9GSUxMIGRlZmluaXRpb24sIGNoYW5nZSBwcm90b3R5cGVzIGZvcgotIAlmaXhfbmV3X25zMzJrIGFuZCBmaXhfbmV3X25zMzJrX2V4cCB0byBhZGQgbmV3IGFyZ3VtZW50cwotIAlvcGNvZGVfZnJhZyBhbmQgb3Bjb2RlX29mZnNldCBhbmQgcmVtb3ZlIHBjcmVsX2FkanVzdC4KLQkoVENfRklYX1RZUEUpOiBhZGQgb3Bjb2RlX2ZyYWdQIGFuZCBvcGNvZGVfb2Zmc2V0IGZpZWxkcy4KLQkoVENfRklYX0RBVEFfUFJJTlQpOiBuZXcgbWFjcm8gdG8gcHJpbnQgb3V0IFRDX0ZJWF9UWVBFLgotCShUQ19GUkFHX0lOSVQpOiBuZXcgbWFjcm8gdG8gaW5pdGlhbGl6ZSBtYWNoaW5lIGRlcGVuZGVudCBmaWVsZCBpbgotIAlmcmFncy4KLQkoZnJhZ19vcGNvZGVfZnJhZywgZnJhZ19vcGNvZGVfb2Zmc2V0LCBmcmFnX2Jzcik6IG1hY3JvcyB0byBhY2Nlc3MKLSAJTUQgZmllbGRzIGluIGZyYWcgc3RydWN0dXJlLgotCShmaXhfaW1fZGlzcCwgZml4X2JpdF9maXhQLCBmaXhfb3Bjb2RlX2ZyYWcsIGZpeF9vcGNvZGVfb2Zmc2V0LAotIAlmaXhfYnNyKTogbWFjcm9zIHRvIGFjY2VzcyBNRCBmaWVsZHMgaW4gZml4IHN0cnVjdHVyZS4KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBBdm9pZCBvdmVybGVuZ3RoIGxpbmVzLiBBbGlnbiBjb21tZW50cy4gIERvbid0Ci0gCXVzZSBzdHJ1Y3Qgb3Bjb2RlX2xvY2F0aW9uIGFzIHRoZXNlIGZpZWxkcyBhcmUgbm93IGluIHRoZSBmcmFnCi0Jc3RydWN0dXJlLgotCShjb252ZXJ0X2lpZik6IENhbGwgZnJhZ19tb3JlIGFzIGl0IGlzIG5lZWRlZCBpbnN0ZWFkCi0gCW9mIHRyeWluZyB0byBhbGxvY2F0ZSBmb3IgdGhlIHdob2xlIGluc24uIEF2b2lkIGNhbGwgb2YgZnJhZ19tb3JlCi0gCXdpdGggbmVnYXRpdmUgYXJndW1lbnQuCi0JKG1kX3BjcmVsX2FkanVzdCwgbWRfZml4X3BjcmVsX2FkanVzdCwgbWRfYXBwbHlfZml4LAotCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBtZF9wY3JlbF9mcm9tLAotCXRjX2FvdXRfZml4X3RvX2NoYXJzKTogdXNlIGFjY2Vzc29yIG1hY3JvcyB0byBnZXQgbWQgZmllbGRzIGluIGZpeAotIAlhbmQgZnJhZyBzdHJ1Y3R1cmVzLgotCShmaXhfbmV3X25zMzJrLCBmaXhfbmV3X25zMzJrX2V4cCk6IGFkZCBuZXcgYXJndW1lbnRzIG9wY29kZV9mcmFnIGFuZAotCW9wY29kZV9vZmZzZXQgYW5kIHJlbW92ZSBwY3JlbF9hZGp1c3QuCi0JKGNvbnZlcnRfaWlmLCBjb25zX2ZpeF9uZXdfbnMzMmspOiBjYWxsIGZpeF9uZXdfbnMzMmssCi0gCWZpeF9uZXdfbnMzMmtfZXhwIHdpdGggY2hhbmdlZCBhcmd1bWVudHMuCi0KLU1vbiBOb3YgIDMgMTM6MzA6MTcgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIHRjLW1pcHMuYyAobWRfYmVnaW4pOiBSZW9yZ2FuaXplIHNldHRpbmcgb2YgZGVmYXVsdCB2YWx1ZXMgc28KLQl0aGF0IG1pcHNfY3B1IGRlcGVuZHMgb24gVEFSR0VUX0NQVSwgYW5kIG1pcHNfb3B0cy5pc2EgZGVwZW5kcyBvbgotCW1pcHNfY3B1LgotCShtZF9wYXJzZV9vcHRpb24pOiBSZW1vdmUgYWxsIGNvZGUgdGhhdCBzZXRzIGRlZmF1bHRzOyBtZF9iZWdpbgotCWhhbmRsZXMgYWxsIG9mIHRoaXMgbm93LgotCi1TdW4gTm92ICAyIDE0OjQ2OjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFNUQUdFU1RVRkYpOiBDaGFuZ2UgYmluX1BST0dSQU1TIHRvCi0Jbm9pbnN0X1BST0dSQU1TLgotCShib290c3RyYXAsIGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCByZWxvY3MgaW4gdGhlCi0JVE9DIHNlY3Rpb24gdG8gYmUgYWdhaW5zdCB0aGUgY3NlY3QuCi0KLUZyaSBPY3QgMzEgMTg6MTk6NTUgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHZhbGlkYXRlX21pcHNfaW5zbik6IE5ldyBmdW5jdGlvbiwgY2hlY2tzCi0JbWF0Y2ggdmVyc3VzIG1hc2sgYml0cywgYW5kIGFsc28gdmVyaWZpZXMgdGhhdCBhbGwgYml0cyB0byBiZQotCW91dHB1dCBhcmUgYWN0dWFsbHkgc3BlY2lmaWVkIHNvbWV3aGVyZS4KLQkobWRfYmVnaW4pOiBDYWxsIGl0IGZvciAzMi1iaXQgaW5zdHJ1Y3Rpb25zLCBpbnN0ZWFkIG9mIGRvaW5nCi0JbWF0Y2gvbWFzayBjaGVjayBoZXJlLiAgSW4gY2FzZSBvZiBmYWlsdXJlLCBwcmludCBhIG1lc3NhZ2UsIGJ1dAotCWNoZWNrIHRoZSByZXN0IG9mIHRoZSBvcGNvZGUgdGFibGUgYmVmb3JlIGV4aXRpbmcuCi0KLVRodSBPY3QgMzAgMTM6NDY6MjAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogRml4IHRodW1iIEFEUiBwc2V1ZG8gb3AuICBQYXRjaAotCWZyb20gVG9ueSBUaG9tcHNvbiBhdCBBUk06IGF0aG9tcHNvQGFybS5jb20KLQotVGh1IE9jdCAzMCAxMToxMToyNiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoYnVpbGRfaW5zbik6IEFsbG93IG9kZCByZWdpc3RlcnMgZm9yIGxkMncgYW5kCi0JZnJpZW5kcy4KLQotRnJpIE9jdCAyNCAxNTo1Njo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXNzZW1ibGUpOiBXaGVuIGhhbmRsaW5nIEBsLCBhbHdheXMgc2lnbgotCWV4dGVuZCBpZiB0aGUgb3BlcmFuZCBleHBlY3RzIGEgc2lnbmVkIHZhbHVlLgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChMT0NBTF9MQUJFTFNfRE9MTEFSKTogRG9uJ3QgZGVmaW5lOyB1c2UKLQlkZWZhdWx0IHdoaWNoIGlzIHRvIHBlcm1pdCBkb2xsYXIgbGFiZWxzLgotCi1GcmkgT2N0IDI0IDExOjE5OjIyIDE5OTcgIEpha3ViIEplbGluZWsgIDxqakBzdW5zaXRlLm1mZi5jdW5pLmN6PgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfbWVtb3J5X21vZGVsKTogTmV3IHZhcmlhYmxlLgotCShtZF9sb25nb3B0cyk6IEFkZCAtVFNPLy1QU08vLVJNTyBvcHRpb25zLgotCShtZF9wYXJzZV9vcHRpb25zKTogSGFuZGxlIHRoZW0uCi0JKHNwYXJjX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogRm9yIDY0IEVMRiwgc2V0IHJlcXVpcmVkCi0JbWVtb3J5IG9yZGVyaW5nIGluIGVfZmxhZ3MuIERlZmF1bHQgdG8gUk1PIGFuZCBsZXQgdGhlIHVzZXIKLQlvdmVycmlkZSBpdCB0aHJvdWdoIGNvbW1hbmQgbGluZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKGVsZl90Y19maW5hbF9wcm9jZXNzaW5nKTogQWRkLgotCi1XZWQgT2N0IDIyIDE3OjQyOjEyIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh2OWFfYXNyX3RhYmxlKTogTmV3IHZhcmlhYmxlLgotCShzcGFyY19pcCk6IEhhbmRsZSB2OWEgYXNyJ3MuCi0JUGF0Y2ggZnJvbSBEYXZpZCBNaWxsZXIgPGRhdmVtQHZnZXIucnV0Z2Vycy5lZHU+LgotCi1XZWQgT2N0IDIyIDE3OjIyOjU5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChtZF9kb19hbGlnbik6IE5ldyBtYWNyby4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19oYW5kbGVfYWxpZ24pOiBIYW5kbGUgcnNfYWxpZ25fY29kZS4KLQlQYXRjaCBmcm9tIEpha3ViIEplbGluZWsgPGpqQHN1bnNpdGUubWZmLmN1bmkuY3o+LgotCi1XZWQgT2N0IDIyIDEyOjUxOjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKHNoX3NtYWxsKTogTmV3IHZhcmlhYmxlLgotCShPUFRJT05fU01BTEwpOiBEZWZpbmUuCi0JKG1kX2xvbmdvcHRzKTogQWRkICJzbWFsbCIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBPUFRJT05fU01BTEwuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC1zbWFsbC4KLQkqIGNvbmZpZy90Yy1zaC5oIChzaF9zbWFsbCk6IERlY2xhcmUuCi0JKFNVQl9TRUdNRU5UX0FMSUdOKTogSGFuZGxlIHNoX3NtYWxsLgotCSogY29uZmlnL29iai1jb2ZmLmggKFRBUkdFVF9GT1JNQVQpOiBDaGVjayBzaF9zbWFsbCBpbiBUQ19TSAotCWNhc2UuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogQ29ycmVjdCBoYW5kbGluZyBvZiBjb25zdGFudCBpbiBNX0xJX0QKLQljYXNlIGluIGxpdHRsZSBlbmRpYW4gbW9kZS4KLQotVHVlIE9jdCAyMSAxMDoyMDoxMSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4MywgY2FzZXMgLi4uX0g0NCwgLi4uX0hJWDIyKTogTGVhdmUKLQlvdmVyZmxvdyBzaWduYWxsaW5nIHRvIGxpbmtlci4KLQotTW9uIE9jdCAyMCAxNDo1NDowNiAxOTk3ICBLbGF1cyBLImFtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBGaXggZm9yIGRlYyBjLgotCi0JKiBjb25maWctZ2FzLmNvbTogR2l2ZSBleHBsYW5hdGlvbiBmb3IgZGVjIGMgc2V0dXAgaW4gZXJyb3IKLQltZXNzYWdlLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV9jb21tKTogTWFrZSAuY29tbSBzeW1ib2xzIHNlcGFyYXRlCi0Jc2VjdGlvbnMgb24gb3BlbnZtcy9hbHBoYS4KLQotCSogY29uZmlnL29iai1ldmF4LmM6IHN1cHBvcnQgLndlYWsgcHNldWRvLW9wCi0KLU1vbiBPY3QgMjAgMTA6MTM6MzIgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGRlZmF1bHRfYXJjaF9zaXplKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoc3RydWN0IHNwYXJjX2FyY2gpOiBSZW5hbWUgYXJjaF9zaXplIHRvIGRlZmF1bHRfYXJjaF9zaXplLgotCU5ldyBtZW1iZXIgdXNlcl9vcHRpb25fcC4KLQkoc3BhcmNfYXJjaF90YWJsZSk6IEFsd2F5cyBpbmNsdWRlIHY5LCB2OWEuICBOZXcgZW50cnkgdjktNjQuCi0JKGluaXRfZGVmYXVsdF9hcmNoKTogQ2hlY2sgd2hldGhlciBkZWZhdWx0IGFyY2ggaXMgdmFsaWQuCi0JU2V0IGRlZmF1bHRfYXJjaF9zaXplIGluIGFkZGl0aW9uIHRvIHNwYXJjX2FyY2hfc2l6ZS4KLQkoT1BUSU9OXzMyLE9QVElPTl82NCk6IERlZmluZS4KLQkobWRfbG9uZ29wdHMpOiBOZXcgZW50cmllcyBmb3IgLTMyLCAtNjQuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSB0aGVtLgotCShtZF9zaG93X3VzYWdlKTogUHJpbnQgdGhlbS4gIEVuc3VyZSBpbml0X2RlZmF1bHRfYXJjaCBjYWxsZWQuCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjNjQpOiBTZXQgYXJjaCB0byB2OS02NC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVN1biBPY3QgMTkgMTM6NTA6NTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChzdWJzZWdzX2ZpbmlzaCk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCXdyaXRlX29iamVjdF9maWxlLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IFNvbWUgY29kZSBtb3ZlcyBpbnRvIHN1YnNlZ3NfZmluaXNoLgotCSogd3JpdGUuYyAoc3Vic2Vnc19maW5pc2gpOiBEZWNsYXJlLgotCSogYXMuYyAobWFpbik6IENhbGwgc3Vic2Vnc19maW5pc2guCi0KLQkqIHJlYWQuYyAoc19pbmNsdWRlKTogQ2hlY2sgZm9yIGVycm9yIHJldHVybiBmcm9tCi0JZGVtYW5kX2NvcHlfc3RyaW5nLgotCi1UdWUgT2N0IDE0IDIwOjUwOjU4IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZ2V0X2xpbmVfc2IpOiBBY2NlcHQgYW55IGVvbCBtYXJrZXIgd2hpbGUgc2Nhbm5pbmcgbWFjcm9zLgotCi1UdWUgT2N0IDE0IDE5OjEyOjQ1IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChESUZGX0VYUFJfT0spOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChESUZGX0VYUFJfT0spOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYXBwbHlfZml4KTogTm90aWNlIGZ4X3BjcmVsIGFuZCBzdWJzdGl0dXRlCi0JdGhlIGNvcnJlY3QgcmVsb2NhdGlvbiB3aGVuIGl0IGV4aXN0cy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLXBwYy5oOiBDb3JyZWN0IHR5cG8gaW4gY29tbWVudC4KLQkqIGNvbmZpZy90Yy12ODUwLmg6IExpa2V3aXNlLgotCi1GcmkgT2N0IDEwIDE2OjA5OjM1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBBbGxvdyBwYXJhbGxlbCBpbnN0cnVjdGlvbiBpc3N1ZQotIAl3aGVuIHNlY29uZCBpbnN0cnVjdGlvbiBpcyB3cml0aW5nIHRvIGZpcnN0IGluc3RydWN0aW9ucyBpbnB1dHMuCi0JCi1Nb24gT2N0IDEzIDE1OjI3OjE3IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKFBBR0VfU0laRSk6IERvdWJsZSB0byA4ayBhcyBhIGhhY2sgdG8gYWxsb3cgc29tZSBDKysKLQl0ZW1wbGF0ZWQgcHJvZ3JhbXMgdG8gYnVpbGQgd2l0aCAtZy4KLQotRnJpIE9jdCAxMCAxNzo0ODoyOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9yZWxheF90YWJsZSk6IEFkZCBzdXBwb3J0IGZvciByZWxheGluZwotCXVuY29uZGl0aW9uYWwgYnJhbmNoZXMuICBUaGlzIHBhdGNoIGlzIGNvdXJ0ZXN5IG9mIEppbSBXaWxzb24uIAotCShtZF9jb252ZXJ0X2ZyYWcpOiBGaXggcmVsYXhpbmcgb2YgYnJhbmNoZXMuICBUaGlzIHBhdGNoIGlzCi0JY291cnRlc3kgb2YgSmltIFdpbHNvbi4KLQkobWRfYXNzZW1ibGUpOiBDcmVhdGUgZGlmZmVyZW50IGZpeHVwcyBmb3IgY29uZGl0aW9uYWwgYW5kCi0JdW5jb25kaXRpb25hbCBicmFuY2hlcy4gIFRoaXMgcGF0Y2ggaXMgY291cnRlc3kgb2YgSmltIFdpbHNvbi4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBFc3RpbWF0ZSBzaXplIG9mIHZhcmlhYmxlIHBhcnQgb2YKLQlmaXh1cCBiYXNlZCBvbiB3aGV0aGVyIGl0IGlzIGZvciBhIGNvbmRpdGlvbmFsIG9yIGFuIHVuY29uZGl0aW9uYWwKLQlicmFuY2guICBUaGlzIHBhdGNoIGlzIGNvdXJ0ZXN5IG9mIEppbSBXaWxzb24uCi0JKHY4NTBfc2RhdGEsIHY4NTBfdGRhdGEsIHY4NTBfemRhdGEsIHY4NTBfc2Jzcywgdjg1MF90YnNzLAotCXY4NTBfemJzcywgdjg1MF9yb3NkYXRhLCB2ODUwX3JvemRhdGEsIHY4NTBfYnNzKTogQWRkIGNhbGwgdG8KLQlvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKS4gCi0JKHY4NTBfY29tbSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkIG5ldyBwc2V1ZG8gb3BzIC56Y29tbSwgLnNjb21tIGFuZCAudGNvbW0uCi0JKG1kX2JlZ2luKTogQWRkIGJzcyBmbGFnIHRvIHNlZ19pbmZvIG9mIGJzcyBzZWN0aW9ucy4KLQotCUFkZCBzdXBwb3J0IGZvciAuc2NvbW1vbiwgLnRjb21tb24gYW5kIC56Y29tbW9uIHNlY3Rpb25zLgotCi0JKiBjb25maWcvdGMtdjg1MC5oIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IEFkZCAuc2NvbW1vbiwKLQkuemNvbW1vbiwgLnRic3MsIC5jYWxsX3RhYmxlX2RhdGEgYW5kIC5jYWxsX3RhYmxlX3RleHQuCi0KLUZyaSBPY3QgMTAgMTU6MDE6MTQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzcGFyYyk6IFNldCBERUZBVUxUX0FSQ0ggZnJvbSBjb3JyZWN0IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLUZyaSBPY3QgMTAgMTE6MjI6NDUgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeGVzIHRvIG1ha2Ugc3VyZSB0aGUgQVRfV09SRAotCWV4cHJlc3Npb24gaXMgbm90IGNvbmZ1c2VkIHdpdGggLTEuCi0KLUZyaSBPY3QgMTAgMTE6NTQ6NTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IEZsYWcgU1AgYXMgbW9kaWZpZWQgZm9yIEAtc3AKLSAJb3BlcmFuZCAtIE9QRVJBTkRfQVRNSU5VUy4KLQotRnJpIE9jdCAxMCAwMDo0Nzo0NCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBOb3RlIHRoYXQgYXV0byBpbmNyZW1lbnQgYW5kCi0JZGVjcmVtZW50IG1vZGlmeSB0aGUgaW5kZXggcmVnaXN0ZXIuCi0KLVRodSBPY3QgIDkgMTU6MTc6NTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBSb2JpbiBLaXJraGFtIDxSb2Jpbi5LaXJraGFtQG1sYi5kbXQuY3Npcm8uYXU+OgotCSogY29uZmlnL3RjLW02OGsuYyAoYXJjaHMpOiBBZGQgNjgzMDYsIDY4MzA3LCA2ODMyMiwgNjgzNTYsIDY4MzM0LAotCTY4MzM2LCA2ODM0MSwgNjgzNDkuCi0JKiBkb2MvYy1tNjhrLnRleGkgKE02OEstT3B0cyk6IEFkZCAtbTY4ZWMwMDAgLW02OGhjMDAwIC1tNjhoYzAwMQotCS1tNjgzMDYsIC1tNjgzMDcsIC1tNjgzMjIsIC1tNjgzNTYsIC1tNjhlYzAyMCwgLW02OGVjMDMwLAotCS1tNjhlYzA0MCwgLW02OGVjMDYwLCAtbTY4MzMwLCAtbTY4MzM0LCAtbTY4MzM2LCAtbTY4MzQxLAotCS1tNjgzNDkuCi0KLQkqIGRvYy9NYWtlZmlsZS5hbSAoQ1BVX0RPQ1MpOiBEZWZpbmUuCi0JKGFzLmluZm8pOiBEZXBlbmQgdXBvbiAkKENQVV9ET0NTKS4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgQU1fUFJPR19JTlNUQUxMOyBpdCdzIGNhbGxlZCBieQotCUFNX0lOSVRfQVVUT01BS0UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBPY3QgIDkgMDE6NDQ6MzYgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogdGMtZDEwdi5oIChUQ19TVEFSVF9MQUJFTCk6IERvbid0IGRlZmluZS4KLQkodGNfZnJvYl9sYWJlbCk6IERlZmluZS4KLQotVGh1IE9jdCAgOSAwMDowNzoyMyAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtZDEwdi5jICh3cml0ZV8yX3Nob3J0KTogRml4IGJ1ZyB0aGF0IHdvdWxkbid0IGFsbG93Ci0JdG8gcGFpciBhIGJyYW5jaCBhbmQgbGluayB3aXRoIGFueXRoaW5nIGJ1dCBhbiBleGUgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBPY3QgIDggMTY6Mjg6NTMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IERpc2FibGUgdGhlIHN5bStjb25zdCAuZ290Ci0Jb3B0aW1pemF0aW9uIHRvIHJlZHVjZSB0aGUgYWxpZ25tZW50IHN1cnByaXNlcyBmb3IgZ2NjLgotCi1XZWQgT2N0ICA4IDE2OjExOjE1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChUQ19TUEFSQyk6IERvbid0IGRlZmluZSBUQVJHRVRfRk9STUFULgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX3RhcmdldF9mb3JtYXQpOiBIYW5kbGUgY29mZiBoZXJlLgotCShzcGFyY19pcCk6IEFkZCAlaGl4LCVsb3guCi0JKG1kX2FwcGx5X2ZpeDMpOiBDYWxsIGFzX2JhZF93aGVyZSwgbm90IGFzX2JhZC4KLQlBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX1NQQVJDX3tISVgyMixMT1gxMH0uCi0JKHRjX2dlbl9yZWxvYyk6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfU1BBUkNfe0hJWDIyLExPWDEwfS4KLQotV2VkIE9jdCAgOCAxMjozMzozMiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBhbHBoYS0qLSogdG8gYWxwaGEqLSotKjsgY29uZmlnLmd1ZXNzIG5vdwotCXJlY29nbml6ZXMgYWxwaGFldjUgZXRjLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgT2N0ICA4IDAwOjA0OjA1IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IFJlcGxhY2UgdGhlIFRBUkdFVF9DUFUgdmFsdWUKLQlvZiBtaXBzcjM5MDAgd2l0aCBtaXBzdHgzOS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IHByaW50IHRoZSAnb3Bjb2RlIHJlcXVpcmVzIAotCS1taXBzWFggbWVzc2FnZScgaWYgdGhlIGluc24gaXNuJ3QgYW4gSVNBIGluc24uCi0KLVR1ZSBPY3QgIDcgMTI6NDg6MzAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9GT1JNQVQgc3VwcG9ydCk6IE1vdmVkIHRvIHRjLXNwYXJjLmMuCi0JUmVkZWZpbmUgVEFSR0VUX0ZPUk1BVCB0byBjYWxsIHNwYXJjX3RhcmdldF9mb3JtYXQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoaW5fdW5zaWduZWRfcmFuZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2FyY2hfc2l6ZSk6IE1ha2Ugc3RhdGljLgotCShzcGFyY190YXJnZXRfZm9ybWF0KTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19pcCk6IERlbGV0ZSB2YXJpYWJsZSBpbW1lZGlhdGVfbWF4LiAgUmV3cml0ZSAlaGkvZXRjIHJlbG9jCi0JaGFuZGxpbmcuICBBZGQgc3VwcG9ydCBmb3IgJWhoLCVobSwlbG0sJWg0NCwlbTQ0LCVsNDQuCi0JKG91dHB1dF9pbnNuKTogU2V0IGBmeF9ub19vdmVyZmxvdycuCi0JKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgQkZEX1JFTE9DX1NQQVJDX3s3LEg0NCxNNDQsTDQ0fS4KLQkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLU1vbiBPY3QgIDYgMTQ6MDQ6NTAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9zZWN0aW9uKTogUmVtb3ZlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBFbmhhbmNlIGVycm9yIG1lc3NhZ2UuCi0KLUZyaSBPY3QgIDMgMTU6NDA6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBVbmRlZiBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyBiZWZvcmUKLQlpbmNsdWRpbmcgb2JqLWVsZi5oIGluIE9CSl9NQVlCRV9FTEYgY2FzZS4KLQkobWlwc190YXJnZXRfZm9ybWF0KTogUmV0dXJuIE5VTEwgYWZ0ZXIgYWJvcnQgdG8gYXZvaWQgd2FybmluZy4KLQotCSogZWNvZmYuYyAoZ2VuZXJhdGVfZWNvZmZfc3RhYik6IFJlbW92ZSB1bnVzZWQgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBleHByLmMgKG9wZXJhdG9yKTogQWNjZXB0ID09LiAgRnJvbSBBbmRlcnMgQmxvbWRlbGwKLQk8YW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlPi4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChnZW5fdG9fd29yZHMpOiBXaGVuIGdlbmVyYXRpbmcgYSBkZW5vcm1hbAotCW51bWJlciwgaGFuZGxlIGFuIG92ZXJmbG93IGludG8gdGhlIHNtYWxsZXN0IG5vcm1hbGl6ZWQgbnVtYmVyLgotCi1Nb24gU2VwIDI5IDE1OjI0OjUyIDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogYXMuaCwgaW5wdXQtc2NydWIuYyAobmV3X2xvZ2ljYWxfbGluZSk6IE5ldyByZXR1cm4gdmFsdWUuCi0JKiByZWFkLmMgKHNfYXBwX2ZpbGUpOiBEb24ndCBub3RlIHRoZSBzYW1lIGZpbGUgc2V2ZXJhbCB0aW1lcwotCWluIGEgcm93LgotCi1UaHUgU2VwIDI1IDEzOjA4OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFJlbW92ZSBgIG9wZXJhbmQgc3BlY2lmaWVyLgotCi1XZWQgU2VwIDI0IDE2OjU0OjQwIDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluIChzaCotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIHNoLSotZWxmKi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIFNlcCAyNCAxMTozMDoyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBIYW5kbGUgcSBhbmQgdiBvcGVyYW5kIHNwZWNpZmllcnMuCi0KLQkqIGRvYy9jLWkzODYudGV4aSAoaTM4Ni1GbG9hdCk6IFJlbW92ZSBpbmNvcnJlY3QgYXNzZXJ0aW9uIHRoYXQKLQlmbiogaW5zdHJ1Y3Rpb25zIGRvIG5vdCBpbnNlcnQgaW1wbGljaXQgZndhaXQuICBUaGlzIHdhcyBjaGFuZ2VkCi0JSmFuIDI5LCAxOTk2LgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55ICh5eWxleCk6IFBlcm1pdCBhbiBleHByZXNzaW9uIHRvIGJlIHVzZWQgZm9yCi0JdGhlIHNjYWxlIGZhY3Rvci4KLQotCSogTWFrZWZpbGUuYW0gKEVYVFJBX2FzX25ld19TT1VSQ0VTKTogU2V0IHRvIGNvbmZpZy9tNjhrLXBhcnNlLnksCi0Jbm90IG02OGstcGFyc2UueS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBTZXAgMjMgMTc6NDg6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBDbGVhciBtcmlfc3RhdGUgYXQgZW5kIG9mIC5tcmkKLQlwc2V1ZG8tb3AuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGhpbG9faW50ZXJsb2Nrcyk6IENoYW5nZSBmcm9tIGEgc3RhdGljCi0JdmFyaWFibGUgdG8gYSBtYWNybywgc28gdGhhdCBpdCB2YXJpZXMgd2l0aCB0aGUgdmFyaWFibGVzIHVwb24KLQl3aGljaCBpdCBkZXBlbmRzLgotCShncHJfaW50ZXJsb2NrcywgY29wX2ludGVybG9ja3MpOiBMaWtld2lzZS4KLQkobWRfYmVnaW4pOiBEb24ndCBpbml0aWFsaXplIHRoZW0uCi0KLUZyaSBTZXAgMTkgMTc6MDg6NDEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IFVzZSBzdHJjYXNlY29tcCBpbnN0ZWFkCi0Jb2Ygc3RyY21wIHdoZXJlIGFwcHJvcHJpYXRlLgotCi1UaHUgU2VwIDE4IDE0OjExOjU2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ29wZSB3aXRoIGEgemVybyBkYXRhIGFyZWEKLQlyZWxvY2F0aW9uIHdpdGggYSBjb25zdGFudCBvZmZzZXQuCi0JKG1kX2Fzc2VtYmxlKTogUHJvZHVjZSBlcnJvciBtZXNzYWdlIHdoZW4gc3BlY2lhbCBkYXRhIGFyZWEKLQlyZWxvY2F0aW9ucyBhcmUgdXNlZCBvbiBpbnN0cnVjdGlvbnMgd2hpY2ggZG8gbm90IHN1cHBvcnQgdGhlbS4KLQkobWRfYXNzZW1ibGUpOiBSZXNldCBwcm9jZXNzb3IgbWFzayBpZiBkZWZpbmVkIGJ5IGNvbW1hbmQgbGluZQotCXN3aXRjaC4gCi0KLVRodSBTZXAgMTggMTE6MjQ6MDEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmM6IFJlb3JnYW5pemUgZmlsZS4KLQkocGFyc2Vfa2V5d29yZF9hcmcpOiBBbGxvdyBudW1iZXJzIGluIHJlZyBuYW1lcy4KLQkoU1BFQ0lBTF9DQVNFX05PTkUpOiBOZXcgbWFjcm8uCi0JKG1kX2Fzc2VtYmxlKTogVXNlIGl0LgotCShsb29rdXBfYXJjaCxpbml0X2RlZmF1bHRfYXJjaCk6IE5ldyBmdW5jdGlvbnMuCi0JKGRlZmF1bHRfYXJjaCxkZWZhdWx0X2luaXRfcCxzcGFyY19hcmNoX3RhYmxlKTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKHNwYXJjX2FyY2hfc2l6ZSk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKG1heF9hcmNoaXRlY3R1cmUpOiBJbml0aWFsaXplIGluIGluaXRfZGVmYXVsdF9hcmNoLgotCShtZF9wYXJzZV9vcHRpb25zKTogQ2FsbCBpbml0X2RlZmF1bHRfYXJjaCBpZiBuZWNlc3NhcnkuCi0JUmV3cml0ZSAteGFyY2gvLUEgcHJvY2Vzc2luZy4KLQkobWRfc2hvd191c2FnZSk6IFByaW50IC1BIHZhbHVlcyBmcm9tIHNwYXJjX2FyY2hfdGFibGUuCi0JKG1kX2JlZ2luKTogQ2FsbCBpbml0X2RlZmF1bHRfYXJjaCBpZiBuZWNlc3NhcnkuCi0JKHNwYXJjX21kX2VuZCk6IEhhbmRsZSBib3RoIDMyIGFuZCA2NCBiaXQgZW52aXJvbm1lbnRzLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9GT1JNQVQpOiBMaWtld2lzZS4KLQkqIGFjY29uZmlnLmggKFNQQVJDX1Y5LFNQQVJDX0FSQ0g2NCk6IERlbGV0ZS4KLQkoREVGQVVMVF9BUkNIKTogQWRkLgotCSogY29uZmlnLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluIChzcGFyYyk6IERlZmF1bHQgREVGQVVMVF9BUkNIIGJhc2VkIG9uIHRhcmdldCBjcHUuCi0JKFNQQVJDX1Y5LFNQQVJDX0FSQ0g2NCk6IERlbGV0ZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZy92bXMtY29uZi5oIChTUEFSQ19WOSxTUEFSQ19BUkNINjQpOiBEZWxldGUuCi0KLVdlZCBTZXAgMTcgMTY6NTQ6MjAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9yZWxvY19wcmVmaXgpOiBSZWNvZGVkIHRvIHVzZSBDSEVDS18gKCkKLQltYWNyby4gCi0JKGhhbmRsZV90ZGFvZmYsIGhhbmRsZV96ZGFvZmYsIGhhbmRsZV9zZGFvZmYpOiBOZXcgZnVuY3Rpb25zLgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IENvcnJlY3RlZCB0eXBvLgotCSogY29uZmlnL3RjLXY4NTAuYyBBZGQgbmV3IHNlY3Rpb25zOiBjYWxsX3RhYmxlX2RhdGEgYW5kCi0JY2FsbF90YWJsZV90ZXh0LgotCSh2ODUwX3JlbG9jX3ByZWZpeCk6IEFkZCBzdXBwb3J0IGZvciBjdG9mZigpIHJlbG9jYXRpb24gcHJlZml4LiAKLQkoaGFuZGxlX2N0b2ZmKTogTmV3IEZ1bmN0aW9uLgotCi0JKiBkb2MvYy12ODUwLnRleGkgKFY4NTAgT3Bjb2Rlcyk6IERvY3VtZW50IGNhbGwgdGFibGUgcmVsb2NhdGlvbnMuCi0KLVR1ZSBTZXAgMTYgMTQ6MTg6MjIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9yZWxvY19wcmVmaXgpOiBBZGQgc3VwcG9ydCBmb3IgYSAxNiBiaXQKLQlkaXNwbGFjZW1lbnQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4KLQotTW9uIFNlcCAxNSAyMToyODowOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IE1ha2UgZGVjbGFyYXRpb24gbWF0Y2gKLQlkZWZpbml0aW9uLgotCi1Nb24gU2VwIDE1IDE4OjMzOjA2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHByb2Nlc3Nvcl9tYXNrKTogTmV3IHZhcmlhYmxlLgotCShzZXRfbWFjaGluZSwgbWRfcGFyc2Vfb3B0aW9uKTogU2V0IHByb2Nlc3Nvcl9tYXNrLgotCShtZF9hc3NlbWJsZSk6IENoZWNrIHRoYXQgaW5zdHJ1Y3Rpb24gaXMgYXZhaWxhYmxlIHRvIHRhcmdldAotCXByb2Nlc3Nvci4gCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKFRBUkdFVF9QUk9DRVNTT1IpOiBOZXcgY29uc3RhbnQuCi0KLU1vbiBTZXAgMTUgMTE6Mjg6MDQgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNZXJnZSBpbiB3b3JrIGZyb20gTWFydGluIEh1bnQ6Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGJ1aWxkX2luc24pOiBGb3IgbXZmc3lzIGFuZCBtdnRzeXMsCi0JQ1IgaXMgMCBmb3IgUFNXTCBhbmQgUFNXSC4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZG9fYXNzZW1ibGUpOiBEb24ndCBhY2NlcHQKLQlpbGxlZ2FsIGNvbmRpdGlvbiBjb2RlcyBmb3IgY21wdSBpbnN0cnVjdGlvbi4KLQotCSogY29uZmlnL3RjLWQzMHYuYzogQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ19EMzBWXzlfUENSRUwKLQl1c2VkIGluIGQqaSBpbnN0cnVjdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGNoZWNrX3NpemUpOiBOZXcgZnVuY3Rpb24uICBDaGVjawotCXJlbG9jYXRpb25zIGZvciBvdmVyZmxvd3MuCi0JKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IEZpeCByZWxvY2F0aW9ucyBiZXR3ZWVuIHNlY3Rpb25zLgotCShtZF9hcHBseV9maXgzKTogVXNlIG5ldyByZWxvY2F0aW9uIHR5cGVzIGZvciAxNSBhbmQgMjEKLQliaXQgcmVsb2NhdGlvbnMgaW4gdGhlIHJpZ2h0IGNvbnRhaW5lci4gTmVlZGVkIGJlY2F1c2UKLQl0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IGVpZ2h0LWJ5dGUgYWxpZ25lZAotCWJ1dCB0aGUgcmVsb2NhdGlvbnMgbXVzdCBiZS4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXBwbHlfZml4Myk6IENoZWNrIGZvciBvdmVyZmxvdy4KLQkoZmluZF9mb3JtYXQpOiBJZiAiLnMiIG9yICIubCIgYXJlIHVzZWQsIGRvbid0IHRyeQotCXRvIGNvbXB1dGUgYnJhbmNoIHNpemVzLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IENoZWNrIGZvciAiLnMiIG9yCi0JIi5sIiBleHRlbnNpb25zIHRvIG9wY29kZSBuYW1lcy4KLQkoZmluZF9mb3JtYXQpOiBHZW5lcmF0ZSB0aGUgY29ycmVjdCBpbnN0cnVjdGlvbnMgd2hlbgotCSIucyIgb3IgIi5sIiBhcmUgdXNlZC4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoYnVpbGRfaW5zbik6IENoZWNrIGZvciBvZGQgcmVnaXN0ZXJzCi0Jb24gaW5zdHJ1Y3Rpb25zIHRoYXQgcmVxdWlyZSBldmVuIHJlZ2lzdGVycy4KLQotCSogY29uZmlnL3RjLWQzMHYuaCAobWRfc3RhcnRfbGluZV9ob29rKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfc3RhcnRfbGluZV9ob29rKTogTmV3IGhvb2suCi0JQ2hlY2tzIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lIGZvciBhICIuIi4gIElmIGl0Ci0JZmluZHMgb25lLCBhc3N1bWUgYSBwc2V1ZG8tb3AgYW5kIGZsdXNoIGFueSB1bndyaXR0ZW4KLQlpbnN0cnVjdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggcHJvYmxlbQotCXdpdGggZGV0ZXJtaW5pbmcgd2hlbiBmaXh1cHMgd2VyZSBkb25lLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChidWlsZF9pbnNuKTogRml4IGJ1ZyB3aGVyZSB0aGUgbnVtZXJpYwotCXBhcnQgb2YgYSBzeW1ib2wgKGZvciBleGFtcGxlLCAiZm9vKzgiKSB3YXMgYmVpbmcgd3JpdHRlbgotCWludG8gdGhlIGluc3RydWN0aW9uLgotCShtZF9wc2V1ZG9fdGFibGUpOiBDaGFuZ2UgLndvcmQgdG8gYmUgMzIgYml0cyBhbmQgYWRkCi0JLmh3b3JkIGFzIDE2IGJpdHMuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogQ2hlY2sgdG8gc2VlIGlmIGZpcnN0Ci0JaW5zdHJ1Y3Rpb24gaXMgYSBqdW1wLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IE1ham9yIGNvZGUgcmVvcmdhbml6YXRpb24uCi0KLVdlZCBTZXAgMTAgMTA6MDc6MDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDb3JyZWN0ZWQgc3BlbGxpbmcgbWlzdGFrZS4KLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCB2ODUwIGVtdWxhdGlvbi4KLQotVHVlIFNlcCAgOSAxNzoxNDozMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ1BVX1RZUEVTKTogQWRkIGFyYy4KLQkoVEFSR0VUX0NQVV9DRklMRVMpOiBBZGQgdGMtYXJjLmMuCi0JKFRBUkdFVF9DUFVfSEZJTEVTKTogQWRkIHRjLWFyYy5oLgotCShkZXBlbmRlbmNpZXMpOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBhcmMtKi1lbGYqLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZy90Yy1hcmMuW2NoXTogTmV3IGZpbGVzLgotCi1UdWUgU2VwICA5IDEwOjE5OjM3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLXY4NTAudGV4aSAoVjg1MCBPcGNvZGVzKTogRG9jdW1lbnQgaGkwKCkgcmVsb2MgcHJlZml4LgotCUNvcnJlY3QgZGVzY3JpcHRpb24gb2YgaGkoKSByZWxvYyBwcmVmaXguCi0KLQkqIGRvYy9jLXY4NTAudGV4aSAoVjg1MCBPcGNvZGVzKTogRG9jdW1lbnQgbmV3IHJlbG9jIHByZWZpeC4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfcmVsb2NfcHJlZml4KTogQWRkIGhpbG8oKSByZWxvYyBwcmVmaXguCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfMzIuCi0KLQkqIGRvYy9jLXY4NTAudGV4aTogRG9jdW1lbnQgbmV3IHBzZXVkbyBvcHMgYW5kIGNvbW1hbmQgbGluZQotCW9wdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHNldF9tYWNoaW5lKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLXY4NTAuYyAoLnY4NTApOiBOZXcgcHNldWRvIG9wLgotCSogY29uZmlnL3RjLXY4NTAuYyAoLnY4NTBlKTogTmV3IHBzZXVkbyBvcC4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKC52ODUwZWEpOiBOZXcgcHNldWRvIG9wLgotCQotCi1Nb24gU2VwICA4IDIzOjA4OjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgLWFsaCBhbmQgLWFsZCBmb3IgRFdBUkYgMToKLQkqIGxpc3RpbmcuYyAoc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QpOiBBZGQgZGVidWdnaW5nIGZpZWxkLgotCShsaXN0aW5nX25ld2xpbmUpOiBJbml0aWFsaXplIHRoZSBkZWJ1Z2dpbmcgZmllbGQuICBJZiBFTEYsIGlmIHRoZQotCXNlY3Rpb24gc3RhcnRzIHdpdGggLmRlYnVnIG9yIC5saW5lLCBzZXQgdGhlIGRlYnVnZ2luZyBmaWVsZCBpbgotCXRoZSBsaXN0aW5nIHN0cnVjdHVyZS4KLQkoZGVidWdnaW5nX3BzZXVkbyk6IEFkZCBsaXN0IHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4gIElmCi0JdGhlIGRlYnVnZ2luZyBmaWVsZCBpcyBzZXQsIGNvbnNpZGVyIGl0IHRvIGJlIGEgZGVidWdnaW5nIHBzZXVkby4KLQlJZiBFTEYsIHNraXAgYmxhbmsgbGluZXMgYmV0d2VlbiBkZWJ1Z2dpbmcgbGluZXMuCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IElmIEVMRiwgbG9vayBmb3IgbGluZSBudW1iZXJzLgotCShzdHJpbmdlcik6IElmIEVMRiwgbG9vayBmb3IgZmlsZSBuYW1lcy4KLQotTW9uIFNlcCAgOCAxMjozMzo0MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2luc2VydF9vcGVyYW5kKTogT25seSB0ZXN0IGZvciBvdmVyZmxvdwotCWlmIHRoZXJlIGlzIG5vIGluc2VydCBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoVEFSR0VUX01BQ0hJTkUpOiBOZXcgY29uc3RhbnQuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfaW5zZXJ0X29wZXJhbmQpOiBBZGQKLQktbXdhcm5fdW5zaWduZWRfb3ZlcmZsb3cuIAotCShtZF9iZWdpbik6IFNldCBCRkQgbWFjaGluZSBudW1iZXIgYmFzZWQgb24gbWFjaGluZSB2YXJpYWJsZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIC1tdjg1MCwgLW12ODUwZSBhbmQgLW12ODUwZWEgb3B0aW9ucy4KLQotTW9uIFNlcCAgOCAxMToyMDo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmg6IERvbid0IGRlY2xhcmUgYWxsb2NhIGlmIGl0IGlzIGEgbWFjcm8uCi0JKiBtYWNyby5jOiBMaWtld2lzZS4KLQotU3VuIFNlcCAgNyAwMDozMDoxOSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLWFscGhhLmMgKG1kX3BhcnNlX29wdGlvbik6IE1vdmUgbVtdIG91dCB0byB0b3AgbGV2ZWwgYW5kCi0gICAgICAgIHJlbmFtZSB0byBjcHVfdHlwZXNbXS4KLSAgICAgICAgKHNfYWxwaGFfYXJjaCk6IE5ldyBmdW5jdGlvbi4KLSAgICAgICAgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiYXJjaCIuCi0KLSAgICAgICAgKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYmVnaW4pOiBNZXJnZSB0aGUgdHdvIGxvb3BzIHRocm91Z2ggdGhlCi0gICAgICAgIG9wY29kZSB0YWJsZS4KLSAgICAgICAgKHNfYWxwaGFfcHJvYyk6IEFkZCBpbml0aWFsIFNLSVBfV0hJVEVTUEFDRS4KLSAgICAgICAgKHNfYWxwaGFfc2V0KTogTGlrZXdpc2UuICBVc2UgZ2V0X3N5bWJvbF9lbmQgaW5zdGVhZCBsb2NhbCB3aGlsZSBsb29wLgotCi1TYXQgU2VwICA2IDE5OjM4OjEyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiByZWFkLmggKHNfbGNvbW1fYnl0ZXMpOiBBZGQgcHJvdG90eXBlIChmb3IgcmVhbCB0aGlzIHRpbWUpLgotCi1UaHUgU2VwICA0IDEyOjEwOjAxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogT25seSBzZXQgQlNGX09CSkVDVCBmb3IKLQlzeW1ib2xzIG9uIElyaXguCi0KLVdlZCBTZXAgIDMgMTE6MjE6MzMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogUmVtb3ZlIEJGRF9SRUxPQ19WODUwXzE2X1BDUkVMLgotCi1UdWUgU2VwICAyIDE4OjMyOjMwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucyBhcmV4Ci0JcmVsYXRpdmUgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIG5vdCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBTaW1pbGFybHkuCi0KLVR1ZSBTZXAgIDIgMTU6NTg6NTIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2Mtdjg1MC50ZXhpOiBFeHBsYW5hdGlvbnMgb2Ygb2Zmc2V0cyBpbiBTREEvWkRBIGFyZWFzCi0JY29ycmVjZXRkLiAKLQotCSogY29uZmlnL3RjLXY4NTAuYzogQWRkIHN1cHBvcnQgZm9yIFNEQS9UREEvWkRBIHNlY3Rpb25zLgotCSh2ODUwX3JlbG9jX3ByZWZpeCk6IER1cGxpY2F0ZSBjb2RlIGVsaW1pbmF0ZWQuICBBZGQgY29kZSB0bwotCXJlY29nbmlzZSBzcGVjaWFsIGluc3RydWN0aW9ucy4KLQkobWRfYXNzZW1ibGUpOiBDYWxjdWxhdGlvbiBvZiB0aGUgc2l6ZSBvZiBhIGZpeHVwcyBjb3JyZWN0ZWQuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogQWRkIFNEQS9UREEvWkRBCi0Jc2VjdGlvbnMuIAkKLQotVHVlIFNlcCAgMiAxNTo0MDo1NiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogVXNlIG9wY29kZS0+bmFtZSBpbnN0ZWFkIG9mCi0gCW9wY29kZS0+b3Bjb2RlIGFzIHRoZSBzZW50aW5hbC4gWmVybyBpcyBhIHZhbGlkIG9wY29kZS4KLQotVHVlIEF1ZyAyNiAxNjo1MToxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChNYWNoaW5lIERlcGVuZGVuY2llcyk6IEFkZCB2ODUwIHRvIG1lbnUuCi0JKiBkb2MvYy12ODUwLnRleGk6IENoYW5nZSBub2RlIG5hbWUgdG8gbWF0Y2ggb3RoZXIgY2hhcHRlciBub2Rlcy4KLQotVHVlIEF1ZyAyNiAwOTo0NjoyMiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy12ODUwLnRleGkgKFY4NTAgT3Bjb2Rlcyk6IENvcnJlY3QgbmFtZSBmb3IgdGlueSBkYXRhIGFyZWEKLQlwb2ludGVyLiAKLQotVHVlIEF1ZyAyNiAxMjoyMzoyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IElmIEJGRDY0LCBkb24ndCBtYWtlIGEgYmlnbnVtIGlmIHRoZQotCW51bWJlciB3aWxsIGZpdCBpbiA2NCBiaXRzLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogQ2hlY2sgZXhwbGljaXRseSBmb3IgT19iaWcsCi0JcmF0aGVyIHRoYW4gY2FsbGluZyBhYm9ydC4KLQotCSogYXMuaDogRG9uJ3QgZGVmaW5lIGFsbG9jYSBpZiBfX0dOVUNfXy4gIEp1c3QgZGVjbGFyZSBpdC4KLQkqIG1hY3JvLmM6IENvcHkgYWxsb2NhIGhhbmRsaW5nIGZyb20gYXMuaC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9hbGlnbl9jb2RlKTogQ29ycmVjdCAxNiBiaXQgbm9vcHMuICBGcm9tCi0JR2FicmllbCBQYXViZXJ0IDxwYXViZXJ0QGlyYW0uZXM+LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEluIEp1bXBCeXRlIGNhc2UsIHdoZW4gbG9va2luZwotCWZvciBhIFdPUkRfUFJFRklYX09QQ09ERSwgY2hhbmdlIGl0IHRvIEFERFJfUFJFRklYX09QQ09ERSBpZiB0aGlzCi0JaXMgamN4eiBvciBhIGxvb3AgaW5zdHJ1Y3Rpb24uCi0KLU1vbiBBdWcgMjUgMTY6MDQ6MTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQWRkICdocCcgYXMgYWxpYXMgZm9yCi0JcjIuCi0JKG1kX2JlZ2luKTogU2V0IHVwIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIGFuZCB0eXBlLgotCi1Nb24gQXVnIDI1IDE0OjI1OjQ4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IFN0b3JlIHRoZSB2YWx1ZSBiYWNrIGludG8gdGhlCi0Jc3ltYm9sIGV4cHJlc3Npb24sIHRvIGhhbmRsZSBhZGQgb3Igc3VidHJhY3Qgc2ltcGxpZmljYXRpb24KLQljb3JyZWN0bHkuICBIYW5kbGUgT19zeW1ib2xfcnZhLiAgQWRkIGRlZmF1bHQgY2FzZS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfY2hhbmdlX2NzZWN0KTogVGVtcG9yYXJpbHkgbG93ZXIgdGhlCi0JY2h1bmtzaXplIHdoaWxlIGNyZWF0aW5nIHRoZSBuZXcgc3Vic2VjdGlvbi4KLQkqIGFzLmMgKGNodW5rc2l6ZSk6IEluaXRpYWxpemUgdG8gemVyby4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogQ2hhbmdlIDUwMDAgdG8gY2h1bmtzaXplIHdoZW4KLQljYWxsaW5nIG9ic3RhY2tfYmVnaW4uCi0KLU1vbiBBdWcgMjUgMTE6MjE6NDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBSZXN0b3JlIGlucHV0X2xpbmVfcG9pbnRlciB1cG9uCi0JZXhpdC4gCi0JCi0JKiBjb25maWcvdGMtdjg1MC5jIChwYXJzZV9yZWdpc3Rlcl9saXN0KTogU3VwcG9ydCBjb25zdGFudAotCWV4cHJlc3Npb25zIGFzIHJlZ2lzdGVyIGxpc3RzLgotCi1Nb24gQXVnIDI1IDEwOjE5OjM0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLXY4NTAudGV4aTogQ2hhbmdlIHRoZSBtYWpvciBub2RlIHRvIHY4NTAgTWFjaGluZQotCURlcGVuZGVuY2llcy4gCi0KLUZyaSBBdWcgMjIgMTE6MTY6MTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IEFkZCBpbmNsdXNpb24gb2YgYy12ODUwLnRleGkKLQotCSogZG9jL2Mtdjg1MC50ZXhpOiBOZXcgZmlsZS4KLQotCSogcmVhZC5jIChpc19lbmRfb2ZfbGluZSk6IE1ha2UgTlVMIGNoYXJhY3RlciBiZSBjb25zaWRlcmVkIHRvIGJlCi0JYSBsaW5lIHRlcm1pbmF0b3IuCi0KLUZyaSBBdWcgMjIgMTA6NDU6MzMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAocGFyc2VfcmVnaXN0ZXJfbGlzdCk6IEFkZCBzdXBwb3J0IGZvciBjdXJseQotCWJyYWNlIHN5bnRheC4KLQkoY2NfbmFtZXMpOiBBZGQgImUiIGFuZCAibmUiIGNvbmRpdGlvbnMuCi0KLVRodSBBdWcgMjEgMTE6MDA6MzYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogU3VwcG9ydCBhIGRvdWJsZSBkYXNoIGFzIHN0YXJ0aW5nIGEKLQljb21tZW50IHRoYXQgZXh0ZW5kcyB0byBlbmQgb2YgbGluZS4KLQotVGh1IEF1ZyAyMSAxMDo1NDoyNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3NlY3Rpb24sIHY4NTBfYnNzLCB2ODUwX29mZnNldCk6IE5ldwotCWZ1bmN0aW9ucy4KLQkobWRfcHNldWRvX3RhYmxlKTogTmV3IHBzZXVkbyBvcHM6IC5ic3MsIC5vZmZzZXQsIC5zZWN0aW9uCi0KLVRodSBBdWcgMjEgMDA6NTk6NTMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBVcGRhdGUgcmVjb3JkZWQKLQlpbnNuIHdoZW4gY2hhbmdpbmcgdG8gYSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBBdWcgMjAgMDA6NDU6MjAgMTk5NyAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiB0Yy1zaC5jIChwYXJzZV9yZWcsIGdldF9zcGVjaWZpYywgYnVpbGRfTXl0ZXMpOiBBZGQgU0g0Ci0JZmxvYXRpbmcgcG9pbnQgZXh0ZW5zaW9ucy4KLQkocGFyc2VfcmVnKTogcGFyc2Ugc2dyIGFuZCBkYnIuCi0KLVR1ZSBBdWcgMTkgMTc6MDc6MzQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAoc3lzdGVtX3JlZ2lzdGVyX25hbWUpOiBTdXBwb3J0IG51bWJlcnMgZm9yCi0Jc3lzdGVtIHJlZ2lzdGVyIElEcy4KLQotVHVlIEF1ZyAxOSAwODo1OToxMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2xjb21tX2ludGVybmFsKTogUmVuYW1lZCBmcm9tIHNfbGNvbW0sIGFkZGVkIGFyZyB0bwotCWZsYWcgd2hlbiBhbGlnbm1lbnQgaXMgaW4gYnl0ZXMgaW5zdGVhZCBvZiBwb3dlciBvZiAyLCBhbmQgY29kZSB0bwotCXVzZSB0aGF0IGZsYWcgdG8gY29udmVydCBhbGlnbm1lbnQgdG8gYnl0ZXMuCi0JKHNfbGNvbW0sIHNfbGNvbW1fYnl0ZXMpOiAgTmV3IGhlbHBlcnMgdGhhdCBjYWxsIHNfbGNvbW1faW50ZXJuYWwuCi0JKiByZWFkLmggKHNfbGNvbW1fYnl0ZXMpOiBBZGQgcHJvdG90eXBlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgQUxJR05NRU5UX0lOX1NfRkxBR1MgaXMKLQlkZWZpbmVkLCB3cml0ZSBhbGlnbm1lbnQgdG8gYWxpZ25tZW50IGJpdHMgaW4gc2VjdGlvbiBoZWFkZXIgc19mbGFncwotCXJhdGhlciB0aGFuIHRoZSBzX2FsaWduIGZpZWxkLgotCSogY29uZmlnL29iai1jb2ZmLmggKEFMSUdOTUVOVF9JTl9TX0ZMQUdTKTogRGVmaW5lIGZvciBUQ19USUM4MC4KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9wc2V1ZG9fdGFibGUpOiBVc2Ugc19sY29tbV9ieXRlcyBmb3IgYnNzCi0JcHNldWRvLCBpbnN0ZWFkIG9mIHNfbGNvbW0gd2hpY2ggd2FudHMgYSBwb3dlciBvZiB0d28gZm9yIGFsaWdubWVudC4KLQotTW9uIEF1ZyAxOCAyMDo0MjoyMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBtYWNyby5jIChjaGVja19tYWNybyk6IHVzZSBhbGxvY2EgaW5zdGVhZCBvZiB4bWFsbG9jIHRvIHBsdWcgbGVhay4KLQotTW9uIEF1ZyAxOCAyMDozMzowNiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogQWRkIC1hbS4KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX2luY2x1ZGVfc2IpOiBEb24ndCBhZGQgbGVhZGluZyBcbgotCWlmIHdlJ3ZlIGFscmVhZHkgZ290IG9uZS4KLQkqIGxpc3RpbmcuYyAoc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QpOiBBZGQgbGluZV9jb250ZW50cy4KLQkobGlzdGluZ19uZXdsaW5lKTogUHV0IHVudXNlZCBhcmd1bWVudCB0byB3b3JrOiBpZiBub24tbnVsbCwgc2F2ZSBpdC4uLgotCShsaXN0aW5nX2xpc3RpbmcpOiAuLi4gYW5kIHJlZ3VyZ2l0YXRlIGR1cmluZyBsaXN0aW5nIGluc3RlYWQgb2YgbGluZQotCWZyb20gZmlsZS4KLQkqIGxpc3RpbmcuaCAoTElTVElOR19NQUNFWFApOiBOZXcgZGVmaW5lLgotCShMSVNUSU5HX05FV0xJTkUpOiBBcmd1bWVudCBpcyBOVUxMLgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJZiBleHBhbmRpbmcgbWFjcm9zLCBicmVhayB1cCBpbnB1dAotCWxpbmVzIGFuZCBwYXNzIHRoZW0gdG8gbGlzdGluZ19uZXdsaW5lLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IC1hYyBhbmQgLWFtLgotCi0JKiBjb25kLmMgKHNfaWZjKTogQWRkIG1pc3NpbmcgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZS4KLQotTW9uIEF1ZyAxOCAxMToyNjozNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hcHBseV9maXgzKTogQWRkIHN1cHBvcnQgZm9yIG5ldyAxNiBiaXQgUEMKLQlyZWxhdGl2ZSByZWxvYy4KLQotTW9uIEF1ZyAxOCAxMToyNDoyMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jOiBSZW1vdmUgc3VwcG9ydF92ODUwZSBmbGFnIGFuZCBjb21tYW5kIGxpbmUKLQlvcHRpb24uIAotCQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldAotCi0JKiBjb25maWd1cmUgKGVtdWxhdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0Ci0KLU1vbiBBdWcgMTggMTE6MjQ6MjEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogUmVtb3ZlIHN1cHBvcnRfdjg1MGVhIGZsYWcgYW5kIGNvbW1hbmQgbGluZQotCW9wdGlvbi4gCi0JCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldAotCi0JKiBjb25maWd1cmUgKGVtdWxhdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldAotCi1GcmkgQXVnIDE1IDE0OjAwOjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZWNrLURFSkFHTlUpOiBEb24ndCBjZCBpbnRvIHRlc3RzdWl0ZSB1bnRpbCBhZnRlcgotCXNldHRpbmcgRVhQRUNUIGFuZCBUQ0xfTElCUkFSWS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBhcy5oIChlbnVtIGRlYnVnX2luZm9fdHlwZSk6IERlZmluZS4KLQkoZGVidWdfdHlwZSk6IERlY2xhcmUuCi0JKiBhcy5jIChkZWJ1Z190eXBlKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoc2hvd191c2FnZSk6IEFkZCAtLWdzdGFicy4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSAtLWdzdGFicy4KLQkqIHJlYWQuYyAoZ2VuZXJhdGVfYXNtX2xpbmVubyk6IFJlbW92ZS4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogT3V0cHV0IHN0YWJzIGRlYnVnZ2luZyBpZiBhcHByb3ByaWF0ZS4KLQlDaGFuZ2UgY2hlY2tzIG9mIGdlbmVyYXRlX2FzbV9saW5lbm8gdG8gY2hlY2sgZGVidWdfdHlwZS4gIE9ubHkKLQlnZW5lcmF0ZSBFQ09GRiBkZWJ1Z2dpbmcgaWYgRUNPRkZfREVCVUdHSU5HIGlzIGRlZmluZWQuCi0JKiByZWFkLmggKGdlbmVyYXRlX2FzbV9saW5lbm8pOiBEb24ndCBkZWNsYXJlLgotCShzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vKTogRGVjbGFyZS4KLQkqIHN0YWJzLmMgKHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBOZXcgZnVuY3Rpb24uCi0JKiBlY29mZi5jIChhZGRfZmlsZSk6IFVzZSBkZWJ1Z190eXBlLCBub3QgZ2VuZXJhdGVfYXNtX2xpbmVuby4KLQlEb24ndCB0dXJuIG9mZiBkZWJ1Z2dpbmcuCi0JKGFkZF9maWxlKTogUmVtb3ZlIG9sZCAjaWYgMCBjb2RlLgotCShlY29mZl9uZXdfZmlsZSk6IFNldCBkZWJ1Z190eXBlLCBub3QgZ2VuZXJhdGVfYXNtX2xpbmVuby4KLQkoZWNvZmZfZGlyZWN0aXZlX2VuZCk6IERvbid0IGdlbmVyYXRlIHN0YWJzIGxpbmUgc3ltYm9scy4KLQkoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IERvbid0IGNoZWNrIHN0YWJzX3NlZW4uICBEb24ndCBzZXQKLQlnZW5lcmF0ZV9hc21fbGluZW5vLgotCShsaW5lX2xhYmVsX2NudCk6IFJlbW92ZS4KLQkoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYik6IFJlbW92ZS4KLQkqIGVjb2ZmLmggKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lX3N0YWIpOiBEb24ndCBkZWNsYXJlLgotCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy4xOiBEb2N1bWVudCAtLWdzdGFicy4KLQotV2VkIEF1ZyAxMyAxODo1ODo1NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSwgbWRfc2hvd191c2FnZSwgbWRfcGFyc2Vfb3B0aW9uKToKLQlBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIGluc3RydWN0aW9ucy4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUsIG1kX3Nob3dfdXNhZ2UsIG1kX3BhcnNlX29wdGlvbik6Ci0JQWRkIHN1cHBvcnQgZm9yIHY4NTBlIGluc3RydWN0aW9ucy4KLQkKLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogRml4IGVycm9yIHJlY292ZXJ5IHRvIHJlbG9hZAotCXRleHQgb2YgZW50aXJlIG9wY29kZS4gCi0KLVR1ZSBBdWcgMTIgMTA6Mjc6MzQgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZG9jL2ludGVybmFscy50ZXhpOiBEb2N1bWVudCByc19sZWIxMjguCi0KLVR1ZSBBdWcgMTIgMTI6MTc6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogR2l2ZSBhbiBlcnJvciBtZXNzYWdlIGZvciBTSVpFX0JZVEUKLQlpbiBBQlNMIGNhc2UsIHJhdGhlciB0aGFuIGNhbGxpbmcgYWJvcnQuCi0KLU1vbiBBdWcgMTEgMjE6NDg6MDAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoZW51bSBfcmVsYXhfc3RhdGUpOiBBZGQgcnNfbGViMTI4LgotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIHNsZWIxMjggYW5kIHVsZWIxMjguCi0JKHNpemVvZl8qbGViMTI4LCBvdXRwdXRfKmxlYjEyOCwgZW1pdF9sZWIxMjhfZXhwciwgc19sZWIxMjgpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKiByZWFkLmg6IFVwZGF0ZSBwcm90b3R5cGVzLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IFN0cmVhbWxpbmUgcXVpdGUgYSBiaXQuICBSZXR1cm4KLQl0aGUgc3ltYm9sIHZhbHVlLCBhZGQgYSBzZWNvbmQgRklOQUxJWkUgYXJndW1lbnQgdGhhdCBwcmV2ZW50cyAKLQljaGFuZ2VzIGZyb20gYmVpbmcgY29taXR0ZWQuICBVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsLCByZWxheF9zZWdtZW50KTogSGFuZGxlIHJzX2xlYjEyOC4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCB0aGUgbmV3IHBzZXVkb3MuCi0KLVN1biBBdWcgMTAgMTQ6NTE6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoTU9TVExZQ0xFQU5GSUxFUyk6IEFkZCBzaXRlLmJhaywgc2l0ZS5leHAsIHN0YWdlLAotCXN0YWdlMSwgYW5kIHN0YWdlMi4KLQkoRElTVENMRUFORklMRVMpOiBEZWZpbmUuCi0JKiBkb2MvTWFrZWZpbGUuYW0gKERJU1RDTEVBTkZJTEVTKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEF1ZyAgNiAwMDozMDozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGlmIGVuZGlhbiBpcyBzZXQuCi0JRG9uJ3Qgc2V0IHRhcmcgb3IgZ2FzX3RhcmdldC4gIERlZmluZSBTQ09fRUxGIGFuZAotCVRBUkdFVF9TT0xBUklTX0NPTU1FTlQgd2hlbiBhcHByb3ByaWF0ZS4gIERvbid0IHN1YnN0aXR1dGUgZm9yCi0JdGFyZ2V0X2ZyYWcuCi0JKiBNYWtlZmlsZS5hbTogUmVtb3ZlIEB0YXJnZXRfZnJhZ0AuCi0JKElOQ0xVREVTKTogUmVtb3ZlICQoSU5URVJOQUxfQ0ZMQUdTKSwgJChDUk9TUyksICQoSERFRklORVMpLCBhbmQKLQkkKFRERUZJTkVTKS4KLQkoZGVwLWFtKTogTWFyayBhcyBwaG9ueS4KLQkqIGFjY29uZmlnLmg6IEFkZCBUQVJHRVRfQllURVNfQklHX0VORElBTiwgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVCwKLQlhbmQgU0NPX0VMRi4KLQkqIGNvbmZpZy9hcm0tYmlnLm10LCBjb25maWcvYXJtLWxpdC5tdDogUmVtb3ZlLgotCSogY29uZmlnL21pcHMtYmlnLm10LCBjb25maWcvbWlwcy1saXQubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9wcGMtYmlnLm10LCBjb25maWcvcHBjLWxpdC5tdDogUmVtb3ZlLgotCSogY29uZmlnL3BwYy1zb2wubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9pMzg2Y29mZi5tdCwgY29uZmlnL202OGtjb2ZmLm10OiBSZW1vdmUuCi0JKiBjb25maWcvbTg4a2NvZmYubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9zY281Lm10OiBSZW1vdmUuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbiwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmFtICgkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaCk6IE5ldyB0YXJnZXQsIHRvCi0JZnVydGhlciB0cnkgdG8gY2lyY3VtdmVudCB0aGUgLnkuaCBydWxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBBdWcgIDUgMTI6MzI6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIGFjaW5jbHVkZS5tNDogTmV3IGZpbGUsIGZyb20gb2xkIGFjbG9jYWwubTQuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQU1fSU5JVF9BVVRPTUFLRSBhbmQgQU1fUFJPR19MSUJUT09MLiAgUmVtb3ZlCi0Jc2hhcmVkIGxpYnJhcnkgaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5IGxpYnRvb2wuICBSZXBsYWNlCi0JQUNfQ09ORklHX0hFQURFUiB3aXRoIEFNX0NPTkZJR19IRUFERVIuICBDYWxsIEFDX1BST0dfWUFDQywKLQlBQ19QUk9HX0xFWCwgYW5kIEFDX0RFQ0xfWVlURVhULiAgQ2FsbCBBTV9NQUlOVEFJTkVSX01PREUsCi0JQU1fQ1lHV0lOMzIsIGFuZCBBTV9FWEVFWFQuICBEb24ndCBjYWxsIENZX0NZR1dJTjMyIG9yIENZX0VYRUVYVC4KLQkqIGNvbmZpZy5pbjogTmV3IGZpbGUsIGNyZWF0ZWQgYnkgYXV0b2hlYWRlci4KLQkqIGNvbmYuaW46IFJlbW92ZS4KLQkqIGFjY29uZmlnLmg6IE1lbnRpb24gUEFDS0FHRSwgVkVSU0lPTiwgYW5kIFVTSU5HX0NHRU4uCi0JKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KLQkqIGFzLmMgKHByaW50X3ZlcnNpb25faWQpOiBDaGFuZ2UgR0FTX1ZFUlNJT04gdG8gVkVSU0lPTi4KLQkocGFyc2VfYXJncyk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai12bXMuYzogKFdyaXRlX1ZNU19NSERfUmVjb3Jkcyk6IExpa2V3aXNlLgotCSogZG9jL01ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIGRvYy9NYWtlZmlsZS5pbi4KLQkqIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW46IE5vdyBidWlsdCB3aXRoIGF1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTm93IGJ1aWx0IHdpdGggYWNsb2NhbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZC5jIChzX2Vsc2UpOiBJZiBub3QgbGlzdGluZyBmYWxzZSBjb25kaXRpb25hbHMsIHR1cm4gbGlzdGluZwotCW9mZiBpbiB0aGUgZmFsc2UgYnJhbmNoIG9mIHRoZSBlbHNlLgotCi1Nb24gQXVnICA0IDExOjI4OjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBGaXggaGFuZGxpbmcgb2YgYSBkb3VibGUgbG9hZCBmcm9tIGEKLQlzeW1ib2wgcGx1cyBhbiBvZmZzZXQuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBTZXQgZk1lcmdlIHRvIDAgZm9yIGFuIEZEUiB3aGljaAotCWhhcyBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIHN5bWJvbC4KLQotU3VuIEF1ZyAgMyAyMzoyMzo1OSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotIAotICAgICAgICAqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX3Vjb25zKTogTmV3IGZ1bmN0aW9uLgotICAgICAgICAobWRfcHNldWRvX3RhYmxlKTogQWRkIHVuYWxpZ25lZCBkYXRhIHBzZXVkb3MgZm9yIERXQVJGLgotCi1UaHUgSnVsIDMxIDE1OjEzOjQzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBJZ25vcmUgdGhlIHJlc3Qgb2YgdGhlIGN1cnJlbnQKLQlsaW5lIGlmIHdlIGVuY291bnRlciBhbiBlcnJvci4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBTaWduIGV4dGVuZCBjb25zdGFudHMgdmFsdWUKLQlmb3IgaGkgYW5kIGhpMCBleHByZXNzaW9ucy4KLQkodjg1MF9pbnNlcnRfb3BlcmFuZCk6IEVuYWJsZSByYW5nZSBjaGVja2luZyBmb3IgZ2VuZXJpYyAxNmJpdAotCW9wZXJhbmRzLgotCi1UdWUgSnVsIDI5IDE0OjIwOjQzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBUdXJuIG9uIGZ4X25vX292ZXJmbG93IGZvcgotCUxPMTYsIEhJMTYgYW5kIEhJMTZfUyByZWxvY3MuCi0KLU1vbiBKdWwgMjggMTg6NDE6NDEgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogVXNlIENZR1dJTiBhbmQgRVhFRVhUIGF1dG9jb25mIG1hY3JvIHRvIGxvb2sgZm9yCi0gICAgICAgIHdpbjMyIGRlcGVuZGVuY2llcy4KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4xMi4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogQWRkICQoRVhFRVhUKSB0byBhbGwgZXhlY3V0YWJsZXMuCi0KLUZyaSBKdWwgMjUgMTA6NTQ6NDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEltcHJvdmUgd2FybmluZ3MgZm9yIG91dCBvZiByYW5nZQotCXVuY29uZGl0aW9uYWwgYnJhbmNoZXMuCi0JKGhwcGFfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgYW55dGhpbmcgd2l0aCBhIFJSJSBvciBMUiUKLQlmaWVsZCBzZWxlY3Rvci4KLQotVGh1IEp1bCAyNCAxNToyMTo0OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiB0Yy1zcGFyYy5jIChtZF9iZWdpbik6IENhc3Qgc3BhcmNfb3Bjb2RlcyB0byBQVFIgZm9yIGhhc2hfaW5zZXJ0LgotCi1UaHUgSnVsIDI0IDE3OjUxOjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWFjcm8uYyAoZGVmaW5lX21hY3JvKTogTWFrZSBzdXJlIHRoZSBpbmRleCBpcyBpbiByYW5nZSBiZWZvcmUKLQljaGVja2luZyBmb3IgJygnLgotCi1UaHUgSnVsIDI0IDEyOjEzOjE5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAoYnVpbGRfaW5zbik6IFJlbW92ZSAiZXh0ZW5kZWQiIGFuZCByZXBsYWNlIHdpdGgKLSAJImZ4IiBhbmQgImZ4ZnJhZyIuICBBZGQgImZmcmFnIi4gIENoYW5nZSBjb2RlIHRvIGluaXRpYWxpemUgYW5kIHVzZQotCXRoZSByaWdodCBmL2ZmcmFnIGFuZCBmeC9meGZyYWcgcGFpcnMgc2luY2UgaW5zdHJ1Y3Rpb24gbWF5IGJlIHNwbGl0Ci0gCWFjcm9zcyBmcmFncy4KLQotVHVlIEp1bCAyMiAxODozODo1NiAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGNvbmZpZy90ZS1nbzMyLmggKFVTRV9BTElHTl9QVFdPKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKTogSWYgVVNFX0FMSUdOX1BUV08gaXMKLQlkZWZpbmVkLCB1c2Ugc19hbGlnbl9wdHdvIGZvciAuYWxpZ24uCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1tc2Rvc2RqZ3BwKik6IE5ldyB0YXJnZXQuCi0JKGkzODYtKi1nbzMyKik6IFNldCBlbSB0byBnbzMyIGFuZCB0YXJnIHRvIGNvZmZnbzMyLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgSnVsIDIyIDEyOjQxOjQwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChsYXN0X29wY29kZSk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKG1kX2Fzc2VtYmxlKTogRG9uJ3QgaXNzdWUgIkZQIGJyYW5jaCBpbiBkZWxheSBzbG90IiB3YXJuaW5nIGlmCi0JdGhlIGRlbGF5IHNsb3QgaGFzIGJlZW4gYW5udWxsZWQuCi0KLVR1ZSBKdWwgMjIgMTM6MjU6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IENoZWNrIGZvciBQQyByZWxhdGl2ZSByZWxvYwotCWNvZGUgaWYgQkZEX0FTU0VNQkxFUi4KLQotTW9uIEp1bCAyMSAwODo1NzoxNyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHN5c3RlbV9yZWdpc3RlcnMpOiBGaXggb3JkZXJpbmcgb2YgcmVnaXN0ZXJzLgotCi1UdWUgSnVsIDE1IDE2OjI5OjU0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAoYnVpbGRfaW5zbik6IEluaXRpYWxpemUgZXh0ZW5kZWQgd29yZCB0byB6ZXJvCi0Jd2hlbiBpdCB3aWxsIGJlIGZpbGxlZCBpbiBsYXRlciBieSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotCi1Nb24gSnVsIDE0IDIzOjEwOjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBSZXN0b3JlIGNoZWNrIG9mIGZtdCBhcmd1bWVudC4KLQkobWlwc19pcCk6IEZpeCBJU0EgY2hlY2tzLgotCi1Nb24gSnVsIDE0IDE5OjMwOjU1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAoYnVpbGRfaW5zbik6IEZpeCBlbmRpYW5uZXNzIHByb2JsZW0gd2l0aAotCU9fYmlnIG9wZXJhbmRzLgotCi1TdW4gSnVsIDEzIDIwOjQzOjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoY2hlY2tfYWJzb2x1dGVfZXhwcik6IENoYW5nZSB3YXJuaW5nIHRvCi0JZXJyb3IuCi0KLUZyaSBKdWwgMTEgMTA6MTg6NDcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IFJlZmluZSBjb2RlIHRvIGNoZWNrIGlmIGFuCi0JaW5zdHJ1Y3Rpb24gaXMgYXZhaWxhYmxlIG9uIGEgcGFydGljdWxhciBjcHUgdmFyaWFudC4KLQkobWlwc19pcCk6IExpa2V3aXNlLgotCi1Nb24gSnVsICA3IDIyOjUzOjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IENoYW5nZSBpZm5kZWYKLQlPQkpfQU9VVCB0byBpZmRlZiBPQkpfRUxGLgotCShtZF9hcHBseV9maXgzKTogV2hlbiBtYW5nbGluZyAzMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2MgZm9yCi0JQkZEX0FTU0VNQkxFUiwgaGFuZGxlIG9uZSBFTEYgY2FzZSBmb3IgQ09GRiBhcyB3ZWxsLCBhbmQgYWRkIGEgUEUKLQljYXNlLgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENoYW5nZSBzcGVjaWFsIGNhc2UgZm9yIGkzODYtY29mZiB0bwotIAlub3QgYXBwbHkgZm9yIGkzODYtcGUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zKTogT25seSBjb3VudCBmaXh1cHMKLQl3aGljaCB3ZXJlIG5vdCBkb25lLgotCShjb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBSZW5hbWUgZnJvbSBjb2ZmX2Zyb2JfZmlsZS4KLQkoY29mZl9mb3JtYXRfb3BzKTogSW5pdGlhbGl6ZSBmcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIGZpZWxkIHJhdGhlcgotCXRoYW4gZnJvYl9maWxlIGZpZWxkLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfZnJvYl9maWxlKTogRG9uJ3QgZGVjbGFyZS4KLQkoY29mZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogRGVjbGFyZS4KLQkob2JqX2Zyb2JfZmlsZSk6IERvbid0IGRlZmluZS4KLQkob2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW46IFNldCBiZmRfZ2FzIHRvIHllcyBmb3IgaTM4Ni0qLWN5Z3dpbjMyLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgSnVsICAyIDEyOjA1OjAwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBOZXZlciBzdWJ0cmFjdCBzZWN0aW9uCi0JYWRkcmVzcyBmcm9tIFBDIHJlbGF0aXZlIHJlbG9jIHdoaWNoIHdpbGwgYmUgZnVsbHkgcmVzb2x2ZWQuCi0KLVR1ZSBKdWwgIDEgMTU6MjM6MDcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChwYWdlX3R5cGUpOiBSZW5hbWVkIGZyb20gcGFnZV90IHRvIGF2b2lkIGNvbmZsaWN0Ci0Jd2l0aCBocHV4MTAgaGVhZGVyIGZpbGVzLgotCi1Nb24gSnVuIDMwIDEyOjI3OjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gSmFzb24gTWVycmlsbCA8amFzb25AY3lnbnVzLmNvbT46Ci0JKiByZWFkLmMgKGRvX2FsaWduKTogSWYgQkZEX0FTU0VNQkxFUiwgb25seSB1c2UgTk9QX09QQ09ERSBpZgotCVNFQ19DT0RFIGlzIHNldC4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX21heWJlX3RleHQpOiBEZWZpbmUuCi0JKG1kX2RvX2FsaWduKTogVXNlIG1kX21heWJlX3RleHQuCi0KLUZyaSBKdW4gMjcgMTk6MTU6MjcgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZml4X2FkanVzdGFibGUpOiBPbmx5IGNoZWNrIGZvciBHT1QgdHlwZQotCXJlbG9jYXRpb25zLCBkb24ndCBjaGVjayBmb3Igc3ltYm9sIGJlaW5nIGV4dGVybmFsLCB3ZWFrLCBldGMuCi0KLU1vbiBKdW4gMTYgMTk6MTI6NTEgMTk5NyAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGxldCB0aGUgYXNzZW1ibGVyCi0JY2FsY3VsYXRlIHJlbG9jYXRpb25zIHRvIGFueSBleHRlcm5hbCBzeW1ib2wsIGJlY2F1c2Ugd2UgbWlnaHQgYmUKLQlsaW5raW5nIGEgc2hhcmVkIG9iamVjdCBhbmQgdGhlIHN5bWJvbCBtaWdodCBiZSBvdmVycmlkZW4gb3IgbW92ZWQKLQkoZm9yIGluc3RhbmNlLCBtb3ZlZCBpbnRvIGEgc3RhdGljIGV4ZWN1dGFibGUncyAuYnNzIHNlY3Rpb24pLgotCShHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpOiBEZWxldGUuIFRoaXMgaXMgYW4gaTM4NiB3aWVyZG5lc3MuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZml4X2FkanVzdGFibGUpOiBHT1QtYmFzZWQgcmVsb2NhdGlvbnMgY2FuJ3QKLQliZSBjYWxjdWxhdGVkIGJ5IHRoZSBhc3NlbWJsZXIuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEhhbmRsZSBAcGx0IG9yIEBsb2NhbCBicmFuY2gKLQl3aG9zZSBkZXN0aW5hdGlvbiBsaWVzIGluIHRoZSBzYW1lIGZpbGUsIGJ5IGlnbm9yaW5nIHRoZSBAcGx0IG9yCi0JQGxvY2FsIGFuZCBhaW1pbmcgdGhlIGJyYW5jaCBhdCBpdHMgZGVzdGluYXRpb24uCi0KLU1vbiBKdW4gMTYgMTM6NTk6MTggMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogc3ltYm9scy5jIChjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzKTogQ29weSBCU0ZfT0JKRUNUIGZsYWcuCi0JKiBjb25maWcvb2JqLWVsZi5oIChPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IENvcHkgc2l6ZQotCWV4cHJlc3Npb24uCi0KLQkqIGNvbmZpZy9vYmotbXVsdGkuaCAoT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMpOiBEZWZpbmUgaW5zdGVhZAotCW9mIG9ial9jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzLgotCi1Nb24gSnVuIDE2IDEyOjQ1OjU2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfaW5zZXJ0X29wZXJhbmQpOiBJbiAzMiBiaXQgbW9kZSwgd2l0aCBhCi0Jc2lnbmVkIG9wZXJhbmQsIHNpZ24gZXh0ZW5kIGEgMzIgYml0IHZhbHVlIHRvIHRoZSBob3N0IHNpemUuCi0KLQkqIE1ha2VmaWxlLmluIChDRkxBR1MpOiBTdWJzaXR1dGUgZnJvbSBjb25maWd1cmUgc2NyaXB0LiAgRnJvbQotCUplZmYgTWFrZXkgPGplZmZAY3RzLmNvbT4uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IFVzZSBhbGxvY2EgcmF0aGVyIHRoYW4gYSBmaXhlZAotCWJ1ZmZlciBzaXplIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBzeW1ib2wuCi0KLQkqIE1ha2VmaWxlLmluIChPQkpTKTogUHV0IEBleHRyYV9vYmplY3RzQCBvbiB0aGUgc2FtZSBsaW5lIGFzCi0JbWFjcm8uby4KLQotVGh1IEp1biAxMiAxMjoxNjoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSW4gbm9uIEJGRF9BU1NFTUJMRVIgY29kZSwgYXMgd2UKLQlzdGVwIHRocm91Z2ggdGhlIGZyYWdzIGNhbGxpbmcgY3Z0X2ZyYWdfdG9fZmlsbCwgc3dpdGNoIHRvCi0JU0VHX0RBVEEgd2hlbiB3ZSByZWFjaCBkYXRhX2ZyYWdfcm9vdC4KLQotVHVlIEp1biAxMCAxNzowODozNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogQWxsb3cgYW4gZW1wdHkgcmVnaXN0ZXIKLQlsaXN0IGZvciBpbnN0cnVjdGlvbnMgd2hpY2ggdXNlIHJlZ2lzdGVyIGxpc3RzLgotCi1UdWUgSnVuIDEwIDExOjE4OjA5IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IE1ha2UgdGVtcCB1bnNpZ25lZCBsb25nLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGFybV9hZGp1c3Rfc3ltdGFiKTogT25seSBzZXQgc3RvcmFnZSBjbGFzc2VzIGlmCi0JT0JKX0NPRkYuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYzogQWRkIHByb3RvdHlwZXMgZm9yIG1hbnkgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc3RydWN0IGFzbV9vcGNvZGUgKTogQWRkIHByb3RvdHlwZXMgZm9yIHBhcm1zIGZpZWxkLgotCShzdHJ1Y3QgdGh1bWJfb3Bjb2RlICk6IExpa2V3aXNlLgotCShmcF9vcDIpOiBSZW1vdmUgdW51c2VkIGZsYWdzIHBhcmFtZXRlci4KLQkob3V0cHV0X2luc3QpOiBNYWtlIHN0YXRpYy4KLQkoYXJtX2FmdGVyX3Bhc3NfaG9vayk6IFJlbW92ZSB1bnVzZWQgaWdub3JlIHBhcmFtZXRlci4KLQkqIGNvbmZpZy90Yy1hcm0uaCAoYXJtX2FmdGVyX3Bhc3NfaG9vayk6IERlY2xhcmUuCi0JKGFybV9zdGFydF9saW5lX2hvb2spOiBEZWNsYXJlLgotCShhcm1fZnJvYl9sYWJlbCk6IERlY2xhcmUuCi0KLU1vbiBKdW4gIDkgMTI6NTU6NDUgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogZGVwZW5kLmMgKHdyYXBfb3V0cHV0KTogbmV3IHByb3RvdHlwZS4KLQotTW9uIEp1biAgOSAxMjo1Mjo0NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hcHBseV9maXgpOiBDaGVjayBmb3Igb3ZlcmZsb3cuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBJZiBhLm91dCBhbmQgQkZELCBmb3JjZQotCXNlY3Rpb24gc2l6ZSB0byBiZSBhbGlnbmVkLgotCi1GcmkgSnVuICA2IDE3OjE1OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmggKG1kX2NvbnNfYWxpZ24pOiBEZWZpbmUuCi0JKHNoX2NvbnNfYWxpZ24pOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXNoLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAudWF3b3JkIGFuZCAudWFsb25nLgotCShzaF9ub19hbGlnbl9jb25zKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc191YWNvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzaF9jb25zX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCShzaF9oYW5kbGVfYWxpZ24pOiBXYXJuIGFib3V0IG1pc2FsaWduZWQgZGF0YS4KLQkqIGRvYy9jLXNoLnRleGk6IERvY3VtZW50IC51YXdvcmQgYW5kIC51YWxvbmcuCi0KLVRodSBKdW4gIDUgMTU6Mzg6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtYWNyby5jIChtYWNyb19leHBhbmQpOiBJbiBNUkkgbW9kZSwgdHJlYXQgc2luZ2xlIHF1b3RlIGFzIGEKLQlzZXBhcmF0b3IgY2hhcmFjdGVyIHdoZW4gY2hlY2tpbmcgZm9yIGEgcG9zaXRpb25hbCBhcmd1bWVudC4KLQotVHVlIEp1biAgMyAxNjoxNToxMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX3BhcnNlX29wdGlvbik6IE1lcmdlIGluIGNoYW5nZXMgZnJvbQotCWFybVQtOTcwMzI4LWJyYW5jaC4KLQotCSogY29uZmlnL3RjLWFybS5oOiBNZXJnZSBpbiBjaGFuZ2VzIGZyb20gYXJtVC05NzAzMjgtYnJhbmNoLgotCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgVGh1bWIgYXJjaGl0ZWN0dXJlIHN1cHBvcnQgZnJvbQotCWFybVQtOTcwMy0yOC1icmFuY2guCi0KLU1vbiBKdW4gIDIgMTY6MjU6MDcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2FsbC50ZXhpOiBBZGQgZW5hYmxpbmcgb2YgQVJNIGRvY3VtZW50YXRpb24uCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgQVJNIGRvY3VtZW50YXRpb24gZnJvbSBhcm1ULTk3MDMyOC1icmFuY2guCi0KLU1vbiBKdW4gIDIgMTE6NTU6MTIgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEFkZGVkIHIzOTAwIHN1cHBvcnQuCi0KLVRodSBNYXkgMjkgMTI6NTg6MjYgMTk5NyAgQmVuIFBmYWZmICA8cGZhZmZiZW5AcGlsb3QubXN1LmVkdT4KLQotCSogYXMuYzogKHBhcnNlX2FyZ3MpIGAtdCcgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50LgotCi1XZWQgTWF5IDI4IDE1OjQ1OjA3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYmVnaW4pOiBDaGFuZ2UgY2FsbCB0bwotCWNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncygpIHRvIGEgY2FsbCB0bwotCWJmZF9zZXRfcHJpdmF0ZV9mbGFncygpLiAKLQotV2VkIE1heSAyOCAxNjoxNzozNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfZ2VuX3JlbG9jKTogRG9uJ3QgdHJ5IHRvIGNvbnZlcnQgdGhlIHR5cGUKLSAJb2YgYSBCRkRfUkVMT0NfUlZBIHJlbG9jLgotCi1XZWQgTWF5IDI4IDEwOjQ4OjE0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZml4X2FkanVzdGFibGUpOiBSZWplY3QgYWJzb2x1dGUgY2FsbHMvanVtcHMuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIGEgcmVsb2NhdGlvbiBmb3IgYW4gYWJzb2x1dGUKLQljYWxsL2p1bXAuCi0KLU1vbiBNYXkgMjYgMTM6MjQ6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogRG9uJ3QgdXNlIEB2YWx1ZSBpbiBzZWN0aW9uIG5hbWVzIG9yIGluZGV4Ci0JZW50cmllczsgaXQgY29uZnVzZXMgdGV4aW5mby50ZXguCi0KLUZyaSBNYXkgMjMgMDA6MDk6MzUgMTk5NyAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogVXBkYXRlZCBmb3IgLU1EIG9wdGlvbi4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGRlZCBkZXBlbmQuYy4KLQkoT0JKUyk6IEFkZGVkIGRlcGVuZC5vLgotCSogYXMuaCAoc3RhcnRfZGVwZW5kZW5jaWVzLCByZWdpc3Rlcl9kZXBlbmRlbmN5LAotCXByaW50X2RlcGVuZGVuY2llcyk6IE5ldyBkZWNsYXJhdGlvbnMuCi0JKiBkZXBlbmQuYzogTmV3IGZpbGUuCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWRkZWQgLU1EIG9wdGlvbi4KLQkobWFpbik6IENhbGwgcHJpbnRfZGVwZW5kZW5jaWVzLgotCShzaG93X3VzYWdlKTogQWRkZWQgaGVscCBmb3IgLU1ELgotCSogcmVhZC5jIChzX2FwcF9maWxlKTogQ2FsbCByZWdpc3Rlcl9kZXBlbmRlbmN5LgotCShzX2luY2x1ZGUpOiBDYWxsIHJlZ2lzdGVyX2RlcGVuZGVuY3kgd2hlbiBmaWxlIGlzIGZvdW5kLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBDYWxsIHJlZ2lzdGVyX2RlcGVuZGVuY3kuCi0KLVdlZCBNYXkgMjEgMTc6Mzk6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc3ltYm9sX3RvX2NoYXJzKTogSWYgVEVfUEUsIGRvbid0IGFkZCB0aGUKLQlzZWN0aW9uIGFkZHJlc3MgdG8gdGhlIHN5bWJvbCB2YWx1ZS4KLQotVHVlIE1heSAyMCAxMToyMzozMSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQsbWlwc19pcCk6IE1vdmUgdGhlIElOU05fSVNBIGZpZWxkCi0JaW50byB0aGUgbmV3IG1lbWJlcnNoaXAgZmllbGQuCi0KLVRodSBNYXkgMTUgMTA6MDA6NTMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9iZWdpbik6IElmIG5vIGNwdSB0eXBlIGlzIHNwZWNpZmllZCBvbiB0aGUKLQljb21tYW5kIGxpbmUgdGhlbiB0aGUgQVJNNyBpcyBub3cgY2hvc2VuIGJ5IGRlZmF1bHQgd2hlbiBzZXR0aW5nCi0JdGhlIEJGRCBtYWNoaW5lIGFuZCBhcmNoaXRlY3R1cmUuCi0KLVdlZCBNYXkgMTQgMDk6NTQ6NTMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChnbG9iYWwgdmFyaWFibGVzKTogQWRkZWQgJ3VzZXNfYXBjc18yNicgZmxhZyB0bwotCWhvbGQgQVBDUyBzZWxlY3Rpb24uCi0gIAkobWRfYmVnaW4pOiBBZGRlZCBjb2RlIHRvIGdlbmVyYXRlIGZsYWdzIHRvIGJlIHNldCBpbnRvIHRoZSBDT0ZGCi0JaGVhZGVyIGFuZCB0aGUgY2FsbHMgdG8gdGhlIEJGRCBmdW5jdGlvbnMgdG8gZG8gdGhpcy4KLSAgCShtZF9wYXJzZV9vcHRpb24sIG1kX3Nob3dfdXNhZ2UpOiBBZGRlZCBuZXcgY29tbWFuZCBsaW5lCi0Jb3B0aW9ucyAtbWFwY3MtMzIsIC1tYXBjcy0yNiwgLW1hcm12MiwgLW1hcm12MmEsIC1tYXJtdjMsCi0JLW1hcm12M20sIC1tYXJtdjQsIC1tYXJtdjR0LiAKLQotCSogdGMtYXJtLmggKExPQ0FMX0xBQkVMKTogUmVtb3ZlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIG1hY3JvCi0JYXMgaXQgaXMgbmV2ZXIgdXNlZC4KLQotVHVlIE1heSAxMyAyMjoyNjoxNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IFByZWZpeCB0ZW1wb3JhcnkKLQlsYWJlbCBuYW1lIHdpdGggIi4iLgotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0KLVR1ZSBNYXkgMTMgMTQ6NDQ6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChzZXRfYXQpOiBDaGVjayBmb3IgYmlnbnVtLgotCShjaGVja19hYnNvbHV0ZV9leHByLCBtYWNybywgbWlwczE2X21hY3JvKTogTGlrZXdpc2UuCi0KLVR1ZSBNYXkgMTMgMTA6NDU6NTYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9hcHBseV9maXgpOiBDaGVjayBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucwotCWZvciBvdmVyZmxvdy91bmRlcmZsb3csIG9ubHkgaW5zZXJ0IGxvd2VyIDE1IGJpdHMgaW50byBpbnN0cnVjdGlvbi4KLQotTW9uIE1heSAxMiAxMzozMzowOCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChwaSk6IENoZWNrIGZvciBSZWdNTVguCi0KLVRodSBNYXkgIDggMTE6MTA6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKGV4cHIpOiBXaGVuIHN1YnRyYWN0aW5nIHZhbHVlcyBpbiB0aGUgc2FtZSBmcmFnLAotCXN1YnRyYWN0IFhfYWRkX251bWJlciByYXRoZXIgdGhhbiBhZGRpbmcgaXQuCi0KLVdlZCBNYXkgIDcgMTU6Mzk6NDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBKdXN0IHBhc3MgTlVMTCB0bwotIAltZF9kb19hbGlnbiwgbm90IHRoZSBhZGRyZXNzIG9mIGEgY2hhciBob2xkaW5nIE5PUF9PUENPREUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogSGFuZGxlIGNvbnN0YW50cyBmb3IgTV9MSV9EIGFuZAotCU1fTElfREQuCi0JKG1pcHNfaXApOiBGb3IgJ0YnLCAnTCcsICdmJywgYW5kICdsJywgZ2VuZXJhdGUgYSBjb25zdGFudCByYXRoZXIKLQl0aGFuIGFuIGFkZHJlc3MgaWYgdGhlIGZsb2F0aW5nIHBvaW50IHZhbHVlIGxvb2tzIHN1ZmZpY2llbnRseQotCXNpbXBsZS4KLQotVHVlIE1heSAgNiAxMjoxODowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBJZiBhLm91dCBhbmQgQkZELCBmb3JjZQotCXNlY3Rpb24gc2l6ZSB0byBiZSBhbGlnbmVkLgotCi1Nb24gTWF5ICA1IDE3OjE2OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZC5jOiBJbmNsdWRlICJtYWNyby5oIi4KLQkoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lKTogQWRkIG1hY3JvX25lc3QgZmllbGQuCi0JKGluaXRpYWxpemVfY2ZyYW1lKTogSW5pdGlhbGl6ZSBtYWNyb19uZXN0LgotCShjb25kX2ZpbmlzaF9jaGVjayk6IEFkZCBuZXN0IHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoY29uZF9leGl0X21hY3JvKTogTmV3IGZ1bmN0aW9uLgotCSogYXMuaCAoY29uZF9maW5pc2hfY2hlY2spOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGNvbmRfZXhpdF9tYWNybyk6IERlY2xhcmUuCi0JKiBpbnB1dC1zY3J1Yi5jIChtYWNyb19uZXN0KTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlcik6IENhbGwgY29uZF9maW5pc2hfY2hlY2suCi0JKiBtYWNyby5oIChtYWNyb19uZXN0KTogRGVjbGFyZS4KLQkqIHJlYWQuYyAoc19tZXhpdCk6IENhbGwgY29uZF9leGl0X21hY3JvLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChSZWdNTVgpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChwaSk6IENoZWNrIGZvciBhbGwgcmVnaXN0ZXIgdHlwZXMuCi0JKHR5cGVfbmFtZXMpOiBBZGQgUmVnTU1YLgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSBSZWdNTVguCi0KLVdlZCBBcHIgMzAgMTI6NDc6MDAgMTk5NyAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zZWN0aW9uX3N5bWJvbCk6IENsZWFyIHRoZSBMT0NBTCBiaXQgI2lmZGVmCi0JVEVfREVMVEEuCi0KLVR1ZSBBcHIgMjkgMjA6MjM6MTAgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChub3BpY19uZWVkX3JlbGF4KTogQWRkIG5ldyBwYXJhbWV0ZXIKLQliZWZvcmVfcmVsYXhpbmcuICBVc2UgaXQgd2hlbiB0ZXN0aW5nIGVjb2ZmX2V4dGVybl9zaXplLgotCShsb2FkX2FkZHJlc3MsIG1hY3JvLCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEZpeCBhbGwKLQljYWxsZXJzLgotCi1UdWUgQXByIDI5IDE5OjU0OjM2IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfcHNldWRvX3RhYmxlKTogQWRkICJzdWJzZWN0aW9uIi4KLSAJKG9ial9lbGZfc3Vic2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLVR1ZSBBcHIgMjkgMTk6NTI6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9oZWFkZXJfYXBwZW5kKTogRG9uJ3QgcmVzZXQgc3RyaW5nX3NpemUKLQllYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcC4KLQotRnJpIEFwciAyNSAxNDoxNzo0NiAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIGl0YmwtcGFyc2UuaC4KLQotRnJpIEFwciAyNSAxMjowMzoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoUG9ydGluZyBHQVMpOiBDb3JyZWN0IGRvY3VtZW50YXRpb24gZm9yCi0JY3VycmVudCBjb25maWd1cmUgaGFuZGxpbmcgb2YgdGFyZy1jcHUuaCwgZXQuIGFsLgotCShDUFUgYmFja2VuZCk6IERvY3VtZW50IGxpc3RpbmcgbWFjcm9zLgotCi0JKiBsaXN0aW5nLmMgKGRhdGFfYnVmZmVyKTogU2V0IHNpemUgYmFzZWQgb24gb3RoZXIgbGlzdGluZyBtYWNyb3MsCi0JcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nIDEwMC4KLQkoZGF0YV9idWZmZXJfc2l6ZSk6IFJlbW92ZSBzdGF0aWMgdmFyaWFibGUuCi0JKGNhbGNfaGV4KTogTWFrZSBkYXRhX2J1ZmZlcl9zaXplIGEgbG9jYWwgdmFyaWFibGUuICBEb24ndCBsZWF2ZQotCWFueSBzbG9wIHdoZW4gZmlsbGluZyBkYXRhX2J1ZmZlci4KLQotTW9uIEFwciAyMSAxNTozMzoxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLW1pcHMudGV4aTogRG9jdW1lbnQgLnNldCBhdXRvZXh0ZW5kLgotCi1TYXQgQXByIDE5IDIzOjA5OjI1IDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAcGV0cmEuYXBwbGkuc2U+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLW9wZW5ic2QqLCBtNjhrLSotb3BlbmJzZCosCi0JbWlwcy1kZWMtb3BlbmJzZCosIHBwYy0qLSpic2QqLCBuczMyay1wYzUzMi1vcGVuYnNkKiwKLQlzcGFyYy0qLW9wZW5ic2QqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVNhdCBBcHIgMTkgMjI6NTI6MDMgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9zeW1ib2wpOiBJZiBUQ19NSVBTLCBzZXQgQlNGX09CSkVDVAotCWZvciBhbGwgdW5kZWZpbmVkIHN5bWJvbHMuCi0KLUZyaSBBcHIgMTggMTM6Mzc6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19maXhfYWRqdXN0YWJsZSk6IEhhbmRsZSB6ZXJvIGxlbmd0aCBjc2VjdHMKLQljb3JyZWN0bHkuCi0KLUZyaSBBcHIgMTggMTE6NTE6MzUgMTk5NyAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BhcHBsaS5zZT4KLQotCSogY29uZmlndXJlLmluIChhbHBoYSotKi1vcGVuYnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBBcHIgMTcgMTM6NTk6NDcgMTk5NyAgUGVyIEZvZ2Vsc3Ryb20gIDxwZWZvQG9wZW5ic2Qub3JnPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1vcGVuYnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBBcHIgMTYgMTI6MzE6MjQgMTk5NyAgTWFydGluIEh1bnQgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBGaXggcGFyYWxsZWwgY2hlY2tpbmcKLQlmb3IgaW5zdHJ1Y3Rpb25zIHVzaW5nIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbi4KLQotVHVlIEFwciAxNSAxODoxMTo0NCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoaW5zbl91c2VzX3JlZyk6IENvcnJlY3QgdGVzdCBmb3IgZnByIHBhaXJzLgotCi1UdWUgQXByIDE1IDEzOjA0OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHNyY3Jvb3QpOiBSZW1vdmUuCi0gCShJTlNUQUxMKTogU2V0IHRvIEBJTlNUQUxMQC4KLQkoSU5TVEFMTF9YRk9STSwgSU5TVEFMTF9YRk9STTEpOiBSZW1vdmUuCi0JKGFsbCwgZHZpKTogRG9uJ3Qgc2V0IHNyY3Jvb3QuCi0JKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBhcy5uZXcsIGdhc3AubmV3LCBhbmQgaW5zdGFsbGRpcnMuICBVc2UKLQkkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpIGRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZwotCSQoSU5TVEFMTF9YRk9STSkgYW5kICQoSU5TVEFMTF9YRk9STTEpLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgotCShpbnN0YWxsKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuICBVc2UgJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQotCWRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZyAkKElOU1RBTExfWEZPUk0pIGFuZAotCSQoSU5TVEFMTF9YRk9STTEpLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwtaW5mby1hcyk6IFJ1biBta2luc3RhbGxkaXJzLgotCShpbnN0YWxsLWluZm8tZ2FzcCk6IExpa2V3aXNlLgotCi1Nb24gQXByIDE0IDExOjU5OjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBDaGFuZ2UgaW5zdGFsbC5zaCB0byBpbnN0YWxsLXNoLgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogQ2hlY2sgZm9yIGRpdmlzaW9uIGJ5IHplcm8uCi0KLQlGcm9tIFRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT46Ci0JKiBNYWtlZmlsZS5pbjogQWx3YXlzIHVzZSAkKFNIRUxMKSB3aGVuIHJ1bm5pbmcgbW92ZS1pZi1jaGFuZ2UuCi0JKiBjb25maWd1cmUuaW46IFVzZSAke0NPTkZJR19TSEVMTH0gd2hlbiBydW5uaW5nICRhY19jb25maWdfc3ViLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgQXByIDEwIDE0OjQwOjAwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoY2dlbl9wYXJzZV9vcGVyYW5kKTogUmVuYW1lZCBmcm9tIGNnZW5fYXNtX3BhcnNlX29wZXJhbmQuCi0JTmV3IGFyZ3VtZW50IGB3YW50Jy4gIFVwZGF0ZSBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgdmFsdWVzLgotCUluaXRpYWxpemUgaWYgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOSVQuCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9iZWdpbik6IFNldCBjZ2VuX3BhcnNlX29wZXJhbmRfZm4uCi0JKG1kX2Fzc2VtYmxlKTogQ2FsbCBjZ2VuX2FzbV9pbml0X3BhcnNlLgotCVVwZGF0ZSBjYWxsIHRvIG0zMnJfY2dlbl9hc3NlbWJsZV9pbnNuLCBjYWxsIGFzX2JhZCBpZiBhc3NlbWJseSBmYWlsZWQuCi0KLVdlZCBBcHIgIDkgMTE6NDk6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSGFuZGxlICNqLgotCi1UdWUgQXByICA4IDE2OjM3OjU3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfY29udmVydF9mcmFnKTogQ3JlYXRlIGZpeHVwIGF0IHRoZQotCXJpZ2h0IGFkZHJlc3MgZm9yIGNhbGwgbGFiZWw6MzIscmVncyxpbW0uCi0KLU1vbiBBcHIgIDcgMTQ6NTg6MjIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zdWJzcGFjZV9zdGFydCk6IElmIE9CSl9FTEYsIHRoZW4gYWx3YXlzIHJldHVybgotCXplcm8uCi0JKiBjb25maWcvdGMtaHBwYS5oICh0Y19mcm9iX3N5bWJvbCk6IERvbid0IHJlc2V0IHRoZSB2YWx1ZSBvZiB0aGUKLQlzeW1ib2wgZm9yIE9CSl9FTEYgYW55bW9yZS4KLQotTW9uIEFwciAgNyAxMDo1NDo1OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZSBkZXBlbmRlbmNpZXMuCi0gCShUQVJHX0NQVSk6IE5ldyB2YXJpYWJsZS4KLQkoY2dlbi5vKTogRGVwZW5kIG9uIGNnZW4uaCwgJChUQVJHX0NQVSktb3BjLmguCi0JKC5kZXAxKTogRGVsZXRlIGNyZWF0aW5nIG9mIGNnZW4tb3BjLmguCi0JKC50Y2RlcCk6IFB1dCBwcm9wZXIgY29udGVudHMgaW4gY2dlbi1vcGMuaC4KLQkqIGNvbmZpZ3VyZS5pbiAobTMycik6IERlbGV0ZSBzZXR0aW5nIG9mIGV4dHJhX2ZpbGVzLCBleHRyYV9saW5rcy4KLQkoQUNfT1VUUFVUKTogQ3JlYXRlIGNnZW4tb3BjLmguCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1TYXQgQXByICA1IDEzOjE5OjEyIDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSB0byBidWlsZCBnYXNwLmV4ZS4KLQotRnJpIEFwciAgNCAxNjoxMDowMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChyZWxheF9mcmFnKTogTWFrZSBub24tc3RhdGljLgotCSogd3JpdGUuaCAocmVsYXhfZnJhZyk6IEFkZCBwcm90b3R5cGUgZm9yLgotCSogY29uZmlnL3RjLW0zMnIuaCAobWRfZG9fYWxpZ24pOiBOZXcgYXJnIGBtYXgnLgotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9kb19hbGlnbik6IExpa2V3aXNlLgotCVVwZGF0ZSBjYWxscyB0byBmcmFnX2FsaWduLCBmcmFnX2FsaWduX3BhdHRlcm4uCi0JKGZpbGxfaW5zbik6IFVwZGF0ZSBjYWxsIHRvIG0zMnJfZG9fYWxpZ24uCi0JKG0zMnJfc2NvbW0pOiBVcGRhdGUgY2FsbCB0byBmcmFnX2FsaWduLgotCi0JKiBjb25maWcvdGMtbTMyci5bY2hdOiBOZXcgZmlsZXMuCi0JKiBjZ2VuLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKENQVV9UWVBFUyk6IEFkZCBtMzJyLgotCShUQVJHRVRfQ1BVX0NGSUxFUyk6IEFkZCB0Yy1tMzJyLmMuCi0JKFRBUkdFVF9DUFVfSEZJTEVTKTogQWRkIHRjLW0zMnIuaC4KLQkoRElTVENMRUFOX0hFUkUpOiBBZGQgY2dlbi1vcGMuaC4KLQkoLmRlcDEsLnRjZGVwKTogQ3JlYXRlIGVtcHR5IGNnZW4tb3BjLmguCi0JKGNnZW4ubyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0JKGRlcGVuZGVuY2llcyk6IFJlZ2VuZXJhdGUuCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IE5ldyBtZW1iZXIgZnJfdGFyZy4KLQkoZnJfcGNyZWxfYWRqdXN0LGZyX2Jzcik6IE1vdmUgaW50byB1bmlvbiBmcl90YXJnLm5zMzJrLgotCSogY29uZi5pbiAoVVNJTkdfQ0dFTik6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZS5pbiAobTMyci0qLSopOiBBZGQgZW50cnkgZm9yLgotCUFkZCBjZ2VuLm8gdG8gZXh0cmFfb2JqZWN0cy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGZyYWdzLmMgKGZyYWdfdmFyKTogZnJfcGNyZWxfYWRqdXN0IHJlbmFtZWQgdG8KLQlmcl90YXJnLm5zMzJrLnBjcmVsX2FkanVzdC4gIGZyX2JzciByZW5hbWVkIHRvIGZyX3RhcmcubnMzMmsuYnNyLgotCShmcmFnX3ZhcmlhbnQpOiBMaWtld2lzZS4KLQkqIHdyaXRlLmMgKHJlbGF4X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1uczMyay5jICgqKTogTGlrZXdpc2UuCi0KLUZyaSBBcHIgIDQgMTM6MjY6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19FT0xfSU5fSU5TTik6IENoZWNrIGV4cGxpY2l0bHkgZm9yICchJywKLQlyYXRoZXIgdGhhbiBmb3IgYW55IGVuZCBvZiBsaW5lIGNoYXJhY3Rlci4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogSWYgaHBwYV9yZW5fcmVsb2NfdHlwZSBmYWlscywKLQljYWxsIGFib3J0IChpLmUuLCBhc19hYm9ydCkgcmF0aGVyIHRoYW4gY3Jhc2hpbmcuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFByb3RlY3QgdXNlcyBvZiBTVE9fTUlQUzE2IHdpdGggYW4gaWZkZWYgb2YKLQlPQkpfRUxGLCByYXRoZXIgdGhhbiBvZiBTX0dFVF9PVEhFUi4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RDTEVBTl9IRVJFKTogQWRkIHNpdGUuZXhwIGFuZCBzaXRlLmJhay4KLQotVGh1IEFwciAgMyAxMzoxNjoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogU2V0IHRvIDIuOC4xLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjguCi0KLVdlZCBBcHIgIDIgMTI6MjQ6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBDT1BZSU5HOiBVcGRhdGUgRlNGIGFkZHJlc3MuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9tYWNybyk6IEhhbmRsZSBNX0RNVUwgYW5kIE1fTVVMLgotCi1UdWUgQXByICAxIDE4OjI5OjQ3IDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBEb24ndCBzZXQgaW50ZXJsb2NrcyBmb3IgNDEwMC4KLQotVHVlIEFwciAgMSAxNjoyNDoyOCAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlnLWdhcy5jb206IFVwZGF0ZSB0byBoYW5kbGUgYm90aCB2YXggYW5kIGFscGhhLgotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgdG8gdXNlIGNvbmZpZy1nYXMuCi0JKiBjb25mLWEtZ2FzLmNvbTogUmVtb3ZlIGZpbGUuCi0KLVR1ZSBBcHIgIDEgMTY6MDg6MjEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHVubmVjZXNzYXJ5IGl0YmwtcGFyc2UuaCwgaWJ0bC1wYXJzZS5jLCBhbmQKLQlpdGJsLWxleC5jIGRlcGVuZGVuY2llcy4gIFJlbW92ZSBydWxlcyBmb3IgaXRibC1sZXgubywKLQlpdGJsLXBhcnNlLm8sIGFuZCBpdGJsLW9wcy5vOyBqdXN0IHVzZSB0aGUgbm9ybWFsIC5jLm8gcnVsZS4KLQotVHVlIEFwciAgMSAxMToyNTo1NiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGxpbmVfY29tbWVudF9jaGFyKTogTWFrZSAnIycgc3RhcnQgY29tbWVudHMKLQlhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIC5TIGZpbGVzIHdoZXJlCi0JY3BwIGxlYXZlcyB0aGUgZmlsZW5hbWUgdHJhbnNpdGlvbnMgYmVnaW5uaW5nIHdpdGggJyMnLgotCi1UdWUgQXByICAxIDAwOjA3OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYzogT25seSBjb21waWxlIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayBhbmQKLQl0Y19jb2ZmX3NpemVtYWNoZGVwIGlmIE9CSl9DT0ZGLgotCi1Nb24gTWFyIDMxIDIzOjUzOjQ0IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocmVnaXN0ZXJfbmFtZSk6IERlY2xhcmUuCi0KLU1vbiBNYXIgMzEgMTY6MzE6MDQgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGhwcGEqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBocHBhLSotKmVsZiouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBNYXIgMzEgMTQ6MTU6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3BzZXVkb190YWJsZSk6IEFkZCAic3RhYm4iLgotCShtaXBzMTZfbWFya19sYWJlbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhcHBlbmRfaW5zbik6IENhbGwgbWlwczE2X21hcmtfbGFiZWxzLgotCShtaXBzX2VtaXRfZGVsYXlzKTogTGlrZXdpc2UuCi0JKHNfaW5zbik6IExpa2V3aXNlLiAgRG9uJ3QgY2FsbCBtaXBzX2NsZWFyX2luc25fbGFiZWxzLgotCShzX21pcHNfc3RhYik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEVMRiBmb3IgbWlwcy0qLWdudSouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBNYXIgMzEgMTQ6MDE6NDAgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCk6IFNldCB0byAiY29mZi1tNjhrLXN5c3YiIGlmCi0JVEVfREVMVEEuCi0KLUZyaSBNYXIgMjggMTg6MDM6MTkgMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19BUkdfRU5BQkxFIGZvciBjb21tb25iZmRsaWIuICBJZiBpdCBpcyBzZXQsCi0Jc2V0IE9QQ09ERVNfTElCIHRvIGVtcHR5LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI4IDE1OjI1OjI0IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMtKi1saW51eCphb3V0Kiwgc3BhcmMtKi1saW51eCopOiBOZXcKLQl0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI4IDEzOjA4OjMzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaXRibC1wYXJzZS55ICh5eWVycm9yKTogTWFrZSBzdGF0aWMuICBEZWNsYXJlLgotCi0JRnJvbSBSYWxmIEJhZWNobGUgPHJhbGZAZ251LmFpLm1pdC5lZHU+OgotCSogY29uZmlndXJlLmluOiBTZXQgZW11bGF0aW9ucyBmb3IgbWlwcy0qLWxpbnV4Ki0qLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChzdHJ1Y3QgbWlwc19zZXRfb3B0aW9ucyk6IERlZmluZS4KLQkobWlwc19vcHRzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwc19pc2EpOiBSZW1vdmUuICBOb3cgYSBmaWVsZCBpbiBtaXBzX29wdHMuICBDaGFuZ2UgYWxsCi0JcmVmZXJlbmNlcy4KLQkobWlwczE2LCBtaXBzMTZfYXV0b2V4dGVuZCwgbWlwc193YXJuX2Fib3V0X21hY3Jvcyk6IExpa2V3aXNlLgotCShtaXBzX25vcmVvcmRlciwgbWlwc19ub21vdmUsIG1pcHNfbm9hdCwgbWlwc19ub2JvcHQpOiBMaWtld2lzZS4KLQkoc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrKTogRGVmaW5lLgotCShtaXBzX29wdHNfc3RhY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX21pcHNzZXQpOiBBZGQgc3VwcG9ydCBmb3IgLnNldCBwdXNoIGFuZCAuc2V0IHBvcC4KLQkqIGRvYy9jLW1pcHMudGV4aTogRG9jdW1lbnQgLnNldCBwdXNoIGFuZCAuc2V0IHBvcC4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKTogRGVjbGFyZSBpdC4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfY2hhbmdlX3NlYyk6IENhbGwgaXQgaWYgT0JKX0VMRi4KLQotVGh1IE1hciAyNyAxMjoyMzo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBVcGRhdGUgY29weXJpZ2h0IGRhdGUgaW4gdmVyc2lvbiBtZXNzYWdlLgotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4taGVyZSk6IFJlbW92ZSBkZXBlbmRlbmN5IGZpbGVzLgotCi0JKiByZWFkLmMgKHNfY29tbSk6IENoZWNrIFNfSVNfQ09NTU9OIGFzIHdlbGwgYXMgU19JU19ERUZJTkVELgotCShzX21yaV9jb21tb24pOiBDaGVjayBTX0lTX0NPTU1PTiB1bmNvbmRpdGlvbmFsbHkuCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2hlY2sgU19JU19DT01NT04gYXMgd2VsbCBhcyBTX0lTX0RFRklORUQuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV9jb21tKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWlwcy5jIChub3BpY19uZWVkX3JlbGF4KTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfbGNvbW0pOiBMaWtld2lzZS4KLQkocHBjX3BlX2NvbW0pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogTGlrZXdpc2UuICBTZXQgc2VnbWVudCBvZgotCWNvbW1vbiBzeW1ib2wgdG8gYmZkX2NvbV9zZWN0aW9uX3B0ci4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2NvbW1vbik6IExpa2V3aXNlLgotCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQotVGh1IE1hciAyNyAwMDoyOTo0NiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXBwbHlfZml4Myk6IEdldCB0aGUgcmVsb2NzIHJpZ2h0LgotCi1XZWQgTWFyIDI2IDEzOjM1OjE1IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogT25seSBkZWZpbmUgaWYKLQlCRkRfQVNTRU1CTEVSLgotCi1XZWQgTWFyIDI2IDExOjMyOjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW5wdXQtc2NydWIuYyAoaW5wdXRfc2NydWJfbmV4dF9idWZmZXIpOiBIYW5kbGUgdmVyeSBsb25nIGlucHV0Ci0JbGluZXMgY29ycmVjdGx5LgotCi0JKiBsaXN0aW5nLmMgKHByaW50X2xpbmVzKTogQWRkIGxpbmVubyBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkobGlzdGluZ19saXN0aW5nKTogT25seSBjYWxsIGNhbGNfaGV4IGZvciB0aGUgcmlnaHQgbGluZS4KLQkobGlzdGluZ19saXN0KTogU2V0IHRoZSBuZXcgZWRpY3QgYmFzZWQgb24gdGhlIGN1cnJlbnQgZWRpY3QsIGluCi0Jb3JkZXIgdG8gaGFuZGxlIGxpc3RpbmcgY29tbWFuZHMgaW4gbWFjcm9zIGNvcnJlY3RseS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoaW5zbl91c2VzX3JlZyk6IE1hcCByZWdpc3RlciBudW1iZXJzIGluIG1pcHMxNgotCWluc3RydWN0aW9ucy4KLQotCSogY29uZC5jIChjb25kX2ZpbmlzaF9jaGVjayk6IE5ldyBmdW5jdGlvbi4KLQkqIGFzLmggKGNvbmRfZmluaXNoX2NoZWNrKTogRGVjbGFyZS4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIGNvbmRfZmluaXNoX2NoZWNrLgotCi1UdWUgTWFyIDI1IDE0OjQ1OjU0IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hc3NlbWJsZSk6IElmIHR3byBpbnN0cnVjdGlvbnMKLQlhcmUgc3VwcG9zZWQgdG8gYmUgYXNzZW1ibGVkIGluIHBhcmFsbGVsIGFuZCB0aGUgZmlyc3Qgb25lIGlzCi0JbG9uZywgcHJpbnQgYW4gZXJyb3IgYW5kIHN0b3AuCi0JKG1kX2FwcGx5X2ZpeDMpOiBEb24ndCBjYWxjdWxhdGUgYWJzb2x1dGUgcmVsb2NzLiAgSnVzdCB3cml0ZQotCXRoZW0gb3V0LgotCi1Nb24gTWFyIDI0IDEyOjExOjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoaWNscktsdWRnZSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIGljbHJLbHVkZ2UuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5oICh0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IERlZmluZSBpZgotCU9CSl9FQ09GRi4KLQkoYWxwaGFfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBEZWNsYXJlIGlmIE9CSl9FQ09GRi4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9kZWJ1Zyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBhbHBoYV9kZWJ1ZyBpZiAtZyBpcyBzZWVuLgotIAkoYWxwaGFfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBOZXcgZnVuY3Rpb24gaWYgT0JKX0VDT0ZGLgotCi1TdW4gTWFyIDIzIDE4OjAzOjMxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChidWlsZF9pbnNuKTogRW5hYmxlIHJhbmdlLWNoZWNraW5nIGNvZGUuCi0JKHBvc3RmaXgpOiBTdG9wIGF0IHNwYWNlIG9yIGNvbW1hLgotCShtZF9hc3NlbWJsZSk6IENoYW5nZSBlcnJvciBtZXNzYWdlLgotCi1TYXQgTWFyIDIyIDEzOjQ0OjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZGVkIGF1dG9tYXRpYyBkZXBlbmRlbmN5IGJ1aWxkaW5nLgotCSogZGVwLWluLnNlZDogTmV3IGZpbGUuCi0KLUZyaSBNYXIgMjEgMTU6NDI6MzcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWllZWUuYyAoc2VnbWVudF9uYW1lKTogRG9uJ3QgZGVmaW5lIGZ1bmN0aW9uIGlmIHRoaXMKLQlpcyBhIG1hY3JvLgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoRE9fU1RSSVApOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoRE9fU1RSSVApOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaDg1MDAuaCAoRE9fU1RSSVApOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtdzY1LmggKERPX1NUUklQKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLXo4ay5oIChET19TVFJJUCk6IERvbid0IGRlZmluZS4KLQotCSogc3ltYm9scy5jIChjb2xvbik6IENhbGwgb2JqX2Zyb2JfbGFiZWwgaWYgaXQgaXMgZGVmaW5lZC4KLQkqIGNvbmZpZy9vYmotdm1zLmggKG9ial9mcm9iX2xhYmVsKTogUmVuYW1lIGZyb20gdGNfZnJvYl9sYWJlbC4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBzZXQgZmlsZXMgYW5kIGxpbmtzLiAgRG9uJ3QgY2FsbAotCUFDX0xJTktfRklMRVMuICBTdWJzdGl0dXRlIHRlX2ZpbGUuICBDcmVhdGUgdGFyZy1jcHUuaCwKLQlvYmotZm9ybWF0LmgsIHRhcmctZW52LmgsIGFuZCBpdGJsLWNwdS5oIGluIEFDX09VVFBVVC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChUQVJHX0NQVV9DKTogTmV3IHZhcmlhYmxlLgotCShUQVJHX0NQVV9PLCBUQVJHX0NQVV9IKTogTmV3IHZhcmlhYmxlcy4KLQkoT0JKX0ZPUk1BVF9DLCBPQkpfRk9STUFUX08sIE9CSl9GT1JNQVRfSCk6IE5ldyB2YXJpYWJsZXMuCi0JKFRBUkdfRU5WX0gsIEFUT0ZfVEFSR19DLCBBVE9GX1RBUkdfTyk6IE5ldyB2YXJpYWJsZXMuCi0JKFNPVVJDRVMpOiBSZW5hbWUgZnJvbSBSRUFMX1NPVVJDRVMuICBEZWxldGUgb2xkIGRlZmluaXRpb24uCi0JKExJTktFRF9TT1VSQ0VTKTogUmVtb3ZlLgotCShIRUFERVJTKTogUmVuYW1lIGZyb20gUkVBTF9IRUFERVJTLiAgRGVsZXRlIG9sZCBkZWZpbml0aW9uLgotCShMSU5LRURfSEVBREVSUyk6IFJlbW92ZS4KLQkoT0JKUyk6IFVzZSAkKFRBUkdfQ1BVX08pLCBldGMuLCByYXRoZXIgdGhhbiB0YXJnLWNwdS5vLCBldGMuCi0JKCQoT0JKUykpOiBEZXBlbmQgdXBvbiAkKFRBUkdfRU5WX0gpLCBldGMuLCByYXRoZXIgdGhhbgotCXRhcmctY3B1LmgsIGV0Yy4KLQkoJChUQVJHX0NQVV9PKSwgJChPQkpfRk9STUFUX08pICQoQVRPRl9UQVJHX08pKTogTmV3IHRhcmdldHMuCi0JKHRhcmctY3B1Lm8sIG9iai1mb3JtYXQubywgYXRvZi10YXJnLm8pOiBSZW1vdmUgdGFyZ2V0cy4KLQkoaXRibC1jcHUuaCk6IFJlbW92ZSB0YXJnZXQuCi0JKERJU1RDTEVBTl9IRVJFKTogUmVtb3ZlIHRhcmctY3B1LmMsIG9iai1mb3JtYXQuYywgYXRvZi10YXJnLmMsCi0JYXRvZi10YXJnLmguCi0KLVRodSBNYXIgMjAgMTk6MTg6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoU3ltYm9sIE5hbWVzKTogRG9uJ3QgdXNlIG9ic29sZXRlIEBjdHJsIG1hY3JvLgotCi1UaHUgTWFyIDIwIDE2OjQ5OjE0IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtcmlfY2hpcCk6IFJlcGxhY2UgY2FsbHMgdG8gZ2V0X3N5bWJvbF9lbmQgYnkKLQlvcGVuIGNvZGVkIGxvb3AgdGhhdCBkb2VzIG5vdCByZXF1aXJlIHRoZSBuYW1lIHRvIHN0YXJ0IHdpdGggYQotCW5hbWUgYmVnaW5uZXIuCi0KLVRodSBNYXIgMjAgMTM6NDI6MDEgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIGZyYWdzLmMgKGZyYWdfdmFyKTogQ2hhbmdlIG9mZnNldCBwYXJhbWV0ZXIgdG8gb2Zmc2V0VC4KLQkoZnJhZ192YXJpYW50KTogTGlrZXdpc2UuCi0JKiBmcmFncy5oIChmcmFnX3ZhcmlhbnQsIGZyYWdfdmFyKTogVXBkYXRlIGRlY2xhcmF0aW9ucy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHN0cnVjdCBtNjhrX2l0KTogQ2hhbmdlIGZvZmYgZmllbGQgdG8KLQlvZmZzZXRULgotCShhZGRfZnJhZyk6IENoYW5nZSBvZmYgcGFyYW1ldGVyIHRvIG9mZnNldFQuCi0JKiBTZXZlcmFsIGZpbGVzOiBBZGQgY2FzdHMgdG8gY2FsbHMgdG8gZnJhZ192YXIuCi0KLQkqIE1ha2VmaWxlLmluIChtNjhrLXBhcnNlLmMpOiBEZXBlbmQgdXBvbiBpdGJsLXBhcnNlLmMsIHRvCi0Jc2VyaWFsaXplIGEgcGFyYWxsZWwgbWFrZS4KLQkoaXRibC1wYXJzZS5oKTogU3BsaXQgdGFyZ2V0IG91dCBmcm9tIGl0YmwtcGFyc2UuYy4KLQotVGh1IE1hciAyMCAxMjo0ODo0NSAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55IChtb3Rvcm9sYV9vcGVyYW5kKTogQWxsb3cgKHpkaXJlZyxFWFBSKS4KLQotCSogY29uZmlnL3RlLWRlbHRhLmggKENPRkZfQ09NTU9OX0FEREVORCk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQ2hlY2sgQ09GRl9DT01NT05fQURERU5EIHdoZW4KLQlzdG9yaW5nIHRoZSB2YWx1ZSBvZiBhIGNvbW1vbiBzeW1ib2wuCi0KLVdlZCBNYXIgMTkgMTE6Mzc6NTcgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGdsdWVfc3ltYm9scyk6IFVudXNlZCB2YXJpYWJsZSBzeW1ib2xQCi0JcmVtb3ZlZC4KLQkoY3Jhd2xfc3ltYm9scyk6IERvIG5vdCBtb2RpZnkgc3ltYm9sX3Jvb3RQIGFuZCBzeW1ib2xfbGFzdFAgaGVyZTsKLQl0aGF0IGlzIGRvbmUgYnkgc3ltYm9sX3JlbW92ZSBhbmQgc3ltYm9sX2luc2VydC4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKFNfSVNfTE9DQUwpOiBSZXR1cm4gMCBmb3IgYSBkZWJ1Z2dpbmcKLQlzeW1ib2wuCi0KLVdlZCBNYXIgMTkgMTE6MDY6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogSW4gMzIgYml0IG1vZGUsIHdoZW4gbm90Ci0JZGVhbGluZyB3aXRoIGEgNjQgYml0IG51bWJlciwgcGVybWl0IHRoZSB1cHBlciAzMiBiaXRzIHRvIGJlIHNldAotCWV2ZW4gaWYgYml0IDMxIGlzIG5vdCBzZXQuCi0KLVR1ZSBNYXIgMTggMjM6MzA6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgImVxdWl2Ii4KLQkoc19zZXQpOiBIYW5kbGUgLmVxdWl2IGJhc2VkIG9uIGFyZ3VtZW50LgotCSogZG9jL2FzLnRleGluZm8gKEVxdWl2KTogTmV3IG5vZGUgdG8gZG9jdW1lbnQgLmVxdWl2LgotCShFcnIpOiBOZXcgbm9kZSB0byBkb2N1bWVudCAuZXJyLgotCi1UdWUgTWFyIDE4IDE1OjUwOjEzIDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBNYW55IGZpbGVzOiBBZGQgZnVuY3Rpb24gcHJvdG90eXBlcy4KLQkqIGFzLmMgKHNob3dfdXNhZ2UsIHBhcnNlX2FyZ3MpOiBNYWtlIHN0YXRpYy4KLQkqIGZyYWdzLmggKGZyYWdfYWxsb2MpOiBEZWNsYXJlLgotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBEb24ndCBkZWNsYXJlIGZyYWdfYWxsb2MuCi0JKiBzeW1ib2xzLmMgKGRvbGxhcl9sYWJlbF9pbnN0YW5jZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBsb25nLgotCSogc3ltYm9scy5oIChwcmludF9zeW1ib2xfdmFsdWUpOiBEZWNsYXJlLgotCShwcmludF9leHByLCBwcmludF9leHByXzEsIHByaW50X3N5bWJvbF92YWx1ZV8xKTogRGVjbGFyZS4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogRG9uJ3QgZGVjbGFyZSBtYWtlX2V4cHJfc3ltYm9sLgotCShyZW1vdmVfc3Vic2VncywgcmVsYXhfZnJhZyk6IE1ha2Ugc3RhdGljLgotCSogY29uZmlnL2F0b2YtdmF4LmMgKGF0b2ZfdmF4X3NpemVvZik6IENoYW5nZSBsZXR0ZXIgdG8gaW50LgotCSh3aGF0X2tpbmRfb2ZfZmxvYXQpOiBMaWtld2lzZS4KLQkoYXRvZl92YXgpOiBNYWtlIHN0YXRpYy4gIENoYW5nZSB3aGF0X2tpbmQgdG8gaW50LgotCShtZF9hdG9mKTogQ2hhbmdlIHdoYXRfc3RhdGVtZW50X3R5cGUgdG8gaW50LgotCSogY29uZmlnL29iai1lY29mZi5oIChvYmpfZWNvZmZfc2V0X2V4dCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAodmF4X21kX2F0b2YpOiBEZWNsYXJlLgotCShtZF9hdG9mKTogRG9uJ3QgZGVjbGFyZSBhdG9mX2llZWUgYW5kIHZheF9tZF9hdG9mLgotCSogY29uZmlnL3RjLWkzODYuYyAoc2V0XzE2Yml0X2NvZGVfZmxhZyk6IE1ha2Ugc3RhdGljLgotCSogY29uZmlnL3RjLWkzODYuaCAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChhZGRfZml4KTogQ2hhbmdlIHdpZHRoIHRvIGludC4KLQkoaW5zZXJ0X3JlZyk6IENoYW5nZSByZWduYW1lIHRvIGNvbnN0LgotCShtZF9hdG9mKTogRG9uJ3QgZGVjbGFyZSBhdG9mX2llZWUuCi0JKGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUpOiBEb24ndCBkZWNsYXJlLgotCSogY29uZmlnL3RjLW04OGsuYyAobWRfYXRvZik6IERvbid0IGRlY2xhcmUgYXRvZl9pZWVlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKGNtcF9yZWdfZW50cnkpOiBDaGFuZ2UgYXJncyB0byBjb25zdCBQVFIuCi0JKHBhcnNlX2tleXdvcmRfYXJnKTogQ2hhbmdlIGxvb2t1cF9mbiB0byB0YWtlIGNvbnN0IGFyZy4KLQkobWRfYXRvZik6IERvbid0IGRlY2xhcmUgYXRvZl9pZWVlLgotCSogY29uZmlnL3RjLXNwYXJjLmg6IEFkZCBpZmRlZiBmb3IgbXVsdGlwbGUgaW5jbHVzaW9uLgotCSh0Y19hb3V0X3ByZV93cml0ZV9ob29rKTogRG9uJ3QgZGVjbGFyZS4KLQotTW9uIE1hciAxNyAxMToyMTowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmggKGJmZF9hbGxvY19ieV9zaXplX3QpOiBEb24ndCBkZWNsYXJlLgotCSogTWFueSBmaWxlczogVXNlIHhtYWxsb2MgcmF0aGVyIHRoYW4gYmZkX2FsbG9jX2J5X3NpemVfdC4KLQotU3VuIE1hciAxNiAxMzo0OToyMSAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IERvbid0IGNhbGwgZGVidWdfdmVyaWZ5X3N5bWNoYWluLgotCShzeW1ib2xfYXBwZW5kKTogU2V0IHN5X25leHQgYW5kIHN5X3ByZXZpb3VzIHdoZW4gYWRkaW5nIGEgc2luZ2xlCi0Jc3ltYm9sIHRvIGFuIGVtcHR5IGxpc3QuICBDYWxsIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbi4KLQkodmVyaWZ5X3N5bWJvbF9jaGFpbik6IFVzZSBhc3NlcnQsIG5vdCBrbm93LgotCi1TYXQgTWFyIDE1IDIwOjI3OjEyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBORVdTOiBOb3RlIEJlT1Mgc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbjogKHBwYy0qLWJlb3MpOiBOZXcgdGFyZ2V0LCB1c2UgY29mZiBhcyBvYmplY3QgZm9ybWF0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCi0JCi1TYXQgTWFyIDE1IDE5OjE0OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogSW1wcm92ZSBlcnJvciBtZXNzYWdlIGZvciBvdXQKLQlvZiByYW5nZSBicmFuY2guCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jaWVzIG9uIG9ic3RhY2suaCB3aGVyZSBuZWVkZWQuCi0KLUZyaSBNYXIgMTQgMTU6MzM6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEhhbmRsZSB0aGUKLQljYXNlIG9mIGEgc3ltYm9sIGVxdWF0ZWQgdG8gYW5vdGhlciBzeW1ib2wgd2hlbiB1c2luZyBTVlI0X1BJQy4KLQotCSogTWFrZWZpbGUuaW4gKFRBUkdfQ1BVX0RFUF9zcGFyYyk6IEFkZCBvcGNvZGUvc3BhcmMuaC4KLQotVGh1IE1hciAxMyAxMToyMDo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogQ2FsbCBMSVNUSU5HX05FV0xJTkUgYmVmb3JlCi0JSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZIHdoZW4gaGFuZGxpbmcgYW4gTVJJIGxpbmUgbGFiZWwuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfZGF0YSk6IENhbGwgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLQlhbmQgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkob2JqX2VsZl90ZXh0LCBvYmpfZWxmX3ByZXZpb3VzKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgMTIgMTE6NDA6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLW11bHRpLmggKHN0cnVjdCBlbGZfb2JqX3N5KTogRGVmaW5lIGlmCi0JT0JKX01BWUJFX0VMRi4KLQkoT0JKX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUgYXMgc3RydWN0IGVsZl9vYmpfc3kgaWYKLQlPQkpfTUFZQkVfRUxGLgotCSogY29uZmlnL29iai1lbGYuaCAoc3RydWN0IGVsZl9vYmpfc3kpOiBEb24ndCBkZWZpbmUgaWYKLQlPQkpfU1lNRklFTERfVFlQRSBpcyBkZWZpbmVkLgotCi0JKiBkb2MvYXMudGV4aW5mbyAoYnNzKTogSW1wcm92ZSBkZXNjcmlwdGlvbiBvZiAuYnNzIHNlY3Rpb24uICBJbgotCUVMRiBvciBDT0ZGLCB5b3UgYXJlIHBlcm1pdHRlZCB0byBzd2l0Y2ggaW50byB0aGUgc2VjdGlvbi4KLQkoQ29tbSk6IFJld3JpdGUgZGVzY3JpcHRpb24gb2YgY29tbW9uIHN5bWJvbHMuCi0JKExjb21tKTogTWVudGlvbiB0aGF0IHNvbWUgdGFyZ2V0cyBwZXJtaXQgYSB0aGlyZCBhcmd1bWVudC4KLQotVHVlIE1hciAxMSAwMToxMzozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9sY29tbSk6IERvbid0IGNhbGwgU19DTEVBUl9FWFRFUk5BTC4KLQotCSogc3ltYm9scy5jIChjb2xvbik6IENoYW5nZSB0eXBlIG9mIGxvY2FsIHRvIGludC4gIEZyb20gQWxhbiBNb2RyYQotCTxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4uCi0KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG04OGtfZG9fYWxpZ24pOiBEb24ndCB1c2UgYSBzcGVjaWFsIG5vcAotCWFsaWdubWVudCBpZiBhIHplcm8gZmlsbCBwYXR0ZXJuIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IExpa2V3aXNlLgotCi0JKiByZWFkLmMgKGVxdWFscyk6IEFsd2F5cyBwZXJtaXQgcmVnaXN0ZXIgbmFtZXMgdG8gYmUgcmVkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2ZpeF9hZGp1c3RhYmxlKTogUGVybWl0IGEgcmVsb2MgYWdhaW5zdCBhCi0JbWlwczE2IHN5bWJvbCB0byBiZSBhZGp1c3RlZCBpZiBhIHN5bWJvbCBpcyBiZWluZyBzdWJ0cmFjdGVkIGZyb20KLQlpdC4KLQotCUZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc3ltdmVyKTogQ2hlY2sgZm9yIGR1cGxpY2F0ZSBvcgotCWlsbGVnYWwgc3ltYm9sIHZlcnNpb24gbmFtZXMuCi0JKGVsZl9mcm9iX3N5bWJvbCk6IENoZWNrIGZvciBleHRlcm5hbCBkZWZhdWx0IHZlcnNpb25zLgotCi1TdW4gTWFyICA5IDIzOjQ5OjEyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGNvbmZpZy9vYmotZWxmLmggKHN0cnVjdCBlbGZfb2JqX3N5KTogRGVmaW5lLgotCShPQkpfU1lNRklFTERfVFlQRSk6IERlZmluZSB0byBlbGZfb2JqX3N5IHN0cnVjdC4gIENoYW5nZSBhbGwKLQl1c2Vycy4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc3ltdmVyKTogSnVzdCByZWNvcmQgdGhlIG5hbWUuCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBJbml0aWFsaXplZCB2ZXJzaW9uZWRfbmFtZSBmaWVsZC4KLQkoZWxmX2Zyb2Jfc3ltYm9sKTogSWYgdGhlcmUgaXMgYSB2ZXJzaW9uZWRfbmFtZSwgZWl0aGVyIHJlbmFtZSB0aGUKLQlzeW1ib2wsIG9yIGFkZCBhbiBhbGlhcyB3aXRoIHRoYXQgbmFtZS4KLQotVGh1IE1hciAgNiAxMzo1NTozMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX3JlbGF4X3RhYmxlKTogRGVmaW5lLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBJbXBsZW1lbnQuCi0JKG1kX2Fzc2VtYmxlKTogSGFuZGxlIHJlbGF4YWJsZSBvcGVyYW5kcy9pbnN0cnVjdGlvbnMgY29ycmVjdGx5LgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEltcGxlbWVudC4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmggKFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX3JlbGF4X3RhYmxlKTogRml4IHR5cG9zLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IERvbid0IHVzZSBhbnkgTU4xMDMwMCBzcGVjaWZpYwotCXJlbG9jcyBhbnltb3JlLiAgVHdlYWsgZnhfb2Zmc2V0IGZvciBwYy1yZWxhdGl2ZSByZWxvY3MuCi0KLVdlZCBNYXIgIDUgMTU6NDY6MTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25kLmMgKHNfaWZjKTogQ2FsbCBtcmlfY29tbWVudF9maWVsZCBhbmQgbXJpX2NvbW1lbnRfZW5kIHdoZW4KLQlpbiBNUkkgbW9kZS4KLQotVHVlIE1hciAgNCAxOTozNDoyMSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAic2VjdCIgYW5kICJzZWN0aW9uIgotCXBzZXVkby1vcHMuCi0JKiBjb25maWcvdGMtdGljODAuYyAobWRfYmVnaW4pOiBEZWNsYXJlIGV4dGVybmFsIHZhcmlhYmxlCi0JY29mZl9mbGFncyBhbmQgaW5zZXJ0IGFuIEZfQVIzMldSIGJpdCBpbnRvIGl0LgotCi1UdWUgTWFyICA0IDEwOjAxOjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChlcXVhbHMpOiBBZGQgcmVhc3NpZ24gcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCSogcmVhZC5oIChlcXVhbHMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0KLVNhdCBNYXIgIDEgMDE6MDQ6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IERvbid0IGFzc3VtZSB0aGF0IHdlCi0JY2FuIHJlbHkgb24gdGhlIGZyYWcgYWRkcmVzcyB0byBkZXRlcm1pbmUgd2hldGhlciBhIGZyYWcgaXMKLQllYXJsaWVyIG9yIGxhdGVyLgotCi1GcmkgRmViIDI4IDE0OjQwOjAwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuaCAoTE9DQUxfTEFCRUwpOiBPbmx5IGRlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkoU19MT0NBTF9OQU1FKTogTGlrZXdpc2UuCi0JKEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZSB1bmNvbmRpdGlvbmFsbHkuCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2FsbCBiZmRfaXNfbG9jYWxfbGFiZWwsIG5vdCBMT0NBTF9MQUJFTCwgaWYKLQlCRkRfQVNTRU1CTEVSLgotCShTX0lTX0xPQ0FMKTogQ2FsbCBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSwgbm90IExPQ0FMX0xBQkVMLgotCSogY29uZmlnL3RjLSouaDogT25seSBkZWZpbmUgTE9DQUxfTEFCRUwgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JRG9uJ3QgZGVmaW5lIEZBS0VfTEFCRUxfTkFNRS4KLQkqIGNvbmZpZy90ZS1pYzk2MC5oOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogRGVmaW5lLgotCShtaXBzX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfbG9jYWxfbGFiZWwpOiBSZW1vdmUuCi0KLQkqIGNvbmZpZy90ZS1zY28zODYuaDogUmVtb3ZlOyBub3QgdXNlZC4KLQotVGh1IEZlYiAyNyAxNTozOToxNiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgYWxpZ24gcHNldWRvIG9wIHRvIGRvCi0JYnl0ZSBhbGlnbm1lbnQgcmF0aGVyIHRoYW4gcG93ZXItb2YtdHdvIGFsaWdubWVudCB0aGF0IGlzIHRoZQotCUdBUyBkZWZhdWx0LgotCi1UaHUgRmViIDI3IDEzOjI5OjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgYSByZWxvYyB3aWR0aCBvZiAnVycuCi0KLQkqIGdhc3AuYyAoaGFzaF9hZGRfdG9fc3RyaW5nX3RhYmxlKTogQ29ycmVjdCBtaXNzcGVsbGluZyBpbiBlcnJvcgotCW1lc3NhZ2UsIGFuZCBhZGQgbmV3bGluZS4KLQkocHJvY2Vzc19maWxlKTogRG9uJ3QgcHJvY2VzcyBhc3NpZ25tZW50cyBpbiB0aGUgbGFiZWwgaWYgdGhpcyBpcwotCWEgZXF1IG9yIGFzc2lnbiBwc2V1ZG8tb3AuCi0JKHByb2Nlc3NfcHNldWRvX29wKTogU3dhcCBmaXJzdCBhcmd1bWVudCB0byBkb19hc3NpZ24gZm9yIEtfQVNTSUdOCi0JYW5kIEtfRVFVLCB0byBtYXRjaCBkb2N1bWVudGF0aW9uLgotCi1UaHUgRmViIDI3IDEyOjAwOjAzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbik6IEFkZCAncicgc2VjdGlvbiBhdHRyaWJ1dGUKLQl0byBkZW5vdGUgcmVhZC1vbmx5IGRhdGEgc2VjdGlvbnMuCi0KLVRodSBGZWIgMjcgMDA6MjY6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IFNldCBCU0ZfT0JKRUNUIGluIGZsYWdzLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfY29tbW9uKTogTGlrZXdpc2UsIGlmIEJGRF9BU1NFTUJMRVIuCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IFNpbXBsaWZ5IDBiIGhhbmRsaW5nLiAgRG9uJ3QgdHJlYXQgMGIgYXMgYQotCWJpbmFyeSBudW1iZXIgaWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzICcrJyBvciAnLScuCi0KLVdlZCBGZWIgMjYgMjA6NDc6MTIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChGTFRfQ0hBUlMpOiBDaGFuZ2UgZnJvbSAiZEQiIHRvICJmRiIuCi0JKGZpbmRfb3Bjb2RlKTogTWF0Y2ggb3BlcmFuZHMgdGhhdCBjYW4gYmUgZmxvYXRzLgotCShidWlsZF9pbnNuKTogSGFuZGxlIE9fYmlnIChmbG9hdCkgZXhwcmVzc2lvbnMgYW5kIGJ1aWxkCi0JY29ycmVjdCBvcGNvZGUuCi0KLVdlZCBGZWIgMjYgMTg6MTk6MDAgMTk5NyAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMqLSotbG5ld3MqKTogTmV3IHRhcmdldCwgYWxzbyBtYWtlIGVtcHR5Ci0JZW11bGF0aW9uIGxpc3QgZm9yIHRoaXMgdGFyZ2V0LgotCSogY29uZmlndXJlOiBVcGRhdGUuCi0JKiB0Yy1taXBzLmMgKEVDT0ZGX0xJVFRMRV9GT1JNQVQpOiBEZWZpbmUuCi0JKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IFVzZS4KLQkqIHRlLWxuZXdzLmg6IE5ldyBmaWxlLgotCi1XZWQgRmViIDI2IDE1OjMzOjQ2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAoZmluZF9vcGNvZGUsIGJ1aWxkX2luc24pOiBDaGFuZ2VzIHRvIG1hdGNoCi0Jb3BlcmFuZHMgd2l0aCA6bSBvciA6cyBtb2RpZmllcnMgYW5kIGdlbmVyYXRlIHRoZSByaWdodCBvcGNvZGVzCi0JZm9yIHRoZW0uCi0KLVdlZCBGZWIgMjYgMTE6NTY6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaCk6IFVzZSAkKEJJU09OKSBhbmQKLQkkKEJJU09ORkxBR1MpLCBub3QgJChZQUNDKSBhbmQgJChZQUNDRkxBR1MpLgotCi1UdWUgRmViIDI1IDIyOjAyOjIzIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluc3RyaW5nKTogVXNlbGVzcyBsb2NhbCBkZWNsYXJhdGlvbiBvZgotCWNyYWNrX29wZXJhbmQgcmVtb3ZlZC4KLQkqIGV4cHIuaCAoZXhwcmVzc2lvblMpOiBDaGFuZ2VkIHR5cGUgb2YgWF9vcCBmaWVsZCB0byBvcGVyYXRvclQgaWYKLQlfX0dOVUNfXy4KLQotVHVlIEZlYiAyNSAxMzoxNzoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gUm9iZXJ0IExpcGUgPHJvYmVydGxAZGdpaS5jb20+OgotCSogY29uZmlndXJlLmluOiBBZGQgaTM4NmNvZmYgYW5kIGkzODZlbGYgdG8gZW11bGF0aW9uIGxpc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBhcy5jIChpMzg2Y29mZiwgaTM4NmVsZik6IERlY2xhcmUuCi0JKiBvYmouaCAoY29mZl9mb3JtYXRfb3BzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChPQkpfSEVBREVSKTogRGVmaW5lLgotCShjb2ZmX29ial9zeW1ib2xfbmV3X2hvb2spOiBSZW5hbWUgZnJvbSBvYmpfc3ltYm9sX25ld19ob29rLgotCShjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2spOiBSZW5hbWUgZnJvbSBvYmpfcmVhZF9iZWdpbl9ob29rLgotCShvYmpfcHNldWRvX3RhYmxlKTogQWRkICJ2ZXJzaW9uIi4KLQkoY29mZl9wb3BfaW5zZXJ0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG5vX2Z1bmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2Zvcm1hdF9vcHMpOiBOZXcgdmFyaWFibGUuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9vYmpfc3ltYm9sX25ld19ob29rKTogRGVjbGFyZS4KLQkob2JqX3N5bWJvbF9uZXdfaG9vayk6IERlZmluZS4KLQkoY29mZl9vYmpfcmVhZF9iZWdpbl9ob29rKTogRGVjbGFyZS4KLQkob2JqX3JlYWRfYmVnaW5faG9vayk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKGkzODZfdGFyZ2V0X2Zvcm1hdCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBDaGVjayBPQkpfTUFZQkVfRUxGIGFzIHdlbGwgYXMgT0JKX0VMRjsgY2hlY2sKLQlPVVRQVVRfRkxBVk9SIHdoZW4gYXBwcm9wcmlhdGUuCi0JKGkzODZfdGFyZ2V0X2Zvcm1hdCk6IE5ldyBmdW5jdGlvbi4KLQkqIE1ha2VmaWxlLmluIChvYmotY29mZi5vKTogTmV3IHRhcmdldC4KLQkoZS1pMzg2Y29mZi5vLCBlLWkzODZlbGYubyk6IE5ldyB0YXJnZXRzLgotCi0JRnJvbSBTdGVwaGVuIFdpbGxpYW1zIDxzdGV2ZUBpY2FydXMuaWNhcnVzLmNvbT46Ci0JKiBjb25maWcvdGMtaTk2MC5oIChUQ19TWU1GSUVMRF9UWVBFKTogRGVmaW5lIGlmIE9CSl9DT0ZGLgotCShfdGNfZ2V0X2JhbF9vZl9jYWxsKTogRG9uJ3QgZGVjbGFyZS4KLQkodGNfZ2V0X2JhbF9vZl9jYWxsKTogRGVjbGFyZSBhcyBmdW5jdGlvbiwgZG9uJ3QgZGVmaW5lIGFzIG1hY3JvLgotCSogY29uZmlnL3RjLWk5NjAuYyAodGNfc2V0X2JhbF9vZl9jYWxsKTogSWYgT0JKX0NPRkYsIHN0b3JlIGJhbFAKLQlpbiBzeV90YyBmaWVsZCwgbm90IHhfYmFsbnRyeSBmaWVsZC4KLQkodGNfZ2V0X2JhbF9vZl9jYWxsKTogUmVuYW1lIGZyb20gX3RjX2dldF9iYWxfb2ZfY2FsbC4gIENoYW5nZQotCXJldHVybiB0eXBlIHRvIHN5bWJvbFMgKi4gIElmIE9CSl9DT0ZGLCByZXRyaWV2ZSB2YWx1ZSBmcm9tIHN5X3RjCi0JZmllbGQsIG5vdCB4X2JhbG50cnkgZmllbGQuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IFBlcm1pdCBhIC5ub3RlIHNlY3Rpb24gdG8KLQloYXZlIHRoZSBTSEZfQUxMT0MgYXR0cmlidXRlLgotCi0JKiBNYWtlZmlsZS5pbiAoJChPQkpTKSk6IERvbid0IGRlcGVuZCB1cG9uICQoSVRfSERSUykuCi0JKFRBUkdfQ1BVX0RFUF9taXBzKTogRGVwZW5kIHVwb24gJChzcmNkaXIpL2l0Ymwtb3BzLmguCi0JKGl0YmwtbGV4Lm8pOiBEZXBlbmQgdXBvbiBpdGJsLXBhcnNlLmguCi0KLQkqIGl0YmwtcGFyc2UueSAoeXllcnJvcik6IENoYW5nZSByZXR1cm4gdHlwZSB0byBpbnQuICBDaGFuZ2UgdG8KLQl1c2Ugb2xkIHN0eWxlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgotCi0JKiBNYWtlZmlsZS5pbiAoaXRibC1sZXgubyk6IFJlbW92ZSAtV2FsbC4KLQkoaXRibC1wYXJzZS5vKTogTGlrZXdpc2UuCi0KLQkqIGNvbmQuYyAoc19pZmRlZik6IElmIHdlIHNob3VsZCBvbWl0IGNvbmRpdGlvbmFscyBmcm9tIGxpc3RpbmdzLAotCWNhbGwgbGlzdGluZ19saXN0LgotCShzX2lmLCBzX2lmYywgc19lbmRpZiwgc19lbHNlLCBzX2lmZXFzKTogTGlrZXdpc2UuCi0JKiBsaXN0aW5nLmMgKGxpc3RfaW5mb19zdHJ1Y3QpOiBBZGQgRURJQ1RfTk9MSVNUX05FWFQuCi0JKGxpc3RpbmdfbGlzdGluZyk6IEhhbmRsZSBFRElDVF9OT0xJU1RfTkVYVC4KLQkobGlzdGluZ19saXN0KTogQW4gYXJndW1lbnQgb2YgMiBtZWFucyBFRElDVF9OT0xJU1RfTkVYVC4KLQkqIGxpc3RpbmcuaCAoTElTVElOR19OT0NPTkQpOiBEZWZpbmUuCi0JKExJU1RJTkdfU0tJUF9DT05EKTogRGVmaW5lLgotCSogYXMuYyAoc2hvd191c2FnZSk6IE1lbnRpb24gYyBhcyBhIHN1Ym9wdGlvbiBvZiAtYS4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSBjIGFzIGEgc3Vib3B0aW9uIG9mIC1hLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IC1hbGMuCi0KLU1vbiBGZWIgMjQgMjM6MzQ6MTQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9hcHBseV9maXgpOiBIYW5kbGUgUl9BQlMgdHlwZSBmaXh1cHMuCi0KLU1vbiBGZWIgMjQgMTg6Mjc6NDMgMTk5NyAgRXJpYyBZb3VuZ2RhbGUgIDxlcmljQGFuZGFudGUuamljLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IC5zeW12ZXIuCi0KLU1vbiBGZWIgMjQgMTU6MTk6NTcgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IENoYW5nZSBwcmVfZGVmaW5lZF9yZWdpc3RlcnMgdG8gCi0JZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycyBhbmQgcmVnX25hbWVfY250IHRvIGQxMHZfcmVnX25hbWVfY250LgotCi1Nb24gRmViIDI0IDEwOjQwOjQ1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYzogRml4IHR5cG8gaW4gY29tbWVudCBzZWN0aW9uLgotCSogY29uZmlnL3RjLXRpYzgwLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBlbnRyeSBmb3IgYnNzLCB3aGljaCB0YWtlcwotIAlhbiBhZGRpdGlvbmFsIGFsaWdubWVudCBhcmd1bWVudC4KLQkoZmluZF9vcGNvZGUpOiBBbGxvdyBPX3N5bWJvbCByZWxvY3MgZm9yIGFueSAzMiBiaXQgZmllbGQsIG5vdCBqdXN0Ci0gCWJhc2UgcmVsYXRpdmUgb25lcy4KLQkoYnVpbGRfaW5zbik6IEhhbmRsZSBPX3N5bWJvbCByZWxvY3MgZm9yIGFueSAzMiBiaXQgZmllbGQsIG5vdCBqdXN0Ci0gCWJhc2UgcmVsYXRpdmUgb25lcy4KLQotTW9uIEZlYiAyNCAwMjoyMzowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgZGVwZW5kYW5jaWVzIG9uIGl0YmwtY3B1LmguCi0JKiBhcy5jOiBEZWZpbmUgc3R1YnMgZm9yIGl0YmxfcGFyc2UgYW5kIGl0YmxfaW5pdCBpZiBIQVZFX0lUQkxfQ1BVIAotCWlzIG5vdCBkZWZpbmVkLgotCi1Nb24gRmViIDI0IDAyOjAzOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogaXRibC1vcHMuaDogSW5jbHVkZSBhcy5oLgotCi1Nb24gRmViIDI0IDAxOjA0OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogYXMuYzogUmVtb3ZlIC10IG9wdGlvbi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBNb3ZlIGl0YmwtY3B1LmggdG8gbWlwcyBzcGVjaWZpYyBjb25maWd1cmUuCi0JKiBpdGJsLW9wcy5oOiBJbmNsdWRlIGl0YmwtY3B1Lmggb25seSBpZiBIQVZFX0lUQkxfQ1BVIGlzIGRlZmluZWQuCi0JKiBjb25maWcvdGMtbWlwcy5oOiBEZWZpbmUgSEFWRV9JVEJMX0NQVS4KLQotU3VuIEZlYiAyMyAxODowMTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGl0Ymwtb3BzLmM6IERvbid0IGRlZmluZSBERUJVRy4KLQotU3VuIEZlYiAyMyAxNzo0OTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUgaXRibC10ZXN0LmMgdG8gcmVmbGVjdCBpdHMgbmV3IGxvY2F0aW9uLgotCi1TdW4gRmViIDIzIDE1OjUwOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogaXRibC1vcHMuYzogQWRkIHRlc3QgZm9yIGl0YmxfaGF2ZV9lbnRyaWVzLgotCSogY29uZmlnL3RjLW1pcHMuYzogUmVtb3ZlIHRlc3QgZm9yIGl0YmxfaGF2ZV9lbnRyaWVzLgotCSogY29uZmlnL3RjLW1pcHMuaDogRGVmaW5lIHRjX2luaXRfYWZ0ZXJfYXJncyB0byBtaXBzX2luaXRfYWZ0ZXJfYXJncy4KLQotU3VuIEZlYiAyMyAxODoxMzoxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBSZW1vdmUgaXRibC1wYXJzZS55LCBpdGJsLWxleC5sLCBhbmQKLQlpdGJsLW9wcy5jLiAgQWRkIGl0YmwtcGFyc2UuYyBhbmQgaXRibC1sZXguYy4KLQkoTEVYLCBMRVhGTEFHUyk6IERlZmluZS4KLQkqIGl0Ymwtb3BzLmMgKGFwcGVuZF9pbnNuc19hc19tYWNyb3MpOiBSZW1vdmUgYm9ndXMgQVNTRVJULgotCi1TYXQgRmViIDIyIDIxOjI1OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogaXRibC1wYXJzZS55OiBGaXggaW5kZW50YXRpb24gbWlzdGFrZXMgZnJvbSBpbmRlbnQgcHJvZ3JhbS4KLQkqIGl0YmwtbGV4Lmw6IEZpeCBpbmRlbnRhdGlvbiBtaXN0YWtlcyBmcm9tIGluZGVudCBwcm9ncmFtLgotCSogaXRibC1vcHMuaDogQWRkIGluY2x1ZGUgZm9yIGFuc2lkZWNsLmguCi0JQWRkIFBBUkFNUyBhcm91bmQgZnVuY3Rpb24gYXJndW1lbnRzLgotCUFkZCBkZWNsYXJhdGlvbiBmb3IgaXRibF9oYXZlX2VudHJpZXMuCi0JKiBpdGJsLW9wcy5jOiBBZGQgUEFSQU1TIGFyb3VuZCBmdW5jdGlvbiBhcmd1bWVudHMuCi0JKiBNYWtlZmlsZS5pbjogQWRkIGl0YmwgYnVpbGQgcnVsZXMuCi0JQWRkIGRlcGVuZGFuY2llcyBmb3IgaXRibCBmaWxlcyB0byBtaXBzIHRhcmdldC4KLQkqIGFzLmM6IEFkZCBpdGJsIHN1cHBvcnQuCi0JQWRkIG5ldyBvcHRpb24gIi0taW5zdHRibCIgZm9yIGR5bmFtaWNhbGx5IGV4dGVuZGluZyBpbnN0cnVjdGlvbiBzZXQuCi0JKiBhcy5oOiBEZWNsYXJlIGluc3R0YmxfZmlsZV9uYW1lOwotCXRoZSBuYW1lIG9mIGZpbGUgZGVmaW5pbmcgZXh0ZW5zaW9ucyB0byB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gc2V0IAotCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6IEFkZCBpdGJsLXBhcnNlLm8sIGl0YmwtbGV4Lm8sIGFuZCAKLQlpdGJsLW9wcy5vIHRvIGV4dHJhX29iamVjdHMgZm9yIG1pcHMgY29uZmlndXJhdGlvbi4KLQlBZGQgaW5jbHVkZSBmaWxlIGxpbmsgZnJvbSBpdGJsLWNwdS5oIHRvIAotCWNvbmZpZy9pdGJsLSR7dGFyZ2V0X2NwdV90eXBlfS5oLgotCSogY29uZmlnL3RjLW1pcHMuYzogQWxsb3cgY29weiBpbnN0cnVjdGlvbnMuCi0JQWRkIG5vdGVzIGZvciBmdXR1cmUgYWRkaXRpb25zIHRvIHRoZSBpdGJsIHN1cHBvcnQuCi0JQWRkIGRlYnVnIG1hY3Jvcy4KLQkobWFjcm8pOiBDYWxsIGl0YmxfYXNzZW1ibGUgdG8gYXNzZW1ibGUgaXRibCBpbnN0cnVjdGlvbnMuCi0JU2VlIGlmIGFuIHVua25vd24gcmVnaXN0ZXIgaXMgc3BlY2lmaWVkIGluIGFuIGl0YmwgZW50cnkuCi0KLVNhdCBGZWIgMjIgMjA6NTM6MDEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogRml4IHR5cG8gaW4gbWRfc2VjdGlvbl9hbGlnbgotCWRlc2NyaXB0aW9uLgotCSogY29uZmlnL3RjLXRpYzgwLmggKE5FRURfRlhfUl9UWVBFKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXRpYzgwLmMgKGZpbmRfb3Bjb2RlKTogQWRkIGNvZGUgdG8gc3VwcG9ydCBPX3N5bWJvbAotCW9wZXJhbmRzLgotCShidWlsZF9pbnNuKTogR3JhYiBhIGZyYWcgZWFybHkgc28gd2UgY2FuIHVzZSB0aGUgYWRkcmVzcyBpbgotIAlmaXh1cHMuICBUYWtlIG9uZSdzIGNvbXBsZW1lbnQgb2YgQklUTlVNIHZhbHVlcyBiZWZvcmUgaW5zZXJ0aW9uCi0gCWluIG9wY29kZS4gIEFkZCBjb2RlIHRvIHN1cHBvcnQgT19zeW1ib2wgb3BlcmFuZHMuCi0JKG1kX2FwcGx5X2ZpeCk6IFJlcGxhY2UgdW5pbXBsZW1lbnRlZCB3YXJuaW5nIHdpdGggaW1wbGVtZW50YXRpb24uCi0JKG1kX3BjcmVsX2Zyb20pOiBEaXR0by4KLQkodGNfY29mZl9maXgycnR5cGUpOiBEaXR0by4KLQotRnJpIEZlYiAyMSAxNDozNDozMSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBOZXcgZnVuY3Rpb24uIAotCSogY29uZmlnL3RjLWQzMHYuaDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLgotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogUmV0dXJuIDAgaWYKLSAgICAgICAgcmVsb2NhdGlvbiBpcyBpbiBkaWZmZXJlbnQgc2VjdGlvbi4KLQotRnJpIEZlYiAyMSAxMDowODoyNSAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIHRjLW1pcHMuYyAobWlwc19pcCk6IElmIGNvbmZpZ3VyZWQgZm9yIGFuIGVtYmVkZGVkIEVMRiBzeXN0ZW0sCi0JZG9uJ3Qgc2V0IHRoZSBzZWN0aW9uIGFsaWdubWVudCB0byAyKio0LgotCi1GcmkgRmViIDIxIDExOjU1OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobGluZV9jb21tZW50X2NoYXJzKTogQWRkICcqJy4KLQotCSogYXBwLmMgKExFWF9JU19UV09DSEFSX0NPTU1FTlRfMk5EKTogRG9uJ3QgZGVmaW5lLgotCShkb19zY3J1Yl9iZWdpbik6IERvbid0IHNldCBsZXhbJyonXS4KLQkoZG9fc2NydWJfY2hhcnMpOiBXaGVuIGhhbmRsaW5nIExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNULCBkb24ndAotIAljaGVjayBmb3IgTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8yTkQuICBJbnN0ZWFkLCBqdXN0IGNoZWNrIGZvcgotCWEgbGl0ZXJhbCAnKicuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGVtPXN2cjQgZm9yIG02OGstKi1zeXN2NCouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGUtc3ZyNC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfY29tbWVudF9jaGFycyk6IE9ubHkgaW5jbHVkZSBgIycgaWYKLQlURV9TVlI0IG9yIFRFX0RFTFRBLgotCi1UaHUgRmViIDIwIDIyOjI0OjM5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfY29udmVydF9mcmFnKTogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZQotCXNob3J0IGNvbmRpdGlvbmFsIGJyYW5jaCBhcm91bmQgYSBsb25nIHVuY29uZGl0aW9uYWwgYnJhbmNoLgotCi1UaHUgRmViIDIwIDEzOjU2OjAwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2xuIFtib3RoIHZlcnNpb25zXSk6IENhbGwKLQluZXdfbG9naWNhbF9saW5lLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGZpeF9uZXdfYXJtKTogVXNlIG1ha2VfZXhwcl9zeW1ib2wgdG8gaGFuZGxlIGEKLQljb21wbGV4IGV4cHJlc3Npb24uCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBJZiBib3RoIGxlZnQgYW5kIHJpZ2h0Ci0Jb3BlcmFuZHMgYXJlIHVuZGVmaW5lZCwgd2FybiBhYm91dCBib3RoIG9mIHRoZW0uCi0KLVdlZCBGZWIgMTkgMDA6NTM6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfcHNldWRvX3RhYmxlKTogQWRkICJzeW12ZXIiLgotCShvYmpfZWxmX3N5bXZlcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLWVsZi5oIChPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IENvcHkgdGhlIHN0X290aGVyCi0JZmllbGQuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X3NlZ21lbnQpOiBNYWtlIHR5cGUgYW5kIHByaW50ZiBmb3JtYXQgYWdyZWUuCi0KLQkqIHJlYWQuYyAoZ2V0X2xpbmVfc2IpOiBEb24ndCBlbmQgdGhlIGxpbmUgb24gYSBzZW1pY29sb24gaW5zaWRlIGEKLQlzdHJpbmcuCi0KLVR1ZSBGZWIgMTggMTg6NDI6NTEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMsIGNvbmZpZy90Yy1kMzB2Lmg6IE5ldyBmaWxlcy4KLQotIAkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQkKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNhc2UgZm9yIGQzMHYuCi0KLVN1biBGZWIgMTYgMTc6NDc6MjkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChtZF9vcGVyYW5kKTogRGVmaW5lIHdpdGggYSBudWxsIGV4cGFuc2lvbiwKLQlsaWtlIGFsbCB0aGUgb3RoZXIgdGFyZ2V0cy4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBBZGQgbWlzc2luZyB3b3JkIGluIAotCW1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IGRlc2NyaXB0aW9uLiAgRml4IHR5cG8gaW4gbWRfY29udmVydF9mcmFnCi0JZGVzY3JpcHRpb24uCi0JKiBjb25maWcvdGMtdGljODA6IE1pbm9yIGNvbW1lbnQgYWRkaXRpb25zL2NoYW5nZXMuCi0JCi1GcmkgRmViIDE0IDE4OjA5OjU5IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKExPQ0FMX0xBQkVMKTogTWFjcm8gcmVkZWZpbmVkIGlmIFRFX0RFTFRBLgotCSh0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUpOiBNYWNybyBkZWZpbmVkIGlmIFRFX0RFTFRBLgotIAkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9kZWYpOiBVc2UKLQl0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgaWYgZGVmaW5lZC4KLQkob2JqX2NvZmZfdGFnLCBvYmpfY29mZl92YWwpOiBMaWtld2lzZS4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IFJlamVjdCAnficgYXMgb3BlcmF0b3IgaWYgaXNfbmFtZV9iZWdpbm5lci4KLQotRnJpIEZlYiAxNCAxNzoyNDo0OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBub3RlcyBmcm9tIFBldGVyIEVyaWtzc29uIDxwZXRlckBpZm0ubGl1LnNlPi4gIFRoZSB0YXJnZXQKLQlkb2VzIG5vdCBhY3R1YWxseSB3b3JrLCB0aG91Z2g6Ci0JKiBjb25maWd1cmUuaW4gKGkzODYtc2VxdWVudC1ic2QqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy90Yy1keW5peC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1pMzg2Lmg6IERlZmluZSBUQVJHRVRfRk9STUFUIGlmIFRFX0RZTklYLgotCi0JKiByZWFkLmMgKGRvX2FsaWduKTogQWRkIG1heCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JUmVtb3ZlIHVzZWxlc3Mgc3RhdGljIHZhcmlhYmxlcy4KLQkoc19hbGlnbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uICBEbyBjb21tb24gcG9ydGlvbiBvZgotCXNfYWxpZ25fYnl0ZXMgYW5kIHNfYWxpZ25fcHR3by4KLQkoc19hbGlnbl9ieXRlcywgc19hbGlnbl9wdHdvKTogSnVzdCBjYWxsIHNfYWxpZ24uCi0JKiBmcmFncy5jIChmcmFnX2FsaWduKTogQWRkIG1heCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGZyYWdfYWxpZ25fcGF0dGVybik6IExpa2V3aXNlLgotCSogZnJhZ3MuaCAoZnJhZ19hbGlnbiwgZnJhZ19hbGlnbl9wYXR0ZXJuKTogVXBkYXRlIGRlY2xhcmF0aW9ucy4KLQkqIHdyaXRlLmMgKHJlbGF4X3NlZ21lbnQpOiBMaW1pdCBhbGlnbm1lbnQgY2hhbmdlIHRvIGZyX3N1YnR5cGUuCi0JRml4IHNvbWUgdHlwZXMgdG8gYmUgYWRkcmVzc1QuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc2l6ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWllZWUuYyAoc2l6ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtZDEwdi5oIChtZF9kb19hbGlnbik6IEFkZCBtYXggcGFyYW1ldGVyLgotCSogY29uZmlnL3RjLWkzODYuaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tODhrLmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtODhrX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc2guaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogYXMuaDogSW1wcm92ZSBjb21tZW50cyBvbiByc19hbGlnbiBhbmQgcnNfYWxpZ25fY29kZS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBuZXcgYWxpZ25tZW50IGFyZ3VtZW50cy4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoRnJhZ3MpOiBEb2N1bWVudCB1c2Ugb2YgZnJfc3VidHlwZSBmaWVsZCBmb3IKLQlyc19hbGlnbiBhbmQgcnNfYWxpZ25fY29kZS4KLQotRnJpIEZlYiAxNCAxNTo1NjowNiAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogQ2hhbmdlZCBvcGNvZGUgcGFyc2luZy4KLQotVGh1IEZlYiAxMyAyMDowMjoxNiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3t0Yy1hbHBoYS5oLCB0Yy1kMTB2LmgsIHRjLWdlbmVyaWMuaCwgdGMtaTk2MC5oLAotCXRjLW1uMTAyMDAuaCwgdGMtbW4xMDMwMC5oLCB0Yy1zaC5oLCB0Yy12YXguaCwgdGMtdzY1Lmh9OgotCUFkZCBkZWZhdWx0IGRlZmluaXRpb24gb2YgemVybyBmb3IgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4uCi0JKiBjb25maWcve3RjLWFybS5oLCB0Yy1ocHBhLmgsIHRjLWkzODYuaCwgdGMtbWlwcy5oLCB0Yy1uczMyay5oLAotIAl0Yy1wcGMuaCwgdGMtc3BhcmMuaH06IE1vdmUgZGVmaW5pdGlvbiBvZiBUQVJHRVRfQllURVNfQklHX0VORElBTgotCXRvIGEgbG9jYXRpb24gY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSB0YXJnZXQgaW5jbHVkZSBmaWxlcy4KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IFJlbW92ZSBtaXNsZWFkaW5nIGNvbW1lbnQuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogQWRkIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9uCi0JbWRfdW5kZWZpbmVkX3N5bWJvbC4KLQkqIGNvbmZpZy90Yy10aWM4MC5jOiBBZGQgY29kZSB0byBpbnNlcnQgcHJlZGVmaW5lZCBzeW1ib2xzIGludG8gdGhlCi0Jc3ltYm9sIHRhYmxlIHNvIHRoZXkgY2FuIGJlIHBhcnNlZCBieSB0aGUgc3RhbmRhcmQgZXhwcmVzc2lvbiBwYXJzZXIuCi0JUmVtb3ZlIGN1c3RvbSBjb2RlIHRoYXQgdXNlIHRvIHBhcnNlIHRoZW0uCi0JKiBjb25maWcvdGMtdGljODAuaDogTW92ZSBkZWZpbml0aW9uIG9mIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0JdG8gYSBsb2NhdGlvbiBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRhcmdldCBpbmNsdWRlIGZpbGVzLgotCQotVGh1IEZlYiAxMyAyMTo0NDoxOCAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogYXMuaDogR05VIGMgcHJvdmlkZXMgdW5saW5rKCkgZnVuY3Rpb24uCi0KLQlVbmlmeSBzZWN0aW9uIGhhbmRsaW5nIG9uIG9wZW5WTVMvQWxwaGE6Ci0JKiBjb25maWcvdGMtYWxwaGEuYyhzX2FscGhhX2xpbmspOiBSZW1vdmUuCi0JKHNfYWxwaGFfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQlSZW1vdmUgY2FzZS1oYWNraW5nIG9mIHN5bWJvbHMKLQlBZGQgLmNvZGVfYWRkcmVzcyBwc2V1ZG8tb3AuCi0JKEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUik6IE5ldyByZWxvY2F0aW9uLgotCShzX2FscGhhX2NvZGVfYWRkcmVzcyk6IE5ldyBmdW5jdGlvbi4KLQkoYWxwaGFfY3RvcnNfc2VjdGlvbiwgYWxwaGFfZHRvcnNfc2VjdGlvbik6IE5ldyBzZWN0aW9ucyBmb3IgQysrCi0Jc3RhdGljIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycy4KLQlBZGQgZGVidWcgY29kZSBmb3IgY3Jhc2ggZGVidWdzLCB0byBiZSByZW1vdmVkIHdoZW4gdHJhY2ViYWNrIGNvZGUKLQlpcyBhZGRlZCB0byBvYmplY3QgY29kZS4KLQkoc19hbHBoYV9uYW1lKTogTmV3IGZ1bmN0aW9uIGZvciAubmFtZSBwc2V1ZG8tb3AuCi0JKGFscGhhX3ByaW50X3Rva2VuKTogTmV3IGZ1bmN0aW9uIHRvIHByaW50IHRva2VuIGV4cHJlc3Npb25zIHdpdGgKLQlhbHBoYSBzcGVjaWZpYyBleHRlbnNpb25zLgotCi0JKiBtYWtlZmlsZS52bXM6IEFsbG93IGNvbXBpbGF0aW9uIHdpdGggY3VycmVudCBnY2Mgc25hcHNob3QuCi0KLVRodSBGZWIgMTMgMTY6Mjk6MDQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoVEVYSTJEVkkpOiBTZXQgdG8ganVzdCBuYW1lIG9mIHByb2dyYW0uCi0JKERWSVBTKTogU2V0IHRvIGR2aXBzLgotCShwcywgYXMucHMsIGdhc3AucHMpOiBOZXcgdGFyZ2V0cy4KLQkoaW50ZXJuYWxzLmluZm8sIGdhc3AuZHZpLCBpbnRlcm5hbHMuZHZpKTogU2V0IGJvdGggVEVYSU5QVVRTCi0gCWFuZCBNQUtFSU5GTyBlbnYgdmFyaWFibGVzLgotCShpbnRlcm5hbHMucHMpOiBVc2UgRFZJUFMgbWFjcm8uCi0JKGNsZWFuKTogUmVtb3ZlIGNvcmUgYW5kIGJhY2t1cCBmaWxlcy4KLQkoZGlzdGNsZWFuKTogUmVtb3ZlIHRlbXBvcmFyeSBmaWxlcyBmcm9tIGJ1aWxkaW5nIGludGVybmFscy4KLQkoY2xlYW4tZHZpKTogRGl0dG8uCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKEZyYWdzKTogRml4IHR5cG8uCi0JKEdBUyBwcm9jZXNzaW5nKTogRGl0dG8uCi0JKENQVSBiYWNrZW5kKTogRGl0dG8uCi0JKiBlY29mZi5jIChpbml0X2ZpbGUpOiBVc2UgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gdmFsdWUgZGlyZWN0bHkuCi0JKiBtcHctY29uZmlnLmluOiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gYXMgMS4KLQkqIHJlYWQuYzogUmVtb3ZlIHVnbHkgaGFjayB0aGF0IGRlYWx0IHdpdGggY29uZmlnIGZpbGVzIG5vdAotCWNvcnJlY3RseSBkZWZpbmluZyBUQVJHRVRfQllURVNfQklHX0VORElBTi4KLQkodGFyZ2V0X2JpZ19lbmRpYW4pOiBVc2UgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gZGlyZWN0bHkuCi0JKiBjb25maWcvYXJtLWJpZy5tdDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHRvIDEuCi0JKiBjb25maWcvYXJtLWxpdC5tdDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHRvIDAuCi0JKiBjb25maWcvbWlwcy1iaWcubXQ6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB0byAxLgotCSogY29uZmlnL21pcHMtbGl0Lm10OiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gdG8gMC4KLQkqIGNvbmZpZy9wcGMtbGl0Lm10OiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gdG8gMS4KLQkqIGNvbmZpZy9wcGMtc29sLm10OiBSZXBsYWNlIFRBUkdFVF9CWVRFU19MSVRUTEVfRU5ESUFOCi0Jd2l0aCBUQVJHRVRfQllURVNfQklHX0VORElBTiBkZWZpbmVkIHRvIDAuCi0JKiBjb25maWcvdGMtYXJtLmg6IFJlbW92ZSB1c2Ugb2YgVEFSR0VUX0JZVEVTX0xJVFRMRV9FTkRJQU4KLQlhbmQgc2ltcGxpZnkuICBUZXN0IHZhbHVlIG9mIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCBub3QganVzdAotCXdoZXRoZXIgaXQgaXMgZGVmaW5lZCBvciBub3QuCi0JKiBjb25maWcvdGMtbWlwcy5oOiBSZW1vdmUgdXNlIG9mIFRBUkdFVF9CWVRFU19MSVRUTEVfRU5ESUFOLgotCSogY29uZmlnL3RjLXBwYy5oOiBSZW1vdmUgdXNlIG9mIFRBUkdFVF9CWVRFU19MSVRUTEVfRU5ESUFOCi0JYW5kIHNpbXBsaWZ5LiBUZXN0IHZhbHVlIG9mIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCBub3QganVzdAotCXdoZXRoZXIgaXQgaXMgZGVmaW5lZCBvciBub3QuCi0JKiBjb25maWcvdGljODAuaCAoVEFSR0VUX0ZPUk1BVCk6IERlZmluZSB0byBjb2ZmLXRpYzgwLgotCShUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZSB0byAwLgotCi1UaHUgRmViIDEzIDE0OjQwOjE2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IENvcnJlY3QgdGV4dCBpbiBhc19mYXRhbCBlcnJvciBtZXNzYWdlLAotCWJmZF9wZXJmb3JtX3JlbG9jYXRpb24gLT4gYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4KLQotVGh1IEZlYiAxMyAxNDo0ODowMyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChMRVhfVElMREUpOiBEZWZpbmUgaWYgVEVfREVMVEEuCi0JKiByZWFkLmMgKExFWF9USUxERSk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkobGV4X3R5cGUpOiBVc2UgTEVYX1RJTERFLgotCSogZXhwci5jIChnZXRfc3ltYm9sX2VuZCk6IENoZWNrIGZpcnN0IGNoYXIgd2l0aCBpc19uYW1lX2JlZ2lubmVyLAotCW5vdCBpc19wYXJ0X29mX25hbWUuCi0KLVRodSBGZWIgMTMgMTE6NDA6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2hvd191c2FnZSk6IEFkZCBtaXNzaW5nIGJhY2tzbGFzaCBhdCBlbmQKLQlvZiBjb250aW51ZWQgbGluZS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBDb3JyZWN0IGJhc2UgYWRkcmVzcwotCWZvciBhbiBleHRlbmRlZCBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbi4KLQkobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHByZXZfbm9wX2ZyYWcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcmV2X25vcF9mcmFnX2hvbGRzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHJldl9ub3BfZnJhZ19yZXF1aXJlZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHByZXZfbm9wX2ZyYWdfc2luY2UpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShhcHBlbmRfaW5zbik6IElmIHdlIGFyZW4ndCByZW9yZGVyaW5nLCBhbmQgcHJldl9ub3BfZnJhZyBpcyBub3QKLQlOVUxMLCBhbmQgd2UgZG9uJ3QgbmVlZCBhbnkgbm9wcywgdGhlbiBkZWNyZWFzZSB0aGUgc2l6ZSBvZgotCXByZXZfbm9wX2ZyYWcuICBEb24ndCBpbnNlcnQgbm9wcyBiZWNhdXNlIG9mIGluc3RydWN0aW9ucyBpbgotCW5vcmVvcmRlciBzZWN0aW9ucy4gIFJlbWVtYmVyIHdoZXRoZXIgdGhlIHByZXZpb3VzIGluc3RydWN0aW9ucwotCXdoZXJlIGluIG5vcmVvcmRlciBzZWN0aW9ucyBldmVuIHdoZW4gbm90IHJlb3JkZXJpbmcuCi0JKG1pcHNfbm9fcHJldl9pbnNuKTogQWRkIHByZXNlcnZlciBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4gIFJlZmVyIHByZXZfbm9wX2ZyYWcgdmFyaWFibGVzIHdoZW4gYXBwcm9wcmlhdGUuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBTZXQgdXAgcHJldl9ub3BfZnJhZy4KLQkoc19taXBzc2V0KTogQ2xlYXIgcHJldl9ub3BfZnJhZyBpZiByZW9yZGVyaW5nLgotCi1XZWQgRmViIDEyIDE0OjM2OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBSZW1vdmUgdXNlbGVzcyBjb2RlIHdoaWNoCi0JaGFuZGxlZCBzd2FwcGluZyBhIG1pcHMxNiBqdW1wIHdpdGggYSBtaXBzMTYgaW5zdHJ1Y3Rpb24gd2l0aCBhCi0JcmVsb2MuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbik6IFdoZW4gZGVidWdnaW5nLCBzZXQKLQltaXBzX29wdGltaXplIHRvIDEsIG5vdCAwLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfaXApOiBIYW5kbGUgYW4gZXh0ZW5kIG9wZXJhbmQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG15X2dldEV4cHJlc3Npb24pOiBJbiBtaXBzMTYgbW9kZSwgaWYgaXQgbG9va3MKLQlsaWtlIHRoZSBleHByZXNzaW9uIHdhcyBiYXNlZCBvbiBgLicsIGFkanVzdCB0aGUgdmFsdWUgb2YgdGhlCi0Jc3ltYm9sLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IFdhcm4gYWJvdXQgYW4gYXR0ZW1wdCB0byBwdXQgYW4KLSAJZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gaW4gYSBkZWxheSBzbG90IHdoZW4gbm90IHJlb3JkZXJpbmcuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IFdhcm4gaWYgYW4gZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gYXBwZWFycyBpbiBhCi0JZGVsYXkgc2xvdC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19wc2V1ZG9fdGFibGUpOiBBZGQgImluc24iLgotCShzX2luc24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogZG9jL2MtbWlwcy50ZXhpOiBEb2N1bWVudCAuaW5zbi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBBZGQgdGhlIGdlbmVyYWwgcmVnaXN0ZXJzIHRvIHRoZQotCXN5bWJvbCB0YWJsZS4KLQkobWlwczE2X2lwKTogRmlyc3QgcGFyc2UgdGhlIGV4cHJlc3Npb24sIGFuZCB0aGVuIHNlZSB3aGV0aGVyIGl0Ci0JY2FtZSB1cCB3aXRoIGEgcmVnaXN0ZXIsIHJhdGhlciB0aGFuIHRyeWluZyB0byBmaXJzdCBzZWUgd2hldGhlcgotCXdlIGFyZSBsb29raW5nIGF0IGEgcmVnaXN0ZXIuCi0KLVR1ZSBGZWIgMTEgMTU6MTM6MzkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jOiBOdW1lcm91cyBjaGFuZ2VzIGFuZCBhZGRpdGlvbnMgdG8gZmxlc2gKLQlvdXQgZnVuY3Rpb25zIHRoYXQgd2VyZSBwcmV2aW91c2x5IGp1c3Qgc3R1YnMsIGFuZCBmaXggc29tZQotCXByb2JsZW1zIGZvdW5kIHVzaW5nIHRoZSBuZXcgVEljODAgdGVzdHN1aXRlIGNhc2VzLgotCi1UdWUgRmViIDExIDE1OjUyOjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2lwKTogSGFuZGxlICVncHJlbCBtb2RpZmllci4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogT3V0cHV0IGp1bXAgaW5zdHJ1Y3Rpb24gYXMgYQotCXBhaXIgb2YgMiBieXRlIGluc3RydWN0aW9ucywgcmF0aGVyIHRoYW4gYXMgYSBzaW5nbGUgNCBieXRlCi0JaW5zdHJ1Y3Rpb24uCi0KLU1vbiBGZWIgMTAgMjI6MDY6MDAgMTk5NyAgRGF3biBQZXJjaGlrICAoZGF3bkBjeWdudXMuY29tKQotCi0JKiBpdGJsLW9wcy5jLCBpdGJsLWxleC5sLCBpdGJsLXBhcnNlLnksIGl0Ymwtb3BzLmgsCi0JY29uZmlnL2l0YmwtbWlwcy5oOiBBZGQgY29weXJpZ2h0IG1lc3NhZ2UgYW5kIGZpeCBpbmRlbnRhdGlvbi4KLQotTW9uIEZlYiAxMCAxODowOTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIChkYXduQGN5Z251cy5jb20pCi0KLQkqIGl0Ymwtb3BzLmM6IE5ldyBmaWxlLiAgQWRkIHN1cHBvcnQgZm9yIGR5bmFtaWNhbGx5IHJlYWQgCi0JaW5zdHJ1Y3Rpb24gcmVnaXN0ZXJzLCBvcGNvZGVzIGFuZCBmb3JtYXRzLiAgQnVpbGQgaW50ZXJuYWwgdGFibGUgCi0JZm9yIG5ldyBpbnN0cnVjdGlvbnMgYW5kIHByb3ZpZGUgY2FsbGJhY2tzIGZvciBhc3NlbWJsZXIgYW5kIAotCWRpc2Fzc2VtYmxlci4KLQkqIGl0YmwtbGV4LmwsIGl0YmwtcGFyc2UueTogTGV4IGFuZCB5YWNjIHBhcnNlcnMgZm9yIGluc3RydWN0aW9uIAotCXNwZWMgdGFibGUuCi0JKiBpdGJsLW9wcy5oOiBOZXcgZmlsZS4gIEhlYWRlciBmaWxlIGZvciBpdGJsIHN1cHBvcnQuCi0JKiBjb25maWcvaXRibC1taXBzLmg6IE5ldyBmaWxlLiAgTWlwcyBzcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IKLQlpdGJsIHN1cHBvcnQuCi0KLUZyaSBGZWIgIDcgMDk6NTI6MzQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9hc3NlbWJsZSk6IElmIGEgY29uc3RhbnQgb3BlcmFuZCB3b24ndAotCWZpdCBpbnRvIHRoZSBjb25zdGFudCBmaWVsZCBvZiBhIHJlbGF4YWJsZSBvcGVyYW5kLCB0aGVuIGl0IGRvZXMKLQlub3QgbWF0Y2guCi0KLVRodSBGZWIgIDYgMjA6MDg6MTIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFRyZWF0Ci0JYSBqc3IgdGFyZ2V0IGluIGEgZGlmZmVyZW50IHNlY3Rpb24ganVzdCBsaWtlIGEganNyIHRvCi0JYW4gdW5kZWZpbmVkIHRhcmdldC4KLQotVGh1IEZlYiAgNiAxNjo1Mjo1NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgcmVsb2NhdGlvbnMKLQlhZ2FpbnN0IGFueSBtaXBzMTYgc3ltYm9scywgbm90IGp1c3QgZXh0ZXJuYWxseSB2aXNpYmxlIG9uZXMuCi0JKG1kX2FwcGx5X2ZpeCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi1XZWQgRmViICA1IDExOjExOjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2lwKTogQWNjZXB0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBpbgotCXRoZSBvcGVyYW5kIG9mIHRoZSBleGl0IGluc3RydWN0aW9uLgotCi1UdWUgRmViICA0IDE0OjEyOjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IElmIHdlIGxlYXZlIGFuIGVxdWF0ZWQgc3ltYm9sCi0JYXMgT19zeW1ib2wsIGNvcHkgb3ZlciB0aGUgc2VnbWVudC4KLQotTW9uIEZlYiAgMyAxMjozNTo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IElmIHdlIGFyZW4ndCBhZGp1c3RpbmcgdGhpcwotCWZpeHVwIHRvIGJlIGFnYWluc3QgdGhlIHNlY3Rpb24gc3ltYm9sLCBhZGp1c3QgdGhlIHZhbHVlCi0JYWNjb3JkaW5nbHkuCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBEb24ndCBjaGFuZ2UgWF9hZGRfbnVtYmVyIGZvcgotCWFuIGVxdWF0ZWQgc3ltYm9sLgotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogQXZvaWQgbG9vcGluZyBvbiBlcXVhdGVkIHN5bWJvbHMuCi0JQWRqdXN0IGZ4X29mZnNldCBieSBYX2FkZF9udW1iZXIgZm9yIGVhY2ggc3ltYm9sLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBBdm9pZCBsb29waW5nIG9uIGVxdWF0ZWQKLQlzeW1ib2xzLgotCShmaXh1cF9zZWdtZW50KTogQWRkIGEgbG9vcCB0byB0cmFjayBkb3duIGVxdWF0ZWQgc3ltYm9scyBhbmQKLQlhZGp1c3QgZnhfb2Zmc2V0IGFwcHJvcHJpYXRlbHkuCi0KLUZyaSBKYW4gMzEgMTU6MjE6MDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9yZWxheF90YWJsZSk6IEFkZCBlbnRyaWVzIHRvIGFsbG93Ci0Jam1wIC0+IGJyYSByZWxheGluZy4KLQkobWRfY29udmVydF9mcmFnKTogSGFuZGxlIGptcC0+YnJhIHJlbGF4aW5nLgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSBqbXAtPmJyYSByZWxheGluZy4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBMaWtld2lzZS4KLQotRnJpIEphbiAzMSAxMzoxNTowNSAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfYWxpZ25fY29kZSk6IEFkZCBjb21tZW50cyBleHBsYWluaW5nIHRoZQotCW5vcCBpbnN0cnVjdGlvbnMuCi0KLUZyaSBKYW4gMzEgMTA6NDY6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoZW5mb3JjZV9hbGlnbmVkX2RhdGEpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzcGFyY19jb25zX2FsaWduKTogRG9uJ3QgZG8gYW55dGhpbmcgdW5sZXNzIGVuZm9yY2VfYWxpZ25lZF9kYXRhCi0JaXMgc2V0LgotCShtZF9sb25nb3B0cyk6IEFkZCAiZW5mb3JjZS1hbGlnbmVkLWRhdGEiLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtLWVuZm9yY2UtYWxpZ25lZC1kYXRhLgotCSogZG9jL2Mtc3BhcmMudGV4aSAoU3BhcmMtQWxpZ25lZC1EYXRhKTogTmV3IG5vZGU7IGRvY3VtZW50Ci0JZW5mb3JjZS1hbGlnbmVkLWRhdGEuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogSWYgT0JKX1hDT0ZGLCBhZGQgImxvbmciLAotIAkid29yZCIsIGFuZCAic2hvcnQiLgotCShwcGNfeGNvZmZfY29ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIHdyaXRlLmMgKHJlbGF4X3NlZ21lbnQpOiBHaXZlIGFuIGVycm9yIGlmIGEgLnNwYWNlIHN5bWJvbCBpcwotCWNvbW1vbiBvciB1bmRlZmluZWQuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogRG9uJ3QgaGFuZGxlIG1yaV9wZW5kaW5nX2FsaWduIGlmCi0JdGhlIGhhbmRsZXIgaXMgc19nbG9ibCBvciBzX2lnbm9yZS4KLQotVGh1IEphbiAzMCAxMTo0Njo1OSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9vcGNvZGUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICJudW1vcHMiLgotCSogY29uZmlnL3RjLXRpYzgwLmM6IE1hbnkgYWRkaXRpb25zIHRvIHByZXZpb3VzIHBsYWNlaG9sZGVyIGZpbGUuCi0JKiBjb25maWcvdGMtdGljODAuaDogRGl0dG8uCi0KLVRodSBKYW4gMzAgMTI6Mjg6MTggMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2FsaWduX2NvZGUpOiBJbXByb3ZlIHRoZSBub3AgcGF0dGVybnMuCi0KLVRodSBKYW4gMzAgMTI6MDg6NDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2ZpeF9hZGp1c3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLW1pcHMuaCAodGNfZml4X2FkanVzdGFibGUpOiBDYWxsIG1pcHNfZml4X2FkanVzdGFibGUuCi0JKG1pcHNfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlLgotCi0JSWRlYXMgZnJvbSBTcmluaXZhcyBBZGRhZ2FybGEgPHNyaW5pdmFzQGNkb3RkLmVybmV0LmluPjoKLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogQWZ0ZXIgZG9pbmcgYW4gbXJpX3BlbmRpbmdfYWxpZ24sCi0JYWRqdXN0IHRoZSBsaW5lX2xhYmVsIGlmIHRoZXJlIGlzIG9uZS4KLQkoc19zcGFjZSk6IFNldCBtcmlfcGVuZGluZ19hbGlnbiBpZiBhbiBvZGQgbnVtYmVyIG9mIGJ5dGVzIHdlcmUKLQlvdXRwdXQuCi0KLVdlZCBKYW4gMjkgMTU6MzE6MTIgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmggKG1kX2RvX2FsaWduKTogQWRkIHRoaXMgaG9vayB0byBjYWxsCi0JZDEwdl9jbGVhbnVwKCkgd2hlbiBhICIuYWxpZ24iIGlzIGRldGVjdGVkLgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IENvcnJlY3RseSBjYWxjdWxhdGUKLQlicmFuY2ggZGlzcGxhY2VtZW50IHdoZW4gLmFsaWducyBhcmUgcHJlc2VudC4KLQotV2VkIEphbiAyOSAwOTo0MjoxMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX3JlbGF4X3RhYmxlKTogRGVmaW5lLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBJbXBsZW1lbnQuCi0JKG1kX2Fzc2VtYmxlKTogSGFuZGxlIHJlbGF4YWJsZSBvcGVyYW5kcy9pbnN0cnVjdGlvbnMgY29ycmVjdGx5LgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEltcGxlbWVudC4KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmggKFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUpOiBEZWZpbmUuCi0KLVR1ZSBKYW4gMjggMTU6Mjc6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IEdpdmUgYW4gZXJyb3IgZm9yIGp1bXBzIHRvIGEKLQltaXNhbGlnbmVkIGFkZHJlc3MuCi0JKG1kX2FwcGx5X2ZpeCk6IE1ha2UgYSBicmFuY2ggdG8gYW4gb2RkIGFkZHJlc3MgYW4gZXJyb3IgcmF0aGVyCi0JdGhhbiBhIHdhcm5pbmcuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2NvbnZlcnRfZnJhZyk6IElmIHRoZSB1c2VyIGV4cGxpY2l0bHkKLQlyZXF1ZXN0ZWQgYW4gZXh0ZW5kZWQgb3Bjb2RlLCBwYXNzIHdhcm4gYXMgdHJ1ZSB0byBtaXBzMTZfaW1tZWQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pcCk6IEhhbmRsZSBhIG1pc3NpbmcgZXhwcmVzc2lvbiBsaWtlCi0JYW4gZXhwbGljaXQgMCwgc28gdGhhdCBleHBsaWNpdGx5IGV4dGVuZGVkIGluc3RydWN0aW9ucyB3b3JrCi0JY29ycmVjdGx5LgotCi1Nb24gSmFuIDI3IDE3OjQxOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IERvbid0IGdlbmVyYXRlIGEgbG9jYWwgRUNPRkYKLQlzeW1ib2wgZm9yIGEgY29tbW9uIHN5bWJvbC4KLQotV2VkIEphbiAyMiAxMDozOTozOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JUGF0Y2ggcHJlc3VtZWQgdG8gaGF2ZSBiZWVuIGNoZWNrZWQgaW4gYXdoaWxlIGFnbyBidXQgd2Fzbid0LgotCU1vbiBOb3YgMjUgMTA6NDU6MTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0JKiB3cml0ZS5jOiBEZWxldGUgImlmbmRlZiBtZF9yZWxheF9mcmFnIiBhcm91bmQgaXNfZG5yYW5nZS4KLQkocmVsYXhfc2VnbWVudCwgY2FzZSByc19vcmcpOiBNb3ZlIGNvZGUgaW5zaWRlIGJyYWNlcy4gIE1vdmUgbG9jYWxzCi0JdGFyZ2V0LGFmdGVyIGluc2lkZSB0b28uCi0JKHJlbGF4X3NlZ21lbnQsIGNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQpOiBHdXRzIG1vdmVkIHRvIC4uLgotCShyZWxheF9mcmFnKTogTmV3IGZ1bmN0aW9uLgotCUNhbGwgbWRfcHJlcGFyZV9yZWxheF9zY2FuIGlmIGRlZmluZWQuCi0KLU1vbiBKYW4gMjAgMTA6NTY6NDcgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZWplY3QgcGMtcmVsYXRpdmUgYWRkcmVzc2VzIGZvciB0aGUKLSAJJ3AnIG9wZXJhbmQgc3BlY2lmaWVyLgotCi1Nb24gSmFuIDIwIDEwOjM5OjM2IDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChIQVZFX0xPTkdfQlJBTkNIKTogTmV3IG1hY3JvLCByZXR1cm5zIHRydWUgZm9yCi0gCW02OGsgZmFtaWx5IGNwdXMgd2hpY2ggc3VwcG9ydCBsb25nIGJyYW5jaCBhZGRyZXNzaW5nIG1vZGVzLgotCShtNjhrX2lwLCBtZF9jb252ZXJ0X2ZyYWdfMSwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsCi0gCW1kX2NyZWF0ZV9sb25nX2p1bXApOiBVc2UgaXQuCi0KLU1vbiBKYW4gMjAgMTI6NDI6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IERvbid0IHNldCBTRUNfQUxMT0Mgb3IgU0VDX0xPQUQgZm9yCi0JdGhlIC5yZWdpbmZvIG9yIC5NSVBTLm9wdGlvbnMgc2VjdGlvbiBpZiBjb25maWd1cmVkIGZvciBhbgotCWVtYmVkZGVkIHRhcmdldC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBEb24ndCBzZXQgaW50ZXJsb2NrcyBmb3IKLQltaXBzXzQ2NTAuCi0KLVdlZCBKYW4gMTUgMTM6NTE6NTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IE1ha2Ugc3VyZSB0aGUgc3ltYm9sIGVuZHMgd2l0aAotCXdoaXRlc3BhY2UgYmVmb3JlIGNoZWNraW5nIHdoZXRoZXIgdGhlIG5leHQgY2hhcmFjdGVyIGlzICc9Jy4KLQotVHVlIEphbiAxNCAxNTowNzoyNyAxOTk3ICBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoc2NvX2lkKTogTW92ZWQgZnJvbSBoZXJlLi4uCi0JKiBjb25maWcvb2JqLWVsZi5jIChzY29faWQpOiAuLi50byBoZXJlLiAgQWRkaW5nIHRoZSBpZGVudGlmaWVyCi0JcmVhbGx5IGlzIGFuIFNDTyBFTEYgc3BlY2lmaWMgdGhpbmcsIG5vdCBqdXN0IGEgU0NPIHg4NiBzcGVjaWZpYwotCXRoaW5nLgotCi1Nb24gSmFuIDEzIDIyOjQzOjAxIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0aWM4MC0qLSopOiBEb24ndCByZXF1aXJlICdjb2ZmJy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IEphbiAgOSAwOTowODo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogQ2hlY2sgZm9yIG92ZXJmbG93IG9mIGEgbmVnYXRpdmUgdmFsdWUKLQljb3JyZWN0bHkuCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzdHJ1Y3QgbGFiZWxfbGluZSk6IERlZmluZS4KLQkobGFiZWxzLCBjdXJyZW50X2xhYmVsKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG1kX2Fzc2VtYmxlKTogTWFyayBjdXJyZW50X2xhYmVsIGFzIHRleHQsIGFuZCBjbGVhciBpdC4KLQkobTY4a19mcm9iX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCShtNjhrX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogTmV3IGZ1bmN0aW9uLgotCShtNjhrX2Zyb2Jfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLW02OGsuaCAodGNfZnJvYl9sYWJlbCk6IERlZmluZS4KLQkobWRfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBEZWZpbmUuCi0JKHRjX2Zyb2Jfc3ltYm9sKTogRG9uJ3Qgd2FybiwganVzdCBjYWxsIG02OGtfZnJvYl9zeW1ib2wuCi0JKHRjX2Zyb2JfY29mZl9zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBXaGVuIGRlZmluaW5nIGEgbWFjcm8gaW4gTVJJIG1vZGUsCi0JZG9uJ3QgYWRkIHRoZSBzeW1ib2wgdG8gdGhlIHN5bWJvbCB0YWJsZS4KLQotVHVlIEphbiAgNyAxMToyMTo0MiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBzeW0xLXN5bTIgZml4dXBzCi0JaGVyZSBzaW5jZSBmaXh1cF9zZWdtZW50IGRvZXNuJ3QgKGxpbmtyZWxheCBpcyBzZXQpLgotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLU1vbiBKYW4gIDYgMTU6MTk6MzIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9hc3NlbWJsZSk6IFR3ZWFrIGZ4X29mZnNldCBmb3IgcGMtcmVsYXRpdmUKLQlyZWxvY3MuCi0KLUZyaSBKYW4gIDMgMTY6NDc6MDggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0KTogVHdlYWsgZnhfcl9maWVsZCdzIHR5cGUKLQl0byBhdm9pZCB3YXJuaW5ncyB3aXRoIHRoZSBuYXRpdmUgSFAgY29tcGlsZXIuCi0JKGZpeF9uZXdfaHBwYSk6IFNpbWlsYXJseSBmb3IgdGhlIHJfdHlwZSBhcmd1bWVudC4KLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlLCBocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbik6IEVuY2xvc2UKLQlpbiBhbiAjaWYgT0JKX0VMRiB0byBrZWVwIGdjYyAtV2FsbCBxdWlldC4KLQkobWRfYXBwbHlfZml4KTogQWx3YXlzIGluaXRpYWxpemUgInJlc3VsdCIuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2Fzc2VtYmxlKTogR2VuZXJhdGUgcmVsb2NhdGlvbnMuCi0KLUZyaSBKYW4gIDMgMTg6MTc6MjMgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfZXZlbik6IEFkanVzdCB0aGUgYWxpZ25tZW50IG9mIHRoZSBjdXJyZW50Ci0Jc2VjdGlvbi4KLQotRnJpIEphbiAgMyAxNzoxMDozMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2ZpbGVfc3ltYm9sKTogV2hlbiB1c2luZyBFQ09GRiBkZWJ1Z2dpbmcsCi0JcGFzcyBvbiB0aGUgbmV3IGZpbGUgaG9vay4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2ZpeF9hZGp1c3RhYmxlKTogTm90IHF1aXRlIHRoZSBzYW1lIGFzCi0JIWFscGhhX2ZvcmNlX3JlbG9jYXRpb24sIGFzIGxvY2FsIExJVEVSQUxzIGNhbiBiZSBhZGp1c3RlZCB0byBiZQotCXJlbGF0aXZlIHRvIHRoZSBzZWN0aW9uLgotCi1GcmkgSmFuICAzIDEyOjA5OjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHlhbmtfc3ltYm9scyk6IElmIHRjX2Zyb2JfY29mZl9zeW1ib2wgaXMKLQlkZWZpbmVkLCBjYWxsIGl0LgotCSogY29uZmlnL3RjLW02OGsuaCAodGNfZnJvYl9zeW1ib2wpOiBDaGVjayB3aGV0aGVyIHRleHQgbGFiZWwgaXMKLQlhbGlnbmVkIHRvIG9kZCBib3VuZGFyeS4KLQkodGNfZnJvYl9jb2ZmX3N5bWJvbCk6IERlZmluZS4KLQotCSogZG9jL2FzLnRleGluZm8gKFNldCk6IENoYW5nZSBwYXJlbnRoZXNpemVkIEB4cmVmIHRvIEBweHJlZi4KLQotCSogbWFjcm8uYyAobWFjcm9fZXhwYW5kX2JvZHkpOiBJbiBNUkkgbW9kZSwganVzdCBjb3B5IGEgc2luZ2xlICYuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBDYWxsIGZyYWdfZ3JvdyBiZWZvcmUgYWRkaW5nIGEKLQlQQ0lOREVYIGZyYWcuICBGcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT4uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBBY2NlcHQgJ0InIGFzIGEgc2l6ZSBmb3IgYW4KLQlpbW1lZGlhdGUgdmFsdWUuCi0JKG1kX2Fzc2VtYmxlKTogSWYgdGhlIHNpemUgaXMgJ0InLCBzZXQgZnhfc2lnbmVkLgotCShtZF9hcHBseV9maXhfMik6IFVzZSBmeF9zaWduZWQgd2hlbiBjaGVja2luZyBmb3Igb3ZlcmZsb3cuCi0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBBZGQgZnhfc2lnbmVkIGZpZWxkLgotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IEluaXRpYWxpemUgZnhfbm9fb3ZlcmZsb3cgYW5kCi0JZnhfc2lnbmVkIGZpZWxkcy4KLQkoZml4dXBfc2VnbWVudCk6IFVzZSBmeF9zaWduZWQgd2hlbiBjaGVja2luZyBmb3Igb3ZlcmZsb3cuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IENoZWNrIGZ4X25vX292ZXJmbG93IGFuZAotCWZ4X3NpZ25lZCB3aGVuIGNoZWNraW5nIGZvciBvdmVyZmxvdy4KLQotVGh1IEphbiAgMiAxMzozNzoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE5PVEVTLCBOT1RFUy5jb25maWc6IFJlbW92ZWQuICBUaGVzZSBhcmUgcmFyZWx5LCBpZiBldmVyLAotCXVwZGF0ZWQsIGFuZCBhbGwgdGhlIHVzZWZ1bCBpbmZvcm1hdGlvbiBpcyBpbiBkb2MvaW50ZXJuYWxzLnRleGkuCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT46Ci0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENoZWNrIGZvciBjb25kaXRpb25hbCBvcGVyYXRvcnMKLQliZWZvcmUgZG9pbmcgYW4gTVJJIHBlbmRpbmcgYWxpZ25tZW50LgotCSogY29uZmlnL3RjLW02OGsuaCAobTY4a19jb25kaXRpb25hbF9wc2V1ZG9vcCk6IERlY2xhcmUuCi0JKHRjX2NvbmRpdGlvbmFsX3BzZXVkb3ApOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2NvbmRpdGlvbmFsX3BzZXVkb3ApOiBOZXcgZnVuY3Rpb24uCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogRGVzY3JpYmUKLQl0Y19jb25kaXRpb25hbF9wc2V1ZG9vcC4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPjoKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lKTogTmV3IHN0YXRpYwotCXZhcmlhYmxlLgotCShtZF9iZWdpbik6IENoZWNrIG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lIGJlZm9yZSBzZXR0aW5nCi0JbTY4a19yZWwzMi4KLQkobTY4a19tcmlfbW9kZV9jaGFuZ2UpOiBMaWtld2lzZS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgLS1kaXNwLXNpemUtZGVmYXVsdC0xNiBhbmQKLQktLWRpc3Atc2l6ZS1kZWZhdWx0LTMyLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbmV3IG9wdGlvbnMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIG5ldyBvcHRpb25zLgotCSogZG9jL2MtbTY4ay50ZXhpIChNNjhLLU9wdHMpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPjoKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaW5kZXhfd2lkdGhfZGVmYXVsdCk6IE5ldyBzdGF0aWMKLQl2YXJpYWJsZS4KLQkobTY4a19pcCk6IFVzZSBtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQgdG8gc2V0IHRoZSBzaXplIG9mIGEgYmFzZQotCXJlZ2lzdGVyIHdob3NlIHNpemUgd2FzIG5vdCBnaXZlbi4KLQkobWRfbG9uZ29wdHMpOiBBZGQgLS1iYXNlLXNpemUtZGVmYXVsdC0xNiBhbmQKLQktLWJhc2Utc2l6ZS1kZWZhdWx0LTMyLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbmV3IG9wdGlvbnMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIG5ldyBvcHRpb25zLgotCSogZG9jL2MtbTY4ay50ZXhpIChNNjhLLU9wdHMpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotCSogZG9jL2MtbWlwcy50ZXhpOiBNZW50aW9uIElTQSBsZXZlbCA0LCBhbmQgdGhlIC1taXBzMTYgb3B0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBtaXBzLSotbGludXgqIHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IFJld3JpdGUgNjQgYml0IGhhbmRsaW5nIHRvCi0Jd29yayBpZiB2YWx1ZVQgaXMgb25seSAzMiBiaXRzLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBUaHJvdWdob3V0LCBjaGVjayB0YXJnZXRfYmlnX2VuZGlhbiByYXRoZXIKLSAJdGhhbiBieXRlX29yZGVyLgotIAkoYnl0ZV9vcmRlcik6IFJlbW92ZS4KLQkobWlwc19pbml0X2FmdGVyX2FyZ3MpOiBSZW1vdmUuCi0JKiBjb25maWcvdGMtbWlwcy5oIChMSVRUTEVfRU5ESUFOLCBCSUdfRU5ESUFOKTogRG9uJ3QgZGVmaW5lLgotCShtaXBzX2luaXRfYWZ0ZXJfYXJncyk6IERvbid0IGRlY2xhcmUuCi0JKHRjX2luaXRfYWZ0ZXJfYXJncyk6IERvbid0IGRlZmluZS4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAodGNfZnJvYl9hZnRlcl9yZWxvY3MpOiBEZWZpbmUgaWYKLQlPQkpfTUFZQkVfRUxGLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgMzEgMTU6MTI6MzUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IElmIHRoaXMgaXMgc3N0LntoLHd9IG9yCi0Jc2xkLntoLHd9IGFuZCB0aGUgb3BlcmFuZCBpcyByZWxvY2F0YWJsZSwgYWRqdXN0IHRoZSBhZGVuZCBieQotCXNoaWZ0aW5nIGl0IHJpZ2h0IG9uZSBiaXQuCi0KLVR1ZSBEZWMgMzEgMTI6NTY6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENoZWNrIG1yaV9wZW5kaW5nX2FsaWduIGFmdGVyCi0JY2hlY2tpbmcgZm9yIGEgbWFjcm8uICBGcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUKLQk8cmZnQG1vbmtleXMuY29tPi4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBBZGQgLURfR05VX1NPVVJDRS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWUgZnJvbSBtZF9hcHBseV9maXgsIGFuZAotIAlhZGQgc2VnbWVudCBhcmd1bWVudC4gIElmIE9CSl9FTEYsIHRyZWF0IGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEKLSAJc3ltYm9sIGluIGEgbGlua29uY2Ugc2VjdGlvbiBsaWtlIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuIGV4dGVybmFsCi0gCXN5bWJvbC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChNRF9BUFBMWV9GSVgzKTogRGVmaW5lLgotCi1Nb24gRGVjIDMwIDExOjM1OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X21hY3JvKTogQWRkIGNhc2UgZm9yIE1fQUJTLgotCi1GcmkgRGVjIDI3IDIyOjUxOjUxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBOT1RFUy5jb25maWcgKEltcGxlbWVudGF0aW9uKTogYXMuaCAjZGVmaW5lJ3MgIkdBUyIgbm90ICJnYXMiLAotCWluY2x1ZGVzIGNvbmZpZy5oIGluc3RlYWQgb2YgaG9zdC5oLCB0Yy5oIGluc3RlYWQgb2YgdHAuaCwgYW5kCi0JdGFyZy1lbnYuaCBpbnN0ZWFkIG9mIHRhcmdldC1lbnZpcm9ubWVudC5oLgotCUFsc28sIG9iai1mb3JtYXQuaCBpbmNsdWRlcyB0YXJnLWNwdS5oIGluc3RlYWQgb2YKLSAJdGFyZ2V0LXByb2Nlc3Nvci5oLgotCSogY29uZmlndXJlLmluIChjYXNlICR7Z2VuZXJpY190YXJnZXR9KTogQWRkIHRpYzgwLSotY29mZiBlbnRyeS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmYvdGljODAuaCk6IEluY2x1ZGUgaWYgVENfVElDODAgZGVmaW5lZC4KLQkoVEFSR0VUX0ZPUk1BVCk6IERlZmluZSB0byAiY29mZi10aWM4MCIuCi0JKiBjb25maWcvdGMtdGljODAuYzogTmV3IGZpbGUgZm9yIFRJYzgwIHN1cHBvcnQuCi0JKiBjb25maWcvdGMtdGljODAuaDogTmV3IGZpbGUgZm9yIFRJYzgwIHN1cHBvcnQuCi0JCi1GcmkgRGVjIDI3IDExOjQyOjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKE0pOiBNZW50aW9uIGV4cGxpY2l0bHkgdGhhdCAtTSBjaGFuZ2VzIG1hY3JvCi0JaGFuZGxpbmcuCi0KLVRodSBEZWMgMTkgMTI6MDY6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IElmIHRoZSBmaXh1cCBzeW1ib2wgaGFzIGJlZW4KLQllcXVhdGVkIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wsIGNvbnZlcnQgdGhlIGZpeHVwIHRvIGJlaW5nIGFnYWluc3QKLQl0aGUgdGFyZ2V0IHN5bWJvbC4gIFJlbW92ZSBvYnNvbGV0ZSBjb2RlIGhhbmRsaW5nIGEgc3BlY2lhbCBjYXNlCi0JZm9yIGkzODYgUElDLgotCi1XZWQgRGVjIDE4IDIyOjU0OjM5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBVc2UgTmV3Rm9sZGVyUmVjdXJzaXZlIGZvciBpbnN0YWxsYXRpb24uCi0KLVdlZCBEZWMgMTggMTY6MDA6NDIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGRvX2Fzc2VtYmxlKTogQ29ycmVjdCBwcmV2aW91cyBidWcgZml4LgotCi1XZWQgRGVjIDE4IDE1OjI3OjQwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hc3NlbWJsZSk6IEZpeCBidWcgd2hpY2ggY2F1c2VkCi0Jc2Vjb25kIGluc3RydWN0aW9uIGluIGEgbGluZSB0byBiZSBjYXNlIHNlbnNpdGl6ZS4KLQotV2VkIERlYyAxOCAxMDowODo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1uMTAyMDBfaW5zZXJ0X29wZXJhbmQpOiBEb24ndAotCXJhbmdlIGNoZWNrIG9wZXJhbmRzIHdpdGggTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0sgc2V0LgotCShjaGVja19vcGVyYW5kKTogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgMTcgMTA6NTk6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBVbmRvIHBhcnQgb2YgbGFzdCBGcmlkYXkncyBhbGlnbm1lbnQgY2hhbmdlcy4KLSAJKG1kX2JlZ2luKTogQWx3YXlzIGFsaWduIHRoZSB0ZXh0IHNlY3Rpb24gdG8gYSBmb3VyIGJ5dGUKLQlib3VuZGFyeS4KLQkoYXBwZW5kX2luc24pOiBSZW1vdmUgY2FsbCB0byByZWNvcmRfYWxpZ24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGluc25fbGFiZWwpOiBSZW1vdmUuCi0JKHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QpOiBEZWZpbmUuCi0JKGluc25fbGFiZWxzLCBmcmVlX2luc25fbGFiZWxzKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhcHBlbmRfaW5zbik6IE1hcmsgYWxsIG1pcHMxNiB0ZXh0IGxhYmVscywgYW5kIG1ha2UgdGhlbSBvZGQuCi0JSGFuZGxlIGFsbCBsYWJlbHMgYWZ0ZXIgZW1pdHRpbmcgYSBub3AsIG5vdCBqdXN0IG9uZS4gIENhbGwKLQltaXBzX2NsZWFyX2luc25fbGFiZWxzIHJhdGhlciB0aGFuIGp1c3QgY2xlYXJpbmcgaW5zbl9sYWJlbC4KLQkobWlwc19lbWl0X2RlbGF5cyk6IEFkZCBpbnNucyBwYXJhbWV0ZXIsIGFuZCB1c2UgaXQgdG8gZGVjaWRlCi0Jd2hldGhlciB0byBtYXJrIG1pcHMxNiBsYWJlbHMuICBIYW5kbGUgYWxsIGxhYmVscywgbm90IGp1c3Qgb25lLgotCUZvcmNlIG1pcHMxNiBsYWJlbHMgdG8gYmUgb2RkLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShtaXBzMTZfaW1tZWQpOiBEb24ndCBjaGVjayBmb3IgYW4gb2RkIGJyYW5jaCB0YXJnZXQuCi0JKG1kX2FwcGx5X2ZpeCk6IERvbid0IGNoZWNrIG1pcHMxNiBtb2RlIGZvciBhIGJyYW5jaCByZWxvYy4KLQkobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBJZ25vcmUgdGhlIGxvdyBiaXQgaW4gYSBicmFuY2ggdGFyZ2V0LgotCShtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkobWlwc19ub19wcmV2X2luc24pOiBDYWxsIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgcmF0aGVyIHRoYW4ganVzdAotCWNsZWFyaW5nIGluc25fbGFiZWwuCi0JKG1pcHNfYWxpZ24sIG1pcHNfZmx1c2hfcGVuZGluZ19vdXRwdXQsIHNfY29ucyk6IExpa2V3aXNlLgotCShzX2Zsb2F0X2NvbnMsIHNfZ3B3b3JkKTogTGlrZXdpc2UuCi0JKHNfYWxpZ24pOiBVc2UgaW5zbl9sYWJlbHMgcmF0aGVyIHRoYW4gaW5zbl9sYWJlbC4KLQkoc19jb25zLCBzX2Zsb2F0X2NvbnMsIHNfZ3B3b3JkKTogTGlrZXdpc2UuCi0JKG1pcHNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19kZWZpbmVfbGFiZWwpOiBSZXdyaXRlIHRvIGFkZCB0byBpbnNuX2xhYmVscyBsaXN0LgotCSogY29uZmlnL3RjLW1pcHMuaCAodGNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IERlZmluZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBJZiB0aGUgc2l6ZSBvZiBhIGZ1bmN0aW9uIGNvbWVzCi0Jb3V0IG9kZCwgaW5jcmVtZW50IGl0LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IE9ubHkgdXBkYXRlIHByZXZfaW5zbiB3aGVuIG5vdAotCXJlb3JkZXJpbmcgaWYgcGxhY2UgaXMgTlVMTC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2lwKTogQ2hlY2sgZm9yIGEgbWlzc2luZyBleHByZXNzaW9uCi0Jd2hlbiB1c2luZyB0aGUgcmVnaXN0ZXIgaW5kaXJlY3QgYWRkcmVzc2luZyBtb2RlLgotCi1Nb24gRGVjIDE2IDEwOjA4OjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobW4xMDIwMF9pbnNlcnRfb3BlcmFuZCk6IERvbid0Ci0JY2hlY2sgMjRiaXQgb3BlcmFuZHMgZm9yIG92ZXJmbG93LgotCShjaGVja19vcGVyYW5kKTogTGlrZXdpc2UuCi0KLU1vbiBEZWMgMTYgMTE6NTA6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoU2VjdGlvbik6IERvY3VtZW50IGhvdyB0byB1c2UgdGhlIC5zZWN0aW9uCi0JcHNldWRvLW9wIGZvciBDT0ZGIGFuZCBFTEYuCi0KLVN1biBEZWMgMTUgMTU6MjY6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IEZpeCBsaW5rb25jZSBjaGVjayBmb3IgRUxGLgotCi1TYXQgRGVjIDE0IDIyOjM3OjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAocHJldl9pbnNuX3JlbG9jX3R5cGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShSRUxBWF9NSVBTMTZfRU5DT0RFKTogQWRkIGRzbG90IGFuZCBqYWxfZHNsb3QgYXJndW1lbnRzLCBhbmQKLQlzdG9yZSB0aGVtLiAgQWRqdXN0IG90aGVyIFJFTEFYX01JUFMxNiBtYWNyb3MuCi0JKFJFTEFYX01JUFMxNl9EU0xPVCk6IERlZmluZS4KLQkoUkVMQVhfTUlQUzE2X0pBTF9EU0xPVCk6IERlZmluZS4KLQkoYXBwZW5kX2luc24pOiBQYXNzIG5ldyBhcmd1bWVudHMgdG8gUkVMQVhfTUlQUzE2X0VOQ09ERS4gIENvcnJlY3QKLQloYW5kbGluZyBvZiB3aGV0aGVyIHByZXZpb3VzIGluc3RydWN0aW9uIGhhcyBhIGZpeHVwLiAgU2V0Ci0JcHJldl9pbnNuX3JlbG9jX3R5cGUuCi0JKG1pcHNfbm9fcHJldl9pbnNuKTogQ2xlYXIgcHJldl9pbnNuX3JlbG9jX3R5cGUuCi0JKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogVXNlIHRoZSByaWdodCBiYXNlIGFkZHJlc3MgZm9yIGEgUEMKLQlyZWxhdGl2ZSBhZGQgb3IgbG9hZC4KLQkobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuICBJZiBhIFBDIHJlbGF0aXZlIGFkZCBvciBsb2FkIGlzCi0JdXNlZCwgcmVjb3JkIHRoZSBhbGlnbm1lbnQgZm9yIHRoZSBzZWN0aW9uLgotCi1GcmkgRGVjIDEzIDEzOjAwOjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBEb24ndCByZWR1Y2UgYSByZWxvYyBhZ2FpbnN0IGEKLQlsaW5rb25jZSBzZWN0aW9uIGludG8gYSByZWxvYyBhZ2FpbnN0IHRoZSBzZWN0aW9uIHN5bWJvbC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X21hY3JvKTogUmVtb3ZlIG5vcCBpbnN0cnVjdGlvbnMgYWZ0ZXIKLQlicmFuY2ggaW5zdHJ1Y3Rpb25zLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IElmIGNvbmZpZ3VyZWQgZm9yIGFuIGVtYmVkZGVkIEVMRgotCXN5c3RlbSwgZG9uJ3Qgc2V0IHRoZSBzZWN0aW9uIGFsaWdubWVudCB0byAyKio0LgotCShzX2NoYW5nZV9zZWMpOiBMaWtld2lzZS4KLQkoYXBwZW5kX2luc24pOiBDYWxsIHJlY29yZF9hbGlnbm1lbnQgZm9yIHRoZSBzZWN0aW9uLgotCShtZF9zZWN0aW9uX2FsaWduKTogRG9uJ3QgYWxpZ24gdGhlIHNlY3Rpb24gc2l6ZSBmb3IgYW4gZW1iZWRkZWQKLQlFTEYgc3lzdGVtLgotCi1UaHUgRGVjIDEyIDE2OjQwOjQ3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBNYWtlIHN1cmUgdGhhdCBzeW1ib2xzIGFyZQotCXJlc29sdmVkOyBleHByZXNzaW9uIHN5bWJvbHMgbWF5IGhhdmUgYmVlbiBza2lwcGVkLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQotVGh1IERlYyAxMiAxNToxODoyMSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBNb3ZlIEBwbHQgdG8KLQlCRkRfUkVMT0NfMjRfUExUX1BDUkVMIHJlbG9jYXRpb24uCi0JKG1kX2FwcGx5X2ZpeDMpOiBTdXBwb3J0IEJGRF9SRUxPQ18yNF9QTFRfUENSRUwuCi0KLVR1ZSBEZWMgMTAgMTM6NTE6NTUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHdyaXRlXzJfc2hvcnQpOiBSZW1vdmUgY29kZSB0aGF0IGNhbGxlZAotCXBhcmFsbGVsX29rKCkgd2hlbiB0aGUgcHJvZ3JhbW1lciBzcGVjaWZpZWQgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zLgotCi1UdWUgRGVjIDEwIDEyOjIzOjE5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBVcGRhdGUgdG8gaGFuZGxlIGVuZGlhbm5lc3MKLQlpc3N1ZXMgY29ycmVjdGx5LgotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9hc3NlbWJsZSk6IE9wY29kZSAweDAgaXMgdmFsaWQhCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IExpa2V3aXNlLgotCi1UdWUgRGVjIDEwIDExOjM3OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20KLQlpbiBhIGZyYWcgYWZ0ZXIgYSBtaXBzMTYgaW5zdHJ1Y3Rpb24gdG8gc3dpdGNoIGl0IHdpdGggYSBqdW1wCi0JaW5zdHJ1Y3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogR2l2ZSBhbiBlcnJvciBmb3IgYW4KLQlhdHRlbXB0IHRvIHVzZSBhIG5vbiBhYnNvbHV0ZSBzeW1ib2wgaW4gYW4gZXh0ZW5kaW5nIGZyYWcuCi0KLU1vbiBEZWMgIDkgMTY6NDg6MjAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jOiBGbGVzaCBvdXQgYXNzZW1ibGVyIHN1cHBvcnQgZm9yIE1OMTAyMDAuCi0JKiBjb25maWcvdGMtbW4xMDIwMC5oOiBMaWtld2lzZS4KLQotTW9uIERlYyAgOSAxNzowOTo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEF0IHRoZSBlbmQgb2YgYSBDIGNvbW1lbnQsIHBhc3Mgc3BhY2UgdG8KLQlVTkdFVCByYXRoZXIgdGhhbiBQVVQuICBTZXQgb2xkX3N0YXRlIGJlZm9yZSBzZXR0aW5nIHN0YXRlIHRvIC0yLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IEF2b2lkIGFuIGluZmluaXRlIGxvb3AKLQl3aGVuIGV4dGVuZGluZyBiZWNhdXNlIHRoZSB2YWx1ZSBpcyBleGFjdGx5IG1heHRpbnkgKyAxLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChSRUxBWF9NSVBTMTZfRU5DT0RFKTogQWRkIHNtYWxsIGFuZCBleHQKLQlhcmd1bWVudHMsIGFuZCBzdG9yZSB0aGVtLiAgQWRqdXN0IG90aGVyIFJFTEFYX01JUFMxNiBtYWNyb3MuCi0JKFJFTEFYX01JUFMxNl9VU0VSX1NNQUxMKTogRGVmaW5lLgotCShSRUxBWF9NSVBTMTZfVVNFUl9FWFQpOiBEZWZpbmUuCi0JKG1pcHMxNl9zbWFsbCwgbWlwczE2X2V4dCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShhcHBlbmRfaW5zbik6IFBhc3MgbWlwczE2X3NtYWxsIGFuZCBtaXBzMTZfZXh0IHRvCi0JUkVMQVhfTUlQUzE2X0VOQ09ERS4KLQkobWlwczE2X2lwKTogU2V0IG1pcHMxNl9zbWFsbCBhbmQgbWlwczE2X2V4dC4KLQkobWlwczE2X2ltbWVkKTogRG9uJ3QgY2hlY2sgbWlwczE2X2F1dG9leHRlbmQuCi0JKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogQ2hlY2sgVVNFUl9TTUFMTCBhbmQgVVNFUl9FWFQuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IFByaW50IGFuIGVycm9yIGZvciBhbiBvdXQgb2YgcmFuZ2UKLQlmaXh1cCwgcmF0aGVyIHRoYW4gY2FsbGluZyBhYm9ydC4KLQotCSogYXMuYyAobWFpbik6IFVubGluayB0aGUgb3V0cHV0IGZpbGUgaWYgdGhlcmUgYXJlIGVycm9ycyB3aGlsZQotCWdlbmVyYXRpbmcgdGhlIGZpeHVwcy4KLQotRnJpIERlYyAgNiAxODo0ODoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogRG9uJ3QgY2FsbAotCVNfR0VUX1ZBTFVFLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBDYWxsIHJlc29sdmVfc3ltYm9sX3ZhbHVlIGJlZm9yZSBjYWxsaW5nCi0JU19HRVRfVkFMVUUsIGFuZCBkb24ndCBhZGQgaW4gdGhlIGZyYWcgYWRkcmVzcy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2ltbWVkKTogQWRkIGZpbGUgYW5kIGxpbmUgcGFyYW1ldGVycywKLQlhbmQgdXNlIHRoZW0gd2hlbiByZXBvcnRpbmcgZXJyb3JzLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCi1GcmkgRGVjICA2IDE1OjM2OjMyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYzogRml4IHZhcmlvdXMgZ2NjIC1XYWxsIHdhcm5pbmdzLgotCVJlbW92ZSAnJCcgcHJlZml4aW5nIGZvciByZWdpc3RlcnMuCi0KLUZyaSBEZWMgIDYgMDA6NTU6NDggMTk5NiAgTWFydGluICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hc3NlbWJsZSk6IENoZWNrIHRvIHNlZSBpZiBwcmV2X3NlZwotCWlzIGluaXRpYWxpemVkIGJlZm9yZSB1c2luZyBpdC4KLQkoZDEwdl9jbGVhbnVwKTogTm8gbG9uZ2VyIHVzZXMgaXRzIGFyZ3VtZW50LCBzbyBtYWtlIGl0IHZvaWQuCi0KLQkqIGNvbmZpZy90Yy1kMTB2LmggKGQxMHZfY2xlYW51cCk6IENoYW5nZSBwcm90b3R5cGUuCi0JCi1UaHUgRGVjICA1IDExOjAzOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGRpc2NhcmQgdGhlIHN5bWJvbCBmb3IgYSBQQwotCXJlbGF0aXZlIGZpeHVwIHRvIGFuIGFic29sdXRlIHN5bWJvbC4KLQotV2VkIERlYyAgNCAxNTo0Mjo0MSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUsIGQxMHZfY2xlYW51cCk6IEZpeCBidWcKLQl3aXRoIG11bHRpcGxlIHNlY3Rpb25zLgotCi1XZWQgRGVjICA0IDEzOjAwOjA3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfbG9uZ29wdHMpOiBSZW5hbWUgbWlwcy0xNiB0byBtaXBzMTYsIGFuZAotCW5vLW1pcHMtMTYgdG8gbm8tbWlwczE2LgotCShzX21pcHNzZXQpOiBBY2NlcHQgLnNldCBtaXBzMTYgYW5kIC5zZXQgbm9taXBzMTYuCi0KLVdlZCBEZWMgIDQgMTA6MzU6MzMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogVGFrZSBleHByZXNzaW9uUyBwb2ludGVyCi0JYXJndW1lbnQsIGFuZCBjaGVjayBmb3IgKy8tIGNvbnN0YW50IGZvbGxvd2luZyB0aGUgc3VmZml4LCBmb2xkaW5nCi0JaXQgaW50byB0aGUgZXhwcmVzc2lvbi4KLQkocHBjX2VsZl9jb25zKTogQ2hhbmdlIHBwY19lbGZfc3VmZml4IGNhbGxzLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCShzaGxpYik6IFJlcGxhY2UgYm9vbGVhbiBtcmVsb2NhdGFibGUgd2l0aCBlbnVtZXJhdGlvbiBzaGxpYi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogRGlzY3JpbWluYXRlIGJldHdlZW4gUElDIHN0eWxlIHNoYXJlZCBsaWJyYXJpZXMKLQlhbmQgLW1yZWxvY2F0YWJsZS4KLQkocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBEb24ndCByZXBvcnQgd2FybmluZ3MgZm9yIFBJQyBzdHlsZSBzaGFyZWQKLQlsaWJyYXJpZXMuCi0KLVR1ZSBEZWMgIDMgMjM6MTg6MjkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKHt0YyxwcGN9X2NvbW1lbnRfY2hhcnMpOiBEZWZpbmUsIHNvIHRoYXQgd2UgY2FuCi0JY2hhbmdlIHRoZSBjb21tZW50IGNoYXJhY3RlcnMuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAoY29tbWVudF9jaGFycyk6IERlbGV0ZSBpbiBmYXZvciBvZgotCXRjX2NvbW1lbnRfY2hhcnMuCi0JKHBwY197ZWFiaSxzb2xhcmlzfV9jb21tZW50X2NoYXJzKTogRWFiaSBhbmQgU29sYXJpcyB2ZXJzaW9ucyBvZgotCWNvbW1lbnQgY2hhcnMuCi0JKHBwY19jb21tZW50X2NoYXJzKTogU2VsZWN0IGFwcHJvcHJpYXRlIGNvbW1lbnQgY2hhcnMgYnkgZGVmYXVsdC4KLQkobXNvbGFyaXMpOiBOZXcgZmxhZyBmb3IgLW17LG5vLX1zb2xhcmlzLgotCShtZF9wYXJzZV9vcHRpb24pOiBSZWNvZ25pemUgLUsgcGljLiAgQWRkIHN1cHBvcnQgZm9yCi0JLW17LG5vLX1zb2xhcmlzLgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlLgotCShtZF9iZWdpbik6IERvIG5vdCBzZXQgRUxGIGZsYWdzIGlmIFNvbGFyaXMuCi0JKHBwY19lbGZfc3VmZml4KTogQGxvY2FsIHNldHMgUl9QUENfTE9DQUwyNFBDIHJlbG9jYXRpb24uCi0JKG1kX2FwcGx5X2ZpeDMpOiBBZGQgc3VwcG9ydCBmb3IgUl9QUENfTE9DQUwyNFBDLgotCi1Nb24gRGVjICAyIDEzOjQ4OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuYyAobWFpbik6IENvcnJlY3QgaGFuZGxpbmcgb2YgZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0LgotCi1TdW4gRGVjICAxIDIxOjQ2OjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAodGNfZ2VuX3JlbG9jKTogR2V0IHRoZSBhZGRlbmQgZnJvbQotCWZ4X29mZnNldCwgbm90IGZ4X2FkZG51bWJlci4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuaCAodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBkbyBhbnkKLQlyZWxvYyBhZGp1c3RtZW50cy4KLQotU2F0IE5vdiAzMCAxNzozNDo0OCAxOTk2ICBFbGlvdCBEcmVzc2VsaGF1cyAgPGVsaW90QHdhbGx5LmVkYy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IENvcnJlY3QgbWlzc3BlbGxpbmc6IGJhbGVuY2VkIHRvIGJhbGFuY2VkLgotCi1XZWQgTm92IDI3IDEzOjI1OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2VjdGlvbl9hbGlnbik6IENoZWNrIGZvciBhbiBhbGlnbm1lbnQgb2YKLQk0LCBub3QgYW4gYWxpZ25tZW50IG9mIDE2LiAgQ29ycmVjdHMgQXVndXN0IDcgcGF0Y2guCi0KLVR1ZSBOb3YgMjYgMTA6MzM6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGNvbmYuaW46IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfbGNvbW0pOiBEb24ndCBnaXZlIGFuIGVycm9yIGlmIG5vCi0JYWxpZ25tZW50IGlzIHNwZWNpZmllZC4KLQotCUFkZCBzdXBwb3J0IGZvciBtaXBzMTYgKDE2IGJpdCBNSVBTIGltcGxlbWVudGF0aW9uKToKLQkqIGNvbmZpZy90Yy1taXBzLmM6IEV4dGVuc2l2ZSBhZGRpdGlvbnMgZm9yIG1pcHMxNiBzdXBwb3J0LCBub3QKLQlsaXN0ZWQgaGVyZS4KLQkoUkVMQVhfT0xELCBSRUxBWF9ORVcpOiBVc2Ugb25seSA3IGJpdHMgZWFjaC4KLQkoaW5zbl91c2VzX3JlZyk6IENoYW5nZSBsYXN0IHBhcmFtZXRlciB0byBhbiBlbnVtLgotCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUxTX0RPTExBUik6IERlZmluZSBhcyAwLgotCShtZF9yZWxheF9mcmFnKTogRGVmaW5lIGFzIG1pcHNfcmVsYXhfZnJhZy4KLQkobWlwc19yZWxheF9mcmFnKTogRGVjbGFyZS4KLQkoc3RydWN0IG1pcHNfY2xfaW5zbik6IEFkZCB1c2VfZXh0ZW5kIGFuZCBleHRlbmQgZmllbGRzLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNfR0VUX09USEVSKTogRGVmaW5lLgotCShTX1NFVF9PVEhFUik6IERlZmluZS4KLQotTW9uIE5vdiAyNSAxODowMjoyOSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAYmVhdXR5LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBJbXBsZW1lbnQgY2FzZXMgZm9yIG5ldyA8LCA+LCBtLCBuLAotIAlvIGFuZCBwIG9wZXJhbmQgc3BlY2lmaWVycy4KLQotTW9uIE5vdiAyNSAxMDo0NToxNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYzogRGVsZXRlICJpZm5kZWYgbWRfcmVsYXhfZnJhZyIgYXJvdW5kIGlzX2RucmFuZ2UuCi0JKHJlbGF4X3NlZ21lbnQsIGNhc2UgcnNfb3JnKTogTW92ZSBjb2RlIGluc2lkZSBicmFjZXMuICBNb3ZlIGxvY2FscwotCXRhcmdldCxhZnRlciBpbnNpZGUgdG9vLgotCShyZWxheF9zZWdtZW50LCBjYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50KTogR3V0cyBtb3ZlZCB0byAuLi4KLQkocmVsYXhfZnJhZyk6IE5ldyBmdW5jdGlvbi4KLQlDYWxsIG1kX3ByZXBhcmVfcmVsYXhfc2NhbiBpZiBkZWZpbmVkLgotCSogY29uZmlnL3RjLW02OGsuaCAobWRfcHJlcGFyZV9yZWxheF9zY2FuKTogUmVuYW1lZCBmcm9tCi0JTTY4S19BSU1fS0xVREdFLgotCi1Nb24gTm92IDI1IDA4OjQ5OjM2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAoYWRkcmVzc19yZWdpc3RlcnMpOiBVc2UgJyQnIGFzIHJlZ2lzdGVyCi0JcHJlZml4IGluc3RlYWQgb2YgJyUnLgotCShkYXRhX3JlZ2lzdGVycywgb3RoZXJfcmVnaXN0ZXJzLCBtZF9hc3NlbWJsZSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChhZGRyZXNzX3JlZ2lzdGVycyk6IFVzZSAnJScgcHJlZml4IGZvciByZWdzLgotCShkYXRhX3JlZ2lzdGVycywgb3RoZXJfcmVnaXN0ZXJzLCBtZF9hc3NlbWJsZSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IENvcnJlY3RseSBkZXRlcm1pbmUgdGhlCi0JY29ycmVjdCBsb2NhdGlvbiBhbmQgdHlwZSBmb3IgZWFjaCByZWxvY2F0aW9uLgotCShtZF9wY3JlbF9mcm9tKTogU2ltcGxpZnkuCi0KLUZyaSBOb3YgMjIgMTU6NDI6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfY29udmVydF9mcmFnKTogSW1wcm92ZSB3YXJuaW5nIHdoZW4gYnJhbmNoIGlzCi0JY29udmVydGVkIGludG8gYnJhbmNoIGFyb3VuZCBicmFuY2guCi0KLVRodSBOb3YgMjEgMTE6NTY6MTEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5oIChESUZGX0VYUFJfT0spOiBEb24ndCBkZWZpbmUgdGhpcy4KLQkodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgcmVsb2NzIGFnYWluc3Qgd2VhayBzeW1ib2xzIG9yIAotCXBjLXJlbGF0aXZlIHJlbG9jcy4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2JlZ2luKTogU2V0IGxpbmtyZWxheC4KLQkobWRfYXNzZW1ibGUpOiBDcmVhdGUgZml4dXBzIGFzIG5lZWRlZC4KLQkobWRfYXBwbHlfZml4Myk6IEd1dC4gIEl0IHNob3VsZG4ndCBldmVyIGdldCBjYWxsZWQgYW55bW9yZS4KLQotVHVlIE5vdiAxOSAxNzo0ODowNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogV2hlbiBhdXRvbWF0aWNhbGx5IGNvbnZlcnRpbmcKLQlzZXJpYWwgb3BzIHRvIHBhcmFsbGVsLCBkbyBub3QgY29uc2lkZXIgYSBicmFuY2ggYXMgdGhlIGZpcnN0Ci0JaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBOb3YgMTkgMTM6MzU6MjIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QuCi0KLU1vbiBOb3YgMTggMTU6MjY6NTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogUHJvdmlkZSBwcm90b3R5cGUKLQl2aWEgUEFSQU1TLgotCShjaGVja19vcGVyYW5kKTogTGlrZXdpc2UuCi0KLU1vbiBOb3YgMTggMTU6MjI6MjggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IEJyYW5jaCBhbmQgbGluayBpbnN0cnVjdGlvbnMKLQltb2RpZnkgcjEzLgotCSh3cml0ZV8yX3Nob3J0KTogQ2FsbCBwYXJhbGxlbF9vayB0byBjaGVjayB3aGV0aGVyIHR3byBzaG9ydAotCWluc3RydWN0aW9ucyB0aGUgdXNlciByZXF1ZXN0ZWQgZXhlY3V0ZSBpbiBwYXJhbGxlbCwgY2FuIGJlCi0JZXhlY3V0ZWQgdGhhdCB3YXkuCi0KLVRodSBOb3YgMTQgMTE6MTc6NDkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHdyaXRlXzJfc2hvcnQpOiBGaXggYnVnIHRoYXQgd291bGRuJ3QKLQlhbGxvdyBhIGJyYW5jaCBhbmQgbGluayBpbiBwYXJhbGxlbCB3aXRoIGFuIGV4ZSBpbnN0cnVjdGlvbi4KLQotRnJpIE5vdiAgOCAxMzo1NTowMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtZDEwdi50ZXhpOiBBZGQgaW5mbyBvbiBAd29yZCBtb2RpZmllci4KLQotV2VkIE5vdiAgNiAxMzo0NjowNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0JCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogTU4xMDMwMF9PUEVSQU5EX1NQTElUCi0Jb3BlcmFuZHMgYXJlIGFzc3VtZWQgdG8gYmUgMzJiaXRzLiAgVXNlICJiaXRzIiBmaWVsZCB0byBob2xkIHRoZQotCW51bWJlciBvZiBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVC4KLQkobW4xMDMwMF9jaGVja19vcGVyYW5kKTogTU4xMDMwMF9PUEVSQU5EX1NQTElUIG9wZXJhbmRzIGFyZSBhc3N1bWVkCi0JdG8gYmUgMzJiaXRzLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogU2hpZnQgbG93IHBhcnQKLQlvZiBhIE1OMTAzMDBfT1BFUkFORF9TUExJVCBvcGVyYW5kIGJ5IG9wZXJhbmQtPnNoaWZ0LgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogSGFuZGxlCi0JTU4xMDMwMF9PUEVSQU5EX1NQTElULgotCi1UdWUgTm92ICA1IDEzOjMwOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBJbnNlcnQgb3BlcmFuZHMgaW50bwotCXRoZSBleHRlbnNpb24gcGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24gaWYgbmVjZXNzYXJ5LgotCShtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogQWNjZXB0IHBvaW50ZXIgdG8gZXh0ZW5zaW9uIHdvcmQKLQlhcmd1bWVudC4gIE1ha2UgaW5zbiBhIHBvaW50ZXIgYXJndW1lbnQgdG9vLiAgUmV0dXJuIHR5cGUKLQlpcyBub3cgdm9pZC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0KLU1vbiBOb3YgIDQgMTI6NTM6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogSGFuZGxlCi0JcmVwZWF0ZWQgcmVnaXN0ZXIgb3BlcmFuZHMuCi0KLUZyaSBOb3YgIDEgMTA6NDI6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkZWQgc2VjdGlvbiBvbiByZXBvcnRpbmcgYnVncy4KLQotCSogY29uZmlnL3RjLWFscGhhLmM6IENoYW5nZSB1c2VzIG9mIHZvaWQgKiB0byBQVFIuICBDaGFuZ2UgdGhlCi0JYWxwaGFfbWFjcm8gZW1pdCBmaWVsZCB0byBleHBlY3QgYSBjb25zdCBhcmd1bWVudCwgYW5kIGNoYW5nZSB0aGUKLQlhcmcgZmllbGQgdG8gYmUgY29uc3QuICBGaXggc29tZSBzcGFjaW5nIHRvIGZvbGxvdyB0aGUgR05VCi0Jc3RhbmRhcmQuCi0KLUZyaSBOb3YgIDEgMTA6MzI6MDMgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQga25vd2xlZGdlIG9mIDIxMTY0cGMKLQkocGNhNTYpIGFuZCAyMTI2NCAoZXY2KSBjcHVzLgotCShtZF9hcHBseV9maXgpOiBQcml2YXRlIHJlbG9jYXRpb24gdHlwZXMgYXJlIG5vdyBuZWdhdGl2ZS4KLQkoYWxwaGFfZm9yY2VfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkoZW1pdF9pbnNuKTogTGlrZXdpc2UuCi0JKGVtaXRfbGRYdSk6IERvIHRoZSByaWdodCB0aGluZyB3aGVuIHRoZSBoYXJkd2FyZSBjYW4gZG8gYnl0ZSBpbnNucy4KLQkoZW1pdF9zdFgpOiBMaWtld2lzZS4KLQkoZW1pdF9zZXh0WCk6IExpa2V3aXNlLgotCi1UaHUgT2N0IDMxIDE2OjMzOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBDYWxsIHJlc29sdmVfc3ltYm9sX3ZhbHVlIG9uCi0JYSBzeW1ib2wgZm91bmQgaW4gYSByZWxvYy4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEltcHJvdmUgdGhlIGVycm9yIG1lc3NhZ2UgaWYKLQlhbiB1bmRlZmluZWQgc3ltYm9sIGlzIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4KLQotV2VkIE9jdCAzMCAyMDoxNTozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogUmV3cml0ZSwgYW5kIGFkZCBhIGxvdCBvZiBkb2N1bWVudGF0aW9uLgotCSogZG9jL01ha2VmaWxlLmluIChpbnRlcm5hbHMuaW5mbyk6IE5ldyB0YXJnZXQuCi0KLVdlZCBPY3QgMzAgMTQ6NTU6NTcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCByZWxvY3MKLQlhZ2FpbnN0IHdlYWsgc3ltYm9scy4KLQotVHVlIE9jdCAyOSAxMjoyODoxNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgbG9zZSBmb3IgcmVsYXhhYmxlCi0JYWRkcmVzc2VzIGxpa2UgLis2LgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBNYWtlIHN1cmUgd2UgaW5zZXJ0IHRoZQotCWZpeHVwIGF0IHRoZSByaWdodCBhZGRyZXNzIHdpdGhpbiB0aGUgZnJhZy4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfY29udmVydF9mcmFnKTogRG9uJ3Qgc2V0IGZyYWdQLT5mcl9maXgKLQl0byBhbiBhYnNvbHV0ZSB2YWx1ZSwgaW5zdGVhZCBpbmNyZW1lbnQgaXQgYXMgbmVlZGVkLgotCi0JKiBjb25maWcvdGMtdjg1MC5oIChUQ19HRU5FUklDX1JFTEFYX1RBQkxFKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXY4NTAuYzogRml4IHNvbWUgaW5kZW50aW9uIHByb2JsZW1zLgotCShtZF9yZWxheF90YWJsZSk6IERlZmluZSBmb3IgRDktPkQ5OSBicmFuY2ggZGlzcGxhY2VtZW50Ci0JcmVsYXhpbmcuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IERvIHNvbWV0aGluZyB1c2VmdWwgaW5zdGVhZCBvZiBhYm9ydGluZy4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBMaWtld2lzZS4KLQkobWRfYXNzZW1ibGUpOiBOb3RlIGlmIHRoZSBtYXRjaGluZyBpbnN0cnVjdGlvbiBoYXMgYSByZWxheGFibGUKLQlvcGVyYW5kLiAgSWYgaXQgZG9lcywgYWxsb2NhdGUgZnJhZyB3aXRoIGZyYWdfdmFyIGFuZCBkb24ndAotCWRvIGFueSBmaXh1cHMuCi0KLU1vbiBPY3QgMjggMTA6NDg6NDAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmggKG1kX2NsZWFudXApOiBOZXcgZnVuY3Rpb24uICBUaGlzIGlzIG5lZWRlZCB0bwotCXdyaXRlIG91dCBhbnkgYnVmZmVyZWQgaW5zdHJ1Y3Rpb25zIHdoZW4gYSAiLmVuZCIgaXMgZm91bmQuCi0KLU1vbiBPY3QgMjggMTA6NDM6NDUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogTmV3IGhvb2sgbWRfY2xlYW51cCgpLgotCi1GcmkgT2N0IDI1IDAwOjAxOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4X25ld19leHApOiBVc2UgbWFrZV9leHByX3N5bWJvbCB0byBidWlsZCBhbgotCWV4cHJlc3Npb24gc3ltYm9sIGZvciBhIGNvbXBsZXggZml4dXAuCi0KLVRodSBPY3QgMjQgMTQ6MzE6MDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3JlbG9jX3ByZWZpeCk6IFNldmVyYWwgZGlzZ3VzdGluZwotCWhhY2tzIHRvIGltcHJvdmUgcGFyc2luZyBvZiBjb21wbGV4IGhpLCBsbywgemRhLCBldGMKLQlleHByZXNzaW9ucy4KLQkobWRfYXNzZW1ibGUpOiBEb24ndCBkZW1hbmQgYW5kIGVhdCBhIHRyYWlsaW5nICcpJyBhZnRlciBmaW5kaW5nCi0JYSB2ODUwIHJlbG9jYXRpb24gcHJlZml4LiAgU2lnbiBleHRlbmQgdGhlIGNvbnN0YW50IGluIGEKLQlCRkRfUkVMT0NfTE8xNiBleHByZXNzaW9uLiAgRG8gZWF0IGEgdHJhaWxpbmcgJyknIGFmdGVyIGEgY29tcGxldGUKLQlvcGVyYW5kLgotCShwYXJzZV9jb25zX2V4cHJlc3Npb25fdjg1MCk6IERvbid0IGVhdCBhIHRyYWlsaW5nICcpJyBhZnRlcgotCWZpbmRpbmcgYSB2ODUwIHJlbG9jYXRpb24gcHJlZml4LgotCi0JKiBjb25maWcvdGMtdjg1MC5oIChUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04pOiBEZWZpbmUuCi0JKFRDX0NPTlNfRklYX05FVyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuYyAocGFyc2VfY29uc19leHByZXNzaW9uX3Y4NTApOiBOZXcgZnVuY3Rpb24uCi0JKGNvbnNfZml4X25ld192ODUwKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IFREQSByZWxvY3MuCi0KLVdlZCBPY3QgMjMgMTg6MjA6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBHaXZlIGEgYmV0dGVyIHdhcm5pbmcgbWVzc2FnZQotCWZvciBhbiB1bmtub3duIHJlbG9jYXRpb24gdHlwZS4KLQotV2VkIE9jdCAyMyAxNjoyMToyOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAud29yZDsgYWxsb2NhdGVzCi0JNCBieXRlcyBvZiBzcGFjZS4KLQotVHVlIE9jdCAyMiAyMjowMToyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIFREQU9GRiByZWxvY3MKLQlkaWZmZXJlbnRseSBmb3IgbW92ZWEgJiBzc3Qvc2xkIGluc25zLgotCi1UdWUgT2N0IDIyIDE3OjA5OjMyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBEb24ndCBhbGxvdyBpbGxlZ2FsIGNvbWJpbmF0aW9ucwotCW9mIGluc3RydWN0aW9ucy4KLQotVHVlIE9jdCAyMiAxMToyODozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcyk6IEFkZCBmcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIGZpZWxkLgotCSogY29uZmlnL29iai1tdWx0aS5oIChvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZm9ybWF0X29wcyk6IEluaXRpYWxpemUgbmV3Ci0JZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBmaWVsZC4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mb3JtYXRfb3BzKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWlwcy5jOiBVbmRlZmluZSBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBiZWZvcmUKLQlpbmNsdWRpbmcgb2JqLWVsZi5oLgotCi1Nb24gT2N0IDIxIDExOjM4OjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoY29uc19maXhfbmV3X21pcHMpOiBPbmx5IHRyZWF0IDggYnl0ZSByZWxvYwotCXNwZWNpYWxseSBpZiBub3QgRUxGLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DXzY0LgotCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgQkZEX1JFTE9DXzY0LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogRG9uJ3QgaW5jcmVtZW50IHZhbHVlIGZvciBhIFBDCi0gCXJlbGF0aXZlIHJlbG9jIHdoZW4gQkZEX0FTU0VNQkxFUiBhbmQgT0JKX0FPVVQgKG1vcmUgdWdseSBnYXMKLSAJcmVsb2MgaGFja2luZykuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oIChTX0lTX0RFRklORSk6IG5vbiBCRkRfQVNTRU1CTEVSIHZlcnNpb246Ci0JRG9uJ3QgY2hlY2sgU19HRVRfT1RIRVIuCi0KLUZyaSBPY3QgMTggMTQ6MDY6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogQWNjZXB0IGFuIG9kZCBmbG9hdGluZyBwb2ludAotCXJlZ2lzdGVyIHdpdGggbC5zIG9yIHMucy4KLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9wc2V1ZG9fdGFibGUpOiBVc2Ugb2JqX2FvdXRfdHlwZSBmb3IKLQkudHlwZSBwc2V1ZG8tb3AuCi0JKG9ial9hb3V0X3R5cGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1UaHUgT2N0IDE3IDE3OjU1OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoT0JKUykpOiBEZXBlbmQgdXBvbiBsaWJpYmVydHkuaC4KLQotV2VkIE9jdCAxNiAxMToyODozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfcmVsb2NfcHJlZml4KTogUmVjb2duaXplIHpkYW9mZiwgdGRhb2ZmCi0JYW5kIHNkYW9mZiBleHByZXNzaW9ucy4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGFkZCBzeW1ib2wgdmFsdWUgdG8gYWRkZW5kIGlmCi0JVENfVjg1MCBhbmQgT0JKX0VMRi4KLQkqIGNvbmZpZy90Yy12ODUwLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IGFueQotCXBjLXJlbGF0aXZlIGZpeHVwcy4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcGNyZWxfZnJvbSk6IFVuZG8geWVzdGVyZGF5J3MgY2hhbmdlcy4KLQkobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdjg1MC5oIChNRF9QQ1JFTF9GUk9NX1NFQ1RJT04pOiBMaWtld2lzZS4KLQotVHVlIE9jdCAxNSAyMzoxOTowMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3BjcmVsX2Zyb20pOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgotCShtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtdjg1MC5oIChNRF9QQ1JFTF9GUk9NX1NFQ1RJT04pOiBEZWZpbmUuCi0KLU1vbiBPY3QgMTQgMTM6NTk6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogQWRkIGNhc3QgdG8gb2Zmc2V0VCB3aGVuIHVzaW5nCi0JYSBjb25zdGFudCB3aXRoICZ+LgotCi1Nb24gT2N0IDE0IDExOjI0OjI4IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9maWxlKTogTW92ZSBFQ09GRiBkZWJ1ZyBwcm9jZXNzaW5nIHRvIC4uLgotCShlbGZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IC4uLiBoZXJlLiAgTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2Zyb21fZmlsZV9hZnRlcl9yZWxvY3MpOiBOZXcgbWFjcm8uCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgKmZyb2JfYWZ0ZXJfcmVsb2NzIGFmdGVyIHRoZQotCWNhbGwgdG8gd3JpdGVfcmVsb2NzLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYzogVXNlIG5ldyBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwgcmVsb2MuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBEb24ndCBTRVRfVkFMVUUgb24gdGhlIHNlY3Rpb24KLQlzeW1ib2wsIGFzIHRoaXMgbWVzc2VzIHVwIGxpbmtpbmcuICBJbnN0ZWFkLCBleHBhbmQgdGhlIHJlY3Vyc2l2ZSBjYWxsCi0JaW5saW5lIGFuZCBjaGFuZ2UgdXAgdGhlIGFwcHJvcHJpYXRlIGJpdHMgdG8gZ2V0IHRoZSAweDgwMDAgb2Zmc2V0Ci0JaW4gdGhlIHJlbG9jIGFkZGVuZC4KLQotVGh1IE9jdCAxMCAxNzozMDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IFBlcm1pdCB0aGUgZGlmZmVyZW5jZSBvZgotCXR3byBzeW1ib2xzIGluIHRoZSBzYW1lIHNlZ21lbnQgdG8gYmUgYWRqdXN0ZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5IENQVS1WRU5ET1ItbGludXgtZ251LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgT2N0IDEwIDE3OjIyOjE4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfaW5zZXJ0X29wZXJhbmQpOiBDaGFuZ2UgbW9zdCB3YXJuaW5ncyBpbnRvCi0JZXJyb3JzLgotCShwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IERpdHRvLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCShwcGNfdGMpOiBEaXR0by4KLQkocHBjX3BlX3NlY3Rpb24pOiBEaXR0by4KLQkocHBjX2Zyb2Jfc3ltYm9sKTogRGl0dG8uCi0KLVRodSBPY3QgMTAgMTI6MDU6NDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IFBhc3MgYW4gZXh0cmEgc2hpZnQgY291bnQKLQl0byBtbjEwMzAwX2luc2VydF9vcGVyYW5kIGJhc2VkIG9uIHRoZSBvcGNvZGUgZm9ybWF0LgotCShtbjEwMzAwX2luc2VydF9vcGVyYW5kKTogQWNjZXB0IGFuZCB1c2UgZXh0cmEgc2hpZnQgY291bnQKLQlwYXJhbWV0ZXIuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogVXNlIEZNVF8qIG1hY3JvcyBmb3IKLQlmb3JtYXRzIHJhdGhlciB0aGFuIGhhcmQtY29kZWQgY29uc3RhbnRzLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IEZvcm1hdCBENSBpbnN0cnVjdGlvbnMKLQlhcmUgNyBieXRlcyBsb25nLiAgV3JpdGUgb3V0IGluc3RydWN0aW9ucyBpbiBiaWctZW5kaWFuIGZvcm1hdC4KLQotVHVlIE9jdCAgOCAxNDo1NjoxNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogVHdlYWsgZnVydGhlciBzbwotCXRoYXQgYWxsIGluc3RydWN0aW9ucyBhcmUgcGFyc2VkIGNvcnJlY3RseS4KLQotVHVlIE9jdCAgOCAxMzowMjoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmg6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKHhtYWxsb2MsIHhyZWFsbG9jKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGFzLmM6IERvbid0IGluY2x1ZGUgbGliaWJlcnR5LmguCi0JKiBleHByLmMsIHJlYWQuYywgc3RhYnMuYywgY29uZmlnL29iai1jb2ZmLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuYzogTGlrZXdpc2UuCi0JKiBtZXNzYWdlcy5jOiBMaWtld2lzZS4KLQkoeHN0cmVycm9yKTogRG9uJ3QgZGVjbGFyZS4KLQkqIHhtYWxsb2MuYzogUmVtb3ZlLgotCi1Nb24gT2N0ICA3IDE2OjUzOjIzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuaCAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKSBSZW1vdmUuCi0JKHN5c3RlbV9yZWdpc3RlcnMsIGNjX25hbWVzKTogTGlrZXdpc2UuCi0JKGFkZHJlc3NfcmVnaXN0ZXJzLCBkYXRhX3JlZ2lzdGVycywgb3RoZXJfcmVnaXN0ZXJzKTogTmV3IHJlZ2lzdGVyCi0JYXJyYXlzLgotCShyZWdpc3Rlcl9uYW1lLCBzeXN0ZW1fcmVnaXN0ZXJfbmFtZSwgY2NfbmFtZSk6IFJlbW92ZS4KLQkobW4xMDMwMF9yZWxvY19wcmVmaXgpOiBMaWtld2lzZS4KLQkoZGF0YV9yZWdpc3Rlcl9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShhZGRyZXNzX3JlZ2lzdGVyX25hbWUsIG90aGVyX3JlZ2lzdGVyX25hbWUpOiBMaWtld2lzZS4KLQkobWRfYXNzZW1ibGUpOiBSb3VnaCBjdXQgYXQgcGFyc2luZyBvcGVyYW5kcy4gIFJlbW92ZSBsb3RzIG9mCi0JdW53YW50ZWQgY29kZS4KLQkobWRfYXBwbHlfZml4Myk6IERpc2FibGUgZm9yIG5vdy4KLQotTW9uIE9jdCAgNyAxMTozODozNCAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc2VsZWN0X2NvbnRyb2xfcmVncyk6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkCi0Jb3V0IG9mIG02OGtfaW5pdF9hZnRlcl9hcmdzLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IFVzZSBpdC4KLQkobXJpX2NoaXApOiBVc2UgaXQgaGVyZSBhcyB3ZWxsIHRvIHVwZGF0ZSBzZXQgb2YgYWxsb3dlZCBjb250cm9sCi0JcmVncyBmb3IgbW92ZWMuCi0KLU1vbiBPY3QgIDcgMTE6MjQ6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfYmVnaW4pOiBOZXcgZnVuY3Rpb24uCi0JKG9ial9lbGZfc2VjdGlvbik6IEFkZCB0aGUgc2VjdGlvbiBzeW1ib2wgdG8gdGhlIHN5bWJvbCB0YWJsZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9iZWdpbik6IERlZmluZS4KLQkoZWxmX2JlZ2luKTogRGVjbGFyZS4KLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IENhbGwgb2JqX2JlZ2luIGlmIGl0IGlzCi0JZGVmaW5lZC4KLQotRnJpIE9jdCAgNCAxODozNzozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogU3VidHJhY3QgdGhlIHNlY3Rpb24gYWRkcmVzcwotCWZyb20gYSBQQyByZWxhdGl2ZSByZWxvYyBpZiBUQ19NNjhLLgotCi1UaHUgT2N0ICAzIDE1OjE1OjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IE1ha2UgLnVhaGFsZiwgLnVhd29yZCwgYW5kCi0JLnVheHdvcmQgYXZhaWxhYmxlIGV2ZW4gaWYgbm90IE9CSl9FTEYuCi0JKG1kX2F0b2YpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIHdvcmRQLgotCi1UaHUgT2N0ICAzIDAwOjE2OjUwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTB4MDAuYywgY29uZmlnL3RjLW1uMTB4MDAuaDogTmV3IGZpbGVzCi0JZm9yIE1hdHN1c2hpdGEgTU4xMHgwMCBzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbW4xMHgwMC0qLSoKLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotV2VkIE9jdCAgMiAxNTo1NDowMyAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogb2JqLWV2YXguaDogbW92ZSBvcGVudm1zIGRlZmluaXRpb25zIGZyb20gaGVyZSB0byB0Yy1hbHBoYS5jLgotCSogdGMtYWxwaGEuYzogYWRkIHN1cHBvcnQgZm9yIHZtc19jYXNlX2hhY2sgbGlrZSBpbiB2YXgvdm1zLgotCShsb2FkX2V4cHJlc3Npb24pOiB0cmFjayBjbG9iYmVyaW5nIG9mIGJhc2UgcmVnIGJlZm9yZSBqbXAvanNyLgotCShzX2FscGhhX2ZpbGUpOiBwYXNzIGNhc2VfaGFjayBmbGFncyBhbmQgc291cmNlIGZpbGVuYW1lIHZpYQotCXN5bWJvbCB0YWJsZSB0byBiZmQuCi0JKiB0Yy1hbHBoYS5oIChUQ19DT05TX0ZJWF9ORVcpOiBkZWZpbmUKLQotVHVlIE9jdCAgMSAxNjoxNjowMSAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBtaXBzLSotZWxmKi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIE9jdCAgMSAxMjozNzo0OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19tYWNybyk6IFdhcm4gaWYgYSBtYWNybyBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhCi0JcHNldWRvLW9wLgotCShzX3NwYWNlKTogSW4gbTY4ayBNUkkgbW9kZSwgYWxpZ24gdG8gYSB3b3JkIGJvdW5kYXJ5LgotCSogbWFjcm8uYyAoZGVmaW5lX21hY3JvKTogQWRkIG5hbWVwIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCSogbWFjcm8uaCAoZGVmaW5lX21hY3JvKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShwYXJzZV9hcmdzKTogQ2hhbmdlIHZlcnNpb24gcHJpbnRpbmcgdG8gbWF0Y2ggY3VycmVudCBHTlUKLQlzdGFuZGFyZHMuCi0JKiBnYXNwLmMgKHNob3dfdXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKG1haW4pOiBDaGFuZ2UgdmVyc2lvbiBwcmludGluZyB0byBtYXRjaCBjdXJyZW50IEdOVSBzdGFuZGFyZHMuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluaXRfdGFibGUpOiBDb3JyZWN0IGFjY2VzcyBjb250cm9sIHVuaXQKLQlyZWdpc3RlciBudW1iZXJzLiAgRnJvbSBLZW4gUm9zZSA8cm9zZUBuZXRjb20uY29tPi4KLQotCSogY29uZmlnL3RjLWFscGhhLmM6IEFkZCBzb21lIHN0YXRpYyBmdW5jdGlvbiBwcm90b3R5cGVzLgotIAkoYWxwaGFfbWFjcm9zKTogTW92ZSB0byB0b3Agb2YgZmlsZS4gIE1ha2Ugc3RhdGljLgotCShhbHBoYV9udW1fbWFjcm9zKTogTW92ZSB0byB0b3Agb2YgZmlsZS4KLQotVHVlIE9jdCAgMSAwOTozNjoxOSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiB0Yy12ODUwLmg6ICBEZWZpbmUgTE9DQUxfTEFCRUwgdG8gcmVjb2duaXNlIF8uTF8qIHN5bWJvbHMKLQlnZW5lcmF0ZWQgYnkgRFdBUkYuCi0KLVNhdCBTZXAgMjggMDM6Mzg6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogUmVtb3ZlIGJvZ3VzIGNvZGUgaW4gQkZENjQgY2FzZSwKLQlhbmQganVzdCBjYWxsIHNwcmludGZfdm1hLgotCi1UaHUgU2VwIDI2IDE2OjA0OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChleHByKTogQ2hhbmdlID4+PSB0byA+PiAoZml4IHR5cG8pLiAgKEZyb20gbWVpc3NuZXIpLgotCi1UdWUgU2VwIDI0IDE5OjA1OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChmbG9hdF9jb25zKTogQ2FsbCBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCBpZiBpdCBpcwotCWRlZmluZWQuCi0KLVR1ZSBTZXAgMjQgMTI6MjI6MTggMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX29wZXJhbmQpOiBDcmVhdGVkLiAgQWxsb3dzIG9wZXJhbmRzIHRvIAotCXN0YXJ0IHdpdGggJyMnLgotCSogY29uZmlnL3RjLWQxMHYuaCAobWRfb3BlcmFuZCk6IFVuZGVmaW5lZC4KLQotTW9uIFNlcCAyMyAxMjoxMzoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGFkZF9maXgpOiBUcmVhdCBhIHdpZHRoIG9mICczJyBsaWtlICdCJy4KLQkobWRfYXNzZW1ibGUpOiBBIGZpeHVwIHdpZHRoIG9mICczJyBtZWFucyBhIDEgYnl0ZSByZWxvYy4KLQotVGh1IFNlcCAxOSAxMjoyMToyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgYWRqdXN0IFBDIHJlbGF0aXZlCi0JcmVsb2MgZm9yIHRoZSBpOTYwIGZvciBhIHJlbG9jIGluIHRoZSBzYW1lIHNlY3Rpb24uICBUaGlzIHVuZG9lcwotCW9uZSBvZiB0aGUgdHdvIGNoYW5nZXMgbWFkZSBBdWcgMTkuCi0KLVdlZCBTZXAgMTggMTI6MTE6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZW5kZWYpOiBCb3RoIHZlcnNpb25zOiBNb3ZlIENfU1RBVAotCXN5bWJvbHMgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLU1vbiBTZXAgMTYgMTE6NDE6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKGV4cHIpOiBBbHdheXMgdXNlIHVuc2lnbmVkIHJpZ2h0IHNoaWZ0cyBmb3IgPj4uCi0KLVRodSBTZXAgMTIgMTA6MjU6NDUgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBVcGRhdGUgdHdvIHRodW1iIGluc3RydWN0aW9uCi0gCXNsb3RzIHdoZW4gcHJvY2Vzc2luZyBCTCBmaXh1cHMuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAob3V0cHV0X2luc3QpOiBFbnN1cmUgVGh1bWIgQkwgZml4dXAgaXMgbWFya2VkCi0gCW9uIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSBpbnN0cnVjdGlvbi4KLQotV2VkIFNlcCAxMSAwMDowOTozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBDcmVhdGUgYW4gZXhwcmVzc2lvbiBzeW1ib2wgZm9yIGEgY29tcGxleAotCXN0YWJzIGV4cHJlc3Npb24sIHJhdGhlciB0aGFuIGdpdmluZyBhbiBlcnJvci4KLQotCSogZWNvZmYuYyAoZWNvZmZfbmV3X2ZpbGUpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSBhcmUgc3RpbGwgaW4KLQl0aGUgc2FtZSBmaWxlLgotCi1UdWUgU2VwIDEwIDExOjQ1OjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBGaWxsIGluIHRoZSB2YWx1ZSBmb3IgYSBjb25zdGFudAotCWp1bXAsIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgcmVsb2MuCi0KLU1vbiBTZXAgIDkgMTA6NTc6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IERvbid0IHN3YXAgYW4gaW5zdHJ1Y3Rpb24gd2hpY2gKLQlzZXRzIGEgY29uZGl0aW9uIGNvZGUgd2l0aCBhbiBpbnN0cnVjdGlvbiB3aGljaCB1c2VzIGEgY29uZGl0aW9uCi0JY29kZS4KLQkobWlwc19pcCk6IEluIGNhc2VzICdOJyBhbmQgJ00nLCBsb29rIGZvciAkZmNjTiByYXRoZXIgdGhhbiBhbgotCWltbWVkaWF0ZSB2YWx1ZS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBSZWNvZ25pemUgcjUwMDAgZm9yIGNwdS4KLQkobWlwc19pcCk6IEdpdmUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBpZiB0aGUgSVNBIGxldmVsIGlzIHdyb25nLgotCShtZF9wYXJzZV9vcHRpb24pOiBSZWNvZ25pemUgLW1jcHU9W3ZdW3JdNTAwMC4KLQotU2F0IFNlcCAgNyAxMzoyNTo1NSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKENPVU5UX1RPUF9aRVJPRVMpOiBBZGRlZCBtYWNybyB0byBjb3VudAotIAlsZWFkaW5nIHplcm9lcy4KLQkobG9hZF9yZWdpc3Rlcik6IEVuc3VyZSBoaTMyIGJpdHMgYXJlIG5vdCBsb3N0IGR1cmluZyBsbzMyYml0Ci0gCXByb2Nlc3NpbmcuIEZpeCBzaGlmdCBvZmZzZXQgdGhhdCB3YXMgb3ZlcmZsb3dpbmcgaW50byB0aGUgbmV4dAotIAlpbnN0cnVjdGlvbiBmaWVsZC4gQWRkIGNvZGUgdG8gZ2VuZXJhdGUgc2hvcnRlciBzZXF1ZW5jZXMgZm9yCi0gCWNvbnN0YW50cyB3aXRoIGEgc2luZ2xlIGNvbnRpZ3VvdXMgc2VxZXVlbmNlIG9mIG9uZXMuCi0KLUZyaSBTZXAgIDYgMTc6MDc6MTIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGQxMHZfZG90X3dvcmQpOiBOZXcgZnVuY3Rpb24gdG8gc3VwcG9ydAotCSJAd29yZCIgd2l0aCB0aGUgd29yZCBwc2V1ZG8tb3AuCi0JKG1kX2FwcGx5X2ZpeDMpOiBDbGVhbnVwIGFuZCBjaGFuZ2VzIHRvIHN1cHBvcnQgY29ycmVjdCBzaXplcwotCWZvciAxNiBhbmQgMTgtYml0IHJlbG9jcy4KLQotRnJpIFNlcCAgNiAxNjowMDoyOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjLSotYW91dCk6IFNldCBgZW0nLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZy90ZS1zcGFyY2FvdXQuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JSWZkZWYgVEVfU1BBUkNPVVQgZGVmaW5lIFRBUkdFVF9GT1JNQVQgYW5kIFNQQVJDX0JJRU5ESUFOLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKElOU05fQklHX0VORElBTik6IE5ldyBtYWNyby4KLQkoU1BFQ0lBTF9DQVNFX3tTRVRTVyxTRVRYfSk6IERlZmluZS4KLQkoe05PUCxPUixGTU9WUyxTRVRISSxTTExYLFNSQX1fSU5TTik6IERlZmluZS4KLQkobWRfYmVnaW4pOiBEZWxldGUgc2V0dGluZyBvZiBgdGFyZ2V0X2JpZ19lbmRpYW4nLgotCShvdXRwdXRfaW5zbik6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBSZXdyaXRlLiAgQWRkIGBzZXR4JyBzdXBwb3J0LgotCShzcGFyY19pcCk6IEhhbmRsZSBgMCcgb3BlcmFuZCBjaGFyLiAgUmVjb2duaXplIHNldHV3LCBzZXRzdywgc2V0eAotCXNwZWNpYWwgY2FzZXMuCi0JKG1kX2F0b2YpOiBBZGQgbGl0dGxlIGVuZGlhbiBzdXBwb3J0LgotCShtZF9udW1iZXJfdG9fY2hhcnMpOiBMaWtld2lzZS4KLQkobWRfYXBwbHlfZml4KTogTGlrZXdpc2UuCi0JKG1kX2xvbmdvcHRzKTogUmVjb2duaXplIC1FTCwtRUIgaWZkZWYgU1BBUkNfQklFTkRJQU4uCi0JKG1kX3BhcnNlX29wdGlvbik6IExpa2V3aXNlLgotCShtZF9zaG93X3VzYWdlKTogUHJpbnQgLUVMLCAtRUIgaWZkZWYgU1BBUkNfQklFTkRJQU4uCi0KLVRodSBTZXAgIDUgMTM6NDA6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9uZXdfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVjb2ZmLmggKGVjb2ZmX25ld19maWxlKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX2FwcF9maWxlKTogRGVmaW5lLgotCi1UaHUgU2VwICA1IDEzOjM5OjI1IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogQmlhcyB0aGUgLmxpdDggc2VjdGlvbgotCXN5bWJvbCBieSAzMmsgc28gdGhhdCBvdXIgMTYtYml0IHNpZ25lZCBvZmZzZXQgY2FuIGFkZHJlc3MgdGhlCi0JZW50aXJlIGNodW5rLiAgUmVwb3J0ZWQgYnkgPG1hdHRAbGtnLmRlYy5jb20+LgotCi1XZWQgU2VwICA0IDEwOjIzOjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgdG1wLgotCi1XZWQgU2VwICA0IDExOjI0OjI5IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IFJlbW92ZSB1bm5lY2Vzc2FyeSBjb2RlIHRoYXQKLSAJd2FzIGNhdXNpbmcgdGhlIGhpZ2ggMzJiaXRzIG9mIDY0Yml0IGNvbnN0YW50cyB0byBiZSBsb3N0LgotCQotVHVlIFNlcCAgMyAxMzo1Mjo1NiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogQWRkZWQgY2hhbmdlcyB0byBzdXBwb3J0IGZ1bmN0aW9uCi0JcG9pbnRlcnMgYW5kICJAd29yZCIgc3ludGF4LgotCi1UdWUgU2VwICAzIDExOjU3OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYzogUmVtb3ZlIGNvbW1lbnRlZCBvdXQgYW5kICNpZiAwJ2QgY29kZS4KLQkodjg1MF9yZWxvY19wcmVmaXgpOiBQcm92aWRlIHByb3RvdHlwZS4KLQkocG9zdGZpeCwgZ2V0X3JlbG9jLCBidWlsZF9pbnNuKTogUmVtb3ZlIHByb3RvdHlwZXMgZm9yIG5vbmV4aXN0YW50Ci0JZnVuY3Rpb25zLgotCShtZF9iZWdpbiwgbWRfYXNzZW1ibGUsIG1kX2FwcGx5X2ZpeDMpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkobWRfYXNzZW1ibGUpOiBBZGQgZGVmYXVsdCB0byBjYXNlIHN0YXRlbWVudC4KLQotU2F0IEF1ZyAzMSAxNjowMzowMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ29tcHV0ZSBzaXplIG9mIHRoZSBpbnN0cmN0aW9uCi0JZnJvbSB0aGUgb3Bjb2RlLgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hcHBseV9maXgzKTogRG8gc2ltcGxlIGJ5dGUsIHNob3J0IGFuZAotCXdvcmQgZml4dXBzIHRvby4KLQotRnJpIEF1ZyAzMCAyMzo1MDowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2FwcGx5X2ZpeDMpOiBVc2UgbGl0dGxlIGVuZGlhbiBnZXQvcHV0Ci0Jcm91dGluZXMgdG8gZmV0Y2gvc3RvcmUgdGhlIHVwZGF0ZWQgaW5zdHJ1Y3Rpb24gZnJvbS90byBtZW1vcnkuCi0JKHY4NTBfaW5zZXJ0X29wZXJhbmQpOiBJZiB0aGUgb3BlcmFuZCBoYXMgYSBzcGVjaWFsaXplZCBpbnNlcnQKLQlyb3V0aW5lLCBjYWxsIGl0LgotCi1GcmkgQXVnIDMwIDE4OjM1OjI2IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChyZWdfbmFtZV9zZWFyY2gpOiBBbGlnbiBjYWxsaW5nIGNvbnZlbnRpb24gdG8KLSAJYmUgbGlrZSBpZGVudGljYWwgZnVuY3Rpb24gZm91bmQgaW4gdGMtcHBjLmMuCi0JKGdldF9yZWxvYyk6IFJlbW92ZWQuCi0JKHY4NTBfcmVsb2NfcHJlZml4KTogTmV3IGZ1bmN0aW9uLCBwYXJzZSBsbygpLCBoaSgpIGFuZCBoaTAoKS4KLQkobWRfYXNzZW1ibGUpOiBlbWl0IGZpeHVwcy4KLQkobWRfcGNyZWxfZnJvbSk6IHJlbmFtZWQgZnJvbSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24sIGVtaXQgcHJvcGVyCi0gCWRpc3BsYWNlbWVudC4KLQkobWRfYXBwbHlfZml4Myk6IGhhbmRsZSBmaXh1cHMvcmVsb2NzLgotCSogY29uZmlnL3RjLXY4NTAuaCAoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogUmVtb3ZlZCBkZWZpbml0aW9uLgotCQotRnJpIEF1ZyAzMCAxODoxMjowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBZGQgU0ggRUxGIHN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW4gKHNoLSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvdGMtc2guaCAoVEFSR0VUX0FSQ0gpOiBEZWZpbmUuCi0JKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0gCShUQ19DT0ZGX0ZJWDJSVFlQRSk6IE9ubHkgZGVmaW5lIGlmIE9CSl9DT0ZGLgotCShCRkRfQVJDSCwgQ09GRl9NQUdJQywgVENfQ09VTlRfUkVMT0MpOiBMaWtld2lzZS4KLQkoVENfUkVMT0NfTUFOR0xFLCB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBMaWtld2lzZS4KLQkoRE9fTk9UX1NUUklQLCBORUVEX0ZYX1JfVFlQRSwgVENfS0VFUF9GWF9PRkZTRVQpOiBMaWtld2lzZS4KLQkoVENfQ09GRl9TSVpFTUFDSERFUCwgdGNfZnJvYl9maWxlKTogTGlrZXdpc2UuCi0JKFNVQl9TRUdNRU5UX0FMSUdOKTogTGlrZXdpc2UuCi0JKFJFTE9DXzMyKTogRG9uJ3QgZGVmaW5lLgotCSh0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IERlZmluZSBpZiBCRkRfQVNTRU1CTEVSLgotCSh0YXJnZXRfYmlnX2VuZGlhbik6IERlY2xhcmUgaWYgT0JKX0VMRi4KLQkoVEFSR0VUX0ZPUk1BVCk6IERlZmluZSBpZiBPQkpfRUxGLgotCSogY29uZmlnL3RjLXNoLmM6IFVzZSBCRkQgcmVsb2MgY29kZXMgaW5zdGVhZCBvZiBTSCBDT0ZGIHJlbG9jCi0JbnVtYmVycyB0aHJvdWdob3V0LgotCSh0Y19jcmF3bF9zeW1ib2xfY2hhaW4pOiBPbmx5IGRlZmluZSBpZiBPQkpfQ09GRi4KLQkodGNfaGVhZGVyc19ob29rLCB0Y19jb2ZmX3NpemVtYWNoZGVwKTogTGlrZXdpc2UuCi0JKHN0cnVjdCBzaF9jb3VudF9yZWxvY3MpOiBEZWZpbmUuCi0JKHNoX2NvdW50X3JlbG9jcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQlzaF9mcm9iX2ZpbGUuICBBZGQgQkZEX0FTU0VNQkxFUiBjb2RlLgotCShzaF9mcm9iX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoc2hfZnJvYl9maWxlKTogQ2FsbCBzaF9mcm9iX3NlY3Rpb24uCi0JKG1kX2NvbnZlcnRfZnJhZyk6IElmIEJGRF9BU1NFTUJMRVIsIGNoYW5nZSB0eXBlIG9mIGhlYWRlcnMsIGFuZAotCWNhbGwgc2VjdGlvbl9zeW1ib2wgcmF0aGVyIHRoYW4gc2VnX2luZm8gKHNlZyktPmRvdC4KLQkobWRfc2VjdGlvbl9hbGlnbik6IEFkZCBPQkpfRUxGIHZlcnNpb24uCi0JKFNXSVRDSF9UQUJMRV9DT05TKTogRGVmaW5lLgotCShTV0lUQ0hfVEFCTEUpOiBVc2UgU1dJVENIX1RBQkxFX0NPTlMuCi0JKG1kX2FwcGx5X2ZpeCk6IENoYW5nZSBwYXJhbWV0ZXIgdHlwZXMgaWYgQkZEX0FTU0VNQkxFUi4gIE9ubHkKLQloYW5kbGUgZnhfcl90eXBlID09IDAgaWYgbm90IEJGRF9BU1NFTUJMRVIuICBSZXR1cm4gMCBpZgotCUJGRF9BU1NFTUJMRVIuCi0JKHN0cnVjdCByZWxvY19tYXApOiBEZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKGNvZmZfcmVsb2NfbWFwKTogTGlrZXdpc2UuCi0JKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogVXNlIGNvZmZfcmVsb2NfbWFwIHRvIGNvbnZlcnQgZnhfcl90eXBlLgotCSh0Y19nZW5fcmVsb2MpOiBOZXcgZnVuY3Rpb24gaWYgQkZEX0FTU0VNQkxFUi4KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IElmZGVmIG91dCBmeF93aGVyZSB0ZXN0IHdoaWNoIHRyaWdnZXJzCi0JaW5hcHByb3ByaWF0ZWx5IGZvciBTSCBFTEYuCi0JKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCBhbmQKLQlvYmpfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgQkZEX1JFTE9DXzE2LCBub3QKLQlCRkRfUkVMT0NfTk9ORSwgd2hlbiBjYWxsaW5nIGZpeF9uZXdfZXhwIGZvciBhIGJyb2tlbiB3b3JkLgotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IEZpeCBjb252ZXJzaW9uIG9mIGJ5dGUgY291bnQgdG8gQkZEIHJlbG9jCi0JY29kZS4KLQotRnJpIEF1ZyAzMCAxNDo0NzozOCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9vcGNvZGUpOiBGaXggcHJvYmxlbSB3aXRoIGNhbGN1bGF0aW5nIAotCWJyYW5jaCBzaXplcyBpbiBhY3Jvc3Mgc2VjdGlvbnMuCi0KLUZyaSBBdWcgMzAgMDA6NDQ6MTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtODUwLmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIGhpKCkgY29ycmVjdGx5LiAgSGFuZGxlCi0JaGkwKCkgdG9vLgotCi1XZWQgQXVnIDI4IDIzOjExOjA4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiBEZWFsIHdpdGggZW5kIG9mIG9wY29kZQotCXRhYmxlIG1hcmtlci4KLQotV2VkIEF1ZyAyOCAxOToyMDowNCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9vcGNvZGUpOiBGaXggYSBidWcgd2hpY2ggY291bGQgZ2VuZXJhdGUKLQl0aGUgd3Jvbmcgb3Bjb2RlIGZvciBjYXNlcyBsaWtlIHN0Mncgd2hlcmUgdGhlcmUgYXJlIG1hbnkgZm9ybXMKLQlvZiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4KLQotVHVlIEF1ZyAyNyAxMzo1MzoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IElmIG1kX3BhcnNlX25hbWUgaXMgZGVmaW5lZCwgY2FsbCBpdCBiZWZvcmUKLQljYWxsaW5nIHN5bWJvbF9maW5kX29yX21ha2UuCi0JKiBjb25maWcvdGMtcHBjLmggKG1kX3BhcnNlX25hbWUpOiBEZWZpbmUuCi0JKHBwY19wYXJzZV9uYW1lKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1wcGMuYyAocmVnX25hbWVfc2VhcmNoKTogQWRkIHJlZ3MgYW5kIHJlZ2NvdW50Ci0JcGFyYW1ldGVycy4KLQkocmVnaXN0ZXJfbmFtZSk6IFVwZGF0ZSBjYWxsIHRvIHJlZ19uYW1lX3NlYXJjaC4KLQkoY3Jfb3BlcmFuZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGNyX25hbWVzKTogTmV3IHN0YXRpYyBjb25zdCBhcnJheS4KLQkocHBjX3BhcnNlX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogSWYgUFBDX09QRVJBTkRfQ1IgaXMgc2V0IGluIHRoZSBvcGVyYW5kIGZsYWdzLCBzZXQKLQljcl9vcGVyYW5kIGJlZm9yZSBjYWxsaW5nIGV4cHJlc3Npb24uCi0KLVR1ZSBBdWcgMjcgMDk6MDU6NTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBBZGQgbmV3IGFyZ3VtZW50IHRvCi0JaHBwYV9nZW5fcmVsb2NfdHlwZSBjYWxsLgotCi1Nb24gQXVnIDI2IDE4OjI0OjUxIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBGaXhlZCAiLndvcmQiLiAgRml4ZWQgcHJvYmxlbSB3aXRoIHJhbmdlIGNoZWNraW5nCi0Jb24gYWRkcmVzc2VzLiAgSW1wcm92ZWQgZXJyb3IgbWVzc2FnZXMuCi0JKiBkb2MvYy1kMTB2LnRleGk6IEFkZGVkIGRvY3MgZm9yIHJlZ2lzdGVyIHBhaXJzLgotCi1Nb24gQXVnIDI2IDEzOjM5OjI3IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IEZpeCBidWcgaW4gcGFyYWxsZWwgCi0JY2hlY2tpbmcgY29kZS4KLQotTW9uIEF1ZyAyNiAxNDozODoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGluaXRfZmlsZSk6IEluaXRpYWxpemUgZk1lcmdlIHRvIDEuCi0JKGFkZF9maWxlKTogUmVzdG9yZSBvbGQgZmlsZSBtZXJnaW5nIGNvZGUsIGJ1dCBvbmx5IG1lcmdlIGZpbGVzIGlmCi0JZk1lcmdlIGlzIHNldC4KLQkoZWNvZmZfZGlyZWN0aXZlX2xvYyk6IENsZWFyIGZNZXJnZSBmaWVsZCBvZiBjdXJyZW50IGZpbGUuCi0JKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBMaWtld2lzZS4KLQotRnJpIEF1ZyAyMyAxMTo0MDo0NyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtZDEwdi50ZXhpOiBGaXggdHlwby4gCi0KLUZyaSBBdWcgMjMgMTA6NDE6MzIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IENvcnJlY3QgYml0IG1hc2tpbmcgZm9yCi0JaGkgYW5kIGxvIGV4cHJlc3Npb25zLgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IFJvdWdoIGN1dCBhdCBkZW1hbmRpbmcKLQkiZXAiIG9yICJyMzAiIGluIHNzdCBhbmQgc2xkIGluc3RydWN0aW9ucy4KLQkobWRfYXBwbHlfZml4Myk6IERvbid0IGFib3J0LiAgSnVzdCB3YXJuIHRoYXQgd2UgZG9uJ3QKLQloYXZlIHJlbG9jcyB5ZXQuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKENDX05BTUVfQ05UKTogRGVmaW5lLgotCShjY19uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSBWODUwX09QRVJBTkRfQ0MgY29ycmVjdGx5LgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IERvbid0IGZvcmdldCB0byBpbml0aWFsaXplCi0JImluc24iIQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChyZWdfbmFtZV9zZWFyY2gpOiBHZW5lcmFsaXplIHRvIHNlYXJjaAotCWFueSBnaXZlbiByZWdpc3RlciB0YWJsZS4KLQkocmVnaXN0ZXJfbmFtZSk6IFBhc3MgYXBwcm9wcmlhdGUgdGFibGUgYW5kIHNpemUgdG8gcmVnX25hbWVfc2VhcmNoLgotCShzeXN0ZW1fcmVnaXN0ZXJfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoU1lTUkVHX05BTUVfQ05UKTogRGVmaW5lLgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSBvcGVyYW5kcyB3aGljaCBhcmUgc3lzdGVtIHJlZ2lzdGVycy4KLQkKLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogSWYgd2UgZmluZCBhIHJlZ2lzdGVyLCBidXQgdGhlCi0Jb3Bjb2RlIGRvZXNuJ3Qgd2FudCBhIHJlZ2lzdGVyLCB0aGVuIHdlIGRvbid0IGhhdmUgYSBtYXRjaC4KLQkobWRfYXNzZW1ibGUpOiBHZXQgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgb3Bjb2RlIHRhYmxlLgotCi1UaHUgQXVnIDIyIDEwOjIwOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgYW5kIHN1YnN0aXR1dGUgSExERU5WLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEhMREVOVik6IE5ldyB2YXJpYWJsZS4KLQkoYXMubmV3KTogVXNlICQoSExERU5WKS4KLQotCSogZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX2VuZGVmKTogQXZvaWQgYSBkaXZpc2lvbiBieSB6ZXJvIGVycm9yCi0JaWYgYW4gYXJyYXkgZGltZW5zaW9uIGlzIG5vdCBrbm93bi4KLQotVGh1IEF1ZyAyMiAxMDo1MDowMCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRml4IGEgcmVsb2MgYnVnIGNhdXNlZCBieSBteSBsYXN0IGNoYW5nZS4gCi0JKiBkb2MvYy1kMTB2LnRleGk6IENsZWFudXAuCi0JCi1UdWUgQXVnIDIwIDE1OjE1OjE2IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy12ODUwLmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlICh2ODUwLSotZWxmKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAodjg1MC0qLWVsZik6IE5ldyB0YXJnZXQuCi0JCi1XZWQgQXVnIDIxIDE1OjUwOjU0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkb2MvYy1kMTB2LnRleGk6IE5ldyBmaWxlLgotCSogZG9jL2FsbC50ZXhpOiBBZGRlZCBEMTBWIHN0dWZmLgotCSogZG9jL2FzLnRleGluZm86IEFkZGVkIEQxMFYgc3R1ZmYuCi0KLVR1ZSBBdWcgMjAgMTQ6MTA6MDIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEFsbCByZWZlcmVuY2VzIHRvIGRlZmluZWQgc3ltYm9scyBzaG91bGQKLSAJbm93IHVzZSB0aGUgb3B0aW1hbCBpbnN0cnVjdGlvbi4gIC5mbG9hdCBhbmQgLmRvdWJsZSBub3cgd29yay4gCi0KLU1vbiBBdWcgMTkgMTQ6NDE6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IEFkanVzdCBQQyByZWxhdGl2ZSByZWxvYyBieQotCXNlY3Rpb24gYWRkcmVzcyBmb3IgdGhlIGk5NjAgYXMgaXMgZG9uZSBmb3IgdGhlIGkzODYuCi0KLVRodSBBdWcgMTUgMTY6Mzc6NTkgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgd2lsZGNhcmRzIGZvciBjb25maWcgbWF0Y2hpbmcsIGFkZCBtaXBzLSotKgotCWNhc2UsIGZvcndhcmQtaW5jbHVkZSBiZmQvZWxmLWJmZC5oLgotCi1UaHUgQXVnIDE1IDEzOjI0OjMwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBBZGQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgb3Bjb2RlCi0gICAgICAgIHRhYmxlIHRvIGhlbHAgZGV0ZXJtaW5pbmUgd2hpY2ggaW5zdHJ1Y3Rpb25zIGNhbiBiZSBkb25lCi0gICAgICAgIGluIHBhcmFsbGVsLiAKLQotVGh1IEF1ZyAxNSAxNzowMTozMSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYzogTWFqb3IgY2hhbmdlcyB0byBhZGQgVGh1bWIgc3VwcG9ydCwgd2l0aCBsb3RzCi0gCW9mIGNoYW5nZSBpbnB1dCBmcm9tIDxyZWFybnNoYUBhcm1sdGQuY28udWs+LgotCVJldmVydGVkIHRvIElOU05fU0laRSBtYWNybywgcmF0aGVyIHRoYW4gaW5zbl9zaXplIHZhcmlhYmxlLgotCShpbnNucyk6IEFkZGVkIEFSTSAiYngiIGluc3RydWN0aW9uIHN1cHBvcnQuCi0JKHRpbnNucyk6IEFkZGVkIFRodW1iIGluc3RydWN0aW9uIGRlZmluaXRpb24gc3RydWN0dXJlLgotCShhcm1fdG9wc19oc2gpOiBBZGRlZCBoYXNoIHN0cnVjdHVyZSBmb3IgVGh1bWIgb3Bjb2Rlcy4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkZWQgIi5hcm0iLCAiLnRodW1iIiBhbmQgIi5jb2RlIiBwc2V1ZG8tb3BzLgotCShvcGNvZGVfc2VsZWN0LHNfYXJtLHNfdGh1bWIsc19jb2RlKTogQWRkZWQuCi0JKGRlY29kZV9zaGlmdCk6IEFsbG93IHVwcGVyLWNhc2UgUlJYLgotCShkb19sZHN0KTogU2ltcGxlciBoYWxmd29yZCBzdXBwb3J0LgotCShkb19sZG1zdG0pOiBJbXByb3ZlZC4KLQkocmVnX2xpc3QsIGRvX2J4LCB0aHVtYl9yZWcsIHRodW1iX2FkZF9zdWIsIHRodW1iX3NoaWZ0LAotIAl0aHVtYl9tb3ZfY29tcGFyZSwgdGh1bWJfbG9hZF9zdG9yZSwgZG9fdF9hcml0LCBkb190X2FkZCwKLSAJZG9fdF9hc3IsIGRvX3RfYnJhbmNoLCBkb190X2J4LCBkb190X2NvbXBhcmUsIGRvX3RfbGRtc3RtLAotIAlkb190X2xkcmIsIGRvX3RfbGRyaCwgZG9fdF9sZHMsIGRvX3RfbHNsLCBkb190X2xzciwgZG9fdF9tb3YsCi0gCWRvX3RfcHVzaF9wb3AsIGRvX3Rfc3RyLCBkb190X3N0cmIsIGRvX3Rfc3RyaCwgZG9fdF9zdWIsIGRvX3Rfc3dpLAotIAlkb190X2Fkcik6IEFkZGVkLgotCShtZF9hcHBseV9maXgzKTogQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ19BUk1fVEhVTUJfKiByZWxvY2F0aW9ucy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIC1tdGh1bWIuCi0JKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGVkIHRvIHJlZmxlY3QgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24uCi0JKGFybV9kYXRhX2luX2NvZGUsIGFybV9jYW5vbmljYWxpemVfc3ltYm9sX25hbWUpOiBBZGRlZC4KLQkqIGNvbmZpZy90Yy1hcm0uaDogUHJvdmlkZSBUQ19GSVhfVFlQRSB0byBhbGxvdyBwcml2YXRlIEFSTQotIAlmcmFnbWVudCBpbmZvcm1hdGlvbiB0byBiZSBoZWxkLgotCi1UaHUgQXVnIDE1IDE2OjEyOjAwIDE5OTYgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBBbHNvIHNldCBmaXhQLT5meF9kb25lIGlmIGZ4X2FkZHN5IGlzIAotCW5vbi1udWxsLCBidXQgaXMgYSBjb25zdGFudC4KLQkoZml4X25ld19hcm0pOiBDYWxsIG1ha2VfZXhwcl9zeW1ib2wgdG8gbWFrZSB0aGUgZXhwcmVzc2lvbiBzeW1ib2wKLQlzbyB0aGF0IGVycm9yIHJlcG9ydGluZyB3aWxsIHdvcmsgY29ycmVjdGx5LgotCi1XZWQgQXVnIDE0IDEwOjM3OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCByZWxvY3MKLQlhZ2FpbnN0IHdlYWsgc3ltYm9scy4KLQotVHVlIEF1ZyAxMyAxNzozOToyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoVENfRk9SQ0VfUkVMT0NUSU9OKTogRGVmaW5lIGlmIE9CSl9YQ09GRi4KLQkocHBjX2ZvcmNlX3JlbG9jYXRpb24pOiBEZWNsYXJlIGlmIE9CSl9YQ09GRi4KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24gaWYKLQlPQkpfWENPRkYuCi0KLU1vbiBBdWcgMTIgMTY6NDk6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChCWVRFX09SREVSKTogRG9uJ3QgZGVmaW5lLiAgTm8gbG9uZ2VyIHVzZWQuCi0KLUZyaSBBdWcgIDkgMTc6NDg6MjggMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeCBwcm9ibGVtIHdpdGggcmVsb2NzLiAKLQotRnJpIEF1ZyAgOSAxNDoxNjoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IElmIG5vdCBCRkRfQVNTRU1CTEVSLCBhbHdheXMgYWxpZ24KLQl3aXRoIG5vcHMgaWYgbm90IGluIGRhdGFfc2VjdGlvbiBvciBic3Nfc2VjdGlvbi4KLQotVGh1IEF1ZyAgOCAxMjozMjo1NiAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCUFkZCBzdXBwb3J0IGZvciBvcGVuVk1TL0FscGhhLgotCSogYXMuaCAoUFJJTlRGX0xJS0UpOiBEb24ndCBkZWZpbmUgaWYgVk1TLCBmb3Igbm93LgotCSogY29uZmlnL29iai1ldmF4LmM6IE5ldyBmaWxlLgotCSogY29uZmlnL29iai1ldmF4Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLWFscGhhLmM6IEFkZCBzdXBwb3J0IGZvciBFVkFYIGZvcm1hdCBpZiBPQkpfRVZBWCBpcwotCWRlZmluZWQuCi0JKiBjb25maWcvdGMtYWxwaGEuaDogQWRkIHN1cHBvcnQgZm9yIEVWQVggZm9ybWF0IGlmIE9CSl9FVkFYIGlzCi0JZGVmaW5lZC4gIEFkZCBjYXNlIGZvciBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91ci4KLQkqIGNvbmZpZy92bXMtYS1jb25mLmg6IE5ldyBmaWxlLgotCSogY29uZi1hLWdhcy5jb206IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBBZGQgdGFyZ2V0IGFscGhhLSotKnZtcyouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgotCSogcmVhZC5jIChzX2xjb21tKTogQWxpZ24gYnNzX3NlZyBvbiA4IGJ5dGUgYm91bmRhcnkgaWYgT0JKX0VWQVguCi0JRG9uJ3QgY2FsbCBmZnMgb24gb3BlblZNUy9BbHBoYS4KLQotV2VkIEF1ZyAgNyAxNDoxOTowMyAxOTk2ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWd1cmUuaW46IE1ha2UgR0FTX0NIRUNLX0RFQ0xfTkVFREVEIGluY2x1ZGUgPHN0cmluZy5oPiBvcgotCTxzdHJpbmdzLmg+IGlmIHRoZXkgZXhpc3QuICBDYWxsIEdBU19DSEVDS19ERUNMX05FRURFRCBvbiBzdHJzdHIKLQlhbmQgc2Jyay4KLQkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fU1RSU1RSKTogTmV3IG1hY3JvLgotCShORUVEX0RFQ0xBUkFUSU9OX1NCUkspOiBOZXcgbWFjcm8uCi0JKiBjb25maWd1cmUsIGNvbmYuaW46IFJlYnVpbGQuCi0JKiBhcy5oOiBPbmx5IGluY2x1ZGUgPHN0cmluZ3MuaD4gaWYgSEFWRV9TVFJJTkdTX0guCi0JKHN0cnN0cik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIuCi0JKiBhcy5jOiBJZiBIQVZFX1NCUksgYW5kIE5FRURfREVDTEFSQVRJT05fU0JSSywgZGVjbGFyZSBzYnJrLgotCi1XZWQgQXVnICA3IDExOjUwOjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEhhbmRsZSBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbgotCWJ5IGEgY29uc3RhbnQgYmVmb3JlIGVudGVyaW5nIHRoZSBtYWluIHN3aXRjaC4gIFJlamVjdCBhdHRlbXB0cyB0bwotCWFwcGx5IGFuIGFyaXRobWV0aWMgZnVuY3Rpb24gdG8gbm9uLWFic29sdXRlIHN5bWJvbHMsIGV4Y2VwdCBmb3IKLQl0aGUgc3BlY2lhbCBjYXNlIG9mIHN1YnRyYWN0aW9uIG9mIHR3byBzeW1ib2xzIGluIHRoZSBzYW1lCi0Jc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2VjdGlvbl9hbGlnbik6IERvIGFsaWduIGlmIE9CSl9FTEYsIGJ1dAotCW5vdCB0byBtb3JlIHRoYW4gYSAxNiBieXRlIGJvdW5kYXJ5LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19nZW5fcmVsb2MpOiBBY2NlcHQgYWxsIHJlbG9jczsgcmVtb3ZlCi0JI2lmbmRlZiBPQkpfRUxGIGxpbmVzLiAgRnJvbSBFcmljIFZhbGV0dGUgPHZhbGV0dGVAY3JmLmNhbm9uLmZyPi4KLQkodGNfZ2VuX3JlbG9jKTogSWYgb3V0IG9mIG1lbW9yeSBjYWxsIGFzX2ZhdGFsIHJhdGhlciB0aGFuCi0JYXNzZXJ0LiAgSWYgbm8gaG93dG8gZm91bmQsIGNhbGwgYXNfYmFkX3doZXJlIHJhdGhlciB0aGFuCi0JYXNfZmF0YWwuICBDaGFuZ2UgdGhlIGVycm9yIG1lc3NhZ2Ugc2xpZ2h0bHkuICBTZXQgaG93dG8gdG8gYQotCW5vbi1OVUxMIHZhbHVlIGluIG9yZGVyIHRvIGtlZXAgZ29pbmcuCi0KLVR1ZSBBdWcgIDYgMTI6NTg6MDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEFkZGVkIGNvZGUgdG8gc3VwcG9ydCAzMi1iaXQgZml4dXBzIGZvciBzdGFicy4KLQotVHVlIEF1ZyAgNiAxMToxNToyNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChnZXRfc3BlY2lmaWMpOiBOZXcgb3BlcmFuZCAic2l6ZSIgZGVyaXZlZAotCWZyb20gIi5iIiwgIi53IiBhbmQgIi5sIiBleHRlbnNpb25zLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4gIElmCi0JdGhlIGJhc2UgaW5zdHJ1Y3Rpb24gaGFzIG5vIG9wZXJhbmRzLCB0aGVuIHVzZSB0aGUgc2l6ZSB0bwotCWRldGVybWluZSB3aGljaCBzcGVjaWZpYyBpbnN0cnVjdGlvbiB0byB1c2UuCi0KLU1vbiBBdWcgIDUgMTQ6MjE6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZW1fZm10KTogQ2FsbCBwYXJzZV9leHByIGJlZm9yZSBlbWl0LgotCi1GcmkgQXVnICAyIDExOjIzOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2VjdGlvbl9hbGlnbik6IERvbid0IGNoYW5nZSBhZGRyIGlmCi0JT0JKX0VMRi4KLQotVGh1IEF1ZyAgMSAyMzo1MTo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2VzLgotCQotV2VkIEp1bCAzMSAxNDo0NjoxMSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRGlzYWJsZSByYW5nZSBjaGVja2luZyBvbiAxNi1iaXQgdmFsdWVzLgotCi1XZWQgSnVsIDMxIDE2OjI3OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFNldCBva19hcmNoIGZvciBldmVyeSBpbnN0cnVjdGlvbiwKLQlub3QganVzdCB0aGUgb25lcyB0aGF0IGRvbid0IG1hdGNoLgotCi1XZWQgSnVsIDMxIDExOjQ1OjE1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBGaXhlZCBidWdzIGluIHNob3J0IHJlbG9jcyBhbmQgcmFuZ2UgY2hlY2tpbmcuCi0KLVdlZCBKdWwgMzEgMTU6NDE6NDIgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtYXJtLmM6IENoYW5nZWQgSU5TTl9TSVpFIHRvIHZhcmlhYmxlIGluc25fc2l6ZSwgYXMKLSAJcHJlLWN1cnNvciB0byBhZGRpbmcgVGh1bWIgc3VwcG9ydC4gQWxzbyBhZGRlZCBjcHVfdmFyaWFudCBmbGFnCi0gCWluZm9ybWF0aW9uIHRvIGVhY2ggb2YgdGhlIGFzbV9mbGcgc3RydWN0dXJlcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogVXBkYXRlZCBBUk03IHBhcnNpbmcgdG8gYWxsb3cgJ3QnIGZvcgotIAl0aHVtYi9oYWxmd29yZCBzdXBwb3J0LCBhc3dlbGwgYXMgJ20nIGZvciBsb25nIG11bHRpcGx5LgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlZCBoZWxwIG1lc3NhZ2UuCi0JKG1kX2Fzc2VtYmxlKTogQ2hlY2sgdGhhdCBpbnN0cnVjdGlvbiBmbGFncyBhcmUgYXBwbGljYXRlZCB0byB0aGUKLSAJY3VycmVudCBjcHUgdmFyaWFudC4KLQkobWRfYXBwbHlfZml4MywgdGNfZ2VuX3JlbG9jKTogQWRkIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTggYW5kCi0gCUJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMIHJlbG9jYXRpb24gc3VwcG9ydCBmb3IgbmV3IGhhbGZ3b3JkIGFuZAotIAlzaWduZXh0ZW5zaW9uIGluc3RydWN0aW9ucy4KLQkoZG9fbGRzdCk6IEdlbmVyYXRlIGhhbGZ3b3JkIGFuZCBzaWduZXh0ZW5zaW9uIHZhcmlhbnRzIGlmCi0gCW1uZW1vbmljIGZsYWdzIG1hdGNoLgotCShsZHN0X2V4dGVuZCk6IERvIG5vdCBhbGxvdyBzaGlmdHMgaW4gdGhlIG9mZnNldCBmaWVsZCBvZiBoYWxmd29yZAotIAlvciBzaWduZXh0ZW5zaW9uIGluc3RydWN0aW9ucy4KLQkodmFsaWRhdGVfb2Zmc2V0X2ltbSk6IFByb3ZpZGUgY2hlY2sgb24gaGFsZndvcmQgYW5kIHNpZ25leHRlbnNpb24KLSAJaW1tZWRpYXRlIHJhbmdlLgotCShhZGRfdG9fbGl0X3Bvb2wpOiBNZXJnZSBpZGVudGljYWwgbGl0ZXJhbCBwb29sIHZhbHVlcy4KLQotVHVlIEp1bCAzMCAxNDoyODoyMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHNlbGVjdG9yX3RhYmxlKTogQWRkICdFJyBzZWxlY3Rvci4KLQkoY29uc19maXhfbmV3X2hwcGEpOiBEb24ndCBjb2tlIG9uIGVfZXNlbC4KLQkodGNfZ2VuX3JlbG9jLCBTT00gdmVyc2lvbik6IEhhbmRsZSBSX0NPTVAyIHdoZW4gdXNlZAotCXRvIGhlbHAgZ2VuZXJhdGUgZXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlcy4KLQkobWRfYXBwbHlfZml4KTogRG9uJ3QgdHJ5IHRvIGFwcGx5IGZpeHVwcyB3aXRoIGFuIGVfZXNlbAotCXNlbGVjdG9yLgotCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogRml4dXBzIHdpdGggZV9lc2VsIHNlbGVjdG9ycwotCWFyZSBub3QgYWRqdXN0YWJsZS4KLQotVHVlIEp1bCAzMCAxNTo1MTo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgMmJ5dGUsIDRieXRlLCBhbmQgOGJ5dGUKLQlwc2V1ZG8tb3BzLgotCi1GcmkgSnVsIDI2IDExOjQzOjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBBZGRlZCBsb3RzIG9mIGVycm9yIGNoZWNraW5nLiAgQWRkZWQgaGFja3MKLQl0byBzdXBwb3J0IGFjY3VtdWxhdG9yIHNoaWZ0cy4KLQkKLUZyaSBKdWwgMjYgMTE6NTY6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKFNfU0VUX0VYVEVSTkFMKTogTGV0IC53ZWFrIG92ZXJyaWRlLgotCShTX0NMRUFSX0VYVEVSTkFMKTogTGlrZXdpc2UuCi0JKFNfU0VUX1dFQUspOiBSZW1vdmUgZXJyb3I7IGp1c3QgbGV0IC53ZWFrIG92ZXJyaWRlLgotCi1UaHUgSnVsIDI1IDE1OjIyOjUxIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hc3NlbWJsZSk6IE5vdyBoYW5kbGVzIG11bHRpbGluZQotCWluc3RydWN0aW9ucy4KLQotVGh1IEp1bCAyNSAxMjowMzozMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRml4IHBhY2thZ2luZyBidWcuIEFkZGVkIHJhbmdlIGNoZWNraW5nLgotCUFkZGVkIGtsdWRnZSBmb3IgZGl2cyBpbnN0cnVjdGlvbi4gIEZpeGVkIG1pbm9yIHByb2JsZW0gd2l0aAotCW11bHRpcGxlIHRleHQgc2VjdGlvbnMuCi0JKiBjb25maWcvdGMtZDEwdi5oIChkMTB2X2NsZWFudXApOiBDaGFuZ2UgcHJvdG90eXBlLiAKLQkKLVR1ZSBKdWwgMjMgMTA6NDk6MzYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggYWxsIGluc3RydWN0aW9uCi0JYWRkcmVzc2VzIHRvIGJlIHJpZ2h0LXNoaWZ0ZWQgYnkgMi4KLQotTW9uIEp1bCAyMiAxMTozMjozNiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogTWFueSBjaGFuZ2VzIHRvIGdldCByZWxvY3Mgd29ya2luZy4KLSAJKHJlZ2lzdGVyX25hbWUpOiBObyBsb25nZXIgY3JlYXRlcyBhIHN5bWJvbCBmb3IgcmVnaXN0ZXIgbmFtZXMuCi0gCShwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBtb3ZlZCB0byBvcGNvZGVzL2QxMHYtb3BjLmMuCi0JKGQxMHZfaW5zZXJ0X29wZXJhbmQpOiBOb3cgd29ya3MgY29ycmVjdGx5IGZvciBlaXRoZXIgY29udGFpbmVyLgotCSogY29uZmlnL3RjLWQxMHYuaCAoZDEwdl9jbGVhbnVwKTogRGVjbGFyZS4gCi0JCi1Nb24gSnVsIDIyIDE0OjAxOjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAodGNfZ2VuX3JlbG9jKTogQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyBhbmQKLQlCRkRfUkVMT0NfUENSRUxfTE8xNiBhcmUgZXhwZWN0ZWQgdG8gYmUgUEMgcmVsYXRpdmUuCi0KLU1vbiBKdWwgMjIgMTI6NDY6NTUgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIHRjLWFscGhhLmM6IFBhdGNoZXMgdG8gdHJhY2sgY3VycmVudCBtaW5pbXVtIGFsaWdubWVudCB0byByZWR1Y2UKLQl0aGUgbnVtYmVyIG9mIGZyYWdtZW50cyBjcmVhdGVkIHdpdGggZnJhZ19hbGlnbi4KLQkoYWxwaGFfY3VycmVudF9hbGlnbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNfYWxwaGFfdGV4dCk6IFJlc2V0IGFsaWdubWVudCB0byAwLgotCShzX2FscGhhX2RhdGEsIHNfYWxwaGFfcmRhdGEsIHNfYWxwaGFfc2RhdGEpOiBMaWtld2lzZS4KLQkoc19hbHBoYV9zdHJpbmdlciwgc19hbHBoYV9zcGFjZSk6IE5ldyBmdW5jdGlvbnMuCi0JKHNfYWxwaGFfY29ucywgYWxwaGFfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBSZW1vdmUgZnVuY3Rpb25zLgotCShhbHBoYV9jb25zX2FsaWduKTogTmV3IGZ1bmN0aW9uIHRvIHJlcGxhY2UgYm90aCBvZiB0aGVtLgotCShlbWl0X2luc24pOiBPbmx5IGFsaWduIGlmIGFscGhhX2N1cnJlbnRfYWxpZ24gaXMgbGVzcyB0aGFuIDI7Ci0JcmVzZXQgYWxwaGFfY3VycmVudF9hbGlnbiB0byAyLgotCShzX2FscGhhX2dwcmVsMzIpOiBMaWtld2lzZS4KLQkoc19hbHBoYV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLiAgQmFzaWNhbGx5IGR1cGxpY2F0ZSB0aGUgb3RoZXIKLQlhbHBoYSBzZWN0aW9uIGNoYW5nZSBob29rcy4gIE9ubHkgZGVmaW5lIGZvciBFTEYuCi0JKHNfYWxwaGFfZmxvYXRfY29ucyk6IFNpbXBsaWZ5IGFsaWdubWVudCBoYW5kbGluZy4KLQkobWRfcHNldWRvX3RhYmxlKTogT25seSBkZWZpbmUgInJkYXRhIiBhbmQgInNkYXRhIiBpZiBPQkpfRUNPRkYuCi0JSWYgT0JKX0VMRiwgZGVmaW5lICJzZWN0aW9uIiwgInNlY3Rpb24ucyIsICJzZWN0IiwgYW5kICJzZWN0LnMiLgotCURvbid0IGRlZmluZSB0aGUgc19hbHBoYV9jb25zIHBzZXVkby1vcHMuICBEbyBkZWZpbmUKLQlzX2FscGhhX3N0cmluZ2VyIGFuZCBzX2FscGhhX3NwYWNlIHBzZXVkby1vcHMuCi0JKGFscGhhX2FsaWduKTogU2tpcCBpZiBsZXNzIHRoYW4gY3VycmVudCBkZWZhdWx0IGFsaWdubWVudC4gIFNldAotCWRlZmF1bHQgYWxpZ25tZW50LgotCSogdGMtYWxwaGEuaCAobWRfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBSZW1vdmUuCi0JKG1kX2NvbnNfYWxpZ24pOiBBZGQuCi0KLQkqIHRjLWFscGhhLmM6IEFkZCBvb2RsZXMgb2YgZnVuY3Rpb24gZGVzY3JpcHRpb24gY29tbWVudHMuCi0JKG1kX2JpZ251bV90b19jaGFycyk6IFJlbW92ZTsgdGhlcmUgYXJlIG5vIGNhbGxlcnMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIHNvbWUgbW9yZSB2YXJpYW50cy4KLQotVGh1IEp1bCAxOCAxNTo1NDo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEFuZHJldyBHaWVydGggPEFORFJFV0dAbWljcm9saXNlLmNvLnVrPjoKLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMtKi1zeXN2NCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKTogQ2hhbmdlIHVhaGFsZiwgdWF3b3JkLCBhbmQKLQl1YXh3b3JkIHRvIHVzZSBzX3VhY29ucy4KLQkoc3BhcmNfbm9fYWxpZ25fY29ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNfdWFjb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3BhcmNfY29uc19hbGlnbik6IElmIHNwYXJjX25vX2FsaWduX2NvbnMgaXMgc2V0LCBqdXN0IGNsZWFyIGl0Ci0JYW5kIHJldHVybi4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfY29tbW9uKTogUmVtb3ZlIHVudXNlZCBsYWJlbCBhbGxvY2F0ZV9ic3MuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG1pcHMtKi1pcml4NiogdGFyZ2V0LiAgSGFuZGxlIElyaXggNiBsaWtlIElyaXgKLQk1IHdpdGggcmVnYXJkIHRvIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBVc2UgdGhlIGNvcnJlY3QgbGVuZ3RoIHdoZW4KLQlhbGxvY2F0aW5nIHNwYWNlIGZvciB0aGUgdW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIGVycm9yIG1lc3NhZ2UuCi0KLVRodSBKdWwgMTggMTI6NTc6MTAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQxMHYtKi0qKTogQWxsb3cgZDEwdi0qLSosIGRvbid0IHJlcXVpcmUgZDEwdi0qLWVsZiouCi0KLVdlZCBKdWwgMTcgMTQ6MjU6MTMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLWQxMHYuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUgKGQxMHYtKi1lbGYpOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChkMTB2LSotZWxmKTogTmV3IHRhcmdldC4KLQkKLUZyaSBKdWwgMTIgMjA6NTQ6MTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IFJlY29nbml6ZSAtSyBQSUMuCi0KLVdlZCBKdWwgMTAgMTI6Mzk6MDggMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9hbGlnbik6IENoYW5nZSBmaWxsIHBhcmFtZXRlcgotCXRvIGEgcG9pbnRlci4gIFRha2UgTlVMTCBhcyAwIG9yIG5vcCBkZXBlbmRpbmcgb24gc2VjdGlvbi4gIENoYW5nZQotCWFsbCBjYWxsZXJzLgotCShzX2FscGhhX2FsaWduKTogUmVuYW1lIGxvY2FsIHZhcmlhYmxlcy4KLQotCSogZG9jL2FzLnRleGluZm8gKC5hbGlnbik6IERvY3VtZW50IGFjdGlvbiBvZiBvbWl0dGVkCi0JZmlsbCBwYXJhbWV0ZXIuCi0KLVdlZCBKdWwgMTAgMDA6MjM6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBHaXZlIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UKLQl3aGVuIGFuIHVuc3VwcG9ydGVkIFBDIHJlbGF0aXZlIHJlbG9jIGlzIHNlZW4sIHJhdGhlciB0aGFuIGNhbGxpbmcKLQlhYm9ydC4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogUmVtb3ZlIG5vdF9jcHBfbGluZSBsb2NhbCB2YXJpYWJsZS4KLQlJbnN0ZWFkLCBjaGVjayBzdGF0ZSB3aGVuICcjJyBjb21tZW50IGlzIHNlZW4uCi0KLU1vbiBKdWwgIDggMTQ6MTE6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3JlZ21hc2tfZnJhZyk6IE9ubHkgZGVmaW5lIGlmIE9CSl9FTEYgb3IKLSAJT0JKX01BWUJFX0VMRi4KLQkodGNfZ2VuX3JlbG9jKTogSWYgZml4dXAgd2FzIGNoYW5nZWQgdG8gYmUgUEMgcmVsYXRpdmUsIGNoYW5nZQotIAlyZWxvYyB0eXBlIGFjY29yZGluZ2x5LiAgVXNlIG5hbWUgb2YgcmVsb2MgaW4gZXJyb3IgbWVzc2FnZS4KLQotCSogYXMuaDogRG9uJ3QgZGVmaW5lIGNvbnN0IG9yIHZvbGF0aWxlLgotCSogZmxvbnVtLmg6IERvbid0IGRlZmluZSBjb25zdC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAodGNfZ2VuX3JlbG9jKTogQ2hhbmdlIHRoZSBjb2RlIGFwcHJvcHJpYXRlbHkKLQlpZiBmeF9wY3JlbCBpcyBzZXQuICBDb3JyZWN0IHNldHRpbmcgdGhlIGFkZGVuZCBjYXNlIGluIHRoZQotCU9CSl9FTEYgY2FzZSAoZnJvbSBBbmRyZWFzIFNjaHdhYgotCTxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+KS4KLQkobWRfc2hvd191c2FnZSk6IENvcnJlY3QgLW1mYzUyMDAgdG8gLW01MjAwLgotCi1GcmkgSnVsICA1IDEwOjMyOjU4IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtbTY4ay50ZXhpOiBEb2N1bWVudCAtbTUyMDAgZmxhZy4KLQkqIGRvYy9hcy50ZXhpbmZvOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFRoZSBjb2xkZmlyZSBkb2VzIG5vdCBzdXBwb3J0IDh4Ci0gCXNjYWxlIGZhY3Rvci4KLQotRnJpIEp1bCAgNSAxMTowNzoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAoU19TRVRfRVhURVJOQUwpOiBDaGFuZ2UgYXNfd2FybiB0byBhc19iYWQuCi0JKFNfQ0xFQVJfRVhURVJOQUwsIFNfU0VUX1dFQUspOiBMaWtld2lzZS4KLQotVGh1IEp1bCAgNCAxMTo1OTo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogU2V0IHRvIGN5Z251cy0yLjcuMS4KLQotCSogUmVsZWFzZWQgYmludXRpbHMgMi43LgotCi1UaHUgSnVsICA0IDEwOjExOjMzIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IE9ubHkgcGVyZm9ybSByYW5nZSBjaGVjayB3aGVuCi0gCWRlYWxpbmcgd2l0aCBPX2NvbnN0YW50IGV4cHJlc3Npb25zLgotCi1XZWQgSnVsICAzIDE1OjAyOjIxIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1wYXJzZS5oIChtNjhrX3JlZ2lzdGVyKTogQWRkIG5ldyBjb2xkZmlsZSBjb250cm9sCi0JcmVnaXN0ZXJzLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtY2Y1MjAwX2NvbnRyb2xfcmVncyk6IE5ldyB2YXJpYWJsZSwgCi0JYXJyYXkgb2YgY29udHJvbCByZWdpc3RlcnMgZm9yIHRoZSBjb2xkZmlyZS4KLQkoY3B1X29mX2FyY2gpOiBBZGRlZCBtY2Y1MjAwLgotCShhcmNocyk6IEFkZGVkIG1jZjUyMDAuCi0JKGluaXRfdGFibGUpOiBBZGQgbmV3IGNvbnRyb2wgcmVnaXN0ZXJzLgotCShtNjhrX2lwKTogQWRkZWQgc3VwcG9ydCBmb3IgbmV3IGNvbnRyb2wgcmVnaXN0ZXJzLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9zaG93X3VzYWdlKTogQWRkIC1tNTIwMCB0byB1c2FnZSB0ZXh0LgotCi1XZWQgSnVsICAzIDE2OjA1OjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5oIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50KTogRGVjbGFyZS4KLQkqIHJlYWQuYyAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCk6IFJlbW92ZSBkZWNsYXJhdGlvbi4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IENvcnJlY3QgcGFyZW50aGVzaXphdGlvbiBvZiB8fAotCXdpdGhpbiAmJi4KLQkobWRfYXNzZW1ibGUpOiBGaXggaGFuZGxpbmcgb2YgQGwgd2l0aCBhbiB1bnNpZ25lZCBjb25zdGFudC4gIEFkZAotCWRlZmF1bHQgY2FzZSB0byByZWxvYyBzd2l0Y2guCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKEFPVVRfTUFDSFRZUEUpOiBEZWZpbmUgYXMgMCBpZiBURV8zODZCU0QuCi0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gVG9tIFF1aWdnbGUgPHF1aWdnbGVAc2dpLmNvbT46Ci0JKiBlY29mZi5jIChsYXN0X2xpbmVubyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFkZF9wcm9jZWR1cmUpOiBTZXQgbGFzdF9saW5lbm8uCi0JKGVjb2ZmX2RpcmVjdGl2ZV9sb2MpOiBMaWtld2lzZS4KLQkoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IExpa2V3aXNlLgotCShlY29mZl9maXhfbG9jKTogTmV3IGZ1bmN0aW9uLgotCSogZWNvZmYuaCAoZWNvZmZfZml4X2xvYyk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IFdoZW4gaW5zZXJ0aW5nIG5vcHMsIGFuZCB1c2luZwotCUVDT0ZGIGRlYnVnZ2luZywgY2FsbCBlY29mZl9maXhfbG9jLgotCi1UdWUgSnVsICAyIDIzOjAyOjEyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGJ1aWxkX2J5dGVzKTogSWYgYW4gb3BlcmFuZCB0eXBlIGlzIAotCW1hcmtlZCBhcyBTUkNfSU5fRFNUIHJldHJpZXZlIGl0IGZyb20gdGhlICJkZXN0aW5hdGlvbiIgb3AuCi0KLVNhdCBKdW4gMjkgMTM6Mzg6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGFybS0qLXJpc2NpeCopOiBTZXQgZW11bGF0aW9uIHRvIHJpc2NpeC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy90ZS1yaXNjaXguaDogTmV3IGZpbGUgdG8gZGVmaW5lIFRFX1JJU0NJWC4KLQotCSogY29uZmlnL3RjLXNoLmggKFNVQl9TRUdNRU5UX0FMSUdOKTogRGVmaW5lLgotCi1GcmkgSnVuIDI4IDE1OjE0OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5zdGF0dXMpOiBKdXN0IHJ1biBjb25maWcuc3RhdHVzIGFzIG90aGVyCi0JdG9vbHMgZG8uCi0KLUZyaSBKdW4gMjggMTE6MDk6MzggMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluIChUQVJHRVRfT1MpOiBBZGQgZGVmaW5pdGlvbiB0byBjb25mLgotCi1UaHUgSnVuIDI3IDIwOjM5OjQwIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBQYXJlbnRoZXNpemUKLQljb3BfaW50ZXJsb2NrcyBleHByZXNzaW9ucy4KLQotVGh1IEp1biAyNyAxMjoxODoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19wcmludCk6IENsb3NlIHRoZSBsaXN0aW5nIGZpbGUgaWYgaXQgaXMgbm90Ci0Jc3Rkb3V0LiAgQ2xvc2UgdGhlIG90aGVyIGZpbGVzIG9wZW5lZCBmb3IgdGhlIGxpc3RpbmcuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChtZF9jb25zX2FsaWduKTogRGVmaW5lLgotCShzcGFyY19jb25zX2FsaWduKTogRGVjbGFyZS4KLQkoSEFORExFX0FMSUdOKTogRGVmaW5lLgotCShzcGFyY19oYW5kbGVfYWxpZ24pOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2NvbnNfYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2hhbmRsZV9hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuYyAoY29uc193b3JrZXIpOiBDYWxsIG1kX2NvbnNfYWxpZ24gaWYgaXQgaXMgZGVmaW5lZC4KLQotCSogYXMuaCAoc3RydWN0IGZyYWcpOiBBZGQgZnJfZmlsZSBhbmQgZnJfbGluZSBmaWVsZHMuCi0JKiBmcmFncy5jIChmcmFnX25ldyk6IFNldCBmcl9maWxlIGFuZCBmcl9saW5lLgotCShmcmFnX3Zhcik6IExpa2V3aXNlLgotCShmcmFnX3ZhcmlhbnQpOiBMaWtld2lzZS4KLQotCSogYXMuaCAoc3RydWN0IGZyYWcpOiBSZW1vdmUgdW51c2VkIGFsaWduX21hc2sgYW5kIGFsaWduX29mZnNldAotCWZpZWxkcy4KLQotCSogbGlzdGluZy5jIChjYWxjX2hleCk6IE9mZnNldCBieSBmcl9maXggd2hlbiBleGFtaW5pbmcgZnJfdmFyLgotCUZyb20gPHVkZGVib3JnQGNhcm1lbi5zZT4uCi0KLVdlZCBKdW4gMjYgMTM6MjE6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1vc2YqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLW02OGsuYzogQWRkIDY4ZWMwNjAgYXMgYSBzeW5vbnltIGZvciA2ODA2MC4KLQotV2VkIEp1biAyNiAxNjoyMzowOCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEFkZGVkIGNvcF9pbnRlcmxvY2tzLCB0byBhdm9pZCBOT1AgaW5zZXJ0aW9uCi0gCWJldHdlZW4gY28tcHJvY2Vzc29yIGNvbXBhcmlzb25zIGFuZCBicmFuY2hlcyBmb3IgdGhlIFZSNDMwMC4KLQotTW9uIEp1biAyNCAxODowMjo1MCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpciwKLQlJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgotCShkb2NkaXIpOiBSZW1vdmVkLgotCSogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgotCSogZG9jL01ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLAotCWluY2x1ZGVkaXIpOiBVc2UgYXV0b2NvbmYgc2V0IHZhbHVlcy4KLQkoZG9jZGlyKTogUmVtb3ZlZC4KLQotTW9uIEp1biAyNCAxMTo1ODoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19lamVjdCk6IERvbid0IGRvIGFueXRoaW5nIGlmIGxpc3RpbmcgaXMgMC4KLQkobGlzdGluZ19saXN0KTogTGlrZXdpc2UuCi0JKGxpc3Rpbmdfc291cmNlX2xpbmUpOiBMaWtld2lzZS4KLQkobGlzdGluZ190aXRsZSk6IERvbid0IHNhdmUgdGl0bGUgaWYgbGlzdGluZyBpcyAwLgotCShsaXN0aW5nX3NvdXJjZV9maWxlKTogQ2hlY2sgbGlzdGluZyByYXRoZXIgdGhhbiBsaXN0aW5nX3RhaWwuCi0KLQkqIGNvbmZpZ3VyZS5pbjogT24gYWxwaGEqLSotb3NmKiwgbGluayBhZ2FpbnN0IGxpYmJmZC5hIGlmIG5vdAotCXVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBKdW4gMjEgMTg6MjI6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogSW4gY2FzZSAnaScvJ2onLCBkb24ndCByZXF1aXJlIGFuCi0JYWJzb2x1dGUgZXhwcmVzc2lvbiBpZiBhIHJlbG9jYXRpb24gdHlwZSB3YXMgc3BlY2lmaWVkLgotCi1GcmkgSnVuIDIxIDE3OjQwOjE2IDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG1lcmxpbi5nY3MucmVkc3RvbmUuYXJteS5taWw+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yICotKi1ydGVtcyogY29uZmlndXJhdGlvbnMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBKdW4gMjEgMTY6MDE6MTggMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGFscGhhLSotbGludXhlY29mZiogdGFyZ2V0LiAgVXNlIGVsZiBmb3IKLQlhbHBoYS0qLWxpbnV4KiB0YXJnZXQuICBGb3JjZSBiZmRfZ2FzIGZvciBhbHBoYS0qLiAgUmVxdWlyZQotCW9wY29kZXMgbGlicmFyeSBmb3IgYWxwaGEuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgotCSogY29uZmlnL3RjLWFscGhhLmM6IFN1YnN0YW50aWFsIHJld3JpdGUgdG8gYWRkIEVMRiBzdXBwb3J0IGFuZAotCXVzZSBuZXcgb3Bjb2RlIHRhYmxlLgotCSogY29uZmlnL3RjLWFscGhhLmggKG1kX3VuZGVmaW5lZF9zeW1ib2wpOiBEb24ndCBkZWZpbmUuCi0JKExPQ0FMX0xBQkVMKTogRGVmaW5lIGRpZmZlcmVudGx5IGlmIE9CSl9FTEYuCi0JKEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZSBpZiBPQkpfRUxGLgotCSogY29uZmlnL2FscGhhLW9wY29kZS5oOiBSZW1vdmUuCi0JKiBjb25maWcvb2JqLWVsZi5oOiBJZiBUQ19BTFBIQSwgZGVmaW5lIEVDT0ZGX0RFQlVHR0lORy4KLQkqIE1ha2VmaWxlLmluIChUQVJHX0NQVV9ERVBfYWxwaGEpOiBEZXBlbmQgdXBvbgotCWluY2x1ZGUvb3Bjb2RlL2FscGhhLmggcmF0aGVyIHRoYW4gY29uZmlnL2FscGhhLW9wY29kZS5oLgotCi1UaHUgSnVuIDIwIDE5OjEwOjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9lbWl0X3JlbG9jYXRpb25zKTogR2l2ZSBhbiBlcnJvciBpZiB0aGUKLQlyZWxvY2F0aW9uIHN5bWJvbCB3YXMgbm90IHJlc29sdmVkLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBMaWtld2lzZS4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBSZWZldGNoIHRoZSBzeW1ib2wgc2VjdGlvbiBhZnRlcgotCWNhbGxpbmcgU19HRVRfVkFMVUUsIHNpbmNlIGl0IG1heSBoYXZlIGNoYW5nZWQuCi0KLQkqIGV4cHIuYyAoc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUpOiBEZWZpbmUuCi0JKGV4cHJfc3ltYm9sX2xpbmVzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWFrZV9leHByX3N5bWJvbCk6IEFkZCBlbnRyeSB0byBleHByX3N5bWJvbF9saW5lcy4KLQkoZXhwcl9zeW1ib2xfd2hlcmUpOiBOZXcgZnVuY3Rpb24uCi0JKiBleHByLmg6IFVzZSBleHRlcm4gb24gZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCShleHByX3N5bWJvbF93aGVyZSk6IERlY2xhcmUuCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogVHJ5IHRvIHVzZSBleHByX3N5bWJvbF93aGVyZQotCXJhdGhlciB0aGFuIHByaW50aW5nIHRoZSBtZWFuaW5nbGVzcyBuYW1lIG9mIGFuIGV4cHJlc3Npb24KLQlzeW1ib2wuCi0KLVRodSBKdW4gMjAgMTU6NTc6NDEgMTk5NiAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX251bWJlcl90b19jaGFycyk6IERlbGV0ZWQuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9udW1iZXJfdG9fY2hhcnMpOiBOZXcgbWFjcm8uCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChidWlsZF9vcGVyYXRlX24sIGJ1aWxkX21lbSk6IE1vdmVkIGVhcmxpZXIgaW4KLQl0aGUgZmlsZS4KLQkobG9hZF9zeW1ib2xfYWRkcmVzcywgbG9hZF9leHByZXNzaW9uKTogVXNlIGJ1aWxkX21lbS4KLQkoYnVpbGRfb3BlcmF0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoZW1pdF9hZGRxX3IpOiBVc2UgaXQuCi0KLQlXZWQgTWFyIDEzIDIyOjE0OjE0IDE5OTYgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogICNpZiBWTVMsIHVzZSBTX1NFVF9PVEhFUiB0byBzdG9yZSBgY29uc3RfZmxhZycuCi0KLQlUdWUgTWFyICA1IDE0OjMxOjQ1IDE5OTYgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvdGMtdmF4LmggKE5PUF9PUENPREUpOiBEZWZpbmUuCi0KLQlTdW4gRmViICA0IDIxOjAxOjAzIDE5OTYgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5oIChTX0lTX0NPTU1PTik6IERlZmluZS4KLQkoU19JU19MT0NBTCk6IENoZWNrIGZvciBcMDAyIGFzIHdlbGwgYXMgXDAwMS4KLQkoTE9OR1dPUkRfQUxJR05NRU5UKTogTmV3IG1hY3JvLgotCShTVUJfU0VHTUVOVF9BTElHTik6IFVzZSBpdC4KLQotCUZyaSBKYW4gMjYgMTc6NDQ6MDkgMTk5NiAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy92bXMtY29uZi5oOiBSZWNvbmNpbGUgd2l0aCBjb25mLmluLgotCi1XZWQgSnVuIDE5IDExOjMxOjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoaXNfZG5yYW5nZSk6IE9ubHkgZGVmaW5lIGlmIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgaXMKLQlkZWZpbmVkLgotCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgdGhhdCBhbnkgbnVtYmVyIG9mIGhleCBkaWdpdHMgY2FuCi0JZm9sbG93IFx4LgotCi0JKiBhcy5jIChzdHJ1Y3QgZGVmc3ltX2xpc3QpOiBEZWZpbmUuCi0JKGRlZnN5bXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwYXJzZV9hcmdzKTogSnVzdCBwdXQgLS1kZWZzeW0gYXJndW1lbnRzIG9uIGRlZnN5bXMgbGlzdCwgcmF0aGVyCi0JdGhhbiBkZWZpbmluZyB0aGVtLgotCShtYWluKTogRGVmaW5lIGRlZnN5bXMgYWZ0ZXIgb3V0cHV0IGZpbGUgaXMgY3JlYXRlZC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFJlamVjdCBQUkUgYW5kIFBPU1QgaW5kZXhpbmcgbW9kZSBvbgotCWNwdTMyLiAgRnJvbSBFcmljIE5vcnVtIDxFcmljLk5vcnVtQHVzYXNrLmNhPi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEluIGNhc2VzICdJJywgJ2knLCBhbmQgJ2onLCBzZXQKLQlpbnNuX2Vycm9yIHJhdGhlciB0aGFuIGNhbGxpbmcgY2hlY2tfYWJzb2x1dGVfZXhwci4KLQotCSogYXMuYyAoZW11bGF0aW9uX25hbWUpOiBSZW1vdmUgdW51c2VkIHN0YXRpYyB2YXJpYWJsZS4KLQkoZGVmYXVsdF9lbXVsX2JmZF9uYW1lKTogQWRkIHJldHVybiBOVUxMIHRvIGF2b2lkIHdhcm5pbmcuCi0JKiBlY29mZi5jIChlY29mZl9zdGFiKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgbmFtZSBhbmQKLQluYW1lX2VuZC4KLQkqIGZyYWdzLmMgKGZyYWdfbmV3KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSB0bXAuCi0JKiBoYXNoLmMgKGhhc2hfZ3Jvdyk6IFBhcmVudGhlc2l6ZSArIHdpdGhpbiA8PC4KLQkoaGFzaF9wcmludF9zdGF0aXN0aWNzKTogVXNlICVsdSwgbm90ICVkLCB0byBwcmludCB1bnNpZ25lZAotCWxvbmcgdmFyaWFibGVzLgotCSogbWVzc2FnZXMuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotCShmcHJpbnRfdmFsdWUpOiBBZGQgY2FzdCB0byBhdm9pZCBwcmludGYgd2FybmluZy4KLQkoc3ByaW50X3ZhbHVlKTogTGlrZXdpc2UuCi0JKiByZWFkLmM6IEluY2x1ZGUgImVjb2ZmLmgiLgotCShlbWl0X2V4cHIpOiBBZGQgY2FzdHMgdG8gYXZvaWQgcHJpbnRmIHdhcm5pbmdzLgotCSogcmVhZC5oOiBVc2UgZXh0ZXJuIGZvciBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0JKHBvcF9pbnNlcnQpOiBEZWNsYXJlLgotCSogc3RhYnMuYzogSW5jbHVkZSAiZWNvZmYuaCIuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIHRtcCwKLQlmb3JtZXJfbGFzdF9mcmFnUCwgYW5kIG5ld19mcmFnUC4KLQkqIHN1YnNlZ3MuaCAoc3Vic2Vnc19wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQkqIHN5bWJvbHMuYyAoZGVidWdfdmVyaWZ5X3N5bWNoYWluKTogQ2hhbmdlIG1hY3JvIHRvIGRpc2NhcmQKLQlhcmd1bWVudHMuCi0JKiB3cml0ZS5jIChkdW1wX3NlY3Rpb25fcmVsb2NzKTogTGlrZXdpc2UuCi0JKiB3cml0ZS5oOiBVc2UgZXh0ZXJuIGZvciBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0JKHdyaXRlX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCSogY29uZmlnL2UtbWlwc2Vjb2ZmLmMgKG1pcHNlY29mZl9iZmRfbmFtZSk6IFJldHVybiBOVUxMIHRvIGF2b2lkCi0Jd2FybmluZy4KLQkqIGNvbmZpZy9lLW1pcHNlbGYuYyAobWlwc2VsZl9iZmRfbmFtZSk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1lbGYuaCAoZWxmX2Vjb2ZmX3NldF9leHQpOiBEZWNsYXJlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogSWYgT0JKX0VMRiwgYWx3YXlzCi0JZW1pdCByZWxvY2F0aW9ucyBhZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jICh0Y19nZW5fcmVsb2MpOiBPdXRwdXQgYSBzZW5zaWJsZSBlcnJvcgotIAltZXNzYWdlIGlmIGJmZF9yZWxvY190eXBlX2xvb2t1cCBmYWlscywgcmF0aGVyIHRoYW4gY2FsbGluZwotIAlhc3NlcnQuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9mb3JjZV9yZWxvY2F0aW9uKTogQWRkCi0JQkZEX1JFTE9DXzEyX1BDUkVMIHRvIHN3aXRjaC4KLQotVHVlIEp1biAxOCAyMDoyOTo1NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChMT0NBTF9MQUJFTCxGQUtFX0xBQkVMX05BTUUpOiBVc2UgZGVmYXVsdHMgZm9yCi0JVEVfUEUgKExmb28sIG5vdCAuTGZvbykuCi0KLVR1ZSBKdW4gMTggMTc6MTM6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfZmlsbCk6IERvbid0IHdhcm4gYWJvdXQgYSB6ZXJvIHJlcGVhdCBjb3VudC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IHdhcm4gYWJvdXQgdXNpbmcgQVQgYXMgYQotCWNvcHJvY2Vzc29yIHJlZ2lzdGVyLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFdoZW4gY2hlY2tpbmcgdGhlIHNpemUgb2YgYQotCXJlZ2lzdGVyIHRvIHNldCB0aGUgc2l6ZSBvZiBhbiBpbnN0cnVjdGlvbiwgZG8gYSBiaXR3aXNlIGFuZCB3aXRoCi0JUmVnOCBhbmQgUmVnMTYgcmF0aGVyIHRoYW4gcmVxdWlyaW5nIHRoZSB0eXBlIHRvIGJlIGV4YWN0bHkgUmVnOAotCW9yIFJlZzE2LgotCi1UdWUgSnVuIDE4IDEzOjE5OjUxIDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAocGFyc2VfcmVnKTogVHdlYWsgZXJyb3IgbWVzc2FnZXMuCi0JKGJ1aWxkX2J5dGVzKTogTGlrZXdpc2UuCi0JKHNraXBfY29sb250aGluZyk6IEhhbmRsZSA6MzIgc3VmZml4LgotCShnZXRfc3BlY2lmaWMpOiBQcm9tb3RlIExfMjQgdG8gTF8zMiBpZiBpdCBtYWtlcyBhIG1hdGNoLgotCURvbid0IGFsd2F5cyBwcm9tb3RlIExfOCB0byBMXzE2LgotCShkb19hX2ZpeF9pbW0pOiBDbGVhbiB1cCBMXzMyIGFuZCBMXzI0IGhhbmRsaW5nLgotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoU21vZGUpOiBOZXcgdmFyaWFibGUuCi0JKGg4MzAwaG1vZGUpOiBUdXJuIG9mZiBIbW9kZS4KLQkoaDgzMDBzbW9kZSk6IE5ldyBmdW5jdGlvbi4gIFR1cm4gb24gU21vZGUgYW5kIEhtb2RlLgotCShtZF9wc2V1ZG9fdGFibGUpOiBOZXcgIi5oODMwMHMiIHBzZXVkby1vcC4KLQkocGFyc2VfcmVnKTogSGFuZGxlICJleHIiIHJlZ2lzdGVyLgotCShnZXRfb3BlcmFuZCk6IEhhbmRsZSBiaXphcnJlIHN5bnRheCBmb3IgInN0bS5sIiBhbmQgImxkbS5sIi4KLQlIYW5kbGUgIm1hY2giIGFuZCAibWFjaGwiIG9wZXJhbmRzIGZvciBsZG1hYy4KLQkoZ2V0X3NwZWNpZmljKTogSGFuZGxlICJzdG0ubCIgYW5kICJsZG0ubCIuCi0JKGJ1aWxkX2J5dGVzKTogSGFuZGxlICJzdG0ubCIgYW5kICJsZG0ubCI7IGhhbmRsZSBNQUNSRUcgb3BlcmFuZHMuCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoQ09GRl9NQUdJQyk6IEhhbmRsZSBIOC9TIG1hZ2ljIG51bWJlci4KLQkoU21vZGUpOiBEZWNsYXJlLgotCi1Nb24gSnVuIDE3IDE1OjUwOjUzIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IFJlb3JkZXIgY2hhcHRlciBvZiBtYWNoaW5lIGRlcGVuZGVudCBvcHRpb25zIHNvCi0gCXRoYXQgaXQgaXMgc29ydGVkIGJ5IGNoaXAgbmFtZS4gIAotCi0JKiBkb2MvYXMudGV4aW5mbzogVXNlIGNvbnNpc3RhbnQgc3BlbGxpbmcgb2YgVmF4LgotCSogZG9jL2MtdmF4LnRleGk6IExpa2V3aXNlLgotCi1Nb24gSnVuIDE3IDExOjI2OjU2IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgIi5iZWdpbl90cnkiIGFuZCAiLmVuZF90cnkiCi0JcHNldWRvIG9wcy4KLQkodGNfZ2VuX3JlbG9jLCBTT00gdmVyc2lvbik6IEhhbmRsZSBSX0JFR0lOX1RSWSBhbmQgUl9FTkRfVFJZLgotCShtZF9hcHBseV9maXgpOiBMaWtld2lzZS4KLQkocGFfdHJ5KTogTmV3IGZ1bmN0aW9uLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSByZWxvY3MgZm9yIEJFR0lOX1RSWSBhbmQgRU5EX1RSWS4KLQotU3VuIEp1biAxNiAyMjo1Nzo0NyAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICIubGV2ZWwiIHBzZXVkbyBvcC4KLQkocGFfbGV2ZWwpOiBOZXcgZnVuY3Rpb24uCi0KLUZyaSBKdW4gMTQgMjA6MDY6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IERvbid0IGRvIGFueXRoaW5nIGlmIGxpc3RpbmcgaXMgMC4KLQotVGh1IEp1biAxMyAxNzo1MDo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBJZiBzeW1ib2xfdGFibGVfZnJvemVuIGlzIHNldCwgY2FsbAotCXN5bWJvbF9jcmVhdGUsIG5vdCBzeW1ib2xfbmV3LgotCi1XZWQgSnVuIDEyIDE0OjEwOjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBEb24ndCBzZXQgc3lfdXNlZF9pbl9yZWxvYyBmb3IgYW4KLQlhYnNvbHV0ZSBzeW1ib2wgdW5sZXNzIFRDX0ZPUkNFX1JFTE9DQVRJT04gcmV0dXJucyB0cnVlLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAocHJldmlvdXNfZmlsZV9zeW1ib2wpOiBSZW1vdmUgQkZEX0FTU0VNQkxFUgotCXZlcnNpb24uCi0JKGNfZG90X2ZpbGVfc3ltYm9sKTogQkZEX0FTU0VNQkxFUiB2ZXJzaW9uOiBEb24ndCBzZXQgdGhlIHZhbHVlIG9mCi0JdGhlIHN5bWJvbCB0byBhIHBvaW50ZXIuICBEb24ndCBzZXQgcHJldmlvdXNfZmlsZV9zeW1ib2wuCi0JU2ltcGxpZnkgc3ltYm9sIGxpc3QgcmVhcnJhbmdlbWVudC4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IERvbid0IGRvIGFueXRoaW5nIHdpdGggQ19GSUxFIHN5bWJvbHMuCi0JKGNvZmZfYWRqdXN0X3N5bXRhYik6IERvbid0IGNoZWNrIHByZXZpb3VzX2ZpbGVfc3ltYm9sLgotCi1Nb24gSnVuIDEwIDE0OjUyOjI5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX2xjb21tKTogTmV3IGZ1bmN0aW9uIGZvciAubGNvbW0KLQlkaXJlY3RpdmUuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBwcGNfZWxmX2xjb21tLgotCi1Nb24gSnVuIDEwIDExOjQ1OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEFjY2VwdCBBQlNMIGZvciAnTycsIHNvIHRoYXQgYGJmZXh0dQotCWQwezI0OjF9LGQwJyB3b3JrcyB3aXRob3V0IGFuIGltbWVkaWF0ZSBwcmVmaXggb24gdGhlIGJpdCBudW1iZXJzLgotCShtZF9iZWdpbik6IEFkZCBkaWdpdHMgdG8gYWx0X25vdGVuZF90YWJsZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTWFrZSBzIGEgY29uc3QgcG9pbnRlci4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiZW1wdHkiLgotCShzX2VtcHR5KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHN0cnVjdCBmaWxlbmFtZV9saXN0KTogT25seSBkZWZpbmUgaWYgbm90Ci0JQkZEX0FTU0VNQkxFUi4KLQkoZmlsZW5hbWVfbGlzdF9oZWFkLCBmaWxlbmFtZV9saXN0X3RhaWwpOiBMaWtld2lzZS4KLQkoY19zZWN0aW9uX3N5bWJvbCk6IFJlbW92ZSB1bnVzZWQgQkZEX0FTU0VNQkxFUiB2ZXJzaW9uLgotCShvYmpfY29mZl9lbmRlZiwgQkZEX0FTU0VNQkxFUiB2ZXJzaW9uKTogRG9uJ3Qgc2V0IHRoZSBkZWJ1Z2dpbmcKLQlmbGFnIGZvciBDX01PUywgQ19NT0UsIENfTU9VLCBvciBDX0VPUyBzeW1ib2xzLCBzaW5jZSB0aGV5IHNob3VsZAotCWhhdmUgYSBzZWN0aW9uIG9mIE5fQUJTIHJhdGhlciB0aGFuIE5fREVCVUcuICBJZiB3ZSBkbyBhIG1lcmdlLAotCXJlbW92ZSB0aGUgbmV3IHN5bWJvbCBmcm9tIHRoZSBsaXN0LgotIAkob2JqX2NvZmZfZW5kZWYsIGJvdGggdmVyc2lvbnMpOiBDYWxsIHRhZ19pbnNlcnQgZXZlbiBpZiB0aGVyZSBpcwotCWFuIG9sZCBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lLCBpZiB0aGUgb2xkIHN5bWJvbCBkb2VzIG5vdAotCWhhcHBlbiB0byBiZSBhIHRhZy4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IENoZWNrIFNGX0dFVF9UQUcsIENfRU9GLCBhbmQgQ19GSUxFIG91dHNpZGUgb2YKLQl0aGUgU0ZfR0VUX0RFQlVHIGNvbmRpdGlvbi4gIERvbid0IGNhbGwgU0FfU0VUX1NZTV9FTkRORFggd2l0aCBhCi0Jc3ltYm9sIHRoYXQgd2lsbCBiZSBtb3ZlZCB0byB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgbGlzdC4KLQkoY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zKTogQWx3YXlzIGNhbGwgc2VjdGlvbl9zeW1ib2wgZm9yIC50ZXh0LAotCS5kYXRhLCBhbmQgLmJzcy4KLQkoY29mZl9mcm9iX3NlY3Rpb24pOiBMaWtld2lzZS4gIEFsc28sIHJlbW92ZSB1bnVzZWQgdmFyaWFibGUKLQlzdHJuYW1lLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoY29udmVydF9paWYpOiBDYWxsIGZyYWdfZ3JvdyByYXRoZXIgdGhhbgotCW1hbmlwdWxhdGluZyBmcmFncyBkaXJlY3RseS4KLQkobWRfbnVtYmVyX3RvX2ZpZWxkKTogQWRqdXN0IG1lbV9wdHIgY29ycmVjdGx5IGlmIEVORElBTiBpcwotCWRlZmluZWQuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IElmICcvJyBpcyBMSU5FX0NPTU1FTlRfU1RBUlQsIGNoZWNrCi0gCXdoZXRoZXIgdGhlIG5leHQgY2hhcmFjdGVyIGlzICcqJyBiZWZvcmUgY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUKLQlhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLiAgUGVybWl0IExJTkVfQ09NTUVOVF9TVEFSVCB0byBzdGFydCBhCi0JY29tbWVudCBpbiBzdGF0ZSAxIChzZWVuIHNvbWUgd2hpdGVzcGFjZSkgYXMgd2VsbCwgdG8gbWF0Y2ggdGhlCi0JZG9jdW1lbnRhdGlvbi4KLQotCSogZ2FzcC5jIChkb19hbGlnbik6IFBlcm1pdCBhIGZpbGwgdmFsdWUgZm9yIC5hbGlnbi4KLQotV2VkIEp1biAgNSAxNzowOToyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAobmV4dF9jaGFyX29mX3N0cmluZyk6IFdhcm4gaWYgYSBuZXdsaW5lIGlzIHNlZW4gaW4gdGhlCi0JbWlkZGxlIG9mIGEgc3RyaW5nLiAgQ2FsbCBidW1wX2xpbmVfY291bnRlcnMgd2hlbiBhcHByb3ByaWF0ZS4KLQotV2VkIEp1biAgNSAxNzowODozNiAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogc3ltYm9scy5jIChjb2xvbik6IFVzZSBMT0NBTF9MQUJFTC4KLQotVHVlIEp1biAgNCAxMDo1NToxNiAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNzazMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBjaGVjayB0byBzZWUgaWYgdG9vbGRpciBleGlzdHMuCi0JTWFrZSAkKHRvb2xkaXIpIGFuZCAkKHRvb2xkaXIpL2Jpbi4KLQotVHVlIEp1biAgNCAxMDoxNDo1MyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9wcGMtc29sLm10IChUREVGSU5FUyk6IERvbid0IHR1cm4gb24gLW1yZWduYW1lcyBieQotCWRlZmF1bHQuCi0KLU1vbiBKdW4gIDMgMTE6MzQ6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRG9uJ3QgY2FsbCBhc193YXJuIGlmIHdlIGFyZSBzZXR0aW5nCi0JaW5zbl9lcnJvci4gIERvbid0IHB1dCB0aGUgc3RyaW5nICJFUlJPUiIgaW4gaW5zbl9lcnJvci4gIFNldAotCWluc25fZXJyb3IgcmF0aGVyIHRoYW4gY2FsbGluZyBhc193YXJuIGZvciBhbiB1bnN1cHBvcnRlZCBvcGNvZGUuCi0KLVNhdCBKdW4gIDEgMjE6NTE6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wYXJzZV9vcHRpb24pOiBDaGVjayBmb3IgYSA2NCBiaXQgZm9ybWF0Ci0JYmVmb3JlIHBlcm1pdHRpbmcgLTY0LgotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogUmVtb3ZlIGR1cGxpY2F0ZQotCWJmZF9wZXJyb3IuCi0KLUZyaSBNYXkgMzEgMDE6MDg6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IElmIC02NCwgY3JlYXRlIGEgLk1JUFMub3B0aW9ucwotCXNlY3Rpb24gcmF0aGVyIHRoYW4gYSAucmVnaW5mbyBzZWN0aW9uLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogSWYgLTY0LCB3cml0ZSBvdXQgNjQgYml0IFJlZ0luZm8KLQlpbmZvcm1hdGlvbi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IElmIG1pcHNfaXNhIDwgMywgcGVybWl0IGEgMzIKLQliaXQgdmFsdWUgd2l0aCB0aGUgaGlnaCBiaXQgc2V0LgotCi1UaHUgTWF5IDMwIDE5OjAwOjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2xjb21tKTogU2V0IHNlY3Rpb24gZmxhZ3MgZm9yIC5zYnNzIHNlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfNjQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtaXBzX3RhcmdldF9mb3JtYXQpOiBJZiBtaXBzXzY0LCByZXR1cm4gZWxmNjQgdGFyZ2V0cyByYXRoZXIgdGhhbgotCWVsZjMyIG9uZXMuCi0JKG1kX2xvbmdvcHRzKTogQWRkICIzMiIgYW5kICI2NCIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAtMzIgYW5kIC02NC4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLTMyIGFuZCAtNjQuCi0JKGNvbnNfZml4X25ld19taXBzKTogSWYgbWlwc182NCwgZG9uJ3QgY29udmVydCBhbiA4IGJ5dGUgcmVsb2MgdG8KLQlhIDQgYnl0ZSBvbmUuCi0KLVRodSBNYXkgMzAgMTA6MzY6MTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKGNvbW1lbnRfY2hhcnMpOiBNYWtlICchJyBhIGNvbW1lbnQgY2hhcmFjdGVyCi0JZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eS4KLQotCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBVbmRlciBQb3dlclBDIFNvbGFyaXMsIGNvbnZlcnQgYQotCS5zdGFiZCB3aXRoIDQgYXJndW1lbnRzIGludG8gYSAuc3RhYm4uCi0KLVdlZCBNYXkgMjkgMTY6NDM6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFdoZW4gcGFzc2luZyBYX2FkZF9udW1iZXIgdG8KLQltYWNyb19idWlsZCwgY2FzdCBpdCB0byBpbnQgZmlyc3QuCi0KLVR1ZSBNYXkgMjggMTM6Mjk6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtejhrLmMgKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBmeF9yX3R5cGUgb2YgMCwgYXMKLQljcmVhdGVkIGJ5IGVtaXRfZXhwci4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfY3JlYXRlKTogSWYgYmZkX21ha2VfZW1wdHlfc3ltYm9sIGZhaWxzLCBjYWxsCi0JYXNfcGVycm9yIHJhdGhlciB0aGFuIGFzc2VydC4KLQotRnJpIE1heSAyNCAxODoyNDoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBNYXJrIHNlY3Rpb25zIGNyZWF0ZWQgdG8gaG9sZAotCWZsb2F0aW5nIHBvaW50IGluZm9ybWF0aW9uIGFzIHJlYWQgb25seS4KLQotRnJpIE1heSAyNCAxMjowNzo1NCAxOTk2ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfc2V0X2NwdSk6IENoYW5nZSBkZWZhdWx0cyB0byBtYXRjaCBBSVguCi0KLVRodSBNYXkgMjMgMTc6MzQ6MjQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgLnNraXAgYXMgYSBzeW5vbnltIGZvciAuc3BhY2UuCi0KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogRm9yIFBvd2VyUEMgRUxGLCBhbGxvdyAuc3RhYmQgdG8gdGFrZQotCTQgYXJndW1lbnRzLCBwcm92aWRpbmcgdGhlIDR0aCBhcmd1bWVudCBpcyAwLCB0byBhbGxvdwotCWNvbXBhdGliaWxpdHkgd2l0aCB0aGUgU29sYXJpcyBhc3NlbWJsZXIuCi0KLVRodSBNYXkgMTYgMTU6NTE6NDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guaCAoc3RydWN0IHNoX3NlZ21lbnRfaW5mb190eXBlKTogRGVmaW5lLgotCShUQ19TRUdNRU5UX0lORk9fVFlQRSk6IERlZmluZS4KLQkoc2hfZnJvYl9sYWJlbCk6IERlY2xhcmUuCi0JKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUuCi0JKHNoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVjbGFyZS4KLQkobWRfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXNzZW1ibGUpOiBJZiByZWxheGluZywgZW1pdCBhIFJfU0hfQ09ERQotIAlyZWxvYyBiZWZvcmUgdGhlIGluc3RydWN0aW9uIGlmIG5lY2Vzc2FyeS4KLQkoc2hfZnJvYl9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQkoc2hfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBOZXcgZnVuY3Rpb24uCi0JKHNoX2NvZmZfZnJvYl9maWxlKTogSWdub3JlIEFMSUdOLCBDT0RFLCBEQVRBLCBhbmQgTEFCRUwgcmVsb2NzCi0Jd2hlbiBsb29raW5nIGZvciB0aGUgcmVsb2MgZm9yIHRoZSB0YXJnZXQgb2YgLnVzZXMuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IEZpeCBwcmludGYgZm9ybWF0ICglMHhseCB0byAweCVseCkuCi0JKHNoX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSBDT0RFLCBEQVRBLCBhbmQgTEFCRUwgcmVsb2NzIHRvIGJlCi0JZW1pdHRlZC4KLQkobWRfYXBwbHlfZml4KTogSWdub3JlIENPREUsIERBVEEsIGFuZCBMQUJFTCByZWxvY3MuCi0JKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogRm9yY2UgQ09ERSwgREFUQSwgYW5kIExBQkVMIHJlbG9jcyB0byB1c2UKLQl0aGUgYWJzb2x1dGUgc3ltYm9sLgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogQWRkIHRjX3NlZ21lbnRfaW5mb19kYXRhIGZpZWxkIGlmCi0JVENfU0VHTUVOVF9JTkZPX1RZUEUgaXMgZGVmaW5lZC4KLQotV2VkIE1heSAxNSAxMjoyMzo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogTWFrZSBzdXJlIHRoZSBvcGNvZGUgc3VmZml4Ci0JbWF0Y2hlcyB0aGUgcmVnaXN0ZXIgc2l6ZS4KLQotV2VkIE1heSAxNSAwODozMzozNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb3VudF9lbnRyaWVzX2luX2NoYWluKTogSWdub3JlIEZpeHVwcyB3aXRoCi0JZnhfZG9uZSBzZXQuIAotCShkb19yZWxvY3NfZm9yKTogTGlrZXdpc2UuCi0JKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBqdXN0IHF1aXQgaWYgbGlua3JlbGF4IGlzIHNldC4gIFRyeSB0bwotCWFwcGx5IG5vbiBwYy1yZWxhdGl2ZSBzeW0xLXN5bTIgZml4dXBzLCBldmVuIGlmIGxpbmtyZWxheCBpcwotCW5vbnplcm8uCi0KLUZyaSBNYXkgMTAgMTQ6MTY6NTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWxsb3cgR09UIGFuZCBzZWN0aW9uCi0JcmVsYXRpdmUgcmVsb2NhdGlvbnMgd2l0aCAtbXJlbG9jYXRhYmxlLiAgQWxzbyBhbGxvdyB1bmZpeGVkCi0JcmVsb2NzIGluIC5leF9zaGFyZWQuCi0KLVR1ZSBNYXkgIDcgMTE6MjQ6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoeWFua19zeW1ib2xzKTogQ2hlY2sgdGhhdCBGTkFNRV9PRkZTRVQgaXMKLQlub24temVybyBiZWZvcmUgYXNzdW1pbmcgdGhpcyBpcyBhIGxvbmcgZmlsZSBuYW1lLgotCSh3X3N0cmluZ3MpOiBMaWtld2lzZS4KLQkoY19kb3RfZmlsZV9zeW1ib2wpOiBTZXQgRk5BTUVfT0ZGU0VUIHRvIDEgZm9yIGEgbG9uZyBmaWxlIG5hbWUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3X3N0cmluZ3MpOiBNb3ZlIGRlY2xhcmF0aW9uIG9mIGkgaW5zaWRlCi0JI2lmZGVmIGJsb2NrIHdoaWNoIHVzZXMgaXQuCi0KLVR1ZSBNYXkgIDcgMDA6NDk6NTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZG9fYV9maXhfaW1tKTogUmVuYW1lIGxhc3QgYXJndW1lbnQgdG8KLQkicmVsYXhtb2RlIi4gIE91dHB1dCByZWxvY3Mgd2hpY2ggaWRlbnRpZnkgdmFyaW91cyByZWxheGluZwotCXBvc3NpYmlsaXRpZXMgZm9yIG1vdi5bYndsXSBpbnN0cnVjdGlvbnMuCi0JKGJ1aWxkX2J5dGVzKTogUGFzcyBpbiBhIHJlbGF4aW5nIG1vZGUgdG8gZG9fYV9maXhfaW1tLgotCi1Nb24gTWF5ICA2IDE1OjI2OjI4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaCAoVENfSEFORExFU19GWF9ET05FKTogRGVmaW5lLgotCShNRF9BUFBMWV9GSVgzKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWFybS5jIChteV9nZXRfZXhwcmVzc2lvbik6IE9ubHkgd2F0Y2ggZm9yIGJhZCBzZWdtZW50cwotCWlmIE9CSl9BT1VULgotCShtZF9hcHBseV9maXgzKTogUmVuYW1lZCBmcm9tIG1kX2FwcGx5X2ZpeC4KLQlJZiBwY3JlbCByZWxvYyBhbmQgc3ltYm9sIGlzIGluIGRpZmZlcmVudCBzZWN0aW9uLCB1bmRvIGVmZmVjdHMKLQlvZiBtZF9wY3JlbF9mcm9tLgotCi1TYXQgTWF5ICA0IDEyOjQ5OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdAotCWFueSByZWxvYyB3aXRoIGFuIExSJSBvciBSUiUgZmllbGQgc2VsZWN0b3IgZm9yIFNPTS4KLQotU2F0IE1heSAgNCAxMToyNjoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgc3Vic2Vncy5oIHRvIGFwcHJvcHJpYXRlIFRBUkdfQ1BVX0RFUF8qCi0gCXZhcmlhYmxlcy4KLQotRnJpIE1heSAgMyAxNzo1ODozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgbWVyZ2UgYSBzeW1ib2wgd2l0aAotCVNGX0dFVF9TVEFUSUNTIHNldC4KLQkoeWFua19zeW1ib2xzKTogTGlrZXdpc2UuCi0KLVdlZCBNYXkgIDEgMTM6Mzg6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogSWYgTUFOWV9TRUdNRU5UUyBhbmQgbm90Ci0JQkZEX0FTU0VNQkxFUiwgYWRkIG5hbWUgZmllbGQuCi0JKiBjb25maWcvb2JqLWNvZmYuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotCShjb2ZmX2hlYWRlcl9hcHBlbmQpOiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLgotCShjcmF3bF9zeW1ib2xzKTogSnVzdCB1c2UgdGhlIG5hbWUgZmllbGQgZm9yIHRoZSBzeW1ib2wgbmFtZSwKLQl3aXRob3V0IHdvcnJ5aW5nIGFib3V0IG51bGwgYnl0ZSB0ZXJtaW5hdGlvbi4KLQkod19zdHJpbmdzKTogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBMaWtld2lzZS4gIEFsc28sIHVzZSB0aGUgbmFtZSBmaWVsZCwgcmF0aGVyCi0JdGhhbiBzY25oZHIuc19uYW1lLgotCShvYmpfY29mZl9hZGRfc2VnbWVudCk6IFBlcm1pdCBsb25nIHNlY3Rpb24gbmFtZXMuCi0JKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogVXNlIHRoZSBuYW1lIGZpZWxkLCByYXRoZXIgdGhhbgotCXNjbmhkci5zX25hbWUuCi0JKGFkanVzdF9zdGFiX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90ZS1wZS5oIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAoYnJ0YWJfZW1pdCk6IERvbid0IHNldCBmeF9pbV9kaXNwIGZpZWxkLgotCShtZW1fZm10KTogTGlrZXdpc2UuCi0JKG1kX2FwcGx5X2ZpeCk6IERvbid0IGNoZWNrIGZ4X2ltX2Rpc3AgZmllbGQuCi0KLVRodSBBcHIgMjUgMTE6Mzk6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCAqIGFmdGVyIHNwYXJjKi0qLXZ4d29ya3MuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IElmIHRjX2NvbW1lbnRfY2hhcnMgaXMgbm90IGRlZmluZWQsCi0JZGVmaW5lIGl0IHRvIGNvbW1lbnRfY2hhcnMuICBVc2UgdGNfY29tbWVudF9jaGFycyByYXRoZXIgdGhhbgotCWNvbW1lbnRfY2hhcnMuCi0JKGRvX3NjcnViX2NoYXJzKTogVXNlIHRjX2NvbW1lbnRfY2hhcnMgcmF0aGVyIHRoYW4gY29tbWVudF9jaGFycy4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKHRjX2NvbW1lbnRfY2hhcnMpOiBEZWZpbmUuCi0JKG02OGtfY29tbWVudF9jaGFycyk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2NvbW1lbnRfY2hhcnMpOiBSZW5hbWUgZnJvbQotCWNvbW1lbnRfY2hhcnMuICBDaGFuZ2UgaW50byBhIHBvaW50ZXIgcmF0aGVyIHRoYW4gYW4gYXJyYXkuCi0JKG1kX2xvbmdvcHRzKTogQWRkICJiaXR3aXNlLW9yIi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIE9QVElPTl9CSVRXSVNFX09SLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtLWJpdHdpc2Utb3IuCi0JKiBkb2MvYy1tNjhrLnRleGk6IERvY3VtZW50IC0tYml0d2lzZS1vci4KLQotV2VkIEFwciAyNCAxMToyODozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBQcmV2ZW50IGF0dGVtcHRzIHRvIHVzZSBsb25nIG9mZnNldHMKLSAJaW4gNjgwMDAgbW9kZS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBCRkRfQVNTRU1CTEVSIHZlcnNpb246Ci0JY2FsbCBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLiAgTm9uIEJGRF9BU1NFTUJMRVIgdmVyc2lvbjoKLQljb3JyZWN0IGhhbmRsaW5nIG9mIGlucHV0IGxpbmUgcG9pbnRlciwgYW5kIGNhbGwKLQlkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLgotCi1Nb24gQXByIDIyIDE4OjAyOjM3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAYmx1ZXMuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGluX2JpdGZpZWxkX3JhbmdlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3BhcmNfaXApOiBOZXcgY2FzZXMgWCxZLiAgVXNlIFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AuCi0JKG1kX2FwcGx5X2ZpeCwgY2FzZXMgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLAotCUJGRF9SRUxPQ19TUEFSQ197V0RJU1AxNixXRElTUDE5fSk6IEZpeCB1bmRlZmluZWQgY29kZS4KLQkobWRfYXBwbHlfZml4KTogTmV3IGNhc2VzIEJGRF9SRUxPQ19TUEFSQ19bNTZdLgotCSh0Y19nZW5fcmVsb2MpOiBOZXcgY2FzZXMgQkZEX1JFTE9DX1NQQVJDX1s1Nl0uCi0KLVRodSBBcHIgMTggMTg6NTg6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYzogQkZEX0FTU0VNQkxFUjoKLSAJKGNvZmZfbGFzdF9iZik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBTZXQgZW5kbmR4IG9mIGEgLmJmIHN5bWJvbC4KLQlOb24gQkZEX0FTU0VNQkxFUjoKLQkob2JqX2NvZmZfZW5kZWYpOiBDYWxsIFNGX1NFVF9QUk9DRVNTIG9uIGEgLmJmIHN5bWJvbC4KLQkobGFzdF9iZlApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCSh5YW5rX3N5bWJvbHMpOiBTZXQgZW5kbmR4IG9mIGEgLmJmIHN5bWJvbC4KLQotVGh1IEFwciAxOCAxMTo1Mzo1OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIFNvbGFyaXMncyAtbGUKLQlhbmQgLXMgb3B0aW9ucy4gIEFkZCAtYmUgZm9yIGdvb2QgbWVhc3VyZS4KLQotV2VkIEFwciAxNyAxMjozMTowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19zcGFjZSk6IFN1cHBvcnQgbm9uLWNvbnN0YW50IGZpbGwgdmFsdWUuICBIYW5kbGUgZmlsbAotCXZhbHVlIGNvcnJlY3RseSBmb3IgYSBzaXplIG90aGVyIHRoYW4gMS4KLQotVHVlIEFwciAxNiAxNToxNzo0MCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG15X2dldF9mbG9hdF9leHByZXNzaW9uKTogVXBkYXRlIGNhbGwgdG8KLQlnZW5fdG9fd29yZHMsIFhfUFJFQ0lTSU9OIGNoYW5nZWQgZnJvbSA2IHRvIDUuCi0KLVR1ZSBBcHIgMTYgMTA6MjU6NDIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHJlZ2lzdGVyX25hbWUscmVnX25hbWVfc2VhcmNoKTogTW92ZSByZWdpc3RlcgotCW5hbWUgbG9va3VwIGZyb20gUEUgc3BlY2lmaWMgY29kZSB0byBhbGwgdGFyZ2V0cy4gIEFkZCBzdXBwb3J0IGZvcgotCS1tcmVnbmFtZXMvLW1uby1yZWduYW1lcyB0byBjb250cm9sIHdoZXRoZXIgcmVnaXN0ZXIgbmFtZXMgYXJlCi0JZXhwYW5kZWQgb3Igbm90LgotCShtZF9hc3NlbWJsZSk6IENhbGwgcmVnaXN0ZXJfbmFtZSBmb3IgYWxsIHBsYXRmb3Jtcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIC1tcmVnbmFtZXMvLW1uby1yZWduYW1lcy4KLQotCSogY29uZmlndXJlLmluIChwb3dlcnBjbGUqLSotc29sYXJpcyk6IEFkZCBzdXBwb3J0LgotCShwb3dlcnBjKi0qLWxpbnV4KTogRGl0dG8uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLQkqIGNvbmZpZy9wcGMtc29sLm10OiBOZXcgY29uZmlnIGZpbGUgZm9yIFBvd2VyUEMgU29sYXJpcy4KLQotTW9uIEFwciAxNSAxMjoyNjozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZnJvYl9maWxlKTogUGVybWl0IG11bHRpcGxlICVoaSByZWxvY3MgdG8KLQliZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgJWxvIHJlbG9jLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX2FkZHJlc3MpOiBDYXN0IFhfYWRkX251bWJlciB0byB2YWx1ZVQKLQliZWZvcmUgY29tcGFyaW5nIGFnYWluc3QgTUFYX0dQUkVMX09GRlNFVCwgc28gdGhhdCBuZWdhdGl2ZQotCW51bWJlcnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgotCShtYWNybyk6IExpa2V3aXNlLgotCi1UaHUgQXByIDExIDEyOjM5OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGxhc3RfaW5zbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2Fzc2VtYmxlKTogV2FybiBhYm91dCBwdXR0aW5nIGZsb2F0aW5nIHBvaW50IGJyYW5jaGVzIGluIGEKLQlkZWxheSBzbG90LiAgSWYgYXJjaGl0ZWN0dXJlIGlzIGxlc3MgdGhhbiB2OSwgaW5zZXJ0IE5PUAotCWluc3RydWN0aW9ucyBiZXR3ZWVuIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyBhbmQgZmxvYXRpbmcKLQlwb2ludCBicmFuY2hlcy4gIChUaGUgU3VuT1MgYXNzZW1ibGVyIGRvZXMgYm90aCB0aGVzZSBvcGVyYXRpb25zLikKLQlTYXZlIHRoZSBsYXN0IGluc3RydWN0aW9uIG9wY29kZS4KLQkoc3BhcmNfaXApOiBBZGQgcGluc24gcGFyYW1ldGVyLiAgQ2hhbmdlIGNhbGxlci4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBDb3JyZWN0IGNoZWNrCi0JZm9yIGJ5dGUganVtcCB0byBuZXh0IGluc3RydWN0aW9uIHRvIHNraXAgZW1wdHkgZnJhZ3MuCi0KLVdlZCBBcHIgMTAgMTY6NDg6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfaXApOiBJZiB3ZSBhcmUgZ29pbmcgdG8gY2FsbCBlbWl0X2FkZDY0Ci0JZm9yIGFkZHEgd2l0aCBhIDE2IGJpdCBzaWduZWQgdmFsdWUsIGp1c3QgZW1pdCBhIGxkYSBpbnN0cnVjdGlvbgotCWluc3RlYWQuCi0KLVdlZCBBcHIgMTAgMTQ6MzQ6NDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZG9fYV9maXhfaW1tKTogRG9uJ3QgY3V0IG9mZiBoaWdoIGJpdHMKLQlvZiBhIDMyYml0IG9wZXJhbmQuCi0KLU1vbiBBcHIgIDggMTQ6NDI6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEFwciAgNSAxNzowMTozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChnZXRfc3BlY2lmaWMpOiBSZW1vdmUgc29tZSAjaWYgMCBjb2RlLgotCShidWlsZF9ieXRlcyk6IFJlbW92ZSBhbGwgQUJTTU9WIHJlbGF0ZWQgY29kZTsgaXQncyB1bm5lY2Vzc2FyeS4KLQotRnJpIEFwciAgNSAxNToxMzoxMCAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jOiBGaXggaGFuZGxpbmcgb2YgZGVub3JtYWxpemVkIGV4dGVuZGVkCi0JcHJlY2lzaW9uIG51bWJlcnMgYW5kIG92ZXJmbG93L3VuZGVyZmxvdyBkZXRlY3Rpb24uCi0JKE1BWF9QUkVDSVNJT04sIFhfUFJFQ0lTSU9OLCBQX1BSRUNJU0lPTik6IENoYW5nZWQgZnJvbSA2IHRvIDUsIHRvCi0Jbm90IGluY2x1ZGUgdGhlIDE2IGJpdCBnYXAgaW4gdGhlIG02OGsgZXh0ZW5kZWQgcHJlY2lzaW9uIGZvcm1hdC4KLQotRnJpIEFwciAgNSAxNDoyOToyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGkzODYtKi1mcmVlYnNkZWxmKiB0YXJnZXQ7IGZyb20gSm9obiBQb2xzdHJhCi0JPGpkcEBwb2xzdHJhLmNvbT4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgIDUgMTg6Mzk6MjggMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBBbGxvdyBub24temVybyBvZmZzZXRzIGZyb20gLnNkYXRhIHN5bWJvbHMgdG8KLSAJYmUgYWNjZXNzZWQgdXNpbmcgdGhlICRncCByZWdpc3Rlci4KLQkqIGNvbmZpZy90Yy1taXBzLmggKE1BWF9HUFJFTF9PRkZTRVQpOiBBZGRlZC4KLQotV2VkIEFwciAgMyAxMDo1NjoxNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfbWRfZW5kKTogU2V0IGJmZCBtYWNoaW5lIG51bWJlciB0bwotCWJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0IGlmIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIGlzIHNwYXJjbGV0LgotCi1Nb24gQXByICAxIDE2OjU1OjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChnZXRfbGluZV9zYik6IEJ1bXAgbGluZSBjb3VudGVycyBiYXNlZCBvbgotCWlucHV0X2xpbmVfcG9pbnRlclstMV0sIG5vdCAqaW5wdXRfbGluZV9wb2ludGVyLiAgRG9uJ3QgYm90aGVyIHRvCi0JY2FsbCBMSVNUSU5HX05FV0xJTkUuCi0JKHNfbWFjcm8pOiBEb24ndCBjYWxsIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUuCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBXaGVuIGhhbmRsaW5nIEMgc3R5bGUgY29tbWVudHMsIHVuZ2V0Ci0JY2gyIHJhdGhlciB0aGFuIGNoLgotCi1GcmkgTWFyIDI5IDE2OjE1OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5oIChlbnVtIGxpbmtvbmNlX3R5cGUpOiBEZWZpbmUuCi0JKHNfbGlua29uY2UpOiBEZWNsYXJlLgotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkICJsaW5rb25jZSIuCi0JKHNfbGlua29uY2UpOiBOZXcgZnVuY3Rpb24uCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogQWRkIGxpbmtvbmNlIGZpZWxkIHRvCi0JTUFOWV9TRUdNRU5UUyAmJiAhIEJGRF9BU1NFTUJMRVIgc2VjdGlvbi4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfaGFuZGxlX2xpbmtfb25jZSk6IERlZmluZSBpZiBURV9QRS4KLQkob2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSk6IERlY2xhcmUgaWYgVEVfUEUuCi0JKiBjb25maWcvb2JqLWNvZmYuYzogSWYgVEVfUEUgYW5kIG5vdCBCRkRfQVNTRU1CTEVSLCAjaW5jbHVkZQotCSJjb2ZmL3BlLmgiLgotCShvYmpfY29mZl9wZV9oYW5kbGVfbGlua19vbmNlKTogTmV3IGZ1bmN0aW9uLCBkZWZpbmVkIGlmIFRFX1BFLgotCShjX3NlY3Rpb25fc3ltYm9sKTogSWYgVEVfUEUsIHNldCB0aGUgeF9jb21kYXQgZmllbGQgaW4gdGhlIGF1eAotCWVudHJ5IGJhc2VkIG9uIHRoZSBsaW5rb25jZSBmaWVsZCBpbiBzZWdtZW50X2luZm8uCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgLmxpbmtvbmNlLgotCi1GcmkgTWFyIDI5IDExOjMxOjI3IDE5OTYgIEouVC4gQ29ua2xpbiAgKGp0Y0BsaXNhLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy4xOiBDaGFuZ2VkIHRvIGJlIHJlY29nbml6ZWQgYnkgY2F0bWFuIC13IG9uIFNvbGFyaXMuCi0KLVRodSBNYXIgMjggMTU6Mjc6NDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzX3N0YWJfZ2VuZXJpYyk6IENhbGwgdGhlIGxpc3RpbmcgZnVuY3Rpb25zIGJlZm9yZQotCWRvaW5nIHRoZSByZXN0IG9mIHRoZSBwcm9jZXNzaW5nLCB3aGljaCBtYXkgaW52b2x2ZSBmcmVlaW5nIHRoZQotCXN0cmluZy4gIFBhc3Mgc3RyaW5nLCBub3Qgc3RyaW5nICsgc3Ryb2ZmLCB0byBPQkpfUFJPQ0VTU19TVEFCIGluCi0JU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyBjYXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBSZW1vdmUgbmVzdGVkIGNvbW1lbnQuCi0JKHRjX2dlbl9yZWxvYyk6IE1vdmUgbGFiZWwgZG9uZSBpbnNpZGUgdGhlIGlmZGVmIGluIHdoaWNoIGl0IGlzCi0JdXNlZC4KLQkobWRfYXBwbHlfZml4KTogUGFzcyBwb2ludGVycyB0byBjb3JyZWN0IHR5cGVzIHRvIGxpYmhwcGEuaAotCWZ1bmN0aW9ucy4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAodGNfZnJvYl9maWxlKTogRGVmaW5lLgotCShtaXBzX2Zyb2JfZmlsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbWlwcy5jIChzdHJ1Y3QgbWlwc19oaV9maXh1cCk6IERlZmluZS4KLQkobWlwc19oaV9maXh1cF9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoaW1tX3VubWF0Y2hlZF9oaSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2Fzc2VtYmxlKTogQ2xlYXIgaW1tX3JlbG9jLCBpbW1fdW5tYXRjaGVkX2hpLCBhbmQKLQlvZmZzZXRfcmVsb2MuICBQYXNzIGltbV91bm1hdGNoZWRfaGkgdG8gYXBwZW5kX2luc24uCi0JKGFwcGVuZF9pbnNuKTogQWRkIHVubWF0Y2hlZF9oaSBwYXJhbWV0ZXIuICBJZiBpdCBpcyBzZXQsIGFkZCB0aGUKLQluZXcgZml4dXAgdG8gbWlwc19oaV9maXh1cF9saXN0LiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShtaXBzX2lwKTogU2V0IGltbV91bm1hdGNoZWRfaGkgd2hlbiBhcHByb3ByaWF0ZS4KLQkobWlwc19mcm9iX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBNYXIgMjggMTE6NDc6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzcGFyYy0qLXNvbGFyaXMyKik6IFJlbmFtZWQgZnJvbSBzcGFyYyotKi1zb2xhcmlzMiouCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UdWUgTWFyIDI2IDE4OjE5OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuYyAobWFpbik6IENhbGwgYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUuCi0KLUZyaSBNYXIgMjIgMTE6MTM6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5oIChzdHJkdXApOiBEb24ndCBkZWNsYXJlLgotCSogc3RhYnMuYzogSW5jbHVkZSBsaWJpYmVydHkuaAotCShnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogVXNlIHhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgotCShzX3N0YWJfZ2VuZXJpYyk6IExpa2V3aXNlLgotCSogYXMuYyAocGFyc2VfYXJncyk6IExpa2V3aXNlLgotCSogcmVhZC5jIChzX21yaV9zZWN0KTogTGlrZXdpc2UuCi0KLQkqIGdhc3AuYyAoY2hhbmdlX2Jhc2UpOiBSZWNvZ25pemUgXCguLi4pIGNvbnN0cnVjdCBkb2N1bWVudGVkIHRvCi0JcGFzcyB0aHJvdWdoIGVuY2xvc2VkIGNoYXJhY3RlcnMgbGl0ZXJhbGx5IHRocm91Z2ggdG8gdGhlIG91dHB1dC4KLQkocHJvY2Vzc19hc3NpZ25zKTogTGlrZXdpc2UuICBBbHNvLCBiZSBtb3JlIGNhcmVmdWwgdG8gYXZvaWQKLQlsb29raW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgotCi1UaHUgTWFyIDIxIDEzOjE4OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfcGFyc2Vfb3B0aW9uKTogSWYgT0JKX0VMRiwgaWdub3JlIC1rIGZvcgotCUZyZWVCU0QgY29tcGF0aWJpbGl0eS4gIEZyb20gSm9obiBQb2xzdHJhIDxqZHBAcG9sc3RyYS5jb20+LgotCi1XZWQgTWFyIDIwIDE4OjEzOjMyIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBkb2MvYXMudGV4aW5mbywgZG9jL2MtaTk2MC50ZXhpOiBGaXggdHlwb3MuCi0KLVdlZCBNYXIgMjAgMTc6MDU6MTYgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogY29uZmlnL2FscGhhLW9wY29kZS5oOiBBZGRlZCBjdnRzdCBpbnN0cnVjdGlvbi4KLQotTW9uIE1hciAxOCAxMzoxMjo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBEb24ndCB0cnkgdG8gbWFrZSBhIHN5bWJvbCBvdXQgb2YgdGhlIHN0YWIKLQlzdHJpbmcuICBFeHRyYWN0IHRoZSBhZGRlbmQgZnJvbSB0aGUgcmVzdWx0IG9mIGV4cHJlc3Npb24uCi0KLUZyaSBNYXIgMTUgMTc6MTA6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJZiB3aGl0ZXNwYWNlIGlzIHNlZW4gaW4gc3RhdGUgMTEsIGFuZAotCUxBQkVMU19XSVRIT1VUX0NPTE9OUyBpcyBub3QgZGVmaW5lZCwgYW5kIHdlIGFyZSBub3QgaW4gbTY4ayBNUkkKLQltb2RlLCBjaGFuZ2UgdGhlIHN0YXRlIHRvIDMgcmF0aGVyIHRoYW4gMS4KLQotVGh1IE1hciAxNCAxODoxODoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChDX1JFR0lTVEVSX1NFQ1RJT04pOiBDaGFuZ2UgZnJvbSAyMCB0byA1MCwgdG8KLQljb3JyZXNwb25kIHRvIDExIE1hcmNoIGNoYW5nZS4KLQotVGh1IE1hciAxNCAxNToyNzoxMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChidWlsZF9ieXRlcywgTUVNSU5EIGNhc2UpOiBHZW5lcmF0ZQotCWFuIFJfTUVNX0lORElSRUNUIHJlbG9jIHJhdGhlciB0aGFuIFJfUkVMQllURS4KLQotVHVlIE1hciAxMiAxMjoyMToxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KLQotTW9uIE1hciAxMSAxODo1NzoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAoZ2VuX3RvX3dvcmRzKTogSW1wcm92ZSBoYW5kbGluZyBvZgotCVhfUFJFQ0lTSU9OIG51bWJlcnMuICBCYXNlZCBvbiBwYXRjaGVzIGZyb20gQW5kcmVhcyBTY2h3YWIKLQk8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPi4KLQotTW9uIE1hciAxMSAwOTo1OTo1MyAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBhcy5oIChTRUdfTk9STUFMLCBTRUdfTElTVCk6IEJ1bXAgc2VnbWVudCBsaW1pdCBmcm9tIDEwIHRvIDQwLgotCShTRUdfTEFTVCk6IE5ldy4KLQkqIHN1YnNlZ3MuYyAoTUFOWV9TRUdNRU5UUyk6IEluY3JlYXNlIHNlZ21lbnQgbGltaXQuCi0JKiBvYmotY29mZi5jIChzZWdfTl9UWVBFLCBzZWdfaW5mb19vZmZfYnlfNCk6IExpa2V3aXNlLgotCShkb19yZWxvY3NfZm9yLCB3X3N5bWJvbHMsIG9ial9jb2ZmX2FkZF9zZWdtZW50LCBkb19saW5lbm9zX2ZvciwKLQljcmF3bF9zeW1ib2xzLCBjb2ZmX2hlYWRlcl9hcHBlbmQpOiBMb29wIHRvIFNFR19MQVNUIHJhdGhlciB0aGFuCi0JU0VHX0U5LgotCQotVGh1IE1hciAgNyAxNToxNzozOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogSGFuZGxlIG9wZXJhbmQgY2hhciAnTycgKG5lZyByZWcpLgotCi1UaHUgTWFyICA3IDA5OjE5OjE1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoU1VCU0VHX01JTExJKTogRGVmaW5lLgotCShwYV9kZWZfc3Vic3BhY2VzKTogQWRkICRNSUxMSUNPREUkLgotCShwYV9zcGFjZXNfYmVnaW4pOiBTZXQgc2VjdGlvbiBmbGFncyBmb3IgJE1JTExJQ09ERSQuCi0KLVdlZCBNYXIgIDYgMTQ6MTE6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBPbmx5IFNFQ19MT0FEIGlmIHRoZSB0eXBlIGlzCi0Jbm90IFNIVF9OT0JJVFMuICBEb24ndCB0YW1wZXIgd2l0aCBmbGFncyBiYXNlZCBvbiB0eXBlIGlmIGEKLQlzcGVjaWFsIHNlY3Rpb24gd2FzIGZvdW5kIChyZXZlcnQgRmViIDI5IGNoYW5nZSkuCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IE9ubHkgYWxpZ24gdXNpbmcgdGhlIG5vcCBwYXR0ZXJuCi0JaWYgYWxpZ25pbmcgdG8gYSBsb25nd29yZCBib3VuZGFyeSBvciBncmVhdGVyLgotCi1UdWUgTWFyICA1IDE1OjEwOjQzIDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogUGFzcyAxIG5vdCAyIHRvIGZyYWdfYWxpZ24uCi0KLU1vbiBNYXIgIDQgMjA6NTA6NTcgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotY3lnd2luMzIpOiBEb24ndCB1c2UgYmZkX2dhcy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLU1vbiBNYXIgIDQgMTA6MTM6MDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBBZGQgZGVmYXVsdCBkZWZpbml0aW9ucyBmb3IgUl9OMFNFTCBhbmQKLQlSX04xU0VMIHNpbmNlIHRoZXkncmUgbm90IGRlZmluZWQgZm9yIG9sZCB2ZXJzaW9ucyBvZiBocHV4LgotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBGaXggdHlwbyBpbiBSX0NPTVAyIGNvZGUuCi0JU2V0ICJzeW1fcHRyX3B0ciIgYW5kICJhZGRlbmQiIGZpZWxkcyB0byBkdW1teSB2YWx1ZXMgZm9yCi0JUl9OMFNFTCBhbmQgUl9OMVNFTC4KLQotRnJpIE1hciAgMSAxMDoyMDo1MiAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZmxvbnVtLWtvbnN0LmM6IEFkZCB0d28gbW9yZSBjb25zdGFudHMgZm9yIDFlKy0yMDQ4IGFuZAotCTFlKy00MDk2LCBhbmQgY29ycmVjdCB0aGUgb3RoZXIgY29uc3RhbnRzLgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIE9fbG9naWNhbF9ub3QuCi0KLVRodSBGZWIgMjkgMTM6NTg6MzUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBBbGxvdyBwcmVkZWZpbmVkIHNlY3Rpb24KLQl0eXBlcyB0byBzZXQgdGhlIG5vYml0cyB0eXBlLiAgQXZvaWQgYSBzaGFkb3dlZCBkZWNsYXJhdGlvbi4KLQotV2VkIEZlYiAyOCAxNTozODo1NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X2FkanVzdGFibGUpOiBGb3IgU09NLCBkb24ndAotCXJlZHVjZSByZWxvY3MgdXNpbmcgZV9ubHJzZWwgZmllbGQgc2VsZWN0b3JzLgotCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IERvbid0IHVzZSAjZWxpZi4gIFNvbWUgY29tcGlsZXJzCi0JZG9uJ3QgaGFuZGxlIGl0LgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChzZWxlY3Rvcl90YWJsZSk6IEFkZCAibiIsICJubCIsIGFuZCAibmxyIiB0bwotCXRoZSBzZWxlY3RvciB0YWJsZS4KLQkocGFfY2hrX2ZpZWxkX3NlbGVjdG9yKTogSGFuZGxlIG5ldyBmaWVsZCBzZWxlY3RvcnMgZm9yIFNPTS4KLQotVHVlIEZlYiAyNyAxNDo0MjoyNyAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLmluIChtNjhrLSotbGludXgqYW91dCosIG02OGstKi1saW51eCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy90ZS1saW51eC5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQVJHRVRfRk9STUFUKSBbVEVfTElOVVhdOiBEZWZpbmUgdG8KLQkiYS5vdXQtbTY4ay1saW51eCIuCi0JKiBjb25maWcvdGMtbTY4ay5jIChjb21tZW50X2NoYXJzKTogRG9uJ3QgaW5jbHVkZSAnIycgaWYgVEVfTElOVVgKLQlpcyBkZWZpbmVkLgotCi1Nb24gRmViIDI2IDE4OjU4OjU4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBVcGRhdGUgdG8gaGFuZGxlIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuCi0KLU1vbiBGZWIgMjYgMTA6MzQ6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFByaW50IGFsbCBhcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydAotCXRoZSBpbnNuIG9uIG1pc21hdGNoLgotCi1GcmkgRmViIDIzIDIxOjQ0OjM5IDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIGEyOS1jb2ZmLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgRmViIDIyIDE2OjM5OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKHNoX2NvZmZfZnJvYl9maWxlKTogRG9uJ3QgY29uc2lkZXIgdGhlIGFkZHJlc3MKLQlvZiB0aGUgc2VjdGlvbiB3aGVuIGxvb2tpbmcgZm9yIHRoZSBSX1NIX1VTRVMgZml4dXAsIGJlY2F1c2UgdGhlCi0JZnJhZyBhZGRyZXNzZXMgaGF2ZSBub3QgeWV0IGJlZW4gYWRqdXN0ZWQuCi0KLQkqIGdkYmluaXQuaW46IFNldCBhIGJyZWFrcG9pbnQgb24gYXNfd2Fybl93aGVyZS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBBZGQgbWlzc2luZyBhcmd1bWVudHMgdG8gbWFjcm9fYnVpbGQKLQlvbWl0dGVkIGluIGxhc3QgY2hhbmdlLiAgRnJvbSBKaW0gV2lsc29uIDx3aWxzb25AY3lnbnVzLmNvbT4uCi0KLVdlZCBGZWIgMjEgMTc6MDA6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAodGNfcmVsb2NfbWFuZ2xlKTogQ2hhbmdlIHJlbG9jIGJhc2VkIG9uIHNpemUKLQlpZiBpdCBpcyBUQ19DT05TX1JFTE9DLiAgU2V0IGEgc2l6ZSBvZiA0IHRvIFJfUkVMTE9ORy4KLQotV2VkIEZlYiAyMSAwOToyNTozOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogUmVjb2duaXplICVhc3IwIGZvciB2OC4KLQotVHVlIEZlYiAyMCAyMTo0ODowMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHBhcnNlX2tleXdvcmRfYXJnKTogQWNjZXB0IGxlYWRpbmcgJyUnLgotCShzcGFyY19pcCk6IEFjY2VwdCAlYXNyWzEuLjMxXSBmb3IgdjggYW5kICVhc3JbJTE2Li4zMV0gZm9yIHY5LgotCVJlY29nbml6ZSBbdVVdIGZvcm1hdCBhcmdzIGFzIHNwYXJjbGV0IGNwcmVncy4KLQotVHVlIEZlYiAyMCAyMjoyNTo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9oYW5kbGVfYWxpZ24pOiBEb24ndCBlbWl0IFJfU0hfQUxJR04gcmVsb2NzCi0JaW4gYnNzX3NlY3Rpb24uCi0KLU1vbiBGZWIgMTkgMTQ6MTY6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogQ2hlY2sgU19JU19XRUFLIGFzCi0Jd2VsbCBhcyBTX0lTX0VYVEVSTkFMLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCk6IEluIE9CSl9FTEYgY2FzZSwgY2hlY2sgZm9yCi0JU19JU19XRUFLIGFzIHdlbGwgYXMgU19JU19FWFRFUk5BTCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gcmV0dXJuCi0JZWFybHkuCi0JKHRjX2dlbl9yZWxvYyk6IENoZWNrIFNfSVNfV0VBSyBhcyB3ZWwgYXMgU19JU19FWFRFUk5BTCB3aGVuCi0JZGVjaWRpbmcgd2hldGhlciB0byBjb252ZXJ0IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiBpZiBQSUMuCi0KLU1vbiBGZWIgMTkgMDI6MTU6NTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtYXhfYXJjaGl0ZWN0dXJlKTogQ2hhbmdlIHRvIHNwYXJjbGl0ZSBmb3IKLQkzMiBiaXQgYXJjaC4KLQkoZGVmYXVsdF9jb21wYXRpYmxlKTogRGVsZXRlLgotCShzcGFyY19mZnMpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2JlZ2luKTogT25seSBjYWxsIFNQQVJDX09QQ09ERV9DT05GTElDVF9QIG9uY2UuCi0JKHNwYXJjX2lwKTogUmV3cml0ZSBhcmNoaXRlY3R1cmUgbWF0Y2ggYW5kIGJ1bXAgbG9naWMuCi0KLVN1biBGZWIgMTggMTU6MDM6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciAnZG8gbm90IG1peCcgZnJvbSBuYXRpdmUgbGlua2VyIGJlZm9yZQotIAl0cnlpbmcgdG8gdXNlIC1ycGF0aC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEZlYiAxNiAxNjo1MzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTRl9BREpfTE5OT1BUUik6IERlZmluZSAobm9uIEJGRF9BU1NFTUJMRVIpLgotCShTRl9HRVRfQURKX0xOTk9QVFIpOiBEZWZpbmUgKG5vbiBCRkRfQVNTRU1CTEVSKS4KLQkoU0ZfU0VUX0FESl9MTk5PUFRSKTogRGVmaW5lIChub24gQkZEX0FTU0VNQkxFUikuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZW5kZWYpOiBTZXQgQURKX0xOTk9QVFIgd2hlbiBMTk5PUFRSCi0JaXMgc2V0LgotCSh3X3N5bWJvbHMpOiBJZiBBREpfTE5OT1BUUiBpcyBzZXQsIGFkZCB0aGUgc2VjdGlvbiBsbm5vcHRyIGZpZWxkCi0JdG8gdGhlIHN5bWJvbCBsbm5vcHRyIGZpZWxkLCB0byBnZXQgdGhlIGNvcnJlY3QgZmlsZSBvZmZzZXQuCi0KLVRodSBGZWIgMTUgMTQ6NDg6MzggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9zeW1ib2wpOiBPbiB0aGUgUG93ZXJQQywgZm9yY2UgYWxsCi0Jc3ltYm9scyB0aGF0IGFyZSBub3QgZnVuY3Rpb24sIGZpbGUsIG9yIHNlY3Rpb24gc3ltYm9scyB0byBiZQotCW9iamVjdCB0eXBlcy4KLQotVGh1IEZlYiAxNSAxMToyMDoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogU2V0IGFuZCBzdWJzdGl0dXRlIFJQQVRIX0VOVlZBUi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChSUEFUSF9FTlZWQVIpOiBOZXcgdmFyaWFibGUuCi0JKGNoZWNrKTogVXNlICQoUlBBVEhfRU5WVkFSKSByYXRoZXIgdGhhbiBMRF9MSUJSQVJZX1BBVEguCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0IGk2ODYuICBGcm9tIEguSi4gTHUgPGhqbEB6b29tLmNvbT46IGkzODYKLQlkb2Vzbid0IG5lZWQgb3Bjb2Rlcy4gIElmIGNvbmZpZ3VyaW5nIHNoYXJlZCwgb3Bjb2RlcyBuZWVkcyBiZmQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBGZWIgMTQgMTY6MzM6MTIgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogcmVhZC5jIChzX21yaV9zZWN0KTogRG9uJ3QgcmV0dXJuICdcMCcgaW4gdHlwZS4gIFNldCBhbGwKLQlhcHByb3ByaWF0ZSBmbGFncyBpbiBCRkQgc2VjdGlvbi4KLQotCSogY29uZmlndXJlLmluIChtNjhrLSotcHNvcyopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3RlLXBzb3MuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChjb21tZW50X2NoYXJzKTogRG9uJ3QgaW5jbHVkZSAnIycgaWYgVEVfUFNPUwotCWlzIGRlZmluZWQuCi0KLVdlZCBGZWIgMTQgMTM6NDM6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBkdXBsaWNhdGUgc2V0dGluZyBvZiBjcHVfdHlwZS4gIENoZWNrCi0Jd2hldGhlciBvcGNvZGVzIGxpYnJhcnkgaXMgcmVxdWlyZWQgZm9yIG9uIGFsbCB0YXJnZXRzLCBub3QganVzdAotCXByaW1hcnkgb25lLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2JpZ19nb3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX2V4dGVybik6IERvbid0IGRlY2xhcmUuCi0JKHJlZ19uZWVkc19kZWxheSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1hY3JvX2J1aWxkKTogUGVybWl0IEdPVC9DQUxMX0hJL0xPIHJlbG9jcy4KLQkobWFjcm9fYnVpbGRfbHVpKTogSWYgcGxhY2UgaXMgbm90IE5VTEwsIHVzZSB0aGUgbnVtYmVyIGluIHRoZQotCWV4cHJlc3Npb24uCi0JKGxvYWRfYWRkcmVzcyk6IEhhbmRsZSBtaXBzX2JpZ19nb3QgY2FzZS4KLQkobWFjcm8pOiBIYW5kbGUgbWlwc19iaWdfZ290IGZvciBNX0xBX0FCLCBNX0pBTF9BLCBhbmQgbG9hZCBhbmQKLQlzdG9yZSBtYWNyb3MuCi0JKE9QVElPTl9YR09UKTogRGVmaW5lLgotCShtZF9sb25nb3B0cyk6IEFkZCAieGdvdCIgaWYgT0JKX0VMRi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIC14Z290LgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAteGdvdC4KLQkobWRfYXBwbHlfZml4KTogUGVybWl0IEdPVC9DQUxMX0hJL0xPIHJlbG9jcy4KLQkodGNfZ2VuX3JlbG9jKTogSGFuZGxlIEdPVC9DQUxMX0hJL0xPIHJlbG9jcy4KLQotV2VkIEZlYiAxNCAxMToyMjoyNyAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCkgW29wZXJhbmQga2luZCAnIyddOiBXaGVuIGZpeGluZwotCXRoZSBieXRlIHJlbG9jYXRpb24sIHBvaW50IGl0IHRvIHRoZSBsb3cgYnl0ZSBvZiB0aGUgd29yZC4KLQotVHVlIEZlYiAxMyAxNTozMToxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEhETEZMQUdTIGZvciAqLSotaHB1eCB3aXRoIC0tZW5hYmxlLXNoYXJlZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIEZlYiAxMiAxNTo1Mzo0NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgYW55IHNwYXJjKiBjcHUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1Nb24gRmViIDEyIDE1OjQxOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkICJtcmkiIGFuZCAiLm1yaSIuCi0JKHNfbXJpKTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5oIChzX21yaSk6IERlY2xhcmUuCi0JKiBhcHAuYyAoc2NydWJfbTY4a19tcmkpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtcmlfcHNldWRvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZG9fc2NydWJfYmVnaW4pOiBBZGQgbTY4a19tcmkgcGFyYW1ldGVyLiAgVXNlIGl0IHJhdGhlciB0aGFuCi0JZmxhZ19tNjhrX21yaS4gIEluaXRpYWxpemUgc2NydWJfbTY4a19tcmkuCi0JKG1yaV9zdGF0ZSwgbXJpX2xhc3RfY2gpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoc3RydWN0IGFwcF9zYXZlKTogQWRkIHNjcnViX202OGtfbXJpLCBtcmlfc3RhdGUsIGFuZCBtcmlfbGFzdF9jaAotCWZpZWxkcy4KLQkoYXBwX3B1c2gpOiBTYXZlIG5ldyBmaWVsZHMuCi0JKGFwcF9wb3ApOiBSZXN0b3JlIG5ldyBmaWVsZHMuCi0JKGRvX3NjcnViX2NoYXJzKTogQ2hlY2sgc2NydWJfbTY4a19tcmkgcmF0aGVyIHRoYW4gZmxhZ19tcmlfbXJpLgotCUlmIFRDX002OEssIHVzZSBhIHRyaXZpYWwgc3RhdGUgbWFjaGluZSB0byBsb29rIGZvciBvY2N1cnJlbmNlcyBvZgotCXRoZSAubXJpIHBzZXVkby1vcCwgYW5kIGNoYW5nZSB0aGUgbW9kZSBhcHByb3ByaWF0ZWx5LgotCSogYXMuaCAoZG9fc2NydWJfYmVnaW4pOiBVcGRhdGUgcHJvdG90eXBlLgotCSogaW5wdXQtc2NydWIuYyAoaW5wdXRfc2NydWJfYmVnaW4pOiBQYXNzIGZsYWdfbTY4a19tcmkgdG8KLQlkb19zY3J1Yl9iZWdpbi4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHJlZ19wcmVmaXhfb3B0aW9uYWxfc2Vlbik6IE5ldyBzdGF0aWMKLQl2YXJpYWJsZS4KLQkobTY4a19tcmlfbW9kZV9jaGFuZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCByZWdfcHJlZml4X29wdGlvbmFsX3NlZW4uCi0JKiBjb25maWcvdGMtbTY4ay5oIChtNjhrX21yaV9tb2RlX2NoYW5nZSk6IERlY2xhcmUuCi0JKE1SSV9NT0RFX0NIQU5HRSk6IERlZmluZS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCAubXJpIHBzZXVkby1vcC4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogSW4gTVJJIG1vZGUsIGRvbid0IHRyZWF0ICcjJyBhcyBhCi0JY29tbWVudCBjaGFyYWN0ZXIuCi0KLU1vbiBGZWIgMTIgMTU6MTY6MjkgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQlTdXBwb3J0IGZvciBPQkpfRUxGIG9uIG02OGssIG1vc3RseSBpbnNpZGUgI2lmZGVmIE9CSl9FTEY6Ci0JKiBjb25maWcvbTY4ay1wYXJzZS5oIChlbnVtIHBpY19yZWxvY2F0aW9uKTogRGVmaW5lLgotCShzdHJ1Y3QgbTY4a19leHApOiBBZGQgcGljX3JlbG9jIGZpZWxkLgotCSogY29uZmlnL3RjLW02OGsuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmaW5lLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IERlZmluZSB0byBjYWxsIHRjX202OGtfZml4X2FkanVzdGFibGUuCi0JKE5PX1JFTE9DKTogRGVmaW5lIHRvIEJGRF9SRUxPQ19OT05FIGlmIEJGRF9BU1NFTUJMRVIsIHRvIHplcm8KLQlvdGhlcndpc2UuCi0JKiBjb25maWcvdGMtbTY4ay5jOiBEZWxldGUgZGVmaW5pdGlvbiBvZiBOT19SRUxPQy4KLSAJKHN0cnVjdCBtNjhrX2l0KTogQWRkIHBpY19yZWxvYyBmaWVsZC4KLQkoYWRkX2ZpeCk6IENvcHkgb3ZlciBwaWNfcmVsb2MgZmllbGQuCi0JKG1kX3BzZXVkb190YWJsZSk6IEludGVycHJldCAuYWxpZ24gcGFyYW1ldGVyIGFzIGJ5dGUgY291bnQuCi0JKG1vdGVfcHNldWRvX3RhYmxlKTogTGlrZXdpc2UuCi0JKHRjX202OGtfZml4X2FkanVzdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0JKGdldF9yZWxvY19jb2RlKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IFVzZSBpdCBhcyBsYXN0IGFyZ3VtZW50IHRvIGZpeF9uZXdfZXhwLgotCShtZF9hcHBseV9maXhfMik6IEZvciBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHN5bWJvbCBkb24ndCBwdXQgdGhlCi0JYWRkZW5kIGludG8gdGhlIGRhdGEuCi0JKHRjX2dlbl9yZWxvYyk6IERpZmZlcmVudCBhZGRlbmQgY29tcHV0YXRpb24gZm9yIE9CSl9FTEYuCi0JKG02OGtfaXApOiBEb24ndCByZWxheCBhbiBvcGVyYW5kIHRoYXQgcmVxdWlyZXMgcGljIHJlbG9jYXRpb24uCi0JKG1kX2JlZ2luKTogQWxpZ24gLnRleHQsIC5kYXRhIGFuZCAuYnNzIG9uIDQgYnl0ZSBib3VuZGFyeSBieQotCWRlZmF1bHQuCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgYWRkIHN5bWJvbCB2YWx1ZSB0byBhZGRlbmQgaWYKLSAJVENfTTY4SyBhbmQgT0JKX0VMRi4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKHl5bGV4KTogSGFuZGxlIEBQTFRQQywgZXRjLgotCShtb3Rvcm9sYV9vcGVyYW5kKTogQWRkIHJ1bGUgZm9yIGAoemFwYywgRVhQUiknLgotCi1Nb24gRmViIDEyIDEwOjA3OjMzIDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0KTogRml4ZWQgc28gdGhhdCB3aGl0ZXNwYWNlCi0JKnJlYWxseSogaXMgcGVybWlzc2libGUgYmVmb3JlIHRoZSBjb21tYS4KLQotTW9uIEZlYiAxMiAwMDoxMjoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IEFsaWduIHRvIGEgMiBieXRlIGJvdW5kYXJ5IGJlZm9yZQotCWluc2VydGluZyBub3AgaW5zdHJ1Y3Rpb25zLgotCi1GcmkgRmViICA5IDEwOjU0OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RlLWF1eC5oOiBDaGFuZ2UgaW5jbHVkZSBvZiBhdXguaCB0byBhdXgtY29mZi5oLgotCi1UaHUgRmViICA4IDIwOjAyOjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAodGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogQ29ycmVjdCBzdG9yYWdlCi0JY2xhc3Mgc2V0dGluZyBmb3IgYSBDQUxMTkFNRSBzeW1ib2wgaW4gQ09GRi4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogUGFzcyBuZWdhdGl2ZSBudW1iZXJzIGZvciBuZXcgLmJhbGlnblt3bF0gYW5kCi0JLnAyYWxpZ25bd2xdIHBzZXVkby1vcHMuCi0JKHNfYWxpZ25fYnl0ZXMpOiBUcmVhdCBhIG5lZ2F0aXZlIGFyZ3VtZW50IGFzIHNwZWNpZnlpbmcgdGhlIGZpbGwKLQlsZW5ndGguCi0JKHNfYWxpZ25fcHR3byk6IExpa2V3aXNlLgotCi1XZWQgRmViICA3IDE0OjEyOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIGJhbGlnbncsIGJhbGlnbmwsIHAyYWxpZ253LCBhbmQgcDJhbGlnbmwuCi0JKGRvX2FsaWduKTogVGFrZSBuZXcgbGVuIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4gIFBhc3MgaXQKLQl0byBtZF9kb19hbGlnbi4KLQkoc19hbGlnbl9ieXRlcyk6IEFyZyBub3cgaW5kaWNhdGVzIHRoZSBsZW5ndGggb2YgdGhlIGZpbGwgcGF0dGVybi4KLQkoc19hbGlnbl9wdHdvKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBQYXNzIGxlbmd0aCB0bwotCW1kX2RvX2FsaWduLgotCSogY29uZmlnL3RjLWkzODYuaCAobWRfZG9fYWxpZ24pOiBUYWtlIG5ldyBsZW4gcGFyYW1ldGVyLgotCSogY29uZmlnL3RjLW04OGsuaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG04OGtfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zaC5oIChtZF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgbmV3IHBzZXVkby1vcHMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9tZGVwcyk6IERpdmlkZSBvZmZzZXQgYnkgZnJfdmFyLCBhcyBpcwotCWRvbmUgaW4gY3Z0X2ZyYWdfdG9fZmlsbC4KLQotCSogY29uZmlnL3RjLXNoLmggKHNoX2RvX2FsaWduKTogRGVjbGFyZS4KLQkobWRfZG9fYWxpZ24pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2xpbmVubyk6IERvbid0IHRyeSB0byBzdG9yZSB0aGUgYWRkcmVzcwotCWRpZmZlcmVuY2UgaWYgdGhlIG5leHQgYWRkcmVzcyBpcyBiZWZvcmUgdGhlIGN1cnJlbnQgb25lLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzdHJ1Y3QgbTY4a19jcHUpOiBBZGQgYWxpYXMgZmllbGQuCi0JKGFyY2hzKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKG02OGtfaXApOiBEb24ndCBsaXN0IGFsaWFzIG5hbWVzIHdoZW4gbGlzdGluZyBDUFVzIHdoaWNoIHN1cHBvcnQKLQlhbiBpbnN0cnVjdGlvbi4KLQotCSogYXMuYyAobWFpbik6IENhbGwgcGFyc2VfYXJncyBiZWZvcmUgcmVhZF9iZWdpbi4KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IElmIGZsYWdfbTY4a19tcmksIGRvbid0IHB1dCBhIGRvdCBpbgotCWZyb250IG9mIGdlbmVyYXRlZCBwc2V1ZG8tb3BzLgotCSogcmVhZC5jIChwb3RhYmxlKTogSWdub3JlICJuYW1lIi4KLQkoc19hcHBfZmlsZSk6IFBlcm1pdCBhIHNpbmdsZSBxdW90ZSBhZnRlciB0aGUgc3RyaW5nLCBzaW5jZSBvbmUKLQltYXkgYXBwZWFyIGluIG02OGsgTVJJIG1vZGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIC0tZW5hYmxlLXNoYXJlZC4gIElmIGxpbmtpbmcgYWdhaW5zdAotCXNoYXJlZCBCRkQgYW5kIG9wY29kZXMsIGZpeCBsaWJyYXJ5IG5hbWUgb24gU3VuT1MsIGFuZCB0cnkgdG8gc2V0Ci0JLXJwYXRoIHJlYXNvbmFibHkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBGZWIgIDYgMTU6MTY6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5oIChmbGFnX202OGtfbXJpKTogRGVjbGFyZS4KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBJZiBUQ19NNjhLLCBzZXQgZmxhZ19tNjhrX21yaSBmb3IgLU0uCi0JKiBNYW55IGZpbGVzOiBGb3IgTVJJIHN5bnRheCB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBtNjhrIE1SSQotCWFzc2VtYmxlciwgY2hlY2sgZmxhZ19tNjhrX21yaSByYXRoZXIgdGhhbiBmbGFnX21yaSBvcgotCU1SSV9NT0RFX05FRURTX1BTRVVET19ET1QuCi0KLU1vbiBGZWIgIDUgMTY6Mjk6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChBUkNIX0hYKTogRGVmaW5lLgotCShhcmNoX3RhYik6IEFkZCBIWC4KLQkodGFyZ19oYXNfc2ZyKTogSGFuZGxlIEFSQ0hfSFguCi0JKHRhcmdfaGFzX2ljbGFzcyk6IEhhbmRsZSBBUkNIX0hYLgotCSh0Y19jb2ZmX2ZpeDJydHlwZSk6IEFkZCByZXR1cm4gMCB0byBhdm9pZCB3YXJuaW5nLgotCSh0Y19oZWFkZXJzX2hvb2spOiBJZiB0aGUgYXJjaGl0ZWN0dXJlIHdhcyBzcGVjaWZpZWQgZXhwbGljaXRseSwKLQl1c2UgaXQgd2hlbiBzZXR0aW5nIHRoZSBmbGFncy4gIFNldCB0aGUgZXh0ZXJuIHZhcmlhYmxlIGNvZmZfZmxhZ3MKLQlyYXRoZXIgdGhhbiBoZWFkZXJzLT5maWxlaGRyLmZfZmxhZ3MsIHNpbmNlIHRoZSBsYXR0ZXIgaXMgc2V0Ci0JdW5jb25kaXRpb25hbGx5IGluIG9iai1jb2ZmLmMuCi0JKGk5NjBfaGFuZGxlX2FsaWduKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBmaXhwLgotCi0JU3VwcG9ydCBmb3IgYnVpbGRpbmcgYmZkIGFuZCBvcGNvZGVzIGFzIHNoYXJlZCBsaWJyYXJpZXMsIGJhc2VkIG9uCi0JcGF0Y2hlcyBmcm9tIEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIGNvbmZpZ3VyZS5pbjogU2V0IE9QQ09ERVMgYW5kIEJGRCB0byBzZWFyY2ggZGlyZWN0b3JpZXMuCi0JU3Vic3RpdHV0ZSBPUENPREVTX0RFUCBhbmQgQkZEREVQLiAgT24gU3VuT1MsIHNldCBITERGTEFHUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChMREZMQUdTLCBITERGTEFHUyk6IE5ldyB2YXJpYWJsZXMuCi0JKExJQkRFUFMpOiBOZXcgdmFyaWFibGUuCi0JKGFzLm5ldzA6IERlcGVuZCB1cG9uICQoTElCREVQUykgcmF0aGVyIHRoYW4gJChMSUJTKS4gIFVzZQotCSQoSExERkxBR1MpIGluIGxpbmsuCi0JKGNoZWNrKTogU2V0IExEX0xJQlJBUllfUEFUSCBpbiB0aGUgZW52aXJvbm1lbnQuCi0KLUZyaSBGZWIgIDIgMTc6NDE6NTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogY29uZmlnL3RjLXBwYy5oIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IE1ha2UgLnNkYXRhMiwgLnNic3MyLAotCS5QUEMuRU1CLnNkYXRhMCwgYW5kIC5QUEMuRU1CLnNic3MwIHNlY3Rpb25zIGFsbCBkZWZhdWx0IHRvCi0JcmVhZC1vbmx5LCBub3QgcmVhZC93cml0ZS4KLQotRnJpIEZlYiAgMiAxNDowOToyNSAxOTk2ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1hGT1JNKTogUmVtb3ZlIC1lLgotCi1GcmkgRmViICAyIDEyOjMyOjE1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogVXNlIFNfSVNfREVGSU5FRCBhbmQgU19JU19DT01NT04gcmF0aGVyCi0JdGhhbiBjb21wYXJpbmcgU19HRVRfU0VHTUVOVCB0byB1bmRlZmluZWRfc2VjdGlvbi4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIGFuCi0JdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wuCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogVXNlIFNfSVNfREVGSU5FRCBhbmQKLQlTX0lTX0NPTU1PTiByYXRoZXIgdGhhbiBjb21wYXJpbmcgU19HRVRfU0VHTUVOVCB0bwotCXVuZGVmaW5lZF9zZWN0aW9uLgotCShTX0dFVF9WQUxVRSk6IExpa2V3aXNlLiAgQXZvaWQgcmVjdXJzaW9uIHByb2JsZW1zIGlmIFNfSVNfREVGSU5FRAotCW9yIFNfSVNfQ09NTU9OIGNhbGwgU19HRVRfVkFMVUUuCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoU19JU19DT01NT04pOiBEZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBJZiBhIHJlbG9jIGlzIGVxdWF0ZWQKLQl0byBhbiB1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbCwgY29udmVydCB0aGUgcmVsb2MgdG8gYmUgYWdhaW5zdAotCXRoZSB0YXJnZXQgc3ltYm9sLgotCShvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byBhbgotCXVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLgotCSogY29uZmlnL29iai1ib3V0LmggKFNfSVNfQ09NTU9OKTogRGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1ib3V0LmMgKG9ial9lbWl0X3JlbG9jYXRpb25zKTogSWYgYSByZWxvYyBpcyBlcXVhdGVkCi0JdG8gYW4gdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wsIGNvbnZlcnQgdGhlIHJlbG9jIHRvIGJlIGFnYWluc3QKLQl0aGUgdGFyZ2V0IHN5bWJvbC4KLQkob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gYW4KLQl1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogVXNlIFNfSVNfREVGSU5FRCBhbmQKLQlTX0lTX0NPTU1PTiByYXRoZXIgdGhhbiBjb21wYXJpbmcgU19HRVRfU0VHTUVOVCB0bwotCXVuZGVmaW5lZF9zZWN0aW9uLgotCSh5YW5rX3N5bWJvbHMpOiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIGFuIHVuZGVmaW5lZCBvcgotCWNvbW1vbiBzeW1ib2wuCi0KLVRodSBGZWIgIDEgMTU6MzQ6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoU19JU19MT0NBTCk6IENoZWNrIGZvciBcMDAyIGFzIHdlbGwgYXMgXDAwMS4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChTX0lTX0xPQ0FMKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSBzdXJlIHdlIG9ubHkgYWRkIG02OGstcGFyc2UubyB0bwotCSR7ZXh0cmFfb2JqZWN0c30gb25jZSwgbm8gbWF0dGVyIGhvdyBtYW55IG02OGsgdGFyZ2V0cyBoYXZlIGJlZW4KLQllbmFibGVkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgSmFuIDMxIDE4OjMxOjQ2IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWN5Z3dpbjMyLCBwcGMtKi1jeWd3aW4zMik6IE5ldy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEphbiAzMSAxNDowMzoxNyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJleHRlbmQiIGFuZCAibGRvdWJsZSIuCi0JKiBkb2MvYy1tNjhrLnRleGk6IERvY3VtZW50IC5leHRlbmQgYW5kIC5sZG91YmxlLgotCi0JKiBjb25maWd1cmUuaW4gKG02OCotYXBwbGUtYXV4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvdGUtYXV4Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvbXBhcmVfZXh0ZXJuYWxfcmVsb2NzKTogTmV3IHN0YXRpYyBmdW5jdGlvbgotCWlmIFRFX0FVWC4KLQkoZG9fcmVsb2NzX2Zvcik6IFNvcnQgcmVsb2NzIGlmIFRFX0FVWC4KLQkoZml4dXBfc2VnbWVudCk6IElmIFRFX0FVWCwgc3RvcmUgY29tbW9uIHN5bWJvbCB2YWx1ZSBpbiBzZWdtZW50LgotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCk6IERlZmluZSBpZiBURV9BVVguCi0KLVdlZCBKYW4gMzEgMTI6MjQ6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19MT0NBTCk6IENoZWNrIGZvciBcMDAyIGFzIHdlbGwgYXMgXDAwMS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc19taXBzX2dsb2JsKTogU2V0IEJTRl9PQkpFQ1QgaWYgaXQgaXMgbm90Ci0JQlNGX0ZVTkNUSU9OLgotCShzX2NwbG9hZCk6IFNldCBCU0ZfT0JKRUNUIGZvciBfZ3BfZGlzcCBzeW1ib2wuCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBJZiBTX1NFVF9TSVpFIGlzIGRlZmluZWQsIHNldCB0aGUgc2l6ZSBvZiB0aGUKLQlzeW1ib2wuCi0JKiBlY29mZi5jIChhZGRfcHJvY2VkdXJlKTogU2V0IHRoZSBCU0ZfRlVOQ1RJT04gZmxhZy4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IElmIFNfU0VUX1NJWkUgaXMgZGVmaW5lZCwgc2V0IHRoZSBzaXplIG9mCi0JYW4gdW5kZWZpbmVkIHN5bWJvbCBhbmQgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBzeW1ib2wuCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9zeW1ib2wpOiBJZiBUQ19NSVBTLCBzZXQgQlNGX09CSkVDVAotCWZvciBhbGwgY29tbW9uIHN5bWJvbHMuCi0KLVR1ZSBKYW4gMzAgMTI6MzU6MjQgMTk5NiAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHBhcnNlX21lbW9wKTogSW4gTVJJIG1vZGUsIGRvbid0IHVzZSBpbXBsaWNpdAotCXNjYWxpbmcgb2YgaW5kZXguCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEFjY2VwdCAweCBoZXggY29uc3RhbnRzIGluIE1SSSBtb2RlIGlmIG5vdCBvbgotCW02OGsuCi0KLU1vbiBKYW4gMjkgMTI6MjE6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3R5cGUpOiBTZXQgQlNGX09CSkVDVCBmbGFnIGZvciBhIHR5cGUKLQlvZiBvYmplY3QuICBGcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT4uCi0KLQkqIGVjb2ZmLmMgKGxvY2Fsc3ltX3QpOiBBZGQgYWRkZW5kIGZpZWxkLgotCShhZGRfZWNvZmZfc3ltYm9sKTogQWRkIGFkZGVuZCBhcmd1bWVudC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoY29mZl9zeW1fdmFsdWUpOiBNYWtlIHN0YXRpYy4KLQkoY29mZl9zeW1fYWRkZW5kKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZWNvZmZfZGlyZWN0aXZlX2RlZik6IEluaXRpYWxpemUgY29mZl9zeW1fYWRkZW5kLgotCShlY29mZl9kaXJlY3RpdmVfdmFsKTogQWNjZXB0IHN5bWJvbCArIGNvbnN0YW50LgotCShlY29mZl9kaXJlY3RpdmVfZW5kZWYpOiBQYXNzIGNvZmZfc3ltX2FkZGVuZCB0byBhZGRfZWNvZmZfc3ltYm9sLgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogSW5jbHVkZSB0aGUgYWRkZW5kIGluIHRoZSBzeW1ib2wgdmFsdWUuCi0KLUZyaSBKYW4gMjYgMTk6Mjg6NTIgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXNzZW1ibGUpOiBJZ25vcmUgb3ZlcmZsb3cgb24gCi0JQkZEX1JFTE9DXzE2X0dPVE9GRiBhbmQgQkZEX1JFTE9DX1BQQ19UT0MxNi4KLQotRnJpIEphbiAyNiAxNjoxNDoxNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IFNEQTIxIHJlbG9jYXRpb25zIGFyZSBub3cgNAotCWJ5dGVzIGluIHNpemUsIHNvIG9mZnNldCBhcHByb3ByaWF0ZWx5IGluIGJpZyBlbmRpYW4gbW9kZSB3aGVuCi0Jd3JpdGluZyB0aGUgYm90dG9tIDIgYnl0ZXMuCi0KLVRodSBKYW4gMjUgMjA6MjY6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChkZWZhdWx0X2NvbXBhdGlibGUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShtZF9iZWdpbik6IEluaXRpYWxpemUgaXQuICBSZXdyaXRlIHdhcm5fb25fYnVtcCBoYW5kbGluZy4KLQkoc3BhcmNfaXApOiBJZiBubyBhcmNoaXRlY3R1cmUgb3IgLWJ1bXAgc3BlY2lmaWVkLCBkb24ndCBtYXJrIGFzCi0JbWlzbWF0Y2hlZCB0aG9zZSBpbiBkZWZhdWx0X2NvbXBhdGlibGUuCi0KLVRodSBKYW4gMjUgMTI6MjE6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JU0NPIEVMRiBzdXBwb3J0IGZyb20gUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLXNjbyplbGYqKTogVXNlIGZtdCBlbGYsIHRhcmcgc2NvNS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy9zY281Lm10OiBOZXcgZmlsZTsgc2V0IFRERUZJTkVTIHRvIC1EU0NPX0VMRi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHNjb19pZCk6IE5ldyBmdW5jdGlvbiwgaWYgU0NPX0VMRi4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHRjX2luaXRfYWZ0ZXJfYXJncyk6IERlZmluZSBpZiBTQ09fRUxGLgotCShzY29faWQpOiBEZWNsYXJlIGlmIFNDT19FTEYuCi0KLVRodSBKYW4gMjUgMDM6MTA6NTMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChpbml0aWFsX2FyY2hpdGVjdHVyZSxjYW5fYnVtcF92OV9wKTogRGVsZXRlZC4KLQkoe21heCx3YXJuX2FmdGVyfV9hcmNoaXRlY3R1cmUpOiBOZXcgc3RhdGljIGxvY2Fscy4KLQkobWRfYmVnaW4pOiBSZXBsYWNlIE5VTU9QQ09ERVMgd2l0aCBzcGFyY19udW1fb3Bjb2Rlcy4KLQlJZiBib3RoIGFyY2hpdGVjdHVyZSBhbmQgLWJ1bXAgcmVxdWVzdGVkLCBzZXQgbWF4X2FyY2hpdGVjdHVyZSB0byBtYXguCi0JKHNwYXJjX21kX2VuZCk6IFNpbXBsaWZ5LgotCShzcGFyY19pcCk6IFJlcGxhY2UgcmVmZXJlbmNlcyB0byBjYW5fYnVtcF92OV9wIHdpdGggbWF4X2FyY2hpdGVjdHVyZS4KLQlSZXdyaXRlIGNvZGUgdG8gYnVtcCBhcmNoaXRlY3R1cmUgYW5kIGNoZWNrIGZvciBjb25mbGljdHMuCi0JKG1kX2xvbmdvcHRzKTogUmVjb2duaXplIC14YXJjaD17djhwbHVzLHY4cGx1c2F9IGZvciBjb21wYXRpYmlsaXR5Ci0Jd2l0aCBTb2xhcmlzIGFzc2VtYmxlci4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTGlrZXdpc2UuICBDYWxsIHNwYXJjX29wY29kZV9sb29rdXBfYXJjaC4KLQkobWRfc2hvd191c2FnZSk6IFVwZGF0ZS4KLQotV2VkIEphbiAyNCAyMjoxMTowMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFJVTlRFU1QpOiBGaXggcmVmZXJlbmNlIHRvICQke3NyY2Rpcn0uCi0KLU1vbiBKYW4gMjIgMDk6MjE6MzYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfRk9STUFUKTogVXNlICNpZmRlZiBTUEFSQ19BUkNINjQgaW5zdGVhZCBvZgotCSNpZmRlZiBzcGFyY3Y5IHdoZW4gY2hvb3NpbmcgdmFsdWUuCi0JKEVOVjY0KTogRGVsZXRlLgotCShtZF9lbmQpOiBEZWZpbmUuCi0JKHNwYXJjX21kX2VuZCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoU1BBUkNfVjkpOiBSZW5hbWVkIGZyb20gc3BhcmN2OS4KLQkoaW5pdGlhbF9hcmNoaXRlY3R1cmUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShjYW5fYnVtcF92OV9wKTogTGlrZXdpc2UuCi0JKE5PX1Y5KTogRGVsZXRlIGFsbCBvY2N1cnJlbmNlcy4KLQkoc3BhcmNfbWRfZW5kKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19pcCk6IE5ldyBsb2NhbCB2OV9hcmdfcC4gIFJld29yayBmcCByZWcgbnVtYmVyIHRlc3QuCi0JRG9uJ3QgYnVtcCBhcmNoaXRlY3R1cmUgdG8gdjkgdW5sZXNzIGNhbl9idW1wX3Y5X3Agc2V0LgotCShtZF9wYXJzZV9vcHRpb24pOiAtQTxhcmNoPiBwYXNzZWQsIHNldCBjYW5fYnVtcF92OV9wIGFjY29yZGluZ2x5LgotCSogY29uZmlndXJlLmluIChzcGFyYzY0IHRhcmdldCBjcHUpOiBEb24ndCBzZXQgb2JqX2Zvcm1hdCBoZXJlLgotCShTUEFSQ19WOSk6IFJlbmFtZWQgZnJvbSBzcGFyY3Y5LgotCShzcGFyYzY0LSotZWxmKik6IERlZmluZSBTUEFSQ19BUkNINjQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogYWNjb25maWcuaCAoU1BBUkNfVjkpOiBSZW5hbWVkIGZyb20gc3BhcmN2OS4KLQkoU1BBUkNfQVJDSDY0KTogQWRkLgotCSogY29uZi5pbjogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWcvdm1zY29uZi5oOiBVcGRhdGUuCi0KLU1vbiBKYW4gMjIgMTc6MjQ6NDcgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogT3B0aW1pc2UgImRsaSIgbG9hZHMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBhZGQgIi1tY3B1PXZyNDEwMCIgdG8gaGVscCB0ZXh0LgotCi1Nb24gSmFuIDIyIDExOjUzOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IElmIGEgc3ltYm9sIGlzIGVxdWF0ZWQgdG8gYW4KLQl1bmRlZmluZWQgc3ltYm9sLCBwcmVzZXJ2ZSB0aGUgWF9vcCBvZiBPX3N5bWJvbC4KLQkoU19HRVRfVkFMVUUpOiBGaXggY2hlY2sgdG8gcGVybWl0IHRoaXMgY2FzZS4KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IElmIGEgcmVsb2MgaXMgYWdhaW5zdCBhbiB1bmRlZmluZWQKLQlzeW1ib2wgZXF1YXRlZCB0byBhbm90aGVyIHN5bWJvbCwgY2hhbmdlIHRoZSByZWxvYyB0byBiZSBhZ2FpbnN0Ci0JdGhlIGxhdHRlciBzeW1ib2wuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19jc2VjdCk6IEFuIHVubmFtZWQgY3NlY3QgaXMgc3RvcmFnZSBjbGFzcwotCVhNQ19QUi4KLQotTW9uIEphbiAyMiAxMDo1OTo0OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZi9wcGMuaCk6IEluY2x1ZGUgZWxmL3BwYy5oIGlmIHRhcmdldAotCWNvbXB1dGVyIGlzIFBvd2VyUEMuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEFkZCBtb3JlIGVtYmVkZGVkIHJlbG9jYXRpb25zLgotCi0JKiBjb25maWcvdGMtcHBjLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogQWRkIHNlY3Rpb25zCi0JbWVudGlvbmVkIGluIHRoZSBlYWJpLgotCi1UaHUgSmFuIDE4IDE3OjU4OjE5IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19yZWxkYXRhKTogQ2hhbmdlZCBhbGlnbmVtZW50IG9uIHJlbGRhdGFfc2VjdGlvbgotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfcGRhdGEpOiBDaGFuZ2VkIHRoZSBhbGlnbm1lbnQgb24gcGRhdGFfc2VjdGlvbgotCi1Nb24gSmFuIDE1IDE3OjQzOjQyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtYXBwaW5nKTogQWRkIG1vcmUgcmVsb2NhdGlvbiBzdWZmaXhlcy4KLQotU3VuIEphbiAxNCAyMToyOTozNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBBbGxvdyAuZ2NjX2V4Y2VwdF90YWJsZQotCWFzIGEgc2VjdGlvbiBpdCBpcyBvayB0byBoYXZlIHVuYWRvcm5lZCAtbXJlbG9jYXRhYmxlIHBvaW50ZXJzIGluLgotCi1TYXQgSmFuIDEzIDExOjA5OjA4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfc2VjdGlvbiopOiBXcmFwIHRoZXNlIGZ1bmN0aW9ucyBpbnNpZGUKLQkjaWZkZWYgT0JKX0VMRi4KLQotRnJpIEphbiAxMiAxNTozMjowNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IEFkZCBob29rcyBzbyBtYWNoaW5lCi0JZGVwZW5kZW50IHNlY3Rpb24gYXR0cmlidXRlcyBjYW4gYmUgaGFuZGxlZC4KLQotCSogY29uZmlnL3RjLXBwYy5oOiAobWRfZWxmX3NlY3Rpb25fe2xldHRlcix0eXBlLHdvcmQsZmxhZ3N9KTogTmV3Ci0JbWFjcm9zIHRvIGFkZCBzdXBwb3J0IGZvciBleGNsdWRlIHNlY3Rpb24gZmxhZyBhbmQgb3JkZXJlZCBzZWN0aW9uCi0JdHlwZS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3NlY3Rpb25fe2xldHRlcix0eXBlLHdvcmQsZmxhZ3N9KTogTmV3Ci0JZnVuY3Rpb25zIHRvIGFkZCBzdXBwb3J0IGZvciBleGNsdWRlIHNlY3Rpb24gZmxhZyBhbmQgb3JkZXJlZAotCXNlY3Rpb24gdHlwZS4KLQotRnJpIEphbiAxMiAxMjowNDowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBEb24ndCB0cnkgdG8gbG9vayB1cCB0aGUgc2VjdGlvbgotCXN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZS4gIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBoYXZlIGEgc3ltYm9sCi0Jd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgc2VjdGlvbiwgYnV0IG5vIGNvbm5lY3Rpb24gdG8gaXQuCi0KLQkqIHJlYWQuYyAoY29uc193b3JrZXIpOiBPbmx5IGNhbGwgbXJpX2NvbW1lbnRfZW5kIGZyb20gZmxhZ19tcmkuCi0JRnJvbSBKYW1lcyBDYXJsc29uIDxjYXJsc29uQHh5bG9naWNzLmNvbT4uCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IFNraXAgd2hpdGVzcGFjZSBhZnRlciBhIGNsb3NlIHBhcmVudGhlc2lzLgotCUZyb20gSmFtZXMgQ2FybHNvbiA8Y2FybHNvbkB4eWxvZ2ljcy5jb20+LgotCi1UdWUgSmFuICAyIDEyOjQzOjIzIDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2FwcGx5X2ZpeCk6IENhbGwgYXNfYmFkX3doZXJlIGluc3RlYWQgb2YKLQlhc193YXJuX3doZXJlIGZvciByZWxvY2F0aW9uIG92ZXJmbG93LgotCShwYXJzZV9yZWcpOiBBY2NlcHQgcmVnaXN0ZXIgbmFtZSBvbmx5IGlmIG5leHQgY2hhcmFjdGVyIGlzCi0Jbm90IGFscGhhbnVtZXJpYy4KLQotRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05Mjk1CmRpZmYgLS1naXQgYS9nYXMvTWFrZWZpbGUuYW0gYi9nYXMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMDU1MjQuLjAwMDAwMDAKLS0tIGEvZ2FzL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMTczMSArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLSMjIFdvcmsgYXJvdW5kIGFwcGFyZW50IGF1dG9tYWtlIGJ1Zy4KLUlOVExMSUJTID0gQElOVExMSUJTQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzIGRlamFnbnUKLQotU1VCRElSUyA9IGRvYyBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MLi4vYmlzb24vYmlzb24gOyBlbHNlIGVjaG8gYmlzb24gLXkgOyBmaWAKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7ICBlbHNlIGVjaG8gZmxleCA7IGZpYAotCi1NS0RFUCA9ICQke3NyY2Rpcn0vLi4vbWtkZXAKLQotVEFSR19DUFUgPSBAdGFyZ2V0X2NwdV90eXBlQAotVEFSR19DUFVfQyA9ICQoc3JjZGlyKS9jb25maWcvdGMtQHRhcmdldF9jcHVfdHlwZUAuYwotVEFSR19DUFVfTyA9IHRjLUB0YXJnZXRfY3B1X3R5cGVALm8KLVRBUkdfQ1BVX0ggPSAkKHNyY2RpcikvY29uZmlnL3RjLUB0YXJnZXRfY3B1X3R5cGVALmgKLU9CSl9GT1JNQVRfQyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLUBvYmpfZm9ybWF0QC5jCi1PQkpfRk9STUFUX08gPSBvYmotQG9ial9mb3JtYXRALm8KLU9CSl9GT1JNQVRfSCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLUBvYmpfZm9ybWF0QC5oCi1UQVJHX0VOVl9IID0gJChzcmNkaXIpL2NvbmZpZy90ZS1AdGVfZmlsZUAuaAotQVRPRl9UQVJHX0MgPSAkKHNyY2RpcikvY29uZmlnL2F0b2YtQGF0b2ZALmMKLUFUT0ZfVEFSR19PID0gYXRvZi1AYXRvZkAubwotCi0jIHVzZSBAdGFyZ2V0X2NwdV90eXBlQCBmb3IgcmVmZXJpbmcgdG8gY29uZmlndXJlZCB0YXJnZXQgbmFtZQotSVRfSERSUz1pdGJsLXBhcnNlLmggJChzcmNkaXIpL2l0Ymwtb3BzLmggCi1JVF9TUkNTPWl0YmwtcGFyc2UuYyBpdGJsLWxleC5jICQoc3JjZGlyKS9pdGJsLW9wcy5jCi1JVF9ERVBTPSQoc3JjZGlyKS9pdGJsLXBhcnNlLnkgJChzcmNkaXIpL2l0YmwtbGV4LmwgJChzcmNkaXIpL2NvbmZpZy9pdGJsLUB0YXJnZXRfY3B1X3R5cGVALmgKLUlUX09CSlM9aXRibC1wYXJzZS5vIGl0YmwtbGV4Lm8gaXRibC1vcHMubwotCi0jIENQVSB0eXBlcy4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLgotCi1DUFVfVFlQRVMgPSBcCi0JYTI5ayBcCi0JYWxwaGEgXAotCWFyYyBcCi0JYXJtIFwKLQlkMTB2IFwKLQlkMzB2IFwKLQlmcjMwIFwKLQloODMwMCBcCi0JaDg1MDAgXAotCWhwcGEgXAotCWkzODYgXAotCWk4NjAgXAotCWk5NjAgXAotCW0zMnIgXAotCW02OGsgXAotCW04OGsgXAotCW1jb3JlIFwKLQltaXBzIFwKLQltbjEwMjAwIFwKLQltbjEwMzAwIFwKLQluczMyayBcCi0JcGogXAotCXBwYyBcCi0Jc2ggXAotCXNwYXJjIFwKLQl0YWhvZSBcCi0JdGljMzAgXAotCXRpYzgwIFwKLQl2YXggXAotCXc2NSBcCi0Jdjg1MCBcCi0JejhrCi0KLSMgT2JqZWN0IGZvcm1hdCB0eXBlcy4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLgotIyBXZSBkZWxpYmVyYXRlbHkgb21pdCBzb20sIHNpbmNlIGl0IGRvZXMgbm90IHdvcmsgYXMgYSBjcm9zcyBhc3NlbWJsZXIuCi0KLU9CSl9GT1JNQVRTID0gXAotCWFvdXQgXAotCWJvdXQgXAotCWNvZmYgXAotCWVjb2ZmIFwKLQllbGYgXAotCWV2YXggXAotCWhwMzAwIFwKLQlpZWVlIFwKLQl2bXMKLQotIyBUaGlzIGlzIGFuIHNoIGNhc2Ugd2hpY2ggc2V0cyB2YWxpZCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgQ1BVCi0jIHR5cGUgaW4gdGhlIHNoZWxsIHZhcmlhYmxlIGMgYW5kIHRoZSBPUyB0eXBlIGluIHRoZSBzaGVsbCB2YXJpYWJsZSBvCi0jIGFyZSBzdXBwb3J0ZWQuICBUaGlzIGhlbHBzIGN1dHMgZG93biBvbiB0aGUgYW1vdW50IG9mIGRlcGVuZGVuY3kKLSMgaW5mb3JtYXRpb24uCi0KLUNQVV9PQkpfVkFMSUQgPSBcCi0JdmFsaWQ9IDsgXAotCWNhc2UgJCRvIGluIFwKLQlhb3V0KSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBhMjlrIHwgYXJtIHwgaTM4NiB8IGk4NjAgfCBtNjhrIHwgbWlwcyB8IG5zMzJrIHwgc3BhcmMgfCB0YWhvZSB8IHRpYzMwIHwgdmF4KSBcCi0JICAgIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQlib3V0KSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBpOTYwKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JY29mZikgdmFsaWQ9eWVzIDs7IFwKLQllY29mZikgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgbWlwcyB8IGFscGhhKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JZWxmKSB2YWxpZD15ZXMgOzsgXAotCWV2YXgpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIGFscGhhKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JaHAzMDApIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIG02OGspIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQl2bXMpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIHZheCkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWVzYWM7Ci0KLSMgVGhpcyBpcyBsaWtlIENQVV9PQkpfVkFMSUQsIGZvciB0aGUgb2JqPW11bHRpIGNhc2UuCi0KLUNQVV9NVUxUSV9WQUxJRCA9IFwKLQl2YWxpZD0gOyBcCi0JY2FzZSAkJGMgaW4gXAotCWkzODYgfCBtaXBzKSB2YWxpZD15ZXMgOzsgXAotCWVzYWM7Ci0KLSMgUmVndWxhciBzb3VyY2UgZmlsZXMuCi0KLUdBU19DRklMRVMgPSBcCi0JYXBwLmMgXAotCWFzLmMgXAotCWF0b2YtZ2VuZXJpYy5jIFwKLQliaWdudW0tY29weS5jIFwKLQljb25kLmMgXAotCWRlcGVuZC5jIFwKLQlkd2FyZjJkYmcuYyBcCi0JZWNvZmYuYyBcCi0JZWhvcHQuYyBcCi0JZXhwci5jIFwKLQlmbG9udW0tY29weS5jIFwKLQlmbG9udW0ta29uc3QuYyBcCi0JZmxvbnVtLW11bHQuYyBcCi0JZnJhZ3MuYyBcCi0JaGFzaC5jIFwKLQlpbnB1dC1maWxlLmMgXAotCWlucHV0LXNjcnViLmMgXAotCWxpc3RpbmcuYyBcCi0JbGl0ZXJhbC5jIFwKLQltYWNyby5jIFwKLQltZXNzYWdlcy5jIFwKLQlvdXRwdXQtZmlsZS5jIFwKLQlyZWFkLmMgXAotCXNiLmMgXAotCXN0YWJzLmMgXAotCXN1YnNlZ3MuYyBcCi0Jc3ltYm9scy5jIFwKLQl3cml0ZS5jCi0KLUNGSUxFUyA9ICQoR0FTX0NGSUxFUykgZ2FzcC5jIGl0Ymwtb3BzLmMKLQotSEZJTEVTID0gXAotCWFzLmggXAotCWFzaW50bC5oIFwKLQliaWdudW0uaCBcCi0JYml0X2ZpeC5oIFwKLQljZ2VuLmggXAotCWR3YXJmMmRiZy5oIFwKLQllY29mZi5oIFwKLQllbXVsLXRhcmdldC5oIFwKLQllbXVsLmggXAotCWV4cHIuaCBcCi0JZmxvbnVtLmggXAotCWZyYWdzLmggXAotCWhhc2guaCBcCi0JaW5wdXQtZmlsZS5oIFwKLQlpdGJsLW9wcy5oIFwKLQlsaXN0aW5nLmggXAotCW1hY3JvLmggXAotCW9iai5oIFwKLQlvdXRwdXQtZmlsZS5oIFwKLQlyZWFkLmggXAotCXNiLmggXAotCXN0cnVjLXN5bWJvbC5oIFwKLQlzdWJzZWdzLmggXAotCXN5bWJvbHMuaCBcCi0JdGMuaCBcCi0Jd3JpdGUuaAotCi0jIENQVSBmaWxlcyBpbiBjb25maWcuCi0KLVRBUkdFVF9DUFVfQ0ZJTEVTID0gXAotCWNvbmZpZy90Yy1hMjlrLmMgXAotCWNvbmZpZy90Yy1hbHBoYS5jIFwKLQljb25maWcvdGMtYXJjLmMgXAotCWNvbmZpZy90Yy1hcm0uYyBcCi0JY29uZmlnL3RjLWQxMHYuYyBcCi0JY29uZmlnL3RjLWQzMHYuYyBcCi0JY29uZmlnL3RjLWZyMzAuYyBcCi0JY29uZmlnL3RjLWg4MzAwLmMgXAotCWNvbmZpZy90Yy1oODUwMC5jIFwKLQljb25maWcvdGMtaHBwYS5jIFwKLQljb25maWcvdGMtaTM4Ni5jIFwKLQljb25maWcvdGMtaTg2MC5jIFwKLQljb25maWcvdGMtaTk2MC5jIFwKLQljb25maWcvdGMtbTMyci5jIFwKLQljb25maWcvdGMtbTY4ay5jIFwKLQljb25maWcvdGMtbTg4ay5jIFwKLQljb25maWcvdGMtbWNvcmUuYyBcCi0JY29uZmlnL3RjLW1pcHMuYyBcCi0JY29uZmlnL3RjLW1uMTAyMDAuYyBcCi0JY29uZmlnL3RjLW1uMTAzMDAuYyBcCi0JY29uZmlnL3RjLW5zMzJrLmMgXAotCWNvbmZpZy90Yy1wai5jIFwKLQljb25maWcvdGMtcHBjLmMgXAotCWNvbmZpZy90Yy1zaC5jIFwKLQljb25maWcvdGMtc3BhcmMuYyBcCi0JY29uZmlnL3RjLXRhaG9lLmMgXAotCWNvbmZpZy90Yy10aWMzMC5jIFwKLQljb25maWcvdGMtdGljODAuYyBcCi0JY29uZmlnL3RjLXZheC5jIFwKLQljb25maWcvdGMtdzY1LmMgXAotCWNvbmZpZy90Yy12ODUwLmMgXAotCWNvbmZpZy90Yy16OGsuYwotCi1UQVJHRVRfQ1BVX0hGSUxFUyA9IFwKLQljb25maWcvdGMtYTI5ay5oIFwKLQljb25maWcvdGMtYWxwaGEuaCBcCi0JY29uZmlnL3RjLWFyYy5oIFwKLQljb25maWcvdGMtYXJtLmggXAotCWNvbmZpZy90Yy1kMTB2LmggXAotCWNvbmZpZy90Yy1kMzB2LmggXAotCWNvbmZpZy90Yy1mcjMwLmggXAotCWNvbmZpZy90Yy1oODMwMC5oIFwKLQljb25maWcvdGMtaDg1MDAuaCBcCi0JY29uZmlnL3RjLWhwcGEuaCBcCi0JY29uZmlnL3RjLWkzODYuaCBcCi0JY29uZmlnL3RjLWk4NjAuaCBcCi0JY29uZmlnL3RjLWk5NjAuaCBcCi0JY29uZmlnL3RjLW0zMnIuaCBcCi0JY29uZmlnL3RjLW02OGsuaCBcCi0JY29uZmlnL3RjLW04OGsuaCBcCi0JY29uZmlnL3RjLW1jb3JlLmggXAotCWNvbmZpZy90Yy1taXBzLmggXAotCWNvbmZpZy90Yy1tbjEwMjAwLmggXAotCWNvbmZpZy90Yy1tbjEwMzAwLmggXAotCWNvbmZpZy90Yy1uczMyay5oIFwKLQljb25maWcvdGMtcGouaCBcCi0JY29uZmlnL3RjLXBwYy5oIFwKLQljb25maWcvdGMtc2guaCBcCi0JY29uZmlnL3RjLXNwYXJjLmggXAotCWNvbmZpZy90Yy10YWhvZS5oIFwKLQljb25maWcvdGMtdGljMzAuaCBcCi0JY29uZmlnL3RjLXRpYzgwLmggXAotCWNvbmZpZy90Yy12YXguaCBcCi0JY29uZmlnL3RjLXc2NS5oIFwKLQljb25maWcvdGMtdjg1MC5oIFwKLQljb25maWcvdGMtejhrLmgKLQotIyBPQkogZmlsZXMgaW4gY29uZmlnCi0KLU9CSl9GT1JNQVRfQ0ZJTEVTID0gXAotCWNvbmZpZy9vYmotYW91dC5jIFwKLQljb25maWcvb2JqLWJvdXQuYyBcCi0JY29uZmlnL29iai1jb2ZmLmMgXAotCWNvbmZpZy9vYmotZWNvZmYuYyBcCi0JY29uZmlnL29iai1lbGYuYyBcCi0JY29uZmlnL29iai1ldmF4LmMgXAotCWNvbmZpZy9vYmotaHAzMDAuYyBcCi0JY29uZmlnL29iai1pZWVlLmMgXAotCWNvbmZpZy9vYmotc29tLmMgXAotCWNvbmZpZy9vYmotdm1zLmMKLQotT0JKX0ZPUk1BVF9IRklMRVMgPSBcCi0JY29uZmlnL29iai1hb3V0LmggXAotCWNvbmZpZy9vYmotYm91dC5oIFwKLQljb25maWcvb2JqLWNvZmYuaCBcCi0JY29uZmlnL29iai1lY29mZi5oIFwKLQljb25maWcvb2JqLWVsZi5oIFwKLQljb25maWcvb2JqLWV2YXguaCBcCi0JY29uZmlnL29iai1ocDMwMC5oIFwKLQljb25maWcvb2JqLWllZWUuaCBcCi0JY29uZmlnL29iai1zb20uaCBcCi0JY29uZmlnL29iai12bXMuaAotCi0jIEVtdWxhdGlvbiBoZWFkZXIgZmlsZXMgaW4gY29uZmlnCi0KLVRBUkdfRU5WX0hGSUxFUyA9IFwKLQljb25maWcvdGUtMzg2YnNkLmggXAotCWNvbmZpZy90ZS1hdXguaCBcCi0JY29uZmlnL3RlLWRlbHRhLmggXAotCWNvbmZpZy90ZS1kZWx0ODguaCBcCi0JY29uZmlnL3RlLWRweDIuaCBcCi0JY29uZmlnL3RlLWR5bml4LmggXAotCWNvbmZpZy90ZS1lcG9jLXBlLmggXAotCWNvbmZpZy90ZS1nZW5lcmljLmggXAotCWNvbmZpZy90ZS1nbzMyLmggXAotCWNvbmZpZy90ZS1ocDMwMC5oIFwKLQljb25maWcvdGUtaHBwYS5oIFwKLQljb25maWcvdGUtaTM4NmFpeC5oIFwKLQljb25maWcvdGUtaWM5NjAuaCBcCi0JY29uZmlnL3RlLWxpbnV4LmggXAotCWNvbmZpZy90ZS1sbmV3cy5oIFwKLQljb25maWcvdGUtbHlueC5oIFwKLQljb25maWcvdGUtbWFjaC5oIFwKLQljb25maWcvdGUtbWFjb3MuaCBcCi0JY29uZmlnL3RlLW11bHRpLmggXAotCWNvbmZpZy90ZS1uYnNkLmggXAotCWNvbmZpZy90ZS1uYnNkNTMyLmggXAotCWNvbmZpZy90ZS1wYzUzMm1hY2guaCBcCi0JY29uZmlnL3RlLXBlLmggXAotCWNvbmZpZy90ZS1wcGNudy5oIFwKLQljb25maWcvdGUtcHNvcy5oIFwKLQljb25maWcvdGUtcmlzY2l4LmggXAotCWNvbmZpZy90ZS1zcGFyY2FvdXQuaCBcCi0JY29uZmlnL3RlLXN1bjMuaCBcCi0JY29uZmlnL3RlLXN2cjQuaCBcCi0JY29uZmlnL3RlLXN5c3YzMi5oCi0KLSMgTXVsdGkgZmlsZXMgaW4gY29uZmlnCi0KLU1VTFRJX0NGSUxFUyA9IFwKLQljb25maWcvZS1pMzg2Y29mZi5jIFwKLQljb25maWcvZS1pMzg2ZWxmLmMgXAotCWNvbmZpZy9lLW1pcHNlY29mZi5jIFwKLQljb25maWcvZS1taXBzZWxmLmMKLQotQ09ORklHX09CSlMgPSBcCi0JJChUQVJHX0NQVV9PKSBcCi0JJChPQkpfRk9STUFUX08pIFwKLQkkKEFUT0ZfVEFSR19PKSBcCi0JJChleHRyYV9vYmplY3RzKQotCi1HRU5FUklDX09CSlMgPSBcCi0JYXBwLm8gXAotCWFzLm8gXAotCWF0b2YtZ2VuZXJpYy5vIFwKLQliaWdudW0tY29weS5vIFwKLQljb25kLm8gXAotCWRlcGVuZC5vIFwKLQlkd2FyZjJkYmcubyBcCi0JZWhvcHQubyBcCi0JZXhwci5vIFwKLQlmbG9udW0ta29uc3QubyBcCi0JZmxvbnVtLWNvcHkubyBcCi0JZmxvbnVtLW11bHQubyBcCi0JZnJhZ3MubyBcCi0JaGFzaC5vIFwKLQlpbnB1dC1maWxlLm8gXAotCWlucHV0LXNjcnViLm8gXAotCWxpdGVyYWwubyBcCi0JbWVzc2FnZXMubyBcCi0Jb3V0cHV0LWZpbGUubyBcCi0JcmVhZC5vIFwKLQlzdWJzZWdzLm8gXAotCXN5bWJvbHMubyBcCi0Jd3JpdGUubyBcCi0JbGlzdGluZy5vIFwKLQllY29mZi5vIFwKLQlzdGFicy5vIFwKLQlzYi5vIFwKLQltYWNyby5vCi0KLU9CSlMgPSAkKENPTkZJR19PQkpTKSAkKEdFTkVSSUNfT0JKUykKLQotUE9URklMRVMgPSAkKE1VTFRJX0NGSUxFUykgJChUQVJHRVRfRU5WX0hGSUxFUykgJChPQkpfRk9STUFUX0hGSUxFUykgXAotCSQoT0JKX0ZPUk1BVF9DRklMRVMpICQoVEFSR0VUX0NQVV9IRklMRVMpICQoVEFSR0VUX0NQVV9DRklMRVMpIFwKLQkkKEhGSUxFUykgJChDRklMRVMpICQoR0FTX0NGSUxFUykKLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGFzLW5ldyBnYXNwLW5ldwotbm9pbnN0X1NDUklQVFMgPSAkKEdEQklOSVQpCi1FWFRSQV9TQ1JJUFRTID0gLmdkYmluaXQKLQotJChzcmNkaXIpL21ha2UtZ2FzLmNvbTogc3RhbXAtbWsuY29tCi1zdGFtcC1tay5jb206IHZtc2NvbmYuc2ggTWFrZWZpbGUKLQlzaCAkKHNyY2Rpcikvdm1zY29uZi5zaCAkKEdFTkVSSUNfT0JKUykgPiBuZXctbWFrZS5jb20KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbmV3LW1ha2UuY29tICQoc3JjZGlyKS9tYWtlLWdhcy5jb20KLQl0b3VjaCBzdGFtcC1tay5jb20KLQotRVhUUkFfRElTVCA9IG1ha2UtZ2FzLmNvbQotCi1ESVNUU1RVRkYgPSBtYWtlLWdhcy5jb20gbTY4ay1wYXJzZS5jIGl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmggaXRibC1sZXguYwotZGlzdHN0dWZmOiAkKERJU1RTVFVGRikgaW5mbwotCi1ESVNUQ0xFQU5GSUxFUyA9IHRhcmctY3B1Lmggb2JqLWZvcm1hdC5oIHRhcmctZW52LmggaXRibC1jcHUuaCBjZ2VuLWRlc2MuaAotCi0jIE5vdyBmaWd1cmUgb3V0IGZyb20gdGhvc2UgdmFyaWFibGVzIGhvdyB0byBjb21waWxlIGFuZCBsaW5rLgotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCi0KLSMgVGhpcyBpcyB0aGUgdmFyaWFibGUgYWN0dWFsbHkgdXNlZCB3aGVuIHdlIGNvbXBpbGUuCi0jIFNwZWNpZnkgdGhlIGRpcmVjdG9yaWVzIHRvIGJlIHNlYXJjaGVkIGZvciBoZWFkZXIgZmlsZXMuCi0jIEJvdGggLiBhbmQgc3JjZGlyIGFyZSB1c2VkLCBpbiB0aGF0IG9yZGVyLAotIyBzbyB0aGF0IHRtLmggYW5kIGNvbmZpZy5oIHdpbGwgYmUgZm91bmQgaW4gdGhlIGNvbXBpbGF0aW9uCi0jIHN1YmRpcmVjdG9yeSByYXRoZXIgdGhhbiBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKHNyY2RpcikvY29uZmlnIC1JJChJTkNESVIpIC1JJChzcmNkaXIpLy4uIC1JJChCRkRESVIpIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotIyBUaGlzIHNob3VsZCBiZSBwYXJhbGxlbCB0byBJTkNMVURFUywgYnV0IHNob3VsZCByZXBsYWNlICQoc3JjZGlyKQotIyB3aXRoICQke3NyY2Rpcn0sIGFuZCBzaG91bGQgd29yayBpbiBhIHN1YmRpcmVjdG9yeS4gIFRoaXMgaXMgdXNlZAotIyB3aGVuIGJ1aWxkaW5nIGRlcGVuZGVuY2llcywgYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBidWlsZGluZyBpcyBkb25lCi0jIGluIGEgc3ViZGlyZWN0b3J5LgotREVQX0lOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAtSSQke3NyY2Rpcn0vY29uZmlnIC1JJCR7c3JjZGlyfS8uLi9pbmNsdWRlIC1JJCR7c3JjZGlyfS8uLiAtSSQke3NyY2Rpcn0vLi4vYmZkIC1JJCR7c3JjZGlyfS8uLi9pbnRsIC1JLi4vLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLSMgSG93IHRvIGxpbmsgd2l0aCBib3RoIG91ciBzcGVjaWFsIGxpYnJhcnkgZmFjaWxpdGllcwotIyBhbmQgdGhlIHN5c3RlbSdzIGluc3RhbGxlZCBsaWJyYXJpZXMuCi0KLUdBU0xJQlMgPSBAT1BDT0RFU19MSUJAIEBCRkRMSUJAIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotCi0jIEZpbGVzIHRvIGJlIGNvcGllZCBhd2F5IGFmdGVyIGVhY2ggc3RhZ2UgaW4gYnVpbGRpbmcuCi1TVEFHRVNUVUZGID0gKi5vICQobm9pbnN0X1BST0dSQU1TKQotCi0kKE9CSlMpOiBAQUxMX09CSl9ERVBTQAotCi1hc19uZXdfU09VUkNFUyA9ICQoR0FTX0NGSUxFUykKLWFzX25ld19MREFERCA9ICQoVEFSR19DUFVfTykgJChPQkpfRk9STUFUX08pICQoQVRPRl9UQVJHX08pIFwKLQkkKGV4dHJhX29iamVjdHMpICQoR0FTTElCUykgJChJTlRMTElCUykKLWFzX25ld19ERVBFTkRFTkNJRVMgPSAkKFRBUkdfQ1BVX08pICQoT0JKX0ZPUk1BVF9PKSAkKEFUT0ZfVEFSR19PKSBcCi0JJChleHRyYV9vYmplY3RzKSAkKEdBU0xJQlMpICQoSU5UTERFUFMpCi0KLSMgU3R1ZmYgdGhhdCBldmVyeSBvYmplY3QgZmlsZSBkZXBlbmRzIHVwb24uICBJZiBhbnl0aGluZyBpcyByZW1vdmVkCi0jIGZyb20gdGhpcyBsaXN0LCByZW1vdmUgaXQgZnJvbSBkZXAtaW4uc2VkIGFzIHdlbGwuCi0kKE9CSlMpOiBjb25maWcuaCBhcy5oICQoVEFSR19FTlZfSCkgJChPQkpfRk9STUFUX0gpICQoVEFSR19DUFVfSCkgZmxvbnVtLmggXAotCWV4cHIuaCB3cml0ZS5oIGZyYWdzLmggaGFzaC5oIHJlYWQuaCBzeW1ib2xzLmggdGMuaCBcCi0Jb2JqLmggbGlzdGluZy5oIGJpZ251bS5oIGJpdF9maXguaCAkKElOQ0RJUikvbGliaWJlcnR5LmggYXNpbnRsLmgKLQotZ2FzcF9uZXdfU09VUkNFUyA9IGdhc3AuYyBtYWNyby5jIHNiLmMgaGFzaC5jCi1nYXNwX25ld19MREFERCA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExMSUJTKQotZ2FzcF9uZXdfREVQRU5ERU5DSUVTID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTERFUFMpCi0KLUVYUEVDVCA9IGBpZiBbIC1mICQke3Jvb3RtZX0vLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCi0gICAgICAgICAgZWNobyAkJHtyb290bWV9Ly4uL2V4cGVjdC9leHBlY3QgOyBcCi0gICAgICAgICAgZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IHRoZW4gXAotCQllY2hvICQke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgZWxzZSBlY2hvIHJ1bnRlc3Q7IFwKLQkgICBmaWAKLVJVTlRFU1RGTEFHUz0KLQotY2hlY2stREVKQUdOVTogc2l0ZS5leHAKLQlpZiBbIC1kIHRlc3RzdWl0ZSBdOyB0aGVuIFwKLQkgIHRydWU7IFwKLQllbHNlIFwKLQkgIG1rZGlyIHRlc3RzdWl0ZTsgXAotCWZpCi0Jcm0gLWYgdGVzdHN1aXRlL3NpdGUuZXhwCi0JY3Agc2l0ZS5leHAgdGVzdHN1aXRlL3NpdGUuZXhwCi0Jcm9vdG1lPWBwd2RgOyBleHBvcnQgcm9vdG1lOyBcCi0Jc3JjZGlyPWBjZCAke3NyY2Rpcn07IHB3ZGAgOyBleHBvcnQgc3JjZGlyIDsgXAotCUVYUEVDVD0ke0VYUEVDVH0gOyBleHBvcnQgRVhQRUNUIDsgXAotCWlmIFsgLWYgJCh0b3BfYnVpbGRkaXIpLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCi0JICBUQ0xfTElCUkFSWT1gY2QgJCh0b3Bfc3JjZGlyKS8uLi90Y2wvbGlicmFyeSAmJiBwd2RgOyBcCi0JICBleHBvcnQgVENMX0xJQlJBUlk7IFwKLQlmaTsgXAotCXJ1bnRlc3Q9JChSVU5URVNUKTsgXAotCWNkIHRlc3RzdWl0ZTsgXAotCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICQkcnVudGVzdCAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCR7c3JjZGlyfS90ZXN0c3VpdGUgXAotCQkkKFJVTlRFU1RGTEFHUyk7IFwKLQllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAotCWZpCi0KLSMgVGhlIGltcGxpY2l0IC5jLm8gcnVsZSBkb2Vzbid0IHdvcmsgZm9yIHRoZXNlLCBwZXJoYXBzIGJlY2F1c2Ugb2YKLSMgdGhlIHZhcmlhYmxlcywgb3IgcGVyaGFwcyBiZWNhdXNlIHRoZSBzb3VyY2VzIGFyZSBub3Qgb24gdnBhdGguCi0kKFRBUkdfQ1BVX08pOiAkKFRBUkdfQ1BVX0MpICQoVEFSR19DUFVfREVQX0B0YXJnZXRfY3B1X3R5cGVAKQotCSQoQ09NUElMRSkgLWMgJChUQVJHX0NQVV9DKQotJChBVE9GX1RBUkdfTyk6ICQoQVRPRl9UQVJHX0MpCi0JJChDT01QSUxFKSAtYyAkKEFUT0ZfVEFSR19DKQotCi0jIGVjb2ZmLmMgb25seSBoYXMgZnVsbCBkZXBlbmRlbmNpZXMgd2hlbiBFQ09GRl9ERUJVR0dJTkcgaXMgZGVmaW5lZCwKLSMgc28gdGhlIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHN0dWZmIGRvZXNuJ3Qgd29yay4KLWVjb2ZmLm8gOiBlY29mZi5jIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zeW0uaCBcCi0JJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oIFwKLQkkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oCi0KLSMgV2UgbmVlZCBhbGwgdGhlc2UgZXhwbGljaXQgcnVsZXMgZm9yIHRoZSBtdWx0aSBzdHVmZi4gIEJlY2F1c2Ugb2YKLSMgdGhlc2UgcnVsZXMsIHdlIGRvbid0IG5lZWQgb25lIGZvciBPQkpfRk9STUFUX08uCi0KLW9iai1hb3V0Lm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYwotb2JqLWJvdXQubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5jCi1vYmotY29mZi5vOiAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuYwotb2JqLWVjb2ZmLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5jCi1vYmotZWxmLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmMKLW9iai1ldmF4Lm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguYwotb2JqLWhwMzAwLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5jCi1vYmotaWVlZS5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotaWVlZS5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1pZWVlLmMKLW9iai1tdWx0aS5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotbXVsdGkuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotbXVsdGkuYwotb2JqLXNvbS5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5jCi1vYmotdm1zLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai12bXMuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmMKLQotZS1taXBzZWxmLm8gOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jCi1lLW1pcHNlY29mZi5vIDogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMKLWUtaTM4NmNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1pMzg2Y29mZi5jCi1lLWkzODZlbGYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYwotCi0jIFRoZSBtNjhrIG9wZXJhbmQgcGFyc2VyLgotCi1FWFRSQV9hc19uZXdfU09VUkNFUyA9IGNvbmZpZy9tNjhrLXBhcnNlLnkKLQotIyBJZiBtNjhrLXBhcnNlLnkgaXMgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LCB0aGVuIHlsd3JhcCB3aWxsIHVzZSBhbgotIyBhYnNvbHV0ZSBwYXRoIHdoZW4gaXQgaW52b2tlcyB5YWNjLCB3aGljaCB3aWxsIGNhdXNlIHlhY2MgdG8gcHV0IHRoZQotIyBhYnNvbHV0ZSBwYXRoIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiAgVGhhdCdzIGEgcGFpbiB3aGVuIGl0IGNvbWVzCi0jIHRvIGdlbmVyYXRpbmcgc25hcHNob3RzLCBiZWNhdXNlIGl0IGludHJvZHVjZXMgc3B1cmlvdXMgZGlmZnMuCi0jIFNpbmNlIHdoZW4gd2UgbWFrZSB0aGUgc25hcHNob3RzICQoc3JjZGlyKSA9ICIuIiwgd2UgY2hlY2sgZm9yIHRoYXQKLSMgY2FzZSBhbmQgaGFuZGxlIGl0IGRpZmZlcmVudGx5LiAgVGhpcyBtZWFucyB0aGF0IGFueWJvZHkgd2hvCi0jIGNvbmZpZ3VyZXMgd2l0aCAkKHNyY2RpcikgPSAiLiIgd2lsbCBoYXZlIHRvIHNldCB0aGVpciBwYXRoIGluIHRoZQotIyBkZWJ1Z2dlciBpZiB0aGV5IHdhbnQgdG8gZGVidWcgbTY4ay1wYXJzZS55LiAgVGhpcyBpcyBiYWQsIGJ1dCBvbgotIyB0aGUgb3RoZXIgaGFuZCBpdCdzIGdvb2QgdGhhdCBwZW9wbGUgd2hvIHVzZSB0aGUgcHJlYnVpbHQKLSMgbTY4ay1wYXJzZS5jIGRvbid0IGdldCBhIHNwdXJpb3VzIGFic29sdXRlIHBhdGguCi1tNjhrLXBhcnNlLmM6ICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS55Ci0JZj0kKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UueTsgXAotCWlmIFsgJCRmID0gIi4vY29uZmlnL202OGstcGFyc2UueSIgXTsgdGhlbiBcCi0JICBsbiAtcyBjb25maWcvbTY4ay1wYXJzZS55IC4gPiAvZGV2L251bGwgMj4vZGV2L251bGwgfHwgXAotCSAgIGxuIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgY3AgY29uZmlnL202OGstcGFyc2UueSAuID4vZGV2L251bGwgMj4vZGV2L251bGw7IFwKLQkgIGY9bTY4ay1wYXJzZS55OyBcCi0JZWxzZSB0cnVlOyBmaTsgXAotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJCRmIHkudGFiLmMgbTY4ay1wYXJzZS5jIC0tOyBcCi0JaWYgWyAkJGYgPSAibTY4ay1wYXJzZS55IiBdOyB0aGVuIFwKLQkgIHJtIC1mIG02OGstcGFyc2UueTsgXAotCWVsc2UgdHJ1ZTsgZmkKLW02OGstcGFyc2UubzogbTY4ay1wYXJzZS5jICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLSMgRG9uJ3QgbGV0IHRoZSAueS5oIHJ1bGUgY2xvYmJlciBtNjhrLXBhcnNlLmguCi1tNjhrLXBhcnNlLmg6IDsgQHRydWUKLSQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oOiA7IEB0cnVlCi0KLSMgVGhlIGluc3RydWN0aW9uIHRhYmxlIHNwZWNpZmljYXRpb24gbGV4aWNhbCBhbmFseXplciBhbmQgcGFyc2VyLgotCi1pdGJsLWxleC5jOiAkKHNyY2RpcikvaXRibC1sZXgubAotaXRibC1sZXgubzogaXRibC1sZXguYyBpdGJsLXBhcnNlLmgKLQotaXRibC1wYXJzZS5vOiBpdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oCi0KLWl0Ymwtb3BzLm86ICQoc3JjZGlyKS9pdGJsLW9wcy5jICQoc3JjZGlyKS9pdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotCi1pdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oOiAkKHNyY2RpcikvaXRibC1wYXJzZS55Ci0JJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkKHNyY2RpcikvaXRibC1wYXJzZS55IHkudGFiLmMgaXRibC1wYXJzZS5jIHkudGFiLmggaXRibC1wYXJzZS5oIC0tIC1kCi0KLSMgc3RhbmQtYWxvbmUgaXRibCBhc3NlbWJsZXIgJiBkaXNhc3NlbWJsZXIKLQotRVhUUkFfUFJPR1JBTVMgPSBpdGJsLXRlc3QKLWl0YmxfdGVzdF9TT1VSQ0VTID0gaXRibC1wYXJzZS55IGl0YmwtbGV4LmwKLWl0YmxfdGVzdF9MREFERCA9IGl0YmwtdG9wcy5vIGl0YmwtdGVzdC5vICQoR0FTTElCUykgQExFWExJQkAKLQotaXRibC10b3BzLm86ICQoc3JjZGlyKS9pdGJsLW9wcy5jICQoc3JjZGlyKS9pdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotCSQoQ09NUElMRSkgLW8gaXRibC10b3BzLm8gLURTVEFORF9BTE9ORSAtYyAkKHNyY2RpcikvaXRibC1vcHMuYwotCi1pdGJsLXRlc3QubzogJChzcmNkaXIpL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jICQoc3JjZGlyKS9pdGJsLW9wcy5oCi0JJChDT01QSUxFKSAtYyAtRFNUQU5EX0FMT05FICQoc3JjZGlyKS90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYwotCi0jIENHRU4gaW50ZXJmYWNlLgotCi1DR0VOX0NQVV9QUkVGSVggPSBAY2dlbl9jcHVfcHJlZml4QAotCi1jZ2VuLm86IGNnZW4uYyBjZ2VuLmggY2dlbi1kZXNjLmggc3Vic2Vncy5oIFwKLQkkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLQkkKHNyY2RpcikvLi4vb3Bjb2Rlcy8kKENHRU5fQ1BVX1BSRUZJWCktZGVzYy5oIFwKLQkkKHNyY2RpcikvLi4vb3Bjb2Rlcy8kKENHRU5fQ1BVX1BSRUZJWCktb3BjLmgKLQotIyBSZW1ha2UgdGhlIGluZm8gZmlsZXMuCi0KLU1PU1RMWUNMRUFORklMRVMgPSAkKFNUQUdFU1RVRkYpIGNvcmUgc3RhbXAtbWsuY29tIFwKLQl0ZXN0c3VpdGUvKi5vIHRlc3RzdWl0ZS8qLm91dCB0ZXN0c3VpdGUvZ2FzLmxvZyB0ZXN0c3VpdGUvZ2FzLnN1bSBcCi0JdGVzdHN1aXRlL3NpdGUuZXhwIHNpdGUuYmFrIHNpdGUuZXhwIHN0YWdlIHN0YWdlMSBzdGFnZTIKLQotQ0xFQU5GSUxFUyA9IGRlcC5zZWQgREVQVEMgREVQT0JKIERFUDIgREVQMSBERVBBIERFUCBERVBESVIKLQotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtbG9jYWwgaW5zdGFsbC1kYXRhLWxvY2FsCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1iaW5kaXIgaW5zdGFsbC1leGVjLXRvb2xkaXIKLQotaW5zdGFsbC1leGVjLWxvY2FsOiBpbnN0YWxsLWV4ZWMtYmluZGlyIEBpbnN0YWxsX3Rvb2xkaXJACi0KLWluc3RhbGwtZXhlYy1iaW5kaXI6ICQobm9pbnN0X1BST0dSQU1TKQotCSQobWtpbnN0YWxsZGlycykgJChiaW5kaXIpCi0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLWluc3RhbGwtZXhlYy10b29sZGlyOiAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKG1raW5zdGFsbGRpcnMpICQodG9vbGRpcikvYmluCi0Jbj1gZWNobyBhcyB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQlpZiBbICIkKGJpbmRpcikvJCRuJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgcm0gLWYgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCk7IFwKLQkgIGxuICQoYmluZGlyKS8kJG4kKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCBcCi0JICAgIHx8ICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pIGFzLW5ldyQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi9hcyQoRVhFRVhUKTsgXAotCWVsc2UgXAotCSAgdHJ1ZSA7IFwKLQlmaQotCi0jIFRoZXNlIGV4aXN0IGZvciBtYWludGVuYW5jZSBwdXJwb3Nlcy4KLQotLlBIT05ZOiBib290c3RyYXAgYm9vdHN0cmFwMiBib290c3RyYXAzIHN0YWdlMSBzdGFnZTIgc3RhZ2UzIGNvbXBhcmlzb24KLQotYm9vdHN0cmFwOiBhcy1uZXcKLQkkKE1BS0UpIHN0YWdlMQotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMSBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgc3RhZ2UyCi0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLWJvb3RzdHJhcDI6Ci0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UxIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBzdGFnZTIKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTIgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIGNvbXBhcmlzb24gYWdhaW5zdD1zdGFnZTIKLQotYm9vdHN0cmFwMzoKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTIgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIGNvbXBhcmlzb24gYWdhaW5zdD1zdGFnZTIKLQotIyBDb3B5IHRoZSBvYmplY3QgZmlsZXMgZnJvbSBhIHBhcnRpY3VsYXIgc3RhZ2UgaW50byBhIHN1YmRpcmVjdG9yeS4KLXN0YWdlMToKLQktbWtkaXIgc3RhZ2UxCi0JLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UxCi0JaWYgWyAtZiBzdGFnZTEvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UxL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTEgOyBsbiAtcyBhcy1uZXckKEVYRUVYVCkgYXMkKEVYRUVYVCkpIDsgZmkKLQotc3RhZ2UyOgotCS1ta2RpciBzdGFnZTIKLQktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTIKLQlpZiBbIC1mIHN0YWdlMi9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTIvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMiA7IGxuIC1zIGFzLW5ldyQoRVhFRVhUKSBhcyQoRVhFRVhUKSkgOyBmaQotCi1zdGFnZTM6Ci0JLW1rZGlyIHN0YWdlMwotCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMwotCWlmIFsgLWYgc3RhZ2UzL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMy9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UzIDsgbG4gLXMgYXMtbmV3IGFzJChFWEVFWFQpKSA7IGZpCi0KLWFnYWluc3Q9c3RhZ2UyCi0KLSMgVGhpcyBydWxlIGlzIGRlcml2ZWQgZnJvbSBjb3JyZXNwb25kaW5nIGNvZGUgaW4gdGhlIE1ha2VmaWxlLmluIGZvciBnY2MuCi0jIFRoZSAidGFpbCArMTZjIiBpcyB0byBieXBhc3MgaGVhZGVycyB3aGljaCBtYXkgaW5jbHVkZSB0aW1lc3RhbXBzIG9yCi0jIHRlbXBvcmFyeSBhc3NlbWJseSBmaWxlIG5hbWVzLgotY29tcGFyaXNvbjoKLQl4PTAgOyBcCi0JZm9yIGZpbGUgaW4gKi5vIDsgZG8gXAotCSAgdGFpbCArMTZjIC4vJCRmaWxlID4gdG1wLWZvbzE7IFwKLQkgIGlmIHRhaWwgKzE2YyAke2FnYWluc3R9LyQkZmlsZSA+IHRtcC1mb28yIDI+L2Rldi9udWxsIDsgdGhlbiBcCi0JICAgIGlmIGNtcCB0bXAtZm9vMSB0bXAtZm9vMiA7IHRoZW4gXAotCSAgICAgIHRydWUgOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGVjaG8gJCRmaWxlIGRpZmZlcnMgOyBcCi0JICAgICAgeD0xIDsgXAotCSAgICBmaSA7IFwKLQkgIGVsc2UgdHJ1ZTsgZmkgOyBcCi0JZG9uZSA7IFwKLQlleGl0ICQkeAotCS1ybSAtZiB0bXAtZm9vKgotCi0uUEhPTlk6IGRlLXN0YWdlMSBkZS1zdGFnZTIgZGUtc3RhZ2UzCi0KLWRlLXN0YWdlMToKLQktIChjZCBzdGFnZTEgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCi0JLSBybWRpciBzdGFnZTEKLQotZGUtc3RhZ2UyOgotCS0gKGNkIHN0YWdlMiA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKLQktIHJtZGlyIHN0YWdlMgotCi1kZS1zdGFnZTM6Ci0JLSAoY2Qgc3RhZ2UzIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQotCS0gcm1kaXIgc3RhZ2UzCi0KLSMgQXV0b21hdGljIGRlcGVuZGVuY3kgY29tcHV0YXRpb24uICBUaGlzIGlzIGEgcmVhbCBwYWluLCBiZWNhdXNlIHRoZQotIyBkZXBlbmRlbmNpZXMgY2hhbmdlIGJhc2VkIG9uIHRhcmdldF9jcHVfdHlwZSBhbmQgb2JqX2Zvcm1hdC4gIFdlCi0jIGN1cnJlbnRseSBpZ25vcmUgYW55IGRlcGVuZGVuY2llcyBjYXVzZWQgYnkgZW11bGF0aW9uIGZpbGVzLgotCi1ERVBfRklMRV9ERVBTID0gICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChUQVJHRVRfQ1BVX0NGSUxFUykgXAotCSQoVEFSR0VUX0NQVV9IRklMRVMpICQoT0JKX0ZPUk1BVF9DRklMRVMpICQoT0JKX0ZPUk1BVF9IRklMRVMpCi0KLURFUDogZGVwLnNlZCAkKERFUF9GSUxFX0RFUFMpIERFUFRDIERFUE9CSiBERVAyCi0Jcm0gLWYgREVQMQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JJChNQUtFKSBNS0RFUD0kKE1LREVQKSBzcmNkaXI9JCR7c3JjZGlyfSBWUEFUSD0kJHtzcmNkaXJ9IERFUDEKLQlybSAtcmYgREVQRElSCi0Jc2VkIC1mIGRlcC5zZWQgPCBERVAxID4gREVQQQotCXNlZCAtZiBkZXAuc2VkIDwgREVQVEMgPj4gREVQQQotCXNlZCAtZiBkZXAuc2VkIDwgREVQT0JKID4+IERFUEEKLQlzZWQgLWYgZGVwLnNlZCA8IERFUDIgPj4gREVQQQotCWVjaG8gJyQkKE9CSlMpOiAkJChERVBfQHRhcmdldCcnX2NwdV90eXBlQF9Ab2JqJydfZm9ybWF0QCknID4+IERFUEEKLQllY2hvICckJChUQVJHX0NQVV9PKTogJCQoREVQVENfQHRhcmdldCcnX2NwdV90eXBlQF9Ab2JqJydfZm9ybWF0QCknID4+IERFUEEKLQllY2hvICckJChPQkpfRk9STUFUX08pOiAkJChERVBPQkpfQHRhcmdldCcnX2NwdV90eXBlQF9Ab2JqJydfZm9ybWF0QCknID4+IERFUEEKLQllY2hvICcjIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVknID4+IERFUEEKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgREVQQSBERVAKLQotIyBUaGlzIHJ1bGUgbmVlZHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotREVQMTogJChDRklMRVMpICQoTVVMVElfQ0ZJTEVTKQotCWlmIFsgLWQgREVQRElSIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciBERVBESVI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCBERVBESVI7IFwKLQllY2hvICcnID4gdGFyZy1jcHUuaDsgXAotCWVjaG8gJycgPiBvYmotZm9ybWF0Lmg7IFwKLQllY2hvICcnID4gdGFyZy1lbnYuaDsgXAotCWVjaG8gJycgPiBpdGJsLWNwdS5oOyBcCi0JZWNobyAnJyA+IGl0YmwtcGFyc2UuaDsgXAotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQOyBcCi0JJChNS0RFUCkgLWYgREVQIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpICQ/Ci0Jc2VkIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyA8IERFUERJUi9ERVAgPiBERVAxCi0Jcm0gLWYgREVQRElSL0RFUAotCi0jIFdvcmsgb3V0IHRoZSBzcGVjaWFsIGRlcGVuZGVuY2llcyBmb3IgdGhlIHRjLSouYyBmaWxlcy4KLURFUFRDOiAkKFRBUkdFVF9DUFVfQ0ZJTEVTKQotCXJtIC1mIERFUFRDQQotCWlmIFsgLWQgREVQRElSIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciBERVBESVI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCBERVBESVI7IFwKLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IG9iai1mb3JtYXQuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0ZS1nZW5lcmljLmgiJyA+IHRhcmctZW52Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1jcHUuaDsgXAotCSAgICAgIGVjaG8gJycgPiBpdGJsLXBhcnNlLmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib3Bjb2Rlcy8nIiQke2N9IictZGVzYy5oIicgPiBjZ2VuLWRlc2MuaDsgXAotCSAgICAgIHJtIC1mIGR1bW15LmM7IFwKLQkgICAgICBjcCAkJHtzcmNkaXJ9L2NvbmZpZy90Yy0kJHtjfS5jIGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDsgXAotCSAgICAgICQoTUtERVApIC1mIERFUCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvREVQVENfJCR7Y31fJCR7b30gPS8iIFwKLQkJICAtZSAnMSwvRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUi9kJyBcCi0JCSAgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIFwKLQkJICAtZSAnL14kJC9kJyA8IERFUCA+PiAuLi9ERVBUQ0E7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JZWNobyAnREVQVENfaHBwYV9zb20gPSAkJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggc3Vic2Vncy5oIFwnID4+IERFUFRDQQotCWVjaG8gJyAgJCQoSU5DRElSKS9vYnN0YWNrLmggJCQoQkZERElSKS9saWJocHBhLmggXCcgPj4gREVQVENBCi0JZWNobyAnICAkJChJTkNESVIpL29wY29kZS9ocHBhLmggJCQoQkZERElSKS9zb20uaCcgPj4gREVQVENBCi0JIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdERVBUQ18nIiQke2N9IidfbXVsdGkgPSBcJyA+PiBERVBUQ0E7IFwKLQkgICAgZWNobyAnJCQoREVQVENfJyIkJHtjfSInX2NvZmYpIFwnID4+IERFUFRDQTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKERFUFRDXyciJCR7Y30iJ19lY29mZikgXCcgPj4gREVQVENBOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoREVQVENfJyIkJHtjfSInX2VsZiknID4+IERFUFRDQTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQltdiAtZiBERVBUQ0EgREVQVEMKLQotIyBXb3JrIG91dCB0aGUgc3BlY2lhbCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBvYmotKi5jIGZpbGVzLgotREVQT0JKOiAkKE9CSl9GT1JNQVRfQ0ZJTEVTKQotCXJtIC1mIERFUE9CSkEKLQlpZiBbIC1kIERFUERJUiBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgREVQRElSOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgREVQRElSOyBcCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1wYXJzZS5oOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICAgIGNwICQke3NyY2Rpcn0vY29uZmlnL29iai0kJHtvfS5jIGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDsgXAotCSAgICAgICQoTUtERVApIC1mIERFUCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvREVQT0JKXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCBERVAgPj4gLi4vREVQT0JKQTsgXAotCSAgICAgIHJtIC1mIGR1bW15LmM7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQllY2hvICdERVBPQkpfaHBwYV9zb20gPSAkJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmggc3Vic2Vncy5oIFwnID4+IERFUE9CSkEKLQllY2hvICcgICQkKElOQ0RJUikvb2JzdGFjay5oICQkKEJGRERJUikvbGliaHBwYS5oIFwnID4+IERFUE9CSkEKLQllY2hvICcgICQkKEJGRERJUikvc29tLmggICQkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwnID4+IERFUE9CSkEKLQllY2hvICcgICQkKElOQ0RJUikvYW91dC9zdGFiLmRlZicgPj4gREVQT0JKQQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnREVQT0JKXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IERFUE9CSkE7IFwKLQkgICAgZWNobyAnJCQoREVQT0JKXyciJCR7Y30iJ19jb2ZmKSBcJyA+PiBERVBPQkpBOyBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnJCQoREVQT0JKXyciJCR7Y30iJ19lY29mZikgXCcgPj4gREVQT0JKQTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKERFUE9CSl8nIiQke2N9IidfZWxmKScgPj4gREVQT0JKQTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQltdiAtZiBERVBPQkpBIERFUE9CSgotCi0jIFdvcmsgb3V0IHRoZSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggQ1BVL09CSiBjb21iaW5hdGlvbi4KLSMgTm90ZSB0aGF0IFNPTSBpcyBhIHNwZWNpYWwgY2FzZSwgYmVjYXVzZSBpdCBvbmx5IHdvcmtzIG5hdGl2ZS4KLURFUDI6ICQoVEFSR0VUX0NQVV9IRklMRVMpICQoT0JKX0ZPUk1BVF9IRklMRVMpCi0Jcm0gLWYgREVQMmEKLQlpZiBbIC1kIERFUERJUiBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgREVQRElSOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgREVQRElSOyBcCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBkdW1teS5jOyBcCi0JICAgICAgZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVA7IFwKLQkgICAgICAkKE1LREVQKSAtZiBERVAgLURCRkRfQVNTRU1CTEVSIC1JLiAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAkKERFUF9JTkNMVURFUykgZHVtbXkuYzsgXAotCSAgICAgIHNlZCAtZSAicy9kdW1teS5vOiBkdW1teS5jL0RFUF8kJHtjfV8kJHtvfSA9LyIgXAotCQkgIC1lICcxLC9ETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSL2QnIFwKLQkJICAtZSAnL0lGIFlPVSBQVVQgQU5ZVEhJTkcvLCQkZCcgXAotCQkgIC1lICcvXiQkL2QnIDwgREVQID4+IC4uL0RFUDJhOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JZWNobyAnREVQX2hwcGFfc29tID0gJCQoQkZERElSKS9zb20uaCcgPj4gREVQMmEKLQkjIFdlIGRvbid0IHRyeSB0byBoYW5kbGUgYWxsIG11bHRpIGNhc2VzLgotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgJChDUFVfTVVMVElfVkFMSUQpIFwKLQkgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgIG89ZWNvZmY7IFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGVjaG8gJ0RFUF8nIiQke2N9IidfbXVsdGkgPSBcJyA+PiBERVAyYTsgXAotCSAgICBlY2hvICckJChERVBfJyIkJHtjfSInX2NvZmYpIFwnID4+IERFUDJhOyBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnJCQoREVQXyciJCR7Y30iJ19lY29mZikgXCcgPj4gREVQMmE7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgICBlY2hvICckJChERVBfJyIkJHtjfSInX2VsZiknID4+IERFUDJhOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCW12IC1mIERFUDJhIERFUDIKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkIFwKLQkJLWUgInMhQElOQ0RJUkAhJCR7c3JjZGlyfS8uLi9pbmNsdWRlISIgXAotCQktZSAicyFAQkZERElSQCEkJHtzcmNkaXJ9Ly4uL2JmZCEiIFwKLQkJLWUgInMhQFNSQ0RJUkAhJCR7c3JjZGlyfSEiCi0KLWRlcDogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi0uUEhPTlk6IGRlcCBkZXAtaW4gZGVwLWFtCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLQotYXBwLm86IGFwcC5jCi1hcy5vOiBhcy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIG91dHB1dC1maWxlLmggXAotICBzYi5oIG1hY3JvLmgKLWF0b2YtZ2VuZXJpYy5vOiBhdG9mLWdlbmVyaWMuYwotYmlnbnVtLWNvcHkubzogYmlnbnVtLWNvcHkuYwotY29uZC5vOiBjb25kLmMgbWFjcm8uaCBzYi5oICQoSU5DRElSKS9vYnN0YWNrLmgKLWRlcGVuZC5vOiBkZXBlbmQuYwotZHdhcmYyZGJnLm86IGR3YXJmMmRiZy5jIGR3YXJmMmRiZy5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL2VsZi9kd2FyZjIuaAotZWNvZmYubzogZWNvZmYuYyBlY29mZi5oCi1laG9wdC5vOiBlaG9wdC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9lbGYvZHdhcmYyLmgKLWV4cHIubzogZXhwci5jICQoSU5DRElSKS9vYnN0YWNrLmgKLWZsb251bS1jb3B5Lm86IGZsb251bS1jb3B5LmMKLWZsb251bS1rb25zdC5vOiBmbG9udW0ta29uc3QuYwotZmxvbnVtLW11bHQubzogZmxvbnVtLW11bHQuYwotZnJhZ3MubzogZnJhZ3MuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaAotaGFzaC5vOiBoYXNoLmMgJChJTkNESVIpL29ic3RhY2suaAotaW5wdXQtZmlsZS5vOiBpbnB1dC1maWxlLmMgaW5wdXQtZmlsZS5oCi1pbnB1dC1zY3J1Yi5vOiBpbnB1dC1zY3J1Yi5jIGlucHV0LWZpbGUuaCBzYi5oCi1saXN0aW5nLm86IGxpc3RpbmcuYyBpbnB1dC1maWxlLmggc3Vic2Vncy5oCi1saXRlcmFsLm86IGxpdGVyYWwuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaAotbWFjcm8ubzogbWFjcm8uYyBzYi5oIG1hY3JvLmgKLW1lc3NhZ2VzLm86IG1lc3NhZ2VzLmMKLW91dHB1dC1maWxlLm86IG91dHB1dC1maWxlLmMgb3V0cHV0LWZpbGUuaAotcmVhZC5vOiByZWFkLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggc2IuaCBtYWNyby5oIFwKLSAgZWNvZmYuaAotc2Iubzogc2IuYyBzYi5oCi1zdGFicy5vOiBzdGFicy5jICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oIGVjb2ZmLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1zdWJzZWdzLm86IHN1YnNlZ3MuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaAotc3ltYm9scy5vOiBzeW1ib2xzLmMgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggXAotICBzdHJ1Yy1zeW1ib2wuaAotd3JpdGUubzogd3JpdGUuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBvdXRwdXQtZmlsZS5oCi1nYXNwLm86IGdhc3AuYyBzYi5oIG1hY3JvLmgKLWl0Ymwtb3BzLm86IGl0Ymwtb3BzLmMgaXRibC1vcHMuaCBpdGJsLXBhcnNlLmgKLWUtaTM4NmNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZjb2ZmLmMgZW11bC5oIFwKLSAgZW11bC10YXJnZXQuaAotZS1pMzg2ZWxmLm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2ZWxmLmMgZW11bC5oIGVtdWwtdGFyZ2V0LmgKLWUtbWlwc2Vjb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWNvZmYuYyBlbXVsLmggXAotICBlbXVsLXRhcmdldC5oCi1lLW1pcHNlbGYubzogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlbGYuYyBlbXVsLmggZW11bC10YXJnZXQuaAotCi1ERVBUQ19hMjlrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLURFUFRDX2EyOWtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYTI5ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvYTI5ay5oCi1ERVBUQ19hMjlrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oICQoSU5DRElSKS9vcGNvZGUvYTI5ay5oCi1ERVBUQ19hbHBoYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLURFUFRDX2FscGhhX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLURFUFRDX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotREVQVENfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotREVQVENfYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9hcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotREVQVENfYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oICQoSU5DRElSKS9lbGYvYXJjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1ERVBUQ19hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBUQ19hcm1fY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hcm0uaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaAotREVQVENfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLURFUFRDX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggXAotICAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLURFUFRDX2QxMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaCAkKElOQ0RJUikvZWxmL3BwYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotREVQVENfZDMwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaAotREVQVENfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi1ERVBUQ19mcjMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9zeW1jYXQuaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9mcjMwLWRlc2MuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtb3BjLmggXAotICBjZ2VuLmgKLURFUFRDX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9mcjMwLW9wYy5oIFwKLSAgY2dlbi5oCi1ERVBUQ19oODMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmgKLURFUFRDX2g4MzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaDgzMDAuaAotREVQVENfaDg1MDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvaDg1MDAtb3BjLmgKLURFUFRDX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2g4NTAwLW9wYy5oCi1ERVBUQ19ocHBhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChCRkRESVIpL2xpYmJmZC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9ocHBhLmgKLURFUFRDX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJiZmQuaCAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotREVQVENfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9pMzg2LmgKLURFUFRDX2kzODZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTM4Ni5oCi1ERVBUQ19pMzg2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pMzg2LmgKLURFUFRDX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2k4NjAuaAotREVQVENfaTg2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2k4NjAuaAotREVQVENfaTg2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCAkKElOQ0RJUikvb3Bjb2RlL2k4NjAuaAotREVQVENfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2k5NjAuaAotREVQVENfaTk2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pOTYwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2k5NjAuaAotREVQVENfaTk2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9pOTYwLmgKLURFUFRDX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCi0gIGNnZW4uaAotREVQVENfbTMycl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9zeW1jYXQuaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tMzJyLWRlc2MuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItb3BjLmggXAotICBjZ2VuLmgKLURFUFRDX202OGtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi1ERVBUQ19tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi1ERVBUQ19tNjhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29wY29kZS9tNjhrLmggJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmggXAotICAkKElOQ0RJUikvZWxmL202OGsuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1ERVBUQ19tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuaCAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggXAotICAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi1ERVBUQ19tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvY29uZmlnL204OGstb3Bjb2RlLmgKLURFUFRDX204OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvY29uZmlnL204OGstb3Bjb2RlLmgKLURFUFRDX21jb3JlX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL21jb3JlLW9wYy5oCi1ERVBUQ19tY29yZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tY29yZS1vcGMuaCBcCi0gICQoSU5DRElSKS9lbGYvbWNvcmUuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1ERVBUQ19taXBzX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBpdGJsLW9wcy5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oCi1ERVBUQ19taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIFwKLSAgaXRibC1vcHMuaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLURFUFRDX21pcHNfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9taXBzLmggXAotICBpdGJsLW9wcy5oCi1ERVBUQ19taXBzX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9taXBzLmggaXRibC1vcHMuaCBcCi0gICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLURFUFRDX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKLURFUFRDX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaAotREVQVENfbW4xMDMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaAotREVQVENfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi1ERVBUQ19uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBUQ19uczMya19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9uczMyay5oICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUFRDX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBUQ19wal9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcGouaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9wai5oCi1ERVBUQ19wal9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBqLmggJChJTkNESVIpL29wY29kZS9wai5oCi1ERVBUQ19wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oCi1ERVBUQ19wcGNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmggJChJTkNESVIpL2VsZi9wcGMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLURFUFRDX3NoX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zaC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3NoLW9wYy5oCi1ERVBUQ19zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9zaC1vcGMuaAotREVQVENfc3BhcmNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLURFUFRDX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAotREVQVENfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oICQoSU5DRElSKS9lbGYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLURFUFRDX3RhaG9lX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLURFUFRDX3RhaG9lX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotREVQVENfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLURFUFRDX3RpYzMwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotREVQVENfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi1ERVBUQ190aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi1ERVBUQ190aWM4MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljODAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmgKLURFUFRDX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmgKLURFUFRDX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi1ERVBUQ192YXhfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi1ERVBUQ192YXhfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLURFUFRDX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLURFUFRDX3c2NV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3c2NS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3c2NS1vcGMuaAotREVQVENfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy93NjUtb3BjLmgKLURFUFRDX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92ODUwLmgKLURFUFRDX3Y4NTBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaAotREVQVENfejhrX2NvZmYgPSAkKHNyY2RpcikvLi4vb3Bjb2Rlcy96OGstb3BjLmggJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvejhrLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBUQ196OGtfZWxmID0gJChzcmNkaXIpLy4uL29wY29kZXMvejhrLW9wYy5oICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oIFwKLSAgJChCRkRESVIpL2VsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmgKLURFUFRDX2hwcGFfc29tID0gJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oIFwKLSAgJChCRkRESVIpL3NvbS5oCi1ERVBUQ19pMzg2X211bHRpID0gJChERVBUQ19pMzg2X2NvZmYpICQoREVQVENfaTM4Nl9lbGYpCi1ERVBUQ19taXBzX211bHRpID0gJChERVBUQ19taXBzX2NvZmYpICQoREVQVENfbWlwc19lY29mZikgXAotICAkKERFUFRDX21pcHNfZWxmKQotREVQT0JKX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl9hMjlrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX2FscGhhX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoQkZERElSKS9saWJlY29mZi5oCi1ERVBPQkpfYWxwaGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX2FscGhhX2V2YXggPSAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCi1ERVBPQkpfYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9hcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfYXJtX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl9hcm1fY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hcm0uaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX2FybV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9kMTB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfZDMwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX2QzMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9mcjMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9oODMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX2g4MzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfaDg1MDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9oODUwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX2kzODZfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl9pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX2kzODZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfaTg2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfaTk2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfbTMycl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX20zMnJfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX202OGtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX202OGtfaHAzMDAgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmMgJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl9tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX204OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX21jb3JlX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfbWNvcmVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9taXBzX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1ERVBPQkpfbWlwc19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX21pcHNfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKEJGRERJUikvbGliZWNvZmYuaAotREVQT0JKX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfbW4xMDIwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9tbjEwMzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl9uczMya19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9uczMya19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX3BqX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wai5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX3BqX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcGouaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfcHBjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2MDAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9wcGNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl90YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl90YWhvZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX3RpYzMwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfdGljMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl90aWM4MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljODAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1ERVBPQkpfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLURFUE9CSl92YXhfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl92YXhfdm1zID0gJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotREVQT0JKX3c2NV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3c2NS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1ERVBPQkpfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotREVQT0JKX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLURFUE9CSl92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl96OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotREVQT0JKX3o4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLURFUE9CSl9ocHBhX3NvbSA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvc29tLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1ERVBPQkpfaTM4Nl9tdWx0aSA9ICQoREVQT0JKX2kzODZfY29mZikgJChERVBPQkpfaTM4Nl9lbGYpCi1ERVBPQkpfbWlwc19tdWx0aSA9ICQoREVQT0JKX21pcHNfY29mZikgJChERVBPQkpfbWlwc19lY29mZikgXAotICAkKERFUE9CSl9taXBzX2VsZikKLURFUF9hMjlrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9hMjlrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmgKLURFUF9hbHBoYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotREVQX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAotREVQX2FscGhhX2V2YXggPSAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCi1ERVBfYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmgKLURFUF9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYXJtX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYXJtLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9hcm1fZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaAotREVQX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaAotREVQX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaAotREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfZnIzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaAotREVQX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oCi1ERVBfaDg1MDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9oODUwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmgKLURFUF9ocHBhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotREVQX2kzODZfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2kzODZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaAotREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2k4NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaTg2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaAotREVQX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaAotREVQX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaTk2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaAotREVQX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbTMycl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaAotREVQX202OGtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaAotREVQX202OGtfaHAzMDAgPSAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaAotREVQX21jb3JlX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbWNvcmVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oCi1ERVBfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbWlwc19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9taXBzX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmgKLURFUF9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmgKLURFUF9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmgKLURFUF9uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9uczMya19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmgKLURFUF9wal9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcGouaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfcGpfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wai5oCi1ERVBfcHBjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2MDAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9wcGNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaAotREVQX3NoX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zaC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfc2hfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oCi1ERVBfc3BhcmNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3NwYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaAotREVQX3RhaG9lX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdGFob2VfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaAotREVQX3RpYzMwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmgKLURFUF90aWM4MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljODAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaAotREVQX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF92YXhfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF92YXhfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaAotREVQX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotREVQX3c2NV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3c2NS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmgKLURFUF92ODUwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3Y4NTBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmgKLURFUF96OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3o4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oCi1ERVBfaHBwYV9zb20gPSAkKEJGRERJUikvc29tLmgKLURFUF9pMzg2X211bHRpID0gJChERVBfaTM4Nl9jb2ZmKSAkKERFUF9pMzg2X2VsZikKLURFUF9taXBzX211bHRpID0gJChERVBfbWlwc19jb2ZmKSAkKERFUF9taXBzX2Vjb2ZmKSBcCi0gICQoREVQX21pcHNfZWxmKQotJChPQkpTKTogJChERVBfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQotJChUQVJHX0NQVV9PKTogJChERVBUQ19AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCi0kKE9CSl9GT1JNQVRfTyk6ICQoREVQT0JKX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQpkaWZmIC0tZ2l0IGEvZ2FzL01ha2VmaWxlLmluIGIvZ2FzL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWE1Mzc2Li4wMDAwMDAwCi0tLSBhL2dhcy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI1MzIgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQUxMX09CSl9ERVBTID0gQEFMTF9PQkpfREVQU0AKLUFTID0gQEFTQAotQkZETElCID0gQEJGRExJQkAKLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUNDID0gQENDQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotR0RCSU5JVCA9IEBHREJJTklUQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1JTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTEQgPSBATERACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5NID0gQE5NQAotT1BDT0RFU19MSUIgPSBAT1BDT0RFU19MSUJACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1VU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKLVVTRV9OTFMgPSBAVVNFX05MU0AKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRSA9IEBVU0VfU1lNQk9MX1VOREVSU0NPUkVACi1WRVJTSU9OID0gQFZFUlNJT05ACi1hdG9mID0gQGF0b2ZACi1jZ2VuX2NwdV9wcmVmaXggPSBAY2dlbl9jcHVfcHJlZml4QAotZXh0cmFfb2JqZWN0cyA9IEBleHRyYV9vYmplY3RzQAotaW5zdGFsbF90b29sZGlyID0gQGluc3RhbGxfdG9vbGRpckAKLWwgPSBAbEAKLW9ial9mb3JtYXQgPSBAb2JqX2Zvcm1hdEAKLXRhcmdldF9jcHVfdHlwZSA9IEB0YXJnZXRfY3B1X3R5cGVACi10ZV9maWxlID0gQHRlX2ZpbGVACi0KLUlOVExMSUJTID0gQElOVExMSUJTQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzIGRlamFnbnUKLQotU1VCRElSUyA9IGRvYyBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MLi4vYmlzb24vYmlzb24gOyBlbHNlIGVjaG8gYmlzb24gLXkgOyBmaWAKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7ICBlbHNlIGVjaG8gZmxleCA7IGZpYAotCi1NS0RFUCA9ICQke3NyY2Rpcn0vLi4vbWtkZXAKLQotVEFSR19DUFUgPSBAdGFyZ2V0X2NwdV90eXBlQAotVEFSR19DUFVfQyA9ICQoc3JjZGlyKS9jb25maWcvdGMtQHRhcmdldF9jcHVfdHlwZUAuYwotVEFSR19DUFVfTyA9IHRjLUB0YXJnZXRfY3B1X3R5cGVALm8KLVRBUkdfQ1BVX0ggPSAkKHNyY2RpcikvY29uZmlnL3RjLUB0YXJnZXRfY3B1X3R5cGVALmgKLU9CSl9GT1JNQVRfQyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLUBvYmpfZm9ybWF0QC5jCi1PQkpfRk9STUFUX08gPSBvYmotQG9ial9mb3JtYXRALm8KLU9CSl9GT1JNQVRfSCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLUBvYmpfZm9ybWF0QC5oCi1UQVJHX0VOVl9IID0gJChzcmNkaXIpL2NvbmZpZy90ZS1AdGVfZmlsZUAuaAotQVRPRl9UQVJHX0MgPSAkKHNyY2RpcikvY29uZmlnL2F0b2YtQGF0b2ZALmMKLUFUT0ZfVEFSR19PID0gYXRvZi1AYXRvZkAubwotCi0jIHVzZSBAdGFyZ2V0X2NwdV90eXBlQCBmb3IgcmVmZXJpbmcgdG8gY29uZmlndXJlZCB0YXJnZXQgbmFtZQotSVRfSERSUyA9IGl0YmwtcGFyc2UuaCAkKHNyY2RpcikvaXRibC1vcHMuaCAKLUlUX1NSQ1MgPSBpdGJsLXBhcnNlLmMgaXRibC1sZXguYyAkKHNyY2RpcikvaXRibC1vcHMuYwotSVRfREVQUyA9ICQoc3JjZGlyKS9pdGJsLXBhcnNlLnkgJChzcmNkaXIpL2l0YmwtbGV4LmwgJChzcmNkaXIpL2NvbmZpZy9pdGJsLUB0YXJnZXRfY3B1X3R5cGVALmgKLUlUX09CSlMgPSBpdGJsLXBhcnNlLm8gaXRibC1sZXgubyBpdGJsLW9wcy5vCi0KLSMgQ1BVIHR5cGVzLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uCi0KLUNQVV9UWVBFUyA9IFwKLQlhMjlrIFwKLQlhbHBoYSBcCi0JYXJjIFwKLQlhcm0gXAotCWQxMHYgXAotCWQzMHYgXAotCWZyMzAgXAotCWg4MzAwIFwKLQloODUwMCBcCi0JaHBwYSBcCi0JaTM4NiBcCi0JaTg2MCBcCi0JaTk2MCBcCi0JbTMyciBcCi0JbTY4ayBcCi0JbTg4ayBcCi0JbWNvcmUgXAotCW1pcHMgXAotCW1uMTAyMDAgXAotCW1uMTAzMDAgXAotCW5zMzJrIFwKLQlwaiBcCi0JcHBjIFwKLQlzaCBcCi0Jc3BhcmMgXAotCXRhaG9lIFwKLQl0aWMzMCBcCi0JdGljODAgXAotCXZheCBcCi0JdzY1IFwKLQl2ODUwIFwKLQl6OGsKLQotCi0jIE9iamVjdCBmb3JtYXQgdHlwZXMuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLSMgV2UgZGVsaWJlcmF0ZWx5IG9taXQgc29tLCBzaW5jZSBpdCBkb2VzIG5vdCB3b3JrIGFzIGEgY3Jvc3MgYXNzZW1ibGVyLgotCi1PQkpfRk9STUFUUyA9IFwKLQlhb3V0IFwKLQlib3V0IFwKLQljb2ZmIFwKLQllY29mZiBcCi0JZWxmIFwKLQlldmF4IFwKLQlocDMwMCBcCi0JaWVlZSBcCi0Jdm1zCi0KLQotIyBUaGlzIGlzIGFuIHNoIGNhc2Ugd2hpY2ggc2V0cyB2YWxpZCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgQ1BVCi0jIHR5cGUgaW4gdGhlIHNoZWxsIHZhcmlhYmxlIGMgYW5kIHRoZSBPUyB0eXBlIGluIHRoZSBzaGVsbCB2YXJpYWJsZSBvCi0jIGFyZSBzdXBwb3J0ZWQuICBUaGlzIGhlbHBzIGN1dHMgZG93biBvbiB0aGUgYW1vdW50IG9mIGRlcGVuZGVuY3kKLSMgaW5mb3JtYXRpb24uCi0KLUNQVV9PQkpfVkFMSUQgPSBcCi0JdmFsaWQ9IDsgXAotCWNhc2UgJCRvIGluIFwKLQlhb3V0KSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBhMjlrIHwgYXJtIHwgaTM4NiB8IGk4NjAgfCBtNjhrIHwgbWlwcyB8IG5zMzJrIHwgc3BhcmMgfCB0YWhvZSB8IHRpYzMwIHwgdmF4KSBcCi0JICAgIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQlib3V0KSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBpOTYwKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JY29mZikgdmFsaWQ9eWVzIDs7IFwKLQllY29mZikgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgbWlwcyB8IGFscGhhKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JZWxmKSB2YWxpZD15ZXMgOzsgXAotCWV2YXgpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIGFscGhhKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JaHAzMDApIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIG02OGspIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQl2bXMpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIHZheCkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWVzYWM7Ci0KLQotIyBUaGlzIGlzIGxpa2UgQ1BVX09CSl9WQUxJRCwgZm9yIHRoZSBvYmo9bXVsdGkgY2FzZS4KLQotQ1BVX01VTFRJX1ZBTElEID0gXAotCXZhbGlkPSA7IFwKLQljYXNlICQkYyBpbiBcCi0JaTM4NiB8IG1pcHMpIHZhbGlkPXllcyA7OyBcCi0JZXNhYzsKLQotCi0jIFJlZ3VsYXIgc291cmNlIGZpbGVzLgotCi1HQVNfQ0ZJTEVTID0gXAotCWFwcC5jIFwKLQlhcy5jIFwKLQlhdG9mLWdlbmVyaWMuYyBcCi0JYmlnbnVtLWNvcHkuYyBcCi0JY29uZC5jIFwKLQlkZXBlbmQuYyBcCi0JZHdhcmYyZGJnLmMgXAotCWVjb2ZmLmMgXAotCWVob3B0LmMgXAotCWV4cHIuYyBcCi0JZmxvbnVtLWNvcHkuYyBcCi0JZmxvbnVtLWtvbnN0LmMgXAotCWZsb251bS1tdWx0LmMgXAotCWZyYWdzLmMgXAotCWhhc2guYyBcCi0JaW5wdXQtZmlsZS5jIFwKLQlpbnB1dC1zY3J1Yi5jIFwKLQlsaXN0aW5nLmMgXAotCWxpdGVyYWwuYyBcCi0JbWFjcm8uYyBcCi0JbWVzc2FnZXMuYyBcCi0Jb3V0cHV0LWZpbGUuYyBcCi0JcmVhZC5jIFwKLQlzYi5jIFwKLQlzdGFicy5jIFwKLQlzdWJzZWdzLmMgXAotCXN5bWJvbHMuYyBcCi0Jd3JpdGUuYwotCi0KLUNGSUxFUyA9ICQoR0FTX0NGSUxFUykgZ2FzcC5jIGl0Ymwtb3BzLmMKLQotSEZJTEVTID0gXAotCWFzLmggXAotCWFzaW50bC5oIFwKLQliaWdudW0uaCBcCi0JYml0X2ZpeC5oIFwKLQljZ2VuLmggXAotCWR3YXJmMmRiZy5oIFwKLQllY29mZi5oIFwKLQllbXVsLXRhcmdldC5oIFwKLQllbXVsLmggXAotCWV4cHIuaCBcCi0JZmxvbnVtLmggXAotCWZyYWdzLmggXAotCWhhc2guaCBcCi0JaW5wdXQtZmlsZS5oIFwKLQlpdGJsLW9wcy5oIFwKLQlsaXN0aW5nLmggXAotCW1hY3JvLmggXAotCW9iai5oIFwKLQlvdXRwdXQtZmlsZS5oIFwKLQlyZWFkLmggXAotCXNiLmggXAotCXN0cnVjLXN5bWJvbC5oIFwKLQlzdWJzZWdzLmggXAotCXN5bWJvbHMuaCBcCi0JdGMuaCBcCi0Jd3JpdGUuaAotCi0KLSMgQ1BVIGZpbGVzIGluIGNvbmZpZy4KLQotVEFSR0VUX0NQVV9DRklMRVMgPSBcCi0JY29uZmlnL3RjLWEyOWsuYyBcCi0JY29uZmlnL3RjLWFscGhhLmMgXAotCWNvbmZpZy90Yy1hcmMuYyBcCi0JY29uZmlnL3RjLWFybS5jIFwKLQljb25maWcvdGMtZDEwdi5jIFwKLQljb25maWcvdGMtZDMwdi5jIFwKLQljb25maWcvdGMtZnIzMC5jIFwKLQljb25maWcvdGMtaDgzMDAuYyBcCi0JY29uZmlnL3RjLWg4NTAwLmMgXAotCWNvbmZpZy90Yy1ocHBhLmMgXAotCWNvbmZpZy90Yy1pMzg2LmMgXAotCWNvbmZpZy90Yy1pODYwLmMgXAotCWNvbmZpZy90Yy1pOTYwLmMgXAotCWNvbmZpZy90Yy1tMzJyLmMgXAotCWNvbmZpZy90Yy1tNjhrLmMgXAotCWNvbmZpZy90Yy1tODhrLmMgXAotCWNvbmZpZy90Yy1tY29yZS5jIFwKLQljb25maWcvdGMtbWlwcy5jIFwKLQljb25maWcvdGMtbW4xMDIwMC5jIFwKLQljb25maWcvdGMtbW4xMDMwMC5jIFwKLQljb25maWcvdGMtbnMzMmsuYyBcCi0JY29uZmlnL3RjLXBqLmMgXAotCWNvbmZpZy90Yy1wcGMuYyBcCi0JY29uZmlnL3RjLXNoLmMgXAotCWNvbmZpZy90Yy1zcGFyYy5jIFwKLQljb25maWcvdGMtdGFob2UuYyBcCi0JY29uZmlnL3RjLXRpYzMwLmMgXAotCWNvbmZpZy90Yy10aWM4MC5jIFwKLQljb25maWcvdGMtdmF4LmMgXAotCWNvbmZpZy90Yy13NjUuYyBcCi0JY29uZmlnL3RjLXY4NTAuYyBcCi0JY29uZmlnL3RjLXo4ay5jCi0KLQotVEFSR0VUX0NQVV9IRklMRVMgPSBcCi0JY29uZmlnL3RjLWEyOWsuaCBcCi0JY29uZmlnL3RjLWFscGhhLmggXAotCWNvbmZpZy90Yy1hcmMuaCBcCi0JY29uZmlnL3RjLWFybS5oIFwKLQljb25maWcvdGMtZDEwdi5oIFwKLQljb25maWcvdGMtZDMwdi5oIFwKLQljb25maWcvdGMtZnIzMC5oIFwKLQljb25maWcvdGMtaDgzMDAuaCBcCi0JY29uZmlnL3RjLWg4NTAwLmggXAotCWNvbmZpZy90Yy1ocHBhLmggXAotCWNvbmZpZy90Yy1pMzg2LmggXAotCWNvbmZpZy90Yy1pODYwLmggXAotCWNvbmZpZy90Yy1pOTYwLmggXAotCWNvbmZpZy90Yy1tMzJyLmggXAotCWNvbmZpZy90Yy1tNjhrLmggXAotCWNvbmZpZy90Yy1tODhrLmggXAotCWNvbmZpZy90Yy1tY29yZS5oIFwKLQljb25maWcvdGMtbWlwcy5oIFwKLQljb25maWcvdGMtbW4xMDIwMC5oIFwKLQljb25maWcvdGMtbW4xMDMwMC5oIFwKLQljb25maWcvdGMtbnMzMmsuaCBcCi0JY29uZmlnL3RjLXBqLmggXAotCWNvbmZpZy90Yy1wcGMuaCBcCi0JY29uZmlnL3RjLXNoLmggXAotCWNvbmZpZy90Yy1zcGFyYy5oIFwKLQljb25maWcvdGMtdGFob2UuaCBcCi0JY29uZmlnL3RjLXRpYzMwLmggXAotCWNvbmZpZy90Yy10aWM4MC5oIFwKLQljb25maWcvdGMtdmF4LmggXAotCWNvbmZpZy90Yy13NjUuaCBcCi0JY29uZmlnL3RjLXY4NTAuaCBcCi0JY29uZmlnL3RjLXo4ay5oCi0KLQotIyBPQkogZmlsZXMgaW4gY29uZmlnCi0KLU9CSl9GT1JNQVRfQ0ZJTEVTID0gXAotCWNvbmZpZy9vYmotYW91dC5jIFwKLQljb25maWcvb2JqLWJvdXQuYyBcCi0JY29uZmlnL29iai1jb2ZmLmMgXAotCWNvbmZpZy9vYmotZWNvZmYuYyBcCi0JY29uZmlnL29iai1lbGYuYyBcCi0JY29uZmlnL29iai1ldmF4LmMgXAotCWNvbmZpZy9vYmotaHAzMDAuYyBcCi0JY29uZmlnL29iai1pZWVlLmMgXAotCWNvbmZpZy9vYmotc29tLmMgXAotCWNvbmZpZy9vYmotdm1zLmMKLQotCi1PQkpfRk9STUFUX0hGSUxFUyA9IFwKLQljb25maWcvb2JqLWFvdXQuaCBcCi0JY29uZmlnL29iai1ib3V0LmggXAotCWNvbmZpZy9vYmotY29mZi5oIFwKLQljb25maWcvb2JqLWVjb2ZmLmggXAotCWNvbmZpZy9vYmotZWxmLmggXAotCWNvbmZpZy9vYmotZXZheC5oIFwKLQljb25maWcvb2JqLWhwMzAwLmggXAotCWNvbmZpZy9vYmotaWVlZS5oIFwKLQljb25maWcvb2JqLXNvbS5oIFwKLQljb25maWcvb2JqLXZtcy5oCi0KLQotIyBFbXVsYXRpb24gaGVhZGVyIGZpbGVzIGluIGNvbmZpZwotCi1UQVJHX0VOVl9IRklMRVMgPSBcCi0JY29uZmlnL3RlLTM4NmJzZC5oIFwKLQljb25maWcvdGUtYXV4LmggXAotCWNvbmZpZy90ZS1kZWx0YS5oIFwKLQljb25maWcvdGUtZGVsdDg4LmggXAotCWNvbmZpZy90ZS1kcHgyLmggXAotCWNvbmZpZy90ZS1keW5peC5oIFwKLQljb25maWcvdGUtZXBvYy1wZS5oIFwKLQljb25maWcvdGUtZ2VuZXJpYy5oIFwKLQljb25maWcvdGUtZ28zMi5oIFwKLQljb25maWcvdGUtaHAzMDAuaCBcCi0JY29uZmlnL3RlLWhwcGEuaCBcCi0JY29uZmlnL3RlLWkzODZhaXguaCBcCi0JY29uZmlnL3RlLWljOTYwLmggXAotCWNvbmZpZy90ZS1saW51eC5oIFwKLQljb25maWcvdGUtbG5ld3MuaCBcCi0JY29uZmlnL3RlLWx5bnguaCBcCi0JY29uZmlnL3RlLW1hY2guaCBcCi0JY29uZmlnL3RlLW1hY29zLmggXAotCWNvbmZpZy90ZS1tdWx0aS5oIFwKLQljb25maWcvdGUtbmJzZC5oIFwKLQljb25maWcvdGUtbmJzZDUzMi5oIFwKLQljb25maWcvdGUtcGM1MzJtYWNoLmggXAotCWNvbmZpZy90ZS1wZS5oIFwKLQljb25maWcvdGUtcHBjbncuaCBcCi0JY29uZmlnL3RlLXBzb3MuaCBcCi0JY29uZmlnL3RlLXJpc2NpeC5oIFwKLQljb25maWcvdGUtc3BhcmNhb3V0LmggXAotCWNvbmZpZy90ZS1zdW4zLmggXAotCWNvbmZpZy90ZS1zdnI0LmggXAotCWNvbmZpZy90ZS1zeXN2MzIuaAotCi0KLSMgTXVsdGkgZmlsZXMgaW4gY29uZmlnCi0KLU1VTFRJX0NGSUxFUyA9IFwKLQljb25maWcvZS1pMzg2Y29mZi5jIFwKLQljb25maWcvZS1pMzg2ZWxmLmMgXAotCWNvbmZpZy9lLW1pcHNlY29mZi5jIFwKLQljb25maWcvZS1taXBzZWxmLmMKLQotCi1DT05GSUdfT0JKUyA9IFwKLQkkKFRBUkdfQ1BVX08pIFwKLQkkKE9CSl9GT1JNQVRfTykgXAotCSQoQVRPRl9UQVJHX08pIFwKLQkkKGV4dHJhX29iamVjdHMpCi0KLQotR0VORVJJQ19PQkpTID0gXAotCWFwcC5vIFwKLQlhcy5vIFwKLQlhdG9mLWdlbmVyaWMubyBcCi0JYmlnbnVtLWNvcHkubyBcCi0JY29uZC5vIFwKLQlkZXBlbmQubyBcCi0JZHdhcmYyZGJnLm8gXAotCWVob3B0Lm8gXAotCWV4cHIubyBcCi0JZmxvbnVtLWtvbnN0Lm8gXAotCWZsb251bS1jb3B5Lm8gXAotCWZsb251bS1tdWx0Lm8gXAotCWZyYWdzLm8gXAotCWhhc2gubyBcCi0JaW5wdXQtZmlsZS5vIFwKLQlpbnB1dC1zY3J1Yi5vIFwKLQlsaXRlcmFsLm8gXAotCW1lc3NhZ2VzLm8gXAotCW91dHB1dC1maWxlLm8gXAotCXJlYWQubyBcCi0Jc3Vic2Vncy5vIFwKLQlzeW1ib2xzLm8gXAotCXdyaXRlLm8gXAotCWxpc3RpbmcubyBcCi0JZWNvZmYubyBcCi0Jc3RhYnMubyBcCi0Jc2IubyBcCi0JbWFjcm8ubwotCi0KLU9CSlMgPSAkKENPTkZJR19PQkpTKSAkKEdFTkVSSUNfT0JKUykKLQotUE9URklMRVMgPSAkKE1VTFRJX0NGSUxFUykgJChUQVJHRVRfRU5WX0hGSUxFUykgJChPQkpfRk9STUFUX0hGSUxFUykgXAotCSQoT0JKX0ZPUk1BVF9DRklMRVMpICQoVEFSR0VUX0NQVV9IRklMRVMpICQoVEFSR0VUX0NQVV9DRklMRVMpIFwKLQkkKEhGSUxFUykgJChDRklMRVMpICQoR0FTX0NGSUxFUykKLQotCi1ub2luc3RfUFJPR1JBTVMgPSBhcy1uZXcgZ2FzcC1uZXcKLW5vaW5zdF9TQ1JJUFRTID0gJChHREJJTklUKQotRVhUUkFfU0NSSVBUUyA9IC5nZGJpbml0Ci0KLUVYVFJBX0RJU1QgPSBtYWtlLWdhcy5jb20KLQotRElTVFNUVUZGID0gbWFrZS1nYXMuY29tIG02OGstcGFyc2UuYyBpdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oIGl0YmwtbGV4LmMKLQotRElTVENMRUFORklMRVMgPSB0YXJnLWNwdS5oIG9iai1mb3JtYXQuaCB0YXJnLWVudi5oIGl0YmwtY3B1LmggY2dlbi1kZXNjLmgKLQotIyBOb3cgZmlndXJlIG91dCBmcm9tIHRob3NlIHZhcmlhYmxlcyBob3cgdG8gY29tcGlsZSBhbmQgbGluay4KLQotQkFTRURJUiA9ICQoc3JjZGlyKS8uLgotQkZERElSID0gJChCQVNFRElSKS9iZmQKLUlOQ0RJUiA9ICQoQkFTRURJUikvaW5jbHVkZQotCi0jIFRoaXMgaXMgdGhlIHZhcmlhYmxlIGFjdHVhbGx5IHVzZWQgd2hlbiB3ZSBjb21waWxlLgotIyBTcGVjaWZ5IHRoZSBkaXJlY3RvcmllcyB0byBiZSBzZWFyY2hlZCBmb3IgaGVhZGVyIGZpbGVzLgotIyBCb3RoIC4gYW5kIHNyY2RpciBhcmUgdXNlZCwgaW4gdGhhdCBvcmRlciwKLSMgc28gdGhhdCB0bS5oIGFuZCBjb25maWcuaCB3aWxsIGJlIGZvdW5kIGluIHRoZSBjb21waWxhdGlvbgotIyBzdWJkaXJlY3RvcnkgcmF0aGVyIHRoYW4gaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChzcmNkaXIpL2NvbmZpZyAtSSQoSU5DRElSKSAtSSQoc3JjZGlyKS8uLiAtSSQoQkZERElSKSAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLSMgVGhpcyBzaG91bGQgYmUgcGFyYWxsZWwgdG8gSU5DTFVERVMsIGJ1dCBzaG91bGQgcmVwbGFjZSAkKHNyY2RpcikKLSMgd2l0aCAkJHtzcmNkaXJ9LCBhbmQgc2hvdWxkIHdvcmsgaW4gYSBzdWJkaXJlY3RvcnkuICBUaGlzIGlzIHVzZWQKLSMgd2hlbiBidWlsZGluZyBkZXBlbmRlbmNpZXMsIGJlY2F1c2UgdGhlIGRlcGVuZGVuY3kgYnVpbGRpbmcgaXMgZG9uZQotIyBpbiBhIHN1YmRpcmVjdG9yeS4KLURFUF9JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgLUkkJHtzcmNkaXJ9L2NvbmZpZyAtSSQke3NyY2Rpcn0vLi4vaW5jbHVkZSAtSSQke3NyY2Rpcn0vLi4gLUkkJHtzcmNkaXJ9Ly4uL2JmZCAtSSQke3NyY2Rpcn0vLi4vaW50bCAtSS4uLy4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi0jIEhvdyB0byBsaW5rIHdpdGggYm90aCBvdXIgc3BlY2lhbCBsaWJyYXJ5IGZhY2lsaXRpZXMKLSMgYW5kIHRoZSBzeXN0ZW0ncyBpbnN0YWxsZWQgbGlicmFyaWVzLgotCi1HQVNMSUJTID0gQE9QQ09ERVNfTElCQCBAQkZETElCQCAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotIyBGaWxlcyB0byBiZSBjb3BpZWQgYXdheSBhZnRlciBlYWNoIHN0YWdlIGluIGJ1aWxkaW5nLgotU1RBR0VTVFVGRiA9ICoubyAkKG5vaW5zdF9QUk9HUkFNUykKLQotYXNfbmV3X1NPVVJDRVMgPSAkKEdBU19DRklMRVMpCi1hc19uZXdfTERBREQgPSAkKFRBUkdfQ1BVX08pICQoT0JKX0ZPUk1BVF9PKSAkKEFUT0ZfVEFSR19PKSBcCi0JJChleHRyYV9vYmplY3RzKSAkKEdBU0xJQlMpICQoSU5UTExJQlMpCi0KLWFzX25ld19ERVBFTkRFTkNJRVMgPSAkKFRBUkdfQ1BVX08pICQoT0JKX0ZPUk1BVF9PKSAkKEFUT0ZfVEFSR19PKSBcCi0JJChleHRyYV9vYmplY3RzKSAkKEdBU0xJQlMpICQoSU5UTERFUFMpCi0KLQotZ2FzcF9uZXdfU09VUkNFUyA9IGdhc3AuYyBtYWNyby5jIHNiLmMgaGFzaC5jCi1nYXNwX25ld19MREFERCA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExMSUJTKQotZ2FzcF9uZXdfREVQRU5ERU5DSUVTID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTERFUFMpCi0KLUVYUEVDVCA9IGBpZiBbIC1mICQke3Jvb3RtZX0vLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCi0gICAgICAgICAgZWNobyAkJHtyb290bWV9Ly4uL2V4cGVjdC9leHBlY3QgOyBcCi0gICAgICAgICAgZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotCi0KLVJVTlRFU1QgPSBgaWYgWyAtZiAkJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgdGhlbiBcCi0JCWVjaG8gJCR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgOyBlbHNlIGVjaG8gcnVudGVzdDsgXAotCSAgIGZpYAotCi1SVU5URVNURkxBR1MgPSAKLQotIyBUaGUgbTY4ayBvcGVyYW5kIHBhcnNlci4KLQotRVhUUkFfYXNfbmV3X1NPVVJDRVMgPSBjb25maWcvbTY4ay1wYXJzZS55Ci0KLSMgc3RhbmQtYWxvbmUgaXRibCBhc3NlbWJsZXIgJiBkaXNhc3NlbWJsZXIKLQotRVhUUkFfUFJPR1JBTVMgPSBpdGJsLXRlc3QKLWl0YmxfdGVzdF9TT1VSQ0VTID0gaXRibC1wYXJzZS55IGl0YmwtbGV4LmwKLWl0YmxfdGVzdF9MREFERCA9IGl0YmwtdG9wcy5vIGl0YmwtdGVzdC5vICQoR0FTTElCUykgQExFWExJQkAKLQotIyBDR0VOIGludGVyZmFjZS4KLQotQ0dFTl9DUFVfUFJFRklYID0gQGNnZW5fY3B1X3ByZWZpeEAKLQotIyBSZW1ha2UgdGhlIGluZm8gZmlsZXMuCi0KLU1PU1RMWUNMRUFORklMRVMgPSAkKFNUQUdFU1RVRkYpIGNvcmUgc3RhbXAtbWsuY29tIFwKLQl0ZXN0c3VpdGUvKi5vIHRlc3RzdWl0ZS8qLm91dCB0ZXN0c3VpdGUvZ2FzLmxvZyB0ZXN0c3VpdGUvZ2FzLnN1bSBcCi0JdGVzdHN1aXRlL3NpdGUuZXhwIHNpdGUuYmFrIHNpdGUuZXhwIHN0YWdlIHN0YWdlMSBzdGFnZTIKLQotCi1DTEVBTkZJTEVTID0gZGVwLnNlZCBERVBUQyBERVBPQkogREVQMiBERVAxIERFUEEgREVQIERFUERJUgotCi1hZ2FpbnN0ID0gc3RhZ2UyCi0KLSMgQXV0b21hdGljIGRlcGVuZGVuY3kgY29tcHV0YXRpb24uICBUaGlzIGlzIGEgcmVhbCBwYWluLCBiZWNhdXNlIHRoZQotIyBkZXBlbmRlbmNpZXMgY2hhbmdlIGJhc2VkIG9uIHRhcmdldF9jcHVfdHlwZSBhbmQgb2JqX2Zvcm1hdC4gIFdlCi0jIGN1cnJlbnRseSBpZ25vcmUgYW55IGRlcGVuZGVuY2llcyBjYXVzZWQgYnkgZW11bGF0aW9uIGZpbGVzLgotCi1ERVBfRklMRV9ERVBTID0gJChDRklMRVMpICQoSEZJTEVTKSAkKFRBUkdFVF9DUFVfQ0ZJTEVTKSBcCi0JJChUQVJHRVRfQ1BVX0hGSUxFUykgJChPQkpfRk9STUFUX0NGSUxFUykgJChPQkpfRk9STUFUX0hGSUxFUykKLQotCi1ERVBUQ19hMjlrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLQotREVQVENfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLQotREVQVENfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotCi1ERVBUQ19hbHBoYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLQotREVQVENfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotCi1ERVBUQ19hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLQotREVQVENfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotCi1ERVBUQ19hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLURFUFRDX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9hcmMuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1ERVBUQ19hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUFRDX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUFRDX2FybV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLURFUFRDX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggXAotICAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQVENfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oICQoSU5DRElSKS9lbGYvcHBjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLURFUFRDX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLQotREVQVENfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi0KLURFUFRDX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCi0gIGNnZW4uaAotCi1ERVBUQ19mcjMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCi0gIGNnZW4uaAotCi1ERVBUQ19oODMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmgKLQotREVQVENfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9oODMwMC5oCi0KLURFUFRDX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2g4NTAwLW9wYy5oCi0KLURFUFRDX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2g4NTAwLW9wYy5oCi0KLURFUFRDX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvbGliYmZkLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotCi1ERVBUQ19ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliYmZkLmggJChJTkNESVIpL29wY29kZS9ocHBhLmgKLQotREVQVENfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9pMzg2LmgKLQotREVQVENfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pMzg2LmgKLQotREVQVENfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTM4Ni5oCi0KLURFUFRDX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2k4NjAuaAotCi1ERVBUQ19pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi0KLURFUFRDX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggJChJTkNESVIpL29wY29kZS9pODYwLmgKLQotREVQVENfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2k5NjAuaAotCi1ERVBUQ19pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi0KLURFUFRDX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi0KLURFUFRDX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCi0gIGNnZW4uaAotCi1ERVBUQ19tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCi0gIGNnZW4uaAotCi1ERVBUQ19tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotCi1ERVBUQ19tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLURFUFRDX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaCBcCi0gICQoSU5DRElSKS9lbGYvbTY4ay5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQVENfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggJChJTkNESVIpL29wY29kZS9tNjhrLmggXAotICAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotCi1ERVBUQ19tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvY29uZmlnL204OGstb3Bjb2RlLmgKLQotREVQVENfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS9jb25maWcvbTg4ay1vcGNvZGUuaAotCi1ERVBUQ19tY29yZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tY29yZS1vcGMuaAotCi1ERVBUQ19tY29yZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tY29yZS1vcGMuaCBcCi0gICQoSU5DRElSKS9lbGYvbWNvcmUuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLURFUFRDX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIGl0Ymwtb3BzLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotREVQVENfbWlwc19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCi0gIGl0Ymwtb3BzLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0KLURFUFRDX21pcHNfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9taXBzLmggXAotICBpdGJsLW9wcy5oCi0KLURFUFRDX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBpdGJsLW9wcy5oIFwKLSAgJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotCi1ERVBUQ19tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi0KLURFUFRDX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaAotCi1ERVBUQ19tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi0KLURFUFRDX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaAotCi1ERVBUQ19uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUFRDX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBUQ19uczMya19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggJChJTkNESVIpL29wY29kZS9uczMyay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBUQ19wal9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcGouaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9wai5oCi0KLURFUFRDX3BqX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcGouaCAkKElOQ0RJUikvb3Bjb2RlL3BqLmgKLQotREVQVENfcHBjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2MDAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9wcGMuaAotCi1ERVBUQ19wcGNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmggJChJTkNESVIpL2VsZi9wcGMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQVENfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvc2gtb3BjLmgKLQotREVQVENfc2hfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvc2gtb3BjLmgKLQotREVQVENfc3BhcmNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLQotREVQVENfc3BhcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oCi0KLURFUFRDX3NwYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3NwYXJjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLURFUFRDX3RhaG9lX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLQotREVQVENfdGFob2VfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS90YWhvZS5oCi0KLURFUFRDX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS90YWhvZS5oCi0KLURFUFRDX3RpYzMwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotCi1ERVBUQ190aWMzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLQotREVQVENfdGljMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotCi1ERVBUQ190aWM4MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljODAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmgKLQotREVQVENfdGljODBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotCi1ERVBUQ192YXhfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAotCi1ERVBUQ192YXhfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi0KLURFUFRDX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAotCi1ERVBUQ192YXhfdm1zID0gJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi0KLURFUFRDX3c2NV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3c2NS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3c2NS1vcGMuaAotCi1ERVBUQ193NjVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3c2NS1vcGMuaAotCi1ERVBUQ192ODUwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oCi0KLURFUFRDX3Y4NTBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaAotCi1ERVBUQ196OGtfY29mZiA9ICQoc3JjZGlyKS8uLi9vcGNvZGVzL3o4ay1vcGMuaCAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggXAotICAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQVENfejhrX2VsZiA9ICQoc3JjZGlyKS8uLi9vcGNvZGVzL3o4ay1vcGMuaCAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCBcCi0gICQoQkZERElSKS9lbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oCi0KLURFUFRDX2hwcGFfc29tID0gJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oIFwKLSAgJChCRkRESVIpL3NvbS5oCi0KLURFUFRDX2kzODZfbXVsdGkgPSAkKERFUFRDX2kzODZfY29mZikgJChERVBUQ19pMzg2X2VsZikKLURFUFRDX21pcHNfbXVsdGkgPSAkKERFUFRDX21pcHNfY29mZikgJChERVBUQ19taXBzX2Vjb2ZmKSBcCi0gICQoREVQVENfbWlwc19lbGYpCi0KLURFUE9CSl9hMjlrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl9hMjlrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9hbHBoYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX2FscGhhX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoQkZERElSKS9saWJlY29mZi5oCi0KLURFUE9CSl9hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9hbHBoYV9ldmF4ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAotREVQT0JKX2FyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9hcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBPQkpfYXJtX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYXJtLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX2FybV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX2QxMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfZDMwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9mcjMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9mcjMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9oODMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfaDg1MDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9ocHBhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBPQkpfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX2kzODZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBPQkpfaTg2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfaTg2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9pOTYwX2JvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl9pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfaTk2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9tMzJyX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX202OGtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQT0JKX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9tNjhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX202OGtfaHAzMDAgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmMgJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQT0JKX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9tODhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX21jb3JlX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9tY29yZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBPQkpfbWlwc19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoQkZERElSKS9saWJlY29mZi5oCi0KLURFUE9CSl9taXBzX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfbW4xMDIwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9tbjEwMzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBPQkpfbnMzMmtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9uczMya19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfcGpfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBqLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9wal9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBqLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfcHBjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2MDAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX3NoX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zaC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfc3BhcmNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl9zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX3RhaG9lX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBPQkpfdGFob2VfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl90YWhvZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLURFUE9CSl90aWMzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1ERVBPQkpfdGljMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl90aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotREVQT0JKX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLURFUE9CSl92YXhfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLURFUE9CSl92YXhfdm1zID0gJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1ERVBPQkpfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3Y4NTBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1ERVBPQkpfejhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvejhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotREVQT0JKX3o4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotREVQT0JKX2hwcGFfc29tID0gJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliaHBwYS5oICQoQkZERElSKS9zb20uaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLQotREVQT0JKX2kzODZfbXVsdGkgPSAkKERFUE9CSl9pMzg2X2NvZmYpICQoREVQT0JKX2kzODZfZWxmKQotREVQT0JKX21pcHNfbXVsdGkgPSAkKERFUE9CSl9taXBzX2NvZmYpICQoREVQT0JKX21pcHNfZWNvZmYpIFwKLSAgJChERVBPQkpfbWlwc19lbGYpCi0KLURFUF9hMjlrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2EyOWtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYTI5ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9hMjlrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oCi0KLURFUF9hbHBoYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9hbHBoYV9lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0KLURFUF9hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKLQotREVQX2FscGhhX2V2YXggPSAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCi1ERVBfYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9hcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaAotCi1ERVBfYXJtX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfYXJtX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYXJtLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2FybV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oCi0KLURFUF9kMTB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaAotCi1ERVBfZDMwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2QzMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmgKLQotREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9mcjMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oCi0KLURFUF9oODMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oCi0KLURFUF9oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oCi0KLURFUF9ocHBhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaHBwYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCAkKEJGRERJUikvZWxmMzItaHBwYS5oIFwKLSAgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLURFUF9pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2kzODZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9pMzg2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oCi0KLURFUF9pODYwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2k4NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oCi0KLURFUF9pOTYwX2JvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmgKLURFUF9pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaTk2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaAotCi1ERVBfbTMycl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX20zMnJfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmgKLQotREVQX202OGtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTY4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tNjhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmgKLQotREVQX202OGtfaHAzMDAgPSAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTg4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tODhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX204OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmgKLQotREVQX21jb3JlX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tY29yZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmgKLQotREVQX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbWlwc19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX21pcHNfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0KLURFUF9taXBzX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oCi0KLURFUF9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaAotCi1ERVBfbW4xMDMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmgKLQotREVQX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9uczMya19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9uczMya19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmgKLQotREVQX3BqX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wai5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3BqX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcGouaAotCi1ERVBfcHBjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2MDAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oCi0KLURFUF9zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfc2hfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oCi0KLURFUF9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfc3BhcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3NwYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaAotCi1ERVBfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RhaG9lX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaAotCi1ERVBfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmgKLQotREVQX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF90aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmgKLQotREVQX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmgKLQotREVQX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotCi1ERVBfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oCi0KLURFUF92ODUwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaAotCi1ERVBfejhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvejhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3o4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oCi0KLURFUF9ocHBhX3NvbSA9ICQoQkZERElSKS9zb20uaAotREVQX2kzODZfbXVsdGkgPSAkKERFUF9pMzg2X2NvZmYpICQoREVQX2kzODZfZWxmKQotREVQX21pcHNfbXVsdGkgPSAkKERFUF9taXBzX2NvZmYpICQoREVQX21pcHNfZWNvZmYpIFwKLSAgJChERVBfbWlwc19lbGYpCi0KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gICR7R0RCSU5JVH0KLW5vaW5zdF9QUk9HUkFNUyA9ICBhcy1uZXckKEVYRUVYVCkgZ2FzcC1uZXckKEVYRUVYVCkKLVBST0dSQU1TID0gICQobm9pbnN0X1BST0dSQU1TKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1pdGJsX3Rlc3RfT0JKRUNUUyA9ICBpdGJsLXBhcnNlLm8gaXRibC1sZXgubwotaXRibF90ZXN0X0RFUEVOREVOQ0lFUyA9ICBpdGJsLXRvcHMubyBpdGJsLXRlc3QubyBcCi0uLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLWl0YmxfdGVzdF9MREZMQUdTID0gCi1hc19uZXdfT0JKRUNUUyA9ICBhcHAubyBhcy5vIGF0b2YtZ2VuZXJpYy5vIGJpZ251bS1jb3B5Lm8gY29uZC5vIFwKLWRlcGVuZC5vIGR3YXJmMmRiZy5vIGVjb2ZmLm8gZWhvcHQubyBleHByLm8gZmxvbnVtLWNvcHkubyBcCi1mbG9udW0ta29uc3QubyBmbG9udW0tbXVsdC5vIGZyYWdzLm8gaGFzaC5vIGlucHV0LWZpbGUubyBpbnB1dC1zY3J1Yi5vIFwKLWxpc3RpbmcubyBsaXRlcmFsLm8gbWFjcm8ubyBtZXNzYWdlcy5vIG91dHB1dC1maWxlLm8gcmVhZC5vIHNiLm8gXAotc3RhYnMubyBzdWJzZWdzLm8gc3ltYm9scy5vIHdyaXRlLm8KLWFzX25ld19MREZMQUdTID0gCi1nYXNwX25ld19PQkpFQ1RTID0gIGdhc3AubyBtYWNyby5vIHNiLm8gaGFzaC5vCi1nYXNwX25ld19MREZMQUdTID0gCi1TQ1JJUFRTID0gICQobm9pbnN0X1NDUklQVFMpCi0KLUxFWF9PVVRQVVRfUk9PVCA9IEBMRVhfT1VUUFVUX1JPT1RACi1MRVhMSUIgPSBATEVYTElCQAotWUxXUkFQID0gJCh0b3Bfc3JjZGlyKS8uLi95bHdyYXAKLUNGTEFHUyA9IEBDRkxBR1NACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotRElTVF9DT01NT04gPSAgUkVBRE1FIC4vc3RhbXAtaC5pbiBDT1BZSU5HIENoYW5nZUxvZyBNYWtlZmlsZS5hbSBcCi1NYWtlZmlsZS5pbiBORVdTIGFjaW5jbHVkZS5tNCBhY2xvY2FsLm00IGNvbmZpZy5pbiBjb25maWcvbTY4ay1wYXJzZS5jIFwKLWNvbmZpZ3VyZSBjb25maWd1cmUuaW4gZ2RiaW5pdC5pbiBpdGJsLWxleC5jIGl0YmwtcGFyc2UuYwotCi0KLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi0KLVRBUiA9IGd0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci1TT1VSQ0VTID0gJChpdGJsX3Rlc3RfU09VUkNFUykgJChhc19uZXdfU09VUkNFUykgJChFWFRSQV9hc19uZXdfU09VUkNFUykgJChnYXNwX25ld19TT1VSQ0VTKQotT0JKRUNUUyA9ICQoaXRibF90ZXN0X09CSkVDVFMpICQoYXNfbmV3X09CSkVDVFMpICQoZ2FzcF9uZXdfT0JKRUNUUykKLQotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLlMgLmMgLmwgLmxvIC5vIC5zIC55Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotJHtHREJJTklUfTogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgZ2RiaW5pdC5pbgotCWNkICQodG9wX2J1aWxkZGlyKSAmJiBDT05GSUdfRklMRVM9JEA6Z2RiaW5pdC5pbiBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQktdGVzdCAteiAiJChub2luc3RfUFJPR1JBTVMpIiB8fCBybSAtZiAkKG5vaW5zdF9QUk9HUkFNUykKLQotZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi1tYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1pdGJsLXRlc3QkKEVYRUVYVCk6ICQoaXRibF90ZXN0X09CSkVDVFMpICQoaXRibF90ZXN0X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgaXRibC10ZXN0JChFWEVFWFQpCi0JJChMSU5LKSAkKGl0YmxfdGVzdF9MREZMQUdTKSAkKGl0YmxfdGVzdF9PQkpFQ1RTKSAkKGl0YmxfdGVzdF9MREFERCkgJChMSUJTKQotCi1hcy1uZXckKEVYRUVYVCk6ICQoYXNfbmV3X09CSkVDVFMpICQoYXNfbmV3X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgYXMtbmV3JChFWEVFWFQpCi0JJChMSU5LKSAkKGFzX25ld19MREZMQUdTKSAkKGFzX25ld19PQkpFQ1RTKSAkKGFzX25ld19MREFERCkgJChMSUJTKQotCi1nYXNwLW5ldyQoRVhFRVhUKTogJChnYXNwX25ld19PQkpFQ1RTKSAkKGdhc3BfbmV3X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgZ2FzcC1uZXckKEVYRUVYVCkKLQkkKExJTkspICQoZ2FzcF9uZXdfTERGTEFHUykgJChnYXNwX25ld19PQkpFQ1RTKSAkKGdhc3BfbmV3X0xEQUREKSAkKExJQlMpCi0ubC5jOgotCSQoTEVYKSAkKEFNX0xGTEFHUykgJChMRkxBR1MpICQ8ICYmIG12ICQoTEVYX09VVFBVVF9ST09UKS5jICRACi0ueS5jOgotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJDwgeS50YWIuYyAkKi5jIHkudGFiLmggJCouaCAtLSAkKEFNX1lGTEFHUykgJChZRkxBR1MpCi1jb25maWcvbTY4ay1wYXJzZS5oOiBjb25maWcvbTY4ay1wYXJzZS5jCi1pdGJsLXBhcnNlLmg6IGl0YmwtcGFyc2UuYwotCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0KLUBTRVRfTUFLRUAKLQotYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi1jaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JcmV2PScnOyBsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAiLiIgJiYgZG90X3NlZW49eWVzOyBcCi0JZG9uZTsgXAotCXRlc3QgIiQkZG90X3NlZW4iID0gIm5vIiAmJiByZXY9Ii4gJCRyZXYiOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLQotdGFnczogVEFHUwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaGVyZT1gcHdkYCAmJiBjZCAkKHNyY2RpcikgXAotCSAgJiYgbWtpZCAtZiQkaGVyZS9JRCAkJHVuaXF1ZSAkKExJU1ApCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotICAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLSAgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpY29uZmlnLmluJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCi0JICB8fCAoY2QgJChzcmNkaXIpICYmIGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzIGNvbmZpZy5pbiAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQotCi1tb3N0bHljbGVhbi10YWdzOgotCi1jbGVhbi10YWdzOgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRAotCi1tYWludGFpbmVyLWNsZWFuLXRhZ3M6Ci0KLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSB6eGYgJChkaXN0ZGlyKS50YXIuZ3oKLQlta2RpciAkKGRpc3RkaXIpLz1idWlsZAotCW1rZGlyICQoZGlzdGRpcikvPWluc3QKLQlkY19pbnN0YWxsX2Jhc2U9YGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYDsgXAotCWNkICQoZGlzdGRpcikvPWJ1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUBiYW5uZXI9IiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iOyBcCi0JZGFzaGVzPWBlY2hvICIkJGJhbm5lciIgfCBzZWQgcy8uLz0vZ2A7IFwKLQllY2hvICIkJGRhc2hlcyI7IFwKLQllY2hvICIkJGJhbm5lciI7IFwKLQllY2hvICIkJGRhc2hlcyIKLWRpc3Q6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0LWFsbDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikKLQktY2htb2QgNzc3ICQoZGlzdGRpcikKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICAgIGNobW9kIDc3NyAkKGRpc3RkaXIpLyQkc3ViZGlyOyBcCi0JICAgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0uLi8kKGRpc3RkaXIpIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBkaXN0ZGlyKSBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLQotREVKQVRPT0wgPSAkKFBBQ0tBR0UpCi0KLVJVTlRFU1RERUZBVUxURkxBR1MgPSAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCRzcmNkaXIKLXNpdGUuZXhwOiBNYWtlZmlsZQotCUBlY2hvICdNYWtpbmcgYSBuZXcgc2l0ZS5leHAgZmlsZS4uLicKLQlAdGVzdCAhIC1mIHNpdGUuYmFrIHx8IHJtIC1mIHNpdGUuYmFrCi0JQGVjaG8gJyMjIHRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWFrZSAjIycgPiAkQC10Ci0JQGVjaG8gJyMgRG8gbm90IGVkaXQgaGVyZS4gIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZXNlIHZhbHVlcycgPj4gJEAtdAotCUBlY2hvICcjIGVkaXQgdGhlIGxhc3Qgc2VjdGlvbicgPj4gJEAtdAotCUBlY2hvICdzZXQgdG9vbCAkKERFSkFUT09MKScgPj4gJEAtdAotCUBlY2hvICdzZXQgc3JjZGlyICQoc3JjZGlyKScgPj4gJEAtdAotCUBlY2hvICdzZXQgb2JqZGlyJyBgcHdkYCA+PiAkQC10Ci0JQGVjaG8gJ3NldCBob3N0X2FsaWFzICQoaG9zdF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfdHJpcGxldCAkKGhvc3RfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF9hbGlhcyAkKHRhcmdldF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF90cmlwbGV0ICQodGFyZ2V0X3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF9hbGlhcyAkKGJ1aWxkX2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfdHJpcGxldCAkKGJ1aWxkX3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjJyA+PiAkQC10Ci0JQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBzZWQgJzEsL14jIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZS4qIyMvIGQnIHNpdGUuZXhwID4+ICRALXQKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IG12IHNpdGUuZXhwIHNpdGUuYmFrCi0JQG12ICRALXQgc2l0ZS5leHAKLWluZm8tYW06Ci1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotZHZpLWFtOgotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1ERUpBR05VCi1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtZXhlYy1sb2NhbAotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi0KLWluc3RhbGwtZGF0YS1hbToKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLXVuaW5zdGFsbC1hbToKLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKSAkKFNDUklQVFMpIGNvbmZpZy5oCi1hbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoTU9TVExZQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTU9TVExZQ0xFQU5GSUxFUykKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKLQotbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICJpdGJsLWxleGxjb25maWcvbTY4ay1wYXJzZWhjb25maWcvbTY4ay1wYXJzZWNpdGJsLXBhcnNlaGl0YmwtcGFyc2VjIiB8fCBybSAtZiBpdGJsLWxleGwgY29uZmlnL202OGstcGFyc2VoIGNvbmZpZy9tNjhrLXBhcnNlYyBpdGJsLXBhcnNlaCBpdGJsLXBhcnNlYwotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1oZHIgbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi10YWdzIG1vc3RseWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogIGNsZWFuLWhkciBjbGVhbi1ub2luc3RQUk9HUkFNUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbi1nZW5lcmljIFwKLQkJY2xlYW4tYW0KLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCi0JCW1haW50YWluZXItY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAotCQlkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotY2xlYW4tbm9pbnN0UFJPR1JBTVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAotY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi11bmluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi11bmluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHVuaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKLWFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgXAotZHZpLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi10YWdzIFwKLWRpc3RjbGVhbi10YWdzIGNsZWFuLXRhZ3MgbWFpbnRhaW5lci1jbGVhbi10YWdzIGRpc3RkaXIgY2hlY2stREVKQUdOVSBcCi1pbmZvLWFtIGluZm8gZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIFwKLWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtbG9jYWwgXAotaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gXAotaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIGFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIFwKLWluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBcCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotJChzcmNkaXIpL21ha2UtZ2FzLmNvbTogc3RhbXAtbWsuY29tCi1zdGFtcC1tay5jb206IHZtc2NvbmYuc2ggTWFrZWZpbGUKLQlzaCAkKHNyY2Rpcikvdm1zY29uZi5zaCAkKEdFTkVSSUNfT0JKUykgPiBuZXctbWFrZS5jb20KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbmV3LW1ha2UuY29tICQoc3JjZGlyKS9tYWtlLWdhcy5jb20KLQl0b3VjaCBzdGFtcC1tay5jb20KLWRpc3RzdHVmZjogJChESVNUU1RVRkYpIGluZm8KLQotJChPQkpTKTogQEFMTF9PQkpfREVQU0AKLQotIyBTdHVmZiB0aGF0IGV2ZXJ5IG9iamVjdCBmaWxlIGRlcGVuZHMgdXBvbi4gIElmIGFueXRoaW5nIGlzIHJlbW92ZWQKLSMgZnJvbSB0aGlzIGxpc3QsIHJlbW92ZSBpdCBmcm9tIGRlcC1pbi5zZWQgYXMgd2VsbC4KLSQoT0JKUyk6IGNvbmZpZy5oIGFzLmggJChUQVJHX0VOVl9IKSAkKE9CSl9GT1JNQVRfSCkgJChUQVJHX0NQVV9IKSBmbG9udW0uaCBcCi0JZXhwci5oIHdyaXRlLmggZnJhZ3MuaCBoYXNoLmggcmVhZC5oIHN5bWJvbHMuaCB0Yy5oIFwKLQlvYmouaCBsaXN0aW5nLmggYmlnbnVtLmggYml0X2ZpeC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBhc2ludGwuaAotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCWlmIFsgLWQgdGVzdHN1aXRlIF07IHRoZW4gXAotCSAgdHJ1ZTsgXAotCWVsc2UgXAotCSAgbWtkaXIgdGVzdHN1aXRlOyBcCi0JZmkKLQlybSAtZiB0ZXN0c3VpdGUvc2l0ZS5leHAKLQljcCBzaXRlLmV4cCB0ZXN0c3VpdGUvc2l0ZS5leHAKLQlyb290bWU9YHB3ZGA7IGV4cG9ydCByb290bWU7IFwKLQlzcmNkaXI9YGNkICR7c3JjZGlyfTsgcHdkYCA7IGV4cG9ydCBzcmNkaXIgOyBcCi0JRVhQRUNUPSR7RVhQRUNUfSA7IGV4cG9ydCBFWFBFQ1QgOyBcCi0JaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdOyB0aGVuIFwKLQkgIFRDTF9MSUJSQVJZPWBjZCAkKHRvcF9zcmNkaXIpLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKLQkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAotCWZpOyBcCi0JcnVudGVzdD0kKFJVTlRFU1QpOyBcCi0JY2QgdGVzdHN1aXRlOyBcCi0JaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgJCRydW50ZXN0IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHtzcmNkaXJ9L3Rlc3RzdWl0ZSBcCi0JCSQoUlVOVEVTVEZMQUdTKTsgXAotCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgXGBydW50ZXN0JyIgMT4mMjsgOjtcCi0JZmkKLQotIyBUaGUgaW1wbGljaXQgLmMubyBydWxlIGRvZXNuJ3Qgd29yayBmb3IgdGhlc2UsIHBlcmhhcHMgYmVjYXVzZSBvZgotIyB0aGUgdmFyaWFibGVzLCBvciBwZXJoYXBzIGJlY2F1c2UgdGhlIHNvdXJjZXMgYXJlIG5vdCBvbiB2cGF0aC4KLSQoVEFSR19DUFVfTyk6ICQoVEFSR19DUFVfQykgJChUQVJHX0NQVV9ERVBfQHRhcmdldF9jcHVfdHlwZUApCi0JJChDT01QSUxFKSAtYyAkKFRBUkdfQ1BVX0MpCi0kKEFUT0ZfVEFSR19PKTogJChBVE9GX1RBUkdfQykKLQkkKENPTVBJTEUpIC1jICQoQVRPRl9UQVJHX0MpCi0KLSMgZWNvZmYuYyBvbmx5IGhhcyBmdWxsIGRlcGVuZGVuY2llcyB3aGVuIEVDT0ZGX0RFQlVHR0lORyBpcyBkZWZpbmVkLAotIyBzbyB0aGUgYXV0b21hdGljIGRlcGVuZGVuY3kgc3R1ZmYgZG9lc24ndCB3b3JrLgotZWNvZmYubyA6IGVjb2ZmLmMgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIFwKLQkkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAotCSQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmgKLQotIyBXZSBuZWVkIGFsbCB0aGVzZSBleHBsaWNpdCBydWxlcyBmb3IgdGhlIG11bHRpIHN0dWZmLiAgQmVjYXVzZSBvZgotIyB0aGVzZSBydWxlcywgd2UgZG9uJ3QgbmVlZCBvbmUgZm9yIE9CSl9GT1JNQVRfTy4KLQotb2JqLWFvdXQubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jCi1vYmotYm91dC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmMKLW9iai1jb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5jCi1vYmotZWNvZmYubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmMKLW9iai1lbGYubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuYwotb2JqLWV2YXgubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5jCi1vYmotaHAzMDAubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmMKLW9iai1pZWVlLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1pZWVlLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWllZWUuYwotb2JqLW11bHRpLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1tdWx0aS5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1tdWx0aS5jCi1vYmotc29tLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1zb20uYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmMKLW9iai12bXMubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai12bXMuYwotCi1lLW1pcHNlbGYubyA6ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMKLWUtbWlwc2Vjb2ZmLm8gOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWNvZmYuYwotZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLWkzODZjb2ZmLmMKLWUtaTM4NmVsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCi0KLSMgSWYgbTY4ay1wYXJzZS55IGlzIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSwgdGhlbiB5bHdyYXAgd2lsbCB1c2UgYW4KLSMgYWJzb2x1dGUgcGF0aCB3aGVuIGl0IGludm9rZXMgeWFjYywgd2hpY2ggd2lsbCBjYXVzZSB5YWNjIHRvIHB1dCB0aGUKLSMgYWJzb2x1dGUgcGF0aCBpbnRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4gIFRoYXQncyBhIHBhaW4gd2hlbiBpdCBjb21lcwotIyB0byBnZW5lcmF0aW5nIHNuYXBzaG90cywgYmVjYXVzZSBpdCBpbnRyb2R1Y2VzIHNwdXJpb3VzIGRpZmZzLgotIyBTaW5jZSB3aGVuIHdlIG1ha2UgdGhlIHNuYXBzaG90cyAkKHNyY2RpcikgPSAiLiIsIHdlIGNoZWNrIGZvciB0aGF0Ci0jIGNhc2UgYW5kIGhhbmRsZSBpdCBkaWZmZXJlbnRseS4gIFRoaXMgbWVhbnMgdGhhdCBhbnlib2R5IHdobwotIyBjb25maWd1cmVzIHdpdGggJChzcmNkaXIpID0gIi4iIHdpbGwgaGF2ZSB0byBzZXQgdGhlaXIgcGF0aCBpbiB0aGUKLSMgZGVidWdnZXIgaWYgdGhleSB3YW50IHRvIGRlYnVnIG02OGstcGFyc2UueS4gIFRoaXMgaXMgYmFkLCBidXQgb24KLSMgdGhlIG90aGVyIGhhbmQgaXQncyBnb29kIHRoYXQgcGVvcGxlIHdobyB1c2UgdGhlIHByZWJ1aWx0Ci0jIG02OGstcGFyc2UuYyBkb24ndCBnZXQgYSBzcHVyaW91cyBhYnNvbHV0ZSBwYXRoLgotbTY4ay1wYXJzZS5jOiAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UueQotCWY9JChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLnk7IFwKLQlpZiBbICQkZiA9ICIuL2NvbmZpZy9tNjhrLXBhcnNlLnkiIF07IHRoZW4gXAotCSAgbG4gLXMgY29uZmlnL202OGstcGFyc2UueSAuID4gL2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IFwKLQkgICBsbiBjb25maWcvbTY4ay1wYXJzZS55IC4gPiAvZGV2L251bGwgMj4vZGV2L251bGwgfHwgXAotCSAgIGNwIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyBcCi0JICBmPW02OGstcGFyc2UueTsgXAotCWVsc2UgdHJ1ZTsgZmk7IFwKLQkkKFNIRUxMKSAkKFlMV1JBUCkgIiQoWUFDQykiICQkZiB5LnRhYi5jIG02OGstcGFyc2UuYyAtLTsgXAotCWlmIFsgJCRmID0gIm02OGstcGFyc2UueSIgXTsgdGhlbiBcCi0JICBybSAtZiBtNjhrLXBhcnNlLnk7IFwKLQllbHNlIHRydWU7IGZpCi1tNjhrLXBhcnNlLm86IG02OGstcGFyc2UuYyAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotCi0jIERvbid0IGxldCB0aGUgLnkuaCBydWxlIGNsb2JiZXIgbTY4ay1wYXJzZS5oLgotbTY4ay1wYXJzZS5oOiA7IEB0cnVlCi0kKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaDogOyBAdHJ1ZQotCi0jIFRoZSBpbnN0cnVjdGlvbiB0YWJsZSBzcGVjaWZpY2F0aW9uIGxleGljYWwgYW5hbHl6ZXIgYW5kIHBhcnNlci4KLQotaXRibC1sZXguYzogJChzcmNkaXIpL2l0YmwtbGV4LmwKLWl0YmwtbGV4Lm86IGl0YmwtbGV4LmMgaXRibC1wYXJzZS5oCi0KLWl0YmwtcGFyc2UubzogaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaCAkKHNyY2RpcikvaXRibC1vcHMuaAotCi1pdGJsLW9wcy5vOiAkKHNyY2RpcikvaXRibC1vcHMuYyAkKHNyY2RpcikvaXRibC1vcHMuaCBpdGJsLXBhcnNlLmgKLQotaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaDogJChzcmNkaXIpL2l0YmwtcGFyc2UueQotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJChzcmNkaXIpL2l0YmwtcGFyc2UueSB5LnRhYi5jIGl0YmwtcGFyc2UuYyB5LnRhYi5oIGl0YmwtcGFyc2UuaCAtLSAtZAotCi1pdGJsLXRvcHMubzogJChzcmNkaXIpL2l0Ymwtb3BzLmMgJChzcmNkaXIpL2l0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi0JJChDT01QSUxFKSAtbyBpdGJsLXRvcHMubyAtRFNUQU5EX0FMT05FIC1jICQoc3JjZGlyKS9pdGJsLW9wcy5jCi0KLWl0YmwtdGVzdC5vOiAkKHNyY2RpcikvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMgJChzcmNkaXIpL2l0Ymwtb3BzLmgKLQkkKENPTVBJTEUpIC1jIC1EU1RBTkRfQUxPTkUgJChzcmNkaXIpL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jCi0KLWNnZW4ubzogY2dlbi5jIGNnZW4uaCBjZ2VuLWRlc2MuaCBzdWJzZWdzLmggXAotCSQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotCSQoc3JjZGlyKS8uLi9vcGNvZGVzLyQoQ0dFTl9DUFVfUFJFRklYKS1kZXNjLmggXAotCSQoc3JjZGlyKS8uLi9vcGNvZGVzLyQoQ0dFTl9DUFVfUFJFRklYKS1vcGMuaAotCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbCBpbnN0YWxsLWRhdGEtbG9jYWwKLS5QSE9OWTogaW5zdGFsbC1leGVjLWJpbmRpciBpbnN0YWxsLWV4ZWMtdG9vbGRpcgotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6IGluc3RhbGwtZXhlYy1iaW5kaXIgQGluc3RhbGxfdG9vbGRpckAKLQotaW5zdGFsbC1leGVjLWJpbmRpcjogJChub2luc3RfUFJPR1JBTVMpCi0JJChta2luc3RhbGxkaXJzKSAkKGJpbmRpcikKLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQotaW5zdGFsbC1leGVjLXRvb2xkaXI6ICQobm9pbnN0X1BST0dSQU1TKQotCSQobWtpbnN0YWxsZGlycykgJCh0b29sZGlyKS9iaW4KLQluPWBlY2hvIGFzIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCWlmIFsgIiQoYmluZGlyKS8kJG4kKEVYRUVYVCkiICE9ICIkKHRvb2xkaXIpL2Jpbi9hcyQoRVhFRVhUKSIgXTsgdGhlbiBcCi0JICBybSAtZiAkKHRvb2xkaXIpL2Jpbi9hcyQoRVhFRVhUKTsgXAotCSAgbG4gJChiaW5kaXIpLyQkbiQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi9hcyQoRVhFRVhUKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsIFwKLQkgICAgfHwgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgYXMtbmV3JChFWEVFWFQpICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpOyBcCi0JZWxzZSBcCi0JICB0cnVlIDsgXAotCWZpCi0KLSMgVGhlc2UgZXhpc3QgZm9yIG1haW50ZW5hbmNlIHB1cnBvc2VzLgotCi0uUEhPTlk6IGJvb3RzdHJhcCBib290c3RyYXAyIGJvb3RzdHJhcDMgc3RhZ2UxIHN0YWdlMiBzdGFnZTMgY29tcGFyaXNvbgotCi1ib290c3RyYXA6IGFzLW5ldwotCSQoTUFLRSkgc3RhZ2UxCi0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UxIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBzdGFnZTIKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTIgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIGNvbXBhcmlzb24gYWdhaW5zdD1zdGFnZTIKLQotYm9vdHN0cmFwMjoKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTEgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIHN0YWdlMgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMiBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgY29tcGFyaXNvbiBhZ2FpbnN0PXN0YWdlMgotCi1ib290c3RyYXAzOgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMiBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgY29tcGFyaXNvbiBhZ2FpbnN0PXN0YWdlMgotCi0jIENvcHkgdGhlIG9iamVjdCBmaWxlcyBmcm9tIGEgcGFydGljdWxhciBzdGFnZSBpbnRvIGEgc3ViZGlyZWN0b3J5Lgotc3RhZ2UxOgotCS1ta2RpciBzdGFnZTEKLQktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTEKLQlpZiBbIC1mIHN0YWdlMS9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTEvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMSA7IGxuIC1zIGFzLW5ldyQoRVhFRVhUKSBhcyQoRVhFRVhUKSkgOyBmaQotCi1zdGFnZTI6Ci0JLW1rZGlyIHN0YWdlMgotCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMgotCWlmIFsgLWYgc3RhZ2UyL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMi9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UyIDsgbG4gLXMgYXMtbmV3JChFWEVFWFQpIGFzJChFWEVFWFQpKSA7IGZpCi0KLXN0YWdlMzoKLQktbWtkaXIgc3RhZ2UzCi0JLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UzCi0JaWYgWyAtZiBzdGFnZTMvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UzL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTMgOyBsbiAtcyBhcy1uZXcgYXMkKEVYRUVYVCkpIDsgZmkKLQotIyBUaGlzIHJ1bGUgaXMgZGVyaXZlZCBmcm9tIGNvcnJlc3BvbmRpbmcgY29kZSBpbiB0aGUgTWFrZWZpbGUuaW4gZm9yIGdjYy4KLSMgVGhlICJ0YWlsICsxNmMiIGlzIHRvIGJ5cGFzcyBoZWFkZXJzIHdoaWNoIG1heSBpbmNsdWRlIHRpbWVzdGFtcHMgb3IKLSMgdGVtcG9yYXJ5IGFzc2VtYmx5IGZpbGUgbmFtZXMuCi1jb21wYXJpc29uOgotCXg9MCA7IFwKLQlmb3IgZmlsZSBpbiAqLm8gOyBkbyBcCi0JICB0YWlsICsxNmMgLi8kJGZpbGUgPiB0bXAtZm9vMTsgXAotCSAgaWYgdGFpbCArMTZjICR7YWdhaW5zdH0vJCRmaWxlID4gdG1wLWZvbzIgMj4vZGV2L251bGwgOyB0aGVuIFwKLQkgICAgaWYgY21wIHRtcC1mb28xIHRtcC1mb28yIDsgdGhlbiBcCi0JICAgICAgdHJ1ZSA7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgZWNobyAkJGZpbGUgZGlmZmVycyA7IFwKLQkgICAgICB4PTEgOyBcCi0JICAgIGZpIDsgXAotCSAgZWxzZSB0cnVlOyBmaSA7IFwKLQlkb25lIDsgXAotCWV4aXQgJCR4Ci0JLXJtIC1mIHRtcC1mb28qCi0KLS5QSE9OWTogZGUtc3RhZ2UxIGRlLXN0YWdlMiBkZS1zdGFnZTMKLQotZGUtc3RhZ2UxOgotCS0gKGNkIHN0YWdlMSA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKLQktIHJtZGlyIHN0YWdlMQotCi1kZS1zdGFnZTI6Ci0JLSAoY2Qgc3RhZ2UyIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQotCS0gcm1kaXIgc3RhZ2UyCi0KLWRlLXN0YWdlMzoKLQktIChjZCBzdGFnZTMgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCi0JLSBybWRpciBzdGFnZTMKLQotREVQOiBkZXAuc2VkICQoREVQX0ZJTEVfREVQUykgREVQVEMgREVQT0JKIERFUDIKLQlybSAtZiBERVAxCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQkkKE1BS0UpIE1LREVQPSQoTUtERVApIHNyY2Rpcj0kJHtzcmNkaXJ9IFZQQVRIPSQke3NyY2Rpcn0gREVQMQotCXJtIC1yZiBERVBESVIKLQlzZWQgLWYgZGVwLnNlZCA8IERFUDEgPiBERVBBCi0Jc2VkIC1mIGRlcC5zZWQgPCBERVBUQyA+PiBERVBBCi0Jc2VkIC1mIGRlcC5zZWQgPCBERVBPQkogPj4gREVQQQotCXNlZCAtZiBkZXAuc2VkIDwgREVQMiA+PiBERVBBCi0JZWNobyAnJCQoT0JKUyk6ICQkKERFUF9AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gREVQQQotCWVjaG8gJyQkKFRBUkdfQ1BVX08pOiAkJChERVBUQ19AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gREVQQQotCWVjaG8gJyQkKE9CSl9GT1JNQVRfTyk6ICQkKERFUE9CSl9AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gREVQQQotCWVjaG8gJyMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWScgPj4gREVQQQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBERVBBIERFUAotCi0jIFRoaXMgcnVsZSBuZWVkcyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi1ERVAxOiAkKENGSUxFUykgJChNVUxUSV9DRklMRVMpCi0JaWYgWyAtZCBERVBESVIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIERFUERJUjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIERFUERJUjsgXAotCWVjaG8gJycgPiB0YXJnLWNwdS5oOyBcCi0JZWNobyAnJyA+IG9iai1mb3JtYXQuaDsgXAotCWVjaG8gJycgPiB0YXJnLWVudi5oOyBcCi0JZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQllY2hvICcnID4gaXRibC1wYXJzZS5oOyBcCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVA7IFwKLQkkKE1LREVQKSAtZiBERVAgLURCRkRfQVNTRU1CTEVSIC1JLiAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAkKERFUF9JTkNMVURFUykgJD8KLQlzZWQgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIDwgREVQRElSL0RFUCA+IERFUDEKLQlybSAtZiBERVBESVIvREVQCi0KLSMgV29yayBvdXQgdGhlIHNwZWNpYWwgZGVwZW5kZW5jaWVzIGZvciB0aGUgdGMtKi5jIGZpbGVzLgotREVQVEM6ICQoVEFSR0VUX0NQVV9DRklMRVMpCi0Jcm0gLWYgREVQVENBCi0JaWYgWyAtZCBERVBESVIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIERFUERJUjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIERFUERJUjsgXAotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgZm9yIG8gaW4gJChPQkpfRk9STUFUUyk7IGRvIFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRjLSciJCR7Y30iJy5oIicgPiB0YXJnLWNwdS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9iai0nIiQke299IicuaCInID4gb2JqLWZvcm1hdC5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRlLWdlbmVyaWMuaCInID4gdGFyZy1lbnYuaDsgXAotCSAgICAgIGVjaG8gJycgPiBpdGJsLWNwdS5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtcGFyc2UuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvcGNvZGVzLyciJCR7Y30iJy1kZXNjLmgiJyA+IGNnZW4tZGVzYy5oOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICAgIGNwICQke3NyY2Rpcn0vY29uZmlnL3RjLSQke2N9LmMgZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQOyBcCi0JICAgICAgJChNS0RFUCkgLWYgREVQIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9ERVBUQ18kJHtjfV8kJHtvfSA9LyIgXAotCQkgIC1lICcxLC9ETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSL2QnIFwKLQkJICAtZSAnL0lGIFlPVSBQVVQgQU5ZVEhJTkcvLCQkZCcgXAotCQkgIC1lICcvXiQkL2QnIDwgREVQID4+IC4uL0RFUFRDQTsgXAotCSAgICAgIHJtIC1mIGR1bW15LmM7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQllY2hvICdERVBUQ19ocHBhX3NvbSA9ICQkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBzdWJzZWdzLmggXCcgPj4gREVQVENBCi0JZWNobyAnICAkJChJTkNESVIpL29ic3RhY2suaCAkJChCRkRESVIpL2xpYmhwcGEuaCBcJyA+PiBERVBUQ0EKLQllY2hvICcgICQkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaCAkJChCRkRESVIpL3NvbS5oJyA+PiBERVBUQ0EKLQkjIFdlIGRvbid0IHRyeSB0byBoYW5kbGUgYWxsIG11bHRpIGNhc2VzLgotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgJChDUFVfTVVMVElfVkFMSUQpIFwKLQkgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgIG89ZWNvZmY7IFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGVjaG8gJ0RFUFRDXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IERFUFRDQTsgXAotCSAgICBlY2hvICckJChERVBUQ18nIiQke2N9IidfY29mZikgXCcgPj4gREVQVENBOyBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnJCQoREVQVENfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiBERVBUQ0E7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgICBlY2hvICckJChERVBUQ18nIiQke2N9IidfZWxmKScgPj4gREVQVENBOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCW12IC1mIERFUFRDQSBERVBUQwotCi0jIFdvcmsgb3V0IHRoZSBzcGVjaWFsIGRlcGVuZGVuY2llcyBmb3IgdGhlIG9iai0qLmMgZmlsZXMuCi1ERVBPQko6ICQoT0JKX0ZPUk1BVF9DRklMRVMpCi0Jcm0gLWYgREVQT0JKQQotCWlmIFsgLWQgREVQRElSIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciBERVBESVI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCBERVBESVI7IFwKLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IG9iai1mb3JtYXQuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0ZS1nZW5lcmljLmgiJyA+IHRhcmctZW52Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1jcHUuaDsgXAotCSAgICAgIGVjaG8gJycgPiBpdGJsLXBhcnNlLmg7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgICAgY3AgJCR7c3JjZGlyfS9jb25maWcvb2JqLSQke299LmMgZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQOyBcCi0JICAgICAgJChNS0RFUCkgLWYgREVQIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9ERVBPQkpfJCR7Y31fJCR7b30gPS8iIFwKLQkJICAtZSAnMSwvRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUi9kJyBcCi0JCSAgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIFwKLQkJICAtZSAnL14kJC9kJyA8IERFUCA+PiAuLi9ERVBPQkpBOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ0RFUE9CSl9ocHBhX3NvbSA9ICQkKHNyY2RpcikvY29uZmlnL29iai1zb20uaCBzdWJzZWdzLmggXCcgPj4gREVQT0JKQQotCWVjaG8gJyAgJCQoSU5DRElSKS9vYnN0YWNrLmggJCQoQkZERElSKS9saWJocHBhLmggXCcgPj4gREVQT0JKQQotCWVjaG8gJyAgJCQoQkZERElSKS9zb20uaCAgJCQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXCcgPj4gREVQT0JKQQotCWVjaG8gJyAgJCQoSU5DRElSKS9hb3V0L3N0YWIuZGVmJyA+PiBERVBPQkpBCi0JIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdERVBPQkpfJyIkJHtjfSInX211bHRpID0gXCcgPj4gREVQT0JKQTsgXAotCSAgICBlY2hvICckJChERVBPQkpfJyIkJHtjfSInX2NvZmYpIFwnID4+IERFUE9CSkE7IFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICckJChERVBPQkpfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiBERVBPQkpBOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoREVQT0JKXyciJCR7Y30iJ19lbGYpJyA+PiBERVBPQkpBOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCW12IC1mIERFUE9CSkEgREVQT0JKCi0KLSMgV29yayBvdXQgdGhlIGRlcGVuZGVuY2llcyBmb3IgZWFjaCBDUFUvT0JKIGNvbWJpbmF0aW9uLgotIyBOb3RlIHRoYXQgU09NIGlzIGEgc3BlY2lhbCBjYXNlLCBiZWNhdXNlIGl0IG9ubHkgd29ya3MgbmF0aXZlLgotREVQMjogJChUQVJHRVRfQ1BVX0hGSUxFUykgJChPQkpfRk9STUFUX0hGSUxFUykKLQlybSAtZiBERVAyYQotCWlmIFsgLWQgREVQRElSIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciBERVBESVI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCBERVBESVI7IFwKLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDsgXAotCSAgICAgICQoTUtERVApIC1mIERFUCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvREVQXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCBERVAgPj4gLi4vREVQMmE7IFwKLQkgICAgZWxzZSB0cnVlOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQllY2hvICdERVBfaHBwYV9zb20gPSAkJChCRkRESVIpL3NvbS5oJyA+PiBERVAyYQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IERFUDJhOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfY29mZikgXCcgPj4gREVQMmE7IFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICckJChERVBfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiBERVAyYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWxmKScgPj4gREVQMmE7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgREVQMmEgREVQMgotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQgXAotCQktZSAicyFASU5DRElSQCEkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUhIiBcCi0JCS1lICJzIUBCRkRESVJAISQke3NyY2Rpcn0vLi4vYmZkISIgXAotCQktZSAicyFAU1JDRElSQCEkJHtzcmNkaXJ9ISIKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1hcHAubzogYXBwLmMKLWFzLm86IGFzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggb3V0cHV0LWZpbGUuaCBcCi0gIHNiLmggbWFjcm8uaAotYXRvZi1nZW5lcmljLm86IGF0b2YtZ2VuZXJpYy5jCi1iaWdudW0tY29weS5vOiBiaWdudW0tY29weS5jCi1jb25kLm86IGNvbmQuYyBtYWNyby5oIHNiLmggJChJTkNESVIpL29ic3RhY2suaAotZGVwZW5kLm86IGRlcGVuZC5jCi1kd2FyZjJkYmcubzogZHdhcmYyZGJnLmMgZHdhcmYyZGJnLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1lY29mZi5vOiBlY29mZi5jIGVjb2ZmLmgKLWVob3B0Lm86IGVob3B0LmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9kd2FyZjIuaAotZXhwci5vOiBleHByLmMgJChJTkNESVIpL29ic3RhY2suaAotZmxvbnVtLWNvcHkubzogZmxvbnVtLWNvcHkuYwotZmxvbnVtLWtvbnN0Lm86IGZsb251bS1rb25zdC5jCi1mbG9udW0tbXVsdC5vOiBmbG9udW0tbXVsdC5jCi1mcmFncy5vOiBmcmFncy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1oYXNoLm86IGhhc2guYyAkKElOQ0RJUikvb2JzdGFjay5oCi1pbnB1dC1maWxlLm86IGlucHV0LWZpbGUuYyBpbnB1dC1maWxlLmgKLWlucHV0LXNjcnViLm86IGlucHV0LXNjcnViLmMgaW5wdXQtZmlsZS5oIHNiLmgKLWxpc3RpbmcubzogbGlzdGluZy5jIGlucHV0LWZpbGUuaCBzdWJzZWdzLmgKLWxpdGVyYWwubzogbGl0ZXJhbC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1tYWNyby5vOiBtYWNyby5jIHNiLmggbWFjcm8uaAotbWVzc2FnZXMubzogbWVzc2FnZXMuYwotb3V0cHV0LWZpbGUubzogb3V0cHV0LWZpbGUuYyBvdXRwdXQtZmlsZS5oCi1yZWFkLm86IHJlYWQuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBzYi5oIG1hY3JvLmggXAotICBlY29mZi5oCi1zYi5vOiBzYi5jIHNiLmgKLXN0YWJzLm86IHN0YWJzLmMgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggZWNvZmYuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXN1YnNlZ3Mubzogc3Vic2Vncy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1zeW1ib2xzLm86IHN5bWJvbHMuYyAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCBcCi0gIHN0cnVjLXN5bWJvbC5oCi13cml0ZS5vOiB3cml0ZS5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIG91dHB1dC1maWxlLmgKLWdhc3AubzogZ2FzcC5jIHNiLmggbWFjcm8uaAotaXRibC1vcHMubzogaXRibC1vcHMuYyBpdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYyBlbXVsLmggXAotICBlbXVsLXRhcmdldC5oCi1lLWkzODZlbGYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYyBlbXVsLmggZW11bC10YXJnZXQuaAotZS1taXBzZWNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jIGVtdWwuaCBcCi0gIGVtdWwtdGFyZ2V0LmgKLWUtbWlwc2VsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jIGVtdWwuaCBlbXVsLXRhcmdldC5oCi0kKE9CSlMpOiAkKERFUF9AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCi0kKFRBUkdfQ1BVX08pOiAkKERFUFRDX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKLSQoT0JKX0ZPUk1BVF9PKTogJChERVBPQkpfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dhcy9ORVdTIGIvZ2FzL05FV1MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMTczNGEuLjAwMDAwMDAKLS0tIGEvZ2FzL05FV1MKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLSotIHRleHQgLSotCi0KLUNoYW5nZXMgaW4gMi4xMDoKLQotTmV3IC0tZmF0YWwtd2FybmluZ3Mgb3B0aW9uLgotCi1waWNvSmF2YSBhcmNoaXRlY3R1cmUgc3VwcG9ydCBhZGRlZC4KLQotTW90b3JvbGEgTUNvcmUgMjEwIHByb2Nlc3NvciBzdXBwb3J0IGFkZGVkLgotCi1BIG5ldyBwc2V1ZG8tb3AgLmludGVsX3N5bnRheCBoYXMgYmVlbiBpbXBsZW1lbnRlZCB0byBhbGxvdyBnYXMgdG8gcGFyc2UgaTM4NgotYXNzZW1ibHkgcHJvZ3JhbXMgd2l0aCBpbnRlbCBzeW50YXguCi0KLU5ldyBwc2V1ZG8tb3BzIC5mdW5jLC5lbmRmdW5jIHRvIGFpZCBpbiBkZWJ1Z2dpbmcgdXNlci13cml0dGVuIGFzc2VtYmxlciBjb2RlLgotCi1BZGRlZCAtZ2R3YXJmMiBvcHRpb24gdG8gZ2VuZXJhdGUgRFdBUkYgMiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLUZ1bGwgMTYtYml0IG1vZGUgc3VwcG9ydCBmb3IgaTM4Ni4KLQotR3JlYXRseSBpbXByb3ZlZCBpbnN0cnVjdGlvbiBvcGVyYW5kIGNoZWNraW5nIGZvciBpMzg2LiAgVGhpcyBjaGFuZ2Ugd2lsbAotcHJvZHVjZSBlcnJvcnMgb3Igd2FybmluZ3Mgb24gaW5jb3JyZWN0IGFzc2VtYmx5IGNvZGUgdGhhdCBwcmV2aW91cyB2ZXJzaW9ucyBvZgotZ2FzIGFjY2VwdGVkLiAgSWYgeW91IGdldCB1bmV4cGVjdGVkIG1lc3NhZ2VzIGZyb20gY29kZSB0aGF0IHdvcmtlZCB3aXRoIG9sZGVyCi12ZXJzaW9ucyBvZiBnYXMsIHBsZWFzZSBkb3VibGUgY2hlY2sgdGhlIGNvZGUgYmVmb3JlIHJlcG9ydGluZyBhIGJ1Zy4KLQotV2VhayBzeW1ib2wgc3VwcG9ydCBhZGRlZCBmb3IgQ09GRiB0YXJnZXRzLgotCi1NaXRzdWJpc2hpIEQzMFYgc3VwcG9ydCBhZGRlZC4KLQotVGV4YXMgSW5zdHJ1bWVudHMgYzgwICh0bXMzMjBjODApIHN1cHBvcnQgYWRkZWQuCi0KLWk5NjAgRUxGIHN1cHBvcnQgYWRkZWQuCi0KLUNoYW5nZXMgaW4gMi45OgotCi1UZXhhcyBJbnN0cnVtZW50cyBjMzAgKHRtczMyMGMzMCkgc3VwcG9ydCBhZGRlZC4KLQotVGhlIGFzc2VtYmxlciBub3cgb3B0aW1pemVzIHRoZSBleGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGJ5IGVnY3MKLWFuZCBnY2MgMi44LiAgVGhlIG5ldyAtLXRyYWRpdGlvbmFsLWZvcm1hdCBvcHRpb24gZGlzYWJsZXMgdGhpcyBvcHRpbWl6YXRpb24uCi0KLUFkZGVkIC0tZ3N0YWJzIG9wdGlvbiB0byBnZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLVRoZSAtYSBvcHRpb24gdGFrZXMgYSBuZXcgc3Vib3B0aW9uLCBtIChlLmcuLCAtYWxtKSB0byBleHBhbmQgbWFjcm9zIGluIGEKLWxpc3RpbmcuCi0KLUFkZGVkIC1NRCBvcHRpb24gdG8gcHJpbnQgZGVwZW5kZW5jaWVzLgotCi1DaGFuZ2VzIGluIDIuODoKLQotQmVPUyBzdXBwb3J0IGFkZGVkLgotCi1NSVBTMTYgc3VwcG9ydCBhZGRlZC4KLQotTW90b3JvbGEgQ29sZEZpcmUgNTIwMCBzdXBwb3J0IGFkZGVkIChjb25maWd1cmUgZm9yIG02OGsgYW5kIHVzZSAtbTUyMDApLgotCi1BbHBoYS9WTVMgc3VwcG9ydCBhZGRlZC4KLQotbTY4ayBvcHRpb25zIC0tYmFzZS1zaXplLWRlZmF1bHQtMTYsIC0tYmFzZS1zaXplLWRlZmF1bHQtMzIsCi0tLWRpc3Atc2l6ZS1kZWZhdWx0LTE2LCBhbmQgLS1kaXNwLXNpemUtZGVmYXVsdC0zMiBhZGRlZC4KLQotVGhlIGFsaWdubWVudCBkaXJlY3RpdmVzIG5vdyB0YWtlIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUKLW1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuICBJZiBkb2luZyB0aGUgYWxpZ25tZW50IHdvdWxkIHJlcXVpcmUgc2tpcHBpbmcKLW1vcmUgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLCB0aGUgYWxpZ25tZW50IGlzIG5vdCBkb25lIGF0IGFsbC4KLQotVGhlIEVMRiBhc3NlbWJsZXIgaGFzIGEgbmV3IHBzZXVkby1vcCwgLnN5bXZlciwgdXNlZCBmb3Igc3ltYm9sIHZlcnNpb25pbmcuCi0KLVRoZSAtYSBvcHRpb24gdGFrZXMgYSBuZXcgc3Vib3B0aW9uLCBjIChlLmcuLCAtYWxjKSwgdG8gc2tpcCBmYWxzZSBjb25kaXRpb25hbHMKLWluIGxpc3RpbmdzLgotCi1BZGRlZCBuZXcgcHNldWRvLW9wLCAuZXF1aXY7IGl0J3MgbGlrZSAuZXF1LCBleGNlcHQgdGhhdCBpdCBpcyBhbiBlcnJvciBpZiB0aGUKLXN5bWJvbCBpcyBhbHJlYWR5IGRlZmluZWQuCi0KLUNoYW5nZXMgaW4gMi43OgotCi1UaGUgUG93ZXJQQyBhc3NlbWJsZXIgbm93IGFsbG93cyB0aGUgdXNlIG9mIHN5bWJvbGljIHJlZ2lzdGVyIG5hbWVzIChyMCwgZXRjLikKLWlmIC1tcmVnbmFtZXMgaXMgdXNlZC4gIFN5bWJvbGljIG5hbWVzIHByZWNlZGVkIGJ5IGEgJyUnICglcjAsIGV0Yy4pIGNhbiBiZQotdXNlZCBhbnkgdGltZS4gIFBvd2VyUEMgODYwIG1vdmUgdG8vZnJvbSBTUFIgaW5zdHJ1Y3Rpb25zIGhhdmUgYmVlbiBhZGRlZC4KLQotQWxwaGEgTGludXggKEVMRikgc3VwcG9ydCBhZGRlZC4KLQotUG93ZXJQQyBFTEYgc3VwcG9ydCBhZGRlZC4KLQotbTY4ayBMaW51eCAoRUxGKSBzdXBwb3J0IGFkZGVkLgotCi1pOTYwIEh4L0p4IHN1cHBvcnQgYWRkZWQuCi0KLWkzODYvUG93ZXJQQyBnbnUtd2luMzIgc3VwcG9ydCBhZGRlZC4KLQotU0NPIEVMRiBzdXBwb3J0IGFkZGVkLiAgRm9yIE9wZW5TZXJ2ZXIgNSB0YXJnZXRzIChpMzg2LXVua25vd24tc2NvMy4ydjUpIHRoZQotZGVmYXVsdCBpcyB0byBidWlsZCBDT0ZGLW9ubHkgc3VwcG9ydC4gIFRvIGdldCBhIHNldCBvZiB0b29scyB0aGF0IGdlbmVyYXRlIEVMRgotKHRoZXknbGwgdW5kZXJzdGFuZCBib3RoIENPRkYgYW5kIEVMRiksIHlvdSBtdXN0IGNvbmZpZ3VyZSB3aXRoCi10YXJnZXQ9aTM4Ni11bmtub3duLXNjbzMuMnY1ZWxmLgotCi1tODhrLW1vdG9yb2xhLXN5c3YzKiBzdXBwb3J0IGFkZGVkLgotCi1DaGFuZ2VzIGluIDIuNjoKLQotR2FzIG5vdyBkaXJlY3RseSBzdXBwb3J0cyBtYWNyb3MsIHdpdGhvdXQgcmVxdWlyaW5nIEdBU1AuCi0KLUdhcyBub3cgaGFzIGFuIE1SSSBhc3NlbWJsZXIgY29tcGF0aWJpbGl0eSBtb2RlLiAgVXNlIC1NIG9yIC0tbXJpIHRvIHNlbGVjdCBNUkkKLW1vZGUuICBUaGUgcHNldWRvLW9wIGBgLm1yaSAxJycgd2lsbCBzd2l0Y2ggaW50byB0aGUgTVJJIG1vZGUgdW50aWwgdGhlIGBgLm1yaQotMCcnIGlzIHNlZW47IHRoaXMgY2FuIGJlIGNvbnZlbmllbnQgZm9yIGlubGluZSBhc3NlbWJsZXIgY29kZS4KLQotQWRkZWQgLS1kZWZzeW0gU1lNPVZBTFVFIG9wdGlvbi4KLQotQWRkZWQgLW1pcHM0IHN1cHBvcnQgdG8gTUlQUyBhc3NlbWJsZXIuCi0KLUFkZGVkIFBJQyBzdXBwb3J0IHRvIFNvbGFyaXMgYW5kIFNQQVJDIFN1bk9TIDQgYXNzZW1ibGVyLgotCi1DaGFuZ2VzIGluIDIuNDoKLQotQ29udmVydGVkIHRoaXMgZGlyZWN0b3J5IHRvIHVzZSBhbiBhdXRvY29uZi1nZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdC4KLQotQVJNIHN1cHBvcnQsIGZyb20gUmljaGFyZCBFYXJuc2hhdy4KLQotVXBkYXRlZCBWTVMgc3VwcG9ydCwgZnJvbSBQYXQgUmFua2luLCBpbmNsdWRpbmcgY29uc2lkZXJhYmx5IGltcHJvdmVkIGRlYnVnZ2luZwotc3VwcG9ydC4KLQotU3VwcG9ydCBmb3IgdGhlIGNvbnRyb2wgcmVnaXN0ZXJzIGluIHRoZSA2ODA2MC4KLQotSGFuZGxlcyAoaWdub3JlcykgYSBuZXcgZGlyZWN0aXZlICIudGhpc19HQ0NfcmVxdWlyZXNfdGhlX0dOVV9hc3NlbWJsZXIiLCB0bwotcHJvdmlkZSBmb3IgcG9zc2libGUgZnV0dXJlIGdjYyBjaGFuZ2VzLCBmb3IgdGFyZ2V0cyB3aGVyZSBnYXMgcHJvdmlkZXMgc29tZQotZmVhdHVyZXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbmF0aXZlIGFzc2VtYmxlci4gIElmIHRoZSBuYXRpdmUgYXNzZW1ibGVyIGlzCi11c2VkLCBpdCBzaG91bGQgYmVjb21lIG9idmlvdXMgcHJldHR5IHF1aWNrbHkgd2hhdCB0aGUgcHJvYmxlbSBpcy4KLQotVXNhZ2UgbWVzc2FnZSBpcyBhdmFpbGFibGUgd2l0aCAiLS1oZWxwIi4KLQotVGhlIEdOVSBBc3NlbWJsZXIgUHJlcHJvY2Vzc29yIChnYXNwKSBpcyBpbmNsdWRlZC4gIChBY3R1YWxseSwgaXQgd2FzIGluIDIuMwotYWxzbywgYnV0IGRpZG4ndCBnZXQgaW50byB0aGUgTkVXUyBmaWxlLikKLQotV2VhayBzeW1ib2wgc3VwcG9ydCBmb3IgYS5vdXQuCi0KLUEgYnVnIGluIHRoZSBsaXN0aW5nIGNvZGUgd2hpY2ggY291bGQgY2F1c2UgYW4gaW5maW5pdGUgbG9vcCBoYXMgYmVlbiBmaXhlZC4KLUJ1Z3MgaW4gbGlzdGluZ3Mgd2hlbiBnZW5lcmF0aW5nIGEgQ09GRiBvYmplY3QgZmlsZSBoYXZlIGFsc28gYmVlbiBmaXhlZC4KLQotSW5pdGlhbCBpMzg2LXN2cjQgUElDIGltcGxlbWVudGF0aW9uIGZyb20gRXJpYyBZb3VuZ2RhbGUsIGJhc2VkIG9uIGNvZGUgYnkgUGF1bAotS3JhbmVuYnVyZy4KLQotSW1wcm92ZWQgQWxwaGEgc3VwcG9ydC4gIEltbWVkaWF0ZSBjb25zdGFudHMgY2FuIGhhdmUgYSBtdWNoIGxhcmdlciByYW5nZSBub3cuCi1TdXBwb3J0IGZvciB0aGUgMjExNjQgaGFzIGJlZW4gY29udHJpYnV0ZWQgYnkgRGlnaXRhbC4KLQotVXBkYXRlZCBuczMyayAocGM1MzItbWFjaCwgbmV0YnNkNTMyKSBzdXBwb3J0IGZyb20gSWFuIERhbGwuCi0KLUNoYW5nZXMgaW4gMi4zOgotCi1NYWNoIGkzODYgc3VwcG9ydCwgYnkgRGF2aWQgTWFja2VuemllIGFuZCBLZW4gUmFlYnVybi4KLQotUlMvNjAwMCBhbmQgUG93ZXJQQyBzdXBwb3J0IGJ5IElhbiBUYXlsb3IuCi0KLVZNUyBjb21tYW5kIHNjcmlwdHMgKG1ha2UtZ2FzLmNvbSwgY29uZmlnLWdhcy5jb20pIGhhdmUgYmVlbiB3b3JrZWQgb24gYSBiaXQsCi1iYXNlZCBvbiBtYWlsIHJlY2VpdmVkIGZyb20gdmFyaW91cyBwZW9wbGUuICBUaGUgYC1oIycgb3B0aW9uIHNob3VsZCB3b3JrIGFnYWluCi10b28uCi0KLUhQLVBBIHdvcmssIGJ5IEplZmYgTGF3LiAgTm90ZSwgZm9yIHRoZSBQQSwgZ2FzLTIuMyBoYXMgYmVlbiBkZXNpZ25lZCB0byB3b3JrCi13aXRoIGdkYi00LjEyIGFuZCBnY2MtMi42LiAgQXMgZ2NjLTIuNiBoYXMgbm90IGJlZW4gcmVsZWFzZWQgeWV0LCBhIHNwZWNpYWwKLXZlcnNpb24gb2YgZ2NjLTIuNS44IGhhcyBiZWVuIHBhdGNoZWQgdG8gd29yayB3aXRoIGdhcy0yLjMuICBZb3UgY2FuIHJldHJpZXZlCi10aGlzIHNwZWNpYWwgdmVyc2lvbiBvZiBnY2MtMi41LjggdmlhIGFub255bW91cyBmdHAgZnJvbSBqYWd1YXIuY3MudXRhaC5lZHUKLWluIHRoZSAiZGlzdCIgZGlyZWN0b3J5LgotCi1WYXggc3VwcG9ydCBpbiBnYXMgZml4ZWQgZm9yIEJTRCwgc28gaXQgYnVpbGRzIGFuZCBzZWVtcyB0byBydW4gYSBjb3VwbGUgc2ltcGxlCi10ZXN0cyBva2F5LiAgSSBoYXZlbid0IHB1dCBpdCB0aHJvdWdoIGV4dGVuc2l2ZSB0ZXN0aW5nLiAgKEdOVSBtYWtlIGlzCi1jdXJyZW50bHkgcmVxdWlyZWQgZm9yIEJTRCA0LjMgYnVpbGRzLikKLQotU3VwcG9ydCBmb3IgdGhlIERFQyBBbHBoYSwgcnVubmluZyBPU0YvMSAoRUNPRkYgZm9ybWF0KS4gIFRoZSBnYXMgc3VwcG9ydCBpcwotYmFzZWQgb24gY29kZSBkb25hdGVkIGJ5IENNVSwgd2hpY2ggdXNlZCBhbiBhLm91dC1iYXNlZCBmb3JtYXQuICBJJ20gYWZyYWlkIHRoZQotYWxwaGEtYS5vdXQgc3VwcG9ydCBpcyBwcmV0dHkgYmFkbHkgbWFuZ2xlZCwgYW5kIG11Y2ggb2YgaXQgcmVtb3ZlZDsgbWFraW5nIGl0Ci13b3JrIHdpbGwgcmVxdWlyZSByZXdyaXRpbmcgaXQgYXMgQkZEIHN1cHBvcnQgZm9yIHRoZSBmb3JtYXQgYW55d2F5cy4KLQotSXJpeCA1IHN1cHBvcnQuCi0KLVRoZSB0ZXN0IHN1aXRlcyBoYXZlIGJlZW4gZml4ZWQgdXAgYSBiaXQsIHNvIHRoYXQgdGhleSBzaG91bGQgd29yayB3aXRoIGEKLWNvdXBsZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgZXhwZWN0IGFuZCBkZWphZ251LgotCi1TeW1ib2xzJyB2YWx1ZXMgYXJlIG5vdyBoYW5kbGVkIGludGVybmFsbHkgYXMgZXhwcmVzc2lvbnMsIHBlcm1pdHRpbmcgbW9yZQotZmxleGliaWxpdHkgaW4gZXZhbHVhdGluZyB0aGVtIGluIHNvbWUgY2FzZXMuICBTb21lIGRldGFpbHMgb2YgcmVsb2NhdGlvbgotaGFuZGxpbmcgaGF2ZSBhbHNvIGNoYW5nZWQsIGFuZCBzaW1wbGUgY29uc3RhbnQgcG9vbCBtYW5hZ2VtZW50IGhhcyBiZWVuIGFkZGVkLAotdG8gbWFrZSB0aGUgQWxwaGEgcG9ydCBlYXNpZXIuCi0KLU5ldyBvcHRpb24gIi0tc3RhdGlzdGljcyIgZm9yIHByaW50aW5nIG91dCBwcm9ncmFtIHJ1biB0aW1lcy4gIFRoaXMgaXMgaW50ZW5kZWQKLXRvIGJlIHVzZWQgd2l0aCB0aGUgZ2NjICItUSIgb3B0aW9uLCB3aGljaCBwcmludHMgb3V0IHRpbWVzIHNwZW50IGluIHZhcmlvdXMKLXBoYXNlcyBvZiBjb21waWxhdGlvbi4gIChZb3Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsbCBvZiB0aGVtIHByaW50ZWQgb3V0IHdpdGgKLSJnY2MgLVEgLVdhLC0tc3RhdGlzdGljcyIsIEkgdGhpbmsuKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNoYW5nZXMgaW4gMi4yOgotCi1SUy82MDAwIEFJWCBhbmQgTUlQUyBTR0kgSXJpeCA1IHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuCi0KLUNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIHN0aWxsIGluIGRldmVsb3BtZW50IChhbmQgdGhlcmVmb3JlIGFyZSBjb252ZW5pZW50IHRvCi1oYXZlIGxpc3RlZCBpbiBjb25maWd1cmUuaW4pIHN0aWxsIGdldCByZWplY3RlZCB3aXRob3V0IGEgbWlub3IgY2hhbmdlIHRvCi1nYXMvTWFrZWZpbGUuaW4sIHNvIHBlb3BsZSBub3QgZG9pbmcgZGV2ZWxvcG1lbnQgd29yayBzaG91bGRuJ3QgZ2V0IHRoZQotaW1wcmVzc2lvbiB0aGF0IHN1cHBvcnQgZm9yIHN1Y2ggY29uZmlndXJhdGlvbnMgaXMgYWN0dWFsbHkgYmVsaWV2ZWQgdG8gYmUKLXJlbGlhYmxlLgotCi1UaGUgcHJvZ3JhbSBuYW1lICh1c3VhbGx5ICJhcyIpIGlzIHByaW50ZWQgd2hlbiBhIGZhdGFsIGVycm9yIG1lc3NhZ2UgaXMKLWRpc3BsYXllZC4gIFRoaXMgc2hvdWxkIHByZXZlbnQgc29tZSBjb25mdXNpb24gYWJvdXQgdGhlIHNvdXJjZSBvZiBvY2Nhc2lvbmFsCi1tZXNzYWdlcyBhYm91dCAiaW50ZXJuYWwgZXJyb3JzIi4KLQotRUxGIHN1cHBvcnQgaXMgZmFsbGluZyBpbnRvIHBsYWNlLiAgU3VwcG9ydCBmb3IgdGhlIDM4NiBzaG91bGQgYmUgd29ya2luZy4KLVN1cHBvcnQgZm9yIFNQQVJDIFNvbGFyaXMgaXMgaW4uICBIUFBBIHN1cHBvcnQgZnJvbSBVdGFoIGlzIGJlaW5nIGludGVncmF0ZWQuCi0KLVN5bWJvbCB2YWx1ZXMgYXJlIG1haW50YWluZWQgYXMgZXhwcmVzc2lvbnMgaW5zdGVhZCBvZiBiZWluZyBpbW1lZGlhdGVseSBib2lsZWQKLWRvd24gdG8gYWRkLXN5bWJvbCwgc3ViLXN5bWJvbCwgYW5kIGNvbnN0YW50LiAgVGhpcyBwZXJtaXRzIHNsaWdodGx5IG1vcmUKLWNvbXBsZXggY2FsY3VsYXRpb25zIGludm9sdmluZyBzeW1ib2xzIHdob3NlIHZhbHVlcyBhcmUgbm90IGFscmVhZGV5IGtub3duLgotCi1EQlgtc3R5bGUgZGVidWdnaW5nIGluZm8gKCJzdGFicyIpIGlzIG5vdyBzdXBwb3J0ZWQgZm9yIENPRkYgZm9ybWF0cy4KLUlmIGFueSBzdGFicyBkaXJlY3RpdmVzIGFyZSBzZWVuIGluIHRoZSBzb3VyY2UsIEdBUyB3aWxsIGNyZWF0ZSB0d28gbmV3Ci1zZWN0aW9uczogYSAiLnN0YWIiIGFuZCBhICIuc3RhYnN0ciIgc2VjdGlvbi4gIFRoZSBmb3JtYXQgb2YgdGhlIC5zdGFiCi1zZWN0aW9uIGlzIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIGEub3V0IHN5bWJvbCBmb3JtYXQsIGFuZCAuc3RhYnN0ciBpcwotaXRzIHN0cmluZyB0YWJsZS4gIEZvciB0aGlzIHRvIGJlIHVzZWZ1bCwgeW91IG11c3QgaGF2ZSBjb25maWd1cmVkIEdDQwotdG8gZ2VuZXJhdGUgc3RhYnMgKGJ5IGRlZmluaW5nIERCWF9ERUJVR0dJTkdfSU5GTyksIGFuZCBtdXN0IGhhdmUgYSBHREIKLXRoYXQgY2FuIHVzZSB0aGUgc3RhYiBzZWN0aW9ucyAoNC4xMSBvciBsYXRlcikuCi0KLUx5bnhPUywgb24gaTM4NiBhbmQgbTY4ayBwbGF0Zm9ybXMsIGlzIG5vdyBzdXBwb3J0ZWQuICBTUEFSQyBMeW54T1MKLXN1cHBvcnQgaXMgaW4gcHJvZ3Jlc3MuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlcyBpbiAyLjE6Ci0KLVNldmVyYWwgc21hbGwgZml4ZXMgZm9yIGkzODYtYWl4IChQUy8yKSBzdXBwb3J0IGZyb20gTWluaCBUcmFuLUxlIGhhdmUgYmVlbgotaW5jb3Jwb3JhdGVkLCBidXQgbm90IHdlbGwgdGVzdGVkIHlldC4KLQotQWx0ZXJlZCB0aGUgb3Bjb2RlIHRhYmxlIHNwbGl0IGZvciBtNjhrOyBpdCBzaG91bGQgcmVxdWlyZSBsZXNzIFZNIHRvIGNvbXBpbGUKLXdpdGggZ2NjIG5vdy4KLQotU29tZSBtaW5vciBhZGp1c3RtZW50cyB0byBhZGQgKENvbnZlcmdlbnQgVGVjaG5vbG9naWVzJykgTWluaWZyYW1lIHN1cHBvcnQsCi1zdWdnZXN0ZWQgYnkgUm9uYWxkIENvbGUuCi0KLUhQUEEgc3VwcG9ydCAocnVubmluZyBPU0Ygb25seSwgbm90IEhQVVgpIGhhcyBiZWVuIGNvbnRyaWJ1dGVkIGJ5IFV0YWguICBUaGlzCi1pbmNsdWRlcyBpbXByb3ZlZCBFTEYgc3VwcG9ydCwgd2hpY2ggSSd2ZSBzdGFydGVkIGFkYXB0aW5nIGZvciBTUEFSQyBTb2xhcmlzCi0yLnguICBJbnRlZ3JhdGlvbiBpc24ndCBjb21wbGV0ZWx5LCBzbyBpdCBwcm9iYWJseSB3b24ndCB3b3JrLgotCi1IUDkwMDAvMzAwIHN1cHBvcnQsIGRvbmF0ZWQgYnkgSFAsIGhhcyBiZWVuIG1lcmdlZCBpbi4KLQotSWFuIFRheWxvciBoYXMgZmluaXNoZWQgdGhlIE1JUFMgRUNPRkYgKFVsdHJpeCwgSXJpeCkgc3VwcG9ydC4KLQotQmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyAoZS5nLiwgaHBwYS1ocHV4KS4KLQotVGVzdCBzdWl0ZSBmcmFtZXdvcmsgaXMgc3RhcnRpbmcgdG8gYmVjb21lIHJlYXNvbmFibGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlcyBpbiAyLjA6Ci0KLU1vc3RseSBidWcgZml4ZXMuCi0KLVNvbWUgbW9yZSBtZXJnaW5nIG9mIEJGRCBhbmQgRUxGIGNvZGUsIGJ1dCBFTEYgc3RpbGwgZG9lc24ndCB3b3JrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNoYW5nZXMgaW4gMS45NDoKLQotQkZEIG1lcmdlIGlzIHBhcnRseSBkb25lLiAgQWR2ZW50dXJvdXMgc291bHMgbWF5IHRyeSBnaXZpbmcgY29uZmlndXJlIHRoZQotIi0td2l0aC1iZmQtYXNzZW1ibGVyIiBvcHRpb24uICBDdXJyZW50bHksIEVMRiBmb3JtYXQgcmVxdWlyZXMgaXQsIGEub3V0IGZvcm1hdAotYWNjZXB0cyBpdDsgU1BBUkMgQ1BVIGFjY2VwdHMgaXQuICBJdCdzIHRoZSBkZWZhdWx0IG9ubHkgZm9yIE9TICJlbGYiIG9yCi0ic29sYXJpcyIuICAoRUxGIGlzbid0IHJlYWxseSBzdXBwb3J0ZWQgeWV0LiAgSXQgbmVlZHMgd29yay4gIEkndmUgZ290IHNvbWUKLWNvZGUgZnJvbSBVdGFoIGZvciBIUC1QQSBFTEYsIGFuZCBmcm9tIERHIGZvciBtODhrIEVMRiwgYnV0IHRoZXkncmUgbm90IGZ1bGx5Ci1tZXJnZWQgeWV0LikKLQotVGhlIDY4SyBvcGNvZGUgdGFibGUgaGFzIGJlZW4gc3BsaXQgaW4gaGFsZi4gIEl0IHNob3VsZCBub3cgY29tcGlsZSB1bmRlciBnY2MKLXdpdGhvdXQgY29uc3VtaW5nIHJpZGljdWxvdXMgYW1vdW50cyBvZiBtZW1vcnkuCi0KLUEgY291cGxlIGRhdGEgc3RydWN0dXJlcyBoYXZlIGJlZW4gcmVkdWNlZCBpbiBzaXplLiAgVGhpcyBzaG91bGQgcmVzdWx0IGluCi1zYXZpbmcgYSBsaXR0bGUgYml0IG9mIHNwYWNlIGF0IHJ1bnRpbWUuCi0KLVN1cHBvcnQgZm9yIE1JUFMsIGZyb20gT1NGIGFuZCBSYWxwaCBDYW1wYmVsbCwgaGFzIGJlZW4gbWVyZ2VkIGluLiAgVGhlIE9TRgotY29kZSBwcm92aWRlZCBST1NFIGZvcm1hdCBzdXBwb3J0LCB3aGljaCBJIGhhdmVuJ3QgbWVyZ2VkIGluIHlldC4gIChJIGNhbiBtYWtlCi1pdCBhdmFpbGFibGUsIGlmIGFueW9uZSB3YW50cyB0byB0cnkgaXQgb3V0LikgIFJhbHBoJ3MgY29kZSwgZm9yIEJTRCA0LjQsCi1zdXBwb3J0cyBhLm91dCBmb3JtYXQuICBXZSBkb24ndCBoYXZlIEVDT0ZGIHN1cHBvcnQgaW4ganVzdCB5ZXQ7IGl0J3MgY29taW5nLgotCi1TdXBwb3J0IGZvciB0aGUgSGl0YWNoaSBIOC81MDAgaGFzIGJlZW4gYWRkZWQuCi0KLVZNUyBob3N0IGFuZCB0YXJnZXQgc3VwcG9ydCBzaG91bGQgYmUgd29ya2luZyBub3csIHRoYW5rcyBjaGllZmx5IHRvIEVyaWMKLVlvdW5nZGFsZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DaGFuZ2VzIGluIDEuOTMuMDE6Ci0KLUZvciBtNjhrLCBzdXBwb3J0IGZvciBtb3JlIHByb2Nlc3NvcnMgaGFzIGJlZW4gYWRkZWQ6IDY4MDQwLCBDUFUzMiwgNjg4NTEuCi0KLUZvciBpMzg2LCAuYWxpZ24gaXMgbm93IHBvd2VyLW9mLXR3bzsgd2FzIG51bWJlci1vZi1ieXRlcy4KLQotRm9yIG02OGssICIlIiBpcyBub3cgYWNjZXB0ZWQgYmVmb3JlIHJlZ2lzdGVyIG5hbWVzLiAgRm9yIENPRkYgZm9ybWF0LCB3aGljaAotZG9lc24ndCB1c2UgdW5kZXJzY29yZSBwcmVmaXhlcyBmb3IgQyBsYWJlbHMsIGl0IGlzIHJlcXVpcmVkLCBzbyB2YXJpYWJsZSAiYTAiCi1jYW4gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIHRoZSByZWdpc3Rlci4KLQotTGFzdCBwdWJsaWMgcmVsZWFzZSB3YXMgMS4zOC4gIExvdHMgb2YgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHNpbmNlIHRoZW4sIGxvdHMKLW9mIG5ldyBDUFVzIGFuZCBmb3JtYXRzLCBsb3RzIG9mIGJ1Z3MgZml4ZWQuCi0KLQwKLUxvY2FsIHZhcmlhYmxlczoKLWZpbGwtY29sdW1uOiA3OQotRW5kOgpkaWZmIC0tZ2l0IGEvZ2FzL1JFQURNRSBiL2dhcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzI3ZGIuLjAwMDAwMDAKLS0tIGEvZ2FzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0JCVJFQURNRSBmb3IgR0FTCi0KLUEgbnVtYmVyIG9mIHRoaW5ncyBoYXZlIGNoYW5nZWQgc2luY2UgdmVyc2lvbiAxIGFuZCB0aGUgd29uZGVyZnVsIHdvcmxkIG9mIGdhcwotbG9va3MgdmVyeSBkaWZmZXJlbnQuICBUaGVyZSdzIHN0aWxsIGEgbG90IG9mIGlycmVsZXZhbnQgZ2FyYmFnZSBseWluZyBhcm91bmQKLXRoYXQgd2lsbCBiZSBjbGVhbmVkIHVwIGluIHRpbWUuICBEb2N1bWVudGF0aW9uIGlzIHNjYXJjZSwgYXMgYXJlIGxvZ3Mgb2YgdGhlCi1jaGFuZ2VzIG1hZGUgc2luY2UgdGhlIGxhc3QgZ2FzIHJlbGVhc2UuICBNeSBhcG9sb2dpZXMsIGFuZCBJJ2xsIHRyeSB0byBnZXQKLXNvbWV0aGluZyB1c2VmdWwuCi0KLVVucGFja2luZyBhbmQgSW5zdGFsbGF0aW9uIC0gU3VtbWFyeQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNlZSAuLi9iaW51dGlscy9SRUFETUUuCi0KLVRvIGJ1aWxkIGp1c3QgdGhlIGFzc2VtYmxlciwgbWFrZSB0aGUgdGFyZ2V0IGFsbC1nYXMuCi0KLURvY3VtZW50YXRpb24KLT09PT09PT09PT09PT0KLQotVGhlIEdBUyByZWxlYXNlIGluY2x1ZGVzIHRleGluZm8gc291cmNlIGZvciBpdHMgbWFudWFsLCB3aGljaCBjYW4gYmUgcHJvY2Vzc2VkCi1pbnRvIGBpbmZvJyBvciBgZHZpJyBmb3Jtcy4KLQotVGhlIERWSSBmb3JtIGlzIHN1aXRhYmxlIGZvciBwcmludGluZyBvciBkaXNwbGF5aW5nOyB0aGUgY29tbWFuZHMgZm9yIGRvaW5nCi10aGlzIHZhcnkgZnJvbSBzeXN0ZW0gdG8gc3lzdGVtLiAgT24gbWFueSBzeXN0ZW1zLCBgbHByIC1kJyB3aWxsIHByaW50IGEgRFZJCi1maWxlLiAgT24gb3RoZXJzLCB5b3UgbWF5IG5lZWQgdG8gcnVuIGEgcHJvZ3JhbSBzdWNoIGFzIGBkdmlwcycgdG8gY29udmVydCB0aGUKLURWSSBmaWxlIGludG8gYSBmb3JtIHlvdXIgc3lzdGVtIGNhbiBwcmludC4KLQotSWYgeW91IHdpc2ggdG8gYnVpbGQgdGhlIERWSSBmaWxlLCB5b3Ugd2lsbCBuZWVkIHRvIGhhdmUgVGVYIGluc3RhbGxlZCBvbiB5b3VyCi1zeXN0ZW0uICBZb3UgY2FuIHJlYnVpbGQgaXQgYnkgdHlwaW5nOgotCi0JY2QgZ2FzL2RvYwotCW1ha2UgYXMuZHZpCi0KLVRoZSBJbmZvIGZvcm0gaXMgdmlld2FibGUgd2l0aCB0aGUgR05VIEVtYWNzIGBpbmZvJyBzdWJzeXN0ZW0sIG9yIHRoZQotc3RhbmRhbG9uZSBgaW5mbycgcHJvZ3JhbSwgYXZhaWxhYmxlIGFzIHBhcnQgb2YgdGhlIEdOVSBUZXhpbmZvIGRpc3RyaWJ1dGlvbi4KLVRvIGJ1aWxkIHRoZSBpbmZvIGZpbGVzLCB5b3Ugd2lsbCBuZWVkIHRoZSBgbWFrZWluZm8nIHByb2dyYW0uICBUeXBlOgotCi0JY2QgZ2FzL2RvYwotCW1ha2UgaW5mbwotCi1TcGVjaWZ5aW5nIG5hbWVzIGZvciBob3N0cyBhbmQgdGFyZ2V0cwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgVGhlIHNwZWNpZmljYXRpb25zIHVzZWQgZm9yIGhvc3RzIGFuZCB0YXJnZXRzIGluIHRoZSBgY29uZmlndXJlJwotc2NyaXB0IGFyZSBiYXNlZCBvbiBhIHRocmVlLXBhcnQgbmFtaW5nIHNjaGVtZSwgYnV0IHNvbWUgc2hvcnQKLXByZWRlZmluZWQgYWxpYXNlcyBhcmUgYWxzbyBzdXBwb3J0ZWQuICBUaGUgZnVsbCBuYW1pbmcgc2NoZW1lIGVuY29kZXMKLXRocmVlIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUgZm9sbG93aW5nIHBhdHRlcm46Ci0KLSAgICAgQVJDSElURUNUVVJFLVZFTkRPUi1PUwotCi0gICBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgdGhlIGFsaWFzIGBzdW40JyBhcyBhIEhPU1QgYXJndW1lbnQgb3IgaW4gYQotYC0tdGFyZ2V0PVRBUkdFVCcgb3B0aW9uLiAgVGhlIGVxdWl2YWxlbnQgZnVsbCBuYW1lIGlzCi1gc3BhcmMtc3VuLXN1bm9zNCcuCi0KLSAgIFRoZSBgY29uZmlndXJlJyBzY3JpcHQgYWNjb21wYW55aW5nIEdBUyBkb2VzIG5vdCBwcm92aWRlIGFueSBxdWVyeQotZmFjaWxpdHkgdG8gbGlzdCBhbGwgc3VwcG9ydGVkIGhvc3QgYW5kIHRhcmdldCBuYW1lcyBvciBhbGlhc2VzLiAKLWBjb25maWd1cmUnIGNhbGxzIHRoZSBCb3VybmUgc2hlbGwgc2NyaXB0IGBjb25maWcuc3ViJyB0byBtYXAKLWFiYnJldmlhdGlvbnMgdG8gZnVsbCBuYW1lczsgeW91IGNhbiByZWFkIHRoZSBzY3JpcHQsIGlmIHlvdSB3aXNoLCBvcgoteW91IGNhbiB1c2UgaXQgdG8gdGVzdCB5b3VyIGd1ZXNzZXMgb24gYWJicmV2aWF0aW9ucy0tZm9yIGV4YW1wbGU6Ci0KLSAgICAgJSBzaCBjb25maWcuc3ViIHN1bjQKLSAgICAgc3BhcmMtc3VuLXN1bm9zNDExCi0gICAgICUgc2ggY29uZmlnLnN1YiBzdW4zCi0gICAgIG02OGstc3VuLXN1bm9zNDExCi0gICAgICUgc2ggY29uZmlnLnN1YiBkZWNzdGF0aW9uCi0gICAgIG1pcHMtZGVjLXVsdHJpeDQyCi0gICAgICUgc2ggY29uZmlnLnN1YiBocDMwMGJzZAotICAgICBtNjhrLWhwLWJzZAotICAgICAlIHNoIGNvbmZpZy5zdWIgaTM4NnYKLSAgICAgaTM4Ni11bmtub3duLXN5c3YKLSAgICAgJSBzaCBjb25maWcuc3ViIGk3ODZ2Ci0gICAgIEludmFsaWQgY29uZmlndXJhdGlvbiBgaTc4NnYnOiBtYWNoaW5lIGBpNzg2dicgbm90IHJlY29nbml6ZWQKLQotCi1gY29uZmlndXJlJyBvcHRpb25zCi09PT09PT09PT09PT09PT09PT09Ci0KLSAgIEhlcmUgaXMgYSBzdW1tYXJ5IG9mIHRoZSBgY29uZmlndXJlJyBvcHRpb25zIGFuZCBhcmd1bWVudHMgdGhhdCBhcmUKLW1vc3Qgb2Z0ZW4gdXNlZnVsIGZvciBidWlsZGluZyBHQVMuICBgY29uZmlndXJlJyBhbHNvIGhhcyBzZXZlcmFsIG90aGVyCi1vcHRpb25zIG5vdCBsaXN0ZWQgaGVyZS4KLQotICAgICBjb25maWd1cmUgWy0taGVscF0KLSAgICAgICAgICAgICAgIFstLXByZWZpeD1ESVJdCi0gICAgICAgICAgICAgICBbLS1zcmNkaXI9UEFUSF0KLSAgICAgICAgICAgICAgIFstLWhvc3Q9SE9TVF0KLSAgICAgICAgICAgICAgIFstLXRhcmdldD1UQVJHRVRdCi0gICAgICAgICAgICAgICBbLS13aXRoLU9QVElPTl0KLSAgICAgICAgICAgICAgIFstLWVuYWJsZS1PUFRJT05dCi0KLVlvdSBtYXkgaW50cm9kdWNlIG9wdGlvbnMgd2l0aCBhIHNpbmdsZSBgLScgcmF0aGVyIHRoYW4gYC0tJyBpZiB5b3UKLXByZWZlcjsgYnV0IHlvdSBtYXkgYWJicmV2aWF0ZSBvcHRpb24gbmFtZXMgaWYgeW91IHVzZSBgLS0nLgotCi1gLS1oZWxwJwotICAgICBQcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gYGNvbmZpZ3VyZScsIGFuZCBleGl0LgotCi1gLXByZWZpeD1ESVInCi0gICAgIENvbmZpZ3VyZSB0aGUgc291cmNlIHRvIGluc3RhbGwgcHJvZ3JhbXMgYW5kIGZpbGVzIHVuZGVyIGRpcmVjdG9yeQotICAgICBgRElSJy4KLQotYC0tc3JjZGlyPVBBVEgnCi0gICAgIExvb2sgZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgaW4gZGlyZWN0b3J5IERJUi4gIFVzdWFsbHkKLSAgICAgYGNvbmZpZ3VyZScgY2FuIGRldGVybWluZSB0aGF0IGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LgotCi1gLS1ob3N0PUhPU1QnCi0gICAgIENvbmZpZ3VyZSBHQVMgdG8gcnVuIG9uIHRoZSBzcGVjaWZpZWQgSE9TVC4gIE5vcm1hbGx5IHRoZQotICAgICBjb25maWd1cmUgc2NyaXB0IGNhbiBmaWd1cmUgdGhpcyBvdXQgYXV0b21hdGljYWxseS4KLQotICAgICBUaGVyZSBpcyBubyBjb252ZW5pZW50IHdheSB0byBnZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZQotICAgICBob3N0cy4KLQotYC0tdGFyZ2V0PVRBUkdFVCcKLSAgICAgQ29uZmlndXJlIEdBUyBmb3IgY3Jvc3MtYXNzZW1ibGluZyBwcm9ncmFtcyBmb3IgdGhlIHNwZWNpZmllZAotICAgICBUQVJHRVQuICBXaXRob3V0IHRoaXMgb3B0aW9uLCBHQVMgaXMgY29uZmlndXJlZCB0byBhc3NlbWJsZSAubyBmaWxlcwotICAgICB0aGF0IHJ1biBvbiB0aGUgc2FtZSBtYWNoaW5lIChIT1NUKSBhcyBHQVMgaXRzZWxmLgotCi0gICAgIFRoZXJlIGlzIG5vIGNvbnZlbmllbnQgd2F5IHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlCi0gICAgIHRhcmdldHMuCi0KLWAtLWVuYWJsZS1PUFRJT04nCi0gICAgIFRoZXNlIGZsYWdzIHRlbGwgdGhlIHByb2dyYW0gb3IgbGlicmFyeSBiZWluZyBjb25maWd1cmVkIHRvIAotICAgICBjb25maWd1cmUgaXRzZWxmIGRpZmZlcmVudGx5IGZyb20gdGhlIGRlZmF1bHQgZm9yIHRoZSBzcGVjaWZpZWQKLSAgICAgaG9zdC90YXJnZXQgY29tYmluYXRpb24uICBTZWUgYmVsb3cgZm9yIGEgbGlzdCBvZiBgLS1lbmFibGUnCi0gICAgIG9wdGlvbnMgcmVjb2duaXplZCBpbiB0aGUgZ2FzIGRpc3RyaWJ1dGlvbi4KLQotYGNvbmZpZ3VyZScgYWNjZXB0cyBvdGhlciBvcHRpb25zLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNvbmZpZ3VyaW5nCi1vdGhlciBHTlUgdG9vbHMgcmVjdXJzaXZlbHk7IGJ1dCB0aGVzZSBhcmUgdGhlIG9ubHkgb3B0aW9ucyB0aGF0IGFmZmVjdAotR0FTIG9yIGl0cyBzdXBwb3J0aW5nIGxpYnJhcmllcy4KLQotVGhlIGAtLWVuYWJsZScgb3B0aW9ucyByZWNvZ25pemVkIGJ5IHNvZnR3YXJlIGluIHRoZSBnYXMgZGlzdHJpYnV0aW9uIGFyZToKLQotYC0tZW5hYmxlLXRhcmdldHM9Li4uJwotICAgICBUaGlzIGNhdXNlcyBvbmUgb3IgbW9yZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbnMgdG8gYmUgYWRkZWQgdG8gdGhvc2UgZm9yCi0gICAgIHdoaWNoIEJGRCBzdXBwb3J0IGlzIGNvbXBpbGVkLiAgQ3VycmVudGx5IGdhcyBjYW5ub3QgdXNlIGFueSBmb3JtYXQgb3RoZXIKLSAgICAgdGhhbiBpdHMgY29tcGlsZWQtaW4gZGVmYXVsdCwgc28gdGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsLgotCi1gLS1lbmFibGUtYmZkLWFzc2VtYmxlcicKLSAgICAgVGhpcyBjYXVzZXMgdGhlIGFzc2VtYmxlciB0byB1c2UgdGhlIG5ldyBjb2RlIGJlaW5nIG1lcmdlZCBpbnRvIGl0IHRvIHVzZQotICAgICBCRkQgZGF0YSBzdHJ1Y3R1cmVzIGludGVybmFsbHksIGFuZCB1c2UgQkZEIGZvciB3cml0aW5nIG9iamVjdCBmaWxlcy4KLSAgICAgRm9yIG1vc3QgdGFyZ2V0cywgdGhpcyBpc24ndCBzdXBwb3J0ZWQgeWV0LiAgRm9yIG1vc3QgdGFyZ2V0cyB3aGVyZSBpdCBoYXMKLSAgICAgYmVlbiBkb25lLCBpdCdzIGFscmVhZHkgdGhlIGRlZmF1bHQuICBTbyBnZW5lcmFsbHkgeW91IHdvbid0IG5lZWQgdG8gdXNlCi0gICAgIHRoaXMgb3B0aW9uLgotCi1TdXBwb3J0ZWQgcGxhdGZvcm1zCi09PT09PT09PT09PT09PT09PT09Ci0KLUF0IHRoaXMgcG9pbnQgSSBiZWxpZXZlIGdhcyB0byBiZSBhbnNpIG9ubHkgY29kZSBmb3IgbW9zdCB0YXJnZXQgY3B1J3MuICBUaGF0Ci1pcywgdGhlcmUgc2hvdWxkIGJlIHJlbGF0aXZlbHkgZmV3LCBpZiBhbnkgaG9zdCBzeXN0ZW0gZGVwZW5kZW5jaWVzLiAgU28KLXBvcnRpbmcgKGFzIGEgY3Jvc3MtYXNzZW1ibGVyKSB0byBob3N0cyBub3QgeWV0IHN1cHBvcnRlZCBzaG91bGQgYmUgZmFpcmx5Ci1lYXN5LiAgUG9ydGluZyB0byBhIG5ldyB0YXJnZXQgc2hvdWxkbid0IGJlIHRvbyB0b3VnaCBpZiBpdCdzIGEgdmFyaWFudCBvZiBvbmUKLWFscmVhZHkgc3VwcG9ydGVkLgotCi1OYXRpdmUgYXNzZW1ibGluZyBzaG91bGQgd29yayBvbjoKLQotCXN1bjMKLQlzdW40Ci0JMzg2YnNkCi0JYnNkLzM4NgotCWRlbHRhIChtNjhrLXN5c3YgZnJvbSBNb3Rvcm9sYSkKLQlkZWx0YTg4IChtODhrLXN5c3YgZnJvbSBNb3Rvcm9sYSkKLQlHTlUvbGludXgKLQltNjhrIGhwdXggOC4wIChocHV4IDcuMCBtYXkgYmUgYSBwcm9ibGVtKQotCXZheCBic2QsIHVsdHJpeCwgdm1zCi0JaHA5MDAwczMwMAotCWRlY3N0YXRpb24KLQlpcml4IDQKLQlpcml4IDUKLQltaW5pZnJhbWUgKG02OGstc3lzdiBmcm9tIENvbnZlcmdlbnQgVGVjaG5vbG9naWVzKQotCWkzODYtYWl4IChwcy8yKQotCWhwcGEgKGhwdXggNC4zYnNkLCBvc2YxKQotCUFJWAotCXVuaXh3YXJlCi0Jc2NvIDMuMnY0LjIKLQlzY28gb3BlbnNlcnZlciA1LjAgKGEuay5hLiAzLjJ2NS4wICkKLQlzcGFyYyBzb2xhcmlzCi0JbnMzMmsgKG5ldGJzZCwgbGl0ZXMpCi0KLUkgYmVsaWV2ZSB0aGF0IGdhcyBhcyBhIGNyb3NzLWFzc2VtYmxlciBjYW4gY3VycmVudGx5IGJlIHRhcmdldHRlZCBmb3IKLW1vc3Qgb2YgdGhlIGFib3ZlIGhvc3RzLCBwbHVzCi0KLQlkZWNzdGF0aW9uLWJzZCAoYS5vdXQgZm9ybWF0LCB0byBiZSB1c2VkIGluIEJTRCA0LjQpCi0JZWJtb24yOWsKLQlnbzMyIChET1Mgb24gaTM4Niwgd2l0aCBESkdQUCAtLSBvbGQgYS5vdXQgdmVyc2lvbikKLQloOC8zMDAsIGg4LzUwMCAoSGl0YWNoaSkKLQlpMzg2LWFpeCAocHMvMikKLQlpOTYwLWNvZmYKLQltaXBzIGVjb2ZmIChkZWNzdGF0aW9uLXVsdHJpeCwgaXJpcywgbWlwcyBtYWdudW0sIG1pcHMtaWR0LWVjb2ZmKQotCU1pdHN1YmlzaGkgZDEwdiBhbmQgZDMwdgotCW5pbmR5OTYwCi0JcG93ZXJwYyBFQUJJCi0JU0ggKEhpdGFjaGkpCi0Jc2NvMzg2Ci0JVEkgdGljMzAgYW5kIHRpYzgwCi0JdmF4IGJzZCBvciB1bHRyaXg/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+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQpkaWZmIC0tZ2l0IGEvZ2FzL2FwcC5jIGIvZ2FzL2FwcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Q1NzlkLi4wMDAwMDAwCi0tLSBhL2dhcy9hcHAuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNzQgKzAsMCBAQAotLyogVGhpcyBpcyB0aGUgQXNzZW1ibGVyIFByZS1Qcm9jZXNzb3IKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIE1vZGlmaWVkIGJ5IEFsbGVuIFdpcmZzLUJyb2NrLCBJbnN0YW50aWF0aW9ucyBJbmMgMi85MCAqLwotLyogQXBwLCB0aGUgYXNzZW1ibGVyIHByZS1wcm9jZXNzb3IuICBUaGlzIHByZS1wcm9jZXNzb3Igc3RyaXBzIG91dCBleGNlc3MKLSAgIHNwYWNlcywgdHVybnMgc2luZ2xlLXF1b3RlZCBjaGFyYWN0ZXJzIGludG8gYSBkZWNpbWFsIGNvbnN0YW50LCBhbmQgdHVybnMKLSAgICMgPG51bWJlcj4gPGZpbGVuYW1lPiA8Z2FyYmFnZT4gaW50byBhIC5saW5lIDxudW1iZXI+XG4uZmlsZSA8ZmlsZW5hbWU+Ci0gICBwYWlyLiAgVGhpcyBuZWVkcyBiZXR0ZXIgZXJyb3ItaGFuZGxpbmcuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgkJCS8qIEZvciBCQURfQ0FTRSgpIG9ubHkgKi8KLQotI2lmIChfX1NURENfXyAhPSAxKQotI2lmbmRlZiBjb25zdAotI2RlZmluZSBjb25zdCAgLyogZW1wdHkgKi8KLSNlbmRpZgotI2VuZGlmCi0KLS8qIFdoZXRoZXIgd2UgYXJlIHNjcnViYmluZyBpbiBtNjhrIE1SSSBtb2RlLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbQotICAgZmxhZ19tNjhrX21yaSwgYmVjYXVzZSB0aGUgdHdvIGZsYWdzIHdpbGwgYmUgYWZmZWN0ZWQgYnkgdGhlIC5tcmkKLSAgIHBzZXVkby1vcCBhdCBkaWZmZXJlbnQgdGltZXMuICAqLwotc3RhdGljIGludCBzY3J1Yl9tNjhrX21yaTsKLQotLyogVGhlIHBzZXVkby1vcCB3aGljaCBzd2l0Y2hlcyBpbiBhbmQgb3V0IG9mIE1SSSBtb2RlLiAgU2VlIHRoZQotICAgY29tbWVudCBpbiBkb19zY3J1Yl9jaGFycy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBtcmlfcHNldWRvW10gPSAiLm1yaSAwIjsKLQotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotLyogVGhlIHBzZXVkby1vcCBmb3Igd2hpY2ggd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgYEAnIGNoYXJhY3RlcnMuIAotICAgU2VlIHRoZSBjb21tZW50IGluIGRvX3NjcnViX2NoYXJzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICAgc3ltdmVyX3BzZXVkb1tdID0gIi5zeW12ZXIiOwotc3RhdGljIGNvbnN0IGNoYXIgKiBzeW12ZXJfc3RhdGU7Ci0jZW5kaWYKLQotc3RhdGljIGNoYXIgbGV4WzI1Nl07Ci1zdGF0aWMgY29uc3QgY2hhciBzeW1ib2xfY2hhcnNbXSA9Ci0iJC5fQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiOwotCi0jZGVmaW5lIExFWF9JU19TWU1CT0xfQ09NUE9ORU5UCQkxCi0jZGVmaW5lIExFWF9JU19XSElURVNQQUNFCQkyCi0jZGVmaW5lIExFWF9JU19MSU5FX1NFUEFSQVRPUgkJMwotI2RlZmluZSBMRVhfSVNfQ09NTUVOVF9TVEFSVAkJNAotI2RlZmluZSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUCTUKLSNkZWZpbmUJTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8xU1QJNgotI2RlZmluZQlMRVhfSVNfU1RSSU5HUVVPVEUJCTgKLSNkZWZpbmUJTEVYX0lTX0NPTE9OCQkJOQotI2RlZmluZQlMRVhfSVNfTkVXTElORQkJCTEwCi0jZGVmaW5lCUxFWF9JU19PTkVDSEFSX1FVT1RFCQkxMQotI2lmZGVmIFRDX1Y4NTAKLSNkZWZpbmUgTEVYX0lTX0RPVUJMRURBU0hfMVNUCQkxMgotI2VuZGlmCi0jaWZkZWYgVENfTTMyUgotI2RlZmluZSBMRVhfSVNfRE9VQkxFQkFSXzFTVAkJMTMKLSNlbmRpZgotI2RlZmluZSBJU19TWU1CT0xfQ09NUE9ORU5UKGMpCQkobGV4W2NdID09IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UKQotI2RlZmluZSBJU19XSElURVNQQUNFKGMpCQkobGV4W2NdID09IExFWF9JU19XSElURVNQQUNFKQotI2RlZmluZSBJU19MSU5FX1NFUEFSQVRPUihjKQkJKGxleFtjXSA9PSBMRVhfSVNfTElORV9TRVBBUkFUT1IpCi0jZGVmaW5lIElTX0NPTU1FTlQoYykJCQkobGV4W2NdID09IExFWF9JU19DT01NRU5UX1NUQVJUKQotI2RlZmluZSBJU19MSU5FX0NPTU1FTlQoYykJCShsZXhbY10gPT0gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVCkKLSNkZWZpbmUJSVNfTkVXTElORShjKQkJCShsZXhbY10gPT0gTEVYX0lTX05FV0xJTkUpCi0KLXN0YXRpYyBpbnQgcHJvY2Vzc19lc2NhcGUgUEFSQU1TICgoaW50KSk7Ci0KLS8qIEZJWE1FLXNvb246IFRoZSBlbnRpcmUgbGV4ZXIvcGFyc2VyIHRoaW5neSBzaG91bGQgYmUKLSAgIGJ1aWx0IHN0YXRpY2FsbHkgYXQgY29tcGlsZSB0aW1lIHJhdGhlciB0aGFuIGR5bmFtaWNhbGx5Ci0gICBlYWNoIGFuZCBldmVyeSB0aW1lIHRoZSBhc3NlbWJsZXIgaXMgcnVuLiAgeG94b3JpY2guICovCi0KLXZvaWQgCi1kb19zY3J1Yl9iZWdpbiAobTY4a19tcmkpCi0gICAgIGludCBtNjhrX21yaTsKLXsKLSAgY29uc3QgY2hhciAqcDsKLSAgaW50IGM7Ci0KLSAgc2NydWJfbTY4a19tcmkgPSBtNjhrX21yaTsKLQotICBsZXhbJyAnXSA9IExFWF9JU19XSElURVNQQUNFOwotICBsZXhbJ1x0J10gPSBMRVhfSVNfV0hJVEVTUEFDRTsKLSAgbGV4WydcciddID0gTEVYX0lTX1dISVRFU1BBQ0U7Ci0gIGxleFsnXG4nXSA9IExFWF9JU19ORVdMSU5FOwotICBsZXhbJzsnXSA9IExFWF9JU19MSU5FX1NFUEFSQVRPUjsKLSAgbGV4Wyc6J10gPSBMRVhfSVNfQ09MT047Ci0KLSAgaWYgKCEgbTY4a19tcmkpCi0gICAgewotICAgICAgbGV4WyciJ10gPSBMRVhfSVNfU1RSSU5HUVVPVEU7Ci0KLSNpZm5kZWYgVENfSFBQQQotICAgICAgbGV4WydcJyddID0gTEVYX0lTX09ORUNIQVJfUVVPVEU7Ci0jZW5kaWYKLQotI2lmZGVmIFNJTkdMRV9RVU9URV9TVFJJTkdTCi0gICAgICBsZXhbJ1wnJ10gPSBMRVhfSVNfU1RSSU5HUVVPVEU7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyogTm90ZTogaWYgYW55IG90aGVyIGNoYXJhY3RlciBjYW4gYmUgTEVYX0lTX1NUUklOR1FVT1RFLCB0aGUgbG9vcAotICAgICBpbiBzdGF0ZSA1IG9mIGRvX3NjcnViX2NoYXJzIG11c3QgYmUgY2hhbmdlZC4gICovCi0KLSAgLyogTm90ZSB0aGF0IHRoZXNlIG92ZXJyaWRlIHRoZSBwcmV2aW91cyBkZWZhdWx0cywgZS5nLiBpZiAnOycgaXMgYQotICAgICBjb21tZW50IGNoYXIsIHRoZW4gaXQgaXNuJ3QgYSBsaW5lIHNlcGFyYXRvci4gICovCi0gIGZvciAocCA9IHN5bWJvbF9jaGFyczsgKnA7ICsrcCkKLSAgICB7Ci0gICAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOwotICAgIH0JCQkJLyogZGVjbGFyZSBzeW1ib2wgY2hhcmFjdGVycyAqLwotCi0gIGZvciAoYyA9IDEyODsgYyA8IDI1NjsgKytjKQotICAgIGxleFtjXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOwotCi0jaWZkZWYgdGNfc3ltYm9sX2NoYXJzCi0gIC8qIFRoaXMgbWFjcm8gcGVybWl0cyB0aGUgcHJvY2Vzc29yIHRvIHNwZWNpZnkgYWxsIGNoYXJhY3RlcnMgd2hpY2gKLSAgICAgbWF5IGFwcGVhcnMgaW4gYW4gb3BlcmFuZC4gIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzY3J1YmJlciBmcm9tCi0gICAgIGRpc2NhcmRpbmcgbWVhbmluZ2Z1bCB3aGl0ZXNwYWNlIGluIGNlcnRhaW4gY2FzZXMuICBUaGUgaTM4NgotICAgICBiYWNrZW5kIHVzZXMgdGhpcyB0byBzdXBwb3J0IHByZWZpeGVzLCB3aGljaCBjYW4gY29uZnVzZSB0aGUKLSAgICAgc2NydWJiZXIgYXMgdG8gd2hldGhlciBpdCBpcyBwYXJzaW5nIG9wZXJhbmRzIG9yIG9wY29kZXMuICAqLwotICBmb3IgKHAgPSB0Y19zeW1ib2xfY2hhcnM7ICpwOyArK3ApCi0gICAgbGV4Wyh1bnNpZ25lZCBjaGFyKSAqcF0gPSBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVDsKLSNlbmRpZgotCi0gIC8qIFRoZSBtNjhrIGJhY2tlbmQgd2FudHMgdG8gYmUgYWJsZSB0byBjaGFuZ2UgY29tbWVudF9jaGFycy4gICovCi0jaWZuZGVmIHRjX2NvbW1lbnRfY2hhcnMKLSNkZWZpbmUgdGNfY29tbWVudF9jaGFycyBjb21tZW50X2NoYXJzCi0jZW5kaWYKLSAgZm9yIChwID0gdGNfY29tbWVudF9jaGFyczsgKnA7IHArKykKLSAgICB7Ci0gICAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19DT01NRU5UX1NUQVJUOwotICAgIH0JCQkJLyogZGVjbGFyZSBjb21tZW50IGNoYXJzICovCi0KLSAgZm9yIChwID0gbGluZV9jb21tZW50X2NoYXJzOyAqcDsgcCsrKQotICAgIHsKLSAgICAgIGxleFsodW5zaWduZWQgY2hhcikgKnBdID0gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVDsKLSAgICB9CQkJCS8qIGRlY2xhcmUgbGluZSBjb21tZW50IGNoYXJzICovCi0KLSAgZm9yIChwID0gbGluZV9zZXBhcmF0b3JfY2hhcnM7ICpwOyBwKyspCi0gICAgewotICAgICAgbGV4Wyh1bnNpZ25lZCBjaGFyKSAqcF0gPSBMRVhfSVNfTElORV9TRVBBUkFUT1I7Ci0gICAgfQkJCQkvKiBkZWNsYXJlIGxpbmUgc2VwYXJhdG9ycyAqLwotCi0gIC8qIE9ubHkgYWxsb3cgc2xhc2gtc3RhciBjb21tZW50cyBpZiBzbGFzaCBpcyBub3QgaW4gdXNlLgotICAgICBGSVhNRTogVGhpcyBpc24ndCByaWdodC4gIFdlIHNob3VsZCBhbHdheXMgcGVybWl0IHRoZW0uICAqLwotICBpZiAobGV4WycvJ10gPT0gMCkKLSAgICB7Ci0gICAgICBsZXhbJy8nXSA9IExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNUOwotICAgIH0KLQotICBpZiAobTY4a19tcmkpCi0gICAgewotICAgICAgbGV4WydcJyddID0gTEVYX0lTX1NUUklOR1FVT1RFOwotICAgICAgbGV4Wyc7J10gPSBMRVhfSVNfQ09NTUVOVF9TVEFSVDsKLSAgICAgIGxleFsnKiddID0gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVDsKLSAgICAgIC8qIFRoZSBNUkkgZG9jdW1lbnRhdGlvbiBzYXlzICchJyBpcyBMRVhfSVNfQ09NTUVOVF9TVEFSVCwgYnV0Ci0gICAgICAgICB0aGVuIGl0IGNhbid0IGJlIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4gICovCi0gICAgICBsZXhbJyEnXSA9IExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQ7Ci0gICAgfQotCi0jaWZkZWYgVENfVjg1MAotICBsZXhbJy0nXSA9IExFWF9JU19ET1VCTEVEQVNIXzFTVDsKLSNlbmRpZgotI2lmZGVmIFRDX00zMlIKLSAgbGV4Wyd8J10gPSBMRVhfSVNfRE9VQkxFQkFSXzFTVDsKLSNlbmRpZgotI2lmZGVmIFRDX0QzMFYKLSAgLyogbXVzdCBkbyB0aGlzIGlzIHdlIHdhbnQgVkxJVyBpbnN0cnVjdGlvbiB3aXRoICItPiIgb3IgIjwtIiAqLwotICBsZXhbJy0nXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOwotI2VuZGlmCi19CQkJCS8qIGRvX3NjcnViX2JlZ2luKCkgKi8KLQotLyogU2F2ZWQgc3RhdGUgb2YgdGhlIHNjcnViYmVyICovCi1zdGF0aWMgaW50IHN0YXRlOwotc3RhdGljIGludCBvbGRfc3RhdGU7Ci1zdGF0aWMgY2hhciAqb3V0X3N0cmluZzsKLXN0YXRpYyBjaGFyIG91dF9idWZbMjBdOwotc3RhdGljIGludCBhZGRfbmV3bGluZXM7Ci1zdGF0aWMgY2hhciAqc2F2ZWRfaW5wdXQ7Ci1zdGF0aWMgaW50IHNhdmVkX2lucHV0X2xlbjsKLXN0YXRpYyBjaGFyIGlucHV0X2J1ZmZlclszMiAqIDEwMjRdOwotc3RhdGljIGNvbnN0IGNoYXIgKm1yaV9zdGF0ZTsKLXN0YXRpYyBjaGFyIG1yaV9sYXN0X2NoOwotCi0vKiBEYXRhIHN0cnVjdHVyZSBmb3Igc2F2aW5nIHRoZSBzdGF0ZSBvZiBhcHAgYWNyb3NzICNpbmNsdWRlJ3MuICBOb3RlIHRoYXQKLSAgIGFwcCBpcyBjYWxsZWQgYXN5bmNocm9ub3VzbHkgdG8gdGhlIHBhcnNpbmcgb2YgdGhlIC5pbmNsdWRlJ3MsIHNvIG91cgotICAgc3RhdGUgYXQgdGhlIHRpbWUgLmluY2x1ZGUgaXMgaW50ZXJwcmV0ZWQgaXMgY29tcGxldGVseSB1bnJlbGF0ZWQuCi0gICBUaGF0J3Mgd2h5IHdlIGhhdmUgdG8gc2F2ZSBpdCBhbGwuICAqLwotCi1zdHJ1Y3QgYXBwX3NhdmUKLSAgewotICAgIGludCAgICAgICAgICBzdGF0ZTsKLSAgICBpbnQgICAgICAgICAgb2xkX3N0YXRlOwotICAgIGNoYXIgKiAgICAgICBvdXRfc3RyaW5nOwotICAgIGNoYXIgICAgICAgICBvdXRfYnVmW3NpemVvZiAob3V0X2J1ZildOwotICAgIGludCAgICAgICAgICBhZGRfbmV3bGluZXM7Ci0gICAgY2hhciAqICAgICAgIHNhdmVkX2lucHV0OwotICAgIGludCAgICAgICAgICBzYXZlZF9pbnB1dF9sZW47Ci0gICAgaW50ICAgICAgICAgIHNjcnViX202OGtfbXJpOwotICAgIGNvbnN0IGNoYXIgKiBtcmlfc3RhdGU7Ci0gICAgY2hhciAgICAgICAgIG1yaV9sYXN0X2NoOwotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotICAgIGNvbnN0IGNoYXIgKiBzeW12ZXJfc3RhdGU7Ci0jZW5kaWYKLSAgfTsKLQotY2hhciAqCi1hcHBfcHVzaCAoKQotewotICByZWdpc3RlciBzdHJ1Y3QgYXBwX3NhdmUgKnNhdmVkOwotCi0gIHNhdmVkID0gKHN0cnVjdCBhcHBfc2F2ZSAqKSB4bWFsbG9jIChzaXplb2YgKCpzYXZlZCkpOwotICBzYXZlZC0+c3RhdGUgPSBzdGF0ZTsKLSAgc2F2ZWQtPm9sZF9zdGF0ZSA9IG9sZF9zdGF0ZTsKLSAgc2F2ZWQtPm91dF9zdHJpbmcgPSBvdXRfc3RyaW5nOwotICBtZW1jcHkgKHNhdmVkLT5vdXRfYnVmLCBvdXRfYnVmLCBzaXplb2YgKG91dF9idWYpKTsKLSAgc2F2ZWQtPmFkZF9uZXdsaW5lcyA9IGFkZF9uZXdsaW5lczsKLSAgaWYgKHNhdmVkX2lucHV0ID09IE5VTEwpCi0gICAgc2F2ZWQtPnNhdmVkX2lucHV0ID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNhdmVkLT5zYXZlZF9pbnB1dCA9IHhtYWxsb2MgKHNhdmVkX2lucHV0X2xlbik7Ci0gICAgICBtZW1jcHkgKHNhdmVkLT5zYXZlZF9pbnB1dCwgc2F2ZWRfaW5wdXQsIHNhdmVkX2lucHV0X2xlbik7Ci0gICAgICBzYXZlZC0+c2F2ZWRfaW5wdXRfbGVuID0gc2F2ZWRfaW5wdXRfbGVuOwotICAgIH0KLSAgc2F2ZWQtPnNjcnViX202OGtfbXJpID0gc2NydWJfbTY4a19tcmk7Ci0gIHNhdmVkLT5tcmlfc3RhdGUgPSBtcmlfc3RhdGU7Ci0gIHNhdmVkLT5tcmlfbGFzdF9jaCA9IG1yaV9sYXN0X2NoOwotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotICBzYXZlZC0+c3ltdmVyX3N0YXRlID0gc3ltdmVyX3N0YXRlOwotI2VuZGlmCi0KLSAgLyogZG9fc2NydWJfYmVnaW4oKSBpcyBub3QgdXNlZnVsLCBqdXN0IHdhc3RlcyB0aW1lLiAqLwotCi0gIHN0YXRlID0gMDsKLSAgc2F2ZWRfaW5wdXQgPSBOVUxMOwotCi0gIHJldHVybiAoY2hhciAqKSBzYXZlZDsKLX0KLQotdm9pZCAKLWFwcF9wb3AgKGFyZykKLSAgICAgY2hhciAqYXJnOwotewotICByZWdpc3RlciBzdHJ1Y3QgYXBwX3NhdmUgKnNhdmVkID0gKHN0cnVjdCBhcHBfc2F2ZSAqKSBhcmc7Ci0KLSAgLyogVGhlcmUgaXMgbm8gZG9fc2NydWJfZW5kICgpLiAqLwotICBzdGF0ZSA9IHNhdmVkLT5zdGF0ZTsKLSAgb2xkX3N0YXRlID0gc2F2ZWQtPm9sZF9zdGF0ZTsKLSAgb3V0X3N0cmluZyA9IHNhdmVkLT5vdXRfc3RyaW5nOwotICBtZW1jcHkgKG91dF9idWYsIHNhdmVkLT5vdXRfYnVmLCBzaXplb2YgKG91dF9idWYpKTsKLSAgYWRkX25ld2xpbmVzID0gc2F2ZWQtPmFkZF9uZXdsaW5lczsKLSAgaWYgKHNhdmVkLT5zYXZlZF9pbnB1dCA9PSBOVUxMKQotICAgIHNhdmVkX2lucHV0ID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzc2VydCAoc2F2ZWQtPnNhdmVkX2lucHV0X2xlbiA8PSAoaW50KSAoc2l6ZW9mIGlucHV0X2J1ZmZlcikpOwotICAgICAgbWVtY3B5IChpbnB1dF9idWZmZXIsIHNhdmVkLT5zYXZlZF9pbnB1dCwgc2F2ZWQtPnNhdmVkX2lucHV0X2xlbik7Ci0gICAgICBzYXZlZF9pbnB1dCA9IGlucHV0X2J1ZmZlcjsKLSAgICAgIHNhdmVkX2lucHV0X2xlbiA9IHNhdmVkLT5zYXZlZF9pbnB1dF9sZW47Ci0gICAgICBmcmVlIChzYXZlZC0+c2F2ZWRfaW5wdXQpOwotICAgIH0KLSAgc2NydWJfbTY4a19tcmkgPSBzYXZlZC0+c2NydWJfbTY4a19tcmk7Ci0gIG1yaV9zdGF0ZSA9IHNhdmVkLT5tcmlfc3RhdGU7Ci0gIG1yaV9sYXN0X2NoID0gc2F2ZWQtPm1yaV9sYXN0X2NoOwotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotICBzeW12ZXJfc3RhdGUgPSBzYXZlZC0+c3ltdmVyX3N0YXRlOwotI2VuZGlmCi0KLSAgZnJlZSAoYXJnKTsKLX0JCQkJLyogYXBwX3BvcCgpICovCi0KLS8qIEBAIFRoaXMgYXNzdW1lcyB0aGF0IFxuICZjIGFyZSB0aGUgc2FtZSBvbiBob3N0IGFuZCB0YXJnZXQuICBUaGlzIGlzIG5vdAotICAgbmVjZXNzYXJpbHkgdHJ1ZS4gICovCi1zdGF0aWMgaW50IAotcHJvY2Vzc19lc2NhcGUgKGNoKQotICAgICBpbnQgY2g7Ci17Ci0gIHN3aXRjaCAoY2gpCi0gICAgewotICAgIGNhc2UgJ2InOgotICAgICAgcmV0dXJuICdcYic7Ci0gICAgY2FzZSAnZic6Ci0gICAgICByZXR1cm4gJ1xmJzsKLSAgICBjYXNlICduJzoKLSAgICAgIHJldHVybiAnXG4nOwotICAgIGNhc2UgJ3InOgotICAgICAgcmV0dXJuICdccic7Ci0gICAgY2FzZSAndCc6Ci0gICAgICByZXR1cm4gJ1x0JzsKLSAgICBjYXNlICdcJyc6Ci0gICAgICByZXR1cm4gJ1wnJzsKLSAgICBjYXNlICciJzoKLSAgICAgIHJldHVybiAnXCInOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gY2g7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIGlucHV0IGNoYXJhY3RlcnMuICBUaGUgR0VUCi0gICBwYXJhbWV0ZXIgaXMgdXNlZCB0byByZXRyaWV2ZSBtb3JlIGlucHV0IGNoYXJhY3RlcnMuICBHRVQgc2hvdWxkCi0gICBzZXQgaXRzIHBhcmFtZXRlciB0byBwb2ludCB0byBhIGJ1ZmZlciwgYW5kIHJldHVybiB0aGUgbGVuZ3RoIG9mCi0gICB0aGUgYnVmZmVyOyBpdCBzaG91bGQgcmV0dXJuIDAgYXQgZW5kIG9mIGZpbGUuICBUaGUgc2NydWJiZWQgb3V0cHV0Ci0gICBjaGFyYWN0ZXJzIGFyZSBwdXQgaW50byB0aGUgYnVmZmVyIHN0YXJ0aW5nIGF0IFRPU1RBUlQ7IHRoZSBUT1NUQVJUCi0gICBidWZmZXIgaXMgVE9MRU4gYnl0ZXMgaW4gbGVuZ3RoLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlcgotICAgb2Ygc2NydWJiZWQgY2hhcmFjdGVycyBwdXQgaW50byBUT1NUQVJULiAgVGhpcyB3aWxsIGJlIFRPTEVOIHVubGVzcwotICAgZW5kIG9mIGZpbGUgd2FzIHNlZW4uICBUaGlzIGZ1bmN0aW9uIGlzIGFycmFuZ2VkIGFzIGEgc3RhdGUKLSAgIG1hY2hpbmUsIGFuZCBzYXZlcyBpdHMgc3RhdGUgc28gdGhhdCBpdCBtYXkgcmV0dXJuIGF0IGFueSBwb2ludC4KLSAgIFRoaXMgaXMgdGhlIHdheSB0aGUgb2xkIGNvZGUgdXNlZCB0byB3b3JrLiAgKi8KLQotaW50Ci1kb19zY3J1Yl9jaGFycyAoZ2V0LCB0b3N0YXJ0LCB0b2xlbikKLSAgICAgaW50ICgqZ2V0KSBQQVJBTVMgKChjaGFyICosIGludCkpOwotICAgICBjaGFyICp0b3N0YXJ0OwotICAgICBpbnQgdG9sZW47Ci17Ci0gIGNoYXIgKnRvID0gdG9zdGFydDsKLSAgY2hhciAqdG9lbmQgPSB0b3N0YXJ0ICsgdG9sZW47Ci0gIGNoYXIgKmZyb207Ci0gIGNoYXIgKmZyb21lbmQ7Ci0gIGludCBmcm9tbGVuOwotICByZWdpc3RlciBpbnQgY2gsIGNoMiA9IDA7Ci0KLSAgLypTdGF0ZSAwOiBiZWdpbm5pbmcgb2Ygbm9ybWFsIGxpbmUKLQkgIDE6IEFmdGVyIGZpcnN0IHdoaXRlc3BhY2Ugb24gbGluZSAoZmx1c2ggbW9yZSB3aGl0ZSkKLQkgIDI6IEFmdGVyIGZpcnN0IG5vbi13aGl0ZSAob3Bjb2RlKSBvbiBsaW5lIChrZWVwIDF3aGl0ZSkKLQkgIDM6IGFmdGVyIHNlY29uZCB3aGl0ZSBvbiBsaW5lIChpbnRvIG9wZXJhbmRzKSAoZmx1c2ggd2hpdGUpCi0JICA0OiBhZnRlciBwdXR0aW5nIG91dCBhIC5saW5lLCBwdXQgb3V0IGRpZ2l0cwotCSAgNTogcGFyc2luZyBhIHN0cmluZywgdGhlbiBnbyB0byBvbGQtc3RhdGUKLQkgIDY6IHB1dHRpbmcgb3V0IFwgZXNjYXBlIGluIGEgImQgc3RyaW5nLgotCSAgNzogQWZ0ZXIgcHV0dGluZyBvdXQgYSAuYXBwZmlsZSwgcHV0IG91dCBzdHJpbmcuCi0JICA4OiBBZnRlciBwdXR0aW5nIG91dCBhIC5hcHBmaWxlIHN0cmluZywgZmx1c2ggdW50aWwgbmV3bGluZS4KLQkgIDk6IEFmdGVyIHNlZWluZyBzeW1ib2wgY2hhciBpbiBzdGF0ZSAzIChrZWVwIDF3aGl0ZSBhZnRlciBzeW1jaGFyKQotCSAxMDogQWZ0ZXIgc2VlaW5nIHdoaXRlc3BhY2UgaW4gc3RhdGUgOSAoa2VlcCB3aGl0ZSBiZWZvcmUgc3ltY2hhcikKLQkgMTE6IEFmdGVyIHNlZWluZyBhIHN5bWJvbCBjaGFyYWN0ZXIgaW4gc3RhdGUgMCAoZWcgYSBsYWJlbCBkZWZpbml0aW9uKQotCSAtMTogb3V0cHV0IHN0cmluZyBpbiBvdXRfc3RyaW5nIGFuZCBnbyB0byB0aGUgc3RhdGUgaW4gb2xkX3N0YXRlCi0JIC0yOiBmbHVzaCB0ZXh0IHVudGlsIGEgJyonICcvJyBpcyBzZWVuLCB0aGVuIGdvIHRvIHN0YXRlIG9sZF9zdGF0ZQotI2lmZGVmIFRDX1Y4NTAKLSAgICAgICAgIDEyOiBBZnRlciBzZWVpbmcgYSBkYXNoLCBsb29raW5nIGZvciBhIHNlY29uZCBkYXNoIGFzIGEgc3RhcnQgb2YgY29tbWVudC4KLSNlbmRpZgotI2lmZGVmIFRDX00zMlIKLQkgMTM6IEFmdGVyIHNlZWluZyBhIHZlcnRpY2FsIGJhciwgbG9va2luZyBmb3IgYSBzZWNvbmQgdmVydGljYWwgYmFyIGFzIGEgcGFyYWxsZWwgZXhwcmVzc2lvbiBzZXBlcmF0b3IuCi0jZW5kaWYKLQkgICovCi0KLSAgLyogSSBhZGRlZCBzdGF0ZXMgOSBhbmQgMTAgYmVjYXVzZSB0aGUgTUlQUyBFQ09GRiBhc3NlbWJsZXIgdXNlcwotICAgICBjb25zdHJ1Y3RzIGxpa2UgYGAubG9jIDEgMjAnJy4gIFRoaXMgd2FzIHR1cm5pbmcgaW50byBgYC5sb2MKLSAgICAgMTIwJycuICBTdGF0ZXMgOSBhbmQgMTAgZW5zdXJlIHRoYXQgYSBzcGFjZSBpcyBuZXZlciBkcm9wcGVkIGluCi0gICAgIGJldHdlZW4gY2hhcmFjdGVycyB3aGljaCBjb3VsZCBhcHBlYXIgaW4gYSBpZGVudGlmaWVyLiAgSWFuCi0gICAgIFRheWxvciwgaWFuQGN5Z251cy5jb20uCi0KLSAgICAgSSBhZGRlZCBzdGF0ZSAxMSBzbyB0aGF0IHNvbWV0aGluZyBsaWtlICJMZm9vIGFkZCAlcjI1LCVyMjYsJXIyNyIgd29ya3MKLSAgICAgY29ycmVjdGx5IG9uIHRoZSBQQSAoYW5kIGFueSBvdGhlciB0YXJnZXQgd2hlcmUgY29sb25zIGFyZSBvcHRpb25hbCkuCi0gICAgIEplZmYgTGF3LCBsYXdAY3MudXRhaC5lZHUuCi0KLSAgICAgSSBhZGRlZCBzdGF0ZSAxMyBzbyB0aGF0IHNvbWV0aGluZyBsaWtlICJjbXAgcjEsIHIyIHx8IHRyYXAgIzEiIGRvZXMgbm90Ci0gICAgIGdldCBzcXVhc2hlZCBpbnRvICJjbXAgcjEscjJ8fHRyYXAjMSIsIHdpdGggdGhlIGFsbCBpbXBvcnRhbnQgc3BhY2UKLSAgICAgYmV0d2VlbiB0aGUgJ3RyYXAnIGFuZCB0aGUgJyMxJyBiZWluZyBlbGltaW5hdGVkLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLQotICAvKiBUaGlzIG1hY3JvIGdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLiAgKi8KLQotI2RlZmluZSBHRVQoKQkJCQkJCQlcCi0gIChmcm9tIDwgZnJvbWVuZAkJCQkJCVwKLSAgID8gKiAodW5zaWduZWQgY2hhciAqKSAoZnJvbSsrKQkJCQlcCi0gICA6IChzYXZlZF9pbnB1dCA9IE5VTEwsCQkJCQlcCi0gICAgICBmcm9tbGVuID0gKCpnZXQpIChpbnB1dF9idWZmZXIsIHNpemVvZiBpbnB1dF9idWZmZXIpLAlcCi0gICAgICBmcm9tID0gaW5wdXRfYnVmZmVyLAkJCQkJXAotICAgICAgZnJvbWVuZCA9IGZyb20gKyBmcm9tbGVuLAkJCQkJXAotICAgICAgKGZyb21sZW4gPT0gMAkJCQkJCVwKLSAgICAgICA/IEVPRgkJCQkJCQlcCi0gICAgICAgOiAqICh1bnNpZ25lZCBjaGFyICopIChmcm9tKyspKSkpCi0KLSAgLyogVGhpcyBtYWNybyBwdXNoZXMgYSBjaGFyYWN0ZXIgYmFjayBvbiB0aGUgaW5wdXQgc3RyZWFtLiAgKi8KLQotI2RlZmluZSBVTkdFVCh1Y2gpICgqLS1mcm9tID0gKHVjaCkpCi0KLSAgLyogVGhpcyBtYWNybyBwdXRzIGEgY2hhcmFjdGVyIGludG8gdGhlIG91dHB1dCBidWZmZXIuICBJZiB0aGlzCi0gICAgIGNoYXJhY3RlciBmaWxscyB0aGUgb3V0cHV0IGJ1ZmZlciwgdGhpcyBtYWNybyBqdW1wcyB0byB0aGUgbGFiZWwKLSAgICAgVE9GVUxMLiAgV2UgdXNlIHRoaXMgcmF0aGVyIHVnbHkgYXBwcm9hY2ggYmVjYXVzZSB3ZSBuZWVkIHRvCi0gICAgIGhhbmRsZSB0d28gZGlmZmVyZW50IHRlcm1pbmF0aW9uIGNvbmRpdGlvbnM6IEVPRiBvbiB0aGUgaW5wdXQKLSAgICAgc3RyZWFtLCBhbmQgYSBmdWxsIG91dHB1dCBidWZmZXIuICBJdCB3b3VsZCBiZSBzaW1wbGVyIGlmIHdlCi0gICAgIGFsd2F5cyByZWFkIGluIHRoZSBlbnRpcmUgaW5wdXQgc3RyZWFtIGJlZm9yZSBwcm9jZXNzaW5nIGl0LCBidXQKLSAgICAgSSBkb24ndCB3YW50IHRvIG1ha2Ugc3VjaCBhIHNpZ25pZmljYW50IGNoYW5nZSB0byB0aGUgYXNzZW1ibGVyJ3MKLSAgICAgbWVtb3J5IHVzYWdlLiAgKi8KLQotI2RlZmluZSBQVVQocGNoKQkJCVwKLSAgZG8JCQkJCVwKLSAgICB7CQkJCQlcCi0gICAgICAqdG8rKyA9IChwY2gpOwkJCVwKLSAgICAgIGlmICh0byA+PSB0b2VuZCkJCQlcCi0gICAgICAgIGdvdG8gdG9mdWxsOwkJCVwKLSAgICB9CQkJCQlcCi0gIHdoaWxlICgwKQotCi0gIGlmIChzYXZlZF9pbnB1dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyb20gPSBzYXZlZF9pbnB1dDsKLSAgICAgIGZyb21lbmQgPSBmcm9tICsgc2F2ZWRfaW5wdXRfbGVuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZyb21sZW4gPSAoKmdldCkgKGlucHV0X2J1ZmZlciwgc2l6ZW9mIGlucHV0X2J1ZmZlcik7Ci0gICAgICBpZiAoZnJvbWxlbiA9PSAwKQotCXJldHVybiAwOwotICAgICAgZnJvbSA9IGlucHV0X2J1ZmZlcjsKLSAgICAgIGZyb21lbmQgPSBmcm9tICsgZnJvbWxlbjsKLSAgICB9Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgLyogVGhlIGNhc2VzIGluIHRoaXMgc3dpdGNoIGVuZCB3aXRoIGNvbnRpbnVlLCBpbiBvcmRlciB0bwotICAgICAgICAgYnJhbmNoIGJhY2sgdG8gdGhlIHRvcCBvZiB0aGlzIHdoaWxlIGxvb3AgYW5kIGdlbmVyYXRlIHRoZQotICAgICAgICAgbmV4dCBvdXRwdXQgY2hhcmFjdGVyIGluIHRoZSBhcHByb3ByaWF0ZSBzdGF0ZS4gICovCi0gICAgICBzd2l0Y2ggKHN0YXRlKQotCXsKLQljYXNlIC0xOgotCSAgY2ggPSAqb3V0X3N0cmluZysrOwotCSAgaWYgKCpvdXRfc3RyaW5nID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBzdGF0ZSA9IG9sZF9zdGF0ZTsKLQkgICAgICBvbGRfc3RhdGUgPSAzOwotCSAgICB9Ci0JICBQVVQgKGNoKTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAtMjoKLQkgIGZvciAoOzspCi0JICAgIHsKLQkgICAgICBkbwotCQl7Ci0JCSAgY2ggPSBHRVQgKCk7Ci0KLQkJICBpZiAoY2ggPT0gRU9GKQotCQkgICAgewotCQkgICAgICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50IikpOwotCQkgICAgICBnb3RvIGZyb21lb2Y7Ci0JCSAgICB9Ci0KLQkJICBpZiAoY2ggPT0gJ1xuJykKLQkJICAgIFBVVCAoJ1xuJyk7Ci0JCX0KLQkgICAgICB3aGlsZSAoY2ggIT0gJyonKTsKLQotCSAgICAgIHdoaWxlICgoY2ggPSBHRVQgKCkpID09ICcqJykKLQkJOwotCi0JICAgICAgaWYgKGNoID09IEVPRikKLQkJewotCQkgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIGNvbW1lbnQiKSk7Ci0JCSAgZ290byBmcm9tZW9mOwotCQl9Ci0KLQkgICAgICBpZiAoY2ggPT0gJy8nKQotCQlicmVhazsKLQotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgIH0KLQotCSAgc3RhdGUgPSBvbGRfc3RhdGU7Ci0JICBVTkdFVCAoJyAnKTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSA0OgotCSAgY2ggPSBHRVQgKCk7Ci0JICBpZiAoY2ggPT0gRU9GKQotCSAgICBnb3RvIGZyb21lb2Y7Ci0JICBlbHNlIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQotCSAgICBQVVQgKGNoKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHdoaWxlIChjaCAhPSBFT0YgJiYgSVNfV0hJVEVTUEFDRSAoY2gpKQotCQljaCA9IEdFVCAoKTsKLQkgICAgICBpZiAoY2ggPT0gJyInKQotCQl7Ci0JCSAgVU5HRVQgKGNoKTsKLQkJICBpZiAoc2NydWJfbTY4a19tcmkpCi0JCSAgICBvdXRfc3RyaW5nID0gIlxuXHRhcHBmaWxlICI7Ci0JCSAgZWxzZQotCQkgICAgb3V0X3N0cmluZyA9ICJcblx0LmFwcGZpbGUgIjsKLQkJICBvbGRfc3RhdGUgPSA3OwotCQkgIHN0YXRlID0gLTE7Ci0JCSAgUFVUICgqb3V0X3N0cmluZysrKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHdoaWxlIChjaCAhPSBFT0YgJiYgY2ggIT0gJ1xuJykKLQkJICAgIGNoID0gR0VUICgpOwotCQkgIHN0YXRlID0gMDsKLQkJICBQVVQgKGNoKTsKLQkJfQotCSAgICB9Ci0JICBjb250aW51ZTsKLQotCWNhc2UgNToKLQkgIC8qIFdlIGFyZSBnb2luZyB0byBjb3B5IGV2ZXJ5dGhpbmcgdXAgdG8gYSBxdW90ZSBjaGFyYWN0ZXIsCi0gICAgICAgICAgICAgd2l0aCBzcGVjaWFsIGhhbmRsaW5nIGZvciBhIGJhY2tzbGFzaC4gIFdlIHRyeSB0bwotICAgICAgICAgICAgIG9wdGltaXplIHRoZSBjb3B5aW5nIGluIHRoZSBzaW1wbGUgY2FzZSB3aXRob3V0IHVzaW5nIHRoZQotICAgICAgICAgICAgIEdFVCBhbmQgUFVUIG1hY3Jvcy4gICovCi0JICB7Ci0JICAgIGNoYXIgKnM7Ci0JICAgIGludCBsZW47Ci0KLQkgICAgZm9yIChzID0gZnJvbTsgcyA8IGZyb21lbmQ7IHMrKykKLQkgICAgICB7Ci0JCWNoID0gKnM7Ci0JCS8qIFRoaXMgY29uZGl0aW9uIG11c3QgYmUgY2hhbmdlZCBpZiB0aGUgdHlwZSBvZiBhbnkKLSAgICAgICAgICAgICAgICAgICBvdGhlciBjaGFyYWN0ZXIgY2FuIGJlIExFWF9JU19TVFJJTkdRVU9URS4gICovCi0JCWlmIChjaCA9PSAnXFwnCi0JCSAgICB8fCBjaCA9PSAnIicKLQkJICAgIHx8IGNoID09ICdcJycKLQkJICAgIHx8IGNoID09ICdcbicpCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgICBsZW4gPSBzIC0gZnJvbTsKLQkgICAgaWYgKGxlbiA+IHRvZW5kIC0gdG8pCi0JICAgICAgbGVuID0gdG9lbmQgLSB0bzsKLQkgICAgaWYgKGxlbiA+IDApCi0JICAgICAgewotCQltZW1jcHkgKHRvLCBmcm9tLCBsZW4pOwotCQl0byArPSBsZW47Ci0JCWZyb20gKz0gbGVuOwotCSAgICAgIH0KLQkgIH0KLQotCSAgY2ggPSBHRVQgKCk7Ci0JICBpZiAoY2ggPT0gRU9GKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gc3RyaW5nOiBpbnNlcnRlZCAnXCInIikpOwotCSAgICAgIHN0YXRlID0gb2xkX3N0YXRlOwotCSAgICAgIFVOR0VUICgnXG4nKTsKLQkgICAgICBQVVQgKCciJyk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGxleFtjaF0gPT0gTEVYX0lTX1NUUklOR1FVT1RFKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSBvbGRfc3RhdGU7Ci0JICAgICAgUFVUIChjaCk7Ci0JICAgIH0KLSNpZm5kZWYgTk9fU1RSSU5HX0VTQ0FQRVMKLQkgIGVsc2UgaWYgKGNoID09ICdcXCcpCi0JICAgIHsKLQkgICAgICBzdGF0ZSA9IDY7Ci0JICAgICAgUFVUIChjaCk7Ci0JICAgIH0KLSNlbmRpZgotCSAgZWxzZSBpZiAoc2NydWJfbTY4a19tcmkgJiYgY2ggPT0gJ1xuJykKLQkgICAgewotCSAgICAgIC8qIEp1c3QgcXVpZXRseSB0ZXJtaW5hdGUgdGhlIHN0cmluZy4gIFRoaXMgcGVybWl0cyBsaW5lcyBsaWtlCi0JCSAgIGJuZQlsYWJlbAlsb29wIGlmIHdlIGhhdmVuJ3QgcmVhY2ggZW5kIHlldAotCQkgKi8KLQkgICAgICBzdGF0ZSA9IG9sZF9zdGF0ZTsKLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIFBVVCAoJ1wnJyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIFBVVCAoY2gpOwotCSAgICB9Ci0JICBjb250aW51ZTsKLQotCWNhc2UgNjoKLQkgIHN0YXRlID0gNTsKLQkgIGNoID0gR0VUICgpOwotCSAgc3dpdGNoIChjaCkKLQkgICAgewotCSAgICAgIC8qIEhhbmRsZSBzdHJpbmdzIGJyb2tlbiBhY3Jvc3MgbGluZXMsIGJ5IHR1cm5pbmcgJ1xuJyBpbnRvCi0JCSAnXFwnIGFuZCAnbicuICAqLwotCSAgICBjYXNlICdcbic6Ci0JICAgICAgVU5HRVQgKCduJyk7Ci0JICAgICAgYWRkX25ld2xpbmVzKys7Ci0JICAgICAgUFVUICgnXFwnKTsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICciJzoKLQkgICAgY2FzZSAnXFwnOgotCSAgICBjYXNlICdiJzoKLQkgICAgY2FzZSAnZic6Ci0JICAgIGNhc2UgJ24nOgotCSAgICBjYXNlICdyJzoKLQkgICAgY2FzZSAndCc6Ci0JICAgIGNhc2UgJ3YnOgotCSAgICBjYXNlICd4JzoKLQkgICAgY2FzZSAnWCc6Ci0JICAgIGNhc2UgJzAnOgotCSAgICBjYXNlICcxJzoKLQkgICAgY2FzZSAnMic6Ci0JICAgIGNhc2UgJzMnOgotCSAgICBjYXNlICc0JzoKLQkgICAgY2FzZSAnNSc6Ci0JICAgIGNhc2UgJzYnOgotCSAgICBjYXNlICc3JzoKLQkgICAgICBicmVhazsKLSNpZiBkZWZpbmVkKElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTKSB8IGRlZmluZWQoT05MWV9TVEFOREFSRF9FU0NBUEVTKQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX3dhcm4gKF8oIlVua25vd24gZXNjYXBlICdcXCVjJyBpbiBzdHJpbmc6IElnbm9yZWQiKSwgY2gpOwotCSAgICAgIGJyZWFrOwotI2Vsc2UgIC8qIE9OTFlfU1RBTkRBUkRfRVNDQVBFUyAqLwotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qIEFjY2VwdCBceCBhcyB4IGZvciBhbnkgeCAqLwotCSAgICAgIGJyZWFrOwotI2VuZGlmIC8qIE9OTFlfU1RBTkRBUkRfRVNDQVBFUyAqLwotCi0JICAgIGNhc2UgRU9GOgotCSAgICAgIGFzX3dhcm4gKF8oIkVuZCBvZiBmaWxlIGluIHN0cmluZzogJ1wiJyBpbnNlcnRlZCIpKTsKLQkgICAgICBQVVQgKCciJyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIFBVVCAoY2gpOwotCSAgY29udGludWU7Ci0KLQljYXNlIDc6Ci0JICBjaCA9IEdFVCAoKTsKLQkgIHN0YXRlID0gNTsKLQkgIG9sZF9zdGF0ZSA9IDg7Ci0JICBpZiAoY2ggPT0gRU9GKQotCSAgICBnb3RvIGZyb21lb2Y7Ci0JICBQVVQgKGNoKTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSA4OgotCSAgZG8KLQkgICAgY2ggPSBHRVQgKCk7Ci0JICB3aGlsZSAoY2ggIT0gJ1xuJyAmJiBjaCAhPSBFT0YpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgZ290byBmcm9tZW9mOwotCSAgc3RhdGUgPSAwOwotCSAgUFVUIChjaCk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIE9LLCB3ZSBhcmUgc29tZXdoZXJlIGluIHN0YXRlcyAwIHRocm91Z2ggNCBvciA5IHRocm91Z2ggMTEgKi8KLQotICAgICAgLyogZmx1c2hjaGFyOiAqLwotICAgICAgY2ggPSBHRVQgKCk7Ci0KLSAgICByZWN5Y2xlOgotCi0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0gICAgICAvKiBXZSBuZWVkIHRvIHdhdGNoIG91dCBmb3IgLnN5bXZlciBkaXJlY3RpdmVzLiAgU2VlIHRoZSBjb21tZW50IGxhdGVyCi0JIGluIHRoaXMgZnVuY3Rpb24uICAqLwotICAgICAgaWYgKHN5bXZlcl9zdGF0ZSA9PSBOVUxMKQotCXsKLQkgIGlmICgoc3RhdGUgPT0gMCB8fCBzdGF0ZSA9PSAxKSAmJiBjaCA9PSBzeW12ZXJfcHNldWRvWzBdKQotCSAgICBzeW12ZXJfc3RhdGUgPSBzeW12ZXJfcHNldWRvICsgMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgYWR2YW5jZSB0byB0aGUgbmV4dCBzdGF0ZSBpZiB3ZSBmaW5kIHRoZSByaWdodAotCSAgICAgY2hhcmFjdGVyLiAgKi8KLQkgIGlmIChjaCAhPSAnXDAnICYmICgqc3ltdmVyX3N0YXRlID09IGNoKSkKLQkgICAgKytzeW12ZXJfc3RhdGU7Ci0JICBlbHNlIGlmICgqc3ltdmVyX3N0YXRlICE9ICdcMCcpCi0JICAgIC8qIFdlIGRpZCBub3QgZ2V0IHRoZSBleHBlY3RlZCBjaGFyYWN0ZXIsIG9yIHdlIGRpZG4ndAotCSAgICAgICBnZXQgYSB2YWxpZCB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgYWZ0ZXIgc2VlaW5nIHRoZQotCSAgICAgICBlbnRpcmUgcHNldWRvLW9wLCBzbyB3ZSBtdXN0IGdvIGJhY2sgdG8gdGhlIGJlZ2lubmluZy4gICovCi0JICAgIHN5bXZlcl9zdGF0ZSA9IE5VTEw7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSd2ZSByZWFkIHRoZSBlbnRpcmUgcHNldWRvLW9wLiAgSWYgdGhpcyBpcyB0aGUgZW5kCi0JCSBvZiB0aGUgbGluZSwgZ28gYmFjayB0byB0aGUgYmVnaW5uaW5nLiAgKi8KLQkgICAgICBpZiAoSVNfTkVXTElORSAoY2gpKQotCQlzeW12ZXJfc3RhdGUgPSBOVUxMOwotCSAgICB9Ci0JfQotI2VuZGlmIC8qIFRDX0FSTSAmJiBPQkpfRUxGICovCi0KLSNpZmRlZiBUQ19NNjhLCi0gICAgICAvKiBXZSB3YW50IHRvIGhhdmUgcHNldWRvLW9wcyB3aGljaCBjb250cm9sIHdoZXRoZXIgd2UgYXJlIGluCi0gICAgICAgICBNUkkgbW9kZSBvciBub3QuICBVbmZvcnR1bmF0ZWx5LCBzaW5jZSBtNjhrIE1SSSBtb2RlIGFmZmVjdHMKLSAgICAgICAgIHRoZSBzY3J1YmJlciwgdGhhdCBtZWFucyB0aGF0IHdlIG5lZWQgYSBzcGVjaWFsIHB1cnBvc2UKLSAgICAgICAgIHJlY29nbml6ZXIgaGVyZS4gICovCi0gICAgICBpZiAobXJpX3N0YXRlID09IE5VTEwpCi0JewotCSAgaWYgKChzdGF0ZSA9PSAwIHx8IHN0YXRlID09IDEpCi0JICAgICAgJiYgY2ggPT0gbXJpX3BzZXVkb1swXSkKLQkgICAgbXJpX3N0YXRlID0gbXJpX3BzZXVkbyArIDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGFkdmFuY2UgdG8gdGhlIG5leHQgc3RhdGUgaWYgd2UgZmluZCB0aGUgcmlnaHQKLQkgICAgIGNoYXJhY3Rlciwgb3IgaWYgd2UgbmVlZCBhIHNwYWNlIGNoYXJhY3RlciBhbmQgd2UgZ2V0IGFueQotCSAgICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXIsIG9yIGlmIHdlIG5lZWQgYSAnMCcgYW5kIHdlIGdldCBhCi0JICAgICAnMScgKHRoaXMgaXMgc28gdGhhdCB3ZSBvbmx5IG5lZWQgb25lIHN0YXRlIHRvIGhhbmRsZQotCSAgICAgYGAubXJpIDAnJyBhbmQgYGAubXJpIDEnJykuICAqLwotCSAgaWYgKGNoICE9ICdcMCcKLQkgICAgICAmJiAoKm1yaV9zdGF0ZSA9PSBjaAotCQkgIHx8ICgqbXJpX3N0YXRlID09ICcgJwotCQkgICAgICAmJiBsZXhbY2hdID09IExFWF9JU19XSElURVNQQUNFKQotCQkgIHx8ICgqbXJpX3N0YXRlID09ICcwJwotCQkgICAgICAmJiBjaCA9PSAnMScpKSkKLQkgICAgewotCSAgICAgIG1yaV9sYXN0X2NoID0gY2g7Ci0JICAgICAgKyttcmlfc3RhdGU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCptcmlfc3RhdGUgIT0gJ1wwJwotCQkgICB8fCAobGV4W2NoXSAhPSBMRVhfSVNfV0hJVEVTUEFDRQotCQkgICAgICAgJiYgbGV4W2NoXSAhPSBMRVhfSVNfTkVXTElORSkpCi0JICAgIHsKLQkgICAgICAvKiBXZSBkaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgY2hhcmFjdGVyLCBvciB3ZSBkaWRuJ3QKLQkJIGdldCBhIHZhbGlkIHRlcm1pbmF0aW5nIGNoYXJhY3RlciBhZnRlciBzZWVpbmcgdGhlCi0JCSBlbnRpcmUgcHNldWRvLW9wLCBzbyB3ZSBtdXN0IGdvIGJhY2sgdG8gdGhlCi0JCSBiZWdpbm5pbmcuICAqLwotCSAgICAgIG1yaV9zdGF0ZSA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdlJ3ZlIHJlYWQgdGhlIGVudGlyZSBwc2V1ZG8tb3AuICBtaXBzX2xhc3RfY2ggaXMKLSAgICAgICAgICAgICAgICAgZWl0aGVyICcwJyBvciAnMScgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGVudGVyIG9yCi0gICAgICAgICAgICAgICAgIGxlYXZlIE1SSSBtb2RlLiAgKi8KLQkgICAgICBkb19zY3J1Yl9iZWdpbiAobXJpX2xhc3RfY2ggPT0gJzEnKTsKLQkgICAgICBtcmlfc3RhdGUgPSBOVUxMOwotCi0JICAgICAgLyogV2UgY29udGludWUgaGFuZGxpbmcgdGhlIGNoYXJhY3RlciBhcyB1c3VhbC4gIFRoZQotICAgICAgICAgICAgICAgICBtYWluIGdhcyByZWFkZXIgbXVzdCBhbHNvIGhhbmRsZSB0aGUgLm1yaSBwc2V1ZG8tb3AKLSAgICAgICAgICAgICAgICAgdG8gY29udHJvbCBleHByZXNzaW9uIHBhcnNpbmcgYW5kIHRoZSBsaWtlLiAgKi8KLQkgICAgfQotCX0KLSNlbmRpZgotCi0gICAgICBpZiAoY2ggPT0gRU9GKQotCXsKLQkgIGlmIChzdGF0ZSAhPSAwKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgbm90IGF0IGVuZCBvZiBhIGxpbmU7IG5ld2xpbmUgaW5zZXJ0ZWQiKSk7Ci0JICAgICAgc3RhdGUgPSAwOwotCSAgICAgIFBVVCAoJ1xuJyk7Ci0JICAgIH0KLQkgIGdvdG8gZnJvbWVvZjsKLQl9Ci0KLSAgICAgIHN3aXRjaCAobGV4W2NoXSkKLQl7Ci0JY2FzZSBMRVhfSVNfV0hJVEVTUEFDRToKLQkgIGRvCi0JICAgIHsKLQkgICAgICBjaCA9IEdFVCAoKTsKLQkgICAgfQotCSAgd2hpbGUgKGNoICE9IEVPRiAmJiBJU19XSElURVNQQUNFIChjaCkpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgZ290byBmcm9tZW9mOwotCi0JICBpZiAoc3RhdGUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFByZXNlcnZlIGEgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGF0IHRoZQotCQkgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi0JICAgICAgc3RhdGUgPSAxOwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgUFVUICgnICcpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChJU19DT01NRU5UIChjaCkKLQkgICAgICB8fCBjaCA9PSAnLycKLQkgICAgICB8fCBJU19MSU5FX1NFUEFSQVRPUiAoY2gpKQotCSAgICB7Ci0JICAgICAgaWYgKHNjcnViX202OGtfbXJpKQotCQl7Ci0JCSAgLyogSW4gTVJJIG1vZGUsIHdlIGtlZXAgdGhlc2Ugc3BhY2VzLiAgKi8KLQkJICBVTkdFVCAoY2gpOwotCQkgIFBVVCAoJyAnKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGdvdG8gcmVjeWNsZTsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSdyZSBpbiBzdGF0ZSAyIG9yIDExLCB3ZSd2ZSBzZWVuIGEgbm9uLXdoaXRlCi0JICAgICBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZS4gIElmIHRoZSBuZXh0IGNoYXJhY3RlcgotCSAgICAgaXMgJzonLCB0aGlzIGlzIHdoaXRlc3BhY2UgYWZ0ZXIgYSBsYWJlbCBuYW1lIHdoaWNoIHdlCi0JICAgICBub3JtYWxseSBtdXN0IGlnbm9yZS4gIEluIE1SSSBtb2RlLCB0aG91Z2gsIHNwYWNlcyBhcmUKLQkgICAgIG5vdCBwZXJtaXR0ZWQgYmV0d2VlbiB0aGUgbGFiZWwgYW5kIHRoZSBjb2xvbi4gICovCi0JICBpZiAoKHN0YXRlID09IDIgfHwgc3RhdGUgPT0gMTEpCi0JICAgICAgJiYgbGV4W2NoXSA9PSBMRVhfSVNfQ09MT04KLQkgICAgICAmJiAhIHNjcnViX202OGtfbXJpKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSAxOwotCSAgICAgIFBVVCAoY2gpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoc3RhdGUpCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIHN0YXRlKys7Ci0JICAgICAgZ290byByZWN5Y2xlOwkvKiBQdW50ZWQgbGVhZGluZyBzcCAqLwotCSAgICBjYXNlIDE6Ci0JICAgICAgLyogV2UgY2FuIGFycml2ZSBoZXJlIGlmIHdlIGxlYXZlIGEgbGVhZGluZyB3aGl0ZXNwYWNlCi0JCSBjaGFyYWN0ZXIgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotCSAgICAgIGdvdG8gcmVjeWNsZTsKLQkgICAgY2FzZSAyOgotCSAgICAgIHN0YXRlID0gMzsKLQkgICAgICBpZiAodG8gKyAxIDwgdG9lbmQpCi0JCXsKLQkJICAvKiBPcHRpbWl6ZSBjb21tb24gY2FzZSBieSBza2lwcGluZyBVTkdFVC9HRVQuICAqLwotCQkgIFBVVCAoJyAnKTsJLyogU3AgYWZ0ZXIgb3BjbyAqLwotCQkgIGdvdG8gcmVjeWNsZTsKLQkJfQotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgUFVUICgnICcpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDM6Ci0JICAgICAgaWYgKHNjcnViX202OGtfbXJpKQotCQl7Ci0JCSAgLyogSW4gTVJJIG1vZGUsIHdlIGtlZXAgdGhlc2Ugc3BhY2VzLiAgKi8KLQkJICBVTkdFVCAoY2gpOwotCQkgIFBVVCAoJyAnKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGdvdG8gcmVjeWNsZTsJLyogU3AgaW4gb3BlcmFuZHMgKi8KLQkgICAgY2FzZSA5OgotCSAgICBjYXNlIDEwOgotCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKLQkJewotCQkgIC8qIEluIE1SSSBtb2RlLCB3ZSBrZWVwIHRoZXNlIHNwYWNlcy4gICovCi0JCSAgc3RhdGUgPSAzOwotCQkgIFVOR0VUIChjaCk7Ci0JCSAgUFVUICgnICcpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgc3RhdGUgPSAxMDsJLyogU3AgYWZ0ZXIgc3ltYm9sIGNoYXIgKi8KLQkgICAgICBnb3RvIHJlY3ljbGU7Ci0JICAgIGNhc2UgMTE6Ci0JICAgICAgaWYgKGZsYWdfbTY4a19tcmkKLSNpZmRlZiBMQUJFTFNfV0lUSE9VVF9DT0xPTlMKLQkJICB8fCAxCi0jZW5kaWYKLQkJICApCi0JCXN0YXRlID0gMTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBXZSBrbm93IHRoYXQgY2ggaXMgbm90ICc6Jywgc2luY2Ugd2UgdGVzdGVkIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWJvdmUuICBUaGVyZWZvcmUgdGhpcyBpcyBub3QgYSBsYWJlbCwgc28gaXQKLSAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgdGhlIG9wY29kZSwgYW5kIHdlJ3ZlIGp1c3Qgc2VlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHdoaXRlc3BhY2UgYWZ0ZXIgaXQuICAqLwotCQkgIHN0YXRlID0gMzsKLQkJfQotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgUFVUICgnICcpOwkvKiBTcCBhZnRlciBsYWJlbCBkZWZpbml0aW9uLiAgKi8KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBCQURfQ0FTRSAoc3RhdGUpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8xU1Q6Ci0JICBjaDIgPSBHRVQgKCk7Ci0JICBpZiAoY2gyID09ICcqJykKLQkgICAgewotCSAgICAgIGZvciAoOzspCi0JCXsKLQkJICBkbwotCQkgICAgewotCQkgICAgICBjaDIgPSBHRVQgKCk7Ci0JCSAgICAgIGlmIChjaDIgIT0gRU9GICYmIElTX05FV0xJTkUgKGNoMikpCi0JCQlhZGRfbmV3bGluZXMrKzsKLQkJICAgIH0KLQkJICB3aGlsZSAoY2gyICE9IEVPRiAmJiBjaDIgIT0gJyonKTsKLQotCQkgIHdoaWxlIChjaDIgPT0gJyonKQotCQkgICAgY2gyID0gR0VUICgpOwotCi0JCSAgaWYgKGNoMiA9PSBFT0YgfHwgY2gyID09ICcvJykKLQkJICAgIGJyZWFrOwotCi0JCSAgLyogVGhpcyBVTkdFVCB3aWxsIGVuc3VyZSB0aGF0IHdlIGNvdW50IG5ld2xpbmVzCi0gICAgICAgICAgICAgICAgICAgICBjb3JyZWN0bHkuICAqLwotCQkgIFVOR0VUIChjaDIpOwotCQl9Ci0KLQkgICAgICBpZiAoY2gyID09IEVPRikKLQkJYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gbXVsdGlsaW5lIGNvbW1lbnQiKSk7Ci0KLQkgICAgICBjaCA9ICcgJzsKLQkgICAgICBnb3RvIHJlY3ljbGU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChjaDIgIT0gRU9GKQotCQlVTkdFVCAoY2gyKTsKLQkgICAgICBpZiAoc3RhdGUgPT0gOSB8fCBzdGF0ZSA9PSAxMCkKLQkJc3RhdGUgPSAzOwotCSAgICAgIFBVVCAoY2gpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgTEVYX0lTX1NUUklOR1FVT1RFOgotCSAgaWYgKHN0YXRlID09IDEwKQotCSAgICB7Ci0JICAgICAgLyogUHJlc2VydmUgdGhlIHdoaXRlc3BhY2UgaW4gZm9vICJiYXIiICovCi0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgICBzdGF0ZSA9IDM7Ci0JICAgICAgUFVUICgnICcpOwotCi0JICAgICAgLyogUFVUIGRpZG4ndCBqdW1wIG91dC4gIFdlIGNvdWxkIGp1c3QgYnJlYWssIGJ1dCB3ZQotICAgICAgICAgICAgICAgICBrbm93IHdoYXQgd2lsbCBoYXBwZW4sIHNvIG9wdGltaXplIGEgYml0LiAgKi8KLQkgICAgICBjaCA9IEdFVCAoKTsKLQkgICAgICBvbGRfc3RhdGUgPSAzOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdGF0ZSA9PSA5KQotCSAgICBvbGRfc3RhdGUgPSAzOwotCSAgZWxzZQotCSAgICBvbGRfc3RhdGUgPSBzdGF0ZTsKLQkgIHN0YXRlID0gNTsKLQkgIFBVVCAoY2gpOwotCSAgYnJlYWs7Ci0KLSNpZm5kZWYgSUVFRV9TVFlMRQotCWNhc2UgTEVYX0lTX09ORUNIQVJfUVVPVEU6Ci0JICBpZiAoc3RhdGUgPT0gMTApCi0JICAgIHsKLQkgICAgICAvKiBQcmVzZXJ2ZSB0aGUgd2hpdGVzcGFjZSBpbiBmb28gJ2InICovCi0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgICBzdGF0ZSA9IDM7Ci0JICAgICAgUFVUICgnICcpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBjaCA9IEdFVCAoKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBhZnRlciBhIG9uZS1jaGFyYWN0ZXIgcXVvdGU7IFxcMCBpbnNlcnRlZCIpKTsKLQkgICAgICBjaCA9IDA7Ci0JICAgIH0KLQkgIGlmIChjaCA9PSAnXFwnKQotCSAgICB7Ci0JICAgICAgY2ggPSBHRVQgKCk7Ci0JICAgICAgaWYgKGNoID09IEVPRikKLQkJewotCQkgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIGVzY2FwZSBjaGFyYWN0ZXIiKSk7Ci0JCSAgY2ggPSAnXFwnOwotCQl9Ci0JICAgICAgZWxzZQotCQljaCA9IHByb2Nlc3NfZXNjYXBlIChjaCk7Ci0JICAgIH0KLQkgIHNwcmludGYgKG91dF9idWYsICIlZCIsIChpbnQpICh1bnNpZ25lZCBjaGFyKSBjaCk7Ci0KLQkgIC8qIE5vbmUgb2YgdGhlc2UgJ3ggY29uc3RhbnRzIGZvciB1cy4gIFdlIHdhbnQgJ3gnLiAgKi8KLQkgIGlmICgoY2ggPSBHRVQgKCkpICE9ICdcJycpCi0JICAgIHsKLSNpZmRlZiBSRVFVSVJFX0NIQVJfQ0xPU0VfUVVPVEUKLQkgICAgICBhc193YXJuIChfKCJNaXNzaW5nIGNsb3NlIHF1b3RlOiAoYXNzdW1lZCkiKSk7Ci0jZWxzZQotCSAgICAgIGlmIChjaCAhPSBFT0YpCi0JCVVOR0VUIChjaCk7Ci0jZW5kaWYKLQkgICAgfQotCSAgaWYgKHN0cmxlbiAob3V0X2J1ZikgPT0gMSkKLQkgICAgewotCSAgICAgIFBVVCAob3V0X2J1ZlswXSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChzdGF0ZSA9PSA5KQotCSAgICBvbGRfc3RhdGUgPSAzOwotCSAgZWxzZQotCSAgICBvbGRfc3RhdGUgPSBzdGF0ZTsKLQkgIHN0YXRlID0gLTE7Ci0JICBvdXRfc3RyaW5nID0gb3V0X2J1ZjsKLQkgIFBVVCAoKm91dF9zdHJpbmcrKyk7Ci0JICBicmVhazsKLSNlbmRpZgotCi0JY2FzZSBMRVhfSVNfQ09MT046Ci0JICBpZiAoc3RhdGUgPT0gOSB8fCBzdGF0ZSA9PSAxMCkKLQkgICAgc3RhdGUgPSAzOwotCSAgZWxzZSBpZiAoc3RhdGUgIT0gMykKLQkgICAgc3RhdGUgPSAxOwotCSAgUFVUIChjaCk7Ci0JICBicmVhazsKLQotCWNhc2UgTEVYX0lTX05FV0xJTkU6Ci0JICAvKiBSb2xsIG91dCBhIGJ1bmNoIG9mIG5ld2xpbmVzIGZyb20gaW5zaWRlIGNvbW1lbnRzLCBldGMuICAqLwotCSAgaWYgKGFkZF9uZXdsaW5lcykKLQkgICAgewotCSAgICAgIC0tYWRkX25ld2xpbmVzOwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgIH0KLQkgIC8qIGZhbGwgdGhydSBpbnRvLi4uICovCi0KLQljYXNlIExFWF9JU19MSU5FX1NFUEFSQVRPUjoKLQkgIHN0YXRlID0gMDsKLQkgIFBVVCAoY2gpOwotCSAgYnJlYWs7Ci0KLSNpZmRlZiBUQ19WODUwCi0JY2FzZSBMRVhfSVNfRE9VQkxFREFTSF8xU1Q6Ci0JICBjaDIgPSBHRVQoKTsKLQkgIGlmIChjaDIgIT0gJy0nKQotCSAgICB7Ci0JICAgICAgVU5HRVQgKGNoMik7Ci0JICAgICAgZ290byBkZV9mYXVsdDsKLQkgICAgfQotCSAgLyogcmVhZCBhbmQgc2tpcCB0byBlbmQgb2YgbGluZSAqLwotCSAgZG8KLQkgICAgewotCSAgICAgIGNoID0gR0VUICgpOwotCSAgICB9Ci0JICB3aGlsZSAoY2ggIT0gRU9GICYmIGNoICE9ICdcbicpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIGNvbW1lbnQ7IG5ld2xpbmUgaW5zZXJ0ZWQiKSk7Ci0JICAgIH0KLQkgIHN0YXRlID0gMDsKLQkgIFBVVCAoJ1xuJyk7Ci0JICBicmVhazsKLSNlbmRpZgkgICAgCi0jaWZkZWYgVENfTTMyUgotCWNhc2UgTEVYX0lTX0RPVUJMRUJBUl8xU1Q6Ci0JICBjaDIgPSBHRVQoKTsKLQkgIGlmIChjaDIgIT0gJ3wnKQotCSAgICB7Ci0JICAgICAgVU5HRVQgKGNoMik7Ci0JICAgICAgZ290byBkZV9mYXVsdDsKLQkgICAgfQotCSAgLyogUmVzZXQgYmFjayB0byBzdGF0ZSAxIGFuZCBwcmV0ZW5kIHRoYXQgd2UgYXJlIHBhcnNpbmcgYSBsaW5lIGZyb20KLQkgICAgIGp1c3QgYWZ0ZXIgdGhlIGZpcnN0IHdoaXRlIHNwYWNlLiAgKi8KLQkgIHN0YXRlID0gMTsKLQkgIFBVVCAoJ3wnKTsKLQkgIFBVVCAoJ3wnKTsKLQkgIGJyZWFrOwotI2VuZGlmCSAgICAKLQljYXNlIExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQ6Ci0JICAvKiBGSVhNRS1zb21lZGF5OiBUaGUgdHdvIGNoYXJhY3RlciBjb21tZW50IHN0dWZmIHdhcyBiYWRseQotCSAgICAgdGhvdWdodCBvdXQuICBPbiBpMzg2LCB3ZSB3YW50ICcvJyBhcyBsaW5lIGNvbW1lbnQgc3RhcnQKLQkgICAgIEFORCB3ZSB3YW50IEMgc3R5bGUgY29tbWVudHMuICBoZW5jZSB0aGlzIGhhY2suICBUaGUKLQkgICAgIHdob2xlIGxleGljYWwgcHJvY2VzcyBzaG91bGQgYmUgcmV3b3JrZWQuICB4b3hvcmljaC4gICovCi0JICBpZiAoY2ggPT0gJy8nKQotCSAgICB7Ci0JICAgICAgY2gyID0gR0VUICgpOwotCSAgICAgIGlmIChjaDIgPT0gJyonKQotCQl7Ci0JCSAgb2xkX3N0YXRlID0gMzsKLQkJICBzdGF0ZSA9IC0yOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgVU5HRVQgKGNoMik7Ci0JCX0KLQkgICAgfSAvKiBiYWQgaGFjayAqLwotCi0JICBpZiAoc3RhdGUgPT0gMCB8fCBzdGF0ZSA9PSAxKQkvKiBPbmx5IGNvbW1lbnQgYXQgc3RhcnQgb2YgbGluZS4gICovCi0JICAgIHsKLQkgICAgICBpbnQgc3RhcnRjaDsKLQotCSAgICAgIHN0YXJ0Y2ggPSBjaDsKLQotCSAgICAgIGRvCi0JCXsKLQkJICBjaCA9IEdFVCAoKTsKLQkJfQotCSAgICAgIHdoaWxlIChjaCAhPSBFT0YgJiYgSVNfV0hJVEVTUEFDRSAoY2gpKTsKLQkgICAgICBpZiAoY2ggPT0gRU9GKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gY29tbWVudDsgbmV3bGluZSBpbnNlcnRlZCIpKTsKLQkJICBQVVQgKCdcbicpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknIHx8IHN0YXRlICE9IDAgfHwgc3RhcnRjaCAhPSAnIycpCi0JCXsKLQkJICAvKiBOb3QgYSBjcHAgbGluZS4gICovCi0JCSAgd2hpbGUgKGNoICE9IEVPRiAmJiAhSVNfTkVXTElORSAoY2gpKQotCQkgICAgY2ggPSBHRVQgKCk7Ci0JCSAgaWYgKGNoID09IEVPRikKLQkJICAgIGFzX3dhcm4gKF8oIkVPRiBpbiBDb21tZW50OiBOZXdsaW5lIGluc2VydGVkIikpOwotCQkgIHN0YXRlID0gMDsKLQkJICBQVVQgKCdcbicpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgLyogTG9rcyBsaWtlIGAjIDEyMyAiZmlsZW5hbWUiJyBmcm9tIGNwcC4gICovCi0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgICBvbGRfc3RhdGUgPSA0OwotCSAgICAgIHN0YXRlID0gLTE7Ci0JICAgICAgaWYgKHNjcnViX202OGtfbXJpKQotCQlvdXRfc3RyaW5nID0gIlx0YXBwbGluZSAiOwotCSAgICAgIGVsc2UKLQkJb3V0X3N0cmluZyA9ICJcdC5hcHBsaW5lICI7Ci0JICAgICAgUFVUICgqb3V0X3N0cmluZysrKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0jaWZkZWYgVENfRDEwVgotCSAgLyogQWxsIGluc25zIGVuZCBpbiBhIGNoYXIgZm9yIHdoaWNoIExFWF9JU19TWU1CT0xfQ09NUE9ORU5UIGlzIHRydWUuCi0JICAgICBUcmFwIGlzIHRoZSBvbmx5IHNob3J0IGluc24gdGhhdCBoYXMgYSBmaXJzdCBvcGVyYW5kIHRoYXQgaXMKLQkgICAgIG5laXRoZXIgcmVnaXN0ZXIgbm9yIGxhYmVsLgotCSAgICAgV2UgbXVzdCBwcmV2ZW50IGV4ZWYwZiB8fHRyYXAgIzEgdG8gZGVnZW5lcmF0ZSB0byBleGVmMGYgfHx0cmFwIzEgLgotCSAgICAgV2UgY2FuJ3QgbWFrZSAnIycgTEVYX0lTX1NZTUJPTF9DT01QT05FTlQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5Ci0JICAgICBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJULiAgSG93ZXZlciwgaXQgaXMgdGhlIG9ubHkgY2hhcmFjdGVyIGluCi0JICAgICBsaW5lX2NvbW1lbnRfY2hhcnMgZm9yIGQxMHYsIGhlbmNlIHdlIGNhbiByZWNvZ25pemUgaXQgYXMgc3VjaC4gICovCi0JICAvKiBBbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB3b3VsZCBiZSB0byByZXNldCB0aGUgc3RhdGUgdG8gMSB3aGVuCi0JICAgICB3ZSBzZWUgJ3x8JywgJzwnLSBvciAnLT4nLCBidXQgdGhhdCBzZWVtcyB0byBiZSBvdmVya2lsbC4gICovCi0JICBpZiAoc3RhdGUgPT0gMTApIFBVVCAoJyAnKTsKLSNlbmRpZgotCSAgLyogV2UgaGF2ZSBhIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIgd2hpY2ggaXMgbm90IGF0IHRoZQotCSAgICAgc3RhcnQgb2YgYSBsaW5lLiAgSWYgdGhpcyBpcyBhbHNvIGEgbm9ybWFsIGNvbW1lbnQKLQkgICAgIGNoYXJhY3RlciwgZmFsbCB0aHJvdWdoLiAgT3RoZXJ3aXNlIHRyZWF0IGl0IGFzIGEgZGVmYXVsdAotCSAgICAgY2hhcmFjdGVyLiAgKi8KLQkgIGlmIChzdHJjaHIgKHRjX2NvbW1lbnRfY2hhcnMsIGNoKSA9PSBOVUxMCi0JICAgICAgJiYgKCEgc2NydWJfbTY4a19tcmkKLQkJICB8fCAoY2ggIT0gJyEnICYmIGNoICE9ICcqJykpKQotCSAgICBnb3RvIGRlX2ZhdWx0OwotCSAgaWYgKHNjcnViX202OGtfbXJpCi0JICAgICAgJiYgKGNoID09ICchJyB8fCBjaCA9PSAnKicgfHwgY2ggPT0gJyMnKQotCSAgICAgICYmIHN0YXRlICE9IDEKLQkgICAgICAmJiBzdGF0ZSAhPSAxMCkKLQkgICAgZ290byBkZV9mYXVsdDsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBMRVhfSVNfQ09NTUVOVF9TVEFSVDoKLSNpZiBkZWZpbmVkIFRDX0FSTSAmJiBkZWZpbmVkIE9CSl9FTEYKLQkgIC8qIE9uIHRoZSBBUk0sIGBAJyBpcyB0aGUgY29tbWVudCBjaGFyYWN0ZXIuCi0JICAgICBVbmZvcnR1bmF0ZWx5IHRoaXMgaXMgYWxzbyBhIHNwZWNpYWwgY2hhcmFjdGVyIGluIEVMRiAuc3ltdmVyCi0JICAgICBkaXJlY3RpdmVzIChhbmQgLnR5cGUsIHRob3VnaCB3ZSBkZWFsIHdpdGggdGhvc2UgYW5vdGhlciB3YXkpLiAgU28KLQkgICAgIHdlIGNoZWNrIGlmIHRoaXMgbGluZSBpcyBzdWNoIGEgZGlyZWN0aXZlLCBhbmQgdHJlYXQgdGhlIGNoYXJhY3RlcgotCSAgICAgYXMgZGVmYXVsdCBpZiBzby4gIFRoaXMgaXMgYSBoYWNrLiAgKi8KLQkgIGlmICgoc3ltdmVyX3N0YXRlICE9IE5VTEwpICYmICgqc3ltdmVyX3N0YXRlID09IDApKQotCSAgICBnb3RvIGRlX2ZhdWx0OwotI2VuZGlmCi0JICBkbwotCSAgICB7Ci0JICAgICAgY2ggPSBHRVQgKCk7Ci0JICAgIH0KLQkgIHdoaWxlIChjaCAhPSBFT0YgJiYgIUlTX05FV0xJTkUgKGNoKSk7Ci0JICBpZiAoY2ggPT0gRU9GKQotCSAgICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50OyBuZXdsaW5lIGluc2VydGVkIikpOwotCSAgc3RhdGUgPSAwOwotCSAgUFVUICgnXG4nKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVDoKLQkgIGlmIChzdGF0ZSA9PSAxMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBzeW1ib2wgY2hhcmFjdGVyIGZvbGxvd2luZyBhbm90aGVyIHN5bWJvbAotCQkgY2hhcmFjdGVyLCB3aXRoIHdoaXRlc3BhY2UgaW4gYmV0d2Vlbi4gIFdlIHNraXBwZWQKLQkJIHRoZSB3aGl0ZXNwYWNlIGVhcmxpZXIsIHNvIG91dHB1dCBpdCBub3cuICAqLwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgc3RhdGUgPSAzOwotCSAgICAgIFBVVCAoJyAnKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoc3RhdGUgPT0gMykKLQkgICAgc3RhdGUgPSA5OwotCi0JICAvKiBUaGlzIGlzIGEgY29tbW9uIGNhc2UuICBRdWlja2x5IGNvcHkgQ0ggYW5kIGFsbCB0aGUKLSAgICAgICAgICAgICBmb2xsb3dpbmcgc3ltYm9sIGNvbXBvbmVudCBvciBub3JtYWwgY2hhcmFjdGVycy4gICovCi0JICBpZiAodG8gKyAxIDwgdG9lbmQKLQkgICAgICAmJiBtcmlfc3RhdGUgPT0gTlVMTAotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotCSAgICAgICYmIHN5bXZlcl9zdGF0ZSA9PSBOVUxMCi0jZW5kaWYKLQkgICAgICApCi0JICAgIHsKLQkgICAgICBjaGFyICpzOwotCSAgICAgIGludCBsZW47Ci0KLQkgICAgICBmb3IgKHMgPSBmcm9tOyBzIDwgZnJvbWVuZDsgcysrKQotCQl7Ci0JCSAgaW50IHR5cGU7Ci0KLQkJICBjaDIgPSAqICh1bnNpZ25lZCBjaGFyICopIHM7Ci0JCSAgdHlwZSA9IGxleFtjaDJdOwotCQkgIGlmICh0eXBlICE9IDAKLQkJICAgICAgJiYgdHlwZSAhPSBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVCkKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgICAgaWYgKHMgPiBmcm9tKQotCQl7Ci0JCSAgLyogSGFuZGxlIHRoZSBsYXN0IGNoYXJhY3RlciBub3JtYWxseSwgZm9yCi0gICAgICAgICAgICAgICAgICAgICBzaW1wbGljaXR5LiAgKi8KLQkJICAtLXM7Ci0JCX0KLQkgICAgICBsZW4gPSBzIC0gZnJvbTsKLQkgICAgICBpZiAobGVuID4gKHRvZW5kIC0gdG8pIC0gMSkKLQkJbGVuID0gKHRvZW5kIC0gdG8pIC0gMTsKLQkgICAgICBpZiAobGVuID4gMCkKLQkJewotCQkgIFBVVCAoY2gpOwotCQkgIGlmIChsZW4gPiA4KQotCQkgICAgewotCQkgICAgICBtZW1jcHkgKHRvLCBmcm9tLCBsZW4pOwotCQkgICAgICB0byArPSBsZW47Ci0JCSAgICAgIGZyb20gKz0gbGVuOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgc3dpdGNoIChsZW4pCi0JCQl7Ci0JCQljYXNlIDg6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgNzogKnRvKysgPSAqZnJvbSsrOwotCQkJY2FzZSA2OiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDU6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgNDogKnRvKysgPSAqZnJvbSsrOwotCQkJY2FzZSAzOiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDI6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgMTogKnRvKysgPSAqZnJvbSsrOwotCQkJfQotCQkgICAgfSAKLQkJICBjaCA9IEdFVCAoKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JZGVmYXVsdDoKLQlkZV9mYXVsdDoKLQkgIC8qIFNvbWUgcmVsYXRpdmVseSBgbm9ybWFsJyBjaGFyYWN0ZXIuICAqLwotCSAgaWYgKHN0YXRlID09IDApCi0JICAgIHsKLQkgICAgICBzdGF0ZSA9IDExOwkvKiBOb3cgc2VlaW5nIGxhYmVsIGRlZmluaXRpb24gKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoc3RhdGUgPT0gMSkKLQkgICAgewotCSAgICAgIHN0YXRlID0gMjsJLyogRGl0dG8gKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoc3RhdGUgPT0gOSkKLQkgICAgewotCSAgICAgIGlmIChsZXhbY2hdICE9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UKQotCQlzdGF0ZSA9IDM7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0YXRlID09IDEwKQotCSAgICB7Ci0JICAgICAgaWYgKGNoID09ICdcXCcpCi0JCXsKLQkJICAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBiYWNrc2xhc2g6IGEgYmFja3NsYXNoIG1heQotCQkgICAgIGJlIHRoZSBiZWdpbm5pbmcgb2YgYSBmb3JtYWwgcGFyYW1ldGVyIChvZiBhCi0JCSAgICAgbWFjcm8pIGZvbGxvd2luZyBhbm90aGVyIHN5bWJvbCBjaGFyYWN0ZXIsIHdpdGgKLQkJICAgICB3aGl0ZXNwYWNlIGluIGJldHdlZW4uICBJZiB0aGF0IGlzIHRoZSBjYXNlLCB3ZQotCQkgICAgIG91dHB1dCBhIHNwYWNlIGJlZm9yZSB0aGUgcGFyYW1ldGVyLiAgU3RyaWN0bHkKLQkJICAgICBzcGVha2luZywgY29ycmVjdCBoYW5kbGluZyBkZXBlbmRzIHVwb24gd2hhdCB0aGUKLQkJICAgICBtYWNybyBwYXJhbWV0ZXIgZXhwYW5kcyBpbnRvOyBpZiB0aGUgcGFyYW1ldGVyCi0JCSAgICAgZXhwYW5kcyBpbnRvIHNvbWV0aGluZyB3aGljaCBkb2VzIG5vdCBzdGFydCB3aXRoCi0JCSAgICAgYW4gb3BlcmFuZCBjaGFyYWN0ZXIsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBrZWVwCi0JCSAgICAgdGhlIHNwYWNlLiAgV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8KLQkJICAgICBtYWtlIHRoZSByaWdodCBjaG9pY2UsIHNvIGhlcmUgd2UgYXJlIG1ha2luZyB0aGUKLQkJICAgICBjaG9pY2Ugd2hpY2ggaXMgbW9yZSBsaWtlbHkgdG8gYmUgY29ycmVjdC4gICovCi0JCSAgUFVUICgnICcpOwotCQl9Ci0KLQkgICAgICBzdGF0ZSA9IDM7Ci0JICAgIH0KLQkgIFBVVCAoY2gpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKk5PVFJFQUNIRUQqLwotCi0gZnJvbWVvZjoKLSAgLyogV2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGlucHV0LiAgKi8KLSAgcmV0dXJuIHRvIC0gdG9zdGFydDsKLQotIHRvZnVsbDoKLSAgLyogVGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbC4gIFNhdmUgYW55IGlucHV0IHdlIGhhdmUgbm90IHlldAotICAgICBwcm9jZXNzZWQuICAqLwotICBpZiAoZnJvbWVuZCA+IGZyb20pCi0gICAgewotICAgICAgc2F2ZWRfaW5wdXQgPSBmcm9tOwotICAgICAgc2F2ZWRfaW5wdXRfbGVuID0gZnJvbWVuZCAtIGZyb207Ci0gICAgfQotICBlbHNlCi0gICAgc2F2ZWRfaW5wdXQgPSBOVUxMOwotCi0gIHJldHVybiB0byAtIHRvc3RhcnQ7Ci19Ci0KLS8qIGVuZCBvZiBhcHAuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2FzLmMgYi9nYXMvYXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhNzdjYS4uMDAwMDAwMAotLS0gYS9nYXMvYXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNDAgKzAsMCBAQAotLyogYXMuYyAtIEdBUyBtYWluIHByb2dyYW0uCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qCi0gKiBNYWluIHByb2dyYW0gZm9yIEFTOyBhIDMyLWJpdCBhc3NlbWJsZXIgb2YgR05VLgotICogVW5kZXJzdGFuZHMgY29tbWFuZCBhcmd1bWVudHMuCi0gKiBIYXMgYSBmZXcgcm91dGluZXMgdGhhdCBkb24ndCBmaXQgaW4gb3RoZXIgbW9kdWxlcyBiZWNhdXNlIHRoZXkKLSAqIGFyZSBzaGFyZWQuCi0gKgotICoKLSAqCQkJYnVncwotICoKLSAqIDogaW5pdGlhbGlzZXJzCi0gKglTaW5jZSBuby1vbmUgZWxzZSBzYXlzIHRoZXkgd2lsbCBzdXBwb3J0IHRoZW0gaW4gZnV0dXJlOiBJCi0gKiBkb24ndCBzdXBwb3J0IHRoZW0gbm93LgotICoKLSAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2RlZmluZSBDT01NT04KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm91dHB1dC1maWxlLmgiCi0jaW5jbHVkZSAic2IuaCIKLSNpbmNsdWRlICJtYWNyby5oIgotCi0jaWZkZWYgSEFWRV9JVEJMX0NQVQotI2luY2x1ZGUgIml0Ymwtb3BzLmgiCi0jZWxzZQotI2RlZmluZSBpdGJsX3BhcnNlKGl0YmxfZmlsZSkgMQotI2RlZmluZSBpdGJsX2luaXQoKQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NCUksKLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLWV4dGVybiBQVFIgc2JyayAoKTsKLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHNob3dfdXNhZ2UgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgdm9pZCBwYXJzZV9hcmdzIFBBUkFNUyAoKGludCAqLCBjaGFyICoqKikpOwotc3RhdGljIHZvaWQgZHVtcF9zdGF0aXN0aWNzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyBQQVJBTVMgKChpbnQgYXJnYywgY2hhciAqKmFyZ3YpKTsKLXN0YXRpYyBpbnQgbWFjcm9fZXhwciBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKTsKLQotaW50IGxpc3Rpbmc7CQkJLyogdHJ1ZSBpZiBhIGxpc3RpbmcgaXMgd2FudGVkICovCi0KLXN0YXRpYyBjaGFyICpsaXN0aW5nX2ZpbGVuYW1lID0gTlVMTDsJLyogTmFtZSBvZiBsaXN0aW5nIGZpbGUuICAqLwotCi0vKiBUeXBlIG9mIGRlYnVnZ2luZyB0byBnZW5lcmF0ZS4gICovCi0KLWVudW0gZGVidWdfaW5mb190eXBlIGRlYnVnX3R5cGUgPSBERUJVR19OT05FOwotCi0vKiBNYXhpbXVtIGxldmVsIG9mIG1hY3JvIG5lc3RpbmcuICAqLwotCi1pbnQgbWF4X21hY3JvX25lc3QgPSAxMDA7Ci0KLWNoYXIgKm15bmFtZTsJCQkvKiBhcmd2WzBdICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc2VnVCByZWdfc2VjdGlvbiwgZXhwcl9zZWN0aW9uOwotc2VnVCB0ZXh0X3NlY3Rpb24sIGRhdGFfc2VjdGlvbiwgYnNzX3NlY3Rpb247Ci0jZW5kaWYKLQotLyogVGhlIGRlZmF1bHQgb2JzdGFjayBjaHVuayBzaXplLiAgSWYgd2Ugc2V0IHRoaXMgdG8gemVybywgdGhlCi0gICBvYnN0YWNrIGNvZGUgd2lsbCB1c2Ugd2hhdGV2ZXIgd2lsbCBmaXQgaW4gYSA0MDk2IGJ5dGUgYmxvY2suICAqLwotaW50IGNodW5rc2l6ZSA9IDA7Ci0KLS8qIFRvIG1vbml0b3IgbWVtb3J5IGFsbG9jYXRpb24gbW9yZSBlZmZlY3RpdmVseSwgbWFrZSB0aGlzIG5vbi16ZXJvLgotICAgVGhlbiB0aGUgY2h1bmsgc2l6ZXMgZm9yIGdhcyBhbmQgYmZkIHdpbGwgYmUgcmVkdWNlZC4gICovCi1pbnQgZGVidWdfbWVtb3J5ID0gMDsKLQotLyogV2UgYnVpbGQgYSBsaXN0IG9mIGRlZnN5bXMgYXMgd2UgcmVhZCB0aGUgb3B0aW9ucywgYW5kIHRoZW4gZGVmaW5lCi0gICB0aGVtIGFmdGVyIHdlIGhhdmUgaW5pdGlhbGl6ZWQgZXZlcnl0aGluZy4gICovCi0KLXN0cnVjdCBkZWZzeW1fbGlzdAotewotICBzdHJ1Y3QgZGVmc3ltX2xpc3QgKm5leHQ7Ci0gIGNoYXIgKm5hbWU7Ci0gIHZhbHVlVCB2YWx1ZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGVmc3ltX2xpc3QgKmRlZnN5bXM7Ci0KLS8qIEtlZXAgYSByZWNvcmQgb2YgdGhlIGl0YmwgZmlsZXMgd2UgcmVhZCBpbi4gKi8KLQotc3RydWN0IGl0YmxfZmlsZV9saXN0Ci17Ci0gIHN0cnVjdCBpdGJsX2ZpbGVfbGlzdCAqbmV4dDsKLSAgY2hhciAqbmFtZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXRibF9maWxlX2xpc3QgKml0YmxfZmlsZXM7Ci0MCi12b2lkCi1wcmludF92ZXJzaW9uX2lkICgpCi17Ci0gIHN0YXRpYyBpbnQgcHJpbnRlZDsKLSAgaWYgKHByaW50ZWQpCi0gICAgcmV0dXJuOwotICBwcmludGVkID0gMTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSB1c2luZyBCRkQgdmVyc2lvbiAlcyIpLAotCSAgIFZFUlNJT04sIFRBUkdFVF9BTElBUywgQkZEX1ZFUlNJT04pOwotI2Vsc2UKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSIpLCBWRVJTSU9OLCBUQVJHRVRfQUxJQVMpOwotI2VuZGlmCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJVc2FnZTogJXMgW29wdGlvbi4uLl0gW2FzbWZpbGUuLi5dXG4iKSwgbXluYW1lKTsKLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLU9wdGlvbnM6XG5cCi0gIC1hW3N1Yi1vcHRpb24uLi5dCXR1cm4gb24gbGlzdGluZ3NcblwKLSAgICBTdWItb3B0aW9ucyBbZGVmYXVsdCBobHNdOlxuXAotICAgIGMgICBvbWl0IGZhbHNlIGNvbmRpdGlvbmFsc1xuXAotICAgIGQgICBvbWl0IGRlYnVnZ2luZyBkaXJlY3RpdmVzXG5cCi0gICAgaCAgIGluY2x1ZGUgaGlnaC1sZXZlbCBzb3VyY2VcblwKLSAgICBsICAgaW5jbHVkZSBhc3NlbWJseVxuXAotICAgIG0gICBpbmNsdWRlIG1hY3JvIGV4cGFuc2lvbnNcblwKLSAgICBuICAgb21pdCBmb3JtcyBwcm9jZXNzaW5nXG5cCi0gICAgcyAgIGluY2x1ZGUgc3ltYm9sc1xuXAotICAgIEwgICBpbmNsdWRlIGxpbmUgZGVidWcgc3RhdGlzdGljcyAoaWYgYXBwbGljYWJsZSlcblwKLSAgICA9ZmlsZSBzZXQgbGlzdGluZyBmaWxlIG5hbWUgKG11c3QgYmUgbGFzdCBzdWItb3B0aW9uKVxuIikpOwotICAKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1ECQkgICAgICAgICAgcHJvZHVjZSBhc3NlbWJsZXIgZGVidWdnaW5nIG1lc3NhZ2VzXG5cCi0gIC0tZGVmc3ltIFNZTT1WQUwgICAgICAgIGRlZmluZSBzeW1ib2wgU1lNIHRvIGdpdmVuIHZhbHVlXG5cCi0gIC1mCQkgICAgICAgICAgc2tpcCB3aGl0ZXNwYWNlIGFuZCBjb21tZW50IHByZXByb2Nlc3NpbmdcblwKLSAgLS1nc3RhYnMJICAgICAgICAgIGdlbmVyYXRlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuXAotICAtLWdkd2FyZjIJICAgICAgICAgIGdlbmVyYXRlIERXQVJGMiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cblwKLSAgLS1oZWxwCQkgIHNob3cgdGhpcyBtZXNzYWdlIGFuZCBleGl0XG5cCi0gIC1JIERJUgkJICBhZGQgRElSIHRvIHNlYXJjaCBsaXN0IGZvciAuaW5jbHVkZSBkaXJlY3RpdmVzXG5cCi0gIC1KCQkgICAgICAgICAgZG9uJ3Qgd2FybiBhYm91dCBzaWduZWQgb3ZlcmZsb3dcblwKLSAgLUsJCSAgICAgICAgICB3YXJuIHdoZW4gZGlmZmVyZW5jZXMgYWx0ZXJlZCBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzXG5cCi0gIC1MLC0ta2VlcC1sb2NhbHMgICAgICAgIGtlZXAgbG9jYWwgc3ltYm9scyAoZS5nLiBzdGFydGluZyB3aXRoIGBMJylcbiIpKTsKLSAgCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtTSwtLW1yaQkgICAgICAgICAgYXNzZW1ibGUgaW4gTVJJIGNvbXBhdGliaWxpdHkgbW9kZVxuXAotICAtLU1EIEZJTEUJICAgICAgICAgIHdyaXRlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaW4gRklMRSAoZGVmYXVsdCBub25lKVxuXAotICAtbm9jcHAJCSAgaWdub3JlZFxuXAotICAtbyBPQkpGSUxFCSAgICAgICAgICBuYW1lIHRoZSBvYmplY3QtZmlsZSBvdXRwdXQgT0JKRklMRSAoZGVmYXVsdCBhLm91dClcblwKLSAgLVIJCSAgICAgICAgICBmb2xkIGRhdGEgc2VjdGlvbiBpbnRvIHRleHQgc2VjdGlvblxuXAotICAtLXN0YXRpc3RpY3MJICAgICAgICAgIHByaW50IHZhcmlvdXMgbWVhc3VyZWQgc3RhdGlzdGljcyBmcm9tIGV4ZWN1dGlvblxuXAotICAtLXN0cmlwLWxvY2FsLWFic29sdXRlICBzdHJpcCBsb2NhbCBhYnNvbHV0ZSBzeW1ib2xzXG5cCi0gIC0tdHJhZGl0aW9uYWwtZm9ybWF0CSAgVXNlIHNhbWUgZm9ybWF0IGFzIG5hdGl2ZSBhc3NlbWJsZXIgd2hlbiBwb3NzaWJsZVxuXAotICAtLXZlcnNpb24JCSAgcHJpbnQgYXNzZW1ibGVyIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG5cCi0gIC1XICAtLW5vLXdhcm4JCSAgc3VwcHJlc3Mgd2FybmluZ3NcblwKLSAgLS13YXJuCQkgIGRvbid0IHN1cHByZXNzIHdhcm5pbmdzXG5cCi0gIC0tZmF0YWwtd2FybmluZ3MJICB0cmVhdCB3YXJuaW5ncyBhcyBlcnJvcnNcblwKLSAgLS1pdGJsIElOU1RUQkwJICBleHRlbmQgaW5zdHJ1Y3Rpb24gc2V0IHRvIGluY2x1ZGUgaW5zdHJ1Y3Rpb25zXG5cCi0JCQkgIG1hdGNoaW5nIHRoZSBzcGVjaWZpY2F0aW9ucyBkZWZpbmVkIGluIGZpbGUgSU5TVFRCTFxuXAotICAtdwkJCSAgaWdub3JlZFxuXAotICAtWAkJCSAgaWdub3JlZFxuXAotICAtWgkJCSAgZ2VuZXJhdGUgb2JqZWN0IGZpbGUgZXZlbiBhZnRlciBlcnJvcnNcbiIpKTsKLSAgCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLWxpc3RpbmctbGhzLXdpZHRoCSAgc2V0IHRoZSB3aWR0aCBpbiB3b3JkcyBvZiB0aGUgb3V0cHV0IGRhdGEgY29sdW1uIG9mXG5cCi0JCQkgIHRoZSBsaXN0aW5nXG5cCi0gIC0tbGlzdGluZy1saHMtd2lkdGgyCSAgc2V0IHRoZSB3aWR0aCBpbiB3b3JkcyBvZiB0aGUgY29udGludWF0aW9uIGxpbmVzXG5cCi0JCQkgIG9mIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW47IGlnbm9yZWQgaWYgc21hbGxlciB0aGFuXG5cCi0JCQkgIHRoZSB3aWR0aCBvZiB0aGUgZmlyc3QgbGluZVxuXAotICAtLWxpc3RpbmctcmhzLXdpZHRoCSAgc2V0IHRoZSBtYXggd2lkdGggaW4gY2hhcmFjdGVycyBvZiB0aGUgbGluZXMgZnJvbVxuXAotCQkJICB0aGUgc291cmNlIGZpbGVcblwKLSAgLS1saXN0aW5nLWNvbnQtbGluZXMJICBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRpbnVhdGlvbiBsaW5lcyB1c2VkXG5cCi0JCQkgIGZvciB0aGUgb3V0cHV0IGRhdGEgY29sdW1uIG9mIHRoZSBsaXN0aW5nXG4iKSk7Ci0KLSAgbWRfc2hvd191c2FnZSAoc3RyZWFtKTsKLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci19Ci0KLSNpZmRlZiBVU0VfRU1VTEFUSU9OUwotI2RlZmluZSBFTVVMQVRJT05fRU5WSVJPTiAiQVNfRU1VTEFUSU9OIgotCi1leHRlcm4gc3RydWN0IGVtdWxhdGlvbiBtaXBzYmVsZiwgbWlwc2xlbGYsIG1pcHNlbGY7Ci1leHRlcm4gc3RydWN0IGVtdWxhdGlvbiBtaXBzYmVjb2ZmLCBtaXBzbGVjb2ZmLCBtaXBzZWNvZmY7Ci1leHRlcm4gc3RydWN0IGVtdWxhdGlvbiBpMzg2Y29mZiwgaTM4NmVsZjsKLQotc3RhdGljIHN0cnVjdCBlbXVsYXRpb24gKmNvbnN0IGVtdWxhdGlvbnNbXSA9IHsgRU1VTEFUSU9OUyB9Owotc3RhdGljIGNvbnN0IGludCBuX2VtdWxhdGlvbnMgPSBzaXplb2YgKGVtdWxhdGlvbnMpIC8gc2l6ZW9mIChlbXVsYXRpb25zWzBdKTsKLQotc3RhdGljIHZvaWQgc2VsZWN0X2VtdWxhdGlvbl9tb2RlIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotCi1zdGF0aWMgdm9pZAotc2VsZWN0X2VtdWxhdGlvbl9tb2RlIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBpOwotICBjaGFyICpwLCAqZW0gPSAwOwotCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCi0gICAgaWYgKCFzdHJuY21wICgiLS1lbSIsIGFyZ3ZbaV0sIDQpKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKGkgPT0gYXJnYykKLSAgICBnb3RvIGRvX2RlZmF1bHQ7Ci0KLSAgcCA9IHN0cmNociAoYXJndltpXSwgJz0nKTsKLSAgaWYgKHApCi0gICAgcCsrOwotICBlbHNlCi0gICAgcCA9IGFyZ3ZbaSsxXTsKLQotICBpZiAoIXAgfHwgISpwKQotICAgIGFzX2ZhdGFsIChfKCJtaXNzaW5nIGVtdWxhdGlvbiBtb2RlIG5hbWUiKSk7Ci0gIGVtID0gcDsKLQotIGRvX2RlZmF1bHQ6Ci0gIGlmIChlbSA9PSAwKQotICAgIGVtID0gZ2V0ZW52IChFTVVMQVRJT05fRU5WSVJPTik7Ci0gIGlmIChlbSA9PSAwKQotICAgIGVtID0gREVGQVVMVF9FTVVMQVRJT047Ci0KLSAgaWYgKGVtKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2VtdWxhdGlvbnM7IGkrKykKLQlpZiAoIXN0cmNtcCAoZW11bGF0aW9uc1tpXS0+bmFtZSwgZW0pKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaSA9PSBuX2VtdWxhdGlvbnMpCi0JYXNfZmF0YWwgKF8oInVucmVjb2duaXplZCBlbXVsYXRpb24gbmFtZSBgJXMnIiksIGVtKTsKLSAgICAgIHRoaXNfZW11bGF0aW9uID0gZW11bGF0aW9uc1tpXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB0aGlzX2VtdWxhdGlvbiA9IGVtdWxhdGlvbnNbMF07Ci0KLSAgdGhpc19lbXVsYXRpb24tPmluaXQgKCk7Ci19Ci0KLWNvbnN0IGNoYXIgKgotZGVmYXVsdF9lbXVsX2JmZF9uYW1lICgpCi17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZAotY29tbW9uX2VtdWxfaW5pdCAoKQotewotICB0aGlzX2Zvcm1hdCA9IHRoaXNfZW11bGF0aW9uLT5mb3JtYXQ7Ci0KLSAgaWYgKHRoaXNfZW11bGF0aW9uLT5sZWFkaW5nX3VuZGVyc2NvcmUgPT0gMikKLSAgICB0aGlzX2VtdWxhdGlvbi0+bGVhZGluZ191bmRlcnNjb3JlID0gdGhpc19mb3JtYXQtPmRmbF9sZWFkaW5nX3VuZGVyc2NvcmU7Ci0KLSAgaWYgKHRoaXNfZW11bGF0aW9uLT5kZWZhdWx0X2VuZGlhbiAhPSAyKQotICAgIHRhcmdldF9iaWdfZW5kaWFuID0gdGhpc19lbXVsYXRpb24tPmRlZmF1bHRfZW5kaWFuOwotCi0gIGlmICh0aGlzX2VtdWxhdGlvbi0+ZmFrZV9sYWJlbF9uYW1lID09IDApCi0gICAgewotICAgICAgaWYgKHRoaXNfZW11bGF0aW9uLT5sZWFkaW5nX3VuZGVyc2NvcmUpCi0JdGhpc19lbXVsYXRpb24tPmZha2VfbGFiZWxfbmFtZSA9ICJMMFwwMDEiOwotICAgICAgZWxzZQotCS8qIFdoYXQgb3RoZXIgcGFyYW1ldGVycyBzaG91bGQgd2UgdGVzdD8gICovCi0JdGhpc19lbXVsYXRpb24tPmZha2VfbGFiZWxfbmFtZSA9ICIuTDBcMDAxIjsKLSAgICB9Ci19Ci0jZW5kaWYKLQotLyoKLSAqIFNpbmNlIGl0IGlzIGVhc3kgdG8gZG8gaGVyZSB3ZSBpbnRlcnByZXQgdGhlIHNwZWNpYWwgYXJnICItIgotICogdG8gbWVhbiAidXNlIHN0ZGluIiBhbmQgd2Ugc2V0IHRoYXQgYXJndltdIHBvaW50aW5nIHRvICIiLgotICogQWZ0ZXIgd2UgaGF2ZSBtdW5nZWQgYXJndltdLCB0aGUgb25seSB0aGluZ3MgbGVmdCBhcmUgc291cmNlIGZpbGUKLSAqIG5hbWUocykgYW5kICIiKHMpIGRlbm90aW5nIHN0ZGluLiBUaGVzZSBmaWxlIG5hbWVzIGFyZSB1c2VkCi0gKiAocGVyaGFwcyBtb3JlIHRoYW4gb25jZSkgbGF0ZXIuCi0gKgotICogY2hlY2sgZm9yIG5ldyBtYWNoaW5lLWRlcCBjbWRsaW5lIG9wdGlvbnMgaW4KLSAqIG1kX3BhcnNlX29wdGlvbiBkZWZpbml0aW9ucyBpbiBjb25maWcvdGMtKi5jCi0gKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX2FyZ3MgKHBhcmdjLCBwYXJndikKLSAgICAgaW50ICpwYXJnYzsKLSAgICAgY2hhciAqKipwYXJndjsKLXsKLSAgaW50IG9sZF9hcmdjLCBuZXdfYXJnYzsKLSAgY2hhciAqKm9sZF9hcmd2LCAqKm5ld19hcmd2OwotCi0gIC8qIFN0YXJ0aW5nIHRoZSBzaG9ydCBvcHRpb24gc3RyaW5nIHdpdGggJy0nIGlzIGZvciBwcm9ncmFtcyB0aGF0Ci0gICAgIGV4cGVjdCBvcHRpb25zIGFuZCBvdGhlciBBUkdWLWVsZW1lbnRzIGluIGFueSBvcmRlciBhbmQgdGhhdCBjYXJlIGFib3V0Ci0gICAgIHRoZSBvcmRlcmluZyBvZiB0aGUgdHdvLiAgV2UgZGVzY3JpYmUgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudAotICAgICBhcyBpZiBpdCB3ZXJlIHRoZSBhcmd1bWVudCBvZiBhbiBvcHRpb24gd2l0aCBjaGFyYWN0ZXIgY29kZSAxLiAgKi8KLQotICBjaGFyICpzaG9ydG9wdHM7Ci0gIGV4dGVybiBDT05TVCBjaGFyICptZF9zaG9ydG9wdHM7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIHN0ZF9zaG9ydG9wdHNbXSA9Ci0gICAgewotICAgICAgJy0nLCAnSicsCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgICAgIC8qIC1LIGlzIG5vdCBtZWFuaW5nZnVsIGlmIC53b3JkIGlzIG5vdCBiZWluZyBoYWNrZWQuICAqLwotICAgICAgJ0snLAotI2VuZGlmCi0gICAgICAnTCcsICdNJywgJ1InLCAnVycsICdaJywgJ2YnLCAnYScsICc6JywgJzonLCAnRCcsICdJJywgJzonLCAnbycsICc6JywKLSNpZm5kZWYgVk1TCi0gICAgICAvKiAtdiB0YWtlcyBhbiBhcmd1bWVudCBvbiBWTVMsIHNvIHdlIGRvbid0IG1ha2UgaXQgYSBnZW5lcmljCi0gICAgICAgICBvcHRpb24uICAqLwotICAgICAgJ3YnLAotI2VuZGlmCi0gICAgICAndycsICdYJywKLSAgICAgIC8qIE5ldyBvcHRpb24gZm9yIGV4dGVuZGluZyBpbnN0cnVjdGlvbiBzZXQgKHNlZSBhbHNvIC0taXRibCBiZWxvdykgKi8KLSAgICAgICd0JywgJzonLAotICAgICAgJ1wwJwotICAgIH07Ci0gIHN0cnVjdCBvcHRpb24gKmxvbmdvcHRzOwotICBleHRlcm4gc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdOwotICBleHRlcm4gc2l6ZV90IG1kX2xvbmdvcHRzX3NpemU7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIHN0ZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fSEVMUCAoT1BUSU9OX1NURF9CQVNFKQotICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSEVMUH0sCi0gICAgeyJrZWVwLWxvY2FscyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnTCd9LAotICAgIHsibXJpIiwgbm9fYXJndW1lbnQsIE5VTEwsICdNJ30sCi0jZGVmaW5lIE9QVElPTl9OT0NQUCAoT1BUSU9OX1NURF9CQVNFICsgMSkKLSAgICB7Im5vY3BwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0NQUH0sCi0jZGVmaW5lIE9QVElPTl9TVEFUSVNUSUNTIChPUFRJT05fU1REX0JBU0UgKyAyKQotICAgIHsic3RhdGlzdGljcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RBVElTVElDU30sCi0jZGVmaW5lIE9QVElPTl9WRVJTSU9OIChPUFRJT05fU1REX0JBU0UgKyAzKQotICAgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSU0lPTn0sCi0jZGVmaW5lIE9QVElPTl9EVU1QQ09ORklHIChPUFRJT05fU1REX0JBU0UgKyA0KQotICAgIHsiZHVtcC1jb25maWciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RVTVBDT05GSUd9LAotI2RlZmluZSBPUFRJT05fVkVSQk9TRSAoT1BUSU9OX1NURF9CQVNFICsgNSkKLSAgICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUkJPU0V9LAotI2RlZmluZSBPUFRJT05fRU1VTEFUSU9OIChPUFRJT05fU1REX0JBU0UgKyA2KQotICAgIHsiZW11bGF0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTVVMQVRJT059LAotI2RlZmluZSBPUFRJT05fREVGU1lNIChPUFRJT05fU1REX0JBU0UgKyA3KQotICAgIHsiZGVmc3ltIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERUZTWU19LAotI2RlZmluZSBPUFRJT05fSU5TVFRCTCAoT1BUSU9OX1NURF9CQVNFICsgOCkKLSAgICAvKiBOZXcgb3B0aW9uIGZvciBleHRlbmRpbmcgaW5zdHJ1Y3Rpb24gc2V0IChzZWUgYWxzbyAtdCBhYm92ZSkuCi0gICAgICAgVGhlICItdCBmaWxlIiBvciAiLS1pdGJsIGZpbGUiIG9wdGlvbiBleHRlbmRzIHRoZSBiYXNpYyBzZXQgb2YKLSAgICAgICB2YWxpZCBpbnN0cnVjdGlvbnMgYnkgcmVhZGluZyAiZmlsZSIsIGEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgYQotICAgICAgIGxpc3Qgb2YgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gIFRoZSBhZGRpdGlvbmFsIG9wY29kZXMgYW5kIHRoZWlyCi0gICAgICAgZm9ybWF0cyBhcmUgYWRkZWQgdG8gdGhlIGJ1aWx0LWluIHNldCBvZiBpbnN0cnVjdGlvbnMsIGFuZAotICAgICAgIG1uZW1vbmljcyBmb3IgbmV3IHJlZ2lzdGVycyBtYXkgYWxzbyBiZSBkZWZpbmVkLiAgKi8KLSAgICB7Iml0YmwiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lOU1RUQkx9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEggKE9QVElPTl9TVERfQkFTRSArIDkpCi0gICAgeyJsaXN0aW5nLWxocy13aWR0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElTVElOR19MSFNfV0lEVEh9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEgyIChPUFRJT05fU1REX0JBU0UgKyAxMCkKLSAgICB7Imxpc3RpbmctbGhzLXdpZHRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSVNUSU5HX0xIU19XSURUSDJ9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19SSFNfV0lEVEggKE9QVElPTl9TVERfQkFTRSArIDExKQotICAgIHsibGlzdGluZy1yaHMtd2lkdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJU1RJTkdfUkhTX1dJRFRIfSwKLSNkZWZpbmUgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FUyAoT1BUSU9OX1NURF9CQVNFICsgMTIpCi0gICAgeyJsaXN0aW5nLWNvbnQtbGluZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FU30sCi0jZGVmaW5lIE9QVElPTl9ERVBGSUxFIChPUFRJT05fU1REX0JBU0UgKyAxMykKLSAgICB7Ik1EIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERVBGSUxFfSwKLSNkZWZpbmUgT1BUSU9OX0dTVEFCUyAoT1BUSU9OX1NURF9CQVNFICsgMTQpCi0gICAgeyJnc3RhYnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0dTVEFCU30sCi0jZGVmaW5lIE9QVElPTl9TVFJJUF9MT0NBTF9BQlNPTFVURSAoT1BUSU9OX1NURF9CQVNFICsgMTUpCi0gICAgeyJzdHJpcC1sb2NhbC1hYnNvbHV0ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RSSVBfTE9DQUxfQUJTT0xVVEV9LAotI2RlZmluZSBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUIChPUFRJT05fU1REX0JBU0UgKyAxNikKLSAgICB7InRyYWRpdGlvbmFsLWZvcm1hdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUfSwKLSNkZWZpbmUgT1BUSU9OX0dEV0FSRjIgKE9QVElPTl9TVERfQkFTRSArIDE3KQotICAgIHsiZ2R3YXJmMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fR0RXQVJGMn0sCi0gICAgeyJuby13YXJuIiwgbm9fYXJndW1lbnQsIE5VTEwsICdXJ30sCi0jZGVmaW5lIE9QVElPTl9XQVJOIChPUFRJT05fU1REX0JBU0UgKyAxOCkKLSAgICB7Indhcm4iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk59LAotI2RlZmluZSBPUFRJT05fV0FSTl9GQVRBTCAoT1BUSU9OX1NURF9CQVNFICsgMTkpCi0gICAgeyJmYXRhbC13YXJuaW5ncyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9GQVRBTH0KLSAgfTsKLQotICAvKiBDb25zdHJ1Y3QgdGhlIG9wdGlvbiBsaXN0cyBmcm9tIHRoZSBzdGFuZGFyZCBsaXN0IGFuZCB0aGUKLSAgICAgdGFyZ2V0IGRlcGVuZGVudCBsaXN0LiAgKi8KLSAgc2hvcnRvcHRzID0gY29uY2F0IChzdGRfc2hvcnRvcHRzLCBtZF9zaG9ydG9wdHMsIChjaGFyICopIE5VTEwpOwotICBsb25nb3B0cyA9IChzdHJ1Y3Qgb3B0aW9uICopIHhtYWxsb2MgKHNpemVvZiAoc3RkX2xvbmdvcHRzKSArIG1kX2xvbmdvcHRzX3NpemUpOwotICBtZW1jcHkgKGxvbmdvcHRzLCBzdGRfbG9uZ29wdHMsIHNpemVvZiAoc3RkX2xvbmdvcHRzKSk7Ci0gIG1lbWNweSAoKGNoYXIgKikgbG9uZ29wdHMgKyBzaXplb2YgKHN0ZF9sb25nb3B0cyksCi0JICBtZF9sb25nb3B0cywgbWRfbG9uZ29wdHNfc2l6ZSk7Ci0KLSAgLyogTWFrZSBhIGxvY2FsIGNvcHkgb2YgdGhlIG9sZCBhcmd2LiAgKi8KLSAgb2xkX2FyZ2MgPSAqcGFyZ2M7Ci0gIG9sZF9hcmd2ID0gKnBhcmd2OwotCi0gIC8qIEluaXRpYWxpemUgYSBuZXcgYXJndiB0aGF0IGNvbnRhaW5zIG5vIG9wdGlvbnMuICAqLwotICBuZXdfYXJndiA9IChjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiAob2xkX2FyZ2MgKyAxKSk7Ci0gIG5ld19hcmd2WzBdID0gb2xkX2FyZ3ZbMF07Ci0gIG5ld19hcmdjID0gMTsKLSAgbmV3X2FyZ3ZbbmV3X2FyZ2NdID0gTlVMTDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBnZXRvcHRfbG9uZ19vbmx5IGlzIGxpa2UgZ2V0b3B0X2xvbmcsIGJ1dCAnLScgYXMgd2VsbCBhcyAnLS0nIGNhbgotCSBpbmRpY2F0ZSBhIGxvbmcgb3B0aW9uLiAgKi8KLSAgICAgIGludCBsb25naW5kOwotICAgICAgaW50IG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChvbGRfYXJnYywgb2xkX2FyZ3YsIHNob3J0b3B0cywgbG9uZ29wdHMsCi0JCQkJICAgJmxvbmdpbmQpOwotCi0gICAgICBpZiAob3B0YyA9PSAtMSkKLQlicmVhazsKLQotICAgICAgc3dpdGNoIChvcHRjKQotCXsKLQlkZWZhdWx0OgotCSAgLyogbWRfcGFyc2Vfb3B0aW9uIHNob3VsZCByZXR1cm4gMSBpZiBpdCByZWNvZ25pemVzIG9wdGMsCi0JICAgICAwIGlmIG5vdC4gICovCi0JICBpZiAobWRfcGFyc2Vfb3B0aW9uIChvcHRjLCBvcHRhcmcpICE9IDApCi0JICAgIGJyZWFrOwotCSAgLyogYC12JyBpc24ndCBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhbCBzaG9ydF9vcHRzIGxpc3QsIHNvIGNoZWNrIGZvcgotCSAgICAgaXQgZXhwbGljaXR5IGhlcmUgYmVmb3JlIGRlY2lkaW5nIHdlJ3ZlIGdvdHRlbiBhIGJhZCBhcmd1bWVudC4gICovCi0JICBpZiAob3B0YyA9PSAndicpCi0JICAgIHsKLSNpZmRlZiBWTVMKLQkgICAgICAvKiBUZWxsaW5nIGdldG9wdCB0byB0cmVhdCAtdidzIHZhbHVlIGFzIG9wdGlvbmFsIGNhbiByZXN1bHQKLQkJIGluIGl0IHBpY2tpbmcgdXAgYSBmb2xsb3dpbmcgZmlsZW5hbWUgYXJndW1lbnQgaGVyZS4gIFRoZQotCQkgVk1TIGNvZGUgaW4gbWRfcGFyc2Vfb3B0aW9uIGNhbiByZXR1cm4gMCBpbiB0aGF0IGNhc2UsCi0JCSBidXQgaXQgaGFzIG5vIHdheSBvZiBwdXNoaW5nIHRoZSBmaWxlbmFtZSBhcmd1bWVudCBiYWNrLiAgKi8KLQkgICAgICBpZiAob3B0YXJnICYmICpvcHRhcmcpCi0JCW5ld19hcmd2W25ld19hcmdjKytdID0gb3B0YXJnLCAgbmV3X2FyZ3ZbbmV3X2FyZ2NdID0gTlVMTDsKLQkgICAgICBlbHNlCi0jZWxzZQotCSAgICAgIGNhc2UgJ3YnOgotI2VuZGlmCi0JICAgICAgY2FzZSBPUFRJT05fVkVSQk9TRToKLQkJcHJpbnRfdmVyc2lvbl9pZCAoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgLypGQUxMVEhSVSovCi0KLQljYXNlICc/JzoKLQkgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0KLQljYXNlIDE6CQkJLyogRmlsZSBuYW1lLiAgKi8KLQkgIGlmICghc3RyY21wIChvcHRhcmcsICItIikpCi0JICAgIG9wdGFyZyA9ICIiOwotCSAgbmV3X2FyZ3ZbbmV3X2FyZ2MrK10gPSBvcHRhcmc7Ci0JICBuZXdfYXJndltuZXdfYXJnY10gPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9IRUxQOgotCSAgc2hvd191c2FnZSAoc3Rkb3V0KTsKLQkgIGV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci0KLQljYXNlIE9QVElPTl9OT0NQUDoKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fU1RBVElTVElDUzoKLQkgIGZsYWdfcHJpbnRfc3RhdGlzdGljcyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1NUUklQX0xPQ0FMX0FCU09MVVRFOgotCSAgZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZSA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1RSQURJVElPTkFMX0ZPUk1BVDoKLQkgIGZsYWdfdHJhZGl0aW9uYWxfZm9ybWF0ID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fVkVSU0lPTjoKLQkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0JICBwcmludGYgKF8oIkdOVSBhc3NlbWJsZXIgJXNcbiIpLCBWRVJTSU9OKTsKLQkgIHByaW50ZiAoXygiQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iKSk7Ci0JICBwcmludGYgKF8oIlwKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcblwKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIpKTsKLQkgIHByaW50ZiAoXygiVGhpcyBhc3NlbWJsZXIgd2FzIGNvbmZpZ3VyZWQgZm9yIGEgdGFyZ2V0IG9mIGAlcycuXG4iKSwKLQkJICBUQVJHRVRfQUxJQVMpOwotCSAgZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQotCWNhc2UgT1BUSU9OX0VNVUxBVElPTjoKLSNpZmRlZiBVU0VfRU1VTEFUSU9OUwotCSAgaWYgKHN0cmNtcCAob3B0YXJnLCB0aGlzX2VtdWxhdGlvbi0+bmFtZSkpCi0JICAgIGFzX2ZhdGFsIChfKCJtdWx0aXBsZSBlbXVsYXRpb24gbmFtZXMgc3BlY2lmaWVkIikpOwotI2Vsc2UKLQkgIGFzX2ZhdGFsIChfKCJlbXVsYXRpb25zIG5vdCBoYW5kbGVkIGluIHRoaXMgY29uZmlndXJhdGlvbiIpKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9EVU1QQ09ORklHOgotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJhbGlhcyA9ICVzXG4iKSwgVEFSR0VUX0FMSUFTKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiY2Fub25pY2FsID0gJXNcbiIpLCBUQVJHRVRfQ0FOT05JQ0FMKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiY3B1LXR5cGUgPSAlc1xuIiksIFRBUkdFVF9DUFUpOwotI2lmZGVmIFRBUkdFVF9PQkpfRk9STUFUCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oImZvcm1hdCA9ICVzXG4iKSwgVEFSR0VUX09CSl9GT1JNQVQpOwotI2VuZGlmCi0jaWZkZWYgVEFSR0VUX0ZPUk1BVAotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJiZmQtdGFyZ2V0ID0gJXNcbiIpLCBUQVJHRVRfRk9STUFUKTsKLSNlbmRpZgotCSAgZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQotCWNhc2UgT1BUSU9OX0RFRlNZTToKLQkgIHsKLQkgICAgY2hhciAqczsKLQkgICAgbG9uZyBpOwotCSAgICBzdHJ1Y3QgZGVmc3ltX2xpc3QgKm47Ci0KLQkgICAgZm9yIChzID0gb3B0YXJnOyAqcyAhPSAnXDAnICYmICpzICE9ICc9JzsgcysrKQotCSAgICAgIDsKLQkgICAgaWYgKCpzID09ICdcMCcpCi0JICAgICAgYXNfZmF0YWwgKF8oImJhZCBkZWZzeW07IGZvcm1hdCBpcyAtLWRlZnN5bSBuYW1lPXZhbHVlIikpOwotCSAgICAqcysrID0gJ1wwJzsKLQkgICAgaSA9IHN0cnRvbCAocywgKGNoYXIgKiopIE5VTEwsIDApOwotCSAgICBuID0gKHN0cnVjdCBkZWZzeW1fbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCSAgICBuLT5uZXh0ID0gZGVmc3ltczsKLQkgICAgbi0+bmFtZSA9IG9wdGFyZzsKLQkgICAgbi0+dmFsdWUgPSBpOwotCSAgICBkZWZzeW1zID0gbjsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fSU5TVFRCTDoKLQljYXNlICd0JzoKLQkgIHsKLQkgICAgLyogb3B0YXJnIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluc3RydWN0aW9uIAotCSAgICAgICBmb3JtYXRzLCBvcGNvZGVzLCByZWdpc3RlciBuYW1lcywgZXRjLiAqLwotCSAgICBzdHJ1Y3QgaXRibF9maWxlX2xpc3QgKm47Ci0KLQkgICAgaWYgKG9wdGFyZyA9PSBOVUxMKQotCSAgICAgIHsKLQkJYXNfd2FybiAoIF8oIk5vIGZpbGUgbmFtZSBmb2xsb3dpbmcgLXQgb3B0aW9uXG4iKSApOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIAotCSAgICBuID0gKHN0cnVjdCBpdGJsX2ZpbGVfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCSAgICBuLT5uZXh0ID0gaXRibF9maWxlczsKLQkgICAgbi0+bmFtZSA9IG9wdGFyZzsKLQkgICAgaXRibF9maWxlcyA9IG47Ci0KLQkgICAgLyogUGFyc2UgdGhlIGZpbGUgYW5kIGFkZCB0aGUgbmV3IGluc3RydWN0aW9ucyB0byBvdXIgaW50ZXJuYWwKLQkgICAgICAgdGFibGUuICBJZiBtdWx0aXBsZSBpbnN0cnVjdGlvbiB0YWJsZXMgYXJlIHNwZWNpZmllZCwgdGhlIAotCSAgICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgdGFibGUgZ2V0cyBhcHBlbmRlZCBvbnRvIHRoZSBleGlzdGluZyAKLQkgICAgICAgaW50ZXJuYWwgdGFibGUuICovCi0JICAgIGl0YmxfZmlsZXMtPm5hbWUgPSB4c3RyZHVwIChvcHRhcmcpOwotCSAgICBpZiAoaXRibF9wYXJzZSAoaXRibF9maWxlcy0+bmFtZSkgIT0gMCkKLQkgICAgICB7Ci0JCWZwcmludGYgKHN0ZGVyciwgXygiRmFpbGVkIHRvIHJlYWQgaW5zdHJ1Y3Rpb24gdGFibGUgJXNcbiIpLCAKLQkJCSBpdGJsX2ZpbGVzLT5uYW1lKTsKLQkJZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0RFUEZJTEU6Ci0JICBzdGFydF9kZXBlbmRlbmNpZXMgKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0dTVEFCUzoKLQkgIGRlYnVnX3R5cGUgPSBERUJVR19TVEFCUzsKLQkgIGJyZWFrOwotIAotCWNhc2UgT1BUSU9OX0dEV0FSRjI6Ci0JICBkZWJ1Z190eXBlID0gREVCVUdfRFdBUkYyOwotCSAgYnJlYWs7Ci0KLQljYXNlICdKJzoKLQkgIGZsYWdfc2lnbmVkX292ZXJmbG93X29rID0gMTsKLQkgIGJyZWFrOwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLQljYXNlICdLJzoKLQkgIGZsYWdfd2Fybl9kaXNwbGFjZW1lbnQgPSAxOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgJ0wnOgotCSAgZmxhZ19rZWVwX2xvY2FscyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0xJU1RJTkdfTEhTX1dJRFRIOgotCSAgbGlzdGluZ19saHNfd2lkdGggPSBhdG9pKG9wdGFyZyk7Ci0JICBpZiAobGlzdGluZ19saHNfd2lkdGhfc2Vjb25kIDwgbGlzdGluZ19saHNfd2lkdGgpCi0JICAgIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCA9IGxpc3RpbmdfbGhzX3dpZHRoOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEgyOgotCSAgewotCSAgICBpbnQgdG1wID0gYXRvaShvcHRhcmcpOwotCSAgICBpZiAodG1wID4gbGlzdGluZ19saHNfd2lkdGgpCi0JICAgICAgbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kID0gdG1wOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTElTVElOR19SSFNfV0lEVEg6Ci0JICBsaXN0aW5nX3Joc193aWR0aCA9IGF0b2kob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FUzoKLQkgIGxpc3RpbmdfbGhzX2NvbnRfbGluZXMgPSBhdG9pKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ00nOgotCSAgZmxhZ19tcmkgPSAxOwotI2lmZGVmIFRDX002OEsKLQkgIGZsYWdfbTY4a19tcmkgPSAxOwotI2VuZGlmCi0JICBicmVhazsKLQotCWNhc2UgJ1InOgotCSAgZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdXJzoKLQkgIGZsYWdfbm9fd2FybmluZ3MgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9XQVJOOgotCSAgZmxhZ19ub193YXJuaW5ncyA9IDA7Ci0JICBmbGFnX2ZhdGFsX3dhcm5pbmdzID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fV0FSTl9GQVRBTDoKLQkgIGZsYWdfbm9fd2FybmluZ3MgPSAwOwotCSAgZmxhZ19mYXRhbF93YXJuaW5ncyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ1onOgotCSAgZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0ID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYSc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKCpvcHRhcmcpCi0JCXsKLQkJICBzd2l0Y2ggKCpvcHRhcmcpCi0JCSAgICB7Ci0JCSAgICBjYXNlICdjJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX05PQ09ORDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdkJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX05PREVCVUc7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnaCc6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19ITEw7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbCc6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19MSVNUSU5HOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ20nOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfTUFDRVhQOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ24nOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfTk9GT1JNOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3MnOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfU1lNQk9MUzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICc9JzoKLQkJICAgICAgbGlzdGluZ19maWxlbmFtZSA9IHhzdHJkdXAgKG9wdGFyZyArIDEpOwotCQkgICAgICBvcHRhcmcgKz0gc3RybGVuIChsaXN0aW5nX2ZpbGVuYW1lKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBhc19mYXRhbCAoXygiaW52YWxpZCBsaXN0aW5nIG9wdGlvbiBgJWMnIiksICpvcHRhcmcpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBvcHRhcmcrKzsKLQkJfQotCSAgICB9Ci0JICBpZiAoIWxpc3RpbmcpCi0JICAgIGxpc3RpbmcgPSBMSVNUSU5HX0RFRkFVTFQ7Ci0JICBicmVhazsKLQotCWNhc2UgJ0QnOgotCSAgLyogREVCVUcgaXMgaW1wbGVtZW50ZWQ6IGl0IGRlYnVncyBkaWZmZXJlbnQgKi8KLQkgIC8qIHRoaW5ncyBmcm9tIG90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMuICovCi0JICBmbGFnX2RlYnVnID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnZic6Ci0JICBmbGFnX25vX2NvbW1lbnRzID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnSSc6Ci0JICB7CQkJLyogSW5jbHVkZSBmaWxlIGRpcmVjdG9yeSAqLwotCSAgICBjaGFyICp0ZW1wID0geHN0cmR1cCAob3B0YXJnKTsKLQkgICAgYWRkX2luY2x1ZGVfZGlyICh0ZW1wKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlICdvJzoKLQkgIG91dF9maWxlX25hbWUgPSB4c3RyZHVwIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICd3JzoKLQkgIGJyZWFrOwotCi0JY2FzZSAnWCc6Ci0JICAvKiAtWCBtZWFucyB0cmVhdCB3YXJuaW5ncyBhcyBlcnJvcnMgKi8KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAoc2hvcnRvcHRzKTsKLSAgZnJlZSAobG9uZ29wdHMpOwotCi0gICpwYXJnYyA9IG5ld19hcmdjOwotICAqcGFyZ3YgPSBuZXdfYXJndjsKLX0KLQotc3RhdGljIGxvbmcgc3RhcnRfdGltZTsKLQotaW50IAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgbWFjcm9fYWx0ZXJuYXRlOwotICBpbnQgbWFjcm9fc3RyaXBfYXQ7Ci0gIGludCBrZWVwX2l0OwotCi0gIHN0YXJ0X3RpbWUgPSBnZXRfcnVuX3RpbWUgKCk7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBpZiAoZGVidWdfbWVtb3J5KQotICAgIHsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBleHRlcm4gbG9uZyBfYmZkX2NodW5rc2l6ZTsKLSAgICAgIF9iZmRfY2h1bmtzaXplID0gNjQ7Ci0jZW5kaWYKLSAgICAgIGNodW5rc2l6ZSA9IDY0OwotICAgIH0KLQotI2lmZGVmIEhPU1RfU1BFQ0lBTF9JTklUCi0gIEhPU1RfU1BFQ0lBTF9JTklUIChhcmdjLCBhcmd2KTsKLSNlbmRpZgotCi0gIG15bmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAobXluYW1lKTsKLQotICBTVEFSVF9QUk9HUkVTUyAobXluYW1lLCAwKTsKLQotI2lmbmRlZiBPQkpfREVGQVVMVF9PVVRQVVRfRklMRV9OQU1FCi0jZGVmaW5lIE9CSl9ERUZBVUxUX09VVFBVVF9GSUxFX05BTUUgImEub3V0IgotI2VuZGlmCi0KLSAgb3V0X2ZpbGVfbmFtZSA9IE9CSl9ERUZBVUxUX09VVFBVVF9GSUxFX05BTUU7Ci0KLSAgaGV4X2luaXQgKCk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBiZmRfaW5pdCAoKTsKLSAgYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUgKG15bmFtZSk7Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9FTVVMQVRJT05TCi0gIHNlbGVjdF9lbXVsYXRpb25fbW9kZSAoYXJnYywgYXJndik7Ci0jZW5kaWYKLQotICBQUk9HUkVTUyAoMSk7Ci0gIHN5bWJvbF9iZWdpbiAoKTsKLSAgZnJhZ19pbml0ICgpOwotICBzdWJzZWdzX2JlZ2luICgpOwotICBwYXJzZV9hcmdzICgmYXJnYywgJmFyZ3YpOyAKLSAgcmVhZF9iZWdpbiAoKTsKLSAgaW5wdXRfc2NydWJfYmVnaW4gKCk7Ci0gIGV4cHJfYmVnaW4gKCk7Ci0KLSAgaWYgKGZsYWdfcHJpbnRfc3RhdGlzdGljcykKLSAgICB4YXRleGl0IChkdW1wX3N0YXRpc3RpY3MpOwotCi0gIG1hY3JvX2FsdGVybmF0ZSA9IDA7Ci0gIG1hY3JvX3N0cmlwX2F0ID0gMDsKLSNpZmRlZiBUQ19JOTYwCi0gIG1hY3JvX3N0cmlwX2F0ID0gZmxhZ19tcmk7Ci0jZW5kaWYKLSNpZmRlZiBUQ19BMjlLCi0gIC8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEFNRCAyOUsgZmFtaWx5IG1hY3JvIGFzc2VtYmxlcgotICAgICBzcGVjaWZpY2F0aW9uLiAgKi8KLSAgbWFjcm9fYWx0ZXJuYXRlID0gMTsKLSAgbWFjcm9fc3RyaXBfYXQgPSAxOwotI2VuZGlmCi0KLSAgbWFjcm9faW5pdCAobWFjcm9fYWx0ZXJuYXRlLCBmbGFnX21yaSwgbWFjcm9fc3RyaXBfYXQsIG1hY3JvX2V4cHIpOwotCi0gIFBST0dSRVNTICgxKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgb3V0cHV0X2ZpbGVfY3JlYXRlIChvdXRfZmlsZV9uYW1lKTsKLSAgYXNzZXJ0IChzdGRvdXRwdXQgIT0gMCk7Ci0jZW5kaWYKLQotI2lmZGVmIHRjX2luaXRfYWZ0ZXJfYXJncwotICB0Y19pbml0X2FmdGVyX2FyZ3MgKCk7Ci0jZW5kaWYKLQotICBpdGJsX2luaXQgKCk7Ci0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSBmdWxseSBpbml0aWFsaXplZCwgYW5kIGhhdmUgY3JlYXRlZCB0aGUgb3V0cHV0Ci0gICAgIGZpbGUsIGRlZmluZSBhbnkgc3ltYm9scyByZXF1ZXN0ZWQgYnkgLS1kZWZzeW0gY29tbWFuZCBsaW5lCi0gICAgIGFyZ3VtZW50cy4gICovCi0gIHdoaWxlIChkZWZzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltOwotICAgICAgc3RydWN0IGRlZnN5bV9saXN0ICpuZXh0OwotCi0gICAgICBzeW0gPSBzeW1ib2xfbmV3IChkZWZzeW1zLT5uYW1lLCBhYnNvbHV0ZV9zZWN0aW9uLCBkZWZzeW1zLT52YWx1ZSwKLQkJCSZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW0pOwotICAgICAgbmV4dCA9IGRlZnN5bXMtPm5leHQ7Ci0gICAgICBmcmVlIChkZWZzeW1zKTsKLSAgICAgIGRlZnN5bXMgPSBuZXh0OwotICAgIH0KLQotICBQUk9HUkVTUyAoMSk7Ci0KLSAgcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzIChhcmdjLCBhcmd2KTsJLyogQXNzZW1ibGUgaXQuICovCi0KLSAgY29uZF9maW5pc2hfY2hlY2sgKC0xKTsKLQotI2lmZGVmIG1kX2VuZAotICBtZF9lbmQgKCk7Ci0jZW5kaWYKLQotICBpZiAoc2Vlbl9hdF9sZWFzdF8xX2ZpbGUgKCkKLSAgICAgICYmIChmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQgfHwgaGFkX2Vycm9ycyAoKSA9PSAwKSkKLSAgICBrZWVwX2l0ID0gMTsKLSAgZWxzZQotICAgIGtlZXBfaXQgPSAwOwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgIWRlZmluZWQgKEJGRCkKLSAgLyogVGhpcyB1c2VkIHRvIGJlIGRvbmUgYXQgdGhlIHN0YXJ0IG9mIHdyaXRlX29iamVjdF9maWxlIGluCi0gICAgIHdyaXRlLmMsIGJ1dCB0aGF0IGNhdXNlZCBwcm9ibGVtcyB3aGVuIGRvaW5nIGxpc3RpbmdzIHdoZW4KLSAgICAga2VlcF9pdCB3YXMgemVyby4gIFRoaXMgY291bGQgcHJvYmFibHkgYmUgbW92ZWQgYWJvdmUgbWRfZW5kLCBidXQKLSAgICAgSSBkaWRuJ3Qgd2FudCB0byByaXNrIHRoZSBjaGFuZ2UuICAqLwotICBzdWJzZWdzX2ZpbmlzaCAoKTsKLSNlbmRpZgotCi0gIGlmIChrZWVwX2l0KQotICAgIHdyaXRlX29iamVjdF9maWxlICgpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgbGlzdGluZ19wcmludCAobGlzdGluZ19maWxlbmFtZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBPQkpfVk1TIC8qIGRvZXMgaXRzIG93biBmaWxlIGhhbmRsaW5nICovCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKGtlZXBfaXQpCi0jZW5kaWYKLSAgICBvdXRwdXRfZmlsZV9jbG9zZSAob3V0X2ZpbGVfbmFtZSk7Ci0jZW5kaWYKLQotICBpZiAoZmxhZ19mYXRhbF93YXJuaW5ncyAmJiBoYWRfd2FybmluZ3MoKSA+IDAgJiYgaGFkX2Vycm9ycyAoKSA9PSAwKQotICAgIGFzX2JhZCAoXygiJWQgd2FybmluZ3MsIHRyZWF0aW5nIHdhcm5pbmdzIGFzIGVycm9ycyIpLCBoYWRfd2FybmluZ3MoKSk7Ci0KLSAgaWYgKGhhZF9lcnJvcnMgKCkgPiAwICYmICEgZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0KQotICAgIGtlZXBfaXQgPSAwOwotCi0gIGlmICgha2VlcF9pdCkKLSAgICB1bmxpbmsgKG91dF9maWxlX25hbWUpOwotCi0gIGlucHV0X3NjcnViX2VuZCAoKTsKLQotICBFTkRfUFJPR1JFU1MgKG15bmFtZSk7Ci0KLSAgLyogVXNlIHhleGl0IGluc3RlYWQgb2YgcmV0dXJuLCBiZWNhdXNlIHVuZGVyIFZNUyBlbnZpcm9ubWVudHMgdGhleQotICAgICBtYXkgbm90IHBsYWNlIHRoZSBzYW1lIGludGVycHJldGF0aW9uIG9uIHRoZSB2YWx1ZSBnaXZlbi4gICovCi0gIGlmIChoYWRfZXJyb3JzICgpID4gMCkKLSAgICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQotICAvKiBPbmx5IGdlbmVyYXRlIGRlcGVuZGVuY3kgZmlsZSBpZiBhc3NlbWJsZXIgd2FzIHN1Y2Nlc3NmdWwuICAqLwotICBwcmludF9kZXBlbmRlbmNpZXMgKCk7Ci0KLSAgeGV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3N0YXRpc3RpY3MgKCkKLXsKLSNpZmRlZiBIQVZFX1NCUksKLSAgY2hhciAqbGltID0gKGNoYXIgKikgc2JyayAoMCk7Ci0jZW5kaWYKLSAgbG9uZyBydW5fdGltZSA9IGdldF9ydW5fdGltZSAoKSAtIHN0YXJ0X3RpbWU7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdG90YWwgdGltZSBpbiBhc3NlbWJseTogJWxkLiUwNmxkXG4iKSwKLQkgICBteW5hbWUsIHJ1bl90aW1lIC8gMTAwMDAwMCwgcnVuX3RpbWUgJSAxMDAwMDAwKTsKLSNpZmRlZiBIQVZFX1NCUksKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZGF0YSBzaXplICVsZFxuIiksCi0JICAgbXluYW1lLCAobG9uZykgKGxpbSAtIChjaGFyICopICZlbnZpcm9uKSk7Ci0jZW5kaWYKLQotICBzdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0gIHdyaXRlX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0gIHN5bWJvbF9wcmludF9zdGF0aXN0aWNzIChzdGRlcnIpOwotICByZWFkX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0KLSNpZmRlZiB0Y19wcmludF9zdGF0aXN0aWNzCi0gIHRjX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfcHJpbnRfc3RhdGlzdGljcwotICBvYmpfcHJpbnRfc3RhdGlzdGljcyAoc3RkZXJyKTsKLSNlbmRpZgotfQotDAotCi0vKgkJCXBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcygpCi0gKgotICogSGVyZSB0byBhdHRlbXB0IDEgcGFzcyBvdmVyIGVhY2ggaW5wdXQgZmlsZS4KLSAqIFdlIHNjYW4gYXJndlsqXSBsb29raW5nIGZvciBmaWxlbmFtZXMgb3IgZXhhY3RseSAiIiB3aGljaCBpcwotICogc2hvcnRoYW5kIGZvciBzdGRpbi4gQW55IGFyZ3YgdGhhdCBpcyBOVUxMIGlzIG5vdCBhIGZpbGUtbmFtZS4KLSAqIFdlIHNldCBuZWVkX3Bhc3NfMiBUUlVFIGlmLCBhZnRlciB0aGlzLCB3ZSBzdGlsbCBoYXZlIHVucmVzb2x2ZWQKLSAqIGV4cHJlc3Npb25zIG9mIHRoZSBmb3JtICh1bmtub3duIHZhbHVlKSstKHVua25vd24gdmFsdWUpLgotICoKLSAqIE5vdGUgdGhlIHVuKnggc2VtYW50aWNzOiB0aGVyZSBpcyBvbmx5IDEgbG9naWNhbCBpbnB1dCBmaWxlLCBidXQgaXQKLSAqIG1heSBiZSBhIGNhdGVuYXRpb24gb2YgbWFueSAncGh5c2ljYWwnIGlucHV0IGZpbGVzLgotICovCi1zdGF0aWMgdm9pZCAKLXBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgc2F3X2FfZmlsZSA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmbGFnd29yZCBhcHBsaWNhYmxlOwotI2VuZGlmCi0KLSAgbmVlZF9wYXNzXzIgPSAwOwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgICAgc2VnbWVudF9pbmZvW2ldLmZpeF9yb290ID0gMDsKLSAgfQotICAvKiBDcmVhdGUgdGhlIHRocmVlIGZpeGVkIG9uZXMgKi8KLSAgewotICAgIHNlZ1Qgc2VnOwotCi0jaWZkZWYgVEVfQVBPTExPCi0gICAgc2VnID0gc3Vic2VnX25ldyAoIi53dGV4dCIsIDApOwotI2Vsc2UKLSAgICBzZWcgPSBzdWJzZWdfbmV3ICgiLnRleHQiLCAwKTsKLSNlbmRpZgotICAgIGFzc2VydCAoc2VnID09IFNFR19FMCk7Ci0gICAgc2VnID0gc3Vic2VnX25ldyAoIi5kYXRhIiwgMCk7Ci0gICAgYXNzZXJ0IChzZWcgPT0gU0VHX0UxKTsKLSAgICBzZWcgPSBzdWJzZWdfbmV3ICgiLmJzcyIsIDApOwotICAgIGFzc2VydCAoc2VnID09IFNFR19FMik7Ci0jaWZkZWYgVEVfQVBPTExPCi0gICAgY3JlYXRlX3RhcmdldF9zZWdtZW50cyAoKTsKLSNlbmRpZgotICB9Ci0KLSNlbHNlIC8qIG5vdCBNQU5ZX1NFR01FTlRTICovCi0gIHRleHRfZml4X3Jvb3QgPSBOVUxMOwotICBkYXRhX2ZpeF9yb290ID0gTlVMTDsKLSAgYnNzX2ZpeF9yb290ID0gTlVMTDsKLSNlbmRpZiAvKiBub3QgTUFOWV9TRUdNRU5UUyAqLwotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotICAvKiBDcmVhdGUgdGhlIHN0YW5kYXJkIHNlY3Rpb25zLCBhbmQgdGhvc2UgdGhlIGFzc2VtYmxlciB1c2VzCi0gICAgIGludGVybmFsbHkuICAqLwotICB0ZXh0X3NlY3Rpb24gPSBzdWJzZWdfbmV3IChURVhUX1NFQ1RJT05fTkFNRSwgMCk7Ci0gIGRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKERBVEFfU0VDVElPTl9OQU1FLCAwKTsKLSAgYnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3IChCU1NfU0VDVElPTl9OQU1FLCAwKTsKLSAgLyogQEAgRklYTUUgLS0gd2UncmUgc2V0dGluZyB0aGUgUkVMT0MgZmxhZyBzbyB0aGF0IHNlY3Rpb25zIGFyZSBhc3N1bWVkCi0gICAgIHRvIGhhdmUgcmVsb2NzLCBvdGhlcndpc2Ugd2UgZG9uJ3QgZmluZCBvdXQgaW4gdGltZS4gKi8KLSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24sCi0JCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJCSAgICAgICB8IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZKSk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBkYXRhX3NlY3Rpb24sCi0JCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJCSAgICAgICB8IFNFQ19EQVRBKSk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBic3Nfc2VjdGlvbiwgYXBwbGljYWJsZSAmIFNFQ19BTExPQyk7Ci0gIHNlZ19pbmZvIChic3Nfc2VjdGlvbiktPmJzcyA9IDE7Ci0gIHN1YnNlZ19uZXcgKEJGRF9BQlNfU0VDVElPTl9OQU1FLCAwKTsKLSAgc3Vic2VnX25ldyAoQkZEX1VORF9TRUNUSU9OX05BTUUsIDApOwotICByZWdfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIqR0FTIGByZWcnIHNlY3Rpb24qIiwgMCk7Ci0gIGV4cHJfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIqR0FTIGBleHByJyBzZWN0aW9uKiIsIDApOwotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0gIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7Ci0KLSAgLyogVGhpcyBtYXkgYWRkIHN5bWJvbCB0YWJsZSBlbnRyaWVzLCB3aGljaCByZXF1aXJlcyBoYXZpbmcgYW4gb3BlbiBCRkQsCi0gICAgIGFuZCBzZWN0aW9ucyBhbHJlYWR5IGNyZWF0ZWQsIGluIEJGRF9BU1NFTUJMRVIgbW9kZS4gICovCi0gIG1kX2JlZ2luICgpOwotCi0jaWZkZWYgb2JqX2JlZ2luCi0gIG9ial9iZWdpbiAoKTsKLSNlbmRpZgotCi0gIGFyZ3YrKzsJCQkvKiBza2lwIGFyZ3ZbMF0gKi8KLSAgYXJnYy0tOwkJCS8qIHNraXAgYXJndlswXSAqLwotICB3aGlsZSAoYXJnYy0tKQotICAgIHsKLSAgICAgIGlmICgqYXJndikKLQl7CQkJLyogSXMgaXQgYSBmaWxlLW5hbWUgYXJndW1lbnQ/ICovCi0JICBQUk9HUkVTUyAoMSk7Ci0JICBzYXdfYV9maWxlKys7Ci0JICAvKiBhcmd2LT4iIiBpZiBzdGRpbiBkZXNpcmVkLCBlbHNlLT5maWxlbmFtZSAqLwotCSAgcmVhZF9hX3NvdXJjZV9maWxlICgqYXJndik7Ci0JfQotICAgICAgYXJndisrOwkJCS8qIGNvbXBsZXRlZCB0aGF0IGFyZ3YgKi8KLSAgICB9Ci0gIGlmICghc2F3X2FfZmlsZSkKLSAgICByZWFkX2Ffc291cmNlX2ZpbGUgKCIiKTsKLX0JCQkJLyogcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKCkgKi8KLQotLyogVGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBtYWNybyBjb2RlIGFuZCBnYXMgZXhwcmVzc2lvbiBoYW5kbGluZy4gICovCi0KLXN0YXRpYyBpbnQKLW1hY3JvX2V4cHIgKGVtc2csIGlkeCwgaW4sIHZhbCkKLSAgICAgY29uc3QgY2hhciAqZW1zZzsKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgKnZhbDsKLXsKLSAgY2hhciAqaG9sZDsKLSAgZXhwcmVzc2lvblMgZXg7Ci0KLSAgc2JfdGVybWluYXRlIChpbik7Ci0KLSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaW4tPnB0ciArIGlkeDsKLSAgZXhwcmVzc2lvbiAoJmV4KTsKLSAgaWR4ID0gaW5wdXRfbGluZV9wb2ludGVyIC0gaW4tPnB0cjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotICBpZiAoZXguWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIGFzX2JhZCAoIiVzIiwgZW1zZyk7Ci0KLSAgKnZhbCA9IChpbnQpIGV4LlhfYWRkX251bWJlcjsKLQotICByZXR1cm4gaWR4OwotfQotCi0vKiBlbmQgb2YgYXMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2FzLmggYi9nYXMvYXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlZjM3Ni4uMDAwMDAwMAotLS0gYS9nYXMvYXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0OCArMCwwIEBACi0vKiBhcy5oIC0gZ2xvYmFsIGhlYWRlciBmaWxlCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEdBUwotI2RlZmluZSBHQVMgMQotLyoKLSAqIEkgdGhpbmsgdGhpcyBzdHVmZiBpcyBsYXJnZWx5IG91dCBvZiBkYXRlLiAgeG94b3JpY2guCi0gKgotICogQ0FQSVRBTElTRUQgbmFtZXMgYXJlICNkZWZpbmVkLgotICogImxvd2VyY2FzZUgiIGlzICNkZWZpbmVkIGlmICJsb3dlcmNhc2UuaCIgaGFzIGJlZW4gI2luY2x1ZGUtZC4KLSAqICJsb3dlcmNhc2VUIiBpcyBhIHR5cGVkZWYgb2YgImxvd2VyY2FzZSIgb2JqZWN0cy4KLSAqICJsb3dlcmNhc2VQIiBpcyB0eXBlICJwb2ludGVyIHRvIG9iamVjdCBvZiB0eXBlICdsb3dlcmNhc2UnIi4KLSAqICJsb3dlcmNhc2VTIiBpcyB0eXBlZGVmIHN0cnVjdCAuLi4gbG93ZXJjYXNlUy4KLSAqCi0gKiAjZGVmaW5lIERFQlVHIHRvIGVuYWJsZSBhbGwgdGhlICJrbm93IiBhc3NlcnRpb24gdGVzdHMuCi0gKiAjZGVmaW5lIFNVU1BFQ1Qgd2hlbiBkZWJ1Z2dpbmcgaGFzaCBjb2RlLgotICogI2RlZmluZSBDT01NT04gYXMgImV4dGVybiIgZm9yIGFsbCBtb2R1bGVzIGV4Y2VwdCBvbmUsIHdoZXJlIHlvdSAjZGVmaW5lCi0gKglDT01NT04gYXMgIiIuCi0gKiBJZiBURVNUIGlzICNkZWZpbmVkLCB0aGVuIHdlIGFyZSB0ZXN0aW5nIGEgbW9kdWxlOiAjZGVmaW5lIENPTU1PTiBhcyAiIi4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLS8qIFRoaXMgaXMgdGhlIGNvZGUgcmVjb21tZW5kZWQgaW4gdGhlIGF1dG9jb25mIGRvY3VtZW50YXRpb24sIGFsbW9zdAotICAgdmVyYmF0aW0uICBJZiBpdCBkb2Vzbid0IHdvcmsgZm9yIHlvdSwgbGV0IG1lIGtub3csIGFuZCBub3RpZnkKLSAgIGRqbUBnbnUuYWkubWl0LmVkdSBhcyB3ZWxsLiAgKi8KLS8qIEFkZGVkICN1bmRlZiBmb3IgREogRGVsb3JpZS4gIFRoZSByaWdodCBmaXggaXMgdG8gZW5zdXJlIHRoYXQgYXMuaAotICAgaXMgaW5jbHVkZWQgZmlyc3QsIGJlZm9yZSBldmVuIGFueSBzeXN0ZW0gaGVhZGVyIGZpbGVzLCBpbiBhbGwgZmlsZXMKLSAgIHRoYXQgdXNlIGl0LiAgS1IgMTk5NC4xMS4wMyAqLwotLyogQWRkZWQgdm9pZCogdmVyc2lvbiBmb3IgU1REQyBjYXNlLiAgVGhpcyBpcyB0byBiZSBjb21wYXRpYmxlIHdpdGgKLSAgIHRoZSBkZWNsYXJhdGlvbiBpbiBiaXNvbi5zaW1wbGUsIHVzZWQgZm9yIG02OGsgb3BlcmFuZCBwYXJzaW5nLgotICAgLS1LUiAxOTk1LjA4LjA4ICovCi0vKiBGb3JjZSB2b2lkKiBkZWNsIGZvciBocHV4LiAgVGhpcyBpcyB3aGF0IEJpc29uIHVzZXMuICAtLUtSIDE5OTUuMDguMTYgKi8KLQotLyogQUlYIHJlcXVpcmVzIHRoaXMgdG8gYmUgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBmaWxlLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotIyBpZm5kZWYgYWxsb2NhCi0jICBpZmRlZiBfX1NURENfXwotZXh0ZXJuIHZvaWQgKmFsbG9jYSAoKTsKLSMgIGVsc2UKLWV4dGVybiBjaGFyICphbGxvY2EgKCk7Ci0jICBlbmRpZgotIyBlbmRpZgotI2Vsc2UKLSMgaWYgSEFWRV9BTExPQ0FfSAotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi0jICAgIGlmICFkZWZpbmVkIChfX1NURENfXykgJiYgIWRlZmluZWQgKF9faHB1eCkKLWV4dGVybiBjaGFyICphbGxvY2EgKCk7Ci0jICAgIGVsc2UKLWV4dGVybiB2b2lkICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmIC8qIF9fU1REQ19fLCBfX2hwdXggKi8KLSMgICBlbmRpZiAvKiBhbGxvY2EgKi8KLSMgIGVuZGlmIC8qIF9BSVggKi8KLSMgZW5kaWYgLyogSEFWRV9BTExPQ0FfSCAqLwotI2VuZGlmCi0KLS8qIE5vdywgdGVuZCB0byB0aGUgcmVzdCBvZiB0aGUgY29uZmlndXJhdGlvbi4gICovCi0KLS8qIFN5c3RlbSBpbmNsdWRlIGZpbGVzIGZpcnN0Li4uICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLS8qIGZvciBzaXplX3QsIHBpZF90ICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdldG9wdC5oPgotLyogVGhlIGZpcnN0IGdldG9wdCB2YWx1ZSBmb3IgbWFjaGluZS1pbmRlcGVuZGVudCBsb25nIG9wdGlvbnMuCi0gICAxNTAgaXNuJ3Qgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCi0jZGVmaW5lIE9QVElPTl9TVERfQkFTRSAxNTAKLS8qIFRoZSBmaXJzdCBnZXRvcHQgdmFsdWUgZm9yIG1hY2hpbmUtZGVwZW5kZW50IGxvbmcgb3B0aW9ucy4KLSAgIDE3MCBnaXZlcyB0aGUgc3RhbmRhcmQgb3B0aW9ucyByb29tIHRvIGdyb3cuICAqLwotI2RlZmluZSBPUFRJT05fTURfQkFTRSAxNzAKLQotI2lmZGVmIERFQlVHCi0jdW5kZWYgTkRFQlVHCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCAoX19HTlVDX18pIHx8IF9fR05VQ19NSU5PUl9fIDw9IDUKLSNkZWZpbmUgX19QUkVUVFlfRlVOQ1RJT05fXyAgKChjaGFyKikwKQotI2VuZGlmCi0jaWYgMAotCi0vKiBIYW5kbGUgbG9zc2FnZSB3aXRoIGFzc2VydC5oLiAgKi8KLSNpZm5kZWYgQlJPS0VOX0FTU0VSVAotI2luY2x1ZGUgPGFzc2VydC5oPgotI2Vsc2UgLyogQlJPS0VOX0FTU0VSVCAqLwotI2lmbmRlZiBOREVCVUcKLSNkZWZpbmUgYXNzZXJ0KHApICgocCkgPyAwIDogKGFzX2Fzc2VydCAoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fKSwgMCkpCi0jZWxzZQotI2RlZmluZSBhc3NlcnQocCkgKChwKSwgMCkKLSNlbmRpZgotI2VuZGlmIC8qIEJST0tFTl9BU1NFUlQgKi8KLQotI2Vsc2UKLQotI2RlZmluZSBhc3NlcnQoUCkgKChQKSA/IDAgOiAoYXNfYXNzZXJ0IChfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18pLCAwKSkKLSN1bmRlZiBhYm9ydAotI2RlZmluZSBhYm9ydCgpCQlhc19hYm9ydCAoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fKQotCi0jZW5kaWYKLQotCi0vKiBOb3cgR05VIGhlYWRlciBmaWxlcy4uLiAqLwotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2luY2x1ZGUgPGJmZC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bGliaWJlcnR5Lmg+Ci0KLS8qIERlZmluZSB0aGUgc3RhbmRhcmQgcHJvZ3Jlc3MgbWFjcm9zLiAgKi8KLSNpbmNsdWRlIDxwcm9ncmVzcy5oPgotCi0vKiBUaGlzIGRvZXNuJ3QgZ2V0IHRha2VuIGNhcmUgb2YgYW55d2hlcmUuICAqLwotI2lmbmRlZiBfX01XRVJLU19fICAvKiBNZXRyb3dlcmtzIEMgY2hva2VzIG9uIHRoZSAiZGVmaW5lZCAoaW5saW5lKSIgKi8KLSNpZiAhZGVmaW5lZCAoX19HTlVDX18pICYmICFkZWZpbmVkIChpbmxpbmUpCi0jZGVmaW5lIGlubGluZQotI2VuZGlmCi0jZW5kaWYgLyogIV9fTVdFUktTX18gKi8KLQotLyogT3RoZXIgc3R1ZmYgZnJvbSBjb25maWcuaC4gICovCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLWV4dGVybiBjaGFyICpzdHJzdHIgKCk7Ci0jZW5kaWYKLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQwotZXh0ZXJuIFBUUiBtYWxsb2MgKCk7Ci1leHRlcm4gUFRSIHJlYWxsb2MgKCk7Ci0jZW5kaWYKLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKLWV4dGVybiB2b2lkIGZyZWUgKCk7Ci0jZW5kaWYKLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VSUk5PCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OCi1leHRlcm4gY2hhciAqKmVudmlyb247Ci0jZW5kaWYKLQotLyogVGhpcyBpcyBuZWVkZWQgZm9yIFZNUy4gICovCi0jaWYgISBkZWZpbmVkIChIQVZFX1VOTElOSykgJiYgZGVmaW5lZCAoSEFWRV9SRU1PVkUpCi0jZGVmaW5lIHVubGluayByZW1vdmUKLSNlbmRpZgotCi0vKiBIYWNrIHRvIG1ha2UgImdjYyAtV2FsbCIgbm90IGNvbXBsYWluIGFib3V0IG9ic3RhY2sgbWFjcm9zLiAgKi8KLSNpZiAhZGVmaW5lZCAobWVtY3B5KSAmJiAhZGVmaW5lZCAoYmNvcHkpCi0jZGVmaW5lIGJjb3B5KHNyYyxkZXN0LHNpemUpCW1lbWNweShkZXN0LHNyYyxzaXplKQotI2VuZGlmCi0KLS8qIE1ha2UgU2FiZXIgaGFwcGllciBvbiBvYnN0YWNrLmguICAqLwotI2lmZGVmIFNBQkVSCi0jdW5kZWYgIF9fUFRSX1RPX0lOVAotI2RlZmluZSBfX1BUUl9UT19JTlQoUCkgKChpbnQpKFApKQotI3VuZGVmICBfX0lOVF9UT19QVFIKLSNkZWZpbmUgX19JTlRfVE9fUFRSKFApICgoY2hhciAqKShQKSkKLSNlbmRpZgotCi0jaWZuZGVmIF9fTElORV9fCi0jZGVmaW5lIF9fTElORV9fICJ1bmtub3duIgotI2VuZGlmIC8qIF9fTElORV9fICovCi0KLSNpZm5kZWYgX19GSUxFX18KLSNkZWZpbmUgX19GSUxFX18gInVua25vd24iCi0jZW5kaWYgLyogX19GSUxFX18gKi8KLQotI2lmbmRlZiBGT1BFTl9XQgotI2lmZGVmIEdPMzIKLSNpbmNsdWRlICJmb3Blbi1iaW4uaCIKLSNlbHNlCi0jaW5jbHVkZSAiZm9wZW4tc2FtZS5oIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBFWElUX1NVQ0NFU1MKLSNkZWZpbmUgRVhJVF9TVUNDRVNTIDAKLSNkZWZpbmUgRVhJVF9GQUlMVVJFIDEKLSNlbmRpZgotCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfYWxsb2MgeG1hbGxvYwotI2RlZmluZSBvYnN0YWNrX2NodW5rX2ZyZWUgeGZyZWUKLQotI2RlZmluZSB4ZnJlZSBmcmVlCi0KLSNpbmNsdWRlICJhc2ludGwuaCIKLQotI2RlZmluZSBCQURfQ0FTRSh2YWwpIFwKLXsgXAotICAgICAgYXNfZmF0YWwoXygiQ2FzZSB2YWx1ZSAlbGQgdW5leHBlY3RlZCBhdCBsaW5lICVkIG9mIGZpbGUgXCIlc1wiXG4iKSwgXAotCSAgICAgICAobG9uZykgdmFsLCBfX0xJTkVfXywgX19GSUxFX18pOyBcCi0JICAgfQotDAotI2luY2x1ZGUgImZsb251bS5oIgotCi0vKiBUaGVzZSBhcmUgYXNzZW1ibGVyLXdpZGUgY29uY2VwdHMgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWV4dGVybiBiZmQgKnN0ZG91dHB1dDsKLXR5cGVkZWYgYmZkX3ZtYSBhZGRyZXNzVDsKLXR5cGVkZWYgYmZkX3NpZ25lZF92bWEgb2Zmc2V0VDsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgYWRkcmVzc1Q7Ci10eXBlZGVmIGxvbmcgb2Zmc2V0VDsKLSNlbmRpZgotCi0vKiBUeXBlIG9mIHN5bWJvbCB2YWx1ZSwgZXRjLiAgRm9yIHVzZSBpbiBwcm90b3R5cGVzLiAgKi8KLXR5cGVkZWYgYWRkcmVzc1QgdmFsdWVUOwotCi0jaWZuZGVmIENPTU1PTgotI2lmZGVmIFRFU1QKLSNkZWZpbmUgQ09NTU9OCQkJLyogZGVjbGFyZSBvdXIgQ09NTU9OcyBzdG9yYWdlIGhlcmUuICovCi0jZWxzZQotI2RlZmluZSBDT01NT04gZXh0ZXJuCQkvKiBvdXIgY29tbW9ucyBsaXZlIGVsc3doZXJlICovCi0jZW5kaWYKLSNlbmRpZgotLyogQ09NTU9OIG5vdyBkZWZpbmVkICovCi0KLSNpZmRlZiBERUJVRwotI2lmbmRlZiBrbm93Ci0jZGVmaW5lIGtub3cocCkgYXNzZXJ0KHApCS8qIFZlcmlmeSBvdXIgYXNzdW1wdGlvbnMhICovCi0jZW5kaWYgLyogbm90IHlldCBkZWZpbmVkICovCi0jZWxzZQotI2RlZmluZSBrbm93KHApCQkJLyoga25vdygpIGNoZWNrcyBhcmUgbm8tb3AuZWQgKi8KLSNlbmRpZgotDAotLyogaW5wdXRfc2NydWIuYyAqLwotCi0vKgotICogU3VwcGxpZXMgc2FuaXRpc2VkIGJ1ZmZlcnMgdG8gcmVhZC5jLgotICogQWxzbyB1bmRlcnN0YW5kcyBwcmludGluZyBsaW5lLW51bWJlciBwYXJ0IG9mIGVycm9yIG1lc3NhZ2VzLgotICovCi0MCi0KLS8qIHN1YnNlZ3MuYyAgICAgU3ViLXNlZ21lbnRzLiBBbHNvLCBzZWdtZW50KD1leHByZXNzaW9uIHR5cGUpcy4qLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotI2lmZGVmIE1BTllfU0VHTUVOVFMKLSNpbmNsdWRlICJiZmQuaCIKLSNkZWZpbmUgTl9TRUdNRU5UUyA0MAotI2RlZmluZSBTRUdfTk9STUFMKHgpICgoeCkgPj0gU0VHX0UwICYmICh4KSA8PSBTRUdfRTM5KQotI2RlZmluZSBTRUdfTElTVCBTRUdfRTAsU0VHX0UxLFNFR19FMixTRUdfRTMsU0VHX0U0LFNFR19FNSxTRUdfRTYsU0VHX0U3LFNFR19FOCxTRUdfRTksXAotCQkgU0VHX0UxMCxTRUdfRTExLFNFR19FMTIsU0VHX0UxMyxTRUdfRTE0LFNFR19FMTUsU0VHX0UxNixTRUdfRTE3LFNFR19FMTgsU0VHX0UxOSxcCi0JCSBTRUdfRTIwLFNFR19FMjEsU0VHX0UyMixTRUdfRTIzLFNFR19FMjQsU0VHX0UyNSxTRUdfRTI2LFNFR19FMjcsU0VHX0UyOCxTRUdfRTI5LFwKLQkJIFNFR19FMzAsU0VHX0UzMSxTRUdfRTMyLFNFR19FMzMsU0VHX0UzNCxTRUdfRTM1LFNFR19FMzYsU0VHX0UzNyxTRUdfRTM4LFNFR19FMzkKLSNkZWZpbmUgU0VHX1RFWFQgU0VHX0UwCi0jZGVmaW5lIFNFR19EQVRBIFNFR19FMQotI2RlZmluZSBTRUdfQlNTIFNFR19FMgotI2RlZmluZSBTRUdfTEFTVCBTRUdfRTM5Ci0jZWxzZQotI2RlZmluZSBOX1NFR01FTlRTIDMKLSNkZWZpbmUgU0VHX05PUk1BTCh4KSAoKHgpID09IFNFR19URVhUIHx8ICh4KSA9PSBTRUdfREFUQSB8fCAoeCkgPT0gU0VHX0JTUykKLSNkZWZpbmUgU0VHX0xJU1QgU0VHX1RFWFQsU0VHX0RBVEEsU0VHX0JTUwotI2VuZGlmCi0KLXR5cGVkZWYgZW51bSBfc2VnVAotICB7Ci0gICAgU0VHX0FCU09MVVRFID0gMCwKLSAgICBTRUdfTElTVCwKLSAgICBTRUdfVU5LTk9XTiwKLSAgICBTRUdfR09PRiwJCQkvKiBPbmx5IGhhcHBlbnMgaWYgQVMgaGFzIGEgbG9naWMgZXJyb3IuICovCi0gICAgLyogSW52ZW50ZWQgc28gd2UgZG9uJ3QgY3Jhc2ggcHJpbnRpbmcgKi8KLSAgICAvKiBlcnJvciBtZXNzYWdlIGludm9sdmluZyB3ZWlyZCBzZWdtZW50LiAqLwotICAgIFNFR19FWFBSLAkJCS8qIEludGVybWVkaWF0ZSBleHByZXNzaW9uIHZhbHVlcy4gKi8KLSAgICBTRUdfREVCVUcsCQkJLyogRGVidWcgc2VnbWVudCAqLwotICAgIFNFR19OVFYsCQkJLyogVHJhbnNmZXJ0IHZlY3RvciBwcmVsb2FkIHNlZ21lbnQgKi8KLSAgICBTRUdfUFRWLAkJCS8qIFRyYW5zZmVydCB2ZWN0b3IgcG9zdGxvYWQgc2VnbWVudCAqLwotICAgIFNFR19SRUdJU1RFUgkJLyogTXl0aGljYWw6IGEgcmVnaXN0ZXItdmFsdWVkIGV4cHJlc3Npb24gKi8KLSAgfSBzZWdUOwotCi0jZGVmaW5lIFNFR19NQVhJTVVNX09SRElOQUwgKFNFR19SRUdJU1RFUikKLSNlbHNlCi10eXBlZGVmIGFzZWN0aW9uICpzZWdUOwotI2RlZmluZSBTRUdfTk9STUFMKFNFRykJCSgoU0VHKSAhPSBhYnNvbHV0ZV9zZWN0aW9uCVwKLQkJCQkgJiYgKFNFRykgIT0gdW5kZWZpbmVkX3NlY3Rpb24JXAotCQkJCSAmJiAoU0VHKSAhPSByZWdfc2VjdGlvbglcCi0JCQkJICYmIChTRUcpICE9IGV4cHJfc2VjdGlvbikKLSNlbmRpZgotdHlwZWRlZiBpbnQgc3Vic2VnVDsKLQotLyogV2hhdCBzdWJzZWcgd2UgYXJlIGFjY3JldGluZyBub3c/ICovCi1DT01NT04gc3Vic2VnVCBub3dfc3Vic2VnOwotCi0vKiBTZWdtZW50IG91ciBpbnN0cnVjdGlvbnMgZW1pdCB0by4gKi8KLUNPTU1PTiBzZWdUIG5vd19zZWc7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIHNlZ21lbnRfbmFtZShTRUcpCWJmZF9nZXRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsIFNFRykKLSNlbHNlCi1leHRlcm4gY2hhciBjb25zdCAqY29uc3Qgc2VnX25hbWVbXTsKLSNkZWZpbmUgc2VnbWVudF9uYW1lKFNFRykJc2VnX25hbWVbKGludCkgKFNFRyldCi0jZW5kaWYKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gaW50IHNlY3Rpb25fYWxpZ25tZW50W107Ci0jZW5kaWYKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWV4dGVybiBzZWdUIHJlZ19zZWN0aW9uLCBleHByX3NlY3Rpb247Ci0vKiBTaG91bGRuJ3QgdGhlc2UgYmUgZWxpbWluYXRlZCBzb21lZGF5PyAgKi8KLWV4dGVybiBzZWdUIHRleHRfc2VjdGlvbiwgZGF0YV9zZWN0aW9uLCBic3Nfc2VjdGlvbjsKLSNkZWZpbmUgYWJzb2x1dGVfc2VjdGlvbgliZmRfYWJzX3NlY3Rpb25fcHRyCi0jZGVmaW5lIHVuZGVmaW5lZF9zZWN0aW9uCWJmZF91bmRfc2VjdGlvbl9wdHIKLSNlbHNlCi0jZGVmaW5lIHJlZ19zZWN0aW9uCQlTRUdfUkVHSVNURVIKLSNkZWZpbmUgZXhwcl9zZWN0aW9uCQlTRUdfRVhQUgotI2RlZmluZSB0ZXh0X3NlY3Rpb24JCVNFR19URVhUCi0jZGVmaW5lIGRhdGFfc2VjdGlvbgkJU0VHX0RBVEEKLSNkZWZpbmUgYnNzX3NlY3Rpb24JCVNFR19CU1MKLSNkZWZpbmUgYWJzb2x1dGVfc2VjdGlvbglTRUdfQUJTT0xVVEUKLSNkZWZpbmUgdW5kZWZpbmVkX3NlY3Rpb24JU0VHX1VOS05PV04KLSNlbmRpZgotCi0vKiByZWxheCgpICovCi0KLWVudW0gX3JlbGF4X3N0YXRlCi0gIHsKLSAgICAvKiBWYXJpYWJsZSBjaGFycyB0byBiZSByZXBlYXRlZCBmcl9vZmZzZXQgdGltZXMuCi0gICAgICAgRnJfc3ltYm9sIHVudXNlZC4gVXNlZCB3aXRoIGZyX29mZnNldCA9PSAwIGZvciBhCi0gICAgICAgY29uc3RhbnQgbGVuZ3RoIGZyYWcuICovCi0gICAgcnNfZmlsbCA9IDEsCi0KLSAgICAvKiBBbGlnbi4gIFRoZSBmcl9vZmZzZXQgZmllbGQgaG9sZHMgdGhlIHBvd2VyIG9mIDIgdG8gd2hpY2ggdG8KLSAgICAgICBhbGlnbi4gIFRoZSBmcl92YXIgZmllbGQgaG9sZHMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZQotICAgICAgIGZpbGwgcGF0dGVybi4gIFRoZSBmcl9zdWJ0eXBlIGZpZWxkIGhvbGRzIHRoZSBtYXhpbXVtIG51bWJlciBvZgotICAgICAgIGJ5dGVzIHRvIHNraXAgd2hlbiBhbGlnbmluZywgb3IgMCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLiAgKi8KLSAgICByc19hbGlnbiwKLQotICAgIC8qIEFsaWduIGNvZGUuICBUaGUgZnJfb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBwb3dlciBvZiAyIHRvIHdoaWNoCi0gICAgICAgdG8gYWxpZ24uICBUaGlzIHR5cGUgaXMgb25seSBnZW5lcmF0ZWQgYnkgbWFjaGluZSBzcGVjaWZpYwotICAgICAgIGNvZGUsIHdoaWNoIGlzIG5vcm1hbGx5IHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyB0aGUgZmlsbAotICAgICAgIHBhdHRlcm4uICBUaGUgZnJfc3VidHlwZSBmaWVsZCBob2xkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKLSAgICAgICBieXRlcyB0byBza2lwIHdoZW4gYWxpZ25pbmcsIG9yIDAgaWYgdGhlcmUgaXMgbm8gbWF4aW11bS4gICovCi0gICAgcnNfYWxpZ25fY29kZSwKLQotICAgIC8qIE9yZzogRnJfb2Zmc2V0LCBmcl9zeW1ib2w6IGFkZHJlc3MuIDEgdmFyaWFibGUgY2hhcjogZmlsbAotICAgICAgIGNoYXJhY3Rlci4gKi8KLSAgICByc19vcmcsCi0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotICAgIC8qIEpGOiBndW5wb2ludCAqLwotICAgIHJzX2Jyb2tlbl93b3JkLAotI2VuZGlmCi0KLSAgICAvKiBtYWNoaW5lLXNwZWNpZmljIHJlbGF4YWJsZSAob3Igc2ltaWxhcmx5IGFsdGVyYWJsZSkgaW5zdHJ1Y3Rpb24gKi8KLSAgICByc19tYWNoaW5lX2RlcGVuZGVudCwKLQotICAgIC8qIC5zcGFjZSBkaXJlY3RpdmUgd2l0aCBleHByZXNzaW9uIG9wZXJhbmQgdGhhdCBuZWVkcyB0byBiZSBjb21wdXRlZAotICAgICAgIGxhdGVyLiAgU2ltaWxhciB0byByc19vcmcsIGJ1dCBkaWZmZXJlbnQuCi0gICAgICAgZnJfc3ltYm9sOiBvcGVyYW5kCi0gICAgICAgMSB2YXJpYWJsZSBjaGFyOiBmaWxsIGNoYXJhY3RlciAgKi8KLSAgICByc19zcGFjZSwKLQotICAgIC8qIEEgRFdBUkYgbGViMTI4IHZhbHVlOyBvbmx5IEVMRiB1c2VzIHRoaXMuICBUaGUgc3VidHlwZSBpcyAwIGZvcgotICAgICAgIHVuc2lnbmVkLCAxIGZvciBzaWduZWQuICAqLwotICAgIHJzX2xlYjEyOCwKLQotICAgIC8qIEV4Y2VwdGlvbiBmcmFtZSBpbmZvcm1hdGlvbiB3aGljaCB3ZSBtYXkgYmUgYWJsZSB0byBvcHRpbWl6ZS4gICovCi0gICAgcnNfY2ZhCi0gIH07Ci0KLXR5cGVkZWYgZW51bSBfcmVsYXhfc3RhdGUgcmVsYXhfc3RhdGVUOwotCi0vKiBUaGlzIHR5cGUgaXMgdXNlZCBpbiBwcm90b3R5cGVzLCBzbyBpdCBjYW4ndCBiZSBhIHR5cGUgdGhhdCB3aWxsIGJlCi0gICB3aWRlbmVkIGZvciBhcmd1bWVudCBwYXNzaW5nLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IHJlbGF4X3N1YnN0YXRlVDsKLQotLyogRW5vdWdoIGJpdHMgZm9yIGFkZHJlc3MsIGJ1dCBzdGlsbCBhbiBpbnRlZ2VyIHR5cGUuCi0gICBDb3VsZCBiZSBhIHByb2JsZW0sIGNyb3NzLWFzc2VtYmxpbmcgZm9yIDY0LWJpdCBtYWNoaW5lcy4gICovCi10eXBlZGVmIGFkZHJlc3NUIHJlbGF4X2FkZHJlc3NUOwotDAotLyogbWFpbiBwcm9ncmFtICJhcy5jIiAoY29tbWFuZCBhcmd1bWVudHMgZXRjKSAqLwotCi1DT01NT04gdW5zaWduZWQgY2hhciBmbGFnX25vX2NvbW1lbnRzOyAvKiAtZiAqLwotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ19kZWJ1ZzsgLyogLUQgKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfc2lnbmVkX292ZXJmbG93X29rOyAvKiAtSiAqLwotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi1DT01NT04gdW5zaWduZWQgY2hhciBmbGFnX3dhcm5fZGlzcGxhY2VtZW50OyAvKiAtSyAqLwotI2VuZGlmCi0KLS8qIFRydWUgaWYgbG9jYWwgc3ltYm9scyBzaG91bGQgYmUgcmV0YWluZWQuICAqLwotQ09NTU9OIGludCBmbGFnX2tlZXBfbG9jYWxzOyAvKiAtTCAqLwotCi0vKiBUcnVlIGlmIHdlIGFyZSBhc3NlbWJsaW5nIGluIE1SSSBtb2RlLiAgKi8KLUNPTU1PTiBpbnQgZmxhZ19tcmk7Ci0KLS8qIFRydWUgaWYgd2UgYXJlIGFzc2VtYmxpbmcgaW4gbTY4ayBNUkkgbW9kZS4gICovCi1DT01NT04gaW50IGZsYWdfbTY4a19tcmk7Ci0KLS8qIFNob3VsZCB0aGUgZGF0YSBzZWN0aW9uIGJlIG1hZGUgcmVhZC1vbmx5IGFuZCBhcHBlbmRlZCB0byB0aGUgdGV4dAotICAgc2VjdGlvbj8gICovCi1DT01NT04gdW5zaWduZWQgY2hhciBmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dDsgLyogLVIgKi8KLQotLyogVHJ1ZSBpZiB3YXJuaW5ncyBzaG91bGQgYmUgaW5oaWJpdGVkLiAgKi8KLUNPTU1PTiBpbnQgZmxhZ19ub193YXJuaW5nczsgLyogLVcgKi8KLQotLyogVHJ1ZSBpZiB3YXJuaW5ncyBjb3VudCBhcyBlcnJvcnMuICAqLwotQ09NTU9OIGludCBmbGFnX2ZhdGFsX3dhcm5pbmdzOyAvKiAtLWZhdGFsLXdhcm5pbmdzICovCi0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGF0dGVtcHQgdG8gZ2VuZXJhdGUgb3V0cHV0IGV2ZW4gaWYgbm9uLWZhdGFsIGVycm9ycwotICAgYXJlIGRldGVjdGVkLiAgKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dDsgLyogLVogKi8KLQotLyogVGhpcyBpcyB0cnVlIGlmIHRoZSBhc3NlbWJsZXIgc2hvdWxkIG91dHB1dCB0aW1lIGFuZCBzcGFjZSB1c2FnZS4gKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfcHJpbnRfc3RhdGlzdGljczsKLQotLyogVHJ1ZSBpZiBsb2NhbCBhYnNvbHV0ZSBzeW1ib2xzIGFyZSB0byBiZSBzdHJpcHBlZC4gICovCi1DT01NT04gaW50IGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGU7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGEgdHJhZGl0aW9uYWwgZm9ybWF0IG9iamVjdCBmaWxlLiAgKi8KLUNPTU1PTiBpbnQgZmxhZ190cmFkaXRpb25hbF9mb3JtYXQ7Ci0KLS8qIG5hbWUgb2YgZW1pdHRlZCBvYmplY3QgZmlsZSAqLwotQ09NTU9OIGNoYXIgKm91dF9maWxlX25hbWU7Ci0KLS8qIG5hbWUgb2YgZmlsZSBkZWZpbmluZyBleHRlbnNpb25zIHRvIHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBzZXQgKi8KLUNPTU1PTiBjaGFyICppbnN0dGJsX2ZpbGVfbmFtZTsKLQotLyogVFJVRSBpZiB3ZSBuZWVkIGEgc2Vjb25kIHBhc3MuICovCi1DT01NT04gaW50IG5lZWRfcGFzc18yOwotCi0vKiBUUlVFIGlmIHdlIHNob3VsZCBkbyBubyByZWxheGluZywgYW5kCi0gICBsZWF2ZSBsb3RzIG9mIHBhZGRpbmcuICAqLwotQ09NTU9OIGludCBsaW5rcmVsYXg7Ci0KLS8qIFRSVUUgaWYgd2Ugc2hvdWxkIHByb2R1Y2UgYSBsaXN0aW5nLiAgKi8KLWV4dGVybiBpbnQgbGlzdGluZzsKLQotLyogVHlwZSBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2Ugc2hvdWxkIGdlbmVyYXRlLiAgV2UgY3VycmVudGx5Ci0gICBzdXBwb3J0IHN0YWJzLCBFQ09GRiwgYW5kIERXQVJGMi4gICovCi0KLWVudW0gZGVidWdfaW5mb190eXBlCi0gIHsKLSAgICBERUJVR19VTlNQRUNJRklFRCwKLSAgICBERUJVR19OT05FLAotICAgIERFQlVHX1NUQUJTLAotICAgIERFQlVHX0VDT0ZGLAotICAgIERFQlVHX0RXQVJGLAotICAgIERFQlVHX0RXQVJGMgotICB9OwotCi1leHRlcm4gZW51bSBkZWJ1Z19pbmZvX3R5cGUgZGVidWdfdHlwZTsKLQwKLS8qIE1heGltdW0gbGV2ZWwgb2YgbWFjcm8gbmVzdGluZy4gICovCi1leHRlcm4gaW50IG1heF9tYWNyb19uZXN0OwotCi0vKiBPYnN0YWNrIGNodW5rIHNpemUuICBLZWVwIGxhcmdlIGZvciBlZmZpY2llbnQgc3BhY2UgdXNlLCBtYWtlIHNtYWxsIHRvCi0gICBpbmNyZWFzZSBtYWxsb2MgY2FsbHMgZm9yIG1vbml0b3JpbmcgbWVtb3J5IGFsbG9jYXRpb24uICAqLwotZXh0ZXJuIGludCBjaHVua3NpemU7Ci0KLXN0cnVjdCBfcHNldWRvX3R5cGUKLSAgewotICAgIC8qIGFzc2VtYmxlciBtbmVtb25pYywgbG93ZXIgY2FzZSwgbm8gJy4nICovCi0gICAgY29uc3QgY2hhciAqcG9jX25hbWU7Ci0gICAgLyogRG8gdGhlIHdvcmsgKi8KLSAgICB2b2lkICgqcG9jX2hhbmRsZXIpIFBBUkFNUyAoKGludCkpOwotICAgIC8qIFZhbHVlIHRvIHBhc3MgdG8gaGFuZGxlciAqLwotICAgIGludCBwb2NfdmFsOwotICB9OwotCi10eXBlZGVmIHN0cnVjdCBfcHNldWRvX3R5cGUgcHNldWRvX3R5cGVTOwotCi0vKiBQcmVmZXIgdmFyYXJncyBmb3Igbm9uLUFOU0kgY29tcGlsZXIsIHNpbmNlIHNvbWUgd2lsbCBiYXJmIGlmIHRoZQotICAgZWxsaXBzaXMgZGVmaW5pdGlvbiBpcyB1c2VkIHdpdGggYSBuby1hcmd1bWVudHMgZGVjbGFyYXRpb24uICAqLwotI2lmIGRlZmluZWQgKEhBVkVfVkFSQVJHU19IKSAmJiAhZGVmaW5lZCAoX19TVERDX18pCi0jdW5kZWYgSEFWRV9TVERBUkdfSAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX1NUREFSR19IKQotI2RlZmluZSBVU0VfU1REQVJHCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCAoVVNFX1NUREFSRykgJiYgZGVmaW5lZCAoSEFWRV9WQVJBUkdTX0gpCi0jZGVmaW5lIFVTRV9WQVJBUkdTCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9TVERBUkcKLSNpZiAoX19HTlVDX18gPj0gMikgJiYgIWRlZmluZWQoVk1TKQotLyogZm9yIHVzZSB3aXRoIC1XZm9ybWF0ICovCi0KLSNpZiBfX0dOVUNfTUlOT1JfXyA8IDYKLS8qIFN1cHBvcnQgZm9yIGRvdWJsZSB1bmRlcnNjb3JlcyBpbiBhdHRyaWJ1dGUgbmFtZXMgd2FzIGFkZGVkIGluIGdjYwotICAgMi42LCBzbyBhdm9pZCB0aGVtIGlmIHdlIGFyZSB1c2luZyBhbiBlYXJsaWVyIHZlcnNpb24uICAqLwotI2RlZmluZSBfX3ByaW50Zl9fIHByaW50ZgotI2RlZmluZSBfX2Zvcm1hdF9fIGZvcm1hdAotI2VuZGlmCi0KLSNkZWZpbmUgUFJJTlRGX0xJS0UoRkNOKSBcCi0gIHZvaWQgRkNOIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgXAotICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAxLCAyKSkpCi0jZGVmaW5lIFBSSU5URl9XSEVSRV9MSUtFKEZDTikgXAotICB2b2lkIEZDTiAoY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBcCi0gICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSkKLQotI2Vsc2UgLyogX19HTlVDX18gPCAyIHx8IGRlZmluZWQoVk1TKSAqLwotCi0jZGVmaW5lIFBSSU5URl9MSUtFKEZDTikJdm9pZCBGQ04gUEFSQU1TICgoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pKQotI2RlZmluZSBQUklOVEZfV0hFUkVfTElLRShGQ04pCXZvaWQgRkNOIFBBUkFNUyAoKGNoYXIgKmZpbGUsIFwKLQkJCQkJCSAgdW5zaWduZWQgaW50IGxpbmUsIFwKLQkJCQkJICAJICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpCi0KLSNlbmRpZiAvKiBfX0dOVUNfXyA8IDIgfHwgZGVmaW5lZChWTVMpICovCi0KLSNlbHNlIC8qICEgVVNFX1NUREFSRyAqLwotCi0jZGVmaW5lIFBSSU5URl9MSUtFKEZDTikJdm9pZCBGQ04gKCkKLSNkZWZpbmUgUFJJTlRGX1dIRVJFX0xJS0UoRkNOKQl2b2lkIEZDTiAoKQotCi0jZW5kaWYgLyogISBVU0VfU1REQVJHICovCi0KLVBSSU5URl9MSUtFIChhc19iYWQpOwotUFJJTlRGX0xJS0UgKGFzX2ZhdGFsKTsKLVBSSU5URl9MSUtFIChhc190c2t0c2spOwotUFJJTlRGX0xJS0UgKGFzX3dhcm4pOwotUFJJTlRGX1dIRVJFX0xJS0UgKGFzX2JhZF93aGVyZSk7Ci1QUklOVEZfV0hFUkVfTElLRSAoYXNfd2Fybl93aGVyZSk7Ci0KLXZvaWQgYXNfYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopKTsKLXZvaWQgYXNfYWJvcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOwotCi12b2lkIGZwcmludF92YWx1ZSBQQVJBTVMgKChGSUxFICpmaWxlLCBhZGRyZXNzVCB2YWx1ZSkpOwotdm9pZCBzcHJpbnRfdmFsdWUgUEFSQU1TICgoY2hhciAqYnVmLCBhZGRyZXNzVCB2YWx1ZSkpOwotCi1pbnQgaGFkX2Vycm9ycyBQQVJBTVMgKCh2b2lkKSk7Ci1pbnQgaGFkX3dhcm5pbmdzIFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZCBwcmludF92ZXJzaW9uX2lkIFBBUkFNUyAoKHZvaWQpKTsKLWNoYXIgKmFwcF9wdXNoIFBBUkFNUyAoKHZvaWQpKTsKLWNoYXIgKmF0b2ZfaWVlZSBQQVJBTVMgKChjaGFyICpzdHIsIGludCB3aGF0X2tpbmQsIExJVFRMRU5VTV9UWVBFICogd29yZHMpKTsKLWNoYXIgKmlucHV0X3NjcnViX2luY2x1ZGVfZmlsZSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSwgY2hhciAqcG9zaXRpb24pKTsKLWNoYXIgKmlucHV0X3NjcnViX25ld19maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci1jaGFyICppbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciBQQVJBTVMgKChjaGFyICoqYnVmcCkpOwotaW50IGRvX3NjcnViX2NoYXJzIFBBUkFNUyAoKGludCAoKmdldCkgKGNoYXIgKiwgaW50KSwgY2hhciAqdG8sIGludCB0b2xlbikpOwotaW50IGdlbl90b193b3JkcyBQQVJBTVMgKChMSVRUTEVOVU1fVFlQRSAqIHdvcmRzLCBpbnQgcHJlY2lzaW9uLAotCQkJICBsb25nIGV4cG9uZW50X2JpdHMpKTsKLWludCBoYWRfZXJyIFBBUkFNUyAoKHZvaWQpKTsKLWludCBpZ25vcmVfaW5wdXQgUEFSQU1TICgodm9pZCkpOwotdm9pZCBjb25kX2ZpbmlzaF9jaGVjayBQQVJBTVMgKChpbnQpKTsKLXZvaWQgY29uZF9leGl0X21hY3JvIFBBUkFNUyAoKGludCkpOwotaW50IHNlZW5fYXRfbGVhc3RfMV9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgYXBwX3BvcCBQQVJBTVMgKChjaGFyICphcmcpKTsKLXZvaWQgYXNfaG93bXVjaCBQQVJBTVMgKChGSUxFICogc3RyZWFtKSk7Ci12b2lkIGFzX3BlcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICpncmlwZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLXZvaWQgYXNfd2hlcmUgUEFSQU1TICgoY2hhciAqKm5hbWVwLCB1bnNpZ25lZCBpbnQgKmxpbmVwKSk7Ci12b2lkIGJ1bXBfbGluZV9jb3VudGVycyBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGRvX3NjcnViX2JlZ2luIFBBUkFNUyAoKGludCkpOwotdm9pZCBpbnB1dF9zY3J1Yl9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGlucHV0X3NjcnViX2Nsb3NlIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfc2NydWJfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLWludCBuZXdfbG9naWNhbF9saW5lIFBBUkFNUyAoKGNoYXIgKmZuYW1lLCBpbnQgbGluZV9udW1iZXIpKTsKLXZvaWQgc3Vic2Vnc19iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIHN1YnNlZ19jaGFuZ2UgUEFSQU1TICgoc2VnVCBzZWcsIGludCBzdWJzZWcpKTsKLXNlZ1Qgc3Vic2VnX25ldyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBzdWJzZWdUIHN1YnNlZykpOwotc2VnVCBzdWJzZWdfZm9yY2VfbmV3IFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIHN1YnNlZ1Qgc3Vic2VnKSk7Ci12b2lkIHN1YnNlZ19zZXQgUEFSQU1TICgoc2VnVCBzZWcsIHN1YnNlZ1Qgc3Vic2VnKSk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc2VnVCBzdWJzZWdfZ2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0jZW5kaWYKLWludCBzdWJzZWdfdGV4dF9wIFBBUkFNUyAoKHNlZ1QpKTsKLQotdm9pZCBzdGFydF9kZXBlbmRlbmNpZXMgUEFSQU1TICgoY2hhciAqKSk7Ci12b2lkIHJlZ2lzdGVyX2RlcGVuZGVuY3kgUEFSQU1TICgoY2hhciAqKSk7Ci12b2lkIHByaW50X2RlcGVuZGVuY2llcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0cnVjdCBleHByZXNzaW9uUzsKLXN0cnVjdCBmaXg7Ci10eXBlZGVmIHN0cnVjdCBzeW1ib2wgc3ltYm9sUzsKLXN0cnVjdCByZWxheF90eXBlOwotdHlwZWRlZiBzdHJ1Y3QgZnJhZyBmcmFnUzsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLS8qIGxpdGVyYWwuYyAqLwotdmFsdWVUIGFkZF90b19saXRlcmFsX3Bvb2wgUEFSQU1TICgoc3ltYm9sUyAqLCB2YWx1ZVQsIHNlZ1QsIGludCkpOwotI2VuZGlmCi0KLWludCBjaGVja19laF9mcmFtZSBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvblMgKiwgdW5zaWduZWQgaW50ICopKTsKLWludCBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBQQVJBTVMgKChmcmFnUyAqKSk7Ci1pbnQgZWhfZnJhbWVfcmVsYXhfZnJhZyBQQVJBTVMgKChmcmFnUyAqKSk7Ci12b2lkIGVoX2ZyYW1lX2NvbnZlcnRfZnJhZyBQQVJBTVMgKChmcmFnUyAqKSk7Ci0KLSNpbmNsdWRlICJleHByLmgiCQkvKiBCZWZvcmUgdGFyZy0qLmggKi8KLQotLyogdGhpcyBvbmUgc3RhcnRzIHRoZSBjaGFpbiBvZiB0YXJnZXQgZGVwZW5kYW50IGhlYWRlcnMgKi8KLSNpbmNsdWRlICJ0YXJnLWVudi5oIgotCi0jaW5jbHVkZSAid3JpdGUuaCIKLSNpbmNsdWRlICJmcmFncy5oIgotI2luY2x1ZGUgImhhc2guaCIKLSNpbmNsdWRlICJyZWFkLmgiCi0jaW5jbHVkZSAic3ltYm9scy5oIgotCi0jaW5jbHVkZSAidGMuaCIKLSNpbmNsdWRlICJvYmouaCIKLQotI2lmZGVmIFVTRV9FTVVMQVRJT05TCi0jaW5jbHVkZSAiZW11bC5oIgotI2VuZGlmCi0jaW5jbHVkZSAibGlzdGluZy5oIgotCi0jaWZuZGVmIExPQ0FMX0xBQkVMU19ET0xMQVIKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAwCi0jZW5kaWYKLQotI2lmbmRlZiBMT0NBTF9MQUJFTFNfRkIKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDAKLSNlbmRpZgotCi0jaWZuZGVmIFRFWFRfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFRFWFRfU0VDVElPTl9OQU1FCSIudGV4dCIKLSNkZWZpbmUgREFUQV9TRUNUSU9OX05BTUUJIi5kYXRhIgotI2RlZmluZSBCU1NfU0VDVElPTl9OQU1FCSIuYnNzIgotI2VuZGlmCi0KLSNlbmRpZiAvKiBHQVMgKi8KLQotLyogZW5kIG9mIGFzLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9hc2ludGwuaCBiL2dhcy9hc2ludGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczM2M4NS4uMDAwMDAwMAotLS0gYS9nYXMvYXNpbnRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiBhc2ludGwuaCAtIGdhcy1zcGVjaWZpYyBoZWFkZXIgZm9yIGdldHRleHQgY29kZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBUb20gVHJvbWV5IDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZkZWYgSEFWRV9MT0NBTEVfSAotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX05MUwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+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/Pz8gVGhpcyBpc24ndCBjdXJyZW50bHkgdXNlZCwgYnV0IGl0IGNvdWxkIGJlIGluIHRoZSBmdXR1cmUuICAqLwotZXh0ZXJuIHZvaWQgY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLS8qIEFmdGVyIENHRU5fU1lNIChhc3NlbWJsZV9pbnNuKSBpcyBkb25lLCB0aGlzIGlzIGNhbGxlZCB0bwotICAgb3V0cHV0IHRoZSBpbnNuIGFuZCByZWNvcmQgYW55IGZpeHVwcy4gICovCi1leHRlcm4gdm9pZCBnYXNfY2dlbl9maW5pc2hfaW5zbiBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKiwKLQkJCQkJICBDR0VOX0lOU05fQllURVNfUFRSLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgaW50LCBmaW5pc2hlZF9pbnNuUyAqKSk7Ci0KLS8qIFJlY29yZCBhIGZpeHVwLiAgKi8KLWV4dGVybiBmaXhTICogZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwIFBBUkFNUyAoKGZyYWdTICosIGludCwgY29uc3QgQ0dFTl9JTlNOICosCi0JCQkJCSAgICAgaW50LCBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCQkgICAgIHN5bWJvbFMgKiwgb2Zmc2V0VCkpOwotZXh0ZXJuIGZpeFMgKiBnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwIFBBUkFNUyAoKGZyYWdTICosIGludCwgY29uc3QgQ0dFTl9JTlNOICosCi0JCQkJCQkgaW50LCBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCQkJIGV4cHJlc3Npb25TICopKTsKLQotLyogbWRfYXBwbHlfZml4MyBoYW5kbGVyICovCi1leHRlcm4gaW50IGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMgUEFSQU1TICgoZml4UyAqLCB2YWx1ZVQgKiwgc2VnVCkpOwotCi0vKiB0Y19nZW5fcmVsb2MgaGFuZGxlciAqLwotZXh0ZXJuIGFyZWxlbnQgKmdhc19jZ2VuX3RjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKLQotLyogVGFyZ2V0IHN1cHBsaWVkIHJvdXRpbmUgdG8gbG9va3VwIGEgcmVsb2MuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotbWRfY2dlbl9sb29rdXBfcmVsb2MgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICosIGNvbnN0IENHRU5fT1BFUkFORCAqLAotCQkJICAgICAgZml4UyAqKSk7Ci0KLS8qIE9wdGlvbmFsIHRhcmdldCBzdXBwbGllZCByb3V0aW5lIHRvIHJlY29yZCBhIGZpeHVwIGZvciBhbiBleHByZXNzaW9uLiAgKi8KLWV4dGVybiBmaXhTICoKLW1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCBQQVJBTVMgKChmcmFnUyAqLCBpbnQsIGNvbnN0IENHRU5fSU5TTiAqLCBpbnQsCi0JCQkJICBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCSAgZXhwcmVzc2lvblMgKikpOwotCi0jZW5kaWYgLyogR0FTX0NHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmQuYyBiL2dhcy9jb25kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0M2M5ZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi0vKiBjb25kLmMgLSBjb25kaXRpb25hbCBhc3NlbWJseSBwc2V1ZG8tb3BzLCBhbmQgLmluY2x1ZGUKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJtYWNyby5oIgotCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiBUaGlzIGlzIGFsbG9jYXRlZCB0byBncm93IGFuZCBzaHJpbmsgYXMgLmlmZGVmLy5lbmRpZiBwYWlycyBhcmUgc2Nhbm5lZC4gKi8KLXN0cnVjdCBvYnN0YWNrIGNvbmRfb2JzdGFjazsKLQotc3RydWN0IGZpbGVfbGluZQotewotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLX07Ci0KLS8qIFdlIHB1c2ggb25lIG9mIHRoZXNlIHN0cnVjdHVyZXMgZm9yIGVhY2ggLmlmLCBhbmQgcG9wIGl0IGF0IHRoZQotICAgLmVuZGlmLiAgKi8KLQotc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lCi17Ci0gIC8qIFRoZSBzb3VyY2UgZmlsZSAmIGxpbmUgbnVtYmVyIG9mIHRoZSAiaWYiLiAgKi8KLSAgc3RydWN0IGZpbGVfbGluZSBpZl9maWxlX2xpbmU7Ci0gIC8qIFRoZSBzb3VyY2UgZmlsZSAmIGxpbmUgb2YgdGhlICJlbHNlIi4gICovCi0gIHN0cnVjdCBmaWxlX2xpbmUgZWxzZV9maWxlX2xpbmU7Ci0gIC8qIFRoZSBwcmV2aW91cyBjb25kaXRpb25hbC4gICovCi0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqcHJldmlvdXNfY2ZyYW1lOwotICAvKiBIYXZlIHdlIHNlZW4gYW4gZWxzZSB5ZXQ/ICAqLwotICBpbnQgZWxzZV9zZWVuOwotICAvKiBXaGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgaWdub3JpbmcgaW5wdXQuICAqLwotICBpbnQgaWdub3Jpbmc7Ci0gIC8qIFdoZXRoZXIgYSBjb25kaXRpb25hbCBhdCBhIGhpZ2hlciBsZXZlbCBpcyBpZ25vcmluZyBpbnB1dC4gICovCi0gIGludCBkZWFkX3RyZWU7Ci0gIC8qIE1hY3JvIG5lc3RpbmcgbGV2ZWwgYXQgd2hpY2ggdGhpcyBjb25kaXRpb25hbCB3YXMgY3JlYXRlZC4gICovCi0gIGludCBtYWNyb19uZXN0OwotfTsKLQotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9jZnJhbWUgUEFSQU1TICgoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpjZnJhbWUpKTsKLXN0YXRpYyBjaGFyICpnZXRfbXJpX3N0cmluZyBQQVJBTVMgKChpbnQsIGludCAqKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKmN1cnJlbnRfY2ZyYW1lID0gTlVMTDsKLQotdm9pZCAKLXNfaWZkZWYgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsJCS8qIHBvaW50cyB0byBuYW1lIG9mIHN5bWJvbCAqLwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwkvKiBQb2ludHMgdG8gc3ltYm9sICovCi0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSBjZnJhbWU7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwkJLyogTGVhZGluZyB3aGl0ZXNwYWNlIGlzIHBhcnQgb2Ygb3BlcmFuZC4gKi8KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoIWlzX25hbWVfYmVnaW5uZXIgKCpuYW1lKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgaWRlbnRpZmllciBmb3IgXCIuaWZkZWZcIiIpKTsKLSAgICAgIG9ic3RhY2tfMWdyb3cgKCZjb25kX29ic3RhY2ssIDApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICAgICAgaW5pdGlhbGl6ZV9jZnJhbWUgKCZjZnJhbWUpOwotICAgICAgY2ZyYW1lLmlnbm9yaW5nID0gY2ZyYW1lLmRlYWRfdHJlZSB8fCAhKChzeW1ib2xQICE9IDApIF4gYXJnKTsKLSAgICAgIGN1cnJlbnRfY2ZyYW1lID0gKChzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKikKLQkJCW9ic3RhY2tfY29weSAoJmNvbmRfb2JzdGFjaywgJmNmcmFtZSwKLQkJCQkgICAgICBzaXplb2YgKGNmcmFtZSkpKTsKLQotICAgICAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpCi0JICAmJiBjZnJhbWUuaWdub3JpbmcKLQkgICYmIChjZnJhbWUucHJldmlvdXNfY2ZyYW1lID09IE5VTEwKLQkgICAgICB8fCAhIGNmcmFtZS5wcmV2aW91c19jZnJhbWUtPmlnbm9yaW5nKSkKLQlsaXN0aW5nX2xpc3QgKDIpOwotCi0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0JCQkJLyogaWYgYSB2YWxpZCBpZGVudGlmeWVyIG5hbWUgKi8KLX0JCQkJLyogc19pZmRlZigpICovCi0KLXZvaWQgCi1zX2lmIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIGV4cHJlc3Npb25TIG9wZXJhbmQ7Ci0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSBjZnJhbWU7Ci0gIGludCB0OwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsJCS8qIExlYWRpbmcgd2hpdGVzcGFjZSBpcyBwYXJ0IG9mIG9wZXJhbmQuICovCi0KLSAgaWYgKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwgJiYgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nKQotICAgIHsKLSAgICAgIG9wZXJhbmQuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uICgmb3BlcmFuZCk7Ci0gICAgICBpZiAob3BlcmFuZC5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJub24tY29uc3RhbnQgZXhwcmVzc2lvbiBpbiBcIi5pZlwiIHN0YXRlbWVudCIpKTsKLSAgICB9Ci0KLSAgc3dpdGNoICgob3BlcmF0b3JUKSBhcmcpCi0gICAgewotICAgIGNhc2UgT19lcTogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyID09IDA7IGJyZWFrOwotICAgIGNhc2UgT19uZTogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyICE9IDA7IGJyZWFrOwotICAgIGNhc2UgT19sdDogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyIDwgMDsgYnJlYWs7Ci0gICAgY2FzZSBPX2xlOiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPD0gMDsgYnJlYWs7Ci0gICAgY2FzZSBPX2dlOiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPj0gMDsgYnJlYWs7Ci0gICAgY2FzZSBPX2d0OiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPiAwOyBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIElmIHRoZSBhYm92ZSBlcnJvciBpcyBzaWduYWxlZCwgdGhpcyB3aWxsIGRpc3BhdGNoCi0gICAgIHVzaW5nIGFuIHVuZGVmaW5lZCByZXN1bHQuICBObyBiaWcgZGVhbC4gICovCi0gIGluaXRpYWxpemVfY2ZyYW1lICgmY2ZyYW1lKTsKLSAgY2ZyYW1lLmlnbm9yaW5nID0gY2ZyYW1lLmRlYWRfdHJlZSB8fCAhIHQ7Ci0gIGN1cnJlbnRfY2ZyYW1lID0gKChzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKikKLQkJICAgIG9ic3RhY2tfY29weSAoJmNvbmRfb2JzdGFjaywgJmNmcmFtZSwgc2l6ZW9mIChjZnJhbWUpKSk7Ci0KLSAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpCi0gICAgICAmJiBjZnJhbWUuaWdub3JpbmcKLSAgICAgICYmIChjZnJhbWUucHJldmlvdXNfY2ZyYW1lID09IE5VTEwKLQkgIHx8ICEgY2ZyYW1lLnByZXZpb3VzX2NmcmFtZS0+aWdub3JpbmcpKQotICAgIGxpc3RpbmdfbGlzdCAoMik7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfaWYoKSAqLwotCi0vKiBHZXQgYSBzdHJpbmcgZm9yIHRoZSBNUkkgSUZDIG9yIElGTkMgcHNldWRvLW9wcy4gICovCi0KLXN0YXRpYyBjaGFyICoKLWdldF9tcmlfc3RyaW5nICh0ZXJtaW5hdG9yLCBsZW4pCi0gICAgIGludCB0ZXJtaW5hdG9yOwotICAgICBpbnQgKmxlbjsKLXsKLSAgY2hhciAqcmV0OwotICBjaGFyICpzOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgcyA9IHJldCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLSAgICB7Ci0gICAgICArK3M7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQl7Ci0JICAqcysrID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgaWYgKHNbLTFdID09ICdcJycpCi0JICAgIHsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCcnKQotCQlicmVhazsKLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgfQotCX0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSB0ZXJtaW5hdG9yCi0JICAgICAmJiAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB3aGlsZSAocyA+IHJldCAmJiAoc1stMV0gPT0gJyAnIHx8IHNbLTFdID09ICdcdCcpKQotCS0tczsKLSAgICB9Ci0KLSAgKmxlbiA9IHMgLSByZXQ7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoZSBNUkkgSUZDIGFuZCBJRk5DIHBzZXVkby1vcHMuICAqLwotCi12b2lkCi1zX2lmYyAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLSAgY2hhciAqczEsICpzMjsKLSAgaW50IGxlbjEsIGxlbjI7Ci0gIGludCByZXM7Ci0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSBjZnJhbWU7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBzMSA9IGdldF9tcmlfc3RyaW5nICgnLCcsICZsZW4xKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgYXNfYmFkIChfKCJiYWQgZm9ybWF0IGZvciBpZmMgb3IgaWZuYyIpKTsKLSAgZWxzZQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHMyID0gZ2V0X21yaV9zdHJpbmcgKCc7JywgJmxlbjIpOwotCi0gIHJlcyA9IGxlbjEgPT0gbGVuMiAmJiBzdHJuY21wIChzMSwgczIsIGxlbjEpID09IDA7Ci0KLSAgaW5pdGlhbGl6ZV9jZnJhbWUgKCZjZnJhbWUpOwotICBjZnJhbWUuaWdub3JpbmcgPSBjZnJhbWUuZGVhZF90cmVlIHx8ICEgKHJlcyBeIGFyZyk7Ci0gIGN1cnJlbnRfY2ZyYW1lID0gKChzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKikKLQkJICAgIG9ic3RhY2tfY29weSAoJmNvbmRfb2JzdGFjaywgJmNmcmFtZSwgc2l6ZW9mIChjZnJhbWUpKSk7Ci0KLSAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpCi0gICAgICAmJiBjZnJhbWUuaWdub3JpbmcKLSAgICAgICYmIChjZnJhbWUucHJldmlvdXNfY2ZyYW1lID09IE5VTEwKLQkgIHx8ICEgY2ZyYW1lLnByZXZpb3VzX2NmcmFtZS0+aWdub3JpbmcpKQotICAgIGxpc3RpbmdfbGlzdCAoMik7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQgCi1zX2VuZGlmIChhcmcpCi0gICAgIGludCBhcmcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpob2xkOwotCi0gIGlmIChjdXJyZW50X2NmcmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiXCIuZW5kaWZcIiB3aXRob3V0IFwiLmlmXCIiKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpCi0JICAmJiBjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcKLQkgICYmIChjdXJyZW50X2NmcmFtZS0+cHJldmlvdXNfY2ZyYW1lID09IE5VTEwKLQkgICAgICB8fCAhIGN1cnJlbnRfY2ZyYW1lLT5wcmV2aW91c19jZnJhbWUtPmlnbm9yaW5nKSkKLQlsaXN0aW5nX2xpc3QgKDEpOwotCi0gICAgICBob2xkID0gY3VycmVudF9jZnJhbWU7Ci0gICAgICBjdXJyZW50X2NmcmFtZSA9IGN1cnJlbnRfY2ZyYW1lLT5wcmV2aW91c19jZnJhbWU7Ci0gICAgICBvYnN0YWNrX2ZyZWUgKCZjb25kX29ic3RhY2ssIGhvbGQpOwotICAgIH0JCQkJLyogaWYgb25lIHBvcCB0b28gbWFueSAqLwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfZW5kaWYoKSAqLwotCi12b2lkIAotc19lbHNlIChhcmcpCi0gICAgIGludCBhcmcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGN1cnJlbnRfY2ZyYW1lID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCIuZWxzZSB3aXRob3V0IG1hdGNoaW5nIC5pZiAtIGlnbm9yZWQiKSk7Ci0KLSAgICB9Ci0gIGVsc2UgaWYgKGN1cnJlbnRfY2ZyYW1lLT5lbHNlX3NlZW4pCi0gICAgewotICAgICAgYXNfYmFkIChfKCJkdXBsaWNhdGUgXCJlbHNlXCIgLSBpZ25vcmVkIikpOwotICAgICAgYXNfYmFkX3doZXJlIChjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUuZmlsZSwKLQkJICAgIGN1cnJlbnRfY2ZyYW1lLT5lbHNlX2ZpbGVfbGluZS5saW5lLAotCQkgICAgXygiaGVyZSBpcyB0aGUgcHJldmlvdXMgXCJlbHNlXCIiKSk7Ci0gICAgICBhc19iYWRfd2hlcmUgKGN1cnJlbnRfY2ZyYW1lLT5pZl9maWxlX2xpbmUuZmlsZSwKLQkJICAgIGN1cnJlbnRfY2ZyYW1lLT5pZl9maWxlX2xpbmUubGluZSwKLQkJICAgIF8oImhlcmUgaXMgdGhlIHByZXZpb3VzIFwiaWZcIiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193aGVyZSAoJmN1cnJlbnRfY2ZyYW1lLT5lbHNlX2ZpbGVfbGluZS5maWxlLAotCQkmY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmxpbmUpOwotCi0gICAgICBpZiAoIWN1cnJlbnRfY2ZyYW1lLT5kZWFkX3RyZWUpCi0JewotCSAgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nID0gIWN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZzsKLQkgIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKSkKLQkgICAgewotCSAgICAgIGlmICghIGN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZykKLQkJbGlzdGluZ19saXN0ICgxKTsKLQkgICAgICBlbHNlCi0JCWxpc3RpbmdfbGlzdCAoMik7Ci0JICAgIH0KLQl9CQkJLyogaWYgbm90IGEgZGVhZCB0cmVlICovCi0KLSAgICAgIGN1cnJlbnRfY2ZyYW1lLT5lbHNlX3NlZW4gPSAxOwotICAgIH0JCQkJLyogaWYgZXJyb3IgZWxzZSBkbyBpdCAqLwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfZWxzZSgpICovCi0KLXZvaWQgCi1zX2lmZXFzIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIGNoYXIgKnMxLCAqczI7Ci0gIGludCBsZW4xLCBsZW4yOwotICBpbnQgcmVzOwotICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgY2ZyYW1lOwotCi0gIHMxID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4xKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5pZmVxcyBzeW50YXggZXJyb3IiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBzMiA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuMik7Ci0KLSAgcmVzID0gbGVuMSA9PSBsZW4yICYmIHN0cm5jbXAgKHMxLCBzMiwgbGVuMSkgPT0gMDsKLQotICBpbml0aWFsaXplX2NmcmFtZSAoJmNmcmFtZSk7Ci0gIGNmcmFtZS5pZ25vcmluZyA9IGNmcmFtZS5kZWFkX3RyZWUgfHwgISAocmVzIF4gYXJnKTsKLSAgY3VycmVudF9jZnJhbWUgPSAoKHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqKQotCQkgICAgb2JzdGFja19jb3B5ICgmY29uZF9vYnN0YWNrLCAmY2ZyYW1lLCBzaXplb2YgKGNmcmFtZSkpKTsKLQotICBpZiAoTElTVElOR19TS0lQX0NPTkQgKCkKLSAgICAgICYmIGNmcmFtZS5pZ25vcmluZwotICAgICAgJiYgKGNmcmFtZS5wcmV2aW91c19jZnJhbWUgPT0gTlVMTAotCSAgfHwgISBjZnJhbWUucHJldmlvdXNfY2ZyYW1lLT5pZ25vcmluZykpCi0gICAgbGlzdGluZ19saXN0ICgyKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX2lmZXFzKCkgKi8KLQotaW50IAotaWdub3JlX2lucHV0ICgpCi17Ci0gIGNoYXIgKnM7Ci0KLSAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoZmxhZ19tNjhrX21yaQotI2lmZGVmIE5PX1BTRVVET19ET1QKLSAgICAgIHx8IDEKLSNlbmRpZgotICAgICAgKQotICAgIHsKLSAgICAgIGlmIChzWy0xXSAhPSAnLicpCi0JLS1zOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzWy0xXSAhPSAnLicpCi0JcmV0dXJuIChjdXJyZW50X2NmcmFtZSAhPSBOVUxMKSAmJiAoY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nKTsKLSAgICB9Ci0KLSAgLyogV2UgY2Fubm90IGlnbm9yZSBjZXJ0YWluIHBzZXVkbyBvcHMuICAqLwotICBpZiAoKChzWzBdID09ICdpJwotCXx8IHNbMF0gPT0gJ0knKQotICAgICAgICYmICghc3RybmNhc2VjbXAgKHMsICJpZiIsIDIpCi0JICAgfHwgIXN0cm5jYXNlY21wIChzLCAiaWZkZWYiLCA1KQotCSAgIHx8ICFzdHJuY2FzZWNtcCAocywgImlmbmRlZiIsIDYpKSkKLSAgICAgIHx8ICgoc1swXSA9PSAnZScKLQkgICB8fCBzWzBdID09ICdFJykKLQkgICYmICghc3RybmNhc2VjbXAgKHMsICJlbHNlIiwgNCkKLQkgICAgICB8fCAhc3RybmNhc2VjbXAgKHMsICJlbmRpZiIsIDUpCi0JICAgICAgfHwgIXN0cm5jYXNlY21wIChzLCAiZW5kYyIsIDQpKSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIChjdXJyZW50X2NmcmFtZSAhPSBOVUxMKSAmJiAoY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nKTsKLX0JCQkJLyogaWdub3JlX2lucHV0KCkgKi8KLQotc3RhdGljIHZvaWQgCi1pbml0aWFsaXplX2NmcmFtZSAoY2ZyYW1lKQotICAgICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKmNmcmFtZTsKLXsKLSAgbWVtc2V0IChjZnJhbWUsIDAsIHNpemVvZiAoKmNmcmFtZSkpOwotICBhc193aGVyZSAoJmNmcmFtZS0+aWZfZmlsZV9saW5lLmZpbGUsCi0JICAgICZjZnJhbWUtPmlmX2ZpbGVfbGluZS5saW5lKTsKLSAgY2ZyYW1lLT5wcmV2aW91c19jZnJhbWUgPSBjdXJyZW50X2NmcmFtZTsKLSAgY2ZyYW1lLT5kZWFkX3RyZWUgPSBjdXJyZW50X2NmcmFtZSAhPSBOVUxMICYmIGN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZzsKLSAgY2ZyYW1lLT5tYWNyb19uZXN0ID0gbWFjcm9fbmVzdDsKLX0KLQotLyogR2l2ZSBhbiBlcnJvciBpZiBhIGNvbmRpdGlvbmFsIGlzIHVudGVybWluYXRlZCBpbnNpZGUgYSBtYWNybyBvcgotICAgdGhlIGFzc2VtYmx5IGFzIGEgd2hvbGUuICBJZiBORVNUIGlzIG5vbiBuZWdhdGl2ZSwgd2UgYXJlIGJlaW5nCi0gICBjYWxsZWQgYmVjYXVzZSBvZiB0aGUgZW5kIG9mIGEgbWFjcm8gZXhwYW5zaW9uLiAgSWYgTkVTVCBpcwotICAgbmVnYXRpdmUsIHdlIGFyZSBiZWluZyBjYWxsZWQgYXQgdGhlIG9mIHRoZSBpbnB1dCBmaWxlcy4gICovCi0KLXZvaWQKLWNvbmRfZmluaXNoX2NoZWNrIChuZXN0KQotICAgICBpbnQgbmVzdDsKLXsKLSAgaWYgKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwgJiYgY3VycmVudF9jZnJhbWUtPm1hY3JvX25lc3QgPj0gbmVzdCkKLSAgICB7Ci0gICAgICBpZiAobmVzdCA+PSAwKQotCWFzX2JhZCAoXygiZW5kIG9mIG1hY3JvIGluc2lkZSBjb25kaXRpb25hbCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImVuZCBvZiBmaWxlIGluc2lkZSBjb25kaXRpb25hbCIpKTsKLSAgICAgIGFzX2JhZF93aGVyZSAoY3VycmVudF9jZnJhbWUtPmlmX2ZpbGVfbGluZS5maWxlLAotCQkgICAgY3VycmVudF9jZnJhbWUtPmlmX2ZpbGVfbGluZS5saW5lLAotCQkgICAgXygiaGVyZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHVudGVybWluYXRlZCBjb25kaXRpb25hbCIpKTsKLSAgICAgIGlmIChjdXJyZW50X2NmcmFtZS0+ZWxzZV9zZWVuKQotCWFzX2JhZF93aGVyZSAoY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmZpbGUsCi0JCSAgICAgIGN1cnJlbnRfY2ZyYW1lLT5lbHNlX2ZpbGVfbGluZS5saW5lLAotCQkgICAgICBfKCJoZXJlIGlzIHRoZSBcImVsc2VcIiBvZiB0aGUgdW50ZXJtaW5hdGVkIGNvbmRpdGlvbmFsIikpOwotICAgIH0KLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBleGl0IG91dCBvZiBhIG1hY3JvLiAgV2UgYXNzdW1lCi0gICB0aGF0IGFueSBjb25kaXRpb25hbHMgd2hpY2ggYmVnYW4gd2l0aGluIHRoZSBtYWNybyBhcmUgY29ycmVjdGx5Ci0gICBuZXN0ZWQsIGFuZCBqdXN0IHBvcCB0aGVtIG9mZiB0aGUgc3RhY2suICAqLwotCi12b2lkCi1jb25kX2V4aXRfbWFjcm8gKG5lc3QpCi0gICAgIGludCBuZXN0OwotewotICB3aGlsZSAoY3VycmVudF9jZnJhbWUgIT0gTlVMTCAmJiBjdXJyZW50X2NmcmFtZS0+bWFjcm9fbmVzdCA+PSBuZXN0KQotICAgIHsKLSAgICAgIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqaG9sZDsKLQotICAgICAgaG9sZCA9IGN1cnJlbnRfY2ZyYW1lOwotICAgICAgY3VycmVudF9jZnJhbWUgPSBjdXJyZW50X2NmcmFtZS0+cHJldmlvdXNfY2ZyYW1lOwotICAgICAgb2JzdGFja19mcmVlICgmY29uZF9vYnN0YWNrLCBob2xkKTsKLSAgICB9Ci19Ci0KLS8qIGVuZCBvZiBjb25kLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWctZ2FzLmNvbSBiL2dhcy9jb25maWctZ2FzLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y1MjQ4YS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnLWdhcy5jb20KKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotJCFjb25maWctZ2FzLmNvbQotJCEgVGhpcyBmaWxlIHNldHMgdGhpbmdzIHVwIHRvIGJ1aWxkIGdhcyBvbiBhIFZNUyBzeXN0ZW0gdG8gZ2VuZXJhdGUgb2JqZWN0Ci0kISBmaWxlcyBmb3IgYSBWTVMgc3lzdGVtLiAgV2UgZG8gbm90IHVzZSB0aGUgY29uZmlndXJlIHNjcmlwdCwgc2luY2Ugd2UKLSQhIGRvIG5vdCBoYXZlIC9iaW4vc2ggdG8gZXhlY3V0ZSBpdC4KLSQhCi0kIQotJCBnYXNfaG9zdD0idm1zIgotJCBhcmNoX2luZHggPSAxICsgKChmJGdldHN5aSgiQ1BVIikuZ2UuMTI4KS5hbmQuMSkJISB2YXg9PTEsIGFscGhhPT0yCi0kIGFyY2ggPSBmJGVsZW1lbnQoYXJjaF9pbmR4LCJ8IiwifFZBWHxBbHBoYXwiKQotJCBpZiBhcmNoLmVxcy4iVkFYIgotJCB0aGVuCi0kICBjcHVfdHlwZT0idmF4IgotJCAgb2JqX2Zvcm1hdD0idm1zIgotJCAgYXRvZj0idmF4IgotJCBlbHNlCi0kICBjcHVfdHlwZT0iYWxwaGEiCi0kICBvYmpfZm9ybWF0PSJldmF4IgotJCAgYXRvZj0iaWVlZSIKLSQgZW5kaWYKLSQgZW11bGF0aW9uPSJnZW5lcmljIgotJCEKLSQJREVMRVRFCT0gImRlbGV0ZS9ub0NvbmZpcm0iCi0kCUVDSE8JPSAid3JpdGUgc3lzJG91dHB1dCIKLSQhCi0kISBUYXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24KLSQgY2FsbCBtYWtlICJ0YXJnLWNwdS5oIiAiWy5jb25maWdddGMtJydjcHVfdHlwZScuaCIKLSQgY2FsbCBtYWtlICJ0YXJnLWVudi5oIiAiWy5jb25maWdddGUtJydlbXVsYXRpb24nLmgiCi0kIQotJCEgQ29kZSB0byBoYW5kbGUgdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4KLSQgY2FsbCBtYWtlICJvYmotZm9ybWF0LmgiICJbLmNvbmZpZ11vYmotJydvYmpfZm9ybWF0Jy5oIgotJCEKLSQhIChub3QgY3VycmVudGx5IHVzZWQgZm9yIHZheCBvciBhbHBoYSkKLSQgY2FsbCBtYWtlICJpdGJsLWNwdS5oIiAiWy5jb25maWddaXRibC0nJ2NwdV90eXBlJy5oIgotJCEKLSQhCi0kISBDcmVhdGUgdGhlIGZpbGUgdmVyc2lvbi5vcHQsIHdoaWNoIGhlbHBzIGlkZW50aWZ5IHRoZSBleGVjdXRhYmxlLgotJCEKLSRpZiBmJHRybmxubSgiSUZJTEUkIikubmVzLiIiIHRoZW4gIGNsb3NlL25vTG9nIGlmaWxlJAotJHNlYXJjaCBDT05GSUdVUkUuSU4gIkFNX0lOSVRfQVVUT01BS0UiL0V4YWN0L091dHB1dD1jb25maWctZ2FzLXRtcC50bXAKLSRvcGVuIGlmaWxlJCBjb25maWctZ2FzLXRtcC50bXAKLSRyZWFkIGlmaWxlJCBsaW5lCi0kY2xvc2UgaWZpbGUkCi0kREVMRVRFIGNvbmZpZy1nYXMtdG1wLnRtcDsqCi0kISBEaXNjYXJkICJBTV9JTklUX0FVVE9NQUtFKGdhcywgIiBhbmQgIikiIHBhcnRzLgotJGlqaz1mJGxvY2F0ZSgiLCIsbGluZSkrMgotJGxpbmU9ZiRleHRyYWN0KGlqayxmJGxlbmd0aChsaW5lKS1pamssbGluZSkKLSRpams9ZiRsb2NhdGUoIikiLGxpbmUpCi0kbGluZT1mJGV4dHJhY3QoMCxpamssbGluZSkKLSQhCi0kIGlmIGYkc2VhcmNoKCJ2ZXJzaW9uLm9wdCIpLm5lcy4iIiB0aGVuIERFTEVURSB2ZXJzaW9uLm9wdDsqCi0kY29weSBfTkw6IHZlcnNpb24ub3B0Ci0kb3Blbi9BcHBlbmQgaWZpbGUkIHZlcnNpb24ub3B0Ci0kd3JpdGUgaWZpbGUkICJpZGVudGlmaWNhdGlvbj0iKyIiIiIrbGluZSsiIiIiCi0kY2xvc2UgaWZpbGUkCi0kIQotJCEgTm93IHdyaXRlIGNvbmZpZy5oLgotJCEKLSQgaWYgZiRzZWFyY2goImNvbmZpZy5oIikubmVzLiIiIHRoZW4gREVMRVRFIGNvbmZpZy5oOyoKLSRjb3B5IF9OTDogY29uZmlnLmgKLSRvcGVuL0FwcGVuZCBpZmlsZSQgY29uZmlnLmgKLSR3cml0ZSBpZmlsZSQgIi8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy1nYXMuY29tLiAqLwotJHdyaXRlIGlmaWxlJCAiI2lmbmRlZiBWRVJTSU9OIgotJHdyaXRlIGlmaWxlJCAiI2RlZmluZSBWRVJTSU9OICAgICAgIiIiLGxpbmUsIiIiIgotJHdyaXRlIGlmaWxlJCAiI2VuZGlmIgotJHdyaXRlIGlmaWxlJCAiLyotLSovIgotJGlmIGFyY2ggLmVxcy4gIlZBWCIKLSR0aGVuCi0kYXBwZW5kIFsuY29uZmlnXXZtcy1jb25mLmggaWZpbGUkOgotJGVsc2UKLSQgYXBwZW5kIFsuY29uZmlnXXZtcy1hLWNvbmYuaCBpZmlsZSQ6Ci0kZW5kaWYKLSRjbG9zZSBpZmlsZSQKLSRFQ0hPICJDcmVhdGVkIGNvbmZpZy5oLiIKLSQhCi0kISBDaGVjayBmb3IsIGFuZCBwb3NzaWJseSBtYWtlLCBoZWFkZXIgZmlsZSA8dW5pc3RkLmg+LgotJCEKLSQgaWYgZiRzZWFyY2goInRtcC1jaGstaC4qIikubmVzLiIiIHRoZW4gIERFTEVURSB0bXAtY2hrLWguKjsqCi0kIWNhbid0IHVzZSBzaW1wbGUgYCNpbmNsdWRlIEhEUicgd2l0aCBgZ2NjIC9EZWZpbmU9IkhEUj08Zm9vLmg+IicKLSQhYmVjYXVzZSB0aGUgMi42LlswLTNdIHByZXByb2Nlc3NvciBoYW5kbGVzIGl0IHdyb25nIChWTVMtc3BlY2lmaWMgZ2NjIGJ1ZykKLSQgY3JlYXRlIHRtcC1jaGstaC5jCi1pbnQgdG1wX2Noa19oOwkvKiBndWFyYW50ZWUgbm9uLWVtcHR5IG91dHB1dCAqLwotI2lmZGVmIEhBVkVfU1RESU9fSAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVhJT19ICi0jaW5jbHVkZSA8dW5peGlvLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVhMSUJfSAotI2luY2x1ZGUgPHVuaXhsaWIuaD4KLSNlbmRpZgotJCBvbiB3YXJuaW5nIHRoZW4gIGNvbnRpbnVlCi0kIENIRUNLID0gImNhbGwgdG1wX2Noa19oIgotJCBDSEVDSyAiSEFWRV9TVERJT19IIgotJCBpZiAubm90LiRzdGF0dXMKLSQgdGhlbgl0eXBlIHN5cyRpbnB1dDoKLQotPyBjb3VsZCBub3QgY29tcGlsZSA8c3RkaW8uaD4uCi0KLSAgSWYgeW91J3JlIGNvbXBpbGluZyB3aXRoIERFQyBDIG9yIFZBWCBDLCBjcmVhdGUgY29uZmlnLnN0YXR1cyBhcyBhbgotICBlbXB0eSBmaWxlIGFuZCBzdGFydCBnbnUgbWFrZSBhZ2Fpbi4KLQotICBJZiB5b3UncmUgY29tcGlsaW5nIHdpdGggR05VIEMsIHRoZXJlIGlzIHNvbWUgc2V0dXAgcHJvYmxlbSBhbmQKLSAgZ2FzIGNvbmZpZ3VyYXRpb24gY2Fubm90IHByb2NlZWQuCi0KLSQJREVMRVRFIHRtcC1jaGstaC5jOyoKLSQJZXhpdCAleDAwMkMKLSQgZW5kaWYKLSQhCi0kIENIRUNLICJIQVZFX1VOSVNURF9IIgotJCBpZiAubm90LiRzdGF0dXMKLSQgdGhlbgotJCAgaWYgZiR0cm5sbm0oIkhGSUxFJCIpLm5lcy4iIiB0aGVuICBjbG9zZS9ub0xvZyBoZmlsZSQKLSQgIENIRUNLICJIQVZFX1VOSVhJT19IIgotJCAgZ290X3VuaXhpbyA9ICgkc3RhdHVzIC5hbmQuIDEpCi0kICBDSEVDSyAiSEFWRV9VTklYTElCX0giCi0kICBnb3RfdW5peGxpYiA9ICgkc3RhdHVzIC5hbmQuIDEpCi0kICBjcmVhdGUgW111bmlzdGQuaAkhd2l0aCBydWRpbWVudGFyeSBjb250ZW50cwotLyogPHVuaXN0ZC5oPiBzdWJzdGl0dXRlIGZvciBidWlsZGluZyBnYXMgKi8KLSNpZm5kZWYgVU5JU1REX0gKLSNkZWZpbmUgVU5JU1REX0gKLQotJCAgb3Blbi9BcHBlbmQgaGZpbGUkIFtddW5pc3RkLmgKLSQgIGlmIGdvdF91bml4aW8KLSQgIHRoZW4gIHdyaXRlIGhmaWxlJCAiI2luY2x1ZGUgPHVuaXhpby5oPiIKLSQgIGVsc2UgIGFwcGVuZCBzeXMkaW5wdXQ6IGhmaWxlJDoKLS8qIHNvbWUgb2YgdGhlIHJvdXRpbmVzIG5vcm1hbGx5IHByb3RvdHlwZWQgaW4gPHVuaXhpby5oPiAqLwotZXh0ZXJuIGludCBjcmVhdCgpLCBvcGVuKCksIGNsb3NlKCksIHJlYWQoKSwgd3JpdGUoKTsKLWV4dGVybiBpbnQgYWNjZXNzKCksIGR1cCgpLCBkdXAyKCksIGZzdGF0KCksIHN0YXQoKTsKLWV4dGVybiBsb25nIGxzZWVrKCk7Ci0kICBlbmRpZgotJCAgd3JpdGUgaGZpbGUkICIiCi0kICBpZiBnb3RfdW5peGxpYgotJCAgdGhlbiAgd3JpdGUgaGZpbGUkICIjaW5jbHVkZSA8dW5peGxpYi5oPiIKLSQgIGVsc2UgIGFwcGVuZCBzeXMkaW5wdXQ6IGhmaWxlJDoKLS8qIHNvbWUgb2YgdGhlIHJvdXRpbmVzIG5vcm1hbGx5IHByb3RvdHlwZWQgaW4gPHVuaXhsaWIuaD4gKi8KLWV4dGVybiBjaGFyICpzYnJrKCksICpnZXRjd2QoKSwgKmN1c2VyaWQoKTsKLWV4dGVybiBpbnQgYnJrKCksIGNoZGlyKCksIGNobW9kKCksIGNob3duKCksIG1rZGlyKCk7Ci1leHRlcm4gdW5zaWduZWQgZ2V0dWlkKCksIHVtYXNrKCk7Ci0kICBlbmRpZgotJCAgYXBwZW5kIHN5cyRpbnB1dDogaGZpbGUkOgotCi0jZW5kaWYgLypVTklTVERfSCovCi0kICBjbG9zZSBoZmlsZSQKLSQgIEVDSE8gIkNyZWF0ZWQgIiJbXXVuaXN0ZC5oIiIuIgotJCBlbmRpZiAhZ2NjICcjaW5jbHVkZSA8dW5pc3RkLmg+JyBmYWlsZWQKLSQgREVMRVRFIHRtcC1jaGstaC5jOyoKLSQKLSR0bXBfY2hrX2g6IHN1YnJvdXRpbmUKLSQgIHNldCBub09uCi0kICBobmFtZSA9IGYkZWRpdCgiPCIgKyAocDEgLSAiSEFWRV8iIC0gIl9IIikgKyAiLmg+IiwiTE9XRVJDQVNFIikKLSQgIHdyaXRlIHN5cyRvdXRwdXQgIkNoZWNraW5nIGZvciAnJ2huYW1lJy4iCi0kICBpZiBmJHNlYXJjaCgidG1wLWNoay1oLm9iaiIpLm5lcy4iIiB0aGVuICBERUxFVEUgdG1wLWNoay1oLm9iajsqCi0kICBkZWZpbmUvbm9Mb2cgc3lzJGVycm9yIF9OTDoJIWNhbid0IHVzZSAvVXNlcl9Nb2RlIGhlcmUgZHVlIHRvIGdjYwotJCAgZGVmaW5lL25vTG9nIHN5cyRvdXRwdXQgX05MOgkhIGRyaXZlcidzIHVzZSBvZiBtdWx0aXBsZSBpbWFnZSBhY3RpdmF0aW9uCi0kICBnY2MgL0luY2x1ZGU9KFtdLFstLmluY2x1ZGVdKSAvRGVmaW5lPSgiJydwMSciKSB0bXAtY2hrLWguYwotJCFjYW4ndCBqdXN0IGNoZWNrICRzdGF0dXM7IGdjYyAyLjYuWzAtM10gcHJlcHJvY2Vzc29yIGRvZXNuJ3Qgc2V0IGl0IGNvcnJlY3RseQotJCAgb2sgPSAoKCRzdGF0dXMuYW5kLjEpLmFuZC4oZiRzZWFyY2goInRtcC1jaGstaC5vYmoiKS5uZXMuIiIpKSAub3IuICV4MTAwMDAwMDAKLSQgIGRlYXNzaWduIHN5cyRlcnJvcgkhcmVzdG9yZSwgbW9yZSBvciBsZXNzCi0kICBkZWFzc2lnbiBzeXMkb3V0cHV0Ci0kICBpZiBvayB0aGVuICBERUxFVEUgdG1wLWNoay1oLm9iajsqCi0kICBleGl0IG9rCi0kIGVuZHN1YnJvdXRpbmUgIXRtcF9jaGtfaAotJAotJCEKLSQhIERvbmUKLSQhCi0kIGlmIGYkc2VhcmNoKCJjb25maWcuc3RhdHVzIikgLm5lcy4gIiIgdGhlbiBERUxFVEUgY29uZmlnLnN0YXR1czsqCi0kIG9wZW4vd3JpdGUgY2ZpbGUgW11jb25maWcuc3RhdHVzCi0kIHdyaXRlIGNmaWxlICJMaW5rcyBhcmUgbm93IHNldCB1cCBmb3IgdXNlIHdpdGggYSAiK2FyY2grIiBydW5uaW5nIFZNUy4iCi0kIGNsb3NlIGNmaWxlCi0kIHR5cGUgW11jb25maWcuc3RhdHVzCi0kZXhpdAotJCEKLSQhCi0kbWFrZTogc3Vicm91dGluZQotJCAgaWYgZiRzZWFyY2gocDEpLm5lcy4iIiB0aGVuIERFTEVURSAncDEnOyoKLSQgIGNyZWF0ZSAncDEnCi0kICBpZiBmJHRybmxubSgiSUZJTEUkIikubmVzLiIiIHRoZW4gIGNsb3NlL25vTG9nIGlmaWxlJAotJCAgb3Blbi9BcHBlbmQgaWZpbGUkICdwMScKLSQgIHdyaXRlIGlmaWxlJCAiI2luY2x1ZGUgIiInJ2Ykc3RyaW5nKHAyIC0gIlsuY29uZmlnXSIpJyIiIgotJCAgY2xvc2UgaWZpbGUkCi0kICBFQ0hPICJDcmVhdGVkICcncDEnIGZvciAnJ3AyJy4iCi0kZW5kc3Vicm91dGluZSAhbWFrZQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy5pbiBiL2dhcy9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZjJhZGEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSBpZiBsZXggZGVjbGFyZXMgeXl0ZXh0IGFzIGEgY2hhciAqIGJ5IGRlZmF1bHQsIG5vdCBhIGNoYXJbXS4gICovCi0jdW5kZWYgWVlURVhUX1BPSU5URVIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZW1vdmUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUkVNT1ZFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2JyayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TQlJLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHVubGluayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9VTkxJTksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRVJSTk9fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUVNT1JZX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRhcmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1REQVJHX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFyYXJncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQVJBUkdTX0gKLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgotCi0vKiBEZWZpbmUgaWYgZGVmYXVsdGluZyB0byBFTEYgb24gU0NPIDUuICovCi0jdW5kZWYgU0NPX0VMRgotCi0vKiBVc2UgRUxGIHN0YWJzIGZvciBNSVBTLCBub3QgRUNPRkYgc3RhYnMgKi8KLSN1bmRlZiBNSVBTX1NUQUJTX0VMRgotCi0vKiBEZWZpbmUgaWYgZGVmYXVsdCB0YXJnZXQgaXMgUG93ZXJQQyBTb2xhcmlzLiAqLwotI3VuZGVmIFRBUkdFVF9TT0xBUklTX0NPTU1FTlQKLQotLyogRGVmaW5lIGFzIDEgaWYgYmlnIGVuZGlhbi4gKi8KLSN1bmRlZiBUQVJHRVRfQllURVNfQklHX0VORElBTgotCi0vKiBEZWZhdWx0IGFyY2hpdGVjdHVyZS4gKi8KLSN1bmRlZiBERUZBVUxUX0FSQ0gKLQotLyogVXNpbmcgY2dlbiBjb2RlPyAqLwotI3VuZGVmIFVTSU5HX0NHRU4KLQotLyogVXNpbmcgaTM4NiBDT0ZGPyAqLwotI3VuZGVmIEkzODZDT0ZGCi0KLS8qIFVzaW5nIG02OGsgQ09GRj8gKi8KLSN1bmRlZiBNNjhLQ09GRgotCi0vKiBVc2luZyBtODhrIENPRkY/ICovCi0jdW5kZWYgTTg4S0NPRkYKLQotLyogYS5vdXQgc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfQU9VVAotCi0vKiBiLm91dCBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9CT1VUCi0KLS8qIENPRkYgc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfQ09GRgotCi0vKiBFQ09GRiBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9FQ09GRgotCi0vKiBFTEYgc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfRUxGCi0KLS8qIGdlbmVyaWMgc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfR0VORVJJQwotCi0vKiBIUDMwMCBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9IUDMwMAotCi0vKiBJRUVFIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0lFRUUKLQotLyogU09NIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX1NPTQotCi0vKiBWTVMgc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfVk1TCi0KLS8qIFVzZSBlbXVsYXRpb24gc3VwcG9ydD8gKi8KLSN1bmRlZiBVU0VfRU1VTEFUSU9OUwotCi0vKiBTdXBwb3J0ZWQgZW11bGF0aW9ucy4gKi8KLSN1bmRlZiBFTVVMQVRJT05TCi0KLS8qIERlZmF1bHQgZW11bGF0aW9uLiAqLwotI3VuZGVmIERFRkFVTFRfRU1VTEFUSU9OCi0KLS8qIG9sZCBDT0ZGIHN1cHBvcnQ/ICovCi0jdW5kZWYgTUFOWV9TRUdNRU5UUwotCi0vKiBVc2UgQkZEIGludGVyZmFjZT8gKi8KLSN1bmRlZiBCRkRfQVNTRU1CTEVSCi0KLS8qIFRhcmdldCBhbGlhcy4gKi8KLSN1bmRlZiBUQVJHRVRfQUxJQVMKLQotLyogQ2Fub25pY2FsIHRhcmdldC4gKi8KLSN1bmRlZiBUQVJHRVRfQ0FOT05JQ0FMCi0KLS8qIFRhcmdldCBDUFUuICovCi0jdW5kZWYgVEFSR0VUX0NQVQotCi0vKiBUYXJnZXQgdmVuZG9yLiAqLwotI3VuZGVmIFRBUkdFVF9WRU5ET1IKLQotLyogVGFyZ2V0IE9TLiAqLwotI3VuZGVmIFRBUkdFVF9PUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbiAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogQ29tcGlsaW5nIGNyb3NzLWFzc2VtYmxlcj8gKi8KLSN1bmRlZiBDUk9TU19DT01QSUxFCi0KLS8qIGFzc2VydCBicm9rZW4/ICovCi0jdW5kZWYgQlJPS0VOX0FTU0VSVAotCi0vKiBEZWZpbmUgaWYgc3Ryc3RyIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi0KLS8qIERlZmluZSBpZiBtYWxsb2MgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLQotLyogRGVmaW5lIGlmIGZyZWUgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi0KLS8qIERlZmluZSBpZiBzYnJrIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSwotCi0vKiBEZWZpbmUgaWYgZW52aXJvbiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLQotLyogRGVmaW5lIGlmIGVycm5vIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRVJSTk8KLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9hb3V0X2dudS5oIGIvZ2FzL2NvbmZpZy9hb3V0X2dudS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRmOWNiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvYW91dF9nbnUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgYW91dF9nbnUuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9fQV9PVVRfR05VX0hfXwotI2RlZmluZSBfX0FfT1VUX0dOVV9IX18KLQotLyogVGhlcmUgYXJlIHR3byBtYWluIGZsYXZvdXJzIG9mIGEub3V0LCBvbmUgd2hpY2ggdXNlcyB0aGUgc3RhbmRhcmQKLSAgIHJlbG9jYXRpb25zLCBhbmQgb25lIHdoaWNoIHVzZXMgZXh0ZW5kZWQgcmVsb2NhdGlvbnMuCi0KLSAgIFRvZGF5LCB0aGUgZXh0ZW5kZWQgcmVsb2MgdXNlcyBhcmUKLSAgIFRDX1NQQVJDLCBUQ19BMjlLCi0KLSAgIGVhY2ggbXVzdCBkZWZpbmUgdGhlIGVudW0gcmVsb2NfdHlwZQotCi0qLwotCi0jZGVmaW5lIFVTRV9FWFRFTkRFRF9SRUxPQyAoZGVmaW5lZChUQ19TUEFSQykgfHwgZGVmaW5lZChUQ19BMjlLKSkKLQotI2lmIGRlZmluZWQoVENfU1BBUkMpIHx8IGRlZmluZWQoVENfQTI5SykKLWVudW0gcmVsb2NfdHlwZQotICB7Ci0gICAgUkVMT0NfOCwgUkVMT0NfMTYsIFJFTE9DXzMyLC8qIHNpbXBsZSByZWxvY2F0aW9ucyAqLwotICAgIFJFTE9DX0RJU1A4LCBSRUxPQ19ESVNQMTYsIFJFTE9DX0RJU1AzMiwJLyogcGMtcmVsIGRpc3BsYWNlbWVudCAqLwotICAgIFJFTE9DX1dESVNQMzAsIFJFTE9DX1dESVNQMjIsCi0gICAgUkVMT0NfSEkyMiwgUkVMT0NfMjIsCi0gICAgUkVMT0NfMTMsIFJFTE9DX0xPMTAsCi0gICAgUkVMT0NfU0ZBX0JBU0UsIFJFTE9DX1NGQV9PRkYxMywKLSAgICBSRUxPQ19CQVNFMTAsIFJFTE9DX0JBU0UxMywgUkVMT0NfQkFTRTIyLAkvKiBQLkkuQy4gKGJhc2UtcmVsYXRpdmUpICovCi0gICAgUkVMT0NfUEMxMCwgUkVMT0NfUEMyMiwJLyogZm9yIHNvbWUgc29ydCBvZiBwYy1yZWwgUC5JLkMuICg/KSAqLwotICAgIFJFTE9DX0pNUF9UQkwsCQkvKiBQLkkuQy4ganVtcCB0YWJsZSAqLwotICAgIFJFTE9DX1NFR09GRjE2LAkJLyogcmVwdXRlZGx5IGZvciBzaGFyZWQgbGlicmFyaWVzIHNvbWVob3cgKi8KLSAgICBSRUxPQ19HTE9CX0RBVCwgUkVMT0NfSk1QX1NMT1QsIFJFTE9DX1JFTEFUSVZFLAotICAgIFJFTE9DXzEwLCBSRUxPQ18xMSwKLSAgICBSRUxPQ19XRElTUDJfMTQsCi0gICAgUkVMT0NfV0RJU1AxOSwKLSAgICBSRUxPQ19ISEkyMiwKLSAgICBSRUxPQ19ITE8xMCwKLQotICAgIC8qIDI5SyByZWxvY2F0aW9uIHR5cGVzICovCi0gICAgUkVMT0NfSlVNUFRBUkcsIFJFTE9DX0NPTlNULCBSRUxPQ19DT05TVEgsCi0KLSAgICBSRUxPQ19XRElTUDE0LCBSRUxPQ19XRElTUDIxLAotCi0gICAgTk9fUkVMT0MKLSAgfTsKLQotI2VuZGlmIC8qIFRDX1NQQVJDIG9yIFRDX0EyOUsgKi8KLQotCi0jZGVmaW5lIF9fR05VX0VYRUNfTUFDUk9TX18KLQotI2lmbmRlZiBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18KLQotLyogVGhpcyBpcyB0aGUgbGF5b3V0IG9uIGRpc2sgb2YgYSBVbml4IFY3LCBCZXJrZWxleSwgU3VuT1MsIFZheCBVbHRyaXgKLSAgICJzdHJ1Y3QgZXhlYyIuICBEb24ndCBhc3N1bWUgdGhhdCBvbiB0aGlzIG1hY2hpbmUsIHRoZSAic3RydWN0IGV4ZWMiCi0gICB3aWxsIGxheSBvdXQgdGhlIHNhbWUgc2l6ZXMgb3IgYWxpZ25tZW50cy4gICovCi0KLXN0cnVjdCBleGVjX2J5dGVzCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIGFfaW5mb1s0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGFfdGV4dFs0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGFfZGF0YVs0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGFfYnNzWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV9zeW1zWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV9lbnRyeVs0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGFfdHJzaXplWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV9kcnNpemVbNF07Ci0gIH07Ci0KLS8qIEhvdyBiaWcgdGhlICJzdHJ1Y3QgZXhlYyIgaXMgb24gZGlzayAqLwotI2RlZmluZQlFWEVDX0JZVEVTX1NJWkUJKDggKiA0KQotCi0vKiBUaGlzIGlzIHRoZSBsYXlvdXQgaW4gbWVtb3J5IG9mIGEgInN0cnVjdCBleGVjIiB3aGlsZSB3ZSBwcm9jZXNzIGl0LiAgKi8KLQotc3RydWN0IGV4ZWMKLXsKLSAgdW5zaWduZWQgbG9uZyBhX2luZm87CQkvKiBVc2UgbWFjcm9zIE5fTUFHSUMsIGV0YyBmb3IgYWNjZXNzICovCi0gIHVuc2lnbmVkIGFfdGV4dDsJCS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2RhdGE7CQkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfc3ltczsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2VudHJ5OwkJLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBhX3Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfZHJzaXplOwkJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KLX07Ci0KLSNlbmRpZiAvKiBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18gKi8KLQotLyogdGhlc2UgZ28gaW4gdGhlIE5fTUFDSFRZUEUgZmllbGQgKi8KLS8qIFRoZXNlIHN5bWJvbHMgY291bGQgYmUgZGVmaW5lZCBieSBjb2RlIGZyb20gU3Vucy4uLnB1bnQgJ2VtICovCi0jdW5kZWYgTV9VTktOT1dOCi0jdW5kZWYgTV82ODAxMAotI3VuZGVmIE1fNjgwMjAKLSN1bmRlZiBNX1NQQVJDCi1lbnVtIG1hY2hpbmVfdHlwZQotICB7Ci0gICAgTV9VTktOT1dOID0gMCwKLSAgICBNXzY4MDEwID0gMSwKLSAgICBNXzY4MDIwID0gMiwKLSAgICBNX1NQQVJDID0gMywKLSAgICAvKiBza2lwIGEgYnVuY2ggc28gd2UgZG9uJ3QgcnVuIGludG8gYW55IG9mIHN1bidzIG51bWJlcnMgKi8KLSAgICBNXzM4NiA9IDEwMCwKLSAgICBNXzI5SyA9IDEwMSwKLSAgICBNX1JTNjAwMCA9IDEwMiwJCS8qIElCTSBSUy82MDAwICovCi0gICAgLyogSFAvQlNEIGZvcm1hdHMgKi8KLSAgICBNX0hQMjAwID0gMjAwLAkJLyogaHAyMDAgKDY4MDEwKSBCU0QgYmluYXJ5ICovCi0gICAgTV9IUDMwMCA9IDMwMCwJCS8qIGhwMzAwICg2ODAyMCs2ODg4MSkgQlNEIGJpbmFyeSAqLwotICAgIE1fSFBVWDIzID0gMHgwMjBDCQkvKiBocDIwMC8zMDAgSFBVWCBiaW5hcnkgKi8KLSAgfTsKLQotI2RlZmluZSBOX01BR0lDKGV4ZWMpICgoZXhlYykuYV9pbmZvICYgMHhmZmZmKQotI2RlZmluZSBOX01BQ0hUWVBFKGV4ZWMpICgoZW51bSBtYWNoaW5lX3R5cGUpKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4ZmYpKQotI2RlZmluZSBOX0ZMQUdTKGV4ZWMpICgoKGV4ZWMpLmFfaW5mbyA+PiAyNCkgJiAweGZmKQotI2RlZmluZSBOX1NFVF9JTkZPKGV4ZWMsIG1hZ2ljLCB0eXBlLCBmbGFncykgXAotICAgICgoZXhlYykuYV9pbmZvID0gKChtYWdpYykgJiAweGZmZmYpIFwKLSAgICAgfCAoKChpbnQpKHR5cGUpICYgMHhmZikgPDwgMTYpIFwKLSAgICAgfCAoKChmbGFncykgJiAweGZmKSA8PCAyNCkpCi0jZGVmaW5lIE5fU0VUX01BR0lDKGV4ZWMsIG1hZ2ljKSBcCi0gICAgKChleGVjKS5hX2luZm8gPSAoKChleGVjKS5hX2luZm8gJiAweGZmZmYwMDAwKSB8ICgobWFnaWMpICYgMHhmZmZmKSkpCi0KLSNkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKLSAgICAoKGV4ZWMpLmFfaW5mbyA9IFwKLSAgICAgKChleGVjKS5hX2luZm8mMHhmZjAwZmZmZikgfCAoKCgoaW50KShtYWNodHlwZSkpJjB4ZmYpIDw8IDE2KSkKLQotI2RlZmluZSBOX1NFVF9GTEFHUyhleGVjLCBmbGFncykgXAotICAgICgoZXhlYykuYV9pbmZvID0gXAotICAgICAoKGV4ZWMpLmFfaW5mbyYweDAwZmZmZmZmKSB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKLQotLyogQ29kZSBpbmRpY2F0aW5nIG9iamVjdCBmaWxlIG9yIGltcHVyZSBleGVjdXRhYmxlLiAgKi8KLSNpZm5kZWYgT01BR0lDCi0jZGVmaW5lIE9NQUdJQyAwNDA3Ci0jZW5kaWYKLS8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBOTUFHSUMgMDQxMAotLyogQ29kZSBpbmRpY2F0aW5nIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgWk1BR0lDIDA0MTMKLQotLyogVmlydHVhbCBBZGRyZXNzIG9mIHRleHQgc2VnbWVudCBmcm9tIHRoZSBhLm91dCBmaWxlLiAgRm9yIE9NQUdJQywKLSAgIChhbG1vc3QgYWx3YXlzICJ1bmxpbmtlZCAubydzIiB0aGVzZSBkYXlzKSwgc2hvdWxkIGJlIHplcm8uCi0gICBGb3IgbGlua2VkIGZpbGVzLCBzaG91bGQgcmVmbGVjdCByZWFsaXR5IGlmIHdlIGtub3cgaXQuICAqLwotCi0jaWZuZGVmIE5fVFhUQUREUgotI2RlZmluZSBOX1RYVEFERFIoeCkJKE5fTUFHSUMoeCk9PU9NQUdJQz8gMCA6IFRFWFRfU1RBUlRfQUREUikKLSNlbmRpZgotCi0jaWZuZGVmIE5fQkFETUFHCi0jZGVmaW5lIE5fQkFETUFHKHgpCSAgKE5fTUFHSUMoeCkgIT0gT01BR0lDCQlcCi0JCQkgICAmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAotCQkJICAgJiYgTl9NQUdJQyh4KSAhPSBaTUFHSUMpCi0jZW5kaWYKLQotLyogQnkgZGVmYXVsdCwgc2VnbWVudCBzaXplIGlzIGNvbnN0YW50LiAgQnV0IG9uIHNvbWUgbWFjaGluZXMsIGl0IGNhbgotICAgYmUgYSBmdW5jdGlvbiBvZiB0aGUgYS5vdXQgaGVhZGVyIChlLmcuIG1hY2hpbmUgdHlwZSkuICAqLwotI2lmbmRlZglOX1NFR1NJWkUKLSNkZWZpbmUJTl9TRUdTSVpFKHgpCVNFR01FTlRfU0laRQotI2VuZGlmCi0KLS8qIFRoaXMgY29tcGxleGl0eSBpcyBmb3IgZW5jYXBzdWxhdGVkIENPRkYgc3VwcG9ydCAqLwotI2lmbmRlZiBfTl9IRFJPRkYKLSNkZWZpbmUgX05fSERST0ZGKHgpCShOX1NFR1NJWkUoeCkgLSBzaXplb2YgKHN0cnVjdCBleGVjKSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fVFhUT0ZGCi0jZGVmaW5lIE5fVFhUT0ZGKHgpCShOX01BR0lDKHgpID09IFpNQUdJQyA/CVwKLQkJCSBfTl9IRFJPRkYoKHgpKSArIHNpemVvZiAoc3RydWN0IGV4ZWMpIDoJXAotCQkJIHNpemVvZiAoc3RydWN0IGV4ZWMpKQotI2VuZGlmCi0KLQotI2lmbmRlZiBOX0RBVE9GRgotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCApCi0jZW5kaWYKLQotI2lmbmRlZiBOX1RSRUxPRkYKLSNkZWZpbmUgTl9UUkVMT0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKLSNlbmRpZgotCi0jaWZuZGVmIE5fRFJFTE9GRgotI2RlZmluZSBOX0RSRUxPRkYoeCkJKCBOX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUgKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9TWU1PRkYKLSNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9TVFJPRkYKLSNkZWZpbmUgTl9TVFJPRkYoeCkJKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQotI2VuZGlmCi0KLS8qIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuICAqLwotI2lmbmRlZiBOX1RYVEFERFIKLSNkZWZpbmUJTl9UWFRBRERSKHgpCTAKLSNlbmRpZgotCi0jaWZuZGVmIE5fREFUQUREUgotI2RlZmluZSBOX0RBVEFERFIoeCkgXAotICAgIChOX01BR0lDKHgpPT1PTUFHSUM/IChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dCkgXAotICAgICA6ICAoTl9TRUdTSVpFKHgpICsgKChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dC0xKSAmIH4oTl9TRUdTSVpFKHgpLTEpKSkpCi0jZW5kaWYKLQotLyogQWRkcmVzcyBvZiBic3Mgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KLSNkZWZpbmUgTl9CU1NBRERSKHgpIChOX0RBVEFERFIoeCkgKyAoeCkuYV9kYXRhKQotDAotc3RydWN0IG5saXN0Ci0gIHsKLSAgICB1bmlvbgotICAgICAgewotCWNoYXIgKm5fbmFtZTsKLQlzdHJ1Y3Qgbmxpc3QgKm5fbmV4dDsKLQlsb25nIG5fc3RyeDsKLSAgICAgIH0KLSAgICBuX3VuOwotICAgIHVuc2lnbmVkIGNoYXIgbl90eXBlOwotICAgIGNoYXIgbl9vdGhlcjsKLSAgICBzaG9ydCBuX2Rlc2M7Ci0gICAgdW5zaWduZWQgbG9uZyBuX3ZhbHVlOwotICB9OwotCi0jZGVmaW5lIE5fVU5ERiAwCi0jZGVmaW5lIE5fQUJTIDIKLSNkZWZpbmUgTl9URVhUIDQKLSNkZWZpbmUgTl9EQVRBIDYKLSNkZWZpbmUgTl9CU1MgOAotI2RlZmluZQlOX0NPTU0JMHgxMgkJLyogY29tbW9uICh2aXNpYmxlIGluIHNoYXJlZCBsaWIgY29tbW9ucykgKi8KLSNkZWZpbmUgTl9GTiAweDFGCQkvKiBGaWxlIG5hbWUgb2YgYSAubyBmaWxlICovCi0KLS8qIE5vdGU6IE5fRVhUIGNhbiBvbmx5IHVzZWZ1bGx5IGJlIE9SLWVkIHdpdGggTl9VTkRGLCBOX0FCUywgTl9URVhULAotICAgTl9EQVRBLCBvciBOX0JTUy4gIFdoZW4gdGhlIGxvdy1vcmRlciBiaXQgb2Ygb3RoZXIgdHlwZXMgaXMgc2V0LAotICAgKGUuZy4gTl9XQVJOSU5HIHZlcnN1cyBOX0ZOKSwgdGhleSBhcmUgdHdvIGRpZmZlcmVudCB0eXBlcy4gICovCi0jZGVmaW5lIE5fRVhUIDEKLSNkZWZpbmUgTl9UWVBFIDAzNgotI2RlZmluZSBOX1NUQUIgMDM0MAotCi0vKiBUaGUgZm9sbG93aW5nIHR5cGUgaW5kaWNhdGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3ltYm9sIGFzIGJlaW5nCi0gICBhbiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gYW5vdGhlciBzeW1ib2wuICBUaGUgb3RoZXIgc3ltYm9sCi0gICBhcHBlYXJzIGFzIGFuIHVuZGVmaW5lZCByZWZlcmVuY2UsIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGlzIHN5bWJvbC4KLQotICAgSW5kaXJlY3Rpb24gaXMgYXN5bW1ldHJpY2FsLiAgVGhlIG90aGVyIHN5bWJvbCdzIHZhbHVlIHdpbGwgYmUgdXNlZAotICAgdG8gc2F0aXNmeSByZXF1ZXN0cyBmb3IgdGhlIGluZGlyZWN0IHN5bWJvbCwgYnV0IG5vdCB2aWNlIHZlcnNhLgotICAgSWYgdGhlIG90aGVyIHN5bWJvbCBkb2VzIG5vdCBoYXZlIGEgZGVmaW5pdGlvbiwgbGlicmFyaWVzIHdpbGwKLSAgIGJlIHNlYXJjaGVkIHRvIGZpbmQgYSBkZWZpbml0aW9uLiAgKi8KLQotI2RlZmluZSBOX0lORFIgMHhhCi0KLS8qIFRoZSBmb2xsb3dpbmcgc3ltYm9scyByZWZlciB0byBzZXQgZWxlbWVudHMuCi0gICBBbGwgdGhlIE5fU0VUW0FUREJdIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lIGZvcm0gb25lIHNldC4KLSAgIFNwYWNlIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNldCBpbiB0aGUgdGV4dCBzZWN0aW9uLCBhbmQgZWFjaCBzZXQKLSAgIGVsZW1lbnQncyB2YWx1ZSBpcyBzdG9yZWQgaW50byBvbmUgd29yZCBvZiB0aGUgc3BhY2UuCi0gICBUaGUgZmlyc3Qgd29yZCBvZiB0aGUgc3BhY2UgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2V0IChudW1iZXIgb2YgZWxlbWVudHMpLgotCi0gICBUaGUgYWRkcmVzcyBvZiB0aGUgc2V0IGlzIG1hZGUgaW50byBhbiBOX1NFVFYgc3ltYm9sCi0gICB3aG9zZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBzZXQuCi0gICBUaGlzIHN5bWJvbCBhY3RzIGxpa2UgYSBOX0RBVEEgZ2xvYmFsIHN5bWJvbAotICAgaW4gdGhhdCBpdCBjYW4gc2F0aXNmeSB1bmRlZmluZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCi0KLS8qIFRoZXNlIGFwcGVhciBhcyBpbnB1dCB0byBMRCwgaW4gYSAubyBmaWxlLiAgKi8KLSNkZWZpbmUJTl9TRVRBCTB4MTQJCS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVFQJMHgxNgkJLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRECTB4MTgJCS8qIERhdGEgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUQgkweDFBCQkvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0KLS8qIFRoaXMgaXMgb3V0cHV0IGZyb20gTEQuICAqLwotI2RlZmluZSBOX1NFVFYJMHgxQwkJLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gICovCi0KLS8qIFdhcm5pbmcgc3ltYm9sLiBUaGUgdGV4dCBnaXZlcyBhIHdhcm5pbmcgbWVzc2FnZSwgdGhlIG5leHQgc3ltYm9sCi0gICBpbiB0aGUgdGFibGUgd2lsbCBiZSB1bmRlZmluZWQuIFdoZW4gdGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkLCB0aGUKLSAgIG1lc3NhZ2UgaXMgcHJpbnRlZC4gICovCi0KLSNkZWZpbmUJTl9XQVJOSU5HIDB4MWUKLQotLyogV2VhayBzeW1ib2xzLiAgVGhlc2UgYXJlIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgYS5vdXQgZm9ybWF0LiAgVGhlCi0gICBzZW1hbnRpY3MgYXJlIHRob3NlIG9mIEVMRiB3ZWFrIHN5bWJvbHMuICBXZWFrIHN5bWJvbHMgYXJlIGFsd2F5cwotICAgZXh0ZXJuYWxseSB2aXNpYmxlLiAgVGhlIE5fV0VBSz8gdmFsdWVzIGFyZSBzcXVlZXplZCBpbnRvIHRoZQotICAgYXZhaWxhYmxlIHNsb3RzLiAgVGhlIHZhbHVlIG9mIGEgTl9XRUFLVSBzeW1ib2wgaXMgMC4gIFRoZSB2YWx1ZXMKLSAgIG9mIHRoZSBvdGhlciB0eXBlcyBhcmUgdGhlIGRlZmluaXRpb25zLiAgKi8KLSNkZWZpbmUgTl9XRUFLVQkweDBkCQkvKiBXZWFrIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtBIDB4MGUJCS8qIFdlYWsgYWJzb2x1dGUgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLVCAweDBmCQkvKiBXZWFrIHRleHQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLRCAweDEwCQkvKiBXZWFrIGRhdGEgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLQiAweDExCQkvKiBXZWFrIGJzcyBzeW1ib2wuICAqLwotDAotLyogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgc2luZ2xlIHJlbG9jYXRpb24gdG8gYmUgcGVyZm9ybWVkLgotICAgVGhlIHRleHQtcmVsb2NhdGlvbiBzZWN0aW9uIG9mIHRoZSBmaWxlIGlzIGEgdmVjdG9yIG9mIHRoZXNlIHN0cnVjdHVyZXMsCi0gICBhbGwgb2Ygd2hpY2ggYXBwbHkgdG8gdGhlIHRleHQgc2VjdGlvbi4KLSAgIExpa2V3aXNlLCB0aGUgZGF0YS1yZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLQotLyogVGhlIGZvbGxvd2luZyBlbnVtIGFuZCBzdHJ1Y3Qgd2VyZSBib3Jyb3dlZCBmcm9tIFN1bk9TJ3MKLSAgIC91c3IvaW5jbHVkZS9zdW40L2Eub3V0LmggIGFuZCBleHRlbmRlZCB0byBoYW5kbGUKLSAgIG90aGVyIG1hY2hpbmVzLiAgSXQgaXMgY3VycmVudGx5IHVzZWQgb24gU1BBUkMgYW5kIEFNRCAyOTAwMC4KLQotICAgcmVsb2NfZXh0X2J5dGVzIGlzIGhvdyBpdCBsb29rcyBvbiBkaXNrLiAgcmVsb2NfaW5mb19leHRlbmRlZCBpcwotICAgaG93IHdlIG1pZ2h0IHByb2Nlc3MgaXQgb24gYSBuYXRpdmUgaG9zdC4gICovCi0jaWYgVVNFX0VYVEVOREVEX1JFTE9DCi0KLXN0cnVjdCByZWxvY19leHRfYnl0ZXMKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgcl9hZGRyZXNzWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9pbmRleFszXTsKLSAgICB1bnNpZ25lZCBjaGFyIHJfYml0c1sxXTsKLSAgICB1bnNpZ25lZCBjaGFyIHJfYWRkZW5kWzRdOwotICB9OwotCi0KLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRwkweDgwCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUJMHgwMQotCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfQklHCQkweDFGCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHCTAKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUJMHhGOAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRQkzCi0KLSNkZWZpbmUJUkVMT0NfRVhUX1NJWkUJMTIJLyogQnl0ZXMgcGVyIHJlbG9jYXRpb24gZW50cnkgKi8KLQotc3RydWN0IHJlbG9jX2luZm9fZXh0ZW5kZWQKLXsKLSAgdW5zaWduZWQgbG9uZyByX2FkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCByX2luZGV4OjI0OwotIyBkZWZpbmUJcl9zeW1ib2xudW0gIHJfaW5kZXgKLSAgdW5zaWduZWQgcl9leHRlcm46MTsKLSAgdW5zaWduZWQ6MjsKLSAgLyogIFJTLzYwMDAgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBlbnVtIGJpdGZpZWxkCi0JICAgIGVudW0gcmVsb2NfdHlwZSByX3R5cGU6NTsgKi8KLSAgZW51bSByZWxvY190eXBlIHJfdHlwZTsKLSAgbG9uZyBpbnQgcl9hZGRlbmQ7Ci19OwotCi0jZWxzZQotCi0vKiBUaGUgc3RhbmRhcmQsIG9sZC1mYXNoaW9uZWQsIEJlcmtlbGV5IGNvbXBhdGlibGUgcmVsb2NhdGlvbiBzdHJ1Y3QgKi8KLQotCi0KLSNpZmRlZiBUQ19JODYwCi0vKiBOT1RFOiB0aHJlZSBiaXRzIG1heCwgc2VlIHN0cnVjdCByZWxvY19pbmZvX2k4NjAucl90eXBlICovCi1lbnVtIGk4NjBfcmVsb2NfdHlwZQotICB7Ci0gICAgTk9fUkVMT0MgPSAwLCBCUkFERFIsIExPVzAsIExPVzEsIExPVzIsIExPVzMsIExPVzQsIFNQTElUMCwgU1BMSVQxLCBTUExJVDIsIFJFTE9DXzMyLAotICB9OwotCi10eXBlZGVmIGVudW0gaTg2MF9yZWxvY190eXBlIHJlbG9jX3R5cGU7Ci0KLS8qIE5PVEU6IHR3byBiaXRzIG1heCwgc2VlIHJlbG9jX2luZm9faTg2MC5yX3R5cGUgKi8KLWVudW0gaGlnaGxvd190eXBlCi0gIHsKLSAgICBOT19TUEVDID0gMCwgUEFJUiwgSElHSCwgSElHSEFESiwKLSAgfTsKLQotCi1zdHJ1Y3QgcmVsb2NfaW5mb19pODYwCi17Ci0gIHVuc2lnbmVkIGxvbmcgcl9hZGRyZXNzOwotICAvKgotCSAqIFVzaW5nIGJpdCBmaWVsZHMgaGVyZSBpcyBhIGJhZCBpZGVhIGJlY2F1c2UgdGhlIG9yZGVyIGlzIG5vdCBwb3J0YWJsZS4gOi0oCi0JICovCi0gIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKLSAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKLSAgdW5zaWduZWQgaW50IHJfZXh0ZXJuOjE7Ci0gIC8qIGNvbWJpbmluZyB0aGUgdHdvIGZpZWxkIHNpbXBsaWZpZXMgdGhlIGFyZ3VtZW50IHBhc3NpbmcgaW4gIm5ld19maXgoKSIgKi8KLSAgLyogYW5kIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZXhpc3RpbmcgU3BhcmMgI2lmZGVmJ3MgKi8KLSAgLyogcl90eXBlOiAgaGlnaGxvd190eXBlIC0gYml0cyA1LDQ7IHJlbG9jX3R5cGUgLSBiaXRzIDMtMCAqLwotICB1bnNpZ25lZCBpbnQgcl90eXBlOjY7Ci0gIGxvbmcgcl9hZGRlbmQ7Ci19OwotCi0jZW5kaWYgLyogVENfSTg2MCAqLwotCi0KLXN0cnVjdCByZWxvY19zdGRfYnl0ZXMKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgcl9hZGRyZXNzWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9pbmRleFszXTsKLSAgICB1bnNpZ25lZCBjaGFyIHJfYml0c1sxXTsKLSAgfTsKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcJMHg4MAotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUJMHgwMQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcJMHg2MAotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHCTUJLyogVG8gc2hpZnQgdG8gdW5pdHMgcGxhY2UgKi8KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRQkweDA2Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUJMQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcJMHgxMAotI2RlZmluZQlSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFCTB4MDgKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRwkweDA4Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFCTB4MDgKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcJMHgwNAotI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUJMHgwNAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRwkweDAyCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRQkweDAyCi0KLSNkZWZpbmUJUkVMT0NfU1REX1NJWkUJOAkvKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotCi0jZW5kaWYgLyogVVNFX0VYVEVOREVEX1JFTE9DICovCi0KLSNpZm5kZWYgQ1VTVE9NX1JFTE9DX0ZPUk1BVAotc3RydWN0IHJlbG9jYXRpb25faW5mbwotewotICAvKiBBZGRyZXNzICh3aXRoaW4gc2VnbWVudCkgdG8gYmUgcmVsb2NhdGVkLiAgKi8KLSAgaW50IHJfYWRkcmVzczsKLSAgLyogVGhlIG1lYW5pbmcgb2Ygcl9zeW1ib2xudW0gZGVwZW5kcyBvbiByX2V4dGVybi4gICovCi0gIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKLSAgLyogTm9uemVybyBtZWFucyB2YWx1ZSBpcyBhIHBjLXJlbGF0aXZlIG9mZnNldAotCSAgIGFuZCBpdCBzaG91bGQgYmUgcmVsb2NhdGVkIGZvciBjaGFuZ2VzIGluIGl0cyBvd24gYWRkcmVzcwotCSAgIGFzIHdlbGwgYXMgZm9yIGNoYW5nZXMgaW4gdGhlIHN5bWJvbCBvciBzZWN0aW9uIHNwZWNpZmllZC4gICovCi0gIHVuc2lnbmVkIGludCByX3BjcmVsOjE7Ci0gIC8qIExlbmd0aCAoYXMgZXhwb25lbnQgb2YgMikgb2YgdGhlIGZpZWxkIHRvIGJlIHJlbG9jYXRlZC4KLQkgICBUaHVzLCBhIHZhbHVlIG9mIDIgaW5kaWNhdGVzIDE8PDIgYnl0ZXMuICAqLwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg6MjsKLSAgLyogMSA9PiByZWxvY2F0ZSB3aXRoIHZhbHVlIG9mIHN5bWJvbC4KLQkgICByX3N5bWJvbG51bSBpcyB0aGUgaW5kZXggb2YgdGhlIHN5bWJvbAotCSAgIGluIGZpbGUncyB0aGUgc3ltYm9sIHRhYmxlLgotCSAgIDAgPT4gcmVsb2NhdGUgd2l0aCB0aGUgYWRkcmVzcyBvZiBhIHNlZ21lbnQuCi0JICAgcl9zeW1ib2xudW0gaXMgTl9URVhULCBOX0RBVEEsIE5fQlNTIG9yIE5fQUJTCi0JICAgKHRoZSBOX0VYVCBiaXQgbWF5IGJlIHNldCBhbHNvLCBidXQgc2lnbmlmaWVzIG5vdGhpbmcpLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfZXh0ZXJuOjE7Ci0gIC8qIFRoZSBuZXh0IHRocmVlIGJpdHMgYXJlIGZvciBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgc2VlbSB0bwotCSAgIGJlIHVuZG9jdW1lbnRlZC4gICovCi0jaWZkZWYgVENfTlMzMksKLSAgdW5zaWduZWQgaW50IHJfYnNyOjE7Ci0gIHVuc2lnbmVkIGludCByX2Rpc3A6MjsKLSNlbHNlCi0gIHVuc2lnbmVkIGludCByX2Jhc2VyZWw6MTsJLyogTGlua2FnZSB0YWJsZSByZWxhdGl2ZSAqLwotICB1bnNpZ25lZCBpbnQgcl9qbXB0YWJsZToxOwkvKiBwYy1yZWxhdGl2ZSB0byBqdW1wIHRhYmxlICovCi0gIHVuc2lnbmVkIGludCByX3JlbGF0aXZlOjE7CS8qICJyZWxhdGl2ZSByZWxvY2F0aW9uIiAqLwotI2VuZGlmIC8qIFRDX05TMzJLICovCi0gIC8qIHVudXNlZCAqLwotICB1bnNpZ25lZCBpbnQgcl9wYWQ6MTsJCS8qIFBhZGRpbmcgLS0gc2V0IHRvIHplcm8gKi8KLX07Ci0KLSNlbmRpZiAvKiBDVVNUT01fUkVMT0NfRk9STUFUICovCi0KLSNlbmRpZiAvKiBfX0FfT1VUX0dOVV9IX18gKi8KLQotLyogZW5kIG9mIGFvdXRfZ251LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvYXRvZi1pZWVlLmMgYi9nYXMvY29uZmlnL2F0b2YtaWVlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2RhMWJjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvYXRvZi1pZWVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTUgKzAsMCBAQAotLyogYXRvZl9pZWVlLmMgLSB0dXJuIGEgRmxvbnVtIGludG8gYW4gSUVFRSBmbG9hdGluZyBwb2ludCBudW1iZXIKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotLyogRmxvbnVtcyByZXR1cm5lZCBoZXJlLiAgKi8KLWV4dGVybiBGTE9OVU1fVFlQRSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKLQotc3RhdGljIGludCBuZXh0X2JpdHMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCB1bmdldF9iaXRzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciBQQVJBTVMgKChMSVRUTEVOVU1fVFlQRSAqKSk7Ci0KLWV4dGVybiBjb25zdCBjaGFyIEVYUF9DSEFSU1tdOwotLyogUHJlY2lzaW9uIGluIExpdHRsZU51bXMuICovCi0vKiBEb24ndCBjb3VudCB0aGUgZ2FwIGluIHRoZSBtNjhrIGV4dGVuZGVkIHByZWNpc2lvbiBmb3JtYXQuICAqLwotI2RlZmluZSBNQVhfUFJFQ0lTSU9OICg1KQotI2RlZmluZSBGX1BSRUNJU0lPTiAoMikKLSNkZWZpbmUgRF9QUkVDSVNJT04gKDQpCi0jZGVmaW5lIFhfUFJFQ0lTSU9OICg1KQotI2RlZmluZSBQX1BSRUNJU0lPTiAoNSkKLQotLyogTGVuZ3RoIGluIExpdHRsZU51bXMgb2YgZ3VhcmQgYml0cy4gKi8KLSNkZWZpbmUgR1VBUkQgKDIpCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIG1hc2tbXSA9Ci17Ci0gIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMDEsCi0gIDB4MDAwMDAwMDMsCi0gIDB4MDAwMDAwMDcsCi0gIDB4MDAwMDAwMGYsCi0gIDB4MDAwMDAwMWYsCi0gIDB4MDAwMDAwM2YsCi0gIDB4MDAwMDAwN2YsCi0gIDB4MDAwMDAwZmYsCi0gIDB4MDAwMDAxZmYsCi0gIDB4MDAwMDAzZmYsCi0gIDB4MDAwMDA3ZmYsCi0gIDB4MDAwMDBmZmYsCi0gIDB4MDAwMDFmZmYsCi0gIDB4MDAwMDNmZmYsCi0gIDB4MDAwMDdmZmYsCi0gIDB4MDAwMGZmZmYsCi0gIDB4MDAwMWZmZmYsCi0gIDB4MDAwM2ZmZmYsCi0gIDB4MDAwN2ZmZmYsCi0gIDB4MDAwZmZmZmYsCi0gIDB4MDAxZmZmZmYsCi0gIDB4MDAzZmZmZmYsCi0gIDB4MDA3ZmZmZmYsCi0gIDB4MDBmZmZmZmYsCi0gIDB4MDFmZmZmZmYsCi0gIDB4MDNmZmZmZmYsCi0gIDB4MDdmZmZmZmYsCi0gIDB4MGZmZmZmZmYsCi0gIDB4MWZmZmZmZmYsCi0gIDB4M2ZmZmZmZmYsCi0gIDB4N2ZmZmZmZmYsCi0gIDB4ZmZmZmZmZmYsCi19OwotDAotCi1zdGF0aWMgaW50IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci1zdGF0aWMgaW50IGxpdHRsZW51bXNfbGVmdDsKLXN0YXRpYyBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX3BvaW50ZXI7Ci0KLXN0YXRpYyBpbnQKLW5leHRfYml0cyAobnVtYmVyX29mX2JpdHMpCi0gICAgIGludCBudW1iZXJfb2ZfYml0czsKLXsKLSAgaW50IHJldHVybl92YWx1ZTsKLQotICBpZiAoIWxpdHRsZW51bXNfbGVmdCkKLSAgICByZXR1cm4gKDApOwotICBpZiAobnVtYmVyX29mX2JpdHMgPj0gYml0c19sZWZ0X2luX2xpdHRsZW51bSkKLSAgICB7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW2JpdHNfbGVmdF9pbl9saXR0bGVudW1dICYgKmxpdHRsZW51bV9wb2ludGVyOwotICAgICAgbnVtYmVyX29mX2JpdHMgLT0gYml0c19sZWZ0X2luX2xpdHRsZW51bTsKLSAgICAgIHJldHVybl92YWx1ZSA8PD0gbnVtYmVyX29mX2JpdHM7Ci0KLSAgICAgIGlmICgtLWxpdHRsZW51bXNfbGVmdCkKLQl7Ci0JICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gbnVtYmVyX29mX2JpdHM7Ci0JICAtLWxpdHRsZW51bV9wb2ludGVyOwotCSAgcmV0dXJuX3ZhbHVlIHw9ICgqbGl0dGxlbnVtX3BvaW50ZXIgPj4gYml0c19sZWZ0X2luX2xpdHRsZW51bSkgJiBtYXNrW251bWJlcl9vZl9iaXRzXTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSAtPSBudW1iZXJfb2ZfYml0czsKLSAgICAgIHJldHVybl92YWx1ZSA9IG1hc2tbbnVtYmVyX29mX2JpdHNdICYgKCpsaXR0bGVudW1fcG9pbnRlciA+PiBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKTsKLSAgICB9Ci0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQotLyogTnVtIGhhZCBiZXR0ZXIgYmUgbGVzcyB0aGFuIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAqLwotc3RhdGljIHZvaWQKLXVuZ2V0X2JpdHMgKG51bSkKLSAgICAgaW50IG51bTsKLXsKLSAgaWYgKCFsaXR0bGVudW1zX2xlZnQpCi0gICAgewotICAgICAgKytsaXR0bGVudW1fcG9pbnRlcjsKLSAgICAgICsrbGl0dGxlbnVtc19sZWZ0OwotICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IG51bTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJpdHNfbGVmdF9pbl9saXR0bGVudW0gKyBudW0gPiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0gICAgewotICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IG51bSAtIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKTsKLSAgICAgICsrbGl0dGxlbnVtX3BvaW50ZXI7Ci0gICAgICArK2xpdHRsZW51bXNfbGVmdDsKLSAgICB9Ci0gIGVsc2UKLSAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtICs9IG51bTsKLX0KLQotc3RhdGljIHZvaWQKLW1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKQotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7Ci17Ci0gIGFzX2JhZCAoXygiY2Fubm90IGNyZWF0ZSBmbG9hdGluZy1wb2ludCBudW1iZXIiKSk7Ci0gIHdvcmRzWzBdID0gKExJVFRMRU5VTV9UWVBFKSAoKHVuc2lnbmVkKSAtMSkgPj4gMTsgLyogWmVybyB0aGUgbGVmdG1vc3QgYml0ICovCi0gIHdvcmRzWzFdID0gKExJVFRMRU5VTV9UWVBFKSAtMTsKLSAgd29yZHNbMl0gPSAoTElUVExFTlVNX1RZUEUpIC0xOwotICB3b3Jkc1szXSA9IChMSVRUTEVOVU1fVFlQRSkgLTE7Ci0gIHdvcmRzWzRdID0gKExJVFRMRU5VTV9UWVBFKSAtMTsKLSAgd29yZHNbNV0gPSAoTElUVExFTlVNX1RZUEUpIC0xOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCVdhcm5pbmc6IHRoaXMgcmV0dXJucyAxNi1iaXQgTElUVExFTlVNcy4gSXQgaXMgdXAgdG8gdGhlIGNhbGxlcgkqCi0gKgl0byBmaWd1cmUgb3V0IGFueSBhbGlnbm1lbnQgcHJvYmxlbXMgYW5kIHRvIGNvbnNwaXJlIGZvciB0aGUJKgotICoJYnl0ZXMvd29yZCB0byBiZSBlbWl0dGVkIGluIHRoZSByaWdodCBvcmRlci4gQmlnZW5kaWFucyBiZXdhcmUhCSoKLSAqCQkJCQkJCQkJKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogTm90ZSB0aGF0IGF0b2YtaWVlZSBhbHdheXMgaGFzIFggYW5kIFAgcHJlY2lzaW9ucyBlbmFibGVkLiAgaXQgaXMgdXAKLSAgIHRvIG1kX2F0b2YgdG8gZmlsdGVyIHRoZW0gb3V0IGlmIHRoZSB0YXJnZXQgbWFjaGluZSBkb2VzIG5vdCBzdXBwb3J0Ci0gICB0aGVtLiAgKi8KLQotLyogUmV0dXJucyBwb2ludGVyIHBhc3QgdGV4dCBjb25zdW1lZC4gKi8KLWNoYXIgKgotYXRvZl9pZWVlIChzdHIsIHdoYXRfa2luZCwgd29yZHMpCi0gICAgIGNoYXIgKnN0cjsJCQkvKiBUZXh0IHRvIGNvbnZlcnQgdG8gYmluYXJ5LiAqLwotICAgICBpbnQgd2hhdF9raW5kOwkJLyogJ2QnLCAnZicsICdnJywgJ2gnICovCi0gICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsJLyogQnVpbGQgdGhlIGJpbmFyeSBoZXJlLiAqLwotewotICAvKiBFeHRyYSBiaXRzIGZvciB6ZXJvZWQgbG93LW9yZGVyIGJpdHMuICBUaGUgMXN0IE1BWF9QUkVDSVNJT04gYXJlCi0gICAgIHplcm9lZCwgdGhlIGxhc3QgY29udGFpbiBmbG9udW0gYml0cy4gKi8KLSAgc3RhdGljIExJVFRMRU5VTV9UWVBFIGJpdHNbTUFYX1BSRUNJU0lPTiArIE1BWF9QUkVDSVNJT04gKyBHVUFSRF07Ci0gIGNoYXIgKnJldHVybl92YWx1ZTsKLSAgLyogTnVtYmVyIG9mIDE2LWJpdCB3b3JkcyBpbiB0aGUgZm9ybWF0LiAqLwotICBpbnQgcHJlY2lzaW9uOwotICBsb25nIGV4cG9uZW50X2JpdHM7Ci0gIEZMT05VTV9UWVBFIHNhdmVfZ2VuX2Zsb251bTsKLQotICAvKiBXZSBoYXZlIHRvIHNhdmUgdGhlIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyIGJlY2F1c2UgaXQKLSAgICAgY29udGFpbnMgc3RvcmFnZSBhbGxvY2F0aW9uIGFib3V0IHRoZSBhcnJheSBvZiBMSVRUTEVOVU1zIHdoZXJlCi0gICAgIHRoZSB2YWx1ZSBpcyBhY3R1YWxseSBzdG9yZWQuICBXZSB3aWxsIGFsbG9jYXRlIG91ciBvd24gYXJyYXkgb2YKLSAgICAgbGl0dGxlbnVtcyBiZWxvdywgYnV0IGhhdmUgdG8gcmVzdG9yZSB0aGUgZ2xvYmFsIG9uZSBvbiBleGl0LiAgKi8KLSAgc2F2ZV9nZW5fZmxvbnVtID0gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXI7Ci0KLSAgcmV0dXJuX3ZhbHVlID0gc3RyOwotICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sb3cgPSBiaXRzICsgTUFYX1BSRUNJU0lPTjsKLSAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuaGlnaCA9IE5VTEw7Ci0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxlYWRlciA9IE5VTEw7Ci0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmV4cG9uZW50ID0gMDsKLSAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9ICdcMCc7Ci0KLSAgLyogVXNlIG1vcmUgTGl0dGxlTnVtcyB0aGFuIHNlZW1zIG5lY2Vzc2FyeTogdGhlIGhpZ2hlc3QgZmxvbnVtIG1heQotICAgICBoYXZlIDE1IGxlYWRpbmcgMCBiaXRzLCBzbyBjb3VsZCBiZSB1c2VsZXNzLiAqLwotCi0gIG1lbXNldCAoYml0cywgJ1wwJywgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiBNQVhfUFJFQ0lTSU9OKTsKLQotICBzd2l0Y2ggKHdoYXRfa2luZCkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjaXNpb24gPSBGX1BSRUNJU0lPTjsKLSAgICAgIGV4cG9uZW50X2JpdHMgPSA4OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWNpc2lvbiA9IERfUFJFQ0lTSU9OOwotICAgICAgZXhwb25lbnRfYml0cyA9IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICBjYXNlICdlJzoKLSAgICBjYXNlICdFJzoKLSAgICAgIHByZWNpc2lvbiA9IFhfUFJFQ0lTSU9OOwotICAgICAgZXhwb25lbnRfYml0cyA9IDE1OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLQotICAgICAgcHJlY2lzaW9uID0gUF9QUkVDSVNJT047Ci0gICAgICBleHBvbmVudF9iaXRzID0gLTE7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0gICAgICByZXR1cm4gKE5VTEwpOwotICAgIH0KLQotICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5oaWdoCi0gICAgPSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sb3cgKyBwcmVjaXNpb24gLSAxICsgR1VBUkQ7Ci0KLSAgaWYgKGF0b2ZfZ2VuZXJpYyAoJnJldHVybl92YWx1ZSwgIi4iLCBFWFBfQ0hBUlMsCi0JCSAgICAmZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpKQotICAgIHsKLSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgfQotICBnZW5fdG9fd29yZHMgKHdvcmRzLCBwcmVjaXNpb24sIGV4cG9uZW50X2JpdHMpOwotCi0gIC8qIFJlc3RvcmUgdGhlIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyJ3Mgc3RvcmFnZSBhbGxvYyAoYW5kCi0gICAgIGV2ZXJ5dGhpbmcgZWxzZSkuICAqLwotICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciA9IHNhdmVfZ2VuX2Zsb251bTsKLQotICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotfQotCi0vKiBUdXJuIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyIGludG8gYSByZWFsIGZsb2F0L2RvdWJsZS9leHRlbmRlZC4gICovCi1pbnQKLWdlbl90b193b3JkcyAod29yZHMsIHByZWNpc2lvbiwgZXhwb25lbnRfYml0cykKLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwotICAgICBpbnQgcHJlY2lzaW9uOwotICAgICBsb25nIGV4cG9uZW50X2JpdHM7Ci17Ci0gIGludCByZXR1cm5fdmFsdWUgPSAwOwotCi0gIGxvbmcgZXhwb25lbnRfMTsKLSAgbG9uZyBleHBvbmVudF8yOwotICBsb25nIGV4cG9uZW50XzM7Ci0gIGxvbmcgZXhwb25lbnRfNDsKLSAgaW50IGV4cG9uZW50X3NraXBwYWdlOwotICBMSVRUTEVOVU1fVFlQRSB3b3JkMTsKLSAgTElUVExFTlVNX1RZUEUgKmxwOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZHNfZW5kOwotCi0gIHdvcmRzX2VuZCA9IHdvcmRzICsgcHJlY2lzaW9uOwotI2lmZGVmIFRDX002OEsKLSAgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLSAgICAvKiBPbiB0aGUgbTY4ayB0aGUgZXh0ZW5kZWQgcHJlY2lzaW9uIGZvcm1hdCBoYXMgYSBnYXAgb2YgMTYgYml0cwotICAgICAgIGJldHdlZW4gdGhlIGV4cG9uZW50IGFuZCB0aGUgbWFudGlzc2EuICAqLwotICAgIHdvcmRzX2VuZCsrOwotI2VuZGlmCi0KLSAgaWYgKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyA+IGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxlYWRlcikKLSAgICB7Ci0gICAgICAvKiAwLjBlMCBzZWVuLiAqLwotICAgICAgaWYgKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLnNpZ24gPT0gJysnKQotCXdvcmRzWzBdID0gMHgwMDAwOwotICAgICAgZWxzZQotCXdvcmRzWzBdID0gMHg4MDAwOwotICAgICAgbWVtc2V0ICgmd29yZHNbMV0sICdcMCcsCi0JICAgICAgKHdvcmRzX2VuZCAtIHdvcmRzIC0gMSkgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci0gICAgfQotCi0gIC8qIE5hTjogIERvIHRoZSByaWdodCB0aGluZyAqLwotICBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAwKQotICAgIHsKLSAgICAgIGlmIChwcmVjaXNpb24gPT0gRl9QUkVDSVNJT04pCi0JewotCSAgd29yZHNbMF0gPSAweDdmZmY7Ci0JICB3b3Jkc1sxXSA9IDB4ZmZmZjsKLQl9Ci0gICAgICBlbHNlIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04pCi0JewotI2lmZGVmIFRDX002OEsKLQkgIHdvcmRzWzBdID0gMHg3ZmZmOwotCSAgd29yZHNbMV0gPSAwOwotCSAgd29yZHNbMl0gPSAweGZmZmY7Ci0JICB3b3Jkc1szXSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzRdID0gMHhmZmZmOwotCSAgd29yZHNbNV0gPSAweGZmZmY7Ci0jZWxzZSAvKiAhIFRDX002OEsgKi8KLSNpZmRlZiBUQ19JMzg2Ci0JICB3b3Jkc1swXSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzFdID0gMHhjMDAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCSAgd29yZHNbNF0gPSAwOwotI2Vsc2UgLyogISBUQ19JMzg2ICovCi0JICBhYm9ydCAoKTsKLSNlbmRpZiAvKiAhIFRDX0kzODYgKi8KLSNlbmRpZiAvKiAhIFRDX002OEsgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yZHNbMF0gPSAweDdmZmY7Ci0JICB3b3Jkc1sxXSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzJdID0gMHhmZmZmOwotCSAgd29yZHNbM10gPSAweGZmZmY7Ci0JfQotICAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLnNpZ24gPT0gJ1AnKQotICAgIHsKLSAgICAgIC8qICtJTkY6ICBEbyB0aGUgcmlnaHQgdGhpbmcgKi8KLSAgICAgIGlmIChwcmVjaXNpb24gPT0gRl9QUkVDSVNJT04pCi0JewotCSAgd29yZHNbMF0gPSAweDdmODA7Ci0JICB3b3Jkc1sxXSA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OKQotCXsKLSNpZmRlZiBUQ19NNjhLCi0JICB3b3Jkc1swXSA9IDB4N2ZmZjsKLQkgIHdvcmRzWzFdID0gMDsKLQkgIHdvcmRzWzJdID0gMDsKLQkgIHdvcmRzWzNdID0gMDsKLQkgIHdvcmRzWzRdID0gMDsKLQkgIHdvcmRzWzVdID0gMDsKLSNlbHNlIC8qICEgVENfTTY4SyAqLwotI2lmZGVmIFRDX0kzODYKLQkgIHdvcmRzWzBdID0gMHg3ZmZmOwotCSAgd29yZHNbMV0gPSAweDgwMDA7Ci0JICB3b3Jkc1syXSA9IDA7Ci0JICB3b3Jkc1szXSA9IDA7Ci0JICB3b3Jkc1s0XSA9IDA7Ci0jZWxzZSAvKiAhIFRDX0kzODYgKi8KLQkgIGFib3J0ICgpOwotI2VuZGlmIC8qICEgVENfSTM4NiAqLwotI2VuZGlmIC8qICEgVENfTTY4SyAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3b3Jkc1swXSA9IDB4N2ZmMDsKLQkgIHdvcmRzWzFdID0gMDsKLQkgIHdvcmRzWzJdID0gMDsKLQkgIHdvcmRzWzNdID0gMDsKLQl9Ci0gICAgICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci0gICAgfQotICBlbHNlIGlmIChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09ICdOJykKLSAgICB7Ci0gICAgICAvKiBOZWdhdGl2ZSBJTkYgKi8KLSAgICAgIGlmIChwcmVjaXNpb24gPT0gRl9QUkVDSVNJT04pCi0JewotCSAgd29yZHNbMF0gPSAweGZmODA7Ci0JICB3b3Jkc1sxXSA9IDB4MDsKLQl9Ci0gICAgICBlbHNlIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04pCi0JewotI2lmZGVmIFRDX002OEsKLQkgIHdvcmRzWzBdID0gMHhmZmZmOwotCSAgd29yZHNbMV0gPSAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCSAgd29yZHNbNF0gPSAwOwotCSAgd29yZHNbNV0gPSAwOwotI2Vsc2UgLyogISBUQ19NNjhLICovCi0jaWZkZWYgVENfSTM4NgotCSAgd29yZHNbMF0gPSAweGZmZmY7Ci0JICB3b3Jkc1sxXSA9IDB4ODAwMDsKLQkgIHdvcmRzWzJdID0gMDsKLQkgIHdvcmRzWzNdID0gMDsKLQkgIHdvcmRzWzRdID0gMDsKLSNlbHNlIC8qICEgVENfSTM4NiAqLwotCSAgYWJvcnQgKCk7Ci0jZW5kaWYgLyogISBUQ19JMzg2ICovCi0jZW5kaWYgLyogISBUQ19NNjhLICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIHdvcmRzWzBdID0gMHhmZmYwOwotCSAgd29yZHNbMV0gPSAweDA7Ci0JICB3b3Jkc1syXSA9IDB4MDsKLQkgIHdvcmRzWzNdID0gMHgwOwotCX0KLSAgICAgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLSAgICB9Ci0gIC8qCi0gICAqIFRoZSBmbG9hdGluZyBwb2ludCBmb3JtYXRzIHdlIHN1cHBvcnQgaGF2ZToKLSAgICogQml0IDE1IGlzIHNpZ24gYml0LgotICAgKiBCaXRzIDE0Om4gYXJlIGV4Y2Vzcy13aGF0ZXZlciBleHBvbmVudC4KLSAgICogQml0cyBuLTE6MCAoaWYgYW55KSBhcmUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIGZyYWN0aW9uLgotICAgKiBCaXRzIDE1OjAgb2YgdGhlIG5leHQgd29yZChzKSBhcmUgdGhlIG5leHQgbW9zdCBzaWduaWZpY2FudCBiaXRzLgotICAgKgotICAgKiBTbyB3ZSBuZWVkOiBudW1iZXIgb2YgYml0cyBvZiBleHBvbmVudCwgbnVtYmVyIG9mIGJpdHMgb2YKLSAgICogbWFudGlzc2EuCi0gICAqLwotICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotICBsaXR0bGVudW1fcG9pbnRlciA9IGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxlYWRlcjsKLSAgbGl0dGxlbnVtc19sZWZ0ID0gKDEKLQkJICAgICArIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxlYWRlcgotCQkgICAgIC0gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubG93KTsKLSAgLyogU2VlayAoYW5kIGZvcmdldCkgMXN0IHNpZ25pZmljYW50IGJpdCAqLwotICBmb3IgKGV4cG9uZW50X3NraXBwYWdlID0gMDsgIW5leHRfYml0cyAoMSk7ICsrZXhwb25lbnRfc2tpcHBhZ2UpOzsKLSAgZXhwb25lbnRfMSA9IChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5leHBvbmVudAotCQkrIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxlYWRlcgotCQkrIDEKLQkJLSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sb3cpOwotICAvKiBSYWRpeCBMSVRUTEVOVU1fUkFESVgsIHBvaW50IGp1c3QgaGlnaGVyIHRoYW4KLSAgICAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyLiAqLwotICBleHBvbmVudF8yID0gZXhwb25lbnRfMSAqIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLSAgLyogUmFkaXggMi4gKi8KLSAgZXhwb25lbnRfMyA9IGV4cG9uZW50XzIgLSBleHBvbmVudF9za2lwcGFnZTsKLSAgLyogRm9yZ2V0IGxlYWRpbmcgemVyb3MsIGZvcmdldCAxc3QgYml0LiAqLwotICBleHBvbmVudF80ID0gZXhwb25lbnRfMyArICgoMSA8PCAoZXhwb25lbnRfYml0cyAtIDEpKSAtIDIpOwotICAvKiBPZmZzZXQgZXhwb25lbnQuICovCi0KLSAgbHAgPSB3b3JkczsKLQotICAvKiBXb3JkIDEuIFNpZ24sIGV4cG9uZW50IGFuZCBwZXJoYXBzIGhpZ2ggYml0cy4gKi8KLSAgd29yZDEgPSAoKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLnNpZ24gPT0gJysnKQotCSAgID8gMAotCSAgIDogKDEgPDwgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpKSk7Ci0KLSAgLyogQXNzdW1lIDIncyBjb21wbGVtZW50IGludGVnZXJzLiAqLwotICBpZiAoZXhwb25lbnRfNCA8PSAwKQotICAgIHsKLSAgICAgIGludCBwcmVjX2JpdHM7Ci0gICAgICBpbnQgbnVtX2JpdHM7Ci0KLSAgICAgIHVuZ2V0X2JpdHMgKDEpOwotICAgICAgbnVtX2JpdHMgPSAtZXhwb25lbnRfNDsKLSAgICAgIHByZWNfYml0cyA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAqIHByZWNpc2lvbiAtIChleHBvbmVudF9iaXRzICsgMSArIG51bV9iaXRzKTsKLSNpZmRlZiBUQ19JMzg2Ci0gICAgICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OICYmIGV4cG9uZW50X2JpdHMgPT0gMTUpCi0JewotCSAgLyogT24gdGhlIGkzODYgYSBkZW5vcm1hbGl6ZWQgZXh0ZW5kZWQgcHJlY2lzaW9uIGZsb2F0IGlzCi0JICAgICBzaGlmdGVkIGRvd24gYnkgb25lLCBlZmZlY3RpdmVseSBkZWNyZWFzaW5nIHRoZSBleHBvbmVudAotCSAgICAgYmlhcyBieSBvbmUuICAqLwotCSAgcHJlY19iaXRzIC09IDE7Ci0JICBudW1fYml0cyArPSAxOwotCX0KLSNlbmRpZgotCi0gICAgICBpZiAobnVtX2JpdHMgPj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gZXhwb25lbnRfYml0cykKLQl7Ci0JICAvKiBCaWdnZXIgdGhhbiBvbmUgbGl0dGxlbnVtICovCi0JICBudW1fYml0cyAtPSAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkgLSBleHBvbmVudF9iaXRzOwotCSAgKmxwKysgPSB3b3JkMTsKLQkgIGlmIChudW1fYml0cyArIGV4cG9uZW50X2JpdHMgKyAxID4gcHJlY2lzaW9uICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgICB7Ci0JICAgICAgLyogRXhwb25lbnQgb3ZlcmZsb3cgKi8KLQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JICAgICAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotCSAgICB9Ci0jaWZkZWYgVENfTTY4SwotCSAgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTiAmJiBleHBvbmVudF9iaXRzID09IDE1KQotCSAgICAqbHArKyA9IDA7Ci0jZW5kaWYKLQkgIHdoaWxlIChudW1fYml0cyA+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgIHsKLQkgICAgICBudW1fYml0cyAtPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JICAgICAgKmxwKysgPSAwOwotCSAgICB9Ci0JICBpZiAobnVtX2JpdHMpCi0JICAgICpscCsrID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAobnVtX2JpdHMpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTiAmJiBleHBvbmVudF9iaXRzID09IDE1KQotCSAgICB7Ci0JICAgICAgKmxwKysgPSB3b3JkMTsKLSNpZmRlZiBUQ19NNjhLCi0JICAgICAgKmxwKysgPSAwOwotI2VuZGlmCi0JICAgICAgKmxwKysgPSBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIG51bV9iaXRzKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd29yZDEgfD0gbmV4dF9iaXRzICgoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkgLSAoZXhwb25lbnRfYml0cyArIG51bV9iaXRzKSk7Ci0JICAgICAgKmxwKysgPSB3b3JkMTsKLQkgICAgfQotCX0KLSAgICAgIHdoaWxlIChscCA8IHdvcmRzX2VuZCkKLQkqbHArKyA9IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKTsKLQotICAgICAgLyogUm91bmQgdGhlIG1hbnRpc3NhIHVwLCBidXQgZG9uJ3QgY2hhbmdlIHRoZSBudW1iZXIgKi8KLSAgICAgIGlmIChuZXh0X2JpdHMgKDEpKQotCXsKLQkgIC0tbHA7Ci0JICBpZiAocHJlY19iaXRzID49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICAgewotCSAgICAgIGludCBuID0gMDsKLQkgICAgICBpbnQgdG1wX2JpdHM7Ci0KLQkgICAgICBuID0gMDsKLQkgICAgICB0bXBfYml0cyA9IHByZWNfYml0czsKLQkgICAgICB3aGlsZSAodG1wX2JpdHMgPiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JCXsKLQkJICBpZiAobHBbbl0gIT0gKExJVFRMRU5VTV9UWVBFKSAtIDEpCi0JCSAgICBicmVhazsKLQkJICAtLW47Ci0JCSAgdG1wX2JpdHMgLT0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQl9Ci0JICAgICAgaWYgKHRtcF9iaXRzID4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTCi0JCSAgfHwgKGxwW25dICYgbWFza1t0bXBfYml0c10pICE9IG1hc2tbdG1wX2JpdHNdCi0JCSAgfHwgKHByZWNfYml0cyAhPSAocHJlY2lzaW9uICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTCi0JCQkJICAgIC0gZXhwb25lbnRfYml0cyAtIDEpCi0jaWZkZWYgVENfSTM4NgotCQkgICAgICAvKiBBbiBleHRlbmRlZCBwcmVjaXNpb24gZmxvYXQgd2l0aCBvbmx5IHRoZSBpbnRlZ2VyCi0JCQkgYml0IHNldCB3b3VsZCBiZSBpbnZhbGlkLiAgVGhhdCBtdXN0IGJlIGNvbnZlcnRlZAotCQkJIHRvIHRoZSBzbWFsbGVzdCBub3JtYWxpemVkIG51bWJlci4gICovCi0JCSAgICAgICYmICEocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OCi0JCQkgICAmJiBwcmVjX2JpdHMgPT0gKHByZWNpc2lvbiAqIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUwotCQkJCQkgICAgLSBleHBvbmVudF9iaXRzIC0gMikpCi0jZW5kaWYKLQkJICAgICAgKSkKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgY2Fycnk7Ci0KLQkJICBmb3IgKGNhcnJ5ID0gMTsgY2FycnkgJiYgKGxwID49IHdvcmRzKTsgbHAtLSkKLQkJICAgIHsKLQkJICAgICAgY2FycnkgPSAqbHAgKyBjYXJyeTsKLQkJICAgICAgKmxwID0gY2Fycnk7Ci0JCSAgICAgIGNhcnJ5ID4+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFuIG92ZXJmbG93IG9mIHRoZSBkZW5vcm1hbCBudW1iZXJzLiAgV2UKLSAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gZm9yZ2V0IHdoYXQgd2UgaGF2ZSBwcm9kdWNlZCwgYW5kIGluc3RlYWQKLSAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIHRoZSBzbWFsbGVzdCBub3JtYWxpemVkIG51bWJlci4gICovCi0JCSAgbHAgPSB3b3JkczsKLQkJICB3b3JkMSA9ICgoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnKycpCi0JCQkgICA/IDAKLQkJCSAgIDogKDEgPDwgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpKSk7Ci0JCSAgd29yZDEgfD0gKDEKLQkJCSAgICA8PCAoKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpCi0JCQkJLSBleHBvbmVudF9iaXRzKSk7Ci0JCSAgKmxwKysgPSB3b3JkMTsKLSNpZmRlZiBUQ19JMzg2Ci0JCSAgLyogU2V0IHRoZSBpbnRlZ2VyIGJpdCBpbiB0aGUgZXh0ZW5kZWQgcHJlY2lzaW9uIGZvcm1hdC4KLQkJICAgICBUaGlzIGNhbm5vdCBoYXBwZW4gb24gdGhlIG02OGsgd2hlcmUgdGhlIG1hbnRpc3NhCi0JCSAgICAganVzdCBvdmVyZmxvd3MgaW50byB0aGUgaW50ZWdlciBiaXQgYWJvdmUuICAqLwotCQkgIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04pCi0JCSAgICAqbHArKyA9IDEgPDwgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpOwotI2VuZGlmCi0JCSAgd2hpbGUgKGxwIDwgd29yZHNfZW5kKQotCQkgICAgKmxwKysgPSAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgKmxwICs9IDE7Ci0JfQotCi0gICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgIH0KLSAgZWxzZSBpZiAoKHVuc2lnbmVkIGxvbmcpIGV4cG9uZW50XzQgPj0gbWFza1tleHBvbmVudF9iaXRzXSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogRXhwb25lbnQgb3ZlcmZsb3cuIExvc2UgaW1tZWRpYXRlbHkuCi0gICAgICAgKi8KLQotICAgICAgLyoKLSAgICAgICAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLSAgICAgICAqIG51bWJlciwgYnV0IHJldHVybiBhIGZsb2F0aW5nIGV4Y2VwdGlvbgotICAgICAgICogYmVjYXVzZSB3ZSBjYW4ndCBlbmNvZGUgdGhlIG51bWJlci4KLSAgICAgICAqLwotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3b3JkMSB8PSAoZXhwb25lbnRfNCA8PCAoKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpIC0gZXhwb25lbnRfYml0cykpCi0JfCBuZXh0X2JpdHMgKChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSAtIGV4cG9uZW50X2JpdHMpOwotICAgIH0KLQotICAqbHArKyA9IHdvcmQxOwotCi0gIC8qIFhfUFJFQ0lTSU9OIGlzIHNwZWNpYWw6IG9uIHRoZSA2OGssIGl0IGhhcyAxNiBiaXRzIG9mIHplcm8gaW4gdGhlCi0gICAgIG1pZGRsZS4gIEVpdGhlciB3YXksIGl0IGlzIHRoZW4gZm9sbG93ZWQgYnkgYSAxIGJpdC4gKi8KLSAgaWYgKGV4cG9uZW50X2JpdHMgPT0gMTUgJiYgcHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OKQotICAgIHsKLSNpZmRlZiBUQ19NNjhLCi0gICAgICAqbHArKyA9IDA7Ci0jZW5kaWYKLSAgICAgICpscCsrID0gKDEgPDwgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpCi0JICAgICAgIHwgbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSk7Ci0gICAgfQotCi0gIC8qIFRoZSByZXN0IG9mIHRoZSB3b3JkcyBhcmUganVzdCBtYW50aXNzYSBiaXRzLiAqLwotICB3aGlsZSAobHAgPCB3b3Jkc19lbmQpCi0gICAgKmxwKysgPSBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyk7Ci0KLSAgaWYgKG5leHRfYml0cyAoMSkpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBjYXJyeTsKLSAgICAgIC8qCi0gICAgICAgKiBTaW5jZSB0aGUgTkVYVCBiaXQgaXMgYSAxLCByb3VuZCBVUCB0aGUgbWFudGlzc2EuCi0gICAgICAgKiBUaGUgY3VubmluZyBkZXNpZ24gb2YgdGhlc2UgaGlkZGVuLTEgZmxvYXRzIHBlcm1pdHMKLSAgICAgICAqIHVzIHRvIGxldCB0aGUgbWFudGlzc2Egb3ZlcmZsb3cgaW50byB0aGUgZXhwb25lbnQsIGFuZAotICAgICAgICogaXQgJ2RvZXMgdGhlIHJpZ2h0IHRoaW5nJy4gSG93ZXZlciwgd2UgbG9zZSBpZiB0aGUKLSAgICAgICAqIGhpZ2hlc3Qtb3JkZXIgYml0IG9mIHRoZSBsb3dlc3Qtb3JkZXIgd29yZCBmbGlwcy4KLSAgICAgICAqIElzIHRoYXQgY2xlYXI/Ci0gICAgICAgKi8KLQotICAgICAgLyogI2lmIChzaXplb2YoY2FycnkpKSA8ICgoc2l6ZW9mKGJpdHNbMF0pICogQklUU19QRVJfQ0hBUikgKyAyKQotCSBQbGVhc2UgYWxsb3cgYXQgbGVhc3QgMSBtb3JlIGJpdCBpbiBjYXJyeSB0aGFuIGlzIGluIGEgTElUVExFTlVNLgotCSBXZSBuZWVkIHRoYXQgZXh0cmEgYml0IHRvIGhvbGQgYSBjYXJyeSBkdXJpbmcgYSBMSVRUTEVOVU0gY2FycnkKLQkgcHJvcGFnYXRpb24uIEFub3RoZXIgZXh0cmEgYml0IChrZXB0IDApIHdpbGwgYXNzdXJlIHVzIHRoYXQgd2UKLQkgZG9uJ3QgZ2V0IGEgc3RpY2t5IHNpZ24gYml0IGFmdGVyIHNoaWZ0aW5nIHJpZ2h0LCBhbmQgdGhhdAotCSBwZXJtaXRzIHVzIHRvIHByb3BhZ2F0ZSB0aGUgY2Fycnkgd2l0aG91dCBhbnkgbWFza2luZyBvZiBiaXRzLgotCSAjZW5kaWYgKi8KLSAgICAgIGZvciAoY2FycnkgPSAxLCBscC0tOyBjYXJyeSAmJiAobHAgPj0gd29yZHMpOyBscC0tKQotCXsKLQkgIGNhcnJ5ID0gKmxwICsgY2Fycnk7Ci0JICAqbHAgPSBjYXJyeTsKLQkgIGNhcnJ5ID4+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JfQotICAgICAgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTiAmJiBleHBvbmVudF9iaXRzID09IDE1KQotCXsKLQkgIC8qIEV4dGVuZGVkIHByZWNpc2lvbiBudW1iZXJzIGhhdmUgYW4gZXhwbGljaXQgaW50ZWdlciBiaXQKLQkgICAgIHRoYXQgd2UgbWF5IGhhdmUgdG8gcmVzdG9yZS4gICovCi0JICBpZiAobHAgPT0gd29yZHMpCi0JICAgIHsKLSNpZmRlZiBUQ19NNjhLCi0JICAgICAgLyogT24gdGhlIG02OGsgdGhlcmUgaXMgYSBnYXAgb2YgMTYgYml0cy4gIFdlIG11c3QKLQkJIGV4cGxpY2l0bHkgcHJvcGFnYXRlIHRoZSBjYXJyeSBpbnRvIHRoZSBleHBvbmVudC4gKi8KLQkgICAgICB3b3Jkc1swXSArPSB3b3Jkc1sxXTsKLQkgICAgICB3b3Jkc1sxXSA9IDA7Ci0JICAgICAgbHArKzsKLSNlbmRpZgotCSAgICAgIC8qIFB1dCBiYWNrIHRoZSBpbnRlZ2VyIGJpdC4gICovIAotCSAgICAgIGxwWzFdIHw9IDEgPDwgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpOwotCSAgICB9Ci0gCX0KLSAgICAgIGlmICgod29yZDEgXiAqd29yZHMpICYgKDEgPDwgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpKSkKLQl7Ci0JICAvKiBXZSBsZWF2ZSByZXR1cm5fdmFsdWUgYWxvbmU6IGFkbWl0IHdlIHJlYWQgdGhlCi0JICAgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkgICAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCi0JICAgKi8KLQkgICp3b3JkcyAmPSB+KDEgPDwgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpKTsKLQkgIC8qIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsgKi8KLQkgIC8qIHJldHVybiByZXR1cm5fdmFsdWU7ICovCi0JfQotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotCi0jaWYgMCAvKiB1bnVzZWQgKi8KLS8qIFRoaXMgcm91dGluZSBpcyBhIHJlYWwga2x1ZGdlLiAgU29tZW9uZSByZWFsbHkgc2hvdWxkIGRvIGl0IGJldHRlciwKLSAgIGJ1dCBJJ20gdG9vIGxhenksIGFuZCBJIGRvbid0IHVuZGVyc3RhbmQgdGhpcyBzdHVmZiBhbGwgdG9vIHdlbGwKLSAgIGFueXdheS4gKEpGKSAgKi8KLXN0YXRpYyB2b2lkCi1pbnRfdG9fZ2VuICh4KQotICAgICBsb25nIHg7Ci17Ci0gIGNoYXIgYnVmWzIwXTsKLSAgY2hhciAqYnVmcDsKLQotICBzcHJpbnRmIChidWYsICIlbGQiLCB4KTsKLSAgYnVmcCA9ICZidWZbMF07Ci0gIGlmIChhdG9mX2dlbmVyaWMgKCZidWZwLCAiLiIsIEVYUF9DSEFSUywgJmdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKSkKLSAgICBhc19iYWQgKF8oIkVycm9yIGNvbnZlcnRpbmcgbnVtYmVyIHRvIGZsb2F0aW5nIHBvaW50IChFeHBvbmVudCBvdmVyZmxvdz8pIikpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBURVNUCi1jaGFyICoKLXByaW50X2dlbiAoZ2VuKQotICAgICBGTE9OVU1fVFlQRSAqZ2VuOwotewotICBGTE9OVU1fVFlQRSBmOwotICBMSVRUTEVOVU1fVFlQRSBhcnJbMTBdOwotICBkb3VibGUgZHY7Ci0gIGZsb2F0IGZ2OwotICBzdGF0aWMgY2hhciBzYnVmWzQwXTsKLQotICBpZiAoZ2VuKQotICAgIHsKLSAgICAgIGYgPSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKLSAgICAgIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyID0gKmdlbjsKLSAgICB9Ci0gIGdlbl90b193b3JkcyAoJmFyclswXSwgNCwgMTEpOwotICBtZW1jcHkgKCZkdiwgJmFyclswXSwgc2l6ZW9mIChkb3VibGUpKTsKLSAgc3ByaW50ZiAoc2J1ZiwgIiV4ICV4ICV4ICV4ICUuMTRHICAgIiwgYXJyWzBdLCBhcnJbMV0sIGFyclsyXSwgYXJyWzNdLCBkdik7Ci0gIGdlbl90b193b3JkcyAoJmFyclswXSwgMiwgOCk7Ci0gIG1lbWNweSAoJmZ2LCAmYXJyWzBdLCBzaXplb2YgKGZsb2F0KSk7Ci0gIHNwcmludGYgKHNidWYgKyBzdHJsZW4gKHNidWYpLCAiJXggJXggJS4xMmdcbiIsIGFyclswXSwgYXJyWzFdLCBmdik7Ci0KLSAgaWYgKGdlbikKLSAgICB7Ci0gICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciA9IGY7Ci0gICAgfQotCi0gIHJldHVybiAoc2J1Zik7Ci19Ci0KLSNlbmRpZgotCi0vKiBlbmQgb2YgYXRvZi1pZWVlLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvYXRvZi10YWhvZS5jIGIvZ2FzL2NvbmZpZy9hdG9mLXRhaG9lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MDQ4NWMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9hdG9mLXRhaG9lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotCi0vKiBhdG9mX3RhaG9lLmMgLSB0dXJuIGEgc3RyaW5nIGludG8gYSBUYWhvZSBmbG9hdGluZyBwb2ludCBudW1iZXIKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICovCi0KLS8qIFRoaXMgaXMgcmVhbGx5IGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIGF0b2ZfdmF4LmMuIEkgZ2xvbW1lZCBpdCB3aG9sZXNhbGUKLSAgIGFuZCB0aGVuIHNoYXZlZCBpdCBkb3duLiBJIGRvbid0IGV2ZW4ga25vdyBob3cgaXQgd29ya3MuIChEb24ndCB5b3UgZmluZAotICAgbXkgaG9uZXN0eSByZWZyZXNoaW5nPyAgYm93ZW5AY3MuQnVmZmFsby5FRFUgKERldm9uIEUgQm93ZW4pCi0KLSAgIEkgZG9uJ3QgYWxsb3cgdXBwZXJjYXNlIGxldHRlcnMgaW4gdGhlIHByZWNpc2lvbiBkZXNjcnBpdG9ycy4gSWUgJ2YnIGFuZAotICAgJ2QnIGFyZSBhbGxvd2VkIGJ1dCAnRicgYW5kICdEJyBhcmVuJ3QgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLS8qIFByZWNpc2lvbiBpbiBMaXR0bGVOdW1zLiAqLwotI2RlZmluZSBNQVhfUFJFQ0lTSU9OICg0KQotI2RlZmluZSBEX1BSRUNJU0lPTiAoNCkKLSNkZWZpbmUgRl9QUkVDSVNJT04gKDIpCi0KLS8qIFByZWNpc2lvbiBpbiBjaGFycy4gKi8KLSNkZWZpbmUgRF9QUkVDSVNJT05fQ0hBUlMgKDgpCi0jZGVmaW5lIEZfUFJFQ0lTSU9OX0NIQVJTICg0KQotCi0vKiBMZW5ndGggaW4gTGl0dGxlTnVtcyBvZiBndWFyZCBiaXRzLiAqLwotI2RlZmluZSBHVUFSRCAoMikKLQotc3RhdGljIGNvbnN0IGxvbmcgaW50IG1hc2tbXSA9Ci17Ci0gIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMDEsCi0gIDB4MDAwMDAwMDMsCi0gIDB4MDAwMDAwMDcsCi0gIDB4MDAwMDAwMGYsCi0gIDB4MDAwMDAwMWYsCi0gIDB4MDAwMDAwM2YsCi0gIDB4MDAwMDAwN2YsCi0gIDB4MDAwMDAwZmYsCi0gIDB4MDAwMDAxZmYsCi0gIDB4MDAwMDAzZmYsCi0gIDB4MDAwMDA3ZmYsCi0gIDB4MDAwMDBmZmYsCi0gIDB4MDAwMDFmZmYsCi0gIDB4MDAwMDNmZmYsCi0gIDB4MDAwMDdmZmYsCi0gIDB4MDAwMGZmZmYsCi0gIDB4MDAwMWZmZmYsCi0gIDB4MDAwM2ZmZmYsCi0gIDB4MDAwN2ZmZmYsCi0gIDB4MDAwZmZmZmYsCi0gIDB4MDAxZmZmZmYsCi0gIDB4MDAzZmZmZmYsCi0gIDB4MDA3ZmZmZmYsCi0gIDB4MDBmZmZmZmYsCi0gIDB4MDFmZmZmZmYsCi0gIDB4MDNmZmZmZmYsCi0gIDB4MDdmZmZmZmYsCi0gIDB4MGZmZmZmZmYsCi0gIDB4MWZmZmZmZmYsCi0gIDB4M2ZmZmZmZmYsCi0gIDB4N2ZmZmZmZmYsCi0gIDB4ZmZmZmZmZmYKLX07Ci0MCi0KLS8qIFNoYXJlZCBiZXR3ZWVuIGZsb251bV9nZW4ydGFob2UgYW5kIG5leHRfYml0cyAqLwotc3RhdGljIGludCBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtOwotc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fcG9pbnRlcjsKLXN0YXRpYyBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX2VuZDsKLQotI2lmIF9fU1REQ19fID09IDEKLQotaW50IGZsb251bV9nZW4ydGFob2UgKGludCBmb3JtYXRfbGV0dGVyLCBGTE9OVU1fVFlQRSAqIGYsIExJVFRMRU5VTV9UWVBFICogd29yZHMpOwotCi0jZWxzZSAvKiBub3QgX19TVERDX18gKi8KLQotaW50IGZsb251bV9nZW4ydGFob2UgKCk7Ci0KLSNlbmRpZiAvKiBub3QgX19TVERDX18gKi8KLQotCi1zdGF0aWMgaW50Ci1uZXh0X2JpdHMgKG51bWJlcl9vZl9iaXRzKQotICAgICBpbnQgbnVtYmVyX29mX2JpdHM7Ci17Ci0gIGludCByZXR1cm5fdmFsdWU7Ci0KLSAgaWYgKGxpdHRsZW51bV9wb2ludGVyIDwgbGl0dGxlbnVtX2VuZCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKG51bWJlcl9vZl9iaXRzID49IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pCi0gICAgewotICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tiaXRzX2xlZnRfaW5fbGl0dGxlbnVtXSAmICpsaXR0bGVudW1fcG9pbnRlcjsKLSAgICAgIG51bWJlcl9vZl9iaXRzIC09IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci0gICAgICByZXR1cm5fdmFsdWUgPDw9IG51bWJlcl9vZl9iaXRzOwotICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIG51bWJlcl9vZl9iaXRzOwotICAgICAgbGl0dGxlbnVtX3BvaW50ZXItLTsKLSAgICAgIGlmIChsaXR0bGVudW1fcG9pbnRlciA+PSBsaXR0bGVudW1fZW5kKQotCXJldHVybl92YWx1ZSB8PSAoKCpsaXR0bGVudW1fcG9pbnRlcikgPj4gKGJpdHNfbGVmdF9pbl9saXR0bGVudW0pKSAmCi0JICBtYXNrW251bWJlcl9vZl9iaXRzXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtIC09IG51bWJlcl9vZl9iaXRzOwotICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tudW1iZXJfb2ZfYml0c10gJgotCSgoKmxpdHRsZW51bV9wb2ludGVyKSA+PiBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKTsKLSAgICB9Ci0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQKLW1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKQotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7Ci17Ci0gICp3b3JkcyA9IDB4ODAwMDsJCS8qIEZsb2F0aW5nIFJlc2VydmVkIE9wZXJhbmQgQ29kZSAqLwotfQotDAotc3RhdGljIGludAkJCS8qIDAgbWVhbnMgbGV0dGVyIGlzIE9LLiAqLwotd2hhdF9raW5kX29mX2Zsb2F0IChsZXR0ZXIsIHByZWNpc2lvblAsIGV4cG9uZW50X2JpdHNQKQotICAgICBjaGFyIGxldHRlcjsJCS8qIEluOiBsb3dlcmNhc2UgcGxlYXNlLiBXaGF0IGtpbmQgb2YgZmxvYXQ/ICovCi0gICAgIGludCAqcHJlY2lzaW9uUDsJCS8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gdGhlIGZsb2F0LiAqLwotICAgICBsb25nIGludCAqZXhwb25lbnRfYml0c1A7CS8qIE51bWJlciBvZiBleHBvbmVudCBiaXRzLiAqLwotewotICBpbnQgcmV0dmFsOwkJCS8qIDA6IE9LLiAqLwotCi0gIHJldHZhbCA9IDA7Ci0gIHN3aXRjaCAobGV0dGVyKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgICpwcmVjaXNpb25QID0gRl9QUkVDSVNJT047Ci0gICAgICAqZXhwb25lbnRfYml0c1AgPSA4OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgICpwcmVjaXNpb25QID0gRF9QUkVDSVNJT047Ci0gICAgICAqZXhwb25lbnRfYml0c1AgPSA4OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dmFsID0gNjk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSoJCQkJCQkJCQkqCi0qCVdhcm5pbmc6IHRoaXMgcmV0dXJucyAxNi1iaXQgTElUVExFTlVNcywgYmVjYXVzZSB0aGF0IGlzCSoKLSoJd2hhdCB0aGUgVkFYIHRoaW5rcyBpbi4gSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBmaWd1cmUJKgotKglvdXQgYW55IGFsaWdubWVudCBwcm9ibGVtcyBhbmQgdG8gY29uc3BpcmUgZm9yIHRoZSBieXRlcy93b3JkCSoKLSoJdG8gYmUgZW1pdHRlZCBpbiB0aGUgcmlnaHQgb3JkZXIuIEJpZ2VuZGlhbnMgYmV3YXJlIQkJKgotKgkJCQkJCQkJCSoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY2hhciAqCQkJCS8qIFJldHVybiBwb2ludGVyIHBhc3QgdGV4dCBjb25zdW1lZC4gKi8KLWF0b2ZfdGFob2UgKHN0ciwgd2hhdF9raW5kLCB3b3JkcykKLSAgICAgY2hhciAqc3RyOwkJCS8qIFRleHQgdG8gY29udmVydCB0byBiaW5hcnkuICovCi0gICAgIGNoYXIgd2hhdF9raW5kOwkJLyogJ2QnLCAnZicsICdnJywgJ2gnICovCi0gICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsJLyogQnVpbGQgdGhlIGJpbmFyeSBoZXJlLiAqLwotewotICBGTE9OVU1fVFlQRSBmOwotICBMSVRUTEVOVU1fVFlQRSBiaXRzW01BWF9QUkVDSVNJT04gKyBNQVhfUFJFQ0lTSU9OICsgR1VBUkRdOwotICAvKiBFeHRyYSBiaXRzIGZvciB6ZXJvZWQgbG93LW9yZGVyIGJpdHMuICovCi0gIC8qIFRoZSAxc3QgTUFYX1BSRUNJU0lPTiBhcmUgemVyb2VkLCAqLwotICAvKiB0aGUgbGFzdCBjb250YWluIGZsb251bSBiaXRzLiAqLwotICBjaGFyICpyZXR1cm5fdmFsdWU7Ci0gIGludCBwcmVjaXNpb247CQkvKiBOdW1iZXIgb2YgMTYtYml0IHdvcmRzIGluIHRoZSBmb3JtYXQuICovCi0gIGxvbmcgaW50IGV4cG9uZW50X2JpdHM7Ci0KLSAgcmV0dXJuX3ZhbHVlID0gc3RyOwotICBmLmxvdyA9IGJpdHMgKyBNQVhfUFJFQ0lTSU9OOwotICBmLmhpZ2ggPSBOVUxMOwotICBmLmxlYWRlciA9IE5VTEw7Ci0gIGYuZXhwb25lbnQgPSBOVUxMOwotICBmLnNpZ24gPSAnXDAnOwotCi0gIGlmICh3aGF0X2tpbmRfb2ZfZmxvYXQgKHdoYXRfa2luZCwgJnByZWNpc2lvbiwgJmV4cG9uZW50X2JpdHMpKQotICAgIHsKLSAgICAgIHJldHVybl92YWx1ZSA9IE5VTEw7CS8qIFdlIGxvc3QuICovCi0gICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0gICAgfQotICBpZiAocmV0dXJuX3ZhbHVlKQotICAgIHsKLSAgICAgIG1lbXNldCAoYml0cywgJ1wwJywgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiBNQVhfUFJFQ0lTSU9OKTsKLQotICAgICAgLyogVXNlIG1vcmUgTGl0dGxlTnVtcyB0aGFuIHNlZW1zICovCi0gICAgICAvKiBuZWNlc3Nhcnk6IHRoZSBoaWdoZXN0IGZsb251bSBtYXkgaGF2ZSAqLwotICAgICAgLyogMTUgbGVhZGluZyAwIGJpdHMsIHNvIGNvdWxkIGJlIHVzZWxlc3MuICovCi0gICAgICBmLmhpZ2ggPSBmLmxvdyArIHByZWNpc2lvbiAtIDEgKyBHVUFSRDsKLQotICAgICAgaWYgKGF0b2ZfZ2VuZXJpYyAoJnJldHVybl92YWx1ZSwgIi4iLCAiZUUiLCAmZikpCi0JewotCSAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgcmV0dXJuX3ZhbHVlID0gTlVMTDsJLyogd2UgbG9zdCAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZmxvbnVtX2dlbjJ0YWhvZSAod2hhdF9raW5kLCAmZiwgd29yZHMpKQotCSAgICB7Ci0JICAgICAgcmV0dXJuX3ZhbHVlID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQwKLS8qCi0gKiBJbjogYSBmbG9udW0sIGEgVGFob2UgZmxvYXRpbmcgcG9pbnQgZm9ybWF0LgotICogT3V0OiBhIFRhaG9lIGZsb2F0aW5nLXBvaW50IGJpdCBwYXR0ZXJuLgotICovCi0KLWludAkJCQkvKiAwOiBPSy4gKi8KLWZsb251bV9nZW4ydGFob2UgKGZvcm1hdF9sZXR0ZXIsIGYsIHdvcmRzKQotICAgICBjaGFyIGZvcm1hdF9sZXR0ZXI7CS8qIE9uZSBvZiAnZCcgJ2YnLiAqLwotICAgICBGTE9OVU1fVFlQRSAqZjsKLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBEZWxpdmVyIGFuc3dlciBoZXJlLiAqLwotewotICBMSVRUTEVOVU1fVFlQRSAqbHA7Ci0gIGludCBwcmVjaXNpb247Ci0gIGxvbmcgaW50IGV4cG9uZW50X2JpdHM7Ci0gIGludCByZXR1cm5fdmFsdWU7CQkvKiAwID09IE9LLiAqLwotCi0gIHJldHVybl92YWx1ZSA9IHdoYXRfa2luZF9vZl9mbG9hdCAoZm9ybWF0X2xldHRlciwgJnByZWNpc2lvbiwgJmV4cG9uZW50X2JpdHMpOwotICBpZiAocmV0dXJuX3ZhbHVlICE9IDApCi0gICAgewotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChmLT5sb3cgPiBmLT5sZWFkZXIpCi0JewotCSAgLyogMC4wZTAgc2Vlbi4gKi8KLQkgIG1lbXNldCAod29yZHMsICdcMCcsIHNpemVvZiAoTElUVExFTlVNX1RZUEUpICogcHJlY2lzaW9uKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBpbnQgZXhwb25lbnRfMTsKLQkgIGxvbmcgaW50IGV4cG9uZW50XzI7Ci0JICBsb25nIGludCBleHBvbmVudF8zOwotCSAgbG9uZyBpbnQgZXhwb25lbnRfNDsKLQkgIGludCBleHBvbmVudF9za2lwcGFnZTsKLQkgIExJVFRMRU5VTV9UWVBFIHdvcmQxOwotCi0JICAvKiBKRjogRGVhbCB3aXRoIG5ldyBOYW4sICtJbmYgYW5kIC1JbmYgY29kZXMgKi8KLQkgIGlmIChmLT5zaWduICE9ICctJyAmJiBmLT5zaWduICE9ICcrJykKLQkgICAgewotCSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLQkgICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotCSAgICB9Ci0JICAvKgotCSAgICogQWxsIHRhaG9lIGZsb2F0aW5nX3BvaW50IGZvcm1hdHMgaGF2ZToKLQkgICAqIEJpdCAxNSBpcyBzaWduIGJpdC4KLQkgICAqIEJpdHMgMTQ6biBhcmUgZXhjZXNzLXdoYXRldmVyIGV4cG9uZW50LgotCSAgICogQml0cyBuLTE6MCAoaWYgYW55KSBhcmUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIGZyYWN0aW9uLgotCSAgICogQml0cyAxNTowIG9mIHRoZSBuZXh0IHdvcmQgYXJlIHRoZSBuZXh0IG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KLQkgICAqIEFuZCBzbyBvbiBmb3IgZWFjaCBvdGhlciB3b3JkLgotCSAgICoKLQkgICAqIFNvIHdlIG5lZWQ6IG51bWJlciBvZiBiaXRzIG9mIGV4cG9uZW50LCBudW1iZXIgb2YgYml0cyBvZgotCSAgICogbWFudGlzc2EuCi0JICAgKi8KLQotCSAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgIGxpdHRsZW51bV9wb2ludGVyID0gZi0+bGVhZGVyOwotCSAgbGl0dGxlbnVtX2VuZCA9IGYtPmxvdzsKLQkgIC8qIFNlZWsgKGFuZCBmb3JnZXQpIDFzdCBzaWduaWZpY2FudCBiaXQgKi8KLQkgIGZvciAoZXhwb25lbnRfc2tpcHBhZ2UgPSAwOwotCSAgICAgICAhbmV4dF9iaXRzICgxKTsKLQkgICAgICAgZXhwb25lbnRfc2tpcHBhZ2UrKykKLQkgICAgewotCSAgICB9Ci0JICBleHBvbmVudF8xID0gZi0+ZXhwb25lbnQgKyBmLT5sZWFkZXIgKyAxIC0gZi0+bG93OwotCSAgLyogUmFkaXggTElUVExFTlVNX1JBRElYLCBwb2ludCBqdXN0IGhpZ2hlciB0aGFuIGYgLT4gbGVhZGVyLiAqLwotCSAgZXhwb25lbnRfMiA9IGV4cG9uZW50XzEgKiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JICAvKiBSYWRpeCAyLiAqLwotCSAgZXhwb25lbnRfMyA9IGV4cG9uZW50XzIgLSBleHBvbmVudF9za2lwcGFnZTsKLQkgIC8qIEZvcmdldCBsZWFkaW5nIHplcm9zLCBmb3JnZXQgMXN0IGJpdC4gKi8KLQkgIGV4cG9uZW50XzQgPSBleHBvbmVudF8zICsgKDEgPDwgKGV4cG9uZW50X2JpdHMgLSAxKSk7Ci0JICAvKiBPZmZzZXQgZXhwb25lbnQuICovCi0KLQkgIGlmIChleHBvbmVudF80ICYgfm1hc2tbZXhwb25lbnRfYml0c10pCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIEV4cG9uZW50IG92ZXJmbG93LiBMb3NlIGltbWVkaWF0ZWx5LgotCSAgICAgICAqLwotCi0JICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCi0JICAgICAgLyoKLQkgICAgICAgKiBXZSBsZWF2ZSByZXR1cm5fdmFsdWUgYWxvbmU6IGFkbWl0IHdlIHJlYWQgdGhlCi0JICAgICAgICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCi0JICAgICAgICogYmVjYXVzZSB3ZSBjYW4ndCBlbmNvZGUgdGhlIG51bWJlci4KLQkgICAgICAgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbHAgPSB3b3JkczsKLQotCSAgICAgIC8qIFdvcmQgMS4gU2lnbiwgZXhwb25lbnQgYW5kIHBlcmhhcHMgaGlnaCBiaXRzLiAqLwotCSAgICAgIC8qIEFzc3VtZSAyJ3MgY29tcGxlbWVudCBpbnRlZ2Vycy4gKi8KLQkgICAgICB3b3JkMSA9ICgoZXhwb25lbnRfNCAmIG1hc2tbZXhwb25lbnRfYml0c10pIDw8ICgxNSAtIGV4cG9uZW50X2JpdHMpKQotCQl8ICgoZi0+c2lnbiA9PSAnKycpID8gMCA6IDB4ODAwMCkKLQkJfCBuZXh0X2JpdHMgKDE1IC0gZXhwb25lbnRfYml0cyk7Ci0JICAgICAgKmxwKysgPSB3b3JkMTsKLQotCSAgICAgIC8qIFRoZSByZXN0IG9mIHRoZSB3b3JkcyBhcmUganVzdCBtYW50aXNzYSBiaXRzLiAqLwotCSAgICAgIGZvciAoOyBscCA8IHdvcmRzICsgcHJlY2lzaW9uOyBscCsrKQotCQl7Ci0JCSAgKmxwID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpOwotCQl9Ci0KLQkgICAgICBpZiAobmV4dF9iaXRzICgxKSkKLQkJewotCQkgIC8qCi0JCSAgICogU2luY2UgdGhlIE5FWFQgYml0IGlzIGEgMSwgcm91bmQgVVAgdGhlIG1hbnRpc3NhLgotCQkgICAqIFRoZSBjdW5uaW5nIGRlc2lnbiBvZiB0aGVzZSBoaWRkZW4tMSBmbG9hdHMgcGVybWl0cwotCQkgICAqIHVzIHRvIGxldCB0aGUgbWFudGlzc2Egb3ZlcmZsb3cgaW50byB0aGUgZXhwb25lbnQsIGFuZAotCQkgICAqIGl0ICdkb2VzIHRoZSByaWdodCB0aGluZycuIEhvd2V2ZXIsIHdlIGxvc2UgaWYgdGhlCi0JCSAgICogaGlnaGVzdC1vcmRlciBiaXQgb2YgdGhlIGxvd2VzdC1vcmRlciB3b3JkIGZsaXBzLgotCQkgICAqIElzIHRoYXQgY2xlYXI/Ci0JCSAgICovCi0KLQkJICB1bnNpZ25lZCBsb25nIGludCBjYXJyeTsKLQotCQkgIC8qCi0JCSAgICAjaWYgKHNpemVvZihjYXJyeSkpIDwgKChzaXplb2YoYml0c1swXSkgKiBCSVRTX1BFUl9DSEFSKSArIDIpCi0JCSAgICBQbGVhc2UgYWxsb3cgYXQgbGVhc3QgMSBtb3JlIGJpdCBpbiBjYXJyeSB0aGFuIGlzIGluIGEgTElUVExFTlVNLgotCQkgICAgV2UgbmVlZCB0aGF0IGV4dHJhIGJpdCB0byBob2xkIGEgY2FycnkgZHVyaW5nIGEgTElUVExFTlVNIGNhcnJ5Ci0JCSAgICBwcm9wYWdhdGlvbi4gQW5vdGhlciBleHRyYSBiaXQgKGtlcHQgMCkgd2lsbCBhc3N1cmUgdXMgdGhhdCB3ZQotCQkgICAgZG9uJ3QgZ2V0IGEgc3RpY2t5IHNpZ24gYml0IGFmdGVyIHNoaWZ0aW5nIHJpZ2h0LCBhbmQgdGhhdAotCQkgICAgcGVybWl0cyB1cyB0byBwcm9wYWdhdGUgdGhlIGNhcnJ5IHdpdGhvdXQgYW55IG1hc2tpbmcgb2YgYml0cy4KLQkJICAgICNlbmRpZgotCQkgICAgKi8KLQkJICBmb3IgKGNhcnJ5ID0gMSwgbHAtLTsKLQkJICAgICAgIGNhcnJ5ICYmIChscCA+PSB3b3Jkcyk7Ci0JCSAgICAgICBscC0tKQotCQkgICAgewotCQkgICAgICBjYXJyeSA9ICpscCArIGNhcnJ5OwotCQkgICAgICAqbHAgPSBjYXJyeTsKLQkJICAgICAgY2FycnkgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkJICAgIH0KLQotCQkgIGlmICgod29yZDEgXiAqd29yZHMpICYgKDEgPDwgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpKSkKLQkJICAgIHsKLQkJICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCQkgICAgICAvKgotCQkgICAgICAgKiBXZSBsZWF2ZSByZXR1cm5fdmFsdWUgYWxvbmU6IGFkbWl0IHdlIHJlYWQgdGhlCi0JCSAgICAgICAqIG51bWJlciwgYnV0IHJldHVybiBhIGZsb2F0aW5nIGV4Y2VwdGlvbgotCQkgICAgICAgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotCQkgICAgICAgKi8KLQkJICAgIH0KLQkJfQkJLyogaWYgKHdlIG5lZWRlZCB0byByb3VuZCB1cCkgKi8KLQkgICAgfQkJCS8qIGlmIChleHBvbmVudCBvdmVyZmxvdykgKi8KLQl9CQkJLyogaWYgKDAuMGUwKSAqLwotICAgIH0JCQkJLyogaWYgKGZsb2F0X3R5cGUgd2FzIE9LKSAqLwotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0MCi0vKgotICoJCW1kX2F0b2YoKQotICoKLSAqIEluOglpbnB1dF9saW5lX3BvaW50ZXIgLT4gdGhlIDFzdCBjaGFyYWN0ZXIgb2YgYSBmbG9hdGluZy1wb2ludAotICoJCW51bWJlci4KLSAqCTEgbGV0dGVyIGRlbm90aW5nIHRoZSB0eXBlIG9mIHN0YXRlbWVudCB0aGF0IHdhbnRzIGEKLSAqCQliaW5hcnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHJldHVybmVkLgotICoJQWRkcmVzcyBvZiB3aGVyZSB0byBidWlsZCBmbG9hdGluZyBwb2ludCBsaXRlcmFsLgotICoJCUFzc3VtZWQgdG8gYmUgJ2JpZyBlbm91Z2gnLgotICoJQWRkcmVzcyBvZiB3aGVyZSB0byByZXR1cm4gc2l6ZSBvZiBsaXRlcmFsIChpbiBjaGFycykuCi0gKgotICogT3V0OglJbnB1dF9saW5lX3BvaW50ZXIgLT4gb2YgbmV4dCBjaGFyIGFmdGVyIGZsb2F0aW5nIG51bWJlci4KLSAqCUVycm9yIG1lc3NhZ2UsIG9yIDAuCi0gKglGbG9hdGluZyBwb2ludCBsaXRlcmFsLgotICoJTnVtYmVyIG9mIGNoYXJzIHdlIHVzZWQgZm9yIHRoZSBsaXRlcmFsLgotICovCi0KLWNoYXIgKgotbWRfYXRvZiAod2hhdF9zdGF0ZW1lbnRfdHlwZSwgbGl0ZXJhbFAsIHNpemVQKQotICAgICBjaGFyIHdoYXRfc3RhdGVtZW50X3R5cGU7Ci0gICAgIGNoYXIgKmxpdGVyYWxQOwotICAgICBpbnQgKnNpemVQOwotewotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfUFJFQ0lTSU9OXTsKLSAgcmVnaXN0ZXIgY2hhciBraW5kX29mX2Zsb2F0OwotICByZWdpc3RlciBpbnQgbnVtYmVyX29mX2NoYXJzOwotICByZWdpc3RlciBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX3BvaW50ZXI7Ci0KLSAgc3dpdGNoICh3aGF0X3N0YXRlbWVudF90eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoJCQkvKiAuZmZsb2F0ICovCi0gICAgY2FzZSAnZCc6CQkJLyogLmRmbG9hdCAqLwotICAgICAga2luZF9vZl9mbG9hdCA9IHdoYXRfc3RhdGVtZW50X3R5cGU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBraW5kX29mX2Zsb2F0ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH07Ci0KLSAgaWYgKGtpbmRfb2ZfZmxvYXQpCi0gICAgewotICAgICAgcmVnaXN0ZXIgTElUVExFTlVNX1RZUEUgKmxpbWl0OwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBhdG9mX3RhaG9lIChpbnB1dF9saW5lX3BvaW50ZXIsCi0JCQkJICAgICAgIGtpbmRfb2ZfZmxvYXQsCi0JCQkJICAgICAgIHdvcmRzKTsKLSAgICAgIC8qCi0gICAgICAgKiBUaGUgYXRvZl90YWhvZSgpIGJ1aWxkcyB1cCAxNi1iaXQgbnVtYmVycy4KLSAgICAgICAqIFNpbmNlIHRoZSBhc3NlbWJsZXIgbWF5IG5vdCBiZSBydW5uaW5nIG9uCi0gICAgICAgKiBhIGRpZmZlcmVudC1lbmRpYW4gbWFjaGluZSwgYmUgdmVyeSBjYXJlZnVsIGFib3V0Ci0gICAgICAgKiBjb252ZXJ0aW5nIHdvcmRzIHRvIGNoYXJzLgotICAgICAgICovCi0gICAgICBudW1iZXJfb2ZfY2hhcnMgPSAoa2luZF9vZl9mbG9hdCA9PSAnZicgPyBGX1BSRUNJU0lPTl9DSEFSUyA6Ci0JCQkgKGtpbmRfb2ZfZmxvYXQgPT0gJ2QnID8gRF9QUkVDSVNJT05fQ0hBUlMgOiAwKSk7Ci0gICAgICBrbm93IChudW1iZXJfb2ZfY2hhcnMgPD0gTUFYX1BSRUNJU0lPTiAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpbWl0ID0gd29yZHMgKyAobnVtYmVyX29mX2NoYXJzIC8gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgZm9yIChsaXR0bGVudW1fcG9pbnRlciA9IHdvcmRzOwotCSAgIGxpdHRsZW51bV9wb2ludGVyIDwgbGltaXQ7Ci0JICAgbGl0dGxlbnVtX3BvaW50ZXIrKykKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdGVyYWxQLCAqbGl0dGxlbnVtX3BvaW50ZXIsCi0JCQkgICAgICBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRlcmFsUCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQl9OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG51bWJlcl9vZl9jaGFycyA9IDA7Ci0gICAgfTsKLQotICAqc2l6ZVAgPSBudW1iZXJfb2ZfY2hhcnM7Ci0gIHJldHVybiBraW5kX29mX2Zsb2F0ID8gMCA6IF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOwotfQotCi0vKiBhdG9mX3RhaG9lLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvYXRvZi12YXguYyBiL2dhcy9jb25maWcvYXRvZi12YXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmZjA3OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2F0b2YtdmF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotLyogYXRvZl92YXguYyAtIHR1cm4gYSBGbG9udW0gaW50byBhIFZBWCBmbG9hdGluZyBwb2ludCBudW1iZXIKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiwgOTMsIDk1LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotc3RhdGljIGludCBhdG9mX3ZheF9zaXplb2YgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgaW50IG5leHRfYml0cyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgUEFSQU1TICgoTElUVExFTlVNX1RZUEUgKikpOwotc3RhdGljIGludCB3aGF0X2tpbmRfb2ZfZmxvYXQgUEFSQU1TICgoaW50LCBpbnQgKiwgbG9uZyAqKSk7Ci1zdGF0aWMgY2hhciAqYXRvZl92YXggUEFSQU1TICgoY2hhciAqLCBpbnQsIExJVFRMRU5VTV9UWVBFICopKTsKLQotLyogUHJlY2lzaW9uIGluIExpdHRsZU51bXMuICovCi0jZGVmaW5lIE1BWF9QUkVDSVNJT04gKDgpCi0jZGVmaW5lIEhfUFJFQ0lTSU9OICg4KQotI2RlZmluZSBHX1BSRUNJU0lPTiAoNCkKLSNkZWZpbmUgRF9QUkVDSVNJT04gKDQpCi0jZGVmaW5lIEZfUFJFQ0lTSU9OICgyKQotCi0vKiBMZW5ndGggaW4gTGl0dGxlTnVtcyBvZiBndWFyZCBiaXRzLiAqLwotI2RlZmluZSBHVUFSRCAoMikKLQotaW50IGZsb251bV9nZW4ydmF4IFBBUkFNUyAoKGludCBmb3JtYXRfbGV0dGVyLCBGTE9OVU1fVFlQRSAqIGYsCi0JCQkgICAgTElUVExFTlVNX1RZUEUgKiB3b3JkcykpOwotCi0vKiBOdW1iZXIgb2YgY2hhcnMgaW4gZmxvbnVtIHR5cGUgJ2xldHRlcicuICovCi1zdGF0aWMgaW50Ci1hdG9mX3ZheF9zaXplb2YgKGxldHRlcikKLSAgICAgaW50IGxldHRlcjsKLXsKLSAgaW50IHJldHVybl92YWx1ZTsKLQotICAvKgotICAgKiBQZXJtaXR0aW5nIHVwcGVyY2FzZSBsZXR0ZXJzIGlzIHByb2JhYmx5IGEgYmFkIGlkZWEuCi0gICAqIFBsZWFzZSB1c2Ugb25seSBsb3dlci1jYXNlZCBsZXR0ZXJzIGluIGNhc2UgdGhlIHVwcGVyLWNhc2VkCi0gICAqIG9uZXMgYmVjb21lIHVuc3VwcG9ydGVkIQotICAgKi8KLSAgc3dpdGNoIChsZXR0ZXIpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgICAgcmV0dXJuX3ZhbHVlID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAnZyc6Ci0gICAgY2FzZSAnRyc6Ci0gICAgICByZXR1cm5fdmFsdWUgPSA4OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdoJzoKLSAgICBjYXNlICdIJzoKLSAgICAgIHJldHVybl92YWx1ZSA9IDE2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuX3ZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQkJCQkvKiBhdG9mX3ZheF9zaXplb2YgKi8KLQotc3RhdGljIGNvbnN0IGxvbmcgbWFza1tdID0KLXsKLSAgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAwMSwKLSAgMHgwMDAwMDAwMywKLSAgMHgwMDAwMDAwNywKLSAgMHgwMDAwMDAwZiwKLSAgMHgwMDAwMDAxZiwKLSAgMHgwMDAwMDAzZiwKLSAgMHgwMDAwMDA3ZiwKLSAgMHgwMDAwMDBmZiwKLSAgMHgwMDAwMDFmZiwKLSAgMHgwMDAwMDNmZiwKLSAgMHgwMDAwMDdmZiwKLSAgMHgwMDAwMGZmZiwKLSAgMHgwMDAwMWZmZiwKLSAgMHgwMDAwM2ZmZiwKLSAgMHgwMDAwN2ZmZiwKLSAgMHgwMDAwZmZmZiwKLSAgMHgwMDAxZmZmZiwKLSAgMHgwMDAzZmZmZiwKLSAgMHgwMDA3ZmZmZiwKLSAgMHgwMDBmZmZmZiwKLSAgMHgwMDFmZmZmZiwKLSAgMHgwMDNmZmZmZiwKLSAgMHgwMDdmZmZmZiwKLSAgMHgwMGZmZmZmZiwKLSAgMHgwMWZmZmZmZiwKLSAgMHgwM2ZmZmZmZiwKLSAgMHgwN2ZmZmZmZiwKLSAgMHgwZmZmZmZmZiwKLSAgMHgxZmZmZmZmZiwKLSAgMHgzZmZmZmZmZiwKLSAgMHg3ZmZmZmZmZiwKLSAgMHhmZmZmZmZmZgotfTsKLQwKLQotLyogU2hhcmVkIGJldHdlZW4gZmxvbnVtX2dlbjJ2YXggYW5kIG5leHRfYml0cyAqLwotc3RhdGljIGludCBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtOwotc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fcG9pbnRlcjsKLXN0YXRpYyBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX2VuZDsKLQotc3RhdGljIGludAotbmV4dF9iaXRzIChudW1iZXJfb2ZfYml0cykKLSAgICAgaW50IG51bWJlcl9vZl9iaXRzOwotewotICBpbnQgcmV0dXJuX3ZhbHVlOwotCi0gIGlmIChsaXR0bGVudW1fcG9pbnRlciA8IGxpdHRsZW51bV9lbmQpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChudW1iZXJfb2ZfYml0cyA+PSBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKQotICAgIHsKLSAgICAgIHJldHVybl92YWx1ZSA9IG1hc2tbYml0c19sZWZ0X2luX2xpdHRsZW51bV0gJiAqbGl0dGxlbnVtX3BvaW50ZXI7Ci0gICAgICBudW1iZXJfb2ZfYml0cyAtPSBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtOwotICAgICAgcmV0dXJuX3ZhbHVlIDw8PSBudW1iZXJfb2ZfYml0czsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSBudW1iZXJfb2ZfYml0czsKLSAgICAgIGxpdHRsZW51bV9wb2ludGVyLS07Ci0gICAgICBpZiAobGl0dGxlbnVtX3BvaW50ZXIgPj0gbGl0dGxlbnVtX2VuZCkKLQlyZXR1cm5fdmFsdWUgfD0gKCgqbGl0dGxlbnVtX3BvaW50ZXIpID4+IChiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKSkgJiBtYXNrW251bWJlcl9vZl9iaXRzXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtIC09IG51bWJlcl9vZl9iaXRzOwotICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tudW1iZXJfb2ZfYml0c10gJiAoKCpsaXR0bGVudW1fcG9pbnRlcikgPj4gYml0c19sZWZ0X2luX2xpdHRsZW51bSk7Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3JkcykKLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwotewotICAqd29yZHMgPSAweDgwMDA7CQkvKiBGbG9hdGluZyBSZXNlcnZlZCBPcGVyYW5kIENvZGUgKi8KLX0KLQwKLXN0YXRpYyBpbnQJCQkvKiAwIG1lYW5zIGxldHRlciBpcyBPSy4gKi8KLXdoYXRfa2luZF9vZl9mbG9hdCAobGV0dGVyLCBwcmVjaXNpb25QLCBleHBvbmVudF9iaXRzUCkKLSAgICAgaW50IGxldHRlcjsJCS8qIEluOiBsb3dlcmNhc2UgcGxlYXNlLiBXaGF0IGtpbmQgb2YgZmxvYXQ/ICovCi0gICAgIGludCAqcHJlY2lzaW9uUDsJCS8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gdGhlIGZsb2F0LiAqLwotICAgICBsb25nICpleHBvbmVudF9iaXRzUDsJLyogTnVtYmVyIG9mIGV4cG9uZW50IGJpdHMuICovCi17Ci0gIGludCByZXR2YWw7CQkJLyogMDogT0suICovCi0KLSAgcmV0dmFsID0gMDsKLSAgc3dpdGNoIChsZXR0ZXIpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgKnByZWNpc2lvblAgPSBGX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgKnByZWNpc2lvblAgPSBEX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2cnOgotICAgICAgKnByZWNpc2lvblAgPSBHX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdoJzoKLSAgICAgICpwcmVjaXNpb25QID0gSF9QUkVDSVNJT047Ci0gICAgICAqZXhwb25lbnRfYml0c1AgPSAxNTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHZhbCA9IDY5OwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gKHJldHZhbCk7Ci19Ci0MCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKgkJCQkJCQkJCSoKLSAqCVdhcm5pbmc6IHRoaXMgcmV0dXJucyAxNi1iaXQgTElUVExFTlVNcywgYmVjYXVzZSB0aGF0IGlzCSoKLSAqCXdoYXQgdGhlIFZBWCB0aGlua3MgaW4uIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZmlndXJlCSoKLSAqCW91dCBhbnkgYWxpZ25tZW50IHByb2JsZW1zIGFuZCB0byBjb25zcGlyZSBmb3IgdGhlIGJ5dGVzL3dvcmQJKgotICoJdG8gYmUgZW1pdHRlZCBpbiB0aGUgcmlnaHQgb3JkZXIuIEJpZ2VuZGlhbnMgYmV3YXJlIQkJKgotICoJCQkJCQkJCQkqCi0gXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgY2hhciAqCQkJCS8qIFJldHVybiBwb2ludGVyIHBhc3QgdGV4dCBjb25zdW1lZC4gKi8KLWF0b2ZfdmF4IChzdHIsIHdoYXRfa2luZCwgd29yZHMpCi0gICAgIGNoYXIgKnN0cjsJCQkvKiBUZXh0IHRvIGNvbnZlcnQgdG8gYmluYXJ5LiAqLwotICAgICBpbnQgd2hhdF9raW5kOwkJLyogJ2QnLCAnZicsICdnJywgJ2gnICovCi0gICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsJLyogQnVpbGQgdGhlIGJpbmFyeSBoZXJlLiAqLwotewotICBGTE9OVU1fVFlQRSBmOwotICBMSVRUTEVOVU1fVFlQRSBiaXRzW01BWF9QUkVDSVNJT04gKyBNQVhfUFJFQ0lTSU9OICsgR1VBUkRdOwotICAvKiBFeHRyYSBiaXRzIGZvciB6ZXJvZWQgbG93LW9yZGVyIGJpdHMuICovCi0gIC8qIFRoZSAxc3QgTUFYX1BSRUNJU0lPTiBhcmUgemVyb2VkLCAqLwotICAvKiB0aGUgbGFzdCBjb250YWluIGZsb251bSBiaXRzLiAqLwotICBjaGFyICpyZXR1cm5fdmFsdWU7Ci0gIGludCBwcmVjaXNpb247CQkvKiBOdW1iZXIgb2YgMTYtYml0IHdvcmRzIGluIHRoZSBmb3JtYXQuICovCi0gIGxvbmcgZXhwb25lbnRfYml0czsKLQotICByZXR1cm5fdmFsdWUgPSBzdHI7Ci0gIGYubG93ID0gYml0cyArIE1BWF9QUkVDSVNJT047Ci0gIGYuaGlnaCA9IE5VTEw7Ci0gIGYubGVhZGVyID0gTlVMTDsKLSAgZi5leHBvbmVudCA9IDA7Ci0gIGYuc2lnbiA9ICdcMCc7Ci0KLSAgaWYgKHdoYXRfa2luZF9vZl9mbG9hdCAod2hhdF9raW5kLCAmcHJlY2lzaW9uLCAmZXhwb25lbnRfYml0cykpCi0gICAgewotICAgICAgcmV0dXJuX3ZhbHVlID0gTlVMTDsJLyogV2UgbG9zdC4gKi8KLSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLSAgICB9Ci0KLSAgaWYgKHJldHVybl92YWx1ZSkKLSAgICB7Ci0gICAgICBtZW1zZXQgKGJpdHMsICdcMCcsIHNpemVvZiAoTElUVExFTlVNX1RZUEUpICogTUFYX1BSRUNJU0lPTik7Ci0KLSAgICAgIC8qIFVzZSBtb3JlIExpdHRsZU51bXMgdGhhbiBzZWVtcyAqLwotICAgICAgLyogbmVjZXNzYXJ5OiB0aGUgaGlnaGVzdCBmbG9udW0gbWF5IGhhdmUgKi8KLSAgICAgIC8qIDE1IGxlYWRpbmcgMCBiaXRzLCBzbyBjb3VsZCBiZSB1c2VsZXNzLiAqLwotICAgICAgZi5oaWdoID0gZi5sb3cgKyBwcmVjaXNpb24gLSAxICsgR1VBUkQ7Ci0KLSAgICAgIGlmIChhdG9mX2dlbmVyaWMgKCZyZXR1cm5fdmFsdWUsICIuIiwgImVFIiwgJmYpKQotCXsKLQkgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLQkgIHJldHVybl92YWx1ZSA9IE5VTEw7CS8qIHdlIGxvc3QgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGZsb251bV9nZW4ydmF4ICh3aGF0X2tpbmQsICZmLCB3b3JkcykpCi0JICAgIHsKLQkgICAgICByZXR1cm5fdmFsdWUgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQkJCQkvKiBhdG9mX3ZheCgpICovCi0MCi0vKgotICogSW46IGEgZmxvbnVtLCBhIHZheCBmbG9hdGluZyBwb2ludCBmb3JtYXQuCi0gKiBPdXQ6IGEgdmF4IGZsb2F0aW5nLXBvaW50IGJpdCBwYXR0ZXJuLgotICovCi0KLWludAkJCQkvKiAwOiBPSy4gKi8KLWZsb251bV9nZW4ydmF4IChmb3JtYXRfbGV0dGVyLCBmLCB3b3JkcykKLSAgICAgaW50IGZvcm1hdF9sZXR0ZXI7CQkvKiBPbmUgb2YgJ2QnICdmJyAnZycgJ2gnLiAqLwotICAgICBGTE9OVU1fVFlQRSAqZjsKLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBEZWxpdmVyIGFuc3dlciBoZXJlLiAqLwotewotICBMSVRUTEVOVU1fVFlQRSAqbHA7Ci0gIGludCBwcmVjaXNpb247Ci0gIGxvbmcgZXhwb25lbnRfYml0czsKLSAgaW50IHJldHVybl92YWx1ZTsJCS8qIDAgPT0gT0suICovCi0KLSAgcmV0dXJuX3ZhbHVlID0gd2hhdF9raW5kX29mX2Zsb2F0IChmb3JtYXRfbGV0dGVyLCAmcHJlY2lzaW9uLCAmZXhwb25lbnRfYml0cyk7Ci0KLSAgaWYgKHJldHVybl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZi0+bG93ID4gZi0+bGVhZGVyKQotCXsKLQkgIC8qIDAuMGUwIHNlZW4uICovCi0JICBtZW1zZXQgKHdvcmRzLCAnXDAnLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIHByZWNpc2lvbik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvbmcgZXhwb25lbnRfMTsKLQkgIGxvbmcgZXhwb25lbnRfMjsKLQkgIGxvbmcgZXhwb25lbnRfMzsKLQkgIGxvbmcgZXhwb25lbnRfNDsKLQkgIGludCBleHBvbmVudF9za2lwcGFnZTsKLQkgIExJVFRMRU5VTV9UWVBFIHdvcmQxOwotCi0JICAvKiBKRjogRGVhbCB3aXRoIG5ldyBOYW4sICtJbmYgYW5kIC1JbmYgY29kZXMgKi8KLQkgIGlmIChmLT5zaWduICE9ICctJyAmJiBmLT5zaWduICE9ICcrJykKLQkgICAgewotCSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLQkgICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotCSAgICB9Ci0JICAvKgotCQkJICogQWxsIHZheGVuIGZsb2F0aW5nX3BvaW50IGZvcm1hdHMgKHNvIGZhcikgaGF2ZToKLQkJCSAqIEJpdCAxNSBpcyBzaWduIGJpdC4KLQkJCSAqIEJpdHMgMTQ6biBhcmUgZXhjZXNzLXdoYXRldmVyIGV4cG9uZW50LgotCQkJICogQml0cyBuLTE6MCAoaWYgYW55KSBhcmUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIGZyYWN0aW9uLgotCQkJICogQml0cyAxNTowIG9mIHRoZSBuZXh0IHdvcmQgYXJlIHRoZSBuZXh0IG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KLQkJCSAqIEFuZCBzbyBvbiBmb3IgZWFjaCBvdGhlciB3b3JkLgotCQkJICoKLQkJCSAqIEFsbCB0aGlzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBhIEtGMTE/PyAoV2hpY2ggaXMgc3RpbGwgZmFzdGVyCi0JCQkgKiB0aGFuIGxvdHMgb2YgdmF4ZW4gSSBjYW4gdGhpbmsgb2YsIGJ1dCBpdCBhbHNvIGhhcyBoaWdoZXIKLQkJCSAqIG1haW50ZW5hbmNlIGNvc3RzIC4uLiBzaWdoKS4KLQkJCSAqCi0JCQkgKiBTbyB3ZSBuZWVkOiBudW1iZXIgb2YgYml0cyBvZiBleHBvbmVudCwgbnVtYmVyIG9mIGJpdHMgb2YKLQkJCSAqIG1hbnRpc3NhLgotCQkJICovCi0KLSNpZmRlZiBORVZFUgkJCS8qKioqKioqIFRoaXMgemVyb2luZyBzZWVtcyByZWR1bmRhbnQgLSBEZWFuIDNtYXk4NiAqKioqKioqKioqLwotCSAgLyoKLQkJCSAqIE5vIG1hdHRlciBob3cgZmV3IGJpdHMgd2UgZ290IGJhY2sgZnJvbSB0aGUgYXRvZigpCi0JCQkgKiByb3V0aW5lLCBhZGQgZW5vdWdoIHplcm8gbGl0dGxlbnVtcyBzbyB0aGUgcmVzdCBvZiB0aGUKLQkJCSAqIGNvZGUgd29uJ3QgcnVuIG91dCBvZiAic2lnbmlmaWNhbnQiIGJpdHMgaW4gdGhlIG1hbnRpc3NhLgotCQkJICovCi0JICB7Ci0JICAgIExJVFRMRU5VTV9UWVBFICpsdHA7Ci0JICAgIGZvciAobHRwID0gZi0+bGVhZGVyICsgMTsKLQkJIGx0cCA8PSBmLT5sb3cgKyBwcmVjaXNpb247Ci0JCSBsdHArKykKLQkgICAgICB7Ci0JCSpsdHAgPSAwOwotCSAgICAgIH0KLQkgIH0KLSNlbmRpZgotCi0JICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCSAgbGl0dGxlbnVtX3BvaW50ZXIgPSBmLT5sZWFkZXI7Ci0JICBsaXR0bGVudW1fZW5kID0gZi0+bG93OwotCSAgLyogU2VlayAoYW5kIGZvcmdldCkgMXN0IHNpZ25pZmljYW50IGJpdCAqLwotCSAgZm9yIChleHBvbmVudF9za2lwcGFnZSA9IDA7Ci0JICAgICAgICFuZXh0X2JpdHMgKDEpOwotCSAgICAgICBleHBvbmVudF9za2lwcGFnZSsrKTs7Ci0KLQkgIGV4cG9uZW50XzEgPSBmLT5leHBvbmVudCArIGYtPmxlYWRlciArIDEgLSBmLT5sb3c7Ci0JICAvKiBSYWRpeCBMSVRUTEVOVU1fUkFESVgsIHBvaW50IGp1c3QgaGlnaGVyIHRoYW4gZi0+bGVhZGVyLiAqLwotCSAgZXhwb25lbnRfMiA9IGV4cG9uZW50XzEgKiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JICAvKiBSYWRpeCAyLiAqLwotCSAgZXhwb25lbnRfMyA9IGV4cG9uZW50XzIgLSBleHBvbmVudF9za2lwcGFnZTsKLQkgIC8qIEZvcmdldCBsZWFkaW5nIHplcm9zLCBmb3JnZXQgMXN0IGJpdC4gKi8KLQkgIGV4cG9uZW50XzQgPSBleHBvbmVudF8zICsgKDEgPDwgKGV4cG9uZW50X2JpdHMgLSAxKSk7Ci0JICAvKiBPZmZzZXQgZXhwb25lbnQuICovCi0KLQkgIGlmIChleHBvbmVudF80ICYgfm1hc2tbZXhwb25lbnRfYml0c10pCi0JICAgIHsKLQkgICAgICAvKgotCQkJCSAqIEV4cG9uZW50IG92ZXJmbG93LiBMb3NlIGltbWVkaWF0ZWx5LgotCQkJCSAqLwotCi0JICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCi0JICAgICAgLyoKLQkJCQkgKiBXZSBsZWF2ZSByZXR1cm5fdmFsdWUgYWxvbmU6IGFkbWl0IHdlIHJlYWQgdGhlCi0JCQkJICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCi0JCQkJICogYmVjYXVzZSB3ZSBjYW4ndCBlbmNvZGUgdGhlIG51bWJlci4KLQkJCQkgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbHAgPSB3b3JkczsKLQotCSAgICAgIC8qIFdvcmQgMS4gU2lnbiwgZXhwb25lbnQgYW5kIHBlcmhhcHMgaGlnaCBiaXRzLiAqLwotCSAgICAgIC8qIEFzc3VtZSAyJ3MgY29tcGxlbWVudCBpbnRlZ2Vycy4gKi8KLQkgICAgICB3b3JkMSA9ICgoKGV4cG9uZW50XzQgJiBtYXNrW2V4cG9uZW50X2JpdHNdKSA8PCAoMTUgLSBleHBvbmVudF9iaXRzKSkKLQkJICAgICAgIHwgKChmLT5zaWduID09ICcrJykgPyAwIDogMHg4MDAwKQotCQkgICAgICAgfCBuZXh0X2JpdHMgKDE1IC0gZXhwb25lbnRfYml0cykpOwotCSAgICAgICpscCsrID0gd29yZDE7Ci0KLQkgICAgICAvKiBUaGUgcmVzdCBvZiB0aGUgd29yZHMgYXJlIGp1c3QgbWFudGlzc2EgYml0cy4gKi8KLQkgICAgICBmb3IgKDsgbHAgPCB3b3JkcyArIHByZWNpc2lvbjsgbHArKykKLQkJewotCQkgICpscCA9IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKTsKLQkJfQotCi0JICAgICAgaWYgKG5leHRfYml0cyAoMSkpCi0JCXsKLQkJICAvKgotCQkJCQkgKiBTaW5jZSB0aGUgTkVYVCBiaXQgaXMgYSAxLCByb3VuZCBVUCB0aGUgbWFudGlzc2EuCi0JCQkJCSAqIFRoZSBjdW5uaW5nIGRlc2lnbiBvZiB0aGVzZSBoaWRkZW4tMSBmbG9hdHMgcGVybWl0cwotCQkJCQkgKiB1cyB0byBsZXQgdGhlIG1hbnRpc3NhIG92ZXJmbG93IGludG8gdGhlIGV4cG9uZW50LCBhbmQKLQkJCQkJICogaXQgJ2RvZXMgdGhlIHJpZ2h0IHRoaW5nJy4gSG93ZXZlciwgd2UgbG9zZSBpZiB0aGUKLQkJCQkJICogaGlnaGVzdC1vcmRlciBiaXQgb2YgdGhlIGxvd2VzdC1vcmRlciB3b3JkIGZsaXBzLgotCQkJCQkgKiBJcyB0aGF0IGNsZWFyPwotCQkJCQkgKi8KLQotCQkgIHVuc2lnbmVkIGxvbmcgY2Fycnk7Ci0KLQkJICAvKgotCQkJCQkgICNpZiAoc2l6ZW9mKGNhcnJ5KSkgPCAoKHNpemVvZihiaXRzWzBdKSAqIEJJVFNfUEVSX0NIQVIpICsgMikKLQkJCQkJICBQbGVhc2UgYWxsb3cgYXQgbGVhc3QgMSBtb3JlIGJpdCBpbiBjYXJyeSB0aGFuIGlzIGluIGEgTElUVExFTlVNLgotCQkJCQkgIFdlIG5lZWQgdGhhdCBleHRyYSBiaXQgdG8gaG9sZCBhIGNhcnJ5IGR1cmluZyBhIExJVFRMRU5VTSBjYXJyeQotCQkJCQkgIHByb3BhZ2F0aW9uLiBBbm90aGVyIGV4dHJhIGJpdCAoa2VwdCAwKSB3aWxsIGFzc3VyZSB1cyB0aGF0IHdlCi0JCQkJCSAgZG9uJ3QgZ2V0IGEgc3RpY2t5IHNpZ24gYml0IGFmdGVyIHNoaWZ0aW5nIHJpZ2h0LCBhbmQgdGhhdAotCQkJCQkgIHBlcm1pdHMgdXMgdG8gcHJvcGFnYXRlIHRoZSBjYXJyeSB3aXRob3V0IGFueSBtYXNraW5nIG9mIGJpdHMuCi0JCQkJCSAgI2VuZGlmCi0JCQkJCSAgKi8KLQkJICBmb3IgKGNhcnJ5ID0gMSwgbHAtLTsKLQkJICAgICAgIGNhcnJ5ICYmIChscCA+PSB3b3Jkcyk7Ci0JCSAgICAgICBscC0tKQotCQkgICAgewotCQkgICAgICBjYXJyeSA9ICpscCArIGNhcnJ5OwotCQkgICAgICAqbHAgPSBjYXJyeTsKLQkJICAgICAgY2FycnkgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkJICAgIH0KLQotCQkgIGlmICgod29yZDEgXiAqd29yZHMpICYgKDEgPDwgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpKSkKLQkJICAgIHsKLQkJICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCQkgICAgICAvKgotCQkJCQkJICogV2UgbGVhdmUgcmV0dXJuX3ZhbHVlIGFsb25lOiBhZG1pdCB3ZSByZWFkIHRoZQotCQkJCQkJICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCi0JCQkJCQkgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotCQkJCQkJICovCi0JCSAgICB9Ci0JCX0JCS8qIGlmICh3ZSBuZWVkZWQgdG8gcm91bmQgdXApICovCi0JICAgIH0JCQkvKiBpZiAoZXhwb25lbnQgb3ZlcmZsb3cpICovCi0JfQkJCS8qIGlmICgwLjBlMCkgKi8KLSAgICB9CQkJCS8qIGlmIChmbG9hdF90eXBlIHdhcyBPSykgKi8KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQkJCQkvKiBmbG9udW1fZ2VuMnZheCgpICovCi0KLQotLyogSkYgdGhpcyB1c2VkIHRvIGJlIGluIHZheC5jIGJ1dCB0aGlzIGxvb2tzIGxpa2UgYSBiZXR0ZXIgcGxhY2UgZm9yIGl0ICovCi0KLS8qCi0gKgkJbWRfYXRvZigpCi0gKgotICogSW46CWlucHV0X2xpbmVfcG9pbnRlci0+dGhlIDFzdCBjaGFyYWN0ZXIgb2YgYSBmbG9hdGluZy1wb2ludAotICoJCW51bWJlci4KLSAqCTEgbGV0dGVyIGRlbm90aW5nIHRoZSB0eXBlIG9mIHN0YXRlbWVudCB0aGF0IHdhbnRzIGEKLSAqCQliaW5hcnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHJldHVybmVkLgotICoJQWRkcmVzcyBvZiB3aGVyZSB0byBidWlsZCBmbG9hdGluZyBwb2ludCBsaXRlcmFsLgotICoJCUFzc3VtZWQgdG8gYmUgJ2JpZyBlbm91Z2gnLgotICoJQWRkcmVzcyBvZiB3aGVyZSB0byByZXR1cm4gc2l6ZSBvZiBsaXRlcmFsIChpbiBjaGFycykuCi0gKgotICogT3V0OglJbnB1dF9saW5lX3BvaW50ZXItPm9mIG5leHQgY2hhciBhZnRlciBmbG9hdGluZyBudW1iZXIuCi0gKglFcnJvciBtZXNzYWdlLCBvciAwLgotICoJRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbC4KLSAqCU51bWJlciBvZiBjaGFycyB3ZSB1c2VkIGZvciB0aGUgbGl0ZXJhbC4KLSAqLwotCi0jZGVmaW5lIE1BWElNVU1fTlVNQkVSX09GX0xJVFRMRU5VTVMgKDgpCS8qIEZvciAuaGZsb2F0cy4gKi8KLQotY2hhciAqCi1tZF9hdG9mICh3aGF0X3N0YXRlbWVudF90eXBlLCBsaXRlcmFsUCwgc2l6ZVApCi0gICAgIGludCB3aGF0X3N0YXRlbWVudF90eXBlOwotICAgICBjaGFyICpsaXRlcmFsUDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYSU1VTV9OVU1CRVJfT0ZfTElUVExFTlVNU107Ci0gIHJlZ2lzdGVyIGNoYXIga2luZF9vZl9mbG9hdDsKLSAgcmVnaXN0ZXIgaW50IG51bWJlcl9vZl9jaGFyczsKLSAgcmVnaXN0ZXIgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bVA7Ci0KLSAgc3dpdGNoICh3aGF0X3N0YXRlbWVudF90eXBlKQotICAgIHsKLSAgICBjYXNlICdGJzoJCQkvKiAuZmxvYXQgKi8KLSAgICBjYXNlICdmJzoJCQkvKiAuZmZsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gJ2YnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdEJzoJCQkvKiAuZG91YmxlICovCi0gICAgY2FzZSAnZCc6CQkJLyogLmRmbG9hdCAqLwotICAgICAga2luZF9vZl9mbG9hdCA9ICdkJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZyc6CQkJLyogLmdmbG9hdCAqLwotICAgICAga2luZF9vZl9mbG9hdCA9ICdnJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaCc6CQkJLyogLmhmbG9hdCAqLwotICAgICAga2luZF9vZl9mbG9hdCA9ICdoJzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGtpbmRfb2ZfZmxvYXQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfTsKLQotICBpZiAoa2luZF9vZl9mbG9hdCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBMSVRUTEVOVU1fVFlQRSAqbGltaXQ7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGF0b2ZfdmF4IChpbnB1dF9saW5lX3BvaW50ZXIsCi0JCQkJICAgICBraW5kX29mX2Zsb2F0LAotCQkJCSAgICAgd29yZHMpOwotICAgICAgLyoKLSAgICAgICAqIFRoZSBhdG9mX3ZheCgpIGJ1aWxkcyB1cCAxNi1iaXQgbnVtYmVycy4KLSAgICAgICAqIFNpbmNlIHRoZSBhc3NlbWJsZXIgbWF5IG5vdCBiZSBydW5uaW5nIG9uCi0gICAgICAgKiBhIGxpdHRsZS1lbmRpYW4gbWFjaGluZSwgYmUgdmVyeSBjYXJlZnVsIGFib3V0Ci0gICAgICAgKiBjb252ZXJ0aW5nIHdvcmRzIHRvIGNoYXJzLgotICAgICAgICovCi0gICAgICBudW1iZXJfb2ZfY2hhcnMgPSBhdG9mX3ZheF9zaXplb2YgKGtpbmRfb2ZfZmxvYXQpOwotICAgICAga25vdyAobnVtYmVyX29mX2NoYXJzIDw9IE1BWElNVU1fTlVNQkVSX09GX0xJVFRMRU5VTVMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaW1pdCA9IHdvcmRzICsgKG51bWJlcl9vZl9jaGFycyAvIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGZvciAobGl0dGxlbnVtUCA9IHdvcmRzOyBsaXR0bGVudW1QIDwgbGltaXQ7IGxpdHRsZW51bVArKykKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdGVyYWxQLCAqbGl0dGxlbnVtUCwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCSAgbGl0ZXJhbFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0JfTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBudW1iZXJfb2ZfY2hhcnMgPSAwOwotICAgIH07Ci0KLSAgKnNpemVQID0gbnVtYmVyX29mX2NoYXJzOwotICByZXR1cm4ga2luZF9vZl9mbG9hdCA/IE5VTEwgOiBfKCJCYWQgY2FsbCB0byBtZF9hdG9mKCkiKTsKLX0KLQotLyogZW5kIG9mIGF0b2YtdmF4LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvZS1pMzg2Y29mZi5jIGIvZ2FzL2NvbmZpZy9lLWkzODZjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZWQ3MjguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9lLWkzODZjb2ZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJlbXVsLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWkzODZjb2ZmX2JmZF9uYW1lICgpCi17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotI2RlZmluZSBlbXVsX2JmZF9uYW1lCWkzODZjb2ZmX2JmZF9uYW1lCi0jZGVmaW5lIGVtdWxfZm9ybWF0CSZjb2ZmX2Zvcm1hdF9vcHMKLQotI2RlZmluZSBlbXVsX25hbWUJImkzODZjb2ZmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIGkzODZjb2ZmCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4gMAotI2luY2x1ZGUgImVtdWwtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2UtaTM4NmVsZi5jIGIvZ2FzL2NvbmZpZy9lLWkzODZlbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE2NzAxZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2UtaTM4NmVsZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiZW11bC5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pMzg2ZWxmX2JmZF9uYW1lICgpCi17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotI2RlZmluZSBlbXVsX2JmZF9uYW1lCWkzODZlbGZfYmZkX25hbWUKLSNkZWZpbmUgZW11bF9mb3JtYXQJJmVsZl9mb3JtYXRfb3BzCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJpMzg2ZWxmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIGkzODZlbGYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAwCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvZS1taXBzZWNvZmYuYyBiL2dhcy9jb25maWcvZS1taXBzZWNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyZjcxYi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2UtbWlwc2Vjb2ZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJlbXVsLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICptaXBzZWNvZmZfYmZkX25hbWUgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1taXBzZWNvZmZfYmZkX25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJbWlwc2Vjb2ZmX2JmZF9uYW1lCi0jZGVmaW5lIGVtdWxfZm9ybWF0CSZlY29mZl9mb3JtYXRfb3BzCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJtaXBzYmVjb2ZmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIG1pcHNiZWNvZmYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAxCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKLQotI3VuZGVmICBlbXVsX25hbWUKLSN1bmRlZiAgZW11bF9zdHJ1Y3RfbmFtZQotI3VuZGVmICBlbXVsX2RlZmF1bHRfZW5kaWFuCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJtaXBzbGVjb2ZmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIG1pcHNsZWNvZmYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAwCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKLQotI3VuZGVmIGVtdWxfbmFtZQotI3VuZGVmIGVtdWxfc3RydWN0X25hbWUKLSN1bmRlZiBlbXVsX2RlZmF1bHRfZW5kaWFuCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJtaXBzZWNvZmYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2Vjb2ZmCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4gMgotI2luY2x1ZGUgImVtdWwtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2UtbWlwc2VsZi5jIGIvZ2FzL2NvbmZpZy9lLW1pcHNlbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhNzJmNS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2UtbWlwc2VsZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiZW11bC5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqbWlwc2VsZl9iZmRfbmFtZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW1pcHNlbGZfYmZkX25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJbWlwc2VsZl9iZmRfbmFtZQotI2RlZmluZSBlbXVsX2Zvcm1hdAkmZWxmX2Zvcm1hdF9vcHMKLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNiZWxmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIG1pcHNiZWxmCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4gMQotI2luY2x1ZGUgImVtdWwtdGFyZ2V0LmgiCi0KLSN1bmRlZiAgZW11bF9uYW1lCi0jdW5kZWYgIGVtdWxfc3RydWN0X25hbWUKLSN1bmRlZiAgZW11bF9kZWZhdWx0X2VuZGlhbgotCi0jZGVmaW5lIGVtdWxfbmFtZQkibWlwc2xlbGYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2xlbGYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAwCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKLQotI3VuZGVmIGVtdWxfbmFtZQotI3VuZGVmIGVtdWxfc3RydWN0X25hbWUKLSN1bmRlZiBlbXVsX2RlZmF1bHRfZW5kaWFuCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJtaXBzZWxmIgotI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIG1pcHNlbGYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAyCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvaXRibC1taXBzLmggYi9nYXMvY29uZmlnL2l0YmwtbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQ4MmJkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvaXRibC1taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0KLS8qIGl0YmwtbWlwcy5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIERlZmluZXMgZm9yIE1pcHMgaXRibCBjb3Agc3VwcG9ydCAqLwotCi0jaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKLQotLyogVmFsdWVzIGZvciBwcm9jZXNzb3JzIHdpbGwgYmUgZnJvbSAwIHRvIE5VTUJFUl9PRl9QUk9DRVNTT1JTLTEgKi8KLSNkZWZpbmUgTlVNQkVSX09GX1BST0NFU1NPUlMgNAotI2RlZmluZSBNQVhfQklUUE9TIDMxCi0KLS8qIE1pcHMgc3BlY2lmaWNzICovCi0jZGVmaW5lIE1JUFNfT1BDT0RFX0NPUDAgKDB4MjEpCS8qIENPUHorQ08sIGJpdHMgMzEtMjU6IDAxMDB6ejEgKi8KLSNkZWZpbmUgTUlQU19FTkNPREVfQ09QX05VTSh6KSAoKE1JUFNfT1BDT0RFX0NPUDB8ejw8MSk8PDI1KQotI2RlZmluZSBNSVBTX0lTX0NPUF9JTlNOKGluc24pICgoTUlQU19PUENPREVfQ09QMCYoaW5zbj4+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+aGVhZGVyLmFfbWFjaHR5cGUgPSAodikpCi0jZW5kaWYgLyogRVhFQ19NQUNISU5FX1RZUEUgKi8KLSNpZmRlZiBFWEVDX1ZFUlNJT04KLSNkZWZpbmUgSF9TRVRfVkVSU0lPTihoLHYpCQkoKGgpLT5oZWFkZXIuYV92ZXJzaW9uID0gKHYpKQotI2VuZGlmIC8qIEVYRUNfVkVSU0lPTiAqLwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc3RydWN0IGV4ZWMgaGVhZGVyOwkJLyogYS5vdXQgaGVhZGVyICovCi0gICAgbG9uZyBzdHJpbmdfdGFibGVfc2l6ZTsJLyogbmFtZXMgKyAnXDAnICsgc2l6ZW9mKGludCkgKi8KLSAgfQotCi1vYmplY3RfaGVhZGVyczsKLQotLyogdW51c2VkIGhvb2tzLiAqLwotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSwgYiwgYykJezt9Ci0jZGVmaW5lIG9ial9wcmVfd3JpdGVfaG9vayhhKQkJezt9Ci0KLSNpZiBfX1NURENfXwotc3RydWN0IGZpeDsKLSNlbmRpZgotZXh0ZXJuIHZvaWQgdGNfYW91dF9maXhfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqd2hlcmUsCi0JCQkJCSAgc3RydWN0IGZpeCAqZml4UCwKLQkJCQkJICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3MpKTsKLWV4dGVybiB2b2lkIHRjX2JvdXRfZml4X3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKndoZXJlLAotCQkJCQkgIHN0cnVjdCBmaXggKmZpeFAsCi0JCQkJCSAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzKSk7Ci0KLSNkZWZpbmUgQU9VVF9TVEFCUwotCi0vKiBlbmQgb2Ygb2JqLWJvdXQuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotY29mZi5jIGIvZ2FzL2NvbmZpZy9vYmotY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmRjNzNjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MjUgKzAsMCBAQAotLyogY29mZiBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBPQkpfSEVBREVSICJvYmotY29mZi5oIgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0vKiBJIHRoaW5rIHRoaXMgaXMgcHJvYmFibHkgYWx3YXlzIGNvcnJlY3QuICAqLwotI2lmbmRlZiBLRUVQX1JFTE9DX0lORk8KLSNkZWZpbmUgS0VFUF9SRUxPQ19JTkZPCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgb2JqX2NvZmZfYnNzIFBBUkFNUyAoKGludCkpOwotY29uc3QgY2hhciAqc19nZXRfbmFtZSBQQVJBTVMgKChzeW1ib2xTICogcykpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfbG4gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl9kZWYgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl9lbmRlZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2RpbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2xpbmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl9zaXplIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfc2NsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfdGFnIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfdmFsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfdHlwZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2lkZW50IFBBUkFNUyAoKGludCkpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2xvYyBQQVJBTVMoKGludCkpOwotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdXNlZCB0byBob2xkIHRoZSBzeW1ib2wgYnVpbHQgYnkgYSBzZXF1ZW5jZSBvZiBwc2V1ZG8tb3BzCi0gICBmcm9tIC5kZWYgYW5kIC5lbmRlZi4gICovCi1zdGF0aWMgc3ltYm9sUyAqZGVmX3N5bWJvbF9pbl9wcm9ncmVzczsKLQwKLS8qIHN0YWNrIHN0dWZmICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBjaHVua19zaXplOwotICAgIHVuc2lnbmVkIGxvbmcgZWxlbWVudF9zaXplOwotICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLSAgICBjaGFyICpkYXRhOwotICAgIHVuc2lnbmVkIGxvbmcgcG9pbnRlcjsKLSAgfQotc3RhY2s7Ci0KLXN0YXRpYyBzdGFjayAqCi1zdGFja19pbml0IChjaHVua19zaXplLCBlbGVtZW50X3NpemUpCi0gICAgIHVuc2lnbmVkIGxvbmcgY2h1bmtfc2l6ZTsKLSAgICAgdW5zaWduZWQgbG9uZyBlbGVtZW50X3NpemU7Ci17Ci0gIHN0YWNrICpzdDsKLQotICBzdCA9IChzdGFjayAqKSBtYWxsb2MgKHNpemVvZiAoc3RhY2spKTsKLSAgaWYgKCFzdCkKLSAgICByZXR1cm4gMDsKLSAgc3QtPmRhdGEgPSBtYWxsb2MgKGNodW5rX3NpemUpOwotICBpZiAoIXN0LT5kYXRhKQotICAgIHsKLSAgICAgIGZyZWUgKHN0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgc3QtPnBvaW50ZXIgPSAwOwotICBzdC0+c2l6ZSA9IGNodW5rX3NpemU7Ci0gIHN0LT5jaHVua19zaXplID0gY2h1bmtfc2l6ZTsKLSAgc3QtPmVsZW1lbnRfc2l6ZSA9IGVsZW1lbnRfc2l6ZTsKLSAgcmV0dXJuIHN0OwotfQotCi0jaWYgMAotLyogTm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLXN0YXRpYyB2b2lkCi1zdGFja19kZWxldGUgKHN0KQotICAgICBzdGFjayAqc3Q7Ci17Ci0gIGZyZWUgKHN0LT5kYXRhKTsKLSAgZnJlZSAoc3QpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBjaGFyICoKLXN0YWNrX3B1c2ggKHN0LCBlbGVtZW50KQotICAgICBzdGFjayAqc3Q7Ci0gICAgIGNoYXIgKmVsZW1lbnQ7Ci17Ci0gIGlmIChzdC0+cG9pbnRlciArIHN0LT5lbGVtZW50X3NpemUgPj0gc3QtPnNpemUpCi0gICAgewotICAgICAgc3QtPnNpemUgKz0gc3QtPmNodW5rX3NpemU7Ci0gICAgICBpZiAoKHN0LT5kYXRhID0geHJlYWxsb2MgKHN0LT5kYXRhLCBzdC0+c2l6ZSkpID09IChjaGFyICopIDApCi0JcmV0dXJuIChjaGFyICopIDA7Ci0gICAgfQotICBtZW1jcHkgKHN0LT5kYXRhICsgc3QtPnBvaW50ZXIsIGVsZW1lbnQsIHN0LT5lbGVtZW50X3NpemUpOwotICBzdC0+cG9pbnRlciArPSBzdC0+ZWxlbWVudF9zaXplOwotICByZXR1cm4gc3QtPmRhdGEgKyBzdC0+cG9pbnRlcjsKLX0KLQotc3RhdGljIGNoYXIgKgotc3RhY2tfcG9wIChzdCkKLSAgICAgc3RhY2sgKnN0OwotewotICBpZiAoc3QtPnBvaW50ZXIgPCBzdC0+ZWxlbWVudF9zaXplKQotICAgIHsKLSAgICAgIHN0LT5wb2ludGVyID0gMDsKLSAgICAgIHJldHVybiAoY2hhciAqKSAwOwotICAgIH0KLSAgc3QtPnBvaW50ZXIgLT0gc3QtPmVsZW1lbnRfc2l6ZTsKLSAgcmV0dXJuIHN0LT5kYXRhICsgc3QtPnBvaW50ZXI7Ci19Ci0MCi0vKgotICogTWFpbnRhaW4gYSBsaXN0IG9mIHRoZSB0YWduYW1lcyBvZiB0aGUgc3RydWN0cmVzLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWdfaGFzaDsKLQotc3RhdGljIHZvaWQKLXRhZ19pbml0ICgpCi17Ci0gIHRhZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10YWdfaW5zZXJ0IChuYW1lLCBzeW1ib2xQKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBjb25zdCBjaGFyICplcnJvcl9zdHJpbmc7Ci0KLSAgaWYgKChlcnJvcl9zdHJpbmcgPSBoYXNoX2phbSAodGFnX2hhc2gsIG5hbWUsIChjaGFyICopIHN5bWJvbFApKSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN0cnVjdHVyZSB0YWJsZSBmYWlsZWQ6ICVzIiksCi0JCW5hbWUsIGVycm9yX3N0cmluZyk7Ci0gICAgfQotfQotCi1zdGF0aWMgc3ltYm9sUyAqCi10YWdfZmluZCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIGlmICgqbmFtZSA9PSAnXycpCi0gICAgbmFtZSsrOwotI2VuZGlmIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KLSAgcmV0dXJuIChzeW1ib2xTICopIGhhc2hfZmluZCAodGFnX2hhc2gsIG5hbWUpOwotfQotCi1zdGF0aWMgc3ltYm9sUyAqCi10YWdfZmluZF9vcl9tYWtlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGlmICgoc3ltYm9sUCA9IHRhZ19maW5kIChuYW1lKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkgICAgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICAgICAgdGFnX2luc2VydCAoU19HRVRfTkFNRSAoc3ltYm9sUCksIHN5bWJvbFApOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotI2VuZGlmCi0gICAgfQkJCQkvKiBub3QgZm91bmQgKi8KLQotICByZXR1cm4gc3ltYm9sUDsKLX0KLQotLyogV2UgYWNjZXB0IHRoZSAuYnNzIGRpcmVjdGl2ZSB0byBzZXQgdGhlIHNlY3Rpb24gZm9yIGJhY2t3YXJkCi0gICBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBnYXMuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfYnNzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLSAgICBzdWJzZWdfbmV3ICgiLmJzcyIsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgZWxzZQotICAgIHNfbGNvbW0gKDApOwotfQotCi0vKiBIYW5kbGUgLndlYWsuICBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl93ZWFrIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gCi0gIGRvCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0jaWZkZWYgQkZEX0FTU0VNTEVSCi0gICAgICBTX1NFVF9XRUFLIChzeW1ib2xQKTsKLSNlbmRpZgotCi0jaWZkZWYgVEVfUEUKLSAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfTlRfV0VBSyk7Ci0jZWxzZQotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19XRUFLRVhUKTsKLSNlbmRpZgotCi0gICAgICBpZiAoYyA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCSAgICBjID0gJ1xuJzsKLQl9Ci0gICAgfQotICB3aGlsZSAoYyA9PSAnLCcpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLXN0YXRpYyB2b2lkIFNBX1NFVF9TWU1fVEFHTkRYIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7Ci0KLSNkZWZpbmUgR0VUX0ZJTEVOQU1FX1NUUklORyhYKSBcCi0oKGNoYXIqKSgmKChYKS0+c3lfc3ltYm9sLm9zdF9hdXhlbnQtPnhfZmlsZS54X24ueF9vZmZzZXQpKVsxXSkKLQotLyogQEAgSWNrLiAgKi8KLXN0YXRpYyBzZWdUCi1mZXRjaF9jb2ZmX2RlYnVnX3NlY3Rpb24gKCkKLXsKLSAgc3RhdGljIHNlZ1QgZGVidWdfc2VjdGlvbjsKLSAgaWYgKCFkZWJ1Z19zZWN0aW9uKQotICAgIHsKLSAgICAgIENPTlNUIGFzeW1ib2wgKnM7Ci0gICAgICBzID0gYmZkX21ha2VfZGVidWdfc3ltYm9sIChzdGRvdXRwdXQsIChjaGFyICopIDAsIDApOwotICAgICAgYXNzZXJ0IChzICE9IDApOwotICAgICAgZGVidWdfc2VjdGlvbiA9IHMtPnNlY3Rpb247Ci0gICAgfQotICByZXR1cm4gZGVidWdfc2VjdGlvbjsKLX0KLQotdm9pZAotU0FfU0VUX1NZTV9FTkRORFggKHN5bSwgdmFsKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIHN5bWJvbFMgKnZhbDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqZW50cnksICpwOwotCi0gIGVudHJ5ID0gJmNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlWzFdOwotICBwID0gY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHZhbCkpLT5uYXRpdmU7Ci0gIGVudHJ5LT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wID0gcDsKLSAgZW50cnktPmZpeF9lbmQgPSAxOwotfQotCi1zdGF0aWMgdm9pZAotU0FfU0VUX1NZTV9UQUdORFggKHN5bSwgdmFsKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIHN5bWJvbFMgKnZhbDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqZW50cnksICpwOwotCi0gIGVudHJ5ID0gJmNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlWzFdOwotICBwID0gY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHZhbCkpLT5uYXRpdmU7Ci0gIGVudHJ5LT51LmF1eGVudC54X3N5bS54X3RhZ25keC5wID0gcDsKLSAgZW50cnktPmZpeF90YWcgPSAxOwotfQotCi1zdGF0aWMgaW50Ci1TX0dFVF9EQVRBX1RZUEUgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICByZXR1cm4gY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmUtPnUuc3ltZW50Lm5fdHlwZTsKLX0KLQotaW50Ci1TX1NFVF9EQVRBX1RZUEUgKHN5bSwgdmFsKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGludCB2YWw7Ci17Ci0gIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlLT51LnN5bWVudC5uX3R5cGUgPSB2YWw7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLWludAotU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHJldHVybiBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3M7Ci19Ci0KLWludAotU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCB2YWwpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgaW50IHZhbDsKLXsKLSAgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gdmFsOwotICByZXR1cm4gdmFsOwotfQotCi0vKiBNZXJnZSBhIGRlYnVnIHN5bWJvbCBjb250YWluaW5nIGRlYnVnIGluZm9ybWF0aW9uIGludG8gYSBub3JtYWwgc3ltYm9sLiAqLwotCi12b2lkCi1jX3N5bWJvbF9tZXJnZSAoZGVidWcsIG5vcm1hbCkKLSAgICAgc3ltYm9sUyAqZGVidWc7Ci0gICAgIHN5bWJvbFMgKm5vcm1hbDsKLXsKLSAgU19TRVRfREFUQV9UWVBFIChub3JtYWwsIFNfR0VUX0RBVEFfVFlQRSAoZGVidWcpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAobm9ybWFsLCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWJ1ZykpOwotCi0gIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgPiBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChub3JtYWwpKQotICAgIHsKLSAgICAgIC8qIHRha2UgdGhlIG1vc3Qgd2UgaGF2ZSAqLwotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAobm9ybWFsLCBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykpOwotICAgIH0KLQotICBpZiAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpID4gMCkKLSAgICB7Ci0gICAgICAvKiBNb3ZlIGFsbCB0aGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIG1lbWNweSAoU1lNX0FVWElORk8gKG5vcm1hbCksIFNZTV9BVVhJTkZPIChkZWJ1ZyksCi0JICAgICAgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKQotCSAgICAgICAqIHNpemVvZiAoKlNZTV9BVVhJTkZPIChkZWJ1ZykpKSk7Ci0gICAgfQotCi0gIC8qIE1vdmUgdGhlIGRlYnVnIGZsYWdzLiAqLwotICBTRl9TRVRfREVCVUdfRklFTEQgKG5vcm1hbCwgU0ZfR0VUX0RFQlVHX0ZJRUxEIChkZWJ1ZykpOwotfQotCi12b2lkCi1jX2RvdF9maWxlX3N5bWJvbCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIC8qIEJGRCBjb252ZXJ0cyBmaWxlbmFtZSB0byBhIC5maWxlIHN5bWJvbCB3aXRoIGFuIGF1eCBlbnRyeS4gIEl0Ci0gICAgIGFsc28gaGFuZGxlcyBjaGFpbmluZy4gICovCi0gIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChmaWxlbmFtZSwgYmZkX2Fic19zZWN0aW9uX3B0ciwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX0ZJTEUpOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAxKTsKLQotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0gICAgaWYgKGxpc3RpbmcpCi0gICAgICB7Ci0JbGlzdGluZ19zb3VyY2VfZmlsZSAoZmlsZW5hbWUpOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc3ltYm9sIGlzIGZpcnN0IG9uIHRoZSBzeW1ib2wgY2hhaW4gKi8KLSAgaWYgKHN5bWJvbF9yb290UCAhPSBzeW1ib2xQKQotICAgIHsKLSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2luc2VydCAoc3ltYm9sUCwgc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICB9CQkJCS8qIGlmIG5vdCBmaXJzdCBvbiB0aGUgbGlzdCAqLwotfQotCi0vKiBMaW5lIG51bWJlciBoYW5kbGluZyAqLwotCi1zdHJ1Y3QgbGluZV9ubyB7Ci0gIHN0cnVjdCBsaW5lX25vICpuZXh0OwotICBmcmFnUyAqZnJhZzsKLSAgYWxlbnQgbDsKLX07Ci0KLWludCBjb2ZmX2xpbmVfYmFzZTsKLQotLyogU3ltYm9sIG9mIGxhc3QgZnVuY3Rpb24sIHdoaWNoIHdlIHNob3VsZCBoYW5nIGxpbmUjcyBvZmYgb2YuICAqLwotc3RhdGljIHN5bWJvbFMgKmxpbmVfZnN5bTsKLQotI2RlZmluZSBpbl9mdW5jdGlvbigpCQkobGluZV9mc3ltICE9IDApCi0jZGVmaW5lIGNsZWFyX2Z1bmN0aW9uKCkJKGxpbmVfZnN5bSA9IDApCi0jZGVmaW5lIHNldF9mdW5jdGlvbihGKQkJKGxpbmVfZnN5bSA9IChGKSwgY29mZl9hZGRfbGluZXN5bSAoRikpCi0KLQwKLXZvaWQKLWNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgbG9uZyAgIHN6ID0gKE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTICsgMSkgKiBzaXplb2YgKGNvbWJpbmVkX2VudHJ5X3R5cGUpOwotICBjaGFyICogcyAgPSAoY2hhciAqKSB4bWFsbG9jIChzeik7Ci0gIAotICBtZW1zZXQgKHMsIDAsIHN6KTsKLSAgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApKS0+bmF0aXZlID0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgczsKLQotICBTX1NFVF9EQVRBX1RZUEUgKHN5bWJvbFAsIFRfTlVMTCk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIDApOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAwKTsKLQotICBpZiAoU19JU19TVFJJTkcgKHN5bWJvbFApKQotICAgIFNGX1NFVF9TVFJJTkcgKHN5bWJvbFApOwotICAKLSAgaWYgKFNfSVNfTE9DQUwgKHN5bWJvbFApKQotICAgIFNGX1NFVF9MT0NBTCAoc3ltYm9sUCk7Ci19Ci0KLQwKLS8qCi0gKiBIYW5kbGUgLmxuIGRpcmVjdGl2ZXMuCi0gKi8KLQotc3RhdGljIHN5bWJvbFMgKmN1cnJlbnRfbGluZW5vX3N5bTsKLXN0YXRpYyBzdHJ1Y3QgbGluZV9ubyAqbGluZV9ub3M7Ci0vKiBAQCBCbGluZGx5IGFzc3VtZSBhbGwgLmxuIGRpcmVjdGl2ZXMgd2lsbCBiZSBpbiB0aGUgLnRleHQgc2VjdGlvbi4uLiAgKi8KLWludCBjb2ZmX25fbGluZV9ub3M7Ci0KLXN0YXRpYyB2b2lkCi1hZGRfbGluZW5vIChmcmFnLCBvZmZzZXQsIG51bSkKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGludCBudW07Ci17Ci0gIHN0cnVjdCBsaW5lX25vICpuZXdfbGluZSA9Ci0gICAgKHN0cnVjdCBsaW5lX25vICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxpbmVfbm8pKTsKLSAgaWYgKCFjdXJyZW50X2xpbmVub19zeW0pCi0gICAgewotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBpZiAobnVtIDw9IDApIAotICAgIHsKLSAgICAgIC8qIFplcm8gaXMgdXNlZCBhcyBhbiBlbmQgbWFya2VyIGluIHRoZSBmaWxlLiAgKi8KLSAgICAgIGFzX2JhZCAoXygiTGluZSBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnNcbiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIG5ld19saW5lLT5uZXh0ID0gbGluZV9ub3M7Ci0gIG5ld19saW5lLT5mcmFnID0gZnJhZzsKLSAgbmV3X2xpbmUtPmwubGluZV9udW1iZXIgPSBudW07Ci0gIG5ld19saW5lLT5sLnUub2Zmc2V0ID0gb2Zmc2V0OwotICBsaW5lX25vcyA9IG5ld19saW5lOwotICBjb2ZmX25fbGluZV9ub3MrKzsKLX0KLQotdm9pZAotY29mZl9hZGRfbGluZXN5bSAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGlmIChsaW5lX25vcykKLSAgICB7Ci0gICAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoY3VycmVudF9saW5lbm9fc3ltKSktPmxpbmVubyA9Ci0JKGFsZW50ICopIGxpbmVfbm9zOwotICAgICAgY29mZl9uX2xpbmVfbm9zKys7Ci0gICAgICBsaW5lX25vcyA9IDA7Ci0gICAgfQotICBjdXJyZW50X2xpbmVub19zeW0gPSBzeW07Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9sbiAoYXBwbGluZSkKLSAgICAgaW50IGFwcGxpbmU7Ci17Ci0gIGludCBsOwotCi0gIGlmICghIGFwcGxpbmUgJiYgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5sbiBwc2V1ZG8tb3AgaW5zaWRlIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKCFhcHBsaW5lKQotICAgIHsKLSAgICAgIGFkZF9saW5lbm8gKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIGwpOwotICAgIH0KLQotICBpZiAoYXBwbGluZSkKLSAgICBuZXdfbG9naWNhbF9saW5lICgoY2hhciAqKSBOVUxMLCBsIC0gMSk7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICB7Ci0gICAgZXh0ZXJuIGludCBsaXN0aW5nOwotCi0gICAgaWYgKGxpc3RpbmcpCi0gICAgICB7Ci0JaWYgKCEgYXBwbGluZSkKLQkgIGwgKz0gY29mZl9saW5lX2Jhc2UgLSAxOwotCWxpc3Rpbmdfc291cmNlX2xpbmUgKGwpOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiAubG9jIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIC5sbjsgcGFyc2UgaXQgZm9yIGFzc2VtYmxlcgotICAgY29tcGF0aWJpbGl0eS4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9sb2MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgbGluZW5vOwotCi0gIC8qIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCB0aGlzIGNoZWNrPyAgV2UgbmVlZCBpdCBmb3IgRUNPRkYsIGJ1dCB3aHkKLSAgICAgZG8gd2UgbmVlZCBpdCBmb3IgQ09GRj8gICovCi0gIGlmIChub3dfc2VnICE9IHRleHRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIubG9jIG91dHNpZGUgb2YgLnRleHQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5sb2MgcHNldWRvLW9wIGluc2lkZSAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBTa2lwIHRoZSBmaWxlIG51bWJlci4gICovCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBsaW5lbm8gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0KLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLSAgICAgICAgbGluZW5vICs9IGNvZmZfbGluZV9iYXNlIC0gMTsKLQlsaXN0aW5nX3NvdXJjZV9saW5lIChsaW5lbm8pOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGFkZF9saW5lbm8gKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIGxpbmVubyk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmlkZW50IHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9pZGVudCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHNlZ1QgY3VycmVudF9zZWcgPSBub3dfc2VnOwotICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotI2lmZGVmIFRFX1BFCi0gIHsKLSAgICBzZWdUIHNlYzsKLQotICAgIC8qIFdlIGNvdWxkIHB1dCBpdCBpbiAuY29tbWVudCwgYnV0IHRoYXQgY3JlYXRlcyBhbiBleHRyYSBzZWN0aW9uCi0gICAgICAgdGhhdCBzaG91bGRuJ3QgYmUgbG9hZGVkIGludG8gbWVtb3J5LCB3aGljaCByZXF1aXJlcyBsaW5rZXIKLSAgICAgICBjaGFuZ2VzLi4uICBGb3Igbm93LCB1bnRpbCBwcm92ZW4gb3RoZXJ3aXNlLCB1c2UgLnJkYXRhLiAgKi8KLSAgICBzZWMgPSBzdWJzZWdfbmV3ICgiLnJkYXRhJHp6eiIsIDApOwotICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMsCi0JCQkgICAoKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZIHwgU0VDX0RBVEEpCi0JCQkgICAgJiBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpKSk7Ci0gIH0KLSNlbHNlCi0gIHN1YnNlZ19uZXcgKCIuY29tbWVudCIsIDApOwotI2VuZGlmCi0KLSAgc3RyaW5nZXIgKDEpOwotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwotfQotCi0vKgotICoJCQlkZWYoKQotICoKLSAqIEhhbmRsZSAuZGVmIGRpcmVjdGl2ZXMuCi0gKgotICogT25lIG1pZ2h0IGFzayA6IHdoeSBjYW4ndCB3ZSBzeW1ib2xfbmV3IGlmIHRoZSBzeW1ib2wgZG9lcyBub3QKLSAqIGFscmVhZHkgZXhpc3QgYW5kIGZpbGwgaXQgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbi4gIEJlY2F1c2Ugb2YKLSAqIHRoZSBDX0VGQ04gc3BlY2lhbCBzeW1ib2wuIEl0IHdvdWxkIGNsb2JiZXIgdGhlIHZhbHVlIG9mIHRoZQotICogZnVuY3Rpb24gc3ltYm9sIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIG5vdGljZSB0aGF0IGl0IGlzCi0gKiBhIENfRUZDTi4gQW5kIGEgc2Vjb25kIHJlYXNvbiBpcyB0aGF0IHRoZSBjb2RlIGlzIG1vcmUgY2xlYXIgdGhpcwotICogd2F5LiAoYXQgbGVhc3QgSSB0aGluayBpdCBpcyA6LSkuCi0gKgotICovCi0KLSNkZWZpbmUgU0tJUF9TRU1JX0NPTE9OKCkJd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnOycpCi0jZGVmaW5lIFNLSVBfV0hJVEVTUEFDRVMoKQl3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcgfHwgXAotCQkJCSAgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID09ICdcdCcpIFwKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RlZiAod2hhdCkKLSAgICAgaW50IHdoYXQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciBuYW1lX2VuZDsJCS8qIENoYXIgYWZ0ZXIgdGhlIGVuZCBvZiBuYW1lICovCi0gIGNoYXIgKnN5bWJvbF9uYW1lOwkJLyogTmFtZSBvZiB0aGUgZGVidWcgc3ltYm9sICovCi0gIGNoYXIgKnN5bWJvbF9uYW1lX2NvcHk7CS8qIFRlbXBvcmFyeSBjb3B5IG9mIHRoZSBuYW1lICovCi0gIHVuc2lnbmVkIGludCBzeW1ib2xfbmFtZV9sZW5ndGg7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZGVmIHBzZXVkby1vcCB1c2VkIGluc2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNLSVBfV0hJVEVTUEFDRVMgKCk7Ci0KLSAgc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0jaWZkZWYgU1RSSVBfVU5ERVJTQ09SRQotICBpZiAoc3ltYm9sX25hbWVbMF0gPT0gJ18nICYmIHN5bWJvbF9uYW1lWzFdICE9IDApCi0gICAgc3ltYm9sX25hbWUrKzsKLSNlbmRpZiAvKiBTVFJJUF9VTkRFUlNDT1JFICovCi0KLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltYm9sX25hbWVfbGVuZ3RoID0gc3RybGVuIChzeW1ib2xfbmFtZSk7Ci0gIHN5bWJvbF9uYW1lX2NvcHkgPSB4bWFsbG9jIChzeW1ib2xfbmFtZV9sZW5ndGggKyAxKTsKLSAgc3RyY3B5IChzeW1ib2xfbmFtZV9jb3B5LCBzeW1ib2xfbmFtZSk7Ci0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lX2NvcHkgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lX2NvcHkpOwotI2VuZGlmCi0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgbmV3IHN5bWJvbCAqLwotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzID0gc3ltYm9sX21ha2UgKHN5bWJvbF9uYW1lX2NvcHkpOwotICBzeW1ib2xfc2V0X2ZyYWcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAwKTsKLQotICBpZiAoU19JU19TVFJJTkcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgIFNGX1NFVF9TVFJJTkcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi11bnNpZ25lZCBpbnQgZGltX2luZGV4OwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfZW5kZWYgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIC8qIERJTSBCVUcgRklYIHNhY0BjeWdudXMuY29tICovCi0gIGRpbV9pbmRleCA9IDA7Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVuZGVmIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICAvKiBTZXQgdGhlIHNlY3Rpb24gbnVtYmVyIGFjY29yZGluZyB0byBzdG9yYWdlIGNsYXNzLiAqLwotICBzd2l0Y2ggKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgIHsKLSAgICBjYXNlIENfU1RSVEFHOgotICAgIGNhc2UgQ19FTlRBRzoKLSAgICBjYXNlIENfVU5UQUc6Ci0gICAgICBTRl9TRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBDX0ZJTEU6Ci0gICAgY2FzZSBDX1RQREVGOgotICAgICAgU0ZfU0VUX0RFQlVHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGZldGNoX2NvZmZfZGVidWdfc2VjdGlvbiAoKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19FRkNOOgotICAgICAgU0ZfU0VUX0xPQ0FMIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsJLyogRG8gbm90IGVtaXQgdGhpcyBzeW1ib2wuICovCi0gICAgICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgQ19CTE9DSzoKLSAgICAgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsJLyogV2lsbCBuZWVkIHByb2Nlc3NpbmcgYmVmb3JlIHdyaXRpbmcgKi8KLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBDX0ZDTjoKLSAgICAgIHsKLQlDT05TVCBjaGFyICpuYW1lOwotCVNfU0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHRleHRfc2VjdGlvbik7Ci0KLQluYW1lID0gU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0JaWYgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMl0gPT0gJ2YnICYmIG5hbWVbM10gPT0gJ1wwJykKLSAgCSAgewotCSAgICBzd2l0Y2ggKG5hbWVbMV0pCi0JICAgICAgewotCSAgICAgIGNhc2UgJ2InOiAgCi0JCS8qIC5iZiAqLwotCQlpZiAoISBpbl9mdW5jdGlvbiAoKSkKLQkJICBhc193YXJuIChfKCJgJXMnIHN5bWJvbCB3aXRob3V0IHByZWNlZGluZyBmdW5jdGlvbiIpLCBuYW1lKTsKLQkJLyogV2lsbCBuZWVkIHJlbG9jYXRpbmcuICAqLwotCQlTRl9TRVRfUFJPQ0VTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0JCWNsZWFyX2Z1bmN0aW9uICgpOwotCQlicmVhazsKLSNpZmRlZiBURV9QRQotCSAgICAgIGNhc2UgJ2UnOiAgCi0JCS8qIC5lZiAqLwotCQkvKiBUaGUgTVMgY29tcGlsZXJzIG91dHB1dCB0aGUgYWN0dWFsIGVuZGxpbmUsIG5vdCB0aGUKLQkJICAgZnVuY3Rpb24tcmVsYXRpdmUgb25lLi4uIHdlIHdhbnQgdG8gbWF0Y2ggd2l0aG91dAotCQkgICBjaGFuZ2luZyB0aGUgYXNzZW1ibGVyIGlucHV0LiAgKi8KLQkJU0FfU0VUX1NZTV9MTk5PIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAKLQkJCQkgKFNBX0dFVF9TWU1fTE5OTyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykKLQkJCQkgICsgY29mZl9saW5lX2Jhc2UpKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotI2lmZGVmIENfQVVUT0FSRwotICAgIGNhc2UgQ19BVVRPQVJHOgotI2VuZGlmIC8qIENfQVVUT0FSRyAqLwotICAgIGNhc2UgQ19BVVRPOgotICAgIGNhc2UgQ19SRUc6Ci0gICAgY2FzZSBDX0FSRzoKLSAgICBjYXNlIENfUkVHUEFSTToKLSAgICBjYXNlIENfRklFTEQ6Ci0gICAgICBTRl9TRVRfREVCVUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19NT1M6Ci0gICAgY2FzZSBDX01PRToKLSAgICBjYXNlIENfTU9VOgotICAgIGNhc2UgQ19FT1M6Ci0gICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfV0VBS0VYVDoKLSNpZmRlZiBURV9QRQotICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0gICAgY2FzZSBDX1NUQVQ6Ci0gICAgY2FzZSBDX0xBQkVMOgotICAgICAgLyogVmFsaWQgYnV0IHNldCBzb21ld2hlcmUgZWxzZSAoc19jb21tLCBzX2xjb21tLCBjb2xvbikgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICBjYXNlIENfVVNUQVRJQzoKLSAgICBjYXNlIENfRVhUREVGOgotICAgIGNhc2UgQ19VTEFCRUw6Ci0gICAgICBhc193YXJuIChfKCJ1bmV4cGVjdGVkIHN0b3JhZ2UgY2xhc3MgJWQiKSwKLQkgICAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpOwotICAgICAgYnJlYWs7Ci0gICAgfQkJCQkvKiBzd2l0Y2ggb24gc3RvcmFnZSBjbGFzcyAqLwotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgYnVpbHQgYSBkZWJ1ZyBzeW1ib2wsIHRyeSB0byBmaW5kIGlmIHdlIHNob3VsZAotICAgICBtZXJnZSB3aXRoIGFuIGV4aXN0aW5nIHN5bWJvbCBvciBub3QuICBJZiBhIHN5bWJvbCBpcyBDX0VGQ04gb3IKLSAgICAgYWJzb2x1dGVfc2VjdGlvbiBvciB1bnRhZ2dlZCBTRUdfREVCVUcgaXQgbmV2ZXIgbWVyZ2VzLiAgV2UgYWxzbwotICAgICBkb24ndCBtZXJnZSBsYWJlbHMsIHdoaWNoIGFyZSBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UsIG5vcgotICAgICBzeW1ib2xzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuIGRlZmluZWQgc2luY2UgdGhleSBhcmUgdHlwaWNhbGx5Ci0gICAgIHVuaXF1ZSwgbm9yIGRvIHdlIG1lcmdlIHRhZ3Mgd2l0aCBub24tdGFncy4gICovCi0KLSAgLyogVHdvIGNhc2VzIGZvciBmdW5jdGlvbnMuICBFaXRoZXIgZGVidWcgZm9sbG93ZWQgYnkgZGVmaW5pdGlvbiBvcgotICAgICBkZWZpbml0aW9uIGZvbGxvd2VkIGJ5IGRlYnVnLiAgRm9yIGRlZmluaXRpb24gZmlyc3QsIHdlIHdpbGwKLSAgICAgbWVyZ2UgdGhlIGRlYnVnIHN5bWJvbCBpbnRvIHRoZSBkZWZpbml0aW9uLiAgRm9yIGRlYnVnIGZpcnN0LCB0aGUKLSAgICAgbGluZW5vIGVudHJ5IE1VU1QgcG9pbnQgdG8gdGhlIGRlZmluaXRpb24gZnVuY3Rpb24gb3IgZWxzZSBpdAotICAgICB3aWxsIHBvaW50IG9mZiBpbnRvIHNwYWNlIHdoZW4gb2JqX2NyYXdsX3N5bWJvbF9jaGFpbigpIG1lcmdlcwotICAgICB0aGUgZGVidWcgc3ltYm9sIGludG8gdGhlIHJlYWwgc3ltYm9sLiAgVGhlcmVmb3IsIGxldCdzIHByZXN1bWUKLSAgICAgdGhlIGRlYnVnIHN5bWJvbCBpcyBhIHJlYWwgZnVuY3Rpb24gcmVmZXJlbmNlLiAqLwotCi0gIC8qIEZJWE1FLVNPT04gSWYgZm9yIHNvbWUgcmVhc29uIHRoZSBkZWZpbml0aW9uIGxhYmVsL3N5bWJvbCBpcwotICAgICBuZXZlciBzZWVuLCB0aGlzIHdpbGwgcHJvYmFibHkgbGVhdmUgYW4gdW5kZWZpbmVkIHN5bWJvbCBhdCBsaW5rCi0gICAgIHRpbWUuICovCi0KLSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfRUZDTgotICAgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gQ19MQUJFTAotICAgICAgfHwgKCFzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsCi0JCQkJCSBTX0dFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSksCi0JCSAgICIqREVCVUcqIikKLQkgICYmICFTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICAgIHx8IFNfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IGFic29sdXRlX3NlY3Rpb24KLSAgICAgIHx8ICEgc3ltYm9sX2NvbnN0YW50X3AgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpCi0gICAgICB8fCAoc3ltYm9sUCA9IHN5bWJvbF9maW5kX2Jhc2UgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBET19OT1RfU1RSSVApKSA9PSBOVUxMCi0gICAgICB8fCBTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSAhPSBTRl9HRVRfVEFHIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICAvKiBJZiBpdCBhbHJlYWR5IGlzIGF0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCBsaXN0LCBkbyBub3RoaW5nICovCi0gICAgICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBzeW1ib2xfbGFzdFApCi0gICAgICAgIHsKLQkgIHN5bWJvbF9yZW1vdmUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgc3ltYm9sX2FwcGVuZCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLAotCQkJICZzeW1ib2xfbGFzdFApOwotICAgICAgICB9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBzeW1ib2wgYWxyZWFkeSBleGlzdHMsIG1lcmdlIHRoZSBuZXdseSBjcmVhdGVkIHN5bWJvbAotCSBpbnRvIHRoZSBvbGQgb25lLiAgVGhpcyBpcyBub3QgbWFuZGF0b3J5LiBUaGUgbGlua2VyIGNhbgotCSBoYW5kbGUgZHVwbGljYXRlIHN5bWJvbHMgY29ycmVjdGx5LiBCdXQgSSBndWVzcyB0aGF0IGl0IHNhdmUKLQkgYSAqbG90KiBvZiBzcGFjZSBpZiB0aGUgYXNzZW1ibHkgZmlsZSBkZWZpbmVzIGEgbG90IG9mCi0JIHN5bWJvbHMuIFtsb2ljXSAqLwotCi0gICAgICAvKiBUaGUgZGVidWcgZW50cnkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpIGlzIG1lcmdlZCBpbnRvIHRoZQotCSBwcmV2aW91cyBkZWZpbml0aW9uLiAqLwotCi0gICAgICBjX3N5bWJvbF9tZXJnZSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sUCk7Ci0gICAgICBzeW1ib2xfcmVtb3ZlIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQotICAgICAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9IHN5bWJvbFA7Ci0KLSAgICAgIGlmIChTRl9HRVRfRlVOQ1RJT04gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpCi0JICB8fCBTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKQotCSAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gQ19TVEFUKQotCXsKLQkgIC8qIEZvciBmdW5jdGlvbnMsIGFuZCB0YWdzLCBhbmQgc3RhdGljIHN5bWJvbHMsIHRoZSBzeW1ib2wKLQkgICAgICptdXN0KiBiZSB3aGVyZSB0aGUgZGVidWcgc3ltYm9sIGFwcGVhcnMuICBNb3ZlIHRoZQotCSAgICAgZXhpc3Rpbmcgc3ltYm9sIHRvIHRoZSBjdXJyZW50IHBsYWNlLiAqLwotCSAgLyogSWYgaXQgYWxyZWFkeSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgbGlzdCwgZG8gbm90aGluZyAqLwotCSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gc3ltYm9sX2xhc3RQKQotCSAgICB7Ci0JICAgICAgc3ltYm9sX3JlbW92ZSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgc3ltYm9sX2FwcGVuZCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKm9sZHRhZzsKLQotICAgICAgb2xkdGFnID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksCi0JCQkJIERPX05PVF9TVFJJUCk7Ci0gICAgICBpZiAob2xkdGFnID09IE5VTEwgfHwgISBTRl9HRVRfVEFHIChvbGR0YWcpKQotCXRhZ19pbnNlcnQgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLAotCQkgICAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgfQotCi0gIGlmIChTRl9HRVRfRlVOQ1RJT04gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgIHsKLSAgICAgIGtub3cgKHNpemVvZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPD0gc2l6ZW9mIChsb25nKSk7Ci0gICAgICBzZXRfZnVuY3Rpb24gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCi0gICAgICBpZiAoc3ltYm9sUCA9PSBOVUxMKQotCXsKLQkgIC8qIFRoYXQgaXMsIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UndmUgc2VlbiB0aGUKLQkgICAgIGZ1bmN0aW9uLi4uICovCi0JICBzeW1ib2xfdGFibGVfaW5zZXJ0IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQl9IC8qIGRlZmluaXRpb24gZm9sbG93cyBkZWJ1ZyAqLwotICAgIH0gLyogQ3JlYXRlIHRoZSBsaW5lIG51bWJlciBlbnRyeSBwb2ludGluZyB0byB0aGUgZnVuY3Rpb24gYmVpbmcgZGVmaW5lZCAqLwotCi0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSBOVUxMOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfZGltIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IGRpbV9pbmRleDsKLQotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5kaW0gcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotCi0gIGZvciAoZGltX2luZGV4ID0gMDsgZGltX2luZGV4IDwgRElNTlVNOyBkaW1faW5kZXgrKykKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0VTICgpOwotICAgICAgU0FfU0VUX1NZTV9ESU1FTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZGltX2luZGV4LAotCQkJZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCi0gICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCWNhc2UgJywnOgotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhc193YXJuIChfKCJiYWRseSBmb3JtZWQgLmRpbSBkaXJlY3RpdmUgaWdub3JlZCIpKTsKLQkgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0JY2FzZSAnXG4nOgotCWNhc2UgJzsnOgotCSAgZGltX2luZGV4ID0gRElNTlVNOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCB0aGlzX2Jhc2U7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBQcm9iYWJseSBzdGFicy1zdHlsZSBsaW5lPyAgKi8KLSAgICAgIG9ial9jb2ZmX2xuICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdGhpc19iYXNlID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICghc3RyY21wICgiLmJmIiwgU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpKQotICAgIGNvZmZfbGluZV9iYXNlID0gdGhpc19iYXNlOwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHRoaXNfYmFzZSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGlmIChzdHJjbXAgKCIuYmYiLCBTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkgPT0gMCkKLSAgICB7Ci0gICAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0KLSAgICAgIGlmIChsaXN0aW5nKQotCWxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIHRoaXNfYmFzZSk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9zaXplIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuc2l6ZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLSAgU0FfU0VUX1NZTV9TSVpFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9zY2wgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdGFnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqc3ltYm9sX25hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudGFnIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLSAgc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKLSAgc3ltYm9sX25hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lKTsKLSNlbmRpZgotCi0gIC8qIEFzc3VtZSB0aGF0IHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgLnRhZyBpcyBhbHdheXMgZGVmaW5lZC4KLSAgICAgVGhpcyB3YXMgYSBiYWQgYXNzdW1wdGlvbi4gIEkndmUgYWRkZWQgZmluZF9vcl9tYWtlLiB4b3hvcmljaC4gKi8KLSAgU0FfU0VUX1NZTV9UQUdORFggKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsCi0JCSAgICAgdGFnX2ZpbmRfb3JfbWFrZSAoc3ltYm9sX25hbWUpKTsKLSAgaWYgKFNBX0dFVF9TWU1fVEFHTkRYIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSAwTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJ0YWcgbm90IGZvdW5kIGZvciAudGFnICVzIiksIHN5bWJvbF9uYW1lKTsKLSAgICB9CQkJCS8qIG5vdCBkZWZpbmVkICovCi0KLSAgU0ZfU0VUX1RBR0dFRCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdHlwZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnR5cGUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfREFUQV9UWVBFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgaWYgKElTRkNOIChTX0dFVF9EQVRBX1RZUEUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKSAmJgotICAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgIT0gQ19UUERFRikKLSAgICB7Ci0gICAgICBTRl9TRVRfRlVOQ1RJT04gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgIH0JCQkJLyogaXMgYSBmdW5jdGlvbiAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl92YWwgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi52YWwgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgY2hhciBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZSk7Ci0jZW5kaWYKLSAgICAgIGlmICghc3RyY21wIChzeW1ib2xfbmFtZSwgIi4iKSkKLQl7Ci0JICBzeW1ib2xfc2V0X2ZyYWcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGZyYWdfbm93KTsKLQkgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCSAgLyogSWYgdGhlIC52YWwgaXMgIT0gZnJvbSB0aGUgLmRlZiAoZS5nLiBzdGF0aWNzKSAqLwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksIHN5bWJvbF9uYW1lKSkKLQl7Ci0JICBleHByZXNzaW9uUyBleHA7Ci0KLQkgIGV4cC5YX29wID0gT19zeW1ib2w7Ci0JICBleHAuWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoc3ltYm9sX25hbWUpOwotCSAgZXhwLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotCSAgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAmZXhwKTsKLQotCSAgLyogSWYgdGhlIHNlZ21lbnQgaXMgdW5kZWZpbmVkIHdoZW4gdGhlIGZvcndhcmQgcmVmZXJlbmNlIGlzCi0JICAgICByZXNvbHZlZCwgdGhlbiBjb3B5IHRoZSBzZWdtZW50IGlkIGZyb20gdGhlIGZvcndhcmQKLQkgICAgIHN5bWJvbC4gICovCi0JICBTRl9TRVRfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCi0JICAvKiBGSVhNRTogZ2NjIGNhbiBnZW5lcmF0ZSBhZGRyZXNzIGV4cHJlc3Npb25zIGhlcmUgaW4KLQkgICAgIHVudXN1YWwgY2FzZXMgKHNlYXJjaCBmb3IgIm9ic2N1cmUiIGluIHNkYm91dC5jKS4gIFdlCi0JICAgICBqdXN0IGlnbm9yZSB0aGUgb2Zmc2V0IGhlcmUsIHRodXMgZ2VuZXJhdGluZyBpbmNvcnJlY3QKLQkgICAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFdlIGlnbm9yZSB0aGUgcmVzdCBvZiB0aGUgbGluZQotCSAgICAganVzdCBiZWxvdy4gICovCi0JfQotICAgICAgLyogT3RoZXJ3aXNlLCBpdCBpcyB0aGUgbmFtZSBvZiBhIG5vbiBkZWJ1ZyBzeW1ib2wgYW5kIGl0cyB2YWx1ZQotICAgICAgICAgd2lsbCBiZSBjYWxjdWxhdGVkIGxhdGVyLiAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gICAgfQkJCQkvKiBpZiBzeW1ib2wgYmFzZWQgKi8KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1jb2ZmX29ial9yZWFkX2JlZ2luX2hvb2sgKCkKLXsKLSAgLyogVGhlc2UgaGFkIGJldHRlciBiZSB0aGUgc2FtZS4gIFVzdWFsbHkgMTggYnl0ZXMuICovCi0jaWZuZGVmIEJGRF9IRUFERVJTCi0gIGtub3cgKHNpemVvZiAoU1lNRU5UKSA9PSBzaXplb2YgKEFVWEVOVCkpOwotICBrbm93IChTWU1FU1ogPT0gQVVYRVNaKTsKLSNlbmRpZgotICB0YWdfaW5pdCAoKTsKLX0KLQotCi1zeW1ib2xTICpjb2ZmX2xhc3RfZnVuY3Rpb247Ci1zdGF0aWMgc3ltYm9sUyAqY29mZl9sYXN0X2JmOwotCi12b2lkCi1jb2ZmX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50KQotICAgICBzeW1ib2xTICpzeW1wOwotICAgICBpbnQgKnB1bnQ7Ci17Ci0gIHN0YXRpYyBzeW1ib2xTICpsYXN0X3RhZ1A7Ci0gIHN0YXRpYyBzdGFjayAqYmxvY2tfc3RhY2s7Ci0gIHN0YXRpYyBzeW1ib2xTICpzZXRfZW5kOwotICBzeW1ib2xTICpuZXh0X3NldF9lbmQgPSBOVUxMOwotCi0gIGlmIChzeW1wID09ICZhYnNfc3ltYm9sKQotICAgIHsKLSAgICAgICpwdW50ID0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGN1cnJlbnRfbGluZW5vX3N5bSkKLSAgICBjb2ZmX2FkZF9saW5lc3ltICgoc3ltYm9sUyAqKSAwKTsKLQotICBpZiAoIWJsb2NrX3N0YWNrKQotICAgIGJsb2NrX3N0YWNrID0gc3RhY2tfaW5pdCAoNTEyLCBzaXplb2YgKHN5bWJvbFMqKSk7Ci0KLSAgaWYgKFNfSVNfV0VBSyAoc3ltcCkpCi0gICAgewotI2lmZGVmIFRFX1BFCi0gICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX05UX1dFQUspOwotI2Vsc2UKLSAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfV0VBS0VYVCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKCFTX0lTX0RFRklORUQgKHN5bXApCi0gICAgICAmJiAhU19JU19XRUFLIChzeW1wKQotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgIT0gQ19TVEFUKQotICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfRVhUKTsKLQotICBpZiAoIVNGX0dFVF9ERUJVRyAoc3ltcCkpCi0gICAgewotICAgICAgc3ltYm9sUyAqcmVhbDsKLSAgICAgIGlmICghU0ZfR0VUX0xPQ0FMIChzeW1wKQotCSAgJiYgIVNGX0dFVF9TVEFUSUNTIChzeW1wKQotCSAgJiYgKHJlYWwgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChzeW1wKSwgRE9fTk9UX1NUUklQKSkKLQkgICYmIHJlYWwgIT0gc3ltcCkKLQl7Ci0JICBjX3N5bWJvbF9tZXJnZSAoc3ltcCwgcmVhbCk7Ci0JICAqcHVudCA9IDE7Ci0JfQotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKHN5bXApICYmICFTRl9HRVRfTE9DQUwgKHN5bXApKQotCXsKLQkgIGFzc2VydCAoU19HRVRfVkFMVUUgKHN5bXApID09IDApOwotCSAgU19TRVRfRVhURVJOQUwgKHN5bXApOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApID09IENfTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltcCkgPT0gdGV4dF9zZWN0aW9uCi0JICAgICAgJiYgc3ltcCAhPSBzZWdfaW5mbyAodGV4dF9zZWN0aW9uKS0+c3ltKQotCSAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX0xBQkVMKTsKLQkgIGVsc2UKLQkgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCwgQ19TVEFUKTsKLQl9Ci0gICAgICBpZiAoU0ZfR0VUX1BST0NFU1MgKHN5bXApKQotCXsKLQkgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSA9PSBDX0JMT0NLKQotCSAgICB7Ci0JICAgICAgaWYgKCFzdHJjbXAgKFNfR0VUX05BTUUgKHN5bXApLCAiLmJiIikpCi0JCXN0YWNrX3B1c2ggKGJsb2NrX3N0YWNrLCAoY2hhciAqKSAmc3ltcCk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3ltYm9sUyAqYmVnaW47Ci0JCSAgYmVnaW4gPSAqKHN5bWJvbFMgKiopIHN0YWNrX3BvcCAoYmxvY2tfc3RhY2spOwotCQkgIGlmIChiZWdpbiA9PSAwKQotCQkgICAgYXNfd2FybiAoXygibWlzbWF0Y2hlZCAuZWIiKSk7Ci0JCSAgZWxzZQotCQkgICAgbmV4dF9zZXRfZW5kID0gYmVnaW47Ci0JCX0KLQkgICAgfQotCSAgaWYgKGNvZmZfbGFzdF9mdW5jdGlvbiA9PSAwICYmIFNGX0dFVF9GVU5DVElPTiAoc3ltcCkpCi0JICAgIHsKLQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eHA7Ci0JICAgICAgY29mZl9sYXN0X2Z1bmN0aW9uID0gc3ltcDsKLQkgICAgICBpZiAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltcCkgPCAxKQotCQlTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1wLCAxKTsKLQkgICAgICBhdXhwID0gU1lNX0FVWEVOVCAoc3ltcCk7Ci0JICAgICAgbWVtc2V0IChhdXhwLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuLCAwLAotCQkgICAgICBzaXplb2YgKGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW4pKTsKLQkgICAgfQotCSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApID09IENfRUZDTikKLQkgICAgewotCSAgICAgIGlmIChjb2ZmX2xhc3RfZnVuY3Rpb24gPT0gMCkKLQkJYXNfZmF0YWwgKF8oIkNfRUZDTiBzeW1ib2wgb3V0IG9mIHNjb3BlIikpOwotCSAgICAgIFNBX1NFVF9TWU1fRlNJWkUgKGNvZmZfbGFzdF9mdW5jdGlvbiwKLQkJCQkobG9uZykgKFNfR0VUX1ZBTFVFIChzeW1wKQotCQkJCQktIFNfR0VUX1ZBTFVFIChjb2ZmX2xhc3RfZnVuY3Rpb24pKSk7Ci0JICAgICAgbmV4dF9zZXRfZW5kID0gY29mZl9sYXN0X2Z1bmN0aW9uOwotCSAgICAgIGNvZmZfbGFzdF9mdW5jdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoU19JU19FWFRFUk5BTCAoc3ltcCkpCi0JU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCwgQ19FWFQpOwotICAgICAgZWxzZSBpZiAoU0ZfR0VUX0xPQ0FMIChzeW1wKSkKLQkqcHVudCA9IDE7Ci0KLSAgICAgIGlmIChTRl9HRVRfRlVOQ1RJT04gKHN5bXApKQotCXN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCi0gICAgICAvKiBtb3JlIC4uLiAqLwotICAgIH0KLQotICAvKiBEb3VibGUgY2hlY2sgd2VhayBzeW1ib2xzLiAgKi8KLSAgaWYgKFNfSVNfV0VBSyAoc3ltcCkgJiYgU19JU19DT01NT04gKHN5bXApKQotICAgIGFzX2JhZCAoXygiU3ltYm9sIGAlcycgY2FuIG5vdCBiZSBib3RoIHdlYWsgYW5kIGNvbW1vbiIpLAotCSAgICBTX0dFVF9OQU1FIChzeW1wKSk7Ci0KLSAgaWYgKFNGX0dFVF9UQUcgKHN5bXApKQotICAgIGxhc3RfdGFnUCA9IHN5bXA7Ci0gIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApID09IENfRU9TKQotICAgIG5leHRfc2V0X2VuZCA9IGxhc3RfdGFnUDsKLQotI2lmZGVmIE9CSl9YQ09GRgotICAvKiBUaGlzIGlzIHByZXR0eSBob3JyaWJsZSwgYnV0IHdlIGhhdmUgdG8gc2V0ICpwdW50IGNvcnJlY3RseSBpbgotICAgICBvcmRlciB0byBjYWxsIFNBX1NFVF9TWU1fRU5ETkRYIGNvcnJlY3RseS4gICovCi0gIGlmICghIHN5bWJvbF91c2VkX2luX3JlbG9jX3AgKHN5bXApCi0gICAgICAmJiAoKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDAKLQkgIHx8ICghIFNfSVNfRVhURVJOQUwgKHN5bXApCi0JICAgICAgJiYgISBzeW1ib2xfZ2V0X3RjIChzeW1wKS0+b3V0cHV0Ci0JICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgIT0gQ19GSUxFKSkpCi0gICAgKnB1bnQgPSAxOwotI2VuZGlmCi0KLSAgaWYgKHNldF9lbmQgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgISAqcHVudAotICAgICAgJiYgKChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPmZsYWdzICYgQlNGX05PVF9BVF9FTkQpICE9IDAKLQkgIHx8IChTX0lTX0RFRklORUQgKHN5bXApCi0JICAgICAgJiYgISBTX0lTX0NPTU1PTiAoc3ltcCkKLQkgICAgICAmJiAoISBTX0lTX0VYVEVSTkFMIChzeW1wKSB8fCBTRl9HRVRfRlVOQ1RJT04gKHN5bXApKSkpKQotICAgIHsKLSAgICAgIFNBX1NFVF9TWU1fRU5ETkRYIChzZXRfZW5kLCBzeW1wKTsKLSAgICAgIHNldF9lbmQgPSBOVUxMOwotICAgIH0KLQotICBpZiAobmV4dF9zZXRfZW5kICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHNldF9lbmQgIT0gTlVMTCkKLQlhc193YXJuICgiV2FybmluZzogaW50ZXJuYWwgZXJyb3I6IGZvcmdldHRpbmcgdG8gc2V0IGVuZG5keCBvZiAlcyIsCi0JCSBTX0dFVF9OQU1FIChzZXRfZW5kKSk7Ci0gICAgICBzZXRfZW5kID0gbmV4dF9zZXRfZW5kOwotICAgIH0KLQotICBpZiAoISAqcHVudAotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgPT0gQ19GQ04KLSAgICAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoc3ltcCksICIuYmYiKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChjb2ZmX2xhc3RfYmYgIT0gTlVMTCkKLQlTQV9TRVRfU1lNX0VORE5EWCAoY29mZl9sYXN0X2JmLCBzeW1wKTsKLSAgICAgIGNvZmZfbGFzdF9iZiA9IHN5bXA7Ci0gICAgfQotCi0gIGlmIChjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCkpLT5saW5lbm8pCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBzdHJ1Y3QgbGluZV9ubyAqbHB0cjsKLSAgICAgIGFsZW50ICpsOwotCi0gICAgICBscHRyID0gKHN0cnVjdCBsaW5lX25vICopIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKSktPmxpbmVubzsKLSAgICAgIGZvciAoaSA9IDA7IGxwdHI7IGxwdHIgPSBscHRyLT5uZXh0KQotCWkrKzsKLSAgICAgIGxwdHIgPSAoc3RydWN0IGxpbmVfbm8gKikgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApKS0+bGluZW5vOwotCi0gICAgICAvKiBXZSBuZWVkIGkgZW50cmllcyBmb3IgbGluZSBudW1iZXJzLCBwbHVzIDEgZm9yIHRoZSBmaXJzdAotCSBlbnRyeSB3aGljaCBCRkQgd2lsbCBvdmVycmlkZSwgcGx1cyAxIGZvciB0aGUgbGFzdCB6ZXJvCi0JIGVudHJ5IChhIG1hcmtlciBmb3IgQkZEKS4gICovCi0gICAgICBsID0gKGFsZW50ICopIHhtYWxsb2MgKChpICsgMikgKiBzaXplb2YgKGFsZW50KSk7Ci0gICAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCkpLT5saW5lbm8gPSBsOwotICAgICAgbFtpICsgMV0ubGluZV9udW1iZXIgPSAwOwotICAgICAgbFtpICsgMV0udS5zeW0gPSBOVUxMOwotICAgICAgZm9yICg7IGkgPiAwOyBpLS0pCi0JewotCSAgaWYgKGxwdHItPmZyYWcpCi0JICAgIGxwdHItPmwudS5vZmZzZXQgKz0gbHB0ci0+ZnJhZy0+ZnJfYWRkcmVzczsKLQkgIGxbaV0gPSBscHRyLT5sOwotCSAgbHB0ciA9IGxwdHItPm5leHQ7Ci0JfQotICAgIH0KLX0KLQotdm9pZAotY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zIChhYmZkLCBzZWMsIHgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzeW1ib2xTICpzZWNzeW07Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGludCBubG5ubywgbnJlbG9jcyA9IDA7Ci0KLSAgLyogUlMvNjAwMCBnYXMgY3JlYXRlcyBhIC5kZWJ1ZyBzZWN0aW9uIG1hbnVhbGx5IGluIHBwY19mcm9iX2ZpbGUgaW4KLSAgICAgdGMtcHBjLmMuICBEbyBub3QgZ2V0IGNvbmZ1c2VkIGJ5IGl0LiAgKi8KLSAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCFzdHJjbXAgKHNlYy0+bmFtZSwgIi50ZXh0IikpCi0gICAgbmxubm8gPSBjb2ZmX25fbGluZV9ub3M7Ci0gIGVsc2UKLSAgICBubG5ubyA9IDA7Ci0gIHsKLSAgICAvKiBAQCBIb3BlIHRoYXQgbm9uZSBvZiB0aGUgZml4dXBzIGV4cGFuZCB0byBtb3JlIHRoYW4gb25lIHJlbG9jCi0gICAgICAgZW50cnkuLi4gICovCi0gICAgZml4UyAqZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OwotICAgIHdoaWxlIChmaXhwKQotICAgICAgewotCWlmICghIGZpeHAtPmZ4X2RvbmUpCi0JICBucmVsb2NzKys7Ci0JZml4cCA9IGZpeHAtPmZ4X25leHQ7Ci0gICAgICB9Ci0gIH0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKSA9PSAwCi0gICAgICAmJiBucmVsb2NzID09IDAKLSAgICAgICYmIG5sbm5vID09IDAKLSAgICAgICYmIHNlYyAhPSB0ZXh0X3NlY3Rpb24KLSAgICAgICYmIHNlYyAhPSBkYXRhX3NlY3Rpb24KLSAgICAgICYmIHNlYyAhPSBic3Nfc2VjdGlvbikKLSAgICByZXR1cm47Ci0gIHNlY3N5bSA9IHNlY3Rpb25fc3ltYm9sIChzZWMpOwotICAvKiBUaGlzIGlzIGFuIGVzdGltYXRlOyB3ZSdsbCBwbHVnIGluIHRoZSByZWFsIHZhbHVlIHVzaW5nCi0gICAgIFNFVF9TRUNUSU9OX1JFTE9DUyBsYXRlciAqLwotICBTQV9TRVRfU0NOX05SRUxPQyAoc2Vjc3ltLCBucmVsb2NzKTsKLSAgU0FfU0VUX1NDTl9OTElOTk8gKHNlY3N5bSwgbmxubm8pOwotfQotCi12b2lkCi1jb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCkKLXsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcywgKGNoYXIqKSAwKTsKLX0KLQotLyoKLSAqIGltcGxlbWVudCB0aGUgLnNlY3Rpb24gcHNldWRvIG9wOgotICoJLnNlY3Rpb24gbmFtZSB7LCAiZmxhZ3MifQotICogICAgICAgICAgICAgICAgXiAgICAgICAgIF4KLSAqICAgICAgICAgICAgICAgIHwgICAgICAgICArLS0tIG9wdGlvbmFsIGZsYWdzOiAnYicgZm9yIGJzcwotICogICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJyBmb3IgaW5mbwotICogICAgICAgICAgICAgICAgKy0tIHNlY3Rpb24gbmFtZSAgICAgICAgICAgICAgICdsJyBmb3IgbGliCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nIGZvciBub2xvYWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycgZm9yIG92ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycgZm9yIGRhdGEKLSAqCQkJCQkJICdkJyAoYXBwYXJlbnRseSBtODhrIGZvciBkYXRhKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JyBmb3IgdGV4dAotICoJCQkJCQkgJ3InIGZvciByZWFkLW9ubHkgZGF0YQotICoJCQkJCQkgJ3MnIGZvciBzaGFyZWQgZGF0YSAoUEUpCi0gKiBCdXQgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHF1b3RlZCBzdHJpbmcsIHRyZWF0IGl0IGFzIGEKLSAqIHN1YnNlZ21lbnQgbnVtYmVyLgotICovCi0KLXZvaWQKLW9ial9jb2ZmX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBTdHJpcCBvdXQgdGhlIHNlY3Rpb24gbmFtZSAqLwotICBjaGFyICpzZWN0aW9uX25hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgaW50IGV4cDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIGNoYXIgdHlwZTsKLQotICAgICAgc19tcmlfc2VjdCAoJnR5cGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzZWN0aW9uX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBuYW1lID0geG1hbGxvYyAoaW5wdXRfbGluZV9wb2ludGVyIC0gc2VjdGlvbl9uYW1lICsgMSk7Ci0gIHN0cmNweSAobmFtZSwgc2VjdGlvbl9uYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgZXhwID0gMDsKLSAgZmxhZ3MgPSBTRUNfTE9BRDsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0JZXhwID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicKLQkJICYmICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCQl7Ci0JCWNhc2UgJ2InOiBmbGFncyB8PSBTRUNfQUxMT0M7IGZsYWdzICY9fiBTRUNfTE9BRDsgYnJlYWs7Ci0JCWNhc2UgJ24nOiBmbGFncyAmPX4gU0VDX0xPQUQ7IGJyZWFrOwotCQljYXNlICdkJzogZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRDsgLyogZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgJ3cnOiBmbGFncyAmPX4gU0VDX1JFQURPTkxZOyBicmVhazsKLQkJY2FzZSAneCc6IGZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0xPQUQ7IGJyZWFrOwotCQljYXNlICdyJzogZmxhZ3MgfD0gU0VDX1JFQURPTkxZOyBicmVhazsKLQkJY2FzZSAncyc6IGZsYWdzIHw9IFNFQ19TSEFSRUQ7IGJyZWFrOwotCi0JCWNhc2UgJ2knOiAvKiBTVFlQX0lORk8gKi8KLQkJY2FzZSAnbCc6IC8qIFNUWVBfTElCICovCi0JCWNhc2UgJ28nOiAvKiBTVFlQX09WRVIgKi8KLQkJICBhc193YXJuIChfKCJ1bnN1cHBvcnRlZCBzZWN0aW9uIGF0dHJpYnV0ZSAnJWMnIiksCi0JCQkgICAqaW5wdXRfbGluZV9wb2ludGVyKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGFzX3dhcm4oXygidW5rbm93biBzZWN0aW9uIGF0dHJpYnV0ZSAnJWMnIiksCi0JCQkgICppbnB1dF9saW5lX3BvaW50ZXIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIH0KLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICciJykKLQkgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgIH0KLQotICBzZWMgPSBzdWJzZWdfbmV3IChuYW1lLCAoc3Vic2VnVCkgZXhwKTsKLQotICBpZiAoZmxhZ3MgIT0gU0VDX05PX0ZMQUdTKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIG9sZGZsYWdzOwotCi0gICAgICBvbGRmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMpOwotICAgICAgb2xkZmxhZ3MgJj0gU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVM7Ci0gICAgICBmbGFncyB8PSBvbGRmbGFnczsKLQotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYywgZmxhZ3MpKQotCWFzX3dhcm4gKF8oImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiJXNcIjogJXMiKSwKLQkJIGJmZF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwgc2VjKSwKLQkJIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotY29mZl9hZGp1c3Rfc3ltdGFiICgpCi17Ci0gIGlmIChzeW1ib2xfcm9vdFAgPT0gTlVMTAotICAgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sX3Jvb3RQKSAhPSBDX0ZJTEUpCi0gICAgY19kb3RfZmlsZV9zeW1ib2wgKCJmYWtlIik7Ci19Ci0KLXZvaWQKLWNvZmZfZnJvYl9zZWN0aW9uIChzZWMpCi0gICAgIHNlZ1Qgc2VjOwotewotICBzZWdUIHN0cnNlYzsKLSAgY2hhciAqcDsKLSAgZnJhZ1MgKmZyYWdwOwotICBiZmRfdm1hIHNpemUsIG5fZW50cmllcywgbWFzazsKLQotICAvKiBUaGUgQ09GRiBiYWNrIGVuZCBpbiBCRkQgcmVxdWlyZXMgdGhhdCBhbGwgc2VjdGlvbiBzaXplcyBiZQotICAgICByb3VuZGVkIHVwIHRvIG11bHRpcGxlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBzZWN0aW9uIGFsaWdubWVudHMuCi0gICAgIFNlZW1zIGtpbmRhIHNpbGx5IHRvIG1lLCBidXQgdGhhdCdzIHRoZSB3YXkgaXQgaXMuICAqLwotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpOwotICBtYXNrID0gKChiZmRfdm1hKSAxIDw8IChiZmRfdm1hKSBzZWMtPmFsaWdubWVudF9wb3dlcikgLSAxOwotICBpZiAoc2l6ZSAmIG1hc2spCi0gICAgewotICAgICAgc2l6ZSA9IChzaXplICsgbWFzaykgJiB+bWFzazsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIHNlYywgc2l6ZSk7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBzZWN0aW9uIHNpemUgaXMgbm9uLXplcm8sIHRoZSBzZWN0aW9uIHN5bWJvbCBuZWVkcyBhbiBhdXgKLSAgICAgZW50cnkgYXNzb2NpYXRlZCB3aXRoIGl0LCBpbmRpY2F0aW5nIHRoZSBzaXplLiAgV2UgZG9uJ3Qga25vdwotICAgICBhbGwgdGhlIHZhbHVlcyB5ZXQ7IGNvZmZfZnJvYl9zeW1ib2wgd2lsbCBmaWxsIHRoZW0gaW4gbGF0ZXIuICAqLwotICBpZiAoc2l6ZSAhPSAwCi0gICAgICB8fCBzZWMgPT0gdGV4dF9zZWN0aW9uCi0gICAgICB8fCBzZWMgPT0gZGF0YV9zZWN0aW9uCi0gICAgICB8fCBzZWMgPT0gYnNzX3NlY3Rpb24pCi0gICAgewotICAgICAgc3ltYm9sUyAqc2Vjc3ltID0gc2VjdGlvbl9zeW1ib2wgKHNlYyk7Ci0KLSAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHNlY3N5bSwgQ19TVEFUKTsKLSAgICAgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHNlY3N5bSwgMSk7Ci0gICAgICBTRl9TRVRfU1RBVElDUyAoc2Vjc3ltKTsKLSAgICAgIFNBX1NFVF9TQ05fU0NOTEVOIChzZWNzeW0sIHNpemUpOwotICAgIH0KLQotICAvKiBAQCB0aGVzZSBzaG91bGQgYmUgaW4gYSAic3RhYnMuaCIgZmlsZSwgb3IgbWF5YmUgYXMuaCAqLwotI2lmbmRlZiBTVEFCX1NFQ1RJT05fTkFNRQotI2RlZmluZSBTVEFCX1NFQ1RJT05fTkFNRSAiLnN0YWIiCi0jZW5kaWYKLSNpZm5kZWYgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRSAiLnN0YWJzdHIiCi0jZW5kaWYKLSAgaWYgKHN0cmNtcCAoU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FLCBzZWMtPm5hbWUpKQotICAgIHJldHVybjsKLQotICBzdHJzZWMgPSBzZWM7Ci0gIHNlYyA9IHN1YnNlZ19nZXQgKFNUQUJfU0VDVElPTl9OQU1FLCAwKTsKLSAgLyogc2l6ZSBpcyBhbHJlYWR5IHJvdW5kZWQgdXAsIHNpbmNlIG90aGVyIHNlY3Rpb24gd2lsbCBiZSBsaXN0ZWQgZmlyc3QgKi8KLSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc3Ryc2VjKTsKLQotICBuX2VudHJpZXMgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYykgLyAxMiAtIDE7Ci0KLSAgLyogRmluZCBmaXJzdCBub24tZW1wdHkgZnJhZy4gIEl0IHNob3VsZCBiZSBsYXJnZSBlbm91Z2guICAqLwotICBmcmFncCA9IHNlZ19pbmZvIChzZWMpLT5mcmNoYWluUC0+ZnJjaF9yb290OwotICB3aGlsZSAoZnJhZ3AgJiYgZnJhZ3AtPmZyX2ZpeCA9PSAwKQotICAgIGZyYWdwID0gZnJhZ3AtPmZyX25leHQ7Ci0gIGFzc2VydCAoZnJhZ3AgIT0gMCAmJiBmcmFncC0+ZnJfZml4ID49IDEyKTsKLQotICAvKiBTdG9yZSB0aGUgdmFsdWVzLiAgKi8KLSAgcCA9IGZyYWdwLT5mcl9saXRlcmFsOwotICBiZmRfaF9wdXRfMTYgKHN0ZG91dHB1dCwgbl9lbnRyaWVzLCAoYmZkX2J5dGUgKikgcCArIDYpOwotICBiZmRfaF9wdXRfMzIgKHN0ZG91dHB1dCwgc2l6ZSwgKGJmZF9ieXRlICopIHAgKyA4KTsKLX0KLQotdm9pZAotb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgKnN0YWJzdHJfbmFtZTsKLSAgdW5zaWduZWQgaW50IHN0cm9mZjsKLQotICAvKiBNYWtlIHNwYWNlIGZvciB0aGlzIGZpcnN0IHN5bWJvbC4gKi8KLSAgcCA9IGZyYWdfbW9yZSAoMTIpOwotICAvKiBaZXJvIGl0IG91dC4gKi8KLSAgbWVtc2V0IChwLCAwLCAxMik7Ci0gIGFzX3doZXJlICgmZmlsZSwgKHVuc2lnbmVkIGludCAqKSBOVUxMKTsKLSAgc3RhYnN0cl9uYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHNlZy0+bmFtZSkgKyA0KTsKLSAgc3RyY3B5IChzdGFic3RyX25hbWUsIHNlZy0+bmFtZSk7Ci0gIHN0cmNhdCAoc3RhYnN0cl9uYW1lLCAic3RyIik7Ci0gIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKGZpbGUsIHN0YWJzdHJfbmFtZSk7Ci0gIGtub3cgKHN0cm9mZiA9PSAxKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBzdHJvZmYsIDQpOwotfQotCi0jaWZkZWYgREVCVUcKLS8qIGZvciBkZWJ1Z2dpbmcgKi8KLWNvbnN0IGNoYXIgKgotc19nZXRfbmFtZSAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgcmV0dXJuICgocyA9PSBOVUxMKSA/ICIoTlVMTCkiIDogU19HRVRfTkFNRSAocykpOwotfQotCi12b2lkCi1zeW1ib2xfZHVtcCAoKQotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBwcmludGYoXygiMHglbHg6IFwiJXNcIiB0eXBlID0gJWxkLCBjbGFzcyA9ICVkLCBzZWdtZW50ID0gJWRcbiIpLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpIHN5bWJvbFAsCi0JICAgICBTX0dFVF9OQU1FKHN5bWJvbFApLAotCSAgICAgKGxvbmcpIFNfR0VUX0RBVEFfVFlQRShzeW1ib2xQKSwKLQkgICAgIFNfR0VUX1NUT1JBR0VfQ0xBU1Moc3ltYm9sUCksCi0JICAgICAoaW50KSBTX0dFVF9TRUdNRU5UKHN5bWJvbFApKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBERUJVRyAqLwotCi0jZWxzZSAvKiBub3QgQkZEX0FTU0VNQkxFUiAqLwotCi0jaW5jbHVkZSAiZnJhZ3MuaCIKLS8qIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgaW5jbHVkZSBpbnRlcm5hbCBiZmQgdGhpbmdzLiAqLwotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2lmZGVmIFRFX1BFCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotI2VuZGlmCi0KLS8qIFRoZSBOT1BfT1BDT0RFIGlzIGZvciB0aGUgYWxpZ25tZW50IGZpbGwgdmFsdWUuICBGaWxsIHdpdGggbm9wIHNvCi0gICB0aGF0IHdlIGNhbiBzdGljayBzZWN0aW9ucyB0b2dldGhlciB3aXRob3V0IGNhdXNpbmcgdHJvdWJsZS4gICovCi0jaWZuZGVmIE5PUF9PUENPREUKLSNkZWZpbmUgTk9QX09QQ09ERSAweDAwCi0jZW5kaWYKLQotLyogVGhlIHplcm9lcyBpZiBzeW1ib2wgbmFtZSBpcyBsb25nZXIgdGhhbiA4IGNoYXJzICovCi0jZGVmaW5lIFNfU0VUX1pFUk9FUyhzLHYpCQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5femVyb2VzID0gKHYpKQotCi0jZGVmaW5lIE1JTihhLGIpICgoYSkgPCAoYik/IChhKSA6IChiKSkKLQotLyogVGhpcyB2ZWN0b3IgaXMgdXNlZCB0byB0dXJuIGEgZ2FzIGludGVybmFsIHNlZ21lbnQgbnVtYmVyIGludG8gYQotICAgc2VjdGlvbiBudW1iZXIgc3VpdGFibGUgZm9yIGluc2VydGlvbiBpbnRvIGEgY29mZiBzeW1ib2wgdGFibGUuCi0gICBUaGlzIG11c3QgY29ycmVzcG9uZCB0byBzZWdfaW5mb19vZmZfYnlfNC4gICovCi0KLWNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXSA9Ci17CQkJCS8qIGluOiBzZWdUICAgb3V0OiBOX1RZUEUgYml0cyAqLwotICBDX0FCU19TRUNUSU9OLAotICAxLCAgICAyLCAgMywgICA0LCAgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwKLSAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsCi0gIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLAotICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwKLSAgQ19VTkRFRl9TRUNUSU9OLAkJLyogU0VHX1VOS05PV04gKi8KLSAgQ19VTkRFRl9TRUNUSU9OLAkJLyogU0VHX0dPT0YgKi8KLSAgQ19VTkRFRl9TRUNUSU9OLAkJLyogU0VHX0VYUFIgKi8KLSAgQ19ERUJVR19TRUNUSU9OLAkJLyogU0VHX0RFQlVHICovCi0gIENfTlRWX1NFQ1RJT04sCQkvKiBTRUdfTlRWICovCi0gIENfUFRWX1NFQ1RJT04sCQkvKiBTRUdfUFRWICovCi0gIENfUkVHSVNURVJfU0VDVElPTiwJCS8qIFNFR19SRUdJU1RFUiAqLwotfTsKLQotaW50IGZ1bmN0aW9uX2xpbmVvZmYgPSAtMTsJLyogT2Zmc2V0IGluIGxpbmUjcyB3aGVyZSB0aGUgbGFzdCBmdW5jdGlvbgotCQkJCSAgIHN0YXJ0ZWQgKHRoZSBvZGQgZW50cnkgZm9yIGxpbmUgIzApICovCi0KLS8qIHN0cnVjdHVyZSB1c2VkIHRvIGtlZXAgdGhlIGZpbGVuYW1lcyB3aGljaAotICAgYXJlIHRvbyBsb25nIGFyb3VuZCBzbyB0aGF0IHdlIGNhbiBzdGljayB0aGVtCi0gICBpbnRvIHRoZSBzdHJpbmcgdGFibGUgKi8KLXN0cnVjdCBmaWxlbmFtZV9saXN0IAotewotICBjaGFyICpmaWxlbmFtZTsKLSAgc3RydWN0IGZpbGVuYW1lX2xpc3QgKm5leHQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGZpbGVuYW1lX2xpc3QgKmZpbGVuYW1lX2xpc3RfaGVhZDsKLXN0YXRpYyBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZmlsZW5hbWVfbGlzdF90YWlsOwotCi1zdGF0aWMgc3ltYm9sUyAqbGFzdF9saW5lX3N5bWJvbDsKLQotLyogQWRkIDQgdG8gdGhlIHJlYWwgdmFsdWUgdG8gZ2V0IHRoZSBpbmRleCBhbmQgY29tcGVuc2F0ZSB0aGUKLSAgIG5lZ2F0aXZlcy4gVGhpcyB2ZWN0b3IgaXMgdXNlZCBieSBTX0dFVF9TRUdNRU5UIHRvIHR1cm4gYSBjb2ZmCi0gICBzZWN0aW9uIG51bWJlciBpbnRvIGEgc2VnbWVudCBudW1iZXIKLSovCi1zdGF0aWMgc3ltYm9sUyAqcHJldmlvdXNfZmlsZV9zeW1ib2w7Ci12b2lkIGNfc3ltYm9sX21lcmdlICgpOwotc3RhdGljIGludCBsaW5lX2Jhc2U7Ci0KLXN5bWJvbFMgKmNfc2VjdGlvbl9zeW1ib2wgKCk7Ci1iZmQgKmFiZmQ7Ci0KLXN0YXRpYyB2b2lkIGZpeHVwX3NlZ21lbnQgUEFSQU1TICgoc2VnbWVudF9pbmZvX3R5cGUgKnNlZ1AsCi0JCQkJICAgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZSkpOwotCi0KLXN0YXRpYyB2b2lkIGZpeHVwX21kZXBzIFBBUkFNUyAoKGZyYWdTICosCi0JCQkJIG9iamVjdF9oZWFkZXJzICosCi0JCQkJIHNlZ1QpKTsKLQotCi1zdGF0aWMgdm9pZCBmaWxsX3NlY3Rpb24gUEFSQU1TICgoYmZkICogYWJmZCwKLQkJCQkgIG9iamVjdF9oZWFkZXJzICosCi0JCQkJICB1bnNpZ25lZCBsb25nICopKTsKLQotCi1zdGF0aWMgaW50IGNfbGluZV9uZXcgUEFSQU1TICgoc3ltYm9sUyAqIHN5bWJvbCwgbG9uZyBwYWRkciwKLQkJCSAgICAgICBpbnQgbGluZV9udW1iZXIsCi0JCQkgICAgICAgZnJhZ1MgKiBmcmFnKSk7Ci0KLQotc3RhdGljIHZvaWQgd19zeW1ib2xzIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGNoYXIgKndoZXJlLAotCQkJICAgICAgIHN5bWJvbFMgKiBzeW1ib2xfcm9vdFApKTsKLQotc3RhdGljIHZvaWQgYWRqdXN0X3N0YWJfc2VjdGlvbiBQQVJBTVMgKChiZmQgKmFiZmQsIHNlZ1Qgc2VnKSk7Ci0KLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2xjb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX2RhdGEgUEFSQU1TICgoaW50KSk7Ci12b2lkIG9ial9jb2ZmX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci0KLS8qIFdoZW4gbm90IHVzaW5nIEJGRF9BU1NFTUJMRVIsIHdlIHBlcm1pdCB1cCB0byA0MCBzZWN0aW9ucy4KLQotICAgVGhpcyBhcnJheSBtYXBzIGEgQ09GRiBzZWN0aW9uIG51bWJlciBpbnRvIGEgZ2FzIHNlY3Rpb24gbnVtYmVyLgotICAgQmVjYXVzZSBDT0ZGIHVzZXMgbmVnYXRpdmUgc2VjdGlvbiBudW1iZXJzLCB5b3UgbXVzdCBhZGQgNCB0byB0aGUKLSAgIENPRkYgc2VjdGlvbiBudW1iZXIgd2hlbiBpbmRleGluZyBpbnRvIHRoaXMgYXJyYXk7IHRoaXMgaXMgZG9uZSB2aWEKLSAgIHRoZSBTRUdfSU5GT19GUk9NX1NFQ1RJT05fTlVNQkVSIG1hY3JvLiAgVGhpcyBtdXN0IGNvcnJlc3BvbmQgdG8KLSAgIHNlZ19OX1RZUEUuICAqLwotCi1zdGF0aWMgY29uc3Qgc2VnVCBzZWdfaW5mb19vZmZfYnlfNFtdID0KLXsKLSBTRUdfUFRWLAotIFNFR19OVFYsCi0gU0VHX0RFQlVHLAotIFNFR19BQlNPTFVURSwKLSBTRUdfVU5LTk9XTiwKLSBTRUdfRTAsICBTRUdfRTEsICBTRUdfRTIsICBTRUdfRTMsICBTRUdfRTQsCi0gU0VHX0U1LCAgU0VHX0U2LCAgU0VHX0U3LCAgU0VHX0U4LCAgU0VHX0U5LAotIFNFR19FMTAsIFNFR19FMTEsIFNFR19FMTIsIFNFR19FMTMsIFNFR19FMTQsCi0gU0VHX0UxNSwgU0VHX0UxNiwgU0VHX0UxNywgU0VHX0UxOCwgU0VHX0UxOSwKLSBTRUdfRTIwLCBTRUdfRTIxLCBTRUdfRTIyLCBTRUdfRTIzLCBTRUdfRTI0LAotIFNFR19FMjUsIFNFR19FMjYsIFNFR19FMjcsIFNFR19FMjgsIFNFR19FMjksCi0gU0VHX0UzMCwgU0VHX0UzMSwgU0VHX0UzMiwgU0VHX0UzMywgU0VHX0UzNCwKLSBTRUdfRTM1LCBTRUdfRTM2LCBTRUdfRTM3LCBTRUdfRTM4LCBTRUdfRTM5LAotIChzZWdUKSA0MCwKLSAoc2VnVCkgNDEsCi0gKHNlZ1QpIDQyLAotIChzZWdUKSA0MywKLSAoc2VnVCkgNDQsCi0gKHNlZ1QpIDQ1LAotIChzZWdUKSAwLAotIChzZWdUKSAwLAotIChzZWdUKSAwLAotIFNFR19SRUdJU1RFUgotfTsKLQotI2RlZmluZSBTRUdfSU5GT19GUk9NX1NFQ1RJT05fTlVNQkVSKHgpIChzZWdfaW5mb19vZmZfYnlfNFsoeCkrNF0pCi0KLXN0YXRpYyByZWxheF9hZGRyZXNzVAotcmVsYXhfYWxpZ24gKGFkZHJlc3MsIGFsaWdubWVudCkKLSAgICAgcmVsYXhfYWRkcmVzc1QgYWRkcmVzczsKLSAgICAgbG9uZyBhbGlnbm1lbnQ7Ci17Ci0gIHJlbGF4X2FkZHJlc3NUIG1hc2s7Ci0gIHJlbGF4X2FkZHJlc3NUIG5ld19hZGRyZXNzOwotCi0gIG1hc2sgPSB+KCh+MCkgPDwgYWxpZ25tZW50KTsKLSAgbmV3X2FkZHJlc3MgPSAoYWRkcmVzcyArIG1hc2spICYgKH5tYXNrKTsKLSAgcmV0dXJuIChuZXdfYWRkcmVzcyAtIGFkZHJlc3MpOwotfQotCi0KLXNlZ1QKLXNfZ2V0X3NlZ21lbnQgKHgpCi0gICAgIHN5bWJvbFMgKiB4OwotewotICByZXR1cm4gU0VHX0lORk9fRlJPTV9TRUNUSU9OX05VTUJFUiAoeC0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtKTsKLX0KLQotLyogY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBmcmFnIGNoYWluIGFuZCBmaWxsIGluIHRoZSBzZWN0aW9uIGhlYWRlcgotICAgdG8gY29udGFpbiBhbGwgb2YgaXQsIGFsc28gZmlsbCBpbiB0aGUgYWRkciBvZiB0aGUgc2VjdGlvbnMgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXNpemVfc2VjdGlvbiAoYWJmZCwgaWR4KQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdW5zaWduZWQgaW50IGlkeDsKLXsKLQotICB1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7Ci0gIGZyYWdTICpmcmFnID0gc2VnbWVudF9pbmZvW2lkeF0uZnJjaGFpblAtPmZyY2hfcm9vdDsKLSAgd2hpbGUgKGZyYWcpCi0gICAgewotICAgICAgc2l6ZSA9IGZyYWctPmZyX2FkZHJlc3M7Ci0gICAgICBpZiAoZnJhZy0+ZnJfYWRkcmVzcyAhPSBzaXplKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiT3V0IG9mIHN0ZXBcbiIpKTsKLQkgIHNpemUgPSBmcmFnLT5mcl9hZGRyZXNzOwotCX0KLQotICAgICAgc3dpdGNoIChmcmFnLT5mcl90eXBlKQotCXsKLSNpZmRlZiBUQ19DT0ZGX1NJWkVNQUNIREVQCi0JY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLQkgIHNpemUgKz0gVENfQ09GRl9TSVpFTUFDSERFUCAoZnJhZyk7Ci0JICBicmVhazsKLSNlbmRpZgotCWNhc2UgcnNfc3BhY2U6Ci0JICBhc3NlcnQgKGZyYWctPmZyX3N5bWJvbCA9PSAwKTsKLQljYXNlIHJzX2ZpbGw6Ci0JY2FzZSByc19vcmc6Ci0JICBzaXplICs9IGZyYWctPmZyX2ZpeDsKLQkgIHNpemUgKz0gZnJhZy0+ZnJfb2Zmc2V0ICogZnJhZy0+ZnJfdmFyOwotCSAgYnJlYWs7Ci0JY2FzZSByc19hbGlnbjoKLQljYXNlIHJzX2FsaWduX2NvZGU6Ci0JICB7Ci0JICAgIGFkZHJlc3NUIG9mZjsKLQotCSAgICBzaXplICs9IGZyYWctPmZyX2ZpeDsKLQkgICAgb2ZmID0gcmVsYXhfYWxpZ24gKHNpemUsIGZyYWctPmZyX29mZnNldCk7Ci0JICAgIGlmIChmcmFnLT5mcl9zdWJ0eXBlICE9IDAgJiYgb2ZmID4gZnJhZy0+ZnJfc3VidHlwZSkKLQkgICAgICBvZmYgPSAwOwotCSAgICBzaXplICs9IG9mZjsKLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBCQURfQ0FTRSAoZnJhZy0+ZnJfdHlwZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBmcmFnID0gZnJhZy0+ZnJfbmV4dDsKLSAgICB9Ci0gIHNlZ21lbnRfaW5mb1tpZHhdLnNjbmhkci5zX3NpemUgPSBzaXplOwotICByZXR1cm4gc2l6ZTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb3VudF9lbnRyaWVzX2luX2NoYWluIChpZHgpCi0gICAgIHVuc2lnbmVkIGludCBpZHg7Ci17Ci0gIHVuc2lnbmVkIGludCBucmVsb2NzOwotICBmaXhTICpmaXh1cF9wdHI7Ci0KLSAgLyogQ291bnQgdGhlIHJlbG9jYXRpb25zICovCi0gIGZpeHVwX3B0ciA9IHNlZ21lbnRfaW5mb1tpZHhdLmZpeF9yb290OwotICBucmVsb2NzID0gMDsKLSAgd2hpbGUgKGZpeHVwX3B0ciAhPSAoZml4UyAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChmaXh1cF9wdHItPmZ4X2RvbmUgPT0gMCAmJiBUQ19DT1VOVF9SRUxPQyAoZml4dXBfcHRyKSkKLQl7Ci0jaWZkZWYgVENfQTI5SwotCSAgaWYgKGZpeHVwX3B0ci0+Znhfcl90eXBlID09IFJFTE9DX0NPTlNUSCkKLQkgICAgbnJlbG9jcyArPSAyOwotCSAgZWxzZQotCSAgICBucmVsb2NzKys7Ci0jZWxzZQotCSAgbnJlbG9jcysrOwotI2VuZGlmCi0JfQotCi0gICAgICBmaXh1cF9wdHIgPSBmaXh1cF9wdHItPmZ4X25leHQ7Ci0gICAgfQotICByZXR1cm4gbnJlbG9jczsKLX0KLQotI2lmZGVmIFRFX0FVWAotCi1zdGF0aWMgaW50IGNvbXBhcmVfZXh0ZXJuYWxfcmVsb2NzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLS8qIEFVWCdzIGxkIGV4cGVjdHMgcmVsb2NhdGlvbnMgdG8gYmUgc29ydGVkICovCi1zdGF0aWMgaW50Ci1jb21wYXJlX2V4dGVybmFsX3JlbG9jcyAoeCwgeSkKLSAgICAgY29uc3QgUFRSIHg7Ci0gICAgIGNvbnN0IFBUUiB5OwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmEgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHg7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqYiA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgeTsKLSAgYmZkX3ZtYSBhYWRyID0gYmZkX2dldGIzMiAoYS0+cl92YWRkcik7Ci0gIGJmZF92bWEgYmFkciA9IGJmZF9nZXRiMzIgKGItPnJfdmFkZHIpOwotICByZXR1cm4gKGFhZHIgPCBiYWRyID8gLTEgOiBiYWRyIDwgYWFkciA/IDEgOiAwKTsKLX0KLQotI2VuZGlmCi0KLS8qIG91dHB1dCBhbGwgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24gKi8KLXZvaWQKLWRvX3JlbG9jc19mb3IgKGFiZmQsIGgsIGZpbGVfY3Vyc29yKQotICAgICBiZmQgKiBhYmZkOwotICAgICBvYmplY3RfaGVhZGVycyAqIGg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmZpbGVfY3Vyc29yOwotewotICB1bnNpZ25lZCBpbnQgbnJlbG9jczsKLSAgdW5zaWduZWQgaW50IGlkeDsKLSAgdW5zaWduZWQgbG9uZyByZWxvY19zdGFydCA9ICpmaWxlX2N1cnNvcjsKLQotICBmb3IgKGlkeCA9IFNFR19FMDsgaWR4IDwgU0VHX0xBU1Q7IGlkeCsrKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50X2luZm9baWR4XS5zY25oZHIuc19uYW1lWzBdKQotCXsKLQkgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3B0cjsKLQkgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0ZXJuYWxfcmVsb2NfdmVjOwotCSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3JlbG9jX3NpemU7Ci0JICB1bnNpZ25lZCBpbnQgYmFzZSA9IHNlZ21lbnRfaW5mb1tpZHhdLnNjbmhkci5zX3BhZGRyOwotCSAgZml4UyAqZml4X3B0ciA9IHNlZ21lbnRfaW5mb1tpZHhdLmZpeF9yb290OwotCSAgbnJlbG9jcyA9IGNvdW50X2VudHJpZXNfaW5fY2hhaW4gKGlkeCk7Ci0KLQkgIGlmIChucmVsb2NzKQotCSAgICAvKiBCeXBhc3MgdGhpcyBzdHVmZiBpZiBubyByZWxvY3MuICBUaGlzIGFsc28gaW5jaWRlbnRhbGx5Ci0JICAgICAgIGF2b2lkcyBhIFNDTyBidWcsIHdoZXJlIGZyZWUobWFsbG9jKDApKSB0ZW5kcyB0byBjcmFzaC4gICovCi0JICAgIHsKLQkgICAgICBleHRlcm5hbF9yZWxvY19zaXplID0gbnJlbG9jcyAqIFJFTFNaOwotCSAgICAgIGV4dGVybmFsX3JlbG9jX3ZlYyA9Ci0JCShzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgbWFsbG9jIChleHRlcm5hbF9yZWxvY19zaXplKTsKLQotCSAgICAgIGV4dF9wdHIgPSBleHRlcm5hbF9yZWxvY192ZWM7Ci0KLQkgICAgICAvKiBGaWxsIGluIHRoZSBpbnRlcm5hbCBjb2ZmIHN0eWxlIHJlbG9jIHN0cnVjdCBmcm9tIHRoZQotCQkgaW50ZXJuYWwgZml4IGxpc3QuICAqLwotCSAgICAgIHdoaWxlIChmaXhfcHRyKQotCQl7Ci0JCSAgc3RydWN0IGludGVybmFsX3JlbG9jIGludHI7Ci0KLQkJICAvKiBPbmx5IG91dHB1dCBzb21lIG9mIHRoZSByZWxvY2F0aW9ucyAqLwotCQkgIGlmIChmaXhfcHRyLT5meF9kb25lID09IDAgJiYgVENfQ09VTlRfUkVMT0MgKGZpeF9wdHIpKQotCQkgICAgewotI2lmZGVmIFRDX1JFTE9DX01BTkdMRQotCQkgICAgICBUQ19SRUxPQ19NQU5HTEUgKCZzZWdtZW50X2luZm9baWR4XSwgZml4X3B0ciwgJmludHIsCi0JCQkJICAgICAgIGJhc2UpOwotCi0jZWxzZQotCQkgICAgICBzeW1ib2xTICpkb3Q7Ci0JCSAgICAgIHN5bWJvbFMgKnN5bWJvbF9wdHIgPSBmaXhfcHRyLT5meF9hZGRzeTsKLQotCQkgICAgICBpbnRyLnJfdHlwZSA9IFRDX0NPRkZfRklYMlJUWVBFIChmaXhfcHRyKTsKLQkJICAgICAgaW50ci5yX3ZhZGRyID0KLQkJCWJhc2UgKyBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+Znhfd2hlcmU7Ci0KLSNpZmRlZiBUQ19LRUVQX0ZYX09GRlNFVAotCQkgICAgICBpbnRyLnJfb2Zmc2V0ID0gZml4X3B0ci0+Znhfb2Zmc2V0OwotI2Vsc2UKLQkJICAgICAgaW50ci5yX29mZnNldCA9IDA7Ci0jZW5kaWYKLQotCQkgICAgICB3aGlsZSAoc3ltYm9sX3B0ci0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCQkJICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bWJvbF9wdHIpCi0JCQkJIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xfcHRyKSkpCi0JCQl7Ci0JCQkgIHN5bWJvbFMgKm47Ci0KLQkJCSAgLyogV2UgbXVzdCBhdm9pZCBsb29waW5nLCBhcyB0aGF0IGNhbiBvY2N1cgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgYmFkbHkgd3JpdHRlbiBwcm9ncmFtLiAgKi8KLQkJCSAgbiA9IHN5bWJvbF9wdHItPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLQkJCSAgaWYgKG4gPT0gc3ltYm9sX3B0cikKLQkJCSAgICBicmVhazsKLQkJCSAgc3ltYm9sX3B0ciA9IG47Ci0JCQl9Ci0KLQkJICAgICAgLyogVHVybiB0aGUgc2VnbWVudCBvZiB0aGUgc3ltYm9sIGludG8gYW4gb2Zmc2V0LiAgKi8KLQkJICAgICAgaWYgKHN5bWJvbF9wdHIpCi0JCQl7Ci0JCQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xfcHRyLCAxKTsKLQkJCSAgaWYgKCEgc3ltYm9sX3B0ci0+c3lfcmVzb2x2ZWQpCi0JCQkgICAgewotCQkJICAgICAgY2hhciAqZmlsZTsKLQkJCSAgICAgIHVuc2lnbmVkIGludCBsaW5lOwotCi0JCQkgICAgICBpZiAoZXhwcl9zeW1ib2xfd2hlcmUgKHN5bWJvbF9wdHIsICZmaWxlLCAmbGluZSkpCi0JCQkJYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLAotCQkJCQkgICAgICBfKCJ1bnJlc29sdmVkIHJlbG9jYXRpb24iKSk7Ci0JCQkgICAgICBlbHNlCi0JCQkJYXNfYmFkIChfKCJiYWQgcmVsb2NhdGlvbjogc3ltYm9sIGAlcycgbm90IGluIHN5bWJvbCB0YWJsZSIpLAotCQkJCQlTX0dFVF9OQU1FIChzeW1ib2xfcHRyKSk7Ci0JCQkgICAgfQotCQkJICBkb3QgPSBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sX3B0cildLmRvdDsKLQkJCSAgaWYgKGRvdCkKLQkJCSAgICB7Ci0JCQkgICAgICBpbnRyLnJfc3ltbmR4ID0gZG90LT5zeV9udW1iZXI7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgaW50ci5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKLQkJCSAgICB9Ci0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpbnRyLnJfc3ltbmR4ID0gLTE7Ci0JCQl9Ci0jZW5kaWYKLQotCQkgICAgICAodm9pZCkgYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsICZpbnRyLCBleHRfcHRyKTsKLQkJICAgICAgZXh0X3B0cisrOwotCi0jaWYgZGVmaW5lZChUQ19BMjlLKQotCi0JCSAgICAgIC8qIFRoZSAyOWsgaGFzIGEgc3BlY2lhbCBrbHVkZ2UgZm9yIHRoZSBoaWdoIDE2IGJpdAotCQkJIHJlbG9jLiAgVHdvIHJlbG9jYXRpb25zIGFyZSBlbWl0ZWQsIFJfSUhJSEFMRiwKLQkJCSBhbmQgUl9JSENPTlNULiBUaGUgc2Vjb25kIG9uZSBkb2Vzbid0IGNvbnRhaW4gYQotCQkJIHN5bWJvbCwgYnV0IHVzZXMgdGhlIHZhbHVlIGZvciBvZmZzZXQuICAqLwotCi0JCSAgICAgIGlmIChpbnRyLnJfdHlwZSA9PSBSX0lISUhBTEYpCi0JCQl7Ci0JCQkgIC8qIG5vdyBlbWl0IHRoZSBzZWNvbmQgYml0ICovCi0JCQkgIGludHIucl90eXBlID0gUl9JSENPTlNUOwotCQkJICBpbnRyLnJfc3ltbmR4ID0gZml4X3B0ci0+ZnhfYWRkbnVtYmVyOwotCQkJICAodm9pZCkgYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsICZpbnRyLCBleHRfcHRyKTsKLQkJCSAgZXh0X3B0cisrOwotCQkJfQotI2VuZGlmCi0JCSAgICB9Ci0KLQkJICBmaXhfcHRyID0gZml4X3B0ci0+ZnhfbmV4dDsKLQkJfQotCi0jaWZkZWYgVEVfQVVYCi0JICAgICAgLyogU29ydCB0aGUgcmVsb2MgdGFibGUgKi8KLQkgICAgICBxc29ydCAoKFBUUikgZXh0ZXJuYWxfcmVsb2NfdmVjLCBucmVsb2NzLAotCQkgICAgIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX3JlbG9jKSwgY29tcGFyZV9leHRlcm5hbF9yZWxvY3MpOwotI2VuZGlmCi0KLQkgICAgICAvKiBXcml0ZSBvdXQgdGhlIHJlbG9jIHRhYmxlICovCi0JICAgICAgYmZkX3dyaXRlICgoUFRSKSBleHRlcm5hbF9yZWxvY192ZWMsIDEsIGV4dGVybmFsX3JlbG9jX3NpemUsCi0JCQkgYWJmZCk7Ci0JICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NfdmVjKTsKLQotCSAgICAgIC8qIEZpbGwgaW4gc2VjdGlvbiBoZWFkZXIgaW5mby4gICovCi0JICAgICAgc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfcmVscHRyID0gKmZpbGVfY3Vyc29yOwotCSAgICAgICpmaWxlX2N1cnNvciArPSBleHRlcm5hbF9yZWxvY19zaXplOwotCSAgICAgIHNlZ21lbnRfaW5mb1tpZHhdLnNjbmhkci5zX25yZWxvYyA9IG5yZWxvY3M7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIE5vIHJlbG9jcyAqLwotCSAgICAgIHNlZ21lbnRfaW5mb1tpZHhdLnNjbmhkci5zX3JlbHB0ciA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKiBTZXQgcmVsb2NhdGlvbl9zaXplIGZpZWxkIGluIGZpbGUgaGVhZGVycyAqLwotICBIX1NFVF9SRUxPQ0FUSU9OX1NJWkUgKGgsICpmaWxlX2N1cnNvciAtIHJlbG9jX3N0YXJ0LCAwKTsKLX0KLQotCi0vKiBydW4gdGhyb3VnaCBhIGZyYWcgY2hhaW4gYW5kIHdyaXRlIG91dCB0aGUgZGF0YSB0byBnbyB3aXRoIGl0LCBmaWxsCi0gICBpbiB0aGUgc2NuaGRycyB3aXRoIHRoZSBpbmZvIG9uIHRoZSBmaWxlIHBvc3Rpb25zCi0qLwotc3RhdGljIHZvaWQKLWZpbGxfc2VjdGlvbiAoYWJmZCwgaCwgZmlsZV9jdXJzb3IpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIG9iamVjdF9oZWFkZXJzICpoIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmZpbGVfY3Vyc29yOwotewotCi0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgcGFkZHIgPSAwOwotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzID0gJihzZWdtZW50X2luZm9baV0uc2NuaGRyKTsKLQotICAgICAgUFJPR1JFU1MgKDEpOwotCi0gICAgICBpZiAocy0+c19uYW1lWzBdKQotCXsKLQkgIGZyYWdTICpmcmFnID0gc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0JICBjaGFyICpidWZmZXI7Ci0KLQkgIGlmIChzLT5zX3NpemUgPT0gMCkKLQkgICAgcy0+c19zY25wdHIgPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYnVmZmVyID0geG1hbGxvYyAocy0+c19zaXplKTsKLQkgICAgICBzLT5zX3NjbnB0ciA9ICpmaWxlX2N1cnNvcjsKLQkgICAgfQotCSAga25vdyAocy0+c19wYWRkciA9PSBwYWRkcik7Ci0KLQkgIGlmIChzdHJjbXAgKHMtPnNfbmFtZSwgIi50ZXh0IikgPT0gMCkKLQkgICAgcy0+c19mbGFncyB8PSBTVFlQX1RFWFQ7Ci0JICBlbHNlIGlmIChzdHJjbXAgKHMtPnNfbmFtZSwgIi5kYXRhIikgPT0gMCkKLQkgICAgcy0+c19mbGFncyB8PSBTVFlQX0RBVEE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKHMtPnNfbmFtZSwgIi5ic3MiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgcy0+c19zY25wdHIgPSAwOwotCSAgICAgIHMtPnNfZmxhZ3MgfD0gU1RZUF9CU1M7Ci0KLQkgICAgICAvKiBAQCBTaG91bGQgbWFrZSB0aGUgaTM4NiBhbmQgYTI5ayBjb2ZmIHRhcmdldHMgZGVmaW5lCi0JCSBDT0ZGX05PTE9BRF9QUk9CTEVNLCBhbmQgaGF2ZSBvbmx5IG9uZSB0ZXN0IGhlcmUuICAqLwotI2lmbmRlZiBUQ19JMzg2Ci0jaWZuZGVmIFRDX0EyOUsKLSNpZm5kZWYgQ09GRl9OT0xPQURfUFJPQkxFTQotCSAgICAgIC8qIEFwcGFyZW50bHkgdGhlIFNWUjMgbGlua2VyIChhbmQgZXhlYyBzeXNjYWxsKSBhbmQgVURJCi0JCSBtb25kZmUgcHJvZ3JlbSBhcmUgY29uZnVzZWQgYnkgbm9sb2FkIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfTk9MT0FEOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKHMtPnNfbmFtZSwgIi5saXQiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzID0gU1RZUF9MSVQgfCBTVFlQX1RFWFQ7Ci0JICBlbHNlIGlmIChzdHJjbXAgKHMtPnNfbmFtZSwgIi5pbml0IikgPT0gMCkKLQkgICAgcy0+c19mbGFncyB8PSBTVFlQX1RFWFQ7Ci0JICBlbHNlIGlmIChzdHJjbXAgKHMtPnNfbmFtZSwgIi5maW5pIikgPT0gMCkKLQkgICAgcy0+c19mbGFncyB8PSBTVFlQX1RFWFQ7Ci0JICBlbHNlIGlmIChzdHJuY21wIChzLT5zX25hbWUsICIuY29tbWVudCIsIDgpID09IDApCi0JICAgIHMtPnNfZmxhZ3MgfD0gU1RZUF9JTkZPOwotCi0JICB3aGlsZSAoZnJhZykKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBmaWxsX3NpemU7Ci0JICAgICAgc3dpdGNoIChmcmFnLT5mcl90eXBlKQotCQl7Ci0JCWNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0JCSAgaWYgKGZyYWctPmZyX2ZpeCkKLQkJICAgIHsKLQkJICAgICAgbWVtY3B5IChidWZmZXIgKyBmcmFnLT5mcl9hZGRyZXNzLAotCQkJICAgICAgZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICh1bnNpZ25lZCBpbnQpIGZyYWctPmZyX2ZpeCk7Ci0JCSAgICAgIG9mZnNldCArPSBmcmFnLT5mcl9maXg7Ci0JCSAgICB9Ci0KLQkJICBicmVhazsKLQkJY2FzZSByc19zcGFjZToKLQkJICBhc3NlcnQgKGZyYWctPmZyX3N5bWJvbCA9PSAwKTsKLQkJY2FzZSByc19maWxsOgotCQljYXNlIHJzX2FsaWduOgotCQljYXNlIHJzX2FsaWduX2NvZGU6Ci0JCWNhc2UgcnNfb3JnOgotCQkgIGlmIChmcmFnLT5mcl9maXgpCi0JCSAgICB7Ci0JCSAgICAgIG1lbWNweSAoYnVmZmVyICsgZnJhZy0+ZnJfYWRkcmVzcywKLQkJCSAgICAgIGZyYWctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAodW5zaWduZWQgaW50KSBmcmFnLT5mcl9maXgpOwotCQkgICAgICBvZmZzZXQgKz0gZnJhZy0+ZnJfZml4OwotCQkgICAgfQotCi0JCSAgZmlsbF9zaXplID0gZnJhZy0+ZnJfdmFyOwotCQkgIGlmIChmaWxsX3NpemUgJiYgZnJhZy0+ZnJfb2Zmc2V0ID4gMCkKLQkJICAgIHsKLQkJICAgICAgdW5zaWduZWQgaW50IGNvdW50OwotCQkgICAgICB1bnNpZ25lZCBpbnQgb2ZmID0gZnJhZy0+ZnJfZml4OwotCQkgICAgICBmb3IgKGNvdW50ID0gZnJhZy0+ZnJfb2Zmc2V0OyBjb3VudDsgY291bnQtLSkKLQkJCXsKLQkJCSAgaWYgKGZpbGxfc2l6ZSArIGZyYWctPmZyX2FkZHJlc3MgKyBvZmYgPD0gcy0+c19zaXplKQotCQkJICAgIHsKLQkJCSAgICAgIG1lbWNweSAoYnVmZmVyICsgZnJhZy0+ZnJfYWRkcmVzcyArIG9mZiwKLQkJCQkgICAgICBmcmFnLT5mcl9saXRlcmFsICsgZnJhZy0+ZnJfZml4LAotCQkJCSAgICAgIGZpbGxfc2l6ZSk7Ci0JCQkgICAgICBvZmYgKz0gZmlsbF9zaXplOwotCQkJICAgICAgb2Zmc2V0ICs9IGZpbGxfc2l6ZTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgcnNfYnJva2VuX3dvcmQ6Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBmcmFnID0gZnJhZy0+ZnJfbmV4dDsKLQkgICAgfQotCi0JICBpZiAocy0+c19zaXplICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAocy0+c19zY25wdHIgIT0gMCkKLQkJewotCQkgIGJmZF93cml0ZSAoYnVmZmVyLCBzLT5zX3NpemUsIDEsIGFiZmQpOwotCQkgICpmaWxlX2N1cnNvciArPSBzLT5zX3NpemU7Ci0JCX0KLQkgICAgICBmcmVlIChidWZmZXIpOwotCSAgICB9Ci0JICBwYWRkciArPSBzLT5zX3NpemU7Ci0JfQotICAgIH0KLX0KLQotLyogQ29mZiBmaWxlIGdlbmVyYXRpb24gJiB1dGlsaXRpZXMgKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfaGVhZGVyX2FwcGVuZCAoYWJmZCwgaCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKiBoOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgY2hhciBidWZmZXJbMTAwMF07Ci0gIGNoYXIgYnVmZmVyb1sxMDAwXTsKLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICB1bnNpZ25lZCBsb25nIHN0cmluZ19zaXplID0gNDsKLSNlbmRpZgotCi0gIGJmZF9zZWVrIChhYmZkLCAwLCAwKTsKLQotI2lmbmRlZiBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUgotICBIX1NFVF9NQUdJQ19OVU1CRVIgKGgsIENPRkZfTUFHSUMpOwotICBIX1NFVF9WRVJTSU9OX1NUQU1QIChoLCAwKTsKLSAgSF9TRVRfRU5UUllfUE9JTlQgKGgsIDApOwotICBIX1NFVF9URVhUX1NUQVJUIChoLCBzZWdtZW50X2luZm9bU0VHX0UwXS5mcmNoYWluUC0+ZnJjaF9yb290LT5mcl9hZGRyZXNzKTsKLSAgSF9TRVRfREFUQV9TVEFSVCAoaCwgc2VnbWVudF9pbmZvW1NFR19FMV0uZnJjaGFpblAtPmZyY2hfcm9vdC0+ZnJfYWRkcmVzcyk7Ci0gIEhfU0VUX1NJWkVPRl9PUFRJT05BTF9IRUFERVIgKGgsIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQoYWJmZCwgJmgtPmFvdXRoZHIsCi0JCQkJCQkJICAgICBidWZmZXJvKSk7Ci0jZWxzZSAvKiBkZWZpbmVkIChPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUikgKi8KLSAgSF9TRVRfU0laRU9GX09QVElPTkFMX0hFQURFUiAoaCwgMCk7Ci0jZW5kaWYgLyogZGVmaW5lZCAoT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIpICovCi0KLSAgaSA9IGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsICZoLT5maWxlaGRyLCBidWZmZXIpOwotCi0gIGJmZF93cml0ZSAoYnVmZmVyLCBpLCAxLCBhYmZkKTsKLSAgYmZkX3dyaXRlIChidWZmZXJvLCBIX0dFVF9TSVpFT0ZfT1BUSU9OQUxfSEVBREVSIChoKSwgMSwgYWJmZCk7Ci0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX0xBU1Q7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWVbMF0pCi0JewotCSAgdW5zaWduZWQgaW50IHNpemU7Ci0KLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCSAgLyogU3VwcG9ydCBsb25nIHNlY3Rpb24gbmFtZXMgYXMgZm91bmQgaW4gUEUuICBUaGlzIGNvZGUKLSAgICAgICAgICAgICBtdXN0IGNvb3JkaW5hdGUgd2l0aCB0aGF0IGluIHdyaXRlX29iamVjdF9maWxlIGFuZAotICAgICAgICAgICAgIHdfc3RyaW5ncy4gICovCi0JICBpZiAoc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSkgPiBTQ05OTUxFTikKLQkgICAgewotCSAgICAgIG1lbXNldCAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWUsIDAsIFNDTk5NTEVOKTsKLQkgICAgICBzcHJpbnRmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZSwgIi8lbHUiLCBzdHJpbmdfc2l6ZSk7Ci0JICAgICAgc3RyaW5nX3NpemUgKz0gc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSkgKyAxOwotCSAgICB9Ci0jZW5kaWYKLQotCSAgc2l6ZSA9IGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwKLQkJCQkJICAgJihzZWdtZW50X2luZm9baV0uc2NuaGRyKSwKLQkJCQkJICAgYnVmZmVyKTsKLQkgIGlmIChzaXplID09IDApCi0JICAgIGFzX2JhZCAoXygiYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0IGZhaWxlZCIpKTsKLQkgIGJmZF93cml0ZSAoYnVmZmVyLCBzaXplLCAxLCBhYmZkKTsKLQl9Ci0gICAgfQotfQotCi0KLWNoYXIgKgotc3ltYm9sX3RvX2NoYXJzIChhYmZkLCB3aGVyZSwgc3ltYm9sUCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIHN5bWJvbFMgKiBzeW1ib2xQOwotewotICB1bnNpZ25lZCBpbnQgbnVtYXV4ID0gc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX251bWF1eDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHZhbHVlVCB2YWw7Ci0KLSAgLyogVHVybiBhbnkgc3ltYm9scyB3aXRoIHJlZ2lzdGVyIGF0dHJpYnV0ZXMgaW50byBhYnMgc3ltYm9scyAqLwotICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gcmVnX3NlY3Rpb24pCi0gICAgewotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgfQotICAvKiBBdCB0aGUgc2FtZSB0aW1lLCByZWxvY2F0ZSBhbGwgc3ltYm9scyB0byB0aGVpciBvdXRwdXQgdmFsdWUgKi8KLQotI2lmbmRlZiBURV9QRQotICB2YWwgPSAoc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKHN5bWJvbFApXS5zY25oZHIuc19wYWRkcgotCSArIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSk7Ci0jZWxzZQotICB2YWwgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0jZW5kaWYKLQotICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgdmFsKTsKLQotICBzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fdmFsdWUgPSB2YWw7Ci0KLSAgd2hlcmUgKz0gYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAmc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9lbnRyeSwKLQkJCQkgIHdoZXJlKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtYXV4OyBpKyspCi0gICAgewotICAgICAgd2hlcmUgKz0gYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChhYmZkLAotCQkJCSAgICAgICZzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2F1eGVudFtpXSwKLQkJCQkgICAgICBTX0dFVF9EQVRBX1RZUEUgKHN5bWJvbFApLAotCQkJCSAgICAgIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApLAotCQkJCSAgICAgIGksIG51bWF1eCwgd2hlcmUpOwotICAgIH0KLSAgcmV0dXJuIHdoZXJlOwotCi19Ci0KLXZvaWQKLWNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgY2hhciB1bmRlcnNjb3JlID0gMDsJCS8qIFN5bWJvbCBoYXMgbGVhZGluZyBfICovCi0KLSAgLyogRWZmZWN0aXZlIHN5bWJvbCAqLwotICAvKiBTdG9yZSB0aGUgcG9pbnRlciBpbiB0aGUgb2Zmc2V0LiAqLwotICBTX1NFVF9aRVJPRVMgKHN5bWJvbFAsIDBMKTsKLSAgU19TRVRfREFUQV9UWVBFIChzeW1ib2xQLCBUX05VTEwpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCAwKTsKLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCwgMCk7Ci0gIC8qIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKi8KLSAgc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9mbGFncyA9IDA7Ci0gIC8qIEF1eGlsaWFyeSBlbnRyaWVzICovCi0gIG1lbXNldCAoKGNoYXIgKikgJnN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzBdLCAwLCBBVVhFU1opOwotCi0gIGlmIChTX0lTX1NUUklORyAoc3ltYm9sUCkpCi0gICAgU0ZfU0VUX1NUUklORyAoc3ltYm9sUCk7Ci0gIGlmICghdW5kZXJzY29yZSAmJiBTX0lTX0xPQ0FMIChzeW1ib2xQKSkKLSAgICBTRl9TRVRfTE9DQUwgKHN5bWJvbFApOwotfQotCi0vKgotICogSGFuZGxlIC5sbiBkaXJlY3RpdmVzLgotICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9sbiAoYXBwbGluZSkKLSAgICAgaW50IGFwcGxpbmU7Ci17Ci0gIGludCBsOwotCi0gIGlmICghIGFwcGxpbmUgJiYgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5sbiBwc2V1ZG8tb3AgaW5zaWRlIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiB3cm9uZyBjb250ZXh0ICovCi0KLSAgbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBjX2xpbmVfbmV3ICgwLCBmcmFnX25vd19maXggKCksIGwsIGZyYWdfbm93KTsKLQotICBpZiAoYXBwbGluZSkKLSAgICBuZXdfbG9naWNhbF9saW5lICgoY2hhciAqKSBOVUxMLCBsIC0gMSk7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICB7Ci0gICAgZXh0ZXJuIGludCBsaXN0aW5nOwotCi0gICAgaWYgKGxpc3RpbmcpCi0gICAgICB7Ci0JaWYgKCEgYXBwbGluZSkKLQkgIGwgKz0gbGluZV9iYXNlIC0gMTsKLQlsaXN0aW5nX3NvdXJjZV9saW5lICgodW5zaWduZWQgaW50KSBsKTsKLSAgICAgIH0KLQotICB9Ci0jZW5kaWYKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyoKLSAqCQkJZGVmKCkKLSAqCi0gKiBIYW5kbGUgLmRlZiBkaXJlY3RpdmVzLgotICoKLSAqIE9uZSBtaWdodCBhc2sgOiB3aHkgY2FuJ3Qgd2Ugc3ltYm9sX25ldyBpZiB0aGUgc3ltYm9sIGRvZXMgbm90Ci0gKiBhbHJlYWR5IGV4aXN0IGFuZCBmaWxsIGl0IHdpdGggZGVidWcgaW5mb3JtYXRpb24uICBCZWNhdXNlIG9mCi0gKiB0aGUgQ19FRkNOIHNwZWNpYWwgc3ltYm9sLiBJdCB3b3VsZCBjbG9iYmVyIHRoZSB2YWx1ZSBvZiB0aGUKLSAqIGZ1bmN0aW9uIHN5bWJvbCBiZWZvcmUgd2UgaGF2ZSBhIGNoYW5jZSB0byBub3RpY2UgdGhhdCBpdCBpcwotICogYSBDX0VGQ04uIEFuZCBhIHNlY29uZCByZWFzb24gaXMgdGhhdCB0aGUgY29kZSBpcyBtb3JlIGNsZWFyIHRoaXMKLSAqIHdheS4gKGF0IGxlYXN0IEkgdGhpbmsgaXQgaXMgOi0pLgotICoKLSAqLwotCi0jZGVmaW5lIFNLSVBfU0VNSV9DT0xPTigpCXdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJzsnKQotI2RlZmluZSBTS0lQX1dISVRFU1BBQ0VTKCkJd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnIHx8IFwKLQkJCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID09ICdcdCcpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9kZWYgKHdoYXQpCi0gICAgIGludCB3aGF0IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgbmFtZV9lbmQ7CQkvKiBDaGFyIGFmdGVyIHRoZSBlbmQgb2YgbmFtZSAqLwotICBjaGFyICpzeW1ib2xfbmFtZTsJCS8qIE5hbWUgb2YgdGhlIGRlYnVnIHN5bWJvbCAqLwotICBjaGFyICpzeW1ib2xfbmFtZV9jb3B5OwkvKiBUZW1wb3JhcnkgY29weSBvZiB0aGUgbmFtZSAqLwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX25hbWVfbGVuZ3RoOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmRlZiBwc2V1ZG8tb3AgdXNlZCBpbnNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTS0lQX1dISVRFU1BBQ0VTICgpOwotCi0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSAoc3ltYm9sUyAqKSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAoKmRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKTsKLSAgbWVtc2V0IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAwLCBzaXplb2YgKCpkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSk7Ci0KLSAgc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bWJvbF9uYW1lX2xlbmd0aCA9IHN0cmxlbiAoc3ltYm9sX25hbWUpOwotICBzeW1ib2xfbmFtZV9jb3B5ID0geG1hbGxvYyAoc3ltYm9sX25hbWVfbGVuZ3RoICsgMSk7Ci0gIHN0cmNweSAoc3ltYm9sX25hbWVfY29weSwgc3ltYm9sX25hbWUpOwotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBzeW1ib2xfbmFtZV9jb3B5ID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZV9jb3B5KTsKLSNlbmRpZgotCi0gIC8qIEluaXRpYWxpemUgdGhlIG5ldyBzeW1ib2wgKi8KLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIFNfU0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICgqc3ltYm9sX25hbWVfY29weSA9PSAnXycKLQkJCQkgICAgICAgPyBzeW1ib2xfbmFtZV9jb3B5ICsgMQotCQkJCSAgICAgICA6IHN5bWJvbF9uYW1lX2NvcHkpKTsKLSNlbHNlIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KLSAgU19TRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX25hbWVfY29weSk7Ci0jZW5kaWYgLyogU1RSSVBfVU5ERVJTQ09SRSAqLwotICAvKiBmcmVlKHN5bWJvbF9uYW1lX2NvcHkpOyAqLwotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV9uYW1lX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKSB+MDsKLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfbnVtYmVyID0gfjA7Ci0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAwKTsKLQotICBpZiAoU19JU19TVFJJTkcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgIFNGX1NFVF9TVFJJTkcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi11bnNpZ25lZCBpbnQgZGltX2luZGV4OwotCi0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9lbmRlZiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFAgPSAwOwotICAvKiBESU0gQlVHIEZJWCBzYWNAY3lnbnVzLmNvbSAqLwotICBkaW1faW5kZXggPSAwOwotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5lbmRlZiBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgLyogU2V0IHRoZSBzZWN0aW9uIG51bWJlciBhY2NvcmRpbmcgdG8gc3RvcmFnZSBjbGFzcy4gKi8KLSAgc3dpdGNoIChTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICB7Ci0gICAgY2FzZSBDX1NUUlRBRzoKLSAgICBjYXNlIENfRU5UQUc6Ci0gICAgY2FzZSBDX1VOVEFHOgotICAgICAgU0ZfU0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgQ19GSUxFOgotICAgIGNhc2UgQ19UUERFRjoKLSAgICAgIFNGX1NFVF9ERUJVRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBTRUdfREVCVUcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfRUZDTjoKLSAgICAgIFNGX1NFVF9MT0NBTCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CS8qIERvIG5vdCBlbWl0IHRoaXMgc3ltYm9sLiAqLwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfQkxPQ0s6Ci0gICAgICBTRl9TRVRfUFJPQ0VTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CS8qIFdpbGwgbmVlZCBwcm9jZXNzaW5nIGJlZm9yZSB3cml0aW5nICovCi0gICAgICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotICAgIGNhc2UgQ19GQ046Ci0gICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBTRUdfRTApOwotCi0gICAgICBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwgIi5iZiIpID09IDApCi0JewkJCS8qIC5iZiAqLwotCSAgaWYgKGZ1bmN0aW9uX2xpbmVvZmYgPCAwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJgLmJmJyBzeW1ib2wgd2l0aG91dCBwcmVjZWRpbmcgZnVuY3Rpb25cbiIpKTsKLQkgICAgfQkJCS8qIG1pc3NpbmcgZnVuY3Rpb24gc3ltYm9sICovCi0JICBTQV9HRVRfU1lNX0xOTk9QVFIgKGxhc3RfbGluZV9zeW1ib2wpID0gZnVuY3Rpb25fbGluZW9mZjsKLQotCSAgU0ZfU0VUX1BST0NFU1MgKGxhc3RfbGluZV9zeW1ib2wpOwotCSAgU0ZfU0VUX0FESl9MTk5PUFRSIChsYXN0X2xpbmVfc3ltYm9sKTsKLQkgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQkgIGZ1bmN0aW9uX2xpbmVvZmYgPSAtMTsKLQl9Ci0gICAgICAvKiBWYWx1ZSBpcyBhbHdheXMgc2V0IHRvIC4gKi8KLSAgICAgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X2ZyYWcgPSBmcmFnX25vdzsKLSAgICAgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBDX0FVVE9BUkcKLSAgICBjYXNlIENfQVVUT0FSRzoKLSNlbmRpZiAvKiBDX0FVVE9BUkcgKi8KLSAgICBjYXNlIENfQVVUTzoKLSAgICBjYXNlIENfUkVHOgotICAgIGNhc2UgQ19NT1M6Ci0gICAgY2FzZSBDX01PRToKLSAgICBjYXNlIENfTU9VOgotICAgIGNhc2UgQ19BUkc6Ci0gICAgY2FzZSBDX1JFR1BBUk06Ci0gICAgY2FzZSBDX0ZJRUxEOgotICAgIGNhc2UgQ19FT1M6Ci0gICAgICBTRl9TRVRfREVCVUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19FWFQ6Ci0gICAgY2FzZSBDX1dFQUtFWFQ6Ci0jaWZkZWYgVEVfUEUKLSAgICBjYXNlIENfTlRfV0VBSzoKLSNlbmRpZgotICAgIGNhc2UgQ19TVEFUOgotICAgIGNhc2UgQ19MQUJFTDoKLSAgICAgIC8qIFZhbGlkIGJ1dCBzZXQgc29tZXdoZXJlIGVsc2UgKHNfY29tbSwgc19sY29tbSwgY29sb24pICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19VU1RBVElDOgotICAgIGNhc2UgQ19FWFRERUY6Ci0gICAgY2FzZSBDX1VMQUJFTDoKLSAgICAgIGFzX3dhcm4gKF8oInVuZXhwZWN0ZWQgc3RvcmFnZSBjbGFzcyAlZCIpLCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSk7Ci0gICAgICBicmVhazsKLSAgICB9CQkJCS8qIHN3aXRjaCBvbiBzdG9yYWdlIGNsYXNzICovCi0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSBidWlsdCBhIGRlYnVnIHN5bWJvbCwgdHJ5IHRvIGZpbmQgaWYgd2Ugc2hvdWxkCi0gICAgIG1lcmdlIHdpdGggYW4gZXhpc3Rpbmcgc3ltYm9sIG9yIG5vdC4gIElmIGEgc3ltYm9sIGlzIENfRUZDTiBvcgotICAgICBhYnNvbHV0ZV9zZWN0aW9uIG9yIHVudGFnZ2VkIFNFR19ERUJVRyBpdCBuZXZlciBtZXJnZXMuICBXZSBhbHNvCi0gICAgIGRvbid0IG1lcmdlIGxhYmVscywgd2hpY2ggYXJlIGluIGEgZGlmZmVyZW50IG5hbWVzcGFjZSwgbm9yCi0gICAgIHN5bWJvbHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4gZGVmaW5lZCBzaW5jZSB0aGV5IGFyZSB0eXBpY2FsbHkKLSAgICAgdW5pcXVlLCBub3IgZG8gd2UgbWVyZ2UgdGFncyB3aXRoIG5vbi10YWdzLiAgKi8KLQotICAvKiBUd28gY2FzZXMgZm9yIGZ1bmN0aW9ucy4gIEVpdGhlciBkZWJ1ZyBmb2xsb3dlZCBieSBkZWZpbml0aW9uIG9yCi0gICAgIGRlZmluaXRpb24gZm9sbG93ZWQgYnkgZGVidWcuICBGb3IgZGVmaW5pdGlvbiBmaXJzdCwgd2Ugd2lsbAotICAgICBtZXJnZSB0aGUgZGVidWcgc3ltYm9sIGludG8gdGhlIGRlZmluaXRpb24uICBGb3IgZGVidWcgZmlyc3QsIHRoZQotICAgICBsaW5lbm8gZW50cnkgTVVTVCBwb2ludCB0byB0aGUgZGVmaW5pdGlvbiBmdW5jdGlvbiBvciBlbHNlIGl0Ci0gICAgIHdpbGwgcG9pbnQgb2ZmIGludG8gc3BhY2Ugd2hlbiBjcmF3bF9zeW1ib2xzKCkgbWVyZ2VzIHRoZSBkZWJ1ZwotICAgICBzeW1ib2wgaW50byB0aGUgcmVhbCBzeW1ib2wuICBUaGVyZWZvciwgbGV0J3MgcHJlc3VtZSB0aGUgZGVidWcKLSAgICAgc3ltYm9sIGlzIGEgcmVhbCBmdW5jdGlvbiByZWZlcmVuY2UuICovCi0KLSAgLyogRklYTUUtU09PTiBJZiBmb3Igc29tZSByZWFzb24gdGhlIGRlZmluaXRpb24gbGFiZWwvc3ltYm9sIGlzCi0gICAgIG5ldmVyIHNlZW4sIHRoaXMgd2lsbCBwcm9iYWJseSBsZWF2ZSBhbiB1bmRlZmluZWQgc3ltYm9sIGF0IGxpbmsKLSAgICAgdGltZS4gKi8KLQotICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gQ19FRkNOCi0gICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBDX0xBQkVMCi0gICAgICB8fCAoU19HRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gU0VHX0RFQlVHCi0JICAmJiAhU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgICB8fCBTX0dFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0gICAgICB8fCBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgIHx8IChzeW1ib2xQID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksIERPX05PVF9TVFJJUCkpID09IE5VTEwKLSAgICAgIHx8IChTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSAhPSBTRl9HRVRfVEFHIChzeW1ib2xQKSkpCi0gICAgewotICAgICAgc3ltYm9sX2FwcGVuZCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLAotCQkgICAgICZzeW1ib2xfbGFzdFApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoaXMgc3ltYm9sIGFscmVhZHkgZXhpc3RzLCBtZXJnZSB0aGUgbmV3bHkgY3JlYXRlZCBzeW1ib2wKLQkgaW50byB0aGUgb2xkIG9uZS4gIFRoaXMgaXMgbm90IG1hbmRhdG9yeS4gVGhlIGxpbmtlciBjYW4KLQkgaGFuZGxlIGR1cGxpY2F0ZSBzeW1ib2xzIGNvcnJlY3RseS4gQnV0IEkgZ3Vlc3MgdGhhdCBpdCBzYXZlCi0JIGEgKmxvdCogb2Ygc3BhY2UgaWYgdGhlIGFzc2VtYmx5IGZpbGUgZGVmaW5lcyBhIGxvdCBvZgotCSBzeW1ib2xzLiBbbG9pY10gKi8KLQotICAgICAgLyogVGhlIGRlYnVnIGVudHJ5IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSBpcyBtZXJnZWQgaW50byB0aGUKLQkgcHJldmlvdXMgZGVmaW5pdGlvbi4gICovCi0KLSAgICAgIGNfc3ltYm9sX21lcmdlIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xQKTsKLSAgICAgIC8qIEZJWE1FLVNPT04gU2hvdWxkICpkZWZfc3ltYm9sX2luX3Byb2dyZXNzIGJlIGZyZWUnZD8geG94b3JpY2guICovCi0gICAgICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzID0gc3ltYm9sUDsKLQotICAgICAgaWYgKFNGX0dFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykKLQkgIHx8IFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpCi0JICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBDX1NUQVQpCi0JewotCSAgLyogRm9yIGZ1bmN0aW9ucywgYW5kIHRhZ3MsIGFuZCBzdGF0aWMgc3ltYm9scywgdGhlIHN5bWJvbAotCSAgICAgKm11c3QqIGJlIHdoZXJlIHRoZSBkZWJ1ZyBzeW1ib2wgYXBwZWFycy4gIE1vdmUgdGhlCi0JICAgICBleGlzdGluZyBzeW1ib2wgdG8gdGhlIGN1cnJlbnQgcGxhY2UuICovCi0JICAvKiBJZiBpdCBhbHJlYWR5IGlzIGF0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCBsaXN0LCBkbyBub3RoaW5nICovCi0JICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBzeW1ib2xfbGFzdFApCi0JICAgIHsKLQkgICAgICBzeW1ib2xfcmVtb3ZlIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAmc3ltYm9sX3Jvb3RQLAotCQkJICAgICAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBzeW1ib2xfYXBwZW5kIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xfbGFzdFAsCi0JCQkgICAgICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICB9CQkJLyogaWYgbm90IGFscmVhZHkgaW4gcGxhY2UgKi8KLQl9CQkJLyogaWYgZnVuY3Rpb24gKi8KLSAgICB9CQkJCS8qIG5vcm1hbCBvciBtZXJnYWJsZSAqLwotCi0gIGlmIChTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpvbGR0YWc7Ci0KLSAgICAgIG9sZHRhZyA9IHN5bWJvbF9maW5kX2Jhc2UgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLAotCQkJCSBET19OT1RfU1RSSVApOwotICAgICAgaWYgKG9sZHRhZyA9PSBOVUxMIHx8ICEgU0ZfR0VUX1RBRyAob2xkdGFnKSkKLQl0YWdfaW5zZXJ0IChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwKLQkJICAgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgIH0KLQotICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICB7Ci0gICAgICBrbm93IChzaXplb2YgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpIDw9IHNpemVvZiAobG9uZykpOwotICAgICAgZnVuY3Rpb25fbGluZW9mZgotCT0gY19saW5lX25ldyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMCwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICAgICAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCi0gICAgICBpZiAoc3ltYm9sUCA9PSBOVUxMKQotCXsKLQkgIC8qIFRoYXQgaXMsIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UndmUgc2VlbiB0aGUKLQkgICAgIGZ1bmN0aW9uLi4uICovCi0JICBzeW1ib2xfdGFibGVfaW5zZXJ0IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQl9CQkJLyogZGVmaW5pdGlvbiBmb2xsb3dzIGRlYnVnICovCi0gICAgfQkJCQkvKiBDcmVhdGUgdGhlIGxpbmUgbnVtYmVyIGVudHJ5IHBvaW50aW5nIHRvIHRoZSBmdW5jdGlvbiBiZWluZyBkZWZpbmVkICovCi0KLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9IE5VTEw7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9kaW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgZGltX2luZGV4OwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0KLSAgZm9yIChkaW1faW5kZXggPSAwOyBkaW1faW5kZXggPCBESU1OVU07IGRpbV9pbmRleCsrKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRVMgKCk7Ci0gICAgICBTQV9TRVRfU1lNX0RJTUVOIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBkaW1faW5kZXgsCi0JCQlnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQl7Ci0JY2FzZSAnLCc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFzX3dhcm4gKF8oImJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSBpZ25vcmVkIikpOwotCSAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQljYXNlICdcbic6Ci0JY2FzZSAnOyc6Ci0JICBkaW1faW5kZXggPSBESU1OVU07Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9saW5lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IHRoaXNfYmFzZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG9ial9jb2ZmX2xuICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICB0aGlzX2Jhc2UgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICAvKiBPbmx5IC5iZiBzeW1ib2xzIGluZGljYXRlIHRoZSB1c2Ugb2YgYSBuZXcgYmFzZSBsaW5lIG51bWJlcjsgdGhlCi0gICAgIGxpbmUgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggLmVmLCAuYmIsIC5lYiBhcmUgcmVsYXRpdmUgdG8gdGhlCi0gICAgIHN0YXJ0IG9mIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uLiAgKi8KLSAgaWYgKCFzdHJjbXAgKCIuYmYiLCBuYW1lKSkKLSAgICB7Ci0jaWYgMCAvKiBYWFggQ2FuIHdlIGV2ZXIgaGF2ZSBsaW5lIG51bWJlcnMgZ29pbmcgYmFja3dhcmRzPyAgKi8KLSAgICAgIGlmICh0aGlzX2Jhc2UgPiBsaW5lX2Jhc2UpCi0jZW5kaWYKLQl7Ci0JICBsaW5lX2Jhc2UgPSB0aGlzX2Jhc2U7Ci0JfQotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgICAgIHsKLQlleHRlcm4gaW50IGxpc3Rpbmc7Ci0JaWYgKGxpc3RpbmcpCi0JICB7Ci0JICAgIGxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGxpbmVfYmFzZSk7Ci0JICB9Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0gIFNBX1NFVF9TWU1fTE5OTyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgdGhpc19iYXNlKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfc2l6ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnNpemUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0gIFNBX1NFVF9TWU1fU0laRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfc2NsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuc2NsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3RhZyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKnN5bWJvbF9uYW1lOwotICBjaGFyIG5hbWVfZW5kOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnRhZyBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0gIHN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBzeW1ib2xfbmFtZSA9IHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoc3ltYm9sX25hbWUpOwotI2VuZGlmCi0KLSAgLyogQXNzdW1lIHRoYXQgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSAudGFnIGlzIGFsd2F5cyBkZWZpbmVkLgotICAgICBUaGlzIHdhcyBhIGJhZCBhc3N1bXB0aW9uLiAgSSd2ZSBhZGRlZCBmaW5kX29yX21ha2UuIHhveG9yaWNoLiAqLwotICBTQV9TRVRfU1lNX1RBR05EWCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywKLQkJICAgICAobG9uZykgdGFnX2ZpbmRfb3JfbWFrZSAoc3ltYm9sX25hbWUpKTsKLSAgaWYgKFNBX0dFVF9TWU1fVEFHTkRYIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSAwTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJ0YWcgbm90IGZvdW5kIGZvciAudGFnICVzIiksIHN5bWJvbF9uYW1lKTsKLSAgICB9CQkJCS8qIG5vdCBkZWZpbmVkICovCi0KLSAgU0ZfU0VUX1RBR0dFRCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdHlwZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnR5cGUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfREFUQV9UWVBFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgaWYgKElTRkNOIChTX0dFVF9EQVRBX1RZUEUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKSAmJgotICAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgIT0gQ19UUERFRikKLSAgICB7Ci0gICAgICBTRl9TRVRfRlVOQ1RJT04gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgIH0JCQkJLyogaXMgYSBmdW5jdGlvbiAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl92YWwgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi52YWwgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgY2hhciBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKCFzdHJjbXAgKHN5bWJvbF9uYW1lLCAiLiIpKQotCXsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X2ZyYWcgPSBmcmFnX25vdzsKLQkgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCSAgLyogSWYgdGhlIC52YWwgaXMgIT0gZnJvbSB0aGUgLmRlZiAoZS5nLiBzdGF0aWNzKSAqLwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksIHN5bWJvbF9uYW1lKSkKLQl7Ci0JICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX29wID0gT19zeW1ib2w7Ci0JICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wgPQotCSAgICBzeW1ib2xfZmluZF9vcl9tYWtlIChzeW1ib2xfbmFtZSk7Ci0JICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPSAwOwotCi0JICAvKiBJZiB0aGUgc2VnbWVudCBpcyB1bmRlZmluZWQgd2hlbiB0aGUgZm9yd2FyZCByZWZlcmVuY2UgaXMKLQkgICAgIHJlc29sdmVkLCB0aGVuIGNvcHkgdGhlIHNlZ21lbnQgaWQgZnJvbSB0aGUgZm9yd2FyZAotCSAgICAgc3ltYm9sLiAgKi8KLQkgIFNGX1NFVF9HRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0KLQkgIC8qIEZJWE1FOiBnY2MgY2FuIGdlbmVyYXRlIGFkZHJlc3MgZXhwcmVzc2lvbnMgaGVyZSBpbgotCSAgICAgdW51c3VhbCBjYXNlcyAoc2VhcmNoIGZvciAib2JzY3VyZSIgaW4gc2Rib3V0LmMpLiAgV2UKLQkgICAgIGp1c3QgaWdub3JlIHRoZSBvZmZzZXQgaGVyZSwgdGh1cyBnZW5lcmF0aW5nIGluY29ycmVjdAotCSAgICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgV2UgaWdub3JlIHRoZSByZXN0IG9mIHRoZSBsaW5lCi0JICAgICBqdXN0IGJlbG93LiAgKi8KLQl9Ci0gICAgICAvKiBPdGhlcndpc2UsIGl0IGlzIHRoZSBuYW1lIG9mIGEgbm9uIGRlYnVnIHN5bWJvbCBhbmQKLQkgaXRzIHZhbHVlIHdpbGwgYmUgY2FsY3VsYXRlZCBsYXRlci4gKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICAgICAgLyogRklYTUU6IHRoaXMgaXMgdG8gYXZvaWQgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGUKLQkgRklYTUUgY2FzZSBtZW50aW9uZWQganVzdCBhYm92ZS4gICovCi0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsCi0JCSAgICh2YWx1ZVQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgICB9CQkJCS8qIGlmIHN5bWJvbCBiYXNlZCAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLSNpZmRlZiBURV9QRQotCi0vKiBIYW5kbGUgdGhlIC5saW5rb25jZSBwc2V1ZG8tb3AuICBUaGlzIGlzIHBhcnNlZCBieSBzX2xpbmtvbmNlIGluCi0gICByZWFkLmMsIHdoaWNoIHRoZW4gY2FsbHMgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQgc3BlY2lmaWMgcm91dGluZS4gICovCi0KLXZvaWQKLW9ial9jb2ZmX3BlX2hhbmRsZV9saW5rX29uY2UgKHR5cGUpCi0gICAgIGVudW0gbGlua29uY2VfdHlwZSB0eXBlOwotewotICBzZWdfaW5mbyAobm93X3NlZyktPnNjbmhkci5zX2ZsYWdzIHw9IElNQUdFX1NDTl9MTktfQ09NREFUOwotCi0gIC8qIFdlIHN0b3JlIHRoZSB0eXBlIGluIHRoZSBzZWdfaW5mbyBzdHJ1Y3R1cmUsIGFuZCB1c2UgaXQgdG8gc2V0IHVwCi0gICAgIHRoZSBhdXhpbGlhcnkgZW50cnkgZm9yIHRoZSBzZWN0aW9uIHN5bWJvbCBpbiBjX3NlY3Rpb25fc3ltYm9sLiAgKi8KLSAgc2VnX2luZm8gKG5vd19zZWcpLT5saW5rb25jZSA9IHR5cGU7Ci19Ci0KLSNlbmRpZiAvKiBURV9QRSAqLwotCi12b2lkCi1jb2ZmX29ial9yZWFkX2JlZ2luX2hvb2sgKCkKLXsKLSAgLyogVGhlc2UgaGFkIGJldHRlciBiZSB0aGUgc2FtZS4gIFVzdWFsbHkgMTggYnl0ZXMuICovCi0jaWZuZGVmIEJGRF9IRUFERVJTCi0gIGtub3cgKHNpemVvZiAoU1lNRU5UKSA9PSBzaXplb2YgKEFVWEVOVCkpOwotICBrbm93IChTWU1FU1ogPT0gQVVYRVNaKTsKLSNlbmRpZgotICB0YWdfaW5pdCAoKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBydW5zIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBhbmQgcHV0cyBhbGwgdGhlCi0gICBleHRlcm5hbHMgb250byBhbm90aGVyIGNoYWluICovCi0KLS8qIFRoZSBjaGFpbiBvZiBnbG9iYWxzLiAgKi8KLXN5bWJvbFMgKnN5bWJvbF9nbG9iYWxQOwotc3ltYm9sUyAqc3ltYm9sX2dsb2JhbF9sYXN0UDsKLQotLyogVGhlIGNoYWluIG9mIGV4dGVybmFscyAqLwotc3ltYm9sUyAqc3ltYm9sX2V4dGVyblA7Ci1zeW1ib2xTICpzeW1ib2xfZXh0ZXJuX2xhc3RQOwotCi1zdGFjayAqYmxvY2tfc3RhY2s7Ci1zeW1ib2xTICpsYXN0X2Z1bmN0aW9uUDsKLXN0YXRpYyBzeW1ib2xTICpsYXN0X2JmUDsKLXN5bWJvbFMgKmxhc3RfdGFnUDsKLQotc3RhdGljIHVuc2lnbmVkIGludAoteWFua19zeW1ib2xzICgpCi17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfbnVtYmVyID0gMDsKLSAgdW5zaWduZWQgaW50IGxhc3RfZmlsZV9zeW1ubyA9IDA7Ci0KLSAgc3RydWN0IGZpbGVuYW1lX2xpc3QgKmZpbGVuYW1lX2xpc3Rfc2NhbiA9IGZpbGVuYW1lX2xpc3RfaGVhZDsKLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7Ci0gICAgICAgc3ltYm9sUDsKLSAgICAgICBzeW1ib2xQID0gc3ltYm9sUCA/IHN5bWJvbF9uZXh0IChzeW1ib2xQKSA6IHN5bWJvbF9yb290UCkKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sUC0+c3lfbXJpX2NvbW1vbikKLQl7Ci0JICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19FWFQKLSNpZmRlZiBURV9QRQotCSAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlRfV0VBSwotI2VuZGlmCi0JICAgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19XRUFLRVhUKQotCSAgICBhc19iYWQgKF8oIiVzOiBnbG9iYWwgc3ltYm9scyBub3Qgc3VwcG9ydGVkIGluIGNvbW1vbiBzZWN0aW9ucyIpLAotCQkgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCSAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICghU0ZfR0VUX0RFQlVHIChzeW1ib2xQKSkKLQl7Ci0JICAvKiBEZWJ1ZyBzeW1ib2xzIGRvIG5vdCBuZWVkIGFsbCB0aGlzIHJ1YmJpc2ggKi8KLQkgIHN5bWJvbFMgKnJlYWxfc3ltYm9sUDsKLQotCSAgLyogTCogYW5kIENfRUZDTiBzeW1ib2xzIG5ldmVyIG1lcmdlLiAqLwotCSAgaWYgKCFTRl9HRVRfTE9DQUwgKHN5bWJvbFApCi0JICAgICAgJiYgIVNGX0dFVF9TVEFUSUNTIChzeW1ib2xQKQotCSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApICE9IENfTEFCRUwKLQkgICAgICAmJiBzeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICAmJiAocmVhbF9zeW1ib2xQID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoc3ltYm9sUCksIERPX05PVF9TVFJJUCkpCi0JICAgICAgJiYgcmVhbF9zeW1ib2xQICE9IHN5bWJvbFApCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRS1TT09OOiB3aGVyZSBkbyBkdXBzIGNvbWUgZnJvbT8KLQkJIE1heWJlIHRhZyByZWZlcmVuY2VzIGJlZm9yZSBkZWZpbml0aW9ucz8geG94b3JpY2guICovCi0JICAgICAgLyogTW92ZSB0aGUgZGVidWcgZGF0YSBmcm9tIHRoZSBkZWJ1ZyBzeW1ib2wgdG8gdGhlCi0JCSByZWFsIHN5bWJvbC4gRG8gTk9UIGRvIHRoZSBvcG9zaXRlIChpLmUuIG1vdmUgZnJvbQotCQkgcmVhbCBzeW1ib2wgdG8gZGVidWcgc3ltYm9sIGFuZCByZW1vdmUgcmVhbCBzeW1ib2wgZnJvbSB0aGUKLQkJIGxpc3QuKSBCZWNhdXNlIHNvbWUgcG9pbnRlcnMgcmVmZXIgdG8gdGhlIHJlYWwgc3ltYm9sCi0JCSB3aGVyZWFzIG5vIHBvaW50ZXJzIHJlZmVyIHRvIHRoZSBkZWJ1ZyBzeW1ib2wuICovCi0JICAgICAgY19zeW1ib2xfbWVyZ2UgKHN5bWJvbFAsIHJlYWxfc3ltYm9sUCk7Ci0JICAgICAgLyogUmVwbGFjZSB0aGUgY3VycmVudCBzeW1ib2wgYnkgdGhlIHJlYWwgb25lICovCi0JICAgICAgLyogVGhlIHN5bWJvbHMgd2lsbCBuZXZlciBiZSB0aGUgbGFzdCBvciB0aGUgZmlyc3QKLQkJIGJlY2F1c2UgOiAxc3Qgc3ltYm9sIGlzIC5maWxlIGFuZCAzIGxhc3Qgc3ltYm9scyBhcmUKLQkJIC50ZXh0LCAuZGF0YSwgLmJzcyAqLwotCSAgICAgIHN5bWJvbF9yZW1vdmUgKHJlYWxfc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgc3ltYm9sX2luc2VydCAocmVhbF9zeW1ib2xQLCBzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBzeW1ib2xQID0gcmVhbF9zeW1ib2xQOwotCSAgICB9CQkJLyogaWYgbm90IGxvY2FsIGJ1dCBkdXAnZCAqLwotCi0JICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgJiYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19FMSkpCi0JICAgIHsKLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBTRUdfRTApOwotCSAgICB9CQkJLyogcHVzaCBkYXRhIGludG8gdGV4dCAqLwotCi0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sUCwgMSk7Ci0KLQkgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX05VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgIVNGX0dFVF9MT0NBTCAoc3ltYm9sUCkpCi0JCXsKLQkJICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfRTApCi0JCXsKLQkJICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX0xBQkVMKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfU1RBVCk7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBNYWlubHkgdG8gc3BlZWQgdXAgaWYgbm90IC1nICovCi0JICBpZiAoU0ZfR0VUX1BST0NFU1MgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgLyogSGFuZGxlIHRoZSBuZXN0ZWQgYmxvY2tzIGF1eGlsaWFyeSBpbmZvLiAqLwotCSAgICAgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0JMT0NLKQotCQl7Ci0JCSAgaWYgKCFzdHJjbXAgKFNfR0VUX05BTUUgKHN5bWJvbFApLCAiLmJiIikpCi0JCSAgICBzdGFja19wdXNoIChibG9ja19zdGFjaywgKGNoYXIgKikgJnN5bWJvbFApOwotCQkgIGVsc2UKLQkJICAgIHsJCS8qIC5lYiAqLwotCQkgICAgICByZWdpc3RlciBzeW1ib2xTICpiZWdpbl9zeW1ib2xQOwotCQkgICAgICBiZWdpbl9zeW1ib2xQID0gKihzeW1ib2xTICoqKSBzdGFja19wb3AgKGJsb2NrX3N0YWNrKTsKLQkJICAgICAgaWYgKGJlZ2luX3N5bWJvbFAgPT0gKHN5bWJvbFMgKikgMCkKLQkJCWFzX3dhcm4gKF8oIm1pc21hdGNoZWQgLmViIikpOwotCQkgICAgICBlbHNlCi0JCQlTQV9TRVRfU1lNX0VORE5EWCAoYmVnaW5fc3ltYm9sUCwgc3ltYm9sX251bWJlciArIDIpOwotCQkgICAgfQotCQl9Ci0JICAgICAgLyogSWYgd2UgYXJlIGFibGUgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgYSBmdW5jdGlvbiwgYW5kIHdlCi0JICAgICAgIGFyZSBvdXQgb2YgYSBmdW5jdGlvbiAobGFzdF9mdW5jdGlvblAgPT0gMCkgdGhlbiwgdGhlCi0JICAgICAgIGZ1bmN0aW9uIHN5bWJvbCB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBhdXhpbGlhcnkKLQkgICAgICAgZW50cnkuICovCi0JICAgICAgaWYgKGxhc3RfZnVuY3Rpb25QID09IChzeW1ib2xTICopIDAgJiYKLQkJICBTRl9HRVRfRlVOQ1RJT04gKHN5bWJvbFApKQotCQl7Ci0JCSAgbGFzdF9mdW5jdGlvblAgPSBzeW1ib2xQOwotCi0JCSAgaWYgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFApIDwgMSkKLQkJICAgIHsKLQkJICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCwgMSk7Ci0JCSAgICB9CQkvKiBtYWtlIGl0IGF0IGxlYXN0IDEgKi8KLQotCQkgIC8qIENsb2JiZXIgcG9zc2libGUgc3RhbGUgLmRpbSBpbmZvcm1hdGlvbi4gKi8KLSNpZiAwCi0JCSAgLyogSWZmZWQgb3V0IGJ5IHN0ZXZlIC0gdGhpcyBmcmllcyB0aGUgbG5ub3B0ciBpbmZvIHRvbyAqLwotCQkgIGJ6ZXJvIChzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXS54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuLAotCQkJIHNpemVvZiAoc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMF0ueF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lbikpOwotI2VuZGlmCi0JCX0KLQkgICAgICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19GQ04pCi0JCXsKLQkJICBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChzeW1ib2xQKSwgIi5iZiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChsYXN0X2JmUCAhPSBOVUxMKQotCQkJU0FfU0VUX1NZTV9FTkRORFggKGxhc3RfYmZQLCBzeW1ib2xfbnVtYmVyKTsKLQkJICAgICAgbGFzdF9iZlAgPSBzeW1ib2xQOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19FRkNOKQotCQl7Ci0JCSAgLyogSSBkb24ndCBldmVuIGtub3cgaWYgdGhpcyBpcyBuZWVkZWQgZm9yIHNkYi4gQnV0Ci0JCSAgICAgdGhlIHN0YW5kYXJkIGFzc2VtYmxlciBnZW5lcmF0ZXMgaXQsIHNvLi4uICAqLwotCQkgIGlmIChsYXN0X2Z1bmN0aW9uUCA9PSAoc3ltYm9sUyAqKSAwKQotCQkgICAgYXNfZmF0YWwgKF8oIkNfRUZDTiBzeW1ib2wgb3V0IG9mIHNjb3BlIikpOwotCQkgIFNBX1NFVF9TWU1fRlNJWkUgKGxhc3RfZnVuY3Rpb25QLAotCQkJCSAgICAobG9uZykgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAtCi0JCQkJCSAgICBTX0dFVF9WQUxVRSAobGFzdF9mdW5jdGlvblApKSk7Ci0JCSAgU0FfU0VUX1NZTV9FTkRORFggKGxhc3RfZnVuY3Rpb25QLCBzeW1ib2xfbnVtYmVyKTsKLQkJIGxhc3RfZnVuY3Rpb25QID0gKHN5bWJvbFMgKikgMDsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoU0ZfR0VUX1RBRyAoc3ltYm9sUCkpCi0JewotCSAgLyogRmlyc3QgZGVzY3JpcHRvciBvZiBhIHN0cnVjdHVyZSBtdXN0IHBvaW50IHRvCi0JICAgICAgIHRoZSBmaXJzdCBzbG90IGFmdGVyIHRoZSBzdHJ1Y3R1cmUgZGVzY3JpcHRpb24uICovCi0JICBsYXN0X3RhZ1AgPSBzeW1ib2xQOwotCi0JfQotICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19FT1MpCi0JewotCSAgLyogKzIgdGFrZSBpbiBhY2NvdW50IHRoZSBjdXJyZW50IHN5bWJvbCAqLwotCSAgU0FfU0VUX1NZTV9FTkRORFggKGxhc3RfdGFnUCwgc3ltYm9sX251bWJlciArIDIpOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRklMRSkKLQl7Ci0JICAvKiBJZiB0aGUgZmlsZW5hbWUgd2FzIHRvbyBsb25nIHRvIGZpdCBpbiB0aGUKLQkgICAgIGF1eGVudCwgcHV0IGl0IGluIHRoZSBzdHJpbmcgdGFibGUgKi8KLQkgIGlmIChTQV9HRVRfRklMRV9GTkFNRV9aRVJPUyAoc3ltYm9sUCkgPT0gMAotCSAgICAgICYmIFNBX0dFVF9GSUxFX0ZOQU1FX09GRlNFVCAoc3ltYm9sUCkgIT0gMCkKLQkgICAgewotCSAgICAgIFNBX1NFVF9GSUxFX0ZOQU1FX09GRlNFVCAoc3ltYm9sUCwgc3RyaW5nX2J5dGVfY291bnQpOwotCSAgICAgIHN0cmluZ19ieXRlX2NvdW50ICs9IHN0cmxlbiAoZmlsZW5hbWVfbGlzdF9zY2FuLT5maWxlbmFtZSkgKyAxOwotCSAgICAgIGZpbGVuYW1lX2xpc3Rfc2NhbiA9IGZpbGVuYW1lX2xpc3Rfc2Nhbi0+bmV4dDsKLQkgICAgfQotCSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCBsYXN0X2ZpbGVfc3ltbm8pOwotCSAgICAgIGxhc3RfZmlsZV9zeW1ubyA9IHN5bWJvbF9udW1iZXI7Ci0JICAgIH0JCQkvKiBubyBvbmUgcG9pbnRzIGF0IHRoZSBmaXJzdCAuZmlsZSBzeW1ib2wgKi8KLQl9CQkJLyogaWYgZGVidWcgb3IgdGFnIG9yIGVvcyBvciBmaWxlICovCi0KLSNpZmRlZiB0Y19mcm9iX2NvZmZfc3ltYm9sCi0gICAgICB0Y19mcm9iX2NvZmZfc3ltYm9sIChzeW1ib2xQKTsKLSNlbmRpZgotCi0gICAgICAvKiBXZSBtdXN0IHB1dCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBhcGFydC4gVGhlIGxvYWRlcgotCSBkb2VzIG5vdCBib21iIGlmIHdlIGRvIG5vdC4gQnV0IHRoZSByZWZlcmVuY2VzIGluCi0JIHRoZSBlbmRuZHggZmllbGQgZm9yIGEgLmJiIHN5bWJvbCBhcmUgbm90IGNvcnJlY3RlZAotCSBpZiBhbiBleHRlcm5hbCBzeW1ib2wgaXMgcmVtb3ZlZCBiZXR3ZWVuIC5iYiBhbmQgLmJlLgotCSBJLmUgaW4gdGhlIGZvbGxvd2luZyBjYXNlIDoKLQkgWzIwXSAuYmIgZW5kbmR4ID0gMjIKLQkgWzIxXSBmb28gZXh0ZXJuYWwKLQkgWzIyXSAuYmUKLQkgbGQgd2lsbCBtb3ZlIHRoZSBzeW1ib2wgMjEgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBidXQKLQkgZW5kbmR4IHdpbGwgc3RpbGwgYmUgMjIgaW5zdGVhZCBvZiAyMS4gKi8KLQotCi0gICAgICBpZiAoU0ZfR0VUX0xPQ0FMIChzeW1ib2xQKSkKLQl7Ci0JICAvKiByZW1vdmUgQ19FRkNOIGFuZCBMT0NBTCAoTC4uLikgc3ltYm9scyAqLwotCSAgLyogbmV4dCBwb2ludGVyIHJlbWFpbnMgdmFsaWQgKi8KLQkgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0JfQotICAgICAgZWxzZSBpZiAoc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkpCi0JewotCSAgLyogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byB1bmRlZmluZWQgb3IgY29tbW9uCi0JICAgICBzeW1ib2xzLiAgKi8KLQkgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCX0KLSAgICAgIGVsc2UgaWYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApCi0JICAgICAgICYmICFTX0lTX0RFQlVHIChzeW1ib2xQKQotCSAgICAgICAmJiAhU0ZfR0VUX1NUQVRJQ1MgKHN5bWJvbFApCi0JICAgICAgICYmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VYVAotI2lmZGVmIFRFX1BFCi0JCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlRfV0VBSwotI2VuZGlmCi0JCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfV0VBS0VYVCkpCi0JewotCSAgLyogaWYgZXh0ZXJuYWwsIFJlbW92ZSBmcm9tIHRoZSBsaXN0ICovCi0JICBzeW1ib2xTICpob2xkID0gc3ltYm9sX3ByZXZpb3VzIChzeW1ib2xQKTsKLQotCSAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICBzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyAoc3ltYm9sUCk7Ci0JICBzeW1ib2xfYXBwZW5kIChzeW1ib2xQLCBzeW1ib2xfZXh0ZXJuX2xhc3RQLCAmc3ltYm9sX2V4dGVyblAsICZzeW1ib2xfZXh0ZXJuX2xhc3RQKTsKLQkgIHN5bWJvbFAgPSBob2xkOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgU19JU19ERUJVRyAoc3ltYm9sUCkKLQkgICAgICAgJiYgISBTRl9HRVRfU1RBVElDUyAoc3ltYm9sUCkKLQkgICAgICAgJiYgISBTRl9HRVRfRlVOQ1RJT04gKHN5bWJvbFApCi0JICAgICAgICYmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VYVAotI2lmZGVmIFRFX1BFCi0JCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlRfV0VBSwotI2VuZGlmCi0JCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlRfV0VBSykpCi0JewotCSAgc3ltYm9sUyAqaG9sZCA9IHN5bWJvbF9wcmV2aW91cyAoc3ltYm9sUCk7Ci0KLQkgIC8qIFRoZSBPJ1JlaWxseSBDT0ZGIGJvb2sgc2F5cyB0aGF0IGRlZmluZWQgZ2xvYmFsIHN5bWJvbHMKLSAgICAgICAgICAgICBjb21lIGF0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCB0YWJsZSwganVzdCBiZWZvcmUKLSAgICAgICAgICAgICB1bmRlZmluZWQgZ2xvYmFsIHN5bWJvbHMuICAqLwotCi0JICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIChzeW1ib2xQKTsKLQkgIHN5bWJvbF9hcHBlbmQgKHN5bWJvbFAsIHN5bWJvbF9nbG9iYWxfbGFzdFAsICZzeW1ib2xfZ2xvYmFsUCwKLQkJCSAmc3ltYm9sX2dsb2JhbF9sYXN0UCk7Ci0JICBzeW1ib2xQID0gaG9sZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKFNGX0dFVF9TVFJJTkcgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSBzdHJpbmdfYnl0ZV9jb3VudDsKLQkgICAgICBzdHJpbmdfYnl0ZV9jb3VudCArPSBzdHJsZW4gKFNfR0VUX05BTUUgKHN5bWJvbFApKSArIDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQkgICAgfQkJCS8qIGZpeCAibG9uZyIgbmFtZXMgKi8KLQotCSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcjsKLQkgIHN5bWJvbF9udW1iZXIgKz0gMSArIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFApOwotCX0JCQkvKiBpZiBsb2NhbCBzeW1ib2wgKi8KLSAgICB9CQkJCS8qIHRyYXZlcnNlIHRoZSBzeW1ib2wgbGlzdCAqLwotICByZXR1cm4gc3ltYm9sX251bWJlcjsKLQotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWdsdWVfc3ltYm9scyAoaGVhZCwgdGFpbCkKLSAgICAgc3ltYm9sUyAqKmhlYWQ7Ci0gICAgIHN5bWJvbFMgKip0YWlsOwotewotICB1bnNpZ25lZCBpbnQgc3ltYm9sX251bWJlciA9IDA7Ci0KLSAgd2hpbGUgKCpoZWFkICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUyAqdG1wID0gKmhlYWQ7Ci0KLSAgICAgIC8qIGFwcGVuZCAqLwotICAgICAgc3ltYm9sX3JlbW92ZSAodG1wLCBoZWFkLCB0YWlsKTsKLSAgICAgIHN5bWJvbF9hcHBlbmQgKHRtcCwgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQotICAgICAgLyogYW5kIHByb2Nlc3MgKi8KLSAgICAgIGlmIChTRl9HRVRfU1RSSU5HICh0bXApKQotCXsKLQkgIHRtcC0+c3lfbmFtZV9vZmZzZXQgPSBzdHJpbmdfYnl0ZV9jb3VudDsKLQkgIHN0cmluZ19ieXRlX2NvdW50ICs9IHN0cmxlbiAoU19HRVRfTkFNRSAodG1wKSkgKyAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB0bXAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQl9CQkJLyogZml4ICJsb25nIiBuYW1lcyAqLwotCi0gICAgICB0bXAtPnN5X251bWJlciA9IHN5bWJvbF9udW1iZXI7Ci0gICAgICBzeW1ib2xfbnVtYmVyICs9IDEgKyBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZICh0bXApOwotICAgIH0JCQkJLyogYXBwZW5kIHRoZSBlbnRpcmUgZXh0ZXJuIGNoYWluICovCi0KLSAgcmV0dXJuIHN5bWJvbF9udW1iZXI7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXRpZV90YWdzICgpCi17Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfbnVtYmVyID0gMDsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcjsKLQotICAgICAgaWYgKFNGX0dFVF9UQUdHRUQgKHN5bWJvbFApKQotCXsKLQkgIFNBX1NFVF9TWU1fVEFHTkRYCi0JICAgIChzeW1ib2xQLAotCSAgICAgKChzeW1ib2xTICopIFNBX0dFVF9TWU1fVEFHTkRYIChzeW1ib2xQKSktPnN5X251bWJlcik7Ci0JfQotCi0gICAgICBzeW1ib2xfbnVtYmVyICs9IDEgKyBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHN5bWJvbF9udW1iZXI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jcmF3bF9zeW1ib2xzIChoLCBhYmZkKQotICAgICBvYmplY3RfaGVhZGVycyAqaDsKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIHN0YWNrIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbWF0Y2hpbmcgLmJiIC5iZSAqLwotCi0gIGJsb2NrX3N0YWNrID0gc3RhY2tfaW5pdCAoNTEyLCBzaXplb2YgKHN5bWJvbFMgKikpOwotCi0gIC8qIFRoZSBzeW1ib2wgbGlzdCBzaG91bGQgYmUgb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBzZXF1ZW5jZQotICAgKiBvcmRlciA6Ci0gICAqIC4gLmZpbGUgc3ltYm9sCi0gICAqIC4gZGVidWcgZW50cmllcyBmb3IgZnVuY3Rpb25zCi0gICAqIC4gZmFrZSBzeW1ib2xzIGZvciB0aGUgc2VjdGlvbnMsIGluY2x1ZGluZyAudGV4dCAuZGF0YSBhbmQgLmJzcwotICAgKiAuIGRlZmluZWQgc3ltYm9scwotICAgKiAuIHVuZGVmaW5lZCBzeW1ib2xzCi0gICAqIEJ1dCB0aGlzIGlzIG5vdCBtYW5kYXRvcnkuIFRoZSBvbmx5IGltcG9ydGFudCBwb2ludCBpcyB0byBwdXQgdGhlCi0gICAqIHVuZGVmaW5lZCBzeW1ib2xzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCi0gICAqLwotCi0gIC8qIElzIHRoZXJlIGEgLmZpbGUgc3ltYm9sID8gSWYgbm90IGluc2VydCBvbmUgYXQgdGhlIGJlZ2lubmluZy4gKi8KLSAgaWYgKHN5bWJvbF9yb290UCA9PSBOVUxMCi0gICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xfcm9vdFApICE9IENfRklMRSkKLSAgICB7Ci0gICAgICBjX2RvdF9maWxlX3N5bWJvbCAoImZha2UiKTsKLSAgICB9Ci0KLSAgLyoKLSAgICogQnVpbGQgdXAgc3RhdGljIHN5bWJvbHMgZm9yIHRoZSBzZWN0aW9ucywgdGhleSBhcmUgZmlsbGVkIGluIGxhdGVyCi0gICAqLwotCi0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX0xBU1Q7IGkrKykKLSAgICBpZiAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWVbMF0pCi0gICAgICBzZWdtZW50X2luZm9baV0uZG90ID0gY19zZWN0aW9uX3N5bWJvbCAoc2VnbWVudF9pbmZvW2ldLm5hbWUsCi0JCQkJCSAgICAgIGkgLSBTRUdfRTAgKyAxKTsKLQotICAvKiBUYWtlIGFsbCB0aGUgZXh0ZXJuYWxzIG91dCBhbmQgcHV0IHRoZW0gaW50byBhbm90aGVyIGNoYWluICovCi0gIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFIChoLCB5YW5rX3N5bWJvbHMgKCkpOwotICAvKiBUYWtlIHRoZSBleHRlcm5hbHMgYW5kIGdsdWUgdGhlbSBvbnRvIHRoZSBlbmQuKi8KLSAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGgsCi0JCQkgICAoSF9HRVRfU1lNQk9MX0NPVU5UIChoKQotCQkJICAgICsgZ2x1ZV9zeW1ib2xzICgmc3ltYm9sX2dsb2JhbFAsCi0JCQkJCSAgICAmc3ltYm9sX2dsb2JhbF9sYXN0UCkKLQkJCSAgICArIGdsdWVfc3ltYm9scyAoJnN5bWJvbF9leHRlcm5QLAotCQkJCQkgICAgJnN5bWJvbF9leHRlcm5fbGFzdFApKSk7Ci0KLSAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGgsIHRpZV90YWdzICgpKTsKLSAga25vdyAoc3ltYm9sX2dsb2JhbFAgPT0gTlVMTCk7Ci0gIGtub3cgKHN5bWJvbF9nbG9iYWxfbGFzdFAgPT0gTlVMTCk7Ci0gIGtub3cgKHN5bWJvbF9leHRlcm5QID09IE5VTEwpOwotICBrbm93IChzeW1ib2xfZXh0ZXJuX2xhc3RQID09IE5VTEwpOwotfQotCi0vKgotICogRmluZCBzdHJpbmdzIGJ5IGNyYXdsaW5nIGFsb25nIHN5bWJvbCB0YWJsZSBjaGFpbi4KLSAqLwotCi12b2lkCi13X3N0cmluZ3MgKHdoZXJlKQotICAgICBjaGFyICp3aGVyZTsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgc3RydWN0IGZpbGVuYW1lX2xpc3QgKmZpbGVuYW1lX2xpc3Rfc2NhbiA9IGZpbGVuYW1lX2xpc3RfaGVhZDsKLQotICAvKiBHb3R0YSBkbyBtZF8gYnl0ZS1vcmRlcmluZyBzdHVmZiBmb3Igc3RyaW5nX2J5dGVfY291bnQgZmlyc3QgLSBLV0sgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgKHZhbHVlVCkgc3RyaW5nX2J5dGVfY291bnQsIDQpOwotICB3aGVyZSArPSA0OwotCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgLyogU3VwcG9ydCBsb25nIHNlY3Rpb24gbmFtZXMgYXMgZm91bmQgaW4gUEUuICBUaGlzIGNvZGUgbXVzdAotICAgICBjb29yZGluYXRlIHdpdGggdGhhdCBpbiBjb2ZmX2hlYWRlcl9hcHBlbmQgYW5kIHdyaXRlX29iamVjdF9maWxlLiAgKi8KLSAgewotICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX0xBU1Q7IGkrKykKLSAgICAgIHsKLQlpZiAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWVbMF0KLQkgICAgJiYgc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSkgPiBTQ05OTUxFTikKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHNpemU7Ci0KLQkgICAgc2l6ZSA9IHN0cmxlbiAoc2VnbWVudF9pbmZvW2ldLm5hbWUpICsgMTsKLQkgICAgbWVtY3B5ICh3aGVyZSwgc2VnbWVudF9pbmZvW2ldLm5hbWUsIHNpemUpOwotCSAgICB3aGVyZSArPSBzaXplOwotCSAgfQotICAgICAgfQotICB9Ci0jZW5kaWYgLyogQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMgKi8KLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7Ci0gICAgICAgc3ltYm9sUDsKLSAgICAgICBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzaXplOwotCi0gICAgICBpZiAoU0ZfR0VUX1NUUklORyAoc3ltYm9sUCkpCi0JewotCSAgc2l6ZSA9IHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMTsKLQkgIG1lbWNweSAod2hlcmUsIFNfR0VUX05BTUUgKHN5bWJvbFApLCBzaXplKTsKLQkgIHdoZXJlICs9IHNpemU7Ci0JfQotICAgICAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRklMRQotCSAgJiYgU0FfR0VUX0ZJTEVfRk5BTUVfWkVST1MgKHN5bWJvbFApID09IDAKLQkgICYmIFNBX0dFVF9GSUxFX0ZOQU1FX09GRlNFVCAoc3ltYm9sUCkgIT0gMCkKLQl7Ci0JICBzaXplID0gc3RybGVuIChmaWxlbmFtZV9saXN0X3NjYW4tPmZpbGVuYW1lKSArIDE7Ci0JICBtZW1jcHkgKHdoZXJlLCBmaWxlbmFtZV9saXN0X3NjYW4tPmZpbGVuYW1lLCBzaXplKTsKLQkgIGZpbGVuYW1lX2xpc3Rfc2NhbiA9IGZpbGVuYW1lX2xpc3Rfc2NhbiAtPm5leHQ7Ci0JICB3aGVyZSArPSBzaXplOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19saW5lbm9zX2ZvciAoYWJmZCwgaCwgZmlsZV9jdXJzb3IpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIG9iamVjdF9oZWFkZXJzICogaDsKLSAgICAgdW5zaWduZWQgbG9uZyAqZmlsZV9jdXJzb3I7Ci17Ci0gIHVuc2lnbmVkIGludCBpZHg7Ci0gIHVuc2lnbmVkIGxvbmcgc3RhcnQgPSAqZmlsZV9jdXJzb3I7Ci0KLSAgZm9yIChpZHggPSBTRUdfRTA7IGlkeCA8IFNFR19MQVNUOyBpZHgrKykKLSAgICB7Ci0gICAgICBzZWdtZW50X2luZm9fdHlwZSAqcyA9IHNlZ21lbnRfaW5mbyArIGlkeDsKLQotCi0gICAgICBpZiAocy0+c2NuaGRyLnNfbmxubm8gIT0gMCkKLQl7Ci0JICBzdHJ1Y3QgbGluZW5vX2xpc3QgKmxpbmVfcHRyOwotCi0JICBzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICpidWZmZXIgPQotCSAgKHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKikgeG1hbGxvYyAocy0+c2NuaGRyLnNfbmxubm8gKiBMSU5FU1opOwotCi0JICBzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICpkc3QgPSBidWZmZXI7Ci0KLQkgIC8qIFJ1biB0aHJvdWdoIHRoZSB0YWJsZSB3ZSd2ZSBidWlsdCBhbmQgdHVybiBpdCBpbnRvIGl0cyBleHRlcm5hbAotCSBmb3JtLCB0YWtlIHRoaXMgY2hhbmNlIHRvIHJlbW92ZSBkdXBsaWNhdGVzICovCi0KLQkgIGZvciAobGluZV9wdHIgPSBzLT5saW5lbm9fbGlzdF9oZWFkOwotCSAgICAgICBsaW5lX3B0ciAhPSAoc3RydWN0IGxpbmVub19saXN0ICopIE5VTEw7Ci0JICAgICAgIGxpbmVfcHRyID0gbGluZV9wdHItPm5leHQpCi0JICAgIHsKLQotCSAgICAgIGlmIChsaW5lX3B0ci0+bGluZS5sX2xubm8gPT0gMCkKLQkJewotCQkgIC8qIFR1cm4gYSBwb2ludGVyIHRvIGEgc3ltYm9sIGludG8gdGhlIHN5bWJvbHMnIGluZGV4ICovCi0JCSAgbGluZV9wdHItPmxpbmUubF9hZGRyLmxfc3ltbmR4ID0KLQkJICAgICgoc3ltYm9sUyAqKSBsaW5lX3B0ci0+bGluZS5sX2FkZHIubF9zeW1uZHgpLT5zeV9udW1iZXI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBsaW5lX3B0ci0+bGluZS5sX2FkZHIubF9wYWRkciArPSAoKHN0cnVjdCBmcmFnICopIChsaW5lX3B0ci0+ZnJhZykpLT5mcl9hZGRyZXNzOwotCQl9Ci0KLQotCSAgICAgICh2b2lkKSBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKGFiZmQsICYobGluZV9wdHItPmxpbmUpLCBkc3QpOwotCSAgICAgIGRzdCsrOwotCi0JICAgIH0KLQotCSAgcy0+c2NuaGRyLnNfbG5ub3B0ciA9ICpmaWxlX2N1cnNvcjsKLQotCSAgYmZkX3dyaXRlIChidWZmZXIsIDEsIHMtPnNjbmhkci5zX25sbm5vICogTElORVNaLCBhYmZkKTsKLQkgIGZyZWUgKGJ1ZmZlcik7Ci0KLQkgICpmaWxlX2N1cnNvciArPSBzLT5zY25oZHIuc19ubG5ubyAqIExJTkVTWjsKLQl9Ci0gICAgfQotICBIX1NFVF9MSU5FTk9fU0laRSAoaCwgKmZpbGVfY3Vyc29yIC0gc3RhcnQpOwotfQotCi0KLS8qIE5vdyB3ZSBydW4gdGhyb3VnaCB0aGUgbGlzdCBvZiBmcmFnIGNoYWlucyBpbiBhIHNlZ21lbnQgYW5kCi0gICBtYWtlIGFsbCB0aGUgc3Vic2VnbWVudCBmcmFncyBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUKLSAgIGxpc3QsIGFzIGlmIHRoZSBzZWcgMCB3YXMgZXh0cmEgbG9uZyAqLwotCi1zdGF0aWMgdm9pZAotcmVtb3ZlX3N1YnNlZ3MgKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICBmcmNoYWluUyAqaGVhZCA9IHNlZ21lbnRfaW5mb1tpXS5mcmNoYWluUDsKLSAgICAgIGZyYWdTIGR1bW15OwotICAgICAgZnJhZ1MgKnByZXZfZnJhZyA9ICZkdW1teTsKLQotICAgICAgd2hpbGUgKGhlYWQgJiYgaGVhZC0+ZnJjaF9zZWcgPT0gaSkKLQl7Ci0JICBwcmV2X2ZyYWctPmZyX25leHQgPSBoZWFkLT5mcmNoX3Jvb3Q7Ci0JICBwcmV2X2ZyYWcgPSBoZWFkLT5mcmNoX2xhc3Q7Ci0JICBoZWFkID0gaGVhZC0+ZnJjaF9uZXh0OwotCX0KLSAgICAgIHByZXZfZnJhZy0+ZnJfbmV4dCA9IDA7Ci0gICAgfQotfQotCi11bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci1pbnQgY29mZl9mbGFnczsKLWV4dGVybiB2b2lkCi13cml0ZV9vYmplY3RfZmlsZSAoKQotewotICBpbnQgaTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgc3RydWN0IGZyY2hhaW4gKmZyY2hhaW5fcHRyOwotCi0gIG9iamVjdF9oZWFkZXJzIGhlYWRlcnM7Ci0gIHVuc2lnbmVkIGxvbmcgZmlsZV9jdXJzb3I7Ci0gIGJmZCAqYWJmZDsKLSAgdW5zaWduZWQgaW50IGFkZHI7Ci0gIGFiZmQgPSBiZmRfb3BlbncgKG91dF9maWxlX25hbWUsIFRBUkdFVF9GT1JNQVQpOwotCi0KLSAgaWYgKGFiZmQgPT0gMCkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjcmVhdGUgJXMiKSwgb3V0X2ZpbGVfbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpOwotICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgQkZEX0FSQ0gsIG1hY2hpbmUpOwotCi0gIHN0cmluZ19ieXRlX2NvdW50ID0gNDsKLQotICBmb3IgKGZyY2hhaW5fcHRyID0gZnJjaGFpbl9yb290OwotICAgICAgIGZyY2hhaW5fcHRyICE9IChzdHJ1Y3QgZnJjaGFpbiAqKSBOVUxMOwotICAgICAgIGZyY2hhaW5fcHRyID0gZnJjaGFpbl9wdHItPmZyY2hfbmV4dCkKLSAgICB7Ci0gICAgICAvKiBSdW4gdGhyb3VnaCBhbGwgdGhlIHN1Yi1zZWdtZW50cyBhbmQgYWxpZ24gdGhlbSB1cC4gIEFsc28KLQkgY2xvc2UgYW55IG9wZW4gZnJhZ3MuICBXZSB0YWNrIGEgLmZpbGwgb250byB0aGUgZW5kIG9mIHRoZQotCSBmcmFnIGNoYWluIHNvIHRoYXQgYW55IC5hbGlnbidzIHNpemUgY2FuIGJlIHdvcmtlZCBieSBsb29raW5nCi0JIGF0IHRoZSBuZXh0IGZyYWcuICAqLwotCi0gICAgICBzdWJzZWdfc2V0IChmcmNoYWluX3B0ci0+ZnJjaF9zZWcsIGZyY2hhaW5fcHRyLT5mcmNoX3N1YnNlZyk7Ci0KLSNpZm5kZWYgU1VCX1NFR01FTlRfQUxJR04KLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKSAxCi0jZW5kaWYKLSNpZmRlZiBtZF9kb19hbGlnbgotICAgICAgbWRfZG9fYWxpZ24gKFNVQl9TRUdNRU5UX0FMSUdOIChub3dfc2VnKSwgKGNoYXIgKikgTlVMTCwgMCwgMCwKLQkJICAgYWxpZ25tZW50X2RvbmUpOwotI2VuZGlmCi0gICAgICBmcmFnX2FsaWduIChTVUJfU0VHTUVOVF9BTElHTiAobm93X3NlZyksCi0JCSAgc3Vic2VnX3RleHRfcCAobm93X3NlZykgPyBOT1BfT1BDT0RFIDogMCwKLQkJICAwKTsKLSNpZmRlZiBtZF9kb19hbGlnbgotICAgIGFsaWdubWVudF9kb25lOgotI2VuZGlmCi0gICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgICAgIGZyYWdfbm93LT5mcl9maXggPSAwOwotICAgICAga25vdyAoZnJhZ19ub3ctPmZyX25leHQgPT0gTlVMTCk7Ci0gICAgfQotCi0KLSAgcmVtb3ZlX3N1YnNlZ3MgKCk7Ci0KLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIHJlbGF4X3NlZ21lbnQgKHNlZ21lbnRfaW5mb1tpXS5mcmNoYWluUC0+ZnJjaF9yb290LCBpKTsKLSAgICB9Ci0KLSAgSF9TRVRfTlVNQkVSX09GX1NFQ1RJT05TICgmaGVhZGVycywgMCk7Ci0KLSAgLyogRmluZCBvdXQgaG93IGJpZyB0aGUgc2VjdGlvbnMgYXJlLCBhbmQgc2V0IHRoZSBhZGRyZXNzZXMuICAqLwotICBhZGRyID0gMDsKLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICBsb25nIHNpemU7Ci0KLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19wYWRkciA9IGFkZHI7Ci0gICAgICBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfdmFkZHIgPSBhZGRyOwotCi0gICAgICBpZiAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWVbMF0pCi0JewotCSAgSF9TRVRfTlVNQkVSX09GX1NFQ1RJT05TICgmaGVhZGVycywKLQkJCQkgICAgSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TICgmaGVhZGVycykgKyAxKTsKLQotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0JICAvKiBTdXBwb3J0IGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBmb3VuZCBpbiBQRS4gIFRoaXMgY29kZQotCSAgICAgbXVzdCBjb29yZGluYXRlIHdpdGggdGhhdCBpbiBjb2ZmX2hlYWRlcl9hcHBlbmQgYW5kCi0JICAgICB3X3N0cmluZ3MuICAqLwotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0JICAgIGxlbiA9IHN0cmxlbiAoc2VnbWVudF9pbmZvW2ldLm5hbWUpOwotCSAgICBpZiAobGVuID4gU0NOTk1MRU4pCi0JICAgICAgc3RyaW5nX2J5dGVfY291bnQgKz0gbGVuICsgMTsKLQkgIH0KLSNlbmRpZiAvKiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyAqLwotCX0KLQotICAgICAgc2l6ZSA9IHNpemVfc2VjdGlvbiAoYWJmZCwgKHVuc2lnbmVkIGludCkgaSk7Ci0gICAgICBhZGRyICs9IHNpemU7Ci0KLSAgICAgIC8qIEkgdGhpbmsgdGhlIHNlY3Rpb24gYWxpZ25tZW50IGlzIG9ubHkgdXNlZCBvbiB0aGUgaTk2MDsgdGhlCi0JIGk5NjAgbmVlZHMgaXQsIGFuZCBpdCBzaG91bGQgZG8gbm8gaGFybSBvbiBvdGhlciB0YXJnZXRzLiAgKi8KLSNpZmRlZiBBTElHTk1FTlRfSU5fU19GTEFHUwotICAgICAgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX2ZsYWdzIHw9IChzZWN0aW9uX2FsaWdubWVudFtpXSAmIDB4RikgPDwgODsKLSNlbHNlCi0gICAgICBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfYWxpZ24gPSAxIDw8IHNlY3Rpb25fYWxpZ25tZW50W2ldOwotI2VuZGlmCi0KLSAgICAgIGlmIChpID09IFNFR19FMCkKLQlIX1NFVF9URVhUX1NJWkUgKCZoZWFkZXJzLCBzaXplKTsKLSAgICAgIGVsc2UgaWYgKGkgPT0gU0VHX0UxKQotCUhfU0VUX0RBVEFfU0laRSAoJmhlYWRlcnMsIHNpemUpOwotICAgICAgZWxzZSBpZiAoaSA9PSBTRUdfRTIpCi0JSF9TRVRfQlNTX1NJWkUgKCZoZWFkZXJzLCBzaXplKTsKLSAgICB9Ci0KLSAgLyogVHVybiB0aGUgZ2FzIG5hdGl2ZSBzeW1ib2wgdGFibGUgc2hhcGUgaW50byBhIGNvZmYgc3ltYm9sIHRhYmxlICovCi0gIGNyYXdsX3N5bWJvbHMgKCZoZWFkZXJzLCBhYmZkKTsKLQotICBpZiAoc3RyaW5nX2J5dGVfY291bnQgPT0gNCkKLSAgICBzdHJpbmdfYnl0ZV9jb3VudCA9IDA7Ci0KLSAgSF9TRVRfU1RSSU5HX1NJWkUgKCZoZWFkZXJzLCBzdHJpbmdfYnl0ZV9jb3VudCk7Ci0KLSNpZmRlZiB0Y19mcm9iX2ZpbGUKLSAgdGNfZnJvYl9maWxlICgpOwotI2VuZGlmCi0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICBmaXh1cF9tZGVwcyAoc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QLT5mcmNoX3Jvb3QsICZoZWFkZXJzLCBpKTsKLSAgICAgIGZpeHVwX3NlZ21lbnQgKCZzZWdtZW50X2luZm9baV0sIGkpOwotICAgIH0KLQotICAvKiBMb29rIGZvciAiLnN0YWIiIHNlZ21lbnRzIGFuZCBmaWxsIGluIHRoZWlyIGluaXRpYWwgc3ltYm9scwotICAgICBjb3JyZWN0bHkuICovCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgbmFtZSA9IHNlZ21lbnRfaW5mb1tpXS5uYW1lOwotCi0gICAgICBpZiAobmFtZSAhPSBOVUxMCi0JICAmJiBzdHJuY21wICgiLnN0YWIiLCBuYW1lLCA1KSA9PSAwCi0JICAmJiBzdHJuY21wICgiLnN0YWJzdHIiLCBuYW1lLCA4KSAhPSAwKQotCWFkanVzdF9zdGFiX3NlY3Rpb24gKGFiZmQsIGkpOwotICAgIH0KLQotICBmaWxlX2N1cnNvciA9IEhfR0VUX1RFWFRfRklMRV9PRkZTRVQgKCZoZWFkZXJzKTsKLQotICBiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBmaWxlX2N1cnNvciwgMCk7Ci0KLSAgLyogUGxhbnQgdGhlIGRhdGEgKi8KLQotICBmaWxsX3NlY3Rpb24gKGFiZmQsICZoZWFkZXJzLCAmZmlsZV9jdXJzb3IpOwotCi0gIGRvX3JlbG9jc19mb3IgKGFiZmQsICZoZWFkZXJzLCAmZmlsZV9jdXJzb3IpOwotCi0gIGRvX2xpbmVub3NfZm9yIChhYmZkLCAmaGVhZGVycywgJmZpbGVfY3Vyc29yKTsKLQotICBIX1NFVF9GSUxFX01BR0lDX05VTUJFUiAoJmhlYWRlcnMsIENPRkZfTUFHSUMpOwotI2lmbmRlZiBPQkpfQ09GRl9PTUlUX1RJTUVTVEFNUAotICBIX1NFVF9USU1FX1NUQU1QICgmaGVhZGVycywgKGxvbmcpdGltZSgodGltZV90ICopMCkpOwotI2Vsc2UKLSAgSF9TRVRfVElNRV9TVEFNUCAoJmhlYWRlcnMsIDApOwotI2VuZGlmCi0jaWZkZWYgVENfQ09GRl9TRVRfTUFDSElORQotICBUQ19DT0ZGX1NFVF9NQUNISU5FICgmaGVhZGVycyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBDT0ZGX0ZMQUdTCi0jZGVmaW5lIENPRkZfRkxBR1MgMAotI2VuZGlmCi0KLSNpZmRlZiBLRUVQX1JFTE9DX0lORk8KLSAgSF9TRVRfRkxBR1MgKCZoZWFkZXJzLCAoKEhfR0VUX0xJTkVOT19TSVpFKCZoZWFkZXJzKSA/IDAgOiBGX0xOTk8pIHwKLQkJCSAgQ09GRl9GTEFHUyB8IGNvZmZfZmxhZ3MpKTsKLSNlbHNlCi0gIEhfU0VUX0ZMQUdTICgmaGVhZGVycywgKChIX0dFVF9MSU5FTk9fU0laRSgmaGVhZGVycykgICAgID8gMCA6IEZfTE5OTykgICB8Ci0JCQkgIChIX0dFVF9SRUxPQ0FUSU9OX1NJWkUoJmhlYWRlcnMpID8gMCA6IEZfUkVMRkxHKSB8Ci0JCQkgIENPRkZfRkxBR1MgfCBjb2ZmX2ZsYWdzKSk7Ci0jZW5kaWYKLQotICB7Ci0gICAgdW5zaWduZWQgaW50IHN5bXRhYmxlX3NpemUgPSBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRSAoJmhlYWRlcnMpOwotICAgIGNoYXIgKmJ1ZmZlcjEgPSB4bWFsbG9jIChzeW10YWJsZV9zaXplICsgc3RyaW5nX2J5dGVfY291bnQgKyAxKTsKLQotICAgIEhfU0VUX1NZTUJPTF9UQUJMRV9QT0lOVEVSICgmaGVhZGVycywgYmZkX3RlbGwgKGFiZmQpKTsKLSAgICB3X3N5bWJvbHMgKGFiZmQsIGJ1ZmZlcjEsIHN5bWJvbF9yb290UCk7Ci0gICAgaWYgKHN0cmluZ19ieXRlX2NvdW50ID4gMCkKLSAgICAgIHdfc3RyaW5ncyAoYnVmZmVyMSArIHN5bXRhYmxlX3NpemUpOwotICAgIGJmZF93cml0ZSAoYnVmZmVyMSwgMSwgc3ltdGFibGVfc2l6ZSArIHN0cmluZ19ieXRlX2NvdW50LCBhYmZkKTsKLSAgICBmcmVlIChidWZmZXIxKTsKLSAgfQotCi0gIGNvZmZfaGVhZGVyX2FwcGVuZCAoYWJmZCwgJmhlYWRlcnMpOwotI2lmIDAKLSAgLyogUmVjZW50IGNoYW5nZXMgdG8gd3JpdGUgbmVlZCB0aGlzLCBidXQgd2hlcmUgaXQgc2hvdWxkCi0gICAgIGdvIGlzIHVwIHRvIEtlbi4uICovCi0gIGlmIChiZmRfY2xvc2VfYWxsX2RvbmUgKGFiZmQpID09IGZhbHNlKQotICAgIGFzX2ZhdGFsIChfKCJDYW4ndCBjbG9zZSAlczogJXMiKSwgb3V0X2ZpbGVfbmFtZSwKLQkgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0jZWxzZQotICB7Ci0gICAgZXh0ZXJuIGJmZCAqc3Rkb3V0cHV0OwotICAgIHN0ZG91dHB1dCA9IGFiZmQ7Ci0gIH0KLSNlbmRpZgotCi19Ci0KLS8qIEFkZCBhIG5ldyBzZWdtZW50LiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBzdWJzZWdfbmV3IHZpYSB0aGUKLSAgIG9ial9uZXdfc2VnbWVudCBtYWNyby4gICovCi0KLXNlZ1QKLW9ial9jb2ZmX2FkZF9zZWdtZW50IChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotI2lmbmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICBjaGFyIGJ1ZltTQ05OTUxFTiArIDFdOwotCi0gIHN0cm5jcHkgKGJ1ZiwgbmFtZSwgU0NOTk1MRU4pOwotICBidWZbU0NOTk1MRU5dID0gJ1wwJzsKLSAgbmFtZSA9IGJ1ZjsKLSNlbmRpZgotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19MQVNUICYmIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lWzBdOyBpKyspCi0gICAgaWYgKHN0cmNtcCAobmFtZSwgc2VnbWVudF9pbmZvW2ldLm5hbWUpID09IDApCi0gICAgICByZXR1cm4gKHNlZ1QpIGk7Ci0KLSAgaWYgKGkgPT0gU0VHX0xBU1QpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJUb28gbWFueSBuZXcgc2VjdGlvbnM7IGNhbid0IGFkZCBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgICByZXR1cm4gbm93X3NlZzsKLSAgICB9Ci0KLSAgLyogQWRkIGEgbmV3IHNlY3Rpb24uICAqLwotICBzdHJuY3B5IChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZSwgbmFtZSwKLQkgICBzaXplb2YgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lKSk7Ci0gIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19mbGFncyA9IFNUWVBfUkVHOwotICBzZWdtZW50X2luZm9baV0ubmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotCi0gIHJldHVybiAoc2VnVCkgaTsKLX0KLQotLyoKLSAqIGltcGxlbWVudCB0aGUgLnNlY3Rpb24gcHNldWRvIG9wOgotICoJLnNlY3Rpb24gbmFtZSB7LCAiZmxhZ3MifQotICogICAgICAgICAgICAgICAgXiAgICAgICAgIF4KLSAqICAgICAgICAgICAgICAgIHwgICAgICAgICArLS0tIG9wdGlvbmFsIGZsYWdzOiAnYicgZm9yIGJzcwotICogICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJyBmb3IgaW5mbwotICogICAgICAgICAgICAgICAgKy0tIHNlY3Rpb24gbmFtZSAgICAgICAgICAgICAgICdsJyBmb3IgbGliCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nIGZvciBub2xvYWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycgZm9yIG92ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycgZm9yIGRhdGEKLSAqCQkJCQkJICdkJyAoYXBwYXJlbnRseSBtODhrIGZvciBkYXRhKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JyBmb3IgdGV4dAotICoJCQkJCQkgJ3InIGZvciByZWFkLW9ubHkgZGF0YQotICogQnV0IGlmIHRoZSBhcmd1bWVudCBpcyBub3QgYSBxdW90ZWQgc3RyaW5nLCB0cmVhdCBpdCBhcyBhCi0gKiBzdWJzZWdtZW50IG51bWJlci4KLSAqLwotCi12b2lkCi1vYmpfY29mZl9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogU3RyaXAgb3V0IHRoZSBzZWN0aW9uIG5hbWUgKi8KLSAgY2hhciAqc2VjdGlvbl9uYW1lLCAqbmFtZTsKLSAgY2hhciBjOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBsb25nIGZsYWdzOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICBjaGFyIHR5cGU7Ci0KLSAgICAgIHNfbXJpX3NlY3QgKCZ0eXBlKTsKLSAgICAgIGZsYWdzID0gMDsKLSAgICAgIGlmICh0eXBlID09ICdDJykKLQlmbGFncyA9IFNUWVBfVEVYVDsKLSAgICAgIGVsc2UgaWYgKHR5cGUgPT0gJ0QnKQotCWZsYWdzID0gU1RZUF9EQVRBOwotICAgICAgc2VnbWVudF9pbmZvW25vd19zZWddLnNjbmhkci5zX2ZsYWdzIHw9IGZsYWdzOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIG5hbWUgPSB4bWFsbG9jIChpbnB1dF9saW5lX3BvaW50ZXIgLSBzZWN0aW9uX25hbWUgKyAxKTsKLSAgc3RyY3B5IChuYW1lLCBzZWN0aW9uX25hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGV4cCA9IDA7Ci0gIGZsYWdzID0gMDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotCWV4cCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInCi0JCSAmJiAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQkJewotCQljYXNlICdiJzogZmxhZ3MgfD0gU1RZUF9CU1M7ICAgIGJyZWFrOwotCQljYXNlICdpJzogZmxhZ3MgfD0gU1RZUF9JTkZPOyAgIGJyZWFrOwotCQljYXNlICdsJzogZmxhZ3MgfD0gU1RZUF9MSUI7ICAgIGJyZWFrOwotCQljYXNlICduJzogZmxhZ3MgfD0gU1RZUF9OT0xPQUQ7IGJyZWFrOwotCQljYXNlICdvJzogZmxhZ3MgfD0gU1RZUF9PVkVSOyAgIGJyZWFrOwotCQljYXNlICdkJzoKLQkJY2FzZSAndyc6IGZsYWdzIHw9IFNUWVBfREFUQTsgICBicmVhazsKLQkJY2FzZSAneCc6IGZsYWdzIHw9IFNUWVBfVEVYVDsgICBicmVhazsKLQkJY2FzZSAncic6IGZsYWdzIHw9IFNUWVBfTElUOwlicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhc193YXJuKF8oInVua25vd24gc2VjdGlvbiBhdHRyaWJ1dGUgJyVjJyIpLAotCQkJICAqaW5wdXRfbGluZV9wb2ludGVyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0JICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICB9Ci0KLSAgc3Vic2VnX25ldyAobmFtZSwgKHN1YnNlZ1QpIGV4cCk7Ci0KLSAgc2VnbWVudF9pbmZvW25vd19zZWddLnNjbmhkci5zX2ZsYWdzIHw9IGZsYWdzOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3RleHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdWJzZWdfbmV3ICgiLnRleHQiLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RhdGEgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0gICAgc3Vic2VnX25ldyAoIi50ZXh0IiwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkgKyAxMDAwKTsKLSAgZWxzZQotICAgIHN1YnNlZ19uZXcgKCIuZGF0YSIsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2lkZW50IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc2VnVCBjdXJyZW50X3NlZyA9IG5vd19zZWc7CQkvKiBzYXZlIGN1cnJlbnQgc2VnCSovCi0gIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICBzdWJzZWdfbmV3ICgiLmNvbW1lbnQiLCAwKTsJCS8qIC5jb21tZW50IHNlZwkJKi8KLSAgc3RyaW5nZXIgKDEpOwkJCQkvKiByZWFkIHN0cmluZwkJKi8KLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWcsIGN1cnJlbnRfc3Vic2VnKTsJLyogcmVzdG9yZSBjdXJyZW50IHNlZwkqLwotfQotCi12b2lkCi1jX3N5bWJvbF9tZXJnZSAoZGVidWcsIG5vcm1hbCkKLSAgICAgc3ltYm9sUyAqZGVidWc7Ci0gICAgIHN5bWJvbFMgKm5vcm1hbDsKLXsKLSAgU19TRVRfREFUQV9UWVBFIChub3JtYWwsIFNfR0VUX0RBVEFfVFlQRSAoZGVidWcpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAobm9ybWFsLCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWJ1ZykpOwotCi0gIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgPiBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChub3JtYWwpKQotICAgIHsKLSAgICAgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKG5vcm1hbCwgU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpKTsKLSAgICB9CQkJCS8qIHRha2UgdGhlIG1vc3Qgd2UgaGF2ZSAqLwotCi0gIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgPiAwKQotICAgIHsKLSAgICAgIG1lbWNweSAoKGNoYXIgKikgJm5vcm1hbC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMF0sCi0JICAgICAgKGNoYXIgKikgJmRlYnVnLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXSwKLQkgICAgICAodW5zaWduZWQgaW50KSAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpICogQVVYRVNaKSk7Ci0gICAgfQkJCQkvKiBNb3ZlIGFsbCB0aGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCi0KLSAgLyogTW92ZSB0aGUgZGVidWcgZmxhZ3MuICovCi0gIFNGX1NFVF9ERUJVR19GSUVMRCAobm9ybWFsLCBTRl9HRVRfREVCVUdfRklFTEQgKGRlYnVnKSk7Ci19CQkJCS8qIGNfc3ltYm9sX21lcmdlKCkgKi8KLQotc3RhdGljIGludAotY19saW5lX25ldyAoc3ltYm9sLCBwYWRkciwgbGluZV9udW1iZXIsIGZyYWcpCi0gICAgIHN5bWJvbFMgKiBzeW1ib2w7Ci0gICAgIGxvbmcgcGFkZHI7Ci0gICAgIGludCBsaW5lX251bWJlcjsKLSAgICAgZnJhZ1MgKiBmcmFnOwotewotICBzdHJ1Y3QgbGluZW5vX2xpc3QgKm5ld19saW5lID0KLSAgKHN0cnVjdCBsaW5lbm9fbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBsaW5lbm9fbGlzdCkpOwotCi0gIHNlZ21lbnRfaW5mb190eXBlICpzID0gc2VnbWVudF9pbmZvICsgbm93X3NlZzsKLSAgbmV3X2xpbmUtPmxpbmUubF9sbm5vID0gbGluZV9udW1iZXI7Ci0KLSAgaWYgKGxpbmVfbnVtYmVyID09IDApCi0gICAgewotICAgICAgbGFzdF9saW5lX3N5bWJvbCA9IHN5bWJvbDsKLSAgICAgIG5ld19saW5lLT5saW5lLmxfYWRkci5sX3N5bW5keCA9IChsb25nKSBzeW1ib2w7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmV3X2xpbmUtPmxpbmUubF9hZGRyLmxfcGFkZHIgPSBwYWRkcjsKLSAgICB9Ci0KLSAgbmV3X2xpbmUtPmZyYWcgPSAoY2hhciAqKSBmcmFnOwotICBuZXdfbGluZS0+bmV4dCA9IChzdHJ1Y3QgbGluZW5vX2xpc3QgKikgTlVMTDsKLQotCi0gIGlmIChzLT5saW5lbm9fbGlzdF9oZWFkID09IChzdHJ1Y3QgbGluZW5vX2xpc3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBzLT5saW5lbm9fbGlzdF9oZWFkID0gbmV3X2xpbmU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcy0+bGluZW5vX2xpc3RfdGFpbC0+bmV4dCA9IG5ld19saW5lOwotICAgIH0KLSAgcy0+bGluZW5vX2xpc3RfdGFpbCA9IG5ld19saW5lOwotICByZXR1cm4gTElORVNaICogcy0+c2NuaGRyLnNfbmxubm8rKzsKLX0KLQotdm9pZAotY19kb3RfZmlsZV9zeW1ib2wgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBzeW1ib2xQID0gc3ltYm9sX25ldyAoIi5maWxlIiwKLQkJCVNFR19ERUJVRywKLQkJCTAsCi0JCQkmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfRklMRSk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDEpOwotCi0gIGlmIChzdHJsZW4gKGZpbGVuYW1lKSA+IEZJTE5NTEVOKQotICAgIHsKLSAgICAgIC8qIEZpbGVuYW1lIGlzIHRvbyBsb25nIHRvIGZpdCBpbnRvIGFuIGF1eGVudCwKLQkgd2Ugc3RpY2sgaXQgaW50byB0aGUgc3RyaW5nIHRhYmxlIGluc3RlYWQuICBXZSBrZWVwCi0JIGEgbGlua2VkIGxpc3Qgb2YgdGhlIGZpbGVuYW1lcyB3ZSBmaW5kIHNvIHdlIGNhbiBlbWl0Ci0JIHRoZW0gbGF0ZXIuKi8KLSAgICAgIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpmID0gKChzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqKQotCQkJCSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBmaWxlbmFtZV9saXN0KSkpOwotCi0gICAgICBmLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgICAgZi0+bmV4dCA9IDA7Ci0KLSAgICAgIFNBX1NFVF9GSUxFX0ZOQU1FX1pFUk9TIChzeW1ib2xQLCAwKTsKLSAgICAgIFNBX1NFVF9GSUxFX0ZOQU1FX09GRlNFVCAoc3ltYm9sUCwgMSk7Ci0KLSAgICAgIGlmIChmaWxlbmFtZV9saXN0X3RhaWwpIAotCWZpbGVuYW1lX2xpc3RfdGFpbC0+bmV4dCA9IGY7Ci0gICAgICBlbHNlCi0JZmlsZW5hbWVfbGlzdF9oZWFkID0gZjsKLSAgICAgIGZpbGVuYW1lX2xpc3RfdGFpbCA9IGY7ICAgICAgCi0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIFNBX1NFVF9GSUxFX0ZOQU1FIChzeW1ib2xQLCBmaWxlbmFtZSk7Ci0gICAgfQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0gICAgaWYgKGxpc3RpbmcpCi0gICAgICB7Ci0JbGlzdGluZ19zb3VyY2VfZmlsZSAoZmlsZW5hbWUpOwotICAgICAgfQotCi0gIH0KLQotI2VuZGlmCi0gIFNGX1NFVF9ERUJVRyAoc3ltYm9sUCk7Ci0gIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBwcmV2aW91c19maWxlX3N5bWJvbCk7Ci0KLSAgcHJldmlvdXNfZmlsZV9zeW1ib2wgPSBzeW1ib2xQOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzeW1ib2wgaXMgZmlyc3Qgb24gdGhlIHN5bWJvbCBjaGFpbiAqLwotICBpZiAoc3ltYm9sX3Jvb3RQICE9IHN5bWJvbFApCi0gICAgewotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfaW5zZXJ0IChzeW1ib2xQLCBzeW1ib2xfcm9vdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgIH0KLX0JCQkJLyogY19kb3RfZmlsZV9zeW1ib2woKSAqLwotCi0vKgotICogQnVpbGQgYSAnc2VjdGlvbiBzdGF0aWMnIHN5bWJvbC4KLSAqLwotCi1zeW1ib2xTICoKLWNfc2VjdGlvbl9zeW1ib2wgKG5hbWUsIGlkeCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IGlkeDsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfYmFzZSAobmFtZSwgRE9fTk9UX1NUUklQKTsKLSAgaWYgKHN5bWJvbFAgPT0gTlVMTCkKLSAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgaWR4LCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBlbHNlCi0gICAgewotICAgICAgLyogTW1tbS4gIEkganVzdCBsb3ZlIHZpb2xhdGluZyBpbnRlcmZhY2VzLiAgTWFrZXMgbWUgZmVlbC4uLmRpcnR5LiAgKi8KLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGlkeCk7Ci0gICAgICBzeW1ib2xQLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotICAgIH0KLQotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX1NUQVQpOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAxKTsKLQotICBTRl9TRVRfU1RBVElDUyAoc3ltYm9sUCk7Ci0KLSNpZmRlZiBURV9ERUxUQQotICAvKiBtYW5mcmVkQHMtZGlyZWt0bmV0LmRlOiBzZWN0aW9uIHN5bWJvbHMgKm11c3QqIGhhdmUgdGhlIExPQ0FMIGJpdCBjbGVhcmVkLAotICAgICB3aGljaCBpcyBzZXQgYnkgdGhlIG5ldyBkZWZpbml0aW9uIG9mIExPQ0FMX0xBQkVMIGluIHRjLW02OGsuaC4gICovCi0gIFNGX0NMRUFSX0xPQ0FMIChzeW1ib2xQKTsKLSNlbmRpZgotI2lmZGVmIFRFX1BFCi0gIC8qIElmIHRoZSAubGlua29uY2UgcHNldWRvLW9wIHdhcyB1c2VkIGZvciB0aGlzIHNlY3Rpb24sIHdlIG11c3QKLSAgICAgc3RvcmUgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBhdXhpbGlhcnkgZW50cnkgZm9yIHRoZSBzZWN0aW9uCi0gICAgIHN5bWJvbC4gICovCi0gIGlmIChzZWdtZW50X2luZm9baWR4XS5saW5rb25jZSAhPSBMSU5LT05DRV9VTlNFVCkKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLQotICAgICAgc3dpdGNoIChzZWdtZW50X2luZm9baWR4XS5saW5rb25jZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgTElOS09OQ0VfRElTQ0FSRDoKLQkgIHR5cGUgPSBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWTsKLQkgIGJyZWFrOwotCWNhc2UgTElOS09OQ0VfT05FX09OTFk6Ci0JICB0eXBlID0gSU1BR0VfQ09NREFUX1NFTEVDVF9OT0RVUExJQ0FURVM7Ci0JICBicmVhazsKLQljYXNlIExJTktPTkNFX1NBTUVfU0laRToKLQkgIHR5cGUgPSBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRTsKLQkgIGJyZWFrOwotCWNhc2UgTElOS09OQ0VfU0FNRV9DT05URU5UUzoKLQkgIHR5cGUgPSBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENIOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBTWU1fQVVYRU5UIChzeW1ib2xQKS0+eF9zY24ueF9jb21kYXQgPSB0eXBlOwotICAgIH0KLSNlbmRpZiAvKiBURV9QRSAqLwotCi0gIHJldHVybiBzeW1ib2xQOwotfQkJCQkvKiBjX3NlY3Rpb25fc3ltYm9sKCkgKi8KLQotc3RhdGljIHZvaWQKLXdfc3ltYm9scyAoYWJmZCwgd2hlcmUsIHN5bWJvbF9yb290UCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIHN5bWJvbFMgKiBzeW1ib2xfcm9vdFA7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIEZpcnN0IGZpbGwgaW4gdGhvc2UgdmFsdWVzIHdlIGhhdmUgb25seSBqdXN0IHdvcmtlZCBvdXQgKi8KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX0xBU1Q7IGkrKykKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gc2VnbWVudF9pbmZvW2ldLmRvdDsKLSAgICAgIGlmIChzeW1ib2xQKQotCXsKLQkgIFNBX1NFVF9TQ05fU0NOTEVOIChzeW1ib2xQLCBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfc2l6ZSk7Ci0JICBTQV9TRVRfU0NOX05SRUxPQyAoc3ltYm9sUCwgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25yZWxvYyk7Ci0JICBTQV9TRVRfU0NOX05MSU5OTyAoc3ltYm9sUCwgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25sbm5vKTsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAgICogRW1pdCBhbGwgc3ltYm9scyBsZWZ0IGluIHRoZSBzeW1ib2wgY2hhaW4uCi0gICAgICovCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICAvKiBVc2VkIHRvIHNhdmUgdGhlIG9mZnNldCBvZiB0aGUgbmFtZS4gSXQgaXMgdXNlZCB0byBwb2ludAotCSAgICAgICB0byB0aGUgc3RyaW5nIGluIG1lbW9yeSBidXQgbXVzdCBiZSBhIGZpbGUgb2Zmc2V0LiAqLwotICAgICAgcmVnaXN0ZXIgY2hhciAqdGVtcDsKLQotICAgICAgLyogV2UgY2FuJ3QgZml4IHRoZSBsbm5vcHRyIGZpZWxkIGluIHlhbmtfc3ltYm9scyB3aXRoIHRoZSBvdGhlcgotICAgICAgICAgYWRqdXN0bWVudHMsIGJlY2F1c2Ugd2UgaGF2ZSB0byB3YWl0IHVudGlsIHdlIGtub3cgd2hlcmUgdGhleQotICAgICAgICAgZ28gaW4gdGhlIGZpbGUuICAqLwotICAgICAgaWYgKFNGX0dFVF9BREpfTE5OT1BUUiAoc3ltYm9sUCkpCi0JewotCSAgU0FfR0VUX1NZTV9MTk5PUFRSIChzeW1ib2xQKSArPQotCSAgICBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sUCldLnNjbmhkci5zX2xubm9wdHI7Ci0JfQotCi0gICAgICB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKHN5bWJvbFApOwotCi0gICAgICB0ZW1wID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gICAgICBpZiAoU0ZfR0VUX1NUUklORyAoc3ltYm9sUCkpCi0JewotCSAgU19TRVRfT0ZGU0VUIChzeW1ib2xQLCBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCk7Ci0JICBTX1NFVF9aRVJPRVMgKHN5bWJvbFAsIDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1zZXQgKHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfZW50cnkubl9uYW1lLCAwLCBTWU1OTUxFTik7Ci0JICBzdHJuY3B5IChzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fbmFtZSwgdGVtcCwgU1lNTk1MRU4pOwotCX0KLSAgICAgIHdoZXJlID0gc3ltYm9sX3RvX2NoYXJzIChhYmZkLCB3aGVyZSwgc3ltYm9sUCk7Ci0gICAgICBTX1NFVF9OQU1FIChzeW1ib2xQLCB0ZW1wKTsKLSAgICB9Ci0KLX0JCQkJLyogd19zeW1ib2xzKCkgKi8KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xjb21tIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc19sY29tbSgwKTsKLSAgcmV0dXJuOwotI2lmIDAKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBpbnQgdGVtcDsKLSAgY2hhciAqcDsKLQotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTWlzc2luZyBzaXplIGV4cHJlc3Npb24iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJsY29tbSBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIiksIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICpwID0gMDsKLQotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZShuYW1lKTsKLQotICBpZiAoU19HRVRfU0VHTUVOVChzeW1ib2xQKSA9PSBTRUdfVU5LTk9XTiAmJgotICAgICAgU19HRVRfVkFMVUUoc3ltYm9sUCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBuZWVkX3Bhc3NfMikKLQl7Ci0JICBjaGFyICpwOwotCSAgc2VnVCBjdXJyZW50X3NlZyA9IG5vd19zZWc7IAkvKiBzYXZlIGN1cnJlbnQgc2VnICAgICAqLwotCSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLQkgIHN1YnNlZ19zZXQgKFNFR19FMiwgMSk7Ci0JICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0JICBwID0gZnJhZ192YXIocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKTAsIHN5bWJvbFAsCi0JCSAgICAgICAob2Zmc2V0VCkgdGVtcCwgKGNoYXIgKikgMCk7Ci0JICAqcCA9IDA7Ci0JICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOyAvKiByZXN0b3JlIGN1cnJlbnQgc2VnICovCi0JICBTX1NFVF9TRUdNRU5UKHN5bWJvbFAsIFNFR19FMik7Ci0JICBTX1NFVF9TVE9SQUdFX0NMQVNTKHN5bWJvbFAsIENfU1RBVCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZChfKCJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkIiksIG5hbWUpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotZml4dXBfbWRlcHMgKGZyYWdzLCBoLCB0aGlzX3NlZ21lbnQpCi0gICAgIGZyYWdTICogZnJhZ3M7Ci0gICAgIG9iamVjdF9oZWFkZXJzICogaDsKLSAgICAgc2VnVCB0aGlzX3NlZ21lbnQ7Ci17Ci0gIHN1YnNlZ19jaGFuZ2UgKHRoaXNfc2VnbWVudCwgMCk7Ci0gIHdoaWxlIChmcmFncykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGZyYWdzLT5mcl90eXBlKQotCXsKLQljYXNlIHJzX2FsaWduOgotCWNhc2UgcnNfYWxpZ25fY29kZToKLQljYXNlIHJzX29yZzoKLSNpZmRlZiBIQU5ETEVfQUxJR04KLQkgIEhBTkRMRV9BTElHTiAoZnJhZ3MpOwotI2VuZGlmCi0JICBmcmFncy0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0JICBmcmFncy0+ZnJfb2Zmc2V0ID0KLQkgICAgKChmcmFncy0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWdzLT5mcl9hZGRyZXNzIC0gZnJhZ3MtPmZyX2ZpeCkKLQkgICAgIC8gZnJhZ3MtPmZyX3Zhcik7Ci0JICBicmVhazsKLQljYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotCSAgbWRfY29udmVydF9mcmFnIChoLCB0aGlzX3NlZ21lbnQsIGZyYWdzKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ3MpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIDsKLQl9Ci0gICAgICBmcmFncyA9IGZyYWdzLT5mcl9uZXh0OwotICAgIH0KLX0KLQotI2lmIDEKLQotI2lmbmRlZiBUQ19GT1JDRV9SRUxPQ0FUSU9OCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4KSAwCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLWZpeHVwX3NlZ21lbnQgKHNlZ1AsIHRoaXNfc2VnbWVudF90eXBlKQotICAgICBzZWdtZW50X2luZm9fdHlwZSAqIHNlZ1A7Ci0gICAgIHNlZ1QgdGhpc19zZWdtZW50X3R5cGU7Ci17Ci0gIHJlZ2lzdGVyIGZpeFMgKiBmaXhQOwotICByZWdpc3RlciBzeW1ib2xTICphZGRfc3ltYm9sUDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ViX3N5bWJvbFA7Ci0gIGxvbmcgYWRkX251bWJlcjsKLSAgcmVnaXN0ZXIgaW50IHNpemU7Ci0gIHJlZ2lzdGVyIGNoYXIgKnBsYWNlOwotICByZWdpc3RlciBsb25nIHdoZXJlOwotICByZWdpc3RlciBjaGFyIHBjcmVsOwotICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gIHJlZ2lzdGVyIHNlZ1QgYWRkX3N5bWJvbF9zZWdtZW50ID0gYWJzb2x1dGVfc2VjdGlvbjsKLQotICBmb3IgKGZpeFAgPSBzZWdQLT5maXhfcm9vdDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgewotICAgICAgZnJhZ1AgPSBmaXhQLT5meF9mcmFnOwotICAgICAga25vdyAoZnJhZ1ApOwotICAgICAgd2hlcmUgPSBmaXhQLT5meF93aGVyZTsKLSAgICAgIHBsYWNlID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyB3aGVyZTsKLSAgICAgIHNpemUgPSBmaXhQLT5meF9zaXplOwotICAgICAgYWRkX3N5bWJvbFAgPSBmaXhQLT5meF9hZGRzeTsKLSAgICAgIHN1Yl9zeW1ib2xQID0gZml4UC0+Znhfc3Vic3k7Ci0gICAgICBhZGRfbnVtYmVyID0gZml4UC0+Znhfb2Zmc2V0OwotICAgICAgcGNyZWwgPSBmaXhQLT5meF9wY3JlbDsKLQotICAgICAgLyogV2Ugd2FudCBmdW5jdGlvbi1yZWxhdGl2ZSBzdGFicyB0byB3b3JrIG9uIHN5c3RlbXMgd2hpY2gKLQkgbWF5IHVzZSBhIHJlbGF4aW5nIGxpbmtlcjsgdGh1cyB3ZSBtdXN0IGhhbmRsZSB0aGUgc3ltMS1zeW0yCi0JIGZpeHVwcyBmdW5jdGlvbi1yZWxhdGl2ZSBzdGFicyBnZW5lcmF0ZXMuCi0KLQkgT2YgY291cnNlLCBpZiB5b3UgYWN0dWFsbHkgZW5hYmxlIHJlbGF4aW5nIGluIHRoZSBsaW5rZXIsIHRoZQotCSBsaW5lIGFuZCBibG9jayBzY29waW5nIGluZm9ybWF0aW9uIGlzIGdvaW5nIHRvIGJlIGluY29ycmVjdAotCSBpbiBzb21lIGNhc2VzLiAgVGhlIG9ubHkgd2F5IHRvIHJlYWxseSBmaXggdGhpcyBpcyB0byBzdXBwb3J0Ci0JIGEgcmVsb2MgaW52b2x2aW5nIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChsaW5rcmVsYXgKLQkgICYmICghc3ViX3N5bWJvbFAgfHwgcGNyZWwpKQotCWNvbnRpbnVlOwotCi0jaWZkZWYgVENfSTk2MAotICAgICAgaWYgKGZpeFAtPmZ4X3RjYml0ICYmIFNGX0dFVF9DQUxMTkFNRSAoYWRkX3N5bWJvbFApKQotCXsKLQkgIC8qIFJlbG9jYXRpb24gc2hvdWxkIGJlIGRvbmUgdmlhIHRoZSBhc3NvY2lhdGVkICdiYWwnIGVudHJ5Ci0JICAgICBwb2ludCBzeW1ib2wuICovCi0KLQkgIGlmICghU0ZfR0VUX0JBTE5BTUUgKHRjX2dldF9iYWxfb2ZfY2FsbCAoYWRkX3N5bWJvbFApKSkKLQkgICAgewotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICBfKCJObyAnYmFsJyBlbnRyeSBwb2ludCBmb3IgbGVhZnByb2MgJXMiKSwKLQkJCSAgICBTX0dFVF9OQU1FIChhZGRfc3ltYm9sUCkpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBmaXhQLT5meF9hZGRzeSA9IGFkZF9zeW1ib2xQID0gdGNfZ2V0X2JhbF9vZl9jYWxsIChhZGRfc3ltYm9sUCk7Ci0JfQotI2VuZGlmCi0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgc3ltYm9scyBoYXZlIGJlZW4gcmVzb2x2ZWQ7IHRoaXMgbWF5IG5vdCBoYXZlCi0gICAgICAgICBoYXBwZW5lZCBpZiB0aGVzZSBhcmUgZXhwcmVzc2lvbiBzeW1ib2xzLiAgKi8KLSAgICAgIGlmIChhZGRfc3ltYm9sUCAhPSBOVUxMICYmICEgYWRkX3N5bWJvbFAtPnN5X3Jlc29sdmVkKQotCXJlc29sdmVfc3ltYm9sX3ZhbHVlIChhZGRfc3ltYm9sUCwgMSk7Ci0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCAhPSBOVUxMKQotCXsKLQkgIC8qIElmIHRoaXMgZml4dXAgaXMgYWdhaW5zdCBhIHN5bWJvbCB3aGljaCBoYXMgYmVlbiBlcXVhdGVkCi0JICAgICB0byBhbm90aGVyIHN5bWJvbCwgY29udmVydCBpdCB0byB0aGUgb3RoZXIgc3ltYm9sLiAgKi8KLQkgIGlmIChhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoYWRkX3N5bWJvbFApCi0JCSAgfHwgU19JU19DT01NT04gKGFkZF9zeW1ib2xQKSkpCi0JICAgIHsKLQkgICAgICB3aGlsZSAoYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKLQkJICAgICAmJiAoISBTX0lTX0RFRklORUQgKGFkZF9zeW1ib2xQKQotCQkJIHx8IFNfSVNfQ09NTU9OIChhZGRfc3ltYm9sUCkpKQotCQl7Ci0JCSAgc3ltYm9sUyAqbjsKLQotCQkgIC8qIFdlIG11c3QgYXZvaWQgbG9vcGluZywgYXMgdGhhdCBjYW4gb2NjdXIgd2l0aCBhCi0JCSAgICAgYmFkbHkgd3JpdHRlbiBwcm9ncmFtLiAgKi8KLQkJICBuID0gYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLQkJICBpZiAobiA9PSBhZGRfc3ltYm9sUCkKLQkJICAgIGJyZWFrOwotCQkgIGFkZF9udW1iZXIgKz0gYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKLQkJICBhZGRfc3ltYm9sUCA9IG47Ci0JCX0KLQkgICAgICBmaXhQLT5meF9hZGRzeSA9IGFkZF9zeW1ib2xQOwotCSAgICAgIGZpeFAtPmZ4X29mZnNldCA9IGFkZF9udW1iZXI7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChzdWJfc3ltYm9sUCAhPSBOVUxMICYmICEgc3ViX3N5bWJvbFAtPnN5X3Jlc29sdmVkKQotCXJlc29sdmVfc3ltYm9sX3ZhbHVlIChzdWJfc3ltYm9sUCwgMSk7Ci0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCAhPSBOVUxMCi0JICAmJiBhZGRfc3ltYm9sUC0+c3lfbXJpX2NvbW1vbikKLQl7Ci0JICBrbm93IChhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JICBmaXhQLT5meF9vZmZzZXQgPSBhZGRfbnVtYmVyOwotCSAgYWRkX3N5bWJvbFAgPSBmaXhQLT5meF9hZGRzeSA9IGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7Ci0JfQotCi0gICAgICBpZiAoYWRkX3N5bWJvbFApCi0JewotCSAgYWRkX3N5bWJvbF9zZWdtZW50ID0gU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbFApOwotCX0JCQkvKiBpZiB0aGVyZSBpcyBhbiBhZGRlbmQgKi8KLQotICAgICAgaWYgKHN1Yl9zeW1ib2xQKQotCXsKLQkgIGlmIChhZGRfc3ltYm9sUCA9PSBOVUxMIHx8IGFkZF9zeW1ib2xfc2VnbWVudCA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwpCi0JCXsKLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JCSAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCQkgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogSXQncyBqdXN0IC1zeW0uICAqLwotCSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkJewotCQkgIGFkZF9udW1iZXIgLT0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQkJICBmaXhQLT5meF9zdWJzeSA9IDA7Ci0JCSAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLSNpZm5kZWYgVENfTTY4SwotCQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQlfKCJOZWdhdGl2ZSBvZiBub24tYWJzb2x1dGUgc3ltYm9sICVzIiksCi0JCQkJU19HRVRfTkFNRSAoc3ViX3N5bWJvbFApKTsKLSNlbmRpZgotCQkgIGFkZF9udW1iZXIgLT0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQkJfQkJLyogbm90IGFic29sdXRlICovCi0KLQkgICAgICAvKiBpZiBzdWJfc3ltYm9sIGlzIGluIHRoZSBzYW1lIHNlZ21lbnQgdGhhdCBhZGRfc3ltYm9sCi0JCSBhbmQgYWRkX3N5bWJvbCBpcyBlaXRoZXIgaW4gREFUQSwgVEVYVCwgQlNTIG9yIEFCU09MVVRFICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhZGRfc3ltYm9sX3NlZ21lbnQKLQkJICAgJiYgU0VHX05PUk1BTCAoYWRkX3N5bWJvbF9zZWdtZW50KSkKLQkgICAgewotCSAgICAgIC8qIERpZmZlcmVuY2Ugb2YgMiBzeW1ib2xzIGZyb20gc2FtZSBzZWdtZW50LiAgQ2FuJ3QKLQkJIG1ha2UgZGlmZmVyZW5jZSBvZiAyIHVuZGVmaW5lZHM6ICd2YWx1ZScgbWVhbnMKLQkJIHNvbWV0aGluZyBkaWZmZXJlbnQgZm9yIE5fVU5ERi4gKi8KLSNpZmRlZiBUQ19JOTYwCi0JICAgICAgLyogTWFrZXMgbm8gc2Vuc2UgdG8gdXNlIHRoZSBkaWZmZXJlbmNlIG9mIDIgYXJiaXRyYXJ5IHN5bWJvbHMKLQkgICAgICAgICBhcyB0aGUgdGFyZ2V0IG9mIGEgY2FsbCBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaWYgKGZpeFAtPmZ4X3RjYml0KQotCQl7Ci0JCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCV8oImNhbGxqIHRvIGRpZmZlcmVuY2Ugb2YgMiBzeW1ib2xzIikpOwotCQl9Ci0jZW5kaWYgLyogVENfSTk2MCAqLwotCSAgICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKSAtCi0JCVNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0JICAgICAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCi0JICAgICAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhQKSkKLQkJewotCQkgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICBmaXhQLT5meF9zdWJzeSA9IE5VTEw7Ci0JCSAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0jaWZkZWYgVENfTTY4SyAvKiBpcyB0aGlzIHJpZ2h0PyAqLwotCQkgIHBjcmVsID0gMDsKLQkJICBmaXhQLT5meF9wY3JlbCA9IDA7Ci0jZW5kaWYKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBEaWZmZXJlbnQgc2VnbWVudHMgaW4gc3VidHJhY3Rpb24uICovCi0JICAgICAga25vdyAoIShTX0lTX0VYVEVSTkFMIChzdWJfc3ltYm9sUCkgJiYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkpOwotCi0JICAgICAgaWYgKChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikpCi0JCXsKLQkJICBhZGRfbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0JCX0KLSNpZmRlZiBESUZGX0VYUFJfT0sKLQkgICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gdGhpc19zZWdtZW50X3R5cGUKLSNpZiAwIC8qIE9rYXkgZm9yIDY4aywgYXQgbGVhc3QuLi4gKi8KLQkJICAgICAgICYmICFwY3JlbAotI2VuZGlmCi0JCSAgICAgICApCi0JCXsKLQkJICAvKiBNYWtlIGl0IHBjLXJlbGF0aXZlLiAgKi8KLQkJICBhZGRfbnVtYmVyICs9IChtZF9wY3JlbF9mcm9tIChmaXhQKQotCQkJCSAtIFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCkpOwotCQkgIHBjcmVsID0gMTsKLQkJICBmaXhQLT5meF9wY3JlbCA9IDE7Ci0JCSAgc3ViX3N5bWJvbFAgPSAwOwotCQkgIGZpeFAtPmZ4X3N1YnN5ID0gMDsKLQkJfQotI2VuZGlmCi0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCV8oIkNhbid0IGVtaXQgcmVsb2Mgey0gJXMtc2VnIHN5bWJvbCBcIiVzXCJ9IEAgZmlsZSBhZGRyZXNzICVsZC4iKSwKLQkJCQlzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSksCi0JCQkJU19HRVRfTkFNRSAoc3ViX3N5bWJvbFApLAotCQkJCShsb25nKSAoZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZSkpOwotCQl9CQkvKiBpZiBhYnNvbHV0ZSAqLwotCSAgICB9Ci0JfQkJCS8qIGlmIHN1Yl9zeW1ib2xQICovCi0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCkKLQl7Ci0JICBpZiAoYWRkX3N5bWJvbF9zZWdtZW50ID09IHRoaXNfc2VnbWVudF90eXBlICYmIHBjcmVsKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBUaGlzIGZpeHVwIHdhcyBtYWRlIHdoZW4gdGhlIHN5bWJvbCdzIHNlZ21lbnQgd2FzCi0JICAgICAgICogU0VHX1VOS05PV04sIGJ1dCBpdCBpcyBub3cgaW4gdGhlIGxvY2FsIHNlZ21lbnQuCi0JICAgICAgICogU28gd2Uga25vdyBob3cgdG8gZG8gdGhlIGFkZHJlc3Mgd2l0aG91dCByZWxvY2F0aW9uLgotCSAgICAgICAqLwotI2lmZGVmIFRDX0k5NjAKLQkgICAgICAvKiByZWxvY19jYWxsaigpIG1heSByZXBsYWNlIGEgJ2NhbGwnIHdpdGggYSAnY2FsbHMnIG9yIGEgJ2JhbCcsCi0JICAgICAgICogaW4gd2hpY2ggY2FzZXMgaXQgbW9kaWZpZXMgKmZpeFAgYXMgYXBwcm9wcmlhdGUuICBJbiB0aGUgY2FzZQotCSAgICAgICAqIG9mIGEgJ2NhbGxzJywgbm8gZnVydGhlciB3b3JrIGlzIHJlcXVpcmVkLCBhbmQgKmZpeFAgaGFzIGJlZW4KLQkgICAgICAgKiBzZXQgdXAgdG8gbWFrZSB0aGUgcmVzdCBvZiB0aGUgY29kZSBiZWxvdyBhIG5vLW9wLgotCSAgICAgICAqLwotCSAgICAgIHJlbG9jX2NhbGxqIChmaXhQKTsKLSNlbmRpZiAvKiBUQ19JOTYwICovCi0KLQkgICAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0JICAgICAgYWRkX251bWJlciAtPSBtZF9wY3JlbF9mcm9tIChmaXhQKTsKLQotCSAgICAgIC8qIFdlIHVzZWQgdG8gZG8KLQkJICAgYWRkX251bWJlciAtPSBzZWdQLT5zY25oZHIuc192YWRkcjsKLQkJIGlmIGRlZmluZWQgKFRDX0kzODYpIHx8IGRlZmluZWQgKFRFX0xZTlgpLiAgSSBub3cKLQkJIHRoaW5rIHRoYXQgd2FzIGFuIGVycm9yIHByb3BhZ2F0ZWQgZnJvbSB0aGUgY2FzZSB3aGVuCi0JCSB3ZSBhcmUgZ29pbmcgdG8gZW1pdCB0aGUgcmVsb2NhdGlvbi4gIElmIHdlIGFyZSBub3QKLQkJIGdvaW5nIHRvIGVtaXQgdGhlIHJlbG9jYXRpb24sIHRoZW4gd2UganVzdCB3YW50IHRvCi0JCSBzZXQgYWRkX251bWJlciB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2xzLgotCQkgVGhpcyBpcyBhIGNhc2UgdGhhdCB3b3VsZCBvbmx5IGFyaXNlIHdoZW4gdGhlcmUgaXMgYQotCQkgUEMgcmVsYXRpdmUgcmVmZXJlbmNlIGZyb20gYSBzZWN0aW9uIG90aGVyIHRoYW4gLnRleHQKLQkJIHRvIGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlIHNhbWUgc2VjdGlvbiwgYW5kIHRoZQotCQkgcmVmZXJlbmNlIGlzIG5vdCByZWxheGVkLiAgU2luY2UganVtcCBpbnN0cnVjdGlvbnMgb24KLQkJIHRoZSBpMzg2IGFyZSByZWxheGVkLCB0aGlzIGNvdWxkIG9ubHkgYXJpc2Ugd2l0aCBhCi0JCSBjYWxsIGluc3RydWN0aW9uLiAgKi8KLQotCSAgICAgIHBjcmVsID0gMDsJLyogTGllLiBEb24ndCB3YW50IGZ1cnRoZXIgcGNyZWwgcHJvY2Vzc2luZy4gKi8KLQkgICAgICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeFApKQotCQl7Ci0JCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQkgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN3aXRjaCAoYWRkX3N5bWJvbF9zZWdtZW50KQotCQl7Ci0JCWNhc2UgYWJzb2x1dGVfc2VjdGlvbjoKLSNpZmRlZiBUQ19JOTYwCi0JCSAgcmVsb2NfY2FsbGogKGZpeFApOwkvKiBTZWUgY29tbWVudCBhYm91dCByZWxvY19jYWxsaigpIGFib3ZlKi8KLSNlbmRpZiAvKiBUQ19JOTYwICovCi0JCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotCQkgIGFkZF9zeW1ib2xQID0gTlVMTDsKLQotCQkgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4UCkpCi0JCSAgICB7Ci0JCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0KLQotI2lmIGRlZmluZWQoVENfQTI5SykgfHwgKGRlZmluZWQoVEVfUEUpICYmIGRlZmluZWQoVENfSTM4NikpIHx8IGRlZmluZWQoVENfTTg4SykKLQkJICAvKiBUaGlzIHJlYWxseSBzaG91bGQgYmUgaGFuZGxlZCBpbiB0aGUgbGlua2VyLCBidXQKLQkJICAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvcmJpZHMuICAqLwotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLSNlbHNlCi0JCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApICsKLQkJICAgIHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sUCldLnNjbmhkci5zX3BhZGRyOwotI2VuZGlmCi0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBTRUdfVU5LTk9XTjoKLSNpZmRlZiBUQ19JOTYwCi0JCSAgaWYgKChpbnQpIGZpeFAtPmZ4X2JpdF9maXhQID09IDEzKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgQ09CUiBpbnN0cnVjdGlvbi4gIFRoZXkgaGF2ZSBvbmx5IGEKLQkJICAgICAgICogMTMtYml0IGRpc3BsYWNlbWVudCBhbmQgYXJlIG9ubHkgdG8gYmUgdXNlZAotCQkgICAgICAgKiBmb3IgbG9jYWwgYnJhbmNoZXM6IGZsYWcgYXMgZXJyb3IsIGRvbid0IGdlbmVyYXRlCi0JCSAgICAgICAqIHJlbG9jYXRpb24uCi0JCSAgICAgICAqLwotCQkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkJICAgIF8oImNhbid0IHVzZSBDT0JSIGZvcm1hdCB3aXRoIGV4dGVybmFsIGxhYmVsIikpOwotCQkgICAgICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0JCS8qIENPQlIgKi8KLSNlbmRpZiAvKiBUQ19JOTYwICovCi0jaWYgKChkZWZpbmVkIChUQ19JMzg2KSB8fCBkZWZpbmVkIChURV9MWU5YKSB8fCBkZWZpbmVkIChURV9BVVgpKSAmJiAhZGVmaW5lZChURV9QRSkpIHx8IGRlZmluZWQgKENPRkZfQ09NTU9OX0FEREVORCkKLQkJICAvKiAzODYgQ09GRiB1c2VzIGEgcGVjdWxpYXIgZm9ybWF0IGluIHdoaWNoIHRoZQotCQkgICAgIHZhbHVlIG9mIGEgY29tbW9uIHN5bWJvbCBpcyBzdG9yZWQgaW4gdGhlIC50ZXh0Ci0JCSAgICAgc2VnbWVudCAoSSd2ZSBjaGVja2VkIHRoaXMgb24gU1ZSMy4yIGFuZCBTQ08KLQkJICAgICAzLjIuMikgSWFuIFRheWxvciA8aWFuQGN5Z251cy5jb20+LiAgKi8KLQkJICAvKiBUaGlzIGlzIGFsc28gdHJ1ZSBmb3IgNjhrIENPRkYgb24gc3lzdiBtYWNoaW5lcwotCQkgICAgIChDaGVja2VkIG9uIE1vdG9yb2xhIHN5c3Y2OCBSM1Y2IGFuZCBSM1Y3LjEsIGFuZCBhbHNvIG9uCi0JCSAgICAgVU5JWCBTeXN0ZW0gVi9NNjgwMDAsIFJlbGVhc2UgMS4wIGZyb20gQVRUL0JlbGwgTGFicykKLQkJICAgICBQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG1AaW5mby51Y2wuYWMuYmU+LiAqLwotCQkgIGlmIChTX0lTX0NPTU1PTiAoYWRkX3N5bWJvbFApKQotCQkgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotI2VuZGlmCi0JCSAgYnJlYWs7Ci0KLQotCQl9CQkvKiBzd2l0Y2ggb24gc3ltYm9sIHNlZyAqLwotCSAgICB9CQkJLyogaWYgbm90IGluIGxvY2FsIHNlZyAqLwotCX0JCQkvKiBpZiB0aGVyZSB3YXMgYSArIHN5bWJvbCAqLwotCi0gICAgICBpZiAocGNyZWwpCi0JewotI2lmICFkZWZpbmVkKFRDX004OEspICYmICEoZGVmaW5lZChURV9QRSkgJiYgZGVmaW5lZChUQ19JMzg2KSkgJiYgIWRlZmluZWQoVENfQTI5SykKLQkgIC8qIFRoaXMgYWRqdXN0bWVudCBpcyBub3QgY29ycmVjdCBvbiB0aGUgbTg4aywgZm9yIHdoaWNoIHRoZQotCSAgICAgbGlua2VyIGRvZXMgYWxsIHRoZSBjb21wdXRhdGlvbi4gICovCi0JICBhZGRfbnVtYmVyIC09IG1kX3BjcmVsX2Zyb20gKGZpeFApOwotI2VuZGlmCi0JICBpZiAoYWRkX3N5bWJvbFAgPT0gMCkKLQkgICAgewotCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gJmFic19zeW1ib2w7Ci0JICAgIH0JCQkvKiBpZiB0aGVyZSdzIGFuIGFkZF9zeW1ib2wgKi8KLSNpZiBkZWZpbmVkIChUQ19JMzg2KSB8fCBkZWZpbmVkIChURV9MWU5YKSB8fCBkZWZpbmVkIChUQ19JOTYwKSB8fCBkZWZpbmVkIChUQ19NNjhLKQotCSAgLyogT24gdGhlIDM4NiB3ZSBtdXN0IGFkanVzdCBieSB0aGUgc2VnbWVudCB2YWRkciBhcyB3ZWxsLgotCSAgICAgSWFuIFRheWxvci4KLQotCSAgICAgSSBjaGFuZ2VkIHRoZSBpOTYwIHRvIHdvcmsgdGhpcyB3YXkgYXMgd2VsbC4gIFRoaXMgaXMKLQkgICAgIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBHTlUgbGlua2VyIGJlaGF2aW91ci4gIEkgZG8KLQkgICAgIG5vdCBrbm93IHdoYXQgb3RoZXIgaTk2MCBDT0ZGIGFzc2VtYmxlcnMgZG8uICBUaGlzIGlzIG5vdAotCSAgICAgYSBjb21tb24gY2FzZTogbm9ybWFsbHksIG9ubHkgYXNzZW1ibGVyIGNvZGUgd2lsbCBjb250YWluCi0JICAgICBhIFBDIHJlbGF0aXZlIHJlbG9jLCBhbmQgb25seSBicmFuY2hlcyB3aGljaCBkbyBub3QKLQkgICAgIG9yaWdpbmF0ZSBpbiB0aGUgLnRleHQgc2VjdGlvbiB3aWxsIGhhdmUgYSBub24temVybwotCSAgICAgYWRkcmVzcy4KLQotCSAgICAgSSBjaGFuZ2VkIHRoZSBtNjhrIHRvIHdvcmsgdGhpcyB3YXkgYXMgd2VsbC4gIFRoaXMgd2lsbAotCSAgICAgYnJlYWsgZXhpc3RpbmcgUEMgcmVsYXRpdmUgcmVsb2NzIGZyb20gc2VjdGlvbnMgd2hpY2ggZG8KLQkgICAgIG5vdCBzdGFydCBhdCBhZGRyZXNzIDAsIGJ1dCBpdCB3aWxsIG1ha2UgbGQgLXIgd29yay4KLQkgICAgIElhbiBUYXlsb3IsIDQgT2N0IDk2LiAgKi8KLQotCSAgYWRkX251bWJlciAtPSBzZWdQLT5zY25oZHIuc192YWRkcjsKLSNlbmRpZgotCX0JCQkvKiBpZiBwY3JlbCAqLwotCi0jaWZkZWYgTURfQVBQTFlfRklYMwotICAgICAgbWRfYXBwbHlfZml4MyAoZml4UCwgKHZhbHVlVCAqKSAmYWRkX251bWJlciwgdGhpc19zZWdtZW50X3R5cGUpOwotI2Vsc2UKLSAgICAgIG1kX2FwcGx5X2ZpeCAoZml4UCwgYWRkX251bWJlcik7Ci0jZW5kaWYKLQotICAgICAgaWYgKCFmaXhQLT5meF9iaXRfZml4UCAmJiAhIGZpeFAtPmZ4X25vX292ZXJmbG93KQotCXsKLSNpZm5kZWYgVENfTTg4SwotCSAgLyogVGhlIG04OGsgdXNlcyB0aGUgb2Zmc2V0IGZpZWxkIG9mIHRoZSByZWxvYyB0byBnZXQgYXJvdW5kCi0JICAgICB0aGlzIHByb2JsZW0uICAqLwotCSAgaWYgKChzaXplID09IDEKLQkgICAgICAgJiYgKChhZGRfbnVtYmVyICYgfjB4RkYpCi0JCSAgIHx8IChmaXhQLT5meF9zaWduZWQgJiYgKGFkZF9udW1iZXIgJiAweDgwKSkpCi0JICAgICAgICYmICgoYWRkX251bWJlciAmIH4weEZGKSAhPSAoLTEgJiB+MHhGRikKLQkJICAgfHwgKGFkZF9udW1iZXIgJiAweDgwKSA9PSAwKSkKLQkgICAgICB8fCAoc2l6ZSA9PSAyCi0JCSAgJiYgKChhZGRfbnVtYmVyICYgfjB4RkZGRikKLQkJICAgICAgfHwgKGZpeFAtPmZ4X3NpZ25lZCAmJiAoYWRkX251bWJlciAmIDB4ODAwMCkpKQotCQkgICYmICgoYWRkX251bWJlciAmIH4weEZGRkYpICE9ICgtMSAmIH4weEZGRkYpCi0JCSAgICAgIHx8IChhZGRfbnVtYmVyICYgMHg4MDAwKSA9PSAwKSkpCi0JICAgIHsKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgXygiVmFsdWUgb2YgJWxkIHRvbyBsYXJnZSBmb3IgZmllbGQgb2YgJWQgYnl0ZXMgYXQgMHglbHgiKSwKLQkJCSAgICAobG9uZykgYWRkX251bWJlciwgc2l6ZSwKLQkJCSAgICAodW5zaWduZWQgbG9uZykgKGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpKTsKLQkgICAgfQotI2VuZGlmCi0jaWZkZWYgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRAotCSAgLyogV2FybiBpZiBhIC53b3JkIHZhbHVlIGlzIHRvbyBsYXJnZSB3aGVuIHRyZWF0ZWQgYXMgYQotCSAgICAgc2lnbmVkIG51bWJlci4gIFdlIGFscmVhZHkga25vdyBpdCBpcyBub3QgdG9vIG5lZ2F0aXZlLgotCSAgICAgVGhpcyBpcyB0byBjYXRjaCBvdmVyLWxhcmdlIHN3aXRjaGVzIGdlbmVyYXRlZCBieSBnY2Mgb24KLQkgICAgIHRoZSA2OGsuICAqLwotCSAgaWYgKCFmbGFnX3NpZ25lZF9vdmVyZmxvd19vawotCSAgICAgICYmIHNpemUgPT0gMgotCSAgICAgICYmIGFkZF9udW1iZXIgPiAweDdmZmYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiU2lnbmVkIC53b3JkIG92ZXJmbG93OyBzd2l0Y2ggbWF5IGJlIHRvbyBsYXJnZTsgJWxkIGF0IDB4JWx4IiksCi0JCQkgIChsb25nKSBhZGRfbnVtYmVyLAotCQkJICAodW5zaWduZWQgbG9uZykgKGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpKTsKLSNlbmRpZgotCX0JCQkvKiBub3QgYSBiaXQgZml4ICovCi0gICAgfQkJCQkvKiBGb3IgZWFjaCBmaXhTIGluIHRoaXMgc2VnbWVudC4gKi8KLX0JCQkJLyogZml4dXBfc2VnbWVudCgpICovCi0KLSNlbmRpZgotCi0vKiBUaGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYiBzZWN0aW9uIGlzIHNwZWNpYWwuICAqLwotCi12b2lkCi1vYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKQotICAgICBzZWdUIHNlZzsKLXsKLSAgY2hhciAqZmlsZTsKLSAgY2hhciAqcDsKLSAgY2hhciAqc3RhYnN0cl9uYW1lOwotICB1bnNpZ25lZCBpbnQgc3Ryb2ZmOwotCi0gIC8qIE1ha2Ugc3BhY2UgZm9yIHRoaXMgZmlyc3Qgc3ltYm9sLiAqLwotICBwID0gZnJhZ19tb3JlICgxMik7Ci0gIC8qIFplcm8gaXQgb3V0LiAqLwotICBtZW1zZXQgKHAsIDAsIDEyKTsKLSAgYXNfd2hlcmUgKCZmaWxlLCAodW5zaWduZWQgaW50ICopIE5VTEwpOwotICBzdGFic3RyX25hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoc2VnbWVudF9pbmZvW3NlZ10ubmFtZSkgKyA0KTsKLSAgc3RyY3B5IChzdGFic3RyX25hbWUsIHNlZ21lbnRfaW5mb1tzZWddLm5hbWUpOwotICBzdHJjYXQgKHN0YWJzdHJfbmFtZSwgInN0ciIpOwotICBzdHJvZmYgPSBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0IChmaWxlLCBzdGFic3RyX25hbWUpOwotICBrbm93IChzdHJvZmYgPT0gMSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgc3Ryb2ZmLCA0KTsKLX0KLQotLyogRmlsbCBpbiB0aGUgY291bnRzIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBhIC5zdGFiIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3N0YWJfc2VjdGlvbihhYmZkLCBzZWcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIHNlZ1Qgc3RhYnN0cnNlZyA9IFNFR19VTktOT1dOOwotICBjb25zdCBjaGFyICpzZWNuYW1lLCAqbmFtZTI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnAgPSBOVUxMOwotICBpbnQgaSwgc3Ryc3ogPSAwLCBuc3ltczsKLSAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9bc2VnXS5mcmNoYWluUC0+ZnJjaF9yb290OwotCi0gIC8qIExvb2sgZm9yIHRoZSBhc3NvY2lhdGVkIHN0cmluZyB0YWJsZSBzZWN0aW9uLiAqLwotCi0gIHNlY25hbWUgPSBzZWdtZW50X2luZm9bc2VnXS5uYW1lOwotICBuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHNlY25hbWUpICsgNCk7Ci0gIHN0cmNweSAobmFtZSwgc2VjbmFtZSk7Ci0gIHN0cmNhdCAobmFtZSwgInN0ciIpOwotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgbmFtZTIgPSBzZWdtZW50X2luZm9baV0ubmFtZTsKLSAgICAgIGlmIChuYW1lMiAhPSBOVUxMICYmIHN0cm5jbXAobmFtZTIsIG5hbWUsIDgpID09IDApCi0JewotCSAgc3RhYnN0cnNlZyA9IGk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGZvdW5kIHRoZSBzZWN0aW9uLCBnZXQgaXRzIHNpemUuICovCi0gIGlmIChzdGFic3Ryc2VnICE9IFNFR19VTktOT1dOKQotICAgIHN0cnN6ID0gc2l6ZV9zZWN0aW9uIChhYmZkLCBzdGFic3Ryc2VnKTsKLQotICBuc3ltcyA9IHNpemVfc2VjdGlvbiAoYWJmZCwgc2VnKSAvIDEyIC0gMTsKLQotICAvKiBMb29rIGZvciB0aGUgZmlyc3QgZnJhZyBvZiBzdWZmaWNpZW50IHNpemUgZm9yIHRoZSBpbml0aWFsIHN0YWIKLSAgICAgc3ltYm9sLCBhbmQgY29sbGVjdCBhIHBvaW50ZXIgdG8gaXQuICovCi0gIHdoaWxlIChmcmFnICYmIGZyYWctPmZyX2ZpeCA8IDEyKQotICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotICBhc3NlcnQgKGZyYWcgIT0gMCk7Ci0gIHAgPSBmcmFnLT5mcl9saXRlcmFsOwotICBhc3NlcnQgKHAgIT0gMCk7Ci0KLSAgLyogV3JpdGUgaW4gdGhlIG51bWJlciBvZiBzdGFiIHN5bWJvbHMgYW5kIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcKLSAgICAgdGFibGUuICovCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIG5zeW1zLCAoYmZkX2J5dGUgKikgcCArIDYpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzdHJzeiwgKGJmZF9ieXRlICopIHAgKyA4KTsKLX0KLQotI2VuZGlmIC8qIG5vdCBCRkRfQVNTRU1CTEVSICovCi0KLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICB7ImRlZiIsIG9ial9jb2ZmX2RlZiwgMH0sCi0gIHsiZGltIiwgb2JqX2NvZmZfZGltLCAwfSwKLSAgeyJlbmRlZiIsIG9ial9jb2ZmX2VuZGVmLCAwfSwKLSAgeyJsaW5lIiwgb2JqX2NvZmZfbGluZSwgMH0sCi0gIHsibG4iLCBvYmpfY29mZl9sbiwgMH0sCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICB7ImxvYyIsIG9ial9jb2ZmX2xvYywgMH0sCi0jZW5kaWYKLSAgeyJhcHBsaW5lIiwgb2JqX2NvZmZfbG4sIDF9LAotICB7InNjbCIsIG9ial9jb2ZmX3NjbCwgMH0sCi0gIHsic2l6ZSIsIG9ial9jb2ZmX3NpemUsIDB9LAotICB7InRhZyIsIG9ial9jb2ZmX3RhZywgMH0sCi0gIHsidHlwZSIsIG9ial9jb2ZmX3R5cGUsIDB9LAotICB7InZhbCIsIG9ial9jb2ZmX3ZhbCwgMH0sCi0gIHsic2VjdGlvbiIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICB7InNlY3QiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgLyogRklYTUU6IFdlIGlnbm9yZSB0aGUgTVJJIHNob3J0IGF0dHJpYnV0ZS4gICovCi0gIHsic2VjdGlvbi5zIiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdC5zIiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0gIC8qIFdlIGFjY2VwdCB0aGUgLmJzcyBkaXJlY3RpdmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aAotICAgICBlYXJsaWVyIHZlcnNpb25zIG9mIGdhcy4gICovCi0gIHsiYnNzIiwgb2JqX2NvZmZfYnNzLCAwfSwKLSAgeyJ3ZWFrIiwgb2JqX2NvZmZfd2VhaywgMH0sCi0gIHsiaWRlbnQiLCBvYmpfY29mZl9pZGVudCwgMH0sCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgeyJ1c2UiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgeyJ0ZXh0Iiwgb2JqX2NvZmZfdGV4dCwgMH0sCi0gIHsiZGF0YSIsIG9ial9jb2ZmX2RhdGEsIDB9LAotICB7Imxjb21tIiwgb2JqX2NvZmZfbGNvbW0sIDB9LAotI2Vsc2UKLSAgeyJvcHRpbSIsIHNfaWdub3JlLCAwfSwJLyogRm9yIHN1bjM4NmkgY2MgKD8pICovCi0jZW5kaWYKLSAgeyJ2ZXJzaW9uIiwgc19pZ25vcmUsIDB9LAotICB7IkFCT1JUIiwgc19hYm9ydCwgMH0sCi0jaWZkZWYgVENfTTg4SwotICAvKiBUaGUgbTg4ayB1c2VzIHNkZWYgaW5zdGVhZCBvZiBkZWYuICAqLwotICB7InNkZWYiLCBvYmpfY29mZl9kZWYsIDB9LAotI2VuZGlmCi0gIHtOVUxMLCBOVUxMLCAwfQkJLyogZW5kIHNlbnRpbmVsICovCi19OwkJCQkvKiBvYmpfcHNldWRvX3RhYmxlICovCi0MCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1zdGF0aWMgdm9pZCBjb2ZmX3BvcF9pbnNlcnQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLQotLyogU3VwcG9ydCBmb3IgYSBDT0ZGIGVtdWxhdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3BvcF9pbnNlcnQgKCkKLXsKLSAgcG9wX2luc2VydCAob2JqX3BzZXVkb190YWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MgKHNlYykKLSAgICAgYXNlY3Rpb24gKnNlYyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gMDsKLX0KLQotY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgY29mZl9mb3JtYXRfb3BzID0KLXsKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIDAsCi0gIDEsCi0gIGNvZmZfZnJvYl9zeW1ib2wsCi0gIDAsCi0gIGNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcywKLSAgMCwgMCwKLSAgMCwgMCwKLSAgMCwKLSNpZiAwCi0gIG9ial9nZW5lcmF0ZV9hc21fbGluZW5vLAotI2Vsc2UKLSAgMCwKLSNlbmRpZgotI2lmIDAKLSAgb2JqX3N0YWIsCi0jZWxzZQotICAwLAotI2VuZGlmCi0gIGNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MsCi0gIGNvZmZfcG9wX2luc2VydCwKLSNpZiAwCi0gIG9ial9zZXRfZXh0LAotI2Vsc2UKLSAgMCwKLSNlbmRpZgotICBjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2ssCi0gIGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vaywKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotY29mZi5oIGIvZ2FzL2NvbmZpZy9vYmotY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQ3OTg2Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWNvZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0OCArMCwwIEBACi0vKiBjb2ZmIG9iamVjdCBmaWxlIGZvcm1hdAotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgT0JKX0ZPUk1BVF9ICi0jZGVmaW5lIE9CSl9GT1JNQVRfSAotCi0jZGVmaW5lIE9CSl9DT0ZGIDEKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotI2RlZmluZSBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JECi0jZGVmaW5lIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0jZGVmaW5lIEJGRF9IRUFERVJTCi0jZGVmaW5lIEJGRAotCi0jZW5kaWYKLQotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotLyogVGhpcyBpbnRlcm5hbF9saW5lbm8gY3JhcCBpcyB0byBzdG9wIG5hbWVzcGFjZSBwb2xsdXRpb24gZnJvbSB0aGUKLSAgIGJmZCBpbnRlcm5hbCBjb2ZmIGhlYWRlcmZpbGUuICovCi0jZGVmaW5lIGludGVybmFsX2xpbmVubyBiZmRfaW50ZXJuYWxfbGluZW5vCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI3VuZGVmIGludGVybmFsX2xpbmVubwotCi0vKiBDUFUtc3BlY2lmaWMgc2V0dXA6ICAqLwotCi0jaWZkZWYgVENfQVJNCi0jaW5jbHVkZSAiY29mZi9hcm0uaCIKLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWFybSIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBUQ19QUEMKLSNpZmRlZiBURV9QRQotI2luY2x1ZGUgImNvZmYvcG93ZXJwYy5oIgotI2Vsc2UKLSNpbmNsdWRlICJjb2ZmL3JzNjAwMC5oIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFRDX1NQQVJDCi0jaW5jbHVkZSAiY29mZi9zcGFyYy5oIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19JMzg2Ci0jaW5jbHVkZSAiY29mZi9pMzg2LmgiCi0KLSNpZmRlZiBURV9QRQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJwZS1pMzg2IgotI2VuZGlmCi0KLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWkzODYiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgVENfTTY4SwotI2luY2x1ZGUgImNvZmYvbTY4ay5oIgotI2lmbmRlZiBUQVJHRVRfRk9STUFUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtbTY4ayIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBUQ19BMjlLCi0jaW5jbHVkZSAiY29mZi9hMjlrLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtYTI5ay1iaWciCi0jZW5kaWYKLQotI2lmZGVmIFRDX0k5NjAKLSNpbmNsdWRlICJjb2ZmL2k5NjAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1JbnRlbC1saXR0bGUiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1o4SwotI2luY2x1ZGUgImNvZmYvejhrLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtejhrIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19IODMwMAotI2luY2x1ZGUgImNvZmYvaDgzMDAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1oODMwMCIKLSNlbmRpZgotCi0jaWZkZWYgVENfSDg1MDAKLSNpbmNsdWRlICJjb2ZmL2g4NTAwLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtaDg1MDAiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1NICi0jaW5jbHVkZSAiY29mZi9zaC5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkJCQlcCi0gIChzaGwJCQkJCQkJXAotICAgPyAoc2hfc21hbGwgPyAiY29mZi1zaGwtc21hbGwiIDogImNvZmYtc2hsIikJCVwKLSAgIDogKHNoX3NtYWxsID8gImNvZmYtc2gtc21hbGwiIDogImNvZmYtc2giKSkKLSNlbmRpZgotCi0jaWZkZWYgVENfTTg4SwotI2luY2x1ZGUgImNvZmYvbTg4ay5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLW04OGtiY3MiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1c2NQotI2luY2x1ZGUgImNvZmYvdzY1LmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtdzY1IgotI2VuZGlmCi0KLSNpZmRlZiBUQ19USUMzMAotI2luY2x1ZGUgImNvZmYvdGljMzAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi10aWMzMCIKLSNlbmRpZgotCi0jaWZkZWYgVENfVElDODAKLSNpbmNsdWRlICJjb2ZmL3RpYzgwLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtdGljODAiCi0jZGVmaW5lIEFMSUdOTUVOVF9JTl9TX0ZMQUdTIDEKLSNlbmRpZgotCi0jaWZkZWYgVENfTUNPUkUKLSNpbmNsdWRlICJjb2ZmL21jb3JlLmgiCi0jaWZuZGVmIFRBUkdFVF9GT1JNQVQKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAicGUtbWNvcmUiCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBUYXJnZXRzIG1heSBhbHNvIHNldCB0aGlzLiAgQWxzbywgaWYgQkZEX0FTU0VNQkxFUiBpcyBkZWZpbmVkLCB0aGlzCi0gICB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGRlZmluZWQuICAqLwotI3VuZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSNkZWZpbmUgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAxCi0KLSNpZm5kZWYgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMKLSNkZWZpbmUgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMgMQotI2VuZGlmIC8qIE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTICovCi0KLWV4dGVybiB2b2lkIGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vayBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vayBjb2ZmX29ial9zeW1ib2xfbmV3X2hvb2sKLQotZXh0ZXJuIHZvaWQgY29mZl9vYmpfcmVhZF9iZWdpbl9ob29rIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgb2JqX3JlYWRfYmVnaW5faG9vayBjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2sKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgVGhpcyBmaWxlIHJlYWxseSBjb250YWlucyB0d28gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBDT0ZGIGJhY2sgZW5kLgotICAgVGhleSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgbWVyZ2VkLCBidXQgdGhpcyBpcyBvbmx5IGEKLSAgIHByZWxpbWluYXJ5LCBtZWNoYW5pY2FsIG1lcmdpbmcuICBNYW55IGRlZmluaXRpb25zIHRoYXQgYXJlCi0gICBpZGVudGljYWwgYmV0d2VlbiB0aGUgdHdvIGFyZSBzdGlsbCBmb3VuZCBpbiBib3RoIHZlcnNpb25zLgotCi0gICBUaGUgZmlyc3QgdmVyc2lvbiwgd2l0aCBCRkRfQVNTRU1CTEVSIGRlZmluZWQsIHVzZXMgaGlnaC1sZXZlbCBCRkQKLSAgIGludGVyZmFjZXMgYW5kIGRhdGEgc3RydWN0dXJlcy4gIFRoZSBzZWNvbmQgdmVyc2lvbiwgd2l0aAotICAgQkZEX0FTU0VNQkxFUiBub3QgZGVmaW5lZCwgYWxzbyB1c2VzIEJGRCwgYnV0IG1vc3RseSBmb3Igc3dhcHBpbmcKLSAgIGRhdGEgc3RydWN0dXJlcyBhbmQgZm9yIGRvaW5nIHRoZSBhY3R1YWwgSS9PLiAgVGhlIGxhdHRlciBkZWZpbmVzCi0gICB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbHMgQkZEIGFuZCBCRkRfSEVBREVSUy4gIFRyeSBub3QgdG8gbGV0IHRoaXMKLSAgIGNvbmZ1c2UgeW91LgotCi0gICBUaGVzZSB0d28gYXJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIG1lcmdlZCwgYW5kIGV2ZW50dWFsbHkgdGhlCi0gICBCRkRfQVNTRU1CTEVSIHZlcnNpb24gc2hvdWxkIHRha2Ugb3ZlciBjb21wbGV0ZWx5LiAgUmVsZWFzZSB0aW1pbmcKLSAgIGlzc3VlcyBhbmQgbmFtZXNwYWNlIHByb2JsZW1zIGNvbnZpbmNlZCBtZSB0byBtZXJnZSB0aGUgdHdvCi0gICB0b2dldGhlciBpbiB0aGlzIGZhc2hpb24sIGEgbGl0dGxlIHNvb25lciB0aGFuIEkgd291bGQgaGF2ZSBsaWtlZC4KLSAgIFRoZSByZWFsIG1lcmdlIHNob3VsZCBiZSBtdWNoIGJldHRlciBkb25lIGJ5IHRoZSB0aW1lIHRoZSBuZXh0Ci0gICByZWxlYXNlIGNvbWVzIG91dC4KLQotICAgRm9yIG5vdywgdGhlIHN0cnVjdHVyZSBvZiB0aGlzIGZpbGUgaXM6Ci0JPGNvbW1vbj4KLQkjaWZkZWYgQkZEX0FTU0VNQkxFUgotCTxvbmUgdmVyc2lvbj4KLQkjZWxzZQotCTxvdGhlciB2ZXJzaW9uPgotCSNlbmRpZgotCTxjb21tb24+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+c3lfZnJhZyA9IGZyYWdfbm93LAkJCQlcCi0gICAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKSwJCQlcCi0gICAgU19TRVRfU0VHTUVOVCAoc3ltLCBub3dfc2VnKSwJCQlcCi0gICAgMCkJCQkJCQkJXAotIDogMCkKLQotLyogU3RhYnMgaW4gYSBjb2ZmIGZpbGUgZ28gaW50byB0aGVpciBvd24gc2VjdGlvbi4gICovCi0jZGVmaW5lIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgMQotCi0vKiBXZSBuZWVkIDEyIGJ5dGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiB0byBob2xkIHNvbWUgaW5pdGlhbAotICAgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIHZvaWQgb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotI2RlZmluZSBJTklUX1NUQUJfU0VDVElPTihzZWcpIG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCi0KLS8qIFN0b3JlIHRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgaW4gdGhlIHNlY3Rpb24gYXV4IGVudHJ5LiAgKi8KLSNkZWZpbmUgU0VUX1NFQ1RJT05fUkVMT0NTKHNlYywgcmVsb2NzLCBuKSBcCi0gIFNBX1NFVF9TQ05fTlJFTE9DIChzZWN0aW9uX3N5bWJvbCAoc2VjKSwgbikKLQotI2VuZGlmIC8qIE9CSl9GT1JNQVRfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZWNvZmYuYyBiL2dhcy9jb25maWcvb2JqLWVjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODkyNDMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKiBFQ09GRiBvYmplY3QgZmlsZSBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgVGhpcyBmaWxlIHdhcyBwdXQgdG9nZXRoZXIgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgT0JKX0hFQURFUiAib2JqLWVjb2ZmLmgiCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiYmZkL2xpYmNvZmYuaCIKLSNpbmNsdWRlICJiZmQvbGliZWNvZmYuaCIKLQotLyogQWxtb3N0IGFsbCBvZiB0aGUgRUNPRkYgc3VwcG9ydCBpcyBhY3R1YWxseSBpbiBlY29mZi5jIGluIHRoZSBtYWluCi0gICBnYXMgZGlyZWN0b3J5LiAgVGhpcyBmaWxlIG1vc3RseSBqdXN0IGFycmFuZ2VzIHRvIGNhbGwgdGhhdCBvbmUgYXQKLSAgIHRoZSByaWdodCB0aW1lcy4gICovCi0KLXN0YXRpYyBpbnQgZWNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgb2JqX2Vjb2ZmX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50ICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3BvcF9pbnNlcnQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUaGVzZSBhcmUgdGhlIHBzZXVkby1vcHMgd2Ugc3VwcG9ydCBpbiB0aGlzIGZpbGUuICBPbmx5IHRob3NlCi0gICByZWxhdGluZyB0byBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYXJlIHN1cHBvcnRlZCBoZXJlLgotCi0gICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rCi0gICBzaG91bGQgYmUgZGVmaW5lZCBoZXJlLCBidXQgYXJlIGN1cnJlbnRseSB1bnN1cHBvcnRlZDogLmFlbnQsCi0gICAuYmduYiwgLmVuZGIsIC52ZXJzdGFtcCwgLnZyZWcuCi0KLSAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sgYXJlCi0gICBNSVBTIENQVSBzcGVjaWZpYywgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHRjLW1pcHMuYzogLmFsaWFzLAotICAgLmV4dGVybiwgLmdhbGl2ZSwgLmdqYWxkZWYsIC5nanJsaXZlLCAubGl2ZXJlZywgLm5vYWxpYXMsIC5vcHRpb24sCi0gICAucmRhdGEsIC5zZGF0YSwgLnNldC4KLQotICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vayBhcmUKLSAgIG5vdCBNSVBTIENQVSBzcGVjaWZpYywgYnV0IGFyZSBhbHNvIG5vdCBFQ09GRiBzcGVjaWZpYy4gIEkgaGF2ZQotICAgb25seSBsaXN0ZWQgdGhlIG9uZXMgd2hpY2ggYXJlIG5vdCBhbHJlYWR5IGluIHJlYWQuYy4gIEl0J3Mgbm90Ci0gICBjb21wbGV0ZWx5IGNsZWFyIHdoZXJlIHRoZXNlIHNob3VsZCBiZSBkZWZpbmVkLCBidXQgdGMtbWlwcy5jIGlzCi0gICBwcm9iYWJseSB0aGUgbW9zdCByZWFzb25hYmxlIHBsYWNlOiAuYXNjaWl6LCAuYXNtMCwgLmVuZHIsIC5lcnIsCi0gICAuaGFsZiwgLmxhYiwgLnJlcGVhdCwgLnN0cnVjdCwgLndlYWtleHQuICAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAgLyogQ09GRiBzdHlsZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIC5sbiBpcyBub3QgdXNlZDsgLmxvYyBpcyB1c2VkCi0gICAgIGluc3RlYWQuICAqLwotICB7ICJkZWYiLAllY29mZl9kaXJlY3RpdmVfZGVmLAkwIH0sCi0gIHsgImRpbSIsCWVjb2ZmX2RpcmVjdGl2ZV9kaW0sCTAgfSwKLSAgeyAiZW5kZWYiLAllY29mZl9kaXJlY3RpdmVfZW5kZWYsCTAgfSwKLSAgeyAiZmlsZSIsCWVjb2ZmX2RpcmVjdGl2ZV9maWxlLAkwIH0sCi0gIHsgInNjbCIsCWVjb2ZmX2RpcmVjdGl2ZV9zY2wsCTAgfSwKLSAgeyAic2l6ZSIsCWVjb2ZmX2RpcmVjdGl2ZV9zaXplLAkwIH0sCi0gIHsgImVzaXplIiwJZWNvZmZfZGlyZWN0aXZlX3NpemUsCTAgfSwKLSAgeyAidGFnIiwJZWNvZmZfZGlyZWN0aXZlX3RhZywJMCB9LAotICB7ICJ0eXBlIiwJZWNvZmZfZGlyZWN0aXZlX3R5cGUsCTAgfSwKLSAgeyAiZXR5cGUiLAllY29mZl9kaXJlY3RpdmVfdHlwZSwJMCB9LAotICB7ICJ2YWwiLAllY29mZl9kaXJlY3RpdmVfdmFsLAkwIH0sCi0KLSAgLyogRUNPRkYgc3BlY2lmaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgeyAiYmVnaW4iLAllY29mZl9kaXJlY3RpdmVfYmVnaW4sCTAgfSwKLSAgeyAiYmVuZCIsCWVjb2ZmX2RpcmVjdGl2ZV9iZW5kLAkwIH0sCi0gIHsgImVuZCIsCWVjb2ZmX2RpcmVjdGl2ZV9lbmQsCTAgfSwKLSAgeyAiZW50IiwJZWNvZmZfZGlyZWN0aXZlX2VudCwJMCB9LAotICB7ICJmbWFzayIsCWVjb2ZmX2RpcmVjdGl2ZV9mbWFzaywJMCB9LAotICB7ICJmcmFtZSIsCWVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSwJMCB9LAotICB7ICJsb2MiLAllY29mZl9kaXJlY3RpdmVfbG9jLAkwIH0sCi0gIHsgIm1hc2siLAllY29mZl9kaXJlY3RpdmVfbWFzaywJMCB9LAotCi0gIC8qIE90aGVyIEVDT0ZGIGRpcmVjdGl2ZXMuICAqLwotICB7ICJleHRlcm4iLAllY29mZl9kaXJlY3RpdmVfZXh0ZXJuLAkwIH0sCi0KLSNpZm5kZWYgVENfTUlQUwotICAvKiBGb3IgVENfTUlQUywgdGMtbWlwcy5jIGFkZHMgdGhpcy4gKi8KLSAgeyAid2Vha2V4dCIsCWVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0LCAwIH0sCi0jZW5kaWYKLQotICAvKiBUaGVzZSBhcmUgdXNlZCBvbiBJcml4LiAgSSBkb24ndCBrbm93IGhvdyB0byBpbXBsZW1lbnQgdGhlbS4gICovCi0gIHsgImJnbmIiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAiZW5kYiIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJ2ZXJzdGFtcCIsCXNfaWdub3JlLAkJMCB9LAotCi0gIC8qIFNlbnRpbmVsLiAgKi8KLSAgeyBOVUxMIH0KLX07Ci0KLS8qIFN3YXAgb3V0IHRoZSBzeW1ib2xzIGFuZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIEJGRC4gICovCi0KLXZvaWQKLWVjb2ZmX2Zyb2JfZmlsZSAoKQotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXAKLSAgICA9ICZlY29mZl9iYWNrZW5kIChzdGRvdXRwdXQpLT5kZWJ1Z19zd2FwOwotICBiZmRfdm1hIGFkZHI7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIEhEUlIgKmhkcjsKLSAgY2hhciAqYnVmOwotICBjaGFyICpzZXQ7Ci0KLSAgLyogU2V0IHRoZSBzZWN0aW9uIFZNQSB2YWx1ZXMuICBXZSBmb3JjZSB0aGUgLnNkYXRhIGFuZCAuc2JzcwotICAgICBzZWN0aW9ucyB0byB0aGUgZW5kIHRvIGVuc3VyZSB0aGF0IHRoZWlyIFZNQSBhZGRyZXNzZXMgYXJlIGNsb3NlCi0gICAgIHRvZ2V0aGVyIHNvIHRoYXQgdGhlIEdQIHJlZ2lzdGVyIGNhbiBhZGRyZXNzIGJvdGggb2YgdGhlbS4gIFdlCi0gICAgIHB1dCB0aGUgLmJzcyBzZWN0aW9uIGFmdGVyIHRoZSAuc2JzcyBzZWN0aW9uLgotCi0gICAgIEFsc28sIGZvciB0aGUgQWxwaGEsIHdlIG11c3Qgc29ydCB0aGUgc2VjdGlvbnMsIHRvIG1ha2Ugc3VyZSB0aGV5Ci0gICAgIGFwcGVhciBpbiB0aGUgb3V0cHV0IGZpbGUgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuICAoQWN0dWFsbHksIG1heWJlCi0gICAgIHRoaXMgaXMgYSBqb2IgZm9yIEJGRC4gIEJ1dCB0aGUgVk1BcyBjb21wdXRlZCB3b3VsZCBiZSBvdXQgb2YKLSAgICAgd2hhY2sgaWYgd2UgY29tcHV0ZWQgdGhlbSBnaXZlbiBvdXIgaW5pdGlhbCwgcmFuZG9tIG9yZGVyaW5nLgotICAgICBJdCdzIHBvc3NpYmxlIHRoYXQgdGhhdCB3b3VsZG4ndCBicmVhayB0aGluZ3M7IEkgY291bGQgZG8gc29tZQotICAgICBleHBlcmltZW50aW5nIHNvbWV0aW1lIGFuZCBmaW5kIG91dC4KLQotICAgICBUaGlzIG91dHB1dCBvcmRlcmluZyBvZiBzZWN0aW9ucyBpcyBtYWdpYywgb24gdGhlIEFscGhhLCBhdAotICAgICBsZWFzdC4gIFRoZSAubGl0YSBzZWN0aW9uIG11c3QgY29tZSBiZWZvcmUgLmxpdDggYW5kIC5saXQ0LAotICAgICBvdGhlcndpc2UgdGhlIE9TRi8xIGxpbmtlciBtYXkgc2lsZW50bHkgdHJhc2ggdGhlIC5saXR7NCw4fQotICAgICBzZWN0aW9uIGNvbnRlbnRzLiAgQWxzbywgLnRleHQgbXVzdCBwcmVjZWVkIC5yZGF0YS4gIFRoZXNlIGRpZmZlcgotICAgICBmcm9tIHRoZSBvcmRlciBkZXNjcmliZWQgaW4gc29tZSBwYXJ0cyBvZiB0aGUgREVDIE9TRi8xIEFzc2VtYmx5Ci0gICAgIExhbmd1YWdlIFByb2dyYW1tZXIncyBHdWlkZSwgYnV0IHRoYXQgb3JkZXIgZG9lc24ndCBzZWVtIHRvIHdvcmsKLSAgICAgd2l0aCB0aGVpciBsaW5rZXIuCi0KLSAgICAgSSBkb24ndCBrbm93IGlmIHNlY3Rpb24gb3JkZXJpbmcgb24gdGhlIE1JUFMgaXMgaW1wb3J0YW50LiAgKi8KLQotICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbmFtZXNbXSA9IHsKLSAgICAvKiB0ZXh0IHNlZ21lbnQgKi8KLSAgICAiLnRleHQiLCAiLnJkYXRhIiwgIi5pbml0IiwgIi5maW5pIiwKLSAgICAvKiBkYXRhIHNlZ21lbnQgKi8KLSAgICAiLmRhdGEiLCAiLmxpdGEiLCAiLmxpdDgiLCAiLmxpdDQiLCAiLnNkYXRhIiwgIi5nb3QiLAotICAgIC8qIGJzcyBzZWdtZW50ICovCi0gICAgIi5zYnNzIiwgIi5ic3MiLAotICB9OwotI2RlZmluZSBuX25hbWVzIChzaXplb2YgKG5hbWVzKSAvIHNpemVvZiAobmFtZXNbMF0pKQotCi0gIGFkZHIgPSAwOwotICB7Ci0gICAgLyogU2VjdGlvbnMgdGhhdCBtYXRjaCBuYW1lcywgb3JkZXIgdG8gYmUgc3RyYWlnaHRlbmVkIG91dCBsYXRlci4gICovCi0gICAgYXNlY3Rpb24gKnNlY3Nbbl9uYW1lc107Ci0gICAgLyogTGlua2VkIGxpc3Qgb2Ygc2VjdGlvbnMgd2l0aCBub24tbWF0Y2hpbmcgbmFtZXMuICBSYW5kb20gb3JkZXJpbmcuICAqLwotICAgIGFzZWN0aW9uICpvdGhlcl9zZWN0aW9ucyA9IDA7Ci0gICAgLyogUG9pbnRlciB0byBuZXh0IHNlY3Rpb24sIHNpbmNlIHdlJ3JlIGRlc3Ryb3lpbmcgdGhlIG9yaWdpbmFsCi0gICAgICAgb3JkZXJpbmcuICAqLwotICAgIGFzZWN0aW9uICpuZXh0OwotCi0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbl9uYW1lczsgaSsrKQotICAgICAgc2Vjc1tpXSA9IDA7Ci0gICAgZm9yIChzZWMgPSBzdGRvdXRwdXQtPnNlY3Rpb25zOyBzZWMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHNlYyA9IG5leHQpCi0gICAgICB7Ci0JbmV4dCA9IHNlYy0+bmV4dDsKLQlmb3IgKGkgPSAwOyBpIDwgbl9uYW1lczsgaSsrKQotCSAgaWYgKCFzdHJjbXAgKHNlYy0+bmFtZSwgbmFtZXNbaV0pKQotCSAgICB7Ci0JICAgICAgc2Vjc1tpXSA9IHNlYzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCWlmIChpID09IG5fbmFtZXMpCi0JICB7Ci0JICAgIGJmZF9zZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwgc2VjLCBhZGRyKTsKLQkgICAgYWRkciArPSBiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIHNlYyk7Ci0JICAgIHNlYy0+bmV4dCA9IG90aGVyX3NlY3Rpb25zOwotCSAgICBvdGhlcl9zZWN0aW9ucyA9IHNlYzsKLQkgIH0KLSAgICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbl9uYW1lczsgaSsrKQotICAgICAgaWYgKHNlY3NbaV0pCi0JewotCSAgc2VjID0gc2Vjc1tpXTsKLQkgIGJmZF9zZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwgc2VjLCBhZGRyKTsKLQkgIGFkZHIgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBzZWMpOwotCX0KLSAgICBmb3IgKGkgPSBuX25hbWVzIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICBpZiAoc2Vjc1tpXSkKLQl7Ci0JICBzZWMgPSBzZWNzW2ldOwotCSAgc2VjLT5uZXh0ID0gb3RoZXJfc2VjdGlvbnM7Ci0JICBvdGhlcl9zZWN0aW9ucyA9IHNlYzsKLQl9Ci0gICAgc3Rkb3V0cHV0LT5zZWN0aW9ucyA9IG90aGVyX3NlY3Rpb25zOwotICB9Ci0KLSAgLyogQnVpbGQgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGFzc2VydCAoZWNvZmZfZGF0YSAoc3Rkb3V0cHV0KSAhPSAwKTsKLSAgaGRyID0gJmVjb2ZmX2RhdGEgKHN0ZG91dHB1dCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyOwotICBlY29mZl9idWlsZF9kZWJ1ZyAoaGRyLCAmYnVmLCBkZWJ1Z19zd2FwKTsKLQotICAvKiBGaW5pc2ggdXAgdGhlIGVjb2ZmX3RkYXRhIHN0cnVjdHVyZS4gICovCi0gIHNldCA9IGJ1ZjsKLSNkZWZpbmUgU0VUKHB0ciwgY291bnQsIHR5cGUsIHNpemUpIFwKLSAgaWYgKGhkci0+Y291bnQgPT0gMCkgXAotICAgIGVjb2ZmX2RhdGEgKHN0ZG91dHB1dCktPmRlYnVnX2luZm8ucHRyID0gKHR5cGUpIE5VTEw7IFwKLSAgZWxzZSBcCi0gICAgeyBcCi0gICAgICBlY29mZl9kYXRhIChzdGRvdXRwdXQpLT5kZWJ1Z19pbmZvLnB0ciA9ICh0eXBlKSBzZXQ7IFwKLSAgICAgIHNldCArPSBoZHItPmNvdW50ICogc2l6ZTsgXAotICAgIH0KLQotICBTRVQgKGxpbmUsIGNiTGluZSwgdW5zaWduZWQgY2hhciAqLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKLSAgU0VUIChleHRlcm5hbF9kbnIsIGlkbk1heCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSk7Ci0gIFNFVCAoZXh0ZXJuYWxfcGRyLCBpcGRNYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUpOwotICBTRVQgKGV4dGVybmFsX3N5bSwgaXN5bU1heCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7Ci0gIFNFVCAoZXh0ZXJuYWxfb3B0LCBpb3B0TWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX29wdF9zaXplKTsKLSAgU0VUIChleHRlcm5hbF9hdXgsIGlhdXhNYXgsIHVuaW9uIGF1eF9leHQgKiwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSk7Ci0gIFNFVCAoc3MsIGlzc01heCwgY2hhciAqLCBzaXplb2YgKGNoYXIpKTsKLSAgU0VUIChzc2V4dCwgaXNzRXh0TWF4LCBjaGFyICosIHNpemVvZiAoY2hhcikpOwotICBTRVQgKGV4dGVybmFsX3JmZCwgY3JmZCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSk7Ci0gIFNFVCAoZXh0ZXJuYWxfZmRyLCBpZmRNYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUpOwotICBTRVQgKGV4dGVybmFsX2V4dCwgaWV4dE1heCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSk7Ci0KLSN1bmRlZiBTRVQKLQotICAvKiBGaWxsIGluIHRoZSByZWdpc3RlciBtYXNrcy4gICovCi0gIHsKLSAgICB1bnNpZ25lZCBsb25nIGdwcm1hc2sgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgZnBybWFzayA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyAqY3BybWFzayA9IE5VTEw7Ci0KLSNpZmRlZiBUQ19NSVBTCi0gICAgLyogRmlsbCBpbiB0aGUgTUlQUyByZWdpc3RlciBtYXNrcy4gIEl0J3MgcHJvYmFibHkgbm90IHdvcnRoCi0gICAgICAgc2V0dGluZyB1cCBhIGdlbmVyaWMgaW50ZXJmYWNlIGZvciB0aGlzLiAgKi8KLSAgICBncHJtYXNrID0gbWlwc19ncHJtYXNrOwotICAgIGNwcm1hc2sgPSBtaXBzX2Nwcm1hc2s7Ci0jZW5kaWYKLQotI2lmZGVmIFRDX0FMUEhBCi0gICAgYWxwaGFfZnJvYl9lY29mZl9kYXRhICgpOwotCi0gICAgaWYgKCEgYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSAoc3Rkb3V0cHV0LCBhbHBoYV9ncF92YWx1ZSkpCi0gICAgICBhc19mYXRhbCAoXygiQ2FuJ3Qgc2V0IEdQIHZhbHVlIikpOwotCi0gICAgZ3BybWFzayA9IGFscGhhX2dwcm1hc2s7Ci0gICAgZnBybWFzayA9IGFscGhhX2Zwcm1hc2s7Ci0jZW5kaWYKLQotICAgIGlmICghIGJmZF9lY29mZl9zZXRfcmVnbWFza3MgKHN0ZG91dHB1dCwgZ3BybWFzaywgZnBybWFzaywgY3BybWFzaykpCi0gICAgICBhc19mYXRhbCAoXygiQ2FuJ3Qgc2V0IHJlZ2lzdGVyIG1hc2tzIikpOwotICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBFQ09GRiBjb2RlIHRvIHNldCB0aGUgZXh0ZXJuYWwgaW5mb3JtYXRpb24KLSAgIGZvciBhIHN5bWJvbC4gIFdlIGp1c3QgcGFzcyBpdCBvbiB0byBCRkQsIHdoaWNoIGV4cGVjdHMgdGhlIHN3YXBwZWQKLSAgIGluZm9ybWF0aW9uIHRvIGJlIHN0b3JlZCBpbiB0aGUgbmF0aXZlIGZpZWxkIG9mIHRoZSBzeW1ib2wuICAqLwotCi12b2lkCi1vYmpfZWNvZmZfc2V0X2V4dCAoc3ltLCBleHQpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgRVhUUiAqZXh0OwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXAKLSAgICA9ICZlY29mZl9iYWNrZW5kIChzdGRvdXRwdXQpLT5kZWJ1Z19zd2FwOwotICBlY29mZl9zeW1ib2xfdHlwZSAqZXN5bTsKLQotICBrbm93IChiZmRfYXN5bWJvbF9mbGF2b3VyIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSkKLQk9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpOwotICBlc3ltID0gZWNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKTsKLSAgZXN5bS0+bG9jYWwgPSBmYWxzZTsKLSAgZXN5bS0+bmF0aXZlID0geG1hbGxvYyAoZGVidWdfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpOwotICAoKmRlYnVnX3N3YXAtPnN3YXBfZXh0X291dCkgKHN0ZG91dHB1dCwgZXh0LCBlc3ltLT5uYXRpdmUpOwotfQotCi1zdGF0aWMgaW50Ci1lY29mZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyAoc2VjKQotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9lY29mZl9mcm9iX3N5bWJvbCAoc3ltLCBwdW50cCkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBpbnQgKnB1bnRwOwotewotICBlY29mZl9mcm9iX3N5bWJvbCAoc3ltKTsKLX0KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3BvcF9pbnNlcnQgKCkKLXsKLSAgcG9wX2luc2VydCAob2JqX3BzZXVkb190YWJsZSk7Ci19Ci0KLWNvbnN0IHN0cnVjdCBmb3JtYXRfb3BzIGVjb2ZmX2Zvcm1hdF9vcHMgPQotewotICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCi0gIDAsCi0gIDEsCi0gIG9ial9lY29mZl9mcm9iX3N5bWJvbCwKLSAgZWNvZmZfZnJvYl9maWxlLAotICAwLAotICAwLCAwLAotICAwLCAwLAotICAwLAotICBlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vLAotICBlY29mZl9zdGFiLAotICBlY29mZl9zZWNfc3ltX29rX2Zvcl9yZWxvYywKLSAgZWNvZmZfcG9wX2luc2VydCwKLSAgZWNvZmZfc2V0X2V4dCwKLSAgZWNvZmZfcmVhZF9iZWdpbl9ob29rLAotICBlY29mZl9zeW1ib2xfbmV3X2hvb2ssCi19OwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZWNvZmYuaCBiL2dhcy9jb25maWcvb2JqLWVjb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiY2EyNTQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZWNvZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qIEVDT0ZGIG9iamVjdCBmaWxlIGZvcm1hdCBoZWFkZXIgZmlsZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgT0JKX0VDT0ZGIDEKLQotLyogVXNlIHRoZSBnZW5lcmljIEVDT0ZGIGRlYnVnZ2luZyBjb2RlLiAgKi8KLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIDEKLQotI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2luY2x1ZGUgImVjb2ZmLmgiCi0KLS8qIEZvciBlYWNoIGdhcyBzeW1ib2wgd2Uga2VlcCB0cmFjayBvZiB3aGljaCBmaWxlIGl0IGNhbWUgZnJvbSwgb2YKLSAgIHdoZXRoZXIgd2UgaGF2ZSBnZW5lcmF0ZWQgYW4gRUNPRkYgc3ltYm9sIGZvciBpdCwgYW5kIHdoZXRoZXIgdGhlCi0gICBzeW1ib2xzIGlzIHVuZGVmaW5lZCAodGhpcyBsYXN0IGlzIG5lZWRlZCB0byBkaXN0aW5ndWlzaCBhIC5leHRlcm4KLSAgIHN5bWJvbHMgZnJvbSBhIC5jb21tIHN5bWJvbCkuICAqLwotCi1zdHJ1Y3QgZWNvZmZfc3lfb2JqCi17Ci0gIHN0cnVjdCBlZmRyICplY29mZl9maWxlOwotICBzdHJ1Y3QgbG9jYWxzeW0gKmVjb2ZmX3N5bWJvbDsKLSAgdmFsdWVUIGVjb2ZmX2V4dGVybl9zaXplOwotfTsKLQotI2RlZmluZSBPQkpfU1lNRklFTERfVFlQRSBzdHJ1Y3QgZWNvZmZfc3lfb2JqCi0KLS8qIE1vZGlmeSB0aGUgRUNPRkYgc3ltYm9sLiAgKi8KLSNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKHN5bXAsIHB1bnQpIGVjb2ZmX2Zyb2Jfc3ltYm9sIChzeW1wKQotCi0vKiBUaGlzIGlzIHVzZWQgdG8gd3JpdGUgdGhlIHN5bWJvbGljIGRhdGEgaW4gdGhlIGZvcm1hdCB0aGF0IEJGRAotICAgZXhwZWN0cyBpdC4gICovCi1leHRlcm4gdm9pZCBlY29mZl9mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBvYmpfZnJvYl9maWxlKCkgZWNvZmZfZnJvYl9maWxlICgpCi0KLS8qIFdlIHVzZSB0aGUgRUNPRkYgZnVuY3Rpb25zIGFzIG91ciBob29rcy4gICovCi0jZGVmaW5lIG9ial9yZWFkX2JlZ2luX2hvb2sgZWNvZmZfcmVhZF9iZWdpbl9ob29rCi0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2sgZWNvZmZfc3ltYm9sX25ld19ob29rCi0KLS8qIFJlY29yZCBmaWxlIHN3aXRjaGVzIGluIHRoZSBFQ09GRiBzeW1ib2wgdGFibGUuICAqLwotI2RlZmluZSBvYmpfYXBwX2ZpbGUobmFtZSkgZWNvZmZfbmV3X2ZpbGUgKG5hbWUpCi0KLS8qIEF0IHRoZSBtb21lbnQgd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnkgc3RhYnMgcHJvY2Vzc2luZyBpbiByZWFkLmMuICAqLwotI2RlZmluZSBPQkpfUFJPQ0VTU19TVEFCKHNlZywgd2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYykgXAotICBlY29mZl9zdGFiICgoc2VnKSwgKHdoYXQpLCAoc3RyaW5nKSwgKHR5cGUpLCAob3RoZXIpLCAoZGVzYykpCi0KLSNkZWZpbmUgRU1JVF9TRUNUSU9OX1NZTUJPTFMJCTAKLSNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKFNFQykJMQotCi0jZGVmaW5lIG9ial9lY29mZl9zZXRfZXh0IGVjb2ZmX3NldF9leHQKLWV4dGVybiB2b2lkIG9ial9lY29mZl9zZXRfZXh0IFBBUkFNUyAoKHN5bWJvbFMgKiwgRVhUUiAqKSk7CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1lbGYuYyBiL2dhcy9jb25maWcvb2JqLWVsZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQwMmViLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWVsZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg1NiArMCwwIEBACi0vKiBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgT0JKX0hFQURFUiAib2JqLWVsZi5oIgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotI2lmbmRlZiBFQ09GRl9ERUJVR0dJTkcKLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIDAKLSNlbHNlCi0jZGVmaW5lIE5FRURfRUNPRkZfREVCVUcKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotI2luY2x1ZGUgImVjb2ZmLmgiCi0jZW5kaWYKLQotI2lmZGVmIFRDX0FMUEhBCi0jaW5jbHVkZSAiZWxmL2FscGhhLmgiCi0jZW5kaWYKLQotI2lmZGVmIFRDX01JUFMKLSNpbmNsdWRlICJlbGYvbWlwcy5oIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19QUEMKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0jZW5kaWYKLQotc3RhdGljIGJmZF92bWEgZWxmX3NfZ2V0X3NpemUgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc19zZXRfc2l6ZSBQQVJBTVMgKChzeW1ib2xTICosIGJmZF92bWEpKTsKLXN0YXRpYyBiZmRfdm1hIGVsZl9zX2dldF9hbGlnbiBQQVJBTVMgKChzeW1ib2xTICopKTsKLXN0YXRpYyB2b2lkIGVsZl9zX3NldF9hbGlnbiBQQVJBTVMgKChzeW1ib2xTICosIGJmZF92bWEpKTsKLXN0YXRpYyB2b2lkIGVsZl9jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7Ci1zdGF0aWMgaW50IGVsZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBhZGp1c3Rfc3RhYl9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi1zdGF0aWMgYm9vbGVhbiBlbGZfZ2V0X2V4dHIgUEFSQU1TICgoYXN5bWJvbCAqLCBFWFRSICopKTsKLXN0YXRpYyB2b2lkIGVsZl9zZXRfaW5kZXggUEFSQU1TICgoYXN5bWJvbCAqLCBiZmRfc2l6ZV90eXBlKSk7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgb2JqX2VsZl9saW5lIFBBUkFNUyAoKGludCkpOwotdm9pZCBvYmpfZWxmX3ZlcnNpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX3NpemUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX3R5cGUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX2lkZW50IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl93ZWFrIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9sb2NhbCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfc3ltdmVyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl92dGFibGVfaW5oZXJpdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfdnRhYmxlX2VudHJ5IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9zdWJzZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9wb3BzZWN0aW9uIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIGVsZl9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiY29tbSIsIG9ial9lbGZfY29tbW9uLCAwfSwKLSAgeyJjb21tb24iLCBvYmpfZWxmX2NvbW1vbiwgMX0sCi0gIHsiaWRlbnQiLCBvYmpfZWxmX2lkZW50LCAwfSwKLSAgeyJsb2NhbCIsIG9ial9lbGZfbG9jYWwsIDB9LAotICB7InByZXZpb3VzIiwgb2JqX2VsZl9wcmV2aW91cywgMH0sCi0gIHsic2VjdGlvbiIsIG9ial9lbGZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdGlvbi5zIiwgb2JqX2VsZl9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0Iiwgb2JqX2VsZl9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0LnMiLCBvYmpfZWxmX3NlY3Rpb24sIDB9LAotICB7InB1c2hzZWN0aW9uIiwgb2JqX2VsZl9zZWN0aW9uLCAxfSwKLSAgeyJwb3BzZWN0aW9uIiwgb2JqX2VsZl9wb3BzZWN0aW9uLCAwfSwKLSAgeyJzaXplIiwgb2JqX2VsZl9zaXplLCAwfSwKLSAgeyJ0eXBlIiwgb2JqX2VsZl90eXBlLCAwfSwKLSAgeyJ2ZXJzaW9uIiwgb2JqX2VsZl92ZXJzaW9uLCAwfSwKLSAgeyJ3ZWFrIiwgb2JqX2VsZl93ZWFrLCAwfSwKLQotICAvKiBUaGVzZSBhcmUgdXNlZCBmb3Igc3RhYnMtaW4tZWxmIGNvbmZpZ3VyYXRpb25zLiAgKi8KLSAgeyJsaW5lIiwgb2JqX2VsZl9saW5lLCAwfSwKLQotICAvKiBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbiB0byBoYW5kbGUgc3ltYm9sIHZlcnNpb25zLiAgKi8KLSAgeyJzeW12ZXIiLCBvYmpfZWxmX3N5bXZlciwgMH0sCi0KLSAgLyogQSBHTlUgZXh0ZW5zaW9uIHRvIGNoYW5nZSBzdWJzZWN0aW9uIG9ubHkuICAqLwotICB7InN1YnNlY3Rpb24iLCBvYmpfZWxmX3N1YnNlY3Rpb24sIDB9LAotCi0gIC8qIFRoZXNlIGFyZSBHTlUgZXh0ZW5zaW9ucyB0byBhaWQgaW4gZ2FyYmFnZSBjb2xsZWN0aW5nIEMrKyB2dGFibGVzLiAgKi8KLSAgeyJ2dGFibGVfaW5oZXJpdCIsIG9ial9lbGZfdnRhYmxlX2luaGVyaXQsIDB9LAotICB7InZ0YWJsZV9lbnRyeSIsIG9ial9lbGZfdnRhYmxlX2VudHJ5LCAwfSwKLQotICAvKiBUaGVzZSBhcmUgdXNlZCBmb3IgZHdhcmYuICovCi0gIHsiMmJ5dGUiLCBjb25zLCAyfSwKLSAgeyI0Ynl0ZSIsIGNvbnMsIDR9LAotICB7IjhieXRlIiwgY29ucywgOH0sCi0KLSAgLyogV2UgbmVlZCB0byB0cmFwIHRoZSBzZWN0aW9uIGNoYW5naW5nIGNhbGxzIHRvIGhhbmRsZSAucHJldmlvdXMuICAqLwotICB7ImRhdGEiLCBvYmpfZWxmX2RhdGEsIDB9LAotICB7InRleHQiLCBvYmpfZWxmX3RleHQsIDB9LAotCi0gIC8qIEVuZCBzZW50aW5lbC4gICovCi0gIHtOVUxMLCBOVUxMLCAwfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBwc2V1ZG9fdHlwZVMgZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlW10gPQotewotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgLyogQ09GRiBzdHlsZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIEVDT0ZGLiAubG4gaXMgbm90IHVzZWQ7IC5sb2MKLSAgICAgaXMgdXNlZCBpbnN0ZWFkLiAgKi8KLSAgeyAiZGVmIiwJZWNvZmZfZGlyZWN0aXZlX2RlZiwJMCB9LAotICB7ICJkaW0iLAllY29mZl9kaXJlY3RpdmVfZGltLAkwIH0sCi0gIHsgImVuZGVmIiwJZWNvZmZfZGlyZWN0aXZlX2VuZGVmLAkwIH0sCi0gIHsgImZpbGUiLAllY29mZl9kaXJlY3RpdmVfZmlsZSwJMCB9LAotICB7ICJzY2wiLAllY29mZl9kaXJlY3RpdmVfc2NsLAkwIH0sCi0gIHsgInRhZyIsCWVjb2ZmX2RpcmVjdGl2ZV90YWcsCTAgfSwKLSAgeyAidmFsIiwJZWNvZmZfZGlyZWN0aXZlX3ZhbCwJMCB9LAotCi0gIC8qIENPRkYgZGVidWdnaW5nIHJlcXVpcmVzIHBzZXVkby1vcHMgLnNpemUgYW5kIC50eXBlLCBidXQgRUxGCi0gICAgIGFscmVhZHkgaGFzIG1lYW5pbmdzIGZvciB0aG9zZS4gIFdlIHVzZSAuZXNpemUgYW5kIC5ldHlwZQotICAgICBpbnN0ZWFkLiAgVGhlc2UgYXJlIG9ubHkgZ2VuZXJhdGVkIGJ5IGdjYyBhbnlob3cuICAqLwotICB7ICJlc2l6ZSIsCWVjb2ZmX2RpcmVjdGl2ZV9zaXplLAkwIH0sCi0gIHsgImV0eXBlIiwJZWNvZmZfZGlyZWN0aXZlX3R5cGUsCTAgfSwKLQotICAvKiBFQ09GRiBzcGVjaWZpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICB7ICJiZWdpbiIsCWVjb2ZmX2RpcmVjdGl2ZV9iZWdpbiwJMCB9LAotICB7ICJiZW5kIiwJZWNvZmZfZGlyZWN0aXZlX2JlbmQsCTAgfSwKLSAgeyAiZW5kIiwJZWNvZmZfZGlyZWN0aXZlX2VuZCwJMCB9LAotICB7ICJlbnQiLAllY29mZl9kaXJlY3RpdmVfZW50LAkwIH0sCi0gIHsgImZtYXNrIiwJZWNvZmZfZGlyZWN0aXZlX2ZtYXNrLAkwIH0sCi0gIHsgImZyYW1lIiwJZWNvZmZfZGlyZWN0aXZlX2ZyYW1lLAkwIH0sCi0gIHsgImxvYyIsCWVjb2ZmX2RpcmVjdGl2ZV9sb2MsCTAgfSwKLSAgeyAibWFzayIsCWVjb2ZmX2RpcmVjdGl2ZV9tYXNrLAkwIH0sCi0KLSAgLyogT3RoZXIgRUNPRkYgZGlyZWN0aXZlcy4gICovCi0gIHsgImV4dGVybiIsCWVjb2ZmX2RpcmVjdGl2ZV9leHRlcm4sCTAgfSwKLQotICAvKiBUaGVzZSBhcmUgdXNlZCBvbiBJcml4LiAgSSBkb24ndCBrbm93IGhvdyB0byBpbXBsZW1lbnQgdGhlbS4gICovCi0gIHsgImFsaWFzIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgImJnbmIiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAiZW5kYiIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJsYWIiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAibm9hbGlhcyIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJ2ZXJzdGFtcCIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJ2cmVnIiwJc19pZ25vcmUsCQkwIH0sCi0jZW5kaWYKLQotICB7TlVMTCwgTlVMTCwgMH0JCQkvKiBlbmQgc2VudGluZWwgKi8KLX07Ci0KLSN1bmRlZiBOT19SRUxPQwotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFzc2VtYmxlciBzdGFydHMuICAqLwotCi12b2lkCi1lbGZfYmVnaW4gKCkKLXsKLSAgLyogQWRkIHN5bWJvbHMgZm9yIHRoZSBrbm93biBzZWN0aW9ucyB0byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc2VjdGlvbl9zeW1ib2wgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsCi0JCQkJCQkJCVRFWFRfU0VDVElPTl9OQU1FKSkpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzZWN0aW9uX3N5bWJvbCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwKLQkJCQkJCQkJREFUQV9TRUNUSU9OX05BTUUpKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHNlY3Rpb25fc3ltYm9sIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LAotCQkJCQkJCQlCU1NfU0VDVElPTl9OQU1FKSkpOwotfQotCi12b2lkCi1lbGZfcG9wX2luc2VydCAoKQotewotICBwb3BfaW5zZXJ0IChlbGZfcHNldWRvX3RhYmxlKTsKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBwb3BfaW5zZXJ0IChlY29mZl9kZWJ1Z19wc2V1ZG9fdGFibGUpOwotfQotCi1zdGF0aWMgYmZkX3ZtYQotZWxmX3NfZ2V0X3NpemUgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICByZXR1cm4gU19HRVRfU0laRSAoc3ltKTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9zX3NldF9zaXplIChzeW0sIHN6KQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGJmZF92bWEgc3o7Ci17Ci0gIFNfU0VUX1NJWkUgKHN5bSwgc3opOwotfQotCi1zdGF0aWMgYmZkX3ZtYQotZWxmX3NfZ2V0X2FsaWduIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgcmV0dXJuIFNfR0VUX0FMSUdOIChzeW0pOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX3Nfc2V0X2FsaWduIChzeW0sIGFsaWduKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGJmZF92bWEgYWxpZ247Ci17Ci0gIFNfU0VUX0FMSUdOIChzeW0sIGFsaWduKTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIChkZXN0LCBzcmMpCi0gICAgIHN5bWJvbFMgKmRlc3QsICpzcmM7Ci17Ci0gIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTIChkZXN0LCBzcmMpOwotfQotCi1zdGF0aWMgaW50Ci1lbGZfc2VjX3N5bV9va19mb3JfcmVsb2MgKHNlYykKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmV0dXJuIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyAoc2VjKTsKLX0KLQotdm9pZAotZWxmX2ZpbGVfc3ltYm9sIChzKQotICAgICBjaGFyICpzOwotewotICBzeW1ib2xTICpzeW07Ci0KLSAgc3ltID0gc3ltYm9sX25ldyAocywgYWJzb2x1dGVfc2VjdGlvbiwgKHZhbHVlVCkgMCwgKHN0cnVjdCBmcmFnICopIDApOwotICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9GSUxFOwotCi0gIGlmIChzeW1ib2xfcm9vdFAgIT0gc3ltKQotICAgIHsKLSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfaW5zZXJ0IChzeW0sIHN5bWJvbF9yb290UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0jaWZkZWYgREVCVUcKLSAgICAgIHZlcmlmeV9zeW1ib2xfY2hhaW4gKHN5bWJvbF9yb290UCwgc3ltYm9sX2xhc3RQKTsKLSNlbmRpZgotICAgIH0KLQotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgZWNvZmZfbmV3X2ZpbGUgKHMpOwotI2VuZGlmCi19Ci0KLXZvaWQKLW9ial9lbGZfY29tbW9uIChpc19jb21tb24pCi0gICAgIGludCBpc19jb21tb247Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqcDsKLSAgaW50IHRlbXAsIHNpemU7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCBoYXZlX2FsaWduOwotCi0gIGlmIChmbGFnX21yaSAmJiBpc19jb21tb24pCi0gICAgewotICAgICAgc19tcmlfY29tbW9uICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5DT01Nb24gbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBzaXplID0gdGVtcDsKLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgc2l6ZSkKLQl7Ci0JICBhc193YXJuIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlZC4iKSwKLQkJICAgU19HRVRfTkFNRSAoc3ltYm9sUCksIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksIHNpemUpOwotCX0KLSAgICB9Ci0gIGtub3cgKHN5bWJvbFAtPnN5X2ZyYWcgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIGhhdmVfYWxpZ24gPSAwOwotICBlbHNlCi0gICAgewotICAgICAgaGF2ZV9hbGlnbiA9IDE7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIGlmICghIGhhdmVfYWxpZ24gfHwgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0gICAgewotICAgICAgaWYgKCEgaGF2ZV9hbGlnbikKLQl0ZW1wID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICBpZiAodGVtcCA8IDApCi0JICAgIHsKLQkgICAgICB0ZW1wID0gMDsKLQkgICAgICBhc193YXJuIChfKCJDb21tb24gYWxpZ25tZW50IG5lZ2F0aXZlOyAwIGFzc3VtZWQiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3ltYm9sX2dldF9vYmogKHN5bWJvbFApLT5sb2NhbCkKLQl7Ci0JICBzZWdUIG9sZF9zZWM7Ci0JICBpbnQgb2xkX3N1YnNlYzsKLQkgIGNoYXIgKnBmcmFnOwotCSAgaW50IGFsaWduOwotCi0JLyogYWxsb2NhdGVfYnNzOiAqLwotCSAgb2xkX3NlYyA9IG5vd19zZWc7Ci0JICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLQkgIGlmICh0ZW1wKQotCSAgICB7Ci0JICAgICAgLyogY29udmVydCB0byBhIHBvd2VyIG9mIDIgYWxpZ25tZW50ICovCi0JICAgICAgZm9yIChhbGlnbiA9IDA7ICh0ZW1wICYgMSkgPT0gMDsgdGVtcCA+Pj0gMSwgKythbGlnbik7Ci0JICAgICAgaWYgKHRlbXAgIT0gMSkKLQkJewotCQkgIGFzX2JhZCAoXygiQ29tbW9uIGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOwotCQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgYWxpZ24gPSAwOwotCSAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIGFsaWduKTsKLQkgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKLQkgIGlmIChhbGlnbikKLQkgICAgZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOwotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQotCSAgICBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSAwOwotCSAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0JICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsCi0JCQkgICAgKG9mZnNldFQpIHNpemUsIChjaGFyICopIDApOwotCSAgKnBmcmFnID0gMDsKLQkgIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHNpemUpOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYnNzX3NlY3Rpb24pOwotCSAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBzdWJzZWdfc2V0IChvbGRfc2VjLCBvbGRfc3Vic2VjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCWFsbG9jYXRlX2NvbW1vbjoKLQkgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBzaXplKTsKLQkgIFNfU0VUX0FMSUdOIChzeW1ib2xQLCB0ZW1wKTsKLQkgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJmZF9jb21fc2VjdGlvbl9wdHIpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIC8qIEBAIFNvbWUgdXNlIHRoZSBkb3QsIHNvbWUgZG9uJ3QuICBDYW4gd2UgZ2V0IHNvbWUgY29uc2lzdGVuY3k/PyAgKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcuJykKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIC8qIEBAIFNvbWUgc2F5IGRhdGEsIHNvbWUgc2F5IGJzcy4gICovCi0gICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiYnNzXCIiLCA0KQotCSAgJiYgc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZGF0YVwiIiwgNSkpCi0JewotCSAgd2hpbGUgKCotLWlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0JICAgIDsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCSAgZ290byBiYWRfY29tbW9uX3NlZ21lbnQ7Ci0JfQotICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnIicpCi0JOwotICAgICAgZ290byBhbGxvY2F0ZV9jb21tb247Ci0gICAgfQotCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICByZXR1cm47Ci0KLSAgewotICBiYWRfY29tbW9uX3NlZ21lbnQ6Ci0gICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB3aGlsZSAoKnAgJiYgKnAgIT0gJ1xuJykKLSAgICAgIHArKzsKLSAgICBjID0gKnA7Ci0gICAgKnAgPSAnXDAnOwotICAgIGFzX2JhZCAoXygiYmFkIC5jb21tb24gc2VnbWVudCAlcyIpLCBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKTsKLSAgICAqcCA9IGM7Ci0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLSAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIHJldHVybjsKLSAgfQotfQotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl9sb2NhbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGRvCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCktPmxvY2FsID0gMTsKLSAgICAgIGlmIChjID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3dlYWsgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotICAgICAgc3ltYm9sX2dldF9vYmogKHN5bWJvbFApLT5sb2NhbCA9IDE7Ci0gICAgICBpZiAoYyA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCSAgICBjID0gJ1xuJzsKLQl9Ci0gICAgfQotICB3aGlsZSAoYyA9PSAnLCcpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgc2VnVCBwcmV2aW91c19zZWN0aW9uOwotc3RhdGljIGludCBwcmV2aW91c19zdWJzZWN0aW9uOwotCi1zdHJ1Y3Qgc2VjdGlvbl9zdGFjawotewotICBzdHJ1Y3Qgc2VjdGlvbl9zdGFjayAqbmV4dDsKLSAgc2VnVCBzZWcsIHByZXZfc2VnOwotICBpbnQgc3Vic2VnLCBwcmV2X3N1YnNlZzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9zdGFjayAqc2VjdGlvbl9zdGFjazsKLQotCi0vKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgY29kZSBzdXBwb3J0cyB0d28gZGlmZmVyZW50Ci0gICBzeW50YXhlcy4KLQotICAgVGhlIGZpcnN0IGlzIGZvdW5kIG9uIFNvbGFyaXMsIGFuZCBsb29rcyBsaWtlCi0gICAgICAgLnNlY3Rpb24gIi5zZWMxIiwjYWxsb2MsI2V4ZWNpbnN0ciwjd3JpdGUKLSAgIEhlcmUgdGhlIG5hbWVzIGFmdGVyICcjJyBhcmUgdGhlIFNIRl8qIGZsYWdzIHRvIHR1cm4gb24gZm9yIHRoZQotICAgc2VjdGlvbi4gIEknbSBub3Qgc3VyZSBob3cgaXQgZGV0ZXJtaW5lcyB0aGUgU0hUXyogdHlwZSAoQkZECi0gICBkb2Vzbid0IHJlYWxseSBnaXZlIHVzIGNvbnRyb2wgb3ZlciB0aGUgdHlwZSwgYW55aG93KS4KLQotICAgVGhlIHNlY29uZCBmb3JtYXQgaXMgZm91bmQgb24gVW5peFdhcmUsIGFuZCBwcm9iYWJseSBtb3N0IFNWUjQKLSAgIG1hY2hpbmVzLCBhbmQgbG9va3MgbGlrZQotICAgICAgIC5zZWN0aW9uIC5zZWMxLCJhIixAcHJvZ2JpdHMKLSAgIFRoZSBxdW90ZWQgc3RyaW5nIG1heSBjb250YWluIGFueSBjb21iaW5hdGlvbiBvZiBhLCB3LCB4LCBhbmQKLSAgIHJlcHJlc2VudHMgdGhlIFNIRl8qIGZsYWdzIHRvIHR1cm4gb24gZm9yIHRoZSBzZWN0aW9uLiAgVGhlIHN0cmluZwotICAgYmVnaW5uaW5nIHdpdGggJ0AnIGNhbiBiZSBwcm9nYml0cyBvciBub2JpdHMuICBUaGVyZSBzaG91bGQgYmUKLSAgIG90aGVyIHBvc3NpYmlsaXRpZXMsIGJ1dCBJIGRvbid0IGtub3cgd2hhdCB0aGV5IGFyZS4gIEluIGFueSBjYXNlLAotICAgQkZEIGRvZXNuJ3QgcmVhbGx5IGxldCB1cyBzZXQgdGhlIHNlY3Rpb24gdHlwZS4gICovCi0KLS8qIENlcnRhaW4gbmFtZWQgc2VjdGlvbnMgaGF2ZSBwYXJ0aWN1bGFyIGRlZmluZWQgdHlwZXMsIGxpc3RlZCBvbiBwLgotICAgNC0xOSBvZiB0aGUgQUJJLiAgKi8KLXN0cnVjdCBzcGVjaWFsX3NlY3Rpb24KLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50IHR5cGU7Ci0gIGludCBhdHRyaWJ1dGVzOwotfTsKLQotc3RhdGljIHN0cnVjdCBzcGVjaWFsX3NlY3Rpb24gY29uc3Qgc3BlY2lhbF9zZWN0aW9uc1tdID0KLXsKLSAgeyAiLmJzcyIsCVNIVF9OT0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURQkJfSwKLSAgeyAiLmNvbW1lbnQiLAlTSFRfUFJPR0JJVFMsCTAJCQkJfSwKLSAgeyAiLmRhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURQkJfSwKLSAgeyAiLmRhdGExIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUJCX0sCi0gIHsgIi5kZWJ1ZyIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIuZmluaSIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotICB7ICIuaW5pdCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotICB7ICIubGluZSIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIubm90ZSIsCVNIVF9OT1RFLAkwCQkJCX0sCi0gIHsgIi5yb2RhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQwkJCX0sCi0gIHsgIi5yb2RhdGExIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MJCQl9LAotICB7ICIudGV4dCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotCi0jaWZkZWYgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMKLSAgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMKLSNlbmRpZgotCi0jaWYgMAotICAvKiBUaGUgZm9sbG93aW5nIHNlY3Rpb24gbmFtZXMgYXJlIHNwZWNpYWwsIGJ1dCB0aGV5IGNhbiBub3QKLSAgICAgcmVhc29uYWJseSBhcHBlYXIgaW4gYXNzZW1ibGVyIGNvZGUuICBTb21lIG9mIHRoZSBhdHRyaWJ1dGVzIGFyZQotICAgICBwcm9jZXNzb3IgZGVwZW5kZW50LiAgKi8KLSAgeyAiLmR5bmFtaWMiLAlTSFRfRFlOQU1JQywJU0hGX0FMTE9DIC8qICsgU0hGX1dSSVRFICovIAl9LAotICB7ICIuZHluc3RyIiwJU0hUX1NUUlRBQiwJU0hGX0FMTE9DCQkJfSwKLSAgeyAiLmR5bnN5bSIsCVNIVF9EWU5TWU0sCVNIRl9BTExPQwkJCX0sCi0gIHsgIi5nb3QiLAlTSFRfUFJPR0JJVFMsCTAJCQkJfSwKLSAgeyAiLmhhc2giLAlTSFRfSEFTSCwJU0hGX0FMTE9DCQkJfSwKLSAgeyAiLmludGVycCIsCVNIVF9QUk9HQklUUywJLyogU0hGX0FMTE9DICovCQkJfSwKLSAgeyAiLnBsdCIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIuc2hzdHJ0YWIiLFNIVF9TVFJUQUIsCTAJCQkJfSwKLSAgeyAiLnN0cnRhYiIsCVNIVF9TVFJUQUIsCS8qIFNIRl9BTExPQyAqLwkJCX0sCi0gIHsgIi5zeW10YWIiLAlTSFRfU1lNVEFCLAkvKiBTSEZfQUxMT0MgKi8JCQl9LAotI2VuZGlmCi0KLSAgeyBOVUxMLAkwLAkJMAkJCQl9Ci19OwotCi12b2lkCi1vYmpfZWxmX2NoYW5nZV9zZWN0aW9uIChuYW1lLCB0eXBlLCBhdHRyLCBwdXNoKQotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgdHlwZSwgYXR0ciwgcHVzaDsKLXsKLSAgaW50IG5ld19zZWM7Ci0gIHNlZ1Qgc2VjOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICAvKiBTd2l0Y2ggdG8gdGhlIHNlY3Rpb24sIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChwdXNoKQotICAgIHsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX3N0YWNrICplbHQ7Ci0gICAgICBlbHQgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzZWN0aW9uX3N0YWNrKSk7Ci0gICAgICBlbHQtPm5leHQgPSBzZWN0aW9uX3N0YWNrOwotICAgICAgZWx0LT5zZWcgPSBub3dfc2VnOwotICAgICAgZWx0LT5wcmV2X3NlZyA9IHByZXZpb3VzX3NlY3Rpb247Ci0gICAgICBlbHQtPnN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgICBlbHQtPnByZXZfc3Vic2VnID0gcHJldmlvdXNfc3Vic2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fc3RhY2sgPSBlbHQ7Ci0gICAgfQotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSAgbmV3X3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsIG5hbWUpID09IE5VTEw7Ci0gIHNlYyA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOwotCi0gIGlmIChuZXdfc2VjKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICAgc3ltYm9sUyAqc2Vjc3ltOwotICAgICAgaW50IGk7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGlzIG9uZSBvZiB0aGUgc3BlY2lhbCBzZWN0aW9ucy4gICovCi0gICAgICBmb3IgKGkgPSAwOyBzcGVjaWFsX3NlY3Rpb25zW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotICAgICAgICBpZiAoc3RyY21wIChuYW1lLCBzcGVjaWFsX3NlY3Rpb25zW2ldLm5hbWUpID09IDApCi0gICAgICAgICAgewotCSAgICBpZiAodHlwZSA9PSBTSFRfTlVMTCkKLQkgICAgICB0eXBlID0gc3BlY2lhbF9zZWN0aW9uc1tpXS50eXBlOwotCSAgICBlbHNlIGlmICh0eXBlICE9IHNwZWNpYWxfc2VjdGlvbnNbaV0udHlwZSkKLQkgICAgICBhc193YXJuIChfKCJTZXR0aW5nIGluY29ycmVjdCBzZWN0aW9uIHR5cGUgZm9yICVzIiksIG5hbWUpOwotCi0JICAgIGlmICgoYXR0ciAmfiBzcGVjaWFsX3NlY3Rpb25zW2ldLmF0dHJpYnV0ZXMpICE9IDApCi0JICAgICAgewotCSAgICAgICAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCB3ZSBwZXJtaXQgYSAubm90ZSBzZWN0aW9uIHRvIGJlCi0JCSAgIGFsbG9jYXRhYmxlLiAgSWYgdGhlIGxpbmtlciBzZWVzIGFuIGFsbG9jYXRlYWJsZSAubm90ZQotCQkgICBzZWN0aW9uLCBpdCB3aWxsIGNyZWF0ZSBhIFBUX05PVEUgc2VnbWVudCBpbiB0aGUgb3V0cHV0Ci0JCSAgIGZpbGUuICAqLwotCQlpZiAoc3RyY21wIChuYW1lLCAiLm5vdGUiKSAhPSAwCi0JCSAgICB8fCBhdHRyICE9IFNIRl9BTExPQykKLQkJICBhc193YXJuIChfKCJTZXR0aW5nIGluY29ycmVjdCBzZWN0aW9uIGF0dHJpYnV0ZXMgZm9yICVzIiksCi0JCQkgICBuYW1lKTsKLQkgICAgICB9Ci0JICAgIGF0dHIgfD0gc3BlY2lhbF9zZWN0aW9uc1tpXS5hdHRyaWJ1dGVzOwotCSAgICBicmVhazsKLQkgIH0KLQotICAgICAgLyogQ29udmVydCBFTEYgdHlwZSBhbmQgZmxhZ3MgdG8gQkZEIGZsYWdzLiAgKi8KLSAgICAgIGZsYWdzID0gKFNFQ19SRUxPQwotCSAgICAgICB8ICgoYXR0ciAmIFNIRl9XUklURSkgPyAwIDogU0VDX1JFQURPTkxZKQotCSAgICAgICB8ICgoYXR0ciAmIFNIRl9BTExPQykgPyBTRUNfQUxMT0MgOiAwKQotCSAgICAgICB8ICgoKGF0dHIgJiBTSEZfQUxMT0MpICYmIHR5cGUgIT0gU0hUX05PQklUUykgPyBTRUNfTE9BRCA6IDApCi0JICAgICAgIHwgKChhdHRyICYgU0hGX0VYRUNJTlNUUikgPyBTRUNfQ09ERSA6IDApKTsKLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9mbGFncwotICAgICAgZmxhZ3MgPSBtZF9lbGZfc2VjdGlvbl9mbGFncyAoZmxhZ3MsIGF0dHIsIHR5cGUpOwotI2VuZGlmCi0KLSAgICAgIC8qIFByZXZlbnQgU0VDX0hBU19DT05URU5UUyBmcm9tIGJlaW5nIGluYWR2ZXJ0ZW50bHkgc2V0LiAgKi8KLSAgICAgIGlmICh0eXBlID09IFNIVF9OT0JJVFMpCi0gICAgICAgIHNlZ19pbmZvIChzZWMpLT5ic3MgPSAxOwotCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncyk7Ci0KLSAgICAgIC8qIEFkZCBhIHN5bWJvbCBmb3IgdGhpcyBzZWN0aW9uIHRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgc2Vjc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICAgICAgaWYgKHNlY3N5bSAhPSBOVUxMKQotCXN5bWJvbF9zZXRfYmZkc3ltIChzZWNzeW0sIHNlYy0+c3ltYm9sKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc2VjdGlvbl9zeW1ib2wgKHNlYykpOwotICAgIH0KLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gICAgICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotfQotCi1pbnQKLW9ial9lbGZfcGFyc2Vfc2VjdGlvbl9sZXR0ZXJzIChzdHIsIGxlbikKLSAgICAgY2hhciAqc3RyOwotICAgICBzaXplX3QgbGVuOwotewotICBpbnQgYXR0ciA9IDA7Ci0KLSAgd2hpbGUgKGxlbiA+IDApCi0gICAgewotICAgICAgc3dpdGNoICgqc3RyKQotCXsKLQljYXNlICdhJzoKLQkgIGF0dHIgfD0gU0hGX0FMTE9DOwotCSAgYnJlYWs7Ci0JY2FzZSAndyc6Ci0JICBhdHRyIHw9IFNIRl9XUklURTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgYXR0ciB8PSBTSEZfRVhFQ0lOU1RSOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHsKLQkgICAgY2hhciAqYmFkX21zZyA9IF8oIlVucmVjb2duaXplZCAuc2VjdGlvbiBhdHRyaWJ1dGU6IHdhbnQgYSx3LHgiKTsKLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9sZXR0ZXIKLQkgICAgaW50IG1kX2F0dHIgPSBtZF9lbGZfc2VjdGlvbl9sZXR0ZXIgKCpzdHIsICZiYWRfbXNnKTsKLQkgICAgaWYgKG1kX2F0dHIgPj0gMCkKLQkgICAgICBhdHRyIHw9IG1kX2F0dHI7Ci0JICAgIGVsc2UKLSNlbmRpZgotCSAgICAgIHsKLQkJYXNfd2FybiAoYmFkX21zZyk7Ci0JCWF0dHIgPSAtMTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBzdHIrKywgbGVuLS07Ci0gICAgfQotCi0gIHJldHVybiBhdHRyOwotfQotCi1pbnQKLW9ial9lbGZfc2VjdGlvbl93b3JkIChzdHIsIGxlbikKLSAgICAgY2hhciAqc3RyOwotICAgICBzaXplX3QgbGVuOwotewotICBpZiAobGVuID09IDUgJiYgc3RybmNtcCAoc3RyLCAid3JpdGUiLCA1KSA9PSAwKQotICAgIHJldHVybiBTSEZfV1JJVEU7Ci0gIGlmIChsZW4gPT0gNSAmJiBzdHJuY21wIChzdHIsICJhbGxvYyIsIDUpID09IDApCi0gICAgcmV0dXJuIFNIRl9BTExPQzsKLSAgaWYgKGxlbiA9PSA5ICYmIHN0cm5jbXAgKHN0ciwgImV4ZWNpbnN0ciIsIDkpID09IDApCi0gICAgcmV0dXJuIFNIRl9FWEVDSU5TVFI7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl93b3JkCi0gIHsKLSAgICBpbnQgbWRfYXR0ciA9IG1kX2VsZl9zZWN0aW9uX3dvcmQgKHN0ciwgbGVuKTsKLSAgICBpZiAobWRfYXR0ciA+PSAwKQotICAgICAgcmV0dXJuIG1kX2F0dHI7Ci0gIH0KLSNlbmRpZgotCi0gIGFzX3dhcm4gKF8oIlVucmVjb2duaXplZCBzZWN0aW9uIGF0dHJpYnV0ZSIpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotb2JqX2VsZl9zZWN0aW9uX3R5cGUgKHN0ciwgbGVuKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHNpemVfdCBsZW47Ci17Ci0gIGlmIChsZW4gPT0gOCAmJiBzdHJuY21wIChzdHIsICJwcm9nYml0cyIsIDgpID09IDApCi0gICAgcmV0dXJuIFNIVF9QUk9HQklUUzsKLSAgaWYgKGxlbiA9PSA2ICYmIHN0cm5jbXAgKHN0ciwgIm5vYml0cyIsIDYpID09IDApCi0gICAgcmV0dXJuIFNIVF9OT0JJVFM7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl90eXBlCi0gIHsKLSAgICBpbnQgbWRfdHlwZSA9IG1kX2VsZl9zZWN0aW9uX3R5cGUgKHN0ciwgbGVuKTsKLSAgICBpZiAobWRfdHlwZSA+PSAwKQotICAgICAgcmV0dXJuIG1kX3R5cGU7Ci0gIH0KLSNlbmRpZgotCi0gIGFzX3dhcm4gKF8oIlVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUiKSk7Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1vYmpfZWxmX3NlY3Rpb24gKHB1c2gpCi0gICAgIGludCBwdXNoOwotewotICBjaGFyICpuYW1lLCAqYmVnLCAqZW5kOwotICBpbnQgdHlwZSwgYXR0ciwgZHVtbXk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIGNoYXIgbXJpX3R5cGU7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gICAgICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgICAgIHByZXZpb3VzX3N1YnNlY3Rpb24gPSBub3dfc3Vic2VnOwotCi0gICAgICBzX21yaV9zZWN0ICgmbXJpX3R5cGUpOwotCi0jaWZkZWYgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLSAgICAgIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogR2V0IG5hbWUgb2Ygc2VjdGlvbi4gICovCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotICAgIHsKLSAgICAgIG5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmR1bW15KTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JewotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKDAgPT0gc3RyY2hyICgiXG5cdCw7ICIsICplbmQpKQotCWVuZCsrOwotICAgICAgaWYgKGVuZCA9PSBpbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCSAgYXNfd2FybiAoXygiTWlzc2luZyBzZWN0aW9uIG5hbWUiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAKLSAgICAgIG5hbWUgPSB4bWFsbG9jIChlbmQgLSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKTsKLSAgICAgIG1lbWNweSAobmFtZSwgaW5wdXRfbGluZV9wb2ludGVyLCBlbmQgLSBpbnB1dF9saW5lX3BvaW50ZXIpOwotICAgICAgbmFtZVtlbmQgLSBpbnB1dF9saW5lX3BvaW50ZXJdID0gJ1wwJzsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGVuZDsKLSAgICB9Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICB0eXBlID0gU0hUX05VTEw7Ci0gIGF0dHIgPSAwOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICAvKiBTa2lwIHRoZSBjb21tYS4gICovCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotCXsKLQkgIGJlZyA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmZHVtbXkpOwotCSAgaWYgKGJlZyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGF0dHIgfD0gb2JqX2VsZl9wYXJzZV9zZWN0aW9uX2xldHRlcnMgKGJlZywgc3RybGVuIChiZWcpKTsKLQotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCSAgICB7Ci0JICAgICAgY2hhciBjOwotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpZiAoYyA9PSAnIicpCi0JCXsKLQkJICBiZWcgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmR1bW15KTsKLQkJICBpZiAoYmVnID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQkJICB0eXBlID0gb2JqX2VsZl9zZWN0aW9uX3R5cGUgKGJlZywgc3RybGVuIChiZWcpKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGMgPT0gJ0AnIHx8IGMgPT0gJyUnKQotCQl7Ci0JCSAgYmVnID0gKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIHR5cGUgPSBvYmpfZWxmX3NlY3Rpb25fdHlwZSAoYmVnLCBpbnB1dF9saW5lX3BvaW50ZXIgLSBiZWcpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZG8KLQkgICAgewotCSAgICAgIGNoYXIgYzsKLQotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIycpCi0JCXsKLQkJICBhc193YXJuIChfKCJCYWQgLnNlY3Rpb24gZGlyZWN0aXZlIC0gY2hhcmFjdGVyIGZvbGxvd2luZyBuYW1lIGlzIG5vdCAnIyciKSk7Ci0JCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBiZWcgPSArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLQkgICAgICBhdHRyIHw9IG9ial9lbGZfc2VjdGlvbl93b3JkIChiZWcsIGlucHV0X2xpbmVfcG9pbnRlciAtIGJlZyk7Ci0KLQkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICAgIH0KLQkgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQkgIC0taW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBvYmpfZWxmX2NoYW5nZV9zZWN0aW9uIChuYW1lLCB0eXBlLCBhdHRyLCBwdXNoKTsKLX0KLQotLyogQ2hhbmdlIHRvIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KLQotdm9pZAotb2JqX2VsZl9kYXRhIChpKQotICAgICBpbnQgaTsKLXsKLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLSAgc19kYXRhIChpKTsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLS8qIENoYW5nZSB0byB0aGUgLnRleHQgc2VjdGlvbi4gICovCi0KLXZvaWQKLW9ial9lbGZfdGV4dCAoaSkKLSAgICAgaW50IGk7Ci17Ci0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0gIHNfdGV4dCAoaSk7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl9zdWJzZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19zZXQgKG5vd19zZWcsIChzdWJzZWdUKSB0ZW1wKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLS8qIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIHRoZSBwcm9jZXNzb3IgYmFja2VuZHMgaWYgdGhleSBjaGFuZ2UKLSAgIHNlY3Rpb25zLiAgKi8KLQotdm9pZAotb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpCi17Ci0gIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLX0KLQotdm9pZAotb2JqX2VsZl9wcmV2aW91cyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHNlZ1QgbmV3X3NlY3Rpb247Ci0gIGludCBuZXdfc3Vic2VjdGlvbjsKLQotICBpZiAocHJldmlvdXNfc2VjdGlvbiA9PSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLnByZXZpb3VzIHdpdGhvdXQgY29ycmVzcG9uZGluZyAuc2VjdGlvbjsgaWdub3JlZCIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIG5ld19zZWN0aW9uID0gcHJldmlvdXNfc2VjdGlvbjsKLSAgbmV3X3N1YnNlY3Rpb24gPSBwcmV2aW91c19zdWJzZWN0aW9uOwotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0gIHN1YnNlZ19zZXQgKG5ld19zZWN0aW9uLCBuZXdfc3Vic2VjdGlvbik7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl9wb3BzZWN0aW9uICh4eHgpCi0gICAgIGludCB4eHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IHNlY3Rpb25fc3RhY2sgKnRvcCA9IHNlY3Rpb25fc3RhY2s7Ci0KLSAgaWYgKHRvcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLnBvcHNlY3Rpb24gd2l0aG91dCBjb3JyZXNwb25kaW5nIC5wdXNoc2VjdGlvbjsgaWdub3JlZCIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIHNlY3Rpb25fc3RhY2sgPSB0b3AtPm5leHQ7Ci0gIHByZXZpb3VzX3NlY3Rpb24gPSB0b3AtPnByZXZfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gdG9wLT5wcmV2X3N1YnNlZzsKLSAgc3Vic2VnX3NldCAodG9wLT5zZWcsIHRvcC0+c3Vic2VnKTsKLSAgZnJlZSAodG9wKTsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX2xpbmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBBc3N1bWUgZGVsaW1pdGVyIGlzIHBhcnQgb2YgZXhwcmVzc2lvbi4gIEJTRDQuMiBhcyBmYWlscyB3aXRoCi0gICAgIGRlbGlnaHRmdWwgYnVnLCBzbyB3ZSBhcmUgbm90IGJlaW5nIGluY29tcGF0aWJsZSBoZXJlLiAqLwotICBuZXdfbG9naWNhbF9saW5lICgoY2hhciAqKSBOVUxMLCAoaW50KSAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhpcyBoYW5kbGVzIHRoZSAuc3ltdmVyIHBzZXVkby1vcCwgd2hpY2ggaXMgdXNlZCB0byBzcGVjaWZ5IGEKLSAgIHN5bWJvbCB2ZXJzaW9uLiAgVGhlIHN5bnRheCBpcyBgYC5zeW12ZXIgTkFNRSxTWU1WRVJOQU1FJycuCi0gICBTWU1WRVJOQU1FIG1heSBjb250YWluIEVMRl9WRVJfQ0hSICgnQCcpIGNoYXJhY3RlcnMuICBUaGlzCi0gICBwc2V1ZG8tb3AgY2F1c2VzIHRoZSBhc3NlbWJsZXIgdG8gZW1pdCBhIHN5bWJvbCBuYW1lZCBTWU1WRVJOQU1FCi0gICB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBzeW1ib2wgTkFNRS4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3N5bXZlciAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBpZiAoc3ltYm9sX2dldF9vYmogKHN5bSktPnZlcnNpb25lZF9uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtdWx0aXBsZSAuc3ltdmVyIGRpcmVjdGl2ZXMgZm9yIHN5bWJvbCBgJXMnIiksCi0JICAgICAgU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgaW4gLnN5bXZlciIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBpZiAoYyAhPSBFTEZfVkVSX0NIUikKLQlicmVhazsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIrKyA9IGM7Ci0gICAgfQotCi0gIHN5bWJvbF9nZXRfb2JqIChzeW0pLT52ZXJzaW9uZWRfbmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGlmIChzdHJjaHIgKHN5bWJvbF9nZXRfb2JqIChzeW0pLT52ZXJzaW9uZWRfbmFtZSwgRUxGX1ZFUl9DSFIpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHZlcnNpb24gbmFtZSBpbiBgJXMnIGZvciBzeW1ib2wgYCVzJyIpLAotCSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT52ZXJzaW9uZWRfbmFtZSwgU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGlzIGhhbmRsZXMgdGhlIC52dGFibGVfaW5oZXJpdCBwc2V1ZG8tb3AsIHdoaWNoIGlzIHVzZWQgdG8gaW5kaWNhdGUKLSAgIHRvIHRoZSBsaW5rZXIgdGhlIGhpZXJhcmNoeSBpbiB3aGljaCBhIHBhcnRpY3VsYXIgdGFibGUgcmVzaWRlcy4gIFRoZQotICAgc3ludGF4IGlzICIudnRhYmxlX2luaGVyaXQgQ0hJTEROQU1FLCBQQVJFTlROQU1FIi4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3Z0YWJsZV9pbmhlcml0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqY25hbWUsICpwbmFtZTsKLSAgc3ltYm9sUyAqY3N5bSwgKnBzeW07Ci0gIGNoYXIgYywgYmFkID0gMDsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgY25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgY3N5bSA9IHN5bWJvbF9maW5kIChjbmFtZSk7Ci0KLSAgLyogR0NGSVhNRTogc2hvdWxkIGNoZWNrIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0d28gLnZ0YWJsZV9pbmhlcml0cyBmb3IKLSAgICAgdGhlIHNhbWUgY2hpbGQgc3ltYm9sLiAgQWxzbywgd2UgY2FuIGN1cnJlbnRseSBvbmx5IGRvIHRoaXMgaWYgdGhlCi0gICAgIGNoaWxkIHN5bWJvbCBpcyBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgcGxhY2VkIGluIGEgZnJhZ21lbnQuICAqLwotCi0gIGlmIChjc3ltID09IE5VTEwgfHwgc3ltYm9sX2dldF9mcmFnIChjc3ltKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImV4cGVjdGVkIGAlcycgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciAudnRhYmxlX2luaGVyaXQiLAotCSAgICAgIGNuYW1lKTsKLSAgICAgIGJhZCA9IDE7Ci0gICAgfQotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgaW4gLnZ0YWJsZV9pbmhlcml0Iik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICcwJwotICAgICAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXDAnCi0JICB8fCBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdKSkpCi0gICAgewotICAgICAgcHN5bSA9IHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgcHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKHBuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChiYWQpCi0gICAgcmV0dXJuOwotCi0gIGFzc2VydCAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChjc3ltKS0+WF9vcCA9PSBPX2NvbnN0YW50KTsKLSAgZml4X25ldyAoc3ltYm9sX2dldF9mcmFnIChjc3ltKSwKLQkgICBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGNzeW0pLT5YX2FkZF9udW1iZXIsIDAsIHBzeW0sIDAsIDAsCi0JICAgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUKTsKLX0KLSAgCi0vKiBUaGlzIGhhbmRsZXMgdGhlIC52dGFibGVfZW50cnkgcHNldWRvLW9wLCB3aGljaCBpcyB1c2VkIHRvIGluZGljYXRlCi0gICB0byB0aGUgbGlua2VyIHRoYXQgYSB2dGFibGUgc2xvdCB3YXMgdXNlZC4gIFRoZSBzeW50YXggaXMKLSAgICIudnRhYmxlX2VudHJ5IHRhYmxlbmFtZSwgb2Zmc2V0Ii4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3Z0YWJsZV9lbnRyeSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgb2Zmc2V0VCBvZmZzZXQ7Ci0gIGNoYXIgYzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkICgiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAudnRhYmxlX2VudHJ5Iik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIG9mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGZpeF9uZXcgKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIDAsIHN5bSwgb2Zmc2V0LCAwLAotCSAgIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLW9ial9yZWFkX2JlZ2luX2hvb2sgKCkKLXsKLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgZWNvZmZfcmVhZF9iZWdpbl9ob29rICgpOwotI2VuZGlmCi19Ci0KLXZvaWQKLW9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIHN0cnVjdCBlbGZfb2JqX3N5ICpzeV9vYmo7Ci0KLSAgc3lfb2JqID0gc3ltYm9sX2dldF9vYmogKHN5bWJvbFApOwotICBzeV9vYmotPnNpemUgPSBOVUxMOwotICBzeV9vYmotPnZlcnNpb25lZF9uYW1lID0gTlVMTDsKLQotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBlY29mZl9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOwotI2VuZGlmCi19Ci0KLXZvaWQKLW9ial9lbGZfdmVyc2lvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGludCBjOwotICBjaGFyIGNoOwotICBjaGFyICpwOwotICBhc2VjdGlvbiAqc2VnID0gbm93X3NlZzsKLSAgc3Vic2VnVCBzdWJzZWcgPSBub3dfc3Vic2VnOwotICBFbGZfSW50ZXJuYWxfTm90ZSBpX25vdGU7Ci0gIEVsZl9FeHRlcm5hbF9Ob3RlIGVfbm90ZTsKLSAgYXNlY3Rpb24gKm5vdGVfc2VjcCA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBpbnQgaSwgbGVuOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsJLyogLT4gMXN0IGNoYXIgb2Ygc3RyaW5nLiAqLwotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgd2hpbGUgKGlzX2FfY2hhciAoYyA9IG5leHRfY2hhcl9vZl9zdHJpbmcgKCkpKQotCTsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0gICAgICAqKGlucHV0X2xpbmVfcG9pbnRlciAtIDEpID0gJ1wwJzsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gICAgICAvKiBjcmVhdGUgdGhlIC5ub3RlIHNlY3Rpb24gKi8KLQotICAgICAgbm90ZV9zZWNwID0gc3Vic2VnX25ldyAoIi5ub3RlIiwgMCk7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwKLQkJCSAgICAgbm90ZV9zZWNwLAotCQkJICAgICBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZKTsKLQotICAgICAgLyogcHJvY2VzcyB0aGUgdmVyc2lvbiBzdHJpbmcgKi8KLQotICAgICAgbGVuID0gc3RybGVuIChuYW1lKTsKLQotICAgICAgaV9ub3RlLm5hbWVzeiA9ICgobGVuICsgMSkgKyAzKSAmIH4zOyAvKiByb3VuZCB0aGlzIHRvIHdvcmQgYm91bmRhcnkgKi8KLSAgICAgIGlfbm90ZS5kZXNjc3ogPSAwOwkvKiBubyBkZXNjcmlwdGlvbiAqLwotICAgICAgaV9ub3RlLnR5cGUgPSBOVF9WRVJTSU9OOwotICAgICAgcCA9IGZyYWdfbW9yZSAoc2l6ZW9mIChlX25vdGUubmFtZXN6KSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS5uYW1lc3osIDQpOwotICAgICAgcCA9IGZyYWdfbW9yZSAoc2l6ZW9mIChlX25vdGUuZGVzY3N6KSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS5kZXNjc3osIDQpOwotICAgICAgcCA9IGZyYWdfbW9yZSAoc2l6ZW9mIChlX25vdGUudHlwZSkpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpX25vdGUudHlwZSwgNCk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQl7Ci0JICBjaCA9ICoobmFtZSArIGkpOwotCSAgewotCSAgICBGUkFHX0FQUEVORF8xX0NIQVIgKGNoKTsKLQkgIH0KLQl9Ci0gICAgICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLQotICAgICAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyIpKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3NpemUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgY2hhciAqcDsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBzeW1ib2xTICpzeW07Ci0KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgYCVzJyBpbiAuc2l6ZSBkaXJlY3RpdmUiKSwgbmFtZSk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgPT0gT19hYnNlbnQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGV4cHJlc3Npb24gaW4gLnNpemUgZGlyZWN0aXZlIikpOwotICAgICAgZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgfQotICAqcCA9IDA7Ci0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIGlmIChleHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIFNfU0VUX1NJWkUgKHN5bSwgZXhwLlhfYWRkX251bWJlcik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZSA9Ci0JKGV4cHJlc3Npb25TICopIHhtYWxsb2MgKHNpemVvZiAoZXhwcmVzc2lvblMpKTsKLSAgICAgICpzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZSA9IGV4cDsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgRUxGIC50eXBlIHBzZXVkby1vcC4gIFRoaXMgc2V0cyB0aGUgdHlwZSBvZiBhIHN5bWJvbC4KLSAgIFRoZXJlIGFyZSBmb3VyIHN5bnRheGVzOgotICAgCi0gICBUaGUgZmlyc3QgKHVzZWQgb24gU29sYXJpcykgaXMKLSAgICAgICAudHlwZSBTWU0sI2Z1bmN0aW9uCi0gICBUaGUgc2Vjb25kICh1c2VkIG9uIFVuaXhXYXJlKSBpcwotICAgICAgIC50eXBlIFNZTSxAZnVuY3Rpb24KLSAgIFRoZSB0aGlyZCAocmVwb3J0ZWRseSB0byBiZSB1c2VkIG9uIElyaXggNi4wKSBpcwotICAgICAgIC50eXBlIFNZTSBTVFRfRlVOQwotICAgVGhlIGZvdXJ0aCAodXNlZCBvbiBOZXRCU0QvQXJtIGFuZCBMaW51eC9BUk0pIGlzCi0gICAgICAgLnR5cGUgU1lNLCVmdW5jdGlvbgotICAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfdHlwZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgaW50IHR5cGU7Ci0gIGNvbnN0IGNoYXIgKnR5cGVuYW1lOwotICBzeW1ib2xTICpzeW07Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoICAgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycKLSAgICAgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ0AnCi0gICAgICB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICclJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICB0eXBlbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHR5cGUgPSAwOwotICBpZiAoc3RyY21wICh0eXBlbmFtZSwgImZ1bmN0aW9uIikgPT0gMAotICAgICAgfHwgc3RyY21wICh0eXBlbmFtZSwgIlNUVF9GVU5DIikgPT0gMCkKLSAgICB0eXBlID0gQlNGX0ZVTkNUSU9OOwotICBlbHNlIGlmIChzdHJjbXAgKHR5cGVuYW1lLCAib2JqZWN0IikgPT0gMAotCSAgIHx8IHN0cmNtcCAodHlwZW5hbWUsICJTVFRfT0JKRUNUIikgPT0gMCkKLSAgICB0eXBlID0gQlNGX09CSkVDVDsKLSAgZWxzZQotICAgIGFzX2JhZCAoXygiaWdub3JpbmcgdW5yZWNvZ25pemVkIHN5bWJvbCB0eXBlIFwiJXNcIiIpLCB0eXBlbmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IHR5cGU7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfaWRlbnQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdGF0aWMgc2VnVCBjb21tZW50X3NlY3Rpb247Ci0gIHNlZ1Qgb2xkX3NlY3Rpb24gPSBub3dfc2VnOwotICBpbnQgb2xkX3N1YnNlY3Rpb24gPSBub3dfc3Vic2VnOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBpZiAoIWNvbW1lbnRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBjaGFyICpwOwotICAgICAgY29tbWVudF9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5jb21tZW50IiwgMCk7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgY29tbWVudF9zZWN0aW9uLAotCQkJICAgICBTRUNfUkVBRE9OTFkgfCBTRUNfSEFTX0NPTlRFTlRTKTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKDEpOwotICAgICAgKnAgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHN1YnNlZ19zZXQgKGNvbW1lbnRfc2VjdGlvbiwgMCk7Ci0gIHN0cmluZ2VyICgxKTsKLSAgc3Vic2VnX3NldCAob2xkX3NlY3Rpb24sIG9sZF9zdWJzZWN0aW9uKTsKLX0KLQotI2lmZGVmIElOSVRfU1RBQl9TRUNUSU9OCi0KLS8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhIC5zdGFicyBzZWN0aW9uIGlzIHNwZWNpYWwuICAqLwotCi12b2lkCi1vYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCi0gICAgIHNlZ1Qgc2VnOwotewotICBjaGFyICpmaWxlOwotICBjaGFyICpwOwotICBjaGFyICpzdGFic3RyX25hbWU7Ci0gIHVuc2lnbmVkIGludCBzdHJvZmY7Ci0KLSAgLyogRm9yY2UgdGhlIHNlY3Rpb24gdG8gYWxpZ24gdG8gYSBsb25nd29yZCBib3VuZGFyeS4gIFdpdGhvdXQgdGhpcywKLSAgICAgVW5peFdhcmUgYXIgY3Jhc2hlcy4gICovCi0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCAyKTsKLQotICAvKiBNYWtlIHNwYWNlIGZvciB0aGlzIGZpcnN0IHN5bWJvbC4gKi8KLSAgcCA9IGZyYWdfbW9yZSAoMTIpOwotICAvKiBaZXJvIGl0IG91dC4gKi8KLSAgbWVtc2V0IChwLCAwLCAxMik7Ci0gIGFzX3doZXJlICgmZmlsZSwgKHVuc2lnbmVkIGludCAqKSBOVUxMKTsKLSAgc3RhYnN0cl9uYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHNlZ21lbnRfbmFtZSAoc2VnKSkgKyA0KTsKLSAgc3RyY3B5IChzdGFic3RyX25hbWUsIHNlZ21lbnRfbmFtZSAoc2VnKSk7Ci0gIHN0cmNhdCAoc3RhYnN0cl9uYW1lLCAic3RyIik7Ci0gIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKGZpbGUsIHN0YWJzdHJfbmFtZSk7Ci0gIGtub3cgKHN0cm9mZiA9PSAxKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBzdHJvZmYsIDQpOwotICBzZWdfaW5mbyAoc2VnKS0+c3RhYnUucCA9IHA7Ci19Ci0KLSNlbmRpZgotCi0vKiBGaWxsIGluIHRoZSBjb3VudHMgaW4gdGhlIGZpcnN0IGVudHJ5IGluIGEgLnN0YWJzIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3N0YWJfc2VjdGlvbnMgKGFiZmQsIHNlYywgeHh4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4eHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgYXNlY3Rpb24gKnN0cnNlYzsKLSAgY2hhciAqcDsKLSAgaW50IHN0cnN6LCBuc3ltczsKLQotICBpZiAoc3RybmNtcCAoIi5zdGFiIiwgc2VjLT5uYW1lLCA1KSkKLSAgICByZXR1cm47Ci0gIGlmICghc3RyY21wICgic3RyIiwgc2VjLT5uYW1lICsgc3RybGVuIChzZWMtPm5hbWUpIC0gMykpCi0gICAgcmV0dXJuOwotCi0gIG5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoc2VjLT5uYW1lKSArIDQpOwotICBzdHJjcHkgKG5hbWUsIHNlYy0+bmFtZSk7Ci0gIHN0cmNhdCAobmFtZSwgInN0ciIpOwotICBzdHJzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0gIGlmIChzdHJzZWMpCi0gICAgc3Ryc3ogPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdHJzZWMpOwotICBlbHNlCi0gICAgc3Ryc3ogPSAwOwotICBuc3ltcyA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykgLyAxMiAtIDE7Ci0KLSAgcCA9IHNlZ19pbmZvIChzZWMpLT5zdGFidS5wOwotICBhc3NlcnQgKHAgIT0gMCk7Ci0KLSAgYmZkX2hfcHV0XzE2IChhYmZkLCAoYmZkX3ZtYSkgbnN5bXMsIChiZmRfYnl0ZSAqKSBwICsgNik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHN0cnN6LCAoYmZkX2J5dGUgKikgcCArIDgpOwotfQotCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUNPRkYgY29kZS4gIEl0IGlzIHN1cHBvc2VkIHRvCi0gICByZWNvcmQgdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbiBzbyB0aGF0IHRoZSBiYWNrZW5kIGNhbgotICAgd3JpdGUgaXQgb3V0IGNvcnJlY3RseS4gIFRoZSBFTEYgYmFja2VuZCBkb2Vzbid0IGFjdHVhbGx5IGhhbmRsZQotICAgdGhpcyBhdCB0aGUgbW9tZW50LCBzbyB3ZSBkbyBpdCBvdXJzZWx2ZXMuICBXZSBzYXZlIHRoZSBpbmZvcm1hdGlvbgotICAgaW4gdGhlIHN5bWJvbC4gICovCi0KLXZvaWQKLWVsZl9lY29mZl9zZXRfZXh0IChzeW0sIGV4dCkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBzdHJ1Y3QgZWNvZmZfZXh0ciAqZXh0OwotewotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+dWRhdGEucCA9IChQVFIpIGV4dDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscy4gIEl0IGlzCi0gICBzdXBwb3NlZCB0byAqRVhUIHRvIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24sIGFuZCByZXR1cm4KLSAgIHdoZXRoZXIgdGhlIHN5bWJvbCBzaG91bGQgYmUgdXNlZCBhdCBhbGwuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2dldF9leHRyIChzeW0sIGV4dCkKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBFWFRSICpleHQ7Ci17Ci0gIGlmIChzeW0tPnVkYXRhLnAgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpleHQgPSAqKEVYVFIgKikgc3ltLT51ZGF0YS5wOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscy4gIEl0IGhhcwotICAgbm90aGluZyB0byBkbyBmb3IgRUxGLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotZWxmX3NldF9pbmRleCAoc3ltLCBpbmR4KQotICAgICBhc3ltYm9sICpzeW0gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgYmZkX3NpemVfdHlwZSBpbmR4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci19Ci0KLSNlbmRpZiAvKiBORUVEX0VDT0ZGX0RFQlVHICovCi0KLXZvaWQKLWVsZl9mcm9iX3N5bWJvbCAoc3ltcCwgcHVudHApCi0gICAgIHN5bWJvbFMgKnN5bXA7Ci0gICAgIGludCAqcHVudHA7Ci17Ci0gIHN0cnVjdCBlbGZfb2JqX3N5ICpzeV9vYmo7Ci0KLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgZWNvZmZfZnJvYl9zeW1ib2wgKHN5bXApOwotI2VuZGlmCi0KLSAgc3lfb2JqID0gc3ltYm9sX2dldF9vYmogKHN5bXApOwotCi0gIGlmIChzeV9vYmotPnNpemUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHN5X29iai0+c2l6ZS0+WF9vcCkKLQl7Ci0JY2FzZSBPX3N1YnRyYWN0OgotCSAgU19TRVRfU0laRSAoc3ltcCwKLQkJICAgICAgKFNfR0VUX1ZBTFVFIChzeV9vYmotPnNpemUtPlhfYWRkX3N5bWJvbCkKLQkJICAgICAgICsgc3lfb2JqLT5zaXplLT5YX2FkZF9udW1iZXIKLQkJICAgICAgIC0gU19HRVRfVkFMVUUgKHN5X29iai0+c2l6ZS0+WF9vcF9zeW1ib2wpKSk7Ci0JICBicmVhazsKLQljYXNlIE9fY29uc3RhbnQ6Ci0JICBTX1NFVF9TSVpFIChzeW1wLAotCQkgICAgICAoU19HRVRfVkFMVUUgKHN5X29iai0+c2l6ZS0+WF9hZGRfc3ltYm9sKQotCQkgICAgICAgKyBzeV9vYmotPnNpemUtPlhfYWRkX251bWJlcikpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFzX2JhZCAoXygiLnNpemUgZXhwcmVzc2lvbiB0b28gY29tcGxpY2F0ZWQgdG8gZml4IHVwIikpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZnJlZSAoc3lfb2JqLT5zaXplKTsKLSAgICAgIHN5X29iai0+c2l6ZSA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChzeV9vYmotPnZlcnNpb25lZF9uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBzeW1ib2wgd2FzIGdpdmVuIGEgbmV3IG5hbWUgd2l0aCB0aGUgLnN5bXZlciBkaXJlY3RpdmUuCi0KLSAgICAgICAgIElmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlLCBqdXN0IHJlbmFtZSB0aGUgc3ltYm9sIHRvCi0gICAgICAgICBpbmNsdWRlIHRoZSB2ZXJzaW9uIHN0cmluZy4gIFRoaXMgd2lsbCBtYWtlIHRoZSByZWxvY3MgYmUKLSAgICAgICAgIGFnYWluc3QgdGhlIGNvcnJlY3QgdmVyc2lvbmVkIHN5bWJvbC4KLQotCSBJZiB0aGlzIGlzIGEgZGVmaW5pdGlvbiwgYWRkIGFuIGFsaWFzLiAgRklYTUU6IFVzaW5nIGFuIGFsaWFzCi0JIHdpbGwgcGVybWl0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gcmVmZXIgdG8gdGhlIHJpZ2h0Ci0JIHN5bWJvbC4gIEhvd2V2ZXIsIGl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgaXQgaXMgdGhlIGJlc3QKLQkgYXBwcm9hY2guICAqLwotCi0gICAgICBpZiAoISBTX0lTX0RFRklORUQgKHN5bXApKQotCXsKLQkgIGNoYXIgKnA7Ci0KLQkgIC8qIFZlcmlmeSB0aGF0IHRoZSBuYW1lIGlzbid0IHVzaW5nIHRoZSBAQCBzeW50YXgtLXRoaXMgaXMKLSAgICAgICAgICAgICByZXNlcnZlZCBmb3IgZGVmaW5pdGlvbnMgb2YgdGhlIGRlZmF1bHQgdmVyc2lvbiB0byBsaW5rCi0gICAgICAgICAgICAgYWdhaW5zdC4gICovCi0JICBwID0gc3RyY2hyIChzeV9vYmotPnZlcnNpb25lZF9uYW1lLCBFTEZfVkVSX0NIUik7Ci0JICBrbm93IChwICE9IE5VTEwpOwotCSAgaWYgKHBbMV0gPT0gRUxGX1ZFUl9DSFIpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImludmFsaWQgYXR0ZW1wdCB0byBkZWNsYXJlIGV4dGVybmFsIHZlcnNpb24gbmFtZSBhcyBkZWZhdWx0IGluIHN5bWJvbCBgJXMnIiksCi0JCSAgICAgIHN5X29iai0+dmVyc2lvbmVkX25hbWUpOwotCSAgICAgICpwdW50cCA9IHRydWU7Ci0JICAgIH0KLQkgIFNfU0VUX05BTUUgKHN5bXAsIHN5X29iai0+dmVyc2lvbmVkX25hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpzeW1wMjsKLQotCSAgLyogRklYTUU6IENyZWF0aW5nIGEgbmV3IHN5bWJvbCBoZXJlIGlzIHJpc2t5LiAgV2UncmUgaW4gdGhlCi0gICAgICAgICAgICAgZmluYWwgbG9vcCBvdmVyIHRoZSBzeW1ib2wgdGFibGUuICBXZSBjYW4gZ2V0IGF3YXkgd2l0aAotICAgICAgICAgICAgIGl0IG9ubHkgYmVjYXVzZSB0aGUgc3ltYm9sIGdvZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCwKLSAgICAgICAgICAgICB3aGVyZSB0aGUgbG9vcCB3aWxsIHN0aWxsIHNlZSBpdC4gIEl0IHdvdWxkIHByb2JhYmx5IGJlCi0gICAgICAgICAgICAgYmV0dGVyIHRvIGRvIHRoaXMgaW4gb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0LiAqLwotCi0JICBzeW1wMiA9IHN5bWJvbF9maW5kX29yX21ha2UgKHN5X29iai0+dmVyc2lvbmVkX25hbWUpOwotCi0JICAvKiBOb3cgd2UgYWN0IGFzIHRob3VnaCB3ZSBzYXcgc3ltcDIgPSBzeW0uICAqLwotCi0JICBTX1NFVF9TRUdNRU5UIChzeW1wMiwgU19HRVRfU0VHTUVOVCAoc3ltcCkpOwotCi0JICAvKiBTdWJ0cmFjdGluZyBvdXQgdGhlIGZyYWcgYWRkcmVzcyBoZXJlIGlzIGEgaGFjayBiZWNhdXNlCi0gICAgICAgICAgICAgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIGZpbmFsIGxvb3AuICAqLwotCSAgU19TRVRfVkFMVUUgKHN5bXAyLAotCQkgICAgICAgKFNfR0VUX1ZBTFVFIChzeW1wKQotCQkJLSBzeW1ib2xfZ2V0X2ZyYWcgKHN5bXApLT5mcl9hZGRyZXNzKSk7Ci0KLQkgIHN5bWJvbF9zZXRfZnJhZyAoc3ltcDIsIHN5bWJvbF9nZXRfZnJhZyAoc3ltcCkpOwotCi0JICAvKiBUaGlzIHdpbGwgY29weSBvdmVyIHRoZSBzaXplIGluZm9ybWF0aW9uLiAgKi8KLQkgIGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMgKHN5bXAyLCBzeW1wKTsKLQotCSAgaWYgKFNfSVNfV0VBSyAoc3ltcCkpCi0JICAgIFNfU0VUX1dFQUsgKHN5bXAyKTsKLQotCSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bXApKQotCSAgICBTX1NFVF9FWFRFUk5BTCAoc3ltcDIpOwotCX0KLSAgICB9Ci0KLSAgLyogRG91YmxlIGNoZWNrIHdlYWsgc3ltYm9scy4gICovCi0gIGlmIChTX0lTX1dFQUsgKHN5bXApKQotICAgIHsKLSAgICAgIGlmIChTX0lTX0NPTU1PTiAoc3ltcCkpCi0JYXNfYmFkIChfKCJTeW1ib2wgYCVzJyBjYW4gbm90IGJlIGJvdGggd2VhayBhbmQgY29tbW9uIiksCi0JCVNfR0VUX05BTUUgKHN5bXApKTsKLSAgICB9Ci0KLSNpZmRlZiBUQ19NSVBTCi0gIC8qIFRoZSBJcml4IDUgYW5kIDYgYXNzZW1ibGVycyBzZXQgdGhlIHR5cGUgb2YgYW55IGNvbW1vbiBzeW1ib2wgYW5kCi0gICAgIGFueSB1bmRlZmluZWQgbm9uLWZ1bmN0aW9uIHN5bWJvbCB0byBTVFRfT0JKRUNULiAgV2UgdHJ5IHRvIGJlCi0gICAgIGNvbXBhdGlibGUsIHNpbmNlIG5ld2VyIElyaXggNSBhbmQgNiBsaW5rZXJzIGNhcmUuICBIb3dldmVyLCB3ZQotICAgICBvbmx5IHNldCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBTVFRfT0JKRUNUIGlmIHdlIGFyZSBvbiBJcml4LAotICAgICBiZWNhdXNlIHRoYXQgaXMgdGhlIG9ubHkgdGltZSBnY2Mgd2lsbCBnZW5lcmF0ZSB0aGUgbmVjZXNzYXJ5Ci0gICAgIC5nbG9iYWwgZGlyZWN0aXZlcyB0byBtYXJrIGZ1bmN0aW9ucy4gICovCi0KLSAgaWYgKFNfSVNfQ09NTU9OIChzeW1wKSkKLSAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0KLSAgaWYgKHN0cnN0ciAoVEFSR0VUX09TLCAiaXJpeCIpICE9IE5VTEwKLSAgICAgICYmICEgU19JU19ERUZJTkVEIChzeW1wKQotICAgICAgJiYgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pID09IDApCi0gICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotI2VuZGlmCi0KLSNpZmRlZiBUQ19QUEMKLSAgLyogRnJvYiB0aGUgUG93ZXJQQywgc28gdGhhdCB0aGUgc3ltYm9sIGFsd2F5cyBoYXMgb2JqZWN0IHR5cGUKLSAgICAgaWYgaXQgaXMgbm90IHNvbWUgb3RoZXIgdHlwZS4gIFZ4V29ya3MgbmVlZHMgdGhpcy4gICovCi0gIGlmICgoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncwotICAgICAgICYgKEJTRl9GVU5DVElPTiB8IEJTRl9GSUxFIHwgQlNGX1NFQ1RJT05fU1lNKSkgPT0gMAotICAgICAgJiYgU19JU19ERUZJTkVEIChzeW1wKSkKLSAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0jZW5kaWYKLX0KLQotdm9pZAotZWxmX2Zyb2JfZmlsZSAoKQotewotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgYWRqdXN0X3N0YWJfc2VjdGlvbnMsIChQVFIpIDApOwotCi0jaWZkZWYgZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcKLSAgZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcgKCk7Ci0jZW5kaWYKLX0KLQotLyogSXQgaXMgcmVxdWlyZWQgdGhhdCB3ZSBsZXQgd3JpdGVfcmVsb2NzIGhhdmUgdGhlIG9wcG9ydHVuaXR5IHRvCi0gICBvcHRpbWl6ZSBhd2F5IGZpeHVwcyBiZWZvcmUgb3V0cHV0IGhhcyBiZWd1biwgc2luY2UgaXQgaXMgcG9zc2libGUKLSAgIHRvIGVsaW1pbmF0ZSBhbGwgZml4dXBzIGZvciBhIHNlY3Rpb24gYW5kIHRodXMgd2UgbmV2ZXIgc2hvdWxkCi0gICBoYXZlIGdlbmVyYXRlZCB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uLiAgKi8KLQotdm9pZAotZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCkKLXsKLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgLyogR2VuZXJhdGUgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmRlYnVnX3N3YXA7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkZWJ1ZzsKLSAgICAgIGNoYXIgKmJ1ZjsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIGRlYnVnX3N3YXAKLQk9IGdldF9lbGZfYmFja2VuZF9kYXRhIChzdGRvdXRwdXQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotICAgICAga25vdyAoZGVidWdfc3dhcCAhPSAoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKikgTlVMTCk7Ci0gICAgICBlY29mZl9idWlsZF9kZWJ1ZyAoJmRlYnVnLnN5bWJvbGljX2hlYWRlciwgJmJ1ZiwgZGVidWdfc3dhcCk7Ci0KLSAgICAgIC8qIFNldCB1cCB0aGUgcG9pbnRlcnMgaW4gZGVidWcuICAqLwotI2RlZmluZSBTRVQocHRyLCBvZmZzZXQsIHR5cGUpIFwKLSAgICBkZWJ1Zy5wdHIgPSAodHlwZSkgKGJ1ZiArIGRlYnVnLnN5bWJvbGljX2hlYWRlci5vZmZzZXQpCi0KLSAgICAgIFNFVCAobGluZSwgY2JMaW5lT2Zmc2V0LCB1bnNpZ25lZCBjaGFyICopOwotICAgICAgU0VUIChleHRlcm5hbF9kbnIsIGNiRG5PZmZzZXQsIFBUUik7Ci0gICAgICBTRVQgKGV4dGVybmFsX3BkciwgY2JQZE9mZnNldCwgUFRSKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfc3ltLCBjYlN5bU9mZnNldCwgUFRSKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfb3B0LCBjYk9wdE9mZnNldCwgUFRSKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfYXV4LCBjYkF1eE9mZnNldCwgdW5pb24gYXV4X2V4dCAqKTsKLSAgICAgIFNFVCAoc3MsIGNiU3NPZmZzZXQsIGNoYXIgKik7Ci0gICAgICBTRVQgKGV4dGVybmFsX2ZkciwgY2JGZE9mZnNldCwgUFRSKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfcmZkLCBjYlJmZE9mZnNldCwgUFRSKTsKLSAgICAgIC8qIHNzZXh0IGFuZCBleHRlcm5hbF9leHQgYXJlIHNldCB1cCBqdXN0IGJlbG93LiAgKi8KLQotI3VuZGVmIFNFVAotCi0gICAgICAvKiBTZXQgdXAgdGhlIGV4dGVybmFsIHN5bWJvbHMuICAqLwotICAgICAgZGVidWcuc3NleHQgPSBkZWJ1Zy5zc2V4dF9lbmQgPSBOVUxMOwotICAgICAgZGVidWcuZXh0ZXJuYWxfZXh0ID0gZGVidWcuZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7Ci0gICAgICBpZiAoISBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzIChzdGRvdXRwdXQsICZkZWJ1ZywgZGVidWdfc3dhcCwgdHJ1ZSwKLQkJCQkgICAgICAgZWxmX2dldF9leHRyLCBlbGZfc2V0X2luZGV4KSkKLQlhc19mYXRhbCAoXygiRmFpbGVkIHRvIHNldCB1cCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb246ICVzIiksCi0JCSAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCi0gICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LCAiLm1kZWJ1ZyIpOwotICAgICAgYXNzZXJ0IChzZWMgIT0gTlVMTCk7Ci0KLSAgICAgIGtub3cgKHN0ZG91dHB1dC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSk7Ci0KLSAgICAgIC8qIFdlIHNldCB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiwgY2FsbCBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMKLQkgdG8gZm9yY2UgdGhlIEVMRiBiYWNrZW5kIHRvIGFsbG9jYXRlIGEgZmlsZSBwb3NpdGlvbiwgYW5kIHRoZW4KLQkgd3JpdGUgb3V0IHRoZSBkYXRhLiAgRklYTUU6IElzIHRoaXMgcmVhbGx5IHRoZSBiZXN0IHdheSB0byBkbwotCSB0aGlzPyAgKi8KLSAgICAgIHNlYy0+X3Jhd19zaXplID0gYmZkX2Vjb2ZmX2RlYnVnX3NpemUgKHN0ZG91dHB1dCwgJmRlYnVnLCBkZWJ1Z19zd2FwKTsKLQotICAgICAgLyogUGFzcyBCVUYgdG8gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIGJlY2F1c2UgdGhpcyB3aWxsCi0gICAgICAgICBldmVudHVhbGx5IGJlY29tZSBhIGNhbGwgdG8gZndyaXRlLCBhbmQgSVNPIEMgcHJvaGliaXRzCi0gICAgICAgICBwYXNzaW5nIGEgTlVMTCBwb2ludGVyIHRvIGEgc3RkaW8gZnVuY3Rpb24gZXZlbiBpZiB0aGUKLSAgICAgICAgIHBvaW50ZXIgd2lsbCBub3QgYmUgdXNlZC4gICovCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgc2VjLCAoUFRSKSBidWYsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCAoYmZkX3NpemVfdHlwZSkgMCkpCi0JYXNfZmF0YWwgKF8oIkNhbid0IHN0YXJ0IHdyaXRpbmcgLm1kZWJ1ZyBzZWN0aW9uOiAlcyIpLAotCQkgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQotICAgICAga25vdyAoc3Rkb3V0cHV0LT5vdXRwdXRfaGFzX2JlZ3VuID09IHRydWUpOwotICAgICAga25vdyAoc2VjLT5maWxlcG9zICE9IDApOwotCi0gICAgICBpZiAoISBiZmRfZWNvZmZfd3JpdGVfZGVidWcgKHN0ZG91dHB1dCwgJmRlYnVnLCBkZWJ1Z19zd2FwLAotCQkJCSAgIHNlYy0+ZmlsZXBvcykpCi0JYXNfZmF0YWwgKF8oIkNvdWxkIG5vdCB3cml0ZSAubWRlYnVnIHNlY3Rpb246ICVzIiksCi0JCSAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgIH0KLSNlbmRpZiAvKiBORUVEX0VDT0ZGX0RFQlVHICovCi19Ci0KLSNpZmRlZiBTQ09fRUxGCi0KLS8qIEhlYXZpbHkgcGxhZ2FyaXplZCBmcm9tIG9ial9lbGZfdmVyc2lvbi4gIFRoZSBpZGVhIGlzIHRvIGVtaXQgdGhlCi0gICBTQ08gc3BlY2lmaWMgaWRlbnRpZmllciBpbiB0aGUgLm5vdGVzIHNlY3Rpb24gdG8gc2F0aXNmeSB0aGUgU0NPCi0gICBsaW5rZXIuCi0KLSAgIFRoaXMgbG9va3MgbW9yZSBjb21wbGljYXRlZCB0aGFuIGl0IHJlYWxseSBpcy4gIEFzIG9wcG9zZWQgdG8gdGhlCi0gICAib2J2aW91cyIgc29sdXRpb24sIHRoaXMgc2hvdWxkIGhhbmRsZSB0aGUgY3Jvc3MgZGV2IGNhc2VzCi0gICBjb3JyZWN0bHkuICAoaS5lLCBob3N0aW5nIG9uIGEgNjQgYml0IGJpZyBlbmRpYW4gcHJvY2Vzc29yLCBidXQKLSAgIGdlbmVyYXRpbmcgU0NPIEVsZiBjb2RlKSBFZmZpY2llbmN5IGlzbid0IGEgY29uY2VybiwgYXMgdGhlcmUKLSAgIHNob3VsZCBiZSBleGFjdGx5IG9uZSBvZiB0aGVzZSBzZWN0aW9ucyBwZXIgb2JqZWN0IG1vZHVsZS4KLQotICAgU0NPIE9wZW5TZXJ2ZXIgNSBpZGVudGlmaWVzIGl0J3MgRUxGIG1vZHVsZXMgd2l0aCBhIHN0YW5kYXJkIEVMRgotICAgLm5vdGUgc2VjdGlvbi4KLQotICAgaW50XzMyIG5hbWVzeiAgPSA0IDsgIE5hbWUgc2l6ZSAKLSAgIGludF8zMiBkZXNjc3ogID0gMTIgOyBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiAKLSAgIGludF8zMiB0eXBlICAgID0gMSA7ICAKLSAgIGNoYXIgICBuYW1lWzRdID0gIlNDTyIgOyBPcmlnaW5hdG9yIG5hbWUgQUxXQVlTIFNDTyArIE5VTEwgCi0gICBpbnRfMzIgdmVyc2lvbiA9IChtYWpvciB2ZXIgIyA8PCAxNikgIHwgdmVyc2lvbiBvZiB0b29scyA7Ci0gICBpbnRfMzIgc291cmNlICA9ICh0b29sX2lkIDw8IDE2ICkgfCAxIDsKLSAgIGludF8zMiBpbmZvICAgID0gMCA7ICAgIFRoZXNlIGFyZSBzZXQgYnkgdGhlIFNDTyB0b29scywgYnV0IHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBrbm93IGVub3VnaCBhYm91dCB0aGUgc291cmNlIAotCQkJICAgZW52aXJvbm1lbnQgdG8gc2V0IHRoZW0uICBTQ08gbGQgY3VycmVudGx5Ci0JCQkgICBpZ25vcmVzIHRoZW0sIGFuZCByZWNvbW1lbmRzIHdlIHNldCB0aGVtCi0JCQkgICB0byB6ZXJvLiAgKi8KLQotI2RlZmluZSBTQ09fTUFKT1JfVkVSU0lPTiAweDEKLSNkZWZpbmUgU0NPX01JTk9SX1ZFUlNJT04gMHgxCi0KLXZvaWQKLXNjb19pZCAoKQotewotCi0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGludCBjOwotICBjaGFyIGNoOwotICBjaGFyICpwOwotICBhc2VjdGlvbiAqc2VnID0gbm93X3NlZzsKLSAgc3Vic2VnVCBzdWJzZWcgPSBub3dfc3Vic2VnOwotICBFbGZfSW50ZXJuYWxfTm90ZSBpX25vdGU7Ci0gIEVsZl9FeHRlcm5hbF9Ob3RlIGVfbm90ZTsKLSAgYXNlY3Rpb24gKm5vdGVfc2VjcCA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBpbnQgaSwgbGVuOwotCi0gIC8qIGNyZWF0ZSB0aGUgLm5vdGUgc2VjdGlvbiAqLwotCi0gIG5vdGVfc2VjcCA9IHN1YnNlZ19uZXcgKCIubm90ZSIsIDApOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwKLQkJCSBub3RlX3NlY3AsCi0JCQkgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSk7Ci0KLSAgLyogcHJvY2VzcyB0aGUgdmVyc2lvbiBzdHJpbmcgKi8KLQotICBpX25vdGUubmFtZXN6ID0gNDsgCi0gIGlfbm90ZS5kZXNjc3ogPSAxMjsJCS8qIDEyIGRlc2NyaXB0aXZlIGJ5dGVzICovCi0gIGlfbm90ZS50eXBlID0gTlRfVkVSU0lPTjsJLyogQ29udGFpbnMgYSB2ZXJzaW9uIHN0cmluZyAqLwotCi0gIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoaV9ub3RlLm5hbWVzeikpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS5uYW1lc3osIDQpOwotCi0gIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoaV9ub3RlLmRlc2NzeikpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS5kZXNjc3osIDQpOwotCi0gIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoaV9ub3RlLnR5cGUpKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpX25vdGUudHlwZSwgNCk7Ci0KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIHN0cmNweSAocCwgIlNDTyIpOyAKLQotICAvKiBOb3RlOiB0aGlzIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgRUxGIHdlJ3JlIHJlcHJlc2VudGluZyAqLwotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAoU0NPX01BSk9SX1ZFUlNJT04gPDwgMTYpIHwgKFNDT19NSU5PUl9WRVJTSU9OKSwgNCk7Ci0KLSAgLyogSGVyZSwgd2UgcGljayBhIG1hZ2ljIG51bWJlciBmb3Igb3Vyc2VsdmVzICh5ZXMsIEkgInJlZ2lzdGVyZWQiCi0gICAgIGl0IHdpdGggU0NPLiAgVGhlIGJvdHRvbSBiaXQgc2hvd3MgdGhhdCB3ZSBhcmUgY29tcGF0IHdpdGggdGhlCi0gICAgIFNDTyBBQkkuICAqLwotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAweDRjNTIwMDAwIHwgMHgwMDAxLCA0KTsKLQotICAvKiBJZiB3ZSBrbmV3IChvciBjYXJlZCkgd2hhdCB0aGUgc291cmNlIGxhbmd1YWdlIG9wdGlvbnMgd2VyZSwgd2UnZAotICAgICBmaWxsIHRoZW0gaW4gaGVyZS4gIFNDTyBoYXMgZ2l2ZW4gdXMgcGVybWlzc2lvbiB0byBpZ25vcmUgdGhlc2UKLSAgICAgYW5kIGp1c3Qgc2V0IHRoZW0gdG8gemVyby4gICovCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIDB4MDAwMCwgNCk7Ci0gCi0gIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotCi0gIC8qIFdlIHByb2JhYmx5IGNhbid0IHJlc3RvcmUgdGhlIGN1cnJlbnQgc2VnbWVudCwgZm9yIHRoZXJlIGxpa2VseQotICAgICBpc24ndCBvbmUgeWV0Li4uICAqLwotICBpZiAoc2VnICYmIHN1YnNlZykKLSAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0KLX0KLQotI2VuZGlmIC8qIFNDT19FTEYgKi8KLQotY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgZWxmX2Zvcm1hdF9vcHMgPQotewotICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotICAwLAotICAxLAotICBlbGZfZnJvYl9zeW1ib2wsCi0gIGVsZl9mcm9iX2ZpbGUsCi0gIGVsZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzLAotICBlbGZfc19nZXRfc2l6ZSwgZWxmX3Nfc2V0X3NpemUsCi0gIGVsZl9zX2dldF9hbGlnbiwgZWxmX3Nfc2V0X2FsaWduLAotICBlbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcywKLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8sCi0gIGVjb2ZmX3N0YWIsCi0jZWxzZQotICAwLAotICAwLAkJCQkvKiBwcm9jZXNzX3N0YWIgKi8KLSNlbmRpZgotICBlbGZfc2VjX3N5bV9va19mb3JfcmVsb2MsCi0gIGVsZl9wb3BfaW5zZXJ0LAotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgZWxmX2Vjb2ZmX3NldF9leHQsCi0jZWxzZQotICAwLAotI2VuZGlmCi0gIG9ial9yZWFkX2JlZ2luX2hvb2ssCi0gIG9ial9zeW1ib2xfbmV3X2hvb2ssCi19OwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZWxmLmggYi9nYXMvY29uZmlnL29iai1lbGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxNmNhMi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1lbGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKiBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBIUCBQQS1SSVNDIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKLSAgIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguICAqLwotCi0jaWZuZGVmIF9PQkpfRUxGX0gKLSNkZWZpbmUgX09CSl9FTEZfSAotCi0jZGVmaW5lIE9CSl9FTEYgMQotCi0jaWZuZGVmIE9VVFBVVF9GTEFWT1IKLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0jZW5kaWYKLQotI2luY2x1ZGUgPGJmZC5oPgotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAkJLyogZm9yIG5vdyAqLwotI2luY2x1ZGUgImJmZC9lbGYtYmZkLmgiCi0KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0jaWZkZWYgVENfQUxQSEEKLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIGFscGhhX2ZsYWdfbWRlYnVnCi1leHRlcm4gaW50IGFscGhhX2ZsYWdfbWRlYnVnOwotI2VuZGlmCi0KLS8qIEZvciBub3csIGFsd2F5cyBzZXQgRUNPRkZfREVCVUdHSU5HIGZvciBhIE1JUFMgdGFyZ2V0LiAgKi8KLSNpZmRlZiBUQ19NSVBTCi0jaWZkZWYgTUlQU19TVEFCU19FTEYKLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIDAKLSNlbHNlCi0jZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyAxCi0jZW5kaWYgLyogTUlQU19TVEFCU19FTEYgKi8KLSNlbmRpZiAvKiBUQ19NSVBTICovCi0KLS8qIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZWFjaCBzeW1ib2wuICAqLwotc3RydWN0IGVsZl9vYmpfc3kKLXsKLSAgLyogV2hldGhlciB0aGUgc3ltYm9sIGhhcyBiZWVuIG1hcmtlZCBhcyBsb2NhbC4gICovCi0gIGludCBsb2NhbDsKLQotICAvKiBVc2UgdGhpcyB0byBrZWVwIHRyYWNrIG9mIC5zaXplIGV4cHJlc3Npb25zIHRoYXQgaW52b2x2ZQotICAgICBkaWZmZXJlbmNlcyB0aGF0IHdlIGNhbid0IGNvbXB1dGUgeWV0LiAgKi8KLSAgZXhwcmVzc2lvblMgKnNpemU7Ci0KLSAgLyogVGhlIG5hbWUgc3BlY2lmaWVkIGJ5IHRoZSAuc3ltdmVyIGRpcmVjdGl2ZS4gICovCi0gIGNoYXIgKnZlcnNpb25lZF9uYW1lOwotCi0jaWZkZWYgRUNPRkZfREVCVUdHSU5HCi0gIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgd2UgbmVlZCBzb21lCi0gICAgIGFkZGl0aW9uYWwgZmllbGRzIGZvciBlYWNoIHN5bWJvbC4gICovCi0gIHN0cnVjdCBlZmRyICplY29mZl9maWxlOwotICBzdHJ1Y3QgbG9jYWxzeW0gKmVjb2ZmX3N5bWJvbDsKLSAgdmFsdWVUIGVjb2ZmX2V4dGVybl9zaXplOwotI2VuZGlmCi19OwotCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIHN0cnVjdCBlbGZfb2JqX3N5Ci0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgMAotI2RlZmluZSBUUlVFICAhRkFMU0UKLSNlbmRpZgotCi0jZGVmaW5lIG9ial9iZWdpbigpIGVsZl9iZWdpbiAoKQotZXh0ZXJuIHZvaWQgZWxmX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogc2hvdWxkIGJlIGNvbmRpdGlvbmFsIG9uIGFkZHJlc3Mgc2l6ZSEgKi8KLSNkZWZpbmUgZWxmX3N5bWJvbChhc3ltYm9sKSAoKGVsZl9zeW1ib2xfdHlwZSAqKSgmKGFzeW1ib2wpLT50aGVfYmZkKSkKLQotI2lmbmRlZiBTX0dFVF9TSVpFCi0jZGVmaW5lIFNfR0VUX1NJWkUoUykgXAotICAoZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplKQotI2VuZGlmCi0jaWZuZGVmIFNfU0VUX1NJWkUKLSNkZWZpbmUgU19TRVRfU0laRShTLFYpIFwKLSAgKGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZSA9IChWKSkKLSNlbmRpZgotCi0jaWZuZGVmIFNfR0VUX0FMSUdOCi0jZGVmaW5lIFNfR0VUX0FMSUdOKFMpIFwKLSAgKGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWUpCi0jZW5kaWYKLSNpZm5kZWYgU19TRVRfQUxJR04KLSNkZWZpbmUgU19TRVRfQUxJR04oUyxWKSBcCi0gIChlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlID0gKFYpKQotI2VuZGlmCi0KLSNkZWZpbmUgU19HRVRfT1RIRVIoUykgXAotICAoZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcikKLSNkZWZpbmUgU19TRVRfT1RIRVIoUyxWKSBcCi0gIChlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyID0gKFYpKQotCi1leHRlcm4gYXNlY3Rpb24gKmdkYl9zZWN0aW9uOwotCi0jaWZuZGVmIG9ial9mcm9iX2ZpbGUKLSNkZWZpbmUgb2JqX2Zyb2JfZmlsZSAgZWxmX2Zyb2JfZmlsZQotI2VuZGlmCi1leHRlcm4gdm9pZCBlbGZfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2lmbmRlZiBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotI2RlZmluZSBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAgZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLSNlbmRpZgotZXh0ZXJuIHZvaWQgZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIG9ial9hcHBfZmlsZSBlbGZfZmlsZV9zeW1ib2wKLWV4dGVybiB2b2lkIGVsZl9maWxlX3N5bWJvbCBQQVJBTVMgKChjaGFyICopKTsKLQotZXh0ZXJuIHZvaWQgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgb2JqX2VsZl9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgb2JqX2VsZl9wcmV2aW91cyBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIG9ial9lbGZfdmVyc2lvbiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIG9ial9lbGZfY29tbW9uIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgb2JqX2VsZl9kYXRhIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgb2JqX2VsZl90ZXh0IFBBUkFNUyAoKGludCkpOwotCi0vKiBCRkQgd2FudHMgdG8gd3JpdGUgdGhlIHVkYXRhIGZpZWxkLCB3aGljaCBpcyBhIG5vLW5vIGZvciB0aGUKLSAgIGdsb2JhbGx5IGRlZmluZWQgc2VjdGlvbnMuICAqLwotI2lmbmRlZiBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MKLSNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKFNFQykJKChTRUMpLT5vd25lciAhPSAwKQotI2VuZGlmCi0KLS8qIFdoZW4gc2V0dGluZyBvbmUgc3ltYm9sIGVxdWFsIHRvIGFub3RoZXIsIGJ5IGRlZmF1bHQgd2UgcHJvYmFibHkKLSAgIHdhbnQgdGhlbSB0byBoYXZlIHRoZSBzYW1lICJzaXplIiwgd2hhdGV2ZXIgaXQgbWVhbnMgaW4gdGhlIGN1cnJlbnQKLSAgIGNvbnRleHQuICAqLwotI2lmbmRlZiBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUwotI2RlZmluZSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyhERVNULFNSQykJCQlcCi1kbwkJCQkJCQkJXAotICB7CQkJCQkJCQlcCi0gICAgc3RydWN0IGVsZl9vYmpfc3kgKnNyY2VsZiA9IHN5bWJvbF9nZXRfb2JqIChTUkMpOwkJXAotICAgIHN0cnVjdCBlbGZfb2JqX3N5ICpkZXN0ZWxmID0gc3ltYm9sX2dldF9vYmogKERFU1QpOwkJXAotICAgIGlmIChzcmNlbGYtPnNpemUpCQkJCQkJXAotICAgICAgewkJCQkJCQkJXAotCWlmIChkZXN0ZWxmLT5zaXplID09IE5VTEwpCQkJCVwKLQkgIGRlc3RlbGYtPnNpemUgPQkJCQkJXAotCSAgICAoZXhwcmVzc2lvblMgKikgeG1hbGxvYyAoc2l6ZW9mIChleHByZXNzaW9uUykpOwlcCi0JKmRlc3RlbGYtPnNpemUgPSAqc3JjZWxmLT5zaXplOwkJCQlcCi0gICAgICB9CQkJCQkJCQlcCi0gICAgZWxzZQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQlcCi0JaWYgKGRlc3RlbGYtPnNpemUgIT0gTlVMTCkJCQkJXAotCSAgZnJlZSAoZGVzdGVsZi0+c2l6ZSk7CQkJCQlcCi0JZGVzdGVsZi0+c2l6ZSA9IE5VTEw7CQkJCQlcCi0gICAgICB9CQkJCQkJCQlcCi0gICAgU19TRVRfU0laRSAoKERFU1QpLCBTX0dFVF9TSVpFIChTUkMpKTsJCQlcCi0gICAgU19TRVRfT1RIRVIgKChERVNUKSwgU19HRVRfT1RIRVIgKFNSQykpOwkJCVwKLSAgfQkJCQkJCQkJXAotd2hpbGUgKDApCi0jZW5kaWYKLQotLyogU3RhYnMgZ28gaW4gYSBzZXBhcmF0ZSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyAxCi0KLS8qIFdlIG5lZWQgMTIgYnl0ZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIHRvIGhvbGQgc29tZSBpbml0aWFsCi0gICBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gdm9pZCBvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uIFBBUkFNUyAoKHNlZ1QpKTsKLSNkZWZpbmUgSU5JVF9TVEFCX1NFQ1RJT04oc2VnKSBvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCi0KLSNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKLS8qIFdlIHNtdWdnbGUgc3RhYnMgaW4gRUNPRkYgcmF0aGVyIHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSBzZWN0aW9uLgotICAgVGhlIElyaXggbGlua2VyIGNhbiBub3QgaGFuZGxlIGEgc2VwYXJhdGUgc3RhYnMgc2VjdGlvbi4gICovCi0KLSN1bmRlZiAgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUwotI2RlZmluZSBTRVBBUkFURV9TVEFCX1NFQ1RJT05TICghRUNPRkZfREVCVUdHSU5HKQotCi0jdW5kZWYgIElOSVRfU1RBQl9TRUNUSU9OCi0jZGVmaW5lIElOSVRfU1RBQl9TRUNUSU9OKHNlZykgXAotICAoKHZvaWQpKEVDT0ZGX0RFQlVHR0lORyA/IDAgOiAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKSwgMCkpKQotCi0jdW5kZWYgT0JKX1BST0NFU1NfU1RBQgotI2RlZmluZSBPQkpfUFJPQ0VTU19TVEFCKHNlZywgd2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYykJCVwKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykJCQkJCQkJXAotICAgIGVjb2ZmX3N0YWIgKChzZWcpLCAod2hhdCksIChzdHJpbmcpLCAodHlwZSksIChvdGhlciksIChkZXNjKSkKLSNlbmRpZiAvKiBFQ09GRl9ERUJVR0dJTkcgKi8KLQotZXh0ZXJuIHZvaWQgZWxmX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50ICopKTsKLSNpZm5kZWYgb2JqX2Zyb2Jfc3ltYm9sCi0jZGVmaW5lIG9ial9mcm9iX3N5bWJvbChzeW1wLCBwdW50KSBlbGZfZnJvYl9zeW1ib2wgKHN5bXAsICZwdW50KQotI2VuZGlmCi0KLWV4dGVybiB2b2lkIGVsZl9wb3BfaW5zZXJ0IFBBUkFNUyAoKHZvaWQpKTsKLSNpZm5kZWYgb2JqX3BvcF9pbnNlcnQKLSNkZWZpbmUgb2JqX3BvcF9pbnNlcnQoKQllbGZfcG9wX2luc2VydCgpCi0jZW5kaWYKLQotI2lmbmRlZiBPQkpfTUFZQkVfRUxGCi0jZGVmaW5lIG9ial9lY29mZl9zZXRfZXh0IGVsZl9lY29mZl9zZXRfZXh0Ci0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgZWNvZmZfZXh0cjsKLSNlbmRpZgotZXh0ZXJuIHZvaWQgZWxmX2Vjb2ZmX3NldF9leHQgUEFSQU1TICgoc3ltYm9sUyAqLCBzdHJ1Y3QgZWNvZmZfZXh0ciAqKSk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9PQkpfRUxGX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWV2YXguYyBiL2dhcy9jb25maWcvb2JqLWV2YXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxOGM4My4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ldmF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKiBvYmotZXZheC5jIC0gRVZBWCAob3BlblZNUy9BbHBoYSkgb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgS2xhdXMgS+RtcGYgKGtrYWVtcGZAcHJvZ2lzLmRlKSBvZgotICAgICBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlcgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCi0gICBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIE9CSl9IRUFERVIgIm9iai1ldmF4LmgiCi0KLSNpbmNsdWRlICJhcy5oIgotCi1zdGF0aWMgdm9pZCBzX2V2YXhfd2VhayBQQVJBTVMgKChpbnQpKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgIndlYWsiLCBzX2V2YXhfd2VhaywgMH0sCi0gIHswLCAwLCAwfSwKLX07CQkJCS8qIG9ial9wc2V1ZG9fdGFibGUgKi8KLQotdm9pZCBvYmpfcmVhZF9iZWdpbl9ob29rICgpIHt9Ci0KLS8qIEhhbmRsZSB0aGUgd2VhayBzcGVjaWZpYyBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19ldmF4X3dlYWsgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBTX1NFVF9XRUFLIChzeW1ib2xQKTsKLSAgICAgIGlmIChjID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiBvYmotZXZheC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1ldmF4LmggYi9nYXMvY29uZmlnL29iai1ldmF4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOWRiMTkuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZXZheC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG9iai1ldmF4LmgKLSAgIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkgb2YKLSAgICAgcHJvR0lTIFNvZnR3YXJlLCBBYWNoZW4sIEdlcm1hbnkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAgIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgb2JqLWV2YXguaCBhbmQgaXMgaW50ZW5kZWQgdG8gYmUgYSB0ZW1wbGF0ZSBmb3IKLSAqIG9iamVjdCBmb3JtYXQgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotICovCi0KLS8qIGRlZmluZSBhbiBvYmogc3BlY2lmaWMgbWFjcm8gb2ZmIHdoaWNoIHRhcmdldCBjcHUgYmFjayBlbmRzIG1heSBrZXkuICovCi0jZGVmaW5lIE9CSl9FVkFYIDEKLQotLyogaW5jbHVkZSB3aGF0ZXZlciB0YXJnZXQgY3B1IGlzIGFwcHJvcHJpYXRlLiAqLwotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIKLSNlbmRpZgotCi0vKgotICogU1lNQk9MUwotICovCi0KLS8qCi0gKiBJZiB5b3VyIG9iamVjdCBmb3JtYXQgbmVlZHMgdG8gcmVvcmRlciBzeW1ib2xzLCBkZWZpbmUgdGhpcy4gIFdoZW4KLSAqIGRlZmluZWQsIHN5bWJvbHMgYXJlIGtlcHQgb24gYSBkb3VibHkgbGlua2VkIGxpc3QgYW5kIGZ1bmN0aW9ucyBhcmUKLSAqIG1hZGUgYXZhaWxhYmxlIGZvciBwdXNoLCBpbnNlcnQsIGFwcGVuZCwgYW5kIGRlbGV0ZS4gIElmIG5vdCBkZWZpbmVkLAotICogc3ltYm9scyBhcmUga2VwdCBvbiBhIHNpbmdseSBsaW5rZWQgbGlzdCwgb25seSB0aGUgYXBwZW5kIGFuZCBjbGVhcgotICogZmFjaWxpdGllcyBhcmUgYXZhaWxhYmxlLCBhbmQgdGhleSBhcmUgbWFjcm9zLgotICovCi0KLS8qICNkZWZpbmUgU1lNQk9MU19ORUVEX1BBQ0tQT0lOVEVSUyAqLwotCi0vKiAgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB2b2lkICpub3RoaW5nOwotICB9Ci1vYmpfc3ltYm9sX3R5cGU7CQkvKiBzaG91bGQgYmUgdGhlIGZvcm1hdCdzIHN5bWJvbCBzdHJ1Y3R1cmUgKi8KLQotdHlwZWRlZiB2b2lkICpvYmplY3RfaGVhZGVyczsKLQotI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUgKDApCS8qIHlvdXIgbWFnaWMgbnVtYmVyICovCi0KLSNkZWZpbmUgT0JKX0VNSVRfTElORU5PKGEsYixjKQkvKiBtdXN0IGJlICpzb21ldGhpbmcqLiAgVGhpcyBuby1vcCdzIGl0IG91dC4gKi8KLQotI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rKHMpICAgICAgICB7O30KLQotI2RlZmluZSBTX1NFVF9PVEhFUihTLFYpCi0jZGVmaW5lIFNfU0VUX1RZUEUoUyxUKQotI2RlZmluZSBTX1NFVF9ERVNDKFMsRCkKLSNkZWZpbmUgU19HRVRfT1RIRVIoUykJMAotI2RlZmluZSBTX0dFVF9UWVBFKFMpCTAKLSNkZWZpbmUgU19HRVRfREVTQyhTKQkwCi0KLSNkZWZpbmUgUERTQ19TX0tfS0lORF9GUF9TVEFDSyA5Ci0jZGVmaW5lIFBEU0NfU19LX0tJTkRfRlBfUkVHSVNURVIgMTAKLSNkZWZpbmUgUERTQ19TX0tfS0lORF9OVUxMIDgKLQotI2RlZmluZSBQRFNDX1NfS19NSU5fU1RBQ0tfU0laRSAzMgotI2RlZmluZSBQRFNDX1NfS19NSU5fUkVHSVNURVJfU0laRSAyNAotI2RlZmluZSBQRFNDX1NfS19OVUxMX1NJWkUgMTYKLQotI2RlZmluZSBQRFNDX1NfTV9CQVNFX1JFR19JU19GUCAweDgwCS8qIGxvdyBieXRlICovCi0jZGVmaW5lIFBEU0NfU19NX05BVElWRSAweDEwCQkvKiBoaWdoIGJ5dGUgKi8KLSNkZWZpbmUgUERTQ19TX01fTk9fSkFDS0VUIDB4MjAJCS8qIGhpZ2ggYnl0ZSAqLwotCi0jZGVmaW5lIExLUF9TX0tfU0laRSAxNgotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2Ygb2JqLWV2YXguaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5jIGIvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWZjM2QxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBvYmotZ2VuZXJpYy5jIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgotICAgb2JqZWN0IGZvcm1hdCBzcGVjaWZpYyBzb3VyY2UgZmlsZXMuCi0KLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0vKiBUaGVzZSBjaGFycyBzdGFydCBhIGNvbW1lbnQgYW55d2hlcmUgaW4gYSBzb3VyY2UgZmlsZSAoZXhjZXB0IGluc2lkZQotICAgYW5vdGhlciBjb21tZW50ICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIG9iai1nZW5lcmljLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuaCBiL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxOGU0My4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1nZW5lcmljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb2JqLWdlbmVyaWMuaAotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBpcyBvYmotZ2VuZXJpYy5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgotICogb2JqZWN0IGZvcm1hdCBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0gKi8KLQotLyogZGVmaW5lIGFuIG9iaiBzcGVjaWZpYyBtYWNybyBvZmYgd2hpY2ggdGFyZ2V0IGNwdSBiYWNrIGVuZHMgbWF5IGtleS4gKi8KLSNkZWZpbmUgT0JKX0dFTkVSSUMgMQotCi0vKiBpbmNsdWRlIHdoYXRldmVyIHRhcmdldCBjcHUgaXMgYXBwcm9wcmlhdGUuICovCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotLyoKLSAqIFNZTUJPTFMKLSAqLwotCi0vKgotICogSWYgeW91ciBvYmplY3QgZm9ybWF0IG5lZWRzIHRvIHJlb3JkZXIgc3ltYm9scywgZGVmaW5lIHRoaXMuICBXaGVuCi0gKiBkZWZpbmVkLCBzeW1ib2xzIGFyZSBrZXB0IG9uIGEgZG91Ymx5IGxpbmtlZCBsaXN0IGFuZCBmdW5jdGlvbnMgYXJlCi0gKiBtYWRlIGF2YWlsYWJsZSBmb3IgcHVzaCwgaW5zZXJ0LCBhcHBlbmQsIGFuZCBkZWxldGUuICBJZiBub3QgZGVmaW5lZCwKLSAqIHN5bWJvbHMgYXJlIGtlcHQgb24gYSBzaW5nbHkgbGlua2VkIGxpc3QsIG9ubHkgdGhlIGFwcGVuZCBhbmQgY2xlYXIKLSAqIGZhY2lsaXRpZXMgYXJlIGF2YWlsYWJsZSwgYW5kIHRoZXkgYXJlIG1hY3Jvcy4KLSAqLwotCi0vKiAjZGVmaW5lIFNZTUJPTFNfTkVFRF9QQUNLUE9JTlRFUlMgKi8KLQotLyogICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgdm9pZCAqbm90aGluZzsKLSAgfQotCi1vYmpfc3ltYm9sX3R5cGU7CQkvKiBzaG91bGQgYmUgdGhlIGZvcm1hdCdzIHN5bWJvbCBzdHJ1Y3R1cmUgKi8KLQotdHlwZWRlZiB2b2lkICpvYmplY3RfaGVhZGVyczsKLQotLyogc3ltYm9scyBoYXZlIG5hbWVzICovCi0jZGVmaW5lIFNfR0VUX05BTUUocykJCSgiZm9vIikJLyogZ2V0IHRoZSBuYW1lIG9mIGEgc3ltYm9sUCAqLwotI2RlZmluZSBTX1NFVF9OQU1FKHMsdikJCTsKLS8qIHN5bWJvbHMgaGF2ZSBzZWdtZW50cyAqLwotI2RlZmluZSBTX0dFVF9TRUdNRU5UKHMpCShTRUdfVU5LTk9XTikKLSNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHYpCTsKLS8qIHN5bWJvbHMgbWF5IGJlIGV4dGVybmFsICovCi0jZGVmaW5lIFNfSVNfRVhURVJOQUwocykJKDApCi0jZGVmaW5lIFNfU0VUX0VYVEVSTkFMKHMpCTsKLQotLyogc3ltYm9scyBtYXkgb3IgbWF5IG5vdCBiZSBkZWZpbmVkICovCi0jZGVmaW5lIFNfSVNfREVGSU5FRChzKQkJKDApCi0KLQotI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUgKDApCS8qIHlvdXIgbWFnaWMgbnVtYmVyICovCi0KLSNkZWZpbmUgT0JKX0VNSVRfTElORU5PKGEsYixjKQkvKiBtdXN0IGJlICpzb21ldGhpbmcqLiAgVGhpcyBuby1vcCdzIGl0IG91dC4gKi8KLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIG9iai1nZW5lcmljLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWhwMzAwLmMgYi9nYXMvY29uZmlnL29iai1ocDMwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTljYzUzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWhwMzAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb2JqLWhwMzAwLmgKLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiY29uZmlnL29iai1hb3V0LmMiCi0KLS8qIEFvdXQgZmlsZSBnZW5lcmF0aW9uICYgdXRpbGl0aWVzICovCi12b2lkCi1ocDMwMF9oZWFkZXJfYXBwZW5kICh3aGVyZSwgaGVhZGVycykKLSAgICAgY2hhciAqKndoZXJlOwotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgdGNfaGVhZGVyc19ob29rIChoZWFkZXJzKTsKLQotI2RlZmluZSBETyhGSUVMRCkJXAotICB7IFwKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKCp3aGVyZSwgaGVhZGVycy0+aGVhZGVyLkZJRUxELCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5GSUVMRCkpOyBcCi0gICAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLkZJRUxEKTsgXAotICB9Ci0KLSAgRE8gKGFfaW5mbyk7Ci0gIERPIChhX3NwYXJlMSk7Ci0gIERPIChhX3NwYXJlMik7Ci0gIERPIChhX3RleHQpOyAgICAgIAotICBETyAoYV9kYXRhKTsgICAgIAotICBETyAoYV9ic3MpOyAgICAgCi0gIERPIChhX3Ryc2l6ZSk7IAotICBETyAoYV9kcnNpemUpOwotICBETyAoYV9zcGFyZTMpOwotICBETyAoYV9zcGFyZTQpOwotICBETyAoYV9zcGFyZTUpOwotICBETyAoYV9lbnRyeSk7IAotICBETyAoYV9zcGFyZTYpOwotICBETyAoYV9zcGFyZTcpOwotICBETyAoYV9zeW1zKTsgIAotICBETyAoYV9zcGFyZTgpOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotaHAzMDAuaCBiL2dhcy9jb25maWcvb2JqLWhwMzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDAwNmIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotaHAzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBvYmotaHAzMDAuaAotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgX19TVFJVQ1RfRVhFQ19PVkVSUklERV9fCi0KLXN0cnVjdCBleGVjX2J5dGVzCi17Ci0gIHVuc2lnbmVkIGNoYXIgYV9pbmZvWzRdOyAgIC8qIGFfbWFjaHR5cGUvYV9tYWdpYyAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmUxWzRdOwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmUyWzRdOwotICB1bnNpZ25lZCBjaGFyIGFfdGV4dFs0XTsgICAvKiBsZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBhX2RhdGFbNF07ICAgLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgYV9ic3NbNF07ICAgIC8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBhX3Ryc2l6ZVs0XTsgLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBhX2Ryc2l6ZVs0XTsgLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlM1s0XTsgLyogSFAgPSBwYXNjYWwgaW50ZXJmYWNlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlNFs0XTsgLyogSFAgPSBzeW1ib2wgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmU1WzRdOyAvKiBIUCA9IGRlYnVnIG5hbWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGFfZW50cnlbNF07ICAvKiBzdGFydCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTZbNF07IC8qIEhQID0gc291cmNlIGxpbmUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmU3WzRdOyAvKiBIUCA9IHZhbHVlIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBhX3N5bXNbNF07ICAgLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZThbNF07Ci19OwotCi0vKiBIb3cgYmlnIHRoZSAic3RydWN0IGV4ZWMiIGlzIG9uIGRpc2sgKi8KLSNkZWZpbmUgRVhFQ19CWVRFU19TSVpFICgxNiAqIDQpCi0KLXN0cnVjdCBleGVjCi17Ci0gIHVuc2lnbmVkIGxvbmcgYV9pbmZvOwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUxOwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUyOwotICB1bnNpZ25lZCBsb25nIGFfdGV4dDsgICAgICAKLSAgdW5zaWduZWQgbG9uZyBhX2RhdGE7ICAgICAKLSAgdW5zaWduZWQgbG9uZyBhX2JzczsgICAgIAotICB1bnNpZ25lZCBsb25nIGFfdHJzaXplOyAKLSAgdW5zaWduZWQgbG9uZyBhX2Ryc2l6ZTsKLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMzsKLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNDsKLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNTsKLSAgdW5zaWduZWQgbG9uZyBhX2VudHJ5OyAKLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNjsKLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNzsKLSAgdW5zaWduZWQgbG9uZyBhX3N5bXM7ICAKLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlODsKLX07Ci0KLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFCShPTUFHSUMpCi0jZGVmaW5lIEFPVVRfVkVSU0lPTgkweDAyCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUJMHgwYwotI2RlZmluZSBPTUFHSUMJCTB4MTA2Ci0gICAgCi0jZGVmaW5lIG9ial9oZWFkZXJfYXBwZW5kCWhwMzAwX2hlYWRlcl9hcHBlbmQKLSNpbmNsdWRlICJjb25maWcvb2JqLWFvdXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWllZWUuYyBiL2dhcy9jb25maWcvb2JqLWllZWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhMDc5OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1pZWVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjcgKzAsMCBAQAotLyogb2JqLWZvcm1hdCBmb3IgaWVlZS02OTUgcmVjb3Jkcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotCi0vKgotICBjcmVhdGVkIGJ5Ci0KLSAgc3RldmUgY2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQotICAqLwotCi0vKgotICB0aGlzIHdpbGwgaG9wZWZ1bGx5IGJlY29tZSB0aGUgcG9ydCB0aHJvdWdoIHdoaWNoIGJmZCBhbmQgZ2FzIHRhbGssCi0gIGZvciB0aGUgbW9tZW50LCBvbmx5IGllZWUgaXMga25vd24gdG8gd29yayB3ZWxsLgotICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib3V0cHV0LWZpbGUuaCIKLSNpbmNsdWRlICJmcmFncy5oIgotCi1iZmQgKmFiZmQ7Ci0KLS8qIEhvdyBtYW55IGFkZHJlc3NlcyBkb2VzIHRoZSAuYWxpZ24gdGFrZT8gKi8KLXN0YXRpYyByZWxheF9hZGRyZXNzVAotcmVsYXhfYWxpZ24gKGFkZHJlc3MsIGFsaWdubWVudCkKLSAgICAgcmVnaXN0ZXIgcmVsYXhfYWRkcmVzc1QgYWRkcmVzczsJLyogQWRkcmVzcyBub3cuICovCi0gICAgIHJlZ2lzdGVyIGxvbmcgYWxpZ25tZW50OwkvKiBBbGlnbm1lbnQgKGJpbmFyeSkuICovCi17Ci0gIHJlbGF4X2FkZHJlc3NUIG1hc2s7Ci0gIHJlbGF4X2FkZHJlc3NUIG5ld19hZGRyZXNzOwotCi0gIG1hc2sgPSB+KCh+MCkgPDwgYWxpZ25tZW50KTsKLSAgbmV3X2FkZHJlc3MgPSAoYWRkcmVzcyArIG1hc2spICYgKH5tYXNrKTsKLSAgcmV0dXJuIChuZXdfYWRkcmVzcyAtIGFkZHJlc3MpOwotfQkJCQkvKiByZWxheF9hbGlnbigpICovCi0KLS8qIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZnJhZyBjaGFpbiBhbmQgY3JlYXRlIGEgYmZkIHNlY3Rpb24KLSAgIHRvIGNvbnRhaW4gYWxsIG9mIGl0ICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHNpemVfc2VjdGlvbiwgKGFiZmQsIGlkeCksCi0gICAgICAgYmZkICogYWJmZCBBTkQKLSAgICAgICB1bnNpZ25lZCBpbnQgaWR4KQotewotICBhc2VjdGlvbiAqc2VjOwotICB1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7Ci0gIGZyYWdTICpmcmFnID0gc2VnbWVudF9pbmZvW2lkeF0uZnJhZ19yb290OwotICB3aGlsZSAoZnJhZykKLSAgICB7Ci0gICAgICBpZiAoZnJhZy0+ZnJfYWRkcmVzcyAhPSBzaXplKQotCXsKLQkgIHByaW50ZiAoXygiT3V0IG9mIHN0ZXBcbiIpKTsKLQkgIHNpemUgPSBmcmFnLT5mcl9hZGRyZXNzOwotCX0KLSAgICAgIHNpemUgKz0gZnJhZy0+ZnJfZml4OwotICAgICAgc3dpdGNoIChmcmFnLT5mcl90eXBlKQotCXsKLQljYXNlIHJzX2ZpbGw6Ci0JY2FzZSByc19vcmc6Ci0JICBzaXplICs9IGZyYWctPmZyX29mZnNldCAqIGZyYWctPmZyX3ZhcjsKLQkgIGJyZWFrOwotCWNhc2UgcnNfYWxpZ246Ci0JY2FzZSByc19hbGlnbl9jb2RlOgotCSAgewotCSAgICBhZGRyZXNzVCBvZmY7Ci0KLQkgICAgb2ZmID0gcmVsYXhfYWxpZ24gKHNpemUsIGZyYWctPmZyX29mZnNldCk7Ci0JICAgIGlmIChmcmFnLT5mcl9zdWJ0eXBlICE9IDAgJiYgb2ZmID4gZnJhZy0+ZnJfc3VidHlwZSkKLQkgICAgICBvZmYgPSAwOwotCSAgICBzaXplICs9IG9mZjsKLQkgIH0KLQl9Ci0gICAgICBmcmFnID0gZnJhZy0+ZnJfbmV4dDsKLSAgICB9Ci0gIGlmIChzaXplKQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWUgPSBzZWdtZW50X2luZm9baWR4XS5uYW1lOwotICAgICAgaWYgKG5hbWUgPT0gKGNoYXIgKikgTlVMTCkKLQl7Ci0JICBuYW1lID0gIi5kYXRhIjsKLQl9Ci0gICAgICBzZWdtZW50X2luZm9baWR4XS51c2VyX3N0dWZmID0gKGNoYXIgKikgKHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpKTsKLSAgICAgIC8qIE1ha2UgaXQgb3V0cHV0IHRocm91Z2ggaXRzZWxmICovCi0gICAgICBzZWMtPm91dHB1dF9zZWN0aW9uID0gc2VjOwotICAgICAgc2VjLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYywgc2l6ZSk7Ci0gICAgfQotfQotCi0vKiBydW4gdGhyb3VnaCBhIGZyYWcgY2hhaW4gYW5kIHdyaXRlIG91dCB0aGUgZGF0YSB0byBnbyB3aXRoIGl0ICovCi1zdGF0aWMgdm9pZAotREVGVU4gKGZpbGxfc2VjdGlvbiwgKGFiZmQsIGlkeCksCi0gICAgICAgYmZkICogYWJmZCBBTkQKLSAgICAgICB1bnNpZ25lZCBpbnQgaWR4KQotewotICBhc2VjdGlvbiAqc2VjID0gc2VnbWVudF9pbmZvW2lkeF0udXNlcl9zdHVmZjsKLSAgaWYgKHNlYykKLSAgICB7Ci0gICAgICBmcmFnUyAqZnJhZyA9IHNlZ21lbnRfaW5mb1tpZHhdLmZyYWdfcm9vdDsKLSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQgPSAwOwotICAgICAgd2hpbGUgKGZyYWcpCi0JewotCSAgdW5zaWduZWQgaW50IGZpbGxfc2l6ZTsKLQkgIHVuc2lnbmVkIGludCBjb3VudDsKLQkgIHN3aXRjaCAoZnJhZy0+ZnJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIHJzX2ZpbGw6Ci0JICAgIGNhc2UgcnNfYWxpZ246Ci0JICAgIGNhc2UgcnNfb3JnOgotCSAgICAgIGlmIChmcmFnLT5mcl9maXgpCi0JCXsKLQkJICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsCi0JCQkJCSAgICBzZWMsCi0JCQkJCSAgICBmcmFnLT5mcl9saXRlcmFsLAotCQkJCQkgICAgZnJhZy0+ZnJfYWRkcmVzcywKLQkJCQkJICAgIGZyYWctPmZyX2ZpeCk7Ci0JCX0KLQkgICAgICBvZmZzZXQgKz0gZnJhZy0+ZnJfZml4OwotCSAgICAgIGZpbGxfc2l6ZSA9IGZyYWctPmZyX3ZhcjsKLQkgICAgICBpZiAoZmlsbF9zaXplKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IG9mZiA9IGZyYWctPmZyX2ZpeDsKLQkJICBmb3IgKGNvdW50ID0gZnJhZy0+ZnJfb2Zmc2V0OyBjb3VudDsgY291bnQtLSkKLQkJICAgIHsKLQkJICAgICAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsCi0JCQkJCQlmcmFnLT5mcl9saXRlcmFsICsKLQkJCQkJCWZyYWctPmZyX2ZpeCwKLQkJCQkJCWZyYWctPmZyX2FkZHJlc3MgKyBvZmYsCi0JCQkJCQlmaWxsX3NpemUpOwotCQkgICAgICBvZmYgKz0gZmlsbF9zaXplOwotCQkgICAgfQotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotCX0KLSAgICB9Ci19Ci0KLS8qIENvdW50IHRoZSByZWxvY2F0aW9ucyBpbiBhIGNoYWluICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLURFRlVOIChjb3VudF9lbnRyaWVzX2luX2NoYWluLCAoaWR4KSwKLSAgICAgICB1bnNpZ25lZCBpbnQgaWR4KQotewotICB1bnNpZ25lZCBpbnQgbnJlbG9jczsKLSAgZml4UyAqZml4dXBfcHRyOwotCi0gIC8qIENvdW50IHRoZSByZWxvY2F0aW9ucyAqLwotICBmaXh1cF9wdHIgPSBzZWdtZW50X2luZm9baWR4XS5maXhfcm9vdDsKLSAgbnJlbG9jcyA9IDA7Ci0gIHdoaWxlIChmaXh1cF9wdHIgIT0gKGZpeFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICBmaXh1cF9wdHIgPSBmaXh1cF9wdHItPmZ4X25leHQ7Ci0gICAgICBucmVsb2NzKys7Ci0gICAgfQotICByZXR1cm4gbnJlbG9jczsKLX0KLQotLyogb3V0cHV0IGFsbCB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbiAqLwotdm9pZAotREVGVU4gKGRvX3JlbG9jc19mb3IsIChpZHgpLAotICAgICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gIHVuc2lnbmVkIGludCBucmVsb2NzOwotICBhcmVsZW50ICoqcmVsb2NfcHRyX3ZlY3RvcjsKLSAgYXJlbGVudCAqcmVsb2NfdmVjdG9yOwotICBhc3ltYm9sICoqcHRyczsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSAoYXNlY3Rpb24gKikgKHNlZ21lbnRfaW5mb1tpZHhdLnVzZXJfc3R1ZmYpOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgZml4UyAqZnJvbTsKLSAgaWYgKHNlY3Rpb24pCi0gICAgewotICAgICAgbnJlbG9jcyA9IGNvdW50X2VudHJpZXNfaW5fY2hhaW4gKGlkeCk7Ci0KLSAgICAgIHJlbG9jX3B0cl92ZWN0b3IgPSAoYXJlbGVudCAqKikgbWFsbG9jICgobnJlbG9jcyArIDEpICogc2l6ZW9mIChhcmVsZW50ICopKTsKLSAgICAgIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICopIG1hbGxvYyAobnJlbG9jcyAqIHNpemVvZiAoYXJlbGVudCkpOwotICAgICAgcHRycyA9IChhc3ltYm9sICoqKSBtYWxsb2MgKG5yZWxvY3MgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgZnJvbSA9IHNlZ21lbnRfaW5mb1tpZHhdLmZpeF9yb290OwotICAgICAgZm9yIChpID0gMDsgaSA8IG5yZWxvY3M7IGkrKykKLQl7Ci0JICBhcmVsZW50ICp0byA9IHJlbG9jX3ZlY3RvciArIGk7Ci0JICBhc3ltYm9sICpzOwotCSAgcmVsb2NfcHRyX3ZlY3RvcltpXSA9IHRvOwotCSAgdG8tPmhvd3RvID0gKHJlbG9jX2hvd3RvX3R5cGUgKikgKGZyb20tPmZ4X3JfdHlwZSk7Ci0KLSNpZiAwCSAgLyogV2UgY2FuJ3QgcmVwcmVzZW50IGNvbXBsaWNhdGVkIHRoaW5ncyBpbiBhIHJlbG9jIHlldCAqLwotCSAgaWYgKGZyb20tPmZ4X2FkZHN5ID09IDAgfHwgZnJvbS0+Znhfc3Vic3kgIT0gMCkgYWJvcnQoKTsKLSNlbmRpZgotCi0JICBzID0gJihmcm9tLT5meF9hZGRzeS0+c3lfc3ltYm9sLnN5KTsKLQkgIHRvLT5hZGRyZXNzID0gKChjaGFyICopIChmcm9tLT5meF9mcmFnLT5mcl9hZGRyZXNzICsKLQkJCQkgICBmcm9tLT5meF93aGVyZSkpCi0JICAgIC0gKChjaGFyICopICgmKGZyb20tPmZ4X2ZyYWctPmZyX2xpdGVyYWwpKSk7Ci0JICB0by0+YWRkZW5kID0gZnJvbS0+Znhfb2Zmc2V0OwotCSAgLyogSWYgd2Uga25vdyB0aGUgc3ltYm9sIHdoaWNoIHdlIHdhbnQgdG8gcmVsb2NhdGUgdG8sIHR1cm4KLQkgICAgIHRoaXMgcmVsb2FjdGlvbiBpbnRvIGEgc2VjdGlvbiByZWxhdGl2ZS4KLQotCSAgICAgSWYgdGhpcyByZWxvY2F0aW9uIGlzIHBjcmVsYXRpdmUsIGFuZCB3ZSBrbm93IHRoZQotCSAgICAgZGVzdGluYXRpb24sIHdlIHN0aWxsIHdhbnQgdG8ga2VlcCB0aGUgcmVsb2NhdGlvbiAtIHNpbmNlCi0JICAgICB0aGUgbGlua2VyIG1pZ2h0IHJlbGF4IHNvbWUgb2YgdGhlIGJ5dGVzLCBidXQgaXQgc3RvcHMKLQkgICAgIGJlaW5nIHBjIHJlbGF0aXZlIGFuZCB0dXJucyBpbnRvIGFuIGFic29sdXRlIHJlbG9jYXRpb24uICovCi0JICBpZiAocykKLQkgICAgewotCSAgICAgIGlmICgocy0+ZmxhZ3MgJiBCU0ZfVU5ERUZJTkVEKSA9PSAwKQotCQl7Ci0JCSAgdG8tPnNlY3Rpb24gPSBzLT5zZWN0aW9uOwotCi0JCSAgLyogV2UgY2FuIHJlZmVyIGRpcmVjdGx5IHRvIHRoZSB2YWx1ZSBmaWVsZCBoZXJlLAotCQkgICAgIHJhdGhlciB0aGFuIHVzaW5nIFNfR0VUX1ZBTFVFLCBiZWNhdXNlIHRoaXMgaXMKLQkJICAgICBvbmx5IGNhbGxlZCBhZnRlciBkb19zeW1ib2xzLCB3aGljaCBzZXRzIHVwIHRoZQotCQkgICAgIHZhbHVlIGZpZWxkLiAgKi8KLQkJICB0by0+YWRkZW5kICs9IHMtPnZhbHVlOwotCi0JCSAgdG8tPnN5bV9wdHJfcHRyID0gMDsKLQkJICBpZiAodG8tPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSBwY3JlbCByZWxvY2F0aW9uLCB0aGUgYWRkZW5kIHNob3VsZCBiZSBhZGp1c3RlZCAqLwotCQkgICAgICB0by0+YWRkZW5kIC09IHRvLT5hZGRyZXNzICsgMTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHRvLT5zZWN0aW9uID0gMDsKLQkJICAqcHRycyA9ICYoZnJvbS0+ZnhfYWRkc3ktPnN5X3N5bWJvbC5zeSk7Ci0JCSAgdG8tPnN5bV9wdHJfcHRyID0gcHRyczsKLQotCQkgIGlmICh0by0+aG93dG8tPnBjcmVsX29mZnNldCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIHBjcmVsIHJlbG9jYXRpb24sIHRoZSBhZGRlbmQgc2hvdWxkIGJlIGFkanVzdGVkICovCi0JCSAgICAgIHRvLT5hZGRlbmQgLT0gdG8tPmFkZHJlc3MgLSAxOwotCQkgICAgfQotCQl9Ci0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdG8tPnNlY3Rpb24gPSAwOwotCSAgICB9Ci0KLQkgIHB0cnMrKzsKLQkgIGZyb20gPSBmcm9tLT5meF9uZXh0OwotCX0KLQotICAgICAgLyogYXR0YXRjaCB0byB0aGUgc2VjdGlvbiAqLwotICAgICAgc2VjdGlvbi0+b3JlbG9jYXRpb24gPSByZWxvY19wdHJfdmVjdG9yOwotICAgICAgc2VjdGlvbi0+cmVsb2NfY291bnQgPSBucmVsb2NzOwotICAgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0xPQUQ7Ci0gICAgfQotfQotCi0vKiBkbyB0aGUgc3ltYm9scy4uICovCi1zdGF0aWMgdm9pZAotREVGVU4gKGRvX3N5bWJvbHMsIChhYmZkKSwKLSAgICAgICBiZmQgKiBhYmZkKQotewotICBleHRlcm4gc3ltYm9sUyAqc3ltYm9sX3Jvb3RQOwotICBzeW1ib2xTICpwdHI7Ci0gIGFzeW1ib2wgKipzeW1ib2xfcHRyX3ZlYzsKLSAgYXN5bWJvbCAqc3ltYm9sX3ZlYzsKLSAgdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotCi0KLSAgZm9yIChwdHIgPSBzeW1ib2xfcm9vdFA7Ci0gICAgICAgcHRyICE9IChzeW1ib2xTICopIE5VTEw7Ci0gICAgICAgcHRyID0gcHRyLT5zeV9uZXh0KQotICAgIHsKLSAgICAgIGlmIChTRUdfTk9STUFMIChwdHItPnN5X3N5bWJvbC5zZWcpKQotCXsKLQkgIHB0ci0+c3lfc3ltYm9sLnN5LnNlY3Rpb24gPQotCSAgICAoYXNlY3Rpb24gKikgKHNlZ21lbnRfaW5mb1twdHItPnN5X3N5bWJvbC5zZWddLnVzZXJfc3R1ZmYpOwotCSAgU19TRVRfVkFMVUUgKHB0ciwgU19HRVRfVkFMVUUgKHB0cikgKyBwdHItPnN5X2ZyYWctPmZyX2FkZHJlc3MpOwotCSAgaWYgKHB0ci0+c3lfc3ltYm9sLnN5LmZsYWdzID09IDApCi0JICAgIHsKLQkgICAgICBwdHItPnN5X3N5bWJvbC5zeS5mbGFncyA9IEJTRl9MT0NBTDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKHB0ci0+c3lfc3ltYm9sLnNlZykKLQkgICAgewotCSAgICBjYXNlIFNFR19BQlNPTFVURToKLQkgICAgICBwdHItPnN5X3N5bWJvbC5zeS5mbGFncyB8PSBCU0ZfQUJTT0xVVEU7Ci0JICAgICAgcHRyLT5zeV9zeW1ib2wuc3kuc2VjdGlvbiA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU0VHX1VOS05PV046Ci0JICAgICAgcHRyLT5zeV9zeW1ib2wuc3kuZmxhZ3MgPSBCU0ZfVU5ERUZJTkVEOwotCSAgICAgIHB0ci0+c3lfc3ltYm9sLnN5LnNlY3Rpb24gPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JfQotICAgICAgcHRyLT5zeV9zeW1ib2wuc3kudmFsdWUgPSBTX0dFVF9WQUxVRSAocHRyKTsKLSAgICAgIGNvdW50Kys7Ci0gICAgfQotICBzeW1ib2xfcHRyX3ZlYyA9IChhc3ltYm9sICoqKSBtYWxsb2MgKChjb3VudCArIDEpICogc2l6ZW9mIChhc3ltYm9sICopKTsKLQotICBpbmRleCA9IDA7Ci0gIGZvciAocHRyID0gc3ltYm9sX3Jvb3RQOwotICAgICAgIHB0ciAhPSAoc3ltYm9sUyAqKSBOVUxMOwotICAgICAgIHB0ciA9IHB0ci0+c3lfbmV4dCkKLSAgICB7Ci0gICAgICBzeW1ib2xfcHRyX3ZlY1tpbmRleF0gPSAmKHB0ci0+c3lfc3ltYm9sLnN5KTsKLSAgICAgIGluZGV4Kys7Ci0gICAgfQotICBzeW1ib2xfcHRyX3ZlY1tpbmRleF0gPSAwOwotICBhYmZkLT5vdXRzeW1ib2xzID0gc3ltYm9sX3B0cl92ZWM7Ci0gIGFiZmQtPnN5bWNvdW50ID0gY291bnQ7Ci19Ci0KLS8qIFRoZSBnZW5lcmljIGFzLT5iZmQgY29udmVydGVyLiBPdGhlciBiYWNrZW5kcyBtYXkgaGF2ZSBzcGVjaWFsIGNhc2UKLSAgIGNvZGUgKi8KLQotdm9pZAotREVGVU5fVk9JRCAoYmZkX2FzX3dyaXRlX2hvb2spCi17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgc2l6ZV9zZWN0aW9uIChhYmZkLCBpKTsKLSAgICB9Ci0KLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIGZpbGxfc2VjdGlvbiAoYWJmZCwgaSk7Ci0KLSAgZG9fc3ltYm9scyAoYWJmZCk7Ci0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICBkb19yZWxvY3NfZm9yIChpKTsKLQotfQotCi1TX1NFVF9TRUdNRU5UICh4LCB5KQotICAgICBzeW1ib2xTICp4OwotICAgICBpbnQgeTsKLXsKLSAgeC0+c3lfc3ltYm9sLnNlZyA9IHk7Ci19Ci0KLVNfSVNfREVGSU5FRCAoeCkKLSAgICAgc3ltYm9sUyAqeDsKLXsKLSAgaWYgKFNFR19OT1JNQUwgKHgtPnN5X3N5bWJvbC5zZWcpKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgc3dpdGNoICh4LT5zeV9zeW1ib2wuc2VnKQotICAgIHsKLSAgICBjYXNlIFNFR19VTktOT1dOOgotICAgICAgcmV0dXJuIDA7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotU19JU19FWFRFUk5BTCAoeCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLVNfR0VUX0RFU0MgKHgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1TX0dFVF9TRUdNRU5UICh4KQotICAgICBzeW1ib2xTICp4OwotewotICByZXR1cm4geC0+c3lfc3ltYm9sLnNlZzsKLX0KLQotU19TRVRfRVhURVJOQUwgKHgpCi0gICAgIHN5bWJvbFMgKng7Ci17Ci0gIHgtPnN5X3N5bWJvbC5zeS5mbGFncyB8PSBCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVDsKLX0KLQotU19TRVRfTkFNRSAoeCwgeSkKLSAgICAgc3ltYm9sUyAqeDsKLSAgICAgY2hhciAqeTsKLXsKLSAgeC0+c3lfc3ltYm9sLnN5Lm5hbWUgPSB5OwotfQotCi1TX0dFVF9PVEhFUiAoeCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLVNfSVNfREVCVUcgKHgpCi17Ci0gIGFib3J0ICgpOwotfQotCi0jaWZuZGVmIHNlZ21lbnRfbmFtZQotY2hhciAqCi1zZWdtZW50X25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0jZW5kaWYKLQotdm9pZAotb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotfQotCi1zdGF0aWMgdm9pZAotb2JqX2llZWVfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBleHRlcm4gY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOwotICBleHRlcm4gY2hhciBpc19lbmRfb2ZfbGluZVtdOwotICBjaGFyICpwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaGFyICpzID0gcDsKLSAgaW50IGk7Ci0gIC8qIExvb2sgdXAgdGhlIG5hbWUsIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIG1ha2UgaXQgKi8KLSAgd2hpbGUgKCpwICYmICpwICE9ICcgJyAmJiAqcCAhPSAnLCcgJiYgIWlzX2VuZF9vZl9saW5lWypwXSkKLSAgICB7Ci0gICAgICBwKys7Ci0gICAgfQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50X2luZm9baV0uaGFkb25lKQotCXsKLQkgIGlmIChzdHJuY21wIChzZWdtZW50X2luZm9baV0ubmFtZSwgcywgcCAtIHMpID09IDApCi0JICAgIHsKLQkgICAgICBnb3RvIG9rOwotCi0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0gICAgfQotICBpZiAoaSA9PSBTRUdfVU5LTk9XTikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInRvbyBtYW55IHNlY3Rpb25zIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzZWdtZW50X2luZm9baV0uaGFkb25lID0gMTsKLSAgc2VnbWVudF9pbmZvW2ldLm5hbWUgPSBtYWxsb2MgKHAgLSBzICsgMSk7Ci0gIG1lbWNweSAoc2VnbWVudF9pbmZvW2ldLm5hbWUsIHMsIHAgLSBzKTsKLSAgc2VnbWVudF9pbmZvW2ldLm5hbWVbcCAtIHNdID0gMDsKLW9rOgotICBzdWJzZWdfc2V0IChpLCAwKTsKLSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsqcF0pCi0gICAgcCsrOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotCi19Ci0KLQotdm9pZCBjb25zICgpOwotdm9pZCBzX2lnbm9yZSAoKTsKLQotCi12b2lkIHNfZ2xvYmwgKCk7Ci1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJzZWN0aW9uIiwgb2JqX2llZWVfc2VjdGlvbiwgMH0sCi0gIHsiZGF0YS5iIiwgY29ucywgMX0sCi0gIHsiZGF0YS53IiwgY29ucywgMn0sCi0gIHsiZGF0YS5sIiwgY29ucywgNH0sCi0gIHsiZXhwb3J0Iiwgc19nbG9ibCwgMH0sCi0gIHsib3B0aW9uIiwgc19pZ25vcmUsIDB9LAotICB7ImVuZCIsIHNfaWdub3JlLCAwfSwKLSAgeyJpbXBvcnQiLCBzX2lnbm9yZSwgMH0sCi0gIHsic2RhdGEiLCBzdHJpbmdlciwgMH0sCi0gIDAsCi0KLX07Ci0KLQotCi12b2lkCi1vYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBzeW1ib2xQLT5zeV9zeW1ib2wuc3kudGhlX2JmZCA9IGFiZmQ7Ci19Ci0KLQotCi0KLQotI2lmIDEKLWV4dGVybiB2b2lkCi1ERUZVTl9WT0lEICh3cml0ZV9vYmplY3RfZmlsZSkKLXsKLSAgaW50IGk7Ci0gIHN0cnVjdCBmcmNoYWluICpmcmNoYWluX3B0cjsKLSAgc3RydWN0IGZyYWcgKmZyYWdfcHRyOwotCi0gIGFiZmQgPSBiZmRfb3BlbncgKG91dF9maWxlX25hbWUsICJpZWVlIik7Ci0KLSAgaWYgKGFiZmQgPT0gMCkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjcmVhdGUgJXMiKSwgb3V0X2ZpbGVfbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpOwotICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfaDgzMDAsIDApOwotICBzdWJzZWdfc2V0ICgxLCAwKTsKLSAgc3Vic2VnX3NldCAoMiwgMCk7Ci0gIHN1YnNlZ19zZXQgKDMsIDApOwotICBmb3IgKGZyY2hhaW5fcHRyID0gZnJjaGFpbl9yb290OwotICAgICAgIGZyY2hhaW5fcHRyICE9IChzdHJ1Y3QgZnJjaGFpbiAqKSBOVUxMOwotICAgICAgIGZyY2hhaW5fcHRyID0gZnJjaGFpbl9wdHItPmZyY2hfbmV4dCkKLSAgICB7Ci0gICAgICAvKiBSdW4gdGhyb3VnaCBhbGwgdGhlIHN1Yi1zZWdtZW50cyBhbmQgYWxpZ24gdGhlbSB1cC4gQWxzbyBjbG9zZSBhbnkKLQkgb3BlbiBmcmFncy4gV2UgdGFjayBhIC5maWxsIG9udG8gdGhlIGVuZCBvZiB0aGUgZnJhZyBjaGFpbiBzbwotCSB0aGF0IGFueSAuYWxpZ24ncyBzaXplIGNhbiBiZSB3b3JrZWQgYnkgbG9va2luZyBhdCB0aGUgbmV4dAotCSBmcmFnLiAgKi8KLQotICAgICAgc3Vic2VnX3NldCAoZnJjaGFpbl9wdHItPmZyY2hfc2VnLCBmcmNoYWluX3B0ci0+ZnJjaF9zdWJzZWcpOwotI2lmbmRlZiBTVUJfU0VHTUVOVF9BTElHTgotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpIDIKLSNlbmRpZgotICAgICAgZnJhZ19hbGlnbiAoU1VCX1NFR01FTlRfQUxJR04gKG5vd19zZWcpLCAwLCAwKTsKLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19ub3ctPmZyX2ZpeCA9IDA7Ci0gICAgICBrbm93IChmcmFnX25vdy0+ZnJfbmV4dCA9PSBOVUxMKTsKLSAgICB9Ci0KLSAgLyogTm93IGJ1aWxkIG9uZSBiaWcgZnJhZyBjaGFpbiBmb3IgZWFjaCBzZWdtZW50LCBsaW5rZWQgdGhyb3VnaAotCSAgIGZyX25leHQuICovCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotCi0gICAgICBmcmFnUyAqKnByZXZfZnJhZ19wdHJfcHRyOwotICAgICAgc3RydWN0IGZyY2hhaW4gKm5leHRfZnJjaGFpbl9wdHI7Ci0KLSAgICAgIC8qCXN0cnVjdCBmcmFnICoqaGVhZF9wdHIgPSBzZWdtZW50X2luZm9baV0uZnJhZ19yb290OyovCi0KLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5mcmFnX3Jvb3QgPSBzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdDsKLSNpZiAwCi0gICAgICAvKiBJbSBub3Qgc3VyZSB3aGF0IHRoaXMgaXMgZm9yICovCi0gICAgICBmb3IgKGZyY2hhaW5fcHRyID0gc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0JICAgZnJjaGFpbl9wdHIgIT0gKHN0cnVjdCBmcmNoYWluICopIE5VTEw7Ci0JICAgZnJjaGFpbl9wdHIgPSBmcmNoYWluX3B0ci0+ZnJjaF9uZXh0KQotCXsKLQkgICpoZWFkX3B0ciA9IGZyY2hhaW5fcHRyOwotCSAgaGVhZF9wdHIgPSAmZnJjaGFpbl9wdHItPm5leHQ7Ci0JfQotCi0KLSNlbmRpZgotICAgIH0KLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIHJlbGF4X3NlZ21lbnQgKHNlZ21lbnRfaW5mb1tpXS5mcmFnX3Jvb3QsIGkpOwotICAgIH0KLQotICAvKiBOb3cgdGhlIGFkZHJlc3NlcyBvZiB0aGUgZnJhZ3MgYXJlIGNvcnJlY3Qgd2l0aGluIHRoZSBzZWdtZW50ICovCi0KLSAgYmZkX2FzX3dyaXRlX2hvb2sgKCk7Ci0gIGJmZF9jbG9zZSAoYWJmZCk7Ci19Ci0KLSNlbmRpZgotCi1IX1NFVF9URVhUX1NJWkUgKGEsIGIpCi17Ci0gIGFib3J0ICgpOwotfQotCi1IX0dFVF9URVhUX1NJWkUgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLUhfU0VUX0JTU19TSVpFICgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1IX1NFVF9TVFJJTkdfU0laRSAoKQotewotICBhYm9ydCAoKTsKLX0KLQotSF9TRVRfUkVMT0NBVElPTl9TSVpFICgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1IX1NFVF9NQUdJQ19OVU1CRVIgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLUhfR0VUX0ZJTEVfU0laRSAoKQotewotICBhYm9ydCAoKTsKLX0KLQotSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIGVuZCBvZiBvYmotaWVlZS5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1pZWVlLmggYi9nYXMvY29uZmlnL29iai1pZWVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGYxMjYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotaWVlZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG9iai1pZWVlLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCRkQgMQotCi0jaW5jbHVkZSA8YmZkLmg+Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGFzeW1ib2wgc3k7Ci0gIGludCBzZWc7Ci19Ci0KLW9ial9zeW1ib2xfdHlwZTsKLQotI2RlZmluZSBTX0dFVF9OQU1FKHMpICgoKHMpLT5zeV9zeW1ib2wuc3kubmFtZSkpCi0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBpbnQgeDsKLSAgfQotCi1vYmplY3RfaGVhZGVyczsKLQotI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUgMQotCi0KLWludCBsaW5lbm9fcm9vdFA7Ci0KLQotI2RlZmluZSBJRUVFX1NUWUxFCi0KLS8qIGVuZCBvZiBvYmotaWVlZS5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1tdWx0aS5jIGIvZ2FzL2NvbmZpZy9vYmotbXVsdGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExNTA5My4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1tdWx0aS5jCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0vKiBmb28gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLW11bHRpLmggYi9nYXMvY29uZmlnL29iai1tdWx0aS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmUxZjkyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLW11bHRpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKiBoaSAqLwotCi0jaW5jbHVkZSAiZW11bC5oIgotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUgkJCQkJXAotCSh0aGlzX2Zvcm1hdC0+Zmxhdm9yKQotCi0jZGVmaW5lIG9ial9mcm9iX3N5bWJvbChTLFApCQkJCVwKLQkodGhpc19mb3JtYXQtPmZyb2Jfc3ltYm9sKSAoUywgJihQKSkKLQotI2RlZmluZSBvYmpfZnJvYl9maWxlKCkJCQkJCVwKLQkodGhpc19mb3JtYXQtPmZyb2JfZmlsZQkJCQlcCi0JID8gdGhpc19mb3JtYXQtPmZyb2JfZmlsZSAoKQkJCVwKLQkgOiAodm9pZCkgMCkKLQotI2RlZmluZSBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwkJCVwKLQkodGhpc19mb3JtYXQtPmZyb2JfZmlsZV9hZnRlcl9yZWxvY3MpCi0KLSNkZWZpbmUgb2JqX2Vjb2ZmX3NldF9leHQJCQkJXAotCSh0aGlzX2Zvcm1hdC0+ZWNvZmZfc2V0X2V4dCkKLQotI2RlZmluZSBvYmpfcG9wX2luc2VydAkJCQkJXAotCSh0aGlzX2Zvcm1hdC0+cG9wX2luc2VydCkKLQotI2RlZmluZSBvYmpfcmVhZF9iZWdpbl9ob29rKCkJCQkJXAotCSh0aGlzX2Zvcm1hdC0+cmVhZF9iZWdpbl9ob29rCQkJXAotCSA/IHRoaXNfZm9ybWF0LT5yZWFkX2JlZ2luX2hvb2sgKCkJCVwKLQkgOiAodm9pZCkgMCkKLQotI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rCQkJCVwKLQkodGhpc19mb3JtYXQtPnN5bWJvbF9uZXdfaG9vaykKLQotI2RlZmluZSBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MJCQlcCi0JKHRoaXNfZm9ybWF0LT5zZWNfc3ltX29rX2Zvcl9yZWxvYykKLQotI2RlZmluZSBTX0dFVF9TSVpFCQkJCQlcCi0JKHRoaXNfZm9ybWF0LT5zX2dldF9zaXplKQotCi0jZGVmaW5lIFNfU0VUX1NJWkUJCQkJCVwKLQkodGhpc19mb3JtYXQtPnNfc2V0X3NpemUpCi0KLSNkZWZpbmUgU19HRVRfQUxJR04JCQkJCVwKLQkodGhpc19mb3JtYXQtPnNfZ2V0X2FsaWduKQotCi0jZGVmaW5lIFNfU0VUX0FMSUdOCQkJCQlcCi0JKHRoaXNfZm9ybWF0LT5zX3NldF9hbGlnbikKLQotI2RlZmluZSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyhkLHMpCQkJXAotCSh0aGlzX2Zvcm1hdC0+Y29weV9zeW1ib2xfYXR0cmlidXRlcwkJXAotCSA/IHRoaXNfZm9ybWF0LT5jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIChkLCBzKQlcCi0JIDogKHZvaWQpIDApCi0KLSNkZWZpbmUgT0JKX1BST0NFU1NfU1RBQihTRUcsVyxTLFQsTyxEKQkJCVwKLQkodGhpc19mb3JtYXQtPnByb2Nlc3Nfc3RhYgkJCVwKLQkgPyB0aGlzX2Zvcm1hdC0+cHJvY2Vzc19zdGFiIChTRUcsVyxTLFQsTyxEKQlcCi0JIDogKHZvaWQpIDApCi0KLSNpZiBkZWZpbmVkIChPQkpfTUFZQkVfRUNPRkYpIHx8IChkZWZpbmVkIChPQkpfTUFZQkVfRUxGKSAmJiBkZWZpbmVkIChUQ19NSVBTKSkKLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIDEKLSNlbmRpZgotCi0jaWZkZWYgT0JKX01BWUJFX0VMRgotLyogV2UgbmVlZCBvYmotZWxmIGZvciBPQkpfU1lNRklFTERfVFlQRSBzbyB0aGF0IHN5bWJvbF9nZXRfb2JqIGlzIGRlZmluZWQgKi8KLSNpbmNsdWRlICJvYmotZWxmLmgiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLXNvbS5jIGIvZ2FzL2NvbmZpZy9vYmotc29tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYWYxOGYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotc29tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyogU09NIG9iamVjdCBmaWxlIGZvcm1hdC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLgotCi0gICBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAotICAgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLS8qIFNPTSBkb2VzIG5vdCBuZWVkIGFueSBwc2V1ZG8tb3BzLiAgKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHtOVUxMfQotfTsKLQotc3RhdGljIGludCB2ZXJzaW9uX3NlZW4gPSAwOwotc3RhdGljIGludCBjb3B5cmlnaHRfc2VlbiA9IDA7Ci1zdGF0aWMgaW50IGNvbXBpbGVyX3NlZW4gPSAwOwotCi0vKiBVbnVzZWQgYnkgU09NLiAgKi8KLXZvaWQgb2JqX3JlYWRfYmVnaW5faG9vayAoKSB7fQotCi0vKiBIYW5kbGUgYSAuY29tcGlsZXIgZGlyZWN0aXZlLiAgIFRoaXMgaXMgaW50ZW5kZWQgdG8gY3JlYXRlIHRoZQotICAgY29tcGlsYXRpb24gdW5pdCBhdXhpbGlhcnkgaGVhZGVyIGZvciBNUEUgc3VjaCB0aGF0IHRoZSBsaW5rZWRpdG9yCi0gICBjYW4gaGFuZGxlIFNPTSBleHRyYWN0aW9uIGZyb20gYXJjaGl2ZXMuIFRoZSBmb3JtYXQgb2YgdGhlIHF1b3RlZAotICAgc3RyaW5nIGlzICJzb3VyY2VmaWxlIGxhbmd1YWdlIHZlcnNpb24iIGFuZCBpcyBkZWxpbWl0ZWQgYnkgYmxhbmtzLiovCi0KLXZvaWQKLW9ial9zb21fY29tcGlsZXIgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqYnVmOwotICBjaGFyIGM7Ci0gIGNoYXIgKmZpbGVuYW1lOwotICBjaGFyICpsYW5ndWFnZV9uYW1lOwotICBjaGFyICpwOwotICBjaGFyICp2ZXJzaW9uX2lkOwotCi0gIGlmIChjb21waWxlcl9zZWVuKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIk9ubHkgb25lIC5jb21waWxlciBwc2V1ZG8tb3AgcGVyIGZpbGUhIik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgYnVmID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB3aGlsZSAoaXNfYV9jaGFyIChuZXh0X2NoYXJfb2Zfc3RyaW5nICgpKSkKLQk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAwMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkICgiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyIpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogUGFyc2UgdGhlIHF1b3RlZCBzdHJpbmcgaW50byBpdHMgY29tcG9uZW50IHBhcnRzLiAgU2tpcCB0aGUKLSAgICAgcXVvdGUuICAqLwotICBmaWxlbmFtZSA9IGJ1ZiArIDE7Ci0gIHAgPSBmaWxlbmFtZTsKLSAgd2hpbGUgKCpwICE9ICcgJyAmJiAqcCAhPSAnXDAwMCcpCi0gICAgcCsrOwotICBpZiAoKnAgPT0gJ1wwMDAnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIi5jb21waWxlciBkaXJlY3RpdmUgbWlzc2luZyBsYW5ndWFnZSBhbmQgdmVyc2lvbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKnAgPSAnXDAwMCc7Ci0KLSAgbGFuZ3VhZ2VfbmFtZQk9ICsrcDsKLSAgd2hpbGUgKCpwICE9ICcgJyAmJiAqcCAhPSAnXDAwMCcpIHArKzsKLSAgaWYgKCpwID09ICdcMDAwJykKLSAgICB7Ci0gICAgICBhc19iYWQgKCIuY29tcGlsZXIgZGlyZWN0aXZlIG1pc3NpbmcgdmVyc2lvbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKnAgPSAnXDAwMCc7Ci0KLSAgdmVyc2lvbl9pZAk9ICsrcDsKLSAgd2hpbGUgKCpwICE9ICdcMDAwJykgcCsrOwotICAvKiBSZW1vdmUgdGhlIHRyYWlsaW5nIHF1b3RlLiAgKi8KLSAgKigtLXApID0gJ1wwMDAnOwotCi0gIGNvbXBpbGVyX3NlZW4gPSAxOwotICBpZiAoISBiZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml0IChzdGRvdXRwdXQsIGZpbGVuYW1lLCBsYW5ndWFnZV9uYW1lLAotCQkJCQkgIkdOVSBUb29scyIsIHZlcnNpb25faWQpKQotICAgIHsKLSAgICAgIGJmZF9wZXJyb3IgKHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotICAgICAgYXNfZmF0YWwgKCJGQVRBTDogQXR0YWNoaW5nIGNvbXBpbGVyIGhlYWRlciAlcyIsIHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC52ZXJzaW9uIGRpcmVjdGl2ZS4gICovCi0KLXZvaWQKLW9ial9zb21fdmVyc2lvbiAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICp2ZXJzaW9uLCBjOwotCi0gIGlmICh2ZXJzaW9uX3NlZW4pCi0gICAgewotICAgICAgYXNfYmFkIChfKCJPbmx5IG9uZSAudmVyc2lvbiBwc2V1ZG8tb3AgcGVyIGZpbGUhIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCInKQotICAgIHsKLSAgICAgIHZlcnNpb24gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlIChpc19hX2NoYXIgKG5leHRfY2hhcl9vZl9zdHJpbmcgKCkpKQotCTsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMDAwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIHF1b3RlZCBzdHJpbmciKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB2ZXJzaW9uX3NlZW4gPSAxOwotICBpZiAoYmZkX3NvbV9hdHRhY2hfYXV4X2hkciAoc3Rkb3V0cHV0LCBWRVJTSU9OX0FVWF9JRCwgdmVyc2lvbikgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX3BlcnJvciAoc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBBdHRhY2hpbmcgdmVyc2lvbiBoZWFkZXIgJXMiKSwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5jb3B5cmlnaHQgZGlyZWN0aXZlLiAgIFRoaXMgcHJvYmFibHkgaXNuJ3QgY29tcGxldGUsIGJ1dAotICAgaXQncyBvZiBkdWJpb3VzIHZhbHVlIGFueXdheSBhbmQgKElNSE8pIG5vdCB3b3J0aCB0aGUgdGltZSB0byBmaW5pc2guCi0gICBJZiB5b3UgY2FyZSBhYm91dCBjb3B5cmlnaHQgc3RyaW5ncyB0aGF0IG11Y2gsIHlvdSBmaXggaXQuICAqLwotCi12b2lkCi1vYmpfc29tX2NvcHlyaWdodCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpjb3B5cmlnaHQsIGM7Ci0KLSAgaWYgKGNvcHlyaWdodF9zZWVuKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiT25seSBvbmUgLmNvcHlyaWdodCBwc2V1ZG8tb3AgcGVyIGZpbGUhIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCInKQotICAgIHsKLSAgICAgIGNvcHlyaWdodCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKGlzX2FfY2hhciAobmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwMDAnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNvcHlyaWdodF9zZWVuID0gMTsKLSAgaWYgKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIgKHN0ZG91dHB1dCwgQ09QWVJJR0hUX0FVWF9JRCwgY29weXJpZ2h0KSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBiZmRfcGVycm9yIChzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IEF0dGFjaGluZyBjb3B5cmlnaHQgaGVhZGVyICVzIiksIHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQZXJmb3JtIGFueSBpbml0aWFsaXphdGlvbiBuZWNlc3NhcnkgZm9yIHN0YWJzIHN1cHBvcnQuCi0KLSAgIEZvciBTT00gd2UgbmVlZCB0byBjcmVhdGUgdGhlIHNwYWNlIHdoaWNoIHdpbGwgY29udGFpbiB0aGUKLSAgIHR3byBzdGFicyBzdWJzcGFjZXMuICBBZGRpdGlvbmFsbHkgd2UgbmVlZCB0byBzZXQgdXAgdGhlCi0gICBzcGFjZS9zdWJzcGFjZSByZWxhdGlvbnNoaXBzIGFuZCBzZXQgc3BhY2Uvc3Vic3BhY2UgYXR0cmlidXRlcwotICAgd2hpY2ggQkZEIGRvZXMgbm90IHVuZGVyc3RhbmQuICAqLwotCi12b2lkCi1vYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCi0gICAgIHNlZ1Qgc2VnOwotewotICBzZWdUIHNhdmVkX3NlZyA9IG5vd19zZWc7Ci0gIHNlZ1Qgc3BhY2U7Ci0gIHN1YnNlZ1Qgc2F2ZWRfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgY2hhciAqcCwgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBzdHJvZmY7Ci0KLSAgLyogTWFrZSB0aGUgc3BhY2Ugd2hpY2ggd2lsbCBjb250YWluIHRoZSBkZWJ1ZyBzdWJzcGFjZXMuICAqLwotICBzcGFjZSA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3Rkb3V0cHV0LCAiJEdEQl9ERUJVRyQiKTsKLQotICAvKiBTZXQgU09NIHNwZWNpZmljIGF0dHJpYnV0ZXMgZm9yIHRoZSBzcGFjZS4gIEluIHBhcnRpY3VsYXIgd2Ugc2V0Ci0gICAgIHRoZSBzcGFjZSAiZGVmaW5lZCIsICJwcml2YXRlIiwgInNvcnRfa2V5IiwgYW5kICJzcG51bSIgdmFsdWVzLiAKLQotICAgICBEdWUgdG8gYSBidWcgaW4gcHhkYiAoY2FsbGVkIGJ5IGhwdXggbGlua2VyKSwgdGhlIHNvcnQga2V5cwotICAgICBvZiB0aGUgdmFyaW91cyBzdGFicyBzcGFjZXMvc3Vic3BhY2VzIG5lZWQgdG8gYmUgInNtYWxsIi4gIFdlCi0gICAgIHJlc2VydmUgcmFuZ2UgNzIvNzMgd2hpY2ggYXBwZWFyIHRvIHdvcmsgd2VsbC4gICovCi0gIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIChzcGFjZSwgMSwgMSwgNzIsIDIpOwotICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNwYWNlLCAyKTsKLQotICAvKiBTZXQgdGhlIGNvbnRhaW5pbmcgc3BhY2UgZm9yIGJvdGggc3RhYiBzZWN0aW9ucyB0byBiZSAkR0RCX0RFQlVHJAotICAgICAoanVzdCBjcmVhdGVkIGFib3ZlKS4gIEFsc28gc2V0IHNvbWUgYXR0cmlidXRlcyB3aGljaCBCRkQgZG9lcwotICAgICBub3QgdW5kZXJzdGFuZC4gIEluIHBhcnRpY3VsYXIsIGFjY2VzcyBiaXRzLCBzb3J0IGtleXMsIGFuZCBsb2FkCi0gICAgIHF1YWRyYW50LiAgKi8KLSAgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgKHNlZywgc3BhY2UsIDB4MWYsIDczLCAwKTsKLSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcsIDIpOwotCi0gIC8qIE1ha2Ugc29tZSBzcGFjZSBmb3IgdGhlIGZpcnN0IHNwZWNpYWwgc3RhYiBlbnRyeSBhbmQgemVybyB0aGUgbWVtb3J5LgotICAgICBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGVuZ3RoIG9mIHRoaXMgZmlsZSdzCi0gICAgIHN0YWIgc3RyaW5nIGFuZCB0aGUgbGlrZS4gIFVzaW5nIGl0IGF2b2lkcyB0aGUgbmVlZCB0byAKLSAgICAgcmVsb2NhdGUgdGhlIHN0YWIgc3RyaW5ncy4KLQotICAgICBUaGUgJEdEQl9TVFJJTkdTJCBzcGFjZSB3aWxsIGJlIGNyZWF0ZWQgYXMgYSBzaWRlIGVmZmVjdCBvZgotICAgICB0aGUgY2FsbCB0byBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0LiAgKi8KLSAgcCA9IGZyYWdfbW9yZSAoMTIpOwotICBtZW1zZXQgKHAsIDAsIDEyKTsKLSAgYXNfd2hlcmUgKCZmaWxlLCAodW5zaWduZWQgaW50ICopIE5VTEwpOwotICBzdHJvZmYgPSBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0IChmaWxlLCAiJEdEQl9TVFJJTkdTJCIpOwotICBrbm93IChzdHJvZmYgPT0gMSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgc3Ryb2ZmLCA0KTsKLSAgc2VnX2luZm8gKHNlZyktPnN0YWJ1LnAgPSBwOwotCi0gIC8qIFNldCB0aGUgY29udGFpbmluZyBzcGFjZSBmb3IgYm90aCBzdGFiIHNlY3Rpb25zIHRvIGJlICRHREJfREVCVUckCi0gICAgIChqdXN0IGNyZWF0ZWQgYWJvdmUpLiAgQWxzbyBzZXQgc29tZSBhdHRyaWJ1dGVzIHdoaWNoIEJGRCBkb2VzCi0gICAgIG5vdCB1bmRlcnN0YW5kLiAgSW4gcGFydGljdWxhciwgYWNjZXNzIGJpdHMsIHNvcnQga2V5cywgYW5kIGxvYWQKLSAgICAgcXVhZHJhbnQuICAqLwotICBzZWcgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LCAiJEdEQl9TVFJJTkdTJCIpOwotICBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc2VnLCBzcGFjZSwgMHgxZiwgNzIsIDApOwotICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgMik7Ci0KLSAgc3Vic2VnX3NldCAoc2F2ZWRfc2VnLCBzYXZlZF9zdWJzZWcpOwotfQotCi0vKiBGaWxsIGluIHRoZSBjb3VudHMgaW4gdGhlIGZpcnN0IGVudHJ5IGluIGEgLnN0YWJzIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3N0YWJfc2VjdGlvbnMgKGFiZmQsIHNlYywgeHh4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4eHg7Ci17Ci0gIGFzZWN0aW9uICpzdHJzZWM7Ci0gIGNoYXIgKnA7Ci0gIGludCBzdHJzeiwgbnN5bXM7Ci0KLSAgaWYgKHN0cmNtcCAoIiRHREJfU1lNQk9MUyQiLCBzZWMtPm5hbWUpKQotICAgIHJldHVybjsKLQotICBzdHJzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIiRHREJfU1RSSU5HUyQiKTsKLSAgaWYgKHN0cnNlYykKLSAgICBzdHJzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN0cnNlYyk7Ci0gIGVsc2UKLSAgICBzdHJzeiA9IDA7Ci0gIG5zeW1zID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKSAvIDEyIC0gMTsKLQotICBwID0gc2VnX2luZm8gKHNlYyktPnN0YWJ1LnA7Ci0gIGFzc2VydCAocCAhPSAwKTsKLQotICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBuc3ltcywgKGJmZF9ieXRlICopIHAgKyA2KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3Ryc3osIChiZmRfYnl0ZSAqKSBwICsgOCk7Ci19Ci0KLS8qIENhbGxlZCBsYXRlIGluIHRoZSBhc3NzZW1ibHkgcGhhc2UgdG8gYWRqdXN0IHRoZSBzcGVjaWFsCi0gICBzdGFiIGVudHJ5IGFuZCB0byBzZXQgdGhlIHN0YXJ0aW5nIGFkZHJlc3MgZm9yIGVhY2ggY29kZSBzdWJzcGFjZS4gICovCi0KLXZvaWQKLXNvbV9mcm9iX2ZpbGUgKCkKLXsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGFkanVzdF9zdGFiX3NlY3Rpb25zLCAoUFRSKSAwKTsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLXNvbS5oIGIvZ2FzL2NvbmZpZy9vYmotc29tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDg3YjEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotc29tLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBTT00gb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuCi0KLSAgIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0gICBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0jaWZuZGVmIF9PQkpfU09NX0gKLSNkZWZpbmUgX09CSl9TT01fSAotCi0jZGVmaW5lIE9CSl9TT00gMQotCi0jaW5jbHVkZSA8YmZkLmg+Ci0jaW5jbHVkZSAiYmZkL3NvbS5oIgotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgMAotI2RlZmluZSBUUlVFICFGQUxTRQotI2VuZGlmCi0KLS8qIHNob3VsZCBiZSBjb25kaXRpb25hbCBvbiBhZGRyZXNzIHNpemUhICAqLwotI2RlZmluZSBzb21fc3ltYm9sKGFzeW1ib2wpICgoc29tX3N5bWJvbF90eXBlICopKCYoYXN5bWJvbCktPnRoZV9iZmQpKQotCi1leHRlcm4gdm9pZCBzb21fZmlsZV9zeW1ib2wgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBvYmpfc29tX3ZlcnNpb24gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uIFBBUkFNUyAoKHNlZ1QpKTsKLWV4dGVybiB2b2lkIG9ial9zb21fY29weXJpZ2h0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgb2JqX3NvbV9jb21waWxlciBQQVJBTVMgKChpbnQpKTsKLQotI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rKHMpIHs7fQotCi0vKiBTT00gaGFzIHNldmVyYWwgYXR0cmlidXRlcyBmb3Igc3BhY2VzL3N1YnNwYWNlcyB3aGljaCBjYW4gbm90Ci0gICBiZSBlYXNpbHkgZXhwcmVzc2VkIGluIEJGRC4gIFdlIHVzZSB0aGVzZSBtYWNyb3MgdG8gdHJpZ2dlciBjYWxscwotICAgaW50byB0aGUgU09NIEJGRCBiYWNrZW5kIHRvIHNldCB0aGVzZSBhdHRyaWJ1dGVzLiAgKi8KLSNkZWZpbmUgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgIGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcwotI2RlZmluZSBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyBiZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMKLQotLyogTGlrZXdpc2UgZm9yIHN5bWJvbCB0eXBlcy4gICovCi0jZGVmaW5lIG9ial9zZXRfc3ltYm9sX3R5cGUgYmZkX3NvbV9zZXRfc3ltYm9sX3R5cGUKLQotLyogU3RhYnMgZ28gaW4gYSBzZXBhcmF0ZSBzZWN0aW9ucy4gIEdEQiBleHBlY3RzIHRvIGZpbmQgdGhlbSBpbiBzZWN0aW9ucwotICAgd2l0aCB0aGUgbmFtZXMgJEdEQl9TWU1CT0xTJCBhbmQgJEdEQl9TVFJJTkdTJCByYXRoZXIgdGhhbiAuc3RhYiBhbmQKLSAgIC5zdGFic3RyLiAgKi8KLSNkZWZpbmUgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyAxCi0jZGVmaW5lIFNUQUJfU0VDVElPTl9OQU1FICIkR0RCX1NZTUJPTFMkIgotI2RlZmluZSBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUgIiRHREJfU1RSSU5HUyQiCi0KLS8qIFdlIHVzZSBJTklUX1NUQUJfU0VDVElPTiB0byByZWNvcmQgdGhlIHNwYWNlL3N1YnNwYWNlIHJlbGF0aW9uc2hpcHMKLSAgIGZvciB0aGUgdmFyaW91cyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwotI2RlZmluZSBJTklUX1NUQUJfU0VDVElPTihzZWcpIG9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLQotLyogV2UnbGwgYmUgdXBkYXRpbmcgdGhlIG1hZ2ljIDFzdCBzdGFiIGVudHJ5IG9uY2UgdGhlIGVudGlyZSBhc3NlbWJseQotICAgZmFpbCBoYXMgYmVlbiBwcm9jZXNzZWQuICAqLwotI2RlZmluZSBvYmpfZnJvYl9maWxlKCkgc29tX2Zyb2JfZmlsZSgpCi0KLSNlbmRpZiAvKiBfT0JKX1NPTV9IICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai12bXMuYyBiL2dhcy9jb25maWcvb2JqLXZtcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjA4ZjhlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLXZtcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTU0OSArMCwwIEBACi0vKiB2bXMuYyAtLSBXcml0ZSBvdXQgYSBWQVgvVk1TIG9iamVjdCBmaWxlCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDg4LCA5MiwgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogV3JpdHRlbiBieSBEYXZpZCBMLiBLYXNodGFuICovCi0vKiBNb2RpZmllZCBieSBFcmljIFlvdW5nZGFsZSB0byB3cml0ZSBWTVMgZGVidWcgcmVjb3JkcyBmb3IgcHJvZ3JhbQotICAgdmFyaWFibGVzICovCi0KLS8qIFdhbnQgYWxsIG9mIG9iai12bXMuaCAoYXMgb2JqLWZvcm1hdC5oLCB2aWEgdGFyZy1lbnYuaCwgdmlhIGFzLmgpLiAgKi8KLSNkZWZpbmUgV0FOVF9WTVNfT0JKX0RFRlMKLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogV2hhdCB3ZSBkbyBpZiB0aGVyZSBpcyBhIGdvb2YuICovCi0jZGVmaW5lIGVycm9yIGFzX2ZhdGFsCi0KLSNpZmRlZiBWTVMJCQkvKiBUaGVzZSBhcmUgb2Ygbm8gdXNlIGlmIHdlIGFyZSBjcm9zcyBhc3NlbWJsaW5nLiAqLwotI2luY2x1ZGUgPGZhYi5oPgkJLyogRGVmaW5lIEZpbGUgQWNjZXNzIEJsb2NrCSAgKi8KLSNpbmNsdWRlIDxuYW0uaD4JCS8qIERlZmluZSBOQU0gQmxvY2sJCSAgKi8KLSNpbmNsdWRlIDx4YWIuaD4JCS8qIERlZmluZSBYQUIgLSBhbGwgZGlmZmVyZW50IHR5cGVzKi8KLWV4dGVybiBpbnQgc3lzJG9wZW4oKSwgc3lzJGNsb3NlKCksIHN5cyRhc2N0aW0oKTsKLSNlbmRpZgotCi0vKgotICoJVmVyc2lvbiBzdHJpbmcgb2YgdGhlIGNvbXBpbGVyIHRoYXQgcHJvZHVjZWQgdGhlIGNvZGUgd2UgYXJlCi0gKglhc3NlbWJsaW5nLiAgKEFuZCB0aGlzIGFzc2VtYmxlciwgaWYgd2UgZG8gbm90IGhhdmUgY29tcGlsZXIgaW5mby4pCi0gKi8KLWNoYXIgKmNvbXBpbGVyX3ZlcnNpb25fc3RyaW5nOwotCi1leHRlcm4gaW50IGZsYWdfaGFzaF9sb25nX25hbWVzOwkvKiAtKyAqLwotZXh0ZXJuIGludCBmbGFnX29uZTsJCQkvKiAtMTsgY29tcGF0aWJpbGl0eSB3aXRoIGdjYyAxLnggKi8KLWV4dGVybiBpbnQgZmxhZ19zaG93X2FmdGVyX3RydW5jOwkvKiAtSCAqLwotZXh0ZXJuIGludCBmbGFnX25vX2hhc2hfbWl4ZWRfY2FzZTsJLyogLWggTlVNICovCi0KLS8qIEZsYWcgdGhhdCBkZXRlcm1pbmVzIGhvdyB3ZSBtYXAgbmFtZXMuICBUaGlzIHRha2VzIHNldmVyYWwgdmFsdWVzLCBhbmQKLSAqIGlzIHNldCB3aXRoIHRoZSAtaCBzd2l0Y2guICBBIHZhbHVlIG9mIHplcm8gaW1wbGllcyBuYW1lcyBzaG91bGQgYmUKLSAqIHVwcGVyIGNhc2UsIGFuZCB0aGUgcHJlc2VuY2Ugb2YgdGhlIC1oIHN3aXRjaCBpbmhpYml0cyB0aGUgY2FzZSBoYWNrLgotICogTm8gLWggc3dpdGNoIGF0IGFsbCBzZXRzIHZtc19uYW1lX21hcHBpbmcgdG8gMCwgYW5kIGFsbG93cyBjYXNlIGhhY2tpbmcuCi0gKiBBIHZhbHVlIG9mIDIgKHNldCB3aXRoIC1oMikgaW1wbGllcyBuYW1lcyBzaG91bGQgYmUKLSAqIGFsbCBsb3dlciBjYXNlLCB3aXRoIG5vIGNhc2UgaGFjay4gIEEgdmFsdWUgb2YgMyAoc2V0IHdpdGggLWgzKSBpbXBsaWVzCi0gKiB0aGF0IGNhc2Ugc2hvdWxkIGJlIHByZXNlcnZlZC4gICovCi0KLS8qIElmIHRoZSAtKyBzd2l0Y2ggaXMgZ2l2ZW4sIHRoZW4gdGhlIGhhc2ggaXMgYXBwZW5kZWQgdG8gYW55IG5hbWUgdGhhdCBpcwotICogbG9uZ2VyIHRoYW4gMzEgY2hhcmFjdGVycywgcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiB0aGUgLWggc3dpdGNoLgotICovCi0KLWNoYXIgdm1zX25hbWVfbWFwcGluZyA9IDA7Ci0KLXN0YXRpYyBzeW1ib2xTICpFbnRyeV9Qb2ludF9TeW1ib2wgPSAwOwkvKiBQb2ludGVyIHRvICJfbWFpbiIgKi8KLQotLyoKLSAqCVdlIGF1Z21lbnQgdGhlICJnYXMiIHN5bWJvbCBzdHJ1Y3R1cmUgd2l0aCB0aGlzCi0gKi8KLXN0cnVjdCBWTVNfU3ltYm9sCi17Ci0gIHN0cnVjdCBWTVNfU3ltYm9sICpOZXh0OwotICBzeW1ib2xTICpTeW1ib2w7Ci0gIGludCBTaXplOwotICBpbnQgUHNlY3RfSW5kZXg7Ci0gIGludCBQc2VjdF9PZmZzZXQ7Ci19OwotCi1zdHJ1Y3QgVk1TX1N5bWJvbCAqVk1TX1N5bWJvbHMgPSAwOwotc3RydWN0IFZNU19TeW1ib2wgKkN0b3JzX1N5bWJvbHMgPSAwOwotc3RydWN0IFZNU19TeW1ib2wgKkR0b3JzX1N5bWJvbHMgPSAwOwotCi0vKiBXZSBuZWVkIHRoaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgdmFyaW91cyBpbnB1dCBmaWxlcywgc28gdGhhdCB3ZSBjYW4KLSAqIGdpdmUgdGhlIGRlYnVnZ2VyIHRoZSBjb3JyZWN0IHNvdXJjZSBsaW5lLgotICovCi0KLXN0cnVjdCBpbnB1dF9maWxlCi17Ci0gIHN0cnVjdCBpbnB1dF9maWxlICpuZXh0OwotICBzdHJ1Y3QgaW5wdXRfZmlsZSAqc2FtZV9maWxlX2ZwbnQ7Ci0gIGludCBmaWxlX251bWJlcjsKLSAgaW50IG1heF9saW5lOwotICBpbnQgbWluX2xpbmU7Ci0gIGludCBvZmZzZXQ7Ci0gIGNoYXIgZmxhZzsKLSAgY2hhciAqbmFtZTsKLSAgc3ltYm9sUyAqc3BudDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfZmlsZSAqZmlsZV9yb290ID0gKHN0cnVjdCBpbnB1dF9maWxlICopIE5VTEw7Ci0KLQotLyoKLSAqIFN0eWxlcyBvZiBQU0VDVFMgKHByb2dyYW0gc2VjdGlvbnMpIHRoYXQgd2UgZ2VuZXJhdGU7IGp1c3Qgc2hvcnRoYW5kCi0gKiB0byBhdm9pZCBsaXN0cyBvZiBzZWN0aW9uIGF0dHJpYnV0ZXMuICBVc2VkIGJ5IFZNU19Qc2VjdF9TcGVjKCkuCi0gKi8KLWVudW0gcHNfdHlwZQotewotICBwc19URVhULCBwc19EQVRBLCBwc19DT01NT04sIHBzX0NPTlNULCBwc19DVE9SUywgcHNfRFRPUlMKLX07Ci0KLS8qCi0gKiBUaGlzIGVudW0gaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSB2YXJpb3VzIHR5cGVzIG9mIHZhcmlhYmxlcyB0aGF0Ci0gKiBtYXkgYmUgcHJlc2VudC4KLSAqLwotCi1lbnVtIGFkdmFuY2VkX3R5cGUKLXsKLSAgQkFTSUMsIFBPSU5URVIsIEFSUkFZLCBFTlVNLCBTVFJVQ1QsIFVOSU9OLCBGVU5DVElPTiwgVk9JRCwgQUxJQVMsIFVOS05PV04KLX07Ci0KLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RhYnMgZGlyZWN0aXZlcywgYW5kIHRoZQotICogaW5mb3JtYXRpb24gaXMgZmlsbGVkIGluIGJ5IFZNU190eXBlZGVmX3BhcnNlLiAgRXZlcnl0aGluZyB0aGF0IGlzIG5lZWRlZAotICogdG8gZ2VuZXJhdGUgdGhlIGRlYnVnZ2luZyByZWNvcmQgZm9yIGEgZ2l2ZW4gc3ltYm9sIGlzIHByZXNlbnQgaGVyZS4KLSAqIFRoaXMgY291bGQgYmUgZG9uZSBtb3JlIGVmZmljaWVudGx5LCB1c2luZyBuZXN0ZWQgc3RydWN0L3VuaW9ucywgYnV0IGZvciBub3cKLSAqIEkgYW0gaGFwcHkgdGhhdCBpdCB3b3Jrcy4KLSAqLwotc3RydWN0IFZNU19EQkdfU3ltYm9sCi17Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqbmV4dDsKLSAgLyogZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGlzIGlzICovCi0gIGVudW0gYWR2YW5jZWRfdHlwZSBhZHZhbmNlZDsKLSAgLyogdGhpcyByZWNvcmQgaXMgZm9yIHRoaXMgdHlwZSAqLwotICBpbnQgZGJ4X3R5cGU7Ci0gIC8qIEZvciBhZHZhbmNlZCB0eXBlcyB0aGlzIGlzIHRoZSB0eXBlIHJlZmVycmVkIHRvLiAgSS5lLiwgdGhlIHR5cGUKLSAgICAgYSBwb2ludGVyIHBvaW50cyB0bywgb3IgdGhlIHR5cGUgb2Ygb2JqZWN0IHRoYXQgbWFrZXMgdXAgYW4KLSAgICAgYXJyYXkuICAqLwotICBpbnQgdHlwZTI7Ci0gIC8qIFVzZSB0aGlzIHR5cGUgd2hlbiBnZW5lcmF0aW5nIGEgdmFyaWFibGUgZGVmICovCi0gIGludCBWTVNfdHlwZTsKLSAgLyogdXNlZCBmb3IgYXJyYXlzIC0gdGhpcyB3aWxsIGJlIHByZXNlbnQgZm9yIGFsbCAqLwotICBpbnQgaW5kZXhfbWluOwotICAvKiBlbnRyaWVzLCBidXQgd2lsbCBiZSBtZWFuaW5nbGVzcyBmb3Igbm9uLWFycmF5cyAqLwotICBpbnQgaW5kZXhfbWF4OwotICAvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSBkYXRhIHR5cGUuICBGb3IgYW4gYXJyYXksIHRoaXMgaXMgdGhlIHNpemUKLSAgICAgb2Ygb25lIGVsZW1lbnQgaW4gdGhlIGFycmF5ICovCi0gIGludCBkYXRhX3NpemU7Ci0gIC8qIE51bWJlciBvZiB0aGUgc3RydWN0dXJlL3VuaW9uL2VudW0gLSB1c2VkIGZvciByZWYgKi8KLSAgaW50IHN0cnVjX251bWI7Ci19OwotCi0jZGVmaW5lIFNZTVRZUExTVF9TSVpFICgxPDw0KQkvKiAxNjsgbXVzdCBiZSBwb3dlciBvZiB0d28gKi8KLSNkZWZpbmUgU1lNVFlQX0hBU0goeCkgKCh1bnNpZ25lZCkoeCkgJiAoU1lNVFlQTFNUX1NJWkUtMSkpCi1zdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKlZNU19TeW1ib2xfdHlwZV9saXN0W1NZTVRZUExTVF9TSVpFXTsKLQotLyoKLSAqIFdlIG5lZWQgdGhpcyBzdHJ1Y3R1cmUgdG8ga2VlcCB0cmFjayBvZiBmb3J3YXJkIHJlZmVyZW5jZXMgdG8KLSAqIHN0cnVjdC91bmlvbi9lbnVtIHRoYXQgaGF2ZSBub3QgYmVlbiBkZWZpbmVkIHlldC4gIFdoZW4gdGhleSBhcmUgdWx0aW1hdGVseQotICogZGVmaW5lZCwgdGhlbiB3ZSBjYW4gZ28gYmFjayBhbmQgZ2VuZXJhdGUgdGhlIFRJUiBjb21tYW5kcyB0byBtYWtlIGEgYmFjawotICogcmVmZXJlbmNlLgotICovCi0KLXN0cnVjdCBmb3J3YXJkX3JlZgotewotICBzdHJ1Y3QgZm9yd2FyZF9yZWYgKm5leHQ7Ci0gIGludCBkYnhfdHlwZTsKLSAgaW50IHN0cnVjX251bWI7Ci0gIGNoYXIgcmVzb2x2ZWQ7Ci19OwotCi1zdHJ1Y3QgZm9yd2FyZF9yZWYgKmZfcmVmX3Jvb3QgPSAoc3RydWN0IGZvcndhcmRfcmVmICopIE5VTEw7Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBjb21wYXJlIHRoZSBuYW1lcyBvZiBjZXJ0YWluIHR5cGVzIHRvIHZhcmlvdXMKLSAqIGZpeGVkIHR5cGVzIHRoYXQgYXJlIGtub3duIGJ5IHRoZSBkZWJ1Z2dlci4KLSAqLwotI2RlZmluZSB0eXBlX2NoZWNrKFgpICAhc3RyY21wIChzeW1ib2xfbmFtZSwgWCkKLQotLyoKLSAqIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgd2UgYXJlCi0gKiB3b3JraW5nIG9uIHdoaWxlIHdlIGFyZSBwYXJzaW5nIHRoZSBzdGFicyBkaXJlY3RpdmVzLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqc3ltYm9sX25hbWU7Ci0KLS8qIFdlIHVzZSB0aGlzIGNvdW50ZXIgdG8gYXNzaWduIG51bWJlcnMgdG8gYWxsIG9mIHRoZSBzdHJ1Y3R1cmVzLCB1bmlvbnMKLSAqIGFuZCBlbnVtcyB0aGF0IHdlIGRlZmluZS4gIFdoZW4gd2UgYWN0dWFsbHkgZGVjbGFyZSBhIHZhcmlhYmxlIHRvIHRoZQotICogZGVidWdnZXIsIHdlIGNhbiBzaW1wbHkgZG8gaXQgYnkgbnVtYmVyLCByYXRoZXIgdGhhbiBkZXNjcmliaW5nIHRoZQotICogd2hvbGUgdGhpbmcgZWFjaCB0aW1lLgotICovCi0KLXN0YXRpYyBzdHJ1Y3R1cmVfY291bnQgPSAwOwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgbWFraW5nIHRoZSBsYXN0IGF0dGVtcHQgdG8KLSAgIHBhcnNlIHRoZSBzdGFicywgYW5kIHRoYXQgd2Ugc2hvdWxkIGRlZmluZSBhcyBtdWNoIGFzIHdlIGNhbiwgYW5kIGlnbm9yZQotICAgdGhlIHJlc3QgKi8KLQotc3RhdGljIGludCBmaW5hbF9wYXNzOwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBzdHJ1Y3R1cmUgbnVtYmVyCi0gKiBmb3IgYSBnaXZlbiB2YXJpYWJsZS4gIElmIHRoaXMgaXMgPCAwLCB0aGF0IG1lYW5zIHRoYXQgdGhlIHN0cnVjdHVyZQotICogaGFzIG5vdCB5ZXQgYmVlbiBkZWZpbmVkIHRvIHRoZSBkZWJ1Z2dlci4gIFRoaXMgaXMgc3RpbGwgY29vbCwgc2luY2UKLSAqIHRoZSBWTVMgb2JqZWN0IGxhbmd1YWdlIGhhcyB3YXlzIG9mIGZpeGluZyB0aGluZ3MgdXAgYWZ0ZXIgdGhlIGZhY3QsCi0gKiBzbyB3ZSBqdXN0IG1ha2UgYSBub3RlIG9mIHRoaXMsIGFuZCBnZW5lcmF0ZSBmaXh1cHMgYXQgdGhlIGVuZC4KLSAqLwotc3RhdGljIGludCBzdHJ1Y3RfbnVtYmVyOwotCi0vKiBUaGlzIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBEX2Zsb2F0IGFuZCBHX2Zsb2F0IGZvciB0ZWxsaW5nCi0gICB0aGUgZGVidWdnZXIgYWJvdXQgZG91Ymxlcy4gIGdjYyBvdXRwdXRzIHRoZSBzYW1lIC5zdGFicyByZWdhcmRsZXNzCi0gICBvZiB3aGV0aGVyIC1tZyBpcyB1c2VkIHRvIHNlbGVjdCBhbHRlcm5hdGUgZG91Ymxlcy4gICovCi0KLXN0YXRpYyBpbnQgdmF4X2dfZG91YmxlcyA9IDA7Ci0KLS8qIExvY2FsIHN5bWJvbCByZWZlcmVuY2VzICh1c2VkIHRvIGhhbmRsZSBOX0FCUyBzeW1ib2xzOyBnY2MgZG9lcyBub3QKLSAgIGdlbmVyYXRlIHRob3NlLCBidXQgdGhleSdyZSBwb3NzaWJsZSB3aXRoIGhhbmQtY29kZWQgYXNzZW1ibGVyIGlucHV0KQotICAgYXJlIGFsd2F5cyBtYWRlIHJlbGF0aXZlIHRvIHNvbWUgcGFydGljdWxhciBlbnZpcm9ubWVudC4gIElmIHRoZSBjdXJyZW50Ci0gICBpbnB1dCBoYXMgYW55IHN1Y2ggc3ltYm9scywgdGhlbiB3ZSBleHBlY3QgdGhpcyB0byBnZXQgaW5jcmVtZW50ZWQKLSAgIGV4YWN0bHkgb25jZSBhbmQgZW5kIHVwIGhhdmluZyBhbGwgb2YgdGhlbSBiZSBpbiBlbnZpcm9ubWVudCAjMC4gICovCi0KLXN0YXRpYyBpbnQgQ3VycmVudF9FbnZpcm9ubWVudCA9IC0xOwotCi0vKiBFdmVyeSBvYmplY3QgZmlsZSBtdXN0IHNwZWNpZnkgYW4gbW9kdWxlIG5hbWUsIHdoaWNoIGlzIGFsc28gdXNlZCBieQotICAgdHJhY2ViYWNrIHJlY29yZHMuICBTZXQgaW4gV3JpdGVfVk1TX01IRF9SZWNvcmRzKCkuICAqLwotCi1zdGF0aWMgY2hhciBNb2R1bGVfTmFtZVsyNTUrMV07Ci0KLS8qCi0gKiBWYXJpYWJsZSBkZXNjcmlwdG9ycyBhcmUgdXNlZCB0ZWxsIHRoZSBkZWJ1Z2dlciB0aGUgZGF0YSB0eXBlcyBvZiBjZXJ0YWluCi0gKiBtb3JlIGNvbXBsaWNhdGVkIHZhcmlhYmxlcyAoYmFzaWNhbGx5IGFueXRoaW5nIGludm9sdmluZyBhIHN0cnVjdHVyZSwKLSAqIHVuaW9uLCBlbnVtLCBhcnJheSBvciBwb2ludGVyKS4gIFNvbWUgbm9uLXBvaW50ZXIgdmFyaWFibGVzIG9mIHRoZQotICogYmFzaWMgdHlwZXMgdGhhdCB0aGUgZGVidWdnZXIga25vd3MgYWJvdXQgZG8gbm90IHJlcXVpcmUgYSB2YXJpYWJsZQotICogZGVzY3JpcHRvci4KLSAqCi0gKiBTaW5jZSBpdCBpcyBpbXBvc3NpYmxlIHRvIGhhdmUgYSB2YXJpYWJsZSBkZXNjcmlwdG9yIGxvbmdlciB0aGFuIDEyOAotICogYnl0ZXMgYnkgdmlydHVlIG9mIHRoZSB3YXkgdGhhdCB0aGUgVk1TIG9iamVjdCBsYW5ndWFnZSBpcyBzZXQgdXAsCi0gKiBpdCBtYWtlcyBub3Qgc2Vuc2UgdG8gbWFrZSB0aGUgYXJyYXlzIGFueSBsb25nZXIgdGhhbiB0aGlzLCBvciB3b3JyeWluZwotICogYWJvdXQgZHluYW1pYyBzaXppbmcgb2YgdGhlIGFycmF5LgotICoKLSAqIFRoZXNlIGFyZSB0aGUgYXJyYXlzIGFuZCBjb3VudGVycyB0aGF0IHdlIHVzZSB0byBidWlsZCBhIHZhcmlhYmxlCi0gKiBkZXNjcmlwdG9yLgotICovCi0KLSNkZWZpbmUgTUFYX0RFQlVHX1JFQ09SRCAxMjgKLXN0YXRpYyBjaGFyIExvY2FsW01BWF9ERUJVR19SRUNPUkRdOwkvKiBidWZmZXIgZm9yIHZhcmlhYmxlIGRlc2NyaXB0b3IgKi8KLXN0YXRpYyBjaGFyIEFzdWZmaXhbTUFYX0RFQlVHX1JFQ09SRF07CS8qIGJ1ZmZlciBmb3IgYXJyYXkgZGVzY3JpcHRvciAqLwotc3RhdGljIGludCBMcG50OwkJLyogaW5kZXggaW50byBMb2NhbCAqLwotc3RhdGljIGludCBBcG9pbnQ7CQkvKiBpbmRleCBpbnRvIEFzdWZmaXggKi8KLXN0YXRpYyBjaGFyIG92ZXJmbG93OwkJLyogZmxhZyB0byBpbmRpY2F0ZSB3ZSBoYXZlIHdyaXR0ZW4gdG9vIG11Y2gqLwotc3RhdGljIGludCB0b3RhbF9sZW47CQkvKiB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgbGVuZ3RoIG9mIHZhcmlhYmxlCi0JCQkJZGVzY3JpcHRvciBwbHVzIGFycmF5IGRlc2NyaXB0b3IgLSB1c2VkIGZvciBsZW4gYnl0ZSovCi0KLS8qIEZsYWcgaWYgd2UgaGF2ZSB0b2xkIHVzZXIgYWJvdXQgZmluZGluZyBnbG9iYWwgY29uc3RhbnRzIGluIHRoZSB0ZXh0Ci0gICBzZWN0aW9uLiAqLwotc3RhdGljIGludCBnYXZlX2NvbXBpbGVyX21lc3NhZ2UgPSAwOwotCi0KLS8qCi0gKglHbG9iYWwgZGF0YSAoT2JqZWN0IHJlY29yZHMgbGltaXRlZCB0byA1MTIgYnl0ZXMgYnkgVkFYLTExICJDIiBydW50aW1lKQotICovCi1zdGF0aWMgaW50IFZNU19PYmplY3RfRmlsZV9GRDsJLyogRmlsZSBEZXNjcmlwdG9yIGZvciBvYmplY3QgZmlsZSAqLwotc3RhdGljIGNoYXIgT2JqZWN0X1JlY29yZF9CdWZmZXJbNTEyXTsJLyogQnVmZmVyIGZvciBvYmplY3QgZmlsZSByZWNvcmRzICAqLwotc3RhdGljIGludCBPYmplY3RfUmVjb3JkX09mZnNldDsvKiBPZmZzZXQgdG8gZW5kIG9mIGRhdGEJICAgKi8KLXN0YXRpYyBpbnQgQ3VycmVudF9PYmplY3RfUmVjb3JkX1R5cGU7CS8qIFR5cGUgb2YgcmVjb3JkIGluIGFib3ZlCSAgICovCi0KLS8qCi0gKglNYWNyb3MgZm9yIG1vdmluZyBkYXRhIGFyb3VuZC4gIE11c3Qgd29yayBvbiBiaWctZW5kaWFuIHN5c3RlbXMuCi0gKi8KLSNpZmRlZiBWTVMgIC8qIFRoZXNlIGFyZSBtb3JlIGVmZmljaWVudCBmb3IgVk1TLT5WTVMgc3lzdGVtcyAqLwotI2RlZmluZSBDT1BZX0xPTkcoZGVzdCx2YWwpCSggKihsb25nICopKGRlc3QpID0gKHZhbCkgKQotI2RlZmluZSBDT1BZX1NIT1JUKGRlc3QsdmFsKQkoICooc2hvcnQgKikoZGVzdCkgPSAodmFsKSApCi0jZWxzZQotI2RlZmluZSBDT1BZX0xPTkcoZGVzdCx2YWwpCW1kX251bWJlcl90b19jaGFycyAoKGRlc3QpLCAodmFsKSwgNCkKLSNkZWZpbmUgQ09QWV9TSE9SVChkZXN0LHZhbCkJbWRfbnVtYmVyX3RvX2NoYXJzICgoZGVzdCksICh2YWwpLCAyKQotI2VuZGlmCi0vKgotICoJTWFjcm9zIGZvciBwbGFjaW5nIGRhdGEgaW50byB0aGUgb2JqZWN0IHJlY29yZCBidWZmZXIuCi0gKi8KLSNkZWZpbmUgUFVUX0xPTkcodmFsKSBcCi0JKCBDT1BZX0xPTkcgKCZPYmplY3RfUmVjb3JkX0J1ZmZlcltPYmplY3RfUmVjb3JkX09mZnNldF0sICh2YWwpKSwgXAotCSAgT2JqZWN0X1JlY29yZF9PZmZzZXQgKz0gNCApCi0KLSNkZWZpbmUgUFVUX1NIT1JUKHZhbCkgXAotCSggQ09QWV9TSE9SVCAoJk9iamVjdF9SZWNvcmRfQnVmZmVyW09iamVjdF9SZWNvcmRfT2Zmc2V0XSwgKHZhbCkpLCBcCi0JICBPYmplY3RfUmVjb3JkX09mZnNldCArPSAyICkKLQotI2RlZmluZSBQVVRfQ0hBUih2YWwpICggT2JqZWN0X1JlY29yZF9CdWZmZXJbT2JqZWN0X1JlY29yZF9PZmZzZXQrK10gPSAodmFsKSApCi0KLSNkZWZpbmUgUFVUX0NPVU5URURfU1RSSU5HKGNwKSBkbyB7IFwKLQkJCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKnAgPSAoY3ApOyBcCi0JCQlQVVRfQ0hBUiAoKGNoYXIpIHN0cmxlbiAocCkpOyBcCi0JCQl3aGlsZSAoKnApIFBVVF9DSEFSICgqcCsrKTsgfSB3aGlsZSAoMCkKLQotLyoKLSAqCU1hY3JvIGZvciBkZXRlcm1pbmluZyBpZiBhIE5hbWUgaGFzIHBzZWN0IGF0dHJpYnV0ZXMgYXR0YWNoZWQKLSAqCXRvIGl0LgotICovCi0jZGVmaW5lIFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HCQkiJCRQc2VjdEF0dHJpYnV0ZXNfIgotI2RlZmluZSBQU0VDVF9BVFRSSUJVVEVTX1NUUklOR19MRU5HVEgJMTgKLQotI2RlZmluZSBIQVNfUFNFQ1RfQVRUUklCVVRFUyhOYW1lKSBcCi0JCShzdHJuY21wICgoKk5hbWUgPT0gJ18nID8gTmFtZSArIDEgOiBOYW1lKSwgXAotCQkJICBQU0VDVF9BVFRSSUJVVEVTX1NUUklORywgXAotCQkJICBQU0VDVF9BVFRSSUJVVEVTX1NUUklOR19MRU5HVEgpID09IDApCi0MCi0KLSAvKiBpbjogc2VnVCAgIG91dDogTl9UWVBFIGJpdHMgKi8KLWNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXSA9Ci17Ci0gIE5fQUJTLAotICBOX1RFWFQsCi0gIE5fREFUQSwKLSAgTl9CU1MsCi0gIE5fVU5ERiwJCQkvKiB1bmtub3duICovCi0gIE5fVU5ERiwJCQkvKiBlcnJvciAqLwotICBOX1VOREYsCQkJLyogZXhwcmVzc2lvbiAqLwotICBOX1VOREYsCQkJLyogZGVidWcgKi8KLSAgTl9VTkRGLAkJCS8qIG50diAqLwotICBOX1VOREYsCQkJLyogcHR2ICovCi0gIE5fUkVHSVNURVIsCQkJLyogcmVnaXN0ZXIgKi8KLX07Ci0KLWNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tOX1RZUEUgKyAyXSA9Ci17CQkJCS8qIE5fVFlQRSA9PSAweDFFID0gMzItMiAqLwotICBTRUdfVU5LTk9XTiwJCQkvKiBOX1VOREYgPT0gMCAqLwotICBTRUdfR09PRiwKLSAgU0VHX0FCU09MVVRFLAkJCS8qIE5fQUJTID09IDIgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19URVhULAkJCS8qIE5fVEVYVCA9PSA0ICovCi0gIFNFR19HT09GLAotICBTRUdfREFUQSwJCQkvKiBOX0RBVEEgPT0gNiAqLwotICBTRUdfR09PRiwKLSAgU0VHX0JTUywJCQkvKiBOX0JTUyA9PSA4ICovCi0gIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCi0gIFNFR19SRUdJU1RFUiwJCQkvKiBkdW1teSBOX1JFR0lTVEVSIGZvciByZWdzID0gMzAgKi8KLSAgU0VHX0dPT0YsCi19OwotDAotCi0vKiBMb2NhbCBzdXBwb3J0IHJvdXRpbmVzIHdoaWNoIHJldHVybiBhIHZhbHVlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBpbnB1dF9maWxlICpmaW5kX2ZpbGUgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1zdGF0aWMgc3RydWN0IFZNU19EQkdfU3ltYm9sICpmaW5kX3N5bWJvbCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBzeW1ib2xTICpEZWZpbmVfUm91dGluZSBQQVJBTVMgKChzeW1ib2xTICosaW50LHN5bWJvbFMgKixpbnQpKTsKLQotc3RhdGljIGNoYXIgKmN2dF9pbnRlZ2VyIFBBUkFNUyAoKGNoYXIgKixpbnQgKikpOwotc3RhdGljIGNoYXIgKmZpeF9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGNoYXIgKmdldF9zdHJ1Y3RfbmFtZSBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIG9mZnNldFQgVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSBQQVJBTVMgKChzeW1ib2xTICosdW5zaWduZWQpKTsKLQotc3RhdGljIGludCBWTVNfVEJUX1NvdXJjZV9GaWxlIFBBUkFNUyAoKGNoYXIgKixpbnQpKTsKLXN0YXRpYyBpbnQgZ2VuMSBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKixpbnQpKTsKLXN0YXRpYyBpbnQgZm9yd2FyZF9yZWZlcmVuY2UgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgaW50IGZpbmFsX2ZvcndhcmRfcmVmZXJlbmNlIFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqKSk7Ci1zdGF0aWMgaW50IFZNU190eXBlZGVmX3BhcnNlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCBoYXNoX3N0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgVk1TX1BzZWN0X1NwZWMgUEFSQU1TICgoY29uc3QgY2hhciAqLGludCxlbnVtIHBzX3R5cGUsCi0JCQkJICAgc3RydWN0IFZNU19TeW1ib2wgKikpOwotCi0vKiBMb2NhbCBzdXBwb3J0IHJvdXRpbmVzIHdoaWNoIGRvbid0IGRpcmVjdGx5IHJldHVybiBhbnkgdmFsdWUuICAqLwotCi1zdGF0aWMgdm9pZCBzX2NvbnN0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgQ3JlYXRlX1ZNU19PYmplY3RfRmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBDbG9zZV9WTVNfT2JqZWN0X0ZpbGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgdm1zX3Rpcl9zdGFja19wc2VjdCBQQVJBTVMgKChpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIFBBUkFNUyAoKGNvbnN0IGNoYXIgKixpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU2V0X0RhdGEgUEFSQU1TICgoaW50LGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU3RvcmVfU3RydWN0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgVk1TX0RlZl9TdHJ1Y3QgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU2V0X1N0cnVjdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfTW9kdWxlX0JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfTW9kdWxlX0VuZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBWTVNfVEJUX1JvdXRpbmVfQmVnaW4gUEFSQU1TICgoc3ltYm9sUyAqLGludCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9Sb3V0aW5lX0VuZCBQQVJBTVMgKChpbnQsc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCBWTVNfVEJUX0Jsb2NrX0JlZ2luIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQsY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBWTVNfVEJUX0Jsb2NrX0VuZCBQQVJBTVMgKCh2YWx1ZVQpKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiBQQVJBTVMgKChpbnQsaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfU291cmNlX0xpbmVzIFBBUkFNUyAoKGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBmcHVzaCBQQVJBTVMgKChpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBycHVzaCBQQVJBTVMgKChpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBhcnJheV9zdWZmaXggUEFSQU1TICgoc3RydWN0IFZNU19EQkdfU3ltYm9sICopKTsKLXN0YXRpYyB2b2lkIG5ld19mb3J3YXJkX3JlZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGdlbmVyYXRlX3N1ZmZpeCBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKixpbnQpKTsKLXN0YXRpYyB2b2lkIGJpdGZpZWxkX3N1ZmZpeCBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKixpbnQpKTsKLXN0YXRpYyB2b2lkIHNldHVwX2Jhc2ljX3R5cGUgUEFSQU1TICgoc3RydWN0IFZNU19EQkdfU3ltYm9sICopKTsKLXN0YXRpYyB2b2lkIFZNU19EQkdfcmVjb3JkIFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqLGludCxpbnQsY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBWTVNfbG9jYWxfc3RhYl9QYXJzZSBQQVJBTVMgKChzeW1ib2xTICopKTsKLXN0YXRpYyB2b2lkIFZNU19zdGFiX3BhcnNlIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQsaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19HU1lNX1BhcnNlIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19MQ1NZTV9QYXJzZSBQQVJBTVMgKChzeW1ib2xTICosaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU1RTWU1fUGFyc2UgUEFSQU1TICgoc3ltYm9sUyAqLGludCkpOwotc3RhdGljIHZvaWQgVk1TX1JTWU1fUGFyc2UgUEFSQU1TICgoc3ltYm9sUyAqLHN5bWJvbFMgKixpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19MU1lNX1BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIERlZmluZV9Mb2NhbF9TeW1ib2xzIFBBUkFNUyAoKHN5bWJvbFMgKixzeW1ib2xTICosc3ltYm9sUyAqLGludCkpOwotc3RhdGljIHZvaWQgV3JpdGVfVk1TX01IRF9SZWNvcmRzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIFdyaXRlX1ZNU19FT01fUmVjb3JkIFBBUkFNUyAoKGludCx2YWx1ZVQpKTsKLXN0YXRpYyB2b2lkIFZNU19DYXNlX0hhY2tfU3ltYm9sIFBBUkFNUyAoKGNvbnN0IGNoYXIgKixjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19Nb2RpZnlfUHNlY3RfQXR0cmlidXRlcyBQQVJBTVMgKChjb25zdCBjaGFyICosaW50ICopKTsKLXN0YXRpYyB2b2lkIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgUEFSQU1TICgoY29uc3QgY2hhciAqLGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfTG9jYWxfRW52aXJvbm1lbnRfU2V0dXAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBWTVNfRW1pdF9HbG9iYWx2YWx1ZXMgUEFSQU1TICgodW5zaWduZWQsdW5zaWduZWQsY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBWTVNfUHJvY2VkdXJlX0VudHJ5X1B0IFBBUkFNUyAoKGNoYXIgKixpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX1NldF9Qc2VjdCBQQVJBTVMgKChpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX1N0b3JlX1JlcGVhdGVkX0RhdGEgUEFSQU1TICgoaW50LGNoYXIgKixpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UgUEFSQU1TICgoc3ltYm9sUyAqLGludCwKLQkJCQkJCSAgICBpbnQsaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19GaXhfSW5kaXJlY3RfUmVmZXJlbmNlIFBBUkFNUyAoKGludCxpbnQsZnJhZ1MgKixmcmFnUyAqKSk7Ci0KLS8qIFN1cHBvcnQgY29kZSB3aGljaCB1c2VkIHRvIGJlIGlubGluZSB3aXRoaW4gdm1zX3dyaXRlX29iamVjdF9maWxlLiAgKi8KLXN0YXRpYyB2b2lkIHZtc19maXh1cF90ZXh0X3NlY3Rpb24gUEFSQU1TICgodW5zaWduZWQsc3RydWN0IGZyYWcgKixzdHJ1Y3QgZnJhZyAqKSk7Ci1zdGF0aWMgdm9pZCBzeW50aGVzaXplX2RhdGFfc2VnbWVudCBQQVJBTVMgKCh1bnNpZ25lZCx1bnNpZ25lZCxzdHJ1Y3QgZnJhZyAqKSk7Ci1zdGF0aWMgdm9pZCB2bXNfZml4dXBfZGF0YV9zZWN0aW9uIFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkKSk7Ci1zdGF0aWMgdm9pZCBnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSBQQVJBTVMgKCh1bnNpZ25lZCx1bnNpZ25lZCkpOwotc3RhdGljIHZvaWQgbG9jYWxfc3ltYm9sc19EU1QgUEFSQU1TICgoc3ltYm9sUyAqLHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgdm1zX2J1aWxkX0RTVCBQQVJBTVMgKCh1bnNpZ25lZCkpOwotc3RhdGljIHZvaWQgdm1zX2ZpeHVwX3h0b3JzX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IFZNU19TeW1ib2wgKiwgaW50KSk7Ci0MCi0KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSBkZWZpbmVzIHRoZSBzcGVjaWFsIHR5cGVzIG9mIHBzZXVkby1vcHMgdGhhdCB3ZQotICAgdXNlIHdpdGggVk1TLiAgKi8KLQotdW5zaWduZWQgY2hhciBjb25zdF9mbGFnID0gSU5fREVGQVVMVF9TRUNUSU9OOwotCi1zdGF0aWMgdm9pZAotc19jb25zdCAoYXJnKQotICAgICBpbnQgYXJnOwkvKiAzcmQgZmllbGQgZnJvbSBvYmpfcHNldWRvX3RhYmxlW107IG5vdCBuZWVkZWQgaGVyZSAqLwotewotICAvKiBTaW5jZSB3ZSBkb24ndCBuZWVkIGBhcmcnLCB1c2UgaXQgYXMgb3VyIHNjcmF0Y2ggdmFyaWFibGUgc28gdGhhdAotICAgICB3ZSB3b24ndCBnZXQgYW55ICJub3QgdXNlZCIgd2FybmluZ3MgYWJvdXQgaXQuICAqLwotICBhcmcgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX3NldCAoU0VHX0RBVEEsIChzdWJzZWdUKSBhcmcpOwotICBjb25zdF9mbGFnID0gMTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiY29uc3QiLCBzX2NvbnN0LCAwfSwKLSAgezAsIDAsIDB9LAotfTsJCQkJLyogb2JqX3BzZXVkb190YWJsZSAqLwotCi0KLS8qIFJvdXRpbmUgdG8gcGVyZm9ybSBSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04oKS4gICovCi0KLWludAotdm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgLyoKLSAgICoJSWYgdGhlIG5ldyBzeW1ib2wgaXMgLmNvbW0gQU5EIGl0IGhhcyBhIHNpemUgb2YgemVybywKLSAgICoJd2UgaWdub3JlIGl0IChpLmUuIHRoZSBvbGQgc3ltYm9sIG92ZXJyaWRlcyBpdCkKLSAgICovCi0gIGlmIChTRUdNRU5UX1RPX1NZTUJPTF9UWVBFICgoaW50KSBub3dfc2VnKSA9PSAoTl9VTkRGIHwgTl9FWFQpCi0gICAgICAmJiBmcmFnX25vd19maXggKCkgPT0gMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJjb21waWxlciBlbWl0dGVkIHplcm8tc2l6ZSBjb21tb24gc3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIiksCi0JICAgICAgIFNfR0VUX05BTUUgKHN5bSkpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAvKgotICAgKglJZiB0aGUgb2xkIHN5bWJvbCBpcyAuY29tbSBhbmQgaXQgaGFzIGEgc2l6ZSBvZiB6ZXJvLAotICAgKgl3ZSBvdmVycmlkZSBpdCB3aXRoIHRoZSBuZXcgc3ltYm9sIHZhbHVlLgotICAgKi8KLSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bSkgJiYgU19JU19ERUZJTkVEIChzeW0pICYmIFNfR0VUX1ZBTFVFIChzeW0pID09IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiY29tcGlsZXIgcmVkZWZpbmVkIHplcm8tc2l6ZSBjb21tb24gc3ltYm9sIGAlcyciKSwKLQkgICAgICAgU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgICBzeW0tPnN5X2ZyYWcgID0gZnJhZ19ub3c7Ci0gICAgICBTX1NFVF9PVEhFUiAoc3ltLCBjb25zdF9mbGFnKTsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW0sIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgICAvKiBLZWVwIE5fRVhUIGJpdC4gICovCi0gICAgICBzeW0tPnN5X3N5bWJvbC5uX3R5cGUgfD0gU0VHTUVOVF9UT19TWU1CT0xfVFlQRSAoKGludCkgbm93X3NlZyk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogYHRjX2Zyb2JfbGFiZWwnIGhhbmRsZXIgZm9yIGNvbG9uKHN5bWJvbHMuYyksIHVzZWQgdG8gZXhhbWluZSB0aGUKLSAgIGR1bW15IGxhYmVsKHMpIGdjYyBpbnNlcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBmaWxlIGl0IGdlbmVyYXRlcy4KLSAgIGdjYyAxLnggcHV0ICJnY2NfY29tcGlsZWQuIjsgZ2NjIDIueCAoYXMgb2YgMi43KSBwdXRzICJnY2MyX2NvbXBpbGVkLiIKLSAgIGFuZCAiX19nbnVfbGFuZ3VhZ2VfPG5hbWU+IiBhbmQgcG9zc2libHkgIl9fdmF4Xzx0eXBlPl9kb3VibGVzIi4gICovCi0KLXZvaWQKLXZtc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCAoc3ltYm9sUCkKLXN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIC8qIFNwZWNpYWwgbGFiZWxzIG9ubHkgb2NjdXIgcHJpb3IgdG8gZXhwbGljaXQgc2VjdGlvbiBkaXJlY3RpdmVzLiAgKi8KLSAgaWYgKChjb25zdF9mbGFnICYgSU5fREVGQVVMVF9TRUNUSU9OKSAhPSAwKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bV9uYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0KLSAgICAgIGlmICgqc3ltX25hbWUgPT0gJ18nKQotCSsrc3ltX25hbWU7Ci0KLSAgICAgIGlmICghc3RyY21wIChzeW1fbmFtZSwgIl9fdmF4X2dfZG91YmxlcyIpKQotCXZheF9nX2RvdWJsZXMgPSAxOwotI2lmIDAJLyogbm90IG5lY2Vzc2FyeSAqLwotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoc3ltX25hbWUsICJfX3ZheF9kX2RvdWJsZXMiKSkKLQl2YXhfZ19kb3VibGVzID0gMDsKLSNlbmRpZgotI2lmIDAJLyogdGhlc2UgYXJlIHBvdGVudGlhbCBhbHRlcm5hdGl2ZXMgdG8gdGMtdmF4LmMncyBtZF9wYXJzZV9vcHRpb25zKCkgKi8KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHN5bV9uYW1lLCAiZ2NjX2NvbXBpbGVkLiIpKQotCWZsYWdfb25lID0gMTsKLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHN5bV9uYW1lLCAiX19nbnVfbGFuZ3VhZ2VfY3BsdXNwbHVzIikpCi0JZmxhZ19oYXNoX2xvbmdfbmFtZXMgPSAxOwotI2VuZGlmCi0gICAgfQotICByZXR1cm47Ci19Ci0KLQotdm9pZAotb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotICByZXR1cm47Ci19Ci0KLQotdm9pZAotb2JqX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycykKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHN5bWJvbFMgKipzeW1ib2xQUDsKLSAgaW50IHN5bWJvbF9udW1iZXIgPSAwOwotCi0gIHN5bWJvbFBQID0gJnN5bWJvbF9yb290UDsJLyogLT4gbGFzdCBzeW1ib2wgY2hhaW4gbGluay4gKi8KLSAgd2hpbGUgKChzeW1ib2xQID0gKnN5bWJvbFBQKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xQLCAxKTsKLQotICAgICAvKiBPSywgaGVyZSBpcyBob3cgd2UgZGVjaWRlIHdoaWNoIHN5bWJvbHMgZ28gb3V0IGludG8gdGhlCi0JYnJhdmUgbmV3IHN5bXRhYi4gIFN5bWJvbHMgdGhhdCBkbyBhcmU6Ci0KLQkqIHN5bWJvbHMgd2l0aCBubyBuYW1lIChzdGFiZCdzPykKLQkqIHN5bWJvbHMgd2l0aCBkZWJ1ZyBpbmZvIGluIHRoZWlyIE5fVFlQRQotCSogc3ltYm9scyB3aXRoIFwxIGFzIHRoZWlyIDNyZCBjaGFyYWN0ZXIgKG51bWVyaWMgbGFiZWxzKQotCSogImxvY2FsIGxhYmVscyIgbmVlZGVkIGZvciBQSUMgZml4dXBzCi0KLQlTeW1ib2xzIHRoYXQgZG9uJ3QgYXJlOgotCSogc3ltYm9scyB0aGF0IGFyZSByZWdpc3RlcnMKLQotCUFsbCBvdGhlciBzeW1ib2xzIGFyZSBvdXRwdXQuICBXZSBjb21wbGFpbiBpZiBhIGRlbGV0ZWQKLQlzeW1ib2wgd2FzIG1hcmtlZCBleHRlcm5hbC4gICovCi0KLSAgICAgIGlmICghU19JU19SRUdJU1RFUiAoc3ltYm9sUCkpCi0JewotCSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcisrOwotCSAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSAwOwotCSAgc3ltYm9sUFAgPSAmKHN5bWJvbF9uZXh0IChzeW1ib2xQKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1ib2xQKSB8fCAhU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiTG9jYWwgc3ltYm9sICVzIG5ldmVyIGRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCSAgICB9CQkJLyogb29wcy4gKi8KLQotCSAgLyogVW5ob29rIGl0IGZyb20gdGhlIGNoYWluLiAgKi8KLQkgICpzeW1ib2xQUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKTsKLQl9CQkJLyogaWYgdGhpcyBzeW1ib2wgc2hvdWxkIGJlIGluIHRoZSBvdXRwdXQgKi8KLQotICAgIH0JCQkvKiBmb3IgZWFjaCBzeW1ib2wgKi8KLQotICBIX1NFVF9TVFJJTkdfU0laRSAoaGVhZGVycywgc3RyaW5nX2J5dGVfY291bnQpOwotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaGVhZGVycywgc3ltYm9sX251bWJlcik7Ci19CQkJCS8qIG9ial9jcmF3bF9zeW1ib2xfY2hhaW4oKSAqLwotDAotCi0gLyoqKioqKiBWTVMgT0JKRUNUIEZJTEUgSEFDS0lORyBST1VUSU5FUyAqKioqKioqLwotCi0KLS8qIENyZWF0ZSB0aGUgVk1TIG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLUNyZWF0ZV9WTVNfT2JqZWN0X0ZpbGUgKCkKLXsKLSNpZglkZWZpbmVkKGV1bmljZSkgfHwgIWRlZmluZWQoVk1TKQotICBWTVNfT2JqZWN0X0ZpbGVfRkQgPSBjcmVhdCAob3V0X2ZpbGVfbmFtZSwgMDc3NywgInZhciIpOwotI2Vsc2UJLyogZXVuaWNlICovCi0gIFZNU19PYmplY3RfRmlsZV9GRCA9IGNyZWF0IChvdXRfZmlsZV9uYW1lLCAwLCAicmZtPXZhciIsCi0JCQkgICAgICAiY3R4PWJpbiIsICJtYmM9MTYiLCAiZGVxPTY0IiwgImZvcD10ZWYiLAotCQkJICAgICAgInNocj1uaWwiKTsKLSNlbmRpZgkvKiBldW5pY2UgKi8KLSAgLyogRGVhbCB3aXRoIGVycm9ycy4gICovCi0gIGlmIChWTVNfT2JqZWN0X0ZpbGVfRkQgPCAwKQotICAgIGFzX2ZhdGFsIChfKCJDb3VsZG4ndCBjcmVhdGUgVk1TIG9iamVjdCBmaWxlIFwiJXNcIiIpLCBvdXRfZmlsZV9uYW1lKTsKLSAgLyogSW5pdGlhbGl6ZSBvYmplY3QgZmlsZSBoYWNraW5nIHZhcmlhYmxlcy4gICovCi0gIE9iamVjdF9SZWNvcmRfT2Zmc2V0ID0gMDsKLSAgQ3VycmVudF9PYmplY3RfUmVjb3JkX1R5cGUgPSAtMTsKLX0KLQotCi0vKiBGbHVzaCB0aGUgb2JqZWN0IHJlY29yZCBidWZmZXIgdG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLUZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKQotewotICAvKiBJZiB0aGUgYnVmZmVyIGlzIGVtcHR5LCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSNpZm5kZWYgVk1TCQkJLyogRm9yIGNyb3NzLWFzc2VtYmx5IHB1cnBvc2VzLiAqLwotICB7Ci0gICAgY2hhciBSZWNMZW5bMl07Ci0KLSAgICAvKiAiVmFyaWFibGUtbGVuZ3RoIHJlY29yZCIgZmlsZXMgaGF2ZSBhIHR3byBieXRlIGxlbmd0aCBmaWVsZAotICAgICAgIHByZXBlbmRlZCB0byBlYWNoIHJlY29yZC4gIEl0J3Mgbm9ybWFsbHkgb3V0LW9mLWJhbmQsIGFuZCBuYXRpdmUKLSAgICAgICBWTVMgb3V0cHV0IHdpbGwgaW5zZXJ0IGl0IGF1dG9tYXRpY2FsbHkgZm9yIHRoaXMgdHlwZSBvZiBmaWxlLgotICAgICAgIFdoZW4gY3Jvc3MtYXNzZW1ibGluZywgd2UgbXVzdCB3cml0ZSBpdCBleHBsaWNpdGx5LiAgKi8KLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKFJlY0xlbiwgT2JqZWN0X1JlY29yZF9PZmZzZXQsIDIpOwotICAgIGlmICh3cml0ZSAoVk1TX09iamVjdF9GaWxlX0ZELCBSZWNMZW4sIDIpICE9IDIpCi0gICAgICBlcnJvciAoXygiSS9PIGVycm9yIHdyaXRpbmcgVk1TIG9iamVjdCBmaWxlIChsZW5ndGggcHJlZml4KSIpKTsKLSAgICAvKiBXZSBhbHNvIG5lZWQgdG8gZm9yY2UgdGhlIGFjdHVhbCByZWNvcmQgdG8gYmUgYW4gZXZlbiBudW1iZXIgb2YKLSAgICAgICBieXRlcy4gIEZvciBuYXRpdmUgb3V0cHV0LCB0aGF0J3MgYXV0b21hdGljOyB3aGVuIGNyb3NzLWFzc2VtYmxpbmcsCi0gICAgICAgcGFkIHdpdGggYSBOVUwgYnl0ZSBpZiBsZW5ndGggaXMgb2RkLiAgRG8gc28gX2FmdGVyXyB3cml0aW5nIHRoZQotICAgICAgIHByZS1wYWRkZWQgbGVuZ3RoLiAgU2luY2Ugb3VyIGJ1ZmZlciBpcyBkZWZpbmVkIHdpdGggZXZlbiBzaXplLAotICAgICAgIGFuIG9kZCBvZmZzZXQgaW1wbGllcyB0aGF0IGl0IGhhcyBzb21lIHJvb20gbGVmdC4gICovCi0gICAgaWYgKChPYmplY3RfUmVjb3JkX09mZnNldCAmIDEpICE9IDApCi0gICAgICBPYmplY3RfUmVjb3JkX0J1ZmZlcltPYmplY3RfUmVjb3JkX09mZnNldCsrXSA9ICdcMCc7Ci0gIH0KLSNlbmRpZiAvKiBub3QgVk1TICovCi0KLSAgLyogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIGZpbGUuICAqLwotICBpZiAod3JpdGUgKFZNU19PYmplY3RfRmlsZV9GRCwgT2JqZWN0X1JlY29yZF9CdWZmZXIsIE9iamVjdF9SZWNvcmRfT2Zmc2V0KQotICAgICAgIT0gT2JqZWN0X1JlY29yZF9PZmZzZXQpCi0gICAgZXJyb3IgKF8oIkkvTyBlcnJvciB3cml0aW5nIFZNUyBvYmplY3QgZmlsZSIpKTsKLQotICAvKiBUaGUgYnVmZmVyIGlzIG5vdyBlbXB0eS4gICovCi0gIE9iamVjdF9SZWNvcmRfT2Zmc2V0ID0gMDsKLX0KLQotCi0vKiBEZWNsYXJlIGEgcGFydGljdWxhciB0eXBlIG9mIG9iamVjdCBmaWxlIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1TZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoVHlwZSkKLSAgICAgaW50IFR5cGU7Ci17Ci0gIC8qIElmIHRoZSB0eXBlIG1hdGNoZXMsIHdlIGFyZSBkb25lLiAgKi8KLSAgaWYgKFR5cGUgPT0gQ3VycmVudF9PYmplY3RfUmVjb3JkX1R5cGUpCi0gICAgcmV0dXJuOwotICAvKiBPdGhlcndpc2U6IGZsdXNoIHRoZSBidWZmZXIuICAqLwotICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci0gIC8qIFJlbWVtYmVyIHRoZSBuZXcgdHlwZS4gICovCi0gIEN1cnJlbnRfT2JqZWN0X1JlY29yZF9UeXBlID0gVHlwZTsKLX0KLQotCi0vKiBDbG9zZSB0aGUgVk1TIE9iamVjdCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLUNsb3NlX1ZNU19PYmplY3RfRmlsZSAoKQotewotICAvKiBGbHVzaCAoc2hvdWxkIG5ldmVyIGJlIG5lY2Vzc2FyeSkgYW5kIHJlc2V0IHNhdmVkIHJlY29yZC10eXBlIGNvbnRleHQuICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoLTEpOwotCi0jaWZuZGVmIFZNUwkJCS8qIEZvciBjcm9zcy1hc3NlbWJseSBwdXJwb3Nlcy4gKi8KLSAgewotICAgIGNoYXIgUmVjTGVuWzJdOwotICAgIGludCBtaW51c19vbmUgPSAtMTsKLQotICAgIC8qIFdyaXRlIGEgMiBieXRlIHJlY29yZC1sZW5ndGggZmllbGQgb2YgLTEgaW50byB0aGUgZmlsZSwgd2hpY2gKLSAgICAgICBtZWFucyBlbmQtb2YtYmxvY2sgd2hlbiByZWFkLCBoZW5jZSBlbmQtb2YtZmlsZSB3aGVuIG9jY3VycmluZwotICAgICAgIGluIHRoZSBmaWxlJ3MgbGFzdCBibG9jay4gIEl0IGlzIG9ubHkgbmVlZGVkIGZvciB2YXJpYWJsZS1sZW5ndGgKLSAgICAgICByZWNvcmQgZmlsZXMgdHJhbnNmZXJyZWQgdG8gVk1TIGFzIGZpeGVkLWxlbmd0aCByZWNvcmQgZmlsZXMKLSAgICAgICAodHlwaWNhbCBmb3IgYmluYXJ5IEZUUDsgTkZTIHNob3VsZG4ndCBuZWVkIGl0LCBidXQgaXQgd29uJ3QgaHVydCkuICAqLwotICAgIG1kX251bWJlcl90b19jaGFycyAoUmVjTGVuLCBtaW51c19vbmUsIDIpOwotICAgIHdyaXRlIChWTVNfT2JqZWN0X0ZpbGVfRkQsIFJlY0xlbiwgMik7Ci0gIH0KLSNlbHNlCi0gICAgLyogV2hlbiB3cml0dGVuIG9uIGEgVk1TIHN5c3RlbSwgdGhlIGZpbGUgaGVhZGVyIChjZiBpbm9kZSkgd2lsbCByZWNvcmQKLSAgICAgICB0aGUgYWN0dWFsIGVuZC1vZi1maWxlIHBvc2l0aW9uIGFuZCBubyBpbmxpbmUgbWFya2VyIGlzIG5lZWRlZC4gICovCi0jZW5kaWYKLQotICBjbG9zZSAoVk1TX09iamVjdF9GaWxlX0ZEKTsKLX0KLQwKLQotIC8qKioqKiogVGV4dCBJbmZvcm1hdGlvbiBhbmQgUmVsb2NhdGlvbiByb3V0aW5lcyAqKioqKiovCi0KLQotLyogU3RhY2sgUHNlY3QgYmFzZSBmb2xsb3dlZCBieSBzaWduZWQsIHZhcnlpbmctc2l6ZWQgb2Zmc2V0LgotICAgQ29tbW9uIHRvIHNldmVyYWwgb2JqZWN0IHJlY29yZHMuICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3RfSW5kZXgsIE9mZnNldCwgRm9yY2UpCi0gICAgIGludCBQc2VjdF9JbmRleDsKLSAgICAgaW50IE9mZnNldDsKLSAgICAgaW50IEZvcmNlOwotewotICBpbnQgcHNlY3Rfd2lkdGgsIG9mZnNldF93aWR0aDsKLQotICBwc2VjdF93aWR0aCA9ICgodW5zaWduZWQpIFBzZWN0X0luZGV4ID4gMjU1KSA/IDIgOiAxOwotICBvZmZzZXRfd2lkdGggPSAoRm9yY2UgfHwgT2Zmc2V0ID4gMzI3NjcgfHwgT2Zmc2V0IDwgLTMyNzY4KSA/IDQKLQkJIDogKE9mZnNldCA+IDEyNyB8fCBPZmZzZXQgPCAtMTI4KSA/IDIgOiAxOwotI2RlZmluZSBTdGFfUChwLG8pICgoKG8pPDwxKSB8ICgocCktMSkpCi0gIC8qIGJ5dGUgb3Igd29yZCBwc2VjdDsgYnl0ZSwgd29yZCwgb3IgbG9uZ3dvcmQgb2Zmc2V0ICovCi0gIHN3aXRjaCAoU3RhX1AocHNlY3Rfd2lkdGgsb2Zmc2V0X3dpZHRoKSkKLSAgICB7Ci0gICAgICBjYXNlIFN0YV9QKDEsMSk6CVBVVF9DSEFSIChUSVJfU19DX1NUQV9QQik7Ci0JCQlQVVRfQ0hBUiAoKGNoYXIpKHVuc2lnbmVkIGNoYXIpIFBzZWN0X0luZGV4KTsKLQkJCVBVVF9DSEFSICgoY2hhcikgT2Zmc2V0KTsKLQkJCWJyZWFrOwotICAgICAgY2FzZSBTdGFfUCgxLDIpOglQVVRfQ0hBUiAoVElSX1NfQ19TVEFfUFcpOwotCQkJUFVUX0NIQVIgKChjaGFyKSh1bnNpZ25lZCBjaGFyKSBQc2VjdF9JbmRleCk7Ci0JCQlQVVRfU0hPUlQgKE9mZnNldCk7Ci0JCQlicmVhazsKLSAgICAgIGNhc2UgU3RhX1AoMSw0KToJUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1BMKTsKLQkJCVBVVF9DSEFSICgoY2hhcikodW5zaWduZWQgY2hhcikgUHNlY3RfSW5kZXgpOwotCQkJUFVUX0xPTkcgKE9mZnNldCk7Ci0JCQlicmVhazsKLSAgICAgIGNhc2UgU3RhX1AoMiwxKToJUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1dQQik7Ci0JCQlQVVRfU0hPUlQgKFBzZWN0X0luZGV4KTsKLQkJCVBVVF9DSEFSICgoY2hhcikgT2Zmc2V0KTsKLQkJCWJyZWFrOwotICAgICAgY2FzZSBTdGFfUCgyLDIpOglQVVRfQ0hBUiAoVElSX1NfQ19TVEFfV1BXKTsKLQkJCVBVVF9TSE9SVCAoUHNlY3RfSW5kZXgpOwotCQkJUFVUX1NIT1JUIChPZmZzZXQpOwotCQkJYnJlYWs7Ci0gICAgICBjYXNlIFN0YV9QKDIsNCk6CVBVVF9DSEFSIChUSVJfU19DX1NUQV9XUEwpOwotCQkJUFVUX1NIT1JUIChQc2VjdF9JbmRleCk7Ci0JCQlQVVRfTE9ORyAoT2Zmc2V0KTsKLQkJCWJyZWFrOwotICAgIH0KLSN1bmRlZiBTdGFfUAotfQotCi0KLS8qIFN0b3JlIGltbWVkaWF0ZSBkYXRhIGluIGN1cnJlbnQgUHNlY3QuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChQb2ludGVyLCBTaXplLCBSZWNvcmRfVHlwZSkKLSAgICAgY29uc3QgY2hhciAqUG9pbnRlcjsKLSAgICAgaW50IFNpemU7Ci0gICAgIGludCBSZWNvcmRfVHlwZTsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKFJlY29yZF9UeXBlKTsKLSAgLyogV2UgY2FuIG9ubHkgc3RvcmUgYXMgbW9zdCAxMjggYnl0ZXMgYXQgYSB0aW1lIGR1ZSB0byB0aGUgd2F5IHRoYXQKLSAgICAgVElSIGNvbW1hbmRzIGFyZSBlbmNvZGVkLiAgKi8KLSAgd2hpbGUgKFNpemUgPiAwKQotICAgIHsKLSAgICAgIGkgPSAoU2l6ZSA+IDEyOCkgPyAxMjggOiBTaXplOwotICAgICAgU2l6ZSAtPSBpOwotICAgICAgLyogSWYgd2UgY2Fubm90IGFjY29tbW9kYXRlIHRoaXMgcmVjb3JkLCBmbHVzaCB0aGUgYnVmZmVyLiAgKi8KLSAgICAgIGlmICgoT2JqZWN0X1JlY29yZF9PZmZzZXQgKyBpICsgMSkgPj0gc2l6ZW9mIE9iamVjdF9SZWNvcmRfQnVmZmVyKQotCUZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLSAgICAgIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgcmVjb3JkIHR5cGUuICAqLwotICAgICAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0JUFVUX0NIQVIgKFJlY29yZF9UeXBlKTsKLSAgICAgIC8qIFN0b3JlIHRoZSBjb3VudC4gIFRoZSBTdG9yZSBJbW1lZGlhdGUgVElSIGNvbW1hbmQgaXMgaW1wbGllZCBieQotICAgICAgICAgYSBuZWdhdGl2ZSBjb21tYW5kIGJ5dGUsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbW1lZGlhdGUgZGF0YQotICAgICAgICAgaXMgYWJzKGNvbW1hbmRfYnl0ZSkuICBTbywgd2Ugd3JpdGUgdGhlIG5lZ2F0ZWQgbGVuZ3RoIHZhbHVlLiAgKi8KLSAgICAgIFBVVF9DSEFSICgoY2hhcikgKC1pICYgMHhmZikpOwotICAgICAgLyogTm93IHN0b3JlIHRoZSBkYXRhLiAgKi8KLSAgICAgIHdoaWxlICgtLWkgPj0gMCkKLQlQVVRfQ0hBUiAoKlBvaW50ZXIrKyk7Ci0gICAgfQotICAvKiBGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbC4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0KLQotLyogTWFrZSBhIGRhdGEgcmVmZXJlbmNlLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19TZXRfRGF0YSAoUHNlY3RfSW5kZXgsIE9mZnNldCwgUmVjb3JkX1R5cGUsIEZvcmNlKQotICAgICBpbnQgUHNlY3RfSW5kZXg7Ci0gICAgIGludCBPZmZzZXQ7Ci0gICAgIGludCBSZWNvcmRfVHlwZTsKLSAgICAgaW50IEZvcmNlOwotewotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOwotICAvKiBJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHRoZSByZWNvcmQgdHlwZS4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChSZWNvcmRfVHlwZSk7Ci0gIC8qIFN0YWNrIHRoZSBQc2VjdCBiYXNlIHdpdGggaXRzIG9mZnNldC4gICovCi0gIHZtc190aXJfc3RhY2tfcHNlY3QgKFBzZWN0X0luZGV4LCBPZmZzZXQsIEZvcmNlKTsKLSAgLyogU2V0IHJlbG9jYXRpb24gYmFzZS4gICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUT19QSURSKTsKLSAgLyogRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotCi0KLS8qIE1ha2UgYSBkZWJ1Z2dlciByZWZlcmVuY2UgdG8gYSBzdHJ1Y3QsIHVuaW9uIG9yIGVudW0uICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1N0b3JlX1N0cnVjdCAoU3RydWN0X0luZGV4KQotICAgICBpbnQgU3RydWN0X0luZGV4OwotewotICAvKiBXZSBhcmUgd3JpdGluZyBhIGRlYnVnIHJlY29yZC4gICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0RCRyk7Ci0gIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIHJlY29yZCB0eXBlLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfREJHKTsKLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1VXKTsKLSAgUFVUX1NIT1JUIChTdHJ1Y3RfSW5kZXgpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19DVExfU1RLREwpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVE9fTCk7Ci0gIC8qIEZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQotCi0vKiBNYWtlIGEgZGVidWdnZXIgcmVmZXJlbmNlIHRvIHBhcnRpYWxseSBkZWZpbmUgYSBzdHJ1Y3QsIHVuaW9uIG9yIGVudW0uICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX0RlZl9TdHJ1Y3QgKFN0cnVjdF9JbmRleCkKLSAgICAgaW50IFN0cnVjdF9JbmRleDsKLXsKLSAgLyogV2UgYXJlIHdyaXRpbmcgYSBkZWJ1ZyByZWNvcmQuICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoT0JKX1NfQ19EQkcpOwotICAvKiBJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHRoZSByZWNvcmQgdHlwZS4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChPQkpfU19DX0RCRyk7Ci0gIFBVVF9DSEFSIChUSVJfU19DX1NUQV9VVyk7Ci0gIFBVVF9TSE9SVCAoU3RydWN0X0luZGV4KTsKLSAgUFVUX0NIQVIgKFRJUl9TX0NfQ1RMX0RGTE9DKTsKLSAgLyogRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotCi1zdGF0aWMgdm9pZAotVk1TX1NldF9TdHJ1Y3QgKFN0cnVjdF9JbmRleCkKLSAgICAgaW50IFN0cnVjdF9JbmRleDsKLXsJCQkJLyogc2VlIHByZXZpb3VzIGZ1bmN0aW9ucyBmb3IgY29tbWVudHMgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfREJHKTsKLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfREJHKTsKLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1VXKTsKLSAgUFVUX1NIT1JUIChTdHJ1Y3RfSW5kZXgpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19DVExfU1RMT0MpOwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotDAotCi0gLyoqKioqKiBUcmFjZWJhY2sgSW5mb3JtYXRpb24gcm91dGluZXMgKioqKioqLwotCi0KLS8qIFdyaXRlIHRoZSBUcmFjZWJhY2sgTW9kdWxlIEJlZ2luIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX01vZHVsZV9CZWdpbiAoKQotewotICByZWdpc3RlciBjaGFyICpjcCwgKmNwMTsKLSAgaW50IFNpemU7Ci0gIGNoYXIgTG9jYWxbMjU2XTsKLQotICAvKiBBcnJhbmdlIHRvIHN0b3JlIHRoZSBkYXRhIGxvY2FsbHkgKGxlYXZlIHJvb20gZm9yIHNpemUgYnl0ZSkuICAqLwotICBjcCA9ICZMb2NhbFsxXTsKLSAgLyogQmVnaW4gbW9kdWxlLiAgKi8KLSAgKmNwKysgPSBEU1RfU19DX01PREJFRzsKLSAgKmNwKysgPSAwOwkJLyogZmxhZ3M7IG5vdCB1c2VkICovCi0gIC8qCi0gICAqCUxhbmd1YWdlIHR5cGUgPT0gIkMiCi0gICAqCi0gICAqIChGSVhNRTogIHRoaXMgc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBpbnB1dC4uLikKLSAgICovCi0gIENPUFlfTE9ORyAoY3AsIERTVF9TX0NfQyk7Ci0gIGNwICs9IDQ7Ci0gIC8qIFN0b3JlIHRoZSBtb2R1bGUgbmFtZS4gICovCi0gICpjcCsrID0gKGNoYXIpIHN0cmxlbiAoTW9kdWxlX05hbWUpOwotICBjcDEgPSBNb2R1bGVfTmFtZTsKLSAgd2hpbGUgKCpjcDEpCi0gICAgKmNwKysgPSAqY3AxKys7Ci0gIC8qIE5vdyB3ZSBjYW4gc3RvcmUgdGhlIHJlY29yZCBzaXplLiAgKi8KLSAgU2l6ZSA9IChjcCAtIExvY2FsKTsKLSAgTG9jYWxbMF0gPSBTaXplIC0gMTsKLSAgLyogUHV0IGl0IGludG8gdGhlIG9iamVjdCByZWNvcmQuICAqLwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBTaXplLCBPQkpfU19DX1RCVCk7Ci19Ci0KLQotLyogV3JpdGUgdGhlIFRyYWNlYmFjayBNb2R1bGUgRW5kIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX01vZHVsZV9FbmQgKCkKLXsKLSAgY2hhciBMb2NhbFsyXTsKLQotICAvKiBFbmQgbW9kdWxlLiAgKi8KLSAgTG9jYWxbMF0gPSAxOwotICBMb2NhbFsxXSA9IERTVF9TX0NfTU9ERU5EOwotICAvKiBQdXQgaXQgaW50byB0aGUgb2JqZWN0IHJlY29yZC4gICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDIsIE9CSl9TX0NfVEJUKTsKLX0KLQotCi0vKiBXcml0ZSBhIFRyYWNlYmFjayBSb3V0aW5lIEJlZ2luIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX1JvdXRpbmVfQmVnaW4gKHN5bWJvbFAsIFBzZWN0KQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotICAgICBpbnQgUHNlY3Q7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKmNwLCAqY3AxOwotICBjaGFyICpOYW1lOwotICBpbnQgT2Zmc2V0OwotICBpbnQgU2l6ZTsKLSAgY2hhciBMb2NhbFs1MTJdOwotCi0gIC8qIFN0cmlwIHRoZSBsZWFkaW5nICJfIiBmcm9tIHRoZSBuYW1lLiAgKi8KLSAgTmFtZSA9IFNfR0VUX05BTUUgKHN5bWJvbFApOwotICBpZiAoKk5hbWUgPT0gJ18nKQotICAgIE5hbWUrKzsKLSAgLyogR2V0IHRoZSB0ZXh0IHBzZWN0IG9mZnNldC4gICovCi0gIE9mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLSAgLyogU2V0IHRoZSByZWNvcmQgc2l6ZS4gICovCi0gIFNpemUgPSAxICsgMSArIDQgKyAxICsgc3RybGVuIChOYW1lKTsKLSAgTG9jYWxbMF0gPSBTaXplOwotICAvKiBEU1QgdHlwZSAicm91dGluZSBiZWdpbiIuICAqLwotICBMb2NhbFsxXSA9IERTVF9TX0NfUlROQkVHOwotICAvKiBVc2VzIENhbGxTL0NhbGxHLiAgKi8KLSAgTG9jYWxbMl0gPSAwOwotICAvKiBTdG9yZSB0aGUgZGF0YSBzbyBmYXIuICAqLwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCAzLCBPQkpfU19DX1RCVCk7Ci0gIC8qIE1ha2Ugc3VyZSB3ZSBhcmUgc3RpbGwgZ2VuZXJhdGluZyBhIE9CSl9TX0NfVEJUIHJlY29yZC4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChPQkpfU19DX1RCVCk7Ci0gIC8qIFN0YWNrIHRoZSBhZGRyZXNzLiAgKi8KLSAgdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3QsIE9mZnNldCwgMCk7Ci0gIC8qIFN0b3JlIHRoZSBkYXRhIHJlZmVyZW5jZS4gICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUT19QSURSKTsKLSAgLyogU3RvcmUgdGhlIGNvdW50ZWQgc3RyaW5nIGFzIGRhdGEuICAqLwotICBjcCA9IExvY2FsOwotICBjcDEgPSBOYW1lOwotICBTaXplID0gc3RybGVuIChjcDEpICsgMTsKLSAgKmNwKysgPSBTaXplIC0gMTsKLSAgd2hpbGUgKCpjcDEpCi0gICAgKmNwKysgPSAqY3AxKys7Ci0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIFNpemUsIE9CSl9TX0NfVEJUKTsKLX0KLQotCi0vKiBXcml0ZSBhIFRyYWNlYmFjayBSb3V0aW5lIEVuZCByZWNvcmQuCi0KLSAgIFdlICptdXN0KiBzZWFyY2ggdGhlIHN5bWJvbCB0YWJsZSB0byBmaW5kIHRoZSBuZXh0IHJvdXRpbmUsIHNpbmNlIHRoZQotICAgYXNzZW1iZXIgaGFzIGEgd2F5IG9mIHJlYXNzZW1ibGluZyB0aGUgc3ltYm9sIHRhYmxlIE9VVCBPRiBPUkRFUiBUaHVzCi0gICB0aGUgbmV4dCByb3V0aW5lIGluIHRoZSBzeW1ib2wgbGlzdCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIG5leHQgb25lIGluCi0gICBtZW1vcnkuICBGb3IgZGVidWdnaW5nIHRvIHdvcmsgY29ycmVjdGx5IHdlIG11c3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUKLSAgIHJvdXRpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1RCVF9Sb3V0aW5lX0VuZCAoTWF4X1NpemUsIHNwKQotICAgICBpbnQgTWF4X1NpemU7Ci0gICAgIHN5bWJvbFMgKnNwOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgU2l6ZSA9IDB4N2ZmZmZmZmY7Ci0gIGNoYXIgTG9jYWxbMTZdOwotICB2YWx1ZVQgc3ltX3ZhbHVlLCBzcF92YWx1ZSA9IFNfR0VUX1ZBTFVFIChzcCk7Ci0KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGlmICghU19JU19ERUJVRyAoc3ltYm9sUCkgJiYgU19HRVRfVFlQRSAoc3ltYm9sUCkgPT0gTl9URVhUKQotCXsKLQkgIGlmICgqU19HRVRfTkFNRSAoc3ltYm9sUCkgPT0gJ0wnKQotCSAgICBjb250aW51ZTsKLQkgIHN5bV92YWx1ZSA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgIGlmIChzeW1fdmFsdWUgPiBzcF92YWx1ZSAmJiBzeW1fdmFsdWUgPCBTaXplKQotCSAgICBTaXplID0gc3ltX3ZhbHVlOwotCi0JICAvKgotCSAgICogRHVtbXkgbGFiZWxzIGxpa2UgImdjY19jb21waWxlZC4iIHNob3VsZCBubyBsb25nZXIgcmVhY2ggaGVyZS4KLQkgICAqLwotI2lmIDAKLQkgIGVsc2UKLQkgIC8qIGNoZWNrIGlmIGdjY19jb21waWxlZC4gaGFzIHNpemUgb2YgemVybyAqLwotCSAgaWYgKHN5bV92YWx1ZSA9PSBzcF92YWx1ZSAmJgotCSAgICAgIHNwICE9IHN5bWJvbFAgJiYKLQkgICAgICAoIXN0cmNtcCAoU19HRVRfTkFNRSAoc3ApLCAiZ2NjX2NvbXBpbGVkLiIpIHx8Ci0JICAgICAgICFzdHJjbXAgKFNfR0VUX05BTUUgKHNwKSwgImdjYzJfY29tcGlsZWQuIikpKQotCSAgICBTaXplID0gc3ltX3ZhbHVlOwotI2VuZGlmCi0JfQotICAgIH0KLSAgaWYgKFNpemUgPT0gMHg3ZmZmZmZmZikKLSAgICBTaXplID0gTWF4X1NpemU7Ci0gIFNpemUgLT0gc3BfdmFsdWU7CQkvKiBhbmQgZ2V0IHRoZSBzaXplIG9mIHRoZSByb3V0aW5lICovCi0gIC8qIFJlY29yZCBTaXplLiAgKi8KLSAgTG9jYWxbMF0gPSA2OwotICAvKiBEU1QgdHlwZSBpcyAicm91dGluZSBlbmQiLiAgKi8KLSAgTG9jYWxbMV0gPSBEU1RfU19DX1JUTkVORDsKLSAgTG9jYWxbMl0gPSAwOwkJLyogdW51c2VkICovCi0gIC8qIFNpemUgb2Ygcm91dGluZS4gICovCi0gIENPUFlfTE9ORyAoJkxvY2FsWzNdLCBTaXplKTsKLSAgLyogU3RvcmUgdGhlIHJlY29yZC4gICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDcsIE9CSl9TX0NfVEJUKTsKLX0KLQotCi0vKiBXcml0ZSBhIFRyYWNlYmFjayBCbG9jayBCZWdpbiByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1RCVF9CbG9ja19CZWdpbiAoc3ltYm9sUCwgUHNlY3QsIE5hbWUpCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0gICAgIGludCBQc2VjdDsKLSAgICAgY2hhciAqTmFtZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqY3AsICpjcDE7Ci0gIGludCBPZmZzZXQ7Ci0gIGludCBTaXplOwotICBjaGFyIExvY2FsWzUxMl07Ci0KLSAgLyogU2V0IHRoZSByZWNvcmQgc2l6ZS4gICovCi0gIFNpemUgPSAxICsgMSArIDQgKyAxICsgc3RybGVuIChOYW1lKTsKLSAgTG9jYWxbMF0gPSBTaXplOwotICAvKiBEU1QgdHlwZSBpcyAiYmVnaW4gYmxvY2siOyB3ZSBzaW11bGF0ZSB3aXRoIGEgcGhvbnkgcm91dGluZS4gICovCi0gIExvY2FsWzFdID0gRFNUX1NfQ19CTEtCRUc7Ci0gIC8qIFVzZXMgQ2FsbFMvQ2FsbEcuICAqLwotICBMb2NhbFsyXSA9IDA7Ci0gIC8qIFN0b3JlIHRoZSBkYXRhIHNvIGZhci4gICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDMsIE9CSl9TX0NfREJHKTsKLSAgLyogTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBnZW5lcmF0aW5nIGEgZGVidWcgcmVjb3JkLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfREJHKTsKLSAgLyogTm93IGdldCB0aGUgc3ltYm9sIGFkZHJlc3MuICAqLwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfV1BMKTsKLSAgUFVUX1NIT1JUIChQc2VjdCk7Ci0gIC8qIEdldCB0aGUgdGV4dCBwc2VjdCBvZmZzZXQuICAqLwotICBPZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0gIFBVVF9MT05HIChPZmZzZXQpOwotICAvKiBTdG9yZSB0aGUgZGF0YSByZWZlcmVuY2UuICAqLwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVE9fUElEUik7Ci0gIC8qIFN0b3JlIHRoZSBjb3VudGVkIHN0cmluZyBhcyBkYXRhLiAgKi8KLSAgY3AgPSBMb2NhbDsKLSAgY3AxID0gTmFtZTsKLSAgU2l6ZSA9IHN0cmxlbiAoY3AxKSArIDE7Ci0gICpjcCsrID0gU2l6ZSAtIDE7Ci0gIHdoaWxlICgqY3AxKQotICAgICpjcCsrID0gKmNwMSsrOwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBTaXplLCBPQkpfU19DX0RCRyk7Ci19Ci0KLQotLyogV3JpdGUgYSBUcmFjZWJhY2sgQmxvY2sgRW5kIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX0Jsb2NrX0VuZCAoU2l6ZSkKLSAgICAgdmFsdWVUIFNpemU7Ci17Ci0gIGNoYXIgTG9jYWxbMTZdOwotCi0gIExvY2FsWzBdID0gNjsJCS8qIHJlY29yZCBsZW5ndGggKi8KLSAgLyogRFNUIHR5cGUgaXMgImJsb2NrIGVuZCI7IHNpbXVsYXRlIHdpdGggYSBwaG9ueSBlbmQgcm91dGluZS4gICovCi0gIExvY2FsWzFdID0gRFNUX1NfQ19CTEtFTkQ7Ci0gIExvY2FsWzJdID0gMDsJCS8qIHVudXNlZCwgbXVzdCBiZSB6ZXJvICovCi0gIENPUFlfTE9ORyAoJkxvY2FsWzNdLCBTaXplKTsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgNywgT0JKX1NfQ19EQkcpOwotfQotDAotCi0vKiBXcml0ZSBhIExpbmUgbnVtYmVyIDwtPiBQcm9ncmFtIENvdW50ZXIgY29ycmVsYXRpb24gcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiAoTGluZV9OdW1iZXIsIE9mZnNldCwgUHNlY3QsIERvX0RlbHRhKQotICAgICBpbnQgTGluZV9OdW1iZXI7Ci0gICAgIGludCBPZmZzZXQ7Ci0gICAgIGludCBQc2VjdDsKLSAgICAgaW50IERvX0RlbHRhOwotewotICByZWdpc3RlciBjaGFyICpjcDsKLSAgY2hhciBMb2NhbFs2NF07Ci0KLSAgaWYgKERvX0RlbHRhID09IDApCi0gICAgewotICAgICAgLyoKLSAgICAgICAqICBJZiBub3QgZGVsdGEsIHNldCBvdXIgUEMvTGluZSBudW1iZXIgY29ycmVsYXRpb24uCi0gICAgICAgKi8KLSAgICAgIGNwID0gJkxvY2FsWzFdOwkvKiBQdXQgc2l6ZSBpbiBMb2NhbFswXSBsYXRlci4gICovCi0gICAgICAvKiBEU1QgdHlwZSBpcyAiTGluZSBOdW1iZXIvUEMgY29ycmVsYXRpb24iLiAgKi8KLSAgICAgICpjcCsrID0gRFNUX1NfQ19MSU5FX05VTTsKLSAgICAgIC8qIFNldCBMaW5lIG51bWJlci4gICovCi0gICAgICBpZiAoTGluZV9OdW1iZXIgLSAxIDw9IDI1NSkKLQl7Ci0JICAqY3ArKyA9IERTVF9TX0NfU0VUX0xJTlVNX0I7Ci0JICAqY3ArKyA9IChjaGFyKSAoTGluZV9OdW1iZXIgLSAxKTsKLQl9Ci0gICAgICBlbHNlIGlmIChMaW5lX051bWJlciAtIDEgPD0gNjU1MzUpCi0JewotCSAgKmNwKysgPSBEU1RfU19DX1NFVF9MSU5FX05VTTsKLQkgIENPUFlfU0hPUlQgKGNwLCBMaW5lX051bWJlciAtIDEpLCAgY3AgKz0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmNwKysgPSBEU1RfU19DX1NFVF9MSU5VTV9MOwotCSAgQ09QWV9MT05HIChjcCwgTGluZV9OdW1iZXIgLSAxKSwgIGNwICs9IDQ7Ci0JfQotICAgICAgLyogU2V0IFBDLiAgKi8KLSAgICAgICpjcCsrID0gRFNUX1NfQ19TRVRfQUJTX1BDOwotICAgICAgLyogU3RvcmUgc2l6ZSBub3cgdGhhdCB3ZSBrbm93IGl0LCB0aGVuIG91dHB1dCB0aGUgZGF0YS4gICovCi0gICAgICBMb2NhbFswXSA9IGNwIC0gJkxvY2FsWzFdOwotCS8qIEFjY291bnQgZm9yIHRoZSBzcGFjZSB0aGF0IFRJUl9TX0NfU1RPX1BJRFIgd2lsbCB1c2UgZm9yIHRoZSBQQy4gICovCi0JTG9jYWxbMF0gKz0gNDsJCS8qIHNpemUgaW5jbHVkZXMgbGVuZ3RoIG9mIGFub3RoZXIgbG9uZ3dvcmQgKi8KLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGNwIC0gTG9jYWwsIE9CSl9TX0NfVEJUKTsKLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBhcmUgc3RpbGwgZ2VuZXJhdGluZyBhIE9CSl9TX0NfVEJUIHJlY29yZC4gICovCi0gICAgICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLQlQVVRfQ0hBUiAoT0JKX1NfQ19UQlQpOwotICAgICAgdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3QsIE9mZnNldCwgMCk7Ci0gICAgICBQVVRfQ0hBUiAoVElSX1NfQ19TVE9fUElEUik7Ci0gICAgICAvKiBEbyBhIFBDIG9mZnNldCBvZiAwIHRvIHJlZ2lzdGVyIHRoZSBsaW5lIG51bWJlci4gICovCi0gICAgICBMb2NhbFswXSA9IDI7Ci0gICAgICBMb2NhbFsxXSA9IERTVF9TX0NfTElORV9OVU07Ci0gICAgICBMb2NhbFsyXSA9IDA7CQkvKiBJbmNyZW1lbnQgUEMgYnkgMCBhbmQgcmVnaXN0ZXIgbGluZSAjICovCi0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCAzLCBPQkpfU19DX1RCVCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKERvX0RlbHRhIDwgMCkKLQl7Ci0JICAvKgotCSAgICogIFdoZW4gZGVsdGEgaXMgbmVnYXRpdmUsIHRlcm1pbmF0ZSB0aGUgbGluZSBudW1iZXJzLgotCSAgICovCi0JICBMb2NhbFswXSA9IDEgKyAxICsgNDsKLQkgIExvY2FsWzFdID0gRFNUX1NfQ19MSU5FX05VTTsKLQkgIExvY2FsWzJdID0gRFNUX1NfQ19URVJNX0w7Ci0JICBDT1BZX0xPTkcgKCZMb2NhbFszXSwgT2Zmc2V0KTsKLQkgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDcsIE9CSl9TX0NfVEJUKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAvKgotICAgICAgICogIERvIGEgUEMvTGluZSBkZWx0YS4KLSAgICAgICAqLwotICAgICAgY3AgPSAmTG9jYWxbMV07Ci0gICAgICAqY3ArKyA9IERTVF9TX0NfTElORV9OVU07Ci0gICAgICBpZiAoTGluZV9OdW1iZXIgPiAxKQotCXsKLQkgIC8qIFdlIG5lZWQgdG8gaW5jcmVtZW50IHRoZSBsaW5lIG51bWJlci4gICovCi0JICBpZiAoTGluZV9OdW1iZXIgLSAxIDw9IDI1NSkKLQkgICAgewotCSAgICAgICpjcCsrID0gRFNUX1NfQ19JTkNSX0xJTlVNOwotCSAgICAgICpjcCsrID0gTGluZV9OdW1iZXIgLSAxOwotCSAgICB9Ci0JICBlbHNlIGlmIChMaW5lX051bWJlciAtIDEgPD0gNjU1MzUpCi0JICAgIHsKLQkgICAgICAqY3ArKyA9IERTVF9TX0NfSU5DUl9MSU5VTV9XOwotCSAgICAgIENPUFlfU0hPUlQgKGNwLCBMaW5lX051bWJlciAtIDEpLCAgY3AgKz0gMjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKmNwKysgPSBEU1RfU19DX0lOQ1JfTElOVU1fTDsKLQkgICAgICBDT1BZX0xPTkcgKGNwLCBMaW5lX051bWJlciAtIDEpLCAgY3AgKz0gNDsKLQkgICAgfQotCX0KLSAgICAgIC8qCi0gICAgICAgKglJbmNyZW1lbnQgdGhlIFBDCi0gICAgICAgKi8KLSAgICAgIGlmIChPZmZzZXQgPD0gMTI4KQotCXsKLQkgIC8qIFNtYWxsIG9mZnNldHMgYXJlIGVuY29kZWQgYXMgbmVnYXRpdmUgbnVtYmVycywgcmF0aGVyIHRoYW4gdGhlCi0JICAgICB1c3VhbCBub24tbmVnYXRpdmUgdHlwZSBjb2RlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGF0YSBmaWVsZC4gICovCi0JICAqY3ArKyA9IChjaGFyKSAtT2Zmc2V0OwotCX0KLSAgICAgIGVsc2UgaWYgKE9mZnNldCA8PSA2NTUzNSkKLQl7Ci0JICAqY3ArKyA9IERTVF9TX0NfREVMVEFfUENfVzsKLQkgIENPUFlfU0hPUlQgKGNwLCBPZmZzZXQpLCAgY3AgKz0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmNwKysgPSBEU1RfU19DX0RFTFRBX1BDX0w7Ci0JICBDT1BZX0xPTkcgKGNwLCBPZmZzZXQpLCAgY3AgKz0gNDsKLQl9Ci0gICAgICAvKiBTZXQgc2l6ZSBub3cgdGhhdCBiZSBrbm93IGl0LCB0aGVuIG91dHB1dCB0aGUgZGF0YS4gICovCi0gICAgICBMb2NhbFswXSA9IGNwIC0gJkxvY2FsWzFdOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgY3AgLSBMb2NhbCwgT0JKX1NfQ19UQlQpOwotICAgIH0KLX0KLQwKLQotLyogRGVzY3JpYmUgYSBzb3VyY2UgZmlsZSB0byB0aGUgZGVidWdnZXIuICAqLwotCi1zdGF0aWMgaW50Ci1WTVNfVEJUX1NvdXJjZV9GaWxlIChGaWxlbmFtZSwgSURfTnVtYmVyKQotICAgICBjaGFyICpGaWxlbmFtZTsKLSAgICAgaW50IElEX051bWJlcjsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqY3A7Ci0gIGludCBsZW4sIHJmbywgZmZiLCBlYms7Ci0gIGNoYXIgY2R0WzhdOwotICBjaGFyIExvY2FsWzUxMl07Ci0jaWZkZWYgVk1TCQkJLyogVXNlZCBmb3IgbmF0aXZlIGFzc2VtYmx5ICovCi0gIHVuc2lnbmVkIFN0YXR1czsKLSAgc3RydWN0IEZBQiBmYWI7CQkJLyogUk1TIGZpbGUgYWNjZXNzIGJsb2NrICovCi0gIHN0cnVjdCBOQU0gbmFtOwkJCS8qIGZpbGUgbmFtZSBpbmZvcm1hdGlvbiAqLwotICBzdHJ1Y3QgWEFCREFUIHhhYmRhdDsJCQkvKiBkYXRlK3RpbWUgZmllbGRzICovCi0gIHN0cnVjdCBYQUJGSEMgeGFiZmhjOwkJCS8qIGZpbGUgaGVhZGVyIGNoYXJhY3RlcmlzdGljcyAqLwotICBjaGFyIHJlc3VsdGFudF9zdHJpbmdfYnVmZmVyWzI1NSArIDFdOwotCi0gIC8qCi0gICAqCVNldCB1cCBSTVMgc3RydWN0dXJlczoKLSAgICovCi0gIC8qIEZBQiAtLSBmaWxlIGFjY2VzcyBibG9jayAqLwotICBtZW1zZXQgKChjaGFyICopICZmYWIsIDAsIHNpemVvZiBmYWIpOwotICBmYWIuZmFiJGJfYmlkID0gRkFCJENfQklEOwotICBmYWIuZmFiJGJfYmxuID0gKHVuc2lnbmVkIGNoYXIpIHNpemVvZiBmYWI7Ci0gIGZhYi5mYWIkbF9mbmEgPSBGaWxlbmFtZTsKLSAgZmFiLmZhYiRiX2ZucyA9ICh1bnNpZ25lZCBjaGFyKSBzdHJsZW4gKEZpbGVuYW1lKTsKLSAgZmFiLmZhYiRsX25hbSA9IChjaGFyICopICZuYW07Ci0gIGZhYi5mYWIkbF94YWIgPSAoY2hhciAqKSAmeGFiZGF0OwotICAvKiBOQU0gLS0gZmlsZSBuYW1lIGJsb2NrICovCi0gIG1lbXNldCAoKGNoYXIgKikgJm5hbSwgMCwgc2l6ZW9mIG5hbSk7Ci0gIG5hbS5uYW0kYl9iaWQgPSBOQU0kQ19CSUQ7Ci0gIG5hbS5uYW0kYl9ibG4gPSAodW5zaWduZWQgY2hhcikgc2l6ZW9mIG5hbTsKLSAgbmFtLm5hbSRsX3JzYSA9IHJlc3VsdGFudF9zdHJpbmdfYnVmZmVyOwotICBuYW0ubmFtJGJfcnNzID0gKHVuc2lnbmVkIGNoYXIpIChzaXplb2YgcmVzdWx0YW50X3N0cmluZ19idWZmZXIgLSAxKTsKLSAgLyogWEFCcyAtLSBleHRlbmRlZCBhdHRyaWJ1dGVzIGJsb2NrcyAqLwotICBtZW1zZXQgKChjaGFyICopICZ4YWJkYXQsIDAsIHNpemVvZiB4YWJkYXQpOwotICB4YWJkYXQueGFiJGJfY29kID0gWEFCJENfREFUOwotICB4YWJkYXQueGFiJGJfYmxuID0gKHVuc2lnbmVkIGNoYXIpIHNpemVvZiB4YWJkYXQ7Ci0gIHhhYmRhdC54YWIkbF9ueHQgPSAoY2hhciAqKSAmeGFiZmhjOwotICBtZW1zZXQgKChjaGFyICopICZ4YWJmaGMsIDAsIHNpemVvZiB4YWJmaGMpOwotICB4YWJmaGMueGFiJGJfY29kID0gWEFCJENfRkhDOwotICB4YWJmaGMueGFiJGJfYmxuID0gKHVuc2lnbmVkIGNoYXIpIHNpemVvZiB4YWJmaGM7Ci0gIHhhYmZoYy54YWIkbF9ueHQgPSAwOwotICAvKgotICAgKglHZXQgdGhlIGZpbGUgaW5mb3JtYXRpb24KLSAgICovCi0gIFN0YXR1cyA9IHN5cyRvcGVuICgmZmFiKTsKLSAgaWYgKCEoU3RhdHVzICYgMSkpCi0gICAgewotICAgICAgYXNfdHNrdHNrIChfKCJDb3VsZG4ndCBmaW5kIHNvdXJjZSBmaWxlIFwiJXNcIiwgc3RhdHVzPSUlWCV4IiksCi0JCSBGaWxlbmFtZSwgU3RhdHVzKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgc3lzJGNsb3NlICgmZmFiKTsKLSAgLyogTm93IGV4dHJhY3QgZmllbGRzIG9mIGludGVyZXN0LiAgKi8KLSAgbWVtY3B5IChjZHQsIChjaGFyICopICZ4YWJkYXQueGFiJHFfY2R0LCA4KTsJLyogY3JlYXRpb24gZGF0ZSAqLwotICBlYmsgPSB4YWJmaGMueGFiJGxfZWJrOwkJLyogZW5kLW9mLWZpbGUgYmxvY2sgKi8KLSAgZmZiID0geGFiZmhjLnhhYiR3X2ZmYjsJCS8qIGZpcnN0IGZyZWUgYnl0ZSBvZiBsYXN0IGJsb2NrICovCi0gIHJmbyA9IHhhYmZoYy54YWIkYl9yZm87CQkvKiByZWNvcmQgZm9ybWF0ICovCi0gIGxlbiA9IG5hbS5uYW0kYl9yc2w7CQkJLyogbGVuZ3RoIG9mIEZpbGVuYW1lICovCi0gIHJlc3VsdGFudF9zdHJpbmdfYnVmZmVyW2xlbl0gPSAnXDAnOwotICBGaWxlbmFtZSA9IHJlc3VsdGFudF9zdHJpbmdfYnVmZmVyOwkvKiBmdWxsIGZpbGVuYW1lICovCi0jZWxzZQkJCQkvKiBDcm9zcy1hc3NlbWJseSAqLwotICAvKiBbUGVyaGFwcyB3ZSBvdWdodCB0byB1c2UgYWN0dWFsIHZhbHVlcyBkZXJpdmVkIGZyb20gc3RhdCgpIGhlcmU/XSAgKi8KLSAgbWVtc2V0IChjZHQsIDAsIDgpOwkJCS8qIG51bGwgVk1TIHF1YWR3b3JkIGJpbmFyeSB0aW1lICovCi0gIGViayA9IGZmYiA9IHJmbyA9IDA7Ci0gIGxlbiA9IHN0cmxlbiAoRmlsZW5hbWUpOwotICBpZiAobGVuID4gMjU1KQkvKiBhIHNpbmdsZSBieXRlIGlzIHVzZWQgYXMgY291bnQgcHJlZml4ICovCi0gICAgewotICAgICAgRmlsZW5hbWUgKz0gKGxlbiAtIDI1NSk7CQkvKiB0YWlsIGVuZCBpcyBtb3JlIHNpZ25pZmljYW50ICovCi0gICAgICBsZW4gPSAyNTU7Ci0gICAgfQotI2VuZGlmIC8qIFZNUyAqLwotCi0gIGNwID0gJkxvY2FsWzFdOwkJCS8qIGZpbGwgaW4gcmVjb3JkIGxlbmd0aCBsYXRlciAqLwotICAqY3ArKyA9IERTVF9TX0NfU09VUkNFOwkJLyogRFNUIHR5cGUgaXMgInNvdXJjZSBmaWxlIiAqLwotICAqY3ArKyA9IERTVF9TX0NfU1JDX0ZPUk1GRUVEOwkJLyogZm9ybWZlZWRzIGNvdW50IGFzIHNvdXJjZSByZWNvcmRzICovCi0gICpjcCsrID0gRFNUX1NfQ19TUkNfREVDTEZJTEU7CQkvKiBkZWNsYXJlIHNvdXJjZSBmaWxlICovCi0gIGtub3cgKGNwID09ICZMb2NhbFs0XSk7Ci0gICpjcCsrID0gMDsJCQkJLyogZmlsbCBpbiB0aGlzIGxlbmd0aCBiZWxvdyAqLwotICAqY3ArKyA9IDA7CQkJCS8qIGZsYWdzOyBtdXN0IGJlIHplcm8gKi8KLSAgQ09QWV9TSE9SVCAoY3AsIElEX051bWJlciksICBjcCArPSAyOwkvKiBmaWxlIElEIG51bWJlciAqLwotICBtZW1jcHkgKGNwLCBjZHQsIDgpLCAgY3AgKz0gODsJLyogY3JlYXRpb24gZGF0ZSt0aW1lICovCi0gIENPUFlfTE9ORyAoY3AsIGViayksICBjcCArPSA0OwkvKiBlbmQtb2YtZmlsZSBibG9jayAqLwotICBDT1BZX1NIT1JUIChjcCwgZmZiKSwgIGNwICs9IDI7CS8qIGZpcnN0IGZyZWUgYnl0ZSBvZiBsYXN0IGJsb2NrICovCi0gICpjcCsrID0gKGNoYXIpIHJmbzsJCQkvKiBSTVMgcmVjb3JkIGZvcm1hdCAqLwotICAvKiBGaWxlbmFtZS4gICovCi0gICpjcCsrID0gKGNoYXIpIGxlbjsKLSAgd2hpbGUgKC0tbGVuID49IDApCi0gICAgKmNwKysgPSAqRmlsZW5hbWUrKzsKLSAgLyogTGlicmFyeSBtb2R1bGUgbmFtZSAobm9uZSkuICAqLwotICAqY3ArKyA9IDA7Ci0gIC8qIE5vdyB0aGF0IHNpemUgaXMga25vd24sIGZpbGwgaXQgaW4gYW5kIHdyaXRlIG91dCB0aGUgcmVjb3JkLiAgKi8KLSAgTG9jYWxbNF0gPSBjcCAtICZMb2NhbFs1XTsJCS8qIHNvdXJjZSBmaWxlIGRlY2xhcmF0aW9uIHNpemUgKi8gCi0gIExvY2FsWzBdID0gY3AgLSAmTG9jYWxbMV07CQkvKiBUQlQgcmVjb3JkIHNpemUgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgY3AgLSBMb2NhbCwgT0JKX1NfQ19UQlQpOwotICByZXR1cm4gMTsKLX0KLQotCi0vKiBUcmFjZWJhY2sgaW5mb3JtYXRpb24gaXMgZGVzY3JpYmVkIGluIHRlcm1zIG9mIGxpbmVzIGZyb20gY29tcGlsZXIKLSAgIGxpc3RpbmcgZmlsZXMsIG5vdCBsaW5lcyBmcm9tIHNvdXJjZSBmaWxlcy4gIFdlIG5lZWQgdG8gc2V0IHVwIHRoZQotICAgY29ycmVsYXRpb24gYmV0d2VlbiBsaXN0aW5nIGxpbmUgbnVtYmVycyBhbmQgc291cmNlIGxpbmUgbnVtYmVycy4KLSAgIFNpbmNlIGdjYydzIC5zdGFibiBkaXJlY3RpdmVzIHJlZmVyIHRvIHRoZSBzb3VyY2UgbGluZXMsIHdlIGp1c3QKLSAgIG5lZWQgdG8gZGVzY3JpYmUgYSBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfU291cmNlX0xpbmVzIChJRF9OdW1iZXIsIFN0YXJ0aW5nX0xpbmVfTnVtYmVyLCBOdW1iZXJfT2ZfTGluZXMpCi0gICAgIGludCBJRF9OdW1iZXI7Ci0gICAgIGludCBTdGFydGluZ19MaW5lX051bWJlcjsKLSAgICAgaW50IE51bWJlcl9PZl9MaW5lczsKLXsKLSAgY2hhciAqY3A7Ci0gIGludCBjaHVua19saW1pdDsKLSAgY2hhciBMb2NhbFsxMjhdOwkvKiByb29tIGVub3VnaCB0byBkZXNjcmliZSAxMzEwNzAwIGxpbmVzLi4uICovCi0KLSAgY3AgPSAmTG9jYWxbMV07CS8qIFB1dCBzaXplIGluIExvY2FsWzBdIGxhdGVyLiAgKi8KLSAgKmNwKysgPSBEU1RfU19DX1NPVVJDRTsJCS8qIERTVCB0eXBlIGlzICJzb3VyY2UgZmlsZSIuICAqLwotICAqY3ArKyA9IERTVF9TX0NfU1JDX1NFVEZJTEU7CQkvKiBTZXQgU291cmNlIEZpbGUuICAqLwotICBDT1BZX1NIT1JUIChjcCwgSURfTnVtYmVyKSwgIGNwICs9IDI7CS8qIEZpbGUgSUQgTnVtYmVyLiAgKi8KLSAgLyogU2V0IHJlY29yZCBudW1iZXIgYW5kIGRlZmluZSBsaW5lcy4gIFNpbmNlIG5vIGxvbmd3b3JkIGZvcm0gb2YKLSAgICAgU1JDX0RFRkxJTkVTIGlzIGF2YWlsYWJsZSwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGNvcGUgd2l0aCBhbnkgaHVnZQotICAgICBmaWxlcyBhIGNodW5rIGF0IGEgdGltZS4gIEl0IGRvZXNuJ3QgbWF0dGVyIGZvciB0cmFjZWJhY2tzLCBzaW5jZQotICAgICB1bnNwZWNpZmllZCBsaW5lcyBhcmUgbWFwcGVkIG9uZS10by1vbmUgYW5kIHdvcmsgb3V0IHJpZ2h0LCBidXQgaXQKLSAgICAgZG9lcyBtYXR0ZXIgd2l0aGluIHRoZSBkZWJ1Z2dlci4gIFdpdGhvdXQgdGhpcyBleHBsaWNpdCBtYXBwaW5nLAotICAgICBpdCB3aWxsIGNvbXBsYWluIGFib3V0IGxpbmVzIG5vdCBleGlzdGluZyBpbiB0aGUgbW9kdWxlLiAgKi8KLSAgY2h1bmtfbGltaXQgPSAoc2l6ZW9mIExvY2FsIC0gNSkgLyA2OwotICBpZiAoTnVtYmVyX09mX0xpbmVzID4gNjU1MzUgKiBjaHVua19saW1pdCkJLyogYXZvaWQgYnVmZmVyIG92ZXJmbG93ICovCi0gICAgTnVtYmVyX09mX0xpbmVzID0gNjU1MzUgKiBjaHVua19saW1pdDsKLSAgd2hpbGUgKE51bWJlcl9PZl9MaW5lcyA+IDY1NTM1KQotICAgIHsKLSAgICAgICpjcCsrID0gRFNUX1NfQ19TUkNfU0VUUkVDX0w7Ci0gICAgICBDT1BZX0xPTkcgKGNwLCBTdGFydGluZ19MaW5lX051bWJlciksICBjcCArPSA0OwotICAgICAgKmNwKysgPSBEU1RfU19DX1NSQ19ERUZMSU5FU19XOwotICAgICAgQ09QWV9TSE9SVCAoY3AsIDY1NTM1KSwgIGNwICs9IDI7Ci0gICAgICBTdGFydGluZ19MaW5lX051bWJlciArPSA2NTUzNTsKLSAgICAgIE51bWJlcl9PZl9MaW5lcyAtPSA2NTUzNTsKLSAgICB9Ci0gIC8qIFNldCByZWNvcmQgbnVtYmVyIGFuZCBkZWZpbmUgbGluZXMsIG5vcm1hbCBjYXNlLiAgKi8KLSAgaWYgKFN0YXJ0aW5nX0xpbmVfTnVtYmVyIDw9IDY1NTM1KQotICAgIHsKLSAgICAgICpjcCsrID0gRFNUX1NfQ19TUkNfU0VUUkVDX1c7Ci0gICAgICBDT1BZX1NIT1JUIChjcCwgU3RhcnRpbmdfTGluZV9OdW1iZXIpLCAgY3AgKz0gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqY3ArKyA9IERTVF9TX0NfU1JDX1NFVFJFQ19MOwotICAgICAgQ09QWV9MT05HIChjcCwgU3RhcnRpbmdfTGluZV9OdW1iZXIpLCAgY3AgKz0gNDsKLSAgICB9Ci0gICpjcCsrID0gRFNUX1NfQ19TUkNfREVGTElORVNfVzsKLSAgQ09QWV9TSE9SVCAoY3AsIE51bWJlcl9PZl9MaW5lcyksICBjcCArPSAyOwotICAvKiBTZXQgc2l6ZSBub3cgdGhhdCBiZSBrbm93IGl0LCB0aGVuIG91dHB1dCB0aGUgZGF0YS4gICovCi0gIExvY2FsWzBdID0gY3AgLSAmTG9jYWxbMV07Ci0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGNwIC0gTG9jYWwsIE9CSl9TX0NfVEJUKTsKLX0KLQwKLQotIC8qKioqKiogRGVidWdnZXIgSW5mb3JtYXRpb24gc3VwcG9ydCByb3V0aW5lcyAqKioqKiovCi0KLQotLyogVGhpcyByb3V0aW5lIGxvY2F0ZXMgYSBmaWxlIGluIHRoZSBsaXN0IG9mIGZpbGVzLiAgSWYgYW4gZW50cnkgZG9lcwotICAgbm90IGV4aXN0LCBvbmUgaXMgY3JlYXRlZC4gIEZvciBpbmNsdWRlIGZpbGVzLCBhIG5ldyBlbnRyeSBpcyBhbHdheXMKLSAgIGNyZWF0ZWQgc3VjaCB0aGF0IGlubGluZSBmdW5jdGlvbnMgY2FuIGJlIHByb3Blcmx5IGRlYnVnZ2VkLiAgKi8KLQotc3RhdGljIHN0cnVjdCBpbnB1dF9maWxlICoKLWZpbmRfZmlsZSAoc3ApCi0gICAgIHN5bWJvbFMgKnNwOwotewotICBzdHJ1Y3QgaW5wdXRfZmlsZSAqc2FtZV9maWxlID0gMDsKLSAgc3RydWN0IGlucHV0X2ZpbGUgKmZwbnQsICpsYXN0ID0gMDsKLSAgY2hhciAqc3BfbmFtZTsKLQotICBmb3IgKGZwbnQgPSBmaWxlX3Jvb3Q7IGZwbnQ7IGZwbnQgPSBmcG50LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmcG50LT5zcG50ID09IHNwKQotCXJldHVybiBmcG50OwotICAgICAgbGFzdCA9IGZwbnQ7Ci0gICAgfQotICBzcF9uYW1lID0gU19HRVRfTkFNRSAoc3ApOwotICBmb3IgKGZwbnQgPSBmaWxlX3Jvb3Q7IGZwbnQ7IGZwbnQgPSBmcG50LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHNwX25hbWUsIGZwbnQtPm5hbWUpID09IDApCi0JewotCSAgaWYgKGZwbnQtPmZsYWcgPT0gMSkKLQkgICAgcmV0dXJuIGZwbnQ7Ci0JICBzYW1lX2ZpbGUgPSBmcG50OwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZnBudCA9IChzdHJ1Y3QgaW5wdXRfZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBpbnB1dF9maWxlKSk7Ci0gIGlmICghZmlsZV9yb290KQotICAgIGZpbGVfcm9vdCA9IGZwbnQ7Ci0gIGVsc2UKLSAgICBsYXN0LT5uZXh0ID0gZnBudDsKLSAgZnBudC0+bmV4dCA9IDA7Ci0gIGZwbnQtPm5hbWUgPSBzcF9uYW1lOwotICBmcG50LT5taW5fbGluZSA9IDB4N2ZmZmZmZmY7Ci0gIGZwbnQtPm1heF9saW5lID0gMDsKLSAgZnBudC0+b2Zmc2V0ID0gMDsKLSAgZnBudC0+ZmxhZyA9IDA7Ci0gIGZwbnQtPmZpbGVfbnVtYmVyID0gMDsKLSAgZnBudC0+c3BudCA9IHNwOwotICBmcG50LT5zYW1lX2ZpbGVfZnBudCA9IHNhbWVfZmlsZTsKLSAgcmV0dXJuIGZwbnQ7Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGNvbnZlcnRzIGEgbnVtYmVyIHN0cmluZyBpbnRvIGFuIGludGVnZXIsIGFuZCBzdG9wcyB3aGVuCi0gICBpdCBzZWVzIGFuIGludmFsaWQgY2hhcmFjdGVyLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIGNoYXJhY3RlciBqdXN0IHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIHJlYWQuICBObyBlcnJvciBpcyBnZW5lcmF0ZWQuICAqLwotCi1zdGF0aWMgY2hhciAqCi1jdnRfaW50ZWdlciAoc3RyLCBydG4pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgaW50ICpydG47Ci17Ci0gIGludCBpdmFsID0gMCwgc2duID0gMTsKLQotICBpZiAoKnN0ciA9PSAnLScpCi0gICAgc2duID0gLTEsICArK3N0cjsKLSAgd2hpbGUgKCpzdHIgPj0gJzAnICYmICpzdHIgPD0gJzknKQotICAgIGl2YWwgPSAxMCAqIGl2YWwgKyAqc3RyKysgLSAnMCc7Ci0gICpydG4gPSBzZ24gKiBpdmFsOwotICByZXR1cm4gc3RyOwotfQotDAotCi0vKgotICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYW5kIGRlZmluaXRpb25zIGFyZSB1c2VkIHRvIGdlbmVyYXRlIG9iamVjdAotICogcmVjb3JkcyB0aGF0IHdpbGwgZGVzY3JpYmUgcHJvZ3JhbSB2YXJpYWJsZXMgdG8gdGhlIFZNUyBkZWJ1Z2dlci4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgbWFueSBvZiB0aGUgcm91dGluZXMgbmVlZGVkIHRvIG91dHB1dCBkZWJ1Z2dpbmcgaW5mbwotICogaW50byB0aGUgb2JqZWN0IGZpbGUgdGhhdCB0aGUgVk1TIGRlYnVnZ2VyIG5lZWRzIHRvIHVuZGVyc3RhbmQgc3ltYm9scy4KLSAqIFRoZXNlIHJvdXRpbmVzIGFyZSBjYWxsZWQgdmVyeSBsYXRlIGluIHRoZSBhc3NlbWJseSBwcm9jZXNzLCBhbmQgdGh1cwotICogd2UgY2FuIGJlIGZhaXJseSBsYXggYWJvdXQgY2hhbmdpbmcgdGhpbmdzLCBzaW5jZSB0aGUgR1NEIGFuZCB0aGUgVElSCi0gKiBzZWN0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBvdXRwdXQuCi0gKi8KLQotCi0vKiBUaGlzIHJvdXRpbmUgZml4ZXMgdGhlIG5hbWVzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSBDKyssICIudGhpcyIgaXMgYSBnb29kCi0gICBleGFtcGxlLiAgVGhlIHBlcmlvZCBkb2VzIG5vdCB3b3JrIGZvciB0aGUgZGVidWdnZXIsIHNpbmNlIGl0IGxvb2tzIGxpa2UKLSAgIHRoZSBzeW50YXggZm9yIGEgc3RydWN0dXJlIGVsZW1lbnQsIGFuZCB0aHVzIGl0IGdldHMgbWlnaHRpbHkgY29uZnVzZWQuCi0KLSAgIFdlIGFsc28gdXNlIHRoaXMgdG8gc3RyaXAgdGhlIFBzZWN0QXR0cmlidXRlIGhhY2sgZnJvbSB0aGUgbmFtZSBiZWZvcmUgd2UKLSAgIHdyaXRlIGEgZGVidWdnZXIgcmVjb3JkLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZml4X25hbWUgKHBudCkKLSAgICAgY2hhciAqcG50OwotewotICBjaGFyICpwbnQxOwotCi0gIC8qIEtpbGwgYW55IGxlYWRpbmcgIl8iLiAgKi8KLSAgaWYgKCpwbnQgPT0gJ18nKQotICAgIHBudCsrOwotCi0gIC8qIElzIHRoZXJlIGEgUHNlY3QgQXR0cmlidXRlIHRvIHNraXA/PyAgKi8KLSAgaWYgKEhBU19QU0VDVF9BVFRSSUJVVEVTIChwbnQpKQotICAgIHsKLSAgICAgIC8qIFllczogU2tpcCBpdC4gICovCi0gICAgICBwbnQgKz0gUFNFQ1RfQVRUUklCVVRFU19TVFJJTkdfTEVOR1RIOwotICAgICAgd2hpbGUgKCpwbnQpCi0JewotCSAgaWYgKChwbnRbMF0gPT0gJyQnKSAmJiAocG50WzFdID09ICckJykpCi0JICAgIHsKLQkgICAgICBwbnQgKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgcG50Kys7Ci0JfQotICAgIH0KLQotICAvKiBIZXJlIHdlIGZpeCB0aGUgLnRoaXMgLT4gJHRoaXMgY29udmVyc2lvbi4gICovCi0gIGZvciAocG50MSA9IHBudDsgKnBudDEgIT0gMDsgcG50MSsrKQotICAgIGlmICgqcG50MSA9PSAnLicpCi0gICAgICAqcG50MSA9ICckJzsKLQotICByZXR1cm4gcG50OwotfQotCi0KLS8qIFdoZW4gZGVmaW5pbmcgYSBzdHJ1Y3R1cmUsIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZmluZCB0aGUgbmFtZSBvZgotICAgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUuICBJdCBpcyBhc3N1bWVkIHRoYXQgc3RyIHBvaW50cyB0byB0aGUgZXF1YWwgc2lnbgotICAgaW4gdGhlIGRlZmluaXRpb24sIGFuZCBpdCBtb3ZlcyBiYWNrd2FyZCB1bnRpbCBpdCBmaW5kcyB0aGUgc3RhcnQgb2YgdGhlCi0gICBuYW1lLiAgSWYgaXQgZmluZHMgYSAwLCB0aGVuIGl0IGtub3dzIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgZGVmIGlzIGluIHRoZQotICAgb3V0ZXJtb3N0IGxldmVsLCBhbmQgdGh1cyBzeW1ib2xfbmFtZSBwb2ludHMgdG8gdGhlIHN5bWJvbCBuYW1lLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZ2V0X3N0cnVjdF9uYW1lIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqcG50OwotICBwbnQgPSBzdHI7Ci0gIHdoaWxlICgoKnBudCAhPSAnOicpICYmICgqcG50ICE9ICdcMCcpKQotICAgIHBudC0tOwotICBpZiAoKnBudCA9PSAnXDAnKQotICAgIHJldHVybiAoY2hhciAqKSBzeW1ib2xfbmFtZTsKLSAgKnBudC0tID0gJ1wwJzsKLSAgd2hpbGUgKCgqcG50ICE9ICc7JykgJiYgKCpwbnQgIT0gJz0nKSkKLSAgICBwbnQtLTsKLSAgaWYgKCpwbnQgPT0gJzsnKQotICAgIHJldHVybiBwbnQgKyAxOwotICB3aGlsZSAoKCpwbnQgPCAnMCcpIHx8ICgqcG50ID4gJzknKSkKLSAgICBwbnQrKzsKLSAgd2hpbGUgKCgqcG50ID49ICcwJykgJiYgKCpwbnQgPD0gJzknKSkKLSAgICBwbnQrKzsKLSAgcmV0dXJuIHBudDsKLX0KLQotCi0vKiBTZWFyY2ggc3ltYm9sIGxpc3QgZm9yIHR5cGUgbnVtYmVyIGRieF90eXBlLgotICAgUmV0dXJuIGEgcG9pbnRlciB0byBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgc3RydWN0IFZNU19EQkdfU3ltYm9sICoKLWZpbmRfc3ltYm9sIChkYnhfdHlwZSkKLSAgICAgaW50IGRieF90eXBlOwotewotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0KLSAgc3BudCA9IFZNU19TeW1ib2xfdHlwZV9saXN0W1NZTVRZUF9IQVNIIChkYnhfdHlwZSldOwotICB3aGlsZSAoc3BudCkKLSAgICB7Ci0gICAgICBpZiAoc3BudC0+ZGJ4X3R5cGUgPT0gZGJ4X3R5cGUpCi0JYnJlYWs7Ci0gICAgICBzcG50ID0gc3BudC0+bmV4dDsKLSAgICB9Ci0gIGlmICghc3BudCB8fCBzcG50LT5hZHZhbmNlZCAhPSBBTElBUykKLSAgICByZXR1cm4gc3BudDsKLSAgcmV0dXJuIGZpbmRfc3ltYm9sIChzcG50LT50eXBlMik7Ci19Ci0KLQotI2lmIDAJCS8qIG9ic29sZXRlICovCi0vKiB0aGlzIHJvdXRpbmUgcHV0cyBpbmZvIGludG8gZWl0aGVyIExvY2FsIG9yIEFzdWZmaXgsIGRlcGVuZGluZyBvbiB0aGUgc2lnbgotICogb2Ygc2l6ZS4gIFRoZSByZWFzb24gaXMgdGhhdCBpdCBpcyBlYXNpZXIgdG8gYnVpbGQgdGhlIHZhcmlhYmxlIGRlc2NyaXB0b3IKLSAqIGJhY2t3YXJkcywgd2hpbGUgdGhlIGFycmF5IGRlc2NyaXB0b3IgaXMgYmVzdCBidWlsdCBmb3J3YXJkcy4gIEluIHRoZSBlbmQKLSAqIHRoZXkgZ2V0IHB1dCB0b2dldGhlciwgaWYgdGhlcmUgaXMgbm90IGEgc3RydWN0L3VuaW9uL2VudW0gYWxvbmcgdGhlIHdheQotICovCi1zdGF0aWMgdm9pZAotcHVzaCAodmFsdWUsIHNpemUxKQotICAgICBpbnQgdmFsdWUsIHNpemUxOwotewotICBpZiAoc2l6ZTEgPCAwKQotICAgIHsKLSAgICAgIHNpemUxID0gLXNpemUxOwotICAgICAgaWYgKExwbnQgPCBzaXplMSkKLQl7Ci0JICBvdmVyZmxvdyA9IDE7Ci0JICBMcG50ID0gMTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBMcG50IC09IHNpemUxOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICgmTG9jYWxbTHBudCArIDFdLCB2YWx1ZSwgc2l6ZTEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChBcG9pbnQgKyBzaXplMSA+PSBNQVhfREVCVUdfUkVDT1JEKQotCXsKLQkgIG92ZXJmbG93ID0gMTsKLQkgIEFwb2ludCA9IE1BWF9ERUJVR19SRUNPUkQgLSAxOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoJkFzdWZmaXhbQXBvaW50XSwgdmFsdWUsIHNpemUxKTsKLSAgICAgIEFwb2ludCArPSBzaXplMTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZAotZnB1c2ggKHZhbHVlLCBzaXplKQotICAgICBpbnQgdmFsdWUsIHNpemU7Ci17Ci0gIGlmIChBcG9pbnQgKyBzaXplID49IE1BWF9ERUJVR19SRUNPUkQpCi0gICAgewotICAgICAgb3ZlcmZsb3cgPSAxOwotICAgICAgQXBvaW50ID0gTUFYX0RFQlVHX1JFQ09SRCAtIDE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc2l6ZSA9PSAxKQotICAgIEFzdWZmaXhbQXBvaW50KytdID0gKGNoYXIpIHZhbHVlOwotICBlbHNlCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICgmQXN1ZmZpeFtBcG9pbnRdLCB2YWx1ZSwgc2l6ZSk7Ci0gICAgICBBcG9pbnQgKz0gc2l6ZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1ycHVzaCAodmFsdWUsIHNpemUpCi0gICAgIGludCB2YWx1ZSwgc2l6ZTsKLXsKLSAgaWYgKExwbnQgPCBzaXplKQotICAgIHsKLSAgICAgIG92ZXJmbG93ID0gMTsKLSAgICAgIExwbnQgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHNpemUgPT0gMSkKLSAgICAgIExvY2FsW0xwbnQtLV0gPSAoY2hhcikgdmFsdWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBMcG50IC09IHNpemU7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKCZMb2NhbFtMcG50ICsgMV0sIHZhbHVlLCBzaXplKTsKLSAgICB9Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGdlbmVyYXRlcyB0aGUgYXJyYXkgZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBhcnJheS4gICovCi0KLXN0YXRpYyB2b2lkCi1hcnJheV9zdWZmaXggKHNwbnQyKQotICAgICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQyOwotewotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDE7Ci0gIGludCByYW5rOwotICBpbnQgdG90YWxfc2l6ZTsKLQotICByYW5rID0gMDsKLSAgc3BudCA9IHNwbnQyOwotICB3aGlsZSAoc3BudC0+YWR2YW5jZWQgIT0gQVJSQVkpCi0gICAgewotICAgICAgc3BudCA9IGZpbmRfc3ltYm9sIChzcG50LT50eXBlMik7Ci0gICAgICBpZiAoIXNwbnQpCi0JcmV0dXJuOwotICAgIH0KLSAgc3BudDEgPSBzcG50OwotICB0b3RhbF9zaXplID0gMTsKLSAgd2hpbGUgKHNwbnQxLT5hZHZhbmNlZCA9PSBBUlJBWSkKLSAgICB7Ci0gICAgICByYW5rKys7Ci0gICAgICB0b3RhbF9zaXplICo9IChzcG50MS0+aW5kZXhfbWF4IC0gc3BudDEtPmluZGV4X21pbiArIDEpOwotICAgICAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudDEtPnR5cGUyKTsKLSAgICB9Ci0gIHRvdGFsX3NpemUgPSB0b3RhbF9zaXplICogc3BudDEtPmRhdGFfc2l6ZTsKLSAgZnB1c2ggKHNwbnQxLT5kYXRhX3NpemUsIDIpOwkvKiBlbGVtZW50IHNpemUgKi8KLSAgaWYgKHNwbnQxLT5WTVNfdHlwZSA9PSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUpCi0gICAgZnB1c2ggKDAsIDEpOwotICBlbHNlCi0gICAgZnB1c2ggKHNwbnQxLT5WTVNfdHlwZSwgMSk7CS8qIGVsZW1lbnQgdHlwZSAqLwotICBmcHVzaCAoRFNDX0tfQ0xBU1NfQSwgMSk7CS8qIGRlc2NyaXB0b3IgY2xhc3MgKi8KLSAgZnB1c2ggKDAsIDQpOwkJCS8qIGJhc2UgYWRkcmVzcyAqLwotICBmcHVzaCAoMCwgMSk7CQkJLyogc2NhbGUgZmFjdG9yIC0tIG5vdCBhcHBsaWNhYmxlICovCi0gIGZwdXNoICgwLCAxKTsJCQkvKiBkaWdpdCBjb3VudCAtLSBub3QgYXBwbGljYWJsZSAqLwotICBmcHVzaCAoMHhjMCwgMSk7CQkvKiBmbGFnczogbXVsdGlwbGllciBibG9jayAmIGJvdW5kcyBwcmVzZW50ICovCi0gIGZwdXNoIChyYW5rLCAxKTsJCS8qIG51bWJlciBvZiBkaW1lbnNpb25zICovCi0gIGZwdXNoICh0b3RhbF9zaXplLCA0KTsKLSAgZnB1c2ggKDAsIDQpOwkJCS8qIHBvaW50ZXIgdG8gZWxlbWVudCBbMF1bMF0uLi5bMF0gKi8KLSAgc3BudDEgPSBzcG50OwotICB3aGlsZSAoc3BudDEtPmFkdmFuY2VkID09IEFSUkFZKQotICAgIHsKLSAgICAgIGZwdXNoIChzcG50MS0+aW5kZXhfbWF4IC0gc3BudDEtPmluZGV4X21pbiArIDEsIDQpOwotICAgICAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudDEtPnR5cGUyKTsKLSAgICB9Ci0gIHNwbnQxID0gc3BudDsKLSAgd2hpbGUgKHNwbnQxLT5hZHZhbmNlZCA9PSBBUlJBWSkKLSAgICB7Ci0gICAgICBmcHVzaCAoc3BudDEtPmluZGV4X21pbiwgNCk7Ci0gICAgICBmcHVzaCAoc3BudDEtPmluZGV4X21heCwgNCk7Ci0gICAgICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50MS0+dHlwZTIpOwotICAgIH0KLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIHRoZSBzdGFydCBvZiBhIHZhcmlhYmxlIGRlc2NyaXB0b3IgYmFzZWQgdXBvbgotICAgYSBzdHJ1Y3QvdW5pb24vZW51bSB0aGF0IGhhcyB5ZXQgdG8gYmUgZGVmaW5lZC4gIFdlIGRlZmluZSB0aGlzIHNwb3QgYXMKLSAgIGEgbmV3IGxvY2F0aW9uLCBhbmQgc2F2ZSBmb3VyIGJ5dGVzIGZvciB0aGUgYWRkcmVzcy4gIFdoZW4gdGhlIHN0cnVjdCBpcwotICAgZmluYWxseSBkZWZpbmVkLCB0aGVuIHdlIGNhbiBnbyBiYWNrIGFuZCBwbHVnIGluIHRoZSBjb3JyZWN0IGFkZHJlc3MuICAqLwotCi1zdGF0aWMgdm9pZAotbmV3X2ZvcndhcmRfcmVmIChkYnhfdHlwZSkKLSAgICAgaW50IGRieF90eXBlOwotewotICBzdHJ1Y3QgZm9yd2FyZF9yZWYgKmZwbnQ7Ci0gIGZwbnQgPSAoc3RydWN0IGZvcndhcmRfcmVmICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGZvcndhcmRfcmVmKSk7Ci0gIGZwbnQtPm5leHQgPSBmX3JlZl9yb290OwotICBmX3JlZl9yb290ID0gZnBudDsKLSAgZnBudC0+ZGJ4X3R5cGUgPSBkYnhfdHlwZTsKLSAgZnBudC0+c3RydWNfbnVtYiA9ICsrc3RydWN0dXJlX2NvdW50OwotICBmcG50LT5yZXNvbHZlZCA9ICdOJzsKLSAgcnB1c2ggKERTVF9LX1RTX0lORCwgMSk7CS8qIGluZGlyZWN0IHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotICB0b3RhbF9sZW4gPSA1OwotICBycHVzaCAodG90YWxfbGVuLCAyKTsKLSAgc3RydWN0X251bWJlciA9IC1mcG50LT5zdHJ1Y19udW1iOwotfQotCi0KLS8qIFRoaXMgcm91dGluZSBnZW5lcmF0ZXMgdGhlIHZhcmlhYmxlIGRlc2NyaXB0b3IgdXNlZCB0byBkZXNjcmliZSBub24tYmFzaWMKLSAgIHZhcmlhYmxlcy4gIEl0IGNhbGxzIGl0c2VsZiByZWN1cnNpdmVseSB1bnRpbCBpdCBnZXRzIHRvIHRoZSBib3R0b20gb2YgaXQKLSAgIGFsbCwgYW5kIHRoZW4gYnVpbGRzIHRoZSBkZXNjcmlwdG9yIGJhY2t3YXJkcy4gIEl0IGlzIGVhc2llc3QgdG8gZG8gaXQKLSAgIHRoaXMgd2F5IHNpbmNlIHdlIG11c3QgcGVyaW9kaWNhbGx5IHdyaXRlIGxlbmd0aCBieXRlcywgYW5kIGl0IGlzIGVhc2llc3QKLSAgIGlmIHdlIGtub3cgdGhlIHZhbHVlIHdoZW4gaXQgaXMgdGltZSB0byB3cml0ZSBpdC4gICovCi0KLXN0YXRpYyBpbnQKLWdlbjEgKHNwbnQsIGFycmF5X3N1ZmZpeF9sZW4pCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgICAgaW50IGFycmF5X3N1ZmZpeF9sZW47Ci17Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDE7Ci0gIGludCBpOwotCi0gIHN3aXRjaCAoc3BudC0+YWR2YW5jZWQpCi0gICAgewotICAgIGNhc2UgVk9JRDoKLSAgICAgIHJwdXNoIChEQkdfU19DX1ZPSUQsIDEpOwotICAgICAgdG90YWxfbGVuICs9IDE7Ci0gICAgICBycHVzaCAodG90YWxfbGVuLCAyKTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgQkFTSUM6Ci0gICAgY2FzZSBGVU5DVElPTjoKLSAgICAgIGlmIChhcnJheV9zdWZmaXhfbGVuID09IDApCi0JewotCSAgcnB1c2ggKHNwbnQtPlZNU190eXBlLCAxKTsKLQkgIHJwdXNoIChEQkdfU19DX0JBU0lDLCAxKTsKLQkgIHRvdGFsX2xlbiA9IDI7Ci0JICBycHVzaCAodG90YWxfbGVuLCAyKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICAgIHJwdXNoICgwLCA0KTsKLSAgICAgIHJwdXNoIChEU1RfS19WRkxBR1NfRFNDLCAxKTsKLSAgICAgIHJwdXNoIChEU1RfS19UU19EU0MsIDEpOwkvKiBkZXNjcmlwdG9yIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotICAgICAgdG90YWxfbGVuID0gLTI7Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIFNUUlVDVDoKLSAgICBjYXNlIFVOSU9OOgotICAgIGNhc2UgRU5VTToKLSAgICAgIHN0cnVjdF9udW1iZXIgPSBzcG50LT5zdHJ1Y19udW1iOwotICAgICAgaWYgKHN0cnVjdF9udW1iZXIgPCAwKQotCXsKLQkgIG5ld19mb3J3YXJkX3JlZiAoc3BudC0+ZGJ4X3R5cGUpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgcnB1c2ggKERCR19TX0NfU1RSVUNULCAxKTsKLSAgICAgIHRvdGFsX2xlbiA9IDU7Ci0gICAgICBycHVzaCAodG90YWxfbGVuLCAyKTsKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgUE9JTlRFUjoKLSAgICAgIHNwbnQxID0gZmluZF9zeW1ib2wgKHNwbnQtPnR5cGUyKTsKLSAgICAgIGkgPSAxOwotICAgICAgaWYgKCFzcG50MSkKLQluZXdfZm9yd2FyZF9yZWYgKHNwbnQtPnR5cGUyKTsKLSAgICAgIGVsc2UKLQlpID0gZ2VuMSAoc3BudDEsIDApOwotICAgICAgaWYgKGkpCi0JewkvKiAoKnZvaWQpIGlzIGEgc3BlY2lhbCBjYXNlLCBkbyBub3QgcHV0IHBvaW50ZXIgc3VmZml4ICovCi0JICBycHVzaCAoREJHX1NfQ19QT0lOVEVSLCAxKTsKLQkgIHRvdGFsX2xlbiArPSAzOwotCSAgcnB1c2ggKHRvdGFsX2xlbiwgMik7Ci0JfQotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBBUlJBWToKLSAgICAgIHNwbnQxID0gc3BudDsKLSAgICAgIHdoaWxlIChzcG50MS0+YWR2YW5jZWQgPT0gQVJSQVkpCi0JewotCSAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudDEtPnR5cGUyKTsKLQkgIGlmICghc3BudDEpCi0JICAgIHsKLQkgICAgICBhc190c2t0c2sgKF8oImRlYnVnZ2VyIGZvcndhcmQgcmVmZXJlbmNlIGVycm9yLCBkYnggdHlwZSAlZCIpLAotCQkJIHNwbnQtPnR5cGUyKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLS8qIEl0IGlzIHRvbyBsYXRlIHRvIGdlbmVyYXRlIGZvcndhcmQgcmVmZXJlbmNlcywgc28gdGhlIHVzZXIgZ2V0cyBhIG1lc3NhZ2UuCi0gKiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBvbiBhIGNvbXBpbGVyIGVycm9yICovCi0gICAgICAodm9pZCkgZ2VuMSAoc3BudDEsIDEpOwotICAgICAgaSA9IEFwb2ludDsKLSAgICAgIGFycmF5X3N1ZmZpeCAoc3BudCk7Ci0gICAgICBhcnJheV9zdWZmaXhfbGVuID0gQXBvaW50IC0gaTsKLSAgICAgIHN3aXRjaCAoc3BudDEtPmFkdmFuY2VkKQotCXsKLQljYXNlIEJBU0lDOgotCWNhc2UgRlVOQ1RJT046Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcnB1c2ggKDAsIDIpOwotCSAgdG90YWxfbGVuICs9IDI7Ci0JICBycHVzaCAodG90YWxfbGVuLCAyKTsKLQkgIHJwdXNoIChEU1RfS19WRkxBR1NfRFNDLCAxKTsKLQkgIHJwdXNoICgxLCAxKTsJCS8qIGZsYWdzOiBlbGVtZW50IHZhbHVlIHNwZWMgaW5jbHVkZWQgKi8KLQkgIHJwdXNoICgxLCAxKTsJCS8qIG9uZSBkaW1lbnNpb24gKi8KLQkgIHJwdXNoIChEQkdfU19DX0NPTVBMRVhfQVJSQVksIDEpOwotCX0KLSAgICAgIHRvdGFsX2xlbiArPSBhcnJheV9zdWZmaXhfbGVuICsgODsKLSAgICAgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoJLyogbGludCBzdXBwcmVzc2lvbiAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGlzIGdlbmVyYXRlcyBhIHN1ZmZpeCBmb3IgYSB2YXJpYWJsZS4gIElmIGl0IGlzIG5vdCBhIGRlZmluZWQgdHlwZSB5ZXQsCi0gICB0aGVuIGRieF90eXBlIGNvbnRhaW5zIHRoZSB0eXBlIHdlIGFyZSBleHBlY3Rpbmcgc28gd2UgY2FuIGdlbmVyYXRlIGEKLSAgIGZvcndhcmQgcmVmZXJlbmNlLiAgVGhpcyBjYWxscyBnZW4xIHRvIGJ1aWxkIG1vc3Qgb2YgdGhlIGRlc2NyaXB0b3IsIGFuZAotICAgdGhlbiBpdCBwdXRzIHRoZSBpY2luZyBvbiBhdCB0aGUgZW5kLiAgSXQgdGhlbiBkdW1wcyB3aGF0ZXZlciBpcyBuZWVkZWQKLSAgIHRvIGdldCBhIGNvbXBsZXRlIGRlc2NyaXB0b3IgKGkuZS4gc3RydWN0IHJlZmVyZW5jZSwgYXJyYXkgc3VmZml4KS4gICovCi0KLXN0YXRpYyB2b2lkCi1nZW5lcmF0ZV9zdWZmaXggKHNwbnQsIGRieF90eXBlKQotICAgICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gICAgIGludCBkYnhfdHlwZTsKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgcHZvaWRbNl0gPSB7Ci0JCTUsCQkvKiByZWNvcmQubGVuZ3RoID09IDUgKi8KLQkJRFNUX0tfVFlQU1BFQywJLyogcmVjb3JkLnR5cGUgPT0gMSAodHlwZSBzcGVjaWZpY2F0aW9uKSAqLwotCQkwLAkJLyogbmFtZS5sZW5ndGggPT0gMCwgbm8gbmFtZSBmb2xsb3dzICovCi0JCTEsIDAsCQkvKiB0eXBlLmxlbmd0aCA9PSAxIHsyIGJ5dGVzLCBsaXR0bGUgZW5kaWFufSAqLwotCQlEQkdfU19DX1ZPSUQJLyogdHlwZS50eXBlID09IDUgKHBvaW50ZXIgdG8gdW5zcGVjaWZpZWQpICovCi0gIH07Ci0gIGludCBpOwotCi0gIEFwb2ludCA9IDA7Ci0gIExwbnQgPSBNQVhfREVCVUdfUkVDT1JEIC0gMTsKLSAgdG90YWxfbGVuID0gMDsKLSAgc3RydWN0X251bWJlciA9IDA7Ci0gIG92ZXJmbG93ID0gMDsKLSAgaWYgKCFzcG50KQotICAgIG5ld19mb3J3YXJkX3JlZiAoZGJ4X3R5cGUpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKHNwbnQtPlZNU190eXBlICE9IERCR19TX0NfQURWQU5DRURfVFlQRSkKLQlyZXR1cm47CQkvKiBubyBzdWZmaXggbmVlZGVkICovCi0gICAgICBnZW4xIChzcG50LCAwKTsKLSAgICB9Ci0gIHJwdXNoICgwLCAxKTsJCS8qIG5vIG5hbWUgKGxlbj09MCkgKi8KLSAgcnB1c2ggKERTVF9LX1RZUFNQRUMsIDEpOwotICB0b3RhbF9sZW4gKz0gNDsKLSAgcnB1c2ggKHRvdGFsX2xlbiwgMSk7Ci0gIC8qIElmIHRoZSB2YXJpYWJsZSBkZXNjcmlwdG9yIG92ZXJmbG93cyB0aGUgcmVjb3JkLCBvdXRwdXQgYSBkZXNjcmlwdG9yCi0gICAgIGZvciBhIHBvaW50ZXIgdG8gdm9pZC4gICovCi0gIGlmICgodG90YWxfbGVuID49IE1BWF9ERUJVR19SRUNPUkQpIHx8IG92ZXJmbG93KQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIlZhcmlhYmxlIGRlc2NyaXB0b3IgJWQgdG9vIGNvbXBsaWNhdGVkLiAgRGVmaW5lZCBhcyBgdm9pZCAqJy4iKSwKLQkJc3BudC0+ZGJ4X3R5cGUpOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChwdm9pZCwgNiwgT0JKX1NfQ19EQkcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaSA9IDA7Ci0gIHdoaWxlIChMcG50IDwgTUFYX0RFQlVHX1JFQ09SRCAtIDEpCi0gICAgTG9jYWxbaSsrXSA9IExvY2FsWysrTHBudF07Ci0gIExwbnQgPSBpOwotICAvKiB3ZSB1c2UgdGhpcyBmb3IgcmVmZXJlbmNlIHRvIHN0cnVjdHVyZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCAqLwotICBpZiAoc3RydWN0X251bWJlciA+IDApCi0gICAgewotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOwotICAgICAgTHBudCA9IDA7Ci0gICAgICBWTVNfU3RvcmVfU3RydWN0IChzdHJ1Y3RfbnVtYmVyKTsKLSAgICB9Ci0gIC8qIFdlIHVzZSB0aGlzIGZvciBhIGZvcndhcmQgcmVmZXJlbmNlIHRvIGEgc3RydWN0dXJlIHRoYXQgaGFzIHlldCB0bwotICAgICBiZSBkZWZpbmVkLiAgV2Ugc3RvcmUgZm91ciBieXRlcyBvZiB6ZXJvIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIGFjdHVhbAotICAgICBhZGRyZXNzIG9uY2UgaXQgaXMga25vd24uICAqLwotICBpZiAoc3RydWN0X251bWJlciA8IDApCi0gICAgewotICAgICAgc3RydWN0X251bWJlciA9IC1zdHJ1Y3RfbnVtYmVyOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOwotICAgICAgTHBudCA9IDA7Ci0gICAgICBWTVNfRGVmX1N0cnVjdCAoc3RydWN0X251bWJlcik7Ci0gICAgICBDT1BZX0xPTkcgKCZMb2NhbFtMcG50XSwgMEwpOwotICAgICAgTHBudCArPSA0OwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOwotICAgICAgTHBudCA9IDA7Ci0gICAgfQotICBpID0gMDsKLSAgd2hpbGUgKGkgPCBBcG9pbnQpCi0gICAgTG9jYWxbTHBudCsrXSA9IEFzdWZmaXhbaSsrXTsKLSAgaWYgKExwbnQgIT0gMCkKLSAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gIExwbnQgPSAwOwotfQotCi0KLQkvKiAibm92ZWwgbGVuZ3RoIiB0eXBlIGRvZXNuJ3Qgd29yayBmb3Igc2ltcGxlIGF0b21pYyB0eXBlcyAqLwotI2RlZmluZSBVU0VfQklUU1RSSU5HX0RFU0NSSVBUT1IodCkgKCh0KS0+YWR2YW5jZWQgPT0gQkFTSUMpCi0jdW5kZWYgU0VUVVBfQkFTSUNfVFlQRVMKLQotLyogVGhpcyByb3V0aW5lIGdlbmVyYXRlcyBhIHR5cGUgZGVzY3JpcHRpb24gZm9yIGEgYml0ZmllbGQuICAqLwotCi1zdGF0aWMgdm9pZAotYml0ZmllbGRfc3VmZml4IChzcG50LCB3aWR0aCkKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICAgICBpbnQgd2lkdGg7Ci17Ci0gIExvY2FsW0xwbnQrK10gPSAxMzsJCQkvKiByZWMubGVuPT0xMyAqLwotICBMb2NhbFtMcG50KytdID0gRFNUX0tfVFlQU1BFQzsJLyogYSB0eXBlIHNwZWNpZmljYXRpb24gcmVjb3JkICovCi0gIExvY2FsW0xwbnQrK10gPSAwOwkJCS8qIG5vdCBuYW1lZCAqLwotICBDT1BZX1NIT1JUICgmTG9jYWxbTHBudF0sIDkpOwkJLyogdHlwLmxlbj09OSAqLwotICBMcG50ICs9IDI7Ci0gIExvY2FsW0xwbnQrK10gPSBEU1RfS19UU19OT1ZfTEVORzsJLyogVGhpcyB0eXBlIGlzIGEgIm5vdmVsIGxlbmd0aCIKLQkJCQkJICAgaW5jYXJuYXRpb24gb2Ygc29tZSBvdGhlciB0eXBlLiAgKi8KLSAgQ09QWV9MT05HICgmTG9jYWxbTHBudF0sIHdpZHRoKTsJLyogc2l6ZSBpbiBiaXRzID09IG5vdmVsIGxlbmd0aCAqLwotICBMcG50ICs9IDQ7Ci0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIExwbnQsIE9CSl9TX0NfREJHKTsKLSAgTHBudCA9IDA7Ci0gIC8qIGFzc2VydCggc3BudC0+c3RydWNfbnVtYiA+IDAgKTsgKi8KLSAgVk1TX1N0b3JlX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7CS8qIG91dHB1dCA0IG1vcmUgYnl0ZXMgKi8KLX0KLQotCi0vKiBGb3JtYWxseSBkZWZpbmUgYSBidWlsdGluIHR5cGUsIHNvIHRoYXQgaXQgY2FuIHNlcnZlIGFzIHRoZSB0YXJnZXQgb2YKLSAgIGFuIGluZGlyZWN0IHJlZmVyZW5jZS4gIEl0IG1ha2VzIGJpdGZpZWxkX3N1ZmZpeCgpIGVhc2llciBieSBhdm9pZGluZwotICAgdGhlIG5lZWQgdG8gdXNlIGEgZm9yd2FyZCByZWZlcmVuY2UgZm9yIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2gKLSAgIHR5cGUgdXNlZCBpbiBhIGJpdGZpZWxkLiAgKi8KLQotc3RhdGljIHZvaWQKLXNldHVwX2Jhc2ljX3R5cGUgKHNwbnQpCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLXsKLSNpZmRlZiBTRVRVUF9CQVNJQ19UWVBFUwotICAvKiBUaGlzIHdvdWxkIGJlIHZlcnkgdXNlZnVsIGlmICJub3ZlbCBsZW5ndGgiIGZpZWxkcyBhY3R1YWxseSB3b3JrZWQKLSAgICAgd2l0aCBiYXNpYyB0eXBlcyBsaWtlIHRoZXkgZG8gd2l0aCBlbnVtZXJhdGVkIHR5cGVzLiAgSG93ZXZlciwKLSAgICAgdGhleSBkbyBub3QsIHNvIHRoaXMgaXNuJ3Qgd29ydGggZG9pbmcganVzdCBzbyB0aGF0IHlvdSBjYW4gdXNlCi0gICAgIEVYQU1JTkUvVFlQRT0oX19sb25nX2xvbmdfaW50KSBpbnN0ZWFkIG9mIEVYQU1JTkUvUVVBRC4gICovCi0gIGNoYXIgKnA7Ci0jaWZuZGVmIFNFVFVQX1NZTk9OWU1fVFlQRVMKLSAgLyogVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgY29tcGF0aWJsZSB0aGluZ3MgbGlrZSBgaW50JyBhbmQgYGxvbmcgaW50JwotICAgICBvdWdodCB0byBoYXZlIGRpc3RpbmN0IHR5cGUgcmVjb3JkcyByYXRoZXIgdGhhbiBzaGFyaW5nIG9uZS4gICovCi0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDI7Ci0KLSAgLyogZmlyc3QgY2hlY2sgd2hldGhlciB0aGlzIHR5cGUgaGFzIGFscmVhZHkgYmVlbiBzZWVuIGJ5IGFub3RoZXIgbmFtZSAqLwotICBmb3IgKHNwbnQyID0gVk1TX1N5bWJvbF90eXBlX2xpc3RbU1lNVFlQX0hBU0ggKHNwbnQtPlZNU190eXBlKV07Ci0gICAgICAgc3BudDI7Ci0gICAgICAgc3BudDIgPSBzcG50Mi0+bmV4dCkKLSAgICBpZiAoc3BudDIgIT0gc3BudCAmJiBzcG50Mi0+Vk1TX3R5cGUgPT0gc3BudC0+Vk1TX3R5cGUpCi0gICAgICB7Ci0Jc3BudC0+c3RydWNfbnVtYiA9IHNwbnQyLT5zdHJ1Y19udW1iOwotCXJldHVybjsKLSAgICAgIH0KLSNlbmRpZgotCi0gIC8qIGBzdHJ1Y3R1cmUgbnVtYmVyJyBkb2Vzbid0IHJlYWxseSBtZWFuIGBzdHJ1Y3R1cmUnOyBpdCBtZWFucyBhbiBpbmRleAotICAgICBpbnRvIGEgbGlua2VyIG1haW50YWluZWQgc2V0IG9mIHNhdmVkIGxvY2F0aW9ucyB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZAotICAgICBhZ2FpbiBsYXRlci4gICovCi0gIHNwbnQtPnN0cnVjX251bWIgPSArK3N0cnVjdHVyZV9jb3VudDsKLSAgVk1TX0RlZl9TdHJ1Y3QgKHNwbnQtPnN0cnVjX251bWIpOwkvKiByZW1lbWJlciB3aGVyZSB0aGlzIHR5cGUgbGl2ZXMgKi8KLSAgLyogZGVmaW5lIHRoZSBzaW1wbGUgc2NhbGFyIHR5cGUgKi8KLSAgTG9jYWxbTHBudCsrXSA9IDYgKyBzdHJsZW4gKHN5bWJvbF9uYW1lKSArIDI7CS8qIHJlYy5sZW4gKi8KLSAgTG9jYWxbTHBudCsrXSA9IERTVF9LX1RZUFNQRUM7CS8qIHJlYy50eXA9PXR5cGUgc3BlY2lmaWNhdGlvbiAqLwotICBMb2NhbFtMcG50KytdID0gc3RybGVuIChzeW1ib2xfbmFtZSkgKyAyOwotICBMb2NhbFtMcG50KytdID0gJ18nOwkJCS8qIHByZWZpeCBuYW1lIHdpdGggIl9fIiAqLwotICBMb2NhbFtMcG50KytdID0gJ18nOwotICBmb3IgKHAgPSBzeW1ib2xfbmFtZTsgKnA7IHArKykKLSAgICBMb2NhbFtMcG50KytdID0gKnAgPT0gJyAnID8gJ18nIDogKnA7Ci0gIENPUFlfU0hPUlQgKCZMb2NhbFtMcG50XSwgMik7CQkvKiB0eXAubGVuPT0yICovCi0gIExwbnQgKz0gMjsKLSAgTG9jYWxbTHBudCsrXSA9IERTVF9LX1RTX0FUT007CS8qIHR5cC5raW5kIGlzIHNpbXBsZSB0eXBlICovCi0gIExvY2FsW0xwbnQrK10gPSBzcG50LT5WTVNfdHlwZTsJLyogdHlwLnR5cGUgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOwotICBMcG50ID0gMDsKLSNlbmRpZgkvKiBTRVRVUF9CQVNJQ19UWVBFUyAqLwotICByZXR1cm47Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGdlbmVyYXRlcyBhIHN5bWJvbCBkZWZpbml0aW9uIGZvciBhIEMgc3ltYm9sIGZvciB0aGUgZGVidWdnZXIuCi0gICBJdCB0YWtlcyBhIHBzZWN0IGFuZCBvZmZzZXQgZm9yIGdsb2JhbCBzeW1ib2xzOyBpZiBwc2VjdCA8IDAsIHRoZW4gdGhpcyBpcwotICAgYSBsb2NhbCB2YXJpYWJsZSBhbmQgdGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0byBGUC4gIEluIHRoaXMgY2FzZSBpdCBjYW4KLSAgIGJlIGVpdGhlciBhIHZhcmlhYmxlIChPZmZzZXQgPCAwKSBvciBhIHBhcmFtZXRlciAoT2Zmc2V0ID4gMCkuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX0RCR19yZWNvcmQgKHNwbnQsIFBzZWN0LCBPZmZzZXQsIE5hbWUpCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgICAgaW50IFBzZWN0OwotICAgICBpbnQgT2Zmc2V0OwotICAgICBjaGFyICpOYW1lOwotewotICBjaGFyICpOYW1lX3BudDsKLSAgaW50IGxlbjsKLSAgaW50IGkgPSAwOwotCi0gIC8qIGlmIHRoZXJlIGFyZSBiYWQgY2hhcmFjdGVycyBpbiBuYW1lLCBjb252ZXJ0IHRoZW0gKi8KLSAgTmFtZV9wbnQgPSBmaXhfbmFtZSAoTmFtZSk7Ci0KLSAgbGVuID0gc3RybGVuIChOYW1lX3BudCk7Ci0gIGlmIChQc2VjdCA8IDApCi0gICAgewkJCQkvKiB0aGlzIGlzIGEgbG9jYWwgdmFyaWFibGUsIHJlZmVyZW5jZWQgdG8gU1AgKi8KLSAgICAgIExvY2FsW2krK10gPSA3ICsgbGVuOwotICAgICAgTG9jYWxbaSsrXSA9IHNwbnQtPlZNU190eXBlOwotICAgICAgTG9jYWxbaSsrXSA9IChPZmZzZXQgPiAwKSA/IERCR19DX0ZVTkNUSU9OX1BBUkFNIDogREJHX0NfTE9DQUxfU1lNOwotICAgICAgQ09QWV9MT05HICgmTG9jYWxbaV0sIE9mZnNldCk7Ci0gICAgICBpICs9IDQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgTG9jYWxbaSsrXSA9IDcgKyBsZW47Ci0gICAgICBMb2NhbFtpKytdID0gc3BudC0+Vk1TX3R5cGU7Ci0gICAgICBMb2NhbFtpKytdID0gRFNUX0tfVkFMS0lORF9BRERSOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAgICAgaSA9IDA7Ci0gICAgICBWTVNfU2V0X0RhdGEgKFBzZWN0LCBPZmZzZXQsIE9CSl9TX0NfREJHLCAwKTsKLSAgICB9Ci0gIExvY2FsW2krK10gPSBsZW47Ci0gIHdoaWxlICgqTmFtZV9wbnQgIT0gJ1wwJykKLSAgICBMb2NhbFtpKytdID0gKk5hbWVfcG50Kys7Ci0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKLSAgaWYgKHNwbnQtPlZNU190eXBlID09IERCR19TX0NfQURWQU5DRURfVFlQRSkKLSAgICBnZW5lcmF0ZV9zdWZmaXggKHNwbnQsIDApOwotfQotCi0KLS8qIFRoaXMgcm91dGluZSBwYXJzZXMgdGhlIHN0YWJzIGVudHJpZXMgaW4gb3JkZXIgdG8gbWFrZSB0aGUgZGVmaW5pdGlvbgotICAgZm9yIHRoZSBkZWJ1Z2dlciBvZiBsb2NhbCBzeW1ib2xzIGFuZCBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19sb2NhbF9zdGFiX1BhcnNlIChzcCkKLSAgICAgc3ltYm9sUyAqc3A7Ci17Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgY2hhciAqcG50OwotICBjaGFyICpwbnQxOwotICBjaGFyICpzdHI7Ci0gIGludCBkYnhfdHlwZTsKLQotICBkYnhfdHlwZSA9IDA7Ci0gIHN0ciA9IFNfR0VUX05BTUUgKHNwKTsKLSAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIsICc6Jyk7Ci0gIGlmICghcG50KQotICAgIHJldHVybjsJCQkvKiBubyBjb2xvbiBwcmVzZW50ICovCi0gIHBudDEgPSBwbnQrKzsJCQkvKiBzYXZlIHRoaXMgZm9yIGxhdGVyLCBhbmQgc2tpcCBjb2xvbiAqLwotICBpZiAoKnBudCA9PSAnYycpCi0gICAgcmV0dXJuOwkJCS8qIGlnbm9yZSBzdGF0aWMgY29uc3RhbnRzICovCi0KLS8qIHRoZXJlIGlzIG9uZSBsaXR0bGUgY2F0Y2ggdGhhdCB3ZSBtdXN0IGJlIGF3YXJlIG9mLiAgU29tZXRpbWVzIGZ1bmN0aW9uCi0gKiBwYXJhbWV0ZXJzIGFyZSBvcHRpbWl6ZWQgaW50byByZWdpc3RlcnMsIGFuZCB0aGUgY29tcGlsZXIsIGluIGl0cyBpbmZpaXRlCi0gKiB3aXNkb20gb3V0cHV0cyBzdGFicyByZWNvcmRzIGZvciAqYm90aCouICBJbiBnZW5lcmFsIHdlIHdhbnQgdG8gdXNlIHRoZQotICogcmVnaXN0ZXIgaWYgaXQgaXMgcHJlc2VudCwgc28gd2UgbXVzdCBzZWFyY2ggdGhlIHJlc3Qgb2YgdGhlIHN5bWJvbHMgZm9yCi0gKiB0aGlzIGZ1bmN0aW9uIHRvIHNlZSBpZiB0aGlzIHBhcmFtZXRlciBpcyBhc3NpZ25lZCB0byBhIHJlZ2lzdGVyLgotICovCi0gIHsKLSAgICBzeW1ib2xTICpzcDE7Ci0gICAgY2hhciAqc3RyMTsKLSAgICBjaGFyICpwbnQyOwotCi0gICAgaWYgKCpwbnQgPT0gJ3AnKQotICAgICAgewotCWZvciAoc3AxID0gc3ltYm9sX25leHQgKHNwKTsgc3AxOyBzcDEgPSBzeW1ib2xfbmV4dCAoc3AxKSkKLQkgIHsKLQkgICAgaWYgKCFTX0lTX0RFQlVHIChzcDEpKQotCSAgICAgIGNvbnRpbnVlOwotCSAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHNwMSkgPT0gTl9GVU4pCi0JICAgICAgewotCQlwbnQyID0gKGNoYXIgKikgc3RyY2hyIChTX0dFVF9OQU1FIChzcDEpLCAnOicpICsgMTsKLQkJaWYgKCpwbnQyID09ICdGJyB8fCAqcG50MiA9PSAnZicpCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHNwMSkgIT0gTl9SU1lNKQotCSAgICAgIGNvbnRpbnVlOwotCSAgICBzdHIxID0gU19HRVRfTkFNRSAoc3AxKTsJLyogYW5kIGdldCB0aGUgbmFtZSAqLwotCSAgICBwbnQyID0gc3RyOwotCSAgICB3aGlsZSAoKnBudDIgIT0gJzonKQotCSAgICAgIHsKLQkJaWYgKCpwbnQyICE9ICpzdHIxKQotCQkgIGJyZWFrOwotCQlwbnQyKys7Ci0JCXN0cjErKzsKLQkgICAgICB9Ci0JICAgIGlmICgqc3RyMSA9PSAnOicgJiYgKnBudDIgPT0gJzonKQotCSAgICAgIHJldHVybjsJLyogdGhleSBhcmUgdGhlIHNhbWUhICBsZXRzIHNraXAgdGhpcyBvbmUgKi8KLQkgIH0JCQkvKiBmb3IgKi8KLQlwbnQrKzsJCQkvKiBza2lwIHAgaW4gY2FzZSBubyByZWdpc3RlciAqLwotICAgICAgfQkJCS8qIGlmICovCi0gIH0JCQkJLyogcCBibG9jayAqLwotCi0gIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQsICZkYnhfdHlwZSk7Ci0gIHNwbnQgPSBmaW5kX3N5bWJvbCAoZGJ4X3R5cGUpOwotICBpZiAoIXNwbnQpCi0gICAgcmV0dXJuOwkJCS8qRHVubm8gd2hhdCB0aGlzIGlzKi8KLSAgKnBudDEgPSAnXDAnOwotICBWTVNfREJHX3JlY29yZCAoc3BudCwgLTEsIFNfR0VUX1ZBTFVFIChzcCksIHN0cik7Ci0gICpwbnQxID0gJzonOwkJCS8qIGFuZCByZXN0b3JlIHRoZSBzdHJpbmcgKi8KLSAgcmV0dXJuOwotfQotCi0KLS8qIFRoaXMgcm91dGluZSBwYXJzZXMgYSBzdGFicyBlbnRyeSB0byBmaW5kIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZAotICAgdG8gZGVmaW5lIGEgdmFyaWFibGUuICBJdCBpcyB1c2VkIGZvciBnbG9iYWwgYW5kIHN0YXRpYyB2YXJpYWJsZXMuCi0gICBCYXNpY2FsbHkgd2UgbmVlZCB0byBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wuICBXaXRoIG9sZGVyCi0gICB2ZXJzaW9ucyBvZiB0aGUgY29tcGlsZXIsIGNvbnN0IHN5bWJvbHMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHksIGluCi0gICB0aGF0IGlmIHRoZXkgYXJlIGdsb2JhbCB0aGV5IGFyZSB3cml0dGVuIGludG8gdGhlIHRleHQgcHNlY3QuICBUaGUKLSAgIGdsb2JhbCBzeW1ib2wgZW50cnkgZm9yIHN1Y2ggYSBjb25zdCBpcyBhY3R1YWxseSB3cml0dGVuIGFzIGEgcHJvZ3JhbQotICAgZW50cnkgcG9pbnQgKFl1ayEhKSwgc28gaWYgd2UgY2Fubm90IGZpbmQgYSBzeW1ib2wgaW4gdGhlIGxpc3Qgb2YKLSAgIHBzZWN0cywgd2UgbXVzdCBzZWFyY2ggdGhlIGVudHJ5IHBvaW50cyBhcyB3ZWxsLiAgc3RhdGljIGNvbnN0cyBhcmUKLSAgIGV2ZW4gaGFyZGVyLCBzaW5jZSB0aGV5IGFyZSBuZXZlciBhc3NpZ25lZCBhIG1lbW9yeSBhZGRyZXNzLiAgVGhlCi0gICBjb21waWxlciBwYXNzZXMgYSBzdGFiIHRvIHRlbGwgdXMgdGhlIHZhbHVlLCBidXQgSSBhbSBub3Qgc3VyZSB3aGF0Ci0gICB0byBkbyB3aXRoIGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19zdGFiX3BhcnNlIChzcCwgZXhwZWN0ZWRfdHlwZSwgdHlwZTEsIHR5cGUyLCBUZXh0X1BzZWN0KQotICAgICBzeW1ib2xTICpzcDsKLSAgICAgaW50IGV4cGVjdGVkX3R5cGU7CS8qIGNoYXIgKi8KLSAgICAgaW50IHR5cGUxLCB0eXBlMiwgVGV4dF9Qc2VjdDsKLXsKLSAgY2hhciAqcG50OwotICBjaGFyICpwbnQxOwotICBjaGFyICpzdHI7Ci0gIHN5bWJvbFMgKnNwMTsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICBzdHJ1Y3QgVk1TX1N5bWJvbCAqdnNwOwotICBpbnQgZGJ4X3R5cGU7Ci0KLSAgZGJ4X3R5cGUgPSAwOwotICBzdHIgPSBTX0dFVF9OQU1FIChzcCk7Ci0gIHBudCA9IChjaGFyICopIHN0cmNociAoc3RyLCAnOicpOwotICBpZiAoIXBudCkKLSAgICByZXR1cm47CQkJLyogbm8gY29sb24gcHJlc2VudCAqLwotICBwbnQxID0gcG50OwkJCS8qIHNhdmUgdGhpcyBmb3IgbGF0ZXIqLwotICBwbnQrKzsKLSAgaWYgKCpwbnQgPT0gZXhwZWN0ZWRfdHlwZSkKLSAgICB7Ci0gICAgICBwbnQgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJmRieF90eXBlKTsKLSAgICAgIHNwbnQgPSBmaW5kX3N5bWJvbCAoZGJ4X3R5cGUpOwotICAgICAgaWYgKCFzcG50KQotCXJldHVybjsJCS8qRHVubm8gd2hhdCB0aGlzIGlzKi8KLSAgICAgIC8qCi0gICAgICAgKiBOb3cgd2UgbmVlZCB0byBzZWFyY2ggdGhlIHN5bWJvbCB0YWJsZSB0byBmaW5kIHRoZSBwc2VjdCBhbmQKLSAgICAgICAqIG9mZnNldCBmb3IgdGhpcyB2YXJpYWJsZS4KLSAgICAgICAqLwotICAgICAgKnBudDEgPSAnXDAnOwotICAgICAgdnNwID0gVk1TX1N5bWJvbHM7Ci0gICAgICB3aGlsZSAodnNwKQotCXsKLQkgIHBudCA9IFNfR0VUX05BTUUgKHZzcC0+U3ltYm9sKTsKLQkgIGlmIChwbnQgJiYgKnBudCsrID09ICdfJwotCSAgICAgIC8qIG1ha2Ugc3VyZSBuYW1lIGlzIHRoZSBzYW1lIGFuZCBzeW1ib2wgdHlwZSBtYXRjaGVzICovCi0JICAgICAgJiYgc3RyY21wIChwbnQsIHN0cikgPT0gMAotCSAgICAgICYmIChTX0dFVF9SQVdfVFlQRSAodnNwLT5TeW1ib2wpID09IHR5cGUxCi0JCSAgfHwgU19HRVRfUkFXX1RZUEUgKHZzcC0+U3ltYm9sKSA9PSB0eXBlMikpCi0JICAgIGJyZWFrOwotCSAgdnNwID0gdnNwLT5OZXh0OwotCX0KLSAgICAgIGlmICh2c3ApCi0JewotCSAgVk1TX0RCR19yZWNvcmQgKHNwbnQsIHZzcC0+UHNlY3RfSW5kZXgsIHZzcC0+UHNlY3RfT2Zmc2V0LCBzdHIpOwotCSAgKnBudDEgPSAnOic7CQkvKiBhbmQgcmVzdG9yZSB0aGUgc3RyaW5nICovCi0JICByZXR1cm47Ci0JfQotICAgICAgLyogVGhlIHN5bWJvbCB3YXMgbm90IGluIHRoZSBzeW1ib2wgbGlzdCwgYnV0IGl0IG1heSBiZSBhbgotICAgICAgICAgImVudHJ5IHBvaW50IiBpZiBpdCB3YXMgYSBjb25zdGFudC4gICovCi0gICAgICBmb3IgKHNwMSA9IHN5bWJvbF9yb290UDsgc3AxOyBzcDEgPSBzeW1ib2xfbmV4dCAoc3AxKSkKLQl7Ci0JICAvKgotCSAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlCi0JICAgKi8KLQkgIGlmIChTX0lTX0RFQlVHIChzcDEpIHx8IChTX0dFVF9UWVBFIChzcDEpICE9IE5fVEVYVCkpCi0JICAgIGNvbnRpbnVlOwotCSAgcG50ID0gU19HRVRfTkFNRSAoc3AxKTsKLQkgIGlmICgqcG50ID09ICdfJykKLQkgICAgcG50Kys7Ci0JICBpZiAoc3RyY21wIChwbnQsIHN0cikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICghZ2F2ZV9jb21waWxlcl9tZXNzYWdlICYmIGV4cGVjdGVkX3R5cGUgPT0gJ0cnKQotCQl7Ci0JCSAgY2hhciAqbG9uZ19jb25zdF9tc2cgPSBfKCJcCi0qKipXYXJuaW5nIC0gdGhlIGFzc2VtYmx5IGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBoYXMgcGxhY2VkIFxuXAotIGdsb2JhbCBjb25zdGFudChzKSBpbiB0aGUgdGV4dCBwc2VjdC4gIFRoZXNlIHdpbGwgbm90IGJlIGF2YWlsYWJsZSB0byBcblwKLSBvdGhlciBtb2R1bGVzLCBzaW5jZSB0aGlzIGlzIG5vdCB0aGUgY29ycmVjdCB3YXkgdG8gaGFuZGxlIHRoaXMuIFlvdSBcblwKLSBoYXZlIHR3byBvcHRpb25zOiAxKSBnZXQgYSBwYXRjaGVkIGNvbXBpbGVyIHRoYXQgZG9lcyBub3QgcHV0IGdsb2JhbCBcblwKLSBjb25zdGFudHMgaW4gdGhlIHRleHQgcHNlY3QsIG9yIDIpIHJlbW92ZSB0aGUgJ2NvbnN0JyBrZXl3b3JkIGZyb20gXG5cCi0gZGVmaW5pdGlvbnMgb2YgZ2xvYmFsIHZhcmlhYmxlcyBpbiB5b3VyIHNvdXJjZSBtb2R1bGUocykuICBEb24ndCBzYXkgXG5cCi0gSSBkaWRuJ3Qgd2FybiB5b3UhIFxuIik7Ci0KLQkJICBhc190c2t0c2sgKGxvbmdfY29uc3RfbXNnKTsKLQkJICBnYXZlX2NvbXBpbGVyX21lc3NhZ2UgPSAxOwotCQl9Ci0JICAgICAgVk1TX0RCR19yZWNvcmQgKHNwbnQsCi0JCQkgICAgICBUZXh0X1BzZWN0LAotCQkJICAgICAgU19HRVRfVkFMVUUgKHNwMSksCi0JCQkgICAgICBzdHIpOwotCSAgICAgICpwbnQxID0gJzonOwotCSAgICAgIC8qIGZvb2wgYXNzZW1ibGVyIHRvIG5vdCBvdXRwdXQgdGhpcyBhcyBhIHJvdXRpbmUgaW4gdGhlIFRCVCAqLwotCSAgICAgIHBudDEgPSBTX0dFVF9OQU1FIChzcDEpOwotCSAgICAgICpwbnQxID0gJ0wnOwotCSAgICAgIFNfU0VUX05BTUUgKHNwMSwgcG50MSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLSAgKnBudDEgPSAnOic7CQkJLyogYW5kIHJlc3RvcmUgdGhlIHN0cmluZyAqLwotICByZXR1cm47Ci19Ci0KLQotLyogU2ltcGxlciBpbnRlcmZhY2VzIGludG8gVk1TX3N0YWJfcGFyc2UoKS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfR1NZTV9QYXJzZSAoc3AsIFRleHRfUHNlY3QpCi0gICAgIHN5bWJvbFMgKnNwOwotICAgICBpbnQgVGV4dF9Qc2VjdDsKLXsJCQkJLyogR2xvYmFsIHZhcmlhYmxlcyAqLwotICBWTVNfc3RhYl9wYXJzZSAoc3AsICdHJywgKE5fVU5ERiB8IE5fRVhUKSwgKE5fREFUQSB8IE5fRVhUKSwgVGV4dF9Qc2VjdCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1WTVNfTENTWU1fUGFyc2UgKHNwLCBUZXh0X1BzZWN0KQotICAgICBzeW1ib2xTICpzcDsKLSAgICAgaW50IFRleHRfUHNlY3Q7Ci17CQkJCS8qIFN0YXRpYyBzeW1ib2xzIC0gdW5pbml0aWFsaXplZCAqLwotICBWTVNfc3RhYl9wYXJzZSAoc3AsICdTJywgTl9CU1MsIC0xLCBUZXh0X1BzZWN0KTsKLX0KLQotc3RhdGljIHZvaWQKLVZNU19TVFNZTV9QYXJzZSAoc3AsIFRleHRfUHNlY3QpCi0gICAgIHN5bWJvbFMgKnNwOwotICAgICBpbnQgVGV4dF9Qc2VjdDsKLXsJCQkJLyogU3RhdGljIHN5bWJvbHMgLSBpbml0aWFsaXplZCAqLwotICBWTVNfc3RhYl9wYXJzZSAoc3AsICdTJywgTl9EQVRBLCAtMSwgVGV4dF9Qc2VjdCk7Ci19Ci0KLQotLyogRm9yIHJlZ2lzdGVyIHN5bWJvbHMsIHdlIG11c3QgZmlndXJlIG91dCB3aGF0IHJhbmdlIG9mIGFkZHJlc3NlcwotICAgd2l0aGluIHRoZSBwc2VjdCBhcmUgdmFsaWQuICBXZSB3aWxsIHVzZSB0aGUgYnJhY2tldHMgaW4gdGhlIHN0YWIKLSAgIGRpcmVjdGl2ZXMgdG8gZ2l2ZSB1cyBndWlkYW5jZSBhcyB0byB0aGUgUEMgcmFuZ2UgdGhhdCB0aGlzIHZhcmlhYmxlCi0gICBpcyBpbiBzY29wZS4gIEkgYW0gc3RpbGwgbm90IGNvbXBsZXRlbHkgY29tZm9ydGFibGUgd2l0aCB0aGlzIGJ1dAotICAgYXMgSSBsZWFybiBtb3JlLCBJIHNlZW0gdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiB3aGF0IGlzIGdvaW5nIG9uLgotICAgQ2F2ZWF0IEVtcHRvci4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfUlNZTV9QYXJzZSAoc3AsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCkKLSAgICAgc3ltYm9sUyAqc3AsICpDdXJyZW50X1JvdXRpbmU7Ci0gICAgIGludCBUZXh0X1BzZWN0OwotewotICBzeW1ib2xTICpzeW1ib2xQOwotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gIGNoYXIgKnBudDsKLSAgY2hhciAqcG50MTsKLSAgY2hhciAqc3RyOwotICBpbnQgZGJ4X3R5cGU7Ci0gIGludCBsZW47Ci0gIGludCBpID0gMDsKLSAgaW50IGJjbnQgPSAwOwotICBpbnQgTWluX09mZnNldCA9IC0xOwkJLyogbWluIFBDIG9mIHZhbGlkaXR5ICovCi0gIGludCBNYXhfT2Zmc2V0ID0gMDsJCS8qIG1heCBQQyBvZiB2YWxpZGl0eSAqLwotCi0gIGZvciAoc3ltYm9sUCA9IHNwOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKglEaXNwYXRjaCBvbiBTVEFCIHR5cGUKLSAgICAgICAqLwotICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoc3ltYm9sUCkpCi0JewotCWNhc2UgTl9MQlJBQzoKLQkgIGlmIChiY250KysgPT0gMCkKLQkgICAgTWluX09mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9SQlJBQzoKLQkgIGlmICgtLWJjbnQgPT0gMCkKLQkgICAgTWF4X09mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAtIDE7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoKE1pbl9PZmZzZXQgIT0gLTEpICYmIChiY250ID09IDApKQotCWJyZWFrOwotICAgICAgaWYgKFNfR0VUX1JBV19UWVBFIChzeW1ib2xQKSA9PSBOX0ZVTikKLQl7Ci0JICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKFNfR0VUX05BTUUgKHN5bWJvbFApLCAnOicpICsgMTsKLQkgIGlmICgqcG50ID09ICdGJyB8fCAqcG50ID09ICdmJykgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBDaGVjayB0byBzZWUgdGhhdCB0aGUgYWRkcmVzc2VzIHdlcmUgZGVmaW5lZC4gIElmIG5vdCwgdGhlbiB0aGVyZQotICAgICB3ZXJlIG5vIGJyYWNrZXRzIGluIHRoZSBmdW5jdGlvbiwgYW5kIHdlIG11c3QgdHJ5IHRvIHNlYXJjaCBmb3IKLSAgICAgdGhlIG5leHQgZnVuY3Rpb24uICBTaW5jZSBmdW5jdGlvbnMgY2FuIGJlIGluIGFueSBvcmRlciwgd2Ugc2hvdWxkCi0gICAgIHNlYXJjaCBhbGwgb2YgdGhlIHN5bWJvbCBsaXN0IHRvIGZpbmQgdGhlIGNvcnJlY3QgZW5kaW5nIGFkZHJlc3MuICAqLwotICBpZiAoTWluX09mZnNldCA9PSAtMSkKLSAgICB7Ci0gICAgICBpbnQgTWF4X1NvdXJjZV9PZmZzZXQ7Ci0gICAgICBpbnQgVGhpc19PZmZzZXQ7Ci0KLSAgICAgIE1pbl9PZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ApOwotICAgICAgTWF4X1NvdXJjZV9PZmZzZXQgPSBNaW5fT2Zmc2V0OwkvKiBqdXN0IGluIGNhc2Ugbm8gTl9TTElORXMgZm91bmQgKi8KLSAgICAgIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLQlzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzeW1ib2xQKSkKLQkgIHsKLQkgIGNhc2UgTl9URVhUIHwgTl9FWFQ6Ci0JICAgIFRoaXNfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgICBpZiAoVGhpc19PZmZzZXQgPiBNaW5fT2Zmc2V0ICYmIFRoaXNfT2Zmc2V0IDwgTWF4X09mZnNldCkKLQkgICAgICBNYXhfT2Zmc2V0ID0gVGhpc19PZmZzZXQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NMSU5FOgotCSAgICBUaGlzX09mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgICAgaWYgKFRoaXNfT2Zmc2V0ID4gTWF4X1NvdXJjZV9PZmZzZXQpCi0JICAgICAgTWF4X1NvdXJjZV9PZmZzZXQgPSBUaGlzX09mZnNldDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IHJvdXRpbmUsIHRoZW4gd2UgdXNlIHRoZSBQQyBvZiB0aGUgbGFzdCBzb3VyY2UKLSAgICAgICAgIGxpbmUgYXMgYSBtYXJrZXIgb2YgdGhlIG1heCBQQyBmb3Igd2hpY2ggdGhpcyByZWcgaXMgdmFsaWQuICAqLwotICAgICAgaWYgKE1heF9PZmZzZXQgPT0gMHg3ZmZmZmZmZikKLQlNYXhfT2Zmc2V0ID0gTWF4X1NvdXJjZV9PZmZzZXQ7Ci0gICAgfQotCi0gIGRieF90eXBlID0gMDsKLSAgc3RyID0gU19HRVRfTkFNRSAoc3ApOwotICBpZiAoKHBudCA9IChjaGFyICopIHN0cmNociAoc3RyLCAnOicpKSA9PSAwKQotICAgIHJldHVybjsJCQkvKiBubyBjb2xvbiBwcmVzZW50ICovCi0gIHBudDEgPSBwbnQ7CQkJLyogc2F2ZSB0aGlzIGZvciBsYXRlciovCi0gIHBudCsrOwotICBpZiAoKnBudCAhPSAncicpCi0gICAgcmV0dXJuOwotICBwbnQgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJmRieF90eXBlKTsKLSAgc3BudCA9IGZpbmRfc3ltYm9sIChkYnhfdHlwZSk7Ci0gIGlmICghc3BudCkKLSAgICByZXR1cm47CQkJLypEdW5ubyB3aGF0IHRoaXMgaXMgeWV0Ki8KLSAgKnBudDEgPSAnXDAnOwotICBwbnQgPSBmaXhfbmFtZSAoU19HRVRfTkFNRSAoc3ApKTsJLyogaWYgdGhlcmUgYXJlIGJhZCBjaGFyYWN0ZXJzIGluIG5hbWUsIGNvbnZlcnQgdGhlbSAqLwotICBsZW4gPSBzdHJsZW4gKHBudCk7Ci0gIExvY2FsW2krK10gPSAyNSArIGxlbjsKLSAgTG9jYWxbaSsrXSA9IHNwbnQtPlZNU190eXBlOwotICBMb2NhbFtpKytdID0gRFNUX0tfVkZMQUdTX1RWUzsJLyogdHJhaWxpbmcgdmFsdWUgc3BlY2lmaWVkICovCi0gIENPUFlfTE9ORyAoJkxvY2FsW2ldLCAxICsgbGVuKTsJLyogcmVsYXRpdmUgb2Zmc2V0LCBiZXlvbmQgbmFtZSAqLwotICBpICs9IDQ7Ci0gIExvY2FsW2krK10gPSBsZW47CQkJLyogbmFtZSBsZW5ndGggKGFzY2ljIHByZWZpeCkgKi8KLSAgd2hpbGUgKCpwbnQgIT0gJ1wwJykKLSAgICBMb2NhbFtpKytdID0gKnBudCsrOwotICBMb2NhbFtpKytdID0gRFNUX0tfVlNfRk9MTE9XUzsJLyogdmFsdWUgc3BlY2lmaWNhdGlvbiBmb2xsb3dzICovCi0gIENPUFlfU0hPUlQgKCZMb2NhbFtpXSwgMTUpOwkJLyogbGVuZ3RoIG9mIHJlc3Qgb2YgcmVjb3JkICovCi0gIGkgKz0gMjsKLSAgTG9jYWxbaSsrXSA9IERTVF9LX1ZTX0FMTE9DX1NQTElUOwkvKiBzcGxpdCBsaWZldGltZSAqLwotICBMb2NhbFtpKytdID0gMTsJCQkvKiBvbmUgYmluZGluZyBmb2xsb3dzICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKLSAgaSA9IDA7Ci0gIFZNU19TZXRfRGF0YSAoVGV4dF9Qc2VjdCwgTWluX09mZnNldCwgT0JKX1NfQ19EQkcsIDEpOwotICBWTVNfU2V0X0RhdGEgKFRleHRfUHNlY3QsIE1heF9PZmZzZXQsIE9CSl9TX0NfREJHLCAxKTsKLSAgTG9jYWxbaSsrXSA9IERTVF9LX1ZBTEtJTkRfUkVHOwkJLyogbmVzdGVkIHZhbHVlIHNwZWMgKi8KLSAgQ09QWV9MT05HICgmTG9jYWxbaV0sIFNfR0VUX1ZBTFVFIChzcCkpOwotICBpICs9IDQ7Ci0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKLSAgKnBudDEgPSAnOic7Ci0gIGlmIChzcG50LT5WTVNfdHlwZSA9PSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUpCi0gICAgZ2VuZXJhdGVfc3VmZml4IChzcG50LCAwKTsKLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGV4YW1pbmVzIGEgc3RydWN0dXJlIGRlZmluaXRpb24sIGNoZWNraW5nIGFsbCBvZiB0aGUgZWxlbWVudHMKLSAgIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBvZiB0aGVtIGFyZSBmdWxseSBkZWZpbmVkLiAgVGhlIG9ubHkgdGhpbmcgdGhhdCB3ZQotICAga2ljayBvdXQgYXJlIGFycmF5cyBvZiB1bmRlZmluZWQgc3RydWN0cywgc2luY2Ugd2UgZG8gbm90IGtub3cgaG93IGJpZwotICAgdGhleSBhcmUuICBBbGwgb3RoZXJzIHdlIGNhbiBoYW5kbGUgd2l0aCBhIG5vcm1hbCBmb3J3YXJkIHJlZmVyZW5jZS4gICovCi0KLXN0YXRpYyBpbnQKLWZvcndhcmRfcmVmZXJlbmNlIChwbnQpCi0gICAgIGNoYXIgKnBudDsKLXsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50LCAqc3BudDE7Ci0gIGludCBpOwotCi0gIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmaSk7Ci0gIGlmICgqcG50ID09ICc7JykKLSAgICByZXR1cm4gMDsJCQkvKiBubyBmb3J3YXJkIHJlZmVyZW5jZXMgKi8KLSAgZG8KLSAgICB7Ci0gICAgICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHBudCwgJzonKTsKLSAgICAgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmaSk7Ci0gICAgICBzcG50ID0gZmluZF9zeW1ib2wgKGkpOwotICAgICAgd2hpbGUgKHNwbnQgJiYgKHNwbnQtPmFkdmFuY2VkID09IFBPSU5URVIgfHwgc3BudC0+YWR2YW5jZWQgPT0gQVJSQVkpKQotCXsKLQkgIHNwbnQxID0gZmluZF9zeW1ib2wgKHNwbnQtPnR5cGUyKTsKLQkgIGlmIChzcG50LT5hZHZhbmNlZCA9PSBBUlJBWSAmJiAhc3BudDEpCi0JICAgIHJldHVybiAxOwotCSAgc3BudCA9IHNwbnQxOwotCX0KLSAgICAgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmaSk7Ci0gICAgICBwbnQgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJmkpOwotICAgIH0gd2hpbGUgKCorK3BudCAhPSAnOycpOwotICByZXR1cm4gMDsJCQkvKiBubyBmb3J3YXJkIHJlZmVuY2VzIGZvdW5kICovCi19Ci0KLQotLyogVXNlZCB0byBjaGVjayBhIHNpbmdsZSBlbGVtZW50IG9mIGEgc3RydWN0dXJlIG9uIHRoZSBmaW5hbCBwYXNzLiAgKi8KLQotc3RhdGljIGludAotZmluYWxfZm9yd2FyZF9yZWZlcmVuY2UgKHNwbnQpCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLXsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50MTsKLQotICB3aGlsZSAoc3BudCAmJiAoc3BudC0+YWR2YW5jZWQgPT0gUE9JTlRFUiB8fCBzcG50LT5hZHZhbmNlZCA9PSBBUlJBWSkpCi0gICAgewotICAgICAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudC0+dHlwZTIpOwotICAgICAgaWYgKHNwbnQtPmFkdmFuY2VkID09IEFSUkFZICYmICFzcG50MSkKLQlyZXR1cm4gMTsKLSAgICAgIHNwbnQgPSBzcG50MTsKLSAgICB9Ci0gIHJldHVybiAwOwkvKiBubyBmb3J3YXJkIHJlZmVuY2VzIGZvdW5kICovCi19Ci0KLQotLyogVGhpcyByb3V0aW5lIHBhcnNlcyB0aGUgc3RhYnMgZGlyZWN0aXZlcyB0byBmaW5kIGFueSBkZWZpbml0aW9ucyBvZiBkYngKLSAgIHR5cGUgbnVtYmVycy4gIEl0IG1ha2VzIGEgbm90ZSBvZiBhbGwgb2YgdGhlbSwgY3JlYXRpbmcgYSBzdHJ1Y3R1cmUKLSAgIGVsZW1lbnQgb2YgVk1TX0RCR19TeW1ib2wgdGhhdCBkZXNjcmliZXMgaXQuICBUaGlzIGFsc28gZ2VuZXJhdGVzIHRoZQotICAgaW5mbyBmb3IgdGhlIGRlYnVnZ2VyIHRoYXQgZGVzY3JpYmVzIHRoZSBzdHJ1Y3QvdW5pb24vZW51bSwgc28gdGhhdAotICAgZnVydGhlciByZWZlcmVuY2VzIHRvIHRoZXNlIGRhdGEgdHlwZXMgd2lsbCBiZSBieSBudW1iZXIKLQotICAgV2UgaGF2ZSB0byBwcm9jZXNzIHBvaW50ZXJzIHJpZ2h0IGF3YXksIHNpbmNlIHRoZXJlIGNhbiBiZSByZWZlcmVuY2VzCi0gICB0byB0aGVtIGxhdGVyIGluIHRoZSBzYW1lIHN0YWJzIGRpcmVjdGl2ZS4gIFdlIGNhbm5vdCBoYXZlIGZvcndhcmQKLSAgIHJlZmVyZW5jZXMgdG8gcG9pbnRlcnMsIChidXQgd2UgY2FuIGhhdmUgYSBmb3J3YXJkIHJlZmVyZW5jZSB0byBhCi0gICBwb2ludGVyIHRvIGEgc3RydWN0dXJlL2VudW0vdW5pb24pIGFuZCB0aGlzIGlzIHdoeSB3ZSBwcm9jZXNzIHRoZW0KLSAgIGltbWVkaWF0ZWx5LiAgQWZ0ZXIgd2UgcHJvY2VzcyB0aGUgcG9pbnRlciwgdGhlbiB3ZSBzZWFyY2ggZm9yIGRlZnMKLSAgIHRoYXQgYXJlIG5lc3RlZCBldmVuIGRlZXBlci4KLQotICAgOC8xNS85MjogV2UgaGF2ZSB0byBwcm9jZXNzIGFycmF5cyByaWdodCBhd2F5IHRvbywgYmVjYXVzZSB0aGVyZSBjYW4KLSAgIGJlIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gaWRlbnRpY2FsIGFycmF5IHR5cGVzIGluIG9uZSBzdHJ1Y3R1cmUKLSAgIGRlZmluaXRpb24sIGFuZCBvbmx5IHRoZSBmaXJzdCBvbmUgaGFzIHRoZSBkZWZpbml0aW9uLiAgKi8KLQotc3RhdGljIGludAotVk1TX3R5cGVkZWZfcGFyc2UgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpwbnQ7Ci0gIGNoYXIgKnBudDE7Ci0gIGNvbnN0IGNoYXIgKnBudDI7Ci0gIGludCBpOwotICBpbnQgZHR5cGU7Ci0gIHN0cnVjdCBmb3J3YXJkX3JlZiAqZnBudDsKLSAgaW50IGkxLCBpMiwgaTMsIGxlbjsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQxOwotCi0gIC8qIGNoZWNrIGZvciBhbnkgbmVzdGVkIGRlZidzICovCi0gIHBudCA9IChjaGFyICopIHN0cmNociAoc3RyICsgMSwgJz0nKTsKLSAgaWYgKHBudCAmJiBzdHJbMV0gIT0gJyonICYmIChzdHJbMV0gIT0gJ2EnIHx8IHN0clsyXSAhPSAncicpCi0gICAgICAmJiBWTVNfdHlwZWRlZl9wYXJzZSAocG50KSA9PSAxKQotICAgIHJldHVybiAxOwotICAvKiBub3cgZmluZCBkYnhfdHlwZSBvZiBlbnRyeSAqLwotICBwbnQgPSBzdHIgLSAxOwotICBpZiAoKnBudCA9PSAnYycpCi0gICAgewkJCQkvKiBjaGVjayBmb3Igc3RhdGljIGNvbnN0YW50cyAqLwotICAgICAgKnN0ciA9ICdcMCc7CQkvKiBmb3Igbm93IHdlIGlnbm9yZSB0aGVtICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHdoaWxlICgoKnBudCA8PSAnOScpICYmICgqcG50ID49ICcwJykpCi0gICAgcG50LS07Ci0gIHBudCsrOwkJCS8qIGFuZCBnZXQgYmFjayB0byB0aGUgbnVtYmVyICovCi0gIGN2dF9pbnRlZ2VyIChwbnQsICZpMSk7Ci0gIHNwbnQgPSBmaW5kX3N5bWJvbCAoaTEpOwotICAvKiBmaXJzdCBzZWUgaWYgdGhpcyBoYXMgYmVlbiBkZWZpbmVkIGFscmVhZHksIGR1ZSB0byBmb3J3YXJkIHJlZmVyZW5jZSAqLwotICBpZiAoIXNwbnQpCi0gICAgewotICAgICAgaTIgPSBTWU1UWVBfSEFTSCAoaTEpOwotICAgICAgc3BudCA9IChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wpKTsKLSAgICAgIHNwbnQtPm5leHQgPSBWTVNfU3ltYm9sX3R5cGVfbGlzdFtpMl07Ci0gICAgICBWTVNfU3ltYm9sX3R5cGVfbGlzdFtpMl0gPSBzcG50OwotICAgICAgc3BudC0+ZGJ4X3R5cGUgPSBpMTsJLyogYW5kIHNhdmUgdGhlIHR5cGUgKi8KLSAgICAgIHNwbnQtPnR5cGUyID0gc3BudC0+Vk1TX3R5cGUgPSBzcG50LT5kYXRhX3NpemUgPSAwOwotICAgICAgc3BudC0+aW5kZXhfbWluID0gc3BudC0+aW5kZXhfbWF4ID0gc3BudC0+c3RydWNfbnVtYiA9IDA7Ci0gICAgfQotICAvKgotICAgKiBGb3Igc3RydWN0cyBhbmQgdW5pb25zLCBkbyBhIHBhcnRpYWwgcGFyc2UsIG90aGVyd2lzZSB3ZSBzb21ldGltZXMgZ2V0Ci0gICAqIGNpcmN1bGFyIGRlZmluaXRpb25zIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVzb2x2ZS4gIFdlIHJlYWQgZW5vdWdoCi0gICAqIGluZm8gc28gdGhhdCBhbnkgcmVmZXJlbmNlIHRvIHRoaXMgdHlwZSBoYXMgZW5vdWdoIGluZm8gdG8gYmUgcmVzb2x2ZWQuCi0gICAqLwotICBwbnQgPSBzdHIgKyAxOwkJLyogcG9pbnQgdG8gY2hhcmFjdGVyIHBhc3QgZXF1YWwgc2lnbiAqLwotICBpZiAoKnBudCA+PSAnMCcgJiYgKnBudCA8PSAnOScpCi0gICAgewotICAgICAgaWYgKHR5cGVfY2hlY2sgKCJ2b2lkIikpCi0JewkJCS8qIHRoaXMgaXMgdGhlIHZvaWQgc3ltYm9sICovCi0JICAqc3RyID0gJ1wwJzsKLQkgIHNwbnQtPmFkdmFuY2VkID0gVk9JRDsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGlmICh0eXBlX2NoZWNrICgidW5rbm93biB0eXBlIikpCi0JewotCSAgKnN0ciA9ICdcMCc7Ci0JICBzcG50LT5hZHZhbmNlZCA9IFVOS05PV047Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudCwgJmkxKTsKLSAgICAgIGlmIChpMSAhPSBzcG50LT5kYnhfdHlwZSkKLQl7Ci0JICBzcG50LT5hZHZhbmNlZCA9IEFMSUFTOwotCSAgc3BudC0+dHlwZTIgPSBpMTsKLQkgIHN0cmNweSAoc3RyLCBwbnQxKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnaW5lciBvdXRwdXQ6ICVkIGlzIGFuIHVua25vd24gdW50eXBlZCB2YXJpYWJsZS4iKSwKLQkJIHNwbnQtPmRieF90eXBlKTsKLSAgICAgIHJldHVybiAxOwkJCS8qIGRvIG5vdCBrbm93IHdoYXQgdGhpcyBpcyAqLwotICAgIH0KLQotICBwbnQgPSBzdHIgKyAxOwkJLyogcG9pbnQgdG8gY2hhcmFjdGVyIHBhc3QgZXF1YWwgc2lnbiAqLwotICBzd2l0Y2ggKCpwbnQpCi0gICAgewotICAgIGNhc2UgJ3InOgotICAgICAgc3BudC0+YWR2YW5jZWQgPSBCQVNJQzsKLSAgICAgIGlmICh0eXBlX2NoZWNrICgiaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1NMSU5UOwotCSAgc3BudC0+ZGF0YV9zaXplID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgibG9uZyBpbnQiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfU0xJTlQ7Ci0JICBzcG50LT5kYXRhX3NpemUgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJ1bnNpZ25lZCBpbnQiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfVUxJTlQ7Ci0JICBzcG50LT5kYXRhX3NpemUgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIHVuc2lnbmVkIGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19VTElOVDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInNob3J0IGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TU0lOVDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInNob3J0IHVuc2lnbmVkIGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19VU0lOVDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImNoYXIiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfU0NIQVI7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJzaWduZWQgY2hhciIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TQ0hBUjsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInVuc2lnbmVkIGNoYXIiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfVUNIQVI7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJmbG9hdCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19SRUFMNDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImRvdWJsZSIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gdmF4X2dfZG91YmxlcyA/IERCR19TX0NfUkVBTDhfRyA6IERCR19TX0NfUkVBTDg7Ci0JICBzcG50LT5kYXRhX3NpemUgPSA4OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIGRvdWJsZSIpKQotCXsKLQkgIC8qIHNhbWUgYXMgZG91YmxlLCBhdCBsZWFzdCBmb3Igbm93ICovCi0JICBzcG50LT5WTVNfdHlwZSA9IHZheF9nX2RvdWJsZXMgPyBEQkdfU19DX1JFQUw4X0cgOiBEQkdfU19DX1JFQUw4OwotCSAgc3BudC0+ZGF0YV9zaXplID0gODsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgibG9uZyBsb25nIGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TUVVBRDsJLyogc2lnbmVkIHF1YWR3b3JkICovCi0JICBzcG50LT5kYXRhX3NpemUgPSA4OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIGxvbmcgdW5zaWduZWQgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1VRVUFEOwkvKiB1bnNpZ25lZCBxdWFkd29yZCAqLwotCSAgc3BudC0+ZGF0YV9zaXplID0gODsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiY29tcGxleCBmbG9hdCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19DT01QTFg0OwotCSAgc3BudC0+ZGF0YV9zaXplID0gMiAqIDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImNvbXBsZXggZG91YmxlIikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSB2YXhfZ19kb3VibGVzID8gREJHX1NfQ19DT01QTFg4X0cgOiBEQkdfU19DX0NPTVBMWDg7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAyICogODsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiY29tcGxleCBsb25nIGRvdWJsZSIpKQotCXsKLQkgIC8qIHNhbWUgYXMgY29tcGxleCBkb3VibGUsIGF0IGxlYXN0IGZvciBub3cgKi8KLQkgIHNwbnQtPlZNU190eXBlID0gdmF4X2dfZG91YmxlcyA/IERCR19TX0NfQ09NUExYOF9HIDogREJHX1NfQ19DT01QTFg4OwotCSAgc3BudC0+ZGF0YV9zaXplID0gMiAqIDg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qCVtwcl0KLQkgICAqIFNob3VsZG4ndCBnZXQgaGVyZSwgYnV0IGlmIHdlIGRvLCBzb21ldGhpbmcKLQkgICAqIG1vcmUgc3Vic3RhbnRpYWwgb3VnaHQgdG8gYmUgZG9uZS4uLgotCSAgICovCi0JICBzcG50LT5WTVNfdHlwZSA9IDA7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAwOwotCX0KLSAgICAgIGlmIChzcG50LT5WTVNfdHlwZSAhPSAwKQotCXNldHVwX2Jhc2ljX3R5cGUgKHNwbnQpOwotICAgICAgcG50MSA9IChjaGFyICopIHN0cmNociAoc3RyLCAnOycpICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ3UnOgotICAgICAgc3BudC0+YWR2YW5jZWQgPSAoKnBudCA9PSAncycpID8gU1RSVUNUIDogVU5JT047Ci0gICAgICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfQURWQU5DRURfVFlQRTsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJnNwbnQtPmRhdGFfc2l6ZSk7Ci0gICAgICBpZiAoIWZpbmFsX3Bhc3MgJiYgZm9yd2FyZF9yZWZlcmVuY2UgKHBudCkpCi0JewotCSAgc3BudC0+c3RydWNfbnVtYiA9IC0xOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgc3BudC0+c3RydWNfbnVtYiA9ICsrc3RydWN0dXJlX2NvdW50OwotICAgICAgcG50MS0tOwotICAgICAgcG50ID0gZ2V0X3N0cnVjdF9uYW1lIChzdHIpOwotICAgICAgVk1TX0RlZl9TdHJ1Y3QgKHNwbnQtPnN0cnVjX251bWIpOwotICAgICAgaSA9IDA7Ci0gICAgICBmb3IgKGZwbnQgPSBmX3JlZl9yb290OyBmcG50OyBmcG50ID0gZnBudC0+bmV4dCkKLQlpZiAoZnBudC0+ZGJ4X3R5cGUgPT0gc3BudC0+ZGJ4X3R5cGUpCi0JICB7Ci0JICAgIGZwbnQtPnJlc29sdmVkID0gJ1knOwotCSAgICBWTVNfU2V0X1N0cnVjdCAoZnBudC0+c3RydWNfbnVtYik7Ci0JICAgIFZNU19TdG9yZV9TdHJ1Y3QgKHNwbnQtPnN0cnVjX251bWIpOwotCSAgICBpKys7Ci0JICB9Ci0gICAgICBpZiAoaSA+IDApCi0JVk1TX1NldF9TdHJ1Y3QgKHNwbnQtPnN0cnVjX251bWIpOwotICAgICAgaSA9IDA7Ci0gICAgICBMb2NhbFtpKytdID0gMTEgKyBzdHJsZW4gKHBudCk7Ci0gICAgICBMb2NhbFtpKytdID0gREJHX1NfQ19TVFJVQ1RfU1RBUlQ7Ci0gICAgICBMb2NhbFtpKytdID0gRFNUX0tfVkZMQUdTX05PVkFMOwkvKiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvbmx5ICovCi0gICAgICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgMEwpOwkvKiBoZW5jZSB2YWx1ZSBpcyB1bnVzZWQgKi8KLSAgICAgIGkgKz0gNDsKLSAgICAgIExvY2FsW2krK10gPSBzdHJsZW4gKHBudCk7Ci0gICAgICBwbnQyID0gcG50OwotICAgICAgd2hpbGUgKCpwbnQyICE9ICdcMCcpCi0JTG9jYWxbaSsrXSA9ICpwbnQyKys7Ci0gICAgICBpMiA9IHNwbnQtPmRhdGFfc2l6ZSAqIDg7CS8qIG51bWJlciBvZiBiaXRzICovCi0gICAgICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgaTIpOwotICAgICAgaSArPSA0OwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAgICAgaSA9IDA7Ci0gICAgICBpZiAocG50ICE9IHN5bWJvbF9uYW1lKQotCXsKLQkgIHBudCArPSBzdHJsZW4gKHBudCk7Ci0JICAqcG50ID0gJzonOwotCX0JCQkvKiByZXBsYWNlIGNvbG9uIGZvciBsYXRlciAqLwotICAgICAgd2hpbGUgKCorK3BudDEgIT0gJzsnKQotCXsKLQkgIHBudCA9IChjaGFyICopIHN0cmNociAocG50MSwgJzonKTsKLQkgICpwbnQgPSAnXDAnOwotCSAgcG50MiA9IHBudDE7Ci0JICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZkdHlwZSk7Ci0JICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudDEgKyAxLCAmaTIpOwotCSAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQxICsgMSwgJmkzKTsKLQkgIHNwbnQxID0gZmluZF9zeW1ib2wgKGR0eXBlKTsKLQkgIGxlbiA9IHN0cmxlbiAocG50Mik7Ci0JICBpZiAoc3BudDEgJiYgKHNwbnQxLT5hZHZhbmNlZCA9PSBCQVNJQyB8fCBzcG50MS0+YWR2YW5jZWQgPT0gRU5VTSkKLQkgICAgICAmJiAoKGkzICE9IHNwbnQxLT5kYXRhX3NpemUgKiA4KSB8fCAoaTIgJSA4ICE9IDApKSkKLQkgICAgewkJCS8qIGJpdGZpZWxkICovCi0JICAgICAgaWYgKFVTRV9CSVRTVFJJTkdfREVTQ1JJUFRPUiAoc3BudDEpKQotCQl7Ci0JCSAgLyogVGhpcyB1c2VzIGEgdHlwZSBkZXNjcmlwdG9yLCB3aGljaCBkb2Vzbid0IHdvcmsgaWYKLQkJICAgICB0aGUgZW5jbG9zaW5nIHN0cnVjdHVyZSBoYXMgYmVlbiBwbGFjZWQgaW4gYSByZWdpc3Rlci4KLQkJICAgICBBbHNvLCBlbnVtIGJpdGZpZWxkcyBkZWdlbmVyYXRlIHRvIHNpbXBsZSBpbnRlZ2Vycy4gICovCi0JCSAgaW50IHVuc2lnbmVkX3R5cGUgPSAoc3BudDEtPlZNU190eXBlID09IERCR19TX0NfVUxJTlQKLQkJCQkgICAgfHwgc3BudDEtPlZNU190eXBlID09IERCR19TX0NfVVNJTlQKLQkJCQkgICAgfHwgc3BudDEtPlZNU190eXBlID09IERCR19TX0NfVUNIQVIKLQkJCQkgICAgfHwgc3BudDEtPlZNU190eXBlID09IERCR19TX0NfVVFVQUQKLQkJCQkgICAgfHwgc3BudDEtPmFkdmFuY2VkID09IEVOVU0pOyAvKiAoYXBwcm94aW1hdGUpICovCi0JCSAgQXBvaW50ID0gMDsKLQkJICBmcHVzaCAoMTkgKyBsZW4sIDEpOwotCQkgIGZwdXNoICh1bnNpZ25lZF90eXBlID8gREJHX1NfQ19VQklUVSA6IERCR19TX0NfU0JJVFUsIDEpOwotCQkgIGZwdXNoIChEU1RfS19WRkxBR1NfRFNDLCAxKTsJLyogc3BlY2lmaWVkIGJ5IGRlc2NyaXB0b3IgKi8KLQkJICBmcHVzaCAoMSArIGxlbiwgNCk7CS8qIHJlbGF0aXZlIG9mZnNldCB0byBkZXNjcmlwdG9yICovCi0JCSAgZnB1c2ggKGxlbiwgMSk7CQkvKiBsZW5ndGggYnl0ZSAoYXNjaWMgcHJlZml4KSAqLwotCQkgIHdoaWxlICgqcG50MiAhPSAnXDAnKQkvKiBuYW1lIGJ5dGVzICovCi0JCSAgICBmcHVzaCAoKnBudDIrKywgMSk7Ci0JCSAgZnB1c2ggKGkzLCAyKTsJLyogZHNjIGxlbmd0aCA9PSBzaXplIG9mIGJpdGZpZWxkICovCi0JCQkJCS8qIGRzYyB0eXBlID09IHVuP3NpZ25lZCBiaXRmaWVsZCAqLwotCQkgIGZwdXNoICh1bnNpZ25lZF90eXBlID8gREJHX1NfQ19VQklUVSA6IERCR19TX0NfU0JJVFUsIDEpOwotCQkgIGZwdXNoIChEU0NfS19DTEFTU19VQlMsIDEpOwkvKiBkc2MgY2xhc3MgPT0gdW5hbGlnbmVkIGJpdHN0cmluZyAqLwotCQkgIGZwdXNoICgweDAwLCA0KTsJCS8qIGRzYyBwb2ludGVyID09IHplcm9lcyAqLwotCQkgIGZwdXNoIChpMiwgNCk7CS8qIHN0YXJ0IHBvc2l0aW9uICovCi0JCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChBc3VmZml4LCBBcG9pbnQsIE9CSl9TX0NfREJHKTsKLQkJICBBcG9pbnQgPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogVXNlIGEgIm5vdmVsIGxlbmd0aCIgdHlwZSBzcGVjaWZpY2F0aW9uLCB3aGljaCB3b3JrcwotCQkgICAgIHJpZ2h0IGZvciByZWdpc3RlciBzdHJ1Y3R1cmVzIGFuZCBmb3IgZW51bSBiaXRmaWVsZHMKLQkJICAgICBidXQgcmVzdWx0cyBpbiBsYXJnZXIgb2JqZWN0IG1vZHVsZXMuICAqLwotCQkgIExvY2FsW2krK10gPSA3ICsgbGVuOwotCQkgIExvY2FsW2krK10gPSBEQkdfU19DX0FEVkFOQ0VEX1RZUEU7CS8qIHR5cGUgc3BlYyBmb2xsb3dzICovCi0JCSAgTG9jYWxbaSsrXSA9IERCR19TX0NfU1RSVUNUX0lURU07CS8qIHZhbHVlIGlzIGEgYml0IG9mZnNldCAqLwotCQkgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCBpMik7CQkvKiBiaXQgb2Zmc2V0ICovCi0JCSAgaSArPSA0OwotCQkgIExvY2FsW2krK10gPSBzdHJsZW4gKHBudDIpOwotCQkgIHdoaWxlICgqcG50MiAhPSAnXDAnKQotCQkgICAgTG9jYWxbaSsrXSA9ICpwbnQyKys7Ci0JCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotCQkgIGkgPSAwOwotCQkgIGJpdGZpZWxkX3N1ZmZpeCAoc3BudDEsIGkzKTsKLQkgICAgIH0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7CQkJLyogbm90IGEgYml0ZmllbGQgKi8KLQkgICAgICAvKiBjaGVjayBpZiB0aGlzIGlzIGEgZm9yd2FyZCByZWZlcmVuY2UgKi8KLQkgICAgICBpZiAoZmluYWxfcGFzcyAmJiBmaW5hbF9mb3J3YXJkX3JlZmVyZW5jZSAoc3BudDEpKQotCQl7Ci0JCSAgYXNfdHNrdHNrIChfKCJkZWJ1Z2dlciBvdXRwdXQ6IHN0cnVjdHVyZSBlbGVtZW50IGAlcycgaGFzIHVuZGVmaW5lZCB0eXBlIiksCi0JCQkgICBwbnQyKTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIExvY2FsW2krK10gPSA3ICsgbGVuOwotCSAgICAgIExvY2FsW2krK10gPSBzcG50MSA/IHNwbnQxLT5WTVNfdHlwZSA6IERCR19TX0NfQURWQU5DRURfVFlQRTsKLQkgICAgICBMb2NhbFtpKytdID0gREJHX1NfQ19TVFJVQ1RfSVRFTTsKLQkgICAgICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgaTIpOwkJLyogYml0IG9mZnNldCAqLwotCSAgICAgIGkgKz0gNDsKLQkgICAgICBMb2NhbFtpKytdID0gc3RybGVuIChwbnQyKTsKLQkgICAgICB3aGlsZSAoKnBudDIgIT0gJ1wwJykKLQkJTG9jYWxbaSsrXSA9ICpwbnQyKys7Ci0JICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotCSAgICAgIGkgPSAwOwotCSAgICAgIGlmICghc3BudDEpCi0JCWdlbmVyYXRlX3N1ZmZpeCAoc3BudDEsIGR0eXBlKTsKLQkgICAgICBlbHNlIGlmIChzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19BRFZBTkNFRF9UWVBFKQotCQlnZW5lcmF0ZV9zdWZmaXggKHNwbnQxLCAwKTsKLQkgICAgfQotCX0KLSAgICAgIHBudDErKzsKLSAgICAgIExvY2FsW2krK10gPSAweDAxOwkvKiBsZW5ndGggYnl0ZSAqLwotICAgICAgTG9jYWxbaSsrXSA9IERCR19TX0NfU1RSVUNUX0VORDsKLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKLSAgICAgIGkgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZSc6Ci0gICAgICBzcG50LT5hZHZhbmNlZCA9IEVOVU07Ci0gICAgICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfQURWQU5DRURfVFlQRTsKLSAgICAgIHNwbnQtPnN0cnVjX251bWIgPSArK3N0cnVjdHVyZV9jb3VudDsKLSAgICAgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0gICAgICBWTVNfRGVmX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0gICAgICBpID0gMDsKLSAgICAgIGZvciAoZnBudCA9IGZfcmVmX3Jvb3Q7IGZwbnQ7IGZwbnQgPSBmcG50LT5uZXh0KQotCWlmIChmcG50LT5kYnhfdHlwZSA9PSBzcG50LT5kYnhfdHlwZSkKLQkgIHsKLQkgICAgZnBudC0+cmVzb2x2ZWQgPSAnWSc7Ci0JICAgIFZNU19TZXRfU3RydWN0IChmcG50LT5zdHJ1Y19udW1iKTsKLQkgICAgVk1TX1N0b3JlX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0JICAgIGkrKzsKLQkgIH0KLSAgICAgIGlmIChpID4gMCkKLQlWTVNfU2V0X1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0gICAgICBpID0gMDsKLSAgICAgIGxlbiA9IHN0cmxlbiAoc3ltYm9sX25hbWUpOwotICAgICAgTG9jYWxbaSsrXSA9IDMgKyBsZW47Ci0gICAgICBMb2NhbFtpKytdID0gREJHX1NfQ19FTlVNX1NUQVJUOwotICAgICAgTG9jYWxbaSsrXSA9IDQgKiA4OwkJLyogZW51bSB2YWx1ZXMgYXJlIDMyIGJpdHMgKi8KLSAgICAgIExvY2FsW2krK10gPSBsZW47Ci0gICAgICBwbnQyID0gc3ltYm9sX25hbWU7Ci0gICAgICB3aGlsZSAoKnBudDIgIT0gJ1wwJykKLQlMb2NhbFtpKytdID0gKnBudDIrKzsKLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKLSAgICAgIGkgPSAwOwotICAgICAgd2hpbGUgKCorK3BudCAhPSAnOycpCi0JewotCSAgcG50MSA9IChjaGFyICopIHN0cmNociAocG50LCAnOicpOwotCSAgKnBudDErKyA9ICdcMCc7Ci0JICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudDEsICZpMSk7Ci0JICBsZW4gPSBzdHJsZW4gKHBudCk7Ci0JICBMb2NhbFtpKytdID0gNyArIGxlbjsKLQkgIExvY2FsW2krK10gPSBEQkdfU19DX0VOVU1fSVRFTTsKLQkgIExvY2FsW2krK10gPSBEU1RfS19WQUxLSU5EX0xJVEVSQUw7Ci0JICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgaTEpOwotCSAgaSArPSA0OwotCSAgTG9jYWxbaSsrXSA9IGxlbjsKLQkgIHBudDIgPSBwbnQ7Ci0JICB3aGlsZSAoKnBudCAhPSAnXDAnKQotCSAgICBMb2NhbFtpKytdID0gKnBudCsrOwotCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotCSAgaSA9IDA7Ci0JICBwbnQgPSBwbnQxOwkJLyogU2tpcCBmaW5hbCBzZW1pY29sb24gKi8KLQl9Ci0gICAgICBMb2NhbFtpKytdID0gMHgwMTsJLyogbGVuIGJ5dGUgKi8KLSAgICAgIExvY2FsW2krK10gPSBEQkdfU19DX0VOVU1fRU5EOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAgICAgaSA9IDA7Ci0gICAgICBwbnQxID0gcG50ICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2EnOgotICAgICAgc3BudC0+YWR2YW5jZWQgPSBBUlJBWTsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19BRFZBTkNFRF9UWVBFOwotICAgICAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChwbnQsICc7Jyk7Ci0gICAgICBpZiAoIXBudCkKLQlyZXR1cm4gMTsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJnNwbnQtPmluZGV4X21pbik7Ci0gICAgICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudDEgKyAxLCAmc3BudC0+aW5kZXhfbWF4KTsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50MSArIDEsICZzcG50LT50eXBlMik7Ci0gICAgICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHN0ciArIDEsICc9Jyk7Ci0gICAgICBpZiAocG50ICYmIFZNU190eXBlZGVmX3BhcnNlIChwbnQpID09IDEpCi0JcmV0dXJuIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdmJzoKLSAgICAgIHNwbnQtPmFkdmFuY2VkID0gRlVOQ1RJT047Ci0gICAgICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfRlVOQ1RJT05fQUREUjsKLSAgICAgIC8qIHRoaXMgbWFzcXVlcmFkZXMgYXMgYSBiYXNpYyB0eXBlKi8KLSAgICAgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0gICAgICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZzcG50LT50eXBlMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICcqJzoKLSAgICAgIHNwbnQtPmFkdmFuY2VkID0gUE9JTlRFUjsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19BRFZBTkNFRF9UWVBFOwotICAgICAgc3BudC0+ZGF0YV9zaXplID0gNDsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJnNwbnQtPnR5cGUyKTsKLSAgICAgIHBudCA9IChjaGFyICopIHN0cmNociAoc3RyICsgMSwgJz0nKTsKLSAgICAgIGlmIChwbnQgJiYgVk1TX3R5cGVkZWZfcGFyc2UgKHBudCkgPT0gMSkKLQlyZXR1cm4gMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzcG50LT5hZHZhbmNlZCA9IFVOS05PV047Ci0gICAgICBzcG50LT5WTVNfdHlwZSA9IDA7Ci0gICAgICBhc190c2t0c2sgKF8oImRlYnVnZ2VyIG91dHB1dDogJWQgaXMgYW4gdW5rbm93biB0eXBlIG9mIHZhcmlhYmxlLiIpLAotCQkgc3BudC0+ZGJ4X3R5cGUpOwotICAgICAgcmV0dXJuIDE7CQkJLyogdW5hYmxlIHRvIGRlY2lwaGVyICovCi0gICAgfQotICAvKiBUaGlzIHJlbW92ZXMgdGhlIGV2aWRlbmNlIG9mIHRoZSBkZWZpbml0aW9uIHNvIHRoYXQgdGhlIG91dGVyIGxldmVscwotICAgICBvZiBwYXJzaW5nIGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IGl0LiAgKi8KLSAgcG50ID0gc3RyOwotICB3aGlsZSAoKnBudDEgIT0gJ1wwJykKLSAgICAqcG50KysgPSAqcG50MSsrOwotICAqcG50ID0gJ1wwJzsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogVGhpcyBpcyB0aGUgcm9vdCByb3V0aW5lIHRoYXQgcGFyc2VzIHRoZSBzdGFicyBlbnRyaWVzIGZvciBkZWZpbml0aW9ucy4KLSAgIGl0IGNhbGxzIFZNU190eXBlZGVmX3BhcnNlLCB3aGljaCBjYW4gaW4gdHVybiBjYWxsIGl0c2VsZi4gIFdlIG5lZWQgdG8KLSAgIGJlIGNhcmVmdWwsIHNpbmNlIHNvbWV0aW1lcyB0aGVyZSBhcmUgZm9yd2FyZCByZWZlcmVuY2VzIHRvIG90aGVyIHN5bWJvbAotICAgdHlwZXMsIGFuZCB0aGVzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgdW50aWwgd2UgaGF2ZSBjb21wbGV0ZWQgdGhlIHBhcnNlLgotCi0gICBBbHNvIGNoZWNrIGFuZCBzZWUgaWYgd2UgYXJlIHVzaW5nIGNvbnRpbnVhdGlvbiBzdGFicywgaWYgd2UgYXJlLCB0aGVuCi0gICBwYXN0ZSB0b2dldGhlciB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBzdGFiIGJlZm9yZSB3ZSBwYXNzIGl0IHRvCi0gICBWTVNfdHlwZWRlZl9wYXJzZS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfTFNZTV9QYXJzZSAoKQotewotICBjaGFyICpwbnQ7Ci0gIGNoYXIgKnBudDE7Ci0gIGNoYXIgKnBudDI7Ci0gIGNoYXIgKnN0cjsKLSAgY2hhciAqcGFyc2VfYnVmZmVyID0gMDsKLSAgY2hhciBmaXhpdFsxMF07Ci0gIGludCBpbmNvbXBsZXRlLCBwYXNzLCBpbmNvbTE7Ci0gIHN0cnVjdCBmb3J3YXJkX3JlZiAqZnBudDsKLSAgc3ltYm9sUyAqc3A7Ci0KLSAgcGFzcyA9IDA7Ci0gIGZpbmFsX3Bhc3MgPSAwOwotICBpbmNvbXBsZXRlID0gMDsKLSAgZG8KLSAgICB7Ci0gICAgICBpbmNvbTEgPSBpbmNvbXBsZXRlOwotICAgICAgaW5jb21wbGV0ZSA9IDA7Ci0gICAgICBmb3IgKHNwID0gc3ltYm9sX3Jvb3RQOyBzcDsgc3AgPSBzeW1ib2xfbmV4dCAoc3ApKQotCXsKLQkgIC8qCi0JICAgKglEZWFsIHdpdGggU1RBQiBzeW1ib2xzCi0JICAgKi8KLQkgIGlmIChTX0lTX0RFQlVHIChzcCkpCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqCURpc3BhdGNoIG9uIFNUQUIgdHlwZQotCSAgICAgICAqLwotCSAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHNwKSkKLQkJewotCQljYXNlIE5fR1NZTToKLQkJY2FzZSBOX0xDU1lNOgotCQljYXNlIE5fU1RTWU06Ci0JCWNhc2UgTl9QU1lNOgotCQljYXNlIE5fUlNZTToKLQkJY2FzZSBOX0xTWU06Ci0JCWNhc2UgTl9GVU46CS8qc29tZXRpbWVzIHRoZXNlIGNvbnRhaW4gdHlwZWRlZnMqLwotCQkgIHN0ciA9IFNfR0VUX05BTUUgKHNwKTsKLQkJICBzeW1ib2xfbmFtZSA9IHN0cjsKLQkJICBwbnQgPSBzdHIgKyBzdHJsZW4gKHN0cikgLSAxOwotCQkgIGlmICgqcG50ID09ICc/JykgIC8qIENvbnRpbnVhdGlvbiBzdGFiLiAgKi8KLQkJICAgIHsKLQkJICAgICAgc3ltYm9sUyAqc3BuZXh0OwotCQkgICAgICBpbnQgdGxlbiA9IDA7Ci0KLQkJICAgICAgc3BuZXh0ID0gc3A7Ci0JCSAgICAgIGRvIHsKLQkJCXRsZW4gKz0gc3RybGVuIChzdHIpIC0gMTsKLQkJCXNwbmV4dCA9IHN5bWJvbF9uZXh0IChzcG5leHQpOwotCQkJc3RyID0gU19HRVRfTkFNRSAoc3BuZXh0KTsKLQkJCXBudCA9IHN0ciArIHN0cmxlbiAoc3RyKSAtIDE7Ci0JCSAgICAgIH0gd2hpbGUgKCpwbnQgPT0gJz8nKTsKLQkJICAgICAgdGxlbiArPSBzdHJsZW4gKHN0cik7Ci0JCSAgICAgIHBhcnNlX2J1ZmZlciA9IChjaGFyICopIHhtYWxsb2MgKHRsZW4gKyAxKTsKLQkJICAgICAgc3RyY3B5IChwYXJzZV9idWZmZXIsIFNfR0VUX05BTUUgKHNwKSk7Ci0JCSAgICAgIHBudDIgPSBwYXJzZV9idWZmZXIgKyBzdHJsZW4gKHBhcnNlX2J1ZmZlcikgLSAxOwotCQkgICAgICAqcG50MiA9ICdcMCc7Ci0JCSAgICAgIHNwbmV4dCA9IHNwOwotCQkgICAgICBkbyB7Ci0JCQlzcG5leHQgPSBzeW1ib2xfbmV4dCAoc3BuZXh0KTsKLQkJCXN0ciA9IFNfR0VUX05BTUUgKHNwbmV4dCk7Ci0JCQlzdHJjYXQgKHBudDIsIHN0cik7Ci0JCQlwbnQyICs9ICBzdHJsZW4gKHN0cikgLSAxOwotCQkJKnN0ciA9ICdcMCc7ICAvKiBFcmFzZSB0aGlzIHN0cmluZyAgKi8KLQkJICAgICAvKiBTX1NFVF9OQU1FIChzcG5leHQsIHN0cik7ICovCi0JCQlpZiAoKnBudDIgIT0gJz8nKSBicmVhazsKLQkJCSpwbnQyID0gJ1wwJzsKLQkJICAgICAgfSB3aGlsZSAoMSk7Ci0JCSAgICAgIHN0ciA9IHBhcnNlX2J1ZmZlcjsKLQkJICAgICAgc3ltYm9sX25hbWUgPSBzdHI7Ci0JCSAgICB9Ci0JCSAgaWYgKChwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHN0ciwgJzonKSkgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgKnBudCA9ICdcMCc7Ci0JCSAgICAgIHBudDEgPSBwbnQgKyAxOwotCQkgICAgICBpZiAoKHBudDIgPSAoY2hhciAqKSBzdHJjaHIgKHBudDEsICc9JykpICE9IDApCi0JCQlpbmNvbXBsZXRlICs9IFZNU190eXBlZGVmX3BhcnNlIChwbnQyKTsKLQkJICAgICAgaWYgKHBhcnNlX2J1ZmZlcikKLQkJCXsKLQkJCSAgLyogIEF0IHRoaXMgcG9pbnQgdGhlIHBhcnNlIGJ1ZmZlciBzaG91bGQganVzdAotCQkJICAgICAgY29udGFpbiBuYW1lOm5uLiAgSWYgaXQgZG9lcyBub3QsIHRoZW4gd2UKLQkJCSAgICAgIGFyZSBpbiByZWFsIHRyb3VibGUuICBBbnl3YXksIHRoaXMgaXMgYWx3YXlzCi0JCQkgICAgICBzaG9ydGVyIHRoYW4gdGhlIG9yaWdpbmFsIGxpbmUuICAqLwotCQkJICBwbnQyID0gU19HRVRfTkFNRSAoc3ApOwotCQkJICBzdHJjcHkgKHBudDIsIHBhcnNlX2J1ZmZlcik7Ci0JCSAgICAgICAvKiBTX1NFVF9OQU1FIChzcCwgcG50Mik7ICovCi0JCQkgIGZyZWUgKHBhcnNlX2J1ZmZlciksICBwYXJzZV9idWZmZXIgPSAwOwotCQkJfQotCQkgICAgICAqcG50ID0gJzonOwkvKiBwdXQgYmFjayBjb2xvbiB0byByZXN0b3JlIGRieF90eXBlICovCi0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCX0JCS8qc3dpdGNoKi8KLQkgICAgfQkJCS8qIGlmICovCi0JfQkJCS8qZm9yKi8KLSAgICAgIHBhc3MrKzsKLSAgICAgIC8qCi0gICAgICAgKiBNYWtlIG9uZSBsYXN0IHBhc3MsIGlmIG5lZWRlZCwgYW5kIGRlZmluZSB3aGF0ZXZlciB3ZSBjYW4KLSAgICAgICAqIHRoYXQgaXMgbGVmdC4KLSAgICAgICAqLwotICAgICAgaWYgKGZpbmFsX3Bhc3MgPT0gMCAmJiBpbmNvbXBsZXRlID09IGluY29tMSkKLQl7Ci0JICBmaW5hbF9wYXNzID0gMTsKLQkgIGluY29tMSsrOwkvKiBGb3JjZSBvbmUgbGFzdCBwYXNzIHRocm91Z2ggKi8KLQl9Ci0gIH0gd2hpbGUgKGluY29tcGxldGUgIT0gMCAmJiBpbmNvbXBsZXRlICE9IGluY29tMSk7Ci0gIC8qIHJlcGVhdCB1bnRpbCBhbGwgcmVmcyByZXNvbHZlZCBpZiBwb3NzaWJsZSAqLwotLyoJaWYgKHBhc3MgPiAxKSBwcmludGYgKCIgUmVxdWlyZWQgJWQgcGFzc2VzXG4iLCBwYXNzKTsgKi8KLSAgaWYgKGluY29tcGxldGUgIT0gMCkKLSAgICB7Ci0gICAgICBhc190c2t0c2sgKF8oImRlYnVnZ2VyIG91dHB1dDogVW5hYmxlIHRvIHJlc29sdmUgJWQgY2lyY3VsYXIgcmVmZXJlbmNlcy4iKSwKLQkJIGluY29tcGxldGUpOwotICAgIH0KLSAgZnBudCA9IGZfcmVmX3Jvb3Q7Ci0gIHN5bWJvbF9uYW1lID0gIlwwIjsKLSAgd2hpbGUgKGZwbnQpCi0gICAgewotICAgICAgaWYgKGZwbnQtPnJlc29sdmVkICE9ICdZJykKLQl7Ci0JICBpZiAoZmluZF9zeW1ib2wgKGZwbnQtPmRieF90eXBlKSkKLQkgICAgewotCSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnZXIgZm9yd2FyZCByZWZlcmVuY2UgZXJyb3IsIGRieCB0eXBlICVkIiksCi0JCQkgZnBudC0+ZGJ4X3R5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBmaXhpdFswXSA9IDA7Ci0JICBzcHJpbnRmICgmZml4aXRbMV0sICIlZD1zNDsiLCBmcG50LT5kYnhfdHlwZSk7Ci0JICBwbnQyID0gKGNoYXIgKikgc3RyY2hyICgmZml4aXRbMV0sICc9Jyk7Ci0JICBWTVNfdHlwZWRlZl9wYXJzZSAocG50Mik7Ci0JfQotICAgICAgZnBudCA9IGZwbnQtPm5leHQ7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1EZWZpbmVfTG9jYWxfU3ltYm9scyAoczBQLCBzMlAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCkKLSAgICAgc3ltYm9sUyAqczBQLCAqczJQOwotICAgICBzeW1ib2xTICpDdXJyZW50X1JvdXRpbmU7Ci0gICAgIGludCBUZXh0X1BzZWN0OwotewotICBzeW1ib2xTICpzMVA7CQkvKiBlYWNoIHN5bWJvbCBmcm9tIHMwUCAuLiBzMlAgKGV4Y2x1c2l2ZSkgKi8KLQotICBmb3IgKHMxUCA9IHN5bWJvbF9uZXh0IChzMFApOyBzMVAgIT0gczJQOyBzMVAgPSBzeW1ib2xfbmV4dCAoczFQKSkKLSAgICB7Ci0gICAgICBpZiAoIXMxUCkKLQlicmVhazsJCS8qIGFuZCByZXR1cm4gKi8KLSAgICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoczFQKSA9PSBOX0ZVTikKLQl7Ci0JICBjaGFyICpwbnQgPSAoY2hhciAqKSBzdHJjaHIgKFNfR0VUX05BTUUgKHMxUCksICc6JykgKyAxOwotCSAgaWYgKCpwbnQgPT0gJ0YnIHx8ICpwbnQgPT0gJ2YnKSBicmVhazsKLQl9Ci0gICAgICBpZiAoIVNfSVNfREVCVUcgKHMxUCkpCi0JY29udGludWU7Ci0gICAgICAvKgotICAgICAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHMxUCkpCi0JewotCWRlZmF1bHQ6Ci0JICBjb250aW51ZTsJCS8qIG5vdCBsZWZ0IG9yIHJpZ2h0IGJyYWNlICovCi0KLQljYXNlIE5fTFNZTToKLQljYXNlIE5fUFNZTToKLQkgIFZNU19sb2NhbF9zdGFiX1BhcnNlIChzMVApOwotCSAgYnJlYWs7Ci0KLQljYXNlIE5fUlNZTToKLQkgIFZNU19SU1lNX1BhcnNlIChzMVAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7Ci0JICBicmVhazsKLQl9CQkJLypzd2l0Y2gqLwotICAgIH0JCQkJLyogZm9yICovCi19Ci0KLQotLyogVGhpcyBmdW5jdGlvbiBjcmF3bHMgdGhlIHN5bWJvbCBjaGFpbiBzZWFyY2hpbmcgZm9yIGxvY2FsIHN5bWJvbHMgdGhhdAotICAgbmVlZCB0byBiZSBkZXNjcmliZWQgdG8gdGhlIGRlYnVnZ2VyLiAgV2hlbiB3ZSBlbnRlciBhIG5ldyBzY29wZSB3aXRoCi0gICBhICJ7IiwgaXQgY3JlYXRlcyBhIG5ldyAiYmxvY2siLCB3aGljaCBoZWxwcyB0aGUgZGVidWdnZXIga2VlcCB0cmFjawotICAgb2Ygd2hpY2ggc2NvcGUgd2UgYXJlIGN1cnJlbnRseSBpbi4gICovCi0KLXN0YXRpYyBzeW1ib2xTICoKLURlZmluZV9Sb3V0aW5lIChzMFAsIExldmVsLCBDdXJyZW50X1JvdXRpbmUsIFRleHRfUHNlY3QpCi0gICAgIHN5bWJvbFMgKnMwUDsKLSAgICAgaW50IExldmVsOwotICAgICBzeW1ib2xTICpDdXJyZW50X1JvdXRpbmU7Ci0gICAgIGludCBUZXh0X1BzZWN0OwotewotICBzeW1ib2xTICpzMVA7Ci0gIHZhbHVlVCBPZmZzZXQ7Ci0gIGludCByY291bnQgPSAwOwotCi0gIGZvciAoczFQID0gc3ltYm9sX25leHQgKHMwUCk7IHMxUCAhPSAwOyBzMVAgPSBzeW1ib2xfbmV4dCAoczFQKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHMxUCkgPT0gTl9GVU4pCi0JewotCSAgY2hhciAqcG50ID0gKGNoYXIgKikgc3RyY2hyIChTX0dFVF9OQU1FIChzMVApLCAnOicpICsgMTsKLQkgIGlmICgqcG50ID09ICdGJyB8fCAqcG50ID09ICdmJykgYnJlYWs7Ci0JfQotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzMVApKQotCWNvbnRpbnVlOwotICAgICAgLyoKLSAgICAgICAqCURpc3BhdGNoIG9uIFNUQUIgdHlwZQotICAgICAgICovCi0gICAgICBzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzMVApKQotCXsKLQlkZWZhdWx0OgotCSAgY29udGludWU7CQkvKiBub3QgbGVmdCBvciByaWdodCBicmFjZSAqLwotCi0JY2FzZSBOX0xCUkFDOgotCSAgaWYgKExldmVsICE9IDApCi0JICAgIHsKLQkgICAgICBjaGFyIHN0clsxMF07Ci0JICAgICAgc3ByaW50ZiAoc3RyLCAiJCVkIiwgcmNvdW50KyspOwotCSAgICAgIFZNU19UQlRfQmxvY2tfQmVnaW4gKHMxUCwgVGV4dF9Qc2VjdCwgc3RyKTsKLQkgICAgfQotCSAgT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHMxUCk7CS8qIHNpZGUtZWZmZWN0OiBmdWxseSByZXNvbHZlIHN5bWJvbCAqLwotCSAgRGVmaW5lX0xvY2FsX1N5bWJvbHMgKHMwUCwgczFQLCBDdXJyZW50X1JvdXRpbmUsIFRleHRfUHNlY3QpOwotCSAgczFQID0gRGVmaW5lX1JvdXRpbmUgKHMxUCwgTGV2ZWwgKyAxLCBDdXJyZW50X1JvdXRpbmUsIFRleHRfUHNlY3QpOwotCSAgaWYgKExldmVsICE9IDApCi0JICAgIFZNU19UQlRfQmxvY2tfRW5kIChTX0dFVF9WQUxVRSAoczFQKSAtIE9mZnNldCk7Ci0JICBzMFAgPSBzMVA7Ci0JICBicmVhazsKLQotCWNhc2UgTl9SQlJBQzoKLQkgIHJldHVybiBzMVA7Ci0JfQkJCS8qc3dpdGNoKi8KLSAgICB9CQkJCS8qIGZvciAqLwotCi0gIC8qIFdlIGVuZCB1cCBoZXJlIGlmIHRoZXJlIHdlcmUgbm8gYnJhY2tldHMgaW4gdGhpcyBmdW5jdGlvbi4KLSAgICAgRGVmaW5lIGV2ZXJ5dGhpbmcuICAqLwotICBEZWZpbmVfTG9jYWxfU3ltYm9scyAoczBQLCAoc3ltYm9sUyAqKTAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7Ci0gIHJldHVybiBzMVA7Ci19Ci0MCi0KLSNpZm5kZWYgVk1TCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotc3RhdGljIHZvaWQgZ2V0X1ZNU190aW1lX29uX3VuaXggUEFSQU1TICgoY2hhciAqKSk7Ci0KLS8qIE1hbnVmYWN0dXJlIGEgVk1TLWxpa2UgdGltZSBzdHJpbmcgb24gYSBVbml4IGJhc2VkIHN5c3RlbS4gICovCi1zdGF0aWMgdm9pZAotZ2V0X1ZNU190aW1lX29uX3VuaXggKE5vdykKLSAgICAgY2hhciAqTm93OwotewotICBjaGFyICpwbnQ7Ci0gIHRpbWVfdCB0aW1lYjsKLQotICB0aW1lICgmdGltZWIpOwotICBwbnQgPSBjdGltZSAoJnRpbWViKTsKLSAgcG50WzNdID0gMDsKLSAgcG50WzddID0gMDsKLSAgcG50WzEwXSA9IDA7Ci0gIHBudFsxNl0gPSAwOwotICBwbnRbMjRdID0gMDsKLSAgc3ByaW50ZiAoTm93LCAiJTJzLSUzcy0lcyAlcyIsIHBudCArIDgsIHBudCArIDQsIHBudCArIDIwLCBwbnQgKyAxMSk7Ci19Ci0jZW5kaWYgLyogbm90IFZNUyAqLwotCi0KLS8qIFdyaXRlIHRoZSBNSEQgKE1vZHVsZSBIZWFkZXIpIHJlY29yZHMuICAqLwotCi1zdGF0aWMgdm9pZAotV3JpdGVfVk1TX01IRF9SZWNvcmRzICgpCi17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmNwOwotICByZWdpc3RlciBjaGFyICpjcDE7Ci0gIHJlZ2lzdGVyIGludCBpOwotI2lmZGVmIFZNUwotICBzdHJ1Y3QgeyB1bnNpZ25lZCBzaG9ydCBsZW4sIG1iejsgY2hhciAqcHRyOyB9IERlc2NyaXB0b3I7Ci0jZW5kaWYKLSAgY2hhciBOb3dbMTcrMV07Ci0KLSAgLyogV2UgYXJlIHdyaXRpbmcgYSBtb2R1bGUgaGVhZGVyIHJlY29yZC4gICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0hEUik7Ci0gIC8qCi0gICAqCSoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgkqTUFJTiBNT0RVTEUgSEVBREVSIFJFQ09SRCoKLSAgICoJKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqLwotICAvKiBTdG9yZSByZWNvcmQgdHlwZSBhbmQgaGVhZGVyIHR5cGUuICAqLwotICBQVVRfQ0hBUiAoT0JKX1NfQ19IRFIpOwotICBQVVRfQ0hBUiAoTUhEX1NfQ19NSEQpOwotICAvKiBTdHJ1Y3R1cmUgbGV2ZWwgaXMgMC4gICovCi0gIFBVVF9DSEFSIChPQkpfU19DX1NUUkxWTCk7Ci0gIC8qIE1heGltdW0gcmVjb3JkIHNpemUgaXMgc2l6ZSBvZiB0aGUgb2JqZWN0IHJlY29yZCBidWZmZXIuICAqLwotICBQVVRfU0hPUlQgKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpKTsKLQotCS8qCi0JICoJRklYTUU6ICBtb2R1bGUgbmFtZSBhbmQgdmVyc2lvbiBzaG91bGQgYmUgdXNlcgotCSAqCQlzcGVjaWZpYWJsZSB2aWEgYC5pZGVudCcgYW5kL29yIGAjcHJhZ21hIGlkZW50Jy4KLQkgKi8KLQotICAvKiBHZXQgbW9kdWxlIG5hbWUgKHRoZSBGSUxFTkFNRSBwYXJ0IG9mIHRoZSBvYmplY3QgZmlsZSkuICAqLwotICBjcCA9IG91dF9maWxlX25hbWU7Ci0gIGNwMSA9IE1vZHVsZV9OYW1lOwotICB3aGlsZSAoKmNwKQotICAgIHsKLSAgICAgIGlmICgqY3AgPT0gJ10nIHx8ICpjcCA9PSAnPicgfHwgKmNwID09ICc6JyB8fCAqY3AgPT0gJy8nKQotCXsKLQkgIGNwMSA9IE1vZHVsZV9OYW1lOwotCSAgY3ArKzsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgICpjcDErKyA9IGlzbG93ZXIgKCpjcCkgPyB0b3VwcGVyICgqY3ArKykgOiAqY3ArKzsKLSAgICB9Ci0gICpjcDEgPSAnXDAnOwotCi0gIC8qIExpbWl0IGl0IHRvIDMxIGNoYXJhY3RlcnMgYW5kIHN0b3JlIGluIHRoZSBvYmplY3QgcmVjb3JkLiAgKi8KLSAgd2hpbGUgKC0tY3AxID49IE1vZHVsZV9OYW1lKQotICAgIGlmICgqY3AxID09ICcuJykKLSAgICAgICpjcDEgPSAnXDAnOwotICBpZiAoc3RybGVuIChNb2R1bGVfTmFtZSkgPiAzMSkKLSAgICB7Ci0gICAgICBpZiAoZmxhZ19oYXNoX2xvbmdfbmFtZXMpCi0JYXNfdHNrdHNrIChfKCJNb2R1bGUgbmFtZSB0cnVuY2F0ZWQ6ICVzXG4iKSwgTW9kdWxlX05hbWUpOwotICAgICAgTW9kdWxlX05hbWVbMzFdID0gJ1wwJzsKLSAgICB9Ci0gIFBVVF9DT1VOVEVEX1NUUklORyAoTW9kdWxlX05hbWUpOwotICAvKiBNb2R1bGUgVmVyc2lvbiBpcyAiVjEuMCIuICAqLwotICBQVVRfQ09VTlRFRF9TVFJJTkcgKCJWMS4wIik7Ci0gIC8qIENyZWF0aW9uIHRpbWUgaXMgIm5vdyIgKDE3IGNoYXJzIG9mIHRpbWUgc3RyaW5nKTogImRkLU1NTS15eXl5IGhoOm1tIi4gICovCi0jaWZuZGVmIFZNUwotICBnZXRfVk1TX3RpbWVfb25fdW5peCAoTm93KTsKLSNlbHNlIC8qIFZNUyAqLwotICBEZXNjcmlwdG9yLmxlbiA9IHNpemVvZiBOb3cgLSAxOwotICBEZXNjcmlwdG9yLm1ieiA9IDA7CQkvKiB0eXBlICYgY2xhc3MgdW5zcGVjaWZpZWQgKi8KLSAgRGVzY3JpcHRvci5wdHIgPSBOb3c7Ci0gICh2b2lkKSBzeXMkYXNjdGltICgodW5zaWduZWQgc2hvcnQgKikwLCAmRGVzY3JpcHRvciwgKGxvbmcgKikwLCAwKTsKLSNlbmRpZiAvKiBWTVMgKi8KLSAgZm9yIChpID0gMDsgaSA8IDE3OyBpKyspCi0gICAgUFVUX0NIQVIgKE5vd1tpXSk7Ci0gIC8qIFBhdGNoIHRpbWUgaXMgIm5ldmVyIiAoMTcgemVyb3MpLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IDE3OyBpKyspCi0gICAgUFVUX0NIQVIgKDApOwotICAvKiBGb3JjZSB0aGlzIHRvIGJlIGEgc2VwYXJhdGUgb3V0cHV0IHJlY29yZC4gICovCi0gIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLQotICAvKgotICAgKgkqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCSpMQU5HVUFHRSBQUk9DRVNTT1IgTkFNRSoKLSAgICoJKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKi8KLSAgLyogU3RvcmUgcmVjb3JkIHR5cGUgYW5kIGhlYWRlciB0eXBlLiAgKi8KLSAgUFVUX0NIQVIgKE9CSl9TX0NfSERSKTsKLSAgUFVUX0NIQVIgKE1IRF9TX0NfTE5NKTsKLSAgLyoKLSAgICogU3RvcmUgbGFuZ3VhZ2UgcHJvY2Vzc29yIG5hbWUgYW5kIHZlcnNpb24gKG5vdCBhIGNvdW50ZWQgc3RyaW5nISkuCi0gICAqCi0gICAqIFRoaXMgaXMgbm9ybWFsbHkgc3VwcGxpZWQgYnkgdGhlIGdjYyBkcml2ZXIgZm9yIHRoZSBjb21tYW5kIGxpbmUKLSAgICogd2hpY2ggaW52b2tlcyBnYXMuICBJZiBhYnNlbnQsIHdlIGZhbGwgYmFjayB0byBnYXMncyB2ZXJzaW9uLgotICAgKi8KLSAgY3AgPSBjb21waWxlcl92ZXJzaW9uX3N0cmluZzsKLSAgaWYgKGNwID09IDApCi0gICAgewotICAgICAgY3AgPSAiR05VIEFTICBWIjsKLSAgICAgIHdoaWxlICgqY3ApCi0JUFVUX0NIQVIgKCpjcCsrKTsKLSAgICAgIGNwID0gVkVSU0lPTjsKLSAgICB9Ci0gIHdoaWxlICgqY3AgPj0gJyAnKQotICAgIFBVVF9DSEFSICgqY3ArKyk7Ci0gIC8qIEZvcmNlIHRoaXMgdG8gYmUgYSBzZXBhcmF0ZSBvdXRwdXQgcmVjb3JkLiAgKi8KLSAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotCi0KLS8qIFdyaXRlIHRoZSBFT00gKEVuZCBPZiBNb2R1bGUpIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1Xcml0ZV9WTVNfRU9NX1JlY29yZCAoUHNlY3QsIE9mZnNldCkKLSAgICAgaW50IFBzZWN0OwotICAgICB2YWx1ZVQgT2Zmc2V0OwotewotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhbiBlbmQtb2YtbW9kdWxlIHJlY29yZAotICAgKgkodGhpcyBhc3N1bWVzIHRoYXQgdGhlIGVudHJ5IHBvaW50IHdpbGwgYWx3YXlzIGJlIGluIGEgcHNlY3QKLSAgICoJIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGJ5dGUsIHdoaWNoIGlzIHRoZSBjYXNlIGZvciBjb2RlIGluCi0gICAqCSBUZXh0X1BzZWN0PT0wKQotICAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfRU9NKTsKLSAgUFVUX0NIQVIgKE9CSl9TX0NfRU9NKTsJLyogUmVjb3JkIHR5cGUuICAqLwotICBQVVRfQ0hBUiAoMCk7CQkJLyogRXJyb3Igc2V2ZXJpdHkgbGV2ZWwgKHdlIGlnbm9yZSBpdCkuICovCi0gIC8qCi0gICAqCVN0b3JlIHRoZSBlbnRyeSBwb2ludCwgaWYgaXQgZXhpc3RzCi0gICAqLwotICBpZiAoUHNlY3QgPj0gMCkKLSAgICB7Ci0gICAgICBQVVRfQ0hBUiAoUHNlY3QpOwotICAgICAgUFVUX0xPTkcgKE9mZnNldCk7Ci0gICAgfQotICAvKiBGbHVzaCB0aGUgcmVjb3JkOyB0aGlzIHdpbGwgYmUgb3VyIGZpbmFsIG91dHB1dC4gICovCi0gIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQwKLQotLyogdGhpcyBoYXNoIHJvdXRpbmUgYm9ycm93ZWQgZnJvbSBHTlUtRU1BQ1MsIGFuZCBzdHJlbmd0aGVuZWQgc2xpZ2h0bHkgIEVSWSovCi0KLXN0YXRpYyBpbnQKLWhhc2hfc3RyaW5nIChwdHIpCi0gICAgIGNvbnN0IGNoYXIgKnB0cjsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopIHB0cjsKLSAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kID0gcCArIHN0cmxlbiAocHRyKTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjOwotICByZWdpc3RlciBpbnQgaGFzaCA9IDA7Ci0KLSAgd2hpbGUgKHAgIT0gZW5kKQotICAgIHsKLSAgICAgIGMgPSAqcCsrOwotICAgICAgaGFzaCA9ICgoaGFzaCA8PCAzKSArIChoYXNoIDw8IDE1KSArIChoYXNoID4+IDI4KSArIGMpOwotICAgIH0KLSAgcmV0dXJuIGhhc2g7Ci19Ci0KLS8qCi0gKglHZW5lcmF0ZSBhIENhc2UtSGFja2VkIFZNUyBzeW1ib2wgbmFtZSAobGltaXRlZCB0byAzMSBjaGFycykKLSAqLwotc3RhdGljIHZvaWQKLVZNU19DYXNlX0hhY2tfU3ltYm9sIChJbiwgT3V0KQotICAgICByZWdpc3RlciBjb25zdCBjaGFyICpJbjsKLSAgICAgcmVnaXN0ZXIgY2hhciAqT3V0OwotewotICBsb25nIGludCBpbml0OwotICBsb25nIGludCByZXN1bHQ7Ci0gIGNoYXIgKnBudCA9IDA7Ci0gIGNoYXIgKm5ld19uYW1lOwotICBjb25zdCBjaGFyICpvbGRfbmFtZTsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGludCBkZXN0cnVjdG9yID0gMDsJCS8qaGFjayB0byBhbGxvdyBmb3IgY2FzZSBzZW5zIGluIGEgZGVzdHJ1Y3RvciovCi0gIGludCB0cnVuY2F0ZSA9IDA7Ci0gIGludCBDYXNlX0hhY2tfQml0cyA9IDA7Ci0gIGludCBTYXdfRG9sbGFyID0gMDsKLSAgc3RhdGljIGNoYXIgSGV4X1RhYmxlWzE2XSA9Ci0gIHsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRid9OwotCi0gIC8qCi0gICAqCUtpbGwgYW55IGxlYWRpbmcgIl8iCi0gICAqLwotICBpZiAoKEluWzBdID09ICdfJykgJiYgKChJblsxXSA+ICc5JykgfHwgKEluWzFdIDwgJzAnKSkpCi0gICAgSW4rKzsKLQotICBuZXdfbmFtZSA9IE91dDsJCS8qIHNhdmUgdGhpcyBmb3IgbGF0ZXIqLwotCi0jaWYgYmFyZm9vCQkJLyogRGVhZCBjb2RlICovCi0gIGlmICgoSW5bMF0gPT0gJ18nKSAmJiAoSW5bMV0gPT0gJyQnKSAmJiAoSW5bMl0gPT0gJ18nKSkKLSAgICBkZXN0cnVjdG9yID0gMTsKLSNlbmRpZgotCi0gIC8qIFdlIG1heSBuZWVkIHRvIHRydW5jYXRlIHRoZSBzeW1ib2wsIHNhdmUgdGhlIGhhc2ggZm9yIGxhdGVyKi8KLSAgcmVzdWx0ID0gKHN0cmxlbiAoSW4pID4gMjMpID8gaGFzaF9zdHJpbmcgKEluKSA6IDA7Ci0gIC8qCi0gICAqCUlzIHRoZXJlIGEgUHNlY3QgQXR0cmlidXRlIHRvIHNraXA/PwotICAgKi8KLSAgaWYgKEhBU19QU0VDVF9BVFRSSUJVVEVTIChJbikpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCVllczogU2tpcCBpdAotICAgICAgICovCi0gICAgICBJbiArPSBQU0VDVF9BVFRSSUJVVEVTX1NUUklOR19MRU5HVEg7Ci0gICAgICB3aGlsZSAoKkluKQotCXsKLQkgIGlmICgoSW5bMF0gPT0gJyQnKSAmJiAoSW5bMV0gPT0gJyQnKSkKLQkgICAgewotCSAgICAgIEluICs9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIEluKys7Ci0JfQotICAgIH0KLQotICBvbGRfbmFtZSA9IEluOwotLyoJaWYgKHN0cmxlbiAoSW4pID4gMzEgJiYgZmxhZ19oYXNoX2xvbmdfbmFtZXMpCi0JICBhc190c2t0c2sgKCJTeW1ib2wgbmFtZSB0cnVuY2F0ZWQ6ICVzXG4iLCBJbik7ICovCi0gIC8qCi0gICAqCURvIHRoZSBjYXNlIGNvbnZlcnNpb24KLSAgICovCi0gIGkgPSAyMzsJCQkvKiBNYXhpbXVtIG9mIDIzIGNoYXJzICovCi0gIHdoaWxlICgqSW4gJiYgKC0taSA+PSAwKSkKLSAgICB7Ci0gICAgICBDYXNlX0hhY2tfQml0cyA8PD0gMTsKLSAgICAgIGlmICgqSW4gPT0gJyQnKQotCVNhd19Eb2xsYXIgPSAxOwotICAgICAgaWYgKChkZXN0cnVjdG9yID09IDEpICYmIChpID09IDIxKSkKLQlTYXdfRG9sbGFyID0gMDsKLSAgICAgIHN3aXRjaCAodm1zX25hbWVfbWFwcGluZykKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKGlzdXBwZXIgKCpJbikpIHsKLQkgICAgKk91dCsrID0gKkluKys7Ci0JICAgIENhc2VfSGFja19CaXRzIHw9IDE7Ci0JICB9IGVsc2UgewotCSAgICAqT3V0KysgPSBpc2xvd2VyICgqSW4pID8gdG91cHBlciAoKkluKyspIDogKkluKys7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDM6ICpPdXQrKyA9ICpJbisrOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgaWYgKGlzbG93ZXIgKCpJbikpIHsKLQkgICAgKk91dCsrID0gKkluKys7Ci0JICB9IGVsc2UgewotCSAgICAqT3V0KysgPSBpc3VwcGVyICgqSW4pID8gdG9sb3dlciAoKkluKyspIDogKkluKys7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICAvKgotICAgKglJZiB3ZSBzYXcgYSBkb2xsYXIgc2lnbiwgd2UgZG9uJ3QgZG8gY2FzZSBoYWNraW5nCi0gICAqLwotICBpZiAoZmxhZ19ub19oYXNoX21peGVkX2Nhc2UgfHwgU2F3X0RvbGxhcikKLSAgICBDYXNlX0hhY2tfQml0cyA9IDA7Ci0KLSAgLyoKLSAgICoJSWYgd2UgaGF2ZSBtb3JlIHRoYW4gMjMgY2hhcmFjdGVycyBhbmQgZXZlcnl0aGluZyBpcyBsb3dlcmNhc2UKLSAgICoJd2UgY2FuIGluc2VydCB0aGUgZnVsbCAzMSBjaGFyYWN0ZXJzCi0gICAqLwotICBpZiAoKkluKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKglXZSAgaGF2ZSBtb3JlIHRoYW4gMjMgY2hhcmFjdGVycwotICAgICAgICogSWYgd2UgbXVzdCBhZGQgdGhlIGNhc2UgaGFjaywgdGhlbiB3ZSBoYXZlIHRydW5jYXRlZCB0aGUgc3RyCi0gICAgICAgKi8KLSAgICAgIHBudCA9IE91dDsKLSAgICAgIHRydW5jYXRlID0gMTsKLSAgICAgIGlmIChDYXNlX0hhY2tfQml0cyA9PSAwKQotCXsKLQkgIC8qCi0JICAgKglBbmQgc28gZmFyIHRoZXkgYXJlIGFsbCBsb3dlciBjYXNlOgotCSAgICoJCUNoZWNrIHVwIHRvIDggbW9yZSBjaGFyYWN0ZXJzCi0JICAgKgkJYW5kIGVuc3VyZSB0aGF0IHRoZXkgYXJlIGxvd2VyY2FzZQotCSAgICovCi0JICBmb3IgKGkgPSAwOyAoSW5baV0gIT0gMCkgJiYgKGkgPCA4KTsgaSsrKQotCSAgICBpZiAoaXN1cHBlciAoSW5baV0pICYmICFTYXdfRG9sbGFyICYmICFmbGFnX25vX2hhc2hfbWl4ZWRfY2FzZSkKLQkgICAgICBicmVhazsKLQotCSAgaWYgKEluW2ldID09IDApCi0JICAgIHRydW5jYXRlID0gMDsKLQotCSAgaWYgKChpID09IDgpIHx8IChJbltpXSA9PSAwKSkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICoJVGhleSBhcmU6ICBDb3B5IHVwIHRvIDMxIGNoYXJhY3RlcnMKLQkgICAgICAgKgkJCXRvIHRoZSBvdXRwdXQgc3RyaW5nCi0JICAgICAgICovCi0JICAgICAgaSA9IDg7Ci0JICAgICAgd2hpbGUgKCgtLWkgPj0gMCkgJiYgKCpJbikpCi0JCXN3aXRjaCAodm1zX25hbWVfbWFwcGluZyl7Ci0JCWNhc2UgMDogKk91dCsrID0gaXNsb3dlciAoKkluKSA/IHRvdXBwZXIgKCpJbisrKSA6ICpJbisrOwotCQkgIGJyZWFrOwotCQljYXNlIDM6ICpPdXQrKyA9ICpJbisrOwotCQkgIGJyZWFrOwotCQljYXNlIDI6ICpPdXQrKyA9IGlzdXBwZXIgKCpJbikgPyB0b2xvd2VyICgqSW4rKykgOiAqSW4rKzsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgLyoKLSAgICoJSWYgdGhlcmUgd2VyZSBhbnkgdXBwZXJjYXNlIGNoYXJhY3RlcnMgaW4gdGhlIG5hbWUgd2UKLSAgICoJdGFrZSBvbiB0aGUgY2FzZSBoYWNraW5nIHN0cmluZwotICAgKi8KLQotICAvKiBPbGQgYmVoYXZpb3IgZm9yIHJlZ3VsYXIgR05VLUMgY29tcGlsZXIgKi8KLSAgaWYgKCFmbGFnX2hhc2hfbG9uZ19uYW1lcykKLSAgICB0cnVuY2F0ZSA9IDA7Ci0gIGlmICgoQ2FzZV9IYWNrX0JpdHMgIT0gMCkgfHwgKHRydW5jYXRlID09IDEpKQotICAgIHsKLSAgICAgIGlmICh0cnVuY2F0ZSA9PSAwKQotCXsKLQkgICpPdXQrKyA9ICdfJzsKLQkgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JICAgIHsKLQkgICAgICAqT3V0KysgPSBIZXhfVGFibGVbQ2FzZV9IYWNrX0JpdHMgJiAweGZdOwotCSAgICAgIENhc2VfSGFja19CaXRzID4+PSA0OwotCSAgICB9Ci0JICAqT3V0KysgPSAnWCc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIE91dCA9IHBudDsJCS8qQ3V0IGJhY2sgdG8gMjMgY2hhcmFjdGVycyBtYXhpbXVtICovCi0JICAqT3V0KysgPSAnXyc7Ci0JICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQotCSAgICB7Ci0JICAgICAgaW5pdCA9IHJlc3VsdCAmIDB4MDFmOwotCSAgICAgICpPdXQrKyA9IChpbml0IDwgMTApID8gKCcwJyArIGluaXQpIDogKCdBJyArIGluaXQgLSAxMCk7Ci0JICAgICAgcmVzdWx0ID0gcmVzdWx0ID4+IDU7Ci0JICAgIH0KLQl9Ci0gICAgfQkJCQkvKkNhc2UgSGFjayAqLwotICAvKgotICAgKglEb25lCi0gICAqLwotICAqT3V0ID0gMDsKLSAgaWYgKHRydW5jYXRlID09IDEgJiYgZmxhZ19oYXNoX2xvbmdfbmFtZXMgJiYgZmxhZ19zaG93X2FmdGVyX3RydW5jKQotICAgIGFzX3Rza3RzayAoXygiU3ltYm9sICVzIHJlcGxhY2VkIGJ5ICVzXG4iKSwgb2xkX25hbWUsIG5ld19uYW1lKTsKLX0KLQwKLQotLyoKLSAqCVNjYW4gYSBzeW1ib2wgbmFtZSBmb3IgYSBwc2VjdCBhdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbgotICovCi0jZGVmaW5lIEdMT0JBTFNZTUJPTF9CSVQJMHgxMDAwMAotI2RlZmluZSBHTE9CQUxWQUxVRV9CSVQJCTB4MjAwMDAKLQotCi1zdGF0aWMgdm9pZAotVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzIChOYW1lLCBBdHRyaWJ1dGVfUG9pbnRlcikKLSAgICAgY29uc3QgY2hhciAqTmFtZTsKLSAgICAgaW50ICpBdHRyaWJ1dGVfUG9pbnRlcjsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmNwOwotICBpbnQgTmVnYXRlOwotICBzdGF0aWMgY29uc3Qgc3RydWN0Ci0gIHsKLSAgICBjb25zdCBjaGFyICpOYW1lOwotICAgIGludCBWYWx1ZTsKLSAgfSBBdHRyaWJ1dGVzW10gPQotICB7Ci0gICAgeyJQSUMiLCBHUFNfU19NX1BJQ30sCi0gICAgeyJMSUIiLCBHUFNfU19NX0xJQn0sCi0gICAgeyJPVlIiLCBHUFNfU19NX09WUn0sCi0gICAgeyJSRUwiLCBHUFNfU19NX1JFTH0sCi0gICAgeyJHQkwiLCBHUFNfU19NX0dCTH0sCi0gICAgeyJTSFIiLCBHUFNfU19NX1NIUn0sCi0gICAgeyJFWEUiLCBHUFNfU19NX0VYRX0sCi0gICAgeyJSRCIsIEdQU19TX01fUkR9LAotICAgIHsiV1JUIiwgR1BTX1NfTV9XUlR9LAotICAgIHsiVkVDIiwgR1BTX1NfTV9WRUN9LAotICAgIHsiR0xPQkFMU1lNQk9MIiwgR0xPQkFMU1lNQk9MX0JJVH0sCi0gICAgeyJHTE9CQUxWQUxVRSIsIEdMT0JBTFZBTFVFX0JJVH0sCi0gICAgezAsIDB9Ci0gIH07Ci0KLSAgLyoKLSAgICoJS2lsbCBsZWFkaW5nICJfIgotICAgKi8KLSAgaWYgKCpOYW1lID09ICdfJykKLSAgICBOYW1lKys7Ci0gIC8qCi0gICAqCUNoZWNrIGZvciBhIFBTRUNUIGF0dHJpYnV0ZSBsaXN0Ci0gICAqLwotICBpZiAoIUhBU19QU0VDVF9BVFRSSUJVVEVTIChOYW1lKSkKLSAgICByZXR1cm47CQkJLyogSWYgbm90LCByZXR1cm4gKi8KLSAgLyoKLSAgICoJU2tpcCB0aGUgYXR0cmlidXRlIGxpc3QgaW5kaWNhdG9yCi0gICAqLwotICBOYW1lICs9IFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HX0xFTkdUSDsKLSAgLyoKLSAgICoJUHJvY2VzcyB0aGUgYXR0cmlidXRlcyAoIl8iIHNlcGFyYXRlZCwgIiQiIHRlcm1pbmF0ZWQpCi0gICAqLwotICB3aGlsZSAoKk5hbWUgIT0gJyQnKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKglBc3N1bWUgbm90IG5lZ2F0aW5nCi0gICAgICAgKi8KLSAgICAgIE5lZ2F0ZSA9IDA7Ci0gICAgICAvKgotICAgICAgICoJQ2hlY2sgZm9yICJOTyIKLSAgICAgICAqLwotICAgICAgaWYgKChOYW1lWzBdID09ICdOJykgJiYgKE5hbWVbMV0gPT0gJ08nKSkKLQl7Ci0JICAvKgotCSAgICoJV2UgYXJlIG5lZ2F0aW5nIChhbmQgc2tpcCB0aGUgTk8pCi0JICAgKi8KLQkgIE5lZ2F0ZSA9IDE7Ci0JICBOYW1lICs9IDI7Ci0JfQotICAgICAgLyoKLSAgICAgICAqCUZpbmQgdGhlIHRva2VuIGRlbGltaXRlcgotICAgICAgICovCi0gICAgICBjcCA9IE5hbWU7Ci0gICAgICB3aGlsZSAoKmNwICYmICgqY3AgIT0gJ18nKSAmJiAoKmNwICE9ICckJykpCi0JY3ArKzsKLSAgICAgIC8qCi0gICAgICAgKglMb29rIGZvciB0aGUgdG9rZW4gaW4gdGhlIGF0dHJpYnV0ZSBsaXN0Ci0gICAgICAgKi8KLSAgICAgIGZvciAoaSA9IDA7IEF0dHJpYnV0ZXNbaV0uTmFtZTsgaSsrKQotCXsKLQkgIC8qCi0JICAgKglJZiB0aGUgc3RyaW5ncyBtYXRjaCwgc2V0L2NsZWFyIHRoZSBhdHRyLgotCSAgICovCi0JICBpZiAoc3RybmNtcCAoTmFtZSwgQXR0cmlidXRlc1tpXS5OYW1lLCBjcCAtIE5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqCVNldCBvciBjbGVhcgotCSAgICAgICAqLwotCSAgICAgIGlmIChOZWdhdGUpCi0JCSpBdHRyaWJ1dGVfUG9pbnRlciAmPQotCQkgIH5BdHRyaWJ1dGVzW2ldLlZhbHVlOwotCSAgICAgIGVsc2UKLQkJKkF0dHJpYnV0ZV9Qb2ludGVyIHw9Ci0JCSAgQXR0cmlidXRlc1tpXS5WYWx1ZTsKLQkgICAgICAvKgotCSAgICAgICAqCURvbmUKLQkgICAgICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIC8qCi0gICAgICAgKglOb3cgc2tpcCB0aGUgYXR0cmlidXRlCi0gICAgICAgKi8KLSAgICAgIE5hbWUgPSBjcDsKLSAgICAgIGlmICgqTmFtZSA9PSAnXycpCi0JTmFtZSsrOwotICAgIH0KLX0KLQwKLQotI2RlZmluZSBHQkxTWU1fUkVGIDAKLSNkZWZpbmUgR0JMU1lNX0RFRiAxCi0jZGVmaW5lIEdCTFNZTV9WQUwgMgotI2RlZmluZSBHQkxTWU1fTENMIDQJLyogbm90IEdCTCBhZnRlciBhbGwuLi4gKi8KLSNkZWZpbmUgR0JMU1lNX1dFQUsgOAotCi0vKgotICoJRGVmaW5lIGEgZ2xvYmFsIHN5bWJvbCAob3IgcG9zc2libHkgYSBsb2NhbCBvbmUpLgotICovCi1zdGF0aWMgdm9pZAotVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoTmFtZSwgUHNlY3RfTnVtYmVyLCBQc2VjdF9PZmZzZXQsIEZsYWdzKQotICAgICBjb25zdCBjaGFyICpOYW1lOwotICAgICBpbnQgUHNlY3RfTnVtYmVyOwotICAgICBpbnQgUHNlY3RfT2Zmc2V0OwotICAgICBpbnQgRmxhZ3M7Ci17Ci0gIGNoYXIgTG9jYWxbMzJdOwotCi0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgR1NEIHJlY29yZAotICAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfR1NEKTsKLSAgLyoKLSAgICoJSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgR1NEIHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19HU0QpOwotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhIEdsb2JhbCAob3IgbG9jYWwpIHN5bWJvbCBkZWZpbml0aW9uIHN1YnJlY29yZC4KLSAgICovCi0gIFBVVF9DSEFSICgoRmxhZ3MgJiBHQkxTWU1fTENMKSAhPSAwID8gR1NEX1NfQ19MU1kgOgotCSAgICAoKHVuc2lnbmVkKSBQc2VjdF9OdW1iZXIgPD0gMjU1KSA/IEdTRF9TX0NfU1lNIDogR1NEX1NfQ19TWU1XKTsKLSAgLyoKLSAgICoJRGF0YSB0eXBlIGlzIHVuZGVmaW5lZAotICAgKi8KLSAgUFVUX0NIQVIgKDApOwotICAvKgotICAgKglTd2l0Y2ggb24gRGVmaW5pdGlvbi9SZWZlcmVuY2UKLSAgICovCi0gIGlmICgoRmxhZ3MgJiBHQkxTWU1fREVGKSA9PSAwKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKglSZWZlcmVuY2UKLSAgICAgICAqLwotICAgICAgUFVUX1NIT1JUICgoKEZsYWdzICYgR0JMU1lNX1ZBTCkgPT0gMCkgPyBHU1lfU19NX1JFTCA6IDApOwotICAgICAgaWYgKChGbGFncyAmIEdCTFNZTV9MQ0wpICE9IDApCS8qIGxvY2FsIHN5bWJvbHMgaGF2ZSBleHRyYSBmaWVsZCAqLwotCVBVVF9TSE9SVCAoQ3VycmVudF9FbnZpcm9ubWVudCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IHN5bV9mbGFnczsKLQotICAgICAgLyoKLSAgICAgICAqCURlZmluaXRpb24KLSAgICAgICAqWyBhc3NlcnQgKExTWV9TX01fREVGID09IEdTWV9TX01fREVGICYmIExTWV9TX01fUkVMID09IEdTWV9TX01fUkVMKTsgXQotICAgICAgICovCi0gICAgICBzeW1fZmxhZ3MgPSBHU1lfU19NX0RFRjsKLSAgICAgIGlmIChGbGFncyAmIEdCTFNZTV9XRUFLKQotCXN5bV9mbGFncyB8PSBHU1lfU19NX1dFQUs7Ci0gICAgICBpZiAoKEZsYWdzICYgR0JMU1lNX1ZBTCkgPT0gMCkKLQlzeW1fZmxhZ3MgfD0gR1NZX1NfTV9SRUw7Ci0gICAgICBQVVRfU0hPUlQgKHN5bV9mbGFncyk7Ci0gICAgICBpZiAoKEZsYWdzICYgR0JMU1lNX0xDTCkgIT0gMCkJLyogbG9jYWwgc3ltYm9scyBoYXZlIGV4dHJhIGZpZWxkICovCi0JUFVUX1NIT1JUIChDdXJyZW50X0Vudmlyb25tZW50KTsKLSAgICAgIC8qCi0gICAgICAgKglQc2VjdCBOdW1iZXIKLSAgICAgICAqLwotICAgICAgaWYgKChGbGFncyAmIEdCTFNZTV9MQ0wpID09IDAgJiYgKHVuc2lnbmVkKSBQc2VjdF9OdW1iZXIgPD0gMjU1KQotCVBVVF9DSEFSIChQc2VjdF9OdW1iZXIpOwotICAgICAgZWxzZQotCVBVVF9TSE9SVCAoUHNlY3RfTnVtYmVyKTsKLSAgICAgIC8qCi0gICAgICAgKglPZmZzZXQKLSAgICAgICAqLwotICAgICAgUFVUX0xPTkcgKFBzZWN0X09mZnNldCk7Ci0gICAgfQotICAvKgotICAgKglGaW5hbGx5LCB0aGUgZ2xvYmFsIHN5bWJvbCBuYW1lCi0gICAqLwotICBWTVNfQ2FzZV9IYWNrX1N5bWJvbCAoTmFtZSwgTG9jYWwpOwotICBQVVRfQ09VTlRFRF9TVFJJTkcgKExvY2FsKTsKLSAgLyoKLSAgICoJRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0KLS8qCi0gKglEZWZpbmUgYW4gZW52aXJvbm1lbnQgdG8gc3VwcG9ydCBsb2NhbCBzeW1ib2wgcmVmZXJlbmNlcy4KLSAqCVRoaXMgaXMganVzdCB0byBtb2xsaWZ5IHRoZSBsaW5rZXI7IHdlIGRvbid0IGFjdHVhbGx5IGRvCi0gKglhbnl0aGluZyB1c2VmdWwgd2l0aCBpdC4KLSAqLwotc3RhdGljIHZvaWQKLVZNU19Mb2NhbF9FbnZpcm9ubWVudF9TZXR1cCAoRW52X05hbWUpCi0gICAgY29uc3QgY2hhciAqRW52X05hbWU7Ci17Ci0gIC8qIFdlIGFyZSB3cml0aW5nIGEgR1NEIHJlY29yZC4gICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0dTRCk7Ci0gIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIEdTRCByZWNvcmQgdHlwZS4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChPQkpfU19DX0dTRCk7Ci0gIC8qIFdlIGFyZSB3cml0aW5nIGFuIEVOViBzdWJyZWNvcmQuICAqLwotICBQVVRfQ0hBUiAoR1NEX1NfQ19FTlYpOwotCi0gICsrQ3VycmVudF9FbnZpcm9ubWVudDsJLyogaW5kZXggb2YgZW52aXJvbm1lbnQgYmVpbmcgZGVmaW5lZCAqLwotCi0gIC8qIEVOViRXX0ZMQUdTOiAgd2UgYXJlIGRlZmluaW5nIHRoZSBuZXh0IGVudmlyb25tZW50LiAgSXQncyBub3QgbmVzdGVkLiAgKi8KLSAgUFVUX1NIT1JUIChFTlZfU19NX0RFRik7Ci0gIC8qIEVOViRXX0VOVklORFg6ICBpbmRleCBpcyBhbHdheXMgMCBmb3Igbm9uLW5lc3RlZCBkZWZpbml0aW9ucy4gICovCi0gIFBVVF9TSE9SVCAoMCk7Ci0KLSAgLyogRU5WJEJfTkFNTE5HICsgRU5WJFRfTkFNRTogIGVudmlyb25tZW50IG5hbWUgaW4gQVNDSUMgZm9ybWF0LiAgKi8KLSAgaWYgKCFFbnZfTmFtZSkgRW52X05hbWUgPSAiIjsKLSAgUFVUX0NPVU5URURfU1RSSU5HICgoY2hhciAqKUVudl9OYW1lKTsKLQotICAvKiBGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbC4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0MCi0KLS8qCi0gKglEZWZpbmUgYSBwc2VjdAotICovCi1zdGF0aWMgaW50Ci1WTVNfUHNlY3RfU3BlYyAoTmFtZSwgU2l6ZSwgVHlwZSwgdnNwKQotICAgICBjb25zdCBjaGFyICpOYW1lOwotICAgICBpbnQgU2l6ZTsKLSAgICAgZW51bSBwc190eXBlIFR5cGU7Ci0gICAgIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7Ci17Ci0gIGNoYXIgTG9jYWxbMzJdOwotICBpbnQgUHNlY3RfQXR0cmlidXRlczsKLQotICAvKgotICAgKglHZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgUFNFQ1QgZmxhZ3MgZ2l2ZW4gdGhlIFBTRUNUIHR5cGUKLSAgICovCi0gIHN3aXRjaCAoVHlwZSkKLSAgICB7Ci0gICAgY2FzZSBwc19URVhUOgotICAgICAgLyogVGV4dCBwc2VjdHMgYXJlIFBJQyxub09WUixSRUwsbm9HQkwsU0hSLEVYRSxSRCxub1dSVC4gKi8KLSAgICAgIFBzZWN0X0F0dHJpYnV0ZXMgPSAoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9TSFJ8R1BTX1NfTV9FWEUKLQkJCSAgfEdQU19TX01fUkQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBwc19EQVRBOgotICAgICAgLyogRGF0YSBwc2VjdHMgYXJlIFBJQyxub09WUixSRUwsbm9HQkwsbm9TSFIsbm9FWEUsUkQsV1JULiAqLwotICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgcHNfQ09NTU9OOgotICAgICAgLyogQ29tbW9uIGJsb2NrIHBzZWN0cyBhcmU6ICBQSUMsT1ZSLFJFTCxHQkwsbm9TSFIsbm9FWEUsUkQsV1JULiAqLwotICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTAotCQkJICB8R1BTX1NfTV9SRHxHUFNfU19NX1dSVCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHBzX0NPTlNUOgotICAgICAgLyogQ29uc3QgZGF0YSBwc2VjdHMgYXJlOiAgUElDLE9WUixSRUwsR0JMLG5vU0hSLG5vRVhFLFJELG5vV1JULiAqLwotICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTAotCQkJICB8R1BTX1NfTV9SRCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHBzX0NUT1JTOgotICAgICAgLyogQ3RvciBwc2VjdHMgYXJlIFBJQyxub09WUixSRUwsR0JMLG5vU0hSLG5vRVhFLFJELG5vV1JULiAqLwotICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX0dCTHxHUFNfU19NX1JEKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgcHNfRFRPUlM6Ci0gICAgICAvKiBEdG9yIHBzZWN0cyBhcmUgUElDLG5vT1ZSLFJFTCxHQkwsbm9TSFIsbm9FWEUsUkQsbm9XUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fR0JMfEdQU19TX01fUkQpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIGltcG9zc2libGUgKi8KLSAgICAgIGVycm9yIChfKCJVbmtub3duIFZNUyBwc2VjdCB0eXBlICglbGQpIiksIChsb25nKSBUeXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgLyoKLSAgICoJTW9kaWZ5IHRoZSBwc2VjdCBhdHRyaWJ1dGVzIGFjY29yZGluZyB0byBhbnkgYXR0cmlidXRlIHN0cmluZwotICAgKi8KLSAgaWYgKHZzcCAmJiBTX0dFVF9UWVBFICh2c3AtPlN5bWJvbCkgPT0gTl9BQlMpCi0gICAgUHNlY3RfQXR0cmlidXRlcyB8PSBHTE9CQUxWQUxVRV9CSVQ7Ci0gIGVsc2UgaWYgKEhBU19QU0VDVF9BVFRSSUJVVEVTIChOYW1lKSkKLSAgICBWTVNfTW9kaWZ5X1BzZWN0X0F0dHJpYnV0ZXMgKE5hbWUsICZQc2VjdF9BdHRyaWJ1dGVzKTsKLSAgLyoKLSAgICoJQ2hlY2sgZm9yIGdsb2JhbHJlZi9kZWYvdmFsLgotICAgKi8KLSAgaWYgKChQc2VjdF9BdHRyaWJ1dGVzICYgR0xPQkFMVkFMVUVfQklUKSAhPSAwKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBnbG9iYWx2YWx1ZSBzeW1ib2xzIHdlcmUgZ2VuZXJhdGVkIGJlZm9yZS4gVGhpcyBjb2RlCi0gICAgICAgKiBwcmV2ZW50cyB1bnNpZ2h0bHkgcHNlY3QgYnVpbGR1cCwgYW5kIG1ha2VzIHN1cmUgdGhhdAotICAgICAgICogZml4dXAgcmVmZXJlbmNlcyBhcmUgZW1pdHRlZCBjb3JyZWN0bHkuCi0gICAgICAgKi8KLSAgICAgIHZzcC0+UHNlY3RfSW5kZXggPSAtMTsJLyogdG8gY2F0Y2ggZXJyb3JzICovCi0gICAgICBTX1NFVF9UWVBFICh2c3AtPlN5bWJvbCwgTl9VTkRGKTsJCS8qIG1ha2UgcmVmcyB3b3JrICovCi0gICAgICByZXR1cm4gMTsJCQkvKiBkZWNyZW1lbnQgcHNlY3QgY291bnRlciAqLwotICAgIH0KLQotICBpZiAoKFBzZWN0X0F0dHJpYnV0ZXMgJiBHTE9CQUxTWU1CT0xfQklUKSAhPSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHZzcC0+U3ltYm9sKSkKLQl7Ci0JY2FzZSBOX1VOREYgfCBOX0VYVDoKLQkgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKE5hbWUsIHZzcC0+UHNlY3RfSW5kZXgsCi0JCQkJICB2c3AtPlBzZWN0X09mZnNldCwgR0JMU1lNX1JFRik7Ci0JICB2c3AtPlBzZWN0X0luZGV4ID0gLTE7Ci0JICBTX1NFVF9UWVBFICh2c3AtPlN5bWJvbCwgTl9VTkRGKTsKLQkgIHJldHVybiAxOwkJLyogcmV0dXJuIGFuZCBpbmRpY2F0ZSBubyBwc2VjdCAqLwotCWNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0JICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChOYW1lLCB2c3AtPlBzZWN0X0luZGV4LAotCQkJCSAgdnNwLT5Qc2VjdF9PZmZzZXQsIEdCTFNZTV9ERUYpOwotCSAgLyogSW4gdGhpcyBjYXNlIHdlIHN0aWxsIGdlbmVyYXRlIHRoZSBwc2VjdCAqLwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFzX2ZhdGFsIChfKCJHbG9iYWxzeW1ib2wgYXR0cmlidXRlIGZvciBzeW1ib2wgJXMgd2FzIHVuZXhwZWN0ZWQuIiksCi0JCSAgICBOYW1lKTsKLQkgIGJyZWFrOwotCX0JCQkvKiBzd2l0Y2ggKi8KLSAgICB9Ci0KLSAgUHNlY3RfQXR0cmlidXRlcyAmPSAweGZmZmY7CS8qIGNsZWFyIG91dCB0aGUgZ2xvYmFscmVmL2RlZiBzdHVmZiAqLwotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhIEdTRCByZWNvcmQKLSAgICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0dTRCk7Ci0gIC8qCi0gICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIEdTRCByZWNvcmQgdHlwZQotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfR1NEKTsKLSAgLyoKLSAgICoJV2UgYXJlIHdyaXRpbmcgYSBQU0VDVCBkZWZpbml0aW9uIHN1YnJlY29yZAotICAgKi8KLSAgUFVUX0NIQVIgKEdTRF9TX0NfUFNDKTsKLSAgLyoKLSAgICoJUHNlY3RzIGFyZSBhbHdheXMgTE9OR1dPUkQgYWxpZ25lZAotICAgKi8KLSAgUFVUX0NIQVIgKDIpOwotICAvKgotICAgKglTcGVjaWZ5IHRoZSBwc2VjdCBhdHRyaWJ1dGVzCi0gICAqLwotICBQVVRfU0hPUlQgKFBzZWN0X0F0dHJpYnV0ZXMpOwotICAvKgotICAgKglTcGVjaWZ5IHRoZSBhbGxvY2F0aW9uCi0gICAqLwotICBQVVRfTE9ORyAoU2l6ZSk7Ci0gIC8qCi0gICAqCUZpbmFsbHksIHRoZSBwc2VjdCBuYW1lCi0gICAqLwotICBWTVNfQ2FzZV9IYWNrX1N5bWJvbCAoTmFtZSwgTG9jYWwpOwotICBQVVRfQ09VTlRFRF9TVFJJTkcgKExvY2FsKTsKLSAgLyoKLSAgICoJRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci0gIHJldHVybiAwOwotfQotDAotCi0vKiBHaXZlbiB0aGUgcG9pbnRlciB0byBhIHN5bWJvbCB3ZSBjYWxjdWxhdGUgaG93IGJpZyB0aGUgZGF0YSBhdCB0aGUKLSAgIHN5bWJvbCBpcy4gIFdlIGRvIHRoaXMgYnkgbG9va2luZyBmb3IgdGhlIG5leHQgc3ltYm9sIChsb2NhbCBvciBnbG9iYWwpCi0gICB3aGljaCB3aWxsIGluZGljYXRlIHRoZSBzdGFydCBvZiBhbm90aGVyIGRhdHVtLiAgKi8KLQotc3RhdGljIG9mZnNldFQKLVZNU19Jbml0aWFsaXplZF9EYXRhX1NpemUgKHMwUCwgRW5kX09mX0RhdGEpCi0gICAgIHJlZ2lzdGVyIHN5bWJvbFMgKnMwUDsKLSAgICAgdW5zaWduZWQgRW5kX09mX0RhdGE7Ci17Ci0gIHN5bWJvbFMgKnMxUDsKLSAgdmFsdWVUIHMwUF92YWwgPSBTX0dFVF9WQUxVRSAoczBQKSwgczFQX3ZhbCwKLQkgbmVhcmVzdF92YWwgPSAodmFsdWVUKSBFbmRfT2ZfRGF0YTsKLQotICAvKiBGaW5kIHRoZSBuZWFyZXN0IHN5bWJvbCB3aGF0IGZvbGxvd3MgdGhpcyBvbmUuICAqLwotICBmb3IgKHMxUCA9IHN5bWJvbF9yb290UDsgczFQOyBzMVAgPSBzeW1ib2xfbmV4dCAoczFQKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgZGF0YSB0eXBlIG11c3QgbWF0Y2guICAqLwotICAgICAgaWYgKFNfR0VUX1RZUEUgKHMxUCkgIT0gTl9EQVRBKQotCWNvbnRpbnVlOwotICAgICAgczFQX3ZhbCA9IFNfR0VUX1ZBTFVFIChzMVApOwotICAgICAgaWYgKHMxUF92YWwgPiBzMFBfdmFsICYmIHMxUF92YWwgPCBuZWFyZXN0X3ZhbCkKLQluZWFyZXN0X3ZhbCA9IHMxUF92YWw7Ci0gICAgfQotICAvKiBDYWxjdWxhdGUgaXRzIHNpemUuICAqLwotICByZXR1cm4gKG9mZnNldFQpIChuZWFyZXN0X3ZhbCAtIHMwUF92YWwpOwotfQotCi0KLS8qIENoZWNrIHN5bWJvbCBuYW1lcyBmb3IgdGhlIFBzZWN0IGhhY2sgd2l0aCBhIGdsb2JhbHZhbHVlLCBhbmQgdGhlbgotICAgZ2VuZXJhdGUgZ2xvYmFsdmFsdWVzIGZvciB0aG9zZSB0aGF0IGhhdmUgaXQuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX0VtaXRfR2xvYmFsdmFsdWVzICh0ZXh0X3NpeiwgZGF0YV9zaXosIERhdGFfU2VnbWVudCkKLSAgICAgdW5zaWduZWQgdGV4dF9zaXo7Ci0gICAgIHVuc2lnbmVkIGRhdGFfc2l6OwotICAgICBjaGFyICpEYXRhX1NlZ21lbnQ7Ci17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnNwOwotICBjaGFyICpzdHJpcHBlZF9uYW1lLCAqTmFtZTsKLSAgaW50IFNpemU7Ci0gIGludCBQc2VjdF9BdHRyaWJ1dGVzOwotICBpbnQgZ2xvYmFsdmFsdWU7Ci0gIGludCB0eXAsIGFic3R5cDsKLQotICAvKgotICAgKiBTY2FuIHRoZSBzeW1ib2wgdGFibGUgZm9yIGdsb2JhbHZhbHVlcywgYW5kIGVtaXQgZGVmL3JlZiB3aGVuCi0gICAqIHJlcXVpcmVkLiAgVGhlc2Ugd2lsbCBiZSBjYXVnaHQgYWdhaW4gbGF0ZXIgYW5kIGNvbnZlcnRlZCB0bwotICAgKiBOX1VOREYKLSAgICovCi0gIGZvciAoc3AgPSBzeW1ib2xfcm9vdFA7IHNwOyBzcCA9IHNwLT5zeV9uZXh0KQotICAgIHsKLSAgICAgIHR5cCA9IFNfR0VUX1JBV19UWVBFIChzcCk7Ci0gICAgICBhYnN0eXAgPSAoKHR5cCAmIH5OX0VYVCkgPT0gTl9BQlMpOwotICAgICAgLyoKLSAgICAgICAqCVNlZSBpZiB0aGlzIGlzIHNvbWV0aGluZyB3ZSB3YW50IHRvIGxvb2sgYXQuCi0gICAgICAgKi8KLSAgICAgIGlmICghYWJzdHlwICYmCi0JICB0eXAgIT0gKE5fREFUQSB8IE5fRVhUKSAmJgotCSAgdHlwICE9IChOX1VOREYgfCBOX0VYVCkpCi0JY29udGludWU7Ci0gICAgICAvKgotICAgICAgICoJU2VlIGlmIHRoaXMgaGFzIGdsb2JhbHZhbHVlIHNwZWNpZmljYXRpb24uCi0gICAgICAgKi8KLSAgICAgIE5hbWUgPSBTX0dFVF9OQU1FIChzcCk7Ci0KLSAgICAgIGlmIChhYnN0eXApCi0JewotCSAgc3RyaXBwZWRfbmFtZSA9IDA7Ci0JICBQc2VjdF9BdHRyaWJ1dGVzID0gR0xPQkFMVkFMVUVfQklUOwotCX0KLSAgICAgIGVsc2UgaWYgKEhBU19QU0VDVF9BVFRSSUJVVEVTIChOYW1lKSkKLQl7Ci0JICBzdHJpcHBlZF9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChOYW1lKSArIDEpOwotCSAgc3RyY3B5IChzdHJpcHBlZF9uYW1lLCBOYW1lKTsKLQkgIFBzZWN0X0F0dHJpYnV0ZXMgPSAwOwotCSAgVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzIChzdHJpcHBlZF9uYW1lLCAmUHNlY3RfQXR0cmlidXRlcyk7Ci0JfQotICAgICAgZWxzZQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKFBzZWN0X0F0dHJpYnV0ZXMgJiBHTE9CQUxWQUxVRV9CSVQpICE9IDApCi0JewotCSAgc3dpdGNoICh0eXApCi0JICAgIHsKLQkgICAgY2FzZSBOX0FCUzoKLQkgICAgICAvKiBMb2NhbCBzeW1ib2wgcmVmZXJlbmNlcyB3aWxsIHdhbnQKLQkJIHRvIGhhdmUgYW4gZW52aXJvbm1lbnQgZGVmaW5lZC4gICovCi0JICAgICAgaWYgKEN1cnJlbnRfRW52aXJvbm1lbnQgPCAwKQotCQlWTVNfTG9jYWxfRW52aXJvbm1lbnRfU2V0dXAgKCIuTl9BQlMiKTsKLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChOYW1lLCAwLAotCQkJCSAgICAgIFNfR0VUX1ZBTFVFIChzcCksCi0JCQkJICAgICAgR0JMU1lNX0RFRnxHQkxTWU1fVkFMfEdCTFNZTV9MQ0wpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoTmFtZSwgMCwKLQkJCQkgICAgICBTX0dFVF9WQUxVRSAoc3ApLAotCQkJCSAgICAgIEdCTFNZTV9ERUZ8R0JMU1lNX1ZBTCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9VTkRGIHwgTl9FWFQ6Ci0JICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoc3RyaXBwZWRfbmFtZSwgMCwgMCwgR0JMU1lNX1ZBTCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0JICAgICAgU2l6ZSA9IFZNU19Jbml0aWFsaXplZF9EYXRhX1NpemUgKHNwLCB0ZXh0X3NpeiArIGRhdGFfc2l6KTsKLQkgICAgICBpZiAoU2l6ZSA+IDQpCi0JCWVycm9yIChfKCJJbnZhbGlkIGRhdGEgdHlwZSBmb3IgZ2xvYmFsdmFsdWUiKSk7Ci0JICAgICAgZ2xvYmFsdmFsdWUgPSBtZF9jaGFyc190b19udW1iZXIgKERhdGFfU2VnbWVudCArIAotCQkgICAgIFNfR0VUX1ZBTFVFIChzcCkgLSB0ZXh0X3NpeiAsIFNpemUpOwotCSAgICAgIC8qIFRocmVlIHRpbWVzIGZvciBnb29kIGx1Y2suICBUaGUgbGlua2VyIHNlZW1zIHRvIGdldCBjb25mdXNlZAotCSAgICAgICAgIGlmIHRoZXJlIGFyZSBmZXdlciB0aGFuIHRocmVlICovCi0JICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoc3RyaXBwZWRfbmFtZSwgMCwgMCwgR0JMU1lNX1ZBTCk7Ci0JICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoc3RyaXBwZWRfbmFtZSwgMCwgZ2xvYmFsdmFsdWUsCi0JCQkJICAgICAgR0JMU1lNX0RFRnxHQkxTWU1fVkFMKTsKLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChzdHJpcHBlZF9uYW1lLCAwLCBnbG9iYWx2YWx1ZSwKLQkJCQkgICAgICBHQkxTWU1fREVGfEdCTFNZTV9WQUwpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX3dhcm4gKF8oIkludmFsaWQgZ2xvYmFsdmFsdWUgb2YgJXMiKSwgc3RyaXBwZWRfbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0JCQkvKiBzd2l0Y2ggKi8KLQl9CQkJLyogaWYgKi8KLSAgICAgIGlmIChzdHJpcHBlZF9uYW1lKSBmcmVlIChzdHJpcHBlZF9uYW1lKTsJLyogY2xlYW4gdXAgKi8KLSAgICB9CQkJCS8qIGZvciAqLwotCi19Ci0MCi0KLS8qCi0gKglEZWZpbmUgYSBwcm9jZWR1cmUgZW50cnkgcHQvbWFzawotICovCi1zdGF0aWMgdm9pZAotVk1TX1Byb2NlZHVyZV9FbnRyeV9QdCAoTmFtZSwgUHNlY3RfTnVtYmVyLCBQc2VjdF9PZmZzZXQsIEVudHJ5X01hc2spCi0gICAgIGNoYXIgKk5hbWU7Ci0gICAgIGludCBQc2VjdF9OdW1iZXI7Ci0gICAgIGludCBQc2VjdF9PZmZzZXQ7Ci0gICAgIGludCBFbnRyeV9NYXNrOwotewotICBjaGFyIExvY2FsWzMyXTsKLQotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhIEdTRCByZWNvcmQKLSAgICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0dTRCk7Ci0gIC8qCi0gICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIEdTRCByZWNvcmQgdHlwZQotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfR1NEKTsKLSAgLyoKLSAgICoJV2UgYXJlIHdyaXRpbmcgYSBQcm9jZWR1cmUgRW50cnkgUHQvTWFzayBzdWJyZWNvcmQKLSAgICovCi0gIFBVVF9DSEFSICgoKHVuc2lnbmVkKSBQc2VjdF9OdW1iZXIgPD0gMjU1KSA/IEdTRF9TX0NfRVBNIDogR1NEX1NfQ19FUE1XKTsKLSAgLyoKLSAgICoJRGF0YSB0eXBlIGlzIHVuZGVmaW5lZAotICAgKi8KLSAgUFVUX0NIQVIgKDApOwotICAvKgotICAgKglGbGFncyA9ICJSRUxPQ0FUQUJMRSIgYW5kICJERUZJTkVEIgotICAgKi8KLSAgUFVUX1NIT1JUIChHU1lfU19NX0RFRiB8IEdTWV9TX01fUkVMKTsKLSAgLyoKLSAgICoJUHNlY3QgTnVtYmVyCi0gICAqLwotICBpZiAoKHVuc2lnbmVkKSBQc2VjdF9OdW1iZXIgPD0gMjU1KQotICAgIFBVVF9DSEFSIChQc2VjdF9OdW1iZXIpOwotICBlbHNlCi0gICAgUFVUX1NIT1JUIChQc2VjdF9OdW1iZXIpOwotICAvKgotICAgKglPZmZzZXQKLSAgICovCi0gIFBVVF9MT05HIChQc2VjdF9PZmZzZXQpOwotICAvKgotICAgKglFbnRyeSBtYXNrCi0gICAqLwotICBQVVRfU0hPUlQgKEVudHJ5X01hc2spOwotICAvKgotICAgKglGaW5hbGx5LCB0aGUgZ2xvYmFsIHN5bWJvbCBuYW1lCi0gICAqLwotICBWTVNfQ2FzZV9IYWNrX1N5bWJvbCAoTmFtZSwgTG9jYWwpOwotICBQVVRfQ09VTlRFRF9TVFJJTkcgKExvY2FsKTsKLSAgLyoKLSAgICoJRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0MCi0KLS8qCi0gKglTZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gY291bnRlciB0byBhIHBhcnRpY3VsYXIgUHNlY3QgYW5kIE9mZnNldAotICovCi1zdGF0aWMgdm9pZAotVk1TX1NldF9Qc2VjdCAoUHNlY3RfSW5kZXgsIE9mZnNldCwgUmVjb3JkX1R5cGUpCi0gICAgIGludCBQc2VjdF9JbmRleDsKLSAgICAgaW50IE9mZnNldDsKLSAgICAgaW50IFJlY29yZF9UeXBlOwotewotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhICJSZWNvcmRfVHlwZSIgcmVjb3JkCi0gICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHRoZSByZWNvcmQgdHlwZQotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKFJlY29yZF9UeXBlKTsKLSAgLyoKLSAgICoJU3RhY2sgdGhlIFBzZWN0IGJhc2UgKyBPZmZzZXQKLSAgICovCi0gIHZtc190aXJfc3RhY2tfcHNlY3QgKFBzZWN0X0luZGV4LCBPZmZzZXQsIDApOwotICAvKgotICAgKglTZXQgcmVsb2NhdGlvbiBiYXNlCi0gICAqLwotICBQVVRfQ0hBUiAoVElSX1NfQ19DVExfU0VUUkIpOwotICAvKgotICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQwKLQotLyoKLSAqCVN0b3JlIHJlcGVhdGVkIGltbWVkaWF0ZSBkYXRhIGluIGN1cnJlbnQgUHNlY3QKLSAqLwotc3RhdGljIHZvaWQKLVZNU19TdG9yZV9SZXBlYXRlZF9EYXRhIChSZXBlYXRfQ291bnQsIFBvaW50ZXIsIFNpemUsIFJlY29yZF9UeXBlKQotICAgICBpbnQgUmVwZWF0X0NvdW50OwotICAgICByZWdpc3RlciBjaGFyICpQb2ludGVyOwotICAgICBpbnQgU2l6ZTsKLSAgICAgaW50IFJlY29yZF9UeXBlOwotewotCi0gIC8qCi0gICAqCUlnbm9yZSB6ZXJvIGJ5dGVzL3dvcmRzL2xvbmd3b3JkcwotICAgKi8KLSAgc3dpdGNoIChTaXplKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAoUG9pbnRlclszXSAhPSAwIHx8IFBvaW50ZXJbMl0gIT0gMCkgYnJlYWs7Ci0gICAgICAvKiBlbHNlIEZBTExUSFJVICovCi0gICAgY2FzZSAyOgotICAgICAgaWYgKFBvaW50ZXJbMV0gIT0gMCkgYnJlYWs7Ci0gICAgICAvKiBlbHNlIEZBTExUSFJVICovCi0gICAgY2FzZSAxOgotICAgICAgaWYgKFBvaW50ZXJbMF0gIT0gMCkgYnJlYWs7Ci0gICAgICAvKiB6ZXJvIHZhbHVlICovCi0gICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgLyoKLSAgICoJSWYgdGhlIGRhdGEgaXMgdG9vIGJpZyBmb3IgYSBUSVJfU19DX1NUT19SSVZCIHN1Yi1yZWNvcmQKLSAgICoJdGhlbiB3ZSBkbyBpdCBtYW51YWxseQotICAgKi8KLSAgaWYgKFNpemUgPiAyNTUpCi0gICAgewotICAgICAgd2hpbGUgKC0tUmVwZWF0X0NvdW50ID49IDApCi0JVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChQb2ludGVyLCBTaXplLCBSZWNvcmRfVHlwZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhICJSZWNvcmRfVHlwZSIgcmVjb3JkCi0gICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglTdGFjayB0aGUgcmVwZWF0IGNvdW50Ci0gICAqLwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfTFcpOwotICBQVVRfTE9ORyAoUmVwZWF0X0NvdW50KTsKLSAgLyoKLSAgICoJQW5kIG5vdyB0aGUgY29tbWFuZCBhbmQgaXRzIGRhdGEKLSAgICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUT19SSVZCKTsKLSAgUFVUX0NIQVIgKFNpemUpOwotICB3aGlsZSAoLS1TaXplID49IDApCi0gICAgUFVUX0NIQVIgKCpQb2ludGVyKyspOwotICAvKgotICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQwKLQotLyoKLSAqCVN0b3JlIGEgUG9zaXRpb24gSW5kZXBlbmRlbnQgUmVmZXJlbmNlCi0gKi8KLXN0YXRpYyB2b2lkCi1WTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UgKFN5bWJvbCwgT2Zmc2V0LCBQQ19SZWxhdGl2ZSwKLQkJCQlQc2VjdCwgUHNlY3RfT2Zmc2V0LCBSZWNvcmRfVHlwZSkKLSAgICAgc3ltYm9sUyAqU3ltYm9sOwotICAgICBpbnQgT2Zmc2V0OwotICAgICBpbnQgUENfUmVsYXRpdmU7Ci0gICAgIGludCBQc2VjdDsKLSAgICAgaW50IFBzZWN0X09mZnNldDsKLSAgICAgaW50IFJlY29yZF9UeXBlOwotewotICByZWdpc3RlciBzdHJ1Y3QgVk1TX1N5bWJvbCAqdnNwID0gU3ltYm9sLT5zeV9vYmo7Ci0gIGNoYXIgTG9jYWxbMzJdOwotICBpbnQgbG9jYWxfc3ltID0gMDsKLQotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhICJSZWNvcmRfVHlwZSIgcmVjb3JkCi0gICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglTZXQgdG8gdGhlIGFwcHJvcHJpYXRlIG9mZnNldCBpbiB0aGUgUHNlY3QuCi0gICAqCUZvciBhIENvZGUgcmVmZXJlbmNlIHdlIG5lZWQgdG8gZml4IHRoZSBvcGVyYW5kCi0gICAqCXNwZWNpZmllciBhcyB3ZWxsLCBzbyBiYWNrIHVwIDEgYnl0ZTsKLSAgICoJZm9yIGEgRGF0YSByZWZlcmVuY2Ugd2UganVzdCBzdG9yZSBIRVJFLgotICAgKi8KLSAgVk1TX1NldF9Qc2VjdCAoUHNlY3QsCi0JCSBQQ19SZWxhdGl2ZSA/IFBzZWN0X09mZnNldCAtIDEgOiBQc2VjdF9PZmZzZXQsCi0JCSBSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCU1ha2Ugc3VyZSB3ZSBhcmUgc3RpbGwgZ2VuZXJhdGluZyBhICJSZWNvcmQgVHlwZSIgcmVjb3JkCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglEaXNwYXRjaCBvbiBzeW1ib2wgdHlwZSAoc28gd2UgY2FuIHN0YWNrIGl0cyB2YWx1ZSkKLSAgICovCi0gIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKFN5bWJvbCkpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCUdsb2JhbCBzeW1ib2wKLSAgICAgICAqLwotICAgIGNhc2UgTl9BQlM6Ci0gICAgICBsb2NhbF9zeW0gPSAxOwotICAgICAgLypGQUxMVEhSVSovCi0gICAgY2FzZSBOX0FCUyB8IE5fRVhUOgotI2lmZGVmCU5PVF9WQVhfMTFfQ19DT01QQVRJQkxFCi0gICAgY2FzZSBOX1VOREYgfCBOX0VYVDoKLSAgICBjYXNlIE5fREFUQSB8IE5fRVhUOgotI2VuZGlmCS8qIE5PVF9WQVhfMTFfQ19DT01QQVRJQkxFICovCi0gICAgY2FzZSBOX1VOREY6Ci0gICAgY2FzZSBOX1RFWFQgfCBOX0VYVDoKLSAgICAgIC8qCi0gICAgICAgKglHZXQgdGhlIHN5bWJvbCBuYW1lIChjYXNlIGhhY2tlZCkKLSAgICAgICAqLwotICAgICAgVk1TX0Nhc2VfSGFja19TeW1ib2wgKFNfR0VUX05BTUUgKFN5bWJvbCksIExvY2FsKTsKLSAgICAgIC8qCi0gICAgICAgKglTdGFjayB0aGUgZ2xvYmFsIHN5bWJvbCB2YWx1ZQotICAgICAgICovCi0gICAgICBpZiAoIWxvY2FsX3N5bSkKLQl7Ci0JICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfR0JMKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTG9jYWwgc3ltYm9scyBoYXZlIGFuIGV4dHJhIGZpZWxkLiAgKi8KLQkgIFBVVF9DSEFSIChUSVJfU19DX1NUQV9MU1kpOwotCSAgUFVUX1NIT1JUIChDdXJyZW50X0Vudmlyb25tZW50KTsKLQl9Ci0gICAgICBQVVRfQ09VTlRFRF9TVFJJTkcgKExvY2FsKTsKLSAgICAgIGlmIChPZmZzZXQpCi0JewotCSAgLyoKLQkgICAqCVN0YWNrIHRoZSBsb25nd29yZCBvZmZzZXQKLQkgICAqLwotCSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX0xXKTsKLQkgIFBVVF9MT05HIChPZmZzZXQpOwotCSAgLyoKLQkgICAqCUFkZCB0aGUgdHdvLCBsZWF2aW5nIHRoZSByZXN1bHQgb24gdGhlIHN0YWNrCi0JICAgKi8KLQkgIFBVVF9DSEFSIChUSVJfU19DX09QUl9BREQpOwotCX0KLSAgICAgIGJyZWFrOwotICAgICAgLyoKLSAgICAgICAqCVVuaW5pdGlhbGl6ZWQgbG9jYWwgZGF0YQotICAgICAgICovCi0gICAgY2FzZSBOX0JTUzoKLSAgICAgIC8qCi0gICAgICAgKglTdGFjayB0aGUgUHNlY3QgKCtvZmZzZXQpCi0gICAgICAgKi8KLSAgICAgIHZtc190aXJfc3RhY2tfcHNlY3QgKHZzcC0+UHNlY3RfSW5kZXgsCi0JCQkgICB2c3AtPlBzZWN0X09mZnNldCArIE9mZnNldCwKLQkJCSAgIDApOwotICAgICAgYnJlYWs7Ci0gICAgICAvKgotICAgICAgICoJTG9jYWwgdGV4dAotICAgICAgICovCi0gICAgY2FzZSBOX1RFWFQ6Ci0gICAgICAvKgotICAgICAgICoJU3RhY2sgdGhlIFBzZWN0ICgrb2Zmc2V0KQotICAgICAgICovCi0gICAgICB2bXNfdGlyX3N0YWNrX3BzZWN0ICh2c3AtPlBzZWN0X0luZGV4LAotCQkJICAgU19HRVRfVkFMVUUgKFN5bWJvbCkgKyBPZmZzZXQsCi0JCQkgICAwKTsKLSAgICAgIGJyZWFrOwotICAgICAgLyoKLSAgICAgICAqCUluaXRpYWxpemVkIGxvY2FsIG9yIGdsb2JhbCBkYXRhCi0gICAgICAgKi8KLSAgICBjYXNlIE5fREFUQToKLSNpZm5kZWYJTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUKLSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgotICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0jZW5kaWYJLyogTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUgKi8KLSAgICAgIC8qCi0gICAgICAgKglTdGFjayB0aGUgUHNlY3QgKCtvZmZzZXQpCi0gICAgICAgKi8KLSAgICAgIHZtc190aXJfc3RhY2tfcHNlY3QgKHZzcC0+UHNlY3RfSW5kZXgsCi0JCQkgICB2c3AtPlBzZWN0X09mZnNldCArIE9mZnNldCwKLQkJCSAgIDApOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAvKgotICAgKglTdG9yZSBlaXRoZXIgYSBjb2RlIG9yIGRhdGEgcmVmZXJlbmNlCi0gICAqLwotICBQVVRfQ0hBUiAoUENfUmVsYXRpdmUgPyBUSVJfU19DX1NUT19QSUNSIDogVElSX1NfQ19TVE9fUElEUik7Ci0gIC8qCi0gICAqCUZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotDAotCi0vKgotICoJQ2hlY2sgaW4gdGhlIHRleHQgYXJlYSBmb3IgYW4gaW5kaXJlY3QgcGMtcmVsYXRpdmUgcmVmZXJlbmNlCi0gKglhbmQgZml4IGl0IHVwIHdpdGggYWRkcmVzc2luZyBtb2RlIDB4ZmYgW1BDIGluZGlyZWN0XQotICoKLSAqCVRISVMgU0hPVUxEIEJFIFJFUExBQ0VEIEJZIFRIRSBVU0UgT0YgVElSX1NfQ19TVE9fUElSUiBJTiBUSEUKLSAqCVBJQyBDT0RFIEdFTkVSQVRJTkcgRklYVVAgUk9VVElORS4KLSAqLwotc3RhdGljIHZvaWQKLVZNU19GaXhfSW5kaXJlY3RfUmVmZXJlbmNlIChUZXh0X1BzZWN0LCBPZmZzZXQsIGZyYWdQLCB0ZXh0X2ZyYWdfcm9vdCkKLSAgICAgaW50IFRleHRfUHNlY3Q7Ci0gICAgIGludCBPZmZzZXQ7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgZnJhZ1MgKnRleHRfZnJhZ19yb290OwotewotICAvKgotICAgKglUaGUgYWRkcmVzc2luZyBtb2RlIGJ5dGUgaXMgMSBieXRlIGJlZm9yZSB0aGUgYWRkcmVzcwotICAgKi8KLSAgT2Zmc2V0LS07Ci0gIC8qCi0gICAqCUlzIGl0IGluIFRISVMgZnJhZz8/Ci0gICAqLwotICBpZiAoKE9mZnNldCA8IGZyYWdQLT5mcl9hZGRyZXNzKSB8fAotICAgICAgKE9mZnNldCA+PSAoZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4KSkpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCVdlIG5lZWQgdG8gc2VhcmNoIGZvciB0aGUgZnJhZ21lbnQgY29udGFpbmluZyB0aGlzCi0gICAgICAgKglPZmZzZXQKLSAgICAgICAqLwotICAgICAgZm9yIChmcmFnUCA9IHRleHRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLQl7Ci0JICBpZiAoKE9mZnNldCA+PSBmcmFnUC0+ZnJfYWRkcmVzcykgJiYKLQkgICAgICAoT2Zmc2V0IDwgKGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCkpKQotCSAgICBicmVhazsKLQl9Ci0gICAgICAvKgotICAgICAgICoJSWYgd2UgY291bGRuJ3QgZmluZCB0aGUgZnJhZywgdGhpbmdzIGFyZSBCQUQhIQotICAgICAgICovCi0gICAgICBpZiAoZnJhZ1AgPT0gMCkKLQllcnJvciAoXygiQ291bGRuJ3QgZmluZCBmaXh1cCBmcmFnbWVudCB3aGVuIGNoZWNraW5nIGZvciBpbmRpcmVjdCByZWZlcmVuY2UiKSk7Ci0gICAgfQotICAvKgotICAgKglDaGVjayBmb3IgaW5kaXJlY3QgUEMgcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlCi0gICAqLwotICBpZiAoZnJhZ1AtPmZyX2xpdGVyYWxbT2Zmc2V0IC0gZnJhZ1AtPmZyX2FkZHJlc3NdID09IChjaGFyKSAweGZmKQotICAgIHsKLSAgICAgIHN0YXRpYyBjaGFyIEFkZHJlc3NfTW9kZSA9IChjaGFyKSAweGZmOwotCi0gICAgICAvKgotICAgICAgICoJWWVzOiBTdG9yZSB0aGUgaW5kaXJlY3QgbW9kZSBiYWNrIGludG8gdGhlIGltYWdlCi0gICAgICAgKgkgICAgIHRvIGZpeCB1cCB0aGUgZGFtYWdlIGRvbmUgYnkgU1RPX1BJQ1IKLSAgICAgICAqLwotICAgICAgVk1TX1NldF9Qc2VjdCAoVGV4dF9Qc2VjdCwgT2Zmc2V0LCBPQkpfU19DX1RJUik7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKCZBZGRyZXNzX01vZGUsIDEsIE9CSl9TX0NfVElSKTsKLSAgICB9Ci19Ci0MCi0KLS8qCi0gKglJZiB0aGUgcHJvY2VkdXJlICJtYWluKCkiIGV4aXN0cyB3ZSBoYXZlIHRvIGFkZCB0aGUgaW5zdHJ1Y3Rpb24KLSAqCSJqc2IgYyRtYWluX2FyZ3MiIGF0IHRoZSBiZWdpbm5pbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFZBWC0xMSAiQyIuCi0gKgotICoJRklYTUU6ICB0aGUgbWFjcm8gbmFtZSBgSEFDS19ERUNfQ19TVEFSVFVQJyBzaG91bGQgYmUgcmVuYW1lZAotICoJCXRvIGBIQUNLX1ZBWENSVExfU1RBUlRVUCcgYmVjYXVzZSBEaWdpdGFsJ3MgY29tcGlsZXIKLSAqCQluYW1lZCAiREVDIEMiIHVzZXMgcnVuLXRpbWUgbGlicmFyeSAiREVDQyRTSFIiLCBidXQgdGhpcwotICoJCXN0YXJ0dXAgY29kZSBpcyBmb3IgIlZBWENSVEwiLCB0aGUgbGlicmFyeSBmb3IgRGlnaXRhbCdzCi0gKgkJb2xkZXIgIlZBWCBDIi4gIEFsc28sIHRoaXMgZXh0cmEgY29kZSBpc24ndCBuZWVkZWQgZm9yCi0gKgkJc3VwcG9ydGluZyBnY2MgYmVjYXVzZSBpdCBhbHJlYWR5IGdlbmVyYXRlcyB0aGUgVkFYQ1JUTAotICoJCXN0YXJ0dXAgY2FsbCB3aGVuIGNvbXBpbGluZyBtYWluKCkuICBUaGUgcmVmZXJlbmNlIHRvCi0gKgkJYGZsYWdfaGFzaF9sb25nX25hbWVzJyBsb29rcyB2ZXJ5IHN1c3BpY2lvdXMgdG9vOwotICoJCXByb2JhYmx5IGFuIG9sZC1zdHlsZSBjb21tYW5kIGxpbmUgb3B0aW9uIHdhcyBpbmFkdmVydGVudGx5Ci0gKgkJb3ZlcmxvYWRlZCBoZXJlLCB0aGVuIGJsaW5kbHkgY29udmVydGVkIGludG8gdGhlIG5ldyBvbmUuCi0gKi8KLXZvaWQKLXZtc19jaGVja19mb3JfbWFpbiAoKQotewotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotI2lmZGVmCUhBQ0tfREVDX0NfU1RBUlRVUAkvKiBKRiAqLwotICByZWdpc3RlciBzdHJ1Y3QgZnJjaGFpbiAqZnJjaGFpblA7Ci0gIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgcmVnaXN0ZXIgZnJhZ1MgKipwcmV2X2ZyYWdQUDsKLSAgcmVnaXN0ZXIgc3RydWN0IGZpeCAqZml4UDsKLSAgcmVnaXN0ZXIgZnJhZ1MgKk5ld19GcmFnOwotICBpbnQgaTsKLSNlbmRpZgkvKiBIQUNLX0RFQ19DX1NUQVJUVVAgKi8KLQotICBzeW1ib2xQID0gKHN5bWJvbFMgKikgc3ltYm9sX2ZpbmQgKCJfbWFpbiIpOwotICBpZiAoc3ltYm9sUCAmJiAhU19JU19ERUJVRyAoc3ltYm9sUCkgJiYKLSAgICAgIFNfSVNfRVhURVJOQUwgKHN5bWJvbFApICYmIChTX0dFVF9UWVBFIChzeW1ib2xQKSA9PSBOX1RFWFQpKQotICAgIHsKLSNpZmRlZglIQUNLX0RFQ19DX1NUQVJUVVAKLSAgICAgIGlmICghZmxhZ19oYXNoX2xvbmdfbmFtZXMpCi0JewotI2VuZGlmCi0JICAvKgotCSAgICoJUmVtZW1iZXIgdGhlIGVudHJ5IHBvaW50IHN5bWJvbAotCSAgICovCi0JICBFbnRyeV9Qb2ludF9TeW1ib2wgPSBzeW1ib2xQOwotI2lmZGVmIEhBQ0tfREVDX0NfU1RBUlRVUAotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKgotCSAgICoJU2NhbiBhbGwgdGhlIGZyYWdtZW50IGNoYWlucyBmb3IgdGhlIG9uZSB3aXRoICJfbWFpbiIKLQkgICAqCShBY3R1YWxseSB3ZSBrbm93IHRoZSBmcmFnbWVudCBmcm9tIHRoZSBzeW1ib2wsIGJ1dCB3ZSBuZWVkCi0JICAgKgkgdGhlIHByZXZpb3VzIGZyYWdtZW50IHNvIHdlIGNhbiBjaGFuZ2UgaXRzIHBvaW50ZXIpCi0JICAgKi8KLQkgIGZyY2hhaW5QID0gZnJjaGFpbl9yb290OwotCSAgd2hpbGUgKGZyY2hhaW5QKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKglTY2FuIGFsbCB0aGUgZnJhZ21lbnRzIGluIHRoaXMgY2hhaW4sIHJlbWVtYmVyaW5nCi0JICAgICAgICoJdGhlICJwcmV2aW91cyBmcmFnbWVudCIKLQkgICAgICAgKi8KLQkgICAgICBwcmV2X2ZyYWdQUCA9ICZmcmNoYWluUC0+ZnJjaF9yb290OwotCSAgICAgIGZyYWdQID0gZnJjaGFpblAtPmZyY2hfcm9vdDsKLQkgICAgICB3aGlsZSAoZnJhZ1AgJiYgKGZyYWdQICE9IGZyY2hhaW5QLT5mcmNoX2xhc3QpKQotCQl7Ci0JCSAgLyoKLQkJICAgKglJcyB0aGlzIHRoZSBmcmFnbWVudD8KLQkJICAgKi8KLQkJICBpZiAoZnJhZ1AgPT0gc3ltYm9sUC0+c3lfZnJhZykKLQkJICAgIHsKLQkJICAgICAgLyoKLQkJICAgICAgICoJWWVzOiBNb2RpZnkgdGhlIGZyYWdtZW50IGJ5IHJlcGxhY2luZwotCQkgICAgICAgKgkgICAgIGl0IHdpdGggYSBuZXcgZnJhZ21lbnQuCi0JCSAgICAgICAqLwotCQkgICAgICBOZXdfRnJhZyA9IChmcmFnUyAqKQotCQkJeG1hbGxvYyAoc2l6ZW9mICgqTmV3X0ZyYWcpICsKLQkJCQkgZnJhZ1AtPmZyX2ZpeCArCi0JCQkJIGZyYWdQLT5mcl92YXIgKwotCQkJCSA1KTsKLQkJICAgICAgLyoKLQkJICAgICAgICoJVGhlIGZyYWdtZW50cyBhcmUgdGhlIHNhbWUgZXhjZXB0Ci0JCSAgICAgICAqCXRoYXQgdGhlICJmaXhlZCIgYXJlYSBpcyBsYXJnZXIKLQkJICAgICAgICovCi0JCSAgICAgICpOZXdfRnJhZyA9ICpmcmFnUDsKLQkJICAgICAgTmV3X0ZyYWctPmZyX2ZpeCArPSA2OwotCQkgICAgICAvKgotCQkgICAgICAgKglDb3B5IHRoZSBsaXRlcmFsIGRhdGEgb3BlbmluZyBhIGhvbGUKLQkJICAgICAgICoJMiBieXRlcyBhZnRlciAiX21haW4iIChpLmUuIGp1c3QgYWZ0ZXIKLQkJICAgICAgICoJdGhlIGVudHJ5IG1hc2spLiAgSW50byB3aGljaCB3ZSBwbGFjZQotCQkgICAgICAgKgl0aGUgSlNCIGluc3RydWN0aW9uLgotCQkgICAgICAgKi8KLQkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbMF0gPSBmcmFnUC0+ZnJfbGl0ZXJhbFswXTsKLQkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbMV0gPSBmcmFnUC0+ZnJfbGl0ZXJhbFsxXTsKLQkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbMl0gPSAweDE2OwkvKiBKc2IgKi8KLQkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbM10gPSAweGVmOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFs0XSA9IDA7Ci0JCSAgICAgIE5ld19GcmFnLT5mcl9saXRlcmFsWzVdID0gMDsKLQkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbNl0gPSAwOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFs3XSA9IDA7Ci0JCSAgICAgIGZvciAoaSA9IDI7IGkgPCBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX3ZhcjsgaSsrKQotCQkJTmV3X0ZyYWctPmZyX2xpdGVyYWxbaSArIDZdID0KLQkJCSAgZnJhZ1AtPmZyX2xpdGVyYWxbaV07Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCU5vdyByZXBsYWNlIHRoZSBvbGQgZnJhZ21lbnQgd2l0aCB0aGUKLQkJICAgICAgICoJbmV3bHkgZ2VuZXJhdGVkIG9uZS4KLQkJICAgICAgICovCi0JCSAgICAgICpwcmV2X2ZyYWdQUCA9IE5ld19GcmFnOwotCQkgICAgICAvKgotCQkgICAgICAgKglSZW1lbWJlciB0aGUgZW50cnkgcG9pbnQgc3ltYm9sCi0JCSAgICAgICAqLwotCQkgICAgICBFbnRyeV9Qb2ludF9TeW1ib2wgPSBzeW1ib2xQOwotCQkgICAgICAvKgotCQkgICAgICAgKglTY2FuIHRoZSB0ZXh0IGFyZWEgZml4dXAgc3RydWN0dXJlcwotCQkgICAgICAgKglhcyBvZmZzZXRzIGluIHRoZSBmcmFnbWVudCBtYXkgaGF2ZQotCQkgICAgICAgKgljaGFuZ2VkCi0JCSAgICAgICAqLwotCQkgICAgICBmb3IgKGZpeFAgPSB0ZXh0X2ZpeF9yb290OyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLQkJCXsKLQkJCSAgLyoKLQkJCSAgICoJTG9vayBmb3IgcmVmZXJlbmNlcyB0byB0aGlzCi0JCQkgICAqCWZyYWdtZW50LgotCQkJICAgKi8KLQkJCSAgaWYgKGZpeFAtPmZ4X2ZyYWcgPT0gZnJhZ1ApCi0JCQkgICAgewotCQkJICAgICAgLyoKLQkJCSAgICAgICAqCUNoYW5nZSB0aGUgZnJhZ21lbnQKLQkJCSAgICAgICAqCXBvaW50ZXIKLQkJCSAgICAgICAqLwotCQkJICAgICAgZml4UC0+ZnhfZnJhZyA9IE5ld19GcmFnOwotCQkJICAgICAgLyoKLQkJCSAgICAgICAqCUlmIHRoZSBvZmZzZXQgaXMgYWZ0ZXIKLQkJCSAgICAgICAqCXRoZSBlbnRyeSBtYXNrIHdlIG5lZWQKLQkJCSAgICAgICAqCXRvIGFjY291bnQgZm9yIHRoZSBKU0IKLQkJCSAgICAgICAqCWluc3RydWN0aW9uIHdlIGp1c3QKLQkJCSAgICAgICAqCWluc2VydGVkLgotCQkJICAgICAgICovCi0JCQkgICAgICBpZiAoZml4UC0+Znhfd2hlcmUgPj0gMikKLQkJCQlmaXhQLT5meF93aGVyZSArPSA2OwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgLyoKLQkJICAgICAgICoJU2NhbiB0aGUgc3ltYm9scyBhcyBvZmZzZXRzIGluIHRoZQotCQkgICAgICAgKglmcmFnbWVudCBtYXkgaGF2ZSBjaGFuZ2VkCi0JCSAgICAgICAqLwotCQkgICAgICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7Ci0JCQkgICBzeW1ib2xQOwotCQkJICAgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLQkJCXsKLQkJCSAgLyoKLQkJCSAgICoJTG9vayBmb3IgcmVmZXJlbmNlcyB0byB0aGlzCi0JCQkgICAqCWZyYWdtZW50LgotCQkJICAgKi8KLQkJCSAgaWYgKHN5bWJvbFAtPnN5X2ZyYWcgPT0gZnJhZ1ApCi0JCQkgICAgewotCQkJICAgICAgLyoKLQkJCSAgICAgICAqCUNoYW5nZSB0aGUgZnJhZ21lbnQKLQkJCSAgICAgICAqCXBvaW50ZXIKLQkJCSAgICAgICAqLwotCQkJICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IE5ld19GcmFnOwotCQkJICAgICAgLyoKLQkJCSAgICAgICAqCUlmIHRoZSBvZmZzZXQgaXMgYWZ0ZXIKLQkJCSAgICAgICAqCXRoZSBlbnRyeSBtYXNrIHdlIG5lZWQKLQkJCSAgICAgICAqCXRvIGFjY291bnQgZm9yIHRoZSBKU0IKLQkJCSAgICAgICAqCWluc3RydWN0aW9uIHdlIGp1c3QKLQkJCSAgICAgICAqCWluc2VydGVkLgotCQkJICAgICAgICovCi0JCQkgICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApID49IDIpCi0JCQkJU19TRVRfVkFMVUUgKHN5bWJvbFAsCi0JCQkJCSAgICAgU19HRVRfVkFMVUUgKHN5bWJvbFApICsgNik7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICAvKgotCQkgICAgICAgKglNYWtlIGEgc3ltYm9sIHJlZmVyZW5jZSB0bwotCQkgICAgICAgKgkiX2MkbWFpbl9hcmdzIiBzbyB3ZSBjYW4gZ2V0Ci0JCSAgICAgICAqCWl0cyBhZGRyZXNzIGluc2VydGVkIGludG8gdGhlCi0JCSAgICAgICAqCUpTQiBpbnN0cnVjdGlvbi4KLQkJICAgICAgICovCi0JCSAgICAgIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSB4bWFsbG9jIChzaXplb2YgKCpzeW1ib2xQKSk7Ci0JCSAgICAgIFNfU0VUX05BTUUgKHN5bWJvbFAsICJfQyRNQUlOX0FSR1MiKTsKLQkJICAgICAgU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9VTkRGKTsKLQkJICAgICAgU19TRVRfT1RIRVIgKHN5bWJvbFAsIDApOwotCQkgICAgICBTX1NFVF9ERVNDIChzeW1ib2xQLCAwKTsKLQkJICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsIDApOwotCQkgICAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IDA7Ci0JCSAgICAgIHN5bWJvbFAtPnN5X251bWJlciA9IDA7Ci0JCSAgICAgIHN5bWJvbFAtPnN5X29iaiA9IDA7Ci0JCSAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSBOZXdfRnJhZzsKLQkJICAgICAgc3ltYm9sUC0+c3lfcmVzb2x2ZWQgPSAwOwotCQkgICAgICBzeW1ib2xQLT5zeV9yZXNvbHZpbmcgPSAwOwotCQkgICAgICAvKiB0aGlzIGFjdHVhbGx5IGluc2VydHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCAqLwotCQkgICAgICBzeW1ib2xfYXBwZW5kIChzeW1ib2xfcm9vdFAsIHN5bWJvbFAsCi0JCQkJICAgICAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQotCQkgICAgICBzeW1ib2xfcm9vdFAgPSBzeW1ib2xQOwotCQkgICAgICAvKgotCQkgICAgICAgKglHZW5lcmF0ZSBhIHRleHQgZml4dXAgc3RydWN0dXJlCi0JCSAgICAgICAqCXRvIGdldCAiX2MkbWFpbl9hcmdzIiBzdG9yZWQgaW50byB0aGUKLQkJICAgICAgICoJSlNCIGluc3RydWN0aW9uLgotCQkgICAgICAgKi8KLQkJICAgICAgZml4UCA9IChzdHJ1Y3QgZml4ICopIHhtYWxsb2MgKHNpemVvZiAoKmZpeFApKTsKLQkJICAgICAgZml4UC0+ZnhfZnJhZyA9IE5ld19GcmFnOwotCQkgICAgICBmaXhQLT5meF93aGVyZSA9IDQ7Ci0JCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gc3ltYm9sUDsKLQkJICAgICAgZml4UC0+Znhfc3Vic3kgPSAwOwotCQkgICAgICBmaXhQLT5meF9vZmZzZXQgPSAwOwotCQkgICAgICBmaXhQLT5meF9zaXplID0gNDsKLQkJICAgICAgZml4UC0+ZnhfcGNyZWwgPSAxOwotCQkgICAgICBmaXhQLT5meF9uZXh0ID0gdGV4dF9maXhfcm9vdDsKLQkJICAgICAgdGV4dF9maXhfcm9vdCA9IGZpeFA7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCU5vdyBtYWtlIHN1cmUgd2UgZXhpdCBmcm9tIHRoZSBsb29wCi0JCSAgICAgICAqLwotCQkgICAgICBmcmNoYWluUCA9IDA7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIC8qCi0JCSAgICoJVHJ5IHRoZSBuZXh0IGZyYWdtZW50Ci0JCSAgICovCi0JCSAgcHJldl9mcmFnUFAgPSAmZnJhZ1AtPmZyX25leHQ7Ci0JCSAgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dDsKLQkJfQotCSAgICAgIC8qCi0JICAgICAgICoJVHJ5IHRoZSBuZXh0IGZyYWdtZW50IGNoYWluCi0JICAgICAgICovCi0JICAgICAgaWYgKGZyY2hhaW5QKQotCQlmcmNoYWluUCA9IGZyY2hhaW5QLT5mcmNoX25leHQ7Ci0JICAgIH0KLQl9Ci0jZW5kaWYgLyogSEFDS19ERUNfQ19TVEFSVFVQICovCi0gICAgfQotfQotDAotCi0vKgotICoJQmVnaW5uaW5nIG9mIHZtc193cml0ZV9vYmplY3RfZmlsZSgpLgotICovCi0KLXN0YXRpYwotc3RydWN0IHZtc19vYmpfc3RhdGUgewotCi0gIC8qIE5leHQgcHJvZ3JhbSBzZWN0aW9uIGluZGV4IHRvIHVzZS4gICovCi0gIGludAlwc2VjdF9udW1iZXI7Ci0KLSAgLyogUHNlY3QgaW5kZXggZm9yIGNvZGUuICBBbHdheXMgZW5kcyB1cCAjMC4gICovCi0gIGludAl0ZXh0X3BzZWN0OwotCi0gIC8qIFBzZWN0IGluZGV4IGZvciBpbml0aWFsaXplZCBzdGF0aWMgdmFyaWFibGVzLiAgKi8KLSAgaW50CWRhdGFfcHNlY3Q7Ci0KLSAgLyogUHNlY3QgaW5kZXggZm9yIHVuaW5pdGlhbGl6ZWQgc3RhdGljIHZhcmlhYmxlcy4gICovCi0gIGludAlic3NfcHNlY3Q7Ci0KLSAgLyogUHNlY3QgaW5kZXggZm9yIHN0YXRpYyBjb25zdHJ1Y3RvcnMuICAqLwotICBpbnQJY3RvcnNfcHNlY3Q7Ci0KLSAgLyogUHNlY3QgaW5kZXggZm9yIHN0YXRpYyBkZXN0cnVjdG9ycy4gICovCi0gIGludAlkdG9yc19wc2VjdDsKLQotICAvKiBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBmb3IgbG9jYWwgc3ltYm9sIGRhdGEuICAqLwotICBpbnQJbG9jYWxfaW5pdGRfZGF0YV9zaXplOwotCi0gIC8qIER5bmFtaWMgYnVmZmVyIGZvciBpbml0aWFsaXplZCBkYXRhLiAgKi8KLSAgY2hhciAqZGF0YV9zZWdtZW50OwotCi19IHZtc19vYmpfc3RhdGU7Ci0KLSNkZWZpbmUgUHNlY3RfTnVtYmVyCQl2bXNfb2JqX3N0YXRlLnBzZWN0X251bWJlcgotI2RlZmluZSBUZXh0X1BzZWN0CQl2bXNfb2JqX3N0YXRlLnRleHRfcHNlY3QKLSNkZWZpbmUgRGF0YV9Qc2VjdAkJdm1zX29ial9zdGF0ZS5kYXRhX3BzZWN0Ci0jZGVmaW5lIEJzc19Qc2VjdAkJdm1zX29ial9zdGF0ZS5ic3NfcHNlY3QKLSNkZWZpbmUgQ3RvcnNfUHNlY3QJCXZtc19vYmpfc3RhdGUuY3RvcnNfcHNlY3QKLSNkZWZpbmUgRHRvcnNfUHNlY3QJCXZtc19vYmpfc3RhdGUuZHRvcnNfcHNlY3QKLSNkZWZpbmUgTG9jYWxfSW5pdGRfRGF0YV9TaXplCXZtc19vYmpfc3RhdGUubG9jYWxfaW5pdGRfZGF0YV9zaXplCi0jZGVmaW5lIERhdGFfU2VnbWVudAkJdm1zX29ial9zdGF0ZS5kYXRhX3NlZ21lbnQKLQotCi0jZGVmaW5lIElTX0dYWF9WVEFCTEUoc3ltUCkgKHN0cm5jbXAgKFNfR0VUX05BTUUgKHN5bVApLCAiX192dC4iLCA1KSA9PSAwKQotI2RlZmluZSBJU19HWFhfWFRPUihzeW1QKSAoc3RybmNtcCAoU19HRVRfTkFNRSAoc3ltUCksICJfX0dMT0JBTF8uIiwgMTApID09IDApCi0jZGVmaW5lIFhUT1JfU0laRSA0Ci0MCi0KLS8qIFBlcmZvcm0gdGV4dCBzZWdtZW50IGZpeHVwcy4gICovCi0KLXN0YXRpYyB2b2lkCi12bXNfZml4dXBfdGV4dF9zZWN0aW9uICh0ZXh0X3NpeiwgdGV4dF9mcmFnX3Jvb3QsIGRhdGFfZnJhZ19yb290KQotICAgICB1bnNpZ25lZCB0ZXh0X3NpejsKLSAgICAgc3RydWN0IGZyYWcgKnRleHRfZnJhZ19yb290OwotICAgICBzdHJ1Y3QgZnJhZyAqZGF0YV9mcmFnX3Jvb3Q7Ci17Ci0gIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgcmVnaXN0ZXIgc3RydWN0IGZpeCAqZml4UDsKLSAgb2Zmc2V0VCBkaWY7Ci0KLSAgLyogU2NhbiB0aGUgdGV4dCBmcmFnbWVudHMuICAqLwotICBmb3IgKGZyYWdQID0gdGV4dF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotICAgIHsKLSAgICAgIC8qIFN0b3AgaWYgd2UgZ2V0IHRvIHRoZSBkYXRhIGZyYWdtZW50cy4gICovCi0gICAgICBpZiAoZnJhZ1AgPT0gZGF0YV9mcmFnX3Jvb3QpCi0JYnJlYWs7Ci0gICAgICAvKiBJZ25vcmUgZnJhZ21lbnRzIHdpdGggbm8gZGF0YS4gICovCi0gICAgICBpZiAoKGZyYWdQLT5mcl9maXggPT0gMCkgJiYgKGZyYWdQLT5mcl92YXIgPT0gMCkpCi0JY29udGludWU7Ci0gICAgICAvKiBHbyB0aGUgdGhlIGFwcHJvcHJpYXRlIG9mZnNldCBpbiB0aGUgVGV4dCBQc2VjdC4gICovCi0gICAgICBWTVNfU2V0X1BzZWN0IChUZXh0X1BzZWN0LCBmcmFnUC0+ZnJfYWRkcmVzcywgT0JKX1NfQ19USVIpOwotICAgICAgLyogU3RvcmUgdGhlICJmaXhlZCIgcGFydC4gICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX2ZpeCkKLQlWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKGZyYWdQLT5mcl9saXRlcmFsLAotCQkJCSAgZnJhZ1AtPmZyX2ZpeCwKLQkJCQkgIE9CSl9TX0NfVElSKTsKLSAgICAgIC8qIFN0b3JlIHRoZSAidmFyaWFibGUiIHBhcnQuICAqLwotICAgICAgaWYgKGZyYWdQLT5mcl92YXIgJiYgZnJhZ1AtPmZyX29mZnNldCkKLQlWTVNfU3RvcmVfUmVwZWF0ZWRfRGF0YSAoZnJhZ1AtPmZyX29mZnNldCwKLQkJCQkgZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4LAotCQkJCSBmcmFnUC0+ZnJfdmFyLAotCQkJCSBPQkpfU19DX1RJUik7Ci0gICAgfQkJCS8qIHRleHQgZnJhZyBsb29wICovCi0KLSAgLyoKLSAgICoJTm93IHdlIGdvIHRocm91Z2ggdGhlIHRleHQgc2VnbWVudCBmaXh1cHMgYW5kIGdlbmVyYXRlCi0gICAqCVRJUiByZWNvcmRzIHRvIGZpeCB1cCBhZGRyZXNzZXMgd2l0aGluIHRoZSBUZXh0IFBzZWN0LgotICAgKi8KLSAgZm9yIChmaXhQID0gdGV4dF9maXhfcm9vdDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgewotICAgICAgLyogV2UgRE8gaGFuZGxlIHRoZSBjYXNlIG9mICJTeW1ib2wgLSBTeW1ib2wiIGFzCi0JIGxvbmcgYXMgaXQgaXMgaW4gdGhlIHNhbWUgc2VnbWVudC4gICovCi0gICAgICBpZiAoZml4UC0+Znhfc3Vic3kgJiYgZml4UC0+ZnhfYWRkc3kpCi0JewotCSAgLyogVGhleSBuZWVkIHRvIGJlIGluIHRoZSBzYW1lIHNlZ21lbnQuICAqLwotCSAgaWYgKFNfR0VUX1JBV19UWVBFIChmaXhQLT5meF9zdWJzeSkgIT0KLQkgICAgICBTX0dFVF9SQVdfVFlQRSAoZml4UC0+ZnhfYWRkc3kpKQotCSAgICBlcnJvciAoXygiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSB0aGUgc2FtZSB0eXBlIikpOwotCSAgLyogQW5kIHRoZXkgbmVlZCB0byBiZSBpbiBvbmUgdGhhdCB3ZSBjYW4gY2hlY2sgdGhlIHBzZWN0IG9uLiAgKi8KLQkgIGlmICgoU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpICE9IE5fREFUQSkgJiYKLQkJICAgIChTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkgIT0gTl9URVhUKSkKLQkgICAgZXJyb3IgKF8oIkZpeHVwIGRhdGEgYWRkc3kgYW5kIHN1YnN5IGRvbid0IGhhdmUgYW4gYXBwcm9wcmlhdGUgdHlwZSIpKTsKLQkgIC8qIFRoaXMgaGFkIGJldHRlciBub3QgYmUgUEMgcmVsYXRpdmUhICAqLwotCSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCSAgICBlcnJvciAoXygiRml4dXAgZGF0YSBpcyBlcnJvbmVvdXNseSBcInBjcmVsXCIiKSk7Ci0JICAvKiBTdWJ0cmFjdCB0aGVpciB2YWx1ZXMgdG8gZ2V0IHRoZSBkaWZmZXJlbmNlLiAgKi8KLQkgIGRpZiA9IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSkgLSBTX0dFVF9WQUxVRSAoZml4UC0+Znhfc3Vic3kpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChMb2NhbCwgKHZhbHVlVClkaWYsIGZpeFAtPmZ4X3NpemUpOwotCSAgLyogTm93IGdlbmVyYXRlIHRoZSBmaXh1cCBvYmplY3QgcmVjb3JkczsKLQkgICAgIHNldCB0aGUgcHNlY3QgYW5kIHN0b3JlIHRoZSBkYXRhLiAgKi8KLQkgIFZNU19TZXRfUHNlY3QgKFRleHRfUHNlY3QsCi0JCQkgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzLAotCQkJIE9CSl9TX0NfVElSKTsKLQkgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsCi0JCQkJICAgIGZpeFAtPmZ4X3NpemUsCi0JCQkJICAgIE9CSl9TX0NfVElSKTsKLQkgIGNvbnRpbnVlOwkvKiBkb25lIHdpdGggdGhpcyBmaXh1cCAqLwotCSAgICB9CQkvKiBpZiBmeF9zdWJzeSAmJiBmeF9hZGRzeSAqLwotICAgICAgLyogU2l6ZSB3aWxsIEhBVkUgdG8gYmUgImxvbmciLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9zaXplICE9IDQpCi0JZXJyb3IgKF8oIkZpeHVwIGRhdHVtIGlzIG5vdCBhIGxvbmd3b3JkIikpOwotICAgICAgLyogU3ltYm9sIG11c3QgYmUgImFkZGVkIiAoaWYgaXQgaXMgZXZlcgotCSBzdWJ0cmFjdGVkIHdlIGNhbiBmaXggdGhpcyBhc3N1bXB0aW9uKS4gICovCi0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCkKLQllcnJvciAoXygiRml4dXAgZGF0dW0gaXMgbm90IFwiZml4UC0+ZnhfYWRkc3lcIiIpKTsKLSAgICAgIC8qIFN0b3JlIHRoZSBzeW1ib2wgdmFsdWUgaW4gYSBQSUMgZmFzaGlvbi4gICovCi0gICAgICBWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UgKGZpeFAtPmZ4X2FkZHN5LAotCQkJCSAgICAgIGZpeFAtPmZ4X29mZnNldCwKLQkJCQkgICAgICBmaXhQLT5meF9wY3JlbCwKLQkJCQkgICAgICBUZXh0X1BzZWN0LAotCQkJCSAgICBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MsCi0JCQkJICAgICAgT0JKX1NfQ19USVIpOwotCSAgLyoKLQkgICAqICBDaGVjayBmb3IgaW5kaXJlY3QgYWRkcmVzcyByZWZlcmVuY2UsIHdoaWNoIGhhcyB0byBiZSBmaXhlZCB1cAotCSAgICogIChhcyB0aGUgbGlua2VyIHdpbGwgc2NyZXcgaXQgdXAgd2l0aCBUSVJfU19DX1NUT19QSUNSKS4uLgotCSAgICovCi0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JVk1TX0ZpeF9JbmRpcmVjdF9SZWZlcmVuY2UgKFRleHRfUHNlY3QsCi0JCQkJICAgIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcywKLQkJCQkgICAgZml4UC0+ZnhfZnJhZywKLQkJCQkgICAgdGV4dF9mcmFnX3Jvb3QpOwotICAgIH0JCQkvKiB0ZXh0IGZpeCBsb29wICovCi19Ci0MCi0KLS8qIENyZWF0ZSBhIGJ1ZmZlciBob2xkaW5nIHRoZSBkYXRhIHNlZ21lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc3ludGhlc2l6ZV9kYXRhX3NlZ21lbnQgKGRhdGFfc2l6LCB0ZXh0X3NpeiwgZGF0YV9mcmFnX3Jvb3QpCi0gICAgIHVuc2lnbmVkIGRhdGFfc2l6LCB0ZXh0X3NpejsKLSAgICAgc3RydWN0IGZyYWcgKmRhdGFfZnJhZ19yb290OwotewotICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gIGNoYXIgKmZpbGxfbGl0ZXJhbDsKLSAgbG9uZyBmaWxsX3NpemUsIGNvdW50LCBpOwotCi0gIC8qIEFsbG9jYXRlIHRoZSBkYXRhIHNlZ21lbnQuICAqLwotICBEYXRhX1NlZ21lbnQgPSAoY2hhciAqKSB4bWFsbG9jIChkYXRhX3Npeik7Ci0gIC8qIFJ1biB0aHJvdWdoIHRoZSBkYXRhIGZyYWdtZW50cywgZmlsbGluZyBpbiB0aGUgc2VnbWVudC4gICovCi0gIGZvciAoZnJhZ1AgPSBkYXRhX2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0gICAgewotICAgICAgaSA9IGZyYWdQLT5mcl9hZGRyZXNzIC0gdGV4dF9zaXo7Ci0gICAgICBpZiAoZnJhZ1AtPmZyX2ZpeCkKLQltZW1jcHkgKERhdGFfU2VnbWVudCArIGksIGZyYWdQLT5mcl9saXRlcmFsLCBmcmFnUC0+ZnJfZml4KTsKLSAgICAgIGkgKz0gZnJhZ1AtPmZyX2ZpeDsKLQotICAgICAgaWYgKChmaWxsX3NpemUgPSBmcmFnUC0+ZnJfdmFyKSAhPSAwKQotCXsKLQkgIGZpbGxfbGl0ZXJhbCA9IGZyYWdQLT5mcl9saXRlcmFsICsgZnJhZ1AtPmZyX2ZpeDsKLQkgIGZvciAoY291bnQgPSBmcmFnUC0+ZnJfb2Zmc2V0OyBjb3VudDsgY291bnQtLSkKLQkgICAgewotCSAgICAgIG1lbWNweSAoRGF0YV9TZWdtZW50ICsgaSwgZmlsbF9saXRlcmFsLCBmaWxsX3NpemUpOwotCSAgICAgIGkgKz0gZmlsbF9zaXplOwotCSAgICB9Ci0JfQotICAgIH0JCQkvKiBkYXRhIGZyYWcgbG9vcCAqLwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBQZXJmb3JtIGRhdGEgc2VnbWVudCBmaXh1cHMuICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX2ZpeHVwX2RhdGFfc2VjdGlvbiAoZGF0YV9zaXosIHRleHRfc2l6KQotICAgICB1bnNpZ25lZCBkYXRhX3NpeiwgdGV4dF9zaXo7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBmaXggKmZpeFA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnNwOwotICBhZGRyZXNzVCBmcl9hZGRyZXNzOwotICBvZmZzZXRUIGRpZjsKLSAgdmFsdWVUIHZhbDsKLQotICAvKiBSdW4gdGhyb3VnaCBhbGwgdGhlIGRhdGEgc3ltYm9scyBhbmQgc3RvcmUgdGhlIGRhdGEuICAqLwotICBmb3IgKHZzcCA9IFZNU19TeW1ib2xzOyB2c3A7IHZzcCA9IHZzcC0+TmV4dCkKLSAgICB7Ci0gICAgICAvKiBJZ25vcmUgYW55dGhpbmcgb3RoZXIgdGhhbiBkYXRhIHN5bWJvbHMuICAqLwotICAgICAgaWYgKFNfR0VUX1RZUEUgKHZzcC0+U3ltYm9sKSAhPSBOX0RBVEEpCi0JY29udGludWU7Ci0gICAgICAvKiBTZXQgdGhlIFBzZWN0ICsgT2Zmc2V0LiAgKi8KLSAgICAgIFZNU19TZXRfUHNlY3QgKHZzcC0+UHNlY3RfSW5kZXgsCi0JCSAgICAgICB2c3AtPlBzZWN0X09mZnNldCwKLQkJICAgICAgIE9CSl9TX0NfVElSKTsKLSAgICAgIC8qIFN0b3JlIHRoZSBkYXRhLiAgKi8KLSAgICAgIHZhbCA9IFNfR0VUX1ZBTFVFICh2c3AtPlN5bWJvbCk7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKERhdGFfU2VnbWVudCArIHZhbCAtIHRleHRfc2l6LAotCQkJCXZzcC0+U2l6ZSwKLQkJCQlPQkpfU19DX1RJUik7Ci0gICAgfQkJCS8qIE5fREFUQSBzeW1ib2wgbG9vcCAqLwotCi0gIC8qCi0gICAqCU5vdyB3ZSBnbyB0aHJvdWdoIHRoZSBkYXRhIHNlZ21lbnQgZml4dXBzIGFuZCBnZW5lcmF0ZQotICAgKglUSVIgcmVjb3JkcyB0byBmaXggdXAgYWRkcmVzc2VzIHdpdGhpbiB0aGUgRGF0YSBQc2VjdHMuCi0gICAqLwotICBmb3IgKGZpeFAgPSBkYXRhX2ZpeF9yb290OyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICAvKiBGaW5kIHRoZSBzeW1ib2wgZm9yIHRoZSBjb250YWluaW5nIGRhdHVtLiAgKi8KLSAgICAgIGZvciAodnNwID0gVk1TX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQotCXsKLQkgIC8qIE9ubHkgYm90aGVyIHdpdGggRGF0YSBzeW1ib2xzLiAgKi8KLQkgIHNwID0gdnNwLT5TeW1ib2w7Ci0JICBpZiAoU19HRVRfVFlQRSAoc3ApICE9IE5fREFUQSkKLQkgICAgY29udGludWU7Ci0JICAvKiBJZ25vcmUgc3ltYm9sIGlmIEFmdGVyIGZpeHVwLiAgKi8KLQkgIHZhbCA9IFNfR0VUX1ZBTFVFIChzcCk7Ci0JICBmcl9hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLQkgIGlmICh2YWwgPiBmaXhQLT5meF93aGVyZSArIGZyX2FkZHJlc3MpCi0JICAgIGNvbnRpbnVlOwotCSAgLyogU2VlIGlmIHRoZSBkYXR1bSBpcyBoZXJlLiAgKi8KLQkgIGlmICh2YWwgKyB2c3AtPlNpemUgPD0gZml4UC0+Znhfd2hlcmUgKyBmcl9hZGRyZXNzKQotCSAgICBjb250aW51ZTsKLQkgIC8qIFdlIERPIGhhbmRsZSB0aGUgY2FzZSBvZiAiU3ltYm9sIC0gU3ltYm9sIiBhcwotCSAgICAgbG9uZyBhcyBpdCBpcyBpbiB0aGUgc2FtZSBzZWdtZW50LiAgKi8KLQkgIGlmIChmaXhQLT5meF9zdWJzeSAmJiBmaXhQLT5meF9hZGRzeSkKLQkgICAgewotCSAgICAgIC8qIFRoZXkgbmVlZCB0byBiZSBpbiB0aGUgc2FtZSBzZWdtZW50LiAgKi8KLQkgICAgICBpZiAoU19HRVRfUkFXX1RZUEUgKGZpeFAtPmZ4X3N1YnN5KSAhPQotCQkgIFNfR0VUX1JBV19UWVBFIChmaXhQLT5meF9hZGRzeSkpCi0JCWVycm9yIChfKCJGaXh1cCBkYXRhIGFkZHN5IGFuZCBzdWJzeSBkb24ndCBoYXZlIHRoZSBzYW1lIHR5cGUiKSk7Ci0JICAgICAgLyogQW5kIHRoZXkgbmVlZCB0byBiZSBpbiBvbmUgdGhhdCB3ZSBjYW4gY2hlY2sgdGhlIHBzZWN0IG9uLiAgKi8KLQkgICAgICBpZiAoKFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KSAhPSBOX0RBVEEpICYmCi0JCSAgKFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KSAhPSBOX1RFWFQpKQotCQllcnJvciAoXygiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSB0eXBlIikpOwotCSAgICAgIC8qIFRoaXMgaGFkIGJldHRlciBub3QgYmUgUEMgcmVsYXRpdmUhICAqLwotCSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKLQkJZXJyb3IgKF8oIkZpeHVwIGRhdGEgaXMgZXJyb25lb3VzbHkgXCJwY3JlbFwiIikpOwotCSAgICAgIC8qIFN1YnRyYWN0IHRoZWlyIHZhbHVlcyB0byBnZXQgdGhlIGRpZmZlcmVuY2UuICAqLwotCSAgICAgIGRpZiA9IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSkgLSBTX0dFVF9WQUxVRSAoZml4UC0+Znhfc3Vic3kpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoTG9jYWwsICh2YWx1ZVQpZGlmLCBmaXhQLT5meF9zaXplKTsKLQkgICAgICAvKgotCSAgICAgICAqIE5vdyBnZW5lcmF0ZSB0aGUgZml4dXAgb2JqZWN0IHJlY29yZHM7Ci0JICAgICAgICogc2V0IHRoZSBwc2VjdCBhbmQgc3RvcmUgdGhlIGRhdGEuCi0JICAgICAgICovCi0JICAgICAgVk1TX1NldF9Qc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwKLQkJCSAgICAgZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlCi0JCQkJIC0gdmFsICsgdnNwLT5Qc2VjdF9PZmZzZXQsCi0JCQkgICAgIE9CSl9TX0NfVElSKTsKLQkgICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLAotCQkJCQlmaXhQLT5meF9zaXplLAotCQkJCQlPQkpfU19DX1RJUik7Ci0JCSAgYnJlYWs7CS8qIGRvbmUgd2l0aCB0aGlzIGZpeHVwICovCi0JCX0KLQkgIC8qIFNpemUgd2lsbCBIQVZFIHRvIGJlICJsb25nIi4gICovCi0JICBpZiAoZml4UC0+Znhfc2l6ZSAhPSA0KQotCSAgICBlcnJvciAoXygiRml4dXAgZGF0dW0gaXMgbm90IGEgbG9uZ3dvcmQiKSk7Ci0JICAvKiBTeW1ib2wgbXVzdCBiZSAiYWRkZWQiIChpZiBpdCBpcyBldmVyCi0JICAgICBzdWJ0cmFjdGVkIHdlIGNhbiBmaXggdGhpcyBhc3N1bXB0aW9uKS4gICovCi0JICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCkKLQkgICAgZXJyb3IgKF8oIkZpeHVwIGRhdHVtIGlzIG5vdCBcImZpeFAtPmZ4X2FkZHN5XCIiKSk7Ci0JICAvKiBTdG9yZSB0aGUgc3ltYm9sIHZhbHVlIGluIGEgUElDIGZhc2hpb24uICAqLwotCSAgVk1TX1N0b3JlX1BJQ19TeW1ib2xfUmVmZXJlbmNlIChmaXhQLT5meF9hZGRzeSwKLQkJCQkJICBmaXhQLT5meF9vZmZzZXQsCi0JCQkJCSAgZml4UC0+ZnhfcGNyZWwsCi0JCQkJCSAgdnNwLT5Qc2VjdF9JbmRleCwKLQkJCQkJICBmcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUKLQkJCQkJICAgICAgLSB2YWwgKyB2c3AtPlBzZWN0X09mZnNldCwKLQkJCQkJICBPQkpfU19DX1RJUik7Ci0JICAvKiBEb25lIHdpdGggdGhpcyBmaXh1cC4gICovCi0JICBicmVhazsKLQl9CQkvKiB2bXNfc3ltYm9sIGxvb3AgKi8KLQotICAgIH0JCQkvKiBkYXRhIGZpeCBsb29wICovCi19Ci0KLS8qIFBlcmZvcm0gY3RvcnMvZHRvcnMgc2VnbWVudCBmaXh1cHMuICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX2ZpeHVwX3h0b3JzX3NlY3Rpb24gKHN5bWJvbHMsIHNlY3Rfbm8pCi0Jc3RydWN0IFZNU19TeW1ib2wgKnN5bWJvbHM7Ci0JaW50IHNlY3Rfbm87Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7Ci0KLSAgLyogUnVuIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzIGFuZCBzdG9yZSB0aGUgZGF0YS4gICovCi0gIGZvciAodnNwID0gc3ltYm9sczsgdnNwOyB2c3AgPSB2c3AtPk5leHQpCi0gICAgewotICAgICAgcmVnaXN0ZXIgc3ltYm9sUyAqc3A7Ci0KLSAgICAgIC8qIFNldCByZWxvY2F0aW9uIGJhc2UuICAqLwotICAgICAgVk1TX1NldF9Qc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwgdnNwLT5Qc2VjdF9PZmZzZXQsIE9CSl9TX0NfVElSKTsKLQotICAgICAgc3AgPSB2c3AtPlN5bWJvbDsKLSAgICAgIC8qIFN0YWNrIHRoZSBQc2VjdCBiYXNlIHdpdGggaXRzIG9mZnNldC4gICovCi0gICAgICBWTVNfU2V0X0RhdGEgKFRleHRfUHNlY3QsIFNfR0VUX1ZBTFVFIChzcCksIE9CSl9TX0NfVElSLCAwKTsKLSAgICB9Ci0gIC8qIEZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLQotICByZXR1cm47Ci19Ci0MCi0KLS8qIERlZmluZSBzeW1ib2xzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsb2JhbF9zeW1ib2xfZGlyZWN0b3J5ICh0ZXh0X3NpeiwgZGF0YV9zaXopCi0gICAgIHVuc2lnbmVkIHRleHRfc2l6LCBkYXRhX3NpejsKLXsKLSAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICByZWdpc3RlciBzeW1ib2xTICpzcDsKLSAgcmVnaXN0ZXIgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLSAgaW50IEdsb2JhbHJlZiwgZGVmaW5lX2FzX2dsb2JhbF9zeW1ib2w7Ci0KLSNpZiAwCi0gIC8qIFRoZSBnKysgY29tcGlsZXIgZG9lcyBub3Qgd3JpdGUgb3V0IGV4dGVybmFsIHJlZmVyZW5jZXMgdG8KLSAgICAgdnRhYmxlcyBjb3JyZWN0bHkuICBDaGVjayBmb3IgdGhpcyBhbmQgaG9sbGVyIGlmIHdlIHNlZSBpdAotICAgICBoYXBwZW5pbmcuICBJZiB0aGF0IGNvbXBpbGVyIGJ1ZyBpcyBldmVyIGZpeGVkIHdlIGNhbiByZW1vdmUKLSAgICAgdGhpcy4KLQotICAgICAoSnVuJzk1OiBnY2MgMi43LjAncyBjYzFwbHVzIHN0aWxsIGV4aGliaXRzIHRoaXMgYmVoYXZpb3IuKQotCi0gICAgIFRoaXMgd2FzIHJlcG9ydGVkbHkgZml4ZWQgYXMgb2YgSnVuZSAyLCAxOTk4LiAgICovCi0KLSAgZm9yIChzcCA9IHN5bWJvbF9yb290UDsgc3A7IHNwID0gc3ltYm9sX25leHQgKHNwKSkKLSAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHNwKSA9PSBOX1VOREYgJiYgSVNfR1hYX1ZUQUJMRSAoc3ApKQotICAgICAgewotCVNfU0VUX1RZUEUgKHNwLCBOX1VOREYgfCBOX0VYVCk7Ci0JU19TRVRfT1RIRVIgKHNwLCAxKTsKLQlhc193YXJuIChfKCJnKysgd3JvdGUgYW4gZXh0ZXJuIHJlZmVyZW5jZSB0byBgJXMnIGFzIGEgcm91dGluZS5cbkkgd2lsbCBmaXggaXQsIGJ1dCBJIGhvcGUgdGhhdCBpdCB3YXMgbm90ZSByZWFsbHkgYSByb3V0aW5lLiIpLAotCQkgU19HRVRfTkFNRSAoc3ApKTsKLSAgICAgIH0KLSNlbmRpZgotCi0gIC8qCi0gICAqIE5vdyBzY2FuIHRoZSBzeW1ib2xzIGFuZCBlbWl0IHRoZSBhcHByb3ByaWF0ZSBHU0QgcmVjb3JkcwotICAgKi8KLSAgZm9yIChzcCA9IHN5bWJvbF9yb290UDsgc3A7IHNwID0gc3ltYm9sX25leHQgKHNwKSkKLSAgICB7Ci0gICAgICBkZWZpbmVfYXNfZ2xvYmFsX3N5bWJvbCA9IDA7Ci0gICAgICB2c3AgPSAwOwotICAgICAgLyogRGlzcGF0Y2ggb24gc3ltYm9sIHR5cGUuICAqLwotICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoc3ApKQotCXsKLQotCS8qIEdsb2JhbCB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotCWNhc2UgTl9VTkRGIHwgTl9FWFQ6Ci0JICAvKiBNYWtlIGEgVk1TIGRhdGEgc3ltYm9sIGVudHJ5LiAgKi8KLQkgIHZzcCA9IChzdHJ1Y3QgVk1TX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnZzcCk7Ci0JICB2c3AtPlN5bWJvbCA9IHNwOwotCSAgdnNwLT5TaXplID0gU19HRVRfVkFMVUUgKHNwKTsKLQkgIHZzcC0+UHNlY3RfSW5kZXggPSBQc2VjdF9OdW1iZXIrKzsKLQkgIHZzcC0+UHNlY3RfT2Zmc2V0ID0gMDsKLQkgIHZzcC0+TmV4dCA9IFZNU19TeW1ib2xzOwotCSAgVk1TX1N5bWJvbHMgPSB2c3A7Ci0JICBzcC0+c3lfb2JqID0gdnNwOwotCSAgLyogTWFrZSB0aGUgcHNlY3QgZm9yIHRoaXMgZGF0YS4gICovCi0JICBHbG9iYWxyZWYgPSBWTVNfUHNlY3RfU3BlYyAoU19HRVRfTkFNRSAoc3ApLAotCQkJCSAgICAgIHZzcC0+U2l6ZSwKLQkJCQkgICAgICBTX0dFVF9PVEhFUiAoc3ApID8gcHNfQ09OU1QgOiBwc19DT01NT04sCi0JCQkJICAgICAgdnNwKTsKLQkgIGlmIChHbG9iYWxyZWYpCi0JICAgIFBzZWN0X051bWJlci0tOwotI2lmZGVmCU5PVF9WQVhfMTFfQ19DT01QQVRJQkxFCi0JICBkZWZpbmVfYXNfZ2xvYmFsX3N5bWJvbCA9IDE7Ci0jZWxzZQotCSAgLyogU2VlIGlmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgdnRhYmxlLiAgV2Ugd2FudCB0byBoZWxwIHRoZQotCSAgICAgbGlua2VyIGZpbmQgdGhlc2UgdGhpbmdzIGluIGxpYnJhcmllcywgc28gd2UgbWFrZSBhIHN5bWJvbAotCSAgICAgcmVmZXJlbmNlLiAgVGhpcyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIFZBWC1DIHVzYWdlIGZvcgotCSAgICAgdmFyaWFibGVzLCBidXQgc2luY2UgdnRhYmxlcyBhcmUgb25seSB1c2VkIGludGVybmFsbHkgYnkKLQkgICAgIGcrKywgd2UgY2FuIGdldCBhd2F5IHdpdGggdGhpcyBoYWNrLiAgKi8KLQkgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gSVNfR1hYX1ZUQUJMRSAoc3ApOwotI2VuZGlmCi0JICBicmVhazsKLQotCS8qIExvY2FsIHVuaW5pdGlhbGl6ZWQgZGF0YS4gICovCi0JY2FzZSBOX0JTUzoKLQkgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLwotCSAgdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKLQkgIHZzcC0+U3ltYm9sID0gc3A7Ci0JICB2c3AtPlNpemUgPSAwOwotCSAgdnNwLT5Qc2VjdF9JbmRleCA9IEJzc19Qc2VjdDsKLQkgIHZzcC0+UHNlY3RfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHNwKSAtIGJzc19hZGRyZXNzX2ZyYWcuZnJfYWRkcmVzczsKLQkgIHZzcC0+TmV4dCA9IFZNU19TeW1ib2xzOwotCSAgVk1TX1N5bWJvbHMgPSB2c3A7Ci0JICBzcC0+c3lfb2JqID0gdnNwOwotCSAgYnJlYWs7Ci0KLQkvKiBHbG9iYWwgaW5pdGlhbGl6ZWQgZGF0YS4gICovCi0JY2FzZSBOX0RBVEEgfCBOX0VYVDoKLQkgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLwotCSAgdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKLQkgIHZzcC0+U3ltYm9sID0gc3A7Ci0JICB2c3AtPlNpemUgPSBWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplIChzcCwgdGV4dF9zaXogKyBkYXRhX3Npeik7Ci0JICB2c3AtPlBzZWN0X0luZGV4ID0gUHNlY3RfTnVtYmVyKys7Ci0JICB2c3AtPlBzZWN0X09mZnNldCA9IDA7Ci0JICB2c3AtPk5leHQgPSBWTVNfU3ltYm9sczsKLQkgIFZNU19TeW1ib2xzID0gdnNwOwotCSAgc3AtPnN5X29iaiA9IHZzcDsKLQkgIC8qIE1ha2UgaXRzIHBzZWN0LiAgKi8KLQkgIEdsb2JhbHJlZiA9IFZNU19Qc2VjdF9TcGVjIChTX0dFVF9OQU1FIChzcCksCi0JCQkJICAgICAgdnNwLT5TaXplLAotCQkJCSAgICAgIFNfR0VUX09USEVSIChzcCkgPyBwc19DT05TVCA6IHBzX0NPTU1PTiwKLQkJCQkgICAgICB2c3ApOwotCSAgaWYgKEdsb2JhbHJlZikKLQkgICAgUHNlY3RfTnVtYmVyLS07Ci0jaWZkZWYJTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUKLQkgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gMTsKLSNlbHNlCi0JICAvKiBTZWUgTl9VTkRGfE5fRVhUIGFib3ZlIGZvciBleHBsYW5hdGlvbi4gICovCi0JICBkZWZpbmVfYXNfZ2xvYmFsX3N5bWJvbCA9IElTX0dYWF9WVEFCTEUgKHNwKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0KLQkvKiBMb2NhbCBpbml0aWFsaXplZCBkYXRhLiAgKi8KLQljYXNlIE5fREFUQToKLQkgIHsKLQkgICAgY2hhciAqc3ltX25hbWUgPSBTX0dFVF9OQU1FIChzcCk7Ci0KLQkgICAgLyogQWx3YXlzIHN1cHByZXNzIGxvY2FsIG51bWVyaWMgbGFiZWxzLiAgKi8KLQkgICAgaWYgKHN5bV9uYW1lICYmIHN0cmNtcCAoc3ltX25hbWUsIEZBS0VfTEFCRUxfTkFNRSkgPT0gMCkKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBNYWtlIGEgVk1TIGRhdGEgc3ltYm9sIGVudHJ5LiAgKi8KLQkgICAgdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKLQkgICAgdnNwLT5TeW1ib2wgPSBzcDsKLQkgICAgdnNwLT5TaXplID0gVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSAoc3AsIHRleHRfc2l6ICsgZGF0YV9zaXopOwotCSAgICB2c3AtPlBzZWN0X0luZGV4ID0gRGF0YV9Qc2VjdDsKLQkgICAgdnNwLT5Qc2VjdF9PZmZzZXQgPSBMb2NhbF9Jbml0ZF9EYXRhX1NpemU7Ci0JICAgIExvY2FsX0luaXRkX0RhdGFfU2l6ZSArPSB2c3AtPlNpemU7Ci0JICAgIHZzcC0+TmV4dCA9IFZNU19TeW1ib2xzOwotCSAgICBWTVNfU3ltYm9scyA9IHZzcDsKLQkgICAgc3AtPnN5X29iaiA9IHZzcDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JLyogR2xvYmFsIFRleHQgZGVmaW5pdGlvbi4gICovCi0JY2FzZSBOX1RFWFQgfCBOX0VYVDoKLQkgIHsKLQotCSAgICBpZiAoSVNfR1hYX1hUT1IgKHNwKSkKLQkgICAgICB7Ci0JCXZzcCA9IChzdHJ1Y3QgVk1TX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnZzcCk7Ci0JCXZzcC0+U3ltYm9sID0gc3A7Ci0JCXZzcC0+U2l6ZSA9IFhUT1JfU0laRTsKLQkJc3AtPnN5X29iaiA9IHZzcDsKLQkJc3dpdGNoICgoU19HRVRfTkFNRSAoc3ApKVsxMF0pCi0JCSAgewotCQkgICAgY2FzZSAnSSc6Ci0JCSAgICAgIHZzcC0+UHNlY3RfSW5kZXggPSBDdG9yc19Qc2VjdDsKLQkJICAgICAgdnNwLT5Qc2VjdF9PZmZzZXQgPSAoQ3RvcnNfU3ltYm9scz09MCk/MDooQ3RvcnNfU3ltYm9scy0+UHNlY3RfT2Zmc2V0K1hUT1JfU0laRSk7Ci0JCSAgICAgIHZzcC0+TmV4dCA9IEN0b3JzX1N5bWJvbHM7Ci0JCSAgICAgIEN0b3JzX1N5bWJvbHMgPSB2c3A7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnRCc6Ci0JCSAgICAgIHZzcC0+UHNlY3RfSW5kZXggPSBEdG9yc19Qc2VjdDsKLQkJICAgICAgdnNwLT5Qc2VjdF9PZmZzZXQgPSAoRHRvcnNfU3ltYm9scz09MCk/MDooRHRvcnNfU3ltYm9scy0+UHNlY3RfT2Zmc2V0K1hUT1JfU0laRSk7Ci0JCSAgICAgIHZzcC0+TmV4dCA9IER0b3JzX1N5bWJvbHM7Ci0JCSAgICAgIER0b3JzX1N5bWJvbHMgPSB2c3A7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnRyc6Ci0JCSAgICAgIGFzX3dhcm4gKF8oIkNhbid0IGhhbmRsZSBnbG9iYWwgeHRvcnMgc3ltYm9scyB5ZXQuIikpOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGFzX3dhcm4gKF8oIlVua25vd24gJXMiKSwgU19HRVRfTkFNRSAoc3ApKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJdW5zaWduZWQgc2hvcnQgRW50cnlfTWFzazsKLQotCQkvKiBHZXQgdGhlIGVudHJ5IG1hc2suICAqLwotCQlmcmFnUCA9IHNwLT5zeV9mcmFnOwotCQkvKiBGaXJzdCBmcmFnIG1pZ2h0IGJlIGVtcHR5IGlmIHdlJ3JlIGdlbmVyYXRpbmcgbGlzdGluZ3MuCi0JCSAgIFNvIHNraXAgZW1wdHkgcnNfZmlsbCBmcmFncy4gICovCi0JCXdoaWxlIChmcmFnUCAmJiBmcmFnUC0+ZnJfdHlwZSA9PSByc19maWxsICYmIGZyYWdQLT5mcl9maXggPT0gMCkKLQkJICBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0OwotCi0JCS8qIElmIGZpcnN0IGZyYWcgZG9lc24ndCBjb250YWluIHRoZSBkYXRhLCB3aGF0IGRvIHdlIGRvPwotCQkgICBJZiBpdCdzIHBvc3NpYmx5IHNtYWxsZXIgdGhhbiB0d28gYnl0ZXMsIHRoYXQgd291bGQKLQkJICAgaW1wbHkgdGhhdCB0aGUgZW50cnkgbWFzayBpcyBub3Qgc3RvcmVkIHdoZXJlIHdlJ3JlCi0JCSAgIGV4cGVjdGluZyBpdC4KLQotCQkgICBJZiB5b3UgY2FuIGZpbmQgYSB0ZXN0IGNhc2UgdGhhdCB0cmlnZ2VycyB0aGlzLCByZXBvcnQKLQkJICAgaXQgKGFuZCB0ZWxsIG1lIHdoYXQgdGhlIGVudHJ5IG1hc2sgZmllbGQgb3VnaHQgdG8gYmUpLAotCQkgICBhbmQgSSdsbCB0cnkgdG8gZml4IGl0LiAgS1IgKi8KLQkJaWYgKGZyYWdQLT5mcl9maXggPCAyKQotCQkgIGFib3J0ICgpOwotCi0JCUVudHJ5X01hc2sgPSAoZnJhZ1AtPmZyX2xpdGVyYWxbMF0gJiAweDAwZmYpIHwKLQkJCSAgICAgKChmcmFnUC0+ZnJfbGl0ZXJhbFsxXSAmIDB4MDBmZikgPDwgOCk7Ci0JCS8qIERlZmluZSB0aGUgcHJvY2VkdXJlIGVudHJ5IHBvaW50LiAgKi8KLQkJVk1TX1Byb2NlZHVyZV9FbnRyeV9QdCAoU19HRVRfTkFNRSAoc3ApLAotCQkJCSAgICBUZXh0X1BzZWN0LAotCQkJCSAgICBTX0dFVF9WQUxVRSAoc3ApLAotCQkJCSAgICBFbnRyeV9NYXNrKTsKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JLyogTG9jYWwgVGV4dCBkZWZpbml0aW9uLiAgKi8KLQljYXNlIE5fVEVYVDoKLQkgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLwotCSAgaWYgKFRleHRfUHNlY3QgIT0gLTEpCi0JICAgIHsKLQkgICAgICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOwotCSAgICAgIHZzcC0+U3ltYm9sID0gc3A7Ci0JICAgICAgdnNwLT5TaXplID0gMDsKLQkgICAgICB2c3AtPlBzZWN0X0luZGV4ID0gVGV4dF9Qc2VjdDsKLQkgICAgICB2c3AtPlBzZWN0X09mZnNldCA9IFNfR0VUX1ZBTFVFIChzcCk7Ci0JICAgICAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7Ci0JICAgICAgVk1TX1N5bWJvbHMgPSB2c3A7Ci0JICAgICAgc3AtPnN5X29iaiA9IHZzcDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkvKiBHbG9iYWwgUmVmZXJlbmNlLiAgKi8KLQljYXNlIE5fVU5ERjoKLQkgIC8qIE1ha2UgYSBHU0QgZ2xvYmFsIHN5bWJvbCByZWZlcmVuY2UgcmVjb3JkLiAgKi8KLQkgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKFNfR0VUX05BTUUgKHNwKSwKLQkJCQkgIDAsCi0JCQkJICAwLAotCQkJCSAgR0JMU1lNX1JFRik7Ci0JICBicmVhazsKLQotCS8qIEFic29sdXRlIHN5bWJvbC4gICovCi0JY2FzZSBOX0FCUzoKLQljYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JICAvKiBnY2MgZG9lc24ndCBnZW5lcmF0ZSB0aGVzZTsKLQkgICAgIFZNU19FbWl0X0dsb2JhbHZhbHVlIGhhbmRsZXMgdGhlbSB0aG91Z2guCSovCi0JICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOwotCSAgdnNwLT5TeW1ib2wgPSBzcDsKLQkgIHZzcC0+U2l6ZSA9IDQ7CQkvKiBhbHdheXMgYXNzdW1lIDMyIGJpdHMgKi8KLQkgIHZzcC0+UHNlY3RfSW5kZXggPSAwOwotCSAgdnNwLT5Qc2VjdF9PZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ApOwotCSAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7Ci0JICBWTVNfU3ltYm9scyA9IHZzcDsKLQkgIHNwLT5zeV9vYmogPSB2c3A7Ci0JICBicmVhazsKLQotCS8qIEFueXRoaW5nIGVsc2UuICAqLwotCWRlZmF1bHQ6Ci0JICAvKiBJZ25vcmUgU1RBQiBzeW1ib2xzLCBpbmNsdWRpbmcgLnN0YWJzIGVtaXR0ZWQgYnkgZysrLiAgKi8KLQkgIGlmIChTX0lTX0RFQlVHIChzcCkgfHwgKFNfR0VUX1RZUEUgKHNwKSA9PSAyMikpCi0JICAgIGJyZWFrOwotCSAgLyoKLQkgICAqCUVycm9yIG90aGVyd2lzZS4KLQkgICAqLwotCSAgYXNfdHNrdHNrIChfKCJ1bmhhbmRsZWQgc3RhYiB0eXBlICVkIiksIFNfR0VUX1RZUEUgKHNwKSk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEdsb2JhbCBzeW1ib2xzIGhhdmUgZGlmZmVyZW50IGxpbmthZ2UgdGhhbiBleHRlcm5hbCB2YXJpYWJsZXMuICAqLwotICAgICAgaWYgKGRlZmluZV9hc19nbG9iYWxfc3ltYm9sKQotCVZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKFNfR0VUX05BTUUgKHNwKSwKLQkJCQl2c3AtPlBzZWN0X0luZGV4LAotCQkJCTAsCi0JCQkJR0JMU1lNX0RFRik7Ci0gICAgfQotCi0gIHJldHVybjsKLX0KLQwKLQotLyogT3V0cHV0IGRlYnVnZ2VyIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiBmb3Igc3ltYm9scyB3aGljaAotICAgYXJlIGxvY2FsIHRvIGEgc3BlY2lmaWMgcm91dGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1sb2NhbF9zeW1ib2xzX0RTVCAoczBQLCBDdXJyZW50X1JvdXRpbmUpCi0gICAgIHN5bWJvbFMgKnMwUCwgKkN1cnJlbnRfUm91dGluZTsKLXsKLSAgc3ltYm9sUyAqczFQOwotICBjaGFyICpzMFBfbmFtZSwgKnBudDAsICpwbnQxOwotCi0gIHMwUF9uYW1lID0gU19HRVRfTkFNRSAoczBQKTsKLSAgaWYgKCpzMFBfbmFtZSsrICE9ICdfJykKLSAgICByZXR1cm47Ci0KLSAgZm9yIChzMVAgPSBDdXJyZW50X1JvdXRpbmU7IHMxUDsgczFQID0gc3ltYm9sX25leHQgKHMxUCkpCi0gICAgewotI2lmIDAJCS8qIHJlZHVuZGFudDsgUkFXX1RZUEUgIT0gTl9GVU4gc3VmZmljZXMgKi8KLSAgICAgIGlmICghU19JU19ERUJVRyAoczFQKSkKLQljb250aW51ZTsKLSNlbmRpZgotICAgICAgaWYgKFNfR0VUX1JBV19UWVBFIChzMVApICE9IE5fRlVOKQotCWNvbnRpbnVlOwotICAgICAgcG50MCA9IHMwUF9uYW1lOwotICAgICAgcG50MSA9IFNfR0VUX05BTUUgKHMxUCk7Ci0gICAgICAvKiBXZSBhc3N1bWUgdGhlIHR3byBzdHJpbmdzIGFyZSBuZXZlciBleGFjdGx5IGVxdWFsLi4uICAqLwotICAgICAgd2hpbGUgKCpwbnQwKysgPT0gKnBudDErKykKLQl7Ci0JfQotICAgICAgLyogRm91bmQgaXQgaWYgczBQIG5hbWUgaXMgZXhoYXVzdGVkIGFuZCBzMVAgbmFtZSBoYXMgIjpGIiBvciAiOmYiIG5leHQuCi0JIE5vdGU6ICBib3RoIHBvaW50ZXJzIGhhdmUgYWR2YW5jZWQgb25lIHBhc3QgdGhlIG5vbi1tYXRjaGluZyBjaGFyLiAgKi8KLSAgICAgIGlmICgoKnBudDEgPT0gJ0YnIHx8ICpwbnQxID09ICdmJykgJiYgKi0tcG50MSA9PSAnOicgJiYgKi0tcG50MCA9PSAnXDAnKQotCXsKLQkgIERlZmluZV9Sb3V0aW5lIChzMVAsIDAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotCi0vKiBDb25zdHJ1Y3QgYW5kIG91dHB1dCB0aGUgZGVidWcgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXZtc19idWlsZF9EU1QgKHRleHRfc2l6KQotICAgICB1bnNpZ25lZCB0ZXh0X3NpejsKLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgc3ltYm9sUyAqQ3VycmVudF9Sb3V0aW5lID0gMDsKLSAgc3RydWN0IGlucHV0X2ZpbGUgKkN1cl9GaWxlID0gMDsKLSAgb2Zmc2V0VCBDdXJfT2Zmc2V0ID0gLTE7Ci0gIGludCBDdXJfTGluZV9OdW1iZXIgPSAwOwotICBpbnQgRmlsZV9OdW1iZXIgPSAwOwotICBpbnQgRGVidWdnZXJfT2Zmc2V0ID0gMDsKLSAgaW50IGZpbGVfYXZhaWxhYmxlOwotICBpbnQgZHNjOwotICBvZmZzZXRUIHZhbDsKLQotICAvKiBXcml0ZSB0aGUgVHJhY2ViYWNrIEJlZ2luIE1vZHVsZSByZWNvcmQuICAqLwotICBWTVNfVEJUX01vZHVsZV9CZWdpbiAoKTsKLQotICAvKgotICAgKglPdXRwdXQgZGVidWdnaW5nIGluZm8gZm9yIGdsb2JhbCB2YXJpYWJsZXMgYW5kIHN0YXRpYyB2YXJpYWJsZXMKLSAgICoJdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIG9uZSByb3V0aW5lLiAgV2UgYWxzbyBuZWVkIHRvIGV4YW1pbmUKLSAgICoJYWxsIHN0YWJzIGRpcmVjdGl2ZXMsIHRvIGZpbmQgdGhlIGRlZmluaXRpb25zIHRvIGFsbCBvZiB0aGUKLSAgICoJYWR2YW5jZWQgZGF0YSB0eXBlcywgYW5kIHRoaXMgaXMgZG9uZSBieSBWTVNfTFNZTV9QYXJzZS4gIFRoaXMKLSAgICoJbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgYW55IGRlZmluaXRpb25zIGFyZSBvdXRwdXQgdG8gdGhlIG9iamVjdAotICAgKglmaWxlLCBzaW5jZSB0aGVyZSBjYW4gYmUgZm9yd2FyZCByZWZlcmVuY2VzIGluIHRoZSBzdGFicwotICAgKglkaXJlY3RpdmVzLiAgV2hlbiB0aHJvdWdoIHdpdGggcGFyc2luZywgdGhlIHRleHQgb2YgdGhlIHN0YWJzCi0gICAqCWRpcmVjdGl2ZSBpcyBhbHRlcmVkLCB3aXRoIHRoZSBkZWZpbml0aW9ucyByZW1vdmVkLCBzbyB0aGF0IGxhdGVyCi0gICAqCXBhc3NlcyB3aWxsIHNlZSBkaXJlY3RpdmVzIGFzIHRoZXkgd291bGQgYmUgd3JpdHRlbiBpZiB0aGUgdHlwZQotICAgKgl3ZXJlIGFscmVhZHkgZGVmaW5lZC4KLSAgICoKLSAgICoJV2UgYWxzbyBsb29rIGZvciBmaWxlcyBhbmQgaW5jbHVkZSBmaWxlcywgYW5kIG1ha2UgYSBsaXN0IG9mCi0gICAqCXRoZW0uICBXZSBleGFtaW5lIHRoZSBzb3VyY2UgZmlsZSBudW1iZXJzIHRvIGVzdGFibGlzaCB0aGUgYWN0dWFsCi0gICAqCWxpbmVzIHRoYXQgY29kZSB3YXMgZ2VuZXJhdGVkIGZyb20sIGFuZCB0aGVuIGdlbmVyYXRlIG9mZnNldHMuCi0gICAqLwotICBWTVNfTFNZTV9QYXJzZSAoKTsKLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIE9ubHkgZGVhbCB3aXRoIFNUQUIgc3ltYm9scyBoZXJlLiAgKi8KLSAgICAgIGlmICghU19JU19ERUJVRyAoc3ltYm9sUCkpCi0JY29udGludWU7Ci0gICAgICAvKgotICAgICAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlLgotICAgICAgICovCi0gICAgICBzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzeW1ib2xQKSkKLQl7Ci0JY2FzZSBOX1NMSU5FOgotCSAgZHNjID0gU19HRVRfREVTQyAoc3ltYm9sUCk7Ci0JICBpZiAoZHNjID4gQ3VyX0ZpbGUtPm1heF9saW5lKQotCSAgICBDdXJfRmlsZS0+bWF4X2xpbmUgPSBkc2M7Ci0JICBpZiAoZHNjIDwgQ3VyX0ZpbGUtPm1pbl9saW5lKQotCSAgICBDdXJfRmlsZS0+bWluX2xpbmUgPSBkc2M7Ci0JICBicmVhazsKLQljYXNlIE5fU086Ci0JICBDdXJfRmlsZSA9IGZpbmRfZmlsZSAoc3ltYm9sUCk7Ci0JICBDdXJfRmlsZS0+ZmxhZyA9IDE7Ci0JICBDdXJfRmlsZS0+bWluX2xpbmUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1NPTDoKLQkgIEN1cl9GaWxlID0gZmluZF9maWxlIChzeW1ib2xQKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9HU1lNOgotCSAgVk1TX0dTWU1fUGFyc2UgKHN5bWJvbFAsIFRleHRfUHNlY3QpOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0xDU1lNOgotCSAgVk1TX0xDU1lNX1BhcnNlIChzeW1ib2xQLCBUZXh0X1BzZWN0KTsKLQkgIGJyZWFrOwotCWNhc2UgTl9GVU46CQkvKiBGb3Igc3RhdGljIGNvbnN0YW50IHN5bWJvbHMgKi8KLQljYXNlIE5fU1RTWU06Ci0JICBWTVNfU1RTWU1fUGFyc2UgKHN5bWJvbFAsIFRleHRfUHNlY3QpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0JCS8qIHN3aXRjaCAqLwotICAgIH0JCQkvKiBmb3IgKi8KLQotICAvKgotICAgKglOb3cgd2UgdGFrZSBhIHF1aWNrIHN3ZWVwIHRocm91Z2ggdGhlIGZpbGVzIGFuZCBhc3NpZ24gb2Zmc2V0cwotICAgKgl0byBlYWNoIG9uZS4gIFRoaXMgd2lsbCBlc3NlbnRpYWxseSBiZSB0aGUgc3RhcnRpbmcgbGluZSBudW1iZXIgdG8KLSAgICoJdGhlIGRlYnVnZ2VyIGZvciBlYWNoIGZpbGUuICBPdXRwdXQgdGhlIGluZm8gZm9yIHRoZSBkZWJ1Z2dlciB0bwotICAgKglzcGVjaWZ5IHRoZSBmaWxlcywgYW5kIHRoZW4gdGVsbCBpdCBob3cgbWFueSBsaW5lcyB0byB1c2UuCi0gICAqLwotICBmb3IgKEN1cl9GaWxlID0gZmlsZV9yb290OyBDdXJfRmlsZTsgQ3VyX0ZpbGUgPSBDdXJfRmlsZS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoQ3VyX0ZpbGUtPm1heF9saW5lID09IDApCi0JY29udGludWU7Ci0gICAgICBpZiAoKHN0cm5jbXAgKEN1cl9GaWxlLT5uYW1lLCAiR05VX0dYWF9JTkNMVURFOiIsIDE2KSA9PSAwKSAmJgotCSAgIWZsYWdfZGVidWcpCi0JY29udGludWU7Ci0gICAgICBpZiAoKHN0cm5jbXAgKEN1cl9GaWxlLT5uYW1lLCAiR05VX0NDX0lOQ0xVREU6IiwgMTUpID09IDApICYmCi0JICAhZmxhZ19kZWJ1ZykKLQljb250aW51ZTsKLSAgICAgIC8qIHNob3cgYSBmZXcgZXh0cmEgbGluZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24gc2VsZWN0ZWQgKi8KLSAgICAgIGlmIChDdXJfRmlsZS0+bWluX2xpbmUgPiAyKQotCUN1cl9GaWxlLT5taW5fbGluZSAtPSAyOwotICAgICAgQ3VyX0ZpbGUtPm9mZnNldCA9IERlYnVnZ2VyX09mZnNldCAtIEN1cl9GaWxlLT5taW5fbGluZSArIDE7Ci0gICAgICBEZWJ1Z2dlcl9PZmZzZXQgKz0gQ3VyX0ZpbGUtPm1heF9saW5lIC0gQ3VyX0ZpbGUtPm1pbl9saW5lICsgMTsKLSAgICAgIGlmIChDdXJfRmlsZS0+c2FtZV9maWxlX2ZwbnQpCi0JewotCSAgQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyID0gQ3VyX0ZpbGUtPnNhbWVfZmlsZV9mcG50LT5maWxlX251bWJlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyID0gKytGaWxlX051bWJlcjsKLQkgIGZpbGVfYXZhaWxhYmxlID0gVk1TX1RCVF9Tb3VyY2VfRmlsZSAoQ3VyX0ZpbGUtPm5hbWUsCi0JCQkJCQlDdXJfRmlsZS0+ZmlsZV9udW1iZXIpOwotCSAgaWYgKCFmaWxlX2F2YWlsYWJsZSkKLQkgICAgewotCSAgICAgIEN1cl9GaWxlLT5maWxlX251bWJlciA9IDA7Ci0JICAgICAgRmlsZV9OdW1iZXItLTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLSAgICAgIFZNU19UQlRfU291cmNlX0xpbmVzIChDdXJfRmlsZS0+ZmlsZV9udW1iZXIsCi0JCQkgICAgQ3VyX0ZpbGUtPm1pbl9saW5lLAotCQkJICAgIEN1cl9GaWxlLT5tYXhfbGluZSAtIEN1cl9GaWxlLT5taW5fbGluZSArIDEpOwotICB9CQkJLyogZm9yICovCi0gIEN1cl9GaWxlID0gKHN0cnVjdCBpbnB1dF9maWxlICopIE5VTEw7Ci0KLSAgLyoKLSAgICoJU2NhbiB0aGUgc3ltYm9scyBhbmQgd3JpdGUgb3V0IHRoZSByb3V0aW5lcwotICAgKgkodGhpcyBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IHN5bWJvbHMgYXJlIGluCi0gICAqCSBvcmRlciBvZiBhc2NlbmRpbmcgdGV4dCBzZWdtZW50IG9mZnNldCkKLSAgICovCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICoJRGVhbCB3aXRoIHRleHQgc3ltYm9scy4KLSAgICAgICAqLwotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJiBTX0dFVF9UWVBFIChzeW1ib2xQKSA9PSBOX1RFWFQpCi0JewotCSAgLyoKLQkgICAqIElnbm9yZSBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggIkwiLCBhcyB0aGV5IGFyZSBsb2NhbCBzeW1ib2xzLgotCSAgICovCi0JICBpZiAoKlNfR0VUX05BTUUgKHN5bWJvbFApID09ICdMJykKLQkgICAgY29udGludWU7Ci0JICAvKgotCSAgICogSWYgdGhlcmUgaXMgYSByb3V0aW5lIHN0YXJ0IGRlZmluZWQsIHRlcm1pbmF0ZSBpdC4KLQkgICAqLwotCSAgaWYgKEN1cnJlbnRfUm91dGluZSkKLQkgICAgVk1TX1RCVF9Sb3V0aW5lX0VuZCAodGV4dF9zaXosIEN1cnJlbnRfUm91dGluZSk7Ci0KLQkgIC8qCi0JICAgKiBDaGVjayBmb3IgJiBza2lwIGR1bW15IGxhYmVscyBsaWtlICJnY2NfY29tcGlsZWQuIi4KLQkgICAqIFRoZXkncmUgaWRlbnRpZmllZCBieSB0aGUgSU5fREVGQVVMVF9TRUNUSU9OIGZsYWcuCi0JICAgKi8KLQkgIGlmICgoU19HRVRfT1RIRVIgKHN5bWJvbFApICYgSU5fREVGQVVMVF9TRUNUSU9OKSAhPSAwICYmCi0JICAgICAgU19HRVRfVkFMVUUgKHN5bWJvbFApID09IDApCi0JICAgIGNvbnRpbnVlOwotCSAgLyoKLQkgICAqIFN0b3JlIHRoZSByb3V0aW5lIGJlZ2luIHRyYWNlYmFjayBpbmZvLgotCSAgICovCi0JICBWTVNfVEJUX1JvdXRpbmVfQmVnaW4gKHN5bWJvbFAsIFRleHRfUHNlY3QpOwotCSAgQ3VycmVudF9Sb3V0aW5lID0gc3ltYm9sUDsKLQkgIC8qCi0JICAgKiBEZWZpbmUgc3ltYm9scyBsb2NhbCB0byB0aGlzIHJvdXRpbmUuCi0JICAgKi8KLQkgIGxvY2FsX3N5bWJvbHNfRFNUIChzeW1ib2xQLCBDdXJyZW50X1JvdXRpbmUpOwotCSAgLyoKLQkgICAqCURvbmUKLQkgICAqLwotCSAgY29udGludWU7Ci0KLQl9Ci0gICAgICAvKgotICAgICAgICoJRGVhbCB3aXRoIFNUQUIgc3ltYm9scy4KLSAgICAgICAqLwotICAgICAgZWxzZSBpZiAoU19JU19ERUJVRyAoc3ltYm9sUCkpCi0JewotCSAgLyoKLQkgICAqICBEaXNwYXRjaCBvbiBTVEFCIHR5cGUuCi0JICAgKi8KLQkgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHN5bWJvbFApKQotCSAgICB7Ci0JCS8qCi0JCSAqCUxpbmUgbnVtYmVyCi0JCSAqLwotCSAgICBjYXNlIE5fU0xJTkU6Ci0JICAgICAgLyogT2Zmc2V0IHRoZSBsaW5lIGludG8gdGhlIGNvcnJlY3QgcG9ydGlvbiBvZiB0aGUgZmlsZS4gICovCi0JICAgICAgaWYgKEN1cl9GaWxlLT5maWxlX251bWJlciA9PSAwKQotCQlicmVhazsKLQkgICAgICB2YWwgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0JICAgICAgLyogU29tZXRpbWVzIHRoZSBzYW1lIG9mZnNldCBnZXRzIHNldmVyYWwgc291cmNlIGxpbmVzCi0JCSBhc3NpZ25lZCB0byBpdC4gIFdlIHNob3VsZCBiZSBzZWxlY3RpdmUgYWJvdXQgd2hpY2gKLQkJIGxpbmVzIHdlIGFsbG93LCB3ZSBzaG91bGQgcHJlZmVyIGxpbmVzIHRoYXQgYXJlIGluCi0JCSB0aGUgbWFpbiBzb3VyY2UgZmlsZSB3aGVuIGRlYnVnZ2luZyBpbmxpbmUgZnVuY3Rpb25zLiAgKi8KLQkgICAgICBpZiAodmFsID09IEN1cl9PZmZzZXQgJiYgQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyICE9IDEpCi0JCWJyZWFrOwotCi0JICAgICAgLyogY2FsY3VsYXRlIGFjdHVhbCBkZWJ1Z2dlciBzb3VyY2UgbGluZSAqLwotCSAgICAgIGRzYyA9IFNfR0VUX0RFU0MgKHN5bWJvbFApICsgQ3VyX0ZpbGUtPm9mZnNldDsKLQkgICAgICBTX1NFVF9ERVNDIChzeW1ib2xQLCBkc2MpOwotCSAgICAgIC8qCi0JICAgICAgICogRGVmaW5lIFBDL0xpbmUgY29ycmVsYXRpb24uCi0JICAgICAgICovCi0JICAgICAgaWYgKEN1cl9PZmZzZXQgPT0gLTEpCi0JCXsKLQkJICAvKgotCQkgICAqIEZpcnN0IE5fU0xJTkU7IHNldCB1cCBpbml0aWFsIGNvcnJlbGF0aW9uLgotCQkgICAqLwotCQkgIFZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiAoZHNjLAotCQkJCQkgICAgICAgdmFsLAotCQkJCQkgICAgICAgVGV4dF9Qc2VjdCwKLQkJCQkJICAgICAgIDApOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKGRzYyAtIEN1cl9MaW5lX051bWJlcikgPD0gMCkKLQkJewotCQkgIC8qCi0JCSAgICogTGluZSBkZWx0YSBpcyBub3QgK3ZlLCB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBsaW5lIGFuZAotCQkgICAqIHN0YXJ0IGEgbmV3IFBDL0xpbmUgY29ycmVsYXRpb24uCi0JCSAgICovCi0JCSAgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uICgwLAotCQkJCQkgICAgICAgdmFsIC0gQ3VyX09mZnNldCwKLQkJCQkJICAgICAgIDAsCi0JCQkJCSAgICAgICAtMSk7Ci0JCSAgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uIChkc2MsCi0JCQkJCSAgICAgICB2YWwsCi0JCQkJCSAgICAgICBUZXh0X1BzZWN0LAotCQkJCQkgICAgICAgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKgotCQkgICAqIExpbmUgZGVsdGEgaXMgK3ZlLCBhbGwgaXMgd2VsbC4KLQkJICAgKi8KLQkJICBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24gKGRzYyAtIEN1cl9MaW5lX051bWJlciwKLQkJCQkJICAgICAgIHZhbCAtIEN1cl9PZmZzZXQsCi0JCQkJCSAgICAgICAwLAotCQkJCQkgICAgICAgMSk7Ci0JCX0KLQkgICAgICAvKiBVcGRhdGUgdGhlIGN1cnJlbnQgbGluZS9QQyBpbmZvLiAgKi8KLQkgICAgICBDdXJfTGluZV9OdW1iZXIgPSBkc2M7Ci0JICAgICAgQ3VyX09mZnNldCA9IHZhbDsKLQkgICAgICBicmVhazsKLQotCQkvKgotCQkgKglTb3VyY2UgZmlsZQotCQkgKi8KLQkgICAgY2FzZSBOX1NPOgotCSAgICAgIC8qIFJlbWVtYmVyIHRoYXQgd2UgaGFkIGEgc291cmNlIGZpbGUgYW5kIGVtaXQKLQkJIHRoZSBzb3VyY2UgZmlsZSBkZWJ1Z2dlciByZWNvcmQuICAqLwotCSAgICAgIEN1cl9GaWxlID0gZmluZF9maWxlIChzeW1ib2xQKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE5fU09MOgotCSAgICAgIC8qIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYXJlIHJlYWxseSBpbiB0aGUgYWN0dWFsCi0JCSBzb3VyY2UgZmlsZSB3aGVuIHdlIGNvbXB1dGUgdGhlIG1heGltdW0gbGluZSBudW1iZXIuCi0JCSBPdGhlcndpc2UgdGhlIGRlYnVnZ2VyIGdldHMgcmVhbGx5IGNvbmZ1c2VkLiAgKi8KLQkgICAgICBDdXJfRmlsZSA9IGZpbmRfZmlsZSAoc3ltYm9sUCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQkJLyogc3dpdGNoICovCi0JfQkJLyogaWYgKElTX0RFQlVHKSAqLwotICAgIH0JCQkvKiBmb3IgKi8KLQotICAgIC8qCi0gICAgICogSWYgdGhlcmUgaXMgYSByb3V0aW5lIHN0YXJ0IGRlZmluZWQsIHRlcm1pbmF0ZSBpdAotICAgICAqIChhbmQgdGhlIGxpbmUgbnVtYmVycykuCi0gICAgICovCi0gICAgaWYgKEN1cnJlbnRfUm91dGluZSkKLSAgICAgIHsKLQkvKiBUZXJtaW5hdGUgdGhlIGxpbmUgbnVtYmVycy4gICovCi0JVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uICgwLAotCQkJCSAgICAgdGV4dF9zaXogLSBTX0dFVF9WQUxVRSAoQ3VycmVudF9Sb3V0aW5lKSwKLQkJCQkgICAgIDAsCi0JCQkJICAgICAtMSk7Ci0JLyogVGVybWluYXRlIHRoZSByb3V0aW5lLiAgKi8KLQlWTVNfVEJUX1JvdXRpbmVfRW5kICh0ZXh0X3NpeiwgQ3VycmVudF9Sb3V0aW5lKTsKLSAgICAgIH0KLQotICAvKiBXcml0ZSB0aGUgVHJhY2ViYWNrIEVuZCBNb2R1bGUgVEJUIHJlY29yZC4gICovCi0gIFZNU19UQlRfTW9kdWxlX0VuZCAoKTsKLX0KLQwKLQotLyogV3JpdGUgYSBWQVgvVk1TIG9iamVjdCBmaWxlIChldmVyeXRoaW5nIGVsc2UgaGFzIGJlZW4gZG9uZSEpLiAgKi8KLQotdm9pZAotdm1zX3dyaXRlX29iamVjdF9maWxlICh0ZXh0X3NpeiwgZGF0YV9zaXosIGJzc19zaXosIHRleHRfZnJhZ19yb290LAotCQkgICAgICAgZGF0YV9mcmFnX3Jvb3QpCi0gICAgIHVuc2lnbmVkIHRleHRfc2l6OwotICAgICB1bnNpZ25lZCBkYXRhX3NpejsKLSAgICAgdW5zaWduZWQgYnNzX3NpejsKLSAgICAgZnJhZ1MgKnRleHRfZnJhZ19yb290OwotICAgICBmcmFnUyAqZGF0YV9mcmFnX3Jvb3Q7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7Ci0KLSAgLyoKLSAgICogSW5pdGlhbGl6ZSBwcm9ncmFtIHNlY3Rpb24gaW5kaWNlczsgdmFsdWVzIGdldCB1cGRhdGVkIGxhdGVyLgotICAgKi8KLSAgUHNlY3RfTnVtYmVyID0gMDsJCS8qIG5leHQgUHNlY3QgSW5kZXggdG8gdXNlICovCi0gIFRleHRfUHNlY3QgPSAtMTsJCS8qIFRleHQgUHNlY3QgSW5kZXggICAqLwotICBEYXRhX1BzZWN0ID0gLTI7CQkvKiBEYXRhIFBzZWN0IEluZGV4ICAgSkY6IFdhcyAtMSAqLwotICBCc3NfUHNlY3QgPSAtMzsJCS8qIEJzcyBQc2VjdCBJbmRleCAgICBKRjogV2FzIC0xICovCi0gIEN0b3JzX1BzZWN0ID0gLTQ7CQkvKiBDdG9ycyBQc2VjdCBJbmRleCAgKi8KLSAgRHRvcnNfUHNlY3QgPSAtNTsJCS8qIER0b3JzIFBzZWN0IEluZGV4ICAqLwotICAvKiBJbml0aWFsaXplIG90aGVyIHN0YXRlIHZhcmlhYmxlcy4gICovCi0gIERhdGFfU2VnbWVudCA9IDA7Ci0gIExvY2FsX0luaXRkX0RhdGFfU2l6ZSA9IDA7Ci0KLSAgLyoKLSAgICoJQ3JlYXRlIHRoZSBhY3R1YWwgb3V0cHV0IGZpbGUgYW5kIHBvcHVsYXRlIGl0IHdpdGggcmVxdWlyZWQKLSAgICoJIm1vZHVsZSBoZWFkZXIiIGluZm9ybWF0aW9uLgotICAgKi8KLSAgQ3JlYXRlX1ZNU19PYmplY3RfRmlsZSAoKTsKLSAgV3JpdGVfVk1TX01IRF9SZWNvcmRzICgpOwotCi0gIC8qCi0gICAqCUNyZWF0ZSB0aGUgRGF0YSBzZWdtZW50OgotICAgKgotICAgKglTaW5jZSB0aGlzIGlzIFJFQUxMWSBoYXJkIHRvIGRvIGFueSBvdGhlciB3YXksCi0gICAqCXdlIGFjdHVhbGx5IG1hbnVmYWN0dXJlIHRoZSBkYXRhIHNlZ21lbnQgYW5kCi0gICAqCXRoZW4gc3RvcmUgdGhlIGFwcHJvcHJpYXRlIHZhbHVlcyBvdXQgb2YgaXQuCi0gICAqCVdlIG5lZWQgdG8gZ2VuZXJhdGUgdGhpcyBlYXJseSwgc28gdGhhdCBnbG9iYWx2YWx1ZXMKLSAgICoJY2FuIGJlIHByb3Blcmx5IGVtaXR0ZWQuCi0gICAqLwotICBpZiAoZGF0YV9zaXogPiAwKQotICAgIHN5bnRoZXNpemVfZGF0YV9zZWdtZW50IChkYXRhX3NpeiwgdGV4dF9zaXosIGRhdGFfZnJhZ19yb290KTsKLQotCi0gIC8qKioqKioqICBHbG9iYWwgU3ltYm9sIERpcmVjdG9yeSAgKioqKioqKi8KLQotICAvKgotICAgKglFbWl0IGdsb2JhbHZhbHVlcyBub3cuICBXZSBtdXN0IGRvIHRoaXMgYmVmb3JlIHRoZSB0ZXh0IHBzZWN0IGlzCi0gICAqCWRlZmluZWQsIG9yIHdlIHdpbGwgZ2V0IGxpbmtlciB3YXJuaW5ncyBhYm91dCBtdWx0aXBseSBkZWZpbmVkCi0gICAqCXN5bWJvbHMuICBBbGwgb2YgdGhlIGdsb2JhbHZhbHVlcyAicmVmZXJlbmNlIiBwc2VjdCAwLCBhbHRob3VnaAotICAgKglpdCByZWFsbHkgZG9lcyBub3QgaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIGl0LgotICAgKi8KLSAgVk1TX0VtaXRfR2xvYmFsdmFsdWVzICh0ZXh0X3NpeiwgZGF0YV9zaXosIERhdGFfU2VnbWVudCk7Ci0gIC8qCi0gICAqCURlZmluZSB0aGUgVGV4dCBQc2VjdAotICAgKi8KLSAgVGV4dF9Qc2VjdCA9IFBzZWN0X051bWJlcisrOwotICBWTVNfUHNlY3RfU3BlYyAoIiRjb2RlIiwgdGV4dF9zaXosIHBzX1RFWFQsIDApOwotICAvKgotICAgKglEZWZpbmUgdGhlIEJTUyBQc2VjdAotICAgKi8KLSAgaWYgKGJzc19zaXogPiAwKQotICAgIHsKLSAgICAgIEJzc19Qc2VjdCA9IFBzZWN0X051bWJlcisrOwotICAgICAgVk1TX1BzZWN0X1NwZWMgKCIkdW5pbml0aWFsaXplZF9kYXRhIiwgYnNzX3NpeiwgcHNfREFUQSwgMCk7Ci0gICAgfQotICAvKgotICAgKiBEZWZpbmUgc3ltYm9scyB0byB0aGUgbGlua2VyLgotICAgKi8KLSAgZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkgKHRleHRfc2l6LCBkYXRhX3Npeik7Ci0gIC8qCi0gICAqCURlZmluZSB0aGUgRGF0YSBQc2VjdAotICAgKi8KLSAgaWYgKGRhdGFfc2l6ID4gMCAmJiBMb2NhbF9Jbml0ZF9EYXRhX1NpemUgPiAwKQotICAgIHsKLSAgICAgIERhdGFfUHNlY3QgPSBQc2VjdF9OdW1iZXIrKzsKLSAgICAgIFZNU19Qc2VjdF9TcGVjICgiJGRhdGEiLCBMb2NhbF9Jbml0ZF9EYXRhX1NpemUsIHBzX0RBVEEsIDApOwotICAgICAgLyoKLSAgICAgICAqIExvY2FsIGluaXRpYWxpemVkIGRhdGEgKE5fREFUQSkgc3ltYm9scyBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8gdGhlCi0gICAgICAgKiBwcm9wZXIgdmFsdWUgb2YgRGF0YV9Qc2VjdCBub3cgdGhhdCBpdCdzIGFjdHVhbGx5IGJlZW4gZGVmaW5lZC4KLSAgICAgICAqIChBIGR1bW15IHZhbHVlIHdhcyB1c2VkIGluIGdsb2JhbF9zeW1ib2xfZGlyZWN0b3J5KCkgYWJvdmUuKQotICAgICAgICovCi0gICAgICBmb3IgKHZzcCA9IFZNU19TeW1ib2xzOyB2c3A7IHZzcCA9IHZzcC0+TmV4dCkKLQlpZiAodnNwLT5Qc2VjdF9JbmRleCA8IDAgJiYgU19HRVRfUkFXX1RZUEUgKHZzcC0+U3ltYm9sKSA9PSBOX0RBVEEpCi0JICB2c3AtPlBzZWN0X0luZGV4ID0gRGF0YV9Qc2VjdDsKLSAgICB9Ci0KLQotICBpZiAoQ3RvcnNfU3ltYm9scyAhPSAwKQotICAgIHsKLSAgICAgIGNoYXIgKnBzX25hbWUgPSAiJGN0b3JzIjsKLSAgICAgIEN0b3JzX1BzZWN0ID0gUHNlY3RfTnVtYmVyKys7Ci0gICAgICBWTVNfUHNlY3RfU3BlYyAocHNfbmFtZSwgQ3RvcnNfU3ltYm9scy0+UHNlY3RfT2Zmc2V0ICsgWFRPUl9TSVpFLAotCQkgICAgICBwc19DVE9SUywgMCk7Ci0gICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChwc19uYW1lLCBDdG9yc19Qc2VjdCwKLQkJCQkgIDAsIEdCTFNZTV9ERUZ8R0JMU1lNX1dFQUspOwotICAgICAgZm9yICh2c3AgPSBDdG9yc19TeW1ib2xzOyB2c3A7IHZzcCA9IHZzcC0+TmV4dCkKLQl2c3AtPlBzZWN0X0luZGV4ID0gQ3RvcnNfUHNlY3Q7Ci0gICAgfQotCi0gIGlmIChEdG9yc19TeW1ib2xzICE9IDApCi0gICAgewotICAgICAgY2hhciAqcHNfbmFtZSA9ICIkZHRvcnMiOwotICAgICAgRHRvcnNfUHNlY3QgPSBQc2VjdF9OdW1iZXIrKzsKLSAgICAgIFZNU19Qc2VjdF9TcGVjIChwc19uYW1lLCBEdG9yc19TeW1ib2xzLT5Qc2VjdF9PZmZzZXQgKyBYVE9SX1NJWkUsCi0JCSAgICAgIHBzX0RUT1JTLCAwKTsKLSAgICAgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKHBzX25hbWUsIER0b3JzX1BzZWN0LAotCQkJCSAgMCwgR0JMU1lNX0RFRnxHQkxTWU1fV0VBSyk7Ci0gICAgICBmb3IgKHZzcCA9IER0b3JzX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQotCXZzcC0+UHNlY3RfSW5kZXggPSBEdG9yc19Qc2VjdDsKLSAgICB9Ci0KLSAgLyoqKioqKiogIFRleHQgSW5mb3JtYXRpb24gYW5kIFJlbG9jYXRpb24gUmVjb3JkcyAgKioqKioqKi8KLQotICAvKgotICAgKglXcml0ZSB0aGUgdGV4dCBzZWdtZW50IGRhdGEKLSAgICovCi0gIGlmICh0ZXh0X3NpeiA+IDApCi0gICAgdm1zX2ZpeHVwX3RleHRfc2VjdGlvbiAodGV4dF9zaXosIHRleHRfZnJhZ19yb290LCBkYXRhX2ZyYWdfcm9vdCk7Ci0gIC8qCi0gICAqCVdyaXRlIHRoZSBkYXRhIHNlZ21lbnQgZGF0YSwgdGhlbiBkaXNjYXJkIGl0LgotICAgKi8KLSAgaWYgKGRhdGFfc2l6ID4gMCkKLSAgICB7Ci0gICAgICB2bXNfZml4dXBfZGF0YV9zZWN0aW9uIChkYXRhX3NpeiwgdGV4dF9zaXopOwotICAgICAgZnJlZSAoRGF0YV9TZWdtZW50KSwgIERhdGFfU2VnbWVudCA9IDA7Ci0gICAgfQotCi0gIGlmIChDdG9yc19TeW1ib2xzICE9IDApCi0gICAgewotICAgICAgdm1zX2ZpeHVwX3h0b3JzX3NlY3Rpb24gKEN0b3JzX1N5bWJvbHMsIEN0b3JzX1BzZWN0KTsKLSAgICB9Ci0KLSAgaWYgKER0b3JzX1N5bWJvbHMgIT0gMCkKLSAgICB7Ci0gICAgICB2bXNfZml4dXBfeHRvcnNfc2VjdGlvbiAoRHRvcnNfU3ltYm9scywgRHRvcnNfUHNlY3QpOwotICAgIH0KLQotCi0gIC8qKioqKioqICBEZWJ1Z2dlciBTeW1ib2wgVGFibGUgUmVjb3JkcyAgKioqKioqKi8KLQotICB2bXNfYnVpbGRfRFNUICh0ZXh0X3Npeik7Ci0KLQotICAvKioqKioqKiAgV3JhcCB0aGluZ3MgdXAgICoqKioqKiovCi0KLSAgLyoKLSAgICoJV3JpdGUgdGhlIEVuZCBPZiBNb2R1bGUgcmVjb3JkCi0gICAqLwotICBpZiAoRW50cnlfUG9pbnRfU3ltYm9sKQotICAgIFdyaXRlX1ZNU19FT01fUmVjb3JkIChUZXh0X1BzZWN0LCBTX0dFVF9WQUxVRSAoRW50cnlfUG9pbnRfU3ltYm9sKSk7Ci0gIGVsc2UKLSAgICBXcml0ZV9WTVNfRU9NX1JlY29yZCAoLTEsICh2YWx1ZVQpIDApOwotCi0gIC8qCi0gICAqCUFsbCBkb25lLCBjbG9zZSB0aGUgb2JqZWN0IGZpbGUKLSAgICovCi0gIENsb3NlX1ZNU19PYmplY3RfRmlsZSAoKTsKLX0KLQotLyogZW5kIG9mIG9iai12bXMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotdm1zLmggYi9nYXMvY29uZmlnL29iai12bXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4ZmRjZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai12bXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1MSArMCwwIEBACi0vKiBWTVMgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLW9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyogVGFnIHRvIHZhbGlkYXRlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCBwcm9jZXNzaW5nICovCi0jZGVmaW5lIE9CSl9WTVMgMQotCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2RlZmluZSBMT05HV09SRF9BTElHTk1FTlQJMgotCi0vKiBUaGlzIG1hY3JvIGNvbnRyb2xzIHN1YnNlY3Rpb24gYWxpZ25tZW50IHdpdGhpbiBhIHNlY3Rpb24uCi0gKgotICogVW5kZXIgVkFYL1ZNUywgdGhlIGxpbmtlciAoYW5kIFBTRUNUIHNwZWNpZmljYXRpb25zKQotICogdGFrZSBjYXJlIG9mIGNvcnJlY3RseSBhbGlnbmluZyB0aGUgc2VnbWVudHMuCi0gKiBEb2luZyB0aGUgYWxpZ25tZW50IGhlcmUgKG9uIGluaXRpYWxpemVkIGRhdGEpIGNhbgotICogbWVzcyB1cCB0aGUgY2FsY3VsYXRpb24gb2YgZ2xvYmFsIGRhdGEgUFNFQ1Qgc2l6ZXMuCi0gKi8KLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKQlcCi0JCSgoKFNFRykgPT0gZGF0YV9zZWN0aW9uKSA/IDAgOiBMT05HV09SRF9BTElHTk1FTlQpCi0KLS8qIFRoaXMgZmxhZyBpcyB1c2VkIHRvIHJlbWVtYmVyIHdoZXRoZXIgd2UgYXJlIGluIHRoZSBjb25zdCBvciB0aGUKLSAgIGRhdGEgc2VjdGlvbi4gIEJ5IGFuZCBsYXJnZSB0aGV5IGFyZSBpZGVudGljYWwsIGJ1dCB3ZSBzZXQgYSBuby13cml0ZQotICAgYml0IGZvciBwc2VjdHMgaW4gdGhlIGNvbnN0IHNlY3Rpb24uICAqLwotCi1leHRlcm4gdW5zaWduZWQgY2hhciBjb25zdF9mbGFnOwotCi0vKiBUaGlzIGlzIG92ZXJsb2FkZWQgb250byBjb25zdF9mbGFnLCBmb3IgY29udmVuaWVuY2UuICBJdCdzIHVzZWQgdG8gZmxhZwotICAgZHVtbXkgbGFiZWxzIGxpa2UgImdjYzJfY29tcGlsZWQuIiAgd2hpY2ggb2NjdXIgYmVmb3JlIHRoZSBmaXJzdCAudGV4dAotICAgb3IgLmRhdGEgc2VjdGlvbiBkaXJlY3RpdmUuICAqLwotCi0jZGVmaW5lIElOX0RFRkFVTFRfU0VDVElPTiAweDgwCi0KLS8qIFRoZXNlIGFyZSBkZWZpbmVkIGluIG9iai12bXMuYy4gKi8KLWV4dGVybiBjb25zdCBzaG9ydCBzZWdfTl9UWVBFW107Ci1leHRlcm4gY29uc3Qgc2VnVCBOX1RZUEVfc2VnW107Ci0KLSN1bmRlZiBOT19SRUxPQwotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBOT19SRUxPQywgUkVMT0NfMzIKLSAgfTsKLQotI2RlZmluZSBOX0JBRE1BRyh4KQkoMCkKLSNkZWZpbmUgTl9UWFRPRkYoeCkJKCBzaXplb2Yoc3RydWN0IGV4ZWMpICkKLSNkZWZpbmUgTl9EQVRPRkYoeCkJKCBOX1RYVE9GRih4KSArICh4KS5hX3RleHQgKQotI2RlZmluZSBOX1RST0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKLSNkZWZpbmUgTl9EUk9GRih4KQkoIE5fVFJPRkYoeCkgKyAoeCkuYV90cnNpemUgKQotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQotI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0KLS8qIFdlIHVzZSB0aGlzIGNvcHkgb2YgdGhlIGV4ZWMgaGVhZGVyIGZvciBWTVMuICBXZSBkbyBub3QgYWN0dWFsbHkgdXNlIGl0LCBidXQKLSAgIHdoYXQgd2UgYWN0dWFsbHkgZG8gaXMgbGV0IGdhcyBmaWxsIGluIHRoZSByZWxldmFudCBzbG90cywgYW5kIHdoZW4gd2UgZ2V0Ci0gICBhcm91bmQgdG8gd3JpdGluZyBhbiBvYmogZmlsZSwgd2UganVzdCBwaWNrIG91dCB3aGF0IHdlIG5lZWQuICAqLwotCi1zdHJ1Y3QgZXhlYwotewotICB1bnNpZ25lZCBsb25nIGFfdGV4dDsJCS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfZGF0YTsJCS8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfYnNzOwkJLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGZvciBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfdHJzaXplOwkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfZHJzaXplOwkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfZW50cnk7CS8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3N5bXM7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSwgaW4gYnl0ZXMgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3QgZXhlYyBoZWFkZXI7CQkvKiBhLm91dCBoZWFkZXIgKi8KLSAgICBsb25nIHN0cmluZ190YWJsZV9zaXplOwkvKiBuYW1lcyArICdcMCcgKyBzaXplb2YoaW50KSAqLwotICB9Ci1vYmplY3RfaGVhZGVyczsKLQotLyogQSBzaW5nbGUgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZQotICogKHRoaXMgc3RhcnRlZCBhcyBhIGNsb25lIG9mIGJvdXQuaCdzIG5saXN0LCBidXQgbXVjaCB3YXMgdW5uZWVkZWQpLgotICovCi1zdHJ1Y3Qgbmxpc3QKLSAgewotICAgIGNoYXIgKm5fbmFtZTsKLSAgICB1bnNpZ25lZCBjaGFyIG5fdHlwZTsJLyogU2VlIGJlbG93CQkJCSovCi0gICAgdW5zaWduZWQgY2hhciBuX290aGVyOwkvKiB1c2VkIGZvciBjb25zdF9mbGFnIGFuZCAiZGVmYXVsdCBzZWN0aW9uIiAqLwotICAgIHVuc2lnbmVkCTogMTY7CQkvKiBwYWRkaW5nIGZvciBhbGlnbm1lbnQgKi8KLSAgICBpbnQgbl9kZXNjOwkJCS8qIHNvdXJjZSBsaW5lIG51bWJlciBmb3IgTl9TTElORSBzdGFicyAqLwotICB9OwotCi0vKiBMZWdhbCB2YWx1ZXMgb2Ygbl90eXBlIChzZWUgYW91dC9zdGFiLmRlZiBmb3IgdGhlIG1ham9yaXR5IG9mIHRoZSBjb2RlcykuCi0gKi8KLSNkZWZpbmUgTl9VTkRGCTAJCS8qIFVuZGVmaW5lZCBzeW1ib2wJKi8KLSNkZWZpbmUgTl9BQlMJMgkJLyogQWJzb2x1dGUgc3ltYm9sCSovCi0jZGVmaW5lIE5fVEVYVAk0CQkvKiBUZXh0IHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9EQVRBCTYJCS8qIERhdGEgc3ltYm9sCQkqLwotI2RlZmluZSBOX0JTUwk4CQkvKiBCU1Mgc3ltYm9sCQkqLwotI2RlZmluZSBOX0ZOCTMxCQkvKiBGaWxlbmFtZSBzeW1ib2wJKi8KLQotI2RlZmluZSBOX0VYVAkxCQkvKiBFeHRlcm5hbCBzeW1ib2wgKE9SJ2QgaW4gd2l0aCBvbmUgb2YgYWJvdmUpCSovCi0jZGVmaW5lIE5fVFlQRQkwMzYJCS8qIE1hc2sgZm9yIGFsbCB0aGUgdHlwZSBiaXRzCQkJKi8KLQotI2RlZmluZSBOX1NUQUIJMDM0MAkJLyogTWFzayBmb3IgYWxsIGJpdHMgdXNlZCBmb3IgU0RCIGVudHJpZXMgCSovCi0KLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLS8qIFNZTUJPTCBUQUJMRSAqLwotLyogU3ltYm9sIHRhYmxlIGVudHJ5IGRhdGEgdHlwZSAqLwotCi10eXBlZGVmIHN0cnVjdCBubGlzdCBvYmpfc3ltYm9sX3R5cGU7CS8qIFN5bWJvbCB0YWJsZSBlbnRyeSAqLwotCi0vKiBTeW1ib2wgdGFibGUgbWFjcm9zIGFuZCBjb25zdGFudHMgKi8KLQotI2RlZmluZSBPQkpfU1lNRklFTERfVFlQRSBzdHJ1Y3QgVk1TX1N5bWJvbCAqCi0KLS8qCi0gKiAgTWFjcm9zIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLSAqICBUaGlzIHN5bnRheGljIGluZGlyZWN0aW9uIGFsbG93cyBpbmRlcGVuZGVuY2UgcmVnYXJkaW5nIGEub3V0IG9yIGNvZmYuCi0gKiAgVGhlIGFyZ3VtZW50IChzKSBvZiBhbGwgdGhlc2UgbWFjcm9zIGlzIGEgcG9pbnRlciB0byBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLSAqLwotCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19JU19FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCi0KLS8qIFRydWUgaWYgc3ltYm9sIGhhcyBiZWVuIGRlZmluZWQsIGllIGlzIGluIE5fe1RFWFQsREFUQSxCU1MsQUJTfSBvciBOX0VYVCAqLwotI2RlZmluZSBTX0lTX0RFRklORUQocykJCShTX0dFVF9UWVBFKHMpICE9IE5fVU5ERikKLQotI2RlZmluZSBTX0lTX0NPTU1PTihzKQkoU19HRVRfVFlQRShzKSA9PSBOX1VOREYgJiYgU19HRVRfVkFMVUUocykgIT0gMCkKLQotI2RlZmluZSBTX0lTX1JFR0lTVEVSKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPT0gTl9SRUdJU1RFUikKLQotLyogVHJ1ZSBpZiBhIGRlYnVnIHNwZWNpYWwgc3ltYm9sIGVudHJ5ICovCi0jZGVmaW5lIFNfSVNfREVCVUcocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX1NUQUIpCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIGxvY2FsIHN5bWJvbCBuYW1lICovCi0vKiBBIHN5bWJvbCBuYW1lIHdob3NlIG5hbWUgYmVnaW4gd2l0aCBeQSBpcyBhIGdhcyBpbnRlcm5hbCBwc2V1ZG8gc3ltYm9sCi0gICBuYW1lbGVzcyBzeW1ib2xzIGNvbWUgZnJvbSAuc3RhYiBkaXJlY3RpdmVzLiAqLwotI2RlZmluZSBTX0lTX0xPQ0FMKHMpCQkoU19HRVRfTkFNRShzKSAmJiBcCi0JCQkJICFTX0lTX0RFQlVHKHMpICYmIFwKLQkJCQkgKHN0cmNocihTX0dFVF9OQU1FKHMpLCAnXDAwMScpICE9IDAgfHwgXAotCQkJCSAgc3RyY2hyKFNfR0VUX05BTUUocyksICdcMDAyJykgIT0gMCB8fCBcCi0JCQkJICAoU19MT0NBTF9OQU1FKHMpICYmICFmbGFnX2tlZXBfbG9jYWxzKSkpCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLwotI2RlZmluZSBTX0lTX0VYVEVSTihzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQotLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGhhcyBiZWVuIGdlbmVyYXRlZCBiZWNhdXNlIG9mIGEgLnN0YWJkIGRpcmVjdGl2ZSAqLwotI2RlZmluZSBTX0lTX1NUQUJEKHMpCQkoU19HRVRfTkFNRShzKSA9PSAoY2hhciAqKTApCi0KLS8qIEFjY2Vzc29ycyAqLwotLyogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX0dFVF9OQU1FKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9uYW1lKQotLyogVGhlIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX0dFVF9PRkZTRVQocykJCSgocyktPnN5X25hbWVfb2Zmc2V0KQotLyogVGhlIHJhdyB0eXBlIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfUkFXX1RZUEUocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUpCi0vKiBUaGUgdHlwZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX1RZUEUocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX1RZUEUpCi0vKiBUaGUgbnVtZXJpYyB2YWx1ZSBvZiB0aGUgc2VnbWVudCAqLwotI2RlZmluZSBTX0dFVF9TRUdNRU5UKHMpCShOX1RZUEVfc2VnW1NfR0VUX1RZUEUocyldKQotLyogVGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX0dFVF9PVEhFUihzKQkJKChzKS0+c3lfc3ltYm9sLm5fb3RoZXIpCi0vKiBUaGUgbl9kZXNjIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19HRVRfREVTQyhzKQkJKChzKS0+c3lfc3ltYm9sLm5fZGVzYykKLQotLyogTW9kaWZpZXJzICovCi0vKiBBc3N1bWUgdGhhdCBhIHN5bWJvbCBjYW5ub3QgYmUgc2ltdWx0YW5lb3VzbHkgaW4gbW9yZSB0aGFuIG9uIHNlZ21lbnQgKi8KLS8qIHNldCBzZWdtZW50ICovCi0jZGVmaW5lIFNfU0VUX1NFR01FTlQocyxzZWcpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJj0gfk5fVFlQRSwocyktPnN5X3N5bWJvbC5uX3R5cGV8PVNFR01FTlRfVE9fU1lNQk9MX1RZUEUoc2VnKSkKLS8qIFRoZSBzeW1ib2wgaXMgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19TRVRfRVhURVJOQUwocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSB8PSBOX0VYVCkKLS8qIFRoZSBzeW1ib2wgaXMgbm90IGV4dGVybmFsICovCi0jZGVmaW5lIFNfQ0xFQVJfRVhURVJOQUwocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9FWFQpCi0vKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX1NFVF9OQU1FKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX25hbWUgPSAodikpCi0vKiBTZXQgdGhlIG9mZnNldCBpbiB0aGUgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNfU0VUX09GRlNFVChzLHYpCSgocyktPnN5X25hbWVfb2Zmc2V0ID0gKHYpKQotLyogU2V0IHRoZSBuX290aGVyIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19TRVRfT1RIRVIocyx2KQkoKHMpLT5zeV9zeW1ib2wubl9vdGhlciA9ICh2KSkKLS8qIFNldCB0aGUgbl9kZXNjIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19TRVRfREVTQyhzLHYpCQkoKHMpLT5zeV9zeW1ib2wubl9kZXNjID0gKHYpKQotLyogU2V0IHRoZSBuX3R5cGUgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9UWVBFKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPSAodikpCi0KLQotLyogRmlsZSBoZWFkZXIgbWFjcm8gYW5kIHR5cGUgZGVmaW5pdGlvbiAqLwotCi0jZGVmaW5lIEhfR0VUX1RFWFRfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfdGV4dCkKLSNkZWZpbmUgSF9HRVRfREFUQV9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9kYXRhKQotI2RlZmluZSBIX0dFVF9CU1NfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfYnNzKQotCi0jZGVmaW5lIEhfU0VUX1RFWFRfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV90ZXh0ID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfVEVYVCwgKHYpKSkKLSNkZWZpbmUgSF9TRVRfREFUQV9TSVpFKGgsdikJCSgoaCktPmhlYWRlci5hX2RhdGEgPSBtZF9zZWN0aW9uX2FsaWduKFNFR19EQVRBLCAodikpKQotI2RlZmluZSBIX1NFVF9CU1NfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9ic3MgPSBtZF9zZWN0aW9uX2FsaWduKFNFR19CU1MsICh2KSkpCi0KLSNkZWZpbmUgSF9TRVRfU1RSSU5HX1NJWkUoaCx2KQkJKChoKS0+c3RyaW5nX3RhYmxlX3NpemUgPSAodikpCi0jZGVmaW5lIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfc3ltcyA9ICh2KSAqIFwKLQkJCQkJIHNpemVvZihzdHJ1Y3Qgbmxpc3QpKQotCi0vKiBsaW5lIG51bWJlcmluZyBzdHVmZi4gKi8KLSNkZWZpbmUgT0JKX0VNSVRfTElORU5PKGEsIGIsIGMpCXs7fQotCi0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2socykJezt9Ci0KLS8qIEZvcmNlIHN0cnVjdHVyZSB0YWdzIGludG8gc2NvcGUgc28gdGhhdCB0aGVpciB1c2UgaW4gcHJvdG90eXBlcwotICAgd2lsbCBuZXZlciBiZSB0aGVpciBmaXJzdCBvY2N1cmFuY2UuICAqLwotc3RydWN0IGZpeDsKLXN0cnVjdCBmcmFnOwotCi0vKiBvYmotdm1zIHJvdXRpbmVzIHZpc2libGUgdG8gdGhlIHJlc3Qgb2YgZ2FzLiAgKi8KLQotZXh0ZXJuIHZvaWQgdGNfYW91dF9maXhfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqLHN0cnVjdCBmaXggKixyZWxheF9hZGRyZXNzVCkpOwotCi1leHRlcm4gaW50IHZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZiBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNkZWZpbmUgUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OKFgpCXZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZihYKQotCi0vKiBDb21waWxlci1nZW5lcmF0ZWQgbGFiZWwgIl9fdmF4X2dfZG91YmxlcyIgaXMgdXNlZCB0byBhdWdtZW50IC5zdGFicy4gKi8KLWV4dGVybiB2b2lkIHZtc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNkZWZpbmUgb2JqX2Zyb2JfbGFiZWwoWCkgdm1zX2NoZWNrX2Zvcl9zcGVjaWFsX2xhYmVsKFgpCi0KLWV4dGVybiB2b2lkIHZtc19jaGVja19mb3JfbWFpbiBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIHZtc193cml0ZV9vYmplY3RfZmlsZSBQQVJBTVMgKCh1bnNpZ25lZCx1bnNpZ25lZCx1bnNpZ25lZCwKLQkJCQkJICAgc3RydWN0IGZyYWcgKixzdHJ1Y3QgZnJhZyAqKSk7Ci0KLS8qIFZNUyBleGVjdXRhYmxlcyBhcmUgbm90aGluZyBsaWtlIGEub3V0LCBidXQgdGhlIFZNUyBwb3J0IG9mIGdjYyB1c2VzCi0gICBhLm91dCBmb3JtYXQgc3RhYnMgd2hpY2ggb2JqLXZtcy5jIHRoZW4gdHJhbnNsYXRlcy4gICovCi0KLSNkZWZpbmUgQU9VVF9TVEFCUwotCi0MCi0jaWZkZWYgV0FOVF9WTVNfT0JKX0RFRlMKLQotLyogVGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciBjb25zdGFudHMgdXNlZCB3aXRoaW4KLSAgIHRoZSBhY3R1YWwgVk1TIG9iamVjdCBmaWxlLiAgV2UgZG8gbm90IHVzZSBhICQgaW4gdGhlIHN5bWJvbHMgKGFzIHBlcgotICAgdXN1YWwgVk1TIGNvbnZlbnRpb24pIHNpbmNlIFN5c3RlbSBWIGdhZ3Mgb24gaXQuICAqLwotCi0jZGVmaW5lCU9CSl9TX0NfSERSCTAKLSNkZWZpbmUJT0JKX1NfQ19IRFJfTUhECTAKLSNkZWZpbmUJT0JKX1NfQ19IRFJfTE5NCTEKLSNkZWZpbmUJT0JKX1NfQ19IRFJfU1JDCTIKLSNkZWZpbmUJT0JKX1NfQ19IRFJfVFRMCTMKLSNkZWZpbmUJT0JKX1NfQ19IRFJfQ1BSCTQKLSNkZWZpbmUJT0JKX1NfQ19IRFJfTVRDCTUKLSNkZWZpbmUJT0JKX1NfQ19IRFJfR1RYCTYKLSNkZWZpbmUJT0JKX1NfQ19HU0QJMQotI2RlZmluZQlPQkpfU19DX0dTRF9QU0MJMAotI2RlZmluZQlPQkpfU19DX0dTRF9TWU0JMQotI2RlZmluZQlPQkpfU19DX0dTRF9FUE0JMgotI2RlZmluZQlPQkpfU19DX0dTRF9QUk8JMwotI2RlZmluZQlPQkpfU19DX0dTRF9TWU1XCTQKLSNkZWZpbmUJT0JKX1NfQ19HU0RfRVBNVwk1Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX1BST1cJNgotI2RlZmluZQlPQkpfU19DX0dTRF9JREMJNwotI2RlZmluZQlPQkpfU19DX0dTRF9FTlYJOAotI2RlZmluZQlPQkpfU19DX0dTRF9MU1kJOQotI2RlZmluZQlPQkpfU19DX0dTRF9MRVBNCTEwCi0jZGVmaW5lCU9CSl9TX0NfR1NEX0xQUk8JMTEKLSNkZWZpbmUJT0JKX1NfQ19HU0RfU1BTQwkxMgotI2RlZmluZQlPQkpfU19DX1RJUgkyCi0jZGVmaW5lCU9CSl9TX0NfRU9NCTMKLSNkZWZpbmUJT0JKX1NfQ19EQkcJNAotI2RlZmluZQlPQkpfU19DX1RCVAk1Ci0jZGVmaW5lCU9CSl9TX0NfTE5LCTYKLSNkZWZpbmUJT0JKX1NfQ19FT01XCTcKLSNkZWZpbmUJT0JKX1NfQ19NQVhSRUNUWVAJNwotI2RlZmluZQlPQkpfU19LX1NVQlRZUAkxCi0jZGVmaW5lCU9CSl9TX0NfU1VCVFlQCTEKLSNkZWZpbmUJT0JKX1NfQ19NQVhSRUNTSVoJMjA0OAotI2RlZmluZQlPQkpfU19DX1NUUkxWTAkwCi0jZGVmaW5lCU9CSl9TX0NfU1lNU0laCTMxCi0jZGVmaW5lCU9CSl9TX0NfU1RPUkVQTElNCS0xCi0jZGVmaW5lCU9CSl9TX0NfUFNDQUxJTElNCTkKLQwKLSNkZWZpbmUJTUhEX1NfQ19NSEQJMAotI2RlZmluZQlNSERfU19DX0xOTQkxCi0jZGVmaW5lCU1IRF9TX0NfU1JDCTIKLSNkZWZpbmUJTUhEX1NfQ19UVEwJMwotI2RlZmluZQlNSERfU19DX0NQUgk0Ci0jZGVmaW5lCU1IRF9TX0NfTVRDCTUKLSNkZWZpbmUJTUhEX1NfQ19HVFgJNgotI2RlZmluZQlNSERfU19DX01BWEhEUlRZUAk2Ci0MCi0jZGVmaW5lCUdTRF9TX0tfRU5UUklFUwkxCi0jZGVmaW5lCUdTRF9TX0NfRU5UUklFUwkxCi0jZGVmaW5lCUdTRF9TX0NfUFNDCTAKLSNkZWZpbmUJR1NEX1NfQ19TWU0JMQotI2RlZmluZQlHU0RfU19DX0VQTQkyCi0jZGVmaW5lCUdTRF9TX0NfUFJPCTMKLSNkZWZpbmUJR1NEX1NfQ19TWU1XCTQKLSNkZWZpbmUJR1NEX1NfQ19FUE1XCTUKLSNkZWZpbmUJR1NEX1NfQ19QUk9XCTYKLSNkZWZpbmUJR1NEX1NfQ19JREMJNwotI2RlZmluZQlHU0RfU19DX0VOVgk4Ci0jZGVmaW5lCUdTRF9TX0NfTFNZCTkKLSNkZWZpbmUJR1NEX1NfQ19MRVBNCTEwCi0jZGVmaW5lCUdTRF9TX0NfTFBSTwkxMQotI2RlZmluZQlHU0RfU19DX1NQU0MJMTIKLSNkZWZpbmUJR1NEX1NfQ19TWU1WCTEzCi0jZGVmaW5lCUdTRF9TX0NfRVBNVgkxNAotI2RlZmluZQlHU0RfU19DX1BST1YJMTUKLSNkZWZpbmUJR1NEX1NfQ19NQVhSRUNUWVAJMTUKLQwKLSNkZWZpbmUJR1NZX1NfTV9XRUFLCTEKLSNkZWZpbmUJR1NZX1NfTV9ERUYJMgotI2RlZmluZQlHU1lfU19NX1VOSQk0Ci0jZGVmaW5lCUdTWV9TX01fUkVMCTgKLQotI2RlZmluZQlMU1lfU19NX0RFRgkyCi0jZGVmaW5lCUxTWV9TX01fUkVMCTgKLQotI2RlZmluZQlFTlZfU19NX0RFRgkxCi0jZGVmaW5lCUVOVl9TX01fTkVTVEVECTIKLQwKLSNkZWZpbmUJR1BTX1NfTV9QSUMJMQotI2RlZmluZQlHUFNfU19NX0xJQgkyCi0jZGVmaW5lCUdQU19TX01fT1ZSCTQKLSNkZWZpbmUJR1BTX1NfTV9SRUwJOAotI2RlZmluZQlHUFNfU19NX0dCTAkxNgotI2RlZmluZQlHUFNfU19NX1NIUgkzMgotI2RlZmluZQlHUFNfU19NX0VYRQk2NAotI2RlZmluZQlHUFNfU19NX1JECTEyOAotI2RlZmluZQlHUFNfU19NX1dSVAkyNTYKLSNkZWZpbmUJR1BTX1NfTV9WRUMJNTEyCi0jZGVmaW5lCUdQU19TX0tfTkFNRQk5Ci0jZGVmaW5lCUdQU19TX0NfTkFNRQk5Ci0MCi0jZGVmaW5lCVRJUl9TX0NfU1RBX0dCTAkwCi0jZGVmaW5lCVRJUl9TX0NfU1RBX1NCCTEKLSNkZWZpbmUJVElSX1NfQ19TVEFfU1cJMgotI2RlZmluZQlUSVJfU19DX1NUQV9MVwkzCi0jZGVmaW5lCVRJUl9TX0NfU1RBX1BCCTQKLSNkZWZpbmUJVElSX1NfQ19TVEFfUFcJNQotI2RlZmluZQlUSVJfU19DX1NUQV9QTAk2Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX1VCCTcKLSNkZWZpbmUJVElSX1NfQ19TVEFfVVcJOAotI2RlZmluZQlUSVJfU19DX1NUQV9CRkkJOQotI2RlZmluZQlUSVJfU19DX1NUQV9XRkkJMTAKLSNkZWZpbmUJVElSX1NfQ19TVEFfTEZJCTExCi0jZGVmaW5lCVRJUl9TX0NfU1RBX0VQTQkxMgotI2RlZmluZQlUSVJfU19DX1NUQV9DS0FSRwkxMwotI2RlZmluZQlUSVJfU19DX1NUQV9XUEIJMTQKLSNkZWZpbmUJVElSX1NfQ19TVEFfV1BXCTE1Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX1dQTAkxNgotI2RlZmluZQlUSVJfU19DX1NUQV9MU1kJMTcKLSNkZWZpbmUJVElSX1NfQ19TVEFfTElUCTE4Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX0xFUE0JMTkKLSNkZWZpbmUJVElSX1NfQ19NQVhTVEFDT0QJMTkKLSNkZWZpbmUJVElSX1NfQ19NSU5TVE9DT0QJMjAKLSNkZWZpbmUJVElSX1NfQ19TVE9fU0IJMjAKLSNkZWZpbmUJVElSX1NfQ19TVE9fU1cJMjEKLSNkZWZpbmUJVElSX1NfQ19TVE9fTAkyMgotI2RlZmluZQlUSVJfU19DX1NUT19CRAkyMwotI2RlZmluZQlUSVJfU19DX1NUT19XRAkyNAotI2RlZmluZQlUSVJfU19DX1NUT19MRAkyNQotI2RlZmluZQlUSVJfU19DX1NUT19MSQkyNgotI2RlZmluZQlUSVJfU19DX1NUT19QSURSCTI3Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1BJQ1IJMjgKLSNkZWZpbmUJVElSX1NfQ19TVE9fUlNCCTI5Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JTVwkzMAotI2RlZmluZQlUSVJfU19DX1NUT19STAkzMQotI2RlZmluZQlUSVJfU19DX1NUT19WUFMJMzIKLSNkZWZpbmUJVElSX1NfQ19TVE9fVVNCCTMzCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1VTVwkzNAotI2RlZmluZQlUSVJfU19DX1NUT19SVUIJMzUKLSNkZWZpbmUJVElSX1NfQ19TVE9fUlVXCTM2Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX0IJMzcKLSNkZWZpbmUJVElSX1NfQ19TVE9fVwkzOAotI2RlZmluZQlUSVJfU19DX1NUT19SQgkzOQotI2RlZmluZQlUSVJfU19DX1NUT19SVwk0MAotI2RlZmluZQlUSVJfU19DX1NUT19SSVZCCTQxCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1BJUlIJNDIKLSNkZWZpbmUJVElSX1NfQ19NQVhTVE9DT0QJNDIKLSNkZWZpbmUJVElSX1NfQ19NSU5PUFJDT0QJNTAKLSNkZWZpbmUJVElSX1NfQ19PUFJfTk9QCTUwCi0jZGVmaW5lCVRJUl9TX0NfT1BSX0FERAk1MQotI2RlZmluZQlUSVJfU19DX09QUl9TVUIJNTIKLSNkZWZpbmUJVElSX1NfQ19PUFJfTVVMCTUzCi0jZGVmaW5lCVRJUl9TX0NfT1BSX0RJVgk1NAotI2RlZmluZQlUSVJfU19DX09QUl9BTkQJNTUKLSNkZWZpbmUJVElSX1NfQ19PUFJfSU9SCTU2Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX0VPUgk1NwotI2RlZmluZQlUSVJfU19DX09QUl9ORUcJNTgKLSNkZWZpbmUJVElSX1NfQ19PUFJfQ09NCTU5Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX0lOU1YJNjAKLSNkZWZpbmUJVElSX1NfQ19PUFJfQVNICTYxCi0jZGVmaW5lCVRJUl9TX0NfT1BSX1VTSAk2MgotI2RlZmluZQlUSVJfU19DX09QUl9ST1QJNjMKLSNkZWZpbmUJVElSX1NfQ19PUFJfU0VMCTY0Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX1JFREVGCTY1Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX0RGTElUCTY2Ci0jZGVmaW5lCVRJUl9TX0NfTUFYT1BSQ09ECTY2Ci0jZGVmaW5lCVRJUl9TX0NfTUlOQ1RMQ09ECTgwCi0jZGVmaW5lCVRJUl9TX0NfQ1RMX1NFVFJCCTgwCi0jZGVmaW5lCVRJUl9TX0NfQ1RMX0FVR1JCCTgxCi0jZGVmaW5lCVRJUl9TX0NfQ1RMX0RGTE9DCTgyCi0jZGVmaW5lCVRJUl9TX0NfQ1RMX1NUTE9DCTgzCi0jZGVmaW5lCVRJUl9TX0NfQ1RMX1NUS0RMCTg0Ci0jZGVmaW5lCVRJUl9TX0NfTUFYQ1RMQ09ECTg0Ci0MCi0vKgotICoJRGVidWdnZXIgc3ltYm9sIGRlZmluaXRpb25zOiAgVGhlc2UgYXJlIGRvbmUgYnkgaGFuZCwgYXMgbm8KLSAqCQkJCQltYWNoaW5lLXJlYWRhYmxlIHZlcnNpb24gc2VlbXMKLSAqCQkJCQl0byBiZSBhdmFpbGFibGUuCi0gKi8KLSNkZWZpbmUgRFNUX1NfQ19DCSAgNwkvKiBMYW5ndWFnZSA9PSAiQyIJKi8KLSNkZWZpbmUgRFNUX1NfQ19DWFgJIDE1CS8qIExhbmd1YWdlID09ICJDKysiCSovCi0jZGVmaW5lIERTVF9TX0NfVkVSU0lPTgkxNTMKLSNkZWZpbmUJRFNUX1NfQ19TT1VSQ0UJMTU1CS8qIFNvdXJjZSBmaWxlCQkqLwotI2RlZmluZSBEU1RfU19DX1BST0xPRwkxNjIKLSNkZWZpbmUJRFNUX1NfQ19CTEtCRUcJMTc2CS8qIEJlZ2lubmluZyBvZiBibG9jawkqLwotI2RlZmluZQlEU1RfU19DX0JMS0VORAkxNzcJLyogRW5kIG9mIGJsb2NrCSovCi0jZGVmaW5lIERTVF9TX0NfRU5UUlkJMTgxCi0jZGVmaW5lIERTVF9TX0NfUFNFQ1QJMTg0Ci0jZGVmaW5lCURTVF9TX0NfTElORV9OVU0JMTg1CS8qIExpbmUgTnVtYmVyCQkqLwotI2RlZmluZSBEU1RfU19DX0xCTE9STElUCTE4NgotI2RlZmluZSBEU1RfU19DX0xBQkVMCTE4NwotI2RlZmluZQlEU1RfU19DX01PREJFRwkxODgJLyogQmVnaW5uaW5nIG9mIG1vZHVsZQkqLwotI2RlZmluZQlEU1RfU19DX01PREVORAkxODkJLyogRW5kIG9mIG1vZHVsZQkqLwotI2RlZmluZQlEU1RfU19DX1JUTkJFRwkxOTAJLyogQmVnaW5uaW5nIG9mIHJvdXRpbmUJKi8KLSNkZWZpbmUJRFNUX1NfQ19SVE5FTkQJMTkxCS8qIEVuZCBvZiByb3V0aW5lCSovCi0jZGVmaW5lCURTVF9TX0NfREVMVEFfUENfVwkxCS8qIEluY3IgUEMJKi8KLSNkZWZpbmUJRFNUX1NfQ19JTkNSX0xJTlVNCTIJLyogSW5jciBMaW5lICMJKi8KLSNkZWZpbmUJRFNUX1NfQ19JTkNSX0xJTlVNX1cJMwkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSCTQKLSNkZWZpbmUgRFNUX1NfQ19TRVRfTElOVU1fSU5DUl9XCTUKLSNkZWZpbmUgRFNUX1NfQ19SRVNFVF9MSU5VTV9JTkNSCTYKLSNkZWZpbmUgRFNUX1NfQ19CRUdfU1RNVF9NT0RFCTcKLSNkZWZpbmUgRFNUX1NfQ19FTkRfU1RNVF9NT0RFCTgKLSNkZWZpbmUJRFNUX1NfQ19TRVRfTElORV9OVU0JOQkvKiBTZXQgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDCQkxMAotI2RlZmluZSBEU1RfU19DX1NFVF9QQ19XCQkxMQotI2RlZmluZSBEU1RfU19DX1NFVF9QQ19MCQkxMgotI2RlZmluZSBEU1RfU19DX1NFVF9TVE1UTlVNCTEzCi0jZGVmaW5lIERTVF9TX0NfVEVSTQkJMTQJLyogRW5kIG9mIGxpbmVzCSovCi0jZGVmaW5lIERTVF9TX0NfVEVSTV9XCQkxNQkvKiBFbmQgb2YgbGluZXMJKi8KLSNkZWZpbmUJRFNUX1NfQ19TRVRfQUJTX1BDCTE2CS8qIFNldCBQQwkqLwotI2RlZmluZQlEU1RfU19DX0RFTFRBX1BDX0wJMTcJLyogSW5jciBQQwkqLwotI2RlZmluZSBEU1RfU19DX0lOQ1JfTElOVU1fTAkxOAkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9CCTE5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfTElOVU1fTAkyMAkvKiBTZXQgTGluZSAjCSovCi0jZGVmaW5lCURTVF9TX0NfVEVSTV9MCQkyMQkvKiBFbmQgb2YgbGluZXMJKi8KLS8qIHRoZXNlIGFyZSB1c2VkIHdpdGggRFNUX1NfQ19TT1VSQ0UgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVDTEZJTEUJIDEJLyogRGVjbGFyZSBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRGSUxFCSAyCS8qIFNldCBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfTAkgMwkvKiBTZXQgcmVjb3JkLCBsb25nd29yZCB2YWx1ZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfVwkgNAkvKiBTZXQgcmVjb3JkLCB3b3JkIHZhbHVlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0RFRkxJTkVTX1cJMTAJLyogIyBvZiBsaW5lLCB3b3JkIGNvdW50ZXIgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfQgkxMQkvKiAjIG9mIGxpbmUsIGJ5dGUgY291bnRlciAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19GT1JNRkVFRAkxNgkvKiBeTCBjb3VudHMgYXMgYSByZWNvcmQgKi8KLS8qIHRoZSBmb2xsb3dpbmcgYXJlIHRoZSBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgZGF0YSB0eXBlcy4gIEFueXRoaW5nIG5vdCBvbgotICogdGhlIGxpc3QgaXMgaW5jbHVkZWQgdW5kZXIgJ2FkdmFuY2VkX3R5cGUnCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQ0hBUgkJMHgwMgotI2RlZmluZSBEQkdfU19DX1VTSU5UCQkweDAzCi0jZGVmaW5lIERCR19TX0NfVUxJTlQJCTB4MDQKLSNkZWZpbmUgREJHX1NfQ19VUVVBRAkJMHgwNQotI2RlZmluZSBEQkdfU19DX1NDSEFSCQkweDA2Ci0jZGVmaW5lIERCR19TX0NfU1NJTlQJCTB4MDcKLSNkZWZpbmUgREJHX1NfQ19TTElOVAkJMHgwOAotI2RlZmluZSBEQkdfU19DX1NRVUFECQkweDA5Ci0jZGVmaW5lIERCR19TX0NfUkVBTDQJCTB4MGEKLSNkZWZpbmUgREJHX1NfQ19SRUFMOAkJMHgwYgkJLyogRF9mbG9hdCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19DT01QTFg0CQkweDBjCQkvKiAyeEZfZmxvYXQgY29tcGxleCBmbG9hdCAqLwotI2RlZmluZSBEQkdfU19DX0NPTVBMWDgJCTB4MGQJCS8qIDJ4RF9mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX1JFQUw4X0cJCTB4MWIJCS8qIEdfZmxvYXQgZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfQ09NUExYOF9HCTB4MWQJCS8qIDJ4R19mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX0ZVTkNUSU9OX0FERFIJMHgxNwotI2RlZmluZSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUJMHhhMwotLyogIFNvbWUgb2YgdGhlc2UgYXJlIGp1c3QgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICBbcHJdCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUQQkJMHgwMQkvKiB1bnNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUVQkJMHgyMgkvKiB1bnNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1NCSVRBCQkweDI5CS8qIHNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19TQklUVQkJMHgyYQkvKiBzaWduZWQsIHVuYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19DU1RSSU5HCQkweDJlCS8qIGFzY2l6ICgnXDAnIHRlcm1pbmF0ZWQpIHN0cmluZyAqLwotI2RlZmluZSBEQkdfU19DX1dDSEFSCQkweDM4CS8qIHdjaGFyX3QgKi8KLS8qICBUaGVzZSBhcmUgZGVzY3JpcHRvciBjbGFzcyBjb2Rlcy4KLSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19TCQkweDAxCS8qIHN0YXRpYyAoZml4ZWQgbGVuZ3RoKSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19ECQkweDAyCS8qIGR5bmFtaWMgc3RyaW5nIChub3QgdmlhIG1hbGxvYyEpICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX0EJCTB4MDQJLyogYXJyYXkgKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfVUJTCQkweDBkCS8qIHVuYWxpZ25lZCBiaXQgc3RyaW5nICovCi0vKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkZWZpbml0aW9ucyBvZiBzdHJ1Y3QKLSAqICB1bmlvbiBhbmQgZW51bSByZWNvcmRzCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19FTlVNX0lURU0JCTB4YTQKLSNkZWZpbmUgREJHX1NfQ19FTlVNX1NUQVJUCQkweGE1Ci0jZGVmaW5lIERCR19TX0NfRU5VTV9FTkQJCTB4YTYKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1RfSVRFTQkJRFNUX0tfVkZMQUdTX0JJVE9GRlMJLyogMHhmZiAqLwotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9TVEFSVAkJMHhhYgotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9FTkQJCTB4YWMKLSNkZWZpbmUgRFNUX0tfVFlQU1BFQwkJCTB4YWYJCS8qIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotLyogVGhlc2UgY29kZXMgYXJlIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZHMKLSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfTk9WQUwJCTB4ODAJLyogc3RydWN0IGRlZmluaXRpb24gb25seSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfRFNDCQkweGZhCS8qIGRlc2NyaXB0b3IgdXNlZCAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfVFZTCQkweGZiCS8qIHRyYWlsaW5nIHZhbHVlIHNwZWNpZmllZCAqLwotI2RlZmluZSBEU1RfS19WU19GT0xMT1dTCQkweGZkCS8qIHZhbHVlIHNwZWMgZm9sbG93cyAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfQklUT0ZGUwkJMHhmZgkvKiB2YWx1ZSBjb250YWlucyBiaXQgb2Zmc2V0ICovCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfTElURVJBTAkwCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfQUREUgkxCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfREVTQwkyCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfUkVHCTMKLSNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9BUAkweDBjCS8qIFIxMiAqLwotI2RlZmluZSBEU1RfS19SRUdfVkFYX0ZQCTB4MGQJLyogUjEzICovCi0jZGVmaW5lIERTVF9LX1JFR19WQVhfU1AJMHgwZQkvKiBSMTQgKi8KLSNkZWZpbmUgRFNUX1ZfVkFMS0lORAkJMAkvKiBvZmZzZXQgb2YgdmFsa2luZCBmaWVsZCAqLwotI2RlZmluZSBEU1RfVl9JTkRJUkVDVAkJMgkvKiBvZmZzZXQgdG8gaW5kaXJlY3QgYml0ICovCi0jZGVmaW5lIERTVF9WX0RJU1AJCTMJLyogb2Zmc2V0IHRvIGRpc3BsYWNlbWVudCBiaXQgKi8KLSNkZWZpbmUgRFNUX1ZfUkVHTlVNCQk0CS8qIG9mZnNldCB0byByZWdpc3RlciBudW1iZXIgKi8KLSNkZWZpbmUgRFNUX01fSU5ESVJFQ1QJCSgxPDxEU1RfVl9JTkRJUkVDVCkKLSNkZWZpbmUgRFNUX01fRElTUAkJKDE8PERTVF9WX0RJU1ApCi0jZGVmaW5lIERCR19DX0ZVTkNUSU9OX1BBUkFNCS8qIDB4YzkgKi8JXAotCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9BUDw8RFNUX1ZfUkVHTlVNKSkKLSNkZWZpbmUgREJHX0NfTE9DQUxfU1lNCQkvKiAweGQ5ICovCVwKLQkoRFNUX0tfVkFMS0lORF9BRERSfERTVF9NX0RJU1B8KERTVF9LX1JFR19WQVhfRlA8PERTVF9WX1JFR05VTSkpCi0vKiBLaW5kcyBvZiB2YWx1ZSBzcGVjaWZpY2F0aW9ucwotICovCi0jZGVmaW5lIERTVF9LX1ZTX0FMTE9DX1NQTElUCTMJLyogc3BsaXQgbGlmZXRpbWUgKi8KLS8qIEtpbmRzIG9mIHR5cGUgc3BlY2lmaWNhdGlvbnMKLSAqLwotI2RlZmluZSBEU1RfS19UU19BVE9NCQkweDAxCS8qIGF0b21pYyB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfRFNDCQkweDAyCS8qIGRlc2NyaXB0b3IgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX0lORAkJMHgwMwkvKiBpbmRpcmVjdCB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfVFBUUgkJMHgwNAkvKiB0eXBlZCBwb2ludGVyIHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19QVFIJCTB4MDUJLyogcG9pbnRlciB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfQVJSQVkJCTB4MDcJLyogYXJyYXkgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX05PVl9MRU5HCTB4MGUJLyogbm92ZWwgbGVuZ3RoIHR5cGUgc3BlYyAqLwotLyogIFRoZXNlIGFyZSB0aGUgY29kZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgc3VmZml4IHJlY29yZHMgdG8gZGV0ZXJtaW5lIHRoZQotICogIGFjdHVhbCBkYXRhIHR5cGUKLSAqLwotI2RlZmluZSBEQkdfU19DX0JBU0lDCQkJRFNUX0tfVFNfQVRPTQotI2RlZmluZSBEQkdfU19DX0JBU0lDX0FSUkFZCQlEU1RfS19UU19EU0MKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1QJCQlEU1RfS19UU19JTkQKLSNkZWZpbmUgREJHX1NfQ19QT0lOVEVSCQkJRFNUX0tfVFNfVFBUUgotI2RlZmluZSBEQkdfU19DX1ZPSUQJCQlEU1RfS19UU19QVFIKLSNkZWZpbmUgREJHX1NfQ19DT01QTEVYX0FSUkFZCQlEU1RfS19UU19BUlJBWQotCi0jZW5kaWYJLyogV0FOVF9WTVNfT0JKX0RFRlMgKi8KLQotLyogZW5kIG9mIG9iai12bXMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hMjlrLmMgYi9nYXMvY29uZmlnL3RjLWEyOWsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwZmVjNS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWEyOWsuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOTYgKzAsMCBAQAotLyogdGMtYTI5ay5jIC0tIEFzc2VtYmxlIGZvciB0aGUgQU1EIDI5MDAwLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogSm9obiBHaWxtb3JlIGhhcyByZW9yZ2FuaXplZCB0aGlzIG1vZHVsZSBzb21ld2hhdCwgdG8gbWFrZSBpdCBlYXNpZXIKLSAgIHRvIGNvbnZlcnQgaXQgdG8gbmV3IG1hY2hpbmVzJyBhc3NlbWJsZXJzIGFzIGRlc2lyZWQuICBUaGVyZSB3YXMgdG9vCi0gICBtdWNoIGJsb29keSByZXdyaXRpbmcgcmVxdWlyZWQgYmVmb3JlLiAgVGhlcmUgc3RpbGwgcHJvYmFibHkgaXMuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotCi0jaW5jbHVkZSAib3Bjb2RlL2EyOWsuaCIKLQotLyogTWFrZSBpdCBlYXNpZXIgdG8gY2xvbmUgdGhpcyBtYWNoaW5lIGRlc2MgaW50byBhbm90aGVyIG9uZS4gICovCi0jZGVmaW5lCW1hY2hpbmVfb3Bjb2RlCWEyOWtfb3Bjb2RlCi0jZGVmaW5lCW1hY2hpbmVfb3Bjb2RlcwlhMjlrX29wY29kZXMKLSNkZWZpbmUJbWFjaGluZV9pcAlhMjlrX2lwCi0jZGVmaW5lCW1hY2hpbmVfaXQJYTI5a19pdAotCi0jZGVmaW5lCUlNTUVESUFURV9CSVQJMHgwMTAwMDAwMAkvKiBUdXJucyBSQiBpbnRvIEltbWVkaWF0ZSAqLwotI2RlZmluZQlBQlNPTFVURV9CSVQJMHgwMTAwMDAwMAkvKiBUdXJucyBQQy1yZWxhdGl2ZSB0byBBYnNvbHV0ZSAqLwotI2RlZmluZQlDRV9CSVQJCTB4MDA4MDAwMDAJLyogQ29wcm9jZXNzb3IgZW5hYmxlIGluIExPQUQgKi8KLSNkZWZpbmUJVUlfQklUCQkweDAwMDAwMDgwCS8qIFVuc2lnbmVkIGludGVnZXIgaW4gQ09OVkVSVCAqLwotCi0vKiBoYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaCA9IE5VTEw7Ci0KLXN0cnVjdCBtYWNoaW5lX2l0Ci0gIHsKLSAgICBjaGFyICplcnJvcjsKLSAgICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgICBzdHJ1Y3Qgbmxpc3QgKm5saXN0cDsKLSAgICBleHByZXNzaW9uUyBleHA7Ci0gICAgaW50IHBjcmVsOwotICAgIGludCByZWxvY19vZmZzZXQ7CQkvKiBPZmZzZXQgb2YgcmVsb2Mgd2l0aGluIGluc24gKi8KLQotICAgIGludCByZWxvYzsKLSAgfQotdGhlX2luc247Ci0KLXN0YXRpYyB2b2lkIG1hY2hpbmVfaXAgUEFSQU1TICgoY2hhciAqc3RyKSk7Ci0vKiBzdGF0aWMgdm9pZCBwcmludF9pbnNuIFBBUkFNUyAoKHN0cnVjdCBtYWNoaW5lX2l0ICppbnNuKSk7ICovCi0jaWZuZGVmIE9CSl9DT0ZGCi1zdGF0aWMgdm9pZCBzX2RhdGExIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNfdXNlIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLWNvbnN0IHBzZXVkb190eXBlUwotbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImFsaWduIiwgc19hbGlnbl9ieXRlcywgNH0sCi0gIHsiYmxvY2siLCBzX3NwYWNlLCAwfSwKLSAgeyJjcHV0eXBlIiwgc19pZ25vcmUsIDB9LAkvKiBDUFUgYXMgMjkwMDAgb3IgMjkwNTAgKi8KLSAgeyJyZWciLCBzX2xzeW0sIDB9LAkJLyogUmVnaXN0ZXIgZXF1YXRlLCBzYW1lIGFzIGVxdSAqLwotICB7InNwYWNlIiwgc19pZ25vcmUsIDB9LAkvKiBMaXN0aW5nIGNvbnRyb2wgKi8KLSAgeyJzZWN0Iiwgc19pZ25vcmUsIDB9LAkvKiBDcmVhdGlvbiBvZiBjb2ZmIHNlY3Rpb25zICovCi0jaWZuZGVmIE9CSl9DT0ZGCi0gIC8qIFdlIGNhbiBkbyB0aGlzIHJpZ2h0IHdpdGggY29mZi4gICovCi0gIHsidXNlIiwgc191c2UsIDB9LAotI2VuZGlmCi0gIHsid29yZCIsIGNvbnMsIDR9LAotICB7TlVMTCwgMCwgMH0sCi19OwotCi0jaWYgZGVmaW5lZChCRkRfSEVBREVSUykKLSNpZmRlZiBSRUxTWgotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSBSRUxTWjsJLyogQ29mZiBoZWFkZXJzICovCi0jZWxzZQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSAxMjsJCS8qIHNvbWV0aGluZyBlbHNlIGhlYWRlcnMgKi8KLSNlbmRpZgotI2Vsc2UKLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gMTI7CQkvKiBOb3QgYmZkaXplZCovCi0jZW5kaWYKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLwotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cyB3b3JrICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBXZSBuZWVkZWQgYW4gdW51c2VkIGNoYXIgZm9yIGxpbmUgc2VwYXJhdGlvbiB0byB3b3JrIGFyb3VuZCB0aGUKLSAgIGxhY2sgb2YgbWFjcm9zLCB1c2luZyBzZWQgYW5kIHN1Y2guICAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIkAiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQKLSAgIGFsbCwgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLwotCi0vKgotICogIGFudWxsIGJpdCAtIGNhdXNlcyB0aGUgYnJhbmNoIGRlbGF5IHNsb3QgaW5zdHJ1Y3Rpb25zIHRvIG5vdCBiZSBleGVjdXRlZAotICovCi0jZGVmaW5lIEFOTlVMICAgICAgICgxIDw8IDI5KQotCi0jaWZuZGVmIE9CSl9DT0ZGCi0KLXN0YXRpYyB2b2lkCi1zX3VzZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLnRleHQiLCA1KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA1OwotICAgICAgc190ZXh0ICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIuZGF0YSIsIDUpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICBzX2RhdGEgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIi5kYXRhMSIsIDYpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0gICAgICBzX2RhdGExICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgLyogTGl0ZXJhbHMgY2FuJ3QgZ28gaW4gdGhlIHRleHQgc2VnbWVudCBiZWNhdXNlIHlvdSBjYW4ndCByZWFkIGZyb20KLSAgICAgaW5zdHJ1Y3Rpb24gbWVtb3J5IG9uIHNvbWUgMjlrJ3MuICBTbywgaW50byBpbml0aWFsaXplZCBkYXRhLiAqLwotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLmxpdCIsIDQpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDQ7Ci0gICAgICBzdWJzZWdfc2V0IChTRUdfREFUQSwgMjAwKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFzX2JhZCAoXygiVW5rbm93biBzZWdtZW50IHR5cGUiKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2RhdGExICgpCi17Ci0gIHN1YnNlZ19zZXQgKFNFR19EQVRBLCAxKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLS8qIEluc3RhbGwgc3ltYm9sIGRlZmluaXRpb24gdGhhdCBtYXBzIFJFR05BTUUgdG8gUkVHTk8uCi0gICBGSVhNRS1TT09OOiAgVGhlc2UgYXJlIG5vdCByZWNvZ25pemVkIGluIG1peGVkIGNhc2UuICAqLwotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X3NyZWcgKHJlZ25hbWUsIHJlZ251bSkKLSAgICAgY2hhciAqcmVnbmFtZTsKLSAgICAgaW50IHJlZ251bTsKLXsKLSAgLyogRklYTUUtU09PTiwgcHV0IHNvbWV0aGluZyBpbiB0aGVzZSBzeW1zIHNvIHRoZXkgd29uJ3QgYmUgb3V0cHV0Ci0gICAgIHRvIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZS4gICovCi0KLSAgLyogTXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgbmFtZXMgb2YgdGhlIHNwZWNpYWwgcmVnaXN0ZXJzLiAgKi8KLSAgY2hhciBidWZbODBdOwotICBpbnQgaTsKLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3IChyZWduYW1lLCBTRUdfUkVHSVNURVIsICh2YWx1ZVQpIHJlZ251bSwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgZm9yIChpID0gMDsgcmVnbmFtZVtpXTsgaSsrKQotICAgIGJ1ZltpXSA9IGlzbG93ZXIgKHJlZ25hbWVbaV0pID8gdG91cHBlciAocmVnbmFtZVtpXSkgOiByZWduYW1lW2ldOwotICBidWZbaV0gPSAnXDAnOwotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKGJ1ZiwgU0VHX1JFR0lTVEVSLCAodmFsdWVUKSByZWdudW0sCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci19Ci0KLS8qIEluc3RhbGwgc3ltYm9sIGRlZmluaXRpb25zIGZvciBhc3NvcnRlZCBzcGVjaWFsIHJlZ2lzdGVycy4KLSAgIFNlZSBBU00yOUsgUmVmIHBhZ2UgMi05LiAgKi8KLQotdm9pZAotZGVmaW5lX3NvbWVfcmVncyAoKQotewotI2RlZmluZSBTUkVHCTI1NgotCi0gIC8qIFByb3RlY3RlZCBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbmFtZXMgKi8KLSAgaW5zZXJ0X3NyZWcgKCJ2YWIiLCBTUkVHICsgMCk7Ci0gIGluc2VydF9zcmVnICgib3BzIiwgU1JFRyArIDEpOwotICBpbnNlcnRfc3JlZyAoImNwcyIsIFNSRUcgKyAyKTsKLSAgaW5zZXJ0X3NyZWcgKCJjZmciLCBTUkVHICsgMyk7Ci0gIGluc2VydF9zcmVnICgiY2hhIiwgU1JFRyArIDQpOwotICBpbnNlcnRfc3JlZyAoImNoZCIsIFNSRUcgKyA1KTsKLSAgaW5zZXJ0X3NyZWcgKCJjaGMiLCBTUkVHICsgNik7Ci0gIGluc2VydF9zcmVnICgicmJwIiwgU1JFRyArIDcpOwotICBpbnNlcnRfc3JlZyAoInRtYyIsIFNSRUcgKyA4KTsKLSAgaW5zZXJ0X3NyZWcgKCJ0bXIiLCBTUkVHICsgOSk7Ci0gIGluc2VydF9zcmVnICgicGMwIiwgU1JFRyArIDEwKTsKLSAgaW5zZXJ0X3NyZWcgKCJwYzEiLCBTUkVHICsgMTEpOwotICBpbnNlcnRfc3JlZyAoInBjMiIsIFNSRUcgKyAxMik7Ci0gIGluc2VydF9zcmVnICgibW11IiwgU1JFRyArIDEzKTsKLSAgaW5zZXJ0X3NyZWcgKCJscnUiLCBTUkVHICsgMTQpOwotCi0gIC8qIEFkZGl0aW9uYWwgcHJvdGVjdGVkIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlcnMgZm9yIHRoZSAyOTA1MCAqLwotICBpbnNlcnRfc3JlZyAoInJzbiIsICBTUkVHICsgMTUpOwotICBpbnNlcnRfc3JlZyAoInJtYTAiLCBTUkVHICsgMTYpOwotICBpbnNlcnRfc3JlZyAoInJtYzAiLCBTUkVHICsgMTcpOwotICBpbnNlcnRfc3JlZyAoInJtYTEiLCBTUkVHICsgMTgpOwotICBpbnNlcnRfc3JlZyAoInJtYzEiLCBTUkVHICsgMTkpOwotICBpbnNlcnRfc3JlZyAoInNwYzAiLCBTUkVHICsgMjApOwotICBpbnNlcnRfc3JlZyAoInNwYzEiLCBTUkVHICsgMjEpOwotICBpbnNlcnRfc3JlZyAoInNwYzIiLCBTUkVHICsgMjIpOwotICBpbnNlcnRfc3JlZyAoImliYTAiLCBTUkVHICsgMjMpOwotICBpbnNlcnRfc3JlZyAoImliYzAiLCBTUkVHICsgMjQpOwotICBpbnNlcnRfc3JlZyAoImliYTEiLCBTUkVHICsgMjUpOwotICBpbnNlcnRfc3JlZyAoImliYzEiLCBTUkVHICsgMjYpOwotCi0gIC8qIEFkZGl0aW9uYWwgcmVnaXN0ZXJzIGZvciB0aGUgMjkwNDAuICAqLwotICBpbnNlcnRfc3JlZyAoImRiYSIsIFNSRUcgKyAyNyk7Ci0gIGluc2VydF9zcmVnICgiZGJjIiwgU1JFRyArIDI4KTsKLSAgaW5zZXJ0X3NyZWcgKCJjaXIiLCBTUkVHICsgMjkpOwotICBpbnNlcnRfc3JlZyAoImNkciIsIFNSRUcgKyAzMCk7Ci0KLSAgLyogVW5wcm90ZWN0ZWQgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyIG5hbWVzICovCi0gIGluc2VydF9zcmVnICgiaXBjIiwgU1JFRyArIDEyOCk7Ci0gIGluc2VydF9zcmVnICgiaXBhIiwgU1JFRyArIDEyOSk7Ci0gIGluc2VydF9zcmVnICgiaXBiIiwgU1JFRyArIDEzMCk7Ci0gIGluc2VydF9zcmVnICgicSIsIFNSRUcgKyAxMzEpOwotICBpbnNlcnRfc3JlZyAoImFsdSIsIFNSRUcgKyAxMzIpOwotICBpbnNlcnRfc3JlZyAoImJwIiwgU1JFRyArIDEzMyk7Ci0gIGluc2VydF9zcmVnICgiZmMiLCBTUkVHICsgMTM0KTsKLSAgaW5zZXJ0X3NyZWcgKCJjciIsIFNSRUcgKyAxMzUpOwotICBpbnNlcnRfc3JlZyAoImZwZSIsIFNSRUcgKyAxNjApOwotICBpbnNlcnRfc3JlZyAoImludGUiLCBTUkVHICsgMTYxKTsKLSAgaW5zZXJ0X3NyZWcgKCJmcHMiLCBTUkVHICsgMTYyKTsKLSAgLyogICIiLCAgICBTUkVHKzE2Myk7CSAgUmVzZXJ2ZWQgKi8KLSAgaW5zZXJ0X3NyZWcgKCJleG9wIiwgU1JFRyArIDE2NCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBJdCBzaG91bGQKLSAgIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiwgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwKLSAgIG5lZWQuICAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcmV0dmFsID0gTlVMTDsKLSAgaW50IGxvc2UgPSAwOwotICByZWdpc3RlciBpbnQgc2tpcG5leHQgPSAwOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLSAgcmVnaXN0ZXIgY2hhciAqc3RyZW5kLCAqc3RyZW5kMjsKLQotICAvKiBIYXNoIHVwIGFsbCB0aGUgb3Bjb2RlcyBmb3IgZmFzdCB1c2UgbGF0ZXIuICAqLwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnVtX29wY29kZXM7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gbWFjaGluZV9vcGNvZGVzW2ldLm5hbWU7Ci0KLSAgICAgIGlmIChza2lwbmV4dCkKLQl7Ci0JICBza2lwbmV4dCA9IDA7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEhhY2sgdG8gYXZvaWQgbXVsdGlwbGUgb3Bjb2RlIGVudHJpZXMuICBXZSBwcmUtbG9jYXRlIGFsbCB0aGUKLQkgdmFyaWF0aW9ucyAoYi9pIGZpZWxkIGFuZCBQL0EgZmllbGQpIGFuZCBoYW5kbGUgdGhlbS4gKi8KLQotICAgICAgaWYgKCFzdHJjbXAgKG5hbWUsIG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0ubmFtZSkpCi0JewotCSAgaWYgKChtYWNoaW5lX29wY29kZXNbaV0ub3Bjb2RlICYgMHgwMTAwMDAwMCkgIT0gMAotCSAgICAgIHx8IChtYWNoaW5lX29wY29kZXNbaSArIDFdLm9wY29kZSAmIDB4MDEwMDAwMDApID09IDAKLQkgICAgICB8fCAoKG1hY2hpbmVfb3Bjb2Rlc1tpXS5vcGNvZGUgfCAweDAxMDAwMDAwKQotCQkgICE9IG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0ub3Bjb2RlKSkKLQkgICAgZ290byBiYWRfdGFibGU7Ci0JICBzdHJlbmQgPSBtYWNoaW5lX29wY29kZXNbaV0uYXJncyArIHN0cmxlbiAobWFjaGluZV9vcGNvZGVzW2ldLmFyZ3MpIC0gMTsKLQkgIHN0cmVuZDIgPSBtYWNoaW5lX29wY29kZXNbaSArIDFdLmFyZ3MgKyBzdHJsZW4gKG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0uYXJncykgLSAxOwotCSAgc3dpdGNoICgqc3RyZW5kKQotCSAgICB7Ci0JICAgIGNhc2UgJ2InOgotCSAgICAgIGlmICgqc3RyZW5kMiAhPSAnaScpCi0JCWdvdG8gYmFkX3RhYmxlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdQJzoKLQkgICAgICBpZiAoKnN0cmVuZDIgIT0gJ0EnKQotCQlnb3RvIGJhZF90YWJsZTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgYmFkX3RhYmxlOgotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgImludGVybmFsIGVycm9yOiBjYW4ndCBoYW5kbGUgb3Bjb2RlICVzXG4iLAotCQkgICAgICAgbmFtZSk7Ci0JICAgICAgbG9zZSA9IDE7Ci0JICAgIH0KLQotCSAgLyogT0ssIHRoaXMgaXMgYW4gaS9iIG9yIEEvUCBwYWlyLiAgV2Ugc2tpcCB0aGUKLQkgICAgIGhpZ2hlci12YWx1ZWQgb25lLCBhbmQgbGV0IHRoZSBjb2RlIGZvciBvcGVyYW5kIGNoZWNraW5nCi0JICAgICBoYW5kbGUgT1ItaW5nIGluIHRoZSBiaXQuICAqLwotCSAgc2tpcG5leHQgPSAxOwotCX0KLQotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hbWUsIChQVFIpICZtYWNoaW5lX29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iLAotCQkgICBtYWNoaW5lX29wY29kZXNbaV0ubmFtZSwgcmV0dmFsKTsKLQkgIGxvc2UgPSAxOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxvc2UpCi0gICAgYXNfZmF0YWwgKF8oIkJyb2tlbiBhc3NlbWJsZXIuICBObyBhc3NlbWJseSBhdHRlbXB0ZWQuIikpOwotCi0gIGRlZmluZV9zb21lX3JlZ3MgKCk7Ci19Ci0KLS8qIEFzc2VtYmxlIGEgc2luZ2xlIGluc3RydWN0aW9uLiAgSXRzIGxhYmVsIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZAotICAgYnkgdGhlIGdlbmVyaWMgZnJvbnQgZW5kLiAgV2UganVzdCBwYXJzZSBvcGNvZGUgYW5kIG9wZXJhbmRzLCBhbmQKLSAgIHByb2R1Y2UgdGhlIGJ5dGVzIG9mIGRhdGEgYW5kIHJlbG9jYXRpb24uICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnRvUDsKLQotICBrbm93IChzdHIpOwotICBtYWNoaW5lX2lwIChzdHIpOwotICB0b1AgPSBmcmFnX21vcmUgKDQpOwotICAvKiBwdXQgb3V0IHRoZSBvcGNvZGUgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIHRoZV9pbnNuLm9wY29kZSwgNCk7Ci0KLSAgLyogcHV0IG91dCB0aGUgc3ltYm9sLWRlcGVuZGVudCBzdHVmZiAqLwotICBpZiAodGhlX2luc24ucmVsb2MgIT0gTk9fUkVMT0MpCi0gICAgewotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAodG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyB0aGVfaW5zbi5yZWxvY19vZmZzZXQpLAotCQkgICA0LAkJLyogc2l6ZSAqLwotCQkgICAmdGhlX2luc24uZXhwLAotCQkgICB0aGVfaW5zbi5wY3JlbCwKLQkJICAgdGhlX2luc24ucmVsb2MpOwotICAgIH0KLX0KLQotY2hhciAqCi1wYXJzZV9vcGVyYW5kIChzLCBvcGVyYW5kcCwgb3B0KQotICAgICBjaGFyICpzOwotICAgICBleHByZXNzaW9uUyAqb3BlcmFuZHA7Ci0gICAgIGludCBvcHQ7Ci17Ci0gIGNoYXIgKnNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgKm5ldzsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotICBleHByZXNzaW9uIChvcGVyYW5kcCk7Ci0gIGlmIChvcGVyYW5kcC0+WF9vcCA9PSBPX2Fic2VudCAmJiAhIG9wdCkKLSAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgbmV3ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICByZXR1cm4gbmV3OwotfQotCi0vKiBJbnN0cnVjdGlvbiBwYXJzaW5nLiAgVGFrZXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgb3Bjb2RlLgotICAgT3BlcmFuZHMgYXJlIGF0IGlucHV0X2xpbmVfcG9pbnRlci4gIE91dHB1dCBpcyBpbiB0aGVfaW5zbi4KLSAgIFdhcm5pbmdzIG9yIGVycm9ycyBhcmUgZ2VuZXJhdGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLW1hY2hpbmVfaXAgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotICBjb25zdCBjaGFyICphcmdzOwotICBzdHJ1Y3QgbWFjaGluZV9vcGNvZGUgKmluc247Ci0gIGNoYXIgKmFyZ3NTdGFydDsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIGV4cHJlc3Npb25TIHRoZV9vcGVyYW5kOwotICBleHByZXNzaW9uUyAqb3BlcmFuZCA9ICZ0aGVfb3BlcmFuZDsKLSAgdW5zaWduZWQgaW50IHJlZzsKLQotICAvKiBNdXN0IGhhbmRsZSBgZGl2MCcgb3Bjb2RlLiAgKi8KLSAgcyA9IHN0cjsKLSAgaWYgKGlzYWxwaGEgKCpzKSkKLSAgICBmb3IgKDsgaXNhbG51bSAoKnMpOyArK3MpCi0gICAgICBpZiAoaXN1cHBlciAoKnMpKQotCSpzID0gdG9sb3dlciAoKnMpOwotCi0gIHN3aXRjaCAoKnMpCi0gICAgewotICAgIGNhc2UgJ1wwJzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnICc6CQkJLyogRklYTUUtU09NRURBWSBtb3JlIHdoaXRlc3BhY2UgKi8KLSAgICAgICpzKysgPSAnXDAnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJVbmtub3duIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKChpbnNuID0gKHN0cnVjdCBtYWNoaW5lX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cikpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbmtub3duIG9wY29kZSBgJXMnLiIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYXJnc1N0YXJ0ID0gczsKLSAgb3Bjb2RlID0gaW5zbi0+b3Bjb2RlOwotICBtZW1zZXQgKCZ0aGVfaW5zbiwgJ1wwJywgc2l6ZW9mICh0aGVfaW5zbikpOwotICB0aGVfaW5zbi5yZWxvYyA9IE5PX1JFTE9DOwotCi0gIC8qIEJ1aWxkIHRoZSBvcGNvZGUsIGNoZWNraW5nIGFzIHdlIGdvIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQotICAgICBvcGVyYW5kcyBtYXRjaC4KLSAgIAotICAgICBJZiBhbiBvcGVyYW5kIG1hdGNoZXMsIHdlIG1vZGlmeSB0aGVfaW5zbiBvciBvcGNvZGUgYXBwcm9wcmlhdGVseSwKLSAgICAgYW5kIGRvIGEgImNvbnRpbnVlIi4gIElmIGFuIG9wZXJhbmQgZmFpbHMgdG8gbWF0Y2gsIHdlICJicmVhayIuICAqLwotCi0gIGlmIChpbnNuLT5hcmdzWzBdICE9ICdcMCcpCi0gICAgewotICAgICAgLyogUHJpbWUgdGhlIHB1bXAuICAqLwotICAgICAgcyA9IHBhcnNlX29wZXJhbmQgKHMsIG9wZXJhbmQsIGluc24tPmFyZ3NbMF0gPT0gJ0knKTsKLSAgICB9Ci0KLSAgZm9yIChhcmdzID0gaW5zbi0+YXJnczs7ICsrYXJncykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCphcmdzKQotCXsKLQotCWNhc2UgJ1wwJzoJCS8qIGVuZCBvZiBhcmdzICovCi0JICBpZiAoKnMgPT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZSB0cnVseSBkb25lLiAqLwotCSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IG9wY29kZTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGFzX2JhZCAoXygiVG9vIG1hbnkgb3BlcmFuZHM6ICVzIiksIHMpOwotCSAgYnJlYWs7Ci0KLQljYXNlICcsJzoJCS8qIE11c3QgbWF0Y2ggYSBjb21tYSAqLwotCSAgaWYgKCpzKysgPT0gJywnKQotCSAgICB7Ci0JICAgICAgLyogUGFyc2UgbmV4dCBvcGVyYW5kLiAgKi8KLQkgICAgICBzID0gcGFyc2Vfb3BlcmFuZCAocywgb3BlcmFuZCwgYXJnc1sxXSA9PSAnSScpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ3YnOgkJLyogVHJhcCBudW1iZXJzIChpbW1lZGlhdGUgZmllbGQpICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDI1NikKLQkJewotCQkgIG9wY29kZSB8PSAob3BlcmFuZC0+WF9hZGRfbnVtYmVyIDw8IDE2KTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX2JhZCAoXygiSW1tZWRpYXRlIHZhbHVlIG9mICVsZCBpcyB0b28gbGFyZ2UiKSwKLQkJCSAgKGxvbmcpIG9wZXJhbmQtPlhfYWRkX251bWJlcik7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgdGhlX2luc24ucmVsb2MgPSBSRUxPQ184OwotCSAgdGhlX2luc24ucmVsb2Nfb2Zmc2V0ID0gMTsJLyogQklHLUVORElBTiBCeXRlIDEgb2YgaW5zbiAqLwotCSAgdGhlX2luc24uZXhwID0gKm9wZXJhbmQ7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2InOgkJLyogQSBnZW5lcmFsIHJlZ2lzdGVyIG9yIDgtYml0IGltbWVkaWF0ZSAqLwotCWNhc2UgJ2knOgotCSAgLyogV2UgdHJlYXQgdGhlIHR3byBjYXNlcyBpZGVudGljYWxseSBzaW5jZSB3ZSBtYXNoZWQKLQkgICAgIHRoZW0gdG9nZXRoZXIgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX3JlZ2lzdGVyKQotCSAgICBnb3RvIGdlbmVyYWxfcmVnOwotCi0JICAvKiBNYWtlIHN1cmUgdGhlICdpJyBjYXNlIHJlYWxseSBleGlzdHMuICAqLwotCSAgaWYgKChpbnNuLT5vcGNvZGUgfCBJTU1FRElBVEVfQklUKSAhPSAoaW5zbiArIDEpLT5vcGNvZGUpCi0JICAgIGJyZWFrOwotCi0JICBvcGNvZGUgfD0gSU1NRURJQVRFX0JJVDsKLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgMjU2KQotCQl7Ci0JCSAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlcjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX2JhZCAoXygiSW1tZWRpYXRlIHZhbHVlIG9mICVsZCBpcyB0b28gbGFyZ2UiKSwKLQkJCSAgKGxvbmcpIG9wZXJhbmQtPlhfYWRkX251bWJlcik7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgdGhlX2luc24ucmVsb2MgPSBSRUxPQ184OwotCSAgdGhlX2luc24ucmVsb2Nfb2Zmc2V0ID0gMzsJLyogQklHLUVORElBTiBCeXRlIDMgb2YgaW5zbiAqLwotCSAgdGhlX2luc24uZXhwID0gKm9wZXJhbmQ7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2EnOgkJLyogbmV4dCBvcGVyYW5kIG11c3QgYmUgYSByZWdpc3RlciAqLwotCWNhc2UgJ2MnOgotCWdlbmVyYWxfcmVnOgotCSAgLyogbHJOTk4gb3IgZ3JOTk4gb3IgJSVleHByIG9yIGEgdXNlci1kZWYgcmVnaXN0ZXIgbmFtZSAqLwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgIT0gT19yZWdpc3RlcikKLQkgICAgYnJlYWs7CQkvKiBPbmx5IHJlZ2lzdGVycyAqLwotCSAga25vdyAob3BlcmFuZC0+WF9hZGRfc3ltYm9sID09IDApOwotCSAga25vdyAob3BlcmFuZC0+WF9vcF9zeW1ib2wgPT0gMCk7Ci0JICByZWcgPSBvcGVyYW5kLT5YX2FkZF9udW1iZXI7Ci0JICBpZiAocmVnID49IFNSRUcpCi0JICAgIGJyZWFrOwkJLyogTm8gc3BlY2lhbCByZWdpc3RlcnMgKi8KLQotCSAgLyogR290IHRoZSByZWdpc3Rlciwgbm93IGZpZ3VyZSBvdXQgd2hlcmUgaXQgZ29lcyBpbiB0aGUKLQkgICAgIG9wY29kZS4gICovCi0JICBzd2l0Y2ggKCphcmdzKQotCSAgICB7Ci0JICAgIGNhc2UgJ2EnOgotCSAgICAgIG9wY29kZSB8PSByZWcgPDwgODsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdiJzoKLQkgICAgY2FzZSAnaSc6Ci0JICAgICAgb3Bjb2RlIHw9IHJlZzsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdjJzoKLQkgICAgICBvcGNvZGUgfD0gcmVnIDw8IDE2OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjay4iKSk7Ci0JICBicmVhazsKLQotCWNhc2UgJ3gnOgkJLyogMTYgYml0IGNvbnN0YW50LCB6ZXJvLWV4dGVuZGVkICovCi0JY2FzZSAnWCc6CQkvKiAxNiBiaXQgY29uc3RhbnQsIG9uZS1leHRlbmRlZCAqLwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSAob3BlcmFuZC0+WF9hZGRfbnVtYmVyICYgMHhGRikgPDwgMCB8Ci0JCSgob3BlcmFuZC0+WF9hZGRfbnVtYmVyICYgMHhGRjAwKSA8PCA4KTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgdGhlX2luc24ucmVsb2MgPSBSRUxPQ19DT05TVDsKLQkgIHRoZV9pbnNuLmV4cCA9ICpvcGVyYW5kOwotCSAgY29udGludWU7Ci0KLQljYXNlICdoJzoKLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgfD0gKG9wZXJhbmQtPlhfYWRkX251bWJlciAmIDB4MDBGRjAwMDApID4+IDE2IHwKLQkJKCgodW5zaWduZWQgbG9uZykgb3BlcmFuZC0+WF9hZGRfbnVtYmVyCi0JCSAgLyogYXZvaWQgc2lnbiBleHQgKi8gICYgMHhGRjAwMDAwMCkgPj4gOCk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIHRoZV9pbnNuLnJlbG9jID0gUkVMT0NfQ09OU1RIOwotCSAgdGhlX2luc24uZXhwID0gKm9wZXJhbmQ7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ1AnOgkJLyogUEMtcmVsYXRpdmUganVtcCBhZGRyZXNzICovCi0JY2FzZSAnQSc6CQkvKiBBYnNvbHV0ZSBqdW1wIGFkZHJlc3MgKi8KLQkgIC8qIFRoZXNlIHR3byBhcmUgdHJlYXRlZCB0b2dldGhlciBzaW5jZSB3ZSBmb2xkZWQgdGhlCi0JICAgICBvcGNvZGUgdGFibGUgZW50cmllcyB0b2dldGhlci4gICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgLyogTWFrZSBzdXJlIHRoZSAnQScgY2FzZSByZWFsbHkgZXhpc3RzLiAgKi8KLQkgICAgICBpZiAoKGluc24tPm9wY29kZSB8IEFCU09MVVRFX0JJVCkgIT0gKGluc24gKyAxKS0+b3Bjb2RlKQotCQlicmVhazsKLQkgICAgICB7Ci0JCWJmZF92bWEgdiwgbWFzazsKLQkJbWFzayA9IDB4MWZmZmY7Ci0JCXYgPSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiB+IG1hc2s7Ci0JCWlmICh2KQotCQkgIGFzX2JhZCAoImNhbGwvam1wIHRhcmdldCBvdXQgb2YgcmFuZ2UiKTsKLQkgICAgICB9Ci0JICAgICAgb3Bjb2RlIHw9IEFCU09MVVRFX0JJVCB8Ci0JCShvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweDAwMDNGQzAwKSA8PCA2IHwKLQkJKChvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweDAwMDAwM0ZDKSA+PiAyKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgdGhlX2luc24ucmVsb2MgPSBSRUxPQ19KVU1QVEFSRzsKLQkgIHRoZV9pbnNuLmV4cCA9ICpvcGVyYW5kOwotCSAgdGhlX2luc24ucGNyZWwgPSAxOwkvKiBBc3N1bWUgUEMtcmVsYXRpdmUganVtcCAqLwotCSAgLyogRklYTUUtU09PTiwgRG8gd2UgZmlndXJlIG91dCB3aGV0aGVyIGFicyBsYXRlciwgYWZ0ZXIKLSAgICAgICAgICAgICBrbm93IHN5bSB2YWw/ICovCi0JICBjb250aW51ZTsKLQotCWNhc2UgJ2UnOgkJLyogQ29wcm9jZXNzb3IgZW5hYmxlIGJpdCBmb3IgTE9BRC9TVE9SRSBpbnNuICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA9PSAwKQotCQljb250aW51ZTsKLQkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyID09IDEpCi0JCXsKLQkJICBvcGNvZGUgfD0gQ0VfQklUOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnbic6CQkvKiBDb250cm9sIGJpdHMgZm9yIExPQUQvU1RPUkUgaW5zdHJ1Y3Rpb25zICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmCi0JICAgICAgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgMTI4KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMTYpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ3MnOgkJLyogU3BlY2lhbCByZWdpc3RlciBudW1iZXIgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wICE9IE9fcmVnaXN0ZXIpCi0JICAgIGJyZWFrOwkJLyogT25seSByZWdpc3RlcnMgKi8KLQkgIGlmIChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCBTUkVHKQotCSAgICBicmVhazsJCS8qIE5vdCBhIHNwZWNpYWwgcmVnaXN0ZXIgKi8KLQkgIG9wY29kZSB8PSAob3BlcmFuZC0+WF9hZGRfbnVtYmVyICYgMHhGRikgPDwgODsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAndSc6CQkvKiBVSSBiaXQgb2YgQ09OVkVSVCAqLwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGlmIChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPT0gMCkKLQkJY29udGludWU7Ci0JICAgICAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA9PSAxKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IFVJX0JJVDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ3InOgkJLyogUk5EIGJpdHMgb2YgQ09OVkVSVCAqLwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCAmJgotCSAgICAgIG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDgpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgfD0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDw8IDQ7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnSSc6CQkvKiBJRCBiaXRzIG9mIElOViBhbmQgSVJFVElOVi4gICovCi0JICAvKiBUaGlzIG9wZXJhbmQgaXMgb3B0aW9uYWwuICAqLwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19hYnNlbnQpCi0JICAgIGNvbnRpbnVlOwotCSAgZWxzZSBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgICYmIG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDQpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgfD0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDw8IDE2OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ2QnOgkJLyogRkQgYml0cyBvZiBDT05WRVJUICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmCi0JICAgICAgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgNCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMjsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQotCWNhc2UgJ2YnOgkJLyogRlMgYml0cyBvZiBDT05WRVJUICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmCi0JICAgICAgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgNCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdDJzoKLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKLQkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCA0KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAxNjsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdGJzoKLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKLQkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCAxNikKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMTg7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIEJBRF9DQVNFICgqYXJncyk7Ci0JfQotICAgICAgLyogVHlwZXMgb3IgdmFsdWVzIG9mIGFyZ3MgZG9uJ3QgbWF0Y2guICAqLwotICAgICAgYXNfYmFkICgiSW52YWxpZCBvcGVyYW5kcyIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIG1kX2F0b2YgaW4gbTY4ay5jLiAgSSB0aGluayB0aGlzIGlzIHJpZ2h0LAotICAgYnV0IEknbSBub3Qgc3VyZS4KLQotICAgVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBvZiB0eXBlIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyCi0gICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzCi0gICByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4gICovCi0KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotCi0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSI7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBXcml0ZSBvdXQgYmlnLWVuZGlhbi4KLSAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWw7CS8qIFJlbWVtYmVyIHZhbHVlIGZvciBlbWl0X3JlbG9jICovCi0KLQotICBrbm93IChmaXhQLT5meF9zaXplID09IDQpOwotICBrbm93IChmaXhQLT5meF9yX3R5cGUgPCBOT19SRUxPQyk7Ci0KLSAgLyogVGhpcyBpcyBhIGhhY2suICBUaGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSRUxPQ19XRElTUDMwICYmIGZpeFAtPmZ4X2FkZHN5KQotICAgIHsKLSAgICAgIHZhbCArPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0gICAgfQotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLQotICAgIGNhc2UgUkVMT0NfMzI6Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gMjQ7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTY7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ184OgotICAgICAgYnVmWzBdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1dESVNQMzA6Ci0gICAgICB2YWwgPSAodmFsID4+PSAyKSArIDE7Ci0gICAgICBidWZbMF0gfD0gKHZhbCA+PiAyNCkgJiAweDNmOwotICAgICAgYnVmWzFdID0gKHZhbCA+PiAxNik7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19ISTIyOgotICAgICAgYnVmWzFdIHw9ICh2YWwgPj4gMjYpICYgMHgzZjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiAxODsKLSAgICAgIGJ1ZlszXSA9IHZhbCA+PiAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19MTzEwOgotICAgICAgYnVmWzJdIHw9ICh2YWwgPj4gOCkgJiAweDAzOwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0JBU0UxMzoKLSAgICAgIGJ1ZlsyXSB8PSAodmFsID4+IDgpICYgMHgxZjsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19XRElTUDIyOgotICAgICAgdmFsID0gKHZhbCA+Pj0gMikgKyAxOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIFJFTE9DX0JBU0UyMjoKLSAgICAgIGJ1ZlsxXSB8PSAodmFsID4+IDE2KSAmIDB4M2Y7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19KVU1QVEFSRzoJLyogMDBYWDAwWFggcGF0dGVybiBpbiBhIHdvcmQgKi8KLSAgICAgIGlmICghZml4UC0+ZnhfZG9uZSkKLQl7Ci0JICAvKiBUaGUgbGlua2VyIHRyaWVzIHRvIHN1cHBvcnQgYm90aCBBTUQgYW5kIG9sZCBHTlUgc3R5bGUKLSAgICAgICAgICAgICBSX0lSRUwgcmVsb2NzLiAgVGhhdCBtZWFucyB0aGF0IGlmIHRoZSBhZGRlbmQgaXMgZXhhY3RseQotICAgICAgICAgICAgIHRoZSBuZWdhdGl2ZSBvZiB0aGUgYWRkcmVzcyB3aXRoaW4gdGhlIHNlY3Rpb24sIHRoZQotICAgICAgICAgICAgIGxpbmtlciB3aWxsIG5vdCBoYW5kbGUgaXQgY29ycmVjdGx5LiAgKi8KLQkgIGlmIChmaXhQLT5meF9wY3JlbAotCSAgICAgICYmIHZhbCAhPSAwCi0JICAgICAgJiYgdmFsID09IC0gKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSkpCi0JICAgIGFzX2JhZF93aGVyZQotCSAgICAgIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCSAgICAgICAidGhlIGxpbmtlciB3aWxsIG5vdCBoYW5kbGUgdGhpcyByZWxvY2F0aW9uIGNvcnJlY3RseSIpOwotCX0KLSAgICAgIGVsc2UgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCXsKLQkgIGxvbmcgdiA9IHZhbCA+PiAxNzsKLQkgIGlmICh2ICE9IDAgJiYgdiAhPSAtMSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAiY2FsbC9qbXAgdGFyZ2V0IG91dCBvZiByYW5nZSIpOwotCX0KLSAgICAgIGVsc2UKLQkvKiB0aGlzIGNhc2Ugd2FzIHN1cHBvc2VkIHRvIGJlIGhhbmRsZWQgaW4gbWFjaGluZV9pcCAqLwotCWFib3J0ICgpOwotICAgICAgYnVmWzFdID0gdmFsID4+IDEwOwkvKiBIb2xkcyBiaXRzIDAwMDNGRkZDIG9mIGFkZHJlc3MgKi8KLSAgICAgIGJ1ZlszXSA9IHZhbCA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0NPTlNUOgkJLyogMDBYWDAwWFggcGF0dGVybiBpbiBhIHdvcmQgKi8KLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiA4OwkvKiBIb2xkcyBiaXRzIDAwMDBYWFhYICovCi0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfQ09OU1RIOgkJLyogMDBYWDAwWFggcGF0dGVybiBpbiBhIHdvcmQgKi8KLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAyNDsJLyogSG9sZHMgYml0cyBYWFhYMDAwMCAqLwotICAgICAgYnVmWzNdID0gdmFsID4+IDE2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5PX1JFTE9DOgotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oImJhZCByZWxvY2F0aW9uIHR5cGU6IDB4JTAyeCIpLCBmaXhQLT5meF9yX3R5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0jaWZkZWYgT0JKX0NPRkYKLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSRUxPQ18zMjoKLSAgICAgIHJldHVybiAoUl9XT1JEKTsKLSAgICBjYXNlIFJFTE9DXzg6Ci0gICAgICByZXR1cm4gKFJfQllURSk7Ci0gICAgY2FzZSBSRUxPQ19DT05TVDoKLSAgICAgIHJldHVybiAoUl9JTE9IQUxGKTsKLSAgICBjYXNlIFJFTE9DX0NPTlNUSDoKLSAgICAgIHJldHVybiAoUl9JSElIQUxGKTsKLSAgICBjYXNlIFJFTE9DX0pVTVBUQVJHOgotICAgICAgcmV0dXJuIChSX0lSRUwpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGYgKF8oIm5lZWQgJW8zXG4iKSwgZml4UC0+Znhfcl90eXBlKTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0JCQkJLyogc3dpdGNoIG9uIHR5cGUgKi8KLQotICByZXR1cm4gKDApOwotfQotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgMjlrICovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotewotICBhc19mYXRhbCAoXygiYTI5a19jb252ZXJ0X2ZyYWdcbiIpKTsKLX0KLQotLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgYTI5ayAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWd0eXBlOwotewotICBhc19mYXRhbCAoXygiYTI5a19lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIikpOwotICByZXR1cm4gMDsKLX0KLQotI2lmIDAKLS8qIGZvciBkZWJ1Z2dpbmcgb25seSAqLwotc3RhdGljIHZvaWQKLXByaW50X2luc24gKGluc24pCi0gICAgIHN0cnVjdCBtYWNoaW5lX2l0ICppbnNuOwotewotICBjaGFyICpSZWxvY1tdID0KLSAgewotICAgICJSRUxPQ184IiwKLSAgICAiUkVMT0NfMTYiLAotICAgICJSRUxPQ18zMiIsCi0gICAgIlJFTE9DX0RJU1A4IiwKLSAgICAiUkVMT0NfRElTUDE2IiwKLSAgICAiUkVMT0NfRElTUDMyIiwKLSAgICAiUkVMT0NfV0RJU1AzMCIsCi0gICAgIlJFTE9DX1dESVNQMjIiLAotICAgICJSRUxPQ19ISTIyIiwKLSAgICAiUkVMT0NfMjIiLAotICAgICJSRUxPQ18xMyIsCi0gICAgIlJFTE9DX0xPMTAiLAotICAgICJSRUxPQ19TRkFfQkFTRSIsCi0gICAgIlJFTE9DX1NGQV9PRkYxMyIsCi0gICAgIlJFTE9DX0JBU0UxMCIsCi0gICAgIlJFTE9DX0JBU0UxMyIsCi0gICAgIlJFTE9DX0JBU0UyMiIsCi0gICAgIlJFTE9DX1BDMTAiLAotICAgICJSRUxPQ19QQzIyIiwKLSAgICAiUkVMT0NfSk1QX1RCTCIsCi0gICAgIlJFTE9DX1NFR09GRjE2IiwKLSAgICAiUkVMT0NfR0xPQl9EQVQiLAotICAgICJSRUxPQ19KTVBfU0xPVCIsCi0gICAgIlJFTE9DX1JFTEFUSVZFIiwKLSAgICAiTk9fUkVMT0MiCi0gIH07Ci0KLSAgaWYgKGluc24tPmVycm9yKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiAlc1xuIik7Ci0gICAgfQotICBmcHJpbnRmIChzdGRlcnIsICJvcGNvZGU9MHglMDh4XG4iLCBpbnNuLT5vcGNvZGUpOwotICBmcHJpbnRmIChzdGRlcnIsICJyZWxvYyA9ICVzXG4iLCBSZWxvY1tpbnNuLT5yZWxvY10pOwotICBmcHJpbnRmIChzdGRlcnIsICJleHAgPSAge1xuIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlx0XHRYX2FkZF9zeW1ib2wgPSAlc1xuIiwKLQkgICBpbnNuLT5leHAuWF9hZGRfc3ltYm9sID8KLQkgICAoU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfYWRkX3N5bWJvbCkgPwotCSAgICBTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9hZGRfc3ltYm9sKSA6ICI/Pz8iKSA6ICIwIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlx0XHRYX29wX3N5bWJvbCA9ICVzXG4iLAotCSAgIGluc24tPmV4cC5YX29wX3N5bWJvbCA/Ci0JICAgKFNfR0VUX05BTUUgKGluc24tPmV4cC5YX29wX3N5bWJvbCkgPwotCSAgICBTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9vcF9zeW1ib2wpIDogIj8/PyIpIDogIjAiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfYWRkX251bWJlciA9ICVkXG4iLAotCSAgIGluc24tPmV4cC5YX2FkZF9udW1iZXIpOwotICBmcHJpbnRmIChzdGRlcnIsICJ9XG4iKTsKLX0KLQotI2VuZGlmCi0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gdGFyZ2V0IGZvcm1hdC4KLQotICAgT24gc3BhcmMvMjlrOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBuZXh0IHRocmVlCi0gICBieXRlcyBhcmUgaW5kZXgsIG1vc3Qgc2lnLiBieXRlIGZpcnN0LiAgQnl0ZSA3IGlzIGJyb2tlbiB1cCB3aXRoCi0gICBiaXQgNyBhcyBleHRlcm5hbCwgYml0cyA2ICYgNSB1bnVzZWQsIGFuZCB0aGUgbG93ZXIKLSAgIGZpdmUgYml0cyBhcyByZWxvY2F0aW9uIHR5cGUuICBOZXh0IDQgYnl0ZXMgYXJlIGxvbmcgYWRkZW5kLiAqLwotLyogVGhhbnggYW5kIGEgdGlwIG9mIHRoZSBoYXQgdG8gTWljaGFlbCBCbG9vbSwgbWJAdHRpZGNhLnR0aS5jb20gKi8KLQotI2lmZGVmIE9CSl9BT1VUCi0KLXZvaWQKLXRjX2FvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgbG9uZyByX3N5bWJvbG51bTsKLQotICBrbm93IChmaXhQLT5meF9yX3R5cGUgPCBOT19SRUxPQyk7Ci0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0gICAgICAgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUsCi0JCSAgICAgIDQpOwotCi0gIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQotCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKLQotICB3aGVyZVs0XSA9IChyX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNl0gPSByX3N5bWJvbG51bSAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkgPDwgNykgJiAweDgwKSB8ICgwICYgMHg2MCkgfCAoZml4UC0+Znhfcl90eXBlICYgMHgxRik7Ci0gIC8qIEFsc28gZWFzeSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCZ3aGVyZVs4XSwgZml4UC0+ZnhfYWRkbnVtYmVyLCA0KTsKLX0KLQotI2VuZGlmIC8qIE9CSl9BT1VUICovCi0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotfQotDAotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGxpbmUgaXMgdW5yZWNvZ25pemVkLiAgVGhpcyBpcyB1c2VkIHRvIGhhbmRsZQotICAgZGVmaW5pdGlvbnMgb2YgYTI5ayBzdHlsZSBsb2NhbCBsYWJlbHMuICAqLwotCi1pbnQKLWEyOWtfdW5yZWNvZ25pemVkX2xpbmUgKGMpCi0gICAgIGludCBjOwotewotICBpbnQgbGFiOwotICBjaGFyICpzOwotCi0gIGlmIChjICE9ICckJwotICAgICAgfHwgISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzBdKSkKLSAgICByZXR1cm4gMDsKLQotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGxhYiA9IDA7Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotICAgIHsKLSAgICAgIGxhYiA9IGxhYiAqIDEwICsgKnMgLSAnMCc7Ci0gICAgICArK3M7Ci0gICAgfQotCi0gIGlmICgqcyAhPSAnOicpCi0gICAgewotICAgICAgLyogTm90IGEgbGFiZWwgZGVmaW5pdGlvbi4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGRvbGxhcl9sYWJlbF9kZWZpbmVkIChsYWIpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibGFiZWwgXCIkJWRcIiByZWRlZmluZWQiKSwgbGFiKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBkZWZpbmVfZG9sbGFyX2xhYmVsIChsYWIpOwotICBjb2xvbiAoZG9sbGFyX2xhYmVsX25hbWUgKGxhYiwgMCkpOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzICsgMTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogRGVmYXVsdCB0aGUgdmFsdWVzIG9mIHN5bWJvbHMga25vd24gdGhhdCBzaG91bGQgYmUgInByZWRlZmluZWQiLiAgV2UKLSAgIGRvbid0IGJvdGhlciB0byBwcmVkZWZpbmUgdGhlbSB1bmxlc3MgeW91IGFjdHVhbGx5IHVzZSBvbmUsIHNpbmNlIHRoZXJlCi0gICBhcmUgYSBsb3Qgb2YgdGhlbS4gICovCi0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgbG9uZyByZWdudW07Ci0gIGNoYXIgdGVzdGJ1Zls1ICsgLypTTE9QKi8gNV07Ci0KLSAgaWYgKG5hbWVbMF0gPT0gJ2cnIHx8IG5hbWVbMF0gPT0gJ0cnCi0gICAgICB8fCBuYW1lWzBdID09ICdsJyB8fCBuYW1lWzBdID09ICdMJwotICAgICAgfHwgbmFtZVswXSA9PSAncycgfHwgbmFtZVswXSA9PSAnUycpCi0gICAgewotICAgICAgLyogUGVyaGFwcyBhIGdsb2JhbCBvciBsb2NhbCByZWdpc3RlciBuYW1lICovCi0gICAgICBpZiAobmFtZVsxXSA9PSAncicgfHwgbmFtZVsxXSA9PSAnUicpCi0JewotCSAgbG9uZyBtYXhyZWc7Ci0KLQkgIC8qIFBhcnNlIHRoZSBudW1iZXIsIG1ha2Ugc3VyZSBpdCBoYXMgbm8gZXh0cmEgemVyb2VzIG9yCi0JICAgICB0cmFpbGluZyBjaGFycy4gKi8KLQkgIHJlZ251bSA9IGF0b2wgKCZuYW1lWzJdKTsKLQotCSAgaWYgKG5hbWVbMF0gPT0gJ3MnIHx8IG5hbWVbMF0gPT0gJ1MnKQotCSAgICBtYXhyZWcgPSAyNTU7Ci0JICBlbHNlCi0JICAgIG1heHJlZyA9IDEyNzsKLQkgIGlmIChyZWdudW0gPiBtYXhyZWcpCi0JICAgIHJldHVybiBOVUxMOwotCi0JICBzcHJpbnRmICh0ZXN0YnVmLCAiJWxkIiwgcmVnbnVtKTsKLQkgIGlmIChzdHJjbXAgKHRlc3RidWYsICZuYW1lWzJdKSAhPSAwKQotCSAgICByZXR1cm4gTlVMTDsJLyogZ3IwMDcgb3IgbHI3Zm9vIG9yIHdoYXRldmVyICovCi0KLQkgIC8qIFdlIGhhdmUgYSB3aWVuZXIhICBEZWZpbmUgYW5kIHJldHVybiBhIG5ldyBzeW1ib2wgZm9yIGl0LiAgKi8KLQkgIGlmIChuYW1lWzBdID09ICdsJyB8fCBuYW1lWzBdID09ICdMJykKLQkgICAgcmVnbnVtICs9IDEyODsKLQkgIGVsc2UgaWYgKG5hbWVbMF0gPT0gJ3MnIHx8IG5hbWVbMF0gPT0gJ1MnKQotCSAgICByZWdudW0gKz0gU1JFRzsKLQkgIHJldHVybiAoc3ltYm9sX25ldyAobmFtZSwgU0VHX1JFR0lTVEVSLCAodmFsdWVUKSByZWdudW0sCi0JCQkgICAgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBQYXJzZSBhbiBvcGVyYW5kIHRoYXQgaXMgbWFjaGluZS1zcGVjaWZpYy4gICovCi0KLXZvaWQKLW1kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0KLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnJScgJiYgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICclJykKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGEgbnVtZXJpYyByZWdpc3RlciBleHByZXNzaW9uLiAgTm8gYmlnZ3kuICAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7CS8qIFNraXAgJSUgKi8KLSAgICAgICh2b2lkKSBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgIT0gT19jb25zdGFudAotCSAgfHwgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA+IDI1NSkKLQlhc19iYWQgKF8oIkludmFsaWQgZXhwcmVzc2lvbiBhZnRlciAlJSUlXG4iKSk7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgfQotICBlbHNlIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJyYnKQotICAgIHsKLSAgICAgIC8qIFdlIGFyZSB0YWtpbmcgdGhlICdhZGRyZXNzJyBvZiBhIHJlZ2lzdGVyLi4udGhpcyBvbmUgaXMgbm90Ci0JIGluIHRoZSBtYW51YWwsIGJ1dCBpdCAqaXMqIGluIHRyYXBzL2Zwc3ltYm9sLmghICBXaGF0IHRoZXkKLQkgc2VlbSB0byB3YW50IGlzIHRoZSByZWdpc3RlciBudW1iZXIsIGFzIGFuIGFic29sdXRlIG51bWJlci4gICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJLyogU2tpcCAmICovCi0gICAgICAodm9pZCkgZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICAgICAgaWYgKGV4cHJlc3Npb25QLT5YX29wICE9IE9fcmVnaXN0ZXIpCi0JYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGluICYgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGVsc2UKLQlleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotICBlbHNlIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJyQnCi0JICAgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclsxXSkpCi0gICAgewotICAgICAgbG9uZyBsYWI7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgc3ltYm9sUyAqc3ltOwotCi0gICAgICAvKiBUaGlzIGlzIGEgbG9jYWwgbGFiZWwuICAqLwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBsYWIgPSAobG9uZykgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAoZG9sbGFyX2xhYmVsX2RlZmluZWQgKGxhYikpCi0JewotCSAgbmFtZSA9IGRvbGxhcl9sYWJlbF9uYW1lIChsYWIsIDApOwotCSAgc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBuYW1lID0gZG9sbGFyX2xhYmVsX25hbWUgKGxhYiwgMSk7Ci0JICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQl9Ci0KLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJyQnKQotICAgIHsKLSAgICAgIGNoYXIgKnM7Ci0gICAgICBjaGFyIHR5cGU7Ci0gICAgICBpbnQgZmllbGRudW0sIGZpZWxkbGltaXQ7Ci0gICAgICBMSVRUTEVOVU1fVFlQRSBmbG9hdGJ1Zls4XTsKLQotICAgICAgLyogJGZsb2F0KCksICRkb3VibGVOKCksIG9yICRleHRlbmROKCkgY29udmVydCBmbG9hdGluZyB2YWx1ZXMKLQkgdG8gaW50ZWdlcnMuICAqLwotCi0gICAgICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICArK3M7Ci0KLSAgICAgIGZpZWxkbnVtID0gMDsKLSAgICAgIGlmIChzdHJuY21wIChzLCAiZG91YmxlIiwgc2l6ZW9mICJkb3VibGUiIC0gMSkgPT0gMCkKLQl7Ci0JICBzICs9IHNpemVvZiAiZG91YmxlIiAtIDE7Ci0JICB0eXBlID0gJ2QnOwotCSAgZmllbGRsaW1pdCA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywgImZsb2F0Iiwgc2l6ZW9mICJmbG9hdCIgLSAxKSA9PSAwKQotCXsKLQkgIHMgKz0gc2l6ZW9mICJmbG9hdCIgLSAxOwotCSAgdHlwZSA9ICdmJzsKLQkgIGZpZWxkbGltaXQgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHMsICJleHRlbmQiLCBzaXplb2YgImV4dGVuZCIgLSAxKSA9PSAwKQotCXsKLQkgIHMgKz0gc2l6ZW9mICJleHRlbmQiIC0gMTsKLQkgIHR5cGUgPSAneCc7Ci0JICBmaWVsZGxpbWl0ID0gNDsKLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChpc2RpZ2l0ICgqcykpCi0JewotCSAgZmllbGRudW0gPSAqcyAtICcwJzsKLQkgICsrczsKLQl9Ci0gICAgICBpZiAoZmllbGRudW0gPj0gZmllbGRsaW1pdCkKLQlyZXR1cm47Ci0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqcyAhPSAnKCcpCi0JcmV0dXJuOwotICAgICAgKytzOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICBzID0gYXRvZl9pZWVlIChzLCB0eXBlLCBmbG9hdGJ1Zik7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXJldHVybjsKLSAgICAgIHMgPSBzOwotCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKnMgIT0gJyknKQotCXJldHVybjsKLSAgICAgICsrczsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsgCi0gICAgICBleHByZXNzaW9uUC0+WF91bnNpZ25lZCA9IDE7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gKChmbG9hdGJ1ZltmaWVsZG51bSAqIDJdCi0JCQkJICAgIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkJCQkgICArIGZsb2F0YnVmW2ZpZWxkbnVtICogMiArIDFdKTsKLSAgICB9Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiBzaXplOwkJCS8qIEJ5dGUgYWxpZ25tZW50IGlzIGZpbmUgKi8KLX0KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIDI5MDAwLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiwKLSAgIHdoaWNoIHdlIGhhdmUgc2V0IHVwIGFzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXh1cCB0b28uICAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotLyogZW5kIG9mIHRjLWEyOWsuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hMjlrLmggYi9nYXMvY29uZmlnL3RjLWEyOWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwZjYwNS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWEyOWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIHRjLWEyOWsuaCAtLSBBc3NlbWJsZSBmb3IgdGhlIEFNRCAyOTAwMC4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX0EyOUsKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTgkxCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIExFWF9ET0xMQVIgMQotCi0jZGVmaW5lIHRjX3VucmVjb2duaXplZF9saW5lKGMpIGEyOWtfdW5yZWNvZ25pemVkX2xpbmUgKGMpCi1leHRlcm4gaW50IGEyOWtfdW5yZWNvZ25pemVkX2xpbmUgUEFSQU1TICgoaW50KSk7Ci0KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQk7CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJOwkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJOwkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2soYSkJOwkvKiBub3QgdXNlZCAqLwotCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgMTAxCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeF9wdHIpIHRjX2NvZmZfZml4MnJ0eXBlKGZpeF9wdHIpCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX2EyOWsKLSNkZWZpbmUgQ09GRl9NQUdJQyBTSVBGQk9NQUdJQwotLyogU2hvdWxkIHRoZSByZWxvYyBiZSBvdXRwdXQgPwotCW9uIHRoZSAyOWssIHRoaXMgaXMgdHJ1ZSBvbmx5IGlmIHRoZXJlIGlzIGEgc3ltYm9sIGF0dGF0Y2hlZC4KLQlvbiB0aGUgaDgsIHRoaXMgaXMgYWxsd2F5cyB0cnVlLCBzaW5jZSBubyBmaXh1cCBpcyBkb25lCi0qLwotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoeC0+ZnhfYWRkc3kpCi0jZGVmaW5lIFRDX0NPTlNfUkVMT0MgUkVMT0NfMzIKLQotI2RlZmluZSBDT0ZGX0ZMQUdTIEZfQVIzMlcKLSNkZWZpbmUgcmVsb2NfdHlwZSBpbnQKLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUKLQotI2RlZmluZSBaRVJPX0JBU0VEX1NFR01FTlRTCi0KLS8qIGVuZCBvZiB0Yy1hMjlrLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYWxwaGEuYyBiL2dhcy9jb25maWcvdGMtYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViOWE1Ny4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWFscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjU1ICswLDAgQEAKLS8qIHRjLWFscGhhLmMgLSBQcm9jZXNzb3Itc3BlY2lmaWMgY29kZSBmb3IgdGhlIERFQyBBbHBoYSBBWFAgQ1BVLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5My05OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LCAxOTkzLgotICAgV3JpdHRlbiBieSBBbGVzc2FuZHJvIEZvcmluLCBiYXNlZCBvbiBlYXJsaWVyIGdhcy0xLjM4IHRhcmdldCBDUFUgZmlsZXMuCi0gICBNb2RpZmllZCBieSBLZW4gUmFlYnVybiBmb3IgZ2FzLTIueCBhbmQgRUNPRkYgc3VwcG9ydC4KLSAgIE1vZGlmaWVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIGZvciBFTEYgc3VwcG9ydC4KLSAgIE1vZGlmaWVkIGJ5IEtsYXVzIEsiYW1wZiBmb3IgRVZBWCAoT3BlblZNUy9BbHBoYSkgc3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIE1hY2ggT3BlcmF0aW5nIFN5c3RlbQotICogQ29weXJpZ2h0IChjKSAxOTkzIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoZQotICogc29mdHdhcmUsIGRlcml2YXRpdmUgd29ya3Mgb3IgbW9kaWZpZWQgdmVyc2lvbnMsIGFuZCBhbnkgcG9ydGlvbnMKLSAqIHRoZXJlb2YsIGFuZCB0aGF0IGJvdGggbm90aWNlcyBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgotICoKLSAqIENBUk5FR0lFIE1FTExPTiBBTExPV1MgRlJFRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBJTiBJVFMKLSAqIENPTkRJVElPTi4gIENBUk5FR0lFIE1FTExPTiBESVNDTEFJTVMgQU5ZIExJQUJJTElUWSBPRiBBTlkgS0lORCBGT1IKLSAqIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLgotICoKLSAqIENhcm5lZ2llIE1lbGxvbiByZXF1ZXN0cyB1c2VycyBvZiB0aGlzIHNvZnR3YXJlIHRvIHJldHVybiB0bwotICoKLSAqICBTb2Z0d2FyZSBEaXN0cmlidXRpb24gQ29vcmRpbmF0b3IgIG9yICBTb2Z0d2FyZS5EaXN0cmlidXRpb25AQ1MuQ01VLkVEVQotICogIFNjaG9vbCBvZiBDb21wdXRlciBTY2llbmNlCi0gKiAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqICBQaXR0c2J1cmdoIFBBIDE1MjEzLTM4OTAKLSAqCi0gKiBhbnkgaW1wcm92ZW1lbnRzIG9yIGV4dGVuc2lvbnMgdGhhdCB0aGV5IG1ha2UgYW5kIGdyYW50IENhcm5lZ2llIHRoZQotICogcmlnaHRzIHRvIHJlZGlzdHJpYnV0ZSB0aGVzZSBjaGFuZ2VzLgotICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJzdHJ1Yy1zeW1ib2wuaCIKLSNpbmNsdWRlICJlY29mZi5oIgotCi0jaW5jbHVkZSAib3Bjb2RlL2FscGhhLmgiCi0KLSNpZmRlZiBPQkpfRUxGCi0jaW5jbHVkZSAiZWxmL2FscGhhLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLQwKLS8qIExvY2FsIHR5cGVzICovCi0KLSNkZWZpbmUgVE9LRU5JWkVfRVJST1IgLTEKLSNkZWZpbmUgVE9LRU5JWkVfRVJST1JfUkVQT1JUIC0yCi0KLSNkZWZpbmUgTUFYX0lOU05fRklYVVBTIDIKLSNkZWZpbmUgTUFYX0lOU05fQVJHUyA1Ci0KLXN0cnVjdCBhbHBoYV9maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci0KLXN0cnVjdCBhbHBoYV9pbnNuCi17Ci0gIHVuc2lnbmVkIGluc247Ci0gIGludCBuZml4dXBzOwotICBzdHJ1Y3QgYWxwaGFfZml4dXAgZml4dXBzW01BWF9JTlNOX0ZJWFVQU107Ci0gIHVuc2lnbmVkIHNlcXVlbmNlW01BWF9JTlNOX0ZJWFVQU107Ci19OwotCi1lbnVtIGFscGhhX21hY3JvX2FyZwotewotICBNQUNST19FT0EgPSAxLAotICBNQUNST19JUiwKLSAgTUFDUk9fUElSLAotICBNQUNST19PUElSLAotICBNQUNST19DUElSLAotICBNQUNST19GUFIsCi0gIE1BQ1JPX0VYUCwKLSAgTUFDUk9fTElURVJBTCwKLSAgTUFDUk9fQkFTRSwKLSAgTUFDUk9fQllUT0ZGLAotICBNQUNST19KU1IKLX07Ci0KLXN0cnVjdCBhbHBoYV9tYWNybwotewotICBjb25zdCBjaGFyICpuYW1lOwotICB2b2lkICgqZW1pdCkgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLSAgY29uc3QgUFRSIGFyZzsKLSAgZW51bSBhbHBoYV9tYWNyb19hcmcgYXJnc2V0c1sxNl07Ci19OwotCi0vKiBFeHRyYSBleHByZXNzaW9uIHR5cGVzLiAqLwotCi0jZGVmaW5lIE9fcHJlZ2lzdGVyCU9fbWQxCS8qIE9fcmVnaXN0ZXIsIGluIHBhcmVudGhlc2VzICovCi0jZGVmaW5lIE9fY3ByZWdpc3RlcglPX21kMgkvKiArIGEgbGVhZGluZyBjb21tYSAqLwotCi0jaWZkZWYgUkVMT0NfT1BfUAotLyogTm90ZSwgdGhlIGFscGhhX3JlbG9jX29wIHRhYmxlIGJlbG93IGRlcGVuZHMgb24gdGhlIG9yZGVyaW5nCi0gICBvZiBPX2xpdGVyYWwgLi4gT19ncHJlbG93LiAgKi8KLSNkZWZpbmUgT19saXRlcmFsCU9fbWQzCS8qICFsaXRlcmFsIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgT19saXR1c2VfYmFzZQlPX21kNAkvKiAhbGl0dXNlX2Jhc2UgcmVsb2NhdGlvbiAqLwotI2RlZmluZSBPX2xpdHVzZV9ieXRvZmYJT19tZDUJLyogIWxpdHVzZV9ieXRvZmYgcmVsb2NhdGlvbiAqLwotI2RlZmluZSBPX2xpdHVzZV9qc3IJT19tZDYJLyogIWxpdHVzZV9qc3IgcmVsb2NhdGlvbiAqLwotI2RlZmluZSBPX2dwZGlzcAlPX21kNwkvKiAhZ3BkaXNwIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgT19ncHJlbGhpZ2gJT19tZDgJLyogIWdwcmVsaGlnaCByZWxvY2F0aW9uICovCi0jZGVmaW5lIE9fZ3ByZWxsb3cJT19tZDkJLyogIWdwcmVsbG93IHJlbG9jYXRpb24gKi8KLQotI2RlZmluZSBVU0VSX1JFTE9DX1AoUikgKChSKSA+PSBPX2xpdGVyYWwgJiYgKFIpIDw9IE9fZ3ByZWxsb3cpCi0jZW5kaWYKLQotCi0vKiBNYWNyb3MgZm9yIGV4dHJhY3RpbmcgdGhlIHR5cGUgYW5kIG51bWJlciBvZiBlbmNvZGVkIHJlZ2lzdGVyIHRva2VucyAqLwotCi0jZGVmaW5lIGlzX2lyX251bSh4KQkJKCgoeCkgJiAzMikgPT0gMCkKLSNkZWZpbmUgaXNfZnByX251bSh4KQkJKCgoeCkgJiAzMikgIT0gMCkKLSNkZWZpbmUgcmVnbm8oeCkJCSgoeCkgJiAzMSkKLQotLyogU29tZXRoaW5nIG9kZCBpbmhlcml0ZWQgZnJvbSB0aGUgb2xkIGFzc2VtYmxlciAqLwotCi0jZGVmaW5lIG5vdGVfZ3ByZWcoUikJCShhbHBoYV9ncHJtYXNrIHw9ICgxIDw8IChSKSkpCi0jZGVmaW5lIG5vdGVfZnByZWcoUikJCShhbHBoYV9mcHJtYXNrIHw9ICgxIDw8IChSKSkpCi0KLS8qIFByZWRpY2F0ZXMgZm9yIDE2LSBhbmQgMzItYml0IHJhbmdlcyAqLwotLyogWFhYOiBUaGUgbm9uLXNoaWZ0IHZlcnNpb24gYXBwZWFycyB0byB0cmlnZ2VyIGEgY29tcGlsZXIgYnVnIHdoZW4KLSAgIGNyb3NzLWFzc2VtYmxpbmcgZnJvbSB4ODYgdy8gZ2NjIDIuNy4yLiAgKi8KLQotI2lmIDEKLSNkZWZpbmUgcmFuZ2Vfc2lnbmVkXzE2KHgpIFwKLQkoKChvZmZzZXRUKSh4KSA+PiAxNSkgPT0gMCB8fCAoKG9mZnNldFQpKHgpID4+IDE1KSA9PSAtMSkKLSNkZWZpbmUgcmFuZ2Vfc2lnbmVkXzMyKHgpIFwKLQkoKChvZmZzZXRUKSh4KSA+PiAzMSkgPT0gMCB8fCAoKG9mZnNldFQpKHgpID4+IDMxKSA9PSAtMSkKLSNlbHNlCi0jZGVmaW5lIHJhbmdlX3NpZ25lZF8xNih4KQkoKG9mZnNldFQpKHgpID49IC0ob2Zmc2V0VCkweDgwMDAgJiYJXAotCQkJCSAob2Zmc2V0VCkoeCkgPD0gIChvZmZzZXRUKTB4N0ZGRikKLSNkZWZpbmUgcmFuZ2Vfc2lnbmVkXzMyKHgpCSgob2Zmc2V0VCkoeCkgPj0gLShvZmZzZXRUKTB4ODAwMDAwMDAgJiYgXAotCQkJCSAob2Zmc2V0VCkoeCkgPD0gIChvZmZzZXRUKTB4N0ZGRkZGRkYpCi0jZW5kaWYKLQotLyogTWFjcm9zIGZvciBzaWduIGV4dGVuZGluZyBmcm9tIDE2LSBhbmQgMzItYml0cy4gICovCi0vKiBYWFg6IFRoZSBjYXN0IG1hY3JvcyB3aWxsIHdvcmsgb24gYWxsIHRoZSBzeXN0ZW1zIHRoYXQgSSBjYXJlIGFib3V0LAotICAgYnV0IHJlYWxseSBhIHByZWRpY2F0ZSBzaG91bGQgYmUgZm91bmQgdG8gdXNlIHRoZSBub24tY2FzdCBmb3Jtcy4gICovCi0KLSNpZiAxCi0jZGVmaW5lIHNpZ25fZXh0ZW5kXzE2KHgpCSgoc2hvcnQpKHgpKQotI2RlZmluZSBzaWduX2V4dGVuZF8zMih4KQkoKGludCkoeCkpCi0jZWxzZQotI2RlZmluZSBzaWduX2V4dGVuZF8xNih4KQkoKG9mZnNldFQpKCgoeCkgJiAweEZGRkYpIF4gMHg4MDAwKSAtIDB4ODAwMCkKLSNkZWZpbmUgc2lnbl9leHRlbmRfMzIoeCkJKChvZmZzZXRUKSgoKHgpICYgMHhGRkZGRkZGRikgXAotCQkJCQkgICBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMCkKLSNlbmRpZgotCi0vKiBNYWNyb3MgdG8gYnVpbGQgdG9rZW5zICovCi0KLSNkZWZpbmUgc2V0X3Rva19yZWcodCwgcikJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fcmVnaXN0ZXIsCQkJXAotCQkJCSAodCkuWF9hZGRfbnVtYmVyID0gKHIpKQotI2RlZmluZSBzZXRfdG9rX3ByZWcodCwgcikJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fcHJlZ2lzdGVyLAkJXAotCQkJCSAodCkuWF9hZGRfbnVtYmVyID0gKHIpKQotI2RlZmluZSBzZXRfdG9rX2NwcmVnKHQsIHIpCShtZW1zZXQoJih0KSwgMCwgc2l6ZW9mKHQpKSwJCVwKLQkJCQkgKHQpLlhfb3AgPSBPX2NwcmVnaXN0ZXIsCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikpCi0jZGVmaW5lIHNldF90b2tfZnJlZyh0LCByKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19yZWdpc3RlciwJCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikrMzIpCi0jZGVmaW5lIHNldF90b2tfc3ltKHQsIHMsIGEpCShtZW1zZXQoJih0KSwgMCwgc2l6ZW9mKHQpKSwJCVwKLQkJCQkgKHQpLlhfb3AgPSBPX3N5bWJvbCwJCQlcCi0JCQkJICh0KS5YX2FkZF9zeW1ib2wgPSAocyksCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAoYSkpCi0jZGVmaW5lIHNldF90b2tfY29uc3QodCwgbikJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fY29uc3RhbnQsCQkJXAotCQkJCSAodCkuWF9hZGRfbnVtYmVyID0gKG4pKQotCi0MCi0vKiBQcm90b3R5cGVzIGZvciBhbGwgbG9jYWwgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBpbnQgdG9rZW5pemVfYXJndW1lbnRzIFBBUkFNUyAoKGNoYXIgKiwgZXhwcmVzc2lvblMgKiwgaW50KSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqZmluZF9vcGNvZGVfbWF0Y2gKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqLCBjb25zdCBleHByZXNzaW9uUyAqLCBpbnQgKiwgaW50ICopKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKmZpbmRfbWFjcm9fbWF0Y2gKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGFscGhhX21hY3JvICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X29wZXJhbmQKLSAgUEFSQU1TICgodW5zaWduZWQsIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICosIG9mZnNldFQsIGNoYXIgKiwgdW5zaWduZWQpKTsKLXN0YXRpYyB2b2lkIGFzc2VtYmxlX2luc24KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqLCBjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsCi0JICAgc3RydWN0IGFscGhhX2luc24gKikpOwotc3RhdGljIHZvaWQgZW1pdF9pbnNuIFBBUkFNUyAoKHN0cnVjdCBhbHBoYV9pbnNuICopKTsKLXN0YXRpYyB2b2lkIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBzdHJ1Y3QgYWxwaGFfaW5zbiAqKSk7Ci1zdGF0aWMgdm9pZCBhc3NlbWJsZV90b2tlbnMKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGludCkpOwotCi1zdGF0aWMgaW50IGxvYWRfZXhwcmVzc2lvbgotICBQQVJBTVMgKChpbnQsIGNvbnN0IGV4cHJlc3Npb25TICosIGludCAqLCBleHByZXNzaW9uUyAqLAotCSAgIGNvbnN0IGV4cHJlc3Npb25TICopKTsKLQotc3RhdGljIHZvaWQgZW1pdF9sZGdwIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2RpdmlzaW9uIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2xkYSBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9sZGFoIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2lyX2xvYWQgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfbG9hZHN0b3JlIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2pzcmptcCBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9sZFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfbGRYdSBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF91bGRYIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X3VsZFh1IFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2xkaWwgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfc3RYIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X3VzdFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfc2V4dFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfcmV0amNyIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyB2b2lkIHNfYWxwaGFfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNpZm5kZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgc19hbHBoYV9jb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9yZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FQ09GRgotc3RhdGljIHZvaWQgc19hbHBoYV9zZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfZW50IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9lbmQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX21hc2sgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2ZyYW1lIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9wcm9sb2d1ZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfY29mZl93cmFwcGVyIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgc19hbHBoYV9ncHJlbDMyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9wcm9jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9zZXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2Jhc2UgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9zdHJpbmdlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc3BhY2UgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyB2b2lkIGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWdUICosIHN5bWJvbFMgKiopKTsKLSNpZm5kZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgc2VsZWN0X2dwX3ZhbHVlIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgYWxwaGFfYWxpZ24gUEFSQU1TICgoaW50LCBjaGFyICosIHN5bWJvbFMgKiwgaW50KSk7Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi1zdGF0aWMgdm9pZCBhbHBoYV9hZGp1c3Rfc3ltdGFiX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0jZW5kaWYKLQotDAotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsCi0gICB0YXJnZXRzLiAgKi8KLQotLyogQ2hhcmFjdGVycyB3aGljaCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEKLSAgIHNpbmdsZSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHBvbmVudCBpbiBhIGZsb2F0aW5nCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsCi0gICBhcyBpbiAwZDEuMC4gICovCi0jaWYgMAotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0jZWxzZQotLyogWFhYOiBEbyBhbGwgb2YgdGhlc2UgcmVhbGx5IGdldCB1c2VkIG9uIHRoZSBhbHBoYT8/ICAqLwotY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRVZBWAotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkZtOmcrMWg6SEc6IjsKLSNlbHNlCi1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiRm06Z0c6IjsKLSNlbmRpZgotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0jZGVmaW5lIE9QVElPTl8zMkFERFIgKE9QVElPTl9NRF9CQVNFKQotICB7ICIzMmFkZHIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OXzMyQUREUiB9LAotI2RlZmluZSBPUFRJT05fUkVMQVggKE9QVElPTl8zMkFERFIrMSkKLSAgeyAicmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JFTEFYIH0sCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBPUFRJT05fTURFQlVHIChPUFRJT05fUkVMQVgrMSkKLSNkZWZpbmUgT1BUSU9OX05PX01ERUJVRyAoT1BUSU9OX01ERUJVRysxKQotICB7ICJtZGVidWciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01ERUJVRyB9LAotICB7ICJuby1tZGVidWciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX01ERUJVRyB9LAotI2VuZGlmCi0gIHsgTlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDAgfQotfTsKLQotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi0MCi0jaWZkZWYgT0JKX0VWQVgKLSNkZWZpbmUgQVhQX1JFR19SMCAgICAgMAotI2RlZmluZSBBWFBfUkVHX1IxNiAgICAxNgotI2RlZmluZSBBWFBfUkVHX1IxNyAgICAxNwotI3VuZGVmIEFYUF9SRUdfVDkKLSNkZWZpbmUgQVhQX1JFR19UOSAgICAgMjIKLSN1bmRlZiBBWFBfUkVHX1QxMAotI2RlZmluZSBBWFBfUkVHX1QxMCAgICAyMwotI3VuZGVmIEFYUF9SRUdfVDExCi0jZGVmaW5lIEFYUF9SRUdfVDExICAgIDI0Ci0jdW5kZWYgQVhQX1JFR19UMTIKLSNkZWZpbmUgQVhQX1JFR19UMTIgICAgMjUKLSNkZWZpbmUgQVhQX1JFR19BSSAgICAgMjUKLSN1bmRlZiBBWFBfUkVHX0ZQCi0jZGVmaW5lIEFYUF9SRUdfRlAgICAgIDI5Ci0KLSN1bmRlZiBBWFBfUkVHX0dQCi0jZGVmaW5lIEFYUF9SRUdfR1AgQVhQX1JFR19QVgotI2VuZGlmIC8qIE9CSl9FVkFYICAqLwotCi0vKiBUaGUgY3B1IGZvciB3aGljaCB3ZSBhcmUgZ2VuZXJhdGluZyBjb2RlICovCi1zdGF0aWMgdW5zaWduZWQgYWxwaGFfdGFyZ2V0ID0gQVhQX09QQ09ERV9CQVNFOwotc3RhdGljIGNvbnN0IGNoYXIgKmFscGhhX3RhcmdldF9uYW1lID0gIjxhbGw+IjsKLQotLyogVGhlIGhhc2ggdGFibGUgb2YgaW5zdHJ1Y3Rpb24gb3Bjb2RlcyAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmFscGhhX29wY29kZV9oYXNoOwotCi0vKiBUaGUgaGFzaCB0YWJsZSBvZiBtYWNybyBvcGNvZGVzICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqYWxwaGFfbWFjcm9faGFzaDsKLQotI2lmZGVmIE9CSl9FQ09GRgotLyogVGhlICRncCByZWxvY2F0aW9uIHN5bWJvbCAqLwotc3RhdGljIHN5bWJvbFMgKmFscGhhX2dwX3N5bWJvbDsKLQotLyogWFhYOiB3aGF0IGlzIHRoaXMsIGFuZCB3aHkgaXMgaXQgZXhwb3J0ZWQ/ICovCi12YWx1ZVQgYWxwaGFfZ3BfdmFsdWU7Ci0jZW5kaWYKLQotLyogVGhlIGN1cnJlbnQgJGdwIHJlZ2lzdGVyICovCi1zdGF0aWMgaW50IGFscGhhX2dwX3JlZ2lzdGVyID0gQVhQX1JFR19HUDsKLQotLyogQSB0YWJsZSBvZiB0aGUgcmVnaXN0ZXIgc3ltYm9scyAqLwotc3RhdGljIHN5bWJvbFMgKmFscGhhX3JlZ2lzdGVyX3RhYmxlWzY0XTsKLQotLyogQ29uc3RhbnQgc2VjdGlvbnMsIG9yIHNlY3Rpb25zIG9mIGNvbnN0YW50cyAqLwotI2lmZGVmIE9CSl9FQ09GRgotc3RhdGljIHNlZ1QgYWxwaGFfbGl0YV9zZWN0aW9uOwotc3RhdGljIHNlZ1QgYWxwaGFfbGl0NF9zZWN0aW9uOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLXN0YXRpYyBzZWdUIGFscGhhX2xpbmtfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIGFscGhhX2N0b3JzX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCBhbHBoYV9kdG9yc19zZWN0aW9uOwotI2VuZGlmCi1zdGF0aWMgc2VnVCBhbHBoYV9saXQ4X3NlY3Rpb247Ci0KLS8qIFN5bWJvbHMgcmVmZXJyaW5nIHRvIHNhaWQgc2VjdGlvbnMuICovCi0jaWZkZWYgT0JKX0VDT0ZGCi1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfbGl0YV9zeW1ib2w7Ci1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfbGl0NF9zeW1ib2w7Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRVZBWAotc3RhdGljIHN5bWJvbFMgKmFscGhhX2xpbmtfc3ltYm9sOwotc3RhdGljIHN5bWJvbFMgKmFscGhhX2N0b3JzX3N5bWJvbDsKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9kdG9yc19zeW1ib2w7Ci0jZW5kaWYKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9saXQ4X3N5bWJvbDsKLQotLyogTGl0ZXJhbCBmb3IgLmxpdFgrMHg4MDAwIHdpdGhpbiAubGl0YSAqLwotI2lmZGVmIE9CSl9FQ09GRgotc3RhdGljIG9mZnNldFQgYWxwaGFfbGl0NF9saXRlcmFsOwotc3RhdGljIG9mZnNldFQgYWxwaGFfbGl0OF9saXRlcmFsOwotI2VuZGlmCi0KLS8qIFRoZSBhY3RpdmUgLmVudCBzeW1ib2wuICAqLwotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9jdXJfZW50X3N5bTsKLSNlbmRpZgotCi0vKiBJcyB0aGUgYXNzZW1ibGVyIG5vdCBhbGxvd2VkIHRvIHVzZSAkYXQ/ICovCi1zdGF0aWMgaW50IGFscGhhX25vYXRfb24gPSAwOwotCi0vKiBBcmUgbWFjcm9zIGVuYWJsZWQ/ICovCi1zdGF0aWMgaW50IGFscGhhX21hY3Jvc19vbiA9IDE7Ci0KLS8qIEFyZSBmbG9hdHMgZGlzYWJsZWQ/ICovCi1zdGF0aWMgaW50IGFscGhhX25vZmxvYXRzX29uID0gMDsKLQotLyogQXJlIGFkZHJlc3NlcyAzMiBiaXQ/ICovCi1zdGF0aWMgaW50IGFscGhhX2FkZHIzMl9vbiA9IDA7Ci0KLS8qIFN5bWJvbCBsYWJlbGxpbmcgdGhlIGN1cnJlbnQgaW5zbi4gIFdoZW4gdGhlIEFscGhhIGdhcyBzZWVzCi0gICAgIGZvbzoKLSAgICAgICAucXVhZCAwCi0gICBhbmQgdGhlIHNlY3Rpb24gaGFwcGVucyB0byBub3QgYmUgb24gYW4gZWlnaHQgYnl0ZSBib3VuZGFyeSwgaXQKLSAgIHdpbGwgYWxpZ24gYm90aCB0aGUgc3ltYm9sIGFuZCB0aGUgLnF1YWQgdG8gYW4gZWlnaHQgYnl0ZSBib3VuZGFyeS4gICovCi1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfaW5zbl9sYWJlbDsKLQotLyogV2hldGhlciB3ZSBzaG91bGQgYXV0b21hdGljYWxseSBhbGlnbiBkYXRhIGdlbmVyYXRpb24gcHNldWRvLW9wcy4KLSAgIC5hbGlnbiAwIHdpbGwgdHVybiB0aGlzIG9mZi4gICovCi1zdGF0aWMgaW50IGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOwotCi0vKiBUaGUga25vd24gY3VycmVudCBhbGlnbm1lbnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi1zdGF0aWMgaW50IGFscGhhX2N1cnJlbnRfYWxpZ247Ci0KLS8qIFRoZXNlIGFyZSBleHBvcnRlZCB0byBFQ09GRiBjb2RlLiAgKi8KLXVuc2lnbmVkIGxvbmcgYWxwaGFfZ3BybWFzaywgYWxwaGFfZnBybWFzazsKLQotLyogV2hldGhlciB0aGUgZGVidWdnaW5nIG9wdGlvbiB3YXMgc2Vlbi4gICovCi1zdGF0aWMgaW50IGFscGhhX2RlYnVnOwotCi0jaWZkZWYgT0JKX0VMRgotLyogV2hldGhlciB3ZSBhcmUgZW1pdHRpbmcgYW4gbWRlYnVnIHNlY3Rpb24uICAqLwotaW50IGFscGhhX2ZsYWdfbWRlYnVnID0gMTsKLSNlbmRpZgotCi0vKiBEb24ndCBmdWxseSByZXNvbHZlIHJlbG9jYXRpb25zLCBhbGxvd2luZyBjb2RlIG1vdmVtZW50IGluIHRoZSBsaW5rZXIuICAqLwotc3RhdGljIGludCBhbHBoYV9mbGFnX3JlbGF4OwotCi0vKiBXaGF0IHZhbHVlIHRvIGdpdmUgdG8gYmZkX3NldF9ncF9zaXplLiAgKi8KLXN0YXRpYyBpbnQgZ19zd2l0Y2hfdmFsdWUgPSA4OwotCi0jaWZkZWYgT0JKX0VWQVgKLS8qIENvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBwcm9jZWR1cmUgaGVyZS4gICovCi1zdGF0aWMgc3RydWN0IHsKLSAgc3ltYm9sUyAqc3ltYm9sOwkvKiBwcm9jIHBkZXNjIHN5bWJvbCAqLwotICBpbnQgcGRzY2tpbmQ7Ci0gIGludCBmcmFtZXJlZzsJCS8qIHJlZ2lzdGVyIGZvciBmcmFtZSBwb2ludGVyICovCi0gIGludCBmcmFtZXNpemU7CS8qIHNpemUgb2YgZnJhbWUgKi8KLSAgaW50IHJzYV9vZmZzZXQ7Ci0gIGludCByYV9zYXZlOwotICBpbnQgZnBfc2F2ZTsKLSAgbG9uZyBpbWFzazsKLSAgbG9uZyBmbWFzazsKLSAgaW50IHR5cGU7Ci0gIGludCBwcm9sb2d1ZTsKLX0gYWxwaGFfZXZheF9wcm9jOwotCi1zdGF0aWMgaW50IGFscGhhX2ZsYWdfaGFzaF9sb25nX25hbWVzID0gMDsJCS8qIC0rICovCi1zdGF0aWMgaW50IGFscGhhX2ZsYWdfc2hvd19hZnRlcl90cnVuYyA9IDA7CQkvKiAtSCAqLwotCi0vKiBJZiB0aGUgLSsgc3dpdGNoIGlzIGdpdmVuLCB0aGVuIGEgaGFzaCBpcyBhcHBlbmRlZCB0byBhbnkgbmFtZSB0aGF0IGlzCi0gKiBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzLCBlbHNlIGxvbmdlciBzeW1ib2wgbmFtZXMgYXJlIHRydW5jYXRlZC4KLSAqLwotCi0jZW5kaWYKLQwKLSNpZmRlZiBSRUxPQ19PUF9QCi0vKiBBIHRhYmxlIHRvIG1hcCB0aGUgc3BlbGxpbmcgb2YgYSByZWxvY2F0aW9uIG9wZXJhbmQgaW50byBhbiBhcHByb3ByaWF0ZQotICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHR5cGUuICBUaGUgdGFibGUgaXMgYXNzdW1lZCB0byBiZSBvcmRlcmVkIHN1Y2gKLSAgIHRoYXQgb3AtT19saXRlcmFsIGluZGV4ZXMgaW50byBpdC4gICovCi0KLSNkZWZpbmUgQUxQSEFfUkVMT0NfVEFCTEUob3ApCQkJCQkJXAotJmFscGhhX3JlbG9jX29wWyAoKCFVU0VSX1JFTE9DX1AgKG9wKSkJCQkJCVwKLQkJICA/IChhYm9ydCAoKSwgMCkJCQkJCVwKLQkJICA6IChpbnQpKG9wKSAtIChpbnQpT19saXRlcmFsKSBdCi0KLSNkZWZpbmUgTElUVVNFX0JBU0UJMQotI2RlZmluZSBMSVRVU0VfQllUT0ZGCTIKLSNkZWZpbmUgTElUVVNFX0pTUgkzCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnIHsKLSAgY29uc3QgY2hhciAqbmFtZTsJCQkJLyogc3RyaW5nIHRvIGxvb2t1cCAqLwotICBzaXplX3QgbGVuZ3RoOwkJCQkvKiBzaXplIG9mIHRoZSBzdHJpbmcgKi8KLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwkJLyogcmVsb2NhdGlvbiBiZWZvcmUgZnJvYiAqLwotICBvcGVyYXRvclQgb3A7CQkJCQkvKiB3aGljaCBvcGVyYXRvciB0byB1c2UgKi8KLSAgaW50IGxpdHVzZTsJCQkJCS8qIGFkZGVuZWQgdG8gc3BlY2lmeSBsaXR1c2UgKi8KLX0gYWxwaGFfcmVsb2Nfb3BbXSA9IHsKLQotICB7Ci0gICAgImxpdGVyYWwiLAkJCQkJLyogbmFtZSAqLwotICAgIHNpemVvZiAoImxpdGVyYWwiKS0xLAkJCS8qIGxlbmd0aCAqLwotICAgIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUwsCQkvKiByZWxvYyAqLwotICAgIE9fbGl0ZXJhbCwJCQkJCS8qIG9wICovCi0gICAgMCwJCQkJCQkvKiBsaXR1c2UgKi8KLSAgfSwKLQotICB7Ci0gICAgImxpdHVzZV9iYXNlIiwJCQkJLyogbmFtZSAqLwotICAgIHNpemVvZiAoImxpdHVzZV9iYXNlIiktMSwJCQkvKiBsZW5ndGggKi8KLSAgICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQkFTRSwJCS8qIHJlbG9jICovCi0gICAgT19saXR1c2VfYmFzZSwJCQkJLyogb3AgKi8KLSAgICBMSVRVU0VfQkFTRSwJCQkJLyogbGl0dXNlICovCi0gIH0sCi0KLSAgewotICAgICJsaXR1c2VfYnl0b2ZmIiwJCQkJLyogbmFtZSAqLwotICAgIHNpemVvZiAoImxpdHVzZV9ieXRvZmYiKS0xLAkJCS8qIGxlbmd0aCAqLwotICAgIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkYsCQkvKiByZWxvYyAqLwotICAgIE9fbGl0dXNlX2J5dG9mZiwJCQkJLyogb3AgKi8KLSAgICBMSVRVU0VfQllUT0ZGLAkJCQkvKiBsaXR1c2UgKi8KLSAgfSwKLQotICB7Ci0gICAgImxpdHVzZV9qc3IiLAkJCQkvKiBuYW1lICovCi0gICAgc2l6ZW9mICgibGl0dXNlX2pzciIpLTEsCQkJLyogbGVuZ3RoICovCi0gICAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUiwJCS8qIHJlbG9jICovCi0gICAgT19saXR1c2VfanNyLAkJCQkvKiBvcCAqLwotICAgIExJVFVTRV9KU1IsCQkJCQkvKiBsaXR1c2UgKi8KLSAgfSwKLQotICB7Ci0gICAgImdwZGlzcCIsCQkJCQkvKiBuYW1lICovCi0gICAgc2l6ZW9mICgiZ3BkaXNwIiktMSwJCQkvKiBsZW5ndGggKi8KLSAgICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1AsCQkvKiByZWxvYyAqLwotICAgIE9fZ3BkaXNwLAkJCQkJLyogb3AgKi8KLSAgICAwLAkJCQkJCS8qIGxpdHVzZSAqLwotICB9LAotCi0gIHsKLSAgICAiZ3ByZWxoaWdoIiwJCQkJLyogbmFtZSAqLwotICAgIHNpemVvZiAoImdwcmVsaGlnaCIpLTEsCQkJLyogbGVuZ3RoICovCi0gICAgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxISUdILAkJLyogcmVsb2MgKi8KLSAgICBPX2dwcmVsaGlnaCwJCQkJLyogb3AgKi8KLSAgICAwLAkJCQkJCS8qIGxpdHVzZSAqLwotICB9LAotCi0gIHsKLSAgICAiZ3ByZWxsb3ciLAkJCQkJLyogbmFtZSAqLwotICAgIHNpemVvZiAoImdwcmVsbG93IiktMSwJCQkvKiBsZW5ndGggKi8KLSAgICBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTExPVywJCS8qIHJlbG9jICovCi0gICAgT19ncHJlbGxvdywJCQkJCS8qIG9wICovCi0gICAgMCwJCQkJCQkvKiBsaXR1c2UgKi8KLSAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgYWxwaGFfbnVtX3JlbG9jX29wCi0gID0gc2l6ZW9mKGFscGhhX3JlbG9jX29wKSAvIHNpemVvZigqYWxwaGFfcmVsb2Nfb3ApOwotCi0vKiBNYXhpbXVtICMgZGlnaXRzIG5lZWRlZCB0byBob2xkIHRoZSBsYXJnZXN0IHNlcXVlbmNlICMgKi8KLSNkZWZpbmUgQUxQSEFfUkVMT0NfRElHSVRTIDI1Ci0KLS8qIFdoZXRoZXIgYSBzZXF1ZW5jZSBudW1iZXIgaXMgdmFsaWQuICAqLwotI2RlZmluZSBBTFBIQV9SRUxPQ19TRVFVRU5DRV9PSyhYKSAoKFgpID4gMCAmJiAoKHVuc2lnbmVkKShYKSkgPT0gKFgpKQotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBleHBsaWN0IHNlcXVlbmNlIGluZm9ybWF0aW9uLiAgKi8KLXN0cnVjdCBhbHBoYV9saXRlcmFsX3RhZwotewotICBmaXhTICpsaXR1c2U7CQkJLyogaGVhZCBvZiBsaW5rZWQgbGlzdCBvZiAhbGl0ZXJhbHMgKi8KLSAgc2VnVCBzZWdtZW50OwkJCS8qIHNlZ21lbnQgcmVsb2NzIGFyZSBpbiBvciB1bmRlZmluZWRfc2VjdGlvbiovCi0gIGludCBtdWx0aV9zZWN0aW9uX3A7CQkvKiBUcnVlIGlmIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiB3YXMgdXNlZCAqLwotICB1bnNpZ25lZCBzZXF1ZW5jZTsJCS8qIHNlcXVlbmNlICMgKi8KLSAgdW5zaWduZWQgbl9saXRlcmFsczsJCS8qICMgb2YgbGl0ZXJhbHMgKi8KLSAgdW5zaWduZWQgbl9saXR1c2VzOwkJLyogIyBvZiBsaXR1c2VzICovCi0gIGNoYXIgc3RyaW5nWzFdOwkJLyogcHJpbnRhYmxlIGZvcm0gb2Ygc2VxdWVuY2UgdG8gaGFzaCB3aXRoICovCi19OwotCi0vKiBIYXNoIHRhYmxlIHRvIGxpbmsgdXAgbGl0ZXJhbHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbGl0dXNlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqYWxwaGFfbGl0ZXJhbF9oYXNoOwotI2VuZGlmCi0MCi0vKiBBIHRhYmxlIG9mIENQVSBuYW1lcyBhbmQgb3Bjb2RlIHNldHMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNwdV90eXBlCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGZsYWdzOwotfSBjcHVfdHlwZXNbXSA9Ci17Ci0gIC8qIEFkIGhvYyBjb252ZW50aW9uOiBjcHUgbnVtYmVyIGdldHMgcGFsY29kZSwgcHJvY2VzcyBjb2RlIGRvZXNuJ3QuCi0gICAgIFRoaXMgc3VwcG9ydHMgdXNhZ2UgdW5kZXIgRFUgNC4wYiB0aGF0IGRvZXMgIi5hcmNoIGV2NCIsIGFuZCAKLSAgICAgdXNhZ2UgaW4gTUlMTyB0aGF0IGRvZXMgLW0yMTA2NC4gIFByb2JhYmx5IHNvbWV0aGluZyBtb3JlCi0gICAgIHNwZWNpZmljIGxpa2UgLW0yMTA2NC1wYWwgc2hvdWxkIGJlIHVzZWQsIGJ1dCBvaCB3ZWxsLiAgKi8KLQotICB7ICIyMTA2NCIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0VWNCB9LAotICB7ICIyMTA2NGEiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjEwNjYiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjEwNjgiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjExNjQiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjUgfSwKLSAgeyAiMjExNjRhIiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfQldYIH0sCi0gIHsgIjIxMTY0cGMiLCAoQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfQldYCi0JCXxBWFBfT1BDT0RFX01BWCkgfSwKLSAgeyAiMjEyNjQiLCAoQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY2fEFYUF9PUENPREVfQldYCi0JICAgICAgfEFYUF9PUENPREVfTUFYfEFYUF9PUENPREVfQ0lYKSB9LAotCi0gIHsgImV2NCIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7ICJldjQ1IiwgQVhQX09QQ09ERV9CQVNFIH0sCi0gIHsgImxjYTQ1IiwgQVhQX09QQ09ERV9CQVNFIH0sCi0gIHsgImV2NSIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7ICJldjU2IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfQldYIH0sCi0gIHsgInBjYTU2IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfQldYfEFYUF9PUENPREVfTUFYIH0sCi0gIHsgImV2NiIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0JXWHxBWFBfT1BDT0RFX01BWHxBWFBfT1BDT0RFX0NJWCB9LAotCi0gIHsgImFsbCIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7IDAsIDAgfQotfTsKLQotLyogVGhlIG1hY3JvIHRhYmxlICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gYWxwaGFfbWFjcm9zW10gPSB7Ci0vKiBMb2FkL1N0b3JlIG1hY3JvcyAqLwotICB7ICJsZGEiLAllbWl0X2xkYSwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0xJVEVSQUwsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkYWgiLAllbWl0X2xkYWgsIE5VTEwsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotCi0gIHsgImxkbCIsCWVtaXRfaXJfbG9hZCwgImxkbCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJsZGxfbCIsCWVtaXRfaXJfbG9hZCwgImxkbF9sIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkcSIsCWVtaXRfaXJfbG9hZCwgImxkcSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19MSVRFUkFMLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHFfbCIsCWVtaXRfaXJfbG9hZCwgImxkcV9sIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkcV91IiwJZW1pdF9pcl9sb2FkLCAibGRxX3UiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRmIiwJZW1pdF9sb2Fkc3RvcmUsICJsZGYiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkZyIsCWVtaXRfbG9hZHN0b3JlLCAibGRnIiwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHMiLAllbWl0X2xvYWRzdG9yZSwgImxkcyIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGR0IiwJZW1pdF9sb2Fkc3RvcmUsICJsZHQiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAibGRiIiwJZW1pdF9sZFgsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkYnUiLAllbWl0X2xkWHUsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkdyIsCWVtaXRfbGRYLCAoUFRSKTEsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHd1IiwJZW1pdF9sZFh1LCAoUFRSKTEsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotCi0gIHsgInVsZHciLAllbWl0X3VsZFgsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInVsZHd1IiwJZW1pdF91bGRYdSwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidWxkbCIsCWVtaXRfdWxkWCwgKFBUUikyLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidWxkbHUiLAllbWl0X3VsZFh1LCAoUFRSKTIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJ1bGRxIiwJZW1pdF91bGRYdSwgKFBUUikzLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLQotICB7ICJsZGdwIiwJZW1pdF9sZGdwLCBOVUxMLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EgfSB9LAotCi0gIHsgImxkaSIsCWVtaXRfbGRhLCBOVUxMLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpbCIsCWVtaXRfbGRpbCwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkaXEiLAllbWl0X2xkYSwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0jaWYgMAotICB7ICJsZGlmIgllbWl0X2xkaXEsIE5VTEwsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpZCIJZW1pdF9sZGlxLCBOVUxMLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkaWciCWVtaXRfbGRpcSwgTlVMTCwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZGlzIgllbWl0X2xkaXEsIE5VTEwsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpdCIJZW1pdF9sZGlxLCBOVUxMLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0jZW5kaWYKLQotICB7ICJzdGwiLAllbWl0X2xvYWRzdG9yZSwgInN0bCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJzdGxfYyIsCWVtaXRfbG9hZHN0b3JlLCAic3RsX2MiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RxIiwJZW1pdF9sb2Fkc3RvcmUsICJzdHEiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RxX2MiLAllbWl0X2xvYWRzdG9yZSwgInN0cV9jIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0cV91IiwJZW1pdF9sb2Fkc3RvcmUsICJzdHFfdSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJzdGYiLAllbWl0X2xvYWRzdG9yZSwgInN0ZiIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RnIiwJZW1pdF9sb2Fkc3RvcmUsICJzdGciLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0cyIsCWVtaXRfbG9hZHN0b3JlLCAic3RzIiwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19PUElSLCBNQUNST19CQVNFLCBNQUNST19FT0EgfSB9LAotICB7ICJzdHQiLAllbWl0X2xvYWRzdG9yZSwgInN0dCIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLQotICB7ICJzdGIiLAllbWl0X3N0WCwgKFBUUikwLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fT1BJUiwgTUFDUk9fQkFTRSwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3R3IiwJZW1pdF9zdFgsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInVzdHciLAllbWl0X3VzdFgsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInVzdGwiLAllbWl0X3VzdFgsIChQVFIpMiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInVzdHEiLAllbWl0X3VzdFgsIChQVFIpMywKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX09QSVIsIE1BQ1JPX0JBU0UsIE1BQ1JPX0VPQSB9IH0sCi0KLS8qIEFyaXRobWV0aWMgbWFjcm9zICovCi0jaWYgMAotICB7ICJhYnNsIgllbWl0X2Fic2wsIDEsIHsgSVIgfSB9LAotICB7ICJhYnNsIgllbWl0X2Fic2wsIDIsIHsgSVIsIElSIH0gfSwKLSAgeyAiYWJzbCIJZW1pdF9hYnNsLCAyLCB7IEVYUCwgSVIgfSB9LAotICB7ICJhYnNxIgllbWl0X2Fic3EsIDEsIHsgSVIgfSB9LAotICB7ICJhYnNxIgllbWl0X2Fic3EsIDIsIHsgSVIsIElSIH0gfSwKLSAgeyAiYWJzcSIJZW1pdF9hYnNxLCAyLCB7IEVYUCwgSVIgfSB9LAotI2VuZGlmCi0KLSAgeyAic2V4dGIiLAllbWl0X3NleHRYLCAoUFRSKTAsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJzZXh0dyIsCWVtaXRfc2V4dFgsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSAqLyB9IH0sCi0KLSAgeyAiZGl2bCIsCWVtaXRfZGl2aXNpb24sICJfX2RpdmwiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAiZGl2bHUiLAllbWl0X2RpdmlzaW9uLCAiX19kaXZsdSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJkaXZxIiwJZW1pdF9kaXZpc2lvbiwgIl9fZGl2cSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJkaXZxdSIsCWVtaXRfZGl2aXNpb24sICJfX2RpdnF1IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgInJlbWwiLAllbWl0X2RpdmlzaW9uLCAiX19yZW1sIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgInJlbWx1IiwJZW1pdF9kaXZpc2lvbiwgIl9fcmVtbHUiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAicmVtcSIsCWVtaXRfZGl2aXNpb24sICJfX3JlbXEiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAicmVtcXUiLAllbWl0X2RpdmlzaW9uLCAiX19yZW1xdSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotCi0gIHsgImpzciIsCWVtaXRfanNyam1wLCAianNyIiwKLSAgICB7IE1BQ1JPX1BJUiwgTUFDUk9fRVhQLCBNQUNST19KU1IsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fSlNSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgIE1BQ1JPX0VYUCwgTUFDUk9fSlNSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FWFAsIE1BQ1JPX0pTUiwgTUFDUk9fRU9BIH0gfSwKLSAgeyAiam1wIiwJZW1pdF9qc3JqbXAsICJqbXAiLAotICAgIHsgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0pTUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19KU1IsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCAgTUFDUk9fRVhQLCBNQUNST19KU1IsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0VYUCwgTUFDUk9fSlNSLCBNQUNST19FT0EgfSB9LAotICB7ICJyZXQiLAllbWl0X3JldGpjciwgInJldCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FT0EgfSB9LAotICB7ICJqY3IiLAllbWl0X3JldGpjciwgImpjciIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FT0EgfSB9LAotICB7ICJqc3JfY29yb3V0aW5lIiwJZW1pdF9yZXRqY3IsICJqY3IiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRU9BIH0gfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWxwaGFfbnVtX21hY3JvcwotICA9IHNpemVvZihhbHBoYV9tYWNyb3MpIC8gc2l6ZW9mKCphbHBoYV9tYWNyb3MpOwotDAotLyogUHVibGljIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNldHMKLSAgIHVwIGFsbCB0aGUgdGFibGVzLCBldGMuIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciB3aWxsCi0gICBuZWVkLCB0aGF0IGNhbiBiZSBkZXRlcm1pbmVkIGJlZm9yZSBhcmd1bWVudHMgYXJlIHBhcnNlZC4gICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIFZlcmlmeSB0aGF0IFhfb3AgZmllbGQgaXMgd2lkZSBlbm91Z2guICAqLwotICB7Ci0gICAgZXhwcmVzc2lvblMgZTsKLSAgICBlLlhfb3AgPSBPX21heDsKLSAgICBhc3NlcnQgKGUuWF9vcCA9PSBPX21heCk7Ci0gIH0KLQotICAvKiBDcmVhdGUgdGhlIG9wY29kZSBoYXNoIHRhYmxlICovCi0KLSAgYWxwaGFfb3Bjb2RlX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgZm9yIChpID0gMDsgaSA8IGFscGhhX251bV9vcGNvZGVzOyApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSwgKnJldHZhbCwgKnNsYXNoOwotCi0gICAgICBuYW1lID0gYWxwaGFfb3Bjb2Rlc1tpXS5uYW1lOwotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKGFscGhhX29wY29kZV9oYXNoLCBuYW1lLCAoUFRSKSZhbHBoYV9vcGNvZGVzW2ldKTsKLSAgICAgIGlmIChyZXR2YWwpCi0JYXNfZmF0YWwgKF8oImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIG9wY29kZSBgJXMnOiAlcyIpLCBuYW1lLCByZXR2YWwpOwotCi0gICAgICAvKiBTb21lIG9wY29kZXMgaW5jbHVkZSBtb2RpZmllcnMgb2YgdmFyaW91cyBzb3J0cyB3aXRoIGEgIi9tb2QiCi0JIHN5bnRheCwgbGlrZSB0aGUgYXJjaGl0ZWN0dXJlIG1hbnVhbCBzdWdnZXN0cy4gIEhvd2V2ZXIsIGZvcgotCSB1c2Ugd2l0aCBnY2MgYXQgbGVhc3QsIHdlIGFsc28gbmVlZCBhY2Nlc3MgdG8gdGhvc2Ugc2FtZSBvcGNvZGVzCi0JIHdpdGhvdXQgdGhlICIvIi4gICovCi0KLSAgICAgIGlmICgoc2xhc2ggPSBzdHJjaHIgKG5hbWUsICcvJykpICE9IE5VTEwpCi0JewotCSAgY2hhciAqcCA9IHhtYWxsb2MgKHN0cmxlbiAobmFtZSkpOwotCSAgbWVtY3B5IChwLCBuYW1lLCBzbGFzaCAtIG5hbWUpOwotCSAgc3RyY3B5IChwICsgKHNsYXNoIC0gbmFtZSksIHNsYXNoICsgMSk7Ci0KLQkgICh2b2lkKWhhc2hfaW5zZXJ0KGFscGhhX29wY29kZV9oYXNoLCBwLCAoUFRSKSZhbHBoYV9vcGNvZGVzW2ldKTsKLQkgIC8qIElnbm9yZSBmYWlsdXJlcyAtLSB0aGUgb3Bjb2RlIHRhYmxlIGRvZXMgZHVwbGljYXRlIHNvbWUKLQkgICAgIHZhcmlhbnRzIGluIGRpZmZlcmVudCBmb3JtcywgbGlrZSAiaHdfc3RxIiBhbmQgImh3X3N0L3EiLiAgKi8KLQl9Ci0KLSAgICAgIHdoaWxlICgrK2kgPCBhbHBoYV9udW1fb3Bjb2RlcwotCSAgICAgJiYgKGFscGhhX29wY29kZXNbaV0ubmFtZSA9PSBuYW1lCi0JCSB8fCAhc3RyY21wIChhbHBoYV9vcGNvZGVzW2ldLm5hbWUsIG5hbWUpKSkKLQljb250aW51ZTsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIHRoZSBtYWNybyBoYXNoIHRhYmxlICovCi0KLSAgYWxwaGFfbWFjcm9faGFzaCA9IGhhc2hfbmV3ICgpOwotICBmb3IgKGkgPSAwOyBpIDwgYWxwaGFfbnVtX21hY3JvczsgKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsICpyZXR2YWw7Ci0KLSAgICAgIG5hbWUgPSBhbHBoYV9tYWNyb3NbaV0ubmFtZTsKLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChhbHBoYV9tYWNyb19oYXNoLCBuYW1lLCAoUFRSKSZhbHBoYV9tYWNyb3NbaV0pOwotICAgICAgaWYgKHJldHZhbCkKLQlhc19mYXRhbCAoXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggbWFjcm8gYCVzJzogJXMiKSwgbmFtZSwgcmV0dmFsKTsKLQotICAgICAgd2hpbGUgKCsraSA8IGFscGhhX251bV9tYWNyb3MKLQkgICAgICYmIChhbHBoYV9tYWNyb3NbaV0ubmFtZSA9PSBuYW1lCi0JCSB8fCAhc3RyY21wIChhbHBoYV9tYWNyb3NbaV0ubmFtZSwgbmFtZSkpKQotCWNvbnRpbnVlOwotICAgIH0KLQotICAvKiBDb25zdHJ1Y3Qgc3ltYm9scyBmb3IgZWFjaCBvZiB0aGUgcmVnaXN0ZXJzICovCi0KLSAgZm9yIChpID0gMDsgaSA8IDMyOyArK2kpCi0gICAgewotICAgICAgY2hhciBuYW1lWzRdOwotICAgICAgc3ByaW50ZihuYW1lLCAiJCVkIiwgaSk7Ci0gICAgICBhbHBoYV9yZWdpc3Rlcl90YWJsZVtpXSA9IHN5bWJvbF9jcmVhdGUobmFtZSwgcmVnX3NlY3Rpb24sIGksCi0JCQkJCSAgICAgICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgfQotICBmb3IgKDsgaSA8IDY0OyArK2kpCi0gICAgewotICAgICAgY2hhciBuYW1lWzVdOwotICAgICAgc3ByaW50ZihuYW1lLCAiJGYlZCIsIGktMzIpOwotICAgICAgYWxwaGFfcmVnaXN0ZXJfdGFibGVbaV0gPSBzeW1ib2xfY3JlYXRlKG5hbWUsIHJlZ19zZWN0aW9uLCBpLAotCQkJCQkgICAgICAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIHNwZWNpYWwgc3ltYm9scyBhbmQgc2VjdGlvbnMgd2UnbGwgYmUgdXNpbmcgKi8KLQotICAvKiBTbyAuc2JzcyB3aWxsIGdldCB1c2VkIGZvciB0aW55IG9iamVjdHMuICAqLwotICBiZmRfc2V0X2dwX3NpemUgKHN0ZG91dHB1dCwgZ19zd2l0Y2hfdmFsdWUpOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24gKCIubGl0YSIsICZhbHBoYV9saXRhX3NlY3Rpb24sICZhbHBoYV9saXRhX3N5bWJvbCk7Ci0KLSAgLyogRm9yIGhhbmRsaW5nIHRoZSBHUCwgY3JlYXRlIGEgc3ltYm9sIHRoYXQgd29uJ3QgYmUgb3V0cHV0IGluIHRoZQotICAgICBzeW1ib2wgdGFibGUuICBXZSdsbCBlZGl0IGl0IG91dCBvZiByZWxvY3MgbGF0ZXIuICAqLwotICBhbHBoYV9ncF9zeW1ib2wgPSBzeW1ib2xfY3JlYXRlICgiPEdQIHZhbHVlPiIsIGFscGhhX2xpdGFfc2VjdGlvbiwgMHg4MDAwLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9FVkFYCi0gIGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24gKCIubGluayIsICZhbHBoYV9saW5rX3NlY3Rpb24sICZhbHBoYV9saW5rX3N5bWJvbCk7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICB7Ci0gICAgICBzZWdUIHNlYyA9IHN1YnNlZ19uZXcoIi5tZGVidWciLCAoc3Vic2VnVCkwKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyhzdGRvdXRwdXQsIHNlYywgU0VDX0hBU19DT05URU5UU3xTRUNfUkVBRE9OTFkpOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChzdGRvdXRwdXQsIHNlYywgMyk7Ci0gICAgfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotICBzdWJzZWdfc2V0KHRleHRfc2VjdGlvbiwgMCk7Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIC8qIENyZWF0ZSBsaXRlcmFsIGxvb2t1cCBoYXNoIHRhYmxlLiAgKi8KLSAgYWxwaGFfbGl0ZXJhbF9oYXNoID0gaGFzaF9uZXcoKTsKLSNlbmRpZgotfQotCi0vKiBUaGUgcHVibGljIGludGVyZmFjZSB0byB0aGUgaW5zdHJ1Y3Rpb24gYXNzZW1ibGVyLiAgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyIG9wbmFtZVszMl07CQkJLyogY3VycmVudCBtYXhpbXVtIGlzIDEzICovCi0gIGV4cHJlc3Npb25TIHRva1tNQVhfSU5TTl9BUkdTXTsKLSAgaW50IG50b2ssIHRydW5jbGVuOwotICBzaXplX3Qgb3BuYW1lbGVuOwotCi0gIC8qIHNwbGl0IG9mZiB0aGUgb3Bjb2RlICovCi0gIG9wbmFtZWxlbiA9IHN0cnNwbiAoc3RyLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpfLzQ2OCIpOwotICB0cnVuY2xlbiA9IChvcG5hbWVsZW4gPCBzaXplb2YgKG9wbmFtZSkgLSAxCi0JICAgICAgPyBvcG5hbWVsZW4KLQkgICAgICA6IHNpemVvZiAob3BuYW1lKSAtIDEpOwotICBtZW1jcHkgKG9wbmFtZSwgc3RyLCB0cnVuY2xlbik7Ci0gIG9wbmFtZVt0cnVuY2xlbl0gPSAnXDAnOwotCi0gIC8qIHRva2VuaXplIHRoZSByZXN0IG9mIHRoZSBsaW5lICovCi0gIGlmICgobnRvayA9IHRva2VuaXplX2FyZ3VtZW50cyAoc3RyICsgb3BuYW1lbGVuLCB0b2ssIE1BWF9JTlNOX0FSR1MpKSA8IDApCi0gICAgewotICAgICAgaWYgKG50b2sgIT0gVE9LRU5JWkVfRVJST1JfUkVQT1JUKQotCWFzX2JhZCAoXygic3ludGF4IGVycm9yIikpOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIGZpbmlzaCBpdCBvZmYgKi8KLSAgYXNzZW1ibGVfdG9rZW5zIChvcG5hbWUsIHRvaywgbnRvaywgYWxwaGFfbWFjcm9zX29uKTsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uJ3Mgc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICAqLwotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgc2l6ZSkKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50KHN0ZG91dHB1dCwgc2VnKTsKLSAgdmFsdWVUIG1hc2sgPSAoKHZhbHVlVCkxIDw8IGFsaWduKSAtIDE7Ci0KLSAgcmV0dXJuIChzaXplICsgbWFzaykgJiB+bWFzazsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBvZiB0eXBlIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyCi0gICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWV4dGVybiBjaGFyICp2YXhfbWRfYXRvZiBQQVJBTVMgKChpbnQsIGNoYXIgKiwgaW50ICopKTsKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICAgIC8qIFZBWCBmbG9hdHMgKi8KLSAgICBjYXNlICdHJzoKLSAgICAgIC8qIFZBWCBtZF9hdG9mIGRvZXNuJ3QgbGlrZSAiRyIgZm9yIHNvbWUgcmVhc29uLiAgKi8KLSAgICAgIHR5cGUgPSAnZyc7Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAnRCc6Ci0gICAgICByZXR1cm4gdmF4X21kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKTsKLQotICAgICAgLyogSUVFRSBmbG9hdHMgKi8KLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0KLSAgZm9yICh3b3JkUCA9IHdvcmRzICsgcHJlYyAtIDE7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCp3b3JkUC0tKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRha2UgY2FyZSBvZiB0aGUgdGFyZ2V0LXNwZWNpZmljIGNvbW1hbmQtbGluZSBvcHRpb25zLiAgKi8KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdGJzoKLSAgICAgIGFscGhhX25vZmxvYXRzX29uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fMzJBRERSOgotICAgICAgYWxwaGFfYWRkcjMyX29uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZyc6Ci0gICAgICBhbHBoYV9kZWJ1ZyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgZ19zd2l0Y2hfdmFsdWUgPSBhdG9pKGFyZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ20nOgotICAgICAgewotCWNvbnN0IHN0cnVjdCBjcHVfdHlwZSAqcDsKLQlmb3IgKHAgPSBjcHVfdHlwZXM7IHAtPm5hbWU7ICsrcCkKLQkgIGlmIChzdHJjbXAoYXJnLCBwLT5uYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgYWxwaGFfdGFyZ2V0X25hbWUgPSBwLT5uYW1lLCBhbHBoYV90YXJnZXQgPSBwLT5mbGFnczsKLQkgICAgICBnb3RvIGZvdW5kOwotCSAgICB9Ci0JYXNfd2FybihfKCJVbmtub3duIENQVSBpZGVudGlmaWVyIGAlcyciKSwgYXJnKTsKLSAgICAgIGZvdW5kOjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgICBjYXNlICcrJzoJCQkvKiBGb3IgZysrLiAgSGFzaCBhbnkgbmFtZSA+IDYzIGNoYXJzIGxvbmcuICovCi0gICAgICBhbHBoYV9mbGFnX2hhc2hfbG9uZ19uYW1lcyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0gnOgkJCS8qIFNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb24gKi8KLSAgICAgIGFscGhhX2ZsYWdfc2hvd19hZnRlcl90cnVuYyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgkJCS8qIGZvciBnbnUtYy92YXggY29tcGF0aWJpbGl0eS4gICovCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSBPUFRJT05fUkVMQVg6Ci0gICAgICBhbHBoYV9mbGFnX3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgT1BUSU9OX01ERUJVRzoKLSAgICAgIGFscGhhX2ZsYWdfbWRlYnVnID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX05PX01ERUJVRzoKLSAgICAgIGFscGhhX2ZsYWdfbWRlYnVnID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBQcmludCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0aGF0IHdlIGFjY2VwdC4gICovCi0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHV0cyhfKCJcCi1BbHBoYSBvcHRpb25zOlxuXAotLTMyYWRkcgkJCXRyZWF0IGFkZHJlc3NlcyBhcyAzMi1iaXQgdmFsdWVzXG5cCi0tRgkJCWxhY2sgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRcblwKLS1tZXY0IHwgLW1ldjQ1IHwgLW1ldjUgfCAtbWV2NTYgfCAtbXBjYTU2IHwgLW1ldjYgfCAtbWFsbFxuXAotCQkJc3BlY2lmeSB2YXJpYW50IG9mIEFscGhhIGFyY2hpdGVjdHVyZVxuXAotLW0yMTA2NCB8IC1tMjEwNjYgfCAtbTIxMTY0IHwgLW0yMTE2NGEgfCAtbTIxMTY0cGMgfCAtbTIxMjY0XG5cCi0JCQl0aGVzZSB2YXJpYW50cyBpbmNsdWRlIFBBTGNvZGUgb3Bjb2Rlc1xuIiksCi0Jc3RyZWFtKTsKLSNpZmRlZiBPQkpfRVZBWAotICBmcHV0cyAoXygiXAotVk1TIG9wdGlvbnM6XG5cCi0tKwkJCWhhc2ggZW5jb2RlIChkb24ndCB0cnVuY2F0ZSkgbmFtZXMgbG9uZ2VyIHRoYW4gNjQgY2hhcmFjdGVyc1xuXAotLUgJCQlzaG93IG5ldyBzeW1ib2wgYWZ0ZXIgaGFzaCB0cnVuY2F0aW9uXG4iKSwKLQlzdHJlYW0pOwotI2VuZGlmCi19Ci0KLS8qIERlY2lkZSBmcm9tIHdoYXQgcG9pbnQgYSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvLAotICAgcmVsYXRpdmUgdG8gdGhlIHBjLXJlbGF0aXZlIGZpeHVwLiAgRXIsIHJlbGF0aXZlbHkgc3BlYWtpbmcuICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICB2YWx1ZVQgYWRkciA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLSAgICAgIHJldHVybiBhZGRyOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGFkZHI7Ci0gICAgfQotfQotCi0vKiBBdHRlbXB0IHRvIHNpbXBsaWZ5IG9yIGV2ZW4gZWxpbWluYXRlIGEgZml4dXAuICBUaGUgcmV0dXJuIHZhbHVlIGlzCi0gICBpZ25vcmVkOyBwZXJoYXBzIGl0IHdhcyBvbmNlIG1lYW5pbmdmdWwsIGJ1dCBub3cgaXQgaXMgaGlzdG9yaWNhbC4KLSAgIFRvIGluZGljYXRlIHRoYXQgYSBmaXh1cCBoYXMgYmVlbiBlbGltaW5hdGVkLCBzZXQgZml4UC0+ZnhfZG9uZS4KLQotICAgRm9yIEVMRiwgaGVyZSBpdCBpcyB0aGF0IHdlIHRyYW5zZm9ybSB0aGUgR1BESVNQX0hJMTYgcmVsb2Mgd2UgdXNlZAotICAgaW50ZXJuYWxseSBpbnRvIHRoZSBHUERJU1AgcmVsb2MgdXNlZCBleHRlcm5hbGx5LiAgV2UgaGFkIHRvIGRvCi0gICB0aGlzIHNvIHRoYXQgd2UnZCBoYXZlIHRoZSBHUERJU1BfTE8xNiByZWxvYyBhcyBhIHRhZyB0byBjb21wdXRlCi0gICB0aGUgZGlzdGFuY2UgdG8gdGhlICJsZGEiIGluc3RydWN0aW9uIGZvciBzZXR0aW5nIHRoZSBhZGRlbmQgdG8KLSAgIEdQRElTUC4gICovCi0KLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWx1ZVApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFsdWVQOwotewotICBjaGFyICogY29uc3QgZml4cG9zID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOwotICB2YWx1ZVQgdmFsdWUgPSAqdmFsdWVQOwotICB1bnNpZ25lZCBpbWFnZSwgc2l6ZTsKLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgICAvKiBUaGUgR1BESVNQIHJlbG9jYXRpb25zIGFyZSBwcm9jZXNzZWQgaW50ZXJuYWxseSB3aXRoIGEgc3ltYm9sCi0JIHJlZmVycmluZyB0byB0aGUgY3VycmVudCBmdW5jdGlvbjsgd2UgbmVlZCB0byBkcm9wIGluIGEgdmFsdWUKLQkgd2hpY2gsIHdoZW4gYWRkZWQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiwKLQkgZ2l2ZXMgdGhlIGRlc2lyZWQgR1AuICAqLwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgICAgewotCWZpeFMgKm5leHQgPSBmaXhQLT5meF9uZXh0OwotCWFzc2VydCAobmV4dC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNik7Ci0KLQlmaXhQLT5meF9vZmZzZXQgPSAobmV4dC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIG5leHQtPmZ4X3doZXJlCi0JCQkgICAtIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgLSBmaXhQLT5meF93aGVyZSk7Ci0KLQl2YWx1ZSA9ICh2YWx1ZSAtIHNpZ25fZXh0ZW5kXzE2ICh2YWx1ZSkpID4+IDE2OwotICAgICAgfQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19BTFBIQV9HUERJU1A7Ci0jZW5kaWYKLSAgICAgIGdvdG8gZG9fcmVsb2NfZ3A7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLSAgICAgIHZhbHVlID0gc2lnbl9leHRlbmRfMTYgKHZhbHVlKTsKLSAgICAgIGZpeFAtPmZ4X29mZnNldCA9IDA7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0jZW5kaWYKLQotICAgIGRvX3JlbG9jX2dwOgotICAgICAgZml4UC0+ZnhfYWRkc3kgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHBvcywgdmFsdWUsIDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKLQlmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0gICAgICBzaXplID0gMjsKLSAgICAgIGdvdG8gZG9fcmVsb2NfeHg7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotICAgICAgc2l6ZSA9IDQ7Ci0gICAgICBnb3RvIGRvX3JlbG9jX3h4OwotICAgIGNhc2UgQkZEX1JFTE9DXzY0OgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCWZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ182NF9QQ1JFTDsKLSAgICAgIHNpemUgPSA4OwotICAgIGRvX3JlbG9jX3h4OgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDAgJiYgZml4UC0+ZnhfYWRkc3kgPT0gMCkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHBvcywgdmFsdWUsIHNpemUpOwotCSAgZ290byBkb25lOwotCX0KLSAgICAgIHJldHVybiAxOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICAgIGFzc2VydCAoZml4UC0+Znhfc3Vic3kgPT0gYWxwaGFfZ3Bfc3ltYm9sKTsKLSAgICAgIGZpeFAtPmZ4X3N1YnN5ID0gMDsKLSAgICAgIC8qIEZJWE1FOiBpbmhlcml0ZWQgdGhpcyBvYmxpdmlvdXNuZXNzIG9mIGB2YWx1ZScgLS0gd2h5PyAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwb3MsIC1hbHBoYV9ncF92YWx1ZSwgNCk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgotICAgICAgcmV0dXJuIDE7Ci0jZW5kaWYKLQotICAgIGNhc2UgQkZEX1JFTE9DXzIzX1BDUkVMX1MyOgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDAgJiYgZml4UC0+ZnhfYWRkc3kgPT0gMCkKLQl7Ci0JICBpbWFnZSA9IGJmZF9nZXRsMzIoZml4cG9zKTsKLQkgIGltYWdlID0gKGltYWdlICYgfjB4MUZGRkZGKSB8ICgodmFsdWUgPj4gMikgJiAweDFGRkZGRik7Ci0JICBnb3RvIHdyaXRlX2RvbmU7Ci0JfQotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9ISU5UOgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDAgJiYgZml4UC0+ZnhfYWRkc3kgPT0gMCkKLQl7Ci0JICBpbWFnZSA9IGJmZF9nZXRsMzIoZml4cG9zKTsKLQkgIGltYWdlID0gKGltYWdlICYgfjB4M0ZGRikgfCAoKHZhbHVlID4+IDIpICYgMHgzRkZGKTsKLQkgIGdvdG8gd3JpdGVfZG9uZTsKLQl9Ci0gICAgICByZXR1cm4gMTsKLQotI2lmZGVmIE9CSl9FQ09GRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUw6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHBvcywgdmFsdWUsIDIpOwotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U6Ci0gICAgICByZXR1cm4gMTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U6Ci0gICAgICByZXR1cm4gMTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FVkFYCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRToKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUjoKLSAgICAgIHJldHVybiAxOwotI2VuZGlmCi0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRFUkFMOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JBU0U6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQllUT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUjoKLSAgICAgIHJldHVybiAxOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUERJU1A6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTEhJR0g6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9HUFJFTExPVzoKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgewotCWNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kOwotCi0JaWYgKChpbnQpZml4UC0+Znhfcl90eXBlID49IDApCi0JICBhc19mYXRhbCAoXygidW5oYW5kbGVkIHJlbG9jYXRpb24gdHlwZSAlcyIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeFAtPmZ4X3JfdHlwZSkpOwotCi0JYXNzZXJ0ICgtKGludClmaXhQLT5meF9yX3R5cGUgPCAoaW50KWFscGhhX251bV9vcGVyYW5kcyk7Ci0Jb3BlcmFuZCA9ICZhbHBoYV9vcGVyYW5kc1stKGludClmaXhQLT5meF9yX3R5cGVdOwotCi0JLyogVGhlIHJlc3Qgb2YgdGhlc2UgZml4dXBzIG9ubHkgZXhpc3QgaW50ZXJuYWxseSBkdXJpbmcgc3ltYm9sCi0JICAgcmVzb2x1dGlvbiBhbmQgaGF2ZSBubyByZXByZXNlbnRhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUuCi0JICAgVGhlcmVmb3JlIHRoZXkgbXVzdCBiZSBjb21wbGV0ZWx5IHJlc29sdmVkIGFzIGNvbnN0YW50cy4gICovCi0KLQlpZiAoZml4UC0+ZnhfYWRkc3kgIT0gMAotCSAgICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCV8oIm5vbi1hYnNvbHV0ZSBleHByZXNzaW9uIGluIGNvbnN0YW50IGZpZWxkIikpOwotCi0JaW1hZ2UgPSBiZmRfZ2V0bDMyKGZpeHBvcyk7Ci0JaW1hZ2UgPSBpbnNlcnRfb3BlcmFuZChpbWFnZSwgb3BlcmFuZCwgKG9mZnNldFQpdmFsdWUsCi0JCQkgICAgICAgZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSk7Ci0gICAgICB9Ci0gICAgICBnb3RvIHdyaXRlX2RvbmU7Ci0gICAgfQotCi0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSAwIHx8IGZpeFAtPmZ4X3BjcmVsICE9IDApCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuX3doZXJlKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICBfKCJ0eXBlICVkIHJlbG9jIGRvbmU/XG4iKSwgKGludClmaXhQLT5meF9yX3R5cGUpOwotICAgICAgZ290byBkb25lOwotICAgIH0KLQotd3JpdGVfZG9uZToKLSAgbWRfbnVtYmVyX3RvX2NoYXJzKGZpeHBvcywgaW1hZ2UsIDQpOwotCi1kb25lOgotICBmaXhQLT5meF9kb25lID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBMb29rIGZvciBhIHJlZ2lzdGVyIG5hbWUgaW4gdGhlIGdpdmVuIHN5bWJvbC4KLSAqLwotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaWYgKCpuYW1lID09ICckJykKLSAgICB7Ci0gICAgICBpbnQgaXNfZmxvYXQgPSAwLCBudW07Ci0KLSAgICAgIHN3aXRjaCAoKisrbmFtZSkKLQl7Ci0JY2FzZSAnZic6Ci0JICBpZiAobmFtZVsxXSA9PSAncCcgJiYgbmFtZVsyXSA9PSAnXDAnKQotCSAgICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbQVhQX1JFR19GUF07Ci0JICBpc19mbG9hdCA9IDMyOwotCSAgLyogRkFMTFRIUlUgKi8KLQotCWNhc2UgJ3InOgotCSAgaWYgKCFpc2RpZ2l0KCorK25hbWUpKQotCSAgICBicmVhazsKLQkgIC8qIEZBTExUSFJVICovCi0KLQljYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6Ci0JY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotCSAgaWYgKG5hbWVbMV0gPT0gJ1wwJykKLQkgICAgbnVtID0gbmFtZVswXSAtICcwJzsKLQkgIGVsc2UgaWYgKG5hbWVbMF0gIT0gJzAnICYmIGlzZGlnaXQobmFtZVsxXSkgJiYgbmFtZVsyXSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgbnVtID0gKG5hbWVbMF0gLSAnMCcpICogMTAgKyBuYW1lWzFdIC0gJzAnOwotCSAgICAgIGlmIChudW0gPj0gMzIpCi0JCWJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGJyZWFrOwotCi0JICBpZiAoIWFscGhhX25vYXRfb24gJiYgbnVtID09IEFYUF9SRUdfQVQpCi0JICAgIGFzX3dhcm4oXygiVXNlZCAkYXQgd2l0aG91dCBcIi5zZXQgbm9hdFwiIikpOwotCSAgcmV0dXJuIGFscGhhX3JlZ2lzdGVyX3RhYmxlW251bSArIGlzX2Zsb2F0XTsKLQotCWNhc2UgJ2EnOgotCSAgaWYgKG5hbWVbMV0gPT0gJ3QnICYmIG5hbWVbMl0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIGlmICghYWxwaGFfbm9hdF9vbikKLQkJYXNfd2FybihfKCJVc2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiKSk7Ci0JICAgICAgcmV0dXJuIGFscGhhX3JlZ2lzdGVyX3RhYmxlW0FYUF9SRUdfQVRdOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ2cnOgotCSAgaWYgKG5hbWVbMV0gPT0gJ3AnICYmIG5hbWVbMl0gPT0gJ1wwJykKLQkgICAgcmV0dXJuIGFscGhhX3JlZ2lzdGVyX3RhYmxlW2FscGhhX2dwX3JlZ2lzdGVyXTsKLQkgIGJyZWFrOwotCi0JY2FzZSAncyc6Ci0JICBpZiAobmFtZVsxXSA9PSAncCcgJiYgbmFtZVsyXSA9PSAnXDAnKQotCSAgICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbQVhQX1JFR19TUF07Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotI2lmZGVmIE9CSl9FQ09GRgotLyogQEBAIE1hZ2ljIEVDT0ZGIGJpdHMuICAqLwotCi12b2lkCi1hbHBoYV9mcm9iX2Vjb2ZmX2RhdGEgKCkKLXsKLSAgc2VsZWN0X2dwX3ZhbHVlICgpOwotICAvKiAkemVybyBhbmQgJGYzMSBhcmUgcmVhZC1vbmx5ICovCi0gIGFscGhhX2dwcm1hc2sgJj0gfjE7Ci0gIGFscGhhX2Zwcm1hc2sgJj0gfjE7Ci19Ci0jZW5kaWYKLQotLyogSG9vayB0byByZW1lbWJlciBhIHJlY2VudGx5IGRlZmluZWQgbGFiZWwgc28gdGhhdCB0aGUgYXV0by1hbGlnbgotICAgY29kZSBjYW4gYWRqdXN0IHRoZSBzeW1ib2wgYWZ0ZXIgd2Uga25vdyB3aGF0IGFsaWdubWVudCB3aWxsIGJlCi0gICByZXF1aXJlZC4gICovCi0KLXZvaWQKLWFscGhhX2RlZmluZV9sYWJlbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGFscGhhX2luc25fbGFiZWwgPSBzeW07Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHdlIG11c3QgYWx3YXlzIGVtaXQgYSByZWxvYyBmb3IgYSB0eXBlIGFuZCBmYWxzZSBpZgotICAgdGhlcmUgaXMgc29tZSBob3BlIG9mIHJlc29sdmluZyBpdCBhIGFzc2VtYmx5IHRpbWUuICAqLwotCi1pbnQKLWFscGhhX2ZvcmNlX3JlbG9jYXRpb24gKGYpCi0gICAgIGZpeFMgKmY7Ci17Ci0gIGlmIChhbHBoYV9mbGFnX3JlbGF4KQotICAgIHJldHVybiAxOwotCi0gIHN3aXRjaCAoZi0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1A6Ci0jaWZkZWYgT0JKX0VDT0ZGCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDoKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTDoKLSNlbmRpZgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgotI2lmZGVmIE9CSl9FVkFYCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRToKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUjoKLSNlbmRpZgotI2lmZGVmIFJFTE9DX09QX1AKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQkFTRToKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BESVNQOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxISUdIOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxMT1c6Ci0jZW5kaWYKLSAgICAgIHJldHVybiAxOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMjNfUENSRUxfUzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfNjQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfSElOVDoKLSAgICAgIHJldHVybiAwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydCgoaW50KWYtPmZ4X3JfdHlwZSA8IDAgJiYgLShpbnQpZi0+Znhfcl90eXBlIDwgKGludClhbHBoYV9udW1fb3BlcmFuZHMpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gcGFydGlhbGx5IHJlc29sdmUgYSByZWxvY2F0aW9uIG5vdy4gICovCi0KLWludAotYWxwaGFfZml4X2FkanVzdGFibGUgKGYpCi0gICAgIGZpeFMgKmY7Ci17Ci0jaWZkZWYgT0JKX0VMRgotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scyAqLwotICBpZiAoU19JU19FWFRFUk4gKGYtPmZ4X2FkZHN5KSB8fCBTX0lTX1dFQUsgKGYtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIC8qIEFyZSB0aGVyZSBhbnkgcmVsb2NhdGlvbiB0eXBlcyBmb3Igd2hpY2ggd2UgbXVzdCBnZW5lcmF0ZSBhIHJlbG9jCi0gICAgIGJ1dCB3ZSBjYW4gYWRqdXN0IHRoZSB2YWx1ZXMgY29udGFpbmVkIHdpdGhpbiBpdD8gICovCi0gIHN3aXRjaCAoZi0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1A6Ci0gICAgICByZXR1cm4gMDsKLQotI2lmZGVmIE9CSl9FQ09GRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUw6Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUw6Ci0jZW5kaWYKLSNpZmRlZiBSRUxPQ19PUF9QCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRFUkFMOgotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOgotI2VuZGlmCi0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSNpZmRlZiBSRUxPQ19PUF9QCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQkFTRToKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BESVNQOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxISUdIOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxMT1c6Ci0jZW5kaWYKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ18yM19QQ1JFTF9TMjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ182NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9ISU5UOgotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0ICgoaW50KWYtPmZ4X3JfdHlwZSA8IDAKLQkgICAgICAmJiAtIChpbnQpZi0+Znhfcl90eXBlIDwgKGludClhbHBoYV9udW1fb3BlcmFuZHMpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBHZW5lcmF0ZSB0aGUgQkZEIHJlbG9jIHRvIGJlIHN0dWNrIGluIHRoZSBvYmplY3QgZmlsZSBmcm9tIHRoZQotICAgZml4dXAgdXNlZCBpbnRlcm5hbGx5IGluIHRoZSBhc3NlbWJsZXIuICAqLwotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgLyogTWFrZSBzdXJlIG5vbmUgb2Ygb3VyIGludGVybmFsIHJlbG9jYXRpb25zIG1ha2UgaXQgdGhpcyBmYXIuCi0gICAgIFRoZXknZCBiZXR0ZXIgaGF2ZSBiZWVuIGZ1bGx5IHJlc29sdmVkIGJ5IHRoaXMgcG9pbnQuICAqLwotICBhc3NlcnQgKChpbnQpZml4cC0+Znhfcl90eXBlID4gMCk7Ci0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJjYW5ub3QgcmVwcmVzZW50IGAlcycgcmVsb2NhdGlvbiBpbiBvYmplY3QgZmlsZSIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghZml4cC0+ZnhfcGNyZWwgIT0gIXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oImludGVybmFsIGVycm9yPyBjYW5ub3QgZ2VuZXJhdGUgYCVzJyByZWxvY2F0aW9uIiksCi0JCWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhwLT5meF9yX3R5cGUpKTsKLSAgICB9Ci0gIGFzc2VydCAoIWZpeHAtPmZ4X3BjcmVsID09ICFyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlKTsKLQotI2lmZGVmIE9CSl9FQ09GRgotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMKQotICAgIHsKLSAgICAgIC8qIGZha2Ugb3V0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uIHNpZ2ggKi8KLSAgICAgIHJlbG9jLT5hZGRlbmQgPSAtYWxwaGFfZ3BfdmFsdWU7Ci0gICAgfQotICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotI2lmZGVmIE9CSl9FTEYKLSAgICAgIC8qCi0gICAgICAgKiBPaGhoLCB0aGlzIGlzIHVnbHkuICBUaGUgcHJvYmxlbSBpcyB0aGF0IGlmIHRoaXMgaXMgYSBsb2NhbCBnbG9iYWwKLSAgICAgICAqIHN5bWJvbCwgdGhlIHJlbG9jYXRpb24gd2lsbCBlbnRpcmVseSBiZSBwZXJmb3JtZWQgYXQgbGluayB0aW1lLCBub3QKLSAgICAgICAqIGF0IGFzc2VtYmx5IHRpbWUuICBiZmRfcGVyZm9ybV9yZWxvYyBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyBzb3J0Ci0gICAgICAgKiBvZiB0aGluZywgYW5kIGFzIGEgcmVzdWx0IHdlIG5lZWQgdG8gZmFrZSBpdCBvdXQgaGVyZS4KLSAgICAgICAqLwotICAgICAgaWYgKChTX0lTX0VYVEVSTiAoZml4cC0+ZnhfYWRkc3kpIHx8IFNfSVNfV0VBSyAoZml4cC0+ZnhfYWRkc3kpKQotCSAgJiYgIVNfSVNfQ09NTU9OKGZpeHAtPmZ4X2FkZHN5KSkKLQlyZWxvYy0+YWRkZW5kIC09IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSktPnZhbHVlOwotI2VuZGlmCi0gICAgfQotCi0gIHJldHVybiByZWxvYzsKLX0KLQotLyogUGFyc2UgYSByZWdpc3RlciBuYW1lIG9mZiBvZiB0aGUgaW5wdXRfbGluZSBhbmQgcmV0dXJuIGEgcmVnaXN0ZXIKLSAgIG51bWJlci4gIEdldHMgbWRfdW5kZWZpbmVkX3N5bWJvbCBhYm92ZSB0byBkbyB0aGUgcmVnaXN0ZXIgbmFtZQotICAgbWF0Y2hpbmcgZm9yIHVzLgotCi0gICBPbmx5IGNhbGxlZCBhcyBhIHBhcnQgb2YgcHJvY2Vzc2luZyB0aGUgRUNPRkYgLmZyYW1lIGRpcmVjdGl2ZS4gICovCi0KLWludAotdGNfZ2V0X3JlZ2lzdGVyIChmcmFtZSkKLSAgICAgaW50IGZyYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBmcmFtZXJlZyA9IEFYUF9SRUdfU1A7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJCcpCi0gICAgewotICAgICAgY2hhciAqcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUyAqc3ltID0gbWRfdW5kZWZpbmVkX3N5bWJvbCAocyk7Ci0KLSAgICAgICpzdHJjaHIocywgJ1wwJykgPSBjOwotICAgICAgaWYgKHN5bSAmJiAoZnJhbWVyZWcgPSBTX0dFVF9WQUxVRSAoc3ltKSkgPD0gMzEpCi0JZ290byBmb3VuZDsKLSAgICB9Ci0gIGFzX3dhcm4gKF8oImZyYW1lIHJlZyBleHBlY3RlZCwgdXNpbmcgJCVkLiIpLCBmcmFtZXJlZyk7Ci0KLWZvdW5kOgotICBub3RlX2dwcmVnIChmcmFtZXJlZyk7Ci0gIHJldHVybiBmcmFtZXJlZzsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBzeW1ib2wgdGFibGUgaXMgcHJvY2Vzc2VkLiAgSW4gb3JkZXIgdG8KLSAgIHdvcmsgd2l0aCBnY2Mgd2hlbiB1c2luZyBtaXBzLXRmaWxlLCB3ZSBtdXN0IGtlZXAgYWxsIGxvY2FsIGxhYmVscy4KLSAgIEhvd2V2ZXIsIGluIG90aGVyIGNhc2VzLCB3ZSB3YW50IHRvIGRpc2NhcmQgdGhlbS4gIElmIHdlIHdlcmUKLSAgIGNhbGxlZCB3aXRoIC1nLCBidXQgd2UgZGlkbid0IHNlZSBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBpdCBtYXkKLSAgIG1lYW4gdGhhdCBnY2MgaXMgc211Z2dsaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0aHJvdWdoIHRvCi0gICBtaXBzLXRmaWxlLCBpbiB3aGljaCBjYXNlIHdlIG11c3QgZ2VuZXJhdGUgYWxsIGxvY2FsIGxhYmVscy4gICovCi0KLSNpZmRlZiBPQkpfRUNPRkYKLQotdm9pZAotYWxwaGFfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKCkKLXsKLSAgaWYgKGFscGhhX2RlYnVnICE9IDAKLSAgICAgICYmICEgZWNvZmZfZGVidWdnaW5nX3NlZW4pCi0gICAgZmxhZ19rZWVwX2xvY2FscyA9IDE7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfRUNPRkYgKi8KLQwKLSNpZmRlZiBSRUxPQ19PUF9QCi0KLS8qIEJlZm9yZSB0aGUgcmVsb2NhdGlvbnMgYXJlIHdyaXR0ZW4sIHJlb3JkZXIgdGhlbSwgc28gdGhhdCB1c2VyIHN1cHBsaWVkCi0gICAhbGl0dXNlIHJlbG9jYXRpb25zIGZvbGxvdyB0aGUgYXBwcm9wcmlhdGUgIWxpdGVyYWwgcmVsb2NhdGlvbnMuICBBbHNvCi0gICBjb252ZXJ0IHRoZSBnYXMtaW50ZXJuYWwgcmVsb2NhdGlvbnMgdG8gdGhlIGFwcHJvcHJpYXRlIGxpbmtlciByZWxvY2F0aW9ucy4KLSAgICovCi0KLXZvaWQKLWFscGhhX2FkanVzdF9zeW10YWIgKCkKLXsKLSAgaWYgKGFscGhhX2xpdGVyYWxfaGFzaCkKLSAgICB7Ci0jaWZkZWYgREVCVUcyX0FMUEhBCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJhbHBoYV9hZGp1c3Rfc3ltdGFiIGNhbGxlZFxuIik7Ci0jZW5kaWYKLQotICAgICAgLyogR28gb3ZlciBlYWNoIHNlY3Rpb24sIHJlb3JkZXJpbmcgdGhlIHJlbG9jYXRpb25zIHNvIHRoYXQgYWxsIG9mIHRoZQotICAgICAgICAgZXhwbGljaXQgTElUVVNFJ3MgYXJlIGFkamFjZW50IHRvIHRoZSBleHBsaWNpdCBMSVRFUkFMJ3MgKi8KLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBhbHBoYV9hZGp1c3Rfc3ltdGFiX3JlbG9jcywgKGNoYXIgKikgMCk7Ci0gICAgfQotfQotCi0MCi0vKiBJbm5lciBmdW5jdGlvbiB0byBtb3ZlIExJVFVTRSdzIG5leHQgdG8gdGhlIExJVEVSQUwuICAqLwotCi1zdGF0aWMgdm9pZAotYWxwaGFfYWRqdXN0X3N5bXRhYl9yZWxvY3MgKGFiZmQsIHNlYywgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBwdHI7Ci17Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGZpeFMgKipwcmV2UDsKLSAgZml4UyAqZml4cDsKLSAgZml4UyAqbmV4dDsKLSAgZml4UyAqbGl0dXNlOwotICBpbnQgbl9saXR1c2VzID0gMDsKLQotI2lmZGVmIERFQlVHMl9BTFBIQQotICBpbnQgbiA9IDA7Ci0gIGludCBuX2xpdGVyYWxzID0gMDsKLSAgaW50IG5fZHVwX2xpdGVyYWxzID0gMDsKLSNlbmRpZgotCi0gIC8qIElmIHNlZ2luZm8gaXMgTlVMTCwgd2UgZGlkIG5vdCBjcmVhdGUgdGhpcyBzZWN0aW9uOyBkb24ndCBkbyBhbnl0aGluZyB3aXRoCi0gICAgIGl0LiAgQnkgdXNpbmcgYSBwb2ludGVyIHRvIGEgcG9pbnRlciwgd2UgY2FuIHVwZGF0ZSB0aGUgbGlua3MgaW4gcGxhY2UuICAqLwotICBpZiAoc2VnaW5mbyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBJZiB0aGVyZSBhcmUgbm8gcmVsb2NhdGlvbnMsIHNraXAgdGhlIHNlY3Rpb24uICAqLwotICBpZiAoISBzZWdpbmZvLT5maXhfcm9vdCkKLSAgICByZXR1cm47Ci0KLSAgLyogRmlyc3QgcmVidWlsZCB0aGUgZml4dXAgY2hhaW4gd2l0aG91dCB0aGUgZXhwaWNpdCBsaXR1c2Uncy4gICovCi0gIHByZXZQID0gJihzZWdpbmZvLT5maXhfcm9vdCk7Ci0gIGZvciAoZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXhwOyBmaXhwID0gbmV4dCkKLSAgICB7Ci0gICAgICBuZXh0ID0gZml4cC0+ZnhfbmV4dDsKLSAgICAgIGZpeHAtPmZ4X25leHQgPSAoZml4UyAqKTA7Ci0jaWZkZWYgREVCVUcyX0FMUEhBCi0gICAgICBuKys7Ci0jZW5kaWYKLQotICAgICAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICAqcHJldlAgPSBmaXhwOwotCSAgcHJldlAgPSAmKGZpeHAtPmZ4X25leHQpOwotI2lmZGVmIERFQlVHMl9BTFBIQQotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAiYWxwaGFfYWRqdXN0X3N5bXRhYl9yZWxvY3M6IDB4JWx4LCBvdGhlciByZWxvY2F0aW9uICVzXG4iLAotCQkgICAobG9uZylmaXhwLAotCQkgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSk7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRFUkFMOgotCSAgKnByZXZQID0gZml4cDsKLQkgIHByZXZQID0gJihmaXhwLT5meF9uZXh0KTsKLQkgIC8qIHByZXZlbnQgYXNzZW1ibGVyIGZyb20gdHJ5aW5nIHRvIGFkanVzdCB0aGUgb2Zmc2V0ICovCi0jaWZkZWYgREVCVUcyX0FMUEhBCi0JICBuX2xpdGVyYWxzKys7Ci0JICBpZiAoZml4cC0+dGNfZml4X2RhdGEuaW5mby0+bl9saXRlcmFscyAhPSAxKQotCSAgICBuX2R1cF9saXRlcmFscysrOwotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAiYWxwaGFfYWRqdXN0X3N5bXRhYl9yZWxvY3M6IDB4JWx4LCAhbGl0ZXJhbCElLjZkLCAjIGxpdGVyYWxzID0gJTJkXG4iLAotCQkgICAobG9uZylmaXhwLAotCQkgICBmaXhwLT50Y19maXhfZGF0YS5pbmZvLT5zZXF1ZW5jZSwKLQkJICAgZml4cC0+dGNfZml4X2RhdGEuaW5mby0+bl9saXRlcmFscyk7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCi0JICAvKiBkbyBub3QgbGluayBpbiBsaXR1c2UncyAqLwotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JBU0U6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQllUT0ZGOgotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUjoKLQkgIG5fbGl0dXNlcysrOwotCSAgaWYgKGZpeHAtPnRjX2ZpeF9kYXRhLmluZm8tPm5fbGl0ZXJhbHMgPT0gMCkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICBfKCJObyAhbGl0ZXJhbCElZCB3YXMgZm91bmQiKSwKLQkJCSAgZml4cC0+dGNfZml4X2RhdGEuaW5mby0+c2VxdWVuY2UpOwotI2lmZGVmIERFQlVHMl9BTFBIQQotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAiYWxwaGFfYWRqdXN0X3N5bXRhYl9yZWxvY3M6IDB4JWx4LCAhbGl0dXNlICElLjZkLCAjIGxpdHVzZXMgID0gJTJkLCBuZXh0X2xpdHVzZSA9IDB4JWx4XG4iLAotCQkgICAobG9uZylmaXhwLAotCQkgICBmaXhwLT50Y19maXhfZGF0YS5pbmZvLT5zZXF1ZW5jZSwKLQkJICAgZml4cC0+dGNfZml4X2RhdGEuaW5mby0+bl9saXR1c2VzLAotCQkgICAobG9uZylmaXhwLT50Y19maXhfZGF0YS5uZXh0X2xpdHVzZSk7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgd2VyZSBhbnkgbGl0dXNlcywgZ28gYW5kIGFkZCB0aGVtIHRvIHRoZSBjaGFpbiwgdW5sZXNzIHRoZXJlIGlzCi0gICAgIG1vcmUgdGhhbiBvbmUgIWxpdGVyYWwgZm9yIGEgZ2l2ZW4gc2VxdWVuY2UgbnVtYmVyLiAgVGhleSBhcmUgbGlua2VkCi0gICAgIHRocm91Z2ggdGhlIG5leHRfbGl0dXNlIGZpZWxkIGluIHJldmVyc2Ugb3JkZXIsIHNvIGFzIHdlIGdvIHRocm91Z2ggdGhlCi0gICAgIG5leHRfbGl0dXNlIGNoYWluLCB3ZSBlZmZlY3RpdmVseSByZXZlcnNlIHRoZSBjaGFpbiBvbmNlIGFnYWluLiAgSWYgdGhlcmUKLSAgICAgd2FzIG1vcmUgdGhhbiBvbmUgIWxpdGVyYWwsIHdlIGZhbGwgYmFjayB0byBsb2FkaW5nIHVwIHRoZSBhZGRyZXNzIHcvbwotICAgICBvcHRpbWl6YXRpb24uICBBbHNvLCBpZiB0aGUgIWxpdGVyYWxzLyFsaXR1c2VzIGFyZSBzcHJlYWQgaW4gZGlmZmVyZW50Ci0gICAgIHNlZ21lbnRzIChoYXBwZW5zIGluIHRoZSBMaW51eCBrZXJuZWwgc2VtYXBob3JlcyksIHN1cHByZXNzIHRoZQotICAgICBvcHRpbWl6YXRpb24uICAqLwotICBpZiAobl9saXR1c2VzKQotICAgIHsKLSAgICAgIGZvciAoZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXhwOyBmaXhwID0gZml4cC0+ZnhfbmV4dCkKLQl7Ci0JICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElURVJBTDoKLSNpZmRlZiBPQkpfRUxGCi0JICAgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOwotI2Vsc2UKLQkgICAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDsJLyogWFhYIGNoZWNrIHRoaXMgKi8KLSNlbmRpZgotCSAgICAgIGlmIChmaXhwLT50Y19maXhfZGF0YS5pbmZvLT5uX2xpdGVyYWxzID09IDEKLQkJICAmJiAhIGZpeHAtPnRjX2ZpeF9kYXRhLmluZm8tPm11bHRpX3NlY3Rpb25fcCkKLQkJewotCQkgIGZvciAobGl0dXNlID0gZml4cC0+dGNfZml4X2RhdGEuaW5mby0+bGl0dXNlOwotCQkgICAgICAgbGl0dXNlICE9IChmaXhTICopMDsKLQkJICAgICAgIGxpdHVzZSA9IGxpdHVzZS0+dGNfZml4X2RhdGEubmV4dF9saXR1c2UpCi0JCSAgICB7Ci0JCSAgICAgIGxpdHVzZS0+ZnhfbmV4dCA9IGZpeHAtPmZ4X25leHQ7Ci0JCSAgICAgIGZpeHAtPmZ4X25leHQgPSBsaXR1c2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFOgotCSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0pTUjoKLQkgICAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmZGVmIERFQlVHMl9BTFBIQQotICBmcHJpbnRmIChzdGRlcnIsICJhbHBoYV9hZGp1c3Rfc3ltdGFiX3JlbG9jczogJXMsICVkIGxpdGVyYWwlcywgJWQgZHVwbGljYXRlIGxpdGVyYWwlcywgJWQgbGl0dXNlJXNcblxuIiwKLQkgICBzZWMtPm5hbWUsCi0JICAgbl9saXRlcmFscywgKG5fbGl0ZXJhbHMgPT0gMSkgPyAiIiA6ICJzIiwKLQkgICBuX2R1cF9saXRlcmFscywgKG5fZHVwX2xpdGVyYWxzID09IDEpID8gIiIgOiAicyIsCi0JICAgbl9saXR1c2VzLCAobl9saXR1c2VzID09IDEpID8gIiIgOiAicyIpOwotI2VuZGlmCi19Ci0KLSNlbmRpZiAvKiBSRUxPQ19PUF9QICovCi0KLQwKLSNpZmRlZiBERUJVR19BTFBIQQotc3RhdGljIHZvaWQKLWRlYnVnX2V4cCAodG9rLCBudG9rKQotICAgICBleHByZXNzaW9uUyB0b2tbXTsKLSAgICAgaW50IG50b2s7Ci17Ci0gIGludCBpOwotCi0gIGZwcmludGYgKHN0ZGVyciwgImRlYnVnX2V4cDogJWQgdG9rZW5zIiwgbnRvayk7Ci0gIGZvciAoaSA9IDA7IGkgPCBudG9rOyBpKyspCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgKnQgPSAmdG9rW2ldOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHN3aXRjaCAodC0+WF9vcCkKLQl7Ci0JZGVmYXVsdDoJCQluYW1lID0gInVua25vd24iOwkJYnJlYWs7Ci0JY2FzZSBPX2lsbGVnYWw6CQkJbmFtZSA9ICJPX2lsbGVnYWwiOwkJYnJlYWs7Ci0JY2FzZSBPX2Fic2VudDoJCQluYW1lID0gIk9fYWJzZW50IjsJCWJyZWFrOwotCWNhc2UgT19jb25zdGFudDoJCW5hbWUgPSAiT19jb25zdGFudCI7CQlicmVhazsKLQljYXNlIE9fc3ltYm9sOgkJCW5hbWUgPSAiT19zeW1ib2wiOwkJYnJlYWs7Ci0JY2FzZSBPX3N5bWJvbF9ydmE6CQluYW1lID0gIk9fc3ltYm9sX3J2YSI7CQlicmVhazsKLQljYXNlIE9fcmVnaXN0ZXI6CQluYW1lID0gIk9fcmVnaXN0ZXIiOwkJYnJlYWs7Ci0JY2FzZSBPX2JpZzoJCQluYW1lID0gIk9fYmlnIjsJCQlicmVhazsKLQljYXNlIE9fdW1pbnVzOgkJCW5hbWUgPSAiT191bWludXMiOwkJYnJlYWs7Ci0JY2FzZSBPX2JpdF9ub3Q6CQkJbmFtZSA9ICJPX2JpdF9ub3QiOwkJYnJlYWs7Ci0JY2FzZSBPX2xvZ2ljYWxfbm90OgkJbmFtZSA9ICJPX2xvZ2ljYWxfbm90IjsJCWJyZWFrOwotCWNhc2UgT19tdWx0aXBseToJCW5hbWUgPSAiT19tdWx0aXBseSI7CQlicmVhazsKLQljYXNlIE9fZGl2aWRlOgkJCW5hbWUgPSAiT19kaXZpZGUiOwkJYnJlYWs7Ci0JY2FzZSBPX21vZHVsdXM6CQkJbmFtZSA9ICJPX21vZHVsdXMiOwkJYnJlYWs7Ci0JY2FzZSBPX2xlZnRfc2hpZnQ6CQluYW1lID0gIk9fbGVmdF9zaGlmdCI7CQlicmVhazsKLQljYXNlIE9fcmlnaHRfc2hpZnQ6CQluYW1lID0gIk9fcmlnaHRfc2hpZnQiOwkJYnJlYWs7Ci0JY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6CW5hbWUgPSAiT19iaXRfaW5jbHVzaXZlX29yIjsJYnJlYWs7Ci0JY2FzZSBPX2JpdF9vcl9ub3Q6CQluYW1lID0gIk9fYml0X29yX25vdCI7CQlicmVhazsKLQljYXNlIE9fYml0X2V4Y2x1c2l2ZV9vcjoJbmFtZSA9ICJPX2JpdF9leGNsdXNpdmVfb3IiOwlicmVhazsKLQljYXNlIE9fYml0X2FuZDoJCQluYW1lID0gIk9fYml0X2FuZCI7CQlicmVhazsKLQljYXNlIE9fYWRkOgkJCW5hbWUgPSAiT19hZGQiOwkJCWJyZWFrOwotCWNhc2UgT19zdWJ0cmFjdDoJCW5hbWUgPSAiT19zdWJ0cmFjdCI7CQlicmVhazsKLQljYXNlIE9fZXE6CQkJbmFtZSA9ICJPX2VxIjsJCQlicmVhazsKLQljYXNlIE9fbmU6CQkJbmFtZSA9ICJPX25lIjsJCQlicmVhazsKLQljYXNlIE9fbHQ6CQkJbmFtZSA9ICJPX2x0IjsJCQlicmVhazsKLQljYXNlIE9fbGU6CQkJbmFtZSA9ICJPX2xlIjsJCQlicmVhazsKLQljYXNlIE9fZ2U6CQkJbmFtZSA9ICJPX2dlIjsJCQlicmVhazsKLQljYXNlIE9fZ3Q6CQkJbmFtZSA9ICJPX2d0IjsJCQlicmVhazsKLQljYXNlIE9fbG9naWNhbF9hbmQ6CQluYW1lID0gIk9fbG9naWNhbF9hbmQiOwkJYnJlYWs7Ci0JY2FzZSBPX2xvZ2ljYWxfb3I6CQluYW1lID0gIk9fbG9naWNhbF9vciI7CQlicmVhazsKLQljYXNlIE9faW5kZXg6CQkJbmFtZSA9ICJPX2luZGV4IjsJCWJyZWFrOwotCWNhc2UgT19wcmVnaXN0ZXI6CQluYW1lID0gIk9fcHJlZ2lzdGVyIjsJCWJyZWFrOwotCWNhc2UgT19jcHJlZ2lzdGVyOgkJbmFtZSA9ICJPX2NwcmVnaXN0ZXIiOwkJYnJlYWs7Ci0JY2FzZSBPX2xpdGVyYWw6CQkJbmFtZSA9ICJPX2xpdGVyYWwiOwkJYnJlYWs7Ci0JY2FzZSBPX2xpdHVzZV9iYXNlOgkJbmFtZSA9ICJPX2xpdHVzZV9iYXNlIjsJCWJyZWFrOwotCWNhc2UgT19saXR1c2VfYnl0b2ZmOgkJbmFtZSA9ICJPX2xpdHVzZV9ieXRvZmYiOwlicmVhazsKLQljYXNlIE9fbGl0dXNlX2pzcjoJCW5hbWUgPSAiT19saXR1c2VfanNyIjsJCWJyZWFrOwotCWNhc2UgT19ncGRpc3A6CQkJbmFtZSA9ICJPX2dwZGlzcCI7CQlicmVhazsKLQljYXNlIE9fZ3ByZWxoaWdoOgkJbmFtZSA9ICJPX2dwcmVsaGlnaCI7CQlicmVhazsKLQljYXNlIE9fZ3ByZWxsb3c6CQluYW1lID0gIk9fZ3ByZWxsb3ciOwkJYnJlYWs7Ci0JY2FzZSBPX21kMTA6CQkJbmFtZSA9ICJPX21kMTAiOwkJYnJlYWs7Ci0JY2FzZSBPX21kMTE6CQkJbmFtZSA9ICJPX21kMTEiOwkJYnJlYWs7Ci0JY2FzZSBPX21kMTI6CQkJbmFtZSA9ICJPX21kMTIiOwkJYnJlYWs7Ci0JY2FzZSBPX21kMTM6CQkJbmFtZSA9ICJPX21kMTMiOwkJYnJlYWs7Ci0JY2FzZSBPX21kMTQ6CQkJbmFtZSA9ICJPX21kMTQiOwkJYnJlYWs7Ci0JY2FzZSBPX21kMTU6CQkJbmFtZSA9ICJPX21kMTUiOwkJYnJlYWs7Ci0JY2FzZSBPX21kMTY6CQkJbmFtZSA9ICJPX21kMTYiOwkJYnJlYWs7Ci0JfQotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIsICVzKCVzLCAlcywgJWQpIiwgbmFtZSwKLQkgICAgICAgKHQtPlhfYWRkX3N5bWJvbCkgPyBTX0dFVF9OQU1FICh0LT5YX2FkZF9zeW1ib2wpIDogIi0tIiwKLQkgICAgICAgKHQtPlhfb3Bfc3ltYm9sKSA/IFNfR0VUX05BTUUgKHQtPlhfb3Bfc3ltYm9sKSA6ICItLSIsCi0JICAgICAgIChpbnQpdC0+WF9hZGRfbnVtYmVyKTsKLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gIGZmbHVzaCAoc3RkZXJyKTsKLX0KLSNlbmRpZgotCi0vKiBQYXJzZSB0aGUgYXJndW1lbnRzIHRvIGFuIG9wY29kZS4gICovCi0KLXN0YXRpYyBpbnQKLXRva2VuaXplX2FyZ3VtZW50cyAoc3RyLCB0b2ssIG50b2spCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgZXhwcmVzc2lvblMgdG9rW107Ci0gICAgIGludCBudG9rOwotewotICBleHByZXNzaW9uUyAqZW5kX3RvayA9IHRvayArIG50b2s7Ci0gIGNoYXIgKm9sZF9pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGludCBzYXdfY29tbWEgPSAwLCBzYXdfYXJnID0gMDsKLSNpZmRlZiBERUJVR19BTFBIQQotICBleHByZXNzaW9uUyAqb3JpZ190b2sgPSB0b2s7Ci0jZW5kaWYKLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGNoYXIgKnA7Ci0gIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnI7Ci0gIGludCBjLCBpOwotICBzaXplX3QgbGVuOwotICBpbnQgcmVsb2NfZm91bmRfcCA9IDA7Ci0jZW5kaWYKLQotICBtZW1zZXQgKHRvaywgMCwgc2l6ZW9mICgqdG9rKSAqIG50b2spOwotCi0gIC8qIFNhdmUgYW5kIHJlc3RvcmUgaW5wdXRfbGluZV9wb2ludGVyIGFyb3VuZCB0aGlzIGZ1bmN0aW9uICovCi0gIG9sZF9pbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICB3aGlsZSAodG9rIDwgZW5kX3RvayAmJiAqaW5wdXRfbGluZV9wb2ludGVyKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQl7Ci0JY2FzZSAnXDAnOgotCSAgZ290byBmaW5pOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotCWNhc2UgJyEnOgotCSAgLyogQSByZWxvY2F0aW9uIG9wZXJhbmQgY2FuIGJlIHBsYWNlZCBhZnRlciB0aGUgbm9ybWFsIG9wZXJhbmQgb24gYW4KLQkgICAgIGFzc2VtYmx5IGxhbmd1YWdlIHN0YXRlbWVudCwgYW5kIGhhcyB0aGUgZm9sbG93aW5nIGZvcm06Ci0JCSFyZWxvY2F0aW9uX3R5cGUhc2VxdWVuY2VfbnVtYmVyLiAgKi8KLQkgIGlmIChyZWxvY19mb3VuZF9wKQotCSAgICB7CQkJLyogb25seSBzdXBwb3J0IG9uZSByZWxvY2F0aW9uIG9wIHBlciBpbnNuICovCi0JICAgICAgYXNfYmFkIChfKCJNb3JlIHRoYW4gb25lIHJlbG9jYXRpb24gb3AgcGVyIGluc24iKSk7Ci0JICAgICAgZ290byBlcnJfcmVwb3J0OwotCSAgICB9Ci0KLQkgIGlmICghc2F3X2FyZykKLQkgICAgZ290byBlcnI7Ci0KLQkgIGZvciAocCA9ICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgICAoKGMgPSAqcCkgIT0gJyEnICYmIGMgIT0gJzsnICYmIGMgIT0gJyMnICYmIGMgIT0gJywnCi0JCSYmICFpc19lbmRfb2ZfbGluZVtjXSk7Ci0JICAgICAgIHArKykKLQkgICAgOwotCi0JICAvKiBQYXJzZSAhcmVsb2NhdGlvbl90eXBlICovCi0JICBsZW4gPSBwIC0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaWYgKGxlbiA9PSAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJObyByZWxvY2F0aW9uIG9wZXJhbmQiKSk7Ci0JICAgICAgZ290byBlcnJfcmVwb3J0OwotCSAgICB9Ci0KLQkgIGlmIChjICE9ICchJykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiTm8gIXNlcXVlbmNlLW51bWJlciBhZnRlciAhJXMiKSwgaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgICAgICBnb3RvIGVycl9yZXBvcnQ7Ci0JICAgIH0KLQotCSAgciA9ICZhbHBoYV9yZWxvY19vcFswXTsKLQkgIGZvciAoaSA9IGFscGhhX251bV9yZWxvY19vcC0xOyBpID49IDA7IGktLSwgcisrKQotCSAgICB7Ci0JICAgICAgaWYgKGxlbiA9PSByLT5sZW5ndGgKLQkJICAmJiBtZW1jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgci0+bmFtZSwgbGVuKSA9PSAwKQotCQlicmVhazsKLQkgICAgfQotCSAgaWYgKGkgPCAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJVbmtub3duIHJlbG9jYXRpb24gb3BlcmFuZDogISVzIiksIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0JICAgICAgZ290byBlcnJfcmVwb3J0OwotCSAgICB9Ci0KLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9ICsrcDsKLQotCSAgLyogUGFyc2UgIXNlcXVlbmNlX251bWJlciAqLwotCSAgbWVtc2V0ICh0b2ssICdcMCcsIHNpemVvZiAoZXhwcmVzc2lvblMpKTsKLQkgIGV4cHJlc3Npb24gKHRvayk7Ci0KLQkgIGlmICh0b2stPlhfb3AgIT0gT19jb25zdGFudAotCSAgICAgIHx8ICEgQUxQSEFfUkVMT0NfU0VRVUVOQ0VfT0sgKHRvay0+WF9hZGRfbnVtYmVyKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiQmFkIHNlcXVlbmNlIG51bWJlcjogISVzISVzIiksIHItPm5hbWUsIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0JICAgICAgZ290byBlcnJfcmVwb3J0OwotCSAgICB9Ci0KLQkgIHRvay0+WF9vcCA9IHItPm9wOwotCSAgcmVsb2NfZm91bmRfcCA9IDE7Ci0JICArK3RvazsKLQkgIGJyZWFrOwotI2VuZGlmCi0KLQljYXNlICcsJzoKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgaWYgKHNhd19jb21tYSB8fCAhc2F3X2FyZykKLQkgICAgZ290byBlcnI7Ci0JICBzYXdfY29tbWEgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICcoJzoKLQkgIHsKLQkgICAgY2hhciAqaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0JICAgIC8qIEZpcnN0IHRyeSBmb3IgcGFyZW50aGVzaXplZCByZWdpc3RlciAuLi4gKi8KLQkgICAgZXhwcmVzc2lvbiAodG9rKTsKLQkgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyknICYmIHRvay0+WF9vcCA9PSBPX3JlZ2lzdGVyKQotCSAgICAgIHsKLQkJdG9rLT5YX29wID0gKHNhd19jb21tYSA/IE9fY3ByZWdpc3RlciA6IE9fcHJlZ2lzdGVyKTsKLQkJc2F3X2NvbW1hID0gMDsKLQkJc2F3X2FyZyA9IDE7Ci0JCSsraW5wdXRfbGluZV9wb2ludGVyOwotCQkrK3RvazsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIC8qIC4uLiB0aGVuIGZhbGwgdGhyb3VnaCB0byBwbGFpbiBleHByZXNzaW9uICovCi0JICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICB9Ci0KLQlkZWZhdWx0OgotCSAgaWYgKHNhd19hcmcgJiYgIXNhd19jb21tYSkKLQkgICAgZ290byBlcnI7Ci0KLQkgIGV4cHJlc3Npb24gKHRvayk7Ci0JICBpZiAodG9rLT5YX29wID09IE9faWxsZWdhbCB8fCB0b2stPlhfb3AgPT0gT19hYnNlbnQpCi0JICAgIGdvdG8gZXJyOwotCi0JICBzYXdfY29tbWEgPSAwOwotCSAgc2F3X2FyZyA9IDE7Ci0JICArK3RvazsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLWZpbmk6Ci0gIGlmIChzYXdfY29tbWEpCi0gICAgZ290byBlcnI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZF9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSNpZmRlZiBERUJVR19BTFBIQQotICBkZWJ1Z19leHAgKG9yaWdfdG9rLCBudG9rIC0gKGVuZF90b2sgLSB0b2spKTsKLSNlbmRpZgotCi0gIHJldHVybiBudG9rIC0gKGVuZF90b2sgLSB0b2spOwotCi1lcnI6Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZF9pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHJldHVybiBUT0tFTklaRV9FUlJPUjsKLQotI2lmZGVmIFJFTE9DX09QX1AKLWVycl9yZXBvcnQ6Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZF9pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHJldHVybiBUT0tFTklaRV9FUlJPUl9SRVBPUlQ7Ci0jZW5kaWYKLX0KLQotLyogU2VhcmNoIGZvcndhcmQgdGhyb3VnaCBhbGwgdmFyaWFudHMgb2YgYW4gb3Bjb2RlIGxvb2tpbmcgZm9yIGEKLSAgIHN5bnRheCBtYXRjaC4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICoKLWZpbmRfb3Bjb2RlX21hdGNoKGZpcnN0X29wY29kZSwgdG9rLCBwbnRvaywgcGNwdW1hdGNoKQotICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpmaXJzdF9vcGNvZGU7Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCAqcG50b2s7Ci0gICAgIGludCAqcGNwdW1hdGNoOwotewotICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGUgPSBmaXJzdF9vcGNvZGU7Ci0gIGludCBudG9rID0gKnBudG9rOwotICBpbnQgZ290X2NwdV9tYXRjaCA9IDA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGlkeDsKLSAgICAgIGludCB0b2tpZHggPSAwOwotCi0gICAgICAvKiBEb24ndCBtYXRjaCBvcGNvZGVzIHRoYXQgZG9uJ3QgZXhpc3Qgb24gdGhpcyBhcmNoaXRlY3R1cmUgKi8KLSAgICAgIGlmICghKG9wY29kZS0+ZmxhZ3MgJiBhbHBoYV90YXJnZXQpKQotCWdvdG8gbWF0Y2hfZmFpbGVkOwotCi0gICAgICBnb3RfY3B1X21hdGNoID0gMTsKLQotICAgICAgZm9yIChvcGlkeCA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGlkeDsgKytvcGlkeCkKLQl7Ci0JICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZCA9ICZhbHBoYV9vcGVyYW5kc1sqb3BpZHhdOwotCi0JICAvKiBvbmx5IHRha2UgaW5wdXQgZnJvbSByZWFsIG9wZXJhbmRzICovCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9GQUtFKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogd2hlbiB3ZSBleHBlY3QgaW5wdXQsIG1ha2Ugc3VyZSB3ZSBoYXZlIGl0ICovCi0JICBpZiAodG9raWR4ID49IG50b2spCi0JICAgIHsKLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfT1BUSU9OQUxfTUFTSykgPT0gMCkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogbWF0Y2ggb3BlcmFuZCB0eXBlIHdpdGggZXhwcmVzc2lvbiB0eXBlICovCi0JICBzd2l0Y2ggKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfVFlQRUNIRUNLX01BU0spCi0JICAgIHsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9JUjoKLQkgICAgICBpZiAodG9rW3Rva2lkeF0uWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9GUFI6Ci0JICAgICAgaWYgKHRva1t0b2tpZHhdLlhfb3AgIT0gT19yZWdpc3RlcgotCQkgIHx8ICFpc19mcHJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0lSfEFYUF9PUEVSQU5EX1BBUkVOUzoKLQkgICAgICBpZiAodG9rW3Rva2lkeF0uWF9vcCAhPSBPX3ByZWdpc3RlcgotCQkgIHx8ICFpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfUEFSRU5TfEFYUF9PUEVSQU5EX0NPTU1BOgotCSAgICAgIGlmICh0b2tbdG9raWR4XS5YX29wICE9IE9fY3ByZWdpc3RlcgotCQkgIHx8ICFpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBWFBfT1BFUkFORF9SRUxBVElWRToKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9TSUdORUQ6Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfVU5TSUdORUQ6Ci0JICAgICAgc3dpdGNoICh0b2tbdG9raWR4XS5YX29wKQotCQl7Ci0JCWNhc2UgT19pbGxlZ2FsOgotCQljYXNlIE9fYWJzZW50OgotCQljYXNlIE9fcmVnaXN0ZXI6Ci0JCWNhc2UgT19wcmVnaXN0ZXI6Ci0JCWNhc2UgT19jcHJlZ2lzdGVyOgotCQkgIGdvdG8gbWF0Y2hfZmFpbGVkOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qIGV2ZXJ5dGhpbmcgZWxzZSBzaG91bGQgaGF2ZSBiZWVuIGZha2UgKi8KLQkgICAgICBhYm9ydCgpOwotCSAgICB9Ci0JICArK3Rva2lkeDsKLQl9Ci0KLSAgICAgIC8qIHBvc3NpYmxlIG1hdGNoIC0tIGRpZCB3ZSB1c2UgYWxsIG9mIG91ciBpbnB1dD8gKi8KLSAgICAgIGlmICh0b2tpZHggPT0gbnRvaykKLQl7Ci0JICAqcG50b2sgPSBudG9rOwotCSAgcmV0dXJuIG9wY29kZTsKLQl9Ci0KLSAgICBtYXRjaF9mYWlsZWQ6OwotICAgIH0KLSAgd2hpbGUgKCsrb3Bjb2RlLWFscGhhX29wY29kZXMgPCBhbHBoYV9udW1fb3Bjb2RlcwotCSAmJiAhc3RyY21wKG9wY29kZS0+bmFtZSwgZmlyc3Rfb3Bjb2RlLT5uYW1lKSk7Ci0KLSAgaWYgKCpwY3B1bWF0Y2gpCi0gICAgICAqcGNwdW1hdGNoID0gZ290X2NwdV9tYXRjaDsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2VhcmNoIGZvcndhcmQgdGhyb3VnaCBhbGwgdmFyaWFudHMgb2YgYSBtYWNybyBsb29raW5nIGZvciBhIHN5bnRheAotICAgbWF0Y2guICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFscGhhX21hY3JvICoKLWZpbmRfbWFjcm9fbWF0Y2goZmlyc3RfbWFjcm8sIHRvaywgcG50b2spCi0gICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqZmlyc3RfbWFjcm87Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCAqcG50b2s7Ci17Ci0gIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqbWFjcm8gPSBmaXJzdF9tYWNybzsKLSAgaW50IG50b2sgPSAqcG50b2s7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBjb25zdCBlbnVtIGFscGhhX21hY3JvX2FyZyAqYXJnID0gbWFjcm8tPmFyZ3NldHM7Ci0gICAgICBpbnQgdG9raWR4ID0gMDsKLQotICAgICAgd2hpbGUgKCphcmcpCi0JewotCSAgc3dpdGNoICgqYXJnKQotCSAgICB7Ci0JICAgIGNhc2UgTUFDUk9fRU9BOgotCSAgICAgIGlmICh0b2tpZHggPT0gbnRvaykKLQkJcmV0dXJuIG1hY3JvOwotCSAgICAgIGVsc2UKLQkJdG9raWR4ID0gMDsKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIGluZGV4IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgTUFDUk9fSVI6Ci0JICAgICAgaWYgKHRva2lkeCA+PSBudG9rIHx8IHRva1t0b2tpZHhdLlhfb3AgIT0gT19yZWdpc3RlcgotCQkgIHx8ICFpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgKyt0b2tpZHg7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgICAvKiBwYXJlbnRoZXNpemVkIGluZGV4IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgTUFDUk9fUElSOgotCSAgICAgIGlmICh0b2tpZHggPj0gbnRvayB8fCB0b2tbdG9raWR4XS5YX29wICE9IE9fcHJlZ2lzdGVyCi0JCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICArK3Rva2lkeDsKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIG9wdGlvbmFsIHBhcmVudGhlc2l6ZWQgaW5kZXggcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSBNQUNST19PUElSOgotCSAgICAgIGlmICh0b2tpZHggPCBudG9rICYmIHRva1t0b2tpZHhdLlhfb3AgPT0gT19wcmVnaXN0ZXIKLQkJICAmJiBpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJKyt0b2tpZHg7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgICAvKiBsZWFkaW5nIGNvbW1hIHdpdGggYSBwYXJlbnRoZXNpemVkIGluZGV4IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgTUFDUk9fQ1BJUjoKLQkgICAgICBpZiAodG9raWR4ID49IG50b2sgfHwgdG9rW3Rva2lkeF0uWF9vcCAhPSBPX2NwcmVnaXN0ZXIKLQkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgICsrdG9raWR4OwotCSAgICAgIGJyZWFrOwotCi0JICAgICAgLyogZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSBNQUNST19GUFI6Ci0JICAgICAgaWYgKHRva2lkeCA+PSBudG9rIHx8IHRva1t0b2tpZHhdLlhfb3AgIT0gT19yZWdpc3RlcgotCQkgIHx8ICFpc19mcHJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgICsrdG9raWR4OwotCSAgICAgIGJyZWFrOwotCi0JICAgICAgLyogbm9ybWFsIGV4cHJlc3Npb24gKi8KLQkgICAgY2FzZSBNQUNST19FWFA6Ci0JICAgICAgaWYgKHRva2lkeCA+PSBudG9rKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICBzd2l0Y2ggKHRva1t0b2tpZHhdLlhfb3ApCi0JCXsKLQkJY2FzZSBPX2lsbGVnYWw6Ci0JCWNhc2UgT19hYnNlbnQ6Ci0JCWNhc2UgT19yZWdpc3RlcjoKLQkJY2FzZSBPX3ByZWdpc3RlcjoKLQkJY2FzZSBPX2NwcmVnaXN0ZXI6Ci0jaWZkZWYgUkVMT0NfT1BfUAotCQljYXNlIE9fbGl0ZXJhbDoKLQkJY2FzZSBPX2xpdHVzZV9iYXNlOgotCQljYXNlIE9fbGl0dXNlX2J5dG9mZjoKLQkJY2FzZSBPX2xpdHVzZV9qc3I6Ci0JCWNhc2UgT19ncGRpc3A6Ci0JCWNhc2UgT19ncHJlbGhpZ2g6Ci0JCWNhc2UgT19ncHJlbGxvdzoKLSNlbmRpZgotCQkgIGdvdG8gbWF0Y2hfZmFpbGVkOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICArK3Rva2lkeDsKLQkgICAgICBicmVhazsKLQotCSAgICAgIC8qIG9wdGlvbmFsICFsaXRlcmFsITxudW1iZXI+ICovCi0JICAgIGNhc2UgTUFDUk9fTElURVJBTDoKLSNpZmRlZiBSRUxPQ19PUF9QCi0JICAgICAgaWYgKHRva2lkeCA8IG50b2sgJiYgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX2xpdGVyYWwpCi0JCXRva2lkeCsrOwotI2VuZGlmCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgICAvKiBvcHRpb25hbCAhbGl0dXNlX2Jhc2UhPG51bWJlcj4gKi8KLQkgICAgY2FzZSBNQUNST19CQVNFOgotI2lmZGVmIFJFTE9DX09QX1AKLQkgICAgICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fbGl0dXNlX2Jhc2UpCi0JCXRva2lkeCsrOwotI2VuZGlmCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgICAvKiBvcHRpb25hbCAhbGl0dXNlX2J5dG9mZiE8bnVtYmVyPiAqLwotCSAgICBjYXNlIE1BQ1JPX0JZVE9GRjoKLSNpZmRlZiBSRUxPQ19PUF9QCi0JICAgICAgaWYgKHRva2lkeCA8IG50b2sgJiYgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX2xpdHVzZV9ieXRvZmYpCi0JCXRva2lkeCsrOwotI2VuZGlmCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgICAvKiBvcHRpb25hbCAhbGl0dXNlX2pzciE8bnVtYmVyPiAqLwotCSAgICBjYXNlIE1BQ1JPX0pTUjoKLSNpZmRlZiBSRUxPQ19PUF9QCi0JICAgICAgaWYgKHRva2lkeCA8IG50b2sgJiYgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX2xpdHVzZV9qc3IpCi0JCXRva2lkeCsrOwotI2VuZGlmCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgbWF0Y2hfZmFpbGVkOgotCSAgICAgIHdoaWxlICgqYXJnICE9IE1BQ1JPX0VPQSkKLQkJKythcmc7Ci0JICAgICAgdG9raWR4ID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgKythcmc7Ci0JfQotICAgIH0KLSAgd2hpbGUgKCsrbWFjcm8tYWxwaGFfbWFjcm9zIDwgYWxwaGFfbnVtX21hY3JvcwotCSAmJiAhc3RyY21wKG1hY3JvLT5uYW1lLCBmaXJzdF9tYWNyby0+bmFtZSkpOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBJbnNlcnQgYW4gb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfb3BlcmFuZChpbnNuLCBvcGVyYW5kLCB2YWwsIGZpbGUsIGxpbmUpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kOwotICAgICBvZmZzZXRUIHZhbDsKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgbGluZTsKLXsKLSAgaWYgKG9wZXJhbmQtPmJpdHMgIT0gMzIgJiYgIShvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX05PT1ZFUkZMT1cpKQotICAgIHsKLSAgICAgIG9mZnNldFQgbWluLCBtYXg7Ci0KLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1NJR05FRCkKLQl7Ci0JICBtYXggPSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSAtIDE7Ci0JICBtaW4gPSAtKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgIG1pbiA9IDA7Ci0JfQotCi0gICAgICBpZiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkKLQl7Ci0JICBjb25zdCBjaGFyICplcnIgPQotCSAgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWQgYW5kICVkKSIpOwotCSAgY2hhciBidWZbc2l6ZW9mICh2YWwpICogMyArIDJdOwotCi0JICBzcHJpbnRfdmFsdWUoYnVmLCB2YWwpOwotCSAgaWYgKGZpbGUpCi0JICAgIGFzX3dhcm5fd2hlcmUoZmlsZSwgbGluZSwgZXJyLCBidWYsIG1pbiwgbWF4KTsKLQkgIGVsc2UKLQkgICAgYXNfd2FybihlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wZXJhbmQtPmluc2VydCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2cgPSBOVUxMOwotCi0gICAgICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCB2YWwsICZlcnJtc2cpOwotICAgICAgaWYgKGVycm1zZykKLQlhc193YXJuIChlcnJtc2cpOwotICAgIH0KLSAgZWxzZQotICAgIGluc24gfD0gKCh2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkgPDwgb3BlcmFuZC0+c2hpZnQpOwotCi0gIHJldHVybiBpbnNuOwotfQotCi0vKgotICogVHVybiBhbiBvcGNvZGUgZGVzY3JpcHRpb24gYW5kIGEgc2V0IG9mIGFyZ3VtZW50cyBpbnRvCi0gKiBhbiBpbnN0cnVjdGlvbiBhbmQgYSBmaXh1cC4KLSAqLwotCi1zdGF0aWMgdm9pZAotYXNzZW1ibGVfaW5zbihvcGNvZGUsIHRvaywgbnRvaywgaW5zbikKLSAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlOwotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgc3RydWN0IGFscGhhX2luc24gKmluc247Ci17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFyZ2lkeDsKLSAgdW5zaWduZWQgaW1hZ2U7Ci0gIGludCB0b2tpZHggPSAwOwotCi0gIG1lbXNldCAoaW5zbiwgMCwgc2l6ZW9mICgqaW5zbikpOwotICBpbWFnZSA9IG9wY29kZS0+b3Bjb2RlOwotCi0gIGZvciAoYXJnaWR4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKmFyZ2lkeDsgKythcmdpZHgpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQgPSAmYWxwaGFfb3BlcmFuZHNbKmFyZ2lkeF07Ci0gICAgICBjb25zdCBleHByZXNzaW9uUyAqdCA9IChjb25zdCBleHByZXNzaW9uUyAqKTA7Ci0KLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX0ZBS0UpCi0JewotCSAgLyogZmFrZSBvcGVyYW5kcyB0YWtlIG5vIHZhbHVlIGFuZCBnZW5lcmF0ZSBubyBmaXh1cCAqLwotCSAgaW1hZ2UgPSBpbnNlcnRfb3BlcmFuZChpbWFnZSwgb3BlcmFuZCwgMCwgTlVMTCwgMCk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICh0b2tpZHggPj0gbnRvaykKLQl7Ci0JICBzd2l0Y2ggKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfT1BUSU9OQUxfTUFTSykKLQkgICAgewotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0RFRkFVTFRfRklSU1Q6Ci0JICAgICAgdCA9ICZ0b2tbMF07Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfREVGQVVMVF9TRUNPTkQ6Ci0JICAgICAgdCA9ICZ0b2tbMV07Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfREVGQVVMVF9aRVJPOgotCSAgICAgIHsKLQkJc3RhdGljIGV4cHJlc3Npb25TIHplcm9fZXhwOwotCQl0ID0gJnplcm9fZXhwOwotCQl6ZXJvX2V4cC5YX29wID0gT19jb25zdGFudDsKLQkJemVyb19leHAuWF91bnNpZ25lZCA9IDE7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0KCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JdCA9ICZ0b2tbdG9raWR4KytdOwotCi0gICAgICBzd2l0Y2ggKHQtPlhfb3ApCi0JewotCWNhc2UgT19yZWdpc3RlcjoKLQljYXNlIE9fcHJlZ2lzdGVyOgotCWNhc2UgT19jcHJlZ2lzdGVyOgotCSAgaW1hZ2UgPSBpbnNlcnRfb3BlcmFuZChpbWFnZSwgb3BlcmFuZCwgcmVnbm8odC0+WF9hZGRfbnVtYmVyKSwKLQkJCQkgTlVMTCwgMCk7Ci0JICBicmVhazsKLQotCWNhc2UgT19jb25zdGFudDoKLQkgIGltYWdlID0gaW5zZXJ0X29wZXJhbmQoaW1hZ2UsIG9wZXJhbmQsIHQtPlhfYWRkX251bWJlciwgTlVMTCwgMCk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICB7Ci0JICAgIHN0cnVjdCBhbHBoYV9maXh1cCAqZml4dXA7Ci0KLQkgICAgaWYgKGluc24tPm5maXh1cHMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICAgIGFzX2ZhdGFsKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQotCSAgICBmaXh1cCA9ICZpbnNuLT5maXh1cHNbaW5zbi0+bmZpeHVwcysrXTsKLQotCSAgICBmaXh1cC0+ZXhwID0gKnQ7Ci0JICAgIGZpeHVwLT5yZWxvYyA9IG9wZXJhbmQtPmRlZmF1bHRfcmVsb2M7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGluc24tPmluc24gPSBpbWFnZTsKLX0KLQotLyoKLSAqIEFjdHVhbGx5IG91dHB1dCBhbiBpbnN0cnVjdGlvbiB3aXRoIGl0cyBmaXh1cC4KLSAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9pbnNuIChpbnNuKQotICAgIHN0cnVjdCBhbHBoYV9pbnNuICppbnNuOwotewotICBjaGFyICpmOwotICBpbnQgaTsKLQotICAvKiBUYWtlIGNhcmUgb2YgYWxpZ25tZW50IGR1dGllcyAqLwotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgMikKLSAgICBhbHBoYV9hbGlnbiAoMiwgKGNoYXIgKikgTlVMTCwgYWxwaGFfaW5zbl9sYWJlbCwgMCk7Ci0gIGlmIChhbHBoYV9jdXJyZW50X2FsaWduID4gMikKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gMjsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGYgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24tPmluc24sIDQpOwotCi0gIC8qIEFwcGx5IHRoZSBmaXh1cHMgaW4gb3JkZXIgKi8KLSAgZm9yIChpID0gMDsgaSA8IGluc24tPm5maXh1cHM7ICsraSkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZCA9IChjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqKTA7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZml4dXAgKmZpeHVwID0gJmluc24tPmZpeHVwc1tpXTsKLSAgICAgIGludCBzaXplLCBwY3JlbDsKLSAgICAgIGZpeFMgKmZpeFA7Ci0jaWZkZWYgUkVMT0NfT1BfUAotICAgICAgY2hhciBidWZmZXJbQUxQSEFfUkVMT0NfRElHSVRTXTsKLSAgICAgIHN0cnVjdCBhbHBoYV9saXRlcmFsX3RhZyAqaW5mbzsKLSNlbmRpZgotCi0gICAgICAvKiBTb21lIGZpeHVwcyBhcmUgb25seSB1c2VkIGludGVybmFsbHkgYW5kIHNvIGhhdmUgbm8gaG93dG8gKi8KLSAgICAgIGlmICgoaW50KWZpeHVwLT5yZWxvYyA8IDApCi0JewotCSAgb3BlcmFuZCA9ICZhbHBoYV9vcGVyYW5kc1stKGludClmaXh1cC0+cmVsb2NdOwotCSAgc2l6ZSA9IDQ7Ci0JICBwY3JlbCA9ICgob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9SRUxBVElWRSkgIT0gMCk7Ci0JfQotICAgICAgZWxzZSBzd2l0Y2ggKGZpeHVwLT5yZWxvYykKLQl7Ci0jaWZkZWYgT0JKX0VMRgotCSAgLyogVGhlc2UgcmVsb2NhdGlvbiB0eXBlcyBhcmUgb25seSB1c2VkIGludGVybmFsbHkuICovCi0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY6Ci0JICBzaXplID0gMjsKLQkgIHBjcmVsID0gMDsKLQkgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgUkVMT0NfT1BfUAotCSAgLyogYW5kIHRoZXNlIGFsc28gYXJlIGludGVybmFsIG9ubHkgcmVsb2NhdGlvbnMgKi8KLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUw6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfQkFTRToKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CWVRPRkY6Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfVVNFUl9MSVRVU0VfSlNSOgotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BESVNQOgotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxISUdIOgotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfR1BSRUxMT1c6Ci0JICBzaXplID0gMjsKLQkgIHBjcmVsID0gMDsKLQkgIGJyZWFrOwotI2VuZGlmCi0KLQlkZWZhdWx0OgotCSAgewotCSAgICByZWxvY19ob3d0b190eXBlICpyZWxvY19ob3d0bwotCSAgICAgID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHVwLT5yZWxvYyk7Ci0JICAgIGFzc2VydCAocmVsb2NfaG93dG8pOwotCi0JICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQkgICAgcGNyZWwgPSByZWxvY19ob3d0by0+cGNfcmVsYXRpdmU7Ci0JICB9Ci0JICBhc3NlcnQgKHNpemUgPj0gMSAmJiBzaXplIDw9IDQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIHNpemUsCi0JCQkgICZmaXh1cC0+ZXhwLCBwY3JlbCwgZml4dXAtPnJlbG9jKTsKLQotICAgICAgLyogVHVybiBvZmYgY29tcGxhaW50cyB0aGF0IHRoZSBhZGRlbmQgaXMgdG9vIGxhcmdlIGZvciBzb21lIGZpeHVwcywKLSAgICAgICAgIGFuZCBjb3B5IGluIHRoZSBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoZSBleHBsaWNpdCByZWxvY2F0aW9ucy4gICovCi0gICAgICBzd2l0Y2ggKGZpeHVwLT5yZWxvYykKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY6Ci0jaWZkZWYgT0JKX0VDT0ZGCi0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDoKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTDoKLSNlbmRpZgotCWNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6Ci0JICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDE7Ci0JICBicmVhazsKLQotI2lmZGVmIFJFTE9DX09QX1AKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVEVSQUw6Ci0JICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDE7Ci0JICBzcHJpbnRmIChidWZmZXIsICIhJXUiLCBpbnNuLT5zZXF1ZW5jZVtpXSk7Ci0JICBpbmZvID0gKChzdHJ1Y3QgYWxwaGFfbGl0ZXJhbF90YWcgKikKLQkJICBoYXNoX2ZpbmQgKGFscGhhX2xpdGVyYWxfaGFzaCwgYnVmZmVyKSk7Ci0KLQkgIGlmICghIGluZm8pCi0JICAgIHsKLQkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChidWZmZXIpOwotCSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotCSAgICAgIGluZm8gPSAoKHN0cnVjdCBhbHBoYV9saXRlcmFsX3RhZyAqKQotCQkgICAgICB4Y2FsbG9jIChzaXplb2YgKHN0cnVjdCBhbHBoYV9saXRlcmFsX3RhZykgKyBsZW4sIDEpKTsKLQotCSAgICAgIGluZm8tPnNlZ21lbnQgPSBub3dfc2VnOwotCSAgICAgIGluZm8tPnNlcXVlbmNlID0gaW5zbi0+c2VxdWVuY2VbaV07Ci0JICAgICAgc3RyY3B5IChpbmZvLT5zdHJpbmcsIGJ1ZmZlcik7Ci0JICAgICAgZXJybXNnID0gaGFzaF9pbnNlcnQgKGFscGhhX2xpdGVyYWxfaGFzaCwgaW5mby0+c3RyaW5nLCAoUFRSKWluZm8pOwotCSAgICAgIGlmIChlcnJtc2cpCi0JCWFzX2JhZCAoZXJybXNnKTsKLQkgICAgfQotCi0JICArK2luZm8tPm5fbGl0ZXJhbHM7Ci0KLQkgIGlmIChpbmZvLT5zZWdtZW50ICE9IG5vd19zZWcpCi0JICAgIGluZm8tPm11bHRpX3NlY3Rpb25fcCA9IDE7Ci0KLQkgIGZpeFAtPnRjX2ZpeF9kYXRhLmluZm8gPSBpbmZvOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9CQVNFOgotCWNhc2UgQkZEX1JFTE9DX0FMUEhBX1VTRVJfTElUVVNFX0JZVE9GRjoKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9VU0VSX0xJVFVTRV9KU1I6Ci0JICBzcHJpbnRmIChidWZmZXIsICIhJXUiLCBpbnNuLT5zZXF1ZW5jZVtpXSk7Ci0JICBpbmZvID0gKChzdHJ1Y3QgYWxwaGFfbGl0ZXJhbF90YWcgKikKLQkJICBoYXNoX2ZpbmQgKGFscGhhX2xpdGVyYWxfaGFzaCwgYnVmZmVyKSk7Ci0KLQkgIGlmICghIGluZm8pCi0JICAgIHsKLQkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChidWZmZXIpOwotCSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotCSAgICAgIGluZm8gPSAoKHN0cnVjdCBhbHBoYV9saXRlcmFsX3RhZyAqKQotCQkgICAgICB4Y2FsbG9jIChzaXplb2YgKHN0cnVjdCBhbHBoYV9saXRlcmFsX3RhZykgKyBsZW4sIDEpKTsKLQotCSAgICAgIGluZm8tPnNlZ21lbnQgPSBub3dfc2VnOwotCSAgICAgIGluZm8tPnNlcXVlbmNlID0gaW5zbi0+c2VxdWVuY2VbaV07Ci0JICAgICAgc3RyY3B5IChpbmZvLT5zdHJpbmcsIGJ1ZmZlcik7Ci0JICAgICAgZXJybXNnID0gaGFzaF9pbnNlcnQgKGFscGhhX2xpdGVyYWxfaGFzaCwgaW5mby0+c3RyaW5nLCAoUFRSKWluZm8pOwotCSAgICAgIGlmIChlcnJtc2cpCi0JCWFzX2JhZCAoZXJybXNnKTsKLQkgICAgfQotCSAgaW5mby0+bl9saXR1c2VzKys7Ci0JICBmaXhQLT50Y19maXhfZGF0YS5pbmZvID0gaW5mbzsKLQkgIGZpeFAtPnRjX2ZpeF9kYXRhLm5leHRfbGl0dXNlID0gaW5mby0+bGl0dXNlOwotCSAgaW5mby0+bGl0dXNlID0gZml4UDsKLQkgIGlmIChpbmZvLT5zZWdtZW50ICE9IG5vd19zZWcpCi0JICAgIGluZm8tPm11bHRpX3NlY3Rpb25fcCA9IDE7Ci0KLQkgIGJyZWFrOwotI2VuZGlmCi0KLQlkZWZhdWx0OgotCSAgaWYgKChpbnQpZml4dXAtPnJlbG9jIDwgMCkKLQkgICAgewotCSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX05PT1ZFUkZMT1cpCi0JCWZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotLyogR2l2ZW4gYW4gb3Bjb2RlIG5hbWUgYW5kIGEgcHJlLXRva2VuaXplZCBzZXQgb2YgYXJndW1lbnRzLCBhc3NlbWJsZQotICAgdGhlIGluc24sIGJ1dCBkbyBub3QgZW1pdCBpdC4KLQotICAgTm90ZSB0aGF0IHRoaXMgaW1wbGllcyBubyBtYWNyb3MgYWxsb3dlZCwgc2luY2Ugd2UgY2FuJ3Qgc3RvcmUgbW9yZQotICAgdGhhbiBvbmUgaW5zbiBpbiBhbiBpbnNuIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1hc3NlbWJsZV90b2tlbnNfdG9faW5zbihvcG5hbWUsIHRvaywgbnRvaywgaW5zbikKLSAgICAgY29uc3QgY2hhciAqb3BuYW1lOwotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgc3RydWN0IGFscGhhX2luc24gKmluc247Ci17Ci0gIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKm9wY29kZTsKLQotICAvKiBzZWFyY2ggb3Bjb2RlcyAqLwotICBvcGNvZGUgPSAoY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqKSBoYXNoX2ZpbmQgKGFscGhhX29wY29kZV9oYXNoLCBvcG5hbWUpOwotICBpZiAob3Bjb2RlKQotICAgIHsKLSAgICAgIGludCBjcHVtYXRjaDsKLSAgICAgIG9wY29kZSA9IGZpbmRfb3Bjb2RlX21hdGNoIChvcGNvZGUsIHRvaywgJm50b2ssICZjcHVtYXRjaCk7Ci0gICAgICBpZiAob3Bjb2RlKQotCXsKLQkgIGFzc2VtYmxlX2luc24gKG9wY29kZSwgdG9rLCBudG9rLCBpbnNuKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChjcHVtYXRjaCkKLQlhc19iYWQgKF8oImluYXBwcm9wcmlhdGUgYXJndW1lbnRzIGZvciBvcGNvZGUgYCVzJyIpLCBvcG5hbWUpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygib3Bjb2RlIGAlcycgbm90IHN1cHBvcnRlZCBmb3IgdGFyZ2V0ICVzIiksIG9wbmFtZSwKLQkgICAgICAgIGFscGhhX3RhcmdldF9uYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIGAlcyciKSwgb3BuYW1lKTsKLX0KLQotLyogR2l2ZW4gYW4gb3Bjb2RlIG5hbWUgYW5kIGEgcHJlLXRva2VuaXplZCBzZXQgb2YgYXJndW1lbnRzLCB0YWtlIHRoZQotICAgb3Bjb2RlIGFsbCB0aGUgd2F5IHRocm91Z2ggZW1pc3Npb24uICAqLwotCi1zdGF0aWMgdm9pZAotYXNzZW1ibGVfdG9rZW5zIChvcG5hbWUsIHRvaywgbnRvaywgbG9jYWxfbWFjcm9zX29uKQotICAgICBjb25zdCBjaGFyICpvcG5hbWU7Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBpbnQgbG9jYWxfbWFjcm9zX29uOwotewotICBpbnQgZm91bmRfc29tZXRoaW5nID0gMDsKLSAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlOwotICBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKm1hY3JvOwotICBpbnQgY3B1bWF0Y2ggPSAxOwotCi0gIC8qIHNlYXJjaCBtYWNyb3MgKi8KLSAgaWYgKGxvY2FsX21hY3Jvc19vbikKLSAgICB7Ci0gICAgICBtYWNybyA9ICgoY29uc3Qgc3RydWN0IGFscGhhX21hY3JvICopCi0JICAgICAgIGhhc2hfZmluZCAoYWxwaGFfbWFjcm9faGFzaCwgb3BuYW1lKSk7Ci0gICAgICBpZiAobWFjcm8pCi0JewotCSAgZm91bmRfc29tZXRoaW5nID0gMTsKLQkgIG1hY3JvID0gZmluZF9tYWNyb19tYXRjaCAobWFjcm8sIHRvaywgJm50b2spOwotCSAgaWYgKG1hY3JvKQotCSAgICB7Ci0JICAgICAgKCptYWNyby0+ZW1pdCkgKHRvaywgbnRvaywgbWFjcm8tPmFyZyk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgaWYgKG50b2sgJiYgVVNFUl9SRUxPQ19QICh0b2tbbnRvay0xXS5YX29wKSkKLSAgICB7Ci0gICAgICBjb25zdCBleHByZXNzaW9uUyAqcmVsb2NfZXhwID0gJnRva1tudG9rLTFdOwotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX3JlbG9jX29wX3RhZyAqciA9IEFMUEhBX1JFTE9DX1RBQkxFIChyZWxvY19leHAtPlhfb3ApOwotICAgICAgYXNfYmFkIChfKCJDYW5ub3QgdXNlICElcyElZCB3aXRoICVzIiksIHItPm5hbWUsCi0JICAgICAgKGludClyZWxvY19leHAtPlhfYWRkX251bWJlciwgb3BuYW1lKTsKLSAgICAgIG50b2stLTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBzZWFyY2ggb3Bjb2RlcyAqLwotICBvcGNvZGUgPSAoY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqKSBoYXNoX2ZpbmQgKGFscGhhX29wY29kZV9oYXNoLCBvcG5hbWUpOwotICBpZiAob3Bjb2RlKQotICAgIHsKLSAgICAgIGZvdW5kX3NvbWV0aGluZyA9IDE7Ci0gICAgICBvcGNvZGUgPSBmaW5kX29wY29kZV9tYXRjaCAob3Bjb2RlLCB0b2ssICZudG9rLCAmY3B1bWF0Y2gpOwotICAgICAgaWYgKG9wY29kZSkKLQl7Ci0JICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotCSAgYXNzZW1ibGVfaW5zbiAob3Bjb2RlLCB0b2ssIG50b2ssICZpbnNuKTsKLQkgIGVtaXRfaW5zbiAoJmluc24pOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZvdW5kX3NvbWV0aGluZykKLSAgICBpZiAoY3B1bWF0Y2gpCi0gICAgICBhc19iYWQgKF8oImluYXBwcm9wcmlhdGUgYXJndW1lbnRzIGZvciBvcGNvZGUgYCVzJyIpLCBvcG5hbWUpOwotICAgIGVsc2UKLSAgICAgIGFzX2JhZCAoXygib3Bjb2RlIGAlcycgbm90IHN1cHBvcnRlZCBmb3IgdGFyZ2V0ICVzIiksIG9wbmFtZSwKLQkgICAgICBhbHBoYV90YXJnZXRfbmFtZSk7Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIGAlcyciKSwgb3BuYW1lKTsKLX0KLQotDAotLyogU29tZSBpbnN0cnVjdGlvbiBzZXRzIGluZGV4ZWQgYnkgbGcoc2l6ZSkgKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2V4dFhfb3BbXSA9IHsgInNleHRiIiwgInNleHR3IiwgInNleHRsIiwgTlVMTCB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbnNYbF9vcFtdID0geyAiaW5zYmwiLCAiaW5zd2wiLCAiaW5zbGwiLCAiaW5zcWwiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGluc1hoX29wW10gPSB7IE5VTEwsICAgICJpbnN3aCIsICJpbnNsaCIsICJpbnNxaCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0WGxfb3BbXSA9IHsgImV4dGJsIiwgImV4dHdsIiwgImV4dGxsIiwgImV4dHFsIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRYaF9vcFtdID0geyBOVUxMLCAgICAiZXh0d2giLCAiZXh0bGgiLCAiZXh0cWgiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1za1hsX29wW10gPSB7ICJtc2tibCIsICJtc2t3bCIsICJtc2tsbCIsICJtc2txbCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNrWGhfb3BbXSA9IHsgTlVMTCwgICAgIm1za3doIiwgIm1za2xoIiwgIm1za3FoIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdFhfb3BbXSA9IHsgInN0YiIsICJzdHciLCAic3RsIiwgInN0cSIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGRYX29wW10gPSB7ICJsZGIiLCAibGR3IiwgImxkbGwiLCAibGRxIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsZFh1X29wW10gPSB7ICJsZGJ1IiwgImxkd3UiLCBOVUxMLCBOVUxMIH07Ci0KLS8qIEltcGxlbWVudCB0aGUgbGRncCBtYWNyby4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2xkZ3AgKHRvaywgbnRvaywgdW51c2VkKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvayBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBQVFIgdW51c2VkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgT0JKX0FPVVQKLUZJWE1FCi0jZW5kaWYKLSNpZiBkZWZpbmVkKE9CSl9FQ09GRikgfHwgZGVmaW5lZChPQkpfRUxGKQotICAvKiBmcm9tICJsZGdwIHIxLG4ocjIpIiwgZ2VuZXJhdGUgImxkYWggcjEsWChSMik7IGxkYSByMSxZKHIxKSIKLSAgICAgd2l0aCBhcHByb3ByaWF0ZSBjb25zdGFudHMgYW5kIHJlbG9jYXRpb25zLiAgKi8KLSAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotICBleHByZXNzaW9uUyBhZGRlbmQ7Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0gICAgewotICAgICAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jX2V4cCA9ICZ0b2tbbnRvay0xXTsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnIgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2NfZXhwLT5YX29wKTsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCSAgICAgIChpbnQpcmVsb2NfZXhwLT5YX2FkZF9udW1iZXIsICJsZGdwIik7Ci0gICAgICBudG9rLS07Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgaWYgKHJlZ25vICh0b2tbMl0uWF9hZGRfbnVtYmVyKSA9PSBBWFBfUkVHX1BWKQotICAgIGVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSAoMCk7Ci0jZW5kaWYKLQotICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gIG5ld3Rva1syXSA9IHRva1syXTsKLQotICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkYWgiLCBuZXd0b2ssIDMsICZpbnNuKTsKLQotICBhZGRlbmQgPSB0b2tbMV07Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgaWYgKGFkZGVuZC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgYXNfYmFkIChfKCJjYW4gbm90IHJlc29sdmUgZXhwcmVzc2lvbiIpKTsKLSAgYWRkZW5kLlhfb3AgPSBPX3N5bWJvbDsKLSAgYWRkZW5kLlhfYWRkX3N5bWJvbCA9IGFscGhhX2dwX3N5bWJvbDsKLSNlbmRpZgotCi0gIGluc24ubmZpeHVwcyA9IDE7Ci0gIGluc24uZml4dXBzWzBdLmV4cCA9IGFkZGVuZDsKLSAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY7Ci0KLSAgZW1pdF9pbnNuICgmaW5zbik7Ci0KLSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIHRva1swXS5YX2FkZF9udW1iZXIpOwotCi0gIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRhIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgYWRkZW5kLlhfYWRkX251bWJlciArPSA0OwotI2VuZGlmCi0KLSAgaW5zbi5uZml4dXBzID0gMTsKLSAgaW5zbi5maXh1cHNbMF0uZXhwID0gYWRkZW5kOwotICBpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjsKLQotICBlbWl0X2luc24gKCZpbnNuKTsKLSNlbmRpZiAvKiBPQkpfRUNPRkYgfHwgT0JKX0VMRiAqLwotfQotCi0jaWZkZWYgT0JKX0VWQVgKLQotLyogQWRkIHN5bWJvbCthZGRlbmQgdG8gbGluayBwb29sLgotICAgUmV0dXJuIG9mZnNldCBmcm9tIGJhc2VzeW0gdG8gZW50cnkgaW4gbGluayBwb29sLgotCi0gICBBZGQgbmV3IGZpeHVwIG9ubHkgaWYgb2Zmc2V0IGlzbid0IDE2Yml0LiAgKi8KLQotdmFsdWVUCi1hZGRfdG9fbGlua19wb29sIChiYXNlc3ltLCBzeW0sIGFkZGVuZCkKLSAgICAgc3ltYm9sUyAqYmFzZXN5bTsKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBvZmZzZXRUIGFkZGVuZDsKLXsKLSAgc2VnVCBjdXJyZW50X3NlY3Rpb24gPSBub3dfc2VnOwotICBpbnQgY3VycmVudF9zdWJzZWMgPSBub3dfc3Vic2VnOwotICB2YWx1ZVQgb2Zmc2V0OwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2NfdHlwZTsKLSAgY2hhciAqcDsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoYWxwaGFfbGlua19zZWN0aW9uKTsKLSAgZml4UyAqZml4cDsKLQotICBvZmZzZXQgPSAtICpzeW1ib2xfZ2V0X29iaiAoYmFzZXN5bSk7Ci0KLSAgLyogQEAgVGhpcyBhc3N1bWVzIGFsbCBlbnRyaWVzIGluIGEgZ2l2ZW4gc2VjdGlvbiB3aWxsIGJlIG9mIHRoZSBzYW1lCi0gICAgIHNpemUuLi4gIFByb2JhYmx5IGNvcnJlY3QsIGJ1dCB1bndpc2UgdG8gcmVseSBvbi4gICovCi0gIC8qIFRoaXMgbXVzdCBhbHdheXMgYmUgY2FsbGVkIHdpdGggdGhlIHNhbWUgc3Vic2VnbWVudC4gICovCi0KLSAgaWYgKHNlZ2luZm8tPmZyY2hhaW5QKQotICAgIGZvciAoZml4cCA9IHNlZ2luZm8tPmZyY2hhaW5QLT5maXhfcm9vdDsKLQkgZml4cCAhPSAoZml4UyAqKSBOVUxMOwotCSBmaXhwID0gZml4cC0+ZnhfbmV4dCwgb2Zmc2V0ICs9IDgpCi0gICAgICB7Ci0JaWYgKGZpeHAtPmZ4X2FkZHN5ID09IHN5bSAmJiBmaXhwLT5meF9vZmZzZXQgPT0gYWRkZW5kKQotCSAgewotCSAgICBpZiAocmFuZ2Vfc2lnbmVkXzE2IChvZmZzZXQpKQotCSAgICAgIHsKLQkgICAgICAgIHJldHVybiBvZmZzZXQ7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotCi0gIC8qIE5vdCBmb3VuZCBpbiAxNmJpdCBzaWduZWQgcmFuZ2UuICAqLwotCi0gIHN1YnNlZ19zZXQgKGFscGhhX2xpbmtfc2VjdGlvbiwgMCk7Ci0gIHAgPSBmcmFnX21vcmUgKDgpOwotICBtZW1zZXQgKHAsIDAsIDgpOwotCi0gIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDgsIHN5bSwgYWRkZW5kLCAwLAotCSAgIEJGRF9SRUxPQ182NCk7Ci0KLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWN0aW9uLCBjdXJyZW50X3N1YnNlYyk7Ci0gIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IDg7Ci0gIHJldHVybiBvZmZzZXQ7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfRVZBWCAqLwotCi0vKiBMb2FkIGEgKHBhcnRpYWwpIGV4cHJlc3Npb24gaW50byBhIHRhcmdldCByZWdpc3Rlci4KLQotICAgSWYgcG9mZnNldCBpcyBub3QgbnVsbCwgYWZ0ZXIgdGhlIGNhbGwgaXQgd2lsbCBlaXRoZXIgY29udGFpbgotICAgT19jb25zdGFudCAwLCBvciBhIDE2LWJpdCBvZmZzZXQgYXBwcm9wcmlhdGUgZm9yIGFueSBNRU0gZm9ybWF0Ci0gICBpbnN0cnVjdGlvbi4gIEluIGFkZGl0aW9uLCBwYmFzZXJlZyB3aWxsIGJlIG1vZGlmaWVkIHRvIHBvaW50IHRvCi0gICB0aGUgYmFzZSByZWdpc3RlciB0byB1c2UgaW4gdGhhdCBNRU0gZm9ybWF0IGluc3RydWN0aW9uLgotCi0gICBJbiBhbnkgY2FzZSwgKnBiYXNlcmVnIHNob3VsZCBjb250YWluIGEgYmFzZSByZWdpc3RlciB0byBhZGQgdG8gdGhlCi0gICBleHByZXNzaW9uLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGVpdGhlciBBWFBfUkVHX1pFUk8gb3IKLSAgIGFscGhhX2dwX3JlZ2lzdGVyLiAgU3ltYm9sIGFkZHJlc3NlcyB3aWxsIGFsd2F5cyBiZSBsb2FkZWQgdmlhICRncCwKLSAgIHNvICJmb28oJDApIiBpcyBpbnRlcnByZXRlZCBhcyBhZGRpbmcgdGhlIGFkZHJlc3Mgb2YgZm9vIHRvICQwOwotICAgaS5lLiAibGRxICR0YXJnLCBMSVQoJGdwKTsgYWRkcSAkdGFyZywgJDAsICR0YXJnIi4gIE9kZCwgcGVyaGFwcywKLSAgIGJ1dCB0aGlzIGlzIHdoYXQgT1NGLzEgZG9lcy4KLQotICAgSWYgZXhwbGljaXQgcmVsb2NhdGlvbnMgb2YgdGhlIGZvcm0gIWxpdGVyYWwhPG51bWJlcj4gYXJlIGFsbG93ZWQsCi0gICBhbmQgdXNlZCwgdGhlbiBleHBsaWN0X3JlbG9jIHdpdGggYmUgYW4gZXhwcmVzc2lvbiBwb2ludGVyLgotCi0gICBGaW5hbGx5LCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRydWUgaWYgdGhlIGNhbGxpbmcgbWFjcm8gbWF5IGVtaXQgYQotICAgTElUVVNFIHJlbG9jIGlmIG90aGVyd2lzZSBhcHByb3ByaWF0ZS4gICovCi0KLXN0YXRpYyBpbnQKLWxvYWRfZXhwcmVzc2lvbiAodGFyZ3JlZywgZXhwLCBwYmFzZXJlZywgcG9mZnNldCwgZXhwbGljaXRfcmVsb2MpCi0gICAgIGludCB0YXJncmVnOwotICAgICBjb25zdCBleHByZXNzaW9uUyAqZXhwOwotICAgICBpbnQgKnBiYXNlcmVnOwotICAgICBleHByZXNzaW9uUyAqcG9mZnNldDsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKmV4cGxpY2l0X3JlbG9jOwotewotICBpbnQgZW1pdF9saXR1c2UgPSAwOwotICBvZmZzZXRUIGFkZGVuZCA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICBpbnQgYmFzZXJlZyA9ICpwYmFzZXJlZzsKLSAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gIHN3aXRjaCAoZXhwLT5YX29wKQotICAgIHsKLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgewotI2lmZGVmIE9CSl9FQ09GRgotCW9mZnNldFQgbGl0OwotCi0JLyogYXR0ZW1wdCB0byByZWR1Y2UgLmxpdCBsb2FkIGJ5IHNwbGl0dGluZyB0aGUgb2Zmc2V0IGZyb20KLQkgICBpdHMgc3ltYm9sIHdoZW4gcG9zc2libGUsIGJ1dCBkb24ndCBjcmVhdGUgYSBzaXR1YXRpb24gaW4KLQkgICB3aGljaCB3ZSdkIGZhaWwuICAqLwotCWlmICghcmFuZ2Vfc2lnbmVkXzMyIChhZGRlbmQpICYmCi0JICAgIChhbHBoYV9ub2F0X29uIHx8IHRhcmdyZWcgPT0gQVhQX1JFR19BVCkpCi0JICB7Ci0JICAgIGxpdCA9IGFkZF90b19saXRlcmFsX3Bvb2wgKGV4cC0+WF9hZGRfc3ltYm9sLCBhZGRlbmQsCi0JCQkJICAgICAgIGFscGhhX2xpdGFfc2VjdGlvbiwgOCk7Ci0JICAgIGFkZGVuZCA9IDA7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBsaXQgPSBhZGRfdG9fbGl0ZXJhbF9wb29sIChleHAtPlhfYWRkX3N5bWJvbCwgMCwKLQkJCQkgICAgICAgYWxwaGFfbGl0YV9zZWN0aW9uLCA4KTsKLQkgIH0KLQotCWlmIChsaXQgPj0gMHg4MDAwKQotCSAgYXNfZmF0YWwgKF8oIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXRhKSB0YWJsZSIpKTsKLQotCS8qIGVtaXQgImxkcSByLCBsaXQoZ3ApIiAqLwotCi0JaWYgKGJhc2VyZWcgIT0gYWxwaGFfZ3BfcmVnaXN0ZXIgJiYgdGFyZ3JlZyA9PSBiYXNlcmVnKQotCSAgewotCSAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQkgICAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQkgICAgaWYgKHRhcmdyZWcgPT0gQVhQX1JFR19BVCkKLQkgICAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCB3aGlsZSAkYXQgaW4gdXNlIikpOwotCi0JICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotCSAgfQotCWVsc2UKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotCXNldF90b2tfc3ltIChuZXd0b2tbMV0sIGFscGhhX2xpdGFfc3ltYm9sLCBsaXQpOwotCXNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0KLQlhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOwotCi0JYXNzZXJ0IChleHBsaWNpdF9yZWxvYyA9PSAoY29uc3QgZXhwcmVzc2lvblMgKikwKTsKLQlhc3NlcnQgKGluc24ubmZpeHVwcyA9PSAxKTsKLQlpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOwotI2VuZGlmIC8qIE9CSl9FQ09GRiAqLwotI2lmZGVmIE9CSl9FTEYKLQkvKiBlbWl0ICJsZHEgciwgZ290b2ZmKGdwKSIgKi8KLQotCWlmIChiYXNlcmVnICE9IGFscGhhX2dwX3JlZ2lzdGVyICYmIHRhcmdyZWcgPT0gYmFzZXJlZykKLQkgIHsKLQkgICAgaWYgKGFscGhhX25vYXRfb24pCi0JICAgICAgYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0JICAgIGlmICh0YXJncmVnID09IEFYUF9SRUdfQVQpCi0JICAgICAgYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgd2hpbGUgJGF0IGluIHVzZSIpKTsKLQotCSAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLQkgIH0KLQllbHNlCi0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLQotCS8qIFhYWDogRGlzYWJsZSB0aGlzIC5nb3QgbWluaW1pemluZyBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBjYW4gZ2V0Ci0JICAgYmV0dGVyIGluc3RydWN0aW9uIG9mZnNldCBrbm93bGVkZ2UgaW4gdGhlIGNvbXBpbGVyLiAgVGhpcyBoYXBwZW5zCi0JICAgdmVyeSBpbmZyZXF1ZW50bHkgYW55d2F5LiAgKi8KLQlpZiAoMSB8fCAoIXJhbmdlX3NpZ25lZF8zMiAoYWRkZW5kKQotCSAgICAmJiAoYWxwaGFfbm9hdF9vbiB8fCB0YXJncmVnID09IEFYUF9SRUdfQVQpKSkKLQkgIHsKLQkgICAgbmV3dG9rWzFdID0gKmV4cDsKLQkgICAgYWRkZW5kID0gMDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIGV4cC0+WF9hZGRfc3ltYm9sLCAwKTsKLQkgIH0KLQotCXNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0KLQlhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOwotCi0JYXNzZXJ0IChpbnNuLm5maXh1cHMgPT0gMSk7Ci0JaWYgKCFleHBsaWNpdF9yZWxvYykKLQkgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOwotCWVsc2UKLQkgIHsKLSNpZmRlZiBSRUxPQ19PUF9QCi0JICAgIGluc24uZml4dXBzWzBdLnJlbG9jCi0JICAgICAgPSAoQUxQSEFfUkVMT0NfVEFCTEUgKGV4cGxpY2l0X3JlbG9jLT5YX29wKSktPnJlbG9jOwotCSAgICBpbnNuLnNlcXVlbmNlWzBdID0gZXhwbGljaXRfcmVsb2MtPlhfYWRkX251bWJlcjsKLSNlbHNlCi0JICAgIGFib3J0ICgpOwotI2VuZGlmCi0JICB9Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotI2lmZGVmIE9CSl9FVkFYCi0Jb2Zmc2V0VCBsaW5rOwotCi0JLyogRmluZCBzeW1ib2wgb3Igc3ltYm9sIHBvaW50ZXIgaW4gbGluayBzZWN0aW9uLiAgKi8KLQotCWFzc2VydCAoZXhwbGljaXRfcmVsb2MgPT0gKGNvbnN0IGV4cHJlc3Npb25TICopMCk7Ci0JaWYgKGV4cC0+WF9hZGRfc3ltYm9sID09IGFscGhhX2V2YXhfcHJvYy5zeW1ib2wpCi0JICB7Ci0JICAgIGlmIChyYW5nZV9zaWduZWRfMTYgKGFkZGVuZCkpCi0JICAgICAgewotCQlzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLQkJc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBhZGRlbmQpOwotCQlzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0JCWFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRhIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0JCWFkZGVuZCA9IDA7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLQkJc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLQkJc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCQlhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkYSIsIG5ld3RvaywgMywgJmluc24pOwotCSAgICAgIH0KLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmICghcmFuZ2Vfc2lnbmVkXzMyIChhZGRlbmQpKQotCSAgICAgIHsKLQkJbGluayA9IGFkZF90b19saW5rX3Bvb2wgKGFscGhhX2V2YXhfcHJvYy5zeW1ib2wsCi0JCQkJCSBleHAtPlhfYWRkX3N5bWJvbCwgYWRkZW5kKTsKLQkJYWRkZW5kID0gMDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWxpbmsgPSBhZGRfdG9fbGlua19wb29sIChhbHBoYV9ldmF4X3Byb2Muc3ltYm9sLAotCQkJCQkgZXhwLT5YX2FkZF9zeW1ib2wsIDApOwotCSAgICAgIH0KLQkgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0JICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgbGluayk7Ci0JICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKLQkgICAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKCJsZHEiLCBuZXd0b2ssIDMsICZpbnNuKTsKLQkgIH0KLSNlbmRpZiAvKiBPQkpfRVZBWCAqLwotCi0JZW1pdF9pbnNuKCZpbnNuKTsKLQotI2lmbmRlZiBPQkpfRVZBWAotCWVtaXRfbGl0dXNlID0gMTsKLQotCWlmIChiYXNlcmVnICE9IGFscGhhX2dwX3JlZ2lzdGVyICYmIGJhc2VyZWcgIT0gQVhQX1JFR19aRVJPKQotCSAgewotCSAgICAvKiBlbWl0ICJhZGRxIHIsIGJhc2UsIHIiICovCi0KLQkgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgYmFzZXJlZyk7Ci0JICAgIHNldF90b2tfcmVnIChuZXd0b2tbMl0sIHRhcmdyZWcpOwotCSAgICBhc3NlbWJsZV90b2tlbnMgKCJhZGRxIiwgbmV3dG9rLCAzLCAwKTsKLQkgIH0KLSNlbmRpZgotCi0JYmFzZXJlZyA9IHRhcmdyZWc7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIGFzc2VydCAoZXhwbGljaXRfcmVsb2MgPT0gKGNvbnN0IGV4cHJlc3Npb25TICopMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19zdWJ0cmFjdDoKLSAgICAgIC8qIEFzc3VtZSB0aGF0IHRoaXMgZGlmZmVyZW5jZSBleHByZXNzaW9uIHdpbGwgYmUgcmVzb2x2ZWQgdG8gYW4KLQkgYWJzb2x1dGUgdmFsdWUgYW5kIHRoYXQgdGhhdCB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLiAqLwotCi0gICAgICBhc3NlcnQgKGV4cGxpY2l0X3JlbG9jID09IChjb25zdCBleHByZXNzaW9uUyAqKTApOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0gICAgICBuZXd0b2tbMV0gPSAqZXhwOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCAzLCAwKTsKLQotICAgICAgaWYgKHBvZmZzZXQpCi0Jc2V0X3Rva19jb25zdCAoKnBvZmZzZXQsIDApOwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIE9fYmlnOgotICAgICAgaWYgKGV4cC0+WF9hZGRfbnVtYmVyID4gMCkKLQlhc19iYWQgKF8oImJpZ251bSBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJmbG9hdGluZyBwb2ludCBudW1iZXIgaW52YWxpZDsgemVybyBhc3N1bWVkIikpOwotICAgICAgYWRkZW5kID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiY2FuJ3QgaGFuZGxlIGV4cHJlc3Npb24iKSk7Ci0gICAgICBhZGRlbmQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmICghcmFuZ2Vfc2lnbmVkXzMyIChhZGRlbmQpKQotICAgIHsKLSAgICAgIG9mZnNldFQgbGl0OwotCi0gICAgICAvKiBmb3IgNjQtYml0IGFkZGVuZHMsIGp1c3QgcHV0IGl0IGluIHRoZSBsaXRlcmFsIHBvb2wgKi8KLQotI2lmZGVmIE9CSl9FVkFYCi0gICAgICAvKiBlbWl0ICJsZHEgdGFyZ3JlZywgbGl0KGJhc2VyZWcpIiAgKi8KLSAgICAgIGxpdCA9IGFkZF90b19saW5rX3Bvb2wgKGFscGhhX2V2YXhfcHJvYy5zeW1ib2wsCi0JCQkgICAgICBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbiksIGFkZGVuZCk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLSAgICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgbGl0KTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJsZHEiLCBuZXd0b2ssIDMsIDApOwotI2Vsc2UKLQotICAgICAgaWYgKGFscGhhX2xpdDhfc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgIGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24gKCIubGl0OCIsCi0JCQkJICAmYWxwaGFfbGl0OF9zZWN0aW9uLAotCQkJCSAgJmFscGhhX2xpdDhfc3ltYm9sKTsKLQotI2lmZGVmIE9CSl9FQ09GRgotCSAgYWxwaGFfbGl0OF9saXRlcmFsID0gYWRkX3RvX2xpdGVyYWxfcG9vbCAoYWxwaGFfbGl0OF9zeW1ib2wsIDB4ODAwMCwKLQkJCQkJCSAgICBhbHBoYV9saXRhX3NlY3Rpb24sIDgpOwotCSAgaWYgKGFscGhhX2xpdDhfbGl0ZXJhbCA+PSAweDgwMDApCi0JICAgIGFzX2ZhdGFsIChfKCJvdmVyZmxvdyBpbiBsaXRlcmFsICgubGl0YSkgdGFibGUiKSk7Ci0jZW5kaWYKLQl9Ci0KLSAgICAgIGxpdCA9IGFkZF90b19saXRlcmFsX3Bvb2wgKE5VTEwsIGFkZGVuZCwgYWxwaGFfbGl0OF9zZWN0aW9uLCA4KSAtIDB4ODAwMDsKLSAgICAgIGlmIChsaXQgPj0gMHg4MDAwKQotCWFzX2ZhdGFsIChfKCJvdmVyZmxvdyBpbiBsaXRlcmFsICgubGl0OCkgdGFibGUiKSk7Ci0KLSAgICAgIC8qIGVtaXQgImxkYSBsaXRyZWcsIC5saXQ4KzB4ODAwMCIgKi8KLQotICAgICAgaWYgKHRhcmdyZWcgPT0gYmFzZXJlZykKLQl7Ci0JICBpZiAoYWxwaGFfbm9hdF9vbikKLQkgICAgYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0JICBpZiAodGFyZ3JlZyA9PSBBWFBfUkVHX0FUKQotCSAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCB3aGlsZSAkYXQgaW4gdXNlIikpOwotCi0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLQl9Ci0gICAgICBlbHNlCi0Jc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0jaWZkZWYgT0JKX0VDT0ZGCi0gICAgICBzZXRfdG9rX3N5bSAobmV3dG9rWzFdLCBhbHBoYV9saXRhX3N5bWJvbCwgYWxwaGFfbGl0OF9saXRlcmFsKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICAgIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIGFscGhhX2xpdDhfc3ltYm9sLCAweDgwMDApOwotI2VuZGlmCi0gICAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYWxwaGFfZ3BfcmVnaXN0ZXIpOwotCi0gICAgICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOwotCi0gICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA9PSAxKTsKLSNpZmRlZiBPQkpfRUNPRkYKLSAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUw7Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTDsKLSNlbmRpZgotCi0gICAgICBlbWl0X2luc24gKCZpbnNuKTsKLQotICAgICAgLyogZW1pdCAibGRxIGxpdHJlZywgbGl0KGxpdHJlZykiICovCi0KLSAgICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgbGl0KTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyKTsKLQotICAgICAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKCJsZHEiLCBuZXd0b2ssIDMsICZpbnNuKTsKLQotICAgICAgYXNzZXJ0IChpbnNuLm5maXh1cHMgPCBNQVhfSU5TTl9GSVhVUFMpOwotICAgICAgaWYgKGluc24ubmZpeHVwcyA+IDApCi0JewotCSAgbWVtbW92ZSAoJmluc24uZml4dXBzWzFdLCAmaW5zbi5maXh1cHNbMF0sCi0JCSAgIHNpemVvZihzdHJ1Y3QgYWxwaGFfZml4dXApICogaW5zbi5uZml4dXBzKTsKLQl9Ci0gICAgICBpbnNuLm5maXh1cHMrKzsKLSAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0xJVFVTRTsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX29wID0gT19zeW1ib2w7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sID0gc2VjdGlvbl9zeW1ib2wgKG5vd19zZWcpOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciA9IExJVFVTRV9CQVNFOwotICAgICAgZW1pdF9saXR1c2UgPSAwOwotCi0gICAgICBlbWl0X2luc24gKCZpbnNuKTsKLQotICAgICAgLyogZW1pdCAiYWRkcSBsaXRyZWcsIGJhc2UsIHRhcmdldCIgKi8KLQotICAgICAgaWYgKGJhc2VyZWcgIT0gQVhQX1JFR19aRVJPKQotCXsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIGJhc2VyZWcpOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgdGFyZ3JlZyk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJhZGRxIiwgbmV3dG9rLCAzLCAwKTsKLQl9Ci0jZW5kaWYgLyogIU9CSl9FVkFYICovCi0KLSAgICAgIGlmIChwb2Zmc2V0KQotCXNldF90b2tfY29uc3QgKCpwb2Zmc2V0LCAwKTsKLSAgICAgICpwYmFzZXJlZyA9IHRhcmdyZWc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb2Zmc2V0VCBsb3csIGhpZ2gsIGV4dHJhLCB0bXA7Ci0KLSAgICAgIC8qIGZvciAzMi1iaXQgb3BlcmFuZHMsIGJyZWFrIHVwIHRoZSBhZGRlbmQgKi8KLQotICAgICAgbG93ID0gc2lnbl9leHRlbmRfMTYgKGFkZGVuZCk7Ci0gICAgICB0bXAgPSBhZGRlbmQgLSBsb3c7Ci0gICAgICBoaWdoID0gc2lnbl9leHRlbmRfMTYgKHRtcCA+PiAxNik7Ci0KLSAgICAgIGlmICh0bXAgLSAoaGlnaCA8PCAxNikpCi0JewotCSAgZXh0cmEgPSAweDQwMDA7Ci0JICB0bXAgLT0gMHg0MDAwMDAwMDsKLQkgIGhpZ2ggPSBzaWduX2V4dGVuZF8xNiAodG1wID4+IDE2KTsKLQl9Ci0gICAgICBlbHNlCi0JZXh0cmEgPSAwOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKLQotICAgICAgaWYgKGV4dHJhKQotCXsKLQkgIC8qIGVtaXQgImxkYWggciwgZXh0cmEocikgKi8KLQkgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgZXh0cmEpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgibGRhaCIsIG5ld3RvaywgMywgMCk7Ci0JICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyA9IHRhcmdyZWcpOwotCX0KLQotICAgICAgaWYgKGhpZ2gpCi0JewotCSAgLyogZW1pdCAibGRhaCByLCBoaWdoKHIpICovCi0JICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGhpZ2gpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgibGRhaCIsIG5ld3RvaywgMywgMCk7Ci0JICBiYXNlcmVnID0gdGFyZ3JlZzsKLQkgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKLQl9Ci0KLSAgICAgIGlmICgobG93ICYmICFwb2Zmc2V0KSB8fCAoIXBvZmZzZXQgJiYgYmFzZXJlZyAhPSB0YXJncmVnKSkKLQl7Ci0JICAvKiBlbWl0ICJsZGEgciwgbG93KGJhc2UpIiAqLwotCSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsb3cpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCAzLCAwKTsKLQkgIGJhc2VyZWcgPSB0YXJncmVnOwotCSAgbG93ID0gMDsKLQl9Ci0KLSAgICAgIGlmIChwb2Zmc2V0KQotCXNldF90b2tfY29uc3QgKCpwb2Zmc2V0LCBsb3cpOwotICAgICAgKnBiYXNlcmVnID0gYmFzZXJlZzsKLSAgICB9Ci0KLSAgcmV0dXJuIGVtaXRfbGl0dXNlOwotfQotCi0vKiBUaGUgbGRhIG1hY3JvIGRpZmZlcnMgZnJvbSB0aGUgbGRhIGluc3RydWN0aW9uIGluIHRoYXQgaXQgaGFuZGxlcwotICAgbW9zdCBzaW1wbGUgZXhwcmVzc2lvbnMsIHBhcnRpY3VhbHJseSBzeW1ib2wgYWRkcmVzcyBsb2FkcyBhbmQKLSAgIGxhcmdlIGNvbnN0YW50cy4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2xkYSAodG9rLCBudG9rLCBvcG5hbWUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgb3BuYW1lOwotewotICBpbnQgYmFzZXJlZzsKLSAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jID0gKGNvbnN0IGV4cHJlc3Npb25TICopMDsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgaWYgKG50b2sgJiYgVVNFUl9SRUxPQ19QICh0b2tbbnRvay0xXS5YX29wKSkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyOwotCi0gICAgICByZWxvYyA9ICZ0b2tbbnRvay0xXTsKLSAgICAgIHIgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2MtPlhfb3ApOwotICAgICAgc3dpdGNoIChyZWxvYy0+WF9vcCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCQkgIChpbnQpcmVsb2MtPlhfYWRkX251bWJlciwgKGNvbnN0IGNoYXIgKilvcG5hbWUpOwotCi0JICByZWxvYyA9IChjb25zdCBleHByZXNzaW9uUyAqKTA7Ci0JICBudG9rLS07Ci0JICBicmVhazsKLQotCWNhc2UgT19saXRlcmFsOgotCSAgbnRvay0tOwotCSAgYnJlYWs7Ci0KLQkgIC8qIEZvciBsZGEgJHgsMCgkeCkhbGl0dXNlX2Jhc2UheSwgZG9uJ3QgdXNlIGxvYWRfZXhwcmVzc2lvbiwgc2luY2UKLQkgICAgIGl0IGlzIHJlYWxseSB0b28gZ2VuZXJhbCBmb3Igb3VyIG5lZWRzLiAgSW5zdGVhZCBqdXN0IGdlbmVyYXRlIHRoZQotCSAgICAgbGRhIGRpcmVjdGx5LiAgKi8KLQljYXNlIE9fbGl0dXNlX2Jhc2U6Ci0JICBpZiAobnRvayAhPSA0Ci0JICAgICAgfHwgdG9rWzBdLlhfb3AgIT0gT19yZWdpc3RlcgotCSAgICAgIHx8ICFpc19pcl9udW0odG9rWzBdLlhfYWRkX251bWJlcikKLQkgICAgICB8fCB0b2tbMV0uWF9vcCAhPSBPX2NvbnN0YW50Ci0JICAgICAgfHwgdG9rWzJdLlhfb3AgIT0gT19wcmVnaXN0ZXIKLQkgICAgICB8fCAhaXNfaXJfbnVtKHRva1syXS5YX2FkZF9udW1iZXIpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJiYWQgaW5zdHJ1Y3Rpb24gZm9ybWF0IGZvciBsZGEgISVzISVkIiksIHItPm5hbWUsCi0JCSAgICAgIHJlbG9jLT5YX2FkZF9udW1iZXIpOwotCi0JICAgICAgcmVsb2MgPSAoY29uc3QgZXhwcmVzc2lvblMgKikwOwotCSAgICAgIG50b2stLTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBlbWl0X2xvYWRzdG9yZSAodG9rLCBudG9rLCAibGRhIik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gIGlmIChudG9rID09IDIpCi0gICAgYmFzZXJlZyA9ICh0b2tbMV0uWF9vcCA9PSBPX2NvbnN0YW50ID8gQVhQX1JFR19aRVJPIDogYWxwaGFfZ3BfcmVnaXN0ZXIpOwotICBlbHNlCi0gICAgYmFzZXJlZyA9IHRva1syXS5YX2FkZF9udW1iZXI7Ci0KLSAgKHZvaWQpIGxvYWRfZXhwcmVzc2lvbiAodG9rWzBdLlhfYWRkX251bWJlciwgJnRva1sxXSwgJmJhc2VyZWcsIE5VTEwsIHJlbG9jKTsKLX0KLQotLyogVGhlIGxkYWggbWFjcm8gZGlmZmVycyBmcm9tIHRoZSBsZGFoIGluc3RydWN0aW9uIGluIHRoYXQgaXQgaGFzICQzMQotICAgYXMgYW4gaW1wbGllZCBiYXNlIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRhaCAodG9rLCBudG9rLCB1bnVzZWQpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IFBUUiB1bnVzZWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotICAgIHsKLSAgICAgIGNvbnN0IGV4cHJlc3Npb25TICpyZWxvY19leHAgPSAmdG9rW250b2stMV07Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jX2V4cC0+WF9vcCk7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCB1c2UgISVzISVkIHdpdGggJXMiKSwgci0+bmFtZSwKLQkgICAgICAoaW50KXJlbG9jX2V4cC0+WF9hZGRfbnVtYmVyLCAibGRhaCIpOwotICAgICAgbnRvay0tOwotICAgIH0KLSNlbmRpZgotCi0gIG5ld3Rva1swXSA9IHRva1swXTsKLSAgbmV3dG9rWzFdID0gdG9rWzFdOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19aRVJPKTsKLQotICBhc3NlbWJsZV90b2tlbnMgKCJsZGFoIiwgbmV3dG9rLCAzLCAwKTsKLX0KLQotLyogSGFuZGxlIGFsbCAic2ltcGxlIiBpbnRlZ2VyIHJlZ2lzdGVyIGxvYWRzIC0tIGxkcSwgbGRxX2wsIGxkcV91LAotICAgZXRjLiAgVGhleSBkaWZmZXIgZnJvbSB0aGUgcmVhbCBpbnN0cnVjdGlvbnMgaW4gdGhhdCB0aGV5IGRvIHNpbXBsZQotICAgZXhwcmVzc2lvbnMgbGlrZSB0aGUgbGRhIG1hY3JvLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfaXJfbG9hZCAodG9rLCBudG9rLCBvcG5hbWUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgb3BuYW1lOwotewotICBpbnQgYmFzZXJlZywgbGl0dXNlOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0gIHN0cnVjdCBhbHBoYV9pbnNuIGluc247Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGNvbnN0IGV4cHJlc3Npb25TICpyZWxvYyA9IChjb25zdCBleHByZXNzaW9uUyAqKTA7Ci0KLSAgaWYgKG50b2sgJiYgVVNFUl9SRUxPQ19QICh0b2tbbnRvay0xXS5YX29wKSkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyOwotCi0gICAgICByZWxvYyA9ICZ0b2tbbnRvay0xXTsKLSAgICAgIHN3aXRjaCAocmVsb2MtPlhfb3ApCi0JewotCWNhc2UgT19saXR1c2VfYmFzZToKLQkgIG50b2stLTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX2xpdGVyYWw6Ci0JICBpZiAoc3RyY21wICgoY29uc3QgY2hhciAqKW9wbmFtZSwgImxkcSIpID09IDApCi0JICAgIHsKLQkgICAgICBlbWl0X2xkYSAodG9rLCBudG9rLCBvcG5hbWUpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICAvKiBmYWxsIHRocm91Z2ggKi8KLQlkZWZhdWx0OgotCSAgbnRvay0tOwotCSAgciA9IEFMUEhBX1JFTE9DX1RBQkxFIChyZWxvYy0+WF9vcCk7Ci0JICBhc19iYWQgKF8oIkNhbm5vdCB1c2UgISVzISVkIHdpdGggJXMiKSwgci0+bmFtZSwKLQkJICAoaW50KXJlbG9jLT5YX2FkZF9udW1iZXIsIChjb25zdCBjaGFyICopb3BuYW1lKTsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKG50b2sgPT0gMikKLSAgICBiYXNlcmVnID0gKHRva1sxXS5YX29wID09IE9fY29uc3RhbnQgPyBBWFBfUkVHX1pFUk8gOiBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0gIGVsc2UKLSAgICBiYXNlcmVnID0gdG9rWzJdLlhfYWRkX251bWJlcjsKLQotICBsaXR1c2UgPSBsb2FkX2V4cHJlc3Npb24gKHRva1swXS5YX2FkZF9udW1iZXIsICZ0b2tbMV0sICZiYXNlcmVnLAotCQkJICAgICZuZXd0b2tbMV0sIChjb25zdCBleHByZXNzaW9uUyAqKTApOwotCi0gIG5ld3Rva1swXSA9IHRva1swXTsKLSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCi0gIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgoY29uc3QgY2hhciAqKW9wbmFtZSwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGlmIChyZWxvYykKLSAgICB7Ci0gICAgICBpbnQgbmZpeHVwcyA9IGluc24ubmZpeHVwczsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnIgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2MtPlhfb3ApOwotCi0gICAgICBhc3NlcnQgKG5maXh1cHMgPCBNQVhfSU5TTl9GSVhVUFMpOwotICAgICAgaW5zbi5maXh1cHNbbmZpeHVwc10ucmVsb2MgPSByLT5yZWxvYzsKLSAgICAgIGluc24uZml4dXBzW25maXh1cHNdLmV4cC5YX29wID0gT19zeW1ib2w7Ci0gICAgICBpbnNuLmZpeHVwc1tuZml4dXBzXS5leHAuWF9hZGRfc3ltYm9sID0gc2VjdGlvbl9zeW1ib2wgKG5vd19zZWcpOwotICAgICAgaW5zbi5maXh1cHNbbmZpeHVwc10uZXhwLlhfYWRkX251bWJlciA9IHItPmxpdHVzZTsKLSAgICAgIGluc24uc2VxdWVuY2VbbmZpeHVwc10gPSByZWxvYy0+WF9hZGRfbnVtYmVyOwotICAgICAgaW5zbi5uZml4dXBzKys7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKGxpdHVzZSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpZiAoaW5zbi5uZml4dXBzID4gMCkKLQl7Ci0JICBtZW1tb3ZlICgmaW5zbi5maXh1cHNbMV0sICZpbnNuLmZpeHVwc1swXSwKLQkJICAgc2l6ZW9mKHN0cnVjdCBhbHBoYV9maXh1cCkgKiBpbnNuLm5maXh1cHMpOwotCX0KLSAgICAgIGluc24ubmZpeHVwcysrOwotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyID0gTElUVVNFX0JBU0U7Ci0gICAgfQotCi0gIGVtaXRfaW5zbiAoJmluc24pOwotfQotCi0vKiBIYW5kbGUgZnAgcmVnaXN0ZXIgbG9hZHMsIGFuZCBib3RoIGludGVnZXIgYW5kIGZwIHJlZ2lzdGVyIHN0b3Jlcy4KLSAgIEFnYWluLCB3ZSBoYW5kbGUgc2ltcGxlIGV4cHJlc3Npb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbG9hZHN0b3JlICh0b2ssIG50b2ssIG9wbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiBvcG5hbWU7Ci17Ci0gIGludCBiYXNlcmVnLCBsaXR1c2U7Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLSAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jID0gKGNvbnN0IGV4cHJlc3Npb25TICopMDsKLQotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotICAgIHsKLSAgICAgIHJlbG9jID0gJnRva1stLW50b2tdOwotICAgICAgaWYgKHJlbG9jLT5YX29wICE9IE9fbGl0dXNlX2Jhc2UpCi0JewotCSAgY29uc3Qgc3RydWN0IGFscGhhX3JlbG9jX29wX3RhZyAqciA9ICZhbHBoYV9yZWxvY19vcFsgcmVsb2MtPlhfbWQgXTsKLQkgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCQkgIChpbnQpcmVsb2MtPlhfYWRkX251bWJlciwgKGNvbnN0IGNoYXIgKilvcG5hbWUpOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobnRvayA9PSAyKQotICAgIGJhc2VyZWcgPSAodG9rWzFdLlhfb3AgPT0gT19jb25zdGFudCA/IEFYUF9SRUdfWkVSTyA6IGFscGhhX2dwX3JlZ2lzdGVyKTsKLSAgZWxzZQotICAgIGJhc2VyZWcgPSB0b2tbMl0uWF9hZGRfbnVtYmVyOwotCi0gIGlmICh0b2tbMV0uWF9vcCAhPSBPX2NvbnN0YW50IHx8ICFyYW5nZV9zaWduZWRfMTYodG9rWzFdLlhfYWRkX251bWJlcikpCi0gICAgewotICAgICAgaWYgKGFscGhhX25vYXRfb24pCi0JYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0KLSAgICAgIGxpdHVzZSA9IGxvYWRfZXhwcmVzc2lvbiAoQVhQX1JFR19BVCwgJnRva1sxXSwgJmJhc2VyZWcsICZuZXd0b2tbMV0sCi0JCQkJKGNvbnN0IGV4cHJlc3Npb25TICopMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmV3dG9rWzFdID0gdG9rWzFdOwotICAgICAgbGl0dXNlID0gMDsKLSAgICB9Ci0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0KLSAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKChjb25zdCBjaGFyICopb3BuYW1lLCBuZXd0b2ssIDMsICZpbnNuKTsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgaWYgKHJlbG9jKQotICAgIHsKLSAgICAgIGludCBuZml4dXBzID0gaW5zbi5uZml4dXBzOwotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX3JlbG9jX29wX3RhZyAqciA9IEFMUEhBX1JFTE9DX1RBQkxFIChyZWxvYy0+WF9vcCk7Ci0KLSAgICAgIGFzc2VydCAobmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpbnNuLmZpeHVwc1tuZml4dXBzXS5yZWxvYyA9IHItPnJlbG9jOwotICAgICAgaW5zbi5maXh1cHNbbmZpeHVwc10uZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGluc24uZml4dXBzW25maXh1cHNdLmV4cC5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBpbnNuLmZpeHVwc1tuZml4dXBzXS5leHAuWF9hZGRfbnVtYmVyID0gci0+bGl0dXNlOwotICAgICAgaW5zbi5zZXF1ZW5jZVtuZml4dXBzXSA9IHJlbG9jLT5YX2FkZF9udW1iZXI7Ci0gICAgICBpbnNuLm5maXh1cHMrKzsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobGl0dXNlKQotICAgIHsKLSAgICAgIGFzc2VydCAoaW5zbi5uZml4dXBzIDwgTUFYX0lOU05fRklYVVBTKTsKLSAgICAgIGlmIChpbnNuLm5maXh1cHMgPiAwKQotCXsKLQkgIG1lbW1vdmUgKCZpbnNuLmZpeHVwc1sxXSwgJmluc24uZml4dXBzWzBdLAotCQkgICBzaXplb2Yoc3RydWN0IGFscGhhX2ZpeHVwKSAqIGluc24ubmZpeHVwcyk7Ci0JfQotICAgICAgaW5zbi5uZml4dXBzKys7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sIChub3dfc2VnKTsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIgPSBMSVRVU0VfQkFTRTsKLSAgICB9Ci0KLSAgZW1pdF9pbnNuICgmaW5zbik7Ci19Ci0KLS8qIExvYWQgYSBoYWxmLXdvcmQgb3IgYnl0ZSBhcyBhbiB1bnNpZ25lZCB2YWx1ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2xkWHUgKHRvaywgbnRvaywgdmxnc2l6ZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2bGdzaXplOwotewotICBpZiAoYWxwaGFfdGFyZ2V0ICYgQVhQX09QQ09ERV9CV1gpCi0gICAgZW1pdF9pcl9sb2FkICh0b2ssIG50b2ssIGxkWHVfb3BbKGxvbmcpdmxnc2l6ZV0pOwotICBlbHNlCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotCXsKLQkgIGNvbnN0IGV4cHJlc3Npb25TICpyZWxvY19leHAgPSAmdG9rW250b2stMV07Ci0JICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyCi0JICAgID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jX2V4cC0+WF9vcCk7Ci0KLQkgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCQkgIChpbnQpcmVsb2NfZXhwLT5YX2FkZF9udW1iZXIsICJsZGJ1L2xkd3UiKTsKLQkgIG50b2stLTsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKGFscGhhX25vYXRfb24pCi0JYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0KLSAgICAgIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICAgICAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mIChleHByZXNzaW9uUykgKiBudG9rKTsKLSAgICAgIG5ld3Rva1swXS5YX2FkZF9udW1iZXIgPSBBWFBfUkVHX0FUOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAgICAgLyogZW1pdCAibGRxX3UgdGFyZywgMCgkYXQpIiAqLwotCi0gICAgICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gICAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIDApOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfQVQpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibGRxX3UiLCBuZXd0b2ssIDMsIDEpOwotCi0gICAgICAvKiBlbWl0ICJleHRYbCB0YXJnLCAkYXQsIHRhcmciICovCi0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfQVQpOwotICAgICAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICAgICAgYXNzZW1ibGVfdG9rZW5zIChleHRYbF9vcFsobG9uZyl2bGdzaXplXSwgbmV3dG9rLCAzLCAxKTsKLSAgICB9Ci19Ci0KLS8qIExvYWQgYSBoYWxmLXdvcmQgb3IgYnl0ZSBhcyBhIHNpZ25lZCB2YWx1ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2xkWCAodG9rLCBudG9rLCB2bGdzaXplKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZsZ3NpemU7Ci17Ci0gIGVtaXRfbGRYdSAodG9rLCBudG9rLCB2bGdzaXplKTsKLSAgYXNzZW1ibGVfdG9rZW5zIChzZXh0WF9vcFsobG9uZyl2bGdzaXplXSwgdG9rLCAxLCAxKTsKLX0KLQotLyogTG9hZCBhbiBpbnRlZ3JhbCB2YWx1ZSBmcm9tIGFuIHVuYWxpZ25lZCBhZGRyZXNzIGFzIGFuIHVuc2lnbmVkCi0gICB2YWx1ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X3VsZFh1ICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgbG9uZyBsZ3NpemUgPSAobG9uZyl2bGdzaXplOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgaWYgKGFscGhhX25vYXRfb24pCi0gICAgYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0KLSAgLyogZW1pdCAibGRhICRhdCwgZXhwIiAqLwotCi0gIG1lbWNweSAobmV3dG9rLCB0b2ssIHNpemVvZiAoZXhwcmVzc2lvblMpICogbnRvayk7Ci0gIG5ld3Rva1swXS5YX2FkZF9udW1iZXIgPSBBWFBfUkVHX0FUOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIG50b2ssIDEpOwotCi0gIC8qIGVtaXQgImxkcV91ICR0OSwgMCgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIDApOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19BVCk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkdDEwLCBzaXplLTEoJGF0KSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgKDE8PGxnc2l6ZSktMSk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBlbWl0ICJleHRYbCAkdDksICRhdCwgJHQ5IiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UOSk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoZXh0WGxfb3BbbGdzaXplXSwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBlbWl0ICJleHRYaCAkdDEwLCAkYXQsICR0MTAiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UMTApOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzJdLCBBWFBfUkVHX1QxMCk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoZXh0WGhfb3BbbGdzaXplXSwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBlbWl0ICJvciAkdDksICR0MTAsIHRhcmciICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKLSAgbmV3dG9rWzJdID0gdG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7Ci19Ci0KLS8qIExvYWQgYW4gaW50ZWdyYWwgdmFsdWUgZnJvbSBhbiB1bmFsaWduZWQgYWRkcmVzcyBhcyBhIHNpZ25lZCB2YWx1ZS4KLSAgIE5vdGUgdGhhdCBxdWFkcyBzaG91bGQgZ2V0IGZ1bm5lbGVkIHRvIHRoZSB1bnNpZ25lZCBsb2FkIHNpbmNlIHdlCi0gICBkb24ndCBoYXZlIHRvIGRvIHRoZSBzaWduIGV4dGVuc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X3VsZFggKHRvaywgbnRvaywgdmxnc2l6ZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2bGdzaXplOwotewotICBlbWl0X3VsZFh1ICh0b2ssIG50b2ssIHZsZ3NpemUpOwotICBhc3NlbWJsZV90b2tlbnMgKHNleHRYX29wWyhsb25nKXZsZ3NpemVdLCB0b2ssIDEsIDEpOwotfQotCi0vKiBJbXBsZW1lbnQgdGhlIGxkaWwgbWFjcm8uICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sZGlsICh0b2ssIG50b2ssIHVudXNlZCkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB1bnVzZWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzJdOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotICAgIHsKLSAgICAgIGNvbnN0IGV4cHJlc3Npb25TICpyZWxvY19leHAgPSAmdG9rW250b2stMV07Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jX2V4cC0+WF9vcCk7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCB1c2UgISVzISVkIHdpdGggJXMiKSwgci0+bmFtZSwKLQkgICAgICAoaW50KXJlbG9jX2V4cC0+WF9hZGRfbnVtYmVyLCAibGRpbCIpOwotICAgICAgbnRvay0tOwotICAgIH0KLSNlbmRpZgotCi0gIG1lbWNweSAobmV3dG9rLCB0b2ssIHNpemVvZihuZXd0b2spKTsKLSAgbmV3dG9rWzFdLlhfYWRkX251bWJlciA9IHNpZ25fZXh0ZW5kXzMyICh0b2tbMV0uWF9hZGRfbnVtYmVyKTsKLQotICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIG50b2ssIDEpOwotfQotCi0vKiBTdG9yZSBhIGhhbGYtd29yZCBvciBieXRlLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfc3RYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgaW50IGxnc2l6ZSA9IChpbnQpKGxvbmcpdmxnc2l6ZTsKLQotICBpZiAoYWxwaGFfdGFyZ2V0ICYgQVhQX09QQ09ERV9CV1gpCi0gICAgZW1pdF9sb2Fkc3RvcmUgKHRvaywgbnRvaywgc3RYX29wW2xnc2l6ZV0pOwotICBlbHNlCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gICAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQlhc19iYWQoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gICAgICAvKiBlbWl0ICJsZGEgJGF0LCBleHAiICovCi0KLSAgICAgIG1lbWNweSAobmV3dG9rLCB0b2ssIHNpemVvZiAoZXhwcmVzc2lvblMpICogbnRvayk7Ci0gICAgICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7Ci0KLSAgICAgIC8qIGVtaXQgImxkcV91ICR0OSwgMCgkYXQpIiAqLwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gICAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19BVCk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgICAgIC8qIGVtaXQgImluc1hsIHNyYywgJGF0LCAkdDEwIiAqLwotCi0gICAgICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfVDEwKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoaW5zWGxfb3BbbGdzaXplXSwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAibXNrWGwgJHQ5LCAkYXQsICR0OSIgKi8KLQotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gICAgICBuZXd0b2tbMl0gPSBuZXd0b2tbMF07Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKG1za1hsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgICAgIC8qIGVtaXQgIm9yICR0OSwgJHQxMCwgJHQ5IiAqLwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMCk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7Ci0KLSAgICAgIC8qIGVtaXQgInN0cV91ICR0OSwgMCgkYXQpICovCi0KLSAgICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gICAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19BVCk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJzdHFfdSIsIG5ld3RvaywgMywgMSk7Ci0gICAgfQotfQotCi0vKiBTdG9yZSBhbiBpbnRlZ2VyIHRvIGFuIHVuYWxpZ25lZCBhZGRyZXNzLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfdXN0WCAodG9rLCBudG9rLCB2bGdzaXplKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZsZ3NpemU7Ci17Ci0gIGludCBsZ3NpemUgPSAoaW50KShsb25nKXZsZ3NpemU7Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLQotICAvKiBlbWl0ICJsZGEgJGF0LCBleHAiICovCi0KLSAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mIChleHByZXNzaW9uUykgKiBudG9rKTsKLSAgbmV3dG9rWzBdLlhfYWRkX251bWJlciA9IEFYUF9SRUdfQVQ7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7Ci0KLSAgLyogZW1pdCAibGRxX3UgJDksIDAoJGF0KSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfQVQpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibGRxX3UgJDEwLCBzaXplLTEoJGF0KSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgKDEgPDwgbGdzaXplKS0xKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRxX3UiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgImluc1hsIHNyYywgJGF0LCAkdDExIiAqLwotCi0gIG5ld3Rva1swXSA9IHRva1swXTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19BVCk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfVDExKTsKLSAgYXNzZW1ibGVfdG9rZW5zIChpbnNYbF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgImluc1hoIHNyYywgJGF0LCAkdDEyIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfVDEyKTsKLSAgYXNzZW1ibGVfdG9rZW5zIChpbnNYaF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgIm1za1hsICR0OSwgJGF0LCAkdDkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKLSAgYXNzZW1ibGVfdG9rZW5zIChtc2tYbF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgIm1za1hoICR0MTAsICRhdCwgJHQxMCIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKLSAgYXNzZW1ibGVfdG9rZW5zIChtc2tYaF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgIm9yICR0OSwgJHQxMSwgJHQ5IiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMSk7Ci0gIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKLSAgYXNzZW1ibGVfdG9rZW5zICgib3IiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgIm9yICR0MTAsICR0MTIsICR0MTAiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UMTApOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMik7Ci0gIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKLSAgYXNzZW1ibGVfdG9rZW5zICgib3IiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgInN0cV91ICR0OSwgMCgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIDApOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19BVCk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoInN0cV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBlbWl0ICJzdHFfdSAkdDEwLCBzaXplLTEoJGF0KSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgKDEgPDwgbGdzaXplKS0xKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgic3RxX3UiLCBuZXd0b2ssIDMsIDEpOwotfQotCi0vKiBTaWduIGV4dGVuZCBhIGhhbGYtd29yZCBvciBieXRlLiAgVGhlIDMyLWJpdCBzaWduIGV4dGVuZCBpcwotICAgaW1wbGVtZW50ZWQgYXMgImFkZGwgJDMxLCAkciwgJHQiIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9zZXh0WCAodG9rLCBudG9rLCB2bGdzaXplKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZsZ3NpemU7Ci17Ci0gIGxvbmcgbGdzaXplID0gKGxvbmcpdmxnc2l6ZTsKLQotICBpZiAoYWxwaGFfdGFyZ2V0ICYgQVhQX09QQ09ERV9CV1gpCi0gICAgYXNzZW1ibGVfdG9rZW5zIChzZXh0WF9vcFtsZ3NpemVdLCB0b2ssIG50b2ssIDApOwotICBlbHNlCi0gICAgewotICAgICAgaW50IGJpdHNoaWZ0ID0gNjQgLSA4ICogKDEgPDwgbGdzaXplKTsKLSAgICAgIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgaWYgKG50b2sgJiYgVVNFUl9SRUxPQ19QICh0b2tbbnRvay0xXS5YX29wKSkKLQl7Ci0JICBjb25zdCBleHByZXNzaW9uUyAqcmVsb2NfZXhwID0gJnRva1tudG9rLTFdOwotCSAgY29uc3Qgc3RydWN0IGFscGhhX3JlbG9jX29wX3RhZyAqcgotCSAgICA9IEFMUEhBX1JFTE9DX1RBQkxFIChyZWxvY19leHAtPlhfb3ApOwotCi0JICBhc19iYWQgKF8oIkNhbm5vdCB1c2UgISVzISVkIHdpdGggJXMiKSwgci0+bmFtZSwKLQkJICAoaW50KXJlbG9jX2V4cC0+WF9hZGRfbnVtYmVyLCAic2V0eHQiKTsKLQkgIG50b2stLTsKLQl9Ci0jZW5kaWYKLQotICAgICAgLyogZW1pdCAic2xsIHNyYyxiaXRzLGRzdCIgKi8KLQotICAgICAgbmV3dG9rWzBdID0gdG9rWzBdOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBiaXRzaGlmdCk7Ci0gICAgICBuZXd0b2tbMl0gPSB0b2tbbnRvayAtIDFdOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgic2xsIiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAic3JhIGRzdCxiaXRzLGRzdCIgKi8KLQotICAgICAgbmV3dG9rWzBdID0gbmV3dG9rWzJdOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgic3JhIiwgbmV3dG9rLCAzLCAxKTsKLSAgICB9Ci19Ci0KLS8qIEltcGxlbWVudCB0aGUgZGl2aXNpb24gYW5kIG1vZHVsdXMgbWFjcm9zLiAgKi8KLQotI2lmZGVmIE9CSl9FVkFYCi0KLS8qIE1ha2UgcmVnaXN0ZXIgdXNhZ2UgbGlrZSBpbiBub3JtYWwgcHJvY2VkdXJlIGNhbGwuCi0gICBEb24ndCBjbG9iYmVyIFBWIGFuZCBSQS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2RpdmlzaW9uICh0b2ssIG50b2ssIHN5bW5hbWUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgc3ltbmFtZTsKLXsKLSAgLyogRElWSVNJT04gYW5kIE1PRFVMVVMuIFllY2guCi0gICAqCi0gICAqIENvbnZlcnQKLSAgICogICAgT1AgeCx5LHJlc3VsdAotICAgKiB0bwotICAgKiAgICBtb3YgeCxSMTYJIyBpZiB4ICE9IFIxNgotICAgKiAgICBtb3YgeSxSMTcJIyBpZiB5ICE9IFIxNwotICAgKiAgICBsZGEgQVQsX19PUAotICAgKiAgICBqc3IgQVQsKEFUKSwwCi0gICAqICAgIG1vdiBSMCxyZXN1bHQKLSAgICoKLSAgICogd2l0aCBhcHByb3ByaWF0ZSBvcHRpbWl6YXRpb25zIGlmIFIwLFIxNixSMTcgYXJlIHRoZSByZWdpc3RlcnMKLSAgICogc3BlY2lmaWVkIGJ5IHRoZSBjb21waWxlci4KLSAgICovCi0KLSAgaW50IHhyLCB5ciwgcnI7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotICAgIHsKLSAgICAgIGNvbnN0IGV4cHJlc3Npb25TICpyZWxvY19leHAgPSAmdG9rW250b2stMV07Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jX2V4cC0+WF9vcCk7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCB1c2UgISVzISVkIHdpdGggJXMiKSwgci0+bmFtZSwKLQkgICAgICAoaW50KXJlbG9jX2V4cC0+WF9hZGRfbnVtYmVyLCAoY2hhciBjaGFyICopc3ltbmFtZSk7Ci0gICAgICBudG9rLS07Ci0gICAgfQotI2VuZGlmCi0KLSAgeHIgPSByZWdubyAodG9rWzBdLlhfYWRkX251bWJlcik7Ci0gIHlyID0gcmVnbm8gKHRva1sxXS5YX2FkZF9udW1iZXIpOwotCi0gIGlmIChudG9rIDwgMykKLSAgICByciA9IHhyOwotICBlbHNlCi0gICAgcnIgPSByZWdubyAodG9rWzJdLlhfYWRkX251bWJlcik7Ci0KLSAgLyogTW92ZSB0aGUgb3BlcmFuZHMgaW50byB0aGUgcmlnaHQgcGxhY2UgKi8KLSAgaWYgKHlyID09IEFYUF9SRUdfUjE2ICYmIHhyID09IEFYUF9SRUdfUjE3KQotICAgIHsKLSAgICAgIC8qIFRoZXkgYXJlIGluIGV4YWN0bHkgdGhlIHdyb25nIG9yZGVyIC0tIHN3YXAgdGhyb3VnaCBBVCAqLwotCi0gICAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQlhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19SMTYpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19BVCk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1IxNyk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1IxNik7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfUjE3KTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHlyID09IEFYUF9SRUdfUjE2KQotCXsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfUjE2KTsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfUjE3KTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0JfQotCi0gICAgICBpZiAoeHIgIT0gQVhQX1JFR19SMTYpCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgeHIpOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTYpOwotICAgICAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0JfQotCi0gICAgICBpZiAoeXIgIT0gQVhQX1JFR19SMTYgJiYgeXIgIT0gQVhQX1JFR19SMTcpCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgeXIpOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTcpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0gICAgfQotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKChjb25zdCBjaGFyICopc3ltbmFtZSk7Ci0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19BVCk7Ci0gIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIHN5bSwgMCk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgLyogQ2FsbCB0aGUgZGl2aXNpb24gcm91dGluZSAqLwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19jcHJlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzJdLCAwKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgianNyIiwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmIChyciAhPSBBWFBfUkVHX1IwKQotICAgIHsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfUjApOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgcnIpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLSAgICB9Ci19Ci0KLSNlbHNlIC8qICFPQkpfRVZBWCAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9kaXZpc2lvbiAodG9rLCBudG9rLCBzeW1uYW1lKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHN5bW5hbWU7Ci17Ci0gIC8qIERJVklTSU9OIGFuZCBNT0RVTFVTLiBZZWNoLgotICAgKiBDb252ZXJ0Ci0gICAqICAgIE9QIHgseSxyZXN1bHQKLSAgICogdG8KLSAgICogICAgbGRhIHB2LF9fT1AKLSAgICogICAgbW92IHgsdDEwCi0gICAqICAgIG1vdiB5LHQxMQotICAgKiAgICBqc3IgdDksKHB2KSxfX09QCi0gICAqICAgIG1vdiB0MTIscmVzdWx0Ci0gICAqCi0gICAqIHdpdGggYXBwcm9wcmlhdGUgb3B0aW1pemF0aW9ucyBpZiB0MTAsdDExLHQxMiBhcmUgdGhlIHJlZ2lzdGVycwotICAgKiBzcGVjaWZpZWQgYnkgdGhlIGNvbXBpbGVyLgotICAgKi8KLQotICBpbnQgeHIsIHlyLCBycjsKLSAgc3ltYm9sUyAqc3ltOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSNpZmRlZiBSRUxPQ19PUF9QCi0gIGlmIChudG9rICYmIFVTRVJfUkVMT0NfUCAodG9rW250b2stMV0uWF9vcCkpCi0gICAgewotICAgICAgY29uc3QgZXhwcmVzc2lvblMgKnJlbG9jX2V4cCA9ICZ0b2tbbnRvay0xXTsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9yZWxvY19vcF90YWcgKnIgPSBBTFBIQV9SRUxPQ19UQUJMRSAocmVsb2NfZXhwLT5YX29wKTsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IHVzZSAhJXMhJWQgd2l0aCAlcyIpLCByLT5uYW1lLAotCSAgICAgIChpbnQpcmVsb2NfZXhwLT5YX2FkZF9udW1iZXIsIChjb25zdCBjaGFyICopc3ltbmFtZSk7Ci0gICAgICBudG9rLS07Ci0gICAgfQotI2VuZGlmCi0KLSAgeHIgPSByZWdubyAodG9rWzBdLlhfYWRkX251bWJlcik7Ci0gIHlyID0gcmVnbm8gKHRva1sxXS5YX2FkZF9udW1iZXIpOwotCi0gIGlmIChudG9rIDwgMykKLSAgICByciA9IHhyOwotICBlbHNlCi0gICAgcnIgPSByZWdubyAodG9rWzJdLlhfYWRkX251bWJlcik7Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNvbnN0IGNoYXIgKilzeW1uYW1lKTsKLQotICAvKiBNb3ZlIHRoZSBvcGVyYW5kcyBpbnRvIHRoZSByaWdodCBwbGFjZSAqLwotICBpZiAoeXIgPT0gQVhQX1JFR19UMTAgJiYgeHIgPT0gQVhQX1JFR19UMTEpCi0gICAgewotICAgICAgLyogVGhleSBhcmUgaW4gZXhhY3RseSB0aGUgd3Jvbmcgb3JkZXIgLS0gc3dhcCB0aHJvdWdoIEFUICovCi0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDExKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTEpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoeXIgPT0gQVhQX1JFR19UMTApCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UMTApOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTEpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0KLSAgICAgIGlmICh4ciAhPSBBWFBfUkVHX1QxMCkKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB4cik7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMCk7Ci0gICAgICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0KLSAgICAgIGlmICh5ciAhPSBBWFBfUkVHX1QxMCAmJiB5ciAhPSBBWFBfUkVHX1QxMSkKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB5cik7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMSk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCX0KLSAgICB9Ci0KLSAgLyogQ2FsbCB0aGUgZGl2aXNpb24gcm91dGluZSAqLwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgc3ltLCAwKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgianNyIiwgbmV3dG9rLCAyLCAxKTsKLQotICAvKiBSZWxvYWQgdGhlIEdQIHJlZ2lzdGVyICovCi0jaWZkZWYgT0JKX0FPVVQKLUZJWE1FCi0jZW5kaWYKLSNpZiBkZWZpbmVkKE9CSl9FQ09GRikgfHwgZGVmaW5lZChPQkpfRUxGKQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX1Q5KTsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRncCIsIG5ld3RvaywgMywgMSk7Ci0jZW5kaWYKLQotICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmIChyciAhPSBBWFBfUkVHX1QxMikKLSAgICB7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMik7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBycik7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qICFPQkpfRVZBWCAqLwotCi0vKiBUaGUganNyIGFuZCBqbXAgbWFjcm9zIGRpZmZlciBmcm9tIHRoZWlyIGluc3RydWN0aW9uIGNvdW50ZXJwYXJ0cwotICAgaW4gdGhhdCB0aGV5IGNhbiBsb2FkIHRoZSB0YXJnZXQgYWRkcmVzcyBhbmQgZGVmYXVsdCBtb3N0Ci0gICBldmVyeXRoaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfanNyam1wICh0b2ssIG50b2ssIHZvcG5hbWUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdm9wbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqb3BuYW1lID0gKGNvbnN0IGNoYXIgKikgdm9wbmFtZTsKLSAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotICBpbnQgciwgdG9raWR4ID0gMCwgbGl0dXNlID0gMDsKLQotI2lmZGVmIFJFTE9DX09QX1AKLSAgaWYgKG50b2sgJiYgVVNFUl9SRUxPQ19QICh0b2tbbnRvay0xXS5YX29wKSkKLSAgICB7Ci0gICAgICBjb25zdCBleHByZXNzaW9uUyAqcmVsb2NfZXhwID0gJnRva1tudG9rLTFdOwotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX3JlbG9jX29wX3RhZyAqciA9IEFMUEhBX1JFTE9DX1RBQkxFIChyZWxvY19leHAtPlhfb3ApOwotICAgICAgYXNfYmFkIChfKCJDYW5ub3QgdXNlICElcyElZCB3aXRoICVzIiksIHItPm5hbWUsCi0JICAgICAgKGludClyZWxvY19leHAtPlhfYWRkX251bWJlciwgb3BuYW1lKTsKLSAgICAgIG50b2stLTsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fcmVnaXN0ZXIpCi0gICAgciA9IHJlZ25vICh0b2tbdG9raWR4KytdLlhfYWRkX251bWJlcik7Ci0gIGVsc2UKLSAgICByID0gc3RyY21wIChvcG5hbWUsICJqbXAiKSA9PSAwID8gQVhQX1JFR19aRVJPIDogQVhQX1JFR19SQTsKLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCByKTsKLQotICBpZiAodG9raWR4IDwgbnRvayAmJgotICAgICAgKHRva1t0b2tpZHhdLlhfb3AgPT0gT19wcmVnaXN0ZXIgfHwgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX2NwcmVnaXN0ZXIpKQotICAgIHIgPSByZWdubyAodG9rW3Rva2lkeCsrXS5YX2FkZF9udW1iZXIpOwotI2lmZGVmIE9CSl9FVkFYCi0gIC8qIGtlZXAgcmVnaXN0ZXIgaWYganNyICRuLjxzeW0+ICAqLwotI2Vsc2UKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBiYXNlcmVnID0gYWxwaGFfZ3BfcmVnaXN0ZXI7Ci0gICAgICBsaXR1c2UgPSBsb2FkX2V4cHJlc3Npb24gKHIgPSBBWFBfUkVHX1BWLCAmdG9rW3Rva2lkeF0sICZiYXNlcmVnLCBOVUxMLAotCQkJCShjb25zdCBleHByZXNzaW9uUyAqKTApOwotICAgIH0KLSNlbmRpZgotCi0gIHNldF90b2tfY3ByZWcgKG5ld3Rva1sxXSwgcik7Ci0KLSNpZmRlZiBPQkpfRVZBWAotICAvKiBGSVhNRTogQWRkIGhpbnQgcmVsb2NzIHRvIEJGRCBmb3IgZXZheC4gICovCi0jZWxzZQotICBpZiAodG9raWR4IDwgbnRvaykKLSAgICBuZXd0b2tbMl0gPSB0b2tbdG9raWR4XTsKLSAgZWxzZQotI2VuZGlmCi0gICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzJdLCAwKTsKLQotICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAob3BuYW1lLCBuZXd0b2ssIDMsICZpbnNuKTsKLQotICAvKiBhZGQgdGhlIExJVFVTRSBmaXh1cCAqLwotICBpZiAobGl0dXNlKQotICAgIHsKLSAgICAgIGFzc2VydCAoaW5zbi5uZml4dXBzIDwgTUFYX0lOU05fRklYVVBTKTsKLSAgICAgIGlmIChpbnNuLm5maXh1cHMgPiAwKQotCXsKLQkgIG1lbW1vdmUgKCZpbnNuLmZpeHVwc1sxXSwgJmluc24uZml4dXBzWzBdLAotCQkgICBzaXplb2Yoc3RydWN0IGFscGhhX2ZpeHVwKSAqIGluc24ubmZpeHVwcyk7Ci0JfQotICAgICAgaW5zbi5uZml4dXBzKys7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sIChub3dfc2VnKTsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIgPSBMSVRVU0VfSlNSOwotICAgIH0KLQotICBlbWl0X2luc24gKCZpbnNuKTsKLX0KLQotLyogVGhlIHJldCBhbmQgamNyIGluc3RydWN0aW9ucyBkaWZmZXIgZnJvbSB0aGVpciBpbnN0cnVjdGlvbgotICAgY291bnRlcnBhcnRzIGluIHRoYXQgZXZlcnl0aGluZyBjYW4gYmUgZGVmYXVsdGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfcmV0amNyICh0b2ssIG50b2ssIHZvcG5hbWUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdm9wbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqb3BuYW1lID0gKGNvbnN0IGNoYXIgKil2b3BuYW1lOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0gIGludCByLCB0b2tpZHggPSAwOwotCi0jaWZkZWYgUkVMT0NfT1BfUAotICBpZiAobnRvayAmJiBVU0VSX1JFTE9DX1AgKHRva1tudG9rLTFdLlhfb3ApKQotICAgIHsKLSAgICAgIGNvbnN0IGV4cHJlc3Npb25TICpyZWxvY19leHAgPSAmdG9rW250b2stMV07Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfcmVsb2Nfb3BfdGFnICpyID0gQUxQSEFfUkVMT0NfVEFCTEUgKHJlbG9jX2V4cC0+WF9vcCk7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCB1c2UgISVzISVkIHdpdGggJXMiKSwgci0+bmFtZSwKLQkgICAgICAoaW50KXJlbG9jX2V4cC0+WF9hZGRfbnVtYmVyLCBvcG5hbWUpOwotICAgICAgbnRvay0tOwotICAgIH0KLSNlbmRpZgotCi0gIGlmICh0b2tpZHggPCBudG9rICYmIHRva1t0b2tpZHhdLlhfb3AgPT0gT19yZWdpc3RlcikKLSAgICByID0gcmVnbm8gKHRva1t0b2tpZHgrK10uWF9hZGRfbnVtYmVyKTsKLSAgZWxzZQotICAgIHIgPSBBWFBfUkVHX1pFUk87Ci0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgcik7Ci0KLSAgaWYgKHRva2lkeCA8IG50b2sgJiYKLSAgICAgICh0b2tbdG9raWR4XS5YX29wID09IE9fcHJlZ2lzdGVyIHx8IHRva1t0b2tpZHhdLlhfb3AgPT0gT19jcHJlZ2lzdGVyKSkKLSAgICByID0gcmVnbm8gKHRva1t0b2tpZHgrK10uWF9hZGRfbnVtYmVyKTsKLSAgZWxzZQotICAgIHIgPSBBWFBfUkVHX1JBOwotCi0gIHNldF90b2tfY3ByZWcgKG5ld3Rva1sxXSwgcik7Ci0KLSAgaWYgKHRva2lkeCA8IG50b2spCi0gICAgbmV3dG9rWzJdID0gdG9rW3Rva2lkeF07Ci0gIGVsc2UKLSAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMl0sIHN0cmNtcChvcG5hbWUsICJyZXQiKSA9PSAwKTsKLQotICBhc3NlbWJsZV90b2tlbnMgKG9wbmFtZSwgbmV3dG9rLCAzLCAwKTsKLX0KLQwKLS8qIEFzc2VtYmxlciBkaXJlY3RpdmVzICovCi0KLS8qIEhhbmRsZSB0aGUgLnRleHQgcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgY2xlYXJzIGFscGhhX2luc25fbGFiZWwgYW5kIHJlc3RvcmVzIGF1dG8gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfdGV4dCAoaSkKLSAgICAgaW50IGk7Ci0KLXsKLSAgc190ZXh0IChpKTsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOwotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLX0KLQotLyogSGFuZGxlIHRoZSAuZGF0YSBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgYWxwaGFfaW5zbl9sYWJlbCBhbmQgcmVzdG9yZXMgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9kYXRhIChpKQotICAgICBpbnQgaTsKLXsKLSAgc19kYXRhIChpKTsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOwotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLX0KLQotI2lmIGRlZmluZWQgKE9CSl9FQ09GRikgfHwgZGVmaW5lZCAoT0JKX0VWQVgpCi0KLS8qIEhhbmRsZSB0aGUgT1NGLzEgYW5kIG9wZW5WTVMgLmNvbW0gcHNldWRvIHF1aXJrcy4KLSAgIG9wZW5WTVMgY29uc3RydWN0cyBhIHNlY3Rpb24gZm9yIGV2ZXJ5IGNvbW1vbiBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9jb21tIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgYzsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgb2Zmc2V0VCB0ZW1wOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgc2VnVCBjdXJyZW50X3NlY3Rpb24gPSBub3dfc2VnOwotICBpbnQgY3VycmVudF9zdWJzZWMgPSBub3dfc3Vic2VnOwotICBzZWdUIG5ld19zZWc7Ci0jZW5kaWYKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgLyogQWxwaGEgT1NGLzEgY29tcGlsZXIgZG9lc24ndCBwcm92aWRlIHRoZSBjb21tYSwgZ2NjIGRvZXMuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5DT01Nb24gbGVuZ3RoICglbGQuKSA8MCEgSWdub3JlZC4iKSwgKGxvbmcpIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSNpZmRlZiBPQkpfRVZBWAotICAvKiBNYWtlIGEgc2VjdGlvbiBmb3IgdGhlIGNvbW1vbiBzeW1ib2wuICAqLwotICBuZXdfc2VnID0gc3Vic2VnX25ldyAoeHN0cmR1cCAobmFtZSksIDApOwotI2VuZGlmCi0KLSAgKnAgPSBjOwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgLyogYWxpZ25tZW50IG1pZ2h0IGZvbGxvdyAgKi8KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIG9mZnNldFQgYWxpZ247Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOyAgICAgIAotICAgICAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgbmV3X3NlZywgYWxpZ24pOwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBPQkpfRVZBWAotICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBuZXdfc2VnKSA+IDApCi0gICAgeyAKLSAgICAgIGlmIChiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIG5ld19zZWcpICE9IHRlbXApCi0JYXNfYmFkIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIiksCi0JCVNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkobG9uZykgYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBuZXdfc2VnKSwKLQkJKGxvbmcpIHRlbXApOwotICAgIH0KLSNlbHNlCi0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAodmFsdWVUKSB0ZW1wKQotCWFzX2JhZCAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIpLAotCQlTX0dFVF9OQU1FIChzeW1ib2xQKSwKLQkJKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwKLQkJKGxvbmcpIHRlbXApOwotICAgIH0KLSNlbmRpZgotICBlbHNlCi0gICAgewotI2lmZGVmIE9CSl9FVkFYIAotICAgICAgc3Vic2VnX3NldCAobmV3X3NlZywgMCk7Ci0gICAgICBwID0gZnJhZ19tb3JlICh0ZW1wKTsKLSAgICAgIG5ld19zZWctPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICBpZiAoISBTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCVNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIG5ld19zZWcpOwotI2Vsc2UKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSB0ZW1wKTsKLSNlbmRpZgotICAgICAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotICAgIH0KLQotI2lmZGVmIE9CSl9FVkFYCi0gIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VjdGlvbiwgY3VycmVudF9zdWJzZWMpOwotI2VuZGlmCi0KLSAga25vdyAoc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSA9PSAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLSNlbmRpZiAvKiAhIE9CSl9FTEYgKi8KLQotI2lmZGVmIE9CSl9FQ09GRgotCi0vKiBIYW5kbGUgdGhlIC5yZGF0YSBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgYWxwaGFfaW5zbl9sYWJlbCBhbmQgcmVzdG9yZXMgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9yZGF0YSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgdGVtcDsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19uZXcgKCIucmRhdGEiLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOwotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLX0KLQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUNPRkYKLQotLyogSGFuZGxlIHRoZSAuc2RhdGEgcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgY2xlYXJzIGFscGhhX2luc25fbGFiZWwgYW5kIHJlc3RvcmVzIGF1dG8gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfc2RhdGEgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IHRlbXA7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfbmV3ICgiLnNkYXRhIiwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLQotLyogSGFuZGxlIHRoZSAuc2VjdGlvbiBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgYWxwaGFfaW5zbl9sYWJlbCBhbmQgcmVzdG9yZXMgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIG9ial9lbGZfc2VjdGlvbiAoaWdub3JlKTsKLQotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9lbnQgKGR1bW15KQotICAgICBpbnQgZHVtbXkgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBlY29mZl9kaXJlY3RpdmVfZW50ICgwKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKm5hbWUsIG5hbWVfZW5kOwotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgICAgIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKCpuYW1lKSkKLQl7Ci0JICBhc193YXJuIChfKCIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gbmFtZSIpKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltYm9sUyAqc3ltOwotCi0JICBpZiAoYWxwaGFfY3VyX2VudF9zeW0pCi0JICAgIGFzX3dhcm4gKF8oIm5lc3RlZCAuZW50IGRpcmVjdGl2ZXMiKSk7Ci0KLQkgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgIGFscGhhX2N1cl9lbnRfc3ltID0gc3ltOwotCi0JICAvKiBUaGUgLmVudCBkaXJlY3RpdmUgaXMgc29tZXRpbWVzIGZvbGxvd2VkIGJ5IGEgbnVtYmVyLiAgTm90IHN1cmUKLQkgICAgIHdoYXQgaXQgcmVhbGx5IG1lYW5zLCBidXQgaWdub3JlIGl0LiAgKi8KLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgfQotCSAgaWYgKGlzZGlnaXQgKCppbnB1dF9saW5lX3BvaW50ZXIpIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotCSAgICAodm9pZCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JfQotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2VuZCAoZHVtbXkpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX2RpcmVjdGl2ZV9lbmQgKDApOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqbmFtZSwgbmFtZV9lbmQ7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgaWYgKCEgaXNfbmFtZV9iZWdpbm5lciAoKm5hbWUpKQotCXsKLQkgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIikpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpzeW07Ci0KLQkgIHN5bSA9IHN5bWJvbF9maW5kIChuYW1lKTsKLQkgIGlmIChzeW0gIT0gYWxwaGFfY3VyX2VudF9zeW0pCi0JICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIG5hbWVzIGRpZmZlcmVudCBzeW1ib2wgdGhhbiAuZW50IikpOwotCi0JICAvKiBDcmVhdGUgYW4gZXhwcmVzc2lvbiB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgIGlmIChzeW0pCi0JICAgIHsKLQkgICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZSA9Ci0JCShleHByZXNzaW9uUyAqKSB4bWFsbG9jIChzaXplb2YgKGV4cHJlc3Npb25TKSk7Ci0JICAgICAgc3ltYm9sX2dldF9vYmogKHN5bSktPnNpemUtPlhfb3AgPSBPX3N1YnRyYWN0OwotCSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplLT5YX2FkZF9zeW1ib2wKLQkgICAgICAgID0gc3ltYm9sX25ldyAoIkwwXDAwMSIsIG5vd19zZWcsIGZyYWdfbm93X2ZpeCAoKSwgZnJhZ19ub3cpOwotCSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplLT5YX29wX3N5bWJvbCA9IHN5bTsKLQkgICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZS0+WF9hZGRfbnVtYmVyID0gMDsKLQkgICAgfQotCi0JICBhbHBoYV9jdXJfZW50X3N5bSA9IE5VTEw7Ci0KLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQl9Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfbWFzayAoZnApCi0gICAgIGludCBmcDsKLXsKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICB7Ci0gICAgICBpZiAoZnApCi0gICAgICAgIGVjb2ZmX2RpcmVjdGl2ZV9mbWFzayAoMCk7Ci0gICAgICBlbHNlCi0gICAgICAgIGVjb2ZmX2RpcmVjdGl2ZV9tYXNrICgwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBkaXNjYXJkX3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZnJhbWUgKGR1bW15KQotICAgICBpbnQgZHVtbXkgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBlY29mZl9kaXJlY3RpdmVfZnJhbWUgKDApOwotICBlbHNlCi0gICAgZGlzY2FyZF9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3Byb2xvZ3VlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ltYm9sUyAqc3ltOwotICBpbnQgYXJnOwotCi0gIGFyZyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgc3ltID0gZWNvZmZfZ2V0X2N1cl9wcm9jX3N5bSAoKTsKLSAgZWxzZQotICAgIHN5bSA9IGFscGhhX2N1cl9lbnRfc3ltOwotICBrbm93IChzeW0gIT0gTlVMTCk7Ci0KLSAgc3dpdGNoIChhcmcpCi0gICAgewotICAgICAgY2FzZSAwOiAvKiBObyBQViByZXF1aXJlZC4gICovCi0JU19TRVRfT1RIRVIgKHN5bSwgU1RPX0FMUEhBX05PUFYpOwotCWJyZWFrOwotICAgICAgY2FzZSAxOiAvKiBTdGQgR1AgbG9hZC4gICovCi0JU19TRVRfT1RIRVIgKHN5bSwgU1RPX0FMUEhBX1NURF9HUExPQUQpOwotCWJyZWFrOwotICAgICAgY2FzZSAyOiAvKiBOb24tc3RkIHVzZSBvZiBQVi4gICovCi0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JYXNfYmFkIChfKCJJbnZhbGlkIGFyZ3VtZW50ICVkIHRvIC5wcm9sb2d1ZS4iKSwgYXJnKTsKLQlicmVhazsKLSAgICB9ICAKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfY29mZl93cmFwcGVyICh3aGljaCkKLSAgICAgaW50IHdoaWNoOwotewotICBzdGF0aWMgdm9pZCAoKiBjb25zdCBmbnNbXSkgUEFSQU1TICgoaW50KSkgPSB7Ci0gICAgZWNvZmZfZGlyZWN0aXZlX2JlZ2luLAotICAgIGVjb2ZmX2RpcmVjdGl2ZV9iZW5kLAotICAgIGVjb2ZmX2RpcmVjdGl2ZV9kZWYsCi0gICAgZWNvZmZfZGlyZWN0aXZlX2RpbSwKLSAgICBlY29mZl9kaXJlY3RpdmVfZW5kZWYsCi0gICAgZWNvZmZfZGlyZWN0aXZlX2ZpbGUsCi0gICAgZWNvZmZfZGlyZWN0aXZlX3NjbCwKLSAgICBlY29mZl9kaXJlY3RpdmVfdGFnLAotICAgIGVjb2ZmX2RpcmVjdGl2ZV92YWwsCi0gICAgZWNvZmZfZGlyZWN0aXZlX2xvYywKLSAgfTsKLQotICBhc3NlcnQgKHdoaWNoID49IDAgJiYgd2hpY2ggPCAoaW50KShzaXplb2YoZm5zKS9zaXplb2YoKmZucykpKTsKLQotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgICgqZm5zW3doaWNoXSkoMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkVDT0ZGIGRlYnVnZ2luZyBpcyBkaXNhYmxlZC4iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLX0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLSNpZmRlZiBPQkpfRVZBWAotICAKLS8qIEhhbmRsZSB0aGUgc2VjdGlvbiBzcGVjaWZpYyBwc2V1ZG8tb3AuICAqLwotICAKLXN0YXRpYyB2b2lkCi1zX2FscGhhX3NlY3Rpb24gKHNlY2lkKQotICAgICBpbnQgc2VjaWQ7Ci17Ci0gIGludCB0ZW1wOwotI2RlZmluZSBFVkFYX1NFQ1RJT05fQ09VTlQgNQotICBzdGF0aWMgY2hhciAqc2VjdGlvbl9uYW1lW0VWQVhfU0VDVElPTl9DT1VOVCsxXSA9Ci0gICAgeyAiTlVMTCIsICIucmRhdGEiLCAiLmNvbW0iLCAiLmxpbmsiLCAiLmN0b3JzIiwgIi5kdG9ycyIgfTsKLQotICBpZiAoKHNlY2lkIDw9IDApIHx8IChzZWNpZCA+IEVWQVhfU0VDVElPTl9DT1VOVCkpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIlVua25vd24gc2VjdGlvbiBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfbmV3IChzZWN0aW9uX25hbWVbc2VjaWRdLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOwotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLX0KLQotCi0vKiBQYXJzZSAuZW50IGRpcmVjdGl2ZXMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9lbnQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sOwotICBleHByZXNzaW9uUyBzeW1leHByOwotCi0gIGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCA9IDA7Ci0gIGFscGhhX2V2YXhfcHJvYy5mcmFtZXJlZyA9IC0xOwotICBhbHBoYV9ldmF4X3Byb2MuZnJhbWVzaXplID0gMDsKLSAgYWxwaGFfZXZheF9wcm9jLnJzYV9vZmZzZXQgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MucmFfc2F2ZSA9IEFYUF9SRUdfUkE7Ci0gIGFscGhhX2V2YXhfcHJvYy5mcF9zYXZlID0gLTE7Ci0gIGFscGhhX2V2YXhfcHJvYy5pbWFzayA9IDA7Ci0gIGFscGhhX2V2YXhfcHJvYy5mbWFzayA9IDA7Ci0gIGFscGhhX2V2YXhfcHJvYy5wcm9sb2d1ZSA9IDA7Ci0gIGFscGhhX2V2YXhfcHJvYy50eXBlID0gMDsKLQotICBleHByZXNzaW9uICgmc3ltZXhwcik7Ci0KLSAgaWYgKHN5bWV4cHIuWF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiLmVudCBkaXJlY3RpdmUgaGFzIG5vIHN5bWJvbCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZzeW1leHByKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLSAgYWxwaGFfZXZheF9wcm9jLnN5bWJvbCA9IHN5bWJvbDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICByZXR1cm47Ci19Ci0KLQotLyogUGFyc2UgLmZyYW1lIDxmcmFtcmVnPiw8ZnJhbWVzaXplPixSQSw8cnNhX29mZnNldD4gZGlyZWN0aXZlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2ZyYW1lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotCi0gIGFscGhhX2V2YXhfcHJvYy5mcmFtZXJlZyA9IHRjX2dldF9yZWdpc3RlciAoMSk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICcsJwotICAgICAgfHwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLmZyYW1lIGRpcmVjdGl2ZSAxLi8yLiBwYXJhbSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYWxwaGFfZXZheF9wcm9jLmZyYW1lc2l6ZSA9IHZhbDsKLQotICAodm9pZCkgdGNfZ2V0X3JlZ2lzdGVyICgxKTsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLmZyYW1lIGRpcmVjdGl2ZSAzLi80LiBwYXJhbSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGFscGhhX2V2YXhfcHJvYy5yc2Ffb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9wZGVzYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVfZW5kOwotICBsb25nIHZhbDsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBzeW1ib2xTICplbnRyeV9zeW07Ci0gIGZpeFMgKmZpeHA7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKGFscGhhX2xpbmtfc2VjdGlvbik7Ci0KLSAgaWYgKG5vd19zZWcgIT0gYWxwaGFfbGlua19zZWN0aW9uKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLnBkZXNjIGRpcmVjdGl2ZSBub3QgaW4gbGluayAoLmxpbmspIHNlY3Rpb24iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoKGFscGhhX2V2YXhfcHJvYy5zeW1ib2wgPT0gMCkKLSAgICAgIHx8ICghU19JU19ERUZJTkVEIChhbHBoYV9ldmF4X3Byb2Muc3ltYm9sKSkpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIi5wZGVzYyBoYXMgbm8gbWF0Y2hpbmcgLmVudCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICpzeW1ib2xfZ2V0X29iaiAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCkgPQotICAgICh2YWx1ZVQpIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplOwotCi0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnBkZXNjIGRpcmVjdGl2ZSBoYXMgbm8gZW50cnkgc3ltYm9sIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZW50cnlfc3ltID0gbWFrZV9leHByX3N5bWJvbCAoJmV4cCk7Ci0gIC8qIFNhdmUgYmZkIHN5bWJvbCBvZiBwcm9jIGRlc2MgaW4gZnVuY3Rpb24gc3ltYm9sLiAgKi8KLSAgc3ltYm9sX2dldF9iZmRzeW0gKGFscGhhX2V2YXhfcHJvYy5zeW1ib2wpLT51ZGF0YS5wCi0gICAgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZW50cnlfc3ltKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIk5vIGNvbW1hIGFmdGVyIC5wZGVzYyA8ZW50cnluYW1lPiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoc3RybmNtcChuYW1lLCAic3RhY2siLCA1KSA9PSAwKQotICAgIHsKLSAgICAgIGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCA9IFBEU0NfU19LX0tJTkRfRlBfU1RBQ0s7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wKG5hbWUsICJyZWciLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCA9IFBEU0NfU19LX0tJTkRfRlBfUkVHSVNURVI7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wKG5hbWUsICJudWxsIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPSBQRFNDX1NfS19LSU5EX05VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oInVua25vd24gcHJvY2VkdXJlIGtpbmQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGZyYWdfYWxpZ24gKDMsIDAsIDApOwotICBwID0gZnJhZ19tb3JlICgxNik7Ci0gIGZpeHAgPSBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCAwLCAwLCAwLCAwKTsKLSAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IDE2OwotCi0gICpwID0gYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kCi0gICAgICAgfCAoKGFscGhhX2V2YXhfcHJvYy5mcmFtZXJlZyA9PSAyOSkgPyBQRFNDX1NfTV9CQVNFX1JFR19JU19GUCA6IDApOwotICAqKHArMSkgPSBQRFNDX1NfTV9OQVRJVkUKLQkgICB8IFBEU0NfU19NX05PX0pBQ0tFVDsKLQotICBzd2l0Y2ggKGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCkKLSAgICB7Ci0gICAgICBjYXNlIFBEU0NfU19LX0tJTkRfTlVMTDoKLQkqKHArMikgPSAwOwotCSoocCszKSA9IDA7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFBEU0NfU19LX0tJTkRfRlBfUkVHSVNURVI6Ci0JKihwKzIpID0gYWxwaGFfZXZheF9wcm9jLmZwX3NhdmU7Ci0JKihwKzMpID0gYWxwaGFfZXZheF9wcm9jLnJhX3NhdmU7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFBEU0NfU19LX0tJTkRfRlBfU1RBQ0s6Ci0JbWRfbnVtYmVyX3RvX2NoYXJzIChwKzIsICh2YWx1ZVQpYWxwaGFfZXZheF9wcm9jLnJzYV9vZmZzZXQsIDIpOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoJCS8qIGltcG9zc2libGUgKi8KLQlicmVhazsKLSAgICB9Ci0KLSAgKihwKzQpID0gMDsKLSAgKihwKzUpID0gYWxwaGFfZXZheF9wcm9jLnR5cGUgJiAweDBmOwotCi0gIC8qIFNpZ25hdHVyZSBvZmZzZXQuICAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHArNiwgKHZhbHVlVCkwLCAyKTsKLQotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAtZnJhZ19ub3ctPmZyX2xpdGVyYWwrOCwgOCwgJmV4cCwgMCwgQkZEX1JFTE9DXzY0KTsKLQotICBpZiAoYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kID09IFBEU0NfU19LX0tJTkRfTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogQWRkIGR1bW15IGZpeCB0byBtYWtlIGFkZF90b19saW5rX3Bvb2wgd29yay4gICovCi0gIHAgPSBmcmFnX21vcmUgKDgpOwotICBmaXhwID0gZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgMCwgMCwgMCwgMCk7Ci0gIGZpeHAtPmZ4X2RvbmUgPSAxOwotICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSA4OwotCi0gIC8qIHBkZXNjKzE2OiBTaXplLiAgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKWFscGhhX2V2YXhfcHJvYy5mcmFtZXNpemUsIDQpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAocCs0LCAodmFsdWVUKTAsIDIpOwotCi0gIC8qIEVudHJ5IGxlbmd0aC4gICovCi0gIG1kX251bWJlcl90b19jaGFycyAocCs2LCBhbHBoYV9ldmF4X3Byb2MucHJvbG9ndWUsIDIpOwotCi0gIGlmIChhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPT0gUERTQ19TX0tfS0lORF9GUF9SRUdJU1RFUikKLSAgICByZXR1cm47Ci0KLSAgLyogQWRkIGR1bW15IGZpeCB0byBtYWtlIGFkZF90b19saW5rX3Bvb2wgd29yay4gICovCi0gIHAgPSBmcmFnX21vcmUgKDgpOwotICBmaXhwID0gZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgMCwgMCwgMCwgMCk7Ci0gIGZpeHAtPmZ4X2RvbmUgPSAxOwotICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSA4OwotCi0gIC8qIHBkZXNjKzI0OiByZWdpc3RlciBtYXNrcy4gICovCi0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBhbHBoYV9ldmF4X3Byb2MuaW1hc2ssIDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHArNCwgYWxwaGFfZXZheF9wcm9jLmZtYXNrLCA0KTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogU3VwcG9ydCBmb3IgY3Jhc2ggZGVidWcgb24gdm1zLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfbmFtZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBjaGFyICpwOwotICBleHByZXNzaW9uUyBleHA7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKGFscGhhX2xpbmtfc2VjdGlvbik7Ci0KLSAgaWYgKG5vd19zZWcgIT0gYWxwaGFfbGlua19zZWN0aW9uKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLm5hbWUgZGlyZWN0aXZlIG5vdCBpbiBsaW5rICgubGluaykgc2VjdGlvbiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLm5hbWUgZGlyZWN0aXZlIGhhcyBubyBzeW1ib2wiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBmcmFnX2FsaWduICgzLCAwLCAwKTsKLSAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0gIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IDg7Ci0KLSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwLWZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCAmZXhwLCAwLCBCRkRfUkVMT0NfNjQpOwotCi0gIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9saW5rYWdlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgY2hhciAqcDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiTm8gc3ltYm9sIGFmdGVyIC5saW5rYWdlIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHAgPSBmcmFnX21vcmUgKExLUF9TX0tfU0laRSk7Ci0gICAgICBtZW1zZXQgKHAsIDAsIExLUF9TX0tfU0laRSk7Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgTEtQX1NfS19TSVpFLCAmZXhwLCAwLFwKLQkJICAgQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfY29kZV9hZGRyZXNzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgY2hhciAqcDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiTm8gc3ltYm9sIGFmdGVyIC5jb2RlX2FkZHJlc3MiKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0gICAgICBtZW1zZXQgKHAsIDAsIDgpOwotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDgsICZleHAsIDAsXAotCQkgICBCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFIpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZnBfc2F2ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotCi0gIGFscGhhX2V2YXhfcHJvYy5mcF9zYXZlID0gdGNfZ2V0X3JlZ2lzdGVyICgxKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfbWFzayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLm1hc2sgZGlyZWN0aXZlIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWxwaGFfZXZheF9wcm9jLmltYXNrID0gdmFsOwotICAgICAgKHZvaWQpZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9mbWFzayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLmZtYXNrIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFscGhhX2V2YXhfcHJvYy5mbWFzayA9IHZhbDsKLSAgICAgICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9lbmQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciBjOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIGFscGhhX2V2YXhfcHJvYy5zeW1ib2wgPSAwOwotCi0gIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9maWxlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnM7Ci0gIGludCBsZW5ndGg7Ci0gIHN0YXRpYyBjaGFyIGNhc2VfaGFja1szMl07Ci0KLSAgZXh0ZXJuIGNoYXIgKmRlbWFuZF9jb3B5X3N0cmluZyBQQVJBTVMgKChpbnQgKmxlblApKTsKLQotICBzcHJpbnRmIChjYXNlX2hhY2ssICI8Q0FTRTolMDFkJTAxZD4iLAotCSAgIGFscGhhX2ZsYWdfaGFzaF9sb25nX25hbWVzLCBhbHBoYV9mbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpOwotCi0gIHMgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChjYXNlX2hhY2spOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAocyktPmZsYWdzIHw9IEJTRl9GSUxFOwotCi0gIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoZGVtYW5kX2NvcHlfc3RyaW5nICgmbGVuZ3RoKSk7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzKS0+ZmxhZ3MgfD0gQlNGX0ZJTEU7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgcmV0dXJuOwotfQotI2VuZGlmIC8qIE9CSl9FVkFYICAqLwotCi0vKiBIYW5kbGUgdGhlIC5ncHJlbDMyIHBzZXVkbyBvcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2dwcmVsMzIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBleHByZXNzaW9uUyBlOwotICBjaGFyICpwOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgZXhwcmVzc2lvbiAoJmUpOwotCi0jaWZkZWYgT0JKX0VMRgotICBzd2l0Y2ggKGUuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgZS5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbChhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgIGUuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgLyogRkFMTFRIUlUgKi8KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0KCk7Ci0gICAgfQotI2Vsc2UKLSNpZmRlZiBPQkpfRUNPRkYKLSAgc3dpdGNoIChlLlhfb3ApCi0gICAgewotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIGUuWF9hZGRfc3ltYm9sID0gc2VjdGlvbl9zeW1ib2wgKGFic29sdXRlX3NlY3Rpb24pOwotICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICAgIGUuWF9vcCA9IE9fc3VidHJhY3Q7Ci0gICAgICBlLlhfb3Bfc3ltYm9sID0gYWxwaGFfZ3Bfc3ltYm9sOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSNlbmRpZgotI2VuZGlmCi0KLSAgaWYgKGFscGhhX2F1dG9fYWxpZ25fb24gJiYgYWxwaGFfY3VycmVudF9hbGlnbiA8IDIpCi0gICAgYWxwaGFfYWxpZ24gKDIsIChjaGFyICopIE5VTEwsIGFscGhhX2luc25fbGFiZWwsIDApOwotICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA+IDIpCi0gICAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDI7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZW1zZXQgKHAsIDAsIDQpOwotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAtZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsCi0JICAgICAgICZlLCAwLCBCRkRfUkVMT0NfR1BSRUwzMik7Ci19Ci0KLS8qIEhhbmRsZSBmbG9hdGluZyBwb2ludCBhbGxvY2F0aW9uIHBzZXVkby1vcHMuICBUaGlzIGlzIGxpa2UgdGhlCi0gICBnZW5lcmljIHZyZXNpb24sIGJ1dCBpdCBtYWtlcyBzdXJlIHRoZSBjdXJyZW50IGxhYmVsLCBpZiBhbnksIGlzCi0gICBjb3JyZWN0bHkgYWxpZ25lZC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2Zsb2F0X2NvbnMgKHR5cGUpCi0gICAgIGludCB0eXBlOwotewotICBpbnQgbG9nX3NpemU7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgICAgbG9nX3NpemUgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdHJzoKLSAgICAgIGxvZ19zaXplID0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBsb2dfc2l6ZSA9IDQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGFscGhhX2F1dG9fYWxpZ25fb24gJiYgYWxwaGFfY3VycmVudF9hbGlnbiA8IGxvZ19zaXplKQotICAgIGFscGhhX2FsaWduIChsb2dfc2l6ZSwgKGNoYXIgKikgTlVMTCwgYWxwaGFfaW5zbl9sYWJlbCwgMCk7Ci0gIGlmIChhbHBoYV9jdXJyZW50X2FsaWduID4gbG9nX3NpemUpCi0gICAgYWxwaGFfY3VycmVudF9hbGlnbiA9IGxvZ19zaXplOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLQotICBmbG9hdF9jb25zICh0eXBlKTsKLX0KLQotLyogSGFuZGxlIHRoZSAucHJvYyBwc2V1ZG8gb3AuICBXZSBkb24ndCByZWFsbHkgZG8gbXVjaCB3aXRoIGl0IGV4Y2VwdAotICAgcGFyc2UgaXQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9wcm9jIChpc19zdGF0aWMpCi0gICAgIGludCBpc19zdGF0aWMgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgdGVtcDsKLQotICAvKiBUYWtlcyAiLnByb2MgbmFtZSxuYXJncyIgICovCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgKnAgPSAwOwotICAgICAgYXNfd2FybiAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICB0ZW1wID0gMDsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICAvKiAgKnN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKSA9IChzaWduZWQgY2hhcikgdGVtcDsgKi8KLSAgYXNfd2FybiAoXygidW5oYW5kbGVkOiAucHJvYyAlcywlZCIpLCBuYW1lLCB0ZW1wKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuc2V0IHBzZXVkbyBvcC4gIFRoaXMgaXMgdXNlZCB0byB0dXJuIG9uIGFuZCBvZmYgbW9zdCBvZgotICAgdGhlIGFzc2VtYmxlciBmZWF0dXJlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3NldCAoeCkKLSAgICAgaW50IHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZSwgY2gsICpzOwotICBpbnQgeWVzbm8gPSAxOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2ggPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBzID0gbmFtZTsKLSAgaWYgKHNbMF0gPT0gJ24nICYmIHNbMV0gPT0gJ28nKQotICAgIHsKLSAgICAgIHllc25vID0gMDsKLSAgICAgIHMgKz0gMjsKLSAgICB9Ci0gIGlmICghc3RyY21wICgicmVvcmRlciIsIHMpKQotICAgIC8qIGlnbm9yZSAqLyA7Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKCJhdCIsIHMpKQotICAgIGFscGhhX25vYXRfb24gPSAheWVzbm87Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKCJtYWNybyIsIHMpKQotICAgIGFscGhhX21hY3Jvc19vbiA9IHllc25vOwotICBlbHNlIGlmICghc3RyY21wICgibW92ZSIsIHMpKQotICAgIC8qIGlnbm9yZSAqLyA7Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKCJ2b2xhdGlsZSIsIHMpKQotICAgIC8qIGlnbm9yZSAqLyA7Ci0gIGVsc2UKLSAgICBhc193YXJuIChfKCJUcmllZCB0byAuc2V0IHVucmVjb2duaXplZCBtb2RlIGAlcyciKSwgbmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGNoOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5iYXNlIHBzZXVkbyBvcC4gIFRoaXMgY2hhbmdlcyB0aGUgYXNzZW1ibGVyJ3Mgbm90aW9uIG9mCi0gICB0aGUgJGdwIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfYmFzZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWYgMAotICBpZiAoZmlyc3RfMzJiaXRfcXVhZHJhbnQpCi0gICAgewotICAgICAgLyogbm90IGZhdGFsLCBidXQgaXQgbWlnaHQgbm90IHdvcmsgaW4gdGhlIGVuZCAqLwotICAgICAgYXNfd2FybiAoXygiRmlsZSBvdmVycmlkZXMgbm8tYmFzZS1yZWdpc3RlciBvcHRpb24uIikpOwotICAgICAgZmlyc3RfMzJiaXRfcXVhZHJhbnQgPSAwOwotICAgIH0KLSNlbmRpZgotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyQnKQotICAgIHsJCQkJLyogJHJOTiBmb3JtICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdyJykKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0KLSAgYWxwaGFfZ3BfcmVnaXN0ZXIgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKGFscGhhX2dwX3JlZ2lzdGVyIDwgMCB8fCBhbHBoYV9ncF9yZWdpc3RlciA+IDMxKQotICAgIHsKLSAgICAgIGFscGhhX2dwX3JlZ2lzdGVyID0gQVhQX1JFR19HUDsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCBiYXNlIHJlZ2lzdGVyLCB1c2luZyAkJWQuIiksIGFscGhhX2dwX3JlZ2lzdGVyKTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wLiAgVGhpcyBhbGlnbnMgdG8gYSBwb3dlciBvZiB0d28uICBJdAotICAgYWxzbyBhZGp1c3RzIGFueSBjdXJyZW50IGluc3RydWN0aW9uIGxhYmVsLiAgV2UgdHJlYXQgdGhpcyB0aGUgc2FtZQotICAgd2F5IHRoZSBNSVBTIHBvcnQgZG9lczogLmFsaWduIDAgdHVybnMgb2ZmIGF1dG8gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfYWxpZ24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgYWxpZ247Ci0gIGNoYXIgZmlsbCwgKnBmaWxsOwotICBsb25nIG1heF9hbGlnbm1lbnQgPSAxNTsKLQotICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoYWxpZ24gPiBtYXhfYWxpZ25tZW50KQotICAgIHsKLSAgICAgIGFsaWduID0gbWF4X2FsaWdubWVudDsKLSAgICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQuIGFzc3VtZWQiKSwgYWxpZ24pOwotICAgIH0KLSAgZWxzZSBpZiAoYWxpZ24gPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkFsaWdubWVudCBuZWdhdGl2ZTogMCBhc3N1bWVkIikpOwotICAgICAgYWxpZ24gPSAwOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBmaWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBwZmlsbCA9ICZmaWxsOwotICAgIH0KLSAgZWxzZQotICAgIHBmaWxsID0gTlVMTDsKLQotICBpZiAoYWxpZ24gIT0gMCkKLSAgICB7Ci0gICAgICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgICAgIGFscGhhX2FsaWduIChhbGlnbiwgcGZpbGwsIGFscGhhX2luc25fbGFiZWwsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFscGhhX2F1dG9fYWxpZ25fb24gPSAwOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIb29rIHRoZSBub3JtYWwgc3RyaW5nIHByb2Nlc3NvciB0byByZXNldCBrbm93biBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zdHJpbmdlciAodGVybWluYXRlKQotICAgICBpbnQgdGVybWluYXRlOwotewotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIHN0cmluZ2VyICh0ZXJtaW5hdGUpOwotfQotCi0vKiBIb29rIHRoZSBub3JtYWwgc3BhY2UgcHJvY2Vzc2luZyB0byByZXNldCBrbm93biBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zcGFjZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIHNfc3BhY2UgKGlnbm9yZSk7Ci19Ci0KLS8qIEhvb2sgaW50byBjb25zIGZvciBhdXRvLWFsaWdubWVudC4gICovCi0KLXZvaWQKLWFscGhhX2NvbnNfYWxpZ24gKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBpbnQgbG9nX3NpemU7Ci0KLSAgbG9nX3NpemUgPSAwOwotICB3aGlsZSAoKHNpemUgPj49IDEpICE9IDApCi0gICAgKytsb2dfc2l6ZTsKLQotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgbG9nX3NpemUpCi0gICAgYWxwaGFfYWxpZ24gKGxvZ19zaXplLCAoY2hhciAqKSBOVUxMLCBhbHBoYV9pbnNuX2xhYmVsLCAwKTsKLSAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPiBsb2dfc2l6ZSkKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gbG9nX3NpemU7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotfQotCi0vKiBIZXJlIGNvbWUgdGhlIC51d29yZCwgLnVsb25nLCBhbmQgLnVxdWFkIGV4cGxpY2l0bHkgdW5hbGlnbmVkCi0gICBwc2V1ZG9zLiAgV2UganVzdCB0dXJuIG9mZiBhdXRvLWFsaWdubWVudCBhbmQgY2FsbCBkb3duIHRvIGNvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV91Y29ucyAoYnl0ZXMpCi0gICAgIGludCBieXRlczsKLXsKLSAgaW50IGhvbGQgPSBhbHBoYV9hdXRvX2FsaWduX29uOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMDsKLSAgY29ucyAoYnl0ZXMpOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gaG9sZDsKLX0KLQotLyogU3dpdGNoIHRoZSB3b3JraW5nIGNwdSB0eXBlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfYXJjaCAoaWdub3JlZCkKLSAgICAgaW50IGlnbm9yZWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqbmFtZSwgY2g7Ci0gIGNvbnN0IHN0cnVjdCBjcHVfdHlwZSAqcDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgZm9yIChwID0gY3B1X3R5cGVzOyBwLT5uYW1lOyArK3ApCi0gICAgaWYgKHN0cmNtcChuYW1lLCBwLT5uYW1lKSA9PSAwKQotICAgICAgewotICAgICAgICBhbHBoYV90YXJnZXRfbmFtZSA9IHAtPm5hbWUsIGFscGhhX3RhcmdldCA9IHAtPmZsYWdzOwotCWdvdG8gZm91bmQ7Ci0gICAgICB9Ci0gIGFzX3dhcm4oIlVua25vd24gQ1BVIGlkZW50aWZpZXIgYCVzJyIsIG5hbWUpOwotCi1mb3VuZDoKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGNoOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0MCi0KLSNpZmRlZiBERUJVRzEKLS8qIHByaW50IHRva2VuIGV4cHJlc3Npb24gd2l0aCBhbHBoYSBzcGVjaWZpYyBleHRlbnNpb24uICAqLwotCi1zdGF0aWMgdm9pZAotYWxwaGFfcHJpbnRfdG9rZW4oZiwgZXhwKQotICAgIEZJTEUgKmY7Ci0gICAgY29uc3QgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgc3dpdGNoIChleHAtPlhfb3ApCi0gICAgewotICAgICAgY2FzZSBPX2NwcmVnaXN0ZXI6Ci0JcHV0YyAoJywnLCBmKTsKLQkvKiBGQUxMVEhSVSAqLwotICAgICAgY2FzZSBPX3ByZWdpc3RlcjoKLQlwdXRjICgnKCcsIGYpOwotCXsKLQkgIGV4cHJlc3Npb25TIG5leHAgPSAqZXhwOwotCSAgbmV4cC5YX29wID0gT19yZWdpc3RlcjsKLQkgIHByaW50X2V4cHIgKGYsICZuZXhwKTsKLQl9Ci0JcHV0YyAoJyknLCBmKTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JcHJpbnRfZXhwciAoZiwgZXhwKTsKLQlicmVhazsKLSAgICB9Ci0gIHJldHVybjsKLX0KLSNlbmRpZgotDAotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotI2lmZGVmIE9CSl9FQ09GRgotICB7ImNvbW0iLCBzX2FscGhhX2NvbW0sIDB9LAkvKiBvc2YxIGNvbXBpbGVyIGRvZXMgdGhpcyAqLwotICB7InJkYXRhIiwgc19hbHBoYV9yZGF0YSwgMH0sCi0jZW5kaWYKLSAgeyJ0ZXh0Iiwgc19hbHBoYV90ZXh0LCAwfSwKLSAgeyJkYXRhIiwgc19hbHBoYV9kYXRhLCAwfSwKLSNpZmRlZiBPQkpfRUNPRkYKLSAgeyJzZGF0YSIsIHNfYWxwaGFfc2RhdGEsIDB9LAotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICB7InNlY3Rpb24iLCBzX2FscGhhX3NlY3Rpb24sIDB9LAotICB7InNlY3Rpb24ucyIsIHNfYWxwaGFfc2VjdGlvbiwgMH0sCi0gIHsic2VjdCIsIHNfYWxwaGFfc2VjdGlvbiwgMH0sCi0gIHsic2VjdC5zIiwgc19hbHBoYV9zZWN0aW9uLCAwfSwKLSNlbmRpZgotI2lmZGVmIE9CSl9FVkFYCi0gIHsgInBkZXNjIiwgc19hbHBoYV9wZGVzYywgMH0sCi0gIHsgIm5hbWUiLCBzX2FscGhhX25hbWUsIDB9LAotICB7ICJsaW5rYWdlIiwgc19hbHBoYV9saW5rYWdlLCAwfSwKLSAgeyAiY29kZV9hZGRyZXNzIiwgc19hbHBoYV9jb2RlX2FkZHJlc3MsIDB9LAotICB7ICJlbnQiLCBzX2FscGhhX2VudCwgMH0sCi0gIHsgImZyYW1lIiwgc19hbHBoYV9mcmFtZSwgMH0sCi0gIHsgImZwX3NhdmUiLCBzX2FscGhhX2ZwX3NhdmUsIDB9LAotICB7ICJtYXNrIiwgc19hbHBoYV9tYXNrLCAwfSwKLSAgeyAiZm1hc2siLCBzX2FscGhhX2ZtYXNrLCAwfSwKLSAgeyAiZW5kIiwgc19hbHBoYV9lbmQsIDB9LAotICB7ICJmaWxlIiwgc19hbHBoYV9maWxlLCAwfSwKLSAgeyAicmRhdGEiLCBzX2FscGhhX3NlY3Rpb24sIDF9LAotICB7ICJjb21tIiwgc19hbHBoYV9jb21tLCAwfSwKLSAgeyAibGluayIsIHNfYWxwaGFfc2VjdGlvbiwgM30sCi0gIHsgImN0b3JzIiwgc19hbHBoYV9zZWN0aW9uLCA0fSwKLSAgeyAiZHRvcnMiLCBzX2FscGhhX3NlY3Rpb24sIDV9LAotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAvKiBGcmFtZSByZWxhdGVkIHBzZXVkb3MuICAqLwotICB7ImVudCIsIHNfYWxwaGFfZW50LCAwfSwKLSAgeyJlbmQiLCBzX2FscGhhX2VuZCwgMH0sCi0gIHsibWFzayIsIHNfYWxwaGFfbWFzaywgMH0sCi0gIHsiZm1hc2siLCBzX2FscGhhX21hc2ssIDF9LAotICB7ImZyYW1lIiwgc19hbHBoYV9mcmFtZSwgMH0sCi0gIHsicHJvbG9ndWUiLCBzX2FscGhhX3Byb2xvZ3VlLCAwfSwKLSAgLyogQ09GRiBkZWJ1Z2dpbmcgcmVsYXRlZCBwc2V1ZG9zLiAgKi8KLSAgeyJiZWdpbiIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCAwfSwKLSAgeyJiZW5kIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDF9LAotICB7ImRlZiIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCAyfSwKLSAgeyJkaW0iLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgM30sCi0gIHsiZW5kZWYiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgNH0sCi0gIHsiZmlsZSIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCA1fSwKLSAgeyJzY2wiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgNn0sCi0gIHsidGFnIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDd9LAotICB7InZhbCIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCA4fSwKLSAgeyJsb2MiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgOX0sCi0jZWxzZQotICB7InByb2xvZ3VlIiwgc19pZ25vcmUsIDB9LAotI2VuZGlmCi0gIHsiZ3ByZWwzMiIsIHNfYWxwaGFfZ3ByZWwzMiwgMH0sCi0gIHsidF9mbG9hdGluZyIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ2QnfSwKLSAgeyJzX2Zsb2F0aW5nIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnZid9LAotICB7ImZfZmxvYXRpbmciLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdGJ30sCi0gIHsiZ19mbG9hdGluZyIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ0cnfSwKLSAgeyJkX2Zsb2F0aW5nIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnRCd9LAotCi0gIHsicHJvYyIsIHNfYWxwaGFfcHJvYywgMH0sCi0gIHsiYXByb2MiLCBzX2FscGhhX3Byb2MsIDF9LAotICB7InNldCIsIHNfYWxwaGFfc2V0LCAwfSwKLSAgeyJyZWd1c2UiLCBzX2lnbm9yZSwgMH0sCi0gIHsibGl2ZXJlZyIsIHNfaWdub3JlLCAwfSwKLSAgeyJiYXNlIiwgc19hbHBoYV9iYXNlLCAwfSwJCS8qPz8qLwotICB7Im9wdGlvbiIsIHNfaWdub3JlLCAwfSwKLSAgeyJhZW50Iiwgc19pZ25vcmUsIDB9LAotICB7InVnZW4iLCBzX2lnbm9yZSwgMH0sCi0gIHsiZWZsYWciLCBzX2lnbm9yZSwgMH0sCi0KLSAgeyJhbGlnbiIsIHNfYWxwaGFfYWxpZ24sIDB9LAotICB7ImRvdWJsZSIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ2QnfSwKLSAgeyJmbG9hdCIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJzaW5nbGUiLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdmJ30sCi0gIHsiYXNjaWkiLCBzX2FscGhhX3N0cmluZ2VyLCAwfSwKLSAgeyJhc2NpeiIsIHNfYWxwaGFfc3RyaW5nZXIsIDF9LAotICB7InN0cmluZyIsIHNfYWxwaGFfc3RyaW5nZXIsIDF9LAotICB7InNwYWNlIiwgc19hbHBoYV9zcGFjZSwgMH0sCi0gIHsic2tpcCIsIHNfYWxwaGFfc3BhY2UsIDB9LAotICB7Inplcm8iLCBzX2FscGhhX3NwYWNlLCAwfSwKLQotLyogVW5hbGlnbmVkIGRhdGEgcHNldWRvcy4gICovCi0gIHsidXdvcmQiLCBzX2FscGhhX3Vjb25zLCAyfSwKLSAgeyJ1bG9uZyIsIHNfYWxwaGFfdWNvbnMsIDR9LAotICB7InVxdWFkIiwgc19hbHBoYV91Y29ucywgOH0sCi0KLSNpZmRlZiBPQkpfRUxGCi0vKiBEd2FyZiB3YW50cyB0aGVzZSB2ZXJzaW9ucyBvZiB1bmFsaWduZWQuICAqLwotICB7IjJieXRlIiwgc19hbHBoYV91Y29ucywgMn0sCi0gIHsiNGJ5dGUiLCBzX2FscGhhX3Vjb25zLCA0fSwKLSAgeyI4Ynl0ZSIsIHNfYWxwaGFfdWNvbnMsIDh9LAotI2VuZGlmCi0KLS8qIFdlIGRvbid0IGRvIGFueSBvcHRpbWl6aW5nLCBzbyB3ZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGVzZS4gICovCi0gIHsibm9hbGlhcyIsIHNfaWdub3JlLCAwfSwKLSAgeyJhbGlhcyIsIHNfaWdub3JlLCAwfSwKLQotICB7ImFyY2giLCBzX2FscGhhX2FyY2gsIDB9LAotCi0gIHtOVUxMLCAwLCAwfSwKLX07Ci0KLQwKLS8qIEJ1aWxkIGEgQkZEIHNlY3Rpb24gd2l0aCBpdHMgZmxhZ3Mgc2V0IGFwcHJvcHJpYXRlbHkgZm9yIHRoZSAubGl0YSwKLSAgIC5saXQ4LCBvciAubGl0NCBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1jcmVhdGVfbGl0ZXJhbF9zZWN0aW9uIChuYW1lLCBzZWNwLCBzeW1wKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBzZWdUICpzZWNwOwotICAgICBzeW1ib2xTICoqc3ltcDsKLXsKLSAgc2VnVCBjdXJyZW50X3NlY3Rpb24gPSBub3dfc2VnOwotICBpbnQgY3VycmVudF9zdWJzZWMgPSBub3dfc3Vic2VnOwotICBzZWdUIG5ld19zZWM7Ci0KLSAgKnNlY3AgPSBuZXdfc2VjID0gc3Vic2VnX25ldyAobmFtZSwgMCk7Ci0gIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VjdGlvbiwgY3VycmVudF9zdWJzZWMpOwotICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIG5ld19zZWMsIDQpOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbmV3X3NlYywKLQkJCSBTRUNfUkVMT0MgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWQotCQkJIHwgU0VDX0RBVEEpOwotCi0gIFNfQ0xFQVJfRVhURVJOQUwgKCpzeW1wID0gc2VjdGlvbl9zeW1ib2wgKG5ld19zZWMpKTsKLX0KLQotI2lmZGVmIE9CSl9FQ09GRgotCi0vKiBAQEAgR1Agc2VsZWN0aW9uIHZvb2Rvby4gIEFsbCBvZiB0aGlzIHNlZW1zIG92ZXJseSBjb21wbGljYXRlZCBhbmQKLSAgIHVubmVjZXNzYXJ5OyB3aGljaCBpcyB0aGUgcHJpbWFyeSByZWFzb24gaXQncyBmb3IgRUNPRkYgb25seS4gICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbWF5YmVfc2V0X2dwIChzZWMpCi0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIGJmZF92bWEgdm1hOwotICBpZiAoIXNlYykKLSAgICByZXR1cm47Ci0gIHZtYSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGZvbywgc2VjKTsKLSAgaWYgKHZtYSAmJiB2bWEgPCBhbHBoYV9ncF92YWx1ZSkKLSAgICBhbHBoYV9ncF92YWx1ZSA9IHZtYTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbGVjdF9ncF92YWx1ZSAoKQotewotICBhc3NlcnQgKGFscGhhX2dwX3ZhbHVlID09IDApOwotCi0gIC8qIEdldCBtaW51cy1vbmUgaW4gd2hhdGV2ZXIgd2lkdGguLi4gICovCi0gIGFscGhhX2dwX3ZhbHVlID0gMDsgYWxwaGFfZ3BfdmFsdWUtLTsKLQotICAvKiBTZWxlY3QgdGhlIHNtYWxsZXN0IFZNQSBvZiB0aGVzZSBleGlzdGluZyBzZWN0aW9ucy4gICovCi0gIG1heWJlX3NldF9ncCAoYWxwaGFfbGl0YV9zZWN0aW9uKTsKLSNpZiAwCi0gIC8qIFRoZXNlIHdlcmUgZGlzYWJsZWQgYmVmb3JlIC0tIHNob3VsZCB3ZSB1c2UgdGhlbT8gICovCi0gIG1heWJlX3NldF9ncCAoc2RhdGEpOwotICBtYXliZV9zZXRfZ3AgKGxpdDhfc2VjKTsKLSAgbWF5YmVfc2V0X2dwIChsaXQ0X3NlYyk7Ci0jZW5kaWYKLQotLyogQEAgV2lsbCBhIHNpbXBsZSAweDgwMDAgd29yayBoZXJlPyAgSWYgbm90LCB3aHkgbm90PyAgKi8KLSNkZWZpbmUgR1BfQURKVVNUTUVOVAkoMHg4MDAwIC0gMHgxMCkKLQotICBhbHBoYV9ncF92YWx1ZSArPSBHUF9BREpVU1RNRU5UOwotCi0gIFNfU0VUX1ZBTFVFIChhbHBoYV9ncF9zeW1ib2wsIGFscGhhX2dwX3ZhbHVlKTsKLQotI2lmZGVmIERFQlVHMQotICBwcmludGYgKF8oIkNob3NlIEdQIHZhbHVlIG9mICVseFxuIiksIGFscGhhX2dwX3ZhbHVlKTsKLSNlbmRpZgotfQotI2VuZGlmIC8qIE9CSl9FQ09GRiAqLwotCi0vKiBDYWxsZWQgaW50ZXJuYWxseSB0byBoYW5kbGUgYWxsIGFsaWdubWVudCBuZWVkcy4gIFRoaXMgdGFrZXMgY2FyZQotICAgb2YgZWxpZGluZyBjYWxscyB0byBmcmFnX2FsaWduIGlmJ24gdGhlIGNhY2hlZCBjdXJyZW50IGFsaWdubWVudAotICAgc2F5cyB3ZSd2ZSBhbHJlYWR5IGdvdCBpdCwgYXMgd2VsbCBhcyB0YWtpbmcgY2FyZSBvZiB0aGUgYXV0by1hbGlnbgotICAgZmVhdHVyZSB3cnQgbGFiZWxzLiAgKi8KLQotc3RhdGljIHZvaWQKLWFscGhhX2FsaWduIChuLCBwZmlsbCwgbGFiZWwsIGZvcmNlKQotICAgICBpbnQgbjsKLSAgICAgY2hhciAqcGZpbGw7Ci0gICAgIHN5bWJvbFMgKmxhYmVsOwotICAgICBpbnQgZm9yY2UgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPj0gbikKLSAgICByZXR1cm47Ci0KLSAgaWYgKHBmaWxsID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKG4gPiAyCi0JICAmJiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5vd19zZWcpICYgU0VDX0NPREUpICE9IDApCi0JewotCSAgc3RhdGljIGNoYXIgY29uc3QgdW5vcFs0XSA9IHsgMHgwMCwgMHgwMCwgMHhlMCwgMHgyZiB9OwotCSAgc3RhdGljIGNoYXIgY29uc3Qgbm9wdW5vcFs4XSA9IHsKLQkJMHgxZiwgMHgwNCwgMHhmZiwgMHg0NywKLQkJMHgwMCwgMHgwMCwgMHhlMCwgMHgyZgotCSAgfTsKLQotCSAgLyogRmlyc3QsIG1ha2Ugc3VyZSB3ZSdyZSBvbiBhIGZvdXItYnl0ZSBib3VuZGFyeSwgaW4gY2FzZQotCSAgICAgc29tZW9uZSBoYXMgYmVlbiBwdXR0aW5nIC5ieXRlIHZhbHVlcyBpbnRvIHRoZSB0ZXh0Ci0JICAgICBzZWN0aW9uLiAgVGhlIERFQyBhc3NlbWJsZXIgc2lsZW50bHkgZmlsbHMgd2l0aCB1bmFsaWduZWQKLQkgICAgIG5vLW9wIGluc3RydWN0aW9ucy4gIFRoaXMgd2lsbCB6ZXJvLWZpbGwsIHRoZW4gbm9wLWZpbGwKLQkgICAgIHdpdGggcHJvcGVyIGFsaWdubWVudC4gICovCi0JICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA8IDIpCi0JICAgIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotCSAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPCAzKQotCSAgICBmcmFnX2FsaWduX3BhdHRlcm4gKDMsIHVub3AsIHNpemVvZiB1bm9wLCAwKTsKLQkgIGlmIChuID4gMykKLQkgICAgZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBub3B1bm9wLCBzaXplb2Ygbm9wdW5vcCwgMCk7Ci0JfQotICAgICAgZWxzZQotCWZyYWdfYWxpZ24gKG4sIDAsIDApOwotICAgIH0KLSAgZWxzZQotICAgIGZyYWdfYWxpZ24gKG4sICpwZmlsbCwgMCk7Ci0KLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IG47Ci0KLSAgaWYgKGxhYmVsICE9IE5VTEwgJiYgU19HRVRfU0VHTUVOVCAobGFiZWwpID09IG5vd19zZWcpCi0gICAgewotICAgICAgc3ltYm9sX3NldF9mcmFnIChsYWJlbCwgZnJhZ19ub3cpOwotICAgICAgU19TRVRfVkFMVUUgKGxhYmVsLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotICAgIH0KLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuKTsKLQotICAvKiA/Pz8gaWYgYWxwaGFfZmxhZ19yZWxheCAmJiBmb3JjZSAmJiBlbGYsIHJlY29yZCB0aGUgcmVxdWVzdGVkIGFsaWdubWVudAotICAgICBpbiBhIHJlbG9jIGZvciB0aGUgbGlua2VyIHRvIHNlZS4gICovCi19Ci0KLS8qIFRoZSBBbHBoYSBoYXMgc3VwcG9ydCBmb3Igc29tZSBWQVggZmxvYXRpbmcgcG9pbnQgdHlwZXMsIGFzIHdlbGwgYXMgZm9yCi0gICBJRUVFIGZsb2F0aW5nIHBvaW50LiAgV2UgY29uc2lkZXIgSUVFRSB0byBiZSB0aGUgcHJpbWFyeSBmbG9hdGluZyBwb2ludAotICAgZm9ybWF0LCBhbmQgc25lYWsgaW4gdGhlIFZBWCBmbG9hdGluZyBwb2ludCBzdXBwb3J0IGhlcmUuICAqLwotI2RlZmluZSBtZF9hdG9mIHZheF9tZF9hdG9mCi0jaW5jbHVkZSAiY29uZmlnL2F0b2YtdmF4LmMiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFscGhhLmggYi9nYXMvY29uZmlnL3RjLWFscGhhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMmIwNGUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1hbHBoYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1hbHBoYS5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybiA8cmFlYnVybkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19BTFBIQQotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJCQliZmRfYXJjaF9hbHBoYQotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCVwKLQkJICAgICAgID8gImVjb2ZmLWxpdHRsZWFscGhhIgkJCQlcCi0JCSAgICAgICA6IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cglcCi0JCSAgICAgICA/ICJlbGY2NC1hbHBoYSIJCQkJCVwKLQkJICAgICAgIDogT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cglcCi0JCSAgICAgICA/ICJ2bXMtYWxwaGEiCQkJCQlcCi0JCSAgICAgICA6ICJ1bmtub3duLWZvcm1hdCIpCi0KLSNkZWZpbmUgTkVFRF9MSVRFUkFMX1BPT0wKLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0jZGVmaW5lIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCi0KLWV4dGVybiBpbnQgYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLWV4dGVybiBpbnQgYWxwaGFfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGFscGhhX2dwcm1hc2ssIGFscGhhX2Zwcm1hc2s7Ci1leHRlcm4gdmFsdWVUIGFscGhhX2dwX3ZhbHVlOwotCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkJYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiAoRklYUCkKLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYUCkJCWFscGhhX2ZpeF9hZGp1c3RhYmxlIChGSVhQKQotI2RlZmluZSBSRUxPQ19SRVFVSVJFU19TWU1CT0wKLQotLyogVGhpcyBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBsb2NhbAotICAgb2JqZWN0IGZvciB3aGljaCB3ZSBzdGlsbCB3YW50IHRvIGRvIHRoZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuCi0gICBUcnVlIGlmIHdlIGFyZSB3aWxsaW5nIHRvIHBlcmZvcm0gdGhpcyByZWxvY2F0aW9uIHdoaWxlIGJ1aWxkaW5nCi0gICB0aGUgLm8gZmlsZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwY3JlbCByZWxvY2F0aW9ucy4gICovCi0KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkJCQkJXAotICAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwJCQkJCVwKLSAgIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQlcCi0gICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQkJXAotICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLSAgICAgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpKSkKLQotI2RlZmluZSBtZF9jb252ZXJ0X2ZyYWcoYixzLGYpCQlhc19mYXRhbCAoImFscGhhIGNvbnZlcnRfZnJhZ1xuIikKLSNkZWZpbmUgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoZixzKSBcCi0JCQkoYXNfZmF0YWwoImVzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IGNhbGxlZCIpLDEpCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2lmZGVmIE9CSl9FVkFYCi0KLS8qIFRoaXMgZmllbGQga2VlcHMgdGhlIHN5bWJvbHMgcG9zaXRpb24gaW4gdGhlIGxpbmsgc2VjdGlvbi4gICovCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIHZhbHVlVAotCi0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyhGUkFHLE9GRixMRU4sRVhQKSBcCi0gICAgICBmaXhfbmV3X2V4cCAoRlJBRywgT0ZGLCAoaW50KUxFTiwgRVhQLCAwLCBcCi0JTEVOID09IDIgPyBCRkRfUkVMT0NfMTYgXAotCTogTEVOID09IDQgPyBCRkRfUkVMT0NfMzIgXAotCTogTEVOID09IDggPyBCRkRfUkVMT0NfNjQgXAotCTogQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UpOwotI2VuZGlmCi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzCQludW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuCi0KLWV4dGVybiBpbnQgdGNfZ2V0X3JlZ2lzdGVyIFBBUkFNUyAoKGludCBmcmFtZSkpOwotZXh0ZXJuIHZvaWQgYWxwaGFfZnJvYl9lY29mZl9kYXRhIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgYWxwaGFfZGVmaW5lX2xhYmVsIChzeW0pCi1leHRlcm4gdm9pZCBhbHBoYV9kZWZpbmVfbGFiZWwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLSNkZWZpbmUgbWRfY29uc19hbGlnbihuYnl0ZXMpIGFscGhhX2NvbnNfYWxpZ24gKG5ieXRlcykKLWV4dGVybiB2b2lkIGFscGhhX2NvbnNfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSNkZWZpbmUgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QoKSBhbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKQotZXh0ZXJuIHZvaWQgYWxwaGFfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LICAgLyogZm9vLS4gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIuc2RhdGEiLCAgIFNIVF9QUk9HQklUUywgICBTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfQUxQSEFfR1BSRUwgIH0sIFwKLSAgeyAiLnNic3MiLCAgICBTSFRfTk9CSVRTLCAgICAgU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX0FMUEhBX0dQUkVMICB9LAotI2VuZGlmCi0KLS8qIFdoZXRoZXIgdG8gYWRkIHN1cHBvcnQgZm9yIGV4cGxpY3QgIXJlbG9jYXRpb25fb3Ahc2VxdWVuY2VfbnVtYmVyLiAgQXQgdGhlCi0gICBtb21lbnQsIG9ubHkgZG8gdGhpcyBmb3IgRUxGLCB0aG91Z2ggRUNPRkYgY291bGQgdXNlIGl0IGFzIHdlbGwuICAqLwotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBSRUxPQ19PUF9QCi0jZW5kaWYKLQotI2lmZGVmIFJFTE9DX09QX1AKLS8qIEJlZm9yZSB0aGUgcmVsb2NhdGlvbnMgYXJlIHdyaXR0ZW4sIHJlb3JkZXIgdGhlbSwgc28gdGhhdCB1c2VyIHN1cHBsaWVkCi0gICAhbGl0dXNlIHJlbG9jYXRpb25zIGZvbGxvdyB0aGUgYXBwcm9wcmlhdGUgIWxpdGVyYWwgcmVsb2NhdGlvbnMuICBBbHNvCi0gICBjb252ZXJ0IHRoZSBnYXMtaW50ZXJuYWwgcmVsb2NhdGlvbnMgdG8gdGhlIGFwcHJvcHJpYXRlIGxpbmtlciByZWxvY2F0aW9ucy4KLSAgICovCi0jZGVmaW5lIHRjX2FkanVzdF9zeW10YWIoKSBhbHBoYV9hZGp1c3Rfc3ltdGFiICgpCi1leHRlcm4gdm9pZCBhbHBoYV9hZGp1c3Rfc3ltdGFiIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogTmV3IGZpZWxkcyBmb3Igc3VwcG9ydGluZyBleHBsaWNpdCByZWxvY2F0aW9ucyAoc3VjaCBhcyAhbGl0ZXJhbCB0byBtYXJrCi0gICB3aGVyZSBhIHBvaW50ZXIgaXMgbG9hZGVkIGZyb20gdGhlIGdsb2JhbCB0YWJsZSwgYW5kICFsaXR1c2VfYmFzZSB0byB0cmFjawotICAgYWxsIG9mIHRoZSBub3JtYWwgdXNlcyBvZiB0aGF0IHBvaW50ZXIpLiAgKi8KLQotI2RlZmluZSBUQ19GSVhfVFlQRSBzdHJ1Y3QgYWxwaGFfZml4X3RhZwotCi1zdHJ1Y3QgYWxwaGFfZml4X3RhZwotewotICBzdHJ1Y3QgZml4ICpuZXh0X2xpdHVzZTsJCS8qIG5leHQgIWxpdHVzZSAqLwotICBzdHJ1Y3QgYWxwaGFfbGl0ZXJhbF90YWcgKmluZm87CS8qIG90aGVyIG1lbWJlcnMgd2l0aCBzYW1lIHNlcXVlbmNlICovCi19OwotCi0vKiBJbml0aWFsaXplIHRoZSBUQ19GSVhfVFlQRSBmaWVsZC4gICovCi0jZGVmaW5lIFRDX0lOSVRfRklYX0RBVEEoZml4UCkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICBmaXhQLT50Y19maXhfZGF0YS5uZXh0X2xpdHVzZSA9IChzdHJ1Y3QgZml4ICopMDsJCQlcCi0gIGZpeFAtPnRjX2ZpeF9kYXRhLmluZm8gPSAoc3RydWN0IGFscGhhX2xpdGVyYWxfdGFnICopMDsJCVwKLX0gd2hpbGUgKDApCi0KLS8qIFdvcmsgd2l0aCBERUJVRzUgdG8gcHJpbnQgZmllbGRzIGluIHRjX2ZpeF90eXBlLiAgKi8KLSNkZWZpbmUgVENfRklYX0RBVEFfUFJJTlQoc3RyZWFtLGZpeFApCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICBpZiAoZml4UC0+dGNfZml4X2RhdGEuaW5mbykJCQkJCQlcCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiXHRpbmZvID0gMHglbHgsIG5leHRfbGl0dXNlID0gMHglbHhcbiIsIFwKLQkgICAgIChsb25nKWZpeFAtPnRjX2ZpeF9kYXRhLmluZm8sCQkJCVwKLQkgICAgIChsb25nKWZpeFAtPnRjX2ZpeF9kYXRhLm5leHRfbGl0dXNlKTsJCQlcCi19IHdoaWxlICgwKQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFyYy5jIGIvZ2FzL2NvbmZpZy90Yy1hcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhZmVhMy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4NCArMCwwIEBACi0vKiB0Yy1hcmMuYyAtLSBBc3NlbWJsZXIgZm9yIHRoZSBBUkMKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9wY29kZS9hcmMuaCIKLSNpbmNsdWRlICJlbGYvYXJjLmgiCi0KLWV4dGVybiBpbnQgYXJjX2dldF9tYWNoIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgYXJjX2luc24gYXJjX2luc2VydF9vcGVyYW5kIFBBUkFNUyAoKGFyY19pbnNuLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICosIGludCwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqLAotCQkJCQkgICAgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIGFyY19jb21tb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBhcmNfY3B1IFBBUkFNUyAoKGludCkpOwotLypzdGF0aWMgdm9pZCBhcmNfcmVuYW1lIFBBUkFNUyAoKGludCkpOyovCi1zdGF0aWMgaW50IGdldF9hcmNfZXhwX3JlbG9jX3R5cGUgUEFSQU1TICgoaW50LCBpbnQsIGV4cHJlc3Npb25TICosCi0JCQkJCSAgIGV4cHJlc3Npb25TICopKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCAwIH0sCS8qIERlZmF1bHRpbmcgaXMgaW52YWxpZCAoMCkgKi8KLSAgeyAiY29tbW9uIiwgYXJjX2NvbW1vbiwgMCB9LAotLyp7ICJod29yZCIsIGNvbnMsIDIgfSwgLSBhbHJlYWR5IGV4aXN0cyAqLwotICB7ICJ3b3JkIiwgY29ucywgNCB9LAotLyp7ICJ4d29yZCIsIGNvbnMsIDggfSwqLwotICB7ICJjcHUiLCBhcmNfY3B1LCAwIH0sCi0vKnsgInJlbmFtZSIsIGFyY19yZW5hbWUsIDAgfSwqLwotICB7IE5VTEwsIDAsIDAgfSwKLX07Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjOyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBzdGFydGVkIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMKLSAgIHdvcmsgaWYgJy8nIGlzbid0IG90aGVyd2lzZSBkZWZpbmVkLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRCI7Ci0KLS8qIEJ5dGUgb3JkZXIuICAqLwotZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKLWNvbnN0IGNoYXIgKmFyY190YXJnZXRfZm9ybWF0ID0gREVGQVVMVF9UQVJHRVRfRk9STUFUOwotc3RhdGljIGludCBieXRlX29yZGVyID0gREVGQVVMVF9CWVRFX09SREVSOwotCi0vKiBPbmUgb2YgYmZkX21hY2hfYXJjX3h4eC4gICovCi1zdGF0aWMgaW50IGFyY19tYWNoX3R5cGUgPSBiZmRfbWFjaF9hcmNfYmFzZTsKLQotLyogTm9uLXplcm8gaWYgdGhlIGNwdSB0eXBlIGhhcyBiZWVuIGV4cGxpY2l0bHkgc3BlY2lmaWVkLiAgKi8KLXN0YXRpYyBpbnQgbWFjaF90eXBlX3NwZWNpZmllZF9wID0gMDsKLQotLyogTm9uLXplcm8gaWYgb3Bjb2RlIHRhYmxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICBBIC5jcHUgY29tbWFuZCBtdXN0IGFwcGVhciBiZWZvcmUgYW55IGluc3RydWN0aW9ucy4gICovCi1zdGF0aWMgaW50IGNwdV90YWJsZXNfaW5pdF9wID0gMDsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmFyY19zdWZmaXhfaGFzaCA9IE5VTEw7Ci0MCi1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0jZGVmaW5lIE9QVElPTl9FQiAoT1BUSU9OX01EX0JBU0UgKyAwKQotICB7IkVCIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FQn0sCi0jZGVmaW5lIE9QVElPTl9FTCAoT1BUSU9OX01EX0JBU0UgKyAxKQotICB7IkVMIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTH0sCi0gIHsgTlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDAgfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLS8qCi0gKiBtZF9wYXJzZV9vcHRpb24KLSAqCi0gKiBJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICogU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLgotICovCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSBPUFRJT05fRUI6Ci0gICAgICBieXRlX29yZGVyID0gQklHX0VORElBTjsKLSAgICAgIGFyY190YXJnZXRfZm9ybWF0ID0gImVsZjMyLWJpZ2FyYyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9FTDoKLSAgICAgIGJ5dGVfb3JkZXIgPSBMSVRUTEVfRU5ESUFOOwotICAgICAgYXJjX3RhcmdldF9mb3JtYXQgPSAiZWxmMzItbGl0dGxlYXJjIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1BUkMgb3B0aW9uczpcblwKLS1FQgkJCWdlbmVyYXRlIGJpZyBlbmRpYW4gb3V0cHV0XG5cCi0tRUwJCQlnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIG91dHB1dFxuIikpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4KLSAgIE9wY29kZSBzZWxlY3Rpb24gaXMgZGVmZXJlZCB1bnRpbCBsYXRlciBiZWNhdXNlIHdlIG1pZ2h0IHNlZSBhIC5jcHUKLSAgIGNvbW1hbmQuICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICAvKiBUaGUgZW5kaWFubmVzcyBjYW4gYmUgY2hvc2VuICJhdCB0aGUgZmFjdG9yeSIuICAqLwotICB0YXJnZXRfYmlnX2VuZGlhbiA9IGJ5dGVfb3JkZXIgPT0gQklHX0VORElBTjsKLQotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2FyYywgYXJjX21hY2hfdHlwZSkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgLyogQXNzdW1lIHRoZSBiYXNlIGNwdS4gIFRoaXMgY2FsbCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBuZWVkIHRvCi0gICAgIGluaXRpYWxpemUgYGFyY19vcGVyYW5kX21hcCcgd2hpY2ggbWF5IGJlIG5lZWRlZCBiZWZvcmUgd2Ugc2VlIHRoZQotICAgICBmaXJzdCBpbnNuLiAgKi8KLSAgYXJjX29wY29kZV9pbml0X3RhYmxlcyAoYXJjX2dldF9vcGNvZGVfbWFjaCAoYmZkX21hY2hfYXJjX2Jhc2UsCi0JCQkJCSAgICAgICB0YXJnZXRfYmlnX2VuZGlhbikpOwotfQotCi0vKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzIG9wY29kZSBhbmQgb3BlcmFuZCB0YWJsZXMuCi0gICBNQUNIIGlzIG9uZSBvZiBiZmRfbWFjaF9hcmNfeHh4LiAgKi8KLQotc3RhdGljIHZvaWQKLWluaXRfb3Bjb2RlX3RhYmxlcyAobWFjaCkKLSAgICAgaW50IG1hY2g7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotICBjaGFyICpsYXN0OwotCi0gIGlmICgoYXJjX3N1ZmZpeF9oYXNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpKTsKLQotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2FyYywgbWFjaCkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgLyogVGhpcyBpbml0aWFsaXplcyBhIGZldyB0aGluZ3MgaW4gYXJjLW9wYy5jIHRoYXQgd2UgbmVlZC4KLSAgICAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIHZhcmlvdXMgYXJjX3h4eF9zdXBwb3J0ZWQgZm5zLiAgKi8KLSAgYXJjX29wY29kZV9pbml0X3RhYmxlcyAoYXJjX2dldF9vcGNvZGVfbWFjaCAobWFjaCwgdGFyZ2V0X2JpZ19lbmRpYW4pKTsKLQotICAvKiBPbmx5IHB1dCB0aGUgZmlyc3QgZW50cnkgb2YgZWFjaCBlcXVpdmFsZW50bHkgbmFtZWQgc3VmZml4IGluIHRoZQotICAgICB0YWJsZS4gICovCi0gIGxhc3QgPSAiIjsKLSAgZm9yIChpID0gMDsgaSA8IGFyY19zdWZmaXhlc19jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGFyY19vcHZhbF9zdXBwb3J0ZWQgKCZhcmNfc3VmZml4ZXNbaV0pKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHN0cmNtcCAoYXJjX3N1ZmZpeGVzW2ldLm5hbWUsIGxhc3QpICE9IDApCi0JaGFzaF9pbnNlcnQgKGFyY19zdWZmaXhfaGFzaCwgYXJjX3N1ZmZpeGVzW2ldLm5hbWUsIChQVFIpIChhcmNfc3VmZml4ZXMgKyBpKSk7Ci0gICAgICBsYXN0ID0gYXJjX3N1ZmZpeGVzW2ldLm5hbWU7Ci0gICAgfQotCi0gIC8qIFNpbmNlIHJlZ2lzdGVycyBkb24ndCBoYXZlIGEgcHJlZml4LCB3ZSBwdXQgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlIHNvCi0gICAgIHRoZXkgY2FuJ3QgYmUgdXNlZCBhcyBzeW1ib2xzLiAgVGhpcyBhbHNvIHNpbXBsaWZpZXMgYXJndW1lbnQgcGFyc2luZyBhcwotICAgICB3ZSBjYW4gbGV0IGdhcyBwYXJzZSByZWdpc3RlcnMgZm9yIHVzLiAgVGhlIHJlY29yZGVkIHJlZ2lzdGVyIG51bWJlciBpcwotICAgICB0aGUgaW5kZXggaW4gYGFyY19yZWdfbmFtZXMnLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGFyY19yZWdfbmFtZXNfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBhcmNfb3B2YWxfc3VwcG9ydGVkICgmYXJjX3JlZ19uYW1lc1tpXSkpCi0JY29udGludWU7Ci0gICAgICAvKiBVc2Ugc3ltYm9sX2NyZWF0ZSBoZXJlIGluc3RlYWQgb2Ygc3ltYm9sX25ldyBzbyB3ZSBkb24ndCB0cnkgdG8KLQkgb3V0cHV0IHJlZ2lzdGVycyBpbnRvIHRoZSBvYmplY3QgZmlsZSdzIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChhcmNfcmVnX25hbWVzW2ldLm5hbWUsIHJlZ19zZWN0aW9uLAotCQkJCQkgIGksICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICAgIH0KLQotICAvKiBUZWxsIGBzX2NwdScgaXQncyB0b28gbGF0ZS4gICovCi0gIGNwdV90YWJsZXNfaW5pdF9wID0gMTsKLX0KLQwKLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uCi0gICBJZiBSRUcgaXMgbm9uLU5VTEwsIGl0IGlzIGEgcmVnaXN0ZXIgbnVtYmVyIGFuZCBpZ25vcmUgVkFMLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1hcmNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsLCBmaWxlLCBsaW5lKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgb2Zmc2V0VCB2YWw7Ci0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotewotICBpZiAob3BlcmFuZC0+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+cmVhbF9uYW1lICE9IChjaGFyICopIE5VTEwpCi0gICAgU19TRVRfTkFNRSAoc3ltLCBzeW1ib2xfZ2V0X3RjIChzeW0pLT5yZWFsX25hbWUpOwotCi0gIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFyYy5oIGIvZ2FzL2NvbmZpZy90Yy1hcmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2NjIwMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWFyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogdGMtYXJjLmggLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5lcyBmb3IgdGhlIEFSQy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX0FSQyAxCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfYXJjCi0KLSNkZWZpbmUgTElUVExFX0VORElBTiAgIDEyMzQKLSNkZWZpbmUgQklHX0VORElBTiAgICAgIDQzMjEKLQotLyogVGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHRhcmdldCBmb3JtYXQgbWF5IGNoYW5nZSBiYXNlZCBvbiBjb21tYW5kCi0gICBsaW5lIGFyZ3VtZW50cy4gICovCi1leHRlcm4gY29uc3QgY2hhciAqYXJjX3RhcmdldF9mb3JtYXQ7Ci0jZGVmaW5lIERFRkFVTFRfVEFSR0VUX0ZPUk1BVCAiZWxmMzItbGl0dGxlYXJjIgotI2RlZmluZSBUQVJHRVRfRk9STUFUIGFyY190YXJnZXRfZm9ybWF0Ci0jZGVmaW5lIERFRkFVTFRfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJBUkMgR0FTICIKLQotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0KLS8qIFRoZSBBUkMgbmVlZHMgdG8gcGFyc2UgcmVsb2Mgc3BlY2lmaWVycyBpbiAud29yZC4gICovCi0KLWV4dGVybiB2b2lkIGFyY19wYXJzZV9jb25zX2V4cHJlc3Npb24gKCk7Ci0jZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgXAotYXJjX3BhcnNlX2NvbnNfZXhwcmVzc2lvbiAoRVhQLCBOQllURVMpCi0KLWV4dGVybiB2b2lkIGFyY19jb25zX2ZpeF9uZXcgKCk7Ci0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyhGUkFHLCBXSEVSRSwgTkJZVEVTLCBFWFApIFwKLWFyY19jb25zX2ZpeF9uZXcgKEZSQUcsIFdIRVJFLCBOQllURVMsIEVYUCkKLQotI2lmIDAKLS8qIEV4dHJhIHN0dWZmIHRoYXQgd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGZvciBlYWNoIHN5bWJvbC4gICovCi1zdHJ1Y3QgYXJjX3RjX3N5Ci17Ci0gIC8qIFRoZSByZWFsIG5hbWUsIGlmIHRoZSBzeW1ib2wgd2FzIHJlbmFtZWQuICAqLwotICBjaGFyICpyZWFsX25hbWU7Ci19OwotCi0jZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUgc3RydWN0IGFyY190Y19zeQotCi0vKiBGaW5pc2ggdXAgdGhlIHN5bWJvbC4gICovCi1leHRlcm4gaW50IGFyY19mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLCBwdW50KSBwdW50ID0gYXJjX2Zyb2Jfc3ltYm9sIChzeW0pCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYXJtLmMgYi9nYXMvY29uZmlnL3RjLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmUyNDE2Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTA5ICswLDAgQEAKLS8qIHRjLWFybS5jIC0tIEFzc2VtYmxlIGZvciB0aGUgQVJNCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQlNb2RpZmllZCBieSBEYXZpZCBUYXlsb3IgKGR0YXlsb3JAYXJtbHRkLmNvLnVrKQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNkZWZpbmUgIE5PX1JFTE9DIDAKLSNpbmNsdWRlICJhcy5oIgotCi0vKiBuZWVkIFRBUkdFVF9DUFUgKi8KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgInN5bWJvbHMuaCIKLSNpbmNsdWRlICJsaXN0aW5nLmgiCi0KLSNpZmRlZiBPQkpfRUxGCi0jaW5jbHVkZSAiZWxmL2FybS5oIgotI2VuZGlmCi0KLS8qIFR5cGVzIG9mIHByb2Nlc3NvciB0byBhc3NlbWJsZSBmb3IuICAqLwotI2RlZmluZSBBUk1fMQkJMHgwMDAwMDAwMQotI2RlZmluZSBBUk1fMgkJMHgwMDAwMDAwMgotI2RlZmluZSBBUk1fMwkJMHgwMDAwMDAwNAotI2RlZmluZSBBUk1fMjUwCQlBUk1fMwotI2RlZmluZSBBUk1fNgkJMHgwMDAwMDAwOAotI2RlZmluZSBBUk1fNwkJQVJNXzYgICAgICAgICAgIC8qIHNhbWUgY29yZSBpbnN0cnVjdGlvbiBzZXQgKi8KLSNkZWZpbmUgQVJNXzgJCUFSTV82ICAgICAgICAgICAvKiBzYW1lIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0ICovCi0jZGVmaW5lIEFSTV85CQlBUk1fNiAgICAgICAgICAgLyogc2FtZSBjb3JlIGluc3RydWN0aW9uIHNldCAqLwotI2RlZmluZSBBUk1fQ1BVX01BU0sJMHgwMDAwMDAwZgotCi0vKiBUaGUgZm9sbG93aW5nIGJpdG1hc2tzIGNvbnRyb2wgQ1BVIGV4dGVuc2lvbnMgKEFSTTcgb253YXJkcyk6ICovCi0jZGVmaW5lIEFSTV9MT05HTVVMCTB4MDAwMDAwMTAJLyogYWxsb3cgbG9uZyBtdWx0aXBsaWVzICovCi0jZGVmaW5lIEFSTV9IQUxGV09SRCAgICAweDAwMDAwMDIwCS8qIGFsbG93IGhhbGYgd29yZCBsb2FkcyAqLwotI2RlZmluZSBBUk1fVEhVTUIgICAgICAgMHgwMDAwMDA0MAkvKiBhbGxvdyBCWCBpbnN0cnVjdGlvbiAgKi8KLSNkZWZpbmUgQVJNX0VYVF9WNQkweDAwMDAwMDgwCS8qIGFsbG93IENMWiBldGMJICovCi0jZGVmaW5lIEFSTV9FWFRfVjVFICAgICAweDAwMDAwMjAwCS8qICJFbCBTZWd1bmRvIiAJICovCi0KLS8qIEFyY2hpdGVjdHVyZXMgYXJlIHRoZSBzdW0gb2YgdGhlIGJhc2UgYW5kIGV4dGVuc2lvbnMgKi8KLSNkZWZpbmUgQVJNX0FSQ0hfVjQJKEFSTV83IHwgQVJNX0xPTkdNVUwgfCBBUk1fSEFMRldPUkQpCi0jZGVmaW5lIEFSTV9BUkNIX1Y0VAkoQVJNX0FSQ0hfVjQgfCBBUk1fVEhVTUIpCi0jZGVmaW5lIEFSTV9BUkNIX1Y1CShBUk1fQVJDSF9WNCB8IEFSTV9FWFRfVjUgKQotI2RlZmluZSBBUk1fQVJDSF9WNVQJKEFSTV9BUkNIX1Y1IHwgQVJNX1RIVU1CKQotCi0vKiBTb21lIHVzZWZ1bCBjb21iaW5hdGlvbnM6ICAqLwotI2RlZmluZSBBUk1fQU5ZCQkweDAwZmZmZmZmCi0jZGVmaW5lIEFSTV8yVVAJCShBUk1fQU5ZIC0gQVJNXzEpCi0jZGVmaW5lIEFSTV9BTEwJCUFSTV8yVVAJCS8qIE5vdCBhcm0xIG9ubHkgKi8KLSNkZWZpbmUgQVJNXzNVUAkJMHgwMGZmZmZmYwotI2RlZmluZSBBUk1fNlVQCQkweDAwZmZmZmY4ICAgICAgLyogSW5jbHVkZXMgQVJNNyAqLwotCi0jZGVmaW5lIEZQVV9DT1JFCTB4ODAwMDAwMDAKLSNkZWZpbmUgRlBVX0ZQQTEwCTB4NDAwMDAwMDAKLSNkZWZpbmUgRlBVX0ZQQTExCTB4NDAwMDAwMDAKLSNkZWZpbmUgRlBVX05PTkUJMAotCi0vKiBTb21lIHVzZWZ1bCBjb21iaW5hdGlvbnMgICovCi0jZGVmaW5lIEZQVV9BTEwJCTB4ZmYwMDAwMDAJLyogTm90ZSB0aGlzIGlzIH5BUk1fQU5ZICovCi0jZGVmaW5lIEZQVV9NRU1NVUxUSQkweDdmMDAwMDAwCS8qIE5vdCBmcHVfY29yZSAqLwotCi0gICAgIAotI2lmbmRlZiBDUFVfREVGQVVMVAotI2lmIGRlZmluZWQgX190aHVtYl9fCi0jZGVmaW5lIENQVV9ERUZBVUxUIChBUk1fQVJDSF9WNCB8IEFSTV9USFVNQikKLSNlbHNlCi0jZGVmaW5lIENQVV9ERUZBVUxUIEFSTV9BTEwKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRlBVX0RFRkFVTFQKLSNkZWZpbmUgRlBVX0RFRkFVTFQgRlBVX0FMTAotI2VuZGlmCi0KLSNkZWZpbmUgc3RyZXEoYSwgYikgICAgICAgICAgIChzdHJjbXAgKGEsIGIpID09IDApCi0jZGVmaW5lIHNraXBfd2hpdGVzcGFjZShzdHIpICB3aGlsZSAoKiAoc3RyKSA9PSAnICcpICsrIChzdHIpCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCWNwdV92YXJpYW50ID0gQ1BVX0RFRkFVTFQgfCBGUFVfREVGQVVMVDsKLXN0YXRpYyBpbnQgdGFyZ2V0X29hYmkgPSAwOwotCi0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLS8qIEZsYWdzIHN0b3JlZCBpbiBwcml2YXRlIGFyZWEgb2YgQkZEIHN0cnVjdHVyZSAqLwotc3RhdGljIGJvb2xlYW4JCXVzZXNfYXBjc18yNiA9IGZhbHNlOwotc3RhdGljIGJvb2xlYW4JCXN1cHBvcnRfaW50ZXJ3b3JrID0gZmFsc2U7Ci1zdGF0aWMgYm9vbGVhbgkJdXNlc19hcGNzX2Zsb2F0ID0gZmFsc2U7Ci1zdGF0aWMgYm9vbGVhbgkJcGljX2NvZGUgPSBmYWxzZTsKLSNlbmRpZgotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotQ09OU1QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiQCI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsuICovCi1DT05TVCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0jaWZkZWYgVEVfTElOVVgKLUNPTlNUIGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLSNlbHNlCi1DT05TVCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLSNlbmRpZgotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotQ09OU1QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLQotQ09OU1QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYZUVwUCI7Ci0KLS8qIFByZWZpeCBjaGFyYWN0ZXJzIHRoYXQgaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGFuIGltbWVkaWF0ZQotICAgdmFsdWUuICAqLwotI2RlZmluZSBpc19pbW1lZGlhdGVfcHJlZml4KEMpICgoQykgPT0gJyMnIHx8IChDKSA9PSAnJCcpCi0KLSNpZmRlZiBPQkpfRUxGCi1zeW1ib2xTICogR09UX3N5bWJvbDsJCS8qIFByZS1kZWZpbmVkICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iICovCi0jZW5kaWYKLQotQ09OU1QgaW50IG1kX3JlbG9jX3NpemUgPSA4OwkvKiBTaXplIG9mIHJlbG9jYXRpb24gcmVjb3JkICovCi0KLXN0YXRpYyBpbnQgdGh1bWJfbW9kZSA9IDA7ICAgICAgLyogMDogYXNzZW1ibGUgZm9yIEFSTSwgMTogYXNzZW1ibGUgZm9yIFRodW1iLAotCQkJCSAgIDI6IGFzc2VtYmxlIGZvciBUaHVtYiBldmVuIHRob3VnaCB0YXJnZXQgY3B1Ci0JCQkJICAgZG9lcyBub3Qgc3VwcG9ydCB0aHVtYiBpbnN0cnVjdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0IGFybV9maXgKLXsKLSAgaW50IHRodW1iX21vZGU7Ci19IGFybV9maXhfZGF0YTsKLQotc3RydWN0IGFybV9pdAotewotICBDT05TVCBjaGFyICogIGVycm9yOwotICB1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uOwotICBpbnQgICAgICAgICAgIHN1ZmZpeDsKLSAgaW50ICAgICAgICAgICBzaXplOwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgdHlwZTsKLSAgICAgIGV4cHJlc3Npb25TICAgICAgICAgICAgICBleHA7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgcGNfcmVsOwotICAgIH0gcmVsb2M7Ci19OwotCi1zdHJ1Y3QgYXJtX2l0IGluc3Q7Ci0KLXN0cnVjdCBhc21fc2hpZnQKLXsKLSAgQ09OU1QgY2hhciAqICB0ZW1wbGF0ZTsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX3NoaWZ0IHNoaWZ0W10gPQotewotICB7ImFzbCIsIDB9LAotICB7ImxzbCIsIDB9LAotICB7ImxzciIsIDB4MDAwMDAwMjB9LAotICB7ImFzciIsIDB4MDAwMDAwNDB9LAotICB7InJvciIsIDB4MDAwMDAwNjB9LAotICB7InJyeCIsIDB4MDAwMDAwNjB9LAotICB7IkFTTCIsIDB9LAotICB7IkxTTCIsIDB9LAotICB7IkxTUiIsIDB4MDAwMDAwMjB9LAotICB7IkFTUiIsIDB4MDAwMDAwNDB9LAotICB7IlJPUiIsIDB4MDAwMDAwNjB9LAotICB7IlJSWCIsIDB4MDAwMDAwNjB9Ci19OwotCi0jZGVmaW5lIE5PX1NISUZUX1JFU1RSSUNUIDEKLSNkZWZpbmUgU0hJRlRfUkVTVFJJQ1QJICAwCi0KLSNkZWZpbmUgTlVNX0ZMT0FUX1ZBTFMgOAotCi1DT05TVCBjaGFyICogZnBfY29uc3RbXSA9IAotewotICAiMC4wIiwgIjEuMCIsICIyLjAiLCAiMy4wIiwgIjQuMCIsICI1LjAiLCAiMC41IiwgIjEwLjAiLCAwCi19OwotCi0vKiBOdW1iZXIgb2YgbGl0dGxlbnVtcyByZXF1aXJlZCB0byBob2xkIGFuIGV4dGVuZGVkIHByZWNpc2lvbiBudW1iZXIgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi1MSVRUTEVOVU1fVFlQRSBmcF92YWx1ZXNbTlVNX0ZMT0FUX1ZBTFNdW01BWF9MSVRUTEVOVU1TXTsKLQotI2RlZmluZSBGQUlMCSgtMSkKLSNkZWZpbmUgU1VDQ0VTUyAoMCkKLQotI2RlZmluZSBTVUZGX1MgMQotI2RlZmluZSBTVUZGX0QgMgotI2RlZmluZSBTVUZGX0UgMwotI2RlZmluZSBTVUZGX1AgNAotCi0jZGVmaW5lIENQX1RfWCAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgQ1BfVF9ZICAgMHgwMDQwMDAwMAotI2RlZmluZSBDUF9UX1ByZSAweDAxMDAwMDAwCi0jZGVmaW5lIENQX1RfVUQgIDB4MDA4MDAwMDAKLSNkZWZpbmUgQ1BfVF9XQiAgMHgwMDIwMDAwMAotCi0jZGVmaW5lIENPTkRTX0JJVCAgICAgICAoMHgwMDEwMDAwMCkKLSNkZWZpbmUgTE9BRF9CSVQgICAgICAgICgweDAwMTAwMDAwKQotI2RlZmluZSBUUkFOU19CSVQJKDB4MDAyMDAwMDApCi0KLXN0cnVjdCBhc21fY29uZAotewotICBDT05TVCBjaGFyICogIHRlbXBsYXRlOwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotfTsKLQotLyogVGhpcyBpcyB0byBzYXZlIGEgaGFzaCBsb29rLXVwIGluIHRoZSBjb21tb24gY2FzZSAqLwotI2RlZmluZSBDT05EX0FMV0FZUyAweGUwMDAwMDAwCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2NvbmQgY29uZHNbXSA9IAotewotICB7ImVxIiwgMHgwMDAwMDAwMH0sCi0gIHsibmUiLCAweDEwMDAwMDAwfSwKLSAgeyJjcyIsIDB4MjAwMDAwMDB9LCB7ImhzIiwgMHgyMDAwMDAwMH0sCi0gIHsiY2MiLCAweDMwMDAwMDAwfSwgeyJ1bCIsIDB4MzAwMDAwMDB9LCB7ImxvIiwgMHgzMDAwMDAwMH0sCi0gIHsibWkiLCAweDQwMDAwMDAwfSwKLSAgeyJwbCIsIDB4NTAwMDAwMDB9LAotICB7InZzIiwgMHg2MDAwMDAwMH0sCi0gIHsidmMiLCAweDcwMDAwMDAwfSwKLSAgeyJoaSIsIDB4ODAwMDAwMDB9LAotICB7ImxzIiwgMHg5MDAwMDAwMH0sCi0gIHsiZ2UiLCAweGEwMDAwMDAwfSwKLSAgeyJsdCIsIDB4YjAwMDAwMDB9LAotICB7Imd0IiwgMHhjMDAwMDAwMH0sCi0gIHsibGUiLCAweGQwMDAwMDAwfSwKLSAgeyJhbCIsIDB4ZTAwMDAwMDB9LAotICB7Im52IiwgMHhmMDAwMDAwMH0KLX07Ci0KLS8qIFdhcm5pbmc6IElmIHRoZSB0b3AgYml0IG9mIHRoZSBzZXRfYml0cyBpcyBzZXQsIHRoZW4gdGhlIHN0YW5kYXJkCi0gICBpbnN0cnVjdGlvbiBiaXRtYXNrIGlzIGlnbm9yZWQsIGFuZCB0aGUgbmV3IGJpdG1hc2sgaXMgdGFrZW4gZnJvbQotICAgdGhlIHNldF9iaXRzOiAqLwotc3RydWN0IGFzbV9mbGcKLXsKLSAgQ09OU1QgY2hhciAqICB0ZW1wbGF0ZTsJLyogQmFzaWMgZmxhZyBzdHJpbmcgKi8KLSAgdW5zaWduZWQgbG9uZyBzZXRfYml0czsJLyogQml0cyB0byBzZXQgKi8KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBzX2ZsYWdbXSA9Ci17Ci0gIHsicyIsIENPTkRTX0JJVH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGxkcl9mbGFnc1tdID0KLXsKLSAgeyJiIiwgIDB4MDA0MDAwMDB9LAotICB7InQiLCAgVFJBTlNfQklUfSwKLSAgeyJidCIsIDB4MDA0MDAwMDAgfCBUUkFOU19CSVR9LAotICB7ImgiLCAgMHg4MDEwMDBiMH0sCi0gIHsic2giLCAweDgwMTAwMGYwfSwKLSAgeyJzYiIsIDB4ODAxMDAwZDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBzdHJfZmxhZ3NbXSA9Ci17Ci0gIHsiYiIsICAweDAwNDAwMDAwfSwKLSAgeyJ0IiwgIFRSQU5TX0JJVH0sCi0gIHsiYnQiLCAweDAwNDAwMDAwIHwgVFJBTlNfQklUfSwKLSAgeyJoIiwgIDB4ODAwMDAwYjB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBieXRlX2ZsYWdbXSA9Ci17Ci0gIHsiYiIsIDB4MDA0MDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBjbXBfZmxhZ3NbXSA9Ci17Ci0gIHsicyIsIENPTkRTX0JJVH0sCi0gIHsicCIsIDB4MDAxMGYwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBsZG1fZmxhZ3NbXSA9Ci17Ci0gIHsiZWQiLCAweDAxODAwMDAwfSwKLSAgeyJmZCIsIDB4MDA4MDAwMDB9LAotICB7ImVhIiwgMHgwMTAwMDAwMH0sCi0gIHsiZmEiLCAweDA4MDAwMDAwfSwKLSAgeyJpYiIsIDB4MDE4MDAwMDB9LAotICB7ImlhIiwgMHgwMDgwMDAwMH0sCi0gIHsiZGIiLCAweDAxMDAwMDAwfSwKLSAgeyJkYSIsIDB4MDgwMDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBzdG1fZmxhZ3NbXSA9Ci17Ci0gIHsiZWQiLCAweDA4MDAwMDAwfSwKLSAgeyJmZCIsIDB4MDEwMDAwMDB9LAotICB7ImVhIiwgMHgwMDgwMDAwMH0sCi0gIHsiZmEiLCAweDAxODAwMDAwfSwKLSAgeyJpYiIsIDB4MDE4MDAwMDB9LAotICB7ImlhIiwgMHgwMDgwMDAwMH0sCi0gIHsiZGIiLCAweDAxMDAwMDAwfSwKLSAgeyJkYSIsIDB4MDgwMDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBsZm1fZmxhZ3NbXSA9Ci17Ci0gIHsiZmQiLCAweDAwODAwMDAwfSwKLSAgeyJlYSIsIDB4MDEwMDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBzZm1fZmxhZ3NbXSA9Ci17Ci0gIHsiZmQiLCAweDAxMDAwMDAwfSwKLSAgeyJlYSIsIDB4MDA4MDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyByb3VuZF9mbGFnc1tdID0KLXsKLSAgeyJwIiwgMHgwMDAwMDAyMH0sCi0gIHsibSIsIDB4MDAwMDAwNDB9LAotICB7InoiLCAweDAwMDAwMDYwfSwKLSAge05VTEwsIDB9Ci19OwotCi0vKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEZJWCBpbnN0cnVjdGlvbiBpcyBicm9rZW4gb24gc29tZSBhc3NlbWJsZXJzLAotICAgaW4gdGhhdCBpdCBhY2NlcHRzIGEgcHJlY2lzaW9uIHNwZWNpZmllciBhcyB3ZWxsIGFzIGEgcm91bmRpbmcgc3BlY2lmaWVyLAotICAgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHRoaXMgaXMgbWVhbmluZ2xlc3MuICBUbyBiZSBtb3JlIGNvbXBhdGlibGUsIHdlCi0gICBhY2NlcHQgaXQgYXMgd2VsbCwgdGhvdWdoIG9mIGNvdXJzZSBpdCBkb2VzIG5vdCBzZXQgYW55IGJpdHMuICAqLwotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGZpeF9mbGFnc1tdID0KLXsKLSAgeyJwIiwgMHgwMDAwMDAyMH0sCi0gIHsibSIsIDB4MDAwMDAwNDB9LAotICB7InoiLCAweDAwMDAwMDYwfSwKLSAgeyJzcCIsIDB4MDAwMDAwMjB9LAotICB7InNtIiwgMHgwMDAwMDA0MH0sCi0gIHsic3oiLCAweDAwMDAwMDYwfSwKLSAgeyJkcCIsIDB4MDAwMDAwMjB9LAotICB7ImRtIiwgMHgwMDAwMDA0MH0sCi0gIHsiZHoiLCAweDAwMDAwMDYwfSwKLSAgeyJlcCIsIDB4MDAwMDAwMjB9LAotICB7ImVtIiwgMHgwMDAwMDA0MH0sCi0gIHsiZXoiLCAweDAwMDAwMDYwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgZXhjZXB0X2ZsYWdbXSA9Ci17Ci0gIHsiZSIsIDB4MDA0MDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBjcGxvbmdfZmxhZ1tdID0KLXsKLSAgeyJsIiwgMHgwMDQwMDAwMH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RydWN0IGFzbV9wc3IKLXsKLSAgQ09OU1QgY2hhciAqICB0ZW1wbGF0ZTsKLSAgdW5zaWduZWQgbG9uZyBudW1iZXI7Ci19OwotCi0jZGVmaW5lIFBTUl9GSUVMRF9NQVNLICAweDAwMGYwMDAwCi0KLSNkZWZpbmUgUFNSX0ZMQUdTCTB4MDAwODAwMDAKLSNkZWZpbmUgUFNSX0NPTlRST0wJMHgwMDAxMDAwMCAvKiBVbmRvY3VtZW50ZWQgaW5zdHJ1Y3Rpb24sIGl0cyB1c2UgaXMgZGlzY291cmFnZWQgYnkgQVJNICovCi0jZGVmaW5lIFBTUl9BTEwJCTB4MDAwOTAwMDAKLQotI2RlZmluZSBDUFNSX0FMTAkwCi0jZGVmaW5lIFNQU1JfQUxMCTEKLSNkZWZpbmUgQ1BTUl9GTEcJMgotI2RlZmluZSBTUFNSX0ZMRwkzCi0jZGVmaW5lIENQU1JfQ1RMCTQKLSNkZWZpbmUgU1BTUl9DVEwJNQotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9wc3IgcHNyc1tdID0KLXsKLSAgLyogVmFsaWQgPHBzcj4ncyAqLwotICB7ImNwc3IiLAlDUFNSX0FMTH0sCi0gIHsiY3Bzcl9hbGwiLAlDUFNSX0FMTH0sCi0gIHsic3BzciIsCVNQU1JfQUxMfSwKLSAgeyJzcHNyX2FsbCIsCVNQU1JfQUxMfSwKLQotICAvKiBWYWxpZCA8cHNyZj4ncyAqLwotICB7ImNwc3JfZmxnIiwJQ1BTUl9GTEd9LAotICB7InNwc3JfZmxnIiwJU1BTUl9GTEd9LAotICAKLSAgLyogVmFsaWQgPHBzcmM+J3MgKi8KLSAgeyJjcHNyX2MiLAlDUFNSX0NUTH0sCi0gIHsiY3Bzcl9jdGwiLAlDUFNSX0NUTH0sCi0gIHsic3Bzcl9jIiwJU1BTUl9DVEx9LAotICB7InNwc3JfY3RsIiwJU1BTUl9DVEx9Ci19OwotCi0vKiBGdW5jdGlvbnMgY2FsbGVkIGJ5IHBhcnNlciAqLwotLyogQVJNIGluc3RydWN0aW9ucyAqLwotc3RhdGljIHZvaWQgZG9fYXJpdAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19jbXAJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fbW92CQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2xkc3QJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fbGRtc3RtCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2JyYW5jaAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19zd2kJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotLyogUHNldWRvIE9wIGNvZGVzICovCQkJICAgICAgIAkJICAgICAgCi1zdGF0aWMgdm9pZCBkb19hZHIJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fYWRybAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19ub3AJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotLyogQVJNIDIgKi8JCQkJICAgICAgIAkJICAgICAgCi1zdGF0aWMgdm9pZCBkb19tdWwJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fbWxhCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLS8qIEFSTSAzICovCQkJCSAgICAgICAJCSAgICAgIAotc3RhdGljIHZvaWQgZG9fc3dhcAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci0vKiBBUk0gNiAqLwkJCQkgICAgICAgCQkgICAgICAKLXN0YXRpYyB2b2lkIGRvX21zcgkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19tcnMJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotLyogQVJNIDdNICovCQkJCSAgICAgICAJCSAgICAgIAotc3RhdGljIHZvaWQgZG9fbXVsbAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci0vKiBBUk0gVEhVTUIgKi8JCQkJICAgICAgIAkJICAgICAgCi1zdGF0aWMgdm9pZCBkb19ieCAgICAgICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotCi0JCQkJCSAgICAgICAJCSAgICAgIAotLyogQ29wcm9jZXNzb3IgSW5zdHJ1Y3Rpb25zICovCQkgICAgICAgCQkgICAgICAKLXN0YXRpYyB2b2lkIGRvX2NkcAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19sc3RjCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2NvX3JlZwkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19mcF9jdHJsCQlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX2xkc3QJCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fZnBfbGRtc3RtCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fZnBfZHlhZGljCVBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgZG9fZnBfbW9uYWRpYwlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX2NtcAkJUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBkb19mcF9mcm9tX3JlZwlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX3RvX3JlZwlQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLQotc3RhdGljIHZvaWQgZml4X25ld19hcm0JCVBBUkFNUyAoKGZyYWdTICosIGludCwgc2hvcnQsIGV4cHJlc3Npb25TICosIGludCwgaW50KSk7Ci1zdGF0aWMgaW50IGFybV9yZWdfcGFyc2UJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBhcm1fcHNyX3BhcnNlCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHN5bWJvbF9sb2NhdGUJUEFSQU1TICgoc3ltYm9sUyAqLCBDT05TVCBjaGFyICosIHNlZ1QsIHZhbHVlVCwgZnJhZ1MgKikpOwotc3RhdGljIGludCBhZGRfdG9fbGl0X3Bvb2wJUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHVuc2lnbmVkIHZhbGlkYXRlX2ltbWVkaWF0ZSBQQVJBTVMgKCh1bnNpZ25lZCkpOwotc3RhdGljIHVuc2lnbmVkIHZhbGlkYXRlX2ltbWVkaWF0ZV90d29wYXJ0IFBBUkFNUyAoKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICopKTsKLXN0YXRpYyBpbnQgdmFsaWRhdGVfb2Zmc2V0X2ltbQlQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgb3Bjb2RlX3NlbGVjdAlQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGVuZF9vZl9saW5lCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgcmVnX3JlcXVpcmVkX2hlcmUJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IHBzcl9yZXF1aXJlZF9oZXJlCVBBUkFNUyAoKGNoYXIgKiosIGludCwgaW50KSk7Ci1zdGF0aWMgaW50IGNvX3Byb2NfbnVtYmVyCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgY3Bfb3BjX2V4cHIJCVBBUkFNUyAoKGNoYXIgKiosIGludCwgaW50KSk7Ci1zdGF0aWMgaW50IGNwX3JlZ19yZXF1aXJlZF9oZXJlCVBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBmcF9yZWdfcmVxdWlyZWRfaGVyZQlQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgY3BfYWRkcmVzc19vZmZzZXQJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBteV9nZXRfZmxvYXRfZXhwcmVzc2lvbglQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHNraXBfcGFzdF9jb21tYQlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHdhbGtfbm9fYmlnbnVtcwlQQVJBTVMgKChzeW1ib2xTICopKTsKLXN0YXRpYyBpbnQgbmVnYXRlX2RhdGFfb3AJUEFSQU1TICgodW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50IGRhdGFfb3AyCQlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGZwX29wMgkJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGxvbmcgcmVnX2xpc3QJCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHRodW1iX2xvYWRfc3RvcmUJUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIGludCBkZWNvZGVfc2hpZnQJCVBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBsZHN0X2V4dGVuZAkJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB0aHVtYl9hZGRfc3ViCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfcmVnCQlQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHRodW1iX3NoaWZ0CQlQQVJBTVMgKChjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgdGh1bWJfbW92X2NvbXBhcmUJUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNldF9jb25zdGFudF9mbG9udW1zCVBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2YWx1ZVQgbWRfY2hhcnNfdG9fbnVtYmVyCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfcmVnX2FsaWFzCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvdXRwdXRfaW5zdAkJUEFSQU1TICgodm9pZCkpOwotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUJYXJtX3BhcnNlX3JlbG9jIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0vKiBBUk0gaW5zdHJ1Y3Rpb25zIHRha2UgNGJ5dGVzIGluIHRoZSBvYmplY3QgZmlsZSwgVGh1bWIgaW5zdHJ1Y3Rpb25zCi0gICB0YWtlIDI6ICovCi0jZGVmaW5lIElOU05fU0laRSAgICAgICA0Ci0KLS8qIExPTkdFU1RfSU5TVCBpcyB0aGUgbG9uZ2VzdCBiYXNpYyBpbnN0cnVjdGlvbiBuYW1lIHdpdGhvdXQgY29uZGl0aW9ucyBvciAKLSAqIGZsYWdzLgotICogQVJNN00gaGFzIDQgb2YgbGVuZ3RoIDUKLSAqLwotCi0jZGVmaW5lIExPTkdFU1RfSU5TVCA1Ci0KLQotc3RydWN0IGFzbV9vcGNvZGUgCi17Ci0gIENPTlNUIGNoYXIgKiAgICAgICAgICAgdGVtcGxhdGU7CS8qIEJhc2ljIHN0cmluZyB0byBtYXRjaCAqLwotICB1bnNpZ25lZCBsb25nICAgICAgICAgIHZhbHVlOwkJLyogQmFzaWMgaW5zdHJ1Y3Rpb24gY29kZSAqLwotCi0gIC8qIENvbXB1bHNvcnkgc3VmZml4IHRoYXQgbXVzdCBmb2xsb3cgY29uZHMuIElmICIiLCB0aGVuIHRoZQotICAgICBpbnN0cnVjdGlvbiBpcyBub3QgY29uZGl0aW9uYWwgYW5kIG11c3QgaGF2ZSBubyBzdWZmaXguICovCi0gIENPTlNUIGNoYXIgKiAgICAgICAgICAgY29tcF9zdWZmaXg7CQotCi0gIENPTlNUIHN0cnVjdCBhc21fZmxnICogZmxhZ3M7CSAgICAgICAgLyogQml0cyB0byB0b2dnbGUgaWYgZmxhZyAnbicgc2V0ICovCi0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmFyaWFudHM7CS8qIFdoaWNoIENQVSB2YXJpYW50cyB0aGlzIGV4aXN0cyBmb3IgKi8KLSAgLyogRnVuY3Rpb24gdG8gY2FsbCB0byBwYXJzZSBhcmdzICovCi0gIHZvaWQgKCogICAgICAgICAgICAgICAgcGFybXMpIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fb3Bjb2RlIGluc25zW10gPSAKLXsKLS8qIEFSTSBJbnN0cnVjdGlvbnMgKi8KLSAgeyJhbmQiLCAgIDB4MDAwMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsiZW9yIiwgICAweDAwMjAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7InN1YiIsICAgMHgwMDQwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJyc2IiLCAgIDB4MDA2MDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsiYWRkIiwgICAweDAwODAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7ImFkYyIsICAgMHgwMGEwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJzYmMiLCAgIDB4MDBjMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsicnNjIiwgICAweDAwZTAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7Im9yciIsICAgMHgwMTgwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJiaWMiLCAgIDB4MDFjMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsidHN0IiwgICAweDAxMDAwMDAwLCBOVUxMLCAgIGNtcF9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2NtcH0sCi0gIHsidGVxIiwgICAweDAxMjAwMDAwLCBOVUxMLCAgIGNtcF9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2NtcH0sCi0gIHsiY21wIiwgICAweDAxNDAwMDAwLCBOVUxMLCAgIGNtcF9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2NtcH0sCi0gIHsiY21uIiwgICAweDAxNjAwMDAwLCBOVUxMLCAgIGNtcF9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2NtcH0sCi0gIHsibW92IiwgICAweDAxYTAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX21vdn0sCi0gIHsibXZuIiwgICAweDAxZTAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX21vdn0sCi0gIHsic3RyIiwgICAweDA0MDAwMDAwLCBOVUxMLCAgIHN0cl9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2xkc3R9LAotICB7ImxkciIsICAgMHgwNDEwMDAwMCwgTlVMTCwgICBsZHJfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19sZHN0fSwKLSAgeyJzdG0iLCAgIDB4MDgwMDAwMDAsIE5VTEwsICAgc3RtX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fbGRtc3RtfSwKLSAgeyJsZG0iLCAgIDB4MDgxMDAwMDAsIE5VTEwsICAgbGRtX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fbGRtc3RtfSwKLSAgeyJzd2kiLCAgIDB4MGYwMDAwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV9BTlksICAgICAgZG9fc3dpfSwKLSAgeyJibCIsICAgIDB4MGJmZmZmZmUsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV9BTlksICAgICAgZG9fYnJhbmNofSwKLSAgeyJiIiwgICAgIDB4MGFmZmZmZmUsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV9BTlksICAgICAgZG9fYnJhbmNofSwKLQotLyogUHNldWRvIG9wcyAqLwotICB7ImFkciIsICAgMHgwMjhmMDAwMCwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX0FOWSwgICAgICBkb19hZHJ9LAotICB7ImFkcmwiLCAgMHgwMjhmMDAwMCwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX0FOWSwgICAgICBkb19hZHJsfSwKLSAgeyJub3AiLCAgIDB4MDFhMDAwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV9BTlksICAgICAgZG9fbm9wfSwKLQotLyogQVJNIDIgbXVsdGlwbGllcyAqLwotICB7Im11bCIsICAgMHgwMDAwMDA5MCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNXzJVUCwgICAgICBkb19tdWx9LAotICB7Im1sYSIsICAgMHgwMDIwMDA5MCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNXzJVUCwgICAgICBkb19tbGF9LAotCi0vKiBBUk0gMyAtIHN3cCBpbnN0cnVjdGlvbnMgKi8KLSAgeyJzd3AiLCAgIDB4MDEwMDAwOTAsIE5VTEwsICAgYnl0ZV9mbGFnLCAgIEFSTV8zVVAsICAgICAgZG9fc3dhcH0sCi0KLS8qIEFSTSA2IENvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLwotICB7Im1ycyIsICAgMHgwMTBmMDAwMCwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNXzZVUCwgICAgICBkb19tcnN9LAotICB7Im1zciIsICAgMHgwMTIwZjAwMCwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNXzZVUCwgICAgICBkb19tc3J9LAotLyogU2NvdHRCOiBvdXIgY29kZSB1c2VzIDB4MDEyOGYwMDAgZm9yIG1zci4KLSAgIE5pY2tDOiAgYnV0IHRoaXMgaXMgd3JvbmcgYmVjYXVzZSB0aGUgYml0cyAxNiBhbmQgMTkgYXJlIGhhbmRsZWQKLSAgICAgICAgICAgYnkgdGhlIFBTUl94eHggZGVmaW5lcyBhYm92ZS4gICovCi0KLS8qIEFSTSA3TSBsb25nIG11bHRpcGxpZXMgLSBuZWVkIHNpZ25lZC91bnNpZ25lZCBmbGFncyEgKi8KLSAgeyJzbXVsbCIsIDB4MDBjMDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9MT05HTVVMLCAgZG9fbXVsbH0sCi0gIHsidW11bGwiLCAweDAwODAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fTE9OR01VTCwgIGRvX211bGx9LAotICB7InNtbGFsIiwgMHgwMGUwMDA5MCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0xPTkdNVUwsICBkb19tdWxsfSwKLSAgeyJ1bWxhbCIsIDB4MDBhMDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9MT05HTVVMLCAgZG9fbXVsbH0sCi0KLS8qIEFSTSBUSFVNQiBpbnRlcndvcmtpbmcgKi8KLSAgeyJieCIsICAgIDB4MDEyZmZmMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV9USFVNQiwgICAgZG9fYnh9LAotCi0vKiBGbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KLSAgeyJ3ZnMiLCAgIDB4MGUyMDAxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY3RybH0sCi0gIHsicmZzIiwgICAweDBlMzAwMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2N0cmx9LAotICB7IndmYyIsICAgMHgwZTQwMDExMCwgTlVMTCwgICBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9jdHJsfSwKLSAgeyJyZmMiLCAgIDB4MGU1MDAxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY3RybH0sCi0gIHsibGRmIiwgICAweDBjMTAwMTAwLCAic2RlcCIsIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2xkc3R9LAotICB7InN0ZiIsICAgMHgwYzAwMDEwMCwgInNkZXAiLCBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9sZHN0fSwKLSAgeyJsZm0iLCAgIDB4MGMxMDAyMDAsIE5VTEwsICAgbGZtX2ZsYWdzLCAgIEZQVV9NRU1NVUxUSSwgZG9fZnBfbGRtc3RtfSwKLSAgeyJzZm0iLCAgIDB4MGMwMDAyMDAsIE5VTEwsICAgc2ZtX2ZsYWdzLCAgIEZQVV9NRU1NVUxUSSwgZG9fZnBfbGRtc3RtfSwKLSAgeyJtdmYiLCAgIDB4MGUwMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsibW5mIiwgICAweDBlMTA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImFicyIsICAgMHgwZTIwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJybmQiLCAgIDB4MGUzMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsic3F0IiwgICAweDBlNDA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImxvZyIsICAgMHgwZTUwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJsZ24iLCAgIDB4MGU2MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsiZXhwIiwgICAweDBlNzA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7InNpbiIsICAgMHgwZTgwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJjb3MiLCAgIDB4MGU5MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsidGFuIiwgICAweDBlYTA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImFzbiIsICAgMHgwZWIwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJhY3MiLCAgIDB4MGVjMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsiYXRuIiwgICAweDBlZDA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7InVyZCIsICAgMHgwZWUwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJucm0iLCAgIDB4MGVmMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsiYWRmIiwgICAweDBlMDAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCi0gIHsic3VmIiwgICAweDBlMjAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCi0gIHsicnNmIiwgICAweDBlMzAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCi0gIHsibXVmIiwgICAweDBlMTAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCi0gIHsiZHZmIiwgICAweDBlNDAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCi0gIHsicmRmIiwgICAweDBlNTAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCi0gIHsicG93IiwgICAweDBlNjAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCi0gIHsicnB3IiwgICAweDBlNzAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCi0gIHsicm1mIiwgICAweDBlODAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCi0gIHsiZm1sIiwgICAweDBlOTAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCi0gIHsiZmR2IiwgICAweDBlYTAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCi0gIHsiZnJkIiwgICAweDBlYjAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCi0gIHsicG9sIiwgICAweDBlYzAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCi0gIHsiY21mIiwgICAweDBlOTBmMTEwLCBOVUxMLCAgIGV4Y2VwdF9mbGFnLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2NtcH0sCi0gIHsiY25mIiwgICAweDBlYjBmMTEwLCBOVUxMLCAgIGV4Y2VwdF9mbGFnLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2NtcH0sCi0vKiBUaGUgRlBBMTAgZGF0YSBzaGVldCBzdWdnZXN0cyB0aGF0IHRoZSAnRScgb2YgY21mZS9jbmZlIHNob3VsZCBub3QKLSAgIGJlIGFuIG9wdGlvbmFsIHN1ZmZpeCwgYnV0IHBhcnQgb2YgdGhlIGluc3RydWN0aW9uLiAgVG8gYmUgY29tcGF0aWJsZSwKLSAgIHdlIGFjY2VwdCBlaXRoZXIuICAqLwotICB7ImNtZmUiLCAgMHgwZWQwZjExMCwgTlVMTCwgICBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9jbXB9LAotICB7ImNuZmUiLCAgMHgwZWYwZjExMCwgTlVMTCwgICBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9jbXB9LAotICB7ImZsdCIsICAgMHgwZTAwMDExMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9mcm9tX3JlZ30sCi0gIHsiZml4IiwgICAweDBlMTAwMTEwLCBOVUxMLCAgIGZpeF9mbGFncywgICBGUFVfQUxMLCAgICAgIGRvX2ZwX3RvX3JlZ30sCi0KLS8qIEdlbmVyaWMgY29wcmVzc29yIGluc3RydWN0aW9ucyAqLwotICB7ImNkcCIsICAgMHgwZTAwMDAwMCwgTlVMTCwgIE5VTEwsICAgICAgICAgQVJNXzJVUCwgICAgICBkb19jZHB9LAotICB7ImxkYyIsICAgMHgwYzEwMDAwMCwgTlVMTCwgIGNwbG9uZ19mbGFnLCAgQVJNXzJVUCwgICAgICBkb19sc3RjfSwKLSAgeyJzdGMiLCAgIDB4MGMwMDAwMDAsIE5VTEwsICBjcGxvbmdfZmxhZywgIEFSTV8yVVAsICAgICAgZG9fbHN0Y30sCi0gIHsibWNyIiwgICAweDBlMDAwMDEwLCBOVUxMLCAgTlVMTCwgICAgICAgICBBUk1fMlVQLCAgICAgIGRvX2NvX3JlZ30sCi0gIHsibXJjIiwgICAweDBlMTAwMDEwLCBOVUxMLCAgTlVMTCwgICAgICAgICBBUk1fMlVQLCAgICAgIGRvX2NvX3JlZ30sCi19OwotCi0vKiBkZWZpbmVzIGZvciB2YXJpb3VzIGJpdHMgdGhhdCB3ZSB3aWxsIHdhbnQgdG8gdG9nZ2xlICovCi0KLSNkZWZpbmUgSU5TVF9JTU1FRElBVEUJMHgwMjAwMDAwMAotI2RlZmluZSBPRkZTRVRfUkVHCTB4MDIwMDAwMDAKLSNkZWZpbmUgSFdPRkZTRVRfSU1NICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgU0hJRlRfQllfUkVHCTB4MDAwMDAwMTAKLSNkZWZpbmUgUFJFX0lOREVYCTB4MDEwMDAwMDAKLSNkZWZpbmUgSU5ERVhfVVAJMHgwMDgwMDAwMAotI2RlZmluZSBXUklURV9CQUNLCTB4MDAyMDAwMDAKLSNkZWZpbmUgTERNX1RZUEVfMl9PUl8zCTB4MDA0MDAwMDAKLQotI2RlZmluZSBMSVRFUkFMX01BU0sJMHhmMDAwZjAwMAotI2RlZmluZSBDT05EX01BU0sJMHhmMDAwMDAwMAotI2RlZmluZSBPUENPREVfTUFTSwkweGZlMWZmZmZmCi0jZGVmaW5lIERBVEFfT1BfU0hJRlQJMjEKLQotLyogQ29kZXMgdG8gZGlzdGluZ3Vpc2ggdGhlIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zICovCi0KLSNkZWZpbmUgT1BDT0RFX0FORAkwCi0jZGVmaW5lIE9QQ09ERV9FT1IJMQotI2RlZmluZSBPUENPREVfU1VCCTIKLSNkZWZpbmUgT1BDT0RFX1JTQgkzCi0jZGVmaW5lIE9QQ09ERV9BREQJNAotI2RlZmluZSBPUENPREVfQURDCTUKLSNkZWZpbmUgT1BDT0RFX1NCQwk2Ci0jZGVmaW5lIE9QQ09ERV9SU0MJNwotI2RlZmluZSBPUENPREVfVFNUCTgKLSNkZWZpbmUgT1BDT0RFX1RFUQk5Ci0jZGVmaW5lIE9QQ09ERV9DTVAJMTAKLSNkZWZpbmUgT1BDT0RFX0NNTgkxMQotI2RlZmluZSBPUENPREVfT1JSCTEyCi0jZGVmaW5lIE9QQ09ERV9NT1YJMTMKLSNkZWZpbmUgT1BDT0RFX0JJQwkxNAotI2RlZmluZSBPUENPREVfTVZOCTE1Ci0KLXN0YXRpYyB2b2lkIGRvX3Rfbm9wCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfYXJpdAkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2FkZAkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2FzcgkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2JyYW5jaDkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2JyYW5jaDEyCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9icmFuY2gyMwlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfYngJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9jb21wYXJlCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9sZG1zdG0JCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9sZHIJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9sZHJiCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3RfbGRyaAkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2xkcwkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2xzbAkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2xzcgkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X21vdgkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X3B1c2hfcG9wCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9zdHIJCVBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgZG9fdF9zdHJiCQlQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3RyaAkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X3N1YgkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X3N3aQkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBkb190X2FkcgkJUEFSQU1TICgoY2hhciAqKSk7Ci0KLSNkZWZpbmUgVF9PUENPREVfTVVMIDB4NDM0MAotI2RlZmluZSBUX09QQ09ERV9UU1QgMHg0MjAwCi0jZGVmaW5lIFRfT1BDT0RFX0NNTiAweDQyYzAKLSNkZWZpbmUgVF9PUENPREVfTkVHIDB4NDI0MAotI2RlZmluZSBUX09QQ09ERV9NVk4gMHg0M2MwCi0KLSNkZWZpbmUgVF9PUENPREVfQUREX1IzCTB4MTgwMAotI2RlZmluZSBUX09QQ09ERV9TVUJfUjMgMHgxYTAwCi0jZGVmaW5lIFRfT1BDT0RFX0FERF9ISSAweDQ0MDAKLSNkZWZpbmUgVF9PUENPREVfQUREX1NUIDB4YjAwMAotI2RlZmluZSBUX09QQ09ERV9TVUJfU1QgMHhiMDgwCi0jZGVmaW5lIFRfT1BDT0RFX0FERF9TUCAweGE4MDAKLSNkZWZpbmUgVF9PUENPREVfQUREX1BDIDB4YTAwMAotI2RlZmluZSBUX09QQ09ERV9BRERfSTggMHgzMDAwCi0jZGVmaW5lIFRfT1BDT0RFX1NVQl9JOCAweDM4MDAKLSNkZWZpbmUgVF9PUENPREVfQUREX0kzIDB4MWMwMAotI2RlZmluZSBUX09QQ09ERV9TVUJfSTMgMHgxZTAwCi0KLSNkZWZpbmUgVF9PUENPREVfQVNSX1IJMHg0MTAwCi0jZGVmaW5lIFRfT1BDT0RFX0xTTF9SCTB4NDA4MAotI2RlZmluZSBUX09QQ09ERV9MU1JfUiAgMHg0MGMwCi0jZGVmaW5lIFRfT1BDT0RFX0FTUl9JCTB4MTAwMAotI2RlZmluZSBUX09QQ09ERV9MU0xfSQkweDAwMDAKLSNkZWZpbmUgVF9PUENPREVfTFNSX0kJMHgwODAwCi0KLSNkZWZpbmUgVF9PUENPREVfTU9WX0k4CTB4MjAwMAotI2RlZmluZSBUX09QQ09ERV9DTVBfSTggMHgyODAwCi0jZGVmaW5lIFRfT1BDT0RFX0NNUF9MUiAweDQyODAKLSNkZWZpbmUgVF9PUENPREVfTU9WX0hSIDB4NDYwMAotI2RlZmluZSBUX09QQ09ERV9DTVBfSFIgMHg0NTAwCi0KLSNkZWZpbmUgVF9PUENPREVfTERSX1BDIDB4NDgwMAotI2RlZmluZSBUX09QQ09ERV9MRFJfU1AgMHg5ODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NUUl9TUCAweDkwMDAKLSNkZWZpbmUgVF9PUENPREVfTERSX0lXIDB4NjgwMAotI2RlZmluZSBUX09QQ09ERV9TVFJfSVcgMHg2MDAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9JSCAweDg4MDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX0lIIDB4ODAwMAotI2RlZmluZSBUX09QQ09ERV9MRFJfSUIgMHg3ODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NUUl9JQiAweDcwMDAKLSNkZWZpbmUgVF9PUENPREVfTERSX1JXIDB4NTgwMAotI2RlZmluZSBUX09QQ09ERV9TVFJfUlcgMHg1MDAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9SSCAweDVhMDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX1JIIDB4NTIwMAotI2RlZmluZSBUX09QQ09ERV9MRFJfUkIgMHg1YzAwCi0jZGVmaW5lIFRfT1BDT0RFX1NUUl9SQiAweDU0MDAKLQotI2RlZmluZSBUX09QQ09ERV9QVVNICTB4YjQwMAotI2RlZmluZSBUX09QQ09ERV9QT1AJMHhiYzAwCi0KLSNkZWZpbmUgVF9PUENPREVfQlJBTkNIIDB4ZTdmZQotCi1zdGF0aWMgaW50IHRodW1iX3JlZwkJUEFSQU1TICgoY2hhciAqKiBzdHIsIGludCBoaV9sbykpOwotCi0jZGVmaW5lIFRIVU1CX1NJWkUJMgkvKiBTaXplIG9mIHRodW1iIGluc3RydWN0aW9uICovCi0jZGVmaW5lIFRIVU1CX1JFR19MTwkweDEKLSNkZWZpbmUgVEhVTUJfUkVHX0hJCTB4MgotI2RlZmluZSBUSFVNQl9SRUdfQU5ZCTB4MwotCi0jZGVmaW5lIFRIVU1CX0gxCTB4MDA4MAotI2RlZmluZSBUSFVNQl9IMgkweDAwNDAKLQotI2RlZmluZSBUSFVNQl9BU1IgMAotI2RlZmluZSBUSFVNQl9MU0wgMQotI2RlZmluZSBUSFVNQl9MU1IgMgotCi0jZGVmaW5lIFRIVU1CX01PVkUgMAotI2RlZmluZSBUSFVNQl9DT01QQVJFIDEKLQotI2RlZmluZSBUSFVNQl9MT0FEIDAKLSNkZWZpbmUgVEhVTUJfU1RPUkUgMQotCi0jZGVmaW5lIFRIVU1CX1BQX1BDX0xSIDB4MDEwMAotCi0vKiBUaGVzZSB0aHJlZSBhcmUgdXNlZCBmb3IgaW1tZWRpYXRlIHNoaWZ0cywgZG8gbm90IGFsdGVyICovCi0jZGVmaW5lIFRIVU1CX1dPUkQgMgotI2RlZmluZSBUSFVNQl9IQUxGV09SRCAxCi0jZGVmaW5lIFRIVU1CX0JZVEUgMAotCi1zdHJ1Y3QgdGh1bWJfb3Bjb2RlIAotewotICBDT05TVCBjaGFyICogIHRlbXBsYXRlOwkvKiBCYXNpYyBzdHJpbmcgdG8gbWF0Y2ggKi8KLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsJCS8qIEJhc2ljIGluc3RydWN0aW9uIGNvZGUgKi8KLSAgaW50ICAgICAgICAgICBzaXplOwotICB1bnNpZ25lZCBsb25nICAgICAgICAgIHZhcmlhbnRzOyAgICAvKiBXaGljaCBDUFUgdmFyaWFudHMgdGhpcyBleGlzdHMgZm9yICovCi0gIHZvaWQgKCogICAgICAgcGFybXMpIFBBUkFNUyAoKGNoYXIgKikpOyAgLyogRnVuY3Rpb24gdG8gY2FsbCB0byBwYXJzZSBhcmdzICovCi19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IHRodW1iX29wY29kZSB0aW5zbnNbXSA9Ci17Ci0gIHsiYWRjIiwJMHg0MTQwLAkJMiwJQVJNX1RIVU1CLCBkb190X2FyaXR9LAotICB7ImFkZCIsCTB4MDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9hZGR9LAotICB7ImFuZCIsCTB4NDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9hcml0fSwKLSAgeyJhc3IiLAkweDAwMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYXNyfSwKLSAgeyJiIiwJCVRfT1BDT0RFX0JSQU5DSCwgMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDEyfSwKLSAgeyJiZXEiLAkweGQwZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYm5lIiwJMHhkMWZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJjcyIsCTB4ZDJmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJiaHMiLAkweGQyZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYmNjIiwJMHhkM2ZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJ1bCIsCTB4ZDNmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJibG8iLAkweGQzZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYm1pIiwJMHhkNGZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJwbCIsCTB4ZDVmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJidnMiLAkweGQ2ZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYnZjIiwJMHhkN2ZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJoaSIsCTB4ZDhmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJibHMiLAkweGQ5ZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYmdlIiwJMHhkYWZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJsdCIsCTB4ZGJmZSwJCTIsCUFSTV9USFVNQiwgZG9fdF9icmFuY2g5fSwKLSAgeyJiZ3QiLAkweGRjZmUsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnJhbmNoOX0sCi0gIHsiYmxlIiwJMHhkZGZlLAkJMiwJQVJNX1RIVU1CLCBkb190X2JyYW5jaDl9LAotICB7ImJpYyIsCTB4NDM4MCwJCTIsCUFSTV9USFVNQiwgZG9fdF9hcml0fSwKLSAgeyJibCIsCTB4ZjdmZmZmZmUsCTQsCUFSTV9USFVNQiwgZG9fdF9icmFuY2gyM30sCi0gIHsiYngiLAkweDQ3MDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYnh9LAotICB7ImNtbiIsCVRfT1BDT0RFX0NNTiwJMiwJQVJNX1RIVU1CLCBkb190X2FyaXR9LAotICB7ImNtcCIsCTB4MDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9jb21wYXJlfSwKLSAgeyJlb3IiLAkweDQwNDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfYXJpdH0sCi0gIHsibGRtaWEiLAkweGM4MDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbGRtc3RtfSwKLSAgeyJsZHIiLAkweDAwMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbGRyfSwKLSAgeyJsZHJiIiwJMHgwMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2xkcmJ9LAotICB7ImxkcmgiLAkweDAwMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbGRyaH0sCi0gIHsibGRyc2IiLAkweDU2MDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbGRzfSwKLSAgeyJsZHJzaCIsCTB4NWUwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9sZHN9LAotICB7Imxkc2IiLAkweDU2MDAsCQkyLAlBUk1fVEhVTUIsIGRvX3RfbGRzfSwKLSAgeyJsZHNoIiwJMHg1ZTAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2xkc30sCi0gIHsibHNsIiwJMHgwMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2xzbH0sCi0gIHsibHNyIiwJMHgwMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2xzcn0sCi0gIHsibW92IiwJMHgwMDAwLAkJMiwJQVJNX1RIVU1CLCBkb190X21vdn0sCi0gIHsibXVsIiwJVF9PUENPREVfTVVMLAkyLAlBUk1fVEhVTUIsIGRvX3RfYXJpdH0sCi0gIHsibXZuIiwJVF9PUENPREVfTVZOLAkyLAlBUk1fVEhVTUIsIGRvX3RfYXJpdH0sCi0gIHsibmVnIiwJVF9PUENPREVfTkVHLAkyLAlBUk1fVEhVTUIsIGRvX3RfYXJpdH0sCi0gIHsib3JyIiwJMHg0MzAwLAkJMiwJQVJNX1RIVU1CLCBkb190X2FyaXR9LAotICB7InBvcCIsCTB4YmMwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9wdXNoX3BvcH0sCi0gIHsicHVzaCIsCTB4YjQwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9wdXNoX3BvcH0sCi0gIHsicm9yIiwJMHg0MWMwLAkJMiwJQVJNX1RIVU1CLCBkb190X2FyaXR9LAotICB7InNiYyIsCTB4NDE4MCwJCTIsCUFSTV9USFVNQiwgZG9fdF9hcml0fSwKLSAgeyJzdG1pYSIsCTB4YzAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9sZG1zdG19LAotICB7InN0ciIsCTB4MDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9zdHJ9LAotICB7InN0cmIiLAkweDAwMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3Rfc3RyYn0sCi0gIHsic3RyaCIsCTB4MDAwMCwJCTIsCUFSTV9USFVNQiwgZG9fdF9zdHJofSwKLSAgeyJzd2kiLAkweGRmMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3Rfc3dpfSwKLSAgeyJzdWIiLAkweDAwMDAsCQkyLAlBUk1fVEhVTUIsIGRvX3Rfc3VifSwKLSAgeyJ0c3QiLAlUX09QQ09ERV9UU1QsCTIsCUFSTV9USFVNQiwgZG9fdF9hcml0fSwKLSAgLyogUHNldWRvIG9wczogKi8KLSAgeyJhZHIiLCAgICAgICAweDAwMDAsICAgICAgICAgMiwgICAgICBBUk1fVEhVTUIsIGRvX3RfYWRyfSwKLSAgeyJub3AiLCAgICAgICAweDQ2QzAsICAgICAgICAgMiwgICAgICBBUk1fVEhVTUIsIGRvX3Rfbm9wfSwgICAgICAvKiBtb3YgcjgscjggKi8KLX07Ci0KLXN0cnVjdCByZWdfZW50cnkKLXsKLSAgQ09OU1QgY2hhciAqIG5hbWU7Ci0gIGludCAgICAgICAgICBudW1iZXI7Ci19OwotCi0jZGVmaW5lIGludF9yZWdpc3RlcihyZWcpICgocmVnKSA+PSAwICYmIChyZWcpIDw9IDE1KQotI2RlZmluZSBjcF9yZWdpc3RlcihyZWcpICgocmVnKSA+PSAzMiAmJiAocmVnKSA8PSA0NykKLSNkZWZpbmUgZnBfcmVnaXN0ZXIocmVnKSAoKHJlZykgPj0gMTYgJiYgKHJlZykgPD0gMjMpCi0KLSNkZWZpbmUgUkVHX1BDCTE1Ci0jZGVmaW5lIFJFR19MUiAgMTQKLSNkZWZpbmUgUkVHX1NQICAxMwotCi0vKiBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkIG5hbWVzOyAgVXNlcnMgY2FuIGFkZCBhbGlhc2VzIHdpdGggLnJlcSAqLwotc3RhdGljIENPTlNUIHN0cnVjdCByZWdfZW50cnkgcmVnX3RhYmxlW10gPQotewotICAvKiBQcm9jZXNzb3IgUmVnaXN0ZXIgTnVtYmVycyAqLwotICB7InIwIiwgMH0sICAgIHsicjEiLCAxfSwgICAgICB7InIyIiwgMn0sICAgICAgeyJyMyIsIDN9LAotICB7InI0IiwgNH0sICAgIHsicjUiLCA1fSwgICAgICB7InI2IiwgNn0sICAgICAgeyJyNyIsIDd9LAotICB7InI4IiwgOH0sICAgIHsicjkiLCA5fSwgICAgICB7InIxMCIsIDEwfSwgICAgeyJyMTEiLCAxMX0sCi0gIHsicjEyIiwgMTJ9LCAgeyJyMTMiLCBSRUdfU1B9LHsicjE0IiwgUkVHX0xSfSx7InIxNSIsIFJFR19QQ30sCi0gIC8qIEFQQ1MgY29udmVudGlvbnMgKi8KLSAgeyJhMSIsIDB9LAl7ImEyIiwgMX0sICAgIHsiYTMiLCAyfSwgICAgIHsiYTQiLCAzfSwKLSAgeyJ2MSIsIDR9LAl7InYyIiwgNX0sICAgIHsidjMiLCA2fSwgICAgIHsidjQiLCA3fSwgICAgIHsidjUiLCA4fSwKLSAgeyJ2NiIsIDl9LAl7InNiIiwgOX0sICAgIHsidjciLCAxMH0sICAgIHsic2wiLCAxMH0sCi0gIHsiZnAiLCAxMX0sCXsiaXAiLCAxMn0sICAgeyJzcCIsIFJFR19TUH0seyJsciIsIFJFR19MUn0seyJwYyIsIFJFR19QQ30sCi0gIC8qIEZQIFJlZ2lzdGVycyAqLwotICB7ImYwIiwgMTZ9LCAgIHsiZjEiLCAxN30sICAgeyJmMiIsIDE4fSwgICB7ImYzIiwgMTl9LAotICB7ImY0IiwgMjB9LCAgIHsiZjUiLCAyMX0sICAgeyJmNiIsIDIyfSwgICB7ImY3IiwgMjN9LAotICB7ImMwIiwgMzJ9LCAgIHsiYzEiLCAzM30sICAgeyJjMiIsIDM0fSwgICB7ImMzIiwgMzV9LAotICB7ImM0IiwgMzZ9LCAgIHsiYzUiLCAzN30sICAgeyJjNiIsIDM4fSwgICB7ImM3IiwgMzl9LAotICB7ImM4IiwgNDB9LCAgIHsiYzkiLCA0MX0sICAgeyJjMTAiLCA0Mn0sICB7ImMxMSIsIDQzfSwKLSAgeyJjMTIiLCA0NH0sICB7ImMxMyIsIDQ1fSwgIHsiYzE0IiwgNDZ9LCAgeyJjMTUiLCA0N30sCi0gIHsiY3IwIiwgMzJ9LCAgeyJjcjEiLCAzM30sICB7ImNyMiIsIDM0fSwgIHsiY3IzIiwgMzV9LAotICB7ImNyNCIsIDM2fSwgIHsiY3I1IiwgMzd9LCAgeyJjcjYiLCAzOH0sICB7ImNyNyIsIDM5fSwKLSAgeyJjcjgiLCA0MH0sICB7ImNyOSIsIDQxfSwgIHsiY3IxMCIsIDQyfSwgeyJjcjExIiwgNDN9LAotICB7ImNyMTIiLCA0NH0sIHsiY3IxMyIsIDQ1fSwgeyJjcjE0IiwgNDZ9LCB7ImNyMTUiLCA0N30sCi0gIHtOVUxMLCAwfQotfTsKLQotI2RlZmluZSBCQURfQVJHUyAJXygiQmFkIGFyZ3VtZW50cyB0byBpbnN0cnVjdGlvbiIpCi0jZGVmaW5lIEJBRF9QQyAJCV8oInIxNSBub3QgYWxsb3dlZCBoZXJlIikKLSNkZWZpbmUgQkFEX0ZMQUdTIAlfKCJJbnN0cnVjdGlvbiBzaG91bGQgbm90IGhhdmUgZmxhZ3MiKQotI2RlZmluZSBCQURfQ09ORCAJXygiSW5zdHJ1Y3Rpb24gaXMgbm90IGNvbmRpdGlvbmFsIikKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fb3BzX2hzaCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIGFybV90b3BzX2hzaCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIGFybV9jb25kX2hzaCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIGFybV9zaGlmdF9oc2ggPSBOVUxMOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fcmVnX2hzaCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIGFybV9wc3JfaHNoID0gTlVMTDsKLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gICAqLwotCi1zdGF0aWMgdm9pZCBzX3JlcSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2JzcyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZXZlbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbHRvcmcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FybSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfdGh1bWIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NvZGUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2ZvcmNlX3RodW1iIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc190aHVtYl9mdW5jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc190aHVtYl9zZXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBhcm1fc190ZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgYXJtX3NfZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgdm9pZCBhcm1fc19zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hcm1fZWxmX2NvbnMgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotc3RhdGljIGludCBteV9nZXRfZXhwcmVzc2lvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqLCBjaGFyICoqKSk7Ci0KLUNPTlNUIHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgInJlcSIsICAgICAgICAgc19yZXEsICAgICAgICAgMCB9LAkvKiBOZXZlciBjYWxsZWQgYmVjYXN1ZSAnLnJlcScgZG9lcyBub3Qgc3RhcnQgbGluZSAqLwotICB7ICJic3MiLCAgICAgICAgIHNfYnNzLCAgICAgICAgIDAgfSwKLSAgeyAiYWxpZ24iLCAgICAgICBzX2FsaWduLCAgICAgICAwIH0sCi0gIHsgImFybSIsICAgICAgICAgc19hcm0sICAgICAgICAgMCB9LAotICB7ICJ0aHVtYiIsICAgICAgIHNfdGh1bWIsICAgICAgIDAgfSwKLSAgeyAiY29kZSIsICAgICAgICBzX2NvZGUsICAgICAgICAwIH0sCi0gIHsgImZvcmNlX3RodW1iIiwgc19mb3JjZV90aHVtYiwgMCB9LAotICB7ICJ0aHVtYl9mdW5jIiwgIHNfdGh1bWJfZnVuYywgIDAgfSwKLSAgeyAidGh1bWJfc2V0IiwgICBzX3RodW1iX3NldCwgICAwIH0sCi0gIHsgImV2ZW4iLCAgICAgICAgc19ldmVuLCAgICAgICAgMCB9LAotICB7ICJsdG9yZyIsICAgICAgIHNfbHRvcmcsICAgICAgIDAgfSwKLSAgeyAicG9vbCIsICAgICAgICBzX2x0b3JnLCAgICAgICAwIH0sCi0gIC8qIEFsbG93IGZvciB0aGUgZWZmZWN0IG9mIHNlY3Rpb24gY2hhbmdlcy4gICovCi0gIHsgInRleHQiLCAgICAgICAgYXJtX3NfdGV4dCwgICAgMCB9LAotICB7ICJkYXRhIiwgICAgICAgIGFybV9zX2RhdGEsICAgIDAgfSwKLSNpZmRlZiBPQkpfRUxGICAKLSAgeyAic2VjdGlvbiIsICAgICBhcm1fc19zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3Rpb24ucyIsICAgYXJtX3Nfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0IiwgICAgICAgIGFybV9zX3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdC5zIiwgICAgICBhcm1fc19zZWN0aW9uLCAwIH0sCi0gIHsgIndvcmQiLCAgICAgICAgc19hcm1fZWxmX2NvbnMsIDQgfSwKLSAgeyAibG9uZyIsICAgICAgICBzX2FybV9lbGZfY29ucywgNCB9LAotI2Vsc2UKLSAgeyAid29yZCIsICAgICAgICBjb25zLCA0fSwKLSNlbmRpZgotICB7ICJleHRlbmQiLCAgICAgIGZsb2F0X2NvbnMsICd4JyB9LAotICB7ICJsZG91YmxlIiwgICAgIGZsb2F0X2NvbnMsICd4JyB9LAotICB7ICJwYWNrZWQiLCAgICAgIGZsb2F0X2NvbnMsICdwJyB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotLyogU3R1ZmYgbmVlZGVkIHRvIHJlc29sdmUgdGhlIGxhYmVsIGFtYmlndWl0eQotICAgQXM6Ci0gICAgIC4uLgotICAgICBsYWJlbDogICA8aW5zbj4KLSAgIG1heSBkaWZmZXIgZnJvbToKLSAgICAgLi4uCi0gICAgIGxhYmVsOgotICAgICAgICAgICAgICA8aW5zbj4KLSovCi0KLXN5bWJvbFMgKiAgbGFzdF9sYWJlbF9zZWVuOwotc3RhdGljIGludCBsYWJlbF9pc190aHVtYl9mdW5jdGlvbl9uYW1lID0gZmFsc2U7Ci0KLS8qIExpdGVyYWwgc3R1ZmYgKi8KLQotI2RlZmluZSBNQVhfTElURVJBTF9QT09MX1NJWkUgMTAyNAotCi10eXBlZGVmIHN0cnVjdCBsaXRlcmFsUwotewotICBzdHJ1Y3QgZXhwcmVzc2lvblMgIGV4cDsKLSAgc3RydWN0IGFybV9pdCAqICAgICBpbnN0OwotfSBsaXRlcmFsVDsKLQotbGl0ZXJhbFQgIGxpdGVyYWxzW01BWF9MSVRFUkFMX1BPT0xfU0laRV07Ci1pbnQgICAgICAgbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UgPSAwOyAvKiBOZXh0IGZyZWUgZW50cnkgaW4gdGhlIHBvb2wgKi8KLWludCAgICAgICBsaXRfcG9vbF9udW0gPSAxOyAvKiBOZXh0IGxpdGVyYWwgcG9vbCBudW1iZXIgKi8KLXN5bWJvbFMgKiBjdXJyZW50X3Bvb2xQID0gTlVMTDsKLQotc3RhdGljIGludAotYWRkX3RvX2xpdF9wb29sICgpCi17Ci0gIGludCBsaXRfY291bnQgPSAwOwotCi0gIGlmIChjdXJyZW50X3Bvb2xQID09IE5VTEwpCi0gICAgY3VycmVudF9wb29sUCA9IHN5bWJvbF9jcmVhdGUgKEZBS0VfTEFCRUxfTkFNRSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkJICAgKHZhbHVlVCkgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICAvKiBDaGVjayBpZiB0aGlzIGxpdGVyYWwgdmFsdWUgaXMgYWxyZWFkeSBpbiB0aGUgcG9vbDogKi8KLSAgd2hpbGUgKGxpdF9jb3VudCA8IG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlKQotICAgIHsKLSAgICAgIGlmIChsaXRlcmFsc1tsaXRfY291bnRdLmV4cC5YX29wID09IGluc3QucmVsb2MuZXhwLlhfb3AKLSAgICAgICAgICAmJiBpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQKLSAgICAgICAgICAmJiBsaXRlcmFsc1tsaXRfY291bnRdLmV4cC5YX2FkZF9udW1iZXIgPT0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyCi0gICAgICAgICAgJiYgbGl0ZXJhbHNbbGl0X2NvdW50XS5leHAuWF91bnNpZ25lZCA9PSBpbnN0LnJlbG9jLmV4cC5YX3Vuc2lnbmVkKQotICAgICAgICBicmVhazsKLSAgICAgIGxpdF9jb3VudCsrOwotICAgIH0KLQotICBpZiAobGl0X2NvdW50ID09IG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlKSAvKiBuZXcgZW50cnkgKi8KLSAgICB7Ci0gICAgICBpZiAobmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UgPiBNQVhfTElURVJBTF9QT09MX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnN0LmVycm9yID0gXygiTGl0ZXJhbCBQb29sIE92ZXJmbG93Iik7Ci0gICAgICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgICAgIH0KLQotICAgICAgbGl0ZXJhbHNbbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2VdLmV4cCA9IGluc3QucmVsb2MuZXhwOwotICAgICAgbGl0X2NvdW50ID0gbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UrKzsKLSAgICB9Ci0KLSAgaW5zdC5yZWxvYy5leHAuWF9vcCA9IE9fc3ltYm9sOwotICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgPSAobGl0X2NvdW50KSAqIDQgLSA4OwotICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9zeW1ib2wgPSBjdXJyZW50X3Bvb2xQOwotCi0gIHJldHVybiBTVUNDRVNTOwotfQotIAotLyogQ2FuJ3QgdXNlIHN5bWJvbF9uZXcgaGVyZSwgc28gaGF2ZSB0byBjcmVhdGUgYSBzeW1ib2wgYW5kIHRoZW4gYXQKLSAgIGEgbGF0ZXIgZGF0ZSBhc3NpZ24gaXQgYSB2YWx1ZS4gVGhhdHMgd2hhdCB0aGVzZSBmdW5jdGlvbnMgZG8uICAqLwotc3RhdGljIHZvaWQKLXN5bWJvbF9sb2NhdGUgKHN5bWJvbFAsIG5hbWUsIHNlZ21lbnQsIHZhbHUsIGZyYWcpCi0gICAgIHN5bWJvbFMgKiAgICBzeW1ib2xQOyAKLSAgICAgQ09OU1QgY2hhciAqIG5hbWU7CQkvKiBJdCBpcyBjb3BpZWQsIHRoZSBjYWxsZXIgY2FuIG1vZGlmeSAqLwotICAgICBzZWdUICAgICAgICAgc2VnbWVudDsJLyogU2VnbWVudCBpZGVudGlmaWVyIChTRUdfPHNvbWV0aGluZz4pICovCi0gICAgIHZhbHVlVCAgICAgICB2YWx1OwkJLyogU3ltYm9sIHZhbHVlICovCi0gICAgIGZyYWdTICogICAgICBmcmFnOwkJLyogQXNzb2NpYXRlZCBmcmFnbWVudCAqLwotewotICB1bnNpZ25lZCBpbnQgbmFtZV9sZW5ndGg7Ci0gIGNoYXIgKiBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lOwotCi0gIG5hbWVfbGVuZ3RoID0gc3RybGVuIChuYW1lKSArIDE7ICAgICAgLyogKzEgZm9yIFwwICovCi0gIG9ic3RhY2tfZ3JvdyAoJm5vdGVzLCBuYW1lLCBuYW1lX2xlbmd0aCk7Ci0gIHByZXNlcnZlZF9jb3B5X29mX25hbWUgPSBvYnN0YWNrX2ZpbmlzaCAoJm5vdGVzKTsKLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIGlmIChwcmVzZXJ2ZWRfY29weV9vZl9uYW1lWzBdID09ICdfJykKLSAgICBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lKys7Ci0jZW5kaWYKLQotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lID0KLSAgICB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHByZXNlcnZlZF9jb3B5X29mX25hbWUpOwotI2VuZGlmCi0KLSAgU19TRVRfTkFNRSAoc3ltYm9sUCwgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSk7Ci0KLSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgc2VnbWVudCk7Ci0gIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCB2YWx1KTsKLSAgc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMoc3ltYm9sUCk7Ci0KLSAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnKTsKLQotICAvKiBMaW5rIHRvIGVuZCBvZiBzeW1ib2wgY2hhaW4uICAqLwotICB7Ci0gICAgZXh0ZXJuIGludCBzeW1ib2xfdGFibGVfZnJvemVuOwotICAgIGlmIChzeW1ib2xfdGFibGVfZnJvemVuKQotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICBzeW1ib2xfYXBwZW5kIChzeW1ib2xQLCBzeW1ib2xfbGFzdFAsICYgc3ltYm9sX3Jvb3RQLCAmIHN5bWJvbF9sYXN0UCk7Ci0KLSAgb2JqX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCk7Ci0KLSNpZmRlZiB0Y19zeW1ib2xfbmV3X2hvb2sKLSAgdGNfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKTsKLSNlbmRpZgotIAotI2lmZGVmIERFQlVHX1NZTVMKLSAgdmVyaWZ5X3N5bWJvbF9jaGFpbiAoc3ltYm9sX3Jvb3RQLCBzeW1ib2xfbGFzdFApOwotI2VuZGlmIC8qIERFQlVHX1NZTVMgKi8KLX0KLQotLyogQ2hlY2sgdGhhdCBhbiBpbW1lZGlhdGUgaXMgdmFsaWQsIGFuZCBpZiBzbywgY29udmVydCBpdCB0byB0aGUgcmlnaHQgZm9ybWF0LiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotdmFsaWRhdGVfaW1tZWRpYXRlICh2YWwpCi0gICAgIHVuc2lnbmVkIGludCB2YWw7Ci17Ci0gIHVuc2lnbmVkIGludCBhOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgCi0jZGVmaW5lIHJvdGF0ZV9sZWZ0KHYsIG4pICh2IDw8IG4gfCB2ID4+ICgzMiAtIG4pKQotICAKLSAgZm9yIChpID0gMDsgaSA8IDMyOyBpICs9IDIpCi0gICAgaWYgKChhID0gcm90YXRlX2xlZnQgKHZhbCwgaSkpIDw9IDB4ZmYpCi0gICAgICByZXR1cm4gYSB8IChpIDw8IDcpOyAvKiAxMi1iaXQgcGFjazogW3NoaWZ0LWNudCxjb25zdF0gKi8KLSAgCi0gIHJldHVybiBGQUlMOwotfQotCi0vKiBDaGVjayB0byBzZWUgaWYgYW4gaW1tZWRpYXRlIGNhbiBiZSBjb21wdXRlZCBhcyB0d28gc2VwZXJhdGUgaW1tZWRpYXRlCi0gICB2YWx1ZXMsIGFkZGVkIHRvZ2V0aGVyLiAgV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhpcyB2YWx1ZSBjYW5ub3QgYmUKLSAgIGNvbXB1dGVkIGJ5IGp1c3Qgb25lIEFSTSBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXZhbGlkYXRlX2ltbWVkaWF0ZV90d29wYXJ0ICh2YWwsIGhpZ2hwYXJ0KQotICAgICB1bnNpZ25lZCBpbnQgdmFsOwotICAgICB1bnNpZ25lZCBpbnQgKiBoaWdocGFydDsKLXsKLSAgdW5zaWduZWQgaW50IGE7Ci0gIHVuc2lnbmVkIGludCBpOwotICAKLSAgZm9yIChpID0gMDsgaSA8IDMyOyBpICs9IDIpCi0gICAgaWYgKCgoYSA9IHJvdGF0ZV9sZWZ0ICh2YWwsIGkpKSAmIDB4ZmYpICE9IDApCi0gICAgICB7Ci0JaWYgKGEgJiAweGZmMDApCi0JICB7Ci0JICAgIGlmIChhICYgfiAweGZmZmYpCi0JICAgICAgY29udGludWU7Ci0JICAgICogaGlnaHBhcnQgPSAoYSAgPj4gOCkgfCAoKGkgKyAyNCkgPDwgNyk7Ci0JICB9Ci0JZWxzZSBpZiAoYSAmIDB4ZmYwMDAwKQotCSAgewotCSAgICBpZiAoYSAmIDB4ZmYwMDAwMDApCi0JICAgICAgY29udGludWU7Ci0KLQkgICAgKiBoaWdocGFydCA9IChhID4+IDE2KSB8ICgoaSArIDE2KSA8PCA3KTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGFzc2VydCAoYSAmIDB4ZmYwMDAwMDApOwotCi0JICAgICogaGlnaHBhcnQgPSAoYSA+PiAyNCkgfCAoKGkgKyA4KSA8PCA3KTsKLQkgIH0KLQotCXJldHVybiAoYSAmIDB4ZmYpIHwgKGkgPDwgNyk7Ci0gICAgICB9Ci0gIAotICByZXR1cm4gRkFJTDsKLX0KLQotc3RhdGljIGludAotdmFsaWRhdGVfb2Zmc2V0X2ltbSAodmFsLCBod3NlKQotICAgICB1bnNpZ25lZCBpbnQgdmFsOwotICAgICBpbnQgaHdzZTsKLXsKLSAgaWYgKChod3NlICYmIHZhbCA+IDI1NSkgfHwgdmFsID4gNDA5NSkKLSAgICAgcmV0dXJuIEZBSUw7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLSAgICAKLXN0YXRpYyB2b2lkCi1zX3JlcSAoYSkKLSAgICAgaW50IGE7Ci17Ci0gIGFzX2JhZCAoXygiSW52YWxpZCBzeW50YXggZm9yIC5yZXEgZGlyZWN0aXZlLiIpKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfYnNzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIFdlIGRvbid0IHN1cHBvcnQgcHV0dGluZyBmcmFncyBpbiB0aGUgQlNTIHNlZ21lbnQsIHdlIGZha2UgaXQgYnkKLSAgICAgbWFya2luZyBpbl9ic3MsIHRoZW4gbG9va2luZyBhdCBzX3NraXAgZm9yIGNsdWVzPy4uICovCi0gIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZXZlbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoIW5lZWRfcGFzc18yKQkJLyogTmV2ZXIgbWFrZSBmcmFnIGlmIGV4cGVjdCBleHRyYSBwYXNzLiAqLwotICAgIGZyYWdfYWxpZ24gKDEsIDAsIDApOwotICAKLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19sdG9yZyAoaWdub3JlZCkKLSAgICAgaW50IGlnbm9yZWQ7Ci17Ci0gIGludCBsaXRfY291bnQgPSAwOwotICBjaGFyIHN5bV9uYW1lWzIwXTsKLQotICBpZiAoY3VycmVudF9wb29sUCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBBbGlnbiBwb29sIGFzIHlvdSBoYXZlIHdvcmQgYWNjZXNzZXMgKi8KLSAgLyogT25seSBtYWtlIGEgZnJhZyBpZiB3ZSBoYXZlIHRvIC4uLiAqLwotICBpZiAoIW5lZWRfcGFzc18yKQotICAgIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDIpOwotCi0gIHNwcmludGYgKHN5bV9uYW1lLCAiJCRsaXRfXDAwMiV4IiwgbGl0X3Bvb2xfbnVtKyspOwotCi0gIHN5bWJvbF9sb2NhdGUgKGN1cnJlbnRfcG9vbFAsIHN5bV9uYW1lLCBub3dfc2VnLAotCQkgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLCBmcmFnX25vdyk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKGN1cnJlbnRfcG9vbFApOwotCi0gIEFSTV9TRVRfVEhVTUIgKGN1cnJlbnRfcG9vbFAsIHRodW1iX21vZGUpOwotICAKLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotICBBUk1fU0VUX0lOVEVSV09SSyAoY3VycmVudF9wb29sUCwgc3VwcG9ydF9pbnRlcndvcmspOwotI2VuZGlmCi0gIAotICB3aGlsZSAobGl0X2NvdW50IDwgbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UpCi0gICAgLyogRmlyc3Qgb3V0cHV0IHRoZSBleHByZXNzaW9uIGluIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgcG9vbCAqLwotICAgIGVtaXRfZXhwciAoJihsaXRlcmFsc1tsaXRfY291bnQrK10uZXhwKSwgNCk7IC8qIC53b3JkICovCi0KLSAgbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UgPSAwOwotICBjdXJyZW50X3Bvb2xQID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxpZ24gKHVudXNlZCkJLyogU2FtZSBhcyBzX2FsaWduX3B0d28gYnV0IGFsaWduIDAgPT4gYWxpZ24gMiAqLwotICAgICBpbnQgdW51c2VkOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLSAgcmVnaXN0ZXIgbG9uZyB0ZW1wX2ZpbGw7Ci0gIGxvbmcgbWF4X2FsaWdubWVudCA9IDE1OwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKHRlbXAgPiBtYXhfYWxpZ25tZW50KQotICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQuIGFzc3VtZWQuIiksIHRlbXAgPSBtYXhfYWxpZ25tZW50KTsKLSAgZWxzZSBpZiAodGVtcCA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgbmVnYXRpdmUuIDAgYXNzdW1lZC4iKSk7Ci0gICAgICB0ZW1wID0gMDsKLSAgICB9Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgdGVtcF9maWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgdGVtcF9maWxsID0gMDsKLQotICBpZiAoIXRlbXApCi0gICAgdGVtcCA9IDI7Ci0KLSAgLyogT25seSBtYWtlIGEgZnJhZyBpZiB3ZSBIQVZFIHRvLiAuIC4gKi8KLSAgaWYgKHRlbXAgJiYgIW5lZWRfcGFzc18yKQotICAgIGZyYWdfYWxpZ24gKHRlbXAsIChpbnQpIHRlbXBfZmlsbCwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgdGVtcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2ZvcmNlX3RodW1iIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIElmIHdlIGFyZSBub3QgYWxyZWFkeSBpbiB0aHVtYiBtb2RlIGdvIGludG8gaXQsIEVWRU4gaWYKLSAgICAgdGhlIHRhcmdldCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCB0aHVtYiBpbnN0cnVjdGlvbnMuCi0gICAgIFRoaXMgaXMgdXNlZCBieSBnY2MvY29uZmlnL2FybS9saWIxZnVuY3MuYXNtIGZvciBleGFtcGxlCi0gICAgIHRvIGNvbXBpbGUgaW50ZXJ3b3JraW5nIHN1cHBvcnQgZnVuY3Rpb25zIGV2ZW4gaWYgdGhlCi0gICAgIHRhcmdldCBwcm9jZXNzb3Igc2hvdWxkIG5vdCBzdXBwb3J0IGludGVyd29ya2luZy4gICovCi0gICAgIAotICBpZiAoISB0aHVtYl9tb2RlKQotICAgIHsKLSAgICAgIHRodW1iX21vZGUgPSAyOwotICAgICAgCi0gICAgICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKLSAgICB9Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc190aHVtYl9mdW5jIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIFRoZSBmb2xsb3dpbmcgbGFiZWwgaXMgdGhlIG5hbWUvYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgYSBUaHVtYiBmdW5jdGlvbi4KLSAgICAgV2UgbmVlZCB0byBrbm93IHRoaXMgZm9yIHRoZSBpbnRlcndvcmtpbmcgc3VwcG9ydC4gICovCi0KLSAgbGFiZWxfaXNfdGh1bWJfZnVuY3Rpb25fbmFtZSA9IHRydWU7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQZXJmb3JtIGEgLnNldCBkaXJlY3RpdmUsIGJ1dCBhbHNvIG1hcmsgdGhlIGFsaWFzIGFzCi0gICBiZWluZyBhIHRodW1iIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfdGh1bWJfc2V0IChlcXVpdikKLSAgICAgaW50IGVxdWl2OwotewotICAvKiBYWFggdGhlIGZvbGxvd2luZyBpcyBhIGR1cGxpY2F0ZSBvZiB0aGUgY29kZSBmb3Igc19zZXQoKSBpbiByZWFkLmMKLSAgICAgV2UgY2Fubm90IGp1c3QgY2FsbCB0aGF0IGNvZGUgYXMgd2UgbmVlZCB0byBnZXQgYXQgdGhlIHN5bWJvbCB0aGF0Ci0gICAgIGlzIGNyZWF0ZWQuICAqLwotICByZWdpc3RlciBjaGFyICogICAgbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciAgICAgIGRlbGltOwotICByZWdpc3RlciBjaGFyICogICAgZW5kX25hbWU7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKiBzeW1ib2xQOwotCi0gIC8qCi0gICAqIEVzcGVjaWFsIGFwb2xvZ2llcyBmb3IgdGhlIHJhbmRvbSBsb2dpYzoKLSAgICogdGhpcyBqdXN0IGdyZXcsIGFuZCBjb3VsZCBiZSBwYXJzZWQgbXVjaCBtb3JlIHNpbXBseSEKLSAgICogRGVhbiBpbiBoYXN0ZS4KLSAgICovCi0gIG5hbWUgICAgICA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZGVsaW0gICAgID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGVuZF9uYW1lICA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmVuZF9uYW1lID0gZGVsaW07Ci0gIAotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgICplbmRfbmFtZSA9IDA7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIiksIG5hbWUpOwotICAgICAgKmVuZF9uYW1lID0gZGVsaW07Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgKmVuZF9uYW1lID0gMDsKLQotICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIFhYWCAtIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdG8gLnRodW1iX3NldCAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoKHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSkpID09IE5VTEwKLSAgICAgICYmIChzeW1ib2xQID0gbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkpID09IE5VTEwpCi0gICAgewotI2lmbmRlZiBOT19MSVNUSU5HCi0gICAgICAvKiBXaGVuIGRvaW5nIHN5bWJvbCBsaXN0aW5ncywgcGxheSBnYW1lcyB3aXRoIGR1bW15IGZyYWdtZW50cyBsaXZpbmcKLQkgb3V0c2lkZSB0aGUgbm9ybWFsIGZyYWdtZW50IGNoYWluIHRvIHJlY29yZCB0aGUgZmlsZSBhbmQgbGluZSBpbmZvCi0gICAgICAgICBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX1NZTUJPTFMpCi0JewotCSAgZXh0ZXJuIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICogbGlzdGluZ190YWlsOwotCSAgZnJhZ1MgKiBkdW1teV9mcmFnID0gKGZyYWdTICopIHhtYWxsb2MgKHNpemVvZihmcmFnUykpOwotCSAgbWVtc2V0IChkdW1teV9mcmFnLCAwLCBzaXplb2YoZnJhZ1MpKTsKLQkgIGR1bW15X2ZyYWctPmZyX3R5cGUgPSByc19maWxsOwotCSAgZHVtbXlfZnJhZy0+bGluZSA9IGxpc3RpbmdfdGFpbDsKLQkgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwgZHVtbXlfZnJhZyk7Ci0JICBkdW1teV9mcmFnLT5mcl9zeW1ib2wgPSBzeW1ib2xQOwotCX0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JCQkgICAgCi0jaWZkZWYgT0JKX0NPRkYKLSAgICAgIC8qICJzZXQiIHN5bWJvbHMgYXJlIGxvY2FsIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiAqLwotICAgICAgU0ZfU0VUX0xPQ0FMIChzeW1ib2xQKTsKLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotICAgIH0JCQkJLyogbWFrZSBhIG5ldyBzeW1ib2wgKi8KLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKLQotICAqIGVuZF9uYW1lID0gZGVsaW07Ci0KLSAgaWYgKGVxdWl2Ci0gICAgICAmJiBTX0lTX0RFRklORUQgKHN5bWJvbFApCi0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSAhPSByZWdfc2VjdGlvbikKLSAgICBhc19iYWQgKF8oInN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0KLSAgcHNldWRvX3NldCAoc3ltYm9sUCk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIC8qIFhYWCBOb3cgd2UgY29tZSB0byB0aGUgVGh1bWIgc3BlY2lmaWMgYml0IG9mIGNvZGUuICAqLwotICAKLSAgVEhVTUJfU0VUX0ZVTkMgKHN5bWJvbFAsIDEpOwotICBBUk1fU0VUX1RIVU1CIChzeW1ib2xQLCAxKTsKLSNpZiBkZWZpbmVkIE9CSl9FTEYgfHwgZGVmaW5lZCBPQkpfQ09GRgotICBBUk1fU0VUX0lOVEVSV09SSyAoc3ltYm9sUCwgc3VwcG9ydF9pbnRlcndvcmspOwotI2VuZGlmCi19Ci0KLS8qIElmIHdlIGNoYW5nZSBzZWN0aW9uIHdlIG11c3QgZHVtcCB0aGUgbGl0ZXJhbCBwb29sIGZpcnN0LiAgKi8KLXN0YXRpYyB2b2lkCi1hcm1fc190ZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChub3dfc2VnICE9IHRleHRfc2VjdGlvbikKLSAgICBzX2x0b3JnICgwKTsKLSAgCi0gIHNfdGV4dCAoaWdub3JlKTsKLX0KLQotc3RhdGljIHZvaWQKLWFybV9zX2RhdGEgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIGlmIChub3dfc2VnICE9IHRleHRfc2VjdGlvbikKLQlzX2x0b3JnICgwKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uKQotICAgIHNfbHRvcmcgKDApOwotICAKLSAgc19kYXRhIChpZ25vcmUpOwotfQotCi0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHZvaWQKLWFybV9zX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc19sdG9yZyAoMCk7Ci0KLSAgb2JqX2VsZl9zZWN0aW9uIChpZ25vcmUpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1vcGNvZGVfc2VsZWN0ICh3aWR0aCkKLSAgICAgaW50IHdpZHRoOwotewotICBzd2l0Y2ggKHdpZHRoKQotICAgIHsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKCEgdGh1bWJfbW9kZSkKLQl7Ci0JICBpZiAoISAoY3B1X3ZhcmlhbnQgJiBBUk1fVEhVTUIpKQotCSAgICBhc19iYWQgKF8oInNlbGVjdGVkIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IFRIVU1CIG9wY29kZXMiKSk7Ci0JICB0aHVtYl9tb2RlID0gMTsKLSAgICAgICAgICAvKiBObyBuZWVkIHRvIGZvcmNlIHRoZSBhbGlnbm1lbnQsIHNpbmNlIHdlIHdpbGwgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgY29taW5nIGZyb20gQVJNIG1vZGUsIHdoaWNoIGlzIHdvcmQtYWxpZ25lZC4gKi8KLSAgICAgICAgICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAodGh1bWJfbW9kZSkKLQl7Ci0gICAgICAgICAgaWYgKChjcHVfdmFyaWFudCAmIEFSTV9BTlkpID09IEFSTV9USFVNQikKLQkgICAgYXNfYmFkIChfKCJzZWxlY3RlZCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBBUk0gb3Bjb2RlcyIpKTsKLQkgIHRodW1iX21vZGUgPSAwOwotICAgICAgICAgIGlmICghbmVlZF9wYXNzXzIpCi0gICAgICAgICAgICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLSAgICAgICAgICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgaW5zdHJ1Y3Rpb24gc2l6ZSBzZWxlY3RlZCAoJWQpIiksIHdpZHRoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FybSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBvcGNvZGVfc2VsZWN0ICgzMik7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX3RodW1iIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIG9wY29kZV9zZWxlY3QgKDE2KTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfY29kZSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN3aXRjaCAodGVtcCkKLSAgICB7Ci0gICAgY2FzZSAxNjoKLSAgICBjYXNlIDMyOgotICAgICAgb3Bjb2RlX3NlbGVjdCAodGVtcCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgb3BlcmFuZCB0byAuY29kZSBkaXJlY3RpdmUgKCVkKSAoZXhwZWN0aW5nIDE2IG9yIDMyKSIpLCB0ZW1wKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbmRfb2ZfbGluZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKCogc3RyICE9ICdcMCcpCi0gICAgaW5zdC5lcnJvciA9IF8oIkdhcmJhZ2UgZm9sbG93aW5nIGluc3RydWN0aW9uIik7Ci19Ci0KLXN0YXRpYyBpbnQKLXNraXBfcGFzdF9jb21tYSAoc3RyKQotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgY2hhciAqcCA9ICpzdHIsIGM7Ci0gIGludCBjb21tYSA9IDA7Ci0gICAgCi0gIHdoaWxlICgoYyA9ICpwKSA9PSAnICcgfHwgYyA9PSAnLCcpCi0gICAgewotICAgICAgcCsrOwotICAgICAgaWYgKGMgPT0gJywnICYmIGNvbW1hKyspCi0JcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGlmIChjID09ICdcMCcpCi0gICAgcmV0dXJuIEZBSUw7Ci0KLSAgKnN0ciA9IHA7Ci0gIHJldHVybiBjb21tYSA/IFNVQ0NFU1MgOiBGQUlMOwotfQotCi0vKiBBIHN0YW5kYXJkIHJlZ2lzdGVyIG11c3QgYmUgZ2l2ZW4gYXQgdGhpcyBwb2ludC4KLSAgIFNoaWZ0IGlzIHRoZSBwbGFjZSB0byBwdXQgaXQgaW4gaW5zdC5pbnN0cnVjdGlvbi4KLSAgIFJlc3RvcmVzIGlucHV0IHN0YXJ0IHBvaW50IG9uIGVyci4KLSAgIFJldHVybnMgdGhlIHJlZyMsIG9yIEZBSUwuICovCi0KLXN0YXRpYyBpbnQKLXJlZ19yZXF1aXJlZF9oZXJlIChzdHIsIHNoaWZ0KQotICAgICBjaGFyICoqIHN0cjsKLSAgICAgaW50ICAgICBzaGlmdDsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMTI4XTsgLyogWFhYICovCi0gIGludCAgICByZWc7Ci0gIGNoYXIgKiBzdGFydCA9ICpzdHI7Ci0KLSAgaWYgKChyZWcgPSBhcm1fcmVnX3BhcnNlIChzdHIpKSAhPSBGQUlMICYmIGludF9yZWdpc3RlciAocmVnKSkKLSAgICB7Ci0gICAgICBpZiAoc2hpZnQgPj0gMCkKLQlpbnN0Lmluc3RydWN0aW9uIHw9IHJlZyA8PCBzaGlmdDsKLSAgICAgIHJldHVybiByZWc7Ci0gICAgfQotCi0gIC8qIFJlc3RvcmUgdGhlIHN0YXJ0IHBvaW50LCB3ZSBtYXkgaGF2ZSBnb3QgYSByZWcgb2YgdGhlIHdyb25nIGNsYXNzLiAgKi8KLSAgKnN0ciA9IHN0YXJ0OwotICAKLSAgLyogSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQotICAgICB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuLiAgKi8KLSAgc3ByaW50ZiAoYnVmZiwgXygiUmVnaXN0ZXIgZXhwZWN0ZWQsIG5vdCAnJS4xMDBzJyIpLCBzdGFydCk7Ci0gIGluc3QuZXJyb3IgPSBidWZmOwotCi0gIHJldHVybiBGQUlMOwotfQotCi1zdGF0aWMgaW50Ci1wc3JfcmVxdWlyZWRfaGVyZSAoc3RyLCBjcHNyLCBzcHNyKQotICAgICBjaGFyICoqIHN0cjsKLSAgICAgaW50ICAgICBjcHNyOwotICAgICBpbnQgICAgIHNwc3I7Ci17Ci0gIGludCAgICBwc3I7Ci0gIGNoYXIgKiBzdGFydCA9ICpzdHI7Ci0gIHBzciA9IGFybV9wc3JfcGFyc2UgKHN0cik7Ci0gIAotICBpZiAgKHBzciA9PSBjcHNyIHx8IHBzciA9PSBzcHNyKQotICAgIHsKLSAgICAgIGlmIChwc3IgPT0gc3BzcikKLQlpbnN0Lmluc3RydWN0aW9uIHw9IDEgPDwgMjI7Ci0gICAgICAKLSAgICAgIHJldHVybiBTVUNDRVNTOwotICAgIH0KLQotICAvKiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0gICAgIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4uICAqLwotICBpbnN0LmVycm9yID0gXygiPHBzcihmKT4gZXhwZWN0ZWQiKTsKLQotICAvKiBSZXN0b3JlIHRoZSBzdGFydCBwb2ludC4gICovCi0gICpzdHIgPSBzdGFydDsKLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvX3Byb2NfbnVtYmVyIChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBpbnQgcHJvY2Vzc29yLCBwY2hhcjsKLQotICBza2lwX3doaXRlc3BhY2UgKCogc3RyKTsKLQotICAvKiBUaGUgZGF0YSBzaGVldCBzZWVtcyB0byBpbXBseSB0aGF0IGp1c3QgYSBudW1iZXIgb24gaXRzIG93biBpcyB2YWxpZAotICAgICBoZXJlLCBidXQgdGhlIFJJU0MgaVggYXNzZW1ibGVyIHNlZW1zIHRvIGFjY2VwdCBhIHByZWZpeCAncCcuICBXZSB3aWxsCi0gICAgIGFjY2VwdCBlaXRoZXIuICAqLwotICBpZiAoKipzdHIgPT0gJ3AnIHx8ICoqc3RyID09ICdQJykKLSAgICAoKnN0cikrKzsKLQotICBwY2hhciA9ICooKnN0cikrKzsKLSAgaWYgKHBjaGFyID49ICcwJyAmJiBwY2hhciA8PSAnOScpCi0gICAgewotICAgICAgcHJvY2Vzc29yID0gcGNoYXIgLSAnMCc7Ci0gICAgICBpZiAoKipzdHIgPj0gJzAnICYmICoqc3RyIDw9ICc5JykKLQl7Ci0JICBwcm9jZXNzb3IgPSBwcm9jZXNzb3IgKiAxMCArICooKnN0cikrKyAtICcwJzsKLQkgIGlmIChwcm9jZXNzb3IgPiAxNSkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJJbGxlZ2FsIGNvLXByb2Nlc3NvciBudW1iZXIiKTsKLQkgICAgICByZXR1cm4gRkFJTDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiQmFkIG9yIG1pc3NpbmcgY28tcHJvY2Vzc29yIG51bWJlciIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gcHJvY2Vzc29yIDw8IDg7Ci0gIHJldHVybiBTVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1jcF9vcGNfZXhwciAoc3RyLCB3aGVyZSwgbGVuZ3RoKQotICAgICBjaGFyICoqIHN0cjsKLSAgICAgaW50IHdoZXJlOwotICAgICBpbnQgbGVuZ3RoOwotewotICBleHByZXNzaW9uUyBleHByOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoKiBzdHIpOwotCi0gIG1lbXNldCAoJmV4cHIsICdcMCcsIHNpemVvZiAoZXhwcikpOwotCi0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmV4cHIsIHN0cikpCi0gICAgcmV0dXJuIEZBSUw7Ci0gIGlmIChleHByLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiYmFkIG9yIG1pc3NpbmcgZXhwcmVzc2lvbiIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGlmICgoZXhwci5YX2FkZF9udW1iZXIgJiAoKDEgPDwgbGVuZ3RoKSAtIDEpKSAhPSBleHByLlhfYWRkX251bWJlcikKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiaW1tZWRpYXRlIGNvLXByb2Nlc3NvciBleHByZXNzaW9uIHRvbyBsYXJnZSIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZXhwci5YX2FkZF9udW1iZXIgPDwgd2hlcmU7Ci0gIHJldHVybiBTVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1jcF9yZWdfcmVxdWlyZWRfaGVyZSAoc3RyLCB3aGVyZSkKLSAgICAgY2hhciAqKiBzdHI7Ci0gICAgIGludCAgICAgd2hlcmU7Ci17Ci0gIGludCAgICByZWc7Ci0gIGNoYXIgKiBzdGFydCA9ICpzdHI7Ci0KLSAgaWYgKChyZWcgPSBhcm1fcmVnX3BhcnNlIChzdHIpKSAhPSBGQUlMICYmIGNwX3JlZ2lzdGVyIChyZWcpKQotICAgIHsKLSAgICAgIHJlZyAmPSAxNTsKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gcmVnIDw8IHdoZXJlOwotICAgICAgcmV0dXJuIHJlZzsKLSAgICB9Ci0KLSAgLyogSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQotICAgICB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuLiAgKi8KLSAgaW5zdC5lcnJvciA9IF8oIkNvLXByb2Nlc3NvciByZWdpc3RlciBleHBlY3RlZCIpOwotCi0gIC8qIFJlc3RvcmUgdGhlIHN0YXJ0IHBvaW50LiAgKi8KLSAgKnN0ciA9IHN0YXJ0OwotICByZXR1cm4gRkFJTDsKLX0KLQotc3RhdGljIGludAotZnBfcmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgd2hlcmUpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIHdoZXJlOwotewotICBpbnQgcmVnOwotICBjaGFyICogc3RhcnQgPSAqc3RyOwotCi0gIGlmICgocmVnID0gYXJtX3JlZ19wYXJzZSAoc3RyKSkgIT0gRkFJTCAmJiBmcF9yZWdpc3RlciAocmVnKSkKLSAgICB7Ci0gICAgICByZWcgJj0gNzsKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gcmVnIDw8IHdoZXJlOwotICAgICAgcmV0dXJuIHJlZzsKLSAgICB9Ci0KLSAgLyogSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQotICAgICB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuLiAgKi8KLSAgaW5zdC5lcnJvciA9IF8oIkZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGV4cGVjdGVkIik7Ci0KLSAgLyogUmVzdG9yZSB0aGUgc3RhcnQgcG9pbnQuICAqLwotICAqc3RyID0gc3RhcnQ7Ci0gIHJldHVybiBGQUlMOwotfQotCi1zdGF0aWMgaW50Ci1jcF9hZGRyZXNzX29mZnNldCAoc3RyKQotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgaW50IG9mZnNldDsKLQotICBza2lwX3doaXRlc3BhY2UgKCogc3RyKTsKLQotICBpZiAoISBpc19pbW1lZGlhdGVfcHJlZml4ICgqKnN0cikpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgKCpzdHIpKys7Ci0gIAotICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCYgaW5zdC5yZWxvYy5leHAsIHN0cikpCi0gICAgcmV0dXJuIEZBSUw7Ci0gIAotICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIG9mZnNldCA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLSAgICAgIAotICAgICAgaWYgKG9mZnNldCAmIDMpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oImNvLXByb2Nlc3NvciBhZGRyZXNzIG11c3QgYmUgd29yZCBhbGlnbmVkIik7Ci0JICByZXR1cm4gRkFJTDsKLQl9Ci0KLSAgICAgIGlmIChvZmZzZXQgPiAxMDIzIHx8IG9mZnNldCA8IC0xMDIzKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJvZmZzZXQgdG9vIGxhcmdlIik7Ci0JICByZXR1cm4gRkFJTDsKLQl9Ci0KLSAgICAgIGlmIChvZmZzZXQgPj0gMCkKLQlpbnN0Lmluc3RydWN0aW9uIHw9IElOREVYX1VQOwotICAgICAgZWxzZQotCW9mZnNldCA9IC1vZmZzZXQ7Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gb2Zmc2V0ID4+IDI7Ci0gICAgfQotICBlbHNlCi0gICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NOwotCi0gIHJldHVybiBTVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1jcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIGNoYXIgKiBwID0gKiBzdHI7Ci0gIGludCAgICBwcmVfaW5jID0gMDsKLSAgaW50ICAgIHdyaXRlX2JhY2sgPSAwOwotCi0gIGlmICgqcCA9PSAnWycpCi0gICAgewotICAgICAgaW50IHJlZzsKLQotICAgICAgcCsrOwotICAgICAgc2tpcF93aGl0ZXNwYWNlIChwKTsKLQotICAgICAgaWYgKChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJiBwLCAxNikpID09IEZBSUwpCi0JcmV0dXJuIEZBSUw7Ci0KLSAgICAgIHNraXBfd2hpdGVzcGFjZSAocCk7Ci0KLSAgICAgIGlmICgqcCA9PSAnXScpCi0JewotCSAgcCsrOwotCSAgCi0JICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmIHApID09IFNVQ0NFU1MpCi0JICAgIHsKLQkgICAgICAvKiBbUm5dLCAjZXhwciAqLwotCSAgICAgIHdyaXRlX2JhY2sgPSBXUklURV9CQUNLOwotCSAgICAgIAotCSAgICAgIGlmIChyZWcgPT0gUkVHX1BDKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oInBjIG1heSBub3QgYmUgdXNlZCBpbiBwb3N0LWluY3JlbWVudCIpOwotCQkgIHJldHVybiBGQUlMOwotCQl9Ci0KLQkgICAgICBpZiAoY3BfYWRkcmVzc19vZmZzZXQgKCYgcCkgPT0gRkFJTCkKLQkJcmV0dXJuIEZBSUw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcHJlX2luYyA9IFBSRV9JTkRFWCB8IElOREVYX1VQOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiAnWydSbiwgI2V4cHInXSdbIV0gKi8KLQotCSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJiBwKSA9PSBGQUlMKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oInByZS1pbmRleGVkIGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkgICAgICByZXR1cm4gRkFJTDsKLQkgICAgfQotCi0JICBwcmVfaW5jID0gUFJFX0lOREVYOwotCSAgCi0JICBpZiAoY3BfYWRkcmVzc19vZmZzZXQgKCYgcCkgPT0gRkFJTCkKLQkgICAgcmV0dXJuIEZBSUw7Ci0KLQkgIHNraXBfd2hpdGVzcGFjZSAocCk7Ci0KLQkgIGlmICgqcCsrICE9ICddJykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJtaXNzaW5nIF0iKTsKLQkgICAgICByZXR1cm4gRkFJTDsKLQkgICAgfQotCi0JICBza2lwX3doaXRlc3BhY2UgKHApOwotCi0JICBpZiAoKnAgPT0gJyEnKQotCSAgICB7Ci0JICAgICAgaWYgKHJlZyA9PSBSRUdfUEMpCi0JCXsKLQkJICBpbnN0LmVycm9yID0gXygicGMgbWF5IG5vdCBiZSB1c2VkIHdpdGggd3JpdGUtYmFjayIpOwotCQkgIHJldHVybiBGQUlMOwotCQl9Ci0KLQkgICAgICBwKys7Ci0JICAgICAgd3JpdGVfYmFjayA9IFdSSVRFX0JBQ0s7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZwKSkKLQlyZXR1cm4gRkFJTDsKLQotICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NOwotICAgICAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyIC09IDg7ICAvKiBQQyByZWwgYWRqdXN0ICovCi0gICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChSRUdfUEMgPDwgMTYpOwotICAgICAgcHJlX2luYyA9IFBSRV9JTkRFWDsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSB3cml0ZV9iYWNrIHwgcHJlX2luYzsKLSAgKnN0ciA9IHA7Ci0gIHJldHVybiBTVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbm9wIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBEbyBub3RoaW5nIHJlYWxseS4gICovCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7IC8qIFRoaXMgaXMgcG9pbnRsZXNzLiAgKi8KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX21ycyAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBPbmx5IG9uZSBzeW50YXguICAqLwotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IHBzcl9yZXF1aXJlZF9oZXJlICgmIHN0ciwgQ1BTUl9BTEwsIFNQU1JfQUxMKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCI8cHNyPiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi0vKiBUaHJlZSBwb3NzaWJsZSBmb3JtczogIjxwc3I+LCBSbSIsICI8cHNyZj4sIFJtIiwgIjxwc3JmPiwgI2V4cHJlc3Npb24iLiAgKi8KLXN0YXRpYyB2b2lkCi1kb19tc3IgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIGludCByZWc7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChwc3JfcmVxdWlyZWRfaGVyZSAoJnN0ciwgQ1BTUl9BTEwsIFNQU1JfQUxMKSA9PSBTVUNDRVNTKQotICAgIHsKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUFNSX0FMTDsKLQotICAgICAgLyogU3l0YXggc2hvdWxkIGJlICI8cHNyPiwgUm0iICovCi0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0JICB8fCAocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotCXsKLQkgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHBzcl9yZXF1aXJlZF9oZXJlICgmIHN0ciwgQ1BTUl9GTEcsIFNQU1JfRkxHKSA9PSBTVUNDRVNTKQotCWluc3QuaW5zdHJ1Y3Rpb24gfD0gUFNSX0ZMQUdTOwotICAgICAgZWxzZSBpZiAocHNyX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCBDUFNSX0NUTCwgU1BTUl9DVEwpID09IFNVQ0NFU1MpCi0JaW5zdC5pbnN0cnVjdGlvbiB8PSBQU1JfQ09OVFJPTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0JICByZXR1cm47Ci0JfQotICAgICAgCi0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotCXsKLQkgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAKLSAgICAgIC8qIFN5bnRheCBjb3VsZCBiZSAiPHBzcmY+LCBybSIsICI8cHNyZj4sICNleHByZXNzaW9uIiAqLwotICAgICAgCi0gICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmIHN0ciwgMCkpICE9IEZBSUwpCi0JOwotICAgICAgLyogSW1tZWRpYXRlIGV4cHJlc3Npb24uICAqLwotICAgICAgZWxzZSBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKiBzdHIpKQotCXsKLQkgIHN0ciArKzsKLQkgIGluc3QuZXJyb3IgPSBOVUxMOwotCSAgCi0JICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCYgaW5zdC5yZWxvYy5leHAsICYgc3RyKSkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJSZWdpc3RlciBvciBzaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGlmIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9zeW1ib2wpCi0JICAgIHsKLQkgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0lNTUVESUFURTsKLQkgICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIHZhbHVlID0gdmFsaWRhdGVfaW1tZWRpYXRlIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIpOwotCSAgICAgIGlmICh2YWx1ZSA9PSBGQUlMKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgY29uc3RhbnQiKTsKLQkJICByZXR1cm47Ci0JCX0KLQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gdmFsdWU7Ci0JICAgIH0KLQotCSAgZmxhZ3MgfD0gSU5TVF9JTU1FRElBVEU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJFcnJvcjogdW5yZWNvZ25pc2VkIHN5bnRheCBmb3Igc2Vjb25kIGFyZ3VtZW50IHRvIG1zciBpbnN0cnVjdGlvbiIpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaW5zdC5lcnJvciA9IE5VTEw7IAotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi0vKiBMb25nIE11bHRpcGx5IFBhcnNlcgotICAgVU1VTEwgUmRMbywgUmRIaSwgUm0sIFJzCi0gICBTTVVMTCBSZExvLCBSZEhpLCBSbSwgUnMKLSAgIFVNTEFMIFJkTG8sIFJkSGksIFJtLCBScwotICAgU01MQUwgUmRMbywgUmRIaSwgUm0sIFJzCi0qLyAgIAotc3RhdGljIHZvaWQKLWRvX211bGwgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIGludCByZGxvLCByZGhpLCBybSwgcnM7Ci0KLSAgLyogT25seSBvbmUgZm9ybWF0ICJyZGxvLCByZGhpLCBybSwgcnMiICovCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKHJkbG8gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJkaGkgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJtID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogcmRoaSwgcmRsbyBhbmQgcm0gbXVzdCBhbGwgYmUgZGlmZmVyZW50ICovCi0gIGlmIChyZGxvID09IHJkaGkgfHwgcmRsbyA9PSBybSB8fCByZGhpID09IHJtKQotICAgIGFzX3Rza3RzayAoXygicmRoaSwgcmRsbyBhbmQgcm0gbXVzdCBhbGwgYmUgZGlmZmVyZW50IikpOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChycyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCA4KSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyZGhpID09IFJFR19QQyB8fCByZGhpID09IFJFR19QQyB8fCByZGhpID09IFJFR19QQyB8fCByZGhpID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX1BDOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgIAotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbXVsIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJkLCBybTsKLSAgCi0gIC8qIE9ubHkgb25lIGZvcm1hdCAicmQsIHJtLCBycyIgKi8KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgocmQgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJkID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX1BDOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocm0gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocm0gPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfUEM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChybSA9PSByZCkKLSAgICBhc190c2t0c2sgKF8oInJkIGFuZCBybSBzaG91bGQgYmUgZGlmZmVyZW50IGluIG11bCIpKTsKLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocm0gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgOCkpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocm0gPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfUEM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19tbGEgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgcmQsIHJtOwotCi0gIC8qIE9ubHkgb25lIGZvcm1hdCAicmQsIHJtLCBycywgcm4iICovCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKHJkID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyZCA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9QQzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJtID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJtID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX1BDOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocm0gPT0gcmQpCi0gICAgYXNfdHNrdHNrIChfKCJyZCBhbmQgcm0gc2hvdWxkIGJlIGRpZmZlcmVudCBpbiBtbGEiKSk7Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJkID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDgpKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChybSA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmQgPT0gUkVHX1BDIHx8IHJtID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX1BDOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi0vKiBSZXR1cm5zIHRoZSBpbmRleCBpbnRvIGZwX3ZhbHVlcyBvZiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgb3IgLTEgaWYKLSAgIG5vdCBpbiB0aGUgdGFibGUuICAqLwotc3RhdGljIGludAotbXlfZ2V0X2Zsb2F0X2V4cHJlc3Npb24gKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgY2hhciAqICAgICAgICAgc2F2ZV9pbjsKLSAgZXhwcmVzc2lvblMgICAgZXhwOwotICBpbnQgICAgICAgICAgICBpOwotICBpbnQgICAgICAgICAgICBqOwotCi0gIG1lbXNldCAod29yZHMsIDAsIE1BWF9MSVRUTEVOVU1TICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAvKiBMb29rIGZvciBhIHJhdyBmbG9hdGluZyBwb2ludCBudW1iZXIgKi8KLSAgaWYgKChzYXZlX2luID0gYXRvZl9pZWVlICgqc3RyLCAneCcsIHdvcmRzKSkgIT0gTlVMTAotICAgICAgJiYgKGlzX2VuZF9vZl9saW5lIFsoaW50KSgqc2F2ZV9pbildIHx8ICpzYXZlX2luID09ICdcMCcpKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRkxPQVRfVkFMUzsgaSsrKQotCXsKLQkgIGZvciAoaiA9IDA7IGogPCBNQVhfTElUVExFTlVNUzsgaisrKQotCSAgICB7Ci0JICAgICAgaWYgKHdvcmRzW2pdICE9IGZwX3ZhbHVlc1tpXVtqXSkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKGogPT0gTUFYX0xJVFRMRU5VTVMpCi0JICAgIHsKLQkgICAgICAqc3RyID0gc2F2ZV9pbjsKLQkgICAgICByZXR1cm4gaTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogVHJ5IGFuZCBwYXJzZSBhIG1vcmUgY29tcGxleCBleHByZXNzaW9uLCB0aGlzIHdpbGwgcHJvYmFibHkgZmFpbAotICAgICB1bmxlc3MgdGhlIGNvZGUgdXNlcyBhIGZsb2F0aW5nIHBvaW50IHByZWZpeCAoZWcgIjBmIikgKi8KLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gKnN0cjsKLSAgaWYgKGV4cHJlc3Npb24gKCZleHApID09IGFic29sdXRlX3NlY3Rpb24KLSAgICAgICYmIGV4cC5YX29wID09IE9fYmlnCi0gICAgICAmJiBleHAuWF9hZGRfbnVtYmVyIDwgMCkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogNSA9IFhfUFJFQ0lTSU9OLCBzaG91bGQgYmUgI2RlZmluZSdkIHdoZXJlIHdlIGNhbiB1c2UgaXQuCi0JIERpdHRvIGZvciAxNS4gICovCi0gICAgICBpZiAoZ2VuX3RvX3dvcmRzICh3b3JkcywgNSwgKGxvbmcpMTUpID09IDApCi0JewotCSAgZm9yIChpID0gMDsgaSA8IE5VTV9GTE9BVF9WQUxTOyBpKyspCi0JICAgIHsKLQkgICAgICBmb3IgKGogPSAwOyBqIDwgTUFYX0xJVFRMRU5VTVM7IGorKykKLQkJewotCQkgIGlmICh3b3Jkc1tqXSAhPSBmcF92YWx1ZXNbaV1bal0pCi0JCSAgICBicmVhazsKLQkJfQotCi0JICAgICAgaWYgKGogPT0gTUFYX0xJVFRMRU5VTVMpCi0JCXsKLQkJICAqc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0JCSAgcmV0dXJuIGk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgcmV0dXJuIC0xOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyBpbiB0aGUgZXhwcmVzc2lvbiBpcyBhIGJpZ251bSAqLwotc3RhdGljIGludAotd2Fsa19ub19iaWdudW1zIChzcCkKLSAgICAgc3ltYm9sUyAqIHNwOwotewotICBpZiAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzcCktPlhfb3AgPT0gT19iaWcpCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ApLT5YX2FkZF9zeW1ib2wpCi0gICAgewotICAgICAgcmV0dXJuICh3YWxrX25vX2JpZ251bXMgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ApLT5YX2FkZF9zeW1ib2wpCi0JICAgICAgfHwgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ApLT5YX29wX3N5bWJvbAotCQkgICYmIHdhbGtfbm9fYmlnbnVtcyAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzcCktPlhfb3Bfc3ltYm9sKSkpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbXlfZ2V0X2V4cHJlc3Npb24gKGVwLCBzdHIpCi0gICAgIGV4cHJlc3Npb25TICogZXA7Ci0gICAgIGNoYXIgKiogc3RyOwotewotICBjaGFyICogc2F2ZV9pbjsKLSAgc2VnVCAgIHNlZzsKLSAgCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9ICpzdHI7Ci0gIHNlZyA9IGV4cHJlc3Npb24gKGVwKTsKLQotI2lmZGVmIE9CSl9BT1VUCi0gIGlmIChzZWcgIT0gYWJzb2x1dGVfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IHRleHRfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IGRhdGFfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IGJzc19zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oImJhZF9zZWdtZW50Iik7Ci0gICAgICAqc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIEdldCByaWQgb2YgYW55IGJpZ251bXMgbm93LCBzbyB0aGF0IHdlIGRvbid0IGdlbmVyYXRlIGFuIGVycm9yIGZvciB3aGljaAotICAgICB3ZSBjYW4ndCBlc3RhYmxpc2ggYSBsaW5lIG51bWJlciBsYXRlciBvbi4gIEJpZyBudW1iZXJzIGFyZSBuZXZlciB2YWxpZAotICAgICBpbiBpbnN0cnVjdGlvbnMsIHdoaWNoIGlzIHdoZXJlIHRoaXMgcm91dGluZSBpcyBhbHdheXMgY2FsbGVkLiAgKi8KLSAgaWYgKGVwLT5YX29wID09IE9fYmlnCi0gICAgICB8fCAoZXAtPlhfYWRkX3N5bWJvbAotCSAgJiYgKHdhbGtfbm9fYmlnbnVtcyAoZXAtPlhfYWRkX3N5bWJvbCkKLQkgICAgICB8fCAoZXAtPlhfb3Bfc3ltYm9sCi0JCSAgJiYgd2Fsa19ub19iaWdudW1zIChlcC0+WF9vcF9zeW1ib2wpKSkpKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIGNvbnN0YW50Iik7Ci0gICAgICAqc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAqc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICByZXR1cm4gMDsKLX0KLQotLyogdW5yZXN0cmljdCBzaG91bGQgYmUgb25lIGlmIDxzaGlmdD4gPHJlZ2lzdGVyPiBpcyBwZXJtaXR0ZWQgZm9yIHRoaXMKLSAgIGluc3RydWN0aW9uICovCi0KLXN0YXRpYyBpbnQKLWRlY29kZV9zaGlmdCAoc3RyLCB1bnJlc3RyaWN0KQotICAgICBjaGFyICoqIHN0cjsKLSAgICAgaW50ICAgICB1bnJlc3RyaWN0OwotewotICBzdHJ1Y3QgYXNtX3NoaWZ0ICogc2hmdDsKLSAgY2hhciAqIHA7Ci0gIGNoYXIgICBjOwotICAgIAotICBza2lwX3doaXRlc3BhY2UgKCogc3RyKTsKLSAgICAKLSAgZm9yIChwID0gKnN0cjsgaXNhbHBoYSAoKnApOyBwKyspCi0gICAgOwotCi0gIGlmIChwID09ICpzdHIpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIlNoaWZ0IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybiBGQUlMOwotICAgIH0KLQotICBjID0gKnA7Ci0gICpwID0gJ1wwJzsKLSAgc2hmdCA9IChzdHJ1Y3QgYXNtX3NoaWZ0ICopIGhhc2hfZmluZCAoYXJtX3NoaWZ0X2hzaCwgKnN0cik7Ci0gICpwID0gYzsKLSAgaWYgKHNoZnQpCi0gICAgewotICAgICAgaWYgKCFzdHJuY21wICgqc3RyLCAicnJ4IiwgMykKLSAgICAgICAgICB8fCAhc3RybmNtcCAoKnN0ciwgIlJSWCIsIDMpKQotCXsKLQkgICpzdHIgPSBwOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBzaGZ0LT52YWx1ZTsKLQkgIHJldHVybiBTVUNDRVNTOwotCX0KLQotICAgICAgc2tpcF93aGl0ZXNwYWNlIChwKTsKLSAgICAgIAotICAgICAgaWYgKHVucmVzdHJpY3QgJiYgcmVnX3JlcXVpcmVkX2hlcmUgKCZwLCA4KSAhPSBGQUlMKQotCXsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gc2hmdC0+dmFsdWUgfCBTSElGVF9CWV9SRUc7Ci0JICAqc3RyID0gcDsKLQkgIHJldHVybiBTVUNDRVNTOwotCX0KLSAgICAgIGVsc2UgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCogcCkpCi0JewotCSAgaW5zdC5lcnJvciA9IE5VTEw7Ci0JICBwKys7Ci0JICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnApKQotCSAgICByZXR1cm4gRkFJTDsKLQotCSAgLyogVmFsaWRhdGUgc29tZSBzaW1wbGUgI2V4cHJlc3Npb25zICovCi0JICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbnVtID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCi0JICAgICAgLyogUmVqZWN0IG9wZXJhdGlvbnMgZ3JlYXRlciB0aGFuIDMyLCBvciBsc2wgIzMyICovCi0JICAgICAgaWYgKG51bSA+IDMyIHx8IChudW0gPT0gMzIgJiYgc2hmdC0+dmFsdWUgPT0gMCkpCi0JCXsKLQkJICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBpbW1lZGlhdGUgc2hpZnQiKTsKLQkJICByZXR1cm4gRkFJTDsKLQkJfQotCi0JICAgICAgLyogU2hpZnRzIG9mIHplcm8gc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBsc2wgKHdoaWNoIGlzIHplcm8pKi8KLQkgICAgICBpZiAobnVtID09IDApCi0JCXsKLQkJICAqc3RyID0gcDsKLQkJICByZXR1cm4gU1VDQ0VTUzsKLQkJfQotCi0JICAgICAgLyogU2hpZnRzIG9mIDMyIGFyZSBlbmNvZGVkIGFzIDAsIGZvciB0aG9zZSBzaGlmdHMgdGhhdAotCQkgc3VwcG9ydCBpdC4gICovCi0JICAgICAgaWYgKG51bSA9PSAzMikKLQkJbnVtID0gMDsKLQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKG51bSA8PCA3KSB8IHNoZnQtPnZhbHVlOwotCSAgICAgICpzdHIgPSBwOwotCSAgICAgIHJldHVybiBTVUNDRVNTOwotCSAgICB9Ci0KLQkgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fU0hJRlRfSU1NOwotCSAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBzaGZ0LT52YWx1ZTsKLQkgICpzdHIgPSBwOwotCSAgcmV0dXJuIFNVQ0NFU1M7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QuZXJyb3IgPSB1bnJlc3RyaWN0ID8gXygic2hpZnQgcmVxdWlyZXMgcmVnaXN0ZXIgb3IgI2V4cHJlc3Npb24iKQotCSAgICA6IF8oInNoaWZ0IHJlcXVpcmVzICNleHByZXNzaW9uIik7Ci0JICAqc3RyID0gcDsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICB9Ci0KLSAgaW5zdC5lcnJvciA9IF8oIlNoaWZ0IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLS8qIERvIHRob3NlIGRhdGFfb3BzIHdoaWNoIGNhbiB0YWtlIGEgbmVnYXRpdmUgaW1tZWRpYXRlIGNvbnN0YW50ICovCi0vKiBieSBhbHRlcmluZyB0aGUgaW5zdHVjdGlvbi4gQSBiaXQgb2YgYSBoYWNrIHJlYWxseSAqLwotLyogICAgICBNT1YgPC0+IE1WTgotICAgICAgICBBTkQgPC0+IEJJQwotICAgICAgICBBREMgPC0+IFNCQwotICAgICAgICBieSBpbnZlcnRpbmcgdGhlIHNlY29uZCBvcGVyYW5kLCBhbmQKLSAgICAgICAgQUREIDwtPiBTVUIKLSAgICAgICAgQ01QIDwtPiBDTU4KLSAgICAgICAgYnkgbmVnYXRpbmcgdGhlIHNlY29uZCBvcGVyYW5kLgotKi8KLXN0YXRpYyBpbnQKLW5lZ2F0ZV9kYXRhX29wIChpbnN0cnVjdGlvbiwgdmFsdWUpCi0gICAgIHVuc2lnbmVkIGxvbmcgKiBpbnN0cnVjdGlvbjsKLSAgICAgdW5zaWduZWQgbG9uZyAgIHZhbHVlOwotewotICBpbnQgb3AsIG5ld19pbnN0OwotICB1bnNpZ25lZCBsb25nIG5lZ2F0ZWQsIGludmVydGVkOwotCi0gIG5lZ2F0ZWQgPSB2YWxpZGF0ZV9pbW1lZGlhdGUgKC12YWx1ZSk7Ci0gIGludmVydGVkID0gdmFsaWRhdGVfaW1tZWRpYXRlICh+dmFsdWUpOwotCi0gIG9wID0gKCppbnN0cnVjdGlvbiA+PiBEQVRBX09QX1NISUZUKSAmIDB4ZjsKLSAgc3dpdGNoIChvcCkKLSAgICB7Ci0gICAgICAvKiBGaXJzdCBuZWdhdGVzICovCi0gICAgY2FzZSBPUENPREVfU1VCOiAgICAgICAgICAgICAvKiBBREQgPC0+IFNVQiAqLwotICAgICAgbmV3X2luc3QgPSBPUENPREVfQUREOwotICAgICAgdmFsdWUgPSBuZWdhdGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9BREQ6IAotICAgICAgbmV3X2luc3QgPSBPUENPREVfU1VCOyAgICAgICAgICAgICAgIAotICAgICAgdmFsdWUgPSBuZWdhdGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9DTVA6ICAgICAgICAgICAgIC8qIENNUCA8LT4gQ01OICovCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9DTU47Ci0gICAgICB2YWx1ZSA9IG5lZ2F0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDT0RFX0NNTjogCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9DTVA7ICAgICAgICAgICAgICAgCi0gICAgICB2YWx1ZSA9IG5lZ2F0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogTm93IEludmVydGVkIG9wcyAqLwotICAgIGNhc2UgT1BDT0RFX01PVjogICAgICAgICAgICAgLyogTU9WIDwtPiBNVk4gKi8KLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX01WTjsgICAgICAgICAgICAgICAKLSAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDT0RFX01WTjogCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9NT1Y7Ci0gICAgICB2YWx1ZSA9IGludmVydGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9BTkQ6ICAgICAgICAgICAgIC8qIEFORCA8LT4gQklDICovIAotICAgICAgbmV3X2luc3QgPSBPUENPREVfQklDOyAgICAgICAgICAgICAgIAotICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfQklDOiAKLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0FORDsKLSAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDT0RFX0FEQzogICAgICAgICAgICAgIC8qIEFEQyA8LT4gU0JDICovCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9TQkM7ICAgICAgICAgICAgICAgCi0gICAgICB2YWx1ZSA9IGludmVydGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9TQkM6IAotICAgICAgbmV3X2luc3QgPSBPUENPREVfQURDOwotICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBXZSBjYW5ub3QgZG8gYW55dGhpbmcgKi8KLSAgICBkZWZhdWx0OiAgCi0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgaWYgKHZhbHVlID09IEZBSUwpCi0gICAgcmV0dXJuIEZBSUw7Ci0KLSAgKmluc3RydWN0aW9uICY9IE9QQ09ERV9NQVNLOwotICAqaW5zdHJ1Y3Rpb24gfD0gbmV3X2luc3QgPDwgREFUQV9PUF9TSElGVDsKLSAgcmV0dXJuIHZhbHVlOyAKLX0KLQotc3RhdGljIGludAotZGF0YV9vcDIgKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIGludCB2YWx1ZTsKLSAgZXhwcmVzc2lvblMgZXhwcjsKLQotICBza2lwX3doaXRlc3BhY2UgKCogc3RyKTsKLSAgICAKLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlIChzdHIsIDApICE9IEZBSUwpCi0gICAgewotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoc3RyKSA9PSBTVUNDRVNTKQotCS8qIFNoaWZ0IG9wZXJhdGlvbiBvbiByZWdpc3Rlci4gICovCi0JcmV0dXJuIGRlY29kZV9zaGlmdCAoc3RyLCBOT19TSElGVF9SRVNUUklDVCk7Ci0KLSAgICAgIHJldHVybiBTVUNDRVNTOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEltbWVkaWF0ZSBleHByZXNzaW9uICovCi0gICAgICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKipzdHIpKQotCXsKLQkgICgqc3RyKSsrOwotCSAgaW5zdC5lcnJvciA9IE5VTEw7Ci0JICAKLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCBzdHIpKQotCSAgICByZXR1cm4gRkFJTDsKLQotCSAgaWYgKGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCkKLQkgICAgewotCSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOwotCSAgICAgIGluc3QucmVsb2MucGNfcmVsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoc3RyKSA9PSBTVUNDRVNTKQotCQl7Ci0JCSAgLyogI3gsIHkgLS0gaWUgZXhwbGljaXQgcm90YXRpb24gYnkgWSAgKi8KLQkJICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZleHByLCBzdHIpKQotCQkgICAgcmV0dXJuIEZBSUw7Ci0KLQkJICBpZiAoZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICB7Ci0JCSAgICAgIGluc3QuZXJyb3IgPSBfKCJDb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0JCSAgICAgIHJldHVybiBGQUlMOwotCQkgICAgfQotIAotCQkgIC8qIFJvdGF0ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiAqLwotCQkgIGlmICgoKHVuc2lnbmVkKSBleHByLlhfYWRkX251bWJlcikgPiAzMAotCQkgICAgICB8fCAoZXhwci5YX2FkZF9udW1iZXIgJiAxKSAhPSAwCi0JCSAgICAgIHx8ICgodW5zaWduZWQpIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcikgPiAyNTUpCi0JCSAgICB7Ci0JCSAgICAgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIGNvbnN0YW50Iik7Ci0JCSAgICAgIHJldHVybiBGQUlMOwotCQkgICAgfQotCQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSU5TVF9JTU1FRElBVEU7Ci0JCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0JCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBleHByLlhfYWRkX251bWJlciA8PCA3OwotCQkgIHJldHVybiBTVUNDRVNTOwotCQl9Ci0KLQkgICAgICAvKiBJbXBsaWNpdCByb3RhdGlvbiwgc2VsZWN0IGEgc3VpdGFibGUgb25lICAqLwotCSAgICAgIHZhbHVlID0gdmFsaWRhdGVfaW1tZWRpYXRlIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIpOwotCi0JICAgICAgaWYgKHZhbHVlID09IEZBSUwpCi0JCXsKLQkJICAvKiBDYW4ndCBiZSBkb25lLCBwZXJoYXBzIHRoZSBjb2RlIHJlYWRzIHNvbWV0aGluZyBsaWtlCi0JCSAgICAgImFkZCBSZCwgUm4sICMtbiIsIHdoZXJlICJzdWIgUmQsIFJuLCAjbiIgd291bGQgYmUgb2sgKi8KLQkJICBpZiAoKHZhbHVlID0gbmVnYXRlX2RhdGFfb3AgKCZpbnN0Lmluc3RydWN0aW9uLAotCQkJCQkgICAgICAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyKSkKLQkJICAgICAgPT0gRkFJTCkKLQkJICAgIHsKLQkJICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgY29uc3RhbnQiKTsKLQkJICAgICAgcmV0dXJuIEZBSUw7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gdmFsdWU7Ci0JICAgIH0KLQotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBJTlNUX0lNTUVESUFURTsKLQkgIHJldHVybiBTVUNDRVNTOwotCX0KLQotICAgICAgKCpzdHIpKys7Ci0gICAgICBpbnN0LmVycm9yID0gXygiUmVnaXN0ZXIgb3Igc2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1mcF9vcDIgKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoKiBzdHIpOwotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoc3RyLCAwKSAhPSBGQUlMKQotICAgIHJldHVybiBTVUNDRVNTOwotICBlbHNlCi0gICAgewotICAgICAgLyogSW1tZWRpYXRlIGV4cHJlc3Npb24gKi8KLSAgICAgIGlmICgqKCgqc3RyKSsrKSA9PSAnIycpCi0JewotCSAgaW50IGk7Ci0KLQkgIGluc3QuZXJyb3IgPSBOVUxMOwotCi0JICBza2lwX3doaXRlc3BhY2UgKCogc3RyKTsKLQotCSAgLyogRmlyc3QgdHJ5IGFuZCBtYXRjaCBleGFjdCBzdHJpbmdzLCB0aGlzIGlzIHRvIGd1YXJhbnRlZSB0aGF0Ci0JICAgICBzb21lIGZvcm1hdHMgd2lsbCB3b3JrIGV2ZW4gZm9yIGNyb3NzIGFzc2VtYmx5ICovCi0KLQkgIGZvciAoaSA9IDA7IGZwX2NvbnN0W2ldOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3RybmNtcCAoKnN0ciwgZnBfY29uc3RbaV0sIHN0cmxlbiAoZnBfY29uc3RbaV0pKSA9PSAwKQotCQl7Ci0JCSAgY2hhciAqc3RhcnQgPSAqc3RyOwotCi0JCSAgKnN0ciArPSBzdHJsZW4gKGZwX2NvbnN0W2ldKTsKLQkJICBpZiAoaXNfZW5kX29mX2xpbmVbKGludCkqKnN0cl0gfHwgKipzdHIgPT0gJ1wwJykKLQkJICAgIHsKLQkJICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBpICsgODsKLQkJICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0JCSAgICB9Ci0JCSAgKnN0ciA9IHN0YXJ0OwotCQl9Ci0JICAgIH0KLQotCSAgLyogSnVzdCBiZWNhdXNlIHdlIGRpZG4ndCBnZXQgYSBtYXRjaCBkb2Vzbid0IG1lYW4gdGhhdCB0aGUKLQkgICAgIGNvbnN0YW50IGlzbid0IHZhbGlkLCBqdXN0IHRoYXQgaXQgaXMgaW4gYSBmb3JtYXQgdGhhdCB3ZQotCSAgICAgZG9uJ3QgYXV0b21hdGljYWxseSByZWNvZ25pemUuICBUcnkgcGFyc2luZyBpdCB3aXRoCi0JICAgICB0aGUgc3RhbmRhcmQgZXhwcmVzc2lvbiByb3V0aW5lcy4gICovCi0JICBpZiAoKGkgPSBteV9nZXRfZmxvYXRfZXhwcmVzc2lvbiAoc3RyKSkgPj0gMCkKLQkgICAgewotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gaSArIDg7Ci0JICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0JICAgIH0KLQotCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlIGV4cHJlc3Npb24iKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICAgIGluc3QuZXJyb3IgPSBfKCJGbG9hdGluZyBwb2ludCByZWdpc3RlciBvciBpbW1lZGlhdGUgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZG9fYXJpdCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBkYXRhX29wMiAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fYWRyIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgLyogVGhpcyBpcyBhIHBzZXVkby1vcCBvZiB0aGUgZm9ybSAiYWRyIHJkLCBsYWJlbCIgdG8gYmUgY29udmVydGVkCi0gICAgIGludG8gYSByZWxhdGl2ZSBhZGRyZXNzIG9mIHRoZSBmb3JtICJhZGQgcmQsIHBjLCAjbGFiZWwtLi04IiAqLwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBGcmFnIGhhY2tpbmcgd2lsbCB0dXJuIHRoaXMgaW50byBhIHN1YiBpbnN0cnVjdGlvbiBpZiB0aGUgb2Zmc2V0IHR1cm5zCi0gICAgIG91dCB0byBiZSBuZWdhdGl2ZS4gICovCi0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOwotICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgLT0gODsgLyogUEMgcmVsYXRpdmUgYWRqdXN0ICovCi0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2FkcmwgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBUaGlzIGlzIGEgcHNldWRvLW9wIG9mIHRoZSBmb3JtICJhZHJsIHJkLCBsYWJlbCIgdG8gYmUgY29udmVydGVkCi0gICAgIGludG8gYSByZWxhdGl2ZSBhZGRyZXNzIG9mIHRoZSBmb3JtOgotICAgICAJYWRkIHJkLCBwYywgI2xvdyhsYWJlbC0uLTgpIgotICAgICAJYWRkIHJkLCByZCwgI2hpZ2gobGFiZWwtLi04KSIgICAqLwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCAxMikgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmIHN0cikgPT0gRkFJTAotICAgICAgfHwgbXlfZ2V0X2V4cHJlc3Npb24gKCYgaW5zdC5yZWxvYy5leHAsICYgc3RyKSkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICAKLSAgLyogRnJhZyBoYWNraW5nIHdpbGwgdHVybiB0aGlzIGludG8gYSBzdWIgaW5zdHJ1Y3Rpb24gaWYgdGhlIG9mZnNldCB0dXJucwotICAgICBvdXQgdG8gYmUgbmVnYXRpdmUuICAqLwotICBpbnN0LnJlbG9jLnR5cGUgICAgICAgICAgICAgID0gQkZEX1JFTE9DX0FSTV9BRFJMX0lNTUVESUFURTsKLSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyIC09IDg7IC8qIFBDIHJlbGF0aXZlIGFkanVzdCAqLwotICBpbnN0LnJlbG9jLnBjX3JlbCAgICAgICAgICAgID0gMTsKLSAgaW5zdC5pbnN0cnVjdGlvbiAgICAgICAgICAgIHw9IGZsYWdzOwotICBpbnN0LnNpemUgICAgICAgICAgICAgICAgICAgID0gSU5TTl9TSVpFICogMjsKLSAgCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NtcCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGRhdGFfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGlmICgoZmxhZ3MgJiAweDAwMDBmMDAwKSA9PSAwKQotICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ09ORFNfQklUOwotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19tb3YgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBkYXRhX29wMiAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgaW50Ci1sZHN0X2V4dGVuZCAoc3RyLCBod3NlKQotICAgICBjaGFyICoqIHN0cjsKLSAgICAgaW50ICAgICBod3NlOwotewotICBpbnQgYWRkID0gSU5ERVhfVVA7Ci0KLSAgc3dpdGNoICgqKnN0cikKLSAgICB7Ci0gICAgY2FzZSAnIyc6Ci0gICAgY2FzZSAnJCc6Ci0gICAgICAoKnN0cikrKzsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgc3RyKSkKLQlyZXR1cm4gRkFJTDsKLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICBpbnQgdmFsdWUgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLSAgICAgICAgICBpZiAoKGh3c2UgJiYgKHZhbHVlIDwgLTI1NSB8fCB2YWx1ZSA+IDI1NSkpCi0gICAgICAgICAgICAgICB8fCAodmFsdWUgPCAtNDA5NSB8fCB2YWx1ZSA+IDQwOTUpKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oImFkZHJlc3Mgb2Zmc2V0IHRvbyBsYXJnZSIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0KLQkgIGlmICh2YWx1ZSA8IDApCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IC12YWx1ZTsKLQkgICAgICBhZGQgPSAwOwotCSAgICB9Ci0KLSAgICAgICAgICAvKiBIYWxmd29yZCBhbmQgc2lnbmV4dGVuc2lvbiBpbnN0cnVjdGlvbnMgaGF2ZSB0aGUKLSAgICAgICAgICAgICBpbW1lZGlhdGUgdmFsdWUgc3BsaXQgYWNyb3NzIGJpdHMgMTEuLjggYW5kIGJpdHMgMy4uMCAqLwotICAgICAgICAgIGlmIChod3NlKQotICAgICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBhZGQgfCBIV09GRlNFVF9JTU0gfCAoKHZhbHVlID4+IDQpIDw8IDgpIHwgKHZhbHVlICYgMHhGKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGFkZCB8IHZhbHVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0gICAgICAgICAgaWYgKGh3c2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSFdPRkZTRVRfSU1NOwotICAgICAgICAgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04OwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTsKLQkgIGluc3QucmVsb2MucGNfcmVsID0gMDsKLQl9Ci0gICAgICByZXR1cm4gU1VDQ0VTUzsKLQotICAgIGNhc2UgJy0nOgotICAgICAgYWRkID0gMDsJLyogYW5kIGZhbGwgdGhyb3VnaCAqLwotICAgIGNhc2UgJysnOgotICAgICAgKCpzdHIpKys7CS8qIGFuZCBmYWxsIHRocm91Z2ggKi8KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlIChzdHIsIDApID09IEZBSUwpCi0JcmV0dXJuIEZBSUw7Ci0KLSAgICAgIGlmIChod3NlKQotICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGFkZDsKLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gYWRkIHwgT0ZGU0VUX1JFRzsKLSAgICAgICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hIChzdHIpID09IFNVQ0NFU1MpCi0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX3NoaWZ0IChzdHIsIFNISUZUX1JFU1RSSUNUKTsKLSAgICAgICAgfQotCi0gICAgICByZXR1cm4gU1VDQ0VTUzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19sZHN0IChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IGhhbGZ3b3JkID0gMDsKLSAgaW50IHByZV9pbmMgPSAwOwotICBpbnQgY29uZmxpY3RfcmVnOwotICBpbnQgdmFsdWU7Ci0KLSAgLyogVGhpcyBpcyBub3QgaWRlYWwsIGJ1dCBpdCBpcyB0aGUgc2ltcGxlc3Qgd2F5IG9mIGRlYWxpbmcgd2l0aCB0aGUKLSAgICAgQVJNN1QgaGFsZndvcmQgaW5zdHJ1Y3Rpb25zIChzaW5jZSB0aGV5IHVzZSBhIGRpZmZlcmVudAotICAgICBlbmNvZGluZywgYnV0IHRoZSBzYW1lIG1uZW1vbmljKTogKi8KLSAgaGFsZndvcmQgPSAoZmxhZ3MgJiAweDgwMDAwMDAwKSAhPSAwOwotICBpZiAoaGFsZndvcmQpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhY3R1YWxseSBhIGxvYWQvc3RvcmUgb2YgYSBoYWxmd29yZCwgb3IgYQotICAgICAgICAgc2lnbmVkLWV4dGVuc2lvbiBsb2FkICovCi0gICAgICBpZiAoKGNwdV92YXJpYW50ICYgQVJNX0hBTEZXT1JEKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaW5zdC5lcnJvcgotCSAgICA9IF8oIlByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IGhhbGZ3b3JkcyBvciBzaWduZWQgYnl0ZXMiKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IChpbnN0Lmluc3RydWN0aW9uICYgQ09ORF9NQVNLKQotICAgICAgICAgICAgICAgICAgICAgICAgIHwgKGZsYWdzICYgfkNPTkRfTUFTSyk7Ci0KLSAgICAgIGZsYWdzID0gMDsKLSAgICB9Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotICAgIAotICBpZiAoKGNvbmZsaWN0X3JlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmIHN0ciwgMTIpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCYgc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJBZGRyZXNzIGV4cGVjdGVkIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgqc3RyID09ICdbJykKLSAgICB7Ci0gICAgICBpbnQgcmVnOwotCi0gICAgICBzdHIrKzsKLQotICAgICAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikpID09IEZBSUwpCi0JcmV0dXJuOwotCi0gICAgICAvKiBDb25mbGljdHMgY2FuIG9jY3VyIG9uIHN0b3JlcyBhcyB3ZWxsIGFzIGxvYWRzLiAgKi8KLSAgICAgIGNvbmZsaWN0X3JlZyA9IChjb25mbGljdF9yZWcgPT0gcmVnKTsKLQotICAgICAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gICAgICBpZiAoKnN0ciA9PSAnXScpCi0JewotCSAgc3RyICsrOwotCSAgCi0JICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBTVUNDRVNTKQotCSAgICB7Ci0JICAgICAgLyogW1JuXSwuLi4gKHBvc3QgaW5jKSAqLwotCSAgICAgIGlmIChsZHN0X2V4dGVuZCAoJnN0ciwgaGFsZndvcmQpID09IEZBSUwpCi0JCXJldHVybjsKLQkgICAgICBpZiAoY29uZmxpY3RfcmVnKQotCQlhc193YXJuIChfKCIlcyByZWdpc3RlciBzYW1lIGFzIHdyaXRlLWJhY2sgYmFzZSIpLAotCQkJIChpbnN0Lmluc3RydWN0aW9uICYgTE9BRF9CSVQpID8gXygiZGVzdGluYXRpb24iKSA6IF8oInNvdXJjZSIpICk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFtSbl0gKi8KLSAgICAgICAgICAgICAgaWYgKGhhbGZ3b3JkKQotICAgICAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSFdPRkZTRVRfSU1NOwotCi0gICAgICAgICAgICAgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICAgICAgICAgICAgICBpZiAoKnN0ciA9PSAnIScpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIGlmIChjb25mbGljdF9yZWcpCi0JCSAgIGFzX3dhcm4gKF8oIiVzIHJlZ2lzdGVyIHNhbWUgYXMgd3JpdGUtYmFjayBiYXNlIiksCi0JCQkgICAgKGluc3QuaW5zdHJ1Y3Rpb24gJiBMT0FEX0JJVCkgPyBfKCJkZXN0aW5hdGlvbiIpIDogXygic291cmNlIikgKTsKLSAgICAgICAgICAgICAgICAgc3RyKys7Ci0gICAgICAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gV1JJVEVfQkFDSzsKLSAgICAgICAgICAgICAgIH0KLQotCSAgICAgIGZsYWdzIHw9IElOREVYX1VQOwotCSAgICAgIGlmICghIChmbGFncyAmIFRSQU5TX0JJVCkpCi0JCXByZV9pbmMgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFtSbiwuLi5dICovCi0JICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oInByZS1pbmRleGVkIGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgcHJlX2luYyA9IDE7Ci0JICBpZiAobGRzdF9leHRlbmQgKCZzdHIsIGhhbGZ3b3JkKSA9PSBGQUlMKQotCSAgICByZXR1cm47Ci0KLQkgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotCSAgaWYgKCpzdHIrKyAhPSAnXScpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygibWlzc2luZyBdIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotCSAgaWYgKCpzdHIgPT0gJyEnKQotCSAgICB7Ci0JICAgICAgaWYgKGNvbmZsaWN0X3JlZykKLQkJYXNfd2FybiAoXygiJXMgcmVnaXN0ZXIgc2FtZSBhcyB3cml0ZS1iYWNrIGJhc2UiKSwKLQkJCSAoaW5zdC5pbnN0cnVjdGlvbiAmIExPQURfQklUKSA/IF8oImRlc3RpbmF0aW9uIikgOiBfKCJzb3VyY2UiKSApOwotCSAgICAgIHN0cisrOwotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gV1JJVEVfQkFDSzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKCpzdHIgPT0gJz0nKQotICAgIHsKLSAgICAgIC8qIFBhcnNlIGFuICJsZHIgUmQsID1leHByIiBpbnN0cnVjdGlvbjsgdGhpcyBpcyBhbm90aGVyIHBzZXVkbyBvcCAqLwotICAgICAgc3RyKys7Ci0KLSAgICAgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCSAgJiYgaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX3N5bWJvbCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiQ29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgKHZhbHVlID0gdmFsaWRhdGVfaW1tZWRpYXRlKGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcikpICE9IEZBSUwpCi0JewotCSAgLyogVGhpcyBjYW4gYmUgZG9uZSB3aXRoIGEgbW92IGluc3RydWN0aW9uICovCi0JICBpbnN0Lmluc3RydWN0aW9uICY9IExJVEVSQUxfTUFTSzsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSU5TVF9JTU1FRElBVEUgfCAoT1BDT0RFX01PViA8PCBEQVRBX09QX1NISUZUKTsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKGZsYWdzICYgQ09ORF9NQVNLKSB8ICh2YWx1ZSAmIDB4ZmZmKTsKLQkgIGVuZF9vZl9saW5lKHN0cik7Ci0JICByZXR1cm47IAotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJbnNlcnQgaW50byBsaXRlcmFsIHBvb2wgKi8gICAgIAotCSAgaWYgKGFkZF90b19saXRfcG9vbCAoKSA9PSBGQUlMKQotCSAgICB7Ci0JICAgICAgaWYgKCFpbnN0LmVycm9yKQotCQlpbnN0LmVycm9yID0gXygibGl0ZXJhbCBwb29sIGluc2VydGlvbiBmYWlsZWQiKTsgCi0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIENoYW5nZSB0aGUgaW5zdHJ1Y3Rpb24gZXhwIHRvIHBvaW50IHRvIHRoZSBwb29sICovCi0gICAgICAgICAgaWYgKGhhbGZ3b3JkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IEhXT0ZGU0VUX0lNTTsKLSAgICAgICAgICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotCSAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0xJVEVSQUw7Ci0JICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IChSRUdfUEMgPDwgMTYpOwotCSAgcHJlX2luYyA9IDE7IAotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoaGFsZndvcmQpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IEhXT0ZGU0VUX0lNTTsKLSAgICAgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04OwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTsKLSAgICAgIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA4OyAgLyogUEMgcmVsIGFkanVzdCAqLwotICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUkVHX1BDIDw8IDE2KTsKLSAgICAgIHByZV9pbmMgPSAxOwotICAgIH0KLSAgICAKLSAgaWYgKHByZV9pbmMgJiYgKGZsYWdzICYgVFJBTlNfQklUKSkKLSAgICBpbnN0LmVycm9yID0gXygiUHJlLWluY3JlbWVudCBpbnN0cnVjdGlvbiB3aXRoIHRyYW5zbGF0ZSIpOwotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3MgfCAocHJlX2luYyA/IFBSRV9JTkRFWCA6IDApOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgbG9uZwotcmVnX2xpc3QgKHN0cnApCi0gICAgIGNoYXIgKiogc3RycDsKLXsKLSAgY2hhciAqIHN0ciA9ICpzdHJwOwotICBsb25nICAgcmFuZ2UgPSAwOwotICBpbnQgICAgYW5vdGhlcl9yYW5nZTsKLQotICAvKiBXZSBjb21lIGJhY2sgaGVyZSBpZiB3ZSBnZXQgcmFuZ2VzIGNvbmNhdGVuYXRlZCBieSAnKycgb3IgJ3wnICovCi0gIGRvCi0gICAgewotICAgICAgYW5vdGhlcl9yYW5nZSA9IDA7Ci0KLSAgICAgIGlmICgqc3RyID09ICd7JykKLQl7Ci0JICBpbnQgaW5fcmFuZ2UgPSAwOwotCSAgaW50IGN1cl9yZWcgPSAtMTsKLSAgICAgIAotCSAgc3RyKys7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgaW50IHJlZzsKLQkgICAgCi0JICAgICAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0JICAgICAgaWYgKChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJiBzdHIsIC0xKSkgPT0gRkFJTCkKLQkJcmV0dXJuIEZBSUw7Ci0JICAgICAgCi0JICAgICAgaWYgKGluX3JhbmdlKQotCQl7Ci0JCSAgaW50IGk7Ci0JICAgICAgCi0JCSAgaWYgKHJlZyA8PSBjdXJfcmVnKQotCQkgICAgewotCQkgICAgICBpbnN0LmVycm9yID0gXygiQmFkIHJhbmdlIGluIHJlZ2lzdGVyIGxpc3QiKTsKLQkJICAgICAgcmV0dXJuIEZBSUw7Ci0JCSAgICB9Ci0KLQkJICBmb3IgKGkgPSBjdXJfcmVnICsgMTsgaSA8IHJlZzsgaSsrKQotCQkgICAgewotCQkgICAgICBpZiAocmFuZ2UgJiAoMSA8PCBpKSkKLQkJCWFzX3Rza3RzayAKLQkJCSAgKF8oIldhcm5pbmc6IER1cGxpY2F0ZWQgcmVnaXN0ZXIgKHIlZCkgaW4gcmVnaXN0ZXIgbGlzdCIpLAotCQkJICAgaSk7Ci0JCSAgICAgIGVsc2UKLQkJCXJhbmdlIHw9IDEgPDwgaTsKLQkJICAgIH0KLQkJICBpbl9yYW5nZSA9IDA7Ci0JCX0KLQotCSAgICAgIGlmIChyYW5nZSAmICgxIDw8IHJlZykpCi0JCWFzX3Rza3RzayAoXygiV2FybmluZzogRHVwbGljYXRlZCByZWdpc3RlciAociVkKSBpbiByZWdpc3RlciBsaXN0IiksCi0JCQkgICByZWcpOwotCSAgICAgIGVsc2UgaWYgKHJlZyA8PSBjdXJfcmVnKQotCQlhc190c2t0c2sgKF8oIldhcm5pbmc6IFJlZ2lzdGVyIHJhbmdlIG5vdCBpbiBhc2NlbmRpbmcgb3JkZXIiKSk7Ci0KLQkgICAgICByYW5nZSB8PSAxIDw8IHJlZzsKLQkgICAgICBjdXJfcmVnID0gcmVnOwotCSAgICB9IHdoaWxlIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpICE9IEZBSUwKLQkJICAgICB8fCAoaW5fcmFuZ2UgPSAxLCAqc3RyKysgPT0gJy0nKSk7Ci0JICBzdHItLTsKLQkgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotCSAgaWYgKCpzdHIrKyAhPSAnfScpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiTWlzc2luZyBgfSciKTsKLQkgICAgICByZXR1cm4gRkFJTDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByZXNzaW9uUyBleHByOwotCi0JICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZleHByLCAmc3RyKSkKLQkgICAgcmV0dXJuIEZBSUw7Ci0KLQkgIGlmIChleHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGlmIChleHByLlhfYWRkX251bWJlciAKLQkJICAhPSAoZXhwci5YX2FkZF9udW1iZXIgJiAweDAwMDBmZmZmKSkKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIG1hc2siKTsKLQkJICByZXR1cm4gRkFJTDsKLQkJfQotCi0JICAgICAgaWYgKChyYW5nZSAmIGV4cHIuWF9hZGRfbnVtYmVyKSAhPSAwKQotCQl7Ci0JCSAgaW50IHJlZ25vID0gcmFuZ2UgJiBleHByLlhfYWRkX251bWJlcjsKLQotCQkgIHJlZ25vICY9IC1yZWdubzsKLQkJICByZWdubyA9ICgxIDw8IHJlZ25vKSAtIDE7Ci0JCSAgYXNfdHNrdHNrIAotCQkgICAgKF8oIldhcm5pbmc6IER1cGxpY2F0ZWQgcmVnaXN0ZXIgKHIlZCkgaW4gcmVnaXN0ZXIgbGlzdCIpLAotCQkgICAgIHJlZ25vKTsKLQkJfQotCi0JICAgICAgcmFuZ2UgfD0gZXhwci5YX2FkZF9udW1iZXI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChpbnN0LnJlbG9jLnR5cGUgIT0gMCkKLQkJewotCQkgIGluc3QuZXJyb3IgPSBfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4Iik7Ci0JCSAgcmV0dXJuIEZBSUw7Ci0JCX0KLQotCSAgICAgIG1lbWNweSAoJmluc3QucmVsb2MuZXhwLCAmZXhwciwgc2l6ZW9mIChleHByZXNzaW9uUykpOwotCSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fTVVMVEk7Ci0JICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgICAgIGlmICgqc3RyID09ICd8JyB8fCAqc3RyID09ICcrJykKLQl7Ci0JICBzdHIrKzsKLQkgIGFub3RoZXJfcmFuZ2UgPSAxOwotCX0KLSAgICB9IHdoaWxlIChhbm90aGVyX3JhbmdlKTsKLQotICAqc3RycCA9IHN0cjsKLSAgcmV0dXJuIHJhbmdlOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbGRtc3RtIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IGJhc2VfcmVnOwotICBsb25nIHJhbmdlOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKGJhc2VfcmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJhc2VfcmVnID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygicjE1IG5vdCBhbGxvd2VkIGFzIGJhc2UgcmVnaXN0ZXIiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgqc3RyID09ICchJykKLSAgICB7Ci0gICAgICBmbGFncyB8PSBXUklURV9CQUNLOwotICAgICAgc3RyKys7Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyYW5nZSA9IHJlZ19saXN0ICgmc3RyKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCpzdHIgPT0gJ14nKQotICAgIHsKLSAgICAgIHN0cisrOwotICAgICAgZmxhZ3MgfD0gTERNX1RZUEVfMl9PUl8zOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzIHwgcmFuZ2U7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19zd2kgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0gIAotICAvKiBBbGxvdyBvcHRpb25hbCBsZWFkaW5nICcjJy4gICovCi0gIGlmIChpc19pbW1lZGlhdGVfcHJlZml4ICgqc3RyKSkKLSAgICBzdHIrKzsKLQotICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCYgaW5zdC5yZWxvYy5leHAsICYgc3RyKSkKLSAgICByZXR1cm47Ci0KLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9TV0k7Ci0gIGluc3QucmVsb2MucGNfcmVsID0gMDsKLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICAKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fc3dhcCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIGludCByZWc7Ci0gIAotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpKSA9PSBGQUlMKQotICAgIHJldHVybjsKLQotICBpZiAocmVnID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygicjE1IG5vdCBhbGxvd2VkIGluIHN3YXAiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmVnID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygicjE1IG5vdCBhbGxvd2VkIGluIHN3YXAiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKnN0cisrICE9ICdbJykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChyZWcgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfUEM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKnN0cisrICE9ICddJykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygibWlzc2luZyBdIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19icmFuY2ggKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0gICAgcmV0dXJuOwotICAKLSNpZmRlZiBPQkpfRUxGCi0gIHsKLSAgICBjaGFyICogc2F2ZV9pbjsKLSAgCi0gICAgLyogU2NvdHRCOiBGZWJydWFyeSA1LCAxOTk4ICovCi0gICAgLyogQ2hlY2sgdG8gc2VlIG9mIFBMVDMyIHJlbG9jIHJlcXVpcmVkIGZvciB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAgIAotICAgIC8qIGFybV9wYXJzZV9yZWxvYygpIHdvcmtzIG9uIGlucHV0X2xpbmVfcG9pbnRlci4KLSAgICAgICBXZSBhY3R1YWxseSB3YW50IHRvIHBhcnNlIHRoZSBvcGVyYW5kcyB0byB0aGUgYnJhbmNoIGluc3RydWN0aW9uCi0gICAgICAgcGFzc2VkIGluICdzdHInLiAgU2F2ZSB0aGUgaW5wdXQgcG9pbnRlciBhbmQgcmVzdG9yZSBpdCBsYXRlci4gICovCi0gICAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0gICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19zeW1ib2wKLQkmJiAqc3RyID09ICcoJwotCSYmIGFybV9wYXJzZV9yZWxvYyAoKSA9PSBCRkRfUkVMT0NfQVJNX1BMVDMyKQotICAgICAgewotCWluc3QucmVsb2MudHlwZSAgID0gQkZEX1JFTE9DX0FSTV9QTFQzMjsKLQlpbnN0LnJlbG9jLnBjX3JlbCA9IDA7Ci0JLyogTW9kaWZ5IHN0ciB0byBwb2ludCB0byBhZnRlciBwYXJzZWQgb3BlcmFuZHMsIG90aGVyd2lzZQotCSAgIGVuZF9vZl9saW5lKCkgd2lsbCBjb21wbGFpbiBhYm91dCB0aGUgKFBMVCkgbGVmdCBpbiBzdHIuICAqLwotCXN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JaW5zdC5yZWxvYy50eXBlICAgPSBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSDsKLQlpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gICAgICB9Ci0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgfQotI2Vsc2UKLSAgaW5zdC5yZWxvYy50eXBlICAgPSBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSDsKLSAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLSAgCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19ieCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIGludCByZWc7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJlZyA9PSBSRUdfUEMpCi0gICAgaW5zdC5lcnJvciA9IEJBRF9QQzsKLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NkcCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIENvLXByb2Nlc3NvciBkYXRhIG9wZXJhdGlvbi4KLSAgICAgRm9ybWF0OiBDRFB7Y29uZH0gQ1AjLDxleHByPixDUmQsQ1JuLENSbXssPGV4cHI+fSAgKi8KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChjb19wcm9jX251bWJlciAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9vcGNfZXhwciAoJnN0ciwgMjAsNCkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IFNVQ0NFU1MpCi0gICAgewotICAgICAgaWYgKGNwX29wY19leHByICgmc3RyLCA1LCAzKSA9PSBGQUlMKQotCXsKLQkgIGlmICghaW5zdC5lcnJvcikKLQkgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2xzdGMgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBDby1wcm9jZXNzb3IgcmVnaXN0ZXIgbG9hZC9zdG9yZS4KLSAgICAgRm9ybWF0OiA8TERDfFNUQ3tjb25kfVtMXSBDUCMsQ1JkLDxhZGRyZXNzPiAgKi8KLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKGNvX3Byb2NfbnVtYmVyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19jb19yZWcgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBDby1wcm9jZXNzb3IgcmVnaXN0ZXIgdHJhbnNmZXIuCi0gICAgIEZvcm1hdDogPE1DUnxNUkM+e2NvbmR9IENQIyw8ZXhwcjE+LFJkLENSbixDUm17LDxleHByMj59ICAqLwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoY29fcHJvY19udW1iZXIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3Bfb3BjX2V4cHIgKCZzdHIsIDIxLCAzKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gU1VDQ0VTUykKLSAgICB7Ci0gICAgICBpZiAoY3Bfb3BjX2V4cHIgKCZzdHIsIDUsIDMpID09IEZBSUwpCi0JewotCSAgaWYgKCFpbnN0LmVycm9yKQotCSAgICBpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgaWYgKGZsYWdzKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBCQURfQ09ORDsKLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX2N0cmwgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBGUCBjb250cm9sIHJlZ2lzdGVycy4KLSAgICAgRm9ybWF0OiA8V0ZTfFJGU3xXRkN8UkZDPntjb25kfSBSbiAgKi8KLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfbGRzdCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBzd2l0Y2ggKGluc3Quc3VmZml4KQotICAgIHsKLSAgICBjYXNlIFNVRkZfUzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VGRl9EOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1g7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9ZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX1A6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWCB8IENQX1RfWTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF9sZG1zdG0gKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgbnVtX3JlZ3M7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEdldCBOdW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHRyYW5zZmVyICovCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IF8oImNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiQ29uc3RhbnQgdmFsdWUgcmVxdWlyZWQgZm9yIG51bWJlciBvZiByZWdpc3RlcnMiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbnVtX3JlZ3MgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLSAgaWYgKG51bV9yZWdzIDwgMSB8fCBudW1fcmVncyA+IDQpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIm51bWJlciBvZiByZWdpc3RlcnMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzE6NF0iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3dpdGNoIChudW1fcmVncykKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1g7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9ZIHwgQ1BfVF9YOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoZmxhZ3MpCi0gICAgewotICAgICAgaW50IHJlZzsKLSAgICAgIGludCB3cml0ZV9iYWNrOwotICAgICAgaW50IG9mZnNldDsKLQotICAgICAgLyogVGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCAiZWEiIG9yICJmZCIsIHNvIHdlIGNhbiBvbmx5IGFjY2VwdAotCSBbUm5deyF9LiAgVGhlIGluc3RydWN0aW9uIGRvZXMgbm90IHJlYWxseSBzdXBwb3J0IHN0YWNraW5nIG9yCi0JIHVuc3RhY2tpbmcsIHNvIHdlIGhhdmUgdG8gZW11bGF0ZSB0aGVzZSBieSBzZXR0aW5nIGFwcHJvcHJpYXRlCi0JIGJpdHMgYW5kIG9mZnNldHMuICAqLwotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotCSAgfHwgKnN0ciAhPSAnWycpCi0JewotCSAgaWYgKCEgaW5zdC5lcnJvcikKLQkgICAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgc3RyKys7Ci0gICAgICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICAgICAgaWYgKCpzdHIgIT0gJ10nKQotCXsKLQkgIGluc3QuZXJyb3IgPSBCQURfQVJHUzsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIHN0cisrOwotICAgICAgaWYgKCpzdHIgPT0gJyEnKQotCXsKLQkgIHdyaXRlX2JhY2sgPSAxOwotCSAgc3RyKys7Ci0JICBpZiAocmVnID09IFJFR19QQykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJSMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciB3aXRoIHdyaXRlLWJhY2siKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0Jd3JpdGVfYmFjayA9IDA7Ci0KLSAgICAgIGlmIChmbGFncyAmIENQX1RfUHJlKQotCXsKLQkgIC8qIFByZS1kZWNyZW1lbnQgKi8KLQkgIG9mZnNldCA9IDMgKiBudW1fcmVnczsKLQkgIGlmICh3cml0ZV9iYWNrKQotCSAgICBmbGFncyB8PSBDUF9UX1dCOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBQb3N0LWluY3JlbWVudCAqLwotCSAgaWYgKHdyaXRlX2JhY2spCi0JICAgIHsKLQkgICAgICBmbGFncyB8PSBDUF9UX1dCOwotCSAgICAgIG9mZnNldCA9IDMgKiBudW1fcmVnczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTm8gd3JpdGUtYmFjaywgc28gY29udmVydCB0aGlzIGludG8gYSBzdGFuZGFyZCBwcmUtaW5jcmVtZW50Ci0JCSBpbnN0cnVjdGlvbiAtLSBhZXN0aGV0aWNhbGx5IG1vcmUgcGxlYXNpbmcuICAqLwotCSAgICAgIGZsYWdzID0gQ1BfVF9QcmUgfCBDUF9UX1VEOwotCSAgICAgIG9mZnNldCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3MgfCBvZmZzZXQ7Ci0gICAgfQotICBlbHNlIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLQkgICB8fCBjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfZHlhZGljIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIHN3aXRjaCAoaW5zdC5zdWZmaXgpCi0gICAgewotICAgIGNhc2UgU1VGRl9TOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0Q6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZnBfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBmcF9vcDIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF9tb25hZGljIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIHN3aXRjaCAoaW5zdC5zdWZmaXgpCi0gICAgewotICAgIGNhc2UgU1VGRl9TOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0Q6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZnBfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfY21wIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGZwX29wMiAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX2Zyb21fcmVnIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIHN3aXRjaCAoaW5zdC5zdWZmaXgpCi0gICAgewotICAgIGNhc2UgU1VGRl9TOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0Q6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfdG9fcmVnIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi0vKiBUaHVtYiBzcGVjaWZpYyByb3V0aW5lcyAqLwotCi0vKiBQYXJzZSBhbmQgdmFsaWRhdGUgdGhhdCBhIHJlZ2lzdGVyIGlzIG9mIHRoZSByaWdodCBmb3JtLCB0aGlzIHNhdmVzCi0gICByZXBlYXRlZCBjaGVja2luZyBvZiB0aGlzIGluZm9ybWF0aW9uIGluIG1hbnkgc2ltaWxhciBjYXNlcy4gCi0gICBVbmxpa2UgdGhlIDMyLWJpdCBjYXNlIHdlIGRvIG5vdCBpbnNlcnQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIG9wY29kZSAKLSAgIGhlcmUsIHNpbmNlIHRoZSBwb3NpdGlvbiBpcyBvZnRlbiB1bmtub3duIHVudGlsIHRoZSBmdWxsIGluc3RydWN0aW9uIAotICAgaGFzIGJlZW4gcGFyc2VkLiAgKi8KLXN0YXRpYyBpbnQKLXRodW1iX3JlZyAoc3RycCwgaGlfbG8pCi0gICAgIGNoYXIgKiogc3RycDsKLSAgICAgaW50ICAgICBoaV9sbzsKLXsKLSAgaW50IHJlZzsKLQotICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlIChzdHJwLCAtMSkpID09IEZBSUwpCi0gICAgcmV0dXJuIEZBSUw7Ci0KLSAgc3dpdGNoIChoaV9sbykKLSAgICB7Ci0gICAgY2FzZSBUSFVNQl9SRUdfTE86Ci0gICAgICBpZiAocmVnID4gNykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygibG8gcmVnaXN0ZXIgcmVxdWlyZWQiKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUSFVNQl9SRUdfSEk6Ci0gICAgICBpZiAocmVnIDwgOCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiaGkgcmVnaXN0ZXIgcmVxdWlyZWQiKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcmVnOwotfQotCi0vKiBQYXJzZSBhbiBhZGQgb3Igc3VidHJhY3QgaW5zdHJ1Y3Rpb24sIFNVQlRSQUNUIGlzIG5vbi16ZXJvIGlmIHRoZSBvcGNvZGUKLSAgIHdhcyBTVUIuICAqLwotc3RhdGljIHZvaWQKLXRodW1iX2FkZF9zdWIgKHN0ciwgc3VidHJhY3QpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGludCAgICBzdWJ0cmFjdDsKLXsKLSAgaW50IFJkLCBScywgUm4gPSBGQUlMOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0gICAgewotICAgICAgUnMgPSBSZDsKLSAgICAgIHN0cisrOwotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKFJzID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0JewotCSAgLyogVHdvIG9wZXJhbmQgZm9ybWF0LCBzaHVmZmxlIHRoZSByZWdpc3RlcnMgYW5kIHByZXRlbmQgdGhlcmUgCi0JICAgICBhcmUgMyAqLwotCSAgUm4gPSBSczsKLQkgIFJzID0gUmQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0JewotCSAgc3RyKys7Ci0JICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmICgoUm4gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQotCXJldHVybjsKLSAgICB9Ci0KLSAgLyogV2Ugbm93IGhhdmUgUmQgYW5kIFJzIHNldCB0byByZWdpc3RlcnMsIGFuZCBSbiBzZXQgdG8gYSByZWdpc3RlciBvciBGQUlMOwotICAgICBmb3IgdGhlIGxhdHRlciBjYXNlLCBFWFBSIGNvbnRhaW5zIHRoZSBpbW1lZGlhdGUgdGhhdCB3YXMgZm91bmQuICovCi0gIGlmIChSbiAhPSBGQUlMKQotICAgIHsKLSAgICAgIC8qIEFsbCByZWdpc3RlciBmb3JtYXQuICAqLwotICAgICAgaWYgKFJkID4gNyB8fCBScyA+IDcgfHwgUm4gPiA3KQotCXsKLQkgIGlmIChScyAhPSBSZCkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJkZXN0IGFuZCBzb3VyY2UxIG11c3QgYmUgdGhlIHNhbWUgcmVnaXN0ZXIiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgLyogQ2FuJ3QgZG8gdGhpcyBmb3IgU1VCICovCi0JICBpZiAoc3VidHJhY3QpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygic3VidHJhY3QgdmFsaWQgb25seSBvbiBsbyByZWdzIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gPSAoVF9PUENPREVfQUREX0hJCi0JCQkgICAgICB8IChSZCA+IDcgPyBUSFVNQl9IMSA6IDApCi0JCQkgICAgICB8IChSbiA+IDcgPyBUSFVNQl9IMiA6IDApKTsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJkICYgNykgfCAoKFJuICYgNykgPDwgMyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9SMyA6IFRfT1BDT0RFX0FERF9SMzsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMykgfCAoUm4gPDwgNik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEltbWVkaWF0ZSBleHByZXNzaW9uLCBub3cgdGhpbmdzIHN0YXJ0IHRvIGdldCBuYXN0eS4gICovCi0KLSAgICAgIC8qIEZpcnN0IGRlYWwgd2l0aCBISSByZWdzLCBvbmx5IHZlcnkgcmVzdHJpY3RlZCBjYXNlcyBhbGxvd2VkOgotCSBBZGp1c3RpbmcgU1AsIGFuZCB1c2luZyBQQyBvciBTUCB0byBnZXQgYW4gYWRkcmVzcy4gICovCi0gICAgICBpZiAoKFJkID4gNyAmJiAoUmQgIT0gUkVHX1NQIHx8IFJzICE9IFJFR19TUCkpCi0JICB8fCAoUnMgPiA3ICYmIFJzICE9IFJFR19TUCAmJiBScyAhPSBSRUdfUEMpKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIEhpIHJlZ2lzdGVyIHdpdGggaW1tZWRpYXRlIik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIFZhbHVlIGlzbid0IGtub3duIHlldCwgYWxsIHdlIGNhbiBkbyBpcyBzdG9yZSBhbGwgdGhlIGZyYWdtZW50cwotCSAgICAgd2Uga25vdyBhYm91dCBpbiB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGxldCB0aGUgcmVsb2MgaGFja2luZyAKLQkgICAgIHdvcmsgaXQgYWxsIG91dC4gICovCi0JICBpbnN0Lmluc3RydWN0aW9uID0gKHN1YnRyYWN0ID8gMHg4MDAwIDogMCkgfCAoUmQgPDwgNCkgfCBSczsKLQkgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfQUREOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgb2Zmc2V0ID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCi0JICBpZiAoc3VidHJhY3QpCi0JICAgIG9mZnNldCA9IC1vZmZzZXQ7Ci0KLQkgIGlmIChvZmZzZXQgPCAwKQotCSAgICB7Ci0JICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKLQkgICAgICBzdWJ0cmFjdCA9IDE7Ci0KLQkgICAgICAvKiBRdWljayBjaGVjaywgaW4gY2FzZSBvZmZzZXQgaXMgTUlOX0lOVCAqLwotCSAgICAgIGlmIChvZmZzZXQgPCAwKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICBzdWJ0cmFjdCA9IDA7Ci0KLQkgIGlmIChSZCA9PSBSRUdfU1ApCi0JICAgIHsKLQkgICAgICBpZiAob2Zmc2V0ICYgfjB4MWZjKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgaW1tZWRpYXRlIHZhbHVlIGZvciBzdGFjayBhZGp1c3QiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfU1QgOiBUX09QQ09ERV9BRERfU1Q7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBvZmZzZXQgPj4gMjsKLQkgICAgfQotCSAgZWxzZSBpZiAoUnMgPT0gUkVHX1BDIHx8IFJzID09IFJFR19TUCkKLQkgICAgewotCSAgICAgIGlmIChzdWJ0cmFjdAotCQkgIHx8IChvZmZzZXQgJiB+MHgzZmMpKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgaW1tZWRpYXRlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uIik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IChScyA9PSBSRUdfUEMgPyBUX09QQ09ERV9BRERfUEMKLQkJCQkgIDogVF9PUENPREVfQUREX1NQKTsKLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChSZCA8PCA4KSB8IChvZmZzZXQgPj4gMik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKFJzID09IFJkKQotCSAgICB7Ci0JICAgICAgaWYgKG9mZnNldCAmIH4weGZmKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTggOiBUX09QQ09ERV9BRERfSTg7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUmQgPDwgOCkgfCBvZmZzZXQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChvZmZzZXQgJiB+MHg3KQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTMgOiBUX09QQ09ERV9BRERfSTM7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKSB8IChvZmZzZXQgPDwgNik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXRodW1iX3NoaWZ0IChzdHIsIHNoaWZ0KQotICAgICBjaGFyICogc3RyOwotICAgICBpbnQgICAgc2hpZnQ7Ci17Ci0gIGludCBSZCwgUnMsIFJuID0gRkFJTDsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0gICAgewotICAgICAgLyogVHdvIG9wZXJhbmQgaW1tZWRpYXRlIGZvcm1hdCwgc2V0IFJzIHRvIFJkLiAgKi8KLSAgICAgIFJzID0gUmQ7Ci0gICAgICBzdHIrKzsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQlyZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChScyA9ICB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotCXsKLQkgIC8qIFR3byBvcGVyYW5kIGZvcm1hdCwgc2h1ZmZsZSB0aGUgcmVnaXN0ZXJzIGFuZCBwcmV0ZW5kIHRoZXJlCi0JICAgICBhcmUgMyAqLwotCSAgUm4gPSBSczsKLQkgIFJzID0gUmQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0JewotCSAgc3RyKys7Ci0JICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmICgoUm4gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0JcmV0dXJuOwotICAgIH0KLQotICAvKiBXZSBub3cgaGF2ZSBSZCBhbmQgUnMgc2V0IHRvIHJlZ2lzdGVycywgYW5kIFJuIHNldCB0byBhIHJlZ2lzdGVyIG9yIEZBSUw7Ci0gICAgIGZvciB0aGUgbGF0dGVyIGNhc2UsIEVYUFIgY29udGFpbnMgdGhlIGltbWVkaWF0ZSB0aGF0IHdhcyBmb3VuZC4gKi8KLQotICBpZiAoUm4gIT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoUnMgIT0gUmQpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oInNvdXJjZTEgYW5kIGRlc3QgbXVzdCBiZSBzYW1lIHJlZ2lzdGVyIik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBzd2l0Y2ggKHNoaWZ0KQotCXsKLQljYXNlIFRIVU1CX0FTUjogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0FTUl9SOyBicmVhazsKLQljYXNlIFRIVU1CX0xTTDogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTTF9SOyBicmVhazsKLQljYXNlIFRIVU1CX0xTUjogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTUl9SOyBicmVhazsKLQl9Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUm4gPDwgMyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChzaGlmdCkKLQl7Ci0JY2FzZSBUSFVNQl9BU1I6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9BU1JfSTsgYnJlYWs7Ci0JY2FzZSBUSFVNQl9MU0w6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU0xfSTsgYnJlYWs7Ci0JY2FzZSBUSFVNQl9MU1I6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU1JfSTsgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIFZhbHVlIGlzbid0IGtub3duIHlldCwgY3JlYXRlIGEgZHVtbXkgcmVsb2MgYW5kIGxldCByZWxvYwotCSAgICAgaGFja2luZyBmaXggaXQgdXAgKi8KLQotCSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgc2hpZnRfdmFsdWUgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmIChzaGlmdF92YWx1ZSA+IDMyIHx8IChzaGlmdF92YWx1ZSA9PSAzMiAmJiBzaGlmdCA9PSBUSFVNQl9MU0wpKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgaW1tZWRpYXRlIGZvciBzaGlmdCIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICAvKiBTaGlmdHMgb2YgemVybyBhcmUgaGFuZGxlZCBieSBjb252ZXJ0aW5nIHRvIExTTCAqLwotCSAgaWYgKHNoaWZ0X3ZhbHVlID09IDApCi0JICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU0xfSTsKLQotCSAgLyogU2hpZnRzIG9mIDMyIGFyZSBlbmNvZGVkIGFzIGEgc2hpZnQgb2YgemVybyAqLwotCSAgaWYgKHNoaWZ0X3ZhbHVlID09IDMyKQotCSAgICBzaGlmdF92YWx1ZSA9IDA7Ci0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gc2hpZnRfdmFsdWUgPDwgNjsKLQl9Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMyk7Ci0gICAgfQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXRodW1iX21vdl9jb21wYXJlIChzdHIsIG1vdmUpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGludCAgICBtb3ZlOwotewotICBpbnQgUmQsIFJzID0gRkFJTDsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQotICAgIHsKLSAgICAgIHN0cisrOwotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKChScyA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChScyAhPSBGQUlMKQotICAgIHsKLSAgICAgIGlmIChScyA8IDggJiYgUmQgPCA4KQotCXsKLQkgIGlmIChtb3ZlID09IFRIVU1CX01PVkUpCi0JICAgIC8qIEEgbW92ZSBvZiB0d28gbG93cmVncyBpcyBlbmNvZGVkIGFzIEFERCBSZCwgUnMsICMwCi0JICAgICAgIHNpbmNlIGEgTU9WIGluc3RydWN0aW9uIHByb2R1Y2VzIHVucHJlZGljdGFibGUgcmVzdWx0cyAqLwotCSAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQUREX0kzOwotCSAgZWxzZQotCSAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQ01QX0xSOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG1vdmUgPT0gVEhVTUJfTU9WRSkKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX01PVl9IUjsKLQkgIGVsc2UKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0NNUF9IUjsKLQotCSAgaWYgKFJkID4gNykKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBUSFVNQl9IMTsKLQotCSAgaWYgKFJzID4gNykKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBUSFVNQl9IMjsKLQotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUmQgJiA3KSB8ICgoUnMgJiA3KSA8PCAzKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKFJkID4gNykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygib25seSBsbyByZWdzIGFsbG93ZWQgd2l0aCBpbW1lZGlhdGUiKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChtb3ZlID09IFRIVU1CX01PVkUpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX01PVl9JODsKLSAgICAgIGVsc2UKLQlpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQ01QX0k4OwotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIDw8IDg7Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9JTU07Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgdmFsdWUgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmICh2YWx1ZSA+IDI1NSkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIGltbWVkaWF0ZSIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpbnN0Lmluc3RydWN0aW9uIHw9IHZhbHVlOwotCX0KLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHVtYl9sb2FkX3N0b3JlIChzdHIsIGxvYWRfc3RvcmUsIHNpemUpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGludCAgICBsb2FkX3N0b3JlOwotICAgICBpbnQgICAgc2l6ZTsKLXsKLSAgaW50IFJkLCBSYiwgUm8gPSBGQUlMOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgqc3RyID09ICdbJykKLSAgICB7Ci0gICAgICBzdHIrKzsKLSAgICAgIGlmICgoUmIgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQotCXJldHVybjsKLQotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgIT0gRkFJTCkKLQl7Ci0JICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0JICAgIHsKLQkgICAgICBzdHIrKzsKLQkgICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JCXJldHVybjsKLQkgICAgfQotCSAgZWxzZSBpZiAoKFJvID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMKQotCSAgICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QucmVsb2MuZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyID0gMDsKLQl9Ci0KLSAgICAgIGlmICgqc3RyICE9ICddJykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiZXhwZWN0ZWQgJ10nIik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc3RyKys7Ci0gICAgfQotICBlbHNlIGlmICgqc3RyID09ICc9JykKLSAgICB7Ci0gICAgICAvKiBQYXJzZSBhbiAibGRyIFJkLCA9ZXhwciIgaW5zdHJ1Y3Rpb247IHRoaXMgaXMgYW5vdGhlciBwc2V1ZG8gb3AgKi8KLSAgICAgIHN0cisrOwotCi0gICAgICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQotCXJldHVybjsKLQotICAgICAgZW5kX29mX2xpbmUgKHN0cik7Ci0gICAgICAKLSAgICAgIGlmICggICBpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkgICYmIGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0JewotCSAgaW5zdC5lcnJvciA9ICJDb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIjsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQKLQkgICYmICgoaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyICYgfjB4RkYpID09IDApKQotCXsKLQkgIC8qIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCBhIG1vdiBpbnN0cnVjdGlvbiAqLwotCi0JICBpbnN0Lmluc3RydWN0aW9uICA9IFRfT1BDT0RFX01PVl9JOCB8IChSZCA8PCA4KTsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCSAgcmV0dXJuOyAKLQl9Ci0KLSAgICAgIC8qIEluc2VydCBpbnRvIGxpdGVyYWwgcG9vbCAqLyAgICAgCi0gICAgICBpZiAoYWRkX3RvX2xpdF9wb29sICgpID09IEZBSUwpCi0JewotCSAgaWYgKCFpbnN0LmVycm9yKQotCSAgICBpbnN0LmVycm9yID0gImxpdGVyYWwgcG9vbCBpbnNlcnRpb24gZmFpbGVkIjsgCi0JICByZXR1cm47Ci0JfQotCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgICA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUOwotICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiAgPSBUX09QQ09ERV9MRFJfUEMgfCAoUmQgPDwgOCk7Ci0gICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgKz0gNDsgLyogQWRqdXN0IEFSTSBwaXBlbGluZSBvZmZzZXQgdG8gVGh1bWIgKi8KLQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQlyZXR1cm47Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MRFJfUEMgfCAoUmQgPDwgOCk7Ci0gICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgLT0gNDsgLyogUGlwZWxpbmUgb2Zmc2V0ICovCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDsKLSAgICAgIGVuZF9vZl9saW5lIChzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoUmIgPT0gUkVHX1BDIHx8IFJiID09IFJFR19TUCkKLSAgICB7Ci0gICAgICBpZiAoc2l6ZSAhPSBUSFVNQl9XT1JEKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJieXRlIG9yIGhhbGZ3b3JkIG5vdCB2YWxpZCBmb3IgYmFzZSByZWdpc3RlciIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKFJiID09IFJFR19QQyAmJiBsb2FkX3N0b3JlICE9IFRIVU1CX0xPQUQpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oIlIxNSBiYXNlZCBzdG9yZSBub3QgYWxsb3dlZCIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKFJvICE9IEZBSUwpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgYmFzZSByZWdpc3RlciBmb3IgcmVnaXN0ZXIgb2Zmc2V0Iik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoUmIgPT0gUkVHX1BDKQotCWluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MRFJfUEM7Ci0gICAgICBlbHNlIGlmIChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xEUl9TUDsKLSAgICAgIGVsc2UKLQlpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfU1RSX1NQOwotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIDw8IDg7Ci0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIHVuc2lnbmVkIG9mZnNldCA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotCSAgaWYgKG9mZnNldCAmIH4weDNmYykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIG9mZnNldCIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpbnN0Lmluc3RydWN0aW9uIHw9IG9mZnNldCA+PiAyOwotCX0KLSAgICAgIGVsc2UKLQlpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDsKLSAgICB9Ci0gIGVsc2UgaWYgKFJiID4gNykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiaW52YWxpZCBiYXNlIHJlZ2lzdGVyIGluIGxvYWQvc3RvcmUiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKFJvID09IEZBSUwpCi0gICAgewotICAgICAgLyogSW1tZWRpYXRlIG9mZnNldCAqLwotICAgICAgaWYgKHNpemUgPT0gVEhVTUJfV09SRCkKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX0lXIDogVF9PUENPREVfU1RSX0lXKTsKLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gVEhVTUJfSEFMRldPUkQpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKLQkJCSAgICA/IFRfT1BDT0RFX0xEUl9JSCA6IFRfT1BDT0RFX1NUUl9JSCk7Ci0gICAgICBlbHNlCi0JaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKLQkJCSAgICA/IFRfT1BDT0RFX0xEUl9JQiA6IFRfT1BDT0RFX1NUUl9JQik7Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUmIgPDwgMyk7Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgdW5zaWduZWQgb2Zmc2V0ID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCSAgCi0JICBpZiAob2Zmc2V0ICYgfigweDFmIDw8IHNpemUpKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgb2Zmc2V0Iik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IChvZmZzZXQgPj4gc2l6ZSkgPDwgNjsKLQl9Ci0gICAgICBlbHNlCi0JaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogUmVnaXN0ZXIgb2Zmc2V0ICovCi0gICAgICBpZiAoc2l6ZSA9PSBUSFVNQl9XT1JEKQotCWluc3QuaW5zdHJ1Y3Rpb24gPSAobG9hZF9zdG9yZSA9PSBUSFVNQl9MT0FECi0JCQkgICAgPyBUX09QQ09ERV9MRFJfUlcgOiBUX09QQ09ERV9TVFJfUlcpOwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSBUSFVNQl9IQUxGV09SRCkKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX1JIIDogVF9PUENPREVfU1RSX1JIKTsKLSAgICAgIGVsc2UKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX1JCIDogVF9PUENPREVfU1RSX1JCKTsKLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChSYiA8PCAzKSB8IChSbyA8PCA2KTsKLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X25vcCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICAvKiBEbyBub3RoaW5nICovCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLS8qIEhhbmRsZSB0aGUgRm9ybWF0IDQgaW5zdHJ1Y3Rpb25zIHRoYXQgZG8gbm90IGhhdmUgZXF1aXZhbGVudHMgaW4gb3RoZXIgCi0gICBmb3JtYXRzLiAgVGhhdCBpcywgQURDLCBBTkQsIEVPUiwgU0JDLCBST1IsIFRTVCwgTkVHLCBDTU4sIE9SUiwgTVVMLAotICAgQklDIGFuZCBNVk4uICAqLwotc3RhdGljIHZvaWQKLWRvX3RfYXJpdCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBpbnQgUmQsIFJzLCBSbjsKLQotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAoUnMgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0gICAgewotICAgIAlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICAJcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSAhPSBGQUlMKQotICAgIHsKLSAgICAgIC8qIFRocmVlIG9wZXJhbmQgZm9ybWF0IG5vdCBhbGxvd2VkIGZvciBUU1QsIENNTiwgTkVHIGFuZCBNVk4uCi0JIChJdCBpc24ndCBhbGxvd2VkIGZvciBDTVAgZWl0aGVyLCBidXQgdGhhdCBpc24ndCBoYW5kbGVkIGJ5IHRoaXMKLQkgZnVuY3Rpb24uKSAgKi8KLSAgICAgIGlmIChpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX1RTVAotCSAgfHwgaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9DTU4KLQkgIHx8IGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfTkVHCi0gCSAgfHwgaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9NVk4pCi0JewotCSAgaW5zdC5lcnJvciA9IEJBRF9BUkdTOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKChSbiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChScyAhPSBSZCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiZGVzdCBhbmQgc291cmNlMSBvbmUgbXVzdCBiZSB0aGUgc2FtZSByZWdpc3RlciIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIFJzID0gUm47Ci0gICAgfQotCi0gIGlmIChpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX01VTAotICAgICAgJiYgUnMgPT0gUmQpCi0gICAgYXNfdHNrdHNrIChfKCJScyBhbmQgUmQgbXVzdCBiZSBkaWZmZXJlbnQgaW4gTVVMIikpOwotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMyk7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9hZGQgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfYWRkX3N1YiAoc3RyLCAwKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfYXNyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX3NoaWZ0IChzdHIsIFRIVU1CX0FTUik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2JyYW5jaDkgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHJldHVybjsKLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDk7Ci0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2JyYW5jaDEyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICByZXR1cm47Ci0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMjsKLSAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotLyogRmluZCB0aGUgcmVhbCwgVGh1bWIgZW5jb2RlZCBzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIHN5bWJvbFMgKgotZmluZF9yZWFsX3N0YXJ0IChzeW1ib2xQKQotICAgICBzeW1ib2xTICogc3ltYm9sUDsKLXsKLSAgY2hhciAqICAgICAgIHJlYWxfc3RhcnQ7Ci0gIGNvbnN0IGNoYXIgKiBuYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gIHN5bWJvbFMgKiAgICBuZXdfdGFyZ2V0OwotCi0gIC8qIFRoaXMgZGVmaW5pdG9uIG11c3QgYWdyZWUgd2l0aCB0aGUgb25lIGluIGdjYy9jb25maWcvYXJtL3RodW1iLmMgKi8KLSNkZWZpbmUgU1RVQl9OQU1FICIucmVhbF9zdGFydF9vZiIKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIGFib3J0KCk7Ci0KLSAgLyogTmFtZXMgdGhhdCBzdGFydCB3aXRoICcuJyBhcmUgbG9jYWwgbGFiZWxzLCBub3QgZnVuY3Rpb24gZW50cnkgcG9pbnRzLgotICAgICBUaGUgY29tcGlsZXIgbWF5IGdlbmVyYXRlIEJMIGluc3RydWN0aW9ucyB0byB0aGVzZSBsYWJlbHMgYmVjYXVzZSBpdAotICAgICBuZWVkcyB0byBwZXJmb3JtIGEgYnJhbmNoIHRvIGEgZmFyIGF3YXkgbG9jYXRpb24uICAqLwotICBpZiAobmFtZVswXSA9PSAnLicpCi0gICAgcmV0dXJuIHN5bWJvbFA7Ci0gIAotICByZWFsX3N0YXJ0ID0gbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChTVFVCX05BTUUpICsgMSk7Ci0gIHNwcmludGYgKHJlYWxfc3RhcnQsICIlcyVzIiwgU1RVQl9OQU1FLCBuYW1lKTsKLQotICBuZXdfdGFyZ2V0ID0gc3ltYm9sX2ZpbmQgKHJlYWxfc3RhcnQpOwotICAKLSAgaWYgKG5ld190YXJnZXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuICgiRmFpbGVkIHRvIGZpbmQgcmVhbCBzdGFydCBvZiBmdW5jdGlvbjogJXNcbiIsIG5hbWUpOwotICAgICAgbmV3X3RhcmdldCA9IHN5bWJvbFA7Ci0gICAgfQotCi0gIGZyZWUgKHJlYWxfc3RhcnQpOwotCi0gIHJldHVybiBuZXdfdGFyZ2V0OwotfQotCi0KLXN0YXRpYyB2b2lkCi1kb190X2JyYW5jaDIzIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQotICAgIHJldHVybjsKLSAgCi0gIGluc3QucmVsb2MudHlwZSAgID0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzOwotICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotCi0gIC8qIElmIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgYnJhbmNoIGlzIGEgZGVmaW5lZCBzeW1ib2wgd2hpY2ggZG9lcyBub3QgaGF2ZQotICAgICB0aGUgVEhVTUJfRlVOQyBhdHRyaWJ1dGUsIHRoZW4gd2UgbXVzdCBiZSBjYWxsaW5nIGEgZnVuY3Rpb24gd2hpY2ggaGFzCi0gICAgIHRoZSAoaW50ZXJmYWNlYXJtKSBhdHRyaWJ1dGUuICBXZSBsb29rIGZvciB0aGUgVGh1bWIgZW50cnkgcG9pbnQgdG8gdGhhdAotICAgICBmdW5jdGlvbiBhbmQgY2hhbmdlIHRoZSBicmFuY2ggdG8gcmVmZXIgdG8gdGhhdCBmdW5jdGlvbiBpbnN0ZWFkLiAgKi8KLSAgaWYgKCAgIGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19zeW1ib2wKLSAgICAgICYmIGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCAhPSBOVUxMCi0gICAgICAmJiBTX0lTX0RFRklORUQgKGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCkKLSAgICAgICYmICEgVEhVTUJfSVNfRlVOQyAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKSkKLSAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9zeW1ib2wgPSBmaW5kX3JlYWxfc3RhcnQgKGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2J4IChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGludCByZWc7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgocmVnID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgLyogVGhpcyBzZXRzIFRIVU1CX0gyIGZyb20gdGhlIHRvcCBiaXQgb2YgcmVnLiAgKi8KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSByZWcgPDwgMzsKLQotICAvKiA/Pz8gRklYTUU6IFNob3VsZCBhZGQgYSBoYWNreSByZWxvYyBoZXJlIGlmIHJlZyBpcyBSRUdfUEMuICBUaGUgcmVsb2MKLSAgICAgc2hvdWxkIGNhdXNlIHRoZSBhbGlnbm1lbnQgdG8gYmUgY2hlY2tlZCBvbmNlIGl0IGlzIGtub3duLiAgVGhpcyBpcwotICAgICBiZWNhdXNlIEJYIFBDIG9ubHkgd29ya3MgaWYgdGhlIGluc3RydWN0aW9uIGlzIHdvcmQgYWxpZ25lZC4gICovCi0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2NvbXBhcmUgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbW92X2NvbXBhcmUgKHN0ciwgVEhVTUJfQ09NUEFSRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2xkbXN0bSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBpbnQgUmI7Ci0gIGxvbmcgcmFuZ2U7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgoUmIgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmICgqc3RyICE9ICchJykKLSAgICBhc193YXJuIChfKCJJbnNlcnRlZCBtaXNzaW5nICchJzogbG9hZC9zdG9yZSBtdWx0aXBsZSBhbHdheXMgd3JpdGVzIGJhY2sgYmFzZSByZWdpc3RlciIpKTsKLSAgZWxzZQotICAgIHN0cisrOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyYW5nZSA9IHJlZ19saXN0ICgmc3RyKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluc3QucmVsb2MudHlwZSAhPSBCRkRfUkVMT0NfTk9ORSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHJlYWxseSBkb2Vzbid0IHNlZW0gd29ydGggaXQuICovCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJFeHByZXNzaW9uIHRvbyBjb21wbGV4Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyYW5nZSAmIH4weGZmKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJvbmx5IGxvLXJlZ3MgdmFsaWQgaW4gbG9hZC9zdG9yZSBtdWx0aXBsZSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IChSYiA8PCA4KSB8IHJhbmdlOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX2xvYWRfc3RvcmUgKHN0ciwgVEhVTUJfTE9BRCwgVEhVTUJfV09SRCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2xkcmIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9MT0FELCBUSFVNQl9CWVRFKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRyaCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX0xPQUQsIFRIVU1CX0hBTEZXT1JEKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRzIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGludCBSZCwgUmIsIFJvOwotCi0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8ICpzdHIrKyAhPSAnWycKLSAgICAgIHx8IChSYiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAoUm8gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwKLSAgICAgIHx8ICpzdHIrKyAhPSAnXScpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gXygiU3ludGF4OiBsZHJzW2JdIFJkLCBbUmIsIFJvXSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIHwgKFJiIDw8IDMpIHwgKFJvIDw8IDYpOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbHNsIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX3NoaWZ0IChzdHIsIFRIVU1CX0xTTCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2xzciAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9zaGlmdCAoc3RyLCBUSFVNQl9MU1IpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9tb3YgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbW92X2NvbXBhcmUgKHN0ciwgVEhVTUJfTU9WRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3B1c2hfcG9wIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGxvbmcgcmFuZ2U7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotCi0gIGlmICgocmFuZ2UgPSByZWdfbGlzdCAoJnN0cikpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gQkFEX0FSR1M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbnN0LnJlbG9jLnR5cGUgIT0gQkZEX1JFTE9DX05PTkUpCi0gICAgewotICAgICAgLyogVGhpcyByZWFsbHkgZG9lc24ndCBzZWVtIHdvcnRoIGl0LiAqLwotICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICBpbnN0LmVycm9yID0gXygiRXhwcmVzc2lvbiB0b28gY29tcGxleCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmFuZ2UgJiB+MHhmZikKLSAgICB7Ci0gICAgICBpZiAoKGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfUFVTSAotCSAgICYmIChyYW5nZSAmIH4weGZmKSA9PSAxIDw8IFJFR19MUikKLQkgIHx8IChpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX1BPUAotCSAgICAgICYmIChyYW5nZSAmIH4weGZmKSA9PSAxIDw8IFJFR19QQykpCi0JewotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBUSFVNQl9QUF9QQ19MUjsKLQkgIHJhbmdlICY9IDB4ZmY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIGxpc3QgdG8gcHVzaC9wb3AgaW5zdHJ1Y3Rpb24iKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gcmFuZ2U7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9zdHIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9TVE9SRSwgVEhVTUJfV09SRCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3N0cmIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9TVE9SRSwgVEhVTUJfQllURSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3N0cmggKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9TVE9SRSwgVEhVTUJfSEFMRldPUkQpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9zdWIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfYWRkX3N1YiAoc3RyLCAxKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3Rfc3dpIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHNraXBfd2hpdGVzcGFjZSAoc3RyKTsKLQotICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0gICAgcmV0dXJuOwotCi0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fU1dJOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9hZHIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgLyogVGhpcyBpcyBhIHBzZXVkby1vcCBvZiB0aGUgZm9ybSAiYWRyIHJkLCBsYWJlbCIgdG8gYmUgY29udmVydGVkCi0gICAgIGludG8gYSByZWxhdGl2ZSBhZGRyZXNzIG9mIHRoZSBmb3JtICJhZGQgcmQsIHBjLCAjbGFiZWwtLi00IiAqLwotICBza2lwX3doaXRlc3BhY2UgKHN0cik7Ci0KLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCA0KSA9PSBGQUlMICAvKiBTdG9yZSBSZCBpbiB0ZW1wb3JhcnkgbG9jYXRpb24gaW5zaWRlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgbXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBCQURfQVJHUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9BREQ7Ci0gIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA0OyAvKiBQQyByZWxhdGl2ZSBhZGp1c3QgKi8KLSAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICBpbnN0Lmluc3RydWN0aW9uIHw9IFJFR19QQzsgLyogUmQgaXMgYWxyZWFkeSBwbGFjZWQgaW50byB0aGUgaW5zdHJ1Y3Rpb24gKi8KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnNlcnRfcmVnIChlbnRyeSkKLSAgICAgaW50IGVudHJ5OwotewotICBpbnQgICAgbGVuID0gc3RybGVuIChyZWdfdGFibGVbZW50cnldLm5hbWUpICsgMjsKLSAgY2hhciAqIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGxlbik7Ci0gIGNoYXIgKiBidWYyID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgaW50ICAgIGkgPSAwOwotCi0jaWZkZWYgUkVHSVNURVJfUFJFRklYCi0gIGJ1ZltpKytdID0gUkVHSVNURVJfUFJFRklYOwotI2VuZGlmCi0KLSAgc3RyY3B5IChidWYgKyBpLCByZWdfdGFibGVbZW50cnldLm5hbWUpOwotCi0gIGZvciAoaSA9IDA7IGJ1ZltpXTsgaSsrKQotICAgIGJ1ZjJbaV0gPSBpc2xvd2VyIChidWZbaV0pID8gdG91cHBlciAoYnVmW2ldKSA6IGJ1ZltpXTsKLQotICBidWYyW2ldID0gJ1wwJzsKLQotICBoYXNoX2luc2VydCAoYXJtX3JlZ19oc2gsIGJ1ZiwgKFBUUikgJnJlZ190YWJsZVtlbnRyeV0pOwotICBoYXNoX2luc2VydCAoYXJtX3JlZ19oc2gsIGJ1ZjIsIChQVFIpICZyZWdfdGFibGVbZW50cnldKTsKLX0KLQotc3RhdGljIHZvaWQKLWluc2VydF9yZWdfYWxpYXMgKHN0ciwgcmVnbnVtKQotICAgICBjaGFyICpzdHI7Ci0gICAgIGludCByZWdudW07Ci17Ci0gIHN0cnVjdCByZWdfZW50cnkgKm5ldyA9Ci0gICAgKHN0cnVjdCByZWdfZW50cnkgKil4bWFsbG9jIChzaXplb2YgKHN0cnVjdCByZWdfZW50cnkpKTsKLSAgY2hhciAqbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoc3RyKSArIDEpOwotICBzdHJjcHkgKG5hbWUsIHN0cik7Ci0KLSAgbmV3LT5uYW1lID0gbmFtZTsKLSAgbmV3LT5udW1iZXIgPSByZWdudW07Ci0KLSAgaGFzaF9pbnNlcnQgKGFybV9yZWdfaHNoLCBuYW1lLCAoUFRSKSBuZXcpOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X2NvbnN0YW50X2Zsb251bXMgKCkKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9GTE9BVF9WQUxTOyBpKyspCi0gICAgaWYgKGF0b2ZfaWVlZSAoKGNoYXIgKilmcF9jb25zdFtpXSwgJ3gnLCBmcF92YWx1ZXNbaV0pID09IE5VTEwpCi0gICAgICBhYm9ydCAoKTsKLX0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgaW50IGk7Ci0gIAotICBpZiAoICAgKGFybV9vcHNfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwKLSAgICAgIHx8IChhcm1fdG9wc19oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTAotICAgICAgfHwgKGFybV9jb25kX2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCi0gICAgICB8fCAoYXJtX3NoaWZ0X2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCi0gICAgICB8fCAoYXJtX3JlZ19oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTAotICAgICAgfHwgKGFybV9wc3JfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIlZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpKTsKLSAgICAKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoaW5zbnMpIC8gc2l6ZW9mIChzdHJ1Y3QgYXNtX29wY29kZSk7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX29wc19oc2gsIGluc25zW2ldLnRlbXBsYXRlLCAoUFRSKSAoaW5zbnMgKyBpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHRpbnNucykgLyBzaXplb2YgKHN0cnVjdCB0aHVtYl9vcGNvZGUpOyBpKyspCi0gICAgaGFzaF9pbnNlcnQgKGFybV90b3BzX2hzaCwgdGluc25zW2ldLnRlbXBsYXRlLCAoUFRSKSAodGluc25zICsgaSkpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChjb25kcykgLyBzaXplb2YgKHN0cnVjdCBhc21fY29uZCk7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX2NvbmRfaHNoLCBjb25kc1tpXS50ZW1wbGF0ZSwgKFBUUikgKGNvbmRzICsgaSkpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzaGlmdCkgLyBzaXplb2YgKHN0cnVjdCBhc21fc2hpZnQpOyBpKyspCi0gICAgaGFzaF9pbnNlcnQgKGFybV9zaGlmdF9oc2gsIHNoaWZ0W2ldLnRlbXBsYXRlLCAoUFRSKSAoc2hpZnQgKyBpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBzcnMpIC8gc2l6ZW9mIChzdHJ1Y3QgYXNtX3Bzcik7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX3Bzcl9oc2gsIHBzcnNbaV0udGVtcGxhdGUsIChQVFIpIChwc3JzICsgaSkpOwotCi0gIGZvciAoaSA9IDA7IHJlZ190YWJsZVtpXS5uYW1lOyBpKyspCi0gICAgaW5zZXJ0X3JlZyAoaSk7Ci0KLSAgc2V0X2NvbnN0YW50X2Zsb251bXMgKCk7Ci0KLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotICB7Ci0gICAgdW5zaWduZWQgaW50IGZsYWdzID0gMDsKLSAgICAKLSAgICAvKiBTZXQgdGhlIGZsYWdzIGluIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLwotICAgIGlmICh1c2VzX2FwY3NfMjYpICAgICAgZmxhZ3MgfD0gRl9BUENTMjY7Ci0gICAgaWYgKHN1cHBvcnRfaW50ZXJ3b3JrKSBmbGFncyB8PSBGX0lOVEVSV09SSzsKLSAgICBpZiAodXNlc19hcGNzX2Zsb2F0KSAgIGZsYWdzIHw9IEZfQVBDU19GTE9BVDsKLSAgICBpZiAocGljX2NvZGUpICAgICAgICAgIGZsYWdzIHw9IEZfUElDOwotICAgIGlmICgoY3B1X3ZhcmlhbnQgJiBGUFVfQUxMKSA9PSBGUFVfTk9ORSkgZmxhZ3MgfD0gRl9TT0ZUX0ZMT0FUOwotCi0gICAgYmZkX3NldF9wcml2YXRlX2ZsYWdzIChzdGRvdXRwdXQsIGZsYWdzKTsKLSAgfQotI2VuZGlmCi0gIAotICB7Ci0gICAgdW5zaWduZWQgbWFjaDsKLSAgICAKLSAgICAvKiBSZWNvcmQgdGhlIENQVSB0eXBlIGFzIHdlbGwgKi8KLSAgICBzd2l0Y2ggKGNwdV92YXJpYW50ICYgQVJNX0NQVV9NQVNLKQotICAgICAgewotICAgICAgY2FzZSBBUk1fMjoKLQltYWNoID0gYmZkX21hY2hfYXJtXzI7Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIEFSTV8zOiAvKiBhbHNvIEFSTV8yNTAgKi8KLQltYWNoID0gYmZkX21hY2hfYXJtXzJhOwotCWJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgY2FzZSBBUk1fNiB8IEFSTV8zIHwgQVJNXzI6CS8qIEFjdHVhbGx5IG5vIENQVSB0eXBlIGRlZmluZWQgKi8KLQltYWNoID0gYmZkX21hY2hfYXJtXzQ7Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIEFSTV83OiAJCQkvKiBhbHNvIEFSTV82ICovCi0JbWFjaCA9IGJmZF9tYWNoX2FybV8zOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgLyogQ2F0Y2ggc3BlY2lhbCBjYXNlcy4gICovCi0gICAgaWYgKGNwdV92YXJpYW50ICE9IChGUFVfREVGQVVMVCB8IENQVV9ERUZBVUxUKSkKLSAgICAgIHsKLQlpZiAoY3B1X3ZhcmlhbnQgJiAoQVJNX0VYVF9WNSAmIEFSTV9USFVNQikpCi0JICBtYWNoID0gYmZkX21hY2hfYXJtXzVUOwotCWVsc2UgaWYgKGNwdV92YXJpYW50ICYgQVJNX0VYVF9WNSkKLQkgIG1hY2ggPSBiZmRfbWFjaF9hcm1fNTsKLQllbHNlIGlmIChjcHVfdmFyaWFudCAmIEFSTV9USFVNQikKLQkgIG1hY2ggPSBiZmRfbWFjaF9hcm1fNFQ7Ci0JZWxzZSBpZiAoKGNwdV92YXJpYW50ICYgQVJNX0FSQ0hfVjQpID09IEFSTV9BUkNIX1Y0KQotCSAgbWFjaCA9IGJmZF9tYWNoX2FybV80OwotCWVsc2UgaWYgKGNwdV92YXJpYW50ICYgQVJNX0xPTkdNVUwpCi0JICBtYWNoID0gYmZkX21hY2hfYXJtXzNNOwotICAgICAgfQotCQotICAgIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILCBtYWNoKTsKLSAgfQotfQotCi0vKiBUdXJuIGFuIGludGVnZXIgb2YgbiBieXRlcyAoaW4gdmFsKSBpbnRvIGEgc3RyZWFtIG9mIGJ5dGVzIGFwcHJvcHJpYXRlCi0gICBmb3IgdXNlIGluIHRoZSBhLm91dCBmaWxlLCBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIGFycmF5IHBvaW50ZWQgdG8gYnkgYnVmLgotICAgVGhpcyBrbm93cyBhYm91dCB0aGUgZW5kaWFuLW5lc3Mgb2YgdGhlIHRhcmdldCBtYWNoaW5lIGFuZCBkb2VzCi0gICBUSEUgUklHSFQgVEhJTkcsIHdoYXRldmVyIGl0IGlzLiAgUG9zc2libGUgdmFsdWVzIGZvciBuIGFyZSAxIChieXRlKQotICAgMiAoc2hvcnQpIGFuZCA0IChsb25nKSAgRmxvYXRpbmcgbnVtYmVycyBhcmUgcHV0IG91dCBhcyBhIHNlcmllcyBvZgotICAgTElUVExFTlVNUyAoc2hvcnRzLCBoZXJlIGF0IGxlYXN0KS4gICovCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICogYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgICAgbjsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgZWxzZQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotc3RhdGljIHZhbHVlVCAKLW1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBuKQotICAgICBjaGFyICogYnVmOwotICAgICBpbnQgbjsKLXsKLSAgdmFsdWVUIHJlc3VsdCA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIgKiB3aGVyZSA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZjsKLQotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgd2hpbGUgKG4tLSkKLQl7Ci0JICByZXN1bHQgPDw9IDg7Ci0JICByZXN1bHQgfD0gKCp3aGVyZSsrICYgMjU1KTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKG4tLSkKLQl7Ci0JICByZXN1bHQgPDw9IDg7Ci0JICByZXN1bHQgfD0gKHdoZXJlW25dICYgMjU1KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICAgb2YgdHlwZSBUWVBFLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlcgotICAgb2YgTElUVExFTlVNUyBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0KLSAgIE5vdGUgdGhhdCBmcCBjb25zdGFudHMgYXJlbid0IHJlcHJlc2VudCBpbiB0aGUgbm9ybWFsIHdheSBvbiB0aGUgQVJNLgotICAgSW4gYmlnIGVuZGlhbiBtb2RlLCB0aGluZ3MgYXJlIGFzIGV4cGVjdGVkLiAgSG93ZXZlciwgaW4gbGl0dGxlIGVuZGlhbgotICAgbW9kZSBmcCBjb25zdGFudHMgYXJlIGJpZy1lbmRpYW4gd29yZC13aXNlLCBhbmQgbGl0dGxlLWVuZGlhbiBieXRlLXdpc2UKLSAgIHdpdGhpbiB0aGUgd29yZHMuICBGb3IgZXhhbXBsZSwgKGRvdWJsZSkgMS4xIGluIGJpZyBlbmRpYW4gbW9kZSBpcwotICAgdGhlIGJ5dGUgc2VxdWVuY2UgM2YgZjEgOTkgOTkgOTkgOTkgOTkgOWEsIGFuZCBpbiBsaXR0bGUgZW5kaWFuIG1vZGUgaXMKLSAgIHRoZSBieXRlIHNlcXVlbmNlIDk5IDk5IGYxIDNmIDlhIDk5IDk5IDk5LgotCi0gICA/Pz8gVGhlIGZvcm1hdCBvZiAxMiBieXRlIGZsb2F0cyBpcyB1bmNlcnRhaW4gYWNjb3JkaW5nIHRvIGdjYydzIGFybS5oLiAgKi8KLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciAgIHR5cGU7Ci0gICAgIGNoYXIgKiBsaXRQOwotICAgICBpbnQgKiAgc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIGNoYXIgKnQ7Ci0gIGludCBpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogMjsKLQotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRm9yIGEgNCBieXRlIGZsb2F0IHRoZSBvcmRlciBvZiBlbGVtZW50cyBpbiBgd29yZHMnIGlzIDEgMC4gIEZvciBhbgotCSA4IGJ5dGUgZmxvYXQgdGhlIG9yZGVyIGlzIDEgMCAzIDIuICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkgKz0gMikKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2kgKyAxXSwgMik7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAgKyAyLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogVGhlIGtub3dsZWRnZSBvZiB0aGUgUEMncyBwaXBlbGluZSBvZmZzZXQgaXMgYnVpbHQgaW50byB0aGUgaW5zbnMgdGhlbXNlbHZlcy4gICovIAotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqIGZpeFA7Ci17Ci0gIGlmICggICBmaXhQLT5meF9hZGRzeQotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpID09IHVuZGVmaW5lZF9zZWN0aW9uCi0gICAgICAmJiBmaXhQLT5meF9zdWJzeSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAKLSAgaWYgKGZpeFAtPmZ4X3BjcmVsICYmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9USFVNQl9BREQpKQotICAgIHsKLSAgICAgIC8qIFBDIHJlbGF0aXZlIGFkZHJlc3Npbmcgb24gdGhlIFRodW1iIGlzIHNsaWdodGx5IG9kZAotCSBhcyB0aGUgYm90dG9tIHR3byBiaXRzIG9mIHRoZSBQQyBhcmUgZm9yY2VkIHRvIHplcm8KLQkgZm9yIHRoZSBjYWxjdWxhdGlvbi4gICovCi0gICAgICByZXR1cm4gKGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcykgJiB+MzsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUICAgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0jaWZkZWYgT0JKX0VMRgotICByZXR1cm4gc2l6ZTsKLSNlbHNlCi0gIC8qIFJvdW5kIGFsbCBzZWN0cyB0byBtdWx0aXBsZSBvZiA0ICovCi0gIHJldHVybiAoc2l6ZSArIDMpICYgfjM7Ci0jZW5kaWYKLX0KLQotLyogVW5kZXIgRUxGIHdlIG5lZWQgdG8gZGVmYXVsdCBfR0xPQkFMX09GRlNFVF9UQUJMRS4gIE90aGVyd2lzZSAKLSAgIHdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqIG5hbWU7Ci17Ci0jaWZkZWYgT0JKX0VMRgotICBpZiAobmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSA9PSAnRycKLSAgICAgICYmIHN0cmVxIChuYW1lLCBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpKQotICAgIHsKLSAgICAgIGlmICghR09UX3N5bWJvbCkKLQl7Ci0JICBpZiAoc3ltYm9sX2ZpbmQgKG5hbWUpKQotCSAgICBhc19iYWQgKCJHT1QgYWxyZWFkeSBpbiB0aGUgc3ltYm9sIHRhYmxlIik7Ci0JICAKLQkgIEdPVF9zeW1ib2wgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwKLQkJCQkgICAodmFsdWVUKTAsICYgemVyb19hZGRyZXNzX2ZyYWcpOwotCX0KLSAgICAgIAotICAgICAgcmV0dXJuIEdPVF9zeW1ib2w7Ci0gICAgfQotI2VuZGlmCi0gIAotICByZXR1cm4gMDsKLX0KLQotLyogYXJtX3JlZ19wYXJzZSAoKSA6PSBpZiBpdCBsb29rcyBsaWtlIGEgcmVnaXN0ZXIsIHJldHVybiBpdHMgdG9rZW4gYW5kIAotICAgYWR2YW5jZSB0aGUgcG9pbnRlci4gKi8KLQotc3RhdGljIGludAotYXJtX3JlZ19wYXJzZSAoY2NwKQotICAgICByZWdpc3RlciBjaGFyICoqIGNjcDsKLXsKLSAgY2hhciAqIHN0YXJ0ID0gKiBjY3A7Ci0gIGNoYXIgICBjOwotICBjaGFyICogcDsKLSAgc3RydWN0IHJlZ19lbnRyeSAqIHJlZzsKLQotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAotICBpZiAoKnN0YXJ0ICE9IFJFR0lTVEVSX1BSRUZJWCkKLSAgICByZXR1cm4gRkFJTDsKLSAgcCA9IHN0YXJ0ICsgMTsKLSNlbHNlCi0gIHAgPSBzdGFydDsKLSNpZmRlZiBPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVgKLSAgaWYgKCpwID09IE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCkKLSAgICBwKyssIHN0YXJ0Kys7Ci0jZW5kaWYKLSNlbmRpZgotICBpZiAoIWlzYWxwaGEgKCpwKSB8fCAhaXNfbmFtZV9iZWdpbm5lciAoKnApKQotICAgIHJldHVybiBGQUlMOwotCi0gIGMgPSAqcCsrOwotICB3aGlsZSAoaXNhbHBoYSAoYykgfHwgaXNkaWdpdCAoYykgfHwgYyA9PSAnXycpCi0gICAgYyA9ICpwKys7Ci0KLSAgKi0tcCA9IDA7Ci0gIHJlZyA9IChzdHJ1Y3QgcmVnX2VudHJ5ICopIGhhc2hfZmluZCAoYXJtX3JlZ19oc2gsIHN0YXJ0KTsKLSAgKnAgPSBjOwotICAKLSAgaWYgKHJlZykKLSAgICB7Ci0gICAgICAqY2NwID0gcDsKLSAgICAgIHJldHVybiByZWctPm51bWJlcjsKLSAgICB9Ci0KLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLWFybV9wc3JfcGFyc2UgKGNjcCkKLSAgICAgcmVnaXN0ZXIgY2hhciAqKiBjY3A7Ci17Ci0gIGNoYXIgKiBzdGFydCA9ICogY2NwOwotICBjaGFyICAgYzsKLSAgY2hhciAqIHA7Ci0gIENPTlNUIHN0cnVjdCBhc21fcHNyICogcHNyOwotCi0gIHAgPSBzdGFydDsKLSAgYyA9ICpwKys7Ci0gIHdoaWxlIChpc2FscGhhIChjKSB8fCBjID09ICdfJykKLSAgICBjID0gKnArKzsKLQotICAqLS1wID0gMDsgIAotICBwc3IgPSAoQ09OU1Qgc3RydWN0IGFzbV9wc3IgKikgaGFzaF9maW5kIChhcm1fcHNyX2hzaCwgc3RhcnQpOwotICAqcCA9IGM7Ci0KLSAgaWYgKHBzcikKLSAgICB7Ci0gICAgICAqY2NwID0gcDsKLSAgICAgIHJldHVybiBwc3ItPm51bWJlcjsKLSAgICB9Ci0KLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLWludAotbWRfYXBwbHlfZml4MyAoZml4UCwgdmFsLCBzZWcpCi0gICAgIGZpeFMgKiAgICAgIGZpeFA7Ci0gICAgIHZhbHVlVCAqICAgIHZhbDsKLSAgICAgc2VnVCAgICAgICAgc2VnOwotewotICBvZmZzZXRUICAgICAgICB2YWx1ZSA9ICogdmFsOwotICBvZmZzZXRUICAgICAgICBuZXd2YWw7Ci0gIHVuc2lnbmVkIGludCAgIG5ld2ltbTsKLSAgdW5zaWduZWQgbG9uZyAgdGVtcDsKLSAgaW50ICAgICAgICAgICAgc2lnbjsKLSAgY2hhciAqICAgICAgICAgYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICBhcm1fZml4X2RhdGEgKiBhcm1fZGF0YSA9IChhcm1fZml4X2RhdGEgKikgZml4UC0+dGNfZml4X2RhdGE7Ci0KLSAgYXNzZXJ0IChmaXhQLT5meF9yX3R5cGUgPCBCRkRfUkVMT0NfVU5VU0VEKTsKLQotICAvKiBOb3RlIHdoZXRoZXIgdGhpcyB3aWxsIGRlbGV0ZSB0aGUgcmVsb2NhdGlvbi4gICovCi0jaWYgMCAvKiBwYXRjaCBmcm9tIFJFYXJuc2hhdyB0byBKRGF2aXMgKGRpc2FibGVkIGZvciB0aGUgbW9tZW50LCBzaW5jZSBpdCBkb2Vzbid0IHdvcmsgZnVsbHkpICovCi0gIGlmICgoZml4UC0+ZnhfYWRkc3kgPT0gMCB8fCBzeW1ib2xfY29uc3RhbnRfcCAoZml4UC0+ZnhfYWRkc3kpKQotICAgICAgJiYgIWZpeFAtPmZ4X3BjcmVsKQotI2Vsc2UKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IDAgJiYgIWZpeFAtPmZ4X3BjcmVsKQotI2VuZGlmCi0gICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiB0aGVuIHdlIG5lZWQgdG8gbGVhdmUgaXQgZm9yCi0gICAgIHRoZSBsaW5rZXIgdG8gZGVhbCB3aXRoLiAgVW5mb3J0dW5hdGVseSwgbWRfcGNyZWxfZnJvbSBjYW4ndCB0ZWxsLAotICAgICBzbyB3ZSBoYXZlIHRvIHVuZG8gaXQncyBlZmZlY3RzIGhlcmUuICAqLwotICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0gICAgewotICAgICAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VnKQotCXsKLQkgIGlmICh0YXJnZXRfb2FiaQotCSAgICAgICYmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gKLQkJKSkKLQkgICAgdmFsdWUgPSAwOwotCSAgZWxzZQotCSAgICB2YWx1ZSArPSBtZF9wY3JlbF9mcm9tIChmaXhQKTsKLQl9Ci0gICAgfQotCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwkvKiBSZW1lbWJlciB2YWx1ZSBmb3IgZW1pdF9yZWxvYy4gICovCi0KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU6Ci0gICAgICBuZXdpbW0gPSB2YWxpZGF0ZV9pbW1lZGlhdGUgKHZhbHVlKTsKLSAgICAgIHRlbXAgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLQotICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIHdpbGwgZmFpbCwgc2VlIGlmIHdlIGNhbiBmaXggdGhpbmdzIHVwIGJ5Ci0JIGNoYW5naW5nIHRoZSBvcGNvZGUuICAqLwotICAgICAgaWYgKG5ld2ltbSA9PSAodW5zaWduZWQgaW50KSBGQUlMCi0JICAmJiAobmV3aW1tID0gbmVnYXRlX2RhdGFfb3AgKCZ0ZW1wLCB2YWx1ZSkpID09ICh1bnNpZ25lZCBpbnQpIEZBSUwpCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygiaW52YWxpZCBjb25zdGFudCAoJWx4KSBhZnRlciBmaXh1cCIpLAotCQkJKHVuc2lnbmVkIGxvbmcpIHZhbHVlKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbmV3aW1tIHw9ICh0ZW1wICYgMHhmZmZmZjAwMCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgKHZhbHVlVCkgbmV3aW1tLCBJTlNOX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fQURSTF9JTU1FRElBVEU6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGhpZ2hwYXJ0ID0gMDsKLQl1bnNpZ25lZCBpbnQgbmV3aW5zbiAgPSAweGUxYTAwMDAwOyAvKiBub3AgKi8KLQluZXdpbW0gPSB2YWxpZGF0ZV9pbW1lZGlhdGUgKHZhbHVlKTsKLQl0ZW1wID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0KLQkvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gd2lsbCBmYWlsLCBzZWUgaWYgd2UgY2FuIGZpeCB0aGluZ3MgdXAgYnkKLQkgICBjaGFuZ2luZyB0aGUgb3Bjb2RlLiAgKi8KLQlpZiAobmV3aW1tID09ICh1bnNpZ25lZCBpbnQpIEZBSUwKLQkgICAgJiYgKG5ld2ltbSA9IG5lZ2F0ZV9kYXRhX29wICgmIHRlbXAsIHZhbHVlKSkgPT0gKHVuc2lnbmVkIGludCkgRkFJTCkKLQkgIHsKLQkgICAgLyogTm8gPyAgT0sgLSB0cnkgdXNpbmcgdHdvIEFERCBpbnN0cnVjdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlLiAgKi8KLQkgICAgbmV3aW1tID0gdmFsaWRhdGVfaW1tZWRpYXRlX3R3b3BhcnQgKHZhbHVlLCAmIGhpZ2hwYXJ0KTsKLQotCSAgICAvKiBZZXMgLSB0aGVuIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gaXMgYWxzbyBhbiBhZGQuICAqLwotCSAgICBpZiAobmV3aW1tICE9ICh1bnNpZ25lZCBpbnQpIEZBSUwpCi0JICAgICAgbmV3aW5zbiA9IHRlbXA7Ci0JICAgIC8qIFN0aWxsIE5vID8gIFRyeSB1c2luZyBhIG5lZ2F0ZWQgdmFsdWUuICAqLwotCSAgICBlbHNlIGlmICh2YWxpZGF0ZV9pbW1lZGlhdGVfdHdvcGFydCAoLSB2YWx1ZSwgJiBoaWdocGFydCkgIT0gKHVuc2lnbmVkIGludCkgRkFJTCkKLQkJdGVtcCA9IG5ld2luc24gPSAodGVtcCAmIE9QQ09ERV9NQVNLKSB8IE9QQ09ERV9TVUIgPDwgREFUQV9PUF9TSElGVDsKLQkgICAgLyogT3RoZXJ3aXNlIC0gZ2l2ZSB1cC4gICovCi0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICAgIF8oIlVuYWJsZSB0byBjb21wdXRlIEFEUkwgaW5zdHJ1Y3Rpb25zIGZvciBQQyBvZmZzZXQgb2YgMHgleCIpLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICAvKiBSZXBsYWNlIHRoZSBmaXJzdCBvcGVyYW5kIGluIHRoZSAybmQgaW5zdHJ1Y3Rpb24gKHdoaWNoIGlzIHRoZSBQQykKLQkgICAgICAgd2l0aCB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIuICBXZSBoYXZlIGFscmVhZHkgYWRkZWQgaW4gdGhlIFBDIGluIHRoZQotCSAgICAgICBmaXJzdCBpbnN0cnVjdGlvbiBhbmQgd2UgZG8gbm90IHdhbnQgdG8gZG8gaXQgYWdhaW4uICAqLwotCSAgICBuZXdpbnNuICY9IH4gMHhmMDAwMDsKLQkgICAgbmV3aW5zbiB8PSAoKG5ld2luc24gJiAweDBmMDAwKSA8PCA0KTsKLQkgIH0KLQotCW5ld2ltbSB8PSAodGVtcCAmIDB4ZmZmZmYwMDApOwotCW1kX251bWJlcl90b19jaGFycyAoYnVmLCAodmFsdWVUKSBuZXdpbW0sIElOU05fU0laRSk7Ci0KLQloaWdocGFydCB8PSAobmV3aW5zbiAmIDB4ZmZmZmYwMDApOwotCW1kX251bWJlcl90b19jaGFycyAoYnVmICsgSU5TTl9TSVpFLCAodmFsdWVUKSBoaWdocGFydCwgSU5TTl9TSVpFKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU06Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIAotICAgICAgaWYgKHZhbHVlIDwgMCkKLQl2YWx1ZSA9IC0gdmFsdWU7Ci0gICAgICAKLSAgICAgIGlmICh2YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWx1ZSwgMCkgPT0gRkFJTCkKLSAgICAgICAgewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIF8oImJhZCBpbW1lZGlhdGUgdmFsdWUgZm9yIG9mZnNldCAoJWxkKSIpLCAobG9uZykgdmFsdWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBJTlNOX1NJWkUpOwotICAgICAgbmV3dmFsICY9IDB4ZmY3ZmYwMDA7Ci0gICAgICBuZXd2YWwgfD0gdmFsdWUgfCAoc2lnbiA/IElOREVYX1VQIDogMCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBJTlNOX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgY2FzZSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04OgotICAgICBjYXNlIEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMOgotICAgICAgc2lnbiA9IHZhbHVlID49IDA7Ci0gICAgICAKLSAgICAgIGlmICh2YWx1ZSA8IDApCi0JdmFsdWUgPSAtIHZhbHVlOwotCi0gICAgICBpZiAodmFsaWRhdGVfb2Zmc2V0X2ltbSAodmFsdWUsIDEpID09IEZBSUwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIAotCQkJXygiaW52YWxpZCBsaXRlcmFsIGNvbnN0YW50OiBwb29sIG5lZWRzIHRvIGJlIGNsb3NlciIpKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc19iYWQgKF8oImJhZCBpbW1lZGlhdGUgdmFsdWUgZm9yIGhhbGYtd29yZCBvZmZzZXQgKCVsZCkiKSwKLQkJICAgIChsb25nKSB2YWx1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0gICAgICBuZXd2YWwgJj0gMHhmZjdmZjBmMDsKLSAgICAgIG5ld3ZhbCB8PSAoKHZhbHVlID4+IDQpIDw8IDgpIHwgKHZhbHVlICYgMHhmKSB8IChzaWduID8gSU5ERVhfVVAgOiAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9MSVRFUkFMOgotICAgICAgc2lnbiA9IHZhbHVlID49IDA7Ci0gICAgICAKLSAgICAgIGlmICh2YWx1ZSA8IDApCi0JdmFsdWUgPSAtIHZhbHVlOwotCi0gICAgICBpZiAodmFsaWRhdGVfb2Zmc2V0X2ltbSAodmFsdWUsIDApID09IEZBSUwpCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCAKLQkJCV8oImludmFsaWQgbGl0ZXJhbCBjb25zdGFudDogcG9vbCBuZWVkcyB0byBiZSBjbG9zZXIiKSk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBJTlNOX1NJWkUpOwotICAgICAgbmV3dmFsICY9IDB4ZmY3ZmYwMDA7Ci0gICAgICBuZXd2YWwgfD0gdmFsdWUgfCAoc2lnbiA/IElOREVYX1VQIDogMCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBJTlNOX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fU0hJRlRfSU1NOgotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0gICAgICBpZiAoKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSkgPiAzMgotCSAgfHwgKHZhbHVlID09IDMyIAotCSAgICAgICYmICgoKG5ld3ZhbCAmIDB4NjApID09IDApIHx8IChuZXd2YWwgJiAweDYwKSA9PSAweDYwKSkpCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygic2hpZnQgZXhwcmVzc2lvbiBpcyB0b28gbGFyZ2UiKSk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICh2YWx1ZSA9PSAwKQotCW5ld3ZhbCAmPSB+MHg2MDsJLyogU2hpZnRzIG9mIHplcm8gbXVzdCBiZSBkb25lIGFzIGxzbCAqLwotICAgICAgZWxzZSBpZiAodmFsdWUgPT0gMzIpCi0JdmFsdWUgPSAwOwotICAgICAgbmV3dmFsICY9IDB4ZmZmZmYwN2Y7Ci0gICAgICBuZXd2YWwgfD0gKHZhbHVlICYgMHgxZikgPDwgNzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwgLCBJTlNOX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fU1dJOgotICAgICAgaWYgKGFybV9kYXRhLT50aHVtYl9tb2RlKQotCXsKLQkgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDB4ZmYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiSW52YWxpZCBzd2kgZXhwcmVzc2lvbiIpKTsKLQkgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKSAmIDB4ZmYwMDsKLQkgIG5ld3ZhbCB8PSB2YWx1ZTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIFRIVU1CX1NJWkUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSkgPiAweDAwZmZmZmZmKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIAotCQkJICBfKCJJbnZhbGlkIHN3aSBleHByZXNzaW9uIikpOwotCSAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSkgJiAweGZmMDAwMDAwOwotCSAgbmV3dmFsIHw9IHZhbHVlOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCAsIElOU05fU0laRSk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fTVVMVEk6Ci0gICAgICBpZiAoKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSkgPiAweGZmZmYpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgICBfKCJJbnZhbGlkIGV4cHJlc3Npb24gaW4gbG9hZC9zdG9yZSBtdWx0aXBsZSIpKTsKLSAgICAgIG5ld3ZhbCA9IHZhbHVlIHwgbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBJTlNOX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNIOgotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgICBpZiAoISB0YXJnZXRfb2FiaSkKLSAgICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0jZW5kaWYKLSAgICAgIHZhbHVlICA9ICh2YWx1ZSA+PiAyKSAmIDB4MDBmZmZmZmY7Ci0gICAgICB2YWx1ZSAgPSAodmFsdWUgKyAobmV3dmFsICYgMHgwMGZmZmZmZikpICYgMHgwMGZmZmZmZjsKLSAgICAgIG5ld3ZhbCA9IHZhbHVlIHwgKG5ld3ZhbCAmIDB4ZmYwMDAwMDApOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgSU5TTl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5OiAvKiBjb25kaXRpb25hbCBicmFuY2ggKi8KLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKLSAgICAgIHsKLSAgICAgICAgYWRkcmVzc1QgZGlmZiA9IChuZXd2YWwgJiAweGZmKSA8PCAxOwotICAgICAgICBpZiAoZGlmZiAmIDB4MTAwKQotICAgICAgICAgZGlmZiB8PSB+MHhmZjsKLQotICAgICAgICB2YWx1ZSArPSBkaWZmOwotICAgICAgICBpZiAoKHZhbHVlICYgfjB4ZmYpICYmICgodmFsdWUgJiB+MHhmZikgIT0gfjB4ZmYpKQotICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICBfKCJCcmFuY2ggb3V0IG9mIHJhbmdlIikpOwotICAgICAgICBuZXd2YWwgPSAobmV3dmFsICYgMHhmZjAwKSB8ICgodmFsdWUgJiAweDFmZikgPj4gMSk7Ci0gICAgICB9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTI6IC8qIHVuY29uZGl0aW9uYWwgYnJhbmNoICovCi0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICB7Ci0gICAgICAgIGFkZHJlc3NUIGRpZmYgPSAobmV3dmFsICYgMHg3ZmYpIDw8IDE7Ci0gICAgICAgIGlmIChkaWZmICYgMHg4MDApCi0gICAgICAgICBkaWZmIHw9IH4weDdmZjsKLQotICAgICAgICB2YWx1ZSArPSBkaWZmOwotICAgICAgICBpZiAoKHZhbHVlICYgfjB4N2ZmKSAmJiAoKHZhbHVlICYgfjB4N2ZmKSAhPSB+MHg3ZmYpKQotICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICBfKCJCcmFuY2ggb3V0IG9mIHJhbmdlIikpOwotICAgICAgICBuZXd2YWwgPSAobmV3dmFsICYgMHhmODAwKSB8ICgodmFsdWUgJiAweGZmZikgPj4gMSk7Ci0gICAgICB9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjM6Ci0gICAgICB7Ci0gICAgICAgIG9mZnNldFQgbmV3dmFsMjsKLSAgICAgICAgYWRkcmVzc1QgZGlmZjsKLQotCW5ld3ZhbCAgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICAgIG5ld3ZhbDIgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiArIFRIVU1CX1NJWkUsIFRIVU1CX1NJWkUpOwotICAgICAgICBkaWZmID0gKChuZXd2YWwgJiAweDdmZikgPDwgMTIpIHwgKChuZXd2YWwyICYgMHg3ZmYpIDw8IDEpOwotICAgICAgICBpZiAoZGlmZiAmIDB4NDAwMDAwKQotCSAgZGlmZiB8PSB+MHgzZmZmZmY7Ci0jaWZkZWYgT0JKX0VMRgotCXZhbHVlID0gZml4UC0+Znhfb2Zmc2V0OwotI2VuZGlmCi0gICAgICAgIHZhbHVlICs9IGRpZmY7Ci0gICAgICAgIGlmICgodmFsdWUgJiB+MHgzZmZmZmYpICYmICgodmFsdWUgJiB+MHgzZmZmZmYpICE9IH4weDNmZmZmZikpCi0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJCcmFuY2ggd2l0aCBsaW5rIG91dCBvZiByYW5nZSIpKTsKLQotICAgICAgICBuZXd2YWwgID0gKG5ld3ZhbCAgJiAweGY4MDApIHwgKCh2YWx1ZSAmIDB4N2ZmZmZmKSA+PiAxMik7Ci0gICAgICAgIG5ld3ZhbDIgPSAobmV3dmFsMiAmIDB4ZjgwMCkgfCAoKHZhbHVlICYgMHhmZmYpID4+IDEpOwotICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKLSAgICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYgKyBUSFVNQl9TSVpFLCBuZXd2YWwyLCBUSFVNQl9TSVpFKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICAgIGlmIChmaXhQLT5meF9kb25lIHx8IGZpeFAtPmZ4X3BjcmVsKQotCW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgMSk7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZWxzZSBpZiAoIXRhcmdldF9vYWJpKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAxKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUgfHwgZml4UC0+ZnhfcGNyZWwpCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAyKTsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBlbHNlIGlmICghdGFyZ2V0X29hYmkpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1QzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fR09UT0ZGOgotCW1kX251bWJlcl90b19jaGFycyAoYnVmLCAwLCA0KTsKLQlicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSBCRkRfUkVMT0NfUlZBOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUgfHwgZml4UC0+ZnhfcGNyZWwpCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCA0KTsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBlbHNlIGlmICghdGFyZ2V0X29hYmkpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDQpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QTFQzMjoKLSAgICAgIC8qIEl0IGFwcGVhcnMgdGhlIGluc3RydWN0aW9uIGlzIGZ1bGx5IHByZXBhcmVkIGF0IHRoaXMgcG9pbnQuICovCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0dPVFBDOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCA0KTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU06Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIGlmICh2YWx1ZSA8IC0xMDIzIHx8IHZhbHVlID4gMTAyMyB8fCAodmFsdWUgJiAzKSkKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIklsbGVnYWwgdmFsdWUgZm9yIGNvLXByb2Nlc3NvciBvZmZzZXQiKSk7Ci0gICAgICBpZiAodmFsdWUgPCAwKQotCXZhbHVlID0gLXZhbHVlOwotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSkgJiAweGZmN2ZmZjAwOwotICAgICAgbmV3dmFsIHw9ICh2YWx1ZSA+PiAyKSB8IChzaWduID8gIElOREVYX1VQIDogMCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgSU5TTl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDoKLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKLSAgICAgIC8qIEV4YWN0bHkgd2hhdCByYW5nZXMsIGFuZCB3aGVyZSB0aGUgb2Zmc2V0IGlzIGluc2VydGVkIGRlcGVuZHMgb24KLQkgdGhlIHR5cGUgb2YgaW5zdHJ1Y3Rpb24sIHdlIGNhbiBlc3RhYmxpc2ggdGhpcyBmcm9tIHRoZSB0b3AgNCBiaXRzICovCi0gICAgICBzd2l0Y2ggKG5ld3ZhbCA+PiAxMikKLQl7Ci0JY2FzZSA0OiAvKiBQQyBsb2FkICovCi0JICAvKiBUaHVtYiBQQyBsb2FkcyBhcmUgc29tZXdoYXQgb2RkLCBiaXQgMSBvZiB0aGUgUEMgaXMKLQkgICAgIGZvcmNlZCB0byB6ZXJvIGZvciB0aGVzZSBsb2Fkcywgc28gd2Ugd2lsbCBuZWVkIHRvIHJvdW5kCi0JICAgICB1cCB0aGUgb2Zmc2V0IGlmIHRoZSBpbnN0cnVjdGlvbiBhZGRyZXNzIGlzIG5vdCB3b3JkCi0JICAgICBhbGlnbmVkIChzaW5jZSB0aGUgZmluYWwgYWRkcmVzcyBwcm9kdWNlZCBtdXN0IGJlLCBhbmQKLQkgICAgIHdlIGNhbiBvbmx5IGRlc2NyaWJlIHdvcmQtYWxpZ25lZCBpbW1lZGlhdGUgb2Zmc2V0cykuICAqLwotCi0JICBpZiAoKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSArIHZhbHVlKSAmIDMpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiSW52YWxpZCBvZmZzZXQsIHRhcmdldCBub3Qgd29yZCBhbGlnbmVkICgweCUwOFgpIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSArIHZhbHVlKSk7Ci0KLQkgIGlmICgodmFsdWUgKyAyKSAmIH4weDNmZSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIG9mZnNldCwgdmFsdWUgdG9vIGJpZyAoMHglMDhYKSIpLCB2YWx1ZSk7Ci0KLSAgICAgICAgICAvKiBSb3VuZCB1cCwgc2luY2UgcGMgd2lsbCBiZSByb3VuZGVkIGRvd24uICAqLwotCSAgbmV3dmFsIHw9ICh2YWx1ZSArIDIpID4+IDI7Ci0JICBicmVhazsKLQotCWNhc2UgOTogLyogU1AgbG9hZC9zdG9yZSAqLwotCSAgaWYgKHZhbHVlICYgfjB4M2ZjKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIkludmFsaWQgb2Zmc2V0LCB2YWx1ZSB0b28gYmlnICgweCUwOFgpIiksIHZhbHVlKTsKLQkgIG5ld3ZhbCB8PSB2YWx1ZSA+PiAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIDY6IC8qIFdvcmQgbG9hZC9zdG9yZSAqLwotCSAgaWYgKHZhbHVlICYgfjB4N2MpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiSW52YWxpZCBvZmZzZXQsIHZhbHVlIHRvbyBiaWcgKDB4JTA4WCkiKSwgdmFsdWUpOwotCSAgbmV3dmFsIHw9IHZhbHVlIDw8IDQ7IC8qIDYgLSAyICovCi0JICBicmVhazsKLQotCWNhc2UgNzogLyogQnl0ZSBsb2FkL3N0b3JlICovCi0JICBpZiAodmFsdWUgJiB+MHgxZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIG9mZnNldCwgdmFsdWUgdG9vIGJpZyAoMHglMDhYKSIpLCB2YWx1ZSk7Ci0JICBuZXd2YWwgfD0gdmFsdWUgPDwgNjsKLQkgIGJyZWFrOwotCi0JY2FzZSA4OiAvKiBIYWxmd29yZCBsb2FkL3N0b3JlICovCi0JICBpZiAodmFsdWUgJiB+MHgzZSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIG9mZnNldCwgdmFsdWUgdG9vIGJpZyAoMHglMDhYKSIpLCB2YWx1ZSk7Ci0JICBuZXd2YWwgfD0gdmFsdWUgPDwgNTsgLyogNiAtIDEgKi8KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSJVbmFibGUgdG8gcHJvY2VzcyByZWxvY2F0aW9uIGZvciB0aHVtYiBvcGNvZGU6ICVseCIsCi0JCQkodW5zaWduZWQgbG9uZykgbmV3dmFsKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIFRIVU1CX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfQUREOgotICAgICAgLyogVGhpcyBpcyBhIGNvbXBsaWNhdGVkIHJlbG9jYXRpb24sIHNpbmNlIHdlIHVzZSBpdCBmb3IgYWxsIG9mCi0gICAgICAgICB0aGUgZm9sbG93aW5nIGltbWVkaWF0ZSByZWxvY2F0aW9uczoKLSAgICAgICAgICAgIDNiaXQgQUREL1NVQgotICAgICAgICAgICAgOGJpdCBBREQvU1VCCi0gICAgICAgICAgICA5Yml0IEFERC9TVUIgU1Agd29yZC1hbGlnbmVkCi0gICAgICAgICAgIDEwYml0IEFERCBQQy9TUCB3b3JkLWFsaWduZWQKLQotICAgICAgICAgVGhlIHR5cGUgb2YgaW5zdHJ1Y3Rpb24gYmVpbmcgcHJvY2Vzc2VkIGlzIGVuY29kZWQgaW4gdGhlCi0gICAgICAgICBpbnN0cnVjdGlvbiBmaWVsZDoKLSAgICAgICAgICAgMHg4MDAwICBTVUIKLSAgICAgICAgICAgMHgwMEYwICBSZAotICAgICAgICAgICAweDAwMEYgIFJzCi0gICAgICAqLwotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpOwotICAgICAgewotICAgICAgICBpbnQgcmQgPSAobmV3dmFsID4+IDQpICYgMHhmOwotICAgICAgICBpbnQgcnMgPSBuZXd2YWwgJiAweGY7Ci0gICAgICAgIGludCBzdWJ0cmFjdCA9IG5ld3ZhbCAmIDB4ODAwMDsKLQotICAgICAgICBpZiAocmQgPT0gUkVHX1NQKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAmIH4weDFmYykKLSAgICAgICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkludmFsaWQgaW1tZWRpYXRlIGZvciBzdGFjayBhZGRyZXNzIGNhbGN1bGF0aW9uIikpOwotICAgICAgICAgICAgbmV3dmFsID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfU1QgOiBUX09QQ09ERV9BRERfU1Q7Ci0gICAgICAgICAgICBuZXd2YWwgfD0gdmFsdWUgPj4gMjsKLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHJzID09IFJFR19QQyB8fCBycyA9PSBSRUdfU1ApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHN1YnRyYWN0IHx8Ci0gICAgICAgICAgICAgICAgdmFsdWUgJiB+MHgzZmMpCi0gICAgICAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJJbnZhbGlkIGltbWVkaWF0ZSBmb3IgYWRkcmVzcyBjYWxjdWxhdGlvbiAodmFsdWUgPSAweCUwOGxYKSIpLAotCQkJICAgICh1bnNpZ25lZCBsb25nKSB2YWx1ZSk7Ci0gICAgICAgICAgICBuZXd2YWwgPSAocnMgPT0gUkVHX1BDID8gVF9PUENPREVfQUREX1BDIDogVF9PUENPREVfQUREX1NQKTsKLSAgICAgICAgICAgIG5ld3ZhbCB8PSByZCA8PCA4OwotICAgICAgICAgICAgbmV3dmFsIHw9IHZhbHVlID4+IDI7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChycyA9PSByZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgJiB+MHhmZikKLSAgICAgICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkludmFsaWQgOGJpdCBpbW1lZGlhdGUiKSk7Ci0gICAgICAgICAgICBuZXd2YWwgPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9JOCA6IFRfT1BDT0RFX0FERF9JODsKLSAgICAgICAgICAgIG5ld3ZhbCB8PSAocmQgPDwgOCkgfCB2YWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgJiB+MHg3KQotICAgICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiSW52YWxpZCAzYml0IGltbWVkaWF0ZSIpKTsKLSAgICAgICAgICAgIG5ld3ZhbCA9IHN1YnRyYWN0ID8gVF9PUENPREVfU1VCX0kzIDogVF9PUENPREVfQUREX0kzOwotICAgICAgICAgICAgbmV3dmFsIHw9IHJkIHwgKHJzIDw8IDMpIHwgKHZhbHVlIDw8IDYpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwgLCBUSFVNQl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTToKLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKLSAgICAgIHN3aXRjaCAobmV3dmFsID4+IDExKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgMHgwNDogLyogOGJpdCBpbW1lZGlhdGUgTU9WICovCi0gICAgICAgIGNhc2UgMHgwNTogLyogOGJpdCBpbW1lZGlhdGUgQ01QICovCi0gICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDI1NSkKLSAgICAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgXygiSW52YWxpZCBpbW1lZGlhdGU6ICVsZCBpcyB0b28gbGFyZ2UiKSwKLQkJCSAgKGxvbmcpIHZhbHVlKTsKLSAgICAgICAgICBuZXd2YWwgfD0gdmFsdWU7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBhYm9ydCAoKTsKLSAgICAgICAgfQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCAsIFRIVU1CX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQ6Ci0gICAgICAvKiA1Yml0IHNoaWZ0IHZhbHVlICgwLi4zMSkgKi8KLSAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAzMSkKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIklsbGVnYWwgVGh1bWIgc2hpZnQgdmFsdWU6ICVsZCIpLCAobG9uZykgdmFsdWUpOwotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpICYgMHhmMDNmOwotICAgICAgbmV3dmFsIHw9IHZhbHVlIDw8IDY7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgVEhVTUJfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICBfKCJCYWQgcmVsb2NhdGlvbiBmaXh1cCB0eXBlICglZCkiKSwgZml4UC0+Znhfcl90eXBlKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAgKi8KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gICAgIGZpeFMgKiBmaXhwOwotewotICBhcmVsZW50ICogcmVsb2M7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICAvKiBAQCBXaHkgZnhfYWRkbnVtYmVyIHNvbWV0aW1lcyBhbmQgZnhfb2Zmc2V0IG90aGVyIHRpbWVzPyAgKi8KLSNpZm5kZWYgT0JKX0VMRgotICBpZiAoZml4cC0+ZnhfcGNyZWwgPT0gMCkKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICBlbHNlCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldCA9IHJlbG9jLT5hZGRyZXNzOwotI2Vsc2UgIC8qIE9CSl9FTEYgKi8KLSAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSNlbmRpZgotCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXsKLQkgIGNvZGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgIGJyZWFrOwotCX0KLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXsKLQkgIGNvZGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JICBicmVhazsKLQl9Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLQl7Ci0JICBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSDoKLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6ICAgICAgCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOToKLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMzoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fTElURVJBTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMOgotICAgICAgLyogSWYgdGhpcyBpcyBjYWxsZWQgdGhlbiB0aGUgYSBsaXRlcmFsIGhhcyBiZWVuIHJlZmVyZW5jZWQgYWNyb3NzCi0JIGEgc2VjdGlvbiBib3VuZGFyeSAtIHBvc3NpYmx5IGR1ZSB0byBhbiBpbXBsaWNpdCBkdW1wICovCi0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJMaXRlcmFsIHJlZmVyZW5jZWQgYWNyb3NzIHNlY3Rpb24gYm91bmRhcnkgKEltcGxpY2l0IGR1bXA/KSIpKTsKLSAgICAgIHJldHVybiBOVUxMOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1QzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fR09UT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QTFQzMjoKLSAgICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOgotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiSW50ZXJuYWxfcmVsb2NhdGlvbiAodHlwZSAlZCkgbm90IGZpeGVkIHVwIChJTU1FRElBVEUpIiksCi0JCSAgICBmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fQURSTF9JTU1FRElBVEU6Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJBRFJMIHVzZWQgZm9yIGEgc3ltYm9sIG5vdCBkZWZpbmVkIGluIHRoZSBzYW1lIGZpbGUiKSwKLQkJICAgIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOgotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiSW50ZXJuYWxfcmVsb2NhdGlvbiAodHlwZSAlZCkgbm90IGZpeGVkIHVwIChPRkZTRVRfSU1NKSIpLAotCQkgICAgZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQljaGFyICogdHlwZTsKLQlzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLQkgIHsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU6ICAgIHR5cGUgPSAiSU1NRURJQVRFIjsgICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTogICB0eXBlID0gIk9GRlNFVF9JTU0iOyAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04OiAgdHlwZSA9ICJPRkZTRVRfSU1NOCI7ICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9TSElGVF9JTU06ICAgIHR5cGUgPSAiU0hJRlRfSU1NIjsgICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fU1dJOiAgICAgICAgICB0eXBlID0gIlNXSSI7ICAgICAgICAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX01VTFRJOiAgICAgICAgdHlwZSA9ICJNVUxUSSI7ICAgICAgICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NOiAgIHR5cGUgPSAiQ1BfT0ZGX0lNTSI7ICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfQUREOiAgICB0eXBlID0gIlRIVU1CX0FERCI7ICAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUOiAgdHlwZSA9ICJUSFVNQl9TSElGVCI7ICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9JTU06ICAgIHR5cGUgPSAiVEhVTUJfSU1NIjsgICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUOiB0eXBlID0gIlRIVU1CX09GRlNFVCI7IGJyZWFrOwotCSAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IF8oIjx1bmtub3duPiIpOyBicmVhazsKLQkgIH0KLQlhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIkNhbiBub3QgcmVwcmVzZW50ICVzIHJlbG9jYXRpb24gaW4gdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQgKCVkKSIpLAotCQkgICAgICB0eXBlLCBmaXhwLT5meF9wY3JlbCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgfQotCi0jaWZkZWYgT0JKX0VMRgotIGlmIChjb2RlID09IEJGRF9SRUxPQ18zMl9QQ1JFTAotICAgICAmJiBHT1Rfc3ltYm9sCi0gICAgICYmIGZpeHAtPmZ4X2FkZHN5ID09IEdPVF9zeW1ib2wpCi0gICB7Ci0gICAgIGNvZGUgPSBCRkRfUkVMT0NfQVJNX0dPVFBDOwotICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0ID0gcmVsb2MtPmFkZHJlc3M7Ci0gICB9Ci0jZW5kaWYKLSAgIAotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0KLSAgaWYgKHJlbG9jLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkNhbiBub3QgcmVwcmVzZW50ICVzIHJlbG9jYXRpb24gaW4gdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkJICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgIC8qIEhBQ0s6IFNpbmNlIGFybSBFTEYgdXNlcyBSZWwgaW5zdGVhZCBvZiBSZWxhLCBlbmNvZGUgdGhlCi0gICAgICB2dGFibGUgZW50cnkgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbidzIHNlY3Rpb24gb2Zmc2V0LiAgKi8KLSAgIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VndHlwZSkKLSAgICAgZnJhZ1MgKiBmcmFnUDsKLSAgICAgc2VnVCAgICBzZWd0eXBlOwotewotICBhc19mYXRhbCAoXygibWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXhcbiIpKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vdXRwdXRfaW5zdCBQQVJBTVMgKCh2b2lkKSkKLXsKLSAgY2hhciAqIHRvID0gTlVMTDsKLSAgICAKLSAgaWYgKGluc3QuZXJyb3IpCi0gICAgewotICAgICAgYXNfYmFkIChpbnN0LmVycm9yKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdG8gPSBmcmFnX21vcmUgKGluc3Quc2l6ZSk7Ci0gIAotICBpZiAodGh1bWJfbW9kZSAmJiAoaW5zdC5zaXplID4gVEhVTUJfU0laRSkpCi0gICAgewotICAgICAgYXNzZXJ0IChpbnN0LnNpemUgPT0gKDIgKiBUSFVNQl9TSVpFKSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvLCBpbnN0Lmluc3RydWN0aW9uID4+IDE2LCBUSFVNQl9TSVpFKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAodG8gKyBUSFVNQl9TSVpFLCBpbnN0Lmluc3RydWN0aW9uLCBUSFVNQl9TSVpFKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGluc3Quc2l6ZSA+IElOU05fU0laRSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGluc3Quc2l6ZSA9PSAoMiAqIElOU05fU0laRSkpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh0bywgaW5zdC5pbnN0cnVjdGlvbiwgSU5TTl9TSVpFKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAodG8gKyBJTlNOX1NJWkUsIGluc3QuaW5zdHJ1Y3Rpb24sIElOU05fU0laRSk7Ci0gICAgfQotICBlbHNlCi0gICAgbWRfbnVtYmVyX3RvX2NoYXJzICh0bywgaW5zdC5pbnN0cnVjdGlvbiwgaW5zdC5zaXplKTsKLQotICBpZiAoaW5zdC5yZWxvYy50eXBlICE9IEJGRF9SRUxPQ19OT05FKQotICAgIGZpeF9uZXdfYXJtIChmcmFnX25vdywgdG8gLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJIGluc3Quc2l6ZSwgJiBpbnN0LnJlbG9jLmV4cCwgaW5zdC5yZWxvYy5wY19yZWwsCi0JCSBpbnN0LnJlbG9jLnR5cGUpOwotCi0gIHJldHVybjsKLX0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgY2hhciAgIGM7Ci0gIGNoYXIgKiBwOwotICBjaGFyICogcTsKLSAgY2hhciAqIHN0YXJ0OwotCi0gIC8qIEFsaWduIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgVGhpcyBtYXkgbm90IGJlIHRoZSByaWdodCB0aGluZyB0byBkbyBidXQgLi4uICovCi0gIC8qIGFybV9hbGlnbiAoMiwgMCk7ICovCi0gIGxpc3RpbmdfcHJldl9saW5lICgpOyAvKiBEZWZpbmVkIGluIGxpc3RpbmcuaCAqLwotCi0gIC8qIEFsaWduIHRoZSBwcmV2aW91cyBsYWJlbCBpZiBuZWVkZWQuICAqLwotICBpZiAobGFzdF9sYWJlbF9zZWVuICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sX3NldF9mcmFnIChsYXN0X2xhYmVsX3NlZW4sIGZyYWdfbm93KTsKLSAgICAgIFNfU0VUX1ZBTFVFIChsYXN0X2xhYmVsX3NlZW4sICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChsYXN0X2xhYmVsX3NlZW4sIG5vd19zZWcpOwotICAgIH0KLQotICBtZW1zZXQgKCZpbnN0LCAnXDAnLCBzaXplb2YgKGluc3QpKTsKLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX05PTkU7Ci0KLSAgc2tpcF93aGl0ZXNwYWNlIChzdHIpOwotICAKLSAgLyogU2NhbiB1cCB0byB0aGUgZW5kIG9mIHRoZSBvcC1jb2RlLCB3aGljaCBtdXN0IGVuZCBpbiB3aGl0ZSBzcGFjZSBvcgotICAgICBlbmQgb2Ygc3RyaW5nLiAgKi8KLSAgZm9yIChzdGFydCA9IHAgPSBzdHI7ICpwICE9ICdcMCc7IHArKykKLSAgICBpZiAoKnAgPT0gJyAnKQotICAgICAgYnJlYWs7Ci0gICAgCi0gIGlmIChwID09IHN0cikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk5vIG9wZXJhdG9yIC0tIHN0YXRlbWVudCBgJXMnXG4iKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHRodW1iX21vZGUpCi0gICAgewotICAgICAgQ09OU1Qgc3RydWN0IHRodW1iX29wY29kZSAqIG9wY29kZTsKLQotICAgICAgYyA9ICpwOwotICAgICAgKnAgPSAnXDAnOwotICAgICAgb3Bjb2RlID0gKENPTlNUIHN0cnVjdCB0aHVtYl9vcGNvZGUgKikgaGFzaF9maW5kIChhcm1fdG9wc19oc2gsIHN0cik7Ci0gICAgICAqcCA9IGM7Ci0gICAgICAKLSAgICAgIGlmIChvcGNvZGUpCi0JewotCSAgLyogQ2hlY2sgdGhhdCB0aGlzIGluc3RydWN0aW9uIGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBDUFUuICAqLwotCSAgaWYgKHRodW1iX21vZGUgPT0gMSAmJiAob3Bjb2RlLT52YXJpYW50cyAmIGNwdV92YXJpYW50KSA9PSAwKQotCSAgICAgewotCSAgICAJYXNfYmFkIChfKCJzZWxlY3RlZCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wY29kZSIpKTsKLQkJcmV0dXJuOwotCSAgICAgfQotCi0JICBpbnN0Lmluc3RydWN0aW9uID0gb3Bjb2RlLT52YWx1ZTsKLQkgIGluc3Quc2l6ZSA9IG9wY29kZS0+c2l6ZTsKLQkgICgqb3Bjb2RlLT5wYXJtcykocCk7Ci0JICBvdXRwdXRfaW5zdCAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQ09OU1Qgc3RydWN0IGFzbV9vcGNvZGUgKiBvcGNvZGU7Ci0gICAgICB1bnNpZ25lZCBsb25nIGNvbmRfY29kZTsKLQotICAgICAgaW5zdC5zaXplID0gSU5TTl9TSVpFOwotICAgICAgLyogcCBub3cgcG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIG9wY29kZSwgcHJvYmFibHkgd2hpdGUgc3BhY2UsIGJ1dCB3ZQotCSBoYXZlIHRvIGJyZWFrIHRoZSBvcGNvZGUgdXAgaW4gY2FzZSBpdCBjb250YWlucyBjb25kaW9uYWxzIGFuZCBmbGFnczsKLQkga2VlcCB0cnlpbmcgd2l0aCBwcm9ncmVzc2l2ZWx5IHNtYWxsZXIgYmFzaWMgaW5zdHJ1Y3Rpb25zIHVudGlsIG9uZQotCSBtYXRjaGVzLCBvciB3ZSBydW4gb3V0IG9mIG9wY29kZS4gICovCi0gICAgICBxID0gKHAgLSBzdHIgPiBMT05HRVNUX0lOU1QpID8gc3RyICsgTE9OR0VTVF9JTlNUIDogcDsKLSAgICAgIGZvciAoOyBxICE9IHN0cjsgcS0tKQotCXsKLQkgIGMgPSAqcTsKLQkgICpxID0gJ1wwJzsKLQkgIG9wY29kZSA9IChDT05TVCBzdHJ1Y3QgYXNtX29wY29kZSAqKSBoYXNoX2ZpbmQgKGFybV9vcHNfaHNoLCBzdHIpOwotCSAgKnEgPSBjOwotCSAgCi0JICBpZiAob3Bjb2RlICYmIG9wY29kZS0+dGVtcGxhdGUpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdfYml0cyA9IDA7Ci0JICAgICAgY2hhciAqIHI7Ci0KLQkgICAgICAvKiBDaGVjayB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9ydGVkIGZvciB0aGlzIENQVS4gICovCi0JICAgICAgaWYgKChvcGNvZGUtPnZhcmlhbnRzICYgY3B1X3ZhcmlhbnQpID09IDApCi0JCWdvdG8gdHJ5X3Nob3J0ZXI7Ci0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gb3Bjb2RlLT52YWx1ZTsKLQkgICAgICBpZiAocSA9PSBwKQkJLyogSnVzdCBhIHNpbXBsZSBvcGNvZGUuICAqLwotCQl7Ci0JCSAgaWYgKG9wY29kZS0+Y29tcF9zdWZmaXgpCi0JCSAgICB7Ci0JCSAgICAgICBpZiAoKm9wY29kZS0+Y29tcF9zdWZmaXggIT0gJ1wwJykKLQkJICAgIAkgYXNfYmFkIChfKCJPcGNvZGUgYCVzJyBtdXN0IGhhdmUgc3VmZml4IGZyb20gPCVzPlxuIiksCi0JCQkgICAgIHN0ciwgb3Bjb2RlLT5jb21wX3N1ZmZpeCk7Ci0JCSAgICAgICBlbHNlCi0JCQkgLyogTm90IGEgY29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb24uICovCi0JCSAgICAgICAgICgqb3Bjb2RlLT5wYXJtcykocSwgMCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBBIGNvbmRpdGlvbmFsIGluc3RydWN0aW9uIHdpdGggZGVmYXVsdCBjb25kaXRpb24uICovCi0JCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ09ORF9BTFdBWVM7Ci0JCSAgICAgICgqb3Bjb2RlLT5wYXJtcykocSwgMCk7Ci0JCSAgICB9Ci0JCSAgb3V0cHV0X2luc3QgKCk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICAvKiBOb3QganVzdCBhIHNpbXBsZSBvcGNvZGUuICBDaGVjayBpZiBleHRyYSBpcyBhIGNvbmRpdGlvbmFsLiAqLwotCSAgICAgIHIgPSBxOwotCSAgICAgIGlmIChwIC0gciA+PSAyKQotCQl7Ci0JCSAgQ09OU1Qgc3RydWN0IGFzbV9jb25kICpjb25kOwotCQkgIGNoYXIgZCA9ICoociArIDIpOwotCi0JCSAgKihyICsgMikgPSAnXDAnOwotCQkgIGNvbmQgPSAoQ09OU1Qgc3RydWN0IGFzbV9jb25kICopIGhhc2hfZmluZCAoYXJtX2NvbmRfaHNoLCByKTsKLQkJICAqKHIgKyAyKSA9IGQ7Ci0JCSAgaWYgKGNvbmQpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjb25kLT52YWx1ZSA9PSAweGYwMDAwMDAwKQotCQkJYXNfdHNrdHNrICgKLV8oIldhcm5pbmc6IFVzZSBvZiB0aGUgJ252JyBjb25kaXRpb25hbCBpcyBkZXByZWNhdGVkXG4iKSk7Ci0KLQkJICAgICAgY29uZF9jb2RlID0gY29uZC0+dmFsdWU7Ci0JCSAgICAgIHIgKz0gMjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBjb25kX2NvZGUgPSBDT05EX0FMV0FZUzsKLQkJfQotCSAgICAgIGVsc2UKLQkJY29uZF9jb2RlID0gQ09ORF9BTFdBWVM7Ci0KLQotCSAgICAgIC8qIEFwcGx5IHRoZSBjb25kaXRpb25hbCwgb3IgY29tcGxhaW4gaXQncyBub3QgYWxsb3dlZC4gKi8KLQkgICAgICBpZiAob3Bjb2RlLT5jb21wX3N1ZmZpeCAmJiAqb3Bjb2RlLT5jb21wX3N1ZmZpeCA9PSAnXDAnKQotCQl7Ci0JCSAgIC8qIEluc3RydWN0aW9uIGlzbid0IGNvbmRpdGlvbmFsICovCi0JCSAgIGlmIChjb25kX2NvZGUgIT0gQ09ORF9BTFdBWVMpCi0JCSAgICAgewotCQkgICAgICAgYXNfYmFkIChfKCJPcGNvZGUgYCVzJyBpcyB1bmNvbmRpdGlvbmFsXG4iKSwgc3RyKTsKLQkJICAgICAgIHJldHVybjsKLQkJICAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCS8qIEluc3RydWN0aW9uIGlzIGNvbmRpdGlvbmFsOiBzZXQgdGhlIGNvbmRpdGlvbiBpbnRvIGl0LiAqLwotCQlpbnN0Lmluc3RydWN0aW9uIHw9IGNvbmRfY29kZTsJICAgICAKLQotCi0JICAgICAgLyogSWYgdGhlcmUgaXMgYSBjb21wdWxzb3J5IHN1ZmZpeCwgaXQgc2hvdWxkIGNvbWUgaGVyZSwgYmVmb3JlCi0JCSBhbnkgb3B0aW9uYWwgZmxhZ3MuICAqLwotCSAgICAgIGlmIChvcGNvZGUtPmNvbXBfc3VmZml4ICYmICpvcGNvZGUtPmNvbXBfc3VmZml4ICE9ICdcMCcpCi0JCXsKLQkJICBDT05TVCBjaGFyICpzID0gb3Bjb2RlLT5jb21wX3N1ZmZpeDsKLQotCQkgIHdoaWxlICgqcykKLQkJICAgIHsKLQkJICAgICAgaW5zdC5zdWZmaXgrKzsKLQkJICAgICAgaWYgKCpyID09ICpzKQotCQkJYnJlYWs7Ci0JCSAgICAgIHMrKzsKLQkJICAgIH0KLQotCQkgIGlmICgqcyA9PSAnXDAnKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIk9wY29kZSBgJXMnIG11c3QgaGF2ZSBzdWZmaXggZnJvbSA8JXM+XG4iKSwgc3RyLAotCQkJICAgICAgb3Bjb2RlLT5jb21wX3N1ZmZpeCk7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQotCQkgIHIrKzsKLQkJfQotCi0JICAgICAgLyogVGhlIHJlbWFpbmRlciwgaWYgYW55IHNob3VsZCBub3cgYmUgZmxhZ3MgZm9yIHRoZSBpbnN0cnVjdGlvbjsKLQkJIFNjYW4gdGhlc2UgY2hlY2tpbmcgZWFjaCBvbmUgZm91bmQgd2l0aCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBpZiAociAhPSBwKQotCQl7Ci0JCSAgY2hhciBkOwotCQkgIENPTlNUIHN0cnVjdCBhc21fZmxnICpmbGFnID0gb3Bjb2RlLT5mbGFnczsKLQotCQkgIGlmIChmbGFnKQotCQkgICAgewotCQkgICAgICBpbnQgZmxhZ25vOwotCi0JCSAgICAgIGQgPSAqcDsKLQkJICAgICAgKnAgPSAnXDAnOwotCi0JCSAgICAgIGZvciAoZmxhZ25vID0gMDsgZmxhZ1tmbGFnbm9dLnRlbXBsYXRlOyBmbGFnbm8rKykKLQkJCXsKLQkJCSAgaWYgKHN0cmVxIChyLCBmbGFnW2ZsYWdub10udGVtcGxhdGUpKQotCQkJICAgIHsKLQkJCSAgICAgIGZsYWdfYml0cyB8PSBmbGFnW2ZsYWdub10uc2V0X2JpdHM7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgKnAgPSBkOwotCQkgICAgICBpZiAoISBmbGFnW2ZsYWdub10udGVtcGxhdGUpCi0JCQlnb3RvIHRyeV9zaG9ydGVyOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGdvdG8gdHJ5X3Nob3J0ZXI7Ci0JCX0KLQotCSAgICAgICgqb3Bjb2RlLT5wYXJtcykgKHAsIGZsYWdfYml0cyk7Ci0JICAgICAgb3V0cHV0X2luc3QgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQl0cnlfc2hvcnRlcjoKLQkgIDsKLQl9Ci0gICAgfQotCi0gIC8qIEl0IHdhc24ndCBhbiBpbnN0cnVjdGlvbiwgYnV0IGl0IG1pZ2h0IGJlIGEgcmVnaXN0ZXIgYWxpYXMgb2YgdGhlIGZvcm0KLSAgICAgYWxpYXMgLnJlcSByZWcgKi8KLSAgcSA9IHA7Ci0gIHNraXBfd2hpdGVzcGFjZSAocSk7Ci0KLSAgYyA9ICpwOwotICAqcCA9ICdcMCc7Ci0gICAgCi0gIGlmICgqcSAmJiAhc3RybmNtcCAocSwgIi5yZXEgIiwgNCkpCi0gICAgewotICAgICAgaW50ICAgIHJlZzsKLSAgICAgIGNoYXIgKiBjb3B5X29mX3N0ciA9IHN0cjsKLSAgICAgIGNoYXIgKiByOwotICAgICAgCi0gICAgICBxICs9IDQ7Ci0gICAgICBza2lwX3doaXRlc3BhY2UgKHEpOwotCi0gICAgICBmb3IgKHIgPSBxOyAqciAhPSAnXDAnOyByKyspCi0JaWYgKCpyID09ICcgJykKLQkgIGJyZWFrOwotICAgICAgCi0gICAgICBpZiAociAhPSBxKQotCXsKLQkgIGludCByZWdudW07Ci0JICBjaGFyIGQgPSAqcjsKLQotCSAgKnIgPSAnXDAnOwotCSAgcmVnbnVtID0gYXJtX3JlZ19wYXJzZSAoJiBxKTsKLQkgICpyID0gZDsKLQotCSAgcmVnID0gYXJtX3JlZ19wYXJzZSAoJiBzdHIpOwotCSAgCi0JICBpZiAocmVnID09IEZBSUwpCi0JICAgIHsKLQkgICAgICBpZiAocmVnbnVtICE9IEZBSUwpCi0JCWluc2VydF9yZWdfYWxpYXMgKHN0ciwgcmVnbnVtKTsKLQkgICAgICBlbHNlCi0JCWFzX3dhcm4gKF8oInJlZ2lzdGVyICclcycgZG9lcyBub3QgZXhpc3RcbiIpLCBxKTsKLQkgICAgfQotCSAgZWxzZSBpZiAocmVnbnVtICE9IEZBSUwpCi0JICAgIHsKLQkgICAgICBpZiAocmVnICE9IHJlZ251bSkKLQkJYXNfd2FybiAoXygiaWdub3JpbmcgcmVkZWZpbml0aW9uIG9mIHJlZ2lzdGVyIGFsaWFzICclcyciKSwgY29weV9vZl9zdHIgKTsKLQkgICAgICAKLQkgICAgICAvKiBEbyBub3Qgd2FybiBhYm91dCByZWRlZmluaXRpb25zIHRvIHRoZSBzYW1lIGFsaWFzLiAgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICBhc193YXJuIChfKCJpZ25vcmluZyByZWRlZmluaXRpb24gb2YgcmVnaXN0ZXIgYWxpYXMgJyVzJyB0byBub24tZXhpc3RhbnQgcmVnaXN0ZXIgJyVzJyIpLAotCQkgICAgIGNvcHlfb2Zfc3RyLCBxKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfd2FybiAoXygiaWdub3JpbmcgaW5jb21wbGV0ZSAucmVxIHBzZXVzbyBvcCIpKTsKLSAgICAgIAotICAgICAgKnAgPSBjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqcCA9IGM7Ci0gIGFzX2JhZCAoXygiYmFkIGluc3RydWN0aW9uIGAlcyciKSwgc3RhcnQpOwotfQotCi0vKgotICogbWRfcGFyc2Vfb3B0aW9uCi0gKiAgICBJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICogICAgU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLiAgVGhlc2UgYXJlOgotICogICAgQ3B1IHZhcmlhbnRzLCB0aGUgYXJtIHBhcnQgaXMgb3B0aW9uYWw6Ci0gKiAgICAgICAgICAgIC1tW2FybV0xICAgICAgICAgICAgICAgIEN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgotICogICAgICAgICAgICAtbVthcm1dMiwgLW1bYXJtXTI1MCAgICBBcm0gMiBhbmQgQXJtIDI1MCBwcm9jZXNzb3IKLSAqICAgICAgICAgICAgLW1bYXJtXTMgICAgICAgICAgICAgICAgQXJtIDMgcHJvY2Vzc29yCi0gKiAgICAgICAgICAgIC1tW2FybV02W3h4XSwgICAgICAgICAgIEFybSA2IHByb2Nlc3NvcnMKLSAqICAgICAgICAgICAgLW1bYXJtXTdbeHhdW3RdW1tkXW1dICAgQXJtIDcgcHJvY2Vzc29ycwotICogICAgICAgICAgICAtbVthcm1dOFsxMF0gICAgICAgICAgICBBcm0gOCBwcm9jZXNzb3JzCi0gKiAgICAgICAgICAgIC1tW2FybV05WzIwXVt0ZG1pXSAgICAgIEFybSA5IHByb2Nlc3NvcnMKLSAqICAgICAgICAgICAgLW1zdHJvbmdhcm1bMTEwWzBdXSAgICAgU3Ryb25nQVJNIHByb2Nlc3NvcnMKLSAqICAgICAgICAgICAgLW1bYXJtXXZbMjM0NV0JICAgICAgQXJtIGFyY2hpdGVjdHVyZXMKLSAqICAgICAgICAgICAgLW1hbGwgICAgICAgICAgICAgICAgICAgQWxsIChleGNlcHQgdGhlIEFSTTEpCi0gKiAgICBGUCB2YXJpYW50czoKLSAqICAgICAgICAgICAgLW1mcGExMCwgLW1mcGExMSAgICAgICAgRlBBMTAgYW5kIDExIGNvLXByb2Nlc3NvciBpbnN0cnVjdGlvbnMKLSAqICAgICAgICAgICAgLW1mcGUtb2xkICAgICAgICAgICAgICAgKE5vIGZsb2F0IGxvYWQvc3RvcmUgbXVsdGlwbGVzKQotICogICAgICAgICAgICAtbW5vLWZwdSAgICAgICAgICAgICAgICBEaXNhYmxlIGFsbCBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMKLSAqICAgIFJ1bi10aW1lIGVuZGlhbiBzZWxlY3Rpb246Ci0gKiAgICAgICAgICAgIC1FQiAgICAgICAgICAgICAgICAgICAgIGJpZyBlbmRpYW4gY3B1Ci0gKiAgICAgICAgICAgIC1FTCAgICAgICAgICAgICAgICAgICAgIGxpdHRsZSBlbmRpYW4gY3B1Ci0gKiAgICBBUk0gUHJvY2VkdXJlIENhbGxpbmcgU3RhbmRhcmQ6Ci0gKgkgICAgICAtbWFwY3MtMzIJCSAgICAgIDMyIGJpdCBBUENTCi0gKgkgICAgICAtbWFwY3MtMjYJCSAgICAgIDI2IGJpdCBBUENTCi0gKgkgICAgICAtbWFwY3MtZmxvYXQJICAgICAgUGFzcyBmbG9hdHMgaW4gZmxvYXQgcmVncwotICoJICAgICAgLW1hcGNzLXJlZW50cmFudCAgICAgICAgUG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZQotICogICAgICAgICAgICAtbXRodW1iLWludGVyd29yayAgICAgICBDb2RlIHN1cHBvcnRzIEFybS9UaHVtYiBpbnRlcndvcmtpbmcKLSAqICAgICAgICAgICAgLW1vYWJpICAgICAgICAgICAgICAgICAgT2xkIEVMRiBBQkkKLSAqLwotCi1DT05TVCBjaGFyICogbWRfc2hvcnRvcHRzID0gIm06ayI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotI2lmZGVmIEFSTV9CSV9FTkRJQU4KLSNkZWZpbmUgT1BUSU9OX0VCIChPUFRJT05fTURfQkFTRSArIDApCi0gIHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VCfSwKLSNkZWZpbmUgT1BUSU9OX0VMIChPUFRJT05fTURfQkFTRSArIDEpCi0gIHsiRUwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VMfSwKLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIE9QVElPTl9PQUJJIChPUFRJT05fTURfQkFTRSArMikKLSAgeyJvYWJpIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PQUJJfSwKLSNlbmRpZgotI2VuZGlmCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgICAgYzsKLSAgICAgY2hhciAqIGFyZzsKLXsKLSAgY2hhciAqIHN0ciA9IGFyZzsKLQotICBzd2l0Y2ggKGMpCi0gICAgewotI2lmZGVmIEFSTV9CSV9FTkRJQU4KLSAgICBjYXNlIE9QVElPTl9FQjoKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0VMOgotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgJ20nOgotICAgICAgc3dpdGNoICgqc3RyKQotCXsKLQljYXNlICdmJzoKLQkgIGlmIChzdHJlcSAoc3RyLCAiZnBhMTAiKSkKLQkgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+RlBVX0FMTCkgfCBGUFVfRlBBMTA7Ci0JICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiZnBhMTEiKSkKLQkgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+RlBVX0FMTCkgfCBGUFVfRlBBMTE7Ci0JICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiZnBlLW9sZCIpKQotCSAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5GUFVfQUxMKSB8IEZQVV9DT1JFOwotCSAgZWxzZQotCSAgICBnb3RvIGJhZDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnbic6Ci0JICBpZiAoc3RyZXEgKHN0ciwgIm5vLWZwdSIpKQotCSAgICBjcHVfdmFyaWFudCAmPSB+RlBVX0FMTDsKLQkgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgICAgICBjYXNlICdvJzoKLSAgICAgICAgICBpZiAoc3RyZXEgKHN0ciwgIm9hYmkiKSkKLSAgICAgICAgICAgIHRhcmdldF9vYWJpID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSNlbmRpZgotCSAgCi0gICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgIC8qIExpbWl0IGFzc2VtYmxlciB0byBnZW5lcmF0aW5nIG9ubHkgVGh1bWIgaW5zdHJ1Y3Rpb25zOiAqLwotICAgICAgICAgIGlmIChzdHJlcSAoc3RyLCAidGh1bWIiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fVEhVTUI7Ci0gICAgICAgICAgICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkZQVV9BTEwpIHwgRlBVX05PTkU7Ci0gICAgICAgICAgICAgIHRodW1iX21vZGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJ0aHVtYi1pbnRlcndvcmsiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fVEhVTUIgfCBBUk1fQVJDSF9WNDsKLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotICAgICAgICAgICAgICBzdXBwb3J0X2ludGVyd29yayA9IHRydWU7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0JICAgIGdvdG8gYmFkOwotICAgICAgICAgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGlmIChzdHJlcSAoc3RyLCAiYWxsIikpCi0JICAgIHsKLQkgICAgICBjcHVfdmFyaWFudCA9IEFSTV9BTEwgfCBGUFVfQUxMOwotCSAgICAgIHJldHVybiAxOwotCSAgICB9Ci0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLQkgIGlmICghIHN0cm5jbXAgKHN0ciwgImFwY3MtIiwgNSkpCi0JICAgIHsKLQkgICAgICAvKiBHQ0MgcGFzc2VzIG9uIGFsbCBjb21tYW5kIGxpbmUgb3B0aW9ucyBzdGFydGluZyAiLW1hcGNzLS4uLiIKLQkJIHRvIHVzLCBzbyB3ZSBtdXN0IHBhcnNlIHRoZW0gaGVyZS4gICovCi0KLQkgICAgICBzdHIgKz0gNTsKLQkgICAgICAKLQkgICAgICBpZiAoc3RyZXEgKHN0ciwgIjMyIikpCi0JCXsKLQkJICB1c2VzX2FwY3NfMjYgPSBmYWxzZTsKLQkJICByZXR1cm4gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICIyNiIpKQotCQl7Ci0JCSAgdXNlc19hcGNzXzI2ID0gdHJ1ZTsKLQkJICByZXR1cm4gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJmcmFtZSIpKQotCQl7Ci0JCSAgLyogU3RhY2sgZnJhbWVzIGFyZSBiZWluZyBnZW5lcmF0ZWQgLSBkb2VzIG5vdCBhZmZlY3QKLQkJICAgICBsaW5rYWdlIG9mIGNvZGUuICAqLwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgInN0YWNrLWNoZWNrIikpCi0JCXsKLQkJICAvKiBTdGFjayBjaGVja2luZyBpcyBiZWluZyBwZXJmb3JtZWQgLSBkb2VzIG5vdCBhZmZlY3QKLQkJICAgICBsaW5rYWdlLCBidXQgZG9lcyByZXF1aXJlIHRoYXQgdGhlIGZ1bmN0aW9ucwotCQkgICAgIF9fcnRfc3Rrb3ZmX3NwbGl0X3NtYWxsIGFuZCBfX3J0X3N0a292Zl9zcGxpdF9iaWcgYmUKLQkJICAgICBwcmVzZW50IGluIHRoZSBmaW5hbCBsaW5rLiAgKi8KLQotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgImZsb2F0IikpCi0JCXsKLQkJICAvKiBGbG9hdGluZyBwb2ludCBhcmd1bWVudHMgYXJlIGJlaW5nIHBhc3NlZCBpbiB0aGUgZmxvYXRpbmcKLQkJICAgICBwb2ludCByZWdpc3RlcnMuICBUaGlzIGRvZXMgYWZmZWN0IGxpbmtpbmcsIHNpbmNlIHRoaXMKLQkJICAgICB2ZXJzaW9uIG9mIHRoZSBBUENTIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQKLQkJICAgICBwYXNzZXMgZmxvYXRpbmcgcG9pbnRzIGluIHRoZSBpbnRlZ2VyIHJlZ2lzdGVycy4gICovCi0KLQkJICB1c2VzX2FwY3NfZmxvYXQgPSB0cnVlOwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgInJlZW50cmFudCIpKQotCQl7Ci0JCSAgLyogUmVlbnRyYW50IGNvZGUgaGFzIGJlZW4gZ2VuZXJhdGVkLiAgVGhpcyBkb2VzIGFmZmVjdAotCQkgICAgIGxpbmtpbmcsIHNpbmNlIHRoZXJlIGlzIG5vIHBvaW50IGluIGxpbmtpbmcgcmVlbnRyYW50LwotCQkgICAgIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgd2l0aCBhYnNvbHV0ZSBwb3NpdGlvbiBjb2RlLiAqLwotCQkgIHBpY19jb2RlID0gdHJ1ZTsKLQkJICByZXR1cm4gMTsKLQkJfQotCSAgICAgIAotCSAgICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pc2VkIEFQQ1Mgc3dpdGNoIC1tJXMiKSwgYXJnKTsKLQkgICAgICByZXR1cm4gMDsKLSAgCSAgICB9Ci0jZW5kaWYKLQkgIC8qIFN0cmlwIG9mZiBvcHRpb25hbCAiYXJtIiAqLwotCSAgaWYgKCEgc3RybmNtcCAoc3RyLCAiYXJtIiwgMykpCi0JICAgIHN0ciArPSAzOwotCi0JICBzd2l0Y2ggKCpzdHIpCi0JICAgIHsKLQkgICAgY2FzZSAnMSc6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICIxIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzE7Ci0JICAgICAgZWxzZQotCQlnb3RvIGJhZDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcyJzoKLQkgICAgICBpZiAoc3RyZXEgKHN0ciwgIjIiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMjsKLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiMjUwIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzI1MDsKLQkgICAgICBlbHNlCi0JCWdvdG8gYmFkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzMnOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiMyIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV8zOwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnNic6Ci0JICAgICAgc3dpdGNoIChzdHJ0b2wgKHN0ciwgTlVMTCwgMTApKQotCQl7Ci0JCWNhc2UgNjoKLQkJY2FzZSA2MDoKLQkJY2FzZSA2MDA6Ci0JCWNhc2UgNjEwOgotCQljYXNlIDYyMDoKLQkJICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV82OwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGdvdG8gYmFkOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnNyc6Ci0JICAgICAgc3dpdGNoIChzdHJ0b2wgKHN0ciwgJiBzdHIsIDEwKSkJLyogRWF0IHRoZSBwcm9jZXNzb3IgbmFtZSAqLwotCQl7Ci0JCWNhc2UgNzoKLQkJY2FzZSA3MDoKLQkJY2FzZSA3MDA6Ci0JCWNhc2UgNzEwOgotCQljYXNlIDcxMDA6Ci0JCWNhc2UgNzUwMDoKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBnb3RvIGJhZDsKLQkJfQotICAgICAgICAgICAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV83OwotICAgICAgICAgICAgICBmb3IgKDsgKnN0cjsgc3RyKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoKiBzdHIpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgfD0gKEFSTV9USFVNQiB8IEFSTV9BUkNIX1Y0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOgotICAgICAgICAgICAgICAgICAgICBjcHVfdmFyaWFudCB8PSBBUk1fTE9OR01VTDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdmJzogLyogZmUgPT4gZnAgZW5hYmxlZCBjcHUuICAqLwotCQkgICAgaWYgKHN0clsxXSA9PSAnZScpCi0JCSAgICAgICsrIHN0cjsKLQkJICAgIGVsc2UKLQkJICAgICAgZ290byBiYWQ7Ci0JCSAgICAKLQkJICBjYXNlICdjJzogLyogTGVmdCBvdmVyIGZyb20gNzEwYyBwcm9jZXNzb3IgbmFtZS4gICovCi0gICAgICAgICAgICAgICAgICBjYXNlICdkJzogLyogRGVidWcgKi8KLSAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOiAvKiBFbWJlZGRlZCBJQ0UgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogSW5jbHVkZWQgZm9yIGNvbXBsZXRlbmVzcyBpbiBBUk0gcHJvY2Vzc29yIG5hbWluZy4gKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc4JzoKLQkgICAgICBpZiAoc3RyZXEgKHN0ciwgIjgiKSB8fCBzdHJlcSAoc3RyLCAiODEwIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzggfCBBUk1fQVJDSF9WNCB8IEFSTV9MT05HTVVMOwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgJzknOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiOSIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV85IHwgQVJNX0FSQ0hfVjQgfCBBUk1fTE9OR01VTCB8IEFSTV9USFVNQjsKLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiOTIwIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzkgfCBBUk1fQVJDSF9WNCB8IEFSTV9MT05HTVVMOwotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICI5MjB0IikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzkgfCBBUk1fQVJDSF9WNCB8IEFSTV9MT05HTVVMIHwgQVJNX1RIVU1COwotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICI5dGRtaSIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV85IHwgQVJNX0FSQ0hfVjQgfCBBUk1fTE9OR01VTCB8IEFSTV9USFVNQjsKLQkgICAgICBlbHNlCi0JCWdvdG8gYmFkOwotCSAgICAgIGJyZWFrOwotCi0JICAgICAgCi0JICAgIGNhc2UgJ3MnOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAic3Ryb25nYXJtIikKLQkJICB8fCBzdHJlcSAoc3RyLCAic3Ryb25nYXJtMTEwIikKLQkJICB8fCBzdHJlcSAoc3RyLCAic3Ryb25nYXJtMTEwMCIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV84IHwgQVJNX0FSQ0hfVjQgfCBBUk1fTE9OR01VTDsKLQkgICAgICBlbHNlCi0JCWdvdG8gYmFkOwotCSAgICAgIGJyZWFrOwotCQkKLQkgICAgY2FzZSAndic6Ci0JICAgICAgLyogU2VsZWN0IHZhcmlhbnQgYmFzZWQgb24gYXJjaGl0ZWN0dXJlIHJhdGhlciB0aGFuIHByb2Nlc3NvciAqLwotCSAgICAgIHN3aXRjaCAoKisrc3RyKQotCQl7Ci0JCWNhc2UgJzInOgotCQkgIHN3aXRjaCAoKisrc3RyKQotCQkgICAgewotCQkgICAgY2FzZSAnYSc6IGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzM7IGJyZWFrOwotCQkgICAgY2FzZSAwOiAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzI7IGJyZWFrOwotCQkgICAgZGVmYXVsdDogIGFzX2JhZCAoXygiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIiksIGFyZyk7IGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlICczJzoKLQkJICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzc7Ci0gICAgICAgICAgICAgICAgICAgIAotCQkgIHN3aXRjaCAoKisrc3RyKQotCQkgICAgewotCQkgICAgY2FzZSAnbSc6IGNwdV92YXJpYW50IHw9IEFSTV9MT05HTVVMOyBicmVhazsKLQkJICAgIGNhc2UgMDogICBicmVhazsKLQkJICAgIGRlZmF1bHQ6ICBhc19iYWQgKF8oIkludmFsaWQgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgLW0lcyIpLCBhcmcpOyBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJICAKLQkJY2FzZSAnNCc6Ci0JCSAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fQVJDSF9WNDsKLQkJICAKLQkJICBzd2l0Y2ggKCorK3N0cikKLQkJICAgIHsKLQkJICAgIGNhc2UgJ3QnOiBjcHVfdmFyaWFudCB8PSBBUk1fVEhVTUI7IGJyZWFrOwotCQkgICAgY2FzZSAwOiAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDogIGFzX2JhZCAoXygiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIiksIGFyZyk7IGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJzUnOgotCQkgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNX0FSQ0hfVjU7Ci0JCSAgc3dpdGNoICgqKytzdHIpCi0JCSAgICB7Ci0JCSAgICBjYXNlICd0JzogY3B1X3ZhcmlhbnQgfD0gQVJNX1RIVU1COyBicmVhazsKLQkJICAgIGNhc2UgJ2UnOiBjcHVfdmFyaWFudCB8PSBBUk1fRVhUX1Y1RTsgYnJlYWs7Ci0JCSAgICBjYXNlIDA6ICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OiAgYXNfYmFkIChfKCJJbnZhbGlkIGFyY2hpdGVjdHVyZSB2YXJpYW50IC1tJXMiKSwgYXJnKTsgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJICAKLQkJZGVmYXVsdDoKLQkJICBhc19iYWQgKF8oIkludmFsaWQgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgLW0lcyIpLCBhcmcpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgIGJhZDoKLQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgcHJvY2Vzc29yIHZhcmlhbnQgLW0lcyIpLCBhcmcpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSNpZiBkZWZpbmVkIE9CSl9FTEYgfHwgZGVmaW5lZCBPQkpfQ09GRgotICAgIGNhc2UgJ2snOgotICAgICAgcGljX2NvZGUgPSAxOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChmcCkKLSAgICAgRklMRSAqIGZwOwotewotICBmcHJpbnRmIChmcCwKLV8oIlwKLSBBUk0gU3BlY2lmaWMgQXNzZW1ibGVyIE9wdGlvbnM6XG5cCi0gIC1tW2FybV1bPHByb2Nlc3NvciBuYW1lPl0gc2VsZWN0IHByb2Nlc3NvciB2YXJpYW50XG5cCi0gIC1tW2FybV12WzJ8MmF8M3wzbXw0fDR0fDVdc2VsZWN0IGFyY2hpdGVjdHVyZSB2YXJpYW50XG5cCi0gIC1tdGh1bWIgICAgICAgICAgICAgICAgICAgb25seSBhbGxvdyBUaHVtYiBpbnN0cnVjdGlvbnNcblwKLSAgLW10aHVtYi1pbnRlcndvcmsgICAgICAgICBtYXJrIHRoZSBhc3NlbWJsZWQgY29kZSBhcyBzdXBwb3J0aW5nIGludGVyd29ya2luZ1xuXAotICAtbWFsbCAgICAgICAgICAgICAgICAgICAgIGFsbG93IGFueSBpbnN0cnVjdGlvblxuXAotICAtbWZwYTEwLCAtbWZwYTExICAgICAgICAgIHNlbGVjdCBmbG9hdGluZyBwb2ludCBhcmNoaXRlY3R1cmVcblwKLSAgLW1mcGUtb2xkICAgICAgICAgICAgICAgICBkb24ndCBhbGxvdyBmbG9hdGluZy1wb2ludCBtdWx0aXBsZSBpbnN0cnVjdGlvbnNcblwKLSAgLW1uby1mcHUgICAgICAgICAgICAgICAgICBkb24ndCBhbGxvdyBhbnkgZmxvYXRpbmctcG9pbnQgaW5zdHJ1Y3Rpb25zLlxuIikpOwotICBmcHJpbnRmIChmcCwKLV8oIlwKLSAgLWsgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBQSUMgY29kZS5cbiIpKTsKLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotICBmcHJpbnRmIChmcCwKLV8oIlwKLSAgLW1hcGNzLTMyLCAtbWFwY3MtMjYgICAgICBzcGVjaWZ5IHdoaWNoIEFSTSBQcm9jZWR1cmUgQ2FsbGluZyBTdGFuZGFyZCB0byB1c2VcbiIpKTsKLSAgZnByaW50ZiAoZnAsCi1fKCJcCi0gIC1tYXBjcy1mbG9hdCAgICAgICAgICAgICAgZmxvYXRpbmcgcG9pbnQgYXJncyBhcmUgcGFzc2VkIGluIEZQIHJlZ3NcbiIpKTsKLSAgZnByaW50ZiAoZnAsCi1fKCJcCi0gIC1tYXBjcy1yZWVudHJhbnQgICAgICAgICAgdGhlIGNvZGUgaXMgcG9zaXRpb24gaW5kZXBlbmRlbnQvcmVlbnRyYW50XG4iKSk7Ci0gICNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgZnByaW50ZiAoZnAsCi1fKCJcCi0gIC1tb2FiaSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgb2xkIEVMRiBBQklcbiIpKTsKLSNlbmRpZgotI2lmZGVmIEFSTV9CSV9FTkRJQU4KLSAgZnByaW50ZiAoZnAsCi1fKCJcCi0gIC1FQiAgICAgICAgICAgICAgICAgICAgICAgYXNzZW1ibGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIGNwdVxuXAotICAtRUwgICAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBjcHVcbiIpKTsKLSNlbmRpZgotfQotCi0vKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gZml4IHVwIGFyYml0cmFyeSBleHByZXNzaW9ucyBpbiBzb21lIHN0YXRlbWVudHMuCi0gICBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBzeW1ib2xzIHRoYXQgYXJlIGFuIGFyYml0cmFyeSBkaXN0YW5jZSBmcm9tCi0gICB0aGUgcGMuICBUaGUgbW9zdCBjb21tb24gY2FzZXMgYXJlIG9mIHRoZSBmb3JtICgoKy8tc3ltIC0vKyAuIC0gOCkgJiBtYXNrKSwKLSAgIHdoaWNoIHJldHVybnMgcGFydCBvZiBhbiBhZGRyZXNzIGluIGEgZm9ybSB3aGljaCB3aWxsIGJlIHZhbGlkIGZvcgotICAgYSBkYXRhIGluc3RydWN0aW9uLiAgV2UgZG8gdGhpcyBieSBwdXNoaW5nIHRoZSBleHByZXNzaW9uIGludG8gYSBzeW1ib2wKLSAgIGluIHRoZSBleHByX3NlY3Rpb24sIGFuZCBjcmVhdGluZyBhIGZpeCBmb3IgdGhhdC4gICovCi0KLXN0YXRpYyB2b2lkCi1maXhfbmV3X2FybSAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNfcmVsLCByZWxvYykKLSAgICAgZnJhZ1MgKiAgICAgICBmcmFnOwotICAgICBpbnQgICAgICAgICAgIHdoZXJlOwotICAgICBzaG9ydCBpbnQgICAgIHNpemU7Ci0gICAgIGV4cHJlc3Npb25TICogZXhwOwotICAgICBpbnQgICAgICAgICAgIHBjX3JlbDsKLSAgICAgaW50ICAgICAgICAgICByZWxvYzsKLXsKLSAgZml4UyAqICAgICAgICAgbmV3X2ZpeDsKLSAgYXJtX2ZpeF9kYXRhICogYXJtX2RhdGE7Ci0KLSAgc3dpdGNoIChleHAtPlhfb3ApCi0gICAgewotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICBjYXNlIE9fc3ltYm9sOgotICAgIGNhc2UgT19hZGQ6Ci0gICAgY2FzZSBPX3N1YnRyYWN0OgotICAgICAgbmV3X2ZpeCA9IGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY19yZWwsIHJlbG9jKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIG5ld19maXggPSBmaXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgbWFrZV9leHByX3N5bWJvbCAoZXhwKSwgMCwKLQkJCSBwY19yZWwsIHJlbG9jKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBNYXJrIHdoZXRoZXIgdGhlIGZpeCBpcyB0byBhIFRIVU1CIGluc3RydWN0aW9uLCBvciBhbiBBUk0gaW5zdHJ1Y3Rpb24gKi8KLSAgYXJtX2RhdGEgPSAoYXJtX2ZpeF9kYXRhICopIG9ic3RhY2tfYWxsb2MgKCYgbm90ZXMsIHNpemVvZiAoYXJtX2ZpeF9kYXRhKSk7Ci0gIG5ld19maXgtPnRjX2ZpeF9kYXRhID0gKFBUUikgYXJtX2RhdGE7Ci0gIGFybV9kYXRhLT50aHVtYl9tb2RlID0gdGh1bWJfbW9kZTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogVGhpcyBmaXhfbmV3IGlzIGNhbGxlZCBieSBjb25zIHZpYSBUQ19DT05TX0ZJWF9ORVcuICAqLwotdm9pZAotY29uc19maXhfbmV3X2FybSAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCkKLSAgICAgZnJhZ1MgKiAgICAgICBmcmFnOwotICAgICBpbnQgICAgICAgICAgIHdoZXJlOwotICAgICBpbnQgICAgICAgICAgIHNpemU7Ci0gICAgIGV4cHJlc3Npb25TICogZXhwOwotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgdHlwZTsKLSAgaW50IHBjcmVsID0gMDsKLSAgCi0gIC8qIFBpY2sgYSByZWxvYyAuLi4KLSAgICoKLSAgICogQEAgU2hvdWxkIGxvb2sgYXQgQ1BVIHdvcmQgc2l6ZS4KLSAgICovCi0gIHN3aXRjaCAoc2l6ZSkgCi0gICAgewotICAgIGNhc2UgMjoKLSAgICAgIHR5cGUgPSBCRkRfUkVMT0NfMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHR5cGUgPSBCRkRfUkVMT0NfMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICB0eXBlID0gQkZEX1JFTE9DXzY0OwotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCAoaW50KSBzaXplLCBleHAsIHBjcmVsLCB0eXBlKTsKLX0KLQotLyogQSBnb29kIHBsYWNlIHRvIGRvIHRoaXMsIGFsdGhvdWdoIHRoaXMgd2FzIHByb2JhYmx5IG5vdCBpbnRlbmRlZAotICAgZm9yIHRoaXMga2luZCBvZiB1c2UuICBXZSBuZWVkIHRvIGR1bXAgdGhlIGxpdGVyYWwgcG9vbCBiZWZvcmUKLSAgIHJlZmVyZW5jZXMgYXJlIG1hZGUgdG8gYSBudWxsIHN5bWJvbCBwb2ludGVyLiAgKi8KLXZvaWQKLWFybV9jbGVhbnVwICgpCi17Ci0gIGlmIChjdXJyZW50X3Bvb2xQID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAKLSAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsgLyogUHV0IGl0IGF0IHRoZSBlbmQgb2YgdGV4dCBzZWN0aW9uLiAgKi8KLSAgc19sdG9yZyAoMCk7Ci0gIGxpc3RpbmdfcHJldl9saW5lICgpOwotfQotCi12b2lkCi1hcm1fc3RhcnRfbGluZV9ob29rICgpCi17Ci0gIGxhc3RfbGFiZWxfc2VlbiA9IE5VTEw7Ci19Ci0KLXZvaWQKLWFybV9mcm9iX2xhYmVsIChzeW0pCi0gICAgIHN5bWJvbFMgKiBzeW07Ci17Ci0gIGxhc3RfbGFiZWxfc2VlbiA9IHN5bTsKLSAgCi0gIEFSTV9TRVRfVEhVTUIgKHN5bSwgdGh1bWJfbW9kZSk7Ci0gIAotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0gIEFSTV9TRVRfSU5URVJXT1JLIChzeW0sIHN1cHBvcnRfaW50ZXJ3b3JrKTsKLSNlbmRpZgotICAKLSAgaWYgKGxhYmVsX2lzX3RodW1iX2Z1bmN0aW9uX25hbWUpCi0gICAgewotICAgICAgLyogV2hlbiB0aGUgYWRkcmVzcyBvZiBhIFRodW1iIGZ1bmN0aW9uIGlzIHRha2VuIHRoZSBib3R0b20KLQkgYml0IG9mIHRoYXQgYWRkcmVzcyBzaG91bGQgYmUgc2V0LiAgVGhpcyB3aWxsIGFsbG93Ci0JIGludGVyd29ya2luZyBiZXR3ZWVuIEFybSBhbmQgVGh1bWIgZnVuY3Rpb25zIHRvIHdvcmsKLQkgY29ycmVjdGx5LiAgKi8KLQotICAgICAgVEhVTUJfU0VUX0ZVTkMgKHN5bSwgMSk7Ci0gICAgICAKLSAgICAgIGxhYmVsX2lzX3RodW1iX2Z1bmN0aW9uX25hbWUgPSBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIEFkanVzdCB0aGUgc3ltYm9sIHRhYmxlLiAgVGhpcyBtYXJrcyBUaHVtYiBzeW1ib2xzIGFzIGRpc3RpbmN0IGZyb20KLSAgIEFSTSBvbmVzLiAgKi8KLQotdm9pZAotYXJtX2FkanVzdF9zeW10YWIgKCkKLXsKLSNpZmRlZiBPQkpfQ09GRgotICBzeW1ib2xTICogc3ltOwotCi0gIGZvciAoc3ltID0gc3ltYm9sX3Jvb3RQOyBzeW0gIT0gTlVMTDsgc3ltID0gc3ltYm9sX25leHQgKHN5bSkpCi0gICAgewotICAgICAgaWYgKEFSTV9JU19USFVNQiAoc3ltKSkKLSAgICAgICAgewotCSAgaWYgKFRIVU1CX0lTX0ZVTkMgKHN5bSkpCi0JICAgIHsKLQkgICAgICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgYSBUaHVtYiBmdW5jdGlvbi4gICovCi0JICAgICAgaWYgKCAgIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19TVEFUCi0JCSAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0xBQkVMKSAvKiBUaGlzIGNhbiBoYXBwZW4hICovCi0JCVNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19USFVNQlNUQVRGVU5DKTsKLQotCSAgICAgIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19FWFQpCi0JCVNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19USFVNQkVYVEZVTkMpOwotCSAgICAgIGVsc2UKLQkJYXNfYmFkIChfKCIlczogdW5leHBlY3RlZCBmdW5jdGlvbiB0eXBlOiAlZCIpLAotCQkJU19HRVRfTkFNRSAoc3ltKSwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSk7Ci0JICAgIH0KLSAgICAgICAgICBlbHNlIHN3aXRjaCAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSBDX0VYVDoKLSAgICAgICAgICAgICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfVEhVTUJFWFQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIENfU1RBVDoKLSAgICAgICAgICAgICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfVEhVTUJTVEFUKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBDX0xBQkVMOgotICAgICAgICAgICAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19USFVNQkxBQkVMKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgZGVmYXVsdDogLyogZG8gbm90aGluZyAqLyAKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICBpZiAoQVJNX0lTX0lOVEVSV09SSyAoc3ltKSkKLQljb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+dS5zeW1lbnQubl9mbGFncyA9IDB4RkY7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICBzeW1ib2xTICogICAgICAgICBzeW07Ci0gIGVsZl9zeW1ib2xfdHlwZSAqIGVsZl9zeW07Ci0gIGNoYXIgICAgICAgICAgICAgIGJpbmQ7Ci0KLSAgZm9yIChzeW0gPSBzeW1ib2xfcm9vdFA7IHN5bSAhPSBOVUxMOyBzeW0gPSBzeW1ib2xfbmV4dCAoc3ltKSkKLSAgICB7Ci0gICAgICBpZiAoQVJNX0lTX1RIVU1CIChzeW0pKQotICAgICAgICB7Ci0JICBpZiAoVEhVTUJfSVNfRlVOQyAoc3ltKSkKLQkgICAgewotCSAgICAgIGVsZl9zeW0gPSBlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSk7Ci0JICAgICAgYmluZCA9IEVMRl9TVF9CSU5EIChlbGZfc3ltKTsKLQkgICAgICBlbGZfc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoYmluZCwgU1RUX0FSTV9URlVOQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgIH0KLSNlbmRpZgotfQotCi1pbnQKLWFybV9kYXRhX2luX2NvZGUgKCkKLXsKLSAgaWYgKHRodW1iX21vZGUgJiYgISBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIgKyAxLCAiZGF0YToiLCA1KSkKLSAgICB7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJy8nOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgCi0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLWFybV9jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKG5hbWUpCi0gICAgIGNoYXIgKiBuYW1lOwotewotICBpbnQgbGVuOwotCi0gIGlmICh0aHVtYl9tb2RlICYmIChsZW4gPSBzdHJsZW4gKG5hbWUpKSA+IDUKLSAgICAgICYmIHN0cmVxIChuYW1lICsgbGVuIC0gNSwgIi9kYXRhIikpCi0gICAgKihuYW1lICsgbGVuIC0gNSkgPSAwOwotCi0gIHJldHVybiBuYW1lOwotfQotCi1ib29sZWFuCi1hcm1fdmFsaWRhdGVfZml4IChmaXhQKQotICAgICBmaXhTICogZml4UDsKLXsKLSAgLyogSWYgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBicmFuY2ggaXMgYSBkZWZpbmVkIHN5bWJvbCB3aGljaCBkb2VzIG5vdCBoYXZlCi0gICAgIHRoZSBUSFVNQl9GVU5DIGF0dHJpYnV0ZSwgdGhlbiB3ZSBtdXN0IGJlIGNhbGxpbmcgYSBmdW5jdGlvbiB3aGljaCBoYXMKLSAgICAgdGhlIChpbnRlcmZhY2Vhcm0pIGF0dHJpYnV0ZS4gIFdlIGxvb2sgZm9yIHRoZSBUaHVtYiBlbnRyeSBwb2ludCB0byB0aGF0Ci0gICAgIGZ1bmN0aW9uIGFuZCBjaGFuZ2UgdGhlIGJyYW5jaCB0byByZWZlciB0byB0aGF0IGZ1bmN0aW9uIGluc3RlYWQuICAqLwotICBpZiAoICAgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMwotICAgICAgJiYgZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotICAgICAgJiYgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLSAgICAgICYmICEgVEhVTUJfSVNfRlVOQyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gZmluZF9yZWFsX3N0YXJ0IChmaXhQLT5meF9hZGRzeSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWZkZWYgT0JKX0VMRgotLyogUmVsb2NhdGlvbnMgYWdhaW5zdCBUaHVtYiBmdW5jdGlvbiBuYW1lcyBtdXN0IGJlIGxlZnQgdW5hZGp1c3RlZCwKLSAgIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gY29ycmVjdGx5IHNldCB0aGUKLSAgIGJvdHRvbSBiaXQgb2YgdGhlaXIgYWRkcmVzc2VzLiAgVGhlIE1JUFMgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uCi0gICBhbHNvIHByZXZlbnRzIHJlbG9jYXRpb25zIHRoYXQgYXJlIG1pcHMtMTYgc3BlY2lmaWMsIGJ1dCBJIGRvIG5vdAotICAga25vdyB3aHkgaXQgZG9lcyB0aGlzLgotCi0gICBGSVhNRToKLSAgIFRoZXJlIGlzIG9uZSBvdGhlciBwcm9ibGVtIHRoYXQgb3VnaHQgdG8gYmUgYWRkcmVzc2VkIGhlcmUsIGJ1dAotICAgd2hpY2ggY3VycmVudGx5IGlzIG5vdDogIFRha2luZyB0aGUgYWRkcmVzcyBvZiBhIGxhYmVsIChyYXRoZXIKLSAgIHRoYW4gYSBmdW5jdGlvbikgYW5kIHRoZW4gbGF0ZXIganVtcGluZyB0byB0aGF0IGFkZHJlc3MuICBTdWNoCi0gICBhZGRyZXNzZXMgYWxzbyBvdWdodCB0byBoYXZlIHRoZWlyIGJvdHRvbSBiaXQgc2V0IChhc3N1bWluZyB0aGF0Ci0gICB0aGV5IHJlc2lkZSBpbiBUaHVtYiBjb2RlKSwgYnV0IGF0IHRoZSBtb21lbnQgdGhleSB3aWxsIG5vdC4gICovCi0gICAKLWJvb2xlYW4KLWFybV9maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgIGZpeFMgKiBmaXhQOwotewotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoVEhVTUJfSVNfRlVOQyAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAmJiBmaXhQLT5meF9zdWJzeSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoICAgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLWNvbnN0IGNoYXIgKgotZWxmMzJfYXJtX3RhcmdldF9mb3JtYXQgKCkKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIGlmICh0YXJnZXRfb2FiaSkKLSAgICAgIHJldHVybiAiZWxmMzItYmlnYXJtLW9hYmkiOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAiZWxmMzItYmlnYXJtIjsKLSAgZWxzZQotICAgIGlmICh0YXJnZXRfb2FiaSkKLSAgICAgIHJldHVybiAiZWxmMzItbGl0dGxlYXJtLW9hYmkiOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAiZWxmMzItbGl0dGxlYXJtIjsKLX0KLQotdm9pZAotYXJtZWxmX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50cCkKLSAgICAgc3ltYm9sUyAqIHN5bXA7Ci0gICAgIGludCAqIHB1bnRwOwotewotICBlbGZfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnRwKTsKLX0gCi0KLWludAotYXJtX2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gICAgIHN0cnVjdCBmaXggKiBmaXhwOwotewotICBpZiAoICAgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMykgICAgCi0gICAgcmV0dXJuIDE7Ci0gIAotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotYXJtX3BhcnNlX3JlbG9jICgpCi17Ci0gIGNoYXIgICBpZFsxNl07Ci0gIGNoYXIgKiBpcDsKLSAgaW50ICAgIGk7Ci0gIHN0YXRpYyBzdHJ1Y3QKLSAgewotICAgIGNoYXIgKiBzdHI7Ci0gICAgaW50ICAgIGxlbjsKLSAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gIH0KLSAgcmVsb2NfbWFwW10gPQotICB7Ci0jZGVmaW5lIE1BUChzdHIscmVsb2MpIHsgc3RyLCBzaXplb2YgKHN0ciktMSwgcmVsb2MgfQotICAgIE1BUCAoIihnb3QpIiwgICAgQkZEX1JFTE9DX0FSTV9HT1QzMiksCi0gICAgTUFQICgiKGdvdG9mZikiLCBCRkRfUkVMT0NfQVJNX0dPVE9GRiksCi0gICAgLyogU2NvdHRCOiBKYW4gMzAsIDE5OTggKi8KLSAgICAvKiBBZGRlZCBzdXBwb3J0IGZvciBwYXJzaW5nICJ2YXIoUExUKSIgYnJhbmNoIGluc3RydWN0aW9ucyAqLwotICAgIC8qIGdlbmVyYXRlZCBieSBHQ0MgZm9yIFBMVCByZWxvY3MgKi8KLSAgICBNQVAgKCIocGx0KSIsICAgIEJGRF9SRUxPQ19BUk1fUExUMzIpLAotICAgIHsgTlVMTCwgMCwgICAgICAgICBCRkRfUkVMT0NfVU5VU0VEIH0KLSN1bmRlZiBNQVAgICAgCi0gIH07Ci0KLSAgZm9yIChpID0gMCwgaXAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAgaSA8IHNpemVvZiAoaWQpICYmIChpc2FsbnVtICgqaXApIHx8IGlzcHVuY3QgKCppcCkpOwotICAgICAgIGkrKywgaXArKykKLSAgICBpZFtpXSA9IHRvbG93ZXIgKCppcCk7Ci0gIAotICBmb3IgKGkgPSAwOyByZWxvY19tYXBbaV0uc3RyOyBpKyspCi0gICAgaWYgKHN0cm5jbXAgKGlkLCByZWxvY19tYXBbaV0uc3RyLCByZWxvY19tYXBbaV0ubGVuKSA9PSAwKQotICAgICAgYnJlYWs7Ci0gIAotICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gcmVsb2NfbWFwW2ldLmxlbjsKLSAgCi0gIHJldHVybiByZWxvY19tYXBbaV0ucmVsb2M7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FybV9lbGZfY29ucyAobmJ5dGVzKQotICAgICBpbnQgbmJ5dGVzOwotewotICBleHByZXNzaW9uUyBleHA7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZkZWYgbWRfY29uc19hbGlnbgotICBtZF9jb25zX2FsaWduIChuYnl0ZXMpOwotI2VuZGlmCi0KLSAgZG8KLSAgICB7Ci0gICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gICAgICAKLSAgICAgIGV4cHJlc3Npb24gKCYgZXhwKTsKLQotICAgICAgaWYgKGV4cC5YX29wID09IE9fc3ltYm9sCi0gICAgICAgICAgJiYgKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJygnCi0gICAgICAgICAgJiYgKHJlbG9jID0gYXJtX3BhcnNlX3JlbG9jKCkpICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgICAgIHsKLSAgICAgICAgICByZWxvY19ob3d0b190eXBlICogaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgcmVsb2MpOwotICAgICAgICAgIGludCBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0KLSAgICAgICAgICBpZiAoc2l6ZSA+IG5ieXRlcykKLSAgICAgICAgICAgIGFzX2JhZCAoIiVzIHJlbG9jYXRpb25zIGRvIG5vdCBmaXQgaW4gJWQgYnl0ZXMiLCBob3d0by0+bmFtZSwgbmJ5dGVzKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlZ2lzdGVyIGNoYXIgKiBwID0gZnJhZ19tb3JlICgoaW50KSBuYnl0ZXMpOwotICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gbmJ5dGVzIC0gc2l6ZTsKLQotICAgICAgICAgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwgc2l6ZSwKLQkJCSAgICYgZXhwLCAwLCByZWxvYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZW1pdF9leHByICgmIGV4cCwgKHVuc2lnbmVkIGludCkgbmJ5dGVzKTsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXItLTsJCS8qIFB1dCB0ZXJtaW5hdG9yIGJhY2sgaW50byBzdHJlYW0uICovCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfRUxGICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFybS5oIGIvZ2FzL2NvbmZpZy90Yy1hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhYjg4Ny4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWFybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1hcm0uaAotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0JTW9kaWZpZWQgYnkgRGF2aWQgVGF5bG9yIChkdGF5bG9yQGFybWx0ZC5jby51aykKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19BUk0gMQotCi0jaWZuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLSNlbmRpZgotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBDT0ZGX01BR0lDIAlBUk1NQUdJQwotI2RlZmluZSBUQVJHRVRfQVJDSCAJYmZkX2FyY2hfYXJtCi0KLSNkZWZpbmUgQU9VVF9NQUNIVFlQRSAJMAotCi0jZGVmaW5lIERJRkZfRVhQUl9PSwotCi0jaWZkZWYgIExJVFRMRV9FTkRJQU4KLSN1bmRlZiAgTElUVExFX0VORElBTgotI2VuZGlmCi0KLSNpZmRlZiAgQklHX0VORElBTgotI3VuZGVmICBCSUdfRU5ESUFOCi0jZW5kaWYKLQotI2RlZmluZSBMSVRUTEVfRU5ESUFOIAkxMjM0Ci0jZGVmaW5lIEJJR19FTkRJQU4gCTQzMjEKLQotI2lmIGRlZmluZWQgT0JKX0FPVVQKLSNpZiBkZWZpbmVkIFRFX1JJU0NJWAotIyBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtcmlzY2l4IgotI2VsaWYgZGVmaW5lZCBURV9MSU5VWAotIyBkZWZpbmUgQVJNX0JJX0VORElBTgotIyBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtYXJtLWxpbnV4IgotI2VsaWYgZGVmaW5lZCBURV9OZXRCU0QKLSMgZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LWFybS1uZXRic2QiCi0jZWxzZQotIyBkZWZpbmUgQVJNX0JJX0VORElBTgotIyBkZWZpbmUgVEFSR0VUX0ZPUk1BVCBcCi0gICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJhLm91dC1hcm0tYmlnIiA6ICJhLm91dC1hcm0tbGl0dGxlIikKLSNlbmRpZgotI2VuZGlmIC8qIE9CSl9BT1VUICovCi0KLSNpZmRlZiBPQkpfQUlGCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImFpZiIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLSMgZGVmaW5lIEFSTV9CSV9FTkRJQU4KLSAgICAgCi0jIGRlZmluZSBUQ19WQUxJREFURV9GSVgoZml4UCwgc2VnVHlwZSwgTGFiZWwpIFwKLSAgICAgaWYgKGFybV92YWxpZGF0ZV9maXggKGZpeFApKSBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5Ci0gIGV4dGVybiBib29sZWFuIGFybV92YWxpZGF0ZV9maXggUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZW5kaWYKLSAgICAgCi0jaWZkZWYgT0JKX0NPRkYKLSMgaWYgZGVmaW5lZCBURV9QRQotIyAgZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oeCkgKCh4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19SVkEpCi0jICAgaWZkZWYgVEVfRVBPQwotIyAgICBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAiZXBvYy1wZS1hcm0tYmlnIiA6ICJlcG9jLXBlLWFybS1saXR0bGUiKQotIyAgIGVsc2UKLSMgICAgZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gInBlLWFybS1iaWciIDogInBlLWFybS1saXR0bGUiKQotIyAgIGVuZGlmCi0jIGVsc2UKLSMgIGRlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJjb2ZmLWFybS1iaWciIDogImNvZmYtYXJtLWxpdHRsZSIpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSMgZGVmaW5lIFRBUkdFVF9GT1JNQVQgZWxmMzJfYXJtX3RhcmdldF9mb3JtYXQoKQotICBleHRlcm4gY29uc3QgY2hhciAqIGVsZjMyX2FybV90YXJnZXRfZm9ybWF0IFBBUkFNUyAoKHZvaWQpKTsKLSAgCi0jIGRlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeHApIGFybV9mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICBleHRlcm4gaW50IGFybV9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgbWRfY29udmVydF9mcmFnKGIsIHMsIGYpIHthc19mYXRhbCAoXygiYXJtIGNvbnZlcnRfZnJhZ1xuIikpO30KLQotI2RlZmluZSBtZF9jbGVhbnVwKCkgYXJtX2NsZWFudXAgKCkKLSBleHRlcm4gdm9pZCBhcm1fY2xlYW51cCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgbWRfc3RhcnRfbGluZV9ob29rKCkgYXJtX3N0YXJ0X2xpbmVfaG9vayAoKQotIGV4dGVybiB2b2lkIGFybV9zdGFydF9saW5lX2hvb2sgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoUykgYXJtX2Zyb2JfbGFiZWwgKFMpCi0gZXh0ZXJuIHZvaWQgYXJtX2Zyb2JfbGFiZWwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLS8qIFdlIGFsc28gbmVlZCB0byBtYXJrIGFzc2VtYmxlciBjcmVhdGVkIHN5bWJvbHM6ICAqLwotI2RlZmluZSB0Y19mcm9iX2Zha2VfbGFiZWwoUykgYXJtX2Zyb2JfbGFiZWwgKFMpCi0KLS8qIE5PVEU6IFRoZSBmYWtlIGxhYmVsIGNyZWF0aW9uIGluIHN0YWJzLmM6c19zdGFiX2dlbmVyaWMoKSBoYXMKLSAgIGRlbGliZXJhdGVseSBub3QgYmVlbiB1cGRhdGVkIHRvIG1hcmsgYXNzZW1ibGVyIGNyZWF0ZWQgc3RhYnMKLSAgIHN5bWJvbHMgYXMgVGh1bWIuICAqLwotCi0jZGVmaW5lIFRDX0ZJWF9UWVBFIFBUUgotI2RlZmluZSBUQ19JTklUX0ZJWF9EQVRBKEZJWFApICgoRklYUCktPnRjX2ZpeF9kYXRhID0gTlVMTCkKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJ3cml0ZS5oIiAgICAgICAgLyogRm9yIGRlZmluaXRpb24gb2YgZml4UyAqLwotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgYXJtX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotYm9vbGVhbiBhcm1fZml4X2FkanVzdGFibGUgUEFSQU1TICgoZml4UyAqKSk7Ci0jZWxzZQotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgMAotI2VuZGlmCi0KLS8qIFdlIG5lZWQgdG8ga2VlcCBzb21lIGxvY2FsIGluZm9ybWF0aW9uIG9uIHN5bWJvbHMuICAqLwotCi0jZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUgdW5zaWduZWQgaW50Ci0jZGVmaW5lIEFSTV9HRVRfRkxBRyhzKSAgIAkoKnN5bWJvbF9nZXRfdGMgKHMpKQotI2RlZmluZSBBUk1fU0VUX0ZMQUcocyx2KSAJKCpzeW1ib2xfZ2V0X3RjIChzKSB8PSAodikpCi0jZGVmaW5lIEFSTV9SRVNFVF9GTEFHKHMsdikgCSgqc3ltYm9sX2dldF90YyAocykgJj0gfih2KSkKLQotI2RlZmluZSBBUk1fRkxBR19USFVNQiAJCSgxIDw8IDApCS8qIFRoZSBzeW1ib2wgaXMgYSBUaHVtYiBzeW1ib2wgcmF0aGVyIHRoYW4gYW4gQXJtIHN5bWJvbC4gICovCi0jZGVmaW5lIEFSTV9GTEFHX0lOVEVSV09SSyAJKDEgPDwgMSkJLyogVGhlIHN5bWJvbCBpcyBhdHRhY2hlZCB0byBjb2RlIHRoYXQgc3VwcHBvcnRzIGludGVyd29ya2luZy4gICovCi0jZGVmaW5lIFRIVU1CX0ZMQUdfRlVOQwkJKDEgPDwgMikJLyogVGhlIHN5bWJvbCBpcyBhdHRhY2hlZCB0byB0aGUgc3RhcnQgb2YgYSBUaHVtYiBmdW5jdGlvbi4gICovCi0KLSNkZWZpbmUgQVJNX0lTX1RIVU1CKHMpCQkoQVJNX0dFVF9GTEFHIChzKSAmIEFSTV9GTEFHX1RIVU1CKQotI2RlZmluZSBBUk1fSVNfSU5URVJXT1JLKHMpCShBUk1fR0VUX0ZMQUcgKHMpICYgQVJNX0ZMQUdfSU5URVJXT1JLKQotI2RlZmluZSBUSFVNQl9JU19GVU5DKHMpCShBUk1fR0VUX0ZMQUcgKHMpICYgVEhVTUJfRkxBR19GVU5DKQotCi0jZGVmaW5lIEFSTV9TRVRfVEhVTUIocyx0KSAgICAgICgodCkgPyBBUk1fU0VUX0ZMQUcgKHMsIEFSTV9GTEFHX1RIVU1CKSAgICAgOiBBUk1fUkVTRVRfRkxBRyAocywgQVJNX0ZMQUdfVEhVTUIpKQotI2RlZmluZSBBUk1fU0VUX0lOVEVSV09SSyhzLHQpICAoKHQpID8gQVJNX1NFVF9GTEFHIChzLCBBUk1fRkxBR19JTlRFUldPUkspIDogQVJNX1JFU0VUX0ZMQUcgKHMsIEFSTV9GTEFHX0lOVEVSV09SSykpCi0jZGVmaW5lIFRIVU1CX1NFVF9GVU5DKHMsdCkgICAgICgodCkgPyBBUk1fU0VUX0ZMQUcgKHMsIFRIVU1CX0ZMQUdfRlVOQykgICAgOiBBUk1fUkVTRVRfRkxBRyAocywgVEhVTUJfRkxBR19GVU5DKSkKLQotCi0jZGVmaW5lIFRDX1NUQVJUX0xBQkVMKEMsU1RSKSBcCi0gIChjID09ICc6JyB8fCAoYyA9PSAnLycgJiYgYXJtX2RhdGFfaW5fY29kZSAoKSkpCi1pbnQgYXJtX2RhdGFfaW5fY29kZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKHN0cikgXAotIGFybV9jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN0cik7Ci1jaGFyICogYXJtX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSBQQVJBTVMgKChjaGFyICopKTsKLQotI2RlZmluZSBvYmpfYWRqdXN0X3N5bXRhYigpIGFybV9hZGp1c3Rfc3ltdGFiICgpCi0gZXh0ZXJuIHZvaWQgYXJtX2FkanVzdF9zeW10YWIgUEFSQU1TICgodm9pZCkpOwotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBvYmpfZnJvYl9zeW1ib2woc3ltLCBwdW50KSAgYXJtZWxmX2Zyb2Jfc3ltYm9sICgoc3ltKSwgJiAocHVudCkpCi12b2lkIGFybWVsZl9mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICosIGludCAqKSk7Ci0jZW5kaWYKLQotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLwotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJBUk0gR0FTICIKLQotI2RlZmluZSBPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVggJyUnCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLQotI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSAobmFtZVswXSA9PSAnLicgJiYgKG5hbWVbMV0gPT0gJ0wnKSkKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCICAgMQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgTE9DQUxfTEFCRUxfUFJFRklYICcuJwotI2VuZGlmCi0KLS8qIFRoaXMgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UgaWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGEgbG9jYWwgb2JqZWN0Ci0gICBmb3Igd2hpY2ggd2Ugc3RpbGwgd2FudCB0byBkbyB0aGUgcmVsb2NhdGlvbiBhdCBydW50aW1lLiAgVHJ1ZSBpZiB3ZQotICAgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcgdGhlIC5vIGZpbGUuCi0gICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgcGNyZWwgcmVsb2NhdGlvbnMsIHNvIEdPVE9GRiBkb2VzIG5vdCBuZWVkIHRvIGJlCi0gICBjaGVja2VkIGhlcmUuICBJIGFtIG5vdCBzdXJlIGlmIHNvbWUgb2YgdGhlIG90aGVycyBhcmUgZXZlciB1c2VkIHdpdGgKLSAgIHBjcmVsLCBidXQgaXQgaXMgZWFzaWVyIHRvIGJlIHNhZmUgdGhhbiBzb3JyeS4gICovCi0KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkgIFwKLSAgICggIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0FSTV9HT1QxMiBcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19BUk1fR09UMzIgXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMzIpCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19hcm0KLSBleHRlcm4gdm9pZCBjb25zX2ZpeF9uZXdfYXJtIFBBUkFNUyAoKGZyYWdTICosIGludCwgaW50LCBleHByZXNzaW9uUyAqKSk7Ci0KLS8qIERvbid0IGFsbG93IHN5bWJvbHMgdG8gYmUgZGlzY2FyZGVkIG9uIEdPVCByZWxhdGVkIHJlbG9jcywKLSAgIG5vciBvbiBnbG9iYWxzLiAgKi8gCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKHgpIChcCi0gICAgICgoeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX1BMVDMyIFwKLSAgIHx8ICh4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fR09UMzIgXAotICAgfHwgKHgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9HT1RPRkYgXAotICAgfHwgU19JU19FWFRFUk4gKCh4KS0+ZnhfYWRkc3kpIFwKLSAgIHx8IFNfSVNfV0VBSyAoKHgpLT5meF9hZGRzeSkpID8gMCA6IDEpCi0gICAgIAotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jZWxzZQotI2RlZmluZSBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jZW5kaWYKLSAgICAgCi0vKiBlbmQgb2YgdGMtYXJtLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZDEwdi5jIGIvZ2FzL2NvbmZpZy90Yy1kMTB2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDlhOTUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1kMTB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYzICswLDAgQEAKLS8qIHRjLWQxMHYuYyAtLSBBc3NlbWJsZXIgY29kZSBmb3IgdGhlIE1pdHN1YmlzaGkgRDEwVgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAotI2luY2x1ZGUgIm9wY29kZS9kMTB2LmgiCi0jaW5jbHVkZSAiZWxmL3BwYy5oIgotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJPIjsKLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0KLWludCBPcHRpbWl6aW5nID0gMDsKLQotI2RlZmluZSBBVF9XT1JEX1AoWCkgKChYKS0+WF9vcCA9PSBPX3JpZ2h0X3NoaWZ0IFwKLQkJICAgICAgJiYgKFgpLT5YX29wX3N5bWJvbCAhPSBOVUxMIFwKLQkJICAgICAgJiYgc3ltYm9sX2NvbnN0YW50X3AgKChYKS0+WF9vcF9zeW1ib2wpIFwKLQkJICAgICAgJiYgU19HRVRfVkFMVUUgKChYKS0+WF9vcF9zeW1ib2wpID09IEFUX1dPUkRfUklHSFRfU0hJRlQpCi0jZGVmaW5lIEFUX1dPUkRfUklHSFRfU0hJRlQgMgotCi0KLS8qIGZpeHVwcyAqLwotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi1zdHJ1Y3QgZDEwdl9maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBvcGVyYW5kOwotICBpbnQgcGNyZWw7Ci0gIGludCBzaXplOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBfZml4dXBzCi17Ci0gIGludCBmYzsKLSAgc3RydWN0IGQxMHZfZml4dXAgZml4W01BWF9JTlNOX0ZJWFVQU107Ci0gIHN0cnVjdCBfZml4dXBzICpuZXh0OwotfSBGaXh1cHM7Ci0KLXN0YXRpYyBGaXh1cHMgRml4VXBzWzJdOwotc3RhdGljIEZpeHVwcyAqZml4dXBzOwotCi1zdGF0aWMgaW50IGRvX25vdF9pZ25vcmVfaGFzaCA9IDA7Ci0KLS8qIFRydWUgaWYgaW5zdHJ1Y3Rpb24gc3dhcHBpbmcgd2FybmluZ3Mgc2hvdWxkIGJlIGluaGliaXRlZC4gICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwOyAvKiAtLW5vd2FybnN3YXAgKi8KLQotLyogbG9jYWwgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci1zdGF0aWMgaW50IHJlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgaW50IGNoZWNrX3JhbmdlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbnVtLCBpbnQgYml0cywgaW50IGZsYWdzKSk7Ci1zdGF0aWMgaW50IHBvc3RmaXggUEFSQU1TICgoY2hhciAqcCkpOwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBnZXRfcmVsb2MgUEFSQU1TICgoc3RydWN0IGQxMHZfb3BlcmFuZCAqb3ApKTsKLXN0YXRpYyBpbnQgZ2V0X29wZXJhbmRzIFBBUkFNUyAoKGV4cHJlc3Npb25TIGV4cFtdKSk7Ci1zdGF0aWMgc3RydWN0IGQxMHZfb3Bjb2RlICpmaW5kX29wY29kZSBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZSwgZXhwcmVzc2lvblMgb3BzW10pKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJ1aWxkX2luc24gUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUsIGV4cHJlc3Npb25TICpvcGVycywgdW5zaWduZWQgbG9uZyBpbnNuKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9sb25nIFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlLCB1bnNpZ25lZCBsb25nIGluc24sIEZpeHVwcyAqZngpKTsKLXN0YXRpYyB2b2lkIHdyaXRlXzFfc2hvcnQgUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUsIHVuc2lnbmVkIGxvbmcgaW5zbiwgRml4dXBzICpmeCkpOwotc3RhdGljIGludCB3cml0ZV8yX3Nob3J0IFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMSwgdW5zaWduZWQgbG9uZyBpbnNuMSwgCi0JCQkJICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTIsIHVuc2lnbmVkIGxvbmcgaW5zbjIsIGludCBleGVjX3R5cGUsIEZpeHVwcyAqZngpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRvX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKnN0ciwgc3RydWN0IGQxMHZfb3Bjb2RlICoqb3Bjb2RlKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBkMTB2X2luc2VydF9vcGVyYW5kIFBBUkFNUyAoKCB1bnNpZ25lZCBsb25nIGluc24sIGludCBvcF90eXBlLAotCQkJCQkJICAgb2Zmc2V0VCB2YWx1ZSwgaW50IGxlZnQsIGZpeFMgKmZpeCkpOwotc3RhdGljIGludCBwYXJhbGxlbF9vayBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTEsIHVuc2lnbmVkIGxvbmcgaW5zbjEsIAotCQkJCXN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMiwgdW5zaWduZWQgbG9uZyBpbnNuMiwKLQkJCQlpbnQgZXhlY190eXBlKSk7Ci1zdGF0aWMgc3ltYm9sUyAqIGZpbmRfc3ltYm9sX21hdGNoaW5nX3JlZ2lzdGVyIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSNkZWZpbmUgT1BUSU9OX05PV0FSTlNXQVAgKE9QVElPTl9NRF9CQVNFKQotICB7Im5vd2FybnN3YXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PV0FSTlNXQVB9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOyAgICAgICAKLQotc3RhdGljIHZvaWQgZDEwdl9kb3Rfd29yZCBQQVJBTVMgKChpbnQpKTsKLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAid29yZCIsCWQxMHZfZG90X3dvcmQsCTIgfSwKLSAgeyBOVUxMLCAgICAgICBOVUxMLCAgICAgICAgICAgMCB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqZDEwdl9oYXNoOwotCi0vKiByZWdfbmFtZV9zZWFyY2ggZG9lcyBhIGJpbmFyeSBzZWFyY2ggb2YgdGhlIGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMKLSAgIGFycmF5IHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgotICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSBkMTB2X3JlZ19uYW1lX2NudCgpIC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UgCi0JICByZXR1cm4gZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLSAgcmV0dXJuIC0xOwotfQotCi0vKiByZWdpc3Rlcl9uYW1lKCkgY2hlY2tzIHRoZSBzdHJpbmcgYXQgaW5wdXRfbGluZV9wb2ludGVyCi0gICB0byBzZWUgaWYgaXQgaXMgYSB2YWxpZCByZWdpc3RlciBuYW1lICovCi0KLXN0YXRpYyBpbnQKLXJlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyIGMsICpwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAKLSAgd2hpbGUgKCpwICYmICpwIT0nXG4nICYmICpwIT0nXHInICYmICpwICE9JywnICYmICpwIT0nICcgJiYgKnAhPScpJykKLSAgICBwKys7Ci0KLSAgYyA9ICpwOwotICBpZiAoYykKLSAgICAqcCsrID0gMDsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChpbnB1dF9saW5lX3BvaW50ZXIpOwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICAvKiB0ZW1wb3JhcmlseSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBoZXJlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSAoc3ltYm9sUyAqKWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKGMpCi0gICAgKihwLTEpID0gYzsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotY2hlY2tfcmFuZ2UgKG51bSwgYml0cywgZmxhZ3MpCi0gICAgIHVuc2lnbmVkIGxvbmcgbnVtOwotICAgICBpbnQgYml0czsKLSAgICAgaW50IGZsYWdzOwotewotICBsb25nIG1pbiwgbWF4LCBiaXQxOwotICBpbnQgcmV0dmFsPTA7Ci0KLSAgLyogZG9uJ3QgYm90aGVyIGNoZWNraW5nIDE2LWJpdCB2YWx1ZXMgKi8KLSAgaWYgKGJpdHMgPT0gMTYpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGZsYWdzICYgT1BFUkFORF9TSElGVCkKLSAgICB7Ci0gICAgICAvKiBhbGwgc3BlY2lhbCBzaGlmdCBvcGVyYW5kcyBhcmUgdW5zaWduZWQgKi8KLSAgICAgIC8qIGFuZCA8PSAxNi4gIFdlIGFsbG93IDAgZm9yIG5vdy4gKi8KLSAgICAgIGlmIChudW0+MTYpCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChmbGFncyAmIE9QRVJBTkRfU0lHTkVEKQotICAgIHsKLSAgICAgIC8qIFNpZ25lZCAzLWJpdCBpbnRlZ2VycyBhcmUgcmVzdHJpY3RlZCB0byB0aGUgKC0yLCAzKSByYW5nZSAqLwotICAgICAgaWYgKGZsYWdzICYgUkVTVFJJQ1RFRF9OVU0zKQotCXsKLQkgIGlmICgobG9uZykgbnVtIDwgLTIgfHwgKGxvbmcpIG51bSA+IDMpCi0JICAgIHJldHZhbCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpIC0gMTsgCi0JICBtaW4gPSAtICgxIDw8IChiaXRzIC0gMSkpOyAgCi0JICBpZiAoKChsb25nKSBudW0gPiBtYXgpIHx8ICgobG9uZykgbnVtIDwgbWluKSkKLQkgICAgcmV0dmFsID0gMTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWF4ID0gKDEgPDwgYml0cykgLSAxOwotICAgICAgbWluID0gMDsKLSAgICAgIGlmICgobnVtID4gbWF4KSB8fCAobnVtIDwgbWluKSkKLQlyZXR2YWwgPSAxOwotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIkQxMFYgb3B0aW9uczpcblwKLS1PICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplLiAgV2lsbCBkbyBzb21lIG9wZXJhdGlvbnMgaW4gcGFyYWxsZWwuXG4iKSk7Ci19IAotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ08nOgotICAgICAgLyogT3B0aW1pemUuIFdpbGwgYXR0ZW1wdCB0byBwYXJhbGxlbGl6ZSBvcGVyYXRpb25zICovCi0gICAgICBPcHRpbWl6aW5nID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX05PV0FSTlNXQVA6Ci0gICAgICBmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKnQ7Ci0gIGludCBpOwotICAKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gIAotICAqc2l6ZVAgPSBwcmVjICogMjsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGZyYWdTICpmcmFnUDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICB2YWx1ZVQgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGU7Ci0gIGQxMHZfaGFzaCA9IGhhc2hfbmV3KCk7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUuICBUaGUgRDEwdiBpbnN0cnVjdGlvbiBzZXQKLSAgICAgaGFzIG1hbnkgaWRlbnRpY2FsIG9wY29kZSBuYW1lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG9wY29kZXMgYmFzZWQKLSAgICAgb24gdGhlIG9wZXJhbmRzLiAgVGhpcyBoYXNoIHRhYmxlIHRoZW4gcHJvdmlkZXMgYSBxdWljayBpbmRleCB0bwotICAgICB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLSAgZm9yIChvcGNvZGUgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopZDEwdl9vcGNvZGVzOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQl7Ci0JICBwcmV2X25hbWUgPSAoY2hhciAqKW9wY29kZS0+bmFtZTsKLQkgIGhhc2hfaW5zZXJ0IChkMTB2X2hhc2gsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKLQl9Ci0gICAgfQotCi0gIGZpeHVwcyA9ICZGaXhVcHNbMF07Ci0gIEZpeFVwc1swXS5uZXh0ID0gJkZpeFVwc1sxXTsKLSAgRml4VXBzWzFdLm5leHQgPSAmRml4VXBzWzBdOwotfQotCi0KLS8qIHRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgcG9zdGluY3JlbWVudCBvciBwb3N0ZGVjcmVtZW50Ci0gICBvcGVyYXRvciAoICcrJyBvciAnLScgKSBmcm9tIGFuIGV4cHJlc3Npb24gKi8KLQotc3RhdGljIGludCBwb3N0Zml4IChwKSAKLSAgICAgY2hhciAqcDsKLXsKLSAgd2hpbGUgKCpwICE9ICctJyAmJiAqcCAhPSAnKycpIAotICAgIHsKLSAgICAgIGlmICgqcD09MCB8fCAqcD09J1xuJyB8fCAqcD09J1xyJykgCi0JYnJlYWs7Ci0gICAgICBwKys7Ci0gICAgfQotCi0gIGlmICgqcCA9PSAnLScpIAotICAgIHsKLSAgICAgICpwID0gJyAnOwotICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotICBpZiAoKnAgPT0gJysnKSAKLSAgICB7Ci0gICAgICAqcCA9ICcgJzsKLSAgICAgIHJldHVybiAoMSk7Ci0gICAgfQotCi0gIHJldHVybiAoMCk7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAKLWdldF9yZWxvYyAob3ApIAotICAgICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcDsKLXsKLSAgaW50IGJpdHMgPSBvcC0+Yml0czsKLQotICBpZiAoYml0cyA8PSA0KSAKLSAgICByZXR1cm4gKDApOwotICAgICAgCi0gIGlmIChvcC0+ZmxhZ3MgJiBPUEVSQU5EX0FERFIpIAotICAgIHsKLSAgICAgIGlmIChiaXRzID09IDgpCi0JcmV0dXJuIChCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SKTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gKEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMKTsKLSAgICB9Ci0KLSAgcmV0dXJuIChCRkRfUkVMT0NfMTYpOwotfQotCi0KLS8qIGdldF9vcGVyYW5kcyBwYXJzZXMgYSBzdHJpbmcgb2Ygb3BlcmFuZHMgYW5kIHJldHVybnMKLSAgIGFuIGFycmF5IG9mIGV4cHJlc3Npb25zICovCi0KLXN0YXRpYyBpbnQKLWdldF9vcGVyYW5kcyAoZXhwKSAKLSAgICAgZXhwcmVzc2lvblMgZXhwW107Ci17Ci0gIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGludCBudW1vcHMgPSAwOwotICBpbnQgcG9zdCA9IDA7Ci0gIGludCB1c2VzX2F0ID0gMDsKLSAgCi0gIHdoaWxlICgqcCkgIAotICAgIHsKLSAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnLCcpIAotCXArKzsKLSAgICAgIGlmICgqcD09MCB8fCAqcD09J1xuJyB8fCAqcD09J1xyJykgCi0JYnJlYWs7Ci0gICAgICAKLSAgICAgIGlmICgqcCA9PSAnQCcpIAotCXsKLQkgIHVzZXNfYXQgPSAxOwotCSAgCi0JICBwKys7Ci0JICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7Ci0JICBpZiAoKnAgPT0gJygnKSAKLQkgICAgewotCSAgICAgIHArKzsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUUEFSOwotCSAgICB9Ci0JICBlbHNlIGlmICgqcCA9PSAnLScpIAotCSAgICB7Ci0JICAgICAgcCsrOwotCSAgICAgIGV4cFtudW1vcHNdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfQVRNSU5VUzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVFNJR047Ci0JICAgICAgcG9zdCA9IHBvc3RmaXggKHApOwotCSAgICB9Ci0JICBudW1vcHMrKzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKCpwID09ICcpJykgCi0JewotCSAgLyoganVzdCBza2lwIHRoZSB0cmFpbGluZyBwYXJlbiAqLwotCSAgcCsrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotCi0gICAgICAvKiBjaGVjayB0byBzZWUgaWYgaXQgbWlnaHQgYmUgYSByZWdpc3RlciBuYW1lICovCi0gICAgICBpZiAoIXJlZ2lzdGVyX25hbWUgKCZleHBbbnVtb3BzXSkpCi0JewotCSAgLyogcGFyc2UgYXMgYW4gZXhwcmVzc2lvbiAqLwotCSAgaWYgKHVzZXNfYXQpCi0JICAgIHsKLQkgICAgICAvKiBBbnkgZXhwcmVzc2lvbiB0aGF0IGludm9sdmVzIHRoZSBpbmRpcmVjdCBhZGRyZXNzaW5nCi0JCSBjYW5ub3QgYWxzbyBpbnZvbHZlIGltbWVkaWF0ZSBhZGRyZXNzaW5nLiAgVGhlcmVmb3JlCi0JCSB0aGUgdXNlIG9mIHRoZSBoYXNoIGNoYXJhY3RlciBpcyBpbGxlZ2FsLiAgKi8KLQkgICAgICBpbnQgc2F2ZSA9IGRvX25vdF9pZ25vcmVfaGFzaDsKLQkgICAgICBkb19ub3RfaWdub3JlX2hhc2ggPSAxOwotCSAgICAgIAotCSAgICAgIGV4cHJlc3Npb24gKCZleHBbbnVtb3BzXSk7Ci0JICAgICAgCi0JICAgICAgZG9fbm90X2lnbm9yZV9oYXNoID0gc2F2ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBleHByZXNzaW9uICgmZXhwW251bW9wc10pOwotCX0KLQotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJAd29yZCIsIDUpID09IDApCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0JICBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX3JlZ2lzdGVyKQotCSAgICB7Ci0JICAgICAgLyogaWYgaXQgbG9va2VkIGxpa2UgYSByZWdpc3RlciBuYW1lIGJ1dCB3YXMgZm9sbG93ZWQgYnkKLSAgICAgICAgICAgICAgICAgIkB3b3JkIiB0aGVuIGl0IHdhcyByZWFsbHkgYSBzeW1ib2wsIHNvIGNoYW5nZSBpdCB0bwotICAgICAgICAgICAgICAgICBvbmUgKi8KLQkgICAgICBleHBbbnVtb3BzXS5YX29wID0gT19zeW1ib2w7Ci0JICAgICAgZXhwW251bW9wc10uWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNoYXIgKilleHBbbnVtb3BzXS5YX29wX3N5bWJvbCk7Ci0JICAgIH0KLQotCSAgLyogY2hlY2sgZm9yIGlkZW50aWZpZXJAd29yZCtjb25zdGFudCAqLwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJysnKQotCSAgewotCSAgICBjaGFyICpvcmlnX2xpbmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIGV4cHJlc3Npb25TIG5ld19leHA7Ci0JICAgIGV4cHJlc3Npb24gKCZuZXdfZXhwKTsKLQkgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gbmV3X2V4cC5YX2FkZF9udW1iZXI7Ci0JICB9Ci0KLQkgIC8qIGNvbnZlcnQgZXhwciBpbnRvIGEgcmlnaHQgc2hpZnQgYnkgQVRfV09SRF9SSUdIVF9TSElGVCAqLwotCSAgewotCSAgICBleHByZXNzaW9uUyBuZXdfZXhwOwotCSAgICBtZW1zZXQgKCZuZXdfZXhwLCAwLCBzaXplb2YgbmV3X2V4cCk7Ci0JICAgIG5ld19leHAuWF9hZGRfbnVtYmVyID0gQVRfV09SRF9SSUdIVF9TSElGVDsKLQkgICAgbmV3X2V4cC5YX29wID0gT19jb25zdGFudDsKLQkgICAgbmV3X2V4cC5YX3Vuc2lnbmVkID0gMTsKLQkgICAgZXhwW251bW9wc10uWF9vcF9zeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sICgmbmV3X2V4cCk7Ci0JICAgIGV4cFtudW1vcHNdLlhfb3AgPSBPX3JpZ2h0X3NoaWZ0OwotCSAgfQotCi0JICBrbm93IChBVF9XT1JEX1AgKCZleHBbbnVtb3BzXSkpOwotCX0KLSAgICAgIAotICAgICAgaWYgKGV4cFtudW1vcHNdLlhfb3AgPT0gT19pbGxlZ2FsKSAKLQlhc19iYWQgKF8oImlsbGVnYWwgb3BlcmFuZCIpKTsKLSAgICAgIGVsc2UgaWYgKGV4cFtudW1vcHNdLlhfb3AgPT0gT19hYnNlbnQpIAotCWFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotCi0gICAgICBudW1vcHMrKzsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIHN3aXRjaCAocG9zdCkgCi0gICAgewotICAgIGNhc2UgLTE6CS8qIHBvc3RkZWNyZW1lbnQgbW9kZSAqLwotICAgICAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotICAgICAgZXhwW251bW9wcysrXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX01JTlVTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgkvKiBwb3N0aW5jcmVtZW50IG1vZGUgKi8KLSAgICAgIGV4cFtudW1vcHNdLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgIGV4cFtudW1vcHMrK10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9QTFVTOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGV4cFtudW1vcHNdLlhfb3AgPSAwOwotICByZXR1cm4gKG51bW9wcyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1kMTB2X2luc2VydF9vcGVyYW5kIChpbnNuLCBvcF90eXBlLCB2YWx1ZSwgbGVmdCwgZml4KSAKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgb3BfdHlwZTsKLSAgICAgb2Zmc2V0VCB2YWx1ZTsKLSAgICAgaW50IGxlZnQ7Ci0gICAgIGZpeFMgKmZpeDsKLXsKLSAgaW50IHNoaWZ0LCBiaXRzOwotCi0gIHNoaWZ0ID0gZDEwdl9vcGVyYW5kc1tvcF90eXBlXS5zaGlmdDsKLSAgaWYgKGxlZnQpCi0gICAgc2hpZnQgKz0gMTU7Ci0KLSAgYml0cyA9IGQxMHZfb3BlcmFuZHNbb3BfdHlwZV0uYml0czsKLQotICAvKiB0cnVuY2F0ZSB0byB0aGUgcHJvcGVyIG51bWJlciBvZiBiaXRzICovCi0gIGlmIChjaGVja19yYW5nZSAodmFsdWUsIGJpdHMsIGQxMHZfb3BlcmFuZHNbb3BfdHlwZV0uZmxhZ3MpKQotICAgIGFzX2JhZF93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlOiAlZCIpLCB2YWx1ZSk7Ci0KLSAgdmFsdWUgJj0gMHg3RkZGRkZGRiA+PiAoMzEgLSBiaXRzKTsKLSAgaW5zbiB8PSAodmFsdWUgPDwgc2hpZnQpOwotCi0gIHJldHVybiBpbnNuOwotfQotCi0KLS8qIGJ1aWxkX2luc24gdGFrZXMgYSBwb2ludGVyIHRvIHRoZSBvcGNvZGUgZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZQotICAgYW5kIHRoZSBhcnJheSBvZiBvcGVyYW5kIGV4cHJlc3Npb25zIGFuZCByZXR1cm5zIHRoZSBpbnN0cnVjdGlvbiAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotYnVpbGRfaW5zbiAob3Bjb2RlLCBvcGVycywgaW5zbikgCi0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyAqb3BlcnM7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLXsKLSAgaW50IGksIGJpdHMsIHNoaWZ0LCBmbGFncywgZm9ybWF0OwotICB1bnNpZ25lZCBsb25nIG51bWJlcjsKLSAgCi0gIC8qIHRoZSBpbnNuIGFyZ3VtZW50IGlzIG9ubHkgdXNlZCBmb3IgdGhlIERJVlMga2x1ZGdlICovCi0gIGlmIChpbnNuKQotICAgIGZvcm1hdCA9IExPTkdfUjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGluc24gPSBvcGNvZGUtPm9wY29kZTsKLSAgICAgIGZvcm1hdCA9IG9wY29kZS0+Zm9ybWF0OwotICAgIH0KLSAgCi0gIGZvciAoaT0wO29wY29kZS0+b3BlcmFuZHNbaV07aSsrKSAKLSAgICB7Ci0gICAgICBmbGFncyA9IGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7Ci0gICAgICBiaXRzID0gZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5iaXRzOwotICAgICAgc2hpZnQgPSBkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLnNoaWZ0OwotICAgICAgbnVtYmVyID0gb3BlcnNbaV0uWF9hZGRfbnVtYmVyOwotCi0gICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykgCi0JewotCSAgbnVtYmVyICY9IFJFR0lTVEVSX01BU0s7Ci0JICBpZiAoZm9ybWF0ID09IExPTkdfTCkKLQkgICAgc2hpZnQgKz0gMTU7Ci0JfQotCi0gICAgICBpZiAob3BlcnNbaV0uWF9vcCAhPSBPX3JlZ2lzdGVyICYmIG9wZXJzW2ldLlhfb3AgIT0gT19jb25zdGFudCkgCi0JewotCSAgLyogbm93IGNyZWF0ZSBhIGZpeHVwICovCi0KLQkgIGlmIChmaXh1cHMtPmZjID49IE1BWF9JTlNOX0ZJWFVQUykKLQkgICAgYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQotCSAgaWYgKEFUX1dPUkRfUCAoJm9wZXJzW2ldKSkKLQkgICAgewotCSAgICAgIC8qIFJlY29uaXplIFhYWD4+MStOIGFrYSBYWFhAd29yZCtOIGFzIHNwZWNpYWwgKEFUX1dPUkQpICovCi0JICAgICAgZml4dXBzLT5maXhbZml4dXBzLT5mY10ucmVsb2MgPSBCRkRfUkVMT0NfRDEwVl8xODsKLQkgICAgICBvcGVyc1tpXS5YX29wID0gT19zeW1ib2w7Ci0JICAgICAgb3BlcnNbaV0uWF9vcF9zeW1ib2wgPSBOVUxMOyAvKiBTaG91bGQgZnJlZSBpdCAqLwotCSAgICAgIC8qIG51bWJlciBpcyBsZWZ0IHNoaWZ0ZWQgYnkgQVRfV09SRF9SSUdIVF9TSElGVCBzbwotICAgICAgICAgICAgICAgICB0aGF0LCBpdCBpcyBhbGlnbmVkIHdpdGggdGhlIHN5bWJvbCdzIHZhbHVlLiAgTGF0ZXIsCi0gICAgICAgICAgICAgICAgIEJGRF9SRUxPQ19EMTBWXzE4IHdpbGwgcmlnaHQgc2hpZnQgKHN5bWJvbF92YWx1ZSArCi0gICAgICAgICAgICAgICAgIFhfYWRkX251bWJlcikuICovCi0JICAgICAgbnVtYmVyIDw8PSBBVF9XT1JEX1JJR0hUX1NISUZUOwotCSAgICAgIG9wZXJzW2ldLlhfYWRkX251bWJlciA9IG51bWJlcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5yZWxvYyA9IAotCSAgICAgIGdldF9yZWxvYygoc3RydWN0IGQxMHZfb3BlcmFuZCAqKSZkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dKTsKLQotCSAgaWYgKGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID09IEJGRF9SRUxPQ18xNiB8fCAKLQkgICAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5yZWxvYyA9PSBCRkRfUkVMT0NfRDEwVl8xOCkKLQkgICAgZml4dXBzLT5maXhbZml4dXBzLT5mY10uc2l6ZSA9IDI7IAkgICAgCi0JICBlbHNlCi0JICAgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnNpemUgPSA0OwotIAkgICAgCi0JICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5leHAgPSBvcGVyc1tpXTsKLQkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLm9wZXJhbmQgPSBvcGNvZGUtPm9wZXJhbmRzW2ldOwotCSAgZml4dXBzLT5maXhbZml4dXBzLT5mY10ucGNyZWwgPSAoZmxhZ3MgJiBPUEVSQU5EX0FERFIpID8gdHJ1ZSA6IGZhbHNlOwotCSAgKGZpeHVwcy0+ZmMpKys7Ci0JfQotCi0gICAgICAvKiB0cnVuY2F0ZSB0byB0aGUgcHJvcGVyIG51bWJlciBvZiBiaXRzICovCi0gICAgICBpZiAoKG9wZXJzW2ldLlhfb3AgPT0gT19jb25zdGFudCkgJiYgY2hlY2tfcmFuZ2UgKG51bWJlciwgYml0cywgZmxhZ3MpKQotCWFzX2JhZCAoXygib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVkIiksbnVtYmVyKTsKLSAgICAgIG51bWJlciAmPSAweDdGRkZGRkZGID4+ICgzMSAtIGJpdHMpOwotICAgICAgaW5zbiA9IGluc24gfCAobnVtYmVyIDw8IHNoaWZ0KTsKLSAgICB9Ci0KLSAgLyoga2x1ZGdlOiBmb3IgRElWUywgd2UgbmVlZCB0byBwdXQgdGhlIG9wZXJhbmRzIGluIHR3aWNlICovCi0gIC8qIG9uIHRoZSBzZWNvbmQgcGFzcywgZm9ybWF0IGlzIGNoYW5nZWQgdG8gTE9OR19SIHRvIGZvcmNlICovCi0gIC8qIHRoZSBzZWNvbmQgc2V0IG9mIG9wZXJhbmRzIHRvIG5vdCBiZSBzaGlmdGVkIG92ZXIgMTUgKi8KLSAgaWYgKChvcGNvZGUtPm9wY29kZSA9PSBPUENPREVfRElWUykgJiYgKGZvcm1hdD09TE9OR19MKSkKLSAgICBpbnNuID0gYnVpbGRfaW5zbiAob3Bjb2RlLCBvcGVycywgaW5zbik7Ci0gICAgICAKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIHdyaXRlIG91dCBhIGxvbmcgZm9ybSBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHZvaWQKLXdyaXRlX2xvbmcgKG9wY29kZSwgaW5zbiwgZngpIAotICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBGaXh1cHMgKmZ4OwotewotICBpbnQgaSwgd2hlcmU7Ci0gIGNoYXIgKmYgPSBmcmFnX21vcmUoNCk7Ci0KLSAgaW5zbiB8PSBGTTExOwotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCA0KTsKLQotICBmb3IgKGk9MDsgaSA8IGZ4LT5mYzsgaSsrKSAKLSAgICB7Ci0gICAgICBpZiAoZngtPmZpeFtpXS5yZWxvYykKLQl7IAotCSAgd2hlcmUgPSBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWw7IAotCSAgaWYgKGZ4LT5maXhbaV0uc2l6ZSA9PSAyKQotCSAgICB3aGVyZSArPSAyOwotCi0JICBpZiAoZngtPmZpeFtpXS5yZWxvYyA9PSBCRkRfUkVMT0NfRDEwVl8xOCkKLQkgICAgZngtPmZpeFtpXS5vcGVyYW5kIHw9IDQwOTY7CSAgCi0KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIHdoZXJlLAotCQkgICAgICAgZngtPmZpeFtpXS5zaXplLAotCQkgICAgICAgJihmeC0+Zml4W2ldLmV4cCksCi0JCSAgICAgICBmeC0+Zml4W2ldLnBjcmVsLAotCQkgICAgICAgZngtPmZpeFtpXS5vcGVyYW5kfDIwNDgpOwotCX0KLSAgICB9Ci0gIGZ4LT5mYyA9IDA7Ci19Ci0KLQotLyogd3JpdGUgb3V0IGEgc2hvcnQgZm9ybSBpbnN0cnVjdGlvbiBieSBpdHNlbGYgKi8KLXN0YXRpYyB2b2lkCi13cml0ZV8xX3Nob3J0IChvcGNvZGUsIGluc24sIGZ4KSAKLSAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgRml4dXBzICpmeDsKLXsKLSAgY2hhciAqZiA9IGZyYWdfbW9yZSg0KTsKLSAgaW50IGksIHdoZXJlOwotCi0gIGlmIChvcGNvZGUtPmV4ZWNfdHlwZSAmIFBBUk9OTFkpCi0gICAgYXNfZmF0YWwgKF8oIkluc3RydWN0aW9uIG11c3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwgd2l0aCBhbm90aGVyIGluc3RydWN0aW9uLiIpKTsKLQotICAvKiB0aGUgb3RoZXIgY29udGFpbmVyIG5lZWRzIHRvIGJlIE5PUCAqLwotICAvKiBhY2NvcmRpbmcgdG8gNC4zLjE6IGZvciBGTT0wMCwgc3ViLWluc3RydWN0aW9ucyBwZXJmb3JtZWQgb25seQotICAgICBieSBJVSBjYW5ub3QgYmUgZW5jb2RlZCBpbiBMLWNvbnRhaW5lci4gKi8KLSAgaWYgKG9wY29kZS0+dW5pdCA9PSBJVSkKLSAgICBpbnNuIHw9IEZNMDAgfCAoTk9QIDw8IDE1KTsJCS8qIHJpZ2h0IGNvbnRhaW5lciAqLwotICBlbHNlCi0gICAgaW5zbiA9IEZNMDAgfCAoaW5zbiA8PCAxNSkgfCBOT1A7CS8qIGxlZnQgY29udGFpbmVyICovCi0KLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgNCk7Ci0gIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotICAgIHsKLSAgICAgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCXsgCi0JICB3aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsgCi0JICBpZiAoZngtPmZpeFtpXS5zaXplID09IDIpCi0JICAgIHdoZXJlICs9IDI7Ci0KLQkgIGlmIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzE4KQotCSAgICBmeC0+Zml4W2ldLm9wZXJhbmQgfD0gNDA5NjsJICAKLQotCSAgLyogaWYgaXQncyBhbiBSIHJlbG9jLCB3ZSBtYXkgaGF2ZSB0byBzd2l0Y2ggaXQgdG8gTCAqLwotCSAgaWYgKCAoZngtPmZpeFtpXS5yZWxvYyA9PSBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SKSAmJiAob3Bjb2RlLT51bml0ICE9IElVKSApCi0JICAgIGZ4LT5maXhbaV0ub3BlcmFuZCB8PSAxMDI0OwotCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICB3aGVyZSwgCi0JCSAgICAgICBmeC0+Zml4W2ldLnNpemUsCi0JCSAgICAgICAmKGZ4LT5maXhbaV0uZXhwKSwKLQkJICAgICAgIGZ4LT5maXhbaV0ucGNyZWwsCi0JCSAgICAgICBmeC0+Zml4W2ldLm9wZXJhbmR8MjA0OCk7Ci0JfQotICAgIH0KLSAgZngtPmZjID0gMDsKLX0KLQotLyogd3JpdGUgb3V0IGEgc2hvcnQgZm9ybSBpbnN0cnVjdGlvbiBpZiBwb3NzaWJsZSAqLwotLyogcmV0dXJuIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgbm90IHdyaXR0ZW4gb3V0ICovCi1zdGF0aWMgaW50Ci13cml0ZV8yX3Nob3J0IChvcGNvZGUxLCBpbnNuMSwgb3Bjb2RlMiwgaW5zbjIsIGV4ZWNfdHlwZSwgZngpIAotICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTEsICpvcGNvZGUyOwotICAgICB1bnNpZ25lZCBsb25nIGluc24xLCBpbnNuMjsKLSAgICAgaW50IGV4ZWNfdHlwZTsKLSAgICAgRml4dXBzICpmeDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBjaGFyICpmOwotICBpbnQgaSxqLCB3aGVyZTsKLQotICBpZiAoIChleGVjX3R5cGUgIT0gMSkgJiYgKChvcGNvZGUxLT5leGVjX3R5cGUgJiBQQVJPTkxZKQotCSAgICAgICAgICAgICAgICB8fCAob3Bjb2RlMi0+ZXhlY190eXBlICYgUEFST05MWSkpKQotICAgIGFzX2ZhdGFsIChfKCJJbnN0cnVjdGlvbiBtdXN0IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIikpOwotICAKLSAgaWYgKCAob3Bjb2RlMS0+Zm9ybWF0ICYgTE9OR19PUENPREUpIHx8IChvcGNvZGUyLT5mb3JtYXQgJiBMT05HX09QQ09ERSkpCi0gICAgYXNfZmF0YWwgKF8oIkxvbmcgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgY29tYmluZWQuIikpOwotCi0gIGlmKG9wY29kZTEtPmV4ZWNfdHlwZSAmIEJSQU5DSF9MSU5LICYmIGV4ZWNfdHlwZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIEluc3RydWN0aW9ucyBwYWlyZWQgd2l0aCBhIHN1YnJvdXRpbmUgY2FsbCBhcmUgZXhlY3V0ZWQgYmVmb3JlIHRoZQotCSBzdWJyb3V0aW5lLCBzbyBkb24ndCBkbyB0aGVzZSBwYWlyaW5ncyB1bmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQuICAqLwotICAgICAgd3JpdGVfMV9zaG9ydCAob3Bjb2RlMSwgaW5zbjEsIGZ4LT5uZXh0KTsKLSAgICAgIHJldHVybiAoMSk7Ci0gICAgfQotCi0gIHN3aXRjaCAoZXhlY190eXBlKSAKLSAgICB7Ci0gICAgY2FzZSAwOgkvKiBvcmRlciBub3Qgc3BlY2lmaWVkICovCi0gICAgICBpZiAoIE9wdGltaXppbmcgJiYgcGFyYWxsZWxfb2sgKG9wY29kZTEsIGluc24xLCBvcGNvZGUyLCBpbnNuMiwgZXhlY190eXBlKSkKLQl7Ci0JICAvKiBwYXJhbGxlbCAqLwotCSAgaWYgKG9wY29kZTEtPnVuaXQgPT0gSVUpCi0JICAgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOwotCSAgZWxzZSBpZiAob3Bjb2RlMi0+dW5pdCA9PSBNVSkKLQkgICAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnNuID0gRk0wMCB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsgIAotCSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUxLT51bml0ID09IElVKSAKLQl7Ci0JICAvKiByZXZlcnNlIHNlcXVlbnRpYWwgKi8KLQkgIGluc24gPSBGTTEwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBzZXF1ZW50aWFsICovCi0JICBpbnNuID0gRk0wMSB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsKLQkgIGZ4ID0gZngtPm5leHQ7ICAKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6CS8qIHBhcmFsbGVsICovCi0gICAgICBpZiAob3Bjb2RlMS0+ZXhlY190eXBlICYgU0VRIHx8IG9wY29kZTItPmV4ZWNfdHlwZSAmIFNFUSkKLQlhc19mYXRhbCAoXygiT25lIG9mIHRoZXNlIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiIpKTsKLQotICAgICAgaWYgKG9wY29kZTEtPnVuaXQgPT0gSVUpCi0JewotCSAgaWYgKG9wY29kZTItPnVuaXQgPT0gSVUpCi0JICAgIGFzX2ZhdGFsIChfKCJUd28gSVUgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0gICAgICAgICAgaWYgKCFmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKQotCSAgICBhc193YXJuIChfKCJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIpKTsKLSAJICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAxNSkgfCBpbnNuMTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUyLT51bml0ID09IE1VKQotCXsKLQkgIGlmIChvcGNvZGUxLT51bml0ID09IE1VKQotCSAgICBhc19mYXRhbCAoXygiVHdvIE1VIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIikpOwotICAgICAgICAgIGlmICghZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCkKLQkgICAgYXNfd2FybiAoXygiU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIiKSk7Ci0JICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAxNSkgfCBpbnNuMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW5zbiA9IEZNMDAgfCAoaW5zbjEgPDwgMTUpIHwgaW5zbjI7ICAKLQkgIGZ4ID0gZngtPm5leHQ7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgkvKiBzZXF1ZW50aWFsICovCi0gICAgICBpZiAob3Bjb2RlMS0+dW5pdCAhPSBJVSkKLQlpbnNuID0gRk0wMSB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsgIAotICAgICAgZWxzZSBpZiAob3Bjb2RlMi0+dW5pdCA9PSBNVSB8fCBvcGNvZGUyLT51bml0ID09IEVJVEhFUikKLQl7Ci0gICAgICAgICAgaWYgKCFmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKQotCSAgICBhc193YXJuIChfKCJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIpKTsKLQkgIGluc24gPSBGTTEwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOyAgCi0JfQotICAgICAgZWxzZQotCWFzX2ZhdGFsIChfKCJJVSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGluIHRoZSBsZWZ0IGNvbnRhaW5lciIpKTsKLSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6CS8qIHJldmVyc2Ugc2VxdWVudGlhbCAqLwotICAgICAgaWYgKG9wY29kZTItPnVuaXQgIT0gTVUpCi0JaW5zbiA9IEZNMTAgfCAoaW5zbjEgPDwgMTUpIHwgaW5zbjI7Ci0gICAgICBlbHNlIGlmIChvcGNvZGUxLT51bml0ID09IElVIHx8IG9wY29kZTEtPnVuaXQgPT0gRUlUSEVSKQotCXsKLSAgICAgICAgICBpZiAoIWZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApCi0JICAgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOwotCSAgaW5zbiA9IEZNMDEgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7ICAKLQl9Ci0gICAgICBlbHNlCi0JYXNfZmF0YWwgKF8oIk1VIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIHJpZ2h0IGNvbnRhaW5lciIpKTsKLSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oInVua25vd24gZXhlY3V0aW9uIHR5cGUgcGFzc2VkIHRvIHdyaXRlXzJfc2hvcnQoKSIpKTsKLSAgICB9Ci0KLSAgZiA9IGZyYWdfbW9yZSg0KTsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgNCk7Ci0KLSAgZm9yIChqPTA7IGo8MjsgaisrKSAKLSAgICB7Ci0gICAgICBmb3IgKGk9MDsgaSA8IGZ4LT5mYzsgaSsrKSAKLQl7Ci0JICBpZiAoZngtPmZpeFtpXS5yZWxvYykKLQkgICAgewotCSAgICAgIHdoZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOyAKLQkgICAgICBpZiAoZngtPmZpeFtpXS5zaXplID09IDIpCi0JCXdoZXJlICs9IDI7Ci0JICAgICAgCi0JICAgICAgaWYgKCAoZngtPmZpeFtpXS5yZWxvYyA9PSBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SKSAmJiAoaiA9PSAwKSApCi0JCWZ4LT5maXhbaV0ub3BlcmFuZCB8PSAxMDI0OwotCSAgICAgIAotCSAgICAgIGlmIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzE4KQotCQlmeC0+Zml4W2ldLm9wZXJhbmQgfD0gNDA5NjsJICAKLQotCSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJCSAgIHdoZXJlLCAKLQkJCSAgIGZ4LT5maXhbaV0uc2l6ZSwKLQkJCSAgICYoZngtPmZpeFtpXS5leHApLAotCQkJICAgZngtPmZpeFtpXS5wY3JlbCwKLQkJCSAgIGZ4LT5maXhbaV0ub3BlcmFuZHwyMDQ4KTsKLQkgICAgfQotCX0KLSAgICAgIGZ4LT5mYyA9IDA7Ci0gICAgICBmeCA9IGZ4LT5uZXh0OwotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KLQotCi0vKiBDaGVjayAyIGluc3RydWN0aW9ucyBhbmQgZGV0ZXJtaW5lIGlmIHRoZXkgY2FuIGJlIHNhZmVseSAqLwotLyogZXhlY3V0ZWQgaW4gcGFyYWxsZWwuICBSZXR1cm5zIDEgaWYgdGhleSBjYW4gYmUuICAgICAgICAgKi8KLXN0YXRpYyBpbnQKLXBhcmFsbGVsX29rIChvcDEsIGluc24xLCBvcDIsIGluc24yLCBleGVjX3R5cGUpCi0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3AxLCAqb3AyOwotICAgICB1bnNpZ25lZCBsb25nIGluc24xLCBpbnNuMjsKLSAgICAgaW50IGV4ZWNfdHlwZTsKLXsKLSAgaW50IGksIGosIGZsYWdzLCBtYXNrLCBzaGlmdCwgcmVnbm87Ci0gIHVuc2lnbmVkIGxvbmcgaW5zLCBtb2RbMl0sIHVzZWRbMl07Ci0gIHN0cnVjdCBkMTB2X29wY29kZSAqb3A7Ci0KLSAgaWYgKChvcDEtPmV4ZWNfdHlwZSAmIFNFUSkgIT0gMCB8fCAob3AyLT5leGVjX3R5cGUgJiBTRVEpICE9IDAKLSAgICAgIHx8IChvcDEtPmV4ZWNfdHlwZSAmIFBBUikgPT0gMCB8fCAob3AyLT5leGVjX3R5cGUgJiBQQVIpID09IDAKLSAgICAgIHx8IChvcDEtPnVuaXQgPT0gQk9USCkgfHwgKG9wMi0+dW5pdCA9PSBCT1RIKQotICAgICAgfHwgKG9wMS0+dW5pdCA9PSBJVSAmJiBvcDItPnVuaXQgPT0gSVUpCi0gICAgICB8fCAob3AxLT51bml0ID09IE1VICYmIG9wMi0+dW5pdCA9PSBNVSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogSWYgdGhlIGZpcnN0IGluc3RydWN0aW9uIGlzIGEgYnJhbmNoIGFuZCB0aGlzIGlzIGF1dG8gcGFyYWxsYXphdGlvbiwKLSAgICAgZG9uJ3QgY29tYmluZSB3aXRoIGFueSBzZWNvbmQgaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAoZXhlY190eXBlID09IDAgJiYgKG9wMS0+ZXhlY190eXBlICYgQlJBTkNIKSAhPSAwKQotICAgIHJldHVybiAwOwotCi0gIC8qIFRoZSBpZGVhIGhlcmUgaXMgdG8gY3JlYXRlIHR3byBzZXRzIG9mIGJpdG1hc2tzIChtb2QgYW5kIHVzZWQpCi0gICAgIHdoaWNoIGluZGljYXRlIHdoaWNoIHJlZ2lzdGVycyBhcmUgbW9kaWZpZWQgb3IgdXNlZCBieSBlYWNoCi0gICAgIGluc3RydWN0aW9uLiAgVGhlIG9wZXJhdGlvbiBjYW4gb25seSBiZSBkb25lIGluIHBhcmFsbGVsIGlmCi0gICAgIGluc3RydWN0aW9uIDEgYW5kIGluc3RydWN0aW9uIDIgbW9kaWZ5IGRpZmZlcmVudCByZWdpc3RlcnMsIGFuZAotICAgICB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbW9kaWZ5IHJlZ2lzdGVycyB0aGF0IHRoZSBzZWNvbmQKLSAgICAgaXMgdXNpbmcgKFRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gY2FuIG1vZGlmeSByZWdpc3RlcnMgdGhhdCB0aGUKLSAgICAgZmlyc3QgaXMgdXNpbmcgYXMgdGhleSBhcmUgb25seSB3cml0dGVuIGJhY2sgYWZ0ZXIgdGhlIGZpcnN0Ci0gICAgIGluc3RydWN0aW9uIGhhcyBjb21wbGV0ZWQpLiAgQWNjZXNzZXMgdG8gY29udHJvbCByZWdpc3RlcnMsIFBTVywKLSAgICAgYW5kIG1lbW9yeSBhcmUgdHJlYXRlZCBhcyBhY2Nlc3NlcyB0byBhIHNpbmdsZSByZWdpc3Rlci4gIFNvIGlmCi0gICAgIGJvdGggaW5zdHJ1Y3Rpb25zIHdyaXRlIG1lbW9yeSBvciBpZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gd3JpdGVzCi0gICAgIG1lbW9yeSBhbmQgdGhlIHNlY29uZCByZWFkcywgdGhlbiB0aGV5IGNhbm5vdCBiZSBkb25lIGluCi0gICAgIHBhcmFsbGVsLiAgTGlrZXdpc2UsIGlmIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBtdWNrcyB3aXRoIHRoZSBwc3cKLSAgICAgYW5kIHRoZSBzZWNvbmQgcmVhZHMgdGhlIFBTVyAod2hpY2ggaW5jbHVkZXMgQywgRjAsIGFuZCBGMSksIHRoZW4KLSAgICAgdGhleSBjYW5ub3Qgb3BlcmF0ZSBzYWZlbHkgaW4gcGFyYWxsZWwuICovCi0KLSAgLyogdGhlIGJpdG1hc2tzIChtb2QgYW5kIHVzZWQpIGxvb2sgbGlrZSB0aGlzIChiaXQgMzEgPSBNU0IpICovCi0gIC8qIHIwLXIxNQkgIDAtMTUgICovCi0gIC8qIGEwLWExCSAgMTYtMTcgKi8KLSAgLyogY3IgKG5vdCBwc3cpIDE4ICAgICovCi0gIC8qIHBzdwkgIDE5ICAgICovCi0gIC8qIG1lbQkgIDIwICAgICovCi0KLSAgZm9yIChqPTA7ajwyO2orKykKLSAgICB7Ci0gICAgICBpZiAoaiA9PSAwKQotCXsKLQkgIG9wID0gb3AxOwotCSAgaW5zID0gaW5zbjE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wID0gb3AyOwotCSAgaW5zID0gaW5zbjI7Ci0JfQotICAgICAgbW9kW2pdID0gdXNlZFtqXSA9IDA7Ci0gICAgICBpZiAob3AtPmV4ZWNfdHlwZSAmIEJSQU5DSF9MSU5LKQotCW1vZFtqXSB8PSAxIDw8IDEzOwotCi0gICAgICBmb3IgKGkgPSAwOyBvcC0+b3BlcmFuZHNbaV07IGkrKykKLQl7Ci0JICBmbGFncyA9IGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQkgIHNoaWZ0ID0gZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaV1dLnNoaWZ0OwotCSAgbWFzayA9IDB4N0ZGRkZGRkYgPj4gKDMxIC0gZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaV1dLmJpdHMpOwotCSAgaWYgKGZsYWdzICYgT1BFUkFORF9SRUcpCi0JICAgIHsKLQkgICAgICByZWdubyA9IChpbnMgPj4gc2hpZnQpICYgbWFzazsKLQkgICAgICBpZiAoZmxhZ3MgJiAoT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMSkpCi0JCXJlZ25vICs9IDE2OwotCSAgICAgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9DT05UUk9MKQkvKiBtdnRjIG9yIG12ZmMgKi8KLQkJeyAKLQkJICBpZiAocmVnbm8gPT0gMCkKLQkJICAgIHJlZ25vID0gMTk7Ci0JCSAgZWxzZQotCQkgICAgcmVnbm8gPSAxODsgCi0JCX0KLQkgICAgICBlbHNlIGlmIChmbGFncyAmIChPUEVSQU5EX0ZGTEFHfE9QRVJBTkRfQ0ZMQUcpKQotCQlyZWdubyA9IDE5OwotCSAgICAgIAotCSAgICAgIGlmICggZmxhZ3MgJiBPUEVSQU5EX0RFU1QgKQotCQl7Ci0JCSAgbW9kW2pdIHw9IDEgPDwgcmVnbm87Ci0JCSAgaWYgKGZsYWdzICYgT1BFUkFORF9FVkVOKQotCQkgICAgbW9kW2pdIHw9IDEgPDwgKHJlZ25vICsgMSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB1c2VkW2pdIHw9IDEgPDwgcmVnbm8gOwotCQkgIGlmIChmbGFncyAmIE9QRVJBTkRfRVZFTikKLQkJICAgIHVzZWRbal0gfD0gMSA8PCAocmVnbm8gKyAxKTsKLQotCQkgIC8qIEF1dG8gaW5jL2RlYyBhbHNvIG1vZGlmaWVzIHRoZSByZWdpc3Rlci4gICovCi0JCSAgaWYgKG9wLT5vcGVyYW5kc1tpKzFdICE9IDAKLQkJICAgICAgJiYgKGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzCi0JCQkgICYgKE9QRVJBTkRfUExVUyB8IE9QRVJBTkRfTUlOVVMpKSAhPSAwKQotCQkgICAgbW9kW2pdIHw9IDEgPDwgcmVnbm87Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX0FUTUlOVVMpCi0JICAgIHsKLQkgICAgICAvKiBTUCBpbXBsaWNpdGx5IHVzZWQvbW9kaWZpZWQgKi8KLQkgICAgICBtb2Rbal0gfD0gMSA8PCAxNTsKLQkgICAgICB1c2VkW2pdIHw9IDEgPDwgMTU7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAob3AtPmV4ZWNfdHlwZSAmIFJNRU0pCi0JdXNlZFtqXSB8PSAxIDw8IDIwOwotICAgICAgZWxzZSBpZiAob3AtPmV4ZWNfdHlwZSAmIFdNRU0pCi0JbW9kW2pdIHw9IDEgPDwgMjA7Ci0gICAgICBlbHNlIGlmIChvcC0+ZXhlY190eXBlICYgUkYwKQotCXVzZWRbal0gfD0gMSA8PCAxOTsKLSAgICAgIGVsc2UgaWYgKG9wLT5leGVjX3R5cGUgJiBXRjApCi0JbW9kW2pdIHw9IDEgPDwgMTk7Ci0gICAgICBlbHNlIGlmIChvcC0+ZXhlY190eXBlICYgV0NBUikKLQltb2Rbal0gfD0gMSA8PCAxOTsKLSAgICB9Ci0gIGlmICgobW9kWzBdICYgbW9kWzFdKSA9PSAwICYmIChtb2RbMF0gJiB1c2VkWzFdKSA9PSAwKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgc3RyIHBvaW50cyB0byBhCi0gICBtYWNoaW5lLWRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdCB0aGUgZnJhZ3MvYnl0ZXMgCi0gICBpdCBhc3NlbWJsZXMgdG8uICBGb3IgdGhlIEQxMFYsIGl0IG1vc3RseSBoYW5kbGVzIHRoZSBzcGVjaWFsIFZMSVcgcGFyc2luZyBhbmQgcGFja2luZwotICAgYW5kIGxlYXZlcyB0aGUgZGlmZmljdWx0IHN0dWZmIHRvIGRvX2Fzc2VtYmxlKCkuCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl9pbnNuOwotc3RhdGljIHN0cnVjdCBkMTB2X29wY29kZSAqcHJldl9vcGNvZGUgPSAwOwotc3RhdGljIHN1YnNlZ1QgcHJldl9zdWJzZWc7Ci1zdGF0aWMgc2VnVCBwcmV2X3NlZyA9IDA7Owotc3RhdGljIGludCBldHlwZSA9IDA7CQkvKiBzYXZlZCBleHR5cGUuICB1c2VkIGZvciBtdWx0aWxpbmUgaW5zdHJ1Y3Rpb25zICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICogb3Bjb2RlOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGludCBleHR5cGUgPSAwOwkJLyogZXhlY3V0aW9uIHR5cGU7IHBhcmFsbGVsLCBldGMgKi8KLSAgY2hhciAqIHN0cjI7Ci0KLSAgaWYgKGV0eXBlID09IDApCi0gICAgewotICAgICAgLyogbG9vayBmb3IgdGhlIHNwZWNpYWwgbXVsdGlwbGUgaW5zdHJ1Y3Rpb24gc2VwYXJhdG9ycyAqLwotICAgICAgc3RyMiA9IHN0cnN0ciAoc3RyLCAifHwiKTsKLSAgICAgIGlmIChzdHIyKSAKLQlleHR5cGUgPSAxOwotICAgICAgZWxzZQotCXsKLQkgIHN0cjIgPSBzdHJzdHIgKHN0ciwgIi0+Iik7Ci0JICBpZiAoc3RyMikgCi0JICAgIGV4dHlwZSA9IDI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHIyID0gc3Ryc3RyIChzdHIsICI8LSIpOwotCSAgICAgIGlmIChzdHIyKSAKLQkJZXh0eXBlID0gMzsKLQkgICAgfQotCX0KLSAgICAgIC8qIHN0cjIgcG9pbnRzIHRvIHRoZSBzZXBhcmF0b3IsIGlmIG9uZSAqLwotICAgICAgaWYgKHN0cjIpIAotCXsKLQkgICpzdHIyID0gMDsKLQkgIAotCSAgLyogaWYgdHdvIGluc3RydWN0aW9ucyBhcmUgcHJlc2VudCBhbmQgd2UgYWxyZWFkeSBoYXZlIG9uZSBzYXZlZAotCSAgICAgdGhlbiBmaXJzdCB3cml0ZSBpdCBvdXQgKi8KLQkgIGQxMHZfY2xlYW51cCAoKTsKLQkgIAotCSAgLyogYXNzZW1ibGUgZmlyc3QgaW5zdHJ1Y3Rpb24gYW5kIHNhdmUgaXQgKi8KLQkgIHByZXZfaW5zbiA9IGRvX2Fzc2VtYmxlIChzdHIsICZwcmV2X29wY29kZSk7Ci0JICBpZiAocHJldl9pbnNuID09IC0xKQotCSAgICBhc19mYXRhbCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotCSAgZml4dXBzID0gZml4dXBzLT5uZXh0OwotCSAgc3RyID0gc3RyMiArIDI7Ci0JfQotICAgIH0KLQotICBpbnNuID0gZG9fYXNzZW1ibGUgKHN0ciwgJm9wY29kZSk7Ci0gIGlmIChpbnNuID09IC0xKQotICAgIHsKLSAgICAgIGlmIChleHR5cGUpCi0JewotCSAgZXR5cGUgPSBleHR5cGU7Ci0JICByZXR1cm47Ci0JfQotICAgICAgYXNfZmF0YWwgKF8oImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICB9Ci0KLSAgaWYgKGV0eXBlKQotICAgIHsKLSAgICAgIGV4dHlwZSA9IGV0eXBlOwotICAgICAgZXR5cGUgPSAwOwotICAgIH0KLQotICAvKiBpZiB0aGlzIGlzIGEgbG9uZyBpbnN0cnVjdGlvbiwgd3JpdGUgaXQgYW5kIGFueSBwcmV2aW91cyBzaG9ydCBpbnN0cnVjdGlvbiAqLwotICBpZiAob3Bjb2RlLT5mb3JtYXQgJiBMT05HX09QQ09ERSkgCi0gICAgewotICAgICAgaWYgKGV4dHlwZSkgCi0JYXNfZmF0YWwgKF8oIlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZCIpKTsKLSAgICAgIGQxMHZfY2xlYW51cCAoKTsKLSAgICAgIHdyaXRlX2xvbmcgKG9wY29kZSwgaW5zbiwgZml4dXBzKTsKLSAgICAgIHByZXZfb3Bjb2RlID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICBpZiAocHJldl9vcGNvZGUgJiYgcHJldl9zZWcgJiYgKChwcmV2X3NlZyAhPSBub3dfc2VnKSB8fCAocHJldl9zdWJzZWcgIT0gbm93X3N1YnNlZykpKQotICAgIGQxMHZfY2xlYW51cCgpOwotICAKLSAgaWYgKHByZXZfb3Bjb2RlICYmICh3cml0ZV8yX3Nob3J0IChwcmV2X29wY29kZSwgcHJldl9pbnNuLCBvcGNvZGUsIGluc24sIGV4dHlwZSwgZml4dXBzKSA9PSAwKSkgCi0gICAgewotICAgICAgLyogbm8gaW5zdHJ1Y3Rpb25zIHNhdmVkICovCi0gICAgICBwcmV2X29wY29kZSA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGV4dHlwZSkgCi0JYXNfZmF0YWwgKF8oIlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZCIpKTsKLSAgICAgIC8qIHNhdmUgb2ZmIGxhc3QgaW5zdHJ1Y3Rpb24gc28gaXQgbWF5IGJlIHBhY2tlZCBvbiBuZXh0IHBhc3MgKi8KLSAgICAgIHByZXZfb3Bjb2RlID0gb3Bjb2RlOwotICAgICAgcHJldl9pbnNuID0gaW5zbjsKLSAgICAgIHByZXZfc2VnID0gbm93X3NlZzsKLSAgICAgIHByZXZfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIGZpeHVwcyA9IGZpeHVwcy0+bmV4dDsKLSAgICB9Ci19Ci0KLQotLyogZG9fYXNzZW1ibGUgYXNzZW1ibGVzIGEgc2luZ2xlIGluc3RydWN0aW9uIGFuZCByZXR1cm5zIGFuIG9wY29kZSAqLwotLyogaXQgcmV0dXJucyAtMSAoYW4gaW52YWxpZCBvcGNvZGUpIG9uIGVycm9yICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1kb19hc3NlbWJsZSAoc3RyLCBvcGNvZGUpIAotICAgICBjaGFyICpzdHI7Ci0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqKm9wY29kZTsKLXsKLSAgdW5zaWduZWQgY2hhciAqb3Bfc3RhcnQsICpzYXZlOwotICB1bnNpZ25lZCBjaGFyICpvcF9lbmQ7Ci0gIGNoYXIgbmFtZVsyMF07Ci0gIGludCBubGVuID0gMDsKLSAgZXhwcmVzc2lvblMgbXlvcHNbNl07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZS4gICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICAvKiBGaW5kIHRoZSBvcGNvZGUgZW5kLiAgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9ICh1bnNpZ25lZCBjaGFyICopIChzdHIpOwotICAgICAgICpvcF9lbmQKLSAgICAgICAmJiBubGVuIDwgMjAKLSAgICAgICAmJiAhaXNfZW5kX29mX2xpbmVbKm9wX2VuZF0gJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgbmFtZVtubGVuXSA9IHRvbG93ZXIgKG9wX3N0YXJ0W25sZW5dKTsKLSAgICAgIG5sZW4rKzsKLSAgICB9Ci0gIG5hbWVbbmxlbl0gPSAwOwotCi0gIGlmIChubGVuID09IDApCi0gICAgcmV0dXJuIC0xOwotICAKLSAgLyogRmluZCB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggdGhlIHByb3BlciBuYW1lLiAgKi8KLSAgKm9wY29kZSA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKiloYXNoX2ZpbmQgKGQxMHZfaGFzaCwgbmFtZSk7Ci0gIGlmICgqb3Bjb2RlID09IE5VTEwpCi0gICAgICBhc19mYXRhbCAoXygidW5rbm93biBvcGNvZGU6ICVzIiksbmFtZSk7Ci0KLSAgc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gb3BfZW5kOwotICAqb3Bjb2RlID0gZmluZF9vcGNvZGUgKCpvcGNvZGUsIG15b3BzKTsKLSAgaWYgKCpvcGNvZGUgPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0KLSAgaW5zbiA9IGJ1aWxkX2luc24gKCgqb3Bjb2RlKSwgbXlvcHMsIDApOyAKLSAgcmV0dXJuIChpbnNuKTsKLX0KLQotLyogRmluZCB0aGUgc3ltYm9sIHdoaWNoIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSByZWdpc3RlciBpbiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4gICovCi1zdGF0aWMgc3ltYm9sUyAqCi1maW5kX3N5bWJvbF9tYXRjaGluZ19yZWdpc3RlciAoZXhwKQotICAgICBleHByZXNzaW9uUyAqIGV4cDsKLXsKLSAgaW50IGk7Ci0gIAotICBpZiAoZXhwLT5YX29wICE9IE9fcmVnaXN0ZXIpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICAvKiBGaW5kIHRoZSBuYW1lIG9mIHRoZSByZWdpc3Rlci4gICovCi0gIGZvciAoaSA9IGQxMHZfcmVnX25hbWVfY250ICgpOyBpLS07KQotICAgIGlmIChkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzIFtpXS52YWx1ZSA9PSBleHAtPlhfYWRkX251bWJlcikKLSAgICAgIGJyZWFrOwotCi0gIGlmIChpIDwgMCkKLSAgICBhYm9ydCAoKTsKLQotICAvKiBOb3cgc2VlIGlmIGEgc3ltYm9sIGhhcyBiZWVuIGRlZmluZWQgd2l0aCB0aGUgc2FtZSBuYW1lLiAgKi8KLSAgcmV0dXJuIHN5bWJvbF9maW5kIChkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzIFtpXS5uYW1lKTsKLX0KLQotCi0vKiBmaW5kX29wY29kZSgpIGdldHMgYSBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUuICAgICAgICovCi0vKiBJdCBtdXN0IGxvb2sgYXQgYWxsIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCB1c2UgdGhlIG9wZXJhbmRzICovCi0vKiB0byBjaG9vc2UgdGhlIGNvcnJlY3Qgb3Bjb2RlLiAqLwotCi1zdGF0aWMgc3RydWN0IGQxMHZfb3Bjb2RlICoKLWZpbmRfb3Bjb2RlIChvcGNvZGUsIG15b3BzKQotICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTsKLSAgICAgZXhwcmVzc2lvblMgbXlvcHNbXTsKLXsKLSAgaW50IGksIG1hdGNoLCBkb25lOwotICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm5leHRfb3Bjb2RlOwotCi0gIC8qIGdldCBhbGwgdGhlIG9wZXJhbmRzIGFuZCBzYXZlIHRoZW0gYXMgZXhwcmVzc2lvbnMgKi8KLSAgZ2V0X29wZXJhbmRzIChteW9wcyk7Ci0KLSAgLyogbm93IHNlZSBpZiB0aGUgb3BlcmFuZCBpcyBhIGZha2UuICBJZiBzbywgZmluZCB0aGUgY29ycmVjdCBzaXplICovCi0gIC8qIGluc3RydWN0aW9uLCBpZiBwb3NzaWJsZSAqLwotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gT1BDT0RFX0ZBS0UpCi0gICAgewotICAgICAgaW50IG9wbnVtID0gb3Bjb2RlLT5vcGVyYW5kc1swXTsKLSAgICAgIGludCBmbGFnczsKLQkJCSAKLSAgICAgIGlmIChteW9wc1tvcG51bV0uWF9vcCA9PSBPX3JlZ2lzdGVyKQotCXsKLQkgIG15b3BzW29wbnVtXS5YX29wID0gT19zeW1ib2w7Ci0JICBteW9wc1tvcG51bV0uWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNoYXIgKilteW9wc1tvcG51bV0uWF9vcF9zeW1ib2wpOwotCSAgbXlvcHNbb3BudW1dLlhfYWRkX251bWJlciA9IDA7Ci0JICBteW9wc1tvcG51bV0uWF9vcF9zeW1ib2wgPSBOVUxMOwotCX0KLQotICAgICAgbmV4dF9vcGNvZGU9b3Bjb2RlKzE7Ci0KLSAgICAgIC8qIElmIHRoZSBmaXJzdCBvcGVyYW5kIGlzIHN1cHBvc2VkIHRvIGJlIGEgcmVnaXN0ZXIsIG1ha2Ugc3VyZQotCSB3ZSBnb3QgYSB2YWxpZCBvbmUuICAqLwotICAgICAgZmxhZ3MgPSBkMTB2X29wZXJhbmRzW25leHRfb3Bjb2RlLT5vcGVyYW5kc1swXV0uZmxhZ3M7Ci0gICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQl7Ci0JICBpbnQgWF9vcCA9IG15b3BzWzBdLlhfb3A7Ci0JICBpbnQgbnVtID0gbXlvcHNbMF0uWF9hZGRfbnVtYmVyOwotCi0JICBpZiAoWF9vcCAhPSBPX3JlZ2lzdGVyCi0JICAgICAgfHwgKG51bSAmIH5mbGFncwotCQkgICYgKE9QRVJBTkRfR1BSIHwgT1BFUkFORF9BQ0MwIHwgT1BFUkFORF9BQ0MxCi0JCSAgICAgfCBPUEVSQU5EX0ZGTEFHIHwgT1BFUkFORF9DRkxBRyB8IE9QRVJBTkRfQ09OVFJPTCkpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJiYWQgb3Bjb2RlIG9yIG9wZXJhbmRzIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobXlvcHNbb3BudW1dLlhfb3AgPT0gT19jb25zdGFudCB8fCAobXlvcHNbb3BudW1dLlhfb3AgPT0gT19zeW1ib2wgJiYKLQkgIFNfSVNfREVGSU5FRChteW9wc1tvcG51bV0uWF9hZGRfc3ltYm9sKSAmJgotCSAgKFNfR0VUX1NFR01FTlQobXlvcHNbb3BudW1dLlhfYWRkX3N5bWJvbCkgPT0gbm93X3NlZykpKQotCXsKLQkgIGZvciAoaT0wOyBvcGNvZGUtPm9wZXJhbmRzW2krMV07IGkrKykKLQkgICAgewotCSAgICAgIGludCBiaXRzID0gZDEwdl9vcGVyYW5kc1tuZXh0X29wY29kZS0+b3BlcmFuZHNbb3BudW1dXS5iaXRzOwotCSAgICAgIGludCBmbGFncyA9IGQxMHZfb3BlcmFuZHNbbmV4dF9vcGNvZGUtPm9wZXJhbmRzW29wbnVtXV0uZmxhZ3M7Ci0JICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9BRERSKQotCQliaXRzICs9IDI7Ci0JICAgICAgaWYgKG15b3BzW29wbnVtXS5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBpZiAoIWNoZWNrX3JhbmdlIChteW9wc1tvcG51bV0uWF9hZGRfbnVtYmVyLCBiaXRzLCBmbGFncykpCi0JCSAgICByZXR1cm4gbmV4dF9vcGNvZGU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmcmFnUyAqZjsKLQkJICBsb25nIHZhbHVlOwotCQkgIC8qIGNhbGN1bGF0ZSB0aGUgY3VycmVudCBhZGRyZXNzIGJ5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgcHJldmlvdXMgZnJhZ3MgKi8KLQkJICAvKiBhbmQgYWRkaW5nIG91ciBjdXJyZW50IG9mZnNldCAqLwotCQkgIGZvciAodmFsdWUgPSAwLCBmID0gZnJjaGFpbl9ub3ctPmZyY2hfcm9vdDsgZjsgZiA9IGYtPmZyX25leHQpCi0JCSAgICB2YWx1ZSArPSBmLT5mcl9maXggKyBmLT5mcl9vZmZzZXQ7Ci0KLQkJICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0FERFIpCi0JCSAgICB2YWx1ZSA9IFNfR0VUX1ZBTFVFKG15b3BzW29wbnVtXS5YX2FkZF9zeW1ib2wpIC0gdmFsdWUgLQotCQkgICAgICAob2JzdGFja19uZXh0X2ZyZWUoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpOwotCQkgIGVsc2UKLQkJICAgIHZhbHVlID0gU19HRVRfVkFMVUUobXlvcHNbb3BudW1dLlhfYWRkX3N5bWJvbCk7Ci0KLQkJICBpZiAoQVRfV09SRF9QICgmbXlvcHNbb3BudW1dKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGJpdHMgPiA0KQotCQkJewotCQkJICBiaXRzICs9IDI7Ci0JCQkgIGlmICghY2hlY2tfcmFuZ2UgKHZhbHVlLCBiaXRzLCBmbGFncykpCi0JCQkgICAgcmV0dXJuIG5leHRfb3Bjb2RlOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKCFjaGVja19yYW5nZSAodmFsdWUsIGJpdHMsIGZsYWdzKSkKLQkJICAgIHJldHVybiBuZXh0X29wY29kZTsKLQkJfQotCSAgICAgIG5leHRfb3Bjb2RlKys7Ci0JICAgIH0KLQkgIGFzX2ZhdGFsIChfKCJ2YWx1ZSBvdXQgb2YgcmFuZ2UiKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIG5vdCBhIGNvbnN0YW50LCBzbyB1c2UgYSBsb25nIGluc3RydWN0aW9uICovICAgIAotCSAgcmV0dXJuIG9wY29kZSsyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtYXRjaCA9IDA7Ci0gICAgICAvKiBub3cgc2VhcmNoIHRoZSBvcGNvZGUgdGFibGUgdGFibGUgZm9yIG9uZSB3aXRoIG9wZXJhbmRzICovCi0gICAgICAvKiB0aGF0IG1hdGNoZXMgd2hhdCB3ZSd2ZSBnb3QgKi8KLSAgICAgIHdoaWxlICghbWF0Y2gpCi0JewotCSAgbWF0Y2ggPSAxOwotCSAgZm9yIChpID0gMDsgb3Bjb2RlLT5vcGVyYW5kc1tpXTsgaSsrKSAKLQkgICAgewotCSAgICAgIGludCBmbGFncyA9IGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7Ci0JICAgICAgaW50IFhfb3AgPSBteW9wc1tpXS5YX29wOwotCSAgICAgIGludCBudW0gPSBteW9wc1tpXS5YX2FkZF9udW1iZXI7Ci0KLQkgICAgICBpZiAoWF9vcCA9PSAwKQotCQl7Ci0JCSAgbWF0Y2ggPSAwOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgCi0JICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9SRUcpCi0JCXsKLQkJICBpZiAoKFhfb3AgIT0gT19yZWdpc3RlcikKLQkJICAgICAgfHwgKG51bSAmIH5mbGFncwotCQkJICAmIChPUEVSQU5EX0dQUiB8IE9QRVJBTkRfQUNDMCB8IE9QRVJBTkRfQUNDMQotCQkJICAgICB8IE9QRVJBTkRfRkZMQUcgfCBPUEVSQU5EX0NGTEFHCi0JCQkgICAgIHwgT1BFUkFORF9DT05UUk9MKSkpCi0JCSAgICB7Ci0JCSAgICAgIG1hdGNoID0gMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICAKLQkgICAgICBpZiAoKChmbGFncyAmIE9QRVJBTkRfTUlOVVMpICAgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IE9QRVJBTkRfTUlOVVMpKSkgfHwKLQkJICAoKGZsYWdzICYgT1BFUkFORF9QTFVTKSAgICAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9QTFVTKSkpIHx8Ci0JCSAgKChmbGFncyAmIE9QRVJBTkRfQVRNSU5VUykgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IE9QRVJBTkRfQVRNSU5VUykpKSB8fAotCQkgICgoZmxhZ3MgJiBPUEVSQU5EX0FUUEFSKSAgICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBPUEVSQU5EX0FUUEFSKSkpIHx8Ci0JCSAgKChmbGFncyAmIE9QRVJBTkRfQVRTSUdOKSAgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAoKG51bSAhPSBPUEVSQU5EX0FUU0lHTikgJiYgKG51bSAhPSBPUEVSQU5EX0FUUEFSKSkpKSkKLQkJewotCQkgIG1hdGNoID0gMDsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIAotCSAgICAgIC8qIFVuZm9ydHVuYXRseSwgZm9yIHRoZSBpbmRpcmVjdCBvcGVyYW5kIGluIGluc3RydWN0aW9ucyBzdWNoIGFzCi0JCSBgYGxkYiByMSwgQChjLHIxNCknJyB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBwYXNzZWQgWF9vcCA9PSBPX3JlZ2lzdGVyCi0JCSAoYmVjYXVzZSAnYycgaXMgYSB2YWxpZCByZWdpc3RlciBuYW1lKS4gIEhvd2V2ZXIgd2UgY2Fubm90IGp1c3QKLQkJIGlnbm9yZSB0aGUgY2FzZSB3aGVuIFhfb3AgPT0gT19yZWdpc3RlciBidXQgZmxhZ3MgJiBPUEVSQU5EX1JFRyBpcwotCQkgbnVsbCwgc28gd2UgY2hlY2sgdG8gc2VlIGlmIGEgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHJlZ2lzdGVyCi0JCSBleGlzdHMuICBJZiB0aGUgc3ltYm9sIGRvZXMgZXhpc3QsIHRoZW4gdGhlIHBhcnNlciB3YXMgdW5hYmxlIHRvCi0JCSBkaXN0aW5ndWlzaCB0aGUgdHdvIGNhc2VzIGFuZCB3ZSBmaXggdGhpbmdzIGhlcmUuICAoUmVmOiBQUjE0ODI2KSAqLwotCSAgICAgIAotCSAgICAgIGlmICghKGZsYWdzICYgT1BFUkFORF9SRUcpICYmIChYX29wID09IE9fcmVnaXN0ZXIpKQotCQl7Ci0JCSAgc3ltYm9sUyAqIHN5bTsKLQkJICAKLQkJICBzeW0gPSBmaW5kX3N5bWJvbF9tYXRjaGluZ19yZWdpc3RlciAoJiBteW9wc1tpXSk7Ci0JCSAgCi0JCSAgaWYgKHN5bSAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBteW9wcyBbaV0uWF9vcCA9PSBYX29wID09IE9fc3ltYm9sOwotCQkgICAgICBteW9wcyBbaV0uWF9hZGRfc3ltYm9sID0gc3ltOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFzX2JhZAotCQkgICAgICAoXygiaWxsZWdhbCBvcGVyYW5kIC0gcmVnaXN0ZXIgbmFtZSBmb3VuZCB3aGVyZSBub25lIGV4cGVjdGVkIikpOwotCQl9Ci0JICAgIH0KLQkgIAotCSAgLyogV2UncmUgb25seSBkb25lIGlmIHRoZSBvcGVyYW5kcyBtYXRjaGVkIHNvIGZhciBBTkQgdGhlcmUKLQkgICAgIGFyZSBubyBtb3JlIHRvIGNoZWNrLiAgKi8KLQkgIGlmIChtYXRjaCAmJiBteW9wc1tpXS5YX29wID09IDApIAotCSAgICBicmVhazsKLQkgIGVsc2UKLQkgICAgbWF0Y2ggPSAwOwotCi0JICBuZXh0X29wY29kZSA9IG9wY29kZSArIDE7Ci0JICAKLQkgIGlmIChuZXh0X29wY29kZS0+b3Bjb2RlID09IDApIAotCSAgICBicmVhazsKLQkgIAotCSAgaWYgKHN0cmNtcCAobmV4dF9vcGNvZGUtPm5hbWUsIG9wY29kZS0+bmFtZSkpCi0JICAgIGJyZWFrOwotCSAgCi0JICBvcGNvZGUgPSBuZXh0X29wY29kZTsKLQl9Ci0gICAgfQotCi0gIGlmICghbWF0Y2gpICAKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCBvcGNvZGUgb3Igb3BlcmFuZHMiKSk7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLQotICAvKiBDaGVjayB0aGF0IGFsbCByZWdpc3RlcnMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgZXZlbiBhcmUuICovCi0gIC8qIEFsc28sIGlmIGFueSBvcGVyYW5kcyB3ZXJlIG1hcmtlZCBhcyByZWdpc3RlcnMsIGJ1dCB3ZXJlIHJlYWxseSBzeW1ib2xzICovCi0gIC8qIGZpeCB0aGF0IGhlcmUuICovCi0gIGZvciAoaT0wOyBvcGNvZGUtPm9wZXJhbmRzW2ldOyBpKyspIAotICAgIHsKLSAgICAgIGlmICgoZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFncyAmIE9QRVJBTkRfRVZFTikgJiYKLQkgIChteW9wc1tpXS5YX2FkZF9udW1iZXIgJiAxKSkgCi0JYXNfZmF0YWwgKF8oIlJlZ2lzdGVyIG51bWJlciBtdXN0IGJlIEVWRU4iKSk7Ci0gICAgICBpZiAobXlvcHNbaV0uWF9vcCA9PSBPX3JlZ2lzdGVyKQotCXsKLQkgIGlmICghKGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3MgJiBPUEVSQU5EX1JFRykpIAotCSAgICB7Ci0JICAgICAgbXlvcHNbaV0uWF9vcCA9IE9fc3ltYm9sOwotCSAgICAgIG15b3BzW2ldLlhfYWRkX3N5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKChjaGFyICopbXlvcHNbaV0uWF9vcF9zeW1ib2wpOwotCSAgICAgIG15b3BzW2ldLlhfYWRkX251bWJlciA9IDA7Ci0JICAgICAgbXlvcHNbaV0uWF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIG9wY29kZTsKLX0KLQotLyogaWYgd2hpbGUgcHJvY2Vzc2luZyBhIGZpeHVwLCBhIHJlbG9jIHJlYWxseSBuZWVkcyB0byBiZSBjcmVhdGVkICovCi0vKiB0aGVuIGl0IGlzIGRvbmUgaGVyZSAqLwotICAgICAgICAgICAgICAgICAKLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgXygicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiKSwgKGludClmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X29mZnNldDsKLQotICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJldHVybiByZWxvYzsKLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIDA7Ci19IAotCi1sb25nCi1tZF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeHAsIHNlYykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKU5VTEwgJiYgKCFTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KSB8fAotICAgICAgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBzZWMpKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgdmFsdWVUICp2YWx1ZXA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICBjaGFyICp3aGVyZTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBsb25nIHZhbHVlOwotICBpbnQgb3BfdHlwZTsKLSAgaW50IGxlZnQ9MDsKLQotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICp2YWx1ZXA7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHZhbHVlID0gKnZhbHVlcDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbHVlID0gZml4cC0+Znhfb2Zmc2V0OwotICAgICAgaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IChzeW1ib2xTICopIE5VTEwpCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X3N1YnN5KSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB2YWx1ZSAtPSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCBzdWJ0cmFjdGluZyBhIHN5bWJvbC4gICovCi0gCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBvcF90eXBlID0gZml4cC0+Znhfcl90eXBlOwotICBpZiAob3BfdHlwZSAmIDIwNDgpCi0gICAgewotICAgICAgb3BfdHlwZSAtPSAyMDQ4OwotICAgICAgaWYgKG9wX3R5cGUgJiAxMDI0KQotCXsKLQkgIG9wX3R5cGUgLT0gMTAyNDsKLQkgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0w7Ci0JICBsZWZ0ID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcF90eXBlICYgNDA5NikKLQl7Ci0JICBvcF90eXBlIC09IDQwOTY7Ci0JICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfRDEwVl8xODsKLQl9Ci0gICAgICBlbHNlCi0JZml4cC0+Znhfcl90eXBlID0gZ2V0X3JlbG9jKChzdHJ1Y3QgZDEwdl9vcGVyYW5kICopJmQxMHZfb3BlcmFuZHNbb3BfdHlwZV0pOyAKLSAgICB9Ci0KLSAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLSAgICAgdmFsdWUsIGFuZCBzdHVmZiB0aGUgaW5zdHJ1Y3Rpb24gYmFjayBhZ2Fpbi4gICovCi0gIHdoZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotICBpbnNuID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0w6Ci0gICAgY2FzZSBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SOgotICAgIGNhc2UgQkZEX1JFTE9DX0QxMFZfMThfUENSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfRDEwVl8xODoKLSAgICAgIC8qIGluc3RydWN0aW9uIGFkZHJlc3NlcyBhcmUgYWx3YXlzIHJpZ2h0LXNoaWZ0ZWQgYnkgMiAqLwotICAgICAgdmFsdWUgPj49IEFUX1dPUkRfUklHSFRfU0hJRlQ7Ci0gICAgICBpZiAoZml4cC0+Znhfc2l6ZSA9PSAyKQotCWJmZF9wdXRiMTYgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBkMTB2X29wY29kZSAqcmVwLCAqcmVwaTsKLQotCSAgcmVwID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKSBoYXNoX2ZpbmQgKGQxMHZfaGFzaCwgInJlcCIpOwotCSAgcmVwaSA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKikgaGFzaF9maW5kIChkMTB2X2hhc2gsICJyZXBpIik7Ci0JICBpZiAoKGluc24gJiBGTTExKSA9PSBGTTExCi0JICAgICAgJiYgKHJlcGkgIT0gTlVMTCAmJiAoaW5zbiAmIHJlcGktPm1hc2spID09IHJlcGktPm9wY29kZQotCQkgIHx8IHJlcCAhPSBOVUxMICYmIChpbnNuICYgcmVwLT5tYXNrKSA9PSByZXAtPm9wY29kZSkKLQkgICAgICAmJiB2YWx1ZSA8IDQpCi0JICAgIGFzX2ZhdGFsCi0JICAgICAgKF8oImxpbmUgJWQ6IHJlcCBvciByZXBpIG11c3QgaW5jbHVkZSBhdCBsZWFzdCA0IGluc3RydWN0aW9ucyIpLAotCSAgICAgICBmaXhwLT5meF9saW5lKTsKLQkgIGluc24gPSBkMTB2X2luc2VydF9vcGVyYW5kIChpbnNuLCBvcF90eXBlLCAob2Zmc2V0VCl2YWx1ZSwgbGVmdCwgZml4cCk7Ci0JICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOyAgCi0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgdmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgYmZkX3B1dGIxNiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIGZpeHAtPmZ4X2RvbmUgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oImxpbmUgJWQ6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlOiAweCV4IiksZml4cC0+ZnhfbGluZSxmaXhwLT5meF9yX3R5cGUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIGQxMHZfY2xlYW51cCgpIGlzIGNhbGxlZCBhZnRlciB0aGUgYXNzZW1ibGVyIGhhcyBmaW5pc2hlZCBwYXJzaW5nIHRoZSBpbnB1dCAKLSAgIGZpbGUgb3IgYWZ0ZXIgYSBsYWJlbCBpcyBkZWZpbmVkLiAgQmVjYXVzZSB0aGUgRDEwViBhc3NlbWJsZXIgc29tZXRpbWVzIHNhdmVzIHNob3J0IAotICAgaW5zdHJ1Y3Rpb25zIHRvIHNlZSBpZiBpdCBjYW4gcGFja2FnZSB0aGVtIHdpdGggdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIHRoZXJlIG1heQotICAgYmUgYSBzaG9ydCBpbnN0cnVjdGlvbiB0aGF0IHN0aWxsIG5lZWRzIHdyaXR0ZW4uICAqLwotaW50Ci1kMTB2X2NsZWFudXAgKCkKLXsKLSAgc2VnVCBzZWc7Ci0gIHN1YnNlZ1Qgc3Vic2VnOwotCi0gIGlmIChwcmV2X29wY29kZSAmJiBldHlwZSA9PSAwKQotICAgIHsKLSAgICAgIHNlZyA9IG5vd19zZWc7Ci0gICAgICBzdWJzZWcgPSBub3dfc3Vic2VnOwotICAgICAgaWYgKHByZXZfc2VnKQotCXN1YnNlZ19zZXQgKHByZXZfc2VnLCBwcmV2X3N1YnNlZyk7Ci0gICAgICB3cml0ZV8xX3Nob3J0IChwcmV2X29wY29kZSwgcHJldl9pbnNuLCBmaXh1cHMtPm5leHQpOwotICAgICAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotICAgICAgcHJldl9vcGNvZGUgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIExpa2Ugbm9ybWFsIC53b3JkLCBleGNlcHQgc3VwcG9ydCBAd29yZCAqLwotLyogY2xvYmJlcnMgaW5wdXRfbGluZV9wb2ludGVyLCBjaGVja3MgZW5kLW9mLWxpbmUuICovCi1zdGF0aWMgdm9pZAotZDEwdl9kb3Rfd29yZCAobmJ5dGVzKQotICAgICByZWdpc3RlciBpbnQgbmJ5dGVzOwkvKiAxPS5ieXRlLCAyPS53b3JkLCA0PS5sb25nICovCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotICBjaGFyICpwOwotICBpbnQgb2Zmc2V0OwotCi0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRvCi0gICAgewotICAgICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICAgICBpZiAoIXN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJAd29yZCIsIDUpKQotCXsKLQkgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0JCi0JICBwID0gZnJhZ19tb3JlICgyKTsKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAyLCAKLQkJICAgICAgICZleHAsIDAsIEJGRF9SRUxPQ19EMTBWXzE4KTsKLQl9Ci0gICAgICBlbHNlCi0JZW1pdF9leHByICgmZXhwLCAyKTsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXItLTsJCS8qIFB1dCB0ZXJtaW5hdG9yIGJhY2sgaW50byBzdHJlYW0uICovCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLQotLyogTWl0c3ViaXNoaSBhc2tlZCB0aGF0IHdlIHN1cHBvcnQgc29tZSBvbGQgc3ludGF4IHRoYXQgYXBwYXJlbnRseSAqLwotLyogaGFkIGltbWVkaWF0ZSBvcGVyYW5kcyBzdGFydGluZyB3aXRoICcjJy4gIFRoaXMgaXMgaW4gc29tZSBvZiB0aGVpciAqLwotLyogc2FtcGxlIGNvZGUgYnV0IGlzIG5vdCBkb2N1bWVudGVkIChhbHRob3VnaCBpdCBhcHBlYXJzIGluIHNvbWUgICovCi0vKiBleGFtcGxlcyBpbiB0aGVpciBhc3NlbWJsZXIgbWFudWFsKS4gRm9yIG5vdywgd2UnbGwgc29sdmUgdGhpcyAqLwotLyogY29tcGF0aWJpbGl0eSBwcm9ibGVtIGJ5IHNpbXBseSBpZ25vcmluZyBhbnkgJyMnIGF0IHRoZSBiZWdpbm5pbmcgKi8KLS8qIG9mIGFuIG9wZXJhbmQuICovCi0KLS8qIG9wZXJhbmRzIHRoYXQgYmVnaW4gd2l0aCAnIycgc2hvdWxkIGZhbGwgdGhyb3VnaCB0byBoZXJlICovCi0vKiBmcm9tIGV4cHIuYyAqLwotCi12b2lkIAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnICYmICEgZG9fbm90X2lnbm9yZV9oYXNoKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICAgIH0KLX0KLQotYm9vbGVhbgotZDEwdl9maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgIGZpeFMgKmZpeFA7Ci17Ci0KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0gIAotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBXZSBuZWVkIHRoZSBzeW1ib2wgbmFtZSBmb3IgdGhlIFZUQUJMRSBlbnRyaWVzICovCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gMTsKLX0KLQotaW50Ci1kMTB2X2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gICAgICBzdHJ1Y3QgZml4ICpmaXhwOwotewotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWQxMHYuaCBiL2dhcy9jb25maWcvdGMtZDEwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmZmZDVjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZDEwdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogdGMtZDEwdi5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1kMTB2LmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50LCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX0QxMFYKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBEMTBWIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2QxMHYKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1kMTB2IgotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLQotLyogY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24sIG5vdCBtZF9wY3JlbF9mcm9tICovCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbihGSVhQLCBTRUMpICAgCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogLi1mb28gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIG1kX251bWJlcl90b19jaGFycyAgICAgICAgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbgotCi1pbnQgZDEwdl9jbGVhbnVwIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfYWZ0ZXJfcGFzc19ob29rKCkJICAgICBkMTB2X2NsZWFudXAoKQotI2RlZmluZSBtZF9jbGVhbnVwKCkJCSAgICAgZDEwdl9jbGVhbnVwKCkKLSNkZWZpbmUgbWRfZG9fYWxpZ24oYSxiLGMsZCxlKQkgICAgIGQxMHZfY2xlYW51cCgpCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBkbyB7XAotICBkMTB2X2NsZWFudXAoKTsgXAotICBTX1NFVF9WQUxVRSAoc3ltLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBkMTB2X2ZpeF9hZGp1c3RhYmxlKGZpeFApCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgZDEwdl9mb3JjZV9yZWxvY2F0aW9uKGZpeHApCi1leHRlcm4gaW50IGQxMHZfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1kMzB2LmMgYi9nYXMvY29uZmlnL3RjLWQzMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjNTQxMjQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1kMzB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjM3ICswLDAgQEAKLS8qIHRjLWQzMHYuYyAtLSBBc3NlbWJsZXIgY29kZSBmb3IgdGhlIE1pdHN1YmlzaGkgRDMwVgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAotI2luY2x1ZGUgIm9wY29kZS9kMzB2LmgiCi0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIk9uTmNDIjsKLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0KLSNpZiBIQVZFX0xJTUlUU19ICi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBDSEFSX0JJVAotI2RlZmluZSBDSEFSX0JJVCA4Ci0jZW5kaWYKLQotI2RlZmluZSBOT1BfTVVMVElQTFkgMQotI2RlZmluZSBOT1BfQUxMIDIKLXN0YXRpYyBpbnQgd2Fybl9ub3BzID0gMDsKLXN0YXRpYyBpbnQgT3B0aW1pemluZyA9IDA7Ci1zdGF0aWMgaW50IHdhcm5fcmVnaXN0ZXJfbmFtZV9jb25mbGljdHMgPSAxOwotCi0jZGVmaW5lIEZPUkNFX1NIT1JUCTEKLSNkZWZpbmUgRk9SQ0VfTE9ORwkyCi0KLS8qIEVYRUMgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIF9leGVjX3R5cGUKLXsKLSAgRVhFQ19VTktOT1dOLAkJCS8qIG5vIG9yZGVyIHNwZWNpZmllZCAqLwotICBFWEVDX1BBUkFMTEVMLAkJLyogZG9uZSBpbiBwYXJhbGxlbCAoRk09MDApICovCi0gIEVYRUNfU0VRLAkJCS8qIHNlcXVlbnRpYWwgKEZNPTAxKSAqLwotICBFWEVDX1JFVlNFUQkJCS8qIHJldmVyc2Ugc2VxdWVudGlhbCAoRk09MTApICovCi19IGV4ZWNfdHlwZV9lbnVtOwotCi0vKiBmaXh1cHMgKi8KLSNkZWZpbmUgTUFYX0lOU05fRklYVVBTICg1KQotc3RydWN0IGQzMHZfZml4dXAKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgb3BlcmFuZDsKLSAgaW50IHBjcmVsOwotICBpbnQgc2l6ZTsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgX2ZpeHVwcwotewotICBpbnQgZmM7Ci0gIHN0cnVjdCBkMzB2X2ZpeHVwIGZpeFtNQVhfSU5TTl9GSVhVUFNdOwotICBzdHJ1Y3QgX2ZpeHVwcyAqbmV4dDsKLX0gRml4dXBzOwotCi1zdGF0aWMgRml4dXBzIEZpeFVwc1syXTsKLXN0YXRpYyBGaXh1cHMgKmZpeHVwczsKLQotLyogV2hldGhlciBjdXJyZW50IGFuZCBwcmV2aW91cyBpbnN0cnVjdGlvbiBhcmUgd29yZCBtdWx0aXBseSBpbnNucy4gICovCi1zdGF0aWMgaW50IGN1cl9tdWwzMl9wID0gMDsKLXN0YXRpYyBpbnQgcHJldl9tdWwzMl9wID0gMDsKLQotLyogIFRoZSBmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwgaXMgdHJ1ZSBpZmYgdGhlIGluc3RydWN0aW9uIGJlaW5nIGFzc2VtYmxlZAotICAgIGhhcyBiZWVuIGV4cGxpY2l0bHkgd3JpdHRlbiBhcyBhIHBhcmFsbGVsIHNob3J0LWluc3RydWN0aW9uIHBhaXIgYnkgdGhlCi0gICAgaHVtYW4gcHJvZ3JhbW1lci4gIEl0IGlzIHVzZWQgaW4gcGFyYWxsZWxfb2soKSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCi0gICAgdGhvc2UgZGFuZ2Vyb3VzIHBhcmFsbGVsaXphdGlvbnMgYXR0ZW1wdGVkIGJ5IHRoZSBodW1hbiwgd2hpY2ggYXJlIHRvIGJlCi0gICAgYWxsb3dlZCwgYW5kIHRob3NlIGF0dGVtcHRlZCBieSB0aGUgYXNzZW1ibGVyLCB3aGljaCBhcmUgbm90LiAgSXQgaXMgc2V0Ci0gICAgZnJvbSBtZF9hc3NlbWJsZSgpLiAgKi8KLXN0YXRpYyBpbnQgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsID0gMDsgCi1zdGF0aWMgaW50IGZsYWdfeHBfc3RhdGUgPSAwOwotCi0vKiBXaGV0aGVyIGN1cnJlbnQgYW5kIHByZXZpb3VzIGxlZnQgc3ViLWluc3RydWN0aW9uIGRpc2FibGVzCi0gICBleGVjdXRpb24gb2YgcmlnaHQgc3ViLWluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQgY3VyX2xlZnRfa2lsbHNfcmlnaHRfcCA9IDA7Ci1zdGF0aWMgaW50IHByZXZfbGVmdF9raWxsc19yaWdodF9wID0gMDsKLQotLyogVGhlIGtub3duIGN1cnJlbnQgYWxpZ25tZW50IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uICAqLwotc3RhdGljIGludCBkMzB2X2N1cnJlbnRfYWxpZ247Ci1zdGF0aWMgc2VnVCBkMzB2X2N1cnJlbnRfYWxpZ25fc2VnOwotCi0vKiBUaGUgbGFzdCBzZWVuIGxhYmVsIGluIHRoZSBjdXJyZW50IHNlY3Rpb24uICBUaGlzIGlzIHVzZWQgdG8gYXV0by1hbGlnbgotICAgbGFiZWxzIHByZWNlZWRpbmcgaW5zdHJ1Y3Rpb25zLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpkMzB2X2xhc3RfbGFiZWw7Ci0KLS8qIFR3byBub3BzICovCi0jZGVmaW5lIE5PUF9MRUZUICAgKChsb25nIGxvbmcpIE5PUCA8PCAzMikKLSNkZWZpbmUgTk9QX1JJR0hUICAoKGxvbmcgbG9uZykgTk9QKQotI2RlZmluZSBOT1AyIChGTTAwIHwgTk9QX0xFRlQgfCBOT1BfUklHSFQpCi0KLS8qIGxvY2FsIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCByZWdfbmFtZV9zZWFyY2ggUEFSQU1TICgoY2hhciAqbmFtZSkpOwotc3RhdGljIGludCByZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotc3RhdGljIGludCBjaGVja19yYW5nZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIG51bSwgaW50IGJpdHMsIGludCBmbGFncykpOwotc3RhdGljIGludCBwb3N0Zml4IFBBUkFNUyAoKGNoYXIgKnApKTsKLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgZ2V0X3JlbG9jIFBBUkFNUyAoKHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wLCBpbnQgcmVsX2ZsYWcpKTsKLXN0YXRpYyBpbnQgZ2V0X29wZXJhbmRzIFBBUkFNUyAoKGV4cHJlc3Npb25TIGV4cFtdLCBpbnQgY21wX2hhY2spKTsKLXN0YXRpYyBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmZpbmRfZm9ybWF0IFBBUkFNUyAoKHN0cnVjdCBkMzB2X29wY29kZSAqb3Bjb2RlLCAKLQkJCWV4cHJlc3Npb25TIG9wc1tdLGludCBmc2l6ZSwgaW50IGNtcF9oYWNrKSk7Ci1zdGF0aWMgbG9uZyBsb25nIGJ1aWxkX2luc24gUEFSQU1TICgoc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlLCBleHByZXNzaW9uUyAqb3BlcnMpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX2xvbmcgUEFSQU1TICgoc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlLCBsb25nIGxvbmcgaW5zbiwgRml4dXBzICpmeCkpOwotc3RhdGljIHZvaWQgd3JpdGVfMV9zaG9ydCBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUsIGxvbmcgbG9uZyBpbnNuLAotCQkJCSAgIEZpeHVwcyAqZngsIGludCB1c2Vfc2VxdWVudGlhbCkpOwotc3RhdGljIGludCB3cml0ZV8yX3Nob3J0IFBBUkFNUyAoKHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTEsIGxvbmcgbG9uZyBpbnNuMSwgCi0JCSAgIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTIsIGxvbmcgbG9uZyBpbnNuMiwgZXhlY190eXBlX2VudW0gZXhlY190eXBlLCBGaXh1cHMgKmZ4KSk7Ci1zdGF0aWMgbG9uZyBsb25nIGRvX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKnN0ciwgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlLAotCQkJCSAgICAgIGludCBzaG9ydHAsIGludCBpc19wYXJhbGxlbCkpOwotc3RhdGljIGludCBwYXJhbGxlbF9vayBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUxLCB1bnNpZ25lZCBsb25nIGluc24xLCAKLQkJCQlzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUyLCB1bnNpZ25lZCBsb25nIGluc24yLAotCQkJCWV4ZWNfdHlwZV9lbnVtIGV4ZWNfdHlwZSkpOwotc3RhdGljIHZvaWQgZDMwdl9udW1iZXJfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqYnVmLCBsb25nIGxvbmcgdmFsdWUsIGludCBuYnl0ZXMpKTsKLXN0YXRpYyB2b2lkIGNoZWNrX3NpemUgUEFSQU1TICgobG9uZyB2YWx1ZSwgaW50IGJpdHMsIGNoYXIgKmZpbGUsIGludCBsaW5lKSk7Ci1zdGF0aWMgdm9pZCBkMzB2X2FsaWduIFBBUkFNUyAoKGludCwgY2hhciAqLCBzeW1ib2xTICopKTsKLXN0YXRpYyB2b2lkIHNfZDMwdl9hbGlnbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZDMwdl90ZXh0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19kMzB2X2RhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2QzMHZfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOyAgICAgICAKLQotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJ3b3JkIiwgY29ucywgNCB9LAotICB7ICJod29yZCIsIGNvbnMsIDIgfSwKLSAgeyAiYWxpZ24iLCBzX2QzMHZfYWxpZ24sIDAgfSwKLSAgeyAidGV4dCIsIHNfZDMwdl90ZXh0LCAwIH0sCi0gIHsgImRhdGEiLCBzX2QzMHZfZGF0YSwgMCB9LAotICB7ICJzZWN0aW9uIiwgc19kMzB2X3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdGlvbi5zIiwgc19kMzB2X3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdCIsIHNfZDMwdl9zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3QucyIsIHNfZDMwdl9zZWN0aW9uLCAwIH0sCi0gIHsgTlVMTCwgTlVMTCwgMCB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqZDMwdl9oYXNoOwotCi0vKiByZWdfbmFtZV9zZWFyY2ggZG9lcyBhIGJpbmFyeSBzZWFyY2ggb2YgdGhlIHByZV9kZWZpbmVkX3JlZ2lzdGVycwotICAgYXJyYXkgdG8gc2VlIGlmICJuYW1lIiBpcyBhIHZhbGlkIHJlZ2l0ZXIgbmFtZS4gIFJldHVybnMgdGhlIHJlZ2lzdGVyCi0gICBudW1iZXIgZnJvbSB0aGUgYXJyYXkgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gKi8KLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IHJlZ19uYW1lX2NudCAoKSAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoc3ltYm9sX2ZpbmQgKG5hbWUpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAod2Fybl9yZWdpc3Rlcl9uYW1lX2NvbmZsaWN0cykKLQkJYXNfd2FybiAoXygiUmVnaXN0ZXIgbmFtZSAlcyBjb25mbGljdHMgd2l0aCBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZSIpLAotCQkJIG5hbWUpOwotCSAgICB9Ci0gIAotCSAgcmV0dXJuIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLnZhbHVlOwotCX0KLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0gIAotICByZXR1cm4gLTE7Ci19Ci0KLS8qIHJlZ2lzdGVyX25hbWUoKSBjaGVja3MgdGhlIHN0cmluZyBhdCBpbnB1dF9saW5lX3BvaW50ZXIKLSAgIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIHJlZ2lzdGVyIG5hbWUuICAqLwotCi1zdGF0aWMgaW50Ci1yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpbnQgcmVnX251bWJlcjsKLSAgY2hhciBjLCAqcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgCi0gIHdoaWxlICgqcCAmJiAqcCE9J1xuJyAmJiAqcCE9J1xyJyAmJiAqcCAhPScsJyAmJiAqcCE9JyAnICYmICpwIT0nKScpCi0gICAgcCsrOwotCi0gIGMgPSAqcDsKLSAgaWYgKGMpCi0gICAgKnArKyA9IDA7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgLyogdGVtcG9yYXJpbHkgc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgaGVyZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gKHN5bWJvbFMgKilpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChjKQotICAgICoocC0xKSA9IGM7Ci0gIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLWNoZWNrX3JhbmdlIChudW0sIGJpdHMsIGZsYWdzKQotICAgICB1bnNpZ25lZCBsb25nIG51bTsKLSAgICAgaW50IGJpdHM7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgbG9uZyBtaW4sIG1heDsKLSAgaW50IHJldHZhbD0wOwotCi0gIC8qIGRvbid0IGJvdGhlciBjaGVja2luZyAzMi1iaXQgdmFsdWVzICovCi0gIGlmIChiaXRzID09IDMyICYmIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIENIQVJfQklUID09IDMyKQotICAgIHJldHVybiAwOwotCi0gIC8qIFNpZ24gZXh0ZW5kIHNpZ25lZCB2YWx1ZXMgdG8gdW5zaWduZWQgbG9uZyAqLwotICBpZiAoKGZsYWdzICYgT1BFUkFORF9TSUdORUQpICYmIChudW0gJiAoKHVuc2lnbmVkIGxvbmcpMSA8PCAoYml0cyAtIDEpKSkpCi0gICAgbnVtIHw9ICgobG9uZyktMSA8PCAoYml0cyAtIDEpKTsKLQotICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotICAgIHsKLSAgICAgIC8qIFdlIGtub3cgdGhhdCBhbGwgc2hpZnRzIGFyZSByaWdodCBieSB0aHJlZSBiaXRzLi4uLiAqLwotICAgICAgCi0gICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCkKLQludW0gPSAodW5zaWduZWQgbG9uZykgKCAobG9uZykgbnVtID49IDApIAotCQk/ICggKChsb25nKSBudW0pID4+IDMgKQotCQk6ICggKG51bSA+PiAzKSB8ICgodW5zaWduZWQgbG9uZyktMSA8PCAoMzIgLSAzKSkgKTsKLSAgICAgIGVsc2UKLQludW0gPj49IDM7Ci0gICAgfQotCi0gIGlmIChmbGFncyAmIE9QRVJBTkRfU0lHTkVEKQotICAgIHsKLSAgICAgIG1heCA9ICgodW5zaWduZWQgbG9uZykxIDw8IChiaXRzIC0gMSkpIC0gMTsgCi0gICAgICBtaW4gPSAtICgodW5zaWduZWQgbG9uZykxIDw8IChiaXRzIC0gMSkpOwotICAgICAgaWYgKCgobG9uZyludW0gPiBtYXgpIHx8ICgobG9uZyludW0gPCBtaW4pKQotCXJldHZhbCA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWF4ID0gKCh1bnNpZ25lZCBsb25nKTEgPDwgYml0cykgLSAxOwotICAgICAgbWluID0gMDsKLSAgICAgIGlmICgobnVtID4gbWF4KSB8fCAobnVtIDwgbWluKSkKLQlyZXR2YWwgPSAxOwotICAgIH0KLSAgCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXG5EMzBWIG9wdGlvbnM6XG5cCi0tTyAgICAgICAgICAgICAgICAgICAgICBNYWtlIGFkamFjZW50IHNob3J0IGluc3RydWN0aW9ucyBwYXJhbGxlbCBpZiBwb3NzaWJsZS5cblwKLS1uICAgICAgICAgICAgICAgICAgICAgIFdhcm4gYWJvdXQgYWxsIE5PUHMgaW5zZXJ0ZWQgYnkgdGhlIGFzc2VtYmxlci5cblwKLS1OCQkJV2FybiBhYm91dCBOT1BzIGluc2VydGVkIGFmdGVyIHdvcmQgbXVsdGlwbGllcy5cblwKLS1jICAgICAgICAgICAgICAgICAgICAgIFdhcm4gYWJvdXQgc3ltYm9scyB3aG9lcyBuYW1lcyBtYXRjaCByZWdpc3RlciBuYW1lcy5cblwKLS1DICAgICAgICAgICAgICAgICAgICAgIE9wcG9zaXRlIG9mIC1DLiAgLWMgaXMgdGhlIGRlZmF1bHQuXG4iKSk7Ci19Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgICAvKiBPcHRpbWl6ZS4gV2lsbCBhdHRlbXB0IHRvIHBhcmFsbGVsaXplIG9wZXJhdGlvbnMgKi8KLSAgICBjYXNlICdPJzoKLSAgICAgIE9wdGltaXppbmcgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFdhcm4gYWJvdXQgYWxsIE5PUFMgdGhhdCB0aGUgYXNzZW1ibGVyIGluc2VydHMuICAqLwotICAgIGNhc2UgJ24nOgotICAgICAgd2Fybl9ub3BzID0gTk9QX0FMTDsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBXYXJuIGFib3V0IHRoZSBOT1BTIHRoYXQgdGhlIGFzc2VtYmxlciBpbnNlcnRzIGJlY2F1c2Ugb2YgdGhlCi0JIG11bHRpcGx5IGhhemFyZC4gICovCi0gICAgY2FzZSAnTic6Ci0gICAgICB3YXJuX25vcHMgPSBOT1BfTVVMVElQTFk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2MnOgotICAgICAgd2Fybl9yZWdpc3Rlcl9uYW1lX2NvbmZsaWN0cyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0MnOgotICAgICAgd2Fybl9yZWdpc3Rlcl9uYW1lX2NvbmZsaWN0cyA9IDA7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKnQ7Ci0gIGludCBpOwotICAKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gIAotICAqc2l6ZVAgPSBwcmVjICogMjsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGZyYWdTICpmcmFnUDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICB2YWx1ZVQgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBzdHJ1Y3QgZDMwdl9vcGNvZGUgKiBvcGNvZGU7Ci0gIGQzMHZfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIC8qIEluc2VydCBvcGNvZGUgbmFtZXMgaW50byBhIGhhc2ggdGFibGUuICovCi0gIGZvciAob3Bjb2RlID0gKHN0cnVjdCBkMzB2X29wY29kZSAqKWQzMHZfb3Bjb2RlX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgICAgaGFzaF9pbnNlcnQgKGQzMHZfaGFzaCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCi0gIGZpeHVwcyA9ICZGaXhVcHNbMF07Ci0gIEZpeFVwc1swXS5uZXh0ID0gJkZpeFVwc1sxXTsKLSAgRml4VXBzWzFdLm5leHQgPSAmRml4VXBzWzBdOwotCi0gIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOwotfQotCi0KLS8qIHRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgcG9zdGluY3JlbWVudCBvciBwb3N0ZGVjcmVtZW50Ci0gICBvcGVyYXRvciAoICcrJyBvciAnLScgKSBmcm9tIGFuIGV4cHJlc3Npb24gKi8KLQotc3RhdGljIGludCBwb3N0Zml4IChwKSAKLSAgICAgY2hhciAqcDsKLXsKLSAgd2hpbGUgKCpwICE9ICctJyAmJiAqcCAhPSAnKycpIAotICAgIHsKLSAgICAgIGlmICgqcD09MCB8fCAqcD09J1xuJyB8fCAqcD09J1xyJyB8fCAqcD09JyAnIHx8ICpwPT0nLCcpIAotCWJyZWFrOwotICAgICAgcCsrOwotICAgIH0KLQotICBpZiAoKnAgPT0gJy0nKSAKLSAgICB7Ci0gICAgICAqcCA9ICcgJzsKLSAgICAgIHJldHVybiAoLTEpOwotICAgIH0KLSAgaWYgKCpwID09ICcrJykgCi0gICAgewotICAgICAgKnAgPSAnICc7Ci0gICAgICByZXR1cm4gKDEpOwotICAgIH0KLQotICByZXR1cm4gKDApOwotfQotCi0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgCi1nZXRfcmVsb2MgKG9wLCByZWxfZmxhZykgCi0gICAgIHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wOwotICAgICBpbnQgcmVsX2ZsYWc7Ci17Ci0gIHN3aXRjaCAob3AtPmJpdHMpCi0gICAgewotICAgIGNhc2UgNjoKLSAgICAgIGlmIChvcC0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotCXJldHVybiBCRkRfUkVMT0NfRDMwVl85X1BDUkVMOwotICAgICAgZWxzZQotCXJldHVybiBCRkRfUkVMT0NfRDMwVl82OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjoKLSAgICAgIGlmICghKG9wLT5mbGFncyAmIE9QRVJBTkRfU0hJRlQpKQotCWFzX3dhcm4gKF8oInVuZXhwZWN0ZWQgMTItYml0IHJlbG9jIHR5cGUiKSk7Ci0gICAgICBpZiAocmVsX2ZsYWcgPT0gUkVMT0NfUENSRUwpCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMOwotICAgICAgZWxzZQotCXJldHVybiBCRkRfUkVMT0NfRDMwVl8xNTsKLSAgICBjYXNlIDE4OgotICAgICAgaWYgKCEob3AtPmZsYWdzICYgT1BFUkFORF9TSElGVCkpCi0JYXNfd2FybiAoXygidW5leHBlY3RlZCAxOC1iaXQgcmVsb2MgdHlwZSIpKTsKLSAgICAgIGlmIChyZWxfZmxhZyA9PSBSRUxPQ19QQ1JFTCkKLQlyZXR1cm4gQkZEX1JFTE9DX0QzMFZfMjFfUENSRUw7Ci0gICAgICBlbHNlCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzIxOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAocmVsX2ZsYWcgPT0gUkVMT0NfUENSRUwpCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMOwotICAgICAgZWxzZQotCXJldHVybiBCRkRfUkVMT0NfRDMwVl8zMjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKiBnZXRfb3BlcmFuZHMgcGFyc2VzIGEgc3RyaW5nIG9mIG9wZXJhbmRzIGFuZCByZXR1cm5zCi0gICBhbiBhcnJheSBvZiBleHByZXNzaW9ucyAqLwotCi1zdGF0aWMgaW50Ci1nZXRfb3BlcmFuZHMgKGV4cCwgY21wX2hhY2spIAotICAgICBleHByZXNzaW9uUyBleHBbXTsKLSAgICAgaW50IGNtcF9oYWNrOwotewotICBjaGFyICpwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnQgbnVtb3BzID0gMDsKLSAgaW50IHBvc3QgPSAwOwotCi0gIGlmIChjbXBfaGFjaykKLSAgICB7Ci0gICAgICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBleHBbbnVtb3BzKytdLlhfYWRkX251bWJlciA9IGNtcF9oYWNrIC0gMTsKLSAgICB9Ci0KLSAgd2hpbGUgKCpwKSAgCi0gICAgewotICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICcsJykgCi0JcCsrOwotICAgICAgaWYgKCpwPT0wIHx8ICpwPT0nXG4nIHx8ICpwPT0nXHInKSAKLQlicmVhazsKLSAgICAgIAotICAgICAgaWYgKCpwID09ICdAJykgCi0JewotCSAgcCsrOwotCSAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotCSAgaWYgKCpwID09ICcoJykgCi0JICAgIHsKLQkgICAgICBwKys7Ci0JICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVFBBUjsKLQkgICAgICBwb3N0ID0gcG9zdGZpeCAocCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpwID09ICctJykgCi0JICAgIHsKLQkgICAgICBwKys7Ci0JICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVE1JTlVTOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUU0lHTjsKLQkgICAgICBwb3N0ID0gcG9zdGZpeCAocCk7Ci0JICAgIH0KLQkgIG51bW9wcysrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKnAgPT0gJyknKSAKLQl7Ci0JICAvKiBqdXN0IHNraXAgdGhlIHRyYWlsaW5nIHBhcmVuICovCi0JICBwKys7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0KLSAgICAgIC8qIGNoZWNrIHRvIHNlZSBpZiBpdCBtaWdodCBiZSBhIHJlZ2lzdGVyIG5hbWUgKi8KLSAgICAgIGlmICghcmVnaXN0ZXJfbmFtZSAoJmV4cFtudW1vcHNdKSkKLQl7Ci0JICAvKiBwYXJzZSBhcyBhbiBleHByZXNzaW9uICovCi0JICBleHByZXNzaW9uICgmZXhwW251bW9wc10pOwotCX0KLQotICAgICAgaWYgKGV4cFtudW1vcHNdLlhfb3AgPT0gT19pbGxlZ2FsKSAKLQlhc19iYWQgKF8oImlsbGVnYWwgb3BlcmFuZCIpKTsKLSAgICAgIGVsc2UgaWYgKGV4cFtudW1vcHNdLlhfb3AgPT0gT19hYnNlbnQpIAotCWFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotCi0gICAgICBudW1vcHMrKzsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIHN3aXRjaCAocG9zdCkgCi0JewotCWNhc2UgLTE6CS8qIHBvc3RkZWNyZW1lbnQgbW9kZSAqLwotCSAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotCSAgZXhwW251bW9wcysrXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX01JTlVTOwotCSAgYnJlYWs7Ci0JY2FzZSAxOgkvKiBwb3N0aW5jcmVtZW50IG1vZGUgKi8KLQkgIGV4cFtudW1vcHNdLlhfb3AgPSBPX2Fic2VudDsKLQkgIGV4cFtudW1vcHMrK10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9QTFVTOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcG9zdCA9IDA7Ci0gICAgfQotCi0gIGV4cFtudW1vcHNdLlhfb3AgPSAwOwotICByZXR1cm4gKG51bW9wcyk7Ci19Ci0KLS8qIGJ1aWxkX2luc24gZ2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbi4gIEl0IGRvZXMgZXZlcnl0aGluZyAqLwotLyogYnV0IHdyaXRlIHRoZSBGTSBiaXRzLiAqLwotCi1zdGF0aWMgbG9uZyBsb25nCi1idWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzKSAKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyAqb3BlcnM7Ci17Ci0gIGludCBpLCBsZW5ndGgsIGJpdHMsIHNoaWZ0LCBmbGFnczsKLSAgdW5zaWduZWQgaW50IG51bWJlciwgaWQ9MDsKLSAgbG9uZyBsb25nIGluc247Ci0gIHN0cnVjdCBkMzB2X29wY29kZSAqb3AgPSBvcGNvZGUtPm9wOwotICBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmZvcm0gPSBvcGNvZGUtPmZvcm07Ci0KLSAgaW5zbiA9IG9wY29kZS0+ZWNjIDw8IDI4IHwgb3AtPm9wMSA8PCAyNSB8IG9wLT5vcDIgPDwgMjAgfCBmb3JtLT5tb2RpZmllciA8PCAxODsKLQotICBmb3IgKGk9MDsgZm9ybS0+b3BlcmFuZHNbaV07IGkrKykgCi0gICAgeyAKLSAgICAgIGZsYWdzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXS5mbGFnczsKLQotICAgICAgLyogbXVzdCBiZSBhIHJlZ2lzdGVyIG9yIG51bWJlciAqLwotICAgICAgaWYgKCEoZmxhZ3MgJiBPUEVSQU5EX1JFRykgJiYgIShmbGFncyAmIE9QRVJBTkRfTlVNKSAmJiAKLQkgICEoZmxhZ3MgJiBPUEVSQU5EX05BTUUpICYmICEoZmxhZ3MgJiBPUEVSQU5EX1NQRUNJQUwpKQotCWNvbnRpbnVlOwotCi0gICAgICBiaXRzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXS5iaXRzOwotICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9TSElGVCkKLQliaXRzICs9IDM7Ci0KLSAgICAgIGxlbmd0aCA9IGQzMHZfb3BlcmFuZF90YWJsZVtmb3JtLT5vcGVyYW5kc1tpXV0ubGVuZ3RoOwotICAgICAgc2hpZnQgPSAxMiAtIGQzMHZfb3BlcmFuZF90YWJsZVtmb3JtLT5vcGVyYW5kc1tpXV0ucG9zaXRpb247Ci0gICAgICBpZiAob3BlcnNbaV0uWF9vcCAhPSBPX3N5bWJvbCkKLQludW1iZXIgPSBvcGVyc1tpXS5YX2FkZF9udW1iZXI7Ci0gICAgICBlbHNlCi0JbnVtYmVyID0gMDsKLSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKQotCXsKLQkgIC8qIGNoZWNrIGZvciBtdmZzeXMgb3IgbXZ0c3lzIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0JICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wgJiYgKG51bWJlciAmIDB4N2YpID4gTUFYX0NPTlRST0xfUkVHKQotCSAgICB7Ci0JICAgICAgLyogUFNXTCBvciBQU1dIICovCi0JICAgICAgaWQgPSAobnVtYmVyICYgMHg3ZikgLSBNQVhfQ09OVFJPTF9SRUc7Ci0JICAgICAgbnVtYmVyID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAobnVtYmVyICYgT1BFUkFORF9GTEFHKQotCSAgICB7Ci0JICAgICAgaWQgPSAzOyAgLyogbnVtYmVyIGlzIGEgZmxhZyByZWdpc3RlciAqLwotCSAgICB9Ci0JICBudW1iZXIgJj0gMHg3RjsKLQl9Ci0gICAgICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfU1BFQ0lBTCkKLQl7Ci0JICBudW1iZXIgPSBpZDsKLQl9Ci0KLSAgICAgIGlmIChvcGVyc1tpXS5YX29wICE9IE9fcmVnaXN0ZXIgJiYgb3BlcnNbaV0uWF9vcCAhPSBPX2NvbnN0YW50ICYmICEoZmxhZ3MgJiBPUEVSQU5EX05BTUUpKQotCXsKLQkgIC8qIG5vdyBjcmVhdGUgYSBmaXh1cCAqLwotCi0JICBpZiAoZml4dXBzLT5mYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0KLQkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID0gCi0JICAgIGdldF9yZWxvYyAoKHN0cnVjdCBkMzB2X29wZXJhbmQgKikmZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXSwgb3AtPnJlbG9jX2ZsYWcpOwotCSAgZml4dXBzLT5maXhbZml4dXBzLT5mY10uc2l6ZSA9IDQ7Ci0JICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5leHAgPSBvcGVyc1tpXTsKLQkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLm9wZXJhbmQgPSBmb3JtLT5vcGVyYW5kc1tpXTsKLQkgIGlmIChmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5yZWxvYyA9PSBCRkRfUkVMT0NfRDMwVl85X1BDUkVMKQotCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5wY3JlbCA9IFJFTE9DX1BDUkVMOwotCSAgZWxzZQotCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5wY3JlbCA9IG9wLT5yZWxvY19mbGFnOwotCSAgKGZpeHVwcy0+ZmMpKys7Ci0JfQotCi0gICAgICAvKiB0cnVuY2F0ZSB0byB0aGUgcHJvcGVyIG51bWJlciBvZiBiaXRzICovCi0gICAgICBpZiAoKG9wZXJzW2ldLlhfb3AgPT0gT19jb25zdGFudCkgJiYgY2hlY2tfcmFuZ2UgKG51bWJlciwgYml0cywgZmxhZ3MpKQotCWFzX2JhZCAoXygib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVkIiksbnVtYmVyKTsKLSAgICAgIGlmIChiaXRzIDwgMzEpCi0JbnVtYmVyICY9IDB4N0ZGRkZGRkYgPj4gKDMxIC0gYml0cyk7Ci0gICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotCW51bWJlciA+Pj0gMzsKLSAgICAgIGlmIChiaXRzID09IDMyKQotCXsKLQkgIC8qIGl0J3MgYSBMT05HIGluc3RydWN0aW9uICovCi0JICBpbnNuIHw9IChudW1iZXIgPj4gMjYpOwkvKiB0b3AgNiBiaXRzICovCi0JICBpbnNuIDw8PSAzMjsJCQkvKiBzaGlmdCB0aGUgZmlyc3Qgd29yZCBvdmVyICovCi0JICBpbnNuIHw9ICgobnVtYmVyICYgMHgwM0ZDMDAwMCkgPDwgMik7ICAvKiBuZXh0IDggYml0cyAqLyAKLQkgIGluc24gfD0gbnVtYmVyICYgMHgwMDAzRkZGRjsJCS8qIGJvdHRvbSAxOCBiaXRzICovCi0JfQotICAgICAgZWxzZQotCWluc24gfD0gbnVtYmVyIDw8IHNoaWZ0OwotICAgIH0KLSAgcmV0dXJuIGluc247Ci19Ci0KLQotLyogd3JpdGUgb3V0IGEgbG9uZyBmb3JtIGluc3RydWN0aW9uICovCi1zdGF0aWMgdm9pZAotd3JpdGVfbG9uZyAob3Bjb2RlLCBpbnNuLCBmeCkgCi0gICAgIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTsKLSAgICAgbG9uZyBsb25nIGluc247Ci0gICAgIEZpeHVwcyAqZng7Ci17Ci0gIGludCBpLCB3aGVyZTsKLSAgY2hhciAqZiA9IGZyYWdfbW9yZSAoOCk7Ci0KLSAgaW5zbiB8PSBGTTExOwotICBkMzB2X251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgOCk7Ci0KLSAgZm9yIChpPTA7IGkgPCBmeC0+ZmM7IGkrKykgCi0gICAgewotICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MpCi0JeyAKLQkgIHdoZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOyAKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIHdoZXJlLAotCQkgICAgICAgZngtPmZpeFtpXS5zaXplLAotCQkgICAgICAgJihmeC0+Zml4W2ldLmV4cCksCi0JCSAgICAgICBmeC0+Zml4W2ldLnBjcmVsLAotCQkgICAgICAgZngtPmZpeFtpXS5yZWxvYyk7Ci0JfQotICAgIH0KLSAgZngtPmZjID0gMDsKLX0KLQotCi0vKiBXcml0ZSBvdXQgYSBzaG9ydCBmb3JtIGluc3RydWN0aW9uIGJ5IGl0c2VsZi4gICovCi1zdGF0aWMgdm9pZAotd3JpdGVfMV9zaG9ydCAob3Bjb2RlLCBpbnNuLCBmeCwgdXNlX3NlcXVlbnRpYWwpIAotICAgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGU7Ci0gICAgIGxvbmcgbG9uZyBpbnNuOwotICAgICBGaXh1cHMgKmZ4OwotICAgICBpbnQgdXNlX3NlcXVlbnRpYWw7Ci17Ci0gIGNoYXIgKmYgPSBmcmFnX21vcmUgKDgpOwotICBpbnQgaSwgd2hlcmU7Ci0KLSAgaWYgKHdhcm5fbm9wcyA9PSBOT1BfQUxMKQotICAgIGFzX3dhcm4gKF8oIiVzIE5PUCBpbnNlcnRlZCIpLCB1c2Vfc2VxdWVudGlhbCA/Ci0JICAgICBfKCJzZXF1ZW50aWFsIikgOiBfKCJwYXJhbGxlbCIpKTsKLQotICAvKiBUaGUgb3RoZXIgY29udGFpbmVyIG5lZWRzIHRvIGJlIE5PUC4gKi8KLSAgaWYgKHVzZV9zZXF1ZW50aWFsKQotICAgIHsKLSAgICAgIC8qIFVzZSBhIHNlcXVlbnRpYWwgTk9QIHJhdGhlciB0aGFuIGEgcGFyYWxsZWwgb25lLAotCSBhcyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBpcyBhIEZMQUdfTVVMMzIgdHlwZSBvbmUKLQkgYW5kIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGEgbG9hZC4gICovCi0gICAgICAKLSAgICAgIC8qIEFjY29yZGluZyB0byA0LjMuMTogZm9yIEZNPTAxLCBzdWItaW5zdHJ1Y3Rpb25zIHBlcmZvcm1lZAotCSBvbmx5IGJ5IElVIGNhbm5vdCBiZSBlbmNvZGVkIGluIEwtY29udGFpbmVyLiAqLwotICAgICAgCi0gICAgICBpZiAob3Bjb2RlLT5vcC0+dW5pdCA9PSBJVSkKLQlpbnNuIHw9IEZNMTAgfCBOT1BfTEVGVDsJLyogcmlnaHQgdGhlbiBsZWZ0ICovCi0gICAgICBlbHNlCi0JaW5zbiA9IEZNMDEgfCAoaW5zbiA8PCAzMikgfCBOT1BfUklHSFQ7CS8qIGxlZnQgdGhlbiByaWdodCAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFjY29yZGluZyB0byA0LjMuMTogZm9yIEZNPTAwLCBzdWItaW5zdHJ1Y3Rpb25zIHBlcmZvcm1lZAotCSBvbmx5IGJ5IElVIGNhbm5vdCBiZSBlbmNvZGVkIGluIEwtY29udGFpbmVyLiAqLwotICAgICAgCi0gICAgICBpZiAob3Bjb2RlLT5vcC0+dW5pdCA9PSBJVSkKLQlpbnNuIHw9IEZNMDAgfCBOT1BfTEVGVDsJCS8qIHJpZ2h0IGNvbnRhaW5lciAqLwotICAgICAgZWxzZQotCWluc24gPSBGTTAwIHwgKGluc24gPDwgMzIpIHwgTk9QX1JJR0hUOwkvKiBsZWZ0IGNvbnRhaW5lciAqLwotICAgIH0KLQotICBkMzB2X251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgOCk7Ci0KLSAgZm9yIChpPTA7IGkgPCBmeC0+ZmM7IGkrKykgCi0gICAgewotICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MpCi0JeyAKLQkgIHdoZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOyAKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIHdoZXJlLCAKLQkJICAgICAgIGZ4LT5maXhbaV0uc2l6ZSwKLQkJICAgICAgICYoZngtPmZpeFtpXS5leHApLAotCQkgICAgICAgZngtPmZpeFtpXS5wY3JlbCwKLQkJICAgICAgIGZ4LT5maXhbaV0ucmVsb2MpOwotCX0KLSAgICB9Ci0gIGZ4LT5mYyA9IDA7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHNob3J0IGZvcm0gaW5zdHJ1Y3Rpb24gaWYgcG9zc2libGUuCi0gICBSZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBub3Qgd3JpdHRlbiBvdXQuICAqLwotc3RhdGljIGludAotd3JpdGVfMl9zaG9ydCAob3Bjb2RlMSwgaW5zbjEsIG9wY29kZTIsIGluc24yLCBleGVjX3R5cGUsIGZ4KSAKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlMSwgKm9wY29kZTI7Ci0gICAgIGxvbmcgbG9uZyBpbnNuMSwgaW5zbjI7Ci0gICAgIGV4ZWNfdHlwZV9lbnVtIGV4ZWNfdHlwZTsKLSAgICAgRml4dXBzICpmeDsKLXsKLSAgbG9uZyBsb25nIGluc24gPSBOT1AyOwotICBjaGFyICpmOwotICBpbnQgaSxqLCB3aGVyZTsKLQotICBpZiAoZXhlY190eXBlID09IEVYRUNfU0VRCi0gICAgICAmJiAob3Bjb2RlMS0+b3AtPmZsYWdzX3VzZWQgJiAoRkxBR19KTVAgfCBGTEFHX0pTUikpCi0gICAgICAmJiAoKG9wY29kZTEtPm9wLT5mbGFnc191c2VkICYgRkxBR19ERUxBWSkgPT0gMCkKLSAgICAgICYmICgob3Bjb2RlMS0+ZWNjID09IEVDQ19BTCkgfHwgISBPcHRpbWl6aW5nKSkKLSAgICB7Ci0gICAgICAvKiBVbmNvbmRpdGlvbmFsLCBub24tZGVsYXllZCBicmFuY2hlcyBraWxsIGluc3RydWN0aW9ucyBpbgotCSB0aGUgcmlnaHQgYmluLiAgQ29uZGl0aW9uYWwgYnJhbmNoZXMgZG9uJ3QgYWx3YXlzIGJ1dCBpZgotCSB3ZSBhcmUgbm90IG9wdGltaXppbmcsIHRoZW4gd2UgaGF2ZSBiZWVuIGFza2VkIHRvIHByb2R1Y2UKLQkgYW4gZXJyb3IgYWJvdXQgc3VjaCBjb25zdHJ1Y3RzLiAgRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzCi0JIHRlc3QsIHN1YnJvdXRpbmUgY2FsbHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYnJhbmNoZXMuICAqLwotICAgICAgd3JpdGVfMV9zaG9ydCAob3Bjb2RlMSwgaW5zbjEsIGZ4LT5uZXh0LCBmYWxzZSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIAotICAvKiBOb3RlOiB3ZSBkbyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzdWJyb3V0aW5lIGNhbGxzIG9jY3VyaW5nCi0gICAgIGluIHRoZSByaWdodCBoYW5kIGNvbnRhaW5lci4gIFRoZSByZXR1cm4gYWRkcmVzcyBpcyBhbHdheXMKLSAgICAgYWxpZ25lZCB0byB0aGUgbmV4dCA2NCBiaXQgYm91bmRhcnksIGJlIHRoYXQgNjQgb3IgMzIgYml0IGF3YXkuICAqLwotICAKLSAgc3dpdGNoIChleGVjX3R5cGUpIAotICAgIHsKLSAgICBjYXNlIEVYRUNfVU5LTk9XTjoJLyogT3JkZXIgbm90IHNwZWNpZmllZC4gKi8KLSAgICAgIGlmIChPcHRpbWl6aW5nCi0JICAmJiBwYXJhbGxlbF9vayAob3Bjb2RlMSwgaW5zbjEsIG9wY29kZTIsIGluc24yLCBleGVjX3R5cGUpCi0JICAmJiAhICggICAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUKLQkJIHx8IG9wY29kZTEtPm9wLT51bml0ID09IE1VKQotCQkmJgotCQkoICAgb3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUKLQkJIHx8IG9wY29kZTItPm9wLT51bml0ID09IE1VKSkpCi0JewotCSAgLyogcGFyYWxsZWwgKi8KLQkgIGV4ZWNfdHlwZSA9IEVYRUNfUEFSQUxMRUw7Ci0JICAKLQkgIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBJVQotCSAgICAgIHx8IG9wY29kZTItPm9wLT51bml0ID09IE1VCi0JICAgICAgfHwgb3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpCi0JICAgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDMyKSB8IGluc24xOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW5zbiA9IEZNMDAgfCAoaW5zbjEgPDwgMzIpIHwgaW5zbjI7ICAKLQkgICAgICBmeCA9IGZ4LT5uZXh0OwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoKG9wY29kZTEtPm9wLT5mbGFnc191c2VkICYgKEZMQUdfSk1QIHwgRkxBR19KU1IpCi0JCSYmICgob3Bjb2RlMS0+b3AtPmZsYWdzX3VzZWQgJiBGTEFHX0RFTEFZKSA9PSAwKQotCQkmJiAoKG9wY29kZTEtPmVjYyA9PSBFQ0NfQUwpIHx8ICEgT3B0aW1pemluZykpCi0JICAgICAgIHx8IG9wY29kZTEtPm9wLT5mbGFnc191c2VkICYgRkxBR19SUCkKLQl7Ci0JICAvKiBXZSBtdXN0IGVtaXQgKG5vbi1kZWxheWVkKSBicmFuY2ggdHlwZSBpbnN0cnVjdGlvbnMKLQkgICAgIG9uIHRoZWlyIG93biB3aXRoIG5vdGhpbmcgaW4gdGhlIHJpZ2h0IGNvbnRhaW5lci4gICovCi0JICAvKiBXZSBtdXN0IHRyZWF0IHJlcGVhdCBpbnN0cnVjdGlvbnMgbGlrZXdpc2UsIHNpbmNlIHRoZQotCSAgICAgZm9sbG93aW5nIGluc3RydWN0aW9uIGhhcyB0byBiZSBzZXBhcmF0ZSBmcm9tIHRoZSByZXBlYXQKLQkgICAgIGluIG9yZGVyIHRvIGJlIHJlcGVhdGVkLiAgKi8KLQkgIHdyaXRlXzFfc2hvcnQgKG9wY29kZTEsIGluc24xLCBmeC0+bmV4dCwgZmFsc2UpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgZWxzZSBpZiAocHJldl9sZWZ0X2tpbGxzX3JpZ2h0X3ApCi0JewotCSAgLyogVGhlIGxlZnQgaW5zdHJ1Y3Rpb24ga2lscyB0aGUgcmlnaHQgc2xvdCwgc28gd2UKLQkgICAgIG11c3QgbGVhdmUgaXQgZW1wdHkuICAqLwotCSAgd3JpdGVfMV9zaG9ydCAob3Bjb2RlMSwgaW5zbjEsIGZ4LT5uZXh0LCBmYWxzZSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBJVQotCSAgICAgICB8fCAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gRUlUSEVSCi0JCSAgICYmIG9wY29kZTItPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VKSkKLQl7Ci0JICAvKiByZXZlcnNlIHNlcXVlbnRpYWwgKi8KLQkgIGluc24gPSBGTTEwIHwgKGluc24yIDw8IDMyKSB8IGluc24xOwotCSAgZXhlY190eXBlID0gRVhFQ19SRVZTRVE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHNlcXVlbnRpYWwgKi8KLQkgIGluc24gPSBGTTAxIHwgKGluc24xIDw8IDMyKSB8IGluc24yOwotCSAgZnggPSBmeC0+bmV4dDsKLQkgIGV4ZWNfdHlwZSA9IEVYRUNfU0VROwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFWEVDX1BBUkFMTEVMOgkvKiBwYXJhbGxlbCAqLwotICAgICAgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsID0gZmxhZ194cF9zdGF0ZTsKLSAgICAgIGlmICghIHBhcmFsbGVsX29rIChvcGNvZGUxLCBpbnNuMSwgb3Bjb2RlMiwgaW5zbjIsIGV4ZWNfdHlwZSkpCi0JYXNfYmFkIChfKCJJbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIpKTsKLSAgICAgIGVsc2UgaWYgKG9wY29kZTEtPm9wLT51bml0ID09IElVKQotCXsKLQkgIGlmIChvcGNvZGUyLT5vcC0+dW5pdCA9PSBJVSkKLQkgICAgYXNfYmFkIChfKCJUd28gSVUgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0JICBhc193YXJuIChfKCJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIpKTsKLSAJICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAzMikgfCBpbnNuMTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUyLT5vcC0+dW5pdCA9PSBNVSkKLQl7Ci0JICBpZiAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gTVUpCi0JICAgIGFzX2JhZCAoXygiVHdvIE1VIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIikpOwotCSAgZWxzZSBpZiAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpCi0JICAgIGFzX3dhcm4gKF8oIkV4ZWN1dGluZyAlcyBpbiBJVSBtYXkgbm90IHdvcmsiKSwgb3Bjb2RlMS0+b3AtPm5hbWUpOwotCSAgYXNfd2FybiAoXygiU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIiKSk7Ci0JICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAzMikgfCBpbnNuMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG9wY29kZTItPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VKQotCSAgICBhc193YXJuIChfKCJFeGVjdXRpbmcgJXMgaW4gSVUgbWF5IG5vdCB3b3JrIiksIG9wY29kZTItPm9wLT5uYW1lKTsKLQkgIAotCSAgaW5zbiA9IEZNMDAgfCAoaW5zbjEgPDwgMzIpIHwgaW5zbjI7ICAKLQkgIGZ4ID0gZngtPm5leHQ7Ci0JfQotICAgICAgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFWEVDX1NFUToJLyogc2VxdWVudGlhbCAqLwotICAgICAgaWYgKG9wY29kZTEtPm9wLT51bml0ID09IElVKQotCWFzX2JhZCAoXygiSVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgbGVmdCBjb250YWluZXIiKSk7Ci0gICAgICBpZiAocHJldl9sZWZ0X2tpbGxzX3JpZ2h0X3ApCi0JYXNfYmFkIChfKCJzcGVjaWFsIGxlZnQgaW5zdHJ1Y3Rpb24gYCVzJyBraWxscyBpbnN0cnVjdGlvbiAiCi0JCSAgICJgJXMnIGluIHJpZ2h0IGNvbnRhaW5lciIpLAotCQkgb3Bjb2RlMS0+b3AtPm5hbWUsIG9wY29kZTItPm9wLT5uYW1lKTsKLSAgICAgIGlmIChvcGNvZGUyLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkKLQlhc193YXJuIChfKCJFeGVjdXRpbmcgJXMgaW4gSVUgbWF5IG5vdCB3b3JrIiksIG9wY29kZTItPm9wLT5uYW1lKTsKLSAgICAgIGluc24gPSBGTTAxIHwgKGluc24xIDw8IDMyKSB8IGluc24yOyAgCi0gICAgICBmeCA9IGZ4LT5uZXh0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVYRUNfUkVWU0VROgkvKiByZXZlcnNlIHNlcXVlbnRpYWwgKi8KLSAgICAgIGlmIChvcGNvZGUyLT5vcC0+dW5pdCA9PSBNVSkKLQlhc19iYWQgKF8oIk1VIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIHJpZ2h0IGNvbnRhaW5lciIpKTsKLSAgICAgIGlmIChvcGNvZGUyLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkKLQlhc193YXJuIChfKCJFeGVjdXRpbmcgJXMgaW4gSVUgbWF5IG5vdCB3b3JrIiksIG9wY29kZTItPm9wLT5uYW1lKTsKLSAgICAgIGluc24gPSBGTTEwIHwgKGluc24xIDw8IDMyKSB8IGluc24yOyAgCi0gICAgICBmeCA9IGZ4LT5uZXh0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oInVua25vd24gZXhlY3V0aW9uIHR5cGUgcGFzc2VkIHRvIHdyaXRlXzJfc2hvcnQoKSIpKTsKLSAgICB9Ci0KLSAgLyogIHByaW50ZiAoIndyaXRpbmcgb3V0ICVsbHhcbiIsaW5zbik7ICovCi0gIGYgPSBmcmFnX21vcmUgKDgpOwotICBkMzB2X251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgOCk7Ci0KLSAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBhIDMyLWJpdCBtdWx0aXBseSBidXQgaXQgaXMgcHV0IGludG8gYQotICAgICBwYXJhbGxlbCBjb250YWluZXIsIG1hcmsgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gYXMgYmVpbmcgYSAzMi1iaXQKLSAgICAgbXVsdGlwbHkuICAqLwotICBpZiAocHJldl9tdWwzMl9wICYmIGV4ZWNfdHlwZSA9PSBFWEVDX1BBUkFMTEVMKQotICAgIGN1cl9tdWwzMl9wID0gMTsKLQotICBmb3IgKGo9MDsgajwyOyBqKyspIAotICAgIHsKLSAgICAgIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotCXsKLQkgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCSAgICB7Ci0JICAgICAgd2hlcmUgPSAoZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSArIDQqajsKLQotCSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJCSAgIHdoZXJlLCAKLQkJCSAgIGZ4LT5maXhbaV0uc2l6ZSwKLQkJCSAgICYoZngtPmZpeFtpXS5leHApLAotCQkJICAgZngtPmZpeFtpXS5wY3JlbCwKLQkJCSAgIGZ4LT5maXhbaV0ucmVsb2MpOwotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICBmeC0+ZmMgPSAwOwotICAgICAgZnggPSBmeC0+bmV4dDsKLSAgICB9Ci0gIAotICByZXR1cm4gMDsKLX0KLQotCi0vKiBDaGVjayAyIGluc3RydWN0aW9ucyBhbmQgZGV0ZXJtaW5lIGlmIHRoZXkgY2FuIGJlIHNhZmVseSAqLwotLyogZXhlY3V0ZWQgaW4gcGFyYWxsZWwuICBSZXR1cm5zIDEgaWYgdGhleSBjYW4gYmUuICAgICAgICAgKi8KLXN0YXRpYyBpbnQKLXBhcmFsbGVsX29rIChvcDEsIGluc24xLCBvcDIsIGluc24yLCBleGVjX3R5cGUpCi0gICAgIHN0cnVjdCBkMzB2X2luc24gKm9wMSwgKm9wMjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuMSwgaW5zbjI7Ci0gICAgIGV4ZWNfdHlwZV9lbnVtIGV4ZWNfdHlwZTsKLXsKLSAgaW50IGksIGosIHNoaWZ0LCByZWdubywgYml0cywgZWNjOwotICB1bnNpZ25lZCBsb25nIGZsYWdzLCBtYXNrLCBmbGFnc19zZXQxLCBmbGFnc19zZXQyLCBmbGFnc191c2VkMSwgZmxhZ3NfdXNlZDI7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zLCBtb2RfcmVnWzJdWzNdLCB1c2VkX3JlZ1syXVszXSwgZmxhZ19yZWdbMl07Ci0gIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZjsKLSAgc3RydWN0IGQzMHZfb3Bjb2RlICpvcDsKLQotICAvKiBzZWN0aW9uIDQuMzogYm90aCBpbnN0cnVjdGlvbnMgbXVzdCBub3QgYmUgSVUgb3IgTVUgb25seSAqLwotICBpZiAoKG9wMS0+b3AtPnVuaXQgPT0gSVUgJiYgb3AyLT5vcC0+dW5pdCA9PSBJVSkKLSAgICAgIHx8IChvcDEtPm9wLT51bml0ID09IE1VICYmIG9wMi0+b3AtPnVuaXQgPT0gTVUpKQotICAgIHJldHVybiAwOwotCi0gIC8qIGZpcnN0IGluc3RydWN0aW9uIG11c3Qgbm90IGJlIGEganVtcCB0byBzYWZlbHkgb3B0aW1pemUsIHVubGVzcyB0aGlzCi0gICAgIGlzIGFuIGV4cGxpY2l0IHBhcmFsbGVsIG9wZXJhdGlvbi4gICovCi0gIGlmIChleGVjX3R5cGUgIT0gRVhFQ19QQVJBTExFTAotICAgICAgJiYgKG9wMS0+b3AtPmZsYWdzX3VzZWQgJiAoRkxBR19KTVAgfCBGTEFHX0pTUikpKQotICAgIHJldHVybiAwOwotCi0gIC8qIElmIG9uZSBpbnN0cnVjdGlvbiBpcyAvVFggb3IgL1hUIGFuZCB0aGUgb3RoZXIgaXMgL0ZYIG9yIC9YRiByZXNwZWN0aXZlbHksCi0gICAgIHRoZW4gaXQgaXMgc2FmZSB0byBhbGxvdyB0aGUgdHdvIHRvIGJlIGRvbmUgYXMgcGFyYWxsZWwgb3BzLCBzaW5jZSBvbmx5Ci0gICAgIG9uZSB3aWxsIGV2ZXIgYmUgZXhlY3V0ZWQgYXQgYSB0aW1lLiAgKi8KLSAgaWYgKChvcDEtPmVjYyA9PSBFQ0NfVFggJiYgb3AyLT5lY2MgPT0gRUNDX0ZYKQotICAgICAgfHwgKG9wMS0+ZWNjID09IEVDQ19GWCAmJiBvcDItPmVjYyA9PSBFQ0NfVFgpCi0gICAgICB8fCAob3AxLT5lY2MgPT0gRUNDX1hUICYmIG9wMi0+ZWNjID09IEVDQ19YRikKLSAgICAgIHx8IChvcDEtPmVjYyA9PSBFQ0NfWEYgJiYgb3AyLT5lY2MgPT0gRUNDX1hUKSkKLSAgICAgcmV0dXJuIDE7Ci0KLSAgLyogWzBdIHIwLXIzMQotICAgICBbMV0gcjMyLXI2MwotICAgICBbMl0gYTAsIGExLCBmbGFnIHJlZ2lzdGVycyAqLwotCi0gIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgewotICAgICAgaWYgKGogPT0gMCkKLQl7Ci0JICBmID0gb3AxLT5mb3JtOwotCSAgb3AgPSBvcDEtPm9wOwotCSAgZWNjID0gb3AxLT5lY2M7Ci0JICBpbnMgPSBpbnNuMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZiA9IG9wMi0+Zm9ybTsKLQkgIG9wID0gb3AyLT5vcDsKLQkgIGVjYyA9IG9wMi0+ZWNjOwotCSAgaW5zID0gaW5zbjI7Ci0JfQotICAgICAgZmxhZ19yZWdbal0gPSAwOwotICAgICAgbW9kX3JlZ1tqXVswXSA9IG1vZF9yZWdbal1bMV0gPSAwOwotICAgICAgdXNlZF9yZWdbal1bMF0gPSB1c2VkX3JlZ1tqXVsxXSA9IDA7Ci0KLSAgICAgIGlmIChmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwpCi0JewotCSAgLyogRm9yIGh1bWFuIHNwZWNpZmllZCBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgd2UgaGF2ZSBiZWVuIGFza2VkCi0JICAgICB0byBpZ25vcmUgdGhlIHBvc3NpYmlsaXR5IHRoYXQgYm90aCBpbnN0cnVjdGlvbnMgY291bGQgbW9kaWZ5Ci0JICAgICBiaXRzIGluIHRoZSBQU1csIHNvIHdlIGluaXRpYWxpc2UgdGhlIG1vZCAmIHVzZWQgYXJyYXlzIHRvIDAuCi0JICAgICBXZSBoYXZlIGJlZW4gYXNrZWQsIGhvd2V2ZXIsIHRvIHJlZnVzZSB0byBhbGxvdyBwYXJhbGxlbAotCSAgICAgaW5zdHJ1Y3Rpb25zIHdoaWNoIGV4cGxpY2l0bHkgc2V0IHRoZSBzYW1lIGZsYWcgcmVnaXN0ZXIsCi0JICAgICBlZyAiY21wbmUgZjAscjEsMHgxMCB8fCBjbXBlcSBmMCwgcjUsIDB4MiIsIHNvIGZ1cnRoZXIgb24gd2UgdGVzdAotCSAgICAgZm9yIHRoZSB1c2Ugb2YgYSBmbGFnIHJlZ2lzdGVyIGFuZCBzZXQgYSBiaXQgaW4gdGhlIG1vZCBvciB1c2VkCi0JICAgICBhcnJheSBhcHByb3ByaWF0ZWx5LiAgKi8KLQkgICAgIAotCSAgbW9kX3JlZ1tqXVsyXSAgPSAwOwotCSAgdXNlZF9yZWdbal1bMl0gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtb2RfcmVnW2pdWzJdID0gKG9wLT5mbGFnc19zZXQgJiBGTEFHX0FMTCk7Ci0JICB1c2VkX3JlZ1tqXVsyXSA9IChvcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfQUxMKTsKLQl9Ci0gICAgICAKLSAgICAgIC8qIEJTUi9KU1IgYWx3YXlzIHNldHMgUjYyICovCi0gICAgICBpZiAob3AtPmZsYWdzX3VzZWQgJiBGTEFHX0pTUikKLQltb2RfcmVnW2pdWzFdID0gKDFMIDw8ICg2Mi0zMikpOwotCi0gICAgICAvKiBjb25kaXRpb25hbCBleGVjdXRpb24gYWZmZWN0cyB0aGUgZmxhZ3NfdXNlZCAqLwotICAgICAgc3dpdGNoIChlY2MpCi0JewotCWNhc2UgRUNDX1RYOgotCWNhc2UgRUNDX0ZYOgotCSAgdXNlZF9yZWdbal1bMl0gfD0gZmxhZ19yZWdbal0gPSBGTEFHXzA7Ci0JICBicmVhazsKLQotCWNhc2UgRUNDX1hUOgotCWNhc2UgRUNDX1hGOgotCSAgdXNlZF9yZWdbal1bMl0gfD0gZmxhZ19yZWdbal0gPSBGTEFHXzE7Ci0JICBicmVhazsKLQotCWNhc2UgRUNDX1RUOgotCWNhc2UgRUNDX1RGOgotCSAgdXNlZF9yZWdbal1bMl0gfD0gZmxhZ19yZWdbal0gPSAoRkxBR18wIHwgRkxBR18xKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgZm9yIChpID0gMDsgZi0+b3BlcmFuZHNbaV07IGkrKykKLQl7Ci0JICBmbGFncyA9IGQzMHZfb3BlcmFuZF90YWJsZVtmLT5vcGVyYW5kc1tpXV0uZmxhZ3M7Ci0JICBzaGlmdCA9IDEyIC0gZDMwdl9vcGVyYW5kX3RhYmxlW2YtPm9wZXJhbmRzW2ldXS5wb3NpdGlvbjsKLQkgIGJpdHMgPSBkMzB2X29wZXJhbmRfdGFibGVbZi0+b3BlcmFuZHNbaV1dLmJpdHM7Ci0JICBpZiAoYml0cyA9PSAzMikKLQkgICAgbWFzayA9IDB4ZmZmZmZmZmY7Ci0JICBlbHNlCi0JICAgIG1hc2sgPSAweDdGRkZGRkZGID4+ICgzMSAtIGJpdHMpOwotCi0JICBpZiAoKGZsYWdzICYgT1BFUkFORF9QTFVTKSB8fCAoZmxhZ3MgJiBPUEVSQU5EX01JTlVTKSkKLQkgICAgewotCSAgICAgIC8qIHRoaXMgaXMgYSBwb3N0LWluY3JlbWVudCBvciBwb3N0LWRlY3JlbWVudCAqLwotCSAgICAgIC8qIHRoZSBwcmV2aW91cyByZWdpc3RlciBuZWVkcyB0byBiZSBtYXJrZWQgYXMgbW9kaWZpZWQgKi8KLQotCSAgICAgIHNoaWZ0ID0gMTIgLSBkMzB2X29wZXJhbmRfdGFibGVbZi0+b3BlcmFuZHNbaS0xXV0ucG9zaXRpb247Ci0JICAgICAgcmVnbm8gPSAoaW5zID4+IHNoaWZ0KSAmIDB4M2Y7Ci0JICAgICAgaWYgKHJlZ25vID49IDMyKQotCQltb2RfcmVnW2pdWzFdIHw9IDFMIDw8IChyZWdubyAtIDMyKTsKLQkgICAgICBlbHNlCi0JCW1vZF9yZWdbal1bMF0gfD0gMUwgPDwgcmVnbm87Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9SRUcpCi0JICAgIHsKLQkgICAgICByZWdubyA9IChpbnMgPj4gc2hpZnQpICYgbWFzazsKLQkgICAgICAvKiB0aGUgbWVtb3J5IHdyaXRlIGZ1bmN0aW9ucyBkb24ndCBoYXZlIGEgZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLQkgICAgICBpZiAoKGZsYWdzICYgT1BFUkFORF9ERVNUKSAmJiAhKG9wLT5mbGFnc19zZXQgJiBGTEFHX01FTSkpCi0JCXsKLQkJICAvKiBNT0RJRklFRCByZWdpc3RlcnMgYW5kIGZsYWdzICovCi0JCSAgaWYgKGZsYWdzICYgT1BFUkFORF9BQ0MpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChyZWdubyA9PSAwKQotCQkJbW9kX3JlZ1tqXVsyXSB8PSBGTEFHX0EwOwotCQkgICAgICBlbHNlIGlmIChyZWdubyA9PSAxKQotCQkJbW9kX3JlZ1tqXVsyXSB8PSBGTEFHX0ExOwotCQkgICAgICBlbHNlCi0JCQlhYm9ydCAoKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfRkxBRykKLQkJICAgIG1vZF9yZWdbal1bMl0gfD0gMUwgPDwgcmVnbm87Ci0JCSAgZWxzZSBpZiAoIShmbGFncyAmIE9QRVJBTkRfQ09OVFJPTCkpCi0JCSAgICB7Ci0JCSAgICAgIGludCByLCB6OwotCi0JCSAgICAgIC8qIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgYXJlIHR3byBkZXN0aW5hdGlvbiAqLwotCQkgICAgICAvKiByZWdpc3RlcnMsIGZvciBleGFtcGxlIGxkMncgKi8KLQkJICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF8yUkVHKQotCQkJeiA9IDE7Ci0JCSAgICAgIGVsc2UKLQkJCXogPSAwOwotCi0JCSAgICAgIGZvciAociA9IHJlZ25vOyByIDw9IHJlZ25vICsgejsgcisrKQotCQkJeyAKLQkJCSAgaWYgKHIgPj0gMzIpCi0JCQkgICAgbW9kX3JlZ1tqXVsxXSB8PSAxTCA8PCAociAtIDMyKTsKLQkJCSAgZWxzZQotCQkJICAgIG1vZF9yZWdbal1bMF0gfD0gMUwgPDwgcjsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFVTRUQsIGJ1dCBub3QgbW9kaWZpZWQgcmVnaXN0ZXJzIGFuZCBmbGFncyAqLwotCQkgIGlmIChmbGFncyAmIE9QRVJBTkRfQUNDKQotCQkgICAgewotCQkgICAgICBpZiAocmVnbm8gPT0gMCkKLQkJCXVzZWRfcmVnW2pdWzJdIHw9IEZMQUdfQTA7Ci0JCSAgICAgIGVsc2UgaWYgKHJlZ25vID09IDEpCi0JCQl1c2VkX3JlZ1tqXVsyXSB8PSBGTEFHX0ExOwotCQkgICAgICBlbHNlCi0JCQlhYm9ydCAoKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfRkxBRykKLQkJICAgIHVzZWRfcmVnW2pdWzJdIHw9IDFMIDw8IHJlZ25vOwotCQkgIGVsc2UgaWYgKCEoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpKQotCQkgICAgewotCQkgICAgICBpbnQgciwgejsKLQotCQkgICAgICAvKiBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSB0d28gc291cmNlICovCi0JCSAgICAgIC8qIHJlZ2lzdGVycywgZm9yIGV4YW1wbGUgc3QydyAqLwotCQkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EXzJSRUcpCi0JCQl6ID0gMTsKLQkJICAgICAgZWxzZQotCQkJeiA9IDA7Ci0KLQkJICAgICAgZm9yIChyID0gcmVnbm87IHIgPD0gcmVnbm8gKyB6OyByKyspCi0JCQl7IAotCQkJICBpZiAociA+PSAzMikKLQkJCSAgICB1c2VkX3JlZ1tqXVsxXSB8PSAxTCA8PCAociAtIDMyKTsKLQkJCSAgZWxzZQotCQkJICAgIHVzZWRfcmVnW2pdWzBdIHw9IDFMIDw8IHI7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICBmbGFnc19zZXQxID0gb3AxLT5vcC0+ZmxhZ3Nfc2V0OwotICBmbGFnc19zZXQyID0gb3AyLT5vcC0+ZmxhZ3Nfc2V0OwotICBmbGFnc191c2VkMSA9IG9wMS0+b3AtPmZsYWdzX3VzZWQ7Ci0gIGZsYWdzX3VzZWQyID0gb3AyLT5vcC0+ZmxhZ3NfdXNlZDsKLQotICAvKiBTVDJXL1NUNEhCIGNvbWJpbmVkIHdpdGggQUREcHBwL1NVQnBwcCBpcyBpbGxlZ2FsLiAgKi8KLSAgaWYgKCgoZmxhZ3Nfc2V0MSAmIChGTEFHX01FTSB8IEZMQUdfMldPUkQpKSA9PSAoRkxBR19NRU0gfCBGTEFHXzJXT1JEKQotICAgICAgICYmIChmbGFnc191c2VkMiAmIEZMQUdfQUREU1VCcHBwKSAhPSAwKQotICAgICAgfHwgKChmbGFnc19zZXQyICYgKEZMQUdfTUVNIHwgRkxBR18yV09SRCkpID09IChGTEFHX01FTSB8IEZMQUdfMldPUkQpCi0JICAmJiAoZmxhZ3NfdXNlZDEgJiBGTEFHX0FERFNVQnBwcCkgIT0gMCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogTG9hZCBpbnN0cnVjdGlvbiBjb21iaW5lZCB3aXRoIGhhbGYtd29yZCBtdWx0aXBseSBpcyBpbGxlZ2FsLiAgKi8KLSAgaWYgKCgoZmxhZ3NfdXNlZDEgJiBGTEFHX01FTSkgIT0gMCAmJiAoZmxhZ3NfdXNlZDIgJiBGTEFHX01VTDE2KSkKLSAgICAgIHx8ICgoZmxhZ3NfdXNlZDIgJiBGTEFHX01FTSkgIT0gMCAmJiAoZmxhZ3NfdXNlZDEgJiBGTEFHX01VTDE2KSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogU3BlY2lmaWNhbGx5IGFsbG93IGFkZCB8fCBhZGQgYnkgcmVtb3ZpbmcgY2FycnksIG92ZXJmbG93IGJpdHMgZGVwZW5kZW5jeS4KLSAgICAgVGhpcyBpcyBzYWZlLCBldmVuIGlmIGFuIGFkZGMgZm9sbG93cyBzaW5jZSB0aGUgSVUgdGFrZXMgdGhlIGFyZ3VtZW50IGluCi0gICAgIHRoZSByaWdodCBjb250YWluZXIsIGFuZCBpdCB3cml0ZXMgaXRzIHJlc3VsdHMgbGFzdC4KLSAgICAgSG93ZXZlciwgZG9uJ3QgcGFyYWxlbGxpemUgYWRkIGZvbGxvd2VkIGJ5IGFkZGMgb3Igc3ViIGZvbGxvd2VkIGJ5Ci0gICAgIHN1YmIuICAqLwotCi0gIGlmIChtb2RfcmVnWzBdWzJdID09IEZMQUdfQ1ZWQSAmJiBtb2RfcmVnWzFdWzJdID09IEZMQUdfQ1ZWQQotICAgICAgJiYgKHVzZWRfcmVnWzBdWzJdICYgfmZsYWdfcmVnWzBdKSA9PSAwCi0gICAgICAmJiAodXNlZF9yZWdbMV1bMl0gJiB+ZmxhZ19yZWdbMV0pID09IDAKLSAgICAgICYmIG9wMS0+b3AtPnVuaXQgPT0gRUlUSEVSICYmIG9wMi0+b3AtPnVuaXQgPT0gRUlUSEVSKQotICAgIHsKLSAgICAgIG1vZF9yZWdbMF1bMl0gPSBtb2RfcmVnWzFdWzJdID0gMDsKLSAgICB9Ci0KLSAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgc2Vjb25kIGluc3RydWN0aW9uIGRlcGVuZHMgb24gdGhlIGZpcnN0LCB3ZSBvYnZpb3VzbHkKLQkgY2Fubm90IHBhcmFsbGVsaXplLiAgTm90ZSwgdGhlIG1vZCBmbGFnIGltcGxpZXMgdXNlLCBzbwotCSBjaGVjayB0aGF0IGFzIHdlbGwuICAqLwotICAgICAgLyogSWYgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsIGlzIHNldCwgdGhlbiB0aGUgY2FzZSBvZiB0aGUgCi0JIHNlY29uZCBpbnN0cnVjdGlvbiB1c2luZyBhIHJlZ2lzdGVyIHRoZSBmaXJzdCBpbnN0cnVjdGlvbgotCSBtb2RpZmllcyBpcyBhc3N1bWVkIHRvIGJlIG9rYXk7IHdlIHRydXN0IHRoZSBodW1hbi4gIFdlCi0JIGRvbid0IHRydXN0IHRoZSBodW1hbiBpZiBib3RoIGluc3RydWN0aW9ucyBtb2RpZnkgdGhlIHNhbWUKLQkgcmVnaXN0ZXIgYnV0IHdlIGRvIHRydXN0IHRoZSBodW1hbiBpZiB0aGV5IG1vZGlmeSB0aGUgc2FtZQotCSBmbGFncy4gKi8KLSAgICAgIC8qIFdlIGhhdmUgbm93IGJlZW4gcmVxdWVzdGVkIG5vdCB0byB0cnVzdCB0aGUgaHVtYW4gaWYgdGhlCi0JIGluc3RydWN0aW9ucyBtb2RpZnkgdGhlIHNhbWUgZmxhZyByZWdpc3RlcnMgZWl0aGVyLiAgKi8KLSAgICAgIGlmIChmbGFnX2V4cGxpY2l0bHlfcGFyYWxsZWwpCi0JewotCSAgaWYgKChtb2RfcmVnWzBdW2pdICYgbW9kX3JlZ1sxXVtqXSkgIT0gMCkKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgICAgZWxzZQotICAgICAgICBpZiAoKG1vZF9yZWdbMF1bal0gJiAobW9kX3JlZ1sxXVtqXSB8IHVzZWRfcmVnWzFdW2pdKSkgIT0gMCkKLQkgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi0vKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgc3RyIHBvaW50cyB0byBhCi0gICBtYWNoaW5lLWRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdCB0aGUgZnJhZ3MvYnl0ZXMgCi0gICBpdCBhc3NlbWJsZXMgdG8uICBGb3IgdGhlIEQzMFYsIGl0IG1vc3RseSBoYW5kbGVzIHRoZSBzcGVjaWFsIFZMSVcgcGFyc2luZyBhbmQgcGFja2luZwotICAgYW5kIGxlYXZlcyB0aGUgZGlmZmljdWx0IHN0dWZmIHRvIGRvX2Fzc2VtYmxlKCkuICAqLwotCi1zdGF0aWMgbG9uZyBsb25nIHByZXZfaW5zbiA9IC0xOwotc3RhdGljIHN0cnVjdCBkMzB2X2luc24gcHJldl9vcGNvZGU7Ci1zdGF0aWMgc3Vic2VnVCBwcmV2X3N1YnNlZzsKLXN0YXRpYyBzZWdUIHByZXZfc2VnID0gMDsKLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBzdHJ1Y3QgZDMwdl9pbnNuIG9wY29kZTsKLSAgbG9uZyBsb25nIGluc247Ci0gIGV4ZWNfdHlwZV9lbnVtIGV4dHlwZSA9IEVYRUNfVU5LTk9XTjsJCS8qIGV4ZWN1dGlvbiB0eXBlOyBwYXJhbGxlbCwgZXRjICovCi0gIHN0YXRpYyBleGVjX3R5cGVfZW51bSBldHlwZSA9IEVYRUNfVU5LTk9XTjsJLyogc2F2ZWQgZXh0eXBlLiAgdXNlZCBmb3IgbXVsdGlsaW5lIGluc3RydWN0aW9ucyAqLwotICBjaGFyICpzdHIyOwotCi0gIGlmICgocHJldl9pbnNuICE9IC0xKSAmJiBwcmV2X3NlZwotICAgICAgICYmICgocHJldl9zZWcgIT0gbm93X3NlZykgfHwgKHByZXZfc3Vic2VnICE9IG5vd19zdWJzZWcpKSkKLSAgICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLQotICBpZiAoZDMwdl9jdXJyZW50X2FsaWduIDwgMykKLSAgICBkMzB2X2FsaWduICgzLCBOVUxMLCBkMzB2X2xhc3RfbGFiZWwpOwotICBlbHNlIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPiAzKQotICAgIGQzMHZfY3VycmVudF9hbGlnbiA9IDM7Ci0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci0KLSAgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsID0gMDsKLSAgZmxhZ194cF9zdGF0ZSA9IDA7Ci0gIGlmIChldHlwZSA9PSBFWEVDX1VOS05PV04pCi0gICAgewotICAgICAgLyogbG9vayBmb3IgdGhlIHNwZWNpYWwgbXVsdGlwbGUgaW5zdHJ1Y3Rpb24gc2VwYXJhdG9ycyAqLwotICAgICAgc3RyMiA9IHN0cnN0ciAoc3RyLCAifHwiKTsKLSAgICAgIGlmIChzdHIyKSAKLQl7Ci0JICBleHR5cGUgPSBFWEVDX1BBUkFMTEVMOwotCSAgZmxhZ194cF9zdGF0ZSA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cjIgPSBzdHJzdHIgKHN0ciwgIi0+Iik7Ci0JICBpZiAoc3RyMikgCi0JICAgIGV4dHlwZSA9IEVYRUNfU0VROwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RyMiA9IHN0cnN0ciAoc3RyLCAiPC0iKTsKLQkgICAgICBpZiAoc3RyMikgCi0JCWV4dHlwZSA9IEVYRUNfUkVWU0VROwotCSAgICB9Ci0JfQotICAgICAgLyogc3RyMiBwb2ludHMgdG8gdGhlIHNlcGFyYXRvciwgaWYgb25lICovCi0gICAgICBpZiAoc3RyMikgCi0JewotCSAgKnN0cjIgPSAwOwotCSAgCi0JICAvKiBpZiB0d28gaW5zdHJ1Y3Rpb25zIGFyZSBwcmVzZW50IGFuZCB3ZSBhbHJlYWR5IGhhdmUgb25lIHNhdmVkCi0JICAgICB0aGVuIGZpcnN0IHdyaXRlIGl0IG91dCAqLwotCSAgZDMwdl9jbGVhbnVwIChmYWxzZSk7Ci0JICAKLQkgIC8qIEFzc2VtYmxlIGZpcnN0IGluc3RydWN0aW9uIGFuZCBzYXZlIGl0LiAgKi8KLQkgIHByZXZfaW5zbiA9IGRvX2Fzc2VtYmxlIChzdHIsICZwcmV2X29wY29kZSwgMSwgMCk7Ci0JICBpZiAocHJldl9pbnNuID09IC0xKQotCSAgICBhc19iYWQgKF8oIkNhbm5vdCBhc3NlbWJsZSBpbnN0cnVjdGlvbiIpKTsKLQkgIGlmIChwcmV2X29wY29kZS5mb3JtICE9IE5VTEwgJiYgcHJldl9vcGNvZGUuZm9ybS0+Zm9ybSA+PSBMT05HKQotCSAgICBhc19iYWQgKF8oIkZpcnN0IG9wY29kZSBpcyBsb25nLiAgVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkLiIpKTsgCi0JICBmaXh1cHMgPSBmaXh1cHMtPm5leHQ7Ci0JICBzdHIgPSBzdHIyICsgMjsKLQkgIHByZXZfc2VnID0gbm93X3NlZzsKLQkgIHByZXZfc3Vic2VnID0gbm93X3N1YnNlZzsKLQl9Ci0gICAgfQotCi0gIGluc24gPSBkb19hc3NlbWJsZSAoc3RyLCAmb3Bjb2RlLAotCQkgICAgICAoZXh0eXBlICE9IEVYRUNfVU5LTk9XTiB8fCBldHlwZSAhPSBFWEVDX1VOS05PV04pLAotCQkgICAgICBleHR5cGUgPT0gRVhFQ19QQVJBTExFTCk7Ci0gIGlmIChpbnNuID09IC0xKQotICAgIHsKLSAgICAgIGlmIChleHR5cGUgIT0gRVhFQ19VTktOT1dOKQotCWV0eXBlID0gZXh0eXBlOwotICAgICAgYXNfYmFkIChfKCJDYW5ub3QgYXNzZW1ibGUgaW5zdHJ1Y3Rpb24iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChldHlwZSAhPSBFWEVDX1VOS05PV04pCi0gICAgewotICAgICAgZXh0eXBlID0gZXR5cGU7Ci0gICAgICBldHlwZSA9IEVYRUNfVU5LTk9XTjsKLSAgICB9Ci0KLSAgLyogV29yZCBtdWx0aXBseSBpbnN0cnVjdGlvbnMgbXVzdCBub3QgYmUgZm9sbG93ZWQgYnkgZWl0aGVyIGEgbG9hZCBvciBhCi0gICAgIDE2LWJpdCBtdWx0aXBseSBpbnN0cnVjdGlvbiBpbiB0aGUgbmV4dCBjeWNsZS4gICovCi0gIGlmICggICAoZXh0eXBlICE9IEVYRUNfUkVWU0VRKQotICAgICAgJiYgcHJldl9tdWwzMl9wCi0gICAgICAmJiAob3Bjb2RlLm9wLT5mbGFnc191c2VkICYgKEZMQUdfTUVNIHwgRkxBR19NVUwxNikpKQotICAgIHsKLSAgICAgIC8qIEhvd2V2ZXIsIGxvYWQgYW5kIG11bHRpcGx5IHNob3VsZCBhYmxlIHRvIGJlIGNvbWJpbmVkIGluIGEgcGFyYWxsZWwKLQkgb3BlcmF0aW9uLCBzbyBjaGVjayBmb3IgdGhhdCBmaXJzdC4gICovCi0gICAgICBpZiAocHJldl9pbnNuICE9IC0xCi0JICAmJiAob3Bjb2RlLm9wLT5mbGFnc191c2VkICYgRkxBR19NRU0pCi0JICAmJiBvcGNvZGUuZm9ybS0+Zm9ybSA8IExPTkcKLQkgICYmIChleHR5cGUgPT0gRVhFQ19QQVJBTExFTCB8fCAoT3B0aW1pemluZyAmJiBleHR5cGUgPT0gRVhFQ19VTktOT1dOKSkKLQkgICYmIHBhcmFsbGVsX29rICgmcHJldl9vcGNvZGUsIChsb25nKXByZXZfaW5zbiwKLQkJCSAgJm9wY29kZSwgKGxvbmcpaW5zbiwgZXh0eXBlKQotCSAgJiYgd3JpdGVfMl9zaG9ydCAoJnByZXZfb3Bjb2RlLCAobG9uZylwcmV2X2luc24sCi0JCQkgICAgJm9wY29kZSwgKGxvbmcpaW5zbiwgZXh0eXBlLCBmaXh1cHMpID09IDApCi0JewotCSAgLyogbm8gaW5zdHJ1Y3Rpb25zIHNhdmVkICovCi0JICBwcmV2X2luc24gPSAtMTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FuJ3QgcGFyYWxsZWxpemUsIGZsdXNoIHByZXZpb3VzIGluc3RydWN0aW9uIGFuZCBlbWl0IGEgd29yZCBvZiBOT1BTLAotCSAgICAgdW5sZXNzIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIE5PUCwgaW4gd2hpY2ggY2FzZSBqdXN0IGZsdXNoIGl0LAotCSAgICAgYXMgdGhpcyB3aWxsIGdlbmVyYXRlIGEgd29yZCBvZiBOT1BzIGZvciB1cy4gICovCi0KLQkgIGlmIChwcmV2X2luc24gIT0gLTEgJiYgKHN0cmNtcCAocHJldl9vcGNvZGUub3AtPm5hbWUsICJub3AiKSA9PSAwKSkKLQkgICAgZDMwdl9jbGVhbnVwIChmYWxzZSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICogZjsKLQkgICAgICAKLQkgICAgICBpZiAocHJldl9pbnNuICE9IC0xKQotCQlkMzB2X2NsZWFudXAgKHRydWUpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGYgPSBmcmFnX21vcmUgKDgpOwotCQkgIGQzMHZfbnVtYmVyX3RvX2NoYXJzIChmLCBOT1AyLCA4KTsKLQkJICAKLQkJICBpZiAod2Fybl9ub3BzID09IE5PUF9BTEwgfHwgd2Fybl9ub3BzID09IE5PUF9NVUxUSVBMWSkKLQkJICAgIHsKLQkJICAgICAgaWYgKG9wY29kZS5vcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfTUVNKQotCQkJYXNfd2FybiAoXygid29yZCBvZiBOT1BzIGFkZGVkIGJldHdlZW4gd29yZCBtdWx0aXBseSBhbmQgbG9hZCIpKTsKLQkJICAgICAgZWxzZQotCQkJYXNfd2FybiAoXygid29yZCBvZiBOT1BzIGFkZGVkIGJldHdlZW4gd29yZCBtdWx0aXBseSBhbmQgMTYtYml0IG11bHRpcGx5IikpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIAotCSAgZXh0eXBlID0gRVhFQ19VTktOT1dOOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKCAgIChleHR5cGUgPT0gRVhFQ19SRVZTRVEpCi0JICAgJiYgY3VyX211bDMyX3AKLQkgICAmJiAocHJldl9vcGNvZGUub3AtPmZsYWdzX3VzZWQgJiAoRkxBR19NRU0gfCBGTEFHX01VTDE2KSkpCi0gICAgewotICAgICAgLyogQ2FuJ3QgcGFyYWxsZWxpemUsIGZsdXNoIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gYW5kIGFkZCBhIHNlcXVlbnRpYWwgTk9QLiAqLwotICAgICAgd3JpdGVfMV9zaG9ydCAoJiBvcGNvZGUsIChsb25nKSBpbnNuLCBmaXh1cHMtPm5leHQtPm5leHQsIHRydWUpOwotICAgICAgCi0gICAgICAvKiBNYWtlIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB0aGUgY3VycmVudCBvbmUuICAqLwotICAgICAgZXh0eXBlID0gRVhFQ19VTktOT1dOOwotICAgICAgaW5zbiA9IHByZXZfaW5zbjsKLSAgICAgIG5vd19zZWcgPSBwcmV2X3NlZzsKLSAgICAgIG5vd19zdWJzZWcgPSBwcmV2X3N1YnNlZzsKLSAgICAgIHByZXZfaW5zbiA9IC0xOwotICAgICAgY3VyX211bDMyX3AgPSBwcmV2X211bDMyX3A7Ci0gICAgICBwcmV2X211bDMyX3AgPSAwOwotICAgICAgbWVtY3B5ICgmb3Bjb2RlLCAmcHJldl9vcGNvZGUsIHNpemVvZiAocHJldl9vcGNvZGUpKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGxvbmcgaW5zdHJ1Y3Rpb24sIHdyaXRlIGl0IGFuZCBhbnkgcHJldmlvdXMgc2hvcnQgaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAob3Bjb2RlLmZvcm0tPmZvcm0gPj0gTE9ORykgCi0gICAgewotICAgICAgaWYgKGV4dHlwZSAhPSBFWEVDX1VOS05PV04pIAotCWFzX2JhZCAoXygiSW5zdHJ1Y3Rpb24gdXNlcyBsb25nIHZlcnNpb24sIHNvIGl0IGNhbm5vdCBiZSBtaXhlZCBhcyBzcGVjaWZpZWQiKSk7Ci0gICAgICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLSAgICAgIHdyaXRlX2xvbmcgKCYgb3Bjb2RlLCBpbnNuLCBmaXh1cHMpOwotICAgICAgcHJldl9pbnNuID0gLTE7Ci0gICAgfQotICBlbHNlIGlmICgocHJldl9pbnNuICE9IC0xKQotCSAgICYmICh3cml0ZV8yX3Nob3J0Ci0JICAgICAgICgmIHByZXZfb3Bjb2RlLCAobG9uZykgcHJldl9pbnNuLCAmIG9wY29kZSwKLQkJKGxvbmcpIGluc24sIGV4dHlwZSwgZml4dXBzKSA9PSAwKSkgCi0gICAgewotICAgICAgLyogTm8gaW5zdHJ1Y3Rpb25zIHNhdmVkLiAgKi8KLSAgICAgIHByZXZfaW5zbiA9IC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChleHR5cGUgIT0gRVhFQ19VTktOT1dOKSAKLQlhc19iYWQgKF8oIlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZCIpKTsKLSAgICAgIAotICAgICAgLyogU2F2ZSBvZmYgbGFzdCBpbnN0cnVjdGlvbiBzbyBpdCBtYXkgYmUgcGFja2VkIG9uIG5leHQgcGFzcy4gICovCi0gICAgICBtZW1jcHkgKCZwcmV2X29wY29kZSwgJm9wY29kZSwgc2l6ZW9mIChwcmV2X29wY29kZSkpOwotICAgICAgcHJldl9pbnNuID0gaW5zbjsKLSAgICAgIHByZXZfc2VnID0gbm93X3NlZzsKLSAgICAgIHByZXZfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIGZpeHVwcyA9IGZpeHVwcy0+bmV4dDsKLSAgICAgIHByZXZfbXVsMzJfcCA9IGN1cl9tdWwzMl9wOwotICAgIH0KLX0KLQotCi0vKiBkb19hc3NlbWJsZSBhc3NlbWJsZXMgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gYW5kIHJldHVybnMgYW4gb3Bjb2RlICovCi0vKiBpdCByZXR1cm5zIC0xIChhbiBpbnZhbGlkIG9wY29kZSkgb24gZXJyb3IgKi8KLQotI2RlZmluZSBOQU1FX0JVRl9MRU4JMjAKLQotc3RhdGljIGxvbmcgbG9uZwotZG9fYXNzZW1ibGUgKHN0ciwgb3Bjb2RlLCBzaG9ydHAsIGlzX3BhcmFsbGVsKSAKLSAgICAgY2hhciAqc3RyOwotICAgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGU7Ci0gICAgIGludCBzaG9ydHA7Ci0gICAgIGludCBpc19wYXJhbGxlbDsKLXsKLSAgdW5zaWduZWQgY2hhciAqIG9wX3N0YXJ0OwotICB1bnNpZ25lZCBjaGFyICogc2F2ZTsKLSAgdW5zaWduZWQgY2hhciAqIG9wX2VuZDsKLSAgY2hhciAgICAgICAgICAgIG5hbWUgW05BTUVfQlVGX0xFTl07Ci0gIGludCAgICAgICAgICAgICBjbXBfaGFjazsKLSAgaW50ICAgICAgICAgICAgIG5sZW4gPSAwOwotICBpbnQgICAgICAgICAgICAgZnNpemUgPSAoc2hvcnRwID8gRk9SQ0VfU0hPUlQgOiAwKTsKLSAgZXhwcmVzc2lvblMgICAgIG15b3BzIFs2XTsKLSAgbG9uZyBsb25nICAgICAgIGluc247Ci0KLSAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKCogc3RyID09ICcgJykKLSAgICBzdHIgKys7Ci0KLSAgLyogZmluZCB0aGUgb3Bjb2RlIGVuZCAqLwotICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gKHVuc2lnbmVkIGNoYXIgKikgKHN0cik7Ci0gICAgICAgKiBvcF9lbmQKLSAgICAgICAmJiBubGVuIDwgKE5BTUVfQlVGX0xFTiAtIDEpCi0gICAgICAgJiYgKiBvcF9lbmQgIT0gJy8nCi0gICAgICAgJiYgIWlzX2VuZF9vZl9saW5lWypvcF9lbmRdICYmICpvcF9lbmQgIT0gJyAnOwotICAgICAgIG9wX2VuZCsrKQotICAgIHsKLSAgICAgIG5hbWVbbmxlbl0gPSB0b2xvd2VyIChvcF9zdGFydFtubGVuXSk7Ci0gICAgICBubGVuKys7Ci0gICAgfQotCi0gIGlmIChubGVuID09IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIG5hbWVbbmxlbl0gPSAwOwotCi0gIC8qIGlmIHRoZXJlIGlzIGFuIGV4ZWN1dGlvbiBjb25kaXRpb24gY29kZSwgaGFuZGxlIGl0ICovCi0gIGlmICgqb3BfZW5kID09ICcvJykKLSAgICB7Ci0gICAgICBpbnQgaSA9IDA7Ci0gICAgICB3aGlsZSAoIChpIDwgRUNDX01BWCkgJiYgc3RybmNhc2VjbXAgKGQzMHZfZWNjX25hbWVzW2ldLCBvcF9lbmQgKyAxLCAyKSkKLQlpKys7Ci0gICAgICAKLSAgICAgIGlmIChpID09IEVDQ19NQVgpCi0JewotCSAgY2hhciB0bXBbNF07Ci0JICBzdHJuY3B5ICh0bXAsIG9wX2VuZCArIDEsIDIpOwotCSAgdG1wWzJdID0gMDsKLQkgIGFzX2JhZCAoXygidW5rbm93biBjb25kaXRpb24gY29kZTogJXMiKSx0bXApOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIC8qICAgICAgcHJpbnRmICgiY29uZGl0aW9uIGNvZGU9JWRcbiIsaSk7ICovCi0gICAgICBvcGNvZGUtPmVjYyA9IGk7Ci0gICAgICBvcF9lbmQgKz0gMzsKLSAgICB9Ci0gIGVsc2UKLSAgICBvcGNvZGUtPmVjYyA9IEVDQ19BTDsKLSAgCi0KLSAgLyogQ01QIGFuZCBDTVBVIGNoYW5nZSB0aGVpciBuYW1lIGJhc2VkIG9uIGNvbmRpdGlvbiBjb2RlcyAqLwotICBpZiAoIXN0cm5jbXAgKG5hbWUsICJjbXAiLCAzKSkKLSAgICB7Ci0gICAgICBpbnQgcCxpOwotICAgICAgY2hhciAqKnN0ciA9IChjaGFyICoqKWQzMHZfY2NfbmFtZXM7Ci0gICAgICBpZiAobmFtZVszXSA9PSAndScpCi0JcCA9IDQ7Ci0gICAgICBlbHNlCi0JcCA9IDM7Ci0KLSAgICAgIGZvciAoaT0xOyAqc3RyICYmIHN0cm5jbXAgKCpzdHIsICYgbmFtZVtwXSwgMik7IGkrKywgc3RyKyspCi0JOwotCi0gICAgICAvKiBjbXB1IG9ubHkgc3VwcG9ydHMgc29tZSBjb25kaXRpb24gY29kZXMgKi8KLSAgICAgIGlmIChwID09IDQpCi0JewotCSAgaWYgKGkgPCAzIHx8IGkgPiA2KQotCSAgICB7Ci0JICAgICAgbmFtZVtwKzJdPTA7Ci0JICAgICAgYXNfYmFkIChfKCJjbXB1IGRvZXNuJ3Qgc3VwcG9ydCBjb25kaXRpb24gY29kZSAlcyIpLCZuYW1lW3BdKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEqc3RyKQotCXsKLQkgIG5hbWVbcCsyXT0wOwotCSAgYXNfYmFkIChfKCJ1bmtub3duIGNvbmRpdGlvbiBjb2RlOiAlcyIpLCZuYW1lW3BdKTsgICAgICAKLQl9Ci0gICAgICAKLSAgICAgIGNtcF9oYWNrID0gaTsKLSAgICAgIG5hbWVbcF0gPSAwOwotICAgIH0KLSAgZWxzZQotICAgIGNtcF9oYWNrID0gMDsKLSAgCi0gIC8qICBwcmludGYoImNtcF9oYWNrPSVkXG4iLGNtcF9oYWNrKTsgKi8KLQotICAvKiBuZWVkIHRvIGxvb2sgZm9yIC5zIG9yIC5sICovCi0gIGlmIChuYW1lW25sZW4tMl0gPT0gJy4nKQotICAgIHsKLSAgICAgIHN3aXRjaCAobmFtZVtubGVuLTFdKQotCXsKLQljYXNlICdzJzoKLQkgIGZzaXplID0gRk9SQ0VfU0hPUlQ7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIGZzaXplID0gRk9SQ0VfTE9ORzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIG5hbWVbbmxlbi0yXSA9IDA7Ci0gICAgfQotCi0gIC8qIGZpbmQgdGhlIGZpcnN0IG9wY29kZSB3aXRoIHRoZSBwcm9wZXIgbmFtZSAqLyAgCi0gIG9wY29kZS0+b3AgPSAoc3RydWN0IGQzMHZfb3Bjb2RlICopaGFzaF9maW5kIChkMzB2X2hhc2gsIG5hbWUpOwotICBpZiAob3Bjb2RlLT5vcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGU6ICVzIiksbmFtZSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IG9wX2VuZDsKLSAgd2hpbGUgKCEob3Bjb2RlLT5mb3JtID0gZmluZF9mb3JtYXQgKG9wY29kZS0+b3AsIG15b3BzLCBmc2l6ZSwgY21wX2hhY2spKSkKLSAgICB7Ci0gICAgICBvcGNvZGUtPm9wKys7Ci0gICAgICBpZiAob3Bjb2RlLT5vcC0+bmFtZSA9PSBOVUxMIHx8IHN0cmNtcCAob3Bjb2RlLT5vcC0+bmFtZSwgbmFtZSkpCi0JewotCSAgYXNfYmFkIChfKCJvcGVyYW5kcyBmb3Igb3Bjb2RlIGAlcycgZG8gbm90IG1hdGNoIGFueSB2YWxpZCBmb3JtYXQiKSwgbmFtZSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLQotICBpbnNuID0gYnVpbGRfaW5zbiAob3Bjb2RlLCBteW9wcyk7IAotCi0gIC8qIFByb3BpZ2F0ZSBtdWx0aXBseSBzdGF0dXMgKi8KLSAgaWYgKGluc24gIT0gLTEpCi0gICAgewotICAgICAgaWYgKGlzX3BhcmFsbGVsICYmIHByZXZfbXVsMzJfcCkKLQljdXJfbXVsMzJfcCA9IDE7Ci0gICAgICBlbHNlCi0JewotCSAgcHJldl9tdWwzMl9wID0gY3VyX211bDMyX3A7Ci0JICBjdXJfbXVsMzJfcCAgPSAob3Bjb2RlLT5vcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfTVVMMzIpICE9IDA7Ci0JfQotICAgIH0KLQotICAvKiBQcm9wYWdhdGUgbGVmdF9raWxsc19yaWdodCBzdGF0dXMgKi8KLSAgaWYgKGluc24gIT0gLTEpCi0gICAgewotICAgICAgcHJldl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSBjdXJfbGVmdF9raWxsc19yaWdodF9wOwotCi0gICAgICBpZiAob3Bjb2RlLT5vcC0+ZmxhZ3Nfc2V0ICYgRkxBR19MS1IpCi0JewotCSAgY3VyX2xlZnRfa2lsbHNfcmlnaHRfcCA9IDE7Ci0JICAKLQkgIGlmIChzdHJjbXAgKG9wY29kZS0+b3AtPm5hbWUsICJtdnRzeXMiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogTGVmdCBraWxscyByaWdodCBmb3Igb25seSBtdnRzeXMgb25seSBmb3IgUFNXL1BTV0gvUFNXTC9mbGFncyB0YXJnZXQuICovCi0JICAgICAgaWYgKChteW9wc1swXS5YX29wID09IE9fcmVnaXN0ZXIpICYmCi0JCSAgKChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9DT05UUk9MKSB8fCAvKiBwc3cgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0NPTlRST0wrTUFYX0NPTlRST0xfUkVHKzIpIHx8IC8qIHBzd2ggKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0NPTlRST0wrTUFYX0NPTlRST0xfUkVHKzEpIHx8IC8qIHBzd2wgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrMCkgfHwgLyogZjAgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrMSkgfHwgLyogZjEgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrMikgfHwgLyogZjIgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrMykgfHwgLyogZjMgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrNCkgfHwgLyogZjQgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrNSkgfHwgLyogZjUgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrNikgfHwgLyogZjYgKi8KLQkJICAgKG15b3BzWzBdLlhfYWRkX251bWJlciA9PSBPUEVSQU5EX0ZMQUcrNykpKSAvKiBmNyAqLwotCQl7Ci0JCSAgY3VyX2xlZnRfa2lsbHNfcmlnaHRfcCA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBPdGhlciBtdnRzeXMgdGFyZ2V0IHJlZ2lzdGVycyBkb24ndCBraWxsIHJpZ2h0IGluc3RydWN0aW9uLiAqLwotCQkgIGN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAwOwotCQl9Ci0JICAgIH0gLyogbXZ0c3lzICovCi0JfQotICAgICAgZWxzZQotCWN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAwOwotICAgIH0KLQotICByZXR1cm4gaW5zbjsKLX0KLQotCi0vKiBmaW5kX2Zvcm1hdCgpIGdldHMgYSBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBmb3JtYXQgdGFibGUuCi0gICBJdCBtdXN0IGxvb2sgYXQgYWxsIGZvcm1hdHMgZm9yIGFuIG9wY29kZSBhbmQgdXNlIHRoZSBvcGVyYW5kcwotICAgdG8gY2hvb3NlIHRoZSBjb3JyZWN0IG9uZS4gIFJldHVybnMgTlVMTCBvbiBlcnJvci4gKi8KLQotc3RhdGljIHN0cnVjdCBkMzB2X2Zvcm1hdCAqCi1maW5kX2Zvcm1hdCAob3Bjb2RlLCBteW9wcywgZnNpemUsIGNtcF9oYWNrKQotICAgICBzdHJ1Y3QgZDMwdl9vcGNvZGUgKm9wY29kZTsKLSAgICAgZXhwcmVzc2lvblMgbXlvcHNbXTsKLSAgICAgaW50IGZzaXplOwotICAgICBpbnQgY21wX2hhY2s7Ci17Ci0gIGludCBudW1vcHMsIG1hdGNoLCBpbmRleCwgaT0wLCBqLCBrOwotICBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmZtOwotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIC8qIEdldCBhbGwgdGhlIG9wZXJhbmRzIGFuZCBzYXZlIHRoZW0gYXMgZXhwcmVzc2lvbnMuICAqLwotICBudW1vcHMgPSBnZXRfb3BlcmFuZHMgKG15b3BzLCBjbXBfaGFjayk7Ci0KLSAgd2hpbGUgKChpbmRleCA9IG9wY29kZS0+Zm9ybWF0W2krK10pICE9IDApCi0gICAgewotICAgICAgaWYgKGZzaXplID09IEZPUkNFX1NIT1JUICYmIGluZGV4ID49IExPTkcpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChmc2l6ZSA9PSBGT1JDRV9MT05HICYmIGluZGV4IDwgTE9ORykKLQljb250aW51ZTsKLQotICAgICAgZm0gPSAoc3RydWN0IGQzMHZfZm9ybWF0ICopJmQzMHZfZm9ybWF0X3RhYmxlW2luZGV4XTsKLSAgICAgIGsgPSBpbmRleDsKLSAgICAgIHdoaWxlIChmbS0+Zm9ybSA9PSBpbmRleCkKLQl7Ci0JICBtYXRjaCA9IDE7Ci0JICAvKiBOb3cgY2hlY2sgdGhlIG9wZXJhbmRzIGZvciBjb21wYXRpYmlsaXR5LiAgKi8KLQkgIGZvciAoaiA9IDA7IG1hdGNoICYmIGZtLT5vcGVyYW5kc1tqXTsgaisrKQotCSAgICB7Ci0JICAgICAgaW50IGZsYWdzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2ZtLT5vcGVyYW5kc1tqXV0uZmxhZ3M7Ci0JICAgICAgaW50IGJpdHMgPSBkMzB2X29wZXJhbmRfdGFibGVbZm0tPm9wZXJhbmRzW2pdXS5iaXRzOwotCSAgICAgIGludCBYX29wID0gbXlvcHNbal0uWF9vcDsKLQkgICAgICBpbnQgbnVtID0gbXlvcHNbal0uWF9hZGRfbnVtYmVyOwotCSAgICAgIAotCSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfU1BFQ0lBTCkKLQkJYnJlYWs7Ci0JICAgICAgZWxzZSBpZiAoWF9vcCA9PSBPX2lsbGVnYWwpCi0JCW1hdGNoID0gMDsKLQkgICAgICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKQotCQl7Ci0JCSAgaWYgKFhfb3AgIT0gT19yZWdpc3RlcgotCQkgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9BQ0MpICYmICEobnVtICYgT1BFUkFORF9BQ0MpKQotCQkgICAgICB8fCAoIShmbGFncyAmIE9QRVJBTkRfQUNDKSAmJiAobnVtICYgT1BFUkFORF9BQ0MpKQotCQkgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9GTEFHKSAmJiAhKG51bSAmIE9QRVJBTkRfRkxBRykpCi0JCSAgICAgIHx8ICghKGZsYWdzICYgKE9QRVJBTkRfRkxBRyB8IE9QRVJBTkRfQ09OVFJPTCkpICYmIChudW0gJiBPUEVSQU5EX0ZMQUcpKQotCQkgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9DT05UUk9MKQotCQkJICAmJiAhKG51bSAmIChPUEVSQU5EX0NPTlRST0wgfCBPUEVSQU5EX0ZMQUcpKSkpCi0JCSAgICB7Ci0JCSAgICAgIG1hdGNoID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKCgoZmxhZ3MgJiBPUEVSQU5EX01JTlVTKQotCQkgICAgICAgICYmIChYX29wICE9IE9fYWJzZW50IHx8IG51bSAhPSBPUEVSQU5EX01JTlVTKSkKLQkJICAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX1BMVVMpCi0JCQkgICAmJiAoWF9vcCAhPSBPX2Fic2VudCB8fCBudW0gIT0gT1BFUkFORF9QTFVTKSkKLQkJICAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0FUTUlOVVMpCi0JCQkgICAmJiAoWF9vcCAhPSBPX2Fic2VudCB8fCBudW0gIT0gT1BFUkFORF9BVE1JTlVTKSkKLQkJICAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0FUUEFSKQotCQkJICAgJiYgKFhfb3AgIT0gT19hYnNlbnQgfHwgbnVtICE9IE9QRVJBTkRfQVRQQVIpKQotCQkgICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfQVRTSUdOKQotCQkJICAgJiYgKFhfb3AgIT0gT19hYnNlbnQgfHwgbnVtICE9IE9QRVJBTkRfQVRTSUdOKSkpCi0JCXsKLQkJICBtYXRjaD0wOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX05VTSkKLQkJewotCQkgIC8qIEEgbnVtYmVyIGNhbiBiZSBhIGNvbnN0YW50IG9yIHN5bWJvbCBleHByZXNzaW9uLiAgKi8KLQotCQkgIC8qIElmIHdlIGhhdmUgZm91bmQgYSByZWdpc3RlciBuYW1lLCBidXQgdGhhdCBuYW1lIGFsc28KLQkJICAgICBtYXRjaGVzIGEgc3ltYm9sLCB0aGVuIHJlLXBhcnNlIHRoZSBuYW1lIGFzIGFuIGV4cHJlc3Npb24uICAqLwotCQkgIGlmIChYX29wID09IE9fcmVnaXN0ZXIKLQkJICAgICAgJiYgc3ltYm9sX2ZpbmQgKChjaGFyICopIG15b3BzW2pdLlhfb3Bfc3ltYm9sKSkKLQkJICAgIHsKLQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gKGNoYXIgKikgbXlvcHNbal0uWF9vcF9zeW1ib2w7Ci0JCSAgICAgIGV4cHJlc3Npb24gKCYgbXlvcHNbal0pOwotCQkgICAgfQotCQkgICAgICAKLQkJICAvKiBUdXJuIGFuIGV4cHJlc3Npb24gaW50byBhIHN5bWJvbCBmb3IgbGF0ZXIgcmVzb2x1dGlvbi4gICovCi0JCSAgaWYgKFhfb3AgIT0gT19hYnNlbnQgJiYgWF9vcCAhPSBPX2NvbnN0YW50Ci0JCSAgICAgICYmIFhfb3AgIT0gT19zeW1ib2wgJiYgWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgICAgICYmIFhfb3AgIT0gT19iaWcpCi0JCSAgICB7Ci0JCSAgICAgIHN5bWJvbFMgKnN5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZteW9wc1tqXSk7Ci0JCSAgICAgIG15b3BzW2pdLlhfb3AgPSBYX29wID0gT19zeW1ib2w7Ci0JCSAgICAgIG15b3BzW2pdLlhfYWRkX3N5bWJvbCA9IHN5bTsKLQkJICAgICAgbXlvcHNbal0uWF9hZGRfbnVtYmVyID0gbnVtID0gMDsKLQkJICAgIH0KLQotCQkgIGlmIChmbS0+Zm9ybSA+PSBMT05HKQotCQkgICAgewotCQkgICAgICAvKiBJZiB3ZSdyZSB0ZXN0aW5nIGZvciBhIExPTkcgZm9ybWF0LCBlaXRoZXIgZml0cy4gKi8KLQkJICAgICAgaWYgKFhfb3AgIT0gT19jb25zdGFudCAmJiBYX29wICE9IE9fc3ltYm9sKQotCQkJbWF0Y2ggPSAwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGZtLT5mb3JtIDwgTE9ORwotCQkJICAgJiYgKChmc2l6ZSA9PSBGT1JDRV9TSE9SVCAmJiBYX29wID09IE9fc3ltYm9sKQotCQkJICAgICAgIHx8IChmbS0+Zm9ybSA9PSBTSE9SVF9EMiAmJiBqID09IDApKSkKLQkJICAgIG1hdGNoID0gMTsKLQkJICAvKiBUaGlzIGlzIHRoZSB0cmlja3kgcGFydC4gIFdpbGwgdGhlIGNvbnN0YW50IG9yIHN5bWJvbAotCQkgICAgIGZpdCBpbnRvIHRoZSBzcGFjZSBpbiB0aGUgY3VycmVudCBmb3JtYXQ/ICovCi0JCSAgZWxzZSBpZiAoWF9vcCA9PSBPX2NvbnN0YW50KQotCQkgICAgewotCQkgICAgICBpZiAoY2hlY2tfcmFuZ2UgKG51bSwgYml0cywgZmxhZ3MpKQotCQkJbWF0Y2ggPSAwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKFhfb3AgPT0gT19zeW1ib2wKLQkJCSAgICYmIFNfSVNfREVGSU5FRCAobXlvcHNbal0uWF9hZGRfc3ltYm9sKQotCQkJICAgJiYgU19HRVRfU0VHTUVOVCAobXlvcHNbal0uWF9hZGRfc3ltYm9sKSA9PSBub3dfc2VnCi0JCQkgICAmJiBvcGNvZGUtPnJlbG9jX2ZsYWcgPT0gUkVMT0NfUENSRUwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgc2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdAotCQkJIGludG8gdGhlIGZvcm0gd2UncmUgY29uc2lkZXJpbmcuICovCi0JCSAgICAgIGZyYWdTICpmOwotCQkgICAgICBsb25nIHZhbHVlOwotCi0JCSAgICAgIC8qIENhbGN1bGF0ZSB0aGUgY3VycmVudCBhZGRyZXNzIGJ5IHJ1bm5pbmcgdGhyb3VnaCB0aGUKLQkJCSBwcmV2aW91cyBmcmFncyBhbmQgYWRkaW5nIG91ciBjdXJyZW50IG9mZnNldC4gICovCi0JCSAgICAgIHZhbHVlID0gMDsKLQkJICAgICAgZm9yIChmID0gZnJjaGFpbl9ub3ctPmZyY2hfcm9vdDsgZjsgZiA9IGYtPmZyX25leHQpCi0JCQl2YWx1ZSArPSBmLT5mcl9maXggKyBmLT5mcl9vZmZzZXQ7Ci0JCSAgICAgIHZhbHVlID0gKFNfR0VUX1ZBTFVFIChteW9wc1tqXS5YX2FkZF9zeW1ib2wpIC0gdmFsdWUKLQkJCSAgICAgICAtIChvYnN0YWNrX25leHRfZnJlZSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spCi0JCQkJICAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSk7Ci0JCSAgICAgIGlmIChjaGVja19yYW5nZSAodmFsdWUsIGJpdHMsIGZsYWdzKSkgCi0JCQltYXRjaCA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgbWF0Y2ggPSAwOwotCQl9Ci0JICAgIH0KLQkgIC8qIHByaW50ZigidGhyb3VnaCB0aGUgbG9vcDogbWF0Y2g9JWRcbiIsbWF0Y2gpOyAgKi8KLQkgIC8qIFdlJ3JlIG9ubHkgZG9uZSBpZiB0aGUgb3BlcmFuZHMgbWF0Y2hlZCBzbyBmYXIgQU5EIHRoZXJlCi0JICAgICBhcmUgbm8gbW9yZSB0byBjaGVjay4gICovCi0JICBpZiAobWF0Y2ggJiYgbXlvcHNbal0uWF9vcCA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogRmluYWwgY2hlY2sgLSBpc3N1ZSBhIHdhcm5pbmcgaWYgYW4gb2RkIG51bWJlcmVkIHJlZ2lzdGVyCi0JCSBpcyB1c2VkIGFzIHRoZSBmaXJzdCByZWdpc3RlciBpbiBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlYWRzCi0JCSBvciB3cml0ZXMgMiByZWdpc3RlcnMuICAqLwotCi0JICAgICAgZm9yIChqID0gMDsgZm0tPm9wZXJhbmRzW2pdOyBqKyspCi0JCWlmIChteW9wc1tqXS5YX29wID09IE9fcmVnaXN0ZXIKLQkJICAgICYmIChteW9wc1tqXS5YX2FkZF9udW1iZXIgJiAxKQotCQkgICAgJiYgKGQzMHZfb3BlcmFuZF90YWJsZVtmbS0+b3BlcmFuZHNbal1dLmZsYWdzICYgT1BFUkFORF8yUkVHKSkKLQkJICBhc193YXJuIChcCi1fKCJPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24iKSk7Ci0JICAgICAgCi0JICAgICAgcmV0dXJuIGZtOwotCSAgICB9Ci0JICBmbSA9IChzdHJ1Y3QgZDMwdl9mb3JtYXQgKikmZDMwdl9mb3JtYXRfdGFibGVbKytrXTsKLQl9Ci0gICAgICAvKiBwcmludGYoInRyeWluZyBhbm90aGVyIGZvcm1hdDogaT0lZFxuIixpKTsgKi8KLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBpZiB3aGlsZSBwcm9jZXNzaW5nIGEgZml4dXAsIGEgcmVsb2MgcmVhbGx5IG5lZWRzIHRvIGJlIGNyZWF0ZWQgKi8KLS8qIHRoZW4gaXQgaXMgZG9uZSBoZXJlICovCi0gICAgICAgICAgICAgICAgIAotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICBfKCJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIpLCAoaW50KWZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIHJldHVybiByZWxvYzsKLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIDA7Ci19IAotCi1sb25nCi1tZF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeHAsIHNlYykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKU5VTEwgJiYgKCFTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KSB8fAotICAgICAoU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IHNlYykpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotfQotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeHAsIHZhbHVlcCwgc2VnKQotICAgICBmaXhTICogZml4cDsKLSAgICAgdmFsdWVUICogdmFsdWVwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgY2hhciAqIHdoZXJlOwotICB1bnNpZ25lZCBsb25nIGluc24sIGluc24yOwotICBsb25nIHZhbHVlOwotICAKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IChzeW1ib2xTICopIE5VTEwpCi0gICAgewotICAgICAgdmFsdWUgPSAqIHZhbHVlcDsKLSAgICAgIGZpeHAtPmZ4X2RvbmUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgdmFsdWUgPSAqIHZhbHVlcDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbHVlID0gZml4cC0+Znhfb2Zmc2V0OwotICAgICAgCi0gICAgICBpZiAoZml4cC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pIAotCSAgICB2YWx1ZSAtPSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCBzdWJ0cmFjdGluZyBhIHN5bWJvbC4gICovCi0JICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLSAgICAgdmFsdWUsIGFuZCBzdHVmZiB0aGUgaW5zdHJ1Y3Rpb24gYmFjayBhZ2Fpbi4gICovCi0gIHdoZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotICBpbnNuID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAKLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzg6ICAvKiBDaGVjayBmb3IgYSBiYWQgLmJ5dGUgZGlyZWN0aXZlLiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF9hZGRzeSAhPSBOVUxMKQotCWFzX2JhZCAoXygibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIGFkZHJlc3Mgb2Ygc3ltYm9sICclcycgaW50byBhIGJ5dGUiKSwKLQkJZml4cC0+ZnhfbGluZSwgU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpKTsKLSAgICAgIGVsc2UgaWYgKCgodW5zaWduZWQpdmFsdWUpID4gMHhmZikKLQkgIGFzX2JhZCAoXygibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIHZhbHVlICV4IGludG8gYSBieXRlIiksCi0JCSAgICBmaXhwLT5meF9saW5lLCB2YWx1ZSk7Ci0gICAgICBlbHNlCi0JKiAodW5zaWduZWQgY2hhciAqKSB3aGVyZSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjogIC8qIENoZWNrIGZvciBhIGJhZCAuc2hvcnQgZGlyZWN0aXZlLiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF9hZGRzeSAhPSBOVUxMKQotCWFzX2JhZCAoXygibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIGFkZHJlc3Mgb2Ygc3ltYm9sICclcycgaW50byBhIHNob3J0IiksCi0JCWZpeHAtPmZ4X2xpbmUsIFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSk7Ci0gICAgICBlbHNlIGlmICgoKHVuc2lnbmVkKXZhbHVlKSA+IDB4ZmZmZikKLQkgIGFzX2JhZCAoXygibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIHZhbHVlICV4IGludG8gYSBzaG9ydCIpLAotCQkgICAgZml4cC0+ZnhfbGluZSwgdmFsdWUpOwotICAgICAgZWxzZQotCWJmZF9wdXRiMTYgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJGRF9SRUxPQ182NDogIC8qIENoZWNrIGZvciBhIGJhZCAucXVhZCBkaXJlY3RpdmUuICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0JYXNfYmFkIChfKCJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgcXVhZCIpLAotCQlmaXhwLT5meF9saW5lLCBTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSkpOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCSAgYmZkX3B1dGIzMiAoMCwgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKSArIDQpOwotCX0KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl82OgotICAgICAgY2hlY2tfc2l6ZSAodmFsdWUsIDYsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSB2YWx1ZSAmIDB4M0Y7Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzlfUENSRUw6Ci0gICAgICBpZiAoZml4cC0+Znhfd2hlcmUgJiAweDcpCi0JewotCSAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JICAgIHZhbHVlICs9IDQ7Ci0JICBlbHNlCi0JICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUjsKLQl9Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgOSwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBpbnNuIHw9ICgodmFsdWUgPj4gMykgJiAweDNGKSA8PCAxMjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMTU6Ci0gICAgICBjaGVja19zaXplICh2YWx1ZSwgMTUsIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMykgJiAweEZGRjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUw6Ci0gICAgICBpZiAoZml4cC0+Znhfd2hlcmUgJiAweDcpCi0JewotCSAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JICAgIHZhbHVlICs9IDQ7Ci0JICBlbHNlCi0JICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1I7Ci0JfQotICAgICAgY2hlY2tfc2l6ZSAodmFsdWUsIDE1LCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLSAgICAgIGluc24gfD0gKHZhbHVlID4+IDMpICYgMHhGRkY7Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzIxOgotICAgICAgY2hlY2tfc2l6ZSAodmFsdWUsIDIxLCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLSAgICAgIGluc24gfD0gKHZhbHVlID4+IDMpICYgMHgzRkZGRjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUw6Ci0gICAgICBpZiAoZml4cC0+Znhfd2hlcmUgJiAweDcpCi0JewotCSAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JICAgIHZhbHVlICs9IDQ7Ci0JICBlbHNlCi0JICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMX1I7Ci0JfQotICAgICAgY2hlY2tfc2l6ZSAodmFsdWUsIDIxLCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLSAgICAgIGluc24gfD0gKHZhbHVlID4+IDMpICYgMHgzRkZGRjsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfMzI6Ci0gICAgICBpbnNuMiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlICsgNCk7Ci0gICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAyNikgJiAweDNGOwkJLyogdG9wIDYgYml0cyAqLwotICAgICAgaW5zbjIgfD0gKCh2YWx1ZSAmIDB4MDNGQzAwMDApIDw8IDIpOwkvKiBuZXh0IDggYml0cyAqLyAKLSAgICAgIGluc24yIHw9IHZhbHVlICYgMHgwMDAzRkZGRjsJCS8qIGJvdHRvbSAxOCBiaXRzICovCi0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24yLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSArIDQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMOgotICAgICAgaW5zbjIgPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSArIDQpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMjYpICYgMHgzRjsJCS8qIHRvcCA2IGJpdHMgKi8KLSAgICAgIGluc24yIHw9ICgodmFsdWUgJiAweDAzRkMwMDAwKSA8PCAyKTsJLyogbmV4dCA4IGJpdHMgKi8gCi0gICAgICBpbnNuMiB8PSB2YWx1ZSAmIDB4MDAwM0ZGRkY7CQkvKiBib3R0b20gMTggYml0cyAqLwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuMiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUgKyA0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgdmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygibGluZSAlZDogdW5rbm93biByZWxvY2F0aW9uIHR5cGU6IDB4JXgiKSwKLQkgICAgICBmaXhwLT5meF9saW5lLGZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgfQotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogZDMwdl9jbGVhbnVwKCkgaXMgY2FsbGVkIGFmdGVyIHRoZSBhc3NlbWJsZXIgaGFzIGZpbmlzaGVkIHBhcnNpbmcgdGhlIGlucHV0IAotICAgZmlsZSBvciBhZnRlciBhIGxhYmVsIGlzIGRlZmluZWQuICBCZWNhdXNlIHRoZSBEMzBWIGFzc2VtYmxlciBzb21ldGltZXMgc2F2ZXMgc2hvcnQgCi0gICBpbnN0cnVjdGlvbnMgdG8gc2VlIGlmIGl0IGNhbiBwYWNrYWdlIHRoZW0gd2l0aCB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgdGhlcmUgbWF5Ci0gICBiZSBhIHNob3J0IGluc3RydWN0aW9uIHRoYXQgc3RpbGwgbmVlZHMgd3JpdHRlbi4gICovCi1pbnQKLWQzMHZfY2xlYW51cCAodXNlX3NlcXVlbnRpYWwpCi0gICAgIGludCB1c2Vfc2VxdWVudGlhbDsKLXsKLSAgc2VnVCBzZWc7Ci0gIHN1YnNlZ1Qgc3Vic2VnOwotCi0gIGlmIChwcmV2X2luc24gIT0gLTEpCi0gICAgewotICAgICAgc2VnID0gbm93X3NlZzsKLSAgICAgIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgICBzdWJzZWdfc2V0IChwcmV2X3NlZywgcHJldl9zdWJzZWcpOwotICAgICAgd3JpdGVfMV9zaG9ydCAoJnByZXZfb3Bjb2RlLCAobG9uZylwcmV2X2luc24sIGZpeHVwcy0+bmV4dCwgdXNlX3NlcXVlbnRpYWwpOwotICAgICAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotICAgICAgcHJldl9pbnNuID0gLTE7Ci0gICAgICBpZiAodXNlX3NlcXVlbnRpYWwpCi0JcHJldl9tdWwzMl9wID0gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgCi1kMzB2X251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgbikKLSAgICAgY2hhciAqYnVmOwkJCS8qIFJldHVybiAnbmJ5dGVzJyBvZiBjaGFycyBoZXJlLiAqLwotICAgICBsb25nIGxvbmcgdmFsdWU7CQkvKiBUaGUgdmFsdWUgb2YgdGhlIGJpdHMuICovCi0gICAgIGludCBuOwkJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgb3V0cHV0LiAqLwotewotICB3aGlsZSAobi0tKQotICAgIHsKLSAgICAgIGJ1ZltuXSA9IHZhbHVlICYgMHhmZjsKLSAgICAgIHZhbHVlID4+PSA4OwotICAgIH0KLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgbGluZS4gKi8KLS8qIGl0IGNoZWNrcyB0byBzZWUgaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhICcuJyAqLwotLyogd2hpY2ggaW5kaWNhdGVzIHRoZSBzdGFydCBvZiBhIHBzZXVkby1vcC4gIElmIGl0IGlzLCAqLwotLyogdGhlbiB3cml0ZSBvdXQgYW55IHVud3JpdHRlbiBpbnN0cnVjdGlvbnMgKi8KLQotdm9pZCAKLWQzMHZfc3RhcnRfbGluZSAoKQotewotICBjaGFyICpjID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHdoaWxlIChpc3NwYWNlICgqYykpCi0gICAgYysrOwotCi0gIGlmICgqYyA9PSAnLicpCi0gICAgZDMwdl9jbGVhbnVwIChmYWxzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIAotY2hlY2tfc2l6ZSAodmFsdWUsIGJpdHMsIGZpbGUsIGxpbmUpCi0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGludCBiaXRzOwotICAgICBjaGFyICpmaWxlOwotICAgICBpbnQgbGluZTsKLXsKLSAgaW50IHRtcCwgbWF4OwotCi0gIGlmICh2YWx1ZSA8IDApCi0gICAgdG1wID0gfnZhbHVlOwotICBlbHNlCi0gICAgdG1wID0gdmFsdWU7Ci0gICAgCi0gIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpIC0gMTsKLQotICBpZiAodG1wID4gbWF4KQotICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygidmFsdWUgdG9vIGxhcmdlIHRvIGZpdCBpbiAlZCBiaXRzIiksIGJpdHMpOwotCi0gIHJldHVybjsKLX0KLQotLyogZDMwdl9mcm9iX2xhYmVsKCkgaXMgY2FsbGVkIHdoZW4gYWZ0ZXIgYSBsYWJlbCBpcyByZWNvZ25pemVkLiAgKi8KLQotdm9pZAotZDMwdl9mcm9iX2xhYmVsIChsYWIpCi0gICAgIHN5bWJvbFMgKmxhYjsKLXsKLSAgLyogRW1pdCBhbnkgcGVuZGluZyBpbnN0cnVjdGlvbnMuICAqLwotICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKLQotICAvKiBVcGRhdGUgdGhlIGxhYmVsJ3MgYWRkcmVzcyB3aXRoIHRoZSBjdXJyZW50IG91dHB1dCBwb2ludGVyLiAgKi8KLSAgc3ltYm9sX3NldF9mcmFnIChsYWIsIGZyYWdfbm93KTsKLSAgU19TRVRfVkFMVUUgKGxhYiwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQotICAvKiBSZWNvcmQgdGhpcyBsYWJlbCBmb3IgZnV0dXJlIGFkanVzdG1lbnQgYWZ0ZXIgd2UgZmluZCBvdXQgd2hhdAotICAgICBraW5kIG9mIGRhdGEgaXQgcmVmZXJlbmNlcywgYW5kIHRoZSByZXF1aXJlZCBhbGlnbm1lbnQgdGhlcmV3aXRoLiAgKi8KLSAgZDMwdl9sYXN0X2xhYmVsID0gbGFiOwotfQotCi0vKiBIb29rIGludG8gY29ucyBmb3IgY2FwdHVyaW5nIGFsaWdubWVudCBjaGFuZ2VzLiAgKi8KLQotdm9pZAotZDMwdl9jb25zX2FsaWduIChzaXplKQotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IGxvZ19zaXplOwotCi0gIGxvZ19zaXplID0gMDsKLSAgd2hpbGUgKChzaXplID4+PSAxKSAhPSAwKQotICAgICsrbG9nX3NpemU7Ci0KLSAgaWYgKGQzMHZfY3VycmVudF9hbGlnbiA8IGxvZ19zaXplKQotICAgIGQzMHZfYWxpZ24gKGxvZ19zaXplLCAoY2hhciAqKSBOVUxMLCBOVUxMKTsKLSAgZWxzZSBpZiAoZDMwdl9jdXJyZW50X2FsaWduID4gbG9nX3NpemUpCi0gICAgZDMwdl9jdXJyZW50X2FsaWduID0gbG9nX3NpemU7Ci0gIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7Ci19Ci0KLS8qIENhbGxlZCBpbnRlcm5hbGx5IHRvIGhhbmRsZSBhbGwgYWxpZ25tZW50IG5lZWRzLiAgVGhpcyB0YWtlcyBjYXJlCi0gICBvZiBlbGlkaW5nIGNhbGxzIHRvIGZyYWdfYWxpZ24gaWYnbiB0aGUgY2FjaGVkIGN1cnJlbnQgYWxpZ25tZW50Ci0gICBzYXlzIHdlJ3ZlIGFscmVhZHkgZ290IGl0LCBhcyB3ZWxsIGFzIHRha2luZyBjYXJlIG9mIHRoZSBhdXRvLWFsaWduaW5nCi0gICBsYWJlbHMgd3J0IGNvZGUuICAqLwotCi1zdGF0aWMgdm9pZAotZDMwdl9hbGlnbiAobiwgcGZpbGwsIGxhYmVsKQotICAgICBpbnQgbjsKLSAgICAgY2hhciAqcGZpbGw7Ci0gICAgIHN5bWJvbFMgKmxhYmVsOwotewotICAvKiBUaGUgZnJvbnQgZW5kIGlzIHByb25lIHRvIGNoYW5naW5nIHNlZ21lbnRzIG91dCBmcm9tIHVuZGVyIHVzCi0gICAgIHRlbXBvcmFyaWx5IHdoZW4gLWcgaXMgaW4gZWZmZWN0LiAgKi8KLSAgaW50IHN3aXRjaGVkX3NlZ19wID0gKGQzMHZfY3VycmVudF9hbGlnbl9zZWcgIT0gbm93X3NlZyk7Ci0KLSAgLyogRG8gbm90IGFzc3VtZSB0aGF0IGlmICdkMzB2X2N1cnJlbnRfYWxpZ24gPj0gbicgYW5kCi0gICAgICchIHN3aXRjaGVkX3NlZ19wJyB0aGF0IGl0IGlzIHNhZmUgdG8gYXZvaWQgcGVyZm9ybWluZwotICAgICB0aGlzIGFsaWduZW1lbnQgcmVxdWVzdC4gIFRoZSBhbGlnbm1lbnQgb2YgdGhlIGN1cnJlbnQgZnJhZwotICAgICBjYW4gYmUgY2hhbmdlZCB1bmRlciBvdXIgZmVldCwgZm9yIGV4YW1wbGUgYnkgYSAuYXNjaWkKLSAgICAgZGlyZWN0aXZlIGluIHRoZSBzb3VyY2UgY29kZS4gIGNmIHRlc3RzdWl0ZS9nYXMvZDMwdi9yZWxvYy5zICAqLwotICAKLSAgZDMwdl9jbGVhbnVwIChmYWxzZSk7Ci0KLSAgaWYgKHBmaWxsID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKG4gPiAyCi0JICAmJiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5vd19zZWcpICYgU0VDX0NPREUpICE9IDApCi0JewotCSAgc3RhdGljIGNoYXIgY29uc3Qgbm9wWzRdID0geyAweDAwLCAweGYwLCAweDAwLCAweDAwIH07Ci0KLQkgIC8qIEZpcnN0LCBtYWtlIHN1cmUgd2UncmUgb24gYSBmb3VyLWJ5dGUgYm91bmRhcnksIGluIGNhc2UKLQkgICAgIHNvbWVvbmUgaGFzIGJlZW4gcHV0dGluZyAuYnl0ZSB2YWx1ZXMgdGhlIHRleHQgc2VjdGlvbi4gICovCi0JICBpZiAoZDMwdl9jdXJyZW50X2FsaWduIDwgMiB8fCBzd2l0Y2hlZF9zZWdfcCkKLQkgICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0JICBmcmFnX2FsaWduX3BhdHRlcm4gKG4sIG5vcCwgc2l6ZW9mIG5vcCwgMCk7Ci0JfQotICAgICAgZWxzZQotCWZyYWdfYWxpZ24gKG4sIDAsIDApOwotICAgIH0KLSAgZWxzZQotICAgIGZyYWdfYWxpZ24gKG4sICpwZmlsbCwgMCk7Ci0KLSAgaWYgKCFzd2l0Y2hlZF9zZWdfcCkKLSAgICBkMzB2X2N1cnJlbnRfYWxpZ24gPSBuOwotCi0gIGlmIChsYWJlbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKiAgICAgc3ltOwotICAgICAgaW50ICAgICAgICAgICBsYWJlbF9zZWVuID0gZmFsc2U7Ci0gICAgICBzdHJ1Y3QgZnJhZyAqIG9sZF9mcmFnOwotICAgICAgdmFsdWVUICAgICAgICBvbGRfdmFsdWU7Ci0gICAgICB2YWx1ZVQgICAgICAgIG5ld192YWx1ZTsKLSAgICAgIAotICAgICAgYXNzZXJ0IChTX0dFVF9TRUdNRU5UIChsYWJlbCkgPT0gbm93X3NlZyk7Ci0KLSAgICAgIG9sZF9mcmFnICA9IHN5bWJvbF9nZXRfZnJhZyAobGFiZWwpOwotICAgICAgb2xkX3ZhbHVlID0gU19HRVRfVkFMVUUgKGxhYmVsKTsKLSAgICAgIG5ld192YWx1ZSA9ICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKTsKLSAgICAgIAotICAgICAgLyogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIGxhYmVsIGF0IGEgcGFydGljdWxhcgotCSBhZGRyZXNzLCBlc3BlY2lhbGx5IGlmIGRlYnVnZ2luZyBpcyBlbmFibGVkLCBzbyB3ZSBtdXN0Ci0JIHRha2UgY2FyZSB0byBhZGp1c3QgYWxsIHRoZSBsYWJlbHMgYXQgdGhpcyBhZGRyZXNzIGluIHRoaXMKLQkgZnJhZ21lbnQuICBUbyBzYXZlIHRpbWUgd2Ugc2VhcmNoIGZyb20gdGhlIGVuZCBvZiB0aGUgc3ltYm9sCi0JIGxpc3QsIGJhY2t3YXJkcywgc2luY2UgdGhlIHN5bWJvbHMgd2UgYXJlIGludGVyZXN0ZWQgaW4gYXJlCi0JIGFsbW9zdCBjZXJ0YWlubHkgdGhlIG9uZXMgdGhhdCB3ZXJlIG1vc3QgcmVjZW50bHkgYWRkZWQuCi0JIEFsc28gdG8gc2F2ZSB0aW1lIHdlIHN0b3Agc2VhcmNoaW5nIG9uY2Ugd2UgaGF2ZSBzZWVuIGF0IGxlYXN0Ci0JIG9uZSBtYXRjaGluZyBsYWJlbCwgYW5kIHdlIGVuY291bnRlciBhIGxhYmVsIHRoYXQgaXMgbm8gbG9uZ2VyCi0JIGluIHRoZSB0YXJnZXQgZnJhZ21lbnQuICBOb3RlLCB0aGlzIHNlYXJjaCBpcyBndWFyYW50ZWVkIHRvCi0JIGZpbmQgYXQgbGVhc3Qgb25lIG1hdGNoIHdoZW4gc3ltID09IGxhYmVsLCBzbyBubyBzcGVjaWFsIGNhc2UKLQkgY29kZSBpcyBuZWNlc3NhcnkuICAqLwotICAgICAgZm9yIChzeW0gPSBzeW1ib2xfbGFzdFA7IHN5bSAhPSBOVUxMOyBzeW0gPSBzeW1ib2xfcHJldmlvdXMgKHN5bSkpCi0JewotCSAgaWYgKHN5bWJvbF9nZXRfZnJhZyAoc3ltKSA9PSBvbGRfZnJhZwotCSAgICAgICYmIFNfR0VUX1ZBTFVFIChzeW0pID09IG9sZF92YWx1ZSkKLQkgICAgewotCSAgICAgIGxhYmVsX3NlZW4gPSB0cnVlOwotCSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBmcmFnX25vdyk7Ci0JICAgICAgU19TRVRfVkFMVUUgKHN5bSwgbmV3X3ZhbHVlKTsKLQkgICAgfQotCSAgZWxzZSBpZiAobGFiZWxfc2VlbiAmJiBzeW1ib2xfZ2V0X2ZyYWcgKHN5bSkgIT0gb2xkX2ZyYWcpCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgbik7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmFsaWduIHBzZXVkby1vcC4gIFRoaXMgYWxpZ25zIHRvIGEgcG93ZXIgb2YgdHdvLiAgV2UKLSAgIGhvb2sgaGVyZSB0byBsYXRjaCB0aGUgY3VycmVudCBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19kMzB2X2FsaWduIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBhbGlnbjsKLSAgY2hhciBmaWxsLCAqcGZpbGwgPSBOVUxMOwotICBsb25nIG1heF9hbGlnbm1lbnQgPSAxNTsKLQotICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoYWxpZ24gPiBtYXhfYWxpZ25tZW50KQotICAgIHsKLSAgICAgIGFsaWduID0gbWF4X2FsaWdubWVudDsKLSAgICAgIGFzX3dhcm4gKF8oIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkIGFzc3VtZWQiKSwgYWxpZ24pOwotICAgIH0KLSAgZWxzZSBpZiAoYWxpZ24gPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkFsaWdubWVudCBuZWdhdGl2ZTogMCBhc3N1bWVkIikpOwotICAgICAgYWxpZ24gPSAwOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBmaWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBwZmlsbCA9ICZmaWxsOwotICAgIH0KLQotICBkMzB2X2xhc3RfbGFiZWwgPSBOVUxMOwotICBkMzB2X2FsaWduIChhbGlnbiwgcGZpbGwsIE5VTEwpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnRleHQgcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgY2xlYXJzIHRoZSBzYXZlZCBsYXN0IGxhYmVsIGFuZCByZXNldHMga25vd24gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZDMwdl90ZXh0IChpKQotICAgICBpbnQgaTsKLQotewotICBzX3RleHQgKGkpOwotICBkMzB2X2xhc3RfbGFiZWwgPSBOVUxMOwotICBkMzB2X2N1cnJlbnRfYWxpZ24gPSAwOwotICBkMzB2X2N1cnJlbnRfYWxpZ25fc2VnID0gbm93X3NlZzsKLX0KLQotLyogSGFuZGxlIHRoZSAuZGF0YSBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgdGhlIHNhdmVkIGxhc3QgbGFiZWwgYW5kIHJlc2V0cyBrbm93biBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19kMzB2X2RhdGEgKGkpCi0gICAgIGludCBpOwotewotICBzX2RhdGEgKGkpOwotICBkMzB2X2xhc3RfbGFiZWwgPSBOVUxMOwotICBkMzB2X2N1cnJlbnRfYWxpZ24gPSAwOwotICBkMzB2X2N1cnJlbnRfYWxpZ25fc2VnID0gbm93X3NlZzsKLX0KLQotLyogSGFuZGxlIHRoZSAuc2VjdGlvbiBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0Ci0gICBjbGVhcnMgdGhlIHNhdmVkIGxhc3QgbGFiZWwgYW5kIHJlc2V0cyBrbm93biBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19kMzB2X3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgb2JqX2VsZl9zZWN0aW9uIChpZ25vcmUpOwotICBkMzB2X2xhc3RfbGFiZWwgPSBOVUxMOwotICBkMzB2X2N1cnJlbnRfYWxpZ24gPSAwOwotICBkMzB2X2N1cnJlbnRfYWxpZ25fc2VnID0gbm93X3NlZzsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZDMwdi5oIGIvZ2FzL2NvbmZpZy90Yy1kMzB2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZWJiYjkuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1kMzB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiB0Yy0zMTB2LmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLWQzMHYuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWFydGluIEh1bnQsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfRDMwVgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgRDMwViBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9kMzB2Ci0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLWQzMHYiCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi0vKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKEZJWFAsIFNFQykgICAKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCQkvKiAuLWZvbyBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzICAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuCi0KLWludCBkMzB2X2NsZWFudXAgUEFSQU1TICgoaW50KSk7Ci0jZGVmaW5lIG1kX2FmdGVyX3Bhc3NfaG9vaygpCSAgICAgZDMwdl9jbGVhbnVwIChmYWxzZSkKLSNkZWZpbmUgbWRfY2xlYW51cCgpCQkgICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpCi0jZGVmaW5lIFRDX1NUQVJUX0xBQkVMKGNoLCBwdHIpICAgICAgKGNoID09ICc6JyAmJiBkMzB2X2NsZWFudXAgKGZhbHNlKSkKLSNkZWZpbmUgbWRfc3RhcnRfbGluZV9ob29rKCkJICAgICBkMzB2X3N0YXJ0X2xpbmUgKGZhbHNlKQotCi12b2lkIGQzMHZfZnJvYl9sYWJlbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pCSAgICAgZDMwdl9mcm9iX2xhYmVsKHN5bSkKLQotdm9pZCBkMzB2X2NvbnNfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci0jZGVmaW5lIG1kX2NvbnNfYWxpZ24obmJ5dGVzKQkgICAgIGQzMHZfY29uc19hbGlnbihuYnl0ZXMpCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWZyMzAuYyBiL2dhcy9jb25maWcvdGMtZnIzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2E1ODgwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZnIzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjY0ICswLDAgQEAKLS8qIHRjLWZyMzAuYyAtLSBBc3NlbWJsZXIgZm9yIHRoZSBGdWppdHN1IEZSMzAuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAib3Bjb2Rlcy9mcjMwLWRlc2MuaCIKLSNpbmNsdWRlICJvcGNvZGVzL2ZyMzAtb3BjLmgiCi0jaW5jbHVkZSAiY2dlbi5oIgotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2YgdGhlIGRpZmZlcmVudCBjb21wb25lbnRzIGRlc2NyaWJpbmcKLSAgIGFuIGluZGl2aWR1YWwgaW5zdHJ1Y3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY29uc3QgQ0dFTl9JTlNOICoJaW5zbjsKLSAgY29uc3QgQ0dFTl9JTlNOICoJb3JpZ19pbnNuOwotICBDR0VOX0ZJRUxEUwkJZmllbGRzOwotI2lmIENHRU5fSU5UX0lOU05fUAotICBDR0VOX0lOU05fSU5UICAgICAgICAgYnVmZmVyIFsxXTsKLSNkZWZpbmUgSU5TTl9WQUxVRShidWYpICgqKGJ1ZikpCi0jZWxzZQotICB1bnNpZ25lZCBjaGFyICAgICAgICAgYnVmZmVyIFtDR0VOX01BWF9JTlNOX1NJWkVdOwotI2RlZmluZSBJTlNOX1ZBTFVFKGJ1ZikgKGJ1ZikKLSNlbmRpZgotICBjaGFyICoJCWFkZHI7Ci0gIGZyYWdTICoJCWZyYWc7Ci0gIGludCAgICAgICAgICAgICAgICAgICBudW1fZml4dXBzOwotICBmaXhTICogICAgICAgICAgICAgICAgZml4dXBzIFtHQVNfQ0dFTl9NQVhfRklYVVBTXTsKLSAgaW50ICAgICAgICAgICAgICAgICAgIGluZGljZXMgW01BWF9PUEVSQU5EX0lOU1RBTkNFU107Ci19Ci1mcjMwX2luc247Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdICAgICAgICA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gICA9ICIjIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICJ8IjsKLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gICAgICAgICAgICA9ICJlRSI7Ci1jb25zdCBjaGFyIEZMVF9DSEFSU1tdICAgICAgICAgICAgPSAiZEQiOwotDAotI2RlZmluZSBGUjMwX1NIT1JUT1BUUyAiIgotY29uc3QgY2hhciAqIG1kX3Nob3J0b3B0cyA9IEZSMzBfU0hPUlRPUFRTOwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50ICAgIGM7Ci0gICAgIGNoYXIgKiBhcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqIHN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgRlIzMCBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uczpcbiIpKTsKLX0gCi0KLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgIndvcmQiLAljb25zLAkJNCB9LAotICB7IE5VTEwsIAlOVUxMLCAJCTAgfQotfTsKLQotDAotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgZmxhZ3dvcmQgYXBwbGljYWJsZTsKLSAgc2VnVCAgICAgc2VnOwotICBzdWJzZWdUICBzdWJzZWc7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgYGNnZW4nIGludGVyZmFjZS4gICovCi0gIAotICAvKiBTZXQgdGhlIG1hY2hpbmUgbnVtYmVyIGFuZCBlbmRpYW4uICAqLwotICBnYXNfY2dlbl9jcHVfZGVzYyA9IGZyMzBfY2dlbl9jcHVfb3BlbiAoQ0dFTl9DUFVfT1BFTl9NQUNIUywgMCwKLQkJCQkJICBDR0VOX0NQVV9PUEVOX0VORElBTiwKLQkJCQkJICBDR0VOX0VORElBTl9CSUcsCi0JCQkJCSAgQ0dFTl9DUFVfT1BFTl9FTkQpOwotICBmcjMwX2NnZW5faW5pdF9hc20gKGdhc19jZ2VuX2NwdV9kZXNjKTsKLQotICAvKiBUaGlzIGlzIGEgY2FsbGJhY2sgZnJvbSBjZ2VuIHRvIGdhcyB0byBwYXJzZSBvcGVyYW5kcy4gICovCi0gIGNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4gKGdhc19jZ2VuX2NwdV9kZXNjLCBnYXNfY2dlbl9wYXJzZV9vcGVyYW5kKTsKLX0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgc3RhdGljIGludCBsYXN0X2luc25faGFkX2RlbGF5X3Nsb3QgPSAwOwotICBmcjMwX2luc24gaW5zbjsKLSAgY2hhciAqICAgIGVycm1zZzsKLSAgY2hhciAqICAgIHN0cjIgPSBOVUxMOwotCi0gIC8qIEluaXRpYWxpemUgR0FTJ3MgY2dlbiBpbnRlcmZhY2UgZm9yIGEgbmV3IGluc3RydWN0aW9uLiAgKi8KLSAgZ2FzX2NnZW5faW5pdF9wYXJzZSAoKTsKLQotICBpbnNuLmluc24gPSBmcjMwX2NnZW5fYXNzZW1ibGVfaW5zbgotICAgIChnYXNfY2dlbl9jcHVfZGVzYywgc3RyLCAmIGluc24uZmllbGRzLCBpbnNuLmJ1ZmZlciwgJiBlcnJtc2cpOwotICAKLSAgaWYgKCFpbnNuLmluc24pCi0gICAgewotICAgICAgYXNfYmFkIChlcnJtc2cpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBEb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hhdCB3ZSBwYXNzIGZvciBSRUxBWF9QIGhlcmUuICAqLwotICBnYXNfY2dlbl9maW5pc2hfaW5zbiAoaW5zbi5pbnNuLCBpbnNuLmJ1ZmZlciwKLQkJCUNHRU5fRklFTERTX0JJVFNJWkUgKCYgaW5zbi5maWVsZHMpLCAxLCBOVUxMKTsKLQotICAvKiBXYXJuIGFib3V0IGludmFsaWQgaW5zbnMgaW4gZGVsYXkgc2xvdHMuICAqLwotICBpZiAobGFzdF9pbnNuX2hhZF9kZWxheV9zbG90Ci0gICAgICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbi5pbnNuLCBDR0VOX0lOU05fTk9UX0lOX0RFTEFZX1NMT1QpKQotICAgIGFzX3dhcm4gKF8oIkluc3RydWN0aW9uICVzIG5vdCBhbGxvd2VkIGluIGEgZGVsYXkgc2xvdC4iKSwKLQkgICAgIENHRU5fSU5TTl9OQU1FIChpbnNuLmluc24pKTsKLQotICBsYXN0X2luc25faGFkX2RlbGF5X3Nsb3QKLSAgICA9IENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLmluc24sIENHRU5fSU5TTl9ERUxBWV9TTE9UKTsKLX0KLQotLyogVGhlIHN5bnRheCBpbiB0aGUgbWFudWFsIHNheXMgY29uc3RhbnRzIGJlZ2luIHdpdGggJyMnLgotICAgV2UganVzdCBpZ25vcmUgaXQuICAqLwotCi12b2lkIAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblA7Ci17Ci0gIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICsrOwotICAgICAgZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICAgIH0KLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUICAgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7Ci0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKiBuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQwKLS8qIEludGVyZmFjZSB0byByZWxheF9zZWdtZW50LiAgKi8KLQotLyogRklYTUU6IEJ1aWxkIHRhYmxlIGJ5IGhhbmQsIGdldCBpdCB3b3JraW5nLCB0aGVuIG1hY2hpbmUgZ2VuZXJhdGUuICAqLwotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLS8qIFRoZSBmaWVsZHMgYXJlOgotICAgMSkgbW9zdCBwb3NpdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgMikgbW9zdCBuZWdhdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgMykgaG93IG1hbnkgYnl0ZXMgdGhpcyBtb2RlIHdpbGwgYWRkIHRvIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGZyYWcKLSAgIDQpIHdoaWNoIGluZGV4IGludG8gdGhlIHRhYmxlIHRvIHRyeSBpZiB3ZSBjYW4ndCBmaXQgaW50byB0aGlzIG9uZS4gICovCi0KLSAgLyogVGhlIGZpcnN0IGVudHJ5IG11c3QgYmUgdW51c2VkIGJlY2F1c2UgYW4gYHJseF9tb3JlJyB2YWx1ZSBvZiB6ZXJvIGVuZHMKLSAgICAgZWFjaCBsaXN0LiAgKi8KLSAgezEsIDEsIDAsIDB9LAotCi0gIC8qIFRoZSBkaXNwbGFjZW1lbnQgdXNlZCBieSBHQVMgaXMgZnJvbSB0aGUgZW5kIG9mIHRoZSAyIGJ5dGUgaW5zbiwKLSAgICAgc28gd2Ugc3VidHJhY3QgMiBmcm9tIHRoZSBmb2xsb3dpbmcuICAqLwotICAvKiAxNiBiaXQgaW5zbiwgOCBiaXQgZGlzcCAtPiAxMCBiaXQgcmFuZ2UuCi0gICAgIFRoaXMgZG9lc24ndCBoYW5kbGUgYSBicmFuY2ggaW4gdGhlIHJpZ2h0IHNsb3QgYXQgdGhlIGJvcmRlcjoKLSAgICAgdGhlICImIC00IiBpc24ndCB0YWtlbiBpbnRvIGFjY291bnQuICBJdCdzIG5vdCBpbXBvcnRhbnQgZW5vdWdoIHRvCi0gICAgIGNvbXBsaWNhdGUgdGhpbmdzIG92ZXIgaXQsIHNvIHdlIHN1YnRyYWN0IGFuIGV4dHJhIDIgKG9yICsgMiBpbiAtdmUKLSAgICAgY2FzZSkuICAqLwotICB7NTExIC0gMiAtIDIsIC01MTIgLSAyICsgMiwgMCwgMiB9LAotICAvKiAzMiBiaXQgaW5zbiwgMjQgYml0IGRpc3AgLT4gMjYgYml0IHJhbmdlLiAgKi8KLSAgezB4MjAwMDAwMCAtIDEgLSAyLCAtMHgyMDAwMDAwIC0gMiwgMiwgMCB9LAotICAvKiBTYW1lIHRoaW5nLCBidXQgd2l0aCBsZWFkaW5nIG5vcCBmb3IgYWxpZ25tZW50LiAgKi8KLSAgezB4MjAwMDAwMCAtIDEgLSAyLCAtMHgyMDAwMDAwIC0gMiwgNCwgMCB9Ci19OwotCi1sb25nCi1mcjMwX3JlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKQotICAgICBmcmFnUyAqIGZyYWdQOwotICAgICBsb25nICAgIHN0cmV0Y2g7Ci17Ci0gIC8qIEFkZHJlc3Mgb2YgYnJhbmNoIGluc24uICAqLwotICBsb25nIGFkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXggLSAyOwotICBsb25nIGdyb3d0aCA9IDA7Ci0KLSAgLyogS2VlcCAzMiBiaXQgaW5zbnMgYWxpZ25lZCBvbiAzMiBiaXQgYm91bmRhcmllcy4gICovCi0gIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyKQotICAgIHsKLSAgICAgIGlmICgoYWRkcmVzcyAmIDMpICE9IDApCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAzOwotCSAgZ3Jvd3RoID0gMjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAzKQotICAgIHsKLSAgICAgIGlmICgoYWRkcmVzcyAmIDMpID09IDApCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAyOwotCSAgZ3Jvd3RoID0gLTI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGdyb3d0aCA9IHJlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKTsKLQotICAgICAgLyogTG9uZyBqdW1wIG9uIG9kZCBoYWxmd29yZCBib3VuZGFyeT8gICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMiAmJiAoYWRkcmVzcyAmIDMpICE9IDApCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAzOwotCSAgZ3Jvd3RoICs9IDI7Ci0JfQotICAgIH0KLQotICByZXR1cm4gZ3Jvd3RoOwotfQotCi0vKiBSZXR1cm4gYW4gaW5pdGlhbCBndWVzcyBvZiB0aGUgbGVuZ3RoIGJ5IHdoaWNoIGEgZnJhZ21lbnQgbXVzdCBncm93IHRvCi0gICBob2xkIGEgYnJhbmNoIHRvIHJlYWNoIGl0cyBkZXN0aW5hdGlvbi4KLSAgIEFsc28gdXBkYXRlcyBmcl90eXBlL2ZyX3N1YnR5cGUgYXMgbmVjZXNzYXJ5LgotCi0gICBDYWxsZWQganVzdCBiZWZvcmUgZG9pbmcgcmVsYXhhdGlvbi4KLSAgIEFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkLgotICAgVGhlIGd1ZXNzIGZvciBmcl92YXIgaXMgQUNUVUFMTFkgdGhlIGdyb3d0aCBiZXlvbmQgZnJfZml4LgotICAgV2hhdGV2ZXIgd2UgZG8gdG8gZ3JvdyBmcl9maXggb3IgZnJfdmFyIGNvbnRyaWJ1dGVzIHRvIG91ciByZXR1cm5lZCB2YWx1ZS4KLSAgIEFsdGhvdWdoIGl0IG1heSBub3QgYmUgZXhwbGljaXQgaW4gdGhlIGZyYWcsIHByZXRlbmQgZnJfdmFyIHN0YXJ0cyB3aXRoIGEKLSAgIDAgdmFsdWUuICAqLwotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgZnJhZ1MgKiBmcmFnUDsKLSAgICAgc2VnVCAgICBzZWdtZW50OwotewotICBpbnQgICAgb2xkX2ZyX2ZpeCA9IGZyYWdQLT5mcl9maXg7Ci0KLSAgLyogVGhlIG9ubHkgdGhpbmcgd2UgaGF2ZSB0byBoYW5kbGUgaGVyZSBhcmUgc3ltYm9scyBvdXRzaWRlIG9mIHRoZQotICAgICBjdXJyZW50IHNlZ21lbnQuICBUaGV5IG1heSBiZSB1bmRlZmluZWQgb3IgaW4gYSBkaWZmZXJlbnQgc2VnbWVudCBpbgotICAgICB3aGljaCBjYXNlIGxpbmtlciBzY3JpcHRzIG1heSBwbGFjZSB0aGVtIGFueXdoZXJlLgotICAgICBIb3dldmVyLCB3ZSBjYW4ndCBmaW5pc2ggdGhlIGZyYWdtZW50IGhlcmUgYW5kIGVtaXQgdGhlIHJlbG9jIGFzIGluc24KLSAgICAgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBtYXkgbW92ZSB0aGUgaW5zbiBhYm91dC4gICovCi0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlZ21lbnQpCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgaW4gdGhpcyBzZWdtZW50LgotCSBDaGFuZ2UgdGhlIHJlbGF4YXRpb24gc3VidHlwZSB0byB0aGUgbWF4IGFsbG93YWJsZSBhbmQgbGVhdmUKLQkgYWxsIGZ1cnRoZXIgaGFuZGxpbmcgdG8gbWRfY29udmVydF9mcmFnLiAgKi8KLSAgICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gMjsKLQotI2lmIDAgLyogQ2FuJ3QgdXNlIHRoaXMsIGJ1dCBsZWF2ZSBpbiBmb3IgaWxsdXN0cmF0aW9uLiAgKi8gICAgIAotICAgICAgLyogQ2hhbmdlIDE2IGJpdCBpbnNuIHRvIDMyIGJpdCBpbnNuLiAgKi8KLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMF0gfD0gMHg4MDsKLQotICAgICAgLyogSW5jcmVhc2Uga25vd24gKGZpeGVkKSBzaXplIG9mIGZyYWdtZW50LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLQotICAgICAgLyogQ3JlYXRlIGEgcmVsb2NhdGlvbiBmb3IgaXQuICAqLwotICAgICAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXgsIDQsCi0JICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEgLyogcGNyZWwgKi8sCi0JICAgICAgIC8qIEZJWE1FOiBDYW4ndCB1c2UgYSByZWFsIEJGRCByZWxvYyBoZXJlLgotCQkgIGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMgY2FuJ3QgaGFuZGxlIGl0LiAgKi8KLQkgICAgICAgQkZEX1JFTE9DX0ZSMzBfMjZfUENSRUwpOwotCi0gICAgICAvKiBNYXJrIHRoaXMgZnJhZ21lbnQgYXMgZmluaXNoZWQuICAqLwotICAgICAgZnJhZ193YW5lIChmcmFnUCk7Ci0jZWxzZQotICAgICAgewotCWNvbnN0IENHRU5fSU5TTiAqIGluc247Ci0JaW50ICAgICAgICAgICAgICAgaTsKLQotCS8qIFVwZGF0ZSB0aGUgcmVjb3JkZWQgaW5zbi4KLQkgICBGb3J0dW5hdGVseSB3ZSBkb24ndCBoYXZlIHRvIGxvb2sgdmVyeSBmYXIuCi0JICAgRklYTUU6IENoYW5nZSB0aGlzIHRvIHJlY29yZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gdGhlIG5leHQgaGlnaGVyCi0JICAgcmVsYXhhYmxlIGluc24gdG8gdXNlLiAgKi8KLQlmb3IgKGkgPSAwLCBpbnNuID0gZnJhZ1AtPmZyX2NnZW4uaW5zbjsgaSA8IDQ7IGkrKywgaW5zbisrKQotCSAgewotCSAgICBpZiAoKHN0cmNtcCAoQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSwKLQkJCSBDR0VOX0lOU05fTU5FTU9OSUMgKGZyYWdQLT5mcl9jZ2VuLmluc24pKQotCQkgPT0gMCkKLQkJJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9SRUxBWCkpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0JaWYgKGkgPT0gNCkKLQkgIGFib3J0ICgpOwotCi0JZnJhZ1AtPmZyX2NnZW4uaW5zbiA9IGluc247Ci0JcmV0dXJuIDI7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIChmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9mcl9maXgpOwotfSAKLQotLyogKmZyYWdQIGhhcyBiZWVuIHJlbGF4ZWQgdG8gaXRzIGZpbmFsIHNpemUsIGFuZCBub3cgbmVlZHMgdG8gaGF2ZQotICAgdGhlIGJ5dGVzIGluc2lkZSBpdCBtb2RpZmllZCB0byBjb25mb3JtIHRvIHRoZSBuZXcgc2l6ZS4KLQotICAgQ2FsbGVkIGFmdGVyIHJlbGF4YXRpb24gaXMgZmluaXNoZWQuCi0gICBmcmFnUC0+ZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudC4KLSAgIGZyYWdQLT5mcl9zdWJ0eXBlIGlzIHRoZSBzdWJ0eXBlIG9mIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgYmZkICogICBhYmZkOwotICBzZWdUICAgIHNlYzsKLSAgZnJhZ1MgKiBmcmFnUDsKLXsKLSNpZiAwCi0gIGNoYXIgKiBvcGNvZGU7Ci0gIGNoYXIgKiBkaXNwbGFjZW1lbnQ7Ci0gIGludCAgICB0YXJnZXRfYWRkcmVzczsKLSAgaW50ICAgIG9wY29kZV9hZGRyZXNzOwotICBpbnQgICAgZXh0ZW5zaW9uOwotICBpbnQgICAgYWRkZW5kOwotCi0gIG9wY29kZSA9IGZyYWdQLT5mcl9vcGNvZGU7Ci0KLSAgLyogQWRkcmVzcyBvcGNvZGUgcmVzaWRlcyBhdCBpbiBmaWxlIHNwYWNlLiAgKi8KLSAgb3Bjb2RlX2FkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXggLSAyOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgMSA6Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgZGlzcGxhY2VtZW50ID0gJiBvcGNvZGVbMV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDIgOgotICAgICAgb3Bjb2RlWzBdIHw9IDB4ODA7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgZGlzcGxhY2VtZW50ID0gJiBvcGNvZGVbMV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMgOgotICAgICAgb3Bjb2RlWzJdID0gb3Bjb2RlWzBdIHwgMHg4MDsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAob3Bjb2RlLCBQQVJfTk9QX0lOU04sIDIpOwotICAgICAgb3Bjb2RlX2FkZHJlc3MgKz0gMjsKLSAgICAgIGV4dGVuc2lvbiA9IDQ7Ci0gICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVszXTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWMpCi0gICAgewotICAgICAgLyogc3ltYm9sIG11c3QgYmUgcmVzb2x2ZWQgYnkgbGlua2VyICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX29mZnNldCAmIDMpCi0JYXNfd2FybiAoXygiQWRkZW5kIHRvIHVucmVzb2x2ZWQgc3ltYm9sIG5vdCBvbiB3b3JkIGJvdW5kYXJ5LiIpKTsKLSAgICAgIGFkZGVuZCA9IGZyYWdQLT5mcl9vZmZzZXQgPj4gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBBZGRyZXNzIHdlIHdhbnQgdG8gcmVhY2ggaW4gZmlsZSBzcGFjZS4gICovCi0gICAgICB0YXJnZXRfYWRkcmVzcyA9IFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSArIGZyYWdQLT5mcl9vZmZzZXQ7Ci0gICAgICB0YXJnZXRfYWRkcmVzcyArPSBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdQLT5mcl9zeW1ib2wpLT5mcl9hZGRyZXNzOwotICAgICAgYWRkZW5kID0gKHRhcmdldF9hZGRyZXNzIC0gKG9wY29kZV9hZGRyZXNzICYgLTQpKSA+PiAyOwotICAgIH0KLQotICAvKiBDcmVhdGUgYSByZWxvY2F0aW9uIGZvciBzeW1ib2xzIHRoYXQgbXVzdCBiZSByZXNvbHZlZCBieSB0aGUgbGlua2VyLgotICAgICBPdGhlcndpc2Ugb3V0cHV0IHRoZSBjb21wbGV0ZWQgaW5zbi4gICovCi0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlYykKLSAgICB7Ci0gICAgICBhc3NlcnQgKGZyYWdQLT5mcl9zdWJ0eXBlICE9IDEpOwotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfY2dlbi5pbnNuICE9IDApOwotICAgICAgZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwIChmcmFnUCwKLQkJCSAgICAgLyogT2Zmc2V0IG9mIGJyYW5jaCBpbnNuIGluIGZyYWcuICAqLwotCQkJICAgICBmcmFnUC0+ZnJfZml4ICsgZXh0ZW5zaW9uIC0gNCwKLQkJCSAgICAgZnJhZ1AtPmZyX2NnZW4uaW5zbiwKLQkJCSAgICAgNCAvKmxlbmd0aCovLAotCQkJICAgICAvKiBGSVhNRTogcXVpY2sgaGFjayAqLwotI2lmIDAKLQkJCSAgICAgQ0dFTl9PUEVSQU5EX0VOVFJZIChmcmFnUC0+ZnJfY2dlbi5vcGluZGV4KSwKLSNlbHNlCi0JCQkgICAgIENHRU5fT1BFUkFORF9FTlRSWSAoRlIzMF9PUEVSQU5EX0RJU1AyNCksCi0jZW5kaWYKLQkJCSAgICAgZnJhZ1AtPmZyX2NnZW4ub3BpbmZvLAotCQkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0KTsKLSAgICB9Ci0KLSNkZWZpbmUgU0laRV9GUk9NX1JFTEFYX1NUQVRFKG4pICgobikgPT0gMSA/IDEgOiAzKQotCi0gIG1kX251bWJlcl90b19jaGFycyAoZGlzcGxhY2VtZW50LCAodmFsdWVUKSBhZGRlbmQsCi0JCSAgICAgIFNJWkVfRlJPTV9SRUxBWF9TVEFURSAoZnJhZ1AtPmZyX3N1YnR5cGUpKTsKLQotICBmcmFnUC0+ZnJfZml4ICs9IGV4dGVuc2lvbjsKLSNlbmRpZgotfQotDAotLyogRnVuY3Rpb25zIGNvbmNlcm5pbmcgcmVsb2NzLiAgKi8KLQotLyogVGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggYSBQQyByZWxhdGl2ZSBqdW1wIHNob3VsZCBiZSBjYWxjdWxhdGVkLAotICAgZ2l2ZW4gYSBQQyByZWxhdGl2ZSByZWxvYy4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4UCwgc2VjKQotICAgICBmaXhTICogZml4UDsKLSAgICAgc2VnVCAgIHNlYzsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICB8fCBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VjKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCAob3IgaXMgZGVmaW5lZCBidXQgbm90IGluIHRoaXMgc2VjdGlvbikuCi0JIExldCB0aGUgbGlua2VyIGZpZ3VyZSBpdCBvdXQuICAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlKSAmIH4xOwotfQotCi0vKiBSZXR1cm4gdGhlIGJmZCByZWxvYyB0eXBlIGZvciBPUEVSQU5EIG9mIElOU04gYXQgZml4dXAgRklYUC4KLSAgIFJldHVybnMgQkZEX1JFTE9DX05PTkUgaWYgbm8gcmVsb2MgdHlwZSBjYW4gYmUgZm91bmQuCi0gICAqRklYUCBtYXkgYmUgbW9kaWZpZWQgaWYgZGVzaXJlZC4gICovCi0KLWJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotbWRfY2dlbl9sb29rdXBfcmVsb2MgKGluc24sIG9wZXJhbmQsIGZpeFApCi0gICAgIGNvbnN0IENHRU5fSU5TTiAqICAgIGluc247Ci0gICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7Ci0gICAgIGZpeFMgKiAgICAgICAgICAgICAgIGZpeFA7Ci17Ci0gIHN3aXRjaCAob3BlcmFuZC0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5OiAgZml4UC0+ZnhfcGNyZWwgPSAxOyByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfOV9QQ1JFTDsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyOiBmaXhQLT5meF9wY3JlbCA9IDE7IHJldHVybiBCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTDsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTA6ICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfMTBfSU5fODsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOTogICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfOV9JTl84OwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4OiAgIHJldHVybiBCRkRfUkVMT0NfRlIzMF84X0lOXzg7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2OiAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzZfSU5fNDsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JODogICAgICByZXR1cm4gQkZEX1JFTE9DXzg7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyOiAgICAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzQ4OwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMDogICAgIHJldHVybiBCRkRfUkVMT0NfRlIzMF8yMDsKLSAgICBkZWZhdWx0IDogLyogYXZvaWQgLVdhbGwgd2FybmluZyAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBCRkRfUkVMT0NfTk9ORTsKLX0KLQotLyogU2VlIHdoZXRoZXIgd2UgbmVlZCB0byBmb3JjZSBhIHJlbG9jYXRpb24gaW50byB0aGUgb3V0cHV0IGZpbGUuCi0gICBUaGlzIGlzIHVzZWQgdG8gZm9yY2Ugb3V0IHN3aXRjaCBhbmQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgd2hlbgotICAgcmVsYXhpbmcuICAqLwotCi1pbnQKLWZyMzBfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotICAgICBmaXhTICogZml4OwotewotICBpZiAoICAgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotDAotLyogV3JpdGUgYSB2YWx1ZSBvdXQgdG8gdGhlIG9iamVjdCBmaWxlLCB1c2luZyB0aGUgYXBwcm9wcmlhdGUgZW5kaWFubmVzcy4gICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKiBidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCAgICBuOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSovCi0KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyICAgdHlwZTsKLSAgICAgY2hhciAqIGxpdFA7Ci0gICAgIGludCAqICBzaXplUDsKLXsKLSAgaW50ICAgICAgICAgICAgICBpOwotICBpbnQgICAgICAgICAgICAgIHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFICAgd29yZHMgW01BWF9MSVRUTEVOVU1TXTsKLSAgY2hhciAqICAgICAgICAgICB0OwotICBjaGFyICogICAgICAgICAgIGF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgLyogRklYTUU6IFNvbWUgdGFyZ2V0cyBhbGxvdyBvdGhlciBmb3JtYXQgY2hhcnMgZm9yIGJpZ2dlciBzaXplcyBoZXJlLiAgKi8KLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqIHNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBtZF9hdG9mKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICogc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLAotCQkJICBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgICAgCi0gIHJldHVybiAwOwotfQotCi0vKiBXb3JrZXIgZnVuY3Rpb24gZm9yIGZyMzBfaXNfY29sb25faW5zbigpLiAgKi8KLXN0YXRpYyBjaGFyCi1yZXN0b3JlX2NvbG9uIChhZHZhbmNlX2lfbF9wX2J5KQotICAgICBpbnQgYWR2YW5jZV9pX2xfcF9ieTsKLXsKLSAgY2hhciBjOwotICAKLSAgLyogUmVzdG9yZSB0aGUgY29sb24sIGFuZCBhZHZhbmNlIGlucHV0X2xpbmVfcG9pbnRlciB0bwotICAgICB0aGUgZW5kIG9mIHRoZSBuZXcgc3ltYm9sLiAgKi8KLSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSAnOic7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciArPSBhZHZhbmNlX2lfbF9wX2J5OwotICBjID0gKiBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICogaW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgCi0gIHJldHVybiBjOwotfQotCi0vKiBEZXRlcm1pbmVzIGlmIHRoZSBzeW1ib2wgc3RhcnRpbmcgYXQgU1RBUlQgYW5kIGVuZGluZyBpbgotICAgYSBjb2xvbiB0aGF0IHdhcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSBJTlBVVF9MSU5FX1BPSU5URVIKLSAgIChidXQgd2hpY2ggaGFzIG5vdyBiZWVuIHJlcGxhY2VkIGJ1IGEgTlVMKSBpcyBpbiBmYWN0IGFuCi0gICBMREk6OCwgTERJOjIwLCBMREk6MzIsIENBTEw6RC4gSk1QOkQsIFJFVDpEIG9yIEJjYzpEIGluc3RydWN0aW9uLgotICAgSWYgaXQgaXMsIHRoZW4gaXQgcmVzdG9yZXMgdGhlIGNvbG9uLCBhZHZhbmNlcyBJTlBVVF9MSU5FX1BPSU5URVIKLSAgIHRvIHRoZSByZWFsIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24vc3ltYm9sLCBhbmQgcmV0dXJucyB0aGUgY2hhcmFjdGVyCi0gICB0aGF0IHJlYWxseSB0ZXJtaW5hdGVkIHRoZSBzeW1ib2wuICBPdGhlcndpc2UgaXQgcmV0dXJucyAwLiAgKi8KLWNoYXIKLWZyMzBfaXNfY29sb25faW5zbiAoc3RhcnQpCi0gICAgIGNoYXIgKiAgc3RhcnQ7Ci17Ci0gIGNoYXIgKiBpX2xfcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHN5bWJvbCBwYXJzZWQgc28gZmFyIGlzICdsZGknICAqLwotICBpZiAoICAgKHN0YXJ0WzBdICE9ICdsJyAmJiBzdGFydFswXSAhPSAnTCcpCi0gICAgICB8fCAoc3RhcnRbMV0gIT0gJ2QnICYmIHN0YXJ0WzFdICE9ICdEJykKLSAgICAgIHx8IChzdGFydFsyXSAhPSAnaScgJiYgc3RhcnRbMl0gIT0gJ0knKQotICAgICAgfHwgc3RhcnRbM10gIT0gMCkKLSAgICB7Ci0gICAgICAvKiBOb3BlIC0gY2hlY2sgdG8gc2VlIGEgJ2QnIGZvbGxvd3MgdGhlIGNvbG9uLiAgKi8KLSAgICAgIGlmICggICAoaV9sX3BbMV0gPT0gJ2QnIHx8IGlfbF9wWzFdID09ICdEJykKLQkgICYmIChpX2xfcFsyXSA9PSAnICcgfHwgaV9sX3BbMl0gPT0gJ1x0JyB8fCBpX2xfcFsyXSA9PSAnXG4nKSkKLQl7Ci0JICAvKiBZdXAgLSBpdCBtaWdodCBiZSBkZWxheSBzbG90IGluc3RydWN0aW9uLiAgKi8KLQkgIGludCAgICAgICAgICAgaTsKLQkgIHN0YXRpYyBjaGFyICogZGVsYXlfaW5zbnMgW10gPQotCSAgewotCSAgICAiY2FsbCIsICJqbXAiLCAicmV0IiwgImJyYSIsICJibm8iLAotCSAgICAiYmVxIiwgICJibmUiLCAiYmMiLCAgImJuYyIsICJibiIsCi0JICAgICJicCIsICAgImJ2IiwgICJibnYiLCAiYmx0IiwgImJnZSIsCi0JICAgICJibGUiLCAgImJndCIsICJibHMiLCAiYmhpIgotCSAgfTsKLQotCSAgZm9yIChpID0gc2l6ZW9mIChkZWxheV9pbnNucykgLyBzaXplb2YgKGRlbGF5X2luc25zWzBdKTsgaS0tOykKLQkgICAgewotCSAgICAgIGNoYXIgKiBpbnNuID0gZGVsYXlfaW5zbnNbaV07Ci0JICAgICAgaW50ICAgIGxlbiAgPSBzdHJsZW4gKGluc24pOwotCi0JICAgICAgaWYgKHN0YXJ0IFtsZW5dICE9IDApCi0JCWNvbnRpbnVlOwotCSAgICAgIAotCSAgICAgIHdoaWxlIChsZW4gLS0pCi0JCWlmICh0b2xvd2VyIChzdGFydCBbbGVuXSkgIT0gaW5zbiBbbGVuXSkKLQkJICBicmVhazsKLQkgICAgICAKLQkgICAgICBpZiAobGVuID09IC0xKQotCQlyZXR1cm4gcmVzdG9yZV9jb2xvbiAoMSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIE5vcGUgLSBpdCBpcyBhIG5vcm1hbCBsYWJlbC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSB0ZXh0IGZvbGxvd2luZyB0aGUgY29sb24gaXMgJzgnICovCi0gIGlmIChpX2xfcFsxXSA9PSAnOCcgJiYgKGlfbF9wWzJdID09ICcgJyB8fCBpX2xfcFsyXSA9PSAnXHQnKSkKLSAgICByZXR1cm4gcmVzdG9yZV9jb2xvbiAoMik7Ci0KLSAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSB0ZXh0IGZvbGxvd2luZyB0aGUgY29sb24gaXMgJzIwJyAqLwotICBlbHNlIGlmIChpX2xfcFsxXSA9PSAnMicgJiYgaV9sX3BbMl0gPT0nMCcgJiYgKGlfbF9wWzNdID09ICcgJyB8fCBpX2xfcFszXSA9PSAnXHQnKSkKLSAgICByZXR1cm4gcmVzdG9yZV9jb2xvbiAoMyk7Ci0KLSAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSB0ZXh0IGZvbGxvd2luZyB0aGUgY29sb24gaXMgJzMyJyAqLwotICBlbHNlIGlmIChpX2xfcFsxXSA9PSAnMycgJiYgaV9sX3BbMl0gPT0nMicgJiYgKGlfbF9wWzNdID09ICcgJyB8fCBpX2xfcFszXSA9PSAnXHQnKSkKLSAgICByZXR1cm4gcmVzdG9yZV9jb2xvbiAoMyk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWJvb2xlYW4KLWZyMzBfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICBmaXhTICogZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0gIAotI2lmIDAgIAotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBpZiAoU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KLSAgaWYgKCAgIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1mcjMwLmggYi9nYXMvY29uZmlnL3RjLWZyMzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3MmQ4Yi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWZyMzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qIHRjLWZyMzAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtZnIzMC5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfRlIzMAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLS8qIGxlYWRpbmcgc3BhY2Ugc28gd2lsbCBjb21waWxlIHdpdGggY2MgKi8KLSAjZXJyb3IgRlIzMCBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJGUjMwIEdBUyAiCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2ZyMzAKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1mcjMwIgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotLyogY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24sIG5vdCBtZF9wY3JlbF9mcm9tICovCi1sb25nIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QpKTsKLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChGSVhQLCBTRUMpCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogLi1mb28gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLSNkZWZpbmUgbWRfYXBwbHlfZml4MyBnYXNfY2dlbl9tZF9hcHBseV9maXgzCi0KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIGZyMzBfZml4X2FkanVzdGFibGUgKGZpeFApCi1leHRlcm4gYm9vbGVhbiBmcjMwX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIGVtaXQgdmFyaW91cyByZWxvY3Mgd2Ugb3RoZXJ3aXNlIHdvdWxkbid0LiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXgpIGZyMzBfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotZXh0ZXJuIGludCBmcjMwX2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0KLSNkZWZpbmUgdGNfZ2VuX3JlbG9jIGdhc19jZ2VuX3RjX2dlbl9yZWxvYwotCi0vKiBDYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbigpLCBub3QgbWRfcGNyZWxfZnJvbSgpLiAgKi8KLSNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChGSVhQLCBTRUMpCi1leHRlcm4gbG9uZyBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzZWdUKSk7Ci0KLS8qIEZvciA4IHZzIDE2IHZzIDMyIGJpdCBicmFuY2ggc2VsZWN0aW9uLiAgKi8KLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0KLS8qIFdlIG5lZWQgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIFRDX1NUQVJUX0xBQkVMIG1hY3JvIHNvIHRoYXQgd2UKLSAgIGFsbG93IHRoZSBMREk6OCwgTERJOjIwLCBMREk6MzIgYW5kIGRlbGF5IHNsb3QgaW5zdHJ1Y3Rpb25zIHRvIGJlCi0gICBwYXJzZWQgYXMgc3VjaC4gIE5vdGUgLSBpbiBhIEhPUlJJQkxFIEhBQ0ssIHdlIG1ha2UgdXNlIG9mIHRoZQotICAga25vd2xlZGdlIHRoYXQgdGhpcyBtYXJjbyBpcyBvbmx5IGV2ZXIgZXZhbHVhdGVkIGluIG9uZSBwbGFjZQotICAgKHJlYWRfYV9zb3VyY2VfZmlsZSBpbiByZWFkLmMpIHdoZXJlIHdlIGNhbiBhY2Nlc3MgdGhlIGxvY2FsCi0gICB2YXJpYWJsZSAncycgLSB0aGUgc3RhcnQgb2YgdGhlIHN5bWJvbCB0aGF0IHdhcyB0ZXJtaW5hdGVkIGJ5Ci0gICAnY2hhcmFjdGVyJy4gIEFsc28gd2UgbmVlZCB0byBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgY29udGVudHMgb2YKLSAgIHRoZSBsb2NhbCB2YXJpYWJsZSAnYycgd2hpY2ggaXMgcGFzc2VkIHRvIHRoaXMgbWFjcm8gYXMgJ2NoYXJhY3RlcicuICAqLwotI2RlZmluZSBUQ19TVEFSVF9MQUJFTChjaGFyYWN0ZXIsIGlfbF9wKQkJCVwKLSAgKChjaGFyYWN0ZXIpICE9ICc6JyA/IDAgOiAoY2hhcmFjdGVyID0gZnIzMF9pc19jb2xvbl9pbnNuIChzKSkgPyAwIDogKChjaGFyYWN0ZXIgPSAnOicpLCAxKSkKLWV4dGVybiBjaGFyIGZyMzBfaXNfY29sb25faW5zbiBQQVJBTVMgKChjaGFyICopKTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZ2VuZXJpYy5jIGIvZ2FzL2NvbmZpZy90Yy1nZW5lcmljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1nZW5lcmljLmMKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1nZW5lcmljLmggYi9nYXMvY29uZmlnL3RjLWdlbmVyaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJkZjAyMC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWdlbmVyaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1nZW5lcmljLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MSwgOTIsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGMtZ2VuZXJpYy5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvciB0YXJnZXQgY3B1Ci0gKiBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuICBJdCBpcyBteSBpbnRlbnQgdGhhdCB0aGlzIGZpbGUgY29tcGlsZS4gIEl0IGlzIGFsc28KLSAqIG15IGludGVudCB0aGF0IHRoaXMgZmlsZSBncm93IGludG8gc29tZXRoaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYm90aCBhCi0gKiB0ZW1wbGF0ZSBmb3IgcG9ydGluZywgYW5kIGEgc3R1YiBmb3IgdGVzdGluZy4gIHhveG9yaWNoLgotICovCi0KLSNkZWZpbmUgVENfR0VORVJJQyAxCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGMtZ2VuZXJpYy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWg4MzAwLmMgYi9nYXMvY29uZmlnL3RjLWg4MzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWFkYTEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1oODMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5NSArMCwwIEBACi0vKiB0Yy1oODMwMC5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIHRoZSBIaXRhY2hpIEg4LzMwMAotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKgotICBXcml0dGVuIEJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gIHNhY0BjeWdudXMuY29tCi0gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNkZWZpbmUgaDhfb3Bjb2RlcyBvcHMKLSNpbmNsdWRlICJvcGNvZGUvaDgzMDAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9Ci17JzsnLCAwfTsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9Ci17MH07Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAgICovCi0KLXZvaWQgY29ucyAoKTsKLQotaW50IEhtb2RlOwotaW50IFNtb2RlOwotI2RlZmluZSBQU0laRSAoSG1vZGUgPyBMXzMyIDogTF8xNikKLSNkZWZpbmUgRE1PREUgKExfMTYpCi0jZGVmaW5lIERTWU1NT0RFIChIbW9kZSA/IExfMjQgOiBMXzE2KQotaW50IGJzaXplID0gTF84OwkJLyogZGVmYXVsdCBicmFuY2ggZGlzcGxhY2VtZW50ICovCi0KLQotdm9pZAotaDgzMDBobW9kZSAoKQotewotICBIbW9kZSA9IDE7Ci0gIFNtb2RlID0gMDsKLX0KLQotdm9pZAotaDgzMDBzbW9kZSAoKQotewotICBTbW9kZSA9IDE7Ci0gIEhtb2RlID0gMTsKLX0KLXZvaWQKLXNicmFuY2ggKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBic2l6ZSA9IHNpemU7Ci19Ci0KLXN0YXRpYyB2b2lkIHBpbnQgKCkKLXsKLSAgY29ucyAoSG1vZGUgPyA0IDogMik7Ci19Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0KLSAgeyJoODMwMGgiLCBoODMwMGhtb2RlLCAwfSwKLSAgeyJoODMwMHMiLCBoODMwMHNtb2RlLCAwfSwKLSAgeyJzYnJhbmNoIiwgc2JyYW5jaCwgTF84fSwKLSAgeyJsYnJhbmNoIiwgc2JyYW5jaCwgTF8xNn0sCi0KLSAgeyJpbnQiLCBwaW50LCAwfSwKLSAgeyJkYXRhLmIiLCBjb25zLCAxfSwKLSAgeyJkYXRhLnciLCBjb25zLCAyfSwKLSAgeyJkYXRhLmwiLCBjb25zLCA0fSwKLSAgeyJmb3JtIiwgbGlzdGluZ19wc2l6ZSwgMH0sCi0gIHsiaGVhZGluZyIsIGxpc3RpbmdfdGl0bGUsIDB9LAotICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKLSAgeyJwYWdlIiwgbGlzdGluZ19lamVjdCwgMH0sCi0gIHsicHJvZ3JhbSIsIHNfaWdub3JlLCAwfSwKLSAgezAsIDAsIDB9Ci19OwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZTsKLQotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wY29kZV9oYXNoX2NvbnRyb2w7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLQotLyoKLSAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIFRoaXMgc2hvdWxkCi0gIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciBuZWVkcwotICAqLwotCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHN0cnVjdCBoOF9vcGNvZGUgKm9wY29kZTsKLSAgY2hhciBwcmV2X2J1ZmZlclsxMDBdOwotICBpbnQgaWR4ID0gMDsKLQotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0gIHByZXZfYnVmZmVyWzBdID0gMDsKLQotICBmb3IgKG9wY29kZSA9IGg4X29wY29kZXM7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgLyogU3RyaXAgb2ZmIGFueSAuIHBhcnQgd2hlbiBpbnNlcnRpbmcgdGhlIG9wY29kZSBhbmQgb25seSBlbnRlcgotICAgICAgICAgdW5pcXVlIGNvZGVzIGludG8gdGhlIGhhc2ggdGFibGUKLSAgICAgICAgICovCi0gICAgICBjaGFyICpzcmMgPSBvcGNvZGUtPm5hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuID0gc3RybGVuIChzcmMpOwotICAgICAgY2hhciAqZHN0ID0gbWFsbG9jIChsZW4gKyAxKTsKLSAgICAgIGNoYXIgKmJ1ZmZlciA9IGRzdDsKLQotICAgICAgb3Bjb2RlLT5zaXplID0gMDsKLSAgICAgIHdoaWxlICgqc3JjKQotCXsKLQkgIGlmICgqc3JjID09ICcuJykKLQkgICAgewotCSAgICAgIHNyYysrOwotCSAgICAgIG9wY29kZS0+c2l6ZSA9ICpzcmM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgICpkc3QrKyA9ICpzcmMrKzsKLQl9Ci0gICAgICAqZHN0KysgPSAwOwotICAgICAgaWYgKHN0cmNtcCAoYnVmZmVyLCBwcmV2X2J1ZmZlcikpCi0JewotCSAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIGJ1ZmZlciwgKGNoYXIgKikgb3Bjb2RlKTsKLQkgIHN0cmNweSAocHJldl9idWZmZXIsIGJ1ZmZlcik7Ci0JICBpZHgrKzsKLQl9Ci0gICAgICBvcGNvZGUtPmlkeCA9IGlkeDsKLQotCi0gICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgKi8KLSAgICAgIG9wY29kZS0+bm9wZXJhbmRzID0gMDsKLSAgICAgIHdoaWxlIChvcGNvZGUtPmFyZ3MubmliW29wY29kZS0+bm9wZXJhbmRzXSAhPSBFKQotCW9wY29kZS0+bm9wZXJhbmRzKys7Ci0gICAgICAvKiBGaW5kIHRoZSBsZW5ndGggb2YgdGhlIG9wY29kZSBpbiBieXRlcyAqLwotICAgICAgb3Bjb2RlLT5sZW5ndGggPSAwOwotICAgICAgd2hpbGUgKG9wY29kZS0+ZGF0YS5uaWJbb3Bjb2RlLT5sZW5ndGggKiAyXSAhPSBFKQotCW9wY29kZS0+bGVuZ3RoKys7Ci0gICAgfQotCi0gIGxpbmtyZWxheCA9IDE7Ci19Ci0KLQotc3RydWN0IGg4X2V4cAotewotICBjaGFyICplX2JlZzsKLSAgY2hhciAqZV9lbmQ7Ci0gIGV4cHJlc3Npb25TIGVfZXhwOwotfTsKLWludCBkaXNwcmVnOwotaW50IG9wc2l6ZTsJCQkvKiBTZXQgd2hlbiBhIHJlZ2lzdGVyIHNpemUgaXMgc2VlbiAqLwotCi0KLXN0cnVjdCBoOF9vcAotewotICBvcF90eXBlIG1vZGU7Ci0gIHVuc2lnbmVkIHJlZzsKLSAgZXhwcmVzc2lvblMgZXhwOwotfTsKLQotLyoKLSAgcGFyc2Ugb3BlcmFuZHMKLSAgV1JFRyByMCxyMSxyMixyMyxyNCxyNSxyNixyNyxmcCxzcAotICByMGwscjBoLC4ucjdsLHI3aAotICBAV1JFRwotICBAV1JFRysKLSAgQC1XUkVHCi0gICNjb25zdAotICBjY3IKLSovCi0KLS8qIHRyeSBhbmQgcGFyc2UgYSByZWcgbmFtZSwgcmV0dXJucyBudW1iZXIgb2YgY2hhcnMgY29uc3VtZWQgKi8KLWludAotcGFyc2VfcmVnIChzcmMsIG1vZGUsIHJlZywgZGlyZWN0aW9uKQotICAgICBjaGFyICpzcmM7Ci0gICAgIG9wX3R5cGUgKm1vZGU7Ci0gICAgIHVuc2lnbmVkIGludCAqcmVnOwotICAgICBpbnQgZGlyZWN0aW9uOwotCi17Ci0gIGNoYXIgKmVuZDsKLSAgaW50IGxlbjsKLQotICAvKiBDcmliYmVkIGZyb20gZ2V0X3N5bWJvbF9lbmQoKS4gICovCi0gIGlmICghaXNfbmFtZV9iZWdpbm5lciAoKnNyYykgfHwgKnNyYyA9PSAnXDAwMScpCi0gICAgcmV0dXJuIDA7Ci0gIGVuZCA9IHNyYysxOwotICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lICgqZW5kKSB8fCAqZW5kID09ICdcMDAxJykKLSAgICBlbmQrKzsKLSAgbGVuID0gZW5kIC0gc3JjOwotCi0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgKm1vZGUgPSBQU0laRSB8IFJFRyB8IGRpcmVjdGlvbjsKLSAgICAgICpyZWcgPSA3OwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMyAmJiBzcmNbMF0gPT0gJ2MnICYmIHNyY1sxXSA9PSAnYycgJiYgc3JjWzJdID09ICdyJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IENDUjsKLSAgICAgICpyZWcgPSAwOwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMyAmJiBzcmNbMF0gPT0gJ2UnICYmIHNyY1sxXSA9PSAneCcgJiYgc3JjWzJdID09ICdyJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IEVYUjsKLSAgICAgICpyZWcgPSAwOwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgKm1vZGUgPSBQU0laRSB8IFJFRyB8IGRpcmVjdGlvbjsKLSAgICAgICpyZWcgPSA2OwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMyAmJiBzcmNbMF0gPT0gJ2UnICYmIHNyY1sxXSA9PSAncicKLSAgICAgICYmIHNyY1syXSA+PSAnMCcgJiYgc3JjWzJdIDw9ICc3JykKLSAgICB7Ci0gICAgICAqbW9kZSA9IExfMzIgfCBSRUcgfCBkaXJlY3Rpb247Ci0gICAgICAqcmVnID0gc3JjWzJdIC0gJzAnOwotICAgICAgaWYgKCFIbW9kZSkKLQlhc193YXJuIChfKCJSZWcgbm90IHZhbGlkIGZvciBIOC8zMDAiKSk7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnZScgJiYgc3JjWzFdID49ICcwJyAmJiBzcmNbMV0gPD0gJzcnKQotICAgIHsKLSAgICAgICptb2RlID0gTF8xNiB8IFJFRyB8IGRpcmVjdGlvbjsKLSAgICAgICpyZWcgPSBzcmNbMV0gLSAnMCcgKyA4OwotICAgICAgaWYgKCFIbW9kZSkKLQlhc193YXJuIChfKCJSZWcgbm90IHZhbGlkIGZvciBIOC8zMDAiKSk7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzFdID49ICcwJyAmJiBzcmNbMV0gPD0gJzcnKQotCXsKLQkgIGlmIChsZW4gPT0gMyAmJiBzcmNbMl0gPT0gJ2wnKQotCSAgICB7Ci0JICAgICAgKm1vZGUgPSBMXzggfCBSRUcgfCBkaXJlY3Rpb247Ci0JICAgICAgKnJlZyA9IChzcmNbMV0gLSAnMCcpICsgODsKLQkgICAgICByZXR1cm4gbGVuOwotCSAgICB9Ci0JICBpZiAobGVuID09IDMgJiYgc3JjWzJdID09ICdoJykKLQkgICAgewotCSAgICAgICptb2RlID0gTF84IHwgUkVHIHwgZGlyZWN0aW9uOwotCSAgICAgICpyZWcgPSAoc3JjWzFdIC0gJzAnKTsKLQkgICAgICByZXR1cm4gbGVuOwotCSAgICB9Ci0JICBpZiAobGVuID09IDIpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IExfMTYgfCBSRUcgfCBkaXJlY3Rpb247Ci0JICAgICAgKnJlZyA9IChzcmNbMV0gLSAnMCcpOwotCSAgICAgIHJldHVybiBsZW47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLXBhcnNlX2V4cCAocywgb3ApCi0gICAgIGNoYXIgKnM7Ci0gICAgIGV4cHJlc3Npb25TICogb3A7Ci17Ci0gIGNoYXIgKnNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgKm5ldzsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotICBleHByZXNzaW9uIChvcCk7Ci0gIGlmIChvcC0+WF9vcCA9PSBPX2Fic2VudCkKLSAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgbmV3ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY2hhciAqCi1za2lwX2NvbG9udGhpbmcgKHB0ciwgZXhwLCBtb2RlKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGludCAqbW9kZTsKLXsKLSAgaWYgKCpwdHIgPT0gJzonKQotICAgIHsKLSAgICAgIHB0cisrOwotICAgICAgKm1vZGUgJj0gflNJWkU7Ci0gICAgICBpZiAoKnB0ciA9PSAnOCcpCi0JewotCSAgcHRyKys7Ci0JICAvKiBmZiBmaWxsIGFueSA4IGJpdCBxdWFudGl0eSAqLwotCSAvKiBleHAtPlhfYWRkX251bWJlciAtPSAweDEwMDsqLwotCSAgKm1vZGUgfD0gTF84OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKnB0ciA9PSAnMicpCi0JICAgIHsKLQkgICAgICAqbW9kZSB8PSBMXzI0OwotCSAgICB9Ci0JICBlbHNlIGlmICgqcHRyID09ICczJykKLQkgICAgewotCSAgICAgICptb2RlIHw9IExfMzI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpwdHIgPT0gJzEnKQotCSAgICB7Ci0JICAgICAgKm1vZGUgfD0gTF8xNjsKLQkgICAgfQotCSAgd2hpbGUgKGlzZGlnaXQgKCpwdHIpKQotCSAgICBwdHIrKzsKLQl9Ci0gICAgfQotICByZXR1cm4gcHRyOwotfQotCi0vKiBUaGUgbWFueSBmb3JtcyBvZiBvcGVyYW5kOgotCi0gICBSbgkJCVJlZ2lzdGVyIGRpcmVjdAotICAgQFJuCQkJUmVnaXN0ZXIgaW5kaXJlY3QKLSAgIEAoZXhwWzoxNl0sIFJuKQlSZWdpc3RlciBpbmRpcmVjdCB3aXRoIGRpc3BsYWNlbWVudAotICAgQFJuKwotICAgQC1SbgotICAgQGFhOjgJCQlhYnNvbHV0ZSA4IGJpdAotICAgQGFhOjE2CQkJYWJzb2x1dGUgMTYgYml0Ci0gICBAYWEJCQlhYnNvbHV0ZSAxNiBiaXQKLQotICAgI3h4WzpzaXplXQkJaW1tZWRpYXRlIGRhdGEKLSAgIEAoZXhwOls4XSwgcGMpCQlwYyByZWwKLSAgIEBAYWFbOjhdCQltZW1vcnkgaW5kaXJlY3QKLQotICAgKi8KLQotY2hhciAqCi1jb2xvbm1vZDI0IChvcCwgc3JjKQotICAgICBzdHJ1Y3QgaDhfb3AgKm9wOwotICAgICBjaGFyICpzcmM7Ci0KLXsKLSAgaW50IG1vZGUgPSAwOwotICBzcmMgPSBza2lwX2NvbG9udGhpbmcgKHNyYywgJm9wLT5leHAsICZtb2RlKTsKLQotICBpZiAoIW1vZGUpCi0gICAgewotICAgICAgLyogQ2hvb3NlIGEgZGVmYXVsdCBtb2RlICovCi0gICAgICBpZiAob3AtPmV4cC5YX2FkZF9udW1iZXIgPCAtMzI3NjgKLQkgIHx8IG9wLT5leHAuWF9hZGRfbnVtYmVyID4gMzI3NjcpCi0JewotCSAgaWYgKEhtb2RlKQotCSAgICBtb2RlID0gTF8yNDsKLQkgIGVsc2UKLQkgICAgbW9kZSA9IExfMTY7Ci0JfQotICAgICAgZWxzZSBpZiAob3AtPmV4cC5YX2FkZF9zeW1ib2wKLQkgICAgICAgfHwgb3AtPmV4cC5YX29wX3N5bWJvbCkKLQltb2RlID0gRFNZTU1PREU7Ci0gICAgICBlbHNlCi0JbW9kZSA9IERNT0RFOwotICAgIH0KLSAgb3AtPm1vZGUgfD0gbW9kZTsKLSAgcmV0dXJuIHNyYzsKLQotfQotCi0KLXN0YXRpYyB2b2lkCi1nZXRfb3BlcmFuZCAocHRyLCBvcCwgZHN0LCBkaXJlY3Rpb24pCi0gICAgIGNoYXIgKipwdHI7Ci0gICAgIHN0cnVjdCBoOF9vcCAqb3A7Ci0gICAgIHVuc2lnbmVkIGludCBkc3Q7Ci0gICAgIGludCBkaXJlY3Rpb247Ci17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIG9wX3R5cGUgbW9kZTsKLSAgdW5zaWduZWQgaW50IG51bTsKLSAgdW5zaWduZWQgaW50IGxlbjsKLQotICBvcC0+bW9kZSA9IEU7Ci0KLSAgLyogR3Jvc3MuICBHcm9zcy4gIGxkbSBhbmQgc3RtIGhhdmUgYSBmb3JtYXQgbm90IGVhc2lseSBoYW5kbGVkCi0gICAgIGJ5IGdldF9vcGVyYW5kLiAgV2UgZGVhbCB3aXRoIGl0IGV4cGxpY2l0bHkgaGVyZS4gICovCi0gIGlmIChzcmNbMF0gPT0gJ2UnICYmIHNyY1sxXSA9PSAncicgJiYgaXNkaWdpdChzcmNbMl0pCi0gICAgICAmJiBzcmNbM10gPT0gJy0nICYmIHNyY1s0XSA9PSAnZScgJiYgc3JjWzVdID09ICdyJyAmJiBpc2RpZ2l0KHNyY1s2XSkpCi0gICAgewotICAgICAgaW50IGxvdywgaGlnaDsKLQotICAgICAgbG93ID0gc3JjWzJdIC0gJzAnOwotICAgICAgaGlnaCA9IHNyY1s2XSAtICcwJzsKLQotICAgICAgaWYgKGhpZ2ggPCBsb3cpCi0JYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGxpc3QgZm9yIGxkbS9zdG1cbiIpKTsKLQotICAgICAgaWYgKGxvdyAlIDIpCi0JYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGxpc3QgZm9yIGxkbS9zdG1cbiIpKTsKLQotICAgICAgaWYgKGhpZ2ggLSBsb3cgPiAzKQotCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlciBsaXN0IGZvciBsZG0vc3RtXG4iKSk7Ci0KLSAgICAgIGlmIChoaWdoIC0gbG93ICE9IDEKLQkgICYmIGxvdyAlIDQpCi0JYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGxpc3QgZm9yIGxkbS9zdG1cbiIpKTsKLQotICAgICAgLyogRXZlbiBzaWNrZXIuICBXZSBlbmNvZGUgdHdvIHJlZ2lzdGVycyBpbnRvIG9wLT5yZWcuICBPbmUKLQkgZm9yIHRoZSBsb3cgcmVnaXN0ZXIgdG8gc2F2ZSwgdGhlIG90aGVyIGZvciB0aGUgaGlnaAotCSByZWdpc3RlciB0byBzYXZlOyAgd2UgYWxzbyBzZXQgdGhlIGhpZ2ggYml0IGluIG9wLT5yZWcKLQkgc28gd2Uga25vdyB0aGlzIGlzICJ2ZXJ5IHNwZWNpYWwiLiAgKi8KLSAgICAgIG9wLT5yZWcgPSAweDgwMDAwMDAwIHwgKGhpZ2ggPDwgOCkgfCBsb3c7Ci0gICAgICBvcC0+bW9kZSA9IFJFRzsKLSAgICAgICpwdHIgPSBzcmMgKyA3OwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm9wLT5tb2RlLCAmb3AtPnJlZywgZGlyZWN0aW9uKTsKLSAgaWYgKGxlbikKLSAgICB7Ci0gICAgICAqcHRyID0gc3JjICsgbGVuOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoKnNyYyA9PSAnQCcpCi0gICAgewotICAgICAgc3JjKys7Ci0gICAgICBpZiAoKnNyYyA9PSAnQCcpCi0JewotCSAgc3JjKys7Ci0JICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJm9wLT5leHApOwotCi0JICBzcmMgPSBza2lwX2NvbG9udGhpbmcgKHNyYywgJm9wLT5leHAsICZvcC0+bW9kZSk7Ci0KLQkgICpwdHIgPSBzcmM7Ci0KLQkgIG9wLT5tb2RlID0gTUVNSU5EOwotCSAgcmV0dXJuOwotCi0JfQotCi0KLSAgICAgIGlmICgqc3JjID09ICctJykKLQl7Ci0JICBzcmMrKzsKLQkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm51bSwgZGlyZWN0aW9uKTsKLQkgIGlmIChsZW4gPT0gMCkKLQkgICAgewotCSAgICAgIC8qIE9vcHMsIG5vdCBhIHJlZyBhZnRlciBhbGwsIG11c3QgYmUgb3JkaW5hcnkgZXhwICovCi0JICAgICAgc3JjLS07Ci0JICAgICAgLyogbXVzdCBiZSBhIHN5bWJvbCAqLwotCSAgICAgIG9wLT5tb2RlID0gQUJTIHwgUFNJWkUgfCBkaXJlY3Rpb247Ci0JICAgICAgKnB0ciA9IHNraXBfY29sb250aGluZyAocGFyc2VfZXhwIChzcmMsICZvcC0+ZXhwKSwKLQkJCQkgICAgICAmb3AtPmV4cCwgJm9wLT5tb2RlKTsKLQotCSAgICAgIHJldHVybjsKLQotCi0JICAgIH0KLQotCi0JICBpZiAoKG1vZGUgJiBTSVpFKSAhPSBQU0laRSkKLQkgICAgYXNfYmFkIChfKCJXcm9uZyBzaXplIHBvaW50ZXIgcmVnaXN0ZXIgZm9yIGFyY2hpdGVjdHVyZS4iKSk7Ci0JICBvcC0+bW9kZSA9IFJEREVDOwotCSAgb3AtPnJlZyA9IG51bTsKLQkgICpwdHIgPSBzcmMgKyBsZW47Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKCpzcmMgPT0gJygnKQotCXsKLQkgIC8qIERpc3AgKi8KLQkgIHNyYysrOwotCi0JICAvKiBTdGFydCBvZmYgYXNzdW1pbmcgYSAxNiBiaXQgb2Zmc2V0ICovCi0KLQotCSAgc3JjID0gcGFyc2VfZXhwIChzcmMsICZvcC0+ZXhwKTsKLQotCSAgc3JjID0gY29sb25tb2QyNCAob3AsIHNyYyk7Ci0KLQkgIGlmICgqc3JjID09ICcpJykKLQkgICAgewotCSAgICAgIHNyYysrOwotCSAgICAgIG9wLT5tb2RlIHw9IEFCUyB8IGRpcmVjdGlvbjsKLQkgICAgICAqcHRyID0gc3JjOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpZiAoKnNyYyAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIEAoZXhwLCByZWcxNikiKSk7Ci0JICAgICAgcmV0dXJuOwotCi0JICAgIH0KLQkgIHNyYysrOwotCi0JICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICZvcC0+cmVnLCBkaXJlY3Rpb24pOwotCSAgaWYgKGxlbiA9PSAwIHx8ICEobW9kZSAmIFJFRykpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIEAoZXhwLCByZWcxNikiKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBvcC0+bW9kZSB8PSBESVNQIHwgZGlyZWN0aW9uOwotCSAgZGlzcHJlZyA9IG9wLT5yZWc7Ci0JICBzcmMgKz0gbGVuOwotCSAgc3JjID0gc2tpcF9jb2xvbnRoaW5nIChzcmMsICZvcC0+ZXhwLCAmb3AtPm1vZGUpOwotCi0JICBpZiAoKnNyYyAhPSAnKScgJiYgJygnKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBAKGV4cCwgcmVnMTYpIikpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgKnB0ciA9IHNyYyArIDE7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICZudW0sIGRpcmVjdGlvbik7Ci0KLSAgICAgIGlmIChsZW4pCi0JewotCSAgc3JjICs9IGxlbjsKLQkgIGlmICgqc3JjID09ICcrJykKLQkgICAgewotCSAgICAgIHNyYysrOwotCSAgICAgIGlmICgobW9kZSAmIFNJWkUpICE9IFBTSVpFKQotCQlhc19iYWQgKF8oIldyb25nIHNpemUgcG9pbnRlciByZWdpc3RlciBmb3IgYXJjaGl0ZWN0dXJlLiIpKTsKLQkgICAgICBvcC0+bW9kZSA9IFJTSU5DOwotCSAgICAgIG9wLT5yZWcgPSBudW07Ci0JICAgICAgKnB0ciA9IHNyYzsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGlmICgobW9kZSAmIFNJWkUpICE9IFBTSVpFKQotCSAgICBhc19iYWQgKF8oIldyb25nIHNpemUgcG9pbnRlciByZWdpc3RlciBmb3IgYXJjaGl0ZWN0dXJlLiIpKTsKLQotCSAgb3AtPm1vZGUgPSBkaXJlY3Rpb24gfCBJTkQgfCBQU0laRTsKLQkgIG9wLT5yZWcgPSBudW07Ci0JICAqcHRyID0gc3JjOwotCi0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIG11c3QgYmUgYSBzeW1ib2wgKi8KLQotCSAgb3AtPm1vZGUgPSBBQlMgfCBkaXJlY3Rpb247Ci0JICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJm9wLT5leHApOwotCi0JICAqcHRyID0gY29sb25tb2QyNCAob3AsIHNyYyk7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0KLSAgaWYgKCpzcmMgPT0gJyMnKQotICAgIHsKLSAgICAgIHNyYysrOwotICAgICAgb3AtPm1vZGUgPSBJTU07Ci0gICAgICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJm9wLT5leHApOwotICAgICAgKnB0ciA9IHNraXBfY29sb250aGluZyAoc3JjLCAmb3AtPmV4cCwgJm9wLT5tb2RlKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoc3JjLCAibWFjaCIsIDQpID09IDAKLQkgICB8fCBzdHJuY21wIChzcmMsICJtYWNsIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBvcC0+cmVnID0gc3JjWzNdID09ICdsJzsKLSAgICAgIG9wLT5tb2RlID0gTUFDUkVHOwotICAgICAgKnB0ciA9IHNyYyArIDQ7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3JjID0gcGFyc2VfZXhwIChzcmMsICZvcC0+ZXhwKTsKLSAgICAgIC8qIFRyYWlsaW5nICc6JyBzaXplID8gKi8KLSAgICAgIGlmICgqc3JjID09ICc6JykKLQl7Ci0JICBpZiAoc3JjWzFdID09ICcxJyAmJiBzcmNbMl0gPT0gJzYnKQotCSAgICB7Ci0JICAgICAgb3AtPm1vZGUgPSBQQ1JFTCB8IExfMTY7Ci0JICAgICAgc3JjICs9IDM7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNyY1sxXSA9PSAnOCcpCi0JICAgIHsKLQkgICAgICBvcC0+bW9kZSA9IFBDUkVMIHwgTF84OwotCSAgICAgIHNyYyArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdCA6OCBvciA6MTYgaGVyZSIpKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvcC0+bW9kZSA9IFBDUkVMIHwgYnNpemU7Ci0JfQotICAgICAgKnB0ciA9IHNyYzsKLSAgICB9Ci19Ci0KLQotc3RhdGljCi1jaGFyICoKLWdldF9vcGVyYW5kcyAobm9wZXJhbmRzLCBvcF9lbmQsIG9wZXJhbmQpCi0gICAgIHVuc2lnbmVkIGludCBub3BlcmFuZHM7Ci0gICAgIGNoYXIgKm9wX2VuZDsKLSAgICAgc3RydWN0IGg4X29wICpvcGVyYW5kOwotewotICBjaGFyICpwdHIgPSBvcF9lbmQ7Ci0KLSAgc3dpdGNoIChub3BlcmFuZHMpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIG9wZXJhbmRbMF0ubW9kZSA9IDA7Ci0gICAgICBvcGVyYW5kWzFdLm1vZGUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICBwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCwgU1JDKTsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLQl7Ci0JICBwdHIrKzsKLQkgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMSwgMSwgRFNUKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3BlcmFuZFsxXS5tb2RlID0gMDsKLQl9Ci0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwLCBTUkMpOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxLCBEU1QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0KLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogUGFzc2VkIGEgcG9pbnRlciB0byBhIGxpc3Qgb2Ygb3Bjb2RlcyB3aGljaCB1c2UgZGlmZmVyZW50Ci0gICBhZGRyZXNzaW5nIG1vZGVzLCByZXR1cm4gdGhlIG9wY29kZSB3aGljaCBtYXRjaGVzIHRoZSBvcGNvZGVzCi0gICBwcm92aWRlZAotICAgKi8KLXN0YXRpYwotc3RydWN0IGg4X29wY29kZSAqCi1nZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZHMsIHNpemUpCi0gICAgIHN0cnVjdCBoOF9vcGNvZGUgKm9wY29kZTsKLSAgICAgc3RydWN0IGg4X29wICpvcGVyYW5kczsKLSAgICAgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBoOF9vcGNvZGUgKnRoaXNfdHJ5ID0gb3Bjb2RlOwotICBpbnQgZm91bmQgPSAwOwotCi0gIHVuc2lnbmVkIGludCB0aGlzX2luZGV4ID0gb3Bjb2RlLT5pZHg7Ci0KLSAgLyogVGhlcmUncyBvbmx5IG9uZSBsZG0vc3RtIGFuZCBpdCdzIGVhc2llciB0byBqdXN0Ci0gICAgIGdldCBvdXQgcXVpY2sgZm9yIHRoZW0uICAqLwotICBpZiAoc3RyY21wIChvcGNvZGUtPm5hbWUsICJzdG0ubCIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAob3Bjb2RlLT5uYW1lLCAibGRtLmwiKSA9PSAwKQotICAgIHJldHVybiB0aGlzX3RyeTsKLQotICB3aGlsZSAodGhpc19pbmRleCA9PSBvcGNvZGUtPmlkeCAmJiAhZm91bmQpCi0gICAgewotICAgICAgZm91bmQgPSAxOwotCi0gICAgICB0aGlzX3RyeSA9IG9wY29kZSsrOwotICAgICAgaWYgKHRoaXNfdHJ5LT5ub3BlcmFuZHMgPT0gMCkKLQl7Ci0JICBpbnQgdGhpc19zaXplOwotCi0JICB0aGlzX3NpemUgPSB0aGlzX3RyeS0+aG93ICYgU047Ci0JICBpZiAodGhpc19zaXplICE9IHNpemUgJiYgKHRoaXNfc2l6ZSAhPSBTQiB8fCBzaXplICE9IFNOKSkKLQkgICAgZm91bmQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgZm9yIChpID0gMDsgaSA8IHRoaXNfdHJ5LT5ub3BlcmFuZHMgJiYgZm91bmQ7IGkrKykKLQkgICAgewotCSAgICAgIG9wX3R5cGUgb3AgPSB0aGlzX3RyeS0+YXJncy5uaWJbaV07Ci0JICAgICAgaW50IHggPSBvcGVyYW5kc1tpXS5tb2RlOwotCi0JICAgICAgaWYgKChvcCAmIChESVNQIHwgUkVHKSkgPT0gKERJU1AgfCBSRUcpCi0JCSAgJiYgKCh4ICYgKERJU1AgfCBSRUcpKSA9PSAoRElTUCB8IFJFRykpKQotCQl7Ci0JCSAgZGlzcHJlZyA9IG9wZXJhbmRzW2ldLnJlZzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wICYgUkVHKQotCQl7Ci0JCSAgaWYgKCEoeCAmIFJFRykpCi0JCSAgICBmb3VuZCA9IDA7Ci0KLQkJICBpZiAoeCAmIExfUCkKLQkJICAgIHggPSAoeCAmIH5MX1ApIHwgKEhtb2RlID8gTF8zMiA6IExfMTYpOwotCQkgIGlmIChvcCAmIExfUCkKLQkJICAgIG9wID0gKG9wICYgfkxfUCkgfCAoSG1vZGUgPyBMXzMyIDogTF8xNik7Ci0KLQkJICBvcHNpemUgPSBvcCAmIFNJWkU7Ci0KLQkJICAvKiBUaGUgc2l6ZSBvZiB0aGUgcmVnIGlzIHYgaW1wb3J0YW50ICovCi0JCSAgaWYgKChvcCAmIFNJWkUpICE9ICh4ICYgU0laRSkpCi0JCSAgICBmb3VuZCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3AgJiBBQlNKTVApICYmICh4ICYgQUJTKSkKLQkJewotCQkgIG9wZXJhbmRzW2ldLm1vZGUgJj0gfkFCUzsKLQkJICBvcGVyYW5kc1tpXS5tb2RlIHw9IEFCU0pNUDsKLQkJICAvKiBCdXQgaXQgbWF5IG5vdCBiZSAyNCBiaXRzIGxvbmcgKi8KLQkJICBpZiAoIUhtb2RlKQotCQkgICAgewotCQkgICAgICBvcGVyYW5kc1tpXS5tb2RlICY9IH5TSVpFOwotCQkgICAgICBvcGVyYW5kc1tpXS5tb2RlIHw9IExfMTY7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3AgJiAoS0JJVCB8IERCSVQpKSAmJiAoeCAmIElNTSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIG9rIGlmIHRoZSBpbW1lZGlhdGUgdmFsdWUgaXMgc2Vuc2libGUgKi8KLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wICYgUENSRUwpCi0JCXsKLQkJICAvKiBUaGUgc2l6ZSBvZiB0aGUgZGlzcGxhY2VtZW50IGlzIGltcG9ydGFudCAqLwotCQkgIGlmICgob3AgJiBTSVpFKSAhPSAoeCAmIFNJWkUpKQotCQkgICAgZm91bmQgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wICYgKERJU1AgfCBJTU0gfCBBQlMpKQotCQkgICAgICAgJiYgKG9wICYgKERJU1AgfCBJTU0gfCBBQlMpKSA9PSAoeCAmIChESVNQIHwgSU1NIHwgQUJTKSkpCi0JCXsKLQkJICAvKiBQcm9tb3RlIGEgTF8yNCB0byBMXzMyIGlmIGl0IG1ha2VzIHVzIG1hdGNoLiAgKi8KLQkJICBpZiAoKHggJiBMXzI0KSAmJiAob3AgJiBMXzMyKSkKLQkJICAgIHsKLQkJICAgICAgeCAmPSB+TF8yNDsKLQkJICAgICAgeCB8PSBMXzMyOwotCQkgICAgfQotCQkgIC8qIFByb21vdGUgYW4gTDggdG8gTF8xNiBpZiBpdCBtYWtlcyB1cyBtYXRjaC4gICovCi0JCSAgaWYgKG9wICYgQUJTICYmIG9wICYgTF84ICYmIG9wICYgRElTUCkgCi0JCSAgICB7Ci0JCSAgICAgIGlmICh4ICYgTF8xNikKLQkJCWZvdW5kPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCh4ICYgU0laRSkgIT0gMAotCQkJICAgJiYgKChvcCAmIFNJWkUpICE9ICh4ICYgU0laRSkpKQotCQkgICAgZm91bmQgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wICYgTUFDUkVHKSAhPSAoeCAmIE1BQ1JFRykpCi0JCXsKLQkJICBmb3VuZCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3AgJiBNT0RFKSAhPSAoeCAmIE1PREUpKQotCQl7Ci0JCSAgZm91bmQgPSAwOwotCQl9CQotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKGZvdW5kKQotICAgIHJldHVybiB0aGlzX3RyeTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotY2hlY2tfb3BlcmFuZCAob3BlcmFuZCwgd2lkdGgsIHN0cmluZykKLSAgICAgc3RydWN0IGg4X29wICpvcGVyYW5kOwotICAgICB1bnNpZ25lZCBpbnQgd2lkdGg7Ci0gICAgIGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKG9wZXJhbmQtPmV4cC5YX2FkZF9zeW1ib2wgPT0gMAotICAgICAgJiYgb3BlcmFuZC0+ZXhwLlhfb3Bfc3ltYm9sID09IDApCi0gICAgewotCi0gICAgICAvKiBObyBzeW1ib2wgaW52b2x2ZWQsIGxldCdzIGxvb2sgYXQgb2Zmc2V0LCBpdCdzIGRhbmdlcm91cyBpZiBhbnkgb2YKLQkgdGhlIGhpZ2ggYml0cyBhcmUgbm90IDAgb3IgZmYncywgZmluZCBvdXQgYnkgb3Jpbmcgb3IgYW5kaW5nIHdpdGgKLQkgdGhlIHdpZHRoIGFuZCBzZWVpbmcgaWYgdGhlIGFuc3dlciBpcyAwIG9yIGFsbCBmcyovCi0gICAgICAKLSAgICAgIGlmICgob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciAmIH53aWR0aCkgIT0gMCAmJgotCSAgKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgfCB3aWR0aCkgIT0gKH4wKSkKLQl7Ci0JICBpZiAod2lkdGggPT0gMjU1IAotCSAgICAgICYmIChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyICYgMHhmZjAwKSA9PSAweGZmMDApCi0JICAgIHsKLQkgICAgICAvKiBKdXN0IGlnbm9yZSB0aGlzIG9uZSAtIHdoaWNoIGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8KLQkJIGZpdCBhIDE2IGJpdCBhZGRyZXNzIHRydW5jYXRlZCBpbnRvIGFuIDggYml0IGFkZHJlc3MKLQkJIG9mIHNvbWV0aGluZyBsaWtlIGJzZXQuICAqLwotCSAgICB9Ci0JICBlbHNlIAotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygib3BlcmFuZCAlczB4JWx4IG91dCBvZiByYW5nZS4iKSwgc3RyaW5nLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIpOwotCSAgICB9Ci0JfQotICAgIH0KLQotfQotCi0vKiBSRUxBWE1PREUgaGFzIG9uZSBvZiAzIHZhbHVlczoKLQotICAgMCBPdXRwdXQgYSAibm9ybWFsIiByZWxvYywgbm8gcmVsYXhpbmcgcG9zc2libGUgZm9yIHRoaXMgaW5zbi9yZWxvYwotCi0gICAxIE91dHB1dCBhIHJlbGF4YWJsZSAyNGJpdCBhYnNvbHV0ZSBtb3YudyBhZGRyZXNzIHJlbG9jYXRpb24KLSAgICAgKG1heSByZWxheCBpbnRvIGEgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcykuCi0KLSAgIDIgT3V0cHV0IGEgcmVsYXhhYmxlIDE2LzI0IGFic29sdXRlIG1vdi5iIGFkZHJlc3MgcmVsb2NhdGlvbgotICAgICAobWF5IHJlbGF4IGludG8gYW4gOGJpdCBhYnNvbHV0ZSBhZGRyZXNzKS4gICovCi0KLXN0YXRpYyB2b2lkCi1kb19hX2ZpeF9pbW0gKG9mZnNldCwgb3BlcmFuZCwgcmVsYXhtb2RlKQotICAgICBpbnQgb2Zmc2V0OwotICAgICBzdHJ1Y3QgaDhfb3AgKm9wZXJhbmQ7Ci0gICAgIGludCByZWxheG1vZGU7Ci17Ci0gIGludCBpZHg7Ci0gIGludCBzaXplOwotICBpbnQgd2hlcmU7Ci0KLQotICBjaGFyICp0ID0gb3BlcmFuZC0+bW9kZSAmIElNTSA/ICIjIiA6ICJAIjsKLQotICBpZiAob3BlcmFuZC0+ZXhwLlhfYWRkX3N5bWJvbCA9PSAwKQotICAgIHsKLSAgICAgIGNoYXIgKmJ5dGVzID0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQ7Ci0gICAgICBzd2l0Y2ggKG9wZXJhbmQtPm1vZGUgJiBTSVpFKQotCXsKLQljYXNlIExfMjoKLQkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQsIDB4MywgdCk7Ci0JICBieXRlc1swXSB8PSAob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcikgPDwgNDsKLQkgIGJyZWFrOwotCWNhc2UgTF8zOgotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCwgMHg3LCB0KTsKLQkgIGJ5dGVzWzBdIHw9IChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyKSA8PCA0OwotCSAgYnJlYWs7Ci0JY2FzZSBMXzg6Ci0JICBjaGVja19vcGVyYW5kIChvcGVyYW5kLCAweGZmLCB0KTsKLQkgIGJ5dGVzWzBdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcjsKLQkgIGJyZWFrOwotCWNhc2UgTF8xNjoKLQkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQsIDB4ZmZmZiwgdCk7Ci0JICBieXRlc1swXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gODsKLQkgIGJ5dGVzWzFdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiAwOwotCSAgYnJlYWs7Ci0JY2FzZSBMXzI0OgotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCwgMHhmZmZmZmYsIHQpOwotCSAgYnl0ZXNbMF0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDE2OwotCSAgYnl0ZXNbMV0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDg7Ci0JICBieXRlc1syXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBMXzMyOgotCSAgLyogVGhpcyBzaG91bGQgYmUgZG9uZSB3aXRoIGJmZCAqLwotCSAgYnl0ZXNbMF0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDI0OwotCSAgYnl0ZXNbMV0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDE2OwotCSAgYnl0ZXNbMl0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDg7Ci0JICBieXRlc1szXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gMDsKLQkgIGJyZWFrOwotCX0KLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAob3BlcmFuZC0+bW9kZSAmIFNJWkUpCi0JewotCi0JY2FzZSBMXzI0OgotCWNhc2UgTF8zMjoKLQkgIHNpemUgPSA0OwotCSAgd2hlcmUgPSAob3BlcmFuZC0+bW9kZSAmIFNJWkUpID09IExfMjQgPyAtMSA6IDA7Ci0JICBpZiAocmVsYXhtb2RlID09IDIpCi0JICAgIGlkeCA9IFJfTU9WMjRCMTsKLQkgIGVsc2UgaWYgKHJlbGF4bW9kZSA9PSAxKQotCSAgICBpZHggPSBSX01PVkwxOwotCSAgZWxzZQotCSAgICBpZHggPSBSX1JFTExPTkc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfYmFkKF8oIkNhbid0IHdvcmsgb3V0IHNpemUgb2Ygb3BlcmFuZC5cbiIpKTsKLQljYXNlIExfMTY6Ci0JICBzaXplID0gMjsKLQkgIHdoZXJlID0gMDsKLQkgIGlmIChyZWxheG1vZGUgPT0gMikKLQkgICAgaWR4ID0gUl9NT1YxNkIxOwotCSAgZWxzZQotCSAgICBpZHggPSBSX1JFTFdPUkQ7Ci0JICBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID0gKHNob3J0KW9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXI7Ci0JICBicmVhazsKLQljYXNlIExfODoKLQkgIHNpemUgPSAxOwotCSAgd2hlcmUgPSAwOwotCSAgaWR4ID0gUl9SRUxCWVRFOwotCSAgLyogVGhpcyB1c2VkIHRvIHVzZSBhIGNhc3QgdG8gY2hhciwgYnV0IHRoYXQgZmFpbHMgaWYgY2hhciBpcyBhbgotCSAgICAgdW5zaWduZWQgdHlwZS4gIFdlIGNhbid0IHVzZSBgc2lnbmVkIGNoYXInLCBhcyB0aGF0IGlzbid0IHZhbGlkCi0JICAgICBLJlIgQy4gICovCi0JICBpZiAob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciAmIDB4ODApCi0JICAgIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgfD0gKChvZmZzZXRUKSAtMSA8PCA4KTsKLQkgIGVsc2UKLQkgICAgb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciAmPSAweGZmOwotCX0KLQotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICBvZmZzZXQgKyB3aGVyZSwKLQkJICAgc2l6ZSwKLQkJICAgJm9wZXJhbmQtPmV4cCwKLQkJICAgMCwKLQkJICAgaWR4KTsKLSAgICB9Ci0KLX0KLQotLyogTm93IHdlIGtub3cgd2hhdCBzb3J0IG9mIG9wY29kZXMgaXQgaXMsIGxldHMgYnVpbGQgdGhlIGJ5dGVzIC0KLSAqLwotc3RhdGljIHZvaWQKLWJ1aWxkX2J5dGVzICh0aGlzX3RyeSwgb3BlcmFuZCkKLSAgICAgc3RydWN0IGg4X29wY29kZSAqdGhpc190cnk7Ci0gICAgIHN0cnVjdCBoOF9vcCAqb3BlcmFuZDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgY2hhciAqb3V0cHV0ID0gZnJhZ19tb3JlICh0aGlzX3RyeS0+bGVuZ3RoKTsKLSAgb3BfdHlwZSAqbmliYmxlX3B0ciA9IHRoaXNfdHJ5LT5kYXRhLm5pYjsKLSAgb3BfdHlwZSBjOwotICB1bnNpZ25lZCBpbnQgbmliYmxlX2NvdW50ID0gMDsKLSAgaW50IGFic2F0OwotICBpbnQgaW1tYXQ7Ci0gIGludCBuaWI7Ci0gIGludCBtb3ZiID0gMDsKLSAgY2hhciBhc25pYmJsZXNbMzBdOwotICBjaGFyICpwID0gYXNuaWJibGVzOwotCi0gIGlmICghKHRoaXNfdHJ5LT5pbmJhc2UgfHwgSG1vZGUpKQotICAgIGFzX3dhcm4gKF8oIk9wY29kZSBgJXMnIHdpdGggdGhlc2Ugb3BlcmFuZCB0eXBlcyBub3QgYXZhaWxhYmxlIGluIEg4LzMwMCBtb2RlIiksCi0JICAgICB0aGlzX3RyeS0+bmFtZSk7Ci0KLSAgd2hpbGUgKCpuaWJibGVfcHRyICE9IEUpCi0gICAgewotICAgICAgaW50IGQ7Ci0gICAgICBjID0gKm5pYmJsZV9wdHIrKzsKLQotICAgICAgZCA9IChjICYgKERTVCB8IFNSQ19JTl9EU1QpKSAhPSAwOwotCi0gICAgICBpZiAoYyA8IDE2KQotCXsKLQkgIG5pYiA9IGM7Ci0JfQotICAgICAgZWxzZQotCXsKLQotCSAgaWYgKGMgJiAoUkVHIHwgSU5EIHwgSU5DIHwgREVDKSkKLQkgICAgewotCSAgICAgIG5pYiA9IG9wZXJhbmRbZF0ucmVnOwotCSAgICB9Ci0JICBlbHNlIGlmICgoYyAmIERJU1BSRUcpID09IChESVNQUkVHKSkKLQkgICAgewotCSAgICAgIG5pYiA9IGRpc3ByZWc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGMgJiAgQUJTICkKLQkgICAgewotCSAgICAgIG9wZXJhbmRbZF0ubW9kZSA9IGM7Ci0JICAgICAgYWJzYXQgPSBuaWJibGVfY291bnQgLyAyOwotCSAgICAgIG5pYiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGMgJiAoSU1NIHwgUENSRUwgfCBBQlMgfCBBQlNKTVAgfCBESVNQKSkKLQkgICAgewotCSAgICAgIG9wZXJhbmRbZF0ubW9kZSA9IGM7Ci0JICAgICAgaW1tYXQgPSBuaWJibGVfY291bnQgLyAyOwotCSAgICAgIG5pYiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGMgJiBJR05PUkUpCi0JICAgIHsKLQkgICAgICBuaWIgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChjICYgREJJVCkKLQkgICAgewotCSAgICAgIHN3aXRjaCAob3BlcmFuZFswXS5leHAuWF9hZGRfbnVtYmVyKQotCQl7Ci0JCWNhc2UgMToKLQkJICBuaWIgPSBjOwotCQkgIGJyZWFrOwotCQljYXNlIDI6Ci0JCSAgbmliID0gMHg4IHwgYzsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhc19iYWQgKF8oIk5lZWQgIzEgb3IgIzIgaGVyZSIpKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChjICYgS0JJVCkKLQkgICAgewotCSAgICAgIHN3aXRjaCAob3BlcmFuZFswXS5leHAuWF9hZGRfbnVtYmVyKQotCQl7Ci0JCWNhc2UgMToKLQkJICBuaWIgPSAwOwotCQkgIGJyZWFrOwotCQljYXNlIDI6Ci0JCSAgbmliID0gODsKLQkJICBicmVhazsKLQkJY2FzZSA0OgotCQkgIGlmICghSG1vZGUpCi0JCSAgICBhc193YXJuIChfKCIjNCBub3QgdmFsaWQgb24gSDgvMzAwLiIpKTsKLQkJICBuaWIgPSA5OwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYXNfYmFkIChfKCJOZWVkICMxIG9yICMyIGhlcmUiKSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAvKiBzdG9wIGl0IG1ha2luZyBhIGZpeCAqLwotCSAgICAgIG9wZXJhbmRbMF0ubW9kZSA9IDA7Ci0JICAgIH0KLQotCSAgaWYgKGMgJiBNRU1SRUxBWCkKLQkgICAgewotCSAgICAgIG9wZXJhbmRbZF0ubW9kZSB8PSBNRU1SRUxBWDsKLQkgICAgfQotCi0JICBpZiAoYyAmIEIzMSkKLQkgICAgewotCSAgICAgIG5pYiB8PSAweDg7Ci0JICAgIH0KLQotCSAgaWYgKGMgJiBNQUNSRUcpCi0JICAgIHsKLQkgICAgICBuaWIgPSAyICsgb3BlcmFuZFtkXS5yZWc7Ci0JICAgIH0KLQl9Ci0gICAgICBuaWJibGVfY291bnQrKzsKLQotICAgICAgKnArKyA9IG5pYjsKLSAgICB9Ci0KLSAgLyogRGlzZ3VzdGluZy4gIFdoeSwgb2ggd2h5IGRpZG4ndCBzb21lb25lIGFzayB1cyBmb3IgYWR2aWNlCi0gICAgIG9uIHRoZSBhc3NlbWJsZXIgZm9ybWF0LiAgKi8KLSAgaWYgKHN0cmNtcCAodGhpc190cnktPm5hbWUsICJzdG0ubCIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAodGhpc190cnktPm5hbWUsICJsZG0ubCIpID09IDApCi0gICAgewotICAgICAgaW50IGhpZ2gsIGxvdzsKLSAgICAgIGhpZ2ggPSAob3BlcmFuZFt0aGlzX3RyeS0+bmFtZVswXSA9PSAnbCcgPyAxIDogMF0ucmVnID4+IDgpICYgMHhmOwotICAgICAgbG93ID0gb3BlcmFuZFt0aGlzX3RyeS0+bmFtZVswXSA9PSAnbCcgPyAxIDogMF0ucmVnICYgMHhmOwotCi0gICAgICBhc25pYmJsZXNbMl0gPSBoaWdoIC0gbG93OwotICAgICAgYXNuaWJibGVzWzddID0gKHRoaXNfdHJ5LT5uYW1lWzBdID09ICdsJykgPyBoaWdoIDogbG93OwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgdGhpc190cnktPmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIG91dHB1dFtpXSA9IChhc25pYmJsZXNbaSAqIDJdIDw8IDQpIHwgYXNuaWJibGVzW2kgKiAyICsgMV07Ci0gICAgfQotCi0gIC8qIE5vdGUgaWYgdGhpcyBpcyBhIG1vdmIgaW5zdHJ1Y3Rpb24gLS0gdGhlcmUncyBhIHNwZWNpYWwgcmVsYXhhdGlvbgotICAgICB3aGljaCBvbmx5IGFwcGxpZXMgdG8gdGhlbS4gICovCi0gIGlmIChzdHJjbXAgKHRoaXNfdHJ5LT5uYW1lLCAibW92LmIiKSA9PSAwKQotICAgIG1vdmIgPSAxOwotCi0gIC8qIG91dHB1dCBhbnkgZml4ZXMgKi8KLSAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgeCA9IG9wZXJhbmRbaV0ubW9kZTsKLQotICAgICAgaWYgKHggJiAoSU1NIHwgRElTUCkpCi0JewotCSAgZG9fYV9maXhfaW1tIChvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIGltbWF0LAotCQkJb3BlcmFuZCArIGksIHggJiBNRU1SRUxBWCAhPSAwKTsKLQl9Ci0gICAgICBlbHNlIGlmICh4ICYgQUJTKQotCXsKLQkgIGRvX2FfZml4X2ltbSAob3V0cHV0IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBhYnNhdCwKLQkJCW9wZXJhbmQgKyBpLCB4ICYgTUVNUkVMQVggPyBtb3ZiICsgMSA6IDApOwotCX0KLSAgICAgIGVsc2UgaWYgKHggJiBQQ1JFTCkKLQl7Ci0JICBpbnQgc2l6ZTE2ID0geCAmIExfMTY7Ci0JICBpbnQgd2hlcmUgPSBzaXplMTYgPyAyIDogMTsKLQkgIGludCBzaXplID0gc2l6ZTE2ID8gMiA6IDE7Ci0JICBpbnQgdHlwZSA9IHNpemUxNiA/IFJfUENSV09SRCA6IFJfUENSQllURTsKLQotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCArIGksIHNpemUxNiA/IDB4N2ZmZiA6IDB4N2YsICJAIik7Ci0KLQkgIGlmIChvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgJiAxKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiYnJhbmNoIG9wZXJhbmQgaGFzIG9kZCBvZmZzZXQgKCVseClcbiIpLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIpOwotCSAgICB9Ci0KLQkgIG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciAtPSAxOwotCSAgLyogVGhpcyB1c2VkIHRvIHVzZSBhIGNhc3QgdG8gY2hhciwgYnV0IHRoYXQgZmFpbHMgaWYgY2hhciBpcyBhbgotCSAgICAgdW5zaWduZWQgdHlwZS4gIFdlIGNhbid0IHVzZSBgc2lnbmVkIGNoYXInLCBhcyB0aGF0IGlzbid0IHZhbGlkCi0JICAgICBLJlIgQy4gICovCi0JICBpZiAob3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyICYgMHg4MCkKLQkgICAgb3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyIHw9ICgob2Zmc2V0VCkgLTEgPDwgOCk7Ci0JICBlbHNlCi0JICAgIG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciAmPSAweGZmOwotCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICBvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIHdoZXJlLAotCQkgICAgICAgc2l6ZSwKLQkJICAgICAgICZvcGVyYW5kW2ldLmV4cCwKLQkJICAgICAgIDEsCi0JCSAgICAgICB0eXBlKTsKLQl9Ci0gICAgICBlbHNlIGlmICh4ICYgTUVNSU5EKQotCXsKLQotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCArIGksIDB4ZmYsICJAQCIpOwotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgb3V0cHV0IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyAxLAotCQkgICAgICAgMSwKLQkJICAgICAgICZvcGVyYW5kW2ldLmV4cCwKLQkJICAgICAgIDAsCi0JCSAgICAgICBSX01FTV9JTkRJUkVDVCk7Ci0JfQotICAgICAgZWxzZSBpZiAoeCAmIEFCU0pNUCkKLQl7Ci0JICAvKiBUaGlzIGptcCBtYXkgYmUgYSBqdW1wIG9yIGEgYnJhbmNoICovCi0KLQkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQgKyBpLCBIbW9kZSA/IDB4ZmZmZmZmIDogMHhmZmZmLCAiQCIpOwotCSAgaWYgKG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciAmIDEpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJicmFuY2ggb3BlcmFuZCBoYXMgb2RkIG9mZnNldCAoJWx4KVxuIiksCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcik7Ci0JICAgIH0KLQkgIGlmICghSG1vZGUpCi0JICAgIG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciA9IChzaG9ydCkgb3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyOwotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgb3V0cHV0IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCSAgICAgICA0LAotCQkgICAgICAgJm9wZXJhbmRbaV0uZXhwLAotCQkgICAgICAgMCwKLQkJICAgICAgIFJfSk1QTDEpOwotCX0KLSAgICB9Ci0KLX0KLQotLyoKLSAgdHJ5IGFuZCBnaXZlIGFuIGludGVsbGlnZW50IGVycm9yIG1lc3NhZ2UgZm9yIGNvbW1vbiBhbmQgc2ltcGxlIHRvCi0gIGRldGVjdCBlcnJvcnMKLSAgKi8KLQotc3RhdGljIHZvaWQKLWNsZXZlcl9tZXNzYWdlIChvcGNvZGUsIG9wZXJhbmQpCi0gICAgIHN0cnVjdCBoOF9vcGNvZGUgKm9wY29kZTsKLSAgICAgc3RydWN0IGg4X29wICpvcGVyYW5kOwotewotICAvKiBGaW5kIG91dCBpZiB0aGVyZSB3YXMgbW9yZSB0aGFuIG9uZSBwb3NzaWJsZSBvcGNjb2RlICovCi0KLSAgaWYgKChvcGNvZGUgKyAxKS0+aWR4ICE9IG9wY29kZS0+aWR4KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBhcmduOwotCi0gICAgICAvKiBPbmx5IG9uZSBvcGNvZGUgb2YgdGhpcyBmbGF2b3VyLCB0cnkgYW5kIGd1ZXNzIHdoaWNoIG9wZXJhbmQKLSAgICAgICAgIGRpZG4ndCBtYXRjaCAqLwotICAgICAgZm9yIChhcmduID0gMDsgYXJnbiA8IG9wY29kZS0+bm9wZXJhbmRzOyBhcmduKyspCi0JewotCSAgc3dpdGNoIChvcGNvZGUtPmFyZ3MubmliW2FyZ25dKQotCSAgICB7Ci0JICAgIGNhc2UgUkQxNjoKLQkgICAgICBpZiAob3BlcmFuZFthcmduXS5tb2RlICE9IFJEMTYpCi0JCXsKLQkJICBhc19iYWQgKF8oImRlc3RpbmF0aW9uIG9wZXJhbmQgbXVzdCBiZSAxNiBiaXQgcmVnaXN0ZXIiKSk7Ci0JCSAgcmV0dXJuOwotCi0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJTODoKLQotCSAgICAgIGlmIChvcGVyYW5kW2FyZ25dLm1vZGUgIT0gUlM4KQotCQl7Ci0JCSAgYXNfYmFkIChfKCJzb3VyY2Ugb3BlcmFuZCBtdXN0IGJlIDggYml0IHJlZ2lzdGVyIikpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQUJTMTZEU1Q6Ci0JICAgICAgaWYgKG9wZXJhbmRbYXJnbl0ubW9kZSAhPSBBQlMxNkRTVCkKLQkJewotCQkgIGFzX2JhZCAoXygiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDE2Yml0IGFic29sdXRlIGFkZHJlc3MiKSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkQ4OgotCSAgICAgIGlmIChvcGVyYW5kW2FyZ25dLm1vZGUgIT0gUkQ4KQotCQl7Ci0JCSAgYXNfYmFkIChfKCJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgOCBiaXQgcmVnaXN0ZXIiKSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQotCSAgICBjYXNlIEFCUzE2U1JDOgotCSAgICAgIGlmIChvcGVyYW5kW2FyZ25dLm1vZGUgIT0gQUJTMTZTUkMpCi0JCXsKLQkJICBhc19iYWQgKF8oInNvdXJjZSBvcGVyYW5kIG11c3QgYmUgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcyIpKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICB9Ci0JfQotICAgIH0KLSAgYXNfYmFkIChfKCJpbnZhbGlkIG9wZXJhbmRzIikpOwotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jaXRvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgotICAgKi8KLQotCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqb3Bfc3RhcnQ7Ci0gIGNoYXIgKm9wX2VuZDsKLSAgc3RydWN0IGg4X29wIG9wZXJhbmRbMl07Ci0gIHN0cnVjdCBoOF9vcGNvZGUgKm9wY29kZTsKLSAgc3RydWN0IGg4X29wY29kZSAqcHJldl9vcGNvZGU7Ci0KLSAgY2hhciAqZG90ID0gMDsKLSAgY2hhciBjOwotICBpbnQgc2l6ZTsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgLyogZmluZCB0aGUgb3AgY29kZSBlbmQgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9IHN0cjsKLSAgICAgICAqb3BfZW5kICE9IDAgJiYgKm9wX2VuZCAhPSAnICc7Ci0gICAgICAgb3BfZW5kKyspCi0gICAgewotICAgICAgaWYgKCpvcF9lbmQgPT0gJy4nKQotCXsKLQkgIGRvdCA9IG9wX2VuZCArIDE7Ci0JICAqb3BfZW5kID0gMDsKLQkgIG9wX2VuZCArPSAyOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICA7Ci0KLSAgaWYgKG9wX2VuZCA9PSBvcF9zdGFydCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICB9Ci0gIGMgPSAqb3BfZW5kOwotCi0gICpvcF9lbmQgPSAwOwotCi0gIG9wY29kZSA9IChzdHJ1Y3QgaDhfb3Bjb2RlICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwKLQkJCQkJICAgb3Bfc3RhcnQpOwotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBXZSB1c2UgdG8gc2V0IGlucHV0X2xpbmVfcG9pbnRlciB0byB0aGUgcmVzdWx0IG9mIGdldF9vcGVyYW5kcywKLSAgICAgYnV0IHRoYXQgaXMgd3JvbmcuICBPdXIgY2FsbGVyIGFzc3VtZXMgd2UgZG9uJ3QgY2hhbmdlIGl0LiAgKi8KLQotICAodm9pZCkgZ2V0X29wZXJhbmRzIChvcGNvZGUtPm5vcGVyYW5kcywgb3BfZW5kLCBvcGVyYW5kKTsKLSAgKm9wX2VuZCA9IGM7Ci0gIHByZXZfb3Bjb2RlID0gb3Bjb2RlOwotCi0gIHNpemUgPSBTTjsKLSAgaWYgKGRvdCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpkb3QpCi0JewotCWNhc2UgJ2InOgotCSAgc2l6ZSA9IFNCOwotCSAgYnJlYWs7Ci0KLQljYXNlICd3JzoKLQkgIHNpemUgPSBTVzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnbCc6Ci0JICBzaXplID0gU0w7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBvcGNvZGUgPSBnZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZCwgc2l6ZSk7Ci0KLSAgaWYgKG9wY29kZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIENvdWxkbid0IGZpbmQgYW4gb3Bjb2RlIHdoaWNoIG1hdGNoZWQgdGhlIG9wZXJhbmRzICovCi0gICAgICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMik7Ci0KLSAgICAgIHdoZXJlWzBdID0gMHgwOwotICAgICAgd2hlcmVbMV0gPSAweDA7Ci0gICAgICBjbGV2ZXJfbWVzc2FnZSAocHJldl9vcGNvZGUsIG9wZXJhbmQpOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAob3Bjb2RlLT5zaXplICYmIGRvdCkKLSAgICB7Ci0gICAgICBpZiAob3Bjb2RlLT5zaXplICE9ICpkb3QpCi0JewotCSAgYXNfd2FybiAoXygibWlzbWF0Y2ggYmV0d2VlbiBvcGNvZGUgc2l6ZSBhbmQgb3BlcmFuZCBzaXplIikpOwotCX0KLSAgICB9Ci0KLSAgYnVpbGRfYnl0ZXMgKG9wY29kZSwgb3BlcmFuZCk7Ci0KLX0KLQotdm9pZAotdGNfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnM7Ci17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19jcmF3bF9zeW1ib2xfY2hhaW4gXG4iKSk7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLXRjX2hlYWRlcnNfaG9vayAoaGVhZGVycykKLSAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzOwotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIikpOwotfQotCi0vKiBWYXJpb3VzIHJvdXRpbmVzIHRvIGtpbGwgb25lIGRheSAqLwotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAgICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotfQotDAotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKCkKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2FvdXRfZml4X3RvX2NoYXJzIFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIG1kX2NvbnZlcnRfZnJhZyBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVCAKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgc2l6ZSkKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICByZXR1cm4gKChzaXplICsgKDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkgLSAxKSAmICgtMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSk7Ci0KLX0KLQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0KLSAgc3dpdGNoIChmaXhQLT5meF9zaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAyNCk7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICBwcmludGYgKF8oImNhbGwgdG9tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFB1dCBudW1iZXIgaW50byB0YXJnZXQgYnl0ZSBvcmRlciAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgdXNlLCBuYnl0ZXMpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgdmFsdWVUIHVzZTsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Ci19Ci1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBhYm9ydCAoKTsKLX0KLQotCi12b2lkCi10Y19yZWxvY19tYW5nbGUgKGZpeF9wdHIsIGludHIsIGJhc2UpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKLSAgICAgYmZkX3ZtYSBiYXNlOwotCi17Ci0gIHN5bWJvbFMgKnN5bWJvbF9wdHI7Ci0KLSAgc3ltYm9sX3B0ciA9IGZpeF9wdHItPmZ4X2FkZHN5OwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyBhdHRhY2hlZCB0byBhIHN5bWJvbCB0aGVuIGl0J3Mgb2sKLSAgICAgdG8gb3V0cHV0IGl0ICovCi0gIGlmIChmaXhfcHRyLT5meF9yX3R5cGUgPT0gVENfQ09OU19SRUxPQykKLSAgICB7Ci0gICAgICAvKiBjb25zIGxpa2VzIHRvIGNyZWF0ZSByZWxvYzMyJ3Mgd2hhdGV2ZXIgdGhlIHNpemUgb2YgdGhlIHJlbG9jLi4KLSAgICAgICAqLwotICAgICAgc3dpdGNoIChmaXhfcHRyLT5meF9zaXplKQotCXsKLQljYXNlIDQ6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX1JFTExPTkc7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX1JFTFdPUkQ7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX1JFTEJZVEU7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQl9Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRyLT5yX3R5cGUgPSBmaXhfcHRyLT5meF9yX3R5cGU7Ci0gICAgfQotCi0gIGludHItPnJfdmFkZHIgPSBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+Znhfd2hlcmUgKyBiYXNlOwotICBpbnRyLT5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKLQotICBpZiAoc3ltYm9sX3B0cikKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sX3B0ci0+c3lfbnVtYmVyICE9IC0xKQotCWludHItPnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotICAgICAgZWxzZQotCXsKLQkgIHN5bWJvbFMgKnNlZ3N5bTsKLQotCSAgLyogVGhpcyBjYXNlIGFyaXNlcyB3aGVuIGEgcmVmZXJlbmNlIGlzIG1hZGUgdG8gYC4nLiAgKi8KLQkgIHNlZ3N5bSA9IHNlZ19pbmZvIChTX0dFVF9TRUdNRU5UIChzeW1ib2xfcHRyKSktPmRvdDsKLQkgIGlmIChzZWdzeW0gPT0gTlVMTCkKLQkgICAgaW50ci0+cl9zeW1uZHggPSAtMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludHItPnJfc3ltbmR4ID0gc2Vnc3ltLT5zeV9udW1iZXI7Ci0JICAgICAgaW50ci0+cl9vZmZzZXQgKz0gU19HRVRfVkFMVUUgKHN5bWJvbF9wdHIpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGludHItPnJfc3ltbmR4ID0gLTE7Ci0KLQotfQotCi0vKiBlbmQgb2YgdGMtaDgzMDAuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1oODMwMC5oIGIvZ2FzL2NvbmZpZy90Yy1oODMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTJhNzA0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaDgzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1oODMwMC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jZGVmaW5lIFRDX0g4MzAwCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jaWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgaW50ZXJuYWxfcmVsb2M7Ci0jZW5kaWYKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIFRoaXMgbWFjcm8gdHJhbnNsYXRlcyBiZXR3ZWVuIGFuIGludGVybmFsIGZpeCBhbmQgYW4gY29mZiByZWxvYyB0eXBlICovCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIGFib3J0KCk7Ci0KLSNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfaDgzMDAKLSNkZWZpbmUgQ09GRl9NQUdJQyAoIFNtb2RlID8gMHg4MzAyIDogSG1vZGUgPyAweDgzMDEgOiAweDgzMDApCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgxKQotI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUwotCi0jZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhhKSA7IC8qIG5vdCB1c2VkICovCi0jZGVmaW5lIFRDX1JFTE9DX01BTkdMRShzLGEsYixjKSB0Y19yZWxvY19tYW5nbGUoYSxiLGMpCi1leHRlcm4gdm9pZCB0Y19yZWxvY19tYW5nbGUKLSAgUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYmZkX3ZtYSkpOwotCi0jZGVmaW5lIFRDX0NPTlNfUkVMT0MgICAgICAgICAgKEhtb2RlID8gUl9SRUxMT05HOiBSX1JFTFdPUkQpCi0KLSNkZWZpbmUgRE9fTk9UX1NUUklQIDAKLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkhpdGFjaGkgSDgvMzAwIEdBUyAiCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFIDEKLSNkZWZpbmUgUkVMT0NfMzIgMTIzNAotCi1leHRlcm4gaW50IEhtb2RlOwotZXh0ZXJuIGludCBTbW9kZTsKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLS8qIGVuZCBvZiB0Yy1oODMwMC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWg4NTAwLmMgYi9nYXMvY29uZmlnL3RjLWg4NTAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZWMzZTIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1oODUwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYzMyArMCwwIEBACi0vKiB0Yy1oODUwMC5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIHRoZSBIaXRhY2hpIEg4LzUwMAotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICBXcml0dGVuIEJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gIHNhY0BjeWdudXMuY29tCi0gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNkZWZpbmUgQVNTRU1CTEVSX1RBQkxFCi0jaW5jbHVkZSAib3Bjb2Rlcy9oODUwMC1vcGMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIhIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiISMiOwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAgICovCi0KLXZvaWQgY29ucyAoKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJpbnQiLCBjb25zLCAyfSwKLSAgeyJkYXRhLmIiLCBjb25zLCAxfSwKLSAgeyJkYXRhLnciLCBjb25zLCAyfSwKLSAgeyJkYXRhLmwiLCBjb25zLCA0fSwKLSAgeyJmb3JtIiwgbGlzdGluZ19wc2l6ZSwgMH0sCi0gIHsiaGVhZGluZyIsIGxpc3RpbmdfdGl0bGUsIDB9LAotICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKLSAgeyJwYWdlIiwgbGlzdGluZ19lamVjdCwgMH0sCi0gIHsicHJvZ3JhbSIsIHNfaWdub3JlLCAwfSwKLSAgezAsIDAsIDB9Ci19OwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZTsKLQotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotI2RlZmluZSBDKGEsYikgRU5DT0RFX1JFTEFYKGEsYikKLSNkZWZpbmUgRU5DT0RFX1JFTEFYKHdoYXQsbGVuZ3RoKSAoKCh3aGF0KSA8PCAyKSArIChsZW5ndGgpKQotCi0jZGVmaW5lIEdFVF9XSEFUKHgpICgoeD4+MikpCi0KLSNkZWZpbmUgQllURV9ESVNQIDEKLSNkZWZpbmUgV09SRF9ESVNQIDIKLSNkZWZpbmUgVU5ERUZfQllURV9ESVNQIDAKLSNkZWZpbmUgVU5ERUZfV09SRF9ESVNQIDMKLQotI2RlZmluZSBCUkFOQ0ggIDEKLSNkZWZpbmUgU0NCX0YgICAyCi0jZGVmaW5lIFNDQl9UU1QgMwotI2RlZmluZSBFTkQgNAotCi0jZGVmaW5lIEJZVEVfRiAxMjcKLSNkZWZpbmUgQllURV9CIC0xMjYKLSNkZWZpbmUgV09SRF9GIDMyNzY3Ci0jZGVmaW5lIFdPUkRfQiAzMjc2OAotCi1yZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtDIChFTkQsIDApXTsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wY29kZV9oYXNoX2NvbnRyb2w7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLQotLyoKLSAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIFRoaXMgc2hvdWxkCi0gIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciBuZWVkcwotICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBoODUwMF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICBjaGFyIHByZXZfYnVmZmVyWzEwMF07Ci0gIGludCBpZHggPSAwOwotICByZWdpc3RlciByZWxheF90eXBlUyAqdGFibGU7Ci0KLSAgb3Bjb2RlX2hhc2hfY29udHJvbCA9IGhhc2hfbmV3ICgpOwotICBwcmV2X2J1ZmZlclswXSA9IDA7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUgKi8KLSAgZm9yIChvcGNvZGUgPSBoODUwMF90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpZiAoaWR4ICE9IG9wY29kZS0+aWR4KQotCXsKLQkgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBvcGNvZGUtPm5hbWUsIChjaGFyICopIG9wY29kZSk7Ci0JICBpZHgrKzsKLQl9Ci0gICAgfQotCi0gIC8qIEluaXRpYWxpemUgdGhlIHJlbGF4IHRhYmxlLiAgV2UgdXNlIGEgbG9jYWwgdmFyaWFibGUgdG8gYXZvaWQKLSAgICAgd2FybmluZ3MgYWJvdXQgbW9kaWZ5aW5nIGEgc3VwcG9zZWRseSBjb25zdCBkYXRhIHN0cnVjdHVyZS4gICovCi0gIHRhYmxlID0gKHJlbGF4X3R5cGVTICopIG1kX3JlbGF4X3RhYmxlOwotICB0YWJsZVtDIChCUkFOQ0gsIEJZVEVfRElTUCldLnJseF9mb3J3YXJkID0gQllURV9GOwotICB0YWJsZVtDIChCUkFOQ0gsIEJZVEVfRElTUCldLnJseF9iYWNrd2FyZCA9IEJZVEVfQjsKLSAgdGFibGVbQyAoQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoID0gMjsKLSAgdGFibGVbQyAoQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfbW9yZSA9IEMgKEJSQU5DSCwgV09SRF9ESVNQKTsKLQotICB0YWJsZVtDIChCUkFOQ0gsIFdPUkRfRElTUCldLnJseF9mb3J3YXJkID0gV09SRF9GOwotICB0YWJsZVtDIChCUkFOQ0gsIFdPUkRfRElTUCldLnJseF9iYWNrd2FyZCA9IFdPUkRfQjsKLSAgdGFibGVbQyAoQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoID0gMzsKLSAgdGFibGVbQyAoQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbW9yZSA9IDA7Ci0KLSAgdGFibGVbQyAoU0NCX0YsIEJZVEVfRElTUCldLnJseF9mb3J3YXJkID0gQllURV9GOwotICB0YWJsZVtDIChTQ0JfRiwgQllURV9ESVNQKV0ucmx4X2JhY2t3YXJkID0gQllURV9COwotICB0YWJsZVtDIChTQ0JfRiwgQllURV9ESVNQKV0ucmx4X2xlbmd0aCA9IDM7Ci0gIHRhYmxlW0MgKFNDQl9GLCBCWVRFX0RJU1ApXS5ybHhfbW9yZSA9IEMgKFNDQl9GLCBXT1JEX0RJU1ApOwotCi0gIHRhYmxlW0MgKFNDQl9GLCBXT1JEX0RJU1ApXS5ybHhfZm9yd2FyZCA9IFdPUkRfRjsKLSAgdGFibGVbQyAoU0NCX0YsIFdPUkRfRElTUCldLnJseF9iYWNrd2FyZCA9IFdPUkRfQjsKLSAgdGFibGVbQyAoU0NCX0YsIFdPUkRfRElTUCldLnJseF9sZW5ndGggPSA4OwotICB0YWJsZVtDIChTQ0JfRiwgV09SRF9ESVNQKV0ucmx4X21vcmUgPSAwOwotCi0gIHRhYmxlW0MgKFNDQl9UU1QsIEJZVEVfRElTUCldLnJseF9mb3J3YXJkID0gQllURV9GOwotICB0YWJsZVtDIChTQ0JfVFNULCBCWVRFX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBCWVRFX0I7Ci0gIHRhYmxlW0MgKFNDQl9UU1QsIEJZVEVfRElTUCldLnJseF9sZW5ndGggPSAzOwotICB0YWJsZVtDIChTQ0JfVFNULCBCWVRFX0RJU1ApXS5ybHhfbW9yZSA9IEMgKFNDQl9UU1QsIFdPUkRfRElTUCk7Ci0KLSAgdGFibGVbQyAoU0NCX1RTVCwgV09SRF9ESVNQKV0ucmx4X2ZvcndhcmQgPSBXT1JEX0Y7Ci0gIHRhYmxlW0MgKFNDQl9UU1QsIFdPUkRfRElTUCldLnJseF9iYWNrd2FyZCA9IFdPUkRfQjsKLSAgdGFibGVbQyAoU0NCX1RTVCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aCA9IDEwOwotICB0YWJsZVtDIChTQ0JfVFNULCBXT1JEX0RJU1ApXS5ybHhfbW9yZSA9IDA7Ci0KLX0KLQotc3RhdGljIGludCBybjsJCQkvKiByZWdpc3RlciBudW1iZXIgdXNlZCBieSBSTiAqLwotc3RhdGljIGludCByczsJCQkvKiByZWdpc3RlciBudW1iZXIgdXNlZCBieSBSUyAqLwotc3RhdGljIGludCByZDsJCQkvKiByZWdpc3RlciBudW1iZXIgdXNlZCBieSBSRCAqLwotc3RhdGljIGludCBjcmI7CQkJLyogYnl0ZSBzaXplIGNyICovCi1zdGF0aWMgaW50IGNydzsJCQkvKiB3b3JkIHNpemVkIGNyICovCi1zdGF0aWMgaW50IGNyOwkJCS8qIHVua25vd24gc2l6ZSBjciAqLwotCi1zdGF0aWMgZXhwcmVzc2lvblMgZGlzcGxhY2VtZW50Oy8qIGRpc3BsYWNlbWVudCBleHByZXNzaW9uICovCi1zdGF0aWMgaW50IGRpc3BsYWNlbWVudF9zaXplOwkvKiBhbmQgc2l6ZSBpZiBnaXZlbiAqLwotCi1zdGF0aWMgaW50IGltbWVkaWF0ZV9pbnBhZ2U7Ci1zdGF0aWMgZXhwcmVzc2lvblMgaW1tZWRpYXRlOwkvKiBpbW1lZGlhdGUgZXhwcmVzc2lvbiAqLwotc3RhdGljIGludCBpbW1lZGlhdGVfc2l6ZTsJLyogYW5kIHNpemUgaWYgZ2l2ZW4gKi8KLQotc3RhdGljIGV4cHJlc3Npb25TIGFic29sdXRlOwkvKiBhYnNvbHV0ZSBleHByZXNzaW9uICovCi1zdGF0aWMgaW50IGFic29sdXRlX3NpemU7CS8qIGFuZCBzaXplIGlmIGdpdmVuICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGludCB0eXBlOwotICBpbnQgcmVnOwotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBwYWdlOwotfQotCi1oODUwMF9vcGVyYW5kX2luZm87Ci0KLS8qIHRyeSBhbmQgcGFyc2UgYSByZWcgbmFtZSwgcmV0dXJucyBudW1iZXIgb2YgY2hhcnMgY29uc3VtZWQgKi8KLXN0YXRpYyBpbnQKLXBhcnNlX3JlZyAoc3JjLCBtb2RlLCByZWcpCi0gICAgIGNoYXIgKnNyYzsKLSAgICAgaW50ICptb2RlOwotICAgICBpbnQgKnJlZzsKLXsKLSAgY2hhciAqZW5kOwotICBpbnQgbGVuOwotCi0gIC8qIENyaWJiZWQgZnJvbSBnZXRfc3ltYm9sX2VuZCgpLiAgKi8KLSAgaWYgKCFpc19uYW1lX2JlZ2lubmVyICgqc3JjKSB8fCAqc3JjID09ICdcMDAxJykKLSAgICByZXR1cm4gMDsKLSAgZW5kID0gc3JjKzE7Ci0gIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKCplbmQpIHx8ICplbmQgPT0gJ1wwMDEnKQotICAgIGVuZCsrOwotICBsZW4gPSBlbmQgLSBzcmM7Ci0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNyY1sxXSA+PSAnMCcgJiYgc3JjWzFdIDw9ICc3JykKLQl7Ci0JICAqbW9kZSA9IFJOOwotCSAgKnJlZyA9IChzcmNbMV0gLSAnMCcpOwotCSAgcmV0dXJuIGxlbjsKLQl9Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3AnKQotICAgIHsKLSAgICAgICptb2RlID0gUk47Ci0gICAgICAqcmVnID0gNzsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDMgJiYgc3JjWzBdID09ICdjJyAmJiBzcmNbMV0gPT0gJ2MnICYmIHNyY1syXSA9PSAncicpCi0gICAgewotICAgICAgKm1vZGUgPSBDUkI7Ci0gICAgICAqcmVnID0gMTsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3InKQotICAgIHsKLSAgICAgICptb2RlID0gQ1JXOwotICAgICAgKnJlZyA9IDA7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnYicgJiYgc3JjWzFdID09ICdyJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IENSQjsKLSAgICAgICpyZWcgPSAzOwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ2UnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgKm1vZGUgPSBDUkI7Ci0gICAgICAqcmVnID0gNDsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdkJyAmJiBzcmNbMV0gPT0gJ3AnKQotICAgIHsKLSAgICAgICptb2RlID0gQ1JCOwotICAgICAgKnJlZyA9IDU7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAndCcgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IENSQjsKLSAgICAgICpyZWcgPSA3OwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgKm1vZGUgPSBSTjsKLSAgICAgICpyZWcgPSA2OwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMKLWNoYXIgKgotcGFyc2VfZXhwIChzLCBvcCwgcGFnZSkKLSAgICAgY2hhciAqczsKLSAgICAgZXhwcmVzc2lvblMgKm9wOwotICAgICBpbnQgKnBhZ2U7Ci17Ci0gIGNoYXIgKnNhdmU7Ci0gIGNoYXIgKm5ldzsKLQotICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICpwYWdlID0gMDsKLSAgaWYgKHNbMF0gPT0gJyUnKQotICAgIHsKLSAgICAgIGlmIChzWzFdID09ICdwJyAmJiBzWzJdID09ICdhJyAmJiBzWzNdID09ICdnJyAmJiBzWzRdID09ICdlJykKLQl7Ci0JICBzICs9IDU7Ci0JICAqcGFnZSA9ICdwJzsKLQl9Ci0gICAgICBpZiAoc1sxXSA9PSAnaCcgJiYgc1syXSA9PSAnaScgJiYgc1szXSA9PSAnMScgJiYgc1s0XSA9PSAnNicpCi0JewotCSAgcyArPSA1OwotCSAgKnBhZ2UgPSAnaCc7Ci0JfQotICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnbycgJiYgc1syXSA9PSAnZicgJiYgc1szXSA9PSAnZicpCi0JewotCSAgcyArPSA0OwotCSAgKnBhZ2UgPSAnbyc7Ci0JfQotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCi0gIGV4cHJlc3Npb24gKG9wKTsKLSAgaWYgKG9wLT5YX29wID09IE9fYWJzZW50KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgZXhwX3NpZ25lZCwgZXhwX3Vuc2lnbmVkLCBleHBfc2FuZHUKLSAgfSBzaWduX3R5cGU7Ci0KLQotc3RhdGljIGNoYXIgKgotc2tpcF9jb2xvbnRoaW5nIChzaWduLCBwdHIsIGV4cCwgZGVmLCBzaXplOCwgc2l6ZTE2LCBzaXplMjQpCi0gICAgIHNpZ25fdHlwZSBzaWduOwotICAgICBjaGFyICpwdHI7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqZXhwOwotICAgICBpbnQgZGVmOwotICAgICBpbnQgc2l6ZTg7Ci0gICAgIGludCBzaXplMTY7Ci0gICAgIGludCBzaXplMjQ7Ci17Ci0gIHB0ciA9IHBhcnNlX2V4cCAocHRyLCAmZXhwLT5leHAsICZleHAtPnBhZ2UpOwotICBpZiAoKnB0ciA9PSAnOicpCi0gICAgewotICAgICAgcHRyKys7Ci0gICAgICBpZiAoKnB0ciA9PSAnOCcpCi0JewotCSAgcHRyKys7Ci0JICBleHAtPnR5cGUgPSBzaXplODsKLQl9Ci0gICAgICBlbHNlIGlmIChwdHJbMF0gPT0gJzEnICYgcHRyWzFdID09ICc2JykKLQl7Ci0JICBwdHIgKz0gMjsKLQkgIGV4cC0+dHlwZSA9IHNpemUxNjsKLQl9Ci0gICAgICBlbHNlIGlmIChwdHJbMF0gPT0gJzInICYgcHRyWzFdID09ICc0JykKLQl7Ci0JICBpZiAoIXNpemUyNCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiOjI0IG5vdCB2YWxpZCBmb3IgdGhpcyBvcGNvZGUiKSk7Ci0JICAgIH0KLQkgIHB0ciArPSAyOwotCSAgZXhwLT50eXBlID0gc2l6ZTI0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImV4cGVjdCA6OCw6MTYgb3IgOjI0IikpOwotCSAgZXhwLT50eXBlID0gc2l6ZTE2OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZXhwLT5wYWdlID09ICdwJykKLQl7Ci0JICBleHAtPnR5cGUgPSBJTU04OwotCX0KLSAgICAgIGVsc2UgaWYgKGV4cC0+cGFnZSA9PSAnaCcpCi0JewotCSAgZXhwLT50eXBlID0gSU1NMTY7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIExldCdzIHdvcmsgb3V0IHRoZSBzaXplIGZyb20gdGhlIGNvbnRleHQgKi8KLQkgIGludCBuID0gZXhwLT5leHAuWF9hZGRfbnVtYmVyOwotCSAgaWYgKHNpemU4Ci0JICAgICAgJiYgZXhwLT5leHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAgJiYgKChzaWduID09IGV4cF9zaWduZWQgJiYgKG4gPj0gLTEyOCAmJiBuIDw9IDEyNykpCi0JCSAgfHwgKHNpZ24gPT0gZXhwX3Vuc2lnbmVkICYmIChuID49IDAgJiYgKG4gPD0gMjU1KSkpCi0JCSAgfHwgKHNpZ24gPT0gZXhwX3NhbmR1ICYmIChuID49IC0xMjggJiYgKG4gPD0gMjU1KSkpKSkKLQkgICAgewotCSAgICAgIGV4cC0+dHlwZSA9IHNpemU4OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHAtPnR5cGUgPSBkZWY7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gcHRyOwotfQotCi1zdGF0aWMgaW50Ci1wYXJzZV9yZWdsaXN0IChzcmMsIG9wKQotICAgICBjaGFyICpzcmM7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3A7Ci17Ci0gIGludCBtb2RlOwotICBpbnQgcm47Ci0gIGludCBtYXNrID0gMDsKLSAgaW50IHJtOwotICBpbnQgaWR4ID0gMTsJCQkvKiBza2lwICggKi8KLQotICB3aGlsZSAoc3JjW2lkeF0gJiYgc3JjW2lkeF0gIT0gJyknKQotICAgIHsKLSAgICAgIGludCBkb25lID0gcGFyc2VfcmVnIChzcmMgKyBpZHgsICZtb2RlLCAmcm4pOwotCi0gICAgICBpZiAoZG9uZSkKLQl7Ci0JICBpZHggKz0gZG9uZTsKLQkgIG1hc2sgfD0gMSA8PCBybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gcmVnIGxpc3QiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBpZiAoc3JjW2lkeF0gPT0gJy0nKQotCXsKLQkgIGlkeCsrOwotCSAgZG9uZSA9IHBhcnNlX3JlZyAoc3JjICsgaWR4LCAmbW9kZSwgJnJtKTsKLQkgIGlmIChkb25lKQotCSAgICB7Ci0JICAgICAgaWR4ICs9IGRvbmU7Ci0JICAgICAgd2hpbGUgKHJuIDw9IHJtKQotCQl7Ci0JCSAgbWFzayB8PSAxIDw8IHJuOwotCQkgIHJuKys7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGZpbmFsIHJlZ2lzdGVyIGluIHJhbmdlIikpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNyY1tpZHhdID09ICcsJykKLQlpZHgrKzsKLSAgICB9Ci0gIGlkeCsrOwotICBvcC0+ZXhwLlhfYWRkX3N5bWJvbCA9IDA7Ci0gIG9wLT5leHAuWF9vcF9zeW1ib2wgPSAwOwotICBvcC0+ZXhwLlhfYWRkX251bWJlciA9IG1hc2s7Ci0gIG9wLT5leHAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIG9wLT5leHAuWF91bnNpZ25lZCA9IDE7Ci0gIG9wLT50eXBlID0gSU1NODsKLSAgcmV0dXJuIGlkeDsKLQotfQotCi0vKiBUaGUgbWFueSBmb3JtcyBvZiBvcGVyYW5kOgotCi0gICBSbgkJCVJlZ2lzdGVyIGRpcmVjdAotICAgQFJuCQkJUmVnaXN0ZXIgaW5kaXJlY3QKLSAgIEAoZGlzcFs6c2l6ZV0sIFJuKQlSZWdpc3RlciBpbmRpcmVjdCB3aXRoIGRpc3BsYWNlbWVudAotICAgQFJuKwotICAgQC1SbgotICAgQGFhWzpzaXplXQkJYWJzb2x1dGUKLSAgICN4eFs6c2l6ZV0JCWltbWVkaWF0ZSBkYXRhCi0KLSAgICovCi0KLXN0YXRpYyB2b2lkCi1nZXRfb3BlcmFuZCAocHRyLCBvcCwgaXNwYWdlKQotICAgICBjaGFyICoqcHRyOwotICAgICBoODUwMF9vcGVyYW5kX2luZm8gKm9wOwotICAgICBjaGFyIGlzcGFnZTsKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgaW50IG1vZGU7Ci0gIHVuc2lnbmVkIGludCBudW07Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIG9wLT5wYWdlID0gMDsKLSAgaWYgKHNyY1swXSA9PSAnKCcgJiYgc3JjWzFdID09ICdyJykKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgcmVnaXN0ZXIgbGlzdCAqLwotICAgICAgKnB0ciA9IHNyYyArIHBhcnNlX3JlZ2xpc3QgKHNyYywgb3ApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm9wLT50eXBlLCAmb3AtPnJlZyk7Ci0KLSAgaWYgKGxlbikKLSAgICB7Ci0gICAgICAqcHRyID0gc3JjICsgbGVuOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoKnNyYyA9PSAnQCcpCi0gICAgewotICAgICAgc3JjKys7Ci0gICAgICBpZiAoKnNyYyA9PSAnLScpCi0JewotCSAgc3JjKys7Ci0JICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICZudW0pOwotCSAgaWYgKGxlbiA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogT29wcywgbm90IGEgcmVnIGFmdGVyIGFsbCwgbXVzdCBiZSBvcmRpbmFyeSBleHAgKi8KLQkgICAgICBzcmMtLTsKLQkgICAgICAvKiBtdXN0IGJlIGEgc3ltYm9sICovCi0JICAgICAgKnB0ciA9IHNraXBfY29sb250aGluZyAoZXhwX3Vuc2lnbmVkLCBzcmMsCi0JCQkJICAgICAgb3AsIEFCUzE2LCBBQlM4LCBBQlMxNiwgQUJTMjQpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBvcC0+dHlwZSA9IFJOREVDOwotCSAgb3AtPnJlZyA9IG51bTsKLQkgICpwdHIgPSBzcmMgKyBsZW47Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKCpzcmMgPT0gJygnKQotCXsKLQkgIC8qIERpc3AgKi8KLQkgIHNyYysrOwotCi0JICBzcmMgPSBza2lwX2NvbG9udGhpbmcgKGV4cF9zaWduZWQsIHNyYywgCi0JCQkJIG9wLCBSTklORF9EMTYsIFJOSU5EX0Q4LCBSTklORF9EMTYsIDApOwotCi0JICBpZiAoKnNyYyAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIEAoZXhwLCBSbikiKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBzcmMrKzsKLQkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm9wLT5yZWcpOwotCSAgaWYgKGxlbiA9PSAwIHx8IG1vZGUgIT0gUk4pCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIEAoZXhwLCBSbikiKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBzcmMgKz0gbGVuOwotCSAgaWYgKCpzcmMgIT0gJyknKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBAKGV4cCwgUm4pIikpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgKnB0ciA9IHNyYyArIDE7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmbnVtKTsKLQotICAgICAgaWYgKGxlbikKLQl7Ci0JICBzcmMgKz0gbGVuOwotCSAgaWYgKCpzcmMgPT0gJysnKQotCSAgICB7Ci0JICAgICAgc3JjKys7Ci0JICAgICAgaWYgKG1vZGUgIT0gUk4pCi0JCXsKLQkJICBhc19iYWQgKF8oIkBSbisgbmVlZHMgd29yZCByZWdpc3RlciIpKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBvcC0+dHlwZSA9IFJOSU5DOwotCSAgICAgIG9wLT5yZWcgPSBudW07Ci0JICAgICAgKnB0ciA9IHNyYzsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGlmIChtb2RlICE9IFJOKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJAUm4gbmVlZHMgd29yZCByZWdpc3RlciIpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIG9wLT50eXBlID0gUk5JTkQ7Ci0JICBvcC0+cmVnID0gbnVtOwotCSAgKnB0ciA9IHNyYzsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogbXVzdCBiZSBhIHN5bWJvbCAqLwotCSAgKnB0ciA9Ci0JICAgIHNraXBfY29sb250aGluZyAoZXhwX3Vuc2lnbmVkLCBzcmMsIG9wLAotCQkJICAgICBpc3BhZ2UgPyBBQlMyNCA6IEFCUzE2LCBBQlM4LCBBQlMxNiwgQUJTMjQpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKCpzcmMgPT0gJyMnKQotICAgIHsKLSAgICAgIHNyYysrOwotICAgICAgKnB0ciA9IHNraXBfY29sb250aGluZyAoZXhwX3NhbmR1LCBzcmMsIG9wLCBJTU0xNiwgSU1NOCwgSU1NMTYsIEFCUzI0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqcHRyID0gc2tpcF9jb2xvbnRoaW5nIChleHBfc2lnbmVkLCBzcmMsIG9wLAotCQkJICAgICAgaXNwYWdlID8gQUJTMjQgOiBQQ1JFTDgsIFBDUkVMOCwgUENSRUwxNiwgQUJTMjQpOwotICAgIH0KLX0KLQotc3RhdGljCi1jaGFyICoKLWdldF9vcGVyYW5kcyAoaW5mbywgYXJncywgb3BlcmFuZCkKLSAgICAgaDg1MDBfb3Bjb2RlX2luZm8gKmluZm87Ci0gICAgIGNoYXIgKmFyZ3M7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3BlcmFuZDsKLQotewotICBjaGFyICpwdHIgPSBhcmdzOwotCi0gIHN3aXRjaCAoaW5mby0+bmFyZ3MpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIG9wZXJhbmRbMF0udHlwZSA9IDA7Ci0gICAgICBvcGVyYW5kWzFdLnR5cGUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICBwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgaW5mby0+bmFtZVswXSA9PSAncCcpOwotICAgICAgb3BlcmFuZFsxXS50eXBlID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0vKiBQYXNzZWQgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiBvcGNvZGVzIHdoaWNoIHVzZSBkaWZmZXJlbnQKLSAgIGFkZHJlc3NpbmcgbW9kZXMsIHJldHVybiB0aGUgb3Bjb2RlIHdoaWNoIG1hdGNoZXMgdGhlIG9wY29kZXMKLSAgIHByb3ZpZGVkCi0gICAqLwotCi1pbnQgcGNyZWw4OwkJCS8qIFNldCB3aGVuIHdlJ3ZlIHNlZW4gYSBwY3JlbCBvcGVyYW5kICovCi0KLXN0YXRpYwotaDg1MDBfb3Bjb2RlX2luZm8gKgotZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmRzKQotICAgICBoODUwMF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICAgICBoODUwMF9vcGVyYW5kX2luZm8gKm9wZXJhbmRzOwotewotICBoODUwMF9vcGNvZGVfaW5mbyAqdGhpc190cnkgPSBvcGNvZGU7Ci0gIGludCBmb3VuZCA9IDA7Ci0gIHVuc2lnbmVkIGludCBub3BlcmFuZHMgPSBvcGNvZGUtPm5hcmdzOwotCi0gIHVuc2lnbmVkIGludCB0aGlzX2luZGV4ID0gb3Bjb2RlLT5pZHg7Ci0KLSAgd2hpbGUgKHRoaXNfaW5kZXggPT0gb3Bjb2RlLT5pZHggJiYgIWZvdW5kKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICB0aGlzX3RyeSA9IG9wY29kZSsrOwotCi0gICAgICAvKiBsb29rIGF0IGJvdGggb3BlcmFuZHMgbmVlZGVkIGJ5IHRoZSBvcGNvZGVzIGFuZCBwcm92aWRlZCBieQotICAgICAgIHRoZSB1c2VyKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBub3BlcmFuZHM7IGkrKykKLQl7Ci0JICBoODUwMF9vcGVyYW5kX2luZm8gKnVzZXIgPSBvcGVyYW5kcyArIGk7Ci0KLQkgIHN3aXRjaCAodGhpc190cnktPmFyZ190eXBlW2ldKQotCSAgICB7Ci0JICAgIGNhc2UgRlBJTkRfRDg6Ci0JICAgICAgLyogT3Bjb2RlIG5lZWRzIChkaXNwOjgsZnApICovCi0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk5JTkRfRDggJiYgdXNlci0+cmVnID09IDYpCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORF9EMTY6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk5JTkRfRDE2KQotCQl7Ci0JCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOwotCQkgIHJkID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkRJTkRfRDg6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk5JTkRfRDgpCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgcmQgPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklORF9EMTY6Ci0JICAgIGNhc2UgUk5JTkRfRDg6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gdGhpc190cnktPmFyZ190eXBlW2ldKQotCQl7Ci0JCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOwotCQkgIHJuID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBTUERFQzoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTkRFQyAmJiB1c2VyLT5yZWcgPT0gNykKLQkJewotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1BJTkM6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk5JTkMgJiYgdXNlci0+cmVnID09IDcpCi0JCXsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzE2OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IEFCUzE2KQotCQl7Ci0JCSAgYWJzb2x1dGUgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlM4OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IEFCUzgpCi0JCXsKLQkJICBhYnNvbHV0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzI0OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IEFCUzI0KQotCQl7Ci0JCSAgYWJzb2x1dGUgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENSQjoKLQkgICAgICBpZiAoKHVzZXItPnR5cGUgPT0gQ1JCIHx8IHVzZXItPnR5cGUgPT0gQ1IpICYmIHVzZXItPnJlZyAhPSAwKQotCQl7Ci0JCSAgY3JiID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ1JXOgotCSAgICAgIGlmICgodXNlci0+dHlwZSA9PSBDUlcgfHwgdXNlci0+dHlwZSA9PSBDUikgJiYgdXNlci0+cmVnID09IDApCi0JCXsKLQkJICBjcncgPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBESVNQMTY6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gRElTUDE2KQotCQl7Ci0JCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRElTUDg6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gRElTUDgpCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGUDoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTiAmJiB1c2VyLT5yZWcgPT0gNikKLQkJewotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUwxNjoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBQQ1JFTDE2KQotCQl7Ci0JCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUw4OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFBDUkVMOCkKLQkJewotCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKLQkJICBwY3JlbDggPSAxOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBJTU0xNjoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBJTU0xNgotCQkgIHx8IHVzZXItPnR5cGUgPT0gSU1NOCkKLQkJewotCQkgIGltbWVkaWF0ZV9pbnBhZ2UgPSB1c2VyLT5wYWdlOwotCQkgIGltbWVkaWF0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJMSVNUOgotCSAgICBjYXNlIElNTTg6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gSU1NOCkKLQkJewotCQkgIGltbWVkaWF0ZV9pbnBhZ2UgPSB1c2VyLT5wYWdlOwotCQkgIGltbWVkaWF0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTTQ6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gSU1NOCkKLQkJewotCQkgIGltbWVkaWF0ZV9pbnBhZ2UgPSB1c2VyLT5wYWdlOwotCQkgIGltbWVkaWF0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFFJTToKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBJTU04Ci0JCSAgJiYgdXNlci0+ZXhwLlhfb3AgPT0gT19jb25zdGFudAotCQkgICYmCi0JCSAgKHVzZXItPmV4cC5YX2FkZF9udW1iZXIgPT0gLTIKLQkJICAgfHwgdXNlci0+ZXhwLlhfYWRkX251bWJlciA9PSAtMQotCQkgICB8fCB1c2VyLT5leHAuWF9hZGRfbnVtYmVyID09IDEKLQkJICAgfHwgdXNlci0+ZXhwLlhfYWRkX251bWJlciA9PSAyKSkKLQkJewotCQkgIGltbWVkaWF0ZV9pbnBhZ2UgPSB1c2VyLT5wYWdlOwotCQkgIGltbWVkaWF0ZSA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJEOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOKQotCQl7Ci0JCSAgcmQgPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSUzoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTikKLQkJewotCQkgIHJzID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkRJTkQ6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk5JTkQpCi0JCXsKLQkJICByZCA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5JTkM6Ci0JICAgIGNhc2UgUk5JTkQ6Ci0JICAgIGNhc2UgUk5ERUM6Ci0JICAgIGNhc2UgUk46Ci0KLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSB0aGlzX3RyeS0+YXJnX3R5cGVbaV0pCi0JCXsKLQkJICBybiA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNQOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOICYmIHVzZXItPnJlZyA9PSA3KQotCQl7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBwcmludGYgKF8oInVuaGFuZGxlZCAlZFxuIiksIHRoaXNfdHJ5LT5hcmdfdHlwZVtpXSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgZ2V0IGhlcmUgdGhpcyBkaWRuJ3Qgd29yayBvdXQgKi8KLQkgIGdvdG8gZmFpbDsKLQl9Ci0gICAgICBmb3VuZCA9IDE7Ci0gICAgZmFpbDo7Ci0KLSAgICB9Ci0KLSAgaWYgKGZvdW5kKQotICAgIHJldHVybiB0aGlzX3RyeTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi1pbnQKLWNoZWNrIChvcGVyYW5kLCBsb3csIGhpZ2gpCi0gICAgIGV4cHJlc3Npb25TICpvcGVyYW5kOwotICAgICBpbnQgbG93OwotICAgICBpbnQgaGlnaDsKLXsKLSAgaWYgKG9wZXJhbmQtPlhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgbG93Ci0gICAgICB8fCBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPiBoaWdoKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygib3BlcmFuZCBtdXN0IGJlIGFic29sdXRlIGluIHJhbmdlICVkLi4lZCIpLCBsb3csIGhpZ2gpOwotICAgIH0KLSAgcmV0dXJuIG9wZXJhbmQtPlhfYWRkX251bWJlcjsKLX0KLQotc3RhdGljCi12b2lkCi1pbnNlcnQgKG91dHB1dCwgaW5kZXgsIGV4cCwgcmVsb2MsIHBjcmVsKQotICAgICBjaGFyICpvdXRwdXQ7Ci0gICAgIGludCBpbmRleDsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50IHJlbG9jOwotICAgICBpbnQgcGNyZWw7Ci17Ci0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkgICAgICAgb3V0cHV0IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBpbmRleCwKLQkgICAgICAgNCwJICAgICAgIAkvKiBhbHdheXMgc2F5IHNpemUgaXMgNCwgYnV0IHdlIGtub3cgYmV0dGVyICovCi0JICAgICAgIGV4cCwKLQkgICAgICAgcGNyZWwsCi0JICAgICAgIHJlbG9jKTsKLX0KLQotdm9pZAotYnVpbGRfcmVsYXhhYmxlX2luc3RydWN0aW9uIChvcGNvZGUsIG9wZXJhbmQpCi0gICAgIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3BlcmFuZDsKLXsKLSAgLyogQWxsIHJlbGF4YWJsZSBpbnN0cnVjdGlvbnMgc3RhcnQgbGlmZSBhcyB0d28gYnl0ZXMgYnV0IGNhbiBiZWNvbWUKLSAgICAgdGhyZWUgYnl0ZXMgbG9uZyBpZiBhIGxvbmVseSBicmFuY2ggYW5kIHVwIHRvIDkgYnl0ZXMgaWYgbG9uZyBzY2IKLSAgICAgKi8KLSAgY2hhciAqcDsKLSAgaW50IGxlbjsKLSAgaW50IHR5cGU7Ci0KLSAgaWYgKG9wY29kZS0+Ynl0ZXNbMF0uY29udGVudHMgPT0gMHgwMSkKLSAgICB7Ci0gICAgICB0eXBlID0gU0NCX0Y7Ci0gICAgfQotICBlbHNlIGlmIChvcGNvZGUtPmJ5dGVzWzBdLmNvbnRlbnRzID09IDB4MDYKLQkgICB8fCBvcGNvZGUtPmJ5dGVzWzBdLmNvbnRlbnRzID09IDB4MDcpCi0gICAgewotICAgICAgdHlwZSA9IFNDQl9UU1Q7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdHlwZSA9IEJSQU5DSDsKLSAgICB9Ci0KLSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJbWRfcmVsYXhfdGFibGVbQyAodHlwZSwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aCwKLQkJbGVuID0gbWRfcmVsYXhfdGFibGVbQyAodHlwZSwgQllURV9ESVNQKV0ucmx4X2xlbmd0aCwKLQkJQyAodHlwZSwgVU5ERUZfQllURV9ESVNQKSwKLQkJZGlzcGxhY2VtZW50LlhfYWRkX3N5bWJvbCwKLQkJZGlzcGxhY2VtZW50LlhfYWRkX251bWJlciwKLQkJMCk7Ci0KLSAgcFswXSA9IG9wY29kZS0+Ynl0ZXNbMF0uY29udGVudHM7Ci0gIGlmICh0eXBlICE9IEJSQU5DSCkKLSAgICB7Ci0gICAgICBwWzFdID0gb3Bjb2RlLT5ieXRlc1sxXS5jb250ZW50cyB8IHJzOwotICAgIH0KLX0KLQotLyogTm93IHdlIGtub3cgd2hhdCBzb3J0IG9mIG9wY29kZXMgaXQgaXMsIGxldHMgYnVpbGQgdGhlIGJ5dGVzIC0KLSAqLwotc3RhdGljIHZvaWQKLWJ1aWxkX2J5dGVzIChvcGNvZGUsIG9wZXJhbmQpCi0gICAgIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3BlcmFuZDsKLQotewotICBpbnQgaW5kZXg7Ci0KLSAgaWYgKHBjcmVsOCkKLSAgICB7Ci0gICAgICBwY3JlbDggPSAwOwotICAgICAgYnVpbGRfcmVsYXhhYmxlX2luc3RydWN0aW9uIChvcGNvZGUsIG9wZXJhbmQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKm91dHB1dCA9IGZyYWdfbW9yZSAob3Bjb2RlLT5sZW5ndGgpOwotCi0gICAgICBtZW1zZXQgKG91dHB1dCwgMCwgb3Bjb2RlLT5sZW5ndGgpOwotICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgb3Bjb2RlLT5sZW5ndGg7IGluZGV4KyspCi0JewotCSAgb3V0cHV0W2luZGV4XSA9IG9wY29kZS0+Ynl0ZXNbaW5kZXhdLmNvbnRlbnRzOwotCi0JICBzd2l0Y2ggKG9wY29kZS0+Ynl0ZXNbaW5kZXhdLmluc2VydCkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIHByaW50ZiAoXygiZmFpbGVkIGZvciAlZFxuIiksIG9wY29kZS0+Ynl0ZXNbaW5kZXhdLmluc2VydCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMDoKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTjoKLQkgICAgICBvdXRwdXRbaW5kZXhdIHw9IHJuOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJEOgotCSAgICBjYXNlIFJESU5EOgotCSAgICAgIAotCSAgICAgIG91dHB1dFtpbmRleF0gfD0gcmQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUlM6Ci0JICAgICAgb3V0cHV0W2luZGV4XSB8PSByczsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBESVNQMTY6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmZGlzcGxhY2VtZW50LCBSX0g4NTAwX0lNTTE2LCAwKTsKLQkgICAgICBpbmRleCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERJU1A4OgotCSAgICBjYXNlIEZQSU5EX0Q4OgotCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmRpc3BsYWNlbWVudCwgUl9IODUwMF9JTU04LCAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIElNTTE2OgotCSAgICAgIHsKLQkJaW50IHA7Ci0JCXN3aXRjaCAoaW1tZWRpYXRlX2lucGFnZSkgewotCQljYXNlICdwJzoKLQkJICBwID0gUl9IODUwMF9ISUdIMTY7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2gnOgkJCi0JCSAgcCA9IFJfSDg1MDBfSElHSDE2OwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIHAgPSBSX0g4NTAwX0lNTTE2OwotCQkgIGJyZWFrOwotCQl9Ci0JCQotCQlpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZpbW1lZGlhdGUscCwgMCk7Ci0JICAgICAgfQotCQkKLQkgICAgICBpbmRleCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJMSVNUOgotCSAgICBjYXNlIElNTTg6Ci0JICAgICAgaWYgKGltbWVkaWF0ZV9pbnBhZ2UpCi0JCXsKLQkJICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZpbW1lZGlhdGUsIFJfSDg1MDBfSElHSDgsIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmaW1tZWRpYXRlLCBSX0g4NTAwX0lNTTgsIDApOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUwxNjoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZkaXNwbGFjZW1lbnQsIFJfSDg1MDBfUENSRUwxNiwgMSk7Ci0JICAgICAgaW5kZXgrKzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1JFTDg6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmZGlzcGxhY2VtZW50LCBSX0g4NTAwX1BDUkVMOCwgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NNDoKLQkgICAgICBvdXRwdXRbaW5kZXhdIHw9IGNoZWNrICgmaW1tZWRpYXRlLCAwLCAxNSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ1I6Ci0KLQkgICAgICBvdXRwdXRbaW5kZXhdIHw9IGNyOwotCSAgICAgIGlmIChjciA9PSAwKQotCQl7Ci0JCSAgb3V0cHV0WzBdIHw9IDB4ODsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG91dHB1dFswXSAmPSB+MHg4OwotCQl9Ci0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENSQjoKLQkgICAgICBvdXRwdXRbaW5kZXhdIHw9IGNyYjsKLQkgICAgICBvdXRwdXRbMF0gJj0gfjB4ODsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDUlc6Ci0JICAgICAgb3V0cHV0W2luZGV4XSB8PSBjcnc7Ci0JICAgICAgb3V0cHV0WzBdIHw9IDB4ODsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlMyNDoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZhYnNvbHV0ZSwgUl9IODUwMF9JTU0yNCwgMCk7Ci0JICAgICAgaW5kZXggKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlMxNjoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZhYnNvbHV0ZSwgUl9IODUwMF9JTU0xNiwgMCk7Ci0JICAgICAgaW5kZXgrKzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlM4OgotCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmFic29sdXRlLCBSX0g4NTAwX0lNTTgsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFFJTToKLQkgICAgICBzd2l0Y2ggKGltbWVkaWF0ZS5YX2FkZF9udW1iZXIpCi0JCXsKLQkJY2FzZSAtMjoKLQkJICBvdXRwdXRbaW5kZXhdIHw9IDB4NTsKLQkJICBicmVhazsKLQkJY2FzZSAtMToKLQkJICBvdXRwdXRbaW5kZXhdIHw9IDB4NDsKLQkJICBicmVhazsKLQkJY2FzZSAxOgotCQkgIG91dHB1dFtpbmRleF0gfD0gMDsKLQkJICBicmVhazsKLQkJY2FzZSAyOgotCQkgIG91dHB1dFtpbmRleF0gfD0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY2l0b24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KLSAgICovCi0KLXZvaWQKLURFRlVOIChtZF9hc3NlbWJsZSwgKHN0ciksCi0gICAgICAgY2hhciAqc3RyKQotewotICBjaGFyICpvcF9zdGFydDsKLSAgY2hhciAqb3BfZW5kOwotICBoODUwMF9vcGVyYW5kX2luZm8gb3BlcmFuZFsyXTsKLSAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgaDg1MDBfb3Bjb2RlX2luZm8gKnByZXZfb3Bjb2RlOwotICBjaGFyIG5hbWVbMTFdOwotCi0gIGludCBubGVuID0gMDsKLQotICAvKiBEcm9wIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgLyogZmluZCB0aGUgb3AgY29kZSBlbmQgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9IHN0cjsKLSAgICAgICAqb3BfZW5kICYmCi0gICAgICAgIWlzX2VuZF9vZl9saW5lWypvcF9lbmRdICYmICpvcF9lbmQgIT0gJyAnOwotICAgICAgIG9wX2VuZCsrKQotICAgIHsKLSAgICAgIGlmICgJCQkvKipvcF9lbmQgIT0gJy4nCi0JICAmJiAqb3BfZW5kICE9ICc6JwotCSAgIAkgICAJICAgCSAgJiYgKi8gbmxlbiA8IDEwKQotCXsKLQkgIG5hbWVbbmxlbisrXSA9ICpvcF9lbmQ7Ci0JfQotICAgIH0KLSAgbmFtZVtubGVuXSA9IDA7Ci0KLSAgaWYgKG9wX2VuZCA9PSBvcF9zdGFydCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICB9Ci0KLSAgb3Bjb2RlID0gKGg4NTAwX29wY29kZV9pbmZvICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwgbmFtZSk7Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGdldF9vcGVyYW5kcyAob3Bjb2RlLCBvcF9lbmQsIG9wZXJhbmQpOwotICBwcmV2X29wY29kZSA9IG9wY29kZTsKLQotICBvcGNvZGUgPSBnZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZCk7Ci0KLSAgaWYgKG9wY29kZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIENvdWxkbid0IGZpbmQgYW4gb3Bjb2RlIHdoaWNoIG1hdGNoZWQgdGhlIG9wZXJhbmRzICovCi0gICAgICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMik7Ci0KLSAgICAgIHdoZXJlWzBdID0gMHgwOwotICAgICAgd2hlcmVbMV0gPSAweDA7Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgb3BlcmFuZHMgZm9yIG9wY29kZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnVpbGRfYnl0ZXMgKG9wY29kZSwgb3BlcmFuZCk7Ci0KLX0KLQotdm9pZAotREVGVU4gKHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKLX0KLQotc3ltYm9sUyAqCi1ERUZVTiAobWRfdW5kZWZpbmVkX3N5bWJvbCwgKG5hbWUpLAotICAgICAgIGNoYXIgKm5hbWUpCi17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1ERUZVTiAodGNfaGVhZGVyc19ob29rLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIikpOwotfQotCi0vKiBWYXJpb3VzIHJvdXRpbmVzIHRvIGtpbGwgb25lIGRheSAqLwotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAgICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotfQotDAotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKCkKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2FvdXRfZml4X3RvX2NoYXJzIFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljCi12b2lkCi13b3JkaWZ5X3NjYiAoYnVmZmVyLCBkaXNwX3NpemUsIGluc3Rfc2l6ZSkKLSAgICAgY2hhciAqYnVmZmVyOwotICAgICBpbnQgKmRpc3Bfc2l6ZTsKLSAgICAgaW50ICppbnN0X3NpemU7Ci17Ci0gIGludCBybiA9IGJ1ZmZlclsxXSAmIDB4NzsKLQotICBzd2l0Y2ggKGJ1ZmZlclswXSkKLSAgICB7Ci0gICAgY2FzZSAweDBlOgkJCS8qIEJTUiAqLwotICAgIGNhc2UgMHgyMDoKLSAgICBjYXNlIDB4MjE6Ci0gICAgY2FzZSAweDIyOgotICAgIGNhc2UgMHgyMzoKLSAgICBjYXNlIDB4MjQ6Ci0gICAgY2FzZSAweDI1OgotICAgIGNhc2UgMHgyNjoKLSAgICBjYXNlIDB4Mjc6Ci0gICAgY2FzZSAweDI4OgotICAgIGNhc2UgMHgyOToKLSAgICBjYXNlIDB4MmE6Ci0gICAgY2FzZSAweDJiOgotICAgIGNhc2UgMHgyYzoKLSAgICBjYXNlIDB4MmQ6Ci0gICAgY2FzZSAweDJlOgotICAgIGNhc2UgMHgyZjoKLSAgICAgIGJ1ZmZlclswXSB8PSAweDEwOwotICAgICAgYnVmZmVyWzFdID0gMDsKLSAgICAgIGJ1ZmZlclsyXSA9IDA7Ci0gICAgICAqZGlzcF9zaXplID0gMjsKLSAgICAgICppbnN0X3NpemUgPSAxOwotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgMHgwMToKLSAgICAgICppbnN0X3NpemUgPSA2OwotICAgICAgKmRpc3Bfc2l6ZSA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDY6Ci0gICAgICAqaW5zdF9zaXplID0gODsKLSAgICAgICpkaXNwX3NpemUgPSAyOwotCi0gICAgICAqYnVmZmVyKysgPSAweDI2OwkJLyogYm5lICsgOCAqLwotICAgICAgKmJ1ZmZlcisrID0gMHgwODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwNzoKLSAgICAgICppbnN0X3NpemUgPSA4OwotICAgICAgKmRpc3Bfc2l6ZSA9IDI7Ci0gICAgICAqYnVmZmVyKysgPSAweDI3OwkJLyogYm5lICsgOCAqLwotICAgICAgKmJ1ZmZlcisrID0gMHgwODsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotICAqYnVmZmVyKysgPSAweGE4IHwgcm47CS8qIGFkZHEgLTEscm4gKi8KLSAgKmJ1ZmZlcisrID0gMHgwYzsKLSAgKmJ1ZmZlcisrID0gMHgwNDsJCS8qIGNtcCAjMHhmZjo4LCBybiAqLwotICAqYnVmZmVyKysgPSAweGZmOwotICAqYnVmZmVyKysgPSAweDcwIHwgcm47Ci0gICpidWZmZXIrKyA9IDB4MzY7CQkvKiBibmUgLi4uICovCi0gICpidWZmZXIrKyA9IDA7Ci0gICpidWZmZXIrKyA9IDA7Ci19Ci0KLS8qCi1jYWxsZWQgYWZ0ZXIgcmVsYXhpbmcsIGNoYW5nZSB0aGUgZnJhZ3Mgc28gdGhleSBrbm93IGhvdyBiaWcgdGhleSBhcmUKLSovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBpbnQgZGlzcF9zaXplID0gMDsKLSAgaW50IGluc3Rfc2l6ZSA9IDA7Ci0gIGNoYXIgKmJ1ZmZlciA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfbGl0ZXJhbDsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEMgKEJSQU5DSCwgQllURV9ESVNQKToKLSAgICAgIGRpc3Bfc2l6ZSA9IDE7Ci0gICAgICBpbnN0X3NpemUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKFNDQl9GLCBCWVRFX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX1RTVCwgQllURV9ESVNQKToKLSAgICAgIGRpc3Bfc2l6ZSA9IDE7Ci0gICAgICBpbnN0X3NpemUgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIEJyYW5jaGVzIHRvIGEga25vd24gMTYgYml0IGRpc3BsYWNlbWVudCAqLwotCi0gICAgICAvKiBUdXJuIG9uIHRoZSAxNmJpdCBiaXQgKi8KLSAgICBjYXNlIEMgKEJSQU5DSCwgV09SRF9ESVNQKToKLSAgICBjYXNlIEMgKFNDQl9GLCBXT1JEX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX1RTVCwgV09SRF9ESVNQKToKLSAgICAgIHdvcmRpZnlfc2NiIChidWZmZXIsICZkaXNwX3NpemUsICZpbnN0X3NpemUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKEJSQU5DSCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICBjYXNlIEMgKFNDQl9GLCBVTkRFRl9XT1JEX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX1RTVCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIC8qIFRoaXMgdHJpZWQgdG8gYmUgcmVsYXhlZCwgYnV0IGRpZG4ndCBtYW5hZ2UgaXQsIGl0IG5vdyBuZWVkcyBhCi0JIGZpeCAqLwotICAgICAgd29yZGlmeV9zY2IgKGJ1ZmZlciwgJmRpc3Bfc2l6ZSwgJmluc3Rfc2l6ZSk7Ci0KLSAgICAgIC8qIE1ha2UgYSByZWxvYyAqLwotICAgICAgZml4X25ldyAoZnJhZ1AsCi0JICAgICAgIGZyYWdQLT5mcl9maXggKyBpbnN0X3NpemUsCi0JICAgICAgIDQsCi0JICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsCi0JICAgICAgIDAsCi0JICAgICAgIFJfSDg1MDBfUENSRUwxNik7Ci0KLSAgICAgIGZyYWdQLT5mcl9maXggKz0gZGlzcF9zaXplICsgaW5zdF9zaXplOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBpZiAoaW5zdF9zaXplKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbiAqLwotICAgICAgaW50IG5leHRfaW5zdCA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfYWRkcmVzcyArIGRpc3Bfc2l6ZSArIGluc3Rfc2l6ZTsKLSAgICAgIGludCB0YXJnX2FkZHIgPSAoU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsKLQkJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQpOwotICAgICAgaW50IGRpc3AgPSB0YXJnX2FkZHIgLSBuZXh0X2luc3Q7Ci0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmZmVyICsgaW5zdF9zaXplLCBkaXNwLCBkaXNwX3NpemUpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBkaXNwX3NpemUgKyBpbnN0X3NpemU7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICB9Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBzaXplKQotICAgICBzZWdUIHNlZyA7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICByZXR1cm4gKChzaXplICsgKDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkgLSAxKSAKLQkgICYgKC0xIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pKTsKLQotfQotCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICBpZiAoZml4UC0+Znhfcl90eXBlID09IDApCi0gICAgewotICAgICAgZml4UC0+Znhfcl90eXBlID0gZml4UC0+Znhfc2l6ZSA9PSA0ID8gUl9IODUwMF9JTU0zMiA6IFJfSDg1MDBfSU1NMTY7Ci0gICAgfQotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLQotICAgIGNhc2UgUl9IODUwMF9JTU04OgotICAgIGNhc2UgUl9IODUwMF9QQ1JFTDg6Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMTY6Ci0gICAgY2FzZSBSX0g4NTAwX0xPVzE2OgotICAgIGNhc2UgUl9IODUwMF9QQ1JFTDE2OgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9ISUdIODoKLSAgICAgICpidWYrKyA9IHZhbCA+PiAxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9ISUdIMTY6Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMjQ7Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMjQ6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMzI6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDI0KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIH0KLX0KLQotLyoKLWNhbGxlZCBqdXN0IGJlZm9yZSBhZGRyZXNzIHJlbGF4YXRpb24sIHJldHVybiB0aGUgbGVuZ3RoCi1ieSB3aGljaCBhIGZyYWdtZW50IG11c3QgZ3JvdyB0byByZWFjaCBpdCdzIGRlc3RpbmF0aW9uCi0qLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgaW50IHdoYXQgPSBHRVRfV0hBVCAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIEMgKEJSQU5DSCwgVU5ERUZfQllURV9ESVNQKToKLSAgICBjYXNlIEMgKFNDQl9GLCBVTkRFRl9CWVRFX0RJU1ApOgotICAgIGNhc2UgQyAoU0NCX1RTVCwgVU5ERUZfQllURV9ESVNQKToKLSAgICAgIC8qIHVzZWQgdG8gYmUgYSBicmFuY2ggdG8gc29tZXdoZXJlIHdoaWNoIHdhcyB1bmtub3duICovCi0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIC8qIEdvdCBhIHN5bWJvbCBhbmQgaXQncyBkZWZpbmVkIGluIHRoaXMgc2VnbWVudCwgYmVjb21lIGJ5dGUKLQkgc2l6ZWQgLSBtYXliZSBpdCB3aWxsIGZpeCB1cCAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDICh3aGF0LCBCWVRFX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIEJZVEVfRElTUCldLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEl0cyBnb3QgYSBzZWdtZW50LCBidXQgaXRzIG5vdCBvdXJzLCBzbyBpdCB3aWxsIGFsd2F5cyBiZSBsb25nICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aDsKLQkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoOwotCX0KLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyOwotfQotCi0vKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIHVzZSwgbmJ5dGVzKQotICAgICBjaGFyICpwdHI7Ci0gICAgIHZhbHVlVCB1c2U7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOwotfQotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotLypBUkdTVVNFRCovCi12b2lkCi10Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKGlnbm9yZSkKLSAgICAgc3ltYm9sUyAqaWdub3JlOwotewotfQotCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeF9wdHIpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci17Ci0gIGlmIChmaXhfcHRyLT5meF9yX3R5cGUgPT0gUkVMT0NfMzIpCi0gICAgewotICAgICAgLyogY29ucyBsaWtlcyB0byBjcmVhdGUgcmVsb2MzMidzIHdoYXRldmVyIHRoZSBzaXplIG9mIHRoZSByZWxvYy4uCi0gICAgICovCi0gICAgICBzd2l0Y2ggKGZpeF9wdHItPmZ4X3NpemUpCi0JewotCWNhc2UgMjoKLQkgIHJldHVybiBSX0g4NTAwX0lNTTE2OwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgcmV0dXJuIFJfSDg1MDBfSU1NODsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICByZXR1cm4gZml4X3B0ci0+Znhfcl90eXBlOwotfQotCi12b2lkCi10Y19yZWxvY19tYW5nbGUgKGZpeF9wdHIsIGludHIsIGJhc2UpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKLSAgICAgYmZkX3ZtYSBiYXNlOwotCi17Ci0gIHN5bWJvbFMgKnN5bWJvbF9wdHI7Ci0KLSAgc3ltYm9sX3B0ciA9IGZpeF9wdHItPmZ4X2FkZHN5OwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyBhdHRhY2hlZCB0byBhIHN5bWJvbCB0aGVuIGl0J3Mgb2sKLSAgICAgdG8gb3V0cHV0IGl0ICovCi0gIGlmIChmaXhfcHRyLT5meF9yX3R5cGUgPT0gUkVMT0NfMzIpCi0gICAgewotICAgICAgLyogY29ucyBsaWtlcyB0byBjcmVhdGUgcmVsb2MzMidzIHdoYXRldmVyIHRoZSBzaXplIG9mIHRoZSByZWxvYy4uCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoZml4X3B0ci0+Znhfc2l6ZSkKLQl7Ci0JY2FzZSAyOgotCSAgaW50ci0+cl90eXBlID0gUl9JTU0xNjsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIGludHItPnJfdHlwZSA9IFJfSU1NODsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ci0+cl90eXBlID0gZml4X3B0ci0+Znhfcl90eXBlOwotICAgIH0KLQotICBpbnRyLT5yX3ZhZGRyID0gZml4X3B0ci0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeF9wdHItPmZ4X3doZXJlICsgYmFzZTsKLSAgaW50ci0+cl9vZmZzZXQgPSBmaXhfcHRyLT5meF9vZmZzZXQ7Ci0KLSAgLyogVHVybiB0aGUgc2VnbWVudCBvZiB0aGUgc3ltYm9sIGludG8gYW4gb2Zmc2V0LiAgKi8KLSAgaWYgKHN5bWJvbF9wdHIpCi0gICAgewotICAgICAgc3ltYm9sUyAqZG90OwotCi0gICAgICBkb3QgPSBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sX3B0cildLmRvdDsKLSAgICAgIGlmIChkb3QpCi0JewotCSAgLyoJICBpbnRyLT5yX29mZnNldCAtPQotCSAgICBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVChzeW1ib2xfcHRyKV0uc2NuaGRyLnNfcGFkZHI7Ki8KLQkgIGludHItPnJfb2Zmc2V0ICs9IFNfR0VUX1ZBTFVFIChzeW1ib2xfcHRyKTsKLQkgIGludHItPnJfc3ltbmR4ID0gZG90LT5zeV9udW1iZXI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludHItPnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOwotCX0KLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludHItPnJfc3ltbmR4ID0gLTE7Ci0gICAgfQotCi19Ci0KLQotCi1pbnQKLXN0YXJ0X2xhYmVsIChwdHIpCi0gICAgIGNoYXIgKnB0cjsKLXsKLSAgLyogQ2hlY2sgZm9yIDpzLncgKi8KLSAgaWYgKGlzYWxwaGEgKHB0clsxXSkgJiYgcHRyWzJdID09ICcuJykKLSAgICByZXR1cm4gMDsKLSAgLyogQ2hlY2sgZm9yIDpzICovCi0gIGlmIChpc2FscGhhIChwdHJbMV0pICYmICFpc2FscGhhIChwdHJbMl0pKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotCi1pbnQKLXRjX2NvZmZfc2l6ZW1hY2hkZXAgKGZyYWcpCi0gICAgIGZyYWdTICpmcmFnOwotewotICByZXR1cm4gbWRfcmVsYXhfdGFibGVbZnJhZy0+ZnJfc3VidHlwZV0ucmx4X2xlbmd0aDsKLX0KLQotLyogZW5kIG9mIHRjLWg4NTAwLmMgKi8KLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1oODUwMC5oIGIvZ2FzL2NvbmZpZy90Yy1oODUwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTUzZWMzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaDg1MDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1oODUwMC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jZGVmaW5lIFRDX0g4NTAwCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jaWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgaW50ZXJuYWxfcmVsb2M7Ci0jZW5kaWYKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIFRoaXMgbWFjcm8gdHJhbnNsYXRlcyBiZXR3ZWVuIGFuIGludGVybmFsIGZpeCBhbmQgYW4gY29mZiByZWxvYyB0eXBlICovCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIHRjX2NvZmZfZml4MnJ0eXBlKGZpeFApCi0KLSNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfaDg1MDAKLSNkZWZpbmUgQ09GRl9NQUdJQyAweDg1MDAKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKCh4KS0+ZnhfYWRkc3l8fCh4KS0+Znhfc3Vic3kpCi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0KLSNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHMsYSxiLGMpIHRjX3JlbG9jX21hbmdsZShhLGIsYykKLWV4dGVybiB2b2lkIHRjX3JlbG9jX21hbmdsZQotICBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfdm1hKSk7Ci0KLSNkZWZpbmUgRE9fTk9UX1NUUklQIDAKLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkhpdGFjaGkgSDgvNTAwIEdBUyAiCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFIDEKLSNkZWZpbmUgUkVMT0NfMzIgMTIzNAotCi0jZGVmaW5lIFRDX1NUQVJUX0xBQkVMKGNoLCBwdHIpICAoY2ggPT0gJzonICYmIHN0YXJ0X2xhYmVsKHB0cikpCi0jZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoZnJhZykgdGNfY29mZl9zaXplbWFjaGRlcChmcmFnKQotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyogZW5kIG9mIHRjLWg4NTAwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaHBwYS5jIGIvZ2FzL2NvbmZpZy90Yy1ocHBhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTMyNzMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1ocHBhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NDIxICswLDAgQEAKLS8qIHRjLWhwcGEuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIFBBCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIEhQIFBBLVJJU0Mgc3VwcG9ydCB3YXMgY29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZQotICAgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaC4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgImJmZC9saWJocHBhLmgiCi0jaW5jbHVkZSAiYmZkL2xpYmJmZC5oIgotCi0vKiBCZSBjYXJlZnVsLCB0aGlzIGZpbGUgaW5jbHVkZXMgZGF0YSAqZGVjbGFyYXRpb25zKi4gICovCi0jaW5jbHVkZSAib3Bjb2RlL2hwcGEuaCIKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpICYmIGRlZmluZWQgKE9CSl9TT00pCi1lcnJvciBvbmx5IG9uZSBvZiBPQkpfRUxGIGFuZCBPQkpfU09NIGNhbiBiZSBkZWZpbmVkCi0jZW5kaWYKLQotLyogSWYgd2UgYXJlIHVzaW5nIEVMRiwgdGhlbiB3ZSBwcm9iYWJseSBjYW4gc3VwcG9ydCBkd2FyZjIgZGVidWcKLSAgIHJlY29yZHMuICBGdXJ0aGVybW9yZSwgaWYgd2UgYXJlIHN1cHBvcnRpbmcgZHdhcmYyIGRlYnVnIHJlY29yZHMsCi0gICB0aGVuIHdlIHdhbnQgdG8gdXNlIHRoZSBhc3NlbWJsZXIgc3VwcG9ydCBmb3IgY29tcGFjdCBsaW5lIG51bWJlcnMuICAqLwotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJkd2FyZjJkYmcuaCIKLXN0cnVjdCBkd2FyZjJfbGluZV9pbmZvIGRlYnVnX2xpbmU7Ci0jZW5kaWYKLQotLyogQSAiY29udmllbnQiIHBsYWNlIHRvIHB1dCBvYmplY3QgZmlsZSBkZXBlbmRlbmNpZXMgd2hpY2ggZG8KLSAgIG5vdCBuZWVkIHRvIGJlIHNlZW4gb3V0c2lkZSBvZiB0Yy1ocHBhLmMuICAqLwotI2lmZGVmIE9CSl9FTEYKLS8qIE9iamVjdCBmaWxlIGZvcm1hdHMgc3BlY2lmeSByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLXR5cGVkZWYgZWxmX2hwcGFfcmVsb2NfdHlwZSByZWxvY190eXBlOwotCi0vKiBPYmplY3QgZmlsZSBmb3JtYXRzIHNwZWNpZnkgQkZEIHN5bWJvbCB0eXBlcy4gICovCi10eXBlZGVmIGVsZl9zeW1ib2xfdHlwZSBvYmpfc3ltYm9sX3R5cGU7Ci0KLSNpZmRlZiBCRkQ2NAotLyogSG93IHRvIGdlbmVyYXRlIGEgcmVsb2NhdGlvbi4gICovCi0jZGVmaW5lIGhwcGFfZ2VuX3JlbG9jX3R5cGUgX2JmZF9lbGY2NF9ocHBhX2dlbl9yZWxvY190eXBlCi0jZWxzZQotI2RlZmluZSBocHBhX2dlbl9yZWxvY190eXBlIF9iZmRfZWxmMzJfaHBwYV9nZW5fcmVsb2NfdHlwZQotI2VuZGlmCi0KLS8qIEVMRiBvYmplY3RzIGNhbiBoYXZlIHZlcnNpb25zLCBidXQgYXBwYXJlbnRseSBkbyBub3QgaGF2ZSBhbnl3aGVyZQotICAgdG8gc3RvcmUgYSBjb3B5cmlnaHQgc3RyaW5nLiAgKi8KLSNkZWZpbmUgb2JqX3ZlcnNpb24gb2JqX2VsZl92ZXJzaW9uCi0jZGVmaW5lIG9ial9jb3B5cmlnaHQgb2JqX2VsZl92ZXJzaW9uCi0KLSNkZWZpbmUgVU5XSU5EX1NFQ1RJT05fTkFNRSAiLlBBUklTQy51bndpbmQiCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9TT00KLS8qIE5hbWVzIG9mIHZhcmlvdXMgZGVidWdnaW5nIHNwYWNlcy9zdWJzcGFjZXMuICAqLwotI2RlZmluZSBHREJfREVCVUdfU1BBQ0VfTkFNRSAiJEdEQl9ERUJVRyQiCi0jZGVmaW5lIEdEQl9TVFJJTkdTX1NVQlNQQUNFX05BTUUgIiRHREJfU1RSSU5HUyQiCi0jZGVmaW5lIEdEQl9TWU1CT0xTX1NVQlNQQUNFX05BTUUgIiRHREJfU1lNQk9MUyQiCi0jZGVmaW5lIFVOV0lORF9TRUNUSU9OX05BTUUgIiRVTldJTkQkIgotCi0vKiBPYmplY3QgZmlsZSBmb3JtYXRzIHNwZWNpZnkgcmVsb2NhdGlvbiB0eXBlcy4gICovCi10eXBlZGVmIGludCByZWxvY190eXBlOwotCi0vKiBTT00gb2JqZWN0cyBjYW4gaGF2ZSBib3RoIGEgdmVyc2lvbiBzdHJpbmcgYW5kIGEgY29weXJpZ2h0IHN0cmluZy4gICovCi0jZGVmaW5lIG9ial92ZXJzaW9uIG9ial9zb21fdmVyc2lvbgotI2RlZmluZSBvYmpfY29weXJpZ2h0IG9ial9zb21fY29weXJpZ2h0Ci0KLS8qIEhvdyB0byBnZW5lcmF0ZSBhIHJlbG9jYXRpb24uICAqLwotI2RlZmluZSBocHBhX2dlbl9yZWxvY190eXBlIGhwcGFfc29tX2dlbl9yZWxvY190eXBlCi0KLS8qIE9iamVjdCBmaWxlIGZvcm1hdHMgc3BlY2lmeSBCRkQgc3ltYm9sIHR5cGVzLiAgKi8KLXR5cGVkZWYgc29tX3N5bWJvbF90eXBlIG9ial9zeW1ib2xfdHlwZTsKLQotLyogVGhpcyBhcHBhcmVudGx5IGlzbid0IGluIG9sZGVyIHZlcnNpb25zIG9mIGhwdXggcmVsb2MuaC4gICovCi0jaWZuZGVmIFJfRExUX1JFTAotI2RlZmluZSBSX0RMVF9SRUwgMHg3OAotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBSX04wU0VMCi0jZGVmaW5lIFJfTjBTRUwgMHhkOAotI2VuZGlmCi0KLSNpZm5kZWYgUl9OMVNFTAotI2RlZmluZSBSX04xU0VMIDB4ZDkKLSNlbmRpZgotCi0vKiBWYXJpb3VzIHN0cnVjdHVyZXMgYW5kIHR5cGVzIHVzZWQgaW50ZXJuYWxseSBpbiB0Yy1ocHBhLmMuICAqLwotCi0vKiBVbndpbmQgdGFibGUgYW5kIGRlc2NyaXB0b3IuICBGSVhNRTogU3luYyB0aGlzIHdpdGggR0RCIHZlcnNpb24uICAqLwotCi1zdHJ1Y3QgdW53aW5kX2Rlc2MKLSAgewotICAgIHVuc2lnbmVkIGludCBjYW5ub3RfdW53aW5kOjE7Ci0gICAgdW5zaWduZWQgaW50IG1pbGxpY29kZToxOwotICAgIHVuc2lnbmVkIGludCBtaWxsaWNvZGVfc2F2ZV9yZXN0OjE7Ci0gICAgdW5zaWduZWQgaW50IHJlZ2lvbl9kZXNjOjI7Ci0gICAgdW5zaWduZWQgaW50IHNhdmVfc3I6MjsKLSAgICB1bnNpZ25lZCBpbnQgZW50cnlfZnI6NDsKLSAgICB1bnNpZ25lZCBpbnQgZW50cnlfZ3I6NTsKLSAgICB1bnNpZ25lZCBpbnQgYXJnc19zdG9yZWQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgY2FsbF9mcjo1OwotICAgIHVuc2lnbmVkIGludCBjYWxsX2dyOjU7Ci0gICAgdW5zaWduZWQgaW50IHNhdmVfc3A6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2F2ZV9ycDoxOwotICAgIHVuc2lnbmVkIGludCBzYXZlX3JwX2luX2ZyYW1lOjE7Ci0gICAgdW5zaWduZWQgaW50IGV4dG5fcHRyX2RlZmluZWQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgY2xlYW51cF9kZWZpbmVkOjE7Ci0KLSAgICB1bnNpZ25lZCBpbnQgaHBlX2ludGVycnVwdF9tYXJrZXI6MTsKLSAgICB1bnNpZ25lZCBpbnQgaHB1eF9pbnRlcnJ1cHRfbWFya2VyOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc2VydmVkOjM7Ci0gICAgdW5zaWduZWQgaW50IGZyYW1lX3NpemU6Mjc7Ci0gIH07Ci0KLXN0cnVjdCB1bndpbmRfdGFibGUKLSAgewotICAgIC8qIFN0YXJ0aW5nIGFuZCBlbmRpbmcgb2Zmc2V0cyBvZiB0aGUgcmVnaW9uIGRlc2NyaWJlZCBieQotICAgICAgIGRlc2NyaXB0b3IuICAqLwotICAgIHVuc2lnbmVkIGludCBzdGFydF9vZmZzZXQ7Ci0gICAgdW5zaWduZWQgaW50IGVuZF9vZmZzZXQ7Ci0gICAgc3RydWN0IHVud2luZF9kZXNjIGRlc2NyaXB0b3I7Ci0gIH07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgdGhlIC5jYWxsaW5mbywgLmVudGVyLCAubGVhdmUgcHNldWRvLW9wcyB0bwotICAgY29udHJvbCB0aGUgZW50cnkgYW5kIGV4aXQgY29kZSB0aGV5IGdlbmVyYXRlLiBJdCBpcyBhbHNvIHVzZWQgaW4KLSAgIGNyZWF0aW9uIG9mIHRoZSBjb3JyZWN0IHN0YWNrIHVud2luZCBkZXNjcmlwdG9ycy4KLQotICAgTk9URTogIEdBUyBkb2VzIG5vdCBzdXBwb3J0IC5lbnRlciBhbmQgLmxlYXZlIGZvciB0aGUgZ2VuZXJhdGlvbiBvZgotICAgcHJvbG9ndWVzIGFuZCBlcGlsb2d1ZXMuICBGSVhNRS4KLQotICAgVGhlIGZpZWxkcyBpbiBzdHJ1Y3R1cmUgcm91Z2hseSBjb3JyZXNwb25kIHRvIHRoZSBhcmd1bWVudHMgYXZhaWxhYmxlIG9uIHRoZQotICAgLmNhbGxpbmZvIHBzZXVkby1vcC4gICovCi0KLXN0cnVjdCBjYWxsX2luZm8KLSAgewotICAgIC8qIFRoZSB1bndpbmQgZGVzY3JpcHRvciBiZWluZyBidWlsdC4gICovCi0gICAgc3RydWN0IHVud2luZF90YWJsZSBjaV91bndpbmQ7Ci0KLSAgICAvKiBOYW1lIG9mIHRoaXMgZnVuY3Rpb24uICAqLwotICAgIHN5bWJvbFMgKnN0YXJ0X3N5bWJvbDsKLQotICAgIC8qICh0ZW1wb3JhcnkpIHN5bWJvbCB1c2VkIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uLiAgKi8KLSAgICBzeW1ib2xTICplbmRfc3ltYm9sOwotCi0gICAgLyogTmV4dCBlbnRyeSBpbiB0aGUgY2hhaW4uICAqLwotICAgIHN0cnVjdCBjYWxsX2luZm8gKmNpX25leHQ7Ci0gIH07Ci0KLS8qIE9wZXJhbmQgZm9ybWF0cyBmb3IgRlAgaW5zdHJ1Y3Rpb25zLiAgIE5vdGUgbm90IGFsbCBGUCBpbnN0cnVjdGlvbnMKLSAgIGFsbG93IGFsbCBmb3VyIGZvcm1hdHMgdG8gYmUgdXNlZCAoZm9yIGV4YW1wbGUgZm1weXN1YiBvbmx5IGFsbG93cwotICAgU0dMIGFuZCBEQkwpLiAgKi8KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgU0dMLCBEQkwsIElMTEVHQUxfRk1ULCBRVUFELCBXLCBVVywgRFcsIFVEVywgUVcsIFVRVwotICB9Ci1mcF9vcGVyYW5kX2Zvcm1hdDsKLQotLyogVGhpcyBmdWxseSBkZXNjcmliZXMgdGhlIHN5bWJvbCB0eXBlcyB3aGljaCBtYXkgYmUgYXR0YWNoZWQgdG8KLSAgIGFuIEVYUE9SVCBvciBJTVBPUlQgZGlyZWN0aXZlLiAgT25seSBTT00gdXNlcyB0aGlzIGZvcm1hdGlvbgotICAgKEVMRiBoYXMgbm8gbmVlZCBmb3IgaXQpLiAgKi8KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgU1lNQk9MX1RZUEVfVU5LTk9XTiwKLSAgICBTWU1CT0xfVFlQRV9BQlNPTFVURSwKLSAgICBTWU1CT0xfVFlQRV9DT0RFLAotICAgIFNZTUJPTF9UWVBFX0RBVEEsCi0gICAgU1lNQk9MX1RZUEVfRU5UUlksCi0gICAgU1lNQk9MX1RZUEVfTUlMTElDT0RFLAotICAgIFNZTUJPTF9UWVBFX1BMQUJFTCwKLSAgICBTWU1CT0xfVFlQRV9QUklfUFJPRywKLSAgICBTWU1CT0xfVFlQRV9TRUNfUFJPRywKLSAgfQotcGFfc3ltYm9sX3R5cGU7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9uIG5lZWRlZCB0byBhc3NlbWJsZQotICAgaW5kaXZpZHVhbCBpbnN0cnVjdGlvbnMuICAqLwotc3RydWN0IHBhX2l0Ci0gIHsKLSAgICAvKiBIb2xkcyB0aGUgb3Bjb2RlIGFmdGVyIHBhcnNpbmcgYnkgcGFfaXAuICAqLwotICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gICAgLyogSG9sZHMgYW4gZXhwcmVzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICAqLwotICAgIGV4cHJlc3Npb25TIGV4cDsKLQotICAgIC8qIERvZXMgdGhpcyBpbnN0cnVjdGlvbiB1c2UgUEMtcmVsYXRpdmUgYWRkcmVzc2luZy4gICovCi0gICAgaW50IHBjcmVsOwotCi0gICAgLyogRmxvYXRpbmcgcG9pbnQgZm9ybWF0cyBmb3Igb3BlcmFuZDEgYW5kIG9wZXJhbmQyLiAgKi8KLSAgICBmcF9vcGVyYW5kX2Zvcm1hdCBmcG9mMTsKLSAgICBmcF9vcGVyYW5kX2Zvcm1hdCBmcG9mMjsKLQotICAgIC8qIFdoZXRoZXIgb3Igbm90IHdlIHNhdyBhIHRydW5jYXRpb24gcmVxdWVzdCBvbiBhbiBmY252IGluc24uICAqLwotICAgIGludCB0cnVuYzsKLQotICAgIC8qIEhvbGRzIHRoZSBmaWVsZCBzZWxlY3RvciBmb3IgdGhpcyBpbnN0cnVjdGlvbgotICAgICAgIChmb3IgZXhhbXBsZSBMJSwgTFIlLCBldGMpLiAgKi8KLSAgICBsb25nIGZpZWxkX3NlbGVjdG9yOwotCi0gICAgLyogSG9sZHMgYW55IGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAgIGluc3RydWN0aW9uLiAgKGluc3RydWN0aW9uIHNob3VsZCBiZSBzb21lIHNvcnQgb2YgY2FsbCkuICAqLwotICAgIGxvbmcgYXJnX3JlbG9jOwotCi0gICAgLyogVGhlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KLSAgICBpbnQgZm9ybWF0OwotCi0gICAgLyogVGhlIHJlbG9jYXRpb24gKGlmIGFueSkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotICAgIHJlbG9jX3R5cGUgcmVsb2M7Ci0gIH07Ci0KLS8qIFBBLTg5IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBhcmUgYXJyYW5nZWQgbGlrZSB0aGlzOgotCi0KLSAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLSAgIHwgICAwIG9yIDE2TCAgIHwgIDE2IG9yIDE2UiAgIHwKLSAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLSAgIHwgICAxIG9yIDE3TCAgIHwgIDE3IG9yIDE3UiAgIHwKLSAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLSAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKLQotICAgLiAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgLgotICAgLiAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgLgotICAgLiAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgLgotCi0gICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICB8ICAxNCBvciAzMEwgICB8ICAzMCBvciAzMFIgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICB8ICAxNSBvciAzMUwgICB8ICAzMSBvciAzMVIgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0KLQotICAgVGhlIGZvbGxvd2luZyBpcyBhIHZlcnNpb24gb2YgcGFfcGFyc2VfbnVtYmVyIHRoYXQKLSAgIGhhbmRsZXMgdGhlIEwvUiBub3RhdGlvbiBhbmQgcmV0dXJucyB0aGUgY29ycmVjdAotICAgdmFsdWUgdG8gcHV0IGludG8gdGhlIGluc3RydWN0aW9uIHJlZ2lzdGVyIGZpZWxkLgotICAgVGhlIGNvcnJlY3QgdmFsdWUgdG8gcHV0IGludG8gdGhlIGluc3RydWN0aW9uIGlzCi0gICBlbmNvZGVkIGluIHRoZSBzdHJ1Y3R1cmUgJ3BhXzExX2ZwX3JlZ19zdHJ1Y3QnLiAgKi8KLQotc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QKLSAgewotICAgIC8qIFRoZSByZWdpc3RlciBudW1iZXIuICAqLwotICAgIGNoYXIgbnVtYmVyX3BhcnQ7Ci0KLSAgICAvKiBML1Igc2VsZWN0b3IuICAqLwotICAgIGNoYXIgbF9yX3NlbGVjdDsKLSAgfTsKLQotLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYnVpbGQgYXJndW1lbnQgcmVsb2NhdGlvbiBzdHVicy4gICovCi1zdHJ1Y3QgY2FsbF9kZXNjCi0gIHsKLSAgICAvKiBUaGUgYXJndW1lbnQgcmVsb2NhdGlvbiBzcGVjaWZpY2F0aW9uLiAgKi8KLSAgICB1bnNpZ25lZCBpbnQgYXJnX3JlbG9jOwotCi0gICAgLyogTnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCi0gICAgdW5zaWduZWQgaW50IGFyZ19jb3VudDsKLSAgfTsKLQotI2lmZGVmIE9CSl9TT00KLS8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gZW50cnkgaW4gdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkKLSAgIGNoYWluLiAgKi8KLQotc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4KLSAgewotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzcGFjZSBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSB1c2VyIGNvZGUuICAqLwotICAgIHVuc2lnbmVkIGludCBzc2RfZGVmaW5lZDsKLQotICAgIC8qIE5hbWUgb2YgdGhpcyBzdWJzcGFjZS4gICovCi0gICAgY2hhciAqc3NkX25hbWU7Ci0KLSAgICAvKiBHQVMgc2VnbWVudCBhbmQgc3Vic2VnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJzcGFjZS4gICovCi0gICAgYXNlY3Rpb24gKnNzZF9zZWc7Ci0gICAgaW50IHNzZF9zdWJzZWc7Ci0KLSAgICAvKiBOZXh0IHNwYWNlIGluIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5IGNoYWluLiAgKi8KLSAgICBzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbiAqc3NkX25leHQ7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gc3NkX2NoYWluX3N0cnVjdDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBlbnRyeSBpbiB0aGUgc3Vic3BhY2UgZGljdGlvbmFyeQotICAgY2hhaW4uICAqLwotCi1zdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9jaGFpbgotICB7Ci0gICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGhhcyBiZWVuIGRlZmluZWQgYnkgdGhlIHVzZXIgY29kZSBvcgotICAgICAgIGFzIGEgZGVmYXVsdCBzcGFjZS4gICovCi0gICAgdW5zaWduZWQgaW50IHNkX2RlZmluZWQ7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2VzIGhhcyBiZWVuIGRlZmluZWQgYnkgdGhlIHVzZXIgY29kZS4gICovCi0gICAgdW5zaWduZWQgaW50IHNkX3VzZXJfZGVmaW5lZDsKLQotICAgIC8qIFRoZSBzcGFjZSBudW1iZXIgKG9yIGluZGV4KS4gICovCi0gICAgdW5zaWduZWQgaW50IHNkX3NwbnVtOwotCi0gICAgLyogVGhlIG5hbWUgb2YgdGhpcyBzdWJzcGFjZS4gICovCi0gICAgY2hhciAqc2RfbmFtZTsKLQotICAgIC8qIEdBUyBzZWdtZW50IHRvIHdoaWNoIHRoaXMgc3Vic3BhY2UgY29ycmVzcG9uZHMuICAqLwotICAgIGFzZWN0aW9uICpzZF9zZWc7Ci0KLSAgICAvKiBDdXJyZW50IHN1YnNlZ21lbnQgbnVtYmVyIGJlaW5nIHVzZWQuICAqLwotICAgIGludCBzZF9sYXN0X3N1YnNlZzsKLQotICAgIC8qIFRoZSBjaGFpbiBvZiBzdWJzcGFjZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwYWNlLiAgKi8KLSAgICBzc2RfY2hhaW5fc3RydWN0ICpzZF9zdWJzcGFjZXM7Ci0KLSAgICAvKiBUaGUgbmV4dCBlbnRyeSBpbiB0aGUgc3BhY2UgZGljdGlvbmFyeSBjaGFpbi4gICovCi0gICAgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gKnNkX25leHQ7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gc2RfY2hhaW5fc3RydWN0OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGF0dHJpYnV0ZXMgb2YgdGhlIGRlZmF1bHQgc3Vic3BhY2UKLSAgIGRpY3Rpb25hcnkgZW50cmllcy4gICovCi0KLXN0cnVjdCBkZWZhdWx0X3N1YnNwYWNlX2RpY3QKLSAgewotICAgIC8qIE5hbWUgb2YgdGhlIHN1YnNwYWNlLiAgKi8KLSAgICBjaGFyICpuYW1lOwotCi0gICAgLyogRklYTUUuICBJcyB0aGlzIHN0aWxsIG5lZWRlZD8gICovCi0gICAgY2hhciBkZWZpbmVkOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIGlzIGxvYWRhYmxlLiAgKi8KLSAgICBjaGFyIGxvYWRhYmxlOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIGNvbnRhaW5zIG9ubHkgY29kZS4gICovCi0gICAgY2hhciBjb2RlX29ubHk7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBjb21tb24gc3Vic3BhY2UuICAqLwotICAgIGNoYXIgY29tbW9uOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEgY29tbW9uIHN1YnNwYWNlIHdoaWNoIGFsbG93cyBzeW1ib2xzCi0gICAgICAgdG8gYmUgbXVsdGlwbHkgZGVmaW5lZC4gICovCi0gICAgY2hhciBkdXBfY29tbW9uOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIHNob3VsZCBiZSB6ZXJvIGZpbGxlZC4gICovCi0gICAgY2hhciB6ZXJvOwotCi0gICAgLyogU29ydCBrZXkgZm9yIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIHVuc2lnbmVkIGNoYXIgc29ydDsKLQotICAgIC8qIEFjY2VzcyBjb250cm9sIGJpdHMgZm9yIHRoaXMgc3Vic3BhY2UuICBDYW4gcmVwcmVzZW50IFJXWCBhY2Nlc3MKLSAgICAgICBhcyB3ZWxsIGFzIHByaXZpbGVnZSBsZXZlbCBjaGFuZ2VzIGZvciBnYXRld2F5cy4gICovCi0gICAgaW50IGFjY2VzczsKLQotICAgIC8qIEluZGV4IG9mIGNvbnRhaW5pbmcgc3BhY2UuICAqLwotICAgIGludCBzcGFjZV9pbmRleDsKLQotICAgIC8qIEFsaWdubWVudCAoaW4gYnl0ZXMpIG9mIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIGludCBhbGlnbm1lbnQ7Ci0KLSAgICAvKiBRdWFkcmFudCB3aXRoaW4gc3BhY2Ugd2hlcmUgdGhpcyBzdWJzcGFjZSBzaG91bGQgYmUgbG9hZGVkLiAgKi8KLSAgICBpbnQgcXVhZHJhbnQ7Ci0KLSAgICAvKiBBbiBpbmRleCBpbnRvIHRoZSBkZWZhdWx0IHNwYWNlcyBhcnJheS4gICovCi0gICAgaW50IGRlZl9zcGFjZV9pbmRleDsKLQotICAgIC8qIFN1YnNlZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIHN1YnNlZ1Qgc3Vic2VnbWVudDsKLSAgfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhdHRyaWJ1dGVzIG9mIHRoZSBkZWZhdWx0IHNwYWNlCi0gICBkaWN0aW9uYXJ5IGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgZGVmYXVsdF9zcGFjZV9kaWN0Ci0gIHsKLSAgICAvKiBOYW1lIG9mIHRoZSBzcGFjZS4gICovCi0gICAgY2hhciAqbmFtZTsKLQotICAgIC8qIFNwYWNlIG51bWJlci4gIEl0IGlzIHBvc3NpYmxlIHRvIGlkZW50aWZ5IHNwYWNlcyB3aXRoaW4KLSAgICAgICBhc3NlbWJseSBjb2RlIG51bWVyaWNhbGx5ISAgKi8KLSAgICBpbnQgc3BudW07Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2UgaXMgbG9hZGFibGUuICAqLwotICAgIGNoYXIgbG9hZGFibGU7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2UgaXMgImRlZmluZWQiLiAgRklYTUUgaXMgc3RpbGwgbmVlZGVkICovCi0gICAgY2hhciBkZWZpbmVkOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGNhbiBub3QgYmUgc2hhcmVkLiAgKi8KLSAgICBjaGFyIHByaXZhdGU7Ci0KLSAgICAvKiBTb3J0IGtleSBmb3IgdGhpcyBzcGFjZS4gICovCi0gICAgdW5zaWduZWQgY2hhciBzb3J0OwotCi0gICAgLyogU2VnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzcGFjZS4gICovCi0gICAgYXNlY3Rpb24gKnNlZ21lbnQ7Ci0gIH07Ci0jZW5kaWYKLQotLyogU3RydWN0dXJlIGZvciBwcmV2aW91cyBsYWJlbCB0cmFja2luZy4gIE5lZWRlZCBzbyB0aGF0IGFsaWdubWVudHMsCi0gICBjYWxsaW5mbyBkZWNsYXJhdGlvbnMsIGV0YyBjYW4gYmUgZWFzaWx5IGF0dGFjaGVkIHRvIGEgcGFydGljdWxhcgotICAgbGFiZWwuICAqLwotdHlwZWRlZiBzdHJ1Y3QgbGFiZWxfc3ltYm9sX3N0cnVjdAotICB7Ci0gICAgc3RydWN0IHN5bWJvbCAqbHNzX2xhYmVsOwotI2lmZGVmIE9CSl9TT00KLSAgICBzZF9jaGFpbl9zdHJ1Y3QgKmxzc19zcGFjZTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBzZWdUIGxzc19zZWdtZW50OwotI2VuZGlmCi0gICAgc3RydWN0IGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxzc19uZXh0OwotICB9Ci1sYWJlbF9zeW1ib2xfc3RydWN0OwotCi0vKiBFeHRyYSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcGVyZm9ybSBmaXh1cHMgKHJlbG9jYXRpb25zKSBvbiB0aGUgUEEuICAqLwotc3RydWN0IGhwcGFfZml4X3N0cnVjdAotICB7Ci0gICAgLyogVGhlIGZpZWxkIHNlbGVjdG9yLiAgKi8KLSAgICBlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQgZnhfcl9maWVsZDsKLQotICAgIC8qIFR5cGUgb2YgZml4dXAuICAqLwotICAgIGludCBmeF9yX3R5cGU7Ci0KLSAgICAvKiBGb3JtYXQgb2YgZml4dXAuICAqLwotICAgIGludCBmeF9yX2Zvcm1hdDsKLQotICAgIC8qIEFyZ3VtZW50IHJlbG9jYXRpb24gYml0cy4gICovCi0gICAgbG9uZyBmeF9hcmdfcmVsb2M7Ci0KLSAgICAvKiBUaGUgc2VnbWVudCB0aGlzIGZpeHVwIGFwcGVhcnMgaW4uICAqLwotICAgIHNlZ1Qgc2VnbWVudDsKLSAgfTsKLQotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotCi1zdHJ1Y3QgcGRfcmVnCi0gIHsKLSAgICBjaGFyICpuYW1lOwotICAgIGludCB2YWx1ZTsKLSAgfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgbWFwcGluZyBmcm9tIGEgRlAgY29uZGl0aW9uIHN0cmluZwotICAgdG8gYSBjb25kaXRpb24gbnVtYmVyIHdoaWNoIGNhbiBiZSByZWNvcmRlZCBpbiBhbiBpbnN0cnVjdGlvbi4gICovCi1zdHJ1Y3QgZnBfY29uZF9tYXAKLSAgewotICAgIGNoYXIgKnN0cmluZzsKLSAgICBpbnQgY29uZDsKLSAgfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhIGZpZWxkIHNlbGVjdG9yCi0gICBzdHJpbmcgdG8gYSBmaWVsZCBzZWxlY3RvciB0eXBlLiAgKi8KLXN0cnVjdCBzZWxlY3Rvcl9lbnRyeQotICB7Ci0gICAgY2hhciAqcHJlZml4OwotICAgIGludCBmaWVsZF9zZWxlY3RvcjsKLSAgfTsKLQotLyogUHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIGxvY2FsIHRvIHRjLWhwcGEuYy4gICovCi0KLSNpZmRlZiBPQkpfU09NCi1zdGF0aWMgdm9pZCBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotc3RhdGljIGZwX29wZXJhbmRfZm9ybWF0IHBhX3BhcnNlX2ZwX2Zvcm1hdCBQQVJBTVMgKChjaGFyICoqcykpOwotc3RhdGljIHZvaWQgcGFfY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2RhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZmlsbCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2xjb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfbHN5bSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3N0cmluZ2VyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3ZlcnNpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX2ZwX2NtcF9jb25kIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgZ2V0X2V4cHJlc3Npb24gUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgaW50IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uIFBBUkFNUyAoKHN0cnVjdCBwYV9pdCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGV2YWx1YXRlX2Fic29sdXRlIFBBUkFNUyAoKHN0cnVjdCBwYV9pdCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHBhX2J1aWxkX2FyZ19yZWxvYyBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFfYWxpZ25fYXJnX3JlbG9jIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX251bGxpZiBQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0ciBQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2VfbmVnX2FkZF9jbXBsdHIgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBwYV9wYXJzZV9jbXBiXzY0X2NtcGx0ciBQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX2NtcGliXzY0X2NtcGx0ciBQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX2FkZGJfNjRfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHBhX2Jsb2NrIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfYnJ0YWIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV90cnkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9jYWxsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfY2FsbF9hcmdzIFBBUkFNUyAoKHN0cnVjdCBjYWxsX2Rlc2MgKikpOwotc3RhdGljIHZvaWQgcGFfY2FsbGluZm8gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9jb2RlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2NvcHlyaWdodCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2VuZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2VudGVyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZW50cnkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9lcXUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9leGl0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZXhwb3J0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfdHlwZV9hcmdzIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9pbXBvcnQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9sYWJlbCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2xlYXZlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfbGV2ZWwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9vcmlnaW4gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9wcm9jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfcHJvY2VuZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3BhcmFtIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfdW5kZWZpbmVfbGFiZWwgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBuZWVkX3BhMTFfb3Bjb2RlIFBBUkFNUyAoKHN0cnVjdCBwYV9pdCAqLAotCQkJCSAgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgKikpOwotc3RhdGljIGludCBwYV9wYXJzZV9udW1iZXIgUEFSQU1TICgoY2hhciAqKiwgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgKikpOwotc3RhdGljIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKnBhX2dldF9sYWJlbCBQQVJBTVMgKCh2b2lkKSk7Ci0jaWZkZWYgT0JKX1NPTQotc3RhdGljIHZvaWQgcGFfY29tcGlsZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9hbGlnbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3NwYWNlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfc3BudW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9zdWJzcGFjZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKmNyZWF0ZV9uZXdfc3BhY2UgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCwKLQkJCQkJCSAgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgYXNlY3Rpb24gKiwgaW50KSk7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqY3JlYXRlX25ld19zdWJzcGFjZSBQQVJBTVMgKChzZF9jaGFpbl9zdHJ1Y3QgKiwKLQkJCQkJCSAgICAgIGNoYXIgKiwgaW50LCBpbnQsCi0JCQkJCQkgICAgICBpbnQsIGludCwgaW50LAotCQkJCQkJICAgICAgaW50LCBpbnQsIGludCwgaW50LAotCQkJCQkJICAgICAgaW50LCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqdXBkYXRlX3N1YnNwYWNlIFBBUkFNUyAoKHNkX2NoYWluX3N0cnVjdCAqLAotCQkJCQkJICBjaGFyICosIGludCwgaW50LCBpbnQsCi0JCQkJCQkgIGludCwgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgYXNlY3Rpb24gKikpOwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqaXNfZGVmaW5lZF9zcGFjZSBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICppc19kZWZpbmVkX3N1YnNwYWNlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqcGFfc2VnbWVudF90b19zcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqLAotCQkJCQkJCSAgICBzdWJzZWdUKSk7Ci1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpwYV9maW5kX3NwYWNlX2J5X251bWJlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFfc3Vic3BhY2Vfc3RhcnQgUEFSQU1TICgoc2RfY2hhaW5fc3RydWN0ICosIGludCkpOwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqcGFfcGFyc2Vfc3BhY2Vfc3RtdCBQQVJBTVMgKChjaGFyICosIGludCkpOwotc3RhdGljIGludCBwYV9uZXh0X3N1YnNlZyBQQVJBTVMgKChzZF9jaGFpbl9zdHJ1Y3QgKikpOwotc3RhdGljIHZvaWQgcGFfc3BhY2VzX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgcGFfaXAgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBmaXhfbmV3X2hwcGEgUEFSQU1TICgoZnJhZ1MgKiwgaW50LCBpbnQsIHN5bWJvbFMgKiwKLQkJCQkgIGxvbmcsIGV4cHJlc3Npb25TICosIGludCwKLQkJCQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwKLQkJCQkgIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCwKLQkJCQkgIGludCwgbG9uZywgaW50ICopKTsKLXN0YXRpYyBpbnQgaXNfZW5kX29mX3N0YXRlbWVudCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgcGFfY2hrX2ZpZWxkX3NlbGVjdG9yIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgaXNfc2FtZV9mcmFnIFBBUkFNUyAoKGZyYWdTICosIGZyYWdTICopKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3NfZXhpdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGxvZzIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHBhX3N0cmluZ2VyX2F1eCBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBmcF9vcGVyYW5kX2Zvcm1hdCBwYV9wYXJzZV9mcF9jbnZfZm9ybWF0IFBBUkFNUyAoKGNoYXIgKipzKSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX2Z0ZXN0X2dmeF9jb21wbGV0ZXIgUEFSQU1TICgoY2hhciAqKikpOwotCi0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgcGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlIFBBUkFNUyAoKHN0cnVjdCBjYWxsX2luZm8gKikpOwotI2VuZGlmCi0KLS8qIEZpbGUgYW5kIGdsb2FsbHkgc2NvcGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4gICovCi0KLSNpZmRlZiBPQkpfU09NCi0vKiBSb290IGFuZCBmaW5hbCBlbnRyeSBpbiB0aGUgc3BhY2UgY2hhaW4uICAqLwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfZGljdF9yb290Owotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfZGljdF9sYXN0OwotCi0vKiBUaGUgY3VycmVudCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqY3VycmVudF9zcGFjZTsKLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICpjdXJyZW50X3N1YnNwYWNlOwotI2VuZGlmCi0KLS8qIFJvb3Qgb2YgdGhlIGNhbGxfaW5mbyBjaGFpbi4gICovCi1zdGF0aWMgc3RydWN0IGNhbGxfaW5mbyAqY2FsbF9pbmZvX3Jvb3Q7Ci0KLS8qIFRoZSBsYXN0IGNhbGxfaW5mbyAoZm9yIGZ1bmN0aW9ucykgc3RydWN0dXJlCi0gICBzZWVuIHNvIGl0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZml4dXBzIGFuZAotICAgZnVuY3Rpb24gbGFiZWxzLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY2FsbF9pbmZvICpsYXN0X2NhbGxfaW5mbzsKLQotLyogVGhlIGxhc3QgY2FsbCBkZXNjcmlwdGlvbiAoZm9yIGFjdHVhbCBjYWxscykuICAqLwotc3RhdGljIHN0cnVjdCBjYWxsX2Rlc2MgbGFzdF9jYWxsX2Rlc2M7Ci0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwuICAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci0KLS8qIFRhYmxlIG9mIHBzZXVkbyBvcHMgZm9yIHRoZSBQQS4gIEZJWE1FIC0tIGhvdyBtYW55IG9mIHRoZXNlCi0gICBhcmUgbm93IHJlZHVuZGFudCB3aXRoIHRoZSBvdmVyYWxsIEdBUyBhbmQgdGhlIG9iamVjdCBmaWxlCi0gICBkZXBlbmRlbnQgdGFibGVzPyAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIC8qIGFsaWduIHBzZXVkby1vcHMgb24gdGhlIFBBIHNwZWNpZnkgdGhlIGFjdHVhbCBhbGlnbm1lbnQgcmVxdWVzdGVkLAotICAgICBub3QgdGhlIGxvZzIgb2YgdGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQuICAqLwotI2lmZGVmIE9CSl9TT00KLSAgeyJhbGlnbiIsIHBhX2FsaWduLCA4fSwKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDh9LAotI2VuZGlmCi0gIHsiYmVnaW5fYnJ0YWIiLCBwYV9icnRhYiwgMX0sCi0gIHsiYmVnaW5fdHJ5IiwgcGFfdHJ5LCAxfSwKLSAgeyJibG9jayIsIHBhX2Jsb2NrLCAxfSwKLSAgeyJibG9ja3oiLCBwYV9ibG9jaywgMH0sCi0gIHsiYnl0ZSIsIHBhX2NvbnMsIDF9LAotICB7ImNhbGwiLCBwYV9jYWxsLCAwfSwKLSAgeyJjYWxsaW5mbyIsIHBhX2NhbGxpbmZvLCAwfSwKLSAgeyJjb2RlIiwgcGFfY29kZSwgMH0sCi0gIHsiY29tbSIsIHBhX2NvbW0sIDB9LAotI2lmZGVmIE9CSl9TT00KLSAgeyJjb21waWxlciIsIHBhX2NvbXBpbGVyLCAwfSwKLSNlbmRpZgotICB7ImNvcHlyaWdodCIsIHBhX2NvcHlyaWdodCwgMH0sCi0gIHsiZGF0YSIsIHBhX2RhdGEsIDB9LAotICB7ImRvdWJsZSIsIHBhX2Zsb2F0X2NvbnMsICdkJ30sCi0gIHsiZHdvcmQiLCBwYV9jb25zLCA4fSwKLSAgeyJlbmQiLCBwYV9lbmQsIDB9LAotICB7ImVuZF9icnRhYiIsIHBhX2JydGFiLCAwfSwKLSAgeyJlbmRfdHJ5IiwgcGFfdHJ5LCAwfSwKLSAgeyJlbnRlciIsIHBhX2VudGVyLCAwfSwKLSAgeyJlbnRyeSIsIHBhX2VudHJ5LCAwfSwKLSAgeyJlcXUiLCBwYV9lcXUsIDB9LAotICB7ImV4aXQiLCBwYV9leGl0LCAwfSwKLSAgeyJleHBvcnQiLCBwYV9leHBvcnQsIDB9LAotI2lmZGVmIE9CSl9FTEYKLSAgeyAiZmlsZSIsIGR3YXJmMl9kaXJlY3RpdmVfZmlsZSB9LAotI2VuZGlmCi0gIHsiZmlsbCIsIHBhX2ZpbGwsIDB9LAotICB7ImZsb2F0IiwgcGFfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJoYWxmIiwgcGFfY29ucywgMn0sCi0gIHsiaW1wb3J0IiwgcGFfaW1wb3J0LCAwfSwKLSAgeyJpbnQiLCBwYV9jb25zLCA0fSwKLSAgeyJsYWJlbCIsIHBhX2xhYmVsLCAwfSwKLSAgeyJsY29tbSIsIHBhX2xjb21tLCAwfSwKLSAgeyJsZWF2ZSIsIHBhX2xlYXZlLCAwfSwKLSAgeyJsZXZlbCIsIHBhX2xldmVsLCAwfSwKLSNpZmRlZiBPQkpfRUxGCi0gIHsgImxvYyIsIGR3YXJmMl9kaXJlY3RpdmVfbG9jIH0sCi0jZW5kaWYKLSAgeyJsb25nIiwgcGFfY29ucywgNH0sCi0gIHsibHN5bSIsIHBhX2xzeW0sIDB9LAotI2lmZGVmIE9CSl9TT00KLSAgeyJuc3Vic3BhIiwgcGFfc3Vic3BhY2UsIDF9LAotI2VuZGlmCi0gIHsib2N0YSIsIHBhX2NvbnMsIDE2fSwKLSAgeyJvcmciLCBwYV9vcmlnaW4sIDB9LAotICB7Im9yaWdpbiIsIHBhX29yaWdpbiwgMH0sCi0gIHsicGFyYW0iLCBwYV9wYXJhbSwgMH0sCi0gIHsicHJvYyIsIHBhX3Byb2MsIDB9LAotICB7InByb2NlbmQiLCBwYV9wcm9jZW5kLCAwfSwKLSAgeyJxdWFkIiwgcGFfY29ucywgOH0sCi0gIHsicmVnIiwgcGFfZXF1LCAxfSwKLSAgeyJzaG9ydCIsIHBhX2NvbnMsIDJ9LAotICB7InNpbmdsZSIsIHBhX2Zsb2F0X2NvbnMsICdmJ30sCi0jaWZkZWYgT0JKX1NPTQotICB7InNwYWNlIiwgcGFfc3BhY2UsIDB9LAotICB7InNwbnVtIiwgcGFfc3BudW0sIDB9LAotI2VuZGlmCi0gIHsic3RyaW5nIiwgcGFfc3RyaW5nZXIsIDB9LAotICB7InN0cmluZ3oiLCBwYV9zdHJpbmdlciwgMX0sCi0jaWZkZWYgT0JKX1NPTQotICB7InN1YnNwYSIsIHBhX3N1YnNwYWNlLCAwfSwKLSNlbmRpZgotICB7InRleHQiLCBwYV90ZXh0LCAwfSwKLSAgeyJ2ZXJzaW9uIiwgcGFfdmVyc2lvbiwgMH0sCi0gIHsid29yZCIsIHBhX2NvbnMsIDR9LAotICB7TlVMTCwgMCwgMH0KLX07Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQuCi0KLSAgIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuCi0KLSAgIEFsc28gbm90ZSB0aGF0IEMgc3R5bGUgY29tbWVudHMgd2lsbCBhbHdheXMgd29yay4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggYWN0IGFzIGxpbmUgc2VwYXJhdG9ycy4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiISI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zLiAgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudC4KLSAgIEFzIGluIDBmMTIuNDU2IG9yIDBkMS4yMzQ1ZTEyLgotCi0gICBCZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYWUgdG8ga25vdyBhYm91IGl0IGF0Ci0gICBhbGwsIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLiAgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotc3RhdGljIHN0cnVjdCBwYV9pdCB0aGVfaW5zbjsKLQotLyogUG9pbnRzIHRvIHRoZSBlbmQgb2YgYW4gZXhwcmVzc2lvbiBqdXN0IHBhcnNlZCBieSBnZXRfZXhwcmVzc29pbgotICAgYW5kIGZyaWVuZHMuICBGSVhNRS4gIFRoaXMgc2hvdWxkbid0IGJlIGhhbmRsZWQgd2l0aCBhIGZpbGUtZ2xvYmFsCi0gICB2YXJpYWJsZS4gICovCi1zdGF0aWMgY2hhciAqZXhwcl9lbmQ7Ci0KLS8qIE5vbnplcm8gaWYgYSAuY2FsbGluZm8gYXBwZWFyZWQgd2l0aGluIHRoZSBjdXJyZW50IHByb2NlZHVyZS4gICovCi1zdGF0aWMgaW50IGNhbGxpbmZvX2ZvdW5kOwotCi0vKiBOb256ZXJvIGlmIHRoZSBhc3NlbWJsZXIgaXMgY3VycmVudGx5IHdpdGhpbiBhIC5lbnRyeS8uZXhpdCBwYWlyLiAgKi8KLXN0YXRpYyBpbnQgd2l0aGluX2VudHJ5X2V4aXQ7Ci0KLS8qIE5vbnplcm8gaWYgdGhlIGFzc2VtYmxlciBpcyBjdXJyZW50bHkgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uICAqLwotc3RhdGljIGludCB3aXRoaW5fcHJvY2VkdXJlOwotCi0vKiBIYW5kbGUgb24gc3RydWN1dHJlIHdoaWNoIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3Qgc3ltYm9sCi0gICBzZWVuIGluIGVhY2ggc3Vic3BhY2UuICAqLwotc3RhdGljIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX3N5bWJvbHNfcm9vdHAgPSBOVUxMOwotCi0vKiBIb2xkcyB0aGUgbGFzdCBmaWVsZCBzZWxlY3Rvci4gICovCi1zdGF0aWMgaW50IGhwcGFfZmllbGRfc2VsZWN0b3I7Ci0KLS8qIE5vbnplcm8gd2hlbiBzdHJpY3Qgc3ludGF4IGNoZWNraW5nIGlzIGVuYWJsZWQuICBaZXJvIG90aGVyd2lzZS4KLQotICAgRWFjaCBvcGNvZGUgaW4gdGhlIHRhYmxlIGhhcyBhIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90Ci0gICBzdHJpY3Qgc3ludGF4IGNoZWNraW5nIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGF0IGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQgc3RyaWN0ID0gMDsKLQotI2lmZGVmIE9CSl9TT00KLS8qIEEgZHVtbXkgYmZkIHN5bWJvbCBzbyB0aGF0IGFsbCByZWxvY2F0aW9ucyBoYXZlIHN5bWJvbHMgb2Ygc29tZSBraW5kLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpkdW1teV9zeW1ib2w7Ci0jZW5kaWYKLQotLyogTm9uemVybyBpZiBlcnJvcnMgYXJlIHRvIGJlIHByaW50ZWQuICAqLwotc3RhdGljIGludCBwcmludF9lcnJvcnMgPSAxOwotCi0vKiBMaXN0IG9mIHJlZ2lzdGVycyB0aGF0IGFyZSBwcmUtZGVmaW5lZDoKLQotICAgRWFjaCBnZW5lcmFsIHJlZ2lzdGVyIGhhcyBvbmUgcHJlZGVmaW5lZCBuYW1lIG9mIHRoZSBmb3JtCi0gICAlcjxSRUdOVU0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPFJFR05VTT4uCi0KLSAgIFNwYWNlIGFuZCBjb250cm9sIHJlZ2lzdGVycyBhcmUgaGFuZGxlZCBpbiBhIHNpbWlsYXIgbWFubmVyLAotICAgYnV0IHVzZSAlc3I8UkVHTlVNPiBhbmQgJWNyPFJFR05VTT4gYXMgdGhlaXIgcHJlZGVmaW5lZCBuYW1lcy4KLQotICAgTGlrZXdpc2UgZm9yIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMsIGJ1dCBvZiB0aGUgZm9ybQotICAgJWZyPFJFR05VTT4uICBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgaGF2ZSBhZGRpdGlvbmFsIHByZWRlZmluZWQKLSAgIG5hbWVzIHdpdGggJ0wnIGFuZCAnUicgc3VmZml4ZXMgKGUuZy4gJWZyMTlMLCAlZnIxOVIpIHdoaWNoCi0gICBhZ2FpbiBoYXZlIHRoZSB2YWx1ZSA8UkVHTlVNPi4KLQotICAgTWFueSByZWdpc3RlcnMgYWxzbyBoYXZlIHN5bm9ueW1zOgotCi0gICAlcjI2IC0gJXIyMyBoYXZlICVhcmcwIC0gJWFyZzMgYXMgc3lub255bXMKLSAgICVyMjggLSAlcjI5IGhhdmUgJXJldDAgLSAlcmV0MSBhcyBzeW5vbnltcwotICAgJXIzMCBoYXMgJXNwIGFzIGEgc3lub255bQotICAgJXIyNyBoYXMgJWRwIGFzIGEgc3lub255bQotICAgJXIyICBoYXMgJXJwIGFzIGEgc3lub255bQotCi0gICBBbG1vc3QgZXZlcnkgY29udHJvbCByZWdpc3RlciBoYXMgYSBzeW5vbnltOyB0aGV5IGFyZSBub3QgbGlzdGVkCi0gICBoZXJlIGZvciBicmV2aXR5LgotCi0gICBUaGUgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwZF9yZWcgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW10gPQotewotICB7IiVhcmcwIiwgMjZ9LAotICB7IiVhcmcxIiwgMjV9LAotICB7IiVhcmcyIiwgMjR9LAotICB7IiVhcmczIiwgMjN9LAotICB7IiVjcjAiLCAwfSwKLSAgeyIlY3IxMCIsIDEwfSwKLSAgeyIlY3IxMSIsIDExfSwKLSAgeyIlY3IxMiIsIDEyfSwKLSAgeyIlY3IxMyIsIDEzfSwKLSAgeyIlY3IxNCIsIDE0fSwKLSAgeyIlY3IxNSIsIDE1fSwKLSAgeyIlY3IxNiIsIDE2fSwKLSAgeyIlY3IxNyIsIDE3fSwKLSAgeyIlY3IxOCIsIDE4fSwKLSAgeyIlY3IxOSIsIDE5fSwKLSAgeyIlY3IyMCIsIDIwfSwKLSAgeyIlY3IyMSIsIDIxfSwKLSAgeyIlY3IyMiIsIDIyfSwKLSAgeyIlY3IyMyIsIDIzfSwKLSAgeyIlY3IyNCIsIDI0fSwKLSAgeyIlY3IyNSIsIDI1fSwKLSAgeyIlY3IyNiIsIDI2fSwKLSAgeyIlY3IyNyIsIDI3fSwKLSAgeyIlY3IyOCIsIDI4fSwKLSAgeyIlY3IyOSIsIDI5fSwKLSAgeyIlY3IzMCIsIDMwfSwKLSAgeyIlY3IzMSIsIDMxfSwKLSAgeyIlY3I4IiwgOH0sCi0gIHsiJWNyOSIsIDl9LAotICB7IiVkcCIsIDI3fSwKLSAgeyIlZWllbSIsIDE1fSwKLSAgeyIlZWlyciIsIDIzfSwKLSAgeyIlZnIwIiwgMH0sCi0gIHsiJWZyMGwiLCAwfSwKLSAgeyIlZnIwciIsIDB9LAotICB7IiVmcjEiLCAxfSwKLSAgeyIlZnIxMCIsIDEwfSwKLSAgeyIlZnIxMGwiLCAxMH0sCi0gIHsiJWZyMTByIiwgMTB9LAotICB7IiVmcjExIiwgMTF9LAotICB7IiVmcjExbCIsIDExfSwKLSAgeyIlZnIxMXIiLCAxMX0sCi0gIHsiJWZyMTIiLCAxMn0sCi0gIHsiJWZyMTJsIiwgMTJ9LAotICB7IiVmcjEyciIsIDEyfSwKLSAgeyIlZnIxMyIsIDEzfSwKLSAgeyIlZnIxM2wiLCAxM30sCi0gIHsiJWZyMTNyIiwgMTN9LAotICB7IiVmcjE0IiwgMTR9LAotICB7IiVmcjE0bCIsIDE0fSwKLSAgeyIlZnIxNHIiLCAxNH0sCi0gIHsiJWZyMTUiLCAxNX0sCi0gIHsiJWZyMTVsIiwgMTV9LAotICB7IiVmcjE1ciIsIDE1fSwKLSAgeyIlZnIxNiIsIDE2fSwKLSAgeyIlZnIxNmwiLCAxNn0sCi0gIHsiJWZyMTZyIiwgMTZ9LAotICB7IiVmcjE3IiwgMTd9LAotICB7IiVmcjE3bCIsIDE3fSwKLSAgeyIlZnIxN3IiLCAxN30sCi0gIHsiJWZyMTgiLCAxOH0sCi0gIHsiJWZyMThsIiwgMTh9LAotICB7IiVmcjE4ciIsIDE4fSwKLSAgeyIlZnIxOSIsIDE5fSwKLSAgeyIlZnIxOWwiLCAxOX0sCi0gIHsiJWZyMTlyIiwgMTl9LAotICB7IiVmcjFsIiwgMX0sCi0gIHsiJWZyMXIiLCAxfSwKLSAgeyIlZnIyIiwgMn0sCi0gIHsiJWZyMjAiLCAyMH0sCi0gIHsiJWZyMjBsIiwgMjB9LAotICB7IiVmcjIwciIsIDIwfSwKLSAgeyIlZnIyMSIsIDIxfSwKLSAgeyIlZnIyMWwiLCAyMX0sCi0gIHsiJWZyMjFyIiwgMjF9LAotICB7IiVmcjIyIiwgMjJ9LAotICB7IiVmcjIybCIsIDIyfSwKLSAgeyIlZnIyMnIiLCAyMn0sCi0gIHsiJWZyMjMiLCAyM30sCi0gIHsiJWZyMjNsIiwgMjN9LAotICB7IiVmcjIzciIsIDIzfSwKLSAgeyIlZnIyNCIsIDI0fSwKLSAgeyIlZnIyNGwiLCAyNH0sCi0gIHsiJWZyMjRyIiwgMjR9LAotICB7IiVmcjI1IiwgMjV9LAotICB7IiVmcjI1bCIsIDI1fSwKLSAgeyIlZnIyNXIiLCAyNX0sCi0gIHsiJWZyMjYiLCAyNn0sCi0gIHsiJWZyMjZsIiwgMjZ9LAotICB7IiVmcjI2ciIsIDI2fSwKLSAgeyIlZnIyNyIsIDI3fSwKLSAgeyIlZnIyN2wiLCAyN30sCi0gIHsiJWZyMjdyIiwgMjd9LAotICB7IiVmcjI4IiwgMjh9LAotICB7IiVmcjI4bCIsIDI4fSwKLSAgeyIlZnIyOHIiLCAyOH0sCi0gIHsiJWZyMjkiLCAyOX0sCi0gIHsiJWZyMjlsIiwgMjl9LAotICB7IiVmcjI5ciIsIDI5fSwKLSAgeyIlZnIybCIsIDJ9LAotICB7IiVmcjJyIiwgMn0sCi0gIHsiJWZyMyIsIDN9LAotICB7IiVmcjMwIiwgMzB9LAotICB7IiVmcjMwbCIsIDMwfSwKLSAgeyIlZnIzMHIiLCAzMH0sCi0gIHsiJWZyMzEiLCAzMX0sCi0gIHsiJWZyMzFsIiwgMzF9LAotICB7IiVmcjMxciIsIDMxfSwKLSAgeyIlZnIzbCIsIDN9LAotICB7IiVmcjNyIiwgM30sCi0gIHsiJWZyNCIsIDR9LAotICB7IiVmcjRsIiwgNH0sCi0gIHsiJWZyNHIiLCA0fSwKLSAgeyIlZnI1IiwgNX0sCi0gIHsiJWZyNWwiLCA1fSwKLSAgeyIlZnI1ciIsIDV9LAotICB7IiVmcjYiLCA2fSwKLSAgeyIlZnI2bCIsIDZ9LAotICB7IiVmcjZyIiwgNn0sCi0gIHsiJWZyNyIsIDd9LAotICB7IiVmcjdsIiwgN30sCi0gIHsiJWZyN3IiLCA3fSwKLSAgeyIlZnI4IiwgOH0sCi0gIHsiJWZyOGwiLCA4fSwKLSAgeyIlZnI4ciIsIDh9LAotICB7IiVmcjkiLCA5fSwKLSAgeyIlZnI5bCIsIDl9LAotICB7IiVmcjlyIiwgOX0sCi0gIHsiJWh0YSIsIDI1fSwKLSAgeyIlaWlyIiwgMTl9LAotICB7IiVpb3IiLCAyMX0sCi0gIHsiJWlwc3ciLCAyMn0sCi0gIHsiJWlzciIsIDIwfSwKLSAgeyIlaXRtciIsIDE2fSwKLSAgeyIlaXZhIiwgMTR9LAotICB7IiVwY29xIiwgMTh9LAotICB7IiVwY3NxIiwgMTd9LAotICB7IiVwaWRyMSIsIDh9LAotICB7IiVwaWRyMiIsIDl9LAotICB7IiVwaWRyMyIsIDEyfSwKLSAgeyIlcGlkcjQiLCAxM30sCi0gIHsiJXBwZGEiLCAyNH0sCi0gIHsiJXIwIiwgMH0sCi0gIHsiJXIxIiwgMX0sCi0gIHsiJXIxMCIsIDEwfSwKLSAgeyIlcjExIiwgMTF9LAotICB7IiVyMTIiLCAxMn0sCi0gIHsiJXIxMyIsIDEzfSwKLSAgeyIlcjE0IiwgMTR9LAotICB7IiVyMTUiLCAxNX0sCi0gIHsiJXIxNiIsIDE2fSwKLSAgeyIlcjE3IiwgMTd9LAotICB7IiVyMTgiLCAxOH0sCi0gIHsiJXIxOSIsIDE5fSwKLSAgeyIlcjIiLCAyfSwKLSAgeyIlcjIwIiwgMjB9LAotICB7IiVyMjEiLCAyMX0sCi0gIHsiJXIyMiIsIDIyfSwKLSAgeyIlcjIzIiwgMjN9LAotICB7IiVyMjQiLCAyNH0sCi0gIHsiJXIyNSIsIDI1fSwKLSAgeyIlcjI2IiwgMjZ9LAotICB7IiVyMjciLCAyN30sCi0gIHsiJXIyOCIsIDI4fSwKLSAgeyIlcjI5IiwgMjl9LAotICB7IiVyMyIsIDN9LAotICB7IiVyMzAiLCAzMH0sCi0gIHsiJXIzMSIsIDMxfSwKLSAgeyIlcjQiLCA0fSwKLSAgeyIlcjUiLCA1fSwKLSAgeyIlcjYiLCA2fSwKLSAgeyIlcjciLCA3fSwKLSAgeyIlcjgiLCA4fSwKLSAgeyIlcjkiLCA5fSwKLSAgeyIlcmN0ciIsIDB9LAotICB7IiVyZXQwIiwgMjh9LAotICB7IiVyZXQxIiwgMjl9LAotICB7IiVycCIsIDJ9LAotICB7IiVzYXIiLCAxMX0sCi0gIHsiJXNwIiwgMzB9LAotICB7IiVzcjAiLCAwfSwKLSAgeyIlc3IxIiwgMX0sCi0gIHsiJXNyMiIsIDJ9LAotICB7IiVzcjMiLCAzfSwKLSAgeyIlc3I0IiwgNH0sCi0gIHsiJXNyNSIsIDV9LAotICB7IiVzcjYiLCA2fSwKLSAgeyIlc3I3IiwgN30sCi0gIHsiJXRyMCIsIDI0fSwKLSAgeyIldHIxIiwgMjV9LAotICB7IiV0cjIiLCAyNn0sCi0gIHsiJXRyMyIsIDI3fSwKLSAgeyIldHI0IiwgMjh9LAotICB7IiV0cjUiLCAyOX0sCi0gIHsiJXRyNiIsIDMwfSwKLSAgeyIldHI3IiwgMzF9Ci19OwotCi0vKiBUaGlzIHRhYmxlIGlzIHNvcnRlZCBieSBvcmRlciBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuIFRoaXMgaXMKLSAgIHNvIHdlIGNoZWNrIGZvciA8PiBiZWZvcmUgd2UgY2hlY2sgZm9yIDwuIElmIHdlIGhhZCBhIDw+IGFuZCBjaGVja2VkCi0gICBmb3IgPCBmaXJzdCwgd2Ugd291bGQgZ2V0IGEgZmFsc2UgbWF0Y2guICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBmcF9jb25kX21hcCBmcF9jb25kX21hcFtdID0KLXsKLSAgeyJmYWxzZT8iLCAwfSwKLSAgeyJmYWxzZSIsIDF9LAotICB7InRydWU/IiwgMzB9LAotICB7InRydWUiLCAzMX0sCi0gIHsiITw9PiIsIDN9LAotICB7IiE/Pj0iLCA4fSwKLSAgeyIhPzw9IiwgMTZ9LAotICB7IiE8PiIsIDd9LAotICB7IiE+PSIsIDExfSwKLSAgeyIhPz4iLCAxMn0sCi0gIHsiPzw9IiwgMTR9LAotICB7IiE8PSIsIDE5fSwKLSAgeyIhPzwiLCAyMH0sCi0gIHsiPz49IiwgMjJ9LAotICB7IiE/PSIsIDI0fSwKLSAgeyIhPXQiLCAyN30sCi0gIHsiPD0+IiwgMjl9LAotICB7Ij10IiwgNX0sCi0gIHsiPz0iLCA2fSwKLSAgeyI/PCIsIDEwfSwKLSAgeyI8PSIsIDEzfSwKLSAgeyIhPiIsIDE1fSwKLSAgeyI/PiIsIDE4fSwKLSAgeyI+PSIsIDIxfSwKLSAgeyIhPCIsIDIzfSwKLSAgeyI8PiIsIDI1fSwKLSAgeyIhPSIsIDI2fSwKLSAgeyIhPyIsIDI4fSwKLSAgeyI/IiwgMn0sCi0gIHsiPSIsIDR9LAotICB7IjwiLCA5fSwKLSAgeyI+IiwgMTd9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlbGVjdG9yX2VudHJ5IHNlbGVjdG9yX3RhYmxlW10gPQotewotICB7ImYiLCBlX2ZzZWx9LAotICB7ImwiLCBlX2xzZWx9LAotICB7ImxkIiwgZV9sZHNlbH0sCi0gIHsibHAiLCBlX2xwc2VsfSwKLSAgeyJsciIsIGVfbHJzZWx9LAotICB7ImxzIiwgZV9sc3NlbH0sCi0gIHsibHQiLCBlX2x0c2VsfSwKLSAgeyJsdHAiLCBlX2x0cHNlbH0sCi0gIHsibiIsIGVfbnNlbH0sCi0gIHsibmwiLCBlX25sc2VsfSwKLSAgeyJubHIiLCBlX25scnNlbH0sCi0gIHsicCIsIGVfcHNlbH0sCi0gIHsiciIsIGVfcnNlbH0sCi0gIHsicmQiLCBlX3Jkc2VsfSwKLSAgeyJycCIsIGVfcnBzZWx9LAotICB7InJyIiwgZV9ycnNlbH0sCi0gIHsicnMiLCBlX3Jzc2VsfSwKLSAgeyJydCIsIGVfcnRzZWx9LAotICB7InJ0cCIsIGVfcnRwc2VsfSwKLSAgeyJ0IiwgZV90c2VsfSwKLX07Ci0KLSNpZmRlZiBPQkpfU09NCi0vKiBkZWZhdWx0IHNwYWNlIGFuZCBzdWJzcGFjZSBkaWN0aW9uYXJpZXMgKi8KLQotI2RlZmluZSBHREJfU1lNQk9MUyAgICAgICAgICBHREJfU1lNQk9MU19TVUJTUEFDRV9OQU1FCi0jZGVmaW5lIEdEQl9TVFJJTkdTICAgICAgICAgIEdEQl9TVFJJTkdTX1NVQlNQQUNFX05BTUUKLQotLyogcHJlLWRlZmluZWQgc3Vic2VnbWVudHMgKHN1YnNwYWNlcykgZm9yIHRoZSBIUFBBLiAgKi8KLSNkZWZpbmUgU1VCU0VHX0NPREUgICAwCi0jZGVmaW5lIFNVQlNFR19MSVQgICAgMQotI2RlZmluZSBTVUJTRUdfTUlMTEkgIDIKLSNkZWZpbmUgU1VCU0VHX0RBVEEgICAwCi0jZGVmaW5lIFNVQlNFR19CU1MgICAgMgotI2RlZmluZSBTVUJTRUdfVU5XSU5EIDMKLSNkZWZpbmUgU1VCU0VHX0dEQl9TVFJJTkdTIDAKLSNkZWZpbmUgU1VCU0VHX0dEQl9TWU1CT0xTIDEKLQotc3RhdGljIHN0cnVjdCBkZWZhdWx0X3N1YnNwYWNlX2RpY3QgcGFfZGVmX3N1YnNwYWNlc1tdID0KLXsKLSAgeyIkQ09ERSQiLCAxLCAxLCAxLCAwLCAwLCAwLCAyNCwgMHgyYywgMCwgOCwgMCwgMCwgU1VCU0VHX0NPREV9LAotICB7IiREQVRBJCIsIDEsIDEsIDAsIDAsIDAsIDAsIDI0LCAweDFmLCAxLCA4LCAxLCAxLCBTVUJTRUdfREFUQX0sCi0gIHsiJExJVCQiLCAxLCAxLCAwLCAwLCAwLCAwLCAxNiwgMHgyYywgMCwgOCwgMCwgMCwgU1VCU0VHX0xJVH0sCi0gIHsiJE1JTExJQ09ERSQiLCAxLCAxLCAwLCAwLCAwLCAwLCA4LCAweDJjLCAwLCA4LCAwLCAwLCBTVUJTRUdfTUlMTEl9LAotICB7IiRCU1MkIiwgMSwgMSwgMCwgMCwgMCwgMSwgODAsIDB4MWYsIDEsIDgsIDEsIDEsIFNVQlNFR19CU1N9LAotICB7TlVMTCwgMCwgMSwgMCwgMCwgMCwgMCwgMjU1LCAweDFmLCAwLCA0LCAwLCAwLCAwfQotfTsKLQotc3RhdGljIHN0cnVjdCBkZWZhdWx0X3NwYWNlX2RpY3QgcGFfZGVmX3NwYWNlc1tdID0KLXsKLSAgeyIkVEVYVCQiLCAwLCAxLCAxLCAwLCA4LCBBU0VDX05VTEx9LAotICB7IiRQUklWQVRFJCIsIDEsIDEsIDEsIDEsIDE2LCBBU0VDX05VTEx9LAotICB7TlVMTCwgMCwgMCwgMCwgMCwgMCwgQVNFQ19OVUxMfQotfTsKLQotLyogTWlzYyBsb2NhbCBkZWZpbml0aW9ucyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICAqLwotCi0vKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgdG8gbWFpbnRhaW4gc3BhY2VzL3N1YnNwYWNlcy4gICovCi0jZGVmaW5lIFNQQUNFX0RFRklORUQoc3BhY2VfY2hhaW4pCShzcGFjZV9jaGFpbiktPnNkX2RlZmluZWQKLSNkZWZpbmUgU1BBQ0VfVVNFUl9ERUZJTkVEKHNwYWNlX2NoYWluKSAoc3BhY2VfY2hhaW4pLT5zZF91c2VyX2RlZmluZWQKLSNkZWZpbmUgU1BBQ0VfU1BOVU0oc3BhY2VfY2hhaW4pCShzcGFjZV9jaGFpbiktPnNkX3NwbnVtCi0jZGVmaW5lIFNQQUNFX05BTUUoc3BhY2VfY2hhaW4pCQkoc3BhY2VfY2hhaW4pLT5zZF9uYW1lCi0KLSNkZWZpbmUgU1VCU1BBQ0VfREVGSU5FRChzc19jaGFpbikJKHNzX2NoYWluKS0+c3NkX2RlZmluZWQKLSNkZWZpbmUgU1VCU1BBQ0VfTkFNRShzc19jaGFpbikJCShzc19jaGFpbiktPnNzZF9uYW1lCi0jZW5kaWYKLQotLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IFMgcG90ZW50aWFsbHkgcmVwcmVzZW50cwotICAgYSByaWdodCBvciBsZWZ0IGhhbGYgb2YgYSBGUCByZWdpc3RlciAgKi8KLSNkZWZpbmUgSVNfUl9TRUxFQ1QoUykgICAoKihTKSA9PSAnUicgfHwgKihTKSA9PSAncicpCi0jZGVmaW5lIElTX0xfU0VMRUNUKFMpICAgKCooUykgPT0gJ0wnIHx8ICooUykgPT0gJ2wnKQotCi0vKiBJbnNlcnQgRklFTEQgaW50byBPUENPREUgc3RhcnRpbmcgYXQgYml0IFNUQVJULiAgQ29udGludWUgcGFfaXAKLSAgIG1haW4gbG9vcCBhZnRlciBpbnNlcnRpb24uICAqLwotCi0jZGVmaW5lIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUoT1BDT0RFLCBGSUVMRCwgU1RBUlQpIFwKLSAgeyBcCi0gICAgKChPUENPREUpIHw9IChGSUVMRCkgPDwgKFNUQVJUKSk7IFwKLSAgICBjb250aW51ZTsgXAotICB9Ci0KLS8qIFNpbXBsZSByYW5nZSBjaGVja2luZyBmb3IgRklFTEQgYWdhaW50IEhJR0ggYW5kIExPVyBib3VuZHMuCi0gICBJR05PUkUgaXMgdXNlZCB0byBzdXBwcmVzcyB0aGUgZXJyb3IgbWVzc2FnZS4gICovCi0KLSNkZWZpbmUgQ0hFQ0tfRklFTEQoRklFTEQsIEhJR0gsIExPVywgSUdOT1JFKSBcCi0gIHsgXAotICAgIGlmICgoRklFTEQpID4gKEhJR0gpIHx8IChGSUVMRCkgPCAoTE9XKSkgXAotICAgICAgeyBcCi0JaWYgKCEgSUdOT1JFKSBcCi0gICAgICAgICAgYXNfYmFkIChfKCJGaWVsZCBvdXQgb2YgcmFuZ2UgWyVkLi4lZF0gKCVkKS4iKSwgKExPVyksIChISUdIKSwgXAotCQkgIChpbnQpIChGSUVMRCkpO1wKLSAgICAgICAgYnJlYWs7IFwKLSAgICAgIH0gXAotICB9Ci0KLSNkZWZpbmUgaXNfRFBfcmVsYXRpdmUoZXhwKQkJCVwKLSAgKChleHApLlhfb3AgPT0gT19zdWJ0cmFjdAkJCVwKLSAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoKGV4cCkuWF9vcF9zeW1ib2wpLCAiJGdsb2JhbCQiKSA9PSAwKQotCi0jZGVmaW5lIGlzX1BDX3JlbGF0aXZlKGV4cCkJCQlcCi0gICgoZXhwKS5YX29wID09IE9fc3VidHJhY3QJCQlcCi0gICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKChleHApLlhfb3Bfc3ltYm9sKSwgIiRQSUNfcGNyZWwkMCIpID09IDApCi0KLS8qIFdlIG5lZWQgc29tZSBjb21wbGV4IGhhbmRsaW5nIGZvciBzdGFicyAoc3ltMSAtIHN5bTIpLiAgTHVja2lseSwgd2UnbGwKLSAgIGFsd2F5cyBiZSBhYmxlIHRvIHJlZHVjZSB0aGUgZXhwcmVzc2lvbiB0byBhIGNvbnN0YW50LCBzbyB3ZSBkb24ndAotICAgbmVlZCByZWFsIGNvbXBsZXggaGFuZGxpbmcgeWV0LiAgKi8KLSNkZWZpbmUgaXNfY29tcGxleChleHApCQkJCVwKLSAgKChleHApLlhfb3AgIT0gT19jb25zdGFudCAmJiAoZXhwKS5YX29wICE9IE9fc3ltYm9sKQotCi0vKiBBY3R1YWwgZnVuY3Rpb25zIHRvIGltcGxlbWVudCB0aGUgUEEgc3BlY2lmaWMgY29kZSBmb3IgdGhlIGFzc2VtYmxlci4gICovCi0KLS8qIENhbGxlZCBiZWZvcmUgd3JpdGluZyB0aGUgb2JqZWN0IGZpbGUuICBNYWtlIHN1cmUgZW50cnkvZXhpdCBhbmQKLSAgIHByb2MvcHJvY2VuZCBwYWlycyBtYXRjaC4gICovCi0KLXZvaWQKLXBhX2NoZWNrX2VvZiAoKQotewotICBpZiAod2l0aGluX2VudHJ5X2V4aXQpCi0gICAgYXNfZmF0YWwgKF8oIk1pc3NpbmcgLmV4aXRcbiIpKTsKLQotICBpZiAod2l0aGluX3Byb2NlZHVyZSkKLSAgICBhc19mYXRhbCAoXygiTWlzc2luZyAucHJvY2VuZFxuIikpOwotfQotCi0vKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbGFiZWxfc3ltYm9sX3N0cnVjdCBmb3IgdGhlIGN1cnJlbnQgc3BhY2UuCi0gICBvciBOVUxMIGlmIG5vIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgZXhpc3RzIGZvciB0aGUgY3VycmVudCBzcGFjZS4gICovCi0KLXN0YXRpYyBsYWJlbF9zeW1ib2xfc3RydWN0ICoKLXBhX2dldF9sYWJlbCAoKQotewotICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9jaGFpbjsKLQotICBmb3IgKGxhYmVsX2NoYWluID0gbGFiZWxfc3ltYm9sc19yb290cDsKLSAgICAgICBsYWJlbF9jaGFpbjsKLSAgICAgICBsYWJlbF9jaGFpbiA9IGxhYmVsX2NoYWluLT5sc3NfbmV4dCkKLSAgICB7Ci0jaWZkZWYgT0JKX1NPTQotICAgIGlmIChjdXJyZW50X3NwYWNlID09IGxhYmVsX2NoYWluLT5sc3Nfc3BhY2UgJiYgbGFiZWxfY2hhaW4tPmxzc19sYWJlbCkKLSAgICAgIHJldHVybiBsYWJlbF9jaGFpbjsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBpZiAobm93X3NlZyA9PSBsYWJlbF9jaGFpbi0+bHNzX3NlZ21lbnQgJiYgbGFiZWxfY2hhaW4tPmxzc19sYWJlbCkKLSAgICAgIHJldHVybiBsYWJlbF9jaGFpbjsKLSNlbmRpZgotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRGVmaW5lcyBhIGxhYmVsIGZvciB0aGUgY3VycmVudCBzcGFjZS4gIElmIG9uZSBpcyBhbHJlYWR5IGRlZmluZWQsCi0gICB0aGlzIGZ1bmN0aW9uIHdpbGwgcmVwbGFjZSBpdCB3aXRoIHRoZSBuZXcgbGFiZWwuICAqLwotCi12b2lkCi1wYV9kZWZpbmVfbGFiZWwgKHN5bWJvbCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sOwotewotICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9jaGFpbiA9IHBhX2dldF9sYWJlbCAoKTsKLQotICBpZiAobGFiZWxfY2hhaW4pCi0gICAgbGFiZWxfY2hhaW4tPmxzc19sYWJlbCA9IHN5bWJvbDsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBhIG5ldyBsYWJlbCBlbnRyeSBhbmQgYWRkIGl0IHRvIHRoZSBoZWFkIG9mIHRoZSBjaGFpbi4gICovCi0gICAgICBsYWJlbF9jaGFpbgotCT0gKGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKikgeG1hbGxvYyAoc2l6ZW9mIChsYWJlbF9zeW1ib2xfc3RydWN0KSk7Ci0gICAgICBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsID0gc3ltYm9sOwotI2lmZGVmIE9CSl9TT00KLSAgICAgIGxhYmVsX2NoYWluLT5sc3Nfc3BhY2UgPSBjdXJyZW50X3NwYWNlOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgICAgbGFiZWxfY2hhaW4tPmxzc19zZWdtZW50ID0gbm93X3NlZzsKLSNlbmRpZgotICAgICAgbGFiZWxfY2hhaW4tPmxzc19uZXh0ID0gTlVMTDsKLQotICAgICAgaWYgKGxhYmVsX3N5bWJvbHNfcm9vdHApCi0JbGFiZWxfY2hhaW4tPmxzc19uZXh0ID0gbGFiZWxfc3ltYm9sc19yb290cDsKLQotICAgICAgbGFiZWxfc3ltYm9sc19yb290cCA9IGxhYmVsX2NoYWluOwotICAgIH0KLX0KLQotLyogUmVtb3ZlcyBhIGxhYmVsIGRlZmluaXRpb24gZm9yIHRoZSBjdXJyZW50IHNwYWNlLgotICAgSWYgdGhlcmUgaXMgbm8gbGFiZWxfc3ltYm9sX3N0cnVjdCBlbnRyeSwgdGhlbiBubyBhY3Rpb24gaXMgdGFrZW4uICAqLwotCi1zdGF0aWMgdm9pZAotcGFfdW5kZWZpbmVfbGFiZWwgKCkKLXsKLSAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfY2hhaW47Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKnByZXZfbGFiZWxfY2hhaW4gPSBOVUxMOwotCi0gIGZvciAobGFiZWxfY2hhaW4gPSBsYWJlbF9zeW1ib2xzX3Jvb3RwOwotICAgICAgIGxhYmVsX2NoYWluOwotICAgICAgIGxhYmVsX2NoYWluID0gbGFiZWxfY2hhaW4tPmxzc19uZXh0KQotICAgIHsKLSAgICAgIGlmICgxCi0jaWZkZWYgT0JKX1NPTQotIAkgICYmIGN1cnJlbnRfc3BhY2UgPT0gbGFiZWxfY2hhaW4tPmxzc19zcGFjZSAmJiBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsCi0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gCSAgJiYgbm93X3NlZyA9PSBsYWJlbF9jaGFpbi0+bHNzX3NlZ21lbnQgJiYgbGFiZWxfY2hhaW4tPmxzc19sYWJlbAotI2VuZGlmCi0JICApCi0JewotCSAgLyogUmVtb3ZlIHRoZSBsYWJlbCBmcm9tIHRoZSBjaGFpbiBhbmQgZnJlZSBpdHMgbWVtb3J5LiAgKi8KLQkgIGlmIChwcmV2X2xhYmVsX2NoYWluKQotCSAgICBwcmV2X2xhYmVsX2NoYWluLT5sc3NfbmV4dCA9IGxhYmVsX2NoYWluLT5sc3NfbmV4dDsKLQkgIGVsc2UKLQkgICAgbGFiZWxfc3ltYm9sc19yb290cCA9IGxhYmVsX2NoYWluLT5sc3NfbmV4dDsKLQotCSAgZnJlZSAobGFiZWxfY2hhaW4pOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcHJldl9sYWJlbF9jaGFpbiA9IGxhYmVsX2NoYWluOwotICAgIH0KLX0KLQotCi0vKiBBbiBIUFBBLXNwZWNpZmljIHZlcnNpb24gb2YgZml4X25ldy4gIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgSFBQQQotICAgY29kZSBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHNvbWUgZXh0cmEgc3R1ZmYuICBFYWNoIGNhbGwgdG8gZml4X25ld19ocHBhCi0gICByZXN1bHRzIGluIHRoZSBjcmVhdGlvbiBvZiBhbiBpbnN0YW5jZSBvZiBhbiBocHBhX2ZpeF9zdHJ1Y3QuICBBbgotICAgaHBwYV9maXhfc3RydWN0IHN0b3JlcyB0aGUgZXh0cmEgaW5mb3JtYXRpb24gYWxvbmcgd2l0aCBhIHBvaW50ZXIgdG8gdGhlCi0gICBvcmlnaW5hbCBmaXhTLiAgVGhpcyBpcyBhdHRhY2hlZCB0byB0aGUgb3JpZ2luYWwgZml4dXAgdmlhIHRoZQotICAgdGNfZml4X2RhdGEgZmllbGQuICAqLwotCi1zdGF0aWMgdm9pZAotZml4X25ld19ocHBhIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgb2Zmc2V0LCBleHAsIHBjcmVsLAotCSAgICAgIHJfdHlwZSwgcl9maWVsZCwgcl9mb3JtYXQsIGFyZ19yZWxvYywgdW53aW5kX2JpdHMpCi0gICAgIGZyYWdTICpmcmFnOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIGludCBzaXplOwotICAgICBzeW1ib2xTICphZGRfc3ltYm9sOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50IHBjcmVsOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOwotICAgICBlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQgcl9maWVsZDsKLSAgICAgaW50IHJfZm9ybWF0OwotICAgICBsb25nIGFyZ19yZWxvYzsKLSAgICAgaW50KiB1bndpbmRfYml0czsKLXsKLSAgZml4UyAqbmV3X2ZpeDsKLQotICBzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICpocHBhX2ZpeCA9IChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICopCi0gIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mIChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0KSk7Ci0KLSAgaWYgKGV4cCAhPSBOVUxMKQotICAgIG5ld19maXggPSBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsIHJfdHlwZSk7Ci0gIGVsc2UKLSAgICBuZXdfZml4ID0gZml4X25ldyAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsIG9mZnNldCwgcGNyZWwsIHJfdHlwZSk7Ci0gIG5ld19maXgtPnRjX2ZpeF9kYXRhID0gKHZvaWQgKikgaHBwYV9maXg7Ci0gIGhwcGFfZml4LT5meF9yX3R5cGUgPSByX3R5cGU7Ci0gIGhwcGFfZml4LT5meF9yX2ZpZWxkID0gcl9maWVsZDsKLSAgaHBwYV9maXgtPmZ4X3JfZm9ybWF0ID0gcl9mb3JtYXQ7Ci0gIGhwcGFfZml4LT5meF9hcmdfcmVsb2MgPSBhcmdfcmVsb2M7Ci0gIGhwcGFfZml4LT5zZWdtZW50ID0gbm93X3NlZzsKLSNpZmRlZiBPQkpfU09NCi0gIGlmIChyX3R5cGUgPT0gUl9FTlRSWSB8fCByX3R5cGUgPT0gUl9FWElUKQotICAgIG5ld19maXgtPmZ4X29mZnNldCA9ICp1bndpbmRfYml0czsKLSNlbmRpZgotCi0gIC8qIGZvby0kZ2xvYmFsJCBpcyB1c2VkIHRvIGFjY2VzcyBub24tYXV0b21hdGljIHN0b3JhZ2UuICAkZ2xvYmFsJAotICAgICBpcyByZWFsbHkganVzdCBhIG1hcmtlciBhbmQgaGFzIHNlcnZlZCBpdHMgcHVycG9zZSwgc28gZWxpbWluYXRlCi0gICAgIGl0IG5vdyBzbyBhcyBub3QgdG8gY29uZnVzZSB3cml0ZS5jLiAgKi8KLSAgaWYgKG5ld19maXgtPmZ4X3N1YnN5Ci0gICAgICAmJiAhc3RyY21wIChTX0dFVF9OQU1FIChuZXdfZml4LT5meF9zdWJzeSksICIkZ2xvYmFsJCIpKQotICAgIG5ld19maXgtPmZ4X3N1YnN5ID0gTlVMTDsKLX0KLQotLyogUGFyc2UgYSAuYnl0ZSwgLndvcmQsIC5sb25nIGV4cHJlc3Npb24gZm9yIHRoZSBIUFBBLiAgQ2FsbGVkIGJ5Ci0gICBjb25zIHZpYSB0aGUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OIG1hY3JvLiAgKi8KLQotdm9pZAotcGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEgKGV4cCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgaHBwYV9maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci0gIGV4cHJlc3Npb24gKGV4cCk7Ci19Ci0KLS8qIFRoaXMgZml4X25ldyBpcyBjYWxsZWQgYnkgY29ucyB2aWEgVENfQ09OU19GSVhfTkVXLgotICAgaHBwYV9maWVsZF9zZWxlY3RvciBpcyBzZXQgYnkgdGhlIHBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhLiAgKi8KLQotdm9pZAotY29uc19maXhfbmV3X2hwcGEgKGZyYWcsIHdoZXJlLCBzaXplLCBleHApCi0gICAgIGZyYWdTICpmcmFnOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIGludCBzaXplOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICB1bnNpZ25lZCBpbnQgcmVsX3R5cGU7Ci0KLSAgLyogR2V0IGEgYmFzZSByZWxvY2F0aW9uIHR5cGUuICAqLwotICBpZiAoaXNfRFBfcmVsYXRpdmUgKCpleHApKQotICAgIHJlbF90eXBlID0gUl9IUFBBX0dPVE9GRjsKLSAgZWxzZSBpZiAoaXNfY29tcGxleCAoKmV4cCkpCi0gICAgcmVsX3R5cGUgPSBSX0hQUEFfQ09NUExFWDsKLSAgZWxzZQotICAgIHJlbF90eXBlID0gUl9IUFBBOwotCi0gIGlmIChocHBhX2ZpZWxkX3NlbGVjdG9yICE9IGVfcHNlbCAmJiBocHBhX2ZpZWxkX3NlbGVjdG9yICE9IGVfZnNlbCkKLSAgICBhc193YXJuIChfKCJJbnZhbGlkIGZpZWxkIHNlbGVjdG9yLiAgQXNzdW1pbmcgRiUlLiIpKTsKLQotICBmaXhfbmV3X2hwcGEgKGZyYWcsIHdoZXJlLCBzaXplLAotCQkoc3ltYm9sUyAqKSBOVUxMLCAob2Zmc2V0VCkgMCwgZXhwLCAwLCByZWxfdHlwZSwKLQkJaHBwYV9maWVsZF9zZWxlY3Rvciwgc2l6ZSAqIDgsIDAsIE5VTEwpOwotCi0gIC8qIFJlc2V0IGZpZWxkIHNlbGVjdG9yIHRvIGl0cyBkZWZhdWx0IHN0YXRlLiAgKi8KLSAgaHBwYV9maWVsZF9zZWxlY3RvciA9IDA7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBJdCBzaG91bGQKLSAgIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbCBuZWVkLiAgKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqcmV0dmFsID0gTlVMTDsKLSAgaW50IGxvc2UgPSAwOwotICB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0KLSAgbGFzdF9jYWxsX2luZm8gPSBOVUxMOwotICBjYWxsX2luZm9fcm9vdCA9IE5VTEw7Ci0KLSAgLyogU2V0IHRoZSBkZWZhdWx0IG1hY2hpbmUgdHlwZS4gICovCi0gIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfaHBwYSwgMTApKQotICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotCi0gIC8qIEZvbGRpbmcgb2YgdGV4dCBhbmQgZGF0YSBzZWdtZW50cyBmYWlscyBtaXNlcmFibHkgb24gdGhlIFBBLgotICAgICBXYXJuIHVzZXIgYW5kIGRpc2FibGUgIi1SIiBvcHRpb24uICAqLwotICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLVIgb3B0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB0YXJnZXQuIikpOwotICAgICAgZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgPSAwOwotICAgIH0KLQotI2lmZGVmIE9CSl9TT00KLSAgcGFfc3BhY2VzX2JlZ2luICgpOwotI2VuZGlmCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIHdoaWxlIChpIDwgTlVNT1BDT0RFUykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gcGFfb3Bjb2Rlc1tpXS5uYW1lOwotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hbWUsIChzdHJ1Y3QgcGFfb3Bjb2RlICopICZwYV9vcGNvZGVzW2ldKTsKLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCAmJiAqcmV0dmFsICE9ICdcMCcpCi0JewotCSAgYXNfZmF0YWwgKF8oIkludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iKSwgbmFtZSwgcmV0dmFsKTsKLQkgIGxvc2UgPSAxOwotCX0KLSAgICAgIGRvCi0JewotCSAgaWYgKChwYV9vcGNvZGVzW2ldLm1hdGNoICYgcGFfb3Bjb2Rlc1tpXS5tYXNrKQotCSAgICAgICE9IHBhX29wY29kZXNbaV0ubWF0Y2gpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oImludGVybmFsIGVycm9yOiBsb3Npbmcgb3Bjb2RlOiBgJXMnIFwiJXNcIlxuIiksCi0JCSAgICAgICBwYV9vcGNvZGVzW2ldLm5hbWUsIHBhX29wY29kZXNbaV0uYXJncyk7Ci0JICAgICAgbG9zZSA9IDE7Ci0JICAgIH0KLQkgICsraTsKLQl9Ci0gICAgICB3aGlsZSAoaSA8IE5VTU9QQ09ERVMgJiYgIXN0cmNtcCAocGFfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSk7Ci0gICAgfQotCi0gIGlmIChsb3NlKQotICAgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogU09NIHdpbGwgY2hhbmdlIHRleHRfc2VjdGlvbi4gIFRvIG1ha2Ugc3VyZSB3ZSBuZXZlciBwdXQKLSAgICAgYW55dGhpbmcgaW50byB0aGUgb2xkIG9uZSBzd2l0Y2ggdG8gdGhlIG5ldyBvbmUgbm93LiAgKi8KLSAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX1NPTQotICBkdW1teV9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgiTCRkdW1teSIpOwotICBTX1NFVF9TRUdNRU5UIChkdW1teV9zeW1ib2wsIHRleHRfc2VjdGlvbik7Ci0gIC8qIEZvcmNlIHRoZSBzeW1ib2wgdG8gYmUgY29udmVydGVkIHRvIGEgcmVhbCBzeW1ib2wuICovCi0gICh2b2lkKSBzeW1ib2xfZ2V0X2JmZHN5bSAoZHVtbXlfc3ltYm9sKTsKLSNlbmRpZgotfQotCi0vKiBBc3NlbWJsZSBhIHNpbmdsZSBpbnN0cnVjdGlvbiBzdG9yaW5nIGl0IGludG8gYSBmcmFnLiAgKi8KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqdG87Ci0KLSAgLyogVGhlIGhhZCBiZXR0ZXIgYmUgc29tZXRoaW5nIHRvIGFzc2VtYmxlLiAgKi8KLSAgYXNzZXJ0IChzdHIpOwotCi0gIC8qIElmIHdlIGFyZSB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbiwgbWFrZSBzdXJlIHdlJ3ZlCi0gICAgIGRlZmluZWQgYSBsYWJlbCBmb3IgdGhlIHByb2NlZHVyZTsgaGFuZGxlIGNhc2Ugd2hlcmUgdGhlCi0gICAgIGxhYmVsIHdhcyBkZWZpbmVkIGFmdGVyIHRoZSAuUFJPQyBkaXJlY3RpdmUuCi0KLSAgICAgTm90ZSB0aGVyZSdzIG5vdCBuZWVkIHRvIGRpZGRsZSB3aXRoIHRoZSBzZWdtZW50IG9yIGZyYWdtZW50Ci0gICAgIGZvciB0aGUgbGFiZWwgc3ltYm9sIGluIHRoaXMgY2FzZS4gIFdlIGhhdmUgYWxyZWFkeSBzd2l0Y2hlZAotICAgICBpbnRvIHRoZSBuZXcgJENPREUkIHN1YnNwYWNlIGF0IHRoaXMgcG9pbnQuICAqLwotICBpZiAod2l0aGluX3Byb2NlZHVyZSAmJiBsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sID09IE5VTEwpCi0gICAgewotICAgICAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sID0gcGFfZ2V0X2xhYmVsICgpOwotCi0gICAgICBpZiAobGFiZWxfc3ltYm9sKQotCXsKLQkgIGlmIChsYWJlbF9zeW1ib2wtPmxzc19sYWJlbCkKLQkgICAgewotCSAgICAgIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPSBsYWJlbF9zeW1ib2wtPmxzc19sYWJlbDsKLQkgICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAobGFiZWxfc3ltYm9sLT5sc3NfbGFiZWwpLT5mbGFncwotCQl8PSBCU0ZfRlVOQ1RJT047Ci0jaWZkZWYgT0JKX1NPTQotCSAgICAgIC8qIEFsc28gaGFuZGxlIGFsbG9jYXRpb24gb2YgYSBmaXh1cCB0byBob2xkIHRoZSB1bndpbmQKLQkJIGluZm9ybWF0aW9uIHdoZW4gdGhlIGxhYmVsIGFwcGVhcnMgYWZ0ZXIgdGhlIHByb2MvcHJvY2VuZC4gICovCi0JICAgICAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQotCQl7Ci0JCSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0JCSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJCQlOVUxMLCAob2Zmc2V0VCkgMCwgTlVMTCwKLQkJCQkwLCBSX0hQUEFfRU5UUlksIGVfZnNlbCwgMCwgMCwKLQkJCQkoaW50ICopJmxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvcik7Ci0JCX0KLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyAoY29ycnVwdGVkIGxhYmVsIGNoYWluKSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIikpOwotICAgIH0KLQotICAvKiBBc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb24uICBSZXN1bHRzIGFyZSBzYXZlZCBpbnRvICJ0aGVfaW5zbiIuICAqLwotICBwYV9pcCAoc3RyKTsKLQotICAvKiBHZXQgc29tZXdoZXJlIHRvIHB1dCB0aGUgYXNzZW1ibGVkIGluc3RydXRpb24uICAqLwotICB0byA9IGZyYWdfbW9yZSAoNCk7Ci0KLSAgLyogT3V0cHV0IHRoZSBvcGNvZGUuICovCi0gIG1kX251bWJlcl90b19jaGFycyAodG8sIHRoZV9pbnNuLm9wY29kZSwgNCk7Ci0KLSAgLyogSWYgbmVjZXNzYXJ5IG91dHB1dCBtb3JlIHN0dWZmLiAgKi8KLSAgaWYgKHRoZV9pbnNuLnJlbG9jICE9IFJfSFBQQV9OT05FKQotICAgIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csICh0byAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwgNCwgTlVMTCwKLQkJICAob2Zmc2V0VCkgMCwgJnRoZV9pbnNuLmV4cCwgdGhlX2luc24ucGNyZWwsCi0JCSAgdGhlX2luc24ucmVsb2MsIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yLAotCQkgIHRoZV9pbnNuLmZvcm1hdCwgdGhlX2luc24uYXJnX3JlbG9jLCBOVUxMKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfRFdBUkYyKQotICAgIHsKLSAgICAgIGJmZF92bWEgYWRkcjsKLQotICAgICAgLyogRmlyc3QgdXBkYXRlIHRoZSBub3Rpb24gb2YgdGhlIGN1cnJlbnQgc291cmNlIGxpbmUuICAqLwotICAgICAgZHdhcmYyX3doZXJlICgmZGVidWdfbGluZSk7Ci0KLSAgICAgIC8qIFdlIHdhbnQgdGhlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhpcyBpbnN0cnVjdGlvbiB3aXRoaW4gdGhlCi0JIHRoZSBjdXJyZW50IGZyYWcuICAqLwotICAgICAgYWRkciA9IGZyYWdfbm93LT5mcl9hZGRyZXNzICsgZnJhZ19ub3dfZml4ICgpIC0gNDsKLQotICAgICAgLyogQW5kIHJlY29yZCB0aGUgaW5mb3JtYXRpb24uICAqLwotICAgICAgZHdhcmYyX2dlbl9saW5lX2luZm8gKGFkZHIsICZkZWJ1Z19saW5lKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotLyogRG8gdGhlIHJlYWwgd29yayBmb3IgYXNzZW1ibGluZyBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gIFN0b3JlIHJlc3VsdHMKLSAgIGludG8gdGhlIGdsb2JhbCAidGhlX2luc24iIHZhcmlhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2lwIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqZXJyb3JfbWVzc2FnZSA9ICIiOwotICBjaGFyICpzLCBjLCAqYXJnc3RhcnQsICpuYW1lLCAqc2F2ZV9zOwotICBjb25zdCBjaGFyICphcmdzOwotICBpbnQgbWF0Y2ggPSBGQUxTRTsKLSAgaW50IGNvbW1hID0gMDsKLSAgaW50IGNtcGx0ciwgbnVsbGlmLCBmbGFnLCBjb25kLCBudW07Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICBzdHJ1Y3QgcGFfb3Bjb2RlICppbnNuOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIC8qIENvbnZlcnQgZXZlcnl0aGluZyB1cCB0byB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW50byBsb3dlcgotICAgICBjYXNlLiAgKi8KLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JyAmJiAqcyAhPSAnXG4nICYmICpzICE9ICdcMCc7IHMrKykKLSAgICBpZiAoaXN1cHBlciAoKnMpKQotICAgICAgKnMgPSB0b2xvd2VyICgqcyk7Ci0KLSAgLyogU2tpcCB0byBzb21ldGhpbmcgaW50ZXJlc3RpbmcuICAqLwotICBmb3IgKHMgPSBzdHI7IGlzdXBwZXIgKCpzKSB8fCBpc2xvd2VyICgqcykgfHwgKCpzID49ICcwJyAmJiAqcyA8PSAnMycpOyArK3MpCi0gICAgOwotCi0gIHN3aXRjaCAoKnMpCi0gICAgewotCi0gICAgY2FzZSAnXDAnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcsJzoKLSAgICAgIGNvbW1hID0gMTsKLQotICAgICAgLypGQUxMVEhST1VHSCAqLwotCi0gICAgY2FzZSAnICc6Ci0gICAgICAqcysrID0gJ1wwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgIH0KLQotICBzYXZlX3MgPSBzdHI7Ci0KLSAgLyogTG9vayB1cCB0aGUgb3Bjb2RlIGluIHRoZSBoYXMgdGFibGUuICAqLwotICBpZiAoKGluc24gPSAoc3RydWN0IHBhX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cikpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkICgiVW5rbm93biBvcGNvZGU6IGAlcyciLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoY29tbWEpCi0gICAgewotICAgICAgKi0tcyA9ICcsJzsKLSAgICB9Ci0KLSAgLyogTWFyayB0aGUgbG9jYXRpb24gd2hlcmUgYXJndW1lbnRzIGZvciB0aGUgaW5zdHJ1Y3Rpb24gc3RhcnQsIHRoZW4KLSAgICAgc3RhcnQgcHJvY2Vzc2luZyB0aGVtLiAgKi8KLSAgYXJnc3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIC8qIERvIHNvbWUgaW5pdGlhbGl6YXRpb24uICAqLwotICAgICAgb3Bjb2RlID0gaW5zbi0+bWF0Y2g7Ci0gICAgICBzdHJpY3QgPSAoaW5zbi0+ZmxhZ3MgJiBGTEFHX1NUUklDVCk7Ci0gICAgICBtZW1zZXQgKCZ0aGVfaW5zbiwgMCwgc2l6ZW9mICh0aGVfaW5zbikpOwotCi0gICAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9OT05FOwotCi0gICAgICAvKiBJZiB0aGlzIGluc3RydWN0aW9uIGlzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBhcmNoaXRlY3R1cmUsCi0JIHRoZW4gc2V0IGEgbmV3IGFyY2hpdGVjdHVyZS4gICovCi0gICAgICAvKiBCdXQgZG8gbm90IGF1dG9tYXRpY2FsbHkgcHJvbW90ZSB0byBwYTIuMC4gIFRoZSBhdXRvbWF0aWMgcHJvbW90aW9uCi0JIGNydWQgaXMgZm9yIGNvbXBhdGFiaWxpdHkgd2l0aCBIUCdzIG9sZCBhc3NlbWJsZXJzIG9ubHkuICAqLwotICAgICAgaWYgKGluc24tPmFyY2ggPCAyMAotCSAgJiYgYmZkX2dldF9tYWNoIChzdGRvdXRwdXQpIDwgaW5zbi0+YXJjaCkKLQl7Ci0JICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIGluc24tPmFyY2gpKQotCSAgICBhc193YXJuIChfKCJjb3VsZCBub3QgdXBkYXRlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKHN0ZG91dHB1dCkgPCBpbnNuLT5hcmNoKQotCXsKLQkgIG1hdGNoID0gRkFMU0U7Ci0JICBnb3RvIGZhaWxlZDsKLQl9Ci0KLSAgICAgIC8qIEJ1aWxkIHRoZSBvcGNvZGUsIGNoZWNraW5nIGFzIHdlIGdvIHRvIG1ha2UKLSAgICAgICAgIHN1cmUgdGhhdCB0aGUgb3BlcmFuZHMgbWF0Y2guICAqLwotICAgICAgZm9yIChhcmdzID0gaW5zbi0+YXJnczs7ICsrYXJncykKLQl7Ci0JICAvKiBBYnNvcmIgd2hpdGUgc3BhY2UgaW4gaW5zdHJ1Y3Rpb24uICAqLwotCSAgd2hpbGUgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKQotCSAgICBzKys7Ci0KLQkgIHN3aXRjaCAoKmFyZ3MpCi0JICAgIHsKLQotCSAgICAvKiBFbmQgb2YgYXJndW1lbnRzLiAgKi8KLQkgICAgY2FzZSAnXDAnOgotCSAgICAgIGlmICgqcyA9PSAnXDAnKQotCQltYXRjaCA9IFRSVUU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnKyc6Ci0JICAgICAgaWYgKCpzID09ICcrJykKLQkJewotCQkgICsrczsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmICgqcyA9PSAnLScpCi0JCWNvbnRpbnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggZXhhY3RseS4gICovCi0JICAgIGNhc2UgJygnOgotCSAgICBjYXNlICcpJzoKLQkgICAgY2FzZSAnLCc6Ci0JICAgIGNhc2UgJyAnOgotCSAgICAgIGlmICgqcysrID09ICphcmdzKQotCQljb250aW51ZTsKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBvciBjb250cm9sIHJlZ2lzdGVyIGZpZWxkIGF0IDEwLiAgKi8KLQkgICAgY2FzZSAnYic6Ci0JICAgIGNhc2UgJ14nOgotCSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCSAgICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQlicmVhazsKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDIxKTsKLQotCSAgICAvKiBIYW5kbGUgJXNhciBvciAlY3IxMS4gIE5vIGJpdHMgZ2V0IHNldCwgd2UganVzdCB2ZXJpZnkgdGhhdCBpdAotCSAgICAgICBpcyB0aGVyZS4gICovCi0JICAgIGNhc2UgJyEnOgotCSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZSBiZWZvcmUgcmVnaXN0ZXIuICAqLwotCSAgICAgIHdoaWxlICgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykKLQkJcyA9IHMgKyAxOwotCi0JICAgICAgaWYgKCFzdHJuY2FzZWNtcChzLCAiJXNhciIsIDQpKQotCSAgICAgICAgewotCQkgIHMgKz0gNDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcChzLCAiJWNyMTEiLCA1KSkKLQkgICAgICAgIHsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAxNS4gICovCi0JICAgIGNhc2UgJ3gnOgotCSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCSAgICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQlicmVhazsKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE2KTsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAzMS4gICovCi0JICAgIGNhc2UgJ3QnOgotCSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCSAgICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQlicmVhazsKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDEwIGFuZCAxNS4gICovCi0JICAgIGNhc2UgJ2EnOgotCSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCSAgICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQlicmVhazsKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgb3Bjb2RlIHw9IG51bSA8PCAxNjsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMjEpOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IGZpZWxkIGxlbmd0aCBhdCAzMS4gICovCi0JICAgIGNhc2UgJ1QnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMiwgMSwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCAzMiAtIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgaW1tZWRpYXRlIGF0IDE1LiAgKi8KLQkgICAgY2FzZSAnNSc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIC8qIFdoZW4gaW4gc3RyaWN0IG1vZGUsIHdlIHdhbnQgdG8ganVzdCByZWplY3QgdGhpcwotCQkgbWF0Y2ggaW5zdGVhZCBvZiBnaXZpbmcgYW4gb3V0IG9mIHJhbmdlIGVycm9yLiAgKi8KLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxNSwgLTE2LCBzdHJpY3QpOwotCSAgICAgIGxvd19zaWduX3VuZXh0IChudW0sIDUsICZudW0pOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxNik7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgaW1tZWRpYXRlIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnVic6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIC8qIFdoZW4gaW4gc3RyaWN0IG1vZGUsIHdlIHdhbnQgdG8ganVzdCByZWplY3QgdGhpcwotCQkgbWF0Y2ggaW5zdGVhZCBvZiBnaXZpbmcgYW4gb3V0IG9mIHJhbmdlIGVycm9yLiAgKi8KLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxNSwgLTE2LCBzdHJpY3QpCi0JICAgICAgbG93X3NpZ25fdW5leHQgKG51bSwgNSwgJm51bSk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhbiB1bnNpZ25lZCA1IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdyJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIDApOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCBzdHJpY3QpOwotCi0JICAgIC8qIEhhbmRsZSBhbiB1bnNpZ25lZCA1IGJpdCBpbW1lZGlhdGUgYXQgMTUuICAqLwotCSAgICBjYXNlICdSJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE2KTsKLQotCSAgICAvKiBIYW5kbGUgYW4gdW5zaWduZWQgMTAgYml0IGltbWVkaWF0ZSBhdCAxNS4gICovCi0JICAgIGNhc2UgJ1UnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxMDIzLCAwLCBzdHJpY3QpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxNik7Ci0KLQkgICAgLyogSGFuZGxlIGEgMiBiaXQgc3BhY2UgaWRlbnRpZmllciBhdCAxNy4gICovCi0JICAgIGNhc2UgJ3MnOgotCSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCSAgICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQlicmVhazsKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzLCAwLCAxKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTQpOwotCi0JICAgIC8qIEhhbmRsZSBhIDMgYml0IHNwYWNlIGlkZW50aWZpZXIgYXQgMTguICAqLwotCSAgICBjYXNlICdTJzoKLQkgICAgICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkgICAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJYnJlYWs7Ci0JICAgICAgbnVtID0gcGFfcGFyc2VfbnVtYmVyICgmcywgMCk7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNywgMCwgMSk7Ci0JICAgICAgZGlzX2Fzc2VtYmxlXzMgKG51bSwgJm51bSk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDEzKTsKLQotCSAgICAvKiBIYW5kbGUgYWxsIGNvbXBsZXRlcnMuICAqLwotCSAgICBjYXNlICdjJzoKLQkgICAgICBzd2l0Y2ggKCorK2FyZ3MpCi0JCXsKLQotCQkvKiBIYW5kbGUgYSBjb21wbGV0ZXIgZm9yIGFuIGluZGV4aW5nIGxvYWQgb3Igc3RvcmUuICAqLwotCQljYXNlICd4JzoKLQkJICB7Ci0JCSAgICBpbnQgdXUgPSAwOwotCQkgICAgaW50IG0gPSAwOwotCQkgICAgaW50IGkgPSAwOwotCQkgICAgd2hpbGUgKCpzID09ICcsJyAmJiBpIDwgMikKLQkJICAgICAgewotCQkJcysrOwotCQkJaWYgKHN0cm5jYXNlY21wIChzLCAic20iLCAyKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgdXUgPSAxOwotCQkJICAgIG0gPSAxOwotCQkJICAgIHMrKzsKLQkJCSAgICBpKys7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibSIsIDEpID09IDApCi0JCQkgIG0gPSAxOwotCQkJZWxzZSBpZiAoKHN0cm5jYXNlY21wIChzLCAicyAiLCAyKSA9PSAwKQotCQkJCSB8fCAoc3RybmNhc2VjbXAgKHMsICJzLCIsIDIpID09IDApKQotCQkJICB1dSA9IDE7Ci0JCQkvKiBXaGVuIGluIHN0cmljdCBtb2RlIHRoaXMgaXMgYSBtYXRjaCBmYWlsdXJlLiAgKi8KLQkJCWVsc2UgaWYgKHN0cmljdCkKLQkJCSAgewotCQkJICAgIHMtLTsKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkJZWxzZQotCQkJICBhc19iYWQgKF8oIkludmFsaWQgSW5kZXhlZCBMb2FkIENvbXBsZXRlci4iKSk7Ci0JCQlzKys7Ci0JCQlpKys7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChpID4gMikKLQkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIEluZGV4ZWQgTG9hZCBDb21wbGV0ZXIgU3ludGF4LiIpKTsKLQkJICAgIG9wY29kZSB8PSBtIDw8IDU7Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHV1LCAxMyk7Ci0JCSAgfQotCi0JCS8qIEhhbmRsZSBhIHNob3J0IGxvYWQvc3RvcmUgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnbSc6Ci0JCWNhc2UgJ3EnOgotCQljYXNlICdKJzoKLQkJY2FzZSAnZSc6Ci0JCSAgewotCQkgICAgaW50IGEgPSAwOwotCQkgICAgaW50IG0gPSAwOwotCQkgICAgaWYgKCpzID09ICcsJykKLQkJICAgICAgewotCQkJaW50IGZvdW5kID0gMDsKLQkJCXMrKzsKLQkJCWlmIChzdHJuY2FzZWNtcCAocywgIm1hIiwgMikgPT0gMCkKLQkJCSAgewotCQkJICAgIGEgPSAwOwotCQkJICAgIG0gPSAxOwotCQkJICAgIGZvdW5kID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJtYiIsIDIpID09IDApCi0JCQkgIHsKLQkJCSAgICBhID0gMTsKLQkJCSAgICBtID0gMTsKLQkJCSAgICBmb3VuZCA9IDE7Ci0JCQkgIH0KLQotCQkJLyogV2hlbiBpbiBzdHJpY3QgbW9kZSwgcGFzcyB0aHJvdWdoIGZvciBjYWNoZSBvcC4gICovCi0JCQlpZiAoIWZvdW5kICYmIHN0cmljdCkKLQkJCSAgcy0tOwotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgaWYgKCFmb3VuZCkKLQkJCSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBTaG9ydCBMb2FkL1N0b3JlIENvbXBsZXRlci4iKSk7Ci0JCQkgICAgcyArPSAyOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIC8qIElmIHdlIGRpZCBub3QgZ2V0IGEgbWEvbWIgY29tcGxldGVyLCB0aGVuIHdlIGRvIG5vdAotCQkgICAgICAgY29uc2lkZXIgdGhpcyBhIHBvc2l0aXZlIG1hdGNoIGZvciAnY2UnLiAgKi8KLQkJICAgIGVsc2UgaWYgKCphcmdzID09ICdlJykKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgLyogJ0onLCAnbScgYW5kICdxJyBhcmUgdGhlIHNhbWUsIGV4Y2VwdCBmb3Igd2hlcmUgdGhleQotCQkgICAgICAgZW5jb2RlIHRoZSBiZWZvcmUvYWZ0ZXIgZmllbGQuICAqLwotCQkgICBpZiAoKmFyZ3MgPT0gJ20nKQotCQkgICAgICB7Ci0JCQlvcGNvZGUgfD0gbSA8PCA1OwotCQkJSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBhLCAxMyk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKCphcmdzID09ICdxJykKLQkJICAgICAgewotCQkJb3Bjb2RlIHw9IG0gPDwgMzsKLQkJCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgYSwgMik7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKCphcmdzID09ICdKJykKLQkJICAgICAgewotCQkgICAgICAgIC8qIE0gYml0IGlzIGV4cGxpY2l0IGluIHRoZSBtYWpvciBvcGNvZGUuICAqLwotCQkJSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBhLCAyKTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoKmFyZ3MgPT0gJ2UnKQotCQkgICAgICB7Ci0JCQkvKiBHcm9zcyEgIEhpZGUgdGhlc2UgdmFsdWVzIGluIHRoZSBpbW1lZGlhdGUgZmllbGQKLQkJCSAgIG9mIHRoZSBpbnN0cnVjdGlvbiwgdGhlbiBwdWxsIHRoZW0gb3V0IGxhdGVyLiAgKi8KLQkJCW9wY29kZSB8PSBtIDw8IDg7Ci0JCQlvcGNvZGUgfD0gYSA8PCA5OwotCQkJY29udGludWU7Ci0JCSAgICAgIH0KLQkJICB9Ci0KLQkJLyogSGFuZGxlIGEgc3RieXMgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAncyc6Ci0JCSAgewotCQkgICAgaW50IGEgPSAwOwotCQkgICAgaW50IG0gPSAwOwotCQkgICAgaW50IGkgPSAwOwotCQkgICAgd2hpbGUgKCpzID09ICcsJyAmJiBpIDwgMikKLQkJICAgICAgewotCQkJcysrOwotCQkJaWYgKHN0cm5jYXNlY21wIChzLCAibSIsIDEpID09IDApCi0JCQkgIG0gPSAxOwotCQkJZWxzZSBpZiAoKHN0cm5jYXNlY21wIChzLCAiYiAiLCAyKSA9PSAwKQotCQkJCSB8fCAoc3RybmNhc2VjbXAgKHMsICJiLCIsIDIpID09IDApKQotCQkJICBhID0gMDsKLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAiZSIsIDEpID09IDApCi0JCQkgIGEgPSAxOwotCQkJLyogV2hlbiBpbiBzdHJpY3QgbW9kZSB0aGlzIGlzIGEgbWF0Y2ggZmFpbHVyZS4gICovCi0JCQllbHNlIGlmIChzdHJpY3QpCi0JCQkgIHsKLQkJCSAgICBzLS07Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgYXNfYmFkIChfKCJJbnZhbGlkIFN0b3JlIEJ5dGVzIFNob3J0IENvbXBsZXRlciIpKTsKLQkJCXMrKzsKLQkJCWkrKzsKLQkJICAgICAgfQotCQkgICAgaWYgKGkgPiAyKQotCQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgU3RvcmUgQnl0ZXMgU2hvcnQgQ29tcGxldGVyIikpOwotCQkgICAgb3Bjb2RlIHw9IG0gPDwgNTsKLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgYSwgMTMpOwotCQkgIH0KLQotCQkvKiBIYW5kbGUgbG9hZCBjYWNoZSBoaW50IGNvbXBsZXRlci4gICovCi0JCWNhc2UgJ2MnOgotCQkgIGNtcGx0ciA9IDA7Ci0JCSAgaWYgKCFzdHJuY21wKHMsICIsc2wiLCAzKSkKLQkJICAgIHsKLQkJICAgICAgcyArPSAzOwotCQkgICAgICBjbXBsdHIgPSAyOwotCQkgICAgfQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMCk7Ci0KLQkJLyogSGFuZGxlIHN0b3JlIGNhY2hlIGhpbnQgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnQyc6Ci0JCSAgY21wbHRyID0gMDsKLQkJICBpZiAoIXN0cm5jbXAocywgIixzbCIsIDMpKQotCQkgICAgewotCQkgICAgICBzICs9IDM7Ci0JCSAgICAgIGNtcGx0ciA9IDI7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jbXAocywgIixiYyIsIDMpKQotCQkgICAgewotCQkgICAgICBzICs9IDM7Ci0JCSAgICAgIGNtcGx0ciA9IDE7Ci0JCSAgICB9Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDEwKTsKLQotCQkvKiBIYW5kbGUgbG9hZCBhbmQgY2xlYXIgY2FjaGUgaGludCBjb21wbGV0ZXIuICAqLwotCQljYXNlICdkJzoKLQkJICBjbXBsdHIgPSAwOwotCQkgIGlmICghc3RybmNtcChzLCAiLGNvIiwgMykpCi0JCSAgICB7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgICAgY21wbHRyID0gMTsKLQkJICAgIH0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTApOwotCi0JCS8qIEhhbmRsZSBsb2FkIG9yZGVyaW5nIGNvbXBsZXRlci4gKi8KLQkJY2FzZSAnbyc6Ci0JCSAgaWYgKHN0cm5jbXAocywgIixvIiwgMikgIT0gMCkKLQkJICAgIGJyZWFrOwotCQkgIHMgKz0gMjsKLQkJICBjb250aW51ZTsKLQotCQkvKiBIYW5kbGUgYSBicmFuY2ggZ2F0ZSBjb21wbGV0ZXIuICAqLwotCQljYXNlICdnJzoKLQkJICBpZiAoc3RybmNhc2VjbXAgKHMsICIsZ2F0ZSIsIDUpICE9IDApCi0JCSAgICBicmVhazsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0KLQkJLyogSGFuZGxlIGEgYnJhbmNoIGxpbmsgYW5kIHB1c2ggY29tcGxldGVyLiAgKi8KLQkJY2FzZSAncCc6Ci0JCSAgaWYgKHN0cm5jYXNlY21wIChzLCAiLGwscHVzaCIsIDcpICE9IDApCi0JCSAgICBicmVhazsKLQkJICBzICs9IDc7Ci0JCSAgY29udGludWU7Ci0KLQkJLyogSGFuZGxlIGEgYnJhbmNoIGxpbmsgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnbCc6Ci0JCSAgaWYgKHN0cm5jYXNlY21wIChzLCAiLGwiLCAyKSAhPSAwKQotCQkgICAgYnJlYWs7Ci0JCSAgcyArPSAyOwotCQkgIGNvbnRpbnVlOwotCi0JCS8qIEhhbmRsZSBhIGJyYW5jaCBwb3AgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnUCc6Ci0JCSAgaWYgKHN0cm5jYXNlY21wIChzLCAiLHBvcCIsIDQpICE9IDApCi0JCSAgICBicmVhazsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0KLQkJLyogSGFuZGxlIGEgbG9jYWwgcHJvY2Vzc29yIGNvbXBsZXRlci4gICovCi0JCWNhc2UgJ0wnOgotCQkgIGlmIChzdHJuY2FzZWNtcCAocywgIixsIiwgMikgIT0gMCkKLQkJICAgIGJyZWFrOwotCQkgIHMgKz0gMjsKLQkJICBjb250aW51ZTsKLQotCQkvKiBIYW5kbGUgYSBQUk9CRSByZWFkL3dyaXRlIGNvbXBsZXRlci4gICovCi0JCWNhc2UgJ3cnOgotCQkgIGZsYWcgPSAwOwotCQkgIGlmICghc3RybmNhc2VjbXAgKHMsICIsdyIsIDIpKQotCQkgICAgewotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSAyOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAocywgIixyIiwgMikpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAwOwotCQkgICAgICBzICs9IDI7Ci0JCSAgICB9Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDYpOwotCi0JCS8qIEhhbmRsZSBNRkNUTCB3aWRlIGNvbXBsZXRlci4gICovCi0JCWNhc2UgJ1cnOgotCQkgIGlmIChzdHJuY2FzZWNtcCAocywgIix3IiwgMikgIT0gMCkKLQkJICAgIGJyZWFrOwotCQkgIHMgKz0gMjsKLQkJICBjb250aW51ZTsKLQotCQkvKiBIYW5kbGUgYW4gUkZJIHJlc3RvcmUgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAncic6Ci0JCSAgZmxhZyA9IDA7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIixyIiwgMikpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSA1OwotCQkgICAgICBzICs9IDI7Ci0JCSAgICB9Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDUpOwotCi0JCS8qIEhhbmRsZSBhIHN5c3RlbSBjb250cm9sIGNvbXBsZXRlci4gICovCi0JCWNhc2UgJ1onOgotCQkgIGlmICgqcyA9PSAnLCcgJiYgKCoocyArIDEpID09ICdtJyB8fCAqKHMgKyAxKSA9PSAnTScpKQotCQkgICAgewotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSAyOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGZsYWcgPSAwOwotCi0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCA1KTsKLQotCQkvKiBIYW5kbGUgaW50ZXJtZWRpYXRlL2ZpbmFsIGNvbXBsZXRlciBmb3IgRENPUi4gICovCi0JCWNhc2UgJ2knOgotCQkgIGZsYWcgPSAwOwotCQkgIGlmICghc3RybmNhc2VjbXAgKHMsICIsaSIsIDIpKQotCQkgICAgewotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSAyOwotCQkgICAgfQotCi0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCA2KTsKLQotCQkvKiBIYW5kbGUgemVyby9zaWduIGV4dGVuc2lvbiBjb21wbGV0ZXIuICAqLwotCQljYXNlICd6JzoKLQkJICBmbGFnID0gMTsKLQkJICBpZiAoIXN0cm5jYXNlY21wIChzLCAiLHoiLCAyKSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDA7Ci0JCSAgICAgIHMgKz0gMjsKLQkJICAgIH0KLQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTApOwotCi0JCS8qIEhhbmRsZSBhZGQgY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnYSc6Ci0JCSAgZmxhZyA9IDE7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIixsIiwgMikpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAyOwotCQkgICAgICBzICs9IDI7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wIChzLCAiLHRzdiIsIDQpKQotCQkgICAgewotCQkgICAgICBmbGFnID0gMzsKLQkJICAgICAgcyArPSA0OwotCQkgICAgfQotCi0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMCk7Ci0KLQkJLyogSGFuZGxlIDY0IGJpdCBjYXJyeSBmb3IgQURELiAgKi8KLQkJY2FzZSAnWSc6Ci0JCSAgZmxhZyA9IDA7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIixkYyx0c3YiLCA3KSB8fAotCQkgICAgICAhc3RybmNhc2VjbXAgKHMsICIsdHN2LGRjIiwgNykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDc7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wIChzLCAiLGRjIiwgMykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAwOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCQkvKiBIYW5kbGUgMzIgYml0IGNhcnJ5IGZvciBBREQuICAqLwotCQljYXNlICd5JzoKLQkJICBmbGFnID0gMDsKLQkJICBpZiAoIXN0cm5jYXNlY21wIChzLCAiLGMsdHN2IiwgNikgfHwKLQkJICAgICAgIXN0cm5jYXNlY21wIChzLCAiLHRzdixjIiwgNikpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDY7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wIChzLCAiLGMiLCAyKSkKLQkJICAgIHsKLQkJICAgICAgZmxhZyA9IDA7Ci0JCSAgICAgIHMgKz0gMjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBicmVhazsKLQotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTEpOwotCi0JCS8qIEhhbmRsZSB0cmFwIG9uIHNpZ25lZCBvdmVyZmxvdy4gICovCi0JCWNhc2UgJ3YnOgotCQkgIGZsYWcgPSAwOwotCQkgIGlmICghc3RybmNhc2VjbXAgKHMsICIsdHN2IiwgNCkpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDQ7Ci0JCSAgICB9Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCQkvKiBIYW5kbGUgdHJhcCBvbiBjb25kaXRpb24gYW5kIG92ZXJmbG93LiAgKi8KLQkJY2FzZSAndCc6Ci0JCSAgZmxhZyA9IDA7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIix0Yyx0c3YiLCA3KSB8fAotCQkgICAgICAhc3RybmNhc2VjbXAgKHMsICIsdHN2LHRjIiwgNykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDc7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wIChzLCAiLHRjIiwgMykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAwOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCQkvKiBIYW5kbGUgNjQgYml0IGJvcnJvdyBmb3IgU1VCLiAgKi8KLQkJY2FzZSAnQic6Ci0JCSAgZmxhZyA9IDA7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIixkYix0c3YiLCA3KSB8fAotCQkgICAgICAhc3RybmNhc2VjbXAgKHMsICIsdHN2LGRiIiwgNykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDc7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wIChzLCAiLGRiIiwgMykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAwOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCQkvKiBIYW5kbGUgMzIgYml0IGJvcnJvdyBmb3IgU1VCLiAgKi8KLQkJY2FzZSAnYic6Ci0JCSAgZmxhZyA9IDA7Ci0JCSAgaWYgKCFzdHJuY2FzZWNtcCAocywgIixiLHRzdiIsIDYpIHx8Ci0JCSAgICAgICFzdHJuY2FzZWNtcCAocywgIix0c3YsYiIsIDYpKQotCQkgICAgewotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSA2OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAocywgIixiIiwgMikpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAwOwotCQkgICAgICBzICs9IDI7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCQkvKiBIYW5kbGUgdHJhcCBjb25kaXRpb24gY29tcGxldGVyIGZvciBVQUREQ00uICAqLwotCQljYXNlICdUJzoKLQkJICBmbGFnID0gMDsKLQkJICBpZiAoIXN0cm5jYXNlY21wIChzLCAiLHRjIiwgMykpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0KLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDYpOwotCi0JCS8qIEhhbmRsZSBzaWduZWQvdW5zaWduZWQgYXQgMjEuICAqLwotCQljYXNlICdTJzoKLQkJICB7Ci0JCSAgICBpbnQgc2lnbiA9IDE7Ci0JCSAgICBpZiAoc3RybmNhc2VjbXAgKHMsICIscyIsIDIpID09IDApCi0JCSAgICAgIHsKLQkJCXNpZ24gPSAxOwotCQkJcyArPSAyOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIix1IiwgMikgPT0gMCkKLQkJICAgICAgewotCQkJc2lnbiA9IDA7Ci0JCQlzICs9IDI7Ci0JCSAgICAgIH0KLQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBzaWduLCAxMCk7Ci0JCSAgfQotCi0JCS8qIEhhbmRsZSBsZWZ0L3JpZ2h0IGNvbWJpbmF0aW9uIGF0IDE3OjE4LiAgKi8KLQkJY2FzZSAnaCc6Ci0JCSAgaWYgKCpzKysgPT0gJywnKQotCQkgICAgewotCQkgICAgICBpbnQgbHIgPSAwOwotCQkgICAgICBpZiAoKnMgPT0gJ3InKQotCQkJbHIgPSAyOwotCQkgICAgICBlbHNlIGlmICgqcyA9PSAnbCcpCi0JCQlsciA9IDA7Ci0JCSAgICAgIGVsc2UKLQkJCWFzX2JhZChfKCJJbnZhbGlkIGxlZnQvcmlnaHQgY29tYmluYXRpb24gY29tcGxldGVyIikpOwotCi0JCSAgICAgIHMrKzsKLQkJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBsciwgMTMpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFzX2JhZChfKCJJbnZhbGlkIGxlZnQvcmlnaHQgY29tYmluYXRpb24gY29tcGxldGVyIikpOwotCQkgIGJyZWFrOwotCi0JCS8qIEhhbmRsZSBzYXR1cmF0aW9uIGF0IDI0OjI1LiAgKi8KLQkJY2FzZSAnSCc6Ci0JCSAgewotCQkgICAgaW50IHNhdCA9IDM7Ci0JCSAgICBpZiAoc3RybmNhc2VjbXAgKHMsICIsc3MiLCAzKSA9PSAwKQotCQkgICAgICB7Ci0JCQlzYXQgPSAxOwotCQkJcyArPSAzOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIix1cyIsIDMpID09IDApCi0JCSAgICAgIHsKLQkJCXNhdCA9IDA7Ci0JCQlzICs9IDM7Ci0JCSAgICAgIH0KLQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBzYXQsIDYpOwotCQkgIH0KLQotCQkvKiBIYW5kbGUgcGVybXV0YXRpb24gY29tcGxldGVyLiAgKi8KLQkJY2FzZSAnKic6Ci0JCSAgaWYgKCpzKysgPT0gJywnKQotCQkgICAgewotCQkgICAgICBpbnQgcGVybWxvY1s0XTsKLQkJICAgICAgaW50IHBlcm0gPSAwOwotCQkgICAgICBpbnQgaSA9IDA7Ci0JCSAgICAgIHBlcm1sb2NbMF0gPSAxMzsKLQkJICAgICAgcGVybWxvY1sxXSA9IDEwOwotCQkgICAgICBwZXJtbG9jWzJdID0gODsKLQkJICAgICAgcGVybWxvY1szXSA9IDY7Ci0JCSAgICAgIGZvciAoOyBpIDwgNDsgaSsrKQotCQkgICAgICAgIHsKLQkJCSAgc3dpdGNoICgqcysrKQotCQkJICAgIHsKLQkJCSAgICBjYXNlICcwJzoKLQkJCSAgICAgIHBlcm0gPSAwOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSAnMSc6Ci0JCQkgICAgICBwZXJtID0gMTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgJzInOgotCQkJICAgICAgcGVybSA9IDI7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlICczJzoKLQkJCSAgICAgIHBlcm0gPSAzOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgZGVmYXVsdDoKLQkJCSAgICAgIGFzX2JhZChfKCJJbnZhbGlkIHBlcm11dGF0aW9uIGNvbXBsZXRlciIpKTsKLQkJCSAgICB9Ci0JCQkgIG9wY29kZSB8PSBwZXJtIDw8IHBlcm1sb2NbaV07Ci0JCQl9Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFzX2JhZChfKCJJbnZhbGlkIHBlcm11dGF0aW9uIGNvbXBsZXRlciIpKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogSGFuZGxlIGFsbCBjb25kaXRpb25zLiAgKi8KLQkgICAgY2FzZSAnPyc6Ci0JICAgICAgewotCQlhcmdzKys7Ci0JCXN3aXRjaCAoKmFyZ3MpCi0JCSAgewotIAkJICAvKiBIYW5kbGUgRlAgY29tcGFyZSBjb25kaXRpb25zLiAgKi8KLSAJCSAgY2FzZSAnZic6Ci0gCQkgICAgY29uZCA9IHBhX3BhcnNlX2ZwX2NtcF9jb25kICgmcyk7Ci0gCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjb25kLCAwKTsKLQotCQkgIC8qIEhhbmRsZSBhbiBhZGQgY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICdBJzoKLQkJICBjYXNlICdhJzoKLSAJCSAgICBjbXBsdHIgPSAwOwotIAkJICAgIGZsYWcgPSAwOwotCQkgICAgaWYgKCpzID09ICcsJykKLQkJICAgICAgewotCQkJcysrOwotCi0JCQkvKiA2NCBiaXQgY29uZGl0aW9ucy4gICovCi0JCQlpZiAoKmFyZ3MgPT0gJ0EnKQotCQkJICB7Ci0JCQkgICAgaWYgKCpzID09ICcqJykKLQkJCSAgICAgIHMrKzsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBicmVhazsKLQkJCSAgfQotCQkJZWxzZSBpZiAoKnMgPT0gJyonKQotCQkJICBicmVhazsKLQkJCW5hbWUgPSBzOwotCi0JCQluYW1lID0gczsKLQkJCXdoaWxlICgqcyAhPSAnLCcgJiYgKnMgIT0gJyAnICYmICpzICE9ICdcdCcpCi0JCQkgIHMgKz0gMTsKLQkJCWMgPSAqczsKLQkJCSpzID0gMHgwMDsKLQkJCWlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQkJCSAgY21wbHRyID0gMTsKLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCQkJICBjbXBsdHIgPSAyOwotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCQkJICBjbXBsdHIgPSAzOwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm51diIpID09IDApCi0JCQkgIGNtcGx0ciA9IDQ7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiem52IikgPT0gMCkKLQkJCSAgY21wbHRyID0gNTsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJzdiIpID09IDApCi0JCQkgIGNtcGx0ciA9IDY7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCQkJICBjbXBsdHIgPSA3OwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDA7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDE7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDI7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMzsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInV2IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDQ7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ2bnoiKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNTsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm5zdiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA2OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNzsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJLyogIiwqIiBpcyBhIHZhbGlkIGNvbmRpdGlvbi4gICovCi0JCQllbHNlIGlmICgqYXJncyA9PSAnYScpCi0JCQkgIGFzX2JhZCAoXygiSW52YWxpZCBBZGQgQ29uZGl0aW9uOiAlcyIpLCBuYW1lKTsKLQkJCSpzID0gYzsKLQkJICAgICAgfQotCQkgICAgb3Bjb2RlIHw9IGNtcGx0ciA8PCAxMzsKLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTIpOwotCi0JCSAgLyogSGFuZGxlIG5vbi1uZWdhdGVkIGFkZCBhbmQgYnJhbmNoIGNvbmRpdGlvbi4gICovCi0JCSAgY2FzZSAnZCc6Ci0JCSAgICBjbXBsdHIgPSBwYV9wYXJzZV9ub25uZWdfYWRkX2NtcGx0ciAoJnMsIDEpOwotCQkgICAgaWYgKGNtcGx0ciA8IDApCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiSW52YWxpZCBBZGQgYW5kIEJyYW5jaCBDb25kaXRpb246ICVjIiksICpzKTsKLQkJCWNtcGx0ciA9IDA7Ci0JCSAgICAgIH0KLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkJICAvKiBIYW5kbGUgNjQgYml0IHdpZGUtbW9kZSBhZGQgYW5kIGJyYW5jaCBjb25kaXRpb24uICAqLwotCQkgIGNhc2UgJ1cnOgotCQkgICAgY21wbHRyID0gcGFfcGFyc2VfYWRkYl82NF9jbXBsdHIgKCZzKTsKLQkJICAgIGlmIChjbXBsdHIgPCAwKQotCQkgICAgICB7Ci0JCQlhc19iYWQgKF8oIkludmFsaWQgQWRkIGFuZCBCcmFuY2ggQ29uZGl0aW9uOiAlYyIpLCAqcyk7Ci0JCQljbXBsdHIgPSAwOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCS8qIE5lZ2F0ZWQgY29uZGl0aW9uIHJlcXVpcmVzIGFuIG9wY29kZSBjaGFuZ2UuICovCi0JCQlvcGNvZGUgfD0gKGNtcGx0ciAmIDgpIDw8IDI0OwotCQkgICAgICB9Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciAmIDcsIDEzKTsKLQotCQkgIC8qIEhhbmRsZSBhIG5lZ2F0ZWQgb3Igbm9uLW5lZ2F0ZWQgYWRkIGFuZCBicmFuY2gKLQkJICAgICBjb25kaXRpb24uICAqLwotCQkgIGNhc2UgJ0AnOgotCQkgICAgc2F2ZV9zID0gczsKLQkJICAgIGNtcGx0ciA9IHBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyICgmcywgMSk7Ci0JCSAgICBpZiAoY21wbHRyIDwgMCkKLQkJICAgICAgewotCQkJcyA9IHNhdmVfczsKLQkJCWNtcGx0ciA9IHBhX3BhcnNlX25lZ19hZGRfY21wbHRyICgmcywgMSk7Ci0JCQlpZiAoY21wbHRyIDwgMCkKLQkJCSAgewotCQkJICAgIGFzX2JhZCAoXygiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbiIpKTsKLQkJCSAgICBjbXBsdHIgPSAwOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICAvKiBOZWdhdGVkIGNvbmRpdGlvbiByZXF1aXJlcyBhbiBvcGNvZGUgY2hhbmdlLiAqLwotCQkJICAgIG9wY29kZSB8PSAxIDw8IDI3OwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkJICAvKiBIYW5kbGUgYnJhbmNoIG9uIGJpdCBjb25kaXRpb25zLiAgKi8KLQkJICBjYXNlICdCJzoKLQkJICBjYXNlICdiJzoKLQkJICAgIGNtcGx0ciA9IDA7Ci0JCSAgICBpZiAoKnMgPT0gJywnKQotCQkgICAgICB7Ci0JCQlzKys7Ci0KLQkJCWlmICgqYXJncyA9PSAnQicpCi0JCQkgIHsKLQkJCSAgICBpZiAoKnMgPT0gJyonKQotCQkJICAgICAgcysrOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIGJyZWFrOwotCQkJICB9Ci0JCQllbHNlIGlmICgqcyA9PSAnKicpCi0JCQkgIGJyZWFrOwotCi0JCQlpZiAoc3RybmNtcCAocywgIjwiLCAxKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMDsKLQkJCSAgICBzKys7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jbXAgKHMsICI+PSIsIDIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAxOwotCQkJICAgIHMgKz0gMjsKLQkJCSAgfQotCQkJZWxzZQotCQkJICBhc19iYWQgKF8oIkludmFsaWQgQml0IEJyYW5jaCBDb25kaXRpb246ICVjIiksICpzKTsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDE1KTsKLQotCQkgIC8qIEhhbmRsZSBhIGNvbXBhcmUvc3VidHJhY3QgY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICdTJzoKLQkJICBjYXNlICdzJzoKLQkJICAgIGNtcGx0ciA9IDA7Ci0JCSAgICBmbGFnID0gMDsKLQkJICAgIGlmICgqcyA9PSAnLCcpCi0JCSAgICAgIHsKLQkJCXMrKzsKLQotCQkJLyogNjQgYml0IGNvbmRpdGlvbnMuICAqLwotCQkJaWYgKCphcmdzID09ICdTJykKLQkJCSAgewotCQkJICAgIGlmICgqcyA9PSAnKicpCi0JCQkgICAgICBzKys7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgYnJlYWs7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKCpzID09ICcqJykKLQkJCSAgYnJlYWs7Ci0JCQluYW1lID0gczsKLQotCQkJbmFtZSA9IHM7Ci0JCQl3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotCQkJICBzICs9IDE7Ci0JCQljID0gKnM7Ci0JCQkqcyA9IDB4MDA7Ci0JCQlpZiAoc3RyY21wIChuYW1lLCAiPSIpID09IDApCi0JCQkgIGNtcGx0ciA9IDE7Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKLQkJCSAgY21wbHRyID0gMjsKLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw9IikgPT0gMCkKLQkJCSAgY21wbHRyID0gMzsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICI8PCIpID09IDApCi0JCQkgIGNtcGx0ciA9IDQ7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiPDw9IikgPT0gMCkKLQkJCSAgY21wbHRyID0gNTsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJzdiIpID09IDApCi0JCQkgIGNtcGx0ciA9IDY7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCQkJICBjbXBsdHIgPSA3OwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDA7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDE7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDI7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMzsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIj4+PSIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA0OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiPj4iKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNTsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm5zdiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA2OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNzsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgfQotCQkJLyogIiwqIiBpcyBhIHZhbGlkIGNvbmRpdGlvbi4gICovCi0JCQllbHNlIGlmICgqYXJncyAhPSAnUycpCi0JCQkgIGFzX2JhZCAoXygiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbjogJXMiKSwKLQkJCQkgIG5hbWUpOwotCQkJKnMgPSBjOwotCQkgICAgICB9Ci0JCSAgICBvcGNvZGUgfD0gY21wbHRyIDw8IDEzOwotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMik7Ci0KLQkJICAvKiBIYW5kbGUgYSBub24tbmVnYXRlZCBjb21wYXJlIGNvbmRpdGlvbi4gICovCi0JCSAgY2FzZSAndCc6Ci0JCSAgICBjbXBsdHIgPSBwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0ciAoJnMsIDEpOwotCQkgICAgaWYgKGNtcGx0ciA8IDApCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbjogJWMiKSwgKnMpOwotCQkJY21wbHRyID0gMDsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDEzKTsKLQotCQkgIC8qIEhhbmRsZSBhIDMyIGJpdCBjb21wYXJlIGFuZCBicmFuY2ggY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICduJzoKLQkJICAgIHNhdmVfcyA9IHM7Ci0JCSAgICBjbXBsdHIgPSBwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0ciAoJnMsIDEpOwotCQkgICAgaWYgKGNtcGx0ciA8IDApCi0JCSAgICAgIHsKLQkJCXMgPSBzYXZlX3M7Ci0JCQljbXBsdHIgPSBwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0ciAoJnMsIDEpOwotCQkJaWYgKGNtcGx0ciA8IDApCi0JCQkgIHsKLQkJCSAgICBhc19iYWQgKF8oIkludmFsaWQgQ29tcGFyZSBhbmQgQnJhbmNoIENvbmRpdGlvbi4iKSk7Ci0JCQkgICAgY21wbHRyID0gMDsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgLyogTmVnYXRlZCBjb25kaXRpb24gcmVxdWlyZXMgYW4gb3Bjb2RlIGNoYW5nZS4gKi8KLQkJCSAgICBvcGNvZGUgfD0gMSA8PCAyNzsKLQkJCSAgfQotCQkgICAgICB9Ci0KLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkJICAvKiBIYW5kbGUgYSA2NCBiaXQgY29tcGFyZSBhbmQgYnJhbmNoIGNvbmRpdGlvbi4gICovCi0JCSAgY2FzZSAnTic6Ci0JCSAgICBjbXBsdHIgPSBwYV9wYXJzZV9jbXBiXzY0X2NtcGx0ciAoJnMpOwotCQkgICAgaWYgKGNtcGx0ciA+PSAwKQotCQkgICAgICB7Ci0JCQkvKiBOZWdhdGVkIGNvbmRpdGlvbiByZXF1aXJlcyBhbiBvcGNvZGUgY2hhbmdlLiAqLwotCQkJb3Bjb2RlIHw9IChjbXBsdHIgJiA4KSA8PCAyNjsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICAvKiBOb3QgYSA2NCBiaXQgY29uZC4gIEdpdmUgMzIgYml0IGEgY2hhbmNlLiAqLwotCQkgICAgICBicmVhazsKLQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIgJiA3LCAxMyk7Ci0KLQkJICAvKiBIYW5kbGUgYSA2NCBiaXQgY21waWIgY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICdRJzoKLQkJICAgIGNtcGx0ciA9IHBhX3BhcnNlX2NtcGliXzY0X2NtcGx0ciAoJnMpOwotCQkgICAgaWYgKGNtcGx0ciA8IDApCi0JCSAgICAgIC8qIE5vdCBhIDY0IGJpdCBjb25kLiAgR2l2ZSAzMiBiaXQgYSBjaGFuY2UuICovCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOwotCi0JCSAgICAvKiBIYW5kbGUgYSBsb2dpY2FsIGluc3RydWN0aW9uIGNvbmRpdGlvbi4gICovCi0JCSAgY2FzZSAnTCc6Ci0JCSAgY2FzZSAnbCc6Ci0JCSAgICBjbXBsdHIgPSAwOwotCQkgICAgZmxhZyA9IDA7Ci0JCSAgICBpZiAoKnMgPT0gJywnKQotCQkgICAgICB7Ci0JCQlzKys7Ci0KLQkJCS8qIDY0IGJpdCBjb25kaXRpb25zLiAgKi8KLQkJCWlmICgqYXJncyA9PSAnTCcpCi0JCQkgIHsKLQkJCSAgICBpZiAoKnMgPT0gJyonKQotCQkJICAgICAgcysrOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIGJyZWFrOwotCQkJICB9Ci0JCQllbHNlIGlmICgqcyA9PSAnKicpCi0JCQkgIGJyZWFrOwotCQkJbmFtZSA9IHM7Ci0KLQkJCW5hbWUgPSBzOwotCQkJd2hpbGUgKCpzICE9ICcsJyAmJiAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JykKLQkJCSAgcyArPSAxOwotCQkJYyA9ICpzOwotCQkJKnMgPSAweDAwOwotCi0KLQkJCWlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQkJCSAgY21wbHRyID0gMTsKLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCQkJICBjbXBsdHIgPSAyOwotCQkJZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCQkJICBjbXBsdHIgPSAzOwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQkJCSAgY21wbHRyID0gNzsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAwOwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAxOwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAyOwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+IikgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDM7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJldiIpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA3OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICB9Ci0JCQkvKiAiLCoiIGlzIGEgdmFsaWQgY29uZGl0aW9uLiAgKi8KLQkJCWVsc2UgaWYgKCphcmdzICE9ICdMJykKLQkJCSAgYXNfYmFkIChfKCJJbnZhbGlkIExvZ2ljYWwgSW5zdHJ1Y3Rpb24gQ29uZGl0aW9uLiIpKTsKLQkJCSpzID0gYzsKLQkJICAgICAgfQotCQkgICAgb3Bjb2RlIHw9IGNtcGx0ciA8PCAxMzsKLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTIpOwotCi0JCSAgLyogSGFuZGxlIGEgc2hpZnQvZXh0cmFjdC9kZXBvc2l0IGNvbmRpdGlvbi4gICovCi0JCSAgY2FzZSAnWCc6Ci0JCSAgY2FzZSAneCc6Ci0JCSAgY2FzZSAneSc6Ci0JCSAgICBjbXBsdHIgPSAwOwotCQkgICAgaWYgKCpzID09ICcsJykKLQkJICAgICAgewotCQkJc2F2ZV9zID0gcysrOwotCi0JCQkvKiA2NCBiaXQgY29uZGl0aW9ucy4gICovCi0JCQlpZiAoKmFyZ3MgPT0gJ1gnKQotCQkJICB7Ci0JCQkgICAgaWYgKCpzID09ICcqJykKLQkJCSAgICAgIHMrKzsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBicmVhazsKLQkJCSAgfQotCQkJZWxzZSBpZiAoKnMgPT0gJyonKQotCQkJICBicmVhazsKLQkJCW5hbWUgPSBzOwotCi0JCQluYW1lID0gczsKLQkJCXdoaWxlICgqcyAhPSAnLCcgJiYgKnMgIT0gJyAnICYmICpzICE9ICdcdCcpCi0JCQkgIHMgKz0gMTsKLQkJCWMgPSAqczsKLQkJCSpzID0gMHgwMDsKLQkJCWlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQkJCSAgY21wbHRyID0gMTsKLQkJCWVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCQkJICBjbXBsdHIgPSAyOwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQkJCSAgY21wbHRyID0gMzsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JCQkgIGNtcGx0ciA9IDQ7Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCi0JCQkgIGNtcGx0ciA9IDU7Ci0JCQllbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JCQkgIGNtcGx0ciA9IDY7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCQkJICBjbXBsdHIgPSA3OwotCQkJLyogSGFuZGxlIG1vdmIsbi4gIFB1dCB0aGluZ3MgYmFjayB0aGUgd2F5IHRoZXkgd2VyZS4KLQkJCSAgIFRoaXMgaW5jbHVkZXMgbW92aW5nIHMgYmFjayB0byB3aGVyZSBpdCBzdGFydGVkLiAgKi8KLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuIikgPT0gMCAmJiAqYXJncyA9PSAneScpCi0JCQkgIHsKLQkJCSAgICAqcyA9IGM7Ci0JCQkgICAgcyA9IHNhdmVfczsKLQkJCSAgICBjb250aW51ZTsKLQkJCSAgfQotCQkJLyogIiwqIiBpcyBhIHZhbGlkIGNvbmRpdGlvbi4gICovCi0JCQllbHNlIGlmICgqYXJncyAhPSAnWCcpCi0JCQkgIGFzX2JhZCAoXygiSW52YWxpZCBTaGlmdC9FeHRyYWN0L0RlcG9zaXQgQ29uZGl0aW9uLiIpKTsKLQkJCSpzID0gYzsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDEzKTsKLQotCQkgIC8qIEhhbmRsZSBhIHVuaXQgaW5zdHJ1Y3Rpb24gY29uZGl0aW9uLiAgKi8KLQkJICBjYXNlICdVJzoKLQkJICBjYXNlICd1JzoKLQkJICAgIGNtcGx0ciA9IDA7Ci0JCSAgICBmbGFnID0gMDsKLQkJICAgIGlmICgqcyA9PSAnLCcpCi0JCSAgICAgIHsKLQkJCXMrKzsKLQotCQkJLyogNjQgYml0IGNvbmRpdGlvbnMuICAqLwotCQkJaWYgKCphcmdzID09ICdVJykKLQkJCSAgewotCQkJICAgIGlmICgqcyA9PSAnKicpCi0JCQkgICAgICBzKys7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgYnJlYWs7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKCpzID09ICcqJykKLQkJCSAgYnJlYWs7Ci0KLQkJCWlmIChzdHJuY2FzZWNtcCAocywgInNieiIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAyOwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzaHoiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMzsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAic2RjIiwgMykgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDQ7Ci0JCQkgICAgcyArPSAzOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInNiYyIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA2OwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzaGMiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNzsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAidHIiLCAyKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMDsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgICBzICs9IDI7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibmJ6IiwgMykgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDI7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgICAgcyArPSAzOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm5oeiIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAzOwotCQkJICAgIGZsYWcgPSAxOwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJuZGMiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNDsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibmJjIiwgMykgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDY7Ci0JCQkgICAgZmxhZyA9IDE7Ci0JCQkgICAgcyArPSAzOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm5oYyIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSA3OwotCQkJICAgIGZsYWcgPSAxOwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzd3oiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gMTsKLQkJCSAgICBmbGFnID0gMDsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAic3djIiwgMykgPT0gMCkKLQkJCSAgewotCQkJICAgIGNtcGx0ciA9IDU7Ci0JCQkgICAgZmxhZyA9IDA7Ci0JCQkgICAgcyArPSAzOwotCQkJICB9Ci0JCQllbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm53eiIsIDMpID09IDApCi0JCQkgIHsKLQkJCSAgICBjbXBsdHIgPSAxOwotCQkJICAgIGZsYWcgPSAxOwotCQkJICAgIHMgKz0gMzsKLQkJCSAgfQotCQkJZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJud2MiLCAzKSA9PSAwKQotCQkJICB7Ci0JCQkgICAgY21wbHRyID0gNTsKLQkJCSAgICBmbGFnID0gMTsKLQkJCSAgICBzICs9IDM7Ci0JCQkgIH0KLQkJCS8qICIsKiIgaXMgYSB2YWxpZCBjb25kaXRpb24uICAqLwotCQkJZWxzZSBpZiAoKmFyZ3MgIT0gJ1UnKQotCQkJICBhc19iYWQgKF8oIkludmFsaWQgVW5pdCBJbnN0cnVjdGlvbiBDb25kaXRpb24uIikpOwotCQkgICAgICB9Ci0JCSAgICBvcGNvZGUgfD0gY21wbHRyIDw8IDEzOwotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMik7Ci0KLQkJICBkZWZhdWx0OgotCQkgICAgYWJvcnQgKCk7Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIGEgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXIgZm9yIGJyYW5jaCBpbnN0cnVjdGlvbnMuICAqLwotCSAgICBjYXNlICduJzoKLQkgICAgICBudWxsaWYgPSBwYV9wYXJzZV9udWxsaWYgKCZzKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bGxpZiwgMSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXIgZm9yIGNvcHIgYW5kIHNwb3AgaW5zbnMuICAqLwotCSAgICBjYXNlICdOJzoKLQkgICAgICBudWxsaWYgPSBwYV9wYXJzZV9udWxsaWYgKCZzKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bGxpZiwgNSk7Ci0KLQkgICAgLyogSGFuZGxlICwlcjIgY29tcGxldGVyIGZvciBuZXcgc3ludGF4IGJyYW5jaGVzLiAgKi8KLQkgICAgY2FzZSAnTCc6Ci0JICAgICAgaWYgKCpzID09ICcsJyAmJiBzdHJuY2FzZWNtcCAocyArIDEsICIlcjIiLCAzKSA9PSAwKQotCQlzICs9IDQ7Ci0JICAgICAgZWxzZSBpZiAoKnMgPT0gJywnICYmIHN0cm5jYXNlY21wIChzICsgMSwgIiVycCIsIDMpID09IDApCi0JCXMgKz0gNDsKLQkgICAgICBlbHNlCi0JCWJyZWFrOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIC8qIEhhbmRsZSAzIGJpdCBlbnRyeSBpbnRvIHRoZSBmcCBjb21wYXJlIGFycmF5LiAgIFZhbGlkIHZhbHVlcwotCSAgICAgICBhcmUgMC4uNiBpbmNsdXNpdmUuICAqLwotCSAgICBjYXNlICdoJzoKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCQl7Ci0JCSAgbnVtID0gZXZhbHVhdGVfYWJzb2x1dGUgKCZ0aGVfaW5zbik7Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgNiwgMCwgMCk7Ci0JCSAgbnVtKys7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDEzKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJYnJlYWs7Ci0KLQkgICAgLyogSGFuZGxlIDMgYml0IGVudHJ5IGludG8gdGhlIGZwIGNvbXBhcmUgYXJyYXkuICAgVmFsaWQgdmFsdWVzCi0JICAgICAgIGFyZSAwLi42IGluY2x1c2l2ZS4gICovCi0JICAgIGNhc2UgJ20nOgotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIHMgPSBleHByX2VuZDsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBDSEVDS19GSUVMRCAobnVtLCA2LCAwLCAwKTsKLQkJICBudW0gPSAobnVtICsgMSkgXiAxOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxMyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWJyZWFrOwotCi0JICAgIC8qIEhhbmRsZSBncmFwaGljcyB0ZXN0IGNvbXBsZXRlcnMgZm9yIGZ0ZXN0ICovCi0JICAgIGNhc2UgJz0nOgotCSAgICAgIHsKLQkJbnVtID0gcGFfcGFyc2VfZnRlc3RfZ2Z4X2NvbXBsZXRlciAoJnMpOwotCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBhIDExIGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdpJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBDSEVDS19GSUVMRCAobnVtLCAxMDIzLCAtMTAyNCwgMCk7Ci0JCSAgbG93X3NpZ25fdW5leHQgKG51bSwgMTEsICZudW0pOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChpc19EUF9yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX0dPVE9GRjsKLQkJICBlbHNlIGlmIChpc19QQ19yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX1BDUkVMX0NBTEw7Ci0JCSAgZWxzZQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEE7Ci0JCSAgdGhlX2luc24uZm9ybWF0ID0gMTE7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgYSAxNCBiaXQgaW1tZWRpYXRlIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnSic6Ci0JICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCQl7Ci0JCSAgaW50IGEsIG07Ci0KLQkJICAvKiBYWFggdGhlIGNvbXBsZXRlciBzdG9yZWQgYXdheSB0aWJpdHMgb2YgaW5mb3JtYXRpb24KLQkJICAgICBmb3IgdXMgdG8gZXh0cmFjdC4gIFdlIG5lZWQgYSBjbGVhbmVyIHdheSB0byBkbyB0aGlzLgotCQkgICAgIE5vdyB0aGF0IHdlIGhhdmUgbG90cyBvZiBsZXR0ZXJzIGFnYWluLCBpdCB3b3VsZCBiZQotCQkgICAgIGdvb2QgdG8gcmV0aGluayB0aGlzLiAgKi8KLQkJICBtID0gKG9wY29kZSAmICgxIDw8IDgpKSAhPSAwOwotCQkgIGEgPSAob3Bjb2RlICYgKDEgPDwgOSkpICE9IDA7Ci0JCSAgb3Bjb2RlICY9IH4gKDMgPDwgOCk7Ci0JCSAgbnVtID0gZXZhbHVhdGVfYWJzb2x1dGUgKCZ0aGVfaW5zbik7Ci0JCSAgaWYgKChhID09IDEgJiYgbnVtID49IDApIHx8IChhID09IDAgJiYgbnVtIDwgMCkpCi0JCSAgICBicmVhazsKLQkJICBDSEVDS19GSUVMRCAobnVtLCA4MTkxLCAtODE5MiwgMCk7Ci0JCSAgbG93X3NpZ25fdW5leHQgKG51bSwgMTQsICZudW0pOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGEgMTQgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ0snOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIGludCBhLCBtOwotCi0JCSAgLyogWFhYIHRoZSBjb21wbGV0ZXIgc3RvcmVkIGF3YXkgdGliaXRzIG9mIGluZm9ybWF0aW9uCi0JCSAgICAgZm9yIHVzIHRvIGV4dHJhY3QuICBXZSBuZWVkIGEgY2xlYW5lciB3YXkgdG8gZG8gdGhpcy4KLQkJICAgICBOb3cgdGhhdCB3ZSBoYXZlIGxvdHMgb2YgbGV0dGVycyBhZ2FpbiwgaXQgd291bGQgYmUKLQkJICAgICBnb29kIHRvIHJldGhpbmsgdGhpcy4gICovCi0JCSAgbSA9IChvcGNvZGUgJiAoMSA8PCA4KSkgIT0gMDsKLQkJICBhID0gKG9wY29kZSAmICgxIDw8IDkpKSAhPSAwOwotCQkgIG9wY29kZSAmPSB+ICgzIDw8IDgpOwotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIGlmICgoYSA9PSAxICYmIG51bSA8IDApIHx8IChhID09IDAgJiYgbnVtID4gMCkpCi0JCSAgICBicmVhazsKLQkJICBpZiAobnVtICUgNCkKLQkJICAgIGJyZWFrOwotCQkgIENIRUNLX0ZJRUxEIChudW0sIDgxOTEsIC04MTkyLCAwKTsKLQkJICBpZiAobnVtIDwgMCkKLQkJICAgIG9wY29kZSB8PSAxOwotICAgICAgICAgICAgICAgICAgbnVtICY9IDB4MWZmZjsKLSAgICAgICAgICAgICAgICAgIG51bSA+Pj0gMjsKLSAgICAgICAgICAgICAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAzKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIDE0IGJpdCBpbW1lZGlhdGVkLCBzaGlmdGVkIGxlZnQgdGhyZWUgdGltZXMuICAqLwotCSAgICBjYXNlICcjJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICYgMHg3KQotCQkgICAgYnJlYWs7Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgODE5MSwgLTgxOTIsIDApOwotCQkgIGlmIChudW0gPCAwKQotCQkgICAgb3Bjb2RlIHw9IDE7Ci0JCSAgbnVtICY9IDB4MWZmZjsKLQkJICBudW0gPj49IDM7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDQpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGlzX0RQX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfR09UT0ZGOwotCQkgIGVsc2UgaWYgKGlzX1BDX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICBlbHNlCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQTsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIEhhbmRsZSAxNCBiaXQgaW1tZWRpYXRlLCBzaGlmdGVkIGxlZnQgdHdpY2UuICAqLwotCSAgICBjYXNlICdkJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICYgMHgzKQotCQkgICAgYnJlYWs7Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgODE5MSwgLTgxOTIsIDApOwotCQkgIGlmIChudW0gPCAwKQotCQkgICAgb3Bjb2RlIHw9IDE7Ci0JCSAgbnVtICY9IDB4MWZmZjsKLQkJICBudW0gPj49IDI7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDMpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGlzX0RQX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfR09UT0ZGOwotCQkgIGVsc2UgaWYgKGlzX1BDX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICBlbHNlCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQTsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNDsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgIC8qIEhhbmRsZSBhIDE0IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdqJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBDSEVDS19GSUVMRCAobnVtLCA4MTkxLCAtODE5MiwgMCk7Ci0JCSAgbG93X3NpZ25fdW5leHQgKG51bSwgMTQsICZudW0pOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChpc19EUF9yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX0dPVE9GRjsKLQkJICBlbHNlIGlmIChpc19QQ19yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX1BDUkVMX0NBTEw7Ci0JCSAgZWxzZQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEE7Ci0JCSAgdGhlX2luc24uZm9ybWF0ID0gMTQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgYSAyMSBiaXQgaW1tZWRpYXRlIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnayc6Ci0JICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCQl7Ci0JCSAgbnVtID0gZXZhbHVhdGVfYWJzb2x1dGUgKCZ0aGVfaW5zbik7Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSA+PiAxMSwgMTA0ODU3NSwgLTEwNDg1NzYsIDApOwotCQkgIGRpc19hc3NlbWJsZV8yMSAobnVtLCAmbnVtKTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoaXNfRFBfcmVsYXRpdmUgKHRoZV9pbnNuLmV4cCkpCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9HT1RPRkY7Ci0JCSAgZWxzZSBpZiAoaXNfUENfcmVsYXRpdmUgKHRoZV9pbnNuLmV4cCkpCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9QQ1JFTF9DQUxMOwotCQkgIGVsc2UKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBOwotCQkgIHRoZV9pbnNuLmZvcm1hdCA9IDIxOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGEgMTIgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQuICAqLwotCSAgICBjYXNlICd3JzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGlmICghc3RyY21wIChTX0dFVF9OQU1FICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKSwgIkwkMFwwMDEiKSkKLQkJewotCQkgIHVuc2lnbmVkIGludCB3MSwgdywgcmVzdWx0OwotCi0JCSAgbnVtID0gZXZhbHVhdGVfYWJzb2x1dGUgKCZ0aGVfaW5zbik7Ci0JCSAgaWYgKG51bSAlIDQpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiQnJhbmNoIHRvIHVuYWxpZ25lZCBhZGRyZXNzIikpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBDSEVDS19GSUVMRCAobnVtLCA4MTk5LCAtODE4NCwgMCk7Ci0JCSAgc2lnbl91bmV4dCAoKG51bSAtIDgpID4+IDIsIDEyLCAmcmVzdWx0KTsKLQkJICBkaXNfYXNzZW1ibGVfMTIgKHJlc3VsdCwgJncxLCAmdyk7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCAoKHcxIDw8IDIpIHwgdyksIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxMjsKLQkJICB0aGVfaW5zbi5hcmdfcmVsb2MgPSBsYXN0X2NhbGxfZGVzYy5hcmdfcmVsb2M7Ci0JCSAgbWVtc2V0ICgmbGFzdF9jYWxsX2Rlc2MsIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfZGVzYykpOwotCQkgIHMgPSBleHByX2VuZDsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgIC8qIEhhbmRsZSBhIDE3IGJpdCBicmFuY2ggZGlzcGxhY2VtZW50LiAgKi8KLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBpZiAoIXRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wKLQkJICB8fCAhc3RyY21wIChTX0dFVF9OQU1FICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKSwKLQkJCSAgICAgICJMJDBcMDAxIikpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgdzIsIHcxLCB3LCByZXN1bHQ7Ci0KLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICUgNCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIENIRUNLX0ZJRUxEIChudW0sIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCkKLQkJICAgIG51bSAtPSA4OwotCi0JCSAgc2lnbl91bmV4dCAobnVtID4+IDIsIDE3LCAmcmVzdWx0KTsKLQkJICBkaXNfYXNzZW1ibGVfMTcgKHJlc3VsdCwgJncxLCAmdzIsICZ3KTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsCi0JCQkJCSAgICgodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdyksIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNzsKLQkJICB0aGVfaW5zbi5hcmdfcmVsb2MgPSBsYXN0X2NhbGxfZGVzYy5hcmdfcmVsb2M7Ci0JCSAgbWVtc2V0ICgmbGFzdF9jYWxsX2Rlc2MsIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfZGVzYykpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGEgMjIgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQuICAqLwotCSAgICBjYXNlICdYJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGlmICghdGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbAotCQkgIHx8ICFzdHJjbXAgKFNfR0VUX05BTUUgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wpLAotCQkJICAgICAgIkwkMFwwMDEiKSkKLQkJewotCQkgIHVuc2lnbmVkIGludCB3MywgdzIsIHcxLCB3LCByZXN1bHQ7Ci0KLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICUgNCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIENIRUNLX0ZJRUxEIChudW0sIDgzODg2MDcsIC04Mzg4NjA4LCAwKTsKLQotCQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKQotCQkgICAgbnVtIC09IDg7Ci0KLQkJICBzaWduX3VuZXh0IChudW0gPj4gMiwgMjIsICZyZXN1bHQpOwotCQkgIGRpc19hc3NlbWJsZV8yMiAocmVzdWx0LCAmdzMsICZ3MSwgJncyLCAmdyk7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLAotCQkJCQkgICAgICgodzMgPDwgMjEpIHwgKHcyIDw8IDIpCi0JCQkJCSAgICAgIHwgKHcxIDw8IDE2KSB8IHcpLAotCQkJCQkgICAgIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAyMjsKLQkJICB0aGVfaW5zbi5hcmdfcmVsb2MgPSBsYXN0X2NhbGxfZGVzYy5hcmdfcmVsb2M7Ci0JCSAgbWVtc2V0ICgmbGFzdF9jYWxsX2Rlc2MsIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfZGVzYykpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGFuIGFic29sdXRlIDE3IGJpdCBicmFuY2ggdGFyZ2V0LiAgKi8KLQkgICAgY2FzZSAneic6Ci0JICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKLQkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMDsKLQkgICAgICBpZiAoIXRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wKLQkJICB8fCAhc3RyY21wIChTX0dFVF9OQU1FICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKSwKLQkJCSAgICAgICJMJDBcMDAxIikpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgdzIsIHcxLCB3LCByZXN1bHQ7Ci0KLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICUgNCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIENIRUNLX0ZJRUxEIChudW0sIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCkKLQkJICAgIG51bSAtPSA4OwotCi0JCSAgc2lnbl91bmV4dCAobnVtID4+IDIsIDE3LCAmcmVzdWx0KTsKLQkJICBkaXNfYXNzZW1ibGVfMTcgKHJlc3VsdCwgJncxLCAmdzIsICZ3KTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsCi0JCQkJCSAgICgodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdyksIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfQUJTX0NBTEw7Ci0JCSAgdGhlX2luc24uZm9ybWF0ID0gMTc7Ci0JCSAgdGhlX2luc24uYXJnX3JlbG9jID0gbGFzdF9jYWxsX2Rlc2MuYXJnX3JlbG9jOwotCQkgIG1lbXNldCAoJmxhc3RfY2FsbF9kZXNjLCAwLCBzaXplb2YgKHN0cnVjdCBjYWxsX2Rlc2MpKTsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgIC8qIEhhbmRsZSAnJXIxJyBpbXBsaWNpdCBvcGVyYW5kIG9mIGFkZGlsIGluc3RydWN0aW9uLiAgKi8KLQkgICAgY2FzZSAnWic6Ci0JICAgICAgaWYgKCpzID09ICcsJyAmJiAqKHMgKyAxKSA9PSAnJScgJiYgKihzICsgMykgPT0gJzEnCi0JCSAgJiYgKCoocyArIDIpID09ICdyJyB8fCAqKHMgKyAyKSA9PSAnUicpKQotCQl7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZQotCSAgICAgICAgYnJlYWs7Ci0KLQkgICAgLyogSGFuZGxlICclc3IwLCVyMzEnIGltcGxpY2l0IG9wZXJhbmQgb2YgYmUsbCBpbnN0cnVjdGlvbi4gICovCi0JICAgIGNhc2UgJ1knOgotCSAgICAgIGlmIChzdHJuY2FzZWNtcCAocywgIiVzcjAsJXIzMSIsIDkpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gOTsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICAvKiBIYW5kbGUgaW1tZWRpYXRlIHZhbHVlIG9mIDAgZm9yIG9yZGVyZWQgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMuICAqLwotCSAgICBjYXNlICdAJzoKLQkgICAgICBpZiAoKnMgIT0gJzAnKQotCQlicmVhazsKLQkgICAgICBzKys7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgLyogSGFuZGxlIGEgMiBiaXQgc2hpZnQgY291bnQgYXQgMjUuICAqLwotCSAgICBjYXNlICcuJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMywgMSwgc3RyaWN0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgNik7Ci0KLQkgICAgLyogSGFuZGxlIGEgNCBiaXQgc2hpZnQgY291bnQgYXQgMjUuICAqLwotCSAgICBjYXNlICcqJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMTUsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHNoaWZ0IGNvdW50IGF0IDI2LiAgKi8KLQkgICAgY2FzZSAncCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCBzdHJpY3QpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgMzEgLSBudW0sIDUpOwotCi0JICAgIC8qIEhhbmRsZSBhIDYgYml0IHNoaWZ0IGNvdW50IGF0IDIwLDIyOjI2LiAgKi8KLQkgICAgY2FzZSAnfic6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDYzLCAwLCBzdHJpY3QpOwotCSAgICAgIG51bSA9IDYzIC0gbnVtOwotCSAgICAgIG9wY29kZSB8PSAobnVtICYgMHgyMCkgPDwgNjsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSAmIDB4MWYsIDUpOwotCi0JICAgIC8qIEhhbmRsZSBhIDYgYml0IGZpZWxkIGxlbmd0aCBhdCAyMywyNzozMS4gICovCi0JICAgIGNhc2UgJyUnOgotCSAgICAgIGZsYWcgPSAwOwotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA2NCwgMSwgc3RyaWN0KTsKLQkgICAgICBudW0tLTsKLQkgICAgICBvcGNvZGUgfD0gKG51bSAmIDB4MjApIDw8IDM7Ci0JICAgICAgbnVtID0gMzEgLSAobnVtICYgMHgxZik7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDYgYml0IGZpZWxkIGxlbmd0aCBhdCAxOSwyNzozMS4gICovCi0JICAgIGNhc2UgJ3wnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA2NCwgMSwgc3RyaWN0KTsKLQkgICAgICBudW0tLTsKLQkgICAgICBvcGNvZGUgfD0gKG51bSAmIDB4MjApIDw8IDc7Ci0JICAgICAgbnVtID0gMzEgLSAobnVtICYgMHgxZik7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IGJpdCBwb3NpdGlvbiBhdCAyNi4gICovCi0JICAgIGNhc2UgJ1AnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgc3RyaWN0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgNSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNiBiaXQgYml0IHBvc2l0aW9uIGF0IDIwLDIyOjI2LiAgKi8KLQkgICAgY2FzZSAncSc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDYzLCAwLCBzdHJpY3QpOwotCSAgICAgIG9wY29kZSB8PSAobnVtICYgMHgyMCkgPDwgNjsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSAmIDB4MWYsIDUpOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IGltbWVkaWF0ZSBhdCAxMCB3aXRoICdkJyBhcyB0aGUgY29tcGxlbWVudAotCSAgICAgICBvZiB0aGUgaGlnaCBiaXQgb2YgdGhlIGltbWVkaWF0ZS4gICovCi0JICAgIGNhc2UgJ0InOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA2MywgMCwgc3RyaWN0KTsKLQkgICAgICBpZiAobnVtICYgMHgyMCkKLQkJOwotCSAgICAgIGVsc2UKLQkJb3Bjb2RlIHw9ICgxIDw8IDEzKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSAmIDB4MWYsIDIxKTsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCBpbW1lZGlhdGUgYXQgMTAuICAqLwotCSAgICBjYXNlICdRJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCBzdHJpY3QpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAyMSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgOSBiaXQgaW1tZWRpYXRlIGF0IDI4LiAgKi8KLQkgICAgY2FzZSAnJCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDUxMSwgMSwgc3RyaWN0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMyk7Ci0KLQkgICAgLyogSGFuZGxlIGEgMTMgYml0IGltbWVkaWF0ZSBhdCAxOC4gICovCi0JICAgIGNhc2UgJ0EnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA4MTkxLCAwLCBzdHJpY3QpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxMyk7Ci0KLQkgICAgLyogSGFuZGxlIGEgMjYgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ0QnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA2NzExMDg4NjQsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDMgYml0IFNGVSBpZGVudGlmaWVyIGF0IDI1LiAgKi8KLQkgICAgY2FzZSAndic6Ci0JICAgICAgaWYgKCpzKysgIT0gJywnKQotCQlhc19iYWQgKF8oIkludmFsaWQgU0ZVIGlkZW50aWZpZXIiKSk7Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDcsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDIwIGJpdCBTT1AgZmllbGQgZm9yIHNwb3AwLiAgKi8KLQkgICAgY2FzZSAnTyc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDEwNDg1NzUsIDAsIHN0cmljdCk7Ci0JICAgICAgbnVtID0gKG51bSAmIDB4MWYpIHwgKChudW0gJiAweDAwMGZmZmUwKSA8PCA2KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgMTViaXQgU09QIGZpZWxkIGZvciBzcG9wMS4gICovCi0JICAgIGNhc2UgJ28nOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMjc2NywgMCwgc3RyaWN0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTEpOwotCi0JICAgIC8qIEhhbmRsZSBhIDEwYml0IFNPUCBmaWVsZCBmb3Igc3BvcDMuICAqLwotCSAgICBjYXNlICcwJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHN0cmljdCAmJiB0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlicmVhazsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMTAyMywgMCwgc3RyaWN0KTsKLQkgICAgICBudW0gPSAobnVtICYgMHgxZikgfCAoKG51bSAmIDB4MDAwMDAzZTApIDw8IDYpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQotCSAgICAvKiBIYW5kbGUgYSAxNSBiaXQgU09QIGZpZWxkIGZvciBzcG9wMi4gICovCi0JICAgIGNhc2UgJzEnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMjc2NywgMCwgc3RyaWN0KTsKLQkgICAgICBudW0gPSAobnVtICYgMHgxZikgfCAoKG51bSAmIDB4MDAwMDdmZTApIDw8IDYpOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQotCSAgICAvKiBIYW5kbGUgYSAzLWJpdCBjby1wcm9jZXNzb3IgSUQgZmllbGQuICAqLwotCSAgICBjYXNlICd1JzoKLQkgICAgICBpZiAoKnMrKyAhPSAnLCcpCi0JCWFzX2JhZCAoXygiSW52YWxpZCBDT1BSIGlkZW50aWZpZXIiKSk7Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIGlmIChzdHJpY3QgJiYgdGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQkJYnJlYWs7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDcsIDAsIHN0cmljdCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDIyYml0IFNPUCBmaWVsZCBmb3IgY29wci4gICovCi0JICAgIGNhc2UgJzInOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBpZiAoc3RyaWN0ICYmIHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA0MTk0MzAzLCAwLCBzdHJpY3QpOwotCSAgICAgIG51bSA9IChudW0gJiAweDFmKSB8ICgobnVtICYgMHgwMDNmZmZlMCkgPDwgNCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIHNvdXJjZSBGUCBvcGVyYW5kIGZvcm1hdCBjb21wbGV0ZXIuICAqLwotCSAgICBjYXNlICd7JzoKLQkgICAgICBpZiAoKnMgPT0gJywnICYmICoocysxKSA9PSAndCcpCi0JCXsKLQkJICB0aGVfaW5zbi50cnVuYyA9IDE7Ci0JCSAgcyArPSAyOwotCQl9Ci0JICAgICAgZWxzZQotCQl0aGVfaW5zbi50cnVuYyA9IDA7Ci0JICAgICAgZmxhZyA9IHBhX3BhcnNlX2ZwX2Nudl9mb3JtYXQgKCZzKTsKLQkgICAgICB0aGVfaW5zbi5mcG9mMSA9IGZsYWc7Ci0JICAgICAgaWYgKGZsYWcgPT0gVyB8fCBmbGFnID09IFVXKQotCQlmbGFnID0gU0dMOwotCSAgICAgIGlmIChmbGFnID09IERXIHx8IGZsYWcgPT0gVURXKQotCQlmbGFnID0gREJMOwotCSAgICAgIGlmIChmbGFnID09IFFXIHx8IGZsYWcgPT0gVVFXKQotCQlmbGFnID0gUVVBRDsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCSAgICAvKiBIYW5kbGUgYSBkZXN0aW5hdGlvbiBGUCBvcGVyYW5kIGZvcm1hdCBjb21wbGV0ZXIuICAqLwotCSAgICBjYXNlICdfJzoKLQkgICAgICAvKiBwYV9wYXJzZV9mb3JtYXQgbmVlZHMgdGhlICcsJyBwcmVmaXguICAqLwotCSAgICAgIHMtLTsKLQkgICAgICBmbGFnID0gcGFfcGFyc2VfZnBfY252X2Zvcm1hdCAoJnMpOwotCSAgICAgIHRoZV9pbnNuLmZwb2YyID0gZmxhZzsKLQkgICAgICBpZiAoZmxhZyA9PSBXIHx8IGZsYWcgPT0gVVcpCi0JCWZsYWcgPSBTR0w7Ci0JICAgICAgaWYgKGZsYWcgPT0gRFcgfHwgZmxhZyA9PSBVRFcpCi0JCWZsYWcgPSBEQkw7Ci0JICAgICAgaWYgKGZsYWcgPT0gUVcgfHwgZmxhZyA9PSBVUVcpCi0JCWZsYWcgPSBRVUFEOwotCSAgICAgIG9wY29kZSB8PSBmbGFnIDw8IDEzOwotCSAgICAgIGlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wKLQkJICB8fCB0aGVfaW5zbi5mcG9mMSA9PSBEQkwKLQkJICB8fCB0aGVfaW5zbi5mcG9mMSA9PSBRVUFEKQotCQl7Ci0JCSAgaWYgKHRoZV9pbnNuLmZwb2YyID09IFNHTAotCQkgICAgICB8fCB0aGVfaW5zbi5mcG9mMiA9PSBEQkwKLQkJICAgICAgfHwgdGhlX2luc24uZnBvZjIgPT0gUVVBRCkKLQkJICAgIGZsYWcgPSAwOwotCQkgIGVsc2UgaWYgKHRoZV9pbnNuLmZwb2YyID09IFcKLQkJICAgICAgfHwgdGhlX2luc24uZnBvZjIgPT0gRFcKLQkJICAgICAgfHwgdGhlX2luc24uZnBvZjIgPT0gUVcpCi0JCSAgICBmbGFnID0gMjsKLQkJICBlbHNlIGlmICh0aGVfaW5zbi5mcG9mMiA9PSBVVwotCQkgICAgICB8fCB0aGVfaW5zbi5mcG9mMiA9PSBVRFcKLQkJICAgICAgfHwgdGhlX2luc24uZnBvZjIgPT0gVVFXKQotCQkgICAgZmxhZyA9IDY7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICh0aGVfaW5zbi5mcG9mMSA9PSBXCi0JCSAgICAgICB8fCB0aGVfaW5zbi5mcG9mMSA9PSBEVwotCQkgICAgICAgfHwgdGhlX2luc24uZnBvZjEgPT0gUVcpCi0JCXsKLQkJICBpZiAodGhlX2luc24uZnBvZjIgPT0gU0dMCi0JCSAgICAgIHx8IHRoZV9pbnNuLmZwb2YyID09IERCTAotCQkgICAgICB8fCB0aGVfaW5zbi5mcG9mMiA9PSBRVUFEKQotCQkgICAgZmxhZyA9IDE7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICh0aGVfaW5zbi5mcG9mMSA9PSBVVwotCQkgICAgICAgfHwgdGhlX2luc24uZnBvZjEgPT0gVURXCi0JCSAgICAgICB8fCB0aGVfaW5zbi5mcG9mMSA9PSBVUVcpCi0JCXsKLQkJICBpZiAodGhlX2luc24uZnBvZjIgPT0gU0dMCi0JCSAgICAgIHx8IHRoZV9pbnNuLmZwb2YyID09IERCTAotCQkgICAgICB8fCB0aGVfaW5zbi5mcG9mMiA9PSBRVUFEKQotCQkgICAgZmxhZyA9IDU7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBmbGFnIHw9IHRoZV9pbnNuLnRydW5jOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTUpOwotCi0JICAgIC8qIEhhbmRsZSBhIHNvdXJjZSBGUCBvcGVyYW5kIGZvcm1hdCBjb21wbGV0ZXIuICAqLwotCSAgICBjYXNlICdGJzoKLQkgICAgICBmbGFnID0gcGFfcGFyc2VfZnBfZm9ybWF0ICgmcyk7Ci0JICAgICAgdGhlX2luc24uZnBvZjEgPSBmbGFnOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTEpOwotCi0JICAgIC8qIEhhbmRsZSBhIGRlc3RpbmF0aW9uIEZQIG9wZXJhbmQgZm9ybWF0IGNvbXBsZXRlci4gICovCi0JICAgIGNhc2UgJ0cnOgotCSAgICAgIC8qIHBhX3BhcnNlX2Zvcm1hdCBuZWVkcyB0aGUgJywnIHByZWZpeC4gICovCi0JICAgICAgcy0tOwotCSAgICAgIGZsYWcgPSBwYV9wYXJzZV9mcF9mb3JtYXQgKCZzKTsKLQkgICAgICB0aGVfaW5zbi5mcG9mMiA9IGZsYWc7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMyk7Ci0KLQkgICAgLyogSGFuZGxlIGEgc291cmNlIEZQIG9wZXJhbmQgZm9ybWF0IGNvbXBsZXRlciBhdCAyMC4gICovCi0JICAgIGNhc2UgJ0knOgotCSAgICAgIGZsYWcgPSBwYV9wYXJzZV9mcF9mb3JtYXQgKCZzKTsKLQkgICAgICB0aGVfaW5zbi5mcG9mMSA9IGZsYWc7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZCBmb3JtYXQgYXQgMjYuCi0JICAgICAgIE9ubHkgYWxsb3dzIHNpbmdsZSBhbmQgZG91YmxlIHByZWNpc2lvbi4gICovCi0JICAgIGNhc2UgJ0gnOgotCSAgICAgIGZsYWcgPSBwYV9wYXJzZV9mcF9mb3JtYXQgKCZzKTsKLQkgICAgICBzd2l0Y2ggKGZsYWcpCi0JCXsKLQkJY2FzZSBTR0w6Ci0JCSAgb3Bjb2RlIHw9IDB4MjA7Ci0JCWNhc2UgREJMOgotCQkgIHRoZV9pbnNuLmZwb2YxID0gZmxhZzsKLQkJICBjb250aW51ZTsKLQotCQljYXNlIFFVQUQ6Ci0JCWNhc2UgSUxMRUdBTF9GTVQ6Ci0JCWRlZmF1bHQ6Ci0JCSAgYXNfYmFkIChfKCJJbnZhbGlkIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0LiIpKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIEhhbmRsZSBhbGwgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLiAgKi8KLQkgICAgY2FzZSAnZic6Ci0JICAgICAgc3dpdGNoICgqKythcmdzKQotCSAgICAgICAgewotCQkvKiBGbG9hdCB0YXJnZXQgcmVnaXN0ZXIuICAqLwotCQljYXNlICd0JzoKLQkJICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkJICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgIGJyZWFrOwotCQkgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOwotCQkgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkJLyogRmxvYXQgdGFyZ2V0IHJlZ2lzdGVyIHdpdGggTC9SIHNlbGVjdGlvbi4gICovCi0JCWNhc2UgJ1QnOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIG9wY29kZSB8PSByZXN1bHQubnVtYmVyX3BhcnQ7Ci0KLQkJICAgIC8qIDB4MzAgb3Bjb2RlcyBhcmUgRlAgYXJpdGhtZXRpYyBvcGVyYXRpb24gb3Bjb2RlcwotCQkgICAgICAgYW5kIG5lZWQgdG8gYmUgdHVybmVkIGludG8gMHgzOCBvcGNvZGVzLiAgVGhpcwotCQkgICAgICAgaXMgbm90IG5lY2Vzc2FyeSBmb3IgbG9hZHMvc3RvcmVzLiAgKi8KLQkJICAgIGlmIChuZWVkX3BhMTFfb3Bjb2RlICgmdGhlX2luc24sICZyZXN1bHQpCi0JCQkmJiAoKG9wY29kZSAmIDB4ZmMwMDAwMDApID09IDB4MzAwMDAwMDApKQotCQkgICAgICBvcGNvZGUgfD0gMSA8PCAyNzsKLQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubF9yX3NlbGVjdCAmIDEsIDYpOwotCQkgIH0KLQotCQkvKiBGbG9hdCBvcGVyYW5kIDEuICAqLwotCQljYXNlICdhJzoKLQkJICB7Ci0JCSAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCQkgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCSAgICAgIGJyZWFrOwotCQkgICAgcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCSAgICBDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCSAgICBvcGNvZGUgfD0gcmVzdWx0Lm51bWJlcl9wYXJ0IDw8IDIxOwotCQkgICAgaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkpCi0JCSAgICAgIHsKLQkJCW9wY29kZSB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA3OwotCQkJb3Bjb2RlIHw9IDEgPDwgMjc7Ci0JCSAgICAgIH0KLQkJICAgIGNvbnRpbnVlOwotCQkgIH0KLQotCQkvKiBGbG9hdCBvcGVyYW5kIDEgd2l0aCBML1Igc2VsZWN0aW9uLiAgKi8KLQkJY2FzZSAnWCc6Ci0JCWNhc2UgJ0EnOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIG9wY29kZSB8PSByZXN1bHQubnVtYmVyX3BhcnQgPDwgMjE7Ci0JCSAgICBvcGNvZGUgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNzsKLQkJICAgIGNvbnRpbnVlOwotCQkgIH0KLQotCQkvKiBGbG9hdCBvcGVyYW5kIDIuICAqLwotCQljYXNlICdiJzoKLQkJICB7Ci0JCSAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCQkgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCSAgICAgIGJyZWFrOwotCQkgICAgcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCSAgICBDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCSAgICBvcGNvZGUgfD0gKHJlc3VsdC5udW1iZXJfcGFydCAmIDB4MWYpIDw8IDE2OwotCQkgICAgaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkpCi0JCSAgICAgIHsKLQkJCW9wY29kZSB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCAxMjsKLQkJCW9wY29kZSB8PSAxIDw8IDI3OwotCQkgICAgICB9Ci0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0KLQkJLyogRmxvYXQgb3BlcmFuZCAyIHdpdGggTC9SIHNlbGVjdGlvbi4gICovCi0JCWNhc2UgJ0InOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIG9wY29kZSB8PSAocmVzdWx0Lm51bWJlcl9wYXJ0ICYgMHgxZikgPDwgMTY7Ci0JCSAgICBvcGNvZGUgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgMTI7Ci0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0KLQkJLyogRmxvYXQgb3BlcmFuZCAzIGZvciBmbXB5ZmFkZCwgZm1weW5mYWRkLiAgKi8KLQkJY2FzZSAnQyc6Ci0JCSAgewotCQkgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCSAgICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkJICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQkgICAgICBicmVhazsKLQkJICAgIHBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQkgICAgQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubnVtYmVyX3BhcnQgJiAweDFjKSA8PCAxMTsKLQkJICAgIG9wY29kZSB8PSAocmVzdWx0Lm51bWJlcl9wYXJ0ICYgMHgzKSA8PCA5OwotCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDg7Ci0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0KLQkJLyogRmxvYXQgbXVsdCBvcGVyYW5kIDEgZm9yIGZtcHlhZGQsIGZtcHlzdWIgKi8KLQkJY2FzZSAnaSc6Ci0JCSAgewotCQkgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCSAgICAvKiBUaGlzIHNob3VsZCBiZSBtb3JlIHN0cmljdC4gIFNtYWxsIHN0ZXBzLiAgKi8KLQkJICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQkgICAgICBicmVhazsKLQkJICAgIHBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQkgICAgQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQkgICAgaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTCkKLQkJICAgICAgewotCQkJaWYgKHJlc3VsdC5udW1iZXJfcGFydCA8IDE2KQotCQkJICB7Ci0JCQkgICAgYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIH0KLQotCQkJcmVzdWx0Lm51bWJlcl9wYXJ0ICY9IDB4RjsKLQkJCXJlc3VsdC5udW1iZXJfcGFydCB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA0OwotCQkgICAgICB9Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5udW1iZXJfcGFydCwgMjEpOwotCQkgIH0KLQotCQkvKiBGbG9hdCBtdWx0IG9wZXJhbmQgMiBmb3IgZm1weWFkZCwgZm1weXN1YiAqLwotCQljYXNlICdqJzoKLQkJICB7Ci0JCSAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJICAgIC8qIFRoaXMgc2hvdWxkIGJlIG1vcmUgc3RyaWN0LiAgU21hbGwgc3RlcHMuICAqLwotCQkgICAgaWYgKHN0cmljdCAmJiAqcyAhPSAnJScpCi0JCSAgICAgIGJyZWFrOwotCQkgICAgcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCSAgICBDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCSAgICBpZiAodGhlX2luc24uZnBvZjEgPT0gU0dMKQotCQkgICAgICB7Ci0JCSAgICAgICAgaWYgKHJlc3VsdC5udW1iZXJfcGFydCA8IDE2KQotCQkgICAgICAgICAgewotCQkgICAgCWFzX2JhZCAgKF8oIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIikpOwotCQkgICAgCWJyZWFrOwotCQkgICAgICAgICAgfQotCQkgICAgICAgIHJlc3VsdC5udW1iZXJfcGFydCAmPSAweEY7Ci0JCSAgICAgICAgcmVzdWx0Lm51bWJlcl9wYXJ0IHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDQ7Ci0JCSAgICAgIH0KLQkJICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgcmVzdWx0Lm51bWJlcl9wYXJ0LCAxNik7Ci0JCSAgfQotCi0JCS8qIEZsb2F0IG11bHQgdGFyZ2V0IGZvciBmbXB5YWRkLCBmbXB5c3ViICovCi0JCWNhc2UgJ2snOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIGlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wpCi0JCSAgICAgIHsKLQkJICAgICAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCSAgICAgICAgICB7Ci0JCSAgICAJYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICAgICAgICB9Ci0JCSAgICAgICAgcmVzdWx0Lm51bWJlcl9wYXJ0ICY9IDB4RjsKLQkJICAgICAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubnVtYmVyX3BhcnQsIDApOwotCQkgIH0KLQotCQkvKiBGbG9hdCBhZGQgb3BlcmFuZCAxIGZvciBmbXB5YWRkLCBmbXB5c3ViICovCi0JCWNhc2UgJ2wnOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIGlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wpCi0JCSAgICAgIHsKLQkJICAgICAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCSAgICAgICAgICB7Ci0JCSAgICAJYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICAgICAgICB9Ci0JCSAgICAgICAgcmVzdWx0Lm51bWJlcl9wYXJ0ICY9IDB4RjsKLQkJICAgICAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubnVtYmVyX3BhcnQsIDYpOwotCQkgIH0KLQotCQkvKiBGbG9hdCBhZGQgdGFyZ2V0IGZvciBmbXB5YWRkLCBmbXB5c3ViICovCi0JCWNhc2UgJ20nOgotCQkgIHsKLQkJICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQkgICAgLyogVGhpcyBzaG91bGQgYmUgbW9yZSBzdHJpY3QuICBTbWFsbCBzdGVwcy4gICovCi0JCSAgICBpZiAoc3RyaWN0ICYmICpzICE9ICclJykKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJICAgIENIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJICAgIGlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wpCi0JCSAgICAgIHsKLQkJICAgICAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCSAgICAgICAgICB7Ci0JCSAgICAJYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCSAgICAJYnJlYWs7Ci0JCSAgICAgICAgICB9Ci0JCSAgICAgICAgcmVzdWx0Lm51bWJlcl9wYXJ0ICY9IDB4RjsKLQkJICAgICAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICAgICAgfQotCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubnVtYmVyX3BhcnQsIDExKTsKLQkJICB9Ci0KLQkJLyogSGFuZGxlIEwvUiByZWdpc3RlciBoYWx2ZXMgbGlrZSAneCcuICAqLwotCQljYXNlICdlJzoKLQkJICB7Ci0JCSAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJICAgIGlmIChzdHJpY3QgJiYgKnMgIT0gJyUnKQotCQkgICAgICBicmVhazsKLQkJICAgIHBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQkgICAgQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubnVtYmVyX3BhcnQgJiAweDFmKSA8PCAxNjsKLQkJICAgIGlmIChuZWVkX3BhMTFfb3Bjb2RlICgmdGhlX2luc24sICZyZXN1bHQpKQotCQkgICAgICB7Ci0JCQlvcGNvZGUgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgMTsKLQkJICAgICAgfQotCQkgICAgY29udGludWU7Ci0JCSAgfQotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gZmFpbGVkOgotICAgICAgLyogQ2hlY2sgaWYgdGhlIGFyZ3MgbWF0Y2hlZC4gICovCi0gICAgICBpZiAobWF0Y2ggPT0gRkFMU0UpCi0JewotCSAgaWYgKCZpbnNuWzFdIC0gcGFfb3Bjb2RlcyA8IChpbnQpIE5VTU9QQ09ERVMKLQkgICAgICAmJiAhc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpKQotCSAgICB7Ci0JICAgICAgKytpbnNuOwotCSAgICAgIHMgPSBhcmdzdGFydDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIG9wZXJhbmRzICVzIiksIGVycm9yX21lc3NhZ2UpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICB0aGVfaW5zbi5vcGNvZGUgPSBvcGNvZGU7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlzIHJldHVybmVkLiAgKi8KLQotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogV3JpdGUgb3V0IGJpZy1lbmRpYW4uICAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAgKi8KLQotYXJlbGVudCAqKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4cDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0gIHN0YXRpYyBhcmVsZW50ICpub19yZWxvY3MgPSBOVUxMOwotICBhcmVsZW50ICoqcmVsb2NzOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgKipjb2RlczsKLSAgaW50IG5fcmVsb2NzOwotICBpbnQgaTsKLQotICBocHBhX2ZpeHAgPSAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqKSBmaXhwLT50Y19maXhfZGF0YTsKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IDApCi0gICAgcmV0dXJuICZub19yZWxvY3M7Ci0gIGFzc2VydCAoaHBwYV9maXhwICE9IDApOwotICBhc3NlcnQgKHNlY3Rpb24gIT0gMCk7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+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+ZnJfb2Zmc2V0KQotICAgIHNpemUrKzsKLQotICByZXR1cm4gc2l6ZTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEFwcGx5IGEgZml4dXAgdG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFscCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxwOwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4UDsKLSAgbG9uZyBuZXdfdmFsLCByZXN1bHQgPSAwOwotICB1bnNpZ25lZCBpbnQgdzEsIHcyLCB3LCByZXN1bHRpOwotCi0gIGhwcGFfZml4UCA9IChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICopIGZpeFAtPnRjX2ZpeF9kYXRhOwotICAvKiBTT00gdXNlcyBSX0hQUEFfRU5UUlkgYW5kIFJfSFBQQV9FWElUIHJlbG9jYXRpb25zIHdoaWNoIGNhbgotICAgICBuZXZlciBiZSAiYXBwbGllZCIgKHRoZXkgYXJlIGp1c3QgbWFya2VycykuICBMaWtld2lzZSBmb3IKLSAgICAgUl9IUFBBX0JFR0lOX0JSVEFCIGFuZCBSX0hQUEFfRU5EX0JSVEFCLiAgKi8KLSNpZmRlZiBPQkpfU09NCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VOVFJZCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VYSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQkVHSU5fQlJUQUIKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5EX0JSVEFCCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX0JFR0lOX1RSWSkKLSAgICByZXR1cm4gMTsKLQotICAvKiBEaXNndXN0aW5nLiAgV2UgbXVzdCBzZXQgZnhfb2Zmc2V0IG91cnNlbHZlcyAtLSBSX0hQUEFfRU5EX1RSWQotICAgICBmaXh1cHMgYXJlIGNvbnNpZGVyZWQgbm90IGFkanVzdGFibGUsIHdoaWNoIGluIHR1cm4gY2F1c2VzCi0gICAgIGFkanVzdF9yZWxvY19zeW1zIHRvIG5vdCBzZXQgZnhfb2Zmc2V0LiAgVWdoLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5EX1RSWSkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9vZmZzZXQgPSAqdmFscDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFRoZXJlIHNob3VsZCBoYXZlIGJlZW4gYW4gSFBQQSBzcGVjaWZpYyBmaXh1cCBhc3NvY2lhdGVkCi0gICAgIHdpdGggdGhlIEdBUyBmaXh1cC4gICovCi0gIGlmIChocHBhX2ZpeFApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBidWZfd2QgPSBiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1Zik7Ci0gICAgICBpbnQgZm10ID0gYmZkX2hwcGFfaW5zbjJmbXQgKGJ1Zl93ZCk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGlzIGEgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpeHVwLCB0aGVuIGl0J3Mgc29tZXRoaW5nCi0JIHdoaWNoIHdpbGwgbmVlZCBhIFNPTSByZWxvY2F0aW9uIChleGNlcHQgZm9yIHNvbWUgUEMtcmVsYXRpdmUgcmVsb2NzKS4KLQkgSW4gc3VjaCBjYXNlcyB3ZSBzaG91bGQgdHJlYXQgdGhlICJ2YWwiIG9yICJhZGRlbmQiIGFzIHplcm8gc2luY2UgaXQKLQkgd2lsbCBiZSBhZGRlZCBpbiBhcyBuZWVkZWQgZnJvbSBmeF9vZmZzZXQgaW4gdGNfZ2VuX3JlbG9jLiAgKi8KLSAgICAgIGlmICgoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfTk9ORSkKLSNpZmRlZiBPQkpfU09NCi0JICAmJiBmbXQgIT0gMzIKLSNlbmRpZgotCSAgKQotCW5ld192YWwgPSAoKGZtdCA9PSAxMiB8fCBmbXQgPT0gMTcgfHwgZm10ID09IDIyKSA/IDggOiAwKTsKLSNpZmRlZiBPQkpfU09NCi0gICAgICAvKiBUaGVzZSBmaWVsZCBzZWxlY3RvcnMgaW1wbHkgdGhhdCB3ZSBkbyBub3Qgd2FudCBhbiBhZGRlbmQuICAqLwotICAgICAgZWxzZSBpZiAoaHBwYV9maXhQLT5meF9yX2ZpZWxkID09IGVfcHNlbAotCSAgICAgICB8fCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV9ycHNlbAotCSAgICAgICB8fCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV9scHNlbAotCSAgICAgICB8fCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV90c2VsCi0JICAgICAgIHx8IGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX3J0c2VsCi0JICAgICAgIHx8IGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX2x0c2VsKQotCW5ld192YWwgPSAoKGZtdCA9PSAxMiB8fCBmbXQgPT0gMTcgfHwgZm10ID09IDIyKSA/IDggOiAwKTsKLSAgICAgIC8qIFRoaXMgaXMgdHJ1ZWx5IGRpc2d1c3RpbmcuICBUaGUgbWFjaGluZSBpbmRlcGVuZGVudCBjb2RlIGJsaW5kbHkKLQkgYWRkcyBpbiB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBiZWluZyByZWxvY2F0ZWQgYWdhaW5zdC4gIERhbW4hICAqLwotICAgICAgZWxzZSBpZiAoZm10ID09IDMyCi0JICAgICAgICYmIGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IGJmZF9jb21fc2VjdGlvbl9wdHIpCi0JbmV3X3ZhbCA9IGhwcGFfZmllbGRfYWRqdXN0ICgqdmFscCAtIFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSksCi0JCQkJICAgICAwLCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQpOwotI2VuZGlmCi0gICAgICBlbHNlCi0JbmV3X3ZhbCA9IGhwcGFfZmllbGRfYWRqdXN0ICgqdmFscCwgMCwgaHBwYV9maXhQLT5meF9yX2ZpZWxkKTsKLQotICAgICAgLyogSGFuZGxlIHBjLXJlbGF0aXZlIGV4Y2VwdGlvbnMgZnJvbSBhYm92ZS4gICovCi0jZGVmaW5lIGFyZ19yZWxvY19zdHViX25lZWRlZChDQUxMRVIsIENBTExFRSkgXAotICAoKENBTExFRSkgJiYgKENBTExFUikgJiYgKChDQUxMRUUpICE9IChDQUxMRVIpKSkKLSAgICAgIGlmICgoZm10ID09IDEyIHx8IGZtdCA9PSAxNyB8fCBmbXQgPT0gMjIpCi0JICAmJiBmaXhQLT5meF9hZGRzeQotCSAgJiYgZml4UC0+ZnhfcGNyZWwKLSNpZmRlZiBPQkpfU09NCi0JICAmJiAhYXJnX3JlbG9jX3N0dWJfbmVlZGVkICgobG9uZykgKChvYmpfc3ltYm9sX3R5cGUgKikKLQkJc3ltYm9sX2dldF9iZmRzeW0gKGZpeFAtPmZ4X2FkZHN5KSktPnRjX2RhdGEuYXAuaHBwYV9hcmdfcmVsb2MsCi0JCWhwcGFfZml4UC0+ZnhfYXJnX3JlbG9jKQotI2VuZGlmCi0JICAmJiAoKChpbnQpKCp2YWxwKSA+IC0yNjIxNDQgJiYgKGludCkoKnZhbHApIDwgMjYyMTQzKSAmJiBmbXQgIT0gMjIpCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgPT0gaHBwYV9maXhQLT5zZWdtZW50Ci0JICAmJiAhKGZpeFAtPmZ4X3N1YnN5Ci0JICAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X3N1YnN5KSAhPSBocHBhX2ZpeFAtPnNlZ21lbnQpKQotCi0JbmV3X3ZhbCA9IGhwcGFfZmllbGRfYWRqdXN0ICgqdmFscCwgMCwgaHBwYV9maXhQLT5meF9yX2ZpZWxkKTsKLSN1bmRlZiBhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQKLQotICAgICAgc3dpdGNoIChmbXQpCi0JewotCS8qIEhhbmRsZSBhbGwgb3Bjb2RlcyB3aXRoIHRoZSAnaicgb3BlcmFuZCB0eXBlLiAgKi8KLQljYXNlIDE0OgotCSAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDgxOTEsIC04MTkyLCAwKTsKLQotCSAgLyogTWFzayBvZmYgMTQgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwKLQkJICAgICAgYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmZmYzAwMCwKLQkJICAgICAgYnVmKTsKLQkgIGxvd19zaWduX3VuZXh0IChuZXdfdmFsLCAxNCwgJnJlc3VsdGkpOwotCSAgcmVzdWx0ID0gcmVzdWx0aTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIGFsbCBvcGNvZGVzIHdpdGggdGhlICdrJyBvcGVyYW5kIHR5cGUuICAqLwotCWNhc2UgMjE6Ci0JICBDSEVDS19GSUVMRCAobmV3X3ZhbCwgMjA5NzE1MiwgMCwgMCk7Ci0KLQkgIC8qIE1hc2sgb2ZmIDIxIGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCi0JICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCi0JCSAgICAgIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZlMDAwMDAsCi0JCSAgICAgIGJ1Zik7Ci0JICBkaXNfYXNzZW1ibGVfMjEgKG5ld192YWwsICZyZXN1bHRpKTsKLQkgIHJlc3VsdCA9IHJlc3VsdGk7Ci0JICBicmVhazsKLQotCS8qIEhhbmRsZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgJ2knIG9wZXJhbmQgdHlwZS4gICovCi0JY2FzZSAxMToKLQkgIENIRUNLX0ZJRUxEIChuZXdfdmFsLCAxMDIzLCAtMTAyMywgMCk7Ci0KLQkgIC8qIE1hc2sgb2ZmIDExIGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCi0JICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCi0JCSAgICAgIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZmZjgwMCwKLQkJICAgICAgYnVmKTsKLQkgIGxvd19zaWduX3VuZXh0IChuZXdfdmFsLCAxMSwgJnJlc3VsdGkpOwotCSAgcmVzdWx0ID0gcmVzdWx0aTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIGFsbCB0aGUgb3Bjb2RlcyB3aXRoIHRoZSAndycgb3BlcmFuZCB0eXBlLiAgKi8KLQljYXNlIDEyOgotCSAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDgxOTksIC04MTg0LCAwKTsKLQotCSAgLyogTWFzayBvZmYgMTEgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgIHNpZ25fdW5leHQgKChuZXdfdmFsIC0gOCkgPj4gMiwgMTIsICZyZXN1bHRpKTsKLQkgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwKLQkJICAgICAgYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmZmZTAwMiwKLQkJICAgICAgYnVmKTsKLQotCSAgZGlzX2Fzc2VtYmxlXzEyIChyZXN1bHRpLCAmdzEsICZ3KTsKLQkgIHJlc3VsdCA9ICgodzEgPDwgMikgfCB3KTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIHNvbWUgb2YgdGhlIG9wY29kZXMgd2l0aCB0aGUgJ1cnIG9wZXJhbmQgdHlwZS4gICovCi0JY2FzZSAxNzoKLQkgIHsKLQkgICAgaW50IGRpc3RhbmNlID0gKnZhbHA7Ci0KLQkgICAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkgICAgLyogSWYgdGhpcyBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggKGllIG5vIGxpbmspIHdpdGggYW4gb3V0IG9mCi0JICAgICAgIHJhbmdlIHRhcmdldCwgdGhlbiB3ZSB3YW50IHRvIGNvbXBsYWluLiAgKi8KLQkgICAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfUENSRUxfQ0FMTAotCQkmJiAoZGlzdGFuY2UgPiAyNjIxNDMgfHwgZGlzdGFuY2UgPCAtMjYyMTQ0KQotCQkmJiAoYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmUwMDAwMCkgPT0gMHhlODAwMDAwMCkKLQkgICAgICBDSEVDS19GSUVMRCAoZGlzdGFuY2UsIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkgICAgLyogTWFzayBvZmYgMTcgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgICAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LAotCQkJYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmUwZTAwMiwKLQkJCWJ1Zik7Ci0JICAgIHNpZ25fdW5leHQgKChuZXdfdmFsIC0gOCkgPj4gMiwgMTcsICZyZXN1bHRpKTsKLQkgICAgZGlzX2Fzc2VtYmxlXzE3IChyZXN1bHRpLCAmdzEsICZ3MiwgJncpOwotCSAgICByZXN1bHQgPSAoKHcyIDw8IDIpIHwgKHcxIDw8IDE2KSB8IHcpOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgMjI6Ci0JICB7Ci0JICAgIGludCBkaXN0YW5jZSA9ICp2YWxwLCB3MzsKLQotCSAgICBDSEVDS19GSUVMRCAobmV3X3ZhbCwgODM4ODYwNywgLTgzODg2MDgsIDApOwotCi0JICAgIC8qIElmIHRoaXMgaXMgYW4gYWJzb2x1dGUgYnJhbmNoIChpZSBubyBsaW5rKSB3aXRoIGFuIG91dCBvZgotCSAgICAgICByYW5nZSB0YXJnZXQsIHRoZW4gd2Ugd2FudCB0byBjb21wbGFpbi4gICovCi0JICAgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX1BDUkVMX0NBTEwKLQkJJiYgKGRpc3RhbmNlID4gODM4ODYwNyB8fCBkaXN0YW5jZSA8IC04Mzg4NjA4KQotCQkmJiAoYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmUwMDAwMCkgPT0gMHhlODAwMDAwMCkKLQkgICAgICBDSEVDS19GSUVMRCAoZGlzdGFuY2UsIDgzODg2MDcsIC04Mzg4NjA4LCAwKTsKLQotCSAgICAvKiBNYXNrIG9mZiAyMiBiaXRzIHRvIGJlIGNoYW5nZWQuICAqLwotCSAgICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCi0JCQliZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1ZikgJiAweGZjMDBlMDAyLAotCQkJYnVmKTsKLQkgICAgc2lnbl91bmV4dCAoKG5ld192YWwgLSA4KSA+PiAyLCAyMiwgJnJlc3VsdGkpOwotCSAgICBkaXNfYXNzZW1ibGVfMjIgKHJlc3VsdGksICZ3MywgJncxLCAmdzIsICZ3KTsKLQkgICAgcmVzdWx0ID0gKCh3MyA8PCAyMSkgfCAodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdyk7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSAzMjoKLQkgIHJlc3VsdCA9IDA7Ci0JICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsIG5ld192YWwsIGJ1Zik7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhc19iYWQgKF8oIlVua25vd24gcmVsb2NhdGlvbiBlbmNvdW50ZXJlZCBpbiBtZF9hcHBseV9maXguIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBJbnNlcnQgdGhlIHJlbG9jYXRpb24uICAqLwotICAgICAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LCBiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1ZikgfCByZXN1bHQsIGJ1Zik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIm5vIGhwcGFfZml4dXAgZW50cnkgZm9yIHRoaXMgZml4dXAgKGZpeFAgPSAweCV4LCB0eXBlID0gMHgleClcbiIpLAotCSAgICAgICh1bnNpZ25lZCBpbnQpIGZpeFAsIGZpeFAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KLSAgIE9uIHRoZSBQQSwgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LiAgKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIGlucHV0IGxpbmUgcG9pbnRlciBpcyBhdCB0aGUgZW5kIG9mCi0gICBhIHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyBpbnQKLWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkKLXsKLSAgcmV0dXJuICgoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCSAgfHwgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzsnKQotCSAgfHwgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyEnKSk7Ci19Ci0KLS8qIFJlYWQgYSBudW1iZXIgZnJvbSBTLiAgVGhlIG51bWJlciBtaWdodCBjb21lIGluIG9uZSBvZiBtYW55IGZvcm1zLAotICAgdGhlIG1vc3QgY29tbW9uIHdpbGwgYmUgYSBoZXggb3IgZGVjaW1hbCBjb25zdGFudCwgYnV0IGl0IGNvdWxkIGJlCi0gICBhIHByZS1kZWZpbmVkIHJlZ2lzdGVyIChZdWshKSwgb3IgYW4gYWJzb2x1dGUgc3ltYm9sLgotCi0gICBSZXR1cm4gYSBudW1iZXIgb3IgLTEgZm9yIGZhaWx1cmUuCi0KLSAgIFdoZW4gcGFyc2luZyBQQS04OSBGUCByZWdpc3RlciBudW1iZXJzIFJFU1VMVCB3aWxsIGJlCi0gICB0aGUgYWRkcmVzcyBvZiBhIHN0cnVjdHVyZSB0byByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQKLSAgIEwvUiBoYWxmIG9mIEZQIHJlZ2lzdGVycywgc3RvcmUgcmVzdWx0cyB0aGVyZSBhcyBhcHByb3ByaWF0ZS4KLQotICAgcGFfcGFyc2VfbnVtYmVyIGNhbiBub3QgaGFuZGxlIG5lZ2F0aXZlIGNvbnN0YW50cyBhbmQgd2lsbCBmYWlsCi0gICBob3JyaWJseSBpZiBpdCBpcyBwYXNzZWQgc3VjaCBhIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfbnVtYmVyIChzLCByZXN1bHQpCi0gICAgIGNoYXIgKipzOwotICAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCAqcmVzdWx0OwotewotICBpbnQgbnVtOwotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgaW50IHN0YXR1czsKLSAgY2hhciAqcCA9ICpzOwotCi0gIC8qIFNraXAgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIG51bWJlci4gICovCi0gIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKLSAgICBwID0gcCArIDE7Ci0KLSAgLyogU3RvcmUgaW5mbyBpbiBSRVNVTFQgaWYgcmVxdWVzdGVkIGJ5IGNhbGxlci4gICovCi0gIGlmIChyZXN1bHQpCi0gICAgewotICAgICAgcmVzdWx0LT5udW1iZXJfcGFydCA9IC0xOwotICAgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gLTE7Ci0gICAgfQotICBudW0gPSAtMTsKLQotICBpZiAoaXNkaWdpdCAoKnApKQotICAgIHsKLSAgICAgIC8qIExvb2tzIGxpa2UgYSBudW1iZXIuICAqLwotICAgICAgbnVtID0gMDsKLQotICAgICAgaWYgKCpwID09ICcwJyAmJiAoKihwICsgMSkgPT0gJ3gnIHx8ICoocCArIDEpID09ICdYJykpCi0JewotCSAgLyogVGhlIG51bWJlciBpcyBzcGVjaWZpZWQgaW4gaGV4LiAgKi8KLQkgIHAgKz0gMjsKLQkgIHdoaWxlIChpc2RpZ2l0ICgqcCkgfHwgKCgqcCA+PSAnYScpICYmICgqcCA8PSAnZicpKQotCQkgfHwgKCgqcCA+PSAnQScpICYmICgqcCA8PSAnRicpKSkKLQkgICAgewotCSAgICAgIGlmIChpc2RpZ2l0ICgqcCkpCi0JCW51bSA9IG51bSAqIDE2ICsgKnAgLSAnMCc7Ci0JICAgICAgZWxzZSBpZiAoKnAgPj0gJ2EnICYmICpwIDw9ICdmJykKLQkJbnVtID0gbnVtICogMTYgKyAqcCAtICdhJyArIDEwOwotCSAgICAgIGVsc2UKLQkJbnVtID0gbnVtICogMTYgKyAqcCAtICdBJyArIDEwOwotCSAgICAgICsrcDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGUgbnVtYmVyIGlzIHNwZWNpZmllZCBpbiBkZWNpbWFsLiAgKi8KLQkgIHdoaWxlIChpc2RpZ2l0ICgqcCkpCi0JICAgIHsKLQkgICAgICBudW0gPSBudW0gKiAxMCArICpwIC0gJzAnOwotCSAgICAgICsrcDsKLQkgICAgfQotCX0KLQotICAgICAgLyogU3RvcmUgaW5mbyBpbiBSRVNVTFQgaWYgcmVxdWVzdGVkIGJ5IHRoZSBjYWxsZXIuICAqLwotICAgICAgaWYgKHJlc3VsdCkKLQl7Ci0JICByZXN1bHQtPm51bWJlcl9wYXJ0ID0gbnVtOwotCi0JICBpZiAoSVNfUl9TRUxFQ1QgKHApKQotCSAgICB7Ci0JICAgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMTsKLQkgICAgICArK3A7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKElTX0xfU0VMRUNUIChwKSkKLQkgICAgewotCSAgICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7Ci0JICAgICAgKytwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKnAgPT0gJyUnKQotICAgIHsKLSAgICAgIC8qIFRoZSBudW1iZXIgbWlnaHQgYmUgYSBwcmVkZWZpbmVkIHJlZ2lzdGVyLiAgKi8KLSAgICAgIG51bSA9IDA7Ci0gICAgICBuYW1lID0gcDsKLSAgICAgIHArKzsKLSAgICAgIGMgPSAqcDsKLSAgICAgIC8qIFRlZ2UgaGFjazogU3BlY2lhbCBjYXNlIGZvciBnZW5lcmFsIHJlZ2lzdGVycyBhcyB0aGUgZ2VuZXJhbAotICAgICAgICAgY29kZSBtYWtlcyBhIGJpbmFyeSBzZWFyY2ggd2l0aCBjYXNlIHRyYW5zbGF0aW9uLCBhbmQgaXMgVkVSWQotICAgICAgICAgc2xvdy4gKi8KLSAgICAgIGlmIChjID09ICdyJykKLQl7Ci0JICBwKys7Ci0JICBpZiAoKnAgPT0gJ2UnICYmICoocCArIDEpID09ICd0JwotCSAgICAgICYmICgqKHAgKyAyKSA9PSAnMCcgfHwgKihwICsgMikgPT0gJzEnKSkKLQkgICAgewotCSAgICAgIHAgKz0gMjsKLQkgICAgICBudW0gPSAqcCAtICcwJyArIDI4OwotCSAgICAgIHArKzsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnAgPT0gJ3AnKQotCSAgICB7Ci0JICAgICAgbnVtID0gMjsKLQkgICAgICBwKys7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCFpc2RpZ2l0ICgqcCkpCi0JICAgIHsKLQkgICAgICBpZiAocHJpbnRfZXJyb3JzKQotCQlhc19iYWQgKF8oIlVuZGVmaW5lZCByZWdpc3RlcjogJyVzJy4iKSwgbmFtZSk7Ci0JICAgICAgbnVtID0gLTE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGRvCi0JCW51bSA9IG51bSAqIDEwICsgKnArKyAtICcwJzsKLQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKnApKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEbyBhIG5vcm1hbCByZWdpc3RlciBzZWFyY2guICAqLwotCSAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoYykpCi0JICAgIHsKLQkgICAgICBwID0gcCArIDE7Ci0JICAgICAgYyA9ICpwOwotCSAgICB9Ci0JICAqcCA9IDA7Ci0JICBzdGF0dXMgPSByZWdfbmFtZV9zZWFyY2ggKG5hbWUpOwotCSAgaWYgKHN0YXR1cyA+PSAwKQotCSAgICBudW0gPSBzdGF0dXM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocHJpbnRfZXJyb3JzKQotCQlhc19iYWQgKF8oIlVuZGVmaW5lZCByZWdpc3RlcjogJyVzJy4iKSwgbmFtZSk7Ci0JICAgICAgbnVtID0gLTE7Ci0JICAgIH0KLQkgICpwID0gYzsKLQl9Ci0KLSAgICAgIC8qIFN0b3JlIGluZm8gaW4gUkVTVUxUIGlmIHJlcXVlc3RlZCBieSBjYWxsZXIuICAqLwotICAgICAgaWYgKHJlc3VsdCkKLQl7Ci0JICByZXN1bHQtPm51bWJlcl9wYXJ0ID0gbnVtOwotCSAgaWYgKElTX1JfU0VMRUNUIChwIC0gMSkpCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDE7Ci0JICBlbHNlIGlmIChJU19MX1NFTEVDVCAocCAtIDEpKQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAwOwotCSAgZWxzZQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBBbmQgZmluYWxseSwgaXQgY291bGQgYmUgYSBzeW1ib2wgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24gd2hpY2gKLSAgICAgICAgIGlzIGVmZmVjdGl2ZWx5IGEgY29uc3RhbnQuICAqLwotICAgICAgbnVtID0gMDsKLSAgICAgIG5hbWUgPSBwOwotICAgICAgYyA9ICpwOwotICAgICAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoYykpCi0JewotCSAgcCA9IHAgKyAxOwotCSAgYyA9ICpwOwotCX0KLSAgICAgICpwID0gMDsKLSAgICAgIGlmICgoc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpKSAhPSBOVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09ICZiZmRfYWJzX3NlY3Rpb24pCi0JICAgIG51bSA9IFNfR0VUX1ZBTFVFIChzeW0pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHByaW50X2Vycm9ycykKLQkJYXNfYmFkIChfKCJOb24tYWJzb2x1dGUgc3ltYm9sOiAnJXMnLiIpLCBuYW1lKTsKLQkgICAgICBudW0gPSAtMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGVyZSBpcyB3aGVyZSB3ZSdkIGNvbWUgZm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wKLQkgICAgIG9yIGZvciBhbiBlbXB0eSBzdHJpbmcuICBGb3IgYW4gZW1wdHkgc3RyaW5nIHdlCi0JICAgICB3aWxsIHJldHVybiB6ZXJvLiAgVGhhdCdzIGEgY29uY2Vzc2lvbiBtYWRlIGZvcgotCSAgICAgY29tcGF0YWJpbGl0eSB3aXRoIHRoZSBicmFpbmRhbWFnZWQgSFAgYXNzZW1ibGVycy4gICovCi0JICBpZiAoKm5hbWUgPT0gMCkKLQkgICAgbnVtID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChwcmludF9lcnJvcnMpCi0JCWFzX2JhZCAoXygiVW5kZWZpbmVkIGFic29sdXRlIGNvbnN0YW50OiAnJXMnLiIpLCBuYW1lKTsKLQkgICAgICBudW0gPSAtMTsKLQkgICAgfQotCX0KLSAgICAgICpwID0gYzsKLQotICAgICAgLyogU3RvcmUgaW5mbyBpbiBSRVNVTFQgaWYgcmVxdWVzdGVkIGJ5IGNhbGxlci4gICovCi0gICAgICBpZiAocmVzdWx0KQotCXsKLQkgIHJlc3VsdC0+bnVtYmVyX3BhcnQgPSBudW07Ci0JICBpZiAoSVNfUl9TRUxFQ1QgKHAgLSAxKSkKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMTsKLQkgIGVsc2UgaWYgKElTX0xfU0VMRUNUIChwIC0gMSkpCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7Ci0JICBlbHNlCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7Ci0JfQotICAgIH0KLQotICAqcyA9IHA7Ci0gIHJldHVybiBudW07Ci19Ci0KLSNkZWZpbmUgUkVHX05BTUVfQ05UCShzaXplb2YocHJlX2RlZmluZWRfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcGRfcmVnKSkKLQotLyogR2l2ZW4gTkFNRSwgZmluZCB0aGUgcmVnaXN0ZXIgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGF0IG5hbWUsIHJldHVybgotICAgdGhlIGludGVnZXIgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIC0xIG9uIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgaW50Ci1yZWdfbmFtZV9zZWFyY2ggKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLQotICBsb3cgPSAwOwotICBoaWdoID0gUkVHX05BTUVfQ05UIC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZQotCXJldHVybiBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbbWlkZGxlXS52YWx1ZTsKLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi0KLS8qIFJldHVybiBub256ZXJvIGlmIHRoZSBnaXZlbiBJTlNOIGFuZCBML1IgaW5mb3JtYXRpb24gd2lsbCByZXF1aXJlCi0gICBhIG5ldyBQQS0xLjEgb3Bjb2RlLiAgKi8KLQotc3RhdGljIGludAotbmVlZF9wYTExX29wY29kZSAoaW5zbiwgcmVzdWx0KQotICAgICBzdHJ1Y3QgcGFfaXQgKmluc247Ci0gICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0ICpyZXN1bHQ7Ci17Ci0gIGlmIChyZXN1bHQtPmxfcl9zZWxlY3QgPT0gMSAmJiAhKGluc24tPmZwb2YxID09IERCTCAmJiBpbnNuLT5mcG9mMiA9PSBEQkwpKQotICAgIHsKLSAgICAgIC8qIElmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZSwKLQkgdGhlbiBzZXQgYSBuZXcgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X21hY2ggKHN0ZG91dHB1dCkgPCBwYTExKQotCXsKLQkgIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfaHBwYSwgcGExMSkpCi0JICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCB1cGRhdGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotCX0KLSAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotLyogUGFyc2UgYSBjb25kaXRpb24gZm9yIGEgZmNtcCBpbnN0cnVjdGlvbi4gIFJldHVybiB0aGUgbnVtZXJpY2FsCi0gICBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZGl0aW9uLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfZnBfY21wX2NvbmQgKHMpCi0gICAgIGNoYXIgKipzOwotewotICBpbnQgY29uZCwgaTsKLQotICBjb25kID0gMDsKLQotICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKCpzLCBmcF9jb25kX21hcFtpXS5zdHJpbmcsCi0JCSAgICAgICBzdHJsZW4gKGZwX2NvbmRfbWFwW2ldLnN0cmluZykpID09IDApCi0JewotCSAgY29uZCA9IGZwX2NvbmRfbWFwW2ldLmNvbmQ7Ci0JICAqcyArPSBzdHJsZW4gKGZwX2NvbmRfbWFwW2ldLnN0cmluZyk7Ci0JICAvKiBJZiBub3QgYSBjb21wbGV0ZSBtYXRjaCwgYmFjayB1cCB0aGUgaW5wdXQgc3RyaW5nIGFuZAotCSAgICAgcmVwb3J0IGFuIGVycm9yLiAgKi8KLQkgIGlmICgqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQotCSAgICB7Ci0JICAgICAgKnMgLT0gc3RybGVuIChmcF9jb25kX21hcFtpXS5zdHJpbmcpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICB3aGlsZSAoKipzID09ICcgJyB8fCAqKnMgPT0gJ1x0JykKLQkgICAgKnMgPSAqcyArIDE7Ci0JICByZXR1cm4gY29uZDsKLQl9Ci0gICAgfQotCi0gIGFzX2JhZCAoXygiSW52YWxpZCBGUCBDb21wYXJlIENvbmRpdGlvbjogJXMiKSwgKnMpOwotCi0gIC8qIEFkdmFuY2Ugb3ZlciB0aGUgYm9ndXMgY29tcGxldGVyLiAgKi8KLSAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLSAgICAqcyArPSAxOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBQYXJzZSBhIGdyYXBoaWNzIHRlc3QgY29tcGxldGUgZm9yIGZ0ZXN0LiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfZnRlc3RfZ2Z4X2NvbXBsZXRlciAocykKLSAgICAgY2hhciAqKnM7Ci17Ci0gIGludCB2YWx1ZTsKLQotICB2YWx1ZSA9IDA7Ci0gIGlmIChzdHJuY2FzZWNtcCAoKnMsICJhY2M4IiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IDU7Ci0gICAgICAqcyArPSA0OwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAiYWNjNiIsIDQpID09IDApCi0gICAgewotICAgICAgdmFsdWUgPSA5OwotICAgICAgKnMgKz0gNDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgImFjYzQiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIHZhbHVlID0gMTM7Ci0gICAgICAqcyArPSA0OwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAiYWNjMiIsIDQpID09IDApCi0gICAgewotICAgICAgdmFsdWUgPSAxNzsKLSAgICAgICpzICs9IDQ7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJhY2MiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIHZhbHVlID0gMTsKLSAgICAgICpzICs9IDM7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJyZWo4IiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IDY7Ci0gICAgICAqcyArPSA0OwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAicmVqIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IDI7Ci0gICAgICAqcyArPSAzOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBGVEVTVCBjb21wbGV0ZXI6ICVzIiksICpzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBQYXJzZSBhbiBGUCBvcGVyYW5kIGZvcm1hdCBjb21wbGV0ZXIgcmV0dXJuaW5nIHRoZSBjb21wbGV0ZXIKLSAgIHR5cGUuICAqLwotCi1zdGF0aWMgZnBfb3BlcmFuZF9mb3JtYXQKLXBhX3BhcnNlX2ZwX2Nudl9mb3JtYXQgKHMpCi0gICAgIGNoYXIgKipzOwotewotICBpbnQgZm9ybWF0OwotCi0gIGZvcm1hdCA9IFNHTDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoKnMsICJzZ2wiLCAzKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFNHTDsKLQkgICpzICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAiZGJsIiwgMykgPT0gMCkKLQl7Ci0JICBmb3JtYXQgPSBEQkw7Ci0JICAqcyArPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgInF1YWQiLCA0KSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFFVQUQ7Ci0JICAqcyArPSA1OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgInciLCAxKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFc7Ci0JICAqcyArPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgInV3IiwgMikgPT0gMCkKLQl7Ci0JICBmb3JtYXQgPSBVVzsKLQkgICpzICs9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAiZHciLCAyKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IERXOwotCSAgKnMgKz0gMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJ1ZHciLCAzKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFVEVzsKLQkgICpzICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAicXciLCAyKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFFXOwotCSAgKnMgKz0gMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJ1cXciLCAzKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFVRVzsKLQkgICpzICs9IDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvcm1hdCA9IElMTEVHQUxfRk1UOwotCSAgYXNfYmFkIChfKCJJbnZhbGlkIEZQIE9wZXJhbmQgRm9ybWF0OiAlM3MiKSwgKnMpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZvcm1hdDsKLX0KLQotLyogUGFyc2UgYW4gRlAgb3BlcmFuZCBmb3JtYXQgY29tcGxldGVyIHJldHVybmluZyB0aGUgY29tcGxldGVyCi0gICB0eXBlLiAgKi8KLQotc3RhdGljIGZwX29wZXJhbmRfZm9ybWF0Ci1wYV9wYXJzZV9mcF9mb3JtYXQgKHMpCi0gICAgIGNoYXIgKipzOwotewotICBpbnQgZm9ybWF0OwotCi0gIGZvcm1hdCA9IFNHTDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoKnMsICJzZ2wiLCAzKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFNHTDsKLQkgICpzICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAiZGJsIiwgMykgPT0gMCkKLQl7Ci0JICBmb3JtYXQgPSBEQkw7Ci0JICAqcyArPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgInF1YWQiLCA0KSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IFFVQUQ7Ci0JICAqcyArPSA1OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3JtYXQgPSBJTExFR0FMX0ZNVDsKLQkgIGFzX2JhZCAoXygiSW52YWxpZCBGUCBPcGVyYW5kIEZvcm1hdDogJTNzIiksICpzKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBmb3JtYXQ7Ci19Ci0KLS8qIENvbnZlcnQgZnJvbSBhIHNlbGVjdG9yIHN0cmluZyBpbnRvIGEgc2VsZWN0b3IgdHlwZS4gICovCi0KLXN0YXRpYyBpbnQKLXBhX2Noa19maWVsZF9zZWxlY3RvciAoc3RyKQotICAgICBjaGFyICoqc3RyOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0gIGNoYXIgbmFtZVs0XTsKLQotICAvKiBSZWFkIHBhc3QgYW55IHdoaXRlc3BhY2UuICAqLwotICAvKiBGSVhNRTogc2hvdWxkIHdlIHJlYWQgcGFzdCBuZXdsaW5lcyBhbmQgZm9ybWZlZWRzPz8/ICovCi0gIHdoaWxlICgqKnN0ciA9PSAnICcgfHwgKipzdHIgPT0gJ1x0JyB8fCAqKnN0ciA9PSAnXG4nIHx8ICoqc3RyID09ICdcZicpCi0gICAgKnN0ciA9ICpzdHIgKyAxOwotCi0gIGlmICgoKnN0cilbMV0gPT0gJ1wnJyB8fCAoKnN0cilbMV0gPT0gJyUnKQotICAgIG5hbWVbMF0gPSB0b2xvd2VyICgoKnN0cilbMF0pLAotICAgIG5hbWVbMV0gPSAwOwotICBlbHNlIGlmICgoKnN0cilbMl0gPT0gJ1wnJyB8fCAoKnN0cilbMl0gPT0gJyUnKQotICAgIG5hbWVbMF0gPSB0b2xvd2VyICgoKnN0cilbMF0pLAotICAgIG5hbWVbMV0gPSB0b2xvd2VyICgoKnN0cilbMV0pLAotICAgIG5hbWVbMl0gPSAwOwotICBlbHNlIGlmICgoKnN0cilbM10gPT0gJ1wnJyB8fCAoKnN0cilbM10gPT0gJyUnKQotICAgIG5hbWVbMF0gPSB0b2xvd2VyICgoKnN0cilbMF0pLAotICAgIG5hbWVbMV0gPSB0b2xvd2VyICgoKnN0cilbMV0pLAotICAgIG5hbWVbMl0gPSB0b2xvd2VyICgoKnN0cilbMl0pLAotICAgIG5hbWVbM10gPSAwOwotICBlbHNlCi0gICAgcmV0dXJuIGVfZnNlbDsKLQotICBsb3cgPSAwOwotICBoaWdoID0gc2l6ZW9mIChzZWxlY3Rvcl90YWJsZSkgLyBzaXplb2YgKHN0cnVjdCBzZWxlY3Rvcl9lbnRyeSkgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNtcCAobmFtZSwgc2VsZWN0b3JfdGFibGVbbWlkZGxlXS5wcmVmaXgpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlCi0JewotCSAgKnN0ciArPSBzdHJsZW4gKG5hbWUpICsgMTsKLSNpZm5kZWYgT0JKX1NPTQotCSAgaWYgKHNlbGVjdG9yX3RhYmxlW21pZGRsZV0uZmllbGRfc2VsZWN0b3IgPT0gZV9uc2VsKQotCSAgICByZXR1cm4gZV9mc2VsOwotI2VuZGlmCi0JICByZXR1cm4gc2VsZWN0b3JfdGFibGVbbWlkZGxlXS5maWVsZF9zZWxlY3RvcjsKLQl9Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotCi0gIHJldHVybiBlX2ZzZWw7Ci19Ci0KLS8qIE1hcmsgKHZpYSBleHByX2VuZCkgdGhlIGVuZCBvZiBhbiBleHByZXNzaW9uIChJIHRoaW5rKS4gIEZJWE1FLiAgKi8KLQotc3RhdGljIGludAotZ2V0X2V4cHJlc3Npb24gKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzYXZlX2luOwotICBhc2VjdGlvbiAqc2VnOwotCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgc2VnID0gZXhwcmVzc2lvbiAoJnRoZV9pbnNuLmV4cCk7Ci0gIGlmICghKHNlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0JfHwgc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uCi0JfHwgU0VHX05PUk1BTCAoc2VnKSkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIHNlZ21lbnQgaW4gZXhwcmVzc2lvbi4iKSk7Ci0gICAgICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICByZXR1cm4gMDsKLX0KLQotLyogTWFyayAodmlhIGV4cHJfZW5kKSB0aGUgZW5kIG9mIGFuIGFic29sdXRlIGV4cHJlc3Npb24uICBGSVhNRS4gKi8KLXN0YXRpYyBpbnQKLXBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uIChpbnNuLCBzdHJwKQotICAgICBzdHJ1Y3QgcGFfaXQgKmluc247Ci0gICAgIGNoYXIgKipzdHJwOwotewotICBjaGFyICpzYXZlX2luOwotCi0gIGluc24tPmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yIChzdHJwKTsKLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gKnN0cnA7Ci0gIGV4cHJlc3Npb24gKCZpbnNuLT5leHApOwotICAvKiBUaGlzIGlzIG5vdCBwZXJmZWN0LCBidXQgaXMgYSBodWdlIGltcHJvdmVtZW50IG92ZXIgZG9pbmcgbm90aGluZy4KLQotICAgICBUaGUgUEEgYXNzZW1ibHkgc3ludGF4IGlzIGFtYmlnaW91cyBpbiBhIHZhcmlldHkgb2Ygd2F5cy4gIENvbnNpZGVyCi0gICAgIHRoaXMgc3RyaW5nICI0ICVyNSIgIElzIHRoYXQgdGhlIG51bWJlciA0IGZvbGxvd2VkIGJ5IHRoZSByZWdpc3RlcgotICAgICByNSwgb3IgaXMgdGhhdCA0IE1PRCA1PwotCi0gICAgIElmIHdlIGdldCBhIG1vZHVsbyBleHByZXNpb24gV2hlbiBsb29raW5nIGZvciBhbiBhYnNvbHV0ZSwgd2UgdHJ5Ci0gICAgIGFnYWluIGN1dHRpbmcgb2ZmIHRoZSBpbnB1dCBzdHJpbmcgYXQgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAgKi8KLSAgaWYgKGluc24tPmV4cC5YX29wID09IE9fbW9kdWx1cykKLSAgICB7Ci0gICAgICBjaGFyICpzLCBjOwotICAgICAgaW50IHJldHZhbDsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gKnN0cnA7Ci0gICAgICBzID0gKnN0cnA7Ci0gICAgICB3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotICAgICAgICBzKys7Ci0KLSAgICAgIGMgPSAqczsKLSAgICAgICpzID0gMDsKLQotICAgICAgcmV0dmFsID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKGluc24sIHN0cnApOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICAgICAgKnMgPSBjOwotICAgICAgcmV0dXJuIGV2YWx1YXRlX2Fic29sdXRlIChpbnNuKTsKLSAgICB9Ci0gIC8qIFdoZW4gaW4gc3RyaWN0IG1vZGUgd2UgaGF2ZSBhIG5vbi1tYXRjaCwgZml4IHVwIHRoZSBwb2ludGVycwotICAgICBhbmQgcmV0dXJuIHRvIG91ciBjYWxsZXIuICAqLwotICBpZiAoaW5zbi0+ZXhwLlhfb3AgIT0gT19jb25zdGFudCAmJiBzdHJpY3QpCi0gICAgewotICAgICAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoaW5zbi0+ZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkJhZCBzZWdtZW50IChzaG91bGQgYmUgYWJzb2x1dGUpLiIpKTsKLSAgICAgIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIHJldHVybiBldmFsdWF0ZV9hYnNvbHV0ZSAoaW5zbik7Ci19Ci0KLS8qIEV2YWx1YXRlIGFuIGFic29sdXRlIGV4cHJlc3Npb24gRVhQIHdoaWNoIG1heSBiZSBtb2RpZmllZCBieQotICAgdGhlIHNlbGVjdG9yIEZJRUxEX1NFTEVDVE9SLiAgUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4gICovCi1zdGF0aWMgaW50Ci1ldmFsdWF0ZV9hYnNvbHV0ZSAoaW5zbikKLSAgICAgc3RydWN0IHBhX2l0ICppbnNuOwotewotICBpbnQgdmFsdWU7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IGZpZWxkX3NlbGVjdG9yID0gaW5zbi0+ZmllbGRfc2VsZWN0b3I7Ci0KLSAgZXhwID0gaW5zbi0+ZXhwOwotICB2YWx1ZSA9IGV4cC5YX2FkZF9udW1iZXI7Ci0KLSAgc3dpdGNoIChmaWVsZF9zZWxlY3RvcikKLSAgICB7Ci0gICAgLyogTm8gY2hhbmdlLiAgKi8KLSAgICBjYXNlIGVfZnNlbDoKLSAgICAgIGJyZWFrOwotCi0gICAgLyogSWYgYml0IDIxIGlzIG9uIHRoZW4gYWRkIDB4ODAwIGFuZCBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExIGJpdHMuICAqLwotICAgIGNhc2UgZV9sc3NlbDoKLSAgICAgIGlmICh2YWx1ZSAmIDB4MDAwMDA0MDApCi0JdmFsdWUgKz0gMHg4MDA7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBTaWduIGV4dGVuZCBmcm9tIGJpdCAyMS4gICovCi0gICAgY2FzZSBlX3Jzc2VsOgotICAgICAgaWYgKHZhbHVlICYgMHgwMDAwMDQwMCkKLQl2YWx1ZSB8PSAweGZmZmZmODAwOwotICAgICAgZWxzZQotCXZhbHVlICY9IDB4N2ZmOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExIGJpdHMuICAqLwotICAgIGNhc2UgZV9sc2VsOgotICAgICAgdmFsdWUgPSAodmFsdWUgJiAweGZmZmZmODAwKSA+PiAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogU2V0IGJpdHMgMC0yMCB0byB6ZXJvLiAgKi8KLSAgICBjYXNlIGVfcnNlbDoKLSAgICAgIHZhbHVlID0gdmFsdWUgJiAweDdmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogQWRkIDB4ODAwIGFuZCBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExIGJpdHMuICAqLwotICAgIGNhc2UgZV9sZHNlbDoKLSAgICAgIHZhbHVlICs9IDB4ODAwOwotICAgICAgdmFsdWUgPSAodmFsdWUgJiAweGZmZmZmODAwKSA+PiAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogU2V0IGJpdGdzIDAtMjEgdG8gb25lLiAgKi8KLSAgICBjYXNlIGVfcmRzZWw6Ci0gICAgICB2YWx1ZSB8PSAweGZmZmZmODAwOwotICAgICAgYnJlYWs7Ci0KLSNkZWZpbmUgUlNFTF9ST1VORChjKSAgKCgoYykgKyAweDEwMDApICYgfjB4MWZmZikKLSAgICBjYXNlIGVfcnJzZWw6Ci0gICAgICB2YWx1ZSA9IChSU0VMX1JPVU5EICh2YWx1ZSkgJiAweDdmZikgKyAodmFsdWUgLSBSU0VMX1JPVU5EICh2YWx1ZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfbHJzZWw6Ci0gICAgICB2YWx1ZSA9IChSU0VMX1JPVU5EICh2YWx1ZSkgPj4gMTEpICYgMHgxZmZmZmY7Ci0gICAgICBicmVhazsKLSN1bmRlZiBSU0VMX1JPVU5ECi0KLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZpZWxkX3NlbGVjdG9yKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBHaXZlbiBhbiBhcmd1bWVudCBsb2NhdGlvbiBzcGVjaWZpY2F0aW9uIHJldHVybiB0aGUgYXNzb2NpYXRlZAotICAgYXJndW1lbnQgbG9jYXRpb24gbnVtYmVyLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGFfYnVpbGRfYXJnX3JlbG9jICh0eXBlX25hbWUpCi0gICAgIGNoYXIgKnR5cGVfbmFtZTsKLXsKLQotICBpZiAoc3RybmNhc2VjbXAgKHR5cGVfbmFtZSwgIm5vIiwgMikgPT0gMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKHN0cm5jYXNlY21wICh0eXBlX25hbWUsICJnciIsIDIpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wICh0eXBlX25hbWUsICJmciIsIDIpID09IDApCi0gICAgcmV0dXJuIDI7Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wICh0eXBlX25hbWUsICJmdSIsIDIpID09IDApCi0gICAgcmV0dXJuIDM7Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oIkludmFsaWQgYXJndW1lbnQgbG9jYXRpb246ICVzXG4iKSwgdHlwZV9uYW1lKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogRW5jb2RlIGFuZCByZXR1cm4gYW4gYXJndW1lbnQgcmVsb2NhdGlvbiBzcGVjaWZpY2F0aW9uIGZvcgotICAgdGhlIGdpdmVuIHJlZ2lzdGVyIGluIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgYXJnX3JlbG9jLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGFfYWxpZ25fYXJnX3JlbG9jIChyZWcsIGFyZ19yZWxvYykKLSAgICAgdW5zaWduZWQgaW50IHJlZzsKLSAgICAgdW5zaWduZWQgaW50IGFyZ19yZWxvYzsKLXsKLSAgdW5zaWduZWQgaW50IG5ld19yZWxvYzsKLQotICBuZXdfcmVsb2MgPSBhcmdfcmVsb2M7Ci0gIHN3aXRjaCAocmVnKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBuZXdfcmVsb2MgPDw9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBuZXdfcmVsb2MgPDw9IDY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBuZXdfcmVsb2MgPDw9IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBuZXdfcmVsb2MgPDw9IDI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIGFyZ3VtZW50IGRlc2NyaXB0aW9uOiAlZCIpLCByZWcpOwotICAgIH0KLQotICByZXR1cm4gbmV3X3JlbG9jOwotfQotCi0vKiBQYXJzZSBhIFBBIG51bGxpZmljYXRpb24gY29tcGxldGVyICgsbikuICBSZXR1cm4gbm9uemVybyBpZiB0aGUKLSAgIGNvbXBsZXRlciB3YXMgZm91bmQ7IHJldHVybiB6ZXJvIGlmIG5vIGNvbXBsZXRlciB3YXMgZm91bmQuICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9udWxsaWYgKHMpCi0gICAgIGNoYXIgKipzOwotewotICBpbnQgbnVsbGlmOwotCi0gIG51bGxpZiA9IDA7Ci0gIGlmICgqKnMgPT0gJywnKQotICAgIHsKLSAgICAgICpzID0gKnMgKyAxOwotICAgICAgaWYgKHN0cm5jYXNlY21wICgqcywgIm4iLCAxKSA9PSAwKQotCW51bGxpZiA9IDE7Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJJbnZhbGlkIE51bGxpZmljYXRpb246ICglYykiKSwgKipzKTsKLQkgIG51bGxpZiA9IDA7Ci0JfQotICAgICAgKnMgPSAqcyArIDE7Ci0gICAgfQotCi0gIHJldHVybiBudWxsaWY7Ci19Ci0KLS8qIFBhcnNlIGEgbm9uLW5lZ2F0ZWQgY29tcGFyZS9zdWJ0cmFjdCBjb21wbGV0ZXIgcmV0dXJuaW5nIHRoZQotICAgbnVtYmVyIChmb3IgZW5jb2RpbmcgaW4gaW5zdHJ1dGlvbnMpIG9mIHRoZSBnaXZlbiBjb21wbGV0ZXIuCi0KLSAgIElTQlJBTkNIIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIHBhcnNpbmcgYSBjb25kaXRpb24KLSAgIGNvbXBsZXRlciBmb3IgYSBicmFuY2ggKHZzIGEgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXIgZm9yIGEKLSAgIGNvbXB1dGF0aW9uYWwgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0ciAocywgaXNicmFuY2gpCi0gICAgIGNoYXIgKipzOwotICAgICBpbnQgaXNicmFuY2g7Ci17Ci0gIGludCBjbXBsdHI7Ci0gIGNoYXIgKm5hbWUgPSAqcyArIDE7Ci0gIGNoYXIgYzsKLSAgY2hhciAqc2F2ZV9zID0gKnM7Ci0gIGludCBudWxsaWZ5ID0gMDsKLQotICBjbXBsdHIgPSAwOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkqcyArPSAxOwotICAgICAgYyA9ICoqczsKLSAgICAgICoqcyA9IDB4MDA7Ci0KLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPCIpID09IDApCi0JewotCSAgY21wbHRyID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PCIpID09IDApCi0JewotCSAgY21wbHRyID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDU7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInN2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA2OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJvZCIpID09IDApCi0JewotCSAgY21wbHRyID0gNzsKLQl9Ci0gICAgICAvKiBJZiB3ZSBoYXZlIHNvbWV0aGluZyBsaWtlIGFkZGIsbiB0aGVuIHRoZXJlIGlzIG5vIGNvbmRpdGlvbgotICAgICAgICAgY29tcGxldGVyLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuIikgPT0gMCAmJiBpc2JyYW5jaCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCSAgbnVsbGlmeSA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNtcGx0ciA9IC0xOwotCX0KLSAgICAgICoqcyA9IGM7Ci0gICAgfQotCi0gIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChudWxsaWZ5KQotICAgICpzID0gc2F2ZV9zOwotCi0KLSAgcmV0dXJuIGNtcGx0cjsKLX0KLQotLyogUGFyc2UgYSBuZWdhdGVkIGNvbXBhcmUvc3VidHJhY3QgY29tcGxldGVyIHJldHVybmluZyB0aGUKLSAgIG51bWJlciAoZm9yIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLgotCi0gICBJU0JSQU5DSCBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyBwYXJzaW5nIGEgY29uZGl0aW9uCi0gICBjb21wbGV0ZXIgZm9yIGEgYnJhbmNoICh2cyBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBhCi0gICBjb21wdXRhdGlvbmFsIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfbmVnX2NtcHN1Yl9jbXBsdHIgKHMsIGlzYnJhbmNoKQotICAgICBjaGFyICoqczsKLSAgICAgaW50IGlzYnJhbmNoOwotewotICBpbnQgY21wbHRyOwotICBjaGFyICpuYW1lID0gKnMgKyAxOwotICBjaGFyIGM7Ci0gIGNoYXIgKnNhdmVfcyA9ICpzOwotICBpbnQgbnVsbGlmeSA9IDA7Ci0KLSAgY21wbHRyID0gMDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JKnMgKz0gMTsKLSAgICAgIGMgPSAqKnM7Ci0gICAgICAqKnMgPSAweDAwOwotCi0KLSAgICAgIGlmIChzdHJjYXNlY21wIChuYW1lLCAidHIiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPiIpID09IDApCi0JewotCSAgY21wbHRyID0gMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+Pj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDU7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm5zdiIpID09IDApCi0JewotCSAgY21wbHRyID0gNjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDc7Ci0JfQotICAgICAgLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBhZGRiLG4gdGhlbiB0aGVyZSBpcyBubyBjb25kaXRpb24KLSAgICAgICAgIGNvbXBsZXRlci4gICovCi0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibiIpID09IDAgJiYgaXNicmFuY2gpCi0JewotCSAgY21wbHRyID0gMDsKLQkgIG51bGxpZnkgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjbXBsdHIgPSAtMTsKLQl9Ci0gICAgICAqKnMgPSBjOwotICAgIH0KLQotICAvKiBSZXNldCBwb2ludGVycyBpZiB0aGlzIHdhcyByZWFsbHkgYSAsbiBmb3IgYSBicmFuY2ggaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAobnVsbGlmeSkKLSAgICAqcyA9IHNhdmVfczsKLQotCi0gIHJldHVybiBjbXBsdHI7Ci19Ci0KLQotLyogUGFyc2UgYSA2NCBiaXQgY29tcGFyZSBhbmQgYnJhbmNoIGNvbXBsZXRlciByZXR1cm5pbmcgdGhlIG51bWJlciAoZm9yCi0gICBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KLQotICAgTm9ubmVnYXRlZCBjb21wYXJpc29ucyBhcmUgcmV0dXJuZWQgYXMgMC03LCBuZWdhdGVkIGNvbXBhcmlzb25zIGFyZQotICAgcmV0dXJuZWQgYXMgOC0xNS4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX2NtcGJfNjRfY21wbHRyIChzKQotICAgICBjaGFyICoqczsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLQotICBjbXBsdHIgPSAtMTsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JKnMgKz0gMTsKLSAgICAgIGMgPSAqKnM7Ci0gICAgICAqKnMgPSAweDAwOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiKiIpID09IDApCi0JewotCSAgY21wbHRyID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqPSIpID09IDApCi0JewotCSAgY21wbHRyID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqPCIpID09IDApCi0JewotCSAgY21wbHRyID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqPD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKjw8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio8PD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDU7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIipzdiIpID09IDApCi0JewotCSAgY21wbHRyID0gNjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiKm9kIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA3OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICIqdHIiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDg7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKjw+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA5OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio+PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMTA7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKj4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDExOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio+Pj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDEyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio+PiIpID09IDApCi0JewotCSAgY21wbHRyID0gMTM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIipuc3YiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDE0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICIqZXYiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDE1OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjbXBsdHIgPSAtMTsKLQl9Ci0gICAgICAqKnMgPSBjOwotICAgIH0KLQotCi0gIHJldHVybiBjbXBsdHI7Ci19Ci0KLS8qIFBhcnNlIGEgNjQgYml0IGNvbXBhcmUgaW1tZWRpYXRlIGFuZCBicmFuY2ggY29tcGxldGVyIHJldHVybmluZyB0aGUgbnVtYmVyCi0gICAoZm9yIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfY21waWJfNjRfY21wbHRyIChzKQotICAgICBjaGFyICoqczsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLQotICBjbXBsdHIgPSAtMTsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JKnMgKz0gMTsKLSAgICAgIGMgPSAqKnM7Ci0gICAgICAqKnMgPSAweDAwOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiKjw8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio8PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqPj49IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIio8PiIpID09IDApCi0JewotCSAgY21wbHRyID0gNTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiKj49IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA2OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICIqPiIpID09IDApCi0JewotCSAgY21wbHRyID0gNzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY21wbHRyID0gLTE7Ci0JfQotICAgICAgKipzID0gYzsKLSAgICB9Ci0KLQotICByZXR1cm4gY21wbHRyOwotfQotCi0vKiBQYXJzZSBhIG5vbi1uZWdhdGVkIGFkZGl0aW9uIGNvbXBsZXRlciByZXR1cm5pbmcgdGhlIG51bWJlcgotICAgKGZvciBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KLQotICAgSVNCUkFOQ0ggc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcGFyc2luZyBhIGNvbmRpdGlvbgotICAgY29tcGxldGVyIGZvciBhIGJyYW5jaCAodnMgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYQotICAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyIChzLCBpc2JyYW5jaCkKLSAgICAgY2hhciAqKnM7Ci0gICAgIGludCBpc2JyYW5jaDsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLQotICBjbXBsdHIgPSAwOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkqcyArPSAxOwotICAgICAgYyA9ICoqczsKLSAgICAgICoqcyA9IDB4MDA7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiPSIpID09IDApCi0JewotCSAgY21wbHRyID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJudXYiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInpudiIpID09IDApCi0JewotCSAgY21wbHRyID0gNTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAic3YiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDY7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA3OwotCX0KLSAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCi0gICAgICAgICBjb21wbGV0ZXIuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmIGlzYnJhbmNoKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNtcGx0ciA9IC0xOwotCX0KLSAgICAgICoqcyA9IGM7Ci0gICAgfQotCi0gIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChjbXBsdHIgPT0gMCAmJiAqbmFtZSA9PSAnbicgJiYgaXNicmFuY2gpCi0gICAgKnMgPSBzYXZlX3M7Ci0KLSAgcmV0dXJuIGNtcGx0cjsKLX0KLQotLyogUGFyc2UgYSBuZWdhdGVkIGFkZGl0aW9uIGNvbXBsZXRlciByZXR1cm5pbmcgdGhlIG51bWJlcgotICAgKGZvciBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KLQotICAgSVNCUkFOQ0ggc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcGFyc2luZyBhIGNvbmRpdGlvbgotICAgY29tcGxldGVyIGZvciBhIGJyYW5jaCAodnMgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYQotICAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbikuICAqLwotCi1zdGF0aWMgaW50Ci1wYV9wYXJzZV9uZWdfYWRkX2NtcGx0ciAocywgaXNicmFuY2gpCi0gICAgIGNoYXIgKipzOwotICAgICBpbnQgaXNicmFuY2g7Ci17Ci0gIGludCBjbXBsdHI7Ci0gIGNoYXIgKm5hbWUgPSAqcyArIDE7Ci0gIGNoYXIgYzsKLSAgY2hhciAqc2F2ZV9zID0gKnM7Ci0KLSAgY21wbHRyID0gMDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JKnMgKz0gMTsKLSAgICAgIGMgPSAqKnM7Ci0gICAgICAqKnMgPSAweDAwOwotICAgICAgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JewotCSAgY21wbHRyID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCi0JewotCSAgY21wbHRyID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAzOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ1diIpID09IDApCi0JewotCSAgY21wbHRyID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAidm56IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA1OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuc3YiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDY7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImV2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA3OwotCX0KLSAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCi0gICAgICAgICBjb21wbGV0ZXIuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmIGlzYnJhbmNoKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNtcGx0ciA9IC0xOwotCX0KLSAgICAgICoqcyA9IGM7Ci0gICAgfQotCi0gIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChjbXBsdHIgPT0gMCAmJiAqbmFtZSA9PSAnbicgJiYgaXNicmFuY2gpCi0gICAgKnMgPSBzYXZlX3M7Ci0KLSAgcmV0dXJuIGNtcGx0cjsKLX0KLQotLyogUGFyc2UgYSA2NCBiaXQgd2lkZSBtb2RlIGFkZCBhbmQgYnJhbmNoIGNvbXBsZXRlciByZXR1cm5pbmcgdGhlIG51bWJlciAoZm9yCi0gICBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX2FkZGJfNjRfY21wbHRyIChzKQotICAgICBjaGFyICoqczsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLSAgaW50IG51bGxpZnkgPSAwOwotCi0gIGNtcGx0ciA9IDA7Ci0gIGlmICgqKnMgPT0gJywnKQotICAgIHsKLSAgICAgICpzICs9IDE7Ci0gICAgICB3aGlsZSAoKipzICE9ICcsJyAmJiAqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQotCSpzICs9IDE7Ci0gICAgICBjID0gKipzOwotICAgICAgKipzID0gMHgwMDsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm51diIpID09IDApCi0JewotCSAgY21wbHRyID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiKj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDU7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIio8IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA2OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICIqPD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDc7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAidHIiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDg7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDEwOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDExOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ1diIpID09IDApCi0JewotCSAgY21wbHRyID0gMTI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIio8PiIpID09IDApCi0JewotCSAgY21wbHRyID0gMTM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIio+PSIpID09IDApCi0JewotCSAgY21wbHRyID0gMTQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIio+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxNTsKLQl9Ci0gICAgICAvKiBJZiB3ZSBoYXZlIHNvbWV0aGluZyBsaWtlIGFkZGIsbiB0aGVuIHRoZXJlIGlzIG5vIGNvbmRpdGlvbgotICAgICAgICAgY29tcGxldGVyLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCSAgbnVsbGlmeSA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNtcGx0ciA9IC0xOwotCX0KLSAgICAgICoqcyA9IGM7Ci0gICAgfQotCi0gIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChudWxsaWZ5KQotICAgICpzID0gc2F2ZV9zOwotCi0gIHJldHVybiBjbXBsdHI7Ci19Ci0KLSNpZmRlZiBPQkpfU09NCi0vKiBIYW5kbGUgYW4gYWxpZ25tZW50IGRpcmVjdGl2ZS4gIFNwZWNpYWwgc28gdGhhdCB3ZSBjYW4gdXBkYXRlIHRoZQotICAgYWxpZ25tZW50IG9mIHRoZSBzdWJzcGFjZSBpZiBuZWNlc3NhcnkuICAqLwotc3RhdGljIHZvaWQKLXBhX2FsaWduIChieXRlcykKLXsKLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0KLSAgLyogTGV0IHRoZSBnZW5lcmljIGdhcyBjb2RlIGRvIG1vc3Qgb2YgdGhlIHdvcmsuICAqLwotICBzX2FsaWduX2J5dGVzIChieXRlcyk7Ci0KLSAgLyogSWYgYnl0ZXMgaXMgYSBwb3dlciBvZiAyLCB0aGVuIHVwZGF0ZSB0aGUgY3VycmVudCBzdWJzcGFjZSdzCi0gICAgIGFsaWdubWVudCBpZiBuZWNlc3NhcnkuICAqLwotICBpZiAobG9nMiAoYnl0ZXMpICE9IC0xKQotICAgIHJlY29yZF9hbGlnbm1lbnQgKGN1cnJlbnRfc3Vic3BhY2UtPnNzZF9zZWcsIGxvZzIgKGJ5dGVzKSk7Ci19Ci0jZW5kaWYKLQotLyogSGFuZGxlIGEgLkJMT0NLIHR5cGUgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2Jsb2NrICh6KQotICAgICBpbnQgejsKLXsKLSAgY2hhciAqcDsKLSAgbG9uZyBpbnQgdGVtcF9maWxsOwotICB1bnNpZ25lZCBpbnQgdGVtcF9zaXplOwotICB1bnNpZ25lZCBpbnQgaTsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICB0ZW1wX3NpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICAvKiBBbHdheXMgZmlsbCB3aXRoIHplcm9zLCB0aGF0J3Mgd2hhdCB0aGUgSFAgYXNzZW1ibGVyIGRvZXMuICAqLwotICB0ZW1wX2ZpbGwgPSAwOwotCi0gIHAgPSBmcmFnX3ZhciAocnNfZmlsbCwgKGludCkgdGVtcF9zaXplLCAoaW50KSB0ZW1wX3NpemUsCi0JCShyZWxheF9zdWJzdGF0ZVQpIDAsIChzeW1ib2xTICopIDAsIChvZmZzZXRUKSAxLCBOVUxMKTsKLSAgbWVtc2V0IChwLCAwLCB0ZW1wX3NpemUpOwotCi0gIC8qIENvbnZlcnQgMiBieXRlcyBhdCBhIHRpbWUuICAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCB0ZW1wX3NpemU7IGkgKz0gMikKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyBpLAotCQkJICAodmFsdWVUKSB0ZW1wX2ZpbGwsCi0JCQkgIChpbnQpICgodGVtcF9zaXplIC0gaSkgPiAyID8gMiA6ICh0ZW1wX3NpemUgLSBpKSkpOwotICAgIH0KLQotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLmJlZ2luX2JydGFiIGFuZCAuZW5kX2JydGFiIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9icnRhYiAoYmVnaW4pCi0gICAgIGludCBiZWdpbjsKLXsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogVGhlIEJSVEFCIHJlbG9jYXRpb25zIGFyZSBvbmx5IGF2YWlsYmxlIGluIFNPTSAodG8gZGVub3RlCi0gICAgIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBicmFuY2ggdGFibGVzKS4gICovCi0gIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgwKTsKLQotICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCB3aGVyZSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAwLAotCQlOVUxMLCAob2Zmc2V0VCkgMCwgTlVMTCwKLQkJMCwgYmVnaW4gPyBSX0hQUEFfQkVHSU5fQlJUQUIgOiBSX0hQUEFfRU5EX0JSVEFCLAotCQllX2ZzZWwsIDAsIDAsIE5VTEwpOwotI2VuZGlmCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLmJlZ2luX3RyeSBhbmQgLmVuZF90cnkgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3RyeSAoYmVnaW4pCi0gICAgIGludCBiZWdpbjsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIGV4cHJlc3Npb25TIGV4cDsKLSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0gIGlmICghIGJlZ2luKQotICAgIGV4cHJlc3Npb24gKCZleHApOwotCi0gIC8qIFRoZSBUUlkgcmVsb2NhdGlvbnMgYXJlIG9ubHkgYXZhaWxibGUgaW4gU09NICh0byBkZW5vdGUKLSAgICAgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGV4Y2VwdGlvbiBoYW5kbGluZyByZWdpb25zKS4gICovCi0KLSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJTlVMTCwgKG9mZnNldFQpIDAsIGJlZ2luID8gTlVMTCA6ICZleHAsCi0JCTAsIGJlZ2luID8gUl9IUFBBX0JFR0lOX1RSWSA6IFJfSFBQQV9FTkRfVFJZLAotCQllX2ZzZWwsIDAsIDAsIE5VTEwpOwotI2VuZGlmCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLkNBTEwgcHNldWRvLW9wLiAgVGhpcyBpbnZvbHZlcyBzdG9yaW5nIGF3YXkgaW5mb3JtYXRpb24KLSAgIGFib3V0IHdoZXJlIGFyZ3VtZW50cyBhcmUgdG8gYmUgZm91bmQgc28gdGhlIGxpbmtlciBjYW4gZGV0ZWN0Ci0gICAoYW5kIGNvcnJlY3QpIGFyZ3VtZW50IGxvY2F0aW9uIG1pc21hdGNoZXMgYmV0d2VlbiBjYWxsZXIgYW5kIGNhbGxlZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jYWxsICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIHBhX2NhbGxfYXJncyAoJmxhc3RfY2FsbF9kZXNjKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogRG8gdGhlIGRpcnR5IHdvcmsgb2YgYnVpbGRpbmcgYSBjYWxsIGRlc2NyaXB0b3Igd2hpY2ggZGVzY3JpYmVzCi0gICB3aGVyZSB0aGUgY2FsbGVyIHBsYWNlZCBhcmd1bWVudHMgdG8gYSBmdW5jdGlvbiBjYWxsLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NhbGxfYXJncyAoY2FsbF9kZXNjKQotICAgICBzdHJ1Y3QgY2FsbF9kZXNjICpjYWxsX2Rlc2M7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICB1bnNpZ25lZCBpbnQgdGVtcCwgYXJnX3JlbG9jOwotCi0gIHdoaWxlICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgLyogUHJvY2VzcyBhIHNvdXJjZSBhcmd1bWVudC4gICovCi0gICAgICBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiYXJndyIsIDQpID09IDApKQotCXsKLQkgIHRlbXAgPSBhdG9pIChuYW1lICsgNCk7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgYXJnX3JlbG9jID0gcGFfYnVpbGRfYXJnX3JlbG9jIChuYW1lKTsKLQkgIGNhbGxfZGVzYy0+YXJnX3JlbG9jIHw9IHBhX2FsaWduX2FyZ19yZWxvYyAodGVtcCwgYXJnX3JlbG9jKTsKLQl9Ci0gICAgICAvKiBQcm9jZXNzIGEgcmV0dXJuIHZhbHVlLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInJ0bnZhbCIsIDYpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICBhcmdfcmVsb2MgPSBwYV9idWlsZF9hcmdfcmVsb2MgKG5hbWUpOwotCSAgY2FsbF9kZXNjLT5hcmdfcmVsb2MgfD0gKGFyZ19yZWxvYyAmIDB4Myk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiSW52YWxpZCAuQ0FMTCBhcmd1bWVudDogJXMiKSwgbmFtZSk7Ci0JfQotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiBUUlVFIGlmIEZSQUcxIGFuZCBGUkFHMiBhcmUgdGhlIHNhbWUuICAqLwotCi1zdGF0aWMgaW50Ci1pc19zYW1lX2ZyYWcgKGZyYWcxLCBmcmFnMikKLSAgICAgZnJhZ1MgKmZyYWcxOwotICAgICBmcmFnUyAqZnJhZzI7Ci17Ci0KLSAgaWYgKGZyYWcxID09IE5VTEwpCi0gICAgcmV0dXJuIChGQUxTRSk7Ci0gIGVsc2UgaWYgKGZyYWcyID09IE5VTEwpCi0gICAgcmV0dXJuIChGQUxTRSk7Ci0gIGVsc2UgaWYgKGZyYWcxID09IGZyYWcyKQotICAgIHJldHVybiAoVFJVRSk7Ci0gIGVsc2UgaWYgKGZyYWcyLT5mcl90eXBlID09IHJzX2ZpbGwgJiYgZnJhZzItPmZyX2ZpeCA9PSAwKQotICAgIHJldHVybiAoaXNfc2FtZV9mcmFnIChmcmFnMSwgZnJhZzItPmZyX25leHQpKTsKLSAgZWxzZQotICAgIHJldHVybiAoRkFMU0UpOwotfQotCi0jaWZkZWYgT0JKX0VMRgotLyogQnVpbGQgYW4gZW50cnkgaW4gdGhlIFVOV0lORCBzdWJzcGFjZSBmcm9tIHRoZSBnaXZlbiBmdW5jdGlvbgotICAgYXR0cmlidXRlcyBpbiBDQUxMX0lORk8uICBUaGlzIGlzIG5vdCBuZWVkZWQgZm9yIFNPTSBhcyB1c2luZwotICAgUl9FTlRSWSBhbmQgUl9FWElUIHJlbG9jYXRpb25zIGFsbG93IHRoZSBsaW5rZXIgdG8gaGFuZGxlIGJ1aWxkaW5nCi0gICBvZiB0aGUgdW53aW5kIHNwYWNlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9idWlsZF91bndpbmRfc3Vic3BhY2UgKGNhbGxfaW5mbykKLSAgICAgc3RydWN0IGNhbGxfaW5mbyAqY2FsbF9pbmZvOwotewotICBjaGFyICp1bndpbmQ7Ci0gIGFzZWN0aW9uICpzZWcsICpzYXZlX3NlZzsKLSAgYXN5bWJvbCAqc3ltOwotICBzdWJzZWdUIHN1YnNlZywgc2F2ZV9zdWJzZWc7Ci0gIGludCBpLCByZWxvYzsKLSAgY2hhciBjLCAqcDsKLQotICBpZiAobm93X3NlZyAhPSB0ZXh0X3NlY3Rpb24pCi0gICAgcmV0dXJuOwotCi0gIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoc3Rkb3V0cHV0KS0+Yml0c19wZXJfYWRkcmVzcyA9PSAzMikKLSAgICByZWxvYyA9IFJfUEFSSVNDX0RJUjMyOwotICBlbHNlCi0gICAgcmVsb2MgPSBSX1BBUklTQ19TRUdSRUwzMjsKLQotICAvKiBHZXQgaW50byB0aGUgcmlnaHQgc2VnL3N1YnNlZy4gIFRoaXMgbWF5IGludm9sdmUgY3JlYXRpbmcKLSAgICAgdGhlIHNlZyB0aGUgZmlyc3QgdGltZSB0aHJvdWdoLiAgTWFrZSBzdXJlIHRvIGhhdmUgdGhlCi0gICAgIG9sZCBzZWcvc3Vic2VnIHNvIHRoYXQgd2UgY2FuIHJlc2V0IHRoaW5ncyB3aGVuIHdlIGFyZSBkb25lLiAgKi8KLSAgc2VnID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwgVU5XSU5EX1NFQ1RJT05fTkFNRSk7Ci0gIGlmIChzZWcgPT0gQVNFQ19OVUxMKQotICAgIHsKLSAgICAgIHNlZyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3Rkb3V0cHV0LCBVTldJTkRfU0VDVElPTl9OQU1FKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWcsCi0JCQkgICAgIFNFQ19SRUFET05MWSB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCSAgICAgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19BTExPQyB8IFNFQ19EQVRBKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCAyKTsKLSAgICB9Ci0KLSAgc2F2ZV9zZWcgPSBub3dfc2VnOwotICBzYXZlX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIHN1YnNlZ19zZXQgKHNlZywgMCk7Ci0KLQotICAvKiBHZXQgc29tZSBzcGFjZSB0byBob2xkIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSB1bndpbmQKLSAgICAgZGVzY3JpcHRvci4gICovCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIDAsIDQpOwotCi0gIC8qIFJlbG9jYXRpb24gaW5mby4gZm9yIHN0YXJ0IG9mZnNldCBvZiB0aGUgZnVuY3Rpb24uICAqLwotICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsCi0JCWNhbGxfaW5mby0+c3RhcnRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJKGV4cHJlc3Npb25TICopIE5VTEwsIDAsIHJlbG9jLAotCQllX2ZzZWwsIDMyLCAwLCBOVUxMKTsKLQotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAwLCA0KTsKLQotICAvKiBSZWxvY2F0aW9uIGluZm8uIGZvciBlbmQgb2Zmc2V0IG9mIHRoZSBmdW5jdGlvbi4KLQotICAgICBCZWNhdXNlIHdlIGFsbG93IHJlZHVjdGlvbnMgb2YgMzJiaXQgcmVsb2NhdGlvbnMgZm9yIEVMRiwgdGhpcyB3aWxsIGJlCi0gICAgIHJlZHVjZWQgdG8gc2VjdGlvbl9zeW0gKyBvZmZzZXQgd2hpY2ggYXZvaWRzIHB1dHRpbmcgdGhlIHRlbXBvcmFyeQotICAgICBzeW1ib2wgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgSXQgKHNob3VsZCkgZW5kIHVwIGdpdmluZyB0aGUgc2FtZQotICAgICB2YWx1ZSBhcyBjYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCArIGZ1bmN0aW9uIHNpemUgb25jZSB0aGUgbGlua2VyIGlzCi0gICAgIGZpbmlzaGVkIHdpdGggaXRzIHdvcmsuICAqLwotCi0gIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJY2FsbF9pbmZvLT5lbmRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJKGV4cHJlc3Npb25TICopIE5VTEwsIDAsIHJlbG9jLAotCQllX2ZzZWwsIDMyLCAwLCBOVUxMKTsKLQotICAvKiBEdW1wIGl0LiAqLwotICB1bndpbmQgPSAoY2hhciAqKSAmY2FsbF9pbmZvLT5jaV91bndpbmQ7Ci0gIGZvciAoaSA9IDg7IGkgPCBzaXplb2YgKHN0cnVjdCB1bndpbmRfdGFibGUpOyBpKyspCi0gICAgewotICAgICAgYyA9ICoodW53aW5kICsgaSk7Ci0gICAgICB7Ci0JRlJBR19BUFBFTkRfMV9DSEFSIChjKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgLyogUmV0dXJuIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNlZ21lbnQvc3Vic2VnbWVudC4gICovCi0gIHN1YnNlZ19zZXQgKHNhdmVfc2VnLCBzYXZlX3N1YnNlZyk7Ci19Ci0jZW5kaWYKLQotLyogUHJvY2VzcyBhIC5DQUxMSU5GTyBwc2V1ZG8tb3AuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgbGF0ZXIKLSAgIHRvIGJ1aWxkIHVud2luZCBkZXNjcmlwdG9ycyBhbmQgbWF5YmUgb25lIGRheSB0byBzdXBwb3J0Ci0gICAuRU5URVIgYW5kIC5MRUFWRS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jYWxsaW5mbyAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpuYW1lLCBjLCAqcDsKLSAgaW50IHRlbXA7Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgLyogLkNBTExJTkZPIG11c3QgYXBwZWFyIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLiAgKi8KLSAgaWYgKCF3aXRoaW5fcHJvY2VkdXJlKQotICAgIGFzX2JhZCAoXygiLmNhbGxpbmZvIGlzIG5vdCB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbiIpKTsKLQotICAvKiBNYXJrIHRoZSBmYWN0IHRoYXQgd2UgZm91bmQgdGhlIC5DQUxMSU5GTyBmb3IgdGhlCi0gICAgIGN1cnJlbnQgcHJvY2VkdXJlLiAgKi8KLSAgY2FsbGluZm9fZm91bmQgPSBUUlVFOwotCi0gIC8qIEl0ZXJhdGUgb3ZlciB0aGUgLkNBTExJTkZPIGFyZ3VtZW50cy4gICovCi0gIHdoaWxlICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgLyogRnJhbWUgc2l6ZSBzcGVjaWZpY2F0aW9uLiAgKi8KLSAgICAgIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJmcmFtZSIsIDUpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIGlmICgodGVtcCAmIDB4MykgIT0gMCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiRlJBTUUgcGFyYW1ldGVyIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4OiAlZFxuIiksIHRlbXApOwotCSAgICAgIHRlbXAgPSAwOwotCSAgICB9Ci0KLQkgIC8qIGNhbGxpbmZvIGlzIGluIGJ5dGVzIGFuZCB1bndpbmRfZGVzYyBpcyBpbiA4IGJ5dGUgdW5pdHMuICAqLwotCSAgbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLmZyYW1lX3NpemUgPSB0ZW1wIC8gODsKLQotCX0KLSAgICAgIC8qIEVudHJ5IHJlZ2lzdGVyIChHUiwgR1IgYW5kIFNSKSBzcGVjaWZpY2F0aW9ucy4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJlbnRyeV9nciIsIDgpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIC8qIFRoZSBIUCBhc3NlbWJsZXIgYWNjZXB0cyAxOSBhcyB0aGUgaGlnaCBib3VuZCBmb3IgRU5UUllfR1IKLQkgICAgIGV2ZW4gdGhvdWdoICVyMTkgaXMgY2FsbGVyIHNhdmVkLiAgSSB0aGluayB0aGlzIGlzIGEgYnVnIGluCi0JICAgICB0aGUgSFAgYXNzZW1ibGVyLCBhbmQgd2UgYXJlIG5vdCBnb2luZyB0byBlbXVsYXRlIGl0LiAgKi8KLQkgIGlmICh0ZW1wIDwgMyB8fCB0ZW1wID4gMTgpCi0JICAgIGFzX2JhZCAoXygiVmFsdWUgZm9yIEVOVFJZX0dSIG11c3QgYmUgaW4gdGhlIHJhbmdlIDMuLjE4XG4iKSk7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuZW50cnlfZ3IgPSB0ZW1wIC0gMjsKLQl9Ci0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJlbnRyeV9mciIsIDgpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIC8qIFNpbWlsYXJseSB0aGUgSFAgYXNzZW1ibGVyIHRha2VzIDMxIGFzIHRoZSBoaWdoIGJvdW5kIGV2ZW4KLQkgICAgIHRob3VnaCAlZnIyMSBpcyB0aGUgbGFzdCBjYWxsZWUgc2F2ZWQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAqLwotCSAgaWYgKHRlbXAgPCAxMiB8fCB0ZW1wID4gMjEpCi0JICAgIGFzX2JhZCAoXygiVmFsdWUgZm9yIEVOVFJZX0ZSIG11c3QgYmUgaW4gdGhlIHJhbmdlIDEyLi4yMVxuIikpOwotCSAgbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLmVudHJ5X2ZyID0gdGVtcCAtIDExOwotCX0KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImVudHJ5X3NyIiwgOCkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgaWYgKHRlbXAgIT0gMykKLQkgICAgYXNfYmFkIChfKCJWYWx1ZSBmb3IgRU5UUllfU1IgbXVzdCBiZSAzXG4iKSk7Ci0JfQotICAgICAgLyogTm90ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGFueSBjYWxscy4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJjYWxscyIsIDUpID09IDApIHx8Ci0JICAgICAgIChzdHJuY2FzZWNtcCAobmFtZSwgImNhbGxlciIsIDYpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JfQotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAibm9fY2FsbHMiLCA4KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCX0KLSAgICAgIC8qIFNob3VsZCBSUCBiZSBzYXZlZCBpbnRvIHRoZSBzdGFjay4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJzYXZlX3JwIiwgNykgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5zYXZlX3JwID0gMTsKLQl9Ci0gICAgICAvKiBMaWtld2lzZSBmb3IgU1AuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAic2F2ZV9zcCIsIDcpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3Iuc2F2ZV9zcCA9IDE7Ci0JfQotICAgICAgLyogSXMgdGhpcyBhbiB1bndpbmRhYmxlIHByb2NlZHVyZS4gIElmIHNvIG1hcmsgaXQgc28KLSAgICAgICAgIGluIHRoZSB1bndpbmQgZGVzY3JpcHRvci4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJub191bndpbmQiLCA5KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLmNhbm5vdF91bndpbmQgPSAxOwotCX0KLSAgICAgIC8qIElzIHRoaXMgYW4gaW50ZXJydXB0IHJvdXRpbmUuICBJZiBzbyBtYXJrIGl0IGluIHRoZQotICAgICAgICAgdW53aW5kIGRlc2NyaXB0b3IuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiaHB1eF9pbnQiLCA3KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLmhwdXhfaW50ZXJydXB0X21hcmtlciA9IDE7Ci0JfQotICAgICAgLyogSXMgdGhpcyBhIG1pbGxpY29kZSByb3V0aW5lLiAgIm1pbGxpY29kZSIgaXNuJ3QgaW4gbXkKLQkgYXNzZW1ibGVyIG1hbnVhbCwgYnV0IG15IGNvcHkgaXMgb2xkLiAgVGhlIEhQIGFzc2VtYmxlcgotCSBhY2NlcHRzIGl0LCBhbmQgdGhlcmUncyBhIHBsYWNlIGluIHRoZSB1bndpbmQgZGVzY3JpcHRvcgotCSB0byBkcm9wIHRoZSBpbmZvcm1hdGlvbiwgc28gd2UnbGwgYWNjZXB0IGl0IHRvby4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJtaWxsaWNvZGUiLCA5KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLm1pbGxpY29kZSA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiSW52YWxpZCAuQ0FMTElORk8gYXJndW1lbnQ6ICVzIiksIG5hbWUpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JfQotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBTd2l0Y2ggaW50byB0aGUgY29kZSBzdWJzcGFjZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jb2RlICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICBjdXJyZW50X3NwYWNlID0gaXNfZGVmaW5lZF9zcGFjZSAoIiRURVhUJCIpOwotICBjdXJyZW50X3N1YnNwYWNlCi0gICAgPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChjdXJyZW50X3NwYWNlLT5zZF9zZWcsIDApOwotI2VuZGlmCi0gIHNfdGV4dCAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBzdGFuZGFyZCBHQVMgc19jb21tKCkuIE9uIEhQOTAwMC84MDAgbWFjaGluZXMsCi0gICB0aGUgLmNvbW0gcHNldWRvLW9wIGhhcyB0aGUgZm9sbG93aW5nIHN5bXRheDoKLQotICAgPGxhYmVsPiAuY29tbSA8bGVuZ3RoPgotCi0gICB3aGVyZSA8bGFiZWw+IGlzIG9wdGlvbmFsIGFuZCBpcyBhIHN5bWJvbCB3aG9zZSBhZGRyZXNzIHdpbGwgYmUgdGhlIHN0YXJ0IG9mCi0gICBhIGJsb2NrIG9mIG1lbW9yeSA8bGVuZ3RoPiBieXRlcyBsb25nLiA8bGVuZ3RoPiBtdXN0IGJlIGFuIGFic29sdXRlCi0gICBleHByZXNzaW9uLiAgPGxlbmd0aD4gYnl0ZXMgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhlIGN1cnJlbnQgc3BhY2UKLSAgIGFuZCBzdWJzcGFjZS4KLQotICAgQWxzbyBub3RlIHRoZSBsYWJlbCBtYXkgbm90IGV2ZW4gYmUgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgLmNvbW0uCi0KLSAgIFRoaXMgZGlmZmVyZW5jZSBpbiBzeW50YXggbWVhbnMgdGhlIGNvbG9uIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCi0gICBvbiB0aGUgc3ltYm9sIGJlZm9yZSB3ZSBhcnJpdmUgaW4gcGFfY29tbS4gIGNvbG9uIHdpbGwgc2V0IGEgbnVtYmVyCi0gICBvZiBhdHRyaWJ1dGVzIG9mIHRoZSBzeW1ib2wgdGhhdCBuZWVkIHRvIGJlIGZpeGVkIGhlcmUuICBJbiBwYXJ0aWN1bGFyCi0gICB0aGUgdmFsdWUsIHNlY3Rpb24gcG9pbnRlciwgZnJhZ21lbnQgcG9pbnRlciwgZmxhZ3MsIGV0Yy4gIFdoYXQKLSAgIGEgcGFpbi4KLQotICAgVGhpcyBhbHNvIG1ha2VzIGVycm9yIGRldGVjdGlvbiBhbGwgYnV0IGltcG9zc2libGUuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY29tbSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgc3ltYm9sUyAqc3ltYm9sOwotICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7Ci0KLSAgaWYgKGxhYmVsX3N5bWJvbCkKLSAgICBzeW1ib2wgPSBsYWJlbF9zeW1ib2wtPmxzc19sYWJlbDsKLSAgZWxzZQotICAgIHN5bWJvbCA9IE5VTEw7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgaWYgKHN5bWJvbCkKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sLCBzaXplKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbCwgYmZkX3VuZF9zZWN0aW9uX3B0cik7Ci0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sKTsKLQotICAgICAgLyogY29sb24oKSBoYXMgYWxyZWFkeSBzZXQgdGhlIGZyYWcgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlCi0gICAgICAgICBjdXJyZW50IHN1YnNwYWNlOyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBmcmFnbWVudCB0byB0aGUgemVybyBhZGRyZXNzCi0gICAgICAgICBmcmFnbWVudC4gIFdlIGFsc28gbmVlZCB0byByZXNldCB0aGUgc2VnbWVudCBwb2ludGVyLiAgKi8KLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUHJvY2VzcyBhIC5FTkQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2VuZCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQcm9jZXNzIGEgLkVOVEVSIHBzZXVkby1vcC4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gICovCi1zdGF0aWMgdm9pZAotcGFfZW50ZXIgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgYXNfYmFkIChfKCJUaGUgLkVOVEVSIHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkIikpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQcm9jZXNzIGEgLkVOVFJZIHBzZXVkby1vcC4gIC5FTlRSWSBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgcHJvY2VzdXJlLiAgKi8KLXN0YXRpYyB2b2lkCi1wYV9lbnRyeSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBpZiAoIXdpdGhpbl9wcm9jZWR1cmUpCi0gICAgYXNfYmFkIChfKCJNaXNwbGFjZWQgLmVudHJ5LiBJZ25vcmVkLiIpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghY2FsbGluZm9fZm91bmQpCi0JYXNfYmFkIChfKCJNaXNzaW5nIC5jYWxsaW5mby4iKSk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICB3aXRoaW5fZW50cnlfZXhpdCA9IFRSVUU7Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFNPTSBkZWZlcnMgYnVpbGRpbmcgb2YgdW53aW5kIGRlc2NyaXB0b3JzIHVudGlsIHRoZSBsaW5rIHBoYXNlLgotICAgICBUaGUgYXNzZW1ibGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhbiBSX0VOVFJZIHJlbG9jYXRpb24KLSAgICAgdG8gbWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgcmVnaW9uIGFuZCBob2xkIHRoZSB1bndpbmQgYml0cywgYW5kCi0gICAgIGZvciBjcmVhdGluZyBhbiBSX0VYSVQgcmVsb2NhdGlvbiB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbi4KLQotICAgICBGSVhNRS4gIEVMRiBzaG91bGQgYmUgdXNpbmcgdGhlIHNhbWUgY29udmVudGlvbnMhICBUaGUgcHJvYmxlbQotICAgICBpcyBhbiB1bndpbmQgcmVxdWlyZXMgdG9vIG11Y2ggcmVsb2NhdGlvbiBzcGFjZS4gIEhtbW0uICBNYXliZQotICAgICBpZiB3ZSBzcGxpdCB0aGUgdW53aW5kIGJpdHMgdXAgYmV0d2VlbiB0aGUgcmVsb2NhdGlvbnMgd2hpY2gKLSAgICAgZGVub3RlIHRoZSBlbnRyeSBhbmQgZXhpdCBwb2ludHMuICAqLwotICBpZiAobGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgwKTsKLQotICAgICAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJICAgIE5VTEwsIChvZmZzZXRUKSAwLCBOVUxMLAotCQkgICAgMCwgUl9IUFBBX0VOVFJZLCBlX2ZzZWwsIDAsIDAsCi0JCSAgICAoaW50ICopICZsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IpOwotICAgIH0KLSNlbmRpZgotfQotCi0vKiBIYW5kbGUgYSAuRVFVIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9lcXUgKHJlZykKLSAgICAgaW50IHJlZzsKLXsKLSAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sID0gcGFfZ2V0X2xhYmVsICgpOwotICBzeW1ib2xTICpzeW1ib2w7Ci0KLSAgaWYgKGxhYmVsX3N5bWJvbCkKLSAgICB7Ci0gICAgICBzeW1ib2wgPSBsYWJlbF9zeW1ib2wtPmxzc19sYWJlbDsKLSAgICAgIGlmIChyZWcpCi0JU19TRVRfVkFMVUUgKHN5bWJvbCwgcGFfcGFyc2VfbnVtYmVyICgmaW5wdXRfbGluZV9wb2ludGVyLCAwKSk7Ci0gICAgICBlbHNlCi0JU19TRVRfVkFMVUUgKHN5bWJvbCwgKHVuc2lnbmVkIGludCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sLCBiZmRfYWJzX3NlY3Rpb25fcHRyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocmVnKQotCWFzX2JhZCAoXygiLlJFRyBtdXN0IHVzZSBhIGxhYmVsIikpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiLkVRVSBtdXN0IHVzZSBhIGxhYmVsIikpOwotICAgIH0KLQotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGVscGVyIGZ1bmN0aW9uLiAgRG9lcyBwcm9jZXNzaW5nIGZvciB0aGUgZW5kIG9mIGEgZnVuY3Rpb24uICBUaGlzCi0gICB1c3VhbGx5IGludm9sdmVzIGNyZWF0aW5nIHNvbWUgcmVsb2NhdGlvbnMgb3IgYnVpbGRpbmcgc3BlY2lhbAotICAgc3ltYm9scyB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZXhpdCAoKQotewotICBjaGFyICp3aGVyZTsKLQotICB3aGVyZSA9IGZyYWdfbW9yZSAoMCk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIE1hcmsgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIHN0dWZmIGF3YXkgdGhlIGxvY2F0aW9uIG9mIHRoZSBmcmFnCi0gICAgIGZvciB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiwgYW5kIGZpbmFsbHkgY2FsbCBwYV9idWlsZF91bndpbmRfc3Vic3BhY2UKLSAgICAgdG8gYWRkIGFuIGVudHJ5IGluIHRoZSB1bndpbmQgdGFibGUuICAqLwotICBocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbiAoKTsKLSAgcGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlIChsYXN0X2NhbGxfaW5mbyk7Ci0jZWxzZQotICAvKiBTT00gZGVmZXJzIGJ1aWxkaW5nIG9mIHVud2luZCBkZXNjcmlwdG9ycyB1bnRpbCB0aGUgbGluayBwaGFzZS4KLSAgICAgVGhlIGFzc2VtYmxlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYW4gUl9FTlRSWSByZWxvY2F0aW9uCi0gICAgIHRvIG1hcmsgdGhlIGJlZ2lubmluZyBvZiBhIHJlZ2lvbiBhbmQgaG9sZCB0aGUgdW53aW5kIGJpdHMsIGFuZAotICAgICBmb3IgY3JlYXRpbmcgYW4gUl9FWElUIHJlbG9jYXRpb24gdG8gbWFyayB0aGUgZW5kIG9mIHRoZSByZWdpb24uCi0KLSAgICAgRklYTUUuICBFTEYgc2hvdWxkIGJlIHVzaW5nIHRoZSBzYW1lIGNvbnZlbnRpb25zISAgVGhlIHByb2JsZW0KLSAgICAgaXMgYW4gdW53aW5kIHJlcXVpcmVzIHRvbyBtdWNoIHJlbG9jYXRpb24gc3BhY2UuICBIbW1tLiAgTWF5YmUKLSAgICAgaWYgd2Ugc3BsaXQgdGhlIHVud2luZCBiaXRzIHVwIGJldHdlZW4gdGhlIHJlbG9jYXRpb25zIHdoaWNoCi0gICAgIGRlbm90ZSB0aGUgZW50cnkgYW5kIGV4aXQgcG9pbnRzLiAgKi8KLSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJTlVMTCwgKG9mZnNldFQpIDAsCi0JCU5VTEwsIDAsIFJfSFBQQV9FWElULCBlX2ZzZWwsIDAsIDAsCi0JCShpbnQgKikgJmxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvciArIDEpOwotI2VuZGlmCi19Ci0KLS8qIFByb2Nlc3MgYSAuRVhJVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZXhpdCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBpZiAoIXdpdGhpbl9wcm9jZWR1cmUpCi0gICAgYXNfYmFkIChfKCIuRVhJVCBtdXN0IGFwcGVhciB3aXRoaW4gYSBwcm9jZWR1cmUiKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIWNhbGxpbmZvX2ZvdW5kKQotCWFzX2JhZCAoXygiTWlzc2luZyAuY2FsbGluZm8iKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCF3aXRoaW5fZW50cnlfZXhpdCkKLQkgICAgYXNfYmFkIChfKCJObyAuRU5UUlkgZm9yIHRoaXMgLkVYSVQiKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3aXRoaW5fZW50cnlfZXhpdCA9IEZBTFNFOwotCSAgICAgIHByb2Nlc3NfZXhpdCAoKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFByb2Nlc3MgYSAuRVhQT1JUIGRpcmVjdGl2ZS4gIFRoaXMgbWFrZXMgZnVuY3Rpb25zIGV4dGVybmFsCi0gICBhbmQgcHJvdmlkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyBhcmd1bWVudCByZWxvY2F0aW9uIGVudHJpZXMKLSAgIHRvIGNhbGxlcnMuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZXhwb3J0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICBzeW1ib2xTICpzeW1ib2w7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAvKiBNYWtlIHN1cmUgdGhlIGdpdmVuIHN5bWJvbCBleGlzdHMuICAqLwotICBpZiAoKHN5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IGRlZmluZSBleHBvcnQgc3ltYm9sOiAlc1xuIiksIG5hbWUpOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE9LLiAgU2V0IHRoZSBleHRlcm5hbCBiaXRzIGFuZCBwcm9jZXNzIGFyZ3VtZW50IHJlbG9jYXRpb25zLiAgKi8KLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2wpOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHBhX3R5cGVfYXJncyAoc3ltYm9sLCAxKTsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhlbHBlciBmdW5jdGlvbiB0byBwcm9jZXNzIGFyZ3VtZW50cyB0byBhIC5FWFBPUlQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3R5cGVfYXJncyAoc3ltYm9sUCwgaXNfZXhwb3J0KQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotICAgICBpbnQgaXNfZXhwb3J0OwotewotICBjaGFyICpuYW1lLCBjLCAqcDsKLSAgdW5zaWduZWQgaW50IHRlbXAsIGFyZ19yZWxvYzsKLSAgcGFfc3ltYm9sX3R5cGUgdHlwZSA9IFNZTUJPTF9UWVBFX1VOS05PV047Ci0gIG9ial9zeW1ib2xfdHlwZSAqc3ltYm9sID0gKG9ial9zeW1ib2xfdHlwZSAqKSBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCk7Ci0KLSAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJhYnNvbHV0ZSIsIDgpID09IDApCi0KLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gODsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgJj0gfkJTRl9GVU5DVElPTjsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJmZF9hYnNfc2VjdGlvbl9wdHIpOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX0FCU09MVVRFOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImNvZGUiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA0OwotICAgICAgLyogSU1QT1JUaW5nL0VYUE9SVGluZyBDT0RFIHR5cGVzIGZvciBmdW5jdGlvbnMgaXMgbWVhbmluZ2xlc3MgZm9yIFNPTSwKLSAgICAgICAgIGluc3RlYWQgb25lIHNob3VsZCBiZSBJTVBPUlRpbmcvRVhQT1JUaW5nIEVOVFJZIHR5cGVzLgotCi0gICAgICAgICBDb21wbGFpbiBpZiBvbmUgdHJpZXMgdG8gRVhQT1JUIGEgQ09ERSB0eXBlIHNpbmNlIHRoYXQncyBuZXZlcgotICAgICAgICAgZG9uZS4gIEJvdGggR0NDIGFuZCBIUCBDIHN0aWxsIHRyeSB0byBJTVBPUlQgQ09ERSB0eXBlcywgc28KLSAgICAgICAgIHNpbGVudGx5IGZpeCB0aGVtIHRvIGJlIEVOVFJZIHR5cGVzLiAgKi8KLSAgICAgIGlmIChTX0lTX0ZVTkNUSU9OIChzeW1ib2xQKSkKLQl7Ci0JICBpZiAoaXNfZXhwb3J0KQotCSAgICBhc190c2t0c2sgKF8oIlVzaW5nIEVOVFJZIHJhdGhlciB0aGFuIENPREUgaW4gZXhwb3J0IGRpcmVjdGl2ZSBmb3IgJXMiKSwKLQkJICAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQotCSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICB0eXBlID0gU1lNQk9MX1RZUEVfRU5UUlk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgJj0gfkJTRl9GVU5DVElPTjsKLQkgIHR5cGUgPSBTWU1CT0xfVFlQRV9DT0RFOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJkYXRhIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNDsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgJj0gfkJTRl9GVU5DVElPTjsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLSAgICAgIHR5cGUgPSBTWU1CT0xfVFlQRV9EQVRBOwotICAgIH0KLSAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJlbnRyeSIsIDUpID09IDApKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA1OwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfRU5UUlk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAibWlsbGljb2RlIiwgOSkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gOTsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX01JTExJQ09ERTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJwbGFiZWwiLCA2KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA2OwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyAmPSB+QlNGX0ZVTkNUSU9OOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX1BMQUJFTDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJwcmlfcHJvZyIsIDgpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDg7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLSAgICAgIHR5cGUgPSBTWU1CT0xfVFlQRV9QUklfUFJPRzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJzZWNfcHJvZyIsIDgpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDg7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLSAgICAgIHR5cGUgPSBTWU1CT0xfVFlQRV9TRUNfUFJPRzsKLSAgICB9Ci0KLSAgLyogU09NIHJlcXVpcmVzIG11Y2ggbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBzeW1ib2wgdHlwZXMKLSAgICAgdGhhbiBCRkQgdW5kZXJzdGFuZHMuICBUaGlzIGlzIGhvdyB3ZSBnZXQgdGhpcyBpbmZvcm1hdGlvbgotICAgICB0byB0aGUgU09NIEJGRCBiYWNrZW5kLiAgKi8KLSNpZmRlZiBvYmpfc2V0X3N5bWJvbF90eXBlCi0gIG9ial9zZXRfc3ltYm9sX3R5cGUgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKSwgKGludCkgdHlwZSk7Ci0jZW5kaWYKLQotICAvKiBOb3cgdGhhdCB0aGUgdHlwZSBvZiB0aGUgZXhwb3J0ZWQgc3ltYm9sIGhhcyBiZWVuIGhhbmRsZWQsCi0gICAgIGhhbmRsZSBhbnkgYXJndW1lbnQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIHdoaWxlICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgLyogQXJndW1lbnQgc291cmNlcy4gICovCi0gICAgICBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiYXJndyIsIDQpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHRlbXAgPSBhdG9pIChuYW1lICsgNCk7Ci0JICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgYXJnX3JlbG9jID0gcGFfYWxpZ25fYXJnX3JlbG9jICh0ZW1wLCBwYV9idWlsZF9hcmdfcmVsb2MgKG5hbWUpKTsKLSNpZmRlZiBPQkpfU09NCi0JICBzeW1ib2wtPnRjX2RhdGEuYXAuaHBwYV9hcmdfcmVsb2MgfD0gYXJnX3JlbG9jOwotI2VuZGlmCi0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgICAvKiBUaGUgcmV0dXJuIHZhbHVlLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInJ0bnZhbCIsIDYpKSA9PSAwKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICBhcmdfcmVsb2MgPSBwYV9idWlsZF9hcmdfcmVsb2MgKG5hbWUpOwotI2lmZGVmIE9CSl9TT00KLQkgIHN5bWJvbC0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYyB8PSBhcmdfcmVsb2M7Ci0jZW5kaWYKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICAgIC8qIFByaXZlbGVnZSBsZXZlbC4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJwcml2X2xldiIsIDgpKSA9PSAwKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHRlbXAgPSBhdG9pIChpbnB1dF9saW5lX3BvaW50ZXIpOwotI2lmZGVmIE9CSl9TT00KLQkgIHN5bWJvbC0+dGNfZGF0YS5hcC5ocHBhX3ByaXZfbGV2ZWwgPSB0ZW1wOwotI2VuZGlmCi0JICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJVbmRlZmluZWQgLkVYUE9SVC8uSU1QT1JUIGFyZ3VtZW50IChpZ25vcmVkKTogJXMiKSwgbmFtZSk7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCX0KLSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSBhbiAuSU1QT1JUIHBzZXVkby1vcC4gIEFueSBzeW1ib2wgcmVmZXJlbmNlZCBpbiBhIGdpdmVuCi0gICBhc3NlbWJseSBmaWxlIG11c3QgZWl0aGVyIGJlIGRlZmluZWQgaW4gdGhlIGFzc2VtYmx5IGZpbGUsIG9yCi0gICBleHBsaWNpdGx5IElNUE9SVEVEIGZyb20gYW5vdGhlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9pbXBvcnQgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnA7Ci0gIHN5bWJvbFMgKnN5bWJvbDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgc3ltYm9sID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICAvKiBVZ2guICBXZSBtaWdodCBiZSBpbXBvcnRpbmcgYSBzeW1ib2wgZGVmaW5lZCBlYXJsaWVyIGluIHRoZSBmaWxlLAotICAgICBpbiB3aGljaCBjYXNlIGFsbCB0aGUgY29kZSBiZWxvdyB3aWxsIHJlYWxseSBzY3JldyB0aGluZ3MgdXAKLSAgICAgKHNldCB0aGUgd3Jvbmcgc2VnbWVudCwgc3ltYm9sIGZsYWdzICYgdHlwZSwgZXRjKS4gICovCi0gIGlmIChzeW1ib2wgPT0gTlVMTCB8fCAhU19JU19ERUZJTkVEIChzeW1ib2wpKQotICAgIHsKLSAgICAgIHN5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLQotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgcGFfdHlwZV9hcmdzIChzeW1ib2wsIDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBTaWdoLiAgVG8gYmUgY29tcGF0YWJsZSB3aXRoIHRoZSBIUCBhc3NlbWJsZXIgYW5kIHRvIGhlbHAKLQkgICAgIHBvb3JseSB3cml0dGVuIGFzc2VtYmx5IGNvZGUsIHdlIGFzc2lnbiBhIHR5cGUgYmFzZWQgb24KLQkgICAgIHRoZSB0aGUgY3VycmVudCBzZWdtZW50LiAgTm90ZSBvbmx5IEJTRl9GVU5DVElPTiByZWFsbHkKLQkgICAgIG1hdHRlcnMsIHdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgZnVsbCBTWU1CT0xfVFlQRV8qIGluZm8uICAqLwotCSAgaWYgKG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uKQotCSAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCi0JICAvKiBJZiB0aGUgc2VjdGlvbiBpcyB1bmRlZmluZWQsIHRoZW4gdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQKLQkgICAgIFNpbmNlIHRoaXMgaXMgYW4gaW1wb3J0LCBsZWF2ZSB0aGUgc2VjdGlvbiB1bmRlZmluZWQuICAqLwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sLCBiZmRfdW5kX3NlY3Rpb25fcHRyKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCB3YXMgYWxyZWFkeSBkZWZpbmVkLiAgSnVzdCBlYXQgZXZlcnl0aGluZyB1cCB0bwotCSB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHN0YXRlbWVudC4gICovCi0gICAgICB3aGlsZSAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5MQUJFTCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfbGFiZWwgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmIChzdHJsZW4gKG5hbWUpID4gMCkKLSAgICB7Ci0gICAgICBjb2xvbiAobmFtZSk7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIk1pc3NpbmcgbGFiZWwgbmFtZSBvbiAuTEFCRUwiKSk7Ci0gICAgfQotCi0gIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJleHRyYSAuTEFCRUwgYXJndW1lbnRzIGlnbm9yZWQuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5MRUFWRSBwc2V1ZG8tb3AuICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2xlYXZlICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIGFzX2JhZCAoXygiVGhlIC5MRUFWRSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZCIpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLkxFVkVMIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9sZXZlbCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpsZXZlbDsKLQotICBsZXZlbCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKHN0cm5jbXAgKGxldmVsLCAiMS4wIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKLSAgICAgIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfaHBwYSwgMTApKQotCWFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobGV2ZWwsICIxLjEiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAzOwotICAgICAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCAxMSkpCi0JYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChsZXZlbCwgIjIuMHciLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA0OwotICAgICAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCAyNSkpCi0JYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChsZXZlbCwgIjIuMCIsIDMpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDM7Ci0gICAgICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIDIwKSkKLQlhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlVucmVjb2duaXplZCAuTEVWRUwgYXJndW1lbnRcbiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuT1JJR0lOIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9vcmlnaW4gKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgc19vcmcgKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogSGFuZGxlIGEgLlBBUkFNIHBzZXVkby1vcC4gIFRoaXMgaXMgbXVjaCBsaWtlIGEgLkVYUE9SVCwgZXhjZXB0IGl0Ci0gICBpcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gIEZJWE1FLiAgU2hvdWxkIHNoYXJlIG1vcmUgY29kZSB3aXRoIC5FWFBPUlQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfcGFyYW0gKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnA7Ci0gIHN5bWJvbFMgKnN5bWJvbDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgaWYgKChzeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCBkZWZpbmUgc3RhdGljIHN5bWJvbDogJXNcbiIpLCBuYW1lKTsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2wpOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHBhX3R5cGVfYXJncyAoc3ltYm9sLCAwKTsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5QUk9DIHBzZXVkby1vcC4gIEl0IGlzIHVzZWQgdG8gbWFyayB0aGUgYmVnaW5uaW5nCi0gICBvZiBhIHByb2NlZHVyZSBmcm9tIGEgc3ludGF0aWNhbCBwb2ludCBvZiB2aWV3LiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3Byb2MgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgc3RydWN0IGNhbGxfaW5mbyAqY2FsbF9pbmZvOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlKQotICAgIGFzX2ZhdGFsIChfKCJOZXN0ZWQgcHJvY2VkdXJlcyIpKTsKLQotICAvKiBSZXNldCBnbG9iYWwgdmFyaWFibGVzIGZvciBuZXcgcHJvY2VkdXJlLiAgKi8KLSAgY2FsbGluZm9fZm91bmQgPSBGQUxTRTsKLSAgd2l0aGluX3Byb2NlZHVyZSA9IFRSVUU7Ci0KLSAgLyogQ3JlYXRlIGFub3RoZXIgY2FsbF9pbmZvIHN0cnVjdHVyZS4gICovCi0gIGNhbGxfaW5mbyA9IChzdHJ1Y3QgY2FsbF9pbmZvICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNhbGxfaW5mbykpOwotCi0gIGlmICghY2FsbF9pbmZvKQotICAgIGFzX2ZhdGFsIChfKCJDYW5ub3QgYWxsb2NhdGUgdW53aW5kIGRlc2NyaXB0b3JcbiIpKTsKLQotICBtZW1zZXQgKGNhbGxfaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3QgY2FsbF9pbmZvKSk7Ci0KLSAgY2FsbF9pbmZvLT5jaV9uZXh0ID0gTlVMTDsKLQotICBpZiAoY2FsbF9pbmZvX3Jvb3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjYWxsX2luZm9fcm9vdCA9IGNhbGxfaW5mbzsKLSAgICAgIGxhc3RfY2FsbF9pbmZvID0gY2FsbF9pbmZvOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxhc3RfY2FsbF9pbmZvLT5jaV9uZXh0ID0gY2FsbF9pbmZvOwotICAgICAgbGFzdF9jYWxsX2luZm8gPSBjYWxsX2luZm87Ci0gICAgfQotCi0gIC8qIHNldCB1cCBkZWZhdWx0cyBvbiBjYWxsX2luZm8gc3RydWN0dXJlICovCi0KLSAgY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5jYW5ub3RfdW53aW5kID0gMDsKLSAgY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5yZWdpb25fZGVzYyA9IDE7Ci0gIGNhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuaHB1eF9pbnRlcnJ1cHRfbWFya2VyID0gMDsKLQotICAvKiBJZiB3ZSBnb3QgYSAuUFJPQyBwc2V1ZG8tb3AsIHdlIGtub3cgdGhhdCB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZAotICAgICBsb2NhbGx5LiAgTWFrZSBzdXJlIGl0IGdldHMgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgewotICAgIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX3N5bWJvbCA9IHBhX2dldF9sYWJlbCAoKTsKLQotICAgIGlmIChsYWJlbF9zeW1ib2wpCi0gICAgICB7Ci0JaWYgKGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsKQotCSAgewotCSAgICBsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sID0gbGFiZWxfc3ltYm9sLT5sc3NfbGFiZWw7Ci0JICAgIHN5bWJvbF9nZXRfYmZkc3ltIChsYWJlbF9zeW1ib2wtPmxzc19sYWJlbCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgIH0KLQllbHNlCi0JICBhc19iYWQgKF8oIk1pc3NpbmcgZnVuY3Rpb24gbmFtZSBmb3IgLlBST0MgKGNvcnJ1cHRlZCBsYWJlbCBjaGFpbikiKSk7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9IE5VTEw7Ci0gIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQcm9jZXNzIHRoZSBzeW50YXRpY2FsIGVuZCBvZiBhIHByb2NlZHVyZS4gIE1ha2Ugc3VyZSBhbGwgdGhlCi0gICBhcHByb3ByaWF0ZSBwc2V1ZG8tb3BzIHdlcmUgZm91bmQgd2l0aGluIHRoZSBwcm9jZWR1cmUuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfcHJvY2VuZCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIC8qIElmIHdlIGFyZSB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbiwgbWFrZSBzdXJlIHdlJ3ZlCi0gICAgIGRlZmluZWQgYSBsYWJlbCBmb3IgdGhlIHByb2NlZHVyZTsgaGFuZGxlIGNhc2Ugd2hlcmUgdGhlCi0gICAgIGxhYmVsIHdhcyBkZWZpbmVkIGFmdGVyIHRoZSAuUFJPQyBkaXJlY3RpdmUuCi0KLSAgICAgTm90ZSB0aGVyZSdzIG5vdCBuZWVkIHRvIGRpZGRsZSB3aXRoIHRoZSBzZWdtZW50IG9yIGZyYWdtZW50Ci0gICAgIGZvciB0aGUgbGFiZWwgc3ltYm9sIGluIHRoaXMgY2FzZS4gIFdlIGhhdmUgYWxyZWFkeSBzd2l0Y2hlZAotICAgICBpbnRvIHRoZSBuZXcgJENPREUkIHN1YnNwYWNlIGF0IHRoaXMgcG9pbnQuICAqLwotICBpZiAod2l0aGluX3Byb2NlZHVyZSAmJiBsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sID09IE5VTEwpCi0gICAgewotICAgICAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sID0gcGFfZ2V0X2xhYmVsICgpOwotCi0gICAgICBpZiAobGFiZWxfc3ltYm9sKQotCXsKLQkgIGlmIChsYWJlbF9zeW1ib2wtPmxzc19sYWJlbCkKLQkgICAgewotCSAgICAgIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPSBsYWJlbF9zeW1ib2wtPmxzc19sYWJlbDsKLQkgICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAobGFiZWxfc3ltYm9sLT5sc3NfbGFiZWwpLT5mbGFncwotCQl8PSBCU0ZfRlVOQ1RJT047Ci0jaWZkZWYgT0JKX1NPTQotCSAgICAgIC8qIEFsc28gaGFuZGxlIGFsbG9jYXRpb24gb2YgYSBmaXh1cCB0byBob2xkIHRoZSB1bndpbmQKLQkJIGluZm9ybWF0aW9uIHdoZW4gdGhlIGxhYmVsIGFwcGVhcnMgYWZ0ZXIgdGhlIHByb2MvcHJvY2VuZC4gICovCi0JICAgICAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQotCQl7Ci0JCSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0JCSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJCQlOVUxMLCAob2Zmc2V0VCkgMCwgTlVMTCwKLQkJCQkwLCBSX0hQUEFfRU5UUlksIGVfZnNlbCwgMCwgMCwKLQkJCQkoaW50ICopICZsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IpOwotCQl9Ci0jZW5kaWYKLQkgICAgfQotCSAgZWxzZQotCSAgICBhc19iYWQgKF8oIk1pc3NpbmcgZnVuY3Rpb24gbmFtZSBmb3IgLlBST0MgKGNvcnJ1cHRlZCBsYWJlbCBjaGFpbikiKSk7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyIpKTsKLSAgICB9Ci0KLSAgaWYgKCF3aXRoaW5fcHJvY2VkdXJlKQotICAgIGFzX2JhZCAoXygibWlzcGxhY2VkIC5wcm9jZW5kIikpOwotCi0gIGlmICghY2FsbGluZm9fZm91bmQpCi0gICAgYXNfYmFkIChfKCJNaXNzaW5nIC5jYWxsaW5mbyBmb3IgdGhpcyBwcm9jZWR1cmUiKSk7Ci0KLSAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQotICAgIGFzX2JhZCAoXygiTWlzc2luZyAuRVhJVCBmb3IgYSAuRU5UUlkiKSk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIEVMRiBuZWVkcyB0byBtYXJrIHRoZSBlbmQgb2YgZWFjaCBmdW5jdGlvbiBzbyB0aGF0IGl0IGNhbiBjb21wdXRlCi0gICAgIHRoZSBzaXplIG9mIHRoZSBmdW5jdGlvbiAoYXBwYXJlbnRseSBpdHMgbmVlZGVkIGluIHRoZSBzeW1ib2wgdGFibGUpLiAgKi8KLSAgaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24gKCk7Ci0jZW5kaWYKLQotICB3aXRoaW5fcHJvY2VkdXJlID0gRkFMU0U7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBJZiBWQUxVRSBpcyBhbiBleGFjdCBwb3dlciBvZiB0d28gYmV0d2VlbiB6ZXJvIGFuZCAyXjMxLCB0aGVuCi0gICByZXR1cm4gbG9nMiAoVkFMVUUpLiAgRWxzZSByZXR1cm4gLTEuICAqLwotCi1zdGF0aWMgaW50Ci1sb2cyICh2YWx1ZSkKLSAgICAgaW50IHZhbHVlOwotewotICBpbnQgc2hpZnQgPSAwOwotCi0gIHdoaWxlICgoMSA8PCBzaGlmdCkgIT0gdmFsdWUgJiYgc2hpZnQgPCAzMikKLSAgICBzaGlmdCsrOwotCi0gIGlmIChzaGlmdCA+PSAzMikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UKLSAgICByZXR1cm4gc2hpZnQ7Ci19Ci0KLQotI2lmZGVmIE9CSl9TT00KLS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpCi17Ci0gIGlmIChjdXJyZW50X3NwYWNlID09IE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIk5vdCBpbiBhIHNwYWNlLlxuIikpOwotCi0gIGlmIChjdXJyZW50X3N1YnNwYWNlID09IE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIk5vdCBpbiBhIHN1YnNwYWNlLlxuIikpOwotfQotCi0vKiBQYXJzZSB0aGUgcGFyYW1ldGVycyB0byBhIC5TUEFDRSBkaXJlY3RpdmU7IGlmIENSRUFURV9GTEFHIGlzIG5vbnplcm8sCi0gICB0aGVuIGNyZWF0ZSBhIG5ldyBzcGFjZSBlbnRyeSB0byBob2xkIHRoZSBpbmZvcm1hdGlvbiBzcGVjaWZpZWQKLSAgIGJ5IHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSAuU1BBQ0UgZGlyZWN0aXZlLiAgKi8KLQotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqCi1wYV9wYXJzZV9zcGFjZV9zdG10IChzcGFjZV9uYW1lLCBjcmVhdGVfZmxhZykKLSAgICAgY2hhciAqc3BhY2VfbmFtZTsKLSAgICAgaW50IGNyZWF0ZV9mbGFnOwotewotICBjaGFyICpuYW1lLCAqcHRlbXAsIGM7Ci0gIGNoYXIgbG9hZGFibGUsIGRlZmluZWQsIHByaXZhdGUsIHNvcnQ7Ci0gIGludCBzcG51bSwgdGVtcDsKLSAgYXNlY3Rpb24gKnNlZyA9IE5VTEw7Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0KLSAgLyogbG9hZCBkZWZhdWx0IHZhbHVlcyAqLwotICBzcG51bSA9IDA7Ci0gIHNvcnQgPSAwOwotICBsb2FkYWJsZSA9IFRSVUU7Ci0gIGRlZmluZWQgPSBUUlVFOwotICBwcml2YXRlID0gRkFMU0U7Ci0gIGlmIChzdHJjbXAgKHNwYWNlX25hbWUsICIkVEVYVCQiKSA9PSAwKQotICAgIHsKLSAgICAgIHNlZyA9IHBhX2RlZl9zcGFjZXNbMF0uc2VnbWVudDsKLSAgICAgIGRlZmluZWQgPSBwYV9kZWZfc3BhY2VzWzBdLmRlZmluZWQ7Ci0gICAgICBwcml2YXRlID0gcGFfZGVmX3NwYWNlc1swXS5wcml2YXRlOwotICAgICAgc29ydCA9IHBhX2RlZl9zcGFjZXNbMF0uc29ydDsKLSAgICAgIHNwbnVtID0gcGFfZGVmX3NwYWNlc1swXS5zcG51bTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc3BhY2VfbmFtZSwgIiRQUklWQVRFJCIpID09IDApCi0gICAgewotICAgICAgc2VnID0gcGFfZGVmX3NwYWNlc1sxXS5zZWdtZW50OwotICAgICAgZGVmaW5lZCA9IHBhX2RlZl9zcGFjZXNbMV0uZGVmaW5lZDsKLSAgICAgIHByaXZhdGUgPSBwYV9kZWZfc3BhY2VzWzFdLnByaXZhdGU7Ci0gICAgICBzb3J0ID0gcGFfZGVmX3NwYWNlc1sxXS5zb3J0OwotICAgICAgc3BudW0gPSBwYV9kZWZfc3BhY2VzWzFdLnNwbnVtOwotICAgIH0KLQotICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgcHJpbnRfZXJyb3JzID0gRkFMU0U7Ci0gICAgICBwdGVtcCA9IGlucHV0X2xpbmVfcG9pbnRlciArIDE7Ci0gICAgICAvKiBGaXJzdCBzZWUgaWYgdGhlIHNwYWNlIHdhcyBzcGVjaWZpZWQgYXMgYSBudW1iZXIgcmF0aGVyIHRoYW4KLSAgICAgICAgIGFzIGEgbmFtZS4gIEFjY29yZGluZyB0byB0aGUgUEEgYXNzZW1ibHkgbWFudWFsIHRoZSByZXN0IG9mCi0gICAgICAgICB0aGUgbGluZSBzaG91bGQgYmUgaWdub3JlZC4gICovCi0gICAgICB0ZW1wID0gcGFfcGFyc2VfbnVtYmVyICgmcHRlbXAsIDApOwotICAgICAgaWYgKHRlbXAgPj0gMCkKLQl7Ci0JICBzcG51bSA9IHRlbXA7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwdGVtcDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNwbnVtIiwgNSkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICBzcG51bSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAic29ydCIsIDQpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgc29ydCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAidW5sb2FkYWJsZSIsIDEwKSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGxvYWRhYmxlID0gRkFMU0U7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJub3RkZWZpbmVkIiwgMTApID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgZGVmaW5lZCA9IEZBTFNFOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAicHJpdmF0ZSIsIDcpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgcHJpdmF0ZSA9IFRSVUU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc19iYWQgKF8oIkludmFsaWQgLlNQQUNFIGFyZ3VtZW50IikpOwotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQkJICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBwcmludF9lcnJvcnMgPSBUUlVFOwotICAgIH0KLQotICBpZiAoY3JlYXRlX2ZsYWcgJiYgc2VnID09IE5VTEwpCi0gICAgc2VnID0gc3Vic2VnX25ldyAoc3BhY2VfbmFtZSwgMCk7Ci0KLSAgLyogSWYgY3JlYXRlX2ZsYWcgaXMgbm9uemVybywgdGhlbiBjcmVhdGUgdGhlIG5ldyBzcGFjZSB3aXRoCi0gICAgIHRoZSBhdHRyaWJ1dGVzIGNvbXB1dGVkIGFib3ZlLiAgRWxzZSBzZXQgdGhlIHZhbHVlcyBpbgotICAgICBhbiBhbHJlYWR5IGV4aXN0aW5nIHNwYWNlIC0tIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGZvcgotICAgICB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIGEgYnVpbHQtaW4gc3BhY2UuICAqLwotICBpZiAoY3JlYXRlX2ZsYWcpCi0gICAgc3BhY2UgPSBjcmVhdGVfbmV3X3NwYWNlIChzcGFjZV9uYW1lLCBzcG51bSwgbG9hZGFibGUsIGRlZmluZWQsCi0JCQkgICAgICBwcml2YXRlLCBzb3J0LCBzZWcsIDEpOwotICBlbHNlCi0gICAgewotICAgICAgc3BhY2UgPSBpc19kZWZpbmVkX3NwYWNlIChzcGFjZV9uYW1lKTsKLSAgICAgIFNQQUNFX1NQTlVNIChzcGFjZSkgPSBzcG51bTsKLSAgICAgIFNQQUNFX0RFRklORUQgKHNwYWNlKSA9IGRlZmluZWQgJiAxOwotICAgICAgU1BBQ0VfVVNFUl9ERUZJTkVEIChzcGFjZSkgPSAxOwotICAgIH0KLQotI2lmZGVmIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzCi0gIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIChzZWcsIGRlZmluZWQsIHByaXZhdGUsIHNvcnQsIHNwbnVtKTsKLSNlbmRpZgotCi0gIHJldHVybiBzcGFjZTsKLX0KLQotLyogSGFuZGxlIGEgLlNQQUNFIHBzZXVkby1vcDsgdGhpcyBzd2l0Y2hlcyB0aGUgY3VycmVudCBzcGFjZSB0byB0aGUKLSAgIGdpdmVuIHNwYWNlLCBjcmVhdGluZyB0aGUgbmV3IHNwYWNlIGlmIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9zcGFjZSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpuYW1lLCBjLCAqc3BhY2VfbmFtZSwgKnNhdmVfczsKLSAgaW50IHRlbXA7Ci0gIHNkX2NoYWluX3N0cnVjdCAqc2RfY2hhaW47Ci0KLSAgaWYgKHdpdGhpbl9wcm9jZWR1cmUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDYW5cJ3QgY2hhbmdlIHNwYWNlcyB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gSWdub3JlZCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQ2hlY2sgZm9yIHNvbWUgb2YgdGhlIHByZWRlZmluZWQgc3BhY2VzLiAgIEZJWE1FOiBtb3N0IG9mIHRoZSBjb2RlCi0gICAgICAgICBiZWxvdyBpcyByZXBlYXRlZCBzZXZlcmFsIHRpbWVzLCBjYW4gd2UgZXh0cmFjdCB0aGUgY29tbW9uIHBhcnRzCi0gICAgICAgICBhbmQgcGxhY2UgdGhlbSBpbnRvIGEgc3Vicm91dGluZSBvciBzb21ldGhpbmcgc2ltaWxhcj8gICovCi0gICAgICAvKiBGSVhNRSBJcyB0aGlzIChhbmQgdGhlIG5leHQgSUYgc3RtdCkgcmVhbGx5IHJpZ2h0PwotCSBXaGF0IGlmIElOUFVUX0xJTkVfUE9JTlRFUiBwb2ludHMgdG8gIiRURVhUJEZPTyI/ICAqLwotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIiRURVhUJCIsIDYpID09IDApCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0JICBzZF9jaGFpbiA9IGlzX2RlZmluZWRfc3BhY2UgKCIkVEVYVCQiKTsKLQkgIGlmIChzZF9jaGFpbiA9PSBOVUxMKQotCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKCIkVEVYVCQiLCAxKTsKLQkgIGVsc2UgaWYgKFNQQUNFX1VTRVJfREVGSU5FRCAoc2RfY2hhaW4pID09IDApCi0JICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoIiRURVhUJCIsIDApOwotCi0JICBjdXJyZW50X3NwYWNlID0gc2RfY2hhaW47Ci0JICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICBjdXJyZW50X3N1YnNwYWNlCi0JICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAodGV4dF9zZWN0aW9uLAotCQkJCQkgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIiRQUklWQVRFJCIsIDkpID09IDApCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDk7Ci0JICBzZF9jaGFpbiA9IGlzX2RlZmluZWRfc3BhY2UgKCIkUFJJVkFURSQiKTsKLQkgIGlmIChzZF9jaGFpbiA9PSBOVUxMKQotCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKCIkUFJJVkFURSQiLCAxKTsKLQkgIGVsc2UgaWYgKFNQQUNFX1VTRVJfREVGSU5FRCAoc2RfY2hhaW4pID09IDApCi0JICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoIiRQUklWQVRFJCIsIDApOwotCi0JICBjdXJyZW50X3NwYWNlID0gc2RfY2hhaW47Ci0JICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICBjdXJyZW50X3N1YnNwYWNlCi0JICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoZGF0YV9zZWN0aW9uLAotCQkJCQkgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKCFzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLAotCQkJR0RCX0RFQlVHX1NQQUNFX05BTUUsCi0JCQlzdHJsZW4gKEdEQl9ERUJVR19TUEFDRV9OQU1FKSkpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IHN0cmxlbiAoR0RCX0RFQlVHX1NQQUNFX05BTUUpOwotCSAgc2RfY2hhaW4gPSBpc19kZWZpbmVkX3NwYWNlIChHREJfREVCVUdfU1BBQ0VfTkFNRSk7Ci0JICBpZiAoc2RfY2hhaW4gPT0gTlVMTCkKLQkgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10IChHREJfREVCVUdfU1BBQ0VfTkFNRSwgMSk7Ci0JICBlbHNlIGlmIChTUEFDRV9VU0VSX0RFRklORUQgKHNkX2NoYWluKSA9PSAwKQotCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKEdEQl9ERUJVR19TUEFDRV9OQU1FLCAwKTsKLQotCSAgY3VycmVudF9zcGFjZSA9IHNkX2NoYWluOwotCi0JICB7Ci0JICAgIGFzZWN0aW9uICpnZGJfc2VjdGlvbgotCSAgICA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3Rkb3V0cHV0LCBHREJfREVCVUdfU1BBQ0VfTkFNRSk7Ci0KLQkgICAgc3Vic2VnX3NldCAoZ2RiX3NlY3Rpb24sIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICAgIGN1cnJlbnRfc3Vic3BhY2UKLQkgICAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKGdkYl9zZWN0aW9uLAotCQkJCQkgICBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgfQotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIEl0IGNvdWxkIGJlIGEgc3BhY2Ugc3BlY2lmaWVkIGJ5IG51bWJlci4gICovCi0gICAgICBwcmludF9lcnJvcnMgPSAwOwotICAgICAgc2F2ZV9zID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaWYgKCh0ZW1wID0gcGFfcGFyc2VfbnVtYmVyICgmaW5wdXRfbGluZV9wb2ludGVyLCAwKSkgPj0gMCkKLQl7Ci0JICBpZiAoKHNkX2NoYWluID0gcGFfZmluZF9zcGFjZV9ieV9udW1iZXIgKHRlbXApKSkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfc3BhY2UgPSBzZF9jaGFpbjsKLQotCSAgICAgIHN1YnNlZ19zZXQgKHNkX2NoYWluLT5zZF9zZWcsIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICAgICAgY3VycmVudF9zdWJzcGFjZQotCQk9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKHNkX2NoYWluLT5zZF9zZWcsCi0JCQkJCSAgICAgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogTm90IGEgbnVtYmVyLCBhdHRlbXB0IHRvIGNyZWF0ZSBhIG5ldyBzcGFjZS4gICovCi0gICAgICBwcmludF9lcnJvcnMgPSAxOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9zOwotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHNwYWNlX25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0gICAgICBzdHJjcHkgKHNwYWNlX25hbWUsIG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoc3BhY2VfbmFtZSwgMSk7Ci0gICAgICBjdXJyZW50X3NwYWNlID0gc2RfY2hhaW47Ci0KLSAgICAgIHN1YnNlZ19zZXQgKHNkX2NoYWluLT5zZF9zZWcsIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0gICAgICBjdXJyZW50X3N1YnNwYWNlID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoc2RfY2hhaW4tPnNkX3NlZywKLQkJCQkJCSAgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotfQotCi0vKiBTd2l0Y2ggdG8gYSBuZXcgc3BhY2UuICAoSSB0aGluaykuICBGSVhNRS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9zcG51bSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzcGFjZSA9IGlzX2RlZmluZWRfc3BhY2UgKG5hbWUpOwotICBpZiAoc3BhY2UpCi0gICAgewotICAgICAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIFNQQUNFX1NQTlVNIChzcGFjZSksIDQpOwotICAgIH0KLSAgZWxzZQotICAgIGFzX3dhcm4gKF8oIlVuZGVmaW5lZCBzcGFjZTogJyVzJyBBc3N1bWluZyBzcGFjZSBudW1iZXIgPSAwLiIpLCBuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLlNVQlNQQUNFIHBzZXVkby1vcDsgdGhpcyBzd2l0Y2hlcyB0aGUgY3VycmVudCBzdWJzcGFjZSB0byB0aGUKLSAgIGdpdmVuIHN1YnNwYWNlLCBjcmVhdGluZyB0aGUgbmV3IHN1YnNwYWNlIGlmIG5lY2Vzc2FyeS4KLQotICAgRklYTUUuICBTaG91bGQgbWlycm9yIHBhX3NwYWNlIG1vcmUgY2xvc2VseSwgaW4gcGFydGljdWxhciBob3cKLSAgIHRoZXkncmUgYnJva2VuIHVwIGludG8gc3Vicm91dGluZXMuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfc3Vic3BhY2UgKGNyZWF0ZV9uZXcpCi0gICAgIGludCBjcmVhdGVfbmV3OwotewotICBjaGFyICpuYW1lLCAqc3NfbmFtZSwgYzsKLSAgY2hhciBsb2FkYWJsZSwgY29kZV9vbmx5LCBjb21tb24sIGR1cF9jb21tb24sIHplcm8sIHNvcnQ7Ci0gIGludCBpLCBhY2Nlc3MsIHNwYWNlX2luZGV4LCBhbGlnbm1lbnQsIHF1YWRyYW50LCBhcHBsaWNhYmxlLCBmbGFnczsKLSAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLSAgc3NkX2NoYWluX3N0cnVjdCAqc3NkOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICBpZiAoY3VycmVudF9zcGFjZSA9PSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJNdXN0IGJlIGluIGEgc3BhY2UgYmVmb3JlIGNoYW5naW5nIG9yIGRlY2xhcmluZyBzdWJzcGFjZXMuXG4iKSk7Ci0KLSAgaWYgKHdpdGhpbl9wcm9jZWR1cmUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDYW5cJ3QgY2hhbmdlIHN1YnNwYWNlcyB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gSWdub3JlZCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHNzX25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0gICAgICBzdHJjcHkgKHNzX25hbWUsIG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgICAgIC8qIExvYWQgZGVmYXVsdCB2YWx1ZXMuICAqLwotICAgICAgc29ydCA9IDA7Ci0gICAgICBhY2Nlc3MgPSAweDdmOwotICAgICAgbG9hZGFibGUgPSAxOwotICAgICAgY29tbW9uID0gMDsKLSAgICAgIGR1cF9jb21tb24gPSAwOwotICAgICAgY29kZV9vbmx5ID0gMDsKLSAgICAgIHplcm8gPSAwOwotICAgICAgc3BhY2VfaW5kZXggPSB+MDsKLSAgICAgIGFsaWdubWVudCA9IDE7Ci0gICAgICBxdWFkcmFudCA9IDA7Ci0KLSAgICAgIHNwYWNlID0gY3VycmVudF9zcGFjZTsKLSAgICAgIGlmIChjcmVhdGVfbmV3KQotCXNzZCA9IE5VTEw7Ci0gICAgICBlbHNlCi0Jc3NkID0gaXNfZGVmaW5lZF9zdWJzcGFjZSAoc3NfbmFtZSk7Ci0gICAgICAvKiBBbGxvdyB1c2VyIHRvIG92ZXJyaWRlIHRoZSBidWlsdGluIGF0dHJpYnV0ZXMgb2Ygc3Vic3BhY2VzLiAgQnV0Ci0gICAgICAgICBvbmx5IGFsbG93IHRoZSBhdHRyaWJ1dGVzIHRvIGJlIGNoYW5nZWQgb25jZSEgICovCi0gICAgICBpZiAoc3NkICYmIFNVQlNQQUNFX0RFRklORUQgKHNzZCkpCi0JewotCSAgc3Vic2VnX3NldCAoc3NkLT5zc2Rfc2VnLCBzc2QtPnNzZF9zdWJzZWcpOwotCSAgY3VycmVudF9zdWJzcGFjZSA9IHNzZDsKLQkgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQkgICAgYXNfd2FybiAoXygiUGFyYW1ldGVycyBvZiBhbiBleGlzdGluZyBzdWJzcGFjZSBjYW5cJ3QgYmUgbW9kaWZpZWQiKSk7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBIG5ldyBzdWJzcGFjZS4gIExvYWQgZGVmYXVsdCB2YWx1ZXMgaWYgaXQgbWF0Y2hlcyBvbmUgb2YKLQkgICAgIHRoZSBidWlsdGluIHN1YnNwYWNlcy4gICovCi0JICBpID0gMDsKLQkgIHdoaWxlIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY2FzZWNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCBzc19uYW1lKSA9PSAwKQotCQl7Ci0JCSAgbG9hZGFibGUgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmxvYWRhYmxlOwotCQkgIGNvbW1vbiA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uY29tbW9uOwotCQkgIGR1cF9jb21tb24gPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmR1cF9jb21tb247Ci0JCSAgY29kZV9vbmx5ID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5jb2RlX29ubHk7Ci0JCSAgemVybyA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uemVybzsKLQkJICBzcGFjZV9pbmRleCA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uc3BhY2VfaW5kZXg7Ci0JCSAgYWxpZ25tZW50ID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5hbGlnbm1lbnQ7Ci0JCSAgcXVhZHJhbnQgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLnF1YWRyYW50OwotCQkgIGFjY2VzcyA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uYWNjZXNzOwotCQkgIHNvcnQgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLnNvcnQ7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBpKys7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdlIHNob3VsZCBiZSB3b3JraW5nIHdpdGggYSBuZXcgc3Vic3BhY2Ugbm93LiAgRmlsbCBpbgotICAgICAgICAgYW55IGluZm9ybWF0aW9uIGFzIHNwZWNpZmllZCBieSB0aGUgdXNlci4gICovCi0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB3aGlsZSAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JICAgIHsKLQkgICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgICAgICBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAicXVhZCIsIDQpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgcXVhZHJhbnQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImFsaWduIiwgNSkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICBhbGlnbm1lbnQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkJICBpZiAobG9nMiAoYWxpZ25tZW50KSA9PSAtMSkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgbXVzdCBiZSBhIHBvd2VyIG9mIDIiKSk7Ci0JCSAgICAgIGFsaWdubWVudCA9IDE7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJhY2Nlc3MiLCA2KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgIGFjY2VzcyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAic29ydCIsIDQpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgc29ydCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiY29kZV9vbmx5IiwgOSkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBjb2RlX29ubHkgPSAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAidW5sb2FkYWJsZSIsIDEwKSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGxvYWRhYmxlID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImNvbW1vbiIsIDYpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgY29tbW9uID0gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImR1cF9jb21tIiwgOCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBkdXBfY29tbW9uID0gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInplcm8iLCA0KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIHplcm8gPSAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiZmlyc3QiLCA1KSA9PSAwKSkKLQkJYXNfYmFkIChfKCJGSVJTVCBub3Qgc3VwcG9ydGVkIGFzIGEgLlNVQlNQQUNFIGFyZ3VtZW50IikpOwotCSAgICAgIGVsc2UKLQkJYXNfYmFkIChfKCJJbnZhbGlkIC5TVUJTUEFDRSBhcmd1bWVudCIpKTsKLQkgICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JCWlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBDb21wdXRlIGEgcmVhc29uYWJsZSBzZXQgb2YgQkZEIGZsYWdzIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbgotICAgICAgICAgaW4gdGhlIC5zdWJzcGFjZSBkaXJlY3RpdmUuICAqLwotICAgICAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0gICAgICBmbGFncyA9IDA7Ci0gICAgICBpZiAobG9hZGFibGUpCi0JZmxhZ3MgfD0gKFNFQ19BTExPQyB8IFNFQ19MT0FEKTsKLSAgICAgIGlmIChjb2RlX29ubHkpCi0JZmxhZ3MgfD0gU0VDX0NPREU7Ci0gICAgICBpZiAoY29tbW9uIHx8IGR1cF9jb21tb24pCi0JZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLQotICAgICAgZmxhZ3MgfD0gU0VDX1JFTE9DIHwgU0VDX0hBU19DT05URU5UUzsKLQotICAgICAgLyogVGhpcyBpcyBhIHplcm8tZmlsbGVkIHN1YnNwYWNlIChlZyBCU1MpLiAgKi8KLSAgICAgIGlmICh6ZXJvKQotCWZsYWdzICY9IH4oU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTKTsKLQotICAgICAgYXBwbGljYWJsZSAmPSBmbGFnczsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiBleGlzdGluZyBzdWJzcGFjZSwgdGhlbiB3ZSB3YW50IHRvIHVzZSB0aGUKLSAgICAgICAgIHNlZ21lbnQgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggdGhlIHN1YnNwYWNlLgotCi0gICAgICAgICBGSVhNRSBOT1chICBFTEYgQkZEIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIHJlYWR5IHRvIGRlYWwgd2l0aAotICAgICAgICAgbG90cyBvZiBzZWN0aW9ucy4gIEl0IG1pZ2h0IGJlIGEgcHJvYmxlbSBpbiB0aGUgUEEgRUxGCi0gICAgICAgICBjb2RlLCBJIGRvIG5vdCBrbm93IHlldC4gIEZvciBub3cgYXZvaWQgY3JlYXRpbmcgYW55dGhpbmcKLSAgICAgICAgIGJ1dCB0aGUgInN0YW5kYXJkIiBzZWN0aW9ucyBmb3IgRUxGLiAgKi8KLSAgICAgIGlmIChjcmVhdGVfbmV3KQotCXNlY3Rpb24gPSBzdWJzZWdfZm9yY2VfbmV3IChzc19uYW1lLCAwKTsKLSAgICAgIGVsc2UgaWYgKHNzZCkKLQlzZWN0aW9uID0gc3NkLT5zc2Rfc2VnOwotICAgICAgZWxzZQotCXNlY3Rpb24gPSBzdWJzZWdfbmV3IChzc19uYW1lLCAwKTsKLQotICAgICAgaWYgKHplcm8pCi0Jc2VnX2luZm8gKHNlY3Rpb24pLT5ic3MgPSAxOwotCi0gICAgICAvKiBOb3cgc2V0IHRoZSBmbGFncy4gICovCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjdGlvbiwgYXBwbGljYWJsZSk7Ci0KLSAgICAgIC8qIFJlY29yZCBhbnkgYWxpZ25tZW50IHJlcXVlc3QgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICByZWNvcmRfYWxpZ25tZW50IChzZWN0aW9uLCBsb2cyIChhbGlnbm1lbnQpKTsKLQotICAgICAgLyogU2V0IHRoZSBzdGFydGluZyBvZmZzZXQgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsIHNlY3Rpb24sCi0JCQkgICBwYV9zdWJzcGFjZV9zdGFydCAoc3BhY2UsIHF1YWRyYW50KSk7Ci0KLSAgICAgIC8qIE5vdyB0aGF0IGFsbCB0aGUgZmxhZ3MgYXJlIHNldCwgdXBkYXRlIGFuIGV4aXN0aW5nIHN1YnNwYWNlLAotICAgICAgICAgb3IgY3JlYXRlIGEgbmV3IG9uZS4gICovCi0gICAgICBpZiAoc3NkKQotCi0JY3VycmVudF9zdWJzcGFjZSA9IHVwZGF0ZV9zdWJzcGFjZSAoc3BhY2UsIHNzX25hbWUsIGxvYWRhYmxlLAotCQkJCQkgICAgY29kZV9vbmx5LCBjb21tb24sIGR1cF9jb21tb24sCi0JCQkJCSAgICBzb3J0LCB6ZXJvLCBhY2Nlc3MsIHNwYWNlX2luZGV4LAotCQkJCQkgICAgYWxpZ25tZW50LCBxdWFkcmFudCwKLQkJCQkJICAgIHNlY3Rpb24pOwotICAgICAgZWxzZQotCWN1cnJlbnRfc3Vic3BhY2UgPSBjcmVhdGVfbmV3X3N1YnNwYWNlIChzcGFjZSwgc3NfbmFtZSwgbG9hZGFibGUsCi0JCQkJCQljb2RlX29ubHksIGNvbW1vbiwKLQkJCQkJCWR1cF9jb21tb24sIHplcm8sIHNvcnQsCi0JCQkJCQlhY2Nlc3MsIHNwYWNlX2luZGV4LAotCQkJCQkgICAgICBhbGlnbm1lbnQsIHF1YWRyYW50LCBzZWN0aW9uKTsKLQotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGN1cnJlbnRfc3Vic3BhY2UtPnNzZF9zZWcgPSBzZWN0aW9uOwotICAgICAgc3Vic2VnX3NldCAoY3VycmVudF9zdWJzcGFjZS0+c3NkX3NlZywgY3VycmVudF9zdWJzcGFjZS0+c3NkX3N1YnNlZyk7Ci0gICAgfQotICBTVUJTUEFDRV9ERUZJTkVEIChjdXJyZW50X3N1YnNwYWNlKSA9IDE7Ci19Ci0KLQotLyogQ3JlYXRlIGRlZmF1bHQgc3BhY2UgYW5kIHN1YnNwYWNlIGRpY3Rpb25hcmllcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9zcGFjZXNfYmVnaW4gKCkKLXsKLSAgaW50IGk7Ci0KLSAgc3BhY2VfZGljdF9yb290ID0gTlVMTDsKLSAgc3BhY2VfZGljdF9sYXN0ID0gTlVMTDsKLQotICBpID0gMDsKLSAgd2hpbGUgKHBhX2RlZl9zcGFjZXNbaV0ubmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lOwotCi0gICAgICAvKiBQaWNrIHRoZSByaWdodCBuYW1lIHRvIHVzZSBmb3IgdGhlIG5ldyBzZWN0aW9uLiAgKi8KLSAgICAgIG5hbWUgPSBwYV9kZWZfc3BhY2VzW2ldLm5hbWU7Ci0KLSAgICAgIHBhX2RlZl9zcGFjZXNbaV0uc2VnbWVudCA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOwotICAgICAgY3JlYXRlX25ld19zcGFjZSAocGFfZGVmX3NwYWNlc1tpXS5uYW1lLCBwYV9kZWZfc3BhY2VzW2ldLnNwbnVtLAotCQkJcGFfZGVmX3NwYWNlc1tpXS5sb2FkYWJsZSwgcGFfZGVmX3NwYWNlc1tpXS5kZWZpbmVkLAotCQkJcGFfZGVmX3NwYWNlc1tpXS5wcml2YXRlLCBwYV9kZWZfc3BhY2VzW2ldLnNvcnQsCi0JCQlwYV9kZWZfc3BhY2VzW2ldLnNlZ21lbnQsIDApOwotICAgICAgaSsrOwotICAgIH0KLQotICBpID0gMDsKLSAgd2hpbGUgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgaW50IGFwcGxpY2FibGUsIHN1YnNlZ21lbnQ7Ci0gICAgICBhc2VjdGlvbiAqc2VnbWVudCA9IE5VTEw7Ci0gICAgICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotCi0gICAgICAvKiBQaWNrIHRoZSByaWdodCBuYW1lIGZvciB0aGUgbmV3IHNlY3Rpb24gYW5kIHBpY2sgdGhlIHJpZ2h0Ci0gICAgICAgICBzdWJzZWdtZW50IG51bWJlci4gICovCi0gICAgICBuYW1lID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lOwotICAgICAgc3Vic2VnbWVudCA9IDA7Ci0KLSAgICAgIC8qIENyZWF0ZSB0aGUgbmV3IHNlY3Rpb24uICAqLwotICAgICAgc2VnbWVudCA9IHN1YnNlZ19uZXcgKG5hbWUsIHN1YnNlZ21lbnQpOwotCi0KLSAgICAgIC8qIEZvciBTT00gd2Ugd2FudCB0byByZXBsYWNlIHRoZSBzdGFuZGFyZCAudGV4dCwgLmRhdGEsIGFuZCAuYnNzCi0gICAgICAgICBzZWN0aW9ucyB3aXRoIG91ciBvd24uICAgV2UgYWxzbyB3YW50IHRvIHNldCBCRkQgZmxhZ3MgZm9yCi0JIGFsbCB0aGUgYnVpbHQtaW4gc3Vic3BhY2VzLiAgKi8KLSAgICAgIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkQ09ERSQiKSkKLQl7Ci0JICB0ZXh0X3NlY3Rpb24gPSBzZWdtZW50OwotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnbWVudCwKLQkJCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICAgICAgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERQotCQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUykpOwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgIiREQVRBJCIpKQotCXsKLQkgIGRhdGFfc2VjdGlvbiA9IHNlZ21lbnQ7Ci0JICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWdtZW50LAotCQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgICAgICB8IFNFQ19SRUxPQwotCQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0KLQotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgIiRCU1MkIikpCi0JewotCSAgYnNzX3NlY3Rpb24gPSBzZWdtZW50OwotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnbWVudCwKLQkJCQkgYXBwbGljYWJsZSAmIFNFQ19BTExPQyk7Ci0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJExJVCQiKSkKLQl7Ci0JICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWdtZW50LAotCQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgICAgICB8IFNFQ19SRUxPQwotCQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUykpOwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgIiRNSUxMSUNPREUkIikpCi0JewotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnbWVudCwKLQkJCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICAgICAgfCBTRUNfUkVMT0MKLQkJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkVU5XSU5EJCIpKQotCXsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgIHwgU0VDX1JFTE9DCi0JCQkJCSAgICAgICB8IFNFQ19SRUFET05MWQotCQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0JfQotCi0gICAgICAvKiBGaW5kIHRoZSBzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJzcGFjZS4gICovCi0gICAgICBzcGFjZSA9IHBhX3NlZ21lbnRfdG9fc3BhY2UgKHBhX2RlZl9zcGFjZXNbcGFfZGVmX3N1YnNwYWNlc1tpXS4KLQkJCQkJCSBkZWZfc3BhY2VfaW5kZXhdLnNlZ21lbnQpOwotICAgICAgaWYgKHNwYWNlID09IE5VTEwpCi0JewotCSAgYXNfZmF0YWwgKF8oIkludGVybmFsIGVycm9yOiBVbmFibGUgdG8gZmluZCBjb250YWluaW5nIHNwYWNlIGZvciAlcy4iKSwKLQkJICAgIHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSk7Ci0JfQotCi0gICAgICBjcmVhdGVfbmV3X3N1YnNwYWNlIChzcGFjZSwgbmFtZSwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0ubG9hZGFibGUsCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLmNvZGVfb25seSwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uY29tbW9uLAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5kdXBfY29tbW9uLAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS56ZXJvLAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5zb3J0LAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5hY2Nlc3MsCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLnNwYWNlX2luZGV4LAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5hbGlnbm1lbnQsCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLnF1YWRyYW50LAotCQkJICAgc2VnbWVudCk7Ci0gICAgICBpKys7Ci0gICAgfQotfQotCi0KLQotLyogQ3JlYXRlIGEgbmV3IHNwYWNlIE5BTUUsIHdpdGggdGhlIGFwcHJvcHJpYXRlIGZsYWdzIGFzIGRlZmluZWQKLSAgIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiAgKi8KLQotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqCi1jcmVhdGVfbmV3X3NwYWNlIChuYW1lLCBzcG51bSwgbG9hZGFibGUsIGRlZmluZWQsIHByaXZhdGUsCi0JCSAgc29ydCwgc2VnLCB1c2VyX2RlZmluZWQpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBzcG51bTsKLSAgICAgaW50IGxvYWRhYmxlOwotICAgICBpbnQgZGVmaW5lZDsKLSAgICAgaW50IHByaXZhdGU7Ci0gICAgIGludCBzb3J0OwotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBpbnQgdXNlcl9kZWZpbmVkOwotewotICBzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX2VudHJ5OwotCi0gIGNoYWluX2VudHJ5ID0gKHNkX2NoYWluX3N0cnVjdCAqKSB4bWFsbG9jIChzaXplb2YgKHNkX2NoYWluX3N0cnVjdCkpOwotICBpZiAoIWNoYWluX2VudHJ5KQotICAgIGFzX2ZhdGFsIChfKCJPdXQgb2YgbWVtb3J5OiBjb3VsZCBub3QgYWxsb2NhdGUgbmV3IHNwYWNlIGNoYWluIGVudHJ5OiAlc1xuIiksCi0JICAgICAgbmFtZSk7Ci0KLSAgU1BBQ0VfTkFNRSAoY2hhaW5fZW50cnkpID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotICBzdHJjcHkgKFNQQUNFX05BTUUgKGNoYWluX2VudHJ5KSwgbmFtZSk7Ci0gIFNQQUNFX0RFRklORUQgKGNoYWluX2VudHJ5KSA9IGRlZmluZWQ7Ci0gIFNQQUNFX1VTRVJfREVGSU5FRCAoY2hhaW5fZW50cnkpID0gdXNlcl9kZWZpbmVkOwotICBTUEFDRV9TUE5VTSAoY2hhaW5fZW50cnkpID0gc3BudW07Ci0KLSAgY2hhaW5fZW50cnktPnNkX3NlZyA9IHNlZzsKLSAgY2hhaW5fZW50cnktPnNkX2xhc3Rfc3Vic2VnID0gLTE7Ci0gIGNoYWluX2VudHJ5LT5zZF9zdWJzcGFjZXMgPSBOVUxMOwotICBjaGFpbl9lbnRyeS0+c2RfbmV4dCA9IE5VTEw7Ci0KLSAgLyogRmluZCBzcG90IGZvciB0aGUgbmV3IHNwYWNlIGJhc2VkIG9uIGl0cyBzb3J0IGtleS4gICovCi0gIGlmICghc3BhY2VfZGljdF9sYXN0KQotICAgIHNwYWNlX2RpY3RfbGFzdCA9IGNoYWluX2VudHJ5OwotCi0gIGlmIChzcGFjZV9kaWN0X3Jvb3QgPT0gTlVMTCkKLSAgICBzcGFjZV9kaWN0X3Jvb3QgPSBjaGFpbl9lbnRyeTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNkX2NoYWluX3N0cnVjdCAqY2hhaW5fcG9pbnRlcjsKLSAgICAgIHNkX2NoYWluX3N0cnVjdCAqcHJldl9jaGFpbl9wb2ludGVyOwotCi0gICAgICBjaGFpbl9wb2ludGVyID0gc3BhY2VfZGljdF9yb290OwotICAgICAgcHJldl9jaGFpbl9wb2ludGVyID0gTlVMTDsKLQotICAgICAgd2hpbGUgKGNoYWluX3BvaW50ZXIpCi0JewotCSAgcHJldl9jaGFpbl9wb2ludGVyID0gY2hhaW5fcG9pbnRlcjsKLQkgIGNoYWluX3BvaW50ZXIgPSBjaGFpbl9wb2ludGVyLT5zZF9uZXh0OwotCX0KLQotICAgICAgLyogQXQgdGhpcyBwb2ludCB3ZSd2ZSBmb3VuZCB0aGUgY29ycmVjdCBwbGFjZSB0byBhZGQgdGhlIG5ldwotICAgICAgICAgZW50cnkuICBTbyBhZGQgaXQgYW5kIHVwZGF0ZSB0aGUgbGlua2VkIGxpc3RzIGFzIGFwcHJvcHJpYXRlLiAgKi8KLSAgICAgIGlmIChwcmV2X2NoYWluX3BvaW50ZXIpCi0JewotCSAgY2hhaW5fZW50cnktPnNkX25leHQgPSBjaGFpbl9wb2ludGVyOwotCSAgcHJldl9jaGFpbl9wb2ludGVyLT5zZF9uZXh0ID0gY2hhaW5fZW50cnk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNwYWNlX2RpY3Rfcm9vdCA9IGNoYWluX2VudHJ5OwotCSAgY2hhaW5fZW50cnktPnNkX25leHQgPSBjaGFpbl9wb2ludGVyOwotCX0KLQotICAgICAgaWYgKGNoYWluX2VudHJ5LT5zZF9uZXh0ID09IE5VTEwpCi0Jc3BhY2VfZGljdF9sYXN0ID0gY2hhaW5fZW50cnk7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgaGVyZSB0byBjYXRjaCBwcmVkZWZpbmVkIHNwYWNlcyB3aGljaCBkbyBub3QgZ2V0Ci0gICAgIG1vZGlmaWVkIGJ5IHRoZSB1c2VyJ3MgaW5wdXQuICBBbm90aGVyIGNhbGwgaXMgZm91bmQgYXQKLSAgICAgdGhlIGJvdHRvbSBvZiBwYV9wYXJzZV9zcGFjZV9zdG10IHRvIGhhbmRsZSBjYXNlcyB3aGVyZQotICAgICB0aGUgdXNlciBtb2RpZmllcyBhIHByZWRlZmluZWQgc3BhY2UuICAqLwotI2lmZGVmIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzCi0gIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIChzZWcsIGRlZmluZWQsIHByaXZhdGUsIHNvcnQsIHNwbnVtKTsKLSNlbmRpZgotCi0gIHJldHVybiBjaGFpbl9lbnRyeTsKLX0KLQotLyogQ3JlYXRlIGEgbmV3IHN1YnNwYWNlIE5BTUUsIHdpdGggdGhlIGFwcHJvcHJpYXRlIGZsYWdzIGFzIGRlZmluZWQKLSAgIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgotCi0gICBBZGQgdGhlIG5ldyBzdWJzcGFjZSB0byB0aGUgc3Vic3BhY2UgZGljdGlvbmFyeSBjaGFpbiBpbiBudW1lcmljYWwKLSAgIG9yZGVyIGFzIGRlZmluZWQgYnkgdGhlIFNPUlQgZW50cmllcy4gICovCi0KLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICoKLWNyZWF0ZV9uZXdfc3Vic3BhY2UgKHNwYWNlLCBuYW1lLCBsb2FkYWJsZSwgY29kZV9vbmx5LCBjb21tb24sCi0JCSAgICAgZHVwX2NvbW1vbiwgaXNfemVybywgc29ydCwgYWNjZXNzLCBzcGFjZV9pbmRleCwKLQkJICAgICBhbGlnbm1lbnQsIHF1YWRyYW50LCBzZWcpCi0gICAgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBsb2FkYWJsZSwgY29kZV9vbmx5LCBjb21tb24sIGR1cF9jb21tb24sIGlzX3plcm87Ci0gICAgIGludCBzb3J0OwotICAgICBpbnQgYWNjZXNzOwotICAgICBpbnQgc3BhY2VfaW5kZXg7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci0gICAgIGludCBxdWFkcmFudDsKLSAgICAgYXNlY3Rpb24gKnNlZzsKLXsKLSAgc3NkX2NoYWluX3N0cnVjdCAqY2hhaW5fZW50cnk7Ci0KLSAgY2hhaW5fZW50cnkgPSAoc3NkX2NoYWluX3N0cnVjdCAqKSB4bWFsbG9jIChzaXplb2YgKHNzZF9jaGFpbl9zdHJ1Y3QpKTsKLSAgaWYgKCFjaGFpbl9lbnRyeSkKLSAgICBhc19mYXRhbCAoXygiT3V0IG9mIG1lbW9yeTogY291bGQgbm90IGFsbG9jYXRlIG5ldyBzdWJzcGFjZSBjaGFpbiBlbnRyeTogJXNcbiIpLCBuYW1lKTsKLQotICBTVUJTUEFDRV9OQU1FIChjaGFpbl9lbnRyeSkgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIHN0cmNweSAoU1VCU1BBQ0VfTkFNRSAoY2hhaW5fZW50cnkpLCBuYW1lKTsKLQotICAvKiBJbml0aWFsaXplIHN1YnNwYWNlX2RlZmluZWQuICBXaGVuIHdlIGhpdCBhIC5zdWJzcGFjZSBkaXJlY3RpdmUKLSAgICAgd2UnbGwgc2V0IGl0IHRvIDEgd2hpY2ggImxvY2tzLWluIiB0aGUgc3Vic3BhY2UgYXR0cmlidXRlcy4gICovCi0gIFNVQlNQQUNFX0RFRklORUQgKGNoYWluX2VudHJ5KSA9IDA7Ci0KLSAgY2hhaW5fZW50cnktPnNzZF9zdWJzZWcgPSAwOwotICBjaGFpbl9lbnRyeS0+c3NkX3NlZyA9IHNlZzsKLSAgY2hhaW5fZW50cnktPnNzZF9uZXh0ID0gTlVMTDsKLQotICAvKiBGaW5kIHNwb3QgZm9yIHRoZSBuZXcgc3Vic3BhY2UgYmFzZWQgb24gaXRzIHNvcnQga2V5LiAgKi8KLSAgaWYgKHNwYWNlLT5zZF9zdWJzcGFjZXMgPT0gTlVMTCkKLSAgICBzcGFjZS0+c2Rfc3Vic3BhY2VzID0gY2hhaW5fZW50cnk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9wb2ludGVyOwotICAgICAgc3NkX2NoYWluX3N0cnVjdCAqcHJldl9jaGFpbl9wb2ludGVyOwotCi0gICAgICBjaGFpbl9wb2ludGVyID0gc3BhY2UtPnNkX3N1YnNwYWNlczsKLSAgICAgIHByZXZfY2hhaW5fcG9pbnRlciA9IE5VTEw7Ci0KLSAgICAgIHdoaWxlIChjaGFpbl9wb2ludGVyKQotCXsKLQkgIHByZXZfY2hhaW5fcG9pbnRlciA9IGNoYWluX3BvaW50ZXI7Ci0JICBjaGFpbl9wb2ludGVyID0gY2hhaW5fcG9pbnRlci0+c3NkX25leHQ7Ci0JfQotCi0gICAgICAvKiBOb3cgd2UgaGF2ZSBzb21ld2hlcmUgdG8gcHV0IHRoZSBuZXcgZW50cnkuICBJbnNlcnQgaXQgYW5kIHVwZGF0ZQotICAgICAgICAgdGhlIGxpbmtzLiAgKi8KLSAgICAgIGlmIChwcmV2X2NoYWluX3BvaW50ZXIpCi0JewotCSAgY2hhaW5fZW50cnktPnNzZF9uZXh0ID0gY2hhaW5fcG9pbnRlcjsKLQkgIHByZXZfY2hhaW5fcG9pbnRlci0+c3NkX25leHQgPSBjaGFpbl9lbnRyeTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3BhY2UtPnNkX3N1YnNwYWNlcyA9IGNoYWluX2VudHJ5OwotCSAgY2hhaW5fZW50cnktPnNzZF9uZXh0ID0gY2hhaW5fcG9pbnRlcjsKLQl9Ci0gICAgfQotCi0jaWZkZWYgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMKLSAgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgKHNlZywgc3BhY2UtPnNkX3NlZywgYWNjZXNzLAotCQkJCSBzb3J0LCBxdWFkcmFudCk7Ci0jZW5kaWYKLQotICByZXR1cm4gY2hhaW5fZW50cnk7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBzdWJzcGFjZSBiYXNlZCB1cG9uIHRoZQotICAgdmFyaW91cyBhcmd1bWVudHMuICAgUmV0dXJuIHRoZSBtb2RpZmllZCBzdWJzcGFjZSBjaGFpbiBlbnRyeS4gICovCi0KLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICoKLXVwZGF0ZV9zdWJzcGFjZSAoc3BhY2UsIG5hbWUsIGxvYWRhYmxlLCBjb2RlX29ubHksIGNvbW1vbiwgZHVwX2NvbW1vbiwgc29ydCwKLQkJIHplcm8sIGFjY2Vzcywgc3BhY2VfaW5kZXgsIGFsaWdubWVudCwgcXVhZHJhbnQsIHNlY3Rpb24pCi0gICAgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBsb2FkYWJsZTsKLSAgICAgaW50IGNvZGVfb25seTsKLSAgICAgaW50IGNvbW1vbjsKLSAgICAgaW50IGR1cF9jb21tb247Ci0gICAgIGludCB6ZXJvOwotICAgICBpbnQgc29ydDsKLSAgICAgaW50IGFjY2VzczsKLSAgICAgaW50IHNwYWNlX2luZGV4OwotICAgICBpbnQgYWxpZ25tZW50OwotICAgICBpbnQgcXVhZHJhbnQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBzc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9lbnRyeTsKLQotICBjaGFpbl9lbnRyeSA9IGlzX2RlZmluZWRfc3Vic3BhY2UgKG5hbWUpOwotCi0jaWZkZWYgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMKLSAgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgKHNlY3Rpb24sIHNwYWNlLT5zZF9zZWcsIGFjY2VzcywKLQkJCQkgc29ydCwgcXVhZHJhbnQpOwotI2VuZGlmCi0KLSAgcmV0dXJuIGNoYWluX2VudHJ5OwotfQotCi0vKiBSZXR1cm4gdGhlIHNwYWNlIGNoYWluIGVudHJ5IGZvciB0aGUgc3BhY2Ugd2l0aCB0aGUgbmFtZSBOQU1FIG9yCi0gICBOVUxMIGlmIG5vIHN1Y2ggc3BhY2UgZXhpc3RzLiAgKi8KLQotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqCi1pc19kZWZpbmVkX3NwYWNlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX3BvaW50ZXI7Ci0KLSAgZm9yIChjaGFpbl9wb2ludGVyID0gc3BhY2VfZGljdF9yb290OwotICAgICAgIGNoYWluX3BvaW50ZXI7Ci0gICAgICAgY2hhaW5fcG9pbnRlciA9IGNoYWluX3BvaW50ZXItPnNkX25leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoU1BBQ0VfTkFNRSAoY2hhaW5fcG9pbnRlciksIG5hbWUpID09IDApCi0JcmV0dXJuIGNoYWluX3BvaW50ZXI7Ci0gICAgfQotCi0gIC8qIE5vIG1hcHBpbmcgZnJvbSBzZWdtZW50IHRvIHNwYWNlIHdhcyBmb3VuZC4gIFJldHVybiBOVUxMLiAgKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEZpbmQgYW5kIHJldHVybiB0aGUgc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzZWcuICBJZiBubyBtYXBwaW5nCi0gICBmcm9tIHRoZSBnaXZlbiBzZWcgdG8gYSBzcGFjZSBpcyBmb3VuZCwgdGhlbiByZXR1cm4gTlVMTC4KLQotICAgVW5saWtlIHN1YnNwYWNlcywgdGhlIG51bWJlciBvZiBzcGFjZXMgaXMgbm90IGV4cGVjdGVkIHRvIGdyb3cgbXVjaCwKLSAgIHNvIGEgbGluZWFyIGV4aGF1c3RpdmUgc2VhcmNoIGlzIE9LIGhlcmUuICAqLwotCi1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICoKLXBhX3NlZ21lbnRfdG9fc3BhY2UgKHNlZykKLSAgICAgYXNlY3Rpb24gKnNlZzsKLXsKLSAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZV9jaGFpbjsKLQotICAvKiBXYWxrIHRocm91Z2ggZWFjaCBzcGFjZSBsb29raW5nIGZvciB0aGUgY29ycmVjdCBtYXBwaW5nLiAgKi8KLSAgZm9yIChzcGFjZV9jaGFpbiA9IHNwYWNlX2RpY3Rfcm9vdDsKLSAgICAgICBzcGFjZV9jaGFpbjsKLSAgICAgICBzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChzcGFjZV9jaGFpbi0+c2Rfc2VnID09IHNlZykKLQlyZXR1cm4gc3BhY2VfY2hhaW47Ci0gICAgfQotCi0gIC8qIE1hcHBpbmcgd2FzIG5vdCBmb3VuZC4gIFJldHVybiBOVUxMLiAgKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3BhY2UgY2hhaW4gZW50cnkgZm9yIHRoZSBzdWJzcGFjZSB3aXRoIHRoZSBuYW1lIE5BTUUgb3IKLSAgIE5VTEwgaWYgbm8gc3VjaCBzdWJzcGFjZSBleGlzdHMuCi0KLSAgIFVzZXMgYSBsaW5lYXIgc2VhcmNoIHRocm91Z2ggYWxsIHRoZSBzcGFjZXMgYW5kIHN1YnNwYWNlcywgdGhpcyBtYXkKLSAgIG5vdCBiZSBhcHByb3ByaWF0ZSBpZiB3ZSBldmVyIGJlaW5nIHBsYWNpbmcgZWFjaCBmdW5jdGlvbiBpbiBpdHMKLSAgIG93biBzdWJzcGFjZS4gICovCi0KLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICoKLWlzX2RlZmluZWRfc3Vic3BhY2UgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfY2hhaW47Ci0gIHNzZF9jaGFpbl9zdHJ1Y3QgKnN1YnNwYWNlX2NoYWluOwotCi0gIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHNwYWNlLiAgKi8KLSAgZm9yIChzcGFjZV9jaGFpbiA9IHNwYWNlX2RpY3Rfcm9vdDsKLSAgICAgICBzcGFjZV9jaGFpbjsKLSAgICAgICBzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9uZXh0KQotICAgIHsKLSAgICAgIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHN1YnNwYWNlIGxvb2tpbmcgZm9yIGEgbmFtZSB3aGljaCBtYXRjaGVzLiAgKi8KLSAgICAgIGZvciAoc3Vic3BhY2VfY2hhaW4gPSBzcGFjZV9jaGFpbi0+c2Rfc3Vic3BhY2VzOwotCSAgIHN1YnNwYWNlX2NoYWluOwotCSAgIHN1YnNwYWNlX2NoYWluID0gc3Vic3BhY2VfY2hhaW4tPnNzZF9uZXh0KQotCWlmIChzdHJjbXAgKFNVQlNQQUNFX05BTUUgKHN1YnNwYWNlX2NoYWluKSwgbmFtZSkgPT0gMCkKLQkgIHJldHVybiBzdWJzcGFjZV9jaGFpbjsKLSAgICB9Ci0KLSAgLyogU3Vic3BhY2Ugd2Fzbid0IGZvdW5kLiAgUmV0dXJuIE5VTEwuICAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRmluZCBhbmQgcmV0dXJuIHRoZSBzdWJzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHNlZy4gIElmIG5vCi0gICBtYXBwaW5nIGZyb20gdGhlIGdpdmVuIHNlZyB0byBhIHN1YnNwYWNlIGlzIGZvdW5kLCB0aGVuIHJldHVybiBOVUxMLgotCi0gICBJZiB3ZSBldmVyIHB1dCBlYWNoIHByb2NlZHVyZS9mdW5jdGlvbiB3aXRoaW4gaXRzIG93biBzdWJzcGFjZQotICAgKHRvIG1ha2UgbGlmZSBlYXNpZXIgb24gdGhlIGNvbXBpbGVyIGFuZCBsaW5rZXIpLCB0aGVuIHRoaXMgd2lsbCBoYXZlCi0gICB0byBiZWNvbWUgbW9yZSBlZmZpY2llbnQuICAqLwotCi1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqCi1wYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChzZWcsIHN1YnNlZykKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgc3Vic2VnVCBzdWJzZWc7Ci17Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfY2hhaW47Ci0gIHNzZF9jaGFpbl9zdHJ1Y3QgKnN1YnNwYWNlX2NoYWluOwotCi0gIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHNwYWNlLiAgKi8KLSAgZm9yIChzcGFjZV9jaGFpbiA9IHNwYWNlX2RpY3Rfcm9vdDsKLSAgICAgICBzcGFjZV9jaGFpbjsKLSAgICAgICBzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChzcGFjZV9jaGFpbi0+c2Rfc2VnID09IHNlZykKLQl7Ci0JICAvKiBXYWxrIHRocm91Z2ggZWFjaCBzdWJzcGFjZSB3aXRoaW4gZWFjaCBzcGFjZSBsb29raW5nIGZvcgotCSAgICAgdGhlIGNvcnJlY3QgbWFwcGluZy4gICovCi0JICBmb3IgKHN1YnNwYWNlX2NoYWluID0gc3BhY2VfY2hhaW4tPnNkX3N1YnNwYWNlczsKLQkgICAgICAgc3Vic3BhY2VfY2hhaW47Ci0JICAgICAgIHN1YnNwYWNlX2NoYWluID0gc3Vic3BhY2VfY2hhaW4tPnNzZF9uZXh0KQotCSAgICBpZiAoc3Vic3BhY2VfY2hhaW4tPnNzZF9zdWJzZWcgPT0gKGludCkgc3Vic2VnKQotCSAgICAgIHJldHVybiBzdWJzcGFjZV9jaGFpbjsKLQl9Ci0gICAgfQotCi0gIC8qIE5vIG1hcHBpbmcgZnJvbSBzdWJzZWdtZW50IHRvIHN1YnNwYWNlIGZvdW5kLiAgUmV0dXJuIE5VTEwuICAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2l2ZW4gYSBudW1iZXIsIHRyeSBhbmQgZmluZCBhIHNwYWNlIHdpdGggdGhlIG5hbWUgbnVtYmVyLgotCi0gICBSZXR1cm4gYSBwb2ludGVyIHRvIGEgc3BhY2UgZGljdGlvbmFyeSBjaGFpbiBlbnRyeSBmb3IgdGhlIHNwYWNlCi0gICB0aGF0IHdhcyBmb3VuZCBvciBOVUxMIG9uIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICoKLXBhX2ZpbmRfc3BhY2VfYnlfbnVtYmVyIChudW1iZXIpCi0gICAgIGludCBudW1iZXI7Ci17Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfY2hhaW47Ci0KLSAgZm9yIChzcGFjZV9jaGFpbiA9IHNwYWNlX2RpY3Rfcm9vdDsKLSAgICAgICBzcGFjZV9jaGFpbjsKLSAgICAgICBzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChTUEFDRV9TUE5VTSAoc3BhY2VfY2hhaW4pID09ICh1bnNpZ25lZCBpbnQpIG51bWJlcikKLQlyZXR1cm4gc3BhY2VfY2hhaW47Ci0gICAgfQotCi0gIC8qIE5vIGFwcHJvcHJpYXRlIHNwYWNlIGZvdW5kLiAgUmV0dXJuIE5VTEwuICAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmV0dXJuIHRoZSBzdGFydGluZyBhZGRyZXNzIGZvciB0aGUgZ2l2ZW4gc3Vic3BhY2UuICBJZiB0aGUgc3RhcnRpbmcKLSAgIGFkZHJlc3MgaXMgdW5rbm93biB0aGVuIHJldHVybiB6ZXJvLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGFfc3Vic3BhY2Vfc3RhcnQgKHNwYWNlLCBxdWFkcmFudCkKLSAgICAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLSAgICAgaW50IHF1YWRyYW50OwotewotICAvKiBGSVhNRS4gIEFzc3VtZXMgZXZlcnlvbmUgcHV0cyByZWFkL3dyaXRlIGRhdGEgYXQgMHg0MDAwMDAwLCB0aGlzCi0gICAgIGlzIG5vdCBjb3JyZWN0IGZvciB0aGUgUEEgT1NGMSBwb3J0LiAgKi8KLSAgaWYgKChzdHJjbXAgKFNQQUNFX05BTUUgKHNwYWNlKSwgIiRQUklWQVRFJCIpID09IDApICYmIHF1YWRyYW50ID09IDEpCi0gICAgcmV0dXJuIDB4NDAwMDAwMDA7Ci0gIGVsc2UgaWYgKHNwYWNlLT5zZF9zZWcgPT0gZGF0YV9zZWN0aW9uICYmIHF1YWRyYW50ID09IDEpCi0gICAgcmV0dXJuIDB4NDAwMDAwMDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEZJWE1FLiAgTmVlZHMgZG9jdW1lbnRhdGlvbi4gICovCi1zdGF0aWMgaW50Ci1wYV9uZXh0X3N1YnNlZyAoc3BhY2UpCi0gICAgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci17Ci0KLSAgc3BhY2UtPnNkX2xhc3Rfc3Vic2VnKys7Ci0gIHJldHVybiBzcGFjZS0+c2RfbGFzdF9zdWJzZWc7Ci19Ci0jZW5kaWYKLQotLyogSGVscGVyIGZ1bmN0aW9uIGZvciBwYV9zdHJpbmdlci4gIFVzZWQgdG8gZmluZCB0aGUgZW5kIG9mCi0gICBhIHN0cmluZy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBhX3N0cmluZ2VyX2F1eCAocykKLSAgICAgY2hhciAqczsKLXsKLSAgdW5zaWduZWQgaW50IGMgPSAqcyAmIENIQVJfTUFTSzsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ1wiJzoKLSAgICAgIGMgPSBOT1RfQV9DSEFSOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIGM7Ci19Ci0KLS8qIEhhbmRsZSBhIC5TVFJJTkcgdHlwZSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfc3RyaW5nZXIgKGFwcGVuZF96ZXJvKQotICAgICBpbnQgYXBwZW5kX3plcm87Ci17Ci0gIGNoYXIgKnMsIG51bV9idWZbNF07Ci0gIHVuc2lnbmVkIGludCBjOwotICBpbnQgaTsKLQotICAvKiBQcmVwcm9jZXNzIHRoZSBzdHJpbmcgdG8gaGFuZGxlIFBBLXNwZWNpZmljIGVzY2FwZSBzZXF1ZW5jZXMuCi0gICAgIEZvciBleGFtcGxlLCBceEREIHdoZXJlIEREIGlzIGEgaGV4aWRlY2ltYWwgbnVtYmVyIHNob3VsZCBiZQotICAgICBjaGFuZ2VkIHRvIFxPT08gd2hlcmUgT09PIGlzIGFuIG9jdGFsIG51bWJlci4gICovCi0KLSAgLyogU2tpcCB0aGUgb3BlbmluZyBxdW90ZS4gICovCi0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxOwotCi0gIHdoaWxlIChpc19hX2NoYXIgKGMgPSBwYV9zdHJpbmdlcl9hdXggKHMrKykpKQotICAgIHsKLSAgICAgIGlmIChjID09ICdcXCcpCi0JewotCSAgYyA9ICpzOwotCSAgc3dpdGNoIChjKQotCSAgICB7Ci0JICAgICAgLyogSGFuZGxlIFx4PG51bT4uICAqLwotCSAgICBjYXNlICd4JzoKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGludCBudW1iZXI7Ci0JCWludCBudW1fZGlnaXQ7Ci0JCWNoYXIgZGc7Ci0JCWNoYXIgKnNfc3RhcnQgPSBzOwotCi0JCS8qIEdldCBwYXMgdGhlICd4Jy4gICovCi0JCXMrKzsKLQkJZm9yIChudW1fZGlnaXQgPSAwLCBudW1iZXIgPSAwLCBkZyA9ICpzOwotCQkgICAgIG51bV9kaWdpdCA8IDIKLQkJICAgICAmJiAoaXNkaWdpdCAoZGcpIHx8IChkZyA+PSAnYScgJiYgZGcgPD0gJ2YnKQotCQkJIHx8IChkZyA+PSAnQScgJiYgZGcgPD0gJ0YnKSk7Ci0JCSAgICAgbnVtX2RpZ2l0KyspCi0JCSAgewotCQkgICAgaWYgKGlzZGlnaXQgKGRnKSkKLQkJICAgICAgbnVtYmVyID0gbnVtYmVyICogMTYgKyBkZyAtICcwJzsKLQkJICAgIGVsc2UgaWYgKGRnID49ICdhJyAmJiBkZyA8PSAnZicpCi0JCSAgICAgIG51bWJlciA9IG51bWJlciAqIDE2ICsgZGcgLSAnYScgKyAxMDsKLQkJICAgIGVsc2UKLQkJICAgICAgbnVtYmVyID0gbnVtYmVyICogMTYgKyBkZyAtICdBJyArIDEwOwotCi0JCSAgICBzKys7Ci0JCSAgICBkZyA9ICpzOwotCQkgIH0KLQkJaWYgKG51bV9kaWdpdCA+IDApCi0JCSAgewotCQkgICAgc3dpdGNoIChudW1fZGlnaXQpCi0JCSAgICAgIHsKLQkJICAgICAgY2FzZSAxOgotCQkJc3ByaW50ZiAobnVtX2J1ZiwgIiUwMm8iLCBudW1iZXIpOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgMjoKLQkJCXNwcmludGYgKG51bV9idWYsICIlMDNvIiwgbnVtYmVyKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICBmb3IgKGkgPSAwOyBpIDw9IG51bV9kaWdpdDsgaSsrKQotCQkgICAgICBzX3N0YXJ0W2ldID0gbnVtX2J1ZltpXTsKLQkJICB9Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgLyogVGhpcyBtaWdodCBiZSBhICJcIiIsIHNraXAgb3ZlciB0aGUgZXNjYXBlZCBjaGFyLiAgKi8KLQkgICAgZGVmYXVsdDoKLQkgICAgICBzKys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBzdHJpbmdlciAoYXBwZW5kX3plcm8pOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogSGFuZGxlIGEgLlZFUlNJT04gcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3ZlcnNpb24gKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgb2JqX3ZlcnNpb24gKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotI2lmZGVmIE9CSl9TT00KLQotLyogSGFuZGxlIGEgLkNPTVBJTEVSIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jb21waWxlciAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBvYmpfc29tX2NvbXBpbGVyICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLSNlbmRpZgotCi0vKiBIYW5kbGUgYSAuQ09QWVJJR0hUIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jb3B5cmlnaHQgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgb2JqX2NvcHlyaWdodCAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBKdXN0IGxpa2UgYSBub3JtYWwgY29ucywgYnV0IHdoZW4gZmluaXNoZWQgd2UgaGF2ZSB0byB1bmRlZmluZQotICAgdGhlIGxhdGVzdCBzcGFjZSBsYWJlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jb25zIChuYnl0ZXMpCi0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGNvbnMgKG5ieXRlcyk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBTd2l0Y2ggdG8gdGhlIGRhdGEgc3BhY2UuICBBcyB1c3VhbCBkZWxldGUgb3VyIGxhYmVsLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2RhdGEgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIGN1cnJlbnRfc3BhY2UgPSBpc19kZWZpbmVkX3NwYWNlICgiJFBSSVZBVEUkIik7Ci0gIGN1cnJlbnRfc3Vic3BhY2UKLSAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKGN1cnJlbnRfc3BhY2UtPnNkX3NlZywgMCk7Ci0jZW5kaWYKLSAgc19kYXRhICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIExpa2UgZmxvYXRfY29ucywgYnV0IHdlIG5lZWQgdG8gdW5kZWZpbmUgb3VyIGxhYmVsLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2Zsb2F0X2NvbnMgKGZsb2F0X3R5cGUpCi0gICAgIGludCBmbG9hdF90eXBlOwotewotICBmbG9hdF9jb25zIChmbG9hdF90eXBlKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIExpa2Ugc19maWxsLCBidXQgZGVsZXRlIG91ciBsYWJlbCB3aGVuIGZpbmlzaGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2ZpbGwgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgc19maWxsICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIExpa2UgbGNvbW0sIGJ1dCBkZWxldGUgb3VyIGxhYmVsIHdoZW4gZmluaXNoZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfbGNvbW0gKG5lZWRzX2FsaWduKQotICAgICBpbnQgbmVlZHNfYWxpZ247Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIHNfbGNvbW0gKG5lZWRzX2FsaWduKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIExpa2UgbHN5bSwgYnV0IGRlbGV0ZSBvdXIgbGFiZWwgd2hlbiBmaW5pc2hlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9sc3ltICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIHNfbHN5bSAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBTd2l0Y2ggdG8gdGhlIHRleHQgc3BhY2UuICBMaWtlIHNfdGV4dCwgYnV0IGRlbGV0ZSBvdXIKLSAgIGxhYmVsIHdoZW4gZmluaXNoZWQuICAqLwotc3RhdGljIHZvaWQKLXBhX3RleHQgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIGN1cnJlbnRfc3BhY2UgPSBpc19kZWZpbmVkX3NwYWNlICgiJFRFWFQkIik7Ci0gIGN1cnJlbnRfc3Vic3BhY2UKLSAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKGN1cnJlbnRfc3BhY2UtPnNkX3NlZywgMCk7Ci0jZW5kaWYKLQotICBzX3RleHQgKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogT24gdGhlIFBBIHJlbG9jYXRpb25zIHdoaWNoIGludm9sdmUgZnVuY3Rpb24gc3ltYm9scyBtdXN0IG5vdCBiZQotICAgYWRqdXN0ZWQuICBUaGlzIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4ga25vdyB3aGVuL2hvdyB0byBjcmVhdGUgYXJndW1lbnQKLSAgIHJlbG9jYXRpb24gc3R1YnMgZm9yIGluZGlyZWN0IGNhbGxzIGFuZCBjYWxscyB0byBzdGF0aWMgZnVuY3Rpb25zLgotCi0gICAiVCIgZmllbGQgc2VsZWN0b3JzIGNyZWF0ZSBETFQgcmVsYXRpdmUgZml4dXBzIGZvciBhY2Nlc3NpbmcKLSAgIGdsb2JhbHMgYW5kIHN0YXRpY3MgaW4gUElDIGNvZGU7IGVhY2ggRExUIHJlbGF0aXZlIGZpeHVwIGNyZWF0ZXMKLSAgIGFuIGVudHJ5IGluIHRoZSBETFQgdGFibGUuICBUaGUgZW50cmllcyBjb250YWluIHRoZSBhZGRyZXNzIG9mCi0gICB0aGUgZmluYWwgdGFyZ2V0IChlZyBhY2Nlc3NpbmcgImZvbyIgd291bGQgY3JlYXRlIGEgRExUIGVudHJ5Ci0gICB3aXRoIHRoZSBhZGRyZXNzIG9mICJmb28iKS4KLQotICAgVW5mb3J0dW5hdGVseSwgdGhlIEhQIGxpbmtlciBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IGFueSBhZGRlbmQKLSAgIHdoZW4gZ2VuZXJhdGluZyB0aGUgRExUOyBzbyBhY2Nlc3NpbmcgJExJVCQrOCBwdXRzIHRoZSBhZGRyZXNzIG9mCi0gICAkTElUJCBpbnRvIHRoZSBETFQgcmF0aGVyIHRoYW4gdGhlIGFkZHJlc3Mgb2YgJExJVCQrOC4KLQotICAgVGhlIGVuZCByZXN1bHQgaXMgd2UgY2FuJ3QgcGVyZm9ybSByZWxvY2F0aW9uIHN5bWJvbCByZWR1Y3Rpb25zIGZvcgotICAgYW55IGZpeHVwIHdoaWNoIGNyZWF0ZXMgZW50cmllcyBpbiB0aGUgRExUIChlZyB0aGV5IHVzZSAiVCIgZmllbGQKLSAgIHNlbGVjdG9ycykuCi0KLSAgIFJlamVjdCByZWR1Y3Rpb25zIGludm9sdmluZyBzeW1ib2xzIHdpdGggZXh0ZXJuYWwgc2NvcGU7IHN1Y2gKLSAgIHJlZHVjdGlvbnMgbWFrZSBsaWZlIGEgbGl2aW5nIGhlbGwgZm9yIG9iamVjdCBmaWxlIGVkaXRvcnMuCi0KLSAgIEZJWE1FLiAgQWxzbyByZWplY3QgUl9IUFBBIHJlbG9jYXRpb25zIHdoaWNoIGFyZSAzMmJpdHMgd2lkZSBpbgotICAgdGhlIGNvZGUgc3BhY2UuICBUaGUgU09NIEJGRCBiYWNrZW5kIGRvZXNuJ3Qga25vdyBob3cgdG8gcHVsbCB0aGUKLSAgIHJpZ2h0IGJpdHMgb3V0IG9mIGFuIGluc3RydWN0aW9uLiAgKi8KLQotaW50Ci1ocHBhX2ZpeF9hZGp1c3RhYmxlIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICpocHBhX2ZpeDsKLQotICBocHBhX2ZpeCA9IChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICopIGZpeHAtPnRjX2ZpeF9kYXRhOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBSZWplY3QgcmVkdWN0aW9ucyBvZiBzeW1ib2xzIGluIDMyYml0IHJlbG9jcy4gICovCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBICYmIGhwcGFfZml4LT5meF9yX2Zvcm1hdCA9PSAzMikKLSAgICByZXR1cm4gMDsKLQotICAvKiBSZWplY3QgcmVkdWN0aW9ucyBvZiBzeW1ib2xzIGluIHN5bTEtc3ltMiBleHByZXNzaW9ucyB3aGVuCi0gICAgIHRoZSBmaXh1cCB3aWxsIG9jY3VyIGluIGEgQ09ERSBzdWJzcGFjZS4KLQotICAgICBYWFggRklYTUU6IExvbmcgdGVybSB3ZSBwcm9iYWJseSB3YW50IHRvIHJlamVjdCBhbGwgb2YgdGhlc2U7Ci0gICAgIGZvciBleGFtcGxlIHJlZHVjaW5nIGluIHRoZSBkZWJ1ZyBzZWN0aW9uIHdvdWxkIGxvc2UgaWYgd2UgZXZlcgotICAgICBzdXBwb3J0ZWQgdXNpbmcgdGhlIG9wdGltaXppbmcgaHAgbGlua2VyLiAgKi8KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5Ci0gICAgICAmJiBmaXhwLT5meF9zdWJzeQotICAgICAgJiYgKGhwcGFfZml4LT5zZWdtZW50LT5mbGFncyAmIFNFQ19DT0RFKSkKLSAgICB7Ci0gICAgICAvKiBBcHBhcmVudGx5IHN5X3VzZWRfaW5fcmVsb2MgbmV2ZXIgZ2V0cyBzZXQgZm9yIHN1YiBzeW1ib2xzLiAgKi8KLSAgICAgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X3N1YnN5KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBXZSBjYW4ndCBhZGp1c3QgYW55IHJlbG9jcyB0aGF0IHVzZSBMUiUgYW5kIFJSJSBmaWVsZCBzZWxlY3RvcnMuCi0gICAgIFRoYXQgY29uZnVzZXMgdGhlIEhQIGxpbmtlci4gICovCi0gIGlmIChocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX2xyc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3Jyc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX25scnNlbCkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gRExUIHJlbGF0aXZlIHJlbG9jcywKLSAgICAgcmVsb2NhdGlvbnMgd2l0aCBwbGFiZWxzLiAgKi8KLSAgaWYgKGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfdHNlbAotICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9sdHNlbAotICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9ydHNlbAotICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9wc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3Jwc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX2xwc2VsKQotICAgIHJldHVybiAwOwotCi0gIGlmIChmaXhwLT5meF9hZGRzeSAmJiBTX0lTX0VYVEVSTkFMIChmaXhwLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogUmVqZWN0IGFic29sdXRlIGNhbGxzIChqdW1wcykuICAqLwotICBpZiAoaHBwYV9maXgtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQUJTX0NBTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogUmVqZWN0IHJlZHVjdGlvbnMgb2YgZnVuY3Rpb24gc3ltYm9scy4gICovCi0gIGlmIChmaXhwLT5meF9hZGRzeSA9PSAwIHx8ICEgU19JU19GVU5DVElPTiAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgZml4dXAgaW4gRklYUCB3aWxsIHJlcXVpcmUgYSByZWxvY2F0aW9uLAotICAgZXZlbiBpdCBpZiBhcHBlYXJzIHRoYXQgdGhlIGZpeHVwIGNvdWxkIGJlIGNvbXBsZXRlbHkgaGFuZGxlZAotICAgd2l0aGluIEdBUy4gICovCi0KLWludAotaHBwYV9mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICpocHBhX2ZpeHA7Ci0gIGludCBkaXN0YW5jZTsKLQotICBocHBhX2ZpeHAgPSAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqKSBmaXhwLT50Y19maXhfZGF0YTsKLSNpZmRlZiBPQkpfU09NCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VOVFJZIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRVhJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9CRUdJTl9CUlRBQgotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9FTkRfQlJUQUIKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQkVHSU5fVFJZCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VORF9UUlkKLSAgICAgIHx8IChmaXhwLT5meF9hZGRzeSAhPSBOVUxMICYmIGZpeHAtPmZ4X3N1YnN5ICE9IE5VTEwKLQkgICYmIChocHBhX2ZpeHAtPnNlZ21lbnQtPmZsYWdzICYgU0VDX0NPREUpICE9IDApKQotICAgIHJldHVybiAxOwotI2VuZGlmCi0KLSNkZWZpbmUgYXJnX3JlbG9jX3N0dWJfbmVlZGVkKENBTExFUiwgQ0FMTEVFKSBcCi0gICgoQ0FMTEVFKSAmJiAoQ0FMTEVSKSAmJiAoKENBTExFRSkgIT0gKENBTExFUikpKQotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBJdCBpcyBuZWNlc3NhcnkgdG8gZm9yY2UgUEMtcmVsYXRpdmUgY2FsbHMvanVtcHMgdG8gaGF2ZSBhIHJlbG9jYXRpb24KLSAgICAgZW50cnkgaWYgdGhleSdyZSBnb2luZyB0byBuZWVkIGVpdGhlciBhIGFyZ3VtZW50IHJlbG9jYXRpb24gb3IgbG9uZwotICAgICBjYWxsIHN0dWIuICBGSVhNRS4gIENhbid0IHdlIG5lZWQgdGhlIHNhbWUgZm9yIGFic29sdXRlIGNhbGxzPyAgKi8KLSAgaWYgKGZpeHAtPmZ4X3BjcmVsICYmIGZpeHAtPmZ4X2FkZHN5Ci0gICAgICAmJiAoYXJnX3JlbG9jX3N0dWJfbmVlZGVkICgobG9uZykgKChvYmpfc3ltYm9sX3R5cGUgKikKLQlzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpKS0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYywKLQlocHBhX2ZpeHAtPmZ4X2FyZ19yZWxvYykpKQotICAgIHJldHVybiAxOwotI2VuZGlmCi0gIGRpc3RhbmNlID0gKGZpeHAtPmZ4X29mZnNldCArIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICAtIG1kX3BjcmVsX2Zyb20gKGZpeHApKTsKLSAgLyogTm93IGNoZWNrIGFuZCBzZWUgaWYgd2UncmUgZ29pbmcgdG8gbmVlZCBhIGxvbmctYnJhbmNoIHN0dWIuICAqLwotICBpZiAoZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9QQ1JFTF9DQUxMCi0gICAgICAmJiAoZGlzdGFuY2UgPiAyNjIxNDMgfHwgZGlzdGFuY2UgPCAtMjYyMTQ0KSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9BQlNfQ0FMTCkKLSAgICByZXR1cm4gMTsKLSN1bmRlZiBhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQKLQotICAvKiBObyBuZWVkICh5ZXQpIHRvIGZvcmNlIGFub3RoZXIgcmVsb2NhdGlvbnMgdG8gYmUgZW1pdHRlZC4gICovCi0gIHJldHVybiAwOwotfQotCi0vKiBOb3cgZm9yIHNvbWUgRUxGIHNwZWNpZmljIGNvZGUuICBGSVhNRS4gICovCi0jaWZkZWYgT0JKX0VMRgotLyogTWFyayB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gc28gdGhhdCBpdCdzIHBvc3NpYmxlIHRvIGNvbXB1dGUKLSAgIHRoZSBzaXplIG9mIHRoZSBmdW5jdGlvbiBpbiBocHBhX2VsZl9maW5hbF9wcm9jZXNzaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uICgpCi17Ci0gIC8qIEVMRiBkb2VzIG5vdCBoYXZlIEVYSVQgcmVsb2NhdGlvbnMuICBBbGwgd2UgZG8gaXMgY3JlYXRlIGEKLSAgICAgdGVtcG9yYXJ5IHN5bWJvbCBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLSAgY2hhciAqbmFtZSA9IChjaGFyICopCi0gICAgeG1hbGxvYyAoc3RybGVuICgiTCRcMDAxZW5kXyIpICsKLQkgICAgIHN0cmxlbiAoU19HRVRfTkFNRSAobGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCkpICsgMSk7Ci0KLSAgaWYgKG5hbWUpCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICAgICAgc3RyY3B5IChuYW1lLCAiTCRcMDAxZW5kXyIpOwotICAgICAgc3RyY2F0IChuYW1lLCBTX0dFVF9OQU1FIChsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sKSk7Ci0KLSAgICAgIC8qIElmIHdlIGhhdmUgYSAuZXhpdCBmb2xsb3dlZCBieSBhIC5wcm9jZW5kLCB0aGVuIHRoZQotCSBzeW1ib2wgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBkZWZpbmVkLiAgKi8KLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0gICAgICBpZiAoc3ltYm9sUCkKLQl7Ci0JICAvKiBUaGUgc3ltYm9sIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCEgIFRoaXMgY2FuCi0JICAgICBoYXBwZW4gaWYgd2UgaGF2ZSBhIC5leGl0IGZvbGxvd2VkIGJ5IGEgLnByb2NlbmQuCi0KLQkgICAgIFRoaXMgaXMgKm5vdCogYW4gZXJyb3IuICBBbGwgd2Ugd2FudCB0byBkbyBpcyBmcmVlCi0JICAgICB0aGUgbWVtb3J5IHdlIGp1c3QgYWxsb2NhdGVkIGZvciB0aGUgbmFtZSBhbmQgY29udGludWUuICAqLwotCSAgeGZyZWUgKG5hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBzeW1ib2wgdmFsdWUgc2hvdWxkIGJlIHRoZSBvZmZzZXQgb2YgdGhlCi0JICAgICBsYXN0IGluc3RydWN0aW9uIG9mIHRoZSBmdW5jdGlvbiAqLwotCSAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIG5vd19zZWcsICh2YWx1ZVQpIChmcmFnX25vd19maXggKCkgLSA0KSwKLQkJCQlmcmFnX25vdyk7Ci0KLQkgIGFzc2VydCAoc3ltYm9sUCk7Ci0JICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotCX0KLQotICAgICAgaWYgKHN5bWJvbFApCi0JbGFzdF9jYWxsX2luZm8tPmVuZF9zeW1ib2wgPSBzeW1ib2xQOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiU3ltYm9sICclcycgY291bGQgbm90IGJlIGNyZWF0ZWQuIiksIG5hbWUpOwotCi0gICAgfQotICBlbHNlCi0gICAgYXNfYmFkIChfKCJObyBtZW1vcnkgZm9yIHN5bWJvbCBuYW1lLiIpKTsKLQotfQotCi0vKiBGb3IgRUxGLCB0aGlzIGZ1bmN0aW9uIHNlcnZlcyBvbmUgcHVycG9zZTogIHRvIHNldHVwIHRoZSBzdF9zaXplCi0gICBmaWVsZCBvZiBTVFRfRlVOQyBzeW1ib2xzLiAgVG8gZG8gdGhpcywgd2UgbmVlZCB0byBzY2FuIHRoZQotICAgY2FsbF9pbmZvIHN0cnVjdHVyZSBsaXN0LCBkZXRlcm1pbmluZyBzdF9zaXplIGluIGJ5IHRha2luZyB0aGUKLSAgIGRpZmZlcmVuY2UgaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGJlZ2lubmluZy9lbmQgbWFya2VyIHN5bWJvbHMuICAqLwotCi12b2lkCi1lbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nICgpCi17Ci0gIHN0cnVjdCBjYWxsX2luZm8gKmNhbGxfaW5mb19wb2ludGVyOwotCi0gIGZvciAoY2FsbF9pbmZvX3BvaW50ZXIgPSBjYWxsX2luZm9fcm9vdDsKLSAgICAgICBjYWxsX2luZm9fcG9pbnRlcjsKLSAgICAgICBjYWxsX2luZm9fcG9pbnRlciA9IGNhbGxfaW5mb19wb2ludGVyLT5jaV9uZXh0KQotICAgIHsKLSAgICAgIGVsZl9zeW1ib2xfdHlwZSAqZXN5bQotCT0gKChlbGZfc3ltYm9sX3R5cGUgKikKLQkgICBzeW1ib2xfZ2V0X2JmZHN5bSAoY2FsbF9pbmZvX3BvaW50ZXItPnN0YXJ0X3N5bWJvbCkpOwotICAgICAgZXN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplID0KLQlTX0dFVF9WQUxVRSAoY2FsbF9pbmZvX3BvaW50ZXItPmVuZF9zeW1ib2wpCi0JLSBTX0dFVF9WQUxVRSAoY2FsbF9pbmZvX3BvaW50ZXItPnN0YXJ0X3N5bWJvbCkgKyA0OwotICAgIH0KLX0KLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotcGFfZW5kX29mX3NvdXJjZSAoKQotewotICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19EV0FSRjIpCi0gICAgZHdhcmYyX2ZpbmlzaCAoKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1ocHBhLmggYi9nYXMvY29uZmlnL3RjLWhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkNTVkYy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWhwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKiB0Yy1ocHBhLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRoZSBQQQotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBIUCBQQS1SSVNDIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKLSAgIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguICAqLwotCi0vKiBQbGVhc2UgcmVmcmFpbiBmcm9tIGV4cG9zaW5nIHRoZSB3b3JsZCB0byB0aGUgaW50ZXJuYWxzIG9mIHRjLWhwcGEuYwotICAgd2hlbiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQuICBUaGlzIG1lYW5zIG9ubHkgZGVjbGFyaW5nIGV4cG9ydGVkIGZ1bmN0aW9ucywKLSAgIChwbGVhc2UgUEFSQU1pemUgdGhlbSEpIG5vdCBleHBvcnRpbmcgc3RydWN0dXJlcyBhbmQgZGF0YSBpdGVtcyB3aGljaAotICAgYXJlIHVzZWQgc29sZWx5IHdpdGhpbiB0Yy1ocHBhLmMsIGV0Yy4KLQotICAgQWxzbyByZWZyYWluIGZyb20gYWRkaW5nIGFueSBtb3JlIG9iamVjdCBmaWxlIGRlcGVuZGVudCBjb2RlLCB0aGVyZSBpcyAKLSAgIGFscmVhZHkgZmFyIHRvbyBtdWNoIG9iamVjdCBmaWxlIGZvcm1hdCBkZXBlbmRlbnQgY29kZSBpbiB0aGlzIGZpbGUuCi0gICBJbiB0aGVvcnkgdGhpcyBmaWxlIHNob3VsZCBjb250YWluIG9ubHkgZXhwb3J0ZWQgZnVuY3Rpb25zLCBzdHJ1Y3R1cmVzCi0gICBhbmQgZGF0YSBkZWNsYXJhdGlvbnMgY29tbW9uIHRvIGFsbCBQQSBhc3NlbWJsZXJzLiAgKi8KLQotI2lmbmRlZiBfVENfSFBQQV9ICi0jZGVmaW5lIF9UQ19IUFBBX0gKLQotI2lmbmRlZiBUQ19IUFBBCi0jZGVmaW5lIFRDX0hQUEEJMQotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2hwcGEKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIEZJWE1FLiAgVGhlIGxhY2sgb2YgYSBwbGFjZSB0byBwdXQgdGhpbmdzIHdoaWNoIGFyZSBib3RoIHRhcmdldCBjcHUKLSAgIGFuZCB0YXJnZXQgZm9ybWF0IGRlcGVuZGVudCBtYWtlcyBoYWNrcyBsaWtlIHRoaXMgbmVjZXNzYXJ5LiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0jaWZkZWYgQkZENjQKLSNpbmNsdWRlICJiZmQvZWxmNjQtaHBwYS5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGY2NC1ocHBhIgotI2Vsc2UKLSNpbmNsdWRlICJiZmQvZWxmMzItaHBwYS5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1ocHBhIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9TT00KLSNpbmNsdWRlICJiZmQvc29tLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgInNvbSIKLSNlbmRpZgotCi0vKiBGSVhNRS4gIFdoeSBvaCB3aHkgYXJlbid0IHRoZXNlIGRlZmluZWQgc29tZXdoZXJlIGdsb2JhbGx5PyAgKi8KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgICAoMCkKLSNkZWZpbmUgVFJVRSAgICAoIUZBTFNFKQotI2VuZGlmCi0KLSNkZWZpbmUgQVNFQ19OVUxMIChhc2VjdGlvbiAqKTAKLQotLyogTGFiZWxzIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSBhIGNvbG9uIGZvciBhIHN1ZmZpeC4gICovCi0jZGVmaW5lIExBQkVMU19XSVRIT1VUX0NPTE9OUwotCi0vKiBGSVhNRS4gIFRoaXMgc2hvdWxkIGJlIHN0YXRpYyBhbmQgZGVjbGFyZWQgaW4gdGMtaHBwYS5jLCBidXQgCi0gICBwYV9kZWZpbmVfbGFiZWwgZ2V0cyB1c2VkIG91dHNpZGUgb2YgdGMtaHBwYS5jIHZpYSB0Y19mcm9iX2xhYmVsLgotICAgU2hvdWxkIGFsc28gYmUgUEFSQU1pemVkLCBidXQgc3ltYm9sUyBpc24ndCBhdmFpbGFibGUgaGVyZS4gICovCi1leHRlcm4gdm9pZCBwYV9kZWZpbmVfbGFiZWwgKCk7Ci0KLS8qIEZJWE1FLiAgVHlwZXMgbm90IGF2YWlsYWJsZSBoZXJlLCBzbyB0aGV5IGNhbid0IGJlIFBBUkFNaXplZC4gICovCi1leHRlcm4gdm9pZCBwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSAoKTsKLWV4dGVybiB2b2lkIGNvbnNfZml4X25ld19ocHBhICgpOwotZXh0ZXJuIGludCBocHBhX2ZvcmNlX3JlbG9jYXRpb24gKCk7Ci0KLS8qIFRoaXMgZ2V0cyBjYWxsZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlIHRvIG1ha2Ugc3VyZQotICAgdGhpbmdzIGxpa2UgZW50cnkvZXhpdCBhbmQgcHJvYy9wcm9jZW5kIHBhaXJzIG1hdGNoLiAgKi8KLWV4dGVybiB2b2lkIHBhX2NoZWNrX2VvZiBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIHRjX2Zyb2JfZmlsZSBwYV9jaGVja19lb2YKLQotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgcGFfZGVmaW5lX2xhYmVsIChzeW0pCi0KLS8qIFRoZSBQQSBkb2VzIG5vdCBuZWVkIHN1cHBvcnQgZm9yIGVpdGhlciBvZiB0aGVzZS4gICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihoZWFkZXJzKSB7O30KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGhlYWRlcnMpIHs7fQotCi0jZGVmaW5lIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotI2RlZmluZSBNQVhfUkVMT0NfRVhQQU5TSU9OIDYKLQotLyogRklYTUUuICBNb3JlIHRoaW5ncyB3aGljaCBhcmUgYm90aCBIUFBBIGFuZCBFTEYgc3BlY2lmaWMuICBUaGVyZSBpcyAKLSAgIG5vd2hlcmUgdG8gcHV0IHN1Y2ggdGhpbmdzLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nCWVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcKLXZvaWQgZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotLyogVGhlIFBBIG5lZWRzIHRvIHBhcnNlIGZpZWxkIHNlbGVjdG9ycyBpbiAuYnl0ZSwgZXRjLiAgKi8KLQotI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIFwKLSAgcGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEgKEVYUCkKLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19ocHBhCi0KLS8qIE9uIHRoZSBQQSwgYW4gZXF1YWwgc2lnbiBvZnRlbiBhcHBlYXJzIGFzIGEgY29uZGl0aW9uIG9yIG51bGxpZmljYXRpb24KLSAgIGNvbXBsZXRlciBpbiBhbiBpbnN0cnVjdGlvbi4gIFRoaXMgY2FuIGJlIGRldGVjdGVkIGJ5IGNoZWNraW5nIHRoZQotICAgcHJldmlvdXMgY2hhcmFjdGVyLCBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgY29tbWEsIHRoZW4gdGhlIGVxdWFsIGlzCi0gICBiZWluZyB1c2VkIGFzIHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBUQ19FUVVBTF9JTl9JTlNOKEMsIFBUUikJKChDKSA9PSAnLCcpCi0KLS8qIFNpbWlsYXJseSBmb3IgYW4gZXhjbGFtYXRpb24gcG9pbnQuICBJdCBpcyB1c2VkIGluIEZQIGNvbXBhcmlzb24KLSAgIGluc3RydWN0aW9ucyBhbmQgYXMgYW4gZW5kIG9mIGxpbmUgbWFya2VyLiAgV2hlbiB1c2VkIGluIGFuIGluc3RydWN0aW9uCi0gICBpdCB3aWxsIGFsd2F5cyBmb2xsb3cgYSBjb21tYS4gICovCi0jZGVmaW5lIFRDX0VPTF9JTl9JTlNOKFBUUikJKCooUFRSKSA9PSAnIScgJiYgKFBUUilbLTFdID09ICcsJykKLQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZSBocHBhX2ZpeF9hZGp1c3RhYmxlCi0KLS8qIEJlY2F1c2Ugb2YgdGhlIHN0cmFuZ2UgUEEgY2FsbGluZyBjb252ZW50aW9ucywgaXQgaXMgc29tZXRpbWVzCi0gICBuZWNlc3NhcnkgdG8gZW1pdCBhIHJlbG9jYXRpb24gZm9yIGEgY2FsbCBldmVuIHRob3VnaCBpdCB3b3VsZAotICAgbm9ybWFsbHkgYXBwZWFyIHNhZmUgdG8gaGFuZGxlIGl0IGNvbXBsZXRlbHkgd2l0aGluIEdBUy4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkgaHBwYV9mb3JjZV9yZWxvY2F0aW9uIChGSVhQKQotCi0jaWZkZWYgT0JKX1NPTQotLyogSWYgYSBzeW1ib2wgaXMgaW1wb3J0ZWQsIGJ1dCBuZXZlciB1c2VkLCB0aGVuIHRoZSBzeW1ib2wgc2hvdWxkCi0gICAqbm90KiBlbmQgdXAgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIExpa2V3aXNlIGZvciBhYnNvbHV0ZSBzeW1ib2xzCi0gICB3aXRoIGxvY2FsIHNjb3BlLiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLHB1bnQpIFwKLSAgICBpZiAoKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF91bmRfc2VjdGlvbiAmJiAhIHN5bWJvbF91c2VkX3AgKHN5bSkpIFwKLQl8fCAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSAmYmZkX2Fic19zZWN0aW9uIFwKLQkgICAgJiYgISBTX0lTX0VYVEVSTkFMIChzeW0pKSkgXAotICAgICAgcHVudCA9IDEKLQotLyogV2UgbmVlZCB0byBiZSBhYmxlIHRvIG1ha2UgcmVsb2NhdGlvbnMgaW52b2x2aW5nIHRoZSBkaWZmZXJlbmNlIG9mCi0gICB0d28gc3ltYm9scy4gIFRoaXMgaW5jbHVkZXMgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgd2hlbgotICAgb25lIG9mIHRoZW0gaXMgdW5kZWZpbmVkICh0aGlzIGNvbWVzIHVwIGluIFBJQyBjb2RlIGdlbmVyYXRpb24pLiAKLQotICAgV2UgZG9uJ3QgZGVmaW5lIERJRkZfRVhQUl9PSyBiZWNhdXNlIGl0IGRvZXMgdGhlIHdyb25nIHRoaW5nIGlmCi0gICB0aGUgYWRkIHN5bWJvbCBpcyB1bmRlZmluZWQgYW5kIHRoZSBzdWIgc3ltYm9sIGlzIGEgc3ltYm9sIGluCi0gICB0aGUgc2FtZSBzZWN0aW9uIGFzIHRoZSByZWxvY2F0aW9uLiAgV2UgYWxzbyBuZWVkIHNvbWUgd2F5IHRvCi0gICBzcGVjaWFsaXplIHNvbWUgY29kZSBpbiBhZGp1c3RfcmVsb2Nfc3ltcy4gICovCi0jZGVmaW5lIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLHB1bnQpIFwKLSAgeyBcCi0gICAgaWYgKChTX0dFVF9TRUdNRU5UIChzeW0pID09ICZiZmRfdW5kX3NlY3Rpb24gJiYgISBzeW1ib2xfdXNlZF9wIChzeW0pKSBcCi0JfHwgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF9hYnNfc2VjdGlvbiBcCi0JICAgICYmICEgU19JU19FWFRFUk5BTCAoc3ltKSkgXAotCXx8IHN0cmNtcCAoU19HRVRfTkFNRSAoc3ltKSwgIiRnbG9iYWwkIikgPT0gMCkgXAotICAgICAgcHVudCA9IDE7IFwKLSAgfQotI2VuZGlmCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgbWRfZW5kKCkgcGFfZW5kX29mX3NvdXJjZSAoKQotI2VuZGlmCi0KLSNkZWZpbmUgVENfRklYX1RZUEUgUFRSCi0jZGVmaW5lIFRDX0lOSVRfRklYX0RBVEEoRklYUCkgKChGSVhQKS0+dGNfZml4X2RhdGEgPSBOVUxMKQotCi0jZW5kaWYgLyogX1RDX0hQUEFfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pMzg2LmMgYi9nYXMvY29uZmlnL3RjLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxOTExMy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWkzODYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NzQgKzAsMCBAQAotLyogaTM4Ni5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIHRoZSBJbnRlbCA4MDM4NgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAgSW50ZWwgODAzODYgbWFjaGluZSBzcGVjaWZpYyBnYXMuCi0gIFdyaXR0ZW4gYnkgRWxpb3QgRHJlc3NlbGhhdXMgKGVsaW90QG1nbS5taXQuZWR1KS4KLSAgQnVncyAmIHN1Z2dlc3Rpb25zIGFyZSBjb21wbGV0ZWx5IHdlbGNvbWUuICBUaGlzIGlzIGZyZWUgc29mdHdhcmUuCi0gIFBsZWFzZSBoZWxwIHVzIG1ha2UgaXQgYmV0dGVyLgotICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9wY29kZS9pMzg2LmgiCi0KLSNpZm5kZWYgVENfUkVMT0MKLSNkZWZpbmUgVENfUkVMT0MoWCxZKSAoWSkKLSNlbmRpZgotCi0jaWZuZGVmIFJFR0lTVEVSX1dBUk5JTkdTCi0jZGVmaW5lIFJFR0lTVEVSX1dBUk5JTkdTIDEKLSNlbmRpZgotCi0jaWZuZGVmIElORkVSX0FERFJfUFJFRklYCi0jZGVmaW5lIElORkVSX0FERFJfUFJFRklYIDEKLSNlbmRpZgotCi0jaWZuZGVmIFNDQUxFMV9XSEVOX05PX0lOREVYCi0vKiBTcGVjaWZ5aW5nIGEgc2NhbGUgZmFjdG9yIGJlc2lkZXMgMSB3aGVuIHRoZXJlIGlzIG5vIGluZGV4IGlzCi0gICBmdXRpbGUuICBlZy4gYG1vdiAoJWVieCwyKSwlYWwnIGRvZXMgZXhhY3RseSB0aGUgc2FtZSBhcwotICAgYG1vdiAoJWVieCksJWFsJy4gIFRvIHNsYXZpc2hseSBmb2xsb3cgd2hhdCB0aGUgcHJvZ3JhbW1lcgotICAgc3BlY2lmaWVkLCBzZXQgU0NBTEUxX1dIRU5fTk9fSU5ERVggdG8gMC4gICovCi0jZGVmaW5lIFNDQUxFMV9XSEVOX05PX0lOREVYIDEKLSNlbmRpZgotCi0jZGVmaW5lIHRydWUgMQotI2RlZmluZSBmYWxzZSAwCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbW9kZV9mcm9tX2Rpc3Bfc2l6ZSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBpbnQgZml0c19pbl9zaWduZWRfYnl0ZSBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgaW50IGZpdHNfaW5fdW5zaWduZWRfYnl0ZSBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgaW50IGZpdHNfaW5fdW5zaWduZWRfd29yZCBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgaW50IGZpdHNfaW5fc2lnbmVkX3dvcmQgUEFSQU1TICgobG9uZykpOwotc3RhdGljIGludCBzbWFsbGVzdF9pbW1fdHlwZSBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgaW50IGFkZF9wcmVmaXggUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBzZXRfMTZiaXRfY29kZV9mbGFnIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc2V0XzE2Yml0X2djY19jb2RlX2ZsYWcgUEFSQU1TKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNldF9pbnRlbF9zeW50YXggUEFSQU1TICgoaW50KSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jCi0gIFBBUkFNUyAoKGludCwgaW50LCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLSNlbmRpZgotCi0vKiAnbWRfYXNzZW1ibGUgKCknIGdhdGhlcnMgdG9nZXRoZXIgaW5mb3JtYXRpb24gYW5kIHB1dHMgaXQgaW50byBhCi0gICBpMzg2X2luc24uICovCi0KLXN0cnVjdCBfaTM4Nl9pbnNuCi0gIHsKLSAgICAvKiBUTSBob2xkcyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBpbnNuIHdlcmUgY3VycmVudGx5IGFzc2VtYmxpbmcuICovCi0gICAgdGVtcGxhdGUgdG07Ci0KLSAgICAvKiBTVUZGSVggaG9sZHMgdGhlIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBpZiBnaXZlbi4KLSAgICAgICAoZS5nLiAnbCcgZm9yICdtb3ZsJykgICovCi0gICAgY2hhciBzdWZmaXg7Ci0KLSAgICAvKiBPcGVyYW5kcyBhcmUgY29kZWQgd2l0aCBPUEVSQU5EUywgVFlQRVMsIERJU1BTLCBJTU1TLCBhbmQgUkVHUy4gKi8KLQotICAgIC8qIE9QRVJBTkRTIGdpdmVzIHRoZSBudW1iZXIgb2YgZ2l2ZW4gb3BlcmFuZHMuICovCi0gICAgdW5zaWduZWQgaW50IG9wZXJhbmRzOwotCi0gICAgLyogUkVHX09QRVJBTkRTLCBESVNQX09QRVJBTkRTLCBNRU1fT1BFUkFORFMsIElNTV9PUEVSQU5EUyBnaXZlIHRoZSBudW1iZXIKLSAgICAgICBvZiBnaXZlbiByZWdpc3RlciwgZGlzcGxhY2VtZW50LCBtZW1vcnkgb3BlcmFuZHMgYW5kIGltbWVkaWF0ZQotICAgICAgIG9wZXJhbmRzLiAqLwotICAgIHVuc2lnbmVkIGludCByZWdfb3BlcmFuZHMsIGRpc3Bfb3BlcmFuZHMsIG1lbV9vcGVyYW5kcywgaW1tX29wZXJhbmRzOwotCi0gICAgLyogVFlQRVMgW2ldIGlzIHRoZSB0eXBlIChzZWUgYWJvdmUgI2RlZmluZXMpIHdoaWNoIHRlbGxzIHVzIGhvdyB0bwotICAgICAgIHNlYXJjaCB0aHJvdWdoIERJU1BTIFtpXSAmIElNTVMgW2ldICYgUkVHUyBbaV0gZm9yIHRoZSByZXF1aXJlZAotICAgICAgIG9wZXJhbmQuICAqLwotICAgIHVuc2lnbmVkIGludCB0eXBlc1tNQVhfT1BFUkFORFNdOwotCi0gICAgLyogRGlzcGxhY2VtZW50cyAoaWYgZ2l2ZW4pIGZvciBlYWNoIG9wZXJhbmQuICovCi0gICAgZXhwcmVzc2lvblMgKmRpc3BzW01BWF9PUEVSQU5EU107Ci0KLSAgICAvKiBSZWxvY2F0aW9uIHR5cGUgZm9yIG9wZXJhbmQgKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsIGRpc3BfcmVsb2NbTUFYX09QRVJBTkRTXTsKLSNlbHNlCi0gICAgaW50IGRpc3BfcmVsb2NbTUFYX09QRVJBTkRTXTsKLSNlbmRpZgotCi0gICAgLyogSW1tZWRpYXRlIG9wZXJhbmRzIChpZiBnaXZlbikgZm9yIGVhY2ggb3BlcmFuZC4gKi8KLSAgICBleHByZXNzaW9uUyAqaW1tc1tNQVhfT1BFUkFORFNdOwotCi0gICAgLyogUmVnaXN0ZXIgb3BlcmFuZHMgKGlmIGdpdmVuKSBmb3IgZWFjaCBvcGVyYW5kLiAqLwotICAgIGNvbnN0IHJlZ19lbnRyeSAqcmVnc1tNQVhfT1BFUkFORFNdOwotCi0gICAgLyogQkFTRV9SRUcsIElOREVYX1JFRywgYW5kIExPRzJfU0NBTEVfRkFDVE9SIGFyZSB1c2VkIHRvIGVuY29kZQotICAgICAgIHRoZSBiYXNlIGluZGV4IGJ5dGUgYmVsb3cuICAqLwotICAgIGNvbnN0IHJlZ19lbnRyeSAqYmFzZV9yZWc7Ci0gICAgY29uc3QgcmVnX2VudHJ5ICppbmRleF9yZWc7Ci0gICAgdW5zaWduZWQgaW50IGxvZzJfc2NhbGVfZmFjdG9yOwotCi0gICAgLyogU0VHIGdpdmVzIHRoZSBzZWdfZW50cmllcyBvZiB0aGlzIGluc24uICBUaGV5IGFyZSB6ZXJvIHVubGVzcwotICAgICAgIGV4cGxpY2l0IHNlZ21lbnQgb3ZlcnJpZGVzIGFyZSBnaXZlbi4gKi8KLSAgICBjb25zdCBzZWdfZW50cnkgKnNlZ1syXTsJLyogc2VnbWVudHMgZm9yIG1lbW9yeSBvcGVyYW5kcyAoaWYgZ2l2ZW4pICovCi0KLSAgICAvKiBQUkVGSVggaG9sZHMgYWxsIHRoZSBnaXZlbiBwcmVmaXggb3Bjb2RlcyAodXN1YWxseSBudWxsKS4KLSAgICAgICBQUkVGSVhFUyBpcyB0aGUgbnVtYmVyIG9mIHByZWZpeCBvcGNvZGVzLiAgKi8KLSAgICB1bnNpZ25lZCBpbnQgcHJlZml4ZXM7Ci0gICAgdW5zaWduZWQgY2hhciBwcmVmaXhbTUFYX1BSRUZJWEVTXTsKLQotICAgIC8qIFJNIGFuZCBTSUIgYXJlIHRoZSBtb2RybSBieXRlIGFuZCB0aGUgc2liIGJ5dGUgd2hlcmUgdGhlCi0gICAgICAgYWRkcmVzc2luZyBtb2RlcyBvZiB0aGlzIGluc24gYXJlIGVuY29kZWQuICAqLwotCi0gICAgbW9kcm1fYnl0ZSBybTsKLSAgICBzaWJfYnl0ZSBzaWI7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IF9pMzg2X2luc24gaTM4Nl9pbnNuOwotCi0vKiBMaXN0IG9mIGNoYXJzIGJlc2lkZXMgdGhvc2UgaW4gYXBwLmM6c3ltYm9sX2NoYXJzIHRoYXQgY2FuIHN0YXJ0IGFuCi0gICBvcGVyYW5kLiAgVXNlZCB0byBwcmV2ZW50IHRoZSBzY3J1YmJlciBlYXRpbmcgdml0YWwgd2hpdGUtc3BhY2UuICAqLwotI2lmZGVmIExFWF9BVAotY29uc3QgY2hhciBleHRyYV9zeW1ib2xfY2hhcnNbXSA9ICIqJS0oQCI7Ci0jZWxzZQotY29uc3QgY2hhciBleHRyYV9zeW1ib2xfY2hhcnNbXSA9ICIqJS0oIjsKLSNlbmRpZgotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotI2lmIGRlZmluZWQgKFRFX0kzODZBSVgpIHx8ICgoZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikpICYmICEgZGVmaW5lZCAoVEVfTElOVVgpKQotLyogUHV0dGluZyAnLycgaGVyZSBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHVzZSB0aGUgZGl2aWRlIG9wZXJhdG9yLgotICAgSG93ZXZlciwgd2UgbmVlZCBpdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNWUjQgc3lzdGVtcy4gICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjLyI7Ci0jZGVmaW5lIFBSRUZJWF9TRVBBUkFUT1IgJ1xcJwotI2Vsc2UKLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotI2RlZmluZSBQUkVGSVhfU0VQQVJBVE9SICcvJwotI2VuZGlmCi0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBzdGFydGVkIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yayBpZgotICAgJy8nIGlzbid0IG90aGVyd2lzZSBkZWZpbmVkLiAgKi8KLSNpZiBkZWZpbmVkIChURV9JMzg2QUlYKSB8fCAoKGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpKSAmJiAhIGRlZmluZWQgKFRFX0xJTlVYKSkKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIjsKLSNlbHNlCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIi8iOwotI2VuZGlmCi0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZkZkRHhYIjsKLQotLyogdGFibGVzIGZvciBsZXhpY2FsIGFuYWx5c2lzICovCi1zdGF0aWMgY2hhciBtbmVtb25pY19jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgcmVnaXN0ZXJfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIG9wZXJhbmRfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIGlkZW50aWZpZXJfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIGRpZ2l0X2NoYXJzWzI1Nl07Ci0KLS8qIGxleGljYWwgbWFjcm9zICovCi0jZGVmaW5lIGlzX21uZW1vbmljX2NoYXIoeCkgKG1uZW1vbmljX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfb3BlcmFuZF9jaGFyKHgpIChvcGVyYW5kX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfcmVnaXN0ZXJfY2hhcih4KSAocmVnaXN0ZXJfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19zcGFjZV9jaGFyKHgpICgoeCkgPT0gJyAnKQotI2RlZmluZSBpc19pZGVudGlmaWVyX2NoYXIoeCkgKGlkZW50aWZpZXJfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19kaWdpdF9jaGFyKHgpIChkaWdpdF9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0KLS8qIHB1dCBoZXJlIGFsbCBub24tZGlnaXQgbm9uLWxldHRlciBjaGFyY3RlcnMgdGhhdCBtYXkgb2NjdXIgaW4gYW4gb3BlcmFuZCAqLwotc3RhdGljIGNoYXIgb3BlcmFuZF9zcGVjaWFsX2NoYXJzW10gPSAiJSQtKygsKSouX34vPD58Jl4hOltAXSI7Ci0KLS8qIG1kX2Fzc2VtYmxlKCkgYWx3YXlzIGxlYXZlcyB0aGUgc3RyaW5ncyBpdCdzIHBhc3NlZCB1bmFsdGVyZWQuICBUbwotICAgZWZmZWN0IHRoaXMgd2UgbWFpbnRhaW4gYSBzdGFjayBvZiBzYXZlZCBjaGFyYWN0ZXJzIHRoYXQgd2UndmUgc21hc2hlZAotICAgd2l0aCAnXDAncyAoaW5kaWNhdGluZyBlbmQgb2Ygc3RyaW5ncyBmb3IgdmFyaW91cyBzdWItZmllbGRzIG9mIHRoZQotICAgYXNzZW1ibGVyIGluc3RydWN0aW9uKS4gKi8KLXN0YXRpYyBjaGFyIHNhdmVfc3RhY2tbMzJdOwotc3RhdGljIGNoYXIgKnNhdmVfc3RhY2tfcDsJLyogc3RhY2sgcG9pbnRlciAqLwotI2RlZmluZSBFTkRfU1RSSU5HX0FORF9TQVZFKHMpIFwKLQlkbyB7ICpzYXZlX3N0YWNrX3ArKyA9ICoocyk7ICoocykgPSAnXDAnOyB9IHdoaWxlICgwKQotI2RlZmluZSBSRVNUT1JFX0VORF9TVFJJTkcocykgXAotCWRvIHsgKihzKSA9ICotLXNhdmVfc3RhY2tfcDsgfSB3aGlsZSAoMCkKLQotLyogVGhlIGluc3RydWN0aW9uIHdlJ3JlIGFzc2VtYmxpbmcuICovCi1zdGF0aWMgaTM4Nl9pbnNuIGk7Ci0KLS8qIFBvc3NpYmxlIHRlbXBsYXRlcyBmb3IgY3VycmVudCBpbnNuLiAgKi8KLXN0YXRpYyBjb25zdCB0ZW1wbGF0ZXMgKmN1cnJlbnRfdGVtcGxhdGVzOwotCi0vKiBQZXIgaW5zdHJ1Y3Rpb24gZXhwcmVzc2lvblMgYnVmZmVyczogMiBkaXNwbGFjZW1lbnRzICYgMiBpbW1lZGlhdGUgbWF4LiAqLwotc3RhdGljIGV4cHJlc3Npb25TIGRpc3BfZXhwcmVzc2lvbnNbMl0sIGltX2V4cHJlc3Npb25zWzJdOwotCi1zdGF0aWMgaW50IHRoaXNfb3BlcmFuZDsJLyogY3VycmVudCBvcGVyYW5kIHdlIGFyZSB3b3JraW5nIG9uICovCi0KLXN0YXRpYyBpbnQgZmxhZ19kb19sb25nX2p1bXA7CS8qIEZJWE1FIHdoYXQgZG9lcyB0aGlzIGRvPyAqLwotCi1zdGF0aWMgaW50IGZsYWdfMTZiaXRfY29kZTsJLyogMSBpZiB3ZSdyZSB3cml0aW5nIDE2LWJpdCBjb2RlLCAwIGlmIDMyLWJpdCAqLwotCi1zdGF0aWMgaW50IGludGVsX3N5bnRheCA9IDA7CS8qIDEgZm9yIGludGVsIHN5bnRheCwgMCBpZiBhdHQgc3ludGF4ICovCi0KLXN0YXRpYyBpbnQgYWxsb3dfbmFrZWRfcmVnID0gMDsgIC8qIDEgaWYgcmVnaXN0ZXIgcHJlZml4ICUgbm90IHJlcXVpcmVkICovCi0KLXN0YXRpYyBjaGFyIHN0YWNrb3Bfc2l6ZSA9ICdcMCc7ICAvKiBVc2VkIGluIDE2IGJpdCBnY2MgbW9kZSB0byBhZGQgYW4gbAotCQkJCSAgICAgc3VmZml4IHRvIGNhbGwsIHJldCwgZW50ZXIsIGxlYXZlLCBwdXNoLAotCQkJCSAgICAgYW5kIHBvcCBpbnN0cnVjdGlvbnMuICAqLwotCi0vKiBJbnRlcmZhY2UgdG8gcmVsYXhfc2VnbWVudC4KLSAgIFRoZXJlIGFyZSAyIHJlbGF4IHN0YXRlcyBmb3IgMzg2IGp1bXAgaW5zbnM6IG9uZSBmb3IgY29uZGl0aW9uYWwgJgotICAgb25lIGZvciB1bmNvbmRpdGlvbmFsIGp1bXBzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZXNlIHR3byB0eXBlcyBvZgotICAganVtcHMgYWRkIGRpZmZlcmVudCBzaXplcyB0byBmcmFncyB3aGVuIHdlJ3JlIGZpZ3VyaW5nIG91dCB3aGF0Ci0gICBzb3J0IG9mIGp1bXAgdG8gY2hvb3NlIHRvIHJlYWNoIGEgZ2l2ZW4gbGFiZWwuICAqLwotCi0vKiB0eXBlcyAqLwotI2RlZmluZSBDT05EX0pVTVAgMQkJLyogY29uZGl0aW9uYWwganVtcCAqLwotI2RlZmluZSBVTkNPTkRfSlVNUCAyCQkvKiB1bmNvbmRpdGlvbmFsIGp1bXAgKi8KLS8qIHNpemVzICovCi0jZGVmaW5lIENPREUxNgkxCi0jZGVmaW5lIFNNQUxMCTAKLSNkZWZpbmUgU01BTEwxNiAoU01BTEx8Q09ERTE2KQotI2RlZmluZSBCSUcJMgotI2RlZmluZSBCSUcxNgkoQklHfENPREUxNikKLQotI2lmbmRlZiBJTkxJTkUKLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIEVOQ09ERV9SRUxBWF9TVEFURSh0eXBlLHNpemUpIFwKLSAgKChyZWxheF9zdWJzdGF0ZVQpKCh0eXBlPDwyKSB8IChzaXplKSkpCi0jZGVmaW5lIFNJWkVfRlJPTV9SRUxBWF9TVEFURShzKSBcCi0gICAgKCAoKChzKSAmIDB4MykgPT0gQklHID8gNCA6ICgoKHMpICYgMHgzKSA9PSBCSUcxNiA/IDIgOiAxKSkgKQotCi0vKiBUaGlzIHRhYmxlIGlzIHVzZWQgYnkgcmVsYXhfZnJhZyB0byBwcm9tb3RlIHNob3J0IGp1bXBzIHRvIGxvbmcKLSAgIG9uZXMgd2hlcmUgbmVjZXNzYXJ5LiAgU01BTEwgKHNob3J0KSBqdW1wcyBtYXkgYmUgcHJvbW90ZWQgdG8gQklHCi0gICAoMzIgYml0IGxvbmcpIG9uZXMsIGFuZCBTTUFMTDE2IGp1bXBzIHRvIEJJRzE2ICgxNiBiaXQgbG9uZykuICBXZQotICAgZG9uJ3QgYWxsb3cgYSBzaG9ydCBqdW1wIGluIGEgMzIgYml0IGNvZGUgc2VnbWVudCB0byBiZSBwcm9tb3RlZCB0bwotICAgYSAxNiBiaXQgb2Zmc2V0IGp1bXAgYmVjYXVzZSBpdCdzIHNsb3dlciAocmVxdWlyZXMgZGF0YSBzaXplCi0gICBwcmVmaXgpLCBhbmQgZG9lc24ndCB3b3JrLCB1bmxlc3MgdGhlIGRlc3RpbmF0aW9uIGlzIGluIHRoZSBib3R0b20KLSAgIDY0ayBvZiB0aGUgY29kZSBzZWdtZW50IChUaGUgdG9wIDE2IGJpdHMgb2YgZWlwIGFyZSB6ZXJvZWQpLiAgKi8KLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIC8qIFRoZSBmaWVsZHMgYXJlOgotICAgICAxKSBtb3N0IHBvc2l0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAgIDIpIG1vc3QgbmVnYXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKLSAgICAgMykgaG93IG1hbnkgYnl0ZXMgdGhpcyBtb2RlIHdpbGwgYWRkIHRvIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGZyYWcKLSAgICAgNCkgd2hpY2ggaW5kZXggaW50byB0aGUgdGFibGUgdG8gdHJ5IGlmIHdlIGNhbid0IGZpdCBpbnRvIHRoaXMgb25lLgotICAqLwotICB7MSwgMSwgMCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLSAgezEsIDEsIDAsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0KLSAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgQklHKX0sCi0gIHsxMjcgKyAxLCAtMTI4ICsgMSwgMCwgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIEJJRzE2KX0sCi0gIC8qIGR3b3JkIGNvbmRpdGlvbmFscyBhZGRzIDQgYnl0ZXMgdG8gZnJhZzoKLSAgICAgMSBleHRyYSBvcGNvZGUgYnl0ZSwgMyBleHRyYSBkaXNwbGFjZW1lbnQgYnl0ZXMuICAqLwotICB7MCwgMCwgNCwgMH0sCi0gIC8qIHdvcmQgY29uZGl0aW9uYWxzIGFkZCAyIGJ5dGVzIHRvIGZyYWc6Ci0gICAgIDEgZXh0cmEgb3Bjb2RlIGJ5dGUsIDEgZXh0cmEgZGlzcGxhY2VtZW50IGJ5dGUuICAqLwotICB7MCwgMCwgMiwgMH0sCi0KLSAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcpfSwKLSAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcxNil9LAotICAvKiBkd29yZCBqbXAgYWRkcyAzIGJ5dGVzIHRvIGZyYWc6Ci0gICAgIDAgZXh0cmEgb3Bjb2RlIGJ5dGVzLCAzIGV4dHJhIGRpc3BsYWNlbWVudCBieXRlcy4gICovCi0gIHswLCAwLCAzLCAwfSwKLSAgLyogd29yZCBqbXAgYWRkcyAxIGJ5dGUgdG8gZnJhZzoKLSAgICAgMCBleHRyYSBvcGNvZGUgYnl0ZXMsIDEgZXh0cmEgZGlzcGxhY2VtZW50IGJ5dGUuICAqLwotICB7MCwgMCwgMSwgMH0KLQotfTsKLQotCi12b2lkCi1pMzg2X2FsaWduX2NvZGUgKGZyYWdQLCBjb3VudCkKLSAgICAgZnJhZ1MgKmZyYWdQOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIC8qIFZhcmlvdXMgZWZmaWNpZW50IG5vLW9wIHBhdHRlcm5zIGZvciBhbGlnbmluZyBjb2RlIGxhYmVscy4gICovCi0gIC8qIE5vdGU6IERvbid0IHRyeSB0byBhc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBjb21tZW50cy4gKi8KLSAgLyogICAgICAgMEwgYW5kIDB3IGFyZSBub3QgbGVnYWwgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzFbXSA9Ci0gICAgezB4OTB9OwkJCQkJLyogbm9wCQkJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzJbXSA9Ci0gICAgezB4ODksMHhmNn07CQkJCS8qIG1vdmwgJWVzaSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8zW10gPQotICAgIHsweDhkLDB4NzYsMHgwMH07CQkJCS8qIGxlYWwgMCglZXNpKSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl80W10gPQotICAgIHsweDhkLDB4NzQsMHgyNiwweDAwfTsJCQkvKiBsZWFsIDAoJWVzaSwxKSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl81W10gPQotICAgIHsweDkwLAkJCQkJLyogbm9wCQkJKi8KLSAgICAgMHg4ZCwweDc0LDB4MjYsMHgwMH07CQkJLyogbGVhbCAwKCVlc2ksMSksJWVzaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfNltdID0KLSAgICB7MHg4ZCwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkJLyogbGVhbCAwTCglZXNpKSwlZXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl83W10gPQotICAgIHsweDhkLDB4YjQsMHgyNiwweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZXNpLDEpLCVlc2kgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzhbXSA9Ci0gICAgezB4OTAsCQkJCQkvKiBub3AJCQkqLwotICAgICAweDhkLDB4YjQsMHgyNiwweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZXNpLDEpLCVlc2kgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzlbXSA9Ci0gICAgezB4ODksMHhmNiwJCQkJCS8qIG1vdmwgJWVzaSwlZXNpCSovCi0gICAgIDB4OGQsMHhiYywweDI3LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkvKiBsZWFsIDBMKCVlZGksMSksJWVkaSAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMTBbXSA9Ci0gICAgezB4OGQsMHg3NiwweDAwLAkJCQkvKiBsZWFsIDAoJWVzaSksJWVzaQkqLwotICAgICAweDhkLDB4YmMsMHgyNywweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZWRpLDEpLCVlZGkgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzExW10gPQotICAgIHsweDhkLDB4NzQsMHgyNiwweDAwLAkJCS8qIGxlYWwgMCglZXNpLDEpLCVlc2kJKi8KLSAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xMltdID0KLSAgICB7MHg4ZCwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDAsCQkvKiBsZWFsIDBMKCVlc2kpLCVlc2kJKi8KLSAgICAgMHg4ZCwweGJmLDB4MDAsMHgwMCwweDAwLDB4MDB9OwkJLyogbGVhbCAwTCglZWRpKSwlZWRpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xM1tdID0KLSAgICB7MHg4ZCwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDAsCQkvKiBsZWFsIDBMKCVlc2kpLCVlc2kJKi8KLSAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xNFtdID0KLSAgICB7MHg4ZCwweGI0LDB4MjYsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogbGVhbCAwTCglZXNpLDEpLCVlc2kgKi8KLSAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xNVtdID0KLSAgICB7MHhlYiwweDBkLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwJLyogam1wIC4rMTU7IGxvdHNhIG5vcHMJKi8KLSAgICAgMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwfTsKLSAgc3RhdGljIGNvbnN0IGNoYXIgZjE2XzNbXSA9Ci0gICAgezB4OGQsMHg3NCwweDAwfTsJCQkJLyogbGVhIDAoJWVzaSksJWVzaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMTZfNFtdID0KLSAgICB7MHg4ZCwweGI0LDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVzaSksJXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl81W10gPQotICAgIHsweDkwLAkJCQkJLyogbm9wCQkJKi8KLSAgICAgMHg4ZCwweGI0LDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVzaSksJXNpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl82W10gPQotICAgIHsweDg5LDB4ZjYsCQkJCQkvKiBtb3YgJXNpLCVzaQkJKi8KLSAgICAgMHg4ZCwweGJkLDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVkaSksJWRpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl83W10gPQotICAgIHsweDhkLDB4NzQsMHgwMCwJCQkJLyogbGVhIDAoJXNpKSwlc2kJKi8KLSAgICAgMHg4ZCwweGJkLDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVkaSksJWRpCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl84W10gPQotICAgIHsweDhkLDB4YjQsMHgwMCwweDAwLAkJCS8qIGxlYSAwdyglc2kpLCVzaQkqLwotICAgICAweDhkLDB4YmQsMHgwMCwweDAwfTsJCQkvKiBsZWEgMHcoJWRpKSwlZGkJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGYzMl9wYXR0W10gPSB7Ci0gICAgZjMyXzEsIGYzMl8yLCBmMzJfMywgZjMyXzQsIGYzMl81LCBmMzJfNiwgZjMyXzcsIGYzMl84LAotICAgIGYzMl85LCBmMzJfMTAsIGYzMl8xMSwgZjMyXzEyLCBmMzJfMTMsIGYzMl8xNCwgZjMyXzE1Ci0gIH07Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmMTZfcGF0dFtdID0gewotICAgIGYzMl8xLCBmMzJfMiwgZjE2XzMsIGYxNl80LCBmMTZfNSwgZjE2XzYsIGYxNl83LCBmMTZfOCwKLSAgICBmMzJfMTUsIGYzMl8xNSwgZjMyXzE1LCBmMzJfMTUsIGYzMl8xNSwgZjMyXzE1LCBmMzJfMTUKLSAgfTsKLQotICBpZiAoY291bnQgPiAwICYmIGNvdW50IDw9IDE1KQotICAgIHsKLSAgICAgIGlmIChmbGFnXzE2Yml0X2NvZGUpCi0JewotCSAgbWVtY3B5KGZyYWdQLT5mcl9saXRlcmFsICsgZnJhZ1AtPmZyX2ZpeCwKLQkJIGYxNl9wYXR0W2NvdW50IC0gMV0sIGNvdW50KTsKLQkgIGlmIChjb3VudCA+IDgpIC8qIGFkanVzdCBqdW1wIG9mZnNldCAqLwotCSAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtmcmFnUC0+ZnJfZml4ICsgMV0gPSBjb3VudCAtIDI7Ci0JfQotICAgICAgZWxzZQotCW1lbWNweShmcmFnUC0+ZnJfbGl0ZXJhbCArIGZyYWdQLT5mcl9maXgsCi0JICAgICAgIGYzMl9wYXR0W2NvdW50IC0gMV0sIGNvdW50KTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSBjb3VudDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICpvdXRwdXRfaW52YWxpZCBQQVJBTVMgKChpbnQgYykpOwotc3RhdGljIGludCBpMzg2X29wZXJhbmQgUEFSQU1TICgoY2hhciAqb3BlcmFuZF9zdHJpbmcpKTsKLXN0YXRpYyBpbnQgaTM4Nl9pbnRlbF9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKm9wZXJhbmRfc3RyaW5nLCBpbnQgZ290X2FfZmxvYXQpKTsKLXN0YXRpYyBjb25zdCByZWdfZW50cnkgKnBhcnNlX3JlZ2lzdGVyIFBBUkFNUyAoKGNoYXIgKnJlZ19zdHJpbmcsCi0JCQkJCQljaGFyICoqZW5kX29wKSk7Ci0KLSNpZm5kZWYgSTM4NkNPRkYKLXN0YXRpYyB2b2lkIHNfYnNzIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLXN5bWJvbFMgKkdPVF9zeW1ib2w7CQkvKiBQcmUtZGVmaW5lZCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiAqLwotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotbW9kZV9mcm9tX2Rpc3Bfc2l6ZSAodCkKLSAgICAgdW5zaWduZWQgaW50IHQ7Ci17Ci0gIHJldHVybiAodCAmIERpc3A4KSA/IDEgOiAodCAmIChEaXNwMTZ8RGlzcDMyKSkgPyAyIDogMDsKLX0KLQotc3RhdGljIElOTElORSBpbnQKLWZpdHNfaW5fc2lnbmVkX2J5dGUgKG51bSkKLSAgICAgbG9uZyBudW07Ci17Ci0gIHJldHVybiAobnVtID49IC0xMjgpICYmIChudW0gPD0gMTI3KTsKLX0JCQkJLyogZml0c19pbl9zaWduZWRfYnl0ZSgpICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1maXRzX2luX3Vuc2lnbmVkX2J5dGUgKG51bSkKLSAgICAgbG9uZyBudW07Ci17Ci0gIHJldHVybiAobnVtICYgMHhmZikgPT0gbnVtOwotfQkJCQkvKiBmaXRzX2luX3Vuc2lnbmVkX2J5dGUoKSAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotZml0c19pbl91bnNpZ25lZF93b3JkIChudW0pCi0gICAgIGxvbmcgbnVtOwotewotICByZXR1cm4gKG51bSAmIDB4ZmZmZikgPT0gbnVtOwotfQkJCQkvKiBmaXRzX2luX3Vuc2lnbmVkX3dvcmQoKSAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotZml0c19pbl9zaWduZWRfd29yZCAobnVtKQotICAgICBsb25nIG51bTsKLXsKLSAgcmV0dXJuICgtMzI3NjggPD0gbnVtKSAmJiAobnVtIDw9IDMyNzY3KTsKLX0JCQkJLyogZml0c19pbl9zaWduZWRfd29yZCgpICovCi0KLXN0YXRpYyBpbnQKLXNtYWxsZXN0X2ltbV90eXBlIChudW0pCi0gICAgIGxvbmcgbnVtOwotewotI2lmIDAKLSAgLyogVGhpcyBjb2RlIGlzIGRpc2FibGVkIGJlY2F1c2UgYWxsIHRoZSBJbW0xIGZvcm1zIGluIHRoZSBvcGNvZGUgdGFibGUKLSAgICAgYXJlIHNsb3dlciBvbiB0aGUgaTQ4NiwgYW5kIHRoZXkncmUgdGhlIHZlcnNpb25zIHdpdGggdGhlIGltcGxpY2l0bHkKLSAgICAgc3BlY2lmaWVkIHNpbmdsZS1wb3NpdGlvbiBkaXNwbGFjZW1lbnQsIHdoaWNoIGhhcyBhbm90aGVyIHN5bnRheCBpZgotICAgICB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIHRoYXQgZm9ybS4gIElmIHlvdSByZWFsbHkgcHJlZmVyIHRvIGhhdmUgdGhlCi0gICAgIG9uZS1ieXRlLXNob3J0ZXIgSW1tMSBmb3JtIGRlc3BpdGUgdGhlc2UgcHJvYmxlbXMsIHJlLWVuYWJsZSB0aGlzCi0gICAgIGNvZGUuICAqLwotICBpZiAobnVtID09IDEpCi0gICAgcmV0dXJuIEltbTEgfCBJbW04IHwgSW1tOFMgfCBJbW0xNiB8IEltbTMyOwotI2VuZGlmCi0gIHJldHVybiAoZml0c19pbl9zaWduZWRfYnl0ZSAobnVtKQotCSAgPyAoSW1tOFMgfCBJbW04IHwgSW1tMTYgfCBJbW0zMikKLQkgIDogZml0c19pbl91bnNpZ25lZF9ieXRlIChudW0pCi0JICA/IChJbW04IHwgSW1tMTYgfCBJbW0zMikKLQkgIDogKGZpdHNfaW5fc2lnbmVkX3dvcmQgKG51bSkgfHwgZml0c19pbl91bnNpZ25lZF93b3JkIChudW0pKQotCSAgPyAoSW1tMTYgfCBJbW0zMikKLQkgIDogKEltbTMyKSk7Ci19CQkJCS8qIHNtYWxsZXN0X2ltbV90eXBlKCkgKi8KLQotLyogUmV0dXJucyAwIGlmIGF0dGVtcHRpbmcgdG8gYWRkIGEgcHJlZml4IHdoZXJlIG9uZSBmcm9tIHRoZSBzYW1lCi0gICBjbGFzcyBhbHJlYWR5IGV4aXN0cywgMSBpZiBub24gcmVwL3JlcG5lIGFkZGVkLCAyIGlmIHJlcC9yZXBuZQotICAgYWRkZWQuICAqLwotc3RhdGljIGludAotYWRkX3ByZWZpeCAocHJlZml4KQotICAgICB1bnNpZ25lZCBpbnQgcHJlZml4OwotewotICBpbnQgcmV0ID0gMTsKLSAgaW50IHE7Ci0KLSAgc3dpdGNoIChwcmVmaXgpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgQ1NfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIERTX1BSRUZJWF9PUENPREU6Ci0gICAgY2FzZSBFU19QUkVGSVhfT1BDT0RFOgotICAgIGNhc2UgRlNfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIEdTX1BSRUZJWF9PUENPREU6Ci0gICAgY2FzZSBTU19QUkVGSVhfT1BDT0RFOgotICAgICAgcSA9IFNFR19QUkVGSVg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVQTkVfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIFJFUEVfUFJFRklYX09QQ09ERToKLSAgICAgIHJldCA9IDI7Ci0gICAgICAvKiBmYWxsIHRocnUgKi8KLSAgICBjYXNlIExPQ0tfUFJFRklYX09QQ09ERToKLSAgICAgIHEgPSBMT0NLUkVQX1BSRUZJWDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGV0FJVF9PUENPREU6Ci0gICAgICBxID0gV0FJVF9QUkVGSVg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUREUl9QUkVGSVhfT1BDT0RFOgotICAgICAgcSA9IEFERFJfUFJFRklYOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERBVEFfUFJFRklYX09QQ09ERToKLSAgICAgIHEgPSBEQVRBX1BSRUZJWDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoaS5wcmVmaXhbcV0pCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzYW1lIHR5cGUgb2YgcHJlZml4IHVzZWQgdHdpY2UiKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaS5wcmVmaXhlcyArPSAxOwotICBpLnByZWZpeFtxXSA9IHByZWZpeDsKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQKLXNldF8xNmJpdF9jb2RlX2ZsYWcgKG5ld18xNmJpdF9jb2RlX2ZsYWcpCi0gICAgIGludCBuZXdfMTZiaXRfY29kZV9mbGFnOwotewotICBmbGFnXzE2Yml0X2NvZGUgPSBuZXdfMTZiaXRfY29kZV9mbGFnOwotICBzdGFja29wX3NpemUgPSAnXDAnOwotfQotCi1zdGF0aWMgdm9pZAotc2V0XzE2Yml0X2djY19jb2RlX2ZsYWcgKG5ld18xNmJpdF9jb2RlX2ZsYWcpCi0gICAgIGludCBuZXdfMTZiaXRfY29kZV9mbGFnOwotewotICBmbGFnXzE2Yml0X2NvZGUgPSBuZXdfMTZiaXRfY29kZV9mbGFnOwotICBzdGFja29wX3NpemUgPSBuZXdfMTZiaXRfY29kZV9mbGFnID8gJ2wnIDogJ1wwJzsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9pbnRlbF9zeW50YXggKHN5bnRheF9mbGFnKQotICAgICBpbnQgc3ludGF4X2ZsYWc7Ci17Ci0gIC8qIEZpbmQgb3V0IGlmIHJlZ2lzdGVyIHByZWZpeGluZyBpcyBzcGVjaWZpZWQuICAqLwotICBpbnQgYXNrX25ha2VkX3JlZyA9IDA7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgY2hhciAqc3RyaW5nID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50IGUgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgaWYgKHN0cmNtcChzdHJpbmcsICJwcmVmaXgiKSA9PSAwKQotCWFza19uYWtlZF9yZWcgPSAxOwotICAgICAgZWxzZSBpZiAoc3RyY21wKHN0cmluZywgIm5vcHJlZml4IikgPT0gMCkKLQlhc2tfbmFrZWRfcmVnID0gLTE7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJCYWQgYXJndW1lbnQgdG8gc3ludGF4IGRpcmVjdGl2ZS4iKSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gZTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaW50ZWxfc3ludGF4ID0gc3ludGF4X2ZsYWc7Ci0KLSAgaWYgKGFza19uYWtlZF9yZWcgPT0gMCkKLSAgICB7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgYWxsb3dfbmFrZWRfcmVnID0gKGludGVsX3N5bnRheAotCQkJICYmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKHN0ZG91dHB1dCkgIT0gJ1wwJykpOwotI2Vsc2UKLSAgICAgIGFsbG93X25ha2VkX3JlZyA9IDA7IC8qIGNvbnNlcnZhdGl2ZSBkZWZhdWx0ICovCi0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICBhbGxvd19uYWtlZF9yZWcgPSAoYXNrX25ha2VkX3JlZyA8IDApOwotfQotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotI2lmbmRlZiBJMzg2Q09GRgotICB7ImJzcyIsIHNfYnNzLCAwfSwKLSNlbmRpZgotI2lmICFkZWZpbmVkKE9CSl9BT1VUKSAmJiAhZGVmaW5lZChVU0VfQUxJR05fUFRXTykKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDB9LAotI2Vsc2UKLSAgeyJhbGlnbiIsIHNfYWxpZ25fcHR3bywgMH0sCi0jZW5kaWYKLSAgeyJmZmxvYXQiLCBmbG9hdF9jb25zLCAnZid9LAotICB7ImRmbG9hdCIsIGZsb2F0X2NvbnMsICdkJ30sCi0gIHsidGZsb2F0IiwgZmxvYXRfY29ucywgJ3gnfSwKLSAgeyJ2YWx1ZSIsIGNvbnMsIDJ9LAotICB7Im5vb3B0Iiwgc19pZ25vcmUsIDB9LAotICB7Im9wdGltIiwgc19pZ25vcmUsIDB9LAotICB7ImNvZGUxNmdjYyIsIHNldF8xNmJpdF9nY2NfY29kZV9mbGFnLCAxfSwKLSAgeyJjb2RlMTYiLCBzZXRfMTZiaXRfY29kZV9mbGFnLCAxfSwKLSAgeyJjb2RlMzIiLCBzZXRfMTZiaXRfY29kZV9mbGFnLCAwfSwKLSAgeyJpbnRlbF9zeW50YXgiLCBzZXRfaW50ZWxfc3ludGF4LCAxfSwKLSAgeyJhdHRfc3ludGF4Iiwgc2V0X2ludGVsX3N5bnRheCwgMH0sCi0gIHswLCAwLCAwfQotfTsKLQotLyogZm9yIGludGVyZmFjZSB3aXRoIGV4cHJlc3Npb24gKCkgKi8KLWV4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7Ci0KLS8qIGhhc2ggdGFibGUgZm9yIGluc3RydWN0aW9uIG1uZW1vbmljIGxvb2t1cCAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7Ci0vKiBoYXNoIHRhYmxlIGZvciByZWdpc3RlciBsb29rdXAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpyZWdfaGFzaDsKLQwKLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqaGFzaF9lcnI7Ci0KLSAgLyogaW5pdGlhbGl6ZSBvcF9oYXNoIGhhc2ggdGFibGUgKi8KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIHsKLSAgICByZWdpc3RlciBjb25zdCB0ZW1wbGF0ZSAqb3B0YWI7Ci0gICAgcmVnaXN0ZXIgdGVtcGxhdGVzICpjb3JlX29wdGFiOwotCi0gICAgb3B0YWIgPSBpMzg2X29wdGFiOwkJLyogc2V0dXAgZm9yIGxvb3AgKi8KLSAgICBjb3JlX29wdGFiID0gKHRlbXBsYXRlcyAqKSB4bWFsbG9jIChzaXplb2YgKHRlbXBsYXRlcykpOwotICAgIGNvcmVfb3B0YWItPnN0YXJ0ID0gb3B0YWI7Ci0KLSAgICB3aGlsZSAoMSkKLSAgICAgIHsKLQkrK29wdGFiOwotCWlmIChvcHRhYi0+bmFtZSA9PSBOVUxMCi0JICAgIHx8IHN0cmNtcCAob3B0YWItPm5hbWUsIChvcHRhYiAtIDEpLT5uYW1lKSAhPSAwKQotCSAgewotCSAgICAvKiBkaWZmZXJlbnQgbmFtZSAtLT4gc2hpcCBvdXQgY3VycmVudCB0ZW1wbGF0ZSBsaXN0OwotCSAgICAgICBhZGQgdG8gaGFzaCB0YWJsZTsgJiBiZWdpbiBhbmV3ICovCi0JICAgIGNvcmVfb3B0YWItPmVuZCA9IG9wdGFiOwotCSAgICBoYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLAotCQkJCSAgICAob3B0YWIgLSAxKS0+bmFtZSwKLQkJCQkgICAgKFBUUikgY29yZV9vcHRhYik7Ci0JICAgIGlmIChoYXNoX2VycikKLQkgICAgICB7Ci0JICAgICAgaGFzaF9lcnJvcjoKLQkJYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiAgQ2FuJ3QgaGFzaCAlczogJXMiKSwKLQkJCSAgKG9wdGFiIC0gMSktPm5hbWUsCi0JCQkgIGhhc2hfZXJyKTsKLQkgICAgICB9Ci0JICAgIGlmIChvcHRhYi0+bmFtZSA9PSBOVUxMKQotCSAgICAgIGJyZWFrOwotCSAgICBjb3JlX29wdGFiID0gKHRlbXBsYXRlcyAqKSB4bWFsbG9jIChzaXplb2YgKHRlbXBsYXRlcykpOwotCSAgICBjb3JlX29wdGFiLT5zdGFydCA9IG9wdGFiOwotCSAgfQotICAgICAgfQotICB9Ci0KLSAgLyogaW5pdGlhbGl6ZSByZWdfaGFzaCBoYXNoIHRhYmxlICovCi0gIHJlZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHsKLSAgICByZWdpc3RlciBjb25zdCByZWdfZW50cnkgKnJlZ3RhYjsKLQotICAgIGZvciAocmVndGFiID0gaTM4Nl9yZWd0YWI7Ci0JIHJlZ3RhYiA8IGkzODZfcmVndGFiICsgc2l6ZW9mIChpMzg2X3JlZ3RhYikgLyBzaXplb2YgKGkzODZfcmVndGFiWzBdKTsKLQkgcmVndGFiKyspCi0gICAgICB7Ci0JaGFzaF9lcnIgPSBoYXNoX2luc2VydCAocmVnX2hhc2gsIHJlZ3RhYi0+cmVnX25hbWUsIChQVFIpIHJlZ3RhYik7Ci0JaWYgKGhhc2hfZXJyKQotCSAgZ290byBoYXNoX2Vycm9yOwotICAgICAgfQotICB9Ci0KLSAgLyogZmlsbCBpbiBsZXhpY2FsIHRhYmxlczogIG1uZW1vbmljX2NoYXJzLCBvcGVyYW5kX2NoYXJzLiAgKi8KLSAgewotICAgIHJlZ2lzdGVyIGludCBjOwotICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0KLSAgICBmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspCi0gICAgICB7Ci0JaWYgKGlzZGlnaXQgKGMpKQotCSAgewotCSAgICBkaWdpdF9jaGFyc1tjXSA9IGM7Ci0JICAgIG1uZW1vbmljX2NoYXJzW2NdID0gYzsKLQkgICAgcmVnaXN0ZXJfY2hhcnNbY10gPSBjOwotCSAgICBvcGVyYW5kX2NoYXJzW2NdID0gYzsKLQkgIH0KLQllbHNlIGlmIChpc2xvd2VyIChjKSkKLQkgIHsKLQkgICAgbW5lbW9uaWNfY2hhcnNbY10gPSBjOwotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IGM7Ci0JICAgIG9wZXJhbmRfY2hhcnNbY10gPSBjOwotCSAgfQotCWVsc2UgaWYgKGlzdXBwZXIgKGMpKQotCSAgewotCSAgICBtbmVtb25pY19jaGFyc1tjXSA9IHRvbG93ZXIgKGMpOwotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IG1uZW1vbmljX2NoYXJzW2NdOwotCSAgICBvcGVyYW5kX2NoYXJzW2NdID0gYzsKLQkgIH0KLQotCWlmIChpc2FscGhhIChjKSB8fCBpc2RpZ2l0IChjKSkKLQkgIGlkZW50aWZpZXJfY2hhcnNbY10gPSBjOwotCWVsc2UgaWYgKGMgPj0gMTI4KQotCSAgewotCSAgICBpZGVudGlmaWVyX2NoYXJzW2NdID0gYzsKLQkgICAgb3BlcmFuZF9jaGFyc1tjXSA9IGM7Ci0JICB9Ci0gICAgICB9Ci0KLSNpZmRlZiBMRVhfQVQKLSAgICBpZGVudGlmaWVyX2NoYXJzWydAJ10gPSAnQCc7Ci0jZW5kaWYKLSAgICBkaWdpdF9jaGFyc1snLSddID0gJy0nOwotICAgIGlkZW50aWZpZXJfY2hhcnNbJ18nXSA9ICdfJzsKLSAgICBpZGVudGlmaWVyX2NoYXJzWycuJ10gPSAnLic7Ci0KLSAgICBmb3IgKHAgPSBvcGVyYW5kX3NwZWNpYWxfY2hhcnM7ICpwICE9ICdcMCc7IHArKykKLSAgICAgIG9wZXJhbmRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpICpwXSA9ICpwOwotICB9Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHRleHRfc2VjdGlvbiwgMik7Ci0gICAgICByZWNvcmRfYWxpZ25tZW50IChkYXRhX3NlY3Rpb24sIDIpOwotICAgICAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIDIpOwotICAgIH0KLSNlbmRpZgotfQotCi12b2lkCi1pMzg2X3ByaW50X3N0YXRpc3RpY3MgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGhhc2hfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSwgImkzODYgb3Bjb2RlIiwgb3BfaGFzaCk7Ci0gIGhhc2hfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSwgImkzODYgcmVnaXN0ZXIiLCByZWdfaGFzaCk7Ci19Ci0MCi0KLSNpZmRlZiBERUJVRzM4NgotCi0vKiBkZWJ1Z2dpbmcgcm91dGluZXMgZm9yIG1kX2Fzc2VtYmxlICovCi1zdGF0aWMgdm9pZCBwaSBQQVJBTVMgKChjaGFyICosIGkzODZfaW5zbiAqKSk7Ci1zdGF0aWMgdm9pZCBwdGUgUEFSQU1TICgodGVtcGxhdGUgKikpOwotc3RhdGljIHZvaWQgcHQgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBwZSBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCBwcyBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotc3RhdGljIHZvaWQKLXBpIChsaW5lLCB4KQotICAgICBjaGFyICpsaW5lOwotICAgICBpMzg2X2luc24gKng7Ci17Ci0gIHJlZ2lzdGVyIHRlbXBsYXRlICpwOwotICBpbnQgaTsKLQotICBmcHJpbnRmIChzdGRvdXQsICIlczogdGVtcGxhdGUgIiwgbGluZSk7Ci0gIHB0ZSAoJngtPnRtKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiICBtb2RybTogIG1vZGUgJXggIHJlZyAleCAgcmVnL21lbSAleCIsCi0JICAgeC0+cm0ubW9kZSwgeC0+cm0ucmVnLCB4LT5ybS5yZWdtZW0pOwotICBmcHJpbnRmIChzdGRvdXQsICIgYmFzZSAleCAgaW5kZXggJXggIHNjYWxlICV4XG4iLAotCSAgIHgtPmJpLmJhc2UsIHgtPmJpLmluZGV4LCB4LT5iaS5zY2FsZSk7Ci0gIGZvciAoaSA9IDA7IGkgPCB4LT5vcGVyYW5kczsgaSsrKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIiAgICAjJWQ6ICAiLCBpICsgMSk7Ci0gICAgICBwdCAoeC0+dHlwZXNbaV0pOwotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKLSAgICAgIGlmICh4LT50eXBlc1tpXQotCSAgJiAoUmVnIHwgU1JlZzIgfCBTUmVnMyB8IENvbnRyb2wgfCBEZWJ1ZyB8IFRlc3QgfCBSZWdNTVggfCBSZWdYTU0pKQotCWZwcmludGYgKHN0ZG91dCwgIiVzXG4iLCB4LT5yZWdzW2ldLT5yZWdfbmFtZSk7Ci0gICAgICBpZiAoeC0+dHlwZXNbaV0gJiBJbW0pCi0JcGUgKHgtPmltbXNbaV0pOwotICAgICAgaWYgKHgtPnR5cGVzW2ldICYgRGlzcCkKLQlwZSAoeC0+ZGlzcHNbaV0pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXB0ZSAodCkKLSAgICAgdGVtcGxhdGUgKnQ7Ci17Ci0gIGludCBpOwotICBmcHJpbnRmIChzdGRvdXQsICIgJWQgb3BlcmFuZHMgIiwgdC0+b3BlcmFuZHMpOwotICBmcHJpbnRmIChzdGRvdXQsICJvcGNvZGUgJXggIiwKLQkgICB0LT5iYXNlX29wY29kZSk7Ci0gIGlmICh0LT5leHRlbnNpb25fb3Bjb2RlICE9IE5vbmUpCi0gICAgZnByaW50ZiAoc3Rkb3V0LCAiZXh0ICV4ICIsIHQtPmV4dGVuc2lvbl9vcGNvZGUpOwotICBpZiAodC0+b3Bjb2RlX21vZGlmaWVyICYgRCkKLSAgICBmcHJpbnRmIChzdGRvdXQsICJEIik7Ci0gIGlmICh0LT5vcGNvZGVfbW9kaWZpZXIgJiBXKQotICAgIGZwcmludGYgKHN0ZG91dCwgIlciKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKLSAgZm9yIChpID0gMDsgaSA8IHQtPm9wZXJhbmRzOyBpKyspCi0gICAgewotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiICAgICMlZCB0eXBlICIsIGkgKyAxKTsKLSAgICAgIHB0ICh0LT5vcGVyYW5kX3R5cGVzW2ldKTsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcGUgKGUpCi0gICAgIGV4cHJlc3Npb25TICplOwotewotICBmcHJpbnRmIChzdGRvdXQsICIgICAgb3BlcmF0aW9uICAgICAlZFxuIiwgZS0+WF9vcCk7Ci0gIGZwcmludGYgKHN0ZG91dCwgIiAgICBhZGRfbnVtYmVyICAgICVsZCAoJWx4KVxuIiwKLQkgICAobG9uZykgZS0+WF9hZGRfbnVtYmVyLCAobG9uZykgZS0+WF9hZGRfbnVtYmVyKTsKLSAgaWYgKGUtPlhfYWRkX3N5bWJvbCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICIgICAgYWRkX3N5bWJvbCAgICAiKTsKLSAgICAgIHBzIChlLT5YX2FkZF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKLSAgICB9Ci0gIGlmIChlLT5YX29wX3N5bWJvbCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICIgICAgb3Bfc3ltYm9sICAgICIpOwotICAgICAgcHMgKGUtPlhfb3Bfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHMgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGZwcmludGYgKHN0ZG91dCwgIiVzIHR5cGUgJXMlcyIsCi0JICAgU19HRVRfTkFNRSAocyksCi0JICAgU19JU19FWFRFUk5BTCAocykgPyAiRVhURVJOQUwgIiA6ICIiLAotCSAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAocykpKTsKLX0KLQotc3RydWN0IHR5cGVfbmFtZQotICB7Ci0gICAgdW5zaWduZWQgaW50IG1hc2s7Ci0gICAgY2hhciAqdG5hbWU7Ci0gIH0KLQotdHlwZV9uYW1lc1tdID0KLXsKLSAgeyBSZWc4LCAicjgiIH0sCi0gIHsgUmVnMTYsICJyMTYiIH0sCi0gIHsgUmVnMzIsICJyMzIiIH0sCi0gIHsgSW1tOCwgImk4IiB9LAotICB7IEltbThTLCAiaThzIiB9LAotICB7IEltbTE2LCAiaTE2IiB9LAotICB7IEltbTMyLCAiaTMyIiB9LAotICB7IEltbTEsICJpMSIgfSwKLSAgeyBCYXNlSW5kZXgsICJCYXNlSW5kZXgiIH0sCi0gIHsgRGlzcDgsICJkOCIgfSwKLSAgeyBEaXNwMTYsICJkMTYiIH0sCi0gIHsgRGlzcDMyLCAiZDMyIiB9LAotICB7IEluT3V0UG9ydFJlZywgIkluT3V0UG9ydFJlZyIgfSwKLSAgeyBTaGlmdENvdW50LCAiU2hpZnRDb3VudCIgfSwKLSAgeyBDb250cm9sLCAiY29udHJvbCByZWciIH0sCi0gIHsgVGVzdCwgInRlc3QgcmVnIiB9LAotICB7IERlYnVnLCAiZGVidWcgcmVnIiB9LAotICB7IEZsb2F0UmVnLCAiRlJlZyIgfSwKLSAgeyBGbG9hdEFjYywgIkZBY2MiIH0sCi0gIHsgU1JlZzIsICJTUmVnMiIgfSwKLSAgeyBTUmVnMywgIlNSZWczIiB9LAotICB7IEFjYywgIkFjYyIgfSwKLSAgeyBKdW1wQWJzb2x1dGUsICJKdW1wIEFic29sdXRlIiB9LAotICB7IFJlZ01NWCwgInJNTVgiIH0sCi0gIHsgUmVnWE1NLCAiclhNTSIgfSwKLSAgeyBFc1NlZywgImVzIiB9LAotICB7IDAsICIiIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1wdCAodCkKLSAgICAgdW5zaWduZWQgaW50IHQ7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCB0eXBlX25hbWUgKnR5OwotCi0gIGlmICh0ID09IFVua25vd24pCi0gICAgewotICAgICAgZnByaW50ZiAoc3Rkb3V0LCBfKCJVbmtub3duIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAodHkgPSB0eXBlX25hbWVzOyB0eS0+bWFzazsgdHkrKykKLQlpZiAodCAmIHR5LT5tYXNrKQotCSAgZnByaW50ZiAoc3Rkb3V0LCAiJXMsICIsIHR5LT50bmFtZSk7Ci0gICAgfQotICBmZmx1c2ggKHN0ZG91dCk7Ci19Ci0KLSNlbmRpZiAvKiBERUJVRzM4NiAqLwotDAotaW50Ci10Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gICAgIHN0cnVjdCBmaXggKmZpeHA7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotI2Vsc2UKLSAgLyogRm9yIENPRkYgKi8KLSAgcmV0dXJuIGZpeHAtPmZ4X3JfdHlwZT09NzsKLSNlbmRpZgotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYwotICBQQVJBTVMgKChpbnQsIGludCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLXJlbG9jIChzaXplLCBwY3JlbCwgb3RoZXIpCi0gICAgIGludCBzaXplOwotICAgICBpbnQgcGNyZWw7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBvdGhlcjsKLXsKLSAgaWYgKG90aGVyICE9IE5PX1JFTE9DKSByZXR1cm4gb3RoZXI7Ci0KLSAgaWYgKHBjcmVsKQotICAgIHsKLSAgICAgIHN3aXRjaCAoc2l6ZSkKLQl7Ci0JY2FzZSAxOiByZXR1cm4gQkZEX1JFTE9DXzhfUENSRUw7Ci0JY2FzZSAyOiByZXR1cm4gQkZEX1JFTE9DXzE2X1BDUkVMOwotCWNhc2UgNDogcmV0dXJuIEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQl9Ci0gICAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIiksIHNpemUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAoc2l6ZSkKLQl7Ci0JY2FzZSAxOiByZXR1cm4gQkZEX1JFTE9DXzg7Ci0JY2FzZSAyOiByZXR1cm4gQkZEX1JFTE9DXzE2OwotCWNhc2UgNDogcmV0dXJuIEJGRF9SRUxPQ18zMjsKLQl9Ci0gICAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIiksIHNpemUpOwotICAgIH0KLQotICByZXR1cm4gQkZEX1JFTE9DX05PTkU7Ci19Ci0KLS8qCi0gKiBIZXJlIHdlIGRlY2lkZSB3aGljaCBmaXh1cHMgY2FuIGJlIGFkanVzdGVkIHRvIG1ha2UgdGhlbSByZWxhdGl2ZSB0bwotICogdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiBpbnN0ZWFkIG9mIHRoZSBzeW1ib2wuICBCYXNpY2FsbHkgd2UgbmVlZAotICogdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMgYXJlIGRvbmUgY29ycmVjdGx5LCBzbyBpbgotICogc29tZSBjYXNlcyB3ZSBmb3JjZSB0aGUgb3JpZ2luYWwgc3ltYm9sIHRvIGJlIHVzZWQuCi0gKi8KLWludAotdGNfaTM4Nl9maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChURV9QRSkKLSAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMsIG9yIGVsc2UgZHluYW1pYwotICAgICBsaW5raW5nIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5LiAgKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotICAvKiBhZGp1c3RfcmVsb2Nfc3ltcyBkb2Vzbid0IGtub3cgYWJvdXQgdGhlIEdPVCAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zODZfR09UT0ZGCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzM4Nl9QTFQzMgotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zODZfR09UMzIKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUlZBCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0jZWxzZQotI2RlZmluZSByZWxvYyhTSVpFLFBDUkVMLE9USEVSKQkwCi0jZGVmaW5lIEJGRF9SRUxPQ18xNgkJMAotI2RlZmluZSBCRkRfUkVMT0NfMzIJCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzE2X1BDUkVMCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzMyX1BDUkVMCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzM4Nl9QTFQzMgkwCi0jZGVmaW5lIEJGRF9SRUxPQ18zODZfR09UMzIJMAotI2RlZmluZSBCRkRfUkVMT0NfMzg2X0dPVE9GRgkwCi0jZW5kaWYKLQotc3RhdGljIGludAotaW50ZWxfZmxvYXRfb3BlcmFuZCBQQVJBTVMgKChjaGFyICptbmVtb25pYykpOwotCi1zdGF0aWMgaW50Ci1pbnRlbF9mbG9hdF9vcGVyYW5kIChtbmVtb25pYykKLSAgICAgY2hhciAqbW5lbW9uaWM7Ci17Ci0gIGlmIChtbmVtb25pY1swXSA9PSAnZicgJiYgbW5lbW9uaWNbMV0gPT0naScpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKG1uZW1vbmljWzBdID09ICdmJykKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgTElORSBwb2ludHMgdG8gYQotICAgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGVtaXQKLSAgIHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAobGluZSkKLSAgICAgY2hhciAqbGluZTsKLXsKLSAgLyogUG9pbnRzIHRvIHRlbXBsYXRlIG9uY2Ugd2UndmUgZm91bmQgaXQuICovCi0gIGNvbnN0IHRlbXBsYXRlICp0OwotCi0gIC8qIENvdW50IHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQuICAqLwotICBpbnQgaW5zbl9zaXplID0gMDsKLQotICBpbnQgajsKLQotICBjaGFyIG1uZW1vbmljW01BWF9NTkVNX1NJWkVdOwotCi0gIC8qIEluaXRpYWxpemUgZ2xvYmFscy4gKi8KLSAgbWVtc2V0ICgmaSwgJ1wwJywgc2l6ZW9mIChpKSk7Ci0gIGZvciAoaiA9IDA7IGogPCBNQVhfT1BFUkFORFM7IGorKykKLSAgICBpLmRpc3BfcmVsb2Nbal0gPSBOT19SRUxPQzsKLSAgbWVtc2V0IChkaXNwX2V4cHJlc3Npb25zLCAnXDAnLCBzaXplb2YgKGRpc3BfZXhwcmVzc2lvbnMpKTsKLSAgbWVtc2V0IChpbV9leHByZXNzaW9ucywgJ1wwJywgc2l6ZW9mIChpbV9leHByZXNzaW9ucykpOwotICBzYXZlX3N0YWNrX3AgPSBzYXZlX3N0YWNrOwkvKiByZXNldCBzdGFjayBwb2ludGVyICovCi0KLSAgLyogRmlyc3QgcGFyc2UgYW4gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgJiBjYWxsIGkzODZfb3BlcmFuZCBmb3IgdGhlIG9wZXJhbmRzLgotICAgICBXZSBhc3N1bWUgdGhhdCB0aGUgc2NydWJiZXIgaGFzIGFycmFuZ2VkIGl0IHNvIHRoYXQgbGluZVswXSBpcyB0aGUgdmFsaWQKLSAgICAgc3RhcnQgb2YgYSAocG9zc2libHkgcHJlZml4ZWQpIG1uZW1vbmljLiAqLwotICB7Ci0gICAgY2hhciAqbCA9IGxpbmU7Ci0gICAgY2hhciAqdG9rZW5fc3RhcnQgPSBsOwotICAgIGNoYXIgKm1uZW1fcDsKLQotICAgIC8qIE5vbi16ZXJvIGlmIHdlIGZvdW5kIGEgcHJlZml4IG9ubHkgYWNjZXB0YWJsZSB3aXRoIHN0cmluZyBpbnNucy4gKi8KLSAgICBjb25zdCBjaGFyICpleHBlY3Rpbmdfc3RyaW5nX2luc3RydWN0aW9uID0gTlVMTDsKLQotICAgIHdoaWxlICgxKQotICAgICAgewotCW1uZW1fcCA9IG1uZW1vbmljOwotCXdoaWxlICgoKm1uZW1fcCA9IG1uZW1vbmljX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSAqbF0pICE9IDApCi0JICB7Ci0JICAgIG1uZW1fcCsrOwotCSAgICBpZiAobW5lbV9wID49IG1uZW1vbmljICsgc2l6ZW9mIChtbmVtb25pYykpCi0JICAgICAgewotCQlhc19iYWQgKF8oIm5vIHN1Y2ggMzg2IGluc3RydWN0aW9uOiBgJXMnIiksIHRva2VuX3N0YXJ0KTsKLQkJcmV0dXJuOwotCSAgICAgIH0KLQkgICAgbCsrOwotCSAgfQotCWlmICghaXNfc3BhY2VfY2hhciAoKmwpCi0JICAgICYmICpsICE9IEVORF9PRl9JTlNOCi0JICAgICYmICpsICE9IFBSRUZJWF9TRVBBUkFUT1IpCi0JICB7Ci0JICAgIGFzX2JhZCAoXygiaW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gbW5lbW9uaWMiKSwKLQkJICAgIG91dHB1dF9pbnZhbGlkICgqbCkpOwotCSAgICByZXR1cm47Ci0JICB9Ci0JaWYgKHRva2VuX3N0YXJ0ID09IGwpCi0JICB7Ci0JICAgIGlmICgqbCA9PSBQUkVGSVhfU0VQQVJBVE9SKQotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIHByZWZpeDsgZ290IG5vdGhpbmciKSk7Ci0JICAgIGVsc2UKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGluZyBtbmVtb25pYzsgZ290IG5vdGhpbmciKSk7Ci0JICAgIHJldHVybjsKLQkgIH0KLQotCS8qIExvb2sgdXAgaW5zdHJ1Y3Rpb24gKG9yIHByZWZpeCkgdmlhIGhhc2ggdGFibGUuICAqLwotCWN1cnJlbnRfdGVtcGxhdGVzID0gaGFzaF9maW5kIChvcF9oYXNoLCBtbmVtb25pYyk7Ci0KLQlpZiAoKmwgIT0gRU5EX09GX0lOU04KLQkgICAgJiYgKCEgaXNfc3BhY2VfY2hhciAoKmwpIHx8IGxbMV0gIT0gRU5EX09GX0lOU04pCi0JICAgICYmIGN1cnJlbnRfdGVtcGxhdGVzCi0JICAgICYmIChjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIElzUHJlZml4KSkKLQkgIHsKLQkgICAgLyogSWYgd2UgYXJlIGluIDE2LWJpdCBtb2RlLCBkbyBub3QgYWxsb3cgYWRkcjE2IG9yIGRhdGExNi4KLQkgICAgICAgU2ltaWxhcmx5LCBpbiAzMi1iaXQgbW9kZSwgZG8gbm90IGFsbG93IGFkZHIzMiBvciBkYXRhMzIuICAqLwotCSAgICBpZiAoKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgKFNpemUxNiB8IFNpemUzMikpCi0JCSYmICgoKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgU2l6ZTMyKSAhPSAwKQotCQkgICAgXiBmbGFnXzE2Yml0X2NvZGUpKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJyZWR1bmRhbnQgJXMgcHJlZml4IiksCi0JCQljdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm5hbWUpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICAvKiBBZGQgcHJlZml4LCBjaGVja2luZyBmb3IgcmVwZWF0ZWQgcHJlZml4ZXMuICAqLwotCSAgICBzd2l0Y2ggKGFkZF9wcmVmaXggKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+YmFzZV9vcGNvZGUpKQotCSAgICAgIHsKLQkgICAgICBjYXNlIDA6Ci0JCXJldHVybjsKLQkgICAgICBjYXNlIDI6Ci0JCWV4cGVjdGluZ19zdHJpbmdfaW5zdHJ1Y3Rpb24gPQotCQkgIGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICAvKiBTa2lwIHBhc3QgUFJFRklYX1NFUEFSQVRPUiBhbmQgcmVzZXQgdG9rZW5fc3RhcnQuICAqLwotCSAgICB0b2tlbl9zdGFydCA9ICsrbDsKLQkgIH0KLQllbHNlCi0JICBicmVhazsKLSAgICAgIH0KLQotICAgIGlmICghY3VycmVudF90ZW1wbGF0ZXMpCi0gICAgICB7Ci0JLyogU2VlIGlmIHdlIGNhbiBnZXQgYSBtYXRjaCBieSB0cmltbWluZyBvZmYgYSBzdWZmaXguICAqLwotCXN3aXRjaCAobW5lbV9wWy0xXSkKLQkgIHsKLQkgIGNhc2UgRFdPUkRfTU5FTV9TVUZGSVg6Ci0JICBjYXNlIFdPUkRfTU5FTV9TVUZGSVg6Ci0JICBjYXNlIEJZVEVfTU5FTV9TVUZGSVg6Ci0JICBjYXNlIFNIT1JUX01ORU1fU1VGRklYOgotI2lmIExPTkdfTU5FTV9TVUZGSVggIT0gRFdPUkRfTU5FTV9TVUZGSVgKLQkgIGNhc2UgTE9OR19NTkVNX1NVRkZJWDoKLSNlbmRpZgotCSAgICBpLnN1ZmZpeCA9IG1uZW1fcFstMV07Ci0JICAgIG1uZW1fcFstMV0gPSAnXDAnOwotCSAgICBjdXJyZW50X3RlbXBsYXRlcyA9IGhhc2hfZmluZCAob3BfaGFzaCwgbW5lbW9uaWMpOwotCSAgICBicmVhazsKLQotCSAgLyogSW50ZWwgU3ludGF4ICovCi0JICBjYXNlIElOVEVMX0RXT1JEX01ORU1fU1VGRklYOgotCSAgICBpZiAoaW50ZWxfc3ludGF4KQotCSAgICAgIHsKLQkJaS5zdWZmaXggPSBtbmVtX3BbLTFdOwotCQltbmVtX3BbLTFdID0gJ1wwJzsKLQkJY3VycmVudF90ZW1wbGF0ZXMgPSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG1uZW1vbmljKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCWlmICghY3VycmVudF90ZW1wbGF0ZXMpCi0JICB7Ci0JICAgIGFzX2JhZCAoXygibm8gc3VjaCAzODYgaW5zdHJ1Y3Rpb246IGAlcyciKSwgdG9rZW5fc3RhcnQpOwotCSAgICByZXR1cm47Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAvKiBjaGVjayBmb3IgcmVwL3JlcG5lIHdpdGhvdXQgYSBzdHJpbmcgaW5zdHJ1Y3Rpb24gKi8KLSAgICBpZiAoZXhwZWN0aW5nX3N0cmluZ19pbnN0cnVjdGlvbgotCSYmICEoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiBJc1N0cmluZykpCi0gICAgICB7Ci0JYXNfYmFkIChfKCJleHBlY3Rpbmcgc3RyaW5nIGluc3RydWN0aW9uIGFmdGVyIGAlcyciKSwKLQkJZXhwZWN0aW5nX3N0cmluZ19pbnN0cnVjdGlvbik7Ci0JcmV0dXJuOwotICAgICAgfQotCi0gICAgLyogVGhlcmUgbWF5IGJlIG9wZXJhbmRzIHRvIHBhcnNlLiAqLwotICAgIGlmICgqbCAhPSBFTkRfT0ZfSU5TTikKLSAgICAgIHsKLQkvKiBwYXJzZSBvcGVyYW5kcyAqLwotCi0JLyogMSBpZiBvcGVyYW5kIGlzIHBlbmRpbmcgYWZ0ZXIgJywnLiAqLwotCXVuc2lnbmVkIGludCBleHBlY3Rpbmdfb3BlcmFuZCA9IDA7Ci0KLQkvKiBOb24temVybyBpZiBvcGVyYW5kIHBhcmVucyBub3QgYmFsYW5jZWQuICovCi0JdW5zaWduZWQgaW50IHBhcmVuX25vdF9iYWxhbmNlZDsKLQotCWRvCi0JICB7Ci0JICAgIC8qIHNraXAgb3B0aW9uYWwgd2hpdGUgc3BhY2UgYmVmb3JlIG9wZXJhbmQgKi8KLQkgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpsKSkKLQkgICAgICArK2w7Ci0JICAgIGlmICghaXNfb3BlcmFuZF9jaGFyICgqbCkgJiYgKmwgIT0gRU5EX09GX0lOU04pCi0JICAgICAgewotCQlhc19iYWQgKF8oImludmFsaWQgY2hhcmFjdGVyICVzIGJlZm9yZSBvcGVyYW5kICVkIiksCi0JCQlvdXRwdXRfaW52YWxpZCAoKmwpLAotCQkJaS5vcGVyYW5kcyArIDEpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICB0b2tlbl9zdGFydCA9IGw7CS8qIGFmdGVyIHdoaXRlIHNwYWNlICovCi0JICAgIHBhcmVuX25vdF9iYWxhbmNlZCA9IDA7Ci0JICAgIHdoaWxlIChwYXJlbl9ub3RfYmFsYW5jZWQgfHwgKmwgIT0gJywnKQotCSAgICAgIHsKLQkJaWYgKCpsID09IEVORF9PRl9JTlNOKQotCQkgIHsKLQkJICAgIGlmIChwYXJlbl9ub3RfYmFsYW5jZWQpCi0JCSAgICAgIHsKLQkJCWlmICghaW50ZWxfc3ludGF4KQotCQkJICBhc19iYWQgKF8oInVuYmFsYW5jZWQgcGFyZW50aGVzaXMgaW4gb3BlcmFuZCAlZC4iKSwKLQkJCQkgIGkub3BlcmFuZHMgKyAxKTsKLQkJCWVsc2UKLQkJCSAgYXNfYmFkIChfKCJ1bmJhbGFuY2VkIGJyYWNrZXRzIGluIG9wZXJhbmQgJWQuIiksCi0JCQkJICBpLm9wZXJhbmRzICsgMSk7Ci0JCQlyZXR1cm47Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgYnJlYWs7CS8qIHdlIGFyZSBkb25lICovCi0JCSAgfQotCQllbHNlIGlmICghaXNfb3BlcmFuZF9jaGFyICgqbCkgJiYgIWlzX3NwYWNlX2NoYXIgKCpsKSkKLQkJICB7Ci0JCSAgICBhc19iYWQgKF8oImludmFsaWQgY2hhcmFjdGVyICVzIGluIG9wZXJhbmQgJWQiKSwKLQkJCSAgICBvdXRwdXRfaW52YWxpZCAoKmwpLAotCQkJICAgIGkub3BlcmFuZHMgKyAxKTsKLQkJICAgIHJldHVybjsKLQkJICB9Ci0JCWlmICghaW50ZWxfc3ludGF4KQotCQkgIHsKLQkJICAgIGlmICgqbCA9PSAnKCcpCi0JCSAgICAgICsrcGFyZW5fbm90X2JhbGFuY2VkOwotCQkgICAgaWYgKCpsID09ICcpJykKLQkJICAgICAgLS1wYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKCpsID09ICdbJykKLQkJICAgICAgKytwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JCSAgICBpZiAoKmwgPT0gJ10nKQotCQkgICAgICAtLXBhcmVuX25vdF9iYWxhbmNlZDsKLQkJICB9Ci0JCWwrKzsKLQkgICAgICB9Ci0JICAgIGlmIChsICE9IHRva2VuX3N0YXJ0KQotCSAgICAgIHsJCQkvKiB5ZXMsIHdlJ3ZlIHJlYWQgaW4gYW5vdGhlciBvcGVyYW5kICovCi0JCXVuc2lnbmVkIGludCBvcGVyYW5kX29rOwotCQl0aGlzX29wZXJhbmQgPSBpLm9wZXJhbmRzKys7Ci0JCWlmIChpLm9wZXJhbmRzID4gTUFYX09QRVJBTkRTKQotCQkgIHsKLQkJICAgIGFzX2JhZCAoXygic3B1cmlvdXMgb3BlcmFuZHM7ICglZCBvcGVyYW5kcy9pbnN0cnVjdGlvbiBtYXgpIiksCi0JCQkgICAgTUFYX09QRVJBTkRTKTsKLQkJICAgIHJldHVybjsKLQkJICB9Ci0JCS8qIG5vdyBwYXJzZSBvcGVyYW5kIGFkZGluZyBpbmZvIHRvICdpJyBhcyB3ZSBnbyBhbG9uZyAqLwotCQlFTkRfU1RSSU5HX0FORF9TQVZFIChsKTsKLQotCQlpZiAoaW50ZWxfc3ludGF4KQotCQkgIG9wZXJhbmRfb2sgPSBpMzg2X2ludGVsX29wZXJhbmQgKHRva2VuX3N0YXJ0LCBpbnRlbF9mbG9hdF9vcGVyYW5kIChtbmVtb25pYykpOwotCQllbHNlCi0JCSAgb3BlcmFuZF9vayA9IGkzODZfb3BlcmFuZCAodG9rZW5fc3RhcnQpOwotCi0JCVJFU1RPUkVfRU5EX1NUUklORyAobCk7CS8qIHJlc3RvcmUgb2xkIGNvbnRlbnRzICovCi0JCWlmICghb3BlcmFuZF9vaykKLQkJICByZXR1cm47Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpZiAoZXhwZWN0aW5nX29wZXJhbmQpCi0JCSAgewotCQkgIGV4cGVjdGluZ19vcGVyYW5kX2FmdGVyX2NvbW1hOgotCQkgICAgYXNfYmFkIChfKCJleHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIikpOwotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkJaWYgKCpsID09ICcsJykKLQkJICB7Ci0JCSAgICBhc19iYWQgKF8oImV4cGVjdGluZyBvcGVyYW5kIGJlZm9yZSAnLCc7IGdvdCBub3RoaW5nIikpOwotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgLyogbm93ICpsIG11c3QgYmUgZWl0aGVyICcsJyBvciBFTkRfT0ZfSU5TTiAqLwotCSAgICBpZiAoKmwgPT0gJywnKQotCSAgICAgIHsKLQkJaWYgKCorK2wgPT0gRU5EX09GX0lOU04pCi0JCSAgewkJLyoganVzdCBza2lwIGl0LCBpZiBpdCdzIFxuIGNvbXBsYWluICovCi0JCSAgICBnb3RvIGV4cGVjdGluZ19vcGVyYW5kX2FmdGVyX2NvbW1hOwotCQkgIH0KLQkJZXhwZWN0aW5nX29wZXJhbmQgPSAxOwotCSAgICAgIH0KLQkgIH0KLQl3aGlsZSAoKmwgIT0gRU5EX09GX0lOU04pOwkvKiB1bnRpbCB3ZSBnZXQgZW5kIG9mIGluc24gKi8KLSAgICAgIH0KLSAgfQotCi0gIC8qIE5vdyB3ZSd2ZSBwYXJzZWQgdGhlIG1uZW1vbmljIGludG8gYSBzZXQgb2YgdGVtcGxhdGVzLCBhbmQgaGF2ZSB0aGUKLSAgICAgb3BlcmFuZHMgYXQgaGFuZC4KLQotICAgICBOZXh0LCB3ZSBmaW5kIGEgdGVtcGxhdGUgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBpbnNuLAotICAgICBtYWtpbmcgc3VyZSB0aGUgb3ZlcmxhcCBvZiB0aGUgZ2l2ZW4gb3BlcmFuZHMgdHlwZXMgaXMgY29uc2lzdGVudAotICAgICB3aXRoIHRoZSB0ZW1wbGF0ZSBvcGVyYW5kIHR5cGVzLiAqLwotCi0jZGVmaW5lIE1BVENIKG92ZXJsYXAsIGdpdmVuLCB0ZW1wbGF0ZSkgXAotICAoKG92ZXJsYXApIFwKLSAgICYmICgoZ2l2ZW4pICYgQmFzZUluZGV4KSA9PSAoKG92ZXJsYXApICYgQmFzZUluZGV4KSBcCi0gICAmJiAoKGdpdmVuKSAmIEp1bXBBYnNvbHV0ZSkgPT0gKCh0ZW1wbGF0ZSkgJiBKdW1wQWJzb2x1dGUpKQotCi0gIC8qIElmIGdpdmVuIHR5cGVzIHIwIGFuZCByMSBhcmUgcmVnaXN0ZXJzIHRoZXkgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlCi0gICAgIHVubGVzcyB0aGUgZXhwZWN0ZWQgb3BlcmFuZCB0eXBlIHJlZ2lzdGVyIG92ZXJsYXAgaXMgbnVsbC4KLSAgICAgTm90ZSB0aGF0IEFjYyBpbiBhIHRlbXBsYXRlIG1hdGNoZXMgZXZlcnkgc2l6ZSBvZiByZWcuICAqLwotI2RlZmluZSBDT05TSVNURU5UX1JFR0lTVEVSX01BVENIKG0wLCBnMCwgdDAsIG0xLCBnMSwgdDEpIFwKLSAgKCAoKGcwKSAmIFJlZykgPT0gMCB8fCAoKGcxKSAmIFJlZykgPT0gMCB8fCBcCi0gICAgKChnMCkgJiBSZWcpID09ICgoZzEpICYgUmVnKSB8fCBcCi0gICAgKCgoKG0wKSAmIEFjYykgPyBSZWcgOiAodDApKSAmICgoKG0xKSAmIEFjYykgPyBSZWcgOiAodDEpKSAmIFJlZykgPT0gMCApCi0KLSAgewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBvdmVybGFwMCwgb3ZlcmxhcDE7Ci0gICAgdW5zaWduZWQgaW50IG92ZXJsYXAyOwotICAgIHVuc2lnbmVkIGludCBmb3VuZF9yZXZlcnNlX21hdGNoOwotICAgIGludCBzdWZmaXhfY2hlY2s7Ci0KLSAgICAvKiBBbGwgaW50ZWwgb3Bjb2RlcyBoYXZlIHJldmVyc2VkIG9wZXJhbmRzIGV4Y2VwdCBmb3IgQk9VTkQgYW5kIEVOVEVSICovCi0gICAgaWYgKGludGVsX3N5bnRheAotCSYmIChzdHJjbXAgKG1uZW1vbmljLCAiZW50ZXIiKSAhPSAwKQotCSYmIChzdHJjbXAgKG1uZW1vbmljLCAiYm91bmQiKSAhPSAwKQotCSYmIChzdHJuY21wIChtbmVtb25pYywgImZzdWIiLCA0KSAhPTApCi0JJiYgKHN0cm5jbXAgKG1uZW1vbmljLCAiZmRpdiIsIDQpICE9MCkpCi0gICAgICB7Ci0JY29uc3QgcmVnX2VudHJ5ICp0ZW1wX3JlZyA9IE5VTEw7Ci0JZXhwcmVzc2lvblMgKnRlbXBfZGlzcCA9IE5VTEw7Ci0JZXhwcmVzc2lvblMgKnRlbXBfaW1tID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgdGVtcF90eXBlOwotCWludCB4Y2hnMSA9IDA7Ci0JaW50IHhjaGcyID0gMDsKLQotCWlmIChpLm9wZXJhbmRzID09IDIpCi0JICB7Ci0JICAgIHhjaGcxID0gMDsKLQkgICAgeGNoZzIgPSAxOwotCSAgfQotCWVsc2UgaWYgKGkub3BlcmFuZHMgPT0gMykKLQkgIHsKLQkgICAgeGNoZzEgPSAwOwotCSAgICB4Y2hnMiA9IDI7Ci0JICB9Ci0KLQlpZiAoaS5vcGVyYW5kcyA+IDEpCi0JICB7Ci0JICAgIHRlbXBfdHlwZSA9IGkudHlwZXNbeGNoZzJdOwotCSAgICBpZiAodGVtcF90eXBlICYgKFJlZyB8IEZsb2F0UmVnKSkKLQkgICAgICB0ZW1wX3JlZyA9IGkucmVnc1t4Y2hnMl07Ci0JICAgIGVsc2UgaWYgKHRlbXBfdHlwZSAmIEltbSkKLQkgICAgICB0ZW1wX2ltbSA9IGkuaW1tc1t4Y2hnMl07Ci0JICAgIGVsc2UgaWYgKHRlbXBfdHlwZSAmIERpc3ApCi0JICAgICAgdGVtcF9kaXNwID0gaS5kaXNwc1t4Y2hnMl07Ci0KLQkgICAgaS50eXBlc1t4Y2hnMl0gPSBpLnR5cGVzW3hjaGcxXTsKLQotCSAgICBpZiAoaS50eXBlc1t4Y2hnMV0gJiAoUmVnIHwgRmxvYXRSZWcpKQotCSAgICAgIHsKLQkJaS5yZWdzW3hjaGcyXSA9IGkucmVnc1t4Y2hnMV07Ci0JCWkucmVnc1t4Y2hnMV0gPSBOVUxMOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoaS50eXBlc1t4Y2hnMl0gJiBJbW0pCi0JICAgICAgewotCQlpLmltbXNbeGNoZzJdID0gaS5pbW1zW3hjaGcxXTsKLQkJaS5pbW1zW3hjaGcxXSA9IE5VTEw7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChpLnR5cGVzW3hjaGcyXSAmIERpc3ApCi0JICAgICAgewotCQlpLmRpc3BzW3hjaGcyXSA9IGkuZGlzcHNbeGNoZzFdOwotCQlpLmRpc3BzW3hjaGcxXSA9IE5VTEw7Ci0JICAgICAgfQotCi0JICAgIGlmICh0ZW1wX3R5cGUgJiAoUmVnIHwgRmxvYXRSZWcpKQotCSAgICAgIHsKLQkJaS5yZWdzW3hjaGcxXSA9IHRlbXBfcmVnOwotCQlpZiAoISAoaS50eXBlc1t4Y2hnMV0gJiAoUmVnIHwgRmxvYXRSZWcpKSkKLQkJICBpLnJlZ3NbeGNoZzJdID0gTlVMTDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHRlbXBfdHlwZSAmIEltbSkKLQkgICAgICB7Ci0JCWkuaW1tc1t4Y2hnMV0gPSB0ZW1wX2ltbTsKLQkJaWYgKCEgKGkudHlwZXNbeGNoZzFdICYgSW1tKSkKLQkJICBpLmltbXNbeGNoZzJdID0gTlVMTDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHRlbXBfdHlwZSAmIERpc3ApCi0JICAgICAgewotCQlpLmRpc3BzW3hjaGcxXSA9IHRlbXBfZGlzcDsKLQkJaWYgKCEgKGkudHlwZXNbeGNoZzFdICYgRGlzcCkpCi0JCSAgaS5kaXNwc1t4Y2hnMl0gPSBOVUxMOwotCSAgICAgIH0KLQotCSAgICBpLnR5cGVzW3hjaGcxXSA9IHRlbXBfdHlwZTsKLQkgIH0KLQlpZiAoIXN0cmNtcChtbmVtb25pYywiam1wIikKLQkgICAgfHwgIXN0cmNtcCAobW5lbW9uaWMsICJjYWxsIikpCi0JICBpZiAoKGkudHlwZXNbMF0gJiBSZWcpIHx8IGkudHlwZXNbMF0gJiBCYXNlSW5kZXgpCi0JICAgIGkudHlwZXNbMF0gfD0gSnVtcEFic29sdXRlOwotCi0gICAgICB9Ci0gICAgb3ZlcmxhcDAgPSAwOwotICAgIG92ZXJsYXAxID0gMDsKLSAgICBvdmVybGFwMiA9IDA7Ci0gICAgZm91bmRfcmV2ZXJzZV9tYXRjaCA9IDA7Ci0gICAgc3VmZml4X2NoZWNrID0gKGkuc3VmZml4ID09IEJZVEVfTU5FTV9TVUZGSVgKLQkJICAgID8gTm9fYlN1ZgotCQkgICAgOiAoaS5zdWZmaXggPT0gV09SRF9NTkVNX1NVRkZJWAotCQkgICAgICAgPyBOb193U3VmCi0JCSAgICAgICA6IChpLnN1ZmZpeCA9PSBTSE9SVF9NTkVNX1NVRkZJWAotCQkJICA/IE5vX3NTdWYKLQkJCSAgOiAoaS5zdWZmaXggPT0gTE9OR19NTkVNX1NVRkZJWAotCQkJICAgICA/IE5vX2xTdWYKLQkJCSAgICAgOiAoaS5zdWZmaXggPT0gSU5URUxfRFdPUkRfTU5FTV9TVUZGSVgKLQkJCQk/IE5vX2RTdWYKLQkJCQk6IChpLnN1ZmZpeCA9PSBMT05HX0RPVUJMRV9NTkVNX1NVRkZJWCA/IE5vX3hTdWYgOiAwKSkpKSkpOwotCi0gICAgZm9yICh0ID0gY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0OwotCSB0IDwgY3VycmVudF90ZW1wbGF0ZXMtPmVuZDsKLQkgdCsrKQotICAgICAgewotCS8qIE11c3QgaGF2ZSByaWdodCBudW1iZXIgb2Ygb3BlcmFuZHMuICovCi0JaWYgKGkub3BlcmFuZHMgIT0gdC0+b3BlcmFuZHMpCi0JICBjb250aW51ZTsKLQotCS8qIEZvciBzb21lIG9wY29kZXMsIGRvbid0IGNoZWNrIHRoZSBzdWZmaXggKi8KLQlpZiAoaW50ZWxfc3ludGF4KQotCSAgewotCSAgICBpZiAoc3RyY21wICh0LT5uYW1lLCAiZm5zdGN3IikKLQkJJiYgc3RyY21wICh0LT5uYW1lLCAiZmxkY3ciKQotCQkmJiAodC0+b3Bjb2RlX21vZGlmaWVyICYgc3VmZml4X2NoZWNrKSkKLQkgICAgICBjb250aW51ZTsKLQkgIH0KLQkvKiBNdXN0IG5vdCBoYXZlIGRpc2FsbG93ZWQgc3VmZml4LiAqLwotCWVsc2UgaWYgKCh0LT5vcGNvZGVfbW9kaWZpZXIgJiBzdWZmaXhfY2hlY2spKQotCSAgY29udGludWU7Ci0KLQllbHNlIGlmICghdC0+b3BlcmFuZHMpCi0JICBicmVhazsJCS8qIDAgb3BlcmFuZHMgYWx3YXlzIG1hdGNoZXMgKi8KLQotCW92ZXJsYXAwID0gaS50eXBlc1swXSAmIHQtPm9wZXJhbmRfdHlwZXNbMF07Ci0Jc3dpdGNoICh0LT5vcGVyYW5kcykKLQkgIHsKLQkgIGNhc2UgMToKLQkgICAgaWYgKCFNQVRDSCAob3ZlcmxhcDAsIGkudHlwZXNbMF0sIHQtPm9wZXJhbmRfdHlwZXNbMF0pKQotCSAgICAgIGNvbnRpbnVlOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgIGNhc2UgMzoKLQkgICAgb3ZlcmxhcDEgPSBpLnR5cGVzWzFdICYgdC0+b3BlcmFuZF90eXBlc1sxXTsKLQkgICAgaWYgKCFNQVRDSCAob3ZlcmxhcDAsIGkudHlwZXNbMF0sIHQtPm9wZXJhbmRfdHlwZXNbMF0pCi0JCXx8ICFNQVRDSCAob3ZlcmxhcDEsIGkudHlwZXNbMV0sIHQtPm9wZXJhbmRfdHlwZXNbMV0pCi0JCXx8ICFDT05TSVNURU5UX1JFR0lTVEVSX01BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwKLQkJCQkJICAgICAgIHQtPm9wZXJhbmRfdHlwZXNbMF0sCi0JCQkJCSAgICAgICBvdmVybGFwMSwgaS50eXBlc1sxXSwKLQkJCQkJICAgICAgIHQtPm9wZXJhbmRfdHlwZXNbMV0pKQotCSAgICAgIHsKLQotCQkvKiBjaGVjayBpZiBvdGhlciBkaXJlY3Rpb24gaXMgdmFsaWQgLi4uICovCi0JCWlmICgodC0+b3Bjb2RlX21vZGlmaWVyICYgKER8RmxvYXREKSkgPT0gMCkKLQkJICBjb250aW51ZTsKLQotCQkvKiB0cnkgcmV2ZXJzaW5nIGRpcmVjdGlvbiBvZiBvcGVyYW5kcyAqLwotCQlvdmVybGFwMCA9IGkudHlwZXNbMF0gJiB0LT5vcGVyYW5kX3R5cGVzWzFdOwotCQlvdmVybGFwMSA9IGkudHlwZXNbMV0gJiB0LT5vcGVyYW5kX3R5cGVzWzBdOwotCQlpZiAoIU1BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwgdC0+b3BlcmFuZF90eXBlc1sxXSkKLQkJICAgIHx8ICFNQVRDSCAob3ZlcmxhcDEsIGkudHlwZXNbMV0sIHQtPm9wZXJhbmRfdHlwZXNbMF0pCi0JCSAgICB8fCAhQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSCAob3ZlcmxhcDAsIGkudHlwZXNbMF0sCi0JCQkJCQkgICB0LT5vcGVyYW5kX3R5cGVzWzFdLAotCQkJCQkJICAgb3ZlcmxhcDEsIGkudHlwZXNbMV0sCi0JCQkJCQkgICB0LT5vcGVyYW5kX3R5cGVzWzBdKSkKLQkJICB7Ci0JCSAgICAvKiBkb2VzIG5vdCBtYXRjaCBlaXRoZXIgZGlyZWN0aW9uICovCi0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0JCS8qIGZvdW5kX3JldmVyc2VfbWF0Y2ggaG9sZHMgd2hpY2ggb2YgRCBvciBGbG9hdERSCi0JCSAgIHdlJ3ZlIGZvdW5kLiAgKi8KLQkJZm91bmRfcmV2ZXJzZV9tYXRjaCA9IHQtPm9wY29kZV9tb2RpZmllciAmIChEfEZsb2F0RFIpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIC8qIGZvdW5kIGEgZm9yd2FyZCAyIG9wZXJhbmQgbWF0Y2ggaGVyZSAqLwotCSAgICBpZiAodC0+b3BlcmFuZHMgPT0gMykKLQkgICAgICB7Ci0JCS8qIEhlcmUgd2UgbWFrZSB1c2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgbm8KLQkJICAgcmV2ZXJzZSBtYXRjaCAzIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zLCBhbmQgYWxsIDMKLQkJICAgb3BlcmFuZCBpbnN0cnVjdGlvbnMgb25seSBuZWVkIHRvIGJlIGNoZWNrZWQgZm9yCi0JCSAgIHJlZ2lzdGVyIGNvbnNpc3RlbmN5IGJldHdlZW4gb3BlcmFuZHMgMiBhbmQgMy4gICovCi0JCW92ZXJsYXAyID0gaS50eXBlc1syXSAmIHQtPm9wZXJhbmRfdHlwZXNbMl07Ci0JCWlmICghTUFUQ0ggKG92ZXJsYXAyLCBpLnR5cGVzWzJdLCB0LT5vcGVyYW5kX3R5cGVzWzJdKQotCQkgICAgfHwgIUNPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0ggKG92ZXJsYXAxLCBpLnR5cGVzWzFdLAotCQkJCQkJICAgdC0+b3BlcmFuZF90eXBlc1sxXSwKLQkJCQkJCSAgIG92ZXJsYXAyLCBpLnR5cGVzWzJdLAotCQkJCQkJICAgdC0+b3BlcmFuZF90eXBlc1syXSkpCi0KLQkJICBjb250aW51ZTsKLQkgICAgICB9Ci0JICAgIC8qIGZvdW5kIGVpdGhlciBmb3J3YXJkL3JldmVyc2UgMiBvciAzIG9wZXJhbmQgbWF0Y2ggaGVyZToKLQkgICAgICAgc2xpcCB0aHJvdWdoIHRvIGJyZWFrICovCi0JICB9Ci0JYnJlYWs7CQkJLyogd2UndmUgZm91bmQgYSBtYXRjaDsgYnJlYWsgb3V0IG9mIGxvb3AgKi8KLSAgICAgIH0JCQkJLyogZm9yICh0ID0gLi4uICovCi0gICAgaWYgKHQgPT0gY3VycmVudF90ZW1wbGF0ZXMtPmVuZCkKLSAgICAgIHsJCQkJLyogd2UgZm91bmQgbm8gbWF0Y2ggKi8KLQlhc19iYWQgKF8oInN1ZmZpeCBvciBvcGVyYW5kcyBpbnZhbGlkIGZvciBgJXMnIiksCi0JCWN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZSk7Ci0JcmV0dXJuOwotICAgICAgfQotCi0gICAgaWYgKCh0LT5vcGNvZGVfbW9kaWZpZXIgJiAoSXNQcmVmaXh8SWdub3JlU2l6ZSkpID09IChJc1ByZWZpeHxJZ25vcmVTaXplKSkKLSAgICAgIHsKLQkvKiBXYXJuIHRoZW0gdGhhdCBhIGRhdGEgb3IgYWRkcmVzcyBzaXplIHByZWZpeCBkb2Vzbid0IGFmZmVjdAotCSAgIGFzc2VtYmx5IG9mIHRoZSBuZXh0IGxpbmUgb2YgY29kZS4gICovCi0JYXNfd2FybiAoXygic3RhbmQtYWxvbmUgYCVzJyBwcmVmaXgiKSwgdC0+bmFtZSk7Ci0gICAgICB9Ci0KLSAgICAvKiBDb3B5IHRoZSB0ZW1wbGF0ZSB3ZSBmb3VuZC4gICovCi0gICAgaS50bSA9ICp0OwotICAgIGlmIChmb3VuZF9yZXZlcnNlX21hdGNoKQotICAgICAgewotCWkudG0ub3BlcmFuZF90eXBlc1swXSA9IHQtPm9wZXJhbmRfdHlwZXNbMV07Ci0JaS50bS5vcGVyYW5kX3R5cGVzWzFdID0gdC0+b3BlcmFuZF90eXBlc1swXTsKLSAgICAgIH0KLQotCi0gICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgRldhaXQpCi0gICAgICBpZiAoISBhZGRfcHJlZml4IChGV0FJVF9PUENPREUpKQotCXJldHVybjsKLQotICAgIC8qIENoZWNrIHN0cmluZyBpbnN0cnVjdGlvbiBzZWdtZW50IG92ZXJyaWRlcyAqLwotICAgIGlmICgoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBJc1N0cmluZykgIT0gMCAmJiBpLm1lbV9vcGVyYW5kcyAhPSAwKQotICAgICAgewotCWludCBtZW1fb3AgPSAoaS50eXBlc1swXSAmIEFueU1lbSkgPyAwIDogMTsKLQlpZiAoKGkudG0ub3BlcmFuZF90eXBlc1ttZW1fb3BdICYgRXNTZWcpICE9IDApCi0JICB7Ci0JICAgIGlmIChpLnNlZ1swXSAhPSBOVUxMICYmIGkuc2VnWzBdICE9ICZlcykKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiYCVzJyBvcGVyYW5kICVkIG11c3QgdXNlIGAlJWVzJyBzZWdtZW50IiksCi0JCQlpLnRtLm5hbWUsCi0JCQltZW1fb3AgKyAxKTsKLQkJcmV0dXJuOwotCSAgICAgIH0KLQkgICAgLyogVGhlcmUncyBvbmx5IGV2ZXIgb25lIHNlZ21lbnQgb3ZlcnJpZGUgYWxsb3dlZCBwZXIgaW5zdHJ1Y3Rpb24uCi0JICAgICAgIFRoaXMgaW5zdHJ1Y3Rpb24gcG9zc2libHkgaGFzIGEgbGVnYWwgc2VnbWVudCBvdmVycmlkZSBvbiB0aGUKLQkgICAgICAgc2Vjb25kIG9wZXJhbmQsIHNvIGNvcHkgdGhlIHNlZ21lbnQgdG8gd2hlcmUgbm9uLXN0cmluZwotCSAgICAgICBpbnN0cnVjdGlvbnMgc3RvcmUgaXQsIGFsbG93aW5nIGNvbW1vbiBjb2RlLiAgKi8KLQkgICAgaS5zZWdbMF0gPSBpLnNlZ1sxXTsKLQkgIH0KLQllbHNlIGlmICgoaS50bS5vcGVyYW5kX3R5cGVzW21lbV9vcCArIDFdICYgRXNTZWcpICE9IDApCi0JICB7Ci0JICAgIGlmIChpLnNlZ1sxXSAhPSBOVUxMICYmIGkuc2VnWzFdICE9ICZlcykKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiYCVzJyBvcGVyYW5kICVkIG11c3QgdXNlIGAlJWVzJyBzZWdtZW50IiksCi0JCQlpLnRtLm5hbWUsCi0JCQltZW1fb3AgKyAyKTsKLQkJcmV0dXJuOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLQotICAgIC8qIElmIG1hdGNoZWQgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVzIGFuIGV4cGxpY2l0IGluc3RydWN0aW9uIG1uZW1vbmljCi0gICAgICAgc3VmZml4LCB1c2UgaXQuICAqLwotICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIChTaXplMTYgfCBTaXplMzIpKQotICAgICAgewotCWlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIFNpemUxNikKLQkgIGkuc3VmZml4ID0gV09SRF9NTkVNX1NVRkZJWDsKLQllbHNlCi0JICBpLnN1ZmZpeCA9IERXT1JEX01ORU1fU1VGRklYOwotICAgICAgfQotICAgIGVsc2UgaWYgKGkucmVnX29wZXJhbmRzKQotICAgICAgewotCS8qIElmIHRoZXJlJ3Mgbm8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IHdlIHRyeSB0byBpbnZlbnQgb25lCi0JICAgYmFzZWQgb24gcmVnaXN0ZXIgb3BlcmFuZHMuICovCi0JaWYgKCFpLnN1ZmZpeCkKLQkgIHsKLQkgICAgLyogV2UgdGFrZSBpLnN1ZmZpeCBmcm9tIHRoZSBsYXN0IHJlZ2lzdGVyIG9wZXJhbmQgc3BlY2lmaWVkLAotCSAgICAgICBEZXN0aW5hdGlvbiByZWdpc3RlciB0eXBlIGlzIG1vcmUgc2lnbmlmaWNhbnQgdGhhbiBzb3VyY2UKLQkgICAgICAgcmVnaXN0ZXIgdHlwZS4gICovCi0JICAgIGludCBvcDsKLQkgICAgZm9yIChvcCA9IGkub3BlcmFuZHM7IC0tb3AgPj0gMDsgKQotCSAgICAgIGlmIChpLnR5cGVzW29wXSAmIFJlZykKLQkJewotCQkgIGkuc3VmZml4ID0gKChpLnR5cGVzW29wXSAmIFJlZzgpID8gQllURV9NTkVNX1NVRkZJWCA6Ci0JCQkgICAgICAoaS50eXBlc1tvcF0gJiBSZWcxNikgPyBXT1JEX01ORU1fU1VGRklYIDoKLQkJCSAgICAgIERXT1JEX01ORU1fU1VGRklYKTsKLQkJICBicmVhazsKLQkJfQotCSAgfQotCWVsc2UgaWYgKGkuc3VmZml4ID09IEJZVEVfTU5FTV9TVUZGSVgpCi0JICB7Ci0JICAgIGludCBvcDsKLQkgICAgZm9yIChvcCA9IGkub3BlcmFuZHM7IC0tb3AgPj0gMDsgKQotCSAgICAgIHsKLQkJLyogSWYgdGhpcyBpcyBhbiBlaWdodCBiaXQgcmVnaXN0ZXIsIGl0J3MgT0suICBJZiBpdCdzCi0JCSAgIHRoZSAxNiBvciAzMiBiaXQgdmVyc2lvbiBvZiBhbiBlaWdodCBiaXQgcmVnaXN0ZXIsCi0JCSAgIHdlIHdpbGwganVzdCB1c2UgdGhlIGxvdyBwb3J0aW9uLCBhbmQgdGhhdCdzIE9LIHRvby4gKi8KLQkJaWYgKGkudHlwZXNbb3BdICYgUmVnOCkKLQkJICBjb250aW51ZTsKLQotCQkvKiBtb3Z6eCBhbmQgbW92c3ggc2hvdWxkIG5vdCBnZW5lcmF0ZSB0aGlzIHdhcm5pbmcuICovCi0JCWlmIChpbnRlbF9zeW50YXgKLQkJICAgICYmIChpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmI3Ci0JCQl8fCBpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmI2Ci0JCQl8fCBpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmJlCi0JCQl8fCBpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmJmKSkKLQkJICBjb250aW51ZTsKLQotCQlpZiAoKGkudHlwZXNbb3BdICYgV29yZFJlZykgJiYgaS5yZWdzW29wXS0+cmVnX251bSA8IDQKLSNpZiAwCi0JCSAgICAvKiBDaGVjayB0aGF0IHRoZSB0ZW1wbGF0ZSBhbGxvd3MgZWlnaHQgYml0IHJlZ3MKLQkJICAgICAgIFRoaXMga2lsbHMgaW5zbnMgc3VjaCBhcyBgb3JiICQxLCVlZHgnLCB3aGljaAotCQkgICAgICAgbWF5YmUgc2hvdWxkIGJlIGFsbG93ZWQuICAqLwotCQkgICAgJiYgKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiAoUmVnOHxJbk91dFBvcnRSZWcpKQotI2VuZGlmCi0JCSAgICApCi0JCSAgewotI2lmIFJFR0lTVEVSX1dBUk5JTkdTCi0JCSAgICBpZiAoKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiBJbk91dFBvcnRSZWcpID09IDApCi0JCSAgICAgIGFzX3dhcm4gKF8oInVzaW5nIGAlJSVzJyBpbnN0ZWFkIG9mIGAlJSVzJyBkdWUgdG8gYCVjJyBzdWZmaXgiKSwKLQkJCSAgICAgICAoaS5yZWdzW29wXSAtIChpLnR5cGVzW29wXSAmIFJlZzE2ID8gOCA6IDE2KSktPnJlZ19uYW1lLAotCQkJICAgICAgIGkucmVnc1tvcF0tPnJlZ19uYW1lLAotCQkJICAgICAgIGkuc3VmZml4KTsKLSNlbmRpZgotCQkgICAgY29udGludWU7Ci0JCSAgfQotCQkvKiBBbnkgb3RoZXIgcmVnaXN0ZXIgaXMgYmFkICovCi0JCWlmIChpLnR5cGVzW29wXSAmIChSZWcgfCBSZWdNTVggfCBSZWdYTU0KLQkJCQkgICB8IFNSZWcyIHwgU1JlZzMKLQkJCQkgICB8IENvbnRyb2wgfCBEZWJ1ZyB8IFRlc3QKLQkJCQkgICB8IEZsb2F0UmVnIHwgRmxvYXRBY2MpKQotCQkgIHsKLQkJICAgIGFzX2JhZCAoXygiYCUlJXMnIG5vdCBhbGxvd2VkIHdpdGggYCVzJWMnIiksCi0JCQkgICAgaS5yZWdzW29wXS0+cmVnX25hbWUsCi0JCQkgICAgaS50bS5uYW1lLAotCQkJICAgIGkuc3VmZml4KTsKLQkJICAgIHJldHVybjsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCWVsc2UgaWYgKGkuc3VmZml4ID09IERXT1JEX01ORU1fU1VGRklYKQotCSAgewotCSAgICBpbnQgb3A7Ci0JICAgIGZvciAob3AgPSBpLm9wZXJhbmRzOyAtLW9wID49IDA7ICkKLQkgICAgICAvKiBSZWplY3QgZWlnaHQgYml0IHJlZ2lzdGVycywgZXhjZXB0IHdoZXJlIHRoZSB0ZW1wbGF0ZQotCQkgcmVxdWlyZXMgdGhlbS4gKGVnLiBtb3Z6YikgICovCi0JICAgICAgaWYgKChpLnR5cGVzW29wXSAmIFJlZzgpICE9IDAKLQkJICAmJiAoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIChSZWcxNnxSZWczMnxBY2MpKSAhPSAwKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJgJSUlcycgbm90IGFsbG93ZWQgd2l0aCBgJXMlYyciKSwKLQkJCSAgaS5yZWdzW29wXS0+cmVnX25hbWUsCi0JCQkgIGkudG0ubmFtZSwKLQkJCSAgaS5zdWZmaXgpOwotCQkgIHJldHVybjsKLQkJfQotI2lmIFJFR0lTVEVSX1dBUk5JTkdTCi0JICAgICAgLyogV2FybiBpZiB0aGUgZSBwcmVmaXggb24gYSBnZW5lcmFsIHJlZyBpcyBtaXNzaW5nLiAgKi8KLQkgICAgICBlbHNlIGlmICgoaS50eXBlc1tvcF0gJiBSZWcxNikgIT0gMAotCQkgICAgICAgJiYgKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiAoUmVnMzJ8QWNjKSkgIT0gMCkKLQkJewotCQkgIGFzX3dhcm4gKF8oInVzaW5nIGAlJSVzJyBpbnN0ZWFkIG9mIGAlJSVzJyBkdWUgdG8gYCVjJyBzdWZmaXgiKSwKLQkJCSAgIChpLnJlZ3Nbb3BdICsgOCktPnJlZ19uYW1lLAotCQkJICAgaS5yZWdzW29wXS0+cmVnX25hbWUsCi0JCQkgICBpLnN1ZmZpeCk7Ci0JCX0KLSNlbmRpZgotCSAgfQotCWVsc2UgaWYgKGkuc3VmZml4ID09IFdPUkRfTU5FTV9TVUZGSVgpCi0JICB7Ci0JICAgIGludCBvcDsKLQkgICAgZm9yIChvcCA9IGkub3BlcmFuZHM7IC0tb3AgPj0gMDsgKQotCSAgICAgIC8qIFJlamVjdCBlaWdodCBiaXQgcmVnaXN0ZXJzLCBleGNlcHQgd2hlcmUgdGhlIHRlbXBsYXRlCi0JCSByZXF1aXJlcyB0aGVtLiAoZWcuIG1vdnpiKSAgKi8KLQkgICAgICBpZiAoKGkudHlwZXNbb3BdICYgUmVnOCkgIT0gMAotCQkgICYmIChpLnRtLm9wZXJhbmRfdHlwZXNbb3BdICYgKFJlZzE2fFJlZzMyfEFjYykpICE9IDApCi0JCXsKLQkJICBhc19iYWQgKF8oImAlJSVzJyBub3QgYWxsb3dlZCB3aXRoIGAlcyVjJyIpLAotCQkJICBpLnJlZ3Nbb3BdLT5yZWdfbmFtZSwKLQkJCSAgaS50bS5uYW1lLAotCQkJICBpLnN1ZmZpeCk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0jaWYgUkVHSVNURVJfV0FSTklOR1MKLQkgICAgICAvKiBXYXJuIGlmIHRoZSBlIHByZWZpeCBvbiBhIGdlbmVyYWwgcmVnIGlzIHByZXNlbnQuICAqLwotCSAgICAgIGVsc2UgaWYgKChpLnR5cGVzW29wXSAmIFJlZzMyKSAhPSAwCi0JCSAgICAgICAmJiAoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIChSZWcxNnxBY2MpKSAhPSAwKQotCQl7Ci0JCSAgYXNfd2FybiAoXygidXNpbmcgYCUlJXMnIGluc3RlYWQgb2YgYCUlJXMnIGR1ZSB0byBgJWMnIHN1ZmZpeCIpLAotCQkJICAgKGkucmVnc1tvcF0gLSA4KS0+cmVnX25hbWUsCi0JCQkgICBpLnJlZ3Nbb3BdLT5yZWdfbmFtZSwKLQkJCSAgIGkuc3VmZml4KTsKLQkJfQotI2VuZGlmCi0JICB9Ci0JZWxzZQotCSAgYWJvcnQoKTsKLSAgICAgIH0KLSAgICBlbHNlIGlmICgoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBEZWZhdWx0U2l6ZSkgJiYgIWkuc3VmZml4KQotICAgICAgewotCWkuc3VmZml4ID0gc3RhY2tvcF9zaXplOwotICAgICAgfQotCi0gICAgLyogTWFrZSBzdGlsbCB1bnJlc29sdmVkIGltbWVkaWF0ZSBtYXRjaGVzIGNvbmZvcm0gdG8gc2l6ZSBvZiBpbW1lZGlhdGUKLSAgICAgICBnaXZlbiBpbiBpLnN1ZmZpeC4gIE5vdGU6IG92ZXJsYXAyIGNhbm5vdCBiZSBhbiBpbW1lZGlhdGUhICAqLwotICAgIGlmICgob3ZlcmxhcDAgJiAoSW1tOCB8IEltbThTIHwgSW1tMTYgfCBJbW0zMikpCi0JJiYgb3ZlcmxhcDAgIT0gSW1tOCAmJiBvdmVybGFwMCAhPSBJbW04UwotCSYmIG92ZXJsYXAwICE9IEltbTE2ICYmIG92ZXJsYXAwICE9IEltbTMyKQotICAgICAgewotCWlmIChpLnN1ZmZpeCkKLQkgIHsKLQkgICAgb3ZlcmxhcDAgJj0gKGkuc3VmZml4ID09IEJZVEVfTU5FTV9TVUZGSVggPyAoSW1tOCB8IEltbThTKSA6Ci0JCQkgKGkuc3VmZml4ID09IFdPUkRfTU5FTV9TVUZGSVggPyBJbW0xNiA6IEltbTMyKSk7Ci0JICB9Ci0JZWxzZSBpZiAob3ZlcmxhcDAgPT0gKEltbTE2IHwgSW1tMzIpKQotCSAgewotCSAgICBvdmVybGFwMCA9Ci0JICAgICAgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtEQVRBX1BSRUZJWF0gIT0gMCkpID8gSW1tMTYgOiBJbW0zMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGFzX2JhZCAoXygibm8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGdpdmVuOyBjYW4ndCBkZXRlcm1pbmUgaW1tZWRpYXRlIHNpemUiKSk7Ci0JICAgIHJldHVybjsKLQkgIH0KLSAgICAgIH0KLSAgICBpZiAoKG92ZXJsYXAxICYgKEltbTggfCBJbW04UyB8IEltbTE2IHwgSW1tMzIpKQotCSYmIG92ZXJsYXAxICE9IEltbTggJiYgb3ZlcmxhcDEgIT0gSW1tOFMKLQkmJiBvdmVybGFwMSAhPSBJbW0xNiAmJiBvdmVybGFwMSAhPSBJbW0zMikKLSAgICAgIHsKLQlpZiAoaS5zdWZmaXgpCi0JICB7Ci0JICAgIG92ZXJsYXAxICY9IChpLnN1ZmZpeCA9PSBCWVRFX01ORU1fU1VGRklYID8gKEltbTggfCBJbW04UykgOgotCQkJIChpLnN1ZmZpeCA9PSBXT1JEX01ORU1fU1VGRklYID8gSW1tMTYgOiBJbW0zMikpOwotCSAgfQotCWVsc2UgaWYgKG92ZXJsYXAxID09IChJbW0xNiB8IEltbTMyKSkKLQkgIHsKLQkgICAgb3ZlcmxhcDEgPQotCSAgICAgIChmbGFnXzE2Yml0X2NvZGUgXiAoaS5wcmVmaXhbREFUQV9QUkVGSVhdICE9IDApKSA/IEltbTE2IDogSW1tMzI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBhc19iYWQgKF8oIm5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBnaXZlbjsgY2FuJ3QgZGV0ZXJtaW5lIGltbWVkaWF0ZSBzaXplIikpOwotCSAgICByZXR1cm47Ci0JICB9Ci0gICAgICB9Ci0gICAgYXNzZXJ0ICgob3ZlcmxhcDIgJiBJbW0pID09IDApOwotCi0gICAgaS50eXBlc1swXSA9IG92ZXJsYXAwOwotICAgIGlmIChvdmVybGFwMCAmIEltcGxpY2l0UmVnaXN0ZXIpCi0gICAgICBpLnJlZ19vcGVyYW5kcy0tOwotICAgIGlmIChvdmVybGFwMCAmIEltbTEpCi0gICAgICBpLmltbV9vcGVyYW5kcyA9IDA7CS8qIGtsdWRnZSBmb3Igc2hpZnQgaW5zbnMgKi8KLQotICAgIGkudHlwZXNbMV0gPSBvdmVybGFwMTsKLSAgICBpZiAob3ZlcmxhcDEgJiBJbXBsaWNpdFJlZ2lzdGVyKQotICAgICAgaS5yZWdfb3BlcmFuZHMtLTsKLQotICAgIGkudHlwZXNbMl0gPSBvdmVybGFwMjsKLSAgICBpZiAob3ZlcmxhcDIgJiBJbXBsaWNpdFJlZ2lzdGVyKQotICAgICAgaS5yZWdfb3BlcmFuZHMtLTsKLQotICAgIC8qIEZpbmFsaXplIG9wY29kZS4gIEZpcnN0LCB3ZSBjaGFuZ2UgdGhlIG9wY29kZSBiYXNlZCBvbiB0aGUgb3BlcmFuZAotICAgICAgIHNpemUgZ2l2ZW4gYnkgaS5zdWZmaXg6ICBXZSBuZWVkIG5vdCBjaGFuZ2UgdGhpbmdzIGZvciBieXRlIGluc25zLiAgKi8KLQotICAgIGlmICghaS5zdWZmaXggJiYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgVykpCi0gICAgICB7Ci0JYXNfYmFkIChfKCJubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggZ2l2ZW4gYW5kIG5vIHJlZ2lzdGVyIG9wZXJhbmRzOyBjYW4ndCBzaXplIGluc3RydWN0aW9uIikpOwotCXJldHVybjsKLSAgICAgIH0KLQotICAgIC8qIEZvciBtb3Z6eCBhbmQgbW92c3gsIG5lZWQgdG8gY2hlY2sgdGhlIHJlZ2lzdGVyIHR5cGUgKi8KLSAgICBpZiAoaW50ZWxfc3ludGF4Ci0JJiYgKGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYjYgfHwgaS50bS5iYXNlX29wY29kZSA9PSAweGZiZSkpCi0gICAgICBpZiAoaS5zdWZmaXggJiYgaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgcHJlZml4ID0gREFUQV9QUkVGSVhfT1BDT0RFOwotCi0JICBpZiAoKGkucmVnc1sxXS0+cmVnX3R5cGUgJiBSZWcxNikgIT0gMCkKLQkgICAgaWYgKCFhZGRfcHJlZml4IChwcmVmaXgpKQotCSAgICAgIHJldHVybjsKLQl9Ci0KLSAgICBpZiAoaS5zdWZmaXggJiYgaS5zdWZmaXggIT0gQllURV9NTkVNX1NVRkZJWCkKLSAgICAgIHsKLQkvKiBJdCdzIG5vdCBhIGJ5dGUsIHNlbGVjdCB3b3JkL2R3b3JkIG9wZXJhdGlvbi4gICovCi0JaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgVykKLQkgIHsKLQkgICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgU2hvcnRGb3JtKQotCSAgICAgIGkudG0uYmFzZV9vcGNvZGUgfD0gODsKLQkgICAgZWxzZQotCSAgICAgIGkudG0uYmFzZV9vcGNvZGUgfD0gMTsKLQkgIH0KLQkvKiBOb3cgc2VsZWN0IGJldHdlZW4gd29yZCAmIGR3b3JkIG9wZXJhdGlvbnMgdmlhIHRoZSBvcGVyYW5kCi0JICAgc2l6ZSBwcmVmaXgsIGV4Y2VwdCBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgd2lsbCBpZ25vcmUgdGhpcwotCSAgIHByZWZpeCBhbnl3YXkuICAqLwotCWlmICgoKGludGVsX3N5bnRheCAmJiAoaS5zdWZmaXggPT0gSU5URUxfRFdPUkRfTU5FTV9TVUZGSVgpKQotCSAgICAgfHwgaS5zdWZmaXggPT0gRFdPUkRfTU5FTV9TVUZGSVgKLQkgICAgIHx8IGkuc3VmZml4ID09IExPTkdfTU5FTV9TVUZGSVgpID09IGZsYWdfMTZiaXRfY29kZQotCSAgICAmJiAhKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSWdub3JlU2l6ZSkpCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBwcmVmaXggPSBEQVRBX1BSRUZJWF9PUENPREU7Ci0JICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEp1bXBCeXRlKSAvKiBqY3h6LCBsb29wICovCi0JICAgICAgcHJlZml4ID0gQUREUl9QUkVGSVhfT1BDT0RFOwotCi0JICAgIGlmICghIGFkZF9wcmVmaXggKHByZWZpeCkpCi0JICAgICAgcmV0dXJuOwotCSAgfQotCS8qIFNpemUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24uICAqLwotCWlmIChpLnN1ZmZpeCA9PSBMT05HX01ORU1fU1VGRklYCi0JICAgIHx8IChpbnRlbF9zeW50YXggJiYgaS5zdWZmaXggPT0gSU5URUxfRFdPUkRfTU5FTV9TVUZGSVgpKQotCSAgewotCSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBGbG9hdE1GKQotCSAgICAgIGkudG0uYmFzZV9vcGNvZGUgXj0gNDsKLQkgIH0KLSAgICAgIH0KLQotICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEltbUV4dCkKLSAgICAgIHsKLQkvKiBUaGVzZSBBTUQgM0ROb3chIGFuZCBJbnRlbCBLYXRtYWkgTmV3IEluc3RydWN0aW9ucyBoYXZlIGFuCi0JICAgb3Bjb2RlIHN1ZmZpeCB3aGljaCBpcyBjb2RlZCBpbiB0aGUgc2FtZSBwbGFjZSBhcyBhbiA4LWJpdAotCSAgIGltbWVkaWF0ZSBmaWVsZCB3b3VsZCBiZS4gIEhlcmUgd2UgZmFrZSBhbiA4LWJpdCBpbW1lZGlhdGUKLQkgICBvcGVyYW5kIGZyb20gdGhlIG9wY29kZSBzdWZmaXggc3RvcmVkIGluIHRtLmV4dGVuc2lvbl9vcGNvZGUuICAqLwotCi0JZXhwcmVzc2lvblMgKmV4cDsKLQotCWFzc2VydChpLmltbV9vcGVyYW5kcyA9PSAwICYmIGkub3BlcmFuZHMgPD0gMik7Ci0KLQlleHAgPSAmaW1fZXhwcmVzc2lvbnNbaS5pbW1fb3BlcmFuZHMrK107Ci0JaS5pbW1zW2kub3BlcmFuZHNdID0gZXhwOwotCWkudHlwZXNbaS5vcGVyYW5kcysrXSA9IEltbTg7Ci0JZXhwLT5YX29wID0gT19jb25zdGFudDsKLQlleHAtPlhfYWRkX251bWJlciA9IGkudG0uZXh0ZW5zaW9uX29wY29kZTsKLQlpLnRtLmV4dGVuc2lvbl9vcGNvZGUgPSBOb25lOwotICAgICAgfQotCi0gICAgLyogRm9yIGluc25zIHdpdGggb3BlcmFuZHMgdGhlcmUgYXJlIG1vcmUgZGlkZGxlcyB0byBkbyB0byB0aGUgb3Bjb2RlLiAqLwotICAgIGlmIChpLm9wZXJhbmRzKQotICAgICAgewotCS8qIERlZmF1bHQgc2VnbWVudCByZWdpc3RlciB0aGlzIGluc3RydWN0aW9uIHdpbGwgdXNlCi0JICAgZm9yIG1lbW9yeSBhY2Nlc3Nlcy4gIDAgbWVhbnMgdW5rbm93bi4KLQkgICBUaGlzIGlzIG9ubHkgZm9yIG9wdGltaXppbmcgb3V0IHVubmVjZXNzYXJ5IHNlZ21lbnQgb3ZlcnJpZGVzLiAgKi8KLQljb25zdCBzZWdfZW50cnkgKmRlZmF1bHRfc2VnID0gMDsKLQotCS8qIElmIHdlIGZvdW5kIGEgcmV2ZXJzZSBtYXRjaCB3ZSBtdXN0IGFsdGVyIHRoZSBvcGNvZGUKLQkgICBkaXJlY3Rpb24gYml0LiAgZm91bmRfcmV2ZXJzZV9tYXRjaCBob2xkcyBiaXRzIHRvIGNoYW5nZQotCSAgIChkaWZmZXJlbnQgZm9yIGludCAmIGZsb2F0IGluc25zKS4gICovCi0KLQlpLnRtLmJhc2Vfb3Bjb2RlIF49IGZvdW5kX3JldmVyc2VfbWF0Y2g7Ci0KLQkvKiBUaGUgaW11bCAkaW1tLCAlcmVnIGluc3RydWN0aW9uIGlzIGNvbnZlcnRlZCBpbnRvCi0JICAgaW11bCAkaW1tLCAlcmVnLCAlcmVnLCBhbmQgdGhlIGNsciAlcmVnIGluc3RydWN0aW9uCi0JICAgaXMgY29udmVydGVkIGludG8geG9yICVyZWcsICVyZWcuICAqLwotCWlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIHJlZ0tsdWRnZSkKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IGZpcnN0X3JlZ19vcCA9IChpLnR5cGVzWzBdICYgUmVnKSA/IDAgOiAxOwotCSAgICAvKiBQcmV0ZW5kIHdlIHNhdyB0aGUgZXh0cmEgcmVnaXN0ZXIgb3BlcmFuZC4gKi8KLQkgICAgaS5yZWdzW2ZpcnN0X3JlZ19vcCsxXSA9IGkucmVnc1tmaXJzdF9yZWdfb3BdOwotCSAgICBpLnJlZ19vcGVyYW5kcyA9IDI7Ci0JICB9Ci0KLQlpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBTaG9ydEZvcm0pCi0JICB7Ci0JICAgIC8qIFRoZSByZWdpc3RlciBvciBmbG9hdCByZWdpc3RlciBvcGVyYW5kIGlzIGluIG9wZXJhbmQgMCBvciAxLiAqLwotCSAgICB1bnNpZ25lZCBpbnQgb3AgPSAoaS50eXBlc1swXSAmIChSZWcgfCBGbG9hdFJlZykpID8gMCA6IDE7Ci0JICAgIC8qIFJlZ2lzdGVyIGdvZXMgaW4gbG93IDMgYml0cyBvZiBvcGNvZGUuICovCi0JICAgIGkudG0uYmFzZV9vcGNvZGUgfD0gaS5yZWdzW29wXS0+cmVnX251bTsKLQkgICAgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllciAmIFVnaCkgIT0gMCkKLQkgICAgICB7Ci0JCS8qIFdhcm4gYWJvdXQgc29tZSBjb21tb24gZXJyb3JzLCBidXQgcHJlc3Mgb24gcmVnYXJkbGVzcy4KLQkJICAgVGhlIGZpcnN0IGNhc2UgY2FuIGJlIGdlbmVyYXRlZCBieSBnY2MgKDw9IDIuOC4xKS4gICovCi0JCWlmIChpLm9wZXJhbmRzID09IDIpCi0JCSAgewotCQkgICAgLyogcmV2ZXJzZWQgYXJndW1lbnRzIG9uIGZhZGRwLCBmc3VicCwgZXRjLiAqLwotCQkgICAgYXNfd2FybiAoXygidHJhbnNsYXRpbmcgdG8gYCVzICUlJXMsJSUlcyciKSwgaS50bS5uYW1lLAotCQkJICAgICBpLnJlZ3NbMV0tPnJlZ19uYW1lLAotCQkJICAgICBpLnJlZ3NbMF0tPnJlZ19uYW1lKTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICAvKiBleHRyYW5lb3VzIGBsJyBzdWZmaXggb24gZnAgaW5zbiAqLwotCQkgICAgYXNfd2FybiAoXygidHJhbnNsYXRpbmcgdG8gYCVzICUlJXMnIiksIGkudG0ubmFtZSwKLQkJCSAgICAgaS5yZWdzWzBdLT5yZWdfbmFtZSk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQllbHNlIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIE1vZHJtKQotCSAgewotCSAgICAvKiBUaGUgb3Bjb2RlIGlzIGNvbXBsZXRlZCAobW9kdWxvIGkudG0uZXh0ZW5zaW9uX29wY29kZSB3aGljaAotCSAgICAgICBtdXN0IGJlIHB1dCBpbnRvIHRoZSBtb2RybSBieXRlKS4KLQkgICAgICAgTm93LCB3ZSBtYWtlIHRoZSBtb2RybSAmIGluZGV4IGJhc2UgYnl0ZXMgYmFzZWQgb24gYWxsIHRoZQotCSAgICAgICBpbmZvIHdlJ3ZlIGNvbGxlY3RlZC4gKi8KLQotCSAgICAvKiBpLnJlZ19vcGVyYW5kcyBNVVNUIGJlIHRoZSBudW1iZXIgb2YgcmVhbCByZWdpc3RlciBvcGVyYW5kczsKLQkgICAgICAgaW1wbGljaXQgcmVnaXN0ZXJzIGRvIG5vdCBjb3VudC4gKi8KLQkgICAgaWYgKGkucmVnX29wZXJhbmRzID09IDIpCi0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgc291cmNlLCBkZXN0OwotCQlzb3VyY2UgPSAoKGkudHlwZXNbMF0KLQkJCSAgICYgKFJlZyB8IFJlZ01NWCB8IFJlZ1hNTQotCQkJICAgICAgfCBTUmVnMiB8IFNSZWczCi0JCQkgICAgICB8IENvbnRyb2wgfCBEZWJ1ZyB8IFRlc3QpKQotCQkJICA/IDAgOiAxKTsKLQkJZGVzdCA9IHNvdXJjZSArIDE7Ci0KLQkJaS5ybS5tb2RlID0gMzsKLQkJLyogT25lIG9mIHRoZSByZWdpc3RlciBvcGVyYW5kcyB3aWxsIGJlIGVuY29kZWQgaW4gdGhlCi0JCSAgIGkudG0ucmVnIGZpZWxkLCB0aGUgb3RoZXIgaW4gdGhlIGNvbWJpbmVkIGkudG0ubW9kZQotCQkgICBhbmQgaS50bS5yZWdtZW0gZmllbGRzLiAgSWYgbm8gZm9ybSBvZiB0aGlzCi0JCSAgIGluc3RydWN0aW9uIHN1cHBvcnRzIGEgbWVtb3J5IGRlc3RpbmF0aW9uIG9wZXJhbmQsCi0JCSAgIHRoZW4gd2UgYXNzdW1lIHRoZSBzb3VyY2Ugb3BlcmFuZCBtYXkgc29tZXRpbWVzIGJlCi0JCSAgIGEgbWVtb3J5IG9wZXJhbmQgYW5kIHNvIHdlIG5lZWQgdG8gc3RvcmUgdGhlCi0JCSAgIGRlc3RpbmF0aW9uIGluIHRoZSBpLnJtLnJlZyBmaWVsZC4gICovCi0JCWlmICgoaS50bS5vcGVyYW5kX3R5cGVzW2Rlc3RdICYgQW55TWVtKSA9PSAwKQotCQkgIHsKLQkJICAgIGkucm0ucmVnID0gaS5yZWdzW2Rlc3RdLT5yZWdfbnVtOwotCQkgICAgaS5ybS5yZWdtZW0gPSBpLnJlZ3Nbc291cmNlXS0+cmVnX251bTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpLnJtLnJlZyA9IGkucmVnc1tzb3VyY2VdLT5yZWdfbnVtOwotCQkgICAgaS5ybS5yZWdtZW0gPSBpLnJlZ3NbZGVzdF0tPnJlZ19udW07Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsJCQkvKiBpZiBpdCdzIG5vdCAyIHJlZyBvcGVyYW5kcy4uLiAqLwotCQlpZiAoaS5tZW1fb3BlcmFuZHMpCi0JCSAgewotCQkgICAgdW5zaWduZWQgaW50IGZha2VfemVyb19kaXNwbGFjZW1lbnQgPSAwOwotCQkgICAgdW5zaWduZWQgaW50IG9wID0gKChpLnR5cGVzWzBdICYgQW55TWVtKQotCQkJCSAgICAgICA/IDAKLQkJCQkgICAgICAgOiAoaS50eXBlc1sxXSAmIEFueU1lbSkgPyAxIDogMik7Ci0KLQkJICAgIGRlZmF1bHRfc2VnID0gJmRzOwotCi0JCSAgICBpZiAoISBpLmJhc2VfcmVnKQotCQkgICAgICB7Ci0JCQlpLnJtLm1vZGUgPSAwOwotCQkJaWYgKCEgaS5kaXNwX29wZXJhbmRzKQotCQkJICBmYWtlX3plcm9fZGlzcGxhY2VtZW50ID0gMTsKLQkJCWlmICghIGkuaW5kZXhfcmVnKQotCQkJICB7Ci0JCQkgICAgLyogT3BlcmFuZCBpcyBqdXN0IDxkaXNwPiAqLwotCQkJICAgIGlmIChmbGFnXzE2Yml0X2NvZGUgXiAoaS5wcmVmaXhbQUREUl9QUkVGSVhdICE9IDApKQotCQkJICAgICAgewotCQkJCWkucm0ucmVnbWVtID0gTk9fQkFTRV9SRUdJU1RFUl8xNjsKLQkJCQlpLnR5cGVzW29wXSAmPSB+RGlzcDsKLQkJCQlpLnR5cGVzW29wXSB8PSBEaXNwMTY7Ci0JCQkgICAgICB9Ci0JCQkgICAgZWxzZQotCQkJICAgICAgewotCQkJCWkucm0ucmVnbWVtID0gTk9fQkFTRV9SRUdJU1RFUjsKLQkJCQlpLnR5cGVzW29wXSAmPSB+RGlzcDsKLQkJCQlpLnR5cGVzW29wXSB8PSBEaXNwMzI7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQkJCWVsc2UgLyogISBpLmJhc2VfcmVnICYmIGkuaW5kZXhfcmVnICovCi0JCQkgIHsKLQkJCSAgICBpLnNpYi5pbmRleCA9IGkuaW5kZXhfcmVnLT5yZWdfbnVtOwotCQkJICAgIGkuc2liLmJhc2UgPSBOT19CQVNFX1JFR0lTVEVSOwotCQkJICAgIGkuc2liLnNjYWxlID0gaS5sb2cyX3NjYWxlX2ZhY3RvcjsKLQkJCSAgICBpLnJtLnJlZ21lbSA9IEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HOwotCQkJICAgIGkudHlwZXNbb3BdICY9IH5EaXNwOwotCQkJICAgIGkudHlwZXNbb3BdIHw9IERpc3AzMjsJLyogTXVzdCBiZSAzMiBiaXQgKi8KLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChpLmJhc2VfcmVnLT5yZWdfdHlwZSAmIFJlZzE2KQotCQkgICAgICB7Ci0JCQlzd2l0Y2ggKGkuYmFzZV9yZWctPnJlZ19udW0pCi0JCQkgIHsKLQkJCSAgY2FzZSAzOiAvKiAoJWJ4KSAqLwotCQkJICAgIGlmICghIGkuaW5kZXhfcmVnKQotCQkJICAgICAgaS5ybS5yZWdtZW0gPSA3OwotCQkJICAgIGVsc2UgLyogKCVieCwlc2kpIC0+IDAsIG9yICglYngsJWRpKSAtPiAxICovCi0JCQkgICAgICBpLnJtLnJlZ21lbSA9IGkuaW5kZXhfcmVnLT5yZWdfbnVtIC0gNjsKLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSA1OiAvKiAoJWJwKSAqLwotCQkJICAgIGRlZmF1bHRfc2VnID0gJnNzOwotCQkJICAgIGlmICghIGkuaW5kZXhfcmVnKQotCQkJICAgICAgewotCQkJCWkucm0ucmVnbWVtID0gNjsKLQkJCQlpZiAoKGkudHlwZXNbb3BdICYgRGlzcCkgPT0gMCkKLQkJCQkgIHsKLQkJCQkgICAgLyogZmFrZSAoJWJwKSBpbnRvIDAoJWJwKSAqLwotCQkJCSAgICBpLnR5cGVzW29wXSB8PSBEaXNwODsKLQkJCQkgICAgZmFrZV96ZXJvX2Rpc3BsYWNlbWVudCA9IDE7Ci0JCQkJICB9Ci0JCQkgICAgICB9Ci0JCQkgICAgZWxzZSAvKiAoJWJwLCVzaSkgLT4gMiwgb3IgKCVicCwlZGkpIC0+IDMgKi8KLQkJCSAgICAgIGkucm0ucmVnbWVtID0gaS5pbmRleF9yZWctPnJlZ19udW0gLSA2ICsgMjsKLQkJCSAgICBicmVhazsKLQkJCSAgZGVmYXVsdDogLyogKCVzaSkgLT4gNCBvciAoJWRpKSAtPiA1ICovCi0JCQkgICAgaS5ybS5yZWdtZW0gPSBpLmJhc2VfcmVnLT5yZWdfbnVtIC0gNiArIDQ7Ci0JCQkgIH0KLQkJCWkucm0ubW9kZSA9IG1vZGVfZnJvbV9kaXNwX3NpemUgKGkudHlwZXNbb3BdKTsKLQkJICAgICAgfQotCQkgICAgZWxzZSAvKiBpLmJhc2VfcmVnIGFuZCAzMiBiaXQgbW9kZSAqLwotCQkgICAgICB7Ci0JCQlpLnJtLnJlZ21lbSA9IGkuYmFzZV9yZWctPnJlZ19udW07Ci0JCQlpLnNpYi5iYXNlID0gaS5iYXNlX3JlZy0+cmVnX251bTsKLQkJCWlmIChpLmJhc2VfcmVnLT5yZWdfbnVtID09IEVCUF9SRUdfTlVNKQotCQkJICB7Ci0JCQkgICAgZGVmYXVsdF9zZWcgPSAmc3M7Ci0JCQkgICAgaWYgKGkuZGlzcF9vcGVyYW5kcyA9PSAwKQotCQkJICAgICAgewotCQkJCWZha2VfemVyb19kaXNwbGFjZW1lbnQgPSAxOwotCQkJCWkudHlwZXNbb3BdIHw9IERpc3A4OwotCQkJICAgICAgfQotCQkJICB9Ci0JCQllbHNlIGlmIChpLmJhc2VfcmVnLT5yZWdfbnVtID09IEVTUF9SRUdfTlVNKQotCQkJICB7Ci0JCQkgICAgZGVmYXVsdF9zZWcgPSAmc3M7Ci0JCQkgIH0KLQkJCWkuc2liLnNjYWxlID0gaS5sb2cyX3NjYWxlX2ZhY3RvcjsKLQkJCWlmICghIGkuaW5kZXhfcmVnKQotCQkJICB7Ci0JCQkgICAgLyogPGRpc3A+KCVlc3ApIGJlY29tZXMgdHdvIGJ5dGUgbW9kcm0KLQkJCSAgICAgICB3aXRoIG5vIGluZGV4IHJlZ2lzdGVyLiAgV2UndmUgYWxyZWFkeQotCQkJICAgICAgIHN0b3JlZCB0aGUgY29kZSBmb3IgZXNwIGluIGkucm0ucmVnbWVtCi0JCQkgICAgICAgaWUuIEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HLiAgQW55Ci0JCQkgICAgICAgYmFzZSByZWdpc3RlciBiZXNpZGVzICVlc3Agd2lsbCBub3QgdXNlCi0JCQkgICAgICAgdGhlIGV4dHJhIG1vZHJtIGJ5dGUuICAqLwotCQkJICAgIGkuc2liLmluZGV4ID0gTk9fSU5ERVhfUkVHSVNURVI7Ci0jaWYgISBTQ0FMRTFfV0hFTl9OT19JTkRFWAotCQkJICAgIC8qIEFub3RoZXIgY2FzZSB3aGVyZSB3ZSBmb3JjZSB0aGUgc2Vjb25kCi0JCQkgICAgICAgbW9kcm0gYnl0ZS4gICovCi0JCQkgICAgaWYgKGkubG9nMl9zY2FsZV9mYWN0b3IpCi0JCQkgICAgICBpLnJtLnJlZ21lbSA9IEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HOwotI2VuZGlmCi0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGkuc2liLmluZGV4ID0gaS5pbmRleF9yZWctPnJlZ19udW07Ci0JCQkgICAgaS5ybS5yZWdtZW0gPSBFU0NBUEVfVE9fVFdPX0JZVEVfQUREUkVTU0lORzsKLQkJCSAgfQotCQkJaS5ybS5tb2RlID0gbW9kZV9mcm9tX2Rpc3Bfc2l6ZSAoaS50eXBlc1tvcF0pOwotCQkgICAgICB9Ci0KLQkJICAgIGlmIChmYWtlX3plcm9fZGlzcGxhY2VtZW50KQotCQkgICAgICB7Ci0JCQkvKiBGYWtlcyBhIHplcm8gZGlzcGxhY2VtZW50IGFzc3VtaW5nIHRoYXQgaS50eXBlc1tvcF0KLQkJCSAgIGhvbGRzIHRoZSBjb3JyZWN0IGRpc3BsYWNlbWVudCBzaXplLiAqLwotCQkJZXhwcmVzc2lvblMgKmV4cDsKLQotCQkJZXhwID0gJmRpc3BfZXhwcmVzc2lvbnNbaS5kaXNwX29wZXJhbmRzKytdOwotCQkJaS5kaXNwc1tvcF0gPSBleHA7Ci0JCQlleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotCQkJZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotCQkJZXhwLT5YX2FkZF9zeW1ib2wgPSAoc3ltYm9sUyAqKSAwOwotCQkJZXhwLT5YX29wX3N5bWJvbCA9IChzeW1ib2xTICopIDA7Ci0JCSAgICAgIH0KLQkJICB9Ci0KLQkJLyogRmlsbCBpbiBpLnJtLnJlZyBvciBpLnJtLnJlZ21lbSBmaWVsZCB3aXRoIHJlZ2lzdGVyCi0JCSAgIG9wZXJhbmQgKGlmIGFueSkgYmFzZWQgb24gaS50bS5leHRlbnNpb25fb3Bjb2RlLgotCQkgICBBZ2Fpbiwgd2UgbXVzdCBiZSBjYXJlZnVsIHRvIG1ha2Ugc3VyZSB0aGF0Ci0JCSAgIHNlZ21lbnQvY29udHJvbC9kZWJ1Zy90ZXN0L01NWCByZWdpc3RlcnMgYXJlIGNvZGVkCi0JCSAgIGludG8gdGhlIGkucm0ucmVnIGZpZWxkLiAqLwotCQlpZiAoaS5yZWdfb3BlcmFuZHMpCi0JCSAgewotCQkgICAgdW5zaWduZWQgaW50IG9wID0KLQkJICAgICAgKChpLnR5cGVzWzBdCi0JCQkmIChSZWcgfCBSZWdNTVggfCBSZWdYTU0KLQkJCSAgIHwgU1JlZzIgfCBTUmVnMwotCQkJICAgfCBDb250cm9sIHwgRGVidWcgfCBUZXN0KSkKLQkJICAgICAgID8gMAotCQkgICAgICAgOiAoKGkudHlwZXNbMV0KLQkJCSAgICYgKFJlZyB8IFJlZ01NWCB8IFJlZ1hNTQotCQkJICAgICAgfCBTUmVnMiB8IFNSZWczCi0JCQkgICAgICB8IENvbnRyb2wgfCBEZWJ1ZyB8IFRlc3QpKQotCQkJICA/IDEKLQkJCSAgOiAyKSk7Ci0JCSAgICAvKiBJZiB0aGVyZSBpcyBhbiBleHRlbnNpb24gb3Bjb2RlIHRvIHB1dCBoZXJlLCB0aGUKLQkJICAgICAgIHJlZ2lzdGVyIG51bWJlciBtdXN0IGJlIHB1dCBpbnRvIHRoZSByZWdtZW0gZmllbGQuICovCi0JCSAgICBpZiAoaS50bS5leHRlbnNpb25fb3Bjb2RlICE9IE5vbmUpCi0JCSAgICAgIGkucm0ucmVnbWVtID0gaS5yZWdzW29wXS0+cmVnX251bTsKLQkJICAgIGVsc2UKLQkJICAgICAgaS5ybS5yZWcgPSBpLnJlZ3Nbb3BdLT5yZWdfbnVtOwotCi0JCSAgICAvKiBOb3csIGlmIG5vIG1lbW9yeSBvcGVyYW5kIGhhcyBzZXQgaS5ybS5tb2RlID0gMCwgMSwgMgotCQkgICAgICAgd2UgbXVzdCBzZXQgaXQgdG8gMyB0byBpbmRpY2F0ZSB0aGlzIGlzIGEgcmVnaXN0ZXIKLQkJICAgICAgIG9wZXJhbmQgaW4gdGhlIHJlZ21lbSBmaWVsZC4gICovCi0JCSAgICBpZiAoIWkubWVtX29wZXJhbmRzKQotCQkgICAgICBpLnJtLm1vZGUgPSAzOwotCQkgIH0KLQotCQkvKiBGaWxsIGluIGkucm0ucmVnIGZpZWxkIHdpdGggZXh0ZW5zaW9uIG9wY29kZSAoaWYgYW55KS4gKi8KLQkJaWYgKGkudG0uZXh0ZW5zaW9uX29wY29kZSAhPSBOb25lKQotCQkgIGkucm0ucmVnID0gaS50bS5leHRlbnNpb25fb3Bjb2RlOwotCSAgICAgIH0KLQkgIH0KLQllbHNlIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIChTZWcyU2hvcnRGb3JtIHwgU2VnM1Nob3J0Rm9ybSkpCi0JICB7Ci0JICAgIGlmIChpLnRtLmJhc2Vfb3Bjb2RlID09IFBPUF9TRUdfU0hPUlQgJiYgaS5yZWdzWzBdLT5yZWdfbnVtID09IDEpCi0JICAgICAgewotCQlhc19iYWQgKF8oInlvdSBjYW4ndCBgcG9wICUlY3MnIikpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICBpLnRtLmJhc2Vfb3Bjb2RlIHw9IChpLnJlZ3NbMF0tPnJlZ19udW0gPDwgMyk7Ci0JICB9Ci0JZWxzZSBpZiAoKGkudG0uYmFzZV9vcGNvZGUgJiB+KER8VykpID09IE1PVl9BWF9ESVNQMzIpCi0JICB7Ci0JICAgIGRlZmF1bHRfc2VnID0gJmRzOwotCSAgfQotCWVsc2UgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllciAmIElzU3RyaW5nKSAhPSAwKQotCSAgewotCSAgICAvKiBGb3IgdGhlIHN0cmluZyBpbnN0cnVjdGlvbnMgdGhhdCBhbGxvdyBhIHNlZ21lbnQgb3ZlcnJpZGUKLQkgICAgICAgb24gb25lIG9mIHRoZWlyIG9wZXJhbmRzLCB0aGUgZGVmYXVsdCBzZWdtZW50IGlzIGRzLiAgKi8KLQkgICAgZGVmYXVsdF9zZWcgPSAmZHM7Ci0JICB9Ci0KLQkvKiBJZiBhIHNlZ21lbnQgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLAotCSAgIGFuZCB0aGUgc3BlY2lmaWVkIHNlZ21lbnQgaXMgbm90IHRoZSBkZWZhdWx0LAotCSAgIHVzZSBhbiBvcGNvZGUgcHJlZml4IHRvIHNlbGVjdCBpdC4KLQkgICBJZiB3ZSBuZXZlciBmaWd1cmVkIG91dCB3aGF0IHRoZSBkZWZhdWx0IHNlZ21lbnQgaXMsCi0JICAgdGhlbiBkZWZhdWx0X3NlZyB3aWxsIGJlIHplcm8gYXQgdGhpcyBwb2ludCwKLQkgICBhbmQgdGhlIHNwZWNpZmllZCBzZWdtZW50IHByZWZpeCB3aWxsIGFsd2F5cyBiZSB1c2VkLiAgKi8KLQlpZiAoKGkuc2VnWzBdKSAmJiAoaS5zZWdbMF0gIT0gZGVmYXVsdF9zZWcpKQotCSAgewotCSAgICBpZiAoISBhZGRfcHJlZml4IChpLnNlZ1swXS0+c2VnX3ByZWZpeCkpCi0JICAgICAgcmV0dXJuOwotCSAgfQotICAgICAgfQotICAgIGVsc2UgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllciAmIFVnaCkgIT0gMCkKLSAgICAgIHsKLQkvKiBVbml4V2FyZSBmc3ViIG5vIGFyZ3MgaXMgYWxpYXMgZm9yIGZzdWJwLCBmYWRkIC0+IGZhZGRwLCBldGMuICAqLwotCWFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIHRvIGAlc3AnIiksIGkudG0ubmFtZSk7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBIYW5kbGUgY29udmVyc2lvbiBvZiAnaW50ICQzJyAtLT4gc3BlY2lhbCBpbnQzIGluc24uICovCi0gIGlmIChpLnRtLmJhc2Vfb3Bjb2RlID09IElOVF9PUENPREUgJiYgaS5pbW1zWzBdLT5YX2FkZF9udW1iZXIgPT0gMykKLSAgICB7Ci0gICAgICBpLnRtLmJhc2Vfb3Bjb2RlID0gSU5UM19PUENPREU7Ci0gICAgICBpLmltbV9vcGVyYW5kcyA9IDA7Ci0gICAgfQotCi0gIGlmICgoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiAoSnVtcCB8IEp1bXBCeXRlIHwgSnVtcER3b3JkKSkKLSAgICAgICYmIGkuZGlzcHNbMF0tPlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICAvKiBDb252ZXJ0ICJqbXAgY29uc3RhbnQiIChhbmQgImNhbGwgY29uc3RhbnQiKSB0byBhIGp1bXAgKGNhbGwpIHRvCi0JIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIGdpdmVuIGJ5IHRoZSBjb25zdGFudC4gIFNpbmNlIGl4ODYganVtcHMgYW5kCi0JIGNhbGxzIGFyZSBwYyByZWxhdGl2ZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBhIHJlbG9jLiAgKi8KLSAgICAgIGkuZGlzcHNbMF0tPlhfYWRkX3N5bWJvbCA9ICZhYnNfc3ltYm9sOwotICAgICAgaS5kaXNwc1swXS0+WF9vcCA9IE9fc3ltYm9sOwotICAgIH0KLQotICAvKiBXZSBhcmUgcmVhZHkgdG8gb3V0cHV0IHRoZSBpbnNuLiAqLwotICB7Ci0gICAgcmVnaXN0ZXIgY2hhciAqcDsKLQotICAgIC8qIE91dHB1dCBqdW1wcy4gKi8KLSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBKdW1wKQotICAgICAgewotCWludCBzaXplOwotCWludCBjb2RlMTY7Ci0JaW50IHByZWZpeDsKLQotCWNvZGUxNiA9IDA7Ci0JaWYgKGZsYWdfMTZiaXRfY29kZSkKLQkgIGNvZGUxNiA9IENPREUxNjsKLQotCXByZWZpeCA9IDA7Ci0JaWYgKGkucHJlZml4W0RBVEFfUFJFRklYXSkKLQkgIHsKLQkgICAgcHJlZml4ID0gMTsKLQkgICAgaS5wcmVmaXhlcyAtPSAxOwotCSAgICBjb2RlMTYgXj0gQ09ERTE2OwotCSAgfQotCi0Jc2l6ZSA9IDQ7Ci0JaWYgKGNvZGUxNikKLQkgIHNpemUgPSAyOwotCi0JaWYgKGkucHJlZml4ZXMgIT0gMCAmJiAhaW50ZWxfc3ludGF4KQotCSAgYXNfd2FybiAoXygic2tpcHBpbmcgcHJlZml4ZXMgb24gdGhpcyBpbnN0cnVjdGlvbiIpKTsKLQotCS8qIEl0J3MgYWx3YXlzIGEgc3ltYm9sOyAgRW5kIGZyYWcgJiBzZXR1cCBmb3IgcmVsYXguCi0JICAgTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tIGluIHRoaXMgZnJhZyBmb3IgdGhlIGxhcmdlc3QKLQkgICBpbnN0cnVjdGlvbiB3ZSBtYXkgZ2VuZXJhdGUgaW4gbWRfY29udmVydF9mcmFnLiAgVGhpcyBpcyAyCi0JICAgYnl0ZXMgZm9yIHRoZSBvcGNvZGUgYW5kIHJvb20gZm9yIHRoZSBwcmVmaXggYW5kIGxhcmdlc3QKLQkgICBkaXNwbGFjZW1lbnQuICAqLwotCWZyYWdfZ3JvdyAocHJlZml4ICsgMiArIHNpemUpOwotCWluc25fc2l6ZSArPSBwcmVmaXggKyAxOwotCS8qIFByZWZpeCBhbmQgMSBvcGNvZGUgYnl0ZSBnbyBpbiBmcl9maXguICAqLwotCXAgPSBmcmFnX21vcmUgKHByZWZpeCArIDEpOwotCWlmIChwcmVmaXgpCi0JICAqcCsrID0gREFUQV9QUkVGSVhfT1BDT0RFOwotCSpwID0gaS50bS5iYXNlX29wY29kZTsKLQkvKiAxIHBvc3NpYmxlIGV4dHJhIG9wY29kZSArIGRpc3BsYWNlbWVudCBnbyBpbiBmcl92YXIuICAqLwotCWZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJICAxICsgc2l6ZSwKLQkJICAxLAotCQkgICgodW5zaWduZWQgY2hhcikgKnAgPT0gSlVNUF9QQ19SRUxBVElWRQotCQkgICA/IEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIFNNQUxMKSB8IGNvZGUxNgotCQkgICA6IEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBTTUFMTCkgfCBjb2RlMTYpLAotCQkgIGkuZGlzcHNbMF0tPlhfYWRkX3N5bWJvbCwKLQkJICBpLmRpc3BzWzBdLT5YX2FkZF9udW1iZXIsCi0JCSAgcCk7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiAoSnVtcEJ5dGUgfCBKdW1wRHdvcmQpKQotICAgICAgewotCWludCBzaXplOwotCi0JaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSnVtcEJ5dGUpCi0JICB7Ci0JICAgIC8qIFRoaXMgaXMgYSBsb29wIG9yIGplY3h6IHR5cGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICBzaXplID0gMTsKLQkgICAgaWYgKGkucHJlZml4W0FERFJfUFJFRklYXSkKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSAxOwotCQlGUkFHX0FQUEVORF8xX0NIQVIgKEFERFJfUFJFRklYX09QQ09ERSk7Ci0JCWkucHJlZml4ZXMgLT0gMTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpbnQgY29kZTE2OwotCi0JICAgIGNvZGUxNiA9IDA7Ci0JICAgIGlmIChmbGFnXzE2Yml0X2NvZGUpCi0JICAgICAgY29kZTE2ID0gQ09ERTE2OwotCi0JICAgIGlmIChpLnByZWZpeFtEQVRBX1BSRUZJWF0pCi0JICAgICAgewotCQlpbnNuX3NpemUgKz0gMTsKLQkJRlJBR19BUFBFTkRfMV9DSEFSIChEQVRBX1BSRUZJWF9PUENPREUpOwotCQlpLnByZWZpeGVzIC09IDE7Ci0JCWNvZGUxNiBePSBDT0RFMTY7Ci0JICAgICAgfQotCi0JICAgIHNpemUgPSA0OwotCSAgICBpZiAoY29kZTE2KQotCSAgICAgIHNpemUgPSAyOwotCSAgfQotCi0JaWYgKGkucHJlZml4ZXMgIT0gMCAmJiAhaW50ZWxfc3ludGF4KQotCSAgYXNfd2FybiAoXygic2tpcHBpbmcgcHJlZml4ZXMgb24gdGhpcyBpbnN0cnVjdGlvbiIpKTsKLQotCWlmIChmaXRzX2luX3Vuc2lnbmVkX2J5dGUgKGkudG0uYmFzZV9vcGNvZGUpKQotCSAgewotCSAgICBpbnNuX3NpemUgKz0gMSArIHNpemU7Ci0JICAgIHAgPSBmcmFnX21vcmUgKDEgKyBzaXplKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIC8qIG9wY29kZSBjYW4gYmUgYXQgbW9zdCB0d28gYnl0ZXMgKi8KLQkgICAgaW5zbl9zaXplICs9IDIgKyBzaXplOwotCSAgICBwID0gZnJhZ19tb3JlICgyICsgc2l6ZSk7Ci0JICAgICpwKysgPSAoaS50bS5iYXNlX29wY29kZSA+PiA4KSAmIDB4ZmY7Ci0JICB9Ci0JKnArKyA9IGkudG0uYmFzZV9vcGNvZGUgJiAweGZmOwotCi0JZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIHNpemUsCi0JCSAgICAgaS5kaXNwc1swXSwgMSwgcmVsb2MgKHNpemUsIDEsIGkuZGlzcF9yZWxvY1swXSkpOwotICAgICAgfQotICAgIGVsc2UgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSnVtcEludGVyU2VnbWVudCkKLSAgICAgIHsKLQlpbnQgc2l6ZTsKLQlpbnQgcmVsb2NfdHlwZTsKLQlpbnQgcHJlZml4OwotCWludCBjb2RlMTY7Ci0KLQljb2RlMTYgPSAwOwotCWlmIChmbGFnXzE2Yml0X2NvZGUpCi0JICBjb2RlMTYgPSBDT0RFMTY7Ci0KLQlwcmVmaXggPSAwOwotCWlmIChpLnByZWZpeFtEQVRBX1BSRUZJWF0pCi0JICB7Ci0JICAgIHByZWZpeCA9IDE7Ci0JICAgIGkucHJlZml4ZXMgLT0gMTsKLQkgICAgY29kZTE2IF49IENPREUxNjsKLQkgIH0KLQotCXNpemUgPSA0OwotCXJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfMzI7Ci0JaWYgKGNvZGUxNikKLQkgIHsKLQkgICAgc2l6ZSA9IDI7Ci0JICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfMTY7Ci0JICB9Ci0KLQlpZiAoaS5wcmVmaXhlcyAhPSAwICYmICFpbnRlbF9zeW50YXgpCi0JICBhc193YXJuIChfKCJza2lwcGluZyBwcmVmaXhlcyBvbiB0aGlzIGluc3RydWN0aW9uIikpOwotCi0JaW5zbl9zaXplICs9IHByZWZpeCArIDEgKyAyICsgc2l6ZTsgIC8qIDEgb3Bjb2RlOyAyIHNlZ21lbnQ7IG9mZnNldCAqLwotCXAgPSBmcmFnX21vcmUgKHByZWZpeCArIDEgKyAyICsgc2l6ZSk7Ci0JaWYgKHByZWZpeCkKLQkgICpwKysgPSBEQVRBX1BSRUZJWF9PUENPREU7Ci0JKnArKyA9IGkudG0uYmFzZV9vcGNvZGU7Ci0JaWYgKGkuaW1tc1sxXS0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgewotCSAgICBsb25nIG4gPSAobG9uZykgaS5pbW1zWzFdLT5YX2FkZF9udW1iZXI7Ci0KLQkgICAgaWYgKHNpemUgPT0gMiAmJiAhZml0c19pbl91bnNpZ25lZF93b3JkIChuKSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiMTYtYml0IGp1bXAgb3V0IG9mIHJhbmdlIikpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIG4sIHNpemUpOwotCSAgfQotCWVsc2UKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBzaXplLAotCQkgICAgICAgaS5pbW1zWzFdLCAwLCByZWxvY190eXBlKTsKLQlpZiAoaS5pbW1zWzBdLT5YX29wICE9IE9fY29uc3RhbnQpCi0JICBhc19iYWQgKF8oImNhbid0IGhhbmRsZSBub24gYWJzb2x1dGUgc2VnbWVudCBpbiBgJXMnIiksCi0JCSAgaS50bS5uYW1lKTsKLQltZF9udW1iZXJfdG9fY2hhcnMgKHAgKyBzaXplLCAodmFsdWVUKSBpLmltbXNbMF0tPlhfYWRkX251bWJlciwgMik7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCS8qIE91dHB1dCBub3JtYWwgaW5zdHJ1Y3Rpb25zIGhlcmUuICovCi0JdW5zaWduZWQgY2hhciAqcTsKLQotCS8qIFRoZSBwcmVmaXggYnl0ZXMuICovCi0JZm9yIChxID0gaS5wcmVmaXg7Ci0JICAgICBxIDwgaS5wcmVmaXggKyBzaXplb2YgKGkucHJlZml4KSAvIHNpemVvZiAoaS5wcmVmaXhbMF0pOwotCSAgICAgcSsrKQotCSAgewotCSAgICBpZiAoKnEpCi0JICAgICAgewotCQlpbnNuX3NpemUgKz0gMTsKLQkJcCA9IGZyYWdfbW9yZSAoMSk7Ci0JCW1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgKnEsIDEpOwotCSAgICAgIH0KLQkgIH0KLQotCS8qIE5vdyB0aGUgb3Bjb2RlOyBiZSBjYXJlZnVsIGFib3V0IHdvcmQgb3JkZXIgaGVyZSEgKi8KLQlpZiAoZml0c19pbl91bnNpZ25lZF9ieXRlIChpLnRtLmJhc2Vfb3Bjb2RlKSkKLQkgIHsKLQkgICAgaW5zbl9zaXplICs9IDE7Ci0JICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoaS50bS5iYXNlX29wY29kZSk7Ci0JICB9Ci0JZWxzZSBpZiAoZml0c19pbl91bnNpZ25lZF93b3JkIChpLnRtLmJhc2Vfb3Bjb2RlKSkKLQkgIHsKLQkgICAgaW5zbl9zaXplICs9IDI7Ci0JICAgIHAgPSBmcmFnX21vcmUgKDIpOwotCSAgICAvKiBwdXQgb3V0IGhpZ2ggYnl0ZSBmaXJzdDogY2FuJ3QgdXNlIG1kX251bWJlcl90b19jaGFycyEgKi8KLQkgICAgKnArKyA9IChpLnRtLmJhc2Vfb3Bjb2RlID4+IDgpICYgMHhmZjsKLQkgICAgKnAgPSBpLnRtLmJhc2Vfb3Bjb2RlICYgMHhmZjsKLQkgIH0KLQllbHNlCi0JICB7CQkJLyogb3Bjb2RlIGlzIGVpdGhlciAzIG9yIDQgYnl0ZXMgKi8KLQkgICAgaWYgKGkudG0uYmFzZV9vcGNvZGUgJiAweGZmMDAwMDAwKQotCSAgICAgIHsKLQkJaW5zbl9zaXplICs9IDQ7Ci0JCXAgPSBmcmFnX21vcmUgKDQpOwotCQkqcCsrID0gKGkudG0uYmFzZV9vcGNvZGUgPj4gMjQpICYgMHhmZjsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSAzOwotCQlwID0gZnJhZ19tb3JlICgzKTsKLQkgICAgICB9Ci0JICAgICpwKysgPSAoaS50bS5iYXNlX29wY29kZSA+PiAxNikgJiAweGZmOwotCSAgICAqcCsrID0gKGkudG0uYmFzZV9vcGNvZGUgPj4gOCkgJiAweGZmOwotCSAgICAqcCA9IChpLnRtLmJhc2Vfb3Bjb2RlKSAmIDB4ZmY7Ci0JICB9Ci0KLQkvKiBOb3cgdGhlIG1vZHJtIGJ5dGUgYW5kIHNpYiBieXRlIChpZiBwcmVzZW50KS4gICovCi0JaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgTW9kcm0pCi0JICB7Ci0JICAgIGluc25fc2l6ZSArPSAxOwotCSAgICBwID0gZnJhZ19tb3JlICgxKTsKLQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLAotCQkJCSh2YWx1ZVQpIChpLnJtLnJlZ21lbSA8PCAwCi0JCQkJCSAgfCBpLnJtLnJlZyA8PCAzCi0JCQkJCSAgfCBpLnJtLm1vZGUgPDwgNiksCi0JCQkJMSk7Ci0JICAgIC8qIElmIGkucm0ucmVnbWVtID09IEVTUCAoNCkKLQkgICAgICAgJiYgaS5ybS5tb2RlICE9IChSZWdpc3RlciBtb2RlKQotCSAgICAgICAmJiBub3QgMTYgYml0Ci0JICAgICAgID09PiBuZWVkIHNlY29uZCBtb2RybSBieXRlLiAgKi8KLQkgICAgaWYgKGkucm0ucmVnbWVtID09IEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HCi0JCSYmIGkucm0ubW9kZSAhPSAzCi0JCSYmICEoaS5iYXNlX3JlZyAmJiAoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiBSZWcxNikgIT0gMCkpCi0JICAgICAgewotCQlpbnNuX3NpemUgKz0gMTsKLQkJcCA9IGZyYWdfbW9yZSAoMSk7Ci0JCW1kX251bWJlcl90b19jaGFycyAocCwKLQkJCQkgICAgKHZhbHVlVCkgKGkuc2liLmJhc2UgPDwgMAotCQkJCQkgICAgICB8IGkuc2liLmluZGV4IDw8IDMKLQkJCQkJICAgICAgfCBpLnNpYi5zY2FsZSA8PCA2KSwKLQkJCQkgICAgMSk7Ci0JICAgICAgfQotCSAgfQotCi0JaWYgKGkuZGlzcF9vcGVyYW5kcykKLQkgIHsKLQkgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IG47Ci0KLQkgICAgZm9yIChuID0gMDsgbiA8IGkub3BlcmFuZHM7IG4rKykKLQkgICAgICB7Ci0JCWlmIChpLmRpc3BzW25dKQotCQkgIHsKLQkJICAgIGlmIChpLmRpc3BzW25dLT5YX29wID09IE9fY29uc3RhbnQpCi0JCSAgICAgIHsKLQkJCWludCBzaXplID0gNDsKLQkJCWxvbmcgdmFsID0gKGxvbmcpIGkuZGlzcHNbbl0tPlhfYWRkX251bWJlcjsKLQotCQkJaWYgKGkudHlwZXNbbl0gJiAoRGlzcDggfCBEaXNwMTYpKQotCQkJICB7Ci0JCQkgICAgbG9uZyBtYXNrOwotCi0JCQkgICAgc2l6ZSA9IDI7Ci0JCQkgICAgbWFzayA9IH4gKGxvbmcpIDB4ZmZmZjsKLQkJCSAgICBpZiAoaS50eXBlc1tuXSAmIERpc3A4KQotCQkJICAgICAgewotCQkJCXNpemUgPSAxOwotCQkJCW1hc2sgPSB+IChsb25nKSAweGZmOwotCQkJICAgICAgfQotCi0JCQkgICAgaWYgKCh2YWwgJiBtYXNrKSAhPSAwICYmICh2YWwgJiBtYXNrKSAhPSBtYXNrKQotCQkJICAgICAgYXNfd2FybiAoXygiJWxkIHNob3J0ZW5lZCB0byAlbGQiKSwKLQkJCQkgICAgICAgdmFsLCB2YWwgJiB+bWFzayk7Ci0JCQkgIH0KLQkJCWluc25fc2l6ZSArPSBzaXplOwotCQkJcCA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0JCQltZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIHZhbCwgc2l6ZSk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKGkudHlwZXNbbl0gJiBEaXNwMzIpCi0JCSAgICAgIHsKLQkJCWluc25fc2l6ZSArPSA0OwotCQkJcCA9IGZyYWdfbW9yZSAoNCk7Ci0JCQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJCQkgICAgIGkuZGlzcHNbbl0sIDAsCi0JCQkJICAgICBUQ19SRUxPQyAoaS5kaXNwX3JlbG9jW25dLCBCRkRfUkVMT0NfMzIpKTsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7IC8qIG11c3QgYmUgRGlzcDE2ICovCi0JCQlpbnNuX3NpemUgKz0gMjsKLQkJCXAgPSBmcmFnX21vcmUgKDIpOwotCQkJZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDIsCi0JCQkJICAgICBpLmRpc3BzW25dLCAwLAotCQkJCSAgICAgVENfUkVMT0MgKGkuZGlzcF9yZWxvY1tuXSwgQkZEX1JFTE9DXzE2KSk7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQkJCS8qIGVuZCBkaXNwbGFjZW1lbnQgb3V0cHV0ICovCi0KLQkvKiBvdXRwdXQgaW1tZWRpYXRlICovCi0JaWYgKGkuaW1tX29wZXJhbmRzKQotCSAgewotCSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgbjsKLQotCSAgICBmb3IgKG4gPSAwOyBuIDwgaS5vcGVyYW5kczsgbisrKQotCSAgICAgIHsKLQkJaWYgKGkuaW1tc1tuXSkKLQkJICB7Ci0JCSAgICBpZiAoaS5pbW1zW25dLT5YX29wID09IE9fY29uc3RhbnQpCi0JCSAgICAgIHsKLQkJCWludCBzaXplID0gNDsKLQkJCWxvbmcgdmFsID0gKGxvbmcpIGkuaW1tc1tuXS0+WF9hZGRfbnVtYmVyOwotCi0JCQlpZiAoaS50eXBlc1tuXSAmIChJbW04IHwgSW1tOFMgfCBJbW0xNikpCi0JCQkgIHsKLQkJCSAgICBsb25nIG1hc2s7Ci0KLQkJCSAgICBzaXplID0gMjsKLQkJCSAgICBtYXNrID0gfiAobG9uZykgMHhmZmZmOwotCQkJICAgIGlmIChpLnR5cGVzW25dICYgKEltbTggfCBJbW04UykpCi0JCQkgICAgICB7Ci0JCQkJc2l6ZSA9IDE7Ci0JCQkJbWFzayA9IH4gKGxvbmcpIDB4ZmY7Ci0JCQkgICAgICB9Ci0JCQkgICAgaWYgKCh2YWwgJiBtYXNrKSAhPSAwICYmICh2YWwgJiBtYXNrKSAhPSBtYXNrKQotCQkJICAgICAgYXNfd2FybiAoXygiJWxkIHNob3J0ZW5lZCB0byAlbGQiKSwKLQkJCQkgICAgICAgdmFsLCB2YWwgJiB+bWFzayk7Ci0JCQkgIH0KLQkJCWluc25fc2l6ZSArPSBzaXplOwotCQkJcCA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0JCQltZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIHZhbCwgc2l6ZSk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewkJLyogbm90IGFic29sdXRlX3NlY3Rpb24gKi8KLQkJCS8qIE5lZWQgYSAzMi1iaXQgZml4dXAgKGRvbid0IHN1cHBvcnQgOGJpdAotCQkJICAgbm9uLWFic29sdXRlIGltcykuICBUcnkgdG8gc3VwcG9ydCBvdGhlcgotCQkJICAgc2l6ZXMgLi4uICovCi0JCQlpbnQgcl90eXBlOwotCQkJaW50IHNpemU7Ci0JCQlpbnQgcGNyZWwgPSAwOwotCi0JCQlpZiAoaS50eXBlc1tuXSAmIChJbW04IHwgSW1tOFMpKQotCQkJICBzaXplID0gMTsKLQkJCWVsc2UgaWYgKGkudHlwZXNbbl0gJiBJbW0xNikKLQkJCSAgc2l6ZSA9IDI7Ci0JCQllbHNlCi0JCQkgIHNpemUgPSA0OwotCQkJaW5zbl9zaXplICs9IHNpemU7Ci0JCQlwID0gZnJhZ19tb3JlIChzaXplKTsKLQkJCXJfdHlwZSA9IHJlbG9jIChzaXplLCAwLCBpLmRpc3BfcmVsb2NbMF0pOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkJCWlmIChyX3R5cGUgPT0gQkZEX1JFTE9DXzMyCi0JCQkgICAgJiYgR09UX3N5bWJvbAotCQkJICAgICYmIEdPVF9zeW1ib2wgPT0gaS5pbW1zW25dLT5YX2FkZF9zeW1ib2wKLQkJCSAgICAmJiAoaS5pbW1zW25dLT5YX29wID09IE9fc3ltYm9sCi0JCQkJfHwgKGkuaW1tc1tuXS0+WF9vcCA9PSBPX2FkZAotCQkJCSAgICAmJiAoKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbgotCQkJCQkgKGkuaW1tc1tuXS0+WF9vcF9zeW1ib2wpLT5YX29wKQotCQkJCQk9PSBPX3N1YnRyYWN0KSkpKQotCQkJICB7Ci0JCQkgICAgcl90eXBlID0gQkZEX1JFTE9DXzM4Nl9HT1RQQzsKLQkJCSAgICBpLmltbXNbbl0tPlhfYWRkX251bWJlciArPSAzOwotCQkJICB9Ci0jZW5kaWYKLQkJCWZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBzaXplLAotCQkJCSAgICAgaS5pbW1zW25dLCBwY3JlbCwgcl90eXBlKTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9CQkJLyogZW5kIGltbWVkaWF0ZSBvdXRwdXQgKi8KLSAgICAgIH0KLQotI2lmZGVmIERFQlVHMzg2Ci0gICAgaWYgKGZsYWdfZGVidWcpCi0gICAgICB7Ci0JcGkgKGxpbmUsICZpKTsKLSAgICAgIH0KLSNlbmRpZiAvKiBERUJVRzM4NiAqLwotICB9Ci19Ci0MCi1zdGF0aWMgaW50IGkzODZfaW1tZWRpYXRlIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgaW50Ci1pMzg2X2ltbWVkaWF0ZSAoaW1tX3N0YXJ0KQotICAgICBjaGFyICppbW1fc3RhcnQ7Ci17Ci0gIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotICBzZWdUIGV4cF9zZWcgPSAwOwotICBleHByZXNzaW9uUyAqIGV4cDsKLQotICBpZiAoaS5pbW1fb3BlcmFuZHMgPT0gTUFYX0lNTUVESUFURV9PUEVSQU5EUykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk9ubHkgMSBvciAyIGltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgYWxsb3dlZCIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBleHAgPSAmaW1fZXhwcmVzc2lvbnNbaS5pbW1fb3BlcmFuZHMrK107Ci0gIGkuaW1tc1t0aGlzX29wZXJhbmRdID0gZXhwOwotCi0gIGlmIChpc19zcGFjZV9jaGFyICgqaW1tX3N0YXJ0KSkKLSAgICArK2ltbV9zdGFydDsKLQotICBzYXZlX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaW1tX3N0YXJ0OwotCi0jaWZuZGVmIExFWF9BVAotICB7Ci0gICAgLyoKLSAgICAgKiBXZSBjYW4gaGF2ZSBvcGVyYW5kcyBvZiB0aGUgZm9ybQotICAgICAqICAgPHN5bWJvbD5AR09UT0ZGKzxubm4+Ci0gICAgICogVGFrZSB0aGUgZWFzeSB3YXkgb3V0IGhlcmUgYW5kIGNvcHkgZXZlcnl0aGluZwotICAgICAqIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyLi4uCi0gICAgICovCi0gICAgcmVnaXN0ZXIgY2hhciAqY3A7Ci0KLSAgICBjcCA9IHN0cmNociAoaW5wdXRfbGluZV9wb2ludGVyLCAnQCcpOwotICAgIGlmIChjcCAhPSBOVUxMKQotICAgICAgewotCWNoYXIgKnRtcGJ1ZjsKLQlpbnQgbGVuID0gMDsKLQlpbnQgZmlyc3Q7Ci0KLQkvKiBHT1QgcmVsb2NhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gMTYgYml0IG1vZGUgKi8KLQlpZiAoZmxhZ18xNmJpdF9jb2RlKQotCSAgYXNfYmFkIChfKCJHT1QgcmVsb2NhdGlvbnMgbm90IHN1cHBvcnRlZCBpbiAxNiBiaXQgbW9kZSIpKTsKLQotCWlmIChHT1Rfc3ltYm9sID09IE5VTEwpCi0JICBHT1Rfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTsKLQotCWlmIChzdHJuY21wIChjcCArIDEsICJQTFQiLCAzKSA9PSAwKQotCSAgewotCSAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfUExUMzI7Ci0JICAgIGxlbiA9IDM7Ci0JICB9Ci0JZWxzZSBpZiAoc3RybmNtcCAoY3AgKyAxLCAiR09UT0ZGIiwgNikgPT0gMCkKLQkgIHsKLQkgICAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBCRkRfUkVMT0NfMzg2X0dPVE9GRjsKLQkgICAgbGVuID0gNjsKLQkgIH0KLQllbHNlIGlmIChzdHJuY21wIChjcCArIDEsICJHT1QiLCAzKSA9PSAwKQotCSAgewotCSAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfR09UMzI7Ci0JICAgIGxlbiA9IDM7Ci0JICB9Ci0JZWxzZQotCSAgYXNfYmFkIChfKCJCYWQgcmVsb2Mgc3BlY2lmaWVyIGluIGV4cHJlc3Npb24iKSk7Ci0KLQkvKiBSZXBsYWNlIHRoZSByZWxvY2F0aW9uIHRva2VuIHdpdGggJyAnLCBzbyB0aGF0IGVycm9ycyBsaWtlCi0JICAgZm9vQEdPVE9GRjEgd2lsbCBiZSBkZXRlY3RlZC4gICovCi0JZmlyc3QgPSBjcCAtIGlucHV0X2xpbmVfcG9pbnRlcjsKLQl0bXBidWYgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbihpbnB1dF9saW5lX3BvaW50ZXIpKTsKLQltZW1jcHkgKHRtcGJ1ZiwgaW5wdXRfbGluZV9wb2ludGVyLCBmaXJzdCk7Ci0JdG1wYnVmW2ZpcnN0XSA9ICcgJzsKLQlzdHJjcHkgKHRtcGJ1ZiArIGZpcnN0ICsgMSwgY3AgKyAxICsgbGVuKTsKLQlpbnB1dF9saW5lX3BvaW50ZXIgPSB0bXBidWY7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIGV4cF9zZWcgPSBleHByZXNzaW9uIChleHApOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIpCi0gICAgYXNfYmFkIChfKCJJZ25vcmluZyBqdW5rIGAlcycgYWZ0ZXIgZXhwcmVzc2lvbiIpLCBpbnB1dF9saW5lX3BvaW50ZXIpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmIChleHAtPlhfb3AgPT0gT19hYnNlbnQgfHwgZXhwLT5YX29wID09IE9fYmlnKQotICAgIHsKLSAgICAgIC8qIG1pc3Npbmcgb3IgYmFkIGV4cHIgYmVjb21lcyBhYnNvbHV0ZSAwICovCi0gICAgICBhc19iYWQgKF8oIk1pc3Npbmcgb3IgaW52YWxpZCBpbW1lZGlhdGUgZXhwcmVzc2lvbiBgJXMnIHRha2VuIGFzIDAiKSwKLQkgICAgICBpbW1fc3RhcnQpOwotICAgICAgZXhwLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGV4cC0+WF9hZGRfc3ltYm9sID0gKHN5bWJvbFMgKikgMDsKLSAgICAgIGV4cC0+WF9vcF9zeW1ib2wgPSAoc3ltYm9sUyAqKSAwOwotICAgIH0KLQotICBpZiAoZXhwLT5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgaW50IGJpZ2ltbSA9IEltbTMyOwotICAgICAgaWYgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtEQVRBX1BSRUZJWF0gIT0gMCkpCi0JYmlnaW1tID0gSW1tMTY7Ci0KLSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PQotCShiaWdpbW0gfCBzbWFsbGVzdF9pbW1fdHlwZSAoKGxvbmcpIGV4cC0+WF9hZGRfbnVtYmVyKSk7Ci0KLSAgICAgIC8qIElmIGEgc3VmZml4IGlzIGdpdmVuLCB0aGlzIG9wZXJhbmQgbWF5IGJlIHNob3J0ZW5kZWQuICovCi0gICAgICBzd2l0Y2ggKGkuc3VmZml4KQotCXsKLQljYXNlIFdPUkRfTU5FTV9TVUZGSVg6Ci0JICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gSW1tMTY7Ci0JICBicmVhazsKLQljYXNlIEJZVEVfTU5FTV9TVUZGSVg6Ci0JICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gSW1tMTYgfCBJbW04IHwgSW1tOFM7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotI2lmZGVmIE9CSl9BT1VUCi0gIGVsc2UgaWYgKGV4cF9zZWcgIT0gdGV4dF9zZWN0aW9uCi0JICAgJiYgZXhwX3NlZyAhPSBkYXRhX3NlY3Rpb24KLQkgICAmJiBleHBfc2VnICE9IGJzc19zZWN0aW9uCi0JICAgJiYgZXhwX3NlZyAhPSB1bmRlZmluZWRfc2VjdGlvbgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgICAmJiAhYmZkX2lzX2NvbV9zZWN0aW9uIChleHBfc2VnKQotI2VuZGlmCi0JICAgKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVW5pbXBsZW1lbnRlZCBzZWdtZW50IHR5cGUgJWQgaW4gb3BlcmFuZCIpLCBleHBfc2VnKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSNlbmRpZgotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhbiBhZGRyZXNzLiAgVGhlIHNpemUgb2YgdGhlIGFkZHJlc3Mgd2lsbCBiZQotCSBkZXRlcm1pbmVkIGxhdGVyLCBkZXBlbmRpbmcgb24gZGVzdGluYXRpb24gcmVnaXN0ZXIsCi0JIHN1ZmZpeCwgb3IgdGhlIGRlZmF1bHQgZm9yIHRoZSBzZWN0aW9uLiAgV2UgZXhjbHVkZQotCSBJbW04UyBoZXJlIHNvIHRoYXQgYHB1c2ggJGZvbycgYW5kIG90aGVyIGluc3RydWN0aW9ucwotCSB3aXRoIGFuIEltbThTIGZvcm0gd2lsbCB1c2UgSW1tMTYgb3IgSW1tMzIuICAqLwotICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IChJbW04IHwgSW1tMTYgfCBJbW0zMik7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGkzODZfc2NhbGUgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfc2NhbGUgKHNjYWxlKQotICAgICBjaGFyICpzY2FsZTsKLXsKLSAgaWYgKCFpc2RpZ2l0ICgqc2NhbGUpKQotICAgIGdvdG8gYmFkX3NjYWxlOwotCi0gIHN3aXRjaCAoKnNjYWxlKQotICAgIHsKLSAgICBjYXNlICcwJzoKLSAgICBjYXNlICcxJzoKLSAgICAgIGkubG9nMl9zY2FsZV9mYWN0b3IgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnMic6Ci0gICAgICBpLmxvZzJfc2NhbGVfZmFjdG9yID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzQnOgotICAgICAgaS5sb2cyX3NjYWxlX2ZhY3RvciA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICc4JzoKLSAgICAgIGkubG9nMl9zY2FsZV9mYWN0b3IgPSAzOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICBiYWRfc2NhbGU6Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGluZyBzY2FsZSBmYWN0b3Igb2YgMSwgMiwgNCwgb3IgODogZ290IGAlcyciKSwKLQkgICAgICBzY2FsZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChpLmxvZzJfc2NhbGVfZmFjdG9yICE9IDAgJiYgISBpLmluZGV4X3JlZykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJzY2FsZSBmYWN0b3Igb2YgJWQgd2l0aG91dCBhbiBpbmRleCByZWdpc3RlciIpLAotCSAgICAgICAxIDw8IGkubG9nMl9zY2FsZV9mYWN0b3IpOwotI2lmIFNDQUxFMV9XSEVOX05PX0lOREVYCi0gICAgICBpLmxvZzJfc2NhbGVfZmFjdG9yID0gMDsKLSNlbmRpZgotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaTM4Nl9kaXNwbGFjZW1lbnQgUEFSQU1TICgoY2hhciAqLCBjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9kaXNwbGFjZW1lbnQgKGRpc3Bfc3RhcnQsIGRpc3BfZW5kKQotICAgICBjaGFyICpkaXNwX3N0YXJ0OwotICAgICBjaGFyICpkaXNwX2VuZDsKLXsKLSAgcmVnaXN0ZXIgZXhwcmVzc2lvblMgKmV4cDsKLSAgc2VnVCBleHBfc2VnID0gMDsKLSAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGludCBiaWdkaXNwID0gRGlzcDMyOwotCi0gIGlmIChmbGFnXzE2Yml0X2NvZGUgXiAoaS5wcmVmaXhbQUREUl9QUkVGSVhdICE9IDApKQotICAgIGJpZ2Rpc3AgPSBEaXNwMTY7Ci0gIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBiaWdkaXNwOwotCi0gIGV4cCA9ICZkaXNwX2V4cHJlc3Npb25zW2kuZGlzcF9vcGVyYW5kc107Ci0gIGkuZGlzcHNbdGhpc19vcGVyYW5kXSA9IGV4cDsKLSAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBOT19SRUxPQzsKLSAgaS5kaXNwX29wZXJhbmRzKys7Ci0gIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBkaXNwX3N0YXJ0OwotICBFTkRfU1RSSU5HX0FORF9TQVZFIChkaXNwX2VuZCk7Ci0KLSNpZm5kZWYgR0NDX0FTTV9PX0hBQ0sKLSNkZWZpbmUgR0NDX0FTTV9PX0hBQ0sgMAotI2VuZGlmCi0jaWYgR0NDX0FTTV9PX0hBQ0sKLSAgRU5EX1NUUklOR19BTkRfU0FWRSAoZGlzcF9lbmQgKyAxKTsKLSAgaWYgKChpLnR5cGVzW3RoaXNfb3BlcmFuZF0gJiBCYXNlSW5kZXgpICE9IDAKLSAgICAgICYmIGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kWy0xXSA9PSAnKycpCi0gICAgewotICAgICAgLyogVGhpcyBoYWNrIGlzIHRvIGF2b2lkIGEgd2FybmluZyB3aGVuIHVzaW5nIHRoZSAibyIKLQkgY29uc3RyYWludCB3aXRoaW4gZ2NjIGFzbSBzdGF0ZW1lbnRzLgotCSBGb3IgaW5zdGFuY2U6Ci0KLQkgI2RlZmluZSBfc2V0X3Rzc2xkdF9kZXNjKG4sYWRkcixsaW1pdCx0eXBlKSBcCi0JIF9fYXNtX18gX192b2xhdGlsZV9fICggXAotCSAibW92dyAldzIsJTBcblx0IiBcCi0JICJtb3Z3ICV3MSwyKyUwXG5cdCIgXAotCSAicm9ybCAkMTYsJTFcblx0IiBcCi0JICJtb3ZiICViMSw0KyUwXG5cdCIgXAotCSAibW92YiAlNCw1KyUwXG5cdCIgXAotCSAibW92YiAkMCw2KyUwXG5cdCIgXAotCSAibW92YiAlaDEsNyslMFxuXHQiIFwKLQkgInJvcmwgJDE2LCUxIiBcCi0JIDogIj1vIigqKG4pKSA6ICJxIiAoYWRkciksICJyaSIobGltaXQpLCAiaSIodHlwZSkpCi0KLQkgVGhpcyB3b3JrcyBncmVhdCBleGNlcHQgdGhhdCB0aGUgb3V0cHV0IGFzc2VtYmxlciBlbmRzCi0JIHVwIGxvb2tpbmcgYSBiaXQgd2VpcmQgaWYgaXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgaXMKLQkgbm8gb2Zmc2V0LiAgWW91IGVuZCB1cCBwcm9kdWNpbmcgY29kZSB0aGF0IGxvb2tzIGxpa2U6Ci0KLQkgI0FQUAotCSBtb3Z3ICQyMzUsKCVlYXgpCi0JIG1vdncgJWR4LDIrKCVlYXgpCi0JIHJvcmwgJDE2LCVlZHgKLQkgbW92YiAlZGwsNCsoJWVheCkKLQkgbW92YiAkMTM3LDUrKCVlYXgpCi0JIG1vdmIgJDAsNisoJWVheCkKLQkgbW92YiAlZGgsNysoJWVheCkKLQkgcm9ybCAkMTYsJWVkeAotCSAjTk9fQVBQCi0KLQkgU28gaGVyZSB3ZSBwcm92aWRlIHRoZSBtaXNzaW5nIHplcm8uCi0gICAgICAqLwotCi0gICAgICAqZGlzcGxhY2VtZW50X3N0cmluZ19lbmQgPSAnMCc7Ci0gICAgfQotI2VuZGlmCi0jaWZuZGVmIExFWF9BVAotICB7Ci0gICAgLyoKLSAgICAgKiBXZSBjYW4gaGF2ZSBvcGVyYW5kcyBvZiB0aGUgZm9ybQotICAgICAqICAgPHN5bWJvbD5AR09UT0ZGKzxubm4+Ci0gICAgICogVGFrZSB0aGUgZWFzeSB3YXkgb3V0IGhlcmUgYW5kIGNvcHkgZXZlcnl0aGluZwotICAgICAqIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyLi4uCi0gICAgICovCi0gICAgcmVnaXN0ZXIgY2hhciAqY3A7Ci0KLSAgICBjcCA9IHN0cmNociAoaW5wdXRfbGluZV9wb2ludGVyLCAnQCcpOwotICAgIGlmIChjcCAhPSBOVUxMKQotICAgICAgewotCWNoYXIgKnRtcGJ1ZjsKLQlpbnQgbGVuID0gMDsKLQlpbnQgZmlyc3Q7Ci0KLQkvKiBHT1QgcmVsb2NhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gMTYgYml0IG1vZGUgKi8KLQlpZiAoZmxhZ18xNmJpdF9jb2RlKQotCSAgYXNfYmFkIChfKCJHT1QgcmVsb2NhdGlvbnMgbm90IHN1cHBvcnRlZCBpbiAxNiBiaXQgbW9kZSIpKTsKLQotCWlmIChHT1Rfc3ltYm9sID09IE5VTEwpCi0JICBHT1Rfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTsKLQotCWlmIChzdHJuY21wIChjcCArIDEsICJQTFQiLCAzKSA9PSAwKQotCSAgewotCSAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfUExUMzI7Ci0JICAgIGxlbiA9IDM7Ci0JICB9Ci0JZWxzZSBpZiAoc3RybmNtcCAoY3AgKyAxLCAiR09UT0ZGIiwgNikgPT0gMCkKLQkgIHsKLQkgICAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBCRkRfUkVMT0NfMzg2X0dPVE9GRjsKLQkgICAgbGVuID0gNjsKLQkgIH0KLQllbHNlIGlmIChzdHJuY21wIChjcCArIDEsICJHT1QiLCAzKSA9PSAwKQotCSAgewotCSAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfR09UMzI7Ci0JICAgIGxlbiA9IDM7Ci0JICB9Ci0JZWxzZQotCSAgYXNfYmFkIChfKCJCYWQgcmVsb2Mgc3BlY2lmaWVyIGluIGV4cHJlc3Npb24iKSk7Ci0KLQkvKiBSZXBsYWNlIHRoZSByZWxvY2F0aW9uIHRva2VuIHdpdGggJyAnLCBzbyB0aGF0IGVycm9ycyBsaWtlCi0JICAgZm9vQEdPVE9GRjEgd2lsbCBiZSBkZXRlY3RlZC4gICovCi0JZmlyc3QgPSBjcCAtIGlucHV0X2xpbmVfcG9pbnRlcjsKLQl0bXBidWYgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbihpbnB1dF9saW5lX3BvaW50ZXIpKTsKLQltZW1jcHkgKHRtcGJ1ZiwgaW5wdXRfbGluZV9wb2ludGVyLCBmaXJzdCk7Ci0JdG1wYnVmW2ZpcnN0XSA9ICcgJzsKLQlzdHJjcHkgKHRtcGJ1ZiArIGZpcnN0ICsgMSwgY3AgKyAxICsgbGVuKTsKLQlpbnB1dF9saW5lX3BvaW50ZXIgPSB0bXBidWY7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIGV4cF9zZWcgPSBleHByZXNzaW9uIChleHApOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBXZSBkbyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWN0aW9uIHN5bWJvbCBpcyBpbgotICAgICB0aGUgc3ltYm9sIHRhYmxlLiAgV2Ugd2lsbCB1bHRpbWF0ZWx5IGNoYW5nZSB0aGUgcmVsb2NhdGlvbgotICAgICB0byBiZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uICovCi0gIGlmIChpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9PSBCRkRfUkVMT0NfMzg2X0dPVE9GRikKLSAgICB7Ci0gICAgICBpZiAoU19JU19MT0NBTChleHAtPlhfYWRkX3N5bWJvbCkKLQkgICYmIFNfR0VUX1NFR01FTlQgKGV4cC0+WF9hZGRfc3ltYm9sKSAhPSB1bmRlZmluZWRfc2VjdGlvbikKLQlzZWN0aW9uX3N5bWJvbCAoU19HRVRfU0VHTUVOVCAoZXhwLT5YX2FkZF9zeW1ib2wpKTsKLSAgICAgIGFzc2VydCAoZXhwLT5YX29wID09IE9fc3ltYm9sKTsKLSAgICAgIGV4cC0+WF9vcCA9IE9fc3VidHJhY3Q7Ci0gICAgICBleHAtPlhfb3Bfc3ltYm9sID0gR09UX3N5bWJvbDsKLSAgICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzMyOwotICAgIH0KLSNlbmRpZgotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIpCi0gICAgYXNfYmFkIChfKCJJZ25vcmluZyBqdW5rIGAlcycgYWZ0ZXIgZXhwcmVzc2lvbiIpLAotCSAgICBpbnB1dF9saW5lX3BvaW50ZXIpOwotI2lmIEdDQ19BU01fT19IQUNLCi0gIFJFU1RPUkVfRU5EX1NUUklORyAoZGlzcF9lbmQgKyAxKTsKLSNlbmRpZgotICBSRVNUT1JFX0VORF9TVFJJTkcgKGRpc3BfZW5kKTsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKGV4cC0+WF9vcCA9PSBPX2Fic2VudCB8fCBleHAtPlhfb3AgPT0gT19iaWcpCi0gICAgewotICAgICAgLyogbWlzc2luZyBvciBiYWQgZXhwciBiZWNvbWVzIGFic29sdXRlIDAgKi8KLSAgICAgIGFzX2JhZCAoXygiTWlzc2luZyBvciBpbnZhbGlkIGRpc3BsYWNlbWVudCBleHByZXNzaW9uIGAlcycgdGFrZW4gYXMgMCIpLAotCSAgICAgIGRpc3Bfc3RhcnQpOwotICAgICAgZXhwLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGV4cC0+WF9hZGRfc3ltYm9sID0gKHN5bWJvbFMgKikgMDsKLSAgICAgIGV4cC0+WF9vcF9zeW1ib2wgPSAoc3ltYm9sUyAqKSAwOwotICAgIH0KLQotICBpZiAoZXhwLT5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgaWYgKGZpdHNfaW5fc2lnbmVkX2J5dGUgKGV4cC0+WF9hZGRfbnVtYmVyKSkKLQlpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gRGlzcDg7Ci0gICAgfQotI2lmZGVmIE9CSl9BT1VUCi0gIGVsc2UgaWYgKGV4cF9zZWcgIT0gdGV4dF9zZWN0aW9uCi0JICAgJiYgZXhwX3NlZyAhPSBkYXRhX3NlY3Rpb24KLQkgICAmJiBleHBfc2VnICE9IGJzc19zZWN0aW9uCi0JICAgJiYgZXhwX3NlZyAhPSB1bmRlZmluZWRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8gKCJVbmltcGxlbWVudGVkIHNlZ21lbnQgdHlwZSAlZCBpbiBvcGVyYW5kIiksIGV4cF9zZWcpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotI2VuZGlmCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGkzODZfb3BlcmFuZF9tb2RpZmllciBQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLQotc3RhdGljIGludAotaTM4Nl9vcGVyYW5kX21vZGlmaWVyIChvcF9zdHJpbmcsIGdvdF9hX2Zsb2F0KQotICAgICBjaGFyICoqb3Bfc3RyaW5nOwotICAgICBpbnQgZ290X2FfZmxvYXQ7Ci17Ci0gIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJCWVRFIFBUUiIsIDgpKQotICAgIHsKLSAgICAgIGkuc3VmZml4ID0gQllURV9NTkVNX1NVRkZJWDsKLSAgICAgICpvcF9zdHJpbmcgKz0gODsKLSAgICAgIHJldHVybiBCWVRFX1BUUjsKLQotICAgIH0KLSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiV09SRCBQVFIiLCA4KSkKLSAgICB7Ci0gICAgICBpLnN1ZmZpeCA9IFdPUkRfTU5FTV9TVUZGSVg7Ci0gICAgICAqb3Bfc3RyaW5nICs9IDg7Ci0gICAgICByZXR1cm4gV09SRF9QVFI7Ci0gICAgfQotCi0gIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIkRXT1JEIFBUUiIsIDkpKQotICAgIHsKLSAgICAgIGlmIChnb3RfYV9mbG9hdCkKLQlpLnN1ZmZpeCA9IFNIT1JUX01ORU1fU1VGRklYOwotICAgICAgZWxzZQotCWkuc3VmZml4ID0gRFdPUkRfTU5FTV9TVUZGSVg7Ci0gICAgICAqb3Bfc3RyaW5nICs9IDk7Ci0gICAgICByZXR1cm4gRFdPUkRfUFRSOwotICAgIH0KLQotICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJRV09SRCBQVFIiLCA5KSkKLSAgICB7Ci0gICAgICBpLnN1ZmZpeCA9IElOVEVMX0RXT1JEX01ORU1fU1VGRklYOwotICAgICAgKm9wX3N0cmluZyArPSA5OwotICAgICAgcmV0dXJuIFFXT1JEX1BUUjsKLSAgICB9Ci0KLSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiWFdPUkQgUFRSIiwgOSkpCi0gICAgewotICAgICAgaS5zdWZmaXggPSBMT05HX0RPVUJMRV9NTkVNX1NVRkZJWDsKLSAgICAgICpvcF9zdHJpbmcgKz0gOTsKLSAgICAgIHJldHVybiBYV09SRF9QVFI7Ci0gICAgfQotCi0gIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIlNIT1JUIiwgNSkpCi0gICAgewotICAgICAgKm9wX3N0cmluZyArPSA1OwotICAgICAgcmV0dXJuIFNIT1JUOwotICAgIH0KLQotICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJPRkZTRVQgRkxBVDoiLCAxMikpCi0gICAgewotICAgICAgKm9wX3N0cmluZyArPSAxMjsKLSAgICAgIHJldHVybiBPRkZTRVRfRkxBVDsKLSAgICB9Ci0KLSAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiRkxBVCIsIDQpKQotICAgIHsKLSAgICAgICpvcF9zdHJpbmcgKz0gNDsKLSAgICAgIHJldHVybiBGTEFUOwotICAgIH0KLQotICBlbHNlIHJldHVybiBOT05FX0ZPVU5EOwotfQotCi1zdGF0aWMgY2hhciAqIGJ1aWxkX2Rpc3BsYWNlbWVudF9zdHJpbmcgUEFSQU1TICgoaW50LCBjaGFyICopKTsKLQotc3RhdGljIGNoYXIgKgotYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyAoaW5pdGlhbF9kaXNwLCBvcF9zdHJpbmcpCi0gICAgIGludCBpbml0aWFsX2Rpc3A7Ci0gICAgIGNoYXIgKm9wX3N0cmluZzsKLXsKLSAgY2hhciAqdGVtcF9zdHJpbmcgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAob3Bfc3RyaW5nKSArIDEpOwotICBjaGFyICplbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0gIGNoYXIgKnRjOwotICBjaGFyICp0ZW1wX2Rpc3A7Ci0KLSAgdGVtcF9zdHJpbmdbMF0gPSAnXDAnOwotICB0YyA9IGVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IHN0cmNociAob3Bfc3RyaW5nLCAnWycpOwotICBpZiAoIGluaXRpYWxfZGlzcCAmJiAhZW5kX29mX29wZXJhbmRfc3RyaW5nKQotICAgIHsKLSAgICAgIHN0cmNweSAodGVtcF9zdHJpbmcsIG9wX3N0cmluZyk7Ci0gICAgICByZXR1cm4gKHRlbXBfc3RyaW5nKTsKLSAgICB9Ci0KLSAgLyogQnVpbGQgdGhlIHdob2xlIGRpc3BsYWNlbWVudCBzdHJpbmcgKi8KLSAgaWYgKGluaXRpYWxfZGlzcCkKLSAgICB7Ci0gICAgICBzdHJuY3B5ICh0ZW1wX3N0cmluZywgb3Bfc3RyaW5nLCBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgLSBvcF9zdHJpbmcpOwotICAgICAgdGVtcF9zdHJpbmdbZW5kX29mX29wZXJhbmRfc3RyaW5nIC0gb3Bfc3RyaW5nXSA9ICdcMCc7Ci0gICAgICB0ZW1wX2Rpc3AgPSB0YzsKLSAgICB9Ci0gIGVsc2UKLSAgICB0ZW1wX2Rpc3AgPSBvcF9zdHJpbmc7Ci0KLSAgd2hpbGUgKCp0ZW1wX2Rpc3AgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBjaGFyICplbmRfb3A7Ci0gICAgICBpbnQgYWRkX21pbnVzID0gKCp0ZW1wX2Rpc3AgPT0gJy0nKTsKLQotICAgICAgaWYgKCp0ZW1wX2Rpc3AgPT0gJysnIHx8ICp0ZW1wX2Rpc3AgPT0gJy0nIHx8ICp0ZW1wX2Rpc3AgPT0gJ1snKQotCXRlbXBfZGlzcCsrOwotCi0gICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKnRlbXBfZGlzcCkpCi0JdGVtcF9kaXNwKys7Ci0KLSAgICAgIC8qIERvbid0IGNvbnNpZGVyIHJlZ2lzdGVycyAqLwotICAgICAgaWYgKCAhKCgqdGVtcF9kaXNwID09IFJFR0lTVEVSX1BSRUZJWCB8fCBhbGxvd19uYWtlZF9yZWcpCi0JICAgICAmJiBwYXJzZV9yZWdpc3RlciAodGVtcF9kaXNwLCAmZW5kX29wKSkgKQotCXsKLQkgIGNoYXIgKnN0cmluZ19zdGFydCA9IHRlbXBfZGlzcDsKLQotCSAgd2hpbGUgKCp0ZW1wX2Rpc3AgIT0gJ10nCi0JCSAmJiAqdGVtcF9kaXNwICE9ICcrJwotCQkgJiYgKnRlbXBfZGlzcCAhPSAnLScKLQkJICYmICp0ZW1wX2Rpc3AgIT0gJyonKQotCSAgICArK3RlbXBfZGlzcDsKLQotCSAgaWYgKGFkZF9taW51cykKLQkgICAgc3RyY2F0ICh0ZW1wX3N0cmluZywgIi0iKTsKLQkgIGVsc2UKLQkgICAgc3RyY2F0ICh0ZW1wX3N0cmluZywgIisiKTsKLQotCSAgc3RybmNhdCAodGVtcF9zdHJpbmcsIHN0cmluZ19zdGFydCwgdGVtcF9kaXNwIC0gc3RyaW5nX3N0YXJ0KTsKLQkgIGlmICgqdGVtcF9kaXNwID09ICcrJyB8fCAqdGVtcF9kaXNwID09ICctJykKLQkgICAgLS10ZW1wX2Rpc3A7Ci0JfQotCi0gICAgICB3aGlsZSAoKnRlbXBfZGlzcCAhPSAnXDAnCi0JICAgICAmJiAqdGVtcF9kaXNwICE9ICcrJwotCSAgICAgJiYgKnRlbXBfZGlzcCAhPSAnLScpCi0JKyt0ZW1wX2Rpc3A7Ci0gICAgfQotCi0gIHJldHVybiB0ZW1wX3N0cmluZzsKLX0KLQotc3RhdGljIGludCBpMzg2X3BhcnNlX3NlZyBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9wYXJzZV9zZWcgKG9wX3N0cmluZykKLSAgICAgY2hhciAqb3Bfc3RyaW5nOwotewotICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgKytvcF9zdHJpbmc7Ci0KLSAgLyogU2hvdWxkIGJlIG9uZSBvZiBlcywgY3MsIHNzLCBkcyBmcyBvciBncyAqLwotICBzd2l0Y2ggKCpvcF9zdHJpbmcrKykKLSAgICB7Ci0gICAgY2FzZSAnZSc6Ci0gICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZXM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZjczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJnNzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZHM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdmJzoKLSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZmczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2cnOgotICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmdzOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiYmFkIHNlZ21lbnQgbmFtZSBgJXMnIiksIG9wX3N0cmluZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKCpvcF9zdHJpbmcrKyAhPSAncycpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgc2VnbWVudCBuYW1lIGAlcyciKSwgb3Bfc3RyaW5nKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgKytvcF9zdHJpbmc7Ci0KLSAgaWYgKCpvcF9zdHJpbmcgIT0gJzonKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIHNlZ21lbnQgbmFtZSBgJXMnIiksIG9wX3N0cmluZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci0KLX0KLQotc3RhdGljIGludCBpMzg2X2luZGV4X2NoZWNrIFBBUkFNUygoY29uc3QgY2hhciAqKSk7Ci0KLS8qIE1ha2Ugc3VyZSB0aGUgbWVtb3J5IG9wZXJhbmQgd2UndmUgYmVlbiBkZWFsdCBpcyB2YWxpZC4KLSAgIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9uIGEgZmFpbHVyZS4KLSovCi1zdGF0aWMgaW50Ci1pMzg2X2luZGV4X2NoZWNrIChvcGVyYW5kX3N0cmluZykKLSAgICAgY29uc3QgY2hhciAqb3BlcmFuZF9zdHJpbmc7Ci17Ci0jaWYgSU5GRVJfQUREUl9QUkVGSVgKLSAgaW50IGZ1ZGdlZCA9IDA7Ci0KLSB0cnlwcmVmaXg6Ci0jZW5kaWYKLSAgaWYgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtBRERSX1BSRUZJWF0gIT0gMCkgPwotICAgICAgLyogMTYgYml0IG1vZGUgY2hlY2tzICovCi0gICAgICAoKGkuYmFzZV9yZWcKLQkmJiAoKGkuYmFzZV9yZWctPnJlZ190eXBlICYgKFJlZzE2fEJhc2VJbmRleCkpCi0JICAgICE9IChSZWcxNnxCYXNlSW5kZXgpKSkKLSAgICAgICB8fCAoaS5pbmRleF9yZWcKLQkgICAmJiAoKChpLmluZGV4X3JlZy0+cmVnX3R5cGUgJiAoUmVnMTZ8QmFzZUluZGV4KSkKLQkJIT0gKFJlZzE2fEJhc2VJbmRleCkpCi0JICAgICAgIHx8ICEgKGkuYmFzZV9yZWcKLQkJICAgICAmJiBpLmJhc2VfcmVnLT5yZWdfbnVtIDwgNgotCQkgICAgICYmIGkuaW5kZXhfcmVnLT5yZWdfbnVtID49IDYKLQkJICAgICAmJiBpLmxvZzJfc2NhbGVfZmFjdG9yID09IDApKSkpIDoKLSAgICAgIC8qIDMyIGJpdCBtb2RlIGNoZWNrcyAqLwotICAgICAgKChpLmJhc2VfcmVnCi0JJiYgKGkuYmFzZV9yZWctPnJlZ190eXBlICYgUmVnMzIpID09IDApCi0gICAgICAgfHwgKGkuaW5kZXhfcmVnCi0JICAgJiYgKChpLmluZGV4X3JlZy0+cmVnX3R5cGUgJiAoUmVnMzJ8QmFzZUluZGV4KSkKLQkgICAgICAgIT0gKFJlZzMyfEJhc2VJbmRleCkpKSkpCi0gICAgewotI2lmIElORkVSX0FERFJfUFJFRklYCi0gICAgICBpZiAoaS5wcmVmaXhbQUREUl9QUkVGSVhdID09IDAgJiYgc3RhY2tvcF9zaXplICE9ICdcMCcpCi0JewotCSAgaS5wcmVmaXhbQUREUl9QUkVGSVhdID0gQUREUl9QUkVGSVhfT1BDT0RFOwotCSAgaS5wcmVmaXhlcyArPSAxOwotCSAgLyogQ2hhbmdlIHRoZSBzaXplIG9mIGFueSBkaXNwbGFjZW1lbnQgdG9vLiAgQXQgbW9zdCBvbmUgb2YKLQkgICAgIERpc3AxNiBvciBEaXNwMzIgaXMgc2V0LgotCSAgICAgRklYTUUuICBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IHJlYWwgbmVlZCBmb3Igc2VwYXJhdGUKLQkgICAgIERpc3AxNiBhbmQgRGlzcDMyIGZsYWdzLiAgVGhlIHNhbWUgZ29lcyBmb3IgSW1tMTYgYW5kIEltbTMyLgotCSAgICAgUmVtb3ZpbmcgdGhlbSB3b3VsZCBwcm9iYWJseSBjbGVhbiB1cCB0aGUgY29kZSBxdWl0ZSBhIGxvdC4KLQkgICovCi0JICBpZiAoaS50eXBlc1t0aGlzX29wZXJhbmRdICYgKERpc3AxNnxEaXNwMzIpKQotCSAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIF49IChEaXNwMTZ8RGlzcDMyKTsKLQkgIGZ1ZGdlZCA9IDE7Ci0JICBnb3RvIHRyeXByZWZpeDsKLQl9Ci0gICAgICBpZiAoZnVkZ2VkKQotCWFzX2JhZCAoXygiYCVzJyBpcyBub3QgYSB2YWxpZCBiYXNlL2luZGV4IGV4cHJlc3Npb24iKSwKLQkJb3BlcmFuZF9zdHJpbmcpOwotICAgICAgZWxzZQotI2VuZGlmCi0JYXNfYmFkIChfKCJgJXMnIGlzIG5vdCBhIHZhbGlkICVzIGJpdCBiYXNlL2luZGV4IGV4cHJlc3Npb24iKSwKLQkJb3BlcmFuZF9zdHJpbmcsCi0JCWZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtBRERSX1BSRUZJWF0gIT0gMCkgPyAiMTYiIDogIjMyIik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQgKG9wZXJhbmRfc3RyaW5nKQotICAgICBjaGFyICpvcGVyYW5kX3N0cmluZzsKLXsKLSAgY2hhciAqb3Bfc3RyaW5nID0gb3BlcmFuZF9zdHJpbmc7Ci0gIGNoYXIgKmVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLQotICBpZiAoKGkubWVtX29wZXJhbmRzID09IDEKLSAgICAgICAmJiAoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiBJc1N0cmluZykgPT0gMCkKLSAgICAgIHx8IGkubWVtX29wZXJhbmRzID09IDIpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ0b28gbWFueSBtZW1vcnkgcmVmZXJlbmNlcyBmb3IgYCVzJyIpLAotCSAgICAgIGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogTG9vayBmb3IgZGlzcGxhY2VtZW50IHByZWNlZGluZyBvcGVuIGJyYWNrZXQgKi8KLSAgaWYgKCpvcF9zdHJpbmcgIT0gJ1snKQotICAgIHsKLSAgICAgIGNoYXIgKmVuZF9zZWc7Ci0gICAgICBjaGFyICp0ZW1wX3N0cmluZzsKLQotICAgICAgZW5kX3NlZyA9IHN0cmNociAob3Bfc3RyaW5nLCAnOicpOwotICAgICAgaWYgKGVuZF9zZWcpCi0JewotCSAgaWYgKCFpMzg2X3BhcnNlX3NlZyAob3Bfc3RyaW5nKSkKLQkgICAgcmV0dXJuIDA7Ci0JICBvcF9zdHJpbmcgPSBlbmRfc2VnICsgMTsKLQl9Ci0KLSAgICAgIHRlbXBfc3RyaW5nID0gYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyAodHJ1ZSwgb3Bfc3RyaW5nKTsKLQotICAgICAgaWYgKGkuZGlzcF9vcGVyYW5kcyA9PSAwICYmCi0JICAhaTM4Nl9kaXNwbGFjZW1lbnQgKHRlbXBfc3RyaW5nLCB0ZW1wX3N0cmluZyArIHN0cmxlbiAodGVtcF9zdHJpbmcpKSkKLQlyZXR1cm4gMDsKLQotICAgICAgZW5kX29mX29wZXJhbmRfc3RyaW5nID0gc3RyY2hyIChvcF9zdHJpbmcsICdbJyk7Ci0gICAgICBpZiAoIWVuZF9vZl9vcGVyYW5kX3N0cmluZykKLQllbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBvcF9zdHJpbmcgKyBzdHJsZW4gKG9wX3N0cmluZyk7Ci0KLSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqZW5kX29mX29wZXJhbmRfc3RyaW5nKSkKLQktLWVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLQotICAgICAgb3Bfc3RyaW5nID0gZW5kX29mX29wZXJhbmRfc3RyaW5nOwotICAgIH0KLQotICBpZiAoKm9wX3N0cmluZyA9PSAnWycpCi0gICAgewotICAgICAgKytvcF9zdHJpbmc7Ci0KLSAgICAgIC8qIFBpY2sgb2ZmIGVhY2ggY29tcG9uZW50IGFuZCBmaWd1cmUgb3V0IHdoZXJlIGl0IGJlbG9uZ3MgKi8KLQotICAgICAgZW5kX29mX29wZXJhbmRfc3RyaW5nID0gb3Bfc3RyaW5nOwotCi0gICAgICB3aGlsZSAoKm9wX3N0cmluZyAhPSAnXScpCi0JewotCSAgY29uc3QgcmVnX2VudHJ5ICp0ZW1wX3JlZzsKLQkgIGNoYXIgKmVuZF9vcDsKLQkgIGNoYXIgKnRlbXBfc3RyaW5nOwotCi0JICB3aGlsZSAoKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnKycKLQkJICYmICplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJy0nCi0JCSAmJiAqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICcqJwotCQkgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnXScpCi0JICAgIGVuZF9vZl9vcGVyYW5kX3N0cmluZysrOwotCi0JICB0ZW1wX3N0cmluZyA9IG9wX3N0cmluZzsKLQkgIGlmICgqdGVtcF9zdHJpbmcgPT0gJysnKQotCSAgICB7Ci0JICAgICAgKyt0ZW1wX3N0cmluZzsKLQkgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKnRlbXBfc3RyaW5nKSkKLQkJKyt0ZW1wX3N0cmluZzsKLQkgICAgfQotCi0JICBpZiAoKCp0ZW1wX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVggfHwgYWxsb3dfbmFrZWRfcmVnKQotCSAgICAgICYmICh0ZW1wX3JlZyA9IHBhcnNlX3JlZ2lzdGVyICh0ZW1wX3N0cmluZywgJmVuZF9vcCkpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoaS5iYXNlX3JlZyA9PSBOVUxMKQotCQlpLmJhc2VfcmVnID0gdGVtcF9yZWc7Ci0JICAgICAgZWxzZQotCQlpLmluZGV4X3JlZyA9IHRlbXBfcmVnOwotCi0JICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEJhc2VJbmRleDsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnRlbXBfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiYmFkIHJlZ2lzdGVyIG5hbWUgYCVzJyIpLCB0ZW1wX3N0cmluZyk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlzX2RpZ2l0X2NoYXIgKCpvcF9zdHJpbmcpCi0JCSAgIHx8ICpvcF9zdHJpbmcgPT0gJysnIHx8ICpvcF9zdHJpbmcgPT0gJy0nKQotCSAgICB7Ci0JICAgICAgdGVtcF9zdHJpbmcgPSBidWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nIChmYWxzZSwgb3Bfc3RyaW5nKTsKLQotCSAgICAgIGlmICgqdGVtcF9zdHJpbmcgPT0gJysnKQotCQkrK3RlbXBfc3RyaW5nOwotCi0JICAgICAgaWYgKGkuZGlzcF9vcGVyYW5kcyA9PSAwICYmCi0JCSAgIWkzODZfZGlzcGxhY2VtZW50ICh0ZW1wX3N0cmluZywgdGVtcF9zdHJpbmcgKyBzdHJsZW4gKHRlbXBfc3RyaW5nKSkpCi0JCXJldHVybiAwOwotCi0JICAgICAgKytvcF9zdHJpbmc7Ci0JICAgICAgZW5kX29mX29wZXJhbmRfc3RyaW5nID0gb3Bfc3RyaW5nOwotCSAgICAgIHdoaWxlICgqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICddJwotCQkgICAgICYmICplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJysnCi0JCSAgICAgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnLScKLQkJICAgICAmJiAqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICcqJykKLQkJKytlbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpvcF9zdHJpbmcgPT0gJyonKQotCSAgICB7Ci0JICAgICAgKytvcF9zdHJpbmc7Ci0KLQkgICAgICBpZiAoaS5iYXNlX3JlZyAmJiAhaS5pbmRleF9yZWcpCi0JCXsKLQkJICBpLmluZGV4X3JlZyA9IGkuYmFzZV9yZWc7Ci0JCSAgaS5iYXNlX3JlZyA9IDA7Ci0JCX0KLQotCSAgICAgIGlmICghaTM4Nl9zY2FsZSAob3Bfc3RyaW5nKSkKLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQkgIG9wX3N0cmluZyA9IGVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLQkgICsrZW5kX29mX29wZXJhbmRfc3RyaW5nOwotCX0KLSAgICB9Ci0KLSAgaWYgKGkzODZfaW5kZXhfY2hlY2sgKG9wZXJhbmRfc3RyaW5nKSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIGkubWVtX29wZXJhbmRzKys7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1pMzg2X2ludGVsX29wZXJhbmQgKG9wZXJhbmRfc3RyaW5nLCBnb3RfYV9mbG9hdCkKLSAgICAgY2hhciAqb3BlcmFuZF9zdHJpbmc7Ci0gICAgIGludCBnb3RfYV9mbG9hdDsKLXsKLSAgY29uc3QgcmVnX2VudHJ5ICogcjsKLSAgY2hhciAqZW5kX29wOwotICBjaGFyICpvcF9zdHJpbmcgPSBvcGVyYW5kX3N0cmluZzsKLQotICBpbnQgb3BlcmFuZF9tb2RpZmllciA9IGkzODZfb3BlcmFuZF9tb2RpZmllciAoJm9wX3N0cmluZywgZ290X2FfZmxvYXQpOwotICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgKytvcF9zdHJpbmc7Ci0KLSAgc3dpdGNoIChvcGVyYW5kX21vZGlmaWVyKQotICAgIHsKLSAgICBjYXNlIEJZVEVfUFRSOgotICAgIGNhc2UgV09SRF9QVFI6Ci0gICAgY2FzZSBEV09SRF9QVFI6Ci0gICAgY2FzZSBRV09SRF9QVFI6Ci0gICAgY2FzZSBYV09SRF9QVFI6Ci0gICAgICBpZiAoIWkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQgKG9wX3N0cmluZykpCi0JcmV0dXJuIDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRkxBVDoKLSAgICBjYXNlIE9GRlNFVF9GTEFUOgotICAgICAgaWYgKCFpMzg2X2ltbWVkaWF0ZSAob3Bfc3RyaW5nKSkKLQlyZXR1cm4gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE9SVDoKLSAgICBjYXNlIE5PTkVfRk9VTkQ6Ci0gICAgICAvKiBTaG91bGQgYmUgcmVnaXN0ZXIgb3IgaW1tZWRpYXRlICovCi0gICAgICBpZiAoaXNfZGlnaXRfY2hhciAoKm9wX3N0cmluZykKLQkgICYmIHN0cmNociAob3Bfc3RyaW5nLCAnWycpID09IDApCi0JewotCSAgaWYgKCFpMzg2X2ltbWVkaWF0ZSAob3Bfc3RyaW5nKSkKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgICAgZWxzZSBpZiAoKCpvcF9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYIHx8IGFsbG93X25ha2VkX3JlZykKLQkgICAgICAgJiYgKHIgPSBwYXJzZV9yZWdpc3RlciAob3Bfc3RyaW5nLCAmZW5kX29wKSkgIT0gTlVMTCkKLQl7Ci0JICAvKiBDaGVjayBmb3IgYSBzZWdtZW50IG92ZXJyaWRlIGJ5IHNlYXJjaGluZyBmb3IgJzonIGFmdGVyIGEKLQkgICAgIHNlZ21lbnQgcmVnaXN0ZXIuICAqLwotCSAgb3Bfc3RyaW5nID0gZW5kX29wOwotCSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotCSAgICArK29wX3N0cmluZzsKLQkgIGlmICgqb3Bfc3RyaW5nID09ICc6JyAmJiAoci0+cmVnX3R5cGUgJiAoU1JlZzIgfCBTUmVnMykpKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyLT5yZWdfbnVtKQotCQl7Ci0JCWNhc2UgMDoKLQkJICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZXM7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMToKLQkJICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmY3M7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMjoKLQkJICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmc3M7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMzoKLQkJICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZHM7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgNDoKLQkJICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZnM7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgNToKLQkJICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZ3M7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICB9Ci0JICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gci0+cmVnX3R5cGUgJiB+QmFzZUluZGV4OwotCSAgaS5yZWdzW3RoaXNfb3BlcmFuZF0gPSByOwotCSAgaS5yZWdfb3BlcmFuZHMrKzsKLQl9Ci0gICAgICBlbHNlIGlmICgqb3Bfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWCkKLQl7Ci0JICBhc19iYWQgKF8oImJhZCByZWdpc3RlciBuYW1lIGAlcyciKSwgb3Bfc3RyaW5nKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UgaWYgKCFpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kIChvcF9zdHJpbmcpKQotCXJldHVybiAwOwotCi0gICAgICBicmVhazsKLSAgICB9ICAvKiBlbmQgc3dpdGNoICovCi0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFBhcnNlIE9QRVJBTkRfU1RSSU5HIGludG8gdGhlIGkzODZfaW5zbiBzdHJ1Y3R1cmUgSS4gIFJldHVybnMgbm9uLXplcm8KLSAgIG9uIGVycm9yLiAqLwotCi1zdGF0aWMgaW50Ci1pMzg2X29wZXJhbmQgKG9wZXJhbmRfc3RyaW5nKQotICAgICBjaGFyICpvcGVyYW5kX3N0cmluZzsKLXsKLSAgY29uc3QgcmVnX2VudHJ5ICpyOwotICBjaGFyICplbmRfb3A7Ci0gIGNoYXIgKm9wX3N0cmluZyA9IG9wZXJhbmRfc3RyaW5nOwotCi0gIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLSAgICArK29wX3N0cmluZzsKLQotICAvKiBXZSBjaGVjayBmb3IgYW4gYWJzb2x1dGUgcHJlZml4IChkaWZmZXJlbnRpYXRpbmcsCi0gICAgIGZvciBleGFtcGxlLCAnam1wIHBjX3JlbGF0aXZlX2xhYmVsJyBmcm9tICdqbXAgKmFic29sdXRlX2xhYmVsJy4gKi8KLSAgaWYgKCpvcF9zdHJpbmcgPT0gQUJTT0xVVEVfUFJFRklYKQotICAgIHsKLSAgICAgICsrb3Bfc3RyaW5nOwotICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotCSsrb3Bfc3RyaW5nOwotICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEp1bXBBYnNvbHV0ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgaWYgb3BlcmFuZCBpcyBhIHJlZ2lzdGVyLiAqLwotICBpZiAoKCpvcF9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYIHx8IGFsbG93X25ha2VkX3JlZykKLSAgICAgICYmIChyID0gcGFyc2VfcmVnaXN0ZXIgKG9wX3N0cmluZywgJmVuZF9vcCkpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogQ2hlY2sgZm9yIGEgc2VnbWVudCBvdmVycmlkZSBieSBzZWFyY2hpbmcgZm9yICc6JyBhZnRlciBhCi0JIHNlZ21lbnQgcmVnaXN0ZXIuICAqLwotICAgICAgb3Bfc3RyaW5nID0gZW5kX29wOwotICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotCSsrb3Bfc3RyaW5nOwotICAgICAgaWYgKCpvcF9zdHJpbmcgPT0gJzonICYmIChyLT5yZWdfdHlwZSAmIChTUmVnMiB8IFNSZWczKSkpCi0JewotCSAgc3dpdGNoIChyLT5yZWdfbnVtKQotCSAgICB7Ci0JICAgIGNhc2UgMDoKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZXM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmY3M7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmc3M7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzoKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZHM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNDoKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZnM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgNToKLQkgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZ3M7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogU2tpcCB0aGUgJzonIGFuZCB3aGl0ZXNwYWNlLiAgKi8KLQkgICsrb3Bfc3RyaW5nOwotCSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotCSAgICArK29wX3N0cmluZzsKLQotCSAgaWYgKCFpc19kaWdpdF9jaGFyICgqb3Bfc3RyaW5nKQotCSAgICAgICYmICFpc19pZGVudGlmaWVyX2NoYXIgKCpvcF9zdHJpbmcpCi0JICAgICAgJiYgKm9wX3N0cmluZyAhPSAnKCcKLQkgICAgICAmJiAqb3Bfc3RyaW5nICE9IEFCU09MVVRFX1BSRUZJWCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiYmFkIG1lbW9yeSBvcGVyYW5kIGAlcyciKSwgb3Bfc3RyaW5nKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgLyogSGFuZGxlIGNhc2Ugb2YgJWVzOipmb28uICovCi0JICBpZiAoKm9wX3N0cmluZyA9PSBBQlNPTFVURV9QUkVGSVgpCi0JICAgIHsKLQkgICAgICArK29wX3N0cmluZzsKLQkgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0JCSsrb3Bfc3RyaW5nOwotCSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBKdW1wQWJzb2x1dGU7Ci0JICAgIH0KLQkgIGdvdG8gZG9fbWVtb3J5X3JlZmVyZW5jZTsKLQl9Ci0gICAgICBpZiAoKm9wX3N0cmluZykKLQl7Ci0JICBhc19iYWQgKF8oIkp1bmsgYCVzJyBhZnRlciByZWdpc3RlciIpLCBvcF9zdHJpbmcpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IHItPnJlZ190eXBlICYgfkJhc2VJbmRleDsKLSAgICAgIGkucmVnc1t0aGlzX29wZXJhbmRdID0gcjsKLSAgICAgIGkucmVnX29wZXJhbmRzKys7Ci0gICAgfQotICBlbHNlIGlmICgqb3Bfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCByZWdpc3RlciBuYW1lIGAlcyciKSwgb3Bfc3RyaW5nKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgZWxzZSBpZiAoKm9wX3N0cmluZyA9PSBJTU1FRElBVEVfUFJFRklYKQotICAgIHsJCQkJLyogLi4uIG9yIGFuIGltbWVkaWF0ZSAqLwotICAgICAgKytvcF9zdHJpbmc7Ci0gICAgICBpZiAoaS50eXBlc1t0aGlzX29wZXJhbmRdICYgSnVtcEFic29sdXRlKQotCXsKLQkgIGFzX2JhZCAoXygiSW1tZWRpYXRlIG9wZXJhbmQgaWxsZWdhbCB3aXRoIGFic29sdXRlIGp1bXAiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBpZiAoIWkzODZfaW1tZWRpYXRlIChvcF9zdHJpbmcpKQotCXJldHVybiAwOwotICAgIH0KLSAgZWxzZSBpZiAoaXNfZGlnaXRfY2hhciAoKm9wX3N0cmluZykKLQkgICB8fCBpc19pZGVudGlmaWVyX2NoYXIgKCpvcF9zdHJpbmcpCi0JICAgfHwgKm9wX3N0cmluZyA9PSAnKCcgKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBtZW1vcnkgcmVmZXJlbmNlIG9mIHNvbWUgc29ydC4gKi8KLSAgICAgIGNoYXIgKmJhc2Vfc3RyaW5nOwotCi0gICAgICAvKiBTdGFydCBhbmQgZW5kIG9mIGRpc3BsYWNlbWVudCBzdHJpbmcgZXhwcmVzc2lvbiAoaWYgZm91bmQpLiAqLwotICAgICAgY2hhciAqZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydDsKLSAgICAgIGNoYXIgKmRpc3BsYWNlbWVudF9zdHJpbmdfZW5kOwotCi0gICAgZG9fbWVtb3J5X3JlZmVyZW5jZToKLSAgICAgIGlmICgoaS5tZW1fb3BlcmFuZHMgPT0gMQotCSAgICYmIChjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIElzU3RyaW5nKSA9PSAwKQotCSAgfHwgaS5tZW1fb3BlcmFuZHMgPT0gMikKLQl7Ci0JICBhc19iYWQgKF8oInRvbyBtYW55IG1lbW9yeSByZWZlcmVuY2VzIGZvciBgJXMnIiksCi0JCSAgY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5uYW1lKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogQ2hlY2sgZm9yIGJhc2UgaW5kZXggZm9ybS4gIFdlIGRldGVjdCB0aGUgYmFzZSBpbmRleCBmb3JtIGJ5Ci0JIGxvb2tpbmcgZm9yIGFuICcpJyBhdCB0aGUgZW5kIG9mIHRoZSBvcGVyYW5kLCBzZWFyY2hpbmcKLQkgZm9yIHRoZSAnKCcgbWF0Y2hpbmcgaXQsIGFuZCBmaW5kaW5nIGEgUkVHSVNURVJfUFJFRklYIG9yICcsJwotCSBhZnRlciB0aGUgJygnLiAgKi8KLSAgICAgIGJhc2Vfc3RyaW5nID0gb3Bfc3RyaW5nICsgc3RybGVuIChvcF9zdHJpbmcpOwotCi0gICAgICAtLWJhc2Vfc3RyaW5nOwotICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JLS1iYXNlX3N0cmluZzsKLQotICAgICAgLyogSWYgd2Ugb25seSBoYXZlIGEgZGlzcGxhY2VtZW50LCBzZXQtdXAgZm9yIGl0IHRvIGJlIHBhcnNlZCBsYXRlci4gKi8KLSAgICAgIGRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQgPSBvcF9zdHJpbmc7Ci0gICAgICBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCA9IGJhc2Vfc3RyaW5nICsgMTsKLQotICAgICAgaWYgKCpiYXNlX3N0cmluZyA9PSAnKScpCi0JewotCSAgY2hhciAqdGVtcF9zdHJpbmc7Ci0JICB1bnNpZ25lZCBpbnQgcGFyZW5zX2JhbGFuY2VkID0gMTsKLQkgIC8qIFdlJ3ZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZSBudW1iZXIgb2YgbGVmdCAmIHJpZ2h0ICgpJ3MgYXJlCi0JICAgICBlcXVhbCwgc28gdGhpcyBsb29wIHdpbGwgbm90IGJlIGluZmluaXRlLiAqLwotCSAgZG8KLQkgICAgewotCSAgICAgIGJhc2Vfc3RyaW5nLS07Ci0JICAgICAgaWYgKCpiYXNlX3N0cmluZyA9PSAnKScpCi0JCXBhcmVuc19iYWxhbmNlZCsrOwotCSAgICAgIGlmICgqYmFzZV9zdHJpbmcgPT0gJygnKQotCQlwYXJlbnNfYmFsYW5jZWQtLTsKLQkgICAgfQotCSAgd2hpbGUgKHBhcmVuc19iYWxhbmNlZCk7Ci0KLQkgIHRlbXBfc3RyaW5nID0gYmFzZV9zdHJpbmc7Ci0KLQkgIC8qIFNraXAgcGFzdCAnKCcgYW5kIHdoaXRlc3BhY2UuICAqLwotCSAgKytiYXNlX3N0cmluZzsKLQkgIGlmIChpc19zcGFjZV9jaGFyICgqYmFzZV9zdHJpbmcpKQotCSAgICArK2Jhc2Vfc3RyaW5nOwotCi0JICBpZiAoKmJhc2Vfc3RyaW5nID09ICcsJwotCSAgICAgIHx8ICgoKmJhc2Vfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWCB8fCBhbGxvd19uYWtlZF9yZWcpCi0JCSAgJiYgKGkuYmFzZV9yZWcgPSBwYXJzZV9yZWdpc3RlciAoYmFzZV9zdHJpbmcsICZlbmRfb3ApKSAhPSBOVUxMKSkKLQkgICAgewotCSAgICAgIGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kID0gdGVtcF9zdHJpbmc7Ci0KLQkgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gQmFzZUluZGV4OwotCi0JICAgICAgaWYgKGkuYmFzZV9yZWcpCi0JCXsKLQkJICBiYXNlX3N0cmluZyA9IGVuZF9vcDsKLQkJICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKLQkJICAgICsrYmFzZV9zdHJpbmc7Ci0JCX0KLQotCSAgICAgIC8qIFRoZXJlIG1heSBiZSBhbiBpbmRleCByZWcgb3Igc2NhbGUgZmFjdG9yIGhlcmUuICAqLwotCSAgICAgIGlmICgqYmFzZV9zdHJpbmcgPT0gJywnKQotCQl7Ci0JCSAgKytiYXNlX3N0cmluZzsKLQkJICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKLQkJICAgICsrYmFzZV9zdHJpbmc7Ci0KLQkJICBpZiAoKCpiYXNlX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVggfHwgYWxsb3dfbmFrZWRfcmVnKQotCQkgICAgICAmJiAoaS5pbmRleF9yZWcgPSBwYXJzZV9yZWdpc3RlciAoYmFzZV9zdHJpbmcsICZlbmRfb3ApKSAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBiYXNlX3N0cmluZyA9IGVuZF9vcDsKLQkJICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCQkrK2Jhc2Vfc3RyaW5nOwotCQkgICAgICBpZiAoKmJhc2Vfc3RyaW5nID09ICcsJykKLQkJCXsKLQkJCSAgKytiYXNlX3N0cmluZzsKLQkJCSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCQkgICAgKytiYXNlX3N0cmluZzsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoKmJhc2Vfc3RyaW5nICE9ICcpJyApCi0JCQl7Ci0JCQkgIGFzX2JhZCAoXygiZXhwZWN0aW5nIGAsJyBvciBgKScgYWZ0ZXIgaW5kZXggcmVnaXN0ZXIgaW4gYCVzJyIpLAotCQkJCSAgb3BlcmFuZF9zdHJpbmcpOwotCQkJICByZXR1cm4gMDsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlIGlmICgqYmFzZV9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oImJhZCByZWdpc3RlciBuYW1lIGAlcyciKSwgYmFzZV9zdHJpbmcpOwotCQkgICAgICByZXR1cm4gMDsKLQkJICAgIH0KLQotCQkgIC8qIENoZWNrIGZvciBzY2FsZSBmYWN0b3IuICovCi0JCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqYmFzZV9zdHJpbmcpKQotCQkgICAgewotCQkgICAgICBpZiAoIWkzODZfc2NhbGUgKGJhc2Vfc3RyaW5nKSkKLQkJCXJldHVybiAwOwotCi0JCSAgICAgICsrYmFzZV9zdHJpbmc7Ci0JCSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqYmFzZV9zdHJpbmcpKQotCQkJKytiYXNlX3N0cmluZzsKLQkJICAgICAgaWYgKCpiYXNlX3N0cmluZyAhPSAnKScpCi0JCQl7Ci0JCQkgIGFzX2JhZCAoXygiZXhwZWN0aW5nIGApJyBhZnRlciBzY2FsZSBmYWN0b3IgaW4gYCVzJyIpLAotCQkJCSAgb3BlcmFuZF9zdHJpbmcpOwotCQkJICByZXR1cm4gMDsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlIGlmICghaS5pbmRleF9yZWcpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIGluZGV4IHJlZ2lzdGVyIG9yIHNjYWxlIGZhY3RvciBhZnRlciBgLCc7IGdvdCAnJWMnIiksCi0JCQkgICAgICAqYmFzZV9zdHJpbmcpOwotCQkgICAgICByZXR1cm4gMDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKCpiYXNlX3N0cmluZyAhPSAnKScpCi0JCXsKLQkJICBhc19iYWQgKF8oImV4cGVjdGluZyBgLCcgb3IgYCknIGFmdGVyIGJhc2UgcmVnaXN0ZXIgaW4gYCVzJyIpLAotCQkJICBvcGVyYW5kX3N0cmluZyk7Ci0JCSAgcmV0dXJuIDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoKmJhc2Vfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiYmFkIHJlZ2lzdGVyIG5hbWUgYCVzJyIpLCBiYXNlX3N0cmluZyk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHRoZXJlJ3MgYW4gZXhwcmVzc2lvbiBiZWdpbm5pbmcgdGhlIG9wZXJhbmQsIHBhcnNlIGl0LAotCSBhc3N1bWluZyBkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0IGFuZAotCSBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCBhcmUgbWVhbmluZ2Z1bC4gICovCi0gICAgICBpZiAoZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCAhPSBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCkKLQl7Ci0JICBpZiAoIWkzODZfZGlzcGxhY2VtZW50IChkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0LAotCQkJCSAgZGlzcGxhY2VtZW50X3N0cmluZ19lbmQpKQotCSAgICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgKCVkeCkgd2hpbGUgZG9pbmcgaW5wdXQvb3V0cHV0IG9wLiAgKi8KLSAgICAgIGlmIChpLmJhc2VfcmVnCi0JICAmJiBpLmJhc2VfcmVnLT5yZWdfdHlwZSA9PSAoUmVnMTYgfCBJbk91dFBvcnRSZWcpCi0JICAmJiBpLmluZGV4X3JlZyA9PSAwCi0JICAmJiBpLmxvZzJfc2NhbGVfZmFjdG9yID09IDAKLQkgICYmIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9PSAwCi0JICAmJiAoaS50eXBlc1t0aGlzX29wZXJhbmRdICYgRGlzcCkgPT0gMCkKLQl7Ci0JICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gPSBJbk91dFBvcnRSZWc7Ci0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIGlmIChpMzg2X2luZGV4X2NoZWNrIChvcGVyYW5kX3N0cmluZykgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGkubWVtX29wZXJhbmRzKys7Ci0gICAgfQotICBlbHNlCi0gICAgewkJCQkvKiBpdCdzIG5vdCBhIG1lbW9yeSBvcGVyYW5kOyBhcmdoISAqLwotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIGNoYXIgJXMgYmVnaW5uaW5nIG9wZXJhbmQgJWQgYCVzJyIpLAotCSAgICAgIG91dHB1dF9pbnZhbGlkICgqb3Bfc3RyaW5nKSwKLQkgICAgICB0aGlzX29wZXJhbmQgKyAxLAotCSAgICAgIG9wX3N0cmluZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwkJCS8qIG5vcm1hbCByZXR1cm4gKi8KLX0KLQwKLS8qCi0gKiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpCi0gKgotICogQ2FsbGVkIGp1c3QgYmVmb3JlIHJlbGF4KCkuCi0gKiBBbnkgc3ltYm9sIHRoYXQgaXMgbm93IHVuZGVmaW5lZCB3aWxsIG5vdCBiZWNvbWUgZGVmaW5lZC4KLSAqIFJldHVybiB0aGUgY29ycmVjdCBmcl9zdWJ0eXBlIGluIHRoZSBmcmFnLgotICogUmV0dXJuIHRoZSBpbml0aWFsICJndWVzcyBmb3IgZnJfdmFyIiB0byBjYWxsZXIuCi0gKiBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCi0gKiBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgotICogQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQotICogMCB2YWx1ZS4KLSAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50OwotewotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpvcGNvZGU7Ci0gIHJlZ2lzdGVyIGludCBvbGRfZnJfZml4OwotCi0gIG9sZF9mcl9maXggPSBmcmFnUC0+ZnJfZml4OwotICBvcGNvZGUgPSAodW5zaWduZWQgY2hhciAqKSBmcmFnUC0+ZnJfb3Bjb2RlOwotICAvKiBXZSd2ZSBhbHJlYWR5IGdvdCBmcmFnUC0+ZnJfc3VidHlwZSByaWdodDsgIGFsbCB3ZSBoYXZlIHRvIGRvIGlzCi0gICAgIGNoZWNrIGZvciB1bi1yZWxheGFibGUgc3ltYm9scy4gICovCi0gIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWdtZW50KQotICAgIHsKLSAgICAgIC8qIHN5bWJvbCBpcyB1bmRlZmluZWQgaW4gdGhpcyBzZWdtZW50ICovCi0gICAgICBpbnQgY29kZTE2ID0gZnJhZ1AtPmZyX3N1YnR5cGUgJiBDT0RFMTY7Ci0gICAgICBpbnQgc2l6ZSA9IGNvZGUxNiA/IDIgOiA0OwotICAgICAgaW50IHBjcmVsX3JlbG9jID0gY29kZTE2ID8gQkZEX1JFTE9DXzE2X1BDUkVMIDogQkZEX1JFTE9DXzMyX1BDUkVMOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZVswXSkKLQl7Ci0JY2FzZSBKVU1QX1BDX1JFTEFUSVZFOgkvKiBtYWtlIGptcCAoMHhlYikgYSBkd29yZCBkaXNwbGFjZW1lbnQganVtcCAqLwotCSAgb3Bjb2RlWzBdID0gMHhlOTsJLyogZHdvcmQgZGlzcCBqbXAgKi8KLQkgIGZyYWdQLT5mcl9maXggKz0gc2l6ZTsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4LCBzaXplLAotCQkgICBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLAotCQkgICAoR09UX3N5bWJvbCAmJiAvKiBOb3QgcXVpdGUgcmlnaHQgLSB3ZSBzaG91bGQgc3dpdGNoIG9uCi0JCQkJICAgICBwcmVzZW5jZSBvZiBAUExULCBidXQgSSBjYW5ub3Qgc2VlIGhvdwotCQkJCSAgICAgdG8gZ2V0IHRvIHRoYXQgZnJvbSBoZXJlLiAgV2Ugc2hvdWxkIGhhdmUKLQkJCQkgICAgIGRvbmUgdGhpcyBpbiBtZF9hc3NlbWJsZSB0byByZWFsbHkKLQkJCQkgICAgIGdldCBpdCByaWdodCBhbGwgb2YgdGhlIHRpbWUsIGJ1dCBJCi0JCQkJICAgICB0aGluayBpdCBkb2VzIG5vdCBtYXR0ZXIgdGhhdCBtdWNoLCBhcwotCQkJCSAgICAgdGhpcyB3aWxsIGJlIHJpZ2h0IG1vc3Qgb2YgdGhlIHRpbWUuIEVSWSovCi0JCSAgICBTX0dFVF9TRUdNRU5UKGZyYWdQLT5mcl9zeW1ib2wpID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICA/IEJGRF9SRUxPQ18zODZfUExUMzIgOiBwY3JlbF9yZWxvYyk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAvKiBUaGlzIGNoYW5nZXMgdGhlIGJ5dGUtZGlzcGxhY2VtZW50IGp1bXAgMHg3TgotCSAgICAgdG8gdGhlIGR3b3JkLWRpc3BsYWNlbWVudCBqdW1wIDB4MGY4Ti4gICovCi0JICBvcGNvZGVbMV0gPSBvcGNvZGVbMF0gKyAweDEwOwotCSAgb3Bjb2RlWzBdID0gVFdPX0JZVEVfT1BDT0RFX0VTQ0FQRTsJLyogdHdvLWJ5dGUgZXNjYXBlICovCi0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyBzaXplOwkvKiB3ZSd2ZSBhZGRlZCBhbiBvcGNvZGUgYnl0ZSAqLwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAxLCBzaXplLAotCQkgICBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLAotCQkgICAoR09UX3N5bWJvbCAmJiAgLyogTm90IHF1aXRlIHJpZ2h0IC0gd2Ugc2hvdWxkIHN3aXRjaCBvbgotCQkJCSAgICAgIHByZXNlbmNlIG9mIEBQTFQsIGJ1dCBJIGNhbm5vdCBzZWUgaG93Ci0JCQkJICAgICAgdG8gZ2V0IHRvIHRoYXQgZnJvbSBoZXJlLiAgRVJZICovCi0JCSAgICBTX0dFVF9TRUdNRU5UKGZyYWdQLT5mcl9zeW1ib2wpID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICA/IEJGRF9SRUxPQ18zODZfUExUMzIgOiBwY3JlbF9yZWxvYyk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBmcmFnX3dhbmUgKGZyYWdQKTsKLSAgICB9Ci0gIHJldHVybiAoZnJhZ1AtPmZyX3ZhciArIGZyYWdQLT5mcl9maXggLSBvbGRfZnJfZml4KTsKLX0JCQkJLyogbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKSAqLwotDAotLyoKLSAqCQkJbWRfY29udmVydF9mcmFnKCk7Ci0gKgotICogQ2FsbGVkIGFmdGVyIHJlbGF4KCkgaXMgZmluaXNoZWQuCi0gKiBJbjoJQWRkcmVzcyBvZiBmcmFnLgotICoJZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudC4KLSAqCWZyX3N1YnR5cGUgaXMgd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLgotICoKLSAqIE91dDoJQW55IGZpeFNzIGFuZCBjb25zdGFudHMgYXJlIHNldCB1cC4KLSAqCUNhbGxlciB3aWxsIHR1cm4gZnJhZyBpbnRvIGEgIi5zcGFjZSAwIi4KLSAqLwotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlYywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHNlZ1Qgc2VjIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSNlbHNlCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWdUIHNlYyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0jZW5kaWYKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqb3Bjb2RlOwotICB1bnNpZ25lZCBjaGFyICp3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gTlVMTDsKLSAgdW5zaWduZWQgaW50IHRhcmdldF9hZGRyZXNzOwotICB1bnNpZ25lZCBpbnQgb3Bjb2RlX2FkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb24gPSAwOwotICBpbnQgZGlzcGxhY2VtZW50X2Zyb21fb3Bjb2RlX3N0YXJ0OwotCi0gIG9wY29kZSA9ICh1bnNpZ25lZCBjaGFyICopIGZyYWdQLT5mcl9vcGNvZGU7Ci0KLSAgLyogQWRkcmVzcyB3ZSB3YW50IHRvIHJlYWNoIGluIGZpbGUgc3BhY2UuICovCi0gIHRhcmdldF9hZGRyZXNzID0gU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsgZnJhZ1AtPmZyX29mZnNldDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSIC8qIG5vdCBuZWVkZWQgb3RoZXJ3aXNlPyAqLwotICB0YXJnZXRfYWRkcmVzcyArPSBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdQLT5mcl9zeW1ib2wpLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0KLSAgLyogQWRkcmVzcyBvcGNvZGUgcmVzaWRlcyBhdCBpbiBmaWxlIHNwYWNlLiAqLwotICBvcGNvZGVfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeDsKLQotICAvKiBEaXNwbGFjZW1lbnQgZnJvbSBvcGNvZGUgc3RhcnQgdG8gZmlsbCBpbnRvIGluc3RydWN0aW9uLiAqLwotICBkaXNwbGFjZW1lbnRfZnJvbV9vcGNvZGVfc3RhcnQgPSB0YXJnZXRfYWRkcmVzcyAtIG9wY29kZV9hZGRyZXNzOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIFNNQUxMKToKLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBTTUFMTDE2KToKLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIFNNQUxMKToKLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIFNNQUxMMTYpOgotICAgICAgLyogZG9uJ3QgaGF2ZSB0byBjaGFuZ2Ugb3Bjb2RlICovCi0gICAgICBleHRlbnNpb24gPSAxOwkJLyogMSBvcGNvZGUgKyAxIGRpc3BsYWNlbWVudCAqLwotICAgICAgd2hlcmVfdG9fcHV0X2Rpc3BsYWNlbWVudCA9ICZvcGNvZGVbMV07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIEJJRyk6Ci0gICAgICBleHRlbnNpb24gPSA1OwkJLyogMiBvcGNvZGUgKyA0IGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzFdID0gb3Bjb2RlWzBdICsgMHgxMDsKLSAgICAgIG9wY29kZVswXSA9IFRXT19CWVRFX09QQ09ERV9FU0NBUEU7Ci0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsyXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcpOgotICAgICAgZXh0ZW5zaW9uID0gNDsJCS8qIDEgb3Bjb2RlICsgNCBkaXNwbGFjZW1lbnQgKi8KLSAgICAgIG9wY29kZVswXSA9IDB4ZTk7Ci0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgQklHMTYpOgotICAgICAgZXh0ZW5zaW9uID0gMzsJCS8qIDIgb3Bjb2RlICsgMiBkaXNwbGFjZW1lbnQgKi8KLSAgICAgIG9wY29kZVsxXSA9IG9wY29kZVswXSArIDB4MTA7Ci0gICAgICBvcGNvZGVbMF0gPSBUV09fQllURV9PUENPREVfRVNDQVBFOwotICAgICAgd2hlcmVfdG9fcHV0X2Rpc3BsYWNlbWVudCA9ICZvcGNvZGVbMl07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgQklHMTYpOgotICAgICAgZXh0ZW5zaW9uID0gMjsJCS8qIDEgb3Bjb2RlICsgMiBkaXNwbGFjZW1lbnQgKi8KLSAgICAgIG9wY29kZVswXSA9IDB4ZTk7Ci0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJBRF9DQVNFIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIC8qIG5vdyBwdXQgZGlzcGxhY2VtZW50IGFmdGVyIG9wY29kZSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQsCi0JCSAgICAgICh2YWx1ZVQpIChkaXNwbGFjZW1lbnRfZnJvbV9vcGNvZGVfc3RhcnQgLSBleHRlbnNpb24pLAotCQkgICAgICBTSVpFX0ZST01fUkVMQVhfU1RBVEUgKGZyYWdQLT5mcl9zdWJ0eXBlKSk7Ci0gIGZyYWdQLT5mcl9maXggKz0gZXh0ZW5zaW9uOwotfQotDAotCi1pbnQgbWRfc2hvcnRfanVtcF9zaXplID0gMjsJLyogc2l6ZSBvZiBieXRlIGRpc3BsYWNlbWVudCBqbXAgKi8KLWludCBtZF9sb25nX2p1bXBfc2l6ZSA9IDU7CS8qIHNpemUgb2YgZHdvcmQgZGlzcGxhY2VtZW50IGptcCAqLwotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSA4OwkvKiBTaXplIG9mIHJlbG9jYXRpb24gcmVjb3JkICovCi0KLXZvaWQKLW1kX2NyZWF0ZV9zaG9ydF9qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWcgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGxvbmcgb2Zmc2V0OwotCi0gIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgMik7Ci0gIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweGViLCAxKTsJLyogb3Bjb2RlIGZvciBieXRlLWRpc3AganVtcCAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciArIDEsICh2YWx1ZVQpIG9mZnNldCwgMSk7Ci19Ci0KLXZvaWQKLW1kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICBsb25nIG9mZnNldDsKLQotICBpZiAoZmxhZ19kb19sb25nX2p1bXApCi0gICAgewotICAgICAgb2Zmc2V0ID0gdG9fYWRkciAtIFNfR0VUX1ZBTFVFICh0b19zeW1ib2wpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4ZTksIDEpOy8qIG9wY29kZSBmb3IgbG9uZyBqbXAgKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKLSAgICAgIGZpeF9uZXcgKGZyYWcsIChwdHIgKyAxKSAtIGZyYWctPmZyX2xpdGVyYWwsIDQsCi0JICAgICAgIHRvX3N5bWJvbCwgKG9mZnNldFQpIDAsIDAsIEJGRF9SRUxPQ18zMik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyA1KTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweGU5LCAxKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKLSAgICB9Ci19Ci0MCi0vKiBBcHBseSBhIGZpeHVwIChmaXhTKSB0byBzZWdtZW50IGRhdGEsIG9uY2UgaXQgaGFzIGJlZW4gZGV0ZXJtaW5lZAotICAgYnkgb3VyIGNhbGxlciB0aGF0IHdlIGhhdmUgYWxsIHRoZSBpbmZvIHdlIG5lZWQgdG8gZml4IGl0IHVwLgotCi0gICBPbiB0aGUgMzg2LCBpbW1lZGlhdGVzLCBkaXNwbGFjZW1lbnRzLCBhbmQgZGF0YSBwb2ludGVycyBhcmUgYWxsIGluCi0gICB0aGUgc2FtZSAobGl0dGxlLWVuZGlhbikgZm9ybWF0LCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNhcmUgYWJvdXQgd2hpY2gKLSAgIHdlIGFyZSBoYW5kbGluZy4gICovCi0KLWludAotbWRfYXBwbHlfZml4MyAoZml4UCwgdmFscCwgc2VnKQotICAgICBmaXhTICpmaXhQOwkJLyogVGhlIGZpeCB3ZSdyZSB0byBwdXQgaW4uICAqLwotICAgICB2YWx1ZVQgKnZhbHA7CQkvKiBQb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gICovCi0gICAgIHNlZ1Qgc2VnIEFUVFJJQlVURV9VTlVTRUQ7CS8qIFNlZ21lbnQgZml4IGlzIGZyb20uICAqLwotewotICByZWdpc3RlciBjaGFyICpwID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICB2YWx1ZVQgdmFsdWUgPSAqdmFscDsKLQotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmICFkZWZpbmVkIChURV9NYWNoKQotICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0gICAgewotICAgICAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DXzMyOgotCSAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfMTY6Ci0JICBmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ184OgotCSAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSBoYWNrLiAgVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpcy4KLSAgICAgVGhpcyBjb3ZlcnMgZm9yIHRoZSBmYWN0IHRoYXQgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsCi0gICAgIHN1YnRyYWN0IHRoZSBjdXJyZW50IGxvY2F0aW9uIChmb3IgcGFydGlhbF9pbnBsYWNlLCBQQyByZWxhdGl2ZQotICAgICByZWxvY2F0aW9ucyk7IHNlZSBtb3JlIGJlbG93LiAgKi8KLSAgaWYgKChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyX1BDUkVMCi0gICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNl9QQ1JFTAotICAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfOF9QQ1JFTCkKLSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5KQotICAgIHsKLSNpZm5kZWYgT0JKX0FPVVQKLSAgICAgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSNpZmRlZiBURV9QRQotCSAgfHwgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotI2VuZGlmCi0JICApCi0JdmFsdWUgKz0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKLSAgICAgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JewotCSAgc2VnVCBmc2VnID0gU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpOwotCi0JICBpZiAoKGZzZWcgPT0gc2VnCi0JICAgICAgIHx8IChzeW1ib2xfc2VjdGlvbl9wIChmaXhQLT5meF9hZGRzeSkKLQkJICAgJiYgZnNlZyAhPSBhYnNvbHV0ZV9zZWN0aW9uKSkKLQkgICAgICAmJiAhIFNfSVNfRVhURVJOQUwgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICAgICYmICEgU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkKLQkgICAgICAmJiBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICAgICYmICEgU19JU19DT01NT04gKGZpeFAtPmZ4X2FkZHN5KSkKLQkgICAgewotCSAgICAgIC8qIFllcywgd2UgYWRkIHRoZSB2YWx1ZXMgaW4gdHdpY2UuICBUaGlzIGlzIGJlY2F1c2UKLQkJIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gc3VidHJhY3RzIHRoZW0gb3V0IGFnYWluLiAgSSB0aGluawotCQkgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBpcyBicm9rZW4sIGJ1dCBJIGRvbid0IGRhcmUgY2hhbmdlCi0JCSBpdC4gIEZJWE1FLiAgKi8KLQkgICAgICB2YWx1ZSArPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChPQkpfQ09GRikgJiYgZGVmaW5lZCAoVEVfUEUpCi0gICAgICAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBQRSBmb3JtYXQgZG9lcyBub3Qgc3RvcmUgYSBzZWN0aW9uCi0JIGFkZHJlc3Mgb2Zmc2V0IGZvciBhIFBDIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHNlZykKLQl2YWx1ZSArPSBtZF9wY3JlbF9mcm9tIChmaXhQKTsKLSAgICAgIGVsc2UgaWYgKFNfSVNfRVhURVJOQUwgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICAgICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLQl7Ci0JICAvKiBXZSBhcmUgZ2VuZXJhdGluZyBhbiBleHRlcm5hbCByZWxvY2F0aW9uIGZvciB0aGlzIGRlZmluZWQKLSAgICAgICAgICAgICBzeW1ib2wuICBXZSBhZGQgdGhlIGFkZHJlc3MsIGJlY2F1c2UKLSAgICAgICAgICAgICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdpbGwgc3VidHJhY3QgaXQuICBWQUxVRSBhbHJlYWR5Ci0gICAgICAgICAgICAgaG9sZHMgdGhlIHN5bWJvbCB2YWx1ZSwgYmVjYXVzZSBmaXh1cF9zZWdtZW50IGFkZGVkIGl0Ci0gICAgICAgICAgICAgaW4uICBXZSBzdWJ0cmFjdCBpdCBvdXQsIGFuZCB0aGVuIHdlIHN1YnRyYWN0IGl0IG91dAotICAgICAgICAgICAgIGFnYWluIGJlY2F1c2UgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsIGFkZCBpdCBpbgotICAgICAgICAgICAgIGFnYWluLiAgKi8KLQkgIHZhbHVlICs9IG1kX3BjcmVsX2Zyb20gKGZpeFApOwotCSAgdmFsdWUgLT0gMiAqIFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSk7Ci0JfQotI2VuZGlmCi0gICAgfQotI2lmZGVmIFRFX1BFCi0gIGVsc2UgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAmJiBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICYmIChTX0lTX0VYVEVSTkFMIChmaXhQLT5meF9hZGRzeSkKLQkgICAgICAgfHwgU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpKQotICAgIHsKLSAgICAgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIGFuIGV4dGVybmFsIHJlbG9jYXRpb24gZm9yIHRoaXMgZGVmaW5lZAotICAgICAgICAgc3ltYm9sLiAgVkFMVUUgYWxyZWFkeSBob2xkcyB0aGUgc3ltYm9sIHZhbHVlLCBhbmQKLSAgICAgICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gd2lsbCBhZGQgaXQgaW4gYWdhaW4uICBXZSBkb24ndCB3YW50Ci0gICAgICAgICBlaXRoZXIgYWRkaXRpb24uICAqLwotICAgICAgdmFsdWUgLT0gMiAqIFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogRml4IGEgZmV3IHRoaW5ncyAtIHRoZSBkeW5hbWljIGxpbmtlciBleHBlY3RzIGNlcnRhaW4gdmFsdWVzIGhlcmUsCi0gICAgIGFuZCB3ZSBtdXN0IG5vdCBkaXNzYXBwb2ludCBpdC4gKi8KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICAmJiBmaXhQLT5meF9hZGRzeSkKLSAgICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkgewotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9QTFQzMjoKLSAgICAgIC8qIE1ha2UgdGhlIGp1bXAgaW5zdHJ1Y3Rpb24gcG9pbnQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9wZXJhbmQuICBBdAotCSBydW50aW1lIHdlIG1lcmVseSBhZGQgdGhlIG9mZnNldCB0byB0aGUgYWN0dWFsIFBMVCBlbnRyeS4gKi8KLSAgICAgIHZhbHVlID0gMHhmZmZmZmZmYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1RQQzoKLS8qCi0gKiAgIFRoaXMgaXMgdG91Z2ggdG8gZXhwbGFpbi4gIFdlIGVuZCB1cCB3aXRoIHRoaXMgb25lIGlmIHdlIGhhdmUKLSAqIG9wZXJhbmRzIHRoYXQgbG9vayBsaWtlICJfR0xPQkFMX09GRlNFVF9UQUJMRV8rWy4tLkwyODRdIi4gIFRoZSBnb2FsCi0gKiBoZXJlIGlzIHRvIG9idGFpbiB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiB0aGUgR09ULCBhbmQgaXQgaXMgc3Ryb25nbHkKLSAqIHByZWZlcmFibGUgZnJvbSBhIHBlcmZvcm1hbmNlIHBvaW50IG9mIHZpZXcgdG8gYXZvaWQgdXNpbmcgYSBydW50aW1lCi0gKiByZWxvY2F0aW9uIGZvciB0aGlzLiAgVGhlIGFjdHVhbCBzZXF1ZW5jZSBvZiBpbnN0cnVjdGlvbnMgb2Z0ZW4gbG9vawotICogc29tZXRoaW5nIGxpa2U6Ci0gKgotICoJY2FsbAkuTDY2Ci0gKiAuTDY2OgotICoJcG9wbAklZWJ4Ci0gKglhZGRsCSRfR0xPQkFMX09GRlNFVF9UQUJMRV8rWy4tLkw2Nl0sJWVieAotICoKLSAqICAgVGhlIGNhbGwgYW5kIHBvcCBlc3NlbnRpYWxseSByZXR1cm4gdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YKLSAqIHRoZSBsYWJlbCAuTDY2IGFuZCBzdG9yZSBpdCBpbiAlZWJ4LiAgVGhlIGxpbmtlciBpdHNlbGYgd2lsbAotICogdWx0aW1hdGVseSBjaGFuZ2UgdGhlIGZpcnN0IG9wZXJhbmQgb2YgdGhlIGFkZGwgc28gdGhhdCAlZWJ4IHBvaW50cyB0bwotICogdGhlIEdPVCwgYnV0IHRvIGtlZXAgdGhpbmdzIHNpbXBsZSwgdGhlIC5vIGZpbGUgbXVzdCBoYXZlIHRoaXMgb3BlcmFuZAotICogc2V0IHNvIHRoYXQgaXQgZ2VuZXJhdGVzIG5vdCB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiAuTDY2LCBidXQgdGhlCi0gKiBhYnNvbHV0ZSBhZGRyZXNzIG9mIGl0c2VsZi4gIFRoaXMgYWxsb3dzIHRoZSBsaW5rZXIgaXRzZWxmIHNpbXBseQotICogdHJlYXQgYSBHT1RQQyByZWxvY2F0aW9uIGFzIGFza2luZyBmb3IgYSBwY3JlbCBvZmZzZXQgdG8gdGhlIEdPVCB0byBiZQotICogYWRkZWQgaW4sIGFuZCB0aGUgYWRkZW5kIG9mIHRoZSByZWxvY2F0aW9uIGlzIHN0b3JlZCBpbiB0aGUgb3BlcmFuZAotICogZmllbGQgZm9yIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYuCi0gKgotICogICBPdXIgam9iIGhlcmUgaXMgdG8gZml4IHRoZSBvcGVyYW5kIHNvIHRoYXQgaXQgd291bGQgYWRkIHRoZSBjb3JyZWN0Ci0gKiBvZmZzZXQgc28gdGhhdCAlZWJ4IHdvdWxkIHBvaW50IHRvIGl0c2VsZi4gIFRoZSB0aGluZyB0aGF0IGlzIHRyaWNreSBpcwotICogdGhhdCAuLS5MNjYgd2lsbCBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnN0cnVjdGlvbiwgc28gd2UgbmVlZAotICogdG8gZnVydGhlciBtb2RpZnkgdGhlIG9wZXJhbmQgc28gdGhhdCBpdCB3aWxsIHBvaW50IHRvIGl0c2VsZi4KLSAqIFRoZXJlIGFyZSBvdGhlciBjYXNlcyB3aGVyZSB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZToKLSAqCi0gKgkubG9uZwkkX0dMT0JBTF9PRkZTRVRfVEFCTEVfK1suLS5MNjZdCi0gKgotICogYW5kIGhlcmUgbm8gY29ycmVjdGlvbiB3b3VsZCBiZSByZXF1aXJlZC4gIEludGVybmFsbHkgaW4gdGhlIGFzc2VtYmxlcgotICogd2UgdHJlYXQgb3BlcmFuZHMgb2YgdGhpcyBmb3JtIGFzIG5vdCBiZWluZyBwY3JlbCBzaW5jZSB0aGUgJy4nIGlzCi0gKiBleHBsaWNpdGx5IG1lbnRpb25lZCwgYW5kIEkgd29uZGVyIHdoZXRoZXIgaXQgd291bGQgc2ltcGxpZnkgbWF0dGVycwotICogdG8gZG8gaXQgdGhpcyB3YXkuICBXaG8ga25vd3MuICBJbiBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBQSUMgcGF0Y2hlcywKLSAqIHRoZSBwY3JlbF9hZGp1c3QgZmllbGQgd2FzIHVzZWQgdG8gc3RvcmUgdGhlIGNvcnJlY3Rpb24sIGJ1dCBzaW5jZSB0aGUKLSAqIGV4cHJlc3Npb24gaXMgbm90IHBjcmVsLCBJIGZlbHQgaXQgd291bGQgYmUgY29uZnVzaW5nIHRvIGRvIGl0IHRoaXMgd2F5LgotICovCi0gICAgICB2YWx1ZSAtPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVDMyOgotICAgICAgdmFsdWUgPSAwOyAvKiBGdWxseSByZXNvbHZlZCBhdCBydW50aW1lLiAgTm8gYWRkZW5kLiAgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1RPRkY6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotI2VuZGlmIC8qIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpICovCi0gICp2YWxwID0gdmFsdWU7Ci0jZW5kaWYgLyogZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgIWRlZmluZWQgKFRFX01hY2gpICovCi0gIG1kX251bWJlcl90b19jaGFycyAocCwgdmFsdWUsIGZpeFAtPmZ4X3NpemUpOwotCi0gIHJldHVybiAxOwotfQotCi0jaWYgMAotLyogVGhpcyBpcyBuZXZlciB1c2VkLiAgKi8KLWxvbmcJCQkJLyogS25vd3MgYWJvdXQgdGhlIGJ5dGUgb3JkZXIgaW4gYSB3b3JkLiAqLwotbWRfY2hhcnNfdG9fbnVtYmVyIChjb24sIG5ieXRlcykKLSAgICAgdW5zaWduZWQgY2hhciBjb25bXTsJLyogTG93IG9yZGVyIGJ5dGUgMXN0LiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBpbnB1dC4gKi8KLXsKLSAgbG9uZyByZXR2YWw7Ci0gIGZvciAocmV0dmFsID0gMCwgY29uICs9IG5ieXRlcyAtIDE7IG5ieXRlcy0tOyBjb24tLSkKLSAgICB7Ci0gICAgICByZXR2YWwgPDw9IEJJVFNfUEVSX0NIQVI7Ci0gICAgICByZXR2YWwgfD0gKmNvbjsKLSAgICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0jZW5kaWYgLyogMCAqLwotDAotCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgbGl0UCBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIGVtaXQgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQKLSAgIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4gICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gbWRfYXRvZiAoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAvKiBUaGlzIGxvb3BzIG91dHB1dHMgdGhlIExJVFRMRU5VTXMgaW4gUkVWRVJTRSBvcmRlcjsgaW4gYWNjb3JkIHdpdGgKLSAgICAgdGhlIGJpZ2VuZGlhbiAzODYuICAqLwotICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjIC0gMTsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFAtLSksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQwKLWNoYXIgb3V0cHV0X2ludmFsaWRfYnVmWzhdOwotCi1zdGF0aWMgY2hhciAqIG91dHB1dF9pbnZhbGlkIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgY2hhciAqCi1vdXRwdXRfaW52YWxpZCAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGlmIChpc3ByaW50IChjKSkKLSAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICInJWMnIiwgYyk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICIoMHgleCkiLCAodW5zaWduZWQpIGMpOwotICByZXR1cm4gb3V0cHV0X2ludmFsaWRfYnVmOwotfQotCi0KLS8qIFJFR19TVFJJTkcgc3RhcnRzICpiZWZvcmUqIFJFR0lTVEVSX1BSRUZJWC4gICovCi0KLXN0YXRpYyBjb25zdCByZWdfZW50cnkgKgotcGFyc2VfcmVnaXN0ZXIgKHJlZ19zdHJpbmcsIGVuZF9vcCkKLSAgICAgY2hhciAqcmVnX3N0cmluZzsKLSAgICAgY2hhciAqKmVuZF9vcDsKLXsKLSAgY2hhciAqcyA9IHJlZ19zdHJpbmc7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgcmVnX25hbWVfZ2l2ZW5bTUFYX1JFR19OQU1FX1NJWkUgKyAxXTsKLSAgY29uc3QgcmVnX2VudHJ5ICpyOwotCi0gIC8qIFNraXAgcG9zc2libGUgUkVHSVNURVJfUFJFRklYIGFuZCBwb3NzaWJsZSB3aGl0ZXNwYWNlLiAgKi8KLSAgaWYgKCpzID09IFJFR0lTVEVSX1BSRUZJWCkKLSAgICArK3M7Ci0KLSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpzKSkKLSAgICArK3M7Ci0KLSAgcCA9IHJlZ19uYW1lX2dpdmVuOwotICB3aGlsZSAoKCpwKysgPSByZWdpc3Rlcl9jaGFyc1sodW5zaWduZWQgY2hhcikgKnNdKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGlmIChwID49IHJlZ19uYW1lX2dpdmVuICsgTUFYX1JFR19OQU1FX1NJWkUpCi0JcmV0dXJuIChjb25zdCByZWdfZW50cnkgKikgTlVMTDsKLSAgICAgIHMrKzsKLSAgICB9Ci0KLSAgKmVuZF9vcCA9IHM7Ci0KLSAgciA9IChjb25zdCByZWdfZW50cnkgKikgaGFzaF9maW5kIChyZWdfaGFzaCwgcmVnX25hbWVfZ2l2ZW4pOwotCi0gIC8qIEhhbmRsZSBmbG9hdGluZyBwb2ludCByZWdzLCBhbGxvd2luZyBzcGFjZXMgaW4gdGhlIChpKSBwYXJ0LiAgKi8KLSAgaWYgKHIgPT0gaTM4Nl9yZWd0YWIgLyogJXN0IGlzIGZpcnN0IGVudHJ5IG9mIHRhYmxlICovKQotICAgIHsKLSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqcykpCi0JKytzOwotICAgICAgaWYgKCpzID09ICcoJykKLQl7Ci0JICArK3M7Ci0JICBpZiAoaXNfc3BhY2VfY2hhciAoKnMpKQotCSAgICArK3M7Ci0JICBpZiAoKnMgPj0gJzAnICYmICpzIDw9ICc3JykKLQkgICAgewotCSAgICAgIHIgPSAmaTM4Nl9mbG9hdF9yZWd0YWJbKnMgLSAnMCddOwotCSAgICAgICsrczsKLQkgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKnMpKQotCQkrK3M7Ci0JICAgICAgaWYgKCpzID09ICcpJykKLQkJewotCQkgICplbmRfb3AgPSBzICsgMTsKLQkJICByZXR1cm4gcjsKLQkJfQotCSAgICB9Ci0JICAvKiBXZSBoYXZlICIlc3QoIiB0aGVuIGdhcmJhZ2UgKi8KLQkgIHJldHVybiAoY29uc3QgcmVnX2VudHJ5ICopIE5VTEw7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcjsKLX0KLQwKLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImttVlE6c3EiOwotI2Vsc2UKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJtIjsKLSNlbmRpZgotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ20nOgotICAgICAgZmxhZ19kb19sb25nX2p1bXAgPSAxOwotICAgICAgYnJlYWs7Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotICAgICAgLyogLWs6IElnbm9yZSBmb3IgRnJlZUJTRCBjb21wYXRpYmlsaXR5LiAgKi8KLSAgICBjYXNlICdrJzoKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAtVjogU1ZSNCBhcmd1bWVudCB0byBwcmludCB2ZXJzaW9uIElELiAgKi8KLSAgICBjYXNlICdWJzoKLSAgICAgIHByaW50X3ZlcnNpb25faWQgKCk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogLVF5LCAtUW46IFNWUjQgYXJndW1lbnRzIGNvbnRyb2xsaW5nIHdoZXRoZXIgYSAuY29tbWVudCBzZWN0aW9uCi0JIHNob3VsZCBiZSBlbWl0dGVkIG9yIG5vdC4gIEZJWE1FOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICAgIGNhc2UgJ1EnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICAgIC8qIC1zOiBPbiBpMzg2IFNvbGFyaXMsIHRoaXMgdGVsbHMgdGhlIG5hdGl2ZSBhc3NlbWJsZXIgdG8gdXNlCi0gICAgICAgICAuc3RhYiBpbnN0ZWFkIG9mIC5zdGFiLmV4Y2wuICBXZSBhbHdheXMgdXNlIC5zdGFiIGFueWhvdy4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3EnOgotICAgICAgLyogLXE6IE9uIGkzODYgU29sYXJpcywgdGhpcyB0ZWxscyB0aGUgbmF0aXZlIGFzc2VtYmxlciBkb2VzCi0gICAgICAgICBmZXdlciBjaGVja3MuICAqLwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1tCQkJICBkbyBsb25nIGp1bXBcbiIpKTsKLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLVYJCQkgIHByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlclxuXAotICAtawkJCSAgaWdub3JlZFxuXAotICAtUXksIC1RbgkJICBpZ25vcmVkXG5cCi0gIC1xCQkJICBpZ25vcmVkXG5cCi0gIC1zCQkJICBpZ25vcmVkXG4iKSk7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBPQkpfTUFZQkVfRUxGCi0jaWZkZWYgT0JKX01BWUJFX0NPRkYKLQotLyogUGljayB0aGUgdGFyZ2V0IGZvcm1hdCB0byB1c2UuICAqLwotCi1jb25zdCBjaGFyICAqCi1pMzg2X3RhcmdldF9mb3JtYXQgKCkKLXsKLSAgc3dpdGNoIChPVVRQVVRfRkxBVk9SKQotICAgIHsKLSAgICBjYXNlIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyOgotICAgICAgcmV0dXJuICJjb2ZmLWkzODYiOwotICAgIGNhc2UgYmZkX3RhcmdldF9lbGZfZmxhdm91cjoKLSAgICAgIHJldHVybiAiZWxmMzItaTM4NiI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogT0JKX01BWUJFX0NPRkYgKi8KLSNlbmRpZiAvKiBPQkpfTUFZQkVfRUxGICovCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotDAotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUVbMF0KLSAgICAgICYmIG5hbWVbMV0gPT0gR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FWzFdCi0gICAgICAmJiBuYW1lWzJdID09IEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRVsyXQotICAgICAgJiYgc3RyY21wIChuYW1lLCBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpID09IDApCi0gICAgewotICAgICAgaWYgKCFHT1Rfc3ltYm9sKQotCXsKLQkgIGlmIChzeW1ib2xfZmluZCAobmFtZSkpCi0JICAgIGFzX2JhZCAoXygiR09UIGFscmVhZHkgaW4gc3ltYm9sIHRhYmxlIikpOwotCSAgR09UX3N5bWJvbCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLAotCQkJCSAgICh2YWx1ZVQpIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JfTsKLSAgICAgIHJldHVybiBHT1Rfc3ltYm9sOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSNpZmRlZiBPQkpfQU9VVAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogRm9yIGEub3V0LCBmb3JjZSB0aGUgc2VjdGlvbiBzaXplIHRvIGJlIGFsaWduZWQuICBJZiB3ZSBkb24ndCBkbwotICAgICB0aGlzLCBCRkQgd2lsbCBhbGlnbiBpdCBmb3IgdXMsIGJ1dCBpdCB3aWxsIG5vdCB3cml0ZSBvdXQgdGhlCi0gICAgIGZpbmFsIGJ5dGVzIG9mIHRoZSBzZWN0aW9uLiAgVGhpcyBtYXkgYmUgYSBidWcgaW4gQkZELCBidXQgaXQgaXMKLSAgICAgZWFzaWVyIHRvIGZpeCBpdCBoZXJlIHNpbmNlIHRoYXQgaXMgaG93IHRoZSBvdGhlciBhLm91dCB0YXJnZXRzCi0gICAgIHdvcmsuICAqLwotICBpbnQgYWxpZ247Ci0KLSAgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOwotICBzaXplID0gKChzaXplICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoKHZhbHVlVCkgLTEgPDwgYWxpZ24pKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIE9uIHRoZSBpMzg2LCBQQy1yZWxhdGl2ZSBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlCi0gICBuZXh0IGluc3RydWN0aW9uLiAgVGhhdCBpcywgdGhlIGFkZHJlc3Mgb2YgdGhlIG9mZnNldCwgcGx1cyBpdHMKLSAgIHNpemUsIHNpbmNlIHRoZSBvZmZzZXQgaXMgYWx3YXlzIHRoZSBsYXN0IHBhcnQgb2YgdGhlIGluc24uICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotI2lmbmRlZiBJMzg2Q09GRgotCi1zdGF0aWMgdm9pZAotc19ic3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAoc3Vic2VnVCkgdGVtcCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLSNlbmRpZgotCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLXZvaWQKLWkzODZfdmFsaWRhdGVfZml4IChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBpZiAoZml4cC0+Znhfc3Vic3kgJiYgZml4cC0+Znhfc3Vic3kgPT0gR09UX3N5bWJvbCkKLSAgICB7Ci0gICAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMzg2X0dPVE9GRjsKLSAgICAgIGZpeHAtPmZ4X3N1YnN5ID0gMDsKLSAgICB9Ci19Ci0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWw7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfUExUMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVDMyOgotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1RPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVFBDOgotICAgIGNhc2UgQkZEX1JFTE9DX1JWQToKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLQl7Ci0JICBzd2l0Y2ggKGZpeHAtPmZ4X3NpemUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIiksCi0JCSAgICAgIGZpeHAtPmZ4X3NpemUpOwotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTogY29kZSA9IEJGRF9SRUxPQ184X1BDUkVMOyAgYnJlYWs7Ci0JICAgIGNhc2UgMjogY29kZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsgYnJlYWs7Ci0JICAgIGNhc2UgNDogY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChmaXhwLT5meF9zaXplKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcmVsb2NhdGlvbiIpLCBmaXhwLT5meF9zaXplKTsKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE6IGNvZGUgPSBCRkRfUkVMT0NfODsgIGJyZWFrOwotCSAgICBjYXNlIDI6IGNvZGUgPSBCRkRfUkVMT0NfMTY7IGJyZWFrOwotCSAgICBjYXNlIDQ6IGNvZGUgPSBCRkRfUkVMT0NfMzI7IGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChjb2RlID09IEJGRF9SRUxPQ18zMgotICAgICAgJiYgR09UX3N5bWJvbAotICAgICAgJiYgZml4cC0+ZnhfYWRkc3kgPT0gR09UX3N5bWJvbCkKLSAgICBjb2RlID0gQkZEX1JFTE9DXzM4Nl9HT1RQQzsKLQotICByZWwgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0KLSAgcmVsLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICAvKiBIQUNLOiBTaW5jZSBpMzg2IEVMRiB1c2VzIFJlbCBpbnN0ZWFkIG9mIFJlbGEsIGVuY29kZSB0aGUKLSAgICAgdnRhYmxlIGVudHJ5IHRvIGJlIHVzZWQgaW4gdGhlIHJlbG9jYXRpb24ncyBzZWN0aW9uIG9mZnNldC4gICovCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9vZmZzZXQ7Ci0KLSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHJlbC0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgcmVsLT5hZGRlbmQgPSAwOwotCi0gIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0gIGlmIChyZWwtPmhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiQ2Fubm90IHJlcHJlc2VudCByZWxvY2F0aW9uIHR5cGUgJXMiKSwKLQkJICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7Ci0gICAgICAvKiBTZXQgaG93dG8gdG8gYSBnYXJiYWdlIHZhbHVlIHNvIHRoYXQgd2UgY2FuIGtlZXAgZ29pbmcuICAqLwotICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBCRkRfUkVMT0NfMzIpOwotICAgICAgYXNzZXJ0IChyZWwtPmhvd3RvICE9IE5VTEwpOwotICAgIH0KLQotICByZXR1cm4gcmVsOwotfQotCi0jZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmIChkZWZpbmVkKE9CSl9BT1VUKSB8IGRlZmluZWQoT0JKX0JPVVQpKQotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICAvKgotICAgKiBJbjogbGVuZ3RoIG9mIHJlbG9jYXRpb24gKG9yIG9mIGFkZHJlc3MpIGluIGNoYXJzOiAxLCAyIG9yIDQuCi0gICAqIE91dDogR05VIExEIHJlbG9jYXRpb24gbGVuZ3RoIGNvZGU6IDAsIDEsIG9yIDIuCi0gICAqLwotCi0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5ieXRlc19yX2xlbmd0aFtdID0gezQyLCAwLCAxLCA0MiwgMn07Ci0gIGxvbmcgcl9zeW1ib2xudW07Ci0KLSAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLQkJICAgICAgKHZhbHVlVCkgKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MKLQkJCQkrIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpLAotCQkgICAgICA0KTsKLQotICByX3N5bWJvbG51bSA9IChTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCQkgPyBTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkKLQkJIDogZml4UC0+ZnhfYWRkc3ktPnN5X251bWJlcik7Ci0KLSAgd2hlcmVbNl0gPSAocl9zeW1ib2xudW0gPj4gMTYpICYgMHgwZmY7Ci0gIHdoZXJlWzVdID0gKHJfc3ltYm9sbnVtID4+IDgpICYgMHgwZmY7Ci0gIHdoZXJlWzRdID0gcl9zeW1ib2xudW0gJiAweDBmZjsKLSAgd2hlcmVbN10gPSAoKCgoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKSA8PCAzKSAmIDB4MDgpCi0JICAgICAgfCAoKG5ieXRlc19yX2xlbmd0aFtmaXhQLT5meF9zaXplXSA8PCAxKSAmIDB4MDYpCi0JICAgICAgfCAoKChmaXhQLT5meF9wY3JlbCA8PCAwKSAmIDB4MDEpICYgMHgwZikpOwotfQotCi0jZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KLQotI2lmIGRlZmluZWQgKEkzODZDT0ZGKQotCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gUl9JTUFHRUJBU0UpCi0gICAgcmV0dXJuIFJfSU1BR0VCQVNFOwotCi0gIHJldHVybiAoZml4UC0+ZnhfcGNyZWwgPwotCSAgKGZpeFAtPmZ4X3NpemUgPT0gMSA/IFJfUENSQllURSA6Ci0JICAgZml4UC0+Znhfc2l6ZSA9PSAyID8gUl9QQ1JXT1JEIDoKLQkgICBSX1BDUkxPTkcpIDoKLQkgIChmaXhQLT5meF9zaXplID09IDEgPyBSX1JFTEJZVEUgOgotCSAgIGZpeFAtPmZ4X3NpemUgPT0gMiA/IFJfUkVMV09SRCA6Ci0JICAgUl9ESVIzMikpOwotfQotCi1pbnQKLXRjX2NvZmZfc2l6ZW1hY2hkZXAgKGZyYWcpCi0gICAgIGZyYWdTICpmcmFnOwotewotICBpZiAoZnJhZy0+ZnJfbmV4dCkKLSAgICByZXR1cm4gKGZyYWctPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFnLT5mcl9hZGRyZXNzKTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0jZW5kaWYgLyogSTM4NkNPRkYgKi8KLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotDAotLyogZW5kIG9mIHRjLWkzODYuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pMzg2LmggYi9nYXMvY29uZmlnL3RjLWkzODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxYWNlOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWkzODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi0vKiB0Yy1pMzg2LmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLWkzODYuYwotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFRDX0kzODYKLSNkZWZpbmUgVENfSTM4NiAxCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBmaXg7Ci0jZW5kaWYKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTgkwCi0KLSNpZmRlZiBURV9MWU5YCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJjb2ZmLWkzODYtbHlueCIKLSNlbmRpZgotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotLyogVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSByZWxvY2F0aW9uIHR5cGVzIGluIHRjLWkzODYuYy4gIFRoZSBmaXJzdAotICAgcGFyYW1ldGVyIGlzIHRoZSBjdXJyZW50IHJlbG9jYXRpb24gdHlwZSwgdGhlIHNlY29uZCBvbmUgaXMgdGhlIGRlc2lyZWQKLSAgIHR5cGUuICBUaGUgaWRlYSBpcyB0aGF0IGlmIHRoZSBvcmlnaW5hbCB0eXBlIGlzIGFscmVhZHkgc29tZSBraW5kIG9mIFBJQwotICAgcmVsb2NhdGlvbiwgd2UgbGVhdmUgaXQgYWxvbmUsIG90aGVyd2lzZSB3ZSBnaXZlIGl0IHRoZSBkZXNpcmVkIHR5cGUgKi8KLQotI2RlZmluZSBUQ19SRUxPQyhYLFkpICgoKFgpICE9IEJGRF9SRUxPQ18zODZfUExUMzIgJiYgXAotCSAgIChYKSAhPSBCRkRfUkVMT0NfMzg2X0dPVE9GRiAmJiBcCi0JICAgKFgpICE9IEJGRF9SRUxPQ18zODZfR09UMzIgJiYgXAotCSAgIChYKSAhPSBCRkRfUkVMT0NfMzg2X0dPVFBDKSA/IFkgOiBYKQotCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKFgpICB0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKFgpCi1leHRlcm4gaW50IHRjX2kzODZfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLS8qIFRoaXMgaXMgdGhlIHJlbG9jYXRpb24gdHlwZSBmb3IgZGlyZWN0IHJlZmVyZW5jZXMgdG8gR0xPQkFMX09GRlNFVF9UQUJMRS4KLSAqIEl0IGNvbWVzIHVwIGluIGNvbXBsaWNhdGVkIGV4cHJlc3Npb25zIHN1Y2ggYXMgCi0gKiBfR0xPQkFMX09GRlNFVF9UQUJMRV8rWy4tLkwyODRdLCB3aGljaCBjYW5ub3QgYmUgZXhwcmVzc2VkIG5vcm1hbGx5IHdpdGgKLSAqIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zLiAgVGhlIGZpeHVwIHNwZWNpZmllZCBoZXJlIHdoZW4gdXNlZCBhdCBydW50aW1lIAotICogaW1wbGllcyB0aGF0IHdlIHNob3VsZCBhZGQgdGhlIGFkZHJlc3Mgb2YgdGhlIEdPVCB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLAotICogYW5kIGFzIGEgcmVzdWx0IHdlIGhhdmUgc2ltcGxpZmllZCB0aGUgZXhwcmVzc2lvbiBpbnRvIHNvbWV0aGluZyB3ZSBjYW4gdXNlLgotICovCi0jZGVmaW5lIFRDX1JFTE9DX0dMT0JBTF9PRkZTRVRfVEFCTEUgQkZEX1JFTE9DXzM4Nl9HT1RQQwotCi0vKiBUaGlzIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlIGlmIHRoZSByZWxvY2F0aW9uIGlzIGZvciBhIGxvY2FsIG9iamVjdAotICAgZm9yIHdoaWNoIHdlIHN0aWxsIHdhbnQgdG8gZG8gdGhlIHJlbG9jYXRpb24gYXQgcnVudGltZS4gIFRydWUgaWYgd2UKLSAgIGFyZSB3aWxsaW5nIHRvIHBlcmZvcm0gdGhpcyByZWxvY2F0aW9uIHdoaWxlIGJ1aWxkaW5nIHRoZSAubyBmaWxlLgotICAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHBjcmVsIHJlbG9jYXRpb25zLCBzbyBHT1RPRkYgZG9lcyBub3QgbmVlZCB0byBiZQotICAgY2hlY2tlZCBoZXJlLiAgSSBhbSBub3Qgc3VyZSBpZiBzb21lIG9mIHRoZSBvdGhlcnMgYXJlIGV2ZXIgdXNlZCB3aXRoCi0gICBwY3JlbCwgYnV0IGl0IGlzIGVhc2llciB0byBiZSBzYWZlIHRoYW4gc29ycnkuICovCi0KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkJCQkJXAotICAoKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMzg2X1BMVDMyCQkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMzg2X0dPVDMyCQkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMzg2X0dPVFBDCQkJXAotICAgJiYgKChGSVgpLT5meF9hZGRzeSA9PSBOVUxMCQkJCQlcCi0gICAgICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLQkgICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLQkgICAmJiBTX0lTX0RFRklORUQgKChGSVgpLT5meF9hZGRzeSkJCQlcCi0JICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpKQotCi0jZGVmaW5lIFRBUkdFVF9BUkNICQliZmRfYXJjaF9pMzg2Ci0KLSNpZmRlZiBPQkpfQU9VVAotI2lmZGVmIFRFX05ldEJTRAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtaTM4Ni1uZXRic2QiCi0jZW5kaWYKLSNpZmRlZiBURV8zODZCU0QKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LWkzODYtYnNkIgotI2VuZGlmCi0jaWZkZWYgVEVfTElOVVgKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LWkzODYtbGludXgiCi0jZW5kaWYKLSNpZmRlZiBURV9NYWNoCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1tYWNoMyIKLSNlbmRpZgotI2lmZGVmIFRFX0RZTklYCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1pMzg2LWR5bml4IgotI2VuZGlmCi0jaWZuZGVmIFRBUkdFVF9GT1JNQVQKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LWkzODYiCi0jZW5kaWYKLSNlbmRpZiAvKiBPQkpfQU9VVCAqLwotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiZWxmMzItaTM4NiIKLSNlbmRpZgotCi0jaWZkZWYgT0JKX01BWUJFX0VMRgotI2lmZGVmIE9CSl9NQVlCRV9DT0ZGCi1leHRlcm4gY29uc3QgY2hhciAqaTM4Nl90YXJnZXRfZm9ybWF0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCBpMzg2X3RhcmdldF9mb3JtYXQgKCkKLSNlbmRpZgotI2VuZGlmCi0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBDT0ZGIFNUVUZGICovCi0KLSNkZWZpbmUgQ09GRl9NQUdJQyBJMzg2TUFHSUMKLSNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfaTM4NgotI2RlZmluZSBDT0ZGX0ZMQUdTIEZfQVIzMldSCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgoeCktPmZ4X2FkZHN5IHx8ICh4KS0+Znhfcl90eXBlPT03KQotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhQKSB0Y19jb2ZmX2ZpeDJydHlwZShmaXhQKQotZXh0ZXJuIHNob3J0IHRjX2NvZmZfZml4MnJ0eXBlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAoZnJhZykKLWV4dGVybiBpbnQgdGNfY29mZl9zaXplbWFjaGRlcCBQQVJBTVMgKChmcmFnUyAqZnJhZykpOwotCi0jaWZkZWYgVEVfR08zMgotLyogREpHUFAgbm93IGV4cGVjdHMgc29tZSBzZWN0aW9ucyB0byBiZSAyKio0IGFsaWduZWQuICAqLwotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpCQkJCQkJXAotICAoKHN0cmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi50ZXh0IikgPT0gMAkJCVwKLSAgICB8fCBzdHJjbXAgKG9ial9zZWdtZW50X25hbWUgKFNFRyksICIuZGF0YSIpID09IDAJCQlcCi0gICAgfHwgc3RybmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5nbnUubGlua29uY2UudCIsIDE1KSA9PSAwCVwKLSAgICB8fCBzdHJuY21wIChvYmpfc2VnbWVudF9uYW1lIChTRUcpLCAiLmdudS5saW5rb25jZS5kIiwgMTUpID09IDAJXAotICAgIHx8IHN0cm5jbXAgKG9ial9zZWdtZW50X25hbWUgKFNFRyksICIuZ251LmxpbmtvbmNlLnIiLCAxNSkgPT0gMCkJXAotICAgPyA0CQkJCQkJCQkJXAotICAgOiAyKQotI2Vsc2UKLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKSAyCi0jZW5kaWYKLQotI2RlZmluZSBUQ19SVkFfUkVMT0MgNwotLyogTmVlZCB0aGlzIGZvciBQSUMgcmVsb2NhdGlvbnMgKi8KLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUKLQotCi0jaWZkZWYgVEVfMzg2QlNECi0vKiBUaGUgQlNESSBsaW5rZXIgYXBwYXJlbnRseSByZWplY3RzIG9iamVjdHMgd2l0aCBhIG1hY2hpbmUgdHlwZSBvZgotICAgTV8zODYgKDEwMCkuICAqLwotI2RlZmluZSBBT1VUX01BQ0hUWVBFIDAKLSNlbHNlCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgMTAwCi0jZW5kaWYKLQotI3VuZGVmIFJFVkVSU0VfU09SVF9SRUxPQ1MKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgdGNfaTM4Nl9mb3JjZV9yZWxvY2F0aW9uKGZpeHApCi1leHRlcm4gaW50IHRjX2kzODZfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTk9fUkVMT0MgQkZEX1JFTE9DX05PTkUKLSNlbHNlCi0jZGVmaW5lIE5PX1JFTE9DIDAKLSNlbmRpZgotI2RlZmluZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2soYSkJOwkvKiBub3QgdXNlZCAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZm5kZWYgT0JKX0FPVVQKLSNpZm5kZWYgVEVfUEUKLSNpZm5kZWYgVEVfR08zMgotLyogTG9jYWwgbGFiZWxzIHN0YXJ0cyB3aXRoIC5MICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIChuYW1lWzBdID09ICcuJyBcCi0JCSAmJiAobmFtZVsxXSA9PSAnTCcgfHwgbmFtZVsxXSA9PSAnWCcgfHwgbmFtZVsxXSA9PSAnLicpKQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIG5vdCB1c2VkICovCi0KLWV4dGVybiBjb25zdCBjaGFyIGV4dHJhX3N5bWJvbF9jaGFyc1tdOwotI2RlZmluZSB0Y19zeW1ib2xfY2hhcnMgZXh0cmFfc3ltYm9sX2NoYXJzCi0KLSNkZWZpbmUgTUFYX09QRVJBTkRTIDMJCS8qIG1heCBvcGVyYW5kcyBwZXIgaW5zbiAqLwotI2RlZmluZSBNQVhfSU1NRURJQVRFX09QRVJBTkRTIDIvKiBtYXggaW1tZWRpYXRlcyBwZXIgaW5zbiAobGNhbGwsIGxqbXApICovCi0jZGVmaW5lIE1BWF9NRU1PUllfT1BFUkFORFMgMgkvKiBtYXggbWVtb3J5IHJlZnMgcGVyIGluc24gKHN0cmluZyBvcHMpICovCi0KLS8qIFByZWZpeGVzIHdpbGwgYmUgZW1pdHRlZCBpbiB0aGUgb3JkZXIgZGVmaW5lZCBiZWxvdy4KLSAgIFdBSVRfUFJFRklYIG11c3QgYmUgdGhlIGZpcnN0IHByZWZpeCBzaW5jZSBGV0FJVCBpcyByZWFsbHkgaXMgYW4KLSAgIGluc3RydWN0aW9uLCBhbmQgc28gbXVzdCBjb21lIGJlZm9yZSBhbnkgcHJlZml4ZXMuICovCi0jZGVmaW5lIFdBSVRfUFJFRklYCTAKLSNkZWZpbmUgTE9DS1JFUF9QUkVGSVgJMQotI2RlZmluZSBBRERSX1BSRUZJWAkyCi0jZGVmaW5lIERBVEFfUFJFRklYCTMKLSNkZWZpbmUgU0VHX1BSRUZJWAk0Ci0jZGVmaW5lIE1BWF9QUkVGSVhFUwk1CS8qIG1heCBwcmVmaXhlcyBwZXIgb3Bjb2RlICovCi0KLS8qIHdlIGRlZmluZSB0aGUgc3ludGF4IGhlcmUgKG1vZHVsbyBiYXNlLGluZGV4LHNjYWxlIHN5bnRheCkgKi8KLSNkZWZpbmUgUkVHSVNURVJfUFJFRklYICclJwotI2RlZmluZSBJTU1FRElBVEVfUFJFRklYICckJwotI2RlZmluZSBBQlNPTFVURV9QUkVGSVggJyonCi0KLSNkZWZpbmUgVFdPX0JZVEVfT1BDT0RFX0VTQ0FQRSAweDBmCi0jZGVmaW5lIE5PUF9PUENPREUgKGNoYXIpIDB4OTAKLQotLyogcmVnaXN0ZXIgbnVtYmVycyAqLwotI2RlZmluZSBFQlBfUkVHX05VTSA1Ci0jZGVmaW5lIEVTUF9SRUdfTlVNIDQKLQotLyogbW9kcm1fYnl0ZS5yZWdtZW0gZm9yIHR3b2J5dGUgZXNjYXBlICovCi0jZGVmaW5lIEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HIEVTUF9SRUdfTlVNCi0vKiBpbmRleF9iYXNlX2J5dGUuaW5kZXggZm9yIG5vIGluZGV4IHJlZ2lzdGVyIGFkZHJlc3NpbmcgKi8KLSNkZWZpbmUgTk9fSU5ERVhfUkVHSVNURVIgRVNQX1JFR19OVU0KLS8qIGluZGV4X2Jhc2VfYnl0ZS5iYXNlIGZvciBubyBiYXNlIHJlZ2lzdGVyIGFkZHJlc3NpbmcgKi8KLSNkZWZpbmUgTk9fQkFTRV9SRUdJU1RFUiBFQlBfUkVHX05VTQotI2RlZmluZSBOT19CQVNFX1JFR0lTVEVSXzE2IDYKLQotLyogdGhlc2UgYXJlIHRoZSBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcy4gICovCi0jZGVmaW5lIERXT1JEX01ORU1fU1VGRklYICdsJwotI2RlZmluZSBXT1JEX01ORU1fU1VGRklYICAndycKLSNkZWZpbmUgQllURV9NTkVNX1NVRkZJWCAgJ2InCi0jZGVmaW5lIFNIT1JUX01ORU1fU1VGRklYICdzJwotI2RlZmluZSBMT05HX01ORU1fU1VGRklYICAnbCcKLS8qIEludGVsIFN5bnRheCAqLwotI2RlZmluZSBMT05HX0RPVUJMRV9NTkVNX1NVRkZJWCAneCcKLS8qIEludGVsIFN5bnRheCAqLwotI2RlZmluZSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWCAnZCcKLQotLyogbW9kcm0ubW9kZSA9IFJFR01FTV9GSUVMRF9IQVNfUkVHIHdoZW4gYSByZWdpc3RlciBpcyBpbiB0aGVyZSAqLwotI2RlZmluZSBSRUdNRU1fRklFTERfSEFTX1JFRyAweDMvKiBhbHdheXMgPSAweDMgKi8KLSNkZWZpbmUgUkVHTUVNX0ZJRUxEX0hBU19NRU0gKH5SRUdNRU1fRklFTERfSEFTX1JFRykKLQotI2RlZmluZSBFTkRfT0ZfSU5TTiAnXDAnCi0KLS8qIEludGVsIFN5bnRheCAqLwotLyogVmFsdWVzIDAtNCBtYXAgb250byBzY2FsZSBmYWN0b3IgKi8KLSNkZWZpbmUgQllURV9QVFIgICAgIDAKLSNkZWZpbmUgV09SRF9QVFIgICAgIDEKLSNkZWZpbmUgRFdPUkRfUFRSICAgIDIKLSNkZWZpbmUgUVdPUkRfUFRSICAgIDMKLSNkZWZpbmUgWFdPUkRfUFRSICAgIDQKLSNkZWZpbmUgU0hPUlQgICAgICAgIDUKLSNkZWZpbmUgT0ZGU0VUX0ZMQVQgIDYKLSNkZWZpbmUgRkxBVCAgICAgICAgIDcKLSNkZWZpbmUgTk9ORV9GT1VORCAgIDgKLS8qCi0gIFdoZW4gYW4gb3BlcmFuZCBpcyByZWFkIGluIGl0IGlzIGNsYXNzaWZpZWQgYnkgaXRzIHR5cGUuICBUaGlzIHR5cGUgaW5jbHVkZXMKLSAgYWxsIHRoZSBwb3NzaWJsZSB3YXlzIGFuIG9wZXJhbmQgY2FuIGJlIHVzZWQuICBUaHVzLCAnJWVheCcgaXMgYm90aCAncmVnaXN0ZXIKLSAgIyAwJyBhbmQgJ1RoZSBBY2N1bXVsYXRvcicuICBJbiBvdXIgbGFuZ3VhZ2UgdGhpcyBpcyBleHByZXNzZWQgYnkgT1InaW5nCi0gICdSZWczMicgKGFueSAzMiBiaXQgcmVnaXN0ZXIpIGFuZCAnQWNjJyAodGhlIGFjY3VtdWxhdG9yKS4KLSAgT3BlcmFuZHMgYXJlIGNsYXNzaWZpZWQgc28gdGhhdCB3ZSBjYW4gbWF0Y2ggZ2l2ZW4gb3BlcmFuZCB0eXBlcyB3aXRoCi0gIHRoZSBvcGNvZGUgdGFibGUgaW4gb3Bjb2RlL2kzODYuaC4KLSAgKi8KLS8qIHJlZ2lzdGVyICovCi0jZGVmaW5lIFJlZzgJCSAgIDB4MQkvKiA4IGJpdCByZWcgKi8KLSNkZWZpbmUgUmVnMTYJCSAgIDB4MgkvKiAxNiBiaXQgcmVnICovCi0jZGVmaW5lIFJlZzMyCQkgICAweDQJLyogMzIgYml0IHJlZyAqLwotLyogaW1tZWRpYXRlICovCi0jZGVmaW5lIEltbTgJCSAgIDB4OAkvKiA4IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgSW1tOFMJCSAgMHgxMAkvKiA4IGJpdCBpbW1lZGlhdGUgc2lnbiBleHRlbmRlZCAqLwotI2RlZmluZSBJbW0xNgkJICAweDIwCS8qIDE2IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgSW1tMzIJCSAgMHg0MAkvKiAzMiBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIEltbTEJCSAgMHg4MAkvKiAxIGJpdCBpbW1lZGlhdGUgKi8KLS8qIG1lbW9yeSAqLwotI2RlZmluZSBCYXNlSW5kZXgJIDB4MTAwCi0vKiBEaXNwOCwxNiwzMiBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5cywgZGVwZW5kaW5nIG9uIHRoZQotICAgaW5zdHJ1Y3Rpb24uICBGb3IganVtcHMsIHRoZXkgc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgUEMgcmVsYXRpdmUKLSAgIGRpc3BsYWNlbWVudCwgZm9yIGJhc2VpbmRleCB0eXBlIGluc3RydWN0aW9ucywgdGhleSBzcGVjaWZ5IHRoZQotICAgc2l6ZSBvZiB0aGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBiYXNlIHJlZ2lzdGVyLCBhbmQgZm9yIG1lbW9yeQotICAgb2Zmc2V0IGluc3RydWN0aW9ucyBzdWNoIGFzIGBtb3YgMTIzNCwlYWwnIHRoZXkgc3BlY2lmeSB0aGUgc2l6ZSBvZgotICAgdGhlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc2VnbWVudCBiYXNlLiAgKi8KLSNkZWZpbmUgRGlzcDgJCSAweDIwMAkvKiA4IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgRGlzcDE2CQkgMHg0MDAJLyogMTYgYml0IGRpc3BsYWNlbWVudCAqLwotI2RlZmluZSBEaXNwMzIJCSAweDgwMAkvKiAzMiBiaXQgZGlzcGxhY2VtZW50ICovCi0vKiBzcGVjaWFscyAqLwotI2RlZmluZSBJbk91dFBvcnRSZWcJMHgxMDAwCS8qIHJlZ2lzdGVyIHRvIGhvbGQgaW4vb3V0IHBvcnQgYWRkciA9IGR4ICovCi0jZGVmaW5lIFNoaWZ0Q291bnQJMHgyMDAwCS8qIHJlZ2lzdGVyIHRvIGhvbGQgc2hpZnQgY291bmQgPSBjbCAqLwotI2RlZmluZSBDb250cm9sCSAgICAgICAgMHg0MDAwCS8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRGVidWcJICAgICAgICAweDgwMDAJLyogRGVidWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVGVzdAkgICAgICAgMHgxMDAwMAkvKiBUZXN0IHJlZ2lzdGVyICovCi0jZGVmaW5lIEZsb2F0UmVnICAgICAgIDB4MjAwMDAJLyogRmxvYXQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRmxvYXRBY2MgICAgICAgMHg0MDAwMAkvKiBGbG9hdCBzdGFjayB0b3AgJXN0KDApICovCi0jZGVmaW5lIFNSZWcyCSAgICAgICAweDgwMDAwCS8qIDIgYml0IHNlZ21lbnQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU1JlZzMJICAgICAgMHgxMDAwMDAJLyogMyBiaXQgc2VnbWVudCByZWdpc3RlciAqLwotI2RlZmluZSBBY2MJICAgICAgMHgyMDAwMDAJLyogQWNjdW11bGF0b3IgJWFsIG9yICVheCBvciAlZWF4ICovCi0jZGVmaW5lIEp1bXBBYnNvbHV0ZSAgMHg0MDAwMDAKLSNkZWZpbmUgUmVnTU1YCSAgICAgIDB4ODAwMDAwCS8qIE1NWCByZWdpc3RlciAqLwotI2RlZmluZSBSZWdYTU0JICAgICAweDEwMDAwMDAJLyogWE1NIHJlZ2lzdGVycyBpbiBQSUlJICovCi0jZGVmaW5lIEVzU2VnCSAgICAgMHgyMDAwMDAwCS8qIFN0cmluZyBpbnNuIG9wZXJhbmQgd2l0aCBmaXhlZCBlcyBzZWdtZW50ICovCi0vKiBJbnZNZW0gaXMgZm9yIGluc3RydWN0aW9ucyB3aXRoIGEgbW9kcm0gYnl0ZSB0aGF0IG9ubHkgYWxsb3cgYQotICAgZ2VuZXJhbCByZWdpc3RlciBlbmNvZGluZyBpbiB0aGUgaS50bS5tb2RlIGFuZCBpLnRtLnJlZ21lbSBmaWVsZHMsCi0gICBlZy4gY29udHJvbCByZWcgbW92ZXMuICBUaGV5IHJlYWxseSBvdWdodCB0byBzdXBwb3J0IGEgbWVtb3J5IGZvcm0sCi0gICBidXQgZG9uJ3QsIHNvIHdlIGFkZCBhbiBJbnZNZW0gZmxhZyB0byB0aGUgcmVnaXN0ZXIgb3BlcmFuZCB0bwotICAgaW5kaWNhdGUgdGhhdCBpdCBzaG91bGQgYmUgZW5jb2RlZCBpbiB0aGUgaS50bS5yZWdtZW0gZmllbGQuICAqLwotI2RlZmluZSBJbnZNZW0JICAgICAweDQwMDAwMDAKLQotI2RlZmluZSBSZWcJKFJlZzh8UmVnMTZ8UmVnMzIpCS8qIGdlbidsIHJlZ2lzdGVyICovCi0jZGVmaW5lIFdvcmRSZWcgKFJlZzE2fFJlZzMyKQotI2RlZmluZSBJbXBsaWNpdFJlZ2lzdGVyIChJbk91dFBvcnRSZWd8U2hpZnRDb3VudHxBY2N8RmxvYXRBY2MpCi0jZGVmaW5lIEltbQkoSW1tOHxJbW04U3xJbW0xNnxJbW0zMikgLyogZ2VuJ2wgaW1tZWRpYXRlICovCi0jZGVmaW5lIERpc3AJKERpc3A4fERpc3AxNnxEaXNwMzIpCS8qIEdlbmVyYWwgZGlzcGxhY2VtZW50ICovCi0jZGVmaW5lIEFueU1lbQkoRGlzcHxCYXNlSW5kZXh8SW52TWVtKQkvKiBHZW5lcmFsIG1lbW9yeSAqLwotLyogVGhlIGZvbGxvd2luZyBhbGlhc2VzIGFyZSBkZWZpbmVkIGJlY2F1c2UgdGhlIG9wY29kZSB0YWJsZQotICAgY2FyZWZ1bGx5IHNwZWNpZmllcyB0aGUgYWxsb3dlZCBtZW1vcnkgdHlwZXMgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24uCi0gICBBdCB0aGUgbW9tZW50IHdlIGNhbiBvbmx5IHRlbGwgYSBtZW1vcnkgcmVmZXJlbmNlIHNpemUgYnkgdGhlCi0gICBpbnN0cnVjdGlvbiBzdWZmaXgsIHNvIHRoZXJlJ3Mgbm90IG11Y2ggcG9pbnQgaW4gZGVmaW5pbmcgTWVtOCwKLSAgIE1lbTE2LCBNZW0zMiBhbmQgTWVtNjQgb3Bjb2RlIG1vZGlmaWVycyAtIFdlIG1pZ2h0IGFzIHdlbGwganVzdCB1c2UKLSAgIHRoZSBzdWZmaXggZGlyZWN0bHkgdG8gY2hlY2sgbWVtb3J5IG9wZXJhbmRzLiAgKi8KLSNkZWZpbmUgTExvbmdNZW0gQW55TWVtCQkvKiA2NCBiaXRzIChvciBtb3JlKSAqLwotI2RlZmluZSBMb25nTWVtIEFueU1lbQkJLyogMzIgYml0IG1lbW9yeSByZWYgKi8KLSNkZWZpbmUgU2hvcnRNZW0gQW55TWVtCQkvKiAxNiBiaXQgbWVtb3J5IHJlZiAqLwotI2RlZmluZSBXb3JkTWVtIEFueU1lbQkJLyogMTYgb3IgMzIgYml0IG1lbW9yeSByZWYgKi8KLSNkZWZpbmUgQnl0ZU1lbSBBbnlNZW0JCS8qIDggYml0IG1lbW9yeSByZWYgKi8KLQotI2RlZmluZSBTTUFMTEVTVF9ESVNQX1RZUEUobnVtKSBcCi0gICAgKGZpdHNfaW5fc2lnbmVkX2J5dGUobnVtKSA/IChEaXNwOHxEaXNwMzIpIDogRGlzcDMyKQotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBpbnN0cnVjdGlvbiBuYW1lIHNhbnMgd2lkdGggc3VmZml4ICgibW92IiBmb3IgbW92bCBpbnNucykgKi8KLSAgY2hhciAqbmFtZTsKLQotICAvKiBob3cgbWFueSBvcGVyYW5kcyAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7Ci0KLSAgLyogYmFzZV9vcGNvZGUgaXMgdGhlIGZ1bmRhbWVudGFsIG9wY29kZSBieXRlIHdpdGhvdXQgb3B0aW9uYWwKLSAgICAgcHJlZml4KGVzKS4gICovCi0gIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsKLQotICAvKiBleHRlbnNpb25fb3Bjb2RlIGlzIHRoZSAzIGJpdCBleHRlbnNpb24gZm9yIGdyb3VwIDxuPiBpbnNucy4KLSAgICAgVGhpcyBmaWVsZCBpcyBhbHNvIHVzZWQgdG8gc3RvcmUgdGhlIDgtYml0IG9wY29kZSBzdWZmaXggZm9yIHRoZQotICAgICBBTUQgM0ROb3chIGluc3RydWN0aW9ucy4KLSAgICAgSWYgdGhpcyB0ZW1wbGF0ZSBoYXMgbm8gZXh0ZW5zaW9uIG9wY29kZSAodGhlIHVzdWFsIGNhc2UpIHVzZSBOb25lICovCi0gIHVuc2lnbmVkIGludCBleHRlbnNpb25fb3Bjb2RlOwotI2RlZmluZSBOb25lIDB4ZmZmZgkJLyogSWYgbm8gZXh0ZW5zaW9uX29wY29kZSBpcyBwb3NzaWJsZS4gKi8KLQotICAvKiB0aGUgYml0cyBpbiBvcGNvZGVfbW9kaWZpZXIgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGZpbmFsIG9wY29kZSBmcm9tCi0gICAgIHRoZSBiYXNlX29wY29kZS4gIFRoZXNlIGJpdHMgYWxzbyBhcmUgdXNlZCB0byBkZXRlY3QgYWx0ZXJuYXRlIGZvcm1zIG9mCi0gICAgIHRoZSBzYW1lIGluc3RydWN0aW9uICovCi0gIHVuc2lnbmVkIGludCBvcGNvZGVfbW9kaWZpZXI7Ci0KLSAgLyogb3Bjb2RlX21vZGlmaWVyIGJpdHM6ICovCi0jZGVmaW5lIFcJCSAgIDB4MQkvKiBzZXQgaWYgb3BlcmFuZHMgY2FuIGJlIHdvcmRzIG9yIGR3b3JkcwotCQkJCSAgIGVuY29kZWQgdGhlIGNhbm9uaWNhbCB3YXkgKi8KLSNkZWZpbmUgRAkJICAgMHgyCS8qIEQgPSAwIGlmIFJlZyAtLT4gUmVnbWVtOwotCQkJCSAgIEQgPSAxIGlmIFJlZ21lbSAtLT4gUmVnOiAgICBNVVNUIEJFIDB4MiAqLwotI2RlZmluZSBNb2RybQkJICAgMHg0Ci0jZGVmaW5lIEZsb2F0UgkJICAgMHg4CS8qIHNyYy9kZXN0IHN3YXAgZm9yIGZsb2F0czogICBNVVNUIEJFIDB4OCAqLwotI2RlZmluZSBTaG9ydEZvcm0JICAweDEwCS8qIHJlZ2lzdGVyIGlzIGluIGxvdyAzIGJpdHMgb2Ygb3Bjb2RlICovCi0jZGVmaW5lIEZsb2F0TUYJCSAgMHgyMAkvKiBGUCBpbnNuIG1lbW9yeSBmb3JtYXQgYml0LCBzaXplZCBieSAweDQgKi8KLSNkZWZpbmUgSnVtcAkJICAweDQwCS8qIHNwZWNpYWwgY2FzZSBmb3IganVtcCBpbnNucy4gKi8KLSNkZWZpbmUgSnVtcER3b3JkCSAgMHg4MCAgLyogY2FsbCBhbmQganVtcCAqLwotI2RlZmluZSBKdW1wQnl0ZQkgMHgxMDAgIC8qIGxvb3AgYW5kIGplY3h6ICovCi0jZGVmaW5lIEp1bXBJbnRlclNlZ21lbnQgMHgyMDAJLyogc3BlY2lhbCBjYXNlIGZvciBpbnRlcnNlZ21lbnQgbGVhcHMvY2FsbHMgKi8KLSNkZWZpbmUgRmxvYXRECQkgMHg0MDAJLyogZGlyZWN0aW9uIGZvciBmbG9hdCBpbnNuczogIE1VU1QgQkUgMHg0MDAgKi8KLSNkZWZpbmUgU2VnMlNob3J0Rm9ybQkgMHg4MDAJLyogZW5jb2Rpbmcgb2YgbG9hZCBzZWdtZW50IHJlZyBpbnNucyAqLwotI2RlZmluZSBTZWczU2hvcnRGb3JtCTB4MTAwMAkvKiBmcy9ncyBzZWdtZW50IHJlZ2lzdGVyIGluc25zLiAqLwotI2RlZmluZSBTaXplMTYJCTB4MjAwMAkvKiBuZWVkcyBzaXplIHByZWZpeCBpZiBpbiAzMi1iaXQgbW9kZSAqLwotI2RlZmluZSBTaXplMzIJCTB4NDAwMAkvKiBuZWVkcyBzaXplIHByZWZpeCBpZiBpbiAxNi1iaXQgbW9kZSAqLwotI2RlZmluZSBJZ25vcmVTaXplCTB4ODAwMCAgLyogaW5zdHJ1Y3Rpb24gaWdub3JlcyBvcGVyYW5kIHNpemUgcHJlZml4ICovCi0jZGVmaW5lIERlZmF1bHRTaXplICAgIDB4MTAwMDAgIC8qIGRlZmF1bHQgaW5zbiBzaXplIGRlcGVuZHMgb24gbW9kZSAqLwotI2RlZmluZSBOb19iU3VmCSAgICAgICAweDIwMDAwCS8qIGIgc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KLSNkZWZpbmUgTm9fd1N1ZgkgICAgICAgMHg0MDAwMAkvKiB3IHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCi0jZGVmaW5lIE5vX2xTdWYJICAgICAgIDB4ODAwMDAJLyogbCBzdWZmaXggb24gaW5zdHJ1Y3Rpb24gaWxsZWdhbCAqLwotI2RlZmluZSBOb19zU3VmCSAgICAgIDB4MTAwMDAwCS8qIHMgc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KLSNkZWZpbmUgTm9fZFN1ZiAgICAgICAweDIwMDAwMCAgLyogZCBzdWZmaXggb24gaW5zdHJ1Y3Rpb24gaWxsZWdhbCAqLwotI2RlZmluZSBOb194U3VmICAgICAgIDB4NDAwMDAwICAvKiB4IHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCi0jZGVmaW5lIEZXYWl0CSAgICAgIDB4ODAwMDAwCS8qIGluc3RydWN0aW9uIG5lZWRzIEZXQUlUICovCi0jZGVmaW5lIElzU3RyaW5nICAgICAweDEwMDAwMDAJLyogcXVpY2sgdGVzdCBmb3Igc3RyaW5nIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSByZWdLbHVkZ2UgICAgMHgyMDAwMDAwCS8qIGZha2UgYW4gZXh0cmEgcmVnIG9wZXJhbmQgZm9yIGNsciwgaW11bCAqLwotI2RlZmluZSBJc1ByZWZpeCAgICAgMHg0MDAwMDAwCS8qIG9wY29kZSBpcyBhIHByZWZpeCAqLwotI2RlZmluZSBJbW1FeHQJICAgICAweDgwMDAwMDAJLyogaW5zdHJ1Y3Rpb24gaGFzIGV4dGVuc2lvbiBpbiA4IGJpdCBpbW0gKi8KLSNkZWZpbmUgVWdoCSAgICAweDgwMDAwMDAwCS8qIGRlcHJlY2F0ZWQgZnAgaW5zbiwgZ2V0cyBhIHdhcm5pbmcgKi8KLQotICAvKiBvcGVyYW5kX3R5cGVzW2ldIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBvcGVyYW5kIGkuICBUaGlzIGlzIG1hZGUKLSAgICAgYnkgT1InaW5nIHRvZ2V0aGVyIGFsbCBvZiB0aGUgcG9zc2libGUgdHlwZSBtYXNrcy4gIChlLmcuCi0gICAgICdvcGVyYW5kX3R5cGVzW2ldID0gUmVnfEltbScgc3BlY2lmaWVzIHRoYXQgb3BlcmFuZCBpIGNhbiBiZQotICAgICBlaXRoZXIgYSByZWdpc3RlciBvciBhbiBpbW1lZGlhdGUgb3BlcmFuZCAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZF90eXBlc1szXTsKLX0KLXRlbXBsYXRlOwotCi0vKgotICAndGVtcGxhdGVzJyBpcyBmb3IgZ3JvdXBpbmcgdG9nZXRoZXIgJ3RlbXBsYXRlJyBzdHJ1Y3R1cmVzIGZvciBvcGNvZGVzCi0gIG9mIHRoZSBzYW1lIG5hbWUuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3Igc3RvcmluZyB0aGUgaW5zbnMgaW4gdGhlIGdyYW5kCi0gIG9sZSBoYXNoIHRhYmxlIG9mIGluc25zLgotICBUaGUgdGVtcGxhdGVzIHRoZW1zZWx2ZXMgc3RhcnQgYXQgU1RBUlQgYW5kIHJhbmdlIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykKLSAgRU5ELgotICAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGNvbnN0IHRlbXBsYXRlICpzdGFydDsKLSAgICBjb25zdCB0ZW1wbGF0ZSAqZW5kOwotICB9IHRlbXBsYXRlczsKLQotLyogdGhlc2UgYXJlIGZvciByZWdpc3RlciBuYW1lIC0tPiBudW1iZXIgJiB0eXBlIGhhc2ggbG9va3VwICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgY2hhciAqcmVnX25hbWU7Ci0gICAgdW5zaWduZWQgaW50IHJlZ190eXBlOwotICAgIHVuc2lnbmVkIGludCByZWdfbnVtOwotICB9Ci1yZWdfZW50cnk7Ci0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBjaGFyICpzZWdfbmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgc2VnX3ByZWZpeDsKLSAgfQotc2VnX2VudHJ5OwotCi0vKiAzODYgb3BlcmFuZCBlbmNvZGluZyBieXRlczogIHNlZSAzODYgYm9vayBmb3IgZGV0YWlscyBvZiB0aGlzLiAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIGludCByZWdtZW07CS8qIGNvZGVzIHJlZ2lzdGVyIG9yIG1lbW9yeSBvcGVyYW5kICovCi0gICAgdW5zaWduZWQgaW50IHJlZzsJCS8qIGNvZGVzIHJlZ2lzdGVyIG9wZXJhbmQgKG9yIGV4dGVuZGVkIG9wY29kZSkgKi8KLSAgICB1bnNpZ25lZCBpbnQgbW9kZTsJCS8qIGhvdyB0byBpbnRlcnByZXQgcmVnbWVtICYgcmVnICovCi0gIH0KLW1vZHJtX2J5dGU7Ci0KLS8qIDM4NiBvcGNvZGUgYnl0ZSB0byBjb2RlIGluZGlyZWN0IGFkZHJlc3NpbmcuICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgYmFzZTsKLSAgICB1bnNpZ25lZCBpbmRleDsKLSAgICB1bnNpZ25lZCBzY2FsZTsKLSAgfQotc2liX2J5dGU7Ci0KLS8qIFRoZSBuYW1lIG9mIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIuIEFsbG93Ci0gICB0aGlzIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZCBiZS4gKi8KLSNpZm5kZWYgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FCi0jZGVmaW5lIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi12b2lkIGkzODZfdmFsaWRhdGVfZml4IFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2RlZmluZSBUQ19WQUxJREFURV9GSVgoRklYUCxTRUdUWVBFLFNLSVApIGkzODZfdmFsaWRhdGVfZml4KEZJWFApCi0jZW5kaWYKLQotI2VuZGlmIC8qIFRDX0kzODYgKi8KLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLSNkZWZpbmUgbWRfZG9fYWxpZ24obiwgZmlsbCwgbGVuLCBtYXgsIGFyb3VuZCkJCQkJXAotaWYgKChuKSAmJiAhbmVlZF9wYXNzXzIJCQkJCQkJXAotICAgICYmICghKGZpbGwpIHx8ICgoY2hhcikqKGZpbGwpID09IChjaGFyKTB4OTAgJiYgKGxlbikgPT0gMSkpCQlcCi0gICAgJiYgc3Vic2VnX3RleHRfcCAobm93X3NlZykpCQkJCQkJXAotICB7CQkJCQkJCQkJXAotICAgIGNoYXIgKnA7CQkJCQkJCQlcCi0gICAgcCA9IGZyYWdfdmFyIChyc19hbGlnbl9jb2RlLCAxNSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgbWF4LAkJXAotCQkgIChzeW1ib2xTICopIDAsIChvZmZzZXRUKSAobiksIChjaGFyICopIDApOwkJXAotICAgICpwID0gMHg5MDsJCQkJCQkJCVwKLSAgICBnb3RvIGFyb3VuZDsJCQkJCQkJXAotICB9Ci0KLWV4dGVybiB2b2lkIGkzODZfYWxpZ25fY29kZSBQQVJBTVMgKChmcmFnUyAqLCBpbnQpKTsKLQotI2RlZmluZSBIQU5ETEVfQUxJR04oZnJhZ1ApCQkJCQkJXAotaWYgKGZyYWdQLT5mcl90eXBlID09IHJzX2FsaWduX2NvZGUpIAkJCQkJXAotICBpMzg2X2FsaWduX2NvZGUgKGZyYWdQLCAoZnJhZ1AtPmZyX25leHQtPmZyX2FkZHJlc3MJCQlcCi0JCQkgICAtIGZyYWdQLT5mcl9hZGRyZXNzCQkJCVwKLQkJCSAgIC0gZnJhZ1AtPmZyX2ZpeCkpOwotCi0vKiBjYWxsIG1kX2FwcGx5X2ZpeDMgd2l0aCBzZWdtZW50IGluc3RlYWQgb2YgbWRfYXBwbHlfZml4ICovCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLQotdm9pZCBpMzg2X3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqKSk7Ci0jZGVmaW5lIHRjX3ByaW50X3N0YXRpc3RpY3MgaTM4Nl9wcmludF9zdGF0aXN0aWNzCi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLQotI2lmZGVmIFNDT19FTEYKLSNkZWZpbmUgdGNfaW5pdF9hZnRlcl9hcmdzKCkgc2NvX2lkICgpCi1leHRlcm4gdm9pZCBzY29faWQgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LICAgIC8qIGZvby0uIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0KLS8qIGVuZCBvZiB0Yy1pMzg2LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaTg2MC5jIGIvZ2FzL2NvbmZpZy90Yy1pODYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMTcyODIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1pODYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYzICswLDAgQEAKLS8qIHRjLWk4NjAuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIEk4NjAKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTIsIDkzLCA5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi0jaW5jbHVkZSAib3Bjb2RlL2k4NjAuaCIKLQotdm9pZCBtZF9iZWdpbiAoKTsKLXZvaWQgbWRfbnVtYmVyX3RvX2NoYXJzICgpOwotdm9pZCBtZF9hc3NlbWJsZSAoKTsKLWNoYXIgKm1kX2F0b2YgKCk7Ci12b2lkIG1kX2NvbnZlcnRfZnJhZyAoKTsKLWludCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoKTsKLXZvaWQgbWRfbnVtYmVyX3RvX2ltbSAoKTsKLXZvaWQgbWRfbnVtYmVyX3RvX2Rpc3AgKCk7Ci12b2lkIG1kX251bWJlcl90b19maWVsZCAoKTsKLXZvaWQgbWRfcmlfdG9fY2hhcnMgKCk7Ci1zdGF0aWMgdm9pZCBpODYwX2lwICgpOwotLyogdm9pZCBlbWl0X21hY2hpbmVfcmVsb2MoKTsgKi8KLQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pOwotCi0vKiB2b2lkICgqbWRfZW1pdF9yZWxvY2F0aW9ucykoKSA9IGVtaXRfbWFjaGluZV9yZWxvYzsgKi8KLQotLyogaGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZSAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2ggPSBOVUxMOwotCi1zdGF0aWMgdm9pZCBzX2R1YWwgKCksIHNfZW5kZHVhbCAoKTsKLXN0YXRpYyB2b2lkIHNfYXRtcCAoKTsKLQotY29uc3QgcHNldWRvX3R5cGVTCi0gIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJkdWFsIiwgc19kdWFsLCA0fSwKLSAgeyJlbmRkdWFsIiwgc19lbmRkdWFsLCA0fSwKLSAgeyJhdG1wIiwgc19hdG1wLCA0fSwKLSAge05VTEwsIDAsIDB9LAotfTsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiEvIjsJLyogSkYgcmVtb3ZlZCAnfCcgZnJvbSBjb21tZW50X2NoYXJzICovCi0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsuICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMvIjsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYyAuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuCi0gICAqLwotaW50IHNpemVfcmVsb2NfaW5mbyA9IHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbyk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIG9jdGFsWzI1Nl07Ci0jZGVmaW5lIGlzb2N0YWwoYykgIG9jdGFsW2NdCi1zdGF0aWMgdW5zaWduZWQgY2hhciB0b0hleFsyNTZdOwotCi1zdHJ1Y3QgaTg2MF9pdAotICB7Ci0gICAgY2hhciAqZXJyb3I7Ci0gICAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gICAgc3RydWN0IG5saXN0ICpubGlzdHA7Ci0gICAgZXhwcmVzc2lvblMgZXhwOwotICAgIGludCBwY3JlbDsKLSAgICBlbnVtIGV4cGFuZF90eXBlIGV4cGFuZDsKLSAgICBlbnVtIGhpZ2hsb3dfdHlwZSBoaWdobG93OwotICAgIGVudW0gcmVsb2NfdHlwZSByZWxvYzsKLSAgfSB0aGVfaW5zbjsKLQotI2lmIF9fU1REQ19fID09IDEKLQotc3RhdGljIHZvaWQgcHJpbnRfaW5zbiAoc3RydWN0IGk4NjBfaXQgKmluc24pOwotc3RhdGljIGludCBnZXRFeHByZXNzaW9uIChjaGFyICpzdHIpOwotCi0jZWxzZSAvKiBub3QgX19TVERDX18gKi8KLQotc3RhdGljIHZvaWQgcHJpbnRfaW5zbiAoKTsKLXN0YXRpYyBpbnQgZ2V0RXhwcmVzc2lvbiAoKTsKLQotI2VuZGlmIC8qIG5vdCBfX1NURENfXyAqLwotCi1zdGF0aWMgY2hhciAqZXhwcl9lbmQ7Ci1zdGF0aWMgY2hhciBsYXN0X2V4cGFuZDsJLyogZXJyb3IgaWYgZXhwYW5zaW9uIGFmdGVyIGJyYW5jaCAqLwotCi1lbnVtIGR1YWwKLXsKLSAgRFVBTF9PRkYgPSAwLCBEVUFMX09OLCBEVUFMX0RET1QsIERVQUxfT05ERE9ULAotfTsKLXN0YXRpYyBlbnVtIGR1YWwgZHVhbF9tb2RlID0gRFVBTF9PRkY7CS8qIGR1YWwtaW5zdHJ1Y3Rpb24gbW9kZSAqLwotCi1zdGF0aWMgdm9pZAotc19kdWFsICgpCQkJLyogZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIGhhdmUgZHVhbCBzZXQgKi8KLXsKLSAgZHVhbF9tb2RlID0gRFVBTF9PTjsKLX0KLQotc3RhdGljIHZvaWQKLXNfZW5kZHVhbCAoKQkJCS8qIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyBoYXZlIGR1YWwgc2V0ICovCi17Ci0gIGR1YWxfbW9kZSA9IERVQUxfT0ZGOwotfQotCi1zdGF0aWMgaW50IGF0bXAgPSAzMTsJCS8qIHRlbXBvcmFyeSByZWdpc3RlciBmb3IgcHNldWRvJ3MgKi8KLQotc3RhdGljIHZvaWQKLXNfYXRtcCAoKQotewotICByZWdpc3RlciBpbnQgdGVtcDsKLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInNwIiwgMikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLSAgICAgIGF0bXAgPSAyOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZnAiLCAyKSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotICAgICAgYXRtcCA9IDM7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJyIiwgMSkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMTsKLSAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICh0ZW1wID49IDAgJiYgdGVtcCA8PSAzMSkKLQlhdG1wID0gdGVtcDsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIlVua25vd24gdGVtcG9yYXJ5IHBzZXVkbyByZWdpc3RlciIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlVua25vd24gdGVtcG9yYXJ5IHBzZXVkbyByZWdpc3RlciIpKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBJdCBzaG91bGQKLSAgIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbCBuZWVkLiAgKi8KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnJldHZhbCA9IE5VTEw7Ci0gIGludCBsb3NlID0gMDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGkgPSAwOwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICB3aGlsZSAoaSA8IE5VTU9QQ09ERVMpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGk4NjBfb3Bjb2Rlc1tpXS5uYW1lOwotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hbWUsICZpODYwX29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIpLAotCQkgICBpODYwX29wY29kZXNbaV0ubmFtZSwgcmV0dmFsKTsKLQkgIGxvc2UgPSAxOwotCX0KLSAgICAgIGRvCi0JewotCSAgaWYgKGk4NjBfb3Bjb2Rlc1tpXS5tYXRjaCAmIGk4NjBfb3Bjb2Rlc1tpXS5sb3NlKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnRlcm5hbCBlcnJvcjogbG9zaW5nIG9wY29kZTogYCVzJyBcIiVzXCJcbiIpLAotCQkgICAgICAgaTg2MF9vcGNvZGVzW2ldLm5hbWUsIGk4NjBfb3Bjb2Rlc1tpXS5hcmdzKTsKLQkgICAgICBsb3NlID0gMTsKLQkgICAgfQotCSAgKytpOwotCX0KLSAgICAgIHdoaWxlIChpIDwgTlVNT1BDT0RFUwotCSAgICAgJiYgIXN0cmNtcCAoaTg2MF9vcGNvZGVzW2ldLm5hbWUsIG5hbWUpKTsKLSAgICB9Ci0KLSAgaWYgKGxvc2UpCi0gICAgYXNfZmF0YWwgKF8oIkJyb2tlbiBhc3NlbWJsZXIuICBObyBhc3NlbWJseSBhdHRlbXB0ZWQuIikpOwotCi0gIGZvciAoaSA9ICcwJzsgaSA8ICc4JzsgKytpKQotICAgIG9jdGFsW2ldID0gMTsKLSAgZm9yIChpID0gJzAnOyBpIDw9ICc5JzsgKytpKQotICAgIHRvSGV4W2ldID0gaSAtICcwJzsKLSAgZm9yIChpID0gJ2EnOyBpIDw9ICdmJzsgKytpKQotICAgIHRvSGV4W2ldID0gaSArIDEwIC0gJ2EnOwotICBmb3IgKGkgPSAnQSc7IGkgPD0gJ0YnOyArK2kpCi0gICAgdG9IZXhbaV0gPSBpICsgMTAgLSAnQSc7Ci19Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqdG9QOwotICBpbnQgcnNkOwotICBpbnQgbm9fb3Bjb2RlcyA9IDE7Ci0gIGludCBpOwotICBzdHJ1Y3QgaTg2MF9pdCBwc2V1ZG9bM107Ci0KLSAgYXNzZXJ0IChzdHIpOwotICBpODYwX2lwIChzdHIpOwotCi0gIC8qIGNoZWNrIGZvciBleHBhbmRhYmxlIGZsYWcgdG8gcHJvZHVjZSBwc2V1ZG8taW5zdHJ1Y3Rpb25zICovCi0gIGlmICh0aGVfaW5zbi5leHBhbmQgIT0gMCAmJiB0aGVfaW5zbi5oaWdobG93ID09IE5PX1NQRUMpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLQlwc2V1ZG9baV0gPSB0aGVfaW5zbjsKLQotICAgICAgc3dpdGNoICh0aGVfaW5zbi5leHBhbmQpCi0JewotCi0JY2FzZSBFX0RFTEFZOgotCSAgbm9fb3Bjb2RlcyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgRV9NT1Y6Ci0JICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8ICgxIDw8IDE1KSAmJgotCSAgICAgICB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49IC0oMSA8PCAxNSkpKQotCSAgICBicmVhazsKLQkgIC8qIG9yIGwlY29uc3QscjAsaXJlZ19kZXN0ICovCi0JICBwc2V1ZG9bMF0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDAxZjAwMDApIHwgMHhlNDAwMDAwMDsKLQkgIHBzZXVkb1swXS5oaWdobG93ID0gUEFJUjsKLQkgIC8qIG9yaCBoJWNvbnN0LGlyZWdfZGVzdCxpcmVnX2Rlc3QgKi8KLQkgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwM2ZmZmZmZikgfCAweGVjMDAwMDAwIHwKLQkgICAgKCh0aGVfaW5zbi5vcGNvZGUgJiAweDAwMWYwMDAwKSA8PCA1KTsKLQkgIHBzZXVkb1sxXS5oaWdobG93ID0gSElHSDsKLQkgIG5vX29wY29kZXMgPSAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfQUREUjoKLQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICB0aGVfaW5zbi5leHAuWF9vcF9zeW1ib2wgPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JICAvKiBvcmggaGElYWRkcl9leHByLHIwLHIzMSAqLwotCSAgcHNldWRvWzBdLm9wY29kZSA9IDB4ZWMwMDAwMDAgfCAoYXRtcCA8PCAxNik7Ci0JICBwc2V1ZG9bMF0uaGlnaGxvdyA9IEhJR0hBREo7Ci0JICBwc2V1ZG9bMF0ucmVsb2MgPSBMT1cwOwkvKiBtdXN0IG92ZXJ3cml0ZSAqLwotCSAgLyogbCVhZGRyX2V4cHIocjMxKSxpcmVnX2Rlc3QgKi8KLQkgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgfjB4MDAzZTAwMDApIHwgKGF0bXAgPDwgMjEpOwotCSAgcHNldWRvWzFdLmhpZ2hsb3cgPSBQQUlSOwotCSAgbm9fb3Bjb2RlcyA9IDI7Ci0JICBicmVhazsKLQotCWNhc2UgRV9VMzI6CQkvKiAybmQgdmVyc2lvbiBlbXVsYXRlcyBJbnRlbCBhcywgbm90IGRvYy4gKi8KLQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICB0aGVfaW5zbi5leHAuWF9vcF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgKDEgPDwgMTYpICYmCi0JICAgICAgIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPj0gMCkpCi0JICAgIGJyZWFrOwotCSAgLyogJChvcGNvZGUpaCBoJWNvbnN0LGlyZWdfc3JjMixpcmVnX2Rlc3QKLQkJCSAgIHBzZXVkb1swXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHhmM2ZmZmZmZikgfCAweDBjMDAwMDAwOyAqLwotCSAgLyogJChvcGNvZGUpaCBoJWNvbnN0LGlyZWdfc3JjMixyMzEgKi8KLQkgIHBzZXVkb1swXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHhmM2UwZmZmZikgfCAweDBjMDAwMDAwIHwKLQkgICAgKGF0bXAgPDwgMTYpOwotCSAgcHNldWRvWzBdLmhpZ2hsb3cgPSBISUdIOwotCSAgLyogJChvcGNvZGUpIGwlY29uc3QsaXJlZ19kZXN0LGlyZWdfZGVzdAotCQkJICAgcHNldWRvWzFdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweGYwMWYwMDAwKSB8IDB4MDQwMDAwMDAgfAotCQkJICAgKCh0aGVfaW5zbi5vcGNvZGUgJiAweDAwMWYwMDAwKSA8PCA1KTsgKi8KLQkgIC8qICQob3Bjb2RlKSBsJWNvbnN0LHIzMSxpcmVnX2Rlc3QgKi8KLQkgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHhmMDFmMDAwMCkgfCAweDA0MDAwMDAwIHwKLQkgICAgKGF0bXAgPDwgMjEpOwotCSAgcHNldWRvWzFdLmhpZ2hsb3cgPSBQQUlSOwotCSAgbm9fb3Bjb2RlcyA9IDI7Ci0JICBicmVhazsKLQotCWNhc2UgRV9BTkQ6CQkvKiAybmQgdmVyc2lvbiBlbXVsYXRlcyBJbnRlbCBhcywgbm90IGRvYy4gKi8KLQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICB0aGVfaW5zbi5leHAuWF9vcF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgKDEgPDwgMTYpICYmCi0JICAgICAgIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPj0gMCkpCi0JICAgIGJyZWFrOwotCSAgLyogYW5kbm90IGglY29uc3QsaXJlZ19zcmMyLGlyZWdfZGVzdAotCQkJICAgcHNldWRvWzBdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAzZmZmZmZmKSB8IDB4ZDQwMDAwMDA7ICovCi0JICAvKiBhbmRub3QgaCVjb25zdCxpcmVnX3NyYzIscjMxICovCi0JICBwc2V1ZG9bMF0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDNlMGZmZmYpIHwgMHhkNDAwMDAwMCB8Ci0JICAgIChhdG1wIDw8IDE2KTsKLQkgIHBzZXVkb1swXS5oaWdobG93ID0gSElHSDsKLQkgIHBzZXVkb1swXS5leHAuWF9hZGRfbnVtYmVyID0gLTEgLSB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyOwotCSAgLyogYW5kbm90IGwlY29uc3QsaXJlZ19kZXN0LGlyZWdfZGVzdAotCQkJICAgcHNldWRvWzFdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAwMWYwMDAwKSB8IDB4ZDQwMDAwMDAgfAotCQkJICAgKCh0aGVfaW5zbi5vcGNvZGUgJiAweDAwMWYwMDAwKSA8PCA1KTsgKi8KLQkgIC8qIGFuZG5vdCBsJWNvbnN0LHIzMSxpcmVnX2Rlc3QgKi8KLQkgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgfCAweGQ0MDAwMDAwIHwKLQkgICAgKGF0bXAgPDwgMjEpOwotCSAgcHNldWRvWzFdLmhpZ2hsb3cgPSBQQUlSOwotCSAgcHNldWRvWzFdLmV4cC5YX2FkZF9udW1iZXIgPSAtMSAtIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXI7Ci0JICBub19vcGNvZGVzID0gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX1MzMjoKLQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICB0aGVfaW5zbi5leHAuWF9vcF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgKDEgPDwgMTUpICYmCi0JICAgICAgIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPj0gLSgxIDw8IDE1KSkpCi0JICAgIGJyZWFrOwotCSAgLyogb3JoIGglY29uc3QscjAscjMxICovCi0JICBwc2V1ZG9bMF0ub3Bjb2RlID0gMHhlYzAwMDAwMCB8IChhdG1wIDw8IDE2KTsKLQkgIHBzZXVkb1swXS5oaWdobG93ID0gSElHSDsKLQkgIC8qIG9yIGwlY29uc3QscjMxLHIzMSAqLwotCSAgcHNldWRvWzFdLm9wY29kZSA9IDB4ZTQwMDAwMDAgfCAoYXRtcCA8PCAyMSkgfCAoYXRtcCA8PCAxNik7Ci0JICBwc2V1ZG9bMV0uaGlnaGxvdyA9IFBBSVI7Ci0JICAvKiByMzEsaXJlZ19zcmMyLGlyZWdfZGVzdCAqLwotCSAgcHNldWRvWzJdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiB+MHgwNDAwZmZmZikgfCAoYXRtcCA8PCAxMSk7Ci0JICBwc2V1ZG9bMl0ucmVsb2MgPSBOT19SRUxPQzsKLQkgIG5vX29wY29kZXMgPSAzOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOwotCX0KLQotICAgICAgdGhlX2luc24gPSBwc2V1ZG9bMF07Ci0gICAgICAvKiBjaGVjayBmb3IgZXhwYW5kZWQgb3Bjb2RlIGFmdGVyIGJyYW5jaCBvciBpbiBkdWFsICovCi0gICAgICBpZiAobm9fb3Bjb2RlcyA+IDEgJiYgbGFzdF9leHBhbmQgPT0gMSkKLQlhc193YXJuIChfKCJFeHBhbmRlZCBvcGNvZGUgYWZ0ZXIgZGVsYXllZCBicmFuY2g6IGAlcyciKSwgc3RyKTsKLSAgICAgIGlmIChub19vcGNvZGVzID4gMSAmJiBkdWFsX21vZGUgIT0gRFVBTF9PRkYpCi0JYXNfd2FybiAoXygiRXhwYW5kZWQgb3Bjb2RlIGluIGR1YWwgbW9kZTogYCVzJyIpLCBzdHIpOwotICAgIH0KLQotICBpID0gMDsKLSAgZG8KLSAgICB7CQkJCS8qIGFsd2F5cyBwcm9kdWNlIGF0IGxlYXN0IG9uZSBvcGNvZGUgKi8KLSAgICAgIHRvUCA9IGZyYWdfbW9yZSAoNCk7Ci0gICAgICAvKiBwdXQgb3V0IHRoZSBvcGNvZGUgKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAodG9QLCB0aGVfaW5zbi5vcGNvZGUsIDQpOwotCi0gICAgICAvKiBjaGVjayBmb3IgZXhwYW5kZWQgb3Bjb2RlIGFmdGVyIGJyYW5jaCBvciBpbiBkdWFsICovCi0gICAgICBsYXN0X2V4cGFuZCA9IHRoZV9pbnNuLnBjcmVsOwotCi0gICAgICAvKiBwdXQgb3V0IHRoZSBzeW1ib2wtZGVwZW5kZW50IHN0dWZmICovCi0gICAgICBpZiAodGhlX2luc24ucmVsb2MgIT0gTk9fUkVMT0MpCi0JewotCSAgZml4X25ldyAoZnJhZ19ub3csCS8qIHdoaWNoIGZyYWcgKi8KLQkJICAgKHRvUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwJLyogd2hlcmUgKi8KLQkJICAgNCwJCS8qIHNpemUgKi8KLQkJICAgJnRoZV9pbnNuLmV4cCwKLQkJICAgdGhlX2luc24ucGNyZWwsCi0JICAvKiBtZXJnZSBiaXQgZmllbGRzIGludG8gb25lIGFyZ3VtZW50ICovCi0JICAoaW50KSAoKCh0aGVfaW5zbi5oaWdobG93ICYgMHgzKSA8PCA0KSB8ICh0aGVfaW5zbi5yZWxvYyAmIDB4ZikpKTsKLQl9Ci0gICAgICB0aGVfaW5zbiA9IHBzZXVkb1srK2ldOwotICAgIH0KLSAgd2hpbGUgKC0tbm9fb3Bjb2RlcyA+IDApOwotCi19Ci0KLXN0YXRpYyB2b2lkCi1pODYwX2lwIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqczsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgY2hhciBjOwotICB1bnNpZ25lZCBsb25nIGk7Ci0gIHN0cnVjdCBpODYwX29wY29kZSAqaW5zbjsKLSAgY2hhciAqYXJnc1N0YXJ0OwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgdW5zaWduZWQgaW50IG1hc2s7Ci0gIGludCBtYXRjaCA9IDA7Ci0gIGludCBjb21tYSA9IDA7Ci0KLQotICBmb3IgKHMgPSBzdHI7IGlzbG93ZXIgKCpzKSB8fCAqcyA9PSAnLicgfHwgKnMgPT0gJzMnOyArK3MpCi0gICAgOwotICBzd2l0Y2ggKCpzKQotICAgIHsKLQotICAgIGNhc2UgJ1wwJzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLCc6Ci0gICAgICBjb21tYSA9IDE7Ci0KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotCi0gICAgY2FzZSAnICc6Ci0gICAgICAqcysrID0gJ1wwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgIH0KLQotICBpZiAoc3RybmNtcCAoc3RyLCAiZC4iLCAyKSA9PSAwKQotICAgIHsJCQkJLyogY2hlY2sgZm9yIGQuIG9wY29kZSBwcmVmaXggKi8KLSAgICAgIGlmIChkdWFsX21vZGUgPT0gRFVBTF9PTikKLQlkdWFsX21vZGUgPSBEVUFMX09ORERPVDsKLSAgICAgIGVsc2UKLQlkdWFsX21vZGUgPSBEVUFMX0RET1Q7Ci0gICAgICBzdHIgKz0gMjsKLSAgICB9Ci0KLSAgaWYgKChpbnNuID0gKHN0cnVjdCBpODYwX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cikpID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGR1YWxfbW9kZSA9PSBEVUFMX0RET1QgfHwgZHVhbF9tb2RlID09IERVQUxfT05ERE9UKQotCXN0ciAtPSAyOwotICAgICAgYXNfYmFkIChfKCJVbmtub3duIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKGNvbW1hKQotICAgIHsKLSAgICAgICotLXMgPSAnLCc7Ci0gICAgfQotICBhcmdzU3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIG9wY29kZSA9IGluc24tPm1hdGNoOwotICAgICAgbWVtc2V0ICgmdGhlX2luc24sICdcMCcsIHNpemVvZiAodGhlX2luc24pKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gTk9fUkVMT0M7Ci0KLSAgICAgIC8qCi0JCSAqIEJ1aWxkIHRoZSBvcGNvZGUsIGNoZWNraW5nIGFzIHdlIGdvIHRvIG1ha2UKLQkJICogc3VyZSB0aGF0IHRoZSBvcGVyYW5kcyBtYXRjaAotCQkgKi8KLSAgICAgIGZvciAoYXJncyA9IGluc24tPmFyZ3M7OyArK2FyZ3MpCi0JewotCSAgc3dpdGNoICgqYXJncykKLQkgICAgewotCi0JICAgIGNhc2UgJ1wwJzoJCS8qIGVuZCBvZiBhcmdzICovCi0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCXsKLQkJICBtYXRjaCA9IDE7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcrJzoKLQkgICAgY2FzZSAnKCc6CQkvKiB0aGVzZSBtdXN0IG1hdGNoIGV4YWN0bHkgKi8KLQkgICAgY2FzZSAnKSc6Ci0JICAgIGNhc2UgJywnOgotCSAgICBjYXNlICcgJzoKLQkgICAgICBpZiAoKnMrKyA9PSAqYXJncykKLQkJY29udGludWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnIyc6CQkvKiBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCAqLwotCSAgICAgIGlmIChpc2RpZ2l0ICgqcysrKSkKLQkJewotCQkgIHdoaWxlIChpc2RpZ2l0ICgqcykpCi0JCSAgICB7Ci0JCSAgICAgICsrczsKLQkJICAgIH0KLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzEnOgkJLyogbmV4dCBvcGVyYW5kIG11c3QgYmUgYSByZWdpc3RlciAqLwotCSAgICBjYXNlICcyJzoKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgc3dpdGNoICgqcykKLQkJewotCi0JCWNhc2UgJ2YnOgkvKiBmcmFtZSBwb2ludGVyICovCi0JCSAgcysrOwotCQkgIGlmICgqcysrID09ICdwJykKLQkJICAgIHsKLQkJICAgICAgbWFzayA9IDB4MzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgZ290byBlcnJvcjsKLQotCQljYXNlICdzJzoJLyogc3RhY2sgcG9pbnRlciAqLwotCQkgIHMrKzsKLQkJICBpZiAoKnMrKyA9PSAncCcpCi0JCSAgICB7Ci0JCSAgICAgIG1hc2sgPSAweDI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGdvdG8gZXJyb3I7Ci0KLQkJY2FzZSAncic6CS8qIGFueSByZWdpc3RlciAqLwotCQkgIHMrKzsKLQkJICBpZiAoIWlzZGlnaXQgKGMgPSAqcysrKSkKLQkJICAgIHsKLQkJICAgICAgZ290byBlcnJvcjsKLQkJICAgIH0KLQkJICBpZiAoaXNkaWdpdCAoKnMpKQotCQkgICAgewotCQkgICAgICBpZiAoKGMgPSAxMCAqIChjIC0gJzAnKSArICgqcysrIC0gJzAnKSkgPj0gMzIpCi0JCQl7Ci0JCQkgIGdvdG8gZXJyb3I7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBjIC09ICcwJzsKLQkJICAgIH0KLQkJICBtYXNrID0gYzsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgkvKiBub3QgdGhpcyBvcGNvZGUgKi8KLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgLyoKLQkJCQkgKiBHb3QgdGhlIHJlZ2lzdGVyLCBub3cgZmlndXJlIG91dCB3aGVyZQotCQkJCSAqIGl0IGdvZXMgaW4gdGhlIG9wY29kZS4KLQkJCQkgKi8KLQkgICAgICBzd2l0Y2ggKCphcmdzKQotCQl7Ci0KLQkJY2FzZSAnMSc6Ci0JCSAgb3Bjb2RlIHw9IG1hc2sgPDwgMTE7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAnMic6Ci0JCSAgb3Bjb2RlIHw9IG1hc2sgPDwgMjE7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAnZCc6Ci0JCSAgb3Bjb2RlIHw9IG1hc2sgPDwgMTY7Ci0JCSAgY29udGludWU7Ci0KLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2UnOgkJLyogbmV4dCBvcGVyYW5kIGlzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAnZic6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICAgIGlmICgqcysrID09ICdmJyAmJiBpc2RpZ2l0ICgqcykpCi0JCXsKLQkJICBtYXNrID0gKnMrKzsKLQkJICBpZiAoaXNkaWdpdCAoKnMpKQotCQkgICAgewotCQkgICAgICBtYXNrID0gMTAgKiAobWFzayAtICcwJykgKyAoKnMrKyAtICcwJyk7Ci0JCSAgICAgIGlmIChtYXNrID49IDMyKQotCQkJewotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIG1hc2sgLT0gJzAnOwotCQkgICAgfQotCQkgIHN3aXRjaCAoKmFyZ3MpCi0JCSAgICB7Ci0KLQkJICAgIGNhc2UgJ2UnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAxMTsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ2YnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAyMTsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ2cnOgotCQkgICAgICBvcGNvZGUgfD0gbWFzayA8PCAxNjsKLQkJICAgICAgaWYgKGR1YWxfbW9kZSAhPSBEVUFMX09GRikKLQkJCW9wY29kZSB8PSAoMSA8PCA5KTsJLyogZHVhbCBtb2RlIGluc3RydWN0aW9uICovCi0JCSAgICAgIGlmIChkdWFsX21vZGUgPT0gRFVBTF9ERE9UKQotCQkJZHVhbF9tb2RlID0gRFVBTF9PRkY7Ci0JCSAgICAgIGlmIChkdWFsX21vZGUgPT0gRFVBTF9PTkRET1QpCi0JCQlkdWFsX21vZGUgPSBEVUFMX09OOwotCQkgICAgICBpZiAoKG9wY29kZSAmICgxIDw8IDEwKSkgJiYgKG1hc2sgPT0gKChvcGNvZGUgPj4gMTEpICYgMHgxZikpKQotCQkJYXNfd2FybiAoXygiRnNyMSBlcXVhbHMgZmRlc3Qgd2l0aCBQaXBlbGluaW5nIikpOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2MnOgkJLyogbmV4dCBvcGVyYW5kIG11c3QgYmUgYSBjb250cm9sIHJlZ2lzdGVyICovCi0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJmaXIiLCAzKSA9PSAwKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IDB4MCA8PCAyMTsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgInBzciIsIDMpID09IDApCi0JCXsKLQkJICBvcGNvZGUgfD0gMHgxIDw8IDIxOwotCQkgIHMgKz0gMzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiZGlyYmFzZSIsIDcpID09IDApCi0JCXsKLQkJICBvcGNvZGUgfD0gMHgyIDw8IDIxOwotCQkgIHMgKz0gNzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiZGIiLCAyKSA9PSAwKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IDB4MyA8PCAyMTsKLQkJICBzICs9IDI7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgImZzciIsIDMpID09IDApCi0JCXsKLQkJICBvcGNvZGUgfD0gMHg0IDw8IDIxOwotCQkgIHMgKz0gMzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiZXBzciIsIDQpID09IDApCi0JCXsKLQkJICBvcGNvZGUgfD0gMHg1IDw8IDIxOwotCQkgIHMgKz0gNDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzUnOgkJLyogNSBiaXQgaW1tZWRpYXRlIGluIHNyYzEgKi8KLQkgICAgICBtZW1zZXQgKCZ0aGVfaW5zbiwgJ1wwJywgc2l6ZW9mICh0aGVfaW5zbikpOwotCSAgICAgIGlmICghZ2V0RXhwcmVzc2lvbiAocykpCi0JCXsKLQkJICBzID0gZXhwcl9lbmQ7Ci0JCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgJiB+MHgxZikKLQkJICAgIGFzX2JhZCAoXygiNS1iaXQgaW1tZWRpYXRlIHRvbyBsYXJnZSIpKTsKLQkJICBvcGNvZGUgfD0gKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgJiAweDFmKSA8PCAxMTsKLQkJICBtZW1zZXQgKCZ0aGVfaW5zbiwgJ1wwJywgc2l6ZW9mICh0aGVfaW5zbikpOwotCQkgIHRoZV9pbnNuLnJlbG9jID0gTk9fUkVMT0M7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdsJzoJCS8qIDI2IGJpdCBpbW1lZGlhdGUsIHJlbGF0aXZlIGJyYW5jaCAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQlJBRERSOwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdzJzoJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIHNwbGl0IHJlbGF0aXZlIGJyYW5jaCAqLwotCSAgICAgIC8qIHVwcGVyIDUgYml0cyBvZiBvZmZzZXQgaW4gZGVzdCBmaWVsZCAqLwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IFNQTElUMDsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdTJzoJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIHNwbGl0IChzdCksIGFsaWduZWQgKi8KLQkgICAgICBpZiAob3Bjb2RlICYgKDEgPDwgMjgpKQotCQlpZiAob3Bjb2RlICYgMHgxKQotCQkgIHRoZV9pbnNuLnJlbG9jID0gU1BMSVQyOwotCQllbHNlCi0JCSAgdGhlX2luc24ucmVsb2MgPSBTUExJVDE7Ci0JICAgICAgZWxzZQotCQl0aGVfaW5zbi5yZWxvYyA9IFNQTElUMDsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdJJzoJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIGFsaWduZWQgKi8KLQkgICAgICBpZiAob3Bjb2RlICYgKDEgPDwgMjgpKQotCQlpZiAob3Bjb2RlICYgMHgxKQotCQkgIHRoZV9pbnNuLnJlbG9jID0gTE9XMjsKLQkJZWxzZQotCQkgIHRoZV9pbnNuLnJlbG9jID0gTE9XMTsKLQkgICAgICBlbHNlCi0JCXRoZV9pbnNuLnJlbG9jID0gTE9XMDsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdpJzoJCS8qIDE2IGJpdCBpbW1lZGlhdGUgKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IExPVzA7Ci0KLQkgICAgICAvKkZBTExUSFJPVUdIKi8KLQotCSAgICBpbW1lZGlhdGU6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJcysrOwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiaGElIiwgMykgPT0gMCkKLQkJewotCQkgIHRoZV9pbnNuLmhpZ2hsb3cgPSBISUdIQURKOwotCQkgIHMgKz0gMzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHMsICJoJSIsIDIpID09IDApCi0JCXsKLQkJICB0aGVfaW5zbi5oaWdobG93ID0gSElHSDsKLQkJICBzICs9IDI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJuY21wIChzLCAibCUiLCAyKSA9PSAwKQotCQl7Ci0JCSAgdGhlX2luc24uaGlnaGxvdyA9IFBBSVI7Ci0JCSAgcyArPSAyOwotCQl9Ci0JICAgICAgdGhlX2luc24uZXhwYW5kID0gaW5zbi0+ZXhwYW5kOwotCi0JICAgICAgLyogTm90ZSB0aGF0IGlmIHRoZSBnZXRFeHByZXNzaW9uKCkgZmFpbHMsIHdlIHdpbGwgc3RpbGwgaGF2ZQotCQkJCSAgIGNyZWF0ZWQgVSBlbnRyaWVzIGluIHRoZSBzeW1ib2wgdGFibGUgZm9yIHRoZSAnc3ltYm9scycKLQkJCQkgICBpbiB0aGUgaW5wdXQgc3RyaW5nLiAgVHJ5IG5vdCB0byBjcmVhdGUgVSBzeW1ib2xzIGZvcgotCQkJCSAgIHJlZ2lzdGVycywgZXRjLiAqLwotCi0JICAgICAgaWYgKCFnZXRFeHByZXNzaW9uIChzKSkKLQkJewotCQkgIHMgPSBleHByX2VuZDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgZXJyb3I6Ci0gICAgICBpZiAobWF0Y2ggPT0gMCkKLQl7Ci0JICAvKiBBcmdzIGRvbid0IG1hdGNoLiAgKi8KLQkgIGlmICgmaW5zblsxXSAtIGk4NjBfb3Bjb2RlcyA8IE5VTU9QQ09ERVMKLQkgICAgICAmJiAhc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpKQotCSAgICB7Ci0JICAgICAgKytpbnNuOwotCSAgICAgIHMgPSBhcmdzU3RhcnQ7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiSWxsZWdhbCBvcGVyYW5kcyIpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgdGhlX2luc24ub3Bjb2RlID0gb3Bjb2RlOwotfQotCi1zdGF0aWMgaW50Ci1nZXRFeHByZXNzaW9uIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqc2F2ZV9pbjsKLSAgc2VnVCBzZWc7Ci0KLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICBzZWcgPSBleHByZXNzaW9uICgmdGhlX2luc24uZXhwKTsKLSAgaWYgKHNlZyAhPSBhYnNvbHV0ZV9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gdW5kZWZpbmVkX3NlY3Rpb24KLSAgICAgICYmICEgU0VHX05PUk1BTCAoc2VnKSkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5lcnJvciA9IF8oImJhZCBzZWdtZW50Iik7Ci0gICAgICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICByZXR1cm4gMDsKLX0KLQotCi0vKgotICBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgbWRfYXRvZiBpbiBtNjhrLmMuICBJIHRoaW5rIHRoaXMgaXMgcmlnaHQsCi0gIGJ1dCBJJ20gbm90IHN1cmUuCi0KLSAgVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAgKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLQotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFdyaXRlIG91dCBiaWctZW5kaWFuLgotICovCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLXZvaWQKLW1kX251bWJlcl90b19pbW0gKGJ1ZiwgdmFsLCBuLCBmaXhQKQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotICAgICBpbnQgbjsKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgZW51bSByZWxvY190eXBlIHJlbG9jID0gZml4UC0+Znhfcl90eXBlICYgMHhmOwotICBlbnVtIGhpZ2hsb3dfdHlwZSBoaWdobG93ID0gKGZpeFAtPmZ4X3JfdHlwZSA+PiA0KSAmIDB4MzsKLQotICBhc3NlcnQgKGJ1Zik7Ci0gIGFzc2VydCAobiA9PSA0KTsJCS8qIGFsd2F5cyBvbiBpODYwICovCi0KLSAgc3dpdGNoIChoaWdobG93KQotICAgIHsKLQotICAgIGNhc2UgSElHSEFESjoJCS8qIGFkanVzdHMgdGhlIGhpZ2gtb3JkZXIgMTYtYml0cyAqLwotICAgICAgaWYgKHZhbCAmICgxIDw8IDE1KSkKLQl2YWwgKz0gKDEgPDwgMTYpOwotCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLQotICAgIGNhc2UgSElHSDoJCQkvKiBzZWxlY3RzIHRoZSBoaWdoLW9yZGVyIDE2LWJpdHMgKi8KLSAgICAgIHZhbCA+Pj0gMTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUEFJUjoJCQkvKiBzZWxlY3RzIHRoZSBsb3ctb3JkZXIgMTYtYml0cyAqLwotICAgICAgdmFsID0gdmFsICYgMHhmZmZmOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHN3aXRjaCAocmVsb2MpCi0gICAgewotCi0gICAgY2FzZSBCUkFERFI6CQkvKiBicixjYWxsLGJjLGJjLnQsYm5jLGJuYy50IHcvMjYtYml0IGltbWVkaWF0ZSAqLwotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsICE9IDEpCi0JYXNfYmFkIChfKCIyNi1iaXQgYnJhbmNoIHcvbyBwYyByZWxhdGl2ZSBzZXQ6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsID4+PSAyOwkJLyogYWxpZ24gcGNyZWwgb2Zmc2V0LCBzZWUgbWFudWFsICovCi0KLSAgICAgIGlmICh2YWwgPj0gKDEgPDwgMjUpIHx8IHZhbCA8IC0oMSA8PCAyNSkpCS8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLwotCWFzX2JhZCAoXygiMjYtYml0IGJyYW5jaCBvZmZzZXQgb3ZlcmZsb3c6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgYnVmWzBdID0gKGJ1ZlswXSAmIDB4ZmMpIHwgKCh2YWwgPj4gMjQpICYgMHgzKTsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNQTElUMjoJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIDQtYnl0ZSBhbGlnbmVkICovCi0gICAgICBpZiAodmFsICYgMHgzKQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSA0LWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCAmPSB+MHgzOwkJLyogNC1ieXRlIGFsaWduIHZhbHVlICovCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLSAgICBjYXNlIFNQTElUMToJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIDItYnl0ZSBhbGlnbmVkICovCi0gICAgICBpZiAodmFsICYgMHgxKQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSAyLWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCAmPSB+MHgxOwkJLyogMi1ieXRlIGFsaWduIHZhbHVlICovCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLSAgICBjYXNlIFNQTElUMDoJCS8qIHN0LGJsYSxidGUsYnRuZSB3LzE2LWJpdCBpbW1lZGlhdGUgKi8KLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCA9PSAxKQotCXZhbCA+Pj0gMjsJCS8qIGFsaWduIHBjcmVsIG9mZnNldCwgc2VlIG1hbnVhbCAqLwotICAgICAgLyogY2hlY2sgZm9yIGJvdW5kcyAqLwotICAgICAgaWYgKGhpZ2hsb3cgIT0gUEFJUiAmJiAodmFsID49ICgxIDw8IDE2KSB8fCB2YWwgPCAtKDEgPDwgMTUpKSkKLQlhc19iYWQgKF8oIjE2LWJpdCBicmFuY2ggb2Zmc2V0IG92ZXJmbG93OiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIGJ1ZlsxXSA9IChidWZbMV0gJiB+MHgxZikgfCAoKHZhbCA+PiAxMSkgJiAweDFmKTsKLSAgICAgIGJ1ZlsyXSA9IChidWZbMl0gJiB+MHg3KSB8ICgodmFsID4+IDgpICYgMHg3KTsKLSAgICAgIGJ1ZlszXSB8PSB2YWw7CQkvKiBwZXJzZXJ2ZSBib3R0b20gb3Bjb2RlIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMT1c0OgkJCS8qIGZsZCxwZmxkLHBzdCxmbHVzaCAxNi1ieXRlIGFsaWduZWQgKi8KLSAgICAgIGlmICh2YWwgJiAweGYpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIDE2LWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCAmPSB+MHhmOwkJLyogMTYtYnl0ZSBhbGlnbiB2YWx1ZSAqLwotICAgICAgLypGQUxMVEhST1VHSCovCi0gICAgY2FzZSBMT1czOgkJCS8qIGZsZCxwZmxkLHBzdCxmbHVzaCA4LWJ5dGUgYWxpZ25lZCAqLwotICAgICAgaWYgKHZhbCAmIDB4NykKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgOC1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgJj0gfjB4NzsJCS8qIDgtYnl0ZSBhbGlnbiB2YWx1ZSAqLwotICAgICAgLypGQUxMVEhST1VHSCovCi0gICAgY2FzZSBMT1cyOgkJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIDQtYnl0ZSBhbGlnbmVkICovCi0gICAgICBpZiAodmFsICYgMHgzKQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSA0LWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCAmPSB+MHgzOwkJLyogNC1ieXRlIGFsaWduIHZhbHVlICovCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLSAgICBjYXNlIExPVzE6CQkJLyogMTYgYml0IGltbWVkaWF0ZSwgMi1ieXRlIGFsaWduZWQgKi8KLSAgICAgIGlmICh2YWwgJiAweDEpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIDItYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsICY9IH4weDE7CQkvKiAyLWJ5dGUgYWxpZ24gdmFsdWUgKi8KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotICAgIGNhc2UgTE9XMDoJCQkvKiAxNiBiaXQgaW1tZWRpYXRlLCBieXRlIGFsaWduZWQgKi8KLSAgICAgIC8qIGNoZWNrIGZvciBib3VuZHMgKi8KLSAgICAgIGlmIChoaWdobG93ICE9IFBBSVIgJiYgKHZhbCA+PSAoMSA8PCAxNikgfHwgdmFsIDwgLSgxIDw8IDE1KSkpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIG92ZXJmbG93OiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdIHw9IHZhbDsJCS8qIHBlcnNlcnZlIGJvdHRvbSBvcGNvZGUgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5PX1JFTE9DOgotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oImJhZCByZWxvY2F0aW9uIHR5cGU6IDB4JTAyeCIpLCByZWxvYyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZm9yIGk4NjAgKi8KLXZvaWQKLW1kX251bWJlcl90b19kaXNwIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICBsb25nIHZhbDsKLXsKLSAgYXNfZmF0YWwgKF8oIm1kX251bWJlcl90b19kaXNwXG4iKSk7Ci19Ci0KLS8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZm9yIGk4NjAgKi8KLXZvaWQKLW1kX251bWJlcl90b19maWVsZCAoYnVmLCB2YWwsIGZpeCkKLSAgICAgY2hhciAqYnVmOwotICAgICBsb25nIHZhbDsKLSAgICAgdm9pZCAqZml4OwotewotICBhc19mYXRhbCAoXygiaTg2MF9udW1iZXJfdG9fZmllbGRcbiIpKTsKLX0KLQotLyogdGhlIGJpdC1maWVsZCBlbnRyaWVzIGluIHRoZSByZWxvY2F0aW9uX2luZm8gc3RydWN0IHBsYXlzIGhlbGwKLSAgIHdpdGggdGhlIGJ5dGUtb3JkZXIgcHJvYmxlbXMgb2YgY3Jvc3MtYXNzZW1ibHkuICBTbyBhcyBhIGhhY2ssCi0gICBJIGFkZGVkIHRoaXMgbWFjaC4gZGVwZW5kZW50IHJpIHR3aWRkbGVyLiAgVWdseSwgYnV0IGl0IGdldHMKLSAgIHlvdSB0aGVyZS4gLUtXSyAqLwotLyogb24gaTg2MDogZmlyc3QgNCBieXRlcyBhcmUgbm9ybWFsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgbmV4dCB0aHJlZQotICAgYnl0ZXMgYXJlIGluZGV4LCBtb3N0IHNpZy4gYnl0ZSBmaXJzdC4gIEJ5dGUgNyBpcyBicm9rZW4gdXAgd2l0aAotICAgYml0IDcgYXMgcGNyZWwsIGJpdCA2IGFzIGV4dGVybiwgYW5kIHRoZSBsb3dlciBzaXggYml0cyBhcwotICAgcmVsb2NhdGlvbiB0eXBlIChoaWdobG93IDUtNCkuICBOZXh0IDQgYnl0ZXMgYXJlIGxvbmcgYWRkZW5kLiAqLwotLyogVGhhbnggYW5kIGEgdGlwIG9mIHRoZSBoYXQgdG8gTWljaGFlbCBCbG9vbSwgbWJAdHRpZGNhLnR0aS5jb20gKi8KLXZvaWQKLW1kX3JpX3RvX2NoYXJzIChyaV9wLCByaSkKLSAgICAgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcmlfcCwgcmk7Ci17Ci0jaWYgMAotICB1bnNpZ25lZCBjaGFyIHRoZV9ieXRlc1tzaXplb2YgKCpyaV9wKV07Ci0KLSAgLyogdGhpcyBpcyBlYXN5ICovCi0gIG1kX251bWJlcl90b19jaGFycyAodGhlX2J5dGVzLCByaS5yX2FkZHJlc3MsIHNpemVvZiAocmkucl9hZGRyZXNzKSk7Ci0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIHRoZV9ieXRlc1s0XSA9IChyaS5yX2luZGV4ID4+IDE2KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNV0gPSAocmkucl9pbmRleCA+PiA4KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNl0gPSByaS5yX2luZGV4ICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s3XSA9ICgocmkucl9leHRlcm4gPDwgNykgJiAweDgwKSB8ICgwICYgMHg2MCkgfCAocmkucl90eXBlICYgMHgxRik7Ci0gIC8qIEFsc28gZWFzeSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKCZ0aGVfYnl0ZXNbOF0sIHJpLnJfYWRkZW5kLCBzaXplb2YgKHJpLnJfYWRkZW5kKSk7Ci0gIC8qIG5vdyBwdXQgaXQgYmFjayB3aGVyZSB5b3UgZm91bmQgaXQsIEp1bmlvci4uLiAqLwotICBtZW1jcHkgKChjaGFyICopIHJpX3AsIHRoZV9ieXRlcywgc2l6ZW9mICgqcmlfcCkpOwotI2VuZGlmCi19Ci0KLS8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZm9yIGk4NjAgKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGFzX2ZhdGFsIChfKCJpODYwX2NvbnZlcnRfZnJhZ1xuIikpOwotfQotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBpODYwICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VndHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ3R5cGU7Ci17Ci0gIGFzX2ZhdGFsIChfKCJpODYwX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iKSk7Ci19Ci0KLS8qIGZvciBkZWJ1Z2dpbmcgb25seSwgbXVzdCBtYXRjaCBlbnVtIHJlbG9jX3R5cGUgKi8KLXN0YXRpYyBjaGFyICpSZWxvY1tdID0KLXsKLSAgIk5PX1JFTE9DIiwKLSAgIkJSQUREUiIsCi0gICJMT1cwIiwKLSAgIkxPVzEiLAotICAiTE9XMiIsCi0gICJMT1czIiwKLSAgIkxPVzQiLAotICAiU1BMSVQwIiwKLSAgIlNQTElUMSIsCi0gICJTUExJVDIiLAotICAiUkVMT0NfMzIiLAotfTsKLXN0YXRpYyBjaGFyICpIaWdobG93W10gPQotewotICAiTk9fU1BFQyIsCi0gICJQQUlSIiwKLSAgIkhJR0giLAotICAiSElHSEFESiIsCi19Owotc3RhdGljIHZvaWQKLXByaW50X2luc24gKGluc24pCi0gICAgIHN0cnVjdCBpODYwX2l0ICppbnNuOwotewotICBpZiAoaW5zbi0+ZXJyb3IpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1I6ICVzXG4iKTsKLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIm9wY29kZT0weCUwOHhcdCIsIGluc24tPm9wY29kZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImV4cGFuZD0weCUwOHhcdCIsIGluc24tPmV4cGFuZCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgInJlbG9jID0gJXNcdCIsIFJlbG9jW2luc24tPnJlbG9jXSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImhpZ2hsb3cgPSAlc1xuIiwgSGlnaGxvd1tpbnNuLT5oaWdobG93XSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImV4cCA9ICB7XG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfYWRkX3N5bWJvbCA9ICVzXG4iLAotCSAgIGluc24tPmV4cC5YX2FkZF9zeW1ib2wgPwotCSAgIChTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9hZGRfc3ltYm9sKSA/Ci0JICAgIFNfR0VUX05BTUUgKGluc24tPmV4cC5YX2FkZF9zeW1ib2wpIDogIj8/PyIpIDogIjAiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfb3Bfc3ltYm9sID0gJXNcbiIsCi0JICAgaW5zbi0+ZXhwLlhfb3Bfc3ltYm9sID8KLQkgICAoU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfb3Bfc3ltYm9sKSA/Ci0JICAgIFNfR0VUX05BTUUgKGluc24tPmV4cC5YX29wX3N5bWJvbCkgOiAiPz8/IikgOiAiMCIpOwotICBmcHJpbnRmIChzdGRlcnIsICJcdFx0WF9hZGRfbnVtYmVyID0gJWRcbiIsCi0JICAgaW5zbi0+ZXhwLlhfYWRkX251bWJlcik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIn1cbiIpOwotfQotDAotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLX0KLQwKLSNpZmRlZiBjb21tZW50Ci0vKgotICogSTg2MCByZWxvY2F0aW9ucyBhcmUgY29tcGxldGVseSBkaWZmZXJlbnQsIHNvIGl0IG5lZWRzCi0gKiB0aGlzIG1hY2hpbmUgZGVwZW5kZW50IHJvdXRpbmUgdG8gZW1pdCB0aGVtLgotICovCi12b2lkCi1lbWl0X21hY2hpbmVfcmVsb2MgKGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICByZWdpc3RlciBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgc3RydWN0IHJlbG9jX2luZm9faTg2MCByaTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgZXh0ZXJuIGNoYXIgKm5leHRfb2JqZWN0X2ZpbGVfY2hhclA7Ci0gIGxvbmcgYWRkX251bWJlcjsKLQotICBtZW1zZXQgKChjaGFyICopICZyaSwgJ1wwJywgc2l6ZW9mIChyaSkpOwotICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgewotCi0gICAgICBpZiAoZml4UC0+Znhfcl90eXBlICYgfjB4M2YpCi0JewotCSAgYXNfZmF0YWwgKCJmaXhQLT5meF9yX3R5cGUgPSAlZFxuIiwgZml4UC0+Znhfcl90eXBlKTsKLQl9Ci0gICAgICByaS5yX3BjcmVsID0gZml4UC0+ZnhfcGNyZWw7Ci0gICAgICByaS5yX3R5cGUgPSBmaXhQLT5meF9yX3R5cGU7Ci0KLSAgICAgIGlmICgoc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5KSAhPSBOVUxMKQotCXsKLQkgIHJpLnJfYWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKwotCSAgICBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotCSAgaWYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgcmkucl9leHRlcm4gPSAxOwotCSAgICAgIHJpLnJfc3ltYm9sbnVtID0gc3ltYm9sUC0+c3lfbnVtYmVyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByaS5yX2V4dGVybiA9IDA7Ci0JICAgICAgcmkucl9zeW1ib2xudW0gPSBTX0dFVF9UWVBFIChzeW1ib2xQKTsKLQkgICAgfQotCSAgaWYgKHN5bWJvbFAgJiYgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIHJpLnJfYWRkZW5kID0gc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfYWRkcmVzczsKLQkgICAgfQotCSAgcmkucl90eXBlID0gZml4UC0+Znhfcl90eXBlOwotCSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCSAgICB7Ci0JICAgICAgLyogcHJlc2VydmUgYWN0dWFsIG9mZnNldCB2cy4gcGMgKyA0ICovCi0JICAgICAgcmkucl9hZGRlbmQgLT0gKHJpLnJfYWRkcmVzcyArIDQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByaS5yX2FkZGVuZCA9IGZpeFAtPmZ4X2FkZG51bWJlcjsKLQkgICAgfQotCi0JICBtZF9yaV90b19jaGFycyAoKGNoYXIgKikgJnJpLCByaSk7Ci0JICBhcHBlbmQgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCAoY2hhciAqKSAmcmksIHNpemVvZiAocmkpKTsKLQl9Ci0gICAgfQotfQotCi0jZW5kaWYgLyogY29tbWVudCAqLwotCi0jaWZkZWYgT0JKX0FPVVQKLQotLyogb24gaTg2MDogZmlyc3QgNCBieXRlcyBhcmUgbm9ybWFsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgbmV4dCB0aHJlZQotICAgYnl0ZXMgYXJlIGluZGV4LCBtb3N0IHNpZy4gYnl0ZSBmaXJzdC4gIEJ5dGUgNyBpcyBicm9rZW4gdXAgd2l0aAotICAgYml0IDcgYXMgcGNyZWwsIGJpdCA2IGFzIGV4dGVybiwgYW5kIHRoZSBsb3dlciBzaXggYml0cyBhcwotICAgcmVsb2NhdGlvbiB0eXBlIChoaWdobG93IDUtNCkuICBOZXh0IDQgYnl0ZXMgYXJlIGxvbmcgYWRkZW5kLiAqLwotCi12b2lkCi10Y19hb3V0X2ZpeF90b19jaGFycyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgZml4UyAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIGxvbmcgcl9pbmRleDsKLSAgbG9uZyByX2V4dGVybjsKLSAgbG9uZyByX2FkZGVuZCA9IDA7Ci0gIGxvbmcgcl9hZGRyZXNzOwotCi0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5KTsKLSAga25vdyAoIShmaXhQLT5meF9yX3R5cGUgJiB+MHgzZikpOwotCi0gIGlmICghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgcl9leHRlcm4gPSAxOwotICAgICAgcl9pbmRleCA9IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICB9Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLQkJICAgICAgcl9hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUsCi0JCSAgICAgIDQpOwotCi0gIHdoZXJlWzRdID0gKHJfaW5kZXggPj4gMTYpICYgMHgwZmY7Ci0gIHdoZXJlWzVdID0gKHJfaW5kZXggPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNl0gPSByX2luZGV4ICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoZml4UC0+ZnhfcGNyZWwgPDwgNykgJiAweDgwKQotCSAgICAgIHwgKChyX2V4dGVybiA8PCA2KSAmIDB4NDApCi0JICAgICAgfCAoZml4UC0+Znhfcl90eXBlICYgMHgzRikpOwotCi0gIGlmIChzeW1ib2xfZ2V0X2ZyYWcgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICByX2FkZGVuZCA9IHN5bWJvbF9nZXRfZnJhZyAoZml4UC0+ZnhfYWRkc3kpLT5mcl9hZGRyZXNzOwotICAgIH0KLQotICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0gICAgewotICAgICAgLyogcHJlc2VydmUgYWN0dWFsIG9mZnNldCB2cy4gcGMgKyA0ICovCi0gICAgICByX2FkZGVuZCAtPSAocl9hZGRyZXNzICsgNCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcl9hZGRlbmQgPSBmaXhQLT5meF9hZGRudW1iZXI7Ci0gICAgfQotCi0gIG1kX251bWJlcl90b19jaGFycyAoJndoZXJlWzhdLCByX2FkZGVuZCwgNCk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQU9VVCAqLwotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLS8qIEFSR1NVU0VEICovCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICByZXR1cm4gc2l6ZTsJCQkvKiBCeXRlIGFsaWdubWVudCBpcyBmaW5lICovCi19Ci0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KLSAgIE9uIHRoZSBpODYwLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBvZmZzZXQsIHBsdXMKLSAgIGl0cyBzaXplLiAoPz8/IElzIHRoaXMgcmlnaHQ/ICBGSVhNRS1TT09OISkgKi8KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGNoYXIgKnBsYWNlID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotCi0gIC8qIGxvb2tzIHRvIG1lIGxpa2UgaTg2MCBuZXZlciBoYXMgYml0IGZpeGVzLiBMZXQncyBzZWUuIHhveG9yaWNoLiAqLwotICBrbm93IChmaXhQLT5meF9iaXRfZml4UCA9PSBOVUxMKTsKLSAgaWYgKCFmaXhQLT5meF9iaXRfZml4UCkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWw7Ci0gICAgICBtZF9udW1iZXJfdG9faW1tIChwbGFjZSwgdmFsLCBmaXhQLT5meF9zaXplLCBmaXhQKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fZmllbGQgKHBsYWNlLCB2YWwsIGZpeFAtPmZ4X2JpdF9maXhQKTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBjb21tZW50LWNvbHVtbjogMAotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0Yy1pODYwLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaTg2MC5oIGIvZ2FzL2NvbmZpZy90Yy1pODYwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjIxYzEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1pODYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiB0Yy1pODYwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRoZSBJODYwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX0k4NjAgMQotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGEpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRjLWk4NjAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pOTYwLmMgYi9nYXMvY29uZmlnL3RjLWk5NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjMTVjMC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWk5NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNDkgKzAsMCBAQAotLyogdGMtaTk2MC5jIC0gQWxsIHRoZSBpODA5NjAtc3BlY2lmaWMgc3R1ZmYKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogU2VlIGNvbW1lbnQgb24gbWRfcGFyc2Vfb3B0aW9uIGZvciA4MDk2MC1zcGVjaWZpYyBpbnZvY2F0aW9uIG9wdGlvbnMuICovCi0KLS8qIFRoZXJlIGFyZSA0IGRpZmZlcmVudCBsZW5ndGhzIG9mIChwb3RlbnRpYWxseSkgc3ltYm9sLWJhc2VkIGRpc3BsYWNlbWVudHMKLSAgIGluIHRoZSA4MDk2MCBpbnN0cnVjdGlvbiBzZXQsIGVhY2ggb2Ygd2hpY2ggY291bGQgcmVxdWlyZSBhZGRyZXNzIGZpeC11cHMKLSAgIGFuZCAoaW4gdGhlIGNhc2Ugb2YgZXh0ZXJuYWwgc3ltYm9scykgZW1pc3Npb24gb2YgcmVsb2NhdGlvbiBkaXJlY3RpdmVzOgotCi0gICAzMi1iaXQgKE1FTUIpCi0gICAgICAgIFRoaXMgaXMgYSBzdGFuZGFyZCBsZW5ndGggZm9yIHRoZSBiYXNlIGFzc2VtYmxlciBhbmQgcmVxdWlyZXMgbm8KLSAgICAgICAgc3BlY2lhbCBhY3Rpb24uCi0KLSAgIDEzLWJpdCAoQ09CUikKLSAgICAgICAgVGhpcyBpcyBhIG5vbi1zdGFuZGFyZCBsZW5ndGgsIGJ1dCB0aGUgYmFzZSBhc3NlbWJsZXIgaGFzIGEKLSAgICAgICAgaG9vayBmb3IgYml0IGZpZWxkIGFkZHJlc3MgZml4dXBzOiB0aGUgZml4UyBzdHJ1Y3R1cmUgY2FuCi0gICAgICAgIHBvaW50IHRvIGEgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQsIGluIHdoaWNoIGNhc2Ugb3VyCi0gICAgICAgIG1kX251bWJlcl90b19maWVsZCgpIHJvdXRpbmUgZ2V0cyBjYWxsZWQgdG8gcHJvY2VzcyBpdC4KLQotICAgICAgICBJIG1hZGUgdGhlIGhvb2sgYSBsaXR0bGUgY2xlYW5lciBieSBoYXZpbmcgZml4X25ldygpIChpbiB0aGUgYmFzZQotICAgICAgICBhc3NlbWJsZXIpIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpeFMgaW4gcXVlc3Rpb24uICBBbmQgSSBtYWRlIGl0IGEKLSAgICAgICAgbGl0dGxlIHNpbXBsZXIgYnkgc3RvcmluZyB0aGUgZmllbGQgc2l6ZSAoaW4gdGhpcyBjYXNlIDEzKSBpbnN0ZWFkIG9mCi0gICAgICAgIG9mIGEgcG9pbnRlciB0byBhbm90aGVyIHN0cnVjdHVyZTogIDgwOTYwIGRpc3BsYWNlbWVudHMgYXJlIEFMV0FZUwotICAgICAgICBzdG9yZWQgaW4gdGhlIGxvdy1vcmRlciBiaXRzIG9mIGEgNC1ieXRlIHdvcmQuCi0KLSAgICAgICAgU2luY2UgdGhlIHRhcmdldCBvZiBhIENPQlIgY2Fubm90IGJlIGV4dGVybmFsLCBubyByZWxvY2F0aW9uCi0gICAgICAgIGRpcmVjdGl2ZXMgZm9yIHRoaXMgc2l6ZSBkaXNwbGFjZW1lbnQgaGF2ZSB0byBiZSBnZW5lcmF0ZWQuCi0gICAgICAgIEJ1dCB0aGUgYmFzZSBhc3NlbWJsZXIgaGFkIHRvIGJlIG1vZGlmaWVkIHRvIGlzc3VlIGVycm9yCi0gICAgICAgIG1lc3NhZ2VzIGlmIHRoZSBzeW1ib2wgZGlkIHR1cm4gb3V0IHRvIGJlIGV4dGVybmFsLgotCi0gICAyNC1iaXQgKENUUkwpCi0gICAgICAgIEZpeHVwcyBhcmUgaGFuZGxlZCBhcyBmb3IgdGhlIDEzLWJpdCBjYXNlIChleGNlcHQgdGhhdCAyNCBpcyBzdG9yZWQKLSAgICAgICAgaW4gdGhlIGZpeFMpLgotCi0gICAgICAgIFRoZSByZWxvY2F0aW9uIGRpcmVjdGl2ZSBnZW5lcmF0ZWQgaXMgdGhlIHNhbWUgYXMgdGhhdCBmb3IgdGhlIDMyLWJpdAotICAgICAgICBkaXNwbGFjZW1lbnQsIGV4Y2VwdCB0aGF0IGl0J3MgUEMtcmVsYXRpdmUgKHRoZSAzMi1iaXQgZGlzcGxhY2VtZW50Ci0gICAgICAgIG5ldmVyIGlzKS4gICBUaGUgaTgwOTYwIHZlcnNpb24gb2YgdGhlIGxpbmtlciBuZWVkcyBhIG1vZCB0bwotICAgICAgICBkaXN0aW5ndWlzaCBhbmQgaGFuZGxlIHRoZSAyNC1iaXQgY2FzZS4KLQotICAgMTItYml0IChNRU1BKQotICAgICAgICBNRU1BIGZvcm1hdHMgYXJlIGFsd2F5cyBwcm9tb3RlZCB0byBNRU1CICgzMi1iaXQpIGlmIHRoZSBkaXNwbGFjZW1lbnQKLSAgICAgICAgaXMgYmFzZWQgb24gYSBzeW1ib2wsIGJlY2F1c2UgaXQgY291bGQgYmUgcmVsb2NhdGVkIGF0IGxpbmsgdGltZS4KLSAgICAgICAgVGhlIG9ubHkgdGltZSB3ZSB1c2UgdGhlIDEyLWJpdCBmb3JtYXQgaXMgaWYgYW4gYWJzb2x1dGUgdmFsdWUgb2YKLSAgICAgICAgbGVzcyB0aGFuIDQwOTYgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgbmVpdGhlciBhIGZpeHVwIG5vcgotICAgICAgICBhIHJlbG9jYXRpb24gZGlyZWN0aXZlLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvaTk2MC5oIgotCi0jaWYgZGVmaW5lZCAoT0JKX0FPVVQpIHx8IGRlZmluZWQgKE9CSl9CT1VUKQotCi0jZGVmaW5lIFRDX1NfSVNfU1lTUFJPQyhzKQkoKDE8PVNfR0VUX09USEVSKHMpKSAmJiAoU19HRVRfT1RIRVIocyk8PTMyKSkKLSNkZWZpbmUgVENfU19JU19CQUxOQU1FKHMpCShTX0dFVF9PVEhFUihzKSA9PSBOX0JBTE5BTUUpCi0jZGVmaW5lIFRDX1NfSVNfQ0FMTE5BTUUocykJKFNfR0VUX09USEVSKHMpID09IE5fQ0FMTE5BTUUpCi0jZGVmaW5lIFRDX1NfSVNfQkFEUFJPQyhzKQkoKFNfR0VUX09USEVSKHMpICE9IDApICYmICFUQ19TX0lTX0NBTExOQU1FKHMpICYmICFUQ19TX0lTX0JBTE5BTUUocykgJiYgIVRDX1NfSVNfU1lTUFJPQyhzKSkKLQotI2RlZmluZSBUQ19TX1NFVF9TWVNQUk9DKHMsIHApCShTX1NFVF9PVEhFUigocyksIChwKSsxKSkKLSNkZWZpbmUgVENfU19HRVRfU1lTUFJPQyhzKQkoU19HRVRfT1RIRVIocyktMSkKLQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUocykJKFNfU0VUX09USEVSKChzKSwgTl9CQUxOQU1FKSkKLSNkZWZpbmUgVENfU19GT1JDRV9UT19DQUxMTkFNRShzKQkoU19TRVRfT1RIRVIoKHMpLCBOX0NBTExOQU1FKSkKLSNkZWZpbmUgVENfU19GT1JDRV9UT19TWVNQUk9DKHMpCXs7fQotCi0jZWxzZSAvKiAhIE9CSl9BL0JPVVQgKi8KLSNpZmRlZiBPQkpfQ09GRgotCi0jZGVmaW5lIFRDX1NfSVNfU1lTUFJPQyhzKQkoU19HRVRfU1RPUkFHRV9DTEFTUyhzKSA9PSBDX1NDQUxMKQotI2RlZmluZSBUQ19TX0lTX0JBTE5BTUUocykJKFNGX0dFVF9CQUxOQU1FKHMpKQotI2RlZmluZSBUQ19TX0lTX0NBTExOQU1FKHMpCShTRl9HRVRfQ0FMTE5BTUUocykpCi0jZGVmaW5lIFRDX1NfSVNfQkFEUFJPQyhzKQkoVENfU19JU19TWVNQUk9DKHMpICYmIFRDX1NfR0VUX1NZU1BST0MocykgPCAwICYmIDMxIDwgVENfU19HRVRfU1lTUFJPQyhzKSkKLQotI2RlZmluZSBUQ19TX1NFVF9TWVNQUk9DKHMsIHApCSgocyktPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzFdLnhfc2MueF9zdGluZHggPSAocCkpCi0jZGVmaW5lIFRDX1NfR0VUX1NZU1BST0MocykJKChzKS0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMV0ueF9zYy54X3N0aW5keCkKLQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUocykJKFNGX1NFVF9CQUxOQU1FKHMpKQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0NBTExOQU1FKHMpCShTRl9TRVRfQ0FMTE5BTUUocykpCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fU1lTUFJPQyhzKQkoU19TRVRfU1RPUkFHRV9DTEFTUygocyksIENfU0NBTEwpKQotCi0jZWxzZSAvKiAhIE9CSl9DT0ZGICovCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQ19TX0lTX1NZU1BST0MocykJMAotCi0jZGVmaW5lIFRDX1NfSVNfQkFMTkFNRShzKQkwCi0jZGVmaW5lIFRDX1NfSVNfQ0FMTE5BTUUocykJMAotI2RlZmluZSBUQ19TX0lTX0JBRFBST0MocykJMAotCi0jZGVmaW5lIFRDX1NfU0VUX1NZU1BST0MocywgcCkKLSNkZWZpbmUgVENfU19HRVRfU1lTUFJPQyhzKSAwCi0KLSNkZWZpbmUgVENfU19GT1JDRV9UT19CQUxOQU1FKHMpCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fQ0FMTE5BTUUocykKLSNkZWZpbmUgVENfU19GT1JDRV9UT19TWVNQUk9DKHMpCi0jZWxzZQotICNlcnJvciBDT0ZGLCBhLm91dCwgYi5vdXQsIGFuZCBFTEYgYXJlIHRoZSBvbmx5IHN1cHBvcnRlZCBmb3JtYXRzLgotI2VuZGlmIC8qICEgT0JKX0VMRiAqLwotI2VuZGlmIC8qICEgT0JKX0NPRkYgKi8KLSNlbmRpZiAvKiAhIE9CSl9BL0JPVVQgKi8KLQotZXh0ZXJuIGNoYXIgKmlucHV0X2xpbmVfcG9pbnRlcjsKLQotI2lmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiAhZGVmaW5lZCAoQkZEKQotI2lmZGVmIE9CSl9DT0ZGCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IHNpemVvZiAoc3RydWN0IHJlbG9jKTsKLSNlbHNlIC8qIE9CSl9DT0ZGICovCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbyk7Ci0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLSNlbmRpZgotCi0vKiBMb2NhbCBpODA5NjAgcm91dGluZXMuICAqLwotCi1zdGF0aWMgdm9pZCBicmNudF9lbWl0ICgpOwkvKiBFbWl0IGJyYW5jaC1wcmVkaWN0aW9uIGluc3RydW1lbnRhdGlvbiBjb2RlICovCi1zdGF0aWMgY2hhciAqYnJsYWJfbmV4dCAoKTsJLyogUmV0dXJuIG5leHQgYnJhbmNoIGxvY2FsIGxhYmVsICovCi12b2lkIGJydGFiX2VtaXQgKCk7CQkvKiBFbWl0IGJyLXByZWRpY3QgaW5zdHJ1bWVudGF0aW9uIHRhYmxlICovCi1zdGF0aWMgdm9pZCBjb2JyX2ZtdCAoKTsJLyogR2VuZXJhdGUgQ09CUiBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHZvaWQgY3RybF9mbXQgKCk7CS8qIEdlbmVyYXRlIENUUkwgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyBjaGFyICplbWl0ICgpOwkJLyogRW1pdCAoaW50ZXJuYWxseSkgYmluYXJ5ICovCi1zdGF0aWMgaW50IGdldF9hcmdzICgpOwkJLyogQnJlYWsgYXJndW1lbnRzIG91dCBvZiBjb21tYS1zZXBhcmF0ZWQgbGlzdCAqLwotc3RhdGljIHZvaWQgZ2V0X2NkaXNwICgpOwkvKiBIYW5kbGUgQ09CUiBvciBDVFJMIGRpc3BsYWNlbWVudCAqLwotc3RhdGljIGNoYXIgKmdldF9pc3BlYyAoKTsJLyogRmluZCBpbmRleCBzcGVjaWZpY2F0aW9uIHN0cmluZyAqLwotc3RhdGljIGludCBnZXRfcmVnbnVtICgpOwkvKiBUcmFuc2xhdGUgdGV4dCB0byByZWdpc3RlciBudW1iZXIgKi8KLXN0YXRpYyBpbnQgaV9zY2FuICgpOwkJLyogTGV4aWNhbCBzY2FuIG9mIGluc3RydWN0aW9uIHNvdXJjZSAqLwotc3RhdGljIHZvaWQgbWVtX2ZtdCAoKTsJCS8qIEdlbmVyYXRlIE1FTUEgb3IgTUVNQiBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHZvaWQgbWVtYV90b19tZW1iICgpOwkvKiBDb252ZXJ0IE1FTUEgaW5zdHJ1Y3Rpb24gdG8gTUVNQiBmb3JtYXQgKi8KLXN0YXRpYyB2b2lkIHBhcnNlX2V4cHIgKCk7CS8qIFBhcnNlIGFuIGV4cHJlc3Npb24gKi8KLXN0YXRpYyBpbnQgcGFyc2VfbGRjb25zdCAoKTsJLyogUGFyc2UgYW5kIHJlcGxhY2UgYSAnbGRjb25zdCcgcHNldWRvLW9wICovCi1zdGF0aWMgdm9pZCBwYXJzZV9tZW1vcCAoKTsJLyogUGFyc2UgYSBtZW1vcnkgb3BlcmFuZCAqLwotc3RhdGljIHZvaWQgcGFyc2VfcG8gKCk7CS8qIFBhcnNlIG1hY2hpbmUtZGVwZW5kZW50IHBzZXVkby1vcCAqLwotc3RhdGljIHZvaWQgcGFyc2VfcmVnb3AgKCk7CS8qIFBhcnNlIGEgcmVnaXN0ZXIgb3BlcmFuZCAqLwotc3RhdGljIHZvaWQgcmVnX2ZtdCAoKTsJCS8qIEdlbmVyYXRlIGEgUkVHIGZvcm1hdCBpbnN0cnVjdGlvbiAqLwotdm9pZCByZWxvY19jYWxsaiAoKTsJCS8qIFJlbG9jYXRlIGEgJ2NhbGxqJyBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHZvaWQgcmVsYXhfY29iciAoKTsJLyogIkRlLW9wdGltaXplIiBjb2JyIGludG8gY29tcGFyZS9icmFuY2ggKi8KLXN0YXRpYyB2b2lkIHNfbGVhZnByb2MgKCk7CS8qIFByb2Nlc3MgJy5sZWFmcHJvYycgcHNldWRvLW9wICovCi1zdGF0aWMgdm9pZCBzX3N5c3Byb2MgKCk7CS8qIFByb2Nlc3MgJy5zeXNwcm9jJyBwc2V1ZG8tb3AgKi8KLXN0YXRpYyBpbnQgc2hpZnRfb2sgKCk7CQkvKiBXaWxsIGEgJ3NobG8nIHN1YnN0aXR1cmUgZm9yIGEgJ2xkY29uc3QnPyAqLwotc3RhdGljIHZvaWQgc3ludGF4ICgpOwkJLyogR2l2ZSBzeW50YXggZXJyb3IgKi8KLXN0YXRpYyBpbnQgdGFyZ19oYXNfc2ZyICgpOwkvKiBUYXJnZXQgY2hpcCBzdXBwb3J0cyBzcGVjLWZ1bmMgcmVnaXN0ZXI/ICovCi1zdGF0aWMgaW50IHRhcmdfaGFzX2ljbGFzcyAoKTsJLyogVGFyZ2V0IGNoaXAgc3VwcG9ydHMgaW5zdHJ1Y3Rpb24gc2V0PyAqLwotCi0vKiBTZWUgbWRfcGFyc2Vfb3B0aW9uKCkgZm9yIG1lYW5pbmdzIG9mIHRoZXNlIG9wdGlvbnMgKi8KLXN0YXRpYyBjaGFyIG5vcmVsYXg7CQkvKiBUcnVlIGlmIC1ub3JlbGF4IHN3aXRjaCBzZWVuICovCi1zdGF0aWMgY2hhciBpbnN0cnVtZW50X2JyYW5jaGVzOwkvKiBUcnVlIGlmIC1iIHN3aXRjaCBzZWVuICovCi0KLS8qIENoYXJhY3RlcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LgotICAgSWYgdGhlIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bC4KLSAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dC4KLQotICAgTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4KLSAqLwotCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBzdGFydGVkIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yay4gKi8KLQotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbMV07Ci0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbMV07Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsCi0gICBhcyBpbiAwZjEyLjQ1NiBvciAwZDEuMjM0NWUxMgotICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImZGZER0VCI7Ci0KLQotLyogVGFibGUgdXNlZCBieSBiYXNlIGFzc2VtYmxlciB0byByZWxheCBhZGRyZXNzZXMgYmFzZWQgb24gdmFyeWluZyBsZW5ndGgKLSAgIGluc3RydWN0aW9ucy4gIFRoZSBmaWVsZHMgYXJlOgotICAgICAxKSBtb3N0IHBvc2l0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAgIDIpIG1vc3QgbmVnYXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKLSAgICAgMykgaG93IG1hbnkgYnl0ZXMgdGhpcyBtb2RlIHdpbGwgYWRkIHRvIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGZyYWcKLSAgICAgNCkgd2hpY2ggaW5kZXggaW50byB0aGUgdGFibGUgdG8gdHJ5IGlmIHdlIGNhbid0IGZpdCBpbnRvIHRoaXMgb25lLgotCi0gICBGb3IgaTgwOTYwLCB0aGUgb25seSBhcHBsaWNhdGlvbiBpcyB0aGUgKGRlLSlvcHRpbWl6YXRpb24gb2YgY29icgotICAgaW5zdHJ1Y3Rpb25zIGludG8gc2VwYXJhdGUgY29tcGFyZSBhbmQgYnJhbmNoIGluc3RydWN0aW9ucyB3aGVuIGEgMTMtYml0Ci0gICBkaXNwbGFjZW1lbnQgd29uJ3QgaGFjayBpdC4KLSAqLwotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIHswLCAwLCAwLCAwfSwJCQkvKiBTdGF0ZSAwID0+IG5vIG1vcmUgcmVsYXhhdGlvbiBwb3NzaWJsZSAqLwotICB7NDA4OCwgLTQwOTYsIDAsIDJ9LAkJLyogU3RhdGUgMTogY29uZGl0aW9uYWwgYnJhbmNoIChjb2JyKSAqLwotICB7MHg4MDAwMDAgLSA4LCAtMHg4MDAwMDAsIDQsIDB9LAkvKiBTdGF0ZSAyOiBjb21wYXJlIChyZWcpICYgYnJhbmNoIChjdHJsKSAqLwotfTsKLQotc3RhdGljIHZvaWQgc19lbmRpYW4gUEFSQU1TICgoaW50KSk7Ci0KLS8qIFRoZXNlIGFyZSB0aGUgbWFjaGluZSBkZXBlbmRlbnQgcHNldWRvLW9wcy4KLQotICAgVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgICAgICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgICAgICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICAgICAgIGludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gKi8KLSNkZWZpbmUgU19MRUFGUFJPQwkxCi0jZGVmaW5lIFNfU1lTUFJPQwkyCi0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiYnNzIiwgc19sY29tbSwgMX0sCi0gIHsiZW5kaWFuIiwgc19lbmRpYW4sIDB9LAotICB7ImV4dGVuZGVkIiwgZmxvYXRfY29ucywgJ3QnfSwKLSAgeyJsZWFmcHJvYyIsIHBhcnNlX3BvLCBTX0xFQUZQUk9DfSwKLSAgeyJzeXNwcm9jIiwgcGFyc2VfcG8sIFNfU1lTUFJPQ30sCi0KLSAgeyJ3b3JkIiwgY29ucywgNH0sCi0gIHsicXVhZCIsIGNvbnMsIDE2fSwKLQotICB7MCwgMCwgMH0KLX07Ci0MCi0vKiBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvIGZyb20gYW4gJ2V4cHJlc3Npb25TJyBzdHJ1Y3R1cmUgJ2UnICovCi0jZGVmaW5lIGFkZHMoZSkJZS5YX2FkZF9zeW1ib2wKLSNkZWZpbmUgb2ZmcyhlKQllLlhfYWRkX251bWJlcgotCi0KLS8qIEJyYW5jaC1wcmVkaWN0aW9uIGJpdHMgZm9yIENUUkwvQ09CUiBmb3JtYXQgb3Bjb2RlcyAqLwotI2RlZmluZSBCUF9NQVNLCQkweDAwMDAwMDAyCS8qIE1hc2sgZm9yIGJyYW5jaC1wcmVkaWN0aW9uIGJpdCAqLwotI2RlZmluZSBCUF9UQUtFTgkweDAwMDAwMDAwCS8qIFZhbHVlIHRvIE9SIGluIHRvIHByZWRpY3QgYnJhbmNoICovCi0jZGVmaW5lIEJQX05PVF9UQUtFTgkweDAwMDAwMDAyCS8qIFZhbHVlIHRvIE9SIGluIHRvIHByZWRpY3Qgbm8gYnJhbmNoICovCi0KLQotLyogU29tZSBpbnN0cnVjdGlvbiBvcGNvZGVzIHRoYXQgd2UgbmVlZCBleHBsaWNpdGx5ICovCi0jZGVmaW5lIEJFCTB4MTIwMDAwMDAKLSNkZWZpbmUgQkcJMHgxMTAwMDAwMAotI2RlZmluZSBCR0UJMHgxMzAwMDAwMAotI2RlZmluZSBCTAkweDE0MDAwMDAwCi0jZGVmaW5lIEJMRQkweDE2MDAwMDAwCi0jZGVmaW5lIEJORQkweDE1MDAwMDAwCi0jZGVmaW5lIEJOTwkweDEwMDAwMDAwCi0jZGVmaW5lIEJPCTB4MTcwMDAwMDAKLSNkZWZpbmUgQ0hLQklUCTB4NWEwMDI3MDAKLSNkZWZpbmUgQ01QSQkweDVhMDAyMDgwCi0jZGVmaW5lIENNUE8JMHg1YTAwMjAwMAotCi0jZGVmaW5lIEIJMHgwODAwMDAwMAotI2RlZmluZSBCQUwJMHgwYjAwMDAwMAotI2RlZmluZSBDQUxMCTB4MDkwMDAwMDAKLSNkZWZpbmUgQ0FMTFMJMHg2NjAwMzgwMAotI2RlZmluZSBSRVQJMHgwYTAwMDAwMAotCi0KLS8qIFRoZXNlIG1hc2tzIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIGEgc2V0IG9mIE1FTUIgbW9kZSBiaXRzLiAqLwotI2RlZmluZQlBX0JJVAkJMHgwNDAwCi0jZGVmaW5lCUlfQklUCQkweDA4MDAKLSNkZWZpbmUgTUVNQl9CSVQJMHgxMDAwCi0jZGVmaW5lCURfQklUCQkweDIwMDAKLQotCi0vKiBNYXNrIGZvciB0aGUgb25seSBtb2RlIGJpdCBpbiBhIE1FTUEgaW5zdHJ1Y3Rpb24gKGlmIHNldCwgYWJhc2UgcmVnIGlzCi0gICB1c2VkKS4gICovCi0jZGVmaW5lIE1FTUFfQUJBU0UJMHgyMDAwCi0KLS8qIEluZm8gZnJvbSB3aGljaCBhIE1FTUEgb3IgTUVNQiBmb3JtYXQgaW5zdHJ1Y3Rpb24gY2FuIGJlIGdlbmVyYXRlZCAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIC8qIChGaXJzdCkgMzIgYml0cyBvZiBpbnN0cnVjdGlvbiAqLwotICAgIGxvbmcgb3Bjb2RlOwotICAgIC8qIDAtKG5vbmUpLCAxMi0gb3IsIDMyLWJpdCBkaXNwbGFjZW1lbnQgbmVlZGVkICovCi0gICAgaW50IGRpc3A7Ci0gICAgLyogVGhlIGV4cHJlc3Npb24gaW4gdGhlIHNvdXJjZSBpbnN0cnVjdGlvbiBmcm9tIHdoaWNoIHRoZQotICAgICAgIGRpc3BsYWNlbWVudCBzaG91bGQgYmUgZGV0ZXJtaW5lZC4gICovCi0gICAgY2hhciAqZTsKLSAgfQotCi1tZW1TOwotCi0KLS8qIFRoZSB0d28gcGllY2VzIG9mIGluZm8gd2UgbmVlZCB0byBnZW5lcmF0ZSBhIHJlZ2lzdGVyIG9wZXJhbmQgKi8KLXN0cnVjdCByZWdvcAotICB7Ci0gICAgaW50IG1vZGU7CQkJLyogMCA9PmxvY2FsL2dsb2JhbC9zcGVjIHJlZzsgMT0+IGxpdGVyYWwgb3IgZnAgcmVnICovCi0gICAgaW50IHNwZWNpYWw7CQkvKiAwID0+bm90IGEgc2ZyOyAgMT0+IGlzIGEgc2ZyIChub3QgdmFsaWQgdy9tb2RlPTApICovCi0gICAgaW50IG47CQkJLyogUmVnaXN0ZXIgbnVtYmVyIG9yIGxpdGVyYWwgdmFsdWUgKi8KLSAgfTsKLQotCi0vKiBOdW1iZXIgYW5kIGFzc2VtYmxlciBtbmVtb25pYyBmb3IgYWxsIHJlZ2lzdGVycyB0aGF0IGNhbiBhcHBlYXIgaW4KLSAgIG9wZXJhbmRzLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QKLSAgewotICAgIGNoYXIgKnJlZ19uYW1lOwotICAgIGludCByZWdfbnVtOwotICB9Ci1yZWduYW1lc1tdID0KLXsKLSAgeyAicGZwIiwgMCB9LAotICB7ICJzcCIsIDEgfSwKLSAgeyAicmlwIiwgMiB9LAotICB7ICJyMyIsIDMgfSwKLSAgeyAicjQiLCA0IH0sCi0gIHsgInI1IiwgNSB9LAotICB7ICJyNiIsIDYgfSwKLSAgeyAicjciLCA3IH0sCi0gIHsgInI4IiwgOCB9LAotICB7ICJyOSIsIDkgfSwKLSAgeyAicjEwIiwgMTAgfSwKLSAgeyAicjExIiwgMTEgfSwKLSAgeyAicjEyIiwgMTIgfSwKLSAgeyAicjEzIiwgMTMgfSwKLSAgeyAicjE0IiwgMTQgfSwKLSAgeyAicjE1IiwgMTUgfSwKLSAgeyAiZzAiLCAxNiB9LAotICB7ICJnMSIsIDE3IH0sCi0gIHsgImcyIiwgMTggfSwKLSAgeyAiZzMiLCAxOSB9LAotICB7ICJnNCIsIDIwIH0sCi0gIHsgImc1IiwgMjEgfSwKLSAgeyAiZzYiLCAyMiB9LAotICB7ICJnNyIsIDIzIH0sCi0gIHsgImc4IiwgMjQgfSwKLSAgeyAiZzkiLCAyNSB9LAotICB7ICJnMTAiLCAyNiB9LAotICB7ICJnMTEiLCAyNyB9LAotICB7ICJnMTIiLCAyOCB9LAotICB7ICJnMTMiLCAyOSB9LAotICB7ICJnMTQiLCAzMCB9LAotICB7ICJmcCIsIDMxIH0sCi0KLSAgLyogTnVtYmVycyBmb3Igc3BlY2lhbC1mdW5jdGlvbiByZWdpc3RlcnMgYXJlIGZvciBhc3NlbWJsZXIgaW50ZXJuYWwKLSAgICAgdXNlIG9ubHk6IHRoZXkgYXJlIHNjYWxlZCBiYWNrIHRvIHJhbmdlIFswLTMxXSBmb3IgYmluYXJ5IG91dHB1dC4gICovCi0jZGVmaW5lIFNGMAkzMgotCi0gIHsgInNmMCIsIDMyIH0sCi0gIHsgInNmMSIsIDMzIH0sCi0gIHsgInNmMiIsIDM0IH0sCi0gIHsgInNmMyIsIDM1IH0sCi0gIHsgInNmNCIsIDM2IH0sCi0gIHsgInNmNSIsIDM3IH0sCi0gIHsgInNmNiIsIDM4IH0sCi0gIHsgInNmNyIsIDM5IH0sCi0gIHsgInNmOCIsIDQwIH0sCi0gIHsgInNmOSIsIDQxIH0sCi0gIHsgInNmMTAiLCA0MiB9LAotICB7ICJzZjExIiwgNDMgfSwKLSAgeyAic2YxMiIsIDQ0IH0sCi0gIHsgInNmMTMiLCA0NSB9LAotICB7ICJzZjE0IiwgNDYgfSwKLSAgeyAic2YxNSIsIDQ3IH0sCi0gIHsgInNmMTYiLCA0OCB9LAotICB7ICJzZjE3IiwgNDkgfSwKLSAgeyAic2YxOCIsIDUwIH0sCi0gIHsgInNmMTkiLCA1MSB9LAotICB7ICJzZjIwIiwgNTIgfSwKLSAgeyAic2YyMSIsIDUzIH0sCi0gIHsgInNmMjIiLCA1NCB9LAotICB7ICJzZjIzIiwgNTUgfSwKLSAgeyAic2YyNCIsIDU2IH0sCi0gIHsgInNmMjUiLCA1NyB9LAotICB7ICJzZjI2IiwgNTggfSwKLSAgeyAic2YyNyIsIDU5IH0sCi0gIHsgInNmMjgiLCA2MCB9LAotICB7ICJzZjI5IiwgNjEgfSwKLSAgeyAic2YzMCIsIDYyIH0sCi0gIHsgInNmMzEiLCA2MyB9LAotCi0gIC8qIE51bWJlcnMgZm9yIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBhcmUgZm9yIGFzc2VtYmxlciBpbnRlcm5hbAotICAgICB1c2Ugb25seTogdGhleSBhcmUgc2NhbGVkIGJhY2sgdG8gWzAtM10gZm9yIGJpbmFyeSBvdXRwdXQuICAqLwotI2RlZmluZSBGUDAJNjQKLQotICB7ICJmcDAiLCA2NCB9LAotICB7ICJmcDEiLCA2NSB9LAotICB7ICJmcDIiLCA2NiB9LAotICB7ICJmcDMiLCA2NyB9LAotCi0gIHsgTlVMTCwgMCB9LAkJCQkvKiBFTkQgT0YgTElTVCAqLwotfTsKLQotI2RlZmluZQlJU19SR19SRUcobikJKCgwIDw9IChuKSkgJiYgKChuKSA8IFNGMCkpCi0jZGVmaW5lCUlTX1NGX1JFRyhuKQkoKFNGMCA8PSAobikpICYmICgobikgPCBGUDApKQotI2RlZmluZQlJU19GUF9SRUcobikJKChuKSA+PSBGUDApCi0KLS8qIE51bWJlciBhbmQgYXNzZW1ibGVyIG1uZW1vbmljIGZvciBhbGwgcmVnaXN0ZXJzIHRoYXQgY2FuIGFwcGVhciBhcwotICAgJ2FiYXNlJyAoaW5kaXJlY3QgYWRkcmVzc2luZykgcmVnaXN0ZXJzLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QKLSAgewotICAgIGNoYXIgKmFyZWdfbmFtZTsKLSAgICBpbnQgYXJlZ19udW07Ci0gIH0KLWFyZWdzW10gPQotewotICB7ICIocGZwKSIsIDAgfSwKLSAgeyAiKHNwKSIsIDEgfSwKLSAgeyAiKHJpcCkiLCAyIH0sCi0gIHsgIihyMykiLCAzIH0sCi0gIHsgIihyNCkiLCA0IH0sCi0gIHsgIihyNSkiLCA1IH0sCi0gIHsgIihyNikiLCA2IH0sCi0gIHsgIihyNykiLCA3IH0sCi0gIHsgIihyOCkiLCA4IH0sCi0gIHsgIihyOSkiLCA5IH0sCi0gIHsgIihyMTApIiwgMTAgfSwKLSAgeyAiKHIxMSkiLCAxMSB9LAotICB7ICIocjEyKSIsIDEyIH0sCi0gIHsgIihyMTMpIiwgMTMgfSwKLSAgeyAiKHIxNCkiLCAxNCB9LAotICB7ICIocjE1KSIsIDE1IH0sCi0gIHsgIihnMCkiLCAxNiB9LAotICB7ICIoZzEpIiwgMTcgfSwKLSAgeyAiKGcyKSIsIDE4IH0sCi0gIHsgIihnMykiLCAxOSB9LAotICB7ICIoZzQpIiwgMjAgfSwKLSAgeyAiKGc1KSIsIDIxIH0sCi0gIHsgIihnNikiLCAyMiB9LAotICB7ICIoZzcpIiwgMjMgfSwKLSAgeyAiKGc4KSIsIDI0IH0sCi0gIHsgIihnOSkiLCAyNSB9LAotICB7ICIoZzEwKSIsIDI2IH0sCi0gIHsgIihnMTEpIiwgMjcgfSwKLSAgeyAiKGcxMikiLCAyOCB9LAotICB7ICIoZzEzKSIsIDI5IH0sCi0gIHsgIihnMTQpIiwgMzAgfSwKLSAgeyAiKGZwKSIsIDMxIH0sCi0KLSNkZWZpbmUgSVBSRUwJMzIKLSAgLyogRm9yIGFzc2VtYmxlciBpbnRlcm5hbCB1c2Ugb25seTogdGhpcyBudW1iZXIgbmV2ZXIgYXBwZWFycyBpbiBiaW5hcnkKLSAgICAgb3V0cHV0LiAgKi8KLSAgeyAiKGlwKSIsIElQUkVMIH0sCi0KLSAgeyBOVUxMLCAwIH0sCQkJCS8qIEVORCBPRiBMSVNUICovCi19OwotCi0KLS8qIEhhc2ggdGFibGVzICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnJlZ19oYXNoOwkvKiBSZWdpc3RlciBuYW1lIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICphcmVnX2hhc2g7CS8qIEFiYXNlIHJlZ2lzdGVyIGhhc2ggdGFibGUgKi8KLQotCi0vKiBBcmNoaXRlY3R1cmUgZm9yIHdoaWNoIHdlIGFyZSBhc3NlbWJsaW5nICovCi0jZGVmaW5lIEFSQ0hfQU5ZCTAJLyogRGVmYXVsdDogbm8gYXJjaGl0ZWN0dXJlIGNoZWNraW5nIGRvbmUgKi8KLSNkZWZpbmUgQVJDSF9LQQkJMQotI2RlZmluZSBBUkNIX0tCCQkyCi0jZGVmaW5lIEFSQ0hfTUMJCTMKLSNkZWZpbmUgQVJDSF9DQQkJNAotI2RlZmluZSBBUkNIX0pYCQk1Ci0jZGVmaW5lIEFSQ0hfSFgJCTYKLWludCBhcmNoaXRlY3R1cmUgPSBBUkNIX0FOWTsJLyogQXJjaGl0ZWN0dXJlIHJlcXVlc3RlZCBvbiBpbnZvY2F0aW9uIGxpbmUgKi8KLWludCBpY2xhc3Nlc19zZWVuOwkJLyogT1Igb2YgaW5zdHJ1Y3Rpb24gY2xhc3NlcyAoSV8qIGNvbnN0YW50cykKLQkJCQkgKiAgICBmb3Igd2hpY2ggd2UndmUgYWN0dWFsbHkgYXNzZW1ibGVkCi0JCQkJICogICAgICBpbnN0cnVjdGlvbnMuCi0JCQkJICovCi0KLQotLyogQlJBTkNILVBSRURJQ1RJT04gSU5TVFJVTUVOVEFUSU9OCi0KLSAgICAgICAgVGhlIGZvbGxvd2luZyBzdXBwb3J0cyBnZW5lcmF0aW9uIG9mIGJyYW5jaC1wcmVkaWN0aW9uIGluc3RydW1lbnRhdGlvbgotICAgICAgICAodHVybmVkIG9uIGJ5IC1iIHN3aXRjaCkuICBUaGUgaW5zdHJ1bWVudGF0aW9uIGNvbGxlY3RzIGNvdW50cwotICAgICAgICBvZiBicmFuY2hlcyB0YWtlbi9ub3QtdGFrZW4gZm9yIGxhdGVyIGlucHV0IHRvIGEgdXRpbGl0eSB0aGF0IHdpbGwKLSAgICAgICAgc2V0IHRoZSBicmFuY2ggcHJlZGljdGlvbiBiaXRzIG9mIHRoZSBpbnN0cnVjdGlvbnMgaW4gYWNjb3JkYW5jZSB3aXRoCi0gICAgICAgIHRoZSBiZWhhdmlvciBvYnNlcnZlZC4gIChOb3RlIHRoYXQgdGhlIEtYIHNlcmllcyBkb2VzIG5vdCBoYXZlCi0gICAgICAgIGJyYWNoLXByZWRpY3Rpb24uKQotCi0gICAgICAgIFRoZSBpbnN0cnVtZW50YXRpb24gY29uc2lzdHMgb2Y6Ci0KLSAgICAgICAgKDEpIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBjb25kaXRpb25hbCBicmFuY2gsIGEgY2FsbCB0byBhbiBleHRlcm5hbAotICAgICAgICAgICAgcm91dGluZSB0aGF0IGluY3JlbWVudHMgYW5kIHN0ZXBzIG92ZXIgYW4gaW5saW5lIGNvdW50ZXIuICBUaGUKLSAgICAgICAgICAgIGNvdW50ZXIgaXRzZWxmLCBpbml0aWFsaXplZCB0byAwLCBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBjYWxsCi0gICAgICAgICAgICBpbnN0cnVjdGlvbi4gIEZvciBlYWNoIGJyYW5jaCwgdGhlIGNvdW50ZXIgZm9sbG93aW5nIHRoZSBicmFuY2gKLSAgICAgICAgICAgIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGJyYW5jaCB3YXMgbm90IHRha2VuLCBhbmQgdGhlIGRpZmZlcmVuY2UKLSAgICAgICAgICAgIGJldHdlZW4gdGhlIGNvdW50ZXJzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgaXQgd2FzIHRha2VuLiAgQW4KLSAgICAgICAgICAgIGV4YW1wbGUgb2YgYW4gaW5zdHJ1bWVudGVkIGNvbmRpdGlvbmFsIGJyYW5jaDoKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsICAgIEJSX0NOVF9GVU5DCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53b3JkICAgMAotICAgICAgICAgICAgICAgIExCUkFOQ0gyMzogICAgICBiZSAgICAgIGxhYmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgICAgQlJfQ05UX0ZVTkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndvcmQgICAwCi0KLSAgICAgICAgKDIpIGEgdGFibGUgb2YgcG9pbnRlcnMgdG8gdGhlIGluc3RydW1lbnRlZCBicmFuY2hlcywgc28gdGhhdCBhbgotICAgICAgICAgICAgZXh0ZXJuYWwgcG9zdHByb2Nlc3Npbmcgcm91dGluZSBjYW4gbG9jYXRlIGFsbCBvZiB0aGUgY291bnRlcnMuCi0gICAgICAgICAgICB0aGUgdGFibGUgYmVnaW5zIHdpdGggYSAyLXdvcmQgaGVhZGVyOiBhIHBvaW50ZXIgdG8gdGhlIG5leHQgaW4KLSAgICAgICAgICAgIGEgbGlua2VkIGxpc3Qgb2Ygc3VjaCB0YWJsZXMgKGluaXRpYWxpemVkIHRvIDApOyAgYW5kIGEgY291bnQKLSAgICAgICAgICAgIG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdGFibGUgKGV4Y2x1c2l2ZSBvZiB0aGUgaGVhZGVyLgotCi0gICAgICAgICAgICBOb3RlIHRoYXQgaW5wdXQgc291cmNlIGNvZGUgaXMgZXhwZWN0ZWQgdG8gYWxyZWFkeSBjb250YWluIGNhbGxzCi0gICAgICAgICAgICBhbiBleHRlcm5hbCByb3V0aW5lIHRoYXQgd2lsbCBsaW5rIHRoZSBicmFuY2ggbG9jYWwgdGFibGUgaW50byBhCi0gICAgICAgICAgICBsaXN0IG9mIHN1Y2ggdGFibGVzLgotICovCi0KLS8qIE51bWJlciBvZiBicmFuY2hlcyBpbnN0cnVtZW50ZWQgc28gZmFyLiAgQWxzbyB1c2VkIHRvIGdlbmVyYXRlCi0gICB1bmlxdWUgbG9jYWwgbGFiZWxzIGZvciBlYWNoIGluc3RydW1lbnRlZCBicmFuY2guICAqLwotc3RhdGljIGludCBicl9jbnQ7Ci0KLSNkZWZpbmUgQlJfTEFCRUxfQkFTRQkiTEJSQU5DSCIKLS8qIEJhc2VuYW1lIG9mIGxvY2FsIGxhYmVscyBvbiBpbnN0cnVtZW50ZWQgYnJhbmNoZXMsIHRvIGF2b2lkCi0gICBjb25mbGljdCB3aXRoIGNvbXBpbGVyLSBnZW5lcmF0ZWQgbG9jYWwgbGFiZWxzLiAgKi8KLQotI2RlZmluZSBCUl9DTlRfRlVOQwkiX19pbmNfYnJhbmNoIgotLyogTmFtZSBvZiB0aGUgZXh0ZXJuYWwgcm91dGluZSB0aGF0IHdpbGwgaW5jcmVtZW50IChhbmQgc3RlcCBvdmVyKSBhbgotICAgaW5saW5lIGNvdW50ZXIuICAqLwotCi0jZGVmaW5lIEJSX1RBQl9OQU1FCSJfX0JSQU5DSF9UQUJMRV9fIgotLyogTmFtZSBvZiB0aGUgdGFibGUgb2YgcG9pbnRlcnMgdG8gYnJhbmNoZXMuICBBIGxvY2FsIChpLmUuLAotICAgbm9uLWV4dGVybmFsKSBzeW1ib2wuICAqLwotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9iZWdpbjogIE9uZS10aW1lIGluaXRpYWxpemF0aW9uLgotCi0gIAlTZXQgdXAgaGFzaCB0YWJsZXMuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBpbnQgaTsJCQkvKiBMb29wIGNvdW50ZXIgKi8KLSAgY29uc3Qgc3RydWN0IGk5NjBfb3Bjb2RlICpvUDsJLyogUG9pbnRlciBpbnRvIG9wY29kZSB0YWJsZSAqLwotICBjb25zdCBjaGFyICpyZXR2YWw7CQkvKiBWYWx1ZSByZXR1cm5lZCBieSBoYXNoIGZ1bmN0aW9ucyAqLwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgcmVnX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgYXJlZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgYmFzZSBhc3NlbWJsZXIgdXNlcyBhbiBlbXB0eSBzdHJpbmcgZm9yICJubwotICAgICBlcnJvciBtZXNzYWdlIiwgaW5zdGVhZCBvZiBhIE5VTEwgcG9pbnRlci4gICovCi0gIHJldHZhbCA9IDA7Ci0KLSAgZm9yIChvUCA9IGk5NjBfb3Bjb2Rlczsgb1AtPm5hbWUgJiYgIXJldHZhbDsgb1ArKykKLSAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgb1AtPm5hbWUsIChQVFIpIG9QKTsKLQotICBmb3IgKGkgPSAwOyByZWduYW1lc1tpXS5yZWdfbmFtZSAmJiAhcmV0dmFsOyBpKyspCi0gICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKHJlZ19oYXNoLCByZWduYW1lc1tpXS5yZWdfbmFtZSwKLQkJCSAgKGNoYXIgKikgJnJlZ25hbWVzW2ldLnJlZ19udW0pOwotCi0gIGZvciAoaSA9IDA7IGFyZWdzW2ldLmFyZWdfbmFtZSAmJiAhcmV0dmFsOyBpKyspCi0gICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKGFyZWdfaGFzaCwgYXJlZ3NbaV0uYXJlZ19uYW1lLAotCQkJICAoY2hhciAqKSAmYXJlZ3NbaV0uYXJlZ19udW0pOwotCi0gIGlmIChyZXR2YWwpCi0gICAgYXNfZmF0YWwgKF8oIkhhc2hpbmcgcmV0dXJuZWQgXCIlc1wiLiIpLCByZXR2YWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX2Fzc2VtYmxlOiAgQXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24KLQotICAgQXNzdW1wdGlvbnMgYWJvdXQgdGhlIHBhc3NlZC1pbiB0ZXh0OgotICAJLSBhbGwgY29tbWVudHMsIGxhYmVscyByZW1vdmVkCi0gIAktIHRleHQgaXMgYW4gaW5zdHJ1Y3Rpb24KLSAgCS0gYWxsIHdoaXRlIHNwYWNlIGNvbXByZXNzZWQgdG8gc2luZ2xlIGJsYW5rcwotICAJLSBhbGwgY2hhcmFjdGVyIGNvbnN0YW50cyBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBkZWNpbWFsCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1tZF9hc3NlbWJsZSAodGV4dFApCi0gICAgIGNoYXIgKnRleHRQOwkJLyogU291cmNlIHRleHQgb2YgaW5zdHJ1Y3Rpb24gKi8KLXsKLSAgLyogUGFyc2VkIGluc3RydWN0aW9uIHRleHQsIGNvbnRhaW5pbmcgTk8gd2hpdGVzcGFjZTogYXJnWzBdLT5vcGNvZGUKLSAgICAgbW5lbW9uaWMgYXJnWzEtM10tPm9wZXJhbmRzLCB3aXRoIGNoYXIgY29uc3RhbnRzIHJlcGxhY2VkIGJ5Ci0gICAgIGRlY2ltYWwgbnVtYmVycy4gICovCi0gIGNoYXIgKmFyZ3NbNF07Ci0KLSAgaW50IG5fb3BzOwkJCS8qIE51bWJlciBvZiBpbnN0cnVjdGlvbiBvcGVyYW5kcyAqLwotICAvKiBQb2ludGVyIHRvIGluc3RydWN0aW9uIGRlc2NyaXB0aW9uICovCi0gIHN0cnVjdCBpOTYwX29wY29kZSAqb1A7Ci0gIC8qIFRSVUUgaWZmIG9wY29kZSBtbmVtb25pYyBpbmNsdWRlZCBicmFuY2gtcHJlZGljdGlvbiBzdWZmaXggKCIuZiIKLSAgICAgb3IgIi50IikuICAqLwotICBpbnQgYnJhbmNoX3ByZWRpY3Q7Ci0gIC8qIFNldHRpbmcgb2YgYnJhbmNoLXByZWRpY3Rpb24gYml0KHMpIHRvIGJlIE9SJ2QgaW50byBpbnN0cnVjdGlvbgotICAgICBvcGNvZGUgb2YgQ1RSTC9DT0JSIGZvcm1hdCBpbnN0cnVjdGlvbnMuICAqLwotICBsb25nIGJwX2JpdHM7Ci0KLSAgaW50IG47CQkJLyogT2Zmc2V0IG9mIGxhc3QgY2hhcmFjdGVyIGluIG9wY29kZSBtbmVtb25pYyAqLwotCi0gIGNvbnN0IGNoYXIgKmJwX2Vycm9yX21zZyA9IF8oImJyYW5jaCBwcmVkaWN0aW9uIGludmFsaWQgb24gdGhpcyBvcGNvZGUiKTsKLQotCi0gIC8qIFBhcnNlIGluc3RydWN0aW9uIGludG8gb3Bjb2RlIGFuZCBvcGVyYW5kcyAqLwotICBtZW1zZXQgKGFyZ3MsICdcMCcsIHNpemVvZiAoYXJncykpOwotICBuX29wcyA9IGlfc2NhbiAodGV4dFAsIGFyZ3MpOwotICBpZiAobl9vcHMgPT0gLTEpCi0gICAgewotICAgICAgcmV0dXJuOwkJCS8qIEVycm9yIG1lc3NhZ2UgYWxyZWFkeSBpc3N1ZWQgKi8KLSAgICB9Ci0KLSAgLyogRG8gIm1hY3JvIHN1YnN0aXR1dGlvbiIgKHNvcnQgb2YpIG9uICdsZGNvbnN0JyBwc2V1ZG8taW5zdHJ1Y3Rpb24gKi8KLSAgaWYgKCFzdHJjbXAgKGFyZ3NbMF0sICJsZGNvbnN0IikpCi0gICAgewotICAgICAgbl9vcHMgPSBwYXJzZV9sZGNvbnN0IChhcmdzKTsKLSAgICAgIGlmIChuX29wcyA9PSAtMSkKLQl7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotCi0KLSAgLyogQ2hlY2sgZm9yIGJyYW5jaC1wcmVkaWN0aW9uIHN1ZmZpeCBvbiBvcGNvZGUgbW5lbW9uaWMsIHN0cmlwIGl0IG9mZiAqLwotICBuID0gc3RybGVuIChhcmdzWzBdKSAtIDE7Ci0gIGJyYW5jaF9wcmVkaWN0ID0gMDsKLSAgYnBfYml0cyA9IDA7Ci0gIGlmIChhcmdzWzBdW24gLSAxXSA9PSAnLicgJiYgKGFyZ3NbMF1bbl0gPT0gJ3QnIHx8IGFyZ3NbMF1bbl0gPT0gJ2YnKSkKLSAgICB7Ci0gICAgICAvKiBXZSBjb3VsZCBjaGVjayBoZXJlIHRvIHNlZSBpZiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZQotCSBzdXBwb3J0cyBicmFuY2ggcHJlZGljdGlvbiwgYnV0IHdoeSBib3RoZXI/ICBUaGUgYml0IHdpbGwKLQkganVzdCBiZSBpZ25vcmVkIGJ5IHByb2Nlc3NvcnMgdGhhdCBkb24ndCB1c2UgaXQuICAqLwotICAgICAgYnJhbmNoX3ByZWRpY3QgPSAxOwotICAgICAgYnBfYml0cyA9IChhcmdzWzBdW25dID09ICd0JykgPyBCUF9UQUtFTiA6IEJQX05PVF9UQUtFTjsKLSAgICAgIGFyZ3NbMF1bbiAtIDFdID0gJ1wwJzsJLyogU3RyaXAgc3VmZml4IGZyb20gb3Bjb2RlIG1uZW1vbmljICovCi0gICAgfQotCi0gIC8qIExvb2sgdXAgb3Bjb2RlIG1uZW1vbmljIGluIHRhYmxlIGFuZCBjaGVjayBudW1iZXIgb2Ygb3BlcmFuZHMuCi0gICAgIENoZWNrIHRoYXQgb3Bjb2RlIGlzIGxlZ2FsIGZvciB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gIElmIGFsbAotICAgICBsb29rcyBnb29kLCBhc3NlbWJsZSBpbnN0cnVjdGlvbi4gICovCi0gIG9QID0gKHN0cnVjdCBpOTYwX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIGFyZ3NbMF0pOwotICBpZiAoIW9QIHx8ICF0YXJnX2hhc19pY2xhc3MgKG9QLT5pY2xhc3MpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBvcGNvZGUsIFwiJXNcIi4iKSwgYXJnc1swXSk7Ci0KLSAgICB9Ci0gIGVsc2UgaWYgKG5fb3BzICE9IG9QLT5udW1fb3BzKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW1wcm9wZXIgbnVtYmVyIG9mIG9wZXJhbmRzLiAgZXhwZWN0aW5nICVkLCBnb3QgJWQiKSwKLQkgICAgICBvUC0+bnVtX29wcywgbl9vcHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAob1AtPmZvcm1hdCkKLQl7Ci0JY2FzZSBGQlJBOgotCWNhc2UgQ1RSTDoKLQkgIGN0cmxfZm10IChhcmdzWzFdLCBvUC0+b3Bjb2RlIHwgYnBfYml0cywgb1AtPm51bV9vcHMpOwotCSAgaWYgKG9QLT5mb3JtYXQgPT0gRkJSQSkKLQkgICAgewotCSAgICAgIC8qIE5vdyBnZW5lcmF0ZSBhICdibm8nIHRvIHNhbWUgYXJnICovCi0JICAgICAgY3RybF9mbXQgKGFyZ3NbMV0sIEJOTyB8IGJwX2JpdHMsIDEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIENPQlI6Ci0JY2FzZSBDT0o6Ci0JICBjb2JyX2ZtdCAoYXJncywgb1AtPm9wY29kZSB8IGJwX2JpdHMsIG9QKTsKLQkgIGJyZWFrOwotCWNhc2UgUkVHOgotCSAgaWYgKGJyYW5jaF9wcmVkaWN0KQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoYnBfZXJyb3JfbXNnKTsKLQkgICAgfQotCSAgcmVnX2ZtdCAoYXJncywgb1ApOwotCSAgYnJlYWs7Ci0JY2FzZSBNRU0xOgotCSAgaWYgKGFyZ3NbMF1bMF0gPT0gJ2MnICYmIGFyZ3NbMF1bMV0gPT0gJ2EnKQotCSAgICB7Ci0JICAgICAgaWYgKGJyYW5jaF9wcmVkaWN0KQotCQl7Ci0JCSAgYXNfd2FybiAoYnBfZXJyb3JfbXNnKTsKLQkJfQotCSAgICAgIG1lbV9mbXQgKGFyZ3MsIG9QLCAxKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCWNhc2UgTUVNMjoKLQljYXNlIE1FTTQ6Ci0JY2FzZSBNRU04OgotCWNhc2UgTUVNMTI6Ci0JY2FzZSBNRU0xNjoKLQkgIGlmIChicmFuY2hfcHJlZGljdCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKGJwX2Vycm9yX21zZyk7Ci0JICAgIH0KLQkgIG1lbV9mbXQgKGFyZ3MsIG9QLCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0FMTEo6Ci0JICBpZiAoYnJhbmNoX3ByZWRpY3QpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChicF9lcnJvcl9tc2cpOwotCSAgICB9Ci0JICAvKiBPdXRwdXQgb3Bjb2RlICYgc2V0IHVwICJmaXh1cCIgKHJlbG9jYXRpb24pOyBmbGFnCi0JICAgICByZWxvY2F0aW9uIGFzICdjYWxsaicgdHlwZS4gICovCi0JICBrbm93IChvUC0+bnVtX29wcyA9PSAxKTsKLQkgIGdldF9jZGlzcCAoYXJnc1sxXSwgIkNUUkwiLCBvUC0+b3Bjb2RlLCAyNCwgMCwgMSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgQkFEX0NBU0UgKG9QLT5mb3JtYXQpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0JCQkJLyogbWRfYXNzZW1ibGUoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX251bWJlcl90b19jaGFyczogIGNvbnZlcnQgYSBudW1iZXIgdG8gdGFyZ2V0IGJ5dGUgb3JkZXIKLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsdWU7Ci0gICAgIGludCBuOwotewotICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbHVlLCBuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9jaGFyc190b19udW1iZXI6ICBjb252ZXJ0IGZyb20gdGFyZ2V0IGJ5dGUgb3JkZXIgdG8gaG9zdCBieXRlIG9yZGVyLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotaW50Ci1tZF9jaGFyc190b19udW1iZXIgKHZhbCwgbikKLSAgICAgdW5zaWduZWQgY2hhciAqdmFsOwkvKiBWYWx1ZSBpbiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgICBpbnQgbjsJCQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGlucHV0ICovCi17Ci0gIGludCByZXR2YWw7Ci0KLSAgZm9yIChyZXR2YWwgPSAwOyBuLS07KQotICAgIHsKLSAgICAgIHJldHZhbCA8PD0gODsKLSAgICAgIHJldHZhbCB8PSB2YWxbbl07Ci0gICAgfQotICByZXR1cm4gcmV0dmFsOwotfQotCi0KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMJNgotI2RlZmluZSBMTlVNX1NJWkUJc2l6ZW9mKExJVFRMRU5VTV9UWVBFKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX2F0b2Y6CWNvbnZlcnQgYXNjaWkgdG8gZmxvYXRpbmcgcG9pbnQKLQotICAgVHVybiBhIHN0cmluZyBhdCBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgICd0eXBlJywgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBhdCAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyByZXR1cm5lZCBhdCAnc2l6ZVAnLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgYSBwb2ludGVyCi0gICB0byBhbiBlbXB0eSBtZXNzYWdlIGlmIE9LLgotCi0gICBOb3RlIHdlIGNhbGwgdGhlIGkzODYgZmxvYXRpbmcgcG9pbnQgcm91dGluZSwgcmF0aGVyIHRoYW4gY29tcGxpY2F0aW5nCi0gICB0aGluZ3Mgd2l0aCBtb3JlIGZpbGVzIG9yIHN5bWJvbGljIGxpbmtzLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBpbnQgcHJlYzsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgY2FzZSAnVCc6Ci0gICAgICBwcmVjID0gNTsKLSAgICAgIHR5cGUgPSAneCc7CQkvKiBUaGF0J3Mgd2hhdCBhdG9mX2llZWUoKSB1bmRlcnN0YW5kcyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBtZF9hdG9mKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICAgfQotCi0gICpzaXplUCA9IHByZWMgKiBMTlVNX1NJWkU7Ci0KLSAgLyogT3V0cHV0IHRoZSBMSVRUTEVOVU1zIGluIFJFVkVSU0Ugb3JkZXIgaW4gYWNjb3JkIHdpdGggaTgwOTYwCi0gICAgIHdvcmQtb3JkZXIuICAoRHVubm8gd2h5IGF0b2ZfaWVlZSBkb2Vzbid0IGRvIGl0IGluIHRoZSByaWdodAotICAgICBvcmRlciBpbiB0aGUgZmlyc3QgcGxhY2UgLS0gcHJvYmFibHkgYmVjYXVzZSBpdCdzIGEgaGFjayBvZgotICAgICBhdG9mX202OGsuKSAgKi8KLQotICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjIC0gMTsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQLS0pLCBMTlVNX1NJWkUpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9udW1iZXJfdG9faW1tCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1tZF9udW1iZXJfdG9faW1tIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICBsb25nIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfbnVtYmVyX3RvX2Rpc3AKLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLW1kX251bWJlcl90b19kaXNwIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICBsb25nIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX251bWJlcl90b19maWVsZDoKLQotICAJU3RpY2sgYSB2YWx1ZSAoYW4gYWRkcmVzcyBmaXh1cCkgaW50byBhIGJpdCBmaWVsZCBvZgotICAJcHJldmlvdXNseS1nZW5lcmF0ZWQgaW5zdHJ1Y3Rpb24uCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1tZF9udW1iZXJfdG9fZmllbGQgKGluc3RyUCwgdmFsLCBiZml4UCkKLSAgICAgY2hhciAqaW5zdHJQOwkJLyogUG9pbnRlciB0byBpbnN0cnVjdGlvbiB0byBiZSBmaXhlZCAqLwotICAgICBsb25nIHZhbDsJCQkvKiBBZGRyZXNzIGZpeHVwIHZhbHVlICovCi0gICAgIGJpdF9maXhTICpiZml4UDsJCS8qIERlc2NyaXB0aW9uIG9mIGJpdCBmaWVsZCB0byBiZSBmaXhlZCB1cCAqLwotewotICBpbnQgbnVtYml0czsJCQkvKiBMZW5ndGggb2YgYml0IGZpZWxkIHRvIGJlIGZpeGVkICovCi0gIGxvbmcgaW5zdHI7CQkJLyogMzItYml0IGluc3RydWN0aW9uIHRvIGJlIGZpeGVkLXVwICovCi0gIGxvbmcgc2lnbjsJCQkvKiAwIG9yIC0xLCBhY2NvcmRpbmcgdG8gc2lnbiBiaXQgb2YgJ3ZhbCcgKi8KLQotICAvKiBDb252ZXJ0IGluc3RydWN0aW9uIGJhY2sgdG8gaG9zdCBieXRlIG9yZGVyLiAgKi8KLSAgaW5zdHIgPSBtZF9jaGFyc190b19udW1iZXIgKGluc3RyUCwgNCk7Ci0KLSAgLyogU3VycHJpc2UhIC0tIHdlIHN0b3JlZCB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgbW9kaWZpZWQgcmF0aGVyCi0gICAgIHRoYW4gYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlLiAgKi8KLSAgbnVtYml0cyA9IChpbnQpIGJmaXhQOwotICBpZiAobnVtYml0cyA9PSAxKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBuby1vcCwgc3R1Y2sgaGVyZSBieSByZWxvY19jYWxsaigpICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGtub3cgKChudW1iaXRzID09IDEzKSB8fCAobnVtYml0cyA9PSAyNCkpOwotCi0gIC8qIFByb3BhZ2F0ZSBzaWduIGJpdCBvZiAndmFsJyBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBiaXRzLiAgUmVzdWx0Ci0gICAgIHNob3VsZCBiZSBhbGwgMCBvciBhbGwgMS4gICovCi0gIHNpZ24gPSB2YWwgPj4gKChpbnQpIG51bWJpdHMgLSAxKTsKLSAgaWYgKCgodmFsIDwgMCkgJiYgKHNpZ24gIT0gLTEpKQotICAgICAgfHwgKCh2YWwgPiAwKSAmJiAoc2lnbiAhPSAwKSkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJGaXh1cCBvZiAlbGQgdG9vIGxhcmdlIGZvciBmaWVsZCB3aWR0aCBvZiAlZCIpLAotCSAgICAgIHZhbCwgbnVtYml0cyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogUHV0IGJpdCBmaWVsZCBpbnRvIGluc3RydWN0aW9uIGFuZCB3cml0ZSBiYWNrIGluIHRhcmdldAotICAgICAgICAgKiBieXRlIG9yZGVyLgotICAgICAgICovCi0gICAgICB2YWwgJj0gfigtMSA8PCAoaW50KSBudW1iaXRzKTsJLyogQ2xlYXIgdW51c2VkIHNpZ24gYml0cyAqLwotICAgICAgaW5zdHIgfD0gdmFsOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChpbnN0clAsIGluc3RyLCA0KTsKLSAgICB9Ci19CQkJCS8qIG1kX251bWJlcl90b19maWVsZCgpICovCi0MCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfcGFyc2Vfb3B0aW9uCi0gIAlJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICAJU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLiAgRm9yIHRoZSA5NjAsIHRoZXNlIGFyZToKLQotICAJLW5vcmVsYXg6Ci0gIAkJQ29uZGl0aW9uYWwgYnJhbmNoIGluc3RydWN0aW9ucyB0aGF0IHJlcXVpcmUgZGlzcGxhY2VtZW50cwotICAJCWdyZWF0ZXIgdGhhbiAxMyBiaXRzIChvciB0aGF0IGhhdmUgZXh0ZXJuYWwgdGFyZ2V0cykgc2hvdWxkCi0gIAkJZ2VuZXJhdGUgZXJyb3JzLiAgVGhlIGRlZmF1bHQgaXMgdG8gcmVwbGFjZSBlYWNoIHN1Y2gKLSAgCQlpbnN0cnVjdGlvbiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBhcmUgKG9yIGNoa2JpdCkgYW5kCi0gIAkJYnJhbmNoIGluc3RydWN0aW9ucy4gIE5vdGUgdGhhdCB0aGUgSW50ZWwgImoiIGNvYnIgZGlyZWN0aXZlcwotICAJCWFyZSBBTFdBWVMgImRlLW9wdGltaXplZCIgaW4gdGhpcyB3YXkgd2hlbiBuZWNlc3NhcnksCi0gIAkJcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiB0aGlzIG9wdGlvbi4KLQotICAJLWI6Ci0gIAkJQWRkIGNvZGUgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCBicmFuY2hlcyB0YWtlbiwgZm9yCi0gIAkJbGF0ZXIgb3B0aW1pemF0aW9uIG9mIGJyYW5jaCBwcmVkaWN0aW9uIGJpdHMgYnkgYSBzZXBhcmF0ZQotICAJCXRvb2wuICBDT0JSIGFuZCBDTlRMIGZvcm1hdCBpbnN0cnVjdGlvbnMgaGF2ZSBicmFuY2gKLSAgCQlwcmVkaWN0aW9uIGJpdHMgKGluIHRoZSBDWCBhcmNoaXRlY3R1cmUpOyAgaWYgIkJSIiByZXByZXNlbnRzCi0gIAkJYW4gaW5zdHJ1Y3Rpb24gaW4gb25lIG9mIHRoZXNlIGNsYXNzZXMsIHRoZSBmb2xsb3dpbmcgcmVwLQotICAJCXJlc2VudHMgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXI6Ci0KLSAgCQkJY2FsbAk8aW5jcmVtZW50IHJvdXRpbmU+Ci0gIAkJCS53b3JkCTAJIyBwcmUtY291bnRlcgotICAJCUxhYmVsOiAgQlIKLSAgCQkJY2FsbAk8aW5jcmVtZW50IHJvdXRpbmU+Ci0gIAkJCS53b3JkCTAJIyBwb3N0LWNvdW50ZXIKLQotICAJCUEgdGFibGUgb2YgYWxsIHN1Y2ggIkxhYmVscyIgaXMgYWxzbyBnZW5lcmF0ZWQuCi0KLQotICAJLUFLQSwgLUFLQiwgLUFLQywgLUFTQSwgLUFTQiwgLUFNQywgLUFDQToKLSAgCQlTZWxlY3QgdGhlIDgwOTYwIGFyY2hpdGVjdHVyZS4gIEluc3RydWN0aW9ucyBvciBmZWF0dXJlcyBub3QKLSAgCQlzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIGFyY2hpdGVjdHVyZSBjYXVzZSBmYXRhbCBlcnJvcnMuCi0gIAkJVGhlIGRlZmF1bHQgaXMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgYW55IGluc3RydWN0aW9uIG9yIGZlYXR1cmUKLSAgCQl0aGF0IGlzIHN1cHBvcnRlZCBieSBTT01FIHZlcnNpb24gb2YgdGhlIDk2MCAoZXZlbiBpZiB0aGlzCi0gIAkJbWVhbnMgbWl4aW5nIGFyY2hpdGVjdHVyZXMhKS4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiQTpiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0jZGVmaW5lIE9QVElPTl9MSU5LUkVMQVggKE9QVElPTl9NRF9CQVNFKQotICB7ImxpbmtyZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElOS1JFTEFYfSwKLSAgeyJsaW5rLXJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSU5LUkVMQVh9LAotI2RlZmluZSBPUFRJT05fTk9SRUxBWCAoT1BUSU9OX01EX0JBU0UgKyAxKQotICB7Im5vcmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PUkVMQVh9LAotICB7Im5vLXJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT1JFTEFYfSwKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLXN0cnVjdCB0YWJlbnRyeQotICB7Ci0gICAgY2hhciAqZmxhZzsKLSAgICBpbnQgYXJjaDsKLSAgfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGFiZW50cnkgYXJjaF90YWJbXSA9Ci17Ci0gIHsiS0EiLCBBUkNIX0tBfSwKLSAgeyJLQiIsIEFSQ0hfS0J9LAotICB7IlNBIiwgQVJDSF9LQX0sCQkvKiBTeW5vbnltIGZvciBLQSAqLwotICB7IlNCIiwgQVJDSF9LQn0sCQkvKiBTeW5vbnltIGZvciBLQiAqLwotICB7IktDIiwgQVJDSF9NQ30sCQkvKiBTeW5vbnltIGZvciBNQyAqLwotICB7Ik1DIiwgQVJDSF9NQ30sCi0gIHsiQ0EiLCBBUkNIX0NBfSwKLSAgeyJKWCIsIEFSQ0hfSlh9LAotICB7IkhYIiwgQVJDSF9IWH0sCi0gIHtOVUxMLCAwfQotfTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9MSU5LUkVMQVg6Ci0gICAgICBsaW5rcmVsYXggPSAxOwotICAgICAgZmxhZ19rZWVwX2xvY2FscyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PUkVMQVg6Ci0gICAgICBub3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYic6Ci0gICAgICBpbnN0cnVtZW50X2JyYW5jaGVzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQSc6Ci0gICAgICB7Ci0JY29uc3Qgc3RydWN0IHRhYmVudHJ5ICp0cDsKLQljaGFyICpwID0gYXJnOwotCi0JZm9yICh0cCA9IGFyY2hfdGFiOyB0cC0+ZmxhZyAhPSBOVUxMOyB0cCsrKQotCSAgaWYgKCFzdHJjbXAgKHAsIHRwLT5mbGFnKSkKLQkgICAgYnJlYWs7Ci0KLQlpZiAodHAtPmZsYWcgPT0gTlVMTCkKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJpbnZhbGlkIGFyY2hpdGVjdHVyZSAlcyIpLCBwKTsKLQkgICAgcmV0dXJuIDA7Ci0JICB9Ci0JZWxzZQotCSAgYXJjaGl0ZWN0dXJlID0gdHAtPmFyY2g7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBpbnQgaTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJJOTYwIG9wdGlvbnM6XG4iKSk7Ci0gIGZvciAoaSA9IDA7IGFyY2hfdGFiW2ldLmZsYWc7IGkrKykKLSAgICBmcHJpbnRmIChzdHJlYW0sICIlcy1BJXMiLCBpID8gIiB8ICIgOiAiIiwgYXJjaF90YWJbaV0uZmxhZyk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXG5cCi0JCQlzcGVjaWZ5IHZhcmlhbnQgb2YgOTYwIGFyY2hpdGVjdHVyZVxuXAotLWIJCQlhZGQgY29kZSB0byBjb2xsZWN0IHN0YXRpc3RpY3MgYWJvdXQgYnJhbmNoZXMgdGFrZW5cblwKLS1saW5rLXJlbGF4CQlwcmVzZXJ2ZSBpbmRpdmlkdWFsIGFsaWdubWVudCBkaXJlY3RpdmVzIHNvIGxpbmtlclxuXAotCQkJY2FuIGRvIHJlbGF4aW5nIChiLm91dCBmb3JtYXQgb25seSlcblwKLS1uby1yZWxheAkJZG9uJ3QgYWx0ZXIgY29tcGFyZS1hbmQtYnJhbmNoIGluc3RydWN0aW9ucyBmb3JcblwKLQkJCWxvbmcgZGlzcGxhY2VtZW50c1xuIikpOwotfQotDAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX2NvbnZlcnRfZnJhZzoKLSAgCUNhbGxlZCBieSBiYXNlIGFzc2VtYmxlciBhZnRlciBhZGRyZXNzIHJlbGF4YXRpb24gaXMgZmluaXNoZWQ6ICBtb2RpZnkKLSAgCXZhcmlhYmxlIGZyYWdtZW50cyBhY2NvcmRpbmcgdG8gaG93IG11Y2ggcmVsYXhhdGlvbiB3YXMgZG9uZS4KLQotICAJSWYgdGhlIGZyYWdtZW50IHN1YnN0YXRlIGlzIHN0aWxsIDEsIGEgMTMtYml0IGRpc3BsYWNlbWVudCB3YXMgZW5vdWdoCi0gIAl0byByZWFjaCB0aGUgc3ltYm9sIGluIHF1ZXN0aW9uLiAgU2V0IHVwIGFuIGFkZHJlc3MgZml4dXAsIGJ1dCBvdGhlcndpc2UKLSAgCWxlYXZlIHRoZSBjb2JyIGluc3RydWN0aW9uIGFsb25lLgotCi0gIAlJZiB0aGUgZnJhZ21lbnQgc3Vic3RhdGUgaXMgMiwgYSAxMy1iaXQgZGlzcGxhY2VtZW50IHdhcyBub3QgZW5vdWdoLgotICAJUmVwbGFjZSB0aGUgY29iciB3aXRoIGEgdHdvIGluc3RydWN0aW9ucyAoYSBjb21wYXJlIGFuZCBhIGJyYW5jaCkuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICBmcmFnUyAqZnJhZ1A7Ci0jZWxzZQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICBmcmFnUyAqZnJhZ1A7Ci0jZW5kaWYKLXsKLSAgZml4UyAqZml4UDsJCQkvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBuZWVkZWQgYWRkcmVzcyBmaXggKi8KLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICAvKiBMRUFWRSBTSU5HTEUgQ09CUiBJTlNUUlVDVElPTiAqLwotICAgICAgZml4UCA9IGZpeF9uZXcgKGZyYWdQLAotCQkgICAgICBmcmFnUC0+ZnJfb3Bjb2RlIC0gZnJhZ1AtPmZyX2xpdGVyYWwsCi0JCSAgICAgIDQsCi0JCSAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgIGZyYWdQLT5mcl9vZmZzZXQsCi0JCSAgICAgIDEsCi0JCSAgICAgIE5PX1JFTE9DKTsKLQotICAgICAgZml4UC0+ZnhfYml0X2ZpeFAgPSAoYml0X2ZpeFMgKikgMTM7CS8qIHNpemUgb2YgYml0IGZpZWxkICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAvKiBSRVBMQUNFIENPQlIgV0lUSCBDT01QQVJFL0JSQU5DSCBJTlNUUlVDVElPTlMgKi8KLSAgICAgIHJlbGF4X2NvYnIgKGZyYWdQKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4OiAgSG93IG11Y2ggZG9lcyBpdCBsb29rIGxpa2UgKmZyYWdQIHdpbGwgZ3Jvdz8KLQotICAJQ2FsbGVkIGJ5IGJhc2UgYXNzZW1ibGVyIGp1c3QgYmVmb3JlIGFkZHJlc3MgcmVsYXhhdGlvbi4KLSAgCVJldHVybiB0aGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBmcmFnbWVudCB3aWxsIGdyb3cuCi0KLSAgCUFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkOyBjb2JyJ3MKLSAgCWJhc2VkIG9uIHVuZGVmaW5lZCBzeW1ib2xzIHdpbGwgaGF2ZSB0byBiZSByZXBsYWNlZCB3aXRoIGEgY29tcGFyZQotICAJaW5zdHJ1Y3Rpb24gYW5kIGEgYnJhbmNoIGluc3RydWN0aW9uLCBhbmQgdGhlIGNvZGUgZnJhZ21lbnQgd2lsbCBncm93Ci0gIAlieSA0IGJ5dGVzLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgLyogSWYgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGdvIHRvICJyZWxheGVkIiBzdGF0ZQotICAgICAoY29tcGFyZSBhbmQgYnJhbmNoIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mIGNvYnIpIHJpZ2h0IG5vdy4gICovCi0gIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWdtZW50X3R5cGUpCi0gICAgewotICAgICAgcmVsYXhfY29iciAoZnJhZ1ApOwotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotICByZXR1cm4gMDsKLX0JCQkJLyogbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKSAqLwotCi0jaWYgZGVmaW5lZChPQkpfQU9VVCkgfCBkZWZpbmVkKE9CSl9CT1VUKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX3JpX3RvX2NoYXJzOgotICAJVGhpcyByb3V0aW5lIGV4aXN0cyBpbiBvcmRlciB0byBvdmVyY29tZSBtYWNoaW5lIGJ5dGUtb3JkZXIgcHJvYmxlbXMKLSAgCXdoZW4gZGVhbGluZyB3aXRoIGJpdC1maWVsZCBlbnRyaWVzIGluIHRoZSByZWxvY2F0aW9uX2luZm8gc3RydWN0LgotCi0gIAlCdXQgcmVsb2NhdGlvbiBpbmZvIHdpbGwgYmUgdXNlZCBvbiB0aGUgaG9zdCBtYWNoaW5lIG9ubHkgKG9ubHkKLSAgCWV4ZWN1dGFibGUgY29kZSBpcyBhY3R1YWxseSBkb3dubG9hZGVkIHRvIHRoZSBpODA5NjApLiAgVGhlcmVmb3JlLAotICAJd2UgbGVhdmUgaXQgaW4gaG9zdCBieXRlIG9yZGVyLgotCi0gIAlUaGUgYWJvdmUgY29tbWVudCBpcyBubyBsb25nZXIgdHJ1ZS4gIFRoaXMgcm91dGluZSBub3cgcmVhbGx5Ci0gIAlkb2VzIGRvIHRoZSByZW9yZGVyaW5nIChJYW4gVGF5bG9yIDI4IEF1ZyA5MikuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLXN0YXRpYyB2b2lkCi1tZF9yaV90b19jaGFycyAod2hlcmUsIHJpKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcmk7Ci17Ci0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsIHJpLT5yX2FkZHJlc3MsCi0JCSAgICAgIHNpemVvZiAocmktPnJfYWRkcmVzcykpOwotICB3aGVyZVs0XSA9IHJpLT5yX2luZGV4ICYgMHgwZmY7Ci0gIHdoZXJlWzVdID0gKHJpLT5yX2luZGV4ID4+IDgpICYgMHgwZmY7Ci0gIHdoZXJlWzZdID0gKHJpLT5yX2luZGV4ID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgocmktPnJfcGNyZWwgPDwgMCkKLQkgICAgICB8IChyaS0+cl9sZW5ndGggPDwgMSkKLQkgICAgICB8IChyaS0+cl9leHRlcm4gPDwgMykKLQkgICAgICB8IChyaS0+cl9ic3IgPDwgNCkKLQkgICAgICB8IChyaS0+cl9kaXNwIDw8IDUpCi0JICAgICAgfCAocmktPnJfY2FsbGogPDwgNikpOwotfQotCi0jZW5kaWYgLyogZGVmaW5lZChPQkpfQU9VVCkgfCBkZWZpbmVkKE9CSl9CT1VUKSAqLwotCi0MCi0vKiBGT0xMT1dJTkcgQVJFIFRIRSBMT0NBTCBST1VUSU5FUywgSU4gQUxQSEFCRVRJQ0FMIE9SREVSICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGJyY250X2VtaXQ6CUVtaXQgY29kZSB0byBpbmNyZW1lbnQgaW5saW5lIGJyYW5jaCBjb3VudGVyLgotCi0gIAlTZWUgdGhlIGNvbW1lbnRzIGFib3ZlIHRoZSBkZWNsYXJhdGlvbiBvZiAnYnJfY250JyBmb3IgZGV0YWlscyBvbgotICAJYnJhbmNoLXByZWRpY3Rpb24gaW5zdHJ1bWVudGF0aW9uLgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkCi1icmNudF9lbWl0ICgpCi17Ci0gIGN0cmxfZm10IChCUl9DTlRfRlVOQywgQ0FMTCwgMSk7CS8qIEVtaXQgY2FsbCB0byAiaW5jcmVtZW50IiByb3V0aW5lICovCi0gIGVtaXQgKDApOwkJCS8qIEVtaXQgaW5saW5lIGNvdW50ZXIgdG8gYmUgaW5jcmVtZW50ZWQgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBicmxhYl9uZXh0OglnZW5lcmF0ZSB0aGUgbmV4dCBicmFuY2ggbG9jYWwgbGFiZWwKLQotICAJU2VlIHRoZSBjb21tZW50cyBhYm92ZSB0aGUgZGVjbGFyYXRpb24gb2YgJ2JyX2NudCcgZm9yIGRldGFpbHMgb24KLSAgCWJyYW5jaC1wcmVkaWN0aW9uIGluc3RydW1lbnRhdGlvbi4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgY2hhciAqCi1icmxhYl9uZXh0ICgpCi17Ci0gIHN0YXRpYyBjaGFyIGJ1ZlsyMF07Ci0KLSAgc3ByaW50ZiAoYnVmLCAiJXMlZCIsIEJSX0xBQkVMX0JBU0UsIGJyX2NudCsrKTsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBicnRhYl9lbWl0OglnZW5lcmF0ZSB0aGUgZmV0Y2gtcHJlZGljdGlvbiBicmFuY2ggdGFibGUuCi0KLSAgCVNlZSB0aGUgY29tbWVudHMgYWJvdmUgdGhlIGRlY2xhcmF0aW9uIG9mICdicl9jbnQnIGZvciBkZXRhaWxzIG9uCi0gIAlicmFuY2gtcHJlZGljdGlvbiBpbnN0cnVtZW50YXRpb24uCi0KLSAgCVRoZSBjb2RlIGVtaXR0ZWQgaGVyZSB3b3VsZCBiZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nCi0gIAlleGFtcGxlIGFzc2VtYmxlciBzb3VyY2UuCi0KLSAgCQkJLmRhdGEKLSAgCQkJLmFsaWduCTIKLSAgCSAgIEJSX1RBQl9OQU1FOgotICAJCQkud29yZAkwCQkjIGxpbmsgdG8gbmV4dCB0YWJsZQotICAJCQkud29yZAkzCQkjIGxlbmd0aCBvZiB0YWJsZQotICAJCQkud29yZAlMQlJBTkNIMAkjIDFzdCBlbnRyeSBpbiB0YWJsZSBwcm9wZXIKLSAgCQkJLndvcmQJTEJSQU5DSDEKLSAgCQkJLndvcmQJTEJSQU5DSDIKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotYnJ0YWJfZW1pdCAoKQotewotICBpbnQgaTsKLSAgY2hhciBidWZbMjBdOwotICBjaGFyICpwOwkJCS8qIFdoZXJlIHRoZSBiaW5hcnkgd2FzIG91dHB1dCB0byAqLwotICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0aW9uIG9mIGRlZmVycmVkIGFkZHJlc3MgZml4dXAuICAqLwotICBmaXhTICpmaXhQOwotCi0gIGlmICghaW5zdHJ1bWVudF9icmFuY2hlcykKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN1YnNlZ19zZXQgKGRhdGFfc2VjdGlvbiwgMCk7CS8qICAgICAgLmRhdGEgKi8KLSAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7CQkvKiAgICAgIC5hbGlnbiAyICovCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDIpOwotICBjb2xvbiAoQlJfVEFCX05BTUUpOwkJLyogQlJfVEFCX05BTUU6ICovCi0gIGVtaXQgKDApOwkJCS8qICAgICAgLndvcmQgMCAjbGluayB0byBuZXh0IHRhYmxlICovCi0gIGVtaXQgKGJyX2NudCk7CQkvKiAgICAgIC53b3JkIG4gI2xlbmd0aCBvZiB0YWJsZSAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBicl9jbnQ7IGkrKykKLSAgICB7Ci0gICAgICBzcHJpbnRmIChidWYsICIlcyVkIiwgQlJfTEFCRUxfQkFTRSwgaSk7Ci0gICAgICBwID0gZW1pdCAoMCk7Ci0gICAgICBmaXhQID0gZml4X25ldyAoZnJhZ19ub3csCi0JCSAgICAgIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgNCwKLQkJICAgICAgc3ltYm9sX2ZpbmQgKGJ1ZiksCi0JCSAgICAgIDAsCi0JCSAgICAgIDAsCi0JCSAgICAgIE5PX1JFTE9DKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgY29icl9mbXQ6CWdlbmVyYXRlIGEgQ09CUi1mb3JtYXQgaW5zdHJ1Y3Rpb24KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotdm9pZAotY29icl9mbXQgKGFyZywgb3Bjb2RlLCBvUCkKLSAgICAgLyogYXJnWzBdLT5vcGNvZGUgbW5lbW9uaWMsIGFyZ1sxLTNdLT5vcGVyYW5kcyAoYXNjaWkpICovCi0gICAgIGNoYXIgKmFyZ1tdOwotICAgICAvKiBPcGNvZGUsIHdpdGggYnJhbmNoLXByZWRpY3Rpb24gYml0cyBhbHJlYWR5IHNldCBpZiBuZWNlc3NhcnkuICAqLwotICAgICBsb25nIG9wY29kZTsKLSAgICAgLyogUG9pbnRlciB0byBkZXNjcmlwdGlvbiBvZiBpbnN0cnVjdGlvbi4gICovCi0gICAgIHN0cnVjdCBpOTYwX29wY29kZSAqb1A7Ci17Ci0gIGxvbmcgaW5zdHI7CQkJLyogMzItYml0IGluc3RydWN0aW9uICovCi0gIHN0cnVjdCByZWdvcCByZWdvcDsJCS8qIERlc2NyaXB0aW9uIG9mIHJlZ2lzdGVyIG9wZXJhbmQgKi8KLSAgaW50IG47CQkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi0gIGludCB2YXJfZnJhZzsJCQkvKiAxIGlmIHZhcnlpbmcgbGVuZ3RoIGNvZGUgZnJhZ21lbnQgc2hvdWxkCi0JCQkJICogICAgYmUgZW1pdHRlZDsgIDAgaWYgYW4gYWRkcmVzcyBmaXgKLQkJCQkgKiAgICAgIHNob3VsZCBiZSBlbWl0dGVkLgotCQkJCSAqLwotCi0gIGluc3RyID0gb3Bjb2RlOwotICBuID0gb1AtPm51bV9vcHM7Ci0KLSAgaWYgKG4gPj0gMSkKLSAgICB7Ci0gICAgICAvKiBGaXJzdCBvcGVyYW5kIChpZiBhbnkpIG9mIGEgQ09CUiBpcyBhbHdheXMgYSByZWdpc3RlcgotCSBvcGVyYW5kLiAgUGFyc2UgaXQuICAqLwotICAgICAgcGFyc2VfcmVnb3AgKCZyZWdvcCwgYXJnWzFdLCBvUC0+b3BlcmFuZFswXSk7Ci0gICAgICBpbnN0ciB8PSAocmVnb3AubiA8PCAxOSkgfCAocmVnb3AubW9kZSA8PCAxMyk7Ci0gICAgfQotICBpZiAobiA+PSAyKQotICAgIHsKLSAgICAgIC8qIFNlY29uZCBvcGVyYW5kIChpZiBhbnkpIG9mIGEgQ09CUiBpcyBhbHdheXMgYSByZWdpc3RlcgotCSBvcGVyYW5kLiAgUGFyc2UgaXQuICAqLwotICAgIHBhcnNlX3JlZ29wICgmcmVnb3AsIGFyZ1syXSwgb1AtPm9wZXJhbmRbMV0pOwotICAgICAgaW5zdHIgfD0gKHJlZ29wLm4gPDwgMTQpIHwgcmVnb3Auc3BlY2lhbDsKLSAgICB9Ci0KLQotICBpZiAobiA8IDMpCi0gICAgewotICAgICAgZW1pdCAoaW5zdHIpOwotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGluc3RydW1lbnRfYnJhbmNoZXMpCi0JewotCSAgYnJjbnRfZW1pdCAoKTsKLQkgIGNvbG9uIChicmxhYl9uZXh0ICgpKTsKLQl9Ci0KLSAgICAgIC8qIEEgdGhpcmQgb3BlcmFuZCB0byBhIENPQlIgaXMgYWx3YXlzIGEgZGlzcGxhY2VtZW50LiAgUGFyc2UKLSAgICAgICAgIGl0OyBpZiBpdCdzIHJlbGF4YWJsZSAoYSBjb2JyICJqIiBkaXJlY3RpdmUsIG9yIGFueSBjb2JyCi0gICAgICAgICBvdGhlciB0aGFuIGJicy9iYmMgd2hlbiB0aGUgIi1ub3JlbGF4IiBvcHRpb24gaXMgbm90IGluIHVzZSkKLSAgICAgICAgIHNldCB1cCBhIHZhcmlhYmxlIGNvZGUgZnJhZ21lbnQ7IG90aGVyd2lzZSBzZXQgdXAgYW4gYWRkcmVzcwotICAgICAgICAgZml4LiAgKi8KLSAgICAgIHZhcl9mcmFnID0gIW5vcmVsYXggfHwgKG9QLT5mb3JtYXQgPT0gQ09KKTsJLyogVFJVRSBvciBGQUxTRSAqLwotICAgICAgZ2V0X2NkaXNwIChhcmdbM10sICJDT0JSIiwgaW5zdHIsIDEzLCB2YXJfZnJhZywgMCk7Ci0KLSAgICAgIGlmIChpbnN0cnVtZW50X2JyYW5jaGVzKQotCXsKLQkgIGJyY250X2VtaXQgKCk7Ci0JfQotICAgIH0KLX0JCQkJLyogY29icl9mbXQoKSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgY3RybF9mbXQ6CWdlbmVyYXRlIGEgQ1RSTC1mb3JtYXQgaW5zdHJ1Y3Rpb24KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotdm9pZAotY3RybF9mbXQgKHRhcmdQLCBvcGNvZGUsIG51bV9vcHMpCi0gICAgIGNoYXIgKnRhcmdQOwkJLyogUG9pbnRlciB0byB0ZXh0IG9mIGxvbmUgb3BlcmFuZCAoaWYgYW55KSAqLwotICAgICBsb25nIG9wY29kZTsJCS8qIFRlbXBsYXRlIG9mIGluc3RydWN0aW9uICovCi0gICAgIGludCBudW1fb3BzOwkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi17Ci0gIGludCBpbnN0cnVtZW50OwkJLyogVFJVRSBpZmYgd2Ugc2hvdWxkIGFkZCBpbnN0cnVtZW50YXRpb24gdG8gdHJhY2sKLQkJCQkgICAqIGhvdyBvZnRlbiB0aGUgYnJhbmNoIGlzIHRha2VuCi0JCQkJICovCi0KLQotICBpZiAobnVtX29wcyA9PSAwKQotICAgIHsKLSAgICAgIGVtaXQgKG9wY29kZSk7CQkvKiBPdXRwdXQgb3Bjb2RlICovCi0gICAgfQotICBlbHNlCi0gICAgewotCi0gICAgICBpbnN0cnVtZW50ID0gaW5zdHJ1bWVudF9icmFuY2hlcyAmJiAob3Bjb2RlICE9IENBTEwpCi0JJiYgKG9wY29kZSAhPSBCKSAmJiAob3Bjb2RlICE9IFJFVCkgJiYgKG9wY29kZSAhPSBCQUwpOwotCi0gICAgICBpZiAoaW5zdHJ1bWVudCkKLQl7Ci0JICBicmNudF9lbWl0ICgpOwotCSAgY29sb24gKGJybGFiX25leHQgKCkpOwotCX0KLQotICAgICAgLyogVGhlIG9wZXJhbmQgTVVTVCBiZSBhbiBpcC1yZWxhdGl2ZSBkaXNwbGFjbWVudC4gUGFyc2UgaXQKLSAgICAgICAgICogYW5kIHNldCB1cCBhZGRyZXNzIGZpeCBmb3IgdGhlIGluc3RydWN0aW9uIHdlIGp1c3Qgb3V0cHV0LgotICAgICAgICovCi0gICAgICBnZXRfY2Rpc3AgKHRhcmdQLCAiQ1RSTCIsIG9wY29kZSwgMjQsIDAsIDApOwotCi0gICAgICBpZiAoaW5zdHJ1bWVudCkKLQl7Ci0JICBicmNudF9lbWl0ICgpOwotCX0KLSAgICB9Ci0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGVtaXQ6CW91dHB1dCBpbnN0cnVjdGlvbiBiaW5hcnkKLQotICAJT3V0cHV0IGluc3RydWN0aW9uIGJpbmFyeSwgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIsIDQgYnl0ZXMgYXQgYSB0aW1lLgotICAJUmV0dXJuIHBvaW50ZXIgdG8gd2hlcmUgaXQgd2FzIHBsYWNlZC4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotY2hhciAqCi1lbWl0IChpbnN0cikKLSAgICAgbG9uZyBpbnN0cjsJCS8qIFdvcmQgdG8gYmUgb3V0cHV0LCBob3N0IGJ5dGUgb3JkZXIgKi8KLXsKLSAgY2hhciAqdG9QOwkJCS8qIFdoZXJlIHRvIG91dHB1dCBpdCAqLwotCi0gIHRvUCA9IGZyYWdfbW9yZSAoNCk7CQkvKiBBbGxvY2F0ZSBzdG9yYWdlICovCi0gIG1kX251bWJlcl90b19jaGFycyAodG9QLCBpbnN0ciwgNCk7CS8qIENvbnZlcnQgdG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgcmV0dXJuIHRvUDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGdldF9hcmdzOglicmVhayBpbmRpdmlkdWFsIGFyZ3VtZW50cyBvdXQgb2YgY29tbWEtc2VwYXJhdGVkIGxpc3QKLQotICAgSW5wdXQgYXNzdW1wdGlvbnM6Ci0gIAktIGFsbCBjb21tZW50cyBhbmQgbGFiZWxzIGhhdmUgYmVlbiByZW1vdmVkCi0gIAktIGFsbCBzdHJpbmdzIG9mIHdoaXRlc3BhY2UgaGF2ZSBiZWVuIGNvbGxhcHNlZCB0byBhIHNpbmdsZSBibGFuay4KLSAgCS0gYWxsIGNoYXJhY3RlciBjb25zdGFudHMgKCd4JykgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggZGVjaW1hbAotCi0gICBPdXRwdXQ6Ci0gIAlhcmdzWzBdIGlzIHVudG91Y2hlZC4gYXJnc1sxXSBwb2ludHMgdG8gZmlyc3Qgb3BlcmFuZCwgZXRjLiBBbGwgYXJnczoKLSAgCS0gYXJlIE5VTEwtdGVybWluYXRlZAotICAJLSBjb250YWluIG5vIHdoaXRlc3BhY2UKLQotICAgUmV0dXJuIHZhbHVlOgotICAJTnVtYmVyIG9mIG9wZXJhbmRzICgwLDEsMiwgb3IgMykgb3IgLTEgb24gZXJyb3IuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgaW50Ci1nZXRfYXJncyAocCwgYXJncykKLSAgICAgLyogUG9pbnRlciB0byBjb21tYS1zZXBhcmF0ZWQgb3BlcmFuZHM7IE1VQ0tFRCBCWSBVUyAqLwotICAgICByZWdpc3RlciBjaGFyICpwOwotICAgICAvKiBPdXRwdXQgYXJnOiBwb2ludGVycyB0byBvcGVyYW5kcyBwbGFjZWQgaW4gYXJnc1sxLTNdLiAgTVVTVAotICAgICAgICBBQ0NPTU1PREFURSA0IEVOVFJJRVMgKGFyZ3NbMC0zXSkuICAqLwotICAgICBjaGFyICphcmdzW107Ci17Ci0gIHJlZ2lzdGVyIGludCBuOwkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi0gIHJlZ2lzdGVyIGNoYXIgKnRvOwotCi0gIC8qIFNraXAgbGVhZCB3aGl0ZSBzcGFjZSAqLwotICB3aGlsZSAoKnAgPT0gJyAnKQotICAgIHsKLSAgICAgIHArKzsKLSAgICB9Ci0KLSAgaWYgKCpwID09ICdcMCcpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIG4gPSAxOwotICBhcmdzWzFdID0gcDsKLQotICAvKiBTcXVlemUgYmxhbmtzIG91dCBieSBtb3Zpbmcgbm9uLWJsYW5rcyB0b3dhcmQgc3RhcnQgb2Ygc3RyaW5nLgotICAgICAqIElzb2xhdGUgb3BlcmFuZHMsIHdoZW5ldmVyIGNvbW1hIGlzIGZvdW5kLgotICAgKi8KLSAgdG8gPSBwOwotICB3aGlsZSAoKnAgIT0gJ1wwJykKLSAgICB7Ci0KLSAgICAgIGlmICgqcCA9PSAnICcKLQkgICYmICghIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBwWzFdKQotCSAgICAgIHx8ICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHBbLTFdKSkpCi0JewotCSAgcCsrOwotCi0JfQotICAgICAgZWxzZSBpZiAoKnAgPT0gJywnKQotCXsKLQotCSAgLyogU3RhcnQgb2Ygb3BlcmFuZCAqLwotCSAgaWYgKG4gPT0gMykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygidG9vIG1hbnkgb3BlcmFuZHMiKSk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0JICAqdG8rKyA9ICdcMCc7CQkvKiBUZXJtaW5hdGUgYXJndW1lbnQgKi8KLQkgIGFyZ3NbKytuXSA9IHRvOwkvKiBTdGFydCBuZXh0IGFyZ3VtZW50ICovCi0JICBwKys7Ci0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKnRvKysgPSAqcCsrOwotCX0KLSAgICB9Ci0gICp0byA9ICdcMCc7Ci0gIHJldHVybiBuOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgZ2V0X2NkaXNwOgloYW5kbGUgZGlzcGxhY2VtZW50IGZvciBhIENPQlIgb3IgQ1RSTCBpbnN0cnVjdGlvbi4KLQotICAJUGFyc2UgZGlzcGxhY2VtZW50IGZvciBhIENPQlIgb3IgQ1RSTCBpbnN0cnVjdGlvbi4KLQotICAJSWYgc3VjY2Vzc2Z1bCwgb3V0cHV0IHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUgYW5kIHNldCB1cCBmb3IgaXQsCi0gIAlkZXBlbmRpbmcgb24gdGhlIGFyZyAndmFyX2ZyYWcnLCBlaXRoZXI6Ci0gIAkgICAgbyBhbiBhZGRyZXNzIGZpeHVwIHRvIGJlIGRvbmUgd2hlbiBhbGwgc3ltYm9sIHZhbHVlcyBhcmUga25vd24sIG9yCi0gIAkgICAgbyBhIHZhcnlpbmcgbGVuZ3RoIGNvZGUgZnJhZ21lbnQsIHdpdGggYWRkcmVzcyBmaXh1cCBpbmZvLiAgVGhpcwotICAJCXdpbGwgYmUgZG9uZSBmb3IgY29iciBpbnN0cnVjdGlvbnMgdGhhdCBtYXkgaGF2ZSB0byBiZSByZWxheGVkCi0gIAkJaW4gdG8gY29tcGFyZS9icmFuY2ggaW5zdHJ1Y3Rpb25zICg4IGJ5dGVzKSBpZiB0aGUgZmluYWwKLSAgCQlhZGRyZXNzIGRpc3BsYWNlbWVudCBpcyBncmVhdGVyIHRoYW4gMTMgYml0cy4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljCi12b2lkCi1nZXRfY2Rpc3AgKGRpc3BQLCBpZm10UCwgaW5zdHIsIG51bWJpdHMsIHZhcl9mcmFnLCBjYWxsaikKLSAgICAgLyogZGlzcGxhY2VtZW50IGFzIHNwZWNpZmllZCBpbiBzb3VyY2UgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgY2hhciAqZGlzcFA7Ci0gICAgIC8qICJDT0JSIiBvciAiQ1RSTCIgKGZvciB1c2UgaW4gZXJyb3IgbWVzc2FnZSkgKi8KLSAgICAgY2hhciAqaWZtdFA7Ci0gICAgIC8qIEluc3RydWN0aW9uIG5lZWRpbmcgdGhlIGRpc3BsYWNlbWVudCAqLwotICAgICBsb25nIGluc3RyOwotICAgICAvKiAjIGJpdHMgb2YgZGlzcGxhY2VtZW50ICgxMyBmb3IgQ09CUiwgMjQgZm9yIENUUkwpICovCi0gICAgIGludCBudW1iaXRzOwotICAgICAvKiAxIGlmIHZhcnlpbmcgbGVuZ3RoIGNvZGUgZnJhZ21lbnQgc2hvdWxkIGJlIGVtaXR0ZWQ7Ci0gICAgICAqICAgICAgIDAgaWYgYW4gYWRkcmVzcyBmaXggc2hvdWxkIGJlIGVtaXR0ZWQuCi0gICAgICAqLwotICAgICBpbnQgdmFyX2ZyYWc7Ci0gICAgIC8qIDEgaWYgY2FsbGogcmVsb2NhdGlvbiBzaG91bGQgYmUgZG9uZTsgZWxzZSAwICovCi0gICAgIGludCBjYWxsajsKLXsKLSAgZXhwcmVzc2lvblMgZTsJCS8qIFBhcnNlZCBleHByZXNzaW9uICovCi0gIGZpeFMgKmZpeFA7CQkJLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgbmVlZGVkIGFkZHJlc3MgZml4ICovCi0gIGNoYXIgKm91dFA7CQkJLyogV2hlcmUgaW5zdHJ1Y3Rpb24gYmluYXJ5IGlzIG91dHB1dCB0byAqLwotCi0gIGZpeFAgPSBOVUxMOwotCi0gIHBhcnNlX2V4cHIgKGRpc3BQLCAmZSk7Ci0gIHN3aXRjaCAoZS5YX29wKQotICAgIHsKLSAgICBjYXNlIE9faWxsZWdhbDoKLSAgICAgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiBzeW50YXggZXJyb3IiKSk7Ci0KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGUuWF9hZGRfc3ltYm9sKSA9PSBub3dfc2VnCi0JICB8fCBTX0dFVF9TRUdNRU5UIChlLlhfYWRkX3N5bWJvbCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JewotCSAgaWYgKHZhcl9mcmFnKQotCSAgICB7Ci0JICAgICAgb3V0UCA9IGZyYWdfbW9yZSAoOCk7CS8qIEFsbG9jYXRlIHdvcnN0LWNhc2Ugc3RvcmFnZSAqLwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAob3V0UCwgaW5zdHIsIDQpOwotCSAgICAgIGZyYWdfdmFyaWFudCAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDQsIDEsCi0JCQkgICAgYWRkcyAoZSksIG9mZnMgKGUpLCBvdXRQKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU2V0IHVwIGEgbmV3IGZpeCBzdHJ1Y3R1cmUsIHNvIGFkZHJlc3MgY2FuIGJlIHVwZGF0ZWQKLQkgICAgICAgKiB3aGVuIGFsbCBzeW1ib2wgdmFsdWVzIGFyZSBrbm93bi4KLQkgICAgICAgKi8KLQkgICAgICBvdXRQID0gZW1pdCAoaW5zdHIpOwotCSAgICAgIGZpeFAgPSBmaXhfbmV3IChmcmFnX25vdywKLQkJCSAgICAgIG91dFAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgIDQsCi0JCQkgICAgICBhZGRzIChlKSwKLQkJCSAgICAgIG9mZnMgKGUpLAotCQkJICAgICAgMSwKLQkJCSAgICAgIE5PX1JFTE9DKTsKLQotCSAgICAgIGZpeFAtPmZ4X3RjYml0ID0gY2FsbGo7Ci0KLQkgICAgICAvKiBXZSB3YW50IHRvIG1vZGlmeSBhIGJpdCBmaWVsZCB3aGVuIHRoZSBhZGRyZXNzIGlzCi0JICAgICAgICoga25vd24uICBCdXQgd2UgZG9uJ3QgbmVlZCBhbGwgdGhlIGdhcmJhZ2UgaW4gdGhlCi0JICAgICAgICogYml0X2ZpeCBzdHJ1Y3R1cmUuICBTbyB3ZSdyZSBnb2luZyB0byBsaWUgYW5kIHN0b3JlCi0JICAgICAgICogdGhlIG51bWJlciBvZiBiaXRzIGFmZmVjdGVkIGluc3RlYWQgb2YgYSBwb2ludGVyLgotCSAgICAgICAqLwotCSAgICAgIGZpeFAtPmZ4X2JpdF9maXhQID0gKGJpdF9maXhTICopIG51bWJpdHM7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJhdHRlbXB0IHRvIGJyYW5jaCBpbnRvIGRpZmZlcmVudCBzZWdtZW50IikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJ0YXJnZXQgb2YgJXMgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBhIGxhYmVsIiksIGlmbXRQKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGdldF9pc3BlYzoJcGFyc2UgYSBtZW1vcnkgb3BlcmFuZCBmb3IgYW4gaW5kZXggc3BlY2lmaWNhdGlvbgotCi0gIAlIZXJlLCBhbiAiaW5kZXggc3BlY2lmaWNhdGlvbiIgaXMgdGFrZW4gdG8gYmUgYW55dGhpbmcgc3Vycm91bmRlZAotICAJYnkgc3F1YXJlIGJyYWNrZXRzIGFuZCBOT1QgZm9sbG93ZWQgYnkgYW55dGhpbmcgZWxzZS4KLQotICAJSWYgaXQncyBmb3VuZCwgZGV0YWNoIGl0IGZyb20gdGhlIGlucHV0IHN0cmluZywgcmVtb3ZlIHRoZSBzdXJyb3VuZGluZwotICAJc3F1YXJlIGJyYWNrZXRzLCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4gIE90aGVyd2lzZSwgcmV0dXJuIE5VTEwuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLWNoYXIgKgotZ2V0X2lzcGVjICh0ZXh0UCkKLSAgICAgLyogUG9pbnRlciB0byBtZW1vcnkgb3BlcmFuZCBmcm9tIHNvdXJjZSBpbnN0cnVjdGlvbiwgbm8gd2hpdGUgc3BhY2UuICAqLwotICAgICBjaGFyICp0ZXh0UDsKLXsKLSAgLyogUG9pbnRzIHRvIHN0YXJ0IG9mIGluZGV4IHNwZWNpZmljYXRpb24uICAqLwotICBjaGFyICpzdGFydDsKLSAgLyogUG9pbnRzIHRvIGVuZCBvZiBpbmRleCBzcGVjaWZpY2F0aW9uLiAgKi8KLSAgY2hhciAqZW5kOwotCi0gIC8qIEZpbmQgb3BlbmluZyBzcXVhcmUgYnJhY2tldCwgaWYgYW55LiAgKi8KLSAgc3RhcnQgPSBzdHJjaHIgKHRleHRQLCAnWycpOwotCi0gIGlmIChzdGFydCAhPSBOVUxMKQotICAgIHsKLQotICAgICAgLyogRWxpbWluYXRlICdbJywgZGV0YWNoIGZyb20gcmVzdCBvZiBvcGVyYW5kICovCi0gICAgICAqc3RhcnQrKyA9ICdcMCc7Ci0KLSAgICAgIGVuZCA9IHN0cmNociAoc3RhcnQsICddJyk7Ci0KLSAgICAgIGlmIChlbmQgPT0gTlVMTCkKLQl7Ci0JICBhc19iYWQgKF8oInVubWF0Y2hlZCAnWyciKSk7Ci0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRWxpbWluYXRlICddJyBhbmQgbWFrZSBzdXJlIGl0IHdhcyB0aGUgbGFzdCB0aGluZwotCSAgICAgKiBpbiB0aGUgc3RyaW5nLgotCSAgICovCi0JICAqZW5kID0gJ1wwJzsKLQkgIGlmICgqKGVuZCArIDEpICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImdhcmJhZ2UgYWZ0ZXIgaW5kZXggc3BlYyBpZ25vcmVkIikpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHN0YXJ0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGdldF9yZWdudW06Ci0KLSAgCUxvb2sgdXAgYSAoc3VzcGVjdGVkKSByZWdpc3RlciBuYW1lIGluIHRoZSByZWdpc3RlciB0YWJsZSBhbmQgcmV0dXJuIHRoZQotICAJYXNzb2NpYXRlZCByZWdpc3RlciBudW1iZXIgKG9yIC0xIGlmIG5vdCBmb3VuZCkuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLWludAotZ2V0X3JlZ251bSAocmVnbmFtZSkKLSAgICAgY2hhciAqcmVnbmFtZTsJCS8qIFN1c3BlY3RlZCByZWdpc3RlciBuYW1lICovCi17Ci0gIGludCAqclA7Ci0KLSAgclAgPSAoaW50ICopIGhhc2hfZmluZCAocmVnX2hhc2gsIHJlZ25hbWUpOwotICByZXR1cm4gKHJQID09IE5VTEwpID8gLTEgOiAqclA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBpX3NjYW46CXBlcmZvcm0gbGV4aWNhbCBzY2FuIG9mIGFzY2lpIGFzc2VtYmxlciBpbnN0cnVjdGlvbi4KLQotICAgSW5wdXQgYXNzdW1wdGlvbnM6Ci0gIAktIGlucHV0IHN0cmluZyBpcyBhbiBpODA5NjAgaW5zdHJ1Y3Rpb24gKG5vdCBhIHBzZXVkby1vcCkKLSAgCS0gYWxsIGNvbW1lbnRzIGFuZCBsYWJlbHMgaGF2ZSBiZWVuIHJlbW92ZWQKLSAgCS0gYWxsIHN0cmluZ3Mgb2Ygd2hpdGVzcGFjZSBoYXZlIGJlZW4gY29sbGFwc2VkIHRvIGEgc2luZ2xlIGJsYW5rLgotCi0gICBPdXRwdXQ6Ci0gIAlhcmdzWzBdIHBvaW50cyB0byBvcGNvZGUsIG90aGVyIGVudHJpZXMgcG9pbnQgdG8gb3BlcmFuZHMuIEFsbCBzdHJpbmdzOgotICAJLSBhcmUgTlVMTC10ZXJtaW5hdGVkCi0gIAktIGNvbnRhaW4gbm8gd2hpdGVzcGFjZQotICAJLSBoYXZlIGNoYXJhY3RlciBjb25zdGFudHMgKCd4JykgcmVwbGFjZWQgd2l0aCBhIGRlY2ltYWwgbnVtYmVyCi0KLSAgIFJldHVybiB2YWx1ZToKLSAgCU51bWJlciBvZiBvcGVyYW5kcyAoMCwxLDIsIG9yIDMpIG9yIC0xIG9uIGVycm9yLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIGludAotaV9zY2FuIChpUCwgYXJncykKLSAgICAgLyogUG9pbnRlciB0byBhc2NpaSBpbnN0cnVjdGlvbjsgIE1VQ0tFRCBCWSBVUy4gKi8KLSAgICAgcmVnaXN0ZXIgY2hhciAqaVA7Ci0gICAgIC8qIE91dHB1dCBhcmc6IHBvaW50ZXJzIHRvIG9wY29kZSBhbmQgb3BlcmFuZHMgcGxhY2VkIGhlcmUuICBNVVNUCi0JQUNDT01NT0RBVEUgNCBFTlRSSUVTLiAgKi8KLSAgICAgY2hhciAqYXJnc1tdOwotewotCi0gIC8qIElzb2xhdGUgb3Bjb2RlICovCi0gIGlmICgqKGlQKSA9PSAnICcpCi0gICAgewotICAgICAgaVArKzsKLSAgICB9CQkJCS8qIFNraXAgbGVhZCBzcGFjZSwgaWYgYW55ICovCi0gIGFyZ3NbMF0gPSBpUDsKLSAgZm9yICg7ICppUCAhPSAnICc7IGlQKyspCi0gICAgewotICAgICAgaWYgKCppUCA9PSAnXDAnKQotCXsKLQkgIC8qIFRoZXJlIGFyZSBubyBvcGVyYW5kcyAqLwotCSAgaWYgKGFyZ3NbMF0gPT0gaVApCi0JICAgIHsKLQkgICAgICAvKiBXZSBuZXZlciBtb3ZlZDogdGhlcmUgd2FzIG5vIG9wY29kZSBlaXRoZXIhICovCi0JICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wY29kZSIpKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gICppUCsrID0gJ1wwJzsJCQkvKiBUZXJtaW5hdGUgb3Bjb2RlICovCi0gIHJldHVybiAoZ2V0X2FyZ3MgKGlQLCBhcmdzKSk7Ci19CQkJCS8qIGlfc2NhbigpICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZW1fZm10OglnZW5lcmF0ZSBhIE1FTUEtIG9yIE1FTUItZm9ybWF0IGluc3RydWN0aW9uCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgdm9pZAotbWVtX2ZtdCAoYXJncywgb1AsIGNhbGx4KQotICAgICBjaGFyICphcmdzW107CQkvKiBhcmdzWzBdLT5vcGNvZGUgbW5lbW9uaWMsIGFyZ3NbMS0zXS0+b3BlcmFuZHMgKi8KLSAgICAgc3RydWN0IGk5NjBfb3Bjb2RlICpvUDsJLyogUG9pbnRlciB0byBkZXNjcmlwdGlvbiBvZiBpbnN0cnVjdGlvbiAqLwotICAgICBpbnQgY2FsbHg7CQkJLyogSXMgdGhpcyBhIGNhbGx4IG9wY29kZSAqLwotewotICBpbnQgaTsJCQkvKiBMb29wIGNvdW50ZXIgKi8KLSAgc3RydWN0IHJlZ29wIHJlZ29wOwkJLyogRGVzY3JpcHRpb24gb2YgcmVnaXN0ZXIgb3BlcmFuZCAqLwotICBjaGFyIG9wZGVzYzsJCQkvKiBPcGVyYW5kIGRlc2NyaXB0b3IgYnl0ZSAqLwotICBtZW1TIGluc3RyOwkJCS8qIERlc2NyaXB0aW9uIG9mIGJpbmFyeSB0byBiZSBvdXRwdXQgKi8KLSAgY2hhciAqb3V0UDsJCQkvKiBXaGVyZSB0aGUgYmluYXJ5IHdhcyBvdXRwdXQgdG8gKi8KLSAgZXhwcmVzc2lvblMgZXhwcjsJCS8qIFBhcnNlZCBleHByZXNzaW9uICovCi0gIC8qIC0+ZGVzY3JpcHRpb24gb2YgZGVmZXJyZWQgYWRkcmVzcyBmaXh1cCAqLwotICBmaXhTICpmaXhQOwotCi0jaWZkZWYgT0JKX0NPRkYKLSAgLyogQ09GRiBzdXBwb3J0IGlzbid0IGluIHBsYWNlIHlldCBmb3IgY2FsbHggcmVsYXhpbmcuICAqLwotICBjYWxseCA9IDA7Ci0jZW5kaWYKLQotICBtZW1zZXQgKCZpbnN0ciwgJ1wwJywgc2l6ZW9mIChtZW1TKSk7Ci0gIGluc3RyLm9wY29kZSA9IG9QLT5vcGNvZGU7Ci0KLSAgLyogUHJvY2VzcyBvcGVyYW5kcy4gKi8KLSAgZm9yIChpID0gMTsgaSA8PSBvUC0+bnVtX29wczsgaSsrKQotICAgIHsKLSAgICAgIG9wZGVzYyA9IG9QLT5vcGVyYW5kW2kgLSAxXTsKLQotICAgICAgaWYgKE1FTU9QIChvcGRlc2MpKQotCXsKLQkgIHBhcnNlX21lbW9wICgmaW5zdHIsIGFyZ3NbaV0sIG9QLT5mb3JtYXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwYXJzZV9yZWdvcCAoJnJlZ29wLCBhcmdzW2ldLCBvcGRlc2MpOwotCSAgaW5zdHIub3Bjb2RlIHw9IHJlZ29wLm4gPDwgMTk7Ci0JfQotICAgIH0KLQotICAvKiBQYXJzZSB0aGUgZGlzcGxhY2VtZW50OyB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgZW1pdHRpbmcgdGhlCi0gICAgIG9wY29kZSwgaW4gY2FzZSBpdCBpcyBhbiBleHByZXNzaW9uIHVzaW5nIGAuJy4gICovCi0gIHBhcnNlX2V4cHIgKGluc3RyLmUsICZleHByKTsKLQotICAvKiBPdXRwdXQgb3Bjb2RlICovCi0gIG91dFAgPSBlbWl0IChpbnN0ci5vcGNvZGUpOwotCi0gIGlmIChpbnN0ci5kaXNwID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBQcm9jZXNzIHRoZSBkaXNwbGFjZW1lbnQgKi8KLSAgc3dpdGNoIChleHByLlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsOgotICAgICAgYXNfYmFkIChfKCJleHByZXNzaW9uIHN5bnRheCBlcnJvciIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgaWYgKGluc3RyLmRpc3AgPT0gMzIpCi0JewotCSAgKHZvaWQpIGVtaXQgKG9mZnMgKGV4cHIpKTsJLyogT3V0cHV0IGRpc3BsYWNlbWVudCAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiAxMi1iaXQgZGlzcGxhY2VtZW50ICovCi0JICBpZiAob2ZmcyAoZXhwcikgJiB+MHhmZmYpCi0JICAgIHsKLQkgICAgICAvKiBXb24ndCBmaXQgaW4gMTIgYml0czogY29udmVydCBhbHJlYWR5LW91dHB1dAotCSAgICAgICAqIGluc3RydWN0aW9uIHRvIE1FTUIgZm9ybWF0LCBvdXRwdXQKLQkgICAgICAgKiBkaXNwbGFjZW1lbnQuCi0JICAgICAgICovCi0JICAgICAgbWVtYV90b19tZW1iIChvdXRQKTsKLQkgICAgICAodm9pZCkgZW1pdCAob2ZmcyAoZXhwcikpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXSUxMIGZpdCBpbiAxMiBiaXRzOiAgT1IgaW50byBvcGNvZGUgYW5kCi0JICAgICAgICogb3ZlcndyaXRlIHRoZSBiaW5hcnkgd2UgYWxyZWFkeSBwdXQgb3V0Ci0JICAgICAgICovCi0JICAgICAgaW5zdHIub3Bjb2RlIHw9IG9mZnMgKGV4cHIpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAob3V0UCwgaW5zdHIub3Bjb2RlLCA0KTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChpbnN0ci5kaXNwID09IDEyKQotCXsKLQkgIC8qIERpc3BsYWNlbWVudCBpcyBkZXBlbmRlbnQgb24gYSBzeW1ib2wsIHdob3NlIHZhbHVlCi0JICAgKiBtYXkgY2hhbmdlIGF0IGxpbmsgdGltZS4gIFdlIEhBVkUgdG8gcmVzZXJ2ZSAzMiBiaXRzLgotCSAgICogQ29udmVydCBhbHJlYWR5LW91dHB1dCBvcGNvZGUgdG8gTUVNQiBmb3JtYXQuCi0JICAgKi8KLQkgIG1lbWFfdG9fbWVtYiAob3V0UCk7Ci0JfQotCi0gICAgICAvKiBPdXRwdXQgMCBkaXNwbGFjZW1lbnQgYW5kIHNldCB1cCBhZGRyZXNzIGZpeHVwIGZvciB3aGVuCi0gICAgICAgKiB0aGlzIHN5bWJvbCdzIHZhbHVlIGJlY29tZXMga25vd24uCi0gICAgICAgKi8KLSAgICAgIG91dFAgPSBlbWl0ICgobG9uZykgMCk7Ci0gICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICBvdXRQIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgIDQsCi0JCQkgICZleHByLAotCQkJICAwLAotCQkJICBOT19SRUxPQyk7Ci0gICAgICAvKiBTdGV2ZSdzIGxpbmtlciByZWxheGluZyBoYWNrLiAgTWFyayB0aGlzIDMyLWJpdCByZWxvY2F0aW9uIGFzCi0gICAgICAgICBiZWluZyBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLCBzcGVjaWZpY2FsbHkgYXMgcGFydCBvZiBhIGNhbGx4Ci0gICAgICAgICBpbnN0cnVjdGlvbi4gICovCi0gICAgICBmaXhQLT5meF9ic3IgPSBjYWxseDsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0JCQkJLyogbWVtZm10KCkgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1lbWFfdG9fbWVtYjoJY29udmVydCBhIE1FTUEtZm9ybWF0IG9wY29kZSB0byBhIE1FTUItZm9ybWF0IG9wY29kZS4KLQotICAgVGhlcmUgYXJlIDIgcG9zc2libGUgTUVNQSBmb3JtYXRzOgotICAJLSBkaXNwbGFjZW1lbnQgb25seQotICAJLSBkaXNwbGFjZW1lbnQgKyBhYmFzZQotCi0gICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSBzZXR0aW5nIG9mIHRoZSBNRU1BX0FCQVNFIGJpdC4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkCi1tZW1hX3RvX21lbWIgKG9wY29kZVApCi0gICAgIGNoYXIgKm9wY29kZVA7CQkvKiBXaGVyZSB0byBmaW5kIHRoZSBvcGNvZGUsIGluIHRhcmdldCBieXRlIG9yZGVyICovCi17Ci0gIGxvbmcgb3Bjb2RlOwkJCS8qIE9wY29kZSBpbiBob3N0IGJ5dGUgb3JkZXIgKi8KLSAgbG9uZyBtb2RlOwkJCS8qIE1vZGUgYml0cyBmb3IgTUVNQiBpbnN0cnVjdGlvbiAqLwotCi0gIG9wY29kZSA9IG1kX2NoYXJzX3RvX251bWJlciAob3Bjb2RlUCwgNCk7Ci0gIGtub3cgKCEob3Bjb2RlICYgTUVNQl9CSVQpKTsKLQotICBtb2RlID0gTUVNQl9CSVQgfCBEX0JJVDsKLSAgaWYgKG9wY29kZSAmIE1FTUFfQUJBU0UpCi0gICAgewotICAgICAgbW9kZSB8PSBBX0JJVDsKLSAgICB9Ci0KLSAgb3Bjb2RlICY9IDB4ZmZmZmMwMDA7CQkvKiBDbGVhciBNRU1BIG9mZnNldCBhbmQgbW9kZSBiaXRzICovCi0gIG9wY29kZSB8PSBtb2RlOwkJLyogU2V0IE1FTUIgbW9kZSBiaXRzICovCi0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChvcGNvZGVQLCBvcGNvZGUsIDQpOwotfQkJCQkvKiBtZW1hX3RvX21lbWIoKSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgcGFyc2VfZXhwcjoJCXBhcnNlIGFuIGV4cHJlc3Npb24KLQotICAJVXNlIGJhc2UgYXNzZW1ibGVyJ3MgZXhwcmVzc2lvbiBwYXJzZXIgdG8gcGFyc2UgYW4gZXhwcmVzc2lvbi4KLSAgCUl0LCB1bmZvcnR1bmF0ZWx5LCBydW5zIG9mZiBhIGdsb2JhbCB3aGljaCB3ZSBoYXZlIHRvIHNhdmUvcmVzdG9yZQotICAJaW4gb3JkZXIgdG8gbWFrZSBpdCB3b3JrIGZvciB1cy4KLQotICAJQW4gZW1wdHkgZXhwcmVzc2lvbiBzdHJpbmcgaXMgdHJlYXRlZCBhcyBhbiBhYnNvbHV0ZSAwLgotCi0gIAlTZXRzIE9faWxsZWdhbCByZWdhcmRsZXNzIG9mIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBpZiBlbnRpcmUgaW5wdXQKLSAgCXN0cmluZyBpcyBub3QgY29uc3VtZWQgaW4gdGhlIGV2YWx1YXRpb24gLS0gdG9sZXJhdGUgbm8gZGFuZ2xpbmcganVuayEKLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkCi1wYXJzZV9leHByICh0ZXh0UCwgZXhwUCkKLSAgICAgY2hhciAqdGV4dFA7CQkvKiBUZXh0IG9mIGV4cHJlc3Npb24gdG8gYmUgcGFyc2VkICovCi0gICAgIGV4cHJlc3Npb25TICpleHBQOwkJLyogV2hlcmUgdG8gcHV0IHRoZSByZXN1bHRzIG9mIHBhcnNpbmcgKi8KLXsKLSAgY2hhciAqc2F2ZV9pbjsJCS8qIFNhdmUgZ2xvYmFsIGhlcmUgKi8KLSAgc3ltYm9sUyAqc3ltUDsKLQotICBrbm93ICh0ZXh0UCk7Ci0KLSAgaWYgKCp0ZXh0UCA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIFRyZWF0IGVtcHR5IHN0cmluZyBhcyBhYnNvbHV0ZSAwICovCi0gICAgICBleHBQLT5YX2FkZF9zeW1ib2wgPSBleHBQLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHBQLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsJLyogU2F2ZSBnbG9iYWwgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHRleHRQOwkvKiBNYWtlIHBhcnNlciB3b3JrIGZvciB1cyAqLwotCi0gICAgICAodm9pZCkgZXhwcmVzc2lvbiAoZXhwUCk7Ci0gICAgICBpZiAoKHNpemVfdCkgKGlucHV0X2xpbmVfcG9pbnRlciAtIHRleHRQKSAhPSBzdHJsZW4gKHRleHRQKSkKLQl7Ci0JICAvKiBEaWQgbm90IGNvbnN1bWUgYWxsIG9mIHRoZSBpbnB1dCAqLwotCSAgZXhwUC0+WF9vcCA9IE9faWxsZWdhbDsKLQl9Ci0gICAgICBzeW1QID0gZXhwUC0+WF9hZGRfc3ltYm9sOwotICAgICAgaWYgKHN5bVAgJiYgKGhhc2hfZmluZCAocmVnX2hhc2gsIFNfR0VUX05BTUUgKHN5bVApKSkpCi0JewotCSAgLyogUmVnaXN0ZXIgbmFtZSBpbiBhbiBleHByZXNzaW9uICovCi0JICAvKiBGSVhNRTogdGhpcyBpc24ndCBtdWNoIG9mIGEgY2hlY2sgYW55IG1vcmUuICAqLwotCSAgZXhwUC0+WF9vcCA9IE9faWxsZWdhbDsKLQl9Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47CS8qIFJlc3RvcmUgZ2xvYmFsICovCi0gICAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgcGFyc2VfbGRjb250OgotICAJUGFyc2UgYW5kIHJlcGxhY2UgYSAnbGRjb25zdCcgcHNldWRvLWluc3RydWN0aW9uIHdpdGggYW4gYXBwcm9wcmlhdGUKLSAgCWk4MDk2MCBpbnN0cnVjdGlvbi4KLQotICAJQXNzdW1lcyB0aGUgaW5wdXQgY29uc2lzdHMgb2Y6Ci0gIAkJYXJnWzBdCW9wY29kZSBtbmVtb25pYyAoJ2xkY29uc3QnKQotICAJCWFyZ1sxXSAgZmlyc3Qgb3BlcmFuZCAoY29uc3RhbnQpCi0gIAkJYXJnWzJdCW5hbWUgb2YgcmVnaXN0ZXIgdG8gYmUgbG9hZGVkCi0KLSAgCVJlcGxhY2VzIG9wY29kZSBhbmQvb3Igb3BlcmFuZHMgYXMgYXBwcm9wcmlhdGUuCi0KLSAgCVJldHVybnMgdGhlIG5ldyBudW1iZXIgb2YgYXJndW1lbnRzLCBvciAtMSBvbiBmYWlsdXJlLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi1pbnQKLXBhcnNlX2xkY29uc3QgKGFyZykKLSAgICAgY2hhciAqYXJnW107CQkvKiBTZWUgYWJvdmUgKi8KLXsKLSAgaW50IG47CQkJLyogQ29uc3RhbnQgdG8gYmUgbG9hZGVkICovCi0gIGludCBzaGlmdDsJCQkvKiBTaGlmdCBjb3VudCBmb3IgInNobG8iIGluc3RydWN0aW9uICovCi0gIHN0YXRpYyBjaGFyIGJ1Zls1XTsJCS8qIExpdGVyYWwgZm9yIGZpcnN0IG9wZXJhbmQgKi8KLSAgc3RhdGljIGNoYXIgYnVmMls1XTsJCS8qIExpdGVyYWwgZm9yIHNlY29uZCBvcGVyYW5kICovCi0gIGV4cHJlc3Npb25TIGU7CQkvKiBQYXJzZWQgZXhwcmVzc2lvbiAqLwotCi0KLSAgYXJnWzNdID0gTlVMTDsJCS8qIFNvIHdlIGNhbiB0ZWxsIGF0IHRoZSBlbmQgaWYgaXQgZ290IHVzZWQgb3Igbm90ICovCi0KLSAgcGFyc2VfZXhwciAoYXJnWzFdLCAmZSk7Ci0gIHN3aXRjaCAoZS5YX29wKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgLyogV2UncmUgZGVwZW5kZW50IG9uIG9uZSBvciBtb3JlIHN5bWJvbHMgLS0gdXNlICJsZGEiICovCi0gICAgICBhcmdbMF0gPSAibGRhIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgLyogVHJ5IHRoZSBmb2xsb3dpbmcgbWFwcGluZ3M6Ci0gICAgICAgKiAgICAgIGxkY29uc3QgMCw8cmVnPiAgLT5tb3YgIDAsPHJlZz4KLSAgICAgICAqICAgICAgICBsZGNvbnN0IDMxLDxyZWc+IC0+bW92ICAzMSw8cmVnPgotICAgICAgICogICAgICAgIGxkY29uc3QgMzIsPHJlZz4gLT5hZGRvIDEsMzEsPHJlZz4KLSAgICAgICAqICAgICAgICBsZGNvbnN0IDYyLDxyZWc+IC0+YWRkbyAzMSwzMSw8cmVnPgotICAgICAgICogICAgICAgIGxkY29uc3QgNjQsPHJlZz4gLT5zaGxvIDgsMyw8cmVnPgotICAgICAgICogICAgICAgIGxkY29uc3QgLTEsPHJlZz4gLT5zdWJvIDEsMCw8cmVnPgotICAgICAgICogICAgICAgIGxkY29uc3QgLTMxLDxyZWc+LT5zdWJvIDMxLDAsPHJlZz4KLSAgICAgICAqCi0gICAgICAgKiBhbnRoaW5nIGVsc2UgYmVjb21lczoKLSAgICAgICAqICAgICAgICBsZGEgeHh4LDxyZWc+Ci0gICAgICAgKi8KLSAgICAgIG4gPSBvZmZzIChlKTsKLSAgICAgIGlmICgoMCA8PSBuKSAmJiAobiA8PSAzMSkpCi0JewotCSAgYXJnWzBdID0gIm1vdiI7Ci0KLQl9Ci0gICAgICBlbHNlIGlmICgoLTMxIDw9IG4pICYmIChuIDw9IC0xKSkKLQl7Ci0JICBhcmdbMF0gPSAic3VibyI7Ci0JICBhcmdbM10gPSBhcmdbMl07Ci0JICBzcHJpbnRmIChidWYsICIlZCIsIC1uKTsKLQkgIGFyZ1sxXSA9IGJ1ZjsKLQkgIGFyZ1syXSA9ICIwIjsKLQotCX0KLSAgICAgIGVsc2UgaWYgKCgzMiA8PSBuKSAmJiAobiA8PSA2MikpCi0JewotCSAgYXJnWzBdID0gImFkZG8iOwotCSAgYXJnWzNdID0gYXJnWzJdOwotCSAgYXJnWzFdID0gIjMxIjsKLQkgIHNwcmludGYgKGJ1ZiwgIiVkIiwgbiAtIDMxKTsKLQkgIGFyZ1syXSA9IGJ1ZjsKLQotCX0KLSAgICAgIGVsc2UgaWYgKChzaGlmdCA9IHNoaWZ0X29rIChuKSkgIT0gMCkKLQl7Ci0JICBhcmdbMF0gPSAic2hsbyI7Ci0JICBhcmdbM10gPSBhcmdbMl07Ci0JICBzcHJpbnRmIChidWYsICIlZCIsIHNoaWZ0KTsKLQkgIGFyZ1sxXSA9IGJ1ZjsKLQkgIHNwcmludGYgKGJ1ZjIsICIlZCIsIG4gPj4gc2hpZnQpOwotCSAgYXJnWzJdID0gYnVmMjsKLQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhcmdbMF0gPSAibGRhIjsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19pbGxlZ2FsOgotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIGNvbnN0YW50IikpOwotICAgICAgcmV0dXJuIC0xOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gKGFyZ1szXSA9PSAwKSA/IDIgOiAzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHBhcnNlX21lbW9wOglwYXJzZSBhIG1lbW9yeSBvcGVyYW5kCi0KLSAgCVRoaXMgcm91dGluZSBpcyBiYXNlZCBvbiB0aGUgb2JzZXJ2YXRpb24gdGhhdCB0aGUgNCBtb2RlIGJpdHMgb2YgdGhlCi0gIAlNRU1CIGZvcm1hdCwgdGFrZW4gaW5kaXZpZHVhbGx5LCBoYXZlIGZhaXJseSBjb25zaXN0ZW50IG1lYW5pbmc6Ci0KLSAgCQkgTTMgKGJpdCAxMyk6IDEgaWYgZGlzcGxhY2VtZW50IGlzIHByZXNlbnQgKERfQklUKQotICAJCSBNMiAoYml0IDEyKTogMSBmb3IgTUVNQiBpbnN0cnVjdGlvbnMgKE1FTUJfQklUKQotICAJCSBNMSAoYml0IDExKTogMSBpZiBpbmRleCBpcyBwcmVzZW50IChJX0JJVCkKLSAgCQkgTTAgKGJpdCAxMCk6IDEgaWYgYWJhc2UgaXMgcHJlc2VudCAoQV9CSVQpCi0KLSAgCVNvIHdlIHBhcnNlIHRoZSBtZW1vcnkgb3BlcmFuZCBhbmQgc2V0IGJpdHMgaW4gdGhlIG1vZGUgYXMgd2UgZmluZAotICAJdGhpbmdzLiAgVGhlbiBhdCB0aGUgZW5kLCBpZiB3ZSBnbyB0byBNRU1CIGZvcm1hdCwgd2UgbmVlZCBvbmx5IHNldAotICAJdGhlIE1FTUIgYml0IChNMikgYW5kIG91ciBtb2RlIGlzIGJ1aWx0IGZvciB1cy4KLQotICAJVW5mb3J0dW5hdGVseSwgSSBzYWlkICJmYWlybHkgY29uc2lzdGVudCIuICBUaGUgZXhjZXB0aW9uczoKLQotICAJCSBEQklBCi0gIAkJIDAxMDAJV291bGQgc2VlbSBpbGxlZ2FsLCBidXQgbWVhbnMgImFiYXNlLW9ubHkiLgotCi0gIAkJIDAxMDEJV291bGQgc2VlbSB0byBtZWFuICJhYmFzZS1vbmx5IiAtLSBpdCBtZWFucyBJUC1yZWxhdGl2ZS4KLSAgCQkJTXVzdCBiZSBjb252ZXJ0ZWQgdG8gMDEwMC4KLQotICAJCSAwMTEwCVdvdWxkIHNlZW0gdG8gbWVhbiAiaW5kZXgtb25seSIsIGJ1dCBpcyByZXNlcnZlZC4KLSAgCQkJV2UgdHVybiBvbiB0aGUgRCBiaXQgYW5kIHByb3ZpZGUgYSAwIGRpc3BsYWNlbWVudC4KLQotICAJVGhlIG90aGVyIHRoaW5nIHRvIG9ic2VydmUgaXMgdGhhdCB3ZSBwYXJzZSBmcm9tIHRoZSByaWdodCwgcGVlbGluZwotICAJdGhpbmdzICogb2ZmIGFzIHdlIGdvOiAgZmlyc3QgYW55IGluZGV4IHNwZWMsIHRoZW4gYW55IGFiYXNlLCB0aGVuCi0gIAl0aGUgZGlzcGxhY2VtZW50LgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi12b2lkCi1wYXJzZV9tZW1vcCAobWVtUCwgYXJnUCwgb3B0eXBlKQotICAgICBtZW1TICptZW1QOwkJLyogV2hlcmUgdG8gcHV0IHRoZSByZXN1bHRzICovCi0gICAgIGNoYXIgKmFyZ1A7CQkvKiBUZXh0IG9mIHRoZSBvcGVyYW5kIHRvIGJlIHBhcnNlZCAqLwotICAgICBpbnQgb3B0eXBlOwkJLyogTUVNMSwgTUVNMiwgTUVNNCwgTUVNOCwgTUVNMTIsIG9yIE1FTTE2ICovCi17Ci0gIGNoYXIgKmluZGV4UDsJCQkvKiBQb2ludGVyIHRvIGluZGV4IHNwZWNpZmljYXRpb24gd2l0aCAiW10iIHJlbW92ZWQgKi8KLSAgY2hhciAqcDsJCQkvKiBUZW1wIGNoYXIgcG9pbnRlciAqLwotICBjaGFyIGlwcmVsX2ZsYWc7CQkvKiBUcnVlIGlmIHRoaXMgaXMgYW4gSVAtcmVsYXRpdmUgb3BlcmFuZCAqLwotICBpbnQgcmVnbnVtOwkJCS8qIFJlZ2lzdGVyIG51bWJlciAqLwotICAvKiBTY2FsZSBmYWN0b3I6IDEsMiw0LDgsIG9yIDE2LiAgTGF0ZXIgY29udmVydGVkIHRvIGludGVybmFsIGZvcm1hdAotICAgICAoMCwxLDIsMyw0IHJlc3BlY3RpdmVseSkuICAqLwotICBpbnQgc2NhbGU7Ci0gIGludCBtb2RlOwkJCS8qIE1FTUIgbW9kZSBiaXRzICovCi0gIGludCAqaW50UDsJCQkvKiBQb2ludGVyIHRvIHJlZ2lzdGVyIG51bWJlciAqLwotCi0gIC8qIFRoZSBmb2xsb3dpbmcgdGFibGUgY29udGFpbnMgdGhlIGRlZmF1bHQgc2NhbGUgZmFjdG9ycyBmb3IgZWFjaAotICAgICB0eXBlIG9mIG1lbW9yeSBpbnN0cnVjdGlvbi4gIEl0IGlzIGFjY2Vzc2VkIHVzaW5nIChvcHR5cGUtTUVNMSkKLSAgICAgYXMgYW4gaW5kZXggLS0gdGh1cyBpdCBhc3N1bWVzIHRoZSAnb3B0eXBlJyBjb25zdGFudHMgYXJlCi0gICAgIGFzc2lnbmVkIGNvbnNlY3V0aXZlIHZhbHVlcywgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoaXMKLSAgICAgdGFibGUuICAqLwotICBzdGF0aWMgY29uc3QgaW50IGRlZl9zY2FsZVtdID0KLSAgewotICAgIDEsCQkJCS8qIE1FTTEgKi8KLSAgICAyLAkJCQkvKiBNRU0yICovCi0gICAgNCwJCQkJLyogTUVNNCAqLwotICAgIDgsCQkJCS8qIE1FTTggKi8KLSAgICAtMSwJCQkJLyogTUVNMTIgLS0gbm8gdmFsaWQgZGVmYXVsdCAqLwotICAgIDE2CQkJCS8qIE1FTTE2ICovCi0gIH07Ci0KLQotICBpcHJlbF9mbGFnID0gbW9kZSA9IDA7Ci0KLSAgLyogQW55IGluZGV4IHByZXNlbnQ/ICovCi0gIGluZGV4UCA9IGdldF9pc3BlYyAoYXJnUCk7Ci0gIGlmIChpbmRleFApCi0gICAgewotICAgICAgcCA9IHN0cmNociAoaW5kZXhQLCAnKicpOwotICAgICAgaWYgKHAgPT0gTlVMTCkKLQl7Ci0JICAvKiBObyBleHBsaWNpdCBzY2FsZSAtLSB1c2UgZGVmYXVsdCBmb3IgdGhpcyBpbnN0cnVjdGlvbgotCSAgICAgdHlwZSBhbmQgYXNzZW1ibGVyIG1vZGUuICAqLwotCSAgaWYgKGZsYWdfbXJpKQotCSAgICBzY2FsZSA9IDE7Ci0JICBlbHNlCi0JICAgIC8qIEdOVTk2MCBjb21wYXRpYmlsaXR5ICovCi0JICAgIHNjYWxlID0gZGVmX3NjYWxlW29wdHlwZSAtIE1FTTFdOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqcCsrID0gJ1wwJzsJCS8qIEVsaW1pbmF0ZSAnKicgKi8KLQotCSAgLyogTm93IGluZGV4UC0+YSAnXDAnLXRlcm1pbmF0ZWQgcmVnaXN0ZXIgbmFtZSwKLQkgICAgICogYW5kIHAtPmEgc2NhbGUgZmFjdG9yLgotCSAgICovCi0KLQkgIGlmICghc3RyY21wIChwLCAiMTYiKSkKLQkgICAgewotCSAgICAgIHNjYWxlID0gMTY7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNociAoIjEyNDgiLCAqcCkgJiYgKHBbMV0gPT0gJ1wwJykpCi0JICAgIHsKLQkgICAgICBzY2FsZSA9ICpwIC0gJzAnOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzY2FsZSA9IC0xOwotCSAgICB9Ci0JfQotCi0gICAgICByZWdudW0gPSBnZXRfcmVnbnVtIChpbmRleFApOwkvKiBHZXQgaW5kZXggcmVnLiAjICovCi0gICAgICBpZiAoIUlTX1JHX1JFRyAocmVnbnVtKSkKLQl7Ci0JICBhc19iYWQgKF8oImludmFsaWQgaW5kZXggcmVnaXN0ZXIiKSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBDb252ZXJ0IHNjYWxlIHRvIGl0cyBiaW5hcnkgZW5jb2RpbmcgKi8KLSAgICAgIHN3aXRjaCAoc2NhbGUpCi0JewotCWNhc2UgMToKLQkgIHNjYWxlID0gMCA8PCA3OwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgc2NhbGUgPSAxIDw8IDc7Ci0JICBicmVhazsKLQljYXNlIDQ6Ci0JICBzY2FsZSA9IDIgPDwgNzsKLQkgIGJyZWFrOwotCWNhc2UgODoKLQkgIHNjYWxlID0gMyA8PCA3OwotCSAgYnJlYWs7Ci0JY2FzZSAxNjoKLQkgIHNjYWxlID0gNCA8PCA3OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFzX2JhZCAoXygiaW52YWxpZCBzY2FsZSBmYWN0b3IiKSk7Ci0JICByZXR1cm47Ci0JfTsKLQotICAgICAgbWVtUC0+b3Bjb2RlIHw9IHNjYWxlIHwgcmVnbnVtOwkvKiBTZXQgaW5kZXggYml0cyBpbiBvcGNvZGUgKi8KLSAgICAgIG1vZGUgfD0gSV9CSVQ7CQkvKiBGb3VuZCBhIHZhbGlkIGluZGV4IHNwZWMgKi8KLSAgICB9Ci0KLSAgLyogQW55IGFiYXNlIChSZWdpc3RlciBJbmRpcmVjdCkgc3BlY2lmaWNhdGlvbiBwcmVzZW50PyAqLwotICBpZiAoKHAgPSBzdHJyY2hyIChhcmdQLCAnKCcpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qICIoIiBpcyB0aGVyZSAtLSBkb2VzIGl0IHN0YXJ0IGEgbGVnYWwgYWJhc2Ugc3BlYz8gIElmIG5vdCwgaXQKLSAgICAgICAgIGNvdWxkIGJlIHBhcnQgb2YgYSBkaXNwbGFjZW1lbnQgZXhwcmVzc2lvbi4gICovCi0gICAgICBpbnRQID0gKGludCAqKSBoYXNoX2ZpbmQgKGFyZWdfaGFzaCwgcCk7Ci0gICAgICBpZiAoaW50UCAhPSBOVUxMKQotCXsKLQkgIC8qIEdvdCBhbiBhYmFzZSBoZXJlICovCi0JICByZWdudW0gPSAqaW50UDsKLQkgICpwID0gJ1wwJzsJCS8qIGRpc2NhcmQgcmVnaXN0ZXIgc3BlYyAqLwotCSAgaWYgKHJlZ251bSA9PSBJUFJFTCkKLQkgICAgewotCSAgICAgIC8qIFdlIGhhdmUgdG8gc3BlY2lhbGNhc2UgaXAtcmVsIG1vZGUgKi8KLQkgICAgICBpcHJlbF9mbGFnID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWVtUC0+b3Bjb2RlIHw9IHJlZ251bSA8PCAxNDsKLQkgICAgICBtb2RlIHw9IEFfQklUOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBBbnkgZXhwcmVzc2lvbiBwcmVzZW50PyAqLwotICBtZW1QLT5lID0gYXJnUDsKLSAgaWYgKCphcmdQICE9ICdcMCcpCi0gICAgewotICAgICAgbW9kZSB8PSBEX0JJVDsKLSAgICB9Ci0KLSAgLyogU3BlY2lhbC1jYXNlIGlwLXJlbGF0aXZlIGFkZHJlc3NpbmcgKi8KLSAgaWYgKGlwcmVsX2ZsYWcpCi0gICAgewotICAgICAgaWYgKG1vZGUgJiBJX0JJVCkKLQl7Ci0JICBzeW50YXggKCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lbVAtPm9wY29kZSB8PSA1IDw8IDEwOwkvKiBJUC1yZWxhdGl2ZSBtb2RlICovCi0JICBtZW1QLT5kaXNwID0gMzI7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBIYW5kbGUgYWxsIG90aGVyIG1vZGVzICovCi0gIHN3aXRjaCAobW9kZSkKLSAgICB7Ci0gICAgY2FzZSBEX0JJVCB8IEFfQklUOgotICAgICAgLyogR28gd2l0aCBNRU1BIGluc3RydWN0aW9uIGZvcm1hdCBmb3Igbm93IChncm93IHRvIE1FTUIgbGF0ZXIKLSAgICAgICAgIGlmIDEyIGJpdHMgaXMgbm90IGVub3VnaCBmb3IgdGhlIGRpc3BsYWNlbWVudCkuICBNRU1BIGZvcm1hdAotICAgICAgICAgaGFzIGEgc2luZ2xlIG1vZGUgYml0OiBzZXQgaXQgdG8gaW5kaWNhdGUgdGhhdCBhYmFzZSBpcwotICAgICAgICAgcHJlc2VudC4gICovCi0gICAgICBtZW1QLT5vcGNvZGUgfD0gTUVNQV9BQkFTRTsKLSAgICAgIG1lbVAtPmRpc3AgPSAxMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEX0JJVDoKLSAgICAgIC8qIEdvIHdpdGggTUVNQSBpbnN0cnVjdGlvbiBmb3JtYXQgZm9yIG5vdyAoZ3JvdyB0byBNRU1CIGxhdGVyCi0gICAgICAgICBpZiAxMiBiaXRzIGlzIG5vdCBlbm91Z2ggZm9yIHRoZSBkaXNwbGFjZW1lbnQpLiAgKi8KLSAgICAgIG1lbVAtPmRpc3AgPSAxMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBX0JJVDoKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIGJpdCBzdHJpbmcgZm9yIHRoaXMgbW9kZSBpcyBub3QKLSAgICAgICAgIGNvbnNpc3RlbnQ6IGl0IHNob3VsZCBiZSAwIChleGNsdXNpdmUgb2YgdGhlIE1FTUIgYml0KSwgc28gd2UKLSAgICAgICAgIHNldCBpdCAiYnkgaGFuZCIgaGVyZS4gICovCi0gICAgICBtZW1QLT5vcGNvZGUgfD0gTUVNQl9CSVQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQV9CSVQgfCBJX0JJVDoKLSAgICAgIC8qIHNldCBNRU1CIGJpdCBpbiBtb2RlLCBhbmQgT1IgaW4gbW9kZSBiaXRzICovCi0gICAgICBtZW1QLT5vcGNvZGUgfD0gbW9kZSB8IE1FTUJfQklUOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIElfQklUOgotICAgICAgLyogVHJlYXQgbWlzc2luZyBkaXNwbGFjZW1lbnQgYXMgZGlzcGxhY2VtZW50IG9mIDAuICAqLwotICAgICAgbW9kZSB8PSBEX0JJVDsKLSAgICAgIC8qIEZhbGwgaW50byBuZXh0IGNhc2UuICAqLwotICAgIGNhc2UgRF9CSVQgfCBBX0JJVCB8IElfQklUOgotICAgIGNhc2UgRF9CSVQgfCBJX0JJVDoKLSAgICAgIC8qIHNldCBNRU1CIGJpdCBpbiBtb2RlLCBhbmQgT1IgaW4gbW9kZSBiaXRzICovCi0gICAgICBtZW1QLT5vcGNvZGUgfD0gbW9kZSB8IE1FTUJfQklUOwotICAgICAgbWVtUC0+ZGlzcCA9IDMyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3ludGF4ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHBhcnNlX3BvOglwYXJzZSBtYWNoaW5lLWRlcGVuZGVudCBwc2V1ZG8tb3AKLQotICAJVGhpcyBpcyBhIHRvcC1sZXZlbCByb3V0aW5lIGZvciBtYWNoaW5lLWRlcGVuZGVudCBwc2V1ZG8tb3BzLiAgSXQgc2x1cnBzCi0gIAl1cCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQgbGluZSwgYnJlYWtzIG91dCB0aGUgaW5kaXZpZHVhbCBhcmd1bWVudHMsCi0gIAlhbmQgZGlzcGF0Y2hlcyB0aGVtIHRvIHRoZSBjb3JyZWN0IGhhbmRsZXIuCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi12b2lkCi1wYXJzZV9wbyAocG9fbnVtKQotICAgICBpbnQgcG9fbnVtOwkJLyogUHNldWRvLW9wIG51bWJlcjogIGN1cnJlbnRseSBTX0xFQUZQUk9DIG9yIFNfU1lTUFJPQyAqLwotewotICAvKiBQb2ludGVycyBvcGVyYW5kcywgd2l0aCBubyBlbWJlZGRlZCB3aGl0ZXNwYWNlLgotICAgICBhcmdbMF0gdW51c2VkLCBhcmdbMS0zXS0+b3BlcmFuZHMgKi8KLSAgY2hhciAqYXJnc1s0XTsKLSAgaW50IG5fb3BzOwkJCS8qIE51bWJlciBvZiBvcGVyYW5kcyAqLwotICBjaGFyICpwOwkJCS8qIFBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIHVucGFyc2VkIGFyZ3VtZW50IHN0cmluZyAqLwotICBjaGFyIGVvbDsJCQkvKiBDaGFyYWN0ZXIgdGhhdCBpbmRpY2F0ZWQgZW5kIG9mIGxpbmUgKi8KLQotICBleHRlcm4gY2hhciBpc19lbmRfb2ZfbGluZVtdOwotCi0gIC8qIEFkdmFuY2UgaW5wdXQgcG9pbnRlciB0byBlbmQgb2YgbGluZS4gKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBlb2wgPSAqaW5wdXRfbGluZV9wb2ludGVyOwkvKiBTYXZlIGVuZC1vZi1saW5lIGNoYXIgKi8KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7CS8qIFRlcm1pbmF0ZSBhcmd1bWVudCBsaXN0ICovCi0KLSAgLyogUGFyc2Ugb3V0IG9wZXJhbmRzICovCi0gIG5fb3BzID0gZ2V0X2FyZ3MgKHAsIGFyZ3MpOwotICBpZiAobl9vcHMgPT0gLTEpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBEaXNwYXRjaCB0byBjb3JyZWN0IGhhbmRsZXIgKi8KLSAgc3dpdGNoIChwb19udW0pCi0gICAgewotICAgIGNhc2UgU19TWVNQUk9DOgotICAgICAgc19zeXNwcm9jIChuX29wcywgYXJncyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNfTEVBRlBST0M6Ci0gICAgICBzX2xlYWZwcm9jIChuX29wcywgYXJncyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKHBvX251bSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogUmVzdG9yZSBlb2wsIHNvIGxpbmUgbnVtYmVycyBnZXQgdXBkYXRlZCBjb3JyZWN0bHkuICBCYXNlCi0gICAgIGFzc2VtYmxlciBhc3N1bWVzIHdlIGxlYXZlIGlucHV0IHBvaW50ZXIgcG9pbnRpbmcgYXQgY2hhcgotICAgICBmb2xsb3dpbmcgdGhlIGVvbC4gICovCi0gICppbnB1dF9saW5lX3BvaW50ZXIrKyA9IGVvbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBwYXJzZV9yZWdvcDogcGFyc2UgYSByZWdpc3RlciBvcGVyYW5kLgotCi0gIAlJbiBjYXNlIG9mIGlsbGVnYWwgb3BlcmFuZCwgaXNzdWUgYSBtZXNzYWdlIGFuZCByZXR1cm4gc29tZSB2YWxpZAotICAJaW5mb3JtYXRpb24gc28gaW5zdHJ1Y3Rpb24gcHJvY2Vzc2luZyBjYW4gY29udGludWUuCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi12b2lkCi1wYXJzZV9yZWdvcCAocmVnb3BQLCBvcHRleHQsIG9wZGVzYykKLSAgICAgc3RydWN0IHJlZ29wICpyZWdvcFA7CS8qIFdoZXJlIHRvIHB1dCBkZXNjcmlwdGlvbiBvZiByZWdpc3RlciBvcGVyYW5kICovCi0gICAgIGNoYXIgKm9wdGV4dDsJCS8qIFRleHQgb2Ygb3BlcmFuZCAqLwotICAgICBjaGFyIG9wZGVzYzsJCS8qIERlc2NyaXB0b3IgYnl0ZTogIHdoYXQncyBsZWdhbCBmb3IgdGhpcyBvcGVyYW5kICovCi17Ci0gIGludCBuOwkJCS8qIFJlZ2lzdGVyIG51bWJlciAqLwotICBleHByZXNzaW9uUyBlOwkJLyogUGFyc2VkIGV4cHJlc3Npb24gKi8KLQotICAvKiBTZWUgaWYgb3BlcmFuZCBpcyBhIHJlZ2lzdGVyICovCi0gIG4gPSBnZXRfcmVnbnVtIChvcHRleHQpOwotICBpZiAobiA+PSAwKQotICAgIHsKLSAgICAgIGlmIChJU19SR19SRUcgKG4pKQotCXsKLQkgIC8qIGdsb2JhbCBvciBsb2NhbCByZWdpc3RlciAqLwotCSAgaWYgKCFSRUdfQUxJR04gKG9wZGVzYywgbikpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInVuYWxpZ25lZCByZWdpc3RlciIpKTsKLQkgICAgfQotCSAgcmVnb3BQLT5uID0gbjsKLQkgIHJlZ29wUC0+bW9kZSA9IDA7Ci0JICByZWdvcFAtPnNwZWNpYWwgPSAwOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKElTX0ZQX1JFRyAobikgJiYgRlBfT0sgKG9wZGVzYykpCi0JewotCSAgLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIsIGFuZCBpdCdzIGFsbG93ZWQgKi8KLQkgIHJlZ29wUC0+biA9IG4gLSBGUDA7Ci0JICByZWdvcFAtPm1vZGUgPSAxOwotCSAgcmVnb3BQLT5zcGVjaWFsID0gMDsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChJU19TRl9SRUcgKG4pICYmIFNGUl9PSyAob3BkZXNjKSkKLQl7Ci0JICAvKiBTcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVyLCBhbmQgaXQncyBhbGxvd2VkICovCi0JICByZWdvcFAtPm4gPSBuIC0gU0YwOwotCSAgcmVnb3BQLT5tb2RlID0gMDsKLQkgIHJlZ29wUC0+c3BlY2lhbCA9IDE7Ci0JICBpZiAoIXRhcmdfaGFzX3NmciAocmVnb3BQLT5uKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygibm8gc3VjaCBzZnIgaW4gdGhpcyBhcmNoaXRlY3R1cmUiKSk7Ci0JICAgIH0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChMSVRfT0sgKG9wZGVzYykpCi0gICAgewotICAgICAgLyogSG93IGFib3V0IGEgbGl0ZXJhbD8gICovCi0gICAgICByZWdvcFAtPm1vZGUgPSAxOwotICAgICAgcmVnb3BQLT5zcGVjaWFsID0gMDsKLSAgICAgIGlmIChGUF9PSyAob3BkZXNjKSkKLQl7CQkJLyogZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbCBhY2NlcHRhYmxlICovCi0JICAvKiBTa2lwIG92ZXIgMGYsIDBkLCBvciAwZSBwcmVmaXggKi8KLQkgIGlmICgob3B0ZXh0WzBdID09ICcwJykKLQkgICAgICAmJiAob3B0ZXh0WzFdID49ICdkJykKLQkgICAgICAmJiAob3B0ZXh0WzFdIDw9ICdmJykpCi0JICAgIHsKLQkgICAgICBvcHRleHQgKz0gMjsKLQkgICAgfQotCi0JICBpZiAoIXN0cmNtcCAob3B0ZXh0LCAiMC4wIikgfHwgIXN0cmNtcCAob3B0ZXh0LCAiMCIpKQotCSAgICB7Ci0JICAgICAgcmVnb3BQLT5uID0gMHgxMDsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGlmICghc3RyY21wIChvcHRleHQsICIxLjAiKSB8fCAhc3RyY21wIChvcHRleHQsICIxIikpCi0JICAgIHsKLQkgICAgICByZWdvcFAtPm4gPSAweDE2OwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JfQotICAgICAgZWxzZQotCXsJCQkvKiBmaXhlZCBwb2ludCBsaXRlcmFsIGFjY2VwdGFibGUgKi8KLQkgIHBhcnNlX2V4cHIgKG9wdGV4dCwgJmUpOwotCSAgaWYgKGUuWF9vcCAhPSBPX2NvbnN0YW50Ci0JICAgICAgfHwgKG9mZnMgKGUpIDwgMCkgfHwgKG9mZnMgKGUpID4gMzEpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJpbGxlZ2FsIGxpdGVyYWwiKSk7Ci0JICAgICAgb2ZmcyAoZSkgPSAwOwotCSAgICB9Ci0JICByZWdvcFAtPm4gPSBvZmZzIChlKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdGhpbmcgd29ya2VkICovCi0gIHN5bnRheCAoKTsKLSAgcmVnb3BQLT5tb2RlID0gMDsJCS8qIFJlZ2lzdGVyIHIwIGlzIGFsd2F5cyBhIGdvb2Qgb25lICovCi0gIHJlZ29wUC0+biA9IDA7Ci0gIHJlZ29wUC0+c3BlY2lhbCA9IDA7Ci19CQkJCS8qIHBhcnNlX3JlZ29wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICByZWdfZm10OglnZW5lcmF0ZSBhIFJFRy1mb3JtYXQgaW5zdHJ1Y3Rpb24KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkCi1yZWdfZm10IChhcmdzLCBvUCkKLSAgICAgY2hhciAqYXJnc1tdOwkJLyogYXJnc1swXS0+b3Bjb2RlIG1uZW1vbmljLCBhcmdzWzEtM10tPm9wZXJhbmRzICovCi0gICAgIHN0cnVjdCBpOTYwX29wY29kZSAqb1A7CS8qIFBvaW50ZXIgdG8gZGVzY3JpcHRpb24gb2YgaW5zdHJ1Y3Rpb24gKi8KLXsKLSAgbG9uZyBpbnN0cjsJCQkvKiBCaW5hcnkgdG8gYmUgb3V0cHV0ICovCi0gIHN0cnVjdCByZWdvcCByZWdvcDsJCS8qIERlc2NyaXB0aW9uIG9mIHJlZ2lzdGVyIG9wZXJhbmQgKi8KLSAgaW50IG5fb3BzOwkJCS8qIE51bWJlciBvZiBvcGVyYW5kcyAqLwotCi0KLSAgaW5zdHIgPSBvUC0+b3Bjb2RlOwotICBuX29wcyA9IG9QLT5udW1fb3BzOwotCi0gIGlmIChuX29wcyA+PSAxKQotICAgIHsKLSAgICAgIHBhcnNlX3JlZ29wICgmcmVnb3AsIGFyZ3NbMV0sIG9QLT5vcGVyYW5kWzBdKTsKLQotICAgICAgaWYgKChuX29wcyA9PSAxKSAmJiAhKGluc3RyICYgTTMpKQotCXsKLQkgIC8qIDEtb3BlcmFuZCBpbnN0cnVjdGlvbiBpbiB3aGljaCB0aGUgZHN0IGZpZWxkIHNob3VsZAotCSAgICAgKiBiZSB1c2VkIChpbnN0ZWFkIG9mIHNyYzEpLgotCSAgICovCi0JICByZWdvcC5uIDw8PSAxOTsKLQkgIGlmIChyZWdvcC5zcGVjaWFsKQotCSAgICB7Ci0JICAgICAgcmVnb3AubW9kZSA9IHJlZ29wLnNwZWNpYWw7Ci0JICAgIH0KLQkgIHJlZ29wLm1vZGUgPDw9IDEzOwotCSAgcmVnb3Auc3BlY2lhbCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHJlZ29wLm4gZ29lcyBpbiBiaXQgMCwgbmVlZHMgbm8gc2hpZnRpbmcgKi8KLQkgIHJlZ29wLm1vZGUgPDw9IDExOwotCSAgcmVnb3Auc3BlY2lhbCA8PD0gNTsKLQl9Ci0gICAgICBpbnN0ciB8PSByZWdvcC5uIHwgcmVnb3AubW9kZSB8IHJlZ29wLnNwZWNpYWw7Ci0gICAgfQotCi0gIGlmIChuX29wcyA+PSAyKQotICAgIHsKLSAgICAgIHBhcnNlX3JlZ29wICgmcmVnb3AsIGFyZ3NbMl0sIG9QLT5vcGVyYW5kWzFdKTsKLQotICAgICAgaWYgKChuX29wcyA9PSAyKSAmJiAhKGluc3RyICYgTTMpKQotCXsKLQkgIC8qIDItb3BlcmFuZCBpbnN0cnVjdGlvbiBpbiB3aGljaCB0aGUgZHN0IGZpZWxkIHNob3VsZAotCSAgICAgKiBiZSB1c2VkIGluc3RlYWQgb2Ygc3JjMikuCi0JICAgKi8KLQkgIHJlZ29wLm4gPDw9IDE5OwotCSAgaWYgKHJlZ29wLnNwZWNpYWwpCi0JICAgIHsKLQkgICAgICByZWdvcC5tb2RlID0gcmVnb3Auc3BlY2lhbDsKLQkgICAgfQotCSAgcmVnb3AubW9kZSA8PD0gMTM7Ci0JICByZWdvcC5zcGVjaWFsID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVnb3AubiA8PD0gMTQ7Ci0JICByZWdvcC5tb2RlIDw8PSAxMjsKLQkgIHJlZ29wLnNwZWNpYWwgPDw9IDY7Ci0JfQotICAgICAgaW5zdHIgfD0gcmVnb3AubiB8IHJlZ29wLm1vZGUgfCByZWdvcC5zcGVjaWFsOwotICAgIH0KLSAgaWYgKG5fb3BzID09IDMpCi0gICAgewotICAgICAgcGFyc2VfcmVnb3AgKCZyZWdvcCwgYXJnc1szXSwgb1AtPm9wZXJhbmRbMl0pOwotICAgICAgaWYgKHJlZ29wLnNwZWNpYWwpCi0JewotCSAgcmVnb3AubW9kZSA9IHJlZ29wLnNwZWNpYWw7Ci0JfQotICAgICAgaW5zdHIgfD0gKHJlZ29wLm4gPDw9IDE5KSB8IChyZWdvcC5tb2RlIDw8PSAxMyk7Ci0gICAgfQotICBlbWl0IChpbnN0cik7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICByZWxheF9jb2JyOgotICAJUmVwbGFjZSBjb2JyIGluc3RydWN0aW9uIGluIGEgY29kZSBmcmFnbWVudCB3aXRoIGVxdWl2YWxlbnQgYnJhbmNoIGFuZAotICAJY29tcGFyZSBpbnN0cnVjdGlvbnMsIHNvIGl0IGNhbiByZWFjaCBiZXlvbmQgYSAxMy1iaXQgZGlzcGxhY2VtZW50LgotICAJU2V0IHVwIGFuIGFkZHJlc3MgZml4L3JlbG9jYXRpb24gZm9yIHRoZSBuZXcgYnJhbmNoIGluc3RydWN0aW9uLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBUaGlzICJjb25kaXRpb25hbCBqdW1wIiB0YWJsZSBtYXBzIGNvYnIgaW5zdHJ1Y3Rpb25zIGludG8KLSAgIGVxdWl2YWxlbnQgY29tcGFyZSBhbmQgYnJhbmNoIG9wY29kZXMuICAqLwotc3RhdGljIGNvbnN0Ci1zdHJ1Y3QKLXsKLSAgbG9uZyBjb21wYXJlOwotICBsb25nIGJyYW5jaDsKLX0KLQotY29qW10gPQotewkJCQkvKiBDT0JSIE9QQ09ERTogKi8KLSAgeyBDSEtCSVQsIEJOTyB9LAkJLyogICAgICAweDMwIC0gYmJjICovCi0gIHsgQ01QTywgQkcgfSwJCQkvKiAgICAgIDB4MzEgLSBjbXBvYmcgKi8KLSAgeyBDTVBPLCBCRSB9LAkJCS8qICAgICAgMHgzMiAtIGNtcG9iZSAqLwotICB7IENNUE8sIEJHRSB9LAkJLyogICAgICAweDMzIC0gY21wb2JnZSAqLwotICB7IENNUE8sIEJMIH0sCQkJLyogICAgICAweDM0IC0gY21wb2JsICovCi0gIHsgQ01QTywgQk5FIH0sCQkvKiAgICAgIDB4MzUgLSBjbXBvYm5lICovCi0gIHsgQ01QTywgQkxFIH0sCQkvKiAgICAgIDB4MzYgLSBjbXBvYmxlICovCi0gIHsgQ0hLQklULCBCTyB9LAkJLyogICAgICAweDM3IC0gYmJzICovCi0gIHsgQ01QSSwgQk5PIH0sCQkvKiAgICAgIDB4MzggLSBjbXBpYm5vICovCi0gIHsgQ01QSSwgQkcgfSwJCQkvKiAgICAgIDB4MzkgLSBjbXBpYmcgKi8KLSAgeyBDTVBJLCBCRSB9LAkJCS8qICAgICAgMHgzYSAtIGNtcGliZSAqLwotICB7IENNUEksIEJHRSB9LAkJLyogICAgICAweDNiIC0gY21waWJnZSAqLwotICB7IENNUEksIEJMIH0sCQkJLyogICAgICAweDNjIC0gY21waWJsICovCi0gIHsgQ01QSSwgQk5FIH0sCQkvKiAgICAgIDB4M2QgLSBjbXBpYm5lICovCi0gIHsgQ01QSSwgQkxFIH0sCQkvKiAgICAgIDB4M2UgLSBjbXBpYmxlICovCi0gIHsgQ01QSSwgQk8gfSwJCQkvKiAgICAgIDB4M2YgLSBjbXBpYm8gKi8KLX07Ci0KLXN0YXRpYwotdm9pZAotcmVsYXhfY29iciAoZnJhZ1ApCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsJLyogZnJhZ1AtPmZyX29wY29kZSBpcyBhc3N1bWVkIHRvIHBvaW50IHRvCi0JCQkJICogdGhlIGNvYnIgaW5zdHJ1Y3Rpb24sIHdoaWNoIGNvbWVzIGF0IHRoZQotCQkJCSAqIGVuZCBvZiB0aGUgY29kZSBmcmFnbWVudC4KLQkJCQkgKi8KLXsKLSAgaW50IG9wY29kZSwgc3JjMSwgc3JjMiwgbTEsIHMyOwotICAvKiBCaXQgZmllbGRzIGZyb20gY29iciBpbnN0cnVjdGlvbiAqLwotICBsb25nIGJwX2JpdHM7CQkJLyogQnJhbmNoIHByZWRpY3Rpb24gYml0cyBmcm9tIGNvYnIgaW5zdHJ1Y3Rpb24gKi8KLSAgbG9uZyBpbnN0cjsJCQkvKiBBIHNpbmdsZSBpOTYwIGluc3RydWN0aW9uICovCi0gIC8qIC0+aW5zdHJ1Y3Rpb24gdG8gYmUgcmVwbGFjZWQgKi8KLSAgY2hhciAqaVA7Ci0gIGZpeFMgKmZpeFA7CQkJLyogUmVsb2NhdGlvbiB0aGF0IGNhbiBiZSBkb25lIGF0IGFzc2VtYmx5IHRpbWUgKi8KLQotICAvKiBQSUNLIFVQICYgUEFSU0UgQ09CUiBJTlNUUlVDVElPTiAqLwotICBpUCA9IGZyYWdQLT5mcl9vcGNvZGU7Ci0gIGluc3RyID0gbWRfY2hhcnNfdG9fbnVtYmVyIChpUCwgNCk7Ci0gIG9wY29kZSA9ICgoaW5zdHIgPj4gMjQpICYgMHhmZikgLSAweDMwOwkvKiAiLTB4MzAiIGZvciB0YWJsZSBpbmRleCAqLwotICBzcmMxID0gKGluc3RyID4+IDE5KSAmIDB4MWY7Ci0gIG0xID0gKGluc3RyID4+IDEzKSAmIDE7Ci0gIHMyID0gaW5zdHIgJiAxOwotICBzcmMyID0gKGluc3RyID4+IDE0KSAmIDB4MWY7Ci0gIGJwX2JpdHMgPSBpbnN0ciAmIEJQX01BU0s7Ci0KLSAgLyogR0VORVJBVEUgQU5EIE9VVFBVVCBDT01QQVJFIElOU1RSVUNUSU9OICovCi0gIGluc3RyID0gY29qW29wY29kZV0uY29tcGFyZQotICAgIHwgc3JjMSB8IChtMSA8PCAxMSkgfCAoczIgPDwgNikgfCAoc3JjMiA8PCAxNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoaVAsIGluc3RyLCA0KTsKLQotICAvKiBPVVRQVVQgQlJBTkNIIElOU1RSVUNUSU9OICovCi0gIG1kX251bWJlcl90b19jaGFycyAoaVAgKyA0LCBjb2pbb3Bjb2RlXS5icmFuY2ggfCBicF9iaXRzLCA0KTsKLQotICAvKiBTRVQgVVAgQUREUkVTUyBGSVhVUC9SRUxPQ0FUSU9OICovCi0gIGZpeFAgPSBmaXhfbmV3IChmcmFnUCwKLQkJICBpUCArIDQgLSBmcmFnUC0+ZnJfbGl0ZXJhbCwKLQkJICA0LAotCQkgIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgZnJhZ1AtPmZyX29mZnNldCwKLQkJICAxLAotCQkgIE5PX1JFTE9DKTsKLQotICBmaXhQLT5meF9iaXRfZml4UCA9IChiaXRfZml4UyAqKSAyNDsJLyogU3RvcmUgc2l6ZSBvZiBiaXQgZmllbGQgKi8KLQotICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0gIGZyYWdfd2FuZSAoZnJhZ1ApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgcmVsb2NfY2FsbGo6CVJlbG9jYXRlIGEgJ2NhbGxqJyBpbnN0cnVjdGlvbgotCi0gIAlUaGlzIGlzIGEgIm5vbi0oR05VKS1zdGFuZGFyZCIgbWFjaGluZS1kZXBlbmRlbnQgaG9vay4gIFRoZSBiYXNlCi0gIAlhc3NlbWJsZXIgY2FsbHMgaXQgd2hlbiBpdCBkZWNpZGVzIGl0IGNhbiByZWxvY2F0ZSBhbiBhZGRyZXNzIGF0Ci0gIAlhc3NlbWJseSB0aW1lIGluc3RlYWQgb2YgZW1pdHRpbmcgYSByZWxvY2F0aW9uIGRpcmVjdGl2ZS4KLQotICAJQ2hlY2sgdG8gc2VlIGlmIHRoZSByZWxvY2F0aW9uIGludm9sdmVzIGEgJ2NhbGxqJyBpbnN0cnVjdGlvbiB0byBhOgotICAJICAgIHN5c3Byb2M6CVJlcGxhY2UgdGhlIGRlZmF1bHQgJ2NhbGwnIGluc3RydWN0aW9uIHdpdGggYSAnY2FsbHMnCi0gIAkgICAgbGVhZnByb2M6CVJlcGxhY2UgdGhlIGRlZmF1bHQgJ2NhbGwnIGluc3RydWN0aW9uIHdpdGggYSAnYmFsJy4KLSAgCSAgICBvdGhlciBwcm9jOglEbyBub3RoaW5nLgotCi0gIAlTZWUgYi5vdXQuaCBmb3IgZGV0YWlscyBvbiB0aGUgJ25fb3RoZXInIGZpZWxkIGluIGEgc3ltYm9sIHN0cnVjdHVyZS4KLQotICAgSU1QT1JUQU5UIToKLSAgCUFzc3VtZXMgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBmaWd1cmVkIG91dCwgaW4gdGhlIGNhc2Ugb2YgYSBsZWFmcHJvYywKLSAgCXRvIHVzZSB0aGUgJ2JhbCcgZW50cnkgcG9pbnQsIGFuZCBoYXMgc3Vic3RpdHV0ZWQgdGhhdCBzeW1ib2wgaW50byB0aGUKLSAgCXBhc3NlZCBmaXh1cCBzdHJ1Y3R1cmUuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1yZWxvY19jYWxsaiAoZml4UCkKLSAgICAgLyogUmVsb2NhdGlvbiB0aGF0IGNhbiBiZSBkb25lIGF0IGFzc2VtYmx5IHRpbWUgKi8KLSAgICAgZml4UyAqZml4UDsKLXsKLSAgLyogUG9pbnRzIHRvIHRoZSBiaW5hcnkgZm9yIHRoZSBpbnN0cnVjdGlvbiBiZWluZyByZWxvY2F0ZWQuICAqLwotICBjaGFyICp3aGVyZTsKLQotICBpZiAoIWZpeFAtPmZ4X3RjYml0KQotICAgIHsKLSAgICAgIC8qIFRoaXMgd2Fzbid0IGEgY2FsbGogaW5zdHJ1Y3Rpb24gaW4gdGhlIGZpcnN0IHBsYWNlICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHdoZXJlID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOwotCi0gIGlmIChUQ19TX0lTX1NZU1BST0MgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICAvKiBTeW1ib2wgaXMgYSAuc3lzcHJvYzogcmVwbGFjZSAnY2FsbCcgd2l0aCAnY2FsbHMnLiAgU3lzdGVtCi0gICAgICAgICBwcm9jZWR1cmUgbnVtYmVyIGlzIChvdGhlci0xKS4gICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCBDQUxMUyB8IFRDX1NfR0VUX1NZU1BST0MgKGZpeFAtPmZ4X2FkZHN5KSwgNCk7Ci0KLSAgICAgIC8qIE5vdGhpbmcgZWxzZSBuZWVkcyB0byBiZSBkb25lIGZvciB0aGlzIGluc3RydWN0aW9uLiAgTWFrZQotICAgICAgICAgc3VyZSAnbWRfbnVtYmVyX3RvX2ZpZWxkKCknIHdpbGwgcGVyZm9ybSBhIG5vLW9wLiAgKi8KLSAgICAgIGZpeFAtPmZ4X2JpdF9maXhQID0gKGJpdF9maXhTICopIDE7Ci0KLSAgICB9Ci0gIGVsc2UgaWYgKFRDX1NfSVNfQ0FMTE5BTUUgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICAvKiBTaG91bGQgbm90IGhhcHBlbjogc2VlIGJsb2NrIGNvbW1lbnQgYWJvdmUgKi8KLSAgICAgIGFzX2ZhdGFsIChfKCJUcnlpbmcgdG8gJ2JhbCcgdG8gJXMiKSwgU19HRVRfTkFNRSAoZml4UC0+ZnhfYWRkc3kpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKFRDX1NfSVNfQkFMTkFNRSAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFJlcGxhY2UgJ2NhbGwnIHdpdGggJ2JhbCc7IGJvdGggaW5zdHJ1Y3Rpb25zIGhhdmUgdGhlIHNhbWUKLSAgICAgICAgIGZvcm1hdCwgc28gY2FsbGluZyBjb2RlIHNob3VsZCBjb21wbGV0ZSByZWxvY2F0aW9uIGFzIGlmCi0gICAgICAgICBub3RoaW5nIGhhcHBlbmVkIGhlcmUuICAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgQkFMLCA0KTsKLSAgICB9Ci0gIGVsc2UgaWYgKFRDX1NfSVNfQkFEUFJPQyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTG9va3MgbGlrZSBhIHByb2MsIGJ1dCBjYW4ndCB0ZWxsIHdoYXQga2luZC5cbiIpKTsKLSAgICB9CQkJCS8qIHN3aXRjaCBvbiBwcm9jIHR5cGUgKi8KLQotICAvKiBlbHNlIFN5bWJvbCBpcyBuZWl0aGVyIGEgc3lzcHJvYyBub3IgYSBsZWFmcHJvYyAqLwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgc19sZWFmcHJvYzoJcHJvY2VzcyAubGVhZnByb2MgcHNldWRvLW9wCi0KLSAgCS5sZWFmcHJvYyB0YWtlcyB0d28gYXJndW1lbnRzLCB0aGUgc2Vjb25kIG9uZSBpcyBvcHRpb25hbDoKLSAgCQlhcmdbMV06IG5hbWUgb2YgJ2NhbGwnIGVudHJ5IHBvaW50IHRvIGxlYWYgcHJvY2VkdXJlCi0gIAkJYXJnWzJdOiBuYW1lIG9mICdiYWwnIGVudHJ5IHBvaW50IHRvIGxlYWYgcHJvY2VkdXJlCi0KLSAgCUlmIHRoZSB0d28gYXJndW1lbnRzIGFyZSBpZGVudGljYWwsIG9yIGlmIHRoZSBzZWNvbmQgb25lIGlzIG1pc3NpbmcsCi0gIAl0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGFrZW4gdG8gYmUgdGhlICdiYWwnIGVudHJ5IHBvaW50LgotCi0gIAlJZiB0aGVyZSBhcmUgMiBkaXN0aW5jdCBhcmd1bWVudHMsIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlICdiYWwnCi0gIAllbnRyeSBwb2ludCBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSAnY2FsbCcgZW50cnkgcG9pbnQgaW4gdGhlIGxpbmtlZAotICAJbGlzdCBvZiBzeW1ib2xzLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQKLXNfbGVhZnByb2MgKG5fb3BzLCBhcmdzKQotICAgICBpbnQgbl9vcHM7CQkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi0gICAgIGNoYXIgKmFyZ3NbXTsJCS8qIGFyZ3NbMV0tPjFzdCBvcGVyYW5kLCBhcmdzWzJdLT4ybmQgb3BlcmFuZCAqLwotewotICBzeW1ib2xTICpjYWxsUDsJCS8qIFBvaW50ZXIgdG8gbGVhZnByb2MgJ2NhbGwnIGVudHJ5IHBvaW50IHN5bWJvbCAqLwotICBzeW1ib2xTICpiYWxQOwkJLyogUG9pbnRlciB0byBsZWFmcHJvYyAnYmFsJyBlbnRyeSBwb2ludCBzeW1ib2wgKi8KLQotICBpZiAoKG5fb3BzICE9IDEpICYmIChuX29wcyAhPSAyKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInNob3VsZCBoYXZlIDEgb3IgMiBvcGVyYW5kcyIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIENoZWNrIG51bWJlciBvZiBhcmd1bWVudHMgKi8KLQotICAvKiBGaW5kIG9yIGNyZWF0ZSBzeW1ib2wgZm9yICdjYWxsJyBlbnRyeSBwb2ludC4gKi8KLSAgY2FsbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChhcmdzWzFdKTsKLQotICBpZiAoVENfU19JU19DQUxMTkFNRSAoY2FsbFApKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIlJlZGVmaW5pbmcgbGVhZnByb2MgJXMiKSwgU19HRVRfTkFNRSAoY2FsbFApKTsKLSAgICB9CQkJCS8qIGlzIGxlYWZwcm9jICovCi0KLSAgLyogSWYgdGhhdCB3YXMgdGhlIG9ubHkgYXJndW1lbnQsIHVzZSBpdCBhcyB0aGUgJ2JhbCcgZW50cnkgcG9pbnQuCi0gICAgICogT3RoZXJ3aXNlLCBtYXJrIGl0IGFzIHRoZSAnY2FsbCcgZW50cnkgcG9pbnQgYW5kIGZpbmQgb3IgY3JlYXRlCi0gICAgICogYW5vdGhlciBzeW1ib2wgZm9yIHRoZSAnYmFsJyBlbnRyeSBwb2ludC4KLSAgICovCi0gIGlmICgobl9vcHMgPT0gMSkgfHwgIXN0cmNtcCAoYXJnc1sxXSwgYXJnc1syXSkpCi0gICAgewotICAgICAgVENfU19GT1JDRV9UT19CQUxOQU1FIChjYWxsUCk7Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBUQ19TX0ZPUkNFX1RPX0NBTExOQU1FIChjYWxsUCk7Ci0KLSAgICAgIGJhbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChhcmdzWzJdKTsKLSAgICAgIGlmIChUQ19TX0lTX0NBTExOQU1FIChiYWxQKSkKLQl7Ci0JICBhc193YXJuIChfKCJSZWRlZmluaW5nIGxlYWZwcm9jICVzIiksIFNfR0VUX05BTUUgKGJhbFApKTsKLQl9Ci0gICAgICBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUgKGJhbFApOwotCi0jaWZuZGVmIE9CSl9FTEYKLSAgICAgIHRjX3NldF9iYWxfb2ZfY2FsbCAoY2FsbFAsIGJhbFApOwotI2VuZGlmCi0gICAgfQkJCQkvKiBpZiBvbmx5IG9uZSBhcmcsIG9yIHRoZSBhcmdzIGFyZSB0aGUgc2FtZSAqLwotfQotCi0KLS8qCi0gICBzX3N5c3Byb2M6IHByb2Nlc3MgLnN5c3Byb2MgcHNldWRvLW9wCi0KLSAgICAgICAgLnN5c3Byb2MgdGFrZXMgdHdvIGFyZ3VtZW50czoKLSAgICAgICAgICAgICAgICBhcmdbMV06IG5hbWUgb2YgZW50cnkgcG9pbnQgdG8gc3lzdGVtIHByb2NlZHVyZQotICAgICAgICAgICAgICAgIGFyZ1syXTogJ2VudHJ5X251bScgKGluZGV4KSBvZiBzeXN0ZW0gcHJvY2VkdXJlIGluIHRoZSByYW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgWzAsMzFdIGluY2x1c2l2ZS4KLQotICAgICAgICBGb3IgW2FiXS5vdXQsIHdlIHN0b3JlIHRoZSAnZW50cnludW0nIGluIHRoZSAnbl9vdGhlcicgZmllbGQgb2YKLSAgICAgICAgdGhlIHN5bWJvbC4gIFNpbmNlIHRoYXQgZW50cnkgaXMgbm9ybWFsbHkgMCwgd2UgYmlhcyAnZW50cnludW0nCi0gICAgICAgIGJ5IGFkZGluZyAxIHRvIGl0LiAgSXQgbXVzdCBiZSB1bmJpYXNlZCBiZWZvcmUgaXQgaXMgdXNlZC4gICovCi1zdGF0aWMgdm9pZAotc19zeXNwcm9jIChuX29wcywgYXJncykKLSAgICAgaW50IG5fb3BzOwkJCS8qIE51bWJlciBvZiBvcGVyYW5kcyAqLwotICAgICBjaGFyICphcmdzW107CQkvKiBhcmdzWzFdLT4xc3Qgb3BlcmFuZCwgYXJnc1syXS0+Mm5kIG9wZXJhbmQgKi8KLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBzeW1ib2xTICpzeW1QOwotCi0gIGlmIChuX29wcyAhPSAyKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic2hvdWxkIGhhdmUgdHdvIG9wZXJhbmRzIikpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogYmFkIGFyZyBjb3VudCAqLwotCi0gIC8qIFBhcnNlICJlbnRyeV9udW0iIGFyZ3VtZW50IGFuZCBjaGVjayBpdCBmb3IgdmFsaWRpdHkuICovCi0gIHBhcnNlX2V4cHIgKGFyZ3NbMl0sICZleHApOwotICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgKG9mZnMgKGV4cCkgPCAwKQotICAgICAgfHwgKG9mZnMgKGV4cCkgPiAzMSkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCInZW50cnlfbnVtJyBtdXN0IGJlIGFic29sdXRlIG51bWJlciBpbiBbMCwzMV0iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEZpbmQvbWFrZSBzeW1ib2wgYW5kIHN0aWNrIGVudHJ5IG51bWJlciAoYmlhc2VkIGJ5ICsxKSBpbnRvIGl0ICovCi0gIHN5bVAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChhcmdzWzFdKTsKLQotICBpZiAoVENfU19JU19TWVNQUk9DIChzeW1QKSkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJSZWRlZmluaW5nIGVudHJ5bnVtIGZvciBzeXNwcm9jICVzIiksIFNfR0VUX05BTUUgKHN5bVApKTsKLSAgICB9CQkJCS8qIHJlZGVmaW5pbmcgKi8KLQotICBUQ19TX1NFVF9TWVNQUk9DIChzeW1QLCBvZmZzIChleHApKTsJLyogZW5jb2RlIGVudHJ5IG51bWJlciAqLwotICBUQ19TX0ZPUkNFX1RPX1NZU1BST0MgKHN5bVApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgc2hpZnRfb2s6Ci0gIAlEZXRlcm1pbmUgaWYgYSAic2hsbyIgaW5zdHJ1Y3Rpb24gY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGEgImxkY29uc3QiLgotICAJVGhpcyBtZWFucyB0aGF0IHNvbWUgbnVtYmVyIFggPCAzMiBjYW4gYmUgc2hpZnRlZCBsZWZ0IHRvIHByb2R1Y2UgdGhlCi0gIAljb25zdGFudCBvZiBpbnRlcmVzdC4KLQotICAJUmV0dXJuIHRoZSBzaGlmdCBjb3VudCwgb3IgMCBpZiB3ZSBjYW4ndCBkbyBpdC4KLSAgCUNhbGxlciBjYWxjdWxhdGVzIFggYnkgc2hpZnRpbmcgb3JpZ2luYWwgY29uc3RhbnQgcmlnaHQgJ3NoaWZ0JyBwbGFjZXMuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLWludAotc2hpZnRfb2sgKG4pCi0gICAgIGludCBuOwkJCS8qIFRoZSBjb25zdGFudCBvZiBpbnRlcmVzdCAqLwotewotICBpbnQgc2hpZnQ7CQkJLyogVGhlIHNoaWZ0IGNvdW50ICovCi0KLSAgaWYgKG4gPD0gMCkKLSAgICB7Ci0gICAgICAvKiBDYW4ndCBkbyBpdCBmb3IgbmVnYXRpdmUgbnVtYmVycyAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFNoaWZ0ICduJyByaWdodCB1bnRpbCBhIDEgaXMgYWJvdXQgdG8gYmUgbG9zdCAqLwotICBmb3IgKHNoaWZ0ID0gMDsgKG4gJiAxKSA9PSAwOyBzaGlmdCsrKQotICAgIHsKLSAgICAgIG4gPj49IDE7Ci0gICAgfQotCi0gIGlmIChuID49IDMyKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIHNoaWZ0OwotfQotCi0KLS8qIHN5bnRheDogaXNzdWUgc3ludGF4IGVycm9yICovCi0KLXN0YXRpYyB2b2lkCi1zeW50YXggKCkKLXsKLSAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IiKSk7Ci19CQkJCS8qIHN5bnRheCgpICovCi0KLQotLyogdGFyZ19oYXNfc2ZyOgotCi0gICBSZXR1cm4gVFJVRSBpZmYgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgc3BlY2lhbC1mdW5jdGlvbiByZWdpc3RlciAoc2ZyKS4gICovCi0KLXN0YXRpYwotaW50Ci10YXJnX2hhc19zZnIgKG4pCi0gICAgIGludCBuOwkJCS8qIE51bWJlciAoMC0zMSkgb2Ygc2ZyICovCi17Ci0gIHN3aXRjaCAoYXJjaGl0ZWN0dXJlKQotICAgIHsKLSAgICBjYXNlIEFSQ0hfS0E6Ci0gICAgY2FzZSBBUkNIX0tCOgotICAgIGNhc2UgQVJDSF9NQzoKLSAgICBjYXNlIEFSQ0hfSlg6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIEFSQ0hfSFg6Ci0gICAgICByZXR1cm4gKCgwIDw9IG4pICYmIChuIDw9IDQpKTsKLSAgICBjYXNlIEFSQ0hfQ0E6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAoKDAgPD0gbikgJiYgKG4gPD0gMikpOwotICAgIH0KLX0KLQotCi0vKiB0YXJnX2hhc19pY2xhc3M6Ci0KLSAgIFJldHVybiBUUlVFIGlmZiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBzdXBwb3J0cyB0aGUgaW5kaWNhdGVkCi0gICBjbGFzcyBvZiBpbnN0cnVjdGlvbnMuICAqLwotc3RhdGljCi1pbnQKLXRhcmdfaGFzX2ljbGFzcyAoaWMpCi0gICAgIC8qIEluc3RydWN0aW9uIGNsYXNzOyAgb25lIG9mOgotICAgICAgICBJX0JBU0UsIElfQ1gsIElfREVDLCBJX0tYLCBJX0ZQLCBJX01JTCwgSV9DQVNJTSwgSV9DWDIsIElfSFgsIElfSFgyCi0gICAgICAqLwotICAgICBpbnQgaWM7Ci17Ci0gIGljbGFzc2VzX3NlZW4gfD0gaWM7Ci0gIHN3aXRjaCAoYXJjaGl0ZWN0dXJlKQotICAgIHsKLSAgICBjYXNlIEFSQ0hfS0E6Ci0gICAgICByZXR1cm4gaWMgJiAoSV9CQVNFIHwgSV9LWCk7Ci0gICAgY2FzZSBBUkNIX0tCOgotICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfS1ggfCBJX0ZQIHwgSV9ERUMpOwotICAgIGNhc2UgQVJDSF9NQzoKLSAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0tYIHwgSV9GUCB8IElfREVDIHwgSV9NSUwpOwotICAgIGNhc2UgQVJDSF9DQToKLSAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0NYIHwgSV9DWDIgfCBJX0NBU0lNKTsKLSAgICBjYXNlIEFSQ0hfSlg6Ci0gICAgICByZXR1cm4gaWMgJiAoSV9CQVNFIHwgSV9DWDIgfCBJX0pYKTsKLSAgICBjYXNlIEFSQ0hfSFg6Ci0gICAgICByZXR1cm4gaWMgJiAoSV9CQVNFIHwgSV9DWDIgfCBJX0pYIHwgSV9IWCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICgoaWNsYXNzZXNfc2VlbiAmIChJX0tYIHwgSV9GUCB8IElfREVDIHwgSV9NSUwpKQotCSAgJiYgKGljbGFzc2VzX3NlZW4gJiAoSV9DWCB8IElfQ1gyKSkpCi0JewotCSAgYXNfd2FybiAoXygiYXJjaGl0ZWN0dXJlIG9mIG9wY29kZSBjb25mbGljdHMgd2l0aCB0aGF0IG9mIGVhcmxpZXIgaW5zdHJ1Y3Rpb24ocykiKSk7Ci0JICBpY2xhc3Nlc19zZWVuICY9IH5pYzsKLQl9Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIC5lbmRpYW4gcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZW5kaWFuIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGlmIChzdHJjYXNlY21wIChuYW1lLCAibGl0dGxlIikgPT0gMCkKLSAgICA7Ci0gIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJiaWciKSA9PSAwKQotICAgIGFzX2JhZCAoXygiYmlnIGVuZGlhbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gIGVsc2UKLSAgICBhc193YXJuIChfKCJpZ25vcmluZyB1bnJlY29nbml6ZWQgLmVuZGlhbiB0eXBlIGAlcyciKSwgbmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICovCi0KLS8qIEFSR1NVU0VEICovCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgaTk2MCwgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24sCi0gICB3aGljaCB3ZSBoYXZlIHNldCB1cCBhcyB0aGUgYWRkcmVzcyBvZiB0aGUgZml4dXAgdG9vLiAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWxwKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbHA7Ci0jZWxzZQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotI2VuZGlmCi17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBsb25nIHZhbCA9ICp2YWxwOwotI2VuZGlmCi0gIGNoYXIgKnBsYWNlID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotCi0gIGlmICghZml4UC0+ZnhfYml0X2ZpeFApCi0gICAgewotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICAvKiBGb3IgY2FsbHgsIHdlIGFsd2F5cyB3YW50IHRvIHdyaXRlIG91dCB6ZXJvLCBhbmQgZW1pdCBhCi0JIHN5bWJvbGljIHJlbG9jYXRpb24uICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X2JzcikKLQl2YWwgPSAwOwotCi0gICAgICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWw7Ci0jZW5kaWYKLQotICAgICAgbWRfbnVtYmVyX3RvX2ltbSAocGxhY2UsIHZhbCwgZml4UC0+Znhfc2l6ZSwgZml4UCk7Ci0gICAgfQotICBlbHNlCi0gICAgbWRfbnVtYmVyX3RvX2ZpZWxkIChwbGFjZSwgdmFsLCBmaXhQLT5meF9iaXRfZml4UCk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLSNpZiBkZWZpbmVkKE9CSl9BT1VUKSB8IGRlZmluZWQoT0JKX0JPVVQpCi12b2lkCi10Y19ib3V0X2ZpeF90b19jaGFycyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgZml4UyAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5ieXRlc19yX2xlbmd0aFtdID0gezQyLCAwLCAxLCA0MiwgMn07Ci0gIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gcmk7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgbWVtc2V0ICgoY2hhciAqKSAmcmksICdcMCcsIHNpemVvZiAocmkpKTsKLSAgc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5OwotICBrbm93IChzeW1ib2xQICE9IDAgfHwgZml4UC0+Znhfcl90eXBlICE9IE5PX1JFTE9DKTsKLSAgcmkucl9ic3IgPSBmaXhQLT5meF9ic3I7CS8qU0FDIExEIFJFTEFYIEhBQ0sgKi8KLSAgLyogVGhlc2UgdHdvICdjdXogb2YgTlMzMksgKi8KLSAgcmkucl9jYWxsaiA9IGZpeFAtPmZ4X3RjYml0OwotICBpZiAoZml4UC0+ZnhfYml0X2ZpeFApCi0gICAgcmkucl9sZW5ndGggPSAyOwotICBlbHNlCi0gICAgcmkucl9sZW5ndGggPSBuYnl0ZXNfcl9sZW5ndGhbZml4UC0+Znhfc2l6ZV07Ci0gIHJpLnJfcGNyZWwgPSBmaXhQLT5meF9wY3JlbDsKLSAgcmkucl9hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci0KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSAhPSBOT19SRUxPQykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLQl7Ci0JY2FzZSByc19hbGlnbjoKLQkgIHJpLnJfaW5kZXggPSAtMjsKLQkgIHJpLnJfcGNyZWwgPSAxOwotCSAgcmkucl9sZW5ndGggPSBmaXhQLT5meF9zaXplIC0gMTsKLQkgIGJyZWFrOwotCWNhc2UgcnNfb3JnOgotCSAgcmkucl9pbmRleCA9IC0yOwotCSAgcmkucl9wY3JlbCA9IDA7Ci0JICBicmVhazsKLQljYXNlIHJzX2ZpbGw6Ci0JICByaS5yX2luZGV4ID0gLTE7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgcmkucl9leHRlcm4gPSAwOwotICAgIH0KLSAgZWxzZSBpZiAobGlua3JlbGF4IHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IGZpeFAtPmZ4X2JzcikKLSAgICB7Ci0gICAgICByaS5yX2V4dGVybiA9IDE7Ci0gICAgICByaS5yX2luZGV4ID0gc3ltYm9sUC0+c3lfbnVtYmVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJpLnJfZXh0ZXJuID0gMDsKLSAgICAgIHJpLnJfaW5kZXggPSBTX0dFVF9UWVBFIChzeW1ib2xQKTsKLSAgICB9Ci0KLSAgLyogT3V0cHV0IHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGluIG1hY2hpbmUtZGVwZW5kZW50IGZvcm0uICovCi0gIG1kX3JpX3RvX2NoYXJzICh3aGVyZSwgJnJpKTsKLX0KLQotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0KLSNpZiBkZWZpbmVkIChPQkpfQ09GRikgJiYgZGVmaW5lZCAoQkZEKQotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpZiAoZml4UC0+ZnhfYnNyKQotICAgIGFib3J0ICgpOwotCi0gIGlmIChmaXhQLT5meF9wY3JlbCA9PSAwICYmIGZpeFAtPmZ4X3NpemUgPT0gNCkKLSAgICByZXR1cm4gUl9SRUxMT05HOwotCi0gIGlmIChmaXhQLT5meF9wY3JlbCAhPSAwICYmIGZpeFAtPmZ4X3NpemUgPT0gNCkKLSAgICByZXR1cm4gUl9JUFJNRUQ7Ci0KLSAgYWJvcnQgKCk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLXRjX2NvZmZfc2l6ZW1hY2hkZXAgKGZyYWcpCi0gICAgIGZyYWdTICpmcmFnOwotewotICBpZiAoZnJhZy0+ZnJfbmV4dCkKLSAgICByZXR1cm4gZnJhZy0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWctPmZyX2FkZHJlc3M7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKiBBbGlnbiBhbiBhZGRyZXNzIGJ5IHJvdW5kaW5nIGl0IHVwIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRhcnkuICAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIHNlZ1Qgc2VnOwotICAgICB2YWx1ZVQgYWRkcjsJCS8qIEFkZHJlc3MgdG8gYmUgcm91bmRlZCB1cCAqLwotewotICBpbnQgYWxpZ247Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKLSNlbHNlCi0gIGFsaWduID0gc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXTsKLSNlbmRpZgotICByZXR1cm4gKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbik7Ci19Ci0KLWV4dGVybiBpbnQgY29mZl9mbGFnczsKLQotI2lmZGVmIE9CSl9DT0ZGCi12b2lkCi10Y19oZWFkZXJzX2hvb2sgKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICBzd2l0Y2ggKGFyY2hpdGVjdHVyZSkKLSAgICB7Ci0gICAgY2FzZSBBUkNIX0tBOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBLQTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX0tCOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBLQjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX01DOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBNQzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX0NBOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBDQTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX0pYOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBKWDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBUkNIX0hYOgotICAgICAgY29mZl9mbGFncyB8PSBGX0k5NjBIWDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChpY2xhc3Nlc19zZWVuID09IElfQkFTRSkKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MENPUkU7Ci0gICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgSV9DWCkKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MENBOwotICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIElfSFgpCi0JY29mZl9mbGFncyB8PSBGX0k5NjBIWDsKLSAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiBJX0pYKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwSlg7Ci0gICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgSV9DWDIpCi0JY29mZl9mbGFncyB8PSBGX0k5NjBDQTsKLSAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiBJX01JTCkKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2ME1DOwotICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIChJX0RFQyB8IElfRlApKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwS0I7Ci0gICAgICBlbHNlCi0JY29mZl9mbGFncyB8PSBGX0k5NjBLQTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0gICAgewotICAgICAgaGVhZGVycy0+ZmlsZWhkci5mX21hZ2ljID0gSTk2MFJXTUFHSUM7Ci0gICAgICBoZWFkZXJzLT5hb3V0aGRyLm1hZ2ljID0gT01BR0lDOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGhlYWRlcnMtPmZpbGVoZHIuZl9tYWdpYyA9IEk5NjBST01BR0lDOwotICAgICAgaGVhZGVycy0+YW91dGhkci5tYWdpYyA9IE5NQUdJQzsKLSAgICB9CQkJCS8qIHNldCBtYWdpYyBudW1iZXJzICovCi19Ci0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogVGhpbmdzIGdvaW5nIG9uIGhlcmU6Ci0KLSAgIEZvciBib3V0LCBXZSBuZWVkIHRvIGFzc3VyZSBhIGNvdXBsZSBvZiBzaW1wbGlmeWluZwotICAgYXNzdW1wdGlvbnMgYWJvdXQgbGVhZnByb2NzIGZvciB0aGUgbGlua2VyOiB0aGUgbGVhZnByb2MKLSAgIGVudHJ5IHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkIGluIHRoZSBzYW1lIGFzc2VtYmx5IGluCi0gICB3aGljaCB0aGV5J3JlIGRlY2xhcmVkIHdpdGggdGhlICcubGVhZnByb2MnIGRpcmVjdGl2ZTsKLSAgIGFuZCBpZiBhIGxlYWZwcm9jIGhhcyBib3RoICdjYWxsJyBhbmQgJ2JhbCcgZW50cnkgcG9pbnRzCi0gICB0aGV5IGFyZSBib3RoIGdsb2JhbCBvciBib3RoIGxvY2FsLgotCi0gICBGb3IgY29mZiwgdGhlIGNhbGwgc3ltYm9sIGhhcyBhIHNlY29uZCBhdXggZW50cnkgdGhhdAotICAgY29udGFpbnMgdGhlIGJhbCBlbnRyeSBwb2ludC4gIFRoZSBiYWwgc3ltYm9sIGJlY29tZXMgYQotICAgbGFiZWwuCi0KLSAgIEZvciBjb2ZmIHJlcHJlc2VudGF0aW9uLCB0aGUgY2FsbCBzeW1ib2wgaGFzIGEgc2Vjb25kIGF1eCBlbnRyeSB0aGF0Ci0gICBjb250YWlucyB0aGUgYmFsIGVudHJ5IHBvaW50LiAgVGhlIGJhbCBzeW1ib2wgYmVjb21lcyBhIGxhYmVsLiAgKi8KLQotdm9pZAotdGNfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotI2lmZGVmIE9CSl9DT0ZGCi0gICAgICBpZiAoVENfU19JU19TWVNQUk9DIChzeW1ib2xQKSkKLQl7Ci0JICAvKiBzZWNvbmQgYXV4IGVudHJ5IGFscmVhZHkgY29udGFpbnMgdGhlIHN5c3Byb2MgbnVtYmVyICovCi0JICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAyKTsKLQkgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfU0NBTEwpOwotCSAgU19TRVRfREFUQV9UWVBFIChzeW1ib2xQLCBTX0dFVF9EQVRBX1RZUEUgKHN5bWJvbFApIHwgKERUX0ZDTiA8PCBOX0JUU0hGVCkpOwotCSAgY29udGludWU7Ci0JfQkJCS8qIHJld3JpdGUgc3lzcHJvYyAqLwotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLSAgICAgIGlmICghVENfU19JU19CQUxOQU1FIChzeW1ib2xQKSAmJiAhVENfU19JU19DQUxMTkFNRSAoc3ltYm9sUCkpCi0JewotCSAgY29udGludWU7Ci0JfQkJCS8qIE5vdCBhIGxlYWZwcm9jIHN5bWJvbCAqLwotCi0gICAgICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JewotCSAgYXNfYmFkIChfKCJsZWFmcHJvYyBzeW1ib2wgJyVzJyB1bmRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCX0JCQkvKiB1bmRlZmluZWQgbGVhZiAqLwotCi0gICAgICBpZiAoVENfU19JU19DQUxMTkFNRSAoc3ltYm9sUCkpCi0JewotCSAgc3ltYm9sUyAqYmFsUCA9IHRjX2dldF9iYWxfb2ZfY2FsbCAoc3ltYm9sUCk7Ci0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgIT0gU19JU19FWFRFUk5BTCAoYmFsUCkpCi0JICAgIHsKLQkgICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICAgICAgU19TRVRfRVhURVJOQUwgKGJhbFApOwotCSAgICAgIGFzX3dhcm4gKF8oIldhcm5pbmc6IG1ha2luZyBsZWFmcHJvYyBlbnRyaWVzICVzIGFuZCAlcyBib3RoIGdsb2JhbFxuIiksCi0JCSAgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgU19HRVRfTkFNRSAoYmFsUCkpOwotCSAgICB9CQkJLyogZXh0ZXJuYWxpdHkgbWlzbWF0Y2ggKi8KLQl9CQkJLyogaWYgY2FsbG5hbWUgKi8KLSAgICB9CQkJCS8qIHdhbGsgdGhlIHN5bWJvbCBjaGFpbiAqLwotfQotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLS8qIEZvciBhb3V0IG9yIGJvdXQsIHRoZSBiYWwgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgY2FsbC4KLQotICAgRm9yIGNvZmYsIHdlIGNoZWF0IGFuZCBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIGJhbCBzeW1ib2wgaW4gdGhlCi0gICBzZWNvbmQgYXV4IGVudHJ5IG9mIHRoZSBjYWxsLiAgKi8KLQotI3VuZGVmIE9CSl9BQk9VVAotI2lmZGVmIE9CSl9BT1VUCi0jZGVmaW5lIE9CSl9BQk9VVAotI2VuZGlmCi0jaWZkZWYgT0JKX0JPVVQKLSNkZWZpbmUgT0JKX0FCT1VUCi0jZW5kaWYKLQotdm9pZAotdGNfc2V0X2JhbF9vZl9jYWxsIChjYWxsUCwgYmFsUCkKLSAgICAgc3ltYm9sUyAqY2FsbFA7Ci0gICAgIHN5bWJvbFMgKmJhbFA7Ci17Ci0gIGtub3cgKFRDX1NfSVNfQ0FMTE5BTUUgKGNhbGxQKSk7Ci0gIGtub3cgKFRDX1NfSVNfQkFMTkFNRSAoYmFsUCkpOwotCi0jaWZkZWYgT0JKX0NPRkYKLQotICBjYWxsUC0+c3lfdGMgPSBiYWxQOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChjYWxsUCwgMik7Ci0KLSNlbHNlIC8qICEgT0JKX0NPRkYgKi8KLSNpZmRlZiBPQkpfQUJPVVQKLQotICAvKiBJZiB0aGUgJ2JhbCcgZW50cnkgZG9lc24ndCBpbW1lZGlhdGVseSBmb2xsb3cgdGhlICdjYWxsJwotICAgICAqIHN5bWJvbCwgdW5saW5rIGl0IGZyb20gdGhlIHN5bWJvbCBsaXN0IGFuZCByZS1pbnNlcnQgaXQuCi0gICAqLwotICBpZiAoc3ltYm9sX25leHQgKGNhbGxQKSAhPSBiYWxQKQotICAgIHsKLSAgICAgIHN5bWJvbF9yZW1vdmUgKGJhbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2FwcGVuZCAoYmFsUCwgY2FsbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgIH0JCQkJLyogaWYgbm90IGluIG9yZGVyICovCi0KLSNlbHNlIC8qICEgT0JKX0FCT1VUICovCi0gIGFzX2ZhdGFsICgiT25seSBzdXBwb3J0ZWQgZm9yIGEub3V0LCBiLm91dCwgb3IgQ09GRiIpOwotI2VuZGlmIC8qICEgT0JKX0FCT1VUICovCi0jZW5kaWYgLyogISBPQkpfQ09GRiAqLwotfQotCi1zeW1ib2xTICoKLXRjX2dldF9iYWxfb2ZfY2FsbCAoY2FsbFApCi0gICAgIHN5bWJvbFMgKmNhbGxQOwotewotICBzeW1ib2xTICpyZXR2YWw7Ci0KLSAga25vdyAoVENfU19JU19DQUxMTkFNRSAoY2FsbFApKTsKLQotI2lmZGVmIE9CSl9DT0ZGCi0gIHJldHZhbCA9IGNhbGxQLT5zeV90YzsKLSNlbHNlCi0jaWZkZWYgT0JKX0FCT1VUCi0gIHJldHZhbCA9IHN5bWJvbF9uZXh0IChjYWxsUCk7Ci0jZWxzZQotICBhc19mYXRhbCAoIk9ubHkgc3VwcG9ydGVkIGZvciBhLm91dCwgYi5vdXQsIG9yIENPRkYiKTsKLSNlbmRpZiAvKiAhIE9CSl9BQk9VVCAqLwotI2VuZGlmIC8qICEgT0JKX0NPRkYgKi8KLQotICBrbm93IChUQ19TX0lTX0JBTE5BTUUgKHJldHZhbCkpOwotICByZXR1cm4gcmV0dmFsOwotfQkJCQkvKiBfdGNfZ2V0X2JhbF9vZl9jYWxsKCkgKi8KLQotdm9pZAotdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBpZiAoVENfU19JU19DQUxMTkFNRSAoc3ltYm9sUCkpCi0gICAgewotI2lmZGVmIE9CSl9DT0ZGCi0gICAgICBzeW1ib2xTICpiYWxQID0gdGNfZ2V0X2JhbF9vZl9jYWxsIChzeW1ib2xQKTsKLQotI2lmIDAKLSAgICAgIC8qIHNlY29uZCBhdXggZW50cnkgY29udGFpbnMgdGhlIGJhbCBlbnRyeSBwb2ludCAqLwotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCwgMik7Ci0jZW5kaWYKLSAgICAgIHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzFdLnhfYmFsLnhfYmFsbnRyeSA9IFNfR0VUX1ZBTFVFIChiYWxQKTsKLSAgICAgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VYVCkKLQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX0xFQUZFWFQpOwotICAgICAgZWxzZQotCVNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfTEVBRlNUQVQpOwotICAgICAgU19TRVRfREFUQV9UWVBFIChzeW1ib2xQLCBTX0dFVF9EQVRBX1RZUEUgKHN5bWJvbFApIHwgKERUX0ZDTiA8PCBOX0JUU0hGVCkpOwotICAgICAgLyogZml4IHVwIHRoZSBiYWwgc3ltYm9sICovCi0gICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChiYWxQLCBDX0xBQkVMKTsKLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotICAgIH0JCQkJLyogb25seSBvbiBjYWxscyAqLwotfQotCi12b2lkCi1pOTYwX2hhbmRsZV9hbGlnbiAoZnJhZ3ApCi0gICAgIGZyYWdTICpmcmFncDsKLXsKLSAgaWYgKCFsaW5rcmVsYXgpCi0gICAgcmV0dXJuOwotCi0jaWZuZGVmIE9CSl9CT1VUCi0KLSAgYXNfYmFkIChfKCJvcHRpb24gLS1saW5rLXJlbGF4IGlzIG9ubHkgc3VwcG9ydGVkIGluIGIub3V0IGZvcm1hdCIpKTsKLSAgbGlua3JlbGF4ID0gMDsKLSAgcmV0dXJuOwotCi0jZWxzZQotCi0gIC8qIFRoZSB0ZXh0IHNlY3Rpb24gImVuZHMiIHdpdGggYW5vdGhlciBhbGlnbm1lbnQgcmVsb2MsIHRvIHdoaWNoIHdlCi0gICAgIGFyZW4ndCBhZGRpbmcgcGFkZGluZy4gICovCi0gIGlmIChmcmFncC0+ZnJfbmV4dCA9PSB0ZXh0X2xhc3RfZnJhZwotICAgICAgfHwgZnJhZ3AtPmZyX25leHQgPT0gZGF0YV9sYXN0X2ZyYWcpCi0gICAgcmV0dXJuOwotCi0gIC8qIGFsaWdubWVudCBkaXJlY3RpdmUgKi8KLSAgZml4X25ldyAoZnJhZ3AsIGZyYWdwLT5mcl9maXgsIGZyYWdwLT5mcl9vZmZzZXQsIDAsIDAsIDAsCi0JICAgKGludCkgZnJhZ3AtPmZyX3R5cGUpOwotI2VuZGlmIC8qIE9CSl9CT1VUICovCi19Ci0KLWludAotaTk2MF92YWxpZGF0ZV9maXggKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlLCBhZGRfc3ltYm9sUFApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHNlZ1QgdGhpc19zZWdtZW50X3R5cGU7Ci0gICAgIHN5bWJvbFMgKiphZGRfc3ltYm9sUFA7Ci17Ci0jZGVmaW5lIGFkZF9zeW1ib2xQICgqYWRkX3N5bWJvbFBQKQotICBpZiAoZml4UC0+ZnhfdGNiaXQgJiYgVENfU19JU19DQUxMTkFNRSAoYWRkX3N5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIFJlbG9jYXRpb24gc2hvdWxkIGJlIGRvbmUgdmlhIHRoZSBhc3NvY2lhdGVkICdiYWwnCi0gICAgICAgICBlbnRyeSBwb2ludCBzeW1ib2wuICovCi0KLSAgICAgIGlmICghVENfU19JU19CQUxOQU1FICh0Y19nZXRfYmFsX29mX2NhbGwgKGFkZF9zeW1ib2xQKSkpCi0JewotCSAgYXNfYmFkIChfKCJObyAnYmFsJyBlbnRyeSBwb2ludCBmb3IgbGVhZnByb2MgJXMiKSwKLQkJICBTX0dFVF9OQU1FIChhZGRfc3ltYm9sUCkpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgZml4UC0+ZnhfYWRkc3kgPSBhZGRfc3ltYm9sUCA9IHRjX2dldF9iYWxfb2ZfY2FsbCAoYWRkX3N5bWJvbFApOwotICAgIH0KLSNpZiAwCi0gIC8qIFN0aWxsIGhhdmUgdG8gd29yayBvdXQgb3RoZXIgY29uZGl0aW9ucyBmb3IgdGhlc2UgdGVzdHMuICAqLwotICB7Ci0gICAgaWYgKGZpeFAtPmZ4X3RjYml0KQotICAgICAgewotCWFzX2JhZCAoXygiY2FsbGogdG8gZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyIpKTsKLQlyZXR1cm4gMTsKLSAgICAgIH0KLSAgICByZWxvY19jYWxsaiAoZml4UCk7Ci0gICAgaWYgKChpbnQpIGZpeFAtPmZ4X2JpdF9maXhQID09IDEzKQotICAgICAgewotCS8qIFRoaXMgaXMgYSBDT0JSIGluc3RydWN0aW9uLiAgVGhleSBoYXZlIG9ubHkgYSAxMy1iaXQKLQkgICBkaXNwbGFjZW1lbnQgYW5kIGFyZSBvbmx5IHRvIGJlIHVzZWQgZm9yIGxvY2FsIGJyYW5jaGVzOgotCSAgIGZsYWcgYXMgZXJyb3IsIGRvbid0IGdlbmVyYXRlIHJlbG9jYXRpb24uICAqLwotCWFzX2JhZCAoXygiY2FuJ3QgdXNlIENPQlIgZm9ybWF0IHdpdGggZXh0ZXJuYWwgbGFiZWwiKSk7Ci0JZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwkvKiBObyByZWxvY2F0aW9ucyBwbGVhc2UuICovCi0JcmV0dXJuIDE7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotI3VuZGVmIGFkZF9zeW1ib2xQCi0gIHJldHVybiAwOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBGcm9tIGNnZW4uYzogICovCi0KLXN0YXRpYyBzaG9ydAotdGNfYmZkX2ZpeDJydHlwZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSNpZiAwCi0gIGlmIChmaXhQLT5meF9ic3IpCi0gICAgYWJvcnQgKCk7Ci0jZW5kaWYKLQotICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9zaXplID09IDQpCi0gICAgcmV0dXJuIEJGRF9SRUxPQ18zMjsKLQotICBpZiAoZml4UC0+ZnhfcGNyZWwgIT0gMCAmJiBmaXhQLT5meF9zaXplID09IDQpCi0gICAgcmV0dXJuIEJGRF9SRUxPQ18yNF9QQ1JFTDsKLQotICBhYm9ydCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LgotCi0gICBGSVhNRTogVG8gd2hhdCBleHRlbnQgY2FuIHdlIGdldCBhbGwgcmVsZXZhbnQgdGFyZ2V0cyB0byB1c2UgdGhpcz8gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhQKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgYXJlbGVudCAqIHJlbG9jOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgLyogSEFDSzogSXMgdGhpcyByaWdodD8gKi8KLSAgZml4UC0+Znhfcl90eXBlID0gdGNfYmZkX2ZpeDJydHlwZSAoZml4UCk7Ci0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeFAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGV4cG9ydCByZWxvYyB0eXBlICVkIChgJXMnKSIsCi0JCSAgICBmaXhQLT5meF9yX3R5cGUsCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4UC0+Znhfcl90eXBlKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYXNzZXJ0ICghZml4UC0+ZnhfcGNyZWwgPT0gIXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpOwotCi0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeFAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5hZGRlbmQgPSBmaXhQLT5meF9hZGRudW1iZXI7Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi0vKiBlbmQgZnJvbSBjZ2VuLmMgKi8KLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotLyogZW5kIG9mIHRjLWk5NjAuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pOTYwLmggYi9nYXMvY29uZmlnL3RjLWk5NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0NmVkZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWk5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKiB0Yy1pOTYwLmggLSBCYXNpYyA4MDk2MCBpbnN0cnVjdGlvbiBmb3JtYXRzLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZuZGVmIFRDX0k5NjAKLSNkZWZpbmUgVENfSTk2MCAxCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLWk5NjAiCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2k5NjAKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qCi0gKiBUaGUgJ0NPSicgaW5zdHJ1Y3Rpb25zIGFyZSBhY3R1YWxseSBDT0JSIGluc3RydWN0aW9ucyB3aXRoIHRoZSAnYicgaW4KLSAqIHRoZSBtbmVtb25pYyByZXBsYWNlZCBieSBhICdqJzsgIHRoZXkgYXJlIEFMV0FZUyAiZGUtb3B0aW1pemVkIiBpZiBuZWNlc3Nhcnk6Ci0gKiBpZiB0aGUgZGlzcGxhY2VtZW50IHdpbGwgbm90IGZpdCBpbiAxMyBiaXRzLCB0aGUgYXNzZW1ibGVyIHdpbGwgcmVwbGFjZSB0aGVtCi0gKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBhcmUgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMuCi0gKgotICogQWxsIG9mIHRoZSAnTUVNbicgaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgc2FtZSBmb3JtYXQ7IHRoZSAnbicgaW4gdGhlIG5hbWUKLSAqIGluZGljYXRlcyB0aGUgZGVmYXVsdCBpbmRleCBzY2FsZSBmYWN0b3IgKHRoZSBzaXplIG9mIHRoZSBkYXR1bSBvcGVyYXRlZCBvbikuCi0gKgotICogVGhlIEZCUkEgZm9ybWF0cyBhcmUgbm90IGFjdHVhbGx5IGFuIGluc3RydWN0aW9uIGZvcm1hdC4gIFRoZXkgYXJlIHRoZQotICogImNvbnZlbmllbmNlIGRpcmVjdGl2ZXMiIGZvciBicmFuY2hpbmcgb24gZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbnMsCi0gKiBlYWNoIG9mIHdoaWNoIGdlbmVyYXRlcyAyIGluc3RydWN0aW9ucyAoYSAnYm5vJyBhbmQgb25lIG90aGVyIGJyYW5jaCkuCi0gKgotICogVGhlIENBTExKIGZvcm1hdCBpcyBub3QgYWN0dWFsbHkgYW4gaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgSXQgaW5kaWNhdGVzIHRoYXQKLSAqIHRoZSBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQgKGEgQ1RSTC1mb3JtYXQgJ2NhbGwnKSBzaG91bGQgaGF2ZSBpdHMgcmVsb2NhdGlvbgotICogc3BlY2lhbGx5IGZsYWdnZWQgZm9yIGxpbmstdGltZSByZXBsYWNlbWVudCB3aXRoIGEgJ2JhbCcgb3IgJ2NhbGxzJyBpZgotICogYXBwcm9wcmlhdGUuCi0gKi8KLQotLyogdGFpbG9yIGdhcyAqLwotI2RlZmluZSBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0jZGVmaW5lIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMKLQotLyogdGFpbG9yIHRoZSBjb2ZmIGZvcm1hdCAqLwotI2RlZmluZSBCRkRfQVJDSAkJCQliZmRfYXJjaF9pOTYwCi0jZGVmaW5lIENPRkZfRkxBR1MJCQkJRl9BUjMyV1IKLSNkZWZpbmUgQ09GRl9NQUdJQwkJCQlJOTYwUk9NQUdJQwotI2RlZmluZSBPQkpfQ09GRl9TRUNUSU9OX0hFQURFUl9IQVNfQUxJR05NRU5UCi0jZGVmaW5lIE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTCQkJKDIpCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKEZJWFApCQkJKCEoRklYUCktPmZ4X2RvbmUpCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKEZJWFApCQkJdGNfY29mZl9maXgycnR5cGUoRklYUCkKLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChGUkFHUCkJCXRjX2NvZmZfc2l6ZW1hY2hkZXAoRlJBR1ApCi0jZGVmaW5lIFRDX0NPRkZfU0VUX01BQ0hJTkUoSERSUykJCXRjX2hlYWRlcnNfaG9vayAoSERSUykKLWV4dGVybiB2b2lkIHRjX2hlYWRlcnNfaG9vayAoKTsKLWV4dGVybiBzaG9ydCB0Y19jb2ZmX2ZpeDJydHlwZSAoKTsKLWV4dGVybiBpbnQgdGNfY29mZl9zaXplbWFjaGRlcCAoKTsKLQotLyogTUVBTklORyBPRiAnbl9vdGhlcicgaW4gdGhlIHN5bWJvbCByZWNvcmQuCi0gKgotICogSWYgbm9uLXplcm8sIHRoZSAnbl9vdGhlcicgZmllbGRzIGluZGljYXRlcyBlaXRoZXIgYSBsZWFmIHByb2NlZHVyZSBvcgotICogYSBzeXN0ZW0gcHJvY2VkdXJlLCBhcyBmb2xsb3dzOgotICoKLSAqCTEgPD0gbl9vdGhlciA8PSAzMiA6Ci0gKgkJVGhlIHN5bWJvbCBpcyB0aGUgZW50cnkgcG9pbnQgdG8gYSBzeXN0ZW0gcHJvY2VkdXJlLgotICoJCSduX3ZhbHVlJyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW50cnksIGFzIGZvciBhbnkgb3RoZXIKLSAqCQlwcm9jZWR1cmUuICBUaGUgc3lzdGVtIHByb2NlZHVyZSBudW1iZXIgKHdoaWNoIGNhbiBiZSB1c2VkIGluCi0gKgkJYSAnY2FsbHMnIGluc3RydWN0aW9uKSBpcyAobl9vdGhlci0xKS4gIFRoZXNlIGVudHJpZXMgY29tZSBmcm9tCi0gKgkJJy5zeXNwcm9jJyBkaXJlY3RpdmVzLgotICoKLSAqCW5fb3RoZXIgPT0gTl9DQUxMTkFNRQotICoJCXRoZSBzeW1ib2wgaXMgdGhlICdjYWxsJyBlbnRyeSBwb2ludCB0byBhIGxlYWYgcHJvY2VkdXJlLgotICoJCVRoZSAqbmV4dCogc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUgbXVzdCBiZSB0aGUgY29ycmVzcG9uZGluZwotICoJCSdiYWwnIGVudHJ5IHBvaW50IHRvIHRoZSBwcm9jZWR1cmUgKHNlZSBmb2xsb3dpbmcpLiAgVGhlc2UKLSAqCQllbnRyaWVzIGNvbWUgZnJvbSAnLmxlYWZwcm9jJyBkaXJlY3RpdmVzIGluIHdoaWNoIHR3byBkaWZmZXJlbnQKLSAqCQlzeW1ib2xzIGFyZSBzcGVjaWZpZWQgKHRoZSBmaXJzdCBvbmUgaXMgcmVwcmVzZW50ZWQgaGVyZSkuCi0gKgotICoKLSAqCW5fb3RoZXIgPT0gTl9CQUxOQU1FCi0gKgkJdGhlIHN5bWJvbCBpcyB0aGUgJ2JhbCcgZW50cnkgcG9pbnQgdG8gYSBsZWFmIHByb2NlZHVyZS4KLSAqCQlUaGVzZSBlbnRyaWVzIHJlc3VsdCBmcm9tICcubGVhZnByb2MnIGRpcmVjdGl2ZXMgaW4gd2hpY2ggb25seQotICoJCW9uZSBzeW1ib2wgaXMgc3BlY2lmaWVkLCBvciBpbiB3aGljaCB0aGUgc2FtZSBzeW1ib2wgaXMKLSAqCQlzcGVjaWZpZWQgdHdpY2UuCi0gKgotICogTm90ZSB0aGF0IGFuIE5fQ0FMTE5BTUUgZW50cnkgKm11c3QqIGhhdmUgYSBjb3JyZXNwb25kaW5nIE5fQkFMTkFNRSBlbnRyeSwKLSAqIGJ1dCBub3QgZXZlcnkgTl9CQUxOQU1FIGVudHJ5IG11c3QgaGF2ZSBhbiBOX0NBTExOQU1FIGVudHJ5LgotICovCi0jZGVmaW5lCU5fQ0FMTE5BTUUJKChjaGFyKS0xKQotI2RlZmluZQlOX0JBTE5BTUUJKChjaGFyKS0yKQotCi0vKiBpOTYwIHVzZXMgYSBjdXN0b20gcmVsb2NhdGlvbiByZWNvcmQuICovCi0KLS8qIGxldCBvYmotYW91dC5oIGtub3cgKi8KLSNkZWZpbmUgQ1VTVE9NX1JFTE9DX0ZPUk1BVCAxCi0vKiBsZXQgYW91dF9nbnUuaCBrbm93ICovCi0jZGVmaW5lIE5fUkVMT0NBVElPTl9JTkZPX0RFQ0xBUkVEIDEKLXN0cnVjdCByZWxvY2F0aW9uX2luZm8KLSAgewotICAgIGludCByX2FkZHJlc3M7CQkvKiBGaWxlIGFkZHJlc3Mgb2YgaXRlbSB0byBiZSByZWxvY2F0ZWQJKi8KLSAgICB1bnNpZ25lZAotICAgICAgcl9pbmRleDoyNCwJCS8qIEluZGV4IG9mIHN5bWJvbCBvbiB3aGljaCByZWxvY2F0aW9uIGlzIGJhc2VkKi8KLSAgICAgIHJfcGNyZWw6MSwJCS8qIDEgPT4gcmVsb2NhdGUgUEMtcmVsYXRpdmU7IGVsc2UgYWJzb2x1dGUKLQkJCQkgKglPbiBpOTYwLCBwYy1yZWxhdGl2ZSBpbXBsaWVzIDI0LWJpdAotCQkJCSAqCWFkZHJlc3MsIGFic29sdXRlIGltcGxpZXMgMzItYml0LgotCQkJCSAqLwotICAgICAgcl9sZW5ndGg6MiwJCS8qIE51bWJlciBvZiBieXRlcyB0byByZWxvY2F0ZToKLQkJCQkgKgkwID0+IDEgYnl0ZQotCQkJCSAqCTEgPT4gMiBieXRlcwotCQkJCSAqCTIgPT4gNCBieXRlcyAtLSBvbmx5IHZhbHVlIHVzZWQgZm9yIGk5NjAKLQkJCQkgKi8KLSAgICAgIHJfZXh0ZXJuOjEsIHJfYnNyOjEsCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KLSAgICAgIHJfZGlzcDoxLAkJCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KLSAgICAgIHJfY2FsbGo6MSwJCS8qIDEgaWYgcmVsb2NhdGlvbiB0YXJnZXQgaXMgYW4gaTk2MCAnY2FsbGonICovCi0gICAgICBudXRoaW46MTsJCQkvKiBVbnVzZWQJCQkJKi8KLSAgfTsKLQotI2lmZGVmIE9CSl9DT0ZGCi0KLS8qIFdlIHN0b3JlIHRoZSBiYWwgaW5mb3JtYXRpb24gaW4gdGhlIHN5X3RjIGZpZWxkLiAgKi8KLSNkZWZpbmUgVENfU1lNRklFTERfVFlQRSBzeW1ib2xTICoKLQotI2RlZmluZSBUQ19BREpVU1RfUkVMT0NfQ09VTlQoRklYUCxDT1VOVCkgXAotICB7IGZpeFMgKnRjZml4cCA9IChGSVhQKTsgXAotICAgIGZvciAoO3RjZml4cDt0Y2ZpeHA9dGNmaXhwLT5meF9uZXh0KSBcCi0gICAgICBpZiAodGNmaXhwLT5meF90Y2JpdCAmJiB0Y2ZpeHAtPmZ4X2FkZHN5ICE9IDApIFwKLSAgICAgICAgKysoQ09VTlQpOyBcCi0gIH0KLSNlbmRpZgotCi1leHRlcm4gaW50IGk5NjBfdmFsaWRhdGVfZml4IFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc2VnVCwgc3ltYm9sUyAqKikpOwotI2RlZmluZSBUQ19WQUxJREFURV9GSVgoRklYUCxTRUdUWVBFLExBQkVMKSBcCi0JaWYgKGk5NjBfdmFsaWRhdGVfZml4IChGSVhQLCBTRUdUWVBFLCAmYWRkX3N5bWJvbFApICE9IDApIGdvdG8gTEFCRUwKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkgIFwKLSAgKChGSVgpLT5meF9hZGRzeSA9PSBOVUxMIFwKLSAgIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpIFwKLSAgICAgICAmJiBTX0lTX0RFRklORUQgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmICEgU19JU19DT01NT04gKChGSVgpLT5meF9hZGRzeSkpKQotI2VuZGlmCi0KLSNpZm5kZWYgT0JKX0VMRgotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVhQKQkJKChGSVhQKS0+ZnhfYnNyID09IDApCi0jZWxzZQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVhQKQkJCQkJCVwKLSAgKChGSVhQKS0+ZnhfYnNyID09IDAJCQkJCQkJXAotICAgJiYgISBTX0lTX0VYVEVSTkFMICgoRklYUCktPmZ4X2FkZHN5KQkJCQlcCi0gICAmJiAhIFNfSVNfV0VBSyAoKEZJWFApLT5meF9hZGRzeSkpCi0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgYnJ0YWJfZW1pdCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2VuZCgpCWJydGFiX2VtaXQgKCkKLQotZXh0ZXJuIHZvaWQgcmVsb2NfY2FsbGogKCk7Ci0KLWV4dGVybiB2b2lkIHRjX3NldF9iYWxfb2ZfY2FsbCBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOwotCi1leHRlcm4gc3RydWN0IHN5bWJvbCAqdGNfZ2V0X2JhbF9vZl9jYWxsIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi1leHRlcm4gdm9pZCBpOTYwX2hhbmRsZV9hbGlnbiAoKTsKLSNkZWZpbmUgSEFORExFX0FMSUdOKEZSQUcpCWk5NjBfaGFuZGxlX2FsaWduIChGUkFHKQotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQotI2RlZmluZSBOT19SRUxPQyAtMQotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotI2RlZmluZSBMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZCi0KLSNkZWZpbmUgVENfRklYX1RZUEUgc3RydWN0IHsgdW5zaWduZWQgYnNyIDogMTsgfQotI2RlZmluZSBmeF9ic3IgdGNfZml4X2RhdGEuYnNyCi0jZGVmaW5lIFRDX0lOSVRfRklYX0RBVEEoRikJKChGKS0+dGNfZml4X2RhdGEuYnNyID0gMCkKLQotI2VuZGlmCi0KLS8qIGVuZCBvZiB0Yy1pOTYwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTMyci5jIGIvZ2FzL2NvbmZpZy90Yy1tMzJyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZGU1Y2MuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tMzJyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODk4ICswLDAgQEAKLS8qIHRjLW0zMnIuYyAtLSBBc3NlbWJsZXIgZm9yIHRoZSBNaXRzdWJpc2hpIE0zMlIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAib3Bjb2Rlcy9tMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJvcGNvZGVzL20zMnItb3BjLmgiCi0jaW5jbHVkZSAiY2dlbi5oIgotCi0vKiBMaW5rZWQgbGlzdCBvZiBzeW1ib2xzIHRoYXQgYXJlIGRlYnVnZ2luZyBzeW1ib2xzIHRvIGJlIGRlZmluZWQgYXMgdGhlCi0gICBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3ltX2xpbmsKLXsKLSAgc3RydWN0IHN5bV9saW5rICpuZXh0OwotICBzeW1ib2xTCSAgKnN5bWJvbDsKLX0gc3ltX2xpbmtTOwotCi1zdGF0aWMgc3ltX2xpbmtTICpkZWJ1Z19zeW1fbGluayA9IChzeW1fbGlua1MgKikwOwotICAKLS8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiB0aGUgZGlmZmVyZW50IGNvbXBvbmVudHMgZGVzY3JpYmluZwotICAgYW4gaW5kaXZpZHVhbCBpbnN0cnVjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICBjb25zdCBDR0VOX0lOU04gKglpbnNuOwotICBjb25zdCBDR0VOX0lOU04gKglvcmlnX2luc247Ci0gIENHRU5fRklFTERTCQlmaWVsZHM7Ci0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0gIENHRU5fSU5TTl9JTlQgICAgICAgICBidWZmZXIgWzFdOwotI2RlZmluZSBJTlNOX1ZBTFVFKGJ1ZikgKCooYnVmKSkKLSNlbHNlCi0gIHVuc2lnbmVkIGNoYXIgICAgICAgICBidWZmZXIgW0NHRU5fTUFYX0lOU05fU0laRV07Ci0jZGVmaW5lIElOU05fVkFMVUUoYnVmKSAoYnVmKQotI2VuZGlmCi0gIGNoYXIgKgkJYWRkcjsKLSAgZnJhZ1MgKgkJZnJhZzsKLSAgaW50ICAgICAgICAgICAgICAgICAgIG51bV9maXh1cHM7Ci0gIGZpeFMgKiAgICAgICAgICAgICAgICBmaXh1cHMgW0dBU19DR0VOX01BWF9GSVhVUFNdOwotICBpbnQgICAgICAgICAgICAgICAgICAgaW5kaWNlcyBbTUFYX09QRVJBTkRfSU5TVEFOQ0VTXTsKLSAgc3ltX2xpbmtTCQkqZGVidWdfc3ltX2xpbms7Ci19Ci1tMzJyX2luc247Ci0KLS8qIHByZXZfaW5zbi5pbnNuIGlzIG5vbi1udWxsIGlmIGxhc3QgaW5zbiB3YXMgYSAxNiBiaXQgaW5zbiBvbiBhIDMyIGJpdAotICAgYm91bmRhcnkgKGkuZS4gd2FzIHRoZSBmaXJzdCBvZiB0d28gMTYgYml0IGluc25zKS4gICovCi1zdGF0aWMgbTMycl9pbnNuCXByZXZfaW5zbjsKLQotLyogTm9uLXplcm8gaWYgd2UndmUgc2VlbiBhIHJlbGF4YWJsZSBpbnNuIHNpbmNlIHRoZSBsYXN0IDMyIGJpdAotICAgYWxpZ25tZW50IHJlcXVlc3QuICAqLwotc3RhdGljIGludCBzZWVuX3JlbGF4YWJsZV9wID0gMDsKLQotLyogTm9uLXplcm8gaWYgLXJlbGF4IHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBzdWZmaWNpZW50IHJlbG9jcyBhcmUgb3V0cHV0Ci0gICBmb3IgdGhlIGxpbmtlciB0byBkbyByZWxheGluZy4KLSAgIFdlIGRvIHNpbXBsZSBmb3JtcyBvZiByZWxheGluZyBpbnRlcm5hbGx5LCBidXQgdGhleSBhcmUgYWx3YXlzIGRvbmUuCi0gICBUaGlzIGZsYWcgZG9lcyBub3QgYXBwbHkgdG8gdGhlbS4gICovCi1zdGF0aWMgaW50IG0zMnJfcmVsYXg7Ci0KLSNpZiAwIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0vKiBJZiBub24tTlVMTCwgcG9pbnRlciB0byBjcHUgZGVzY3JpcHRpb24gZmlsZSB0byByZWFkLgotICAgVGhpcyBhbGxvd3MgcnVudGltZSBhZGRpdGlvbnMgdG8gdGhlIGFzc2VtYmxlci4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqIG0zMnJfY3B1X2Rlc2M7Ci0jZW5kaWYKLQotLyogTm9uLXplcm8gaWYgd2FybiB3aGVuIGEgaGlnaC9zaGlnaCByZWxvYyBoYXMgbm8gbWF0Y2hpbmcgbG93IHJlbG9jLgotICAgRWFjaCBoaWdoL3NoaWdoIHJlbG9jIG11c3QgYmUgcGFpcmVkIHdpdGggaXQncyBsb3cgY291c2luIGluIG9yZGVyIHRvCi0gICBwcm9wZXJseSBjYWxjdWxhdGUgdGhlIGFkZGVuZCBpbiBhIHJlbG9jYXRhYmxlIGxpbmsgKHNpbmNlIHRoZXJlIGlzIGEKLSAgIHBvdGVudGlhbCBjYXJyeSBmcm9tIHRoZSBsb3cgdG8gdGhlIGhpZ2gvc2hpZ2gpLgotICAgVGhpcyBvcHRpb24gaXMgb2ZmIGJ5IGRlZmF1bHQgdGhvdWdoIGZvciB1c2VyLXdyaXR0ZW4gYXNzZW1ibGVyIGNvZGUgaXQKLSAgIG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gbWFrZSB0aGUgZGVmYXVsdCBiZSBvbiAoaS5lLiBoYXZlIGdjYyBwYXNzIGEgZmxhZwotICAgdG8gdHVybiBpdCBvZmYpLiAgVGhpcyB3YXJuaW5nIG11c3Qgbm90IGJlIG9uIGZvciBHQ0MgY3JlYXRlZCBjb2RlIGFzCi0gICBvcHRpbWl6YXRpb24gbWF5IGRlbGV0ZSB0aGUgbG93IGJ1dCBub3QgdGhlIGhpZ2gvc2hpZ2ggKGF0IGxlYXN0IHdlCi0gICBzaG91bGRuJ3QgYXNzdW1lIG9yIHJlcXVpcmUgaXQgdG8pLiAgKi8KLXN0YXRpYyBpbnQgd2Fybl91bm1hdGNoZWRfaGlnaCA9IDA7Ci0KLS8qIE5vbi16ZXJvIGlmIC1tMzJyeCBoYXMgYmVlbiBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2Ugc3VwcG9ydCBmb3IgdGhlCi0gICBleHRlbmRlZCBNMzJSWCBpbnN0cnVjdGlvbiBzZXQgc2hvdWxkIGJlIGVuYWJsZWQuICAqLwotc3RhdGljIGludCBlbmFibGVfbTMycnggPSAwOwotCi0vKiBOb24temVybyBpZiAtbTMycnggLWhpZGRlbiBoYXMgYmVlbiBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2Ugc3VwcG9ydCBmb3IKLSAgIHRoZSBzcGVjaWFsIE0zMlJYIGluc3RydWN0aW9uIHNldCBzaG91bGQgYmUgZW5hYmxlZC4gICovCi1zdGF0aWMgaW50IGVuYWJsZV9zcGVjaWFsID0gMDsKLQotLyogTm9uLXplcm8gaWYgdGhlIHByb2dyYW1tZXIgc2hvdWxkIGJlIHdhcm5lZCB3aGVuIGFuIGV4cGxpY2l0IHBhcmFsbGVsCi0gICBpbnN0cnVjdGlvbiBtaWdodCBoYXZlIGNvbnN0cmFpbnQgdmlvbGF0aW9ucy4gICovCi1zdGF0aWMgaW50IHdhcm5fZXhwbGljaXRfcGFyYWxsZWxfY29uZmxpY3RzID0gMTsKLQotLyogTm9uLXplcm8gaWYgaW5zbnMgY2FuIGJlIG1hZGUgcGFyYWxsZWwuICAqLwotc3RhdGljIGludCBvcHRpbWl6ZTsKLQotLyogc3R1ZmYgZm9yIC5zY29tbSBzeW1ib2xzLiAgKi8KLXN0YXRpYyBzZWdUICAgICBzYnNzX3NlY3Rpb247Ci1zdGF0aWMgYXNlY3Rpb24gc2NvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgIHNjb21fc3ltYm9sOwotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSAgICAgICAgPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdICAgPSAiIyI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gICAgICAgICAgICA9ICJlRSI7Ci1jb25zdCBjaGFyIEZMVF9DSEFSU1tdICAgICAgICAgICAgPSAiZEQiOwotCi0vKiBSZWxvY2F0aW9ucyBhZ2FpbnN0IHN5bWJvbHMgYXJlIGRvbmUgaW4gdHdvCi0gICBwYXJ0cywgd2l0aCBhIEhJIHJlbG9jYXRpb24gYW5kIGEgTE8gcmVsb2NhdGlvbi4gIEVhY2ggcmVsb2NhdGlvbgotICAgaGFzIG9ubHkgMTYgYml0cyBvZiBzcGFjZSB0byBzdG9yZSBhbiBhZGRlbmQuICBUaGlzIG1lYW5zIHRoYXQgaW4KLSAgIG9yZGVyIGZvciB0aGUgbGlua2VyIHRvIGhhbmRsZSBjYXJyaWVzIGNvcnJlY3RseSwgaXQgbXVzdCBiZSBhYmxlCi0gICB0byBsb2NhdGUgYm90aCB0aGUgSEkgYW5kIHRoZSBMTyByZWxvY2F0aW9uLiAgVGhpcyBtZWFucyB0aGF0IHRoZQotICAgcmVsb2NhdGlvbnMgbXVzdCBhcHBlYXIgaW4gb3JkZXIgaW4gdGhlIHJlbG9jYXRpb24gdGFibGUuCi0KLSAgIEluIG9yZGVyIHRvIGltcGxlbWVudCB0aGlzLCB3ZSBrZWVwIHRyYWNrIG9mIGVhY2ggdW5tYXRjaGVkIEhJCi0gICByZWxvY2F0aW9uLiAgV2UgdGhlbiBzb3J0IHRoZW0gc28gdGhhdCB0aGV5IGltbWVkaWF0ZWx5IHByZWNlZGUgdGhlCi0gICBjb3JyZXNwb25kaW5nIExPIHJlbG9jYXRpb24uICovCi0KLXN0cnVjdCBtMzJyX2hpX2ZpeHVwCi17Ci0gIHN0cnVjdCBtMzJyX2hpX2ZpeHVwICogbmV4dDsgIC8qIE5leHQgSEkgZml4dXAuICAqLwotICBmaXhTICogICAgICAgICAgICAgICAgIGZpeHA7ICAvKiBUaGlzIGZpeHVwLiAgKi8KLSAgc2VnVCAgICAgICAgICAgICAgICAgICBzZWc7ICAgLyogVGhlIHNlY3Rpb24gdGhpcyBmaXh1cCBpcyBpbi4gICovCi0KLX07Ci0KLS8qIFRoZSBsaXN0IG9mIHVubWF0Y2hlZCBISSByZWxvY3MuICAqLwotCi1zdGF0aWMgc3RydWN0IG0zMnJfaGlfZml4dXAgKiBtMzJyX2hpX2ZpeHVwX2xpc3Q7Ci0KLQwKLXN0YXRpYyB2b2lkCi1hbGxvd19tMzJyeCAob24pCi0gICAgIGludCBvbjsKLXsKLSAgZW5hYmxlX20zMnJ4ID0gb247Ci0KLSAgaWYgKHN0ZG91dHB1dCAhPSBOVUxMKQotICAgIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILAotCQkgICAgICAgZW5hYmxlX20zMnJ4ID8gYmZkX21hY2hfbTMycnggOiBiZmRfbWFjaF9tMzJyKTsKLX0KLQwKLSNkZWZpbmUgTTMyUl9TSE9SVE9QVFMgIk8iCi1jb25zdCBjaGFyICogbWRfc2hvcnRvcHRzID0gTTMyUl9TSE9SVE9QVFM7Ci0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0jZGVmaW5lIE9QVElPTl9NMzJSWAkoT1BUSU9OX01EX0JBU0UpCi0gIHsibTMycngiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX00zMlJYfSwKLSNkZWZpbmUgT1BUSU9OX1dBUk5fUEFSQUxMRUwJKE9QVElPTl9NRF9CQVNFICsgMSkKLSAgeyJ3YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0cyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9QQVJBTExFTH0sCi0gIHsiV3AiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fUEFSQUxMRUx9LAotI2RlZmluZSBPUFRJT05fTk9fV0FSTl9QQVJBTExFTAkoT1BUSU9OX01EX0JBU0UgKyAyKQotICB7Im5vLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19XQVJOX1BBUkFMTEVMfSwKLSAgeyJXbnAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1dBUk5fUEFSQUxMRUx9LAotI2RlZmluZSBPUFRJT05fU1BFQ0lBTAkoT1BUSU9OX01EX0JBU0UgKyAzKQotICB7ImhpZGRlbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1BFQ0lBTH0sCi0KLSAgLyogU2lnaC4gIEkgZ3Vlc3MgYWxsIHdhcm5pbmdzIG11c3Qgbm93IGhhdmUgYm90aCB2YXJpYW50cy4gICovCi0jZGVmaW5lIE9QVElPTl9XQVJOX1VOTUFUQ0hFRCAoT1BUSU9OX01EX0JBU0UgKyA0KQotICB7Indhcm4tdW5tYXRjaGVkLWhpZ2giLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fVU5NQVRDSEVEfSwKLSAgeyJXdWgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fVU5NQVRDSEVEfSwKLSNkZWZpbmUgT1BUSU9OX05PX1dBUk5fVU5NQVRDSEVEIChPUFRJT05fTURfQkFTRSArIDUpCi0gIHsibm8td2Fybi11bm1hdGNoZWQtaGlnaCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fV0FSTl9VTk1BVENIRUR9LAotICB7IldudWgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1dBUk5fVU5NQVRDSEVEfSwKLQotI2lmIDAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KLSNkZWZpbmUgT1BUSU9OX1JFTEFYICAoT1BUSU9OX01EX0JBU0UgKyA2KQotICB7InJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWH0sCi0jZGVmaW5lIE9QVElPTl9DUFVfREVTQyAoT1BUSU9OX01EX0JBU0UgKyA3KQotICB7ImNwdS1kZXNjIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DUFVfREVTQ30sCi0jZW5kaWYKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCAgICBjOwotICAgICBjaGFyICogYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ08nOgotICAgICAgb3B0aW1pemUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NMzJSWDoKLSAgICAgIGFsbG93X20zMnJ4ICgxKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPUFRJT05fV0FSTl9QQVJBTExFTDoKLSAgICAgIHdhcm5fZXhwbGljaXRfcGFyYWxsZWxfY29uZmxpY3RzID0gMTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPUFRJT05fTk9fV0FSTl9QQVJBTExFTDoKLSAgICAgIHdhcm5fZXhwbGljaXRfcGFyYWxsZWxfY29uZmxpY3RzID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fU1BFQ0lBTDoKLSAgICAgIGlmIChlbmFibGVfbTMycngpCi0JZW5hYmxlX3NwZWNpYWwgPSAxOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFByZXRlbmQgdGhhdCB3ZSBkbyBub3QgcmVjb2duaXNlIHRoaXMgb3B0aW9uLiAgKi8KLQkgIGFzX2JhZCAoXygiVW5yZWNvZ25pc2VkIG9wdGlvbjogLWhpZGRlbiIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fV0FSTl9VTk1BVENIRUQ6Ci0gICAgICB3YXJuX3VubWF0Y2hlZF9oaWdoID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9fV0FSTl9VTk1BVENIRUQ6Ci0gICAgICB3YXJuX3VubWF0Y2hlZF9oaWdoID0gMDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0jaWYgMCAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLwotICAgIGNhc2UgT1BUSU9OX1JFTEFYOgotICAgICAgbTMycl9yZWxheCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9DUFVfREVTQzoKLSAgICAgIG0zMnJfY3B1X2Rlc2MgPSBhcmc7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKiBzdHJlYW07Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiIE0zMlIgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnM6XG4iKSk7Ci0KLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1tMzJyeCAgICAgICAgICAgICAgICAgIHN1cHBvcnQgdGhlIGV4dGVuZGVkIG0zMnJ4IGluc3RydWN0aW9uIHNldFxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLU8gICAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIGNvbWJpbmUgaW5zdHJ1Y3Rpb25zIGluIHBhcmFsbGVsXG4iKSk7Ci0KLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC13YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0cyAgICAgd2FybiB3aGVuIHBhcmFsbGVsIGluc3RydWN0aW9uc1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZSBjb250cmFpbnRzXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtbm8td2Fybi1leHBsaWNpdC1wYXJhbGxlbC1jb25mbGljdHMgIGRvIG5vdCB3YXJuIHdoZW4gcGFyYWxsZWxcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9ucyB2aW9sYXRlIGNvbnRyYWludHNcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1XcCAgICAgICAgICAgICAgICAgICAgIHN5bm9ueW0gZm9yIC13YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0c1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLVducCAgICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLW5vLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzXG4iKSk7Ci0KLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC13YXJuLXVubWF0Y2hlZC1oaWdoICAgIHdhcm4gd2hlbiBhbiAocyloaWdoIHJlbG9jIGhhcyBubyBtYXRjaGluZyBsb3cgcmVsb2NcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1uby13YXJuLXVubWF0Y2hlZC1oaWdoIGRvIG5vdCB3YXJuIGFib3V0IG1pc3NpbmcgbG93IHJlbG9jc1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLVd1aCAgICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1XbnVoICAgICAgICAgICAgICAgICAgIHN5bm9ueW0gZm9yIC1uby13YXJuLXVubWF0Y2hlZC1oaWdoXG4iKSk7Ci0KLSNpZiAwCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtcmVsYXggICAgICAgICAgICAgICAgIGNyZWF0ZSBsaW5rZXIgcmVsYXhhYmxlIGNvZGVcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1jcHUtZGVzYyAgICAgICAgICAgICAgcHJvdmlkZSBydW50aW1lIGNwdSBkZXNjcmlwdGlvbiBmaWxlXG4iKSk7Ci0jZW5kaWYKLX0gCi0KLXN0YXRpYyB2b2lkIGZpbGxfaW5zbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG0zMnJfc2NvbW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWJ1Z19zeW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBleHBhbmRfZGVidWdfc3ltcyBQQVJBTVMgKChzeW1fbGlua1MgKiwgaW50KSk7Ci0KLS8qIFNldCBieSBtZF9hc3NlbWJsZSBmb3IgdXNlIGJ5IG0zMnJfZmlsbF9pbnNuLiAgKi8KLXN0YXRpYyBzdWJzZWdUIHByZXZfc3Vic2VnOwotc3RhdGljIHNlZ1QgcHJldl9zZWc7Ci0KLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgIndvcmQiLAljb25zLAkJNCB9LAotICB7ICJmaWxsaW5zbiIsIGZpbGxfaW5zbiwJMCB9LAotICB7ICJzY29tbSIsCW0zMnJfc2NvbW0sCTAgfSwKLSAgeyAiZGVidWdzeW0iLAlkZWJ1Z19zeW0sCTAgfSwKLSAgLyogTm90IGRvY3VtZW50ZWQgYXMgc28gZmFyIHRoZXJlIGlzIG5vIG5lZWQgZm9yIHRoZW0uLi4uICovICAKLSAgeyAibTMyciIsCWFsbG93X20zMnJ4LAkwIH0sCi0gIHsgIm0zMnJ4IiwJYWxsb3dfbTMycngsCTEgfSwKLSAgeyBOVUxMLCBOVUxMLCAwIH0KLX07Ci0KLS8qIEZJWE1FOiBTaG91bGQgYmUgbWFjaGluZSBnZW5lcmF0ZWQuICAqLwotI2RlZmluZSBOT1BfSU5TTiAweDcwMDAKLSNkZWZpbmUgUEFSX05PUF9JTlNOIDB4ZjAwMCAvKiBjYW4gb25seSBiZSB1c2VkIGluIDJuZCBzbG90ICovCi0KLS8qIFdoZW4gd2UgYWxpZ24gdGhlIC50ZXh0IHNlY3Rpb24sIGluc2VydCB0aGUgY29ycmVjdCBOT1AgcGF0dGVybi4KLSAgIE4gaXMgdGhlIHBvd2VyIG9mIDIgYWxpZ25tZW50LiAgTEVOIGlzIHRoZSBsZW5ndGggb2YgcGF0dGVybiBGSUxMLgotICAgTUFYIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAgd2hlbiBkb2luZyB0aGUgYWxpZ25tZW50LAotICAgb3IgMCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLiAgKi8KLQotaW50Ci1tMzJyX2RvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCkKLSAgICAgaW50ICAgICAgICAgIG47Ci0gICAgIGNvbnN0IGNoYXIgKiBmaWxsOwotICAgICBpbnQgICAgICAgICAgbGVuOwotICAgICBpbnQgICAgICAgICAgbWF4OwotewotICAvKiBPbmx5IGRvIHRoaXMgaWYgdGhlIGZpbGwgcGF0dGVybiB3YXNuJ3Qgc3BlY2lmaWVkLiAgKi8KLSAgaWYgKGZpbGwgPT0gTlVMTAotICAgICAgJiYgc3Vic2VnX3RleHRfcCAobm93X3NlZykKLSAgICAgIC8qIE9ubHkgZG8gdGhpcyBzcGVjaWFsIGhhbmRsaW5nIGlmIGFsaWduaW5nIHRvIGF0IGxlYXN0IGEKLQkgNCBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgICAgICYmIG4gPiAxCi0gICAgIC8qIE9ubHkgZG8gdGhpcyBzcGVjaWFsIGhhbmRsaW5nIGlmIHdlJ3JlIGFsbG93ZWQgdG8gZW1pdCBhdAotCSBsZWFzdCB0d28gYnl0ZXMuICAqLwotICAgICAgJiYgKG1heCA9PSAwIHx8IG1heCA+IDEpKQotICAgIHsKLSAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5vcF9wYXR0ZXJuW10gPSB7IDB4ZjAsIDB4MDAgfTsKLQotI2lmIDAKLSAgICAgIC8qIEZpcnN0IGFsaWduIHRvIGEgMiBieXRlIGJvdW5kYXJ5LCBpbiBjYXNlIHRoZXJlIGlzIGFuIG9kZCAuYnl0ZS4gICovCi0gICAgICAvKiBGSVhNRTogSG93IG11Y2ggbWVtb3J5IHdpbGwgY2F1c2UgZ2FzIHRvIHVzZSB3aGVuIGFzc2VtYmxpbmcgYSBiaWcKLQkgcHJvZ3JhbT8gIFBlcmhhcHMgd2UgY2FuIGF2b2lkIHRoZSBmcmFnX2FsaWduIGNhbGw/ICAqLwotICAgICAgZnJhZ19hbGlnbiAoMSwgMCwgMCk7Ci0jZW5kaWYKLSAgICAgIC8qIE5leHQgYWxpZ24gdG8gYSA0IGJ5dGUgYm91bmRhcnkgKHdlIGtub3cgbiA+PSAyKSB1c2luZyBhIHBhcmFsbGVsCi0JIG5vcC4gICovCi0gICAgICBmcmFnX2FsaWduX3BhdHRlcm4gKDIsIG5vcF9wYXR0ZXJuLCBzaXplb2Ygbm9wX3BhdHRlcm4sIDApOwotICAgICAgLyogSWYgZG9pbmcgbGFyZ2VyIGFsaWdubWVudHMgdXNlIGEgcmVwZWF0aW5nIHNlcXVlbmNlIG9mIGFwcHJvcHJpYXRlCi0JIG5vcHMuICAqLwotICAgICAgaWYgKG4gPiAyKQotCXsKLQkgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG11bHRpX25vcF9wYXR0ZXJuW10gPQotCSAgeyAweDcwLCAweDAwLCAweGYwLCAweDAwIH07Ci0JICBmcmFnX2FsaWduX3BhdHRlcm4gKG4sIG11bHRpX25vcF9wYXR0ZXJuLCBzaXplb2YgbXVsdGlfbm9wX3BhdHRlcm4sCi0JCQkgICAgICBtYXggPyBtYXggLSAyIDogMCk7Ci0JfQotICAgICAgCi0gICAgICBwcmV2X2luc24uaW5zbiA9IE5VTEw7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIElmIHRoZSBsYXN0IGluc3RydWN0aW9uIHdhcyB0aGUgZmlyc3Qgb2YgMiAxNiBiaXQgaW5zbnMsCi0gICBvdXRwdXQgYSBub3AgdG8gbW92ZSB0aGUgUEMgdG8gYSAzMiBiaXQgYm91bmRhcnkuCi0KLSAgIFRoaXMgaXMgZG9uZSB2aWEgYW4gYWxpZ25tZW50IHNwZWNpZmljYXRpb24gc2luY2UgYnJhbmNoIHJlbGF4aW5nCi0gICBtYXkgbWFrZSBpdCB1bm5lY2Vzc2FyeS4KLQotICAgSW50ZXJuYWxseSwgd2UgbmVlZCB0byBvdXRwdXQgb25lIG9mIHRoZXNlIGVhY2ggdGltZSBhIDMyIGJpdCBpbnNuIGlzCi0gICBzZWVuIGFmdGVyIGFuIGluc24gdGhhdCBpcyByZWxheGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotZmlsbF9pbnNuIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gICh2b2lkKSBtMzJyX2RvX2FsaWduICgyLCBOVUxMLCAwLCAwKTsKLSAgcHJldl9pbnNuLmluc24gPSBOVUxMOwotICBzZWVuX3JlbGF4YWJsZV9wID0gMDsKLX0KLQotLyogUmVjb3JkIHRoZSBzeW1ib2wgc28gdGhhdCB3aGVuIHdlIG91dHB1dCB0aGUgaW5zbiwgd2UgY2FuIGNyZWF0ZQotICAgYSBzeW1ib2wgdGhhdCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhpcyBpcyB1c2VkCi0gICB0byBlbWl0IHRoZSBsYWJlbCBmb3IgdGhlIHN0YXJ0IG9mIGEgYnJlYWtwb2ludCB3aXRob3V0IGNhdXNpbmcKLSAgIHRoZSBhc3NlbWJsZXIgdG8gZW1pdCBhIE5PUCBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGEKLSAgIDE2IGJpdCBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1kZWJ1Z19zeW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBkZWxpbTsKLSAgcmVnaXN0ZXIgY2hhciAqZW5kX25hbWU7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHJlZ2lzdGVyIHN5bV9saW5rUyAqbGluazsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBkZWxpbSA9IGdldF9zeW1ib2xfZW5kICgpOwotICBlbmRfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAKLSAgaWYgKChzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpKSA9PSBOVUxMCi0gICAgICAmJiAoc3ltYm9sUCA9IG1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICB9Ci0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbFApICE9IHJlZ19zZWN0aW9uKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgYXNfYmFkIChfKCJzeW1ib2wgYCVzJyBhbHJlYWR5IGRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBsaW5rID0gKHN5bV9saW5rUyAqKSB4bWFsbG9jIChzaXplb2YgKHN5bV9saW5rUykpOwotICAgICAgbGluay0+c3ltYm9sID0gc3ltYm9sUDsKLSAgICAgIGxpbmstPm5leHQgPSBkZWJ1Z19zeW1fbGluazsKLSAgICAgIGRlYnVnX3N5bV9saW5rID0gbGluazsKLSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKS0+bG9jYWwgPSAxOwotICAgIH0KLQotICAqZW5kX25hbWUgPSBkZWxpbTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogU2Vjb25kIHBhc3MgdG8gZXhwYW5kaW5nIHRoZSBkZWJ1ZyBzeW1ib2xzLCBnbyB0aHJvdWdoIGxpbmtlZAotICAgbGlzdCBvZiBzeW1ib2xzIGFuZCByZWFzc2lnbiB0aGUgYWRkcmVzcy4gICovCi0KLXN0YXRpYyB2b2lkCi1leHBhbmRfZGVidWdfc3ltcyAoc3ltcywgYWxpZ24pCi0gICAgIHN5bV9saW5rUyAqc3ltczsKLSAgICAgaW50IGFsaWduOwotewotICBjaGFyICpzYXZlX2lucHV0X2xpbmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHN5bV9saW5rUyAqbmV4dF9zeW1zOwotCi0gIGlmICghc3ltcykKLSAgICByZXR1cm47Ci0KLSAgKHZvaWQpIG0zMnJfZG9fYWxpZ24gKGFsaWduLCBOVUxMLCAwLCAwKTsKLSAgZm9yICg7IHN5bXMgIT0gKHN5bV9saW5rUyAqKTA7IHN5bXMgPSBuZXh0X3N5bXMpCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltYm9sUCA9IHN5bXMtPnN5bWJvbDsKLSAgICAgIG5leHRfc3ltcyA9IHN5bXMtPm5leHQ7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSAiLlxuIjsKLSAgICAgIHBzZXVkb19zZXQgKHN5bWJvbFApOwotICAgICAgZnJlZSAoKGNoYXIgKilzeW1zKTsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lOwotfQotCi0vKiBDb3ZlciBmdW5jdGlvbiB0byBmaWxsX2luc24gY2FsbGVkIGFmdGVyIGEgbGFiZWwgYW5kIGF0IGVuZCBvZiBhc3NlbWJseS4KLSAgIFRoZSByZXN1bHQgaXMgYWx3YXlzIDE6IHdlJ3JlIGNhbGxlZCBpbiBhIGNvbmRpdGlvbmFsIHRvIHNlZSBpZiB0aGUKLSAgIGN1cnJlbnQgbGluZSBpcyBhIGxhYmVsLiAgKi8KLQotaW50Ci1tMzJyX2ZpbGxfaW5zbiAoZG9uZSkKLSAgICAgaW50IGRvbmU7Ci17Ci0gIGlmIChwcmV2X3NlZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNlZ1QgICAgc2VnICAgID0gbm93X3NlZzsKLSAgICAgIHN1YnNlZ1Qgc3Vic2VnID0gbm93X3N1YnNlZzsKLQotICAgICAgc3Vic2VnX3NldCAocHJldl9zZWcsIHByZXZfc3Vic2VnKTsKLSAgICAgIAotICAgICAgZmlsbF9pbnNuICgwKTsKLQotICAgICAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotICAgIH0KLQotICBpZiAoZG9uZSAmJiBkZWJ1Z19zeW1fbGluaykKLSAgICB7Ci0gICAgICBleHBhbmRfZGVidWdfc3ltcyAoZGVidWdfc3ltX2xpbmssIDEpOwotICAgICAgZGVidWdfc3ltX2xpbmsgPSAoc3ltX2xpbmtTICopMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0MCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBmbGFnd29yZCBhcHBsaWNhYmxlOwotICBzZWdUICAgICBzZWc7Ci0gIHN1YnNlZ1QgIHN1YnNlZzsKLQotICAvKiBJbml0aWFsaXplIHRoZSBgY2dlbicgaW50ZXJmYWNlLiAgKi8KLSAgCi0gIC8qIFNldCB0aGUgbWFjaGluZSBudW1iZXIgYW5kIGVuZGlhbi4gICovCi0gIGdhc19jZ2VuX2NwdV9kZXNjID0gbTMycl9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX01BQ0hTLCAwLAotCQkJCQkgIENHRU5fQ1BVX09QRU5fRU5ESUFOLAotCQkJCQkgIENHRU5fRU5ESUFOX0JJRywKLQkJCQkJICBDR0VOX0NQVV9PUEVOX0VORCk7Ci0gIG0zMnJfY2dlbl9pbml0X2FzbSAoZ2FzX2NnZW5fY3B1X2Rlc2MpOwotCi0gIC8qIFRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlIGlzIHVzZWQgZHVyaW5nIG9wdGltaXphdGlvbiB0byBkZXRlcm1pbmUKLSAgICAgd2hpY2ggaW5zbnMgY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiAgSXQgaXMgYWxzbyB1c2VkIHRvIGdpdmUKLSAgICAgd2FybmluZ3MgcmVnYXJkaW5nIG9wZXJhbmQgaW50ZXJmZXJlbmNlIGluIHBhcmFsbGVsIGluc25zLiAgKi8KLSAgbTMycl9jZ2VuX2luaXRfb3BpbnN0X3RhYmxlIChnYXNfY2dlbl9jcHVfZGVzYyk7Ci0KLSAgLyogVGhpcyBpcyBhIGNhbGxiYWNrIGZyb20gY2dlbiB0byBnYXMgdG8gcGFyc2Ugb3BlcmFuZHMuICAqLwotICBjZ2VuX3NldF9wYXJzZV9vcGVyYW5kX2ZuIChnYXNfY2dlbl9jcHVfZGVzYywgZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZCk7Ci0KLSNpZiAwIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0gIC8qIElmIGEgcnVudGltZSBjcHUgZGVzY3JpcHRpb24gZmlsZSB3YXMgcHJvdmlkZWQsIHBhcnNlIGl0LiAgKi8KLSAgaWYgKG0zMnJfY3B1X2Rlc2MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICogZXJybXNnOwotCi0gICAgICBlcnJtc2cgPSBjZ2VuX3JlYWRfY3B1X2ZpbGUgKGdhc19jZ2VuX2NwdV9kZXNjLCBtMzJyX2NwdV9kZXNjKTsKLSAgICAgIGlmIChlcnJtc2cgIT0gTlVMTCkKLQlhc19iYWQgKCIlczogJXMiLCBtMzJyX2NwdV9kZXNjLCBlcnJtc2cpOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFNhdmUgdGhlIGN1cnJlbnQgc3Vic2VnIHNvIHdlIGNhbiByZXN0b3JlIGl0IFtpdCdzIHRoZSBkZWZhdWx0IG9uZSBhbmQKLSAgICAgd2UgZG9uJ3Qgd2FudCB0aGUgaW5pdGlhbCBzZWN0aW9uIHRvIGJlIC5zYnNzXS4gICovCi0gIHNlZyAgICA9IG5vd19zZWc7Ci0gIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLSAgLyogVGhlIHNic3Mgc2VjdGlvbiBpcyBmb3IgbG9jYWwgLnNjb21tIHN5bWJvbHMuICAqLwotICBzYnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnNic3MiLCAwKTsKLSAgCi0gIC8qIFRoaXMgaXMgY29waWVkIGZyb20gcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzLiAgKi8KLSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzYnNzX3NlY3Rpb24sIGFwcGxpY2FibGUgJiBTRUNfQUxMT0MpOwotICAKLSNpZiAwIC8qIFdoYXQgZG9lcyB0aGlzIGRvPyBbc2VlIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzc10gICovCi0gIHNlZ19pbmZvIChic3Nfc2VjdGlvbiktPmJzcyA9IDE7Ci0jZW5kaWYKLQotICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0KLSAgLyogV2UgbXVzdCBjb25zdHJ1Y3QgYSBmYWtlIHNlY3Rpb24gc2ltaWxhciB0byBiZmRfY29tX3NlY3Rpb24KLSAgICAgYnV0IHdpdGggdGhlIG5hbWUgLnNjb21tb24uICAqLwotICBzY29tX3NlY3Rpb24gICAgICAgICAgICAgICAgPSBiZmRfY29tX3NlY3Rpb247Ci0gIHNjb21fc2VjdGlvbi5uYW1lICAgICAgICAgICA9ICIuc2NvbW1vbiI7Ci0gIHNjb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICYgc2NvbV9zZWN0aW9uOwotICBzY29tX3NlY3Rpb24uc3ltYm9sICAgICAgICAgPSAmIHNjb21fc3ltYm9sOwotICBzY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmIHNjb21fc2VjdGlvbi5zeW1ib2w7Ci0gIHNjb21fc3ltYm9sICAgICAgICAgICAgICAgICA9ICogYmZkX2NvbV9zZWN0aW9uLnN5bWJvbDsKLSAgc2NvbV9zeW1ib2wubmFtZSAgICAgICAgICAgID0gIi5zY29tbW9uIjsKLSAgc2NvbV9zeW1ib2wuc2VjdGlvbiAgICAgICAgID0gJiBzY29tX3NlY3Rpb247Ci0KLSAgYWxsb3dfbTMycnggKGVuYWJsZV9tMzJyeCk7Ci19Ci0KLSNkZWZpbmUgT1BFUkFORF9JU19DT05EX0JJVChvcGVyYW5kLCBpbmRpY2VzLCBpbmRleCkgXAotICAoKG9wZXJhbmQpLT5od190eXBlID09IEhXX0hfQ09ORAkJCVwKLSAgIHx8ICgob3BlcmFuZCktPmh3X3R5cGUgPT0gSFdfSF9QU1cpCQkJXAotICAgfHwgKChvcGVyYW5kKS0+aHdfdHlwZSA9PSBIV19IX0NSCQkJXAotICAgICAgICYmIChpbmRpY2VzIFtpbmRleF0gPT0gMCB8fCBpbmRpY2VzIFtpbmRleF0gPT0gMSkpKQotCi0vKiBSZXR1cm5zIHRydWUgaWYgYW4gb3V0cHV0IG9mIGluc3RydWN0aW9uICdhJyBpcyByZWZlcmVuY2VkIGJ5IGFuIG9wZXJhbmQKLSAgIG9mIGluc3RydWN0aW9uICdiJy4gIElmICdjaGVja19vdXRwdXRzJyBpcyB0cnVlIHRoZW4gYidzIG91dHB1dHMgYXJlCi0gICBjaGVja2VkLCBvdGhlcndpc2UgaXRzIGlucHV0cyBhcmUgZXhhbWluZWQuICAqLwotCi1zdGF0aWMgaW50Ci1maXJzdF93cml0ZXNfdG9fc2Vjb25kc19vcGVyYW5kcyAoYSwgYiwgY2hlY2tfb3V0cHV0cykKLSAgICAgbTMycl9pbnNuICogYTsKLSAgICAgbTMycl9pbnNuICogYjsKLSAgICAgY29uc3QgaW50ICAgY2hlY2tfb3V0cHV0czsKLXsKLSAgY29uc3QgQ0dFTl9PUElOU1QgKiBhX29wZXJhbmRzID0gQ0dFTl9JTlNOX09QRVJBTkRTIChhLT5pbnNuKTsKLSAgY29uc3QgQ0dFTl9PUElOU1QgKiBiX29wcyA9IENHRU5fSU5TTl9PUEVSQU5EUyAoYi0+aW5zbik7Ci0gIGludCBhX2luZGV4OwotCi0gIC8qIElmIGF0IGxlYXN0IG9uZSBvZiB0aGUgaW5zdHJ1Y3Rpb25zIHRha2VzIG5vIG9wZXJhbmRzLCB0aGVuIHRoZXJlIGlzCi0gICAgIG5vdGhpbmcgdG8gY2hlY2suICBUaGVyZSByZWFsbHkgYXJlIGluc3RydWN0aW9ucyB3aXRob3V0IG9wZXJhbmRzLAotICAgICBlZyAnbm9wJy4gICovCi0gIGlmIChhX29wZXJhbmRzID09IE5VTEwgfHwgYl9vcHMgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgICAgIAotICAvKiBTY2FuIHRoZSBvcGVyYW5kIGxpc3Qgb2YgJ2EnIGxvb2tpbmcgZm9yIGFuIG91dHB1dCBvcGVyYW5kLiAgKi8KLSAgZm9yIChhX2luZGV4ID0gMDsKLSAgICAgICBhX29wZXJhbmRzLT50eXBlICE9IENHRU5fT1BJTlNUX0VORDsKLSAgICAgICBhX2luZGV4ICsrLCBhX29wZXJhbmRzICsrKQotICAgIHsKLSAgICAgIGlmIChhX29wZXJhbmRzLT50eXBlID09IENHRU5fT1BJTlNUX09VVFBVVCkKLQl7Ci0JICBpbnQgYl9pbmRleDsKLQkgIGNvbnN0IENHRU5fT1BJTlNUICogYl9vcGVyYW5kcyA9IGJfb3BzOwotCi0JICAvKiBTcGVjaWFsIENhc2U6Ci0JICAgICBUaGUgQ29uZGl0aW9uIGJpdCAnQycgaXMgYSBzaGFkb3cgb2YgdGhlIENCUiByZWdpc3RlciAoY29udHJvbAotCSAgICAgcmVnaXN0ZXIgMSkgYW5kIGFsc28gYSBzaGFkb3cgb2YgYml0IDMxIG9mIHRoZSBwcm9ncmFtIHN0YXR1cwotCSAgICAgd29yZCAoY29udHJvbCByZWdpc3RlciAwKS4gIEZvciBub3cgdGhpcyBpcyBoYW5kbGVkIGhlcmUsIHJhdGhlcgotCSAgICAgdGhhbiBieSBjZ2VuLi4uLiAqLwotCSAgCi0JICBpZiAoT1BFUkFORF9JU19DT05EX0JJVCAoYV9vcGVyYW5kcywgYS0+aW5kaWNlcywgYV9pbmRleCkpCi0JICAgIHsKLQkgICAgICAvKiBTY2FuIG9wZXJhbmQgbGlzdCBvZiAnYicgbG9va2luZyBmb3IgYW5vdGhlciByZWZlcmVuY2UgdG8gdGhlCi0JCSBjb25kaXRpb24gYml0LCB3aGljaCBnb2VzIGluIHRoZSByaWdodCBkaXJlY3Rpb24uICAqLwotCSAgICAgIGZvciAoYl9pbmRleCA9IDA7Ci0JCSAgIGJfb3BlcmFuZHMtPnR5cGUgIT0gQ0dFTl9PUElOU1RfRU5EOwotCQkgICBiX2luZGV4ICsrLCBiX29wZXJhbmRzICsrKQotCQl7Ci0JCSAgaWYgKChiX29wZXJhbmRzLT50eXBlCi0JCSAgICAgICA9PSAoY2hlY2tfb3V0cHV0cwotCQkJICAgPyBDR0VOX09QSU5TVF9PVVRQVVQKLQkJCSAgIDogQ0dFTl9PUElOU1RfSU5QVVQpKQotCQkgICAgICAmJiBPUEVSQU5EX0lTX0NPTkRfQklUIChiX29wZXJhbmRzLCBiLT5pbmRpY2VzLCBiX2luZGV4KSkKLQkJICAgIHJldHVybiAxOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFNjYW4gb3BlcmFuZCBsaXN0IG9mICdiJyBsb29raW5nIGZvciBhbiBvcGVyYW5kIHRoYXQKLQkJIHJlZmVyZW5jZXMgdGhlIHNhbWUgaGFyZHdhcmUgZWxlbWVudCwgYW5kIHdoaWNoIGdvZXMgaW4gdGhlCi0JCSByaWdodCBkaXJlY3Rpb24uICAqLwotCSAgICAgIGZvciAoYl9pbmRleCA9IDA7Ci0JCSAgIGJfb3BlcmFuZHMtPnR5cGUgIT0gQ0dFTl9PUElOU1RfRU5EOwotCQkgICBiX2luZGV4ICsrLCBiX29wZXJhbmRzICsrKQotCQl7Ci0JCSAgaWYgKChiX29wZXJhbmRzLT50eXBlCi0JCSAgICAgICA9PSAoY2hlY2tfb3V0cHV0cwotCQkJICAgPyBDR0VOX09QSU5TVF9PVVRQVVQKLQkJCSAgIDogQ0dFTl9PUElOU1RfSU5QVVQpKQotCQkgICAgICAmJiAoYl9vcGVyYW5kcy0+aHdfdHlwZSA9PSBhX29wZXJhbmRzLT5od190eXBlKQotCQkgICAgICAmJiAoYS0+aW5kaWNlcyBbYV9pbmRleF0gPT0gYi0+aW5kaWNlcyBbYl9pbmRleF0pKQotCQkgICAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zbiBjYW4gKHBvdGVudGlhbGx5KSBhbHRlciB0aGUgcHJvZ3JhbSBjb3VudGVyLiAgKi8KLQotc3RhdGljIGludAotd3JpdGVzX3RvX3BjIChhKQotICAgICBtMzJyX2luc24gKiBhOwotewotI2lmIDAgIC8qIE9uY2UgUEMgb3BlcmFuZHMgYXJlIHdvcmtpbmcuLi4uICovCi0gIGNvbnN0IENHRU5fT1BJTlNUICogYV9vcGVyYW5kcyA9PSBDR0VOX0lOU05fT1BFUkFORFMgKGdhc19jZ2VuX2NwdV9kZXNjLAotCQkJCQkJCWEtPmluc24pOwotCi0gIGlmIChhX29wZXJhbmRzID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgd2hpbGUgKGFfb3BlcmFuZHMtPnR5cGUgIT0gQ0dFTl9PUElOU1RfRU5EKQotICAgIHsKLSAgICAgIGlmIChhX29wZXJhbmRzLT5vcGVyYW5kICE9IE5VTEwKLQkgICYmIENHRU5fT1BFUkFORF9JTkRFWCAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGFfb3BlcmFuZHMtPm9wZXJhbmQpID09IE0zMlJfT1BFUkFORF9QQykKLQlyZXR1cm4gMTsKLSAgICAgIAotICAgICAgYV9vcGVyYW5kcyArKzsKLSAgICB9Ci0jZWxzZQotICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGEtPmluc24sIENHRU5fSU5TTl9VTkNPTkRfQ1RJKQotICAgICAgfHwgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGEtPmluc24sIENHRU5fSU5TTl9DT05EX0NUSSkpCi0gICAgcmV0dXJuIDE7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybnMgTlVMTCBpZiB0aGUgdHdvIDE2IGJpdCBpbnNucyBjYW4gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwsCi0gICBvdGhlcndpc2UgaXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYW4gZXJyb3IgbWVzc2FnZSBleHBsYWluaW5nIHdoeSBub3QuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1jYW5fbWFrZV9wYXJhbGxlbCAoYSwgYikKLSAgICAgbTMycl9pbnNuICogYTsKLSAgICAgbTMycl9pbnNuICogYjsKLXsKLSAgUElQRV9BVFRSIGFfcGlwZTsKLSAgUElQRV9BVFRSIGJfcGlwZTsKLSAgCi0gIC8qIE1ha2Ugc3VyZSB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgcmlnaHQgbGVuZ3RoLiAgKi8KLSAgaWYgKCAgIENHRU5fRklFTERTX0JJVFNJWkUgKCYgYS0+ZmllbGRzKSAhPSAxNgotICAgICAgfHwgQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBiLT5maWVsZHMpICE9IDE2KQotICAgIGFib3J0KCk7Ci0KLSAgaWYgKGZpcnN0X3dyaXRlc190b19zZWNvbmRzX29wZXJhbmRzIChhLCBiLCB0cnVlKSkKLSAgICByZXR1cm4gXygiSW5zdHJ1Y3Rpb25zIHdyaXRlIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLiIpOwotICAKLSAgYV9waXBlID0gQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGEtPmluc24sIENHRU5fSU5TTl9QSVBFKTsKLSAgYl9waXBlID0gQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGItPmluc24sIENHRU5fSU5TTl9QSVBFKTsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgaW5zdHJ1Y3Rpb25zIHVzZSB0aGUgY29ycmVjdCBleGVjdXRpb24gcGlwZWxpbmVzLiAgKi8KLSAgaWYgKCAgIGFfcGlwZSA9PSBQSVBFX05PTkUKLSAgICAgIHx8IGJfcGlwZSA9PSBQSVBFX05PTkUpCi0gICAgcmV0dXJuIF8oIkluc3RydWN0aW9ucyBkbyBub3QgdXNlIHBhcmFsbGVsIGV4ZWN1dGlvbiBwaXBlbGluZXMuIik7Ci0KLSAgLyogTGVhdmUgdGhpcyB0ZXN0IGZvciBsYXN0LCBzaW5jZSBpdCBpcyB0aGUgb25seSB0ZXN0IHRoYXQgY2FuCi0gICAgIGdvIGF3YXkgaWYgdGhlIGluc3RydWN0aW9ucyBhcmUgc3dhcHBlZCwgYW5kIHdlIHdhbnQgdG8gbWFrZQotICAgICBzdXJlIHRoYXQgYW55IG90aGVyIGVycm9ycyBhcmUgZGV0ZWN0ZWQgYmVmb3JlIHRoaXMgaGFwcGVucy4gICovCi0gIGlmICggICBhX3BpcGUgPT0gUElQRV9TCi0gICAgICB8fCBiX3BpcGUgPT0gUElQRV9PKQotICAgIHJldHVybiBfKCJJbnN0cnVjdGlvbnMgc2hhcmUgdGhlIHNhbWUgZXhlY3V0aW9uIHBpcGVsaW5lIik7Ci0gIAotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRm9yY2UgdGhlIHRvcCBiaXQgb2YgdGhlIHNlY29uZCAxNi1iaXQgaW5zbiB0byBiZSBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotbWFrZV9wYXJhbGxlbCAoYnVmZmVyKQotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLXsKLSNpZiBDR0VOX0lOVF9JTlNOX1AKLSAgKmJ1ZmZlciB8PSAweDgwMDA7Ci0jZWxzZQotICBidWZmZXIgW0NHRU5fQ1BVX0VORElBTiAoZ2FzX2NnZW5fY3B1X2Rlc2MpID09IENHRU5fRU5ESUFOX0JJRyA/IDAgOiAxXQotICAgIHw9IDB4ODA7Ci0jZW5kaWYKLX0KLQotLyogU2FtZSBhcyBtYWtlX3BhcmFsbGVsIGV4Y2VwdCBidWZmZXIgY29udGFpbnMgdGhlIGJ5dGVzIGluIHRhcmdldCBvcmRlci4gICovCi0KLXN0YXRpYyB2b2lkCi10YXJnZXRfbWFrZV9wYXJhbGxlbCAoYnVmZmVyKQotICAgICBjaGFyICpidWZmZXI7Ci17Ci0gIGJ1ZmZlciBbQ0dFTl9DUFVfRU5ESUFOIChnYXNfY2dlbl9jcHVfZGVzYykgPT0gQ0dFTl9FTkRJQU5fQklHID8gMCA6IDFdCi0gICAgfD0gMHg4MDsKLX0KLQotLyogQXNzZW1ibGUgdHdvIGluc3RydWN0aW9ucyB3aXRoIGFuIGV4cGxpY2l0IHBhcmFsbGVsIG9wZXJhdGlvbiAofHwpIG9yCi0gICBzZXF1ZW50aWFsIG9wZXJhdGlvbiAoLT4pLiAgKi8KLQotc3RhdGljIHZvaWQKLWFzc2VtYmxlX3R3b19pbnNucyAoc3RyLCBzdHIyLCBwYXJhbGxlbF9wKQotICAgICBjaGFyICogc3RyOwotICAgICBjaGFyICogc3RyMjsKLSAgICAgaW50ICAgIHBhcmFsbGVsX3A7Ci17Ci0gIGNoYXIgKiAgICBzdHIzOwotICBtMzJyX2luc24gZmlyc3Q7Ci0gIG0zMnJfaW5zbiBzZWNvbmQ7Ci0gIGNoYXIgKiAgICBlcnJtc2c7Ci0gIGNoYXIgICAgICBzYXZlX3N0cjIgPSAqc3RyMjsKLQotICAqIHN0cjIgPSAwOyAvKiBTZXBlcmF0ZSB0aGUgdHdvIGluc3RydWN0aW9ucy4gICovCi0KLSAgLyogTWFrZSBzdXJlIHRoZSB0d28gaW5zbnMgYmVnaW4gb24gYSAzMiBiaXQgYm91bmRhcnkuCi0gICAgIFRoaXMgaXMgYWxzbyBkb25lIGZvciB0aGUgc2VyaWFsIGNhc2UgKGZvbyAtPiBiYXIpLCByZWxheGluZyBkb2Vzbid0Ci0gICAgIGFmZmVjdCBpbnNucyB3cml0dGVuIGxpa2UgdGhpcy4KLSAgICAgTm90ZSB0aGF0IHdlIG11c3QgYWx3YXlzIGRvIHRoaXMgYXMgd2UgY2FuJ3QgYXNzdW1lIGFueXRoaW5nIGFib3V0Ci0gICAgIHdoZXRoZXIgd2UncmUgY3VycmVudGx5IG9uIGEgMzIgYml0IGJvdW5kYXJ5IG9yIG5vdC4gIFJlbGF4aW5nIG1heQotICAgICBjaGFuZ2UgdGhpcy4gICovCi0gIGZpbGxfaW5zbiAoMCk7Ci0KLSAgZmlyc3QuZGVidWdfc3ltX2xpbmsgPSBkZWJ1Z19zeW1fbGluazsKLSAgZGVidWdfc3ltX2xpbmsgPSAoc3ltX2xpbmtTICopMDsKLQotICAvKiBQYXJzZSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAoISAoZmlyc3QuaW5zbiA9IG0zMnJfY2dlbl9hc3NlbWJsZV9pbnNuCi0JIChnYXNfY2dlbl9jcHVfZGVzYywgc3RyLCAmIGZpcnN0LmZpZWxkcywgZmlyc3QuYnVmZmVyLCAmIGVycm1zZykpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoZXJybXNnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgaXQuICAqLwotICBpZiAoQ0dFTl9GSUVMRFNfQklUU0laRSAoJmZpcnN0LmZpZWxkcykgIT0gMTYpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygibm90IGEgMTYgYml0IGluc3RydWN0aW9uICclcyciKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZW5hYmxlX3NwZWNpYWwKLSAgICAgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChmaXJzdC5pbnNuLCBDR0VOX0lOU05fU1BFQ0lBTCkpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBpbnN0cnVjdGlvbiAnJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlIGlmICghIGVuYWJsZV9tMzJyeAotICAgICAgLyogRklYTUU6IE5lZWQgc3RhbmRhcmQgbWFjcm8gdG8gcGVyZm9ybSB0aGlzIHRlc3QuICAqLwotICAgICAgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGZpcnN0Lmluc24sIENHRU5fSU5TTl9NQUNIKSA9PSAoMSA8PCBNQUNIX00zMlJYKSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJpbnN0cnVjdGlvbiAnJXMnIGlzIGZvciB0aGUgTTMyUlggb25seSIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYW4gYWxsb3dhYmxlIHBhcmFsbGVsIGluc24uICAqLwotICBpZiAocGFyYWxsZWxfcCAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoZmlyc3QuaW5zbiwgQ0dFTl9JTlNOX1BJUEUpID09IFBJUEVfTk9ORSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJpbnN0cnVjdGlvbiAnJXMnIGNhbm5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4iKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICAqc3RyMiA9IHNhdmVfc3RyMjsgLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgYXNzZW1ibHkgdGV4dCwganVzdCBpbiBjYXNlIGl0IGlzIG5lZWRlZC4gICovCi0gIHN0cjMgID0gc3RyOyAgICAgICAvKiBTYXZlIHRoZSBvcmlnaW5hbCBzdHJpbmcgcG9pbnRlci4gICovCi0gIHN0ciAgID0gc3RyMiArIDI7ICAvKiBBZHZhbmNlZCBwYXN0IHRoZSBwYXJzZWQgc3RyaW5nLiAgKi8KLSAgc3RyMiAgPSBzdHIzOyAgICAgIC8qIFJlbWVtYmVyIHRoZSBlbnRpcmUgc3RyaW5nIGluIGNhc2UgaXQgaXMgbmVlZGVkIGZvciBlcnJvciBtZXNzYWdlcy4gICovCi0KLSAgLyogQ29udmVydCB0aGUgb3Bjb2RlIHRvIGxvd2VyIGNhc2UuICAqLwotICB7Ci0gICAgY2hhciAqczIgPSBzdHI7Ci0gICAgCi0gICAgd2hpbGUgKGlzc3BhY2UgKCpzMiArKykpCi0gICAgICBjb250aW51ZTsKLQotICAgIC0tczI7Ci0KLSAgICB3aGlsZSAoaXNhbG51bSAoKnMyKSkKLSAgICAgIHsKLQlpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpzMikpCi0JICAqczIgPSB0b2xvd2VyICgqczIpOwotCXMyICsrOwotICAgICAgfQotICB9Ci0gIAotICAvKiBQcmVzZXJ2ZSBhbnkgZml4dXBzIHRoYXQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBhbmQgcmVzZXQgdGhlIGxpc3QgdG8gZW1wdHkuICAqLwotICBnYXNfY2dlbl9zYXZlX2ZpeHVwcyAoKTsKLQotICAvKiBHZXQgdGhlIGluZGljZXMgb2YgdGhlIG9wZXJhbmRzIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBDR0VOX0ZJRUxEUyBpcyBhbHJlYWR5IHJlY29yZGVkLCBidXQgcmVseWluZyBvbiB0aGF0IGZhY3QKLSAgICAgZG9lc24ndCBzZWVtIHJpZ2h0LiAgUGVyaGFwcyBhbGxvdyBwYXNzaW5nIGZpZWxkcyBsaWtlIHdlIGRvIGluc24uICAqLwotICAvKiBGSVhNRTogQUxJQVMgaW5zbnMgZG8gbm90IGhhdmUgb3BlcmFuZHMsIHNvIHdlIHVzZSB0aGlzIGZ1bmN0aW9uCi0gICAgIHRvIGZpbmQgdGhlIGVxdWl2YWxlbnQgaW5zbiBhbmQgb3ZlcndyaXRlIHRoZSB2YWx1ZSBzdG9yZWQgaW4gb3VyCi0gICAgIHN0cnVjdHVyZS4gIFdlIHN0aWxsIG5lZWQgdGhlIG9yaWdpbmFsIGluc24sIGhvd2V2ZXIsIHNpbmNlIHRoaXMKLSAgICAgbWF5IGhhdmUgY2VydGFpbiBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSB1bmFsaWFzZWQKLSAgICAgdmVyc2lvbiAoZWcgcmVsYXhhYmlsaXR5KS4gIFdoZW4gYWxpYXNlcyBiZWhhdmUgZGlmZmVyZW50bHkgdGhpcwotICAgICBtYXkgaGF2ZSB0byBjaGFuZ2UuICAqLwotICBmaXJzdC5vcmlnX2luc24gPSBmaXJzdC5pbnNuOwotICB7Ci0gICAgQ0dFTl9GSUVMRFMgdG1wX2ZpZWxkczsKLSAgICBmaXJzdC5pbnNuID0gY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMKLSAgICAgIChnYXNfY2dlbl9jcHVfZGVzYywgTlVMTCwgSU5TTl9WQUxVRSAoZmlyc3QuYnVmZmVyKSwgTlVMTCwgMTYsCi0gICAgICAgZmlyc3QuaW5kaWNlcywgJnRtcF9maWVsZHMpOwotICB9Ci0gIAotICBpZiAoZmlyc3QuaW5zbiA9PSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJpbnRlcm5hbCBlcnJvcjogbG9va3VwL2dldCBvcGVyYW5kcyBmYWlsZWQiKSk7Ci0KLSAgc2Vjb25kLmRlYnVnX3N5bV9saW5rID0gTlVMTDsKLQotICAvKiBQYXJzZSB0aGUgc2Vjb25kIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKCEgKHNlY29uZC5pbnNuID0gbTMycl9jZ2VuX2Fzc2VtYmxlX2luc24KLQkgKGdhc19jZ2VuX2NwdV9kZXNjLCBzdHIsICYgc2Vjb25kLmZpZWxkcywgc2Vjb25kLmJ1ZmZlciwgJiBlcnJtc2cpKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKGVycm1zZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIENoZWNrIGl0LiAgKi8KLSAgaWYgKENHRU5fRklFTERTX0JJVFNJWkUgKCZzZWNvbmQuZmllbGRzKSAhPSAxNikKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJub3QgYSAxNiBiaXQgaW5zdHJ1Y3Rpb24gJyVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZSBpZiAoISBlbmFibGVfc3BlY2lhbAotICAgICAgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKHNlY29uZC5pbnNuLCBDR0VOX0lOU05fU1BFQ0lBTCkpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBpbnN0cnVjdGlvbiAnJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlIGlmICghIGVuYWJsZV9tMzJyeAotICAgICAgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKHNlY29uZC5pbnNuLCBDR0VOX0lOU05fTUFDSCkgPT0gKDEgPDwgTUFDSF9NMzJSWCkpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiaW5zdHJ1Y3Rpb24gJyVzJyBpcyBmb3IgdGhlIE0zMlJYIG9ubHkiKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYW4gYWxsb3dhYmxlIHBhcmFsbGVsIGluc24uICAqLwotICBpZiAocGFyYWxsZWxfcCAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoc2Vjb25kLmluc24sIENHRU5fSU5TTl9QSVBFKSA9PSBQSVBFX05PTkUpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiaW5zdHJ1Y3Rpb24gJyVzJyBjYW5ub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgaWYgKHBhcmFsbGVsX3AgJiYgISBlbmFibGVfbTMycngpCi0gICAgewotICAgICAgaWYgKENHRU5fSU5TTl9OVU0gKGZpcnN0Lmluc24pICE9IE0zMlJfSU5TTl9OT1AKLQkgICYmIENHRU5fSU5TTl9OVU0gKHNlY29uZC5pbnNuKSAhPSBNMzJSX0lOU05fTk9QKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBhc19iYWQgKF8oIiclcyc6IG9ubHkgdGhlIE5PUCBpbnN0cnVjdGlvbiBjYW4gYmUgaXNzdWVkIGluIHBhcmFsbGVsIG9uIHRoZSBtMzJyIiksIHN0cjIpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBpbmRpY2VzIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBzZWNvbmQub3JpZ19pbnNuID0gc2Vjb25kLmluc247Ci0gIHsKLSAgICBDR0VOX0ZJRUxEUyB0bXBfZmllbGRzOwotICAgIHNlY29uZC5pbnNuID0gY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMKLSAgICAgIChnYXNfY2dlbl9jcHVfZGVzYywgTlVMTCwgSU5TTl9WQUxVRSAoc2Vjb25kLmJ1ZmZlciksIE5VTEwsIDE2LAotICAgICAgIHNlY29uZC5pbmRpY2VzLCAmdG1wX2ZpZWxkcyk7Ci0gIH0KLSAgCi0gIGlmIChzZWNvbmQuaW5zbiA9PSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJpbnRlcm5hbCBlcnJvcjogbG9va3VwL2dldCBvcGVyYW5kcyBmYWlsZWQiKSk7Ci0KLSAgLyogV2UgYXNzdW1lIHRoYXQgaWYgdGhlIGZpcnN0IGluc3RydWN0aW9uIHdyaXRlcyB0byBhIHJlZ2lzdGVyIHRoYXQgaXMKLSAgICAgcmVhZCBieSB0aGUgc2Vjb25kIGluc3RydWN0aW9uIGl0IGlzIGJlY2F1c2UgdGhlIHByb2dyYW1tZXIgaW50ZW5kZWQKLSAgICAgdGhpcyB0byBoYXBwZW4sIChhZnRlciBhbGwgdGhleSBoYXZlIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHRoYXQgdGhlc2UKLSAgICAgdHdvIGluc3RydWN0aW9ucyBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCkuICBBbHRob3VnaCBpZiB0aGUgZ2xvYmFsCi0gICAgIHZhcmlhYmxlIHdhcm5fZXhwbGljaXRfcGFyYWxsZWxfY29uZmxpY3RzIGlzIHRydWUgdGhlbiB3ZSBkbyBnZW5lcmF0ZQotICAgICBhIHdhcm5pbmcgbWVzc2FnZS4gIFNpbWlsYXJseSB3ZSBhc3N1bWUgdGhhdCBwYXJhbGxlbCBicmFuY2ggYW5kIGp1bXAKLSAgICAgaW5zdHJ1Y3Rpb25zIGFyZSBkZWxpYmVyYXRlIGFuZCBzaG91bGQgbm90IHByb2R1Y2UgZXJyb3JzLiAgKi8KLSAgCi0gIGlmIChwYXJhbGxlbF9wICYmIHdhcm5fZXhwbGljaXRfcGFyYWxsZWxfY29uZmxpY3RzKQotICAgIHsKLSAgICAgIGlmIChmaXJzdF93cml0ZXNfdG9fc2Vjb25kc19vcGVyYW5kcyAoJiBmaXJzdCwgJiBzZWNvbmQsIGZhbHNlKSkKLQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCWFzX3dhcm4gKF8oIiVzOiBvdXRwdXQgb2YgMXN0IGluc3RydWN0aW9uIGlzIHRoZSBzYW1lIGFzIGFuIGlucHV0IHRvIDJuZCBpbnN0cnVjdGlvbiAtIGlzIHRoaXMgaW50ZW50aW9uYWwgPyIpLCBzdHIyKTsKLSAgICAgIAotICAgICAgaWYgKGZpcnN0X3dyaXRlc190b19zZWNvbmRzX29wZXJhbmRzICgmIHNlY29uZCwgJiBmaXJzdCwgZmFsc2UpKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JYXNfd2FybiAoXygiJXM6IG91dHB1dCBvZiAybmQgaW5zdHJ1Y3Rpb24gaXMgdGhlIHNhbWUgYXMgYW4gaW5wdXQgdG8gMXN0IGluc3RydWN0aW9uIC0gaXMgdGhpcyBpbnRlbnRpb25hbCA/IiksIHN0cjIpOwotICAgIH0KLSAgICAgIAotICBpZiAoIXBhcmFsbGVsX3AKLSAgICAgIHx8IChlcnJtc2cgPSAoY2hhciAqKSBjYW5fbWFrZV9wYXJhbGxlbCAoJiBmaXJzdCwgJiBzZWNvbmQpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgZml4dXBzIGZvciB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZ2FzX2NnZW5fc3dhcF9maXh1cHMgKCk7Ci0KLSAgICAgIC8qIFdyaXRlIGl0IG91dC4gICovCi0gICAgICBleHBhbmRfZGVidWdfc3ltcyAoZmlyc3QuZGVidWdfc3ltX2xpbmssIDEpOwotICAgICAgZ2FzX2NnZW5fZmluaXNoX2luc24gKGZpcnN0Lm9yaWdfaW5zbiwgZmlyc3QuYnVmZmVyLAotCQkJICAgIENHRU5fRklFTERTX0JJVFNJWkUgKCYgZmlyc3QuZmllbGRzKSwgMCwgTlVMTCk7Ci0gICAgICAKLSAgICAgIC8qIEZvcmNlIHRoZSB0b3AgYml0IG9mIHRoZSBzZWNvbmQgaW5zbiB0byBiZSBzZXQuICAqLwotICAgICAgaWYgKHBhcmFsbGVsX3ApCi0JbWFrZV9wYXJhbGxlbCAoc2Vjb25kLmJ1ZmZlcik7Ci0KLSAgICAgIC8qIEdldCBpdHMgZml4dXBzLiAgKi8KLSAgICAgIGdhc19jZ2VuX3Jlc3RvcmVfZml4dXBzICgpOwotCi0gICAgICAvKiBXcml0ZSBpdCBvdXQuICAqLwotICAgICAgZXhwYW5kX2RlYnVnX3N5bXMgKHNlY29uZC5kZWJ1Z19zeW1fbGluaywgMSk7Ci0gICAgICBnYXNfY2dlbl9maW5pc2hfaW5zbiAoc2Vjb25kLm9yaWdfaW5zbiwgc2Vjb25kLmJ1ZmZlciwKLQkJCSAgICBDR0VOX0ZJRUxEU19CSVRTSVpFICgmIHNlY29uZC5maWVsZHMpLCAwLCBOVUxMKTsKLSAgICB9Ci0gIC8qIFRyeSBzd2FwcGluZyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIHNlZSBpZiB0aGV5IHdvcmsgdGhhdCB3YXkuICAqLwotICBlbHNlIGlmIChjYW5fbWFrZV9wYXJhbGxlbCAoJiBzZWNvbmQsICYgZmlyc3QpID09IE5VTEwpCi0gICAgewotICAgICAgLyogV3JpdGUgb3V0IHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gZmlyc3QuICAqLwotICAgICAgZXhwYW5kX2RlYnVnX3N5bXMgKHNlY29uZC5kZWJ1Z19zeW1fbGluaywgMSk7Ci0gICAgICBnYXNfY2dlbl9maW5pc2hfaW5zbiAoc2Vjb25kLm9yaWdfaW5zbiwgc2Vjb25kLmJ1ZmZlciwKLQkJCSAgICBDR0VOX0ZJRUxEU19CSVRTSVpFICgmIHNlY29uZC5maWVsZHMpLCAwLCBOVUxMKTsKLSAgICAgIAotICAgICAgLyogRm9yY2UgdGhlIHRvcCBiaXQgb2YgdGhlIGZpcnN0IGluc3RydWN0aW9uIHRvIGJlIHNldC4gICovCi0gICAgICBtYWtlX3BhcmFsbGVsIChmaXJzdC5idWZmZXIpOwotCi0gICAgICAvKiBHZXQgdGhlIGZpeHVwcyBmb3IgdGhlIGZpcnN0IGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGdhc19jZ2VuX3Jlc3RvcmVfZml4dXBzICgpOwotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIGZpcnN0IGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGV4cGFuZF9kZWJ1Z19zeW1zIChmaXJzdC5kZWJ1Z19zeW1fbGluaywgMSk7Ci0gICAgICBnYXNfY2dlbl9maW5pc2hfaW5zbiAoZmlyc3Qub3JpZ19pbnNuLCBmaXJzdC5idWZmZXIsCi0JCQkgICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBmaXJzdC5maWVsZHMpLCAwLCBOVUxMKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKCInJXMnOiAlcyIsIHN0cjIsIGVycm1zZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgICAgCi0gIC8qIFNldCB0aGVzZSBzbyBtMzJyX2ZpbGxfaW5zbiBjYW4gdXNlIHRoZW0uICAqLwotICBwcmV2X3NlZyAgICA9IG5vd19zZWc7Ci0gIHByZXZfc3Vic2VnID0gbm93X3N1YnNlZzsKLX0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgbTMycl9pbnNuIGluc247Ci0gIGNoYXIgKiAgICBlcnJtc2c7Ci0gIGNoYXIgKiAgICBzdHIyID0gTlVMTDsKLQotICAvKiBJbml0aWFsaXplIEdBUydzIGNnZW4gaW50ZXJmYWNlIGZvciBhIG5ldyBpbnN0cnVjdGlvbi4gICovCi0gIGdhc19jZ2VuX2luaXRfcGFyc2UgKCk7Ci0KLSAgLyogTG9vayBmb3IgYSBwYXJhbGxlbCBpbnN0cnVjdGlvbiBzZXBlcmF0b3IuICAqLwotICBpZiAoKHN0cjIgPSBzdHJzdHIgKHN0ciwgInx8IikpICE9IE5VTEwpCi0gICAgewotICAgICAgYXNzZW1ibGVfdHdvX2luc25zIChzdHIsIHN0cjIsIDEpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBBbHNvIGxvb2sgZm9yIGEgc2VxdWVudGlhbCBpbnN0cnVjdGlvbiBzZXBlcmF0b3IuICAqLwotICBpZiAoKHN0cjIgPSBzdHJzdHIgKHN0ciwgIi0+IikpICE9IE5VTEwpCi0gICAgewotICAgICAgYXNzZW1ibGVfdHdvX2luc25zIChzdHIsIHN0cjIsIDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIGluc24uZGVidWdfc3ltX2xpbmsgPSBkZWJ1Z19zeW1fbGluazsKLSAgZGVidWdfc3ltX2xpbmsgPSAoc3ltX2xpbmtTICopMDsKLQotICBpbnNuLmluc24gPSBtMzJyX2NnZW5fYXNzZW1ibGVfaW5zbgotICAgIChnYXNfY2dlbl9jcHVfZGVzYywgc3RyLCAmIGluc24uZmllbGRzLCBpbnNuLmJ1ZmZlciwgJiBlcnJtc2cpOwotICAKLSAgaWYgKCFpbnNuLmluc24pCi0gICAgewotICAgICAgYXNfYmFkIChlcnJtc2cpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoISBlbmFibGVfc3BlY2lhbAotICAgICAgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24uaW5zbiwgQ0dFTl9JTlNOX1NQRUNJQUwpKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oInVua25vd24gaW5zdHJ1Y3Rpb24gJyVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZSBpZiAoISBlbmFibGVfbTMycngKLQkgICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbi5pbnNuLCBDR0VOX0lOU05fTUFDSCkgPT0gKDEgPDwgTUFDSF9NMzJSWCkpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiaW5zdHJ1Y3Rpb24gJyVzJyBpcyBmb3IgdGhlIE0zMlJYIG9ubHkiKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICBpZiAoQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24uaW5zbikgPT0gMzIpCi0gICAgewotICAgICAgLyogMzIgYml0IGluc25zIG11c3QgbGl2ZSBvbiAzMiBiaXQgYm91bmRhcmllcy4gICovCi0gICAgICBpZiAocHJldl9pbnNuLmluc24gfHwgc2Vlbl9yZWxheGFibGVfcCkKLQl7Ci0JICAvKiA/Pz8gSWYgY2FsbGluZyBmaWxsX2luc24gdG9vIG1hbnkgdGltZXMgdHVybnMgdXMgaW50byBhIG1lbW9yeQotCSAgICAgcGlnLCBjYW4gd2UgY2FsbCBhIGZuIHRvIGFzc2VtYmxlIGEgbm9wIGluc3RlYWQgb2YKLQkgICAgICFzZWVuX3JlbGF4YWJsZV9wPyAgKi8KLQkgIGZpbGxfaW5zbiAoMCk7Ci0JfQotCi0gICAgICBleHBhbmRfZGVidWdfc3ltcyAoaW5zbi5kZWJ1Z19zeW1fbGluaywgMik7Ci0KLSAgICAgIC8qIERvZXNuJ3QgcmVhbGx5IG1hdHRlciB3aGF0IHdlIHBhc3MgZm9yIFJFTEFYX1AgaGVyZS4gICovCi0gICAgICBnYXNfY2dlbl9maW5pc2hfaW5zbiAoaW5zbi5pbnNuLCBpbnNuLmJ1ZmZlciwKLQkJCSAgICBDR0VOX0ZJRUxEU19CSVRTSVpFICgmIGluc24uZmllbGRzKSwgMSwgTlVMTCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IG9uXzMyYml0X2JvdW5kYXJ5X3A7Ci0gICAgICBpbnQgc3dhcCA9IGZhbHNlOwotCi0gICAgICBpZiAoQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24uaW5zbikgIT0gMTYpCi0JYWJvcnQoKTsKLQotICAgICAgaW5zbi5vcmlnX2luc24gPSBpbnNuLmluc247Ci0KLSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnNuIHdhcyByZWxheGFibGUsIHRoZW4gaXQgbWF5IGJlIGV4cGFuZGVkCi0JIHRvIGZpbGwgdGhlIGN1cnJlbnQgMTYgYml0IHNsb3QuICBFbWl0IGEgTk9QIGhlcmUgdG8gb2NjdXB5Ci0JIHRoaXMgc2xvdCwgc28gdGhhdCB3ZSBjYW4gc3RhcnQgYXQgb3B0aW1pemluZyBhdCBhIDMyIGJpdAotCSBib3VuZGFyeS4gICovCi0gICAgICBpZiAocHJldl9pbnNuLmluc24gJiYgc2Vlbl9yZWxheGFibGVfcCAmJiBvcHRpbWl6ZSkKLQlmaWxsX2luc24gKDApOwotICAgICAgCi0gICAgICBpZiAoZW5hYmxlX20zMnJ4KQotCXsKLQkgIC8qIEdldCB0aGUgaW5kaWNlcyBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uLgotCSAgICAgRklYTUU6IFNlZSBhc3NlbWJsZV9wYXJhbGxlbCBmb3Igbm90ZXMgb24gb3JpZ19pbnNuLiAgKi8KLQkgIHsKLQkgICAgQ0dFTl9GSUVMRFMgdG1wX2ZpZWxkczsKLQkgICAgaW5zbi5pbnNuID0gY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMKLQkgICAgICAoZ2FzX2NnZW5fY3B1X2Rlc2MsIE5VTEwsIElOU05fVkFMVUUgKGluc24uYnVmZmVyKSwgTlVMTCwKLQkgICAgICAgMTYsIGluc24uaW5kaWNlcywgJnRtcF9maWVsZHMpOwotCSAgfQotCSAgCi0JICBpZiAoaW5zbi5pbnNuID09IE5VTEwpCi0JICAgIGFzX2ZhdGFsIChfKCJpbnRlcm5hbCBlcnJvcjogbG9va3VwL2dldCBvcGVyYW5kcyBmYWlsZWQiKSk7Ci0JfQotCi0gICAgICAvKiBDb21wdXRlIHdoZXRoZXIgd2UncmUgb24gYSAzMiBiaXQgYm91bmRhcnkgb3Igbm90LgotCSBwcmV2X2luc24uaW5zbiBpcyBOVUxMIHdoZW4gd2UncmUgb24gYSAzMiBiaXQgYm91bmRhcnkuICAqLwotICAgICAgb25fMzJiaXRfYm91bmRhcnlfcCA9IHByZXZfaW5zbi5pbnNuID09IE5VTEw7Ci0KLSAgICAgIC8qIExvb2sgdG8gc2VlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gY2FuIGJlIGNvbWJpbmVkIHdpdGggdGhlCi0JIHByZXZpb3VzIGluc3RydWN0aW9uIHRvIG1ha2Ugb25lLCBwYXJhbGxlbCwgMzIgYml0IGluc3RydWN0aW9uLgotCSBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gKHBvdGVudGlhbGx5KSBjaGFuZ2VkIHRoZSBmbG93IG9mCi0JIHByb2dyYW0gY29udHJvbCwgdGhlbiBpdCBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCB0aGUgY3VycmVudAotCSBpbnN0cnVjdGlvbi4gIElmIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGlzIHJlbGF4YWJsZSwgdGhlbiBpdAotCSBtaWdodCBiZSByZXBsYWNlZCB3aXRoIGEgbG9uZ2VyIHZlcnNpb24sIHNvIHdlIGNhbm5vdCBjb21iaW5lIGl0LgotCSBBbHNvIGlmIHRoZSBvdXRwdXQgb2YgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIHVzZWQgYXMgYW4KLQkgaW5wdXQgdG8gdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gdGhlbiBpdCBjYW5ub3QgYmUgY29tYmluZWQuCi0JIE90aGVyd2lzZSBjYWxsIGNhbl9tYWtlX3BhcmFsbGVsKCkgd2l0aCBib3RoIG9yZGVyaW5ncyBvZiB0aGUKLQkgaW5zdHJ1Y3Rpb25zIHRvIHNlZSBpZiB0aGV5IGNhbiBiZSBjb21iaW5lZC4gICovCi0gICAgICBpZiAoICAgICAhIG9uXzMyYml0X2JvdW5kYXJ5X3AKLQkgICYmICAgZW5hYmxlX20zMnJ4Ci0JICAmJiAgIG9wdGltaXplCi0JICAmJiAgIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLm9yaWdfaW5zbiwgQ0dFTl9JTlNOX1JFTEFYQUJMRSkgPT0gMAotCSAgJiYgISB3cml0ZXNfdG9fcGMgKCYgcHJldl9pbnNuKQotCSAgJiYgISBmaXJzdF93cml0ZXNfdG9fc2Vjb25kc19vcGVyYW5kcyAoJiBwcmV2X2luc24sICZpbnNuLCBmYWxzZSkKLQkgICkKLQl7Ci0JICBpZiAoY2FuX21ha2VfcGFyYWxsZWwgKCYgcHJldl9pbnNuLCAmIGluc24pID09IE5VTEwpCi0JICAgIG1ha2VfcGFyYWxsZWwgKGluc24uYnVmZmVyKTsKLQkgIGVsc2UgaWYgKGNhbl9tYWtlX3BhcmFsbGVsICgmIGluc24sICYgcHJldl9pbnNuKSA9PSBOVUxMKQotCSAgICBzd2FwID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIGV4cGFuZF9kZWJ1Z19zeW1zIChpbnNuLmRlYnVnX3N5bV9saW5rLCAxKTsKLQotICAgICAgewotCWludCBpOwotCWZpbmlzaGVkX2luc25TIGZpOwotCi0JLyogRW5zdXJlIGVhY2ggcGFpciBvZiAxNiBiaXQgaW5zbnMgaXMgaW4gdGhlIHNhbWUgZnJhZy4gICovCi0JZnJhZ19ncm93ICg0KTsKLQotCWdhc19jZ2VuX2ZpbmlzaF9pbnNuIChpbnNuLm9yaWdfaW5zbiwgaW5zbi5idWZmZXIsCi0JCQkgICAgICBDR0VOX0ZJRUxEU19CSVRTSVpFICgmIGluc24uZmllbGRzKSwKLQkJCSAgICAgIDEgLypyZWxheF9wKi8sICZmaSk7Ci0JaW5zbi5hZGRyID0gZmkuYWRkcjsKLQlpbnNuLmZyYWcgPSBmaS5mcmFnOwotCWluc24ubnVtX2ZpeHVwcyA9IGZpLm51bV9maXh1cHM7Ci0JZm9yIChpID0gMDsgaSA8IGZpLm51bV9maXh1cHM7ICsraSkKLQkgIGluc24uZml4dXBzW2ldID0gZmkuZml4dXBzW2ldOwotICAgICAgfQotCi0gICAgICBpZiAoc3dhcCkKLQl7Ci0JICBpbnQgaSx0bXA7Ci0KLSNkZWZpbmUgU1dBUF9CWVRFUyhhLGIpIHRtcCA9IGE7IGEgPSBiOyBiID0gdG1wCi0KLQkgIC8qIFN3YXAgdGhlIHR3byBpbnNucyAqLwotCSAgU1dBUF9CWVRFUyAocHJldl9pbnNuLmFkZHIgWzBdLCBpbnNuLmFkZHIgWzBdKTsKLQkgIFNXQVBfQllURVMgKHByZXZfaW5zbi5hZGRyIFsxXSwgaW5zbi5hZGRyIFsxXSk7Ci0KLQkgIHRhcmdldF9tYWtlX3BhcmFsbGVsIChpbnNuLmFkZHIpOwotCi0JICAvKiBTd2FwIGFueSByZWxheGFibGUgZnJhZ3MgcmVjb3JkZWQgZm9yIHRoZSB0d28gaW5zbnMuICAqLwotCSAgLyogRklYTUU6IENsYXJpZnkuICByZWxheGF0aW9uIHByZWNsdWRlcyBwYXJhbGxlbCBpbnNucyAqLwotCSAgaWYgKHByZXZfaW5zbi5mcmFnLT5mcl9vcGNvZGUgPT0gcHJldl9pbnNuLmFkZHIpCi0JICAgIHByZXZfaW5zbi5mcmFnLT5mcl9vcGNvZGUgPSBpbnNuLmFkZHI7Ci0JICBlbHNlIGlmIChpbnNuLmZyYWctPmZyX29wY29kZSA9PSBpbnNuLmFkZHIpCi0JICAgIGluc24uZnJhZy0+ZnJfb3Bjb2RlID0gcHJldl9pbnNuLmFkZHI7Ci0KLQkgIC8qIFVwZGF0ZSB0aGUgYWRkcmVzc2VzIGluIGFueSBmaXh1cHMuCi0JICAgICBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgZWFjaCBpbnNuIGlzIGluCi0JICAgICBhIGRpZmZlcmVudCBmcmFnIGFzIHdlIGVuc3VyZSB0aGV5J3JlIGluIHRoZSBzYW1lIGZyYWcgYWJvdmUuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IHByZXZfaW5zbi5udW1fZml4dXBzOyArK2kpCi0JICAgIHByZXZfaW5zbi5maXh1cHNbaV0tPmZ4X3doZXJlICs9IDI7Ci0JICBmb3IgKGkgPSAwOyBpIDwgaW5zbi5udW1fZml4dXBzOyArK2kpCi0JICAgIGluc24uZml4dXBzW2ldLT5meF93aGVyZSAtPSAyOwotCX0KLQotICAgICAgLyogS2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlJ3ZlIHNlZW4gYSBwYWlyIG9mIDE2IGJpdCBpbnNucy4KLQkgcHJldl9pbnNuLmluc24gaXMgTlVMTCB3aGVuIHdlJ3JlIG9uIGEgMzIgYml0IGJvdW5kYXJ5LiAgKi8KLSAgICAgIGlmIChvbl8zMmJpdF9ib3VuZGFyeV9wKQotCXByZXZfaW5zbiA9IGluc247Ci0gICAgICBlbHNlCi0JcHJldl9pbnNuLmluc24gPSBOVUxMOwotICAgICAgCi0gICAgICAvKiBJZiB0aGUgaW5zbiBuZWVkcyB0aGUgZm9sbG93aW5nIG9uZSB0byBiZSBvbiBhIDMyIGJpdCBib3VuZGFyeQotCSAoZS5nLiBzdWJyb3V0aW5lIGNhbGxzKSwgZmlsbCB0aGlzIGluc24ncyBzbG90LiAgKi8KLSAgICAgIGlmIChvbl8zMmJpdF9ib3VuZGFyeV9wCi0JICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbi5vcmlnX2luc24sIENHRU5fSU5TTl9GSUxMX1NMT1QpICE9IDApCi0JZmlsbF9pbnNuICgwKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIHJlbGF4YWJsZSBpbnNuIChjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIGxhcmdlciB2ZXJzaW9uKQotCSBtYXJrIHRoZSBmYWN0IHNvIHRoYXQgd2UgY2FuIGVtaXQgYW4gYWxpZ25tZW50IGRpcmVjdGl2ZSBmb3IgYQotCSBmb2xsb3dpbmcgMzIgYml0IGluc24gaWYgd2Ugc2VlIG9uZS4gICAqLwotICAgICAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLm9yaWdfaW5zbiwgQ0dFTl9JTlNOX1JFTEFYQUJMRSkgIT0gMCkKLQlzZWVuX3JlbGF4YWJsZV9wID0gMTsKLSAgICB9Ci0KLSAgLyogU2V0IHRoZXNlIHNvIG0zMnJfZmlsbF9pbnNuIGNhbiB1c2UgdGhlbS4gICovCi0gIHByZXZfc2VnICAgID0gbm93X3NlZzsKLSAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOwotfQotCi0vKiBUaGUgc3ludGF4IGluIHRoZSBtYW51YWwgc2F5cyBjb25zdGFudHMgYmVnaW4gd2l0aCAnIycuCi0gICBXZSBqdXN0IGlnbm9yZSBpdC4gICovCi0KLXZvaWQgCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKLXsKLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0gICAgICBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgfQotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1QgICBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWdtZW50KTsKLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqIG5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotDAotLyogLnNjb21tIHBzZXVkby1vcCBoYW5kbGVyLgotCi0gICBUaGlzIGlzIGEgbmV3IHBzZXVkby1vcCB0byBoYW5kbGUgcHV0dGluZyBvYmplY3RzIGluIC5zY29tbW9uLgotICAgQnkgZG9pbmcgdGhpcyB0aGUgbGlua2VyIHdvbid0IG5lZWQgdG8gZG8gYW55IHdvcmsgYW5kIG1vcmUgaW1wb3J0YW50bHkKLSAgIGl0IHJlbW92ZXMgdGhlIGltcGxpY2l0IC1HIGFyZyBuZWNlc3NhcnkgdG8gY29ycmVjdGx5IGxpbmsgdGhlIG9iamVjdCBmaWxlLgotKi8KLQotc3RhdGljIHZvaWQKLW0zMnJfc2NvbW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqICAgIG5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgICAgICBjOwotICByZWdpc3RlciBjaGFyICogICAgcDsKLSAgb2Zmc2V0VCAgICAgICAgICAgIHNpemU7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKiBzeW1ib2xQOwotICBvZmZzZXRUICAgICAgICAgICAgYWxpZ247Ci0gIGludCAgICAgICAgICAgICAgICBhbGlnbjI7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqIHAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZTogcmVzdCBvZiBsaW5lIGlnbm9yZWQuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyICsrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKChzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfd2FybiAoXygiLlNDT01Nb24gbGVuZ3RoICglbGQuKSA8MCEgSWdub3JlZC4iKSwgKGxvbmcpIHNpemUpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogVGhlIHRoaXJkIGFyZ3VtZW50IHRvIC5zY29tbSBpcyB0aGUgYWxpZ25tZW50LiAgKi8KLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBhbGlnbiA9IDg7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArKyBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKGFsaWduIDw9IDApCi0JewotCSAgYXNfd2FybiAoXygiaWdub3JpbmcgYmFkIGFsaWdubWVudCIpKTsKLQkgIGFsaWduID0gODsKLQl9Ci0gICAgfQotICAvKiBDb252ZXJ0IHRvIGEgcG93ZXIgb2YgMiBhbGlnbm1lbnQuICAqLwotICBpZiAoYWxpZ24pCi0gICAgewotICAgICAgZm9yIChhbGlnbjIgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+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+PSAwOyBpLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwKLQkJCSAgICAgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0JfQotICAgIH0KLSAgICAgCi0gIHJldHVybiAwOwotfQotCi12b2lkCi1tMzJyX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpCi17Ci0gIC8qIElmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIGEgc2VjdGlvbiBhbmQgd2UgaGF2ZSBqdXN0IGVtaXR0ZWQgYQotICAgICAxNiBiaXQgaW5zbiwgdGhlbiBlbWl0IGEgbm9wIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWN0aW9uIGVuZHMgb24KLSAgICAgYSAzMiBiaXQgYm91bmRhcnkuICAqLwotICAKLSAgaWYgKHByZXZfaW5zbi5pbnNuIHx8IHNlZW5fcmVsYXhhYmxlX3ApCi0gICAgKHZvaWQpIG0zMnJfZmlsbF9pbnNuICgwKTsKLX0KLQotYm9vbGVhbgotbTMycl9maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgIGZpeFMgKmZpeFA7Ci17Ci0KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0gIAotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tMzJyLmggYi9nYXMvY29uZmlnL3RjLW0zMnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjZmNhMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW0zMnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKiB0Yy1tMzJyLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLW0zMnIuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX00zMlIKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0vKiBsZWFkaW5nIHNwYWNlIHNvIHdpbGwgY29tcGlsZSB3aXRoIGNjICovCi0gI2Vycm9yIE0zMlIgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiTTMyUiBHQVMgIgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9tMzJyCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItbTMyciIKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLS8qIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBub3QgbWRfcGNyZWxfZnJvbSAqLwotbG9uZyBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzZWdUKSk7Ci0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbihGSVhQLCBTRUMpICAgCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogLi1mb28gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0vKiBGb3IgOCB2cyAxNiB2cyAzMiBiaXQgYnJhbmNoIHNlbGVjdGlvbi4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotI2lmIDAKLWV4dGVybiB2b2lkIG0zMnJfcHJlcGFyZV9yZWxheF9zY2FuICgpOwotI2RlZmluZSBtZF9wcmVwYXJlX3JlbGF4X3NjYW4oZnJhZ1AsIGFkZHJlc3MsIGFpbSwgdGhpc19zdGF0ZSwgdGhpc190eXBlKSBcCi1tMzJyX3ByZXBhcmVfcmVsYXhfc2NhbiAoZnJhZ1AsIGFkZHJlc3MsIGFpbSwgdGhpc19zdGF0ZSwgdGhpc190eXBlKQotI2Vsc2UKLWV4dGVybiBsb25nIG0zMnJfcmVsYXhfZnJhZyBQQVJBTVMgKChmcmFnUyAqLCBsb25nKSk7Ci0jZGVmaW5lIG1kX3JlbGF4X2ZyYWcoZnJhZ1AsIHN0cmV0Y2gpIFwKLW0zMnJfcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpCi0jZW5kaWYKLS8qIEFjY291bnQgZm9yIG5vcCBpZiAzMiBiaXQgaW5zbiBmYWxscyBvbiBvZGQgaGFsZndvcmQgYm91bmRhcnkuICAqLwotI2RlZmluZSBUQ19DR0VOX01BWF9SRUxBWChpbnNuLCBsZW4pICg2KQotCi0vKiBBbGlnbm1lbnRzIGFyZSB1c2VkIHRvIGVuc3VyZSAzMiBiaXQgaW5zbnMgbGl2ZSBvbiAzMiBiaXQgYm91bmRhcmllcywgc28KLSAgIHdlIHVzZSBhIHNwZWNpYWwgYWxpZ25tZW50IGZ1bmN0aW9uIHRvIGluc2VydCB0aGUgY29ycmVjdCBub3AgcGF0dGVybi4gICovCi1leHRlcm4gaW50IG0zMnJfZG9fYWxpZ24gUEFSQU1TICgoaW50LCBjb25zdCBjaGFyICosIGludCwgaW50KSk7Ci0jZGVmaW5lIG1kX2RvX2FsaWduKG4sIGZpbGwsIGxlbiwgbWF4LCBsKSBcCi1pZiAobTMycl9kb19hbGlnbiAobiwgZmlsbCwgbGVuLCBtYXgpKSBnb3RvIGwKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0jZGVmaW5lIG1kX2FwcGx5X2ZpeDMgZ2FzX2NnZW5fbWRfYXBwbHlfZml4MwotCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBtMzJyX2ZpeF9hZGp1c3RhYmxlKGZpeFApCi0KLS8qIEFmdGVyIGNyZWF0aW5nIGEgZml4dXAgZm9yIGFuIGluc3RydWN0aW9uIG9wZXJhbmQsIHdlIG5lZWQgdG8gY2hlY2sgZm9yCi0gICBISTE2IHJlbG9jcyBhbmQgcXVldWUgdGhlbSB1cCBmb3IgbGF0ZXIgc29ydGluZy4gICovCi0jZGVmaW5lIG1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCBtMzJyX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cAotCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotCi0jZGVmaW5lIHRjX2dlbl9yZWxvYyBnYXNfY2dlbl90Y19nZW5fcmVsb2MKLQotI2RlZmluZSB0Y19mcm9iX2ZpbGUoKSBtMzJyX2Zyb2JfZmlsZSAoKQotZXh0ZXJuIHZvaWQgbTMycl9mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIGVtaXQgdmFyaW91cyByZWxvY3Mgd2Ugb3RoZXJ3aXNlIHdvdWxkbid0LiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXgpIG0zMnJfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotZXh0ZXJuIGludCBtMzJyX2ZvcmNlX3JlbG9jYXRpb24gKCk7Ci0KLS8qIEVuc3VyZSBpbnNucyBhdCBsYWJlbHMgYXJlIGFsaWduZWQgdG8gMzIgYml0IGJvdW5kYXJpZXMuICAqLwotaW50IG0zMnJfZmlsbF9pbnNuIFBBUkFNUyAoKGludCkpOwotI2RlZmluZSBtZF9hZnRlcl9wYXNzX2hvb2soKQltMzJyX2ZpbGxfaW5zbiAoMSkKLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoY2gsIHB0cikJKGNoID09ICc6JyAmJiBtMzJyX2ZpbGxfaW5zbiAoMCkpCi0KLS8qIEFkZCBleHRyYSBNMzJSIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIuc2RhdGEiLAkJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgfSwgXAotICB7ICIuc2JzcyIsCQlTSFRfTk9CSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgfSwKLQotI2RlZmluZSBtZF9jbGVhbnVwICAgICAgICAgICAgICAgICBtMzJyX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0jZGVmaW5lIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rIG0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLWV4dGVybiB2b2lkIG0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7ICAgIApkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tNjg4NTEuaCBiL2dhcy9jb25maWcvdGMtbTY4ODUxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmQ3NDEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tNjg4NTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtbTY4ODUxLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIHBtbXUuaAotICovCi0KLS8qIEkgc3VwcG9zZSB3ZSBoYXZlIHRvIGNvcHlyaWdodCB0aGlzIGZpbGUuICBTb21lb25lIG9uIHRoZSBuZXQgc2VudCBpdAotICAgdG8gdXMgYXMgcGFydCBvZiB0aGUgY2hhbmdlcyBmb3IgdGhlIG02ODg1MSBNZW1vcnkgTWFuYWdlbWVudCBVbml0ICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk4NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR2FzLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgVGhlIEdOVSBhc3NlbWJsZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWS4gIE5vIGF1dGhvciBvciBkaXN0cmlidXRvcgotICAgYWNjZXB0cyByZXNwb25zaWJpbGl0eSB0byBhbnlvbmUgZm9yIHRoZSBjb25zZXF1ZW5jZXMgb2YgdXNpbmcgaXQKLSAgIG9yIGZvciB3aGV0aGVyIGl0IHNlcnZlcyBhbnkgcGFydGljdWxhciBwdXJwb3NlIG9yIHdvcmtzIGF0IGFsbCwKLSAgIHVubGVzcyBoZSBzYXlzIHNvIGluIHdyaXRpbmcuICBSZWZlciB0byB0aGUgR05VIEFzc2VtYmxlciBHZW5lcmFsCi0gICBQdWJsaWMgTGljZW5zZSBmb3IgZnVsbCBkZXRhaWxzLgotICAgCi0gICBFdmVyeW9uZSBpcyBncmFudGVkIHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUKLSAgIHRoZSBHTlUgQXNzZW1ibGVyLCBidXQgb25seSB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXNjcmliZWQgaW4gdGhlCi0gICBHTlUgQXNzZW1ibGVyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBIGNvcHkgb2YgdGhpcyBsaWNlbnNlIGlzCi0gICBzdXBwb3NlZCB0byBoYXZlIGJlZW4gZ2l2ZW4gdG8geW91IGFsb25nIHdpdGggdGhlIEdOVSBBc3NlbWJsZXIKLSAgIHNvIHlvdSBjYW4ga25vdyB5b3VyIHJpZ2h0cyBhbmQgcmVzcG9uc2liaWxpdGllcy4gIEl0IHNob3VsZCBiZQotICAgaW4gYSBmaWxlIG5hbWVkIENPUFlJTkcuICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBjb3B5cmlnaHQKLSAgIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4gICovCi0KLSNpZmRlZiBtNjg4NTEKLQotLyoKLSAgSSBkaWRuJ3QgdXNlIG11Y2ggaW1hZ2luYXRpb24gaW4gY2hvb3NpbmcgdGhlIAotICBmb2xsb3dpbmcgY29kZXMsIHNvIG1hbnkgb2YgdGhlbSBhcmVuJ3QgdmVyeQotICBtbmVtb25pYy4gLXJhYgotICAKLSAgUCAgcG1tdSByZWdpc3RlcgotICBQb3NzaWJsZSB2YWx1ZXM6Ci0gIDAwMAlUQwlUcmFuc2xhdGlvbiBDb250cm9sIHJlZwotICAxMDAJQ0FMCUN1cnJlbnQgQWNjZXNzIExldmVsCi0gIDEwMQlWQUwJVmFsaWRhdGUgQWNjZXNzIExldmVsCi0gIDExMAlTQ0MJU3RhY2sgQ2hhbmdlIENvbnRyb2wKLSAgMTExCUFDCUFjY2VzcyBDb250cm9sCi0gIAotICBXICB3aWRlIHBtbXUgcmVnaXN0ZXJzCi0gIFBvc3NpYmxlIHZhbHVlczoKLSAgMDAxCURSUAlEbWEgUm9vdCBQb2ludGVyCi0gIDAxMAlTUlAJU3VwZXJ2aXNvciBSb290IFBvaW50ZXIKLSAgMDExCUNSUAlDcHUgUm9vdCBQb2ludGVyCi0gIAotICBmCWZ1bmN0aW9uIGNvZGUgcmVnaXN0ZXIKLSAgMAlTRkMKLSAgMQlERkMKLSAgCi0gIFYJVkFMIHJlZ2lzdGVyIG9ubHkKLSAgCi0gIFgJQkFEeCwgQkFDeAotICAxMDAJQkFECUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgRGF0YQotICAxMDEJQkFDCUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgQ29udHJvbAotICAKLSAgWQlQU1IKLSAgWglQQ1NSCi0gIAotICB8CW1lbW9yeSAJCShtb2RlcyAyLTYsIDcuKikKLSAgCi0gICovCi0KLS8qCi0gKiB0aGVzZSBkZWZpbmVzIHNob3VsZCBiZSBpbiBtNjhrLmMgYnV0Ci0gKiBpIHB1dCB0aGVtIGhlcmUgdG8ga2VlcCBhbGwgdGhlIG02ODg1MSBzdHVmZgotICogdG9nZXRoZXIgLXJhYgotICogSkYtLU1ha2Ugc3VyZSB0aGVzZSAjcyBkb24ndCBjbGFzaCB3aXRoIHRoZSBvbmVzIGluIG02OGsuYwotICogVGhhdCB3b3VsZCBiZSBCQUQuCi0gKi8KLSNkZWZpbmUgVEMJKEZQUysxKQkJLyogNDggKi8KLSNkZWZpbmUgRFJQCShUQysxKQkJLyogNDkgKi8KLSNkZWZpbmUgU1JQCShEUlArMSkJCS8qIDUwICovCi0jZGVmaW5lIENSUAkoU1JQKzEpCQkvKiA1MSAqLwotI2RlZmluZSBDQUwJKENSUCsxKQkJLyogNTIgKi8KLSNkZWZpbmUgVkFMCShDQUwrMSkJCS8qIDUzICovCi0jZGVmaW5lIFNDQwkoVkFMKzEpCQkvKiA1NCAqLwotI2RlZmluZSBBQwkoU0NDKzEpCQkvKiA1NSAqLwotI2RlZmluZSBCQUQJKEFDKzEpCQkvKiA1Niw1Nyw1OCw1OSwgNjAsNjEsNjIsNjMgKi8KLSNkZWZpbmUgQkFDCShCQUQrOCkJCS8qIDY0LDY1LDY2LDY3LCA2OCw2OSw3MCw3MSAqLwotI2RlZmluZSBQU1IJKEJBQys4KQkJLyogNzIgKi8KLSNkZWZpbmUgUENTUgkoUFNSKzEpCQkvKiA3MyAqLwotCi0vKiBuYW1lICovCS8qIG9wY29kZSAqLwkJLyogbWF0Y2ggKi8JCS8qIGFyZ3MgKi8KLQoteyJwYmFjIiwJb25lKDB4ZjBjNyksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmFjdyIsCW9uZSgweGYwODcpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJhcyIsCW9uZSgweGYwYzYpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJhc3ciLAlvbmUoMHhmMDg2KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYmMiLAlvbmUoMHhmMGMxKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYmN3IiwJb25lKDB4ZjA4MSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmJzIiwJb25lKDB4ZjBjMCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmJzdyIsCW9uZSgweGYwODApLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJjYyIsCW9uZSgweGYwY2YpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJjY3ciLAlvbmUoMHhmMDhmKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiY3MiLAlvbmUoMHhmMGNlKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiY3N3IiwJb25lKDB4ZjA4ZSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmdjIiwJb25lKDB4ZjBjZCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmdjdyIsCW9uZSgweGYwOGQpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJncyIsCW9uZSgweGYwY2MpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJnc3ciLAlvbmUoMHhmMDhjKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiaWMiLAlvbmUoMHhmMGNiKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiaWN3IiwJb25lKDB4ZjA4YiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmlzIiwJb25lKDB4ZjBjYSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmlzdyIsCW9uZSgweGYwOGEpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJsYyIsCW9uZSgweGYwYzMpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJsY3ciLAlvbmUoMHhmMDgzKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBibHMiLAlvbmUoMHhmMGMyKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBibHN3IiwJb25lKDB4ZjA4MiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYnNjIiwJb25lKDB4ZjBjNSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYnNjdyIsCW9uZSgweGYwODUpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJzcyIsCW9uZSgweGYwYzQpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJzc3ciLAlvbmUoMHhmMDg0KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBid2MiLAlvbmUoMHhmMGM5KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBid2N3IiwJb25lKDB4ZjA4OSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYndzIiwJb25lKDB4ZjBjOCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYndzdyIsCW9uZSgweGYwODgpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLSAgICAKLSAgICAKLXsicGRiYWMiLAl0d28oMHhmMDQ4LCAweDAwMDcpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJhcyIsCXR3bygweGYwNDgsIDB4MDAwNiksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmJjIiwJdHdvKDB4ZjA0OCwgMHgwMDAxKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiYnMiLAl0d28oMHhmMDQ4LCAweDAwMDApLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJjYyIsCXR3bygweGYwNDgsIDB4MDAwZiksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmNzIiwJdHdvKDB4ZjA0OCwgMHgwMDBlKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiZ2MiLAl0d28oMHhmMDQ4LCAweDAwMGQpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJncyIsCXR3bygweGYwNDgsIDB4MDAwYyksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmljIiwJdHdvKDB4ZjA0OCwgMHgwMDBiKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiaXMiLAl0d28oMHhmMDQ4LCAweDAwMGEpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJsYyIsCXR3bygweGYwNDgsIDB4MDAwMyksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmxzIiwJdHdvKDB4ZjA0OCwgMHgwMDAyKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRic2MiLAl0d28oMHhmMDQ4LCAweDAwMDUpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJzcyIsCXR3bygweGYwNDgsIDB4MDAwNCksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYndjIiwJdHdvKDB4ZjA0OCwgMHgwMDA5KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRid3MiLAl0d28oMHhmMDQ4LCAweDAwMDgpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAotICAgIAoteyJwZmx1c2hhIiwJdHdvKDB4ZjAwMCwgMHgyNDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiIgfSwKLSAgICAKLXsicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzMDEwKSwJdHdvKDB4ZmZjMCwgMHhmZTEwKSwJIlQzVDkiIH0sCi17InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzgxMCksCXR3bygweGZmYzAsIDB4ZmUxMCksCSJUM1Q5JnMiIH0sCi17InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzAwOCksCXR3bygweGZmYzAsIDB4ZmUxOCksCSJEM1Q5IiB9LAoteyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDM4MDgpLAl0d28oMHhmZmMwLCAweGZlMTgpLAkiRDNUOSZzIiB9LAoteyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDMwMDApLAl0d28oMHhmZmMwLCAweGZlMWUpLAkiZjNUOSIgfSwKLXsicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzODAwKSwJdHdvKDB4ZmZjMCwgMHhmZTFlKSwJImYzVDkmcyIgfSwKLSAgICAKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQxMCksCXR3bygweGZmZjgsIDB4ZmUxMCksCSJUM1Q5IiB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzAwKSwJdHdvKDB4ZmZmOCwgMHhmZTAwKSwJIlQzVDkmcyIgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwOCksCXR3bygweGZmZjgsIDB4ZmUxOCksCSJEM1Q5IiB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzA4KSwJdHdvKDB4ZmZmOCwgMHhmZTE4KSwJIkQzVDkmcyIgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwMCksCXR3bygweGZmZjgsIDB4ZmUxZSksCSJmM1Q5IiB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzAwKSwJdHdvKDB4ZmZmOCwgMHhmZTFlKSwJImYzVDkmcyJ9LAotICAgIAoteyJwZmx1c2hyIiwJdHdvKDB4ZjAwMCwgMHhhMDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJInxzIiB9LAotICAgIAoteyJwbG9hZHIiLAl0d28oMHhmMDAwLCAweDIyMTApLAl0d28oMHhmZmMwLCAweGZmZjApLAkiVDMmcyIgfSwKLXsicGxvYWRyIiwJdHdvKDB4ZjAwMCwgMHgyMjA4KSwJdHdvKDB4ZmZjMCwgMHhmZmY4KSwJIkQzJnMiIH0sCi17InBsb2FkciIsCXR3bygweGYwMDAsIDB4MjIwMCksCXR3bygweGZmYzAsIDB4ZmZmZSksCSJmMyZzIiB9LAoteyJwbG9hZHciLAl0d28oMHhmMDAwLCAweDIwMTApLAl0d28oMHhmZmMwLCAweGZmZjApLAkiVDMmcyIgfSwKLXsicGxvYWR3IiwJdHdvKDB4ZjAwMCwgMHgyMDA4KSwJdHdvKDB4ZmZjMCwgMHhmZmY4KSwJIkQzJnMiIH0sCi17InBsb2FkdyIsCXR3bygweGYwMDAsIDB4MjAwMCksCXR3bygweGZmYzAsIDB4ZmZmZSksCSJmMyZzIiB9LAotICAgIAotICAgIC8qIFRDLCBDUlAsIERSUCwgU1JQLCBDQUwsIFZBTCwgU0NDLCBBQyAqLwoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDAwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSIqc1A4IiB9LAoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDIwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSJQOCVzIiB9LAoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDAwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSJ8c1c4IiB9LAoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDIwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSJXOH5zIiB9LAotICAgIAotICAgIC8qIEJBRHgsIEJBQ3ggKi8KLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDYyMDApLAl0d28oMHhmZmMwLCAweGUzZTMpLAkiKnNYMyIgfSwKLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDYwMDApLAl0d28oMHhmZmMwLCAweGUzZTMpLAkiWDMlcyIgfSwKLSAgICAKLSAgICAvKiBQU1IsIFBDU1IgKi8KLSAgICAvKiB7InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MTAwKSwJdHdvKG94ZmZjMCwgb3hmZmZmKSwJIipzWjgiIH0sICovCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIipzWTgiIH0sCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MjAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIlk4JXMiIH0sCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2NjAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIlo4JXMiIH0sCi0gICAgCi17InByZXN0b3JlIiwJb25lKDB4ZjE0MCksCQlvbmUoMHhmZmMwKSwJCSImcyJ9LAoteyJwcmVzdG9yZSIsCW9uZSgweGYxNTgpLAkJb25lKDB4ZmZmOCksCQkiK3MifSwKLXsicHNhdmUiLAlvbmUoMHhmMTAwKSwJCW9uZSgweGZmYzApLAkJIiZzIn0sCi17InBzYXZlIiwJb25lKDB4ZjEwMCksCQlvbmUoMHhmZmMwKSwJCSIrcyJ9LAotICAgIAoteyJwc2FjIiwJdHdvKDB4ZjA0MCwgMHgwMDA3KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzYXMiLAl0d28oMHhmMDQwLCAweDAwMDYpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNiYyIsCXR3bygweGYwNDAsIDB4MDAwMSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2JzIiwJdHdvKDB4ZjA0MCwgMHgwMDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzY2MiLAl0d28oMHhmMDQwLCAweDAwMGYpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNjcyIsCXR3bygweGYwNDAsIDB4MDAwZSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2djIiwJdHdvKDB4ZjA0MCwgMHgwMDBkKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzZ3MiLAl0d28oMHhmMDQwLCAweDAwMGMpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNpYyIsCXR3bygweGYwNDAsIDB4MDAwYiksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2lzIiwJdHdvKDB4ZjA0MCwgMHgwMDBhKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzbGMiLAl0d28oMHhmMDQwLCAweDAwMDMpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNscyIsCXR3bygweGYwNDAsIDB4MDAwMiksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc3NjIiwJdHdvKDB4ZjA0MCwgMHgwMDA1KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzc3MiLAl0d28oMHhmMDQwLCAweDAwMDQpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHN3YyIsCXR3bygweGYwNDAsIDB4MDAwOSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc3dzIiwJdHdvKDB4ZjA0MCwgMHgwMDA4KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi0gICAgCi17InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODIxMCksCXR3bygweGZmYzAsIDB4ZTNmMCksCSJUMyZzUTgiIH0sCi17InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODMxMCksCXR3bygweGZmYzAsIDB4ZTMxMCksCSJUMyZzUThBOSIgfSwKLXsicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MjA4KSwJdHdvKDB4ZmZjMCwgMHhlM2Y4KSwJIkQzJnNROCIgfSwKLXsicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MzA4KSwJdHdvKDB4ZmZjMCwgMHhlMzE4KSwJIkQzJnNROEE5IiB9LAoteyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgyMDApLAl0d28oMHhmZmMwLCAweGUzZmUpLAkiZjMmc1E4IiB9LAoteyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgzMDApLAl0d28oMHhmZmMwLCAweGUzMWUpLAkiZjMmc1E4QTkiIH0sCi0gICAgCi17InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODAxMCksCXR3bygweGZmYzAsIDB4ZTNmMCksCSJUMyZzUTgiIH0sCi17InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODExMCksCXR3bygweGZmYzAsIDB4ZTMxMCksCSJUMyZzUThBOSIgfSwKLXsicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MDA4KSwJdHdvKDB4ZmZjMCwgMHhlM2Y4KSwJIkQzJnNROCIgfSwKLXsicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MTA4KSwJdHdvKDB4ZmZjMCwgMHhlMzE4KSwJIkQzJnNROEE5IiB9LAoteyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgwMDApLAl0d28oMHhmZmMwLCAweGUzZmUpLAkiZjMmc1E4IiB9LAoteyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgxMDApLAl0d28oMHhmZmMwLCAweGUzMWUpLAkiZjMmc1E4QTkiIH0sCi0gICAgCi17InB0cmFwYWN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA3KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwYWNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA3KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwYWMiLAl0d28oMHhmMDdjLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwYXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwYXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwYXMiLAl0d28oMHhmMDdjLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwYmN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwYmNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwYmMiLAl0d28oMHhmMDdjLCAweDAwMDEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwYnN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwYnNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwYnMiLAl0d28oMHhmMDdjLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwY2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwY2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwY2MiLAl0d28oMHhmMDdjLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwY3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwY3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwY3MiLAl0d28oMHhmMDdjLCAweDAwMGUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwZ2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBkKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwZ2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBkKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwZ2MiLAl0d28oMHhmMDdjLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwZ3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwZ3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwZ3MiLAl0d28oMHhmMDdjLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwaWN3IiwJdHdvKDB4ZjA3YSwgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwaWNsIiwJdHdvKDB4ZjA3YiwgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwaWMiLAl0d28oMHhmMDdjLCAweDAwMGIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwaXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDBhKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwaXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDBhKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwaXMiLAl0d28oMHhmMDdjLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwbGN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwbGNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwbGMiLAl0d28oMHhmMDdjLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwbHN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwbHNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwbHMiLAl0d28oMHhmMDdjLCAweDAwMDIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwc2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA1KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwc2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA1KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwc2MiLAl0d28oMHhmMDdjLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwc3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwc3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwc3MiLAl0d28oMHhmMDdjLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwd2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwd2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwd2MiLAl0d28oMHhmMDdjLCAweDAwMDkpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwd3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA4KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwd3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA4KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwd3MiLAl0d28oMHhmMDdjLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MjgwMCksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJWcyZzIn0sCi17InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MmMwMCksCXR3bygweGZmYzAsIDB4ZmZmOCksCSJBMyZzIiB9LAotICAgIAotI2VuZGlmIC8qIG02ODg1MSAqLwotCi0vKiBlbmQgb2YgdGMtbTY4ODUxLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTY4ay5jIGIvZ2FzL2NvbmZpZy90Yy1tNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDk2NjUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTM4ICswLDAgQEAKLS8qIHRjLW02OGsuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIG02OGsgZmFtaWx5Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgIm9wY29kZS9tNjhrLmgiCi0jaW5jbHVkZSAibTY4ay1wYXJzZS5oIgotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikKLSNpbmNsdWRlICJlbGYvbTY4ay5oIgotI2VuZGlmCi0KLS8qIFRoaXMgc3RyaW5nIGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bC4gIFRoZSBtYWNybwotICAgdGNfY29tbWVudF9jaGFycyBwb2ludHMgdG8gdGhpcy4gIFdlIHVzZSB0aGlzLCByYXRoZXIgdGhhbiB0aGUKLSAgIHVzdWFsIGNvbW1lbnRfY2hhcnMsIHNvIHRoYXQgdGhlIC0tYml0d2lzZS1vciBvcHRpb24gd2lsbCB3b3JrLiAgKi8KLSNpZiBkZWZpbmVkIChURV9TVlI0KSB8fCBkZWZpbmVkIChURV9ERUxUQSkKLWNvbnN0IGNoYXIgKm02OGtfY29tbWVudF9jaGFycyA9ICJ8IyI7Ci0jZWxzZQotY29uc3QgY2hhciAqbTY4a19jb21tZW50X2NoYXJzID0gInwiOwotI2VuZGlmCi0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsuICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMqIjsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1DT05TVCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsIGFzCi0gICBpbiAiMGYxMi40NTYiIG9yICIwZDEuMjM0NWUxMiIuICAqLwotCi1DT05TVCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhlRXBQIjsKLQotLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMgLiAgSWRlYWxseSBpdCBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0IGl0IGF0IGFsbCwKLSAgIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLiAgKi8KLQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSA4OwkvKiBTaXplIG9mIHJlbG9jYXRpb24gcmVjb3JkICovCi0KLS8qIEFyZSB3ZSB0cnlpbmcgdG8gZ2VuZXJhdGUgUElDIGNvZGU/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+PSAyKTsKLSAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0yXSB8PSAweDE7Ci0gICAgICBidWZmZXJfYWRkcmVzc1stMV0gPSAweDMwOwotICAgICAgZXh0ID0gNDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoZXh0KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmZmVyX2FkZHJlc3MsIChsb25nKSBkaXNwLCAoaW50KSBleHQpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBleHQ7Ci0gICAgfQotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWMsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgbWRfY29udmVydF9mcmFnXzEgKGZyYWdQKTsKLX0KLQotI2Vsc2UKLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICBiZmQgKmFiZmQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2VnVCBzZWMgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBtZF9jb252ZXJ0X2ZyYWdfMSAoZnJhZ1ApOwotfQotI2VuZGlmCi0KLS8qIEZvcmNlIHRydWx5IHVuZGVmaW5lZCBzeW1ib2xzIHRvIHRoZWlyIG1heGltdW0gc2l6ZSwgYW5kIGdlbmVyYWxseSBzZXQgdXAKLSAgIHRoZSBmcmFnIGxpc3QgdG8gYmUgcmVsYXhlZAotICAgKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLXsKLSAgaW50IG9sZF9maXg7Ci0gIHJlZ2lzdGVyIGNoYXIgKmJ1ZmZlcl9hZGRyZXNzID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsOwotCi0gIG9sZF9maXggPSBmcmFnUC0+ZnJfZml4OwotCi0gIC8qIGhhbmRsZSBTWl9VTkRFRiBmaXJzdCwgaXQgY2FuIGJlIGNoYW5nZWQgdG8gQllURSBvciBTSE9SVCAqLwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLQotICAgIGNhc2UgVEFCIChBQlJBTkNILCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKChmcmFnUC0+ZnJfc3ltYm9sICE9IE5VTEwpCS8qIE5vdCBhYnNvbHV0ZSAqLwotCSAgICAmJiBTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50Ci0JICAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGZyYWdQLT5mcl9zeW1ib2wpKQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoVEFCVFlQRSAoZnJhZ1AtPmZyX3N1YnR5cGUpLCBCWVRFKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JZWxzZSBpZiAoKGZyYWdQLT5mcl9zeW1ib2wgPT0gMCkgfHwgIUhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpKQotCSAgewotCSAgICAvKiBPbiA2ODAwMCwgb3IgZm9yIGFic29sdXRlIHZhbHVlLCBzd2l0Y2ggdG8gYWJzIGxvbmcgKi8KLQkgICAgLyogRklYTUUsIHdlIHNob3VsZCBjaGVjayBhYnMgdmFsLCBwaWNrIHNob3J0IG9yIGxvbmcgKi8KLQkgICAgaWYgKGZyYWdQLT5mcl9vcGNvZGVbMF0gPT0gMHg2MSkKLQkgICAgICB7Ci0JCWZyYWdQLT5mcl9vcGNvZGVbMF0gPSAweDRFOwotCQlmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gKGNoYXIpIDB4Qjk7IC8qIEpCU1Igd2l0aCBBQlNMIExPTkcgb2Zmc2V0ICovCi0JCWZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LAotCQkJIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLQkJZnJhZ1AtPmZyX2ZpeCArPSA0OwotCQlmcmFnX3dhbmUgKGZyYWdQKTsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKGZyYWdQLT5mcl9vcGNvZGVbMF0gPT0gMHg2MCkKLQkgICAgICB7Ci0JCWZyYWdQLT5mcl9vcGNvZGVbMF0gPSAweDRFOwotCQlmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gKGNoYXIpIDB4Rjk7IC8qIEpNUCAgd2l0aCBBQlNMIExPTkcgb2Zmc2V0ICovCi0JCWZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCA0LAotCQkJIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLQkJZnJhZ1AtPmZyX2ZpeCArPSA0OwotCQlmcmFnX3dhbmUgKGZyYWdQKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWFzX3dhcm4gKF8oIkxvbmcgYnJhbmNoIG9mZnNldCB0byBleHRlcm4gc3ltYm9sIG5vdCBzdXBwb3J0ZWQuIikpOwotCSAgICAgIH0KLQkgIH0KLQllbHNlCi0JICB7CQkJLyogU3ltYm9sIGlzIHN0aWxsIHVuZGVmaW5lZC4gIE1ha2UgaXQgc2ltcGxlICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCAoaW50KSAoZnJhZ1AtPmZyX2ZpeCksIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhmZjsKLQkgICAgZnJhZ193YW5lIChmcmFnUCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JYnJlYWs7Ci0gICAgICB9CQkJCS8qIGNhc2UgVEFCKEFCUkFOQ0gsU1pfVU5ERUYpICovCi0KLSAgICBjYXNlIFRBQiAoRkJSQU5DSCwgU1pfVU5ERUYpOgotICAgICAgewotCWlmICgoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAotCSAgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICAgIHx8IGZsYWdfc2hvcnRfcmVmcykKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKEZCUkFOQ0gsIFNIT1JUKTsKLQkgICAgZnJhZ1AtPmZyX3ZhciArPSAyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgZml4X25ldyAoZnJhZ1AsIChpbnQpIGZyYWdQLT5mcl9maXgsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gfD0gMHg0MDsgLyogVHVybiBvbiBMT05HIGJpdCAqLwotCSAgICBmcmFnX3dhbmUgKGZyYWdQKTsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0JCQkJLyogVEFCKEZCUkFOQ0gsU1pfVU5ERUYpICovCi0KLSAgICBjYXNlIFRBQiAoUENSRUwsIFNaX1VOREVGKToKLSAgICAgIHsKLQlpZiAoKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKLQkgICAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGZyYWdQLT5mcl9zeW1ib2wpKQotCSAgICB8fCBmbGFnX3Nob3J0X3JlZnMKLQkgICAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAotCSAgICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpID09IG1jZjUyMDApCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ1JFTCwgU0hPUlQpOwotCSAgICBmcmFnUC0+ZnJfdmFyICs9IDI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoUENSRUwsIExPTkcpOwotCSAgICBmcmFnUC0+ZnJfdmFyICs9IDQ7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9CQkJCS8qIFRBQihQQ1JFTCxTWl9VTkRFRikgKi8KLQotICAgIGNhc2UgVEFCIChCQ0M2ODAwMCwgU1pfVU5ERUYpOgotICAgICAgewotCWlmICgoZnJhZ1AtPmZyX3N5bWJvbCAhPSBOVUxMKQotCSAgICAmJiBTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50Ci0JICAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGZyYWdQLT5mcl9zeW1ib2wpKQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoQkNDNjgwMDAsIEJZVEUpOwotCSAgICBicmVhazsKLQkgIH0KLQkvKiBvbmx5IEJjYyA2ODAwMCBpbnN0cnVjdGlvbnMgY2FuIGNvbWUgaGVyZSAqLwotCS8qIGNoYW5nZSBiY2MgaW50byBiIWNjL2ptcCBhYnNsIGxvbmcgKi8KLQlmcmFnUC0+ZnJfb3Bjb2RlWzBdIF49IDB4MDE7CS8qIGludmVydCBiY2MgKi8KLQlpZiAoZmxhZ19zaG9ydF9yZWZzKQotCSAgewotCSAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gMHgwNDsJLyogYnJhbmNoIG9mZnNldCA9IDYgKi8KLQkgICAgLyogSkY6IHRoZXNlIHdlcmUgZnJfb3Bjb2RlWzIsM10gKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbMF0gPSAweDRlOwkvKiBwdXQgaW4gam1wIGxvbmcgKDB4NGVmOSkgKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbMV0gPSAoY2hhcikgMHhmODsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwkvKiBhY2NvdW50IGZvciBqbXAgaW5zdHJ1Y3Rpb24gKi8KLQkgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gMHgwNjsJLyogYnJhbmNoIG9mZnNldCA9IDYgKi8KLQkgICAgLyogSkY6IHRoZXNlIHdlcmUgZnJfb3Bjb2RlWzIsM10gKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbMF0gPSAweDRlOwkvKiBwdXQgaW4gam1wIGxvbmcgKDB4NGVmOSkgKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbMV0gPSAoY2hhcikgMHhmOTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwkvKiBhY2NvdW50IGZvciBqbXAgaW5zdHJ1Y3Rpb24gKi8KLQkgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICB9Ci0JZnJhZ193YW5lIChmcmFnUCk7Ci0JYnJlYWs7Ci0gICAgICB9CQkJCS8qIGNhc2UgVEFCKEJDQzY4MDAwLFNaX1VOREVGKSAqLwotCi0gICAgY2FzZSBUQUIgKERCQ0MsIFNaX1VOREVGKToKLSAgICAgIHsKLQlpZiAoZnJhZ1AtPmZyX3N5bWJvbCAhPSBOVUxMCi0JICAgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKLQkgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChEQkNDLCBTSE9SVCk7Ci0JICAgIGZyYWdQLT5mcl92YXIgKz0gMjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JLyogb25seSBEQmNjIDY4MDAwIGluc3RydWN0aW9ucyBjYW4gY29tZSBoZXJlICovCi0JLyogY2hhbmdlIGRiY2MgaW50byBkYmNjL2ptcCBhYnNsIGxvbmcgKi8KLQkvKiBKRjogdGhlc2UgdXNlZCB0byBiZSBmcl9vcGNvZGVbMi00XSwgd2hpY2ggaXMgd3JvbmcuICovCi0JYnVmZmVyX2FkZHJlc3NbMF0gPSAweDAwOwkvKiBicmFuY2ggb2Zmc2V0ID0gNCAqLwotCWJ1ZmZlcl9hZGRyZXNzWzFdID0gMHgwNDsKLQlidWZmZXJfYWRkcmVzc1syXSA9IDB4NjA7CS8qIHB1dCBpbiBicmEgcGMgKyAuLi4gKi8KLQotCWlmIChmbGFnX3Nob3J0X3JlZnMpCi0JICB7Ci0JICAgIC8qIEpGOiB0aGVzZSB3ZXJlIGZyX29wY29kZVs1LTddICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzNdID0gMHgwNDsJLyogcGx1cyA0ICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzRdID0gMHg0ZTsJLyogUHV0IGluIEp1bXAgV29yZCAqLwotCSAgICBidWZmZXJfYWRkcmVzc1s1XSA9IChjaGFyKSAweGY4OwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDY7CS8qIGFjY291bnQgZm9yIGJyYS9qbXAgaW5zdHJ1Y3Rpb24gKi8KLQkgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiBKRjogdGhlc2Ugd2VyZSBmcl9vcGNvZGVbNS03XSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1szXSA9IDB4MDY7CS8qIFBsdXMgNiAqLwotCSAgICBidWZmZXJfYWRkcmVzc1s0XSA9IDB4NGU7CS8qIHB1dCBpbiBqbXAgbG9uZyAoMHg0ZWY5KSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1s1XSA9IChjaGFyKSAweGY5OwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDY7CS8qIGFjY291bnQgZm9yIGJyYS9qbXAgaW5zdHJ1Y3Rpb24gKi8KLQkgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICB9Ci0KLQlmcmFnX3dhbmUgKGZyYWdQKTsKLQlicmVhazsKLSAgICAgIH0JCQkJLyogY2FzZSBUQUIoREJDQyxTWl9VTkRFRikgKi8KLQotICAgIGNhc2UgVEFCIChQQ0xFQSwgU1pfVU5ERUYpOgotICAgICAgewotCWlmICgoKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpKSA9PSBzZWdtZW50Ci0JICAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgICAgfHwgZmxhZ19zaG9ydF9yZWZzCi0JICAgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLQkgICAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA9PSBtY2Y1MjAwKQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoUENMRUEsIFNIT1JUKTsKLQkgICAgZnJhZ1AtPmZyX3ZhciArPSAyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFBDTEVBLCBMT05HKTsKLQkgICAgZnJhZ1AtPmZyX3ZhciArPSA2OwotCSAgfQotCWJyZWFrOwotICAgICAgfQkJCQkvKiBUQUIoUENMRUEsU1pfVU5ERUYpICovCi0KLSAgICBjYXNlIFRBQiAoUENJTkRFWCwgU1pfVU5ERUYpOgotICAgICAgaWYgKChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50Ci0JICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwCi0JICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpID09IG1jZjUyMDApCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFBDSU5ERVgsIEJZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoUENJTkRFWCwgTE9ORyk7Ci0JICBmcmFnUC0+ZnJfdmFyICs9IDQ7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGF0IFNaX1VOREVGIGFyZSB0YWtlbiBjYXJlIG9mLCBjaGVjayBvdGhlcnMgKi8KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBUQUIgKEJDQzY4MDAwLCBCWVRFKToKLSAgICBjYXNlIFRBQiAoQUJSQU5DSCwgQllURSk6Ci0gICAgICAvKiBXZSBjYW4ndCBkbyBhIHNob3J0IGp1bXAgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIHNvIGluIHRoYXQKLQkgY2FzZSB3ZSBmb3JjZSB3b3JkIG1vZGUuICBBdCB0aGlzIHBvaW50IFNfR0VUX1ZBTFVFIHNob3VsZAotCSByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgc3ltYm9sIHdpdGhpbiBpdHMgZnJhZy4gIElmIHRoZQotCSBzeW1ib2wgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgZnJhZywgYW5kIGl0IGlzIHRoZSBuZXh0IGZyYWcKLQkgd2l0aCBhbnkgZGF0YSBpbiBpdCAodXN1YWxseSB0aGlzIGlzIGp1c3QgdGhlIG5leHQgZnJhZywgYnV0Ci0JIGFzc2VtYmxlciBsaXN0aW5ncyBtYXkgaW50cm9kdWNlIGVtcHR5IGZyYWdzKSwgd2UgbXVzdCB1c2UKLQkgd29yZCBtb2RlLiAgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfc3ltYm9sICYmIFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSAwKQotCXsKLQkgIGZyYWdTICpzdG9wOwotCSAgZnJhZ1MgKmw7Ci0KLQkgIHN0b3AgPSBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdQLT5mcl9zeW1ib2wpOwotCSAgZm9yIChsID0gZnJhZ1AtPmZyX25leHQ7IGwgIT0gc3RvcDsgbCA9IGwtPmZyX25leHQpCi0JICAgIGlmIChsLT5mcl9maXggKyBsLT5mcl92YXIgIT0gMCkKLQkgICAgICBicmVhazsKLQkgIGlmIChsID09IHN0b3ApCi0JICAgIHsKLQkgICAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoVEFCVFlQRSAoZnJhZ1AtPmZyX3N1YnR5cGUpLCBTSE9SVCk7Ci0JICAgICAgZnJhZ1AtPmZyX3ZhciArPSAyOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZpeDsKLX0KLQotI2lmIGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkKLS8qIHRoZSBiaXQtZmllbGQgZW50cmllcyBpbiB0aGUgcmVsb2NhdGlvbl9pbmZvIHN0cnVjdCBwbGF5cyBoZWxsCi0gICB3aXRoIHRoZSBieXRlLW9yZGVyIHByb2JsZW1zIG9mIGNyb3NzLWFzc2VtYmx5LiAgU28gYXMgYSBoYWNrLAotICAgSSBhZGRlZCB0aGlzIG1hY2guIGRlcGVuZGVudCByaSB0d2lkZGxlci4gIFVnbHksIGJ1dCBpdCBnZXRzCi0gICB5b3UgdGhlcmUuIC1LV0sgKi8KLS8qIG9uIG02OGs6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBsb25nLCBuZXh0IHRocmVlIGJ5dGVzCi0gICBhcmUgc3ltYm9sbnVtLCBtb3N0IHNpZy4gYnl0ZSBmaXJzdC4gIExhc3QgYnl0ZSBpcyBicm9rZW4gdXAgd2l0aAotICAgYml0IDcgYXMgcGNyZWwsIGJpdHMgNiAmIDUgYXMgbGVuZ3RoLCBiaXQgNCBhcyBwY3JlbCwgYW5kIHRoZSBsb3dlcgotICAgbmliYmxlIGFzIG51dGhpbi4gKG9uIFN1biAzIGF0IGxlYXN0KSAqLwotLyogVHJhbnNsYXRlIHRoZSBpbnRlcm5hbCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGludG8gdGFyZ2V0LXNwZWNpZmljCi0gICBmb3JtYXQuICovCi0jaWZkZWYgY29tbWVudAotdm9pZAotbWRfcmlfdG9fY2hhcnMgKHRoZV9ieXRlcywgcmkpCi0gICAgIGNoYXIgKnRoZV9ieXRlczsKLSAgICAgc3RydWN0IHJlbG9jX2luZm9fZ2VuZXJpYyAqcmk7Ci17Ci0gIC8qIHRoaXMgaXMgZWFzeSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRoZV9ieXRlcywgcmktPnJfYWRkcmVzcywgNCk7Ci0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIHRoZV9ieXRlc1s0XSA9IChyaS0+cl9zeW1ib2xudW0gPj4gMTYpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s1XSA9IChyaS0+cl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgdGhlX2J5dGVzWzZdID0gcmktPnJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s3XSA9ICgoKHJpLT5yX3BjcmVsIDw8IDcpICYgMHg4MCkgfCAoKHJpLT5yX2xlbmd0aCA8PCA1KSAmIDB4NjApIHwKLQkJICAoKHJpLT5yX2V4dGVybiA8PCA0KSAmIDB4MTApKTsKLX0KLQotI2VuZGlmIC8qIGNvbW1lbnQgKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi12b2lkCi10Y19hb3V0X2ZpeF90b19jaGFycyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgZml4UyAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIC8qCi0gICAqIEluOiBsZW5ndGggb2YgcmVsb2NhdGlvbiAob3Igb2YgYWRkcmVzcykgaW4gY2hhcnM6IDEsIDIgb3IgNC4KLSAgICogT3V0OiBHTlUgTEQgcmVsb2NhdGlvbiBsZW5ndGggY29kZTogMCwgMSwgb3IgMi4KLSAgICovCi0KLSAgc3RhdGljIENPTlNUIHVuc2lnbmVkIGNoYXIgbmJ5dGVzX3JfbGVuZ3RoW10gPSB7NDIsIDAsIDEsIDQyLCAyfTsKLSAgbG9uZyByX3N5bWJvbG51bTsKLQotICBrbm93IChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAotICAgICAgIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlLAotCQkgICAgICA0KTsKLQotICByX3N5bWJvbG51bSA9IChTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCQkgPyBTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkKLQkJIDogZml4UC0+ZnhfYWRkc3ktPnN5X251bWJlcik7Ci0KLSAgd2hlcmVbNF0gPSAocl9zeW1ib2xudW0gPj4gMTYpICYgMHgwZmY7Ci0gIHdoZXJlWzVdID0gKHJfc3ltYm9sbnVtID4+IDgpICYgMHgwZmY7Ci0gIHdoZXJlWzZdID0gcl9zeW1ib2xudW0gJiAweDBmZjsKLSAgd2hlcmVbN10gPSAoKChmaXhQLT5meF9wY3JlbCA8PCA3KSAmIDB4ODApIHwgKChuYnl0ZXNfcl9sZW5ndGhbZml4UC0+Znhfc2l6ZV0gPDwgNSkgJiAweDYwKSB8Ci0JICAgICAgKCgoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKSA8PCA0KSAmIDB4MTApKTsKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi1DT05TVCBpbnQgbWRfc2hvcnRfanVtcF9zaXplID0gNDsKLUNPTlNUIGludCBtZF9sb25nX2p1bXBfc2l6ZSA9IDY7Ci0KLXZvaWQKLW1kX2NyZWF0ZV9zaG9ydF9qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWcgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyAyKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHg2MDAwLCAyKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAyLCAodmFsdWVUKSBvZmZzZXQsIDIpOwotfQotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgdmFsdWVUIG9mZnNldDsKLQotICBpZiAoIUhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpKQotICAgIHsKLSAgICAgIG9mZnNldCA9IHRvX2FkZHIgLSBTX0dFVF9WQUxVRSAodG9fc3ltYm9sKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweDRFRjksIDIpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAyLCAodmFsdWVUKSBvZmZzZXQsIDQpOwotICAgICAgZml4X25ldyAoZnJhZywgKHB0ciArIDIpIC0gZnJhZy0+ZnJfbGl0ZXJhbCwgNCwgdG9fc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkgICAgICAgMCwgTk9fUkVMT0MpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgMik7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHg2MGZmLCAyKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMiwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0vKiBEaWZmZXJlbnQgdmFsdWVzIG9mIE9LIHRlbGwgd2hhdCBpdHMgT0sgdG8gcmV0dXJuLiAgVGhpbmdzIHRoYXQKLSAgIGFyZW4ndCBPSyBhcmUgYW4gZXJyb3IgKHdoYXQgYSBzaG9jaywgbm8/KQotCi0gICAwOiAgRXZlcnl0aGluZyBpcyBPSwotICAgMTA6ICBBYnNvbHV0ZSAxOjgJb25seQotICAgMjA6ICBBYnNvbHV0ZSAwOjcJb25seQotICAgMzA6ICBhYnNvbHV0ZSAwOjE1CW9ubHkKLSAgIDQwOiAgQWJzb2x1dGUgMDozMQlvbmx5Ci0gICA1MDogIGFic29sdXRlIDA6MTI3CW9ubHkKLSAgIDU1OiAgYWJzb2x1dGUgLTY0OjYzICAgIG9ubHkKLSAgIDYwOiAgYWJzb2x1dGUgLTEyODoxMjcJb25seQotICAgNzA6ICBhYnNvbHV0ZSAwOjQwOTUJb25seQotICAgODA6ICBObyBiaWdudW1zCi0KLSAgICovCi0KLXN0YXRpYyBpbnQKLWdldF9udW0gKGV4cCwgb2spCi0gICAgIHN0cnVjdCBtNjhrX2V4cCAqZXhwOwotICAgICBpbnQgb2s7Ci17Ci0gIGlmIChleHAtPmV4cC5YX29wID09IE9fYWJzZW50KQotICAgIHsKLSAgICAgIC8qIERvIHRoZSBzYW1lIHRoaW5nIHRoZSBWQVggYXNtIGRvZXMgKi8KLSAgICAgIG9wIChleHApID0gT19jb25zdGFudDsKLSAgICAgIGFkZHMgKGV4cCkgPSAwOwotICAgICAgc3VicyAoZXhwKSA9IDA7Ci0gICAgICBvZmZzIChleHApID0gMDsKLSAgICAgIGlmIChvayA9PSAxMCkKLQl7Ci0JICBhc193YXJuIChfKCJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAxIikpOwotCSAgb2ZmcyAoZXhwKSA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZXhwLT5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIHN3aXRjaCAob2spCi0JewotCWNhc2UgMTA6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IDEgfHwgb2ZmcyAoZXhwKSA+IDgpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAxIikpOwotCSAgICAgIG9mZnMgKGV4cCkgPSAxOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIDIwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiA3KQotCSAgICBnb3RvIG91dHJhbmdlOwotCSAgYnJlYWs7Ci0JY2FzZSAzMDoKLQkgIGlmIChvZmZzIChleHApIDwgMCB8fCBvZmZzIChleHApID4gMTUpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDQwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiAzMikKLQkgICAgZ290byBvdXRyYW5nZTsKLQkgIGJyZWFrOwotCWNhc2UgNTA6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IDAgfHwgb2ZmcyAoZXhwKSA+IDEyNykKLQkgICAgZ290byBvdXRyYW5nZTsKLQkgIGJyZWFrOwotCWNhc2UgNTU6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IC02NCB8fCBvZmZzIChleHApID4gNjMpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDYwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAtMTI4IHx8IG9mZnMgKGV4cCkgPiAxMjcpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDcwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiA0MDk1KQotCSAgICB7Ci0JICAgIG91dHJhbmdlOgotCSAgICAgIGFzX3dhcm4gKF8oImV4cHJlc3Npb24gb3V0IG9mIHJhbmdlOiBkZWZhdWx0aW5nIHRvIDAiKSk7Ci0JICAgICAgb2ZmcyAoZXhwKSA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChleHAtPmV4cC5YX29wID09IE9fYmlnKQotICAgIHsKLSAgICAgIGlmIChvZmZzIChleHApIDw9IDAJLyogZmxvbnVtICovCi0JICAmJiAob2sgPT0gODAJCS8qIG5vIGJpZ251bXMgKi8KLQkgICAgICB8fCAob2sgPiAxMAkvKiBzbWFsbC1pbnQgcmFuZ2VzIGluY2x1ZGluZyAwIG9rICovCi0JCSAgLyogSWYgd2UgaGF2ZSBhIGZsb251bSB6ZXJvLCBhIHplcm8gaW50ZWdlciBzaG91bGQKLQkJICAgICBkbyBhcyB3ZWxsIChlLmcuLCBpbiBtb3ZlcSkuICAqLwotCQkgICYmIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmV4cG9uZW50ID09IDAKLQkJICAmJiBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sb3dbMF0gPT0gMCkpKQotCXsKLQkgIC8qIEhBQ0shIFR1cm4gaXQgaW50byBhIGxvbmcgKi8KLQkgIExJVFRMRU5VTV9UWVBFIHdvcmRzWzZdOwotCi0JICBnZW5fdG9fd29yZHMgKHdvcmRzLCAyLCA4TCk7CS8qIFRoZXNlIG51bWJlcnMgYXJlIG1hZ2ljISAqLwotCSAgb3AgKGV4cCkgPSBPX2NvbnN0YW50OwotCSAgYWRkcyAoZXhwKSA9IDA7Ci0JICBzdWJzIChleHApID0gMDsKLQkgIG9mZnMgKGV4cCkgPSB3b3Jkc1sxXSB8ICh3b3Jkc1swXSA8PCAxNik7Ci0JfQotICAgICAgZWxzZSBpZiAob2sgIT0gMCkKLQl7Ci0JICBvcCAoZXhwKSA9IE9fY29uc3RhbnQ7Ci0JICBhZGRzIChleHApID0gMDsKLQkgIHN1YnMgKGV4cCkgPSAwOwotCSAgb2ZmcyAoZXhwKSA9IChvayA9PSAxMCkgPyAxIDogMDsKLQkgIGFzX3dhcm4gKF8oIkNhbid0IGRlYWwgd2l0aCBleHByZXNzaW9uOyBkZWZhdWx0aW5nIHRvICVsZCIpLAotCQkgICBvZmZzIChleHApKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG9rID49IDEwICYmIG9rIDw9IDcwKQotCXsKLQkgIG9wIChleHApID0gT19jb25zdGFudDsKLQkgIGFkZHMgKGV4cCkgPSAwOwotCSAgc3VicyAoZXhwKSA9IDA7Ci0JICBvZmZzIChleHApID0gKG9rID09IDEwKSA/IDEgOiAwOwotCSAgYXNfd2FybiAoXygiQ2FuJ3QgZGVhbCB3aXRoIGV4cHJlc3Npb247IGRlZmF1bHRpbmcgdG8gJWxkIiksCi0JCSAgIG9mZnMgKGV4cCkpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGV4cC0+c2l6ZSAhPSBTSVpFX1VOU1BFQykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGV4cC0+c2l6ZSkKLQl7Ci0JY2FzZSBTSVpFX1VOU1BFQzoKLQljYXNlIFNJWkVfTE9ORzoKLQkgIGJyZWFrOwotCWNhc2UgU0laRV9CWVRFOgotCSAgaWYgKCFpc2J5dGUgKG9mZnMgKGV4cCkpKQotCSAgICBhc193YXJuIChfKCJleHByZXNzaW9uIGRvZXNuJ3QgZml0IGluIEJZVEUiKSk7Ci0JICBicmVhazsKLQljYXNlIFNJWkVfV09SRDoKLQkgIGlmICghaXN3b3JkIChvZmZzIChleHApKSkKLQkgICAgYXNfd2FybiAoXygiZXhwcmVzc2lvbiBkb2Vzbid0IGZpdCBpbiBXT1JEIikpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gb2ZmcyAoZXhwKTsKLX0KLQotLyogVGhlc2UgYXJlIHRoZSBiYWNrLWVuZHMgZm9yIHRoZSB2YXJpb3VzIG1hY2hpbmUgZGVwZW5kZW50IHBzZXVkby1vcHMuICAqLwotCi1zdGF0aWMgdm9pZAotc19kYXRhMSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN1YnNlZ19zZXQgKGRhdGFfc2VjdGlvbiwgMSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2RhdGEyIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAyKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfYnNzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBwdXR0aW5nIGZyYWdzIGluIHRoZSBCU1Mgc2VnbWVudCwgd2UgZmFrZSBpdAotICAgICBieSBtYXJraW5nIGluX2JzcywgdGhlbiBsb29raW5nIGF0IHNfc2tpcCBmb3IgY2x1ZXMuICAqLwotCi0gIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZXZlbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBsb25nIHRlbXBfZmlsbDsKLQotICB0ZW1wID0gMTsJCQkvKiBKRiBzaG91bGQgYmUgMj8gKi8KLSAgdGVtcF9maWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICghbmVlZF9wYXNzXzIpCQkvKiBOZXZlciBtYWtlIGZyYWcgaWYgZXhwZWN0IGV4dHJhIHBhc3MuICovCi0gICAgZnJhZ19hbGlnbiAodGVtcCwgKGludCkgdGVtcF9maWxsLCAwKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgdGVtcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX3Byb2MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUHNldWRvLW9wcyBoYW5kbGVkIGZvciBNUkkgY29tcGF0aWJpbGl0eS4gICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBpZiB0aGUgYXJndW1lbnQgaXMgYSBjb25kaXRpb25hbAotICAgcHNldWRvLW9wLiAgVGhpcyBpcyBjYWxsZWQgd2hlbiBjaGVja2luZyB3aGV0aGVyIGEgcGVuZGluZwotICAgYWxpZ25tZW50IGlzIG5lZWRlZC4gICovCi0KLWludAotbTY4a19jb25kaXRpb25hbF9wc2V1ZG9vcCAocG9wKQotICAgICBwc2V1ZG9fdHlwZVMgKnBvcDsKLXsKLSAgcmV0dXJuIChwb3AtPnBvY19oYW5kbGVyID09IHNfbXJpX2lmCi0JICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfbXJpX2Vsc2UpOwotfQotCi0vKiBIYW5kbGUgYW4gTVJJIHN0eWxlIGNoaXAgc3BlY2lmaWNhdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1tcmlfY2hpcCAoKQotewotICBjaGFyICpzOwotICBjaGFyIGM7Ci0gIGludCBpOwotCi0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIC8qIFdlIGNhbid0IHVzZSBnZXRfc3ltYm9sX2VuZCBzaW5jZSB0aGUgcHJvY2Vzc29yIG5hbWVzIGFyZSBub3QgcHJvcGVyCi0gICAgIHN5bWJvbHMuICAqLwotICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lIChjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrKSkKLSAgICA7Ci0gICotLWlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBuX2FyY2hzOyBpKyspCi0gICAgaWYgKHN0cmNhc2VjbXAgKHMsIGFyY2hzW2ldLm5hbWUpID09IDApCi0gICAgICBicmVhazsKLSAgaWYgKGkgPj0gbl9hcmNocykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIiVzOiB1bnJlY29nbml6ZWQgcHJvY2Vzc29yIG5hbWUiKSwgcyk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLycpCi0gICAgY3VycmVudF9hcmNoaXRlY3R1cmUgPSAwOwotICBlbHNlCi0gICAgY3VycmVudF9hcmNoaXRlY3R1cmUgJj0gbTY4ODgxIHwgbTY4ODUxOwotICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBhcmNoc1tpXS5hcmNoOwotCi0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcvJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAvKiBXZSBjYW4ndCB1c2UgZ2V0X3N5bWJvbF9lbmQgc2luY2UgdGhlIHByb2Nlc3NvciBuYW1lcyBhcmUgbm90Ci0JIHByb3BlciBzeW1ib2xzLiAgKi8KLSAgICAgIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspKQotCTsKLSAgICAgICotLWlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gICAgICBpZiAoc3RyY21wIChzLCAiNjg4ODEiKSA9PSAwKQotCWN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODg4MTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIjY4ODUxIikgPT0gMCkKLQljdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjg4NTE7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICB9Ci0KLSAgLyogVXBkYXRlIGluZm8gYWJvdXQgYXZhaWxhYmxlIGNvbnRyb2wgcmVnaXN0ZXJzLiAgKi8KLSAgc2VsZWN0X2NvbnRyb2xfcmVncyAoKTsKLX0KLQotLyogVGhlIE1SSSBDSElQIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2NoaXAgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotICBtcmlfY2hpcCAoKTsKLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgTVJJIEZPUFQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZm9wdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIklEPSIsIDMpID09IDApCi0gICAgewotICAgICAgaW50IHRlbXA7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAzOwotICAgICAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKHRlbXAgPCAwIHx8IHRlbXAgPiA3KQotCWFzX2JhZCAoXygiYmFkIGNvcHJvY2Vzc29yIGlkIikpOwotICAgICAgZWxzZQotCW02OGtfZmxvYXRfY29wbnVtID0gQ09QMCArIHRlbXA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bnJlY29nbml6ZWQgZm9wdCBvcHRpb24iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaGFuZGxlIHRoZSBNUkkgT1BUIHBzZXVkby1vcC4gICovCi0KLXN0cnVjdCBvcHRfYWN0aW9uCi17Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSBvcHRpb24uICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIElmIHRoaXMgaXMgbm90IE5VTEwsIGp1c3QgY2FsbCB0aGlzIGZ1bmN0aW9uLiAgVGhlIGZpcnN0IGFyZ3VtZW50Ci0gICAgIGlzIHRoZSBBUkcgZmllbGQgb2YgdGhpcyBzdHJ1Y3R1cmUsIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMKLSAgICAgd2hldGhlciB0aGUgb3B0aW9uIHdhcyBuZWdhdGVkLiAgKi8KLSAgdm9pZCAoKnBmbikgUEFSQU1TICgoaW50IGFyZywgaW50IG9uKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBub3QgTlVMTCwgYW5kIHRoZSBQRk4gZmllbGQgaXMgTlVMTCwgc2V0IHRoZSB2YXJpYWJsZQotICAgICB0aGlzIHBvaW50cyB0by4gIFNldCBpdCB0byB0aGUgQVJHIGZpZWxkIGlmIHRoZSBvcHRpb24gd2FzIG5vdAotICAgICBuZWdhdGVkLCBhbmQgdGhlIE5PVEFSRyBmaWVsZCBvdGhlcndpc2UuICAqLwotICBpbnQgKnB2YXI7Ci0KLSAgLyogVGhlIHZhbHVlIHRvIHBhc3MgdG8gUEZOIG9yIHRvIGFzc2lnbiB0byAqUFZBUi4gICovCi0gIGludCBhcmc7Ci0KLSAgLyogVGhlIHZhbHVlIHRvIGFzc2lnbiB0byAqUFZBUiBpZiB0aGUgb3B0aW9uIGlzIG5lZ2F0ZWQuICBJZiBQRk4gaXMKLSAgICAgTlVMTCwgYW5kIFBWQVIgaXMgbm90IE5VTEwsIGFuZCBBUkcgYW5kIE5PVEFSRyBhcmUgdGhlIHNhbWUsIHRoZW4KLSAgICAgdGhlIG9wdGlvbiBtYXkgbm90IGJlIG5lZ2F0ZWQuICAqLwotICBpbnQgbm90YXJnOwotfTsKLQotLyogVGhlIHRhYmxlIHVzZWQgdG8gaGFuZGxlIHRoZSBNUkkgT1BUIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkIHNraXBfdG9fY29tbWEgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIG9wdF9uZXN0IFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvcHRfY2hpcCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgb3B0X2xpc3QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIG9wdF9saXN0X3N5bWJvbHMgUEFSQU1TICgoaW50LCBpbnQpKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRfYWN0aW9uIG9wdF90YWJsZVtdID0KLXsKLSAgeyAiYWJzcGNhZGQiLCAwLCAmbTY4a19hYnNwY2FkZCwgMSwgMCB9LAotCi0gIC8qIFdlIGRvIHJlbGF4aW5nLCBzbyB0aGVyZSBpcyBsaXR0bGUgdXNlIGZvciB0aGVzZSBvcHRpb25zLiAgKi8KLSAgeyAiYiIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiYnJzIiwgMCwgMCwgMCwgMCB9LAotICB7ICJicmIiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImJybCIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiYnJ3IiwgMCwgMCwgMCwgMCB9LAotCi0gIHsgImMiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImNleCIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiY2FzZSIsIDAsICZzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlLCAxLCAwIH0sCi0gIHsgImNsIiwgMCwgMCwgMCwgMCB9LAotICB7ICJjcmUiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImQiLCAwLCAmZmxhZ19rZWVwX2xvY2FscywgMSwgMCB9LAotICB7ICJlIiwgMCwgMCwgMCwgMCB9LAotICB7ICJmIiwgMCwgJmZsYWdfc2hvcnRfcmVmcywgMSwgMCB9LAotICB7ICJmcnMiLCAwLCAmZmxhZ19zaG9ydF9yZWZzLCAxLCAwIH0sCi0gIHsgImZybCIsIDAsICZmbGFnX3Nob3J0X3JlZnMsIDAsIDEgfSwKLSAgeyAiZyIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiaSIsIDAsIDAsIDAsIDAgfSwKLSAgeyAibSIsIDAsIDAsIDAsIDAgfSwKLSAgeyAibWV4IiwgMCwgMCwgMCwgMCB9LAotICB7ICJtYyIsIDAsIDAsIDAsIDAgfSwKLSAgeyAibWQiLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm5lc3QiLCBvcHRfbmVzdCwgMCwgMCwgMCB9LAotICB7ICJuZXh0Iiwgc2tpcF90b19jb21tYSwgMCwgMCwgMCB9LAotICB7ICJvIiwgMCwgMCwgMCwgMCB9LAotICB7ICJvbGQiLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm9wIiwgc2tpcF90b19jb21tYSwgMCwgMCwgMCB9LAotICB7ICJwY28iLCAwLCAwLCAwLCAwIH0sCi0gIHsgInAiLCBvcHRfY2hpcCwgMCwgMCwgMCB9LAotICB7ICJwY3IiLCAwLCAwLCAwLCAwIH0sCi0gIHsgInBjcyIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiciIsIDAsIDAsIDAsIDAgfSwKLSAgeyAicXVpY2siLCAwLCAmbTY4a19xdWljaywgMSwgMCB9LAotICB7ICJyZWwzMiIsIDAsICZtNjhrX3JlbDMyLCAxLCAwIH0sCi0gIHsgInMiLCBvcHRfbGlzdCwgMCwgMCwgMCB9LAotICB7ICJ0Iiwgb3B0X2xpc3Rfc3ltYm9scywgMCwgMCwgMCB9LAotICB7ICJ3IiwgMCwgJmZsYWdfbm9fd2FybmluZ3MsIDAsIDEgfSwKLSAgeyAieCIsIDAsIDAsIDAsIDAgfQotfTsKLQotI2RlZmluZSBPUFRDT1VOVCAoc2l6ZW9mIG9wdF90YWJsZSAvIHNpemVvZiBvcHRfdGFibGVbMF0pCi0KLS8qIFRoZSBNUkkgT1BUIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX29wdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGRvCi0gICAgewotICAgICAgaW50IHQ7Ci0gICAgICBjaGFyICpzOwotICAgICAgY2hhciBjOwotICAgICAgaW50IGk7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgb3B0X2FjdGlvbiAqbzsKLQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICB0ID0gMTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICctJykKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJOTyIsIDIpID09IDApCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICB0ID0gMDsKLQl9Ci0KLSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgICAgIGZvciAoaSA9IDAsIG8gPSBvcHRfdGFibGU7IGkgPCBPUFRDT1VOVDsgaSsrLCBvKyspCi0JewotCSAgaWYgKHN0cmNhc2VjbXAgKHMsIG8tPm5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoby0+cGZuKQotCQl7Ci0JCSAgLyogUmVzdG9yZSBpbnB1dF9saW5lX3BvaW50ZXIgbm93IGluIGNhc2UgdGhlIG9wdGlvbgotCQkgICAgIHRha2VzIGFyZ3VtZW50cy4gICovCi0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgKCpvLT5wZm4pIChvLT5hcmcsIHQpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoby0+cHZhciAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKCEgdCAmJiBvLT5hcmcgPT0gby0+bm90YXJnKQotCQkgICAgYXNfYmFkIChfKCJvcHRpb24gYCVzJyBtYXkgbm90IGJlIG5lZ2F0ZWQiKSwgcyk7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgKm8tPnB2YXIgPSB0ID8gby0+YXJnIDogby0+bm90YXJnOwotCQl9Ci0JICAgICAgZWxzZQotCQkqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmIChpID49IE9QVENPVU5UKQotCXsKLQkgIGFzX2JhZCAoXygib3B0aW9uIGAlcycgbm90IHJlY29nbml6ZWQiKSwgcyk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgfQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7Ci0KLSAgLyogTW92ZSBiYWNrIHRvIHRlcm1pbmF0aW5nIGNoYXJhY3Rlci4gICovCi0gIC0taW5wdXRfbGluZV9wb2ludGVyOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBTa2lwIGFoZWFkIHRvIGEgY29tbWEuICBUaGlzIGlzIHVzZWQgZm9yIE9QVCBvcHRpb25zIHdoaWNoIHdlIGRvCi0gICBub3Qgc3VwcG9yIHRhbmQgd2hpY2ggdGFrZSBhcmd1bWVudHMuICAqLwotCi1zdGF0aWMgdm9pZAotc2tpcF90b19jb21tYSAoYXJnLCBvbikKLSAgICAgaW50IGFyZyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgb24gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnCi0JICYmICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotfQotCi0vKiBIYW5kbGUgdGhlIE9QVCBORVNUPWRlcHRoIG9wdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1vcHRfbmVzdCAoYXJnLCBvbikKLSAgICAgaW50IGFyZyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgb24gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIGZvcm1hdCBvZiBPUFQgTkVTVD1kZXB0aCIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG1heF9tYWNyb19uZXN0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgT1BUIFA9Y2hpcCBvcHRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb3B0X2NoaXAgKGFyZywgb24pCi0gICAgIGludCBhcmcgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IG9uIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc9JykKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGp1c3QgT1BUIFAsIHdoaWNoIHdlIGRvIG5vdCBzdXBwb3J0LiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG1yaV9jaGlwICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE9QVCBTIG9wdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1vcHRfbGlzdCAoYXJnLCBvbikKLSAgICAgaW50IGFyZyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgb247Ci17Ci0gIGxpc3RpbmdfbGlzdCAob24pOwotfQotCi0vKiBIYW5kbGUgdGhlIE9QVCBUIG9wdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1vcHRfbGlzdF9zeW1ib2xzIChhcmcsIG9uKQotICAgICBpbnQgYXJnIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBvbjsKLXsKLSAgaWYgKG9uKQotICAgIGxpc3RpbmcgfD0gTElTVElOR19TWU1CT0xTOwotICBlbHNlCi0gICAgbGlzdGluZyAmPX4gTElTVElOR19TWU1CT0xTOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBSRUcgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfcmVnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY2hhciAqczsKLSAgaW50IGM7Ci0gIHN0cnVjdCBtNjhrX29wIHJvcDsKLSAgaW50IG1hc2s7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChsaW5lX2xhYmVsID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGxhYmVsIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgd2hpbGUgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKQotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAotCSB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09IFJFR0lTVEVSX1BSRUZJWAotI2VuZGlmCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy8nCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0KLSAgaWYgKG02OGtfaXBfb3AgKHMsICZyb3ApICE9IDApCi0gICAgewotICAgICAgaWYgKHJvcC5lcnJvciA9PSBOVUxMKQotCWFzX2JhZCAoXygiYmFkIHJlZ2lzdGVyIGxpc3QiKSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbGlzdDogJXMiKSwgcm9wLmVycm9yKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgaWYgKHJvcC5tb2RlID09IFJFR0xTVCkKLSAgICBtYXNrID0gcm9wLm1hc2s7Ci0gIGVsc2UgaWYgKHJvcC5tb2RlID09IERSRUcpCi0gICAgbWFzayA9IDEgPDwgKHJvcC5yZWcgLSBEQVRBMCk7Ci0gIGVsc2UgaWYgKHJvcC5tb2RlID09IEFSRUcpCi0gICAgbWFzayA9IDEgPDwgKHJvcC5yZWcgLSBBRERSMCArIDgpOwotICBlbHNlIGlmIChyb3AubW9kZSA9PSBGUFJFRykKLSAgICBtYXNrID0gMSA8PCAocm9wLnJlZyAtIEZQMCArIDE2KTsKLSAgZWxzZSBpZiAocm9wLm1vZGUgPT0gQ09OVFJPTAotCSAgICYmIHJvcC5yZWcgPT0gRlBJKQotICAgIG1hc2sgPSAxIDw8IDI0OwotICBlbHNlIGlmIChyb3AubW9kZSA9PSBDT05UUk9MCi0JICAgJiYgcm9wLnJlZyA9PSBGUFMpCi0gICAgbWFzayA9IDEgPDwgMjU7Ci0gIGVsc2UgaWYgKHJvcC5tb2RlID09IENPTlRST0wKLQkgICAmJiByb3AucmVnID09IEZQQykKLSAgICBtYXNrID0gMSA8PCAyNjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIHJlZ2lzdGVyIGxpc3QiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTX1NFVF9TRUdNRU5UIChsaW5lX2xhYmVsLCByZWdfc2VjdGlvbik7Ci0gIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCB+bWFzayk7Ci0gIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgdGhlIE1SSSBTQVZFIGFuZCBSRVNUT1JFIHBzZXVkby1vcHMuICAqLwotCi1zdHJ1Y3Qgc2F2ZV9vcHRzCi17Ci0gIHN0cnVjdCBzYXZlX29wdHMgKm5leHQ7Ci0gIGludCBhYnNwY2FkZDsKLSAgaW50IHN5bWJvbHNfY2FzZV9zZW5zaXRpdmU7Ci0gIGludCBrZWVwX2xvY2FsczsKLSAgaW50IHNob3J0X3JlZnM7Ci0gIGludCBhcmNoaXRlY3R1cmU7Ci0gIGludCBxdWljazsKLSAgaW50IHJlbDMyOwotICBpbnQgbGlzdGluZzsKLSAgaW50IG5vX3dhcm5pbmdzOwotICAvKiBGSVhNRTogV2UgZG9uJ3Qgc2F2ZSBPUFQgUy4gICovCi19OwotCi0vKiBUaGlzIHZhcmlhYmxlIGhvbGRzIHRoZSBzdGFjayBvZiBzYXZlZCBvcHRpb25zLiAgKi8KLQotc3RhdGljIHN0cnVjdCBzYXZlX29wdHMgKnNhdmVfc3RhY2s7Ci0KLS8qIFRoZSBNUkkgU0FWRSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19zYXZlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IHNhdmVfb3B0cyAqczsKLQotICBzID0gKHN0cnVjdCBzYXZlX29wdHMgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2F2ZV9vcHRzKSk7Ci0gIHMtPmFic3BjYWRkID0gbTY4a19hYnNwY2FkZDsKLSAgcy0+c3ltYm9sc19jYXNlX3NlbnNpdGl2ZSA9IHN5bWJvbHNfY2FzZV9zZW5zaXRpdmU7Ci0gIHMtPmtlZXBfbG9jYWxzID0gZmxhZ19rZWVwX2xvY2FsczsKLSAgcy0+c2hvcnRfcmVmcyA9IGZsYWdfc2hvcnRfcmVmczsKLSAgcy0+YXJjaGl0ZWN0dXJlID0gY3VycmVudF9hcmNoaXRlY3R1cmU7Ci0gIHMtPnF1aWNrID0gbTY4a19xdWljazsKLSAgcy0+cmVsMzIgPSBtNjhrX3JlbDMyOwotICBzLT5saXN0aW5nID0gbGlzdGluZzsKLSAgcy0+bm9fd2FybmluZ3MgPSBmbGFnX25vX3dhcm5pbmdzOwotCi0gIHMtPm5leHQgPSBzYXZlX3N0YWNrOwotICBzYXZlX3N0YWNrID0gczsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgTVJJIFJFU1RPUkUgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfcmVzdG9yZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBzYXZlX29wdHMgKnM7Ci0KLSAgaWYgKHNhdmVfc3RhY2sgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInJlc3RvcmUgd2l0aG91dCBzYXZlIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgcyA9IHNhdmVfc3RhY2s7Ci0gIHNhdmVfc3RhY2sgPSBzLT5uZXh0OwotCi0gIG02OGtfYWJzcGNhZGQgPSBzLT5hYnNwY2FkZDsKLSAgc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSA9IHMtPnN5bWJvbHNfY2FzZV9zZW5zaXRpdmU7Ci0gIGZsYWdfa2VlcF9sb2NhbHMgPSBzLT5rZWVwX2xvY2FsczsKLSAgZmxhZ19zaG9ydF9yZWZzID0gcy0+c2hvcnRfcmVmczsKLSAgY3VycmVudF9hcmNoaXRlY3R1cmUgPSBzLT5hcmNoaXRlY3R1cmU7Ci0gIG02OGtfcXVpY2sgPSBzLT5xdWljazsKLSAgbTY4a19yZWwzMiA9IHMtPnJlbDMyOwotICBsaXN0aW5nID0gcy0+bGlzdGluZzsKLSAgZmxhZ19ub193YXJuaW5ncyA9IHMtPm5vX3dhcm5pbmdzOwotCi0gIGZyZWUgKHMpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFR5cGVzIG9mIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlcy4gICovCi0KLWVudW0gbXJpX2NvbnRyb2xfdHlwZQotewotICBtcmlfZm9yLAotICBtcmlfaWYsCi0gIG1yaV9yZXBlYXQsCi0gIG1yaV93aGlsZQotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzdGFjayB0aGUgTVJJIHN0cnVjdHVyZWQgY29udHJvbAotICAgZGlyZWN0aXZlcy4gICovCi0KLXN0cnVjdCBtcmlfY29udHJvbF9pbmZvCi17Ci0gIC8qIFRoZSBkaXJlY3RpdmUgd2l0aGluIHdoaWNoIHRoaXMgb25lIGlzIGVuY2xvc2VkLiAgKi8KLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm91dGVyOwotCi0gIC8qIFRoZSB0eXBlIG9mIGRpcmVjdGl2ZS4gICovCi0gIGVudW0gbXJpX2NvbnRyb2xfdHlwZSB0eXBlOwotCi0gIC8qIFdoZXRoZXIgYW4gRUxTRSBoYXMgYmVlbiBpbiBhbiBJRi4gICovCi0gIGludCBlbHNlX3NlZW47Ci0KLSAgLyogVGhlIGFkZCBvciBzdWIgc3RhdGVtZW50IGF0IHRoZSBlbmQgb2YgYSBGT1IuICAqLwotICBjaGFyICppbmNyOwotCi0gIC8qIFRoZSBsYWJlbCBvZiB0aGUgdG9wIG9mIGEgRk9SIG9yIFJFUEVBVCBsb29wLiAgKi8KLSAgY2hhciAqdG9wOwotCi0gIC8qIFRoZSBsYWJlbCB0byBqdW1wIHRvIGZvciB0aGUgbmV4dCBpdGVyYXRpb24sIG9yIHRoZSBlbHNlCi0gICAgIGV4cHJlc3Npb24gb2YgYSBjb25kaXRpb25hbC4gICovCi0gIGNoYXIgKm5leHQ7Ci0KLSAgLyogVGhlIGxhYmVsIHRvIGp1bXAgdG8gdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wLCBvciB0aGUgbGFiZWwgcGFzdAotICAgICB0aGUgZW5kIG9mIGEgY29uZGl0aW9uYWwuICAqLwotICBjaGFyICpib3R0b207Ci19OwotCi0vKiBUaGUgc3RhY2sgb2YgTVJJIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmVzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICptcmlfY29udHJvbF9zdGFjazsKLQotLyogVGhlIGN1cnJlbnQgTVJJIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUgaW5kZXggbnVtYmVyLCB1c2VkIHRvCi0gICBnZW5lcmF0ZSBsYWJlbCBuYW1lcy4gICovCi0KLXN0YXRpYyBpbnQgbXJpX2NvbnRyb2xfaW5kZXg7Ci0KLS8qIFNvbWUgZnVuY3Rpb24gcHJvdG90eXBlcy4gICovCi0KLXN0YXRpYyB2b2lkIG1yaV9hc3NlbWJsZSBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBjaGFyICptcmlfY29udHJvbF9sYWJlbCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKnB1c2hfbXJpX2NvbnRyb2wKLSAgUEFSQU1TICgoZW51bSBtcmlfY29udHJvbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBwb3BfbXJpX2NvbnRyb2wgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBwYXJzZV9tcmlfY29uZGl0aW9uIFBBUkFNUyAoKGludCAqKSk7Ci1zdGF0aWMgaW50IHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQKLSAgUEFSQU1TICgoaW50ICosIGNoYXIgKiosIGNoYXIgKiosIGNoYXIgKiosIGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgc3dhcF9tcmlfY29uZGl0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGludCByZXZlcnNlX21yaV9jb25kaXRpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kCi0gIFBBUkFNUyAoKGludCwgaW50LCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkgICBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgcGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbgotICBQQVJBTVMgKChjaGFyICosIGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi0vKiBBc3NlbWJsZSBhbiBpbnN0cnVjdGlvbiBmb3IgYW4gTVJJIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUuICAqLwotCi1zdGF0aWMgdm9pZAotbXJpX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqczsKLQotICAvKiBtZF9hc3NlbWJsZSBleHBlY3RzIHRoZSBvcGNvZGUgdG8gYmUgaW4gbG93ZXIgY2FzZS4gICovCi0gIGZvciAocyA9IHN0cjsgKnMgIT0gJyAnICYmICpzICE9ICdcMCc7IHMrKykKLSAgICB7Ci0gICAgICBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkqcyA9IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcyk7Ci0gICAgfQotCi0gIG1kX2Fzc2VtYmxlIChzdHIpOwotfQotCi0vKiBHZW5lcmF0ZSBhIG5ldyBNUkkgbGFiZWwgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSBsYWJlbCBuYW1lLiAgKi8KLQotc3RhdGljIGNoYXIgKgotbXJpX2NvbnRyb2xfbGFiZWwgKCkKLXsKLSAgY2hhciAqbjsKLQotICBuID0gKGNoYXIgKikgeG1hbGxvYyAoMjApOwotICBzcHJpbnRmIChuLCAiJXNtYyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBtcmlfY29udHJvbF9pbmRleCk7Ci0gICsrbXJpX2NvbnRyb2xfaW5kZXg7Ci0gIHJldHVybiBuOwotfQotCi0vKiBDcmVhdGUgYSBuZXcgTVJJIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUuICAqLwotCi1zdGF0aWMgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKgotcHVzaF9tcmlfY29udHJvbCAodHlwZSkKLSAgICAgZW51bSBtcmlfY29udHJvbF90eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOwotCi0gIG4gPSAoc3RydWN0IG1yaV9jb250cm9sX2luZm8gKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbykpOwotCi0gIG4tPnR5cGUgPSB0eXBlOwotICBuLT5lbHNlX3NlZW4gPSAwOwotICBpZiAodHlwZSA9PSBtcmlfaWYgfHwgdHlwZSA9PSBtcmlfd2hpbGUpCi0gICAgbi0+dG9wID0gTlVMTDsKLSAgZWxzZQotICAgIG4tPnRvcCA9IG1yaV9jb250cm9sX2xhYmVsICgpOwotICBuLT5uZXh0ID0gbXJpX2NvbnRyb2xfbGFiZWwgKCk7Ci0gIG4tPmJvdHRvbSA9IG1yaV9jb250cm9sX2xhYmVsICgpOwotCi0gIG4tPm91dGVyID0gbXJpX2NvbnRyb2xfc3RhY2s7Ci0gIG1yaV9jb250cm9sX3N0YWNrID0gbjsKLQotICByZXR1cm4gbjsKLX0KLQotLyogUG9wIG9mZiB0aGUgc3RhY2sgb2YgTVJJIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXBvcF9tcmlfY29udHJvbCAoKQotewotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLQotICBuID0gbXJpX2NvbnRyb2xfc3RhY2s7Ci0gIG1yaV9jb250cm9sX3N0YWNrID0gbi0+b3V0ZXI7Ci0gIGlmIChuLT50b3AgIT0gTlVMTCkKLSAgICBmcmVlIChuLT50b3ApOwotICBmcmVlIChuLT5uZXh0KTsKLSAgZnJlZSAobi0+Ym90dG9tKTsKLSAgZnJlZSAobik7Ci19Ci0KLS8qIFJlY29nbml6ZSBhIGNvbmRpdGlvbiBjb2RlIGluIGFuIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZXhwcmVzc2lvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBhcnNlX21yaV9jb25kaXRpb24gKHBjYykKLSAgICAgaW50ICpwY2M7Ci17Ci0gIGNoYXIgYzEsIGMyOwotCi0gIGtub3cgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzwnKTsKLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgYzEgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGMyID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc+JykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKGlzdXBwZXIgKGMxKSkKLSAgICBjMSA9IHRvbG93ZXIgKGMxKTsKLSAgaWYgKGlzdXBwZXIgKGMyKSkKLSAgICBjMiA9IHRvbG93ZXIgKGMyKTsKLQotICAqcGNjID0gKGMxIDw8IDgpIHwgYzI7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFBhcnNlIGEgc2luZ2xlIG9wZXJhbmQgaW4gYW4gTVJJIHN0cnVjdHVyZWQgY29udHJvbCBleHByZXNzaW9uLiAgKi8KLQotc3RhdGljIGludAotcGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCAocGNjLCBsZWZ0c3RhcnQsIGxlZnRzdG9wLCByaWdodHN0YXJ0LCByaWdodHN0b3ApCi0gICAgIGludCAqcGNjOwotICAgICBjaGFyICoqbGVmdHN0YXJ0OwotICAgICBjaGFyICoqbGVmdHN0b3A7Ci0gICAgIGNoYXIgKipyaWdodHN0YXJ0OwotICAgICBjaGFyICoqcmlnaHRzdG9wOwotewotICBjaGFyICpzOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAqcGNjID0gLTE7Ci0gICpsZWZ0c3RhcnQgPSBOVUxMOwotICAqbGVmdHN0b3AgPSBOVUxMOwotICAqcmlnaHRzdGFydCA9IE5VTEw7Ci0gICpyaWdodHN0b3AgPSBOVUxMOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICc8JykKLSAgICB7Ci0gICAgICAvKiBJdCdzIGp1c3QgYSBjb25kaXRpb24gY29kZS4gICovCi0gICAgICByZXR1cm4gcGFyc2VfbXJpX2NvbmRpdGlvbiAocGNjKTsKLSAgICB9Ci0KLSAgLyogTG9vayBhaGVhZCBmb3IgdGhlIGNvbmRpdGlvbiBjb2RlLiAgKi8KLSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyAqcyAhPSAnXDAnOyArK3MpCi0gICAgewotICAgICAgaWYgKCpzID09ICc8JyAmJiBzWzFdICE9ICdcMCcgJiYgc1syXSAhPSAnXDAnICYmIHNbM10gPT0gJz4nKQotCWJyZWFrOwotICAgIH0KLSAgaWYgKCpzID09ICdcMCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGNvbmRpdGlvbiBjb2RlIGluIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUiKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgKmxlZnRzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmxlZnRzdG9wID0gczsKLSAgaWYgKCpsZWZ0c3RvcCA+ICpsZWZ0c3RhcnQKLSAgICAgICYmICgoKmxlZnRzdG9wKVstMV0gPT0gJyAnIHx8ICgqbGVmdHN0b3ApWy0xXSA9PSAnXHQnKSkKLSAgICAtLSpsZWZ0c3RvcDsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotICBpZiAoISBwYXJzZV9tcmlfY29uZGl0aW9uIChwY2MpKQotICAgIHJldHVybiAwOwotCi0gIC8qIExvb2sgYWhlYWQgZm9yIEFORCBvciBPUiBvciBlbmQgb2YgbGluZS4gICovCi0gIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlcjsgKnMgIT0gJ1wwJzsgKytzKQotICAgIHsKLSAgICAgIGlmICgoc3RybmNhc2VjbXAgKHMsICJBTkQiLCAzKSA9PSAwCi0JICAgJiYgKHNbM10gPT0gJy4nIHx8ICEgaXNfcGFydF9vZl9uYW1lIChzWzNdKSkpCi0JICB8fCAoc3RybmNhc2VjbXAgKHMsICJPUiIsIDIpID09IDAKLQkgICAgICAmJiAoc1syXSA9PSAnLicgfHwgISBpc19wYXJ0X29mX25hbWUgKHNbMl0pKSkpCi0JYnJlYWs7Ci0gICAgfQotCi0gICpyaWdodHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcmlnaHRzdG9wID0gczsKLSAgaWYgKCpyaWdodHN0b3AgPiAqcmlnaHRzdGFydAotICAgICAgJiYgKCgqcmlnaHRzdG9wKVstMV0gPT0gJyAnIHx8ICgqcmlnaHRzdG9wKVstMV0gPT0gJ1x0JykpCi0gICAgLS0qcmlnaHRzdG9wOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLSNkZWZpbmUgTUNDKGIxLCBiMikgKCgoYjEpIDw8IDgpIHwgKGIyKSkKLQotLyogU3dhcCB0aGUgc2Vuc2Ugb2YgYSBjb25kaXRpb24uICBUaGlzIGNoYW5nZXMgdGhlIGNvbmRpdGlvbiBzbyB0aGF0Ci0gICBpdCBnZW5lcmF0ZXMgdGhlIHNhbWUgcmVzdWx0IHdoZW4gdGhlIG9wZXJhbmRzIGFyZSBzd2FwcGVkLiAgKi8KLQotc3RhdGljIGludAotc3dhcF9tcmlfY29uZGl0aW9uIChjYykKLSAgICAgaW50IGNjOwotewotICBzd2l0Y2ggKGNjKQotICAgIHsKLSAgICBjYXNlIE1DQyAoJ2gnLCAnaScpOiByZXR1cm4gTUNDICgnYycsICdzJyk7Ci0gICAgY2FzZSBNQ0MgKCdsJywgJ3MnKTogcmV0dXJuIE1DQyAoJ2MnLCAnYycpOwotICAgIGNhc2UgTUNDICgnYycsICdjJyk6IHJldHVybiBNQ0MgKCdsJywgJ3MnKTsKLSAgICBjYXNlIE1DQyAoJ2MnLCAncycpOiByZXR1cm4gTUNDICgnaCcsICdpJyk7Ci0gICAgY2FzZSBNQ0MgKCdwJywgJ2wnKTogcmV0dXJuIE1DQyAoJ20nLCAnaScpOwotICAgIGNhc2UgTUNDICgnbScsICdpJyk6IHJldHVybiBNQ0MgKCdwJywgJ2wnKTsKLSAgICBjYXNlIE1DQyAoJ2cnLCAnZScpOiByZXR1cm4gTUNDICgnbCcsICdlJyk7Ci0gICAgY2FzZSBNQ0MgKCdsJywgJ3QnKTogcmV0dXJuIE1DQyAoJ2cnLCAndCcpOwotICAgIGNhc2UgTUNDICgnZycsICd0Jyk6IHJldHVybiBNQ0MgKCdsJywgJ3QnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAnZScpOiByZXR1cm4gTUNDICgnZycsICdlJyk7Ci0gICAgfQotICByZXR1cm4gY2M7Ci19Ci0KLS8qIFJldmVyc2UgdGhlIHNlbnNlIG9mIGEgY29uZGl0aW9uLiAgKi8KLQotc3RhdGljIGludAotcmV2ZXJzZV9tcmlfY29uZGl0aW9uIChjYykKLSAgICAgaW50IGNjOwotewotICBzd2l0Y2ggKGNjKQotICAgIHsKLSAgICBjYXNlIE1DQyAoJ2gnLCAnaScpOiByZXR1cm4gTUNDICgnbCcsICdzJyk7Ci0gICAgY2FzZSBNQ0MgKCdsJywgJ3MnKTogcmV0dXJuIE1DQyAoJ2gnLCAnaScpOwotICAgIGNhc2UgTUNDICgnYycsICdjJyk6IHJldHVybiBNQ0MgKCdjJywgJ3MnKTsKLSAgICBjYXNlIE1DQyAoJ2MnLCAncycpOiByZXR1cm4gTUNDICgnYycsICdjJyk7Ci0gICAgY2FzZSBNQ0MgKCduJywgJ2UnKTogcmV0dXJuIE1DQyAoJ2UnLCAncScpOwotICAgIGNhc2UgTUNDICgnZScsICdxJyk6IHJldHVybiBNQ0MgKCduJywgJ2UnKTsKLSAgICBjYXNlIE1DQyAoJ3YnLCAnYycpOiByZXR1cm4gTUNDICgndicsICdzJyk7Ci0gICAgY2FzZSBNQ0MgKCd2JywgJ3MnKTogcmV0dXJuIE1DQyAoJ3YnLCAnYycpOwotICAgIGNhc2UgTUNDICgncCcsICdsJyk6IHJldHVybiBNQ0MgKCdtJywgJ2knKTsKLSAgICBjYXNlIE1DQyAoJ20nLCAnaScpOiByZXR1cm4gTUNDICgncCcsICdsJyk7Ci0gICAgY2FzZSBNQ0MgKCdnJywgJ2UnKTogcmV0dXJuIE1DQyAoJ2wnLCAndCcpOwotICAgIGNhc2UgTUNDICgnbCcsICd0Jyk6IHJldHVybiBNQ0MgKCdnJywgJ2UnKTsKLSAgICBjYXNlIE1DQyAoJ2cnLCAndCcpOiByZXR1cm4gTUNDICgnbCcsICdlJyk7Ci0gICAgY2FzZSBNQ0MgKCdsJywgJ2UnKTogcmV0dXJuIE1DQyAoJ2cnLCAndCcpOwotICAgIH0KLSAgcmV0dXJuIGNjOwotfQotCi0vKiBCdWlsZCBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGV4cHJlc3Npb24uICBUaGlzIGdlbmVyYXRlcyB0ZXN0Ci0gICBhbmQgYnJhbmNoIGluc3RydWN0aW9ucy4gIEl0IGdvZXMgdG8gVFJVRUxBQiBpZiB0aGUgY29uZGl0aW9uIGlzCi0gICB0cnVlLCBhbmQgdG8gRkFMU0VMQUIgaWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZS4gIEV4YWN0bHkgb25lIG9mCi0gICBUUlVFTEFCIGFuZCBGQUxTRUxBQiB3aWxsIGJlIE5VTEwsIG1lYW5pbmcgdG8gZmFsbCB0aHJvdWdoLiAgUVVBTAotICAgaXMgdGhlIHNpemUgcXVhbGlmaWVyIGZvciB0aGUgZXhwcmVzc2lvbi4gIEVYVEVOVCBpcyB0aGUgc2l6ZSB0bwotICAgdXNlIGZvciB0aGUgYnJhbmNoLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQgKHF1YWwsIGNjLCBsZWZ0c3RhcnQsIGxlZnRzdG9wLCByaWdodHN0YXJ0LAotCQkJICAgcmlnaHRzdG9wLCB0cnVlbGFiLCBmYWxzZWxhYiwgZXh0ZW50KQotICAgICBpbnQgcXVhbDsKLSAgICAgaW50IGNjOwotICAgICBjaGFyICpsZWZ0c3RhcnQ7Ci0gICAgIGNoYXIgKmxlZnRzdG9wOwotICAgICBjaGFyICpyaWdodHN0YXJ0OwotICAgICBjaGFyICpyaWdodHN0b3A7Ci0gICAgIGNvbnN0IGNoYXIgKnRydWVsYWI7Ci0gICAgIGNvbnN0IGNoYXIgKmZhbHNlbGFiOwotICAgICBpbnQgZXh0ZW50OwotewotICBjaGFyICpidWY7Ci0gIGNoYXIgKnM7Ci0KLSAgaWYgKGxlZnRzdGFydCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBtNjhrX29wIGxlZnRvcCwgcmlnaHRvcDsKLSAgICAgIGNoYXIgYzsKLQotICAgICAgLyogU3dhcCB0aGUgY29tcGFyZSBvcGVyYW5kcywgaWYgbmVjZXNzYXJ5LCB0byBwcm9kdWNlIGEgbGVnYWwKLQkgbTY4ayBjb21wYXJlIGluc3RydWN0aW9uLiAgQ29tcGFyaW5nIGEgcmVnaXN0ZXIgb3BlcmFuZCB3aXRoCi0JIGEgbm9uLXJlZ2lzdGVyIG9wZXJhbmQgcmVxdWlyZXMgdGhlIHJlZ2lzdGVyIHRvIGJlIG9uIHRoZQotCSByaWdodCAoY21wLCBjbXBhKS4gIENvbXBhcmluZyBhbiBpbW1lZGlhdGUgdmFsdWUgd2l0aAotCSBhbnl0aGluZyByZXF1aXJlcyB0aGUgaW1tZWRpYXRlIHZhbHVlIHRvIGJlIG9uIHRoZSBsZWZ0Ci0JIChjbXBpKS4gICovCi0KLSAgICAgIGMgPSAqbGVmdHN0b3A7Ci0gICAgICAqbGVmdHN0b3AgPSAnXDAnOwotICAgICAgKHZvaWQpIG02OGtfaXBfb3AgKGxlZnRzdGFydCwgJmxlZnRvcCk7Ci0gICAgICAqbGVmdHN0b3AgPSBjOwotCi0gICAgICBjID0gKnJpZ2h0c3RvcDsKLSAgICAgICpyaWdodHN0b3AgPSAnXDAnOwotICAgICAgKHZvaWQpIG02OGtfaXBfb3AgKHJpZ2h0c3RhcnQsICZyaWdodG9wKTsKLSAgICAgICpyaWdodHN0b3AgPSBjOwotCi0gICAgICBpZiAocmlnaHRvcC5tb2RlID09IElNTUVECi0JICB8fCAoKGxlZnRvcC5tb2RlID09IERSRUcgfHwgbGVmdG9wLm1vZGUgPT0gQVJFRykKLQkgICAgICAmJiAocmlnaHRvcC5tb2RlICE9IERSRUcgJiYgcmlnaHRvcC5tb2RlICE9IEFSRUcpKSkKLQl7Ci0JICBjaGFyICp0ZW1wOwotCi0JICBjYyA9IHN3YXBfbXJpX2NvbmRpdGlvbiAoY2MpOwotCSAgdGVtcCA9IGxlZnRzdGFydDsKLQkgIGxlZnRzdGFydCA9IHJpZ2h0c3RhcnQ7Ci0JICByaWdodHN0YXJ0ID0gdGVtcDsKLQkgIHRlbXAgPSBsZWZ0c3RvcDsKLQkgIGxlZnRzdG9wID0gcmlnaHRzdG9wOwotCSAgcmlnaHRzdG9wID0gdGVtcDsKLQl9Ci0gICAgfQotCi0gIGlmICh0cnVlbGFiID09IE5VTEwpCi0gICAgewotICAgICAgY2MgPSByZXZlcnNlX21yaV9jb25kaXRpb24gKGNjKTsKLSAgICAgIHRydWVsYWIgPSBmYWxzZWxhYjsKLSAgICB9Ci0gICAgICAKLSAgaWYgKGxlZnRzdGFydCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwCi0JCQkgICAgICArIChsZWZ0c3RvcCAtIGxlZnRzdGFydCkKLQkJCSAgICAgICsgKHJpZ2h0c3RvcCAtIHJpZ2h0c3RhcnQpKTsKLSAgICAgIHMgPSBidWY7Ci0gICAgICAqcysrID0gJ2MnOwotICAgICAgKnMrKyA9ICdtJzsKLSAgICAgICpzKysgPSAncCc7Ci0gICAgICBpZiAocXVhbCAhPSAnXDAnKQotCSpzKysgPSBxdWFsOwotICAgICAgKnMrKyA9ICcgJzsKLSAgICAgIG1lbWNweSAocywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCAtIGxlZnRzdGFydCk7Ci0gICAgICBzICs9IGxlZnRzdG9wIC0gbGVmdHN0YXJ0OwotICAgICAgKnMrKyA9ICcsJzsKLSAgICAgIG1lbWNweSAocywgcmlnaHRzdGFydCwgcmlnaHRzdG9wIC0gcmlnaHRzdGFydCk7Ci0gICAgICBzICs9IHJpZ2h0c3RvcCAtIHJpZ2h0c3RhcnQ7Ci0gICAgICAqcyA9ICdcMCc7Ci0gICAgICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0gICAgICBmcmVlIChidWYpOwotICAgIH0KLSAgICAgIAotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICgyMCArIHN0cmxlbiAodHJ1ZWxhYikpOwotICBzID0gYnVmOwotICAqcysrID0gJ2InOwotICAqcysrID0gY2MgPj4gODsKLSAgKnMrKyA9IGNjICYgMHhmZjsKLSAgaWYgKGV4dGVudCAhPSAnXDAnKQotICAgICpzKysgPSBleHRlbnQ7Ci0gICpzKysgPSAnICc7Ci0gIHN0cmNweSAocywgdHJ1ZWxhYik7Ci0gIG1yaV9hc3NlbWJsZSAoYnVmKTsKLSAgZnJlZSAoYnVmKTsKLX0KLQotLyogUGFyc2UgYW4gTVJJIHN0cnVjdHVyZWQgY29udHJvbCBleHByZXNzaW9uLiAgVGhpcyBnZW5lcmF0ZXMgdGVzdAotICAgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMuICBTVE9QIGlzIHdoZXJlIHRoZSBleHByZXNzaW9uIGVuZHMuICBJdAotICAgZ29lcyB0byBUUlVFTEFCIGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSwgYW5kIHRvIEZBTFNFTEFCIGlmIHRoZQotICAgY29uZGl0aW9uIGlzIGZhbHNlLiAgRXhhY3RseSBvbmUgb2YgVFJVRUxBQiBhbmQgRkFMU0VMQUIgd2lsbCBiZQotICAgTlVMTCwgbWVhbmluZyB0byBmYWxsIHRocm91Z2guICBRVUFMIGlzIHRoZSBzaXplIHF1YWxpZmllciBmb3IgdGhlCi0gICBleHByZXNzaW9uLiAgRVhURU5UIGlzIHRoZSBzaXplIHRvIHVzZSBmb3IgdGhlIGJyYW5jaC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uIChzdG9wLCBxdWFsLCB0cnVlbGFiLCBmYWxzZWxhYiwgZXh0ZW50KQotICAgICBjaGFyICpzdG9wOwotICAgICBpbnQgcXVhbDsKLSAgICAgY29uc3QgY2hhciAqdHJ1ZWxhYjsKLSAgICAgY29uc3QgY2hhciAqZmFsc2VsYWI7Ci0gICAgIGludCBleHRlbnQ7Ci17Ci0gIGludCBjOwotICBpbnQgY2M7Ci0gIGNoYXIgKmxlZnRzdGFydDsKLSAgY2hhciAqbGVmdHN0b3A7Ci0gIGNoYXIgKnJpZ2h0c3RhcnQ7Ci0gIGNoYXIgKnJpZ2h0c3RvcDsKLQotICBjID0gKnN0b3A7Ci0gICpzdG9wID0gJ1wwJzsKLQotICBpZiAoISBwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kICgmY2MsICZsZWZ0c3RhcnQsICZsZWZ0c3RvcCwKLQkJCQkgICAmcmlnaHRzdGFydCwgJnJpZ2h0c3RvcCkpCi0gICAgewotICAgICAgKnN0b3AgPSBjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkFORCIsIDMpID09IDApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZmxhYjsKLQotICAgICAgaWYgKGZhbHNlbGFiICE9IE5VTEwpCi0JZmxhYiA9IGZhbHNlbGFiOwotICAgICAgZWxzZQotCWZsYWIgPSBtcmlfY29udHJvbF9sYWJlbCAoKTsKLQotICAgICAgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCi0JCQkJIHJpZ2h0c3RvcCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmxhYiwgZXh0ZW50KTsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDM7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLicKLQkgIHx8IGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXDAnKQotCXF1YWwgPSAnXDAnOwotICAgICAgZWxzZQotCXsKLQkgIHF1YWwgPSBpbnB1dF9saW5lX3BvaW50ZXJbMV07Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQl9Ci0KLSAgICAgIGlmICghIHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQgKCZjYywgJmxlZnRzdGFydCwgJmxlZnRzdG9wLAotCQkJCSAgICAgICAmcmlnaHRzdGFydCwgJnJpZ2h0c3RvcCkpCi0JewotCSAgKnN0b3AgPSBjOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCi0JCQkJIHJpZ2h0c3RvcCwgdHJ1ZWxhYiwgZmFsc2VsYWIsIGV4dGVudCk7Ci0KLSAgICAgIGlmIChmYWxzZWxhYiA9PSBOVUxMKQotCWNvbG9uIChmbGFiKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJPUiIsIDIpID09IDApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqdGxhYjsKLQotICAgICAgaWYgKHRydWVsYWIgIT0gTlVMTCkKLQl0bGFiID0gdHJ1ZWxhYjsKLSAgICAgIGVsc2UKLQl0bGFiID0gbXJpX2NvbnRyb2xfbGFiZWwgKCk7Ci0KLSAgICAgIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQgKHF1YWwsIGNjLCBsZWZ0c3RhcnQsIGxlZnRzdG9wLCByaWdodHN0YXJ0LAotCQkJCSByaWdodHN0b3AsIHRsYWIsIChjb25zdCBjaGFyICopIE5VTEwsIGV4dGVudCk7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJy4nCi0JICB8fCBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ1wwJykKLQlxdWFsID0gJ1wwJzsKLSAgICAgIGVsc2UKLQl7Ci0JICBxdWFsID0gaW5wdXRfbGluZV9wb2ludGVyWzFdOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JfQotCi0gICAgICBpZiAoISBwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kICgmY2MsICZsZWZ0c3RhcnQsICZsZWZ0c3RvcCwKLQkJCQkgICAgICAgJnJpZ2h0c3RhcnQsICZyaWdodHN0b3ApKQotCXsKLQkgICpzdG9wID0gYzsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQgKHF1YWwsIGNjLCBsZWZ0c3RhcnQsIGxlZnRzdG9wLCByaWdodHN0YXJ0LAotCQkJCSByaWdodHN0b3AsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpOwotCi0gICAgICBpZiAodHJ1ZWxhYiA9PSBOVUxMKQotCWNvbG9uICh0bGFiKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKLQkJCQkgcmlnaHRzdG9wLCB0cnVlbGFiLCBmYWxzZWxhYiwgZXh0ZW50KTsKLSAgICB9Ci0KLSAgKnN0b3AgPSBjOwotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyICE9IHN0b3ApCi0gICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSIpKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgSUYgcHNldWRvLW9wLiAgVGhpcyBtYXkgYmUgYSBzdHJ1Y3R1cmVkIGNvbnRyb2wKLSAgIGRpcmVjdGl2ZSwgb3IgaXQgbWF5IGJlIGEgcmVndWxhciBhc3NlbWJsZXIgY29uZGl0aW9uYWwsIGRlcGVuZGluZwotICAgb24gaXRzIG9wZXJhbmRzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX2lmIChxdWFsKQotICAgICBpbnQgcXVhbDsKLXsKLSAgY2hhciAqczsKLSAgaW50IGM7Ci0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOwotCi0gIC8qIEEgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSBtdXN0IGVuZCB3aXRoIFRIRU4gd2l0aCBhbgotICAgICBvcHRpb25hbCBxdWFsaWZpZXIuICAqLwotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdCi0JICYmICghIGZsYWdfbXJpIHx8ICpzICE9ICcqJykpCi0gICAgKytzOwotICAtLXM7Ci0gIHdoaWxlIChzID4gaW5wdXRfbGluZV9wb2ludGVyICYmICgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykpCi0gICAgLS1zOwotCi0gIGlmIChzIC0gaW5wdXRfbGluZV9wb2ludGVyID4gMQotICAgICAgJiYgc1stMV0gPT0gJy4nKQotICAgIHMgLT0gMjsKLQotICBpZiAocyAtIGlucHV0X2xpbmVfcG9pbnRlciA8IDMKLSAgICAgIHx8IHN0cm5jYXNlY21wIChzIC0gMywgIlRIRU4iLCA0KSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChxdWFsICE9ICdcMCcpCi0JewotCSAgYXNfYmFkIChfKCJtaXNzaW5nIHRoZW4iKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgLyogSXQncyBhIGNvbmRpdGlvbmFsLiAgKi8KLSAgICAgIHNfaWYgKE9fbmUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBTaW5jZSB0aGlzIG1pZ2h0IGJlIGEgY29uZGl0aW9uYWwgaWYsIHRoaXMgcHNldWRvLW9wIHdpbGwgYmUKLSAgICAgY2FsbGVkIGV2ZW4gaWYgd2UgYXJlIHN1cHBvcnRlZCB0byBiZSBpZ25vcmluZyBpbnB1dC4gIERvdWJsZQotICAgICBjaGVjayBub3cuICBDbG9iYmVyICppbnB1dF9saW5lX3BvaW50ZXIgc28gdGhhdCBpZ25vcmVfaW5wdXQKLSAgICAgdGhpbmtzIHRoYXQgdGhpcyBpcyBub3QgYSBzcGVjaWFsIHBzZXVkby1vcC4gICovCi0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgaWYgKGlnbm9yZV9pbnB1dCAoKSkKLSAgICB7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBuID0gcHVzaF9tcmlfY29udHJvbCAobXJpX2lmKTsKLQotICBwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uIChzIC0gMywgcXVhbCwgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQluLT5uZXh0LCBzWzFdID09ICcuJyA/IHNbMl0gOiAnXDAnKTsKLQotICBpZiAoc1sxXSA9PSAnLicpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gcyArIDM7Ci0gIGVsc2UKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzICsgMTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBlbHNlIHBzZXVkby1vcC4gIElmIHdlIGFyZSBjdXJyZW50bHkgZG9pbmcgYW4gTVJJCi0gICBzdHJ1Y3R1cmVkIElGLCBhc3NvY2lhdGUgdGhlIEVMU0Ugd2l0aCB0aGUgSUYuICBPdGhlcndpc2UsIGFzc3VtZQotICAgaXQgaXMgYSBjb25kaXRpb25hbCBlbHNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX2Vsc2UgKHF1YWwpCi0gICAgIGludCBxdWFsOwotewotICBpbnQgYzsKLSAgY2hhciAqYnVmOwotICBjaGFyIHFbMl07Ci0KLSAgaWYgKHF1YWwgPT0gJ1wwJwotICAgICAgJiYgKG1yaV9jb250cm9sX3N0YWNrID09IE5VTEwKLQkgIHx8IG1yaV9jb250cm9sX3N0YWNrLT50eXBlICE9IG1yaV9pZgotCSAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPmVsc2Vfc2VlbikpCi0gICAgewotICAgICAgc19lbHNlICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSAwOwotICBpZiAoaWdub3JlX2lucHV0ICgpKQotICAgIHsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGlmIChtcmlfY29udHJvbF9zdGFjayA9PSBOVUxMCi0gICAgICB8fCBtcmlfY29udHJvbF9zdGFjay0+dHlwZSAhPSBtcmlfaWYKLSAgICAgIHx8IG1yaV9jb250cm9sX3N0YWNrLT5lbHNlX3NlZW4pCi0gICAgewotICAgICAgYXNfYmFkIChfKCJlbHNlIHdpdGhvdXQgbWF0Y2hpbmcgaWYiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBtcmlfY29udHJvbF9zdGFjay0+ZWxzZV9zZWVuID0gMTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICgyMCArIHN0cmxlbiAobXJpX2NvbnRyb2xfc3RhY2stPmJvdHRvbSkpOwotICBxWzBdID0gcXVhbDsKLSAgcVsxXSA9ICdcMCc7Ci0gIHNwcmludGYgKGJ1ZiwgImJyYSVzICVzIiwgcSwgbXJpX2NvbnRyb2xfc3RhY2stPmJvdHRvbSk7Ci0gIG1yaV9hc3NlbWJsZSAoYnVmKTsKLSAgZnJlZSAoYnVmKTsKLQotICBjb2xvbiAobXJpX2NvbnRyb2xfc3RhY2stPm5leHQpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIEVOREkgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX2VuZGkgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX2lmKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZW5kaSB3aXRob3V0IG1hdGNoaW5nIGlmIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogaWdub3JlX2lucHV0IHdpbGwgbm90IHJldHVybiB0cnVlIGZvciBFTkRJLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgIHdvcnJ5IGFib3V0IGNoZWNraW5nIGl0IGFnYWluIGhlcmUuICAqLwotCi0gIGlmICghIG1yaV9jb250cm9sX3N0YWNrLT5lbHNlX3NlZW4pCi0gICAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5ib3R0b20pOwotCi0gIHBvcF9tcmlfY29udHJvbCAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBCUkVBSyBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfYnJlYWsgKGV4dGVudCkKLSAgICAgaW50IGV4dGVudDsKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciBleFsyXTsKLQotICBuID0gbXJpX2NvbnRyb2xfc3RhY2s7Ci0gIHdoaWxlIChuICE9IE5VTEwKLQkgJiYgbi0+dHlwZSAhPSBtcmlfZm9yCi0JICYmIG4tPnR5cGUgIT0gbXJpX3JlcGVhdAotCSAmJiBuLT50eXBlICE9IG1yaV93aGlsZSkKLSAgICBuID0gbi0+b3V0ZXI7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJicmVhayBvdXRzaWRlIG9mIHN0cnVjdHVyZWQgbG9vcCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuIChuLT5ib3R0b20pKTsKLSAgZXhbMF0gPSBleHRlbnQ7Ci0gIGV4WzFdID0gJ1wwJzsKLSAgc3ByaW50ZiAoYnVmLCAiYnJhJXMgJXMiLCBleCwgbi0+Ym90dG9tKTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIE5FWFQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX25leHQgKGV4dGVudCkKLSAgICAgaW50IGV4dGVudDsKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciBleFsyXTsKLQotICBuID0gbXJpX2NvbnRyb2xfc3RhY2s7Ci0gIHdoaWxlIChuICE9IE5VTEwKLQkgJiYgbi0+dHlwZSAhPSBtcmlfZm9yCi0JICYmIG4tPnR5cGUgIT0gbXJpX3JlcGVhdAotCSAmJiBuLT50eXBlICE9IG1yaV93aGlsZSkKLSAgICBuID0gbi0+b3V0ZXI7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJuZXh0IG91dHNpZGUgb2Ygc3RydWN0dXJlZCBsb29wIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKG4tPm5leHQpKTsKLSAgZXhbMF0gPSBleHRlbnQ7Ci0gIGV4WzFdID0gJ1wwJzsKLSAgc3ByaW50ZiAoYnVmLCAiYnJhJXMgJXMiLCBleCwgbi0+bmV4dCk7Ci0gIG1yaV9hc3NlbWJsZSAoYnVmKTsKLSAgZnJlZSAoYnVmKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBGT1IgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX2ZvciAocXVhbCkKLSAgICAgaW50IHF1YWw7Ci17Ci0gIGNvbnN0IGNoYXIgKnZhcnN0YXJ0LCAqdmFyc3RvcDsKLSAgY29uc3QgY2hhciAqaW5pdHN0YXJ0LCAqaW5pdHN0b3A7Ci0gIGNvbnN0IGNoYXIgKmVuZHN0YXJ0LCAqZW5kc3RvcDsKLSAgY29uc3QgY2hhciAqYnlzdGFydCwgKmJ5c3RvcDsKLSAgaW50IHVwOwotICBpbnQgYnk7Ci0gIGludCBleHRlbnQ7Ci0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgZXhbMl07Ci0KLSAgLyogVGhlIHN5bnRheCBpcwotICAgICAgIEZPUi5xIHZhciA9IGluaXQgeyBUTyB8IERPV05UTyB9IGVuZCBbIEJZIGJ5IF0gRE8uZQotICAgICAqLwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgdmFyc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogTG9vayBmb3IgdGhlICc9Jy4gICovCi0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXQotCSAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICc9JykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyA9IikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdmFyc3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKHZhcnN0b3AgPiB2YXJzdGFydAotICAgICAgJiYgKHZhcnN0b3BbLTFdID09ICcgJyB8fCB2YXJzdG9wWy0xXSA9PSAnXHQnKSkKLSAgICAtLXZhcnN0b3A7Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaW5pdHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIExvb2sgZm9yIFRPIG9yIERPV05UTy4gICovCi0gIHVwID0gMTsKLSAgaW5pdHN0b3AgPSBOVUxMOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJUTyIsIDIpID09IDAKLQkgICYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbMl0pKQotCXsKLQkgIGluaXRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkRPV05UTyIsIDYpID09IDAKLQkgICYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbNl0pKQotCXsKLQkgIGluaXRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgdXAgPSAwOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0JICBicmVhazsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGlmIChpbml0c3RvcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyB0byBvciBkb3dudG8iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKGluaXRzdG9wID4gaW5pdHN0YXJ0Ci0gICAgICAmJiAoaW5pdHN0b3BbLTFdID09ICcgJyB8fCBpbml0c3RvcFstMV0gPT0gJ1x0JykpCi0gICAgLS1pbml0c3RvcDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGVuZHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIExvb2sgZm9yIEJZIG9yIERPLiAgKi8KLSAgYnkgPSAwOwotICBlbmRzdG9wID0gTlVMTDsKLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiQlkiLCAyKSA9PSAwCi0JICAmJiAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzJdKSkKLQl7Ci0JICBlbmRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgYnkgPSAxOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkRPIiwgMikgPT0gMAotCSAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsyXSA9PSAnLicKLQkgICAgICB8fCAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzJdKSkpCi0JewotCSAgZW5kc3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCSAgYnJlYWs7Ci0JfQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBpZiAoZW5kc3RvcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBkbyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoZW5kc3RvcCA+IGVuZHN0YXJ0Ci0gICAgICAmJiAoZW5kc3RvcFstMV0gPT0gJyAnIHx8IGVuZHN0b3BbLTFdID09ICdcdCcpKQotICAgIC0tZW5kc3RvcDsKLQotICBpZiAoISBieSkKLSAgICB7Ci0gICAgICBieXN0YXJ0ID0gIiMxIjsKLSAgICAgIGJ5c3RvcCA9IGJ5c3RhcnQgKyAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGJ5c3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIC8qIExvb2sgZm9yIERPLiAgKi8KLSAgICAgIGJ5c3RvcCA9IE5VTEw7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JewotCSAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJETyIsIDIpID09IDAKLQkgICAgICAmJiAoaW5wdXRfbGluZV9wb2ludGVyWzJdID09ICcuJwotCQkgIHx8ICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbMl0pKSkKLQkgICAgewotCSAgICAgIGJ5c3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgICAgaWYgKGJ5c3RvcCA9PSBOVUxMKQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyBkbyIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGJ5c3RvcCA+IGJ5c3RhcnQKLQkgICYmIChieXN0b3BbLTFdID09ICcgJyB8fCBieXN0b3BbLTFdID09ICdcdCcpKQotCS0tYnlzdG9wOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLicpCi0gICAgZXh0ZW50ID0gJ1wwJzsKLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dGVudCA9IGlucHV0X2xpbmVfcG9pbnRlclsxXTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotICAgIH0KLQotICAvKiBXZSBoYXZlIGZ1bGx5IHBhcnNlZCB0aGUgRk9SIG9wZXJhbmRzLiAgTm93IGJ1aWxkIHRoZSBsb29wLiAgKi8KLQotICBuID0gcHVzaF9tcmlfY29udHJvbCAobXJpX2Zvcik7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoNTAgKyAoaW5wdXRfbGluZV9wb2ludGVyIC0gdmFyc3RhcnQpKTsKLQotICAvKiBtb3ZlIGluaXQsdmFyICovCi0gIHMgPSBidWY7Ci0gICpzKysgPSAnbSc7Ci0gICpzKysgPSAnbyc7Ci0gICpzKysgPSAndic7Ci0gICpzKysgPSAnZSc7Ci0gIGlmIChxdWFsICE9ICdcMCcpCi0gICAgKnMrKyA9IHF1YWw7Ci0gICpzKysgPSAnICc7Ci0gIG1lbWNweSAocywgaW5pdHN0YXJ0LCBpbml0c3RvcCAtIGluaXRzdGFydCk7Ci0gIHMgKz0gaW5pdHN0b3AgLSBpbml0c3RhcnQ7Ci0gICpzKysgPSAnLCc7Ci0gIG1lbWNweSAocywgdmFyc3RhcnQsIHZhcnN0b3AgLSB2YXJzdGFydCk7Ci0gIHMgKz0gdmFyc3RvcCAtIHZhcnN0YXJ0OwotICAqcyA9ICdcMCc7Ci0gIG1yaV9hc3NlbWJsZSAoYnVmKTsKLQotICBjb2xvbiAobi0+dG9wKTsKLQotICAvKiBjbXAgZW5kLHZhciAqLwotICBzID0gYnVmOwotICAqcysrID0gJ2MnOwotICAqcysrID0gJ20nOwotICAqcysrID0gJ3AnOwotICBpZiAocXVhbCAhPSAnXDAnKQotICAgICpzKysgPSBxdWFsOwotICAqcysrID0gJyAnOwotICBtZW1jcHkgKHMsIGVuZHN0YXJ0LCBlbmRzdG9wIC0gZW5kc3RhcnQpOwotICBzICs9IGVuZHN0b3AgLSBlbmRzdGFydDsKLSAgKnMrKyA9ICcsJzsKLSAgbWVtY3B5IChzLCB2YXJzdGFydCwgdmFyc3RvcCAtIHZhcnN0YXJ0KTsKLSAgcyArPSB2YXJzdG9wIC0gdmFyc3RhcnQ7Ci0gICpzID0gJ1wwJzsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotCi0gIC8qIGJjYyBib3R0b20gKi8KLSAgZXhbMF0gPSBleHRlbnQ7Ci0gIGV4WzFdID0gJ1wwJzsKLSAgaWYgKHVwKQotICAgIHNwcmludGYgKGJ1ZiwgImJsdCVzICVzIiwgZXgsIG4tPmJvdHRvbSk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChidWYsICJiZ3QlcyAlcyIsIGV4LCBuLT5ib3R0b20pOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0KLSAgLyogUHV0IHRvZ2V0aGVyIHRoZSBhZGQgb3Igc3ViIGluc3RydWN0aW9uIHVzZWQgYnkgRU5ERi4gICovCi0gIHMgPSBidWY7Ci0gIGlmICh1cCkKLSAgICBzdHJjcHkgKHMsICJhZGQiKTsKLSAgZWxzZQotICAgIHN0cmNweSAocywgInN1YiIpOwotICBzICs9IDM7Ci0gIGlmIChxdWFsICE9ICdcMCcpCi0gICAgKnMrKyA9IHF1YWw7Ci0gICpzKysgPSAnICc7Ci0gIG1lbWNweSAocywgYnlzdGFydCwgYnlzdG9wIC0gYnlzdGFydCk7Ci0gIHMgKz0gYnlzdG9wIC0gYnlzdGFydDsKLSAgKnMrKyA9ICcsJzsKLSAgbWVtY3B5IChzLCB2YXJzdGFydCwgdmFyc3RvcCAtIHZhcnN0YXJ0KTsKLSAgcyArPSB2YXJzdG9wIC0gdmFyc3RhcnQ7Ci0gICpzID0gJ1wwJzsKLSAgbi0+aW5jciA9IGJ1ZjsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBFTkRGIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9lbmRmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKG1yaV9jb250cm9sX3N0YWNrID09IE5VTEwKLSAgICAgIHx8IG1yaV9jb250cm9sX3N0YWNrLT50eXBlICE9IG1yaV9mb3IpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJlbmRmIHdpdGhvdXQgZm9yIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKLQotICBtcmlfYXNzZW1ibGUgKG1yaV9jb250cm9sX3N0YWNrLT5pbmNyKTsKLQotICBzcHJpbnRmIChtcmlfY29udHJvbF9zdGFjay0+aW5jciwgImJyYSAlcyIsIG1yaV9jb250cm9sX3N0YWNrLT50b3ApOwotICBtcmlfYXNzZW1ibGUgKG1yaV9jb250cm9sX3N0YWNrLT5pbmNyKTsKLQotICBmcmVlIChtcmlfY29udHJvbF9zdGFjay0+aW5jcik7Ci0KLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5ib3R0b20pOwotCi0gIHBvcF9tcmlfY29udHJvbCAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBSRVBFQVQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX3JlcGVhdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOwotCi0gIG4gPSBwdXNoX21yaV9jb250cm9sIChtcmlfcmVwZWF0KTsKLSAgY29sb24gKG4tPnRvcCk7Ci0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBVTlRJTCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfdW50aWwgKHF1YWwpCi0gICAgIGludCBxdWFsOwotewotICBjaGFyICpzOwotCi0gIGlmIChtcmlfY29udHJvbF9zdGFjayA9PSBOVUxMCi0gICAgICB8fCBtcmlfY29udHJvbF9zdGFjay0+dHlwZSAhPSBtcmlfcmVwZWF0KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW50aWwgd2l0aG91dCByZXBlYXQiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjb2xvbiAobXJpX2NvbnRyb2xfc3RhY2stPm5leHQpOwotCi0gIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlcjsgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdOyBzKyspCi0gICAgOwotCi0gIHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24gKHMsIHF1YWwsIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJbXJpX2NvbnRyb2xfc3RhY2stPnRvcCwgJ1wwJyk7Ci0KLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5ib3R0b20pOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0KLSAgcG9wX21yaV9jb250cm9sICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIFdISUxFIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV93aGlsZSAocXVhbCkKLSAgICAgaW50IHF1YWw7Ci17Ci0gIGNoYXIgKnM7Ci0KLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0KLSAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpzXQotCSAmJiAoISBmbGFnX21yaSB8fCAqcyAhPSAnKicpKQotICAgIHMrKzsKLSAgLS1zOwotICB3aGlsZSAoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpCi0gICAgLS1zOwotICBpZiAocyAtIGlucHV0X2xpbmVfcG9pbnRlciA+IDEKLSAgICAgICYmIHNbLTFdID09ICcuJykKLSAgICBzIC09IDI7Ci0gIGlmIChzIC0gaW5wdXRfbGluZV9wb2ludGVyIDwgMgotICAgICAgfHwgc3RybmNhc2VjbXAgKHMgLSAxLCAiRE8iLCAyKSAhPSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBkbyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG4gPSBwdXNoX21yaV9jb250cm9sIChtcmlfd2hpbGUpOwotCi0gIGNvbG9uIChuLT5uZXh0KTsKLQotICBwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uIChzIC0gMSwgcXVhbCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgbi0+Ym90dG9tLAotCQkJCXNbMV0gPT0gJy4nID8gc1syXSA6ICdcMCcpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHMgKyAxOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLicpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgRU5EVyBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfZW5kdyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKmJ1ZjsKLQotICBpZiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX3doaWxlKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZW5kdyB3aXRob3V0IHdoaWxlIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KSk7Ci0gIHNwcmludGYgKGJ1ZiwgImJyYSAlcyIsIG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKLQotICBwb3BfbXJpX2NvbnRyb2wgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qCi0gKiBtZF9wYXJzZV9vcHRpb24KLSAqCUludm9jYXRpb24gbGluZSBpbmNsdWRlcyBhIHN3aXRjaCBub3QgcmVjb2duaXplZCBieSB0aGUgYmFzZSBhc3NlbWJsZXIuCi0gKglTZWUgaWYgaXQncyBhIHByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpb24uICBUaGVzZSBhcmU6Ci0gKgotICoJLVtBXW1bY102ODAwMCwgLVtBXW1bY102ODAwOCwgLVtBXW1bY102ODAxMCwgLVtBXW1bY102ODAyMCwgLVtBXW1bY102ODAzMCwgLVtBXW1bY102ODA0MAotICoJLVtBXW1bY102ODg4MSwgLVtBXW1bY102ODg4MiwgLVtBXW1bY102ODg1MQotICoJCVNlbGVjdCB0aGUgYXJjaGl0ZWN0dXJlLiAgSW5zdHJ1Y3Rpb25zIG9yIGZlYXR1cmVzIG5vdAotICoJCXN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlIGNhdXNlIGZhdGFsCi0gKgkJZXJyb3JzLiAgTW9yZSB0aGFuIG9uZSBtYXkgYmUgc3BlY2lmaWVkLiAgVGhlIGRlZmF1bHQgaXMKLSAqCQktbTY4MDIwIC1tNjg4NTEgLW02ODg4MS4gIE5vdGUgdGhhdCAtbTY4MDA4IGlzIGEgc3lub255bQotICoJCWZvciAtbTY4MDAwLCBhbmQgLW02ODg4MiBpcyBhIHN5bm9ueW0gZm9yIC1tNjg4ODEuCi0gKgktW0FdbVtjXW5vLTY4ODUxLCAtW0FdbVtjXW5vLTY4ODgxCi0gKgkJRG9uJ3QgYWNjZXB0IDY4OD8xIGluc3RydWN0aW9ucy4gIChUaGUgImMiIGlzIGtpbmQgb2Ygc2lsbHksCi0gKgkJc28gZG9uJ3QgdXNlIG9yIGRvY3VtZW50IGl0LCBidXQgdGhhdCdzIHRoZSB3YXkgdGhlIHBhcnNpbmcKLSAqCQl3b3JrcykuCi0gKgotICoJLXBpYwlJbmRpY2F0ZXMgUElDLgotICoJLWsJSW5kaWNhdGVzIFBJQy4gIChTdW4gMyBvbmx5LikKLSAqCi0gKgktLWJpdHdpc2Utb3IKLSAqCQlQZXJtaXQgYHwnIHRvIGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMuCi0gKgotICovCi0KLSNpZmRlZiBPQkpfRUxGCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAibFNBOm06a1E6ViI7Ci0jZWxzZQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImxTQTptOmsiOwotI2VuZGlmCi0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSNkZWZpbmUgT1BUSU9OX1BJQyAoT1BUSU9OX01EX0JBU0UpCi0gIHsicGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QSUN9LAotI2RlZmluZSBPUFRJT05fUkVHSVNURVJfUFJFRklYX09QVElPTkFMIChPUFRJT05fTURfQkFTRSArIDEpCi0gIHsicmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsIiwgbm9fYXJndW1lbnQsIE5VTEwsCi0gICAgIE9QVElPTl9SRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUx9LAotI2RlZmluZSBPUFRJT05fQklUV0lTRV9PUiAoT1BUSU9OX01EX0JBU0UgKyAyKQotICB7ImJpdHdpc2Utb3IiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JJVFdJU0VfT1J9LAotI2RlZmluZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMTYgKE9QVElPTl9NRF9CQVNFICsgMykKLSAgeyJiYXNlLXNpemUtZGVmYXVsdC0xNiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMTZ9LAotI2RlZmluZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMzIgKE9QVElPTl9NRF9CQVNFICsgNCkKLSAgeyJiYXNlLXNpemUtZGVmYXVsdC0zMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMzJ9LAotI2RlZmluZSBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMTYgKE9QVElPTl9NRF9CQVNFICsgNSkKLSAgeyJkaXNwLXNpemUtZGVmYXVsdC0xNiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMTZ9LAotI2RlZmluZSBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMzIgKE9QVElPTl9NRF9CQVNFICsgNikKLSAgeyJkaXNwLXNpemUtZGVmYXVsdC0zMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMzJ9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ2wnOgkJCS8qIC1sIG1lYW5zIGtlZXAgZXh0ZXJuYWwgdG8gMiBiaXQgb2Zmc2V0Ci0JCQkJICAgcmF0aGVyIHRoYW4gMTYgYml0IG9uZSAqLwotICAgICAgZmxhZ19zaG9ydF9yZWZzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6CQkJLyogLVMgbWVhbnMgdGhhdCBqYnNyJ3MgYWx3YXlzIHR1cm4gaW50bwotCQkJCSAgIGpzcidzLiAgKi8KLSAgICAgIGZsYWdfbG9uZ19qdW1wcyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0EnOgotICAgICAgaWYgKCphcmcgPT0gJ20nKQotIAlhcmcrKzsKLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGwtdGhyb3VnaCAqLwotICAgIGNhc2UgJ20nOgotCi0gICAgICBpZiAoYXJnWzBdID09ICduJyAmJiBhcmdbMV0gPT0gJ28nICYmIGFyZ1syXSA9PSAnLScpCi0JewotCSAgaW50IGk7Ci0JICB1bnNpZ25lZCBsb25nIGFyY2g7Ci0JICBjb25zdCBjaGFyICpvYXJnID0gYXJnOwotCi0JICBhcmcgKz0gMzsKLQkgIGlmICgqYXJnID09ICdtJykKLQkgICAgewotCSAgICAgIGFyZysrOwotCSAgICAgIGlmIChhcmdbMF0gPT0gJ2MnICYmIGFyZ1sxXSA9PSAnNicpCi0JCWFyZysrOwotCSAgICB9Ci0JICBmb3IgKGkgPSAwOyBpIDwgbl9hcmNoczsgaSsrKQotCSAgICBpZiAoIXN0cmNtcCAoYXJnLCBhcmNoc1tpXS5uYW1lKSkKLQkgICAgICBicmVhazsKLQkgIGlmIChpID09IG5fYXJjaHMpCi0JICAgIHsKLQkgICAgdW5rbm93bjoKLQkgICAgICBhc19iYWQgKF8oInVucmVjb2duaXplZCBvcHRpb24gYCVzJyIpLCBvYXJnKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgYXJjaCA9IGFyY2hzW2ldLmFyY2g7Ci0JICBpZiAoYXJjaCA9PSBtNjg4ODEpCi0JICAgIG5vXzY4ODgxID0gMTsKLQkgIGVsc2UgaWYgKGFyY2ggPT0gbTY4ODUxKQotCSAgICBub182ODg1MSA9IDE7Ci0JICBlbHNlCi0JICAgIGdvdG8gdW5rbm93bjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IGk7Ci0KLQkgIGlmIChhcmdbMF0gPT0gJ2MnICYmIGFyZ1sxXSA9PSAnNicpCi0JICAgIGFyZysrOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgbl9hcmNoczsgaSsrKQotCSAgICBpZiAoIXN0cmNtcCAoYXJnLCBhcmNoc1tpXS5uYW1lKSkKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGxvbmcgYXJjaCA9IGFyY2hzW2ldLmFyY2g7Ci0JCWlmIChjcHVfb2ZfYXJjaCAoYXJjaCkpCi0JCSAgLyogSXQncyBhIGNwdSBzcGVjLiAgKi8KLQkJICB7Ci0JCSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSAmPSB+bTY4MDAwdXA7Ci0JCSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBhcmNoOwotCQkgIH0KLQkJZWxzZSBpZiAoYXJjaCA9PSBtNjg4ODEpCi0JCSAgewotCQkgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODgxOwotCQkgICAgbm9fNjg4ODEgPSAwOwotCQkgIH0KLQkJZWxzZSBpZiAoYXJjaCA9PSBtNjg4NTEpCi0JCSAgewotCQkgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODUxOwotCQkgICAgbm9fNjg4NTEgPSAwOwotCQkgIH0KLQkJZWxzZQotCQkgIC8qID8/PyAqLwotCQkgIGFib3J0ICgpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICBpZiAoaSA9PSBuX2FyY2hzKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJ1bnJlY29nbml6ZWQgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYCVzJyIpLCBhcmcpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QSUM6Ci0gICAgY2FzZSAnayc6Ci0gICAgICBmbGFnX3dhbnRfcGljID0gMTsKLSAgICAgIGJyZWFrOwkJCS8qIC1waWMsIFBvc2l0aW9uIEluZGVwZW5kZW50IENvZGUgKi8KLQotICAgIGNhc2UgT1BUSU9OX1JFR0lTVEVSX1BSRUZJWF9PUFRJT05BTDoKLSAgICAgIGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCA9IDE7Ci0gICAgICByZWdfcHJlZml4X29wdGlvbmFsX3NlZW4gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIC1WOiBTVlI0IGFyZ3VtZW50IHRvIHByaW50IHZlcnNpb24gSUQuICAqLwotICAgIGNhc2UgJ1YnOgotICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAtUXksIC1RbjogU1ZSNCBhcmd1bWVudHMgY29udHJvbGxpbmcgd2hldGhlciBhIC5jb21tZW50IHNlY3Rpb24KLQkgc2hvdWxkIGJlIGVtaXR0ZWQgb3Igbm90LiAgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gICAgY2FzZSAnUSc6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0JJVFdJU0VfT1I6Ci0gICAgICB7Ci0JY2hhciAqbiwgKnQ7Ci0JY29uc3QgY2hhciAqczsKLQotCW4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG02OGtfY29tbWVudF9jaGFycykgKyAxKTsKLQl0ID0gbjsKLQlmb3IgKHMgPSBtNjhrX2NvbW1lbnRfY2hhcnM7ICpzICE9ICdcMCc7IHMrKykKLQkgIGlmICgqcyAhPSAnfCcpCi0JICAgICp0KysgPSAqczsKLQkqdCA9ICdcMCc7Ci0JbTY4a19jb21tZW50X2NoYXJzID0gbjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMTY6Ci0gICAgICBtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQgPSBTSVpFX1dPUkQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0JBU0VfU0laRV9ERUZBVUxUXzMyOgotICAgICAgbTY4a19pbmRleF93aWR0aF9kZWZhdWx0ID0gU0laRV9MT05HOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8xNjoKLSAgICAgIG02OGtfcmVsMzIgPSAwOwotICAgICAgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8zMjoKLSAgICAgIG02OGtfcmVsMzIgPSAxOwotICAgICAgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLTY4MFgwIG9wdGlvbnM6XG5cCi0tbAkJCXVzZSAxIHdvcmQgZm9yIHJlZnMgdG8gdW5kZWZpbmVkIHN5bWJvbHMgW2RlZmF1bHQgMl1cblwKLS1tNjgwMDAgfCAtbTY4MDA4IHwgLW02ODAxMCB8IC1tNjgwMjAgfCAtbTY4MDMwIHwgLW02ODA0MCB8IC1tNjgwNjBcblwKLSB8IC1tNjgzMDIgfCAtbTY4MzMxIHwgLW02ODMzMiB8IC1tNjgzMzMgfCAtbTY4MzQwIHwgLW02ODM2MFxuXAotIHwgLW1jcHUzMiB8IC1tNTIwMFxuXAotCQkJc3BlY2lmeSB2YXJpYW50IG9mIDY4MFgwIGFyY2hpdGVjdHVyZSBbZGVmYXVsdCA2ODAyMF1cblwKLS1tNjg4ODEgfCAtbTY4ODgyIHwgLW1uby02ODg4MSB8IC1tbm8tNjg4ODJcblwKLQkJCXRhcmdldCBoYXMvbGFja3MgZmxvYXRpbmctcG9pbnQgY29wcm9jZXNzb3JcblwKLQkJCVtkZWZhdWx0IHllcyBmb3IgNjgwMjAsIDY4MDMwLCBhbmQgY3B1MzJdXG4iKSk7Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi0tbTY4ODUxIHwgLW1uby02ODg1MVxuXAotCQkJdGFyZ2V0IGhhcy9sYWNrcyBtZW1vcnktbWFuYWdlbWVudCB1bml0IGNvcHJvY2Vzc29yXG5cCi0JCQlbZGVmYXVsdCB5ZXMgZm9yIDY4MDIwIGFuZCB1cF1cblwKLS1waWMsIC1rCQlnZW5lcmF0ZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG5cCi0tUwkJCXR1cm4gamJzciBpbnRvIGpzclxuXAotLS1yZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWxcblwKLQkJCXJlY29nbml6ZSByZWdpc3RlciBuYW1lcyB3aXRob3V0IHByZWZpeCBjaGFyYWN0ZXJcblwKLS0tYml0d2lzZS1vcgkJZG8gbm90IHRyZWF0IGB8JyBhcyBhIGNvbW1lbnQgY2hhcmFjdGVyXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotLS1iYXNlLXNpemUtZGVmYXVsdC0xNgliYXNlIHJlZyB3aXRob3V0IHNpemUgaXMgMTYgYml0c1xuXAotLS1iYXNlLXNpemUtZGVmYXVsdC0zMgliYXNlIHJlZyB3aXRob3V0IHNpemUgaXMgMzIgYml0cyAoZGVmYXVsdClcblwKLS0tZGlzcC1zaXplLWRlZmF1bHQtMTYJZGlzcGxhY2VtZW50IHdpdGggdW5rbm93biBzaXplIGlzIDE2IGJpdHNcblwKLS0tZGlzcC1zaXplLWRlZmF1bHQtMzIJZGlzcGxhY2VtZW50IHdpdGggdW5rbm93biBzaXplIGlzIDMyIGJpdHMgKGRlZmF1bHQpXG4iKSk7Ci19Ci0MCi0jaWZkZWYgVEVTVDIKLQotLyogVEVTVDI6ICBUZXN0IG1kX2Fzc2VtYmxlKCkgKi8KLS8qIFdhcm5pbmcsIHRoaXMgcm91dGluZSBwcm9iYWJseSBkb2Vzbid0IHdvcmsgYW55bW9yZSAqLwotCi1tYWluICgpCi17Ci0gIHN0cnVjdCBtNjhrX2l0IHRoZV9pbnM7Ci0gIGNoYXIgYnVmWzEyMF07Ci0gIGNoYXIgKmNwOwotICBpbnQgbjsKLQotICBtNjhrX2lwX2JlZ2luICgpOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGlmICghZ2V0cyAoYnVmKSB8fCAhKmJ1ZikKLQlicmVhazsKLSAgICAgIGlmIChidWZbMF0gPT0gJ3wnIHx8IGJ1ZlsxXSA9PSAnLicpCi0JY29udGludWU7Ci0gICAgICBmb3IgKGNwID0gYnVmOyAqY3A7IGNwKyspCi0JaWYgKCpjcCA9PSAnXHQnKQotCSAgKmNwID0gJyAnOwotICAgICAgaWYgKGlzX2xhYmVsIChidWYpKQotCWNvbnRpbnVlOwotICAgICAgbWVtc2V0ICgmdGhlX2lucywgJ1wwJywgc2l6ZW9mICh0aGVfaW5zKSk7Ci0gICAgICBtNjhrX2lwICgmdGhlX2lucywgYnVmKTsKLSAgICAgIGlmICh0aGVfaW5zLmVycm9yKQotCXsKLQkgIHByaW50ZiAoXygiRXJyb3IgJXMgaW4gJXNcbiIpLCB0aGVfaW5zLmVycm9yLCBidWYpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKF8oIk9wY29kZSglZC4lcyk6ICIpLCB0aGVfaW5zLm51bW8sIHRoZV9pbnMuYXJncyk7Ci0JICBmb3IgKG4gPSAwOyBuIDwgdGhlX2lucy5udW1vOyBuKyspCi0JICAgIHByaW50ZiAoIiAweCV4IiwgdGhlX2lucy5vcGNvZGVbbl0gJiAweGZmZmYpOwotCSAgcHJpbnRmICgiICAgICIpOwotCSAgcHJpbnRfdGhlX2luc24gKCZ0aGVfaW5zLm9wY29kZVswXSwgc3Rkb3V0KTsKLQkgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLQl9Ci0gICAgICBmb3IgKG4gPSAwOyBuIDwgc3RybGVuICh0aGVfaW5zLmFyZ3MpIC8gMjsgbisrKQotCXsKLQkgIGlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmVycm9yKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgib3AlZCBFcnJvciAlcyBpbiAlc1xuIiwgbiwgdGhlX2lucy5vcGVyYW5kc1tuXS5lcnJvciwgYnVmKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgcHJpbnRmICgibW9kZSAlZCwgcmVnICVkLCAiLCB0aGVfaW5zLm9wZXJhbmRzW25dLm1vZGUsIHRoZV9pbnMub3BlcmFuZHNbbl0ucmVnKTsKLQkgIGlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmJfY29uc3QpCi0JICAgIHByaW50ZiAoIkNvbnN0YW50OiAnJS4qcycsICIsIDEgKyB0aGVfaW5zLm9wZXJhbmRzW25dLmVfY29uc3QgLSB0aGVfaW5zLm9wZXJhbmRzW25dLmJfY29uc3QsIHRoZV9pbnMub3BlcmFuZHNbbl0uYl9jb25zdCk7Ci0JICBwcmludGYgKCJpcmVnICVkLCBpc2l6ICVkLCBpbXVsICVkLCAiLCB0aGVfaW5zLm9wZXJhbmRzW25dLmlyZWcsIHRoZV9pbnMub3BlcmFuZHNbbl0uaXNpeiwgdGhlX2lucy5vcGVyYW5kc1tuXS5pbXVsKTsKLQkgIGlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmJfaWFkZCkKLQkgICAgcHJpbnRmICgiSWFkZDogJyUuKnMnLCIsIDEgKyB0aGVfaW5zLm9wZXJhbmRzW25dLmVfaWFkZCAtIHRoZV9pbnMub3BlcmFuZHNbbl0uYl9pYWRkLCB0aGVfaW5zLm9wZXJhbmRzW25dLmJfaWFkZCk7Ci0JICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7Ci0JfQotICAgIH0KLSAgbTY4a19pcF9lbmQgKCk7Ci0gIHJldHVybiAwOwotfQotCi1pc19sYWJlbCAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLSAgd2hpbGUgKCpzdHIgJiYgKnN0ciAhPSAnICcpCi0gICAgc3RyKys7Ci0gIGlmIChzdHJbLTFdID09ICc6JyB8fCBzdHJbMV0gPT0gJz0nKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLS8qIFBvc3NpYmxlIHN0YXRlcyBmb3IgcmVsYXhhdGlvbjoKLQotICAgMCAwCWJyYW5jaCBvZmZzZXQJYnl0ZQkoYnJhLCBldGMpCi0gICAwIDEJCQl3b3JkCi0gICAwIDIJCQlsb25nCi0KLSAgIDEgMAlpbmRleGVkIG9mZnNldHMJYnl0ZQlhMEAoMzIsZDQ6dzoxKSBldGMKLSAgIDEgMQkJCXdvcmQKLSAgIDEgMgkJCWxvbmcKLQotICAgMiAwCXR3by1vZmZzZXQgaW5kZXggd29yZC13b3JkIGEwQCgzMixkNClAKDQ1KSBldGMKLSAgIDIgMQkJCXdvcmQtbG9uZwotICAgMiAyCQkJbG9uZy13b3JkCi0gICAyIDMJCQlsb25nLWxvbmcKLQotICAgKi8KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICAqLwotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0jaWZkZWYgT0JKX0FPVVQKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIC8qIEZvciBhLm91dCwgZm9yY2UgdGhlIHNlY3Rpb24gc2l6ZSB0byBiZSBhbGlnbmVkLiAgSWYgd2UgZG9uJ3QgZG8KLSAgICAgdGhpcywgQkZEIHdpbGwgYWxpZ24gaXQgZm9yIHVzLCBidXQgaXQgd2lsbCBub3Qgd3JpdGUgb3V0IHRoZQotICAgICBmaW5hbCBieXRlcyBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgbWF5IGJlIGEgYnVnIGluIEJGRCwgYnV0IGl0IGlzCi0gICAgIGVhc2llciB0byBmaXggaXQgaGVyZSBzaW5jZSB0aGF0IGlzIGhvdyB0aGUgb3RoZXIgYS5vdXQgdGFyZ2V0cwotICAgICB3b3JrLiAgKi8KLSAgaW50IGFsaWduOwotCi0gIGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWdtZW50KTsKLSAgc2l6ZSA9ICgoc2l6ZSArICgxIDw8IGFsaWduKSAtIDEpICYgKCh2YWx1ZVQpIC0xIDw8IGFsaWduKSk7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIHJldHVybiBzaXplOwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgNjhrLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgZXh0ZW5zaW9uCi0gICB3b3JkLiAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWRkcmVzc2VzIG9mIHRoZSBvZmZzZXQgYW5kIHRoZQotICAgZmlyc3QgZXh0ZW5zaW9uIHdvcmQgaXMgc3RvcmVkIGluIGZ4X3BjcmVsX2FkanVzdC4gKi8KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGludCBhZGp1c3Q7Ci0KLSAgLyogQmVjYXVzZSBmeF9wY3JlbF9hZGp1c3QgaXMgYSBjaGFyLCBhbmQgbWF5IGJlIHVuc2lnbmVkLCB3ZSBzdG9yZQotICAgICAtMSBhcyA2NC4gICovCi0gIGFkanVzdCA9IGZpeFAtPmZ4X3BjcmVsX2FkanVzdDsKLSAgaWYgKGFkanVzdCA9PSA2NCkKLSAgICBhZGp1c3QgPSAtMTsKLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyAtIGFkanVzdDsKLX0KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZkZWYgT0JKX0NPRkYKLQotLypBUkdTVVNFRCovCi12b2lkCi10Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKGlnbm9yZSkKLSAgICAgc3ltYm9sUyAqaWdub3JlOwotewotfQotCi1pbnQKLXRjX2NvZmZfc2l6ZW1hY2hkZXAgKGZyYWcpCi0gICAgIGZyYWdTICpmcmFnOwotewotICBzd2l0Y2ggKGZyYWctPmZyX3N1YnR5cGUgJiAweDMpCi0gICAgewotICAgIGNhc2UgQllURToKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgU0hPUlQ6Ci0gICAgICByZXR1cm4gMjsKLSAgICBjYXNlIExPTkc6Ci0gICAgICByZXR1cm4gNDsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotdm9pZCBtNjhrX2VsZl9maW5hbF9wcm9jZXNzaW5nKCkKLXsKLSAgIC8qIFNldCBmaWxlLXNwZWNpZmljIGZsYWdzIGlmIHRoaXMgaXMgYSBjcHUzMiBwcm9jZXNzb3IgKi8KLSAgIGlmIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpICYgY3B1MzIpCi0gICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfQ1BVMzI7Ci19Ci0jZW5kaWYKLS8qIGVuZCBvZiB0Yy1tNjhrLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTY4ay5oIGIvZ2FzL2NvbmZpZy90Yy1tNjhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NDkyYjkuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tNjhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLW02OGsuaAotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfTTY4SyAxCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBmaXg7Ci0jZW5kaWYKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNpZmRlZiBPQkpfQU9VVAotI2lmZGVmIFRFX1NVTjMKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtc3Vub3MtYmlnIgotI2VuZGlmCi0jaWZkZWYgVEVfTmV0QlNECi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LW02OGstbmV0YnNkIgotI2VuZGlmCi0jaWZkZWYgVEVfTElOVVgKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtbTY4ay1saW51eCIKLSNlbmRpZgotI2lmbmRlZiBUQVJHRVRfRk9STUFUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LXplcm8tYmlnIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItbTY4ayIKLSNlbmRpZgotCi0jaWZkZWYgVEVfQVBPTExPCi0jZGVmaW5lIENPRkZfTUFHSUMJCUFQT0xMT002OEtNQUdJQwotI2RlZmluZSBDT0ZGX0FPVVRIRFJfTUFHSUMJQVBPTExPX0NPRkZfVkVSU0lPTl9OVU1CRVIKLSN1bmRlZiBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUgotI2VuZGlmCi0KLSNpZmRlZiBURV9MWU5YCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJjb2ZmLW02OGstbHlueCIKLSNlbmRpZgotI2lmZGVmIFRFX0FVWAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiY29mZi1tNjhrLWF1eCIKLSNlbmRpZgotI2lmZGVmIFRFX0RFTFRBCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJjb2ZmLW02OGstc3lzdiIKLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfTUFHSUMKLSNkZWZpbmUgQ09GRl9NQUdJQyBNQzY4TUFHSUMKLSNlbmRpZgotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF9tNjhrIC8qIGZvciBub24tQkZEX0FTU0VNQkxFUiAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9tNjhrIC8qIEJGRF9BU1NFTUJMRVIgKi8KLSNkZWZpbmUgQ09GRl9GTEFHUyBGX0FSMzJXCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgoeCktPmZ4X2FkZHN5fHwoeCktPmZ4X3N1YnN5KQotCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIHRjX2NvZmZfZml4MnJ0eXBlKGZpeFApCi0jZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoZnJhZykgdGNfY29mZl9zaXplbWFjaGRlcChmcmFnKQotZXh0ZXJuIGludCB0Y19jb2ZmX3NpemVtYWNoZGVwIFBBUkFNUyAoKHN0cnVjdCBmcmFnICopKTsKLSNpZmRlZiBURV9TVU4zCi0vKiBUaGlzIHZhcmlhYmxlIGNvbnRhaW5zIHRoZSB2YWx1ZSB0byB3cml0ZSBvdXQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgdGhlIGEub3V0IGZpbGUuICBUaGUgMjw8MTYgbWVhbnMgdGhhdCB0aGlzIGlzIGEgNjgwMjAgZmlsZSBpbnN0ZWFkCi0gICBvZiBhbiBvbGQtc3R5bGUgNjgwMDAgZmlsZSAqLwotCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSAoMjw8MTZ8T01BR0lDKTsJLyogTWFnaWMgYnl0ZSBmb3IgZmlsZSBoZWFkZXIgKi8KLSNlbmRpZiAvKiBURV9TVU4zICovCi0KLSNpZm5kZWYgQU9VVF9NQUNIVFlQRQotI2RlZmluZSBBT1VUX01BQ0hUWVBFIG02OGtfYW91dF9tYWNodHlwZQotZXh0ZXJuIGludCBtNjhrX2FvdXRfbWFjaHR5cGU7Ci0jZW5kaWYKLQotI2RlZmluZSB0Y19jb21tZW50X2NoYXJzIG02OGtfY29tbWVudF9jaGFycwotZXh0ZXJuIGNvbnN0IGNoYXIgKm02OGtfY29tbWVudF9jaGFyczsKLQotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soeCkJezt9CS8qIG5vdCB1c2VkICovCi0KLSNkZWZpbmUgTElTVElOR19XT1JEX1NJWkUgMgkvKiBBIHdvcmQgaXMgMiBieXRlcyAqLwotI2RlZmluZSBMSVNUSU5HX0xIU19XSURUSCAyCS8qIE9uZSB3b3JkIG9uIHRoZSBmaXJzdCBsaW5lICovCi0jZGVmaW5lIExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORCAyCS8qIE9uZSB3b3JkIG9uIHRoZSBzZWNvbmQgbGluZSAqLwotI2RlZmluZSBMSVNUSU5HX0xIU19DT05UX0xJTkVTIDQvKiBBbmQgNCBsaW5lcyBtYXggKi8KLSNkZWZpbmUgTElTVElOR19IRUFERVIgIjY4SyBHQVMgIgotCi0jaWZuZGVmIFJFR0lTVEVSX1BSRUZJWAotI2RlZmluZSBSRUdJU1RFUl9QUkVGSVggJyUnCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIChSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwpCi0jaWYgZGVmaW5lZCAoTTY4S0NPRkYpIHx8IGRlZmluZWQgKE9CSl9FTEYpCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgKG5hbWVbMF0gPT0gJy4nIFwKLQkJCSAgICYmIChuYW1lWzFdID09ICdMJyB8fCBuYW1lWzFdID09ICcuJykpCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0jZGVmaW5lIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCAwCi0jZWxzZSAvKiAhIChDT0ZGIHx8IEVMRikgKi8KLSNkZWZpbmUgUkVHSVNURVJfUFJFRklYX09QVElPTkFMIDEKLSNlbmRpZiAvKiAhIChDT0ZGIHx8IEVMRikgKi8KLSNlbmRpZiAvKiBub3QgZGVmIFJFR0lTVEVSX1BSRUZJWCBhbmQgbm90IGRlZiBPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVggKi8KLQotI2lmZGVmIFRFX0RFTFRBCi0vKiBPbiB0aGUgRGVsdGEsIGAlJyBjYW4gb2NjdXIgd2l0aGluIGEgbGFiZWwgbmFtZSwgYnV0IG5vdCBhcyB0aGUKLSAgIGluaXRpYWwgY2hhcmFjdGVyLiAgKi8KLSNkZWZpbmUgTEVYX1BDVCBMRVhfTkFNRQotLyogT24gdGhlIERlbHRhLCBgficgY2FuIHN0YXJ0IGEgbGFiZWwgbmFtZSwgYnV0IGlzIGNvbnZlcnRlZCB0byAnLicuICovCi0jZGVmaW5lIExFWF9USUxERSBMRVhfQkVHSU5fTkFNRQotI2RlZmluZSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUocykgKCgqKHMpID09ICd+JyA/ICoocykgPSAnLicgOiAnLicpLCBzKQotLyogT24gdGhlIERlbHRhLCBkb3RzIGFyZSBub3QgcmVxdWlyZWQgYmVmb3JlIHBzZXVkby1vcHMuICAqLwotI2RlZmluZSBOT19QU0VVRE9fRE9UCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSN1bmRlZiBMT0NBTF9MQUJFTAotI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSBcCi0gIChuYW1lWzBdID09ICcuJyB8fCAobmFtZVswXSA9PSAnTCcgJiYgbmFtZVsxXSA9PSAnJScpKQotI2VuZGlmCi0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgbTY4a19tcmlfbW9kZV9jaGFuZ2UgUEFSQU1TICgoaW50KSk7Ci0jZGVmaW5lIE1SSV9NT0RFX0NIQU5HRShpKSBtNjhrX21yaV9tb2RlX2NoYW5nZSAoaSkKLQotZXh0ZXJuIGludCBtNjhrX2NvbmRpdGlvbmFsX3BzZXVkb29wIFBBUkFNUyAoKHBzZXVkb190eXBlUyAqKSk7Ci0jZGVmaW5lIHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wKHBvcCkgbTY4a19jb25kaXRpb25hbF9wc2V1ZG9vcCAocG9wKQotCi1leHRlcm4gdm9pZCBtNjhrX2Zyb2JfbGFiZWwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBtNjhrX2Zyb2JfbGFiZWwgKHN5bSkKLQotZXh0ZXJuIHZvaWQgbTY4a19mbHVzaF9wZW5kaW5nX291dHB1dCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KCkgbTY4a19mbHVzaF9wZW5kaW5nX291dHB1dCAoKQotCi1leHRlcm4gdm9pZCBtNjhrX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0jZGVmaW5lIHRjX2Zyb2Jfc3ltYm9sKHN5bSxwdW50KQkJCQlcCi1kbwkJCQkJCQkJXAotICB7CQkJCQkJCQlcCi0gICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gcmVnX3NlY3Rpb24pCQkJXAotICAgICAgcHVudCA9IDE7CQkJCQkJCVwKLSAgICBtNjhrX2Zyb2Jfc3ltYm9sIChzeW0pOwkJCQkJXAotICB9CQkJCQkJCQlcCi13aGlsZSAoMCkKLQotI2RlZmluZSBOT19SRUxPQyBCRkRfUkVMT0NfTk9ORQotCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBUaGlzIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlIGlmIHRoZSByZWxvY2F0aW9uIGlzIGZvciBhIGxvY2FsIG9iamVjdAotICAgZm9yIHdoaWNoIHdlIHN0aWxsIHdhbnQgdG8gZG8gdGhlIHJlbG9jYXRpb24gYXQgcnVudGltZS4gIFRydWUgaWYgd2UKLSAgIGFyZSB3aWxsaW5nIHRvIHBlcmZvcm0gdGhpcyByZWxvY2F0aW9uIHdoaWxlIGJ1aWxkaW5nIHRoZSAubyBmaWxlLiAgSWYKLSAgIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2wsIHRoZW4gdGhlIGFzc2VtYmxlcgotICAgc2hvdWxkIG5ldmVyIGRvIHRoZSByZWxvY2F0aW9uLiAgKi8KLQotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKQkJCVwKLQkoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwJCQlcCi0JIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCVwKLQkgICAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpCQlcCi0JICAgICAmJiBTX0lTX0RFRklORUQgKChGSVgpLT5meF9hZGRzeSkJCVwKLQkgICAgICYmICEgU19JU19DT01NT04gKChGSVgpLT5meF9hZGRzeSkpKQotCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKFgpIHRjX202OGtfZml4X2FkanVzdGFibGUoWCkKLWV4dGVybiBpbnQgdGNfbTY4a19maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLSNkZWZpbmUgZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcgbTY4a19lbGZfZmluYWxfcHJvY2Vzc2luZwotZXh0ZXJuIHZvaWQgbTY4a19lbGZfZmluYWxfcHJvY2Vzc2luZyBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWCkJCQlcCi0JKChGSVgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCVwKLQkgfHwgKEZJWCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotCi0jZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2RlZmluZSB0Y19mcm9iX2NvZmZfc3ltYm9sKHN5bSkgbTY4a19mcm9iX3N5bWJvbCAoc3ltKQotCi0jZGVmaW5lIE5PX1JFTE9DIDAKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jZGVmaW5lIERJRkZfRVhQUl9PSwotCi1leHRlcm4gdm9pZCBtNjhrX2luaXRfYWZ0ZXJfYXJncyBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIHRjX2luaXRfYWZ0ZXJfYXJncyBtNjhrX2luaXRfYWZ0ZXJfYXJncwotCi1leHRlcm4gaW50IG02OGtfcGFyc2VfbG9uZ19vcHRpb24gUEFSQU1TICgoY2hhciAqKSk7Ci0jZGVmaW5lIG1kX3BhcnNlX2xvbmdfb3B0aW9uIG02OGtfcGFyc2VfbG9uZ19vcHRpb24KLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLSNkZWZpbmUgVEFSR0VUX1dPUkRfU0laRSAzMgotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9tNjhrCi0KLWV4dGVybiBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLS8qIENvcGllZCBmcm9tIHdyaXRlLmMgKi8KLS8qIFRoaXMgd2FzIGZvcm1lcmx5IGNhbGxlZCBNNjhLX0FJTV9LTFVER0UuICAqLwotI2RlZmluZSBtZF9wcmVwYXJlX3JlbGF4X3NjYW4oZnJhZ1AsIGFkZHJlc3MsIGFpbSwgdGhpc19zdGF0ZSwgdGhpc190eXBlKSBcCi0gIGlmIChhaW09PTAgJiYgdGhpc19zdGF0ZT09IDQpIHsgLyogaGFyZCBlbmNvZGVkIGZyb20gdGMtbTY4ay5jICovIFwKLSAgICBhaW09dGhpc190eXBlLT5ybHhfZm9yd2FyZCsxOyAvKiBGb3JjZSByZWxheGF0aW9uIGludG8gd29yZCBtb2RlICovIFwKLSAgfQotCi0vKiBlbmQgb2YgdGMtbTY4ay5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW04OGsuYyBiL2dhcy9jb25maWcvdGMtbTg4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzc0NjBhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbTg4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1MiArMCwwIEBACi0vKiBtODhrLmMgLS0gQXNzZW1ibGVyIGZvciB0aGUgTW90b3JvbGEgODgwMDAKLSAgIENvbnRyaWJ1dGVkIGJ5IERldm9uIEJvd2VuIG9mIEJ1ZmZhbG8gVW5pdmVyc2l0eQotICAgYW5kIFRvcmJqb3JuIEdyYW5sdW5kIG9mIHRoZSBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAibTg4ay1vcGNvZGUuaCIKLQotc3RydWN0IGZpZWxkX3ZhbF9hc3NvYwotewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCB2YWw7Ci19OwotCi1zdHJ1Y3QgZmllbGRfdmFsX2Fzc29jIGNyX3JlZ3NbXSA9Ci17Ci0gIHsiUElEIiwgMH0sCi0gIHsiUFNSIiwgMX0sCi0gIHsiRVBTUiIsIDJ9LAotICB7IlNTQlIiLCAzfSwKLSAgeyJTWElQIiwgNH0sCi0gIHsiU05JUCIsIDV9LAotICB7IlNGSVAiLCA2fSwKLSAgeyJWQlIiLCA3fSwKLSAgeyJETVQwIiwgOH0sCi0gIHsiRE1EMCIsIDl9LAotICB7IkRNQTAiLCAxMH0sCi0gIHsiRE1UMSIsIDExfSwKLSAgeyJETUQxIiwgMTJ9LAotICB7IkRNQTEiLCAxM30sCi0gIHsiRE1UMiIsIDE0fSwKLSAgeyJETUQyIiwgMTV9LAotICB7IkRNQTIiLCAxNn0sCi0gIHsiU1IwIiwgMTd9LAotICB7IlNSMSIsIDE4fSwKLSAgeyJTUjIiLCAxOX0sCi0gIHsiU1IzIiwgMjB9LAotCi0gIHtOVUxMLCAwfSwKLX07Ci0KLXN0cnVjdCBmaWVsZF92YWxfYXNzb2MgZmNyX3JlZ3NbXSA9Ci17Ci0gIHsiRlBFQ1IiLCAwfSwKLSAgeyJGUEhTMSIsIDF9LAotICB7IkZQTFMxIiwgMn0sCi0gIHsiRlBIUzIiLCAzfSwKLSAgeyJGUExTMiIsIDR9LAotICB7IkZQUFQiLCA1fSwKLSAgeyJGUFJIIiwgNn0sCi0gIHsiRlBSTCIsIDd9LAotICB7IkZQSVQiLCA4fSwKLQotICB7IkZQU1IiLCA2Mn0sCi0gIHsiRlBDUiIsIDYzfSwKLQotICB7TlVMTCwgMH0sCi19OwotCi1zdHJ1Y3QgZmllbGRfdmFsX2Fzc29jIGNtcHNsb3RbXSA9Ci17Ci0vKiBJbnRlZ2VyCUZsb2F0aW5nIHBvaW50ICovCi0gIHsibmMiLCAwfSwKLSAgeyJjcCIsIDF9LAotICB7ImVxIiwgMn0sCi0gIHsibmUiLCAzfSwKLSAgeyJndCIsIDR9LAotICB7ImxlIiwgNX0sCi0gIHsibHQiLCA2fSwKLSAgeyJnZSIsIDd9LAotICB7ImhpIiwgOH0sCXsib3UiLCA4fSwKLSAgeyJscyIsIDl9LAl7ImliIiwgOX0sCi0gIHsibG8iLCAxMH0sCXsiaW4iLCAxMH0sCi0gIHsiaHMiLCAxMX0sCXsib2IiLCAxMX0sCi0gIHsiYmUiLCAxMn0sCXsidWUiLCAxMn0sCi0gIHsibmIiLCAxM30sCXsibGciLCAxM30sCi0gIHsiaGUiLCAxNH0sCXsidWciLCAxNH0sCi0gIHsibmgiLCAxNX0sCXsidWxlIiwgMTV9LAotCQl7InVsIiwgMTZ9LAotCQl7InVnZSIsIDE3fSwKLQotICB7TlVMTCwgMH0sCi19OwotCi1zdHJ1Y3QgZmllbGRfdmFsX2Fzc29jIGNuZG1za1tdID0KLXsKLSAgeyJndDAiLCAxfSwKLSAgeyJlcTAiLCAyfSwKLSAgeyJnZTAiLCAzfSwKLSAgeyJsdDAiLCAxMn0sCi0gIHsibmUwIiwgMTN9LAotICB7ImxlMCIsIDE0fSwKLQotICB7TlVMTCwgMH0sCi19OwotCi1zdHJ1Y3QgbTg4a19pbnNuCi17Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICBleHByZXNzaW9uUyBleHA7Ci0gIGVudW0gcmVsb2NfdHlwZSByZWxvYzsKLX07Ci0KLXN0YXRpYyBjaGFyICpnZXRfYmYgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICp2YWxwKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X2NtcCBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnZhbHApKTsKLXN0YXRpYyBjaGFyICpnZXRfY25kIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqdmFscCkpOwotc3RhdGljIGNoYXIgKmdldF9jciBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnJlZ25vcCkpOwotc3RhdGljIGNoYXIgKmdldF9mY3IgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICpyZWdub3ApKTsKLXN0YXRpYyBjaGFyICpnZXRfaW1tMTYgUEFSQU1TICgoY2hhciAqcGFyYW0sIHN0cnVjdCBtODhrX2luc24gKmluc24pKTsKLXN0YXRpYyBjaGFyICpnZXRfbzYgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICp2YWxwKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X3JlZyBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnJlZ25vcCwgaW50IHJlZ19wcmVmaXgpKTsKLXN0YXRpYyBjaGFyICpnZXRfdmVjOSBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnZhbHApKTsKLXN0YXRpYyBjaGFyICpnZXR2YWwgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkIGludCAqdmFscCkpOwotCi1zdGF0aWMgY2hhciAqZ2V0X3BjciBQQVJBTVMgKChjaGFyICpwYXJhbSwgc3RydWN0IG04OGtfaW5zbiAqaW5zbiwKLQkJICAgICAgZW51bSByZWxvY190eXBlIHJlbG9jKSk7Ci0KLXN0YXRpYyBpbnQgY2FsY29wIFBBUkFNUyAoKHN0cnVjdCBtODhrX29wY29kZSAqZm9ybWF0LAotCQkJICAgY2hhciAqcGFyYW0sIHN0cnVjdCBtODhrX2luc24gKmluc24pKTsKLQotCi1leHRlcm4gY2hhciAqbXluYW1lOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2ggPSBOVUxMOwotCi0vKiBUaGVzZSBiaXRzIHNob3VsZCBiZSB0dXJuZWQgb2ZmIGluIHRoZSBmaXJzdCBhZGRyZXNzIG9mIGV2ZXJ5IHNlZ21lbnQgKi8KLWludCBtZF9zZWdfYWxpZ24gPSA3OwotCi0vKiBUaGVzZSBjaGFycyBzdGFydCBhIGNvbW1lbnQgYW55d2hlcmUgaW4gYSBzb3VyY2UgZmlsZSAoZXhjZXB0IGluc2lkZQotICAgYW5vdGhlciBjb21tZW50ICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICI7IjsKLQotLyogVGhlc2UgY2hhcnMgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogYXMgaW4gMGYxMjMuNDU2ICovCi0vKiBvciAgICAwSDEuMjM0RS0xMiAoc2VlIGV4cCBjaGFycyBhYm92ZSkgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZERmRiI7Ci0KLWV4dGVybiB2b2lkIGZsb2F0X2NvbnMgKCksIGNvbnMgKCksIHNfZ2xvYmwgKCksIHNfc3BhY2UgKCksCi0gIHNfc2V0ICgpLCBzX2xjb21tICgpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImFsaWduIiwgc19hbGlnbl9ieXRlcywgNH0sCi0gIHsiZGVmIiwgc19zZXQsIDB9LAotICB7ImRmbG9hdCIsIGZsb2F0X2NvbnMsICdkJ30sCi0gIHsiZmZsb2F0IiwgZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJnbG9iYWwiLCBzX2dsb2JsLCAwfSwKLSAgeyJoYWxmIiwgY29ucywgMn0sCi0gIHsiYnNzIiwgc19sY29tbSwgMX0sCi0gIHsic3RyaW5nIiwgc3RyaW5nZXIsIDB9LAotICB7IndvcmQiLCBjb25zLCA0fSwKLSAgLyogRm9yY2Ugc2V0IHRvIGJlIHRyZWF0ZWQgYXMgYW4gaW5zdHJ1Y3Rpb24uICAqLwotICB7InNldCIsIE5VTEwsIDB9LAotICB7Ii5zZXQiLCBzX3NldCwgMH0sCi0gIHswfQotfTsKLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqcmV0dmFsID0gTlVMTDsKLSAgdW5zaWduZWQgaW50IGkgPSAwOwotCi0gIC8qIGluaXRpYWxpemUgaGFzaCB0YWJsZSAqLwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICAvKiBsb29wIHVudGlsIHlvdSBzZWUgdGhlIGVuZCBvZiB0aGUgbGlzdCAqLwotCi0gIHdoaWxlICgqbTg4a19vcGNvZGVzW2ldLm5hbWUpCi0gICAgewotICAgICAgY2hhciAqbmFtZSA9IG04OGtfb3Bjb2Rlc1tpXS5uYW1lOwotCi0gICAgICAvKiBoYXNoIGVhY2ggbW5lbW9uaWMgYW5kIHJlY29yZCBpdHMgcG9zaXRpb24gKi8KLQotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hbWUsICZtODhrX29wY29kZXNbaV0pOwotCi0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JYXNfZmF0YWwgKF8oIkNhbid0IGhhc2ggaW5zdHJ1Y3Rpb24gJyVzJzolcyIpLAotCQkgIG04OGtfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotCi0gICAgICAvKiBza2lwIHRvIG5leHQgdW5pcXVlIG1uZW1vbmljIG9yIGVuZCBvZiBsaXN0ICovCi0KLSAgICAgIGZvciAoaSsrOyAhc3RyY21wIChtODhrX29wY29kZXNbaV0ubmFtZSwgbmFtZSk7IGkrKykKLQk7Ci0gICAgfQotfQotDAotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLX0KLQwKLXZvaWQKLW1kX2Fzc2VtYmxlIChvcCkKLSAgICAgY2hhciAqb3A7Ci17Ci0gIGNoYXIgKnBhcmFtLCAqdGhpc2ZyYWc7Ci0gIGNoYXIgYzsKLSAgc3RydWN0IG04OGtfb3Bjb2RlICpmb3JtYXQ7Ci0gIHN0cnVjdCBtODhrX2luc24gaW5zbjsKLQotICBhc3NlcnQgKG9wKTsKLQotICAvKiBza2lwIG92ZXIgaW5zdHJ1Y3Rpb24gdG8gZmluZCBwYXJhbWV0ZXJzICovCi0KLSAgZm9yIChwYXJhbSA9IG9wOyAqcGFyYW0gIT0gMCAmJiAhaXNzcGFjZSAoKnBhcmFtKTsgcGFyYW0rKykKLSAgICA7Ci0gIGMgPSAqcGFyYW07Ci0gICpwYXJhbSsrID0gJ1wwJzsKLQotICAvKiB0cnkgdG8gZmluZCB0aGUgaW5zdHJ1Y3Rpb24gaW4gdGhlIGhhc2ggdGFibGUgKi8KLQotICBpZiAoKGZvcm1hdCA9IChzdHJ1Y3QgbTg4a19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBvcCkpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIG1uZW1vbmljICclcyciKSwgb3ApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiB0cnkgcGFyc2luZyB0aGlzIGluc3RydWN0aW9uIGludG8gaW5zbiAqLwotCi0gIGluc24uZXhwLlhfYWRkX3N5bWJvbCA9IDA7Ci0gIGluc24uZXhwLlhfb3Bfc3ltYm9sID0gMDsKLSAgaW5zbi5leHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgaW5zbi5leHAuWF9vcCA9IE9faWxsZWdhbDsKLSAgaW5zbi5yZWxvYyA9IE5PX1JFTE9DOwotCi0gIHdoaWxlICghY2FsY29wIChmb3JtYXQsIHBhcmFtLCAmaW5zbikpCi0gICAgewotICAgICAgLyogaWYgaXQgZG9lc24ndCBwYXJzZSB0cnkgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gKi8KLQotICAgICAgaWYgKCFzdHJjbXAgKGZvcm1hdFswXS5uYW1lLCBmb3JtYXRbMV0ubmFtZSkpCi0JZm9ybWF0Kys7Ci0gICAgICBlbHNlCi0JewotCSAgYXNfZmF0YWwgKF8oIlBhcmFtZXRlciBzeW50YXggZXJyb3IiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBncm93IHRoZSBjdXJyZW50IGZyYWcgYW5kIHBsb3AgaW4gdGhlIG9wY29kZSAqLwotCi0gIHRoaXNmcmFnID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0aGlzZnJhZywgaW5zbi5vcGNvZGUsIDQpOwotCi0gIC8qIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgbGFiZWxzIG1hcmsgaXQgZm9yIGxhdGVyICovCi0KLSAgc3dpdGNoIChpbnNuLnJlbG9jKQotICAgIHsKLSAgICBjYXNlIE5PX1JFTE9DOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0xPMTY6Ci0gICAgY2FzZSBSRUxPQ19ISTE2OgotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICB0aGlzZnJhZyAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgMiwKLQkJICAgMiwKLQkJICAgJmluc24uZXhwLAotCQkgICAwLAotCQkgICBpbnNuLnJlbG9jKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19JVzE2OgotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICB0aGlzZnJhZyAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgICA0LAotCQkgICAmaW5zbi5leHAsCi0JCSAgIDAsCi0JCSAgIGluc24ucmVsb2MpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1BDMTY6Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgIHRoaXNmcmFnIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyAyLAotCQkgICAyLAotCQkgICAmaW5zbi5leHAsCi0JCSAgIDEsCi0JCSAgIGluc24ucmVsb2MpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1BDMjY6Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgIHRoaXNmcmFnIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCSAgIDQsCi0JCSAgICZpbnNuLmV4cCwKLQkJICAgMSwKLQkJICAgaW5zbi5yZWxvYyk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiVW5rbm93biByZWxvY2F0aW9uIHR5cGUiKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWNhbGNvcCAoZm9ybWF0LCBwYXJhbSwgaW5zbikKLSAgICAgc3RydWN0IG04OGtfb3Bjb2RlICpmb3JtYXQ7Ci0gICAgIGNoYXIgKnBhcmFtOwotICAgICBzdHJ1Y3QgbTg4a19pbnNuICppbnNuOwotewotICBjaGFyICpmbXQgPSBmb3JtYXQtPm9wX3NwZWM7Ci0gIGludCBmOwotICB1bnNpZ25lZCB2YWw7Ci0gIHVuc2lnbmVkIG9wY29kZTsKLSAgaW50IHJlZ19wcmVmaXggPSAncic7Ci0KLSAgaW5zbi0+b3Bjb2RlID0gZm9ybWF0LT5vcGNvZGU7Ci0gIG9wY29kZSA9IDA7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBpZiAocGFyYW0gPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGYgPSAqZm10Kys7Ci0gICAgICBzd2l0Y2ggKGYpCi0JewotCWNhc2UgMDoKLQkgIGluc24tPm9wY29kZSB8PSBvcGNvZGU7Ci0JICByZXR1cm4gKCpwYXJhbSA9PSAwIHx8ICpwYXJhbSA9PSAnXG4nKTsKLQotCWRlZmF1bHQ6Ci0JICBpZiAoZiAhPSAqcGFyYW0rKykKLQkgICAgcmV0dXJuIDA7Ci0JICBicmVhazsKLQotCWNhc2UgJ2QnOgotCSAgcGFyYW0gPSBnZXRfcmVnIChwYXJhbSwgJnZhbCwgcmVnX3ByZWZpeCk7Ci0JICByZWdfcHJlZml4ID0gJ3InOwotCSAgb3Bjb2RlIHw9IHZhbCA8PCAyMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnbyc6Ci0JICBwYXJhbSA9IGdldF9vNiAocGFyYW0sICZ2YWwpOwotCSAgb3Bjb2RlIHw9ICgodmFsID4+IDIpIDw8IDcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICd4JzoKLQkgIHJlZ19wcmVmaXggPSAneCc7Ci0JICBicmVhazsKLQotCWNhc2UgJzEnOgotCSAgcGFyYW0gPSBnZXRfcmVnIChwYXJhbSwgJnZhbCwgcmVnX3ByZWZpeCk7Ci0JICByZWdfcHJlZml4ID0gJ3InOwotCSAgb3Bjb2RlIHw9IHZhbCA8PCAxNjsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMic6Ci0JICBwYXJhbSA9IGdldF9yZWcgKHBhcmFtLCAmdmFsLCByZWdfcHJlZml4KTsKLQkgIHJlZ19wcmVmaXggPSAncic7Ci0JICBvcGNvZGUgfD0gdmFsOwotCSAgYnJlYWs7Ci0KLQljYXNlICczJzoKLQkgIHBhcmFtID0gZ2V0X3JlZyAocGFyYW0sICZ2YWwsICdyJyk7Ci0JICBvcGNvZGUgfD0gKHZhbCA8PCAxNikgfCB2YWw7Ci0JICBicmVhazsKLQotCWNhc2UgJ0knOgotCSAgcGFyYW0gPSBnZXRfaW1tMTYgKHBhcmFtLCBpbnNuKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYic6Ci0JICBwYXJhbSA9IGdldF9iZiAocGFyYW0sICZ2YWwpOwotCSAgb3Bjb2RlIHw9IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSAncCc6Ci0JICBwYXJhbSA9IGdldF9wY3IgKHBhcmFtLCBpbnNuLCBSRUxPQ19QQzE2KTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUCc6Ci0JICBwYXJhbSA9IGdldF9wY3IgKHBhcmFtLCBpbnNuLCBSRUxPQ19QQzI2KTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnQic6Ci0JICBwYXJhbSA9IGdldF9jbXAgKHBhcmFtLCAmdmFsKTsKLQkgIG9wY29kZSB8PSB2YWw7Ci0JICBicmVhazsKLQotCWNhc2UgJ00nOgotCSAgcGFyYW0gPSBnZXRfY25kIChwYXJhbSwgJnZhbCk7Ci0JICBvcGNvZGUgfD0gdmFsOwotCSAgYnJlYWs7Ci0KLQljYXNlICdjJzoKLQkgIHBhcmFtID0gZ2V0X2NyIChwYXJhbSwgJnZhbCk7Ci0JICBvcGNvZGUgfD0gdmFsIDw8IDU7Ci0JICBicmVhazsKLQotCWNhc2UgJ2YnOgotCSAgcGFyYW0gPSBnZXRfZmNyIChwYXJhbSwgJnZhbCk7Ci0JICBvcGNvZGUgfD0gdmFsIDw8IDU7Ci0JICBicmVhazsKLQotCWNhc2UgJ1YnOgotCSAgcGFyYW0gPSBnZXRfdmVjOSAocGFyYW0sICZ2YWwpOwotCSAgb3Bjb2RlIHw9IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnPyc6Ci0JICAvKiBIYXZpbmcgdGhpcyBoZXJlIHJlcGVhdHMgdGhlIHdhcm5pbmcgc29tdGltZXMuCi0JICAgQnV0IGNhbid0IHdlIHN0YW5kIHRoYXQ/ICAqLwotCSAgYXNfd2FybiAoXygiVXNlIG9mIG9ic29sZXRlIGluc3RydWN0aW9uIikpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotbWF0Y2hfbmFtZSAocGFyYW0sIGFzc29jX3RhYiwgdmFscCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHN0cnVjdCBmaWVsZF92YWxfYXNzb2MgKmFzc29jX3RhYjsKLSAgICAgdW5zaWduZWQgKnZhbHA7Ci17Ci0gIGludCBpOwotICBjaGFyICpuYW1lOwotICBpbnQgbmFtZV9sZW47Ci0KLSAgZm9yIChpID0gMDs7IGkrKykKLSAgICB7Ci0gICAgICBuYW1lID0gYXNzb2NfdGFiW2ldLm5hbWU7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgICAgbmFtZV9sZW4gPSBzdHJsZW4gKG5hbWUpOwotICAgICAgaWYgKCFzdHJuY21wIChwYXJhbSwgbmFtZSwgbmFtZV9sZW4pKQotCXsKLQkgICp2YWxwID0gYXNzb2NfdGFiW2ldLnZhbDsKLQkgIHJldHVybiBwYXJhbSArIG5hbWVfbGVuOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9yZWcgKHBhcmFtLCByZWdub3AsIHJlZ19wcmVmaXgpCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCAqcmVnbm9wOwotICAgICBpbnQgcmVnX3ByZWZpeDsKLXsKLSAgdW5zaWduZWQgYzsKLSAgdW5zaWduZWQgcmVnbm87Ci0KLSAgYyA9ICpwYXJhbSsrOwotICBpZiAoYyA9PSByZWdfcHJlZml4KQotICAgIHsKLSAgICAgIHJlZ25vID0gKnBhcmFtKysgLSAnMCc7Ci0gICAgICBpZiAocmVnbm8gPCAxMCkKLQl7Ci0JICBpZiAocmVnbm8gPT0gMCkKLQkgICAgewotCSAgICAgICpyZWdub3AgPSAwOwotCSAgICAgIHJldHVybiBwYXJhbTsKLQkgICAgfQotCSAgYyA9ICpwYXJhbSAtICcwJzsKLQkgIGlmIChjIDwgMTApCi0JICAgIHsKLQkgICAgICByZWdubyA9IHJlZ25vICogMTAgKyBjOwotCSAgICAgIGlmIChjIDwgMzIpCi0JCXsKLQkJICAqcmVnbm9wID0gcmVnbm87Ci0JCSAgcmV0dXJuIHBhcmFtICsgMTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqcmVnbm9wID0gcmVnbm87Ci0JICAgICAgcmV0dXJuIHBhcmFtOwotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIGlmIChjID09ICdzJyAmJiBwYXJhbVswXSA9PSAncCcpCi0gICAgewotICAgICAgKnJlZ25vcCA9IDMxOwotICAgICAgcmV0dXJuIHBhcmFtICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9pbW0xNiAocGFyYW0sIGluc24pCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICBzdHJ1Y3QgbTg4a19pbnNuICppbnNuOwotewotICBlbnVtIHJlbG9jX3R5cGUgcmVsb2MgPSBOT19SRUxPQzsKLSAgdW5zaWduZWQgaW50IHZhbDsKLSAgY2hhciAqc2F2ZV9wdHI7Ci0KLSAgaWYgKCFzdHJuY21wIChwYXJhbSwgImhpMTYiLCA0KSAmJiAhaXNhbG51bSAocGFyYW1bNF0pKQotICAgIHsKLSAgICAgIHJlbG9jID0gUkVMT0NfSEkxNjsKLSAgICAgIHBhcmFtICs9IDQ7Ci0gICAgfQotICBlbHNlIGlmICghc3RybmNtcCAocGFyYW0sICJsbzE2IiwgNCkgJiYgIWlzYWxudW0gKHBhcmFtWzRdKSkKLSAgICB7Ci0gICAgICByZWxvYyA9IFJFTE9DX0xPMTY7Ci0gICAgICBwYXJhbSArPSA0OwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cm5jbXAgKHBhcmFtLCAiaXcxNiIsIDQpICYmICFpc2FsbnVtIChwYXJhbVs0XSkpCi0gICAgewotICAgICAgcmVsb2MgPSBSRUxPQ19JVzE2OwotICAgICAgcGFyYW0gKz0gNDsKLSAgICB9Ci0KLSAgc2F2ZV9wdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOwotICBleHByZXNzaW9uICgmaW5zbi0+ZXhwKTsKLSAgcGFyYW0gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOwotCi0gIHZhbCA9IGluc24tPmV4cC5YX2FkZF9udW1iZXI7Ci0KLSAgaWYgKGluc24tPmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgLyogSW5zZXJ0IHRoZSB2YWx1ZSBub3csIGFuZCByZXNldCByZWxvYyB0byBOT19SRUxPQy4gICovCi0gICAgICBpZiAocmVsb2MgPT0gTk9fUkVMT0MpCi0JewotCSAgLyogV2FybiBhYm91dCB0b28gYmlnIGV4cHJlc3Npb25zIGlmIG5vdCBzdXJyb3VuZGVkIGJ5IHh4MTYuICAqLwotCSAgaWYgKHZhbCA+IDB4ZmZmZikKLQkgICAgYXNfd2FybiAoXygiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gMTYgYml0cyIpKTsKLQl9Ci0KLSAgICAgIGlmIChyZWxvYyA9PSBSRUxPQ19ISTE2KQotCXZhbCA+Pj0gMTY7Ci0KLSAgICAgIGluc24tPm9wY29kZSB8PSB2YWwgJiAweGZmZmY7Ci0gICAgICByZWxvYyA9IE5PX1JFTE9DOwotICAgIH0KLSAgZWxzZSBpZiAocmVsb2MgPT0gTk9fUkVMT0MpCi0gICAgLyogV2UgYWNjZXB0IGEgc3ltYm9sIGV2ZW4gd2l0aG91dCBsbzE2LCBoaTE2LCBldGMsIGFuZCBhc3N1bWUKLSAgICAgICBsbzE2IHdhcyBpbnRlbmRlZC4gICovCi0gICAgcmVsb2MgPSBSRUxPQ19MTzE2OwotCi0gIGluc24tPnJlbG9jID0gcmVsb2M7Ci0KLSAgcmV0dXJuIHBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfcGNyIChwYXJhbSwgaW5zbiwgcmVsb2MpCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICBzdHJ1Y3QgbTg4a19pbnNuICppbnNuOwotICAgICBlbnVtIHJlbG9jX3R5cGUgcmVsb2M7Ci17Ci0gIGNoYXIgKnNhdmVwdHIsICpzYXZlcGFyYW07Ci0KLSAgc2F2ZXB0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyYW07Ci0KLSAgZXhwcmVzc2lvbiAoJmluc24tPmV4cCk7Ci0KLSAgc2F2ZXBhcmFtID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlcHRyOwotCi0gIC8qIEJvdGNoOiBXZSBzaG91bGQgcmVsb2NhdGUgbm93IGlmIE9fY29uc3RhbnQuICAqLwotICBpbnNuLT5yZWxvYyA9IHJlbG9jOwotCi0gIHJldHVybiBzYXZlcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9jbXAgKHBhcmFtLCB2YWxwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnZhbHA7Ci17Ci0gIHVuc2lnbmVkIGludCB2YWw7Ci0gIGNoYXIgKnNhdmVfcHRyOwotCi0gIHNhdmVfcHRyID0gcGFyYW07Ci0KLSAgcGFyYW0gPSBtYXRjaF9uYW1lIChwYXJhbSwgY21wc2xvdCwgdmFscCk7Ci0gIHZhbCA9ICp2YWxwOwotCi0gIGlmIChwYXJhbSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHBhcmFtID0gc2F2ZV9wdHI7Ci0KLSAgICAgIHNhdmVfcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyYW07Ci0gICAgICB2YWwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIHBhcmFtID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9wdHI7Ci0KLSAgICAgIGlmICh2YWwgPj0gMzIpCi0JewotCSAgYXNfd2FybiAoXygiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gNSBiaXRzIikpOwotCSAgdmFsICU9IDMyOwotCX0KLSAgICB9Ci0KLSAgKnZhbHAgPSB2YWwgPDwgMjE7Ci0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2NuZCAocGFyYW0sIHZhbHApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCAqdmFscDsKLXsKLSAgdW5zaWduZWQgaW50IHZhbDsKLQotICBpZiAoaXNkaWdpdCAoKnBhcmFtKSkKLSAgICB7Ci0gICAgICBwYXJhbSA9IGdldHZhbCAocGFyYW0sICZ2YWwpOwotCi0gICAgICBpZiAodmFsID49IDMyKQotCXsKLQkgIGFzX3dhcm4gKF8oIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDUgYml0cyIpKTsKLQkgIHZhbCAlPSAzMjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGlzdXBwZXIgKCpwYXJhbSkpCi0JKnBhcmFtID0gdG9sb3dlciAoKnBhcmFtKTsKLQotICAgICAgaWYgKGlzdXBwZXIgKHBhcmFtWzFdKSkKLQlwYXJhbVsxXSA9IHRvbG93ZXIgKHBhcmFtWzFdKTsKLQotICAgICAgcGFyYW0gPSBtYXRjaF9uYW1lIChwYXJhbSwgY25kbXNrLCB2YWxwKTsKLQotICAgICAgaWYgKHBhcmFtID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIHZhbCA9ICp2YWxwOwotICAgIH0KLQotICAqdmFscCA9IHZhbCA8PCAyMTsKLSAgcmV0dXJuIHBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfYmYyIChwYXJhbSwgYmMpCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICBpbnQgYmM7Ci17Ci0gIGludCBkZXB0aCA9IDA7Ci0gIGludCBjOwotCi0gIGZvciAoOzspCi0gICAgewotICAgICAgYyA9ICpwYXJhbTsKLSAgICAgIGlmIChjID09IDApCi0JcmV0dXJuIHBhcmFtOwotICAgICAgZWxzZSBpZiAoYyA9PSAnKCcpCi0JZGVwdGgrKzsKLSAgICAgIGVsc2UgaWYgKGMgPT0gJyknKQotCWRlcHRoLS07Ci0gICAgICBlbHNlIGlmIChjID09IGJjICYmIGRlcHRoIDw9IDApCi0JcmV0dXJuIHBhcmFtOwotICAgICAgcGFyYW0rKzsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9iZl9vZmZzZXRfZXhwcmVzc2lvbiAocGFyYW0sIG9mZnNldHApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCAqb2Zmc2V0cDsKLXsKLSAgdW5zaWduZWQgb2Zmc2V0OwotCi0gIGlmIChpc2FscGhhIChwYXJhbVswXSkpCi0gICAgewotICAgICAgaWYgKGlzdXBwZXIgKHBhcmFtWzBdKSkKLQlwYXJhbVswXSA9IHRvbG93ZXIgKHBhcmFtWzBdKTsKLSAgICAgIGlmIChpc3VwcGVyIChwYXJhbVsxXSkpCi0JcGFyYW1bMV0gPSB0b2xvd2VyIChwYXJhbVsxXSk7Ci0KLSAgICAgIHBhcmFtID0gbWF0Y2hfbmFtZSAocGFyYW0sIGNtcHNsb3QsIG9mZnNldHApOwotCi0gICAgICByZXR1cm4gcGFyYW07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyYW07Ci0gICAgICBvZmZzZXQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIHBhcmFtID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICAqb2Zmc2V0cCA9IG9mZnNldDsKLSAgcmV0dXJuIHBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfYmYgKHBhcmFtLCB2YWxwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnZhbHA7Ci17Ci0gIHVuc2lnbmVkIG9mZnNldCA9IDA7Ci0gIHVuc2lnbmVkIHdpZHRoID0gMDsKLSAgY2hhciAqeHA7Ci0gIGNoYXIgKnNhdmVfcHRyOwotCi0gIHhwID0gZ2V0X2JmMiAocGFyYW0sICc8Jyk7Ci0KLSAgc2F2ZV9wdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOwotICBpZiAoKnhwID09IDApCi0gICAgewotICAgICAgLyogV2UgZGlkIG5vdCBmaW5kICc8Jy4gIFdlIGhhdmUgYW4gb2Zmc2V0ICh3aWR0aCBpbXBsaWNpdGx5IDMyKS4gICovCi0gICAgICBwYXJhbSA9IGdldF9iZl9vZmZzZXRfZXhwcmVzc2lvbiAocGFyYW0sICZvZmZzZXQpOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9wdHI7Ci0gICAgICBpZiAocGFyYW0gPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqeHArKyA9IDA7CQkvKiBPdmVyd3JpdGUgdGhlICc8JyAqLwotICAgICAgcGFyYW0gPSBnZXRfYmYyICh4cCwgJz4nKTsKLSAgICAgIGlmICgqcGFyYW0gPT0gMCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgICpwYXJhbSsrID0gMDsJCS8qIE92ZXJ3cml0ZSB0aGUgJz4nICovCi0KLSAgICAgIHdpZHRoID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICB4cCA9IGdldF9iZl9vZmZzZXRfZXhwcmVzc2lvbiAoeHAsICZvZmZzZXQpOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9wdHI7Ci0KLSAgICAgIGlmICh4cCArIDEgIT0gcGFyYW0pCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICp2YWxwID0gKCh3aWR0aCAlIDMyKSA8PCA1KSB8IChvZmZzZXQgJSAzMik7Ci0KLSAgcmV0dXJuIHBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfY3IgKHBhcmFtLCByZWdub3ApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCAqcmVnbm9wOwotewotICB1bnNpZ25lZCByZWdubzsKLSAgdW5zaWduZWQgYzsKLQotICBpZiAoIXN0cm5jbXAgKHBhcmFtLCAiY3IiLCAyKSkKLSAgICB7Ci0gICAgICBwYXJhbSArPSAyOwotCi0gICAgICByZWdubyA9ICpwYXJhbSsrIC0gJzAnOwotICAgICAgaWYgKHJlZ25vIDwgMTApCi0JewotCSAgaWYgKHJlZ25vID09IDApCi0JICAgIHsKLQkgICAgICAqcmVnbm9wID0gMDsKLQkgICAgICByZXR1cm4gcGFyYW07Ci0JICAgIH0KLQkgIGMgPSAqcGFyYW0gLSAnMCc7Ci0JICBpZiAoYyA8IDEwKQotCSAgICB7Ci0JICAgICAgcmVnbm8gPSByZWdubyAqIDEwICsgYzsKLQkgICAgICBpZiAoYyA8IDY0KQotCQl7Ci0JCSAgKnJlZ25vcCA9IHJlZ25vOwotCQkgIHJldHVybiBwYXJhbSArIDE7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKnJlZ25vcCA9IHJlZ25vOwotCSAgICAgIHJldHVybiBwYXJhbTsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBwYXJhbSA9IG1hdGNoX25hbWUgKHBhcmFtLCBjcl9yZWdzLCByZWdub3ApOwotCi0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2ZjciAocGFyYW0sIHJlZ25vcCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICpyZWdub3A7Ci17Ci0gIHVuc2lnbmVkIHJlZ25vOwotICB1bnNpZ25lZCBjOwotCi0gIGlmICghc3RybmNtcCAocGFyYW0sICJmY3IiLCAzKSkKLSAgICB7Ci0gICAgICBwYXJhbSArPSAzOwotCi0gICAgICByZWdubyA9ICpwYXJhbSsrIC0gJzAnOwotICAgICAgaWYgKHJlZ25vIDwgMTApCi0JewotCSAgaWYgKHJlZ25vID09IDApCi0JICAgIHsKLQkgICAgICAqcmVnbm9wID0gMDsKLQkgICAgICByZXR1cm4gcGFyYW07Ci0JICAgIH0KLQkgIGMgPSAqcGFyYW0gLSAnMCc7Ci0JICBpZiAoYyA8IDEwKQotCSAgICB7Ci0JICAgICAgcmVnbm8gPSByZWdubyAqIDEwICsgYzsKLQkgICAgICBpZiAoYyA8IDY0KQotCQl7Ci0JCSAgKnJlZ25vcCA9IHJlZ25vOwotCQkgIHJldHVybiBwYXJhbSArIDE7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKnJlZ25vcCA9IHJlZ25vOwotCSAgICAgIHJldHVybiBwYXJhbTsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBwYXJhbSA9IG1hdGNoX25hbWUgKHBhcmFtLCBmY3JfcmVncywgcmVnbm9wKTsKLQotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF92ZWM5IChwYXJhbSwgdmFscCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICp2YWxwOwotewotICB1bnNpZ25lZCB2YWw7Ci0gIGNoYXIgKnNhdmVfcHRyOwotCi0gIHNhdmVfcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKLSAgdmFsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHBhcmFtID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3B0cjsKLQotICBpZiAodmFsID49IDEgPDwgOSkKLSAgICBhc193YXJuIChfKCJFeHByZXNzaW9uIHRydW5jYXRlZCB0byA5IGJpdHMiKSk7Ci0KLSAgKnZhbHAgPSB2YWwgJSAoMSA8PCA5KTsKLQotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9vNiAocGFyYW0sIHZhbHApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCAqdmFscDsKLXsKLSAgdW5zaWduZWQgdmFsOwotICBjaGFyICpzYXZlX3B0cjsKLQotICBzYXZlX3B0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyYW07Ci0gIHZhbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9wdHI7Ci0KLSAgaWYgKHZhbCAmIDB4MykKLSAgICBhc193YXJuIChfKCJSZW1vdmVkIGxvd2VyIDIgYml0cyBvZiBleHByZXNzaW9uIikpOwotCi0gICp2YWxwID0gdmFsOwotCi0gIHJldHVybihwYXJhbSk7Ci19Ci0KLSNkZWZpbmUgaGV4dmFsKHopIFwKLSAgKGlzZGlnaXQgKHopID8gKHopIC0gJzAnIDoJCQkJCQlcCi0gICBpc2xvd2VyICh6KSA/ICh6KSAtICdhJyArIDEwIDogCQkJCQlcCi0gICBpc3VwcGVyICh6KSA/ICh6KSAtICdBJyArIDEwIDogLTEpCi0KLXN0YXRpYyBjaGFyICoKLWdldHZhbCAocGFyYW0sIHZhbHApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCBpbnQgKnZhbHA7Ci17Ci0gIHVuc2lnbmVkIGludCB2YWwgPSAwOwotICB1bnNpZ25lZCBpbnQgYzsKLQotICBjID0gKnBhcmFtKys7Ci0gIGlmIChjID09ICcwJykKLSAgICB7Ci0gICAgICBjID0gKnBhcmFtKys7Ci0gICAgICBpZiAoYyA9PSAneCcgfHwgYyA9PSAnWCcpCi0JewotCSAgYyA9ICpwYXJhbSsrOwotCSAgYyA9IGhleHZhbCAoYyk7Ci0JICB3aGlsZSAoYyA8IDE2KQotCSAgICB7Ci0JICAgICAgdmFsID0gdmFsICogMTYgKyBjOwotCSAgICAgIGMgPSAqcGFyYW0rKzsKLQkgICAgICBjID0gaGV4dmFsIChjKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjIC09ICcwJzsKLQkgIHdoaWxlIChjIDwgOCkKLQkgICAgewotCSAgICAgIHZhbCA9IHZhbCAqIDggKyBjOwotCSAgICAgIGMgPSAqcGFyYW0rKyAtICcwJzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjIC09ICcwJzsKLSAgICAgIHdoaWxlIChjIDwgMTApCi0JewotCSAgdmFsID0gdmFsICogMTAgKyBjOwotCSAgYyA9ICpwYXJhbSsrIC0gJzAnOwotCX0KLSAgICB9Ci0KLSAgKnZhbHAgPSB2YWw7Ci0gIHJldHVybiBwYXJhbSAtIDE7Ci19Ci0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG5ieXRlcykKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbmJ5dGVzOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbmJ5dGVzKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyByb3V0aW5lIGlzIG5ldmVyIGNhbGxlZC4gIFdoYXQgaXMgaXQgZm9yPwotICAgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQgMTMgSnVsIDE5OTMgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2ltbSAoYnVmLCB2YWwsIG5ieXRlcywgZml4UCwgc2VnX3R5cGUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKLSAgICAgdW5zaWduZWQgaW50IHZhbDsKLSAgICAgaW50IG5ieXRlczsKLSAgICAgZml4UyAqZml4UDsKLSAgICAgaW50IHNlZ190eXBlOwotewotICBpZiAoc2VnX3R5cGUgIT0gTl9URVhUIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBOT19SRUxPQykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG5ieXRlcykKLQl7Ci0JY2FzZSA0OgotCSAgKmJ1ZisrID0gdmFsID4+IDI0OwotCSAgKmJ1ZisrID0gdmFsID4+IDE2OwotCWNhc2UgMjoKLQkgICpidWYrKyA9IHZhbCA+PiA4OwotCWNhc2UgMToKLQkgICpidWYgPSB2YWw7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJFTE9DX0lXMTY6Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19MTzE2OgotICAgICAgYnVmWzBdID0gdmFsID4+IDg7Ci0gICAgICBidWZbMV0gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfSEkxNjoKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiAyNDsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19QQzE2OgotICAgICAgdmFsICs9IDQ7Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gMTA7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19QQzI2OgotICAgICAgdmFsICs9IDQ7Ci0gICAgICBidWZbMF0gfD0gKHZhbCA+PiAyNikgJiAweDAzOwotICAgICAgYnVmWzFdID0gdmFsID4+IDE4OwotICAgICAgYnVmWzJdID0gdmFsID4+IDEwOwotICAgICAgYnVmWzNdID0gdmFsID4+IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfMzI6Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gMjQ7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTY7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJCYWQgcmVsb2NhdGlvbiB0eXBlIikpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogMCAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fZGlzcCAoYnVmLCB2YWwsIG5ieXRlcykKLSAgICAgY2hhciAqYnVmOwotICAgICBpbnQgdmFsOwotICAgICBpbnQgbmJ5dGVzOwotewotICBhc19mYXRhbCAoXygibWRfbnVtYmVyX3RvX2Rpc3Agbm90IGRlZmluZWQiKSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG5ieXRlcyk7Ci19Ci0KLXZvaWQKLW1kX251bWJlcl90b19maWVsZCAoYnVmLCB2YWwsIG5ieXRlcykKLSAgICAgY2hhciAqYnVmOwotICAgICBpbnQgdmFsOwotICAgICBpbnQgbmJ5dGVzOwotewotICBhc19mYXRhbCAoXygibWRfbnVtYmVyX3RvX2ZpZWxkIG5vdCBkZWZpbmVkIikpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuYnl0ZXMpOwotfQotCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQgbWRfc2hvcnRfanVtcF9zaXplID0gNDsKLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICBwdHJbMF0gPSAoY2hhcikgMHhjMDsKLSAgcHRyWzFdID0gMHgwMDsKLSAgcHRyWzJdID0gMHgwMDsKLSAgcHRyWzNdID0gMHgwMDsKLSAgZml4X25ldyAoZnJhZywKLQkgICBwdHIgLSBmcmFnLT5mcl9saXRlcmFsLAotCSAgIDQsCi0JICAgdG9fc3ltYm9sLAotCSAgIChvZmZzZXRUKSAwLAotCSAgIDAsCi0JICAgUkVMT0NfUEMyNik7CQkvKiBCb3RjaDogU2hvdWxkbid0IHRoaXMgYmUgUkVMT0NfUEMxNj8gKi8KLX0KLQotaW50IG1kX2xvbmdfanVtcF9zaXplID0gNDsKLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHB0clswXSA9IChjaGFyKSAweGMwOwotICBwdHJbMV0gPSAweDAwOwotICBwdHJbMl0gPSAweDAwOwotICBwdHJbM10gPSAweDAwOwotICBmaXhfbmV3IChmcmFnLAotCSAgIHB0ciAtIGZyYWctPmZyX2xpdGVyYWwsCi0JICAgNCwKLQkgICB0b19zeW1ib2wsCi0JICAgKG9mZnNldFQpIDAsCi0JICAgMCwKLQkgICBSRUxPQ19QQzI2KTsKLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgYXNfZmF0YWwgKF8oIlJlbGF4YXRpb24gc2hvdWxkIG5ldmVyIG9jY3VyIikpOwotICByZXR1cm4gKC0xKTsKLX0KLQotI2lmIDAKLQotLyogQXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRoaXMgcm91dGluZSBpcyBuZXZlciBjYWxsZWQuICBXaGF0IGlzIGl0Ci0gICBkb2luZyBoZXJlPwotICAgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQgMTMgSnVsIDE5OTMgKi8KLQotCi0vKgotICogUmlzYyByZWxvY2F0aW9ucyBhcmUgY29tcGxldGVseSBkaWZmZXJlbnQsIHNvIGl0IG5lZWRzCi0gKiB0aGlzIG1hY2hpbmUgZGVwZW5kZW50IHJvdXRpbmUgdG8gZW1pdCB0aGVtLgotICovCi12b2lkCi1lbWl0X3JlbG9jYXRpb25zIChmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIHN0cnVjdCByZWxvY19pbmZvX204OGsgcmk7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGV4dGVybiBjaGFyICpuZXh0X29iamVjdF9maWxlX2NoYXJQOwotCi0gIGJ6ZXJvICgoY2hhciAqKSAmcmksIHNpemVvZiAocmkpKTsKLSAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChmaXhQLT5meF9yX3R5cGUgPj0gTk9fUkVMT0MpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiZml4UC0+Znhfcl90eXBlID0gJWRcbiIsIGZpeFAtPmZ4X3JfdHlwZSk7Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGlmICgoc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5KSAhPSBOVUxMKQotCXsKLQkgIHJpLnJfYWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKwotCSAgICBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotCSAgaWYgKChzeW1ib2xQLT5zeV90eXBlICYgTl9UWVBFKSA9PSBOX1VOREYpCi0JICAgIHsKLQkgICAgICByaS5yX2V4dGVybiA9IDE7Ci0JICAgICAgcmkucl9zeW1ib2xudW0gPSBzeW1ib2xQLT5zeV9udW1iZXI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJpLnJfZXh0ZXJuID0gMDsKLQkgICAgICByaS5yX3N5bWJvbG51bSA9IHN5bWJvbFAtPnN5X3R5cGUgJiBOX1RZUEU7Ci0JICAgIH0KLQkgIGlmIChzeW1ib2xQICYmIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICByaS5yX2FkZGVuZCA9IHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX2FkZHJlc3M7Ci0JICAgIH0KLQkgIHJpLnJfdHlwZSA9IGZpeFAtPmZ4X3JfdHlwZTsKLQkgIGlmIChmaXhQLT5meF9wY3JlbCkKLQkgICAgewotCSAgICAgIHJpLnJfYWRkZW5kIC09IHJpLnJfYWRkcmVzczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmkucl9hZGRlbmQgPSBmaXhQLT5meF9hZGRudW1iZXI7Ci0JICAgIH0KLQotCSAgYXBwZW5kICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgKGNoYXIgKikgJnJpLCBzaXplb2YgKHJpKSk7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotI2lmIDAKLQotLyogVGhpcyByb3V0aW5lIGNhbiBiZSBzdWJzdW1lZCBieSBzX2xjb21tIGluIHJlYWQuYy4KLSAgIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0IDEzIEp1bCAxOTkzICovCi0KLQotc3RhdGljIHZvaWQKLXNfYnNzICgpCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqcDsKLSAgaW50IHRlbXAsIGJzc19hbGlnbjsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCU1MgbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBic3NfYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBic3NfYWxpZ24gPSAwOwotCi0gIGlmICghU19JU19ERUZJTkVEKHN5bWJvbFApCi0gICAgICB8fCBTX0dFVF9TRUdNRU5UKHN5bWJvbFApID09IFNFR19CU1MpCi0gICAgewotICAgICAgaWYgKCEgbmVlZF9wYXNzXzIpCi0JewotCSAgY2hhciAqcDsKLQkgIHNlZ1QgY3VycmVudF9zZWcgPSBub3dfc2VnOwotCSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLQkgIHN1YnNlZ19zZXQgKFNFR19CU1MsIDEpOyAvKiBzd2l0Y2ggdG8gYnNzCSovCi0KLQkgIGlmIChic3NfYWxpZ24pCi0JICAgIGZyYWdfYWxpZ24gKGJzc19hbGlnbiwgMCwgMCk7Ci0KLQkgIC8qIGRldGFjaCBmcm9tIG9sZCBmcmFnICovCi0JICBpZiAoc3ltYm9sUC0+c3lfdHlwZSA9PSBOX0JTUyAmJiBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApICE9IE5VTEwpCi0JICAgIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IE5VTEw7Ci0KLQkgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotCSAgcCA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpMCwgc3ltYm9sUCwKLQkJCShvZmZzZXRUKSB0ZW1wLCAoY2hhciAqKTApOwotCSAgKnAgPSAwOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU0VHX0JTUyk7Ci0KLQkgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCAlcy4iKSwgbmFtZSk7Ci0gICAgfQotCi0gIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogMCAqLwotCi0jaWZkZWYgTTg4S0NPRkYKLQotLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBuZWVkZWQgaWYgd2UgYXJlIGxpbmtpbmcgd2l0aCBvYmotY29mZmJmZC5jLgotICAgVGhhdCBmaWxlIG1heSBiZSByZXBsYWNlZCBieSBhIG1vcmUgQkZEIG9yaWVudGVkIHZlcnNpb24gYXQgc29tZQotICAgcG9pbnQuICBJZiB0aGF0IGhhcHBlbnMsIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgcmV4YW1pbmVkLgotCi0gICBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgMTMgSnVseSAxOTkzLiAgKi8KLQotLyogR2l2ZW4gYSBmaXhTIHN0cnVjdHVyZSAoY3JlYXRlZCBieSBhIGNhbGwgdG8gZml4X25ldywgYWJvdmUpLAotICAgcmV0dXJuIHRoZSBCRkQgcmVsb2NhdGlvbiB0eXBlIHRvIHVzZSBmb3IgaXQuICAqLwotCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJFTE9DX0xPMTY6Ci0gICAgICByZXR1cm4gUl9MVlJUMTY7Ci0gICAgY2FzZSBSRUxPQ19ISTE2OgotICAgICAgcmV0dXJuIFJfSFZSVDE2OwotICAgIGNhc2UgUkVMT0NfUEMxNjoKLSAgICAgIHJldHVybiBSX1BDUjE2TDsKLSAgICBjYXNlIFJFTE9DX1BDMjY6Ci0gICAgICByZXR1cm4gUl9QQ1IyNkw7Ci0gICAgY2FzZSBSRUxPQ18zMjoKLSAgICAgIHJldHVybiBSX1ZSVDMyOwotICAgIGNhc2UgUkVMT0NfSVcxNjoKLSAgICAgIHJldHVybiBSX1ZSVDE2OwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIEFwcGx5IGEgZml4UyB0byB0aGUgb2JqZWN0IGZpbGUuICBTaW5jZSBDT0ZGIGRvZXMgbm90IHVzZSBhZGRlbmRzCi0gICBpbiByZWxvY3MsIHRoZSBhZGRlbmQgaXMgYWN0dWFsbHkgc3RvcmVkIGRpcmVjdGx5IGluIHRoZSBvYmplY3QKLSAgIGZpbGUgaXRzZWxmLiAgKi8KLQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhwLCB2YWwpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIGxvbmcgdmFsOwotewotICBjaGFyICpidWY7Ci0KLSAgYnVmID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOwotICBmaXhwLT5meF9vZmZzZXQgPSAwOwotCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJFTE9DX0lXMTY6Ci0gICAgICBmaXhwLT5meF9vZmZzZXQgPSB2YWwgPj4gMTY7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19MTzE2OgotICAgICAgZml4cC0+Znhfb2Zmc2V0ID0gdmFsID4+IDE2OwotICAgICAgYnVmWzBdID0gdmFsID4+IDg7Ci0gICAgICBidWZbMV0gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfSEkxNjoKLSAgICAgIGZpeHAtPmZ4X29mZnNldCA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzFdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1BDMTY6Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gMTA7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19QQzI2OgotICAgICAgYnVmWzBdIHw9ICh2YWwgPj4gMjYpICYgMHgwMzsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxODsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiAxMDsKLSAgICAgIGJ1ZlszXSA9IHZhbCA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DXzMyOgotICAgICAgYnVmWzBdID0gdmFsID4+IDI0OwotICAgICAgYnVmWzFdID0gdmFsID4+IDE2OwotICAgICAgYnVmWzJdID0gdmFsID4+IDg7Ci0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIFdoZXJlIGEgUEMgcmVsYXRpdmUgb2Zmc2V0IGlzIGNhbGN1bGF0ZWQgZnJvbS4gIE9uIHRoZSBtODhrIHRoZXkKLSAgIGFyZSBjYWxjdWxhdGVkIGZyb20ganVzdCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSRUxPQ19QQzE2OgotICAgICAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZSAtIDI7Ci0gICAgY2FzZSBSRUxPQ19QQzI2OgotICAgICAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBXaGVuIHdlIGFsaWduIHRoZSAuaW5pdCBzZWN0aW9uLCBpbnNlcnQgdGhlIGNvcnJlY3QgTk9QIHBhdHRlcm4uICAqLwotCi1pbnQKLW04OGtfZG9fYWxpZ24gKG4sIGZpbGwsIG1heCwgbGVuKQotICAgICBpbnQgbjsKLSAgICAgY29uc3QgY2hhciAqZmlsbDsKLSAgICAgaW50IGxlbjsKLSAgICAgaW50IG1heDsKLXsKLSAgaWYgKGZpbGwgPT0gTlVMTAotICAgICAgJiYgc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChub3dfc2VnKSwgIi5pbml0IikgPT0gMCkKLSAgICB7Ci0gICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBub3BfcGF0dGVybltdID0geyAweGY0LCAweDAwLCAweDU4LCAweDAwIH07Ci0gICAgICBmcmFnX2FsaWduX3BhdHRlcm4gKG4sIG5vcF9wYXR0ZXJuLCBzaXplb2YgKG5vcF9wYXR0ZXJuKSwgbWF4KTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBNODhLQ09GRiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tODhrLmggYi9nYXMvY29uZmlnL3RjLW04OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI2YjY5Ny4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW04OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKiBtODhrLmggLS0gQXNzZW1ibGVyIGZvciB0aGUgTW90b3JvbGEgODgwMDAKLSAgIENvbnRyaWJ1dGVkIGJ5IERldm9uIEJvd2VuIG9mIEJ1ZmZhbG8gVW5pdmVyc2l0eQotICAgYW5kIFRvcmJqb3JuIEdyYW5sdW5kIG9mIHRoZSBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfTTg4SwotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2lmZGVmIE04OEtDT0ZGCi0jZGVmaW5lIENPRkZfTUFHSUMgTUM4OE9NQUdJQwotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF9tODhrCi0jZGVmaW5lIENPRkZfRkxBR1MgRl9BUjMyVwotI2VuZGlmCi0KLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUKLSNkZWZpbmUgVENfS0VFUF9GWF9PRkZTRVQKLSNkZWZpbmUgVENfQ09OU19SRUxPQyBSRUxPQ18zMgotCi0vKiBkaWZmZXJlbnQgdHlwZSBvZiByZWxvY2F0aW9uIGF2YWlsYWJsZSBpbiB0aGUgbTg4ayAqLwotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgUkVMT0NfTE8xNiwJCQkvKiBsbzE2KHN5bSkgKi8KLSAgUkVMT0NfSEkxNiwJCQkvKiBoaTE2KHN5bSkgKi8KLSAgUkVMT0NfUEMxNiwJCQkvKiBiYjAsIGJiMSwgYmNuZCAqLwotICBSRUxPQ19QQzI2LAkJCS8qIGJyLCBic3IgKi8KLSAgUkVMT0NfMzIsCQkJLyoganVtcCB0YWJsZXMsIGV0YyAqLwotICBSRUxPQ19JVzE2LAkJCS8qIGdsb2JhbCBhY2Nlc3MgdGhyb3VnaCBsaW5rZXIgcmVncyAyOCAqLwotICBOT19SRUxPQwotfTsKLQotc3RydWN0IHJlbG9jX2luZm9fbTg4awotewotICB1bnNpZ25lZCBsb25nIGludCByX2FkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKLSAgdW5zaWduZWQgaW50IHJfZXh0ZXJuOjE7Ci0gIHVuc2lnbmVkIGludCByX3BhZDozOwotICBlbnVtIHJlbG9jX3R5cGUgcl90eXBlOjQ7Ci0gIGxvbmcgaW50IHJfYWRkZW5kOwotfTsKLQotI2RlZmluZSByZWxvY2F0aW9uX2luZm8gcmVsb2NfaW5mb19tODhrCi0KLS8qIFRoZSBtODhrIHVzZXMgJ0AnIHRvIHN0YXJ0IGxvY2FsIGxhYmVscy4gICovCi0jZGVmaW5lIExFWF9BVCAoTEVYX0JFR0lOX05BTUUgfCBMRVhfTkFNRSkKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIFwKLSAgKChuYW1lWzBdID09J0AnICYmIChuYW1lIFsxXSA9PSAnTCcgfHwgbmFtZSBbMV0gPT0gJy4nKSkgXAotICAgfHwgKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJzAnICYmIG5hbWVbMl0gPT0gJ1wwMDEnKSkKLSNlbmRpZgotCi0vKiBUaGUgbTg4ayB1c2VzIHBzZXVkby1vcHMgd2l0aCBubyBsZWFkaW5nIHBlcmlvZC4gICovCi0jZGVmaW5lIE5PX1BTRVVET19ET1QKLQotLyogRG9uJ3Qgd2FybiBvbiB3b3JkIG92ZXJmbG93OyBpdCBoYXBwZW5zIG9uICVoaSByZWxvY3MuICAqLwotI3VuZGVmIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQKLQotI2RlZmluZSBtZF9jb252ZXJ0X2ZyYWcoYixzLGYpCQl7YXNfZmF0YWwgKF8oIm04OGsgY29udmVydF9mcmFnXG4iKSk7fQotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgZm9yIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgbWRfdW5kZWZpbmVkX3N5bWJvbChzKSAwCi0KLS8qIFdlIGhhdmUgbm8gc3BlY2lhbCBvcGVyYW5kIGhhbmRsaW5nLiAgKi8KLSNkZWZpbmUgbWRfb3BlcmFuZChlKQotCi0jaWZkZWYgTTg4S0NPRkYKLQotLyogV2hldGhlciBhIHJlbG9jIHNob3VsZCBiZSBvdXRwdXQuICAqLwotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyhmaXhwKSAoKGZpeHApLT5meF9hZGRzeSAhPSBOVUxMKQotCi0vKiBHZXQgdGhlIEJGRCByZWxvYyB0eXBlIHRvIHVzZSBmb3IgYSBnYXMgZml4UyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhwKSB0Y19jb2ZmX2ZpeDJydHlwZSAoZml4cCkKLQotLyogTm8gc3BlY2lhbCBob29rIG5lZWRlZCBmb3Igc3ltYm9scy4gICovCi0jZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhzKQotCi0vKiBBbGlnbiBzZWN0aW9ucyB0byBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCi0jaWZuZGVmIG1heAotI2RlZmluZSBtYXgoYSxiKQkoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCi0jZW5kaWYKLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKQltYXggKHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIChTRUcpXSwgNCkKLQotLyogV2UgdXNlIGEgc3BlY2lhbCBhbGlnbm1lbnQgZnVuY3Rpb24gdG8gaW5zZXJ0IHRoZSBjb3JyZWN0IG5vcAotICAgcGF0dGVybiBpbiAuaW5pdC4gICovCi1leHRlcm4gaW50IG04OGtfZG9fYWxpZ24gUEFSQU1TICgoaW50LCBjb25zdCBjaGFyICosIGludCwgaW50KSk7Ci0jZGVmaW5lIG1kX2RvX2FsaWduKG4sZmlsbCxsZW4sbWF4LGwpIGlmIChtODhrX2RvX2FsaWduKG4sZmlsbCxtYXgsbGVuKSkgZ290byBsCi0KLSNlbmRpZiAvKiBNODhLQ09GRiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tY29yZS5jIGIvZ2FzL2NvbmZpZy90Yy1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmYzYTczLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNzMgKzAsMCBAQAotLyogdGMtbWNvcmUuYyAtLSBBc3NlbWJsZSBjb2RlIGZvciBNKkNvcmUKLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNpbmNsdWRlICIuLi9vcGNvZGVzL21jb3JlLW9wYy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpZmRlZiBPQkpfRUxGCi0jaW5jbHVkZSAiZWxmL21jb3JlLmgiCi0jZW5kaWYKLQotI2lmbmRlZiBzdHJlcQotI2RlZmluZSBzdHJlcShhLGIpIChzdHJjbXAgKGEsIGIpID09IDApCi0jZW5kaWYKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIGR1bWIgY29tcGlsZXJzLiAgKi8KLXN0YXRpYyB2b2lkICAgbWNvcmVfc19saXRlcmFscyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkICAgbWNvcmVfY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkICAgbWNvcmVfZmxvYXRfY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkICAgbWNvcmVfc3RyaW5nZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX2ZpbGwgICBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgICAgbG9nMiBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBjaGFyICogcGFyc2VfcmVnICAgIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgKikpOwotc3RhdGljIGNoYXIgKiBwYXJzZV9jcmVnICAgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCAqKSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX2V4cCAgICBQQVJBTVMgKChjaGFyICosIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyBjaGFyICogcGFyc2VfcnQgICAgIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKiwgaW50LCBleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX2ltbSAgICBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkICosIHVuc2lnbmVkLCB1bnNpZ25lZCkpOwotc3RhdGljIGNoYXIgKiBwYXJzZV9tZW0gICAgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCAqLCB1bnNpZ25lZCAqLCB1bnNpZ25lZCkpOwotc3RhdGljIHZvaWQgICBtYWtlX25hbWUgUEFSQU1TICgoY2hhciAqLCBjaGFyICosIGludCkpOwotc3RhdGljIGludCAgICBlbnRlcl9saXRlcmFsIFBBUkFNUyAoKGV4cHJlc3Npb25TICosIGludCkpOwotc3RhdGljIHZvaWQgICBkdW1wX2xpdGVyYWxzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBjaGVja19saXRlcmFscyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9zX3RleHQgICAgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX3NfZGF0YSAgICBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkICAgbWNvcmVfc19zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9zX2JzcyAgICAgUEFSQU1TICgoaW50KSk7Ci0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgICBtY29yZV9zX2NvbW0gICAgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotLyogU2V2ZXJhbCBwbGFjZXMgaW4gdGhpcyBmaWxlIGluc2VydCByYXcgaW5zdHJ1Y3Rpb25zIGludG8gdGhlCi0gICBvYmplY3QuIFRoZXkgc2hvdWxkIHVzZSBNQ09SRV9JTlNUX1hYWCBtYWNyb3MgdG8gZ2V0IHRoZSBvcGNvZGVzCi0gICBhbmQgdGhlbiB1c2UgdGhlc2UgdHdvIG1hY3JvcyB0byBjcmFjayB0aGUgTUNPUkVfSU5TVCB2YWx1ZSBpbnRvCi0gICB0aGUgYXBwcm9wcmlhdGUgYnl0ZSB2YWx1ZXMuICAqLwotI2RlZmluZQlJTlNUX0JZVEUwKHgpICAoKCh4KSA+PiA4KSAmIDB4RkYpCi0jZGVmaW5lCUlOU1RfQllURTEoeCkgICgoeCkgJiAweEZGKQotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjLyI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMvIjsKLQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSA4OwotCi1zdGF0aWMgaW50IGRvX2pzcmkyYnNyID0gMDsJLyogY2hhbmdlIGhlcmUgZnJvbSAxIGJ5IENydWVzcyAxOSBBdWd1c3QgOTcgKi8KLXN0YXRpYyBpbnQgc2lmaWx0ZXJfbW9kZSA9IDA7Ci0KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLSNkZWZpbmUgQyh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgMikgKyAobGVuZ3RoKSkKLSNkZWZpbmUgR0VUX1dIQVQoeCkgICAgKCh4ID4+IDIpKQotCi0vKiBUaGVzZSBhcmUgdGhlIHR3byB0eXBlcyBvZiByZWxheGFibGUgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgQ09ORF9KVU1QICAxCi0jZGVmaW5lIFVOQ0RfSlVNUCAgMgotCi0jZGVmaW5lIFVOREVGX0RJU1AgICAgICAwCi0jZGVmaW5lIENPTkQxMiAgICAgICAgICAxCi0jZGVmaW5lIENPTkQzMiAgICAgICAgICAyCi0jZGVmaW5lIFVOQ0QxMiAgICAgICAgICAxCi0jZGVmaW5lIFVOQ0QzMiAgICAgICAgICAyCi0jZGVmaW5lIFVOREVGX1dPUkRfRElTUCA0Ci0jZGVmaW5lIEVORCAgICAgICAgICAgICA1Ci0KLSNkZWZpbmUgQzEyX0xFTgkgICAgICAgIDIKLSNkZWZpbmUgQzMyX0xFTgkgICAgICAgMTAJLyogYWxsb3cgZm9yIGFsaWduICovCi0jZGVmaW5lIFUxMl9MRU4JICAgICAgICAyCi0jZGVmaW5lIFUzMl9MRU4JICAgICAgICA4CS8qIGFsbG93IGZvciBhbGlnbiAqLwotCi0KLS8qIEluaXRpYWxpemUgdGhlIHJlbGF4IHRhYmxlICovCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDA6IHVudXNlZCAqLyAgCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiAxOiB1bnVzZWQgKi8gIAoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogMjogdW51c2VkICovICAKLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDM6IHVudXNlZCAqLyAgCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiA0OiB1bnVzZWQgKi8gIAoteyAyMDQ4LCAtMjA0NiwgQzEyX0xFTiwgQyhDT05EX0pVTVAsIENPTkQzMikgfSwJLyogNTogQyhDT05EX0pVTVAsIENPTkQxMikgKi8KLXsgICAgMCwgICAgIDAsIEMzMl9MRU4sIDAgfSwJCQkvKiA2OiBDKENPTkRfSlVNUCwgQ09ORDMyKSAqLwoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogNzogdW51c2VkICovICAKLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDg6IHVudXNlZCAqLyAgCi17IDIwNDgsIC0yMDQ2LCBVMTJfTEVOLCBDKFVOQ0RfSlVNUCwgVU5DRDMyKSB9LAkvKiA5OiBDKFVOQ0RfSlVNUCwgVU5DRDEyKSAqLwoteyAgICAwLCAgICAgMCwgVTMyX0xFTiwgMCB9LAkJCS8qMTA6IEMoVU5DRF9KVU1QLCBVTkNEMzIpICovCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKjExOiB1bnVzZWQgKi8gIAoteyAgICAwLCAgICAgMCwJICAgICAwLCAwIH0JCQkvKjEyOiB1bnVzZWQgKi8gIAotfTsKLQotLyogTElURVJBTCBQT09MIERBVEEgU1RSVUNUVVJFUyAqLwotc3RydWN0IGxpdGVyYWwKLXsKLSAgdW5zaWduZWQgc2hvcnQgIHJlZmNudDsKLSAgdW5zaWduZWQgY2hhcgkgIGlzcGNyZWw7Ci0gIHVuc2lnbmVkIGNoYXIJICB1bnVzZWQ7Ci0gIGV4cHJlc3Npb25TCSAgZTsKLX07Ci0KLSNkZWZpbmUgTUFYX1BPT0xfU0laRQkoMTAyNC80KQotc3RhdGljIHN0cnVjdCBsaXRlcmFsIGxpdHBvb2wgW01BWF9QT09MX1NJWkVdOwotc3RhdGljIHVuc2lnbmVkIHBvb2xzaXplOwotc3RhdGljIHVuc2lnbmVkIHBvb2xudW1iZXI7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBwb29sc3BhbjsKLQotLyogU1BBTlBBTklDOiB0aGUgcG9pbnQgYXQgd2hpY2ggd2UgZ2V0IHRvbyBzY2FyZWQgYW5kIGZvcmNlIGEgZHVtcAotICAgb2YgdGhlIGxpdGVyYWwgcG9vbCwgYW5kIHBlcmhhcHMgcHV0IGEgYnJhbmNoIGluIHBsYWNlLgotICAgQ2FsY3VsYXRlZCBhczoKLSAgCQkgMTAyNAlzcGFuIG9mIGxydy9qbXBpL2pzcmkgaW5zbiAoYWN0dWFsbHkgc3BhbisxKQotICAJCS0yCXBvc3NpYmxlIGFsaWdubWVudCBhdCB0aGUgaW5zbi4KLSAgCQktMglwb3NzaWJsZSBhbGlnbm1lbnQgdG8gZ2V0IHRoZSB0YWJsZSBhbGlnbmVkLgotICAJCS0yCWFuIGluc2VydGVkIGJyYW5jaCBhcm91bmQgdGhlIHRhYmxlLgotICAJICAgICA9PSAxMDE4Ci0gICBhdCAxMDE4LCB3ZSBtaWdodCBiZSBpbiB0cm91YmxlLgotICAgLS0gc28gd2UgaGF2ZSB0byBiZSBzbWFsbGVyIHRoYW4gMTAxOCBhbmQgc2luY2Ugd2UgZGVhbCB3aXRoIDItYnl0ZQotICAgaW5zdHJ1Y3Rpb25zLCB0aGUgbmV4dCBnb29kIGNob2ljZSBpcyAxMDE2LgotICAgLS0gTm90ZSB3ZSBoYXZlIGEgdGVzdCBjYXNlIHRoYXQgZmFpbHMgd2hlbiB3ZSd2ZSBnb3QgMTAxOCBoZXJlLiAgKi8KLSNkZWZpbmUgU1BBTlBBTklDCSgxMDE2KQkJLyogMTAyNCAtIDEgZW50cnkgLSAyIGJ5dGUgcm91bmRpbmcgKi8KLSNkZWZpbmUgU1BBTkNMT1NFCSg5MDApCi0jZGVmaW5lIFNQQU5FWElUCSg2MDApCi1zdGF0aWMgc3ltYm9sUyAqIHBvb2xzeW07CQkvKiBsYWJlbCBmb3IgY3VycmVudCBwb29sICovCi1zdGF0aWMgY2hhciBwb29sbmFtZVs4XTsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgICBQc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgICBGdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAiZXhwb3J0IiwgICBzX2dsb2JsLCAgICAgICAgICAwIH0sCi0gIHsgImltcG9ydCIsICAgc19pZ25vcmUsICAgICAgICAgMCB9LAotICB7ICJsaXRlcmFscyIsIG1jb3JlX3NfbGl0ZXJhbHMsIDAgfSwKLSAgeyAicGFnZSIsICAgICBsaXN0aW5nX2VqZWN0LCAgICAwIH0sCi0KLSAgLyogVGhlIGZvbGxvd2luZyBhcmUgdG8gaW50ZXJjZXB0IHRoZSBwbGFjZW1lbnQgb2YgZGF0YSBpbnRvIHRoZSB0ZXh0Ci0gICAgIHNlY3Rpb24gKGVnIGFkZHJlc3NlcyBmb3IgYSBzd2l0Y2ggdGFibGUpLCBzbyB0aGF0IHRoZSBzcGFjZSB0aGV5Ci0gICAgIG9jY3VweSBjYW4gYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gZGVjaWRpbmcgd2hldGhlciBvciBub3QgdG8KLSAgICAgZHVtcCB0aGUgY3VycmVudCBsaXRlcmFsIHBvb2wuCi0gICAgIFhYWCAtIGN1cnJlbnRseSB3ZSBkbyBub3QgY29wZSB3aXRoIHRoZSAuc3BhY2UgYW5kIC5kY2IuZCBkaXJlY3RpdmVzLiAgKi8KLSAgeyAiYXNjaWkiLCAgICBtY29yZV9zdHJpbmdlciwgICAgICAgMCB9LAotICB7ICJhc2NpeiIsICAgIG1jb3JlX3N0cmluZ2VyLCAgICAgICAxIH0sCi0gIHsgImJ5dGUiLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDEgfSwKLSAgeyAiZGMiLCAgICAgICBtY29yZV9jb25zLCAgICAgICAgICAgMiB9LAotICB7ICJkYy5iIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAxIH0sCi0gIHsgImRjLmQiLCAgICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ2QnfSwKLSAgeyAiZGMubCIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgNCB9LAotICB7ICJkYy5zIiwgICAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICdmJ30sCi0gIHsgImRjLnciLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDIgfSwKLSAgeyAiZGMueCIsICAgICBtY29yZV9mbG9hdF9jb25zLCAgICAneCd9LAotICB7ICJkb3VibGUiLCAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICdkJ30sCi0gIHsgImZsb2F0IiwgICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ2YnfSwKLSAgeyAiaHdvcmQiLCAgICBtY29yZV9jb25zLCAgICAgICAgICAgMiB9LAotICB7ICJpbnQiLCAgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICA0IH0sCi0gIHsgImxvbmciLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDQgfSwKLSAgeyAib2N0YSIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAxNiB9LAotICB7ICJxdWFkIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICA4IH0sCi0gIHsgInNob3J0IiwgICAgbWNvcmVfY29ucywgICAgICAgICAgIDIgfSwKLSAgeyAic2luZ2xlIiwgICBtY29yZV9mbG9hdF9jb25zLCAgICAnZid9LAotICB7ICJzdHJpbmciLCAgIG1jb3JlX3N0cmluZ2VyLCAgICAgICAxIH0sCi0gIHsgIndvcmQiLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDIgfSwKLSAgeyAiZmlsbCIsICAgICBtY29yZV9maWxsLCAgICAgICAgICAgMCB9LAotCi0gIC8qIEFsbG93IGZvciB0aGUgZWZmZWN0IG9mIHNlY3Rpb24gY2hhbmdlcy4gICovCi0gIHsgInRleHQiLCAgICAgIG1jb3JlX3NfdGV4dCwgICAgMCB9LAotICB7ICJkYXRhIiwgICAgICBtY29yZV9zX2RhdGEsICAgIDAgfSwKLSAgeyAiYnNzIiwgICAgICAgbWNvcmVfc19ic3MsICAgICAxIH0sCi0jaWZkZWYgT0JKX0VGCi0gIHsgImNvbW0iLCAgICAgIG1jb3JlX3NfY29tbSwgICAgMCB9LAotI2VuZGlmCi0gIHsgInNlY3Rpb24iLCAgIG1jb3JlX3Nfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0aW9uLnMiLCBtY29yZV9zX3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdCIsICAgICAgbWNvcmVfc19zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3QucyIsICAgIG1jb3JlX3Nfc2VjdGlvbiwgMCB9LAotICAKLSAgeyAwLCAgICAgICAgICAwLCAgICAgICAgICAgICAgICAwIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9zX2xpdGVyYWxzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1tY29yZV9jb25zIChuYnl0ZXMpCi0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGlmIChub3dfc2VnID09IHRleHRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBjaGFyICogcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50ICAgIGNvbW1hcyA9IDE7Ci0gICAgICAKLSAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgY29tbWFzIG9uIHRoZSBsaW5lLiAgKi8KLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lIFsqIHB0cl0pCi0JY29tbWFzICs9ICogcHRyICsrID09ICcsJzsKLSAgICAgIAotICAgICAgcG9vbHNwYW4gKz0gbmJ5dGVzICogY29tbWFzOwotICAgIH0KLSAgCi0gIGNvbnMgKG5ieXRlcyk7Ci0KLSAgLyogSW4gdGhlb3J5IHdlIG91Z2h0IHRvIGNhbGwgY2hlY2tfbGl0ZXJhbHMgKDIsMCkgaGVyZSBpbiBjYXNlCi0gICAgIHdlIG5lZWQgdG8gZHVtcCB0aGUgbGl0ZXJhbCB0YWJsZS4gIFdlIGNhbm5vdCBkbyB0aGlzIGhvd2V2ZXIsCi0gICAgIGFzIHRoZSBkaXJlY3RpdmVzIHRoYXQgd2UgYXJlIGludGVyY2VwdGluZyBtYXkgYmUgYmVpbmcgdXNlZAotICAgICB0byBidWlsZCBhIHN3aXRjaCB0YWJsZSwgYW5kIHdlIG11c3Qgbm90IGludGVyZmVyZSB3aXRoIGl0cwotICAgICBjb250ZW50cy4gIEluc3RlYWQgd2UgY3Jvc3Mgb3VyIGZpbmdlcnMgYW5kIHByYXkuLi4gKi8KLX0KLQotc3RhdGljIHZvaWQKLW1jb3JlX2Zsb2F0X2NvbnMgKGZsb2F0X3R5cGUpCi0gICAgIGludCBmbG9hdF90eXBlOwotewotICBpZiAobm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24pCi0gICAgewotICAgICAgY2hhciAqIHB0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGludCAgICBjb21tYXMgPSAxOwotCi0jaWZkZWYgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKLSNlcnJvciBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyBub3QgaGFuZGxlZAotI2VuZGlmCi0gICAgICAKLSAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgY29tbWFzIG9uIHRoZSBsaW5lLiAgKi8KLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lIFsqIHB0cl0pCi0JY29tbWFzICs9ICogcHRyICsrID09ICcsJzsKLQotICAgICAgLyogV2Ugd291bGQgbGlrZSB0byBjb21wdXRlICJoZXhfZmxvYXQgKGZsb2F0X3R5cGUpICogY29tbWFzIgotCSBidXQgaGV4X2Zsb2F0IGlzIG5vdCBleHBvcnRlZCBmcm9tIHJlYWQuYyAgKi8KLSAgICAgIGZsb2F0X3R5cGUgPT0gJ2YnID8gNCA6IChmbG9hdF90eXBlID09ICdkJyA/IDggOiAxMik7Ci0gICAgICBwb29sc3BhbiArPSBmbG9hdF90eXBlICogY29tbWFzOwotICAgIH0KLQotICBmbG9hdF9jb25zIChmbG9hdF90eXBlKTsKLSAgCi0gIC8qIFNlZSB0aGUgY29tbWVudCBpbiBtY29yZV9jb25zICgpIGFib3V0IGNhbGxpbmcgY2hlY2tfbGl0ZXJhbHMuCi0gICAgIEl0IGlzIHVubGlrZWx5IHRoYXQgYSBzd2l0Y2ggdGFibGUgd2lsbCBiZSBjb25zdHJ1Y3RlZCB1c2luZwotICAgICBmbG9hdGluZyBwb2ludCB2YWx1ZXMsIGJ1dCBpdCBpcyBzdGlsbCBsaWtlbHkgdGhhdCBhbiBpbmRleGVkCi0gICAgIHRhYmxlIG9mIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyBpcyBiZWluZyBjcmVhdGVkIGJ5IHRoZXNlCi0gICAgIGRpcmVjdGl2ZXMsIHNvIGFnYWluIHdlIG11c3Qgbm90IGludGVyZmVyZSB3aXRoIHRoZWlyIHBsYWNlbWVudC4gICovCi19Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9zdHJpbmdlciAoYXBwZW5kX3plcm8pCi0gICAgIGludCBhcHBlbmRfemVybzsKLXsKLSAgaWYgKG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGNoYXIgKiBwdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAKLSAgICAgIC8qIEluIHRoZW9yeSB3ZSBzaG91bGQgY29tcHV0ZSBob3cgbWFueSBieXRlcyBhcmUgZ29pbmcgdG8KLQkgYmUgb2NjdXBpZWQgYnkgdGhlIHN0cmluZyhzKSBhbmQgYWRkIHRoaXMgdG8gdGhlIHBvb2xzcGFuLgotCSBUbyBrZWVwIHRoaW5ncyBzaW1wbGUgaG93ZXZlciwgd2UganVzdCBhZGQgdGhlIG51bWJlciBvZgotCSBieXRlcyBsZWZ0IG9uIHRoZSBjdXJyZW50IGxpbmUuICBUaGlzIHdpbGwgYmUgYW4gb3Zlci0KLQkgZXN0aW1hdGUsIHdoaWNoIGlzIE9LLCBhbmQgYXV0b21hdGljYWxseSBhbGxvd3MgZm9yIHRoZQotCSBhcHBlbmRpbmcgYSB6ZXJvIGJ5dGUsIHNpbmNlIHRoZSByZWFsIHN0cmluZyhzKSBpcy9hcmUKLQkgcmVxdWlyZWQgdG8gYmUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3Rlcy4gICovCi0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZSBbKiBwdHJdKQotCXB0ciArKzsKLQotICAgICAgcG9vbHNwYW4gKz0gcHRyIC0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgCi0gIHN0cmluZ2VyIChhcHBlbmRfemVybyk7Ci0KLSAgLyogV2UgY2FsbCBjaGVja19saXRlcmFscyBoZXJlIGluIGNhc2UgYSBsYXJnZSBudW1iZXIgb2Ygc3RyaW5ncyBhcmUKLSAgICAgYmVpbmcgcGxhY2VkIGludG8gdGhlIHRleHQgc2VjdGlvbiB3aXRoIGEgc2VxdWVuY2Ugb2Ygc3RyaW5nZXIKLSAgICAgZGlyZWN0aXZlcy4gIEluIHRoZW9yeSB3ZSBjb3VsZCBiZSB1cHNldHRpbmcgc29tZXRoaW5nIGlmIHRoZXNlCi0gICAgIHN0cmluZ3MgYXJlIGFjdHVhbGx5IGluIGFuIGluZGV4ZWQgdGFibGUgaW5zdGVhZCBvZiByZWZlcmVuY2VkIGJ5Ci0gICAgIGluZGl2aWR1YWwgbGFiZWxzLiAgTGV0IHVzIGhvcGUgdGhhdCB0aGF0IG5ldmVyIGhhcHBlbnMuICAqLwotICBjaGVja19saXRlcmFscyAoMiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9maWxsICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGlmIChub3dfc2VnID09IHRleHRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBjaGFyICogc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50ICAgIHNpemUgPSAxOwotICAgICAgaW50ICAgIHJlcGVhdDsKLQotICAgICAgcmVwZWF0ID0gYXRvaSAoc3RyKTsKLSAgICAgIAotICAgICAgLyogTG9vayB0byBzZWUgaWYgYSBzaXplIGhhcyBiZWVuIHNwZWNpZmllZC4gICovCi0gICAgICB3aGlsZSAoKnN0ciAhPSAnXG4nICYmICpzdHIgIT0gMCAmJiAqc3RyICE9ICcsJykKLQkrKyBzdHI7Ci0gICAgICAKLSAgICAgIGlmICgqIHN0ciA9PSAnLCcpCi0JewotCSAgc2l6ZSA9IGF0b2kgKHN0ciArIDEpOwotCi0JICBpZiAoc2l6ZSA+IDgpCi0JICAgIHNpemUgPSA4OwotCSAgZWxzZSBpZiAoc2l6ZSA8IDApCi0JICAgIHNpemUgPSAwOwotCX0KLQotICAgICAgcG9vbHNwYW4gKz0gc2l6ZSAqIHJlcGVhdDsKLSAgICB9Ci0gIAotICBzX2ZpbGwgKHVudXNlZCk7Ci0KLSAgY2hlY2tfbGl0ZXJhbHMgKDIsIDApOwotfQotCi0vKiBIYW5kbGUgdGhlIHNlY3Rpb24gY2hhbmdpbmcgcHNldWRvLW9wcy4gIFRoZXNlIGNhbGwgdGhyb3VnaCB0byB0aGUKLSAgIG5vcm1hbCBpbXBsZW1lbnRhdGlvbnMsIGJ1dCB0aGV5IGR1bXAgdGhlIGxpdGVyYWwgcG9vbCBmaXJzdC4gICovCi1zdGF0aWMgdm9pZAotbWNvcmVfc190ZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICAKLSNpZmRlZiBPQkpfRUxGCi0gIG9ial9lbGZfdGV4dCAoaWdub3JlKTsKLSNlbHNlCi0gIHNfdGV4dCAoaWdub3JlKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotbWNvcmVfc19kYXRhIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICAKLSNpZmRlZiBPQkpfRUxGCi0gIG9ial9lbGZfZGF0YSAoaWdub3JlKTsKLSNlbHNlCi0gIHNfZGF0YSAoaWdub3JlKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotbWNvcmVfc19zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIFNjYW4gZm9yd2FyZHMgdG8gZmluZCB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbi4gIElmIHRoZSBzZWN0aW9uCi0gICAgIGJlaW5nIHN3aXRjaGVkIHRvIGlzICIubGluZSIgdGhlbiB0aGlzIGlzIGEgRFdBUkYxIGRlYnVnIHNlY3Rpb24KLSAgICAgd2hpY2ggaXMgYXJiaXRhcmlseSBwbGFjZWQgaW5zaWRlIGdlbmVyYXRlZCBjb2RlLiAgSW4gdGhpcyBjYXNlCi0gICAgIGRvIG5vdCBkdW1wIHRoZSBsaXRlcmFsIHBvb2wgYmVjYXVzZSBpdCBpcyBhKSBpbmVmZmljaWVudCBhbmQKLSAgICAgYikgd291bGQgcmVxdWlyZSB0aGUgZ2VuZXJhdGlvbiBvZiBleHRyYSBjb2RlIHRvIGp1bXAgYXJvdW5kIHRoZQotICAgICBwb29sLiAgKi8KLSAgY2hhciAqIGlscCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICB3aGlsZSAoKmlscCAhPSAwICYmIGlzc3BhY2UoKmlscCkpCi0gICAgKysgaWxwOwotCi0gIGlmIChzdHJuY21wIChpbHAsICIubGluZSIsIDUpID09IDAKLSAgICAgICYmIChpc3NwYWNlIChpbHBbNV0pIHx8ICppbHAgPT0gJ1xuJyB8fCAqaWxwID09ICdccicpKQotICAgIDsKLSAgZWxzZQotICAgIGR1bXBfbGl0ZXJhbHMgKDApOwotCi0jaWZkZWYgT0JKX0VMRgotICBvYmpfZWxmX3NlY3Rpb24gKGlnbm9yZSk7Ci0jZW5kaWYKLSNpZmRlZiBPQkpfQ09GRgotICBvYmpfY29mZl9zZWN0aW9uIChpZ25vcmUpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9zX2JzcyAobmVlZHNfYWxpZ24pCi0gICAgIGludCBuZWVkc19hbGlnbjsKLXsKLSAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIAotICBzX2xjb21tX2J5dGVzIChuZWVkc19hbGlnbik7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgdm9pZAotbWNvcmVfc19jb21tIChuZWVkc19hbGlnbikKLSAgICAgaW50IG5lZWRzX2FsaWduOwotewotICBkdW1wX2xpdGVyYWxzICgwKTsKLSAgCi0gIG9ial9lbGZfY29tbW9uIChuZWVkc19hbGlnbik7Ci19Ci0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIFRoaXMgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0YyB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgbmVlZHMuICAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgbWNvcmVfb3Bjb2RlX2luZm8gKiBvcGNvZGU7Ci0gIGNoYXIgKiBwcmV2X25hbWUgPSAiIjsKLQotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUgKi8KLSAgZm9yIChvcGNvZGUgPSBtY29yZV90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUgKyspCi0gICAgewotICAgICAgaWYgKHN0cmVxIChwcmV2X25hbWUsIG9wY29kZS0+bmFtZSkpCi0JewotCSAgLyogTWFrZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lIHBvaW50IHRvIHRoZSBzYW1lCi0JICAgICBzdHJpbmcuICAqLwotCSAgb3Bjb2RlLT5uYW1lID0gcHJldl9uYW1lOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmV2X25hbWUgPSBvcGNvZGUtPm5hbWU7Ci0JICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgcmVnX207Ci1zdGF0aWMgaW50IHJlZ19uOwotc3RhdGljIGV4cHJlc3Npb25TIGltbWVkaWF0ZTsJLyogYWJzb2x1dGUgZXhwcmVzc2lvbiAqLwotCi0vKiBHZXQgYSBsb2cyKHZhbCkuICAqLwotc3RhdGljIGludAotbG9nMiAodmFsKQotICAgIHVuc2lnbmVkIGludCB2YWw7Ci17Ci0gICAgaW50IGxvZyA9IC0xOwotICAgIHdoaWxlICh2YWwgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgbG9nICsrOwotICAgICAgICB2YWwgPj49IDE7Ci0gICAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGxvZzsKLX0KLQotLyogVHJ5IHRvIHBhcnNlIGEgcmVnIG5hbWUuICAqLwotc3RhdGljIGNoYXIgKgotcGFyc2VfcmVnIChzLCByZWcpCi0gICAgIGNoYXIgKiBzOwotICAgICB1bnNpZ25lZCAqIHJlZzsKLXsKLSAgLyogU3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCogcykpCi0gICAgKysgczsKLSAgCi0gIGlmICh0b2xvd2VyIChzWzBdKSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNbMV0gPT0gJzEnICYmIHNbMl0gPj0gJzAnICYmIHNbMl0gPD0gJzUnKQotCXsKLQkgICpyZWcgPSAxMCArIHNbMl0gLSAnMCc7Ci0JICByZXR1cm4gcyArIDM7Ci0JfQotICAgICAgCi0gICAgICBpZiAoc1sxXSA+PSAnMCcgJiYgc1sxXSA8PSAnOScpCi0JewotCSAgKnJlZyA9IHNbMV0gLSAnMCc7Ci0JICByZXR1cm4gcyArIDI7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoICAgdG9sb3dlciAoc1swXSkgPT0gJ3MnCi0JICAgJiYgdG9sb3dlciAoc1sxXSkgPT0gJ3AnCi0JICAgJiYgISBpc2FsbnVtIChzWzJdKSkKLSAgICB7Ci0gICAgICAqIHJlZyA9IDA7Ci0gICAgICByZXR1cm4gcyArIDI7Ci0gICAgfQotICAKLSAgYXNfYmFkIChfKCJyZWdpc3RlciBleHBlY3RlZCwgYnV0IHNhdyAnJS42cyciKSwgcyk7Ci0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgc3RydWN0IENyZWdzCi17Ci0gIGNoYXIgKiBuYW1lOwotICB1bnNpZ25lZCBpbnQgY3JudW07Ci19Ci1jcmVnc1tdID0KLXsKLSAgeyAicHNyIiwJIDB9LAotICB7ICJ2YnIiLAkgMX0sCi0gIHsgImVwc3IiLAkgMn0sCi0gIHsgImZwc3IiLAkgM30sCi0gIHsgImVwYyIsCSA0fSwKLSAgeyAiZnBjIiwJIDV9LAotICB7ICJzczAiLAkgNn0sCi0gIHsgInNzMSIsCSA3fSwKLSAgeyAic3MyIiwJIDh9LAotICB7ICJzczMiLAkgOX0sCi0gIHsgInNzNCIsCTEwfSwKLSAgeyAiZ2NyIiwJMTF9LAotICB7ICJnc3IiLAkxMn0sCi0gIHsgIiIsCQkgMH0KLX07Ci0KLXN0YXRpYyBjaGFyICoKLXBhcnNlX2NyZWcgKHMsIHJlZykKLSAgICAgY2hhciAqIHM7Ci0gICAgIHVuc2lnbmVkICogcmVnOwotewotICBpbnQgaTsKLQotICAvKiBTdHJpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKLSAgICArK3M7Ci0gIAotICBpZiAoKHRvbG93ZXIgKHNbMF0pID09ICdjJyAmJiB0b2xvd2VyIChzWzFdKSA9PSAncicpKQotICAgIHsKLSAgICAgIGlmIChzWzJdID09ICczJyAmJiBzWzNdID49ICcwJyAmJiBzWzNdIDw9ICcxJykKLQl7Ci0JICAqcmVnID0gMzAgKyBzWzNdIC0gJzAnOwotCSAgcmV0dXJuIHMgKyA0OwotCX0KLSAgICAgIAotICAgICAgaWYgKHNbMl0gPT0gJzInICYmIHNbM10gPj0gJzAnICYmIHNbM10gPD0gJzknKQotCXsKLQkgICpyZWcgPSAyMCArIHNbM10gLSAnMCc7Ci0JICByZXR1cm4gcyArIDQ7Ci0JfQotICAgICAgCi0gICAgICBpZiAoc1syXSA9PSAnMScgJiYgc1szXSA+PSAnMCcgJiYgc1szXSA8PSAnOScpCi0JewotCSAgKnJlZyA9IDEwICsgc1szXSAtICcwJzsKLQkgIHJldHVybiBzICsgNDsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChzWzJdID49ICcwJyAmJiBzWzJdIDw9ICc5JykKLQl7Ci0JICAqcmVnID0gc1syXSAtICcwJzsKLQkgIHJldHVybiBzICsgMzsKLQl9Ci0gICAgfQotICAKLSAgLyogTG9vayBhdCBhbHRlcm5hdGUgY3JlZyBuYW1lcyBiZWZvcmUgZ2l2aW5nIGVycm9yLiAgKi8KLSAgZm9yIChpID0gMDsgY3JlZ3NbaV0ubmFtZVswXSAhPSAnXDAnOyBpKyspCi0gICAgewotICAgICAgY2hhciBidWYgWzEwXTsKLSAgICAgIGludCAgbGVuZ3RoOwotICAgICAgaW50ICBqOwotICAgICAgCi0gICAgICBsZW5ndGggPSBzdHJsZW4gKGNyZWdzW2ldLm5hbWUpOwotICAgICAgCi0gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspCi0JYnVmW2pdID0gdG9sb3dlciAoc1tqXSk7Ci0gICAgICAKLSAgICAgIGlmIChzdHJuY21wIChjcmVnc1tpXS5uYW1lLCBidWYsIGxlbmd0aCkgPT0gMCkKLQl7Ci0JICAqcmVnID0gY3JlZ3NbaV0uY3JudW07Ci0JICByZXR1cm4gcyArIGxlbmd0aDsKLQl9Ci0gICAgfQotICAKLSAgYXNfYmFkIChfKCJjb250cm9sIHJlZ2lzdGVyIGV4cGVjdGVkLCBidXQgc2F3ICclLjZzJyIpLCBzKTsKLSAgCi0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9leHAgKHMsIGUpCi0gICAgIGNoYXIgKiBzOwotICAgICBleHByZXNzaW9uUyAqIGU7Ci17Ci0gIGNoYXIgKiBzYXZlOwotICBjaGFyICogbmV3OwotCi0gIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqIHMpKQotICAgICsrIHM7Ci0gIAotICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCi0gIGV4cHJlc3Npb24gKGUpOwotICAKLSAgaWYgKGUtPlhfb3AgPT0gT19hYnNlbnQpCi0gICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gIAotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIAotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgdm9pZAotbWFrZV9uYW1lIChzLCBwLCBuKQotICAgICBjaGFyICogczsKLSAgICAgY2hhciAqIHA7Ci0gICAgIGludCBuOwotewotICBzdGF0aWMgY29uc3QgY2hhciBoZXhbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKLQotICBzWzBdID0gcFswXTsKLSAgc1sxXSA9IHBbMV07Ci0gIHNbMl0gPSBwWzJdOwotICBzWzNdID0gaGV4WyhuID4+IDEyKSAmIDB4Rl07Ci0gIHNbNF0gPSBoZXhbKG4gPj4gIDgpICYgMHhGXTsKLSAgc1s1XSA9IGhleFsobiA+PiAgNCkgJiAweEZdOwotICBzWzZdID0gaGV4WyhuKSAgICAgICAmIDB4Rl07Ci0gIHNbN10gPSAwOwotfQotCi0jZGVmaW5lIFBPT0xfRU5EX0xBQkVMICAgIi5MRSIKLSNkZWZpbmUgUE9PTF9TVEFSVF9MQUJFTCAiLkxTIgotCi1zdGF0aWMgdm9pZAotZHVtcF9saXRlcmFscyAoaXNmb3JjZSkKLSAgICAgaW50IGlzZm9yY2U7Ci17Ci0gIGludCBpOwotICBzdHJ1Y3QgbGl0ZXJhbCAqIHA7Ci0gIHN5bWJvbFMgKiBicmFyc3ltOwotICAKLSAgaWYgKHBvb2xzaXplID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIE11c3Qgd2UgYnJhbmNoIGFyb3VuZCB0aGUgbGl0ZXJhbCB0YWJsZT8gKi8KLSAgaWYgKGlzZm9yY2UpCi0gICAgewotICAgICAgY2hhciAqIG91dHB1dDsKLSAgICAgIGNoYXIgYnJhcm5hbWVbOF07Ci0gICAgICAKLSAgICAgIG1ha2VfbmFtZSAoYnJhcm5hbWUsIFBPT0xfRU5EX0xBQkVMLCBwb29sbnVtYmVyKTsKLSAgICAgIAotICAgICAgYnJhcnN5bSA9IHN5bWJvbF9tYWtlIChicmFybmFtZSk7Ci0gICAgICAKLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKGJyYXJzeW0pOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMzIpXS5ybHhfbGVuZ3RoLAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDEyKV0ucmx4X2xlbmd0aCwKLQkJCSBDIChVTkNEX0pVTVAsIDApLCBicmFyc3ltLCAwLCAwKTsKLSAgICAgIG91dHB1dFswXSA9IElOU1RfQllURTAgKE1DT1JFX0lOU1RfQlIpOwkvKiBiciAuK3h4eCAqLwotICAgICAgb3V0cHV0WzFdID0gSU5TVF9CWVRFMSAoTUNPUkVfSU5TVF9CUik7Ci0gICAgfQotICAgICAgCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzZWN0aW9uIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkIGFuZCB0aGF0Ci0gICAgIHRoZSBsaXRlcmFsIHRhYmxlIGlzIGFsaWduZWQgd2l0aGluIGl0LiAgKi8KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMik7Ci0gIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotICAKLSAgY29sb24gKFNfR0VUX05BTUUgKHBvb2xzeW0pKTsKLSAgCi0gIGZvciAoaSA9IDAsIHAgPSBsaXRwb29sOyBpIDwgcG9vbHNpemU7IGkrKywgcCsrKQotICAgIGVtaXRfZXhwciAoJiBwLT5lLCA0KTsKLSAgCi0gIGlmIChpc2ZvcmNlKQotICAgIGNvbG9uIChTX0dFVF9OQU1FIChicmFyc3ltKSk7Ci0gIAotICAgcG9vbHNpemUgPSAwOwotfQotCi1zdGF0aWMgdm9pZAotY2hlY2tfbGl0ZXJhbHMgKGtpbmQsIG9mZnNldCkKLSAgICAgaW50IGtpbmQ7Ci0gICAgIGludCBvZmZzZXQ7Ci17Ci0gIHBvb2xzcGFuICs9IG9mZnNldDsKLSAgICAKLSAgLyogU1BBTkNMT1NFIGFuZCBTUEFORVhJVCBhcmUgc21hbGxlciBudW1iZXJzIHRoYW4gU1BBTlBBTklDLgotICAgICBTUEFOUEFOSUMgbWVhbnMgdGhhdCB3ZSBtdXN0IGR1bXAgbm93LgotICAgICBraW5kID09IDAgaXMgYW55IG9sZCBpbnN0cnVjdGlvbi4KLSAgICAga2luZCAgPiAwIG1lYW5zIHdlIGp1c3QgaGFkIGEgY29udHJvbCB0cmFuc2ZlciBpbnN0cnVjdGlvbi4KLSAgICAga2luZCA9PSAxIG1lYW5zIHdpdGhpbiBhIGZ1bmN0aW9uCi0gICAgIGtpbmQgPT0gMiBtZWFucyB3ZSBqdXN0IGxlZnQgYSBmdW5jdGlvbgotICAgIAotICAgICBUaGUgZHVtcF9saXRlcmFscyAoMSkgY2FsbCBpbnNlcnRzIGEgYnJhbmNoIGFyb3VuZCB0aGUgdGFibGUsIHNvCi0gICAgIHdlIGZpcnN0IGxvb2sgdG8gc2VlIGlmIGl0cyBhIHNpdHVhdGlvbiB3aGVyZSB3ZSB3b24ndCBoYXZlIHRvCi0gICAgIGluc2VydCBhIGJyYW5jaCAoZS5nLiwgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBhbiB1bmNvbmRpdGlvbmFsCi0gICAgIGJyYW5jaCkuCi0gICAgCi0gICAgIFNQQU5QQU5JQyBpcyB0aGUgcG9pbnQgd2hlcmUgd2UgbXVzdCBkdW1wIGEgc2luZ2xlLWVudHJ5IHBvb2wuCi0gICAgIGl0IGFjY291bnRzIGZvciBhbGlnbm1lbnRzIGFuZCBhbiBpbnNlcnRlZCBicmFuY2guCi0gICAgIHRoZSAncG9vbHNpemUqMicgYWNjb3VudHMgZm9yIHRoZSBzY2VuYXJpbyB3aGVyZSB3ZSBkbzoKLSAgICAgICBscncgcjEsbGl0MTsgbHJ3IHIyLGxpdDI7IGxydyByMyxsaXQzCi0gICAgIE5vdGUgdGhhdCB0aGUgJ2xpdDInIHJlZmVyZW5jZSBpcyAyIGJ5dGVzIGZ1cnRoZXIgYWxvbmcKLSAgICAgYnV0IHRoZSBsaXRlcmFsIGl0IHJlZmVyZW5jZXMgd2lsbCBiZSA0IGJ5dGVzIGZ1cnRoZXIgYWxvbmcsCi0gICAgIHNvIHdlIG11c3QgY29uc2lkZXIgdGhlIHBvb2xzaXplIGludG8gdGhpcyBlcXVhdGlvbi4KLSAgICAgVGhpcyBpcyBzbGlnaHRseSBvdmVyLWNhdXRpb3VzLCBidXQgZ3VhcmFudGVlcyB0aGF0IHdlIHdvbid0Ci0gICAgIHBhbmljIGJlY2F1c2UgYSByZWxvY2F0aW9uIGlzIHRvbyBkaXN0YW50LiAgKi8KLSAgCi0gIGlmIChwb29sc3BhbiA+IFNQQU5DTE9TRSAmJiBraW5kID4gMCkKLSAgICBkdW1wX2xpdGVyYWxzICgwKTsKLSAgZWxzZSBpZiAocG9vbHNwYW4gPiBTUEFORVhJVCAmJiBraW5kID4gMSkKLSAgICBkdW1wX2xpdGVyYWxzICgwKTsKLSAgZWxzZSBpZiAocG9vbHNwYW4gPj0gKFNQQU5QQU5JQyAtIHBvb2xzaXplICogMikpCi0gICAgZHVtcF9saXRlcmFscyAoMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWVudGVyX2xpdGVyYWwgKGUsIGlzcGNyZWwpCi0gICAgIGV4cHJlc3Npb25TICogZTsKLSAgICAgaW50IGlzcGNyZWw7Ci17Ci0gIGludCBpOwotICBzdHJ1Y3QgbGl0ZXJhbCAqIHA7Ci0KLSAgaWYgKHBvb2xzaXplID49IE1BWF9QT09MX1NJWkUgLSAyKQotICAgIHsKLSAgICAgIC8qIFRoZSBsaXRlcmFsIHBvb2wgaXMgYXMgZnVsbCBhcyB3ZSBjYW4gaGFuZGxlLiBXZSBoYXZlCi0gICAgICAgICB0byBiZSAyIGVudHJpZXMgc2h5IG9mIHRoZSAxMDI0LzQ9MjU2IGVudHJpZXMgYmVjYXVzZSB3ZQotICAgICAgICAgaGF2ZSB0byBhbGxvdyBmb3IgdGhlIGJyYW5jaCAoMiBieXRlcykgYW5kIHRoZSBhbGlnbm1lbnQKLSAgICAgICAgICgyIGJ5dGVzIGJlZm9yZSB0aGUgZmlyc3QgaW5zbiByZWZlcmVuY2luZyB0aGUgcG9vbCBhbmQKLSAgICAgICAgIDIgYnl0ZXMgYmVmb3JlIHRoZSBwb29sIGl0c2VsZikgPT0gNiBieXRlcywgcm91bmRzIHVwCi0gICAgICAgICB0byAyIGVudHJpZXMuICAqLyAKLSAgICAgIGR1bXBfbGl0ZXJhbHMgKDEpOwotICAgIH0KLQotICBpZiAocG9vbHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgbmV3IGxpdGVyYWwgcG9vbC4gICovCi0gICAgICBpZiAoKysgcG9vbG51bWJlciA+IDB4RkZGRikKLQlhc19mYXRhbCAoXygibW9yZSB0aGFuIDY1SyBsaXRlcmFsIHBvb2xzIikpOwotICAgICAgCi0gICAgICBtYWtlX25hbWUgKHBvb2xuYW1lLCBQT09MX1NUQVJUX0xBQkVMLCBwb29sbnVtYmVyKTsKLSAgICAgIHBvb2xzeW0gPSBzeW1ib2xfbWFrZSAocG9vbG5hbWUpOwotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAocG9vbHN5bSk7Ci0gICAgICBwb29sc3BhbiA9IDA7Ci0gICAgfQotICAKLSAgLyogU2VhcmNoIHBvb2wgZm9yIHZhbHVlIHNvIHdlIGRvbid0IGhhdmUgZHVwbGljYXRlcy4gICovCi0gIGZvciAocCA9IGxpdHBvb2wsIGkgPSAwOyBpIDwgcG9vbHNpemU7IGkrKywgcCsrKQotICAgIHsKLSAgICAgIGlmIChlLT5YX29wID09IHAtPmUuWF9vcAotCSAgJiYgZS0+WF9hZGRfc3ltYm9sID09IHAtPmUuWF9hZGRfc3ltYm9sCi0JICAmJiBlLT5YX2FkZF9udW1iZXIgPT0gcC0+ZS5YX2FkZF9udW1iZXIKLQkgICYmIGlzcGNyZWwgPT0gcC0+aXNwY3JlbCkKLQl7Ci0JICBwLT5yZWZjbnQgKys7Ci0JICByZXR1cm4gaTsKLQl9Ci0gICAgfQotCi0gIHAtPnJlZmNudCAgPSAxOwotICBwLT5pc3BjcmVsID0gaXNwY3JlbDsKLSAgcC0+ZSAgICAgICA9ICogZTsKLSAgCi0gIHBvb2xzaXplICsrOwotCi0gIHJldHVybiBpOyAgIAotfQotCi0vKiBQYXJzZSBhIGxpdGVyYWwgc3BlY2lmaWNhdGlvbi4gLS0gZWl0aGVyIG5ldyBvciBvbGQgc3ludGF4LgotICAgb2xkIHN5bnRheDogdGhlIHVzZXIgc3VwcGxpZXMgdGhlIGxhYmVsIGFuZCBwbGFjZXMgdGhlIGxpdGVyYWwuCi0gICBuZXcgc3ludGF4OiB3ZSBwdXQgaXQgaW50byB0aGUgbGl0ZXJhbCBwb29sLiAgKi8KLXN0YXRpYyBjaGFyICoKLXBhcnNlX3J0IChzLCBvdXRwdXRwLCBpc3BjcmVsLCBlcCkKLSAgICAgY2hhciAqIHM7Ci0gICAgIGNoYXIgKiogb3V0cHV0cDsKLSAgICAgaW50IGlzcGNyZWw7Ci0gICAgIGV4cHJlc3Npb25TICogZXA7Ci17Ci0gIGV4cHJlc3Npb25TIGU7Ci0gIGludCBuOwotICAKLSAgaWYgKGVwKQotICAgIC8qIEluZGljYXRlIG5vdGhpbmcgdGhlcmUuICAqLwotICAgIGVwLT5YX29wID0gT19hYnNlbnQ7Ci0gIAotICBpZiAoKnMgPT0gJ1snKQotICAgIHsKLSAgICAgIHMgPSBwYXJzZV9leHAgKHMgKyAxLCAmIGUpOwotICAgICAgCi0gICAgICBpZiAoKnMgPT0gJ10nKQotCXMrKzsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIm1pc3NpbmcgJ10nIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHMgPSBwYXJzZV9leHAgKHMsICYgZSk7Ci0gICAgICAKLSAgICAgIG4gPSBlbnRlcl9saXRlcmFsICgmIGUsIGlzcGNyZWwpOwotICAgICAgCi0gICAgICBpZiAoZXApCi0JKmVwID0gZTsKLQotICAgICAgLyogQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIHBvb2wgZW50cnkuICAqLwotICAgICAgZS5YX29wICAgICAgICAgPSBPX3N5bWJvbDsKLSAgICAgIGUuWF9hZGRfc3ltYm9sID0gcG9vbHN5bTsKLSAgICAgIGUuWF9hZGRfbnVtYmVyID0gbiA8PCAyOwotICAgIH0KLSAgCi0gICogb3V0cHV0cCA9IGZyYWdfbW9yZSAoMik7Ci0KLSAgZml4X25ld19leHAgKGZyYWdfbm93LCAoKm91dHB1dHApIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDIsICYgZSwgMSwKLQkgICAgICAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQpOwotCi0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9pbW0gKHMsIHZhbCwgbWluLCBtYXgpCi0gICAgIGNoYXIgKiBzOwotICAgICB1bnNpZ25lZCAqIHZhbDsKLSAgICAgdW5zaWduZWQgbWluOwotICAgICB1bnNpZ25lZCBtYXg7Ci17Ci0gIGNoYXIgKiBuZXc7Ci0gIGV4cHJlc3Npb25TIGU7Ci0gIAotICBuZXcgPSBwYXJzZV9leHAgKHMsICYgZSk7Ci0gIAotICBpZiAoZS5YX29wID09IE9fYWJzZW50KQotICAgIDsgLyogQW4gZXJyb3IgbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIGVtaXR0ZWQuICAqLwotICBlbHNlIGlmIChlLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhIGNvbnN0YW50IikpOwotICBlbHNlIGlmIChlLlhfYWRkX251bWJlciA8IG1pbiB8fCBlLlhfYWRkX251bWJlciA+IG1heCkKLSAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhYnNvbHV0ZSBpbiByYW5nZSAlZC4uJWQsIG5vdCAlZCIpLAotCSAgICBtaW4sIG1heCwgZS5YX2FkZF9udW1iZXIpOwotCi0gICogdmFsID0gZS5YX2FkZF9udW1iZXI7Ci0gIAotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9tZW0gKHMsIHJlZywgb2ZmLCBzaXopCi0gICAgIGNoYXIgKiBzOwotICAgICB1bnNpZ25lZCAqIHJlZzsKLSAgICAgdW5zaWduZWQgKiBvZmY7Ci0gICAgIHVuc2lnbmVkIHNpejsKLXsKLSAgY2hhciAqIG5ldzsKLQotICAqIG9mZiA9IDA7Ci0gIAotICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKLSAgICArKyBzOwotICAgICAgCi0gIGlmICgqIHMgPT0gJygnKQotICAgIHsKLSAgICAgIHMgPSBwYXJzZV9yZWcgKHMgKyAxLCByZWcpOwotCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKLQkrKyBzOwotICAgICAgCi0gICAgICBpZiAoKiBzID09ICcsJykKLQl7Ci0JICBzID0gcGFyc2VfaW1tIChzICsgMSwgb2ZmLCAwLCA2Myk7Ci0JICAKLQkgIGlmIChzaXogPiAxKQotCSAgICB7Ci0JICAgICAgaWYgKHNpeiA+IDIpCi0JCXsKLQkJICBpZiAoKiBvZmYgJiAweDMpCi0JCSAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKSk7Ci0JCSAgCi0JCSAgKiBvZmYgPj49IDI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKiBvZmYgJiAweDEpCi0JCSAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIiKSk7Ci0JCSAgCi0JCSAgKiBvZmYgPj49IDE7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogcykpCi0JKysgczsKLSAgICAgIAotICAgICAgaWYgKCogcyA9PSAnKScpCi0JcyArKzsKLSAgICB9Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oImJhc2UgcmVnaXN0ZXIgZXhwZWN0ZWQiKSk7Ci0gIAotICByZXR1cm4gczsKLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGNoYXIgKiBvcF9zdGFydDsKLSAgY2hhciAqIG9wX2VuZDsKLSAgbWNvcmVfb3Bjb2RlX2luZm8gKiBvcGNvZGU7Ci0gIGNoYXIgKiBvdXRwdXQ7Ci0gIGludCBubGVuID0gMDsKLSAgdW5zaWduZWQgc2hvcnQgaW5zdDsKLSAgdW5zaWduZWQgcmVnOwotICB1bnNpZ25lZCBvZmY7Ci0gIHVuc2lnbmVkIGlzaXplOwotICBleHByZXNzaW9uUyBlOwotICBjaGFyIG5hbWVbMjBdOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKLSAgICBzdHIgKys7Ci0KLSAgLyogRmluZCB0aGUgb3AgY29kZSBlbmQuICAqLwotICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gc3RyOwotICAgICAgICogb3BfZW5kICYmIG5sZW4gPCAyMCAmJiAhaXNfZW5kX29mX2xpbmUgWypvcF9lbmRdICYmICpvcF9lbmQgIT0gJyAnOwotICAgICAgIG9wX2VuZCsrKQotICAgIHsKLSAgICAgIG5hbWVbbmxlbl0gPSBvcF9zdGFydFtubGVuXTsKLSAgICAgIG5sZW4rKzsKLSAgICB9Ci0gIAotICBuYW1lIFtubGVuXSA9IDA7Ci0gIAotICBpZiAobmxlbiA9PSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBvcGNvZGUgPSAobWNvcmVfb3Bjb2RlX2luZm8gKikgaGFzaF9maW5kIChvcGNvZGVfaGFzaF9jb250cm9sLCBuYW1lKTsKLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUgXCIlc1wiIiksIG5hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIGluc3QgPSBvcGNvZGUtPmluc3Q7Ci0gIGlzaXplID0gMjsKLSAgCi0gIHN3aXRjaCAob3Bjb2RlLT5vcGNsYXNzKQotICAgIHsKLSAgICBjYXNlIE8wOgotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPVDoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDAsIDMpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE8xOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSk1QOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICAvKiBJbiBhIHNpZmlsdGVyIG1vZGUsIHdlIGVtaXQgdGhpcyBpbnNuIDIgdGltZXMsCi0gICAgICAgICBmaXhlcyBwcm9ibGVtIG9mIGFuIGludGVycnVwdCBkdXJpbmcgYSBqbXAuLiAqLwotICAgICAgaWYgKHNpZmlsdGVyX21vZGUpCi0JewotCSAgb3V0cHV0WzBdID0gSU5TVF9CWVRFMCAoaW5zdCk7Ci0JICBvdXRwdXRbMV0gPSBJTlNUX0JZVEUxIChpbnN0KTsKLQkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEpTUjoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgCi0gICAgICBpZiAocmVnID09IDE1KQotCWFzX2JhZCAoXygiaW52YWxpZCByZWdpc3RlcjogcjE1IGlsbGVnYWwiKSk7Ci0gICAgICAKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIAotICAgICAgaWYgKHNpZmlsdGVyX21vZGUpCi0JewotCSAgLyogUmVwbGFjZSB3aXRoOiAgYnNyIC4rMiA7IGFkZGkgcjE1LDY7IGptcCByeCA7IGptcCByeCAqLwotCSAgaW5zdCA9IE1DT1JFX0lOU1RfQlNSOwkvKiB3aXRoIDAgZGlzcGxhY2VtZW50ICovCi0JICBvdXRwdXRbMF0gPSBJTlNUX0JZVEUwIChpbnN0KTsKLQkgIG91dHB1dFsxXSA9IElOU1RfQllURTEgKGluc3QpOwotCi0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotCSAgaW5zdCA9IE1DT1JFX0lOU1RfQURESTsKLQkgIGluc3QgfD0gMTU7CQkJLyogYWRkaSByMTUsNiAqLwotCSAgaW5zdCB8PSAoNiAtIDEpIDw8IDQ7CQkvKiBvdmVyIHRoZSBqbXAncyAqLwotCSAgb3V0cHV0WzBdID0gSU5TVF9CWVRFMCAoaW5zdCk7Ci0JICBvdXRwdXRbMV0gPSBJTlNUX0JZVEUxIChpbnN0KTsKLQotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLQkgIGluc3QgPSBNQ09SRV9JTlNUX0pNUCB8IHJlZzsKLQkgIG91dHB1dFswXSA9IElOU1RfQllURTAgKGluc3QpOwotCSAgb3V0cHV0WzFdID0gSU5TVF9CWVRFMSAoaW5zdCk7Ci0KLQkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7CQkvKiAybmQgZW1pdHRlZCBpbiBmYWxsdGhydSAqLwotCX0KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPQzoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKm9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfY3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTzI6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBYMToJLyogSGFuZGxlIGJvdGggc3ludGF4LT4geHRyYi0gcjEscnggT1IgeHRyYi0gcnggKi8KLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykJLyogeHRyYi0gcjEscnggKi8KLQl7Ci0JICBpZiAocmVnICE9IDEpCi0JICAgIGFzX2JhZCAoXygiZGVzdGluYXRpb24gcmVnaXN0ZXIgbXVzdCBiZSByMSIpKTsKLQkgIAotCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JfQotICAgICAgCi0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTzFSMTogIC8qIGRpdi0gcngscjEgKi8KLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCSAgaWYgKHJlZyAhPSAxKQotCSAgICBhc19iYWQgKF8oInNvdXJjZSByZWdpc3RlciBtdXN0IGJlIHIxIikpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT0k6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMik7Ci0JICBpbnN0IHw9IChyZWcgLSAxKSA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT0I6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAwLCAzMSk7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT0IyOgkJLyogbGlrZSBPQiwgYnV0IGFyZyBpcyAyXm4gaW5zdGVhZCBvZiBuICovCi0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAxIDw8IDMxKTsKLQkgIC8qIEZ1cnRoZXIgcmVzdHJpY3QgdGhlIGltbWVkaWF0ZSB0byBhIHBvd2VyIG9mIHR3by4gKi8KLQkgIGlmICgocmVnICYgKHJlZyAtIDEpKSA9PSAwKQotCSAgICByZWcgPSBsb2cyIChyZWcpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVnID0gMDsKLQkgICAgICBhc19iYWQgKF8oImltbWVkaWF0ZSBpcyBub3QgYSBwb3dlciBvZiB0d28iKSk7Ci0JICAgIH0KLQkgIGluc3QgfD0gKHJlZykgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9CUmE6CS8qIFNwZWNpZmljIGZvciBiZ2VuaTogaW1tIG9mIDAtPjYgdHJhbnNsYXRlIHRvIG1vdmkuICovCi0gICAgY2FzZSBPQlJiOgotICAgIGNhc2UgT0JSYzoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDAsIDMxKTsKLQkgIC8qIGltbWVkaWF0ZSB2YWx1ZXMgb2YgMCAtPiA2IHRyYW5zbGF0ZSB0byBtb3ZpICovCi0JICBpZiAocmVnIDw9IDYpCi0JICAgIHsKLQkgICAgICBpbnN0ID0gKGluc3QgJiAweEYpIHwgTUNPUkVfSU5TVF9CR0VOSV9BTFQ7Ci0JICAgICAgcmVnID0gMHgxIDw8IHJlZzsKLQkgICAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyBiZ2VuaSB0byBtb3ZpIikpOwotCSAgICB9Ci0JICBpbnN0ICY9IH4gMHgwMWYwOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9CUjI6CS8qIGxpa2UgT0JSLCBidXQgYXJnIGlzIDJebiBpbnN0ZWFkIG9mIG4gKi8KLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDEgPDwgMzEpOwotCSAgCi0JICAvKiBGdXJ0aGVyIHJlc3RyaWN0IHRoZSBpbW1lZGlhdGUgdG8gYSBwb3dlciBvZiB0d28uICAqLwotCSAgaWYgKChyZWcgJiAocmVnIC0gMSkpID09IDApCi0JICAgIHJlZyA9IGxvZzIgKHJlZyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWcgPSAwOwotCSAgICAgIGFzX2JhZCAoXygiaW1tZWRpYXRlIGlzIG5vdCBhIHBvd2VyIG9mIHR3byIpKTsKLQkgICAgfQotCSAgCi0JICAvKiBJbW1lZGlhdGUgdmFsdWVzIG9mIDAgLT4gNiB0cmFuc2xhdGUgdG8gbW92aS4gKi8KLQkgIGlmIChyZWcgPD0gNikKLQkgICAgewotCSAgICAgIGluc3QgPSAoaW5zdCAmIDB4RikgfCBNQ09SRV9JTlNUX0JHRU5JX0FMVDsKLQkgICAgICByZWcgPSAweDEgPDwgcmVnOwotCSAgICAgIGFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIG1nZW5pIHRvIG1vdmkiKSk7Ci0JICAgIH0KLQkgIAotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9NYToJLyogU3BlY2lmaWMgZm9yIGJtYXNraTogaW1tIDEtPjcgdHJhbnNsYXRlIHRvIG1vdmkuICAqLwotICAgIGNhc2UgT01iOgotICAgIGNhc2UgT01jOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzIpOwotCSAgCi0JICAvKiBJbW1lZGlhdGUgdmFsdWVzIG9mIDEgLT4gNyB0cmFuc2xhdGUgdG8gbW92aS4gKi8KLQkgIGlmIChyZWcgPD0gNykKLQkgICAgewotCSAgICAgIGluc3QgPSAoaW5zdCAmIDB4RikgfCBNQ09SRV9JTlNUX0JNQVNLSV9BTFQ7Ci0JICAgICAgcmVnID0gKDB4MSA8PCByZWcpIC0gMTsKLQkgICAgICBpbnN0IHw9IHJlZyA8PCA0OwotCSAgICAgIAotCSAgICAgIGFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIGJtYXNraSB0byBtb3ZpIikpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnN0ICY9IH4gMHgwMUYwOwotCSAgICAgIGluc3QgfD0gKHJlZyAmIDB4MUYpIDw8IDQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFNJOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzEpOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEk3OgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMCwgMHg3Rik7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTFM6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnIDw8IDg7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIGludCBzaXplOwotCSAgCi0JICBpZiAoKGluc3QgJiAweDYwMDApID09IDApCi0JICAgIHNpemUgPSA0OwotCSAgZWxzZSBpZiAoKGluc3QgJiAweDYwMDApID09IDB4NDAwMCkKLQkgICAgc2l6ZSA9IDI7Ci0JICBlbHNlIGlmICgoaW5zdCAmIDB4NjAwMCkgPT0gMHgyMDAwKQotCSAgICBzaXplID0gMTsKLQkgIAotCSAgb3BfZW5kID0gcGFyc2VfbWVtIChvcF9lbmQgKyAxLCAmIHJlZywgJiBvZmYsIHNpemUpOwotCSAgCi0JICBpZiAob2ZmID4gMTYpCi0JICAgIGFzX2JhZCAoXygiZGlzcGxhY2VtZW50IHRvbyBsYXJnZSAoJWQpIiksIG9mZik7Ci0JICBlbHNlCi0JICAgIGluc3QgfD0gKHJlZykgfCAob2ZmIDw8IDQpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTFI6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIAotICAgICAgaWYgKHJlZyA9PSAwIHx8IHJlZyA9PSAxNSkKLQlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXI6IHIwIGFuZCByMTUgaWxsZWdhbCIpKTsKLSAgICAgIAotICAgICAgaW5zdCB8PSAocmVnIDw8IDgpOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQkvKiBwYXJzZV9ydCBjYWxscyBmcmFnX21vcmUoKSBmb3IgdXMuICAqLwotCWlucHV0X2xpbmVfcG9pbnRlciA9IHBhcnNlX3J0IChvcF9lbmQgKyAxLCAmIG91dHB1dCwgMCwgMCk7Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsJCS8qIHNhdmUgaXRzIHNwYWNlICovCi0JfQotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIExKOgotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyc2VfcnQgKG9wX2VuZCArIDEsICYgb3V0cHV0LCAxLCAwKTsKLSAgICAgIC8qIHBhcnNlX3J0KCkgY2FsbHMgZnJhZ19tb3JlKCkgZm9yIHVzLiAgKi8KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSTToKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgCi0gICAgICBpZiAocmVnID09IDAgfHwgcmVnID09IDE1KQotCWFzX2JhZCAoXygiYmFkIHN0YXJ0aW5nIHJlZ2lzdGVyOiByMCBhbmQgcjE1IGludmFsaWQiKSk7Ci0gICAgICAKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICctJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQkgIAotCSAgaWYgKHJlZyAhPSAxNSkKLQkgICAgYXNfYmFkIChfKCJlbmRpbmcgcmVnaXN0ZXIgbXVzdCBiZSByMTUiKSk7Ci0JICAKLQkgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0JICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSAgICArKyBvcF9lbmQ7Ci0JfQotICAgICAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCArKzsKLQkgIAotCSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLQkgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JICAgICsrIG9wX2VuZDsKLSAgCi0JICBpZiAoKiBvcF9lbmQgPT0gJygnKQotCSAgICB7Ci0JICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JICAgICAgCi0JICAgICAgaWYgKHJlZyAhPSAwKQotCQlhc19iYWQgKF8oImJhZCBiYXNlIHJlZ2lzdGVyOiBtdXN0IGJlIHIwIikpOwotCSAgICAgIAotCSAgICAgIGlmICgqIG9wX2VuZCA9PSAnKScpCi0JCW9wX2VuZCArKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBhc19iYWQgKF8oImJhc2UgcmVnaXN0ZXIgZXhwZWN0ZWQiKSk7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSUToKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgCi0gICAgICBpZiAocmVnICE9IDQpCi0JYXNfZmF0YWwgKF8oImZpcnN0IHJlZ2lzdGVyIG11c3QgYmUgcjQiKSk7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJy0nKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCSAgCi0JICBpZiAocmVnICE9IDcpCi0JICAgIGFzX2ZhdGFsIChfKCJsYXN0IHJlZ2lzdGVyIG11c3QgYmUgcjciKSk7Ci0JICAKLQkgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0JICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSAgICArKyBvcF9lbmQ7Ci0gIAotCSAgaWYgKCogb3BfZW5kID09ICcsJykKLQkgICAgewotCSAgICAgIG9wX2VuZCArKzsKLQkgICAgICAKLQkgICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotCSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JCSsrIG9wX2VuZDsKLSAgCi0JICAgICAgaWYgKCogb3BfZW5kID09ICcoJykKLQkJewotCQkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCQkgIAotCQkgIGlmIChyZWcgPj0gNCAmJiByZWcgPD0gNykKLQkJICAgIGFzX2ZhdGFsICgiYmFzZSByZWdpc3RlciBjYW5ub3QgYmUgcjQsIHI1LCByNiwgb3IgcjciKTsKLQkJICAKLQkJICBpbnN0IHw9IHJlZzsKLQkJICAKLQkJICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotCQkgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JCSAgICArKyBvcF9lbmQ7Ci0JCSAgCi0JCSAgaWYgKCogb3BfZW5kID09ICcpJykKLQkJICAgIG9wX2VuZCArKzsKLQkJfQotCSAgICAgIGVsc2UKLQkJYXNfYmFkIChfKCJiYXNlIHJlZ2lzdGVyIGV4cGVjdGVkIikpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJyZWctcmVnIGV4cGVjdGVkIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJSOgotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyc2VfZXhwIChvcF9lbmQgKyAxLCAmIGUpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgCi0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIG91dHB1dC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCwgCi0JCSAgIDIsICYgZSwgMSwgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBCTDoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWcgPDwgNDsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfZXhwIChvcF9lbmQgKyAxLCAmIGUpOwotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLQkgIAotCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBvdXRwdXQtZnJhZ19ub3ctPmZyX2xpdGVyYWwsIAotCQkgICAgICAgMiwgJiBlLCAxLCBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLQkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEpDOgotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyc2VfZXhwIChvcF9lbmQgKyAxLCAmIGUpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMzIpXS5ybHhfbGVuZ3RoLAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKENPTkRfSlVNUCwgQ09ORDEyKV0ucmx4X2xlbmd0aCwKLQkJCSBDIChDT05EX0pVTVAsIDApLCBlLlhfYWRkX3N5bWJvbCwgZS5YX2FkZF9udW1iZXIsIDApOwotICAgICAgaXNpemUgPSBDMzJfTEVOOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEpVOgotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyc2VfZXhwIChvcF9lbmQgKyAxLCAmIGUpOwotICAgICAgb3V0cHV0ID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDMyKV0ucmx4X2xlbmd0aCwKLQkJCSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QxMildLnJseF9sZW5ndGgsCi0JCQkgQyAoVU5DRF9KVU1QLCAwKSwgZS5YX2FkZF9zeW1ib2wsIGUuWF9hZGRfbnVtYmVyLCAwKTsKLSAgICAgIGlzaXplID0gVTMyX0xFTjsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBKTDoKLSAgICAgIGluc3QgPSBNQ09SRV9JTlNUX0pTUkk7CQkvKiBqc3JpICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9ydCAob3BfZW5kICsgMSwgJiBvdXRwdXQsIDEsICYgZSk7Ci0gICAgICAvKiBwYXJzZV9ydCgpIGNhbGxzIGZyYWdfbW9yZSBmb3IgdXMuICAqLwotICAgICAgCi0gICAgICAvKiBPbmx5IGRvIHRoaXMgaWYgd2Uga25vdyBob3cgdG8gZG8gaXQgLi4uICovCi0gICAgICBpZiAoZS5YX29wICE9IE9fYWJzZW50ICYmIGRvX2pzcmkyYnNyKQotCXsKLQkgIC8qIExvb2sgYXQgYWRkaW5nIHRoZSBSX1BDUkVMX0pTUklNTTExQlkyLiAgKi8KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgb3V0cHV0LWZyYWdfbm93LT5mcl9saXRlcmFsLCAKLQkJICAgICAgIDIsICYgZSwgMSwgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMik7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJTSToJCQkJLyogU0ksIGJ1dCBpbW0gYmVjb21lcyAzMi1pbW0gKi8KLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMxKTsKLQkgIAotCSAgcmVnID0gMzIgLSByZWc7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgRE8yMToJCQkvKiBPMiwgZHVwIHJkLCBsaXQgbXVzdCBiZSAxICovCi0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgaW5zdCB8PSByZWcgPDwgNDsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzEpOwotCSAgCi0JICBpZiAocmVnICE9IDEpCi0JICAgIGFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbXVzdCBiZSAxIikpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgU0lhOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzEpOwotCi0JICBpZiAocmVnID09IDApCi0JICAgIGFzX2JhZCAoXygiemVybyB1c2VkIGFzIGltbWVkaWF0ZSB2YWx1ZSIpKTsKLQkgIAotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJ1bmltcGxlbWVudGVkIG9wY29kZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgfQotICAKLSAgb3V0cHV0WzBdID0gSU5TVF9CWVRFMCAoaW5zdCk7Ci0gIG91dHB1dFsxXSA9IElOU1RfQllURTEgKGluc3QpOwotICAKLSAgY2hlY2tfbGl0ZXJhbHMgKG9wY29kZS0+dHJhbnNmZXIsIGlzaXplKTsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICAgIGNoYXIgKiBuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfbWNvcmVfZW5kICgpCi17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOwotfQotCi0vKiBWYXJpb3VzIHJvdXRpbmVzIHRvIGtpbGwgb25lIGRheS4gICovCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICogbGl0UDsKLSAgICAgaW50ICogc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIGludCAgICBpOwotICBjaGFyICogdDsKLSAgY2hhciAqIGF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX05UT0YoKSIpOwotICAgIH0KLSAgCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICAKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIAotICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0gICAgICB7Ci0JbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwKLQkJCSAgICBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICAgIH0KLSAgCi0gIHJldHVybiAwOwotfQotDAotQ09OU1QgY2hhciAqIG1kX3Nob3J0b3B0cyA9ICIiOwotCi0jZGVmaW5lIE9QVElPTl9KU1JJMkJTUl9PTgkoT1BUSU9OX01EX0JBU0UgKyAwKQotI2RlZmluZSBPUFRJT05fSlNSSTJCU1JfT0ZGCShPUFRJT05fTURfQkFTRSArIDEpCi0jZGVmaW5lIE9QVElPTl9TSUZJTFRFUl9PTgkoT1BUSU9OX01EX0JBU0UgKyAyKQotI2RlZmluZSBPUFRJT05fU0lGSUxURVJfT0ZGCShPUFRJT05fTURfQkFTRSArIDMpCi0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0gIHsgIm5vLWpzcmkyYnNyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9KU1JJMkJTUl9PRkZ9LAotICB7ICJqc3JpMmJzciIsICAgIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSlNSSTJCU1JfT059LAotICB7ICJzaWZpbHRlciIsICAgIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0lGSUxURVJfT059LAotICB7ICJuby1zaWZpbHRlciIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0lGSUxURVJfT0ZGfSwKLSAgeyBOVUxMLCAgICAgICAgICBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICogYXJnOwotewotICBpbnQgaTsKLSAgY2hhciAqIHA7Ci0KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICAgIAotICAgIGNhc2UgT1BUSU9OX0pTUkkyQlNSX09OOiAgZG9fanNyaTJic3IgPSAxOyAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0pTUkkyQlNSX09GRjogZG9fanNyaTJic3IgPSAwOyAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NJRklMVEVSX09OOiAgc2lmaWx0ZXJfbW9kZSA9IDE7IGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NJRklMVEVSX09GRjogc2lmaWx0ZXJfbW9kZSA9IDA7IGJyZWFrOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKiBzdHJlYW07Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotTUNPUkUgc3BlY2lmaWMgb3B0aW9uczpcblwKLSAgLXtuby19anNyaTJic3IJICB7ZGlzfWFibGUganNyaSB0byBic3IgdHJhbnNmb3JtYXRpb24gKGRlZjogZGlzKVxuXAotICAte25vLX1zaWZpbHRlcgkgIHtkaXN9YWJsZSBzaWxpY29uIGZpbHRlciBiZWhhdmlvciAoZGVmOiBkaXMpIikpOwotfQotDAotaW50IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9OZGRyLCB0b19OZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKiBwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fTmRkcjsKLSAgICAgYWRkcmVzc1QgdG9fTmRkcjsKLSAgICAgZnJhZ1MgKiBmcmFnOwotICAgICBzeW1ib2xTICogdG9fc3ltYm9sOwotewotICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjazogc2hvcnRfanVtcCIpKTsKLX0KLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX05kZHIsIHRvX05kZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqIHB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9OZGRyOwotICAgICBhZGRyZXNzVCB0b19OZGRyOwotICAgICBmcmFnUyAqIGZyYWc7Ci0gICAgIHN5bWJvbFMgKiB0b19zeW1ib2w7Ci17Ci0gIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrOiBsb25nX2p1bXAiKSk7Ci19Ci0KLS8qIENhbGxlZCBhZnRlciByZWxheGluZywgY2hhbmdlIHRoZSBmcmFncyBzbyB0aGV5IGtub3cgaG93IGJpZyB0aGV5IGFyZS4gICovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqIGZyYWdQOwotewotICB1bnNpZ25lZCBjaGFyICogYnVmZmVyOwotICBpbnQgdGFyZ19hZGRyID0gU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsgZnJhZ1AtPmZyX29mZnNldDsKLSAgCi0gIGJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWwpOwotICB0YXJnX2FkZHIgKz0gc3ltYm9sX2dldF9mcmFnIChmcmFnUC0+ZnJfc3ltYm9sKS0+ZnJfYWRkcmVzczsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgQ09ORDEyKToKLSAgICBjYXNlIEMgKFVOQ0RfSlVNUCwgVU5DRDEyKToKLSAgICAgIHsKLQkvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCWludCBuZXh0X2luc3QgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3MgKyAyOwotCXVuc2lnbmVkIGNoYXIgdDA7Ci0JaW50IGRpc3AgPSB0YXJnX2FkZHIgLSBuZXh0X2luc3Q7Ci0JCi0JaWYgKGRpc3AgJiAxKQotCSAgYXNfYmFkIChfKCJvZGQgZGlzcGxhY2VtZW50IGF0ICV4IiksIG5leHRfaW5zdCAtIDIpOwotCQotCWRpc3AgPj49IDE7Ci0JICB7Ci0JICAgIHQwID0gYnVmZmVyWzBdICYgMHhGODsKLQkKLQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWZmZXIsIGRpc3AsIDIpOwotCQotCSAgICBidWZmZXJbMF0gPSAoYnVmZmVyWzBdICYgMHgwNykgfCB0MDsKLQkgIH0KLQkKLQlmcmFnUC0+ZnJfZml4ICs9IDI7Ci0JZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EMzIpOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBVTkRFRl9XT1JEX0RJU1ApOgotICAgICAgewotCS8qIEEgY29uZGl0aW9uYWwgYnJhbmNoIHdvbnQgZml0IGludG8gMTIgYml0cyBzbzoKLQkgKgliIWNvbmQJMWYKLQkgKglqbXBpCTBmCi0JICoJLmFsaWduIDIKLQkgKiAwOgkubG9uZyBkaXNwCi0JICogMToKLQkgKgotCSAqIGlmIHRoZSBiIWNvbmQgaXMgNCBieXRlIGFsaWduZWQsIHRoZSBsaXRlcmFsIHdoaWNoIHdvdWxkCi0JICogZ28gYXQgeCs0IHdpbGwgYWxzbyBiZSBhbGlnbmVkLgotCSAqLwotCWludCBmaXJzdF9pbnN0ID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzOwotCWludCBuZWVkcGFkID0gKGZpcnN0X2luc3QgJiAzKTsKLQotCSAgYnVmZmVyWzBdIF49IDB4MDg7CS8qIFRvZ2dsZSBUL0YgYml0ICovCi0KLQlidWZmZXJbMl0gPSBJTlNUX0JZVEUwIChNQ09SRV9JTlNUX0pNUEkpOwkvKiBCdWlsZCBqbXBpICovCi0JYnVmZmVyWzNdID0gSU5TVF9CWVRFMSAoTUNPUkVfSU5TVF9KTVBJKTsKLSAKLQlpZiAobmVlZHBhZCkKLQkgIHsKLQkgICAgICB7Ci0JCWJ1ZmZlclsxXSA9IDQ7CS8qIGJyYW5jaCBvdmVyIGptcGksIHBhZCwgYW5kIHB0ciAqLwotCQlidWZmZXJbM10gPSAxOwkvKiBqbXBpIG9mZnNldCBvZiAxIGdldHMgdGhlIHBvaW50ZXIgKi8KLQkgICAgICB9Ci0JICAgIAotCSAgICBidWZmZXJbNF0gPSAwOwkvKiBhbGlnbm1lbnQvcGFkICovCi0JICAgIGJ1ZmZlcls1XSA9IDA7Ci0JICAgIGJ1ZmZlcls2XSA9IDA7CS8qIHNwYWNlIGZvciAzMiBiaXQgYWRkcmVzcyAqLwotCSAgICBidWZmZXJbN10gPSAwOwotCSAgICBidWZmZXJbOF0gPSAwOwotCSAgICBidWZmZXJbOV0gPSAwOwotCSAgICAKLQkgICAgLyogTWFrZSByZWxvYyBmb3IgdGhlIGxvbmcgZGlzcCAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDYsIDQsCi0JCSAgICAgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgQkZEX1JFTE9DXzMyKTsKLQkgICAgCi0JICAgIGZyYWdQLT5mcl9maXggKz0gQzMyX0xFTjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIC8qIFNlZSBjb21tZW50IGJlbG93IGFib3V0IHRoaXMgZ2l2ZW4gZ2FzJyBsaW1pdGF0aW9ucyBmb3IKLQkgICAgICAgc2hyaW5raW5nIHRoZSBmcmFnbWVudC4gJzMnIGlzIHRoZSBhbW91bnQgb2YgY29kZSB0aGF0Ci0JICAgICAgIHdlIGluc2VydGVkIGhlcmUsIGJ1dCAnNCcgaXMgcmlnaHQgZm9yIHRoZSBzcGFjZSB3ZSByZXNlcnZlZAotCSAgICAgICBmb3IgdGhpcyBmcmFnbWVudC4gKi8KLQkgICAgICB7Ci0JCWJ1ZmZlclsxXSA9IDM7CS8qIGJyYW5jaCBvdmVyIGptcGksIGFuZCBwdHIgKi8KLQkJYnVmZmVyWzNdID0gMDsJLyogam1waSBvZmZzZXQgb2YgMCBnZXRzIHRoZSBwb2ludGVyICovCi0JICAgICAgfQotCSAgICAKLQkgICAgYnVmZmVyWzRdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBhZGRyZXNzICovCi0JICAgIGJ1ZmZlcls1XSA9IDA7Ci0JICAgIGJ1ZmZlcls2XSA9IDA7Ci0JICAgIGJ1ZmZlcls3XSA9IDA7Ci0JICAgIAotCSAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwLiAgKi8KLQkgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA0LCA0LAotCQkgICAgIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsIDAsIEJGRF9SRUxPQ18zMik7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gQzMyX0xFTjsKLQotCSAgICAvKiBGcmFnIGlzIGFjdHVhbGx5IHNob3J0ZXIgKHNlZSB0aGUgb3RoZXIgc2lkZSBvZiB0aGlzIGlmZGVmKQotCSAgICAgICBidXQgZ2FzIGlzbid0IHByZXBhcmVkIGZvciB0aGF0LiAgV2UgaGF2ZSB0byByZS1hZGp1c3QKLQkgICAgICAgdGhlIGJyYW5jaCBkaXNwbGFjZW1lbnQgc28gdGhhdCBpdCBnb2VzIGJleW9uZCB0aGUgCi0JICAgICAgIGZ1bGwgbGVuZ3RoIG9mIHRoZSBmcmFnbWVudCwgbm90IGp1c3Qgd2hhdCB3ZSBhY3R1YWxseQotCSAgICAgICBmaWxsZWQgaW4uICAqLwotCSAgICAgIGJ1ZmZlclsxXSA9IDQ7CS8qIGptcGksIHB0ciwgYW5kIHRoZSAndGFpbCBwYWQnICovCi0JICB9Ci0JCi0JZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkNEMzIpOgotICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkRFRl9XT1JEX0RJU1ApOgotICAgICAgewotCS8qIEFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIHdpbGwgbm90IGZpdCBpbiAxMiBiaXRzLCBtYWtlIGNvZGUgd2hpY2gKLQkgICBsb29rcyBsaWtlOgotCSAgCWptcGkJMGYKLQkgIAkuYWxpZ24gMgotCSAgICAgMDoJLmxvbmcgZGlzcAotCSAgIHdlIG5lZWQgYSBwYWQgaWYgImZpcnN0X2luc3QiIGlzIDQgYnl0ZSBhbGlnbmVkLgotCSAgIFtiZWNhdXNlIHRoZSBuYXR1cmFsIGxpdGVyYWwgcGxhY2UgaXMgeCArIDJdICAqLwotCWludCBmaXJzdF9pbnN0ID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzOwotCWludCBuZWVkcGFkID0gIShmaXJzdF9pbnN0ICYgMyk7Ci0KLQlidWZmZXJbMF0gPSBJTlNUX0JZVEUwIChNQ09SRV9JTlNUX0pNUEkpOwkvKiBCdWlsZCBqbXBpICovCi0JYnVmZmVyWzFdID0gSU5TVF9CWVRFMSAoTUNPUkVfSU5TVF9KTVBJKTsKLQotCWlmIChuZWVkcGFkKQotCSAgewotCSAgICAgIGJ1ZmZlclsxXSA9IDE7CS8qIGptcGkgb2Zmc2V0IG9mIDEgc2luY2UgcGFkZGVkICovCi0JICAgIGJ1ZmZlclsyXSA9IDA7CS8qIGFsaWdubWVudCAqLwotCSAgICBidWZmZXJbM10gPSAwOwotCSAgICBidWZmZXJbNF0gPSAwOwkvKiBzcGFjZSBmb3IgMzIgYml0IGFkZHJlc3MgKi8KLQkgICAgYnVmZmVyWzVdID0gMDsKLQkgICAgYnVmZmVyWzZdID0gMDsKLQkgICAgYnVmZmVyWzddID0gMDsKLQkgICAgCi0JICAgIC8qIE1ha2UgcmVsb2MgZm9yIHRoZSBsb25nIGRpc3AuICAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDQsIDQsCi0JCSAgICAgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgQkZEX1JFTE9DXzMyKTsKLQkgICAgCi0JICAgIGZyYWdQLT5mcl9maXggKz0gVTMyX0xFTjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgICAgYnVmZmVyWzFdID0gMDsJLyogam1waSBvZmZzZXQgb2YgMCBpZiBubyBwYWQgKi8KLQkgICAgYnVmZmVyWzJdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBhZGRyZXNzICovCi0JICAgIGJ1ZmZlclszXSA9IDA7Ci0JICAgIGJ1ZmZlcls0XSA9IDA7Ci0JICAgIGJ1ZmZlcls1XSA9IDA7Ci0JICAgIAotCSAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwLiAgKi8KLQkgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCA0LAotCQkgICAgIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsIDAsIEJGRF9SRUxPQ18zMik7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gVTMyX0xFTjsKLQkgIH0KLQotCWZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBBcHBsaWVzIHRoZSBkZXNpcmVkIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCi0gICBBbHNvIHNldHMgdXAgYWRkZW5kcyBmb3IgJ3JlbGEnIHR5cGUgcmVsb2NhdGlvbnMuICAqLwotaW50Ci1tZF9hcHBseV9maXgzIChmaXhQLCB2YWxwLCBzZWdtZW50KQotICAgICBmaXhTICogICBmaXhQOwotICAgICB2YWx1ZVQgKiB2YWxwOwotICAgICBzZWdUICAgICBzZWdtZW50OwotewotICBjaGFyICogICAgICAgYnVmICA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgY2hhciAqICAgICAgIGZpbGUgPSBmaXhQLT5meF9maWxlID8gZml4UC0+ZnhfZmlsZSA6IF8oInVua25vd24iKTsKLSAgY29uc3QgY2hhciAqIHN5bW5hbWU7Ci0gIC8qIE5vdGU6IHVzZSBvZmZzZXRUIGJlY2F1c2UgaXQgaXMgc2lnbmVkLCB2YWx1ZVQgaXMgdW5zaWduZWQuICAqLwotICBvZmZzZXRUICAgICAgdmFsICA9IChvZmZzZXRUKSAqIHZhbHA7IAotICAKLSAgc3ltbmFtZSA9IGZpeFAtPmZ4X2FkZHN5ID8gU19HRVRfTkFNRSAoZml4UC0+ZnhfYWRkc3kpIDogXygiPHVua25vd24+Iik7Ci0gIC8qIFNhdmUgdGhpcyBmb3IgdGhlIGFkZGVuZCBpbiB0aGUgcmVsb2NhdGlvbiByZWNvcmQuICAqLwotICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWw7Ci0KLSAgLyogSWYgdGhlIGZpeCBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB3aGljaCBpcyBub3QgZGVmaW5lZCwgb3Igbm90Ci0gICAgIGluIHRoZSBzYW1lIHNlZ21lbnQgYXMgdGhlIGZpeCwgd2UgY2Fubm90IHJlc29sdmUgaXQgaGVyZS4gICovCi0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0gICAgICAmJiAoICAgISBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCSAgfHwgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWdtZW50KSkpCi0gICAgewotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogRm9yIEVMRiB3ZSBjYW4ganVzdCByZXR1cm4gYW5kIGxldCB0aGUgcmVsb2MgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZAotCSB0YWtlIGNhcmUgb2YgZXZlcnl0aGluZy4gIEZvciBDT0ZGIHdlIHN0aWxsIGhhdmUgdG8gaW5zZXJ0ICd2YWwnCi0JIGludG8gdGhlIGluc24gc2luY2UgdGhlIGFkZGVuZCBmaWVsZCB3aWxsIGJlIGlnbm9yZWQuICAqLwotICAgICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICBmaXhQLT5meF9kb25lID0gMTsKLSAgCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMjogICAgIC8qIHNlY29uZCBieXRlIG9mIDIgYnl0ZSBvcGNvZGUgKi8KLSAgICAgIGlmICgodmFsICYgMSkgIT0gMCkKLQlhc19iYWRfd2hlcmUgKGZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIm9kZCBkaXN0YW5jZSBicmFuY2ggKDB4JXggYnl0ZXMpIiksIHZhbCk7Ci0gICAgICB2YWwgLz0gMjsKLSAgICAgIGlmICgoKHZhbCAmIH4weDNmZikgIT0gMCkgJiYgKCh2YWwgfCAweDNmZikgIT0gLTEpKQotCWFzX2JhZF93aGVyZSAoZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygicGNyZWwgZm9yIGJyYW5jaCB0byAlcyB0b28gZmFyICgweCV4KSIpLAotCQkgICAgICBzeW1uYW1lLCB2YWwpOwotICAgICAgICBidWZbMF0gfD0gKCh2YWwgPj4gOCkgJiAweDcpOwotICAgICAgICBidWZbMV0gfD0gKHZhbCAmIDB4ZmYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0OgkvKiBsb3dlciA4IGJpdHMgb2YgMiBieXRlIG9wY29kZSAqLwotICAgICAgdmFsICs9IDM7Ci0gICAgICB2YWwgLz0gNDsKLSAgICAgIGlmICh2YWwgJiB+MHhmZikKLQlhc19iYWRfd2hlcmUgKGZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oInBjcmVsIGZvciBscncvam1waS9qc3JpIHRvICVzIHRvbyBmYXIgKDB4JXgpIiksCi0JCSAgICAgIHN5bW5hbWUsIHZhbCk7Ci0gICAgICBlbHNlCi0JYnVmWzFdIHw9ICh2YWwgJiAweGZmKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMjoJLyogbG9vcHQgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGlmICgodmFsIDwgLTMyKSB8fCAodmFsID4gLTIpKQotCWFzX2JhZF93aGVyZSAoZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICAgXygicGNyZWwgZm9yIGxvb3B0IHRvbyBmYXIgKDB4JXgpIiksIHZhbCk7Ci0gICAgICB2YWwgLz0gMjsKLSAgICAgICAgYnVmWzFdIHw9ICh2YWwgJiAweGYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTI6Ci0gICAgICAvKiBDb25kaXRpb25hbCBsaW5rZXIgbWFwIGpzcmkgdG8gYnNyLiAgKi8KLSAgICAgIC8qIElmIGl0cyBhIGxvY2FsIHRhcmdldCBhbmQgY2xvc2UgZW5vdWdoLCBmaXggaXQuIAotICAgICAgICAgTkI6ID49IC0yayBmb3IgYmFja3dhcmRzIGJzcjsgPCAyayBmb3IgZm9yd2FyZHMuLi4gICovCi0gICAgICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCAmJiB2YWwgPj0gLTIwNDggICYmIHZhbCA8IDIwNDgpCi0JewotCSAgbG9uZyBudmFsID0gKHZhbCAvIDIpICYgMHg3ZmY7Ci0JICBudmFsIHw9IE1DT1JFX0lOU1RfQlNSOwotCSAgCi0JICAvKiBSRVBMQUNFIHRoZSBpbnN0cnVjdGlvbiwgZG9uJ3QganVzdCBtb2RpZnkgaXQuICAqLwotCSAgYnVmWzBdID0gSU5TVF9CWVRFMCAobnZhbCk7Ci0JICBidWZbMV0gPSBJTlNUX0JZVEUxIChudmFsKTsKLQl9Ci0gICAgICBlbHNlCi0JZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMXzMyOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0JewotCSAgLyogSWYgdGhlIGZpeCBpcyBhbiBhYnNvbHV0ZSByZWxvYyBiYXNlZCBvbiBhIHN5bWJvbCdzCi0JICAgICBhZGRyZXNzLCB0aGVuIGl0IGNhbm5vdCBiZSByZXNvbHZlZCB1bnRpbCB0aGUgZmluYWwgbGluay4gICovCi0JICBmaXhQLT5meF9kb25lID0gMDsKLQl9Ci0jaWZkZWYgT0JKX0VMRiAgICAgIAotICAgICAgZWxzZQotI2VuZGlmCi0JewotCSAgaWYgKGZpeFAtPmZ4X3NpemUgPT0gNCkKLQkgICAgOwotCSAgZWxzZSBpZiAoZml4UC0+Znhfc2l6ZSA9PSAyICYmIHZhbCA+PSAtMzI3NjggJiYgdmFsIDw9IDMyNzY3KQotCSAgICA7Ci0JICBlbHNlIGlmIChmaXhQLT5meF9zaXplID09IDEgJiYgdmFsID49IC0yNTYgJiYgdmFsIDw9IDI1NSkKLQkgICAgOwotCSAgZWxzZQotCSAgICBhYm9ydCAoKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIGZpeFAtPmZ4X3NpemUpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gMDsgLyogUmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuICAqLwotfQotCi12b2lkCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKLXsKLSAgLyogSWdub3JlIGxlYWRpbmcgaGFzaCBzeW1ib2wsIGlmIHBvcmVzZW50LiAgKi8KLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0gICAgICBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgfQotfQotCi1pbnQgbWRfbG9uZ19qdW1wX3NpemU7Ci0KLS8qIENhbGxlZCBqdXN0IGJlZm9yZSBhZGRyZXNzIHJlbGF4YXRpb24sIHJldHVybiB0aGUgbGVuZ3RoCi0gICBieSB3aGljaCBhIGZyYWdtZW50IG11c3QgZ3JvdyB0byByZWFjaCBpdCdzIGRlc3RpbmF0aW9uLiAgKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICogZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEMgKFVOQ0RfSlVNUCwgVU5ERUZfRElTUCk6Ci0gICAgICAvKiBVc2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93bi4gICovCi0gICAgICBpZiAoIWZyYWdQLT5mcl9zeW1ib2wpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChVTkNEX0pVTVAsIFVOQ0QxMik7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMTIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKFVOQ0RfSlVNUCwgVU5DRDEyKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QxMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoVU5DRF9KVU1QLCBVTkRFRl9XT1JEX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDMyKV0ucmx4X2xlbmd0aDsKLQkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QzMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICAKLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgVU5ERUZfRElTUCk6Ci0gICAgICAvKiBVc2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93bi4gKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfc3ltYm9sCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgLyogR290IGEgc3ltYm9sIGFuZCBpdCdzIGRlZmluZWQgaW4gdGhpcyBzZWdtZW50LCBiZWNvbWUgYnl0ZQotCSAgICAgc2l6ZWQgLSBtYXliZSBpdCB3aWxsIGZpeCB1cCAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChDT05EX0pVTVAsIENPTkQxMik7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMTIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UgaWYgKGZyYWdQLT5mcl9zeW1ib2wpCi0JewotCSAgLyogSXRzIGdvdCBhIHNlZ21lbnQsIGJ1dCBpdHMgbm90IG91cnMsIHNvIGl0IHdpbGwgYWx3YXlzIGJlIGxvbmcuICAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChDT05EX0pVTVAsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMzIpXS5ybHhfbGVuZ3RoOwotCSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW0MgKENPTkRfSlVNUCwgQ09ORDMyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2Uga25vdyB0aGUgYWJzIHZhbHVlLiAgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoQ09ORF9KVU1QLCBDT05EMTIpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKENPTkRfSlVNUCwgQ09ORDEyKV0ucmx4X2xlbmd0aDsKLQl9Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIHJldHVybiBmcmFnUC0+ZnJfdmFyOwotfQotCi0vKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIuICAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIHVzZSwgbmJ5dGVzKQotICAgICBjaGFyICogcHRyOwotICAgICB2YWx1ZVQgdXNlOwotICAgICBpbnQgbmJ5dGVzOwotewotICAgIHN3aXRjaCAobmJ5dGVzKQotICAgICAgewotICAgICAgY2FzZSA0OiAqcHRyKysgPSAodXNlID4+IDI0KSAmIDB4ZmY7IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAzOiAqcHRyKysgPSAodXNlID4+IDE2KSAmIDB4ZmY7IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAyOiAqcHRyKysgPSAodXNlID4+ICA4KSAmIDB4ZmY7IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAxOiAqcHRyKysgPSAodXNlID4+ICAwKSAmIDB4ZmY7ICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0gICAgICB9Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiBzaXplOwkJCS8qIEJ5dGUgYWxpZ25tZW50IGlzIGZpbmUgKi8KLX0KLQotCi0vKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCi0gICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLWxvbmcKLW1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4cCwgc2VjKQotICAgICBmaXhTICogZml4cDsKLSAgICAgc2VnVCBzZWM7Ci17Ci0jaWZkZWYgT0JKX0VMRgotICAvKiBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBvciBkZWZpbmVkIGluIGFub3RoZXIgc2VjdGlvbgotICAgICB3ZSBsZWF2ZSB0aGUgYWRkIG51bWJlciBhbG9uZSBmb3IgdGhlIGxpbmtlciB0byBmaXggaXQgbGF0ZXIuCi0gICAgIE9ubHkgYWNjb3VudCBmb3IgdGhlIFBDIHByZS1idW1wICh3aGljaCBpcyAyIGJ5dGVzIG9uIHRoZSBNQ29yZSkuICovCi0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiAoISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQotCSAgfHwgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBzZWMpKSkKLSAgICAgIAotICB7Ci0gICAgYXNzZXJ0IChmaXhwLT5meF9zaXplID09IDIpOwkvKiBtdXN0IGJlIGFuIGluc24gKi8KLSAgICByZXR1cm4gZml4cC0+Znhfc2l6ZTsKLSAgfQotI2VuZGlmCi0KLSAgLyogVGhlIGNhc2Ugd2hlcmUgd2UgYXJlIGdvaW5nIHRvIHJlc29sdmUgdGhpbmdzLi4uICovCi0gIHJldHVybiAgZml4cC0+Znhfc2l6ZSArIGZpeHAtPmZ4X3doZXJlICsgZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotI2RlZmluZSBGKFNaLFBDUkVMKQkJKCgoU1opIDw8IDEpICsgKFBDUkVMKSkKLSNkZWZpbmUgTUFQKFNaLFBDUkVMLFRZUEUpCWNhc2UgRiAoU1osIFBDUkVMKTogY29kZSA9IChUWVBFKTsgYnJlYWsKLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLSAgICAgZml4UyAqIGZpeHA7Ci17Ci0gIGFyZWxlbnQgKiByZWw7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotICBpbnQgaGFuZGxlZCA9IDA7Ci0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgICAgLyogVGhlc2UgY29uZnVzZSB0aGUgc2l6ZS9wY3JlbCBtYWNybyBhcHByb2FjaC4gKi8KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0OgotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyOgotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6ICAgICAgCi0gICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIHN3aXRjaCAoRiAoZml4cC0+Znhfc2l6ZSwgZml4cC0+ZnhfcGNyZWwpKQotICAgICAgICB7Ci0gICAgICAgICAgTUFQICgxLCAwLCBCRkRfUkVMT0NfOCk7Ci0gICAgICAgICAgTUFQICgyLCAwLCBCRkRfUkVMT0NfMTYpOwotICAgICAgICAgIE1BUCAoNCwgMCwgQkZEX1JFTE9DXzMyKTsKLSAgICAgICAgICBNQVAgKDEsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgICAgICBNQVAgKDIsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICAgICAgTUFQICg0LCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgICBkZWZhdWx0OgotCSAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgICAgICAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSAlc3JlbG9jYXRpb24iKSwKLQkJICBmaXhwLT5meF9zaXplLAotCSAgICAgICAgICBmaXhwLT5meF9wY3JlbCA/IF8oInBjLXJlbGF0aXZlIikgOiAiIik7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmVsID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbC0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIC8qIEFsd2F5cyBwYXNzIHRoZSBhZGRlbmQgYWxvbmchICAqLwotICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLQotICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICAKLSAgaWYgKHJlbC0+aG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgIF8oIkNhbm5vdCByZXByZXNlbnQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0gICAgICAgICAgICAgICAgICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7Ci0gICAgICAKLSAgICAgIC8qIFNldCBob3d0byB0byBhIGdhcmJhZ2UgdmFsdWUgc28gdGhhdCB3ZSBjYW4ga2VlcCBnb2luZy4gICovCi0gICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIEJGRF9SRUxPQ18zMik7Ci0gICAgICBhc3NlcnQgKHJlbC0+aG93dG8gIT0gTlVMTCk7Ci0gICAgfQotCi0gIHJldHVybiByZWw7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBTZWUgd2hldGhlciB3ZSBuZWVkIHRvIGZvcmNlIGEgcmVsb2NhdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgIFRoaXMgaXMgdXNlZCB0byBmb3JjZSBvdXQgc3dpdGNoIGFuZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aGVuCi0gICByZWxheGluZy4gICovCi1pbnQKLW1jb3JlX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKLSAgICAgZml4UyAqIGZpeDsKLXsKLSAgaWYgKCAgIGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19SVkEpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBmaXggY2FuIGJlIGhhbmRsZWQgYnkgR0FTLCBmYWxzZSBpZiBpdCBtdXN0Ci0gICBiZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbGlua2VyLiAgKi8KLWJvb2xlYW4KLW1jb3JlX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgZml4UyAqIGZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcy4gICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gMTsKLX0KLSNlbmRpZiAvKiBPQkpfRUxGICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1jb3JlLmggYi9nYXMvY29uZmlnL3RjLW1jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjEzMjIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1tY29yZS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZglUQ19NQ09SRQotI2RlZmluZSBUQ19NQ09SRSAxCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBNQ09SRSBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9BUkNICWJmZF9hcmNoX21jb3JlCi0vKiBVc2VkIHRvIGluaXRpYWxpc2UgdGFyZ2V0X2JpZ19lbmRpYW4uICAqLwotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLS8qIERvbid0IHdyaXRlIG91dCByZWxvY3MgZm9yIHBjcmVsIHN0dWZmLiAgKi8KLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKCgoeCktPmZ4X2FkZHN5IHx8ICh4KS0+Znhfc3Vic3kpICYmIFwKLQkJCSAgICh4KS0+Znhfcl90eXBlIDwgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQpCi0KLSNkZWZpbmUgSUdOT1JFX05PTlNUQU5EQVJEX0VTQ0FQRVMKLQotI2RlZmluZSBUQ19SRUxPQ19NQU5HTEUoYSxiLGMpIHRjX3JlbG9jX21hbmdsZSAoYSwgYiwgYykKLQotLyogU29tZSBwc2V1ZG8tb3Agc2VtYW50aWMgZXh0ZW5zaW9ucy4gICovCi0jZGVmaW5lCVBTRVVET19MQ09NTV9PUFRJT05BTF9BTElHTgotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICAgICAgICAJIk0uQ09SRSBHQVMgVmVyc2lvbiAyLjkuNCIKLSNkZWZpbmUgTElTVElOR19MSFNfQ09OVF9MSU5FUwk0Ci0KLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUJMQotI2RlZmluZSBDT0ZGX0ZMQUdTIAkxCi0KLS8qIFdlIHdhbnQgbG9jYWwgbGFiZWwgc3VwcG9ydC4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0gICAgIAotI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAgKGZyYWcpCi0gIAotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLSNkZWZpbmUgbWRfZW5kCW1kX21jb3JlX2VuZAotCi0vKiBXYW50IHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uIHRvby4uLiAqLwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gKEZJWFAsIFNFQykKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzICAvKiBXZSB3YW50IHRoZSBzZWdtZW50IGFzIHdlbGwuICAqLwotCi0KLQotI2lmZGVmICBPQkpfQ09GRgotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJKHRhcmdldF9iaWdfZW5kaWFuID8gInBlLW1jb3JlLWJpZyIgOiAicGUtbWNvcmUtbGl0dGxlIikKLQotc3RydWN0IG1jb3JlX3RjX3N5Ci17Ci0gIGludCBzeV9mbGFnczsKLX07Ci0KLSNkZWZpbmUgVENfU1lNRklFTERfVFlQRSBzdHJ1Y3QgbWNvcmVfdGNfc3kKLQotIyBpZiBkZWZpbmVkIFRFX1BFCi0jICBkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTih4KSAoKHgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1JWQSkKLSMgZW5kaWYKLQotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLQotI2lmZGVmIE9CSl9FTEYKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJlbGYzMi1tY29yZS1iaWciIDogImVsZjMyLW1jb3JlLWxpdHRsZSIpCi0KLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIuY3RvcnMiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LCBcCi0gIHsgIi5kdG9ycyIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKLS8qIE90aGVyIHNwZWNpYWwgc2VjdGlvbnMgbm90IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyOiAucmVnaW5mbywKLSAgIC5saWJsaXN0LCAuY29uZmxpY3QsIC5ncHRhYiwgLmdvdCwgLmR5bmFtaWMsIC5yZWwuZHluLiAgKi8KLQotLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byBlbWl0IHZhcmlvdXMgcmVsb2NzIHdlIG90aGVyd2lzZSB3b3VsZG4ndC4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4KSBtY29yZV9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi1leHRlcm4gaW50IG1jb3JlX2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLSNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIG1jb3JlX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotZXh0ZXJuIGJvb2xlYW4gbWNvcmVfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotIyBlcnJvciBObyB0YXJnZXQgZm9ybWF0IHNwZWNpZmllZC4KLSNlbmRpZgotCi0jaW5jbHVkZSAid3JpdGUuaCIgICAgICAgIC8qIEZvciBkZWZpbml0aW9uIG9mIGZpeFMgKi8KLSAgCi1leHRlcm4gdm9pZCAgICAgIG1kX2JlZ2luICAgICAgICAgICAgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9hc3NlbWJsZSAgICAgICAgIFBBUkFNUyAoKGNoYXIgKikpOwotZXh0ZXJuIHN5bWJvbFMgKiBtZF91bmRlZmluZWRfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9tY29yZV9lbmQgICAgICAgIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBjaGFyICogICAgbWRfYXRvZiAgICAgICAgICAgICBQQVJBTVMgKChpbnQsIGNoYXIgKiwgaW50ICopKTsKLWV4dGVybiBpbnQgICAgICAgbWRfcGFyc2Vfb3B0aW9uICAgICBQQVJBTVMgKChpbnQsIGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9zaG93X3VzYWdlICAgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9jcmVhdGVfc2hvcnRfanVtcCAKLSAgUEFSQU1TICgoY2hhciAqLCBhZGRyZXNzVCwgYWRkcmVzc1QsIGZyYWdTICosIHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9jcmVhdGVfbG9uZ19qdW1wCi0gIFBBUkFNUyAoKGNoYXIgKiwgYWRkcmVzc1QsIGFkZHJlc3NULCBmcmFnUyAqLCBzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkICAgICAgbWRfY29udmVydF9mcmFnICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIHNlZ1QsIGZyYWdTICopKTsKLWV4dGVybiBpbnQgICAgICAgbWRfYXBwbHlfZml4MyAgICAgICAgICAgICAgICAgUEFSQU1TICgoZml4UyAqLCB2YWx1ZVQgKiwgc2VnVCkpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9vcGVyYW5kICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Ci1leHRlcm4gaW50ICAgICAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IFBBUkFNUyAoKGZyYWdTICosIHNlZ1QpKTsKLWV4dGVybiB2b2lkICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICAgICAgICAgICAgUEFSQU1TICgoY2hhciAqLCB2YWx1ZVQsIGludCkpOwotZXh0ZXJuIHZhbHVlVCAgICBtZF9zZWN0aW9uX2FsaWduICAgICAgICAgICAgICBQQVJBTVMgKChzZWdULCB2YWx1ZVQpKTsKLWV4dGVybiBsb25nICAgICAgbWRfcGNyZWxfZnJvbV9zZWN0aW9uICAgICAgICAgUEFSQU1TICgoZml4UyAqLCBzZWdUKSk7Ci1leHRlcm4gYXJlbGVudCAqIHRjX2dlbl9yZWxvYyAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKGFzZWN0aW9uICosIGZpeFMgKikpOwotCi0jZW5kaWYgLyogVENfTUNPUkUgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbWlwcy5jIGIvZ2FzL2NvbmZpZy90Yy1taXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZmRjYTcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTc3MiArMCwwIEBACi0vKiB0Yy1taXBzLmMgLS0gYXNzZW1ibGUgY29kZSBmb3IgYSBNSVBTIGNoaXAuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBPU0YgYW5kIFJhbHBoIENhbXBiZWxsLgotICAgV3JpdHRlbiBieSBLZWl0aCBLbm93bGVzIGFuZCBSYWxwaCBDYW1wYmVsbCwgd29ya2luZyBpbmRlcGVuZGVudGx5LgotICAgTW9kaWZpZWQgZm9yIEVDT0ZGIGFuZCBSNDAwMCBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3Igb2YgQ3lnbnVzCi0gICBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZmRlZiBVU0VfU1REQVJHCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZW5kaWYKLSNpZmRlZiBVU0VfVkFSQVJHUwotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKLSNpbmNsdWRlICJpdGJsLW9wcy5oIgotCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgREJHKHgpIHByaW50ZiB4Ci0jZWxzZQotI2RlZmluZSBEQkcoeCkKLSNlbmRpZgotCi0jaWZkZWYgT0JKX01BWUJFX0VMRgotLyogQ2xlYW4gdXAgbmFtZXNwYWNlIHNvIHdlIGNhbiBpbmNsdWRlIG9iai1lbGYuaCB0b28uICAqLwotc3RhdGljIGludCBtaXBzX291dHB1dF9mbGF2b3IgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBtaXBzX291dHB1dF9mbGF2b3IgKCkgeyByZXR1cm4gT1VUUFVUX0ZMQVZPUjsgfQotI3VuZGVmIE9CSl9QUk9DRVNTX1NUQUIKLSN1bmRlZiBPVVRQVVRfRkxBVk9SCi0jdW5kZWYgU19HRVRfQUxJR04KLSN1bmRlZiBTX0dFVF9TSVpFCi0jdW5kZWYgU19TRVRfQUxJR04KLSN1bmRlZiBTX1NFVF9TSVpFCi0jdW5kZWYgb2JqX2Zyb2JfZmlsZQotI3VuZGVmIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi0jdW5kZWYgb2JqX2Zyb2Jfc3ltYm9sCi0jdW5kZWYgb2JqX3BvcF9pbnNlcnQKLSN1bmRlZiBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MKLSN1bmRlZiBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUwotCi0jaW5jbHVkZSAib2JqLWVsZi5oIgotLyogRml4IGFueSBvZiB0aGVtIHRoYXQgd2UgYWN0dWFsbHkgY2FyZSBhYm91dC4gICovCi0jdW5kZWYgT1VUUFVUX0ZMQVZPUgotI2RlZmluZSBPVVRQVVRfRkxBVk9SIG1pcHNfb3V0cHV0X2ZsYXZvcigpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLSNlbmRpZgotCi0jaWZuZGVmIEVDT0ZGX0RFQlVHR0lORwotI2RlZmluZSBOT19FQ09GRl9ERUJVR0dJTkcKLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIDAKLSNlbmRpZgotCi0jaW5jbHVkZSAiZWNvZmYuaCIKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi1zdGF0aWMgY2hhciAqbWlwc19yZWdtYXNrX2ZyYWc7Ci0jZW5kaWYKLQotI2RlZmluZSBBVCAgMQotI2RlZmluZSBUUkVHIDI0Ci0jZGVmaW5lIFBJQ19DQUxMX1JFRyAyNQotI2RlZmluZSBLVDAgMjYKLSNkZWZpbmUgS1QxIDI3Ci0jZGVmaW5lIEdQICAyOAotI2RlZmluZSBTUCAgMjkKLSNkZWZpbmUgRlAgIDMwCi0jZGVmaW5lIFJBICAzMQotCi0jZGVmaW5lIElMTEVHQUxfUkVHICgzMikKLQotLyogQWxsb3cgb3ZlcnJpZGUgb2Ygc3RhbmRhcmQgbGl0dGxlLWVuZGlhbiBFQ09GRiBmb3JtYXQuICAqLwotCi0jaWZuZGVmIEVDT0ZGX0xJVFRMRV9GT1JNQVQKLSNkZWZpbmUgRUNPRkZfTElUVExFX0ZPUk1BVCAiZWNvZmYtbGl0dGxlbWlwcyIKLSNlbmRpZgotCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0vKiAxIGlzIHdlIHNob3VsZCB1c2UgdGhlIDY0IGJpdCBNSVBTIEVMRiBBQkksIDAgaWYgd2Ugc2hvdWxkIHVzZSB0aGUKLSAgIDMyIGJpdCBBQkkuICBUaGlzIGhhcyBubyBtZWFuaW5nIGZvciBFQ09GRi4KLSAgIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBpcyBhbHdheXMgMzIgYml0LCBldmVuIGlmICJjb25maWd1cmVkIiBmb3IKLSAgIDY0IGJpdCBbZS5nLiAtLXRhcmdldD1taXBzNjQtZWxmXS4gICovCi1zdGF0aWMgaW50IG1pcHNfNjQ7Ci0KLS8qIFRoZSBkZWZhdWx0IHRhcmdldCBmb3JtYXQgdG8gdXNlLiAgKi8KLWNvbnN0IGNoYXIgKgotbWlwc190YXJnZXRfZm9ybWF0ICgpCi17Ci0gIHN3aXRjaCAoT1VUUFVUX0ZMQVZPUikKLSAgICB7Ci0gICAgY2FzZSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cjoKLSAgICAgIHJldHVybiB0YXJnZXRfYmlnX2VuZGlhbiA/ICJhLm91dC1taXBzLWJpZyIgOiAiYS5vdXQtbWlwcy1saXR0bGUiOwotICAgIGNhc2UgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyOgotICAgICAgcmV0dXJuIHRhcmdldF9iaWdfZW5kaWFuID8gImVjb2ZmLWJpZ21pcHMiIDogRUNPRkZfTElUVExFX0ZPUk1BVDsKLSAgICBjYXNlIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXI6Ci0gICAgICByZXR1cm4gKHRhcmdldF9iaWdfZW5kaWFuCi0JICAgICAgPyAobWlwc182NCA/ICJlbGY2NC1iaWdtaXBzIiA6ICJlbGYzMi1iaWdtaXBzIikKLQkgICAgICA6IChtaXBzXzY0ID8gImVsZjY0LWxpdHRsZW1pcHMiIDogImVsZjMyLWxpdHRsZW1pcHMiKSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0vKiBUaGUgbmFtZSBvZiB0aGUgcmVhZG9ubHkgZGF0YSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgUkRBVEFfU0VDVElPTl9OQU1FIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyIFwKLQkJCSAgICA/ICIuZGF0YSIgXAotCQkJICAgIDogT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIgXAotCQkJICAgID8gIi5yZGF0YSIgXAotCQkJICAgIDogT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyIFwKLQkJCSAgICA/ICIucm9kYXRhIiBcCi0JCQkgICAgOiAoYWJvcnQgKCksICIiKSkKLQotLyogVGhpcyBpcyB0aGUgc2V0IG9mIG9wdGlvbnMgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIGJ5IHRoZSAuc2V0Ci0gICBwc2V1ZG8tb3AuICBXZSB1c2UgYSBzdHJ1Y3Qgc28gdGhhdCAuc2V0IHB1c2ggYW5kIC5zZXQgcG9wIGFyZSBtb3JlCi0gICByZWxpYWJsZS4gICovCi0KLXN0cnVjdCBtaXBzX3NldF9vcHRpb25zCi17Ci0gIC8qIE1JUFMgSVNBIChJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlKSBsZXZlbC4gIFRoaXMgaXMgc2V0IHRvIC0xCi0gICAgIGlmIGl0IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gIENoYW5nZWQgYnkgYC5zZXQgbWlwc04nLCBhbmQgdGhlCi0gICAgIC1taXBzTiBjb21tYW5kIGxpbmUgb3B0aW9uLCBhbmQgdGhlIGRlZmF1bHQgQ1BVLiAgKi8KLSAgaW50IGlzYTsKLSAgLyogV2hldGhlciB3ZSBhcmUgYXNzZW1ibGluZyBmb3IgdGhlIG1pcHMxNiBwcm9jZXNzb3IuICAwIGlmIHdlIGFyZQotICAgICBub3QsIDEgaWYgd2UgYXJlLCBhbmQgLTEgaWYgdGhlIHZhbHVlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4KLSAgICAgQ2hhbmdlZCBieSBgLnNldCBtaXBzMTYnIGFuZCBgLnNldCBub21pcHMxNicsIGFuZCB0aGUgLW1pcHMxNiBhbmQKLSAgICAgLW5vbWlwczE2IGNvbW1hbmQgbGluZSBvcHRpb25zLCBhbmQgdGhlIGRlZmF1bHQgQ1BVLiAgKi8KLSAgaW50IG1pcHMxNjsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIG5vdCByZW9yZGVyIGluc3RydWN0aW9ucy4gIENoYW5nZWQgYnkgYC5zZXQKLSAgICAgcmVvcmRlcicgYW5kIGAuc2V0IG5vcmVvcmRlcicuICAqLwotICBpbnQgbm9yZW9yZGVyOwotICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgbm90IHBlcm1pdCB0aGUgJGF0ICgkMSkgcmVnaXN0ZXIgdG8gYmUgdXNlZAotICAgICBpbiBpbnN0cnVjdGlvbnMuICBDaGFuZ2VkIGJ5IGAuc2V0IGF0JyBhbmQgYC5zZXQgbm9hdCcuICAqLwotICBpbnQgbm9hdDsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIHdhcm4gd2hlbiBhIG1hY3JvIGluc3RydWN0aW9uIGV4cGFuZHMgaW50bwotICAgICBtb3JlIHRoYW4gb25lIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uICBDaGFuZ2VkIGJ5IGAuc2V0IG5vbWFjcm8nIGFuZAotICAgICBgLnNldCBtYWNybycuICAqLwotICBpbnQgd2Fybl9hYm91dF9tYWNyb3M7Ci0gIC8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCBub3QgbW92ZSBpbnN0cnVjdGlvbnMuICBDaGFuZ2VkIGJ5IGAuc2V0Ci0gICAgIG1vdmUnLCBgLnNldCB2b2xhdGlsZScsIGAuc2V0IG5vbW92ZScsIGFuZCBgLnNldCBub3ZvbGF0aWxlJy4gICovCi0gIGludCBub21vdmU7Ci0gIC8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCBub3Qgb3B0aW1pemUgYnJhbmNoZXMgYnkgbW92aW5nIHRoZSB0YXJnZXQKLSAgICAgb2YgdGhlIGJyYW5jaCBpbnRvIHRoZSBkZWxheSBzbG90LiAgQWN0dWFsbHksIHdlIGRvbid0IHBlcmZvcm0KLSAgICAgdGhpcyBvcHRpbWl6YXRpb24gYW55aG93LiAgQ2hhbmdlZCBieSBgLnNldCBib3B0JyBhbmQgYC5zZXQKLSAgICAgbm9ib3B0Jy4gICovCi0gIGludCBub2JvcHQ7Ci0gIC8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCBub3QgYXV0b2V4dGVuZCBtaXBzMTYgaW5zdHJ1Y3Rpb25zLgotICAgICBDaGFuZ2VkIGJ5IGAuc2V0IGF1dG9leHRlbmQnIGFuZCBgLnNldCBub2F1dG9leHRlbmQnLiAgKi8KLSAgaW50IG5vYXV0b2V4dGVuZDsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIHN0cnVjdCB3ZSB1c2UgdG8gaG9sZCB0aGUgY3VycmVudCBzZXQgb2Ygb3B0aW9ucy4gIE5vdGUKLSAgIHRoYXQgd2UgbXVzdCBzZXQgdGhlIGlzYSBhbmQgbWlwczE2IGZpZWxkcyB0byAtMSB0byBpbmRpY2F0ZSB0aGF0Ci0gICB0aGV5IGhhdmUgbm90IGJlZW4gaW5pdGlhbGl6ZWQuICAqLwotCi1zdGF0aWMgc3RydWN0IG1pcHNfc2V0X29wdGlvbnMgbWlwc19vcHRzID0geyAtMSwgLTEgfTsKLQotLyogVGhlc2UgdmFyaWFibGVzIGFyZSBmaWxsZWQgaW4gd2l0aCB0aGUgbWFza3Mgb2YgcmVnaXN0ZXJzIHVzZWQuCi0gICBUaGUgb2JqZWN0IGZvcm1hdCBjb2RlIHJlYWRzIHRoZW0gYW5kIHB1dHMgdGhlbSBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgIHBsYWNlLiAgKi8KLXVuc2lnbmVkIGxvbmcgbWlwc19ncHJtYXNrOwotdW5zaWduZWQgbG9uZyBtaXBzX2Nwcm1hc2tbNF07Ci0KLS8qIE1JUFMgSVNBIHdlIGFyZSB1c2luZyBmb3IgdGhpcyBvdXRwdXQgZmlsZS4gICovCi1zdGF0aWMgaW50IGZpbGVfbWlwc19pc2E7Ci0KLS8qIFRoZSBDUFUgdHlwZSBhcyBhIG51bWJlcjogMjAwMCwgMzAwMCwgNDAwMCwgNDQwMCwgZXRjLiAgKi8KLXN0YXRpYyBpbnQgbWlwc19jcHUgPSAtMTsKLQotLyogVGhlIGFyZ3VtZW50IG9mIHRoZSAtbWFiaT0gZmxhZy4gKi8KLXN0YXRpYyBjaGFyKiBtaXBzX2FiaV9zdHJpbmcgPSAwOwotCi0vKiBXZXRoZXIgd2Ugc2hvdWxkIG1hcmsgdGhlIGZpbGUgRUFCSTY0IG9yIEVBQkkzMi4gKi8KLXN0YXRpYyBpbnQgbWlwc19lYWJpNjQgPSAwOwotCi0vKiBJZiB0aGV5IGFza2VkIGZvciBtaXBzMSBvciBtaXBzMiBhbmQgYSBjcHUgdGhhdCBpcwotICAgbWlwczMgb3IgZ3JlYXRlciwgdGhlbiBtYXJrIHRoZSBvYmplY3QgZmlsZSAzMkJJVE1PREUuICovCi1zdGF0aWMgaW50IG1pcHNfMzJiaXRtb2RlID0gMDsKLQotLyogU29tZSBJU0EncyBoYXZlIGRlbGF5IHNsb3RzIGZvciBpbnN0cnVjdGlvbnMgd2hpY2ggcmVhZCBvciB3cml0ZQotICAgZnJvbSBhIGNvcHJvY2Vzc29yIChlZy4gbWlwczEtbWlwczMpOyBzb21lIGRvbid0IChlZyBtaXBzNCkuCi0gICBSZXR1cm4gdHJ1ZSBpZiBpbnN0cnVjdGlvbnMgbWFya2VkIElOU05fTE9BRF9DT1BST0NfREVMQVksIAotICAgSU5TTl9DT1BST0NfTU9WRV9ERUxBWSwgb3IgSU5TTl9XUklURV9DT05EX0NPREUgYWN0dWFsbHkgaGF2ZSBhCi0gICBkZWxheSBzbG90IGluIHRoaXMgSVNBLiAgVGhlIHVzZXMgb2YgdGhpcyBtYWNybyBhc3N1bWUgdGhhdCBhbnkKLSAgIElTQSB0aGF0IGhhcyBkZWxheSBzbG90cyBmb3Igb25lIG9mIHRoZXNlLCBoYXMgdGhlbSBmb3IgYWxsLiAgVGhleQotICAgYWxzbyBhc3N1bWUgdGhhdCBJU0FzIHdoaWNoIGRvbid0IGhhdmUgZGVsYXlzIGZvciB0aGVzZSBpbnNucywgZG9uJ3QKLSAgIGhhdmUgZGVsYXlzIGZvciB0aGUgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSBpbnN0cnVjdGlvbnMgZWl0aGVyLiAqLwotI2RlZmluZSBJU0FfSEFTX0NPUFJPQ19ERUxBWVMoSVNBKSAoICAgICAgICBcCi0gICAoSVNBKSA9PSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHx8IChJU0EpID09IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgfHwgKElTQSkgPT0gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICApCi0KLS8qICBSZXR1cm4gdHJ1ZSBpZiBJU0Egc3VwcG9ydHMgNjQgYml0IGdwIHJlZ2lzdGVyIGluc3RydWN0aW9ucy4gKi8KLSNkZWZpbmUgSVNBX0hBU182NEJJVF9SRUdTKElTQSkgKCAgICBcCi0gICAoSVNBKSA9PSAzICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgfHwgKElTQSkgPT0gNCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICkKLQotLyogV2hldGhlciB0aGUgcHJvY2Vzc29yIHVzZXMgaGFyZHdhcmUgaW50ZXJsb2NrcyB0byBwcm90ZWN0IAotICAgcmVhZHMgZnJvbSB0aGUgSEkgYW5kIExPIHJlZ2lzdGVycywgYW5kIHRodXMgZG9lcyBub3QKLSAgIHJlcXVpcmUgbm9wcyB0byBiZSBpbnNlcnRlZC4KLQotICAgRklYTUU6IEdDQyBtYWtlcyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gLW1jcHU9Rk9PIGFuZCAtbUZPTzoKLSAgIC1tY3B1PUZPTyBzY2hlZHVsZXMgZm9yIEZPTywgYnV0IHN0aWxsIHByb2R1Y2VzIGNvZGUgdGhhdCBtZWV0cyB0aGUKLSAgIHJlcXVpcmVtZW50cyBvZiBNSVBTIElTQSBJLiAgRm9yIGV4YW1wbGUsIGl0IHdvbid0IGdlbmVyYXRlIGFueQotICAgRk9PLXNwZWNpZmljIGluc3RydWN0aW9ucywgYW5kIGl0IHdpbGwgc3RpbGwgYXNzdW1lIHRoYXQgYW55Ci0gICBzY2hlZHVsaW5nIGhhemFyZHMgZGVzY3JpYmVkIGluIE1JUFMgSVNBIEkgYXJlIHRoZXJlLCBldmVuIGlmIEZPTwotICAgaGFzIGludGVybG9ja3MuICAtbUZPTyBnaXZlcyBHQ0MgcGVybWlzc2lvbiB0byBnZW5lcmF0ZSBjb2RlIHRoYXQKLSAgIHdpbGwgb25seSBydW4gb24gYSBGT087IGl0IHdpbGwgZ2VuZXJhdGUgRk9PLXNwZWNpZmljIGluc3RydWN0aW9ucywKLSAgIGFuZCBhc3N1bWUgaW50ZXJsb2NrcyBwcm92aWRlZCBieSBhIEZPTy4KLQotICAgSG93ZXZlciwgR0FTIGN1cnJlbnRseSBkb2Vzbid0IG1ha2UgdGhpcyBkaXN0aW5jdGlvbjsgYmVmb3JlIEphbiAyOAotICAgMTk5OSwgR0FTJ3MgLW1jcHU9Rk9PIGltcGxpZWQgLW1GT08sIHdoaWNoIHZpb2xhdGVzIEdDQydzCi0gICBhc3N1bXB0aW9ucy4gIFRoZSBHQ0MgZHJpdmVyIHBhc3NlcyB0aGVzZSBmbGFncyB0aHJvdWdoIHRvIEdBUywgc28KLSAgIGlmIEdBUyBhY3R1YWxseSBkb2VzIGFueXRoaW5nIHRoYXQgZG9lc24ndCBtZWV0IE1JUFMgSVNBIEkgd2l0aAotICAgLW1GT08sIHRoZW4gR0NDJ3MgLW1jcHU9Rk9PIGZsYWcgaXNuJ3QgZ29pbmcgdG8gd29yay4KLQotICAgQW5kIGZ1cnRoZXJtb3JlLCBpdCBkaWQgbm90IGFzc3VtZSB0aGF0IC1tRk9PIGltcGxpZWQgLW1jcHU9Rk9PLAotICAgd2hpY2ggc2VlbXMgc2Vuc2VsZXNzIC0tLSB3aHkgZ2VuZXJhdGUgY29kZSB3aGljaCB3aWxsIG9ubHkgcnVuIG9uCi0gICBhIEZPTywgYnV0IHNjaGVkdWxlIGZvciBzb21ldGhpbmcgZWxzZT8KLQotICAgU28gbm93LCBhdCBsZWFzdCwgLW1jcHU9Rk9PIGFuZCAtbUZPTyBhcmUgZXhhY3RseSBlcXVpdmFsZW50LgotCi0gICAtLSBKaW0gQmxhbmR5IDxqaW1iQGN5Z251cy5jb20+ICovCi0KLSNkZWZpbmUgaGlsb19pbnRlcmxvY2tzIChtaXBzX2NwdSA9PSA0MDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICkKLQotLyogV2hldGhlciB0aGUgcHJvY2Vzc29yIHVzZXMgaGFyZHdhcmUgaW50ZXJsb2NrcyB0byBwcm90ZWN0IHJlYWRzCi0gICBmcm9tIHRoZSBHUFJzLCBhbmQgdGh1cyBkb2VzIG5vdCByZXF1aXJlIG5vcHMgdG8gYmUgaW5zZXJ0ZWQuICAqLwotI2RlZmluZSBncHJfaW50ZXJsb2NrcyBcCi0gIChtaXBzX29wdHMuaXNhICE9IDEgIFwKLSAgIHx8IG1pcHNfY3B1ID09IDM5MDApCi0KLS8qIEFzIHdpdGggb3RoZXIgImludGVybG9ja3MiIHRoaXMgaXMgdXNlZCBieSBoYXJkd2FyZSB0aGF0IGhhcyBGUAotICAgKGNvLXByb2Nlc3NvcikgaW50ZXJsb2Nrcy4gICovCi0vKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0jZGVmaW5lIGNvcF9pbnRlcmxvY2tzIChtaXBzX2NwdSA9PSA0MzAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSkKLQotLyogTUlQUyBQSUMgbGV2ZWwuICAqLwotCi1lbnVtIG1pcHNfcGljX2xldmVsCi17Ci0gIC8qIERvIG5vdCBnZW5lcmF0ZSBQSUMgY29kZS4gICovCi0gIE5PX1BJQywKLQotICAvKiBHZW5lcmF0ZSBQSUMgY29kZSBhcyBpbiBJcml4IDQuICBUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZCwgYW5kIEknbQotICAgICBub3Qgc3VyZSB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvLiAgKi8KLSAgSVJJWDRfUElDLAotCi0gIC8qIEdlbmVyYXRlIFBJQyBjb2RlIGFzIGluIHRoZSBTVlI0IE1JUFMgQUJJLiAgKi8KLSAgU1ZSNF9QSUMsCi0KLSAgLyogR2VuZXJhdGUgUElDIGNvZGUgd2l0aG91dCB1c2luZyBhIGdsb2JhbCBvZmZzZXQgdGFibGU6IHRoZSBkYXRhCi0gICAgIHNlZ21lbnQgaGFzIGEgbWF4aW11bSBzaXplIG9mIDY0SywgYWxsIGRhdGEgcmVmZXJlbmNlcyBhcmUgb2ZmCi0gICAgIHRoZSAkZ3AgcmVnaXN0ZXIsIGFuZCBhbGwgdGV4dCByZWZlcmVuY2VzIGFyZSBQQyByZWxhdGl2ZS4gIFRoaXMKLSAgICAgaXMgdXNlZCBvbiBzb21lIGVtYmVkZGVkIHN5c3RlbXMuICAqLwotICBFTUJFRERFRF9QSUMKLX07Ci0KLXN0YXRpYyBlbnVtIG1pcHNfcGljX2xldmVsIG1pcHNfcGljOwotCi0vKiAxIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSAzMiBiaXQgb2Zmc2V0cyBmcm9tIHRoZSBHUCByZWdpc3RlciBpbgotICAgU1ZSNF9QSUMgbW9kZS4gIEN1cnJlbnRseSBoYXMgbm8gbWVhbmluZyBpbiBvdGhlciBtb2Rlcy4gICovCi1zdGF0aWMgaW50IG1pcHNfYmlnX2dvdDsKLQotLyogMSBpZiB0cmFwIGluc3RydWN0aW9ucyBzaG91bGQgdXNlZCBmb3Igb3ZlcmZsb3cgcmF0aGVyIHRoYW4gYnJlYWsKLSAgIGluc3RydWN0aW9ucy4gICovCi1zdGF0aWMgaW50IG1pcHNfdHJhcDsKLQotLyogTm9uLXplcm8gaWYgYW55IC5zZXQgbm9yZW9yZGVyIGRpcmVjdGl2ZXMgd2VyZSB1c2VkLiAgKi8KLQotc3RhdGljIGludCBtaXBzX2FueV9ub3Jlb3JkZXI7Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBzbWFsbCBkYXRhIHNlY3Rpb24uICAqLwotc3RhdGljIGludCBnX3N3aXRjaF92YWx1ZSA9IDg7Ci0vKiBXaGV0aGVyIHRoZSAtRyBvcHRpb24gd2FzIHVzZWQuICAqLwotc3RhdGljIGludCBnX3N3aXRjaF9zZWVuID0gMDsKLQotI2RlZmluZSBOX1JNQVNLIDB4YzQKLSNkZWZpbmUgTl9WRlAgICAweGQ0Ci0KLS8qIElmIHdlIGNhbiBkZXRlcm1pbmUgaW4gYWR2YW5jZSB0aGF0IEdQIG9wdGltaXphdGlvbiB3b24ndCBiZQotICAgcG9zc2libGUsIHdlIGNhbiBza2lwIHRoZSByZWxheGF0aW9uIHN0dWZmIHRoYXQgdHJpZXMgdG8gcHJvZHVjZQotICAgR1AtcmVsYXRpdmUgcmVmZXJlbmNlcy4gIFRoaXMgbWFrZXMgZGVsYXkgc2xvdCBvcHRpbWl6YXRpb24gd29yawotICAgYmV0dGVyLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IHByb3ZpZGUgYSBndWVzcywgYnV0IGl0IHNlZW1zIHRvIHdvcmsgZm9yCi0gICBnY2Mgb3V0cHV0LiAgSXQgbmVlZHMgdG8gZ3Vlc3MgcmlnaHQgZm9yIGdjYywgb3RoZXJ3aXNlIGdjYwotICAgd2lsbCBwdXQgd2hhdCBpdCB0aGlua3MgaXMgYSBHUC1yZWxhdGl2ZSBpbnN0cnVjdGlvbiBpbiBhIGJyYW5jaAotICAgZGVsYXkgc2xvdC4KLQotICAgSSBkb24ndCBrbm93IGlmIGEgZml4IGlzIG5lZWRlZCBmb3IgdGhlIFNWUjRfUElDIG1vZGUuICBJJ3ZlIG9ubHkKLSAgIGZpeGVkIGl0IGZvciB0aGUgbm9uLVBJQyBtb2RlLiAgS1IgOTUvMDQvMDcgICovCi1zdGF0aWMgaW50IG5vcGljX25lZWRfcmVsYXggUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQpKTsKLQotLyogaGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZSAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2ggPSBOVUxMOwotCi0vKiBUaGUgb3Bjb2RlIGhhc2ggdGFibGUgd2UgdXNlIGZvciB0aGUgbWlwczE2LiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICptaXBzMTZfb3BfaGFzaCA9IE5VTEw7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBDIHN0eWxlIGNvbW1lbnRzIGFyZSBhbHdheXMgc3VwcG9ydGVkLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgbWFjaGluZSBzcGVjaWZpYyBsaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXJzLiAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYyAuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuCi0gKi8KLQotc3RhdGljIGNoYXIgKmluc25fZXJyb3I7Ci0KLXN0YXRpYyBpbnQgYXV0b19hbGlnbiA9IDE7Ci0KLS8qIFdoZW4gb3V0cHV0dGluZyBTVlI0IFBJQyBjb2RlLCB0aGUgYXNzZW1ibGVyIG5lZWRzIHRvIGtub3cgdGhlCi0gICBvZmZzZXQgaW4gdGhlIHN0YWNrIGZyYW1lIGZyb20gd2hpY2ggdG8gcmVzdG9yZSB0aGUgJGdwIHJlZ2lzdGVyLgotICAgVGhpcyBpcyBzZXQgYnkgdGhlIC5jcHJlc3RvcmUgcHNldWRvLW9wLCBhbmQgc2F2ZWQgaW4gdGhpcwotICAgdmFyaWFibGUuICAqLwotc3RhdGljIG9mZnNldFQgbWlwc19jcHJlc3RvcmVfb2Zmc2V0ID0gLTE7Ci0KLS8qIFRoaXMgaXMgdGhlIHJlZ2lzdGVyIHdoaWNoIGhvbGRzIHRoZSBzdGFjayBmcmFtZSwgYXMgc2V0IGJ5IHRoZQotICAgLmZyYW1lIHBzZXVkby1vcC4gIFRoaXMgaXMgbmVlZGVkIHRvIGltcGxlbWVudCAuY3ByZXN0b3JlLiAgKi8KLXN0YXRpYyBpbnQgbWlwc19mcmFtZV9yZWcgPSBTUDsKLQotLyogVG8gb3V0cHV0IE5PUCBpbnN0cnVjdGlvbnMgY29ycmVjdGx5LCB3ZSBuZWVkIHRvIGtlZXAgaW5mb3JtYXRpb24KLSAgIGFib3V0IHRoZSBwcmV2aW91cyB0d28gaW5zdHJ1Y3Rpb25zLiAgKi8KLQotLyogV2hldGhlciB3ZSBhcmUgb3B0aW1pemluZy4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIDIgbWVhbnMgdG8gcmVtb3ZlCi0gICB1bm5lZWRlZCBOT1BzIGFuZCBzd2FwIGJyYW5jaCBpbnN0cnVjdGlvbnMgd2hlbiBwb3NzaWJsZS4gIEEgdmFsdWUKLSAgIG9mIDEgbWVhbnMgdG8gbm90IHN3YXAgYnJhbmNoZXMuICBBIHZhbHVlIG9mIDAgbWVhbnMgdG8gYWx3YXlzCi0gICBpbnNlcnQgTk9Qcy4gICovCi1zdGF0aWMgaW50IG1pcHNfb3B0aW1pemUgPSAyOwotCi0vKiBEZWJ1Z2dpbmcgbGV2ZWwuICAtZyBzZXRzIHRoaXMgdG8gMi4gIC1nTiBzZXRzIHRoaXMgdG8gTi4gIC1nMCBpcwotICAgZXF1aXZhbGVudCB0byBzZWVpbmcgbm8gLWcgb3B0aW9uIGF0IGFsbC4gICovCi1zdGF0aWMgaW50IG1pcHNfZGVidWcgPSAwOwotCi0vKiBUaGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHN0cnVjdCBtaXBzX2NsX2luc24gcHJldl9pbnNuOwotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIHByZXZfaW5zbi4gICovCi1zdGF0aWMgc3RydWN0IG1pcHNfY2xfaW5zbiBwcmV2X3ByZXZfaW5zbjsKLQotLyogSWYgd2UgZG9uJ3Qgd2FudCBpbmZvcm1hdGlvbiBmb3IgcHJldl9pbnNuIG9yIHByZXZfcHJldl9pbnNuLCB3ZQotICAgcG9pbnQgdGhlIGluc25fbW8gZmllbGQgYXQgdGhpcyBkdW1teSBpbnRlZ2VyLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgZHVtbXlfb3Bjb2RlID0geyAwIH07Ci0KLS8qIE5vbi16ZXJvIGlmIHByZXZfaW5zbiBpcyB2YWxpZC4gICovCi1zdGF0aWMgaW50IHByZXZfaW5zbl92YWxpZDsKLQotLyogVGhlIGZyYWcgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgc3RydWN0IGZyYWcgKnByZXZfaW5zbl9mcmFnOwotCi0vKiBUaGUgb2Zmc2V0IGludG8gcHJldl9pbnNuX2ZyYWcgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgbG9uZyBwcmV2X2luc25fd2hlcmU7Ci0KLS8qIFRoZSByZWxvYyB0eXBlIGZvciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24sIGlmIGFueS4gICovCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHByZXZfaW5zbl9yZWxvY190eXBlOwotCi0vKiBUaGUgcmVsb2MgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiwgaWYgYW55LiAgKi8KLXN0YXRpYyBmaXhTICpwcmV2X2luc25fZml4cDsKLQotLyogTm9uLXplcm8gaWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBpbiBhIGRlbGF5IHNsb3QuICAqLwotc3RhdGljIGludCBwcmV2X2luc25faXNfZGVsYXlfc2xvdDsKLQotLyogTm9uLXplcm8gaWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBpbiBhIC5zZXQgbm9yZW9yZGVyLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9pbnNuX3VucmVvcmRlcmVkOwotCi0vKiBOb24temVybyBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gdXNlcyBhbiBleHRlbmQgb3Bjb2RlIChpZgotICAgbWlwczE2KS4gICovCi1zdGF0aWMgaW50IHByZXZfaW5zbl9leHRlbmRlZDsKLQotLyogTm9uLXplcm8gaWYgdGhlIHByZXZpb3VzIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBpbiBhIC5zZXQKLSAgIG5vcmVvcmRlci4gICovCi1zdGF0aWMgaW50IHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkOwotCi0vKiBJZiB0aGlzIGlzIHNldCwgaXQgcG9pbnRzIHRvIGEgZnJhZyBob2xkaW5nIG5vcCBpbnN0cnVjdGlvbnMgd2hpY2gKLSAgIHdlcmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBzdGFydCBvZiBhIG5vcmVvcmRlciBzZWN0aW9uLiAgSWYgdGhvc2UKLSAgIG5vcHMgdHVybiBvdXQgdG8gYmUgdW5uZWNlc3NhcnksIHRoZSBzaXplIG9mIHRoZSBmcmFnIGNhbiBiZQotICAgZGVjcmVhc2VkLiAgKi8KLXN0YXRpYyBmcmFnUyAqcHJldl9ub3BfZnJhZzsKLQotLyogVGhlIG51bWJlciBvZiBub3AgaW5zdHJ1Y3Rpb25zIHdlIGNyZWF0ZWQgaW4gcHJldl9ub3BfZnJhZy4gICovCi1zdGF0aWMgaW50IHByZXZfbm9wX2ZyYWdfaG9sZHM7Ci0KLS8qIFRoZSBudW1iZXIgb2Ygbm9wIGluc3RydWN0aW9ucyB0aGF0IHdlIGtub3cgd2UgbmVlZCBpbgotICAgcHJldl9ub3BfZnJhZy4gKi8KLXN0YXRpYyBpbnQgcHJldl9ub3BfZnJhZ19yZXF1aXJlZDsKLQotLyogVGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgd2UndmUgc2VlbiBzaW5jZSBwcmV2X25vcF9mcmFnLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9ub3BfZnJhZ19zaW5jZTsKLQotLyogRm9yIEVDT0ZGIGFuZCBFTEYsIHJlbG9jYXRpb25zIGFnYWluc3Qgc3ltYm9scyBhcmUgZG9uZSBpbiB0d28KLSAgIHBhcnRzLCB3aXRoIGEgSEkgcmVsb2NhdGlvbiBhbmQgYSBMTyByZWxvY2F0aW9uLiAgRWFjaCByZWxvY2F0aW9uCi0gICBoYXMgb25seSAxNiBiaXRzIG9mIHNwYWNlIHRvIHN0b3JlIGFuIGFkZGVuZC4gIFRoaXMgbWVhbnMgdGhhdCBpbgotICAgb3JkZXIgZm9yIHRoZSBsaW5rZXIgdG8gaGFuZGxlIGNhcnJpZXMgY29ycmVjdGx5LCBpdCBtdXN0IGJlIGFibGUKLSAgIHRvIGxvY2F0ZSBib3RoIHRoZSBISSBhbmQgdGhlIExPIHJlbG9jYXRpb24uICBUaGlzIG1lYW5zIHRoYXQgdGhlCi0gICByZWxvY2F0aW9ucyBtdXN0IGFwcGVhciBpbiBvcmRlciBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZS4KLQotICAgSW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoaXMsIHdlIGtlZXAgdHJhY2sgb2YgZWFjaCB1bm1hdGNoZWQgSEkKLSAgIHJlbG9jYXRpb24uICBXZSB0aGVuIHNvcnQgdGhlbSBzbyB0aGF0IHRoZXkgaW1tZWRpYXRlbHkgcHJlY2VkZSB0aGUKLSAgIGNvcnJlc3BvbmRpbmcgTE8gcmVsb2NhdGlvbi4gKi8KLQotc3RydWN0IG1pcHNfaGlfZml4dXAKLXsKLSAgLyogTmV4dCBISSBmaXh1cC4gICovCi0gIHN0cnVjdCBtaXBzX2hpX2ZpeHVwICpuZXh0OwotICAvKiBUaGlzIGZpeHVwLiAgKi8KLSAgZml4UyAqZml4cDsKLSAgLyogVGhlIHNlY3Rpb24gdGhpcyBmaXh1cCBpcyBpbi4gICovCi0gIHNlZ1Qgc2VnOwotfTsKLQotLyogVGhlIGxpc3Qgb2YgdW5tYXRjaGVkIEhJIHJlbG9jcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19oaV9maXh1cCAqbWlwc19oaV9maXh1cF9saXN0OwotCi0vKiBNYXAgbm9ybWFsIE1JUFMgcmVnaXN0ZXIgbnVtYmVycyB0byBtaXBzMTYgcmVnaXN0ZXIgbnVtYmVycy4gICovCi0KLSNkZWZpbmUgWCBJTExFR0FMX1JFRwotc3RhdGljIGNvbnN0IGludCBtaXBzMzJfdG9fMTZfcmVnX21hcFtdID0KLXsKLSAgWCwgWCwgMiwgMywgNCwgNSwgNiwgNywKLSAgWCwgWCwgWCwgWCwgWCwgWCwgWCwgWCwKLSAgMCwgMSwgWCwgWCwgWCwgWCwgWCwgWCwKLSAgWCwgWCwgWCwgWCwgWCwgWCwgWCwgWAotfTsKLSN1bmRlZiBYCi0KLS8qIE1hcCBtaXBzMTYgcmVnaXN0ZXIgbnVtYmVycyB0byBub3JtYWwgTUlQUyByZWdpc3RlciBudW1iZXJzLiAgKi8KLQotc3RhdGljIGNvbnN0IGludCBtaXBzMTZfdG9fMzJfcmVnX21hcFtdID0KLXsKLSAgMTYsIDE3LCAyLCAzLCA0LCA1LCA2LCA3Ci19OwotDAotLyogU2luY2UgdGhlIE1JUFMgZG9lcyBub3QgaGF2ZSBtdWx0aXBsZSBmb3JtcyBvZiBQQyByZWxhdGl2ZQotICAgaW5zdHJ1Y3Rpb25zLCB3ZSBkbyBub3QgaGF2ZSB0byBkbyByZWxheGluZyBhcyBpcyBkb25lIG9uIG90aGVyCi0gICBwbGF0Zm9ybXMuICBIb3dldmVyLCB3ZSBkbyBoYXZlIHRvIGhhbmRsZSBHUCByZWxhdGl2ZSBhZGRyZXNzaW5nCi0gICBjb3JyZWN0bHksIHdoaWNoIHR1cm5zIG91dCB0byBiZSBhIHNpbWlsYXIgcHJvYmxlbS4KLQotICAgRXZlcnkgbWFjcm8gdGhhdCByZWZlcnMgdG8gYSBzeW1ib2wgY2FuIG9jY3VyIGluIChhdCBsZWFzdCkgdHdvCi0gICBmb3Jtcywgb25lIHdpdGggR1AgcmVsYXRpdmUgYWRkcmVzc2luZyBhbmQgb25lIHdpdGhvdXQuICBGb3IKLSAgIGV4YW1wbGUsIGxvYWRpbmcgYSBnbG9iYWwgdmFyaWFibGUgaW50byBhIHJlZ2lzdGVyIGdlbmVyYWxseSB1c2VzCi0gICBhIG1hY3JvIGluc3RydWN0aW9uIGxpa2UgdGhpczoKLSAgICAgbHcgJDQsaQotICAgSWYgaSBjYW4gYmUgYWRkcmVzc2VkIG9mZiB0aGUgR1AgcmVnaXN0ZXIgKHRoaXMgaXMgdHJ1ZSBpZiBpdCBpcyBpbgotICAgdGhlIC5zYnNzIG9yIC5zZGF0YSBzZWN0aW9uLCBvciBpZiBpdCBpcyBrbm93biB0byBiZSBzbWFsbGVyIHRoYW4KLSAgIHRoZSAtRyBhcmd1bWVudCkgdGhpcyB3aWxsIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb246Ci0gICAgIGx3ICQ0LGkoJGdwKQotICAgVGhpcyBpbnN0cnVjdGlvbiB3aWxsIHVzZSBhIEdQUkVMIHJlbG9jLiAgSWYgaSBjYW4gbm90IGJlIGFkZHJlc3NlZAotICAgb2ZmIHRoZSBHUCByZWdpc3RlciwgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbiBzZXF1ZW5jZSB3aWxsIGJlIHVzZWQ6Ci0gICAgIGx1aSAkYXQsaQotICAgICBsdyAkNCxpKCRhdCkKLSAgIEluIHRoaXMgY2FzZSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gd2lsbCBoYXZlIGEgSEkxNiByZWxvYywgYW5kIHRoZQotICAgc2Vjb25kIHJlbG9jIHdpbGwgaGF2ZSBhIExPMTYgcmVsb2MuICBCb3RoIHJlbG9jcyB3aWxsIGJlIGFnYWluc3QKLSAgIHRoZSBzeW1ib2wgaS4KLQotICAgVGhlIGlzc3VlIGhlcmUgaXMgdGhhdCB3ZSBtYXkgbm90IGtub3cgd2hldGhlciBpIGlzIEdQIGFkZHJlc3NhYmxlCi0gICB1bnRpbCBhZnRlciB3ZSBzZWUgdGhlIGluc3RydWN0aW9uIHRoYXQgdXNlcyBpdC4gIFRoZXJlZm9yZSwgd2UKLSAgIHdhbnQgdG8gYmUgYWJsZSB0byBjaG9vc2UgdGhlIGZpbmFsIGluc3RydWN0aW9uIHNlcXVlbmNlIG9ubHkgYXQKLSAgIHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSB3YXkgb3RoZXIKLSAgIHBsYXRmb3JtcyBjaG9vc2UgdGhlIHNpemUgb2YgYSBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbiBvbmx5IGF0IHRoZQotICAgZW5kIG9mIGFzc2VtYmx5LgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSB3ZSBkbyBub3QgdXNlIEdQCi0gICBhZGRyZXNzaW5nIGluIHF1aXRlIHRoZSBzYW1lIHdheSwgYnV0IHRoZSBpc3N1ZSBzdGlsbCBhcmlzZXMgYXMKLSAgIGV4dGVybmFsIHN5bWJvbHMgYW5kIGxvY2FsIHN5bWJvbHMgbXVzdCBiZSBoYW5kbGVkIGRpZmZlcmVudGx5LgotCi0gICBXZSBoYW5kbGUgdGhlc2UgaXNzdWVzIGJ5IGFjdHVhbGx5IGdlbmVyYXRpbmcgYm90aCBwb3NzaWJsZQotICAgaW5zdHJ1Y3Rpb24gc2VxdWVuY2VzLiAgVGhlIGxvbmdlciBvbmUgaXMgcHV0IGluIGEgZnJhZ192YXIgd2l0aAotICAgdHlwZSByc19tYWNoaW5lX2RlcGVuZGVudC4gIFdlIGVuY29kZSB3aGF0IHRvIGRvIHdpdGggdGhlIGZyYWcgaW4KLSAgIHRoZSBzdWJ0eXBlIGZpZWxkLiAgV2UgZW5jb2RlICgxKSB0aGUgbnVtYmVyIG9mIGV4aXN0aW5nIGJ5dGVzIHRvCi0gICByZXBsYWNlLCAoMikgdGhlIG51bWJlciBvZiBuZXcgYnl0ZXMgdG8gdXNlLCAoMykgdGhlIG9mZnNldCBmcm9tCi0gICB0aGUgc3RhcnQgb2YgdGhlIGV4aXN0aW5nIGJ5dGVzIHRvIHRoZSBmaXJzdCByZWxvYyB3ZSBtdXN0IGdlbmVyYXRlCi0gICAodGhhdCBpcywgdGhlIG9mZnNldCBpcyBhcHBsaWVkIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBleGlzdGluZwotICAgYnl0ZXMgYWZ0ZXIgdGhleSBhcmUgcmVwbGFjZWQgYnkgdGhlIG5ldyBieXRlcywgaWYgYW55KSwgKDQpIHRoZQotICAgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBleGlzdGluZyBieXRlcyB0byB0aGUgc2Vjb25kIHJlbG9jLAotICAgKDUpIHdoZXRoZXIgYSB0aGlyZCByZWxvYyBpcyBuZWVkZWQgKHRoZSB0aGlyZCByZWxvYyBpcyBhbHdheXMgZm91cgotICAgYnl0ZXMgYWZ0ZXIgdGhlIHNlY29uZCByZWxvYyksIGFuZCAoNikgd2hldGhlciB0byB3YXJuIGlmIHRoaXMKLSAgIHZhcmlhbnQgaXMgdXNlZCAodGhpcyBpcyBzb21ldGltZXMgbmVlZGVkIGlmIC5zZXQgbm9tYWNybyBvciAuc2V0Ci0gICBub2F0IGlzIGluIGVmZmVjdCkuICBBbGwgdGhlc2UgbnVtYmVycyBhcmUgcmVhc29uYWJseSBzbWFsbC4KLQotICAgR2VuZXJhdGluZyB0d28gaW5zdHJ1Y3Rpb24gc2VxdWVuY2VzIG11c3QgYmUgaGFuZGxlZCBjYXJlZnVsbHkgdG8KLSAgIGVuc3VyZSB0aGF0IGRlbGF5IHNsb3RzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4gIEZvcnR1bmF0ZWx5LCB0aGVyZQotICAgYXJlIGEgbGltaXRlZCBudW1iZXIgb2YgY2FzZXMuICBXaGVuIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24KLSAgIHNlcXVlbmNlIGlzIGdlbmVyYXRlZCwgYXBwZW5kX2luc24gaXMgZGlyZWN0ZWQgdG8gbWFpbnRhaW4gdGhlCi0gICBleGlzdGluZyBkZWxheSBzbG90IGluZm9ybWF0aW9uLCBzbyBpdCBjb250aW51ZXMgdG8gYXBwbHkgdG8gYW55Ci0gICBjb2RlIGFmdGVyIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UuICBUaGlzIG1lYW5zIHRoYXQgdGhlCi0gICBzZWNvbmQgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgbXVzdCBub3QgaW1wb3NlIGFueSByZXF1aXJlbWVudHMgbm90Ci0gICByZXF1aXJlZCBieSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UuCi0KLSAgIFRoZXNlIHZhcmlhbnQgZnJhZ3MgYXJlIHRoZW4gaGFuZGxlZCBpbiBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoZQotICAgbWFjaGluZSBpbmRlcGVuZGVudCBjb2RlLiAgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggcmV0dXJucwotICAgdGhlIGZpbmFsIHNpemUgb2YgdGhlIGZyYWcuICBtZF9jb252ZXJ0X2ZyYWcgc2V0cyB1cCB0aGUgZmluYWwgZm9ybQotICAgb2YgdGhlIGZyYWcuICB0Y19nZW5fcmVsb2MgYWRqdXN0IHRoZSBmaXJzdCByZWxvYyBhbmQgYWRkcyBhIHNlY29uZAotICAgb25lIGlmIG5lZWRlZC4gICovCi0jZGVmaW5lIFJFTEFYX0VOQ09ERShvbGQsIG5ldywgcmVsb2MxLCByZWxvYzIsIHJlbG9jMywgd2FybikgXAotICAoKHJlbGF4X3N1YnN0YXRlVCkgXAotICAgKCgob2xkKSA8PCAyMykgXAotICAgIHwgKChuZXcpIDw8IDE2KSBcCi0gICAgfCAoKChyZWxvYzEpICsgNjQpIDw8IDkpIFwKLSAgICB8ICgoKHJlbG9jMikgKyA2NCkgPDwgMikgXAotICAgIHwgKChyZWxvYzMpID8gKDEgPDwgMSkgOiAwKSBcCi0gICAgfCAoKHdhcm4pID8gMSA6IDApKSkKLSNkZWZpbmUgUkVMQVhfT0xEKGkpICgoKGkpID4+IDIzKSAmIDB4N2YpCi0jZGVmaW5lIFJFTEFYX05FVyhpKSAoKChpKSA+PiAxNikgJiAweDdmKQotI2RlZmluZSBSRUxBWF9SRUxPQzEoaSkgKChiZmRfdm1hKSgoKGkpID4+IDkpICYgMHg3ZikgLSA2NCkKLSNkZWZpbmUgUkVMQVhfUkVMT0MyKGkpICgoYmZkX3ZtYSkoKChpKSA+PiAyKSAmIDB4N2YpIC0gNjQpCi0jZGVmaW5lIFJFTEFYX1JFTE9DMyhpKSAoKChpKSA+PiAxKSAmIDEpCi0jZGVmaW5lIFJFTEFYX1dBUk4oaSkgKChpKSAmIDEpCi0KLS8qIEZvciBtaXBzMTYgY29kZSwgd2UgdXNlIGFuIGVudGlyZWx5IGRpZmZlcmVudCBmb3JtIG9mIHJlbGF4YXRpb24uCi0gICBtaXBzMTYgc3VwcG9ydHMgdHdvIHZlcnNpb25zIG9mIG1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIHRha2UKLSAgIGltbWVkaWF0ZSB2YWx1ZXM6IGEgc21hbGwgb25lIHdoaWNoIHRha2VzIHNvbWUgc21hbGwgdmFsdWUsIGFuZCBhCi0gICBsYXJnZXIgb25lIHdoaWNoIHRha2VzIGEgMTYgYml0IHZhbHVlLiAgU2luY2UgYnJhbmNoZXMgYWxzbyBmb2xsb3cKLSAgIHRoaXMgcGF0dGVybiwgcmVsYXhpbmcgdGhlc2UgdmFsdWVzIGlzIHJlcXVpcmVkLgotCi0gICBXZSBjYW4gYXNzZW1ibGUgYm90aCBtaXBzMTYgYW5kIG5vcm1hbCBNSVBTIGNvZGUgaW4gYSBzaW5nbGUKLSAgIG9iamVjdC4gIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBzdXBwb3J0IHRoaXMgdHlwZSBvZiByZWxheGF0aW9uIGF0Ci0gICB0aGUgc2FtZSB0aW1lIHRoYXQgd2Ugc3VwcG9ydCB0aGUgcmVsYXhhdGlvbiBkZXNjcmliZWQgYWJvdmUuICBXZQotICAgdXNlIHRoZSBoaWdoIGJpdCBvZiB0aGUgc3VidHlwZSBmaWVsZCB0byBkaXN0aW5ndWlzaCB0aGVzZSBjYXNlcy4KLQotICAgVGhlIGluZm9ybWF0aW9uIHdlIHN0b3JlIGZvciB0aGlzIHR5cGUgb2YgcmVsYXhhdGlvbiBpcyB0aGUKLSAgIGFyZ3VtZW50IGNvZGUgZm91bmQgaW4gdGhlIG9wY29kZSBmaWxlIGZvciB0aGlzIHJlbG9jYXRpb24sIHdoZXRoZXIKLSAgIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGEgc21hbGwgb3IgZXh0ZW5kZWQgZm9ybSwgYW5kIHdoZXRoZXIKLSAgIHRoZSByZWxvY2F0aW9uIGlzIGluIGEganVtcCBvciBqYWwgZGVsYXkgc2xvdC4gIFRoYXQgdGVsbHMgdXMgdGhlCi0gICBzaXplIG9mIHRoZSB2YWx1ZSwgYW5kIGhvdyBpdCBzaG91bGQgYmUgc3RvcmVkLiAgV2UgYWxzbyBzdG9yZQotICAgd2hldGhlciB0aGUgZnJhZ21lbnQgaXMgY29uc2lkZXJlZCB0byBiZSBleHRlbmRlZCBvciBub3QuICBXZSBhbHNvCi0gICBzdG9yZSB3aGV0aGVyIHRoaXMgaXMga25vd24gdG8gYmUgYSBicmFuY2ggdG8gYSBkaWZmZXJlbnQgc2VjdGlvbiwKLSAgIHdoZXRoZXIgd2UgaGF2ZSB0cmllZCB0byByZWxheCB0aGlzIGZyYWcgeWV0LCBhbmQgd2hldGhlciB3ZSBoYXZlCi0gICBldmVyIGV4dGVuZGVkIGEgUEMgcmVsYXRpdmUgZnJhZ21lbnQgYmVjYXVzZSBvZiBhIHNoaWZ0IGNvdW50LiAgKi8KLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0VOQ09ERSh0eXBlLCBzbWFsbCwgZXh0LCBkc2xvdCwgamFsX2RzbG90KQlcCi0gICgweDgwMDAwMDAwCQkJCQkJCVwKLSAgIHwgKCh0eXBlKSAmIDB4ZmYpCQkJCQkJXAotICAgfCAoKHNtYWxsKSA/IDB4MTAwIDogMCkJCQkJCVwKLSAgIHwgKChleHQpID8gMHgyMDAgOiAwKQkJCQkJXAotICAgfCAoKGRzbG90KSA/IDB4NDAwIDogMCkJCQkJCVwKLSAgIHwgKChqYWxfZHNsb3QpID8gMHg4MDAgOiAwKSkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X1AoaSkgKCgoaSkgJiAweDgwMDAwMDAwKSAhPSAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfVFlQRShpKSAoKGkpICYgMHhmZikKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X1VTRVJfU01BTEwoaSkgKCgoaSkgJiAweDEwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X1VTRVJfRVhUKGkpICgoKGkpICYgMHgyMDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9EU0xPVChpKSAoKChpKSAmIDB4NDAwKSAhPSAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfSkFMX0RTTE9UKGkpICgoKGkpICYgMHg4MDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9FWFRFTkRFRChpKSAoKChpKSAmIDB4MTAwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X01BUktfRVhURU5ERUQoaSkgKChpKSB8IDB4MTAwMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0NMRUFSX0VYVEVOREVEKGkpICgoaSkgJn4gMHgxMDAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfTE9OR19CUkFOQ0goaSkgKCgoaSkgJiAweDIwMDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9NQVJLX0xPTkdfQlJBTkNIKGkpICgoaSkgfCAweDIwMDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9DTEVBUl9MT05HX0JSQU5DSChpKSAoKGkpICZ+IDB4MjAwMCkKLQwKLS8qIFByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICAqLwotCi0jaWZkZWYgX19TVERDX18KLSNkZWZpbmUgaW50ZXJuYWxFcnJvcigpIFwKLSAgICBhc19mYXRhbCAoXygiaW50ZXJuYWwgRXJyb3IsIGxpbmUgJWQsICVzIiksIF9fTElORV9fLCBfX0ZJTEVfXykKLSNlbHNlCi0jZGVmaW5lIGludGVybmFsRXJyb3IoKSBhc19mYXRhbCAoXygiTUlQUyBpbnRlcm5hbCBFcnJvciIpKTsKLSNlbmRpZgotCi1lbnVtIG1pcHNfcmVnY2xhc3MgeyBNSVBTX0dSX1JFRywgTUlQU19GUF9SRUcsIE1JUFMxNl9SRUcgfTsKLQotc3RhdGljIGludCBpbnNuX3VzZXNfcmVnIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKmlwLAotCQkJCSAgdW5zaWduZWQgaW50IHJlZywgZW51bSBtaXBzX3JlZ2NsYXNzIGNsYXNzKSk7Ci1zdGF0aWMgaW50IHJlZ19uZWVkc19kZWxheSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1pcHMxNl9tYXJrX2xhYmVscyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBhcHBlbmRfaW5zbiBQQVJBTVMgKChjaGFyICpwbGFjZSwKLQkJCQkgc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwLAotCQkJCSBleHByZXNzaW9uUyAqIHAsCi0JCQkJIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByLAotCQkJCSBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX25vX3ByZXZfaW5zbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1pcHNfZW1pdF9kZWxheXMgUEFSQU1TICgoYm9vbGVhbikpOwotI2lmZGVmIFVTRV9TVERBUkcKLXN0YXRpYyB2b2lkIG1hY3JvX2J1aWxkIFBBUkFNUyAoKGNoYXIgKnBsYWNlLCBpbnQgKmNvdW50ZXIsIGV4cHJlc3Npb25TICogZXAsCi0JCQkJIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmZtdCwKLQkJCQkgLi4uKSk7Ci0jZWxzZQotc3RhdGljIHZvaWQgbWFjcm9fYnVpbGQgKCk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIG1pcHMxNl9tYWNyb19idWlsZCBQQVJBTVMgKChjaGFyICosIGludCAqLCBleHByZXNzaW9uUyAqLAotCQkJCQljb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkJCQkJdmFfbGlzdCkpOwotc3RhdGljIHZvaWQgbWFjcm9fYnVpbGRfbHVpIFBBUkFNUyAoKGNoYXIgKnBsYWNlLCBpbnQgKmNvdW50ZXIsCi0JCQkJICAgICBleHByZXNzaW9uUyAqIGVwLCBpbnQgcmVnbnVtKSk7Ci1zdGF0aWMgdm9pZCBzZXRfYXQgUEFSQU1TICgoaW50ICpjb3VudGVyLCBpbnQgcmVnLCBpbnQgdW5zaWduZWRwKSk7Ci1zdGF0aWMgdm9pZCBjaGVja19hYnNvbHV0ZV9leHByIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCwKLQkJCQkJIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIGxvYWRfcmVnaXN0ZXIgUEFSQU1TICgoaW50ICosIGludCwgZXhwcmVzc2lvblMgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBsb2FkX2FkZHJlc3MgUEFSQU1TICgoaW50ICpjb3VudGVyLCBpbnQgcmVnLCBleHByZXNzaW9uUyAqZXApKTsKLXN0YXRpYyB2b2lkIG1hY3JvIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCkpOwotc3RhdGljIHZvaWQgbWlwczE2X21hY3JvIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCkpOwotI2lmZGVmIExPU0lOR19DT01QSUxFUgotc3RhdGljIHZvaWQgbWFjcm8yIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBtaXBzX2lwIFBBUkFNUyAoKGNoYXIgKnN0ciwgc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwKSk7Ci1zdGF0aWMgdm9pZCBtaXBzMTZfaXAgUEFSQU1TICgoY2hhciAqc3RyLCBzdHJ1Y3QgbWlwc19jbF9pbnNuICogaXApKTsKLXN0YXRpYyB2b2lkIG1pcHMxNl9pbW1lZCBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGludCwgaW50LCBvZmZzZXRULCBib29sZWFuLAotCQkJCSAgYm9vbGVhbiwgYm9vbGVhbiwgdW5zaWduZWQgbG9uZyAqLAotCQkJCSAgYm9vbGVhbiAqLCB1bnNpZ25lZCBzaG9ydCAqKSk7Ci1zdGF0aWMgaW50IG15X2dldFNtYWxsRXhwcmVzc2lvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqIGVwLCBjaGFyICpzdHIpKTsKLXN0YXRpYyB2b2lkIG15X2dldEV4cHJlc3Npb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKiBlcCwgY2hhciAqc3RyKSk7Ci1zdGF0aWMgc3ltYm9sUyAqZ2V0X3N5bWJvbCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2FsaWduIFBBUkFNUyAoKGludCB0bywgaW50IGZpbGwsIHN5bWJvbFMgKmxhYmVsKSk7Ci1zdGF0aWMgdm9pZCBzX2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jaGFuZ2Vfc2VjIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19taXBzX2dsb2JsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19vcHRpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNzZXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FiaWNhbGxzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jcGxvYWQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NwcmVzdG9yZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZ3B3b3JkIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jcGFkZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfaW5zbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1kX29ial9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBtZF9vYmpfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBsb25nIGdldF9udW1iZXIgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgc19taXBzX2VudCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc19lbmQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfZnJhbWUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfbWFzayBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc19zdGFiIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19taXBzX3dlYWtleHQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2ZpbGUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgaW50IG1pcHMxNl9leHRlbmRlZF9mcmFnIFBBUkFNUyAoKGZyYWdTICosIGFzZWN0aW9uICosIGxvbmcpKTsKLQotCi1zdGF0aWMgaW50IHZhbGlkYXRlX21pcHNfaW5zbiBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKikpOwotDAotLyogUHNldWRvLW9wIHRhYmxlLgotCi0gICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rCi0gICBzaG91bGQgYmUgZGVmaW5lZCBoZXJlLCBidXQgYXJlIGN1cnJlbnRseSB1bnN1cHBvcnRlZDogLmFsaWFzLAotICAgLmdhbGl2ZSwgLmdqYWxkZWYsIC5nanJsaXZlLCAubGl2ZXJlZywgLm5vYWxpYXMuCi0KLSAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sgYXJlCi0gICBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYmVpbmcgZ2VuZXJhdGVkLCBhbmQKLSAgIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHRoZSBvYmplY3QgZm9ybWF0OiAuYWVudCwgLmJlZ2luLCAuYmVuZCwKLSAgIC5iZ25iLCAuZW5kLCAuZW5kYiwgLmVudCwgLmZtYXNrLCAuZnJhbWUsIC5sb2MsIC5tYXNrLCAudmVyc3RhbXAsCi0gICAudnJlZy4KLQotICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vayBhcmUKLSAgIG5vdCBNSVBTIENQVSBzcGVjaWZpYywgYnV0IGFyZSBhbHNvIG5vdCBzcGVjaWZpYyB0byB0aGUgb2JqZWN0IGZpbGUKLSAgIGZvcm1hdC4gIFRoaXMgZmlsZSBpcyBwcm9iYWJseSB0aGUgYmVzdCBwbGFjZSB0byBkZWZpbmUgdGhlbSwgYnV0Ci0gICB0aGV5IGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZDogLmFzbTAsIC5lbmRyLCAubGFiLCAucmVwZWF0LAotICAgLnN0cnVjdC4gICovCi0KLXN0YXRpYyBjb25zdCBwc2V1ZG9fdHlwZVMgbWlwc19wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gLyogTUlQUyBzcGVjaWZpYyBwc2V1ZG8tb3BzLiAgKi8KLSAgeyJvcHRpb24iLCBzX29wdGlvbiwgMH0sCi0gIHsic2V0Iiwgc19taXBzc2V0LCAwfSwKLSAgeyJyZGF0YSIsIHNfY2hhbmdlX3NlYywgJ3InfSwKLSAgeyJzZGF0YSIsIHNfY2hhbmdlX3NlYywgJ3MnfSwKLSAgeyJsaXZlcmVnIiwgc19pZ25vcmUsIDB9LAotICB7ImFiaWNhbGxzIiwgc19hYmljYWxscywgMH0sCi0gIHsiY3Bsb2FkIiwgc19jcGxvYWQsIDB9LAotICB7ImNwcmVzdG9yZSIsIHNfY3ByZXN0b3JlLCAwfSwKLSAgeyJncHdvcmQiLCBzX2dwd29yZCwgMH0sCi0gIHsiY3BhZGQiLCBzX2NwYWRkLCAwfSwKLSAgeyJpbnNuIiwgc19pbnNuLCAwfSwKLQotIC8qIFJlbGF0aXZlbHkgZ2VuZXJpYyBwc2V1ZG8tb3BzIHRoYXQgaGFwcGVuIHRvIGJlIHVzZWQgb24gTUlQUwotICAgICBjaGlwcy4gICovCi0gIHsiYXNjaWl6Iiwgc3RyaW5nZXIsIDF9LAotICB7ImJzcyIsIHNfY2hhbmdlX3NlYywgJ2InfSwKLSAgeyJlcnIiLCBzX2VyciwgMH0sCi0gIHsiaGFsZiIsIHNfY29ucywgMX0sCi0gIHsiZHdvcmQiLCBzX2NvbnMsIDN9LAotICB7IndlYWtleHQiLCBzX21pcHNfd2Vha2V4dCwgMH0sCi0KLSAvKiBUaGVzZSBwc2V1ZG8tb3BzIGFyZSBkZWZpbmVkIGluIHJlYWQuYywgYnV0IG11c3QgYmUgb3ZlcnJpZGRlbgotICAgICBoZXJlIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIuICAqLwotICB7ImFsaWduIiwgc19hbGlnbiwgMH0sCi0gIHsiYnl0ZSIsIHNfY29ucywgMH0sCi0gIHsiZGF0YSIsIHNfY2hhbmdlX3NlYywgJ2QnfSwKLSAgeyJkb3VibGUiLCBzX2Zsb2F0X2NvbnMsICdkJ30sCi0gIHsiZmxvYXQiLCBzX2Zsb2F0X2NvbnMsICdmJ30sCi0gIHsiZ2xvYmwiLCBzX21pcHNfZ2xvYmwsIDB9LAotICB7Imdsb2JhbCIsIHNfbWlwc19nbG9ibCwgMH0sCi0gIHsiaHdvcmQiLCBzX2NvbnMsIDF9LAotICB7ImludCIsIHNfY29ucywgMn0sCi0gIHsibG9uZyIsIHNfY29ucywgMn0sCi0gIHsib2N0YSIsIHNfY29ucywgNH0sCi0gIHsicXVhZCIsIHNfY29ucywgM30sCi0gIHsic2hvcnQiLCBzX2NvbnMsIDF9LAotICB7InNpbmdsZSIsIHNfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJzdGFibiIsIHNfbWlwc19zdGFiLCAnbid9LAotICB7InRleHQiLCBzX2NoYW5nZV9zZWMsICd0J30sCi0gIHsid29yZCIsIHNfY29ucywgMn0sCi0gIHsgMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHBzZXVkb190eXBlUyBtaXBzX25vbmVjb2ZmX3BzZXVkb190YWJsZVtdID0gewotIC8qIFRoZXNlIHBzZXVkby1vcHMgc2hvdWxkIGJlIGRlZmluZWQgYnkgdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4KLSAgICBIb3dldmVyLCBhLm91dCBkb2Vzbid0IHN1cHBvcnQgdGhlbSwgc28gd2UgaGF2ZSB2ZXJzaW9ucyBoZXJlLiAgKi8KLSAgeyJhZW50Iiwgc19taXBzX2VudCwgMX0sCi0gIHsiYmduYiIsIHNfaWdub3JlLCAwfSwKLSAgeyJlbmQiLCBzX21pcHNfZW5kLCAwfSwKLSAgeyJlbmRiIiwgc19pZ25vcmUsIDB9LAotICB7ImVudCIsIHNfbWlwc19lbnQsIDB9LAotICB7ImZpbGUiLCBzX2ZpbGUsIDB9LAotICB7ImZtYXNrIiwgc19taXBzX21hc2ssICdGJ30sCi0gIHsiZnJhbWUiLCBzX21pcHNfZnJhbWUsIDB9LAotICB7ImxvYyIsIHNfaWdub3JlLCAwfSwKLSAgeyJtYXNrIiwgc19taXBzX21hc2ssICdSJ30sCi0gIHsidmVyc3RhbXAiLCBzX2lnbm9yZSwgMH0sCi0gIHsgMCB9LAotfTsKLQotZXh0ZXJuIHZvaWQgcG9wX2luc2VydCBQQVJBTVMgKChjb25zdCBwc2V1ZG9fdHlwZVMgKikpOwotCi12b2lkCi1taXBzX3BvcF9pbnNlcnQgKCkKLXsKLSAgcG9wX2luc2VydCAobWlwc19wc2V1ZG9fdGFibGUpOwotICBpZiAoISBFQ09GRl9ERUJVR0dJTkcpCi0gICAgcG9wX2luc2VydCAobWlwc19ub25lY29mZl9wc2V1ZG9fdGFibGUpOwotfQotDAotLyogU3ltYm9scyBsYWJlbGxpbmcgdGhlIGN1cnJlbnQgaW5zbi4gICovCi0KLXN0cnVjdCBpbnNuX2xhYmVsX2xpc3QKLXsKLSAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbmV4dDsKLSAgc3ltYm9sUyAqbGFiZWw7Ci19OwotCi1zdGF0aWMgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqaW5zbl9sYWJlbHM7Ci1zdGF0aWMgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqZnJlZV9pbnNuX2xhYmVsczsKLQotc3RhdGljIHZvaWQgbWlwc19jbGVhcl9pbnNuX2xhYmVscyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKQotewotICByZWdpc3RlciBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICoqcGw7Ci0KLSAgZm9yIChwbCA9ICZmcmVlX2luc25fbGFiZWxzOyAqcGwgIT0gTlVMTDsgcGwgPSAmKCpwbCktPm5leHQpCi0gICAgOwotICAqcGwgPSBpbnNuX2xhYmVsczsKLSAgaW5zbl9sYWJlbHMgPSBOVUxMOwotfQotDAotc3RhdGljIGNoYXIgKmV4cHJfZW5kOwotCi0vKiBFeHByZXNzaW9ucyB3aGljaCBhcHBlYXIgaW4gaW5zdHJ1Y3Rpb25zLiAgVGhlc2UgYXJlIHNldCBieQotICAgbWlwc19pcC4gICovCi0KLXN0YXRpYyBleHByZXNzaW9uUyBpbW1fZXhwcjsKLXN0YXRpYyBleHByZXNzaW9uUyBvZmZzZXRfZXhwcjsKLQotLyogUmVsb2NzIGFzc29jaWF0ZWQgd2l0aCBpbW1fZXhwciBhbmQgb2Zmc2V0X2V4cHIuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGltbV9yZWxvYzsKLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgb2Zmc2V0X3JlbG9jOwotCi0vKiBUaGlzIGlzIHNldCBieSBtaXBzX2lwIGlmIGltbV9yZWxvYyBpcyBhbiB1bm1hdGNoZWQgSEkxNl9TIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gaW1tX3VubWF0Y2hlZF9oaTsKLQotLyogVGhlc2UgYXJlIHNldCBieSBtaXBzMTZfaXAgaWYgYW4gZXhwbGljaXQgZXh0ZW5zaW9uIGlzIHVzZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBtaXBzMTZfc21hbGwsIG1pcHMxNl9leHQ7Ci0KLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotLyogVGhlIHBkciBzZWdtZW50IGZvciBwZXIgcHJvY2VkdXJlIGZyYW1lL3JlZ21hc2sgaW5mbyAqLwotCi1zdGF0aWMgc2VnVCBwZHJfc2VnOwotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCi0gKiBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4KLSAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgYm9vbGVhbiBvayA9IGZhbHNlOwotICByZWdpc3RlciBjb25zdCBjaGFyICpyZXR2YWwgPSBOVUxMOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0gIGNvbnN0IGNoYXIgKmNwdTsKLSAgY2hhciAqYSA9IE5VTEw7Ci0gIGludCBicm9rZW4gPSAwOwotICBpbnQgbWlwc19pc2FfZnJvbV9jcHU7Ci0KLSAgY3B1ID0gVEFSR0VUX0NQVTsKLSAgaWYgKHN0cmNtcCAoY3B1ICsgKHNpemVvZiBUQVJHRVRfQ1BVKSAtIDMsICJlbCIpID09IDApCi0gICAgewotICAgICAgYSA9IHhtYWxsb2MgKHNpemVvZiBUQVJHRVRfQ1BVKTsKLSAgICAgIHN0cmNweSAoYSwgVEFSR0VUX0NQVSk7Ci0gICAgICBhWyhzaXplb2YgVEFSR0VUX0NQVSkgLSAzXSA9ICdcMCc7Ci0gICAgICBjcHUgPSBhOwotICAgIH0KLQotICBpZiAobWlwc19jcHUgPCAwKQotICAgIHsKLSAgICAgIC8qIFNldCBtaXBzX2NwdSBiYXNlZCBvbiBUQVJHRVRfQ1BVLCB1bmxlc3MgVEFSR0VUX0NQVSBpcwotICAgICAgICAganVzdCB0aGUgZ2VuZXJpYyAnbWlwcycsIGluIHdoaWNoIGNhc2Ugc2V0IG1pcHNfY3B1IGJhc2VkCi0gICAgICAgICBvbiB0aGUgZ2l2ZW4gSVNBLCBpZiBhbnkuICovCi0KLSAgICAgIGlmIChzdHJjbXAgKGNwdSwgIm1pcHMiKSA9PSAwKQotICAgICAgICB7Ci0JICBpZiAobWlwc19vcHRzLmlzYSA8IDApCi0JICAgIG1pcHNfY3B1ID0gMzAwMDsgICAKLQotCSAgZWxzZSBpZiAobWlwc19vcHRzLmlzYSA9PSAyKQotICAgICAgICAgICAgbWlwc19jcHUgPSA2MDAwOwotCi0gICAgICAgICAgZWxzZSBpZiAobWlwc19vcHRzLmlzYSA9PSAzKQotICAgICAgICAgICAgbWlwc19jcHUgPSA0MDAwOwotCi0gICAgICAgICAgZWxzZSBpZiAobWlwc19vcHRzLmlzYSA9PSA0KQotICAgICAgICAgICAgbWlwc19jcHUgPSA4MDAwOwotCi0gICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgIG1pcHNfY3B1ID0gMzAwMDsKLSAgICAgICAgfQotICAgICAgCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInIzOTAwIikgPT0gMAotICAgICAgICAgICAgICAgfHwgc3RyY21wIChjcHUsICJtaXBzdHgzOSIpID09IDAKLSAgICAgICAgICAgICAgICkKLSAgICAgICAgbWlwc19jcHUgPSAzOTAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI2MDAwIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgIm1pcHMyIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA2MDAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHM2NCIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChjcHUsICJyNDAwMCIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChjcHUsICJtaXBzMyIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDAwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyNDQwMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDQwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJtaXBzNjRvcmlvbiIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChjcHUsICJyNDYwMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDYwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyNDY1MCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDY1MDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJtaXBzNjR2cjQzMDAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQzMDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczY0dnI0MTExIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0MTExOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHM2NHZyNDEwMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDEwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyNDAxMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDAxMDsKLQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI1MDAwIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgIm1pcHM2NHZyNTAwMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNTAwMDsKLQotCi0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjgwMDAiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoY3B1LCAibWlwczQiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDgwMDA7Ci0gICAgICAKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjEwMDAwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSAxMDAwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJtaXBzMTYiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDA7IC8qIEZJWE1FICovCi0KLSAgICAgIGVsc2UKLSAgICAgICAgbWlwc19jcHUgPSAzMDAwOwotICAgIH0KLQotICBpZiAobWlwc19jcHUgPT0gMzAwMAotICAgICAgfHwgbWlwc19jcHUgPT0gMzkwMCkKLSAgICBtaXBzX2lzYV9mcm9tX2NwdSA9IDE7Ci0KLSAgZWxzZSBpZiAobWlwc19jcHUgPT0gNjAwMAotCSAgIHx8IG1pcHNfY3B1ID09IDQwMTApCi0gICAgbWlwc19pc2FfZnJvbV9jcHUgPSAyOwotCi0gIGVsc2UgaWYgKG1pcHNfY3B1ID09IDQwMDAKLQkgICB8fCBtaXBzX2NwdSA9PSA0MTAwCi0JICAgfHwgbWlwc19jcHUgPT0gNDExMQotCSAgIHx8IG1pcHNfY3B1ID09IDQ0MDAKLQkgICB8fCBtaXBzX2NwdSA9PSA0MzAwCi0JICAgfHwgbWlwc19jcHUgPT0gNDYwMAotCSAgIHx8IG1pcHNfY3B1ID09IDQ2NTApCi0gICAgbWlwc19pc2FfZnJvbV9jcHUgPSAzOwotCi0gIGVsc2UgaWYgKG1pcHNfY3B1ID09IDUwMDAKLQkgICB8fCBtaXBzX2NwdSA9PSA4MDAwCi0gICAgICAgICAgICAgICB8fCBtaXBzX2NwdSA9PSAxMDAwMCkKLSAgICBtaXBzX2lzYV9mcm9tX2NwdSA9IDQ7Ci0KLSAgZWxzZQotICAgIG1pcHNfaXNhX2Zyb21fY3B1ID0gLTE7Ci0KLSAgaWYgKG1pcHNfb3B0cy5pc2EgPT0gLTEpCi0gICAgewotICAgICAgaWYgKG1pcHNfaXNhX2Zyb21fY3B1ICE9IC0xKQotCW1pcHNfb3B0cy5pc2EgPSBtaXBzX2lzYV9mcm9tX2NwdTsKLSAgICAgIGVsc2UKLQltaXBzX29wdHMuaXNhID0gMTsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYgPCAwKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChUQVJHRVRfQ1BVLCAibWlwczE2Iiwgc2l6ZW9mICJtaXBzMTYiIC0gMSkgPT0gMCkKLQltaXBzX29wdHMubWlwczE2ID0gMTsKLSAgICAgIGVsc2UKLQltaXBzX29wdHMubWlwczE2ID0gMDsKLSAgICB9Ci0KLSAgLyogRW5kIG9mIFRBUkdFVF9DUFUgcHJvY2Vzc2luZywgZ2V0IHJpZCBvZiBtYWxsb2NlZCBtZW1vcnkKLSAgICAgaWYgbmVjZXNzYXJ5LiAqLwotICBjcHUgPSBOVUxMOwotICBpZiAoYSAhPSBOVUxMKQotICAgIHsKLSAgICBmcmVlIChhKTsKLSAgICBhID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfb3B0cy5pc2EgPT0gMSAmJiBtaXBzX3RyYXApCi0gICAgYXNfYmFkIChfKCJ0cmFwIGV4Y2VwdGlvbiBub3Qgc3VwcG9ydGVkIGF0IElTQSAxIikpOwotCi0gIC8qIFNldCB0aGUgRUFCSSBraW5kIGJhc2VkIG9uIHRoZSBJU0EgYmVmb3JlIHRoZSB1c2VyIGdldHMKLSAgICAgdG8gY2hhbmdlIHRoZSBJU0Egd2l0aCBkaXJlY3RpdmVzLiAgVGhpcyBpc24ndCByZWFsbHkKLSAgICAgdGhlIGJlc3QsIGJ1dCB0aGVuIG5laXRoZXIgaXMgYmFzaW5nIHRoZSBhYmkgb24gdGhlIGlzYS4gKi8gICAgIAotICBpZiAoSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKQotICAgICAgJiYgbWlwc19hYmlfc3RyaW5nCi0gICAgICAmJiAwID09IHN0cmNtcCAobWlwc19hYmlfc3RyaW5nLCJlYWJpIikpCi0gICAgbWlwc19lYWJpNjQgPSAxOwotCi0gIGlmIChtaXBzX2NwdSAhPSAwICYmIG1pcHNfY3B1ICE9IC0xKQotICAgIHsKLSAgICAgIG9rID0gYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbWlwcywgbWlwc19jcHUpOwotICAgICAgCi0gICAgICAvKiBJZiB0aGV5IGFza2VkIGZvciBtaXBzMSBvciBtaXBzMiBhbmQgYSBjcHUgdGhhdCBpcwotCSBtaXBzMyBvciBncmVhdGVyLCB0aGVuIG1hcmsgdGhlIG9iamVjdCBmaWxlIDMyQklUTU9ERS4gKi8KLSAgICAgIGlmIChtaXBzX2lzYV9mcm9tX2NwdSAhPSAtMQotCSAgJiYgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpIAotCSAgJiYgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX2lzYV9mcm9tX2NwdSkpCi0JbWlwc18zMmJpdG1vZGUgPSAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAobWlwc19vcHRzLmlzYSkKLQl7Ci0JY2FzZSAxOgotCSAgb2sgPSBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9taXBzLCAzMDAwKTsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIG9rID0gYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbWlwcywgNjAwMCk7Ci0JICBicmVhazsKLQljYXNlIDM6Ci0JICBvayA9IGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21pcHMsIDQwMDApOwotCSAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgb2sgPSBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9taXBzLCA4MDAwKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgb2spCi0gICAgYXNfd2FybiAoXygiQ291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgZmlsZV9taXBzX2lzYSA9IG1pcHNfb3B0cy5pc2E7Ci0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1PUENPREVTOykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gbWlwc19vcGNvZGVzW2ldLm5hbWU7Ci0KLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAoUFRSKSAmbWlwc19vcGNvZGVzW2ldKTsKLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iKSwKLQkJICAgbWlwc19vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7Ci0JICAvKiBQcm9iYWJseSBhIG1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0/ICBHaXZlIHVwIG5vdy4gICovCi0JICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0JfQotICAgICAgZG8KLQl7Ci0JICBpZiAobWlwc19vcGNvZGVzW2ldLnBpbmZvICE9IElOU05fTUFDUk8pCi0JICAgIHsKLQkgICAgICBpZiAoIXZhbGlkYXRlX21pcHNfaW5zbiAoJm1pcHNfb3Bjb2Rlc1tpXSkpCi0JCWJyb2tlbiA9IDE7Ci0JICAgIH0KLQkgICsraTsKLQl9Ci0gICAgICB3aGlsZSAoKGkgPCBOVU1PUENPREVTKSAmJiAhc3RyY21wIChtaXBzX29wY29kZXNbaV0ubmFtZSwgbmFtZSkpOwotICAgIH0KLQotICBtaXBzMTZfb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIGkgPSAwOwotICB3aGlsZSAoaSA8IGJmZF9taXBzMTZfbnVtX29wY29kZXMpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG1pcHMxNl9vcGNvZGVzW2ldLm5hbWU7Ci0KLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChtaXBzMTZfb3BfaGFzaCwgbmFtZSwgKFBUUikgJm1pcHMxNl9vcGNvZGVzW2ldKTsKLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQlhc19mYXRhbCAoXygiaW50ZXJuYWw6IGNhbid0IGhhc2ggYCVzJzogJXMiKSwKLQkJICBtaXBzMTZfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotICAgICAgZG8KLQl7Ci0JICBpZiAobWlwczE2X29wY29kZXNbaV0ucGluZm8gIT0gSU5TTl9NQUNSTwotCSAgICAgICYmICgobWlwczE2X29wY29kZXNbaV0ubWF0Y2ggJiBtaXBzMTZfb3Bjb2Rlc1tpXS5tYXNrKQotCQkgICE9IG1pcHMxNl9vcGNvZGVzW2ldLm1hdGNoKSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGJhZCBtaXBzMTYgb3Bjb2RlOiAlcyAlc1xuIiksCi0JCSAgICAgICBtaXBzMTZfb3Bjb2Rlc1tpXS5uYW1lLCBtaXBzMTZfb3Bjb2Rlc1tpXS5hcmdzKTsKLQkgICAgICBicm9rZW4gPSAxOwotCSAgICB9Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKGkgPCBiZmRfbWlwczE2X251bV9vcGNvZGVzCi0JICAgICAmJiBzdHJjbXAgKG1pcHMxNl9vcGNvZGVzW2ldLm5hbWUsIG5hbWUpID09IDApOwotICAgIH0KLQotICBpZiAoYnJva2VuKQotICAgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKLQotICAvKiBXZSBhZGQgYWxsIHRoZSBnZW5lcmFsIHJlZ2lzdGVyIG5hbWVzIHRvIHRoZSBzeW1ib2wgdGFibGUuICBUaGlzCi0gICAgIGhlbHBzIHVzIGRldGVjdCBpbnZhbGlkIHVzZXMgb2YgdGhlbS4gICovCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzVdOwotCi0gICAgICBzcHJpbnRmIChidWYsICIkJWQiLCBpKTsKLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKGJ1ZiwgcmVnX3NlY3Rpb24sIGksCi0JCQkJICAgICAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICAgIH0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRmcCIsIHJlZ19zZWN0aW9uLCBGUCwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRzcCIsIHJlZ19zZWN0aW9uLCBTUCwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRncCIsIHJlZ19zZWN0aW9uLCBHUCwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRhdCIsIHJlZ19zZWN0aW9uLCBBVCwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRrdDAiLCByZWdfc2VjdGlvbiwgS1QwLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGt0MSIsIHJlZ19zZWN0aW9uLCBLVDEsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIkcGMiLCByZWdfc2VjdGlvbiwgLTEsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0KLSAgbWlwc19ub19wcmV2X2luc24gKGZhbHNlKTsKLQotICBtaXBzX2dwcm1hc2sgPSAwOwotICBtaXBzX2Nwcm1hc2tbMF0gPSAwOwotICBtaXBzX2Nwcm1hc2tbMV0gPSAwOwotICBtaXBzX2Nwcm1hc2tbMl0gPSAwOwotICBtaXBzX2Nwcm1hc2tbM10gPSAwOwotCi0gIC8qIHNldCB0aGUgZGVmYXVsdCBhbGlnbm1lbnQgZm9yIHRoZSB0ZXh0IHNlY3Rpb24gKDIqKjIpICovCi0gIHJlY29yZF9hbGlnbm1lbnQgKHRleHRfc2VjdGlvbiwgMik7Ci0KLSAgaWYgKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQpCi0gICAgYmZkX3NldF9ncF9zaXplIChzdGRvdXRwdXQsIGdfc3dpdGNoX3ZhbHVlKTsKLQotICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIC8qIE9uIGEgbmF0aXZlIHN5c3RlbSwgc2VjdGlvbnMgbXVzdCBiZSBhbGlnbmVkIHRvIDE2IGJ5dGUKLQkgYm91bmRhcmllcy4gIFdoZW4gY29uZmlndXJlZCBmb3IgYW4gZW1iZWRkZWQgRUxGIHRhcmdldCwgd2UKLQkgZG9uJ3QgYm90aGVyLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpICE9IDApCi0JewotCSAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgdGV4dF9zZWN0aW9uLCA0KTsKLQkgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIGRhdGFfc2VjdGlvbiwgNCk7Ci0JICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBic3Nfc2VjdGlvbiwgNCk7Ci0JfQotCi0gICAgICAvKiBDcmVhdGUgYSAucmVnaW5mbyBzZWN0aW9uIGZvciByZWdpc3RlciBtYXNrcyBhbmQgYSAubWRlYnVnCi0JIHNlY3Rpb24gZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgICB7Ci0Jc2VnVCBzZWc7Ci0Jc3Vic2VnVCBzdWJzZWc7Ci0JZmxhZ3dvcmQgZmxhZ3M7Ci0Jc2VnVCBzZWM7Ci0KLQlzZWcgPSBub3dfc2VnOwotCXN1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLQkvKiBUaGUgQUJJIHNheXMgdGhpcyBzZWN0aW9uIHNob3VsZCBiZSBsb2FkZWQgc28gdGhhdCB0aGUKLQkgICBydW5uaW5nIHByb2dyYW0gY2FuIGFjY2VzcyBpdC4gIEhvd2V2ZXIsIHdlIGRvbid0IGxvYWQgaXQKLQkgICBpZiB3ZSBhcmUgY29uZmlndXJlZCBmb3IgYW4gZW1iZWRkZWQgdGFyZ2V0ICovCi0JZmxhZ3MgPSBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQTsKLQlpZiAoc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSAhPSAwKQotCSAgZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0KLQlpZiAoISBtaXBzXzY0KQotCSAgewotCSAgICBzZWMgPSBzdWJzZWdfbmV3ICgiLnJlZ2luZm8iLCAoc3Vic2VnVCkgMCk7Ci0KLQotCSAgICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYywgZmxhZ3MpOwotCSAgICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWMsIDIpOwotCQotI2lmZGVmIE9CSl9FTEYKLQkgICAgbWlwc19yZWdtYXNrX2ZyYWcgPSBmcmFnX21vcmUgKHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykpOwotI2VuZGlmCi0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiBUaGUgNjQtYml0IEFCSSB1c2VzIGEgLk1JUFMub3B0aW9ucyBzZWN0aW9uIHJhdGhlciB0aGFuCi0gICAgICAgICAgICAgICAucmVnaW5mbyBzZWN0aW9uLiAgKi8KLQkgICAgc2VjID0gc3Vic2VnX25ldyAoIi5NSVBTLm9wdGlvbnMiLCAoc3Vic2VnVCkgMCk7Ci0JICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncyk7Ci0JICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlYywgMyk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0JICAgIC8qIFNldCB1cCB0aGUgb3B0aW9uIGhlYWRlci4gICovCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfT3B0aW9ucyBvcHRoZHI7Ci0JICAgICAgY2hhciAqZjsKLQotCSAgICAgIG9wdGhkci5raW5kID0gT0RLX1JFR0lORk87Ci0JICAgICAgb3B0aGRyLnNpemUgPSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykKLQkJCSAgICAgKyBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pKTsKLQkgICAgICBvcHRoZHIuc2VjdGlvbiA9IDA7Ci0JICAgICAgb3B0aGRyLmluZm8gPSAwOwotCSAgICAgIGYgPSBmcmFnX21vcmUgKHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpKTsKLQkgICAgICBiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX291dCAoc3Rkb3V0cHV0LCAmb3B0aGRyLAotCQkJCQkgICAgIChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSBmKTsKLQotCSAgICAgIG1pcHNfcmVnbWFza19mcmFnID0gZnJhZ19tb3JlIChzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pKTsKLQkgICAgfQotI2VuZGlmCi0JICB9Ci0KLQlpZiAoRUNPRkZfREVCVUdHSU5HKQotCSAgewotCSAgICBzZWMgPSBzdWJzZWdfbmV3ICgiLm1kZWJ1ZyIsIChzdWJzZWdUKSAwKTsKLQkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMsCi0JCQkJCSAgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSk7Ci0JICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlYywgMik7Ci0JICB9Ci0KLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotCXBkcl9zZWcgPSBzdWJzZWdfbmV3ICgiLnBkciIsIChzdWJzZWdUKSAwKTsKLQkodm9pZCkgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHBkcl9zZWcsCi0JCQkgICAgIFNFQ19SRUFET05MWSB8IFNFQ19SRUxPQyB8IFNFQ19ERUJVR0dJTkcpOwotCSh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHBkcl9zZWcsIDIpOwotI2VuZGlmCi0KLQlzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0gICAgICB9Ci0gICAgfQotCi0gIGlmICghIEVDT0ZGX0RFQlVHR0lORykKLSAgICBtZF9vYmpfYmVnaW4gKCk7Ci19Ci0KLXZvaWQKLW1kX21pcHNfZW5kICgpCi17Ci0gIGlmICghIEVDT0ZGX0RFQlVHR0lORykKLSAgICBtZF9vYmpfZW5kICgpOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHN0cnVjdCBtaXBzX2NsX2luc24gaW5zbjsKLQotICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0gIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0gIGltbV91bm1hdGNoZWRfaGkgPSBmYWxzZTsKLSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fYWJzZW50OwotICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCi0gIGlmIChtaXBzX29wdHMubWlwczE2KQotICAgIG1pcHMxNl9pcCAoc3RyLCAmaW5zbik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtaXBzX2lwIChzdHIsICZpbnNuKTsKLSAgICAgIERCRygoXygicmV0dXJuZWQgZnJvbSBtaXBzX2lwKCVzKSBpbnNuX29wY29kZSA9IDB4JXhcbiIpLCAKLQkJc3RyLCBpbnNuLmluc25fb3Bjb2RlKSk7Ci0gICAgfQotCi0gIGlmIChpbnNuX2Vycm9yKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIiVzIGAlcyciLCBpbnNuX2Vycm9yLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5zbi5pbnNuX21vLT5waW5mbyA9PSBJTlNOX01BQ1JPKQotICAgIHsKLSAgICAgIGlmIChtaXBzX29wdHMubWlwczE2KQotCW1pcHMxNl9tYWNybyAoJmluc24pOwotICAgICAgZWxzZQotCW1hY3JvICgmaW5zbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19hYnNlbnQpCi0JYXBwZW5kX2luc24gKChjaGFyICopIE5VTEwsICZpbnNuLCAmaW1tX2V4cHIsIGltbV9yZWxvYywKLQkJICAgICBpbW1fdW5tYXRjaGVkX2hpKTsKLSAgICAgIGVsc2UgaWYgKG9mZnNldF9leHByLlhfb3AgIT0gT19hYnNlbnQpCi0JYXBwZW5kX2luc24gKChjaGFyICopIE5VTEwsICZpbnNuLCAmb2Zmc2V0X2V4cHIsIG9mZnNldF9yZWxvYywgZmFsc2UpOwotICAgICAgZWxzZQotCWFwcGVuZF9pbnNuICgoY2hhciAqKSBOVUxMLCAmaW5zbiwgTlVMTCwgQkZEX1JFTE9DX1VOVVNFRCwgZmFsc2UpOwotICAgIH0KLX0KLQotLyogU2VlIHdoZXRoZXIgaW5zdHJ1Y3Rpb24gSVAgcmVhZHMgcmVnaXN0ZXIgUkVHLiAgQ0xBU1MgaXMgdGhlIHR5cGUKLSAgIG9mIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIGludAotaW5zbl91c2VzX3JlZyAoaXAsIHJlZywgY2xhc3MpCi0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotICAgICB1bnNpZ25lZCBpbnQgcmVnOwotICAgICBlbnVtIG1pcHNfcmVnY2xhc3MgY2xhc3M7Ci17Ci0gIGlmIChjbGFzcyA9PSBNSVBTMTZfUkVHKQotICAgIHsKLSAgICAgIGFzc2VydCAobWlwc19vcHRzLm1pcHMxNik7Ci0gICAgICByZWcgPSBtaXBzMTZfdG9fMzJfcmVnX21hcFtyZWddOwotICAgICAgY2xhc3MgPSBNSVBTX0dSX1JFRzsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgcmVwb3J0IG9uIGdlbmVyYWwgcmVnaXN0ZXIgMCwgc2luY2UgaXQgbmV2ZXIgY2hhbmdlcy4gICovCi0gIGlmIChjbGFzcyA9PSBNSVBTX0dSX1JFRyAmJiByZWcgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoY2xhc3MgPT0gTUlQU19GUF9SRUcpCi0gICAgewotICAgICAgYXNzZXJ0ICghIG1pcHNfb3B0cy5taXBzMTYpOwotICAgICAgLyogSWYgd2UgYXJlIGNhbGxlZCB3aXRoIGVpdGhlciAkZjAgb3IgJGYxLCB3ZSBtdXN0IGNoZWNrICRmMC4KLQkgVGhpcyBpcyBub3Qgb3B0aW1hbCwgYmVjYXVzZSBpdCB3aWxsIGludHJvZHVjZSBhbiB1bm5lY2Vzc2FyeQotCSBOT1AgYmV0d2VlbiAibHdjMSAkZjAiIGFuZCAic3djMSAkZjEiLiAgVG8gZml4IHRoaXMgd2Ugd291bGQKLQkgbmVlZCB0byBkaXN0aW5ndWlzaCByZWFkaW5nIGJvdGggJGYwIGFuZCAkZjEgb3IganVzdCBvbmUgb2YKLQkgdGhlbS4gIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZSBvdGhlciB3YXksCi0JIGJlY2F1c2UgdGhlcmUgaXMgbm8gaW5zdHJ1Y3Rpb24gdGhhdCBzZXRzIGJvdGggJGYwIGFuZCAkZjEKLQkgYW5kIHJlcXVpcmVzIGEgZGVsYXkuICAqLwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfRlBSX1MpCi0JICAmJiAoKCgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZTKSAmIE9QX01BU0tfRlMpICZ+KHVuc2lnbmVkKTEpCi0JICAgICAgPT0gKHJlZyAmfiAodW5zaWduZWQpIDEpKSkKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0ZQUl9UKQotCSAgJiYgKCgoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9GVCkgJiBPUF9NQVNLX0ZUKSAmfih1bnNpZ25lZCkxKQotCSAgICAgID09IChyZWcgJn4gKHVuc2lnbmVkKSAxKSkpCi0JcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlIGlmICghIG1pcHNfb3B0cy5taXBzMTYpCi0gICAgewotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfR1BSX1MpCi0JICAmJiAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SUykgJiBPUF9NQVNLX1JTKSA9PSByZWcpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9HUFJfVCkKLQkgICYmICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpID09IHJlZykKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfWCkKLQkgICYmIChtaXBzMTZfdG9fMzJfcmVnX21hcFsoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWCkKLQkJCQkgICAgJiBNSVBTMTZPUF9NQVNLX1JYKV0KLQkgICAgICA9PSByZWcpKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1kpCi0JICAmJiAobWlwczE2X3RvXzMyX3JlZ19tYXBbKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlkpCi0JCQkJICAgICYgTUlQUzE2T1BfTUFTS19SWSldCi0JICAgICAgPT0gcmVnKSkKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9aKQotCSAgJiYgKG1pcHMxNl90b18zMl9yZWdfbWFwWygoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX01PVkUzMlopCi0JCQkJICAgICYgTUlQUzE2T1BfTUFTS19NT1ZFMzJaKV0KLQkgICAgICA9PSByZWcpKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1QpICYmIHJlZyA9PSBUUkVHKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1NQKSAmJiByZWcgPT0gU1ApCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfMzEpICYmIHJlZyA9PSBSQSkKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9HUFJfWCkKLQkgICYmICgoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JFR1IzMikKLQkgICAgICAmIE1JUFMxNk9QX01BU0tfUkVHUjMyKSA9PSByZWcpCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBtb2RpZnlpbmcgYSByZWdpc3RlciByZXF1aXJlcyBhCi0gICBkZWxheS4gICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uZWVkc19kZWxheSAocmVnKQotICAgICBpbnQgcmVnOwotewotICB1bnNpZ25lZCBsb25nIHByZXZfcGluZm87Ci0KLSAgcHJldl9waW5mbyA9IHByZXZfaW5zbi5pbnNuX21vLT5waW5mbzsKLSAgaWYgKCEgbWlwc19vcHRzLm5vcmVvcmRlcgotICAgICAgJiYgSVNBX0hBU19DT1BST0NfREVMQVlTIChtaXBzX29wdHMuaXNhKQotICAgICAgJiYgKChwcmV2X3BpbmZvICYgSU5TTl9MT0FEX0NPUFJPQ19ERUxBWSkKLQkgIHx8ICghIGdwcl9pbnRlcmxvY2tzCi0JICAgICAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0xPQURfTUVNT1JZX0RFTEFZKSkpKQotICAgIHsKLSAgICAgIC8qIEEgbG9hZCBmcm9tIGEgY29wcm9jZXNzb3Igb3IgZnJvbSBtZW1vcnkuICBBbGwgbG9hZAotCSBkZWxheXMgZGVsYXkgdGhlIHVzZSBvZiBnZW5lcmFsIHJlZ2lzdGVyIHJ0IGZvciBvbmUKLQkgaW5zdHJ1Y3Rpb24gb24gdGhlIHIzMDAwLiAgVGhlIHI2MDAwIGFuZCByNDAwMCB1c2UKLQkgaW50ZXJsb2Nrcy4gICovCi0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBrbm93IChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfVCk7Ci0gICAgICBpZiAocmVnID09ICgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpKQotCXJldHVybiAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogTWFyayBpbnN0cnVjdGlvbiBsYWJlbHMgaW4gbWlwczE2IG1vZGUuICBUaGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0bwotICAgaGFuZGxlIHRoZW0gc3BlY2lhbGx5LCBzdWNoIGFzIGdlbmVyYXRpbmcgamFseCBpbnN0cnVjdGlvbnMgd2hlbgotICAgbmVlZGVkLiAgV2UgYWxzbyBtYWtlIHRoZW0gb2RkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGFzc2VtYmx5LCBpbgotICAgb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIHJpZ2h0IHNvcnQgb2YgY29kZS4gIFdlIHdpbGwgbWFrZSB0aGVtIGV2ZW4KLSAgIGluIHRoZSBhZGp1c3Rfc3ltdGFiIHJvdXRpbmUsIHdoaWxlIGxlYXZpbmcgdGhlbSBtYXJrZWQuICBUaGlzIGlzCi0gICBjb252ZW5pZW50IGZvciB0aGUgZGVidWdnZXIgYW5kIHRoZSBkaXNhc3NlbWJsZXIuICBUaGUgbGlua2VyIGtub3dzCi0gICB0byBtYWtlIHRoZW0gb2RkIGFnYWluLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHMxNl9tYXJrX2xhYmVscyAoKQotewotICBpZiAobWlwc19vcHRzLm1pcHMxNikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpsOwotCi0gICAgICBmb3IgKGwgPSBpbnNuX2xhYmVsczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQl7Ci0jaWZkZWYgT0JKX0VMRgotCSAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQkgICAgU19TRVRfT1RIRVIgKGwtPmxhYmVsLCBTVE9fTUlQUzE2KTsKLSNlbmRpZgotCSAgaWYgKChTX0dFVF9WQUxVRSAobC0+bGFiZWwpICYgMSkgPT0gMCkKLQkgICAgU19TRVRfVkFMVUUgKGwtPmxhYmVsLCBTX0dFVF9WQUxVRSAobC0+bGFiZWwpICsgMSk7Ci0JfQotICAgIH0KLX0KLQotLyogT3V0cHV0IGFuIGluc3RydWN0aW9uLiAgUExBQ0UgaXMgd2hlcmUgdG8gcHV0IHRoZSBpbnN0cnVjdGlvbjsgaWYKLSAgIGl0IGlzIE5VTEwsIHRoaXMgdXNlcyBmcmFnX21vcmUgdG8gZ2V0IHJvb20uICBJUCBpcyB0aGUgaW5zdHJ1Y3Rpb24KLSAgIGluZm9ybWF0aW9uLiAgQUREUkVTU19FWFBSIGlzIGFuIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlCi0gICB1c2VkIHdpdGggUkVMT0NfVFlQRS4gICovCi0KLXN0YXRpYyB2b2lkCi1hcHBlbmRfaW5zbiAocGxhY2UsIGlwLCBhZGRyZXNzX2V4cHIsIHJlbG9jX3R5cGUsIHVubWF0Y2hlZF9oaSkKLSAgICAgY2hhciAqcGxhY2U7Ci0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotICAgICBleHByZXNzaW9uUyAqYWRkcmVzc19leHByOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2NfdHlwZTsKLSAgICAgYm9vbGVhbiB1bm1hdGNoZWRfaGk7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcHJldl9waW5mbywgcGluZm87Ci0gIGNoYXIgKmY7Ci0gIGZpeFMgKmZpeHA7Ci0gIGludCBub3BzID0gMDsKLQotICAvKiBNYXJrIGluc3RydWN0aW9uIGxhYmVscyBpbiBtaXBzMTYgbW9kZS4gICovCi0gIGlmIChtaXBzX29wdHMubWlwczE2KQotICAgIG1pcHMxNl9tYXJrX2xhYmVscyAoKTsKLQotICBwcmV2X3BpbmZvID0gcHJldl9pbnNuLmluc25fbW8tPnBpbmZvOwotICBwaW5mbyA9IGlwLT5pbnNuX21vLT5waW5mbzsKLQotICBpZiAocGxhY2UgPT0gTlVMTCAmJiAoISBtaXBzX29wdHMubm9yZW9yZGVyIHx8IHByZXZfbm9wX2ZyYWcgIT0gTlVMTCkpCi0gICAgewotICAgICAgaW50IHByZXZfcHJldl9ub3A7Ci0KLSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnNuIHJlcXVpcmVkIGFueSBkZWxheSBzbG90cywgc2VlIGlmIHdlIG5lZWQKLQkgdG8gaW5zZXJ0IGEgTk9QIG9yIHR3by4gIFRoZXJlIGFyZSBlaWdodCBraW5kcyBvZiBwb3NzaWJsZQotCSBoYXphcmRzLCBvZiB3aGljaCBhbiBpbnN0cnVjdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSB0eXBlLgotCSAoMSkgYSBsb2FkIGZyb20gbWVtb3J5IGRlbGF5Ci0JICgyKSBhIGxvYWQgZnJvbSBhIGNvcHJvY2Vzc29yIGRlbGF5Ci0JICgzKSBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCBkZWxheQotCSAoNCkgYSBjb25kaXRpb25hbCBicmFuY2ggZGVsYXkKLQkgKDUpIGEgbW92ZSB0byBjb3Byb2Nlc3NvciByZWdpc3RlciBkZWxheQotCSAoNikgYSBsb2FkIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIGZyb20gbWVtb3J5IGRlbGF5Ci0JICg3KSBhIGNvcHJvY2Vzc29yIGNvbmRpdGlvbiBjb2RlIGRlbGF5Ci0JICg4KSBhIEhJL0xPIHNwZWNpYWwgcmVnaXN0ZXIgZGVsYXkKLQotCSBUaGVyZSBhcmUgYSBsb3Qgb2Ygb3B0aW1pemF0aW9ucyB3ZSBjb3VsZCBkbyB0aGF0IHdlIGRvbid0LgotCSBJbiBwYXJ0aWN1bGFyLCB3ZSBkbyBub3QsIGluIGdlbmVyYWwsIHJlb3JkZXIgaW5zdHJ1Y3Rpb25zLgotCSBJZiB5b3UgdXNlIGdjYyB3aXRoIG9wdGltaXphdGlvbiwgaXQgd2lsbCByZW9yZGVyCi0JIGluc3RydWN0aW9ucyBhbmQgZ2VuZXJhbGx5IGRvIG11Y2ggbW9yZSBvcHRpbWl6YXRpb24gdGhlbiB3ZQotCSBkbyBoZXJlOyByZXBlYXRpbmcgYWxsIHRoYXQgd29yayBpbiB0aGUgYXNzZW1ibGVyIHdvdWxkIG9ubHkKLQkgYmVuZWZpdCBoYW5kIHdyaXR0ZW4gYXNzZW1ibHkgY29kZSwgYW5kIGRvZXMgbm90IHNlZW0gd29ydGgKLQkgaXQuICAqLwotCi0gICAgICAvKiBUaGlzIGlzIGhvdyBhIE5PUCBpcyBlbWl0dGVkLiAgKi8KLSNkZWZpbmUgZW1pdF9ub3AoKQkJCQkJXAotICAobWlwc19vcHRzLm1pcHMxNgkJCQkJXAotICAgPyBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdfbW9yZSAoMiksIDB4NjUwMCwgMikJXAotICAgOiBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdfbW9yZSAoNCksIDAsIDQpKQotCi0gICAgICAvKiBUaGUgcHJldmlvdXMgaW5zbiBtaWdodCByZXF1aXJlIGEgZGVsYXkgc2xvdCwgZGVwZW5kaW5nIHVwb24KLQkgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGluc24uICAqLwotICAgICAgaWYgKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgJiYgSVNBX0hBU19DT1BST0NfREVMQVlTIChtaXBzX29wdHMuaXNhKQotCSAgJiYgKCgocHJldl9waW5mbyAmIElOU05fTE9BRF9DT1BST0NfREVMQVkpCi0gICAgICAgICAgICAgICAmJiAhIGNvcF9pbnRlcmxvY2tzKQotCSAgICAgIHx8ICghIGdwcl9pbnRlcmxvY2tzCi0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0xPQURfTUVNT1JZX0RFTEFZKSkpKQotCXsKLQkgIC8qIEEgbG9hZCBmcm9tIGEgY29wcm9jZXNzb3Igb3IgZnJvbSBtZW1vcnkuICBBbGwgbG9hZAotCSAgICAgZGVsYXlzIGRlbGF5IHRoZSB1c2Ugb2YgZ2VuZXJhbCByZWdpc3RlciBydCBmb3Igb25lCi0JICAgICBpbnN0cnVjdGlvbiBvbiB0aGUgcjMwMDAuICBUaGUgcjYwMDAgYW5kIHI0MDAwIHVzZQotCSAgICAgaW50ZXJsb2Nrcy4gICovCi0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAga25vdyAocHJldl9waW5mbyAmIElOU05fV1JJVEVfR1BSX1QpOwotCSAgaWYgKG1pcHNfb3B0aW1pemUgPT0gMAotCSAgICAgIHx8IGluc25fdXNlc19yZWcgKGlwLAotCQkJCSgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKQotCQkJCSAmIE9QX01BU0tfUlQpLAotCQkJCU1JUFNfR1JfUkVHKSkKLQkgICAgKytub3BzOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgICAgICAmJiBJU0FfSEFTX0NPUFJPQ19ERUxBWVMgKG1pcHNfb3B0cy5pc2EpCi0JICAgICAgICYmICgoKHByZXZfcGluZm8gJiBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZKQotICAgICAgICAgICAgICAgICAgICAmJiAhIGNvcF9pbnRlcmxvY2tzKQotCQkgICB8fCAobWlwc19vcHRzLmlzYSA9PSAxCi0JCSAgICAgICAmJiAocHJldl9waW5mbyAmIElOU05fQ09QUk9DX01FTU9SWV9ERUxBWSkpKSkKLQl7Ci0JICAvKiBBIGdlbmVyaWMgY29wcm9jZXNzb3IgZGVsYXkuICBUaGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KLQkgICAgIG1vZGlmaWVkIGEgY29wcm9jZXNzb3IgZ2VuZXJhbCBvciBjb250cm9sIHJlZ2lzdGVyLiAgSWYKLQkgICAgIGl0IG1vZGlmaWVkIGEgY29udHJvbCByZWdpc3Rlciwgd2UgbmVlZCB0byBhdm9pZCBhbnkKLQkgICAgIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uICh0aGlzIGlzIHByb2JhYmx5IG5vdCBhbHdheXMKLQkgICAgIHJlcXVpcmVkLCBidXQgaXQgc29tZXRpbWVzIGlzKS4gIElmIGl0IG1vZGlmaWVkIGEgZ2VuZXJhbAotCSAgICAgcmVnaXN0ZXIsIHdlIGF2b2lkIHVzaW5nIHRoYXQgcmVnaXN0ZXIuCi0KLQkgICAgIE9uIHRoZSByNjAwMCBhbmQgcjQwMDAgbG9hZGluZyBhIGNvcHJvY2Vzc29yIHJlZ2lzdGVyCi0JICAgICBmcm9tIG1lbW9yeSBpcyBpbnRlcmxvY2tlZCwgYW5kIGRvZXMgbm90IHJlcXVpcmUgYSBkZWxheS4KLQotCSAgICAgVGhpcyBjYXNlIGlzIG5vdCBoYW5kbGVkIHZlcnkgd2VsbC4gIFRoZXJlIGlzIG5vIHNwZWNpYWwKLQkgICAgIGtub3dsZWRnZSBvZiBDUDAgaGFuZGxpbmcsIGFuZCB0aGUgY29wcm9jZXNzb3JzIG90aGVyCi0JICAgICB0aGFuIHRoZSBmbG9hdGluZyBwb2ludCB1bml0IGFyZSBub3QgZGlzdGluZ3Vpc2hlZCBhdAotCSAgICAgYWxsLiAgKi8KLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuIEZJWE1FIQotICAgICAgICAgICAgIE5lZWQgdG8gbW9kaWZ5IHRoaXMgdG8gaW5jbHVkZSBrbm93bGVkZ2UgYWJvdXQgCi0gICAgICAgICAgICAgdXNlciBzcGVjaWZpZWQgZGVsYXlzISAgKi8KLQkgIGlmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9GUFJfVCkKLQkgICAgewotCSAgICAgIGlmIChtaXBzX29wdGltaXplID09IDAKLQkJICB8fCBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkgICAgKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfRlQpCi0JCQkJICAgICAmIE9QX01BU0tfRlQpLAotCQkJCSAgICBNSVBTX0ZQX1JFRykpCi0JCSsrbm9wczsKLQkgICAgfQotCSAgZWxzZSBpZiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfRlBSX1MpCi0JICAgIHsKLQkgICAgICBpZiAobWlwc19vcHRpbWl6ZSA9PSAwCi0JCSAgfHwgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJICAgICgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX0ZTKQotCQkJCSAgICAgJiBPUF9NQVNLX0ZTKSwKLQkJCQkgICAgTUlQU19GUF9SRUcpKQotCQkrK25vcHM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdlIGRvbid0IGtub3cgZXhhY3RseSB3aGF0IHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbgotCQkgZG9lcy4gIElmIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHVzZXMgYSBjb3Byb2Nlc3NvcgotCQkgcmVnaXN0ZXIsIHdlIG11c3QgaW5zZXJ0IGEgTk9QLiAgSWYgcHJldmlvdXMKLQkJIGluc3RydWN0aW9uIG1heSBzZXQgdGhlIGNvbmRpdGlvbiBjb2RlcywgYW5kIHRoZQotCQkgY3VycmVudCBpbnN0cnVjdGlvbiB1c2VzIHRoZW0sIHdlIG11c3QgaW5zZXJ0IHR3bwotCQkgTk9QUy4gICovCi0gICAgICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgICAgICBpZiAobWlwc19vcHRpbWl6ZSA9PSAwCi0JCSAgfHwgKChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpCi0JCSAgICAgICYmIChwaW5mbyAmIElOU05fUkVBRF9DT05EX0NPREUpKSkKLQkJbm9wcyArPSAyOwotCSAgICAgIGVsc2UgaWYgKHBpbmZvICYgSU5TTl9DT1ApCi0JCSsrbm9wczsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgICAgICAmJiBJU0FfSEFTX0NPUFJPQ19ERUxBWVMgKG1pcHNfb3B0cy5pc2EpCi0JICAgICAgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpCi0gICAgICAgICAgICAgICAmJiAhIGNvcF9pbnRlcmxvY2tzKQotCXsKLQkgIC8qIFRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBzZXRzIHRoZSBjb3Byb2Nlc3NvciBjb25kaXRpb24KLQkgICAgIGNvZGVzLCBidXQgZG9lcyBub3QgcmVxdWlyZSBhIGdlbmVyYWwgY29wcm9jZXNzb3IgZGVsYXkKLQkgICAgICh0aGlzIG1lYW5zIGl0IGlzIGEgZmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbgotCSAgICAgaW5zdHJ1Y3Rpb24pLiAgSWYgdGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSBjb25kaXRpb24KLQkgICAgIGNvZGVzLCB3ZSBuZWVkIHRvIGluc2VydCBhIHNpbmdsZSBOT1AuICAqLwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIGlmIChtaXBzX29wdGltaXplID09IDAKLQkgICAgICB8fCAocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKSkKLQkgICAgKytub3BzOwotCX0KLSAgICAgIGVsc2UgaWYgKHByZXZfcGluZm8gJiBJTlNOX1JFQURfTE8pCi0JewotCSAgLyogVGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHJlYWRzIHRoZSBMTyByZWdpc3RlcjsgaWYgdGhlCi0JICAgICBjdXJyZW50IGluc3RydWN0aW9uIHdyaXRlcyB0byB0aGUgTE8gcmVnaXN0ZXIsIHdlIG11c3QKLQkgICAgIGluc2VydCB0d28gTk9QUy4gIFNvbWUgbmV3ZXIgcHJvY2Vzc29ycyBoYXZlIGludGVybG9ja3MuIAotCSAgICAgQWxzbyB0aGUgdHgzOSdzIG11bHRpcGx5IGluc3RydWN0aW9ucyBjYW4gYmUgZXhlY3R1dGVkIAotICAgICAgICAgICAgIGltbWVkaWF0bHkgYWZ0ZXIgYSByZWFkIGZyb20gSEkvTE8gKHdpdGhvdXQgdGhlIGRlbGF5KSwKLSAgICAgICAgICAgICB0aG91Z2ggdGhlIHR4MzkncyBkaXZpZGUgaW5zbnMgc3RpbGwgZG8gcmVxdWlyZSB0aGUgCi0JICAgICBkZWxheS4gKi8KLQkgIGlmICghIChoaWxvX2ludGVybG9ja3MKLQkJIHx8IChtaXBzX2NwdSA9PSAzOTAwICYmIChwaW5mbyAmIElOU05fTVVMVCkpKQotCSAgICAgICYmIChtaXBzX29wdGltaXplID09IDAKLQkJICB8fCAocGluZm8gJiBJTlNOX1dSSVRFX0xPKSkpCi0JICAgIG5vcHMgKz0gMjsKLQkgIC8qIE1vc3QgbWlwczE2IGJyYW5jaCBpbnNucyBkb24ndCBoYXZlIGEgZGVsYXkgc2xvdC4KLQkgICAgIElmIGEgcmVhZCBmcm9tIExPIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgYnJhbmNoCi0JICAgICB0byBhIHdyaXRlIHRvIExPIHdlIGhhdmUgYSByZWFkIGZvbGxvd2VkIGJ5IGEgd3JpdGUKLQkgICAgIGxlc3MgdGhhbiAyIGluc25zIGF3YXkuICBXZSBhc3N1bWUgdGhlIHRhcmdldCBvZgotCSAgICAgYSBicmFuY2ggbWlnaHQgYmUgYSB3cml0ZSB0byBMTywgYW5kIGluc2VydCBhIG5vcAotCSAgICAgYmV0d2VlbiBhIHJlYWQgYW5kIGFuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBicmFuY2guICovCi0JICBlbHNlIGlmIChtaXBzX29wdHMubWlwczE2Ci0JCSAgICYmIChtaXBzX29wdGltaXplID09IDAKLQkJICAgICAgIHx8IChwaW5mbyAmIE1JUFMxNl9JTlNOX0JSQU5DSCkpKQotCSAgICBub3BzICs9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0hJKQotCXsKLQkgIC8qIFRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiByZWFkcyB0aGUgSEkgcmVnaXN0ZXI7IGlmIHRoZQotCSAgICAgY3VycmVudCBpbnN0cnVjdGlvbiB3cml0ZXMgdG8gdGhlIEhJIHJlZ2lzdGVyLCB3ZSBtdXN0Ci0JICAgICBpbnNlcnQgYSBOT1AuICBTb21lIG5ld2VyIHByb2Nlc3NvcnMgaGF2ZSBpbnRlcmxvY2tzLgotCSAgICAgQWxzbyB0aGUgbm90ZSB0eDM5J3MgbXVsdGlwbHkgYWJvdmUuICovCi0JICBpZiAoISAoaGlsb19pbnRlcmxvY2tzCi0JCSB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAocGluZm8gJiBJTlNOX01VTFQpKSkKLQkgICAgICAmJiAobWlwc19vcHRpbWl6ZSA9PSAwCi0JCSAgfHwgKHBpbmZvICYgSU5TTl9XUklURV9ISSkpKQotCSAgICBub3BzICs9IDI7Ci0JICAvKiBNb3N0IG1pcHMxNiBicmFuY2ggaW5zbnMgZG9uJ3QgaGF2ZSBhIGRlbGF5IHNsb3QuCi0JICAgICBJZiBhIHJlYWQgZnJvbSBISSBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGJyYW5jaAotCSAgICAgdG8gYSB3cml0ZSB0byBISSB3ZSBoYXZlIGEgcmVhZCBmb2xsb3dlZCBieSBhIHdyaXRlCi0JICAgICBsZXNzIHRoYW4gMiBpbnNucyBhd2F5LiAgV2UgYXNzdW1lIHRoZSB0YXJnZXQgb2YKLQkgICAgIGEgYnJhbmNoIG1pZ2h0IGJlIGEgd3JpdGUgdG8gSEksIGFuZCBpbnNlcnQgYSBub3AKLQkgICAgIGJldHdlZW4gYSByZWFkIGFuZCBhbiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYnJhbmNoLiAqLwotCSAgZWxzZSBpZiAobWlwc19vcHRzLm1pcHMxNgotCQkgICAmJiAobWlwc19vcHRpbWl6ZSA9PSAwCi0JCSAgICAgICB8fCAocGluZm8gJiBNSVBTMTZfSU5TTl9CUkFOQ0gpKSkKLQkgICAgbm9wcyArPSAxOwotCX0KLQotICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBpbiBhIG5vcmVvcmRlciBzZWN0aW9uLCB0aGVuCi0gICAgICAgICB3ZSBkb24ndCB3YW50IHRvIGluc2VydCB0aGUgbm9wIGFmdGVyIGFsbC4gICovCi0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBpZiAocHJldl9pbnNuX3VucmVvcmRlcmVkKQotCW5vcHMgPSAwOwotCi0gICAgICAvKiBUaGVyZSBhcmUgdHdvIGNhc2VzIHdoaWNoIHJlcXVpcmUgdHdvIGludGVydmVuaW5nCi0JIGluc3RydWN0aW9uczogMSkgc2V0dGluZyB0aGUgY29uZGl0aW9uIGNvZGVzIHVzaW5nIGEgbW92ZSB0bwotCSBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiB3aGljaCByZXF1aXJlcyBhIGdlbmVyYWwgY29wcm9jZXNzb3IKLQkgZGVsYXkgYW5kIHRoZW4gcmVhZGluZyB0aGUgY29uZGl0aW9uIGNvZGVzIDIpIHJlYWRpbmcgdGhlIEhJCi0JIG9yIExPIHJlZ2lzdGVyIGFuZCB0aGVuIHdyaXRpbmcgdG8gaXQgKGV4Y2VwdCBvbiBwcm9jZXNzb3JzCi0JIHdoaWNoIGhhdmUgaW50ZXJsb2NrcykuICBJZiB3ZSBhcmUgbm90IGFscmVhZHkgZW1pdHRpbmcgYSBOT1AKLQkgaW5zdHJ1Y3Rpb24sIHdlIG11c3QgY2hlY2sgZm9yIHRoZXNlIGNhc2VzIGNvbXBhcmVkIHRvIHRoZQotCSBpbnN0cnVjdGlvbiBwcmV2aW91cyB0byB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgaWYgKCghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAmJiBJU0FfSEFTX0NPUFJPQ19ERUxBWVMgKG1pcHNfb3B0cy5pc2EpCi0JICAgJiYgKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9DT1BST0NfTU9WRV9ERUxBWSkKLQkgICAmJiAocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkKLQkgICAmJiAocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKQotCSAgICYmICEgY29wX2ludGVybG9ja3MpCi0JICB8fCAoKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0xPKQotCSAgICAgICYmIChwaW5mbyAmIElOU05fV1JJVEVfTE8pCi0JICAgICAgJiYgISAoaGlsb19pbnRlcmxvY2tzCi0JCSAgICB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAocGluZm8gJiBJTlNOX01VTFQpKSkpCi0JICB8fCAoKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0hJKQotCSAgICAgICYmIChwaW5mbyAmIElOU05fV1JJVEVfSEkpCi0JICAgICAgJiYgISAoaGlsb19pbnRlcmxvY2tzCi0JCSAgICB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAocGluZm8gJiBJTlNOX01VTFQpKSkpKQotCXByZXZfcHJldl9ub3AgPSAxOwotICAgICAgZWxzZQotCXByZXZfcHJldl9ub3AgPSAwOwotCi0gICAgICBpZiAocHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQpCi0JcHJldl9wcmV2X25vcCA9IDA7Ci0KLSAgICAgIGlmIChwcmV2X3ByZXZfbm9wICYmIG5vcHMgPT0gMCkKLQkrK25vcHM7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBiZWluZyBnaXZlbiBhIG5vcCBpbnN0cnVjdGlvbiwgZG9uJ3QgYm90aGVyIHdpdGgKLQkgb25lIG9mIHRoZSBub3BzIHdlIHdvdWxkIG90aGVyd2lzZSBvdXRwdXQuICBUaGlzIHdpbGwgb25seQotCSBoYXBwZW4gd2hlbiBhIG5vcCBpbnN0cnVjdGlvbiBpcyB1c2VkIHdpdGggbWlwc19vcHRpbWl6ZSBzZXQKLQkgdG8gMC4gICovCi0gICAgICBpZiAobm9wcyA+IDAKLQkgICYmICEgbWlwc19vcHRzLm5vcmVvcmRlcgotCSAgJiYgaXAtPmluc25fb3Bjb2RlID09IChtaXBzX29wdHMubWlwczE2ID8gMHg2NTAwIDogMCkpCi0JLS1ub3BzOwotCi0gICAgICAvKiBOb3cgZW1pdCB0aGUgcmlnaHQgbnVtYmVyIG9mIE5PUCBpbnN0cnVjdGlvbnMuICAqLwotICAgICAgaWYgKG5vcHMgPiAwICYmICEgbWlwc19vcHRzLm5vcmVvcmRlcikKLQl7Ci0JICBmcmFnUyAqb2xkX2ZyYWc7Ci0JICB1bnNpZ25lZCBsb25nIG9sZF9mcmFnX29mZnNldDsKLQkgIGludCBpOwotCSAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbDsKLQotCSAgb2xkX2ZyYWcgPSBmcmFnX25vdzsKLQkgIG9sZF9mcmFnX29mZnNldCA9IGZyYWdfbm93X2ZpeCAoKTsKLQotCSAgZm9yIChpID0gMDsgaSA8IG5vcHM7IGkrKykKLQkgICAgZW1pdF9ub3AgKCk7Ci0KLQkgIGlmIChsaXN0aW5nKQotCSAgICB7Ci0JICAgICAgbGlzdGluZ19wcmV2X2xpbmUgKCk7Ci0JICAgICAgLyogV2UgbWF5IGJlIGF0IHRoZSBzdGFydCBvZiBhIHZhcmlhbnQgZnJhZy4gIEluIGNhc2Ugd2UKLSAgICAgICAgICAgICAgICAgYXJlLCBtYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGZvciB0aGUgZnJhZwotICAgICAgICAgICAgICAgICBhZnRlciB0aGUgZnJhZ3MgY3JlYXRlZCBieSBsaXN0aW5nX3ByZXZfbGluZS4gIFRoZQotICAgICAgICAgICAgICAgICBhcmd1bWVudCB0byBmcmFnX2dyb3cgaGVyZSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlCi0gICAgICAgICAgICAgICAgIGFzIHRoZSBhcmd1bWVudCB0byBhbGwgb3RoZXIgY2FsbHMgdG8gZnJhZ19ncm93IGluCi0gICAgICAgICAgICAgICAgIHRoaXMgZmlsZS4gIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYmVpbmcgaW4gdGhlCi0gICAgICAgICAgICAgICAgIG1pZGRsZSBvZiBhIHZhcmlhbnQgZnJhZywgYmVjYXVzZSB0aGUgdmFyaWFudHMgaW5zZXJ0Ci0gICAgICAgICAgICAgICAgIGFsbCBuZWVkZWQgbm9wIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLiAgKi8KLQkgICAgICBmcmFnX2dyb3cgKDQwKTsKLQkgICAgfQotCi0JICBmb3IgKGwgPSBpbnNuX2xhYmVsczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQkgICAgewotCSAgICAgIGFzc2VydCAoU19HRVRfU0VHTUVOVCAobC0+bGFiZWwpID09IG5vd19zZWcpOwotCSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobC0+bGFiZWwsIGZyYWdfbm93KTsKLQkgICAgICBTX1NFVF9WQUxVRSAobC0+bGFiZWwsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAgICAgLyogbWlwczE2IHRleHQgbGFiZWxzIGFyZSBzdG9yZWQgYXMgb2RkLiAgKi8KLQkgICAgICBpZiAobWlwc19vcHRzLm1pcHMxNikKLQkJU19TRVRfVkFMVUUgKGwtPmxhYmVsLCBTX0dFVF9WQUxVRSAobC0+bGFiZWwpICsgMSk7Ci0JICAgIH0KLQotI2lmbmRlZiBOT19FQ09GRl9ERUJVR0dJTkcKLQkgIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0JICAgIGVjb2ZmX2ZpeF9sb2MgKG9sZF9mcmFnLCBvbGRfZnJhZ19vZmZzZXQpOwotI2VuZGlmCi0JfQotICAgICAgZWxzZSBpZiAocHJldl9ub3BfZnJhZyAhPSBOVUxMKQotCXsKLQkgIC8qIFdlIGhhdmUgYSBmcmFnIGhvbGRpbmcgbm9wcyB3ZSBtYXkgYmUgYWJsZSB0byByZW1vdmUuICBJZgotICAgICAgICAgICAgIHdlIGRvbid0IG5lZWQgYW55IG5vcHMsIHdlIGNhbiBkZWNyZWFzZSB0aGUgc2l6ZSBvZgotICAgICAgICAgICAgIHByZXZfbm9wX2ZyYWcgYnkgdGhlIHNpemUgb2Ygb25lIGluc3RydWN0aW9uLiAgSWYgd2UgZG8KLSAgICAgICAgICAgICBuZWVkIHNvbWUgbm9wcywgd2UgY291bnQgdGhlbSBpbiBwcmV2X25vcHNfcmVxdWlyZWQuICovCi0JICBpZiAocHJldl9ub3BfZnJhZ19zaW5jZSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKG5vcHMgPT0gMCkKLQkJewotCQkgIHByZXZfbm9wX2ZyYWctPmZyX2ZpeCAtPSBtaXBzX29wdHMubWlwczE2ID8gMiA6IDQ7Ci0JCSAgLS1wcmV2X25vcF9mcmFnX2hvbGRzOwotCQl9Ci0JICAgICAgZWxzZQotCQlwcmV2X25vcF9mcmFnX3JlcXVpcmVkICs9IG5vcHM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChwcmV2X3ByZXZfbm9wID09IDApCi0JCXsKLQkJICBwcmV2X25vcF9mcmFnLT5mcl9maXggLT0gbWlwc19vcHRzLm1pcHMxNiA/IDIgOiA0OwotCQkgIC0tcHJldl9ub3BfZnJhZ19ob2xkczsKLQkJfQotCSAgICAgIGVsc2UKLQkJKytwcmV2X25vcF9mcmFnX3JlcXVpcmVkOwotCSAgICB9Ci0KLQkgIGlmIChwcmV2X25vcF9mcmFnX2hvbGRzIDw9IHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQpCi0JICAgIHByZXZfbm9wX2ZyYWcgPSBOVUxMOwotCi0JICArK3ByZXZfbm9wX2ZyYWdfc2luY2U7Ci0KLQkgIC8qIFNhbml0eSBjaGVjazogYnkgdGhlIHRpbWUgd2UgcmVhY2ggdGhlIHNlY29uZCBpbnN0cnVjdGlvbgotICAgICAgICAgICAgIGFmdGVyIHByZXZfbm9wX2ZyYWcsIHdlIHNob3VsZCBoYXZlIHVzZWQgdXAgYWxsIHRoZSBub3BzCi0gICAgICAgICAgICAgb25lIHdheSBvciBhbm90aGVyLiAgKi8KLQkgIGFzc2VydCAocHJldl9ub3BfZnJhZ19zaW5jZSA8PSAxIHx8IHByZXZfbm9wX2ZyYWcgPT0gTlVMTCk7Ci0JfQotICAgIH0KLQotICBpZiAocmVsb2NfdHlwZSA+IEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byBzZXQgdXAgYSB2YXJpYW50IGZyYWcuICAqLwotICAgICAgYXNzZXJ0IChtaXBzX29wdHMubWlwczE2ICYmIGFkZHJlc3NfZXhwciAhPSBOVUxMKTsKLSAgICAgIGYgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDAsCi0JCSAgICBSRUxBWF9NSVBTMTZfRU5DT0RFIChyZWxvY190eXBlIC0gQkZEX1JFTE9DX1VOVVNFRCwKLQkJCQkJIG1pcHMxNl9zbWFsbCwgbWlwczE2X2V4dCwKLQkJCQkJIChwcmV2X3BpbmZvCi0JCQkJCSAgJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpLAotCQkJCQkgKHByZXZfaW5zbl9yZWxvY190eXBlCi0JCQkJCSAgPT0gQkZEX1JFTE9DX01JUFMxNl9KTVApKSwKLQkJICAgIG1ha2VfZXhwcl9zeW1ib2wgKGFkZHJlc3NfZXhwciksIChvZmZzZXRUKSAwLAotCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0gICAgfQotICBlbHNlIGlmIChwbGFjZSAhPSBOVUxMKQotICAgIGYgPSBwbGFjZTsKLSAgZWxzZSBpZiAobWlwc19vcHRzLm1pcHMxNgotCSAgICYmICEgaXAtPnVzZV9leHRlbmQKLQkgICAmJiByZWxvY190eXBlICE9IEJGRF9SRUxPQ19NSVBTMTZfSk1QKQotICAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggcm9vbSB0byBzd2FwIHRoaXMgaW5zdHJ1Y3Rpb24gd2l0aAotICAgICAgICAgYSBmb2xsb3dpbmcganVtcCBpbnN0cnVjdGlvbi4gICovCi0gICAgICBmcmFnX2dyb3cgKDYpOwotICAgICAgZiA9IGZyYWdfbW9yZSAoMik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG1pcHNfb3B0cy5taXBzMTYKLQkgICYmIG1pcHNfb3B0cy5ub3Jlb3JkZXIKLQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZKSAhPSAwKQotCWFzX3dhcm4gKF8oImV4dGVuZGVkIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiKSk7Ci0KLSAgICAgIGYgPSBmcmFnX21vcmUgKDQpOwotICAgIH0KLQotICBmaXhwID0gTlVMTDsKLSAgaWYgKGFkZHJlc3NfZXhwciAhPSBOVUxMICYmIHJlbG9jX3R5cGUgPCBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGlmIChhZGRyZXNzX2V4cHItPlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICBzd2l0Y2ggKHJlbG9jX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyICYgMHhmZmZmOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfSk1QOgotCSAgICAgIGlmICgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAzKSAhPSAwKQotCQlhc19iYWQgKF8oImp1bXAgdG8gbWlzYWxpZ25lZCBhZGRyZXNzICgweCVseCkiKSwKLQkJCSh1bnNpZ25lZCBsb25nKSBhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlcik7Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IChhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlciA+PiAyKSAmIDB4M2ZmZmZmZjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTMTZfSk1QOgotCSAgICAgIGlmICgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAzKSAhPSAwKQotCQlhc19iYWQgKF8oImp1bXAgdG8gbWlzYWxpZ25lZCBhZGRyZXNzICgweCVseCkiKSwKLQkJCSh1bnNpZ25lZCBsb25nKSBhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlcik7Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9Ci0JCSgoKGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyICYgMHg3YzAwMDApIDw8IDMpCi0JCSB8ICgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAweGY4MDAwMDApID4+IDcpCi0JCSB8ICgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAweDNmZmZjKSA+PiAyKSk7Ci0JICAgICAgYnJlYWs7Ci0KLQotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjoKLQkgICAgICBnb3RvIG5lZWRfcmVsb2M7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBpbnRlcm5hbEVycm9yICgpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQluZWVkX3JlbG9jOgotCSAgLyogRG9uJ3QgZ2VuZXJhdGUgYSByZWxvYyBpZiB3ZSBhcmUgd3JpdGluZyBpbnRvIGEgdmFyaWFudAotCSAgICAgZnJhZy4gICovCi0JICBpZiAocGxhY2UgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZpeHAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJCQkgIGFkZHJlc3NfZXhwciwKLQkJCQkgIHJlbG9jX3R5cGUgPT0gQkZEX1JFTE9DXzE2X1BDUkVMX1MyLAotCQkJCSAgcmVsb2NfdHlwZSk7Ci0JICAgICAgaWYgKHVubWF0Y2hlZF9oaSkKLQkJewotCQkgIHN0cnVjdCBtaXBzX2hpX2ZpeHVwICpoaV9maXh1cDsKLQotCQkgIGFzc2VydCAocmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfSEkxNl9TKTsKLQkJICBoaV9maXh1cCA9ICgoc3RydWN0IG1pcHNfaGlfZml4dXAgKikKLQkJCSAgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG1pcHNfaGlfZml4dXApKSk7Ci0JCSAgaGlfZml4dXAtPmZpeHAgPSBmaXhwOwotCQkgIGhpX2ZpeHVwLT5zZWcgPSBub3dfc2VnOwotCQkgIGhpX2ZpeHVwLT5uZXh0ID0gbWlwc19oaV9maXh1cF9saXN0OwotCQkgIG1pcHNfaGlfZml4dXBfbGlzdCA9IGhpX2ZpeHVwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICghIG1pcHNfb3B0cy5taXBzMTYpCi0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpcC0+aW5zbl9vcGNvZGUsIDQpOwotICBlbHNlIGlmIChyZWxvY190eXBlID09IEJGRF9SRUxPQ19NSVBTMTZfSk1QKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaXAtPmluc25fb3Bjb2RlID4+IDE2LCAyKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiArIDIsIGlwLT5pbnNuX29wY29kZSAmIDB4ZmZmZiwgMik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGlwLT51c2VfZXh0ZW5kKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZiwgMHhmMDAwIHwgaXAtPmV4dGVuZCwgMik7Ci0JICBmICs9IDI7Ci0JfQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpcC0+aW5zbl9vcGNvZGUsIDIpOwotICAgIH0KLQotICAvKiBVcGRhdGUgdGhlIHJlZ2lzdGVyIG1hc2sgaW5mb3JtYXRpb24uICAqLwotICBpZiAoISBtaXBzX29wdHMubWlwczE2KQotICAgIHsKLSAgICAgIGlmIChwaW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRCk7Ci0gICAgICBpZiAoKHBpbmZvICYgKElOU05fV1JJVEVfR1BSX1QgfCBJTlNOX1JFQURfR1BSX1QpKSAhPSAwKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpOwotICAgICAgaWYgKHBpbmZvICYgSU5TTl9SRUFEX0dQUl9TKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JTKSAmIE9QX01BU0tfUlMpOwotICAgICAgaWYgKHBpbmZvICYgSU5TTl9XUklURV9HUFJfMzEpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgMzE7Ci0gICAgICBpZiAocGluZm8gJiBJTlNOX1dSSVRFX0ZQUl9EKQotCW1pcHNfY3BybWFza1sxXSB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZEKSAmIE9QX01BU0tfRkQpOwotICAgICAgaWYgKChwaW5mbyAmIChJTlNOX1dSSVRFX0ZQUl9TIHwgSU5TTl9SRUFEX0ZQUl9TKSkgIT0gMCkKLQltaXBzX2Nwcm1hc2tbMV0gfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9GUykgJiBPUF9NQVNLX0ZTKTsKLSAgICAgIGlmICgocGluZm8gJiAoSU5TTl9XUklURV9GUFJfVCB8IElOU05fUkVBRF9GUFJfVCkpICE9IDApCi0JbWlwc19jcHJtYXNrWzFdIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfRlQpICYgT1BfTUFTS19GVCk7Ci0gICAgICBpZiAoKHBpbmZvICYgSU5TTl9SRUFEX0ZQUl9SKSAhPSAwKQotCW1pcHNfY3BybWFza1sxXSB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZSKSAmIE9QX01BU0tfRlIpOwotICAgICAgaWYgKHBpbmZvICYgSU5TTl9DT1ApCi0JewotCSAgLyogV2UgZG9uJ3Qga2VlcCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gc29ydCB0aGVzZSBjYXNlcyBvdXQuIAotCSAgICAgVGhlIGl0Ymwgc3VwcG9ydCBkb2VzIGtlZXAgdGhpcyBpbmZvcm1hdGlvbiBob3dldmVyLCBhbHRob3VnaCAKLQkgICAgIHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IGl0YmwgZnBybWF0cyBhcyBwYXJ0IG9mIHRoZSBjb3AgCi0JICAgICBpbnN0cnVjdGlvbi4gIE1heSB3YW50IHRvIGFkZCB0aGlzIHN1cHBvcnQgaW4gdGhlIGZ1dHVyZS4gKi8KLQl9Ci0gICAgICAvKiBOZXZlciBzZXQgdGhlIGJpdCBmb3IgJDAsIHdoaWNoIGlzIGFsd2F5cyB6ZXJvLiAgKi8KLSAgICAgIG1pcHNfZ3BybWFzayAmPX4gMSA8PCAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChwaW5mbyAmIChNSVBTMTZfSU5TTl9XUklURV9YIHwgTUlQUzE2X0lOU05fUkVBRF9YKSkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWCkKLQkJCSAgICAgICYgTUlQUzE2T1BfTUFTS19SWCk7Ci0gICAgICBpZiAocGluZm8gJiAoTUlQUzE2X0lOU05fV1JJVEVfWSB8IE1JUFMxNl9JTlNOX1JFQURfWSkpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlkpCi0JCQkgICAgICAmIE1JUFMxNk9QX01BU0tfUlkpOwotICAgICAgaWYgKHBpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfWikKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWikKLQkJCSAgICAgICYgTUlQUzE2T1BfTUFTS19SWik7Ci0gICAgICBpZiAocGluZm8gJiAoTUlQUzE2X0lOU05fV1JJVEVfVCB8IE1JUFMxNl9JTlNOX1JFQURfVCkpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgVFJFRzsKLSAgICAgIGlmIChwaW5mbyAmIChNSVBTMTZfSU5TTl9XUklURV9TUCB8IE1JUFMxNl9JTlNOX1JFQURfU1ApKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8IFNQOwotICAgICAgaWYgKHBpbmZvICYgKE1JUFMxNl9JTlNOX1dSSVRFXzMxIHwgTUlQUzE2X0lOU05fUkVBRF8zMSkpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgUkE7Ci0gICAgICBpZiAocGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9HUFJfWSkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCBNSVBTMTZPUF9FWFRSQUNUX1JFRzMyUiAoaXAtPmluc25fb3Bjb2RlKTsKLSAgICAgIGlmIChwaW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfWikKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9NT1ZFMzJaKQotCQkJICAgICAgJiBNSVBTMTZPUF9NQVNLX01PVkUzMlopOwotICAgICAgaWYgKHBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9HUFJfWCkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SRUdSMzIpCi0JCQkgICAgICAmIE1JUFMxNk9QX01BU0tfUkVHUjMyKTsKLSAgICB9Ci0KLSAgaWYgKHBsYWNlID09IE5VTEwgJiYgISBtaXBzX29wdHMubm9yZW9yZGVyKQotICAgIHsKLSAgICAgIC8qIEZpbGxpbmcgdGhlIGJyYW5jaCBkZWxheSBzbG90IGlzIG1vcmUgY29tcGxleC4gIFdlIHRyeSB0bwotCSBzd2l0Y2ggdGhlIGJyYW5jaCB3aXRoIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiwgd2hpY2ggd2UgY2FuCi0JIGRvIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBkb2VzIG5vdCBzZXQgdXAgYSBjb25kaXRpb24KLQkgdGhhdCB0aGUgYnJhbmNoIHRlc3RzIGFuZCBpZiB0aGUgYnJhbmNoIGlzIG5vdCBpdHNlbGYgdGhlCi0JIHRhcmdldCBvZiBhbnkgYnJhbmNoLiAgKi8KLSAgICAgIGlmICgocGluZm8gJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpCi0JICB8fCAocGluZm8gJiBJTlNOX0NPTkRfQlJBTkNIX0RFTEFZKSkKLQl7Ci0JICBpZiAobWlwc19vcHRpbWl6ZSA8IDIKLQkgICAgICAvKiBJZiB3ZSBoYXZlIHNlZW4gLnNldCB2b2xhdGlsZSBvciAuc2V0IG5vbW92ZSwgZG9uJ3QKLQkJIG9wdGltaXplLiAgKi8KLQkgICAgICB8fCBtaXBzX29wdHMubm9tb3ZlICE9IDAKLQkgICAgICAvKiBJZiB3ZSBoYWQgdG8gZW1pdCBhbnkgTk9QIGluc3RydWN0aW9ucywgdGhlbiB3ZQotCQkgYWxyZWFkeSBrbm93IHdlIGNhbiBub3Qgc3dhcC4gICovCi0JICAgICAgfHwgbm9wcyAhPSAwCi0JICAgICAgLyogSWYgd2UgZG9uJ3QgZXZlbiBrbm93IHRoZSBwcmV2aW91cyBpbnNuLCB3ZSBjYW4gbm90Ci0JCSBzd2FwLiAqLwotCSAgICAgIHx8ICEgcHJldl9pbnNuX3ZhbGlkCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc24gaXMgYWxyZWFkeSBpbiBhIGJyYW5jaCBkZWxheQotCQkgc2xvdCwgdGhlbiB3ZSBjYW4gbm90IHN3YXAuICAqLwotCSAgICAgIHx8IHByZXZfaW5zbl9pc19kZWxheV9zbG90Ci0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIHByZXZpb3VzIGluc24gd2FzIGluIGEgLnNldAotCQkgbm9yZW9yZGVyLCB3ZSBjYW4ndCBzd2FwLiAgQWN0dWFsbHksIHRoZSBNSVBTCi0JCSBhc3NlbWJsZXIgd2lsbCBzd2FwIGluIHRoaXMgc2l0dWF0aW9uLiAgSG93ZXZlciwgZ2NjCi0JCSBjb25maWd1cmVkIC13aXRoLWdudS1hcyB3aWxsIGdlbmVyYXRlIGNvZGUgbGlrZQotCQkgICAuc2V0IG5vcmVvcmRlcgotCQkgICBsdwkkNCxYWFgKLQkJICAgLnNldAlyZW9yZGVyCi0JCSAgIElOU04KLQkJICAgYm5lCSQ0LCQwLGZvbwotCQkgaW4gd2hpY2ggd2UgY2FuIG5vdCBzd2FwIHRoZSBibmUgYW5kIElOU04uICBJZiBnY2MgaXMKLQkJIG5vdCBjb25maWd1cmVkIC13aXRoLWdudS1hcywgaXQgZG9lcyBub3Qgb3V0cHV0IHRoZQotCQkgLnNldCBwc2V1ZG8tb3BzLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGVjawotCQkgcHJldl9pbnNuX3VucmVvcmRlcmVkLCBiZWNhdXNlIHByZXZfaW5zbl92YWxpZCB3aWxsCi0JCSBiZSAwIGluIHRoYXQgY2FzZS4gIFdlIGRvbid0IHdhbnQgdG8gdXNlCi0JCSBwcmV2X3ByZXZfaW5zbl92YWxpZCwgYmVjYXVzZSB3ZSBkbyB3YW50IHRvIGJlIGFibGUKLQkJIHRvIHN3YXAgYXQgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24uICAqLwotCSAgICAgIHx8IHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkCi0JICAgICAgLyogSWYgdGhlIGJyYW5jaCBpcyBpdHNlbGYgdGhlIHRhcmdldCBvZiBhIGJyYW5jaCwgd2UKLQkJIGNhbiBub3Qgc3dhcC4gIFdlIGNoZWF0IG9uIHRoaXM7IGFsbCB3ZSBjaGVjayBmb3IgaXMKLQkJIHdoZXRoZXIgdGhlcmUgaXMgYSBsYWJlbCBvbiB0aGlzIGluc3RydWN0aW9uLiAgSWYKLQkJIHRoZXJlIGFyZSBhbnkgYnJhbmNoZXMgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiBhCi0JCSBsYWJlbCwgdXNlcnMgbXVzdCB1c2UgLnNldCBub3Jlb3JkZXIuICAqLwotCSAgICAgIHx8IGluc25fbGFiZWxzICE9IE5VTEwKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgaW4gYSB2YXJpYW50IGZyYWcsIHdlCi0JCSBjYW4gbm90IGRvIHRoZSBzd2FwLiAgVGhpcyBkb2VzIG5vdCBhcHBseSB0byB0aGUKLQkJIG1pcHMxNiwgd2hpY2ggdXNlcyB2YXJpYW50IGZyYWdzIGZvciBkaWZmZXJlbnQKLQkJIHB1cnBvc2VzLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgcHJldl9pbnNuX2ZyYWctPmZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQpCi0JICAgICAgLyogSWYgdGhlIGJyYW5jaCByZWFkcyB0aGUgY29uZGl0aW9uIGNvZGVzLCB3ZSBkb24ndAotCQkgZXZlbiB0cnkgdG8gc3dhcCwgYmVjYXVzZSBpbiB0aGUgc2VxdWVuY2UKLQkJICAgY3RjMSAkWCwkMzEKLQkJICAgSU5TTgotCQkgICBJTlNOCi0JCSAgIGJjMXQgTEFCRUwKLQkJIHdlIGNhbiBub3Qgc3dhcCwgYW5kIEkgZG9uJ3QgZmVlbCBsaWtlIGhhbmRsaW5nIHRoYXQKLQkJIGNhc2UuICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiBJU0FfSEFTX0NPUFJPQ19ERUxBWVMgKG1pcHNfb3B0cy5pc2EpCi0JCSAgJiYgKHBpbmZvICYgSU5TTl9SRUFEX0NPTkRfQ09ERSkpCi0JICAgICAgLyogV2UgY2FuIG5vdCBzd2FwIHdpdGggYW4gaW5zdHJ1Y3Rpb24gdGhhdCByZXF1aXJlcyBhCi0JCSBkZWxheSBzbG90LCBiZWNhc2UgdGhlIHRhcmdldCBvZiB0aGUgYnJhbmNoIG1pZ2h0Ci0JCSBpbnRlcmZlcmUgd2l0aCB0aGF0IGluc3RydWN0aW9uLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgSVNBX0hBU19DT1BST0NfREVMQVlTIChtaXBzX29wdHMuaXNhKQotCQkgICYmIChwcmV2X3BpbmZvCi0gICAgICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkJICAgICAgJiAoSU5TTl9MT0FEX0NPUFJPQ19ERUxBWQotCQkJIHwgSU5TTl9DT1BST0NfTU9WRV9ERUxBWQotCQkJIHwgSU5TTl9XUklURV9DT05EX0NPREUpKSkKLQkgICAgICB8fCAoISAoaGlsb19pbnRlcmxvY2tzCi0JCSAgICAgfHwgKG1pcHNfY3B1ID09IDM5MDAgJiYgKHBpbmZvICYgSU5TTl9NVUxUKSkpCi0JCSAgJiYgKHByZXZfcGluZm8KLQkJICAgICAgJiAoSU5TTl9SRUFEX0xPCi0JCQkgfCBJTlNOX1JFQURfSEkpKSkKLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgISBncHJfaW50ZXJsb2NrcwotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIG1pcHNfb3B0cy5pc2EgPT0gMQotICAgICAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZKSkKLQkgICAgICAvKiBXZSBjYW4gbm90IHN3YXAgd2l0aCBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgfHwgKHByZXZfcGluZm8KLQkJICAmIChJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkKLQkJICAgICB8IElOU05fQ09ORF9CUkFOQ0hfREVMQVkKLQkJICAgICB8IElOU05fQ09ORF9CUkFOQ0hfTElLRUxZKSkKLQkgICAgICAvKiBXZSBkbyBub3Qgc3dhcCB3aXRoIGEgdHJhcCBpbnN0cnVjdGlvbiwgc2luY2UgaXQKLQkJIGNvbXBsaWNhdGVzIHRyYXAgaGFuZGxlcnMgdG8gaGF2ZSB0aGUgdHJhcAotCQkgaW5zdHJ1Y3Rpb24gYmUgaW4gYSBkZWxheSBzbG90LiAgKi8KLQkgICAgICB8fCAocHJldl9waW5mbyAmIElOU05fVFJBUCkKLQkgICAgICAvKiBJZiB0aGUgYnJhbmNoIHJlYWRzIGEgcmVnaXN0ZXIgdGhhdCB0aGUgcHJldmlvdXMKLQkJIGluc3RydWN0aW9uIHNldHMsIHdlIGNhbiBub3Qgc3dhcC4gICovCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfVCkKLQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkgICAgKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpCi0JCQkJICAgICAmIE9QX01BU0tfUlQpLAotCQkJCSAgICBNSVBTX0dSX1JFRykpCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfRCkKLQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkgICAgKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpCi0JCQkJICAgICAmIE9QX01BU0tfUkQpLAotCQkJCSAgICBNSVBTX0dSX1JFRykpCi0JICAgICAgfHwgKG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAoKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfWCkKLQkJICAgICAgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCQkgKChwcmV2X2luc24uaW5zbl9vcGNvZGUKLQkJCQkJICAgPj4gTUlQUzE2T1BfU0hfUlgpCi0JCQkJCSAgJiBNSVBTMTZPUF9NQVNLX1JYKSwKLQkJCQkJIE1JUFMxNl9SRUcpKQotCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9ZKQotCQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkJICAgICgocHJldl9pbnNuLmluc25fb3Bjb2RlCi0JCQkJCSAgICAgID4+IE1JUFMxNk9QX1NIX1JZKQotCQkJCQkgICAgICYgTUlQUzE2T1BfTUFTS19SWSksCi0JCQkJCSAgICBNSVBTMTZfUkVHKSkKLQkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfWikKLQkJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZQotCQkJCQkgICAgICA+PiBNSVBTMTZPUF9TSF9SWikKLQkJCQkJICAgICAmIE1JUFMxNk9QX01BU0tfUlopLAotCQkJCQkgICAgTUlQUzE2X1JFRykpCi0JCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX1QpCi0JCQkgICYmIGluc25fdXNlc19yZWcgKGlwLCBUUkVHLCBNSVBTX0dSX1JFRykpCi0JCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFXzMxKQotCQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwgUkEsIE1JUFNfR1JfUkVHKSkKLQkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfR1BSX1kpCi0JCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCQkgICAgTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIgKHByZXZfaW5zbi4KLQkJCQkJCQkJICAgICBpbnNuX29wY29kZSksCi0JCQkJCSAgICBNSVBTX0dSX1JFRykpKSkKLQkgICAgICAvKiBJZiB0aGUgYnJhbmNoIHdyaXRlcyBhIHJlZ2lzdGVyIHRoYXQgdGhlIHByZXZpb3VzCi0JCSBpbnN0cnVjdGlvbiBzZXRzLCB3ZSBjYW4gbm90IHN3YXAgKHdlIGtub3cgdGhhdAotCQkgYnJhbmNoZXMgd3JpdGUgb25seSB0byBSRCBvciB0byAkMzEpLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9UKQotCQkgICYmICgoKHBpbmZvICYgSU5TTl9XUklURV9HUFJfRCkKLQkJICAgICAgICYmICgoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUKQotCQkJICAgPT0gKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRCkpKQotCQkgICAgICB8fCAoKHBpbmZvICYgSU5TTl9XUklURV9HUFJfMzEpCi0JCQkgICYmICgoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkKLQkJCSAgICAgICAmIE9QX01BU0tfUlQpCi0JCQkgICAgICA9PSAzMSkpKSkKLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQotCQkgICYmICgoKHBpbmZvICYgSU5TTl9XUklURV9HUFJfRCkKLQkJICAgICAgICYmICgoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEKQotCQkJICAgPT0gKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRCkpKQotCQkgICAgICB8fCAoKHBpbmZvICYgSU5TTl9XUklURV9HUFJfMzEpCi0JCQkgICYmICgoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkKLQkJCSAgICAgICAmIE9QX01BU0tfUkQpCi0JCQkgICAgICA9PSAzMSkpKSkKLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwaW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFXzMxKQotCQkgICYmICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFXzMxKQotCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9HUFJfWSkKLQkJCSAgJiYgKE1JUFMxNk9QX0VYVFJBQ1RfUkVHMzJSIChwcmV2X2luc24uaW5zbl9vcGNvZGUpCi0JCQkgICAgICA9PSBSQSkpKSkKLQkgICAgICAvKiBJZiB0aGUgYnJhbmNoIHdyaXRlcyBhIHJlZ2lzdGVyIHRoYXQgdGhlIHByZXZpb3VzCi0JCSBpbnN0cnVjdGlvbiByZWFkcywgd2UgY2FuIG5vdCBzd2FwICh3ZSBrbm93IHRoYXQKLQkJIGJyYW5jaGVzIG9ubHkgd3JpdGUgdG8gUkQgb3IgdG8gJDMxKS4gICovCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwaW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCi0JCSAgJiYgaW5zbl91c2VzX3JlZyAoJnByZXZfaW5zbiwKLQkJCQkgICAgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpCi0JCQkJICAgICAmIE9QX01BU0tfUkQpLAotCQkJCSAgICBNSVBTX0dSX1JFRykpCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwaW5mbyAmIElOU05fV1JJVEVfR1BSXzMxKQotCQkgICYmIGluc25fdXNlc19yZWcgKCZwcmV2X2luc24sIDMxLCBNSVBTX0dSX1JFRykpCi0JICAgICAgfHwgKG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV8zMSkKLQkJICAmJiBpbnNuX3VzZXNfcmVnICgmcHJldl9pbnNuLCBSQSwgTUlQU19HUl9SRUcpKQotCSAgICAgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlLCB0aGUgYnJhbmNoCi0JCSBtaWdodCBiZSBleHBhbmRlZCBpbnRvIGEgc2VxdWVuY2Ugd2hpY2ggdXNlcyAkYXQsIHNvCi0JCSB3ZSBjYW4ndCBzd2FwIHdpdGggYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggcmVhZHMgaXQuICAqLwotCSAgICAgIHx8IChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMKLQkJICAmJiBpbnNuX3VzZXNfcmVnICgmcHJldl9pbnNuLCBBVCwgTUlQU19HUl9SRUcpKQotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBwcmV2aW91cyBpbnN0cnVjdGlvbiBoYXMgYSBsb2FkCi0JCSBkZWxheSwgYW5kIHNldHMgYSByZWdpc3RlciB0aGF0IHRoZSBicmFuY2ggcmVhZHMsIHdlCi0JCSBjYW4gbm90IHN3YXAuICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiBJU0FfSEFTX0NPUFJPQ19ERUxBWVMgKG1pcHNfb3B0cy5pc2EpCi0gICAgICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkJICAmJiAoKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9MT0FEX0NPUFJPQ19ERUxBWSkKLQkJICAgICAgfHwgKCEgZ3ByX2ludGVybG9ja3MKLQkJCSAgJiYgKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvCi0JCQkgICAgICAmIElOU05fTE9BRF9NRU1PUllfREVMQVkpKSkKLQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkgICAgKChwcmV2X3ByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkKLQkJCQkgICAgICYgT1BfTUFTS19SVCksCi0JCQkJICAgIE1JUFNfR1JfUkVHKSkKLQkgICAgICAvKiBJZiBvbmUgaW5zdHJ1Y3Rpb24gc2V0cyBhIGNvbmRpdGlvbiBjb2RlIGFuZCB0aGUKLSAgICAgICAgICAgICAgICAgb3RoZXIgb25lIHVzZXMgYSBjb25kaXRpb24gY29kZSwgd2UgY2FuIG5vdCBzd2FwLiAgKi8KLQkgICAgICB8fCAoKHBpbmZvICYgSU5TTl9SRUFEX0NPTkRfQ09ERSkKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfQ09ORF9DT0RFKSkKLQkgICAgICB8fCAoKHBpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpCi0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKSkKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgUEMsIHdlIGNhbiBub3QKLSAgICAgICAgICAgICAgICAgc3dhcC4gICovCi0JICAgICAgfHwgKG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfUEMpKQotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgZXh0ZW5kZWQsIHdlIGNhbiBub3QKLSAgICAgICAgICAgICAgICAgc3dhcC4gICovCi0JICAgICAgfHwgKG1pcHNfb3B0cy5taXBzMTYgJiYgcHJldl9pbnNuX2V4dGVuZGVkKQotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBoYWQgYSBmaXh1cCBpbiBtaXBzMTYKLSAgICAgICAgICAgICAgICAgbW9kZSwgd2UgY2FuIG5vdCBzd2FwLiAgVGhpcyBub3JtYWxseSBtZWFucyB0aGF0IHRoZQotICAgICAgICAgICAgICAgICBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgYSA0IGJ5dGUgYnJhbmNoIGFueWhvdy4gICovCi0JICAgICAgfHwgKG1pcHNfb3B0cy5taXBzMTYgJiYgcHJldl9pbnNuX2ZpeHApCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgc3luYywgc3luYy5sLCBvciAKLQkJIHN5bmMucCwgd2UgY2FuIG5vdCBzd2FwLiAqLwotCSAgICAgIHx8IChwcmV2X3BpbmZvICYgSU5TTl9TWU5DKSkKLQkgICAgewotCSAgICAgIC8qIFdlIGNvdWxkIGRvIGV2ZW4gYmV0dGVyIGZvciB1bmNvbmRpdGlvbmFsIGJyYW5jaGVzIHRvCi0JCSBwb3J0aW9ucyBvZiB0aGlzIG9iamVjdCBmaWxlOyB3ZSBjb3VsZCBwaWNrIHVwIHRoZQotCQkgaW5zdHJ1Y3Rpb24gYXQgdGhlIGRlc3RpbmF0aW9uLCBwdXQgaXQgaW4gdGhlIGRlbGF5Ci0JCSBzbG90LCBhbmQgYnVtcCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcy4gICovCi0JICAgICAgZW1pdF9ub3AgKCk7Ci0JICAgICAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBpbnNuIGluZm9ybWF0aW9uLiAgKi8KLQkgICAgICBwcmV2X3ByZXZfaW5zbiA9ICppcDsKLQkgICAgICBwcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEl0IGxvb2tzIGxpa2Ugd2UgY2FuIGFjdHVhbGx5IGRvIHRoZSBzd2FwLiAgKi8KLQkgICAgICBpZiAoISBtaXBzX29wdHMubWlwczE2KQotCQl7Ci0JCSAgY2hhciAqcHJldl9mOwotCQkgIGNoYXIgdGVtcFs0XTsKLQotCQkgIHByZXZfZiA9IHByZXZfaW5zbl9mcmFnLT5mcl9saXRlcmFsICsgcHJldl9pbnNuX3doZXJlOwotCQkgIG1lbWNweSAodGVtcCwgcHJldl9mLCA0KTsKLQkJICBtZW1jcHkgKHByZXZfZiwgZiwgNCk7Ci0JCSAgbWVtY3B5IChmLCB0ZW1wLCA0KTsKLQkJICBpZiAocHJldl9pbnNuX2ZpeHApCi0JCSAgICB7Ci0JCSAgICAgIHByZXZfaW5zbl9maXhwLT5meF9mcmFnID0gZnJhZ19ub3c7Ci0JCSAgICAgIHByZXZfaW5zbl9maXhwLT5meF93aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsKLQkJICAgIH0KLQkJICBpZiAoZml4cCkKLQkJICAgIHsKLQkJICAgICAgZml4cC0+ZnhfZnJhZyA9IHByZXZfaW5zbl9mcmFnOwotCQkgICAgICBmaXhwLT5meF93aGVyZSA9IHByZXZfaW5zbl93aGVyZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGNoYXIgKnByZXZfZjsKLQkJICBjaGFyIHRlbXBbMl07Ci0KLQkJICBhc3NlcnQgKHByZXZfaW5zbl9maXhwID09IE5VTEwpOwotCQkgIHByZXZfZiA9IHByZXZfaW5zbl9mcmFnLT5mcl9saXRlcmFsICsgcHJldl9pbnNuX3doZXJlOwotCQkgIG1lbWNweSAodGVtcCwgcHJldl9mLCAyKTsKLQkJICBtZW1jcHkgKHByZXZfZiwgZiwgMik7Ci0JCSAgaWYgKHJlbG9jX3R5cGUgIT0gQkZEX1JFTE9DX01JUFMxNl9KTVApCi0JCSAgICB7Ci0JCSAgICAgIGFzc2VydCAocmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfVU5VU0VEKTsKLQkJICAgICAgbWVtY3B5IChmLCB0ZW1wLCAyKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIG1lbWNweSAoZiwgZiArIDIsIDIpOwotCQkgICAgICBtZW1jcHkgKGYgKyAyLCB0ZW1wLCAyKTsKLQkJICAgIH0KLQkJICBpZiAoZml4cCkKLQkJICAgIHsKLQkJICAgICAgZml4cC0+ZnhfZnJhZyA9IHByZXZfaW5zbl9mcmFnOwotCQkgICAgICBmaXhwLT5meF93aGVyZSA9IHByZXZfaW5zbl93aGVyZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBpbnNuIGluZm9ybWF0aW9uOyBsZWF2ZSBwcmV2X2luc24KLQkJIHVuY2hhbmdlZC4gICovCi0JICAgICAgcHJldl9wcmV2X2luc24gPSAqaXA7Ci0JICAgIH0KLQkgIHByZXZfaW5zbl9pc19kZWxheV9zbG90ID0gMTsKLQotCSAgLyogSWYgdGhhdCB3YXMgYW4gdW5jb25kaXRpb25hbCBicmFuY2gsIGZvcmdldCB0aGUgcHJldmlvdXMKLQkgICAgIGluc24gaW5mb3JtYXRpb24uICAqLwotCSAgaWYgKHBpbmZvICYgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZKQotCSAgICB7Ci0JICAgICAgcHJldl9wcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0JICAgICAgcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOwotCSAgICB9Ci0KLQkgIHByZXZfaW5zbl9maXhwID0gTlVMTDsKLQkgIHByZXZfaW5zbl9yZWxvY190eXBlID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkgIHByZXZfaW5zbl9leHRlbmRlZCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAocGluZm8gJiBJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWSkKLQl7Ci0JICAvKiBXZSBkb24ndCB5ZXQgb3B0aW1pemUgYSBicmFuY2ggbGlrZWx5LiAgV2hhdCB3ZSBzaG91bGQgZG8KLQkgICAgIGlzIGxvb2sgYXQgdGhlIHRhcmdldCwgY29weSB0aGUgaW5zdHJ1Y3Rpb24gZm91bmQgdGhlcmUKLQkgICAgIGludG8gdGhlIGRlbGF5IHNsb3QsIGFuZCBpbmNyZW1lbnQgdGhlIGJyYW5jaCB0byBqdW1wIHRvCi0JICAgICB0aGUgbmV4dCBpbnN0cnVjdGlvbi4gICovCi0JICBlbWl0X25vcCAoKTsKLQkgIC8qIFVwZGF0ZSB0aGUgcHJldmlvdXMgaW5zbiBpbmZvcm1hdGlvbi4gICovCi0JICBwcmV2X3ByZXZfaW5zbiA9ICppcDsKLQkgIHByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLQkgIHByZXZfaW5zbl9maXhwID0gTlVMTDsKLQkgIHByZXZfaW5zbl9yZWxvY190eXBlID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkgIHByZXZfaW5zbl9leHRlbmRlZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFVwZGF0ZSB0aGUgcHJldmlvdXMgaW5zbiBpbmZvcm1hdGlvbi4gICovCi0JICBpZiAobm9wcyA+IDApCi0JICAgIHByZXZfcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOwotCSAgZWxzZQotCSAgICBwcmV2X3ByZXZfaW5zbiA9IHByZXZfaW5zbjsKLQkgIHByZXZfaW5zbiA9ICppcDsKLQotCSAgLyogQW55IHRpbWUgd2Ugc2VlIGEgYnJhbmNoLCB3ZSBhbHdheXMgZmlsbCB0aGUgZGVsYXkgc2xvdAotCSAgICAgaW1tZWRpYXRlbHk7IHNpbmNlIHRoaXMgaW5zbiBpcyBub3QgYSBicmFuY2gsIHdlIGtub3cgaXQKLQkgICAgIGlzIG5vdCBpbiBhIGRlbGF5IHNsb3QuICAqLwotCSAgcHJldl9pbnNuX2lzX2RlbGF5X3Nsb3QgPSAwOwotCi0JICBwcmV2X2luc25fZml4cCA9IGZpeHA7Ci0JICBwcmV2X2luc25fcmVsb2NfdHlwZSA9IHJlbG9jX3R5cGU7Ci0JICBpZiAobWlwc19vcHRzLm1pcHMxNikKLQkgICAgcHJldl9pbnNuX2V4dGVuZGVkID0gKGlwLT51c2VfZXh0ZW5kCi0JCQkJICB8fCByZWxvY190eXBlID4gQkZEX1JFTE9DX1VOVVNFRCk7Ci0JfQotCi0gICAgICBwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZCA9IHByZXZfaW5zbl91bnJlb3JkZXJlZDsKLSAgICAgIHByZXZfaW5zbl91bnJlb3JkZXJlZCA9IDA7Ci0gICAgICBwcmV2X2luc25fZnJhZyA9IGZyYWdfbm93OwotICAgICAgcHJldl9pbnNuX3doZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOwotICAgICAgcHJldl9pbnNuX3ZhbGlkID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byByZWNvcmQgYSBiaXQgb2YgaW5mb3JtYXRpb24gZXZlbiB3aGVuIHdlIGFyZSBub3QKLSAgICAgICAgIHJlb3JkZXJpbmcsIGluIG9yZGVyIHRvIGRldGVybWluZSB0aGUgYmFzZSBhZGRyZXNzIGZvciBtaXBzMTYKLSAgICAgICAgIFBDIHJlbGF0aXZlIHJlbG9jcy4gICovCi0gICAgICBwcmV2X3ByZXZfaW5zbiA9IHByZXZfaW5zbjsKLSAgICAgIHByZXZfaW5zbiA9ICppcDsKLSAgICAgIHByZXZfaW5zbl9yZWxvY190eXBlID0gcmVsb2NfdHlwZTsKLSAgICAgIHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkID0gcHJldl9pbnNuX3VucmVvcmRlcmVkOwotICAgICAgcHJldl9pbnNuX3VucmVvcmRlcmVkID0gMTsKLSAgICB9Ci0KLSAgLyogV2UganVzdCBvdXRwdXQgYW4gaW5zbiwgc28gdGhlIG5leHQgb25lIGRvZXNuJ3QgaGF2ZSBhIGxhYmVsLiAgKi8KLSAgbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKTsKLQotICAvKiBXZSBtdXN0IGVuc3VyZSB0aGF0IGEgZml4dXAgYXNzb2NpYXRlZCB3aXRoIGFuIHVubWF0Y2hlZCAlaGkKLSAgICAgcmVsb2MgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLiAgT3RoZXJ3aXNlLCB0aGUKLSAgICAgcmVhcnJhbmdlbWVudCBvZiAlaGkgcmVsb2NzIGluIGZyb2JfZmlsZSBtYXkgY29uZnVzZQotICAgICB0Y19nZW5fcmVsb2MuICAqLwotICBpZiAodW5tYXRjaGVkX2hpKQotICAgIHsKLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19uZXcgKDApOwotICAgIH0KLX0KLQotLyogVGhpcyBmdW5jdGlvbiBmb3JnZXRzIHRoYXQgdGhlcmUgd2FzIGFueSBwcmV2aW91cyBpbnN0cnVjdGlvbiBvcgotICAgbGFiZWwuICBJZiBQUkVTRVJWRSBpcyBub24temVybywgaXQgcmVtZW1iZXJzIGVub3VnaCBpbmZvcm1hdGlvbiB0bwotICAga25vdyB3aGV0aGVyIG5vcHMgYXJlIG5lZWRlZCBiZWZvcmUgYSBub3Jlb3JkZXIgc2VjdGlvbi4gKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfbm9fcHJldl9pbnNuIChwcmVzZXJ2ZSkKLSAgICAgaW50IHByZXNlcnZlOwotewotICBpZiAoISBwcmVzZXJ2ZSkKLSAgICB7Ci0gICAgICBwcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0gICAgICBwcmV2X3ByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLSAgICAgIHByZXZfbm9wX2ZyYWcgPSBOVUxMOwotICAgICAgcHJldl9ub3BfZnJhZ19ob2xkcyA9IDA7Ci0gICAgICBwcmV2X25vcF9mcmFnX3JlcXVpcmVkID0gMDsKLSAgICAgIHByZXZfbm9wX2ZyYWdfc2luY2UgPSAwOwotICAgIH0KLSAgcHJldl9pbnNuX3ZhbGlkID0gMDsKLSAgcHJldl9pbnNuX2lzX2RlbGF5X3Nsb3QgPSAwOwotICBwcmV2X2luc25fdW5yZW9yZGVyZWQgPSAwOwotICBwcmV2X2luc25fZXh0ZW5kZWQgPSAwOwotICBwcmV2X2luc25fcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0gIHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkID0gMDsKLSAgbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuZXZlciB3ZSB0dXJuIG9uIG5vcmVvcmRlciBvciBlbWl0Ci0gICBzb21ldGhpbmcgb3RoZXIgdGhhbiBpbnN0cnVjdGlvbnMuICBJdCBpbnNlcnRzIGFueSBOT1BTIHdoaWNoIG1pZ2h0Ci0gICBiZSBuZWVkZWQgYnkgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLCBhbmQgY2xlYXJzIHRoZSBpbmZvcm1hdGlvbgotICAga2VwdCBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9ucy4gIFRoZSBJTlNOUyBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZgotICAgaW5zdHJ1Y3Rpb25zIGFyZSB0byBmb2xsb3cuICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VtaXRfZGVsYXlzIChpbnNucykKLSAgICAgYm9vbGVhbiBpbnNuczsKLXsKLSAgaWYgKCEgbWlwc19vcHRzLm5vcmVvcmRlcikKLSAgICB7Ci0gICAgICBpbnQgbm9wczsKLQotICAgICAgbm9wcyA9IDA7Ci0gICAgICBpZiAoKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgICYmIElTQV9IQVNfQ09QUk9DX0RFTEFZUyAobWlwc19vcHRzLmlzYSkKLQkgICAmJiAoISBjb3BfaW50ZXJsb2NrcwotICAgICAgICAgICAgICAgJiYgKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbwotICAgICAgICAgICAgICAgICAgICYgKElOU05fTE9BRF9DT1BST0NfREVMQVkKLSAgICAgICAgICAgICAgICAgICAgICB8IElOU05fQ09QUk9DX01PVkVfREVMQVkKLSAgICAgICAgICAgICAgICAgICAgICB8IElOU05fV1JJVEVfQ09ORF9DT0RFKSkpKQotCSAgfHwgKCEgaGlsb19pbnRlcmxvY2tzCi0JICAgICAgJiYgKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbwotCQkgICYgKElOU05fUkVBRF9MTwotCQkgICAgIHwgSU5TTl9SRUFEX0hJKSkpCi0JICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JICAgICAgJiYgISBncHJfaW50ZXJsb2NrcwotCSAgICAgICYmIChwcmV2X2luc24uaW5zbl9tby0+cGluZm8gCi0gICAgICAgICAgICAgICAgICAmIElOU05fTE9BRF9NRU1PUllfREVMQVkpKQotCSAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgICAgICYmIG1pcHNfb3B0cy5pc2EgPT0gMQotCSAgICAgICYmIChwcmV2X2luc24uaW5zbl9tby0+cGluZm8KLQkJICAmIElOU05fQ09QUk9DX01FTU9SWV9ERUxBWSkpKQotCXsKLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICArK25vcHM7Ci0JICBpZiAoKCEgbWlwc19vcHRzLm1pcHMxNgotCSAgICAgICAmJiBJU0FfSEFTX0NPUFJPQ19ERUxBWVMgKG1pcHNfb3B0cy5pc2EpCi0JICAgICAgICYmICghIGNvcF9pbnRlcmxvY2tzCi0gICAgICAgICAgICAgICAgICAgJiYgcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpKQotCSAgICAgIHx8ICghIGhpbG9faW50ZXJsb2NrcwotCQkgICYmICgocHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0hJKQotCQkgICAgICB8fCAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0xPKSkpKQotCSAgICArK25vcHM7Ci0KLQkgIGlmIChwcmV2X2luc25fdW5yZW9yZGVyZWQpCi0JICAgIG5vcHMgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKCghIG1pcHNfb3B0cy5taXBzMTYKLQkJJiYgSVNBX0hBU19DT1BST0NfREVMQVlTIChtaXBzX29wdHMuaXNhKQotCQkmJiAoISBjb3BfaW50ZXJsb2NrcwotICAgICAgICAgICAgICAgICAgICAmJiBwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fV1JJVEVfQ09ORF9DT0RFKSkKLQkgICAgICAgfHwgKCEgaGlsb19pbnRlcmxvY2tzCi0JCSAgICYmICgocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfSEkpCi0JCSAgICAgICB8fCAocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfTE8pKSkpCi0JewotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIGlmICghIHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkKQotCSAgICArK25vcHM7Ci0JfQotCi0gICAgICBpZiAobm9wcyA+IDApCi0JewotCSAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbDsKLQotCSAgaWYgKGluc25zKQotCSAgICB7Ci0JICAgICAgLyogUmVjb3JkIHRoZSBmcmFnIHdoaWNoIGhvbGRzIHRoZSBub3AgaW5zdHJ1Y3Rpb25zLCBzbwotICAgICAgICAgICAgICAgICB0aGF0IHdlIGNhbiByZW1vdmUgdGhlbSBpZiB3ZSBkb24ndCBuZWVkIHRoZW0uICAqLwotCSAgICAgIGZyYWdfZ3JvdyAobWlwc19vcHRzLm1pcHMxNiA/IG5vcHMgKiAyIDogbm9wcyAqIDQpOwotCSAgICAgIHByZXZfbm9wX2ZyYWcgPSBmcmFnX25vdzsKLQkgICAgICBwcmV2X25vcF9mcmFnX2hvbGRzID0gbm9wczsKLQkgICAgICBwcmV2X25vcF9mcmFnX3JlcXVpcmVkID0gMDsKLQkgICAgICBwcmV2X25vcF9mcmFnX3NpbmNlID0gMDsKLQkgICAgfQotCi0JICBmb3IgKDsgbm9wcyA+IDA7IC0tbm9wcykKLQkgICAgZW1pdF9ub3AgKCk7Ci0KLQkgIGlmIChpbnNucykKLQkgICAgewotCSAgICAgIC8qIE1vdmUgb24gdG8gYSBuZXcgZnJhZywgc28gdGhhdCBpdCBpcyBzYWZlIHRvIHNpbXBseQotICAgICAgICAgICAgICAgICBkZWNyZWFzZSB0aGUgc2l6ZSBvZiBwcmV2X25vcF9mcmFnLiAqLwotCSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotCSAgICAgIGZyYWdfbmV3ICgwKTsKLQkgICAgfQotCi0JICBmb3IgKGwgPSBpbnNuX2xhYmVsczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQkgICAgewotCSAgICAgIGFzc2VydCAoU19HRVRfU0VHTUVOVCAobC0+bGFiZWwpID09IG5vd19zZWcpOwotCSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobC0+bGFiZWwsIGZyYWdfbm93KTsKLQkgICAgICBTX1NFVF9WQUxVRSAobC0+bGFiZWwsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAgICAgLyogbWlwczE2IHRleHQgbGFiZWxzIGFyZSBzdG9yZWQgYXMgb2RkLiAgKi8KLQkgICAgICBpZiAobWlwc19vcHRzLm1pcHMxNikKLQkJU19TRVRfVkFMVUUgKGwtPmxhYmVsLCBTX0dFVF9WQUxVRSAobC0+bGFiZWwpICsgMSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE1hcmsgaW5zdHJ1Y3Rpb24gbGFiZWxzIGluIG1pcHMxNiBtb2RlLiAgKi8KLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYgJiYgaW5zbnMpCi0gICAgbWlwczE2X21hcmtfbGFiZWxzICgpOwotCi0gIG1pcHNfbm9fcHJldl9pbnNuIChpbnNucyk7Ci19Ci0KLS8qIEJ1aWxkIGFuIGluc3RydWN0aW9uIGNyZWF0ZWQgYnkgYSBtYWNybyBleHBhbnNpb24uICBUaGlzIGlzIHBhc3NlZAotICAgYSBwb2ludGVyIHRvIHRoZSBjb3VudCBvZiBpbnN0cnVjdGlvbnMgY3JlYXRlZCBzbyBmYXIsIGFuCi0gICBleHByZXNzaW9uLCB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYnVpbGQsIGFuIG9wZXJhbmQgZm9ybWF0Ci0gICBzdHJpbmcsIGFuZCBjb3JyZXNwb25kaW5nIGFyZ3VtZW50cy4gICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi1zdGF0aWMgdm9pZAotbWFjcm9fYnVpbGQgKGNoYXIgKnBsYWNlLAotCSAgICAgaW50ICpjb3VudGVyLAotCSAgICAgZXhwcmVzc2lvblMgKiBlcCwKLQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JICAgICBjb25zdCBjaGFyICpmbXQsCi0JICAgICAuLi4pCi0jZWxzZQotc3RhdGljIHZvaWQKLW1hY3JvX2J1aWxkIChwbGFjZSwgY291bnRlciwgZXAsIG5hbWUsIGZtdCwgdmFfYWxpc3QpCi0gICAgIGNoYXIgKnBsYWNlOwotICAgICBpbnQgKmNvdW50ZXI7Ci0gICAgIGV4cHJlc3Npb25TICplcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqZm10OwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICBzdHJ1Y3QgbWlwc19jbF9pbnNuIGluc247Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotICB2YV9saXN0IGFyZ3M7Ci0KLSNpZmRlZiBVU0VfU1REQVJHCi0gIHZhX3N0YXJ0IChhcmdzLCBmbXQpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZ3MpOwotI2VuZGlmCi0KLSAgLyoKLSAgICogSWYgdGhlIG1hY3JvIGlzIGFib3V0IHRvIGV4cGFuZCBpbnRvIGEgc2Vjb25kIGluc3RydWN0aW9uLAotICAgKiBwcmludCBhIHdhcm5pbmcgaWYgbmVlZGVkLiBXZSBuZWVkIHRvIHBhc3MgaXAgYXMgYSBwYXJhbWV0ZXIKLSAgICogdG8gZ2VuZXJhdGUgYSBiZXR0ZXIgd2FybmluZyBtZXNzYWdlIGhlcmUuLi4KLSAgICovCi0gIGlmIChtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MgJiYgcGxhY2UgPT0gTlVMTCAmJiAqY291bnRlciA9PSAxKQotICAgIGFzX3dhcm4gKF8oIk1hY3JvIGluc3RydWN0aW9uIGV4cGFuZGVkIGludG8gbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zIikpOwotCi0gIGlmIChwbGFjZSA9PSBOVUxMKQotICAgICpjb3VudGVyICs9IDE7CQkvKiBidW1wIGluc3RydWN0aW9uIGNvdW50ZXIgKi8KLQotICBpZiAobWlwc19vcHRzLm1pcHMxNikKLSAgICB7Ci0gICAgICBtaXBzMTZfbWFjcm9fYnVpbGQgKHBsYWNlLCBjb3VudGVyLCBlcCwgbmFtZSwgZm10LCBhcmdzKTsKLSAgICAgIHZhX2VuZCAoYXJncyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHIgPSBCRkRfUkVMT0NfVU5VU0VEOwotICBpbnNuLmluc25fbW8gPSAoc3RydWN0IG1pcHNfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgbmFtZSk7Ci0gIGFzc2VydCAoaW5zbi5pbnNuX21vKTsKLSAgYXNzZXJ0IChzdHJjbXAgKG5hbWUsIGluc24uaW5zbl9tby0+bmFtZSkgPT0gMCk7Ci0KLSAgLyogU2VhcmNoIHVudGlsIHdlIGdldCBhIG1hdGNoIGZvciBOQU1FLiAgKi8KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoZm10LCBpbnNuLmluc25fbW8tPmFyZ3MpID09IDAKLQkgICYmIGluc24uaW5zbl9tby0+cGluZm8gIT0gSU5TTl9NQUNSTwotCSAgJiYgT1BDT0RFX0lTX01FTUJFUiAoaW5zbi5pbnNuX21vLCBtaXBzX29wdHMuaXNhLCBtaXBzX2NwdSkKLQkgICYmIChtaXBzX2NwdSAhPSA0NjUwIHx8IChpbnNuLmluc25fbW8tPnBpbmZvICYgRlBfRCkgPT0gMCkpCi0JYnJlYWs7Ci0KLSAgICAgICsraW5zbi5pbnNuX21vOwotICAgICAgYXNzZXJ0IChpbnNuLmluc25fbW8tPm5hbWUpOwotICAgICAgYXNzZXJ0IChzdHJjbXAgKG5hbWUsIGluc24uaW5zbl9tby0+bmFtZSkgPT0gMCk7Ci0gICAgfQotCi0gIGluc24uaW5zbl9vcGNvZGUgPSBpbnNuLmluc25fbW8tPm1hdGNoOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHN3aXRjaCAoKmZtdCsrKQotCXsKLQljYXNlICdcMCc6Ci0JICBicmVhazsKLQotCWNhc2UgJywnOgotCWNhc2UgJygnOgotCWNhc2UgJyknOgotCSAgY29udGludWU7Ci0KLQljYXNlICd0JzoKLQljYXNlICd3JzoKLQljYXNlICdFJzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDE2OwotCSAgY29udGludWU7Ci0KLQljYXNlICdjJzoKLQljYXNlICdUJzoKLQljYXNlICdXJzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDE2OwotCSAgY29udGludWU7Ci0KLQljYXNlICdkJzoKLQljYXNlICdHJzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDExOwotCSAgY29udGludWU7Ci0KLQljYXNlICdWJzoKLQljYXNlICdTJzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDExOwotCSAgY29udGludWU7Ci0KLQljYXNlICd6JzoKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnPCc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCA2OwotCSAgY29udGludWU7Ci0KLQljYXNlICdEJzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDY7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ0InOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgNjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAncSc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCA2OwotCSAgY29udGludWU7Ci0KLQljYXNlICdiJzoKLQljYXNlICdzJzoKLQljYXNlICdyJzoKLQljYXNlICd2JzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDIxOwotCSAgY29udGludWU7Ci0KLQljYXNlICdpJzoKLQljYXNlICdqJzoKLQljYXNlICdvJzoKLQkgIHIgPSAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSB2YV9hcmcgKGFyZ3MsIGludCk7Ci0JICBhc3NlcnQgKHIgPT0gQkZEX1JFTE9DX01JUFNfR1BSRUwKLQkJICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwKLQkJICB8fCByID09IEJGRF9SRUxPQ19MTzE2Ci0JCSAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19HT1QxNgotCQkgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTDE2Ci0JCSAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNgotCQkgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2Ci0JCSAgfHwgKGVwLT5YX29wID09IE9fc3VidHJhY3QKLQkJICAgICAgJiYgbm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24KLQkJICAgICAgJiYgciA9PSBCRkRfUkVMT0NfUENSRUxfTE8xNikpOwotCSAgY29udGludWU7Ci0KLQljYXNlICd1JzoKLQkgIHIgPSAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSB2YV9hcmcgKGFyZ3MsIGludCk7Ci0JICBhc3NlcnQgKGVwICE9IE5VTEwKLQkJICAmJiAoZXAtPlhfb3AgPT0gT19jb25zdGFudAotCQkgICAgICB8fCAoZXAtPlhfb3AgPT0gT19zeW1ib2wKLQkJCSAgJiYgKHIgPT0gQkZEX1JFTE9DX0hJMTZfUwotCQkJICAgICAgfHwgciA9PSBCRkRfUkVMT0NfSEkxNgotCQkJICAgICAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNgotCQkJICAgICAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYpKQotCQkgICAgICB8fCAoZXAtPlhfb3AgPT0gT19zdWJ0cmFjdAotCQkJICAmJiBub3dfc2VnID09IHRleHRfc2VjdGlvbgotCQkJICAmJiByID09IEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MpKSk7Ci0JICBpZiAoZXAtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGluc24uaW5zbl9vcGNvZGUgfD0gKGVwLT5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCSAgICAgIGVwID0gTlVMTDsKLQkgICAgICByID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkgICAgfQotCSAgY29udGludWU7Ci0KLQljYXNlICdwJzoKLQkgIGFzc2VydCAoZXAgIT0gTlVMTCk7Ci0JICAvKgotCSAgICogVGhpcyBhbGxvd3MgbWFjcm8oKSB0byBwYXNzIGFuIGltbWVkaWF0ZSBleHByZXNzaW9uIGZvcgotCSAgICogY3JlYXRpbmcgc2hvcnQgYnJhbmNoZXMgd2l0aG91dCBjcmVhdGluZyBhIHN5bWJvbC4KLQkgICAqIE5vdGUgdGhhdCB0aGUgZXhwcmVzc2lvbiBzdGlsbCBtaWdodCBjb21lIGZyb20gdGhlIGFzc2VtYmx5Ci0JICAgKiBpbnB1dCwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgaXMgbm90IGNoZWNrZWQgZm9yIHJhbmdlIG5vcgotCSAgICogaXMgYSByZWxvY2F0aW9uIGVudHJ5IGdlbmVyYXRlZCAoeXVjaykuCi0JICAgKi8KLQkgIGlmIChlcC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaW5zbi5pbnNuX29wY29kZSB8PSAoZXAtPlhfYWRkX251bWJlciA+PiAyKSAmIDB4ZmZmZjsKLQkgICAgICBlcCA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgciA9IEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnYSc6Ci0JICBhc3NlcnQgKGVwICE9IE5VTEwpOwotCSAgciA9IEJGRF9SRUxPQ19NSVBTX0pNUDsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnQyc6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgbG9uZyk7Ci0JICBjb250aW51ZTsKLQotCWRlZmF1bHQ6Ci0JICBpbnRlcm5hbEVycm9yICgpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgdmFfZW5kIChhcmdzKTsKLSAgYXNzZXJ0IChyID09IEJGRF9SRUxPQ19VTlVTRUQgPyBlcCA9PSBOVUxMIDogZXAgIT0gTlVMTCk7Ci0KLSAgYXBwZW5kX2luc24gKHBsYWNlLCAmaW5zbiwgZXAsIHIsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQKLW1pcHMxNl9tYWNyb19idWlsZCAocGxhY2UsIGNvdW50ZXIsIGVwLCBuYW1lLCBmbXQsIGFyZ3MpCi0gICAgIGNoYXIgKnBsYWNlOwotICAgICBpbnQgKmNvdW50ZXI7Ci0gICAgIGV4cHJlc3Npb25TICplcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqZm10OwotICAgICB2YV9saXN0IGFyZ3M7Ci17Ci0gIHN0cnVjdCBtaXBzX2NsX2luc24gaW5zbjsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0KLSAgciA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0gIGluc24uaW5zbl9tbyA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChtaXBzMTZfb3BfaGFzaCwgbmFtZSk7Ci0gIGFzc2VydCAoaW5zbi5pbnNuX21vKTsKLSAgYXNzZXJ0IChzdHJjbXAgKG5hbWUsIGluc24uaW5zbl9tby0+bmFtZSkgPT0gMCk7Ci0KLSAgd2hpbGUgKHN0cmNtcCAoZm10LCBpbnNuLmluc25fbW8tPmFyZ3MpICE9IDAKLQkgfHwgaW5zbi5pbnNuX21vLT5waW5mbyA9PSBJTlNOX01BQ1JPKQotICAgIHsKLSAgICAgICsraW5zbi5pbnNuX21vOwotICAgICAgYXNzZXJ0IChpbnNuLmluc25fbW8tPm5hbWUpOwotICAgICAgYXNzZXJ0IChzdHJjbXAgKG5hbWUsIGluc24uaW5zbl9tby0+bmFtZSkgPT0gMCk7Ci0gICAgfQotCi0gIGluc24uaW5zbl9vcGNvZGUgPSBpbnNuLmluc25fbW8tPm1hdGNoOwotICBpbnNuLnVzZV9leHRlbmQgPSBmYWxzZTsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGludCBjOwotCi0gICAgICBjID0gKmZtdCsrOwotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdcMCc6Ci0JICBicmVhazsKLQotCWNhc2UgJywnOgotCWNhc2UgJygnOgotCWNhc2UgJyknOgotCSAgY29udGludWU7Ci0KLQljYXNlICd5JzoKLQljYXNlICd3JzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IE1JUFMxNk9QX1NIX1JZOwotCSAgY29udGludWU7Ci0KLQljYXNlICd4JzoKLQljYXNlICd2JzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IE1JUFMxNk9QX1NIX1JYOwotCSAgY29udGludWU7Ci0KLQljYXNlICd6JzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IE1JUFMxNk9QX1NIX1JaOwotCSAgY29udGludWU7Ci0KLQljYXNlICdaJzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IE1JUFMxNk9QX1NIX01PVkUzMlo7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJzAnOgotCWNhc2UgJ1MnOgotCWNhc2UgJ1AnOgotCWNhc2UgJ1InOgotCSAgY29udGludWU7Ci0KLQljYXNlICdYJzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IE1JUFMxNk9QX1NIX1JFR1IzMjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnWSc6Ci0JICB7Ci0JICAgIGludCByZWdubzsKLQotCSAgICByZWdubyA9IHZhX2FyZyAoYXJncywgaW50KTsKLQkgICAgcmVnbm8gPSAoKHJlZ25vICYgNykgPDwgMikgfCAoKHJlZ25vICYgMHgxOCkgPj4gMyk7Ci0JICAgIGluc24uaW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgTUlQUzE2T1BfU0hfUkVHMzJSOwotCSAgfQotCSAgY29udGludWU7Ci0KLQljYXNlICc8JzoKLQljYXNlICc+JzoKLQljYXNlICc0JzoKLQljYXNlICc1JzoKLQljYXNlICdIJzoKLQljYXNlICdXJzoKLQljYXNlICdEJzoKLQljYXNlICdqJzoKLQljYXNlICc4JzoKLQljYXNlICdWJzoKLQljYXNlICdDJzoKLQljYXNlICdVJzoKLQljYXNlICdrJzoKLQljYXNlICdLJzoKLQljYXNlICdwJzoKLQljYXNlICdxJzoKLQkgIHsKLQkgICAgYXNzZXJ0IChlcCAhPSBOVUxMKTsKLQotCSAgICBpZiAoZXAtPlhfb3AgIT0gT19jb25zdGFudCkKLQkgICAgICByID0gQkZEX1JFTE9DX1VOVVNFRCArIGM7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW1pcHMxNl9pbW1lZCAoKGNoYXIgKikgTlVMTCwgMCwgYywgZXAtPlhfYWRkX251bWJlciwgZmFsc2UsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UsICZpbnNuLmluc25fb3Bjb2RlLAotCQkJICAgICAgJmluc24udXNlX2V4dGVuZCwgJmluc24uZXh0ZW5kKTsKLQkJZXAgPSBOVUxMOwotCQlyID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkgICAgICB9Ci0JICB9Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJzYnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgTUlQUzE2T1BfU0hfSU1NNjsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGFzc2VydCAociA9PSBCRkRfUkVMT0NfVU5VU0VEID8gZXAgPT0gTlVMTCA6IGVwICE9IE5VTEwpOwotCi0gIGFwcGVuZF9pbnNuIChwbGFjZSwgJmluc24sIGVwLCByLCBmYWxzZSk7Ci19Ci0KLS8qCi0gKiBHZW5lcmF0ZSBhICJsdWkiIGluc3RydWN0aW9uLgotICovCi1zdGF0aWMgdm9pZAotbWFjcm9fYnVpbGRfbHVpIChwbGFjZSwgY291bnRlciwgZXAsIHJlZ251bSkKLSAgICAgY2hhciAqcGxhY2U7Ci0gICAgIGludCAqY291bnRlcjsKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotICAgICBpbnQgcmVnbnVtOwotewotICBleHByZXNzaW9uUyBoaWdoX2V4cHI7Ci0gIHN0cnVjdCBtaXBzX2NsX2luc24gaW5zbjsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0gIENPTlNUIGNoYXIgKm5hbWUgPSAibHVpIjsKLSAgQ09OU1QgY2hhciAqZm10ID0gInQsdSI7Ci0KLSAgYXNzZXJ0ICghIG1pcHNfb3B0cy5taXBzMTYpOwotCi0gIGlmIChwbGFjZSA9PSBOVUxMKQotICAgIGhpZ2hfZXhwciA9ICplcDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGhpZ2hfZXhwci5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGhpZ2hfZXhwci5YX2FkZF9udW1iZXIgPSBlcC0+WF9hZGRfbnVtYmVyOwotICAgIH0KLQotICBpZiAoaGlnaF9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICAvKiB3ZSBjYW4gY29tcHV0ZSB0aGUgaW5zdHJ1Y3Rpb24gbm93IHdpdGhvdXQgYSByZWxvY2F0aW9uIGVudHJ5ICovCi0gICAgICBpZiAoaGlnaF9leHByLlhfYWRkX251bWJlciAmIDB4ODAwMCkKLQloaWdoX2V4cHIuWF9hZGRfbnVtYmVyICs9IDB4MTAwMDA7Ci0gICAgICBoaWdoX2V4cHIuWF9hZGRfbnVtYmVyID0KLQkoKHVuc2lnbmVkIGxvbmcpIGhpZ2hfZXhwci5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotICAgICAgciA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNzZXJ0IChlcC0+WF9vcCA9PSBPX3N5bWJvbCk7Ci0gICAgICAvKiBfZ3BfZGlzcCBpcyBhIHNwZWNpYWwgY2FzZSwgdXNlZCBmcm9tIHNfY3Bsb2FkLiAgKi8KLSAgICAgIGFzc2VydCAobWlwc19waWMgPT0gTk9fUElDCi0JICAgICAgfHwgc3RyY21wIChTX0dFVF9OQU1FIChlcC0+WF9hZGRfc3ltYm9sKSwgIl9ncF9kaXNwIikgPT0gMCk7Ci0gICAgICByID0gQkZEX1JFTE9DX0hJMTZfUzsKLSAgICB9Ci0KLSAgLyoKLSAgICogSWYgdGhlIG1hY3JvIGlzIGFib3V0IHRvIGV4cGFuZCBpbnRvIGEgc2Vjb25kIGluc3RydWN0aW9uLAotICAgKiBwcmludCBhIHdhcm5pbmcgaWYgbmVlZGVkLiBXZSBuZWVkIHRvIHBhc3MgaXAgYXMgYSBwYXJhbWV0ZXIKLSAgICogdG8gZ2VuZXJhdGUgYSBiZXR0ZXIgd2FybmluZyBtZXNzYWdlIGhlcmUuLi4KLSAgICovCi0gIGlmIChtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MgJiYgcGxhY2UgPT0gTlVMTCAmJiAqY291bnRlciA9PSAxKQotICAgIGFzX3dhcm4gKF8oIk1hY3JvIGluc3RydWN0aW9uIGV4cGFuZGVkIGludG8gbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zIikpOwotCi0gIGlmIChwbGFjZSA9PSBOVUxMKQotICAgICpjb3VudGVyICs9IDE7CQkvKiBidW1wIGluc3RydWN0aW9uIGNvdW50ZXIgKi8KLQotICBpbnNuLmluc25fbW8gPSAoc3RydWN0IG1pcHNfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgbmFtZSk7Ci0gIGFzc2VydCAoaW5zbi5pbnNuX21vKTsKLSAgYXNzZXJ0IChzdHJjbXAgKG5hbWUsIGluc24uaW5zbl9tby0+bmFtZSkgPT0gMCk7Ci0gIGFzc2VydCAoc3RyY21wIChmbXQsIGluc24uaW5zbl9tby0+YXJncykgPT0gMCk7Ci0KLSAgaW5zbi5pbnNuX29wY29kZSA9IGluc24uaW5zbl9tby0+bWF0Y2ggfCAocmVnbnVtIDw8IE9QX1NIX1JUKTsKLSAgaWYgKHIgPT0gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICB7Ci0gICAgICBpbnNuLmluc25fb3Bjb2RlIHw9IGhpZ2hfZXhwci5YX2FkZF9udW1iZXI7Ci0gICAgICBhcHBlbmRfaW5zbiAocGxhY2UsICZpbnNuLCBOVUxMLCByLCBmYWxzZSk7Ci0gICAgfQotICBlbHNlCi0gICAgYXBwZW5kX2luc24gKHBsYWNlLCAmaW5zbiwgJmhpZ2hfZXhwciwgciwgZmFsc2UpOwotfQotCi0vKgkJCXNldF9hdCgpCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBzZXQgdGhlICRhdCByZWdpc3RlciB0byB0cnVlIChvbmUpCi0gKiBpZiByZWcgaXMgbGVzcyB0aGFuIHRoZSBpbW1lZGlhdGUgZXhwcmVzc2lvbi4KLSAqLwotc3RhdGljIHZvaWQKLXNldF9hdCAoY291bnRlciwgcmVnLCB1bnNpZ25lZHApCi0gICAgIGludCAqY291bnRlcjsKLSAgICAgaW50IHJlZzsKLSAgICAgaW50IHVuc2lnbmVkcDsKLXsKLSAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKLSAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4ODAwMCkKLSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmltbV9leHByLAotCQkgdW5zaWduZWRwID8gInNsdGl1IiA6ICJzbHRpIiwKLQkJICJ0LHIsaiIsIEFULCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxvYWRfcmVnaXN0ZXIgKGNvdW50ZXIsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsCi0JCSAgIHVuc2lnbmVkcCA/ICJzbHR1IiA6ICJzbHQiLAotCQkgICAiZCx2LHQiLCBBVCwgcmVnLCBBVCk7Ci0gICAgfQotfQotCi0vKiBXYXJuIGlmIGFuIGV4cHJlc3Npb24gaXMgbm90IGEgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgdm9pZAotY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsIGV4KQotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLSAgICAgZXhwcmVzc2lvblMgKmV4OwotewotICBpZiAoZXgtPlhfb3AgPT0gT19iaWcpCi0gICAgYXNfYmFkIChfKCJ1bnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKLSAgZWxzZSBpZiAoZXgtPlhfb3AgIT0gT19jb25zdGFudCkKLSAgICBhc19iYWQgKF8oIkluc3RydWN0aW9uICVzIHJlcXVpcmVzIGFic29sdXRlIGV4cHJlc3Npb24iKSwgaXAtPmluc25fbW8tPm5hbWUpOwotfQotCi0vKiBDb3VudCB0aGUgbGVhZGluZyB6ZXJvZXMgYnkgcGVyZm9ybWluZyBhIGJpbmFyeSBjaG9wLiBUaGlzIGlzIGEKLSAgIGJ1bGt5IGJpdCBvZiBzb3VyY2UsIGJ1dCBwZXJmb3JtYW5jZSBpcyBhIExPVCBiZXR0ZXIgZm9yIHRoZQotICAgbWFqb3JpdHkgb2YgdmFsdWVzIHRoYW4gYSBzaW1wbGUgbG9vcCB0byBjb3VudCB0aGUgYml0czoKLSAgICAgICBmb3IgKGxjbnQgPSAwOyAobGNudCA8IDMyKTsgbGNudCsrKQotICAgICAgICAgaWYgKCh2KSAmICgxIDw8ICgzMSAtIGxjbnQpKSkKLSAgICAgICAgICAgYnJlYWs7Ci0gIEhvd2V2ZXIgaXQgaXMgbm90IGNvZGUgc2l6ZSBmcmllbmRseSwgYW5kIHRoZSBnYWluIHdpbGwgZHJvcCBhIGJpdAotICBvbiBjZXJ0YWluIGNhY2hlZCBzeXN0ZW1zLgotKi8KLSNkZWZpbmUgQ09VTlRfVE9QX1pFUk9FUyh2KSAgICAgICAgICAgICBcCi0gICgoKHYpICYgfjB4ZmZmZikgPT0gMCAgICAgICAgICAgICAgICAgXAotICAgPyAoKHYpICYgfjB4ZmYpID09IDAgICAgICAgICAgICAgICAgIFwKLSAgICAgPyAoKHYpICYgfjB4ZikgPT0gMCAgICAgICAgICAgICAgICBcCi0gICAgICAgPyAoKHYpICYgfjB4MykgPT0gMCAgICAgICAgICAgICAgXAotICAgICAgICAgPyAoKHYpICYgfjB4MSkgPT0gMCAgICAgICAgICAgIFwKLSAgICAgICAgICAgPyAhKHYpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgPyAzMiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgIDogMzEgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAzMCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3KSA9PSAwICAgICAgICAgICAgXAotICAgICAgICAgICA/IDI5ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAyOCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgOiAoKHYpICYgfjB4M2YpID09IDAgICAgICAgICAgICAgXAotICAgICAgICAgPyAoKHYpICYgfjB4MWYpID09IDAgICAgICAgICAgIFwKLSAgICAgICAgICAgPyAyNyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMjYgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgOiAoKHYpICYgfjB4N2YpID09IDAgICAgICAgICAgIFwKLSAgICAgICAgICAgPyAyNSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMjQgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICA6ICgodikgJiB+MHhmZmYpID09IDAgICAgICAgICAgICAgIFwKLSAgICAgICA/ICgodikgJiB+MHgzZmYpID09IDAgICAgICAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxZmYpID09IDAgICAgICAgICAgXAotICAgICAgICAgICA/IDIzICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAyMiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3ZmYpID09IDAgICAgICAgICAgXAotICAgICAgICAgICA/IDIxICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAyMCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgOiAoKHYpICYgfjB4M2ZmZikgPT0gMCAgICAgICAgICAgXAotICAgICAgICAgPyAoKHYpICYgfjB4MWZmZikgPT0gMCAgICAgICAgIFwKLSAgICAgICAgICAgPyAxOSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMTggICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgOiAoKHYpICYgfjB4N2ZmZikgPT0gMCAgICAgICAgIFwKLSAgICAgICAgICAgPyAxNyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMTYgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgOiAoKHYpICYgfjB4ZmZmZmZmKSA9PSAwICAgICAgICAgICAgIFwKLSAgICAgPyAoKHYpICYgfjB4ZmZmZmYpID09IDAgICAgICAgICAgICBcCi0gICAgICAgPyAoKHYpICYgfjB4M2ZmZmYpID09IDAgICAgICAgICAgXAotICAgICAgICAgPyAoKHYpICYgfjB4MWZmZmYpID09IDAgICAgICAgIFwKLSAgICAgICAgICAgPyAxNSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMTQgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgOiAoKHYpICYgfjB4N2ZmZmYpID09IDAgICAgICAgIFwKLSAgICAgICAgICAgPyAxMyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMTIgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIDogKCh2KSAmIH4weDNmZmZmZikgPT0gMCAgICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDFmZmZmZikgPT0gMCAgICAgICBcCi0gICAgICAgICAgID8gMTEgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDEwICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDdmZmZmZikgPT0gMCAgICAgICBcCi0gICAgICAgICAgID8gOSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDggICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgOiAoKHYpICYgfjB4ZmZmZmZmZikgPT0gMCAgICAgICAgICBcCi0gICAgICAgPyAoKHYpICYgfjB4M2ZmZmZmZikgPT0gMCAgICAgICAgXAotICAgICAgICAgPyAoKHYpICYgfjB4MWZmZmZmZikgPT0gMCAgICAgIFwKLSAgICAgICAgICAgPyA3ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogNiAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgOiAoKHYpICYgfjB4N2ZmZmZmZikgPT0gMCAgICAgIFwKLSAgICAgICAgICAgPyA1ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogNCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIDogKCh2KSAmIH4weDNmZmZmZmZmKSA9PSAwICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDFmZmZmZmZmKSA9PSAwICAgICBcCi0gICAgICAgICAgID8gMyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDdmZmZmZmZmKSA9PSAwICAgICBcCi0gICAgICAgICAgID8gMSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDApCi0KLS8qCQkJbG9hZF9yZWdpc3RlcigpCi0gKiAgVGhpcyByb3V0aW5lIGdlbmVyYXRlcyB0aGUgbGVhc3QgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBuZWNjZXNzYXJ5IHRvIGxvYWQKLSAqICBhbiBhYnNvbHV0ZSBleHByZXNzaW9uIHZhbHVlIGludG8gYSByZWdpc3Rlci4KLSAqLwotc3RhdGljIHZvaWQKLWxvYWRfcmVnaXN0ZXIgKGNvdW50ZXIsIHJlZywgZXAsIGRibCkKLSAgICAgaW50ICpjb3VudGVyOwotICAgICBpbnQgcmVnOwotICAgICBleHByZXNzaW9uUyAqZXA7Ci0gICAgIGludCBkYmw7Ci17Ci0gIGludCBmcmVnOwotICBleHByZXNzaW9uUyBoaTMyLCBsbzMyOwotCi0gIGlmIChlcC0+WF9vcCAhPSBPX2JpZykKLSAgICB7Ci0gICAgICBhc3NlcnQgKGVwLT5YX29wID09IE9fY29uc3RhbnQpOwotICAgICAgaWYgKGVwLT5YX2FkZF9udW1iZXIgPCAweDgwMDAKLQkgICYmIChlcC0+WF9hZGRfbnVtYmVyID49IDAKLQkgICAgICB8fCAoZXAtPlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JCSAgJiYgKCEgZGJsCi0JCSAgICAgIHx8ICEgZXAtPlhfdW5zaWduZWQKLQkJICAgICAgfHwgc2l6ZW9mIChlcC0+WF9hZGRfbnVtYmVyKSA+IDQpKSkpCi0JewotCSAgLyogV2UgY2FuIGhhbmRsZSAxNiBiaXQgc2lnbmVkIHZhbHVlcyB3aXRoIGFuIGFkZGl1IHRvCi0JICAgICAkemVyby4gIE5vIG5lZWQgdG8gZXZlciB1c2UgZGFkZGl1IGhlcmUsIHNpbmNlICR6ZXJvIGFuZAotCSAgICAgdGhlIHJlc3VsdCBhcmUgYWx3YXlzIGNvcnJlY3QgaW4gMzIgYml0IG1vZGUuICAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLCAiYWRkaXUiLCAidCxyLGoiLCByZWcsIDAsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoZXAtPlhfYWRkX251bWJlciA+PSAwICYmIGVwLT5YX2FkZF9udW1iZXIgPCAweDEwMDAwKQotCXsKLQkgIC8qIFdlIGNhbiBoYW5kbGUgMTYgYml0IHVuc2lnbmVkIHZhbHVlcyB3aXRoIGFuIG9yaSB0bwotICAgICAgICAgICAgICR6ZXJvLiAgKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwgIm9yaSIsICJ0LHIsaSIsIHJlZywgMCwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmICgoKChlcC0+WF9hZGRfbnVtYmVyICZ+IChvZmZzZXRUKSAweDdmZmZmZmZmKSA9PSAwCi0JCSB8fCAoKGVwLT5YX2FkZF9udW1iZXIgJn4gKG9mZnNldFQpIDB4N2ZmZmZmZmYpCi0JCSAgICAgPT0gfiAob2Zmc2V0VCkgMHg3ZmZmZmZmZikpCi0JCSYmICghIGRibAotCQkgICAgfHwgISBlcC0+WF91bnNpZ25lZAotCQkgICAgfHwgc2l6ZW9mIChlcC0+WF9hZGRfbnVtYmVyKSA+IDQKLQkJICAgIHx8IChlcC0+WF9hZGRfbnVtYmVyICYgMHg4MDAwMDAwMCkgPT0gMCkpCi0JICAgICAgIHx8ICgoISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpIHx8ICEgZGJsKQotCQkgICAmJiAoZXAtPlhfYWRkX251bWJlciAmfiAob2Zmc2V0VCkgMHhmZmZmZmZmZikgPT0gMCkKLQkgICAgICAgfHwgKCEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKQotCQkgICAmJiAhIGRibAotCQkgICAmJiAoKGVwLT5YX2FkZF9udW1iZXIgJn4gKG9mZnNldFQpIDB4ZmZmZmZmZmYpCi0JCSAgICAgICA9PSB+IChvZmZzZXRUKSAweGZmZmZmZmZmKSkpCi0JewotCSAgLyogMzIgYml0IHZhbHVlcyByZXF1aXJlIGFuIGx1aS4gICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJsdWkiLCAidCx1IiwgcmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0hJMTYpOwotCSAgaWYgKChlcC0+WF9hZGRfbnVtYmVyICYgMHhmZmZmKSAhPSAwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJvcmkiLCAidCxyLGkiLCByZWcsIHJlZywKLQkJCSAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBUaGUgdmFsdWUgaXMgbGFyZ2VyIHRoYW4gMzIgYml0cy4gICovCi0KLSAgaWYgKCEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk51bWJlciBsYXJnZXIgdGhhbiAzMiBiaXRzIikpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLCAiYWRkaXUiLCAidCxyLGoiLCByZWcsIDAsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGVwLT5YX29wICE9IE9fYmlnKQotICAgIHsKLSAgICAgIGhpMzIgPSAqZXA7Ci0gICAgICBoaTMyLlhfYWRkX251bWJlciA9ICh2YWx1ZVQpIGhpMzIuWF9hZGRfbnVtYmVyID4+IDE2OwotICAgICAgaGkzMi5YX2FkZF9udW1iZXIgPSAodmFsdWVUKSBoaTMyLlhfYWRkX251bWJlciA+PiAxNjsKLSAgICAgIGhpMzIuWF9hZGRfbnVtYmVyICY9IDB4ZmZmZmZmZmY7Ci0gICAgICBsbzMyID0gKmVwOwotICAgICAgbG8zMi5YX2FkZF9udW1iZXIgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc3NlcnQgKGVwLT5YX2FkZF9udW1iZXIgPiAyKTsKLSAgICAgIGlmIChlcC0+WF9hZGRfbnVtYmVyID09IDMpCi0JZ2VuZXJpY19iaWdudW1bM10gPSAwOwotICAgICAgZWxzZSBpZiAoZXAtPlhfYWRkX251bWJlciA+IDQpCi0JYXNfYmFkIChfKCJOdW1iZXIgbGFyZ2VyIHRoYW4gNjQgYml0cyIpKTsKLSAgICAgIGxvMzIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBsbzMyLlhfYWRkX251bWJlciA9IGdlbmVyaWNfYmlnbnVtWzBdICsgKGdlbmVyaWNfYmlnbnVtWzFdIDw8IDE2KTsKLSAgICAgIGhpMzIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBoaTMyLlhfYWRkX251bWJlciA9IGdlbmVyaWNfYmlnbnVtWzJdICsgKGdlbmVyaWNfYmlnbnVtWzNdIDw8IDE2KTsKLSAgICB9Ci0KLSAgaWYgKGhpMzIuWF9hZGRfbnVtYmVyID09IDApCi0gICAgZnJlZyA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgc2hpZnQsIGJpdDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaGksIGxvOwotCi0gICAgICBpZiAoaGkzMi5YX2FkZF9udW1iZXIgPT0gMHhmZmZmZmZmZikKLSAgICAgICAgewotICAgICAgICAgIGlmICgobG8zMi5YX2FkZF9udW1iZXIgJiAweGZmZmY4MDAwKSA9PSAweGZmZmY4MDAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmxvMzIsICJhZGRpdSIsICJ0LHIsaiIsCi0JCQkgICByZWcsIDAsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgIGlmIChsbzMyLlhfYWRkX251bWJlciAmIDB4ODAwMDAwMDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgImx1aSIsICJ0LHUiLCByZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBCRkRfUkVMT0NfSEkxNik7Ci0JICAgICAgaWYgKGxvMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmKQotCQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmxvMzIsICJvcmkiLCAidCxyLGkiLAotCQkJICAgICByZWcsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgLyogQ2hlY2sgZm9yIDE2Yml0IHNoaWZ0ZWQgY29uc3RhbnQuICBXZSBrbm93IHRoYXQgaGkzMiBpcwotICAgICAgICAgbm9uLXplcm8sIHNvIHN0YXJ0IHRoZSBtYXNrIG9uIHRoZSBmaXJzdCBiaXQgb2YgdGhlIGhpMzIKLSAgICAgICAgIHZhbHVlLiAgKi8KLSAgICAgIHNoaWZ0ID0gMTc7Ci0gICAgICBkbwotICAgICAgIHsKLQkgdW5zaWduZWQgbG9uZyBoaW1hc2ssIGxvbWFzazsKLQotCSBpZiAoc2hpZnQgPCAzMikKLQkgICB7Ci0JICAgICBoaW1hc2sgPSAweGZmZmYgPj4gKDMyIC0gc2hpZnQpOwotCSAgICAgbG9tYXNrID0gKDB4ZmZmZiA8PCBzaGlmdCkgJiAweGZmZmZmZmZmOwotCSAgIH0KLQkgZWxzZQotCSAgIHsKLQkgICAgIGhpbWFzayA9IDB4ZmZmZiA8PCAoc2hpZnQgLSAzMik7Ci0JICAgICBsb21hc2sgPSAwOwotCSAgIH0KLQkgaWYgKChoaTMyLlhfYWRkX251bWJlciAmIH4gKG9mZnNldFQpIGhpbWFzaykgPT0gMAotCSAgICAgJiYgKGxvMzIuWF9hZGRfbnVtYmVyICYgfiAob2Zmc2V0VCkgbG9tYXNrKSA9PSAwKQotCSAgIHsKLQkgICAgIGV4cHJlc3Npb25TIHRtcDsKLQotCSAgICAgdG1wLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICAgaWYgKHNoaWZ0IDwgMzIpCi0JICAgICAgIHRtcC5YX2FkZF9udW1iZXIgPSAoKGhpMzIuWF9hZGRfbnVtYmVyIDw8ICgzMiAtIHNoaWZ0KSkKLQkJCQkgICB8IChsbzMyLlhfYWRkX251bWJlciA+PiBzaGlmdCkpOwotCSAgICAgZWxzZQotCSAgICAgICB0bXAuWF9hZGRfbnVtYmVyID0gaGkzMi5YX2FkZF9udW1iZXIgPj4gKHNoaWZ0IC0gMzIpOwotCSAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZ0bXAsICJvcmkiLCAidCxyLGkiLCByZWcsIDAsCi0JCQkgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLAotCQkJICAoc2hpZnQgPj0gMzIpID8gImRzbGwzMiIgOiAiZHNsbCIsCi0JCQkgICJkLHcsPCIsIHJlZywgcmVnLAotCQkJICAoc2hpZnQgPj0gMzIpID8gc2hpZnQgLSAzMiA6IHNoaWZ0KTsKLQkgICAgIHJldHVybjsKLQkgICB9Ci0gICAgICAgICBzaGlmdCsrOwotICAgICAgIH0gd2hpbGUgKHNoaWZ0IDw9ICg2NCAtIDE2KSk7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIGJpdCBudW1iZXIgb2YgdGhlIGxvd2VzdCBvbmUgYml0LCBhbmQgc3RvcmUgdGhlCi0gICAgICAgICBzaGlmdGVkIHZhbHVlIGluIGhpL2xvLiAgKi8KLSAgICAgIGhpID0gKHVuc2lnbmVkIGxvbmcpIChoaTMyLlhfYWRkX251bWJlciAmIDB4ZmZmZmZmZmYpOwotICAgICAgbG8gPSAodW5zaWduZWQgbG9uZykgKGxvMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmZmZmZik7Ci0gICAgICBpZiAobG8gIT0gMCkKLQl7Ci0JICBiaXQgPSAwOwotCSAgd2hpbGUgKChsbyAmIDEpID09IDApCi0JICAgIHsKLQkgICAgICBsbyA+Pj0gMTsKLQkgICAgICArK2JpdDsKLQkgICAgfQotCSAgbG8gfD0gKGhpICYgKCgodW5zaWduZWQgbG9uZykgMSA8PCBiaXQpIC0gMSkpIDw8ICgzMiAtIGJpdCk7Ci0JICBoaSA+Pj0gYml0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiaXQgPSAzMjsKLQkgIHdoaWxlICgoaGkgJiAxKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaGkgPj49IDE7Ci0JICAgICAgKytiaXQ7Ci0JICAgIH0KLQkgIGxvID0gaGk7Ci0JICBoaSA9IDA7Ci0JfQotCi0gICAgICAvKiBPcHRpbWl6ZSBpZiB0aGUgc2hpZnRlZCB2YWx1ZSBpcyBhIChwb3dlciBvZiAyKSAtIDEuICAqLwotICAgICAgaWYgKChoaSA9PSAwICYmICgobG8gKyAxKSAmIGxvKSA9PSAwKQotCSAgfHwgKGxvID09IDB4ZmZmZmZmZmYgJiYgKChoaSArIDEpICYgaGkpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgc2hpZnQgPSBDT1VOVF9UT1BfWkVST0VTICgodW5zaWduZWQgaW50KSBoaTMyLlhfYWRkX251bWJlcik7Ci0JICBpZiAoc2hpZnQgIT0gMCkKLSAgICAgICAgICAgIHsKLQkgICAgICBleHByZXNzaW9uUyB0bXA7Ci0KLQkgICAgICAvKiBUaGlzIGluc3RydWN0aW9uIHdpbGwgc2V0IHRoZSByZWdpc3RlciB0byBiZSBhbGwKLSAgICAgICAgICAgICAgICAgb25lcy4gICovCi0gICAgICAgICAgICAgIHRtcC5YX29wID0gT19jb25zdGFudDsKLSAgICAgICAgICAgICAgdG1wLlhfYWRkX251bWJlciA9IChvZmZzZXRUKSAtMTsKLSAgICAgICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZ0bXAsICJhZGRpdSIsICJ0LHIsaiIsCi0JCQkgICByZWcsIDAsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgICAgICAgICAgaWYgKGJpdCAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJpdCArPSBzaGlmdDsKLSAgICAgICAgICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgPj0gMzIpID8gImRzbGwzMiIgOiAiZHNsbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImQsdyw8IiwgcmVnLCByZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCA+PSAzMikgPyBiaXQgLSAzMiA6IGJpdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwKLQkJCSAgIChzaGlmdCA+PSAzMikgPyAiZHNybDMyIiA6ICJkc3JsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkLHcsPCIsIHJlZywgcmVnLAotCQkJICAgKHNoaWZ0ID49IDMyKSA/IHNoaWZ0IC0gMzIgOiBzaGlmdCk7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAvKiBTaWduIGV4dGVuZCBoaTMyIGJlZm9yZSBjYWxsaW5nIGxvYWRfcmVnaXN0ZXIsIGJlY2F1c2Ugd2UgY2FuCi0gICAgICAgICBnZW5lcmFsbHkgZ2V0IGJldHRlciBjb2RlIHdoZW4gd2UgbG9hZCBhIHNpZ24gZXh0ZW5kZWQgdmFsdWUuICAqLwotICAgICAgaWYgKChoaTMyLlhfYWRkX251bWJlciAmIDB4ODAwMDAwMDApICE9IDApCi0JaGkzMi5YX2FkZF9udW1iZXIgfD0gfiAob2Zmc2V0VCkgMHhmZmZmZmZmZjsKLSAgICAgIGxvYWRfcmVnaXN0ZXIgKGNvdW50ZXIsIHJlZywgJmhpMzIsIDApOwotICAgICAgZnJlZyA9IHJlZzsKLSAgICB9Ci0gIGlmICgobG8zMi5YX2FkZF9udW1iZXIgJiAweGZmZmYwMDAwKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChmcmVnICE9IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsICJkc2xsMzIiLCAiZCx3LDwiLCByZWcsCi0JCSAgICAgICBmcmVnLCAwKTsKLQkgIGZyZWcgPSByZWc7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25TIG1pZDE2OwotCi0gICAgICBpZiAoKGZyZWcgPT0gMCkgJiYgKGxvMzIuWF9hZGRfbnVtYmVyID09IDB4ZmZmZmZmZmYpKQotICAgICAgICB7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmxvMzIsICJsdWkiLCAidCx1IiwgcmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0hJMTYpOwotICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLCAiZHNybDMyIiwgImQsdyw8IiwgcmVnLAotICAgICAgICAgICAgICAgICAgICAgICByZWcsIDApOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICBpZiAoZnJlZyAhPSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLCAiZHNsbCIsICJkLHcsPCIsIHJlZywKLQkJICAgICAgIGZyZWcsIDE2KTsKLQkgIGZyZWcgPSByZWc7Ci0JfQotICAgICAgbWlkMTYgPSBsbzMyOwotICAgICAgbWlkMTYuWF9hZGRfbnVtYmVyID4+PSAxNjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbWlkMTYsICJvcmkiLCAidCxyLGkiLCByZWcsCi0JCSAgIGZyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLCAiZHNsbCIsICJkLHcsPCIsIHJlZywKLQkJICAgcmVnLCAxNik7Ci0gICAgICBmcmVnID0gcmVnOwotICAgIH0KLSAgaWYgKChsbzMyLlhfYWRkX251bWJlciAmIDB4ZmZmZikgIT0gMCkKLSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmxvMzIsICJvcmkiLCAidCxyLGkiLCByZWcsIGZyZWcsCi0JCSAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci19Ci0KLS8qIExvYWQgYW4gYWRkcmVzcyBpbnRvIGEgcmVnaXN0ZXIuICAqLwotCi1zdGF0aWMgdm9pZAotbG9hZF9hZGRyZXNzIChjb3VudGVyLCByZWcsIGVwKQotICAgICBpbnQgKmNvdW50ZXI7Ci0gICAgIGludCByZWc7Ci0gICAgIGV4cHJlc3Npb25TICplcDsKLXsKLSAgY2hhciAqcDsKLQotICBpZiAoZXAtPlhfb3AgIT0gT19jb25zdGFudAotICAgICAgJiYgZXAtPlhfb3AgIT0gT19zeW1ib2wpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotICAgICAgZXAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLQotICBpZiAoZXAtPlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBsb2FkX3JlZ2lzdGVyIChjb3VudGVyLCByZWcsIGVwLCAwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfcGljID09IE5PX1BJQykKLSAgICB7Ci0gICAgICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgR1AgcmVsYXRpdmUgc3ltYm9sLCB3ZSB3YW50Ci0JICAgYWRkaXUJJHJlZywkZ3AsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgT3RoZXJ3aXNlIHdlIHdhbnQKLQkgICBsdWkJCSRyZWcsPHN5bT4JCShCRkRfUkVMT0NfSEkxNl9TKQotCSAgIGFkZGl1CSRyZWcsJHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19MTzE2KQotCSBJZiB3ZSBoYXZlIGFuIGFkZGVuZCwgd2UgYWx3YXlzIHVzZSB0aGUgbGF0dGVyIGZvcm0uICAqLwotICAgICAgaWYgKCh2YWx1ZVQpIGVwLT5YX2FkZF9udW1iZXIgPj0gTUFYX0dQUkVMX09GRlNFVAotICAgICAgICAgIHx8IG5vcGljX25lZWRfcmVsYXggKGVwLT5YX2FkZF9zeW1ib2wsIDEpKQotCXAgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIGZyYWdfZ3JvdyAoMjApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHJlZywgR1AsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMKTsKLQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDAsCi0JCQlSRUxBWF9FTkNPREUgKDQsIDgsIDAsIDQsIDAsCi0JCQkJICAgICAgbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zKSwKLQkJCWVwLT5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLCAoY2hhciAqKSBOVUxMKTsKLQl9Ci0gICAgICBtYWNyb19idWlsZF9sdWkgKHAsIGNvdW50ZXIsIGVwLCByZWcpOwotICAgICAgaWYgKHAgIT0gTlVMTCkKLQlwICs9IDQ7Ci0gICAgICBtYWNyb19idWlsZCAocCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgInQscixqIiwgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICB9Ci0gIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDICYmICEgbWlwc19iaWdfZ290KQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25TIGV4OwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgIGx3CQkkcmVnLDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgT3RoZXJ3aXNlIHdlIHdhbnQKLQkgICBsdwkJJHJlZyw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgbm9wCi0JICAgYWRkaXUJJHJlZywkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0xPMTYpCi0JIElmIHRoZXJlIGlzIGEgY29uc3RhbnQsIGl0IG11c3QgYmUgYWRkZWQgaW4gYWZ0ZXIuICAqLwotICAgICAgZXguWF9hZGRfbnVtYmVyID0gZXAtPlhfYWRkX251bWJlcjsKLSAgICAgIGVwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZnJhZ19ncm93ICgyMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAidCxvKGIpIiwgcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNCwgMCwKLQkJICAgIFJFTEFYX0VOQ09ERSAoMCwgNCwgLTgsIDAsIDAsIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyksCi0JCSAgICBlcC0+WF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBtYWNyb19idWlsZCAocCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgInQscixqIiwgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGlmIChleC5YX2FkZF9udW1iZXIgIT0gMCkKLQl7Ci0JICBpZiAoZXguWF9hZGRfbnVtYmVyIDwgLTB4ODAwMCB8fCBleC5YX2FkZF9udW1iZXIgPj0gMHg4MDAwKQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGV4Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZleCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgZXg7Ci0gICAgICBpbnQgb2ZmOwotCi0gICAgICAvKiBUaGlzIGlzIHRoZSBsYXJnZSBHT1QgY2FzZS4gIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4KLQkgZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgbHVpCQkkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpCi0JICAgYWRkdQkJJHJlZywkcmVnLCRncAotCSAgIGx3CQkkcmVnLDxzeW0+KCRyZWcpCShCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgT3RoZXJ3aXNlLCBmb3IgYSByZWZlcmVuY2UgdG8gYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQKLQkgICBsdwkJJHJlZyw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgbm9wCi0JICAgYWRkaXUJJHJlZywkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0xPMTYpCi0JIElmIHRoZXJlIGlzIGEgY29uc3RhbnQsIGl0IG11c3QgYmUgYWRkZWQgaW4gYWZ0ZXIuICAqLwotICAgICAgZXguWF9hZGRfbnVtYmVyID0gZXAtPlhfYWRkX251bWJlcjsKLSAgICAgIGVwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgaWYgKHJlZ19uZWVkc19kZWxheSAoR1ApKQotCW9mZiA9IDQ7Ci0gICAgICBlbHNlCi0Jb2ZmID0gMDsKLSAgICAgIGZyYWdfZ3JvdyAoMzIpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLCAibHVpIiwgInQsdSIsIHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAiZCx2LHQiLCByZWcsIHJlZywgR1ApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgInQsbyhiKSIsIHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsIHJlZyk7Ci0gICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiArIG9mZiwgMCwKLQkJICAgIFJFTEFYX0VOQ09ERSAoMTIsIDEyICsgb2ZmLCBvZmYsIDggKyBvZmYsIDAsCi0JCQkJICBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MpLAotCQkgICAgZXAtPlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsIChjaGFyICopIE5VTEwpOwotICAgICAgaWYgKG9mZiA+IDApCi0JewotCSAgLyogV2UgbmVlZCBhIG5vcCBiZWZvcmUgbG9hZGluZyBmcm9tICRncC4gIFRoaXMgc3BlY2lhbAotICAgICAgICAgICAgIGNoZWNrIGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlIGx1aSB3aGljaCBzdGFydHMgdGhlIG1haW4KLSAgICAgICAgICAgICBpbnN0cnVjdGlvbiBzdHJlYW0gZG9lcyBub3QgcmVmZXIgdG8gJGdwLCBhbmQgc28gd2lsbCBub3QKLSAgICAgICAgICAgICBpbnNlcnQgdGhlIG5vcCB3aGljaCBtYXkgYmUgcmVxdWlyZWQuICAqLwotCSAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgcCArPSA0OwotCX0KLSAgICAgIG1hY3JvX2J1aWxkIChwLCBjb3VudGVyLCBlcCwKLQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgPyAibHciIDogImxkIiksCi0JCSAgICJ0LG8oYikiLCByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0gICAgICBwICs9IDQ7Ci0gICAgICBtYWNyb19idWlsZCAocCwgY291bnRlciwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0gICAgICBwICs9IDQ7Ci0gICAgICBtYWNyb19idWlsZCAocCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgInQscixqIiwgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGlmIChleC5YX2FkZF9udW1iZXIgIT0gMCkKLQl7Ci0JICBpZiAoZXguWF9hZGRfbnVtYmVyIDwgLTB4ODAwMCB8fCBleC5YX2FkZF9udW1iZXIgPj0gMHg4MDAwKQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGV4Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZleCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCByZWcsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLSAgICB7Ci0gICAgICAvKiBXZSBhbHdheXMgZG8KLQkgICBhZGRpdQkkcmVnLCRncCw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAqLwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICJ0LHIsaiIsIHJlZywgR1AsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotLyoKLSAqCQkJQnVpbGQgbWFjcm9zCi0gKiAgIFRoaXMgcm91dGluZSBpbXBsZW1lbnRzIHRoZSBzZWVtaW5nbHkgZW5kbGVzcyBtYWNybyBvciBzeW50aGVzaXplZAotICogaW5zdHJ1Y3Rpb25zIGFuZCBhZGRyZXNzaW5nIG1vZGVzIGluIHRoZSBtaXBzIGFzc2VtYmx5IGxhbmd1YWdlLiBNYW55Ci0gKiBvZiB0aGVzZSBtYWNyb3MgYXJlIHNpbXBsZSBhbmQgYXJlIHNpbWlsYXIgdG8gZWFjaCBvdGhlci4gVGhlc2UgY291bGQKLSAqIHByb2JhYmx5IGJlIGhhbmRsZWQgYnkgc29tZSBraW5kIG9mIHRhYmxlIG9yIGdyYW1tZXIgYXByb2FjaCBpbnN0ZWFkIG9mCi0gKiB0aGlzIHZlcmJvc2UgbWV0aG9kLiBPdGhlcnMgYXJlIG5vdCBzaW1wbGUgbWFjcm9zIGJ1dCBhcmUgbW9yZSBsaWtlCi0gKiBvcHRpbWl6aW5nIGNvZGUgZ2VuZXJhdGlvbi4KLSAqICAgT25lIGludGVyZXN0aW5nIG9wdGltaXphdGlvbiBpcyB3aGVuIHNldmVyYWwgc3RvcmUgbWFjcm9zIGFwcGVhcgotICogY29uc2VjdXRpdmx5IHRoYXQgd291bGQgbG9hZCBBVCB3aXRoIHRoZSB1cHBlciBoYWxmIG9mIHRoZSBzYW1lIGFkZHJlc3MuCi0gKiBUaGUgZW5zdWluZyBsb2FkIHVwcGVyIGluc3RydWN0aW9ucyBhcmUgb21taXRlZC4gVGhpcyBpbXBsaWVzIHNvbWUga2luZAotICogb2YgZ2xvYmFsIG9wdGltaXphdGlvbi4gV2UgY3VycmVudGx5IG9ubHkgb3B0aW1pemUgd2l0aGluIGEgc2luZ2xlIG1hY3JvLgotICogICBGb3IgbWFueSBvZiB0aGUgbG9hZCBhbmQgc3RvcmUgbWFjcm9zIGlmIHRoZSBhZGRyZXNzIGlzIHNwZWNpZmllZCBhcyBhCi0gKiBjb25zdGFudCBleHByZXNzaW9uIGluIHRoZSBmaXJzdCA2NGsgb2YgbWVtb3J5IChpZSBsZCAkMiwweDQwMDBjKSB3ZQotICogZmlyc3QgbG9hZCByZWdpc3RlciAnYXQnIHdpdGggemVybyBhbmQgdXNlIGl0IGFzIHRoZSBiYXNlIHJlZ2lzdGVyLiBUaGUKLSAqIG1pcHMgYXNzZW1ibGVyIHNpbXBseSB1c2VzIHJlZ2lzdGVyICR6ZXJvLiBKdXN0IG9uZSB0aW55IG9wdGltaXphdGlvbgotICogd2UncmUgbWlzc2luZy4KLSAqLwotc3RhdGljIHZvaWQKLW1hY3JvIChpcCkKLSAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Ci17Ci0gIHJlZ2lzdGVyIGludCB0cmVnLCBzcmVnLCBkcmVnLCBicmVnOwotICBpbnQgdGVtcHJlZzsKLSAgaW50IG1hc2s7Ci0gIGludCBpY250ID0gMDsKLSAgaW50IHVzZWRfYXQ7Ci0gIGV4cHJlc3Npb25TIGV4cHIxOwotICBjb25zdCBjaGFyICpzOwotICBjb25zdCBjaGFyICpzMjsKLSAgY29uc3QgY2hhciAqZm10OwotICBpbnQgbGlrZWx5ID0gMDsKLSAgaW50IGRibCA9IDA7Ci0gIGludCBjb3Byb2MgPSAwOwotICBpbnQgbHIgPSAwOwotICBpbnQgaW1tID0gMDsKLSAgb2Zmc2V0VCBtYXhudW07Ci0gIGludCBvZmY7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotICBjaGFyICpwOwotICBpbnQgaG9sZF9taXBzX29wdGltaXplOwotCi0gIGFzc2VydCAoISBtaXBzX29wdHMubWlwczE2KTsKLQotICB0cmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxNikgJiAweDFmOwotICBkcmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxMSkgJiAweDFmOwotICBzcmVnID0gYnJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMjEpICYgMHgxZjsKLSAgbWFzayA9IGlwLT5pbnNuX21vLT5tYXNrOwotCi0gIGV4cHIxLlhfb3AgPSBPX2NvbnN0YW50OwotICBleHByMS5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gIGV4cHIxLlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gIGV4cHIxLlhfYWRkX251bWJlciA9IDE7Ci0KLSAgc3dpdGNoIChtYXNrKQotICAgIHsKLSAgICBjYXNlIE1fREFCUzoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX0FCUzoKLSAgICAgIC8qIGJnZXogJGEwLC4rMTIKLQkgbW92ZSB2MCwkYTAKLQkgc3ViIHYwLCR6ZXJvLCRhMAotCSAqLwotCi0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0KLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJnZXoiLCAicyxwIiwgc3JlZyk7Ci0gICAgICBpZiAoZHJlZyA9PSBzcmVnKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiLCAwKTsKLSAgICAgIGVsc2UKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsIGRyZWcsIHNyZWcsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZHN1YiIgOiAic3ViIiwKLQkJICAgImQsdix0IiwgZHJlZywgMCwgc3JlZyk7Ci0KLSAgICAgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9BRERfSToKLSAgICAgIHMgPSAiYWRkaSI7Ci0gICAgICBzMiA9ICJhZGQiOwotICAgICAgZ290byBkb19hZGRpOwotICAgIGNhc2UgTV9BRERVX0k6Ci0gICAgICBzID0gImFkZGl1IjsKLSAgICAgIHMyID0gImFkZHUiOwotICAgICAgZ290byBkb19hZGRpOwotICAgIGNhc2UgTV9EQUREX0k6Ci0gICAgICBkYmwgPSAxOwotICAgICAgcyA9ICJkYWRkaSI7Ci0gICAgICBzMiA9ICJkYWRkIjsKLSAgICAgIGdvdG8gZG9fYWRkaTsKLSAgICBjYXNlIE1fREFERFVfSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBzID0gImRhZGRpdSI7Ci0gICAgICBzMiA9ICJkYWRkdSI7Ci0gICAgZG9fYWRkaToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsIHMsICJ0LHIsaiIsIHRyZWcsIHNyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMyLCAiZCx2LHQiLCB0cmVnLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9BTkRfSToKLSAgICAgIHMgPSAiYW5kaSI7Ci0gICAgICBzMiA9ICJhbmQiOwotICAgICAgZ290byBkb19iaXQ7Ci0gICAgY2FzZSBNX09SX0k6Ci0gICAgICBzID0gIm9yaSI7Ci0gICAgICBzMiA9ICJvciI7Ci0gICAgICBnb3RvIGRvX2JpdDsKLSAgICBjYXNlIE1fTk9SX0k6Ci0gICAgICBzID0gIiI7Ci0gICAgICBzMiA9ICJub3IiOwotICAgICAgZ290byBkb19iaXQ7Ci0gICAgY2FzZSBNX1hPUl9JOgotICAgICAgcyA9ICJ4b3JpIjsKLSAgICAgIHMyID0gInhvciI7Ci0gICAgZG9fYml0OgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4MTAwMDApCi0JewotCSAgaWYgKG1hc2sgIT0gTV9OT1JfSSkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsIHMsICJ0LHIsaSIsIHRyZWcsCi0JCQkgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJvcmkiLCAidCxyLGkiLAotCQkJICAgdHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vciIsICJkLHYsdCIsCi0JCQkgICB0cmVnLCB0cmVnLCAwKTsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgImQsdix0IiwgdHJlZywgc3JlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkVRX0k6Ci0gICAgICBzID0gImJlcSI7Ci0gICAgICBnb3RvIGJlcV9pOwotICAgIGNhc2UgTV9CRVFMX0k6Ci0gICAgICBzID0gImJlcWwiOwotICAgICAgbGlrZWx5ID0gMTsKLSAgICAgIGdvdG8gYmVxX2k7Ci0gICAgY2FzZSBNX0JORV9JOgotICAgICAgcyA9ICJibmUiOwotICAgICAgZ290byBiZXFfaTsKLSAgICBjYXNlIE1fQk5FTF9JOgotICAgICAgcyA9ICJibmVsIjsKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgYmVxX2k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAicyx0LHAiLCBzcmVnLAotCQkgICAgICAgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJzLHQscCIsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHRUw6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CR0U6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJnZXpsIiA6ICJiZ2V6IiwKLQkJICAgICAgICJzLHAiLCBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJsZXpsIiA6ICJibGV6IiwKLQkJICAgICAgICJzLHAiLCB0cmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHQiLCAiZCx2LHQiLCBBVCwgc3JlZywgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHVExfSToKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHVF9JOgotICAgICAgLyogY2hlY2sgZm9yID4gbWF4IGludGVnZXIgKi8KLSAgICAgIG1heG51bSA9IDB4N2ZmZmZmZmY7Ci0gICAgICBpZiAoSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSAmJiBzaXplb2YgKG1heG51bSkgPiA0KQotCXsKLQkgIG1heG51bSA8PD0gMTY7Ci0JICBtYXhudW0gfD0gMHhmZmZmOwotCSAgbWF4bnVtIDw8PSAxNjsKLQkgIG1heG51bSB8PSAweGZmZmY7Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IG1heG51bQotCSAgJiYgKCEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSB8fCBzaXplb2YgKG1heG51bSkgPiA0KSkKLQl7Ci0JZG9fZmFsc2U6Ci0JICAvKiByZXN1bHQgaXMgYWx3YXlzIGZhbHNlICovCi0JICBpZiAoISBsaWtlbHkpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJCcmFuY2ggJXMgaXMgYWx3YXlzIGZhbHNlIChub3ApIiksIGlwLT5pbnNuX21vLT5uYW1lKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIiwgMCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oIkJyYW5jaCBsaWtlbHkgJXMgaXMgYWx3YXlzIGZhbHNlIiksIGlwLT5pbnNuX21vLT5uYW1lKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImJuZWwiLAotCQkJICAgInMsdCxwIiwgMCwgMCk7Ci0JICAgIH0KLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIrKzsKLSAgICAgIC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBNX0JHRV9JOgotICAgIGNhc2UgTV9CR0VMX0k6Ci0gICAgICBpZiAobWFzayA9PSBNX0JHRUxfSSkKLQlsaWtlbHkgPSAxOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ2V6bCIgOiAiYmdleiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMSkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ3R6bCIgOiAiYmd0eiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWF4bnVtID0gMHg3ZmZmZmZmZjsKLSAgICAgIGlmIChJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpICYmIHNpemVvZiAobWF4bnVtKSA+IDQpCi0JewotCSAgbWF4bnVtIDw8PSAxNjsKLQkgIG1heG51bSB8PSAweGZmZmY7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQl9Ci0gICAgICBtYXhudW0gPSAtIG1heG51bSAtIDE7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPD0gbWF4bnVtCi0JICAmJiAoISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpIHx8IHNpemVvZiAobWF4bnVtKSA+IDQpKQotCXsKLQlkb190cnVlOgotCSAgLyogcmVzdWx0IGlzIGFsd2F5cyB0cnVlICovCi0JICBhc193YXJuIChfKCJCcmFuY2ggJXMgaXMgYWx3YXlzIHRydWUiKSwgaXAtPmluc25fbW8tPm5hbWUpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJiIiwgInAiKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBzZXRfYXQgKCZpY250LCBzcmVnLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkdFVUw6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CR0VVOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQlnb3RvIGRvX3RydWU7Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICAgICAicyx0LHAiLCAwLCB0cmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgQVQsIHNyZWcsCi0JCSAgIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CR1RVTF9JOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkdUVV9JOgotICAgICAgaWYgKHNyZWcgPT0gMAotCSAgfHwgKCEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKQotCSAgICAgICYmIGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAweGZmZmZmZmZmKSkKLQlnb3RvIGRvX2ZhbHNlOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKys7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgTV9CR0VVX0k6Ci0gICAgY2FzZSBNX0JHRVVMX0k6Ci0gICAgICBpZiAobWFzayA9PSBNX0JHRVVMX0kpCi0JbGlrZWx5ID0gMTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JZ290byBkb190cnVlOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMSkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAgICAgInMsdCxwIiwgc3JlZywgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc2V0X2F0ICgmaWNudCwgc3JlZywgMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHVEw6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CR1Q6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJndHpsIiA6ICJiZ3R6IiwKLQkJICAgICAgICJzLHAiLCBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJsdHpsIiA6ICJibHR6IiwKLQkJICAgICAgICJzLHAiLCB0cmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHQiLCAiZCx2LHQiLCBBVCwgdHJlZywgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHVFVMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkdUVToKLSAgICAgIGlmICh0cmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKLQkJICAgICAgICJzLHQscCIsIHNyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JZ290byBkb19mYWxzZTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBBVCwgdHJlZywKLQkJICAgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JMRUw6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CTEU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJsZXpsIiA6ICJibGV6IiwKLQkJICAgICAgICJzLHAiLCBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJnZXpsIiA6ICJiZ2V6IiwKLQkJICAgICAgICJzLHAiLCB0cmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHQiLCAiZCx2LHQiLCBBVCwgdHJlZywgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JMRUxfSToKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JMRV9JOgotICAgICAgbWF4bnVtID0gMHg3ZmZmZmZmZjsKLSAgICAgIGlmIChJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpICYmIHNpemVvZiAobWF4bnVtKSA+IDQpCi0JewotCSAgbWF4bnVtIDw8PSAxNjsKLQkgIG1heG51bSB8PSAweGZmZmY7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gbWF4bnVtCi0JICAmJiAoISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpIHx8IHNpemVvZiAobWF4bnVtKSA+IDQpKQotCWdvdG8gZG9fdHJ1ZTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKLSAgICAgIGltbV9leHByLlhfYWRkX251bWJlcisrOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIE1fQkxUX0k6Ci0gICAgY2FzZSBNX0JMVExfSToKLSAgICAgIGlmIChtYXNrID09IE1fQkxUTF9JKQotCWxpa2VseSA9IDE7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJsdHpsIiA6ICJibHR6IiwKLQkJICAgICAgICJzLHAiLCBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAxKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJsZXpsIiA6ICJibGV6IiwKLQkJICAgICAgICJzLHAiLCBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBzZXRfYXQgKCZpY250LCBzcmVnLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKLQkJICAgInMsdCxwIiwgQVQsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkxFVUw6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CTEVVOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAgICAgInMsdCxwIiwgc3JlZywgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQlnb3RvIGRvX3RydWU7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgQVQsIHRyZWcsCi0JCSAgIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTEVVTF9JOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkxFVV9JOgotICAgICAgaWYgKHNyZWcgPT0gMAotCSAgfHwgKCEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKQotCSAgICAgICYmIGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAweGZmZmZmZmZmKSkKLQlnb3RvIGRvX3RydWU7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIrKzsKLSAgICAgIC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBNX0JMVFVfSToKLSAgICBjYXNlIE1fQkxUVUxfSToKLSAgICAgIGlmIChtYXNrID09IE1fQkxUVUxfSSkKLQlsaWtlbHkgPSAxOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQlnb3RvIGRvX2ZhbHNlOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMSkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAgICAgInMsdCxwIiwgc3JlZywgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc2V0X2F0ICgmaWNudCwgc3JlZywgMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JMVEw6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CTFQ6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJsdHpsIiA6ICJibHR6IiwKLQkJICAgICAgICJzLHAiLCBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJndHpsIiA6ICJiZ3R6IiwKLQkJICAgICAgICJzLHAiLCB0cmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHQiLCAiZCx2LHQiLCBBVCwgc3JlZywgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JMVFVMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkxUVToKLSAgICAgIGlmICh0cmVnID09IDApCi0JZ290byBkb19mYWxzZTsKLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKLQkJICAgICAgICJzLHQscCIsIDAsIHRyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBBVCwgc3JlZywKLQkJICAgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RESVZfMzoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX0RJVl8zOgotICAgICAgcyA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2MzsKLSAgICBjYXNlIE1fRFJFTV8zOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fUkVNXzM6Ci0gICAgICBzID0gIm1maGkiOwotICAgIGRvX2RpdjM6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIGFzX3dhcm4gKF8oIkRpdmlkZSBieSB6ZXJvLiIpKTsKLQkgIGlmIChtaXBzX3RyYXApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRlcSIsICJzLHQiLCAwLCAwKTsKLQkgIGVsc2UKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNyk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBpZiAobWlwc190cmFwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRlcSIsICJzLHQiLCB0cmVnLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgICAgIGRibCA/ICJkZGl2IiA6ICJkaXYiLAotCQkgICAgICAgInoscyx0Iiwgc3JlZywgdHJlZyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJuZSIsICJzLHQscCIsIHRyZWcsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICAgICAgZGJsID8gImRkaXYiIDogImRpdiIsCi0JCSAgICAgICAieixzLHQiLCBzcmVnLCB0cmVnKTsKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDcpOwotCX0KLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IC0xOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCSAgIGRibCA/ICJkYWRkaXUiIDogImFkZGl1IiwKLQkJICAgInQscixqIiwgQVQsIDAsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IG1pcHNfdHJhcCA/IChkYmwgPyAxMiA6IDgpIDogKGRibCA/IDIwIDogMTYpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJibmUiLCAicyx0LHAiLCB0cmVnLCBBVCk7Ci0gICAgICBpZiAoZGJsKQotCXsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IDE7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImRhZGRpdSIsICJ0LHIsaiIsIEFULCAwLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiZHNsbDMyIiwgImQsdyw8IiwgQVQsIEFULAotCQkgICAgICAgMzEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSAweDgwMDAwMDAwOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJsdWkiLCAidCx1IiwgQVQsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfSEkxNik7Ci0JfQotICAgICAgaWYgKG1pcHNfdHJhcCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0ZXEiLCAicyx0Iiwgc3JlZywgQVQpOwotCSAgLyogV2Ugd2FudCB0byBjbG9zZSB0aGUgbm9yZW9yZGVyIGJsb2NrIGFzIHNvb24gYXMgcG9zc2libGUsIHNvCi0JICAgICB0aGF0IGxhdGVyIGluc25zIGFyZSBhdmFpbGFibGUgZm9yIGRlbGF5IHNsb3QgZmlsbGluZy4gICovCi0JICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJuZSIsICJzLHQscCIsIHNyZWcsIEFUKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiLCAwKTsKLQotCSAgLyogV2Ugd2FudCB0byBjbG9zZSB0aGUgbm9yZW9yZGVyIGJsb2NrIGFzIHNvb24gYXMgcG9zc2libGUsIHNvCi0JICAgICB0aGF0IGxhdGVyIGluc25zIGFyZSBhdmFpbGFibGUgZm9yIGRlbGF5IHNsb3QgZmlsbGluZy4gICovCi0JICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0KLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDYpOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQiLCBkcmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RJVl8zSToKLSAgICAgIHMgPSAiZGl2IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9ESVZVXzNJOgotICAgICAgcyA9ICJkaXZ1IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9SRU1fM0k6Ci0gICAgICBzID0gImRpdiI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fUkVNVV8zSToKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fRERJVl8zSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBzID0gImRkaXYiOwotICAgICAgczIgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2Rpdmk7Ci0gICAgY2FzZSBNX0RESVZVXzNJOgotICAgICAgZGJsID0gMTsKLSAgICAgIHMgPSAiZGRpdnUiOwotICAgICAgczIgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2Rpdmk7Ci0gICAgY2FzZSBNX0RSRU1fM0k6Ci0gICAgICBkYmwgPSAxOwotICAgICAgcyA9ICJkZGl2IjsKLSAgICAgIHMyID0gIm1maGkiOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9EUkVNVV8zSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1maGkiOwotICAgIGRvX2Rpdmk6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCXsKLQkgIGFzX3dhcm4gKF8oIkRpdmlkZSBieSB6ZXJvLiIpKTsKLQkgIGlmIChtaXBzX3RyYXApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRlcSIsICJzLHQiLCAwLCAwKTsKLQkgIGVsc2UKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMSkKLQl7Ci0JICBpZiAoc3RyY21wIChzMiwgIm1mbG8iKSA9PSAwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsIGRyZWcsCi0JCQkgc3JlZyk7Ci0JICBlbHNlCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1vdmUiLCAiZCxzIiwgZHJlZywgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IC0xCi0JICAmJiBzW3N0cmxlbiAocykgLSAxXSAhPSAndScpCi0JewotCSAgaWYgKHN0cmNtcCAoczIsICJtZmxvIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChkYmwpCi0JCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImRuZWciLCAiZCx3IiwgZHJlZywKLQkJCSAgICAgc3JlZyk7Ci0JICAgICAgZWxzZQotCQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJuZWciLCAiZCx3IiwgZHJlZywKLQkJCSAgICAgc3JlZyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLCBkcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBkYmwpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAieixzLHQiLCBzcmVnLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMyLCAiZCIsIGRyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRElWVV8zOgotICAgICAgcyA9ICJkaXZ1IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZ1MzsKLSAgICBjYXNlIE1fUkVNVV8zOgotICAgICAgcyA9ICJkaXZ1IjsKLSAgICAgIHMyID0gIm1maGkiOwotICAgICAgZ290byBkb19kaXZ1MzsKLSAgICBjYXNlIE1fRERJVlVfMzoKLSAgICAgIHMgPSAiZGRpdnUiOwotICAgICAgczIgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2RpdnUzOwotICAgIGNhc2UgTV9EUkVNVV8zOgotICAgICAgcyA9ICJkZGl2dSI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICBkb19kaXZ1MzoKLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLSAgICAgIGlmIChtaXBzX3RyYXApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidGVxIiwgInMsdCIsIHRyZWcsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAieixzLHQiLCBzcmVnLCB0cmVnKTsKLQkgIC8qIFdlIHdhbnQgdG8gY2xvc2UgdGhlIG5vcmVvcmRlciBibG9jayBhcyBzb29uIGFzIHBvc3NpYmxlLCBzbwotCSAgICAgdGhhdCBsYXRlciBpbnNucyBhcmUgYXZhaWxhYmxlIGZvciBkZWxheSBzbG90IGZpbGxpbmcuICAqLwotCSAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSA4OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJibmUiLCAicyx0LHAiLCB0cmVnLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgInoscyx0Iiwgc3JlZywgdHJlZyk7Ci0KLQkgIC8qIFdlIHdhbnQgdG8gY2xvc2UgdGhlIG5vcmVvcmRlciBibG9jayBhcyBzb29uIGFzIHBvc3NpYmxlLCBzbwotCSAgICAgdGhhdCBsYXRlciBpbnNucyBhcmUgYXZhaWxhYmxlIGZvciBkZWxheSBzbG90IGZpbGxpbmcuICAqLwotCSAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNyk7Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgImQiLCBkcmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9ETEFfQUI6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9MQV9BQjoKLSAgICAgIC8qIExvYWQgdGhlIGFkZHJlc3Mgb2YgYSBzeW1ib2wgaW50byBhIHJlZ2lzdGVyLiAgSWYgYnJlZyBpcyBub3QKLQkgemVybywgd2UgdGhlbiBhZGQgYSBiYXNlIHJlZ2lzdGVyIHRvIGl0LiAgKi8KLQotICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlLCB3ZSBwZXJtaXQgZXhwcmVzc2lvbnMgb2YKLQkgdGhlIGZvcm0KLQkgICBsYQkkNCxmb28tYmFyCi0JIHdoZXJlIGJhciBpcyBhbiBhZGRyZXNzIGluIHRoZSAudGV4dCBzZWN0aW9uLiAgVGhlc2UgYXJlIHVzZWQKLQkgd2hlbiBnZXR0aW5nIHRoZSBhZGRyZXNzZXMgb2YgZnVuY3Rpb25zLiAgV2UgZG9uJ3QgcGVybWl0Ci0JIFhfYWRkX251bWJlciB0byBiZSBub24temVybywgYmVjYXVzZSBpZiB0aGUgc3ltYm9sIGlzCi0JIGV4dGVybmFsIHRoZSByZWxheGluZyBjb2RlIG5lZWRzIHRvIGtub3cgdGhhdCBhbnkgYWRkZW5kIGlzCi0JIHB1cmVseSB0aGUgb2Zmc2V0IHRvIFhfb3Bfc3ltYm9sLiAgKi8KLSAgICAgIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMKLQkgICYmIG9mZnNldF9leHByLlhfb3AgPT0gT19zdWJ0cmFjdAotCSAgJiYgbm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24KLQkgICYmIChzeW1ib2xfY29uc3RhbnRfcCAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wpCi0JICAgICAgPyBTX0dFVF9TRUdNRU5UIChvZmZzZXRfZXhwci5YX29wX3N5bWJvbCkgPT0gdGV4dF9zZWN0aW9uCi0JICAgICAgOiAoc3ltYm9sX2VxdWF0ZWRfcCAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wpCi0JCSAmJiAoU19HRVRfU0VHTUVOVAotCQkgICAgIChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKG9mZnNldF9leHByLlhfb3Bfc3ltYm9sKQotCQkgICAgICAtPlhfYWRkX3N5bWJvbCkKLQkJICAgICA9PSB0ZXh0X3NlY3Rpb24pKSkKLQkgICYmIGJyZWcgPT0gMAotCSAgJiYgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdWkiLCAidCx1IiwKLQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgdHJlZywgdHJlZywgKGludCkgQkZEX1JFTE9DX1BDUkVMX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgIT0gT19zeW1ib2wKLQkgICYmIG9mZnNldF9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQl7Ci0JICBhc19iYWQgKF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICBvZmZzZXRfZXhwci5YX29wID0gT19jb25zdGFudDsKLQl9Ci0KLSAgICAgIGlmICh0cmVnID09IGJyZWcpCi0JewotCSAgdGVtcHJlZyA9IEFUOwotCSAgdXNlZF9hdCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRlbXByZWcgPSB0cmVnOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotCi0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCWxvYWRfcmVnaXN0ZXIgKCZpY250LCB0ZW1wcmVnLCAmb2Zmc2V0X2V4cHIsIGRibCk7Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBHUCByZWxhdGl2ZSBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJGdwLDxzeW0+CShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQkgICAgIElmIHdlIGhhdmUgYSBjb25zdGFudCwgd2UgbmVlZCB0d28gaW5zdHJ1Y3Rpb25zIGFueWhvdywKLQkgICAgIHNvIHdlIG1heSBhcyB3ZWxsIGFsd2F5cyB1c2UgdGhlIGxhdHRlciBmb3JtLiAgKi8KLQkgIGlmICgodmFsdWVUKSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gTUFYX0dQUkVMX09GRlNFVAotCSAgICAgIHx8IG5vcGljX25lZWRfcmVsYXggKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgMSkpCi0JICAgIHAgPSBOVUxMOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnJhZ19ncm93ICgyMCk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgR1AsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMKTsKLQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCAwLAotCQkJICAgIFJFTEFYX0VOQ09ERSAoNCwgOCwgMCwgNCwgMCwKLQkJCQkJICBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MpLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIG1hY3JvX2J1aWxkX2x1aSAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgdGVtcHJlZyk7Ci0JICBpZiAocCAhPSBOVUxMKQotCSAgICBwICs9IDQ7Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQyAmJiAhIG1pcHNfYmlnX2dvdCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIHRoZXJlCi0JICAgICBpcyBubyBjb25zdGFudCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQotCSAgICAgSWYgd2UgaGF2ZSBhIHNtYWxsIGNvbnN0YW50LCBhbmQgdGhpcyBpcyBhIHJlZmVyZW5jZSB0bwotCSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPGNvbnN0YW50PgotCSAgICAgRm9yIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50IHRoZSBzYW1lIGluc3RydWN0aW9uCi0JICAgICBzZXF1ZW5jZSwgYnV0IHdlIG91dHB1dCBhIEJGRF9SRUxPQ19MTzE2IHJlbG9jIG9uIHRoZQotCSAgICAgYWRkaXUgaW5zdHJ1Y3Rpb24uCi0KLQkgICAgIElmIHdlIGhhdmUgYSBsYXJnZSBjb25zdGFudCwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8KLQkgICAgIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbHVpCSRhdCw8aGljb25zdGFudD4KLQkgICAgICAgYWRkaXUJJGF0LCRhdCw8bG9jb25zdGFudD4KLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkYXQKLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudCB0aGUgc2FtZSBpbnN0cnVjdGlvbgotCSAgICAgc2VxdWVuY2UsIGJ1dCB3ZSBvdXRwdXQgYSBCRkRfUkVMT0NfTE8xNiByZWxvYyBvbiB0aGUKLQkgICAgIGFkZGl1IGluc3RydWN0aW9uLiAgKi8KLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IG9mZnNldF9leHByLlhfYWRkX251bWJlcjsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0JICBmcmFnX2dyb3cgKDMyKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgZGJsID8gImxkIiA6ICJsdyIsCi0JCSAgICAgICAidCxvKGIpIiwgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGludCBvZmY7Ci0KLQkgICAgICBpZiAoYnJlZyA9PSAwKQotCQlvZmYgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlJ3JlIGdvaW5nIHRvIHB1dCBpbiBhbiBhZGR1IGluc3RydWN0aW9uIHVzaW5nCi0JCSAgICAgdGVtcHJlZywgc28gd2UgbWF5IGFzIHdlbGwgaW5zZXJ0IHRoZSBub3AgcmlnaHQKLQkJICAgICBub3cuICAqLwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm5vcCIsICIiKTsKLQkJICBvZmYgPSA0OwotCQl9Ci0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCAtIG9mZiwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDAsIDggLSBvZmYsIC00IC0gb2ZmLCA0IC0gb2ZmLCAwLAotCQkJCQkgIChicmVnID09IDAKLQkJCQkJICAgPyBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgOiAwKSksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgICBpZiAoYnJlZyA9PSAwKQotCQl7Ci0JCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkJICBwICs9IDQ7Ci0JCX0KLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIC8qIEZJWE1FOiBJZiBicmVnID09IDAsIGFuZCB0aGUgbmV4dCBpbnN0cnVjdGlvbiB1c2VzCi0JCSAkdGVtcHJlZywgdGhlbiBpZiB0aGlzIHZhcmlhbnQgY2FzZSBpcyB1c2VkIGFuIGV4dHJhCi0JCSBub3Agd2lsbCBiZSBnZW5lcmF0ZWQuICAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChleHByMS5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCQkgICAmJiBleHByMS5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgIm5vcCIsICIiKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgICh2b2lkKSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDAsIDAsCi0JCQkgICAgICAgUkVMQVhfRU5DT0RFICgwLCAwLCAtMTIsIC00LCAwLCAwKSwKLQkJCSAgICAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgICAgIChjaGFyICopIE5VTEwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgb2ZmMTsKLQotCSAgICAgIC8qIElmIHdlIGFyZSBnb2luZyB0byBhZGQgaW4gYSBiYXNlIHJlZ2lzdGVyLCBhbmQgdGhlCi0JCSB0YXJnZXQgcmVnaXN0ZXIgYW5kIHRoZSBiYXNlIHJlZ2lzdGVyIGFyZSB0aGUgc2FtZSwKLQkJIHRoZW4gd2UgYXJlIHVzaW5nIEFUIGFzIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyLiAgU2luY2UKLQkJIHdlIHdhbnQgdG8gbG9hZCB0aGUgY29uc3RhbnQgaW50byBBVCwgd2UgYWRkIG91cgotCQkgY3VycmVudCBBVCAoZnJvbSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSkgYW5kIHRoZQotCQkgcmVnaXN0ZXIgaW50byB0aGUgcmVnaXN0ZXIgbm93LCBhbmQgcHJldGVuZCB3ZSB3ZXJlCi0JCSBub3QgdXNpbmcgYSBiYXNlIHJlZ2lzdGVyLiAgKi8KLQkgICAgICBpZiAoYnJlZyAhPSB0cmVnKQotCQlvZmYxID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICJub3AiLCAiIik7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJCT8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAgICAgImQsdix0IiwgdHJlZywgQVQsIGJyZWcpOwotCQkgIGJyZWcgPSAwOwotCQkgIHRlbXByZWcgPSB0cmVnOwotCQkgIG9mZjEgPSAtODsKLQkJfQotCi0JICAgICAgLyogU2V0IG1pcHNfb3B0aW1pemUgYXJvdW5kIHRoZSBsdWkgaW5zdHJ1Y3Rpb24gdG8gYXZvaWQKLQkJIGluc2VydGluZyBhbiB1bm5lY2Vzc2FyeSBub3AgYWZ0ZXIgdGhlIGx3LiAgKi8KLQkgICAgICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSAyOwotCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgQVQpOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7Ci0KLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgQVQsIEFULCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIEFUKTsKLQkgICAgICAodm9pZCkgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAwLCAwLAotCQkJICAgICAgIFJFTEFYX0VOQ09ERSAoMCwgMCwgLTE2ICsgb2ZmMSwgLTgsIDAsIDApLAotCQkJICAgICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgICAgdXNlZF9hdCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBpbnQgZ3BkZWw7Ci0KLQkgIC8qIFRoaXMgaXMgdGhlIGxhcmdlIEdPVCBjYXNlLiAgSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbgotCSAgICAgZXh0ZXJuYWwgc3ltYm9sLCBhbmQgdGhlcmUgaXMgbm8gY29uc3RhbnQsIHdlIHdhbnQKLQkgICAgICAgbHVpCSR0ZW1wcmVnLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpCi0JICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGdwCi0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCR0ZW1wcmVnKSAoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpCi0JICAgICBGb3IgYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8c3ltPgkoQkZEX1JFTE9DX0xPMTYpCi0KLQkgICAgIElmIHdlIGhhdmUgYSBzbWFsbCBjb25zdGFudCwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8KLQkgICAgIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkZ3AKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJHRlbXByZWcpIChCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxjb25zdGFudD4KLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxjb25zdGFudD4gKEJGRF9SRUxPQ19MTzE2KQotCi0JICAgICBJZiB3ZSBoYXZlIGEgbGFyZ2UgY29uc3RhbnQsIGFuZCB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvCi0JICAgICBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHVpCSR0ZW1wcmVnLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpCi0JICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGdwCi0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCR0ZW1wcmVnKSAoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpCi0JICAgICAgIGx1aQkkYXQsPGhpY29uc3RhbnQ+Ci0JICAgICAgIGFkZGl1CSRhdCwkYXQsPGxvY29uc3RhbnQ+Ci0JICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGF0Ci0JICAgICBGb3IgYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIGx1aQkkYXQsPGhpY29uc3RhbnQ+Ci0JICAgICAgIGFkZGl1CSRhdCwkYXQsPGxvY29uc3RhbnQ+CShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkYXQKLQkgICAgICovCi0JICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCSAgZnJhZ19ncm93ICg1Mik7Ci0JICBpZiAocmVnX25lZWRzX2RlbGF5IChHUCkpCi0JICAgIGdwZGVsID0gNDsKLQkgIGVsc2UKLQkgICAgZ3BkZWwgPSAwOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdWkiLCAidCx1IiwKLQkJICAgICAgIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgR1ApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBkYmwgPyAibGQiIDogImx3IiwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwKLQkJICAgICAgIHRlbXByZWcpOwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA9PSAwKQotCSAgICB7Ci0JICAgICAgaW50IG9mZjsKLQotCSAgICAgIGlmIChicmVnID09IDApCi0JCW9mZiA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2UncmUgZ29pbmcgdG8gcHV0IGluIGFuIGFkZHUgaW5zdHJ1Y3Rpb24gdXNpbmcKLQkJICAgICB0ZW1wcmVnLCBzbyB3ZSBtYXkgYXMgd2VsbCBpbnNlcnQgdGhlIG5vcCByaWdodAotCQkgICAgIG5vdy4gICovCi0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAibm9wIiwgIiIpOwotCQkgIG9mZiA9IDQ7Ci0JCX0KLQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgZ3BkZWwsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgxMiArIG9mZiwgMTIgKyBncGRlbCwgZ3BkZWwsCi0JCQkJCSAgOCArIGdwZGVsLCAwLAotCQkJCQkgIChicmVnID09IDAKLQkJCQkJICAgPyBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgOiAwKSksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkJICAgJiYgZXhwcjEuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICJub3AiLCAiIik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgZ3BkZWwsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgyMCwgMTIgKyBncGRlbCwgZ3BkZWwsIDggKyBncGRlbCwgMCwKLQkJCQkJICAoYnJlZyA9PSAwCi0JCQkJCSAgID8gbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zCi0JCQkJCSAgIDogMCkpLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBhZGosIGRyZWc7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gYWRkIGluIGEgYmFzZSByZWdpc3RlciwgYW5kIHRoZQotCQkgdGFyZ2V0IHJlZ2lzdGVyIGFuZCB0aGUgYmFzZSByZWdpc3RlciBhcmUgdGhlIHNhbWUsCi0JCSB0aGVuIHdlIGFyZSB1c2luZyBBVCBhcyBhIHRlbXBvcmFyeSByZWdpc3Rlci4gIFNpbmNlCi0JCSB3ZSB3YW50IHRvIGxvYWQgdGhlIGNvbnN0YW50IGludG8gQVQsIHdlIGFkZCBvdXIKLQkJIGN1cnJlbnQgQVQgKGZyb20gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUpIGFuZCB0aGUKLQkJIHJlZ2lzdGVyIGludG8gdGhlIHJlZ2lzdGVyIG5vdywgYW5kIHByZXRlbmQgd2Ugd2VyZQotCQkgbm90IHVzaW5nIGEgYmFzZSByZWdpc3Rlci4gICovCi0JICAgICAgaWYgKGJyZWcgIT0gdHJlZykKLQkJewotCQkgIGFkaiA9IDA7Ci0JCSAgZHJlZyA9IHRlbXByZWc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc3NlcnQgKHRlbXByZWcgPT0gQVQpOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm5vcCIsICIiKTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICAgICAiZCx2LHQiLCB0cmVnLCBBVCwgYnJlZyk7Ci0JCSAgZHJlZyA9IHRyZWc7Ci0JCSAgYWRqID0gODsKLQkJfQotCi0JICAgICAgLyogU2V0IG1pcHNfb3B0aW1pemUgYXJvdW5kIHRoZSBsdWkgaW5zdHJ1Y3Rpb24gdG8gYXZvaWQKLQkJIGluc2VydGluZyBhbiB1bm5lY2Vzc2FyeSBub3AgYWZ0ZXIgdGhlIGx3LiAgKi8KLQkgICAgICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSAyOwotCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgQVQpOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7Ci0KLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgQVQsIEFULCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDE2ICsgZ3BkZWwgKyBhZGosIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgyNCArIGFkaiwgMTYgKyBncGRlbCArIGFkaiwgZ3BkZWwsCi0JCQkJCSAgOCArIGdwZGVsLCAwLAotCQkJCQkgIChicmVnID09IDAKLQkJCQkJICAgPyBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgOiAwKSksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQotCSAgICAgIHVzZWRfYXQgPSAxOwotCSAgICB9Ci0KLQkgIGlmIChncGRlbCA+IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyAkZ3AsIGJ1dAotICAgICAgICAgICAgICAgICB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb24gdGhlIG1haW4gc3RyZWFtIGRvZXMgbm90LiAgKi8KLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBkYmwgPyAibGQiIDogImx3IiwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgcCArPSA0OwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JICAgICAgJiYgZXhwcjEuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgICAgICAvKiBGSVhNRTogSWYgYWRkX251bWJlciBpcyAwLCBhbmQgdGhlcmUgd2FzIG5vIGJhc2UKLSAgICAgICAgICAgICAgICAgcmVnaXN0ZXIsIHRoZSBleHRlcm5hbCBzeW1ib2wgY2FzZSBlbmRlZCB3aXRoIGEgbG9hZCwKLSAgICAgICAgICAgICAgICAgc28gaWYgdGhlIHN5bWJvbCB0dXJucyBvdXQgdG8gbm90IGJlIGV4dGVybmFsLCBhbmQKLSAgICAgICAgICAgICAgICAgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gdXNlcyB0ZW1wcmVnLCBhbiB1bm5lY2Vzc2FyeSBub3AKLSAgICAgICAgICAgICAgICAgd2lsbCBiZSBpbnNlcnRlZC4gICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChicmVnID09IHRyZWcpCi0JCXsKLQkJICAvKiBXZSBtdXN0IGFkZCBpbiB0aGUgYmFzZSByZWdpc3RlciBub3csIGFzIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgc3ltYm9sIGNhc2UuICAqLwotCQkgIGFzc2VydCAodGVtcHJlZyA9PSBBVCk7Ci0JCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkJICBwICs9IDQ7Ci0JCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJCT8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAgICAgImQsdix0IiwgdHJlZywgQVQsIGJyZWcpOwotCQkgIHAgKz0gNDsKLQkJICB0ZW1wcmVnID0gdHJlZzsKLQkJICAvKiBXZSBzZXQgYnJlZyB0byAwIGJlY2F1c2Ugd2UgaGF2ZSBhcnJhbmdlZCB0byBhZGQKLSAgICAgICAgICAgICAgICAgICAgIGl0IGluIGluIGJvdGggY2FzZXMuICAqLwotCQkgIGJyZWcgPSAwOwotCQl9Ci0KLQkgICAgICBtYWNyb19idWlsZF9sdWkgKHAsICZpY250LCAmZXhwcjEsIEFUKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIEFULCBBVCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgQVQpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICAvKiBXZSB1c2UKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJGdwLDxzeW0+CShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHRlbXByZWcsIEdQLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoYnJlZyAhPSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgImQsdix0IiwgdHJlZywgdGVtcHJlZywgYnJlZyk7Ci0KLSAgICAgIGlmICghIHVzZWRfYXQpCi0JcmV0dXJuOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9KX0E6Ci0gICAgICAvKiBUaGUgaiBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIHVzZWQgaW4gUElDIGNvZGUsIHNpbmNlIGl0Ci0JIHJlcXVpcmVzIGFuIGFic29sdXRlIGFkZHJlc3MuICBXZSBjb252ZXJ0IGl0IHRvIGEgYgotCSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAiaiIsICJhIik7Ci0gICAgICBlbHNlCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJiIiwgInAiKTsKLSAgICAgIHJldHVybjsKLQotICAgICAgLyogVGhlIGphbCBpbnN0cnVjdGlvbnMgbXVzdCBiZSBoYW5kbGVkIGFzIG1hY3JvcyBiZWNhdXNlIHdoZW4KLQkgZ2VuZXJhdGluZyBQSUMgY29kZSB0aGV5IGV4cGFuZCB0byBtdWx0aS1pbnN0cnVjdGlvbgotCSBzZXF1ZW5jZXMuICBOb3JtYWxseSB0aGV5IGFyZSBzaW1wbGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICBjYXNlIE1fSkFMXzE6Ci0gICAgICBkcmVnID0gUkE7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgTV9KQUxfMjoKLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMKLQkgIHx8IG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAiamFsciIsCi0JCSAgICAgImQscyIsIGRyZWcsIHNyZWcpOwotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgaWYgKHNyZWcgIT0gUElDX0NBTExfUkVHKQotCSAgICBhc193YXJuIChfKCJNSVBTIFBJQyBjYWxsIHRvIHJlZ2lzdGVyIG90aGVyIHRoYW4gJDI1IikpOwotICAgICAgCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAiamFsciIsCi0JCSAgICAgICAiZCxzIiwgZHJlZywgc3JlZyk7Ci0JICBpZiAobWlwc19jcHJlc3RvcmVfb2Zmc2V0IDwgMCkKLQkgICAgYXNfd2FybiAoXygiTm8gLmNwcmVzdG9yZSBwc2V1ZG8tb3AgdXNlZCBpbiBQSUMgY29kZSIpKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IG1pcHNfY3ByZXN0b3JlX29mZnNldDsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAibHciIDogImxkIiksCi0JCQkgICAidCxvKGIpIiwgR1AsIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBtaXBzX2ZyYW1lX3JlZyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9KQUxfQToKLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJqYWwiLCAiYSIpOwotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCB3ZSBhcmUKLQkgICAgIHVzaW5nIGEgc21hbGwgR09ULCB3ZSB3YW50Ci0JICAgICAgIGx3CSQyNSw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfQ0FMTDE2KQotCSAgICAgICBub3AKLQkgICAgICAgamFscgkkMjUKLQkgICAgICAgbm9wCi0JICAgICAgIGx3CSRncCxjcHJlc3RvcmUoJHNwKQotCSAgICAgVGhlIGNwcmVzdG9yZSB2YWx1ZSBpcyBzZXQgdXNpbmcgdGhlIC5jcHJlc3RvcmUKLQkgICAgIHBzZXVkby1vcC4gIElmIHdlIGFyZSB1c2luZyBhIGJpZyBHT1QsIHdlIHdhbnQKLQkgICAgICAgbHVpCSQyNSw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNikKLQkgICAgICAgYWRkdQkkMjUsJDI1LCRncAotCSAgICAgICBsdwkkMjUsPHN5bT4oJDI1KQkJKEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNikKLQkgICAgICAgbm9wCi0JICAgICAgIGphbHIJJDI1Ci0JICAgICAgIG5vcAotCSAgICAgICBsdwkkZ3AsY3ByZXN0b3JlKCRzcCkKLQkgICAgIElmIHRoZSBzeW1ib2wgaXMgbm90IGV4dGVybmFsLCB3ZSB3YW50Ci0JICAgICAgIGx3CSQyNSw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBhZGRpdQkkMjUsJDI1LDxzeW0+CQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICAgIGphbHIJJDI1Ci0JICAgICAgIG5vcAotCSAgICAgICBsdyAkZ3AsY3ByZXN0b3JlKCRzcCkgKi8KLQkgIGZyYWdfZ3JvdyAoNDApOwotCSAgaWYgKCEgbWlwc19iaWdfZ290KQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkJICAgInQsbyhiKSIsIFBJQ19DQUxMX1JFRywKLQkJCSAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0NBTEwxNiwgR1ApOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAibm9wIiwgIiIpOwotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgwLCA0LCAtOCwgMCwgMCwgMCksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IGdwZGVsOwotCi0JICAgICAgaWYgKHJlZ19uZWVkc19kZWxheSAoR1ApKQotCQlncGRlbCA9IDQ7Ci0JICAgICAgZWxzZQotCQlncGRlbCA9IDA7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdWkiLCAidCx1IiwKLQkJCSAgIFBJQ19DQUxMX1JFRywgKGludCkgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2KTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgUElDX0NBTExfUkVHLCBQSUNfQ0FMTF9SRUcsIEdQKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAibHciIDogImxkIiksCi0JCQkgICAidCxvKGIpIiwgUElDX0NBTExfUkVHLAotCQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LCBQSUNfQ0FMTF9SRUcpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAibm9wIiwgIiIpOwotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgZ3BkZWwsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgxNiwgMTIgKyBncGRlbCwgZ3BkZWwsIDggKyBncGRlbCwKLQkJCQkJICAwLCAwKSwKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgIChjaGFyICopIE5VTEwpOwotCSAgICAgIGlmIChncGRlbCA+IDApCi0JCXsKLQkJICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCQkgIHAgKz0gNDsKLQkJfQotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJCSAgICJ0LG8oYikiLCBQSUNfQ0FMTF9SRUcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgICAgIHAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQkJCSAgIAotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCBQSUNfQ0FMTF9SRUcsIFBJQ19DQUxMX1JFRywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgICAiamFsciIsICJzIiwgUElDX0NBTExfUkVHKTsKLQkgIGlmIChtaXBzX2NwcmVzdG9yZV9vZmZzZXQgPCAwKQotCSAgICBhc193YXJuIChfKCJObyAuY3ByZXN0b3JlIHBzZXVkby1vcCB1c2VkIGluIFBJQyBjb2RlIikpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG1pcHNfb3B0cy5ub3Jlb3JkZXIpCi0JCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICJub3AiLCAiIik7Ci0JICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gbWlwc19jcHJlc3RvcmVfb2Zmc2V0OwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJCSAgICJ0LG8oYikiLCBHUCwgKGludCkgQkZEX1JFTE9DX0xPMTYsCi0JCQkgICBtaXBzX2ZyYW1lX3JlZyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJiYWwiLCAicCIpOwotCSAgLyogVGhlIGxpbmtlciBtYXkgZXhwYW5kIHRoZSBjYWxsIHRvIGEgbG9uZ2VyIHNlcXVlbmNlIHdoaWNoCi0JICAgICB1c2VzICRhdCwgc28gd2UgbXVzdCBicmVhayByYXRoZXIgdGhhbiByZXR1cm4uICAqLwotCSAgYnJlYWs7Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fTEJfQUI6Ci0gICAgICBzID0gImxiIjsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xCVV9BQjoKLSAgICAgIHMgPSAibGJ1IjsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xIX0FCOgotICAgICAgcyA9ICJsaCI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MSFVfQUI6Ci0gICAgICBzID0gImxodSI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV19BQjoKLSAgICAgIHMgPSAibHciOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdDMF9BQjoKLSAgICAgIHMgPSAibHdjMCI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdDMV9BQjoKLSAgICAgIHMgPSAibHdjMSI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdDMl9BQjoKLSAgICAgIHMgPSAibHdjMiI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdDM19BQjoKLSAgICAgIHMgPSAibHdjMyI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdMX0FCOgotICAgICAgcyA9ICJsd2wiOwotICAgICAgbHIgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdSX0FCOgotICAgICAgcyA9ICJsd3IiOwotICAgICAgbHIgPSAxOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTERDMV9BQjoKLSAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQotCXsKLQkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgcyA9ICJsZGMxIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MREMyX0FCOgotICAgICAgcyA9ICJsZGMyIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MREMzX0FCOgotICAgICAgcyA9ICJsZGMzIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MRExfQUI6Ci0gICAgICBzID0gImxkbCI7Ci0gICAgICBsciA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MRFJfQUI6Ci0gICAgICBzID0gImxkciI7Ci0gICAgICBsciA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MTF9BQjoKLSAgICAgIHMgPSAibGwiOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTExEX0FCOgotICAgICAgcyA9ICJsbGQiOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTFdVX0FCOgotICAgICAgcyA9ICJsd3UiOwotICAgIGxkOgotICAgICAgaWYgKGJyZWcgPT0gdHJlZyB8fCBjb3Byb2MgfHwgbHIpCi0JewotCSAgdGVtcHJlZyA9IEFUOwotCSAgdXNlZF9hdCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRlbXByZWcgPSB0cmVnOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotICAgICAgZ290byBsZF9zdDsKLSAgICBjYXNlIE1fU0JfQUI6Ci0gICAgICBzID0gInNiIjsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NIX0FCOgotICAgICAgcyA9ICJzaCI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV19BQjoKLSAgICAgIHMgPSAic3ciOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU1dDMF9BQjoKLSAgICAgIHMgPSAic3djMCI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU1dDMV9BQjoKLSAgICAgIHMgPSAic3djMSI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU1dDMl9BQjoKLSAgICAgIHMgPSAic3djMiI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU1dDM19BQjoKLSAgICAgIHMgPSAic3djMyI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU1dMX0FCOgotICAgICAgcyA9ICJzd2wiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU1dSX0FCOgotICAgICAgcyA9ICJzd3IiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0NfQUI6Ci0gICAgICBzID0gInNjIjsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NDRF9BQjoKLSAgICAgIHMgPSAic2NkIjsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NEQzFfQUI6Ci0gICAgICBpZiAobWlwc19jcHUgPT0gNDY1MCkKLQl7Ci0JICBhc19iYWQgKF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHMgPSAic2RjMSI7Ci0gICAgICBjb3Byb2MgPSAxOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0RDMl9BQjoKLSAgICAgIHMgPSAic2RjMiI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0RDM19BQjoKLSAgICAgIHMgPSAic2RjMyI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0RMX0FCOgotICAgICAgcyA9ICJzZGwiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0RSX0FCOgotICAgICAgcyA9ICJzZHIiOwotICAgIHN0OgotICAgICAgdGVtcHJlZyA9IEFUOwotICAgICAgdXNlZF9hdCA9IDE7Ci0gICAgbGRfc3Q6Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBpZiAobWFzayA9PSBNX0xXQzFfQUIKLQkgIHx8IG1hc2sgPT0gTV9TV0MxX0FCCi0JICB8fCBtYXNrID09IE1fTERDMV9BQgotCSAgfHwgbWFzayA9PSBNX1NEQzFfQUIKLQkgIHx8IG1hc2sgPT0gTV9MX0RBQgotCSAgfHwgbWFzayA9PSBNX1NfREFCKQotCWZtdCA9ICJULG8oYikiOwotICAgICAgZWxzZSBpZiAoY29wcm9jKQotCWZtdCA9ICJFLG8oYikiOwotICAgICAgZWxzZQotCWZtdCA9ICJ0LG8oYikiOwotCi0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50Ci0JICAmJiBvZmZzZXRfZXhwci5YX29wICE9IE9fc3ltYm9sKQotCXsKLQkgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgIG9mZnNldF9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCX0KLQotICAgICAgLyogQSBjb25zdGFudCBleHByZXNzaW9uIGluIFBJQyBjb2RlIGNhbiBiZSBoYW5kbGVkIGp1c3QgYXMgaXQKLQkgaXMgaW4gbm9uIFBJQyBjb2RlLiAgKi8KLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMKLQkgIHx8IG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgR1AgcmVsYXRpdmUgc3ltYm9sLCBhbmQgdGhlcmUKLQkgICAgIGlzIG5vIGJhc2UgcmVnaXN0ZXIsIHdlIHdhbnQKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3Rlciwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfSEkxNl9TKQotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCR0ZW1wcmVnKQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB3ZSBoYXZlIGEgY29uc3RhbnQsIHdlIG5lZWQgdHdvIGluc3RydWN0aW9ucyBhbnlob3csCi0JICAgICBzbyB3ZSBhbHdheXMgdXNlIHRoZSBsYXR0ZXIgZm9ybS4KLQotCSAgICAgSWYgd2UgaGF2ZSBhIGJhc2UgcmVnaXN0ZXIsIGFuZCB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEKLQkgICAgIEdQIHJlbGF0aXZlIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCRicmVnLCRncAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCR0ZW1wcmVnKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfSEkxNl9TKQotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRicmVnCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJHRlbXByZWcpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgIFdpdGggYSBjb25zdGFudCB3ZSBhbHdheXMgdXNlIHRoZSBsYXR0ZXIgY2FzZS4gICovCi0JICBpZiAoYnJlZyA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCh2YWx1ZVQpIG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSBNQVhfR1BSRUxfT0ZGU0VUCi0JCSAgfHwgbm9waWNfbmVlZF9yZWxheCAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAxKSkKLQkJcCA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZnJhZ19ncm93ICgyMCk7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgR1ApOwotCQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDAsCi0JCQkJUkVMQVhfRU5DT0RFICg0LCA4LCAwLCA0LCAwLAotCQkJCQkgICAgICAobWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zCi0JCQkJCSAgICAgICB8fCAodXNlZF9hdAotCQkJCQkJICAgJiYgbWlwc19vcHRzLm5vYXQpKSksCi0JCQkJb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCQkoY2hhciAqKSBOVUxMKTsKLQkJICB1c2VkX2F0ID0gMDsKLQkJfQotCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgdGVtcHJlZyk7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCkKLQkJcCArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsIHRyZWcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgdGVtcHJlZyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICgodmFsdWVUKSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gTUFYX0dQUkVMX09GRlNFVAotCQkgIHx8IG5vcGljX25lZWRfcmVsYXggKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgMSkpCi0JCXAgPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGZyYWdfZ3JvdyAoMjgpOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgICAgICJkLHYsdCIsIHRlbXByZWcsIGJyZWcsIEdQKTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQkJICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiwgMCwKLQkJCQlSRUxBWF9FTkNPREUgKDgsIDEyLCAwLCA4LCAwLCAwKSwKLQkJCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJCShjaGFyICopIE5VTEwpOwotCQl9Ci0JICAgICAgbWFjcm9fYnVpbGRfbHVpIChwLCAmaWNudCwgJm9mZnNldF9leHByLCB0ZW1wcmVnKTsKLQkgICAgICBpZiAocCAhPSBOVUxMKQotCQlwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIGJyZWcpOwotCSAgICAgIGlmIChwICE9IE5VTEwpCi0JCXAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LCB0cmVnLAotCQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIHRlbXByZWcpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMgJiYgISBtaXBzX2JpZ19nb3QpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDAoJHRlbXByZWcpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZywwKCR0ZW1wcmVnKQotCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyLCB3ZSBhZGQgaXQgdG8gJHRlbXByZWcgYmVmb3JlCi0JICAgICB0aGUgPG9wPi4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQsIHdlIHN0aWNrIGl0IGluIHRoZQotCSAgICAgPG9wPiBpbnN0cnVjdGlvbi4gIFdlIGRvbid0IGhhbmRsZSBjb25zdGFudHMgbGFyZ2VyIHRoYW4KLQkgICAgIDE2IGJpdHMsIGJlY2F1c2Ugd2UgaGF2ZSBubyB3YXkgdG8gbG9hZCB0aGUgdXBwZXIgMTYgYml0cwotCSAgICAgKGFjdHVhbGx5LCB3ZSBjb3VsZCBoYW5kbGUgdGhlbSBmb3IgdGhlIHN1YnNldCBvZiBjYXNlcwotCSAgICAgaW4gd2hpY2ggd2UgYXJlIG5vdCB1c2luZyAkYXQpLiAgKi8KLQkgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA8IC0weDgwMDAKLQkgICAgICB8fCBleHByMS5YX2FkZF9udW1iZXIgPj0gMHg4MDAwKQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGZyYWdfZ3JvdyAoMjApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAibHciIDogImxkIiksCi0JCSAgICAgICAidCxvKGIpIiwgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA0LCAwLCAKLQkJCVJFTEFYX0VOQ09ERSAoMCwgNCwgLTgsIDAsIDAsIDApLAotCQkJb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCShjaGFyICopIE5VTEwpOwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgaWYgKGJyZWcgIT0gMCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBicmVnKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsIHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgdGVtcHJlZyk7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgaW50IGdwZGVsOwotCi0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkZ3AKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJHRlbXByZWcpIChCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZywwKCR0ZW1wcmVnKQotCSAgICAgT3RoZXJ3aXNlIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8c3ltPgkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICAgIDxvcD4JJHRyZWcsMCgkdGVtcHJlZykKLQkgICAgIElmIHRoZXJlIGlzIGEgYmFzZSByZWdpc3Rlciwgd2UgYWRkIGl0IHRvICR0ZW1wcmVnIGJlZm9yZQotCSAgICAgdGhlIDxvcD4uICBJZiB0aGVyZSBpcyBhIGNvbnN0YW50LCB3ZSBzdGljayBpdCBpbiB0aGUKLQkgICAgIDxvcD4gaW5zdHJ1Y3Rpb24uICBXZSBkb24ndCBoYW5kbGUgY29uc3RhbnRzIGxhcmdlciB0aGFuCi0JICAgICAxNiBiaXRzLCBiZWNhdXNlIHdlIGhhdmUgbm8gd2F5IHRvIGxvYWQgdGhlIHVwcGVyIDE2IGJpdHMKLQkgICAgIChhY3R1YWxseSwgd2UgY291bGQgaGFuZGxlIHRoZW0gZm9yIHRoZSBzdWJzZXQgb2YgY2FzZXMKLQkgICAgIGluIHdoaWNoIHdlIGFyZSBub3QgdXNpbmcgJGF0KS4gICovCi0JICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19zeW1ib2wpOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPCAtMHg4MDAwCi0JICAgICAgfHwgZXhwcjEuWF9hZGRfbnVtYmVyID49IDB4ODAwMCkKLQkgICAgYXNfYmFkIChfKCJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiKSk7Ci0JICBpZiAocmVnX25lZWRzX2RlbGF5IChHUCkpCi0JICAgIGdwZGVsID0gNDsKLQkgIGVsc2UKLQkgICAgZ3BkZWwgPSAwOwotCSAgZnJhZ19ncm93ICgzNik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx1aSIsICJ0LHUiLAotCQkgICAgICAgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgR1ApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAibHciIDogImxkIiksCi0JCSAgICAgICAidCxvKGIpIiwgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsCi0JCSAgICAgICB0ZW1wcmVnKTsKLQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgZ3BkZWwsIDAsCi0JCQlSRUxBWF9FTkNPREUgKDEyLCAxMiArIGdwZGVsLCBncGRlbCwgOCArIGdwZGVsLCAwLCAwKSwKLQkJCW9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsIChjaGFyICopIE5VTEwpOwotCSAgaWYgKGdwZGVsID4gMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICAgICAgcCArPSA0OwotCSAgICB9Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgcCArPSA0OwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIHAgKz0gNDsKLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIGlmIChicmVnICE9IDApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgYnJlZyk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgZm10LCB0cmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIHRlbXByZWcpOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICAvKiBJZiB0aGVyZSBpcyBubyBiYXNlIHJlZ2lzdGVyLCB3ZSB3YW50Ci0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIsIHdlIHdhbnQKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkYnJlZywkZ3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkdGVtcHJlZykJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgKi8KLQkgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JICBpZiAoYnJlZyA9PSAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBHUCk7Ci0JICAgICAgdXNlZF9hdCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCB0ZW1wcmVnLCBicmVnLCBHUCk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKCEgdXNlZF9hdCkKLQlyZXR1cm47Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0xJOgotICAgIGNhc2UgTV9MSV9TOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIHRyZWcsICZpbW1fZXhwciwgMCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRExJOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIHRyZWcsICZpbW1fZXhwciwgMSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fTElfU1M6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgICAibXRjMSIsICJ0LEciLCBBVCwgdHJlZyk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fc3ltYm9sCi0JCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQKLQkJCQkJICAgKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCkpLAotCQkJICAgICAiLmxpdDQiKSA9PSAwCi0JCSAgJiYgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID09IDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsd2MxIiwgIlQsbyhiKSIsCi0JCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMLCBHUCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgY2FzZSBNX0xJX0Q6Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGEgY29uc3RhbnQgaW4gSU1NX0VYUFIsIHRoZW4gaW4gbWlwczMgbW9kZSBpdCBpcwotICAgICAgICAgdGhlIGVudGlyZSB2YWx1ZSwgYW5kIGluIG1pcHMxIG1vZGUgaXQgaXMgdGhlIGhpZ2ggb3JkZXIgMzIKLSAgICAgICAgIGJpdHMgb2YgdGhlIHZhbHVlIGFuZCB0aGUgbG93IG9yZGVyIDMyIGJpdHMgYXJlIGVpdGhlciB6ZXJvCi0gICAgICAgICBvciBpbiBvZmZzZXRfZXhwci4gICovCi0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50IHx8IGltbV9leHByLlhfb3AgPT0gT19iaWcpCi0JewotCSAgaWYgKElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCB0cmVnLCAmaW1tX2V4cHIsIDEpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IGhyZWcsIGxyZWc7Ci0KLQkgICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JCXsKLQkJICBocmVnID0gdHJlZzsKLQkJICBscmVnID0gdHJlZyArIDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBocmVnID0gdHJlZyArIDE7Ci0JCSAgbHJlZyA9IHRyZWc7Ci0JCX0KLQotCSAgICAgIGlmIChocmVnIDw9IDMxKQotCQlsb2FkX3JlZ2lzdGVyICgmaWNudCwgaHJlZywgJmltbV9leHByLCAwKTsKLQkgICAgICBpZiAobHJlZyA8PSAzMSkKLQkJewotCQkgIGlmIChvZmZzZXRfZXhwci5YX29wID09IE9fYWJzZW50KQotCQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLAotCQkJCSBscmVnLCAwKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KTsKLQkJICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIGxyZWcsICZvZmZzZXRfZXhwciwgMCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLQotICAgICAgLyogV2Uga25vdyB0aGF0IHN5bSBpcyBpbiB0aGUgLnJkYXRhIHNlY3Rpb24uICBGaXJzdCB3ZSBnZXQgdGhlCi0JIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGFkZHJlc3MuICAqLwotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQykKLQl7Ci0JICAvKiBGSVhNRTogVGhpcyB3b24ndCB3b3JrIGZvciBhIDY0IGJpdCBhZGRyZXNzLiAgKi8KLQkgIG1hY3JvX2J1aWxkX2x1aSAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgQVQpOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICAvKiBGb3IgZW1iZWRkZWQgUElDIHdlIHBpY2sgdXAgdGhlIGVudGlyZSBhZGRyZXNzIG9mZiAkZ3AgaW4KLQkgICAgIGEgc2luZ2xlIGluc3RydWN0aW9uLiAgKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIEFULCBHUCwgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwpOwotCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQkKLSAgICAgIC8qIE5vdyB3ZSBsb2FkIHRoZSByZWdpc3RlcihzKS4gICovCi0gICAgICBpZiAoSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImxkIiwgInQsbyhiKSIsCi0JCSAgICAgdHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3IiwgInQsbyhiKSIsCi0JCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgaWYgKHRyZWcgIT0gMzEpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogSG93IGluIHRoZSB3b3JsZCBkbyB3ZSBkZWFsIHdpdGggdGhlIHBvc3NpYmxlCi0JCSBvdmVyZmxvdyBoZXJlPyAgKi8KLQkgICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3IiwgInQsbyhiKSIsCi0JCQkgICB0cmVnICsgMSwgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogVG8gYXZvaWQgY29uZnVzaW9uIGluIHRjX2dlbl9yZWxvYywgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGlzCi0JIGRvZXMgbm90IGJlY29tZSBhIHZhcmlhbnQgZnJhZy4gICovCi0gICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgICAgIGZyYWdfbmV3ICgwKTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fTElfREQ6Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGEgY29uc3RhbnQgaW4gSU1NX0VYUFIsIHRoZW4gaW4gbWlwczMgbW9kZSBpdCBpcwotICAgICAgICAgdGhlIGVudGlyZSB2YWx1ZSwgYW5kIGluIG1pcHMxIG1vZGUgaXQgaXMgdGhlIGhpZ2ggb3JkZXIgMzIKLSAgICAgICAgIGJpdHMgb2YgdGhlIHZhbHVlIGFuZCB0aGUgbG93IG9yZGVyIDMyIGJpdHMgYXJlIGVpdGhlciB6ZXJvCi0gICAgICAgICBvciBpbiBvZmZzZXRfZXhwci4gICovCi0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50IHx8IGltbV9leHByLlhfb3AgPT0gT19iaWcpCi0JewotCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpOwotCSAgaWYgKElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgImRtdGMxIiwgInQsUyIsIEFULCB0cmVnKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAibXRjMSIsICJ0LEciLCBBVCwgdHJlZyArIDEpOwotCSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wID09IE9fYWJzZW50KQotCQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAibXRjMSIsICJ0LEciLCAwLCB0cmVnKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCk7Ci0JCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmb2Zmc2V0X2V4cHIsIDApOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm10YzEiLCAidCxHIiwgQVQsIHRyZWcpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fc3ltYm9sCi0JICAgICAgJiYgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID09IDApOwotICAgICAgcyA9IHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sKSk7Ci0gICAgICBpZiAoc3RyY21wIChzLCAiLmxpdDgiKSA9PSAwKQotCXsKLQkgIGlmIChtaXBzX29wdHMuaXNhICE9IDEpCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImxkYzEiLAotCQkJICAgIlQsbyhiKSIsIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIEdQKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGJyZWcgPSBHUDsKLQkgIHIgPSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMOwotCSAgZ290byBkb2I7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzc2VydCAoc3RyY21wIChzLCBSREFUQV9TRUNUSU9OX05BTUUpID09IDApOwotCSAgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgPyAibHciIDogImxkIiksCi0JCQkgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFRoaXMgd29uJ3Qgd29yayBmb3IgYSA2NCBiaXQgYWRkcmVzcy4gICovCi0JICAgICAgbWFjcm9fYnVpbGRfbHVpICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBBVCk7Ci0JICAgIH0KLQkgICAgICAKLQkgIGlmIChtaXBzX29wdHMuaXNhICE9IDEpCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImxkYzEiLAotCQkJICAgIlQsbyhiKSIsIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0KLQkgICAgICAvKiBUbyBhdm9pZCBjb25mdXNpb24gaW4gdGNfZ2VuX3JlbG9jLCB3ZSBtdXN0IGVuc3VyZQotCQkgdGhhdCB0aGlzIGRvZXMgbm90IGJlY29tZSBhIHZhcmlhbnQgZnJhZy4gICovCi0JICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0JICAgICAgZnJhZ19uZXcgKDApOwotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWcgPSBBVDsKLQkgIHIgPSBCRkRfUkVMT0NfTE8xNjsKLQkgIGdvdG8gZG9iOwotCX0KLQotICAgIGNhc2UgTV9MX0RPQjoKLSAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQotCXsKLQkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgLyogRXZlbiBvbiBhIGJpZyBlbmRpYW4gbWFjaGluZSAkZm4gY29tZXMgYmVmb3JlICRmbisxLiAgV2UgaGF2ZQotCSB0byBhZGp1c3Qgd2hlbiBsb2FkaW5nIGZyb20gbWVtb3J5LiAgKi8KLSAgICAgIHIgPSBCRkRfUkVMT0NfTE8xNjsKLSAgICBkb2I6Ci0gICAgICBhc3NlcnQgKG1pcHNfb3B0cy5pc2EgPT0gMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3YzEiLCAiVCxvKGIpIiwKLQkJICAgdGFyZ2V0X2JpZ19lbmRpYW4gPyB0cmVnICsgMSA6IHRyZWcsCi0JCSAgIChpbnQpIHIsIGJyZWcpOwotICAgICAgLyogRklYTUU6IEEgcG9zc2libGUgb3ZlcmZsb3cgd2hpY2ggSSBkb24ndCBrbm93IGhvdyB0byBkZWFsCi0JIHdpdGguICAqLwotICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3YzEiLCAiVCxvKGIpIiwKLQkJICAgdGFyZ2V0X2JpZ19lbmRpYW4gPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgIChpbnQpIHIsIGJyZWcpOwotCi0gICAgICAvKiBUbyBhdm9pZCBjb25mdXNpb24gaW4gdGNfZ2VuX3JlbG9jLCB3ZSBtdXN0IGVuc3VyZSB0aGF0IHRoaXMKLQkgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLiAgKi8KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19uZXcgKDApOwotCi0gICAgICBpZiAoYnJlZyAhPSBBVCkKLQlyZXR1cm47Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9MX0RBQjoKLSAgICAgIC8qCi0gICAgICAgKiBUaGUgTUlQUyBhc3NlbWJsZXIgc2VlbXMgdG8gY2hlY2sgZm9yIFhfYWRkX251bWJlciBub3QKLSAgICAgICAqIGJlaW5nIGRvdWJsZSBhbGlnbmVkIGFuZCBnZW5lcmF0aW5nOgotICAgICAgICoJbHVpCWF0LCVoaShmb28rMSkKLSAgICAgICAqCWFkZHUJYXQsYXQsdjEKLSAgICAgICAqCWFkZGl1CWF0LGF0LCVsbyhmb28rMSkKLSAgICAgICAqCWx3YzEJZjIsMChhdCkKLSAgICAgICAqCWx3YzEJZjMsNChhdCkKLSAgICAgICAqIEJ1dCwgdGhlIHJlc3VsdGluZyBhZGRyZXNzIGlzIHRoZSBzYW1lIGFmdGVyIHJlbG9jYXRpb24gc28gd2h5Ci0gICAgICAgKiBnZW5lcmF0ZSB0aGUgZXh0cmEgaW5zdHJ1Y3Rpb24/Ci0gICAgICAgKi8KLSAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQotCXsKLQkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGlmIChtaXBzX29wdHMuaXNhICE9IDEpCi0JewotCSAgcyA9ICJsZGMxIjsKLQkgIGdvdG8gbGQ7Ci0JfQotCi0gICAgICBzID0gImx3YzEiOwotICAgICAgZm10ID0gIlQsbyhiKSI7Ci0gICAgICBnb3RvIGxkZF9zdGQ7Ci0KLSAgICBjYXNlIE1fU19EQUI6Ci0gICAgICBpZiAobWlwc19jcHUgPT0gNDY1MCkKLQl7Ci0JICBhc19iYWQgKF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIikpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgIT0gMSkKLQl7Ci0JICBzID0gInNkYzEiOwotCSAgZ290byBzdDsKLQl9Ci0KLSAgICAgIHMgPSAic3djMSI7Ci0gICAgICBmbXQgPSAiVCxvKGIpIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkZF9zdGQ7Ci0KLSAgICBjYXNlIE1fTERfQUI6Ci0gICAgICBpZiAoSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQl7Ci0JICBzID0gImxkIjsKLQkgIGdvdG8gbGQ7Ci0JfQotCi0gICAgICBzID0gImx3IjsKLSAgICAgIGZtdCA9ICJ0LG8oYikiOwotICAgICAgZ290byBsZGRfc3RkOwotCi0gICAgY2FzZSBNX1NEX0FCOgotICAgICAgaWYgKElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JewotCSAgcyA9ICJzZCI7Ci0JICBnb3RvIHN0OwotCX0KLQotICAgICAgcyA9ICJzdyI7Ci0gICAgICBmbXQgPSAidCxvKGIpIjsKLQotICAgIGxkZF9zdGQ6Ci0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX3N5bWJvbAotCSAgJiYgb2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCXsKLQkgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgIG9mZnNldF9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCX0KLQotICAgICAgLyogRXZlbiBvbiBhIGJpZyBlbmRpYW4gbWFjaGluZSAkZm4gY29tZXMgYmVmb3JlICRmbisxLiAgV2UgaGF2ZQotCSB0byBhZGp1c3Qgd2hlbiBsb2FkaW5nIGZyb20gbWVtb3J5LiAgV2Ugc2V0IGNvcHJvYyBpZiB3ZSBtdXN0Ci0JIGxvYWQgJGZuKzEgZmlyc3QuICAqLwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JY29wcm9jID0gMDsKLQotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQwotCSAgfHwgb2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBHUCByZWxhdGl2ZSBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBJZiB3ZSBoYXZlIGEgYmFzZSByZWdpc3Rlciwgd2UgdXNlIHRoaXMKLQkgICAgICAgYWRkdQkkYXQsJGJyZWcsJGdwCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGF0KQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRhdCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgSWYgdGhpcyBpcyBub3QgYSBHUCByZWxhdGl2ZSBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHVpCSRhdCw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRhdCkJKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyLCB3ZSBhZGQgaXQgdG8gJGF0IGFmdGVyIHRoZQotCSAgICAgbHVpIGluc3RydWN0aW9uLiAgSWYgdGhlcmUgaXMgYSBjb25zdGFudCwgd2UgYWx3YXlzIHVzZQotCSAgICAgdGhlIGxhc3QgY2FzZS4gICovCi0JICBpZiAoKHZhbHVlVCkgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IE1BWF9HUFJFTF9PRkZTRVQKLQkgICAgICB8fCBub3BpY19uZWVkX3JlbGF4IChvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIDEpKQotCSAgICB7Ci0JICAgICAgcCA9IE5VTEw7Ci0JICAgICAgdXNlZF9hdCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBvZmY7Ci0KLQkgICAgICBpZiAoYnJlZyA9PSAwKQotCQl7Ci0JCSAgZnJhZ19ncm93ICgyOCk7Ci0JCSAgdGVtcHJlZyA9IEdQOwotCQkgIG9mZiA9IDA7Ci0JCSAgdXNlZF9hdCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmcmFnX2dyb3cgKDM2KTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICAgICAiZCx2LHQiLCBBVCwgYnJlZywgR1ApOwotCQkgIHRlbXByZWcgPSBBVDsKLQkJICBvZmYgPSA0OwotCQkgIHVzZWRfYXQgPSAxOwotCQl9Ci0KLSAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCQkgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgdGVtcHJlZyk7Ci0JICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0KLQkgICAgICAvKiBTZXQgbWlwc19vcHRpbWl6ZSB0byAyIHRvIGF2b2lkIGluc2VydGluZyBhbgotICAgICAgICAgICAgICAgICB1bmRlc2lyZWQgbm9wLiAgKi8KLQkgICAgICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgICAgIG1pcHNfb3B0aW1pemUgPSAyOwotICAgICAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJCSAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQkgICAgICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCi0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBvZmYsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICg4ICsgb2ZmLCAxMiArIG9mZiwgMCwgNCArIG9mZiwgMSwKLQkJCQkJICB1c2VkX2F0ICYmIG1pcHNfb3B0cy5ub2F0KSwKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgIChjaGFyICopIE5VTEwpOwotCi0JICAgICAgLyogV2UganVzdCBnZW5lcmF0ZWQgdHdvIHJlbG9jcy4gIFdoZW4gdGNfZ2VuX3JlbG9jCi0JCSBoYW5kbGVzIHRoaXMgY2FzZSwgaXQgd2lsbCBza2lwIHRoZSBmaXJzdCByZWxvYyBhbmQKLQkJIGhhbmRsZSB0aGUgc2Vjb25kLiAgVGhlIHNlY29uZCByZWxvYyBhbHJlYWR5IGhhcyBhbgotCQkgZXh0cmEgYWRkZW5kIG9mIDQsIHdoaWNoIHdlIGFkZGVkIGFib3ZlLiAgV2UgbXVzdAotCQkgc3VidHJhY3QgaXQgb3V0LCBhbmQgdGhlbiBzdWJ0cmFjdCBhbm90aGVyIDQgdG8gbWFrZQotCQkgdGhlIGZpcnN0IHJlbG9jIGNvbWUgb3V0IHJpZ2h0LiAgVGhlIHNlY29uZCByZWxvYwotCQkgd2lsbCBjb21lIG91dCByaWdodCBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBhZGQgNCB0bwotCQkgb2Zmc2V0X2V4cHIgd2hlbiB3ZSBidWlsZCBpdHMgaW5zdHJ1Y3Rpb24gYmVsb3cuCi0KLQkJIElmIHdlIGhhdmUgYSBzeW1ib2wsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlCi0JCSB0aGUgb2Zmc2V0LCBiZWNhdXNlIGl0IHdpbGwgd2luZCB1cCBiZWluZyBpbmNsdWRlZAotCQkgd2hlbiB3ZSBnZW5lcmF0ZSB0aGUgcmVsb2MuICAqLwotCi0JICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIC09IDg7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gLTQ7Ci0JCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JCX0KLQkgICAgfQotCSAgbWFjcm9fYnVpbGRfbHVpIChwLCAmaWNudCwgJm9mZnNldF9leHByLCBBVCk7Ci0JICBpZiAocCAhPSBOVUxMKQotCSAgICBwICs9IDQ7Ci0JICBpZiAoYnJlZyAhPSAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIEFULCBicmVnLCBBVCk7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCkKLQkJcCArPSA0OwotCSAgICB9Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBpZiAocCAhPSBOVUxMKQotCSAgICBwICs9IDQ7Ci0JICAvKiBGSVhNRTogSG93IGRvIHdlIGhhbmRsZSBvdmVyZmxvdyBoZXJlPyAgKi8KLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCX0JICAKLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDICYmICEgbWlwc19iaWdfZ290KQotCXsKLQkgIGludCBvZmY7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSRhdCw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDAoJGF0KQotCSAgICAgICA8b3A+CSR0cmVnKzEsNCgkYXQpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdwkkYXQsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIgd2UgYWRkIGl0IHRvICRhdCBiZWZvcmUgdGhlCi0JICAgICBsd2MxIGluc3RydWN0aW9ucy4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQgd2UgaW5jbHVkZSBpdAotCSAgICAgaW4gdGhlIGx3YzEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgIHVzZWRfYXQgPSAxOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPCAtMHg4MDAwCi0JICAgICAgfHwgZXhwcjEuWF9hZGRfbnVtYmVyID49IDB4ODAwMCAtIDQpCi0JICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOwotCSAgaWYgKGJyZWcgPT0gMCkKLQkgICAgb2ZmID0gMDsKLQkgIGVsc2UKLQkgICAgb2ZmID0gNDsKLQkgIGZyYWdfZ3JvdyAoMjQgKyBvZmYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgICAgPyAibHciIDogImxkIiksCi0JCSAgICAgICAidCxvKGIpIiwgQVQsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgaWYgKGJyZWcgIT0gMCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAiZCx2LHQiLCBBVCwgYnJlZywgQVQpOwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyICs9IDQ7Ci0KLQkgIC8qIFNldCBtaXBzX29wdGltaXplIHRvIDIgdG8gYXZvaWQgaW5zZXJ0aW5nIGFuIHVuZGVzaXJlZAotICAgICAgICAgICAgIG5vcC4gICovCi0JICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgbWlwc19vcHRpbWl6ZSA9IDI7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCi0JICAodm9pZCkgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAwLCAwLAotCQkJICAgUkVMQVhfRU5DT0RFICgwLCAwLCAtMTYgLSBvZmYsIC04LCAxLCAwKSwKLQkJCSAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAoY2hhciAqKSBOVUxMKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBpbnQgZ3BkZWwsIG9mZjsKLQotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHVpCSRhdCw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KQotCSAgICAgICBhZGR1CSRhdCwkYXQsJGdwCi0JICAgICAgIGx3CSRhdCw8c3ltPigkYXQpCQkoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDAoJGF0KQotCSAgICAgICA8b3A+CSR0cmVnKzEsNCgkYXQpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdwkkYXQsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIgd2UgYWRkIGl0IHRvICRhdCBiZWZvcmUgdGhlCi0JICAgICBsd2MxIGluc3RydWN0aW9ucy4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQgd2UgaW5jbHVkZSBpdAotCSAgICAgaW4gdGhlIGx3YzEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgIHVzZWRfYXQgPSAxOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPCAtMHg4MDAwCi0JICAgICAgfHwgZXhwcjEuWF9hZGRfbnVtYmVyID49IDB4ODAwMCAtIDQpCi0JICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOwotCSAgaWYgKHJlZ19uZWVkc19kZWxheSAoR1ApKQotCSAgICBncGRlbCA9IDQ7Ci0JICBlbHNlCi0JICAgIGdwZGVsID0gMDsKLQkgIGlmIChicmVnID09IDApCi0JICAgIG9mZiA9IDA7Ci0JICBlbHNlCi0JICAgIG9mZiA9IDQ7Ci0JICBmcmFnX2dyb3cgKDU2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHVpIiwgInQsdSIsCi0JCSAgICAgICBBVCwgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICAgImQsdix0IiwgQVQsIEFULCBHUCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCBBVCwgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsIEFUKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICBpZiAoYnJlZyAhPSAwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkJICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICJkLHYsdCIsIEFULCBicmVnLCBBVCk7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgKz0gNDsKLQotCSAgLyogU2V0IG1pcHNfb3B0aW1pemUgdG8gMiB0byBhdm9pZCBpbnNlcnRpbmcgYW4gdW5kZXNpcmVkCi0gICAgICAgICAgICAgbm9wLiAgKi8KLQkgIGhvbGRfbWlwc19vcHRpbWl6ZSA9IG1pcHNfb3B0aW1pemU7Ci0JICBtaXBzX29wdGltaXplID0gMjsKLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyA6IHRyZWcgKyAxLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgLT0gNDsKLQotCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTYgKyBncGRlbCArIG9mZiwgMCwKLQkJCVJFTEFYX0VOQ09ERSAoMjQgKyBvZmYsIDE2ICsgZ3BkZWwgKyBvZmYsIGdwZGVsLAotCQkJCSAgICAgIDggKyBncGRlbCArIG9mZiwgMSwgMCksCi0JCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJKGNoYXIgKikgTlVMTCk7Ci0JICBpZiAoZ3BkZWwgPiAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgIH0KLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgcCArPSA0OwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIHAgKz0gNDsKLQkgIGlmIChicmVnICE9IDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgQVQsIGJyZWcsIEFUKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgIH0KLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZleHByMSwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgIHAgKz0gNDsKLQkgIGV4cHIxLlhfYWRkX251bWJlciArPSA0OwotCi0JICAvKiBTZXQgbWlwc19vcHRpbWl6ZSB0byAyIHRvIGF2b2lkIGluc2VydGluZyBhbiB1bmRlc2lyZWQKLSAgICAgICAgICAgICBub3AuICAqLwotCSAgaG9sZF9taXBzX29wdGltaXplID0gbWlwc19vcHRpbWl6ZTsKLQkgIG1pcHNfb3B0aW1pemUgPSAyOwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCi0JewotCSAgLyogSWYgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3Rlciwgd2UgdXNlCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgSWYgd2UgaGF2ZSBhIGJhc2UgcmVnaXN0ZXIsIHdlIHVzZQotCSAgICAgICBhZGR1CSRhdCwkYnJlZywkZ3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICAqLwotCSAgaWYgKGJyZWcgPT0gMCkKLQkgICAgewotCSAgICAgIHRlbXByZWcgPSBHUDsKLQkgICAgICB1c2VkX2F0ID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIEFULCBicmVnLCBHUCk7Ci0JICAgICAgdGVtcHJlZyA9IEFUOwotCSAgICAgIHVzZWRfYXQgPSAxOwotCSAgICB9Ci0KLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIHRlbXByZWcpOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmICghIHVzZWRfYXQpCi0JcmV0dXJuOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9MRF9PQjoKLSAgICAgIHMgPSAibHciOwotICAgICAgZ290byBzZF9vYjsKLSAgICBjYXNlIE1fU0RfT0I6Ci0gICAgICBzID0gInN3IjsKLSAgICBzZF9vYjoKLSAgICAgIGFzc2VydCAoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMiAKLQkgICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAidCxvKGIpIiwgdHJlZyArIDEsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgLyogTmV3IGNvZGUgYWRkZWQgdG8gc3VwcG9ydCBDT1BaIGluc3RydWN0aW9ucy4KLSAgICAgIFRoaXMgY29kZSBidWlsZHMgdGFibGUgZW50cmllcyBvdXQgb2YgdGhlIG1hY3JvcyBpbiBtaXBfb3Bjb2Rlcy4KLSAgICAgIFI0MDAwIHVzZXMgaW50ZXJsb2NrcyB0byBoYW5kbGUgY29wcm9jIGRlbGF5cy4KLSAgICAgIE90aGVyIGNoaXBzIChsaWtlIHRoZSBSMzAwMCkgcmVxdWlyZSBub3BzIHRvIGJlIGluc2VydGVkIGZvciBkZWxheXMuCi0KLSAgICAgIEZJWE1FOiBDdXJyZW50bHksIHdlIHJlcXVpcmUgdGhhdCB0aGUgdXNlciBoYW5kbGUgZGVsYXlzLgotICAgICAgSW4gb3JkZXIgdG8gZmlsbCBkZWxheSBzbG90cyBmb3Igbm9uLWludGVybG9ja2VkIGNoaXBzLAotICAgICAgd2UgbXVzdCBoYXZlIGEgd2F5IHRvIHNwZWNpZnkgZGVsYXlzIGJhc2VkIG9uIHRoZSBjb3Byb2Nlc3Nvci4KLSAgICAgIEVnLiA0IGN5Y2xlcyBpZiBsb2FkIGNvcHJvYyByZWcgZnJvbSBtZW1vcnksIDEgaWYgaW4gY2FjaGUsIGV0Yy4KLSAgICAgIFdoYXQgYXJlIHRoZSBzaWRlLWVmZmVjdHMgb2YgdGhlIGNvcCBpbnN0cnVjdGlvbj8KLSAgICAgIFdoYXQgY2FjaGUgc3VwcG9ydCBtaWdodCB3ZSBoYXZlIGFuZCB3aGF0IGFyZSBpdHMgZWZmZWN0cz8KLSAgICAgIEJvdGggY29wcm9jZXNzb3IgJiBtZW1vcnkgcmVxdWlyZSBkZWxheXMuIGhvdyBsb25nPz8/Ci0gICAgICBXaGF0IHJlZ2lzdGVycyBhcmUgcmVhZC9zZXQvbW9kaWZpZWQ/IAotCi0gICAgICBJZiBhbiBpdGJsIGlzIHByb3ZpZGVkIHRvIGludGVycHJldCBjb3AgaW5zdHJ1Y3Rpb25zLAotICAgICAgdGhpcyBrbm93bGVkZ2UgY2FuIGJlIGVuY29kZWQgaW4gdGhlIGl0Ymwgc3BlYy4gKi8KLQotICAgIGNhc2UgTV9DT1AwOgotICAgICAgcyA9ICJjMCI7Ci0gICAgICBnb3RvIGNvcHo7Ci0gICAgY2FzZSBNX0NPUDE6Ci0gICAgICBzID0gImMxIjsKLSAgICAgIGdvdG8gY29wejsKLSAgICBjYXNlIE1fQ09QMjoKLSAgICAgIHMgPSAiYzIiOwotICAgICAgZ290byBjb3B6OwotICAgIGNhc2UgTV9DT1AzOgotICAgICAgcyA9ICJjMyI7Ci0gICAgY29wejoKLSAgICAgIC8qIEZvciBub3cgd2UganVzdCBkbyBDIChzYW1lIGFzIEN6KS4gIFRoZSBwYXJhbWV0ZXIgd2lsbCBiZQotICAgICAgICAgc3RvcmVkIGluIGluc25fb3Bjb2RlIGJ5IG1pcHNfaXAuICAqLwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgcywgIkMiLAotCQkgICBpcC0+aW5zbl9vcGNvZGUpOwotICAgICAgcmV0dXJuOwotCi0jaWZkZWYgTE9TSU5HX0NPTVBJTEVSCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFRyeSBhbmQgc2VlIGlmIHRoaXMgaXMgYSBuZXcgaXRibCBpbnN0cnVjdGlvbi4KLSAgICAgICAgIFRoaXMgY29kZSBidWlsZHMgdGFibGUgZW50cmllcyBvdXQgb2YgdGhlIG1hY3JvcyBpbiBtaXBfb3Bjb2Rlcy4KLSAgICAgICAgIEZJWE1FOiBGb3Igbm93IHdlIGp1c3QgYXNzZW1ibGUgdGhlIGV4cHJlc3Npb24gYW5kIHBhc3MgaXQncwotICAgICAgICAgdmFsdWUgYWxvbmcgYXMgYSAzMi1iaXQgaW1tZWRpYXRlLgotICAgICAgICAgV2UgbWF5IHdhbnQgdG8gaGF2ZSB0aGUgYXNzZW1ibGVyIGFzc2VtYmxlIHRoaXMgdmFsdWUsIAotICAgICAgICAgc28gdGhhdCB3ZSBnYWluIHRoZSBhc3NlbWJsZXIncyBrbm93bGVkZ2Ugb2YgZGVsYXkgc2xvdHMsCi0gICAgICAgICBzeW1ib2xzLCBldGMuCi0gICAgICAgICBXb3VsZCBpdCBiZSBtb3JlIGVmZmljaWVudCB0byB1c2UgbWFzayAoaWQpIGhlcmU/ICovCi0gICAgICBpZiAoaXRibF9oYXZlX2VudHJpZXMgCi0JICAmJiAoaW1tZWRfZXhwciA9IGl0YmxfYXNzZW1ibGUgKGlwLT5pbnNuX21vLT5uYW1lLCAiIikpKQotICAgICAgICB7Ci0JICBzID0gaXAtPmluc25fbW8tPm5hbWU7Ci0JICBzMiA9ICJjb3AzIjsKLQkgIGNvcHJvYyA9IElUQkxfREVDT0RFX1BOVU0gKGltbWVkX2V4cHIpOzsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbWVkX2V4cHIsIHMsICJDIik7Ci0JICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIG1hY3JvMiAoaXApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG1pcHNfb3B0cy5ub2F0KQotICAgIGFzX3dhcm4gKF8oIk1hY3JvIHVzZWQgJGF0IGFmdGVyIFwiLnNldCBub2F0XCIiKSk7Ci19Ci0gICAgICAgICAgCi1zdGF0aWMgdm9pZAotbWFjcm8yIChpcCkKLSAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Ci17Ci0gIHJlZ2lzdGVyIGludCB0cmVnLCBzcmVnLCBkcmVnLCBicmVnOwotICBpbnQgdGVtcHJlZzsKLSAgaW50IG1hc2s7Ci0gIGludCBpY250ID0gMDsKLSAgaW50IHVzZWRfYXQ7Ci0gIGV4cHJlc3Npb25TIGV4cHIxOwotICBjb25zdCBjaGFyICpzOwotICBjb25zdCBjaGFyICpzMjsKLSAgY29uc3QgY2hhciAqZm10OwotICBpbnQgbGlrZWx5ID0gMDsKLSAgaW50IGRibCA9IDA7Ci0gIGludCBjb3Byb2MgPSAwOwotICBpbnQgbHIgPSAwOwotICBpbnQgaW1tID0gMDsKLSAgaW50IG9mZjsKLSAgb2Zmc2V0VCBtYXhudW07Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotICBjaGFyICpwOwotICAgICAgICAgIAotICB0cmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxNikgJiAweDFmOwotICBkcmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxMSkgJiAweDFmOwotICBzcmVnID0gYnJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMjEpICYgMHgxZjsKLSAgbWFzayA9IGlwLT5pbnNuX21vLT5tYXNrOwotICAgICAgICAgIAotICBleHByMS5YX29wID0gT19jb25zdGFudDsKLSAgZXhwcjEuWF9vcF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9udW1iZXIgPSAxOwotICAgICAgICAgIAotICBzd2l0Y2ggKG1hc2spCi0gICAgewotI2VuZGlmIC8qIExPU0lOR19DT01QSUxFUiAqLwotCi0gICAgY2FzZSBNX0RNVUw6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUw6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdHUiIDogIm11bHR1IiwKLQkJICAgInMsdCIsIHNyZWcsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJkIiwgZHJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRE1VTF9JOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTVVMX0k6Ci0gICAgICAvKiBUaGUgTUlQUyBhc3NlbWJsZXIgc29tZSB0aW1lcyBnZW5lcmF0ZXMgc2hpZnRzIGFuZCBhZGRzLiAgSSdtCi0JIG5vdCB0cnlpbmcgdG8gYmUgdGhhdCBmYW5jeS4gR0NDIHNob3VsZCBkbyB0aGlzIGZvciB1cwotCSBhbnl3YXkuICAqLwotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdCIgOiAibXVsdCIsCi0JCSAgICJzLHQiLCBzcmVnLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgImQiLCBkcmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RNVUxPX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxPX0k6Ci0gICAgICBpbW0gPSAxOwotICAgICAgZ290byBkb19tdWxvOwotCi0gICAgY2FzZSBNX0RNVUxPOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTVVMTzoKLSAgICBkb19tdWxvOgotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgaWYgKGltbSkKLQlsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRtdWx0IiA6ICJtdWx0IiwKLQkJICAgInMsdCIsIHNyZWcsIGltbSA/IEFUIDogdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgImQiLCBkcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRzcmEzMiIgOiAic3JhIiwKLQkJICAgImQsdyw8IiwgZHJlZywgZHJlZywgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZoaSIsICJkIiwgQVQpOwotICAgICAgaWYgKG1pcHNfdHJhcCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0bmUiLCAicyx0IiwgZHJlZywgQVQpOwotICAgICAgZWxzZQotCXsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJlcSIsICJzLHQscCIsIGRyZWcsIEFUKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiLCAwKTsKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDYpOwotCX0KLSAgICAgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1mbG8iLCAiZCIsIGRyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRE1VTE9VX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxPVV9JOgotICAgICAgaW1tID0gMTsKLSAgICAgIGdvdG8gZG9fbXVsb3U7Ci0KLSAgICBjYXNlIE1fRE1VTE9VOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTVVMT1U6Ci0gICAgZG9fbXVsb3U6Ci0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBpZiAoaW1tKQotCWxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBkYmwpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZG11bHR1IiA6ICJtdWx0dSIsCi0JCSAgICJzLHQiLCBzcmVnLCBpbW0gPyBBVCA6IHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZoaSIsICJkIiwgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJkIiwgZHJlZyk7Ci0gICAgICBpZiAobWlwc190cmFwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRuZSIsICJzLHQiLCBBVCwgMCk7Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYmVxIiwgInMsdCxwIiwgQVQsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIsIDApOwotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNik7Ci0JfQotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fUk9MOgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic3VidSIsICJkLHYsdCIsIEFULCAwLCB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybHYiLCAiZCx0LHMiLCBBVCwgc3JlZywgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsdiIsICJkLHQscyIsIGRyZWcsIHNyZWcsCi0JCSAgIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCBkcmVnLCBkcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ST0xfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJyb3RhdGUgY291bnQgdG9vIGxhcmdlIikpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsIiwgImQsdyw8IiwgQVQsIHNyZWcsCi0JCSAgIChpbnQpIChpbW1fZXhwci5YX2FkZF9udW1iZXIgJiAweDFmKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmwiLCAiZCx3LDwiLCBkcmVnLCBzcmVnLAotCQkgICAoaW50KSAoKDAgLSBpbW1fZXhwci5YX2FkZF9udW1iZXIpICYgMHgxZikpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCBkcmVnLCBkcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ST1I6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzdWJ1IiwgImQsdix0IiwgQVQsIDAsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsdiIsICJkLHQscyIsIEFULCBzcmVnLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmx2IiwgImQsdCxzIiwgZHJlZywgc3JlZywKLQkJICAgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1JPUl9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oInJvdGF0ZSBjb3VudCB0b28gbGFyZ2UiKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmwiLCAiZCx3LDwiLCBBVCwgc3JlZywKLQkJICAgKGludCkgKGltbV9leHByLlhfYWRkX251bWJlciAmIDB4MWYpKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbCIsICJkLHcsPCIsIGRyZWcsIHNyZWcsCi0JCSAgIChpbnQpICgoMCAtIGltbV9leHByLlhfYWRkX251bWJlcikgJiAweDFmKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NfRE9COgotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBhc3NlcnQgKG1pcHNfb3B0cy5pc2EgPT0gMSk7Ci0gICAgICAvKiBFdmVuIG9uIGEgYmlnIGVuZGlhbiBtYWNoaW5lICRmbiBjb21lcyBiZWZvcmUgJGZuKzEuICBXZSBoYXZlCi0JIHRvIGFkanVzdCB3aGVuIHN0b3JpbmcgdG8gbWVtb3J5LiAgKi8KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAic3djMSIsICJULG8oYikiLAotCQkgICB0YXJnZXRfYmlnX2VuZGlhbiA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgInN3YzEiLCAiVCxvKGIpIiwKLQkJICAgdGFyZ2V0X2JpZ19lbmRpYW4gPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TRVE6Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aXUiLCAidCxyLGoiLCBkcmVnLAotCQkgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGVsc2UgaWYgKHRyZWcgPT0gMCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGl1IiwgInQscixqIiwgZHJlZywKLQkJICAgICBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBlbHNlCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAieG9yIiwgImQsdix0IiwgZHJlZywKLQkJICAgICAgIHNyZWcsIHRyZWcpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpdSIsICJ0LHIsaiIsIGRyZWcsCi0JCSAgICAgICBkcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JfQotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NFUV9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGl1IiwgInQscixqIiwgZHJlZywKLQkJICAgICAgIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIGFzX3dhcm4gKF8oIkluc3RydWN0aW9uICVzOiByZXN1bHQgaXMgYWx3YXlzIGZhbHNlIiksCi0JCSAgIGlwLT5pbnNuX21vLT5uYW1lKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1vdmUiLCAiZCxzIiwgZHJlZywgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4MTAwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJ4b3JpIiwgInQscixpIiwgZHJlZywKLQkJICAgICAgIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAtMHg4MDAwCi0JICAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDApCi0JewotCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICB1c2VkX2F0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAieG9yIiwgImQsdix0IiwgZHJlZywKLQkJICAgICAgIHNyZWcsIEFUKTsKLQkgIHVzZWRfYXQgPSAxOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aXUiLCAidCxyLGoiLCBkcmVnLCBkcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBpZiAodXNlZF9hdCkKLQlicmVhazsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TR0U6CQkvKiBzcmVnID49IHRyZWcgPD09PiBub3QgKHNyZWcgPCB0cmVnKSAqLwotICAgICAgcyA9ICJzbHQiOwotICAgICAgZ290byBzZ2U7Ci0gICAgY2FzZSBNX1NHRVU6Ci0gICAgICBzID0gInNsdHUiOwotICAgIHNnZToKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQsdix0IiwgZHJlZywgc3JlZywgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInhvcmkiLCAidCxyLGkiLCBkcmVnLCBkcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0dFX0k6CQkvKiBzcmVnID49IEkgPD09PiBub3QgKHNyZWcgPCBJKSAqLwotICAgIGNhc2UgTV9TR0VVX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICAgICAgbWFzayA9PSBNX1NHRV9JID8gInNsdGkiIDogInNsdGl1IiwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgICAgICBtYXNrID09IE1fU0dFX0kgPyAic2x0IiA6ICJzbHR1IiwKLQkJICAgICAgICJkLHYsdCIsIGRyZWcsIHNyZWcsIEFUKTsKLQkgIHVzZWRfYXQgPSAxOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAieG9yaSIsICJ0LHIsaSIsIGRyZWcsIGRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGlmICh1c2VkX2F0KQotCWJyZWFrOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NHVDoJCS8qIHNyZWcgPiB0cmVnICA8PT0+ICB0cmVnIDwgc3JlZyAqLwotICAgICAgcyA9ICJzbHQiOwotICAgICAgZ290byBzZ3Q7Ci0gICAgY2FzZSBNX1NHVFU6Ci0gICAgICBzID0gInNsdHUiOwotICAgIHNndDoKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQsdix0IiwgZHJlZywgdHJlZywgc3JlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0dUX0k6CQkvKiBzcmVnID4gSSAgPD09PiAgSSA8IHNyZWcgKi8KLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIGdvdG8gc2d0aTsKLSAgICBjYXNlIE1fU0dUVV9JOgotICAgICAgcyA9ICJzbHR1IjsKLSAgICBzZ3RpOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCx2LHQiLCBkcmVnLCBBVCwgc3JlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TTEU6CQkvKiBzcmVnIDw9IHRyZWcgIDw9PT4gIHRyZWcgPj0gc3JlZyAgPD09PiAgbm90ICh0cmVnIDwgc3JlZykgKi8KLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIGdvdG8gc2xlOwotICAgIGNhc2UgTV9TTEVVOgotICAgICAgcyA9ICJzbHR1IjsKLSAgICBzbGU6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkLHYsdCIsIGRyZWcsIHRyZWcsIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJ4b3JpIiwgInQscixpIiwgZHJlZywgZHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NMRV9JOgkJLyogc3JlZyA8PSBJIDw9PT4gSSA+PSBzcmVnIDw9PT4gbm90IChJIDwgc3JlZykgKi8KLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIGdvdG8gc2xlaTsKLSAgICBjYXNlIE1fU0xFVV9JOgotICAgICAgcyA9ICJzbHR1IjsKLSAgICBzbGVpOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCx2LHQiLCBkcmVnLCBBVCwgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInhvcmkiLCAidCxyLGkiLCBkcmVnLCBkcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TTFRfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJzbHRpIiwgInQscixqIiwKLQkJICAgICAgIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHQiLCAiZCx2LHQiLCBkcmVnLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TTFRVX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCAic2x0aXUiLCAidCxyLGoiLAotCQkgICAgICAgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCBzcmVnLAotCQkgICBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TTkU6Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCAwLAotCQkgICAgIHRyZWcpOwotICAgICAgZWxzZSBpZiAodHJlZyA9PSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCAwLAotCQkgICAgIHNyZWcpOwotICAgICAgZWxzZQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInhvciIsICJkLHYsdCIsIGRyZWcsCi0JCSAgICAgICBzcmVnLCB0cmVnKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCAwLAotCQkgICAgICAgZHJlZyk7Ci0JfQotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NORV9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgMCwKLQkJICAgICAgIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgYXNfd2FybiAoXygiSW5zdHJ1Y3Rpb24gJXM6IHJlc3VsdCBpcyBhbHdheXMgdHJ1ZSIpLAotCQkgICBpcC0+aW5zbl9tby0+bmFtZSk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCBkcmVnLCAwLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4MTAwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJ4b3JpIiwgInQscixpIiwKLQkJICAgICAgIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAtMHg4MDAwCi0JICAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDApCi0JewotCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgISBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ4b3IiLCAiZCx2LHQiLCBkcmVnLAotCQkgICAgICAgc3JlZywgQVQpOwotCSAgdXNlZF9hdCA9IDE7Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIGRyZWcsIDAsIGRyZWcpOwotICAgICAgaWYgKHVzZWRfYXQpCi0JYnJlYWs7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRFNVQl9JOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fU1VCX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAtMHg4MDAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPD0gMHg4MDAwKQotCXsKLQkgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwKLQkJICAgICAgIGRibCA/ICJkYWRkaSIgOiAiYWRkaSIsCi0JCSAgICAgICAidCxyLGoiLCBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkc3ViIiA6ICJzdWIiLAotCQkgICAiZCx2LHQiLCBkcmVnLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9EU1VCVV9JOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fU1VCVV9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gLTB4ODAwMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw9IDB4ODAwMCkKLQl7Ci0JICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsCi0JCSAgICAgICBkYmwgPyAiZGFkZGl1IiA6ICJhZGRpdSIsCi0JCSAgICAgICAidCxyLGoiLCBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkc3VidSIgOiAic3VidSIsCi0JCSAgICJkLHYsdCIsIGRyZWcsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1RFUV9JOgotICAgICAgcyA9ICJ0ZXEiOwotICAgICAgZ290byB0cmFwOwotICAgIGNhc2UgTV9UR0VfSToKLSAgICAgIHMgPSAidGdlIjsKLSAgICAgIGdvdG8gdHJhcDsKLSAgICBjYXNlIE1fVEdFVV9JOgotICAgICAgcyA9ICJ0Z2V1IjsKLSAgICAgIGdvdG8gdHJhcDsKLSAgICBjYXNlIE1fVExUX0k6Ci0gICAgICBzID0gInRsdCI7Ci0gICAgICBnb3RvIHRyYXA7Ci0gICAgY2FzZSBNX1RMVFVfSToKLSAgICAgIHMgPSAidGx0dSI7Ci0gICAgICBnb3RvIHRyYXA7Ci0gICAgY2FzZSBNX1RORV9JOgotICAgICAgcyA9ICJ0bmUiOwotICAgIHRyYXA6Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJzLHQiLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9UUlVOQ1dEOgotICAgIGNhc2UgTV9UUlVOQ1dTOgotICAgICAgYXNzZXJ0IChtaXBzX29wdHMuaXNhID09IDEpOwotICAgICAgc3JlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMTEpICYgMHgxZjsJLyogZmxvYXRpbmcgcmVnICovCi0gICAgICBkcmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAwNikgJiAweDFmOwkvKiBmbG9hdGluZyByZWcgKi8KLQotICAgICAgLyoKLSAgICAgICAqIElzIHRoZSBkb3VibGUgY2ZjMSBpbnN0cnVjdGlvbiBhIGJ1ZyBpbiB0aGUgbWlwcyBhc3NlbWJsZXI7Ci0gICAgICAgKiBvciBpcyB0aGVyZSBhIHJlYXNvbiBmb3IgaXQ/Ci0gICAgICAgKi8KLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImNmYzEiLCAidCxHIiwgdHJlZywgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiY2ZjMSIsICJ0LEciLCB0cmVnLCAzMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIik7Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAzOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJvcmkiLCAidCxyLGkiLCBBVCwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAieG9yaSIsICJ0LHIsaSIsIEFULCBBVCwKLQkJICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJjdGMxIiwgInQsRyIsIEFULCAzMSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIik7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JICAgICAgbWFzayA9PSBNX1RSVU5DV0QgPyAiY3Z0LncuZCIgOiAiY3Z0LncucyIsICJELFMiLCBkcmVnLCBzcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImN0YzEiLCAidCxHIiwgdHJlZywgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIpOwotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVUxIOgotICAgICAgcyA9ICJsYiI7Ci0gICAgICBnb3RvIHVsaDsKLSAgICBjYXNlIE1fVUxIVToKLSAgICAgIHMgPSAibGJ1IjsKLSAgICB1bGg6Ci0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IDB4N2ZmZikKLQlhc19iYWQgKF8oIm9wZXJhbmQgb3ZlcmZsb3ciKSk7Ci0gICAgICAvKiBhdm9pZCBsb2FkIGRlbGF5ICovCi0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIC09IDE7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImxidSIsICJ0LG8oYikiLCBBVCwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsIiwgImQsdyw8IiwgdHJlZywgdHJlZywgOCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIHRyZWcsIHRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1VMRDoKLSAgICAgIHMgPSAibGRsIjsKLSAgICAgIHMyID0gImxkciI7Ci0gICAgICBvZmYgPSA3OwotICAgICAgZ290byB1bHc7Ci0gICAgY2FzZSBNX1VMVzoKLSAgICAgIHMgPSAibHdsIjsKLSAgICAgIHMyID0gImx3ciI7Ci0gICAgICBvZmYgPSAzOwotICAgIHVsdzoKLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gMHg4MDAwIC0gb2ZmKQotCWFzX2JhZCAoXygib3BlcmFuZCBvdmVyZmxvdyIpKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSBvZmY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciAtPSBvZmY7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IG9mZjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzMiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9VTERfQToKLSAgICAgIHMgPSAibGRsIjsKLSAgICAgIHMyID0gImxkciI7Ci0gICAgICBvZmYgPSA3OwotICAgICAgZ290byB1bHdhOwotICAgIGNhc2UgTV9VTFdfQToKLSAgICAgIHMgPSAibHdsIjsKLSAgICAgIHMyID0gImx3ciI7Ci0gICAgICBvZmYgPSAzOwotICAgIHVsd2E6Ci0gICAgICBsb2FkX2FkZHJlc3MgKCZpY250LCBBVCwgJm9mZnNldF9leHByKTsKLSAgICAgIGlmIChicmVnICE9IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCBBVCwgQVQsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gb2ZmOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IG9mZjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzMiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9VTEhfQToKLSAgICBjYXNlIE1fVUxIVV9BOgotICAgICAgbG9hZF9hZGRyZXNzICgmaWNudCwgQVQsICZvZmZzZXRfZXhwcik7Ci0gICAgICBpZiAoYnJlZyAhPSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgImQsdix0IiwgQVQsIEFULCBicmVnKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCSAgIG1hc2sgPT0gTV9VTEhfQSA/ICJsYiIgOiAibGJ1IiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJsYnUiLCAidCxvKGIpIiwgQVQsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGwiLCAiZCx3LDwiLCB0cmVnLAotCQkgICB0cmVnLCA4KTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgdHJlZywKLQkJICAgdHJlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVVNIOgotICAgICAgaWYgKG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSAweDdmZmYpCi0JYXNfYmFkIChfKCJvcGVyYW5kIG92ZXJmbG93IikpOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJzYiIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmwiLCAiZCx3LDwiLCBBVCwgdHJlZywgOCk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIC09IDE7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgInNiIiwgInQsbyhiKSIsIEFULAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9VU0Q6Ci0gICAgICBzID0gInNkbCI7Ci0gICAgICBzMiA9ICJzZHIiOwotICAgICAgb2ZmID0gNzsKLSAgICAgIGdvdG8gdXN3OwotICAgIGNhc2UgTV9VU1c6Ci0gICAgICBzID0gInN3bCI7Ci0gICAgICBzMiA9ICJzd3IiOwotICAgICAgb2ZmID0gMzsKLSAgICB1c3c6Ci0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IDB4ODAwMCAtIG9mZikKLQlhc19iYWQgKF8oIm9wZXJhbmQgb3ZlcmZsb3ciKSk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gb2ZmOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgLT0gb2ZmOwotICAgICAgZWxzZQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSBvZmY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgczIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fVVNEX0E6Ci0gICAgICBzID0gInNkbCI7Ci0gICAgICBzMiA9ICJzZHIiOwotICAgICAgb2ZmID0gNzsKLSAgICAgIGdvdG8gdXN3YTsKLSAgICBjYXNlIE1fVVNXX0E6Ci0gICAgICBzID0gInN3bCI7Ci0gICAgICBzMiA9ICJzd3IiOwotICAgICAgb2ZmID0gMzsKLSAgICB1c3dhOgotICAgICAgbG9hZF9hZGRyZXNzICgmaWNudCwgQVQsICZvZmZzZXRfZXhwcik7Ci0gICAgICBpZiAoYnJlZyAhPSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgImQsdix0IiwgQVQsIEFULCBicmVnKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCWV4cHIxLlhfYWRkX251bWJlciA9IG9mZjsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSBvZmY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgczIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVVNIX0E6Ci0gICAgICBsb2FkX2FkZHJlc3MgKCZpY250LCBBVCwgJm9mZnNldF9leHByKTsKLSAgICAgIGlmIChicmVnICE9IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgIHx8ICEgSVNBX0hBU182NEJJVF9SRUdTIChtaXBzX29wdHMuaXNhKSkKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCBBVCwgQVQsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2IiLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybCIsICJkLHcsPCIsIHRyZWcsCi0JCSAgIHRyZWcsIDgpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzYiIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJsYnUiLCAidCxvKGIpIiwgQVQsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGwiLCAiZCx3LDwiLCB0cmVnLAotCQkgICB0cmVnLCA4KTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgdHJlZywKLQkJICAgdHJlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogRklYTUU6IENoZWNrIGlmIHRoaXMgaXMgb25lIG9mIHRoZSBpdGJsIG1hY3Jvcywgc2luY2UgdGhleQotCSBhcmUgYWRkZWQgZHluYW1pY2FsbHkuICovCi0gICAgICBhc19iYWQgKF8oIk1hY3JvICVzIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKSwgaXAtPmluc25fbW8tPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBpZiAobWlwc19vcHRzLm5vYXQpCi0gICAgYXNfd2FybiAoXygiTWFjcm8gdXNlZCAkYXQgYWZ0ZXIgXCIuc2V0IG5vYXRcIiIpKTsKLX0KLQotLyogSW1wbGVtZW50IG1hY3JvcyBpbiBtaXBzMTYgbW9kZS4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzMTZfbWFjcm8gKGlwKQotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgaW50IG1hc2s7Ci0gIGludCB4cmVnLCB5cmVnLCB6cmVnLCB0bXA7Ci0gIGludCBpY250OwotICBleHByZXNzaW9uUyBleHByMTsKLSAgaW50IGRibDsKLSAgY29uc3QgY2hhciAqcywgKnMyLCAqczM7Ci0KLSAgbWFzayA9IGlwLT5pbnNuX21vLT5tYXNrOwotCi0gIHhyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlg7Ci0gIHlyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JZKSAmIE1JUFMxNk9QX01BU0tfUlk7Ci0gIHpyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JaKSAmIE1JUFMxNk9QX01BU0tfUlo7Ci0KLSAgaWNudCA9IDA7Ci0KLSAgZXhwcjEuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGV4cHIxLlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgZXhwcjEuWF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKLQotICBkYmwgPSAwOwotCi0gIHN3aXRjaCAobWFzaykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGludGVybmFsRXJyb3IgKCk7Ci0KLSAgICBjYXNlIE1fRERJVl8zOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fRElWXzM6Ci0gICAgICBzID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXYzOwotICAgIGNhc2UgTV9EUkVNXzM6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9SRU1fMzoKLSAgICAgIHMgPSAibWZoaSI7Ci0gICAgZG9fZGl2MzoKLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRkaXYiIDogImRpdiIsCi0JCSAgICIwLHgseSIsIHhyZWcsIHlyZWcpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5leiIsICJ4LHAiLCB5cmVnKTsKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICI2IiwgNyk7Ci0gICAgICAKLSAgICAgIC8qIEZJWE1FOiBUaGUgbm9ybWFsIGNvZGUgY2hlY2tzIGZvciBvZiAtMSAvIC0weDgwMDAwMDAwIGhlcmUsCi0gICAgICAgICBzaW5jZSB0aGF0IGNhdXNlcyBhbiBvdmVyZmxvdy4gIFdlIHNob3VsZCBkbyB0aGF0IGFzIHdlbGwsCi0gICAgICAgICBidXQgSSBkb24ndCBzZWUgaG93IHRvIGRvIHRoZSBjb21wYXJpc29ucyB3aXRob3V0IGEgdGVtcG9yYXJ5Ci0gICAgICAgICByZWdpc3Rlci4gICovCi0gICAgICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJ4IiwgenJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ESVZVXzM6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2RpdnUzOwotICAgIGNhc2UgTV9SRU1VXzM6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgICBnb3RvIGRvX2RpdnUzOwotICAgIGNhc2UgTV9ERElWVV8zOgotICAgICAgcyA9ICJkZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX0RSRU1VXzM6Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1maGkiOwotICAgIGRvX2RpdnUzOgotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiMCx4LHkiLCB4cmVnLCB5cmVnKTsKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJuZXoiLCAieCxwIiwgeXJlZyk7Ci0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiNiIsIDcpOwotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgIngiLCB6cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RNVUw6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUw6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdHUiIDogIm11bHR1IiwKLQkJICAgIngseSIsIHhyZWcsIHlyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJ4IiwgenJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRFNVQlVfSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBnb3RvIGRvX3N1YnU7Ci0gICAgY2FzZSBNX1NVQlVfSToKLSAgICBkb19zdWJ1OgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICBkYmwgPyAiZGFkZGl1IiA6ICJhZGRpdSIsCi0JCSAgICJ5LHgsNCIsIHlyZWcsIHhyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU1VCVV9JXzI6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJhZGRpdSIsCi0JCSAgICJ4LGsiLCB4cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RTVUJVX0lfMjoKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKLSAgICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgImRhZGRpdSIsCi0JCSAgICJ5LGoiLCB5cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JFUToKLSAgICAgIHMgPSAiY21wIjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoOwotICAgIGNhc2UgTV9CTkU6Ci0gICAgICBzID0gImNtcCI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaDsKLSAgICBjYXNlIE1fQkxUOgotICAgICAgcyA9ICJzbHQiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JMVFU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JMRToKLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIGdvdG8gZG9fcmV2ZXJzZV9icmFuY2g7Ci0gICAgY2FzZSBNX0JMRVU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19yZXZlcnNlX2JyYW5jaDsKLSAgICBjYXNlIE1fQkdFOgotICAgICAgcyA9ICJzbHQiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JHRVU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JHVDoKLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIGdvdG8gZG9fcmV2ZXJzZV9icmFuY2g7Ci0gICAgY2FzZSBNX0JHVFU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRuZXoiOwotCi0gICAgZG9fcmV2ZXJzZV9icmFuY2g6Ci0gICAgICB0bXAgPSB4cmVnOwotICAgICAgeHJlZyA9IHlyZWc7Ci0gICAgICB5cmVnID0gdG1wOwotCi0gICAgZG9fYnJhbmNoOgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgcywgIngseSIsCi0JCSAgIHhyZWcsIHlyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMyLCAicCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkVRX0k6Ci0gICAgICBzID0gImNtcGkiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCxVIjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JORV9JOgotICAgICAgcyA9ICJjbXBpIjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIHMzID0gIngsVSI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CTFRfSToKLSAgICAgIHMgPSAic2x0aSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQkxUVV9JOgotICAgICAgcyA9ICJzbHRpdSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQkxFX0k6Ci0gICAgICBzID0gInNsdGkiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYWRkb25lX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CTEVVX0k6Ci0gICAgICBzID0gInNsdGl1IjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0gICAgICBnb3RvIGRvX2FkZG9uZV9icmFuY2hfaTsKLSAgICBjYXNlIE1fQkdFX0k6Ci0gICAgICBzID0gInNsdGkiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JHRVVfSToKLSAgICAgIHMgPSAic2x0aXUiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JHVF9JOgotICAgICAgcyA9ICJzbHRpIjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0gICAgICBnb3RvIGRvX2FkZG9uZV9icmFuY2hfaTsKLSAgICBjYXNlIE1fQkdUVV9JOgotICAgICAgcyA9ICJzbHRpdSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotCi0gICAgZG9fYWRkb25lX2JyYW5jaF9pOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgKytpbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0KLSAgICBkb19icmFuY2hfaToKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCBzLCBzMywgeHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgczIsICJwIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9BQlM6Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpIiwgIngsOCIsICB5cmVnKTsKLSAgICAgIGlmICh4cmVnICE9IHlyZWcpCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAibW92ZSIsICJ5LFgiLCB4cmVnLCB5cmVnKTsKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJ0ZXF6IiwgInAiKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICJuZWciLCAieCx3IiwgeHJlZywgeHJlZyk7Ci0gICAgfQotfQotCi0vKiBGb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcsIHZlcmlmeSB0aGF0IGFsbCBiaXRzIGFyZSBzcGVjaWZpZWQgZWl0aGVyCi0gICBieSB0aGUgbWF0Y2gvbWFzayBwYXJ0IG9mIHRoZSBpbnN0cnVjdGlvbiBkZWZpbml0aW9uLCBvciBieSB0aGUKLSAgIG9wZXJhbmQgbGlzdC4gICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9taXBzX2luc24gKG9wYykKLSAgICAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcGM7Ci17Ci0gIGNvbnN0IGNoYXIgKnAgPSBvcGMtPmFyZ3M7Ci0gIGNoYXIgYzsKLSAgdW5zaWduZWQgbG9uZyB1c2VkX2JpdHMgPSBvcGMtPm1hc2s7Ci0KLSAgaWYgKCh1c2VkX2JpdHMgJiBvcGMtPm1hdGNoKSAhPSBvcGMtPm1hdGNoKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAobWFzayBlcnJvcik6ICVzICVzIiksCi0JICAgICAgb3BjLT5uYW1lLCBvcGMtPmFyZ3MpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotI2RlZmluZSBVU0VfQklUUyhtYXNrLHNoaWZ0KQkodXNlZF9iaXRzIHw9ICgobWFzaykgPDwgKHNoaWZ0KSkpCi0gIHdoaWxlICgqcCkKLSAgICBzd2l0Y2ggKGMgPSAqcCsrKQotICAgICAgewotICAgICAgY2FzZSAnLCc6IGJyZWFrOwotICAgICAgY2FzZSAnKCc6IGJyZWFrOwotICAgICAgY2FzZSAnKSc6IGJyZWFrOwotICAgICAgY2FzZSAnPCc6IFVTRV9CSVRTIChPUF9NQVNLX1NIQU1ULAlPUF9TSF9TSEFNVCk7CWJyZWFrOwotICAgICAgY2FzZSAnPic6CVVTRV9CSVRTIChPUF9NQVNLX1NIQU1ULAlPUF9TSF9TSEFNVCk7CWJyZWFrOwotICAgICAgY2FzZSAnQSc6IGJyZWFrOwotICAgICAgY2FzZSAnQic6CVVTRV9CSVRTIChPUF9NQVNLX1NZU0NBTEwsCU9QX1NIX1NZU0NBTEwpOwlicmVhazsKLSAgICAgIGNhc2UgJ0MnOglVU0VfQklUUyAoT1BfTUFTS19DT1BaLAkJT1BfU0hfQ09QWik7CWJyZWFrOwotICAgICAgY2FzZSAnRCc6CVVTRV9CSVRTIChPUF9NQVNLX0ZELAkJT1BfU0hfRkQpOwlicmVhazsKLSAgICAgIGNhc2UgJ0UnOglVU0VfQklUUyAoT1BfTUFTS19SVCwJCU9QX1NIX1JUKTsJYnJlYWs7Ci0gICAgICBjYXNlICdGJzogYnJlYWs7Ci0gICAgICBjYXNlICdHJzoJVVNFX0JJVFMgKE9QX01BU0tfUkQsCQlPUF9TSF9SRCk7CWJyZWFrOwotICAgICAgY2FzZSAnSSc6IGJyZWFrOwotICAgICAgY2FzZSAnTCc6IGJyZWFrOwotICAgICAgY2FzZSAnTSc6CVVTRV9CSVRTIChPUF9NQVNLX0NDQywJCU9QX1NIX0NDQyk7CWJyZWFrOwotICAgICAgY2FzZSAnTic6CVVTRV9CSVRTIChPUF9NQVNLX0JDQywJCU9QX1NIX0JDQyk7CWJyZWFrOwotICAgICAgY2FzZSAnUic6CVVTRV9CSVRTIChPUF9NQVNLX0ZSLAkJT1BfU0hfRlIpOwlicmVhazsKLSAgICAgIGNhc2UgJ1MnOglVU0VfQklUUyAoT1BfTUFTS19GUywJCU9QX1NIX0ZTKTsJYnJlYWs7Ci0gICAgICBjYXNlICdUJzoJVVNFX0JJVFMgKE9QX01BU0tfRlQsCQlPUF9TSF9GVCk7CWJyZWFrOwotICAgICAgY2FzZSAnVic6CVVTRV9CSVRTIChPUF9NQVNLX0ZTLAkJT1BfU0hfRlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ1cnOglVU0VfQklUUyAoT1BfTUFTS19GVCwJCU9QX1NIX0ZUKTsJYnJlYWs7Ci0gICAgICBjYXNlICdhJzoJVVNFX0JJVFMgKE9QX01BU0tfVEFSR0VULAlPUF9TSF9UQVJHRVQpOwlicmVhazsKLSAgICAgIGNhc2UgJ2InOglVU0VfQklUUyAoT1BfTUFTS19SUywJCU9QX1NIX1JTKTsJYnJlYWs7Ci0gICAgICBjYXNlICdjJzoJVVNFX0JJVFMgKE9QX01BU0tfQ09ERSwJCU9QX1NIX0NPREUpOwlicmVhazsKLSAgICAgIGNhc2UgJ2QnOglVU0VfQklUUyAoT1BfTUFTS19SRCwJCU9QX1NIX1JEKTsJYnJlYWs7Ci0gICAgICBjYXNlICdmJzogYnJlYWs7Ci0gICAgICBjYXNlICdoJzoJVVNFX0JJVFMgKE9QX01BU0tfUFJFRlgsCU9QX1NIX1BSRUZYKTsJYnJlYWs7Ci0gICAgICBjYXNlICdpJzoJVVNFX0JJVFMgKE9QX01BU0tfSU1NRURJQVRFLAlPUF9TSF9JTU1FRElBVEUpOyBicmVhazsKLSAgICAgIGNhc2UgJ2onOglVU0VfQklUUyAoT1BfTUFTS19ERUxUQSwJT1BfU0hfREVMVEEpOwlicmVhazsKLSAgICAgIGNhc2UgJ2snOglVU0VfQklUUyAoT1BfTUFTS19DQUNIRSwJT1BfU0hfQ0FDSEUpOwlicmVhazsKLSAgICAgIGNhc2UgJ2wnOiBicmVhazsKLSAgICAgIGNhc2UgJ28nOiBVU0VfQklUUyAoT1BfTUFTS19ERUxUQSwJT1BfU0hfREVMVEEpOwlicmVhazsKLSAgICAgIGNhc2UgJ3AnOglVU0VfQklUUyAoT1BfTUFTS19ERUxUQSwJT1BfU0hfREVMVEEpOwlicmVhazsKLSAgICAgIGNhc2UgJ3EnOglVU0VfQklUUyAoT1BfTUFTS19DT0RFMiwJT1BfU0hfQ09ERTIpOwlicmVhazsKLSAgICAgIGNhc2UgJ3InOiBVU0VfQklUUyAoT1BfTUFTS19SUywJCU9QX1NIX1JTKTsJYnJlYWs7Ci0gICAgICBjYXNlICdzJzoJVVNFX0JJVFMgKE9QX01BU0tfUlMsCQlPUF9TSF9SUyk7CWJyZWFrOwotICAgICAgY2FzZSAndCc6CVVTRV9CSVRTIChPUF9NQVNLX1JULAkJT1BfU0hfUlQpOwlicmVhazsKLSAgICAgIGNhc2UgJ3UnOglVU0VfQklUUyAoT1BfTUFTS19JTU1FRElBVEUsCU9QX1NIX0lNTUVESUFURSk7IGJyZWFrOwotICAgICAgY2FzZSAndic6CVVTRV9CSVRTIChPUF9NQVNLX1JTLAkJT1BfU0hfUlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ3cnOglVU0VfQklUUyAoT1BfTUFTS19SVCwJCU9QX1NIX1JUKTsJYnJlYWs7Ci0gICAgICBjYXNlICd4JzogYnJlYWs7Ci0gICAgICBjYXNlICd6JzogYnJlYWs7Ci0gICAgICBjYXNlICdQJzogVVNFX0JJVFMgKE9QX01BU0tfUEVSRlJFRywJT1BfU0hfUEVSRlJFRyk7CWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlhc19iYWQgKF8oImludGVybmFsOiBiYWQgbWlwcyBvcGNvZGUgKHVua25vd24gb3BlcmFuZCB0eXBlIGAlYycpOiAlcyAlcyIpLAotCQljLCBvcGMtPm5hbWUsIG9wYy0+YXJncyk7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0jdW5kZWYgVVNFX0JJVFMKLSAgaWYgKHVzZWRfYml0cyAhPSAweGZmZmZmZmZmKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAoYml0cyAweCVseCB1bmRlZmluZWQpOiAlcyAlcyIpLAotCSAgICAgIH51c2VkX2JpdHMgJiAweGZmZmZmZmZmLCBvcGMtPm5hbWUsIG9wYy0+YXJncyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgYXNzZW1ibGVzIGFuIGluc3RydWN0aW9uIGludG8gaXRzIGJpbmFyeSBmb3JtYXQuICBBcyBhCi0gICBzaWRlIGVmZmVjdCwgaXQgc2V0cyBvbmUgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZXMgaW1tX3JlbG9jIG9yCi0gICBvZmZzZXRfcmVsb2MgdG8gdGhlIHR5cGUgb2YgcmVsb2NhdGlvbiB0byBkbyBpZiBvbmUgb2YgdGhlIG9wZXJhbmRzCi0gICBpcyBhbiBhZGRyZXNzIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19pcCAoc3RyLCBpcCkKLSAgICAgY2hhciAqc3RyOwotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgY2hhciAqczsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgY2hhciBjOwotICBzdHJ1Y3QgbWlwc19vcGNvZGUgKmluc247Ci0gIGNoYXIgKmFyZ3NTdGFydDsKLSAgdW5zaWduZWQgaW50IHJlZ25vOwotICB1bnNpZ25lZCBpbnQgbGFzdHJlZ25vID0gMDsKLSAgY2hhciAqc19yZXNldDsKLSAgY2hhciBzYXZlX2MgPSAwOwotICBpbnQgZnVsbF9vcGNvZGVfbWF0Y2ggPSAxOwotCi0gIGluc25fZXJyb3IgPSBOVUxMOwotCi0gIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBjb250YWlucyBhICcuJywgd2UgZmlyc3QgdHJ5IHRvIG1hdGNoIGFuIGluc3RydWN0aW9uCi0gICAgIGluY2x1ZGluZyB0aGUgJy4nLiAgVGhlbiB3ZSB0cnkgYWdhaW4gd2l0aG91dCB0aGUgJy4nLiAgKi8KLSAgaW5zbiA9IE5VTEw7Ci0gIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKTsgKytzKQotICAgIGNvbnRpbnVlOwotCi0gIC8qIElmIHdlIHN0b3BwZWQgb24gd2hpdGVzcGFjZSwgdGhlbiByZXBsYWNlIHRoZSB3aGl0ZXNwYWNlIHdpdGggbnVsbCBmb3IKLSAgICAgdGhlIGNhbGwgdG8gaGFzaF9maW5kLiAgU2F2ZSB0aGUgY2hhcmFjdGVyIHdlIHJlcGxhY2VkIGp1c3QgaW4gY2FzZSB3ZQotICAgICBoYXZlIHRvIHJlLXBhcnNlIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotICAgIHsKLSAgICAgIHNhdmVfYyA9ICpzOwotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgfQotCQotICBpbnNuID0gKHN0cnVjdCBtaXBzX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cik7Ci0KLSAgLyogSWYgd2UgZGlkbid0IGZpbmQgdGhlIGluc3RydWN0aW9uIGluIHRoZSBvcGNvZGUgdGFibGUsIHRyeSBhZ2FpbiwgYnV0Ci0gICAgIHRoaXMgdGltZSB3aXRoIGp1c3QgdGhlIGluc3RydWN0aW9uIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZyB0aGUKLSAgICAgZmlyc3QgJy4nLiAgKi8KLSAgaWYgKGluc24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBSZXN0b3JlIHRoZSBjaGFyYWN0ZXIgd2Ugb3ZlcndyaXRlIGFib3ZlIChpZiBhbnkpLiAgKi8gCi0gICAgICBpZiAoc2F2ZV9jKQotCSooLS1zKSA9IHNhdmVfYzsKLQotICAgICAgLyogU2NhbiB1cCB0byB0aGUgZmlyc3QgJy4nIG9yIHdoaXRlc3BhY2UuICAqLwotICAgICAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICpzICE9ICcuJyAmJiAhaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKTsgKytzKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB3ZSBkaWQgbm90IGZpbmQgYSAnLicsIHRoZW4gd2UgY2FuIHF1aXQgbm93LiAgKi8KLSAgICAgIGlmICgqcyAhPSAnLicpCi0JewotCSAgaW5zbl9lcnJvciA9ICJ1bnJlY29nbml6ZWQgb3Bjb2RlIjsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIExvb2t1cCB0aGUgaW5zdHJ1Y3Rpb24gaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgICBpZiAoKGluc24gPSAoc3RydWN0IG1pcHNfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgc3RyKSkgPT0gTlVMTCkKLQl7Ci0JICBpbnNuX2Vycm9yID0gInVucmVjb2duaXplZCBvcGNvZGUiOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgZnVsbF9vcGNvZGVfbWF0Y2ggPSAwOwotICAgIH0KLQotICBhcmdzU3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIGFzc2VydCAoc3RyY21wIChpbnNuLT5uYW1lLCBzdHIpID09IDApOwotCi0gICAgICBpZiAoT1BDT0RFX0lTX01FTUJFUiAoaW5zbiwgbWlwc19vcHRzLmlzYSwgbWlwc19jcHUpKQotCW9rID0gdHJ1ZTsKLSAgICAgIGVsc2UgCi0Jb2sgPSBmYWxzZTsKLSAgICAgIAotICAgICAgaWYgKGluc24tPnBpbmZvICE9IElOU05fTUFDUk8pCi0JewotCSAgaWYgKG1pcHNfY3B1ID09IDQ2NTAgJiYgKGluc24tPnBpbmZvICYgRlBfRCkgIT0gMCkKLQkgICAgb2sgPSBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIG9rKQotCXsKLQkgIGlmIChpbnNuICsgMSA8ICZtaXBzX29wY29kZXNbTlVNT1BDT0RFU10KLQkgICAgICAmJiBzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgICsraW5zbjsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0JICAgICAgc3ByaW50ZiAoYnVmLCAKLQkJICAgICAgIF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yOiAlZCAoTUlQUyVkKSIpLAotCQkgICAgICAgbWlwc19jcHUsIG1pcHNfb3B0cy5pc2EpOwotCQkgICAgICAgCi0JICAgICAgaW5zbl9lcnJvciA9IGJ1ZjsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlwLT5pbnNuX21vID0gaW5zbjsKLSAgICAgIGlwLT5pbnNuX29wY29kZSA9IGluc24tPm1hdGNoOwotICAgICAgZm9yIChhcmdzID0gaW5zbi0+YXJnczs7ICsrYXJncykKLQl7Ci0JICBpZiAoKnMgPT0gJyAnKQotCSAgICArK3M7Ci0JICBzd2l0Y2ggKCphcmdzKQotCSAgICB7Ci0JICAgIGNhc2UgJ1wwJzoJCS8qIGVuZCBvZiBhcmdzICovCi0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCXJldHVybjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcsJzoKLQkgICAgICBpZiAoKnMrKyA9PSAqYXJncykKLQkJY29udGludWU7Ci0JICAgICAgcy0tOwotCSAgICAgIHN3aXRjaCAoKisrYXJncykKLQkJewotCQljYXNlICdyJzoKLQkJY2FzZSAndic6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAyMTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICd3JzoKLQkJY2FzZSAnVyc6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAxNjsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdWJzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDExOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnKCc6Ci0JICAgICAgLyogSGFuZGxlIG9wdGlvbmFsIGJhc2UgcmVnaXN0ZXIuCi0JCSBFaXRoZXIgdGhlIGJhc2UgcmVnaXN0ZXIgaXMgb21pdHRlZCBvcgotCQkgd2UgbXVzdCBoYXZlIGEgbGVmdCBwYXJlbi4gKi8KLQkgICAgICAvKiBUaGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgbmV4dCBvcGVyYW5kIHNwZWNpZmllcgotCQkgaXMgYSBiYXNlIHJlZ2lzdGVyIHNwZWNpZmljYXRpb24uICAqLwotCSAgICAgIGFzc2VydCAoYXJnc1sxXSA9PSAnYicgfHwgYXJnc1sxXSA9PSAnNScKLQkJICAgICAgfHwgYXJnc1sxXSA9PSAnLScgfHwgYXJnc1sxXSA9PSAnNCcpOwotCSAgICAgIGlmICgqcyA9PSAnXDAnKQotCQlyZXR1cm47Ci0KLQkgICAgY2FzZSAnKSc6CQkvKiB0aGVzZSBtdXN0IG1hdGNoIGV4YWN0bHkgKi8KLQkgICAgICBpZiAoKnMrKyA9PSAqYXJncykKLQkJY29udGludWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnPCc6CQkvKiBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCAqLwotCSAgICAgIC8qCi0JICAgICAgICogQWNjb3JkaW5nIHRvIHRoZSBtYW51YWwsIGlmIHRoZSBzaGlmdCBhbW91bnQgaXMgZ3JlYXRlcgotCSAgICAgICAqIHRoYW4gMzEgb3IgbGVzcyB0aGFuIDAgdGhlIHRoZSBzaGlmdCBhbW91bnQgc2hvdWxkIGJlCi0JICAgICAgICogbW9kIDMyLiBJbiByZWFsaXR5IHRoZSBtaXBzIGFzc2VtYmxlciBpc3N1ZXMgYW4gZXJyb3IuCi0JICAgICAgICogV2UgaXNzdWUgYSB3YXJuaW5nIGFuZCBtYXNrIG91dCBhbGwgYnV0IHRoZSBsb3cgNSBiaXRzLgotCSAgICAgICAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7Ci0JICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAzMSkKLQkJewotCQkgIGFzX3dhcm4gKF8oIkltcHJvcGVyIHNoaWZ0IGFtb3VudCAoJWxkKSIpLAotCQkJICAgKGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlcik7Ci0JCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyICYgMHgxZjsKLQkJfQotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgNjsKLQkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJz4nOgkJLyogc2hpZnQgYW1vdW50IG1pbnVzIDMyICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA8IDMyCi0JCSAgfHwgKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDYzKQotCQlicmVhazsKLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gKGltbV9leHByLlhfYWRkX251bWJlciAtIDMyKSA8PCA2OwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQotCSAgICBjYXNlICdrJzoJCS8qIGNhY2hlIGNvZGUgKi8KLQkgICAgY2FzZSAnaCc6CQkvKiBwcmVmeCBjb2RlICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDMxKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiSW52YWxpZCB2YWx1ZSBmb3IgYCVzJyAoJWx1KSIpLAotCQkJICAgaXAtPmluc25fbW8tPm5hbWUsCi0JCQkgICAodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHgxZjsKLQkJfQotCSAgICAgIGlmICgqYXJncyA9PSAnaycpCi0JCWlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgT1BfU0hfQ0FDSEU7Ci0JICAgICAgZWxzZQotCQlpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IE9QX1NIX1BSRUZYOwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnYyc6CQkvKiBicmVhayBjb2RlICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAxMDIzKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiSWxsZWdhbCBicmVhayBjb2RlICglbGQpIiksCi0JCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHgzZmY7Ci0JCX0KLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IDE2OwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAncSc6CQkvKiBsb3dlciBicmVhayBjb2RlICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAxMDIzKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiSWxsZWdhbCBsb3dlciBicmVhayBjb2RlICglbGQpIiksCi0JCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHgzZmY7Ci0JCX0KLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IDY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdCJzoJCS8qIHN5c2NhbGwgY29kZSAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7Ci0JICAgICAgaWYgKCh1bnNpZ25lZCkgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gMHhmZmZmZikKLQkJYXNfd2FybiAoXygiSWxsZWdhbCBzeXNjYWxsIGNvZGUgKCVsZCkiKSwKLQkJCSAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IDY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgY2FzZSAnQyc6ICAgICAgICAgICAvKiBDb3Byb2Nlc3NvciBjb2RlICovCi0gICAgICAgICAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7Ci0gICAgICAgICAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49ICgxPDwyNSkpCi0JCXsKLSAgICAgICAgICAgICAgICAgIGFzX3dhcm4gKF8oIkNvcHJvY2Nlc29yIGNvZGUgPiAyNSBiaXRzICglbGQpIiksCi0JCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAoKDE8PDI1KSAtIDEpOwotCQl9Ci0gICAgICAgICAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0gICAgICAgICAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgICAgICAgICAgcyA9IGV4cHJfZW5kOwotICAgICAgICAgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdQJzoJCS8qIFBlcmZvcm1hbmNlIHJlZ2lzdGVyICovCi0gICAgICAgICAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7Ci0gICAgICAgICAgICAgIGlmIChpbW1fZXhwci5YX2FkZF9udW1iZXIgIT0gMCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgIT0gMSkKLQkJewotICAgICAgICAgICAgICAgICAgYXNfd2FybiAoXygiSW52YWxpZGF0ZSBwZXJmb3JtYW5jZSByZWdzdGVyICglbGQpIiksCi0JCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAxOwotCQl9Ci0gICAgICAgICAgICAgIGlwLT5pbnNuX29wY29kZSB8PSAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IDEpOwotICAgICAgICAgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0gICAgICAgICAgICAgIHMgPSBleHByX2VuZDsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnYic6CQkvKiBiYXNlIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ2QnOgkJLyogZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAncyc6CQkvKiBzb3VyY2UgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAndCc6CQkvKiB0YXJnZXQgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAncic6CQkvKiBib3RoIHRhcmdldCBhbmQgc291cmNlICovCi0JICAgIGNhc2UgJ3YnOgkJLyogYm90aCBkZXN0IGFuZCBzb3VyY2UgKi8KLQkgICAgY2FzZSAndyc6CQkvKiBib3RoIGRlc3QgYW5kIHRhcmdldCAqLwotCSAgICBjYXNlICdFJzoJCS8qIGNvcHJvY2Vzc29yIHRhcmdldCByZWdpc3RlciAqLwotCSAgICBjYXNlICdHJzoJCS8qIGNvcHJvY2Vzc29yIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ3gnOgkJLyogaWdub3JlIHJlZ2lzdGVyIG5hbWUgKi8KLQkgICAgY2FzZSAneic6CQkvKiBtdXN0IGJlIHplcm8gcmVnaXN0ZXIgKi8KLQkgICAgICBzX3Jlc2V0ID0gczsKLQkgICAgICBpZiAoc1swXSA9PSAnJCcpCi0JCXsKLQotCQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc1sxXSkpCi0JCSAgICB7Ci0JCSAgICAgICsrczsKLQkJICAgICAgcmVnbm8gPSAwOwotCQkgICAgICBkbwotCQkJewotCQkJICByZWdubyAqPSAxMDsKLQkJCSAgcmVnbm8gKz0gKnMgLSAnMCc7Ci0JCQkgICsrczsKLQkJCX0KLQkJICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpOwotCQkgICAgICBpZiAocmVnbm8gPiAzMSkKLQkJCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlciBudW1iZXIgKCVkKSIpLCByZWdubyk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKmFyZ3MgPT0gJ0UnIHx8ICphcmdzID09ICdHJykKLQkJICAgIGdvdG8gbm90cmVnOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKHNbMV0gPT0gJ2YnICYmIHNbMl0gPT0gJ3AnKQotCQkJewotCQkJICBzICs9IDM7Ci0JCQkgIHJlZ25vID0gRlA7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ3MnICYmIHNbMl0gPT0gJ3AnKQotCQkJewotCQkJICBzICs9IDM7Ci0JCQkgIHJlZ25vID0gU1A7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2cnICYmIHNbMl0gPT0gJ3AnKQotCQkJewotCQkJICBzICs9IDM7Ci0JCQkgIHJlZ25vID0gR1A7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2EnICYmIHNbMl0gPT0gJ3QnKQotCQkJewotCQkJICBzICs9IDM7Ci0JCQkgIHJlZ25vID0gQVQ7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2snICYmIHNbMl0gPT0gJ3QnICYmIHNbM10gPT0gJzAnKQotCQkJewotCQkJICBzICs9IDQ7Ci0JCQkgIHJlZ25vID0gS1QwOwotCQkJfQotCQkgICAgICBlbHNlIGlmIChzWzFdID09ICdrJyAmJiBzWzJdID09ICd0JyAmJiBzWzNdID09ICcxJykKLQkJCXsKLQkJCSAgcyArPSA0OwotCQkJICByZWdubyA9IEtUMTsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoaXRibF9oYXZlX2VudHJpZXMpCi0JCQl7Ci0JCQkgIGNoYXIgKnAsICpuOwotCQkJICB1bnNpZ25lZCBsb25nIHI7Ci0KLQkJCSAgcCA9IHMgKyAxOyAJLyogYWR2YW5jZSBwYXN0ICckJyAqLwotCQkJICBuID0gaXRibF9nZXRfZmllbGQgKCZwKTsgIC8qIG4gaXMgbmFtZSAqLwotCi0JCQkgIC8qIFNlZSBpZiB0aGlzIGlzIGEgcmVnaXN0ZXIgZGVmaW5lZCBpbiBhbgotCQkJICAgICBpdGJsIGVudHJ5LiAgKi8KLQkJCSAgaWYgKGl0YmxfZ2V0X3JlZ192YWwgKG4sICZyKSkKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBHZXRfZmllbGQgYWR2YW5jZXMgdG8gdGhlIHN0YXJ0IG9mCi0JCQkJIHRoZSBuZXh0IGZpZWxkLCBzbyB3ZSBuZWVkIHRvIGJhY2sKLQkJCQkgcmFjayB0byB0aGUgZW5kIG9mIHRoZSBsYXN0IGZpZWxkLiAgKi8KLQkJCSAgICAgIGlmIChwKSAKLQkJCQlzID0gcCAtIDE7Ci0JCQkgICAgICBlbHNlIAotCQkJCXMgPSBzdHJjaHIgKHMsICdcMCcpOwotCQkJICAgICAgcmVnbm8gPSByOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIGdvdG8gbm90cmVnOwotCQkJICB9Ci0JCSAgICAgIGVsc2UKLQkJCWdvdG8gbm90cmVnOwotCQkgICAgfQotCQkgIGlmIChyZWdubyA9PSBBVAotCQkgICAgICAmJiAhIG1pcHNfb3B0cy5ub2F0Ci0JCSAgICAgICYmICphcmdzICE9ICdFJwotCQkgICAgICAmJiAqYXJncyAhPSAnRycpCi0JCSAgICBhc193YXJuIChfKCJVc2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiKSk7Ci0JCSAgYyA9ICphcmdzOwotCQkgIGlmICgqcyA9PSAnICcpCi0JCSAgICBzKys7Ci0JCSAgaWYgKGFyZ3NbMV0gIT0gKnMpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjID09ICdyJyB8fCBjID09ICd2JyB8fCBjID09ICd3JykKLQkJCXsKLQkJCSAgcmVnbm8gPSBsYXN0cmVnbm87Ci0JCQkgIHMgPSBzX3Jlc2V0OwotCQkJICBhcmdzKys7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgLyogJ3onIG9ubHkgbWF0Y2hlcyAkMC4gICovCi0JCSAgaWYgKGMgPT0gJ3onICYmIHJlZ25vICE9IDApCi0JCSAgICBicmVhazsKLQotCS8qIE5vdyB0aGF0IHdlIGhhdmUgYXNzZW1ibGVkIG9uZSBvcGVyYW5kLCB3ZSB1c2UgdGhlIGFyZ3Mgc3RyaW5nIAotCSAqIHRvIGZpZ3VyZSBvdXQgd2hlcmUgaXQgZ29lcyBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0JCSAgc3dpdGNoIChjKQotCQkgICAgewotCQkgICAgY2FzZSAncic6Ci0JCSAgICBjYXNlICdzJzoKLQkJICAgIGNhc2UgJ3YnOgotCQkgICAgY2FzZSAnYic6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAyMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdkJzoKLQkJICAgIGNhc2UgJ0cnOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMTE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAndyc6Ci0JCSAgICBjYXNlICd0JzoKLQkJICAgIGNhc2UgJ0UnOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMTY7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAneCc6Ci0JCSAgICAgIC8qIFRoaXMgY2FzZSBleGlzdHMgYmVjYXVzZSBvbiB0aGUgcjMwMDAgdHJ1bmMKLQkJCSBleHBhbmRzIGludG8gYSBtYWNybyB3aGljaCByZXF1aXJlcyBhIGdwCi0JCQkgcmVnaXN0ZXIuICBPbiB0aGUgcjYwMDAgb3IgcjQwMDAgaXQgaXMKLQkJCSBhc3NlbWJsZWQgaW50byBhIHNpbmdsZSBpbnN0cnVjdGlvbiB3aGljaAotCQkJIGlnbm9yZXMgdGhlIHJlZ2lzdGVyLiAgVGh1cyB0aGUgaW5zbiB2ZXJzaW9uCi0JCQkgaXMgTUlQU19JU0EyIGFuZCB1c2VzICd4JywgYW5kIHRoZSBtYWNybwotCQkJIHZlcnNpb24gaXMgTUlQU19JU0ExIGFuZCB1c2VzICd0Jy4gICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAneic6Ci0JCSAgICAgIC8qIFRoaXMgY2FzZSBpcyBmb3IgdGhlIGRpdiBpbnN0cnVjdGlvbiwgd2hpY2gKLQkJCSBhY3RzIGRpZmZlcmVudGx5IGlmIHRoZSBkZXN0aW5hdGlvbiBhcmd1bWVudAotCQkJIGlzICQwLiAgVGhpcyBvbmx5IG1hdGNoZXMgJDAsIGFuZCBpcyBjaGVja2VkCi0JCQkgb3V0c2lkZSB0aGUgc3dpdGNoLiAgKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdEJzoKLQkJICAgICAgLyogSXRibCBvcGVyYW5kOyBub3QgeWV0IGltcGxlbWVudGVkLiBGSVhNRSA/PyAqLwotCQkgICAgICBicmVhazsKLQkJICAgICAgLyogV2hhdCBhYm91dCBhbGwgb3RoZXIgb3BlcmFuZHMgbGlrZSAnaScsIHdoaWNoCi0JCQkgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgb3Bjb2RlIHRhYmxlPyAqLwotCQkgICAgfQotCQkgIGxhc3RyZWdubyA9IHJlZ25vOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIG5vdHJlZzoKLQkgICAgICBzd2l0Y2ggKCphcmdzKyspCi0JCXsKLQkJY2FzZSAncic6Ci0JCWNhc2UgJ3YnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMjE7Ci0JCSAgY29udGludWU7Ci0JCWNhc2UgJ3cnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMTY7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdEJzoJCS8qIGZsb2F0aW5nIHBvaW50IGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ1MnOgkJLyogZmxvYXRpbmcgcG9pbnQgc291cmNlIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ1QnOgkJLyogZmxvYXRpbmcgcG9pbnQgdGFyZ2V0IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ1InOgkJLyogZmxvYXRpbmcgcG9pbnQgc291cmNlIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ1YnOgotCSAgICBjYXNlICdXJzoKLQkgICAgICBzX3Jlc2V0ID0gczsKLQkgICAgICBpZiAoc1swXSA9PSAnJCcgJiYgc1sxXSA9PSAnZicgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHNbMl0pKQotCQl7Ci0JCSAgcyArPSAyOwotCQkgIHJlZ25vID0gMDsKLQkJICBkbwotCQkgICAgewotCQkgICAgICByZWdubyAqPSAxMDsKLQkJICAgICAgcmVnbm8gKz0gKnMgLSAnMCc7Ci0JCSAgICAgICsrczsKLQkJICAgIH0KLQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSk7Ci0KLQkJICBpZiAocmVnbm8gPiAzMSkKLQkJICAgIGFzX2JhZCAoXygiSW52YWxpZCBmbG9hdCByZWdpc3RlciBudW1iZXIgKCVkKSIpLCByZWdubyk7Ci0KLQkJICBpZiAoKHJlZ25vICYgMSkgIT0gMAotCQkgICAgICAmJiAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkKLQkJICAgICAgJiYgISAoc3RyY21wIChzdHIsICJtdGMxIikgPT0gMAotCQkJICAgIHx8IHN0cmNtcCAoc3RyLCAibWZjMSIpID09IDAKLQkJCSAgICB8fCBzdHJjbXAgKHN0ciwgImx3YzEiKSA9PSAwCi0JCQkgICAgfHwgc3RyY21wIChzdHIsICJzd2MxIikgPT0gMAotCQkJICAgIHx8IHN0cmNtcCAoc3RyLCAibC5zIikgPT0gMAotCQkJICAgIHx8IHN0cmNtcCAoc3RyLCAicy5zIikgPT0gMCkpCi0JCSAgICBhc193YXJuIChfKCJGbG9hdCByZWdpc3RlciBzaG91bGQgYmUgZXZlbiwgd2FzICVkIiksCi0JCQkgICAgIHJlZ25vKTsKLQotCQkgIGMgPSAqYXJnczsKLQkJICBpZiAoKnMgPT0gJyAnKQotCQkgICAgcysrOwotCQkgIGlmIChhcmdzWzFdICE9ICpzKQotCQkgICAgewotCQkgICAgICBpZiAoYyA9PSAnVicgfHwgYyA9PSAnVycpCi0JCQl7Ci0JCQkgIHJlZ25vID0gbGFzdHJlZ25vOwotCQkJICBzID0gc19yZXNldDsKLQkJCSAgYXJncysrOwotCQkJfQotCQkgICAgfQotCQkgIHN3aXRjaCAoYykKLQkJICAgIHsKLQkJICAgIGNhc2UgJ0QnOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgNjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdWJzoKLQkJICAgIGNhc2UgJ1MnOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMTE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnVyc6Ci0JCSAgICBjYXNlICdUJzoKLQkJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IDE2OwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1InOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMjE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGxhc3RyZWdubyA9IHJlZ25vOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQotCSAgICAgIHN3aXRjaCAoKmFyZ3MrKykKLQkJewotCQljYXNlICdWJzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDExOwotCQkgIGNvbnRpbnVlOwotCQljYXNlICdXJzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDE2OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnSSc6Ci0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2JpZwotCQkgICYmIGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQkJaW5zbl9lcnJvciA9IF8oImFic29sdXRlIGV4cHJlc3Npb24gcmVxdWlyZWQiKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnQSc6Ci0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJm9mZnNldF9leHByLCBzKTsKLQkgICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfMzI7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ0YnOgotCSAgICBjYXNlICdMJzoKLQkgICAgY2FzZSAnZic6Ci0JICAgIGNhc2UgJ2wnOgotCSAgICAgIHsKLQkJaW50IGY2NDsKLQkJY2hhciAqc2F2ZV9pbjsKLQkJY2hhciAqZXJyOwotCQl1bnNpZ25lZCBjaGFyIHRlbXBbOF07Ci0JCWludCBsZW47Ci0JCXVuc2lnbmVkIGludCBsZW5ndGg7Ci0JCXNlZ1Qgc2VnOwotCQlzdWJzZWdUIHN1YnNlZzsKLQkJY2hhciAqcDsKLQotCQkvKiBUaGVzZSBvbmx5IGFwcGVhciBhcyB0aGUgbGFzdCBvcGVyYW5kIGluIGFuCi0JCSAgIGluc3RydWN0aW9uLCBhbmQgZXZlcnkgaW5zdHJ1Y3Rpb24gdGhhdCBhY2NlcHRzCi0JCSAgIHRoZW0gaW4gYW55IHZhcmlhbnQgYWNjZXB0cyB0aGVtIGluIGFsbCB2YXJpYW50cy4KLQkJICAgVGhpcyBtZWFucyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGJhY2tpbmcgb3V0Ci0JCSAgIGFueSBjaGFuZ2VzIGlmIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaC4KLQotCQkgICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0gaXMgdGhlIHNpemUgb2YgdGhlCi0JCSAgIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGFuZCB3aGVyZSBpdCBnb2VzLiAgRm9yICdGJwotCQkgICBhbmQgJ0wnIHRoZSBjb25zdGFudCBpcyA2NCBiaXRzOyBmb3IgJ2YnIGFuZCAnbCcgaXQKLQkJICAgaXMgMzIgYml0cy4gIFdoZXJlIHRoZSBjb25zdGFudCBpcyBwbGFjZWQgaXMgYmFzZWQKLQkJICAgb24gaG93IHRoZSBNSVBTIGFzc2VtYmxlciBkb2VzIHRoaW5nczoKLQkJICAgIEYgLS0gLnJkYXRhCi0JCSAgICBMIC0tIC5saXQ4Ci0JCSAgICBmIC0tIGltbWVkaWF0ZSB2YWx1ZQotCQkgICAgbCAtLSAubGl0NAotCi0JCSAgICBUaGUgLmxpdDQgYW5kIC5saXQ4IHNlY3Rpb25zIGFyZSBvbmx5IHVzZWQgaWYKLQkJICAgIHBlcm1pdHRlZCBieSB0aGUgLUcgYXJndW1lbnQuCi0KLQkJICAgIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSwgd2UgdXNlIHRoZQotCQkgICAgLmxpdDggc2VjdGlvbiBidXQgbm90IHRoZSAubGl0NCBzZWN0aW9uICh3ZSBjYW4gZG8KLQkJICAgIC5saXQ0IGlubGluZSBlYXNpbHk7IHdlIG5lZWQgdG8gcHV0IC5saXQ4Ci0JCSAgICBzb21ld2hlcmUgaW4gdGhlIGRhdGEgc2VnbWVudCwgYW5kIHVzaW5nIC5saXQ4Ci0JCSAgICBwZXJtaXRzIHRoZSBsaW5rZXIgdG8gZXZlbnR1YWxseSBjb21iaW5lIGlkZW50aWNhbAotCQkgICAgLmxpdDggZW50cmllcykuICAqLwotCi0JCWY2NCA9ICphcmdzID09ICdGJyB8fCAqYXJncyA9PSAnTCc7Ci0KLQkJc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQkJZXJyID0gbWRfYXRvZiAoZjY0ID8gJ2QnIDogJ2YnLCAoY2hhciAqKSB0ZW1wLCAmbGVuKTsKLQkJbGVuZ3RoID0gbGVuOwotCQlzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQlpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotCQlpZiAoZXJyICE9IE5VTEwgJiYgKmVyciAhPSAnXDAnKQotCQkgIHsKLQkJICAgIGFzX2JhZCAoXygiQmFkIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50OiAlcyIpLCBlcnIpOwotCQkgICAgbWVtc2V0ICh0ZW1wLCAnXDAnLCBzaXplb2YgdGVtcCk7Ci0JCSAgICBsZW5ndGggPSBmNjQgPyA4IDogNDsKLQkJICB9Ci0KLQkJYXNzZXJ0IChsZW5ndGggPT0gKGY2NCA/IDggOiA0KSk7Ci0KLQkJaWYgKCphcmdzID09ICdmJwotCQkgICAgfHwgKCphcmdzID09ICdsJwotCQkJJiYgKCEgVVNFX0dMT0JBTF9QT0lOVEVSX09QVAotCQkJICAgIHx8IG1pcHNfcGljID09IEVNQkVEREVEX1BJQwotCQkJICAgIHx8IGdfc3dpdGNoX3ZhbHVlIDwgNAotCQkJICAgIHx8ICh0ZW1wWzBdID09IDAgJiYgdGVtcFsxXSA9PSAwKQotCQkJICAgIHx8ICh0ZW1wWzJdID09IDAgJiYgdGVtcFszXSA9PSAwKSkpKQotCQkgIHsKLQkJICAgIGltbV9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCQkgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JCSAgICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRsMzIgKHRlbXApOwotCQkgICAgZWxzZQotCQkgICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0YjMyICh0ZW1wKTsKLQkJICB9Ci0JCWVsc2UgaWYgKGxlbmd0aCA+IDQKLQkJCSAmJiAoKHRlbXBbMF0gPT0gMCAmJiB0ZW1wWzFdID09IDApCi0JCQkgICAgIHx8ICh0ZW1wWzJdID09IDAgJiYgdGVtcFszXSA9PSAwKSkKLQkJCSAmJiAoKHRlbXBbNF0gPT0gMCAmJiB0ZW1wWzVdID09IDApCi0JCQkgICAgIHx8ICh0ZW1wWzZdID09IDAgJiYgdGVtcFs3XSA9PSAwKSkpCi0JCSAgewotCQkgICAgLyogVGhlIHZhbHVlIGlzIHNpbXBsZSBlbm91Z2ggdG8gbG9hZCB3aXRoIGEKLSAgICAgICAgICAgICAgICAgICAgICAgY291cGxlIG9mIGluc3RydWN0aW9ucy4gIEluIG1pcHMxIG1vZGUsIHNldAotICAgICAgICAgICAgICAgICAgICAgICBpbW1fZXhwciB0byB0aGUgaGlnaCBvcmRlciAzMiBiaXRzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfZXhwciB0byB0aGUgbG93IG9yZGVyIDMyIGJpdHMuCi0gICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgc2V0IGltbV9leHByIHRvIHRoZSBlbnRpcmUgNjQgYml0Ci0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50LiAgKi8KLQkJICAgIGlmICghIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCSAgICAgIHsKLQkJCWltbV9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCQkJb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JCQlpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQkJCSAgewotCQkJICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRsMzIgKHRlbXAgKyA0KTsKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0bDMyICh0ZW1wKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGIzMiAodGVtcCk7Ci0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGIzMiAodGVtcCArIDQpOwotCQkJICB9Ci0JCQlpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JCQkgIG9mZnNldF9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoc2l6ZW9mIChpbW1fZXhwci5YX2FkZF9udW1iZXIpID4gNCkKLQkJICAgICAgewotCQkJaW1tX2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JCQlpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQkJCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGw2NCAodGVtcCk7Ci0JCQllbHNlCi0JCQkgIGltbV9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRiNjQgKHRlbXApOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWltbV9leHByLlhfb3AgPSBPX2JpZzsKLQkJCWltbV9leHByLlhfYWRkX251bWJlciA9IDQ7Ci0JCQlpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQkJCSAgewotCQkJICAgIGdlbmVyaWNfYmlnbnVtWzBdID0gYmZkX2dldGwxNiAodGVtcCk7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMV0gPSBiZmRfZ2V0bDE2ICh0ZW1wICsgMik7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bMl0gPSBiZmRfZ2V0bDE2ICh0ZW1wICsgNCk7Ci0JCQkgICAgZ2VuZXJpY19iaWdudW1bM10gPSBiZmRfZ2V0bDE2ICh0ZW1wICsgNik7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGdlbmVyaWNfYmlnbnVtWzBdID0gYmZkX2dldGIxNiAodGVtcCArIDYpOwotCQkJICAgIGdlbmVyaWNfYmlnbnVtWzFdID0gYmZkX2dldGIxNiAodGVtcCArIDQpOwotCQkJICAgIGdlbmVyaWNfYmlnbnVtWzJdID0gYmZkX2dldGIxNiAodGVtcCArIDIpOwotCQkJICAgIGdlbmVyaWNfYmlnbnVtWzNdID0gYmZkX2dldGIxNiAodGVtcCk7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKm5ld25hbWU7Ci0JCSAgICBzZWdUIG5ld19zZWc7Ci0KLQkJICAgIC8qIFN3aXRjaCB0byB0aGUgcmlnaHQgc2VjdGlvbi4gICovCi0JCSAgICBzZWcgPSBub3dfc2VnOwotCQkgICAgc3Vic2VnID0gbm93X3N1YnNlZzsKLQkJICAgIHN3aXRjaCAoKmFyZ3MpCi0JCSAgICAgIHsKLQkJICAgICAgZGVmYXVsdDogLyogdW51c2VkIGRlZmF1bHQgY2FzZSBhdm9pZHMgd2FybmluZ3MuICAqLwotCQkgICAgICBjYXNlICdMJzoKLQkJCW5ld25hbWUgPSBSREFUQV9TRUNUSU9OX05BTUU7Ci0JCQlpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCAmJiBnX3N3aXRjaF92YWx1ZSA+PSA4KQotCQkJICBuZXduYW1lID0gIi5saXQ4IjsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdGJzoKLQkJCW5ld25hbWUgPSBSREFUQV9TRUNUSU9OX05BTUU7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnbCc6Ci0JCQlhc3NlcnQgKCFVU0VfR0xPQkFMX1BPSU5URVJfT1BUCi0JCQkJfHwgZ19zd2l0Y2hfdmFsdWUgPj0gNCk7Ci0JCQluZXduYW1lID0gIi5saXQ0IjsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgICBuZXdfc2VnID0gc3Vic2VnX25ldyAobmV3bmFtZSwgKHN1YnNlZ1QpIDApOwotCQkgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQkJICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5ld19zZWcsCi0JCQkJCSAgICAgKFNFQ19BTExPQwotCQkJCQkgICAgICB8IFNFQ19MT0FECi0JCQkJCSAgICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJCSAgICAgIHwgU0VDX0RBVEEpKTsKLQkJICAgIGZyYWdfYWxpZ24gKCphcmdzID09ICdsJyA/IDIgOiAzLCAwLCAwKTsKLQkJICAgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkJCSYmIHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgIT0gMCkKLQkJICAgICAgcmVjb3JkX2FsaWdubWVudCAobmV3X3NlZywgNCk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKG5ld19zZWcsICphcmdzID09ICdsJyA/IDIgOiAzKTsKLQkJICAgIGlmIChzZWcgPT0gbm93X3NlZykKLQkJICAgICAgYXNfYmFkIChfKCJDYW4ndCB1c2UgZmxvYXRpbmcgcG9pbnQgaW5zbiBpbiB0aGlzIHNlY3Rpb24iKSk7Ci0KLQkJICAgIC8qIFNldCB0aGUgYXJndW1lbnQgdG8gdGhlIGN1cnJlbnQgYWRkcmVzcyBpbiB0aGUKLQkJICAgICAgIHNlY3Rpb24uICAqLwotCQkgICAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fc3ltYm9sOwotCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sID0KLQkJICAgICAgc3ltYm9sX25ldyAoIkwwXDAwMSIsIG5vd19zZWcsCi0JCQkJICAodmFsdWVUKSBmcmFnX25vd19maXggKCksIGZyYWdfbm93KTsKLQkJICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0KLQkJICAgIC8qIFB1dCB0aGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludG8gdGhlIHNlY3Rpb24uICAqLwotCQkgICAgcCA9IGZyYWdfbW9yZSAoKGludCkgbGVuZ3RoKTsKLQkJICAgIG1lbWNweSAocCwgdGVtcCwgbGVuZ3RoKTsKLQotCQkgICAgLyogU3dpdGNoIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNlY3Rpb24uICAqLwotCQkgICAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnaSc6CQkvKiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0JICAgIGNhc2UgJ2onOgkJLyogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgKi8KLQkgICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfTE8xNjsKLQkgICAgICBjID0gbXlfZ2V0U21hbGxFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGlmIChjICE9ICdcMCcpCi0JCXsKLQkJICBpZiAoYyAhPSAnbCcpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCQlpbW1fZXhwci5YX2FkZF9udW1iZXIgPQotCQkJICAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZjsKLQkJICAgICAgZWxzZSBpZiAoYyA9PSAnaCcpCi0JCQl7Ci0JCQkgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19ISTE2X1M7Ci0JCQkgIGltbV91bm1hdGNoZWRfaGkgPSB0cnVlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQlpbW1fcmVsb2MgPSBCRkRfUkVMT0NfSEkxNjsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCSAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHhmZmZmOwotCQl9Ci0JICAgICAgaWYgKCphcmdzID09ICdpJykKLQkJewotCQkgIGlmICgoYyA9PSAnXDAnICYmIGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgICAgfHwgKChpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gMHgxMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGluc24gKyAxIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXSAmJgotCQkJICAhc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpKQotCQkJYnJlYWs7Ci0JCSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2JpZykKLQkJCWluc25fZXJyb3IgPSBfKCJhYnNvbHV0ZSBleHByZXNzaW9uIHJlcXVpcmVkIik7Ci0JCSAgICAgIGVsc2UKLQkJCWFzX2JhZCAoXygiMTYgYml0IGV4cHJlc3Npb24gbm90IGluIHJhbmdlIDAuLjY1NTM1IikpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW50IG1vcmU7Ci0JCSAgb2Zmc2V0VCBtYXg7Ci0KLQkJICAvKiBUaGUgdXBwZXIgYm91bmQgc2hvdWxkIGJlIDB4ODAwMCwgYnV0Ci0JCSAgICAgdW5mb3J0dW5hdGVseSB0aGUgTUlQUyBhc3NlbWJsZXIgYWNjZXB0cyBudW1iZXJzCi0JCSAgICAgZnJvbSAweDgwMDAgdG8gMHhmZmZmIGFuZCBzaWduIGV4dGVuZHMgdGhlbSwgYW5kCi0JCSAgICAgd2Ugd2FudCB0byBiZSBjb21wYXRpYmxlLiAgV2Ugb25seSBwZXJtaXQgdGhpcwotCQkgICAgIGV4dGVuZGVkIHJhbmdlIGZvciBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdAotCQkgICAgIHByb3ZpZGUgYW55IGZ1cnRoZXIgYWx0ZXJuYXRlcywgc2luY2UgdGhvc2UKLQkJICAgICBhbHRlcm5hdGVzIG1heSBoYW5kbGUgb3RoZXIgY2FzZXMuICBQZW9wbGUgc2hvdWxkCi0JCSAgICAgdXNlIHRoZSBudW1iZXJzIHRoZXkgbWVhbiwgcmF0aGVyIHRoYW4gcmVseWluZyBvbgotCQkgICAgIGEgbXlzdGVyaW91cyBzaWduIGV4dGVuc2lvbi4gICovCi0JCSAgbW9yZSA9IChpbnNuICsgMSA8ICZtaXBzX29wY29kZXNbTlVNT1BDT0RFU10gJiYKLQkJCSAgc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpID09IDApOwotCQkgIGlmIChtb3JlKQotCQkgICAgbWF4ID0gMHg4MDAwOwotCQkgIGVsc2UKLQkJICAgIG1heCA9IDB4MTAwMDA7Ci0JCSAgaWYgKChjID09ICdcMCcgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgICB8fCAoKGltbV9leHByLlhfYWRkX251bWJlciA8IC0weDgwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGltbV9leHByLlhfYWRkX251bWJlciA+PSBtYXgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICYmIGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgICAgfHwgKG1vcmUKLQkJCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMAotCQkJICAmJiBJU0FfSEFTXzY0QklUX1JFR1MgKG1pcHNfb3B0cy5pc2EpCi0JCQkgICYmIGltbV9leHByLlhfdW5zaWduZWQKLQkJCSAgJiYgc2l6ZW9mIChpbW1fZXhwci5YX2FkZF9udW1iZXIpIDw9IDQpKQotCQkgICAgewotCQkgICAgICBpZiAobW9yZSkKLQkJCWJyZWFrOwotCQkgICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQkgICYmIGltbV9leHByLlhfb3AgIT0gT19iaWcpCi0JCQlpbnNuX2Vycm9yID0gXygiYWJzb2x1dGUgZXhwcmVzc2lvbiByZXF1aXJlZCIpOwotCQkgICAgICBlbHNlCi0JCQlhc19iYWQgKF8oIjE2IGJpdCBleHByZXNzaW9uIG5vdCBpbiByYW5nZSAtMzI3NjguLjMyNzY3IikpOwotCQkgICAgfQotCQl9Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ28nOgkJLyogMTYgYml0IG9mZnNldCAqLwotCSAgICAgIGMgPSBteV9nZXRTbWFsbEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHZhbHVlIHdvbid0IGZpdCBpbnRvIGEgMTYgYml0IG9mZnNldCwgdGhlbiBnbwotCQkgZmluZCBhIG1hY3JvIHRoYXQgd2lsbCBnZW5lcmF0ZSB0aGUgMzIgYml0IG9mZnNldAotCQkgY29kZSBwYXR0ZXJuLiAgQXMgYSBzcGVjaWFsIGhhY2ssIHdlIGFjY2VwdCB0aGUKLQkJIGRpZmZlcmVuY2Ugb2YgdHdvIGxvY2FsIHN5bWJvbHMgYXMgYSBjb25zdGFudC4gIFRoaXMKLQkJIGlzIHJlcXVpcmVkIHRvIHN1cHBvc2UgZW1iZWRkZWQgUElDIHN3aXRjaGVzLCB3aGljaAotCQkgdXNlIGFuIGluc3RydWN0aW9uIHdoaWNoIGxvb2tzIGxpa2UKLQkJICAgICBsdyAkNCwkTDEyLSRMUzEyKCQ0KQotCQkgVGhlIHByb2JsZW0gd2l0aCBoYW5kbGluZyB0aGlzIGluIGEgbW9yZSBnZW5lcmFsCi0JCSBmYXNoaW9uIGlzIHRoYXQgdGhlIG1hY3JvIGZ1bmN0aW9uIGRvZXNuJ3QgZXhwZWN0IHRvCi0JCSBzZWUgYW55dGhpbmcgd2hpY2ggY2FuIGJlIGhhbmRsZWQgaW4gYSBzaW5nbGUKLQkJIGNvbnN0YW50IGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAoYyA9PSAwCi0JCSAgJiYgKG9mZnNldF9leHByLlhfb3AgIT0gT19jb25zdGFudAotCQkgICAgICB8fCBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gMHg4MDAwCi0JCSAgICAgIHx8IG9mZnNldF9leHByLlhfYWRkX251bWJlciA8IC0weDgwMDApCi0JCSAgJiYgKG1pcHNfcGljICE9IEVNQkVEREVEX1BJQwotCQkgICAgICB8fCBvZmZzZXRfZXhwci5YX29wICE9IE9fc3VidHJhY3QKLQkJICAgICAgfHwgbm93X3NlZyAhPSB0ZXh0X3NlY3Rpb24KLQkJICAgICAgfHwgKFNfR0VUX1NFR01FTlQgKG9mZnNldF9leHByLlhfb3Bfc3ltYm9sKQotCQkJICAhPSB0ZXh0X3NlY3Rpb24pKSkKLQkJYnJlYWs7Ci0KLQkgICAgICBpZiAoYyA9PSAnaCcgfHwgYyA9PSAnSCcpCi0JCXsKLQkJICBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgYnJlYWs7Ci0JCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0KLQkJICAgIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCQl9Ci0JICAgICAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DX0xPMTY7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3AnOgkJLyogcGMgcmVsYXRpdmUgb2Zmc2V0ICovCi0JICAgICAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DXzE2X1BDUkVMX1MyOwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3UnOgkJLyogdXBwZXIgMTYgYml0cyAqLwotCSAgICAgIGMgPSBteV9nZXRTbWFsbEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX0xPMTY7Ci0JICAgICAgaWYgKGMpCi0JCXsKLQkJICBpZiAoYyAhPSAnbCcpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCQlpbW1fZXhwci5YX2FkZF9udW1iZXIgPQotCQkJICAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4+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+bmV4dDsKLQkgIGZyZWUgKHMpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJUcmllZCB0byBzZXQgdW5yZWNvZ25pemVkIHN5bWJvbDogJXNcbiIpLCBuYW1lKTsKLSAgICB9Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjaDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWJpY2FsbHMgcHNldWRvLW9wLiAgSSBiZWxpZXZlIHRoaXMgaXMgZXF1aXZhbGVudCB0bwotICAgLm9wdGlvbiBwaWMyLiAgSXQgbWVhbnMgdG8gZ2VuZXJhdGUgU1ZSNCBQSUMgY2FsbHMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hYmljYWxscyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBtaXBzX3BpYyA9IFNWUjRfUElDOwotICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKLSAgICB7Ci0gICAgICBpZiAoZ19zd2l0Y2hfc2VlbiAmJiBnX3N3aXRjaF92YWx1ZSAhPSAwKQotCWFzX3dhcm4gKF8oIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgUElDIGNvZGUiKSk7Ci0gICAgICBnX3N3aXRjaF92YWx1ZSA9IDA7Ci0gICAgfQotICBiZmRfc2V0X2dwX3NpemUgKHN0ZG91dHB1dCwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmNwbG9hZCBwc2V1ZG8tb3AuICBUaGlzIGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIFNWUjQKLSAgIFBJQyBjb2RlLiAgSXQgc2V0cyB0aGUgJGdwIHJlZ2lzdGVyIGZvciB0aGUgZnVuY3Rpb24gYmFzZWQgb24gdGhlCi0gICBmdW5jdGlvbiBhZGRyZXNzLCB3aGljaCBpcyBpbiB0aGUgcmVnaXN0ZXIgbmFtZWQgaW4gdGhlIGFyZ3VtZW50LgotICAgVGhpcyB1c2VzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IF9ncF9kaXNwLCB3aGljaCBpcyBoYW5kbGVkIHNwZWNpYWxseQotICAgYnkgdGhlIGxpbmtlci4gIFRoZSByZXN1bHQgaXM6Ci0JbHVpCSRncCwlaGkoX2dwX2Rpc3ApCi0JYWRkaXUJJGdwLCRncCwlbG8oX2dwX2Rpc3ApCi0JYWRkdQkkZ3AsJGdwLC5jcGxvYWQgYXJndW1lbnQKLSAgIFRoZSAuY3Bsb2FkIGFyZ3VtZW50IGlzIG5vcm1hbGx5ICQyNSA9PSAkdDkuICAqLwotCi1zdGF0aWMgdm9pZAotc19jcGxvYWQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXg7Ci0gIGludCBpY250ID0gMDsKLQotICAvKiBJZiB3ZSBhcmUgbm90IGdlbmVyYXRpbmcgU1ZSNCBQSUMgY29kZSwgLmNwbG9hZCBpcyBpZ25vcmVkLiAgKi8KLSAgaWYgKG1pcHNfcGljICE9IFNWUjRfUElDKQotICAgIHsKLSAgICAgIHNfaWdub3JlICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogLmNwbG9hZCBzaG91bGQgYmUgYSBpbiAuc2V0IG5vcmVvcmRlciBzZWN0aW9uLiAgKi8KLSAgaWYgKG1pcHNfb3B0cy5ub3Jlb3JkZXIgPT0gMCkKLSAgICBhc193YXJuIChfKCIuY3Bsb2FkIG5vdCBpbiBub3Jlb3JkZXIgc2VjdGlvbiIpKTsKLQotICBleC5YX29wID0gT19zeW1ib2w7Ci0gIGV4LlhfYWRkX3N5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKCJfZ3BfZGlzcCIpOwotICBleC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gIGV4LlhfYWRkX251bWJlciA9IDA7Ci0KLSAgLyogSW4gRUxGLCB0aGlzIHN5bWJvbCBpcyBpbXBsaWNpdGx5IGFuIFNUVF9PQkpFQ1Qgc3ltYm9sLiAgKi8KLSAgc3ltYm9sX2dldF9iZmRzeW0gKGV4LlhfYWRkX3N5bWJvbCktPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0KLSAgbWFjcm9fYnVpbGRfbHVpICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4LCBHUCk7Ci0gIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4LCAiYWRkaXUiLCAidCxyLGoiLCBHUCwgR1AsCi0JICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQotICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAiYWRkdSIsICJkLHYsdCIsCi0JICAgICAgIEdQLCBHUCwgdGNfZ2V0X3JlZ2lzdGVyICgwKSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuY3ByZXN0b3JlIHBzZXVkby1vcC4gIFRoaXMgc3RvcmVzICRncCBpbnRvIGEgZ2l2ZW4KLSAgIG9mZnNldCBmcm9tICRzcC4gIFRoZSBvZmZzZXQgaXMgcmVtZW1iZXJlZCwgYW5kIGFmdGVyIG1ha2luZyBhIFBJQwotICAgY2FsbCAkZ3AgaXMgcmVzdG9yZWQgZnJvbSB0aGF0IGxvY2F0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfY3ByZXN0b3JlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGV4OwotICBpbnQgaWNudCA9IDA7Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBnZW5lcmF0aW5nIFNWUjQgUElDIGNvZGUsIC5jcHJlc3RvcmUgaXMgaWdub3JlZC4gICovCi0gIGlmIChtaXBzX3BpYyAhPSBTVlI0X1BJQykKLSAgICB7Ci0gICAgICBzX2lnbm9yZSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG1pcHNfY3ByZXN0b3JlX29mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGV4Llhfb3AgPSBPX2NvbnN0YW50OwotICBleC5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICBleC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gIGV4LlhfYWRkX251bWJlciA9IG1pcHNfY3ByZXN0b3JlX29mZnNldDsKLQotICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleCwKLQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCT8gInN3IiA6ICJzZCIpLAotCSAgICAgICAidCxvKGIpIiwgR1AsIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBTUCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuZ3B3b3JkIHBzZXVkby1vcC4gIFRoaXMgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgUElDCi0gICBjb2RlLiAgSXQgZ2VuZXJhdGVzIGEgMzIgYml0IEdQIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZ3B3b3JkIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKmxhYmVsOwotICBleHByZXNzaW9uUyBleDsKLSAgY2hhciAqcDsKLQotICAvKiBXaGVuIG5vdCBnZW5lcmF0aW5nIFBJQyBjb2RlLCB0aGlzIGlzIHRyZWF0ZWQgYXMgLndvcmQuICAqLwotICBpZiAobWlwc19waWMgIT0gU1ZSNF9QSUMpCi0gICAgewotICAgICAgc19jb25zICgyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbGFiZWwgPSBpbnNuX2xhYmVscyAhPSBOVUxMID8gaW5zbl9sYWJlbHMtPmxhYmVsIDogTlVMTDsKLSAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gIGlmIChhdXRvX2FsaWduKQotICAgIG1pcHNfYWxpZ24gKDIsIDAsIGxhYmVsKTsKLSAgbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKTsKLQotICBleHByZXNzaW9uICgmZXgpOwotCi0gIGlmIChleC5YX29wICE9IE9fc3ltYm9sIHx8IGV4LlhfYWRkX251bWJlciAhPSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgdXNlIG9mIC5ncHdvcmQiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLQotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSAwLCA0KTsKLSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsICZleCwgMCwKLQkgICAgICAgQkZEX1JFTE9DX01JUFNfR1BSRUwzMik7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuY3BhZGQgcHNldWRvLW9wLiAgVGhpcyBpcyB1c2VkIHdoZW4gZGVhbGluZyB3aXRoIHN3aXRjaAotICAgdGFibGVzIGluIFNWUjQgUElDIGNvZGUuICAqLwotCi1zdGF0aWMgdm9pZAotc19jcGFkZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgaWNudCA9IDA7Ci0gIGludCByZWc7Ci0KLSAgLyogVGhpcyBpcyBpZ25vcmVkIHdoZW4gbm90IGdlbmVyYXRpbmcgU1ZSNCBQSUMgY29kZS4gICovCi0gIGlmIChtaXBzX3BpYyAhPSBTVlI0X1BJQykKLSAgICB7Ci0gICAgICBzX2lnbm9yZSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEFkZCAkZ3AgdG8gdGhlIHJlZ2lzdGVyIG5hbWVkIGFzIGFuIGFyZ3VtZW50LiAgKi8KLSAgcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgwKTsKLSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSB8fCAhIElTQV9IQVNfNjRCSVRfUkVHUyAobWlwc19vcHRzLmlzYSkpCi0JCT8gImFkZHUiIDogImRhZGR1IiksCi0JICAgICAgICJkLHYsdCIsIHJlZywgcmVnLCBHUCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsgIAotfQotCi0vKiBIYW5kbGUgdGhlIC5pbnNuIHBzZXVkby1vcC4gIFRoaXMgbWFya3MgaW5zdHJ1Y3Rpb24gbGFiZWxzIGluCi0gICBtaXBzMTYgbW9kZS4gIFRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHRvIGhhbmRsZSB0aGVtIHNwZWNpYWxseSwKLSAgIHN1Y2ggYXMgZ2VuZXJhdGluZyBqYWx4IGluc3RydWN0aW9ucyB3aGVuIG5lZWRlZC4gIFdlIGFsc28gbWFrZQotICAgdGhlbSBvZGQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgYXNzZW1ibHksIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZQotICAgcmlnaHQgc29ydCBvZiBjb2RlLiAgV2Ugd2lsbCBtYWtlIHRoZW0gZXZlbiBpbiB0aGUgYWRqdXN0X3N5bXRhYgotICAgcm91dGluZSwgd2hpbGUgbGVhdmluZyB0aGVtIG1hcmtlZC4gIFRoaXMgaXMgY29udmVuaWVudCBmb3IgdGhlCi0gICBkZWJ1Z2dlciBhbmQgdGhlIGRpc2Fzc2VtYmxlci4gIFRoZSBsaW5rZXIga25vd3MgdG8gbWFrZSB0aGVtIG9kZAotICAgYWdhaW4uICAqLwotCi1zdGF0aWMgdm9pZAotc19pbnNuIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChtaXBzX29wdHMubWlwczE2KQotICAgIG1pcHMxNl9tYXJrX2xhYmVscyAoKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuc3RhYm4gZGlyZWN0aXZlLiAgV2UgbmVlZCB0aGVzZSBpbiBvcmRlciB0byBtYXJrIGEgbGFiZWwKLSAgIGFzIGJlaW5nIGEgbWlwczE2IHRleHQgbGFiZWwgY29ycmVjdGx5LiAgU29tZXRpbWVzIHRoZSBjb21waWxlcgotICAgd2lsbCBlbWl0IGEgbGFiZWwsIGZvbGxvd2VkIGJ5IGEgLnN0YWJuLCBhbmQgdGhlbiBzd2l0Y2ggc2VjdGlvbnMuCi0gICBJZiB0aGUgbGFiZWwgYW5kIC5zdGFibiBhcmUgaW4gbWlwczE2IG1vZGUsIHRoZW4gdGhlIGxhYmVsIGlzCi0gICByZWFsbHkgYSBtaXBzMTYgdGV4dCBsYWJlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfc3RhYiAodHlwZSkKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGlmICh0eXBlID09ICduJyAmJiBtaXBzX29wdHMubWlwczE2KQotICAgIG1pcHMxNl9tYXJrX2xhYmVscyAoKTsKLQotICBzX3N0YWIgKHR5cGUpOwotfQotCi0vKiBIYW5kbGUgdGhlIC53ZWFrZXh0IHBzZXVkby1vcCBhcyBkZWZpbmVkIGluIEthbmUgYW5kIEhlaW5yaWNoLgotICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfd2Vha2V4dCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgZXhwcmVzc2lvblMgZXhwOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICBTX1NFVF9XRUFLIChzeW1ib2xQKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQl7Ci0JICBhc19iYWQgKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZGVmaW5lIHN5bWJvbCBgJXMnLiIsCi0JCSAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQl9Ci0gICAgICAKLSAgICAgIGV4cHJlc3Npb24gKCZleHApOwotICAgICAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQotCXsKLQkgIGFzX2JhZCAoImJhZCAud2Vha2V4dCBkaXJlY3RpdmUiKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bWJvbFAsICZleHApOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQYXJzZSBhIHJlZ2lzdGVyIHN0cmluZyBpbnRvIGEgbnVtYmVyLiAgQ2FsbGVkIGZyb20gdGhlIEVDT0ZGIGNvZGUKLSAgIHRvIHBhcnNlIC5mcmFtZS4gIFRoZSBhcmd1bWVudCBpcyBub24temVybyBpZiB0aGlzIGlzIHRoZSBmcmFtZQotICAgcmVnaXN0ZXIsIHNvIHRoYXQgd2UgY2FuIHJlY29yZCBpdCBpbiBtaXBzX2ZyYW1lX3JlZy4gICovCi0KLWludAotdGNfZ2V0X3JlZ2lzdGVyIChmcmFtZSkKLSAgICAgaW50IGZyYW1lOwotewotICBpbnQgcmVnOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnJCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiZXhwZWN0ZWQgYCQnIikpOwotICAgICAgcmVnID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLSAgICB7Ci0gICAgICByZWcgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmIChyZWcgPCAwIHx8IHJlZyA+PSAzMikKLQl7Ci0JICBhc193YXJuIChfKCJCYWQgcmVnaXN0ZXIgbnVtYmVyIikpOwotCSAgcmVnID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImZwIiwgMikgPT0gMCkKLQlyZWcgPSBGUDsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInNwIiwgMikgPT0gMCkKLQlyZWcgPSBTUDsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImdwIiwgMikgPT0gMCkKLQlyZWcgPSBHUDsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImF0IiwgMikgPT0gMCkKLQlyZWcgPSBBVDsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc193YXJuIChfKCJVbnJlY29nbml6ZWQgcmVnaXN0ZXIgbmFtZSIpKTsKLQkgIHJlZyA9IDA7Ci0JfQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgfQotICBpZiAoZnJhbWUpCi0gICAgbWlwc19mcmFtZV9yZWcgPSByZWcgIT0gMCA/IHJlZyA6IFNQOwotICByZXR1cm4gcmVnOwotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgdmFsdWVUIGFkZHI7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogV2UgZG9uJ3QgbmVlZCB0byBhbGlnbiBFTEYgc2VjdGlvbnMgdG8gdGhlIGZ1bGwgYWxpZ25tZW50LgotICAgICBIb3dldmVyLCBJcml4IDUgbWF5IHByZWZlciB0aGF0IHdlIGFsaWduIHRoZW0gYXQgbGVhc3QgdG8gYSAxNgotICAgICBieXRlIGJvdW5kYXJ5LiAgV2UgZG9uJ3QgYm90aGVyIHRvIGFsaWduIHRoZSBzZWN0aW9ucyBpZiB3ZSBhcmUKLSAgICAgdGFyZ2V0ZWQgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbS4gICovCi0gIGlmIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpID09IDApCi0gICAgcmV0dXJuIGFkZHI7Ci0gIGlmIChhbGlnbiA+IDQpCi0gICAgYWxpZ24gPSA0OwotI2VuZGlmCi0KLSAgcmV0dXJuICgoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLS8qIFV0aWxpdHkgcm91dGluZSwgY2FsbGVkIGZyb20gYWJvdmUgYXMgd2VsbC4gIElmIGNhbGxlZCB3aGlsZSB0aGUKLSAgIGlucHV0IGZpbGUgaXMgc3RpbGwgYmVpbmcgcmVhZCwgaXQncyBvbmx5IGFuIGFwcHJveGltYXRpb24uICAoRm9yCi0gICBleGFtcGxlLCBhIHN5bWJvbCBtYXkgbGF0ZXIgYmVjb21lIGRlZmluZWQgd2hpY2ggYXBwZWFyZWQgdG8gYmUKLSAgIHVuZGVmaW5lZCBlYXJsaWVyLikgICovCi0KLXN0YXRpYyBpbnQKLW5vcGljX25lZWRfcmVsYXggKHN5bSwgYmVmb3JlX3JlbGF4aW5nKQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIGludCBiZWZvcmVfcmVsYXhpbmc7Ci17Ci0gIGlmIChzeW0gPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzeW1uYW1lOwotICAgICAgaW50IGNoYW5nZTsKLQotICAgICAgLyogRmluZCBvdXQgd2hldGhlciB0aGlzIHN5bWJvbCBjYW4gYmUgcmVmZXJlbmNlZCBvZmYgdGhlIEdQCi0JIHJlZ2lzdGVyLiAgSXQgY2FuIGJlIGlmIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgLUcgc2l6ZSBvciBpZgotCSBpdCBpcyBpbiB0aGUgLnNkYXRhIG9yIC5zYnNzIHNlY3Rpb24uICBDZXJ0YWluIHN5bWJvbHMgY2FuCi0JIG5vdCBiZSByZWZlcmVuY2VkIG9mZiB0aGUgR1AsIGFsdGhvdWdoIGl0IGFwcGVhcnMgYXMgdGhvdWdoCi0JIHRoZXkgY2FuLiAgKi8KLSAgICAgIHN5bW5hbWUgPSBTX0dFVF9OQU1FIChzeW0pOwotICAgICAgaWYgKHN5bW5hbWUgIT0gKGNvbnN0IGNoYXIgKikgTlVMTAotCSAgJiYgKHN0cmNtcCAoc3ltbmFtZSwgImVwcm9sIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgImV0ZXh0IikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgIl9ncCIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJlZGF0YSIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJfZmJzcyIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJfZmRhdGEiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiX2Z0ZXh0IikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgImVuZCIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJfZ3BfZGlzcCIpID09IDApKQotCWNoYW5nZSA9IDE7Ci0gICAgICBlbHNlIGlmICgoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpCi0JICAgICAgICYmICgwCi0jaWZuZGVmIE5PX0VDT0ZGX0RFQlVHR0lORwotCQkgICB8fCAoc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX2V4dGVybl9zaXplICE9IDAKLQkJICAgICAgICYmIChzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfZXh0ZXJuX3NpemUKLQkJCSAgIDw9IGdfc3dpdGNoX3ZhbHVlKSkKLSNlbmRpZgotCQkgICAvKiBXZSBtdXN0IGRlZmVyIHRoaXMgZGVjaXNpb24gdW50aWwgYWZ0ZXIgdGhlIHdob2xlCi0JCSAgICAgIGZpbGUgaGFzIGJlZW4gcmVhZCwgc2luY2UgdGhlcmUgbWlnaHQgYmUgYSAuZXh0ZXJuCi0JCSAgICAgIGFmdGVyIHRoZSBmaXJzdCB1c2Ugb2YgdGhpcyBzeW1ib2wuICAqLwotCQkgICB8fCAoYmVmb3JlX3JlbGF4aW5nCi0jaWZuZGVmIE5PX0VDT0ZGX0RFQlVHR0lORwotCQkgICAgICAgJiYgc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX2V4dGVybl9zaXplID09IDAKLSNlbmRpZgotCQkgICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPT0gMCkKLQkJICAgfHwgKFNfR0VUX1ZBTFVFIChzeW0pICE9IDAKLQkJICAgICAgICYmIFNfR0VUX1ZBTFVFIChzeW0pIDw9IGdfc3dpdGNoX3ZhbHVlKSkpCi0JY2hhbmdlID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpzZWduYW1lOwotCi0JICBzZWduYW1lID0gc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW0pKTsKLQkgIGFzc2VydCAoc3RyY21wIChzZWduYW1lLCAiLmxpdDgiKSAhPSAwCi0JCSAgJiYgc3RyY21wIChzZWduYW1lLCAiLmxpdDQiKSAhPSAwKTsKLQkgIGNoYW5nZSA9IChzdHJjbXAgKHNlZ25hbWUsICIuc2RhdGEiKSAhPSAwCi0JCSAgICAmJiBzdHJjbXAgKHNlZ25hbWUsICIuc2JzcyIpICE9IDAKLQkJICAgICYmIHN0cm5jbXAgKHNlZ25hbWUsICIuc2RhdGEuIiwgNykgIT0gMAotCQkgICAgJiYgc3RybmNtcCAoc2VnbmFtZSwgIi5nbnUubGlua29uY2Uucy4iLCAxNikgIT0gMCk7Ci0JfQotICAgICAgcmV0dXJuIGNoYW5nZTsKLSAgICB9Ci0gIGVsc2UKLSAgICAvKiBXZSBhcmUgbm90IG9wdGltaXppbmcgZm9yIHRoZSBHUCByZWdpc3Rlci4gICovCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qIEdpdmVuIGEgbWlwczE2IHZhcmlhbnQgZnJhZyBGUkFHUCwgcmV0dXJuIG5vbi16ZXJvIGlmIGl0IG5lZWRzIGFuCi0gICBleHRlbmRlZCBvcGNvZGUuICBTRUMgaXMgdGhlIHNlY3Rpb24gdGhlIGZyYWcgaXMgaW4uICAqLwotCi1zdGF0aWMgaW50Ci1taXBzMTZfZXh0ZW5kZWRfZnJhZyAoZnJhZ3AsIHNlYywgc3RyZXRjaCkKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBsb25nIHN0cmV0Y2g7Ci17Ci0gIGludCB0eXBlOwotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbWlwczE2X2ltbWVkX29wZXJhbmQgKm9wOwotICBvZmZzZXRUIHZhbDsKLSAgaW50IG1pbnRpbnksIG1heHRpbnk7Ci0gIHNlZ1Qgc3ltc2VjOwotCi0gIGlmIChSRUxBWF9NSVBTMTZfVVNFUl9TTUFMTCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotICAgIHJldHVybiAwOwotICBpZiAoUkVMQVhfTUlQUzE2X1VTRVJfRVhUIChmcmFncC0+ZnJfc3VidHlwZSkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgdHlwZSA9IFJFTEFYX01JUFMxNl9UWVBFIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gIG9wID0gbWlwczE2X2ltbWVkX29wZXJhbmRzOwotICB3aGlsZSAob3AtPnR5cGUgIT0gdHlwZSkKLSAgICB7Ci0gICAgICArK29wOwotICAgICAgYXNzZXJ0IChvcCA8IG1pcHMxNl9pbW1lZF9vcGVyYW5kcyArIE1JUFMxNl9OVU1fSU1NRUQpOwotICAgIH0KLQotICBpZiAob3AtPnVuc3ApCi0gICAgewotICAgICAgaWYgKHR5cGUgPT0gJzwnIHx8IHR5cGUgPT0gJz4nIHx8IHR5cGUgPT0gJ1snIHx8IHR5cGUgPT0gJ10nKQotCXsKLQkgIG1pbnRpbnkgPSAxOwotCSAgbWF4dGlueSA9IDEgPDwgb3AtPm5iaXRzOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtaW50aW55ID0gMDsKLQkgIG1heHRpbnkgPSAoMSA8PCBvcC0+bmJpdHMpIC0gMTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWludGlueSA9IC0gKDEgPDwgKG9wLT5uYml0cyAtIDEpKTsKLSAgICAgIG1heHRpbnkgPSAoMSA8PCAob3AtPm5iaXRzIC0gMSkpIC0gMTsKLSAgICB9Ci0KLSAgLyogV2UgY2FuJ3QgYWx3YXlzIGNhbGwgU19HRVRfVkFMVUUgaGVyZSwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvCi0gICAgIGxvY2sgaW4gYSBwYXJ0aWN1bGFyIGZyYWcgYWRkcmVzcy4gICovCi0gIGlmIChzeW1ib2xfY29uc3RhbnRfcCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0gICAgewotICAgICAgdmFsID0gKFNfR0VUX1ZBTFVFIChmcmFncC0+ZnJfc3ltYm9sKQotCSAgICAgKyBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdwLT5mcl9zeW1ib2wpLT5mcl9hZGRyZXNzKTsKLSAgICAgIHN5bXNlYyA9IFNfR0VUX1NFR01FTlQgKGZyYWdwLT5mcl9zeW1ib2wpOwotICAgIH0KLSAgZWxzZSBpZiAoc3ltYm9sX2VxdWF0ZWRfcCAoZnJhZ3AtPmZyX3N5bWJvbCkKLQkgICAmJiAoc3ltYm9sX2NvbnN0YW50X3AKLQkgICAgICAgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoZnJhZ3AtPmZyX3N5bWJvbCktPlhfYWRkX3N5bWJvbCkpKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmVxc3ltOwotCi0gICAgICBlcXN5bSA9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoZnJhZ3AtPmZyX3N5bWJvbCktPlhfYWRkX3N5bWJvbDsKLSAgICAgIHZhbCA9IChTX0dFVF9WQUxVRSAoZXFzeW0pCi0JICAgICArIHN5bWJvbF9nZXRfZnJhZyAoZXFzeW0pLT5mcl9hZGRyZXNzCi0JICAgICArIHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoZnJhZ3AtPmZyX3N5bWJvbCktPlhfYWRkX251bWJlcgotCSAgICAgKyBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdwLT5mcl9zeW1ib2wpLT5mcl9hZGRyZXNzKTsKLSAgICAgIHN5bXNlYyA9IFNfR0VUX1NFR01FTlQgKGVxc3ltKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMTsKLQotICBpZiAob3AtPnBjcmVsKQotICAgIHsKLSAgICAgIGFkZHJlc3NUIGFkZHI7Ci0KLSAgICAgIC8qIFdlIHdvbid0IGhhdmUgdGhlIHNlY3Rpb24gd2hlbiB3ZSBhcmUgY2FsbGVkIGZyb20KLSAgICAgICAgIG1pcHNfcmVsYXhfZnJhZy4gIEhvd2V2ZXIsIHdlIHdpbGwgYWx3YXlzIGhhdmUgYmVlbiBjYWxsZWQKLSAgICAgICAgIGZyb20gbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggZmlyc3QuICBJZiB0aGlzIGlzIGEKLSAgICAgICAgIGJyYW5jaCB0byBhIGRpZmZlcmVudCBzZWN0aW9uLCB3ZSBtYXJrIGl0IGFzIHN1Y2guICBJZiBTRUMgaXMKLSAgICAgICAgIE5VTEwsIGFuZCB0aGUgZnJhZyBpcyBub3QgbWFya2VkLCB0aGVuIGl0IG11c3QgYmUgYSBicmFuY2ggdG8KLSAgICAgICAgIHRoZSBzYW1lIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCXsKLQkgIGlmIChSRUxBWF9NSVBTMTZfTE9OR19CUkFOQ0ggKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQkgICAgcmV0dXJuIDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChzeW1zZWMgIT0gc2VjKQotCSAgICB7Ci0JICAgICAgZnJhZ3AtPmZyX3N1YnR5cGUgPQotCQlSRUxBWF9NSVBTMTZfTUFSS19MT05HX0JSQU5DSCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotCi0JICAgICAgLyogRklYTUU6IFdlIHNob3VsZCBzdXBwb3J0IHRoaXMsIGFuZCBsZXQgdGhlIGxpbmtlcgotICAgICAgICAgICAgICAgICBjYXRjaCBicmFuY2hlcyBhbmQgbG9hZHMgdGhhdCBhcmUgb3V0IG9mIHJhbmdlLiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwKLQkJCSAgICBfKCJ1bnN1cHBvcnRlZCBQQyByZWxhdGl2ZSByZWZlcmVuY2UgdG8gZGlmZmVyZW50IHNlY3Rpb24iKSk7Ci0KLQkgICAgICByZXR1cm4gMTsKLQkgICAgfQotCX0KLQotICAgICAgLyogSW4gdGhpcyBjYXNlLCB3ZSBrbm93IGZvciBzdXJlIHRoYXQgdGhlIHN5bWJvbCBmcmFnbWVudCBpcyBpbgotCSB0aGUgc2FtZSBzZWN0aW9uLiAgSWYgdGhlIGZyX2FkZHJlc3Mgb2YgdGhlIHN5bWJvbCBmcmFnbWVudAotCSBpcyBncmVhdGVyIHRoZW4gdGhlIGFkZHJlc3Mgb2YgdGhpcyBmcmFnbWVudCB3ZSB3YW50IHRvIGFkZAotCSBpbiBTVFJFVENIIGluIG9yZGVyIHRvIGdldCBhIGJldHRlciBlc3RpbWF0ZSBvZiB0aGUgYWRkcmVzcy4KLQkgVGhpcyBwYXJ0aWN1bGFybHkgbWF0dGVycyBiZWNhdXNlIG9mIHRoZSBzaGlmdCBiaXRzLiAgKi8KLSAgICAgIGlmIChzdHJldGNoICE9IDAKLQkgICYmIChzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdwLT5mcl9zeW1ib2wpLT5mcl9hZGRyZXNzCi0JICAgICAgPj0gZnJhZ3AtPmZyX2FkZHJlc3MpKQotCXsKLQkgIGZyYWdTICpmOwotCi0JICAvKiBBZGp1c3Qgc3RyZXRjaCBmb3IgYW55IGFsaWdubWVudCBmcmFnLiAgTm90ZSB0aGF0IGlmIGhhdmUKLSAgICAgICAgICAgICBiZWVuIGV4cGFuZGluZyB0aGUgZWFybGllciBjb2RlLCB0aGUgc3ltYm9sIG1heSBiZQotICAgICAgICAgICAgIGRlZmluZWQgaW4gd2hhdCBhcHBlYXJzIHRvIGJlIGFuIGVhcmxpZXIgZnJhZy4gIEZJWE1FOgotICAgICAgICAgICAgIFRoaXMgZG9lc24ndCBoYW5kbGUgdGhlIGZyX3N1YnR5cGUgZmllbGQsIHdoaWNoIHNwZWNpZmllcwotICAgICAgICAgICAgIGEgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcCB3aGVuIGRvaW5nIGFuCi0gICAgICAgICAgICAgYWxpZ25tZW50LiAgKi8KLQkgIGZvciAoZiA9IGZyYWdwOwotCSAgICAgICBmICE9IE5VTEwgJiYgZiAhPSBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdwLT5mcl9zeW1ib2wpOwotCSAgICAgICBmID0gZi0+ZnJfbmV4dCkKLQkgICAgewotCSAgICAgIGlmIChmLT5mcl90eXBlID09IHJzX2FsaWduIHx8IGYtPmZyX3R5cGUgPT0gcnNfYWxpZ25fY29kZSkKLQkJewotCQkgIGlmIChzdHJldGNoIDwgMCkKLQkJICAgIHN0cmV0Y2ggPSAtICgoLSBzdHJldGNoKQotCQkJCSAmIH4gKCgxIDw8IChpbnQpIGYtPmZyX29mZnNldCkgLSAxKSk7Ci0JCSAgZWxzZQotCQkgICAgc3RyZXRjaCAmPSB+ICgoMSA8PCAoaW50KSBmLT5mcl9vZmZzZXQpIC0gMSk7Ci0JCSAgaWYgKHN0cmV0Y2ggPT0gMCkKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGlmIChmICE9IE5VTEwpCi0JICAgIHZhbCArPSBzdHJldGNoOwotCX0KLQotICAgICAgYWRkciA9IGZyYWdwLT5mcl9hZGRyZXNzICsgZnJhZ3AtPmZyX2ZpeDsKLQotICAgICAgLyogVGhlIGJhc2UgYWRkcmVzcyBydWxlcyBhcmUgY29tcGxpY2F0ZWQuICBUaGUgYmFzZSBhZGRyZXNzIG9mCi0gICAgICAgICBhIGJyYW5jaCBpcyB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uLiAgVGhlIGJhc2UgYWRkcmVzcyBvZiBhCi0gICAgICAgICBQQyByZWxhdGl2ZSBsb2FkIG9yIGFkZCBpcyB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmLCBidXQgaWYgaXQKLSAgICAgICAgIGlzIGluIGEgZGVsYXkgc2xvdCAoaW4gd2hpY2ggY2FzZSBpdCBjYW4gbm90IGJlIGV4dGVuZGVkKSB1c2UKLSAgICAgICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiB3aG9zZSBkZWxheSBzbG90IGl0IGlzIGluLiAgKi8KLSAgICAgIGlmICh0eXBlID09ICdwJyB8fCB0eXBlID09ICdxJykKLQl7Ci0JICBhZGRyICs9IDI7Ci0KLQkgIC8qIElmIHdlIGFyZSBjdXJyZW50bHkgYXNzdW1pbmcgdGhhdCB0aGlzIGZyYWcgc2hvdWxkIGJlCi0JICAgICBleHRlbmRlZCwgdGhlbiwgdGhlIGN1cnJlbnQgYWRkcmVzcyBpcyB0d28gYnl0ZXMKLQkgICAgIGhpZ2hlci4gKi8KLQkgIGlmIChSRUxBWF9NSVBTMTZfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQkgICAgYWRkciArPSAyOwotCi0JICAvKiBJZ25vcmUgdGhlIGxvdyBiaXQgaW4gdGhlIHRhcmdldCwgc2luY2UgaXQgd2lsbCBiZSBzZXQKLSAgICAgICAgICAgICBmb3IgYSB0ZXh0IGxhYmVsLiAgKi8KLQkgIGlmICgodmFsICYgMSkgIT0gMCkKLQkgICAgLS12YWw7Ci0JfQotICAgICAgZWxzZSBpZiAoUkVMQVhfTUlQUzE2X0pBTF9EU0xPVCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCWFkZHIgLT0gNDsKLSAgICAgIGVsc2UgaWYgKFJFTEFYX01JUFMxNl9EU0xPVCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCWFkZHIgLT0gMjsKLQotICAgICAgdmFsIC09IGFkZHIgJiB+ICgoMSA8PCBvcC0+c2hpZnQpIC0gMSk7Ci0KLSAgICAgIC8qIEJyYW5jaCBvZmZzZXRzIGhhdmUgYW4gaW1wbGljaXQgMCBpbiB0aGUgbG93ZXN0IGJpdC4gICovCi0gICAgICBpZiAodHlwZSA9PSAncCcgfHwgdHlwZSA9PSAncScpCi0JdmFsIC89IDI7Ci0KLSAgICAgIC8qIElmIGFueSBvZiB0aGUgc2hpZnRlZCBiaXRzIGFyZSBzZXQsIHdlIG11c3QgdXNlIGFuIGV4dGVuZGVkCi0gICAgICAgICBvcGNvZGUuICBJZiB0aGUgYWRkcmVzcyBkZXBlbmRzIG9uIHRoZSBzaXplIG9mIHRoaXMKLSAgICAgICAgIGluc3RydWN0aW9uLCB0aGlzIGNhbiBsZWFkIHRvIGEgbG9vcCwgc28gd2UgYXJyYW5nZSB0byBhbHdheXMKLSAgICAgICAgIHVzZSBhbiBleHRlbmRlZCBvcGNvZGUuICBXZSBvbmx5IGNoZWNrIHRoaXMgd2hlbiB3ZSBhcmUgaW4KLSAgICAgICAgIHRoZSBtYWluIHJlbGF4YXRpb24gbG9vcCwgd2hlbiBTRUMgaXMgTlVMTC4gICovCi0gICAgICBpZiAoKHZhbCAmICgoMSA8PCBvcC0+c2hpZnQpIC0gMSkpICE9IDAgJiYgc2VjID09IE5VTEwpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPQotCSAgICBSRUxBWF9NSVBTMTZfTUFSS19MT05HX0JSQU5DSCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBhcmUgYWJvdXQgdG8gbWFyayBhIGZyYWcgYXMgZXh0ZW5kZWQgYmVjYXVzZSB0aGUgdmFsdWUKLSAgICAgICAgIGlzIHByZWNpc2VseSBtYXh0aW55ICsgMSwgdGhlbiB0aGVyZSBpcyBhIGNoYW5jZSBvZiBhbgotICAgICAgICAgaW5maW5pdGUgbG9vcCBhcyBpbiB0aGUgZm9sbG93aW5nIGNvZGU6Ci0JICAgICBsYQkkNCxmb28KLQkgICAgIC5za2lwCTEwMjAKLQkgICAgIC5hbGlnbgkyCi0JICAgZm9vOgotCSBJbiB0aGlzIGNhc2Ugd2hlbiB0aGUgbGEgaXMgZXh0ZW5kZWQsIGZvbyBpcyAweDNmYyBieXRlcwotCSBhd2F5LCBzbyB0aGUgbGEgY2FuIGJlIHNocnVuaywgYnV0IHRoZW4gZm9vIGlzIDB4NDAwIGF3YXksIHNvCi0JIHRoZSBsYSBtdXN0IGJlIGV4dGVuZGVkLiAgVG8gYXZvaWQgdGhpcyBsb29wLCB3ZSBtYXJrIHRoZQotCSBmcmFnIGFzIGV4dGVuZGVkIGlmIGl0IHdhcyBzbWFsbCwgYW5kIGlzIGFib3V0IHRvIGJlY29tZQotCSBleHRlbmRlZCB3aXRoIGEgdmFsdWUgb2YgbWF4dGlueSArIDEuICAqLwotICAgICAgaWYgKHZhbCA9PSAoKG1heHRpbnkgKyAxKSA8PCBvcC0+c2hpZnQpCi0JICAmJiAhIFJFTEFYX01JUFMxNl9FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpCi0JICAmJiBzZWMgPT0gTlVMTCkKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9Ci0JICAgIFJFTEFYX01JUFMxNl9NQVJLX0xPTkdfQlJBTkNIIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzeW1zZWMgIT0gYWJzb2x1dGVfc2VjdGlvbiAmJiBzZWMgIT0gTlVMTCkKLSAgICBhc19iYWRfd2hlcmUgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwgXygidW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiIpKTsKLQotICBpZiAoKHZhbCAmICgoMSA8PCBvcC0+c2hpZnQpIC0gMSkpICE9IDAKLSAgICAgIHx8IHZhbCA8IChtaW50aW55IDw8IG9wLT5zaGlmdCkKLSAgICAgIHx8IHZhbCA+IChtYXh0aW55IDw8IG9wLT5zaGlmdCkpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogRXN0aW1hdGUgdGhlIHNpemUgb2YgYSBmcmFnIGJlZm9yZSByZWxheGluZy4gIFVubGVzcyB0aGlzIGlzIHRoZQotICAgbWlwczE2LCB3ZSBhcmUgbm90IHJlYWxseSByZWxheGluZyBoZXJlLCBhbmQgdGhlIGZpbmFsIHNpemUgaXMKLSAgIGVuY29kZWQgaW4gdGhlIHN1YnR5cGUgaW5mb3JtYXRpb24uICBGb3IgdGhlIG1pcHMxNiwgd2UgaGF2ZSB0bwotICAgZGVjaWRlIHdoZXRoZXIgd2UgYXJlIHVzaW5nIGFuIGV4dGVuZGVkIG9wY29kZSBvciBub3QuICAqLwotCi0vKkFSR1NVU0VEKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWd0eXBlKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWd0eXBlOwotewotICBpbnQgY2hhbmdlOwotCi0gIGlmIChSRUxBWF9NSVBTMTZfUCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotICAgIHsKLSAgICAgIGlmIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyAoZnJhZ3AsIHNlZ3R5cGUsIDApKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gUkVMQVhfTUlQUzE2X01BUktfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLQkgIHJldHVybiA0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9IFJFTEFYX01JUFMxNl9DTEVBUl9FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotCSAgcmV0dXJuIDI7Ci0JfQotICAgIH0KLQotICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotICAgIHsKLSAgICAgIGNoYW5nZSA9IG5vcGljX25lZWRfcmVsYXggKGZyYWdwLT5mcl9zeW1ib2wsIDApOwotICAgIH0KLSAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltOwotICAgICAgYXNlY3Rpb24gKnN5bXNlYzsKLQotICAgICAgc3ltID0gZnJhZ3AtPmZyX3N5bWJvbDsKLQotICAgICAgLyogSGFuZGxlIHRoZSBjYXNlIG9mIGEgc3ltYm9sIGVxdWF0ZWQgdG8gYW5vdGhlciBzeW1ib2wuICAqLwotICAgICAgd2hpbGUgKHN5bWJvbF9lcXVhdGVkX3AgKHN5bSkKLQkgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkpCi0JewotCSAgc3ltYm9sUyAqbjsKLQotCSAgLyogSXQncyBwb3NzaWJsZSB0byBnZXQgYSBsb29wIGhlcmUgaW4gYSBiYWRseSB3cml0dGVuCi0gICAgICAgICAgICAgcHJvZ3JhbS4gICovCi0JICBuID0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzeW0pLT5YX2FkZF9zeW1ib2w7Ci0JICBpZiAobiA9PSBzeW0pCi0JICAgIGJyZWFrOwotCSAgc3ltID0gbjsKLQl9Ci0KLSAgICAgIHN5bXNlYyA9IFNfR0VUX1NFR01FTlQgKHN5bSk7Ci0KLSAgICAgIC8qIFRoaXMgbXVzdCBkdXBsaWNhdGUgdGhlIHRlc3QgaW4gYWRqdXN0X3JlbG9jX3N5bXMuICAqLwotICAgICAgY2hhbmdlID0gKHN5bXNlYyAhPSAmYmZkX3VuZF9zZWN0aW9uCi0JCSYmIHN5bXNlYyAhPSAmYmZkX2Fic19zZWN0aW9uCi0JCSYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1zZWMpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoY2hhbmdlKQotICAgIHsKLSAgICAgIC8qIFJlY29yZCB0aGUgb2Zmc2V0IHRvIHRoZSBmaXJzdCByZWxvYyBpbiB0aGUgZnJfb3Bjb2RlIGZpZWxkLgotCSBUaGlzIGxldHMgbWRfY29udmVydF9mcmFnIGFuZCB0Y19nZW5fcmVsb2Mga25vdyB0aGF0IHRoZSBjb2RlCi0JIG11c3QgYmUgZXhwYW5kZWQuICAqLwotICAgICAgZnJhZ3AtPmZyX29wY29kZSA9IChmcmFncC0+ZnJfbGl0ZXJhbAotCQkJICArIGZyYWdwLT5mcl9maXgKLQkJCSAgLSBSRUxBWF9PTEQgKGZyYWdwLT5mcl9zdWJ0eXBlKQotCQkJICArIFJFTEFYX1JFTE9DMSAoZnJhZ3AtPmZyX3N1YnR5cGUpKTsKLSAgICAgIC8qIEZJWE1FOiBUaGlzIHJlYWxseSBuZWVkcyBhc193YXJuX3doZXJlLiAgKi8KLSAgICAgIGlmIChSRUxBWF9XQVJOIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JYXNfd2FybiAoXygiQVQgdXNlZCBhZnRlciBcIi5zZXQgbm9hdFwiIG9yIG1hY3JvIHVzZWQgYWZ0ZXIgXCIuc2V0IG5vbWFjcm9cIiIpKTsKLSAgICB9Ci0KLSAgaWYgKCEgY2hhbmdlKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuIFJFTEFYX05FVyAoZnJhZ3AtPmZyX3N1YnR5cGUpIC0gUkVMQVhfT0xEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHRvIHNlZSB3aGV0aGVyIGEgcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sCi0gICBzaG91bGQgYmUgY29udmVydGVkIGludG8gYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbi4gIERvbid0IGFkanVzdAotICAgTUlQUzE2IGp1bXAgcmVsb2NhdGlvbnMsIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGZvcm1hdAotICAgb2YgdGhlIG9mZnNldCBpbiB0aGUgLm8gZmlsZS4gIERvbid0IGFkanVzdCByZWxvY2F0aW9ucyBhZ2FpbnN0Ci0gICBtaXBzMTYgc3ltYm9scywgc28gdGhhdCB0aGUgbGlua2VyIGNhbiBmaW5kIHRoZW0gaWYgaXQgbmVlZHMgdG8gc2V0Ci0gICB1cCBhIHN0dWIuICAqLwotCi1pbnQKLW1pcHNfZml4X2FkanVzdGFibGUgKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFMxNl9KTVApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0jaWZkZWYgT0JKX0VMRgotICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICAmJiBTX0dFVF9PVEhFUiAoZml4cC0+ZnhfYWRkc3kpID09IFNUT19NSVBTMTYKLSAgICAgICYmIGZpeHAtPmZ4X3N1YnN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAgKi8KLQotYXJlbGVudCAqKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgc3RhdGljIGFyZWxlbnQgKnJldHZhbFs0XTsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotCi0gIHJlbG9jID0gcmV0dmFsWzBdID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJldHZhbFsxXSA9IE5VTEw7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDCi0gICAgICAmJiBTV0lUQ0hfVEFCTEUgKGZpeHApKQotICAgIHsKLSAgICAgIC8qIEZvciBhIHN3aXRjaCB0YWJsZSBlbnRyeSB3ZSB1c2UgYSBzcGVjaWFsIHJlbG9jLiAgVGhlIGFkZGVuZAotCSBpcyBhY3R1YWxseSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYyBhZGRyZXNzIGFuZCB0aGUKLQkgc3VidHJhaGVuZC4gICovCi0gICAgICByZWxvYy0+YWRkZW5kID0gcmVsb2MtPmFkZHJlc3MgLSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgIT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQotCWFzX2ZhdGFsIChfKCJEb3VibGUgY2hlY2sgZnhfcl90eXBlIGluIHRjLW1pcHMuYzp0Y19nZW5fcmVsb2MiKSk7Ci0gICAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfR1BSRUwzMjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUENSRUxfTE8xNikKLSAgICB7Ci0gICAgICAvKiBXZSB1c2UgYSBzcGVjaWFsIGFkZGVuZCBmb3IgYW4gaW50ZXJuYWwgUkVMTE8gcmVsb2MuICAqLwotICAgICAgaWYgKHN5bWJvbF9zZWN0aW9uX3AgKGZpeHAtPmZ4X2FkZHN5KSkKLQlyZWxvYy0+YWRkZW5kID0gcmVsb2MtPmFkZHJlc3MgLSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotICAgICAgZWxzZQotCXJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXIgKyByZWxvYy0+YWRkcmVzczsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TKQotICAgIHsKLSAgICAgIGFzc2VydCAoZml4cC0+ZnhfbmV4dCAhPSBOVUxMCi0JICAgICAgJiYgZml4cC0+ZnhfbmV4dC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QQ1JFTF9MTzE2KTsKLSAgICAgIC8qIFdlIHVzZSBhIHNwZWNpYWwgYWRkZW5kIGZvciBhbiBpbnRlcm5hbCBSRUxISSByZWxvYy4gIFRoZQotCSByZWxvYyBpcyByZWxhdGl2ZSB0byB0aGUgUkVMTE87IGFkanVzdCB0aGUgYWRkZW5kCi0JIGFjY29yZGluZ2x5LiAgKi8KLSAgICAgIGlmIChzeW1ib2xfc2VjdGlvbl9wIChmaXhwLT5meF9hZGRzeSkpCi0JcmVsb2MtPmFkZGVuZCA9IChmaXhwLT5meF9uZXh0LT5meF9mcmFnLT5mcl9hZGRyZXNzCi0JCQkgKyBmaXhwLT5meF9uZXh0LT5meF93aGVyZQotCQkJIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KSk7Ci0gICAgICBlbHNlCi0JcmVsb2MtPmFkZGVuZCA9IChmaXhwLT5meF9hZGRudW1iZXIKLQkJCSArIGZpeHAtPmZ4X25leHQtPmZ4X2ZyYWctPmZyX2FkZHJlc3MKLQkJCSArIGZpeHAtPmZ4X25leHQtPmZ4X3doZXJlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3BjcmVsID09IDApCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQotCS8qIEEgZ3J1ZXNvbWUgaGFjayB3aGljaCBpcyBhIHJlc3VsdCBvZiB0aGUgZ3J1ZXNvbWUgZ2FzIHJlbG9jCi0JICAgaGFuZGxpbmcuICAqLwotCXJlbG9jLT5hZGRlbmQgPSByZWxvYy0+YWRkcmVzczsKLSAgICAgIGVsc2UKLQlyZWxvYy0+YWRkZW5kID0gLXJlbG9jLT5hZGRyZXNzOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgdmFyaWFudCBmcmFnLCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlIGV4aXN0aW5nCi0gICAgIHJlbG9jIGFuZCBnZW5lcmF0ZSBhIG5ldyBvbmUuICAqLwotICBpZiAoZml4cC0+ZnhfZnJhZy0+ZnJfb3Bjb2RlICE9IE5VTEwKLSAgICAgICYmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR1BSRUwKLQkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HT1QxNgotCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0NBTEwxNgotCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2Ci0JICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR09UX0xPMTYKLQkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYKLQkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYpKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbG9jMjsKLQotICAgICAgYXNzZXJ0ICghIFJFTEFYX01JUFMxNl9QIChmaXhwLT5meF9mcmFnLT5mcl9zdWJ0eXBlKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgbm90IHRoZSBsYXN0IHJlbG9jIGluIHRoaXMgZnJhZywgdGhlbiB3ZSBoYXZlIHR3bwotCSBHUFJFTCByZWxvY3MsIG9yIGEgR09UX0hJMTYvR09UX0xPMTYgcGFpciwgb3IgYQotCSBDQUxMX0hJMTYvQ0FMTF9MTzE2LCBib3RoIG9mIHdoaWNoIGFyZSBiZWluZyByZXBsYWNlZC4gIExldAotCSB0aGUgc2Vjb25kIG9uZSBoYW5kbGUgYWxsIG9mIHRoZW0uICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X25leHQgIT0gTlVMTAotCSAgJiYgZml4cC0+ZnhfZnJhZyA9PSBmaXhwLT5meF9uZXh0LT5meF9mcmFnKQotCXsKLQkgIGFzc2VydCAoKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HUFJFTAotCQkgICAmJiBmaXhwLT5meF9uZXh0LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JCSAgfHwgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNgotCQkgICAgICAmJiAoZml4cC0+ZnhfbmV4dC0+Znhfcl90eXBlCi0JCQkgID09IEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KSkKLQkJICB8fCAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNgotCQkgICAgICAmJiAoZml4cC0+ZnhfbmV4dC0+Znhfcl90eXBlCi0JCQkgID09IEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNikpKTsKLQkgIHJldHZhbFswXSA9IE5VTEw7Ci0JICByZXR1cm4gcmV0dmFsOwotCX0KLQotICAgICAgZml4cC0+Znhfd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9vcGNvZGUgLSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICAgICAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgICByZWxvYzIgPSByZXR2YWxbMV0gPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgICAgIHJldHZhbFsyXSA9IE5VTEw7Ci0gICAgICByZWxvYzItPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICAqcmVsb2MyLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gICAgICByZWxvYzItPmFkZHJlc3MgPSAocmVsb2MtPmFkZHJlc3MKLQkJCSArIChSRUxBWF9SRUxPQzIgKGZpeHAtPmZ4X2ZyYWctPmZyX3N1YnR5cGUpCi0JCQkgICAgLSBSRUxBWF9SRUxPQzEgKGZpeHAtPmZ4X2ZyYWctPmZyX3N1YnR5cGUpKSk7Ci0gICAgICByZWxvYzItPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgICAgIHJlbG9jMi0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgYXNzZXJ0IChyZWxvYzItPmhvd3RvICE9IE5VTEwpOwotCi0gICAgICBpZiAoUkVMQVhfUkVMT0MzIChmaXhwLT5meF9mcmFnLT5mcl9zdWJ0eXBlKSkKLQl7Ci0JICBhcmVsZW50ICpyZWxvYzM7Ci0KLQkgIHJlbG9jMyA9IHJldHZhbFsyXSA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCSAgcmV0dmFsWzNdID0gTlVMTDsKLQkgICpyZWxvYzMgPSAqcmVsb2MyOwotCSAgcmVsb2MzLT5hZGRyZXNzICs9IDQ7Ci0JfQotCi0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotCXsKLQkgIGFzc2VydCAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dQUkVMKTsKLQkgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19ISTE2X1M7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HT1QxNjoKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19DQUxMMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR09UX0xPMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2OgotCSAgICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19NSVBTX0dPVDE2OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotICAgIH0KLQotICAvKiBTaW5jZSBNSVBTIEVMRiB1c2VzIFJlbCBpbnN0ZWFkIG9mIFJlbGEsIGVuY29kZSB0aGUgdnRhYmxlIGVudHJ5Ci0gICAgIHRvIGJlIHVzZWQgaW4gdGhlIHJlbG9jYXRpb24ncyBzZWN0aW9uIG9mZnNldC4gICovCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICB7Ci0gICAgICByZWxvYy0+YWRkcmVzcyA9IHJlbG9jLT5hZGRlbmQ7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gMDsKLSAgICB9Ci0KLSAgLyogU2luY2UgRElGRl9FWFBSX09LIGlzIGRlZmluZWQgaW4gdGMtbWlwcy5oLCBpdCBpcyBwb3NzaWJsZSB0aGF0Ci0gICAgIGZpeHVwX3NlZ21lbnQgY29udmVydGVkIGEgbm9uLVBDIHJlbGF0aXZlIHJlbG9jIGludG8gYSBQQwotICAgICByZWxhdGl2ZSByZWxvYy4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIHJlbG9jCi0gICAgIGNvZGUuICAqLwotICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgewotICAgICAgc3dpdGNoIChjb2RlKQotCXsKLQljYXNlIEJGRF9SRUxPQ184OgotCSAgY29kZSA9IEJGRF9SRUxPQ184X1BDUkVMOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfMTY6Ci0JICBjb2RlID0gQkZEX1JFTE9DXzE2X1BDUkVMOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfMzI6Ci0JICBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfNjQ6Ci0JICBjb2RlID0gQkZEX1JFTE9DXzY0X1BDUkVMOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ182NF9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjoKLQljYXNlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1M6Ci0JY2FzZSBCRkRfUkVMT0NfUENSRUxfTE8xNjoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQlfKCJDYW5ub3QgbWFrZSAlcyByZWxvY2F0aW9uIFBDIHJlbGF0aXZlIiksCi0JCQliZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotCX0KLSAgICB9Ci0KLSAgLyogVG8gc3VwcG9ydCBhIFBDIHJlbGF0aXZlIHJlbG9jIHdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZQotICAgICBmb3IgRUNPRkYsIHdlIHVzZSBhIEN5Z251cyBleHRlbnNpb24uICBXZSBjaGVjayBmb3IgdGhhdCBoZXJlIHRvCi0gICAgIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGxldCBzdWNoIGEgcmVsb2MgZXNjYXBlIG5vcm1hbGx5LiAgKi8KLSAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCi0gICAgICAmJiBjb2RlID09IEJGRF9SRUxPQ18xNl9QQ1JFTF9TMgotICAgICAgJiYgbWlwc19waWMgIT0gRU1CRURERURfUElDKQotICAgIHJlbG9jLT5ob3d0byA9IE5VTEw7Ci0gIGVsc2UKLSAgICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0KLSAgaWYgKHJlbG9jLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkNhbiBub3QgcmVwcmVzZW50ICVzIHJlbG9jYXRpb24gaW4gdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkJICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7Ci0gICAgICByZXR2YWxbMF0gPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gcmV0dmFsOwotfQotCi0vKiBSZWxheCBhIG1hY2hpbmUgZGVwZW5kZW50IGZyYWcuICBUaGlzIHJldHVybnMgdGhlIGFtb3VudCBieSB3aGljaAotICAgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgZnJhZyBzaG91bGQgY2hhbmdlLiAgKi8KLQotaW50Ci1taXBzX3JlbGF4X2ZyYWcgKGZyYWdwLCBzdHJldGNoKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGxvbmcgc3RyZXRjaDsKLXsKLSAgaWYgKCEgUkVMQVhfTUlQUzE2X1AgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAobWlwczE2X2V4dGVuZGVkX2ZyYWcgKGZyYWdwLCAoYXNlY3Rpb24gKikgTlVMTCwgc3RyZXRjaCkpCi0gICAgewotICAgICAgaWYgKFJFTEFYX01JUFMxNl9FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCXJldHVybiAwOwotICAgICAgZnJhZ3AtPmZyX3N1YnR5cGUgPSBSRUxBWF9NSVBTMTZfTUFSS19FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgUkVMQVhfTUlQUzE2X0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JcmV0dXJuIDA7Ci0gICAgICBmcmFncC0+ZnJfc3VidHlwZSA9IFJFTEFYX01JUFMxNl9DTEVBUl9FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotICAgICAgcmV0dXJuIC0yOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogQ29udmVydCBhIG1hY2hpbmUgZGVwZW5kZW50IGZyYWcuICAqLwotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIGFzZWMsIGZyYWdwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1QgYXNlYzsKLSAgICAgZnJhZ1MgKmZyYWdwOwotewotICBpbnQgb2xkLCBuZXc7Ci0gIGNoYXIgKmZpeHB0cjsKLQotICBpZiAoUkVMQVhfTUlQUzE2X1AgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLSAgICAgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZCAqb3A7Ci0gICAgICBib29sZWFuIHNtYWxsLCBleHQ7Ci0gICAgICBvZmZzZXRUIHZhbDsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgICBib29sZWFuIHVzZV9leHRlbmQ7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBleHRlbmQ7Ci0KLSAgICAgIHR5cGUgPSBSRUxBWF9NSVBTMTZfVFlQRSAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotICAgICAgb3AgPSBtaXBzMTZfaW1tZWRfb3BlcmFuZHM7Ci0gICAgICB3aGlsZSAob3AtPnR5cGUgIT0gdHlwZSkKLQkrK29wOwotCi0gICAgICBpZiAoUkVMQVhfTUlQUzE2X0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JewotCSAgc21hbGwgPSBmYWxzZTsKLQkgIGV4dCA9IHRydWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNtYWxsID0gdHJ1ZTsKLQkgIGV4dCA9IGZhbHNlOwotCX0KLQotICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZyYWdwLT5mcl9zeW1ib2wsIDEpOwotICAgICAgdmFsID0gU19HRVRfVkFMVUUgKGZyYWdwLT5mcl9zeW1ib2wpOwotICAgICAgaWYgKG9wLT5wY3JlbCkKLQl7Ci0JICBhZGRyZXNzVCBhZGRyOwotCi0JICBhZGRyID0gZnJhZ3AtPmZyX2FkZHJlc3MgKyBmcmFncC0+ZnJfZml4OwotCi0JICAvKiBUaGUgcnVsZXMgZm9yIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYSBQQyByZWxhdGl2ZSByZWxvYyBhcmUKLSAgICAgICAgICAgICBjb21wbGljYXRlZDsgc2VlIG1pcHMxNl9leHRlbmRlZF9mcmFnLiAgKi8KLQkgIGlmICh0eXBlID09ICdwJyB8fCB0eXBlID09ICdxJykKLQkgICAgewotCSAgICAgIGFkZHIgKz0gMjsKLQkgICAgICBpZiAoZXh0KQotCQlhZGRyICs9IDI7Ci0JICAgICAgLyogSWdub3JlIHRoZSBsb3cgYml0IGluIHRoZSB0YXJnZXQsIHNpbmNlIGl0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgc2V0IGZvciBhIHRleHQgbGFiZWwuICAqLwotCSAgICAgIGlmICgodmFsICYgMSkgIT0gMCkKLQkJLS12YWw7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKFJFTEFYX01JUFMxNl9KQUxfRFNMT1QgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQkgICAgYWRkciAtPSA0OwotCSAgZWxzZSBpZiAoUkVMQVhfTUlQUzE2X0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JICAgIGFkZHIgLT0gMjsKLQotCSAgYWRkciAmPSB+IChhZGRyZXNzVCkgKCgxIDw8IG9wLT5zaGlmdCkgLSAxKTsKLQkgIHZhbCAtPSBhZGRyOwotCi0JICAvKiBNYWtlIHN1cmUgdGhlIHNlY3Rpb24gd2luZHMgdXAgd2l0aCB0aGUgYWxpZ25tZW50IHdlIGhhdmUKLSAgICAgICAgICAgICBhc3N1bWVkLiAgKi8KLQkgIGlmIChvcC0+c2hpZnQgPiAwKQotCSAgICByZWNvcmRfYWxpZ25tZW50IChhc2VjLCBvcC0+c2hpZnQpOwotCX0KLQotICAgICAgaWYgKGV4dAotCSAgJiYgKFJFTEFYX01JUFMxNl9KQUxfRFNMT1QgKGZyYWdwLT5mcl9zdWJ0eXBlKQotCSAgICAgIHx8IFJFTEFYX01JUFMxNl9EU0xPVCAoZnJhZ3AtPmZyX3N1YnR5cGUpKSkKLQlhc193YXJuX3doZXJlIChmcmFncC0+ZnJfZmlsZSwgZnJhZ3AtPmZyX2xpbmUsCi0JCSAgICAgICBfKCJleHRlbmRlZCBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IikpOwotCi0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgKGZyYWdwLT5mcl9saXRlcmFsICsgZnJhZ3AtPmZyX2ZpeCk7Ci0KLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlpbnNuID0gYmZkX2dldGIxNiAoYnVmKTsKLSAgICAgIGVsc2UKLQlpbnNuID0gYmZkX2dldGwxNiAoYnVmKTsKLQotICAgICAgbWlwczE2X2ltbWVkIChmcmFncC0+ZnJfZmlsZSwgZnJhZ3AtPmZyX2xpbmUsIHR5cGUsIHZhbCwKLQkJICAgIFJFTEFYX01JUFMxNl9VU0VSX0VYVCAoZnJhZ3AtPmZyX3N1YnR5cGUpLAotCQkgICAgc21hbGwsIGV4dCwgJmluc24sICZ1c2VfZXh0ZW5kLCAmZXh0ZW5kKTsKLQotICAgICAgaWYgKHVzZV9leHRlbmQpCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIDB4ZjAwMCB8IGV4dGVuZCwgMik7Ci0JICBmcmFncC0+ZnJfZml4ICs9IDI7Ci0JICBidWYgKz0gMjsKLQl9Ci0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBpbnNuLCAyKTsKLSAgICAgIGZyYWdwLT5mcl9maXggKz0gMjsKLSAgICAgIGJ1ZiArPSAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChmcmFncC0+ZnJfb3Bjb2RlID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgICBvbGQgPSBSRUxBWF9PTEQgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLSAgICAgIG5ldyA9IFJFTEFYX05FVyAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotICAgICAgZml4cHRyID0gZnJhZ3AtPmZyX2xpdGVyYWwgKyBmcmFncC0+ZnJfZml4OwotCi0gICAgICBpZiAobmV3ID4gMCkKLQltZW1jcHkgKGZpeHB0ciAtIG9sZCwgZml4cHRyLCBuZXcpOwotCi0gICAgICBmcmFncC0+ZnJfZml4ICs9IG5ldyAtIG9sZDsKLSAgICB9Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSByZWxvY3MgaGF2ZSBiZWVuIGdlbmVyYXRlZC4KLSAgIFdlJ3ZlIGJlZW4gc3RvcmluZyBtaXBzMTYgdGV4dCBsYWJlbHMgYXMgb2RkLiAgSGVyZSB3ZSBjb252ZXJ0IHRoZW0KLSAgIGJhY2sgdG8gZXZlbiBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIHRoZSBkZWJ1Z2dlci4gICovCi0KLXZvaWQKLW1pcHNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAoKQotewotICBhc3ltYm9sICoqc3ltczsKLSAgdW5zaWduZWQgaW50IGNvdW50LCBpOwotCi0gIGlmIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuOwotCi0gIHN5bXMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKHN0ZG91dHB1dCk7Ci0gIGNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoc3Rkb3V0cHV0KTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHN5bXMrKykKLSAgICB7Ci0gICAgICBpZiAoZWxmX3N5bWJvbCAoKnN5bXMpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyID09IFNUT19NSVBTMTYKLQkgICYmICgoKnN5bXMpLT52YWx1ZSAmIDEpICE9IDApCi0JewotCSAgKCpzeW1zKS0+dmFsdWUgJj0gfjE7Ci0JICAvKiBJZiB0aGUgc3ltYm9sIGhhcyBhbiBvZGQgc2l6ZSwgaXQgd2FzIHByb2JhYmx5IGNvbXB1dGVkCi0JICAgICBpbmNvcnJlY3RseSwgc28gYWRqdXN0IHRoYXQgYXMgd2VsbC4gICovCi0JICBpZiAoKGVsZl9zeW1ib2wgKCpzeW1zKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplICYgMSkgIT0gMCkKLQkgICAgKytlbGZfc3ltYm9sICgqc3ltcyktPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLQl9Ci0gICAgfQotfQotCi0jZW5kaWYKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBsYWJlbCBpcyBkZWZpbmVkLiAgSXQgaXMgdXNlZAotICAgd2hlbiBoYW5kbGluZyBicmFuY2ggZGVsYXlzOyBpZiBhIGJyYW5jaCBoYXMgYSBsYWJlbCwgd2UgYXNzdW1lIHdlCi0gICBjYW4gbm90IG1vdmUgaXQuICAqLwotCi12b2lkCi1taXBzX2RlZmluZV9sYWJlbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QgKmw7Ci0KLSAgaWYgKGZyZWVfaW5zbl9sYWJlbHMgPT0gTlVMTCkKLSAgICBsID0gKHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mICpsKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGwgPSBmcmVlX2luc25fbGFiZWxzOwotICAgICAgZnJlZV9pbnNuX2xhYmVscyA9IGwtPm5leHQ7Ci0gICAgfQotCi0gIGwtPmxhYmVsID0gc3ltOwotICBsLT5uZXh0ID0gaW5zbl9sYWJlbHM7Ci0gIGluc25fbGFiZWxzID0gbDsKLX0KLQwKLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotCi0vKiBTb21lIHNwZWNpYWwgcHJvY2Vzc2luZyBmb3IgYSBNSVBTIEVMRiBmaWxlLiAgKi8KLQotdm9pZAotbWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyAoKQotewotICAvKiBXcml0ZSBvdXQgdGhlIHJlZ2lzdGVyIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKCEgbWlwc182NCkKLSAgICB7Ci0gICAgICBFbGYzMl9SZWdJbmZvIHM7Ci0KLSAgICAgIHMucmlfZ3BybWFzayA9IG1pcHNfZ3BybWFzazsKLSAgICAgIHMucmlfY3BybWFza1swXSA9IG1pcHNfY3BybWFza1swXTsKLSAgICAgIHMucmlfY3BybWFza1sxXSA9IG1pcHNfY3BybWFza1sxXTsKLSAgICAgIHMucmlfY3BybWFza1syXSA9IG1pcHNfY3BybWFza1syXTsKLSAgICAgIHMucmlfY3BybWFza1szXSA9IG1pcHNfY3BybWFza1szXTsKLSAgICAgIC8qIFRoZSBncF92YWx1ZSBmaWVsZCBpcyBzZXQgYnkgdGhlIE1JUFMgRUxGIGJhY2tlbmQuICAqLwotCi0gICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9fb3V0IChzdGRvdXRwdXQsICZzLAotCQkJCSAgICAgICAoKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKikKLQkJCQkJbWlwc19yZWdtYXNrX2ZyYWcpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvIHM7Ci0KLSAgICAgIHMucmlfZ3BybWFzayA9IG1pcHNfZ3BybWFzazsKLSAgICAgIHMucmlfcGFkID0gMDsKLSAgICAgIHMucmlfY3BybWFza1swXSA9IG1pcHNfY3BybWFza1swXTsKLSAgICAgIHMucmlfY3BybWFza1sxXSA9IG1pcHNfY3BybWFza1sxXTsKLSAgICAgIHMucmlfY3BybWFza1syXSA9IG1pcHNfY3BybWFza1syXTsKLSAgICAgIHMucmlfY3BybWFza1szXSA9IG1pcHNfY3BybWFza1szXTsKLSAgICAgIC8qIFRoZSBncF92YWx1ZSBmaWVsZCBpcyBzZXQgYnkgdGhlIE1JUFMgRUxGIGJhY2tlbmQuICAqLwotCi0gICAgICBiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9fb3V0IChzdGRvdXRwdXQsICZzLAotCQkJCSAgICAgICAoKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKikKLQkJCQkJbWlwc19yZWdtYXNrX2ZyYWcpKTsKLSAgICB9Ci0KLSAgLyogU2V0IHRoZSBNSVBTIEVMRiBmbGFnIGJpdHMuICBGSVhNRTogVGhlcmUgc2hvdWxkIHByb2JhYmx5IGJlIHNvbWUKLSAgICAgc29ydCBvZiBCRkQgaW50ZXJmYWNlIGZvciB0aGlzLiAgKi8KLSAgaWYgKG1pcHNfYW55X25vcmVvcmRlcikKLSAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX01JUFNfTk9SRU9SREVSOwotICBpZiAobWlwc19waWMgIT0gTk9fUElDKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfTUlQU19QSUM7Ci0KLSAgLyogU2V0IHRoZSBNSVBTIEVMRiBBQkkgZmxhZ3MuICovCi0gIGlmIChtaXBzX2FiaV9zdHJpbmcgPT0gMCkKLSAgICA7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobWlwc19hYmlfc3RyaW5nLCIzMiIpID09IDApCi0gICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFX01JUFNfQUJJX08zMjsKLSAgZWxzZSBpZiAoc3RyY21wIChtaXBzX2FiaV9zdHJpbmcsIm82NCIpID09IDApCi0gICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFX01JUFNfQUJJX082NDsKLSAgZWxzZSBpZiAoc3RyY21wIChtaXBzX2FiaV9zdHJpbmcsImVhYmkiKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChtaXBzX2VhYmk2NCkKLQllbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVfTUlQU19BQklfRUFCSTY0OwotICAgICAgZWxzZQotCWVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRV9NSVBTX0FCSV9FQUJJMzI7Ci0gICAgfQotCi0gIGlmIChtaXBzXzMyYml0bW9kZSkKLSAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX01JUFNfMzJCSVRNT0RFOwotfQotCi0jZW5kaWYgLyogT0JKX0VMRiB8fCBPQkpfTUFZQkVfRUxGICovCi0MCi10eXBlZGVmIHN0cnVjdCBwcm9jCi0gIHsKLSAgICBzeW1ib2xTICppc3ltOwotICAgIHVuc2lnbmVkIGxvbmcgcmVnX21hc2s7Ci0gICAgdW5zaWduZWQgbG9uZyByZWdfb2Zmc2V0OwotICAgIHVuc2lnbmVkIGxvbmcgZnByZWdfbWFzazsKLSAgICB1bnNpZ25lZCBsb25nIGZwcmVnX29mZnNldDsKLSAgICB1bnNpZ25lZCBsb25nIGZyYW1lX29mZnNldDsKLSAgICB1bnNpZ25lZCBsb25nIGZyYW1lX3JlZzsKLSAgICB1bnNpZ25lZCBsb25nIHBjX3JlZzsKLSAgfQotcHJvY1M7Ci0KLXN0YXRpYyBwcm9jUyBjdXJfcHJvYzsKLXN0YXRpYyBwcm9jUyAqY3VyX3Byb2NfcHRyOwotc3RhdGljIGludCBudW1wcm9jczsKLQotc3RhdGljIHZvaWQKLW1kX29ial9iZWdpbiAoKQotewotfQotCi1zdGF0aWMgdm9pZAotbWRfb2JqX2VuZCAoKQotewotICAvKiBjaGVjayBmb3IgcHJlbWF0dXJlIGVuZCwgbmVzdGluZyBlcnJvcnMsIGV0YyAqLwotICBpZiAoY3VyX3Byb2NfcHRyKQotICAgIGFzX3dhcm4gKF8oIm1pc3NpbmcgYC5lbmQnIGF0IGVuZCBvZiBhc3NlbWJseSIpKTsKLX0KLQotc3RhdGljIGxvbmcKLWdldF9udW1iZXIgKCkKLXsKLSAgaW50IG5lZ2F0aXZlID0gMDsKLSAgbG9uZyB2YWwgPSAwOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICctJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIG5lZ2F0aXZlID0gMTsKLSAgICB9Ci0gIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgc2ltcGxlIG51bWJlci4iKSk7Ci0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzAnKQotICAgIHsKLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ3gnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCSAgd2hpbGUgKGlzeGRpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JICAgIHsKLQkgICAgICB2YWwgPDw9IDQ7Ci0JICAgICAgdmFsIHw9IGhleF92YWx1ZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrKTsKLQkgICAgfQotCSAgcmV0dXJuIG5lZ2F0aXZlID8gLXZhbCA6IHZhbDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotCSAgICB7Ci0JICAgICAgdmFsIDw8PSAzOwotCSAgICAgIHZhbCB8PSAqaW5wdXRfbGluZV9wb2ludGVyKysgLSAnMCc7Ci0JICAgIH0KLQkgIHJldHVybiBuZWdhdGl2ZSA/IC12YWwgOiB2YWw7Ci0JfQotICAgIH0KLSAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgewotICAgICAgcHJpbnRmIChfKCIgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJWMnIDB4JTAyeFxuIiksCi0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciwgKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0gICAgICBhc193YXJuIChfKCJJbnZhbGlkIG51bWJlciIpKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgewotICAgICAgdmFsICo9IDEwOwotICAgICAgdmFsICs9ICppbnB1dF9saW5lX3BvaW50ZXIrKyAtICcwJzsKLSAgICB9Ci0gIHJldHVybiBuZWdhdGl2ZSA/IC12YWwgOiB2YWw7Ci19Ci0KLS8qIFRoZSAuZmlsZSBkaXJlY3RpdmU7IGp1c3QgbGlrZSB0aGUgdXN1YWwgLmZpbGUgZGlyZWN0aXZlLCBidXQgdGhlcmUKLSAgIGlzIGFuIGluaXRpYWwgbnVtYmVyIHdoaWNoIGlzIHRoZSBFQ09GRiBmaWxlIGluZGV4LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZmlsZSAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIGludCBsaW5lOwotCi0gIGxpbmUgPSBnZXRfbnVtYmVyICgpOwotICBzX2FwcF9maWxlICgwKTsKLX0KLQotCi0vKiBUaGUgLmVuZCBkaXJlY3RpdmUuICAqLwotCi1zdGF0aWMgdm9pZAotc19taXBzX2VuZCAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHN5bWJvbFMgKnA7Ci0gIGludCBtYXliZV90ZXh0OwotCi0gIGlmICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIHAgPSBnZXRfc3ltYm9sICgpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwID0gTlVMTDsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKLSAgICBtYXliZV90ZXh0ID0gMTsKLSAgZWxzZQotICAgIG1heWJlX3RleHQgPSAwOwotI2Vsc2UKLSAgaWYgKG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uICYmIG5vd19zZWcgIT0gYnNzX3NlY3Rpb24pCi0gICAgbWF5YmVfdGV4dCA9IDE7Ci0gIGVsc2UKLSAgICBtYXliZV90ZXh0ID0gMDsKLSNlbmRpZgotCi0gIGlmICghbWF5YmVfdGV4dCkKLSAgICBhc193YXJuIChfKCIuZW5kIG5vdCBpbiB0ZXh0IHNlY3Rpb24iKSk7Ci0KLSAgaWYgKCFjdXJfcHJvY19wdHIpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZS4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzc2VydCAoU19HRVRfTkFNRSAocCkpOwotICAgICAgaWYgKHN0cmNtcCAoU19HRVRfTkFNRSAocCksIFNfR0VUX05BTUUgKGN1cl9wcm9jX3B0ci0+aXN5bSkpKQotCWFzX3dhcm4gKF8oIi5lbmQgc3ltYm9sIGRvZXMgbm90IG1hdGNoIC5lbnQgc3ltYm9sLiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSBtaXNzaW5nIG9yIHVua25vd24gc3ltYm9sIikpOwotCi0jaWZkZWYgTUlQU19TVEFCU19FTEYKLSAgewotICAgIHNlZ1Qgc2F2ZWRfc2VnID0gbm93X3NlZzsKLSAgICBzdWJzZWdUIHNhdmVkX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgZnJhZ1MgKnNhdmVkX2ZyYWcgPSBmcmFnX25vdzsKLSAgICB2YWx1ZVQgZG90OwotICAgIHNlZ1Qgc2VnOwotICAgIGV4cHJlc3Npb25TIGV4cDsKLSAgICBjaGFyICpmcmFncDsKLQotICAgIGRvdCA9IGZyYWdfbm93X2ZpeCAoKTsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gICAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICAgIGFzc2VydCAocGRyX3NlZyk7Ci0gICAgc3Vic2VnX3NldCAocGRyX3NlZywgMCk7Ci0KLSAgICAvKiBXcml0ZSB0aGUgc3ltYm9sICovCi0gICAgZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICBleHAuWF9hZGRfc3ltYm9sID0gcDsKLSAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICBlbWl0X2V4cHIgKCZleHAsIDQpOwotCi0gICAgZnJhZ3AgPSBmcmFnX21vcmUgKDcqNCk7Ci0KLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwLCAgICAgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5yZWdfbWFzaywgNCk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArIDQsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+cmVnX29mZnNldCwgNCk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArIDgsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+ZnByZWdfbWFzaywgNCk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArMTIsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+ZnByZWdfb2Zmc2V0LCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsxNiwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5mcmFtZV9vZmZzZXQsIDQpOwotICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ3AgKzIwLCAodmFsdWVUKSBjdXJfcHJvY19wdHItPmZyYW1lX3JlZywgNCk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArMjQsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+cGNfcmVnLCA0KTsKLQotICAgIHN1YnNlZ19zZXQgKHNhdmVkX3NlZywgc2F2ZWRfc3Vic2VnKTsKLSAgfQotI2VuZGlmCi0KLSAgY3VyX3Byb2NfcHRyID0gTlVMTDsKLX0KLQotLyogVGhlIC5hZW50IGFuZCAuZW50IGRpcmVjdGl2ZXMuICAqLwotCi1zdGF0aWMgdm9pZAotc19taXBzX2VudCAoYWVudCkKLSAgICAgaW50IGFlbnQ7Ci17Ci0gIGludCBudW1iZXIgPSAwOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgbWF5YmVfdGV4dDsKLQotICBzeW1ib2xQID0gZ2V0X3N5bWJvbCAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICAgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotICAgIG51bWJlciA9IGdldF9udW1iZXIgKCk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5vd19zZWcpICYgU0VDX0NPREUpICE9IDApCi0gICAgbWF5YmVfdGV4dCA9IDE7Ci0gIGVsc2UKLSAgICBtYXliZV90ZXh0ID0gMDsKLSNlbHNlCi0gIGlmIChub3dfc2VnICE9IGRhdGFfc2VjdGlvbiAmJiBub3dfc2VnICE9IGJzc19zZWN0aW9uKQotICAgIG1heWJlX3RleHQgPSAxOwotICBlbHNlCi0gICAgbWF5YmVfdGV4dCA9IDA7Ci0jZW5kaWYKLQotICBpZiAoIW1heWJlX3RleHQpCi0gICAgYXNfd2FybiAoXygiLmVudCBvciAuYWVudCBub3QgaW4gdGV4dCBzZWN0aW9uLiIpKTsKLQotICBpZiAoIWFlbnQgJiYgY3VyX3Byb2NfcHRyKQotICAgIGFzX3dhcm4gKF8oIm1pc3NpbmcgYC5lbmQnIikpOwotCi0gIGlmICghYWVudCkKLSAgICB7Ci0gICAgICBjdXJfcHJvY19wdHIgPSAmY3VyX3Byb2M7Ci0gICAgICBtZW1zZXQgKGN1cl9wcm9jX3B0ciwgJ1wwJywgc2l6ZW9mIChwcm9jUykpOwotCi0gICAgICBjdXJfcHJvY19wdHItPmlzeW0gPSBzeW1ib2xQOwotCi0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQotICAgICAgbnVtcHJvY3MrKzsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5mcmFtZSBkaXJlY3RpdmUuIElmIHRoZSBtZGVidWcgc2VjdGlvbiBpcyBwcmVzZW50IChJUklYIDUgbmF0aXZlKQotICAgdGhlbiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfZnJhbWUpIGlzIHVzZWQuIEZvciBlbWJlZGRlZCB0YXJnZXRzLCAKLSAgIHNfbWlwc19mcmFtZSBpcyB1c2VkIHNvIHRoYXQgd2UgY2FuIHNldCB0aGUgUERSIGluZm9ybWF0aW9uIGNvcnJlY3RseS4KLSAgIFdlIGNhbid0IHVzZSB0aGUgZWNvZmYgcm91dGluZXMgYmVjYXVzZSB0aGV5IG1ha2UgcmVmZXJlbmNlIHRvIHRoZSBlY29mZiAKLSAgIHN5bWJvbCB0YWJsZSAoaW4gdGhlIG1kZWJ1ZyBzZWN0aW9uKS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfZnJhbWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotCi0gIGxvbmcgdmFsOwotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gIChwcm9jUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5mcmFtZSBvdXRzaWRlIG9mIC5lbnQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPmZyYW1lX3JlZyA9IHRjX2dldF9yZWdpc3RlciAoMSk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICcsJwotICAgICAgfHwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLmZyYW1lIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5mcmFtZV9vZmZzZXQgPSB2YWw7Ci0gIGN1cl9wcm9jX3B0ci0+cGNfcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgwKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotI2Vsc2UKLSAgc19pZ25vcmUgKGlnbm9yZSk7Ci0jZW5kaWYgLyogTUlQU19TVEFCU19FTEYgKi8KLX0KLQotLyogVGhlIC5mbWFzayBhbmQgLm1hc2sgZGlyZWN0aXZlcy4gSWYgdGhlIG1kZWJ1ZyBzZWN0aW9uIGlzIHByZXNlbnQgCi0gICAoSVJJWCA1IG5hdGl2ZSkgdGhlbiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfbWFzaykgaXMgdXNlZC4gRm9yIAotICAgZW1iZWRkZWQgdGFyZ2V0cywgc19taXBzX21hc2sgaXMgdXNlZCBzbyB0aGF0IHdlIGNhbiBzZXQgdGhlIFBEUgotICAgaW5mb3JtYXRpb24gY29ycmVjdGx5LiBXZSBjYW4ndCB1c2UgdGhlIGVjb2ZmIHJvdXRpbmVzIGJlY2F1c2UgdGhleSAKLSAgIG1ha2UgcmVmZXJlbmNlIHRvIHRoZSBlY29mZiBzeW1ib2wgdGFibGUgKGluIHRoZSBtZGVidWcgc2VjdGlvbikuICAqLwotCi1zdGF0aWMgdm9pZAotc19taXBzX21hc2sgKHJlZ190eXBlKQotICAgICBjaGFyIHJlZ190eXBlOwotewotI2lmZGVmIE1JUFNfU1RBQlNfRUxGCi0gIGxvbmcgbWFzaywgb2ZmOwotICAKLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY1MgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIubWFzay8uZm1hc2sgb3V0c2lkZSBvZiAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmbWFzaykgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAubWFzay8uZm1hc2sgZGlyZWN0aXZlIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBvZmYgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBpZiAocmVnX3R5cGUgPT0gJ0YnKQotICAgIHsKLSAgICAgIGN1cl9wcm9jX3B0ci0+ZnByZWdfbWFzayA9IG1hc2s7Ci0gICAgICBjdXJfcHJvY19wdHItPmZwcmVnX29mZnNldCA9IG9mZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjdXJfcHJvY19wdHItPnJlZ19tYXNrID0gbWFzazsKLSAgICAgIGN1cl9wcm9jX3B0ci0+cmVnX29mZnNldCA9IG9mZjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSNlbHNlCi0gIHNfaWdub3JlIChyZWdfdHlwZSk7Ci0jZW5kaWYgLyogTUlQU19TVEFCU19FTEYgKi8KLX0KLQotLyogVGhlIC5sb2MgZGlyZWN0aXZlLiAgKi8KLQotI2lmIDAKLXN0YXRpYyB2b2lkCi1zX2xvYyAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCBsaW5lbm87Ci0gIGludCBhZGRyb2ZmOwotCi0gIGFzc2VydCAobm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24pOwotCi0gIGxpbmVubyA9IGdldF9udW1iZXIgKCk7Ci0gIGFkZHJvZmYgPSBmcmFnX25vd19maXggKCk7Ci0KLSAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKCIiLCBOX1NMSU5FLCBhZGRyb2ZmLCBmcmFnX25vdyk7Ci0gIFNfU0VUX1RZUEUgKHN5bWJvbFAsIE5fU0xJTkUpOwotICBTX1NFVF9PVEhFUiAoc3ltYm9sUCwgMCk7Ci0gIFNfU0VUX0RFU0MgKHN5bWJvbFAsIGxpbmVubyk7Ci0gIHN5bWJvbFAtPnN5X3NlZ21lbnQgPSBub3dfc2VnOwotfQotI2VuZGlmCi0KLQotICAKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbWlwcy5oIGIvZ2FzL2NvbmZpZy90Yy1taXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZmQ5OTguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyogdGMtbWlwcy5oIC0tIGhlYWRlciBmaWxlIGZvciB0Yy1taXBzLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgdGhlIE9TRiBhbmQgUmFscGggQ2FtcGJlbGwuCi0gICBXcml0dGVuIGJ5IEtlaXRoIEtub3dsZXMgYW5kIFJhbHBoIENhbXBiZWxsLCB3b3JraW5nIGluZGVwZW5kZW50bHkuCi0gICBNb2RpZmllZCBmb3IgRUNPRkYgc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVENfTUlQUwotCi0jZGVmaW5lIFRDX01JUFMKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGZyYWc7Ci1zdHJ1Y3QgZXhwcmVzc2lvblM7Ci0jZW5kaWYKLQotLyogRGVmYXVsdCB0byBiaWcgZW5kaWFuLiAgKi8KLSNpZm5kZWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4JCTEKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX21pcHMKLQotI2RlZmluZSBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMKLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAkxCi0jZGVmaW5lIE9MRF9GTE9BVF9SRUFEUwotI2RlZmluZSBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUwotI2RlZmluZSBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUKLSNkZWZpbmUgTUFYX1JFTE9DX0VYUEFOU0lPTiAzCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIE1heGltdW0gc3ltYm9sIG9mZnNldCB0aGF0IGNhbiBiZSBlbmNvZGVkIGluIGEgQkZEX1JFTE9DX01JUFNfR1BSRUwKLSAgIHJlbG9jYXRpb246ICovCi0jZGVmaW5lIE1BWF9HUFJFTF9PRkZTRVQgKDB4N0ZGNCkKLQotI2RlZmluZSBtZF9yZWxheF9mcmFnKGZyYWdwLCBzdHJldGNoKSBtaXBzX3JlbGF4X2ZyYWcoZnJhZ3AsIHN0cmV0Y2gpCi1leHRlcm4gaW50IG1pcHNfcmVsYXhfZnJhZyBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqLCBsb25nKSk7Ci0KLSNkZWZpbmUgbWRfdW5kZWZpbmVkX3N5bWJvbChuYW1lKQkoMCkKLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0vKiBXZSBwZXJtaXQgUEMgcmVsYXRpdmUgZGlmZmVyZW5jZSBleHByZXNzaW9ucyB3aGVuIGdlbmVyYXRpbmcKLSAgIGVtYmVkZGVkIFBJQyBjb2RlLiAgKi8KLSNkZWZpbmUgRElGRl9FWFBSX09LCi0KLS8qIFRlbGwgYXNzZW1ibGVyIHRoYXQgd2UgaGF2ZSBhbiBpdGJsX21pcHMuaCBoZWFkZXIgZmlsZSB0byBpbmNsdWRlLiAqLwotI2RlZmluZSBIQVZFX0lUQkxfQ1BVCi0KLS8qIFRoZSBlbmRpYW5uZXNzIG9mIHRoZSB0YXJnZXQgZm9ybWF0IG1heSBjaGFuZ2UgYmFzZWQgb24gY29tbWFuZAotICAgbGluZSBhcmd1bWVudHMuICAqLwotI2RlZmluZSBUQVJHRVRfRk9STUFUIG1pcHNfdGFyZ2V0X2Zvcm1hdCgpCi1leHRlcm4gY29uc3QgY2hhciAqbWlwc190YXJnZXRfZm9ybWF0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RydWN0IG1pcHNfY2xfaW5zbgotewotICB1bnNpZ25lZCBsb25nIGluc25fb3Bjb2RlOwotICBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKmluc25fbW87Ci0gIC8qIFRoZSBuZXh0IHR3byBmaWVsZHMgYXJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIG1pcHMxNiBjb2RlLiAgKi8KLSAgYm9vbGVhbiB1c2VfZXh0ZW5kOwotICB1bnNpZ25lZCBzaG9ydCBleHRlbmQ7Ci19OwotCi1leHRlcm4gaW50IHRjX2dldF9yZWdpc3RlciBQQVJBTVMgKChpbnQgZnJhbWUpKTsKLQotI2RlZmluZSB0Y19pbml0X2FmdGVyX2FyZ3MoKSBtaXBzX2luaXRfYWZ0ZXJfYXJncygpCi1leHRlcm4gdm9pZCBtaXBzX2luaXRfYWZ0ZXJfYXJncyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgbWRfcGFyc2VfbG9uZ19vcHRpb24oYXJnKSBtaXBzX3BhcnNlX2xvbmdfb3B0aW9uIChhcmcpCi1leHRlcm4gaW50IG1pcHNfcGFyc2VfbG9uZ19vcHRpb24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pIG1pcHNfZGVmaW5lX2xhYmVsIChzeW0pCi1leHRlcm4gdm9pZCBtaXBzX2RlZmluZV9sYWJlbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotI2RlZmluZSB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCgpIG1pcHNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKCkKLWV4dGVybiB2b2lkIG1pcHNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIHRjX2Zyb2JfZmlsZSgpIG1pcHNfZnJvYl9maWxlICgpCi1leHRlcm4gdm9pZCBtaXBzX2Zyb2JfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotI2RlZmluZSB0Y19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIG1pcHNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotZXh0ZXJuIHZvaWQgbWlwc19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfbWlwcwotZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X21pcHMKLSAgUEFSQU1TICgoc3RydWN0IGZyYWcgKiwgaW50LCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBleHByZXNzaW9uUyAqKSk7Ci0KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoZml4cCkgbWlwc19maXhfYWRqdXN0YWJsZSAoZml4cCkKLWV4dGVybiBpbnQgbWlwc19maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotLyogV2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlIHdlIG11c3Qga2VlcCBQQyByZWxhdGl2ZQotICAgcmVsb2NhdGlvbnMuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeHApIG1pcHNfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLWV4dGVybiBpbnQgbWlwc19mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBtZF9hcHBseV9maXggc2V0cyBmeF9kb25lIGNvcnJlY3RseS4gICovCi0jZGVmaW5lIFRDX0hBTkRMRV9GWF9ET05FIDEKLQotLyogUmVnaXN0ZXIgbWFzayB2YXJpYWJsZXMuICBUaGVzZSBhcmUgc2V0IGJ5IHRoZSBNSVBTIGFzc2VtYmx5IGNvZGUKLSAgIGFuZCB1c2VkIGJ5IEVDT0ZGIGFuZCBwb3NzaWJseSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLiAgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIG1pcHNfZ3BybWFzazsKLWV4dGVybiB1bnNpZ25lZCBsb25nIG1pcHNfY3BybWFza1s0XTsKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0KLSNkZWZpbmUgZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcgbWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZwotZXh0ZXJuIHZvaWQgbWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIuc2RhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9NSVBTX0dQUkVMCX0sIFwKLSAgeyAiLnNic3MiLAlTSFRfTk9CSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfTUlQU19HUFJFTAl9LCBcCi0gIHsgIi5saXQ0IiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfTUlQU19HUFJFTAl9LCBcCi0gIHsgIi5saXQ4IiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfTUlQU19HUFJFTAl9LCBcCi0gIHsgIi51Y29kZSIsCVNIVF9NSVBTX1VDT0RFLAkwCQkJCQl9LCBcCi0gIHsgIi5tZGVidWciLAlTSFRfTUlQU19ERUJVRywJMAkJCQkJfSwKLS8qIE90aGVyIHNwZWNpYWwgc2VjdGlvbnMgbm90IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyOiAucmVnaW5mbywKLSAgIC5saWJsaXN0LCAuY29uZmxpY3QsIC5ncHRhYiwgLmdvdCwgLmR5bmFtaWMsIC5yZWwuZHluLiAgKi8KLQotI2VuZGlmCi0KLWV4dGVybiB2b2lkIG1kX21pcHNfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZW5kKCkJbWRfbWlwc19lbmQoKQotCi0jZGVmaW5lIFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQJKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyIFwKLQkJCQkgfHwgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCi1leHRlcm4gdm9pZCBtaXBzX3BvcF9pbnNlcnQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9wb3BfaW5zZXJ0KCkJCW1pcHNfcG9wX2luc2VydCgpCi0KLWV4dGVybiB2b2lkIG1pcHNfZmx1c2hfcGVuZGluZ19vdXRwdXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCBtaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0KLWV4dGVybiB2b2lkIG1pcHNfZW5hYmxlX2F1dG9fYWxpZ24gUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpCW1pcHNfZW5hYmxlX2F1dG9fYWxpZ24oKQotCi0jZW5kaWYgLyogVENfTUlQUyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tbjEwMjAwLmMgYi9nYXMvY29uZmlnL3RjLW1uMTAyMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0ZjdiZi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1uMTAyMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MTQgKzAsMCBAQAotLyogdGMtbW4xMDIwMC5jIC0tIEFzc2VtYmxlciBjb2RlIGZvciB0aGUgTWF0c3VzaGl0YSAxMDIwMAotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAotI2luY2x1ZGUgIm9wY29kZS9tbjEwMjAwLmgiCi0MCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcmVnX25hbWUKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50IHZhbHVlOwotfTsKLQotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsIHRhcmdldHMuICovCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIjsjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhIAotICAgc2luZ2xlIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcgCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsIAotICAgYXMgaW4gMGQxLjAuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0MCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPSB7Ci0gIC8qIGJDQyByZWxheGluZyAqLwotICB7MHg4MSwgLTB4N2UsIDIsIDF9LAotICB7MHg4MDA0LCAtMHg3ZmZiLCA1LCAyfSwKLSAgezB4ODAwMDA2LCAtMHg3ZmZmZjksIDcsIDB9LAotICAvKiBiQ0N4IHJlbGF4aW5nICovCi0gIHsweDgxLCAtMHg3ZSwgMywgNH0sCi0gIHsweDgwMDQsIC0weDdmZmIsIDYsIDV9LAotICB7MHg4MDAwMDYsIC0weDdmZmZmOSwgOCwgMH0sCi0gIC8qIGpzciByZWxheGluZyAqLwotICB7MHg4MDA0LCAtMHg3ZmZiLCAzLCA3fSwKLSAgezB4ODAwMDA2LCAtMHg3ZmZmZjksIDUsIDB9LAotICAvKiBqbXAgcmVsYXhpbmcgKi8KLSAgezB4ODEsIC0weDdlLCAyLCA5fSwKLSAgezB4ODAwNCwgLTB4N2ZmYiwgMywgMTB9LAotICB7MHg4MDAwMDYsIC0weDdmZmZmOSwgNSwgMH0sCi0KLX07Ci0vKiBsb2NhbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIG1uMTAyMDBfaW5zZXJ0X29wZXJhbmQgUEFSQU1TICgodW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICosCi0JCQkJCSAgICBvZmZzZXRULCBjaGFyICosIHVuc2lnbmVkLAotCQkJCQkgICAgdW5zaWduZWQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNoZWNrX29wZXJhbmQgUEFSQU1TICgodW5zaWduZWQgbG9uZywKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKiwKLQkJCQkJICAgIG9mZnNldFQpKTsKLXN0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZWdfbmFtZSAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZGF0YV9yZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotc3RhdGljIGJvb2xlYW4gYWRkcmVzc19yZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotc3RhdGljIGJvb2xlYW4gb3RoZXJfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLQotCi0vKiBmaXh1cHMgKi8KLSNkZWZpbmUgTUFYX0lOU05fRklYVVBTICg1KQotc3RydWN0IG1uMTAyMDBfZml4dXAKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgb3BpbmRleDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLXN0cnVjdCBtbjEwMjAwX2ZpeHVwIGZpeHVwc1tNQVhfSU5TTl9GSVhVUFNdOwotc3RhdGljIGludCBmYzsKLQwKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOyAKLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyBOVUxMLCAgICAgICBOVUxMLCAgICAgICAgICAgMCB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqbW4xMDIwMF9oYXNoOwotCi0vKiBUaGlzIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIGRhdGFfcmVnaXN0ZXJzW10gPQotewotICB7ICJkMCIsIDAgfSwKLSAgeyAiZDEiLCAxIH0sCi0gIHsgImQyIiwgMiB9LAotICB7ICJkMyIsIDMgfSwKLX07Ci0jZGVmaW5lIERBVEFfUkVHX05BTUVfQ05UCShzaXplb2YoZGF0YV9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgYWRkcmVzc19yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImEwIiwgMCB9LAotICB7ICJhMSIsIDEgfSwKLSAgeyAiYTIiLCAyIH0sCi0gIHsgImEzIiwgMyB9LAotfTsKLSNkZWZpbmUgQUREUkVTU19SRUdfTkFNRV9DTlQJKHNpemVvZihhZGRyZXNzX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBvdGhlcl9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgIm1kciIsIDAgfSwKLSAgeyAicHN3IiwgMCB9LAotfTsKLSNkZWZpbmUgT1RIRVJfUkVHX05BTUVfQ05UCShzaXplb2Yob3RoZXJfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi0vKiByZWdfbmFtZV9zZWFyY2ggZG9lcyBhIGJpbmFyeSBzZWFyY2ggb2YgdGhlIGdpdmVuIHJlZ2lzdGVyIHRhYmxlCi0gICB0byBzZWUgaWYgIm5hbWUiIGlzIGEgdmFsaWQgcmVnaXRlciBuYW1lLiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIKLSAgIG51bWJlciBmcm9tIHRoZSBhcnJheSBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLiAqLwotCi1zdGF0aWMgaW50Ci1yZWdfbmFtZV9zZWFyY2ggKHJlZ3MsIHJlZ2NvdW50LCBuYW1lKQotICAgICBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgKnJlZ3M7Ci0gICAgIGludCByZWdjb3VudDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSByZWdjb3VudCAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgcmVnc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlIAotCSAgcmV0dXJuIHJlZ3NbbWlkZGxlXS52YWx1ZTsKLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0gIHJldHVybiAtMTsKLX0KLQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1kYXRhX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGRhdGFfcmVnaXN0ZXJzLCBEQVRBX1JFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotYWRkcmVzc19yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpbnQgcmVnX251bWJlcjsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqc3RhcnQ7Ci0gIGNoYXIgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChhZGRyZXNzX3JlZ2lzdGVycywgQUREUkVTU19SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLW90aGVyX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKG90aGVyX3JlZ2lzdGVycywgT1RIRVJfUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIk1OMTAyMDAgb3B0aW9uczpcblwKLW5vbmUgeWV0XG4iKSk7Ci19IAotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRwLCBzaXplcCkKLSAgaW50IHR5cGU7Ci0gIGNoYXIgKmxpdHA7Ci0gIGludCAqc2l6ZXA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVwID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mIik7Ci0gICAgfQotICAKLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVwID0gcHJlYyAqIDI7Ci0KLSAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0cCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotICAgICAgbGl0cCArPSAyOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgZnJhZ1MgKmZyYWdQOwotewotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYWJlbF9jb3VudCA9IDA7Ci0gIGNoYXIgYnVmWzQwXTsKLQotICBzdWJzZWdfY2hhbmdlIChzZWMsIDApOwotICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMSkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdICYgMHhmZjsKLQotICAgICAgc3dpdGNoIChvcGNvZGUpCi0JewotCWNhc2UgMHhlODoKLQkgIG9wY29kZSA9IDB4ZTk7Ci0JICBicmVhazsKLQljYXNlIDB4ZTk6Ci0JICBvcGNvZGUgPSAweGU4OwotCSAgYnJlYWs7Ci0JY2FzZSAweGUwOgotCSAgb3Bjb2RlID0gMHhlMjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMjoKLQkgIG9wY29kZSA9IDB4ZTA7Ci0JICBicmVhazsKLQljYXNlIDB4ZTM6Ci0JICBvcGNvZGUgPSAweGUxOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUxOgotCSAgb3Bjb2RlID0gMHhlMzsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNDoKLQkgIG9wY29kZSA9IDB4ZTY7Ci0JICBicmVhazsKLQljYXNlIDB4ZTY6Ci0JICBvcGNvZGUgPSAweGU0OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU3OgotCSAgb3Bjb2RlID0gMHhlNTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNToKLQkgIG9wY29kZSA9IDB4ZTc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IG9wY29kZTsKLQotICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwKLQkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMl0gPSAweGZjOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAzLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDU7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyKQotICAgIHsKLSAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgaW50IG9wY29kZSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGU4OgotCSAgb3Bjb2RlID0gMHhlOTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlOToKLQkgIG9wY29kZSA9IDB4ZTg7Ci0JICBicmVhazsKLQljYXNlIDB4ZTA6Ci0JICBvcGNvZGUgPSAweGUyOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUyOgotCSAgb3Bjb2RlID0gMHhlMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMzoKLQkgIG9wY29kZSA9IDB4ZTE7Ci0JICBicmVhazsKLQljYXNlIDB4ZTE6Ci0JICBvcGNvZGUgPSAweGUzOwotCSAgYnJlYWs7Ci0JY2FzZSAweGU0OgotCSAgb3Bjb2RlID0gMHhlNjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNjoKLQkgIG9wY29kZSA9IDB4ZTQ7Ci0JICBicmVhazsKLQljYXNlIDB4ZTc6Ci0JICBvcGNvZGUgPSAweGU1OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU1OgotCSAgb3Bjb2RlID0gMHhlNzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAyXSA9IDB4ZjQ7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXSA9IDB4ZTA7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDQsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18yNF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNzsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDMpCi0gICAgewotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAxLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMzsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDQpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGZjOgotCSAgb3Bjb2RlID0gMHhmZDsKLQkgIGJyZWFrOwotCWNhc2UgMHhmZDoKLQkgIG9wY29kZSA9IDB4ZmM7Ci0JICBicmVhazsKLQljYXNlIDB4ZmU6Ci0JICBvcGNvZGUgPSAweGZmOwotCSAgYnJlYWs7Ci0JY2FzZSAweGZmOgotCSAgb3Bjb2RlID0gMHhmZTsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU5OgotCSAgb3Bjb2RlID0gMHhlODsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMDoKLQkgIG9wY29kZSA9IDB4ZTI7Ci0JICBicmVhazsKLQljYXNlIDB4ZTI6Ci0JICBvcGNvZGUgPSAweGUwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUzOgotCSAgb3Bjb2RlID0gMHhlMTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMToKLQkgIG9wY29kZSA9IDB4ZTM7Ci0JICBicmVhazsKLQljYXNlIDB4ZTQ6Ci0JICBvcGNvZGUgPSAweGU2OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU2OgotCSAgb3Bjb2RlID0gMHhlNDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNzoKLQkgIG9wY29kZSA9IDB4ZTU7Ci0JICBicmVhazsKLQljYXNlIDB4ZTU6Ci0JICBvcGNvZGUgPSAweGU3OwotCSAgYnJlYWs7Ci0JY2FzZSAweGVjOgotCSAgb3Bjb2RlID0gMHhlZDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlZDoKLQkgIG9wY29kZSA9IDB4ZWM7Ci0JICBicmVhazsKLQljYXNlIDB4ZWU6Ci0JICBvcGNvZGUgPSAweGVmOwotCSAgYnJlYWs7Ci0JY2FzZSAweGVmOgotCSAgb3Bjb2RlID0gMHhlZTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IG9wY29kZTsKLQotICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMSwKLQkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM10gPSAweGZjOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA0LCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDY7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA1KQotICAgIHsKLSAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgaW50IG9wY29kZSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdICYgMHhmZjsKLQotICAgICAgc3dpdGNoIChvcGNvZGUpCi0JewotCWNhc2UgMHhmYzoKLQkgIG9wY29kZSA9IDB4ZmQ7Ci0JICBicmVhazsKLQljYXNlIDB4ZmQ6Ci0JICBvcGNvZGUgPSAweGZjOwotCSAgYnJlYWs7Ci0JY2FzZSAweGZlOgotCSAgb3Bjb2RlID0gMHhmZjsKLQkgIGJyZWFrOwotCWNhc2UgMHhmZjoKLQkgIG9wY29kZSA9IDB4ZmU7Ci0JY2FzZSAweGU4OgotCSAgb3Bjb2RlID0gMHhlOTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlOToKLQkgIG9wY29kZSA9IDB4ZTg7Ci0JICBicmVhazsKLQljYXNlIDB4ZTA6Ci0JICBvcGNvZGUgPSAweGUyOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUyOgotCSAgb3Bjb2RlID0gMHhlMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMzoKLQkgIG9wY29kZSA9IDB4ZTE7Ci0JICBicmVhazsKLQljYXNlIDB4ZTE6Ci0JICBvcGNvZGUgPSAweGUzOwotCSAgYnJlYWs7Ci0JY2FzZSAweGU0OgotCSAgb3Bjb2RlID0gMHhlNjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNjoKLQkgIG9wY29kZSA9IDB4ZTQ7Ci0JICBicmVhazsKLQljYXNlIDB4ZTc6Ci0JICBvcGNvZGUgPSAweGU1OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU1OgotCSAgb3Bjb2RlID0gMHhlNzsKLQkgIGJyZWFrOwotCWNhc2UgMHhlYzoKLQkgIG9wY29kZSA9IDB4ZWQ7Ci0JICBicmVhazsKLQljYXNlIDB4ZWQ6Ci0JICBvcGNvZGUgPSAweGVjOwotCSAgYnJlYWs7Ci0JY2FzZSAweGVlOgotCSAgb3Bjb2RlID0gMHhlZjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlZjoKLQkgIG9wY29kZSA9IDB4ZWU7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKLQkgZmluYWwgdGFyZ2V0LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDNdID0gMHhmNDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDRdID0gMHhlMDsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzI0X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA4OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNikKLSAgICB7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMzsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDcpCi0gICAgewotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhmNDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gMHhlMTsKLQotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMjRfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDU7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA4KQotICAgIHsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW2ZyYWdQLT5mcl9maXhdID0gMHhlYTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA5KQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4ZmM7Ci0KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMTApCi0gICAgewotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhmNDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gMHhlMDsKLQotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMjRfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDU7Ci0gICAgfQotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICB2YWx1ZVQgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY2hhciAqcHJldl9uYW1lID0gIiI7Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wY29kZSAqb3A7Ci0KLSAgbW4xMDIwMF9oYXNoID0gaGFzaF9uZXcoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZS4gIFRoZSBNTjEwMjAwIGluc3RydWN0aW9uIHNldAotICAgICBoYXMgbWFueSBpZGVudGljYWwgb3Bjb2RlIG5hbWVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgb3Bjb2RlcyBiYXNlZAotICAgICBvbiB0aGUgb3BlcmFuZHMuICBUaGlzIGhhc2ggdGFibGUgdGhlbiBwcm92aWRlcyBhIHF1aWNrIGluZGV4IHRvCi0gICAgIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQotICBvcCA9IG1uMTAyMDBfb3Bjb2RlczsKLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3AtPm5hbWUpKSAKLQl7Ci0JICBwcmV2X25hbWUgPSAoY2hhciAqKSBvcC0+bmFtZTsKLQkgIGhhc2hfaW5zZXJ0IChtbjEwMjAwX2hhc2gsIG9wLT5uYW1lLCAoY2hhciAqKSBvcCk7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBib3RoIGEgc2ltcGxpZmljYXRpb24gKHdlIGRvbid0IGhhdmUgdG8gd3JpdGUgbWRfYXBwbHlfZml4KQotICAgICBhbmQgc3VwcG9ydCBmb3IgZnV0dXJlIG9wdGltaXphdGlvbnMgKGJyYW5jaCBzaG9ydGVuaW5nIGFuZCBzaW1pbGFyCi0gICAgIHN0dWZmIGluIHRoZSBsaW5rZXIuICAqLwotICBsaW5rcmVsYXggPSAxOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKSAKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotICBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKm9wY29kZTsKLSAgc3RydWN0IG1uMTAyMDBfb3Bjb2RlICpuZXh0X29wY29kZTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7Ci0gIGludCBuZXh0X29waW5kZXgsIHJlbGF4YWJsZTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb24sIHNpemUgPSAwOwotICBjaGFyICpmOwotICBpbnQgaTsKLSAgaW50IG1hdGNoOwotCi0gIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICEgaXNzcGFjZSAoKnMpOyBzKyspCi0gICAgOwotICBpZiAoKnMgIT0gJ1wwJykKLSAgICAqcysrID0gJ1wwJzsKLQotICAvKiBmaW5kIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCB0aGUgcHJvcGVyIG5hbWUgKi8KLSAgb3Bjb2RlID0gKHN0cnVjdCBtbjEwMjAwX29wY29kZSAqKWhhc2hfZmluZCAobW4xMDIwMF9oYXNoLCBzdHIpOwotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN0ciA9IHM7Ci0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSAgZm9yKDs7KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZyA9IE5VTEw7Ci0gICAgICBpbnQgb3BfaWR4OwotICAgICAgY2hhciAqaG9sZDsKLSAgICAgIGludCBleHRyYV9zaGlmdCA9IDA7Ci0KLSAgICAgIHJlbGF4YWJsZSA9IDA7Ci0gICAgICBmYyA9IDA7Ci0gICAgICBtYXRjaCA9IDA7Ci0gICAgICBuZXh0X29waW5kZXggPSAwOwotICAgICAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOwotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGZvciAob3BfaWR4ID0gMSwgb3BpbmRleF9wdHIgPSBvcGNvZGUtPm9wZXJhbmRzOwotCSAgICpvcGluZGV4X3B0ciAhPSAwOwotCSAgIG9waW5kZXhfcHRyKyssIG9wX2lkeCsrKQotCXsKLQkgIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0JICBleHByZXNzaW9uUyBleDsKLQotCSAgaWYgKG5leHRfb3BpbmRleCA9PSAwKQotCSAgICB7Ci0JICAgICAgb3BlcmFuZCA9ICZtbjEwMjAwX29wZXJhbmRzWypvcGluZGV4X3B0cl07Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9wZXJhbmQgPSAmbW4xMDIwMF9vcGVyYW5kc1tuZXh0X29waW5kZXhdOwotCSAgICAgIG5leHRfb3BpbmRleCA9IDA7Ci0JICAgIH0KLQotCSAgZXJybXNnID0gTlVMTDsKLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnKQotCSAgICArK3N0cjsKLQotCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1JFTEFYKQotCSAgICByZWxheGFibGUgPSAxOwotCi0JICAvKiBHYXRoZXIgdGhlIG9wZXJhbmQuICovCi0JICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUEFSRU4pCi0JICAgIHsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKScgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKCcpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgLyogU2VlIGlmIHdlIGNhbiBtYXRjaCB0aGUgb3BlcmFuZHMuICAqLwotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfRFJFRykKLQkgICAgewotCSAgICAgIGlmICghZGF0YV9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfQVJFRykKLQkgICAgewotCSAgICAgIGlmICghYWRkcmVzc19yZWdpc3Rlcl9uYW1lICgmZXgpKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUFNXKQotCSAgICB7Ci0JICAgICAgY2hhciAqc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBpZiAoc3RyY21wIChzdGFydCwgInBzdyIpICE9IDApCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfTURSKQotCSAgICB7Ci0JICAgICAgY2hhciAqc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBpZiAoc3RyY21wIChzdGFydCwgIm1kciIpICE9IDApCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgZWxzZSBpZiAoZGF0YV9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGFkZHJlc3NfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlIGlmIChvdGhlcl9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpzdHIgPT0gJyknIHx8ICpzdHIgPT0gJygnKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cHJlc3Npb24gKCZleCk7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChleC5YX29wKSAKLQkgICAgewotCSAgICBjYXNlIE9faWxsZWdhbDoKLQkgICAgICBlcnJtc2cgPSBfKCJpbGxlZ2FsIG9wZXJhbmQiKTsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICBjYXNlIE9fYWJzZW50OgotCSAgICAgIGVycm1zZyA9IF8oIm1pc3Npbmcgb3BlcmFuZCIpOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIGNhc2UgT19yZWdpc3RlcjoKLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzCi0gICAgICAgICAgICAgICAgICAgJiAoTU4xMDIwMF9PUEVSQU5EX0RSRUcgfCBNTjEwMjAwX09QRVJBTkRfQVJFRykpID09IDApCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCQkKLQkgICAgICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzIgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzUpCi0JCWV4dHJhX3NoaWZ0ID0gODsKLQkgICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfMyB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNgotCQkgICAgICAgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzcpCi0JCWV4dHJhX3NoaWZ0ID0gMTY7Ci0JICAgICAgZWxzZQotCQlleHRyYV9zaGlmdCA9IDA7Ci0JICAgICAgCi0JICAgICAgbW4xMDIwMF9pbnNlcnRfb3BlcmFuZCAoJmluc24sICZleHRlbnNpb24sIG9wZXJhbmQsCi0JCQkJICAgICAgZXguWF9hZGRfbnVtYmVyLCAoY2hhciAqKSBOVUxMLAotCQkJCSAgICAgIDAsIGV4dHJhX3NoaWZ0KTsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgT19jb25zdGFudDoKLQkgICAgICAvKiBJZiB0aGlzIG9wZXJhbmQgY2FuIGJlIHByb21vdGVkLCBhbmQgaXQgZG9lc24ndAotCQkgZml0IGludG8gdGhlIGFsbG9jYXRlZCBiaXRmaWVsZCBmb3IgdGhpcyBpbnNuLAotCQkgdGhlbiBwcm9tb3RlIGl0IChpZSB0aGlzIG9wY29kZSBkb2VzIG5vdCBtYXRjaCkuICAqLwotCSAgICAgIGlmIChvcGVyYW5kLT5mbGFncwotCQkgICYgKE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDIwMF9PUEVSQU5EX1JFTEFYKQotCQkgICYmICEgY2hlY2tfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgZXguWF9hZGRfbnVtYmVyKSkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0KLQkgICAgICBtbjEwMjAwX2luc2VydF9vcGVyYW5kICgmaW5zbiwgJmV4dGVuc2lvbiwgb3BlcmFuZCwKLQkJCQkgICAgICBleC5YX2FkZF9udW1iZXIsIChjaGFyICopIE5VTEwsCi0JCQkJICAgICAgMCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBJZiB0aGlzIG9wZXJhbmQgY2FuIGJlIHByb21vdGVkLCB0aGVuIHRoaXMgb3Bjb2RlIGRpZG4ndAotCQkgbWF0Y2ggc2luY2Ugd2UgY2FuJ3Qga25vdyBpZiBpdCBuZWVkZWQgcHJvbW90aW9uISAgKi8KLQkgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUFJPTU9URSkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0KLQkgICAgICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JICAgICAgaWYgKGZjID49IE1BWF9JTlNOX0ZJWFVQUykKLQkJYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQkgICAgICBmaXh1cHNbZmNdLmV4cCA9IGV4OwotCSAgICAgIGZpeHVwc1tmY10ub3BpbmRleCA9ICpvcGluZGV4X3B0cjsKLQkgICAgICBmaXh1cHNbZmNdLnJlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkgICAgICArK2ZjOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLWtlZXBfZ29pbmc6Ci0JICBzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcpCi0JICAgICsrc3RyOwotCi0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgd2UgdXNlZCBhbGwgdGhlIG9wZXJhbmRzISAgKi8KLSAgICAgIGlmICgqc3RyICE9ICcsJykKLQltYXRjaCA9IDE7Ci0KLSAgICBlcnJvcjoKLSAgICAgIGlmIChtYXRjaCA9PSAwKQotICAgICAgICB7Ci0JICBuZXh0X29wY29kZSA9IG9wY29kZSArIDE7Ci0JICBpZiAoIXN0cmNtcChuZXh0X29wY29kZS0+bmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQkgICAgewotCSAgICAgIG9wY29kZSA9IG5leHRfb3Bjb2RlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICAKLQkgIGFzX2JhZCAoIiVzIiwgZXJybXNnKTsKLQkgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgICAgCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICBpZiAoKnN0ciAhPSAnXDAnKQotICAgIGFzX2JhZCAoXygianVuayBhdCBlbmQgb2YgbGluZTogYCVzJyIpLCBzdHIpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzEpCi0gICAgc2l6ZSA9IDE7Ci0gIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8yIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF80KQotICAgIHNpemUgPSAyOwotICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfMyB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNSkKLSAgICBzaXplID0gMzsKLSAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzYpCi0gICAgc2l6ZSA9IDQ7Ci0gIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF83KQotICAgIHNpemUgPSA1OwotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci0gICAgICAgICAKLSAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLSAgaWYgKHJlbGF4YWJsZSAmJiBmYyA+IDApCi0gICAgewotICAgICAgaW50IHR5cGU7Ci0KLSAgICAgIC8qIGJDQyAqLwotICAgICAgaWYgKHNpemUgPT0gMiAmJiBvcGNvZGUtPm9wY29kZSAhPSAweGZjMDAwMCkKLQl7Ci0JICAvKiBIYW5kbGUgYnJhIHNwZWNpYWxseS4gIEJhc2ljYWxseSB0cmVhdCBpdCBsaWtlIGptcCBzbwotCSAgICAgdGhhdCB3ZSBhdXRvbWF0aWNhbGx5IGhhbmRsZSA4LCAxNiBhbmQgMzIgYml0IG9mZnNldHMKLQkgICAgIGNvcnJlY3RseSBhcyB3ZWxsIGFzIGp1bXBzIHRvIGFuIHVuZGVmaW5lZCBhZGRyZXNzLgotCi0JICAgICBJdCBpcyBhbHNvIGltcG9ydGFudCB0byBub3QgdHJlYXQgaXQgbGlrZSBvdGhlciBiQ0MKLQkgICAgIGluc3RydWN0aW9ucyBzaW5jZSB0aGUgbG9uZyBmb3JtcyBvZiBicmEgaXMgZGlmZmVyZW50Ci0JICAgICBmcm9tIG90aGVyIGJDQyBpbnN0cnVjdGlvbnMuICAqLwotICAgICAgICAgIGlmIChvcGNvZGUtPm9wY29kZSA9PSAweGVhMDApCi0gICAgICAgICAgICB0eXBlID0gODsKLQkgIGVsc2UKLQkgICAgdHlwZSA9IDA7Ci0JfQotICAgICAgLyoganNyICovCi0gICAgICBlbHNlIGlmIChzaXplID09IDMgJiYgb3Bjb2RlLT5vcGNvZGUgPT0gMHhmZDAwMDApCi0JdHlwZSA9IDY7Ci0gICAgICAvKiBqbXAgKi8KLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gMyAmJiBvcGNvZGUtPm9wY29kZSA9PSAweGZjMDAwMCkKLQl0eXBlID0gODsKLSAgICAgIC8qIGJDQ3ggKi8KLSAgICAgIGVsc2UKLQl0eXBlID0gMzsKLQotICAgICAgZiA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCwgOCAtIHNpemUsIHR5cGUsCi0JCSAgICBmaXh1cHNbMF0uZXhwLlhfYWRkX3N5bWJvbCwKLQkJICAgIGZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyLAotCQkgICAgKGNoYXIgKilmaXh1cHNbMF0ub3BpbmRleCk7Ci0gICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCBzaXplKTsKLSAgICAgIGlmICg4IC0gc2l6ZSA+IDQpCi0JewotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIHNpemUsIDAsIDQpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIHNpemUgKyA0LCAwLCA4IC0gc2l6ZSAtIDQpOwotCX0KLSAgICAgIGVsc2UKLQludW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgc2l6ZSwgMCwgOCAtIHNpemUpOwotICAgIH0KLQotICBlbHNlCi0gICAgewotICAgICAgZiA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0KLSAgICAgIC8qIE9oLCB3aGF0IGEgbWVzcy4gIFRoZSBpbnN0cnVjdGlvbiBpcyBpbiBiaWcgZW5kaWFuIGZvcm1hdCwgYnV0Ci0JIDE2IGFuZCAyNGJpdCBpbW1lZGlhdGVzIGFyZSBsaXR0bGUgZW5kaWFuISAgKi8KLSAgICAgIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfMykKLQl7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAxNikgJiAweGZmLCAxKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAxLCBpbnNuICYgMHhmZmZmLCAyKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNikKLQl7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAxNikgJiAweGZmZmYsIDIpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDIsIGluc24gJiAweGZmZmYsIDIpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF83KQotCXsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmZmZiwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMiwgaW5zbiAmIDB4ZmZmZiwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgNCwgZXh0ZW5zaW9uICYgMHhmZiwgMSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIHNpemUgPiA0ID8gNCA6IHNpemUpOwotCX0KLQotICAgICAgLyogQ3JlYXRlIGFueSBmaXh1cHMuICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IGZjOyBpKyspCi0JewotCSAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqb3BlcmFuZDsKLQotCSAgb3BlcmFuZCA9ICZtbjEwMjAwX29wZXJhbmRzW2ZpeHVwc1tpXS5vcGluZGV4XTsKLQkgIGlmIChmaXh1cHNbaV0ucmVsb2MgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQkgICAgewotCSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKnJlbG9jX2hvd3RvOwotCSAgICAgIGludCBzaXplOwotCSAgICAgIGludCBvZmZzZXQ7Ci0JICAgICAgZml4UyAqZml4UDsKLQotCSAgICAgIHJlbG9jX2hvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHVwc1tpXS5yZWxvYyk7Ci0KLQkgICAgICBpZiAoIXJlbG9jX2hvd3RvKQotCQlhYm9ydCgpOwotCSAgCi0JICAgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOwotCi0JICAgICAgaWYgKHNpemUgPCAxIHx8IHNpemUgPiA0KQotCQlhYm9ydCgpOwotCi0JICAgICAgb2Zmc2V0ID0gNCAtIHNpemU7Ci0JICAgICAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgb2Zmc2V0LAotCQkJCSAgc2l6ZSwKLQkJCQkgICZmaXh1cHNbaV0uZXhwLCAKLQkJCQkgIHJlbG9jX2hvd3RvLT5wY19yZWxhdGl2ZSwKLQkJCQkgIGZpeHVwc1tpXS5yZWxvYyk7Ci0KLQkgICAgICAvKiBQQy1yZWxhdGl2ZSBvZmZzZXRzIGFyZSBmcm9tIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBuZXh0Ci0JCSBpbnN0cnVjdGlvbiwgbm90IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAocmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlKQotCQlmaXhQLT5meF9vZmZzZXQgKz0gc2l6ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IHJlbG9jLCBwY3JlbCwgcmVsb2Nfc2l6ZSwgb2Zmc2V0OwotCSAgICAgIGZpeFMgKmZpeFA7Ci0KLQkgICAgICByZWxvYyA9IEJGRF9SRUxPQ19OT05FOwotCSAgICAgIC8qIEhvdyBiaWcgaXMgdGhlIHJlbG9jPyAgUmVtZW1iZXIgU1BMSVQgcmVsb2NzIGFyZQotCQkgaW1wbGljaXRseSAzMmJpdHMuICAqLwotCSAgICAgIHJlbG9jX3NpemUgPSBvcGVyYW5kLT5iaXRzOwotCi0JICAgICAgb2Zmc2V0ID0gc2l6ZSAtIHJlbG9jX3NpemUgLyA4OwotCi0JICAgICAgLyogSXMgdGhlIHJlbG9jIHBjLXJlbGF0aXZlPyAgKi8KLQkgICAgICBwY3JlbCA9IChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QQ1JFTCkgIT0gMDsKLQotCi0JICAgICAgLyogQ2hvb3NlIGEgcHJvcGVyIEJGRCByZWxvY2F0aW9uIHR5cGUuICAqLwotCSAgICAgIGlmIChwY3JlbCkKLQkJewotCQkgIGlmIChyZWxvY19zaXplID09IDgpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ184X1BDUkVMOwotCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMjQpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18yNF9QQ1JFTDsKLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChyZWxvY19zaXplID09IDMyKQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMzI7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAxNikKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzE2OwotCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gOCkKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzg7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAyNCkKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzI0OwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICAvKiBDb252ZXJ0IHRoZSBzaXplIG9mIHRoZSByZWxvYyBpbnRvIHdoYXQgZml4X25ld19leHAgd2FudHMuICAqLwotCSAgICAgIHJlbG9jX3NpemUgPSByZWxvY19zaXplIC8gODsKLQkgICAgICBpZiAocmVsb2Nfc2l6ZSA9PSA4KQotCQlyZWxvY19zaXplID0gMDsKLQkgICAgICBlbHNlIGlmIChyZWxvY19zaXplID09IDE2KQotCQlyZWxvY19zaXplID0gMTsKLQkgICAgICBlbHNlIGlmIChyZWxvY19zaXplID09IDMyIHx8IHJlbG9jX3NpemUgPT0gMjQpCi0JCXJlbG9jX3NpemUgPSAyOwotCi0JICAgICAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgb2Zmc2V0LAotCQkJCSAgcmVsb2Nfc2l6ZSwgJmZpeHVwc1tpXS5leHAsIHBjcmVsLAotCQkJCSAgKChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpIHJlbG9jKSk7Ci0KLQkgICAgICAvKiBQQy1yZWxhdGl2ZSBvZmZzZXRzIGFyZSBmcm9tIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBuZXh0Ci0JCSBpbnN0cnVjdGlvbiwgbm90IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAocGNyZWwpCi0JCWZpeFAtPmZ4X29mZnNldCArPSBzaXplOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotCi0vKiBpZiB3aGlsZSBwcm9jZXNzaW5nIGEgZml4dXAsIGEgcmVsb2MgcmVhbGx5IG5lZWRzIHRvIGJlIGNyZWF0ZWQgKi8KLS8qIHRoZW4gaXQgaXMgZG9uZSBoZXJlICovCi0gICAgICAgICAgICAgICAgIAotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICAoaW50KWZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIGlmIChmaXhwLT5meF9hZGRzeSAmJiBmaXhwLT5meF9zdWJzeSkKLSAgICB7Ci0gICAgICBpZiAoKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9zdWJzeSkpCi0JICB8fCBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJIkRpZmZlcmVuY2Ugb2Ygc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VjdGlvbnMgaXMgbm90IHN1cHBvcnRlZCIpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmJmZF9hYnNfc3ltYm9sOwotICAgICAgcmVsb2MtPmFkZGVuZCA9IChTX0dFVF9WQUxVRSAoZml4cC0+ZnhfYWRkc3kpCi0JCSAgICAgICAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSkgKyBmaXhwLT5meF9vZmZzZXQpOwotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICAgICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSAgICB9Ci0gIHJldHVybiByZWxvYzsKLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMCkKLSAgICByZXR1cm4gMjsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDMpCi0gICAgcmV0dXJuIDM7Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSA2KQotICAgIHsKLSAgICAgIGlmICghU19JU19ERUZJTkVEIChmcmFncC0+ZnJfc3ltYm9sKQotCSAgfHwgc2VnICE9IFNfR0VUX1NFR01FTlQgKGZyYWdwLT5mcl9zeW1ib2wpKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gNzsKLQkgIHJldHVybiA1OwotCX0KLSAgICAgIHJldHVybiAzOwotICAgIH0KLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDgpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gMTA7Ci0JICByZXR1cm4gNTsKLQl9Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci19IAotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLSNpZiAwCi0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMICYmICEgU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuICBMZXQgdGhlIGxpbmtlciBmaWd1cmUgaXQgb3V0LiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSNlbmRpZgotfQotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeHAsIHZhbHVlcCwgc2VnKQotICAgICBmaXhTICpmaXhwOwotICAgICB2YWx1ZVQgKnZhbHVlcDsKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIC8qIFdlIHNob3VsZG4ndCBldmVyIGdldCBoZXJlIGJlY2F1c2UgbGlua3JlbGF4IGlzIG5vbnplcm8uICAqLwotICBhYm9ydCAoKTsKLSAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBJbnNlcnQgYW4gb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW1uMTAyMDBfaW5zZXJ0X29wZXJhbmQgKGluc25wLCBleHRlbnNpb25wLCBvcGVyYW5kLCB2YWwsIGZpbGUsIGxpbmUsIHNoaWZ0KQotICAgICB1bnNpZ25lZCBsb25nICppbnNucDsKLSAgICAgdW5zaWduZWQgbG9uZyAqZXh0ZW5zaW9ucDsKLSAgICAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgb2Zmc2V0VCB2YWw7Ci0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICB1bnNpZ25lZCBpbnQgc2hpZnQ7Ci17Ci0gIC8qIE5vIG5lZWQgdG8gY2hlY2sgMjQgb3IgMzJiaXQgb3BlcmFuZHMgZm9yIGEgYml0LiAgKi8KLSAgaWYgKG9wZXJhbmQtPmJpdHMgPCAyNAotICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0spID09IDApCi0gICAgewotICAgICAgbG9uZyBtaW4sIG1heDsKLSAgICAgIG9mZnNldFQgdGVzdDsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JewotCSAgbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCSAgbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQl9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0gICAgICAgICAgbWluID0gMDsKLSAgICAgICAgfQotCi0gICAgICB0ZXN0ID0gdmFsOwotCi0KLSAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKLSAgICAgICAgewotICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciA9Ci0gICAgICAgICAgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7Ci0gICAgICAgICAgY2hhciBidWZbMTAwXTsKLQotICAgICAgICAgIHNwcmludF92YWx1ZSAoYnVmLCB0ZXN0KTsKLSAgICAgICAgICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotICAgICAgICAgICAgYXNfd2FybiAoZXJyLCBidWYsIG1pbiwgbWF4KTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfRVhURU5ERUQpID09IDApCi0gICAgewotICAgICAgKmluc25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkgPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQpKTsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9SRVBFQVRFRCkgIT0gMCkKLQkqaW5zbnAgfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpCi0JCSAgIDw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0ICsgMikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpleHRlbnNpb25wIHw9ICh2YWwgPj4gMTYpICYgMHhmZjsKLSAgICAgICppbnNucCB8PSB2YWwgJiAweGZmZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotY2hlY2tfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgdmFsKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotewotICAvKiBObyBuZWVkIHRvIGNoZWNrIDI0Yml0IG9yIDMyYml0IG9wZXJhbmRzIGZvciBhIGJpdC4gICovCi0gIGlmIChvcGVyYW5kLT5iaXRzIDwgMjQKLSAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLKSA9PSAwKQotICAgIHsKLSAgICAgIGxvbmcgbWluLCBtYXg7Ci0gICAgICBvZmZzZXRUIHRlc3Q7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIG1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7Ci0JfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotICAgICAgICAgIG1pbiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgdGVzdCA9IHZhbDsKLQotCi0gICAgICBpZiAodGVzdCA8IChvZmZzZXRUKSBtaW4gfHwgdGVzdCA+IChvZmZzZXRUKSBtYXgpCi0JcmV0dXJuIDA7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbW4xMDIwMC5oIGIvZ2FzL2NvbmZpZy90Yy1tbjEwMjAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1M2U1NjkuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tbjEwMjAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiB0Yy1tbjEwMjAwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLW1uMTAyMDAuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX01OMTAyMDAKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBNTjEwMjAwIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgotI2VuZGlmCi0KLS8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX21uMTAyMDAKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1tbjEwMjAwIgotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIG1kX251bWJlcl90b19jaGFycyBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuCi0KLS8qIERvbid0IGJvdGhlciB0byBhZGp1c3QgcmVsb2NzLiAgKi8KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYKSAwCi0KLS8qIFdlIGRvIHJlbGF4aW5nIGluIHRoZSBhc3NlbWJsZXIgYXMgd2VsbCBhcyB0aGUgbGlua2VyLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbW4xMDMwMC5jIGIvZ2FzL2NvbmZpZy90Yy1tbjEwMzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMDc2ZjQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tbjEwMzAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTk2ICswLDAgQEAKLS8qIHRjLW1uMTAzMDAuYyAtLSBBc3NlbWJsZXIgY29kZSBmb3IgdGhlIE1hdHN1c2hpdGEgMTAzMDAKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKLSNpbmNsdWRlICJvcGNvZGUvbW4xMDMwMC5oIgotDAotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotc3RydWN0IHJlZ19uYW1lCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGludCB2YWx1ZTsKLX07Ci0KLS8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbCB0YXJnZXRzLiAqLwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICI7IyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2VwYXJhdGUgbXVsdGlwbGUgY29tbWFuZHMgb24gYSAKLSAgIHNpbmdsZSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHBvbmVudCBpbiBhIGZsb2F0aW5nIAotICAgcG9pbnQgbnVtYmVyLiAgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LCAKLSAgIGFzIGluIDBkMS4wLiAgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOwotDAotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0gewotICAvKiBiQ0MgcmVsYXhpbmcgKi8KLSAgezB4N2YsIC0weDgwLCAyLCAxfSwKLSAgezB4N2ZmZiwgLTB4ODAwMCwgNSwgMn0sCi0gIHsweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwgNywgMH0sCi0KLSAgLyogYkNDIHJlbGF4aW5nICh1bmNvbW1vbiBjYXNlcykgKi8KLSAgezB4N2YsIC0weDgwLCAzLCA0fSwKLSAgezB4N2ZmZiwgLTB4ODAwMCwgNiwgNX0sCi0gIHsweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwgOCwgMH0sCi0KLSAgLyogY2FsbCByZWxheGluZyAqLwotICB7MHg3ZmZmLCAtMHg4MDAwLCA1LCA3fSwKLSAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA3LCAwfSwKLQotICAvKiBjYWxscyByZWxheGluZyAqLwotICB7MHg3ZmZmLCAtMHg4MDAwLCA0LCA5fSwKLSAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA2LCAwfSwKLQotICAvKiBqbXAgcmVsYXhpbmcgKi8KLSAgezB4N2YsIC0weDgwLCAyLCAxMX0sCi0gIHsweDdmZmYsIC0weDgwMDAsIDMsIDEyfSwKLSAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA1LCAwfSwKLQotfTsKLQotLyogbG9jYWwgZnVuY3Rpb25zICovCi1zdGF0aWMgdm9pZCBtbjEwMzAwX2luc2VydF9vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IG1uMTAzMDBfb3BlcmFuZCAqLAotCQkJCQkgICAgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCwKLQkJCQkJICAgIHVuc2lnbmVkKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBjaGVja19vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICosCi0JCQkJCSAgICBvZmZzZXRUKSk7Ci1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVnX25hbWUgKiwgaW50LCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGRhdGFfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyBib29sZWFuIGFkZHJlc3NfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyBib29sZWFuIG90aGVyX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgdm9pZCBzZXRfYXJjaF9tYWNoIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgaW50IGN1cnJlbnRfbWFjaGluZTsKLQotLyogZml4dXBzICovCi0jZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKLXN0cnVjdCBtbjEwMzAwX2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IG9waW5kZXg7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci1zdHJ1Y3QgbW4xMDMwMF9maXh1cCBmaXh1cHNbTUFYX0lOU05fRklYVVBTXTsKLXN0YXRpYyBpbnQgZmM7Ci0KLS8qIFdlIG11c3Qgc3RvcmUgdGhlIHZhbHVlIG9mIGVhY2ggcmVnaXN0ZXIgb3BlcmFuZCBzbyB0aGF0IHdlIGNhbgotICAgdmVyaWZ5IHRoYXQgY2VydGFpbiByZWdpc3RlcnMgZG8gbm90IG1hdGNoLiAgKi8KLWludCBtbjEwMzAwX3JlZ19vcGVyYW5kc1tNTjEwMzAwX01BWF9PUEVSQU5EU107Ci0MCi1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsgCi0KLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgImFtMzAiLAlzZXRfYXJjaF9tYWNoLAkJMzAwIH0sCi0gIHsgImFtMzMiLAlzZXRfYXJjaF9tYWNoLAkJMzMwIH0sCi0gIHsgIm1uMTAzMDAiLAlzZXRfYXJjaF9tYWNoLAkJMzAwIH0sCi0gIHtOVUxMLCAwLCAwfQotfTsKLQotLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm1uMTAzMDBfaGFzaDsKLQotLyogVGhpcyB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBkYXRhX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiZDAiLCAwIH0sCi0gIHsgImQxIiwgMSB9LAotICB7ICJkMiIsIDIgfSwKLSAgeyAiZDMiLCAzIH0sCi19OwotI2RlZmluZSBEQVRBX1JFR19OQU1FX0NOVAkoc2l6ZW9mKGRhdGFfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIGFkZHJlc3NfcmVnaXN0ZXJzW10gPQotewotICB7ICJhMCIsIDAgfSwKLSAgeyAiYTEiLCAxIH0sCi0gIHsgImEyIiwgMiB9LAotICB7ICJhMyIsIDMgfSwKLX07Ci0jZGVmaW5lIEFERFJFU1NfUkVHX05BTUVfQ05UCShzaXplb2YoYWRkcmVzc19yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgcl9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImEwIiwgOCB9LAotICB7ICJhMSIsIDkgfSwKLSAgeyAiYTIiLCAxMCB9LAotICB7ICJhMyIsIDExIH0sCi0gIHsgImQwIiwgMTIgfSwKLSAgeyAiZDEiLCAxMyB9LAotICB7ICJkMiIsIDE0IH0sCi0gIHsgImQzIiwgMTUgfSwKLSAgeyAiZTAiLCAwIH0sCi0gIHsgImUxIiwgMSB9LAotICB7ICJlMTAiLCAxMCB9LAotICB7ICJlMTEiLCAxMSB9LAotICB7ICJlMTIiLCAxMiB9LAotICB7ICJlMTMiLCAxMyB9LAotICB7ICJlMTQiLCAxNCB9LAotICB7ICJlMTUiLCAxNSB9LAotICB7ICJlMiIsIDIgfSwKLSAgeyAiZTMiLCAzIH0sCi0gIHsgImU0IiwgNCB9LAotICB7ICJlNSIsIDUgfSwKLSAgeyAiZTYiLCA2IH0sCi0gIHsgImU3IiwgNyB9LAotICB7ICJlOCIsIDggfSwKLSAgeyAiZTkiLCA5IH0sCi0gIHsgInIwIiwgMCB9LAotICB7ICJyMSIsIDEgfSwKLSAgeyAicjEwIiwgMTAgfSwKLSAgeyAicjExIiwgMTEgfSwKLSAgeyAicjEyIiwgMTIgfSwKLSAgeyAicjEzIiwgMTMgfSwKLSAgeyAicjE0IiwgMTQgfSwKLSAgeyAicjE1IiwgMTUgfSwKLSAgeyAicjIiLCAyIH0sCi0gIHsgInIzIiwgMyB9LAotICB7ICJyNCIsIDQgfSwKLSAgeyAicjUiLCA1IH0sCi0gIHsgInI2IiwgNiB9LAotICB7ICJyNyIsIDcgfSwKLSAgeyAicjgiLCA4IH0sCi0gIHsgInI5IiwgOSB9LAotfTsKLSNkZWZpbmUgUl9SRUdfTkFNRV9DTlQJKHNpemVvZihyX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSB4cl9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgIm1jcmgiLCAyIH0sCi0gIHsgIm1jcmwiLCAzIH0sCi0gIHsgIm1jdmYiLCA0IH0sCi0gIHsgIm1kcnEiLCAxIH0sCi0gIHsgInNwIiwgMCB9LAotICB7ICJ4cjAiLCAwIH0sCi0gIHsgInhyMSIsIDEgfSwKLSAgeyAieHIxMCIsIDEwIH0sCi0gIHsgInhyMTEiLCAxMSB9LAotICB7ICJ4cjEyIiwgMTIgfSwKLSAgeyAieHIxMyIsIDEzIH0sCi0gIHsgInhyMTQiLCAxNCB9LAotICB7ICJ4cjE1IiwgMTUgfSwKLSAgeyAieHIyIiwgMiB9LAotICB7ICJ4cjMiLCAzIH0sCi0gIHsgInhyNCIsIDQgfSwKLSAgeyAieHI1IiwgNSB9LAotICB7ICJ4cjYiLCA2IH0sCi0gIHsgInhyNyIsIDcgfSwKLSAgeyAieHI4IiwgOCB9LAotICB7ICJ4cjkiLCA5IH0sCi19OwotI2RlZmluZSBYUl9SRUdfTkFNRV9DTlQJKHNpemVvZih4cl9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCi0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBvdGhlcl9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgIm1kciIsIDAgfSwKLSAgeyAicHN3IiwgMCB9LAotICB7ICJzcCIsIDAgfSwKLX07Ci0jZGVmaW5lIE9USEVSX1JFR19OQU1FX0NOVAkoc2l6ZW9mKG90aGVyX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotLyogcmVnX25hbWVfc2VhcmNoIGRvZXMgYSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBnaXZlbiByZWdpc3RlciB0YWJsZQotICAgdG8gc2VlIGlmICJuYW1lIiBpcyBhIHZhbGlkIHJlZ2l0ZXIgbmFtZS4gIFJldHVybnMgdGhlIHJlZ2lzdGVyCi0gICBudW1iZXIgZnJvbSB0aGUgYXJyYXkgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gKi8KLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChyZWdzLCByZWdjb3VudCwgbmFtZSkKLSAgICAgY29uc3Qgc3RydWN0IHJlZ19uYW1lICpyZWdzOwotICAgICBpbnQgcmVnY291bnQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLQotICBsb3cgPSAwOwotICBoaWdoID0gcmVnY291bnQgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHJlZ3NbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZSAKLQkgIHJldHVybiByZWdzW21pZGRsZV0udmFsdWU7Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotICByZXR1cm4gLTE7Ci19Ci0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotcl9yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpbnQgcmVnX251bWJlcjsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqc3RhcnQ7Ci0gIGNoYXIgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChyX3JlZ2lzdGVycywgUl9SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLXhyX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKHhyX3JlZ2lzdGVycywgWFJfUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1kYXRhX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGRhdGFfcmVnaXN0ZXJzLCBEQVRBX1JFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotYWRkcmVzc19yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpbnQgcmVnX251bWJlcjsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqc3RhcnQ7Ci0gIGNoYXIgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChhZGRyZXNzX3JlZ2lzdGVycywgQUREUkVTU19SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLW90aGVyX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKG90aGVyX3JlZ2lzdGVycywgT1RIRVJfUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIk1OMTAzMDAgb3B0aW9uczpcblwKLW5vbmUgeWV0XG4iKSk7Ci19IAotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRwLCBzaXplcCkKLSAgaW50IHR5cGU7Ci0gIGNoYXIgKmxpdHA7Ci0gIGludCAqc2l6ZXA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVwID0gMDsKLSAgICAgIHJldHVybiAiYmFkIGNhbGwgdG8gbWRfYXRvZiI7Ci0gICAgfQotICAKLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVwID0gcHJlYyAqIDI7Ci0KLSAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0cCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotICAgICAgbGl0cCArPSAyOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgZnJhZ1MgKmZyYWdQOwotewotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYWJlbF9jb3VudCA9IDA7Ci0gIGNoYXIgYnVmWzQwXTsKLQotICBzdWJzZWdfY2hhbmdlIChzZWMsIDApOwotICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDEpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4Yzg6Ci0JICBvcGNvZGUgPSAweGM5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM5OgotCSAgb3Bjb2RlID0gMHhjODsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMDoKLQkgIG9wY29kZSA9IDB4YzI7Ci0JICBicmVhazsKLQljYXNlIDB4YzI6Ci0JICBvcGNvZGUgPSAweGMwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGMzOgotCSAgb3Bjb2RlID0gMHhjMTsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMToKLQkgIG9wY29kZSA9IDB4YzM7Ci0JICBicmVhazsKLQljYXNlIDB4YzQ6Ci0JICBvcGNvZGUgPSAweGM2OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM2OgotCSAgb3Bjb2RlID0gMHhjNDsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNzoKLQkgIG9wY29kZSA9IDB4YzU7Ci0JICBicmVhazsKLQljYXNlIDB4YzU6Ci0JICBvcGNvZGUgPSAweGM3OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAyXSA9IDB4Y2M7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDMsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDU7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyKQotICAgIHsKLSAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgaW50IG9wY29kZSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGM4OgotCSAgb3Bjb2RlID0gMHhjOTsKLQkgIGJyZWFrOwotCWNhc2UgMHhjOToKLQkgIG9wY29kZSA9IDB4Yzg7Ci0JICBicmVhazsKLQljYXNlIDB4YzA6Ci0JICBvcGNvZGUgPSAweGMyOwotCSAgYnJlYWs7Ci0JY2FzZSAweGMyOgotCSAgb3Bjb2RlID0gMHhjMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMzoKLQkgIG9wY29kZSA9IDB4YzE7Ci0JICBicmVhazsKLQljYXNlIDB4YzE6Ci0JICBvcGNvZGUgPSAweGMzOwotCSAgYnJlYWs7Ci0JY2FzZSAweGM0OgotCSAgb3Bjb2RlID0gMHhjNjsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNjoKLQkgIG9wY29kZSA9IDB4YzQ7Ci0JICBicmVhazsKLQljYXNlIDB4Yzc6Ci0JICBvcGNvZGUgPSAweGM1OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM1OgotCSAgb3Bjb2RlID0gMHhjNzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMl0gPSAweGRjOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAzLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA3OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAyLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMzsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDQpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGU4OgotCSAgb3Bjb2RlID0gMHhlOTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlOToKLQkgIG9wY29kZSA9IDB4ZTg7Ci0JICBicmVhazsKLQljYXNlIDB4ZWE6Ci0JICBvcGNvZGUgPSAweGViOwotCSAgYnJlYWs7Ci0JY2FzZSAweGViOgotCSAgb3Bjb2RlID0gMHhlYTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IG9wY29kZTsKLQotICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMSwKLQkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDIsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKLQkgZmluYWwgdGFyZ2V0LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDNdID0gMHhjYzsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDUpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGU4OgotCSAgb3Bjb2RlID0gMHhlOTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlYToKLQkgIG9wY29kZSA9IDB4ZWI7Ci0JICBicmVhazsKLQljYXNlIDB4ZWI6Ci0JICBvcGNvZGUgPSAweGVhOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMiwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM10gPSAweGRjOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA0LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA4OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNikKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGNkOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA1OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNykKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGRkOwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgNV0gPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXTsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDZdID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgNF07Ci0KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNzsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDgpCi0gICAgewotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhmYTsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gMHhmZjsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDIsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDkpCi0gICAgewotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhmYzsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gMHhmZjsKLQotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMiwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMTApCi0gICAgewotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbZnJhZ1AtPmZyX2ZpeF0gPSAweGNhOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxMSkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGNjOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDM7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxMikKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGRjOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDU7Ci0gICAgfQotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICB2YWx1ZVQgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY2hhciAqcHJldl9uYW1lID0gIiI7Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wY29kZSAqb3A7Ci0KLSAgbW4xMDMwMF9oYXNoID0gaGFzaF9uZXcoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZS4gIFRoZSBNTjEwMzAwIGluc3RydWN0aW9uIHNldAotICAgICBoYXMgbWFueSBpZGVudGljYWwgb3Bjb2RlIG5hbWVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgb3Bjb2RlcyBiYXNlZAotICAgICBvbiB0aGUgb3BlcmFuZHMuICBUaGlzIGhhc2ggdGFibGUgdGhlbiBwcm92aWRlcyBhIHF1aWNrIGluZGV4IHRvCi0gICAgIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQotICBvcCA9IG1uMTAzMDBfb3Bjb2RlczsKLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3AtPm5hbWUpKSAKLQl7Ci0JICBwcmV2X25hbWUgPSAoY2hhciAqKSBvcC0+bmFtZTsKLQkgIGhhc2hfaW5zZXJ0IChtbjEwMzAwX2hhc2gsIG9wLT5uYW1lLCAoY2hhciAqKSBvcCk7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBib3RoIGEgc2ltcGxpZmljYXRpb24gKHdlIGRvbid0IGhhdmUgdG8gd3JpdGUgbWRfYXBwbHlfZml4KQotICAgICBhbmQgc3VwcG9ydCBmb3IgZnV0dXJlIG9wdGltaXphdGlvbnMgKGJyYW5jaCBzaG9ydGVuaW5nIGFuZCBzaW1pbGFyCi0gICAgIHN0dWZmIGluIHRoZSBsaW5rZXIpLiAgKi8KLSAgbGlua3JlbGF4ID0gMTsKLQotICAvKiBTZXQgdGhlIGRlZmF1bHQgbWFjaGluZSB0eXBlLiAgKi8KLSAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9tbjEwMzAwLCAzMDApKQotICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotCi0gIGN1cnJlbnRfbWFjaGluZSA9IDMwMDsKLX0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikgCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqczsKLSAgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpvcGNvZGU7Ci0gIHN0cnVjdCBtbjEwMzAwX29wY29kZSAqbmV4dF9vcGNvZGU7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXhfcHRyOwotICBpbnQgbmV4dF9vcGluZGV4LCByZWxheGFibGU7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uLCBzaXplID0gMDsKLSAgY2hhciAqZjsKLSAgaW50IGk7Ci0gIGludCBtYXRjaDsKLQotICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0gIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhIGlzc3BhY2UgKCpzKTsgcysrKQotICAgIDsKLSAgaWYgKCpzICE9ICdcMCcpCi0gICAgKnMrKyA9ICdcMCc7Ci0KLSAgLyogZmluZCB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggdGhlIHByb3BlciBuYW1lICovCi0gIG9wY29kZSA9IChzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKiloYXNoX2ZpbmQgKG1uMTAzMDBfaGFzaCwgc3RyKTsKLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdHIgPSBzOwotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIGZvcig7OykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgICBpbnQgb3BfaWR4OwotICAgICAgY2hhciAqaG9sZDsKLSAgICAgIGludCBleHRyYV9zaGlmdCA9IDA7Ci0KLQotICAgICAgZXJybXNnID0gXygiSW52YWxpZCBvcGNvZGUvb3BlcmFuZHMiKTsKLQotICAgICAgLyogUmVzZXQgdGhlIGFycmF5IG9mIHJlZ2lzdGVyIG9wZXJhbmRzLiAgKi8KLSAgICAgIG1lbXNldCAobW4xMDMwMF9yZWdfb3BlcmFuZHMsIC0xLCBzaXplb2YgKG1uMTAzMDBfcmVnX29wZXJhbmRzKSk7Ci0KLSAgICAgIHJlbGF4YWJsZSA9IDA7Ci0gICAgICBmYyA9IDA7Ci0gICAgICBtYXRjaCA9IDA7Ci0gICAgICBuZXh0X29waW5kZXggPSAwOwotICAgICAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOwotICAgICAgZXh0ZW5zaW9uID0gMDsKLQotICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgbWFjaGluZQotCSB0aGVuIGl0IGNhbiBub3QgcG9zc2libHkgbWF0Y2guICAqLwotICAgICAgaWYgKG9wY29kZS0+bWFjaGluZQotCSAgJiYgKG9wY29kZS0+bWFjaGluZSAhPSBjdXJyZW50X21hY2hpbmUpKQotCWdvdG8gZXJyb3I7Ci0KLSAgICAgIGZvciAob3BfaWR4ID0gMSwgb3BpbmRleF9wdHIgPSBvcGNvZGUtPm9wZXJhbmRzOwotCSAgICpvcGluZGV4X3B0ciAhPSAwOwotCSAgIG9waW5kZXhfcHRyKyssIG9wX2lkeCsrKQotCXsKLQkgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0JICBleHByZXNzaW9uUyBleDsKLQotCSAgaWYgKG5leHRfb3BpbmRleCA9PSAwKQotCSAgICB7Ci0JICAgICAgb3BlcmFuZCA9ICZtbjEwMzAwX29wZXJhbmRzWypvcGluZGV4X3B0cl07Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9wZXJhbmQgPSAmbW4xMDMwMF9vcGVyYW5kc1tuZXh0X29waW5kZXhdOwotCSAgICAgIG5leHRfb3BpbmRleCA9IDA7Ci0JICAgIH0KLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnKQotCSAgICArK3N0cjsKLQotCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JFTEFYKQotCSAgICByZWxheGFibGUgPSAxOwotCi0JICAvKiBHYXRoZXIgdGhlIG9wZXJhbmQuICovCi0JICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUEFSRU4pCi0JICAgIHsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKScgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKCcpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgLyogU2VlIGlmIHdlIGNhbiBtYXRjaCB0aGUgb3BlcmFuZHMuICAqLwotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRFJFRykKLQkgICAgewotCSAgICAgIGlmICghZGF0YV9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfQVJFRykKLQkgICAgewotCSAgICAgIGlmICghYWRkcmVzc19yZWdpc3Rlcl9uYW1lICgmZXgpKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1ApCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgInNwIikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9SUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCFyX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9YUlJFRykKLQkgICAgewotCSAgICAgIGlmICgheHJfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1VTUCkKLQkgICAgewotCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAidXNwIikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TU1ApCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgInNzcCIpICE9IDApCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfTVNQKQotCSAgICB7Ci0JICAgICAgY2hhciAqc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJtc3AiKSAhPSAwKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BDKQotCSAgICB7Ci0JICAgICAgY2hhciAqc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJwYyIpICE9IDApCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRVBTVykKLQkgICAgewotCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAiZXBzdyIpICE9IDApCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUExVUykKLQkgICAgewotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcrJykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QU1cpCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgInBzdyIpICE9IDApCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfTURSKQotCSAgICB7Ci0JICAgICAgY2hhciAqc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJtZHIiKSAhPSAwKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHZhbHVlID0gMDsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnWycpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCi0JICAgICAgLyogRWF0IHRoZSAnWycuICAqLwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgCi0JICAgICAgLyogV2UgdXNlZCB0byByZWplY3QgYSBudWxsIHJlZ2lzdGVyIGxpc3QgaGVyZTsgaG93ZXZlciwKLQkJIHdlIGFjY2VwdCBpdCBub3cgc28gdGhlIGNvbXBpbGVyIGNhbiBlbWl0ICJjYWxsIiBpbnN0cnVjdGlvbnMKLQkJIGZvciBhbGwgY2FsbHMgdG8gbmFtZWQgZnVuY3Rpb25zLgotCi0JCSBUaGUgbGlua2VyIGNhbiB0aGVuIGZpbGwgaW4gdGhlIGFwcHJvcHJpYXRlIGJpdHMgZm9yIHRoZQotCQkgcmVnaXN0ZXIgbGlzdCBhbmQgc3RhY2sgc2l6ZSBvciBjaGFuZ2UgdGhlIGluc3RydWN0aW9uCi0JCSBpbnRvIGEgImNhbGxzIiBpZiB1c2luZyAiY2FsbCIgaXMgbm90IHByb2ZpdGFibGUuICAqLwotCSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICddJykKLQkJewotCQkgIGNoYXIgKnN0YXJ0OwotCQkgIGNoYXIgYzsKLQotCQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQkJICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0JCSAgc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JCSAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAiZDIiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweDgwOwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChzdGFydCwgImQzIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHg0MDsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJhMiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4MjA7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAiYTMiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweDEwOwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChzdGFydCwgIm90aGVyIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHgwODsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoY3VycmVudF9tYWNoaW5lID09IDMzMAotCQkJICAgJiYgc3RyY2FzZWNtcCAoc3RhcnQsICJleHJlZzAiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweDA0OwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChjdXJyZW50X21hY2hpbmUgPT0gMzMwCi0JCQkgICAmJiBzdHJjYXNlY21wIChzdGFydCwgImV4cmVnMSIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4MDI7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGN1cnJlbnRfbWFjaGluZSA9PSAzMzAKLQkJCSAgICYmIHN0cmNhc2VjbXAgKHN0YXJ0LCAiZXhvdGhlciIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4MDE7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGN1cnJlbnRfbWFjaGluZSA9PSAzMzAKLQkJCSAgICYmIHN0cmNhc2VjbXAgKHN0YXJ0LCAiYWxsIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHhmZjsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgICAgICBzdHIgPSBob2xkOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQl9Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAgICAgICAgIG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgKGNoYXIgKikgTlVMTCwgMCwgMCk7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCi0JICAgIH0KLQkgIGVsc2UgaWYgKGRhdGFfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlIGlmIChhZGRyZXNzX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZSBpZiAob3RoZXJfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlIGlmIChyX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoeHJfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlIGlmICgqc3RyID09ICcpJyB8fCAqc3RyID09ICcoJykKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uICgmZXgpOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoZXguWF9vcCkgCi0JICAgIHsKLQkgICAgY2FzZSBPX2lsbGVnYWw6Ci0JICAgICAgZXJybXNnID0gXygiaWxsZWdhbCBvcGVyYW5kIik7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgY2FzZSBPX2Fic2VudDoKLQkgICAgICBlcnJtc2cgPSBfKCJtaXNzaW5nIG9wZXJhbmQiKTsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0JICAgICAgewotCQlpbnQgbWFzazsKLQotCQltYXNrID0gTU4xMDMwMF9PUEVSQU5EX0RSRUcgfCBNTjEwMzAwX09QRVJBTkRfQVJFRzsKLQkJbWFzayB8PSBNTjEwMzAwX09QRVJBTkRfUlJFRyB8IE1OMTAzMDBfT1BFUkFORF9YUlJFRzsKLQkJaWYgKChvcGVyYW5kLT5mbGFncyAmIG1hc2spID09IDApCi0JCSAgewotCQkgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICAgIHN0ciA9IGhvbGQ7Ci0JCSAgICBnb3RvIGVycm9yOwotCQkgIH0KLQkJCi0JCWlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDEgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MxKQotCQkgIGV4dHJhX3NoaWZ0ID0gODsKLQkJZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QyCi0JCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q0Ci0JCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MyCi0JCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M0Ci0JCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M2Ci0JCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q1KQotCQkgIGV4dHJhX3NoaWZ0ID0gMTY7Ci0JCWVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENykKLQkJICBleHRyYV9zaGlmdCA9IDg7Ci0JCWVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EOCB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDkpCi0JCSAgZXh0cmFfc2hpZnQgPSA4OwotCQllbHNlCi0JCSAgZXh0cmFfc2hpZnQgPSAwOwotCSAgICAgIAotCQltbjEwMzAwX2luc2VydF9vcGVyYW5kICgmaW5zbiwgJmV4dGVuc2lvbiwgb3BlcmFuZCwKLQkJCQkJZXguWF9hZGRfbnVtYmVyLCAoY2hhciAqKSBOVUxMLAotCQkJCQkwLCBleHRyYV9zaGlmdCk7Ci0KLQotCQkvKiBBbmQgbm90ZSB0aGUgcmVnaXN0ZXIgbnVtYmVyIGluIHRoZSByZWdpc3RlciBhcnJheS4gICovCi0JCW1uMTAzMDBfcmVnX29wZXJhbmRzW29wX2lkeCAtIDFdID0gZXguWF9hZGRfbnVtYmVyOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgY2FzZSBPX2NvbnN0YW50OgotCSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBjYW4gYmUgcHJvbW90ZWQsIGFuZCBpdCBkb2Vzbid0Ci0JCSBmaXQgaW50byB0aGUgYWxsb2NhdGVkIGJpdGZpZWxkIGZvciB0aGlzIGluc24sCi0JCSB0aGVuIHByb21vdGUgaXQgKGllIHRoaXMgb3Bjb2RlIGRvZXMgbm90IG1hdGNoKS4gICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzCi0JCSAgJiAoTU4xMDMwMF9PUEVSQU5EX1BST01PVEUgfCBNTjEwMzAwX09QRVJBTkRfUkVMQVgpCi0JCSAgJiYgISBjaGVja19vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIpKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICAgIG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAotCQkJCSAgICAgIGV4LlhfYWRkX251bWJlciwgKGNoYXIgKikgTlVMTCwKLQkJCQkgICAgICAwLCAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBjYW4gYmUgcHJvbW90ZWQsIHRoZW4gdGhpcyBvcGNvZGUgZGlkbid0Ci0JCSBtYXRjaCBzaW5jZSB3ZSBjYW4ndCBrbm93IGlmIGl0IG5lZWRlZCBwcm9tb3Rpb24hICAqLwotCSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkgICAgICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCQlhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCSAgICAgIGZpeHVwc1tmY10uZXhwID0gZXg7Ci0JICAgICAgZml4dXBzW2ZjXS5vcGluZGV4ID0gKm9waW5kZXhfcHRyOwotCSAgICAgIGZpeHVwc1tmY10ucmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICAgICsrZmM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQota2VlcF9nb2luZzoKLQkgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJykKLQkgICAgKytzdHI7Ci0KLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSB1c2VkIGFsbCB0aGUgb3BlcmFuZHMhICAqLwotICAgICAgaWYgKCpzdHIgIT0gJywnKQotCW1hdGNoID0gMTsKLQotICAgICAgLyogSWYgdGhpcyBpbnN0cnVjdGlvbiBoYXMgcmVnaXN0ZXJzIHRoYXQgbXVzdCBub3QgbWF0Y2gsIHZlcmlmeQotCSB0aGF0IHRoZXkgZG8gaW5kZWVkIG5vdCBtYXRjaC4gICovCi0gICAgICBpZiAob3Bjb2RlLT5ub19tYXRjaF9vcGVyYW5kcykKLQl7Ci0JICBpbnQgaTsKLQotCSAgLyogTG9vayBhdCBlYWNoIG9wZXJhbmQgdG8gc2VlIGlmIGl0J3MgbWFya2VkLiAgKi8KLQkgIGZvciAoaSA9IDA7IGkgPCBNTjEwMzAwX01BWF9PUEVSQU5EUzsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCgxIDw8IGkpICYgb3Bjb2RlLT5ub19tYXRjaF9vcGVyYW5kcykKLQkJewotCQkgIGludCBqOwotCi0JCSAgLyogb3BlcmFuZCBJIGlzIG1hcmtlZC4gIENoZWNrIHRoYXQgaXQgZG9lcyBub3QgbWF0Y2ggYW55Ci0JCSAgICAgb3BlcmFuZHMgPiBJIHdoaWNoIGFyZSBtYXJrZWQuICAqLwotCQkgIGZvciAoaiA9IGkgKyAxOyBqIDwgTU4xMDMwMF9NQVhfT1BFUkFORFM7IGorKykKLQkJICAgIHsKLQkJICAgICAgaWYgKCgoMSA8PCBqKSAmIG9wY29kZS0+bm9fbWF0Y2hfb3BlcmFuZHMpCi0JCQkgICYmIG1uMTAzMDBfcmVnX29wZXJhbmRzW2ldID09IG1uMTAzMDBfcmVnX29wZXJhbmRzW2pdKQotCQkJewotCQkJICBlcnJtc2cgPSBfKCJJbnZhbGlkIHJlZ2lzdGVyIHNwZWNpZmljYXRpb24uIik7Ci0JCQkgIG1hdGNoID0gMDsKLQkJCSAgZ290byBlcnJvcjsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgZXJyb3I6Ci0gICAgICBpZiAobWF0Y2ggPT0gMCkKLSAgICAgICAgewotCSAgbmV4dF9vcGNvZGUgPSBvcGNvZGUgKyAxOwotCSAgaWYgKCFzdHJjbXAobmV4dF9vcGNvZGUtPm5hbWUsIG9wY29kZS0+bmFtZSkpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgPSBuZXh0X29wY29kZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgCi0JICBhc19iYWQgKCIlcyIsIGVycm1zZyk7Ci0JICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAgIAotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgaWYgKCpzdHIgIT0gJ1wwJykKLSAgICBhc19iYWQgKF8oImp1bmsgYXQgZW5kIG9mIGxpbmU6IGAlcyciKSwgc3RyKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzApCi0gICAgc2l6ZSA9IDE7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDApCi0gICAgc2l6ZSA9IDI7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMiB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDEpCi0gICAgc2l6ZSA9IDM7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENikKLSAgICBzaXplID0gMzsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q3IHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMTApCi0gICAgc2l6ZSA9IDQ7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EOCkKLSAgICBzaXplID0gNjsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q5KQotICAgIHNpemUgPSA3OwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzQpCi0gICAgc2l6ZSA9IDU7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNiB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDUpCi0gICAgc2l6ZSA9IDc7Ci0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMikKLSAgICBzaXplID0gNDsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q0KQotICAgIHNpemUgPSA2OwotCi0gIGlmIChyZWxheGFibGUgJiYgZmMgPiAwKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotCi0gICAgICAvKiBiQ0MgKi8KLSAgICAgIGlmIChzaXplID09IDIpCi0JewotCSAgLyogSGFuZGxlIGJyYSBzcGVjaWFsbHkuICBCYXNpY2FsbHkgdHJlYXQgaXQgbGlrZSBqbXAgc28KLQkgICAgIHRoYXQgd2UgYXV0b21hdGljYWxseSBoYW5kbGUgOCwgMTYgYW5kIDMyIGJpdCBvZmZzZXRzCi0JICAgICBjb3JyZWN0bHkgYXMgd2VsbCBhcyBqdW1wcyB0byBhbiB1bmRlZmluZWQgYWRkcmVzcy4KLQotCSAgICAgSXQgaXMgYWxzbyBpbXBvcnRhbnQgdG8gbm90IHRyZWF0IGl0IGxpa2Ugb3RoZXIgYkNDCi0JICAgICBpbnN0cnVjdGlvbnMgc2luY2UgdGhlIGxvbmcgZm9ybXMgb2YgYnJhIGlzIGRpZmZlcmVudAotCSAgICAgZnJvbSBvdGhlciBiQ0MgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgIGlmIChvcGNvZGUtPm9wY29kZSA9PSAweGNhMDApCi0JICAgIHR5cGUgPSAxMDsKLQkgIGVsc2UKLQkgICAgdHlwZSA9IDA7Ci0JfQotICAgICAgLyogY2FsbCAqLwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA1KQotICAgICAgICB0eXBlID0gNjsKLSAgICAgIC8qIGNhbGxzICovCi0gICAgICBlbHNlIGlmIChzaXplID09IDQpCi0JdHlwZSA9IDg7Ci0gICAgICAvKiBqbXAgKi8KLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gMyAmJiBvcGNvZGUtPm9wY29kZSA9PSAweGNjMDAwMCkKLQl0eXBlID0gMTA7Ci0gICAgICAvKiBiQ0MgKHVuY29tbW9uIGNhc2VzKSAqLwotICAgICAgZWxzZQotCXR5cGUgPSAzOwotCi0gICAgICBmID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCA4IC0gc2l6ZSwgdHlwZSwKLQkJICAgIGZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sLAotCQkgICAgZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIsCi0JCSAgICAoY2hhciAqKWZpeHVwc1swXS5vcGluZGV4KTsKLSAgICAgIAotICAgICAgLyogVGhpcyBpcyBwcmV0dHkgaG9rZXkuICBXZSBiYXNpY2FsbHkganVzdCBjYXJlIGFib3V0IHRoZQotCSBvcGNvZGUsIHNvIHdlIGhhdmUgdG8gd3JpdGUgb3V0IHRoZSBmaXJzdCB3b3JkIGJpZyBlbmRpYW4uCi0KLQkgVGhlIGV4Y2VwdGlvbiBpcyAiY2FsbCIsIHdoaWNoIGhhcyB0d28gb3BlcmFuZHMgdGhhdCB3ZQotCSBjYXJlIGFib3V0LgotCi0JIFRoZSBmaXJzdCBvcGVyYW5kICh0aGUgcmVnaXN0ZXIgbGlzdCkgaGFwcGVucyB0byBiZSBpbiB0aGUKLQkgZmlyc3QgaW5zdHJ1Y3Rpb24gd29yZCwgYW5kIHdpbGwgYmUgaW4gdGhlIHJpZ2h0IHBsYWNlIGlmCi0JIHdlIG91dHB1dCB0aGUgZmlyc3Qgd29yZCBpbiBiaWcgZW5kaWFuIG1vZGUuCi0KLQkgVGhlIHNlY29uZCBvcGVyYW5kIChzdGFjayBzaXplKSBpcyBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQsCi0JIGFuZCB3ZSB3YW50IGl0IHRvIGFwcGVhciBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBleHRlbnNpb24KLQkgd29yZCAoYXMgaXQgYXBwZWFycyBpbiBtZW1vcnkpLiAgTHVja2lseSwgd3JpdGluZyB0aGUgZXh0ZW5zaW9uCi0JIHdvcmQgaW4gYmlnIGVuZGlhbiBmb3JtYXQgd2lsbCBkbyB3aGF0IHdlIHdhbnQuICAqLwotICAgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgc2l6ZSA+IDQgPyA0IDogc2l6ZSk7Ci0gICAgICBpZiAoc2l6ZSA+IDgpCi0JewotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDQsIGV4dGVuc2lvbiwgNCk7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgOCwgMCwgc2l6ZSAtIDgpOwotCX0KLSAgICAgIGVsc2UgaWYgKHNpemUgPiA0KQotCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyA0LCBleHRlbnNpb24sIHNpemUgLSA0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGYgPSBmcmFnX21vcmUgKHNpemUpOwotCi0gICAgICAvKiBGaWxsIGluIGJ5dGVzIGZvciB0aGUgaW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgb3Bjb2RlIGZpZWxkcwotCSBhcmUgd3JpdHRlbiBiaWctZW5kaWFuLCAxNiAmIDMyYml0IGltbWVkaWF0ZXMgYXJlIHdyaXR0ZW4KLQkgbGl0dGxlIGVuZGlhbi4gIEVnYWQuICAqLwotICAgICAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMAotCSAgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MxCi0JICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDAKLQkgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENgotCSAgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q3Ci0JICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDEwCi0JICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDEpCi0JewotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgc2l6ZSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MyCi0JICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZGYwMDAwCi0JICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZGUwMDAwKQotCXsKLQkgIC8qIEEgZm9ybWF0IFMyIGluc3RydWN0aW9uIHRoYXQgaXMgX25vdF8gInJldCIgYW5kICJyZXRmIi4gICovCi0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAxNikgJiAweGZmLCAxKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAxLCBpbnNuICYgMHhmZmZmLCAyKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzIpCi0JewotCSAgLyogVGhpcyBtdXN0IGJlIGEgcmV0IG9yIHJldGYsIHdoaWNoIGlzIHdyaXR0ZW4gZW50aXJlbHkgaW4KLQkgICAgIGJpZy1lbmRpYW4gZm9ybWF0LiAgKi8KLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIDMpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNAotCSAgICAgICAmJiBvcGNvZGUtPm9wY29kZSAhPSAweGRjMDAwMDAwKQotCXsKLQkgIC8qIFRoaXMgbXVzdCBiZSBhIGZvcm1hdCBTNCAiY2FsbCIgaW5zdHJ1Y3Rpb24uICBXaGF0IGEgcGFpbi4gICovCi0JICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoaW5zbiA+PiA4KSAmIDB4ZmZmZjsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDI0KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDEsIHRlbXAsIDIpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDMsIGluc24gJiAweGZmLCAxKTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyA0LCBleHRlbnNpb24gJiAweGZmLCAxKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzQpCi0JewotCSAgLyogVGhpcyBtdXN0IGJlIGEgZm9ybWF0IFM0ICJqbXAiIGluc3RydWN0aW9uLiAgKi8KLQkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9ICgoaW5zbiAmIDB4ZmZmZmZmKSA8PCA4KSB8IChleHRlbnNpb24gJiAweGZmKTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDI0KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDEsIHRlbXAsIDQpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNikKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoKGluc24gJiAweGZmZmZmZikgPDwgOCkKLQkgICAgfCAoKGV4dGVuc2lvbiA+PiAxNikgJiAweGZmKTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDI0KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDEsIHRlbXAsIDQpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDUsIChleHRlbnNpb24gPj4gOCkgJiAweGZmLCAxKTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyA2LCBleHRlbnNpb24gJiAweGZmLCAxKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDIKLQkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhmYWY4MDAwMAotCSAgICAgICAmJiBvcGNvZGUtPm9wY29kZSAhPSAweGZhZjAwMDAwCi0JICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZmFmNDAwMDApCi0JewotCSAgLyogQSBmb3JtYXQgRDIgaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIDE2Yml0IGltbWVkaWF0ZSBpcwotCSAgICAgcmVhbGx5IGEgc2luZ2xlIDE2Yml0IHZhbHVlLCBub3QgdHdvIDhiaXQgdmFsdWVzLiAgKi8KLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmZmZiwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMiwgaW5zbiAmIDB4ZmZmZiwgMik7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QyKQotCXsKLQkgIC8qIEEgZm9ybWF0IEQyIGluc3RydWN0aW9uIHdoZXJlIHRoZSAxNmJpdCBpbW1lZGlhdGUKLQkgICAgIGlzIHJlYWxseSB0d28gOGJpdCBpbW1lZGlhdGVzLiAgKi8KLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIDQpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSB8IChleHRlbnNpb24gJiAweGZmZmYpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZmZmLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAyLCB0ZW1wLCA0KTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDUpCi0JewotCSAgdW5zaWduZWQgbG9uZyB0ZW1wID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikKLQkgICAgCQkJfCAoKGV4dGVuc2lvbiA+PiA4KSAmIDB4ZmZmZik7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAxNikgJiAweGZmZmYsIDIpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDIsIHRlbXAsIDQpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDYsIGV4dGVuc2lvbiAmIDB4ZmYsIDEpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EOCkKLQl7Ci0gICAgICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gKChpbnNuICYgMHhmZikgPDwgMTYpIHwgKGV4dGVuc2lvbiAmIDB4ZmZmZik7Ci0gICAgICAgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gOCkgJiAweGZmZmZmZiwgMyk7Ci0gICAgICAgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDMsICh0ZW1wICYgMHhmZiksIDEpOwotICAgICAgICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyA0LCB0ZW1wID4+IDgsIDIpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EOSkKLQl7Ci0gICAgICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gKChpbnNuICYgMHhmZikgPDwgMjQpIHwgKGV4dGVuc2lvbiAmIDB4ZmZmZmZmKTsKLSAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiA4KSAmIDB4ZmZmZmZmLCAzKTsKLSAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMywgdGVtcCwgNCk7Ci0JfQotCi0gICAgICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgZmM7IGkrKykKLQl7Ci0JICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICpvcGVyYW5kOwotCi0JICBvcGVyYW5kID0gJm1uMTAzMDBfb3BlcmFuZHNbZml4dXBzW2ldLm9waW5kZXhdOwotCSAgaWYgKGZpeHVwc1tpXS5yZWxvYyAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCSAgICB7Ci0JICAgICAgcmVsb2NfaG93dG9fdHlwZSAqcmVsb2NfaG93dG87Ci0JICAgICAgaW50IHNpemU7Ci0JICAgICAgaW50IG9mZnNldDsKLQkgICAgICBmaXhTICpmaXhQOwotCi0JICAgICAgcmVsb2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4dXBzW2ldLnJlbG9jKTsKLQotCSAgICAgIGlmICghcmVsb2NfaG93dG8pCi0JCWFib3J0KCk7Ci0JICAKLQkgICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWxvY19ob3d0byk7Ci0KLQkgICAgICBpZiAoc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpCi0JCWFib3J0KCk7Ci0KLQkgICAgICBvZmZzZXQgPSA0IC0gc2l6ZTsKLQkgICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsCi0JCQkJICBzaXplLCAmZml4dXBzW2ldLmV4cCwKLQkJCQkgIHJlbG9jX2hvd3RvLT5wY19yZWxhdGl2ZSwKLQkJCQkgIGZpeHVwc1tpXS5yZWxvYyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCByZWxvYywgcGNyZWwsIHJlbG9jX3NpemUsIG9mZnNldDsKLQkgICAgICBmaXhTICpmaXhQOwotCi0JICAgICAgcmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLQkgICAgICAvKiBIb3cgYmlnIGlzIHRoZSByZWxvYz8gIFJlbWVtYmVyIFNQTElUIHJlbG9jcyBhcmUKLQkJIGltcGxpY2l0bHkgMzJiaXRzLiAgKi8KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQTElUKSAhPSAwKQotCQlyZWxvY19zaXplID0gMzI7Ci0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EXzI0QklUKSAhPSAwKQotCQlyZWxvY19zaXplID0gMjQ7Ci0JICAgICAgZWxzZQotCQlyZWxvY19zaXplID0gb3BlcmFuZC0+Yml0czsKLQotCSAgICAgIC8qIElzIHRoZSByZWxvYyBwYy1yZWxhdGl2ZT8gICovCi0JICAgICAgcGNyZWwgPSAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUENSRUwpICE9IDA7Ci0KLQkgICAgICAvKiBHcm9zcy4gIFRoaXMgZGlzZ3VzdGluZyBoYWNrIGlzIHRvIG1ha2Ugc3VyZSB3ZQotCQkgZ2V0IHRoZSByaWdodCBvZmZzZXQgZm9yIHRoZSAxNi8zMiBiaXQgcmVsb2MgaW4gCi0JCSAiY2FsbCIgaW5zdHJ1Y3Rpb25zLiAgQmFzaWNhbGx5IHRoZXkncmUgYSBwYWluCi0JCSBiZWNhdXNlIHRoZSByZWxvYyBpc24ndCBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaWYgKChzaXplID09IDUgfHwgc2l6ZSA9PSA3KQotCQkgICYmICgoKGluc24gPj4gMjQpICYgMHhmZikgPT0gMHhjZAotCQkgICAgICB8fCAoKGluc24gPj4gMjQpICYgMHhmZikgPT0gMHhkZCkpCi0JCXNpemUgLT0gMjsKLQotCSAgICAgIC8qIFNpbWlsYXJseSBmb3IgY2VydGFpbiBiaXQgaW5zdHJ1Y3Rpb25zIHdoaWNoIGRvbid0Ci0JCSBoYXYgdGhlaXIgMzJiaXQgcmVsb2MgYXQgdGhlIHRhaWwgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAoc2l6ZSA9PSA3Ci0JCSAgJiYgKCgoaW5zbiA+PiAxNikgJiAweGZmZmYpID09IDB4ZmUwMAotCQkgICAgICB8fCAoKGluc24gPj4gMTYpICYgMHhmZmZmKSA9PSAweGZlMDEKLQkJICAgICAgfHwgKChpbnNuID4+IDE2KSAmIDB4ZmZmZikgPT0gMHhmZTAyKSkKLQkJc2l6ZSAtPSAxOwotCQotCSAgICAgIG9mZnNldCA9IHNpemUgLSByZWxvY19zaXplIC8gODsKLQotCSAgICAgIC8qIENob29zZSBhIHByb3BlciBCRkQgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLQkgICAgICBpZiAocGNyZWwpCi0JCXsKLQkJICBpZiAocmVsb2Nfc2l6ZSA9PSAzMikKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMTYpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDgpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ184X1BDUkVMOwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJlbG9jX3NpemUgPT0gMzIpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18zMjsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDE2KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMTY7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSA4KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfODsKLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgLyogQ29udmVydCB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MgaW50byB3aGF0IGZpeF9uZXdfZXhwIHdhbnRzLiAgKi8KLQkgICAgICByZWxvY19zaXplID0gcmVsb2Nfc2l6ZSAvIDg7Ci0JICAgICAgaWYgKHJlbG9jX3NpemUgPT0gOCkKLQkJcmVsb2Nfc2l6ZSA9IDA7Ci0JICAgICAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAxNikKLQkJcmVsb2Nfc2l6ZSA9IDE7Ci0JICAgICAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAzMikKLQkJcmVsb2Nfc2l6ZSA9IDI7Ci0KLQkgICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsCi0JCQkJICByZWxvY19zaXplLCAmZml4dXBzW2ldLmV4cCwgcGNyZWwsCi0JCQkJICAoKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgcmVsb2MpKTsKLQotCSAgICAgIGlmIChwY3JlbCkKLQkJZml4UC0+Znhfb2Zmc2V0ICs9IG9mZnNldDsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotLyogaWYgd2hpbGUgcHJvY2Vzc2luZyBhIGZpeHVwLCBhIHJlbG9jIHJlYWxseSBuZWVkcyB0byBiZSBjcmVhdGVkICovCi0vKiB0aGVuIGl0IGlzIGRvbmUgaGVyZSAqLwotICAgICAgICAgICAgICAgICAKLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICBfKCJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgKGludClmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICBpZiAoZml4cC0+ZnhfYWRkc3kgJiYgZml4cC0+Znhfc3Vic3kpCi0gICAgewotICAgIAotICAgICAgaWYgKChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpKQotCSAgfHwgU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCXsKLQkgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSJEaWZmZXJlbmNlIG9mIHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlY3Rpb25zIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmJmZF9hYnNfc3ltYm9sOwotICAgICAgcmVsb2MtPmFkZGVuZCA9IChTX0dFVF9WQUxVRSAoZml4cC0+ZnhfYWRkc3kpCi0JCSAgICAgICAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSkgKyBmaXhwLT5meF9vZmZzZXQpOwotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mKCBhc3ltYm9sICopKTsKLSAgICAgICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICAgICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSAgICB9Ci0gIHJldHVybiByZWxvYzsKLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMCkKLSAgICByZXR1cm4gMjsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDMpCi0gICAgcmV0dXJuIDM7Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSA2KQotICAgIHsKLSAgICAgIGlmICghU19JU19ERUZJTkVEIChmcmFncC0+ZnJfc3ltYm9sKQotCSAgfHwgc2VnICE9IFNfR0VUX1NFR01FTlQgKGZyYWdwLT5mcl9zeW1ib2wpKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gNzsKLQkgIHJldHVybiA3OwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gNTsKLSAgICB9Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSA4KQotICAgIHsKLSAgICAgIGlmICghU19JU19ERUZJTkVEIChmcmFncC0+ZnJfc3ltYm9sKQotCSAgfHwgc2VnICE9IFNfR0VUX1NFR01FTlQgKGZyYWdwLT5mcl9zeW1ib2wpKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gOTsKLQkgIHJldHVybiA2OwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gNDsKLSAgICB9Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAxMCkKLSAgICB7Ci0gICAgICBpZiAoIVNfSVNfREVGSU5FRCAoZnJhZ3AtPmZyX3N5bWJvbCkKLQkgIHx8IHNlZyAhPSBTX0dFVF9TRUdNRU5UIChmcmFncC0+ZnJfc3ltYm9sKSkKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9IDEyOwotCSAgcmV0dXJuIDU7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiAyOwotICAgIH0KLX0gCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotI2lmIDAKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwgJiYgISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIExldCB0aGUgbGlua2VyIGZpZ3VyZSBpdCBvdXQuICAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotI2VuZGlmCi19Ci0KLWludAotbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHZhbHVlVCAqdmFsdWVwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgLyogV2Ugc2hvdWxkbid0IGV2ZXIgZ2V0IGhlcmUgYmVjYXVzZSBsaW5rcmVsYXggaXMgbm9uemVyby4gICovCi0gIGFib3J0ICgpOwotICBmaXhwLT5meF9kb25lID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotbW4xMDMwMF9pbnNlcnRfb3BlcmFuZCAoaW5zbnAsIGV4dGVuc2lvbnAsIG9wZXJhbmQsIHZhbCwgZmlsZSwgbGluZSwgc2hpZnQpCi0gICAgIHVuc2lnbmVkIGxvbmcgKmluc25wOwotICAgICB1bnNpZ25lZCBsb25nICpleHRlbnNpb25wOwotICAgICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICpvcGVyYW5kOwotICAgICBvZmZzZXRUIHZhbDsKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIHVuc2lnbmVkIGludCBzaGlmdDsKLXsKLSAgLyogTm8gbmVlZCB0byBjaGVjayAzMmJpdCBvcGVyYW5kcyBmb3IgYSBiaXQuICBOb3RlIHRoYXQKLSAgICAgTU4xMDMwMF9PUEVSQU5EX1NQTElUIGlzIGFuIGltcGxpY2l0IDMyYml0IG9wZXJhbmQuICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMgotICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQTElUKSA9PSAwKQotICAgIHsKLSAgICAgIGxvbmcgbWluLCBtYXg7Ci0gICAgICBvZmZzZXRUIHRlc3Q7Ci0gICAgICBpbnQgYml0czsKLQotICAgICAgYml0cyA9IG9wZXJhbmQtPmJpdHM7Ci0gICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfMjRCSVQpCi0JYml0cyA9IDI0OwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCkgIT0gMCkKLQl7Ci0JICBtYXggPSAoMSA8PCAoYml0cyAtIDEpKSAtIDE7Ci0JICBtaW4gPSAtICgxIDw8IChiaXRzIC0gMSkpOwotCX0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1heCA9ICgxIDw8IGJpdHMpIC0gMTsKLSAgICAgICAgICBtaW4gPSAwOwotICAgICAgICB9Ci0KLSAgICAgIHRlc3QgPSB2YWw7Ci0KLQotICAgICAgaWYgKHRlc3QgPCAob2Zmc2V0VCkgbWluIHx8IHRlc3QgPiAob2Zmc2V0VCkgbWF4KQotICAgICAgICB7Ci0gICAgICAgICAgY29uc3QgY2hhciAqZXJyID0KLSAgICAgICAgICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKTsKLSAgICAgICAgICBjaGFyIGJ1ZlsxMDBdOwotCi0gICAgICAgICAgc3ByaW50X3ZhbHVlIChidWYsIHRlc3QpOwotICAgICAgICAgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0gICAgICAgICAgICBhc193YXJuIChlcnIsIGJ1ZiwgbWluLCBtYXgpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIGVyciwgYnVmLCBtaW4sIG1heCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TUExJVCkgIT0gMCkKLSAgICB7Ci0gICAgICAqaW5zbnAgfD0gKHZhbCA+PiAoMzIgLSBvcGVyYW5kLT5iaXRzKSkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLSAgICAgICpleHRlbnNpb25wIHw9ICgodmFsICYgKCgxIDw8ICgzMiAtIG9wZXJhbmQtPmJpdHMpKSAtIDEpKQotCQkgICAgICA8PCBvcGVyYW5kLT5zaGlmdCk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfMjRCSVQpICE9IDApCi0gICAgewotICAgICAgKmluc25wIHw9ICh2YWwgPj4gKDI0IC0gb3BlcmFuZC0+Yml0cykpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0gICAgICAqZXh0ZW5zaW9ucCB8PSAoKHZhbCAmICgoMSA8PCAoMjQgLSBvcGVyYW5kLT5iaXRzKSkgLSAxKSkKLQkJICAgICAgPDwgb3BlcmFuZC0+c2hpZnQpOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEKSA9PSAwKQotICAgIHsKLSAgICAgICppbnNucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJIDw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0KSk7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUQpICE9IDApCi0JKmluc25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkgICA8PCAob3BlcmFuZC0+c2hpZnQgKyBzaGlmdCArIG9wZXJhbmQtPmJpdHMpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqZXh0ZW5zaW9ucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJICAgICAgPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQpKTsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRCkgIT0gMCkKLQkqZXh0ZW5zaW9ucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJCTw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0ICsgb3BlcmFuZC0+Yml0cykpOwotICAgIH0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWNoZWNrX29wZXJhbmQgKGluc24sIG9wZXJhbmQsIHZhbCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICpvcGVyYW5kOwotICAgICBvZmZzZXRUIHZhbDsKLXsKLSAgLyogTm8gbmVlZCB0byBjaGVjayAzMmJpdCBvcGVyYW5kcyBmb3IgYSBiaXQuICBOb3RlIHRoYXQKLSAgICAgTU4xMDMwMF9PUEVSQU5EX1NQTElUIGlzIGFuIGltcGxpY2l0IDMyYml0IG9wZXJhbmQuICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMgotICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQTElUKSA9PSAwKQotICAgIHsKLSAgICAgIGxvbmcgbWluLCBtYXg7Ci0gICAgICBvZmZzZXRUIHRlc3Q7Ci0gICAgICBpbnQgYml0czsKLQotICAgICAgYml0cyA9IG9wZXJhbmQtPmJpdHM7Ci0gICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfMjRCSVQpCi0JYml0cyA9IDI0OwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCkgIT0gMCkKLQl7Ci0JICBtYXggPSAoMSA8PCAoYml0cyAtIDEpKSAtIDE7Ci0JICBtaW4gPSAtICgxIDw8IChiaXRzIC0gMSkpOwotCX0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1heCA9ICgxIDw8IGJpdHMpIC0gMTsKLSAgICAgICAgICBtaW4gPSAwOwotICAgICAgICB9Ci0KLSAgICAgIHRlc3QgPSB2YWw7Ci0KLQotICAgICAgaWYgKHRlc3QgPCAob2Zmc2V0VCkgbWluIHx8IHRlc3QgPiAob2Zmc2V0VCkgbWF4KQotCXJldHVybiAwOwotICAgICAgZWxzZQotCXJldHVybiAxOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfYXJjaF9tYWNoIChtYWNoKQotICAgICBpbnQgbWFjaDsKLXsKLSAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9tbjEwMzAwLCBtYWNoKSkKLSAgICBhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQotICBjdXJyZW50X21hY2hpbmUgPSBtYWNoOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tbjEwMzAwLmggYi9nYXMvY29uZmlnL3RjLW1uMTAzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjYjIyNy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1uMTAzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qIHRjLW1uMTAzMDAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtbW4xMDMwMC5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfTU4xMDMwMAotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gI2Vycm9yIE1OMTAzMDAgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfbW4xMDMwMAotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLW1uMTAzMDAiCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLQotLyogRG9uJ3QgYm90aGVyIHRvIGFkanVzdCByZWxvY3MuICAqLwotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVgpIDAKLQotLyogV2UgZG8gcmVsYXhpbmcgaW4gdGhlIGFzc2VtYmxlciBhcyB3ZWxsIGFzIHRoZSBsaW5rZXIuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbnMzMmsuYyBiL2dhcy9jb25maWcvdGMtbnMzMmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmMTQ2Ny4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW5zMzJrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMwICswLDAgQEAKLS8qIG5zMzJrLmMgIC0tIEFzc2VtYmxlIG9uIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIDMyayBzZXJpZXMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiNkZWZpbmUgU0hPV19OVU0gMSovLyogdW5jb21tZW50IGZvciBkZWJ1Z2dpbmcgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib3Bjb2RlL25zMzJrLmgiCi0KLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLS8qIE1hY3JvcyAqLwotI2RlZmluZSBJSUZfRU5UUklFUyAxMwkJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gaWlmICovCi0jZGVmaW5lIFBSSVZBVEVfU0laRSAyNTYJLyogc2l6ZSBvZiBteSBnYXJiYWdlIG1lbW9yeSAqLwotI2RlZmluZSBNQVhfQVJHUyA0Ci0jZGVmaW5lIERFRkFVTFQJLTEJCS8qIGFkZHJfbW9kZSByZXR1cm5zIHRoaXMgdmFsdWUgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFpbiBjb25zdGFudCBvciBsYWJlbCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvdW50ZXJlZCAqLwotCi0jZGVmaW5lIElJRihwdHIsYTEsYzEsZTEsZzEsaTEsazEsbTEsbzEscTEsczEsdTEpCVwKLSAgICBpaWYuaWlmUFtwdHJdLnR5cGU9IGExOwkJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5zaXplPSBjMTsJCQkJXAotICAgIGlpZi5paWZQW3B0cl0ub2JqZWN0PSBlMTsJCQkJXAotICAgIGlpZi5paWZQW3B0cl0ub2JqZWN0X2FkanVzdD0gZzE7CQkJXAotICAgIGlpZi5paWZQW3B0cl0ucGNyZWw9IGkxOwkJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5wY3JlbF9hZGp1c3Q9IGsxOwkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLmltX2Rpc3A9IG0xOwkJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5yZWxheF9zdWJzdGF0ZT0gbzE7CQkJXAotICAgIGlpZi5paWZQW3B0cl0uYml0X2ZpeFA9IHExOwkJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5hZGRyX21vZGU9IHMxOwkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLmJzcj0gdTE7Ci0KLSNpZmRlZiBTRVFVRU5UX0NPTVBBVEFCSUxJVFkKLSNkZWZpbmUgTElORV9DT01NRU5UX0NIQVJTICJ8IgotI2RlZmluZSBBQlNPTFVURV9QUkVGSVggJ0AnCi0jZGVmaW5lIElNTUVESUFURV9QUkVGSVggJyMnCi0jZW5kaWYKLQotI2lmbmRlZiBMSU5FX0NPTU1FTlRfQ0hBUlMKLSNkZWZpbmUgTElORV9DT01NRU5UX0NIQVJTICIjIgotI2VuZGlmCi0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9IExJTkVfQ09NTUVOVF9DSEFSUzsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotI2lmICFkZWZpbmVkKEFCU09MVVRFX1BSRUZJWCkgJiYgIWRlZmluZWQoSU1NRURJQVRFX1BSRUZJWCkKLSNkZWZpbmUgQUJTT0xVVEVfUFJFRklYICdAJwkvKiBPbmUgb3IgdGhlIG90aGVyIE1VU1QgYmUgZGVmaW5lZCAqLwotI2VuZGlmCi0KLXN0cnVjdCBhZGRyX21vZGUKLSAgewotICAgIGNoYXIgbW9kZTsJCQkvKiBhZGRyZXNzaW5nIG1vZGUgb2Ygb3BlcmFuZCAoMC0zMSkgKi8KLSAgICBjaGFyIHNjYWxlZF9tb2RlOwkJLyogbW9kZSBjb21iaW5lZCB3aXRoIHNjYWxlZCBtb2RlICovCi0gICAgY2hhciBzY2FsZWRfcmVnOwkJLyogcmVnaXN0ZXIgdXNlZCBpbiBzY2FsZWQrMSAoMS04KSAqLwotICAgIGNoYXIgZmxvYXRfZmxhZzsJCS8qIHNldCBpZiBSMC4uUjcgd2FzIEYwLi5GNyBpZSBhCi0JCQkJICAgZmxvYXRpbmctcG9pbnQtcmVnaXN0ZXIgKi8KLSAgICBjaGFyIGFtX3NpemU7CQkvKiBlc3RpbWF0ZWQgbWF4IHNpemUgb2YgZ2VuZXJhbCBhZGRyLW1vZGUKLQkJCQkgICBwYXJ0cyAqLwotICAgIGNoYXIgaW1fZGlzcDsJCS8qIGlmIGltX2Rpc3A9PTEgd2UgaGF2ZSBhIGRpc3BsYWNlbWVudCAqLwotICAgIGNoYXIgcGNyZWw7CQkJLyogMSBpZiBwY3JlbCwgdGhpcyBpcyByZWFsbHkgcmVkdW5kYW50IGluZm8gKi8KLSAgICBjaGFyIGRpc3Bfc3VmZml4WzJdOwkvKiBsZW5ndGggb2YgZGlzcGxhY2VtZW50KHMpLCAwPXVuZGVmaW5lZCAqLwotICAgIGNoYXIgKmRpc3BbMl07CQkvKiBwb2ludGVyKHMpIGF0IGRpc3BsYWNlbWVudChzKQotCQkJCSAgIG9yIGltbWVkaWF0ZXMocykgICAgIChhc2NpaSkgKi8KLSAgICBjaGFyIGluZGV4X2J5dGU7CQkvKiBpbmRleCBieXRlICovCi0gIH07Ci10eXBlZGVmIHN0cnVjdCBhZGRyX21vZGUgYWRkcl9tb2RlUzsKLQotCi1jaGFyICpmcmVlcHRyLCAqZnJlZXB0cl9zdGF0aWM7CS8qIHBvaW50cyBhdCBzb21lIG51bWJlciBvZiBmcmVlIGJ5dGVzICovCi1zdHJ1Y3QgaGFzaF9jb250cm9sICppbnN0X2hhc2hfaGFuZGxlOwotCi1zdHJ1Y3QgbnMzMmtfb3Bjb2RlICpkZXNjOwkvKiBwb2ludGVyIGF0IGRlc2NyaXB0aW9uIG9mIGluc3RydWN0aW9uICovCi1hZGRyX21vZGVTIGFkZHJfbW9kZVA7Ci1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZmQiOwkvKiB3ZSBkb24ndCB3YW50IHRvIHN1cHBvcnQgbG93ZXJjYXNlLCBkbyB3ZSAqLwotCi0vKiBVUFBFUkNBU0UgZGVub3RlcyBsaXZlIG5hbWVzIHdoZW4gYW4gaW5zdHJ1Y3Rpb24gaXMgYnVpbHQsIElJRiBpcwotICogdXNlZCBhcyBhbiBpbnRlcm1lZGlhdGUgZm9ybSB0byBzdG9yZSB0aGUgYWN0dWFsIHBhcnRzIG9mIHRoZQotICogaW5zdHJ1Y3Rpb24uIEEgbnMzMmsgbWFjaGluZSBpbnN0cnVjdGlvbiBjYW4gYmUgZGl2aWRlZCBpbnRvIGEKLSAqIGNvdXBsZSBvZiBzdWIgUEFSVHMuIFdoZW4gYW4gaW5zdHJ1Y3Rpb24gaXMgYXNzZW1ibGVkIHRoZQotICogYXBwcm9wcmlhdGUgUEFSVCBnZXQgYW4gYXNzaWdubWVudC4gV2hlbiBhbiBJSUYgaGFzIGJlZW4gY29tcGxldGVkCi0gKiBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBGUkFHbWVudCBhcyBzcGVjaWZpZWQgaW4gQVMuSCAqLwotCi0vKiBpbnRlcm5hbCBzdHJ1Y3RzICovCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uCi0gIHsKLSAgICBjaGFyICpwYXR0ZXJuOwotICAgIHVuc2lnbmVkIGxvbmcgb3I7Ci0gICAgdW5zaWduZWQgbG9uZyBhbmQ7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBpbnQgdHlwZTsJCQkvKiBob3cgdG8gaW50ZXJwcmV0IG9iamVjdCAqLwotICAgIGludCBzaXplOwkJCS8qIEVzdGltYXRlZCBtYXggc2l6ZSBvZiBvYmplY3QgKi8KLSAgICB1bnNpZ25lZCBsb25nIG9iamVjdDsJLyogYmluYXJ5IGRhdGEgKi8KLSAgICBpbnQgb2JqZWN0X2FkanVzdDsJCS8qIG51bWJlciBhZGRlZCB0byBvYmplY3QgKi8KLSAgICBpbnQgcGNyZWw7CQkJLyogVHJ1ZSBpZiBvYmplY3QgaXMgcGNyZWwgKi8KLSAgICBpbnQgcGNyZWxfYWRqdXN0OwkJLyogbGVuZ3RoIGluIGJ5dGVzIGZyb20gdGhlCi0JCQkJCSAgIGluc3RydWN0aW9uIHN0YXJ0IHRvIHRoZQotCQkJCQkgICBkaXNwbGFjZW1lbnQgKi8KLSAgICBpbnQgaW1fZGlzcDsJCS8qIFRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGRpc3BsYWNlbWVudCAqLwotICAgIHJlbGF4X3N1YnN0YXRlVCByZWxheF9zdWJzdGF0ZTsJLyogSW5pdGlhbCByZWxheHN1YnN0YXRlICovCi0gICAgYml0X2ZpeFMgKmJpdF9maXhQOwkJLyogUG9pbnRlciBhdCBiaXRfZml4IHN0cnVjdCAqLwotICAgIGludCBhZGRyX21vZGU7CQkvKiBXaGF0IGFkZHJtb2RlIGRvIHdlIGFzc29jaWF0ZSB3aXRoIHRoaXMKLQkJCQkgICBpaWYtZW50cnkgKi8KLSAgICBjaGFyIGJzcjsJCQkvKiBTZXF1ZW50IGhhY2sgKi8KLSAgfSBpaWZfZW50cnlUOwkJCS8qIEludGVybmFsIEluc3RydWN0aW9uIEZvcm1hdCAqLwotCi1zdHJ1Y3QgaW50X2luc19mb3JtCi0gIHsKLSAgICBpbnQgaW5zdHJfc2l6ZTsJCS8qIE1heCBzaXplIG9mIGluc3RydWN0aW9uIGluIGJ5dGVzLiAqLwotICAgIGlpZl9lbnRyeVQgaWlmUFtJSUZfRU5UUklFUyArIDFdOwotICB9Owotc3RydWN0IGludF9pbnNfZm9ybSBpaWY7Ci1leHByZXNzaW9uUyBleHByUDsKLWNoYXIgKmlucHV0X2xpbmVfcG9pbnRlcjsKLS8qIGRlc2NyaXB0aW9uIG9mIHRoZSBQQVJUcyBpbiBJSUYKLSAqb2JqZWN0W25dOgotICogMAl0b3RhbCBsZW5ndGggaW4gYnl0ZXMgb2YgZW50cmllcyBpbiBpaWYKLSAqIDEJb3Bjb2RlCi0gKiAyCWluZGV4X2J5dGVfYQotICogMwlpbmRleF9ieXRlX2IKLSAqIDQJZGlzcF9hXzEKLSAqIDUJZGlzcF9hXzIKLSAqIDYJZGlzcF9iXzEKLSAqIDcJZGlzcF9iXzIKLSAqIDgJaW1tX2EKLSAqIDkJaW1tX2IKLSAqIDEwCWltcGxpZWQxCi0gKiAxMQlpbXBsaWVkMgotICoKLSAqIEZvciBldmVyeSBlbnRyeSB0aGVyZSBpcyBhIGRhdGFsZW5ndGggaW4gYnl0ZXMuIFRoaXMgaXMgc3RvcmVkIGluIHNpemVbbl0uCi0gKgkgMCwJdGhlIG9iamVjdGxlbmd0aCBpcyBub3QgZXhwbGljaXRseSBnaXZlbiBieSB0aGUgaW5zdHJ1Y3Rpb24KLSAqCQlhbmQgdGhlIG9wZXJhbmQgaXMgdW5kZWZpbmVkLiBUaGlzIGlzIGEgY2FzZSBmb3IgcmVsYXhhdGlvbi4KLSAqCQlSZXNlcnZlIDQgYnl0ZXMgZm9yIHRoZSBmaW5hbCBvYmplY3QuCi0gKgotICoJIDEsCXRoZSBlbnRyeSBjb250YWlucyBvbmUgYnl0ZQotICoJIDIsCXRoZSBlbnRyeSBjb250YWlucyB0d28gYnl0ZXMKLSAqCSAzLAl0aGUgZW50cnkgY29udGFpbnMgdGhyZWUgYnl0ZXMKLSAqCSA0LAl0aGUgZW50cnkgY29udGFpbnMgZm91ciBieXRlcwotICoJZXRjCi0gKgotICogRnVydGhlcm1vcmUsIGV2ZXJ5IGVudHJ5IGhhcyBhIGRhdGEgdHlwZSBpZGVudGlmaWVyIGluIHR5cGVbbl0uCi0gKgotICogCSAwLAl0aGUgZW50cnkgaXMgdm9pZCwgaWdub3JlIGl0LgotICogCSAxLAl0aGUgZW50cnkgaXMgYSBiaW5hcnkgbnVtYmVyLgotICoJIDIsCXRoZSBlbnRyeSBpcyBhIHBvaW50ZXIgYXQgYW4gZXhwcmVzc2lvbi4KLSAqCQlXaGVyZSBleHByZXNzaW9uIG1heSBiZSBhcyBzaW1wbGUgYXMgYSBzaW5nbGUgJzEnLAotICoJCWFuZCBhcyBjb21wbGljYXRlZCBhcyAgZm9vLWJhcisxMiwKLSAqIAkJZm9vIGFuZCBiYXIgbWF5IGJlIHVuZGVmaW5lZCBidXQgc3VmZml4ZWQgYnkgOntifHd8ZH0gdG8KLSAqCQljb250cm9sIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdC4KLSAqCi0gKgkgMywJdGhlIGVudHJ5IGlzIGEgcG9pbnRlciBhdCBhIGJpZ251bSBzdHJ1Y3QKLSAqCi0gKgotICogVGhlIGxvdy1vcmRlci1ieXRlIGNvcmVzcG9uZHMgdG8gbG93IHBoeXNpY2FsIG1lbW9yeS4KLSAqIE9idmlvdXNseSBhIEZSQUdtZW50IG11c3QgYmUgY3JlYXRlZCBmb3IgZWFjaCB2YWxpZCBkaXNwIGluIFBBUlQgd2hvc2UKLSAqIGRhdGFsZW5ndGggaXMgdW5kZWZpbmVkICh0byBiYWQpIC4KLSAqIFRoZSBjYXNlIHdoZXJlIGp1c3QgdGhlIGV4cHJlc3Npb24gaXMgdW5kZWZpbmVkIGlzIGxlc3Mgc2V2ZXJlIGFuZCBpcwotICogaGFuZGxlZCBieSBmaXguIEhlcmUgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgb2JqZWN0ZmlsZSBpcyBrbm93bi4KLSAqIFdpdGggdGhpcyByZXByZXNlbnRhdGlvbiB3ZSBzaW1wbGlmeSB0aGUgYXNzZW1ibHkgYW5kIHNlcGFyYXRlcyB0aGUKLSAqIG1hY2hpbmUgZGVwZW5kZW50L2luZGVwZW5kZW50IHBhcnRzIGluIGEgbW9yZSBjbGVhbiB3YXkgKHNhaWQgT0UpCi0gKi8KLQwKLXN0cnVjdCBuczMya19vcHRpb24gb3B0MVtdID0JCS8qIHJlc3RvcmUsIGV4aXQgKi8KLXsKLSAgeyJyMCIsIDB4ODAsIDB4ZmZ9LAotICB7InIxIiwgMHg0MCwgMHhmZn0sCi0gIHsicjIiLCAweDIwLCAweGZmfSwKLSAgeyJyMyIsIDB4MTAsIDB4ZmZ9LAotICB7InI0IiwgMHgwOCwgMHhmZn0sCi0gIHsicjUiLCAweDA0LCAweGZmfSwKLSAgeyJyNiIsIDB4MDIsIDB4ZmZ9LAotICB7InI3IiwgMHgwMSwgMHhmZn0sCi0gIHswLCAweDAwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0MltdID0JCS8qIHNhdmUsIGVudGVyICovCi17Ci0gIHsicjAiLCAweDAxLCAweGZmfSwKLSAgeyJyMSIsIDB4MDIsIDB4ZmZ9LAotICB7InIyIiwgMHgwNCwgMHhmZn0sCi0gIHsicjMiLCAweDA4LCAweGZmfSwKLSAgeyJyNCIsIDB4MTAsIDB4ZmZ9LAotICB7InI1IiwgMHgyMCwgMHhmZn0sCi0gIHsicjYiLCAweDQwLCAweGZmfSwKLSAgeyJyNyIsIDB4ODAsIDB4ZmZ9LAotICB7MCwgMHgwMCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdDNbXSA9CQkvKiBzZXRjZmcgKi8KLXsKLSAgeyJjIiwgMHg4LCAweGZmfSwKLSAgeyJtIiwgMHg0LCAweGZmfSwKLSAgeyJmIiwgMHgyLCAweGZmfSwKLSAgeyJpIiwgMHgxLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdDRbXSA9CQkvKiBjaW52ICovCi17Ci0gIHsiYSIsIDB4NCwgMHhmZn0sCi0gIHsiaSIsIDB4MiwgMHhmZn0sCi0gIHsiZCIsIDB4MSwgMHhmZn0sCi0gIHswLCAweDAsIDB4ZmZ9Ci19Owotc3RydWN0IG5zMzJrX29wdGlvbiBvcHQ1W10gPQkJLyogc3RyaW5nIGluc3QgKi8KLXsKLSAgeyJiIiwgMHgyLCAweGZmfSwKLSAgeyJ1IiwgMHhjLCAweGZmfSwKLSAgeyJ3IiwgMHg0LCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdDZbXSA9CQkvKiBwbGFpbiByZWcgZXh0LGN2dHAgZXRjICovCi17Ci0gIHsicjAiLCAweDAwLCAweGZmfSwKLSAgeyJyMSIsIDB4MDEsIDB4ZmZ9LAotICB7InIyIiwgMHgwMiwgMHhmZn0sCi0gIHsicjMiLCAweDAzLCAweGZmfSwKLSAgeyJyNCIsIDB4MDQsIDB4ZmZ9LAotICB7InI1IiwgMHgwNSwgMHhmZn0sCi0gIHsicjYiLCAweDA2LCAweGZmfSwKLSAgeyJyNyIsIDB4MDcsIDB4ZmZ9LAotICB7MCwgMHgwMCwgMHhmZn0KLX07Ci0KLSNpZiAhZGVmaW5lZChOUzMyMDMyKSAmJiAhZGVmaW5lZChOUzMyNTMyKQotI2RlZmluZSBOUzMyNTMyCi0jZW5kaWYKLQotc3RydWN0IG5zMzJrX29wdGlvbiBjcHVyZWdfNTMyW10gPQkvKiBscHIgc3ByICovCi17Ci0gIHsidXMiLCAweDAsIDB4ZmZ9LAotICB7ImRjciIsIDB4MSwgMHhmZn0sCi0gIHsiYnBjIiwgMHgyLCAweGZmfSwKLSAgeyJkc3IiLCAweDMsIDB4ZmZ9LAotICB7ImNhciIsIDB4NCwgMHhmZn0sCi0gIHsiZnAiLCAweDgsIDB4ZmZ9LAotICB7InNwIiwgMHg5LCAweGZmfSwKLSAgeyJzYiIsIDB4YSwgMHhmZn0sCi0gIHsidXNwIiwgMHhiLCAweGZmfSwKLSAgeyJjZmciLCAweGMsIDB4ZmZ9LAotICB7InBzciIsIDB4ZCwgMHhmZn0sCi0gIHsiaW50YmFzZSIsIDB4ZSwgMHhmZn0sCi0gIHsibW9kIiwgMHhmLCAweGZmfSwKLSAgezAsIDB4MDAsIDB4ZmZ9Ci19Owotc3RydWN0IG5zMzJrX29wdGlvbiBtbXVyZWdfNTMyW10gPQkvKiBsbXIgc21yICovCi17Ci0gIHsibWNyIiwgMHg5LCAweGZmfSwKLSAgeyJtc3IiLCAweGEsIDB4ZmZ9LAotICB7InRlYXIiLCAweGIsIDB4ZmZ9LAotICB7InB0YjAiLCAweGMsIDB4ZmZ9LAotICB7InB0YjEiLCAweGQsIDB4ZmZ9LAotICB7Iml2YXIwIiwgMHhlLCAweGZmfSwKLSAgeyJpdmFyMSIsIDB4ZiwgMHhmZn0sCi0gIHswLCAweDAsIDB4ZmZ9Ci19OwotCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uIGNwdXJlZ18wMzJbXSA9CS8qIGxwciBzcHIgKi8KLXsKLSAgeyJ1cHNyIiwgMHgwLCAweGZmfSwKLSAgeyJmcCIsIDB4OCwgMHhmZn0sCi0gIHsic3AiLCAweDksIDB4ZmZ9LAotICB7InNiIiwgMHhhLCAweGZmfSwKLSAgeyJwc3IiLCAweGQsIDB4ZmZ9LAotICB7ImludGJhc2UiLCAweGUsIDB4ZmZ9LAotICB7Im1vZCIsIDB4ZiwgMHhmZn0sCi0gIHswLCAweDAsIDB4ZmZ9Ci19Owotc3RydWN0IG5zMzJrX29wdGlvbiBtbXVyZWdfMDMyW10gPQkvKiBsbXIgc21yICovCi17Ci0gIHsiYnByMCIsIDB4MCwgMHhmZn0sCi0gIHsiYnByMSIsIDB4MSwgMHhmZn0sCi0gIHsicGYwIiwgMHg0LCAweGZmfSwKLSAgeyJwZjEiLCAweDUsIDB4ZmZ9LAotICB7InNjIiwgMHg4LCAweGZmfSwKLSAgeyJtc3IiLCAweGEsIDB4ZmZ9LAotICB7ImJjbnQiLCAweGIsIDB4ZmZ9LAotICB7InB0YjAiLCAweGMsIDB4ZmZ9LAotICB7InB0YjEiLCAweGQsIDB4ZmZ9LAotICB7ImVpYSIsIDB4ZiwgMHhmZn0sCi0gIHswLCAweDAsIDB4ZmZ9Ci19OwotCi0jaWYgZGVmaW5lZChOUzMyNTMyKQotc3RydWN0IG5zMzJrX29wdGlvbiAqY3B1cmVnID0gY3B1cmVnXzUzMjsKLXN0cnVjdCBuczMya19vcHRpb24gKm1tdXJlZyA9IG1tdXJlZ181MzI7Ci0jZWxzZQotc3RydWN0IG5zMzJrX29wdGlvbiAqY3B1cmVnID0gY3B1cmVnXzAzMjsKLXN0cnVjdCBuczMya19vcHRpb24gKm1tdXJlZyA9IG1tdXJlZ18wMzI7Ci0jZW5kaWYKLQwKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsJCQkJCS8qIHNvIGZhciBlbXB0eSAqLwotICB7MCwgMCwgMH0KLX07Ci0KLSNkZWZpbmUgSU5EKHgseSkJKCgoeCk8PDIpKyh5KSkKLQotLyogdGhvc2UgYXJlIGluZGV4J3MgdG8gcmVsYXggZ3JvdXBzIGluIG1kX3JlbGF4X3RhYmxlIGllIGl0IG11c3QgYmUKLSAgIG11bHRpcGxpZWQgYnkgNCB0byBwb2ludCBhdCBhIGdyb3VwIHN0YXJ0LiBWaXogSU5EKHgseSkgU2UgZnVuY3Rpb24KLSAgIHJlbGF4X3NlZ21lbnQgaW4gd3JpdGUuYyBmb3IgbW9yZSBpbmZvICovCi0KLSNkZWZpbmUgQlJBTkNICQkxCi0jZGVmaW5lIFBDUkVMCQkyCi0KLS8qIHRob3NlIGFyZSBpbmRleCdzIHRvIGVudHJpZXMgaW4gYSByZWxheCBncm91cCAqLwotCi0jZGVmaW5lIEJZVEUJCTAKLSNkZWZpbmUgV09SRAkJMQotI2RlZmluZSBET1VCTEUJCTIKLSNkZWZpbmUgVU5ERUYgICAgICAgICAgIDMKLS8qIFRob3NlIGxpbWl0cyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBkaXNwbGFjZW1lbnQgc3RhcnQgaW4gbWVtb3J5LgotICAgVGhlIG5zMzJrIHVzZXMgdGhlIGJlZ2luaW5nIG9mIHRoZSBpbnN0cnVjdGlvbiBhcyBkaXNwbGFjZW1lbnQKLSAgIGJhc2UuICBUaGlzIHR5cGUgb2YgZGlzcGxhY2VtZW50cyBjb3VsZCBiZSBoYW5kbGVkIGhlcmUgYnkgbW92aW5nCi0gICB0aGUgbGltaXQgd2luZG93IHVwIG9yIGRvd24uIEkgY2hvb3NlIHRvIHVzZSBhbiBpbnRlcm5hbAotICAgZGlzcGxhY2VtZW50IGJhc2UtYWRqdXN0IGFzIHRoZXJlIGFyZSBvdGhlciByb3V0aW5lcyB0aGF0IG11c3QKLSAgIGNvbnNpZGVyIHRoaXMuIEFsc28sIGFzIHdlIGhhdmUgdHdvIHZhcmlvdXMgb2Zmc2V0LWFkanVzdHMgaW4gdGhlCi0gICBuczMyayAoYWNiIHZlcnN1cyBici9icnMvanNyL2Jjb25kKSwgdHdvIHNldCBvZiBsaW1pdHMgd291bGQgaGF2ZQotICAgaGFkIHRvIGJlIHVzZWQuICBOb3cgd2UgZG9udCBoYXZlIHRvIHRoaW5rIGFib3V0IHRoYXQuICovCi0KLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIHsxLCAxLCAwLCAwfSwKLSAgezEsIDEsIDAsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7KDYzKSwgKC02NCksIDEsIElORCAoQlJBTkNILCBXT1JEKX0sCi0gIHsoODE5MiksICgtODE5MiksIDIsIElORCAoQlJBTkNILCBET1VCTEUpfSwKLSAgezAsIDAsIDQsIDB9LAotICB7MSwgMSwgMCwgMH0KLX07Ci0KLS8qIEFycmF5IHVzZWQgdG8gdGVzdCBpZiBtb2RlIGNvbnRhaW5zIGRpc3BsYWNlbWVudHMuCi0gICBWYWx1ZSBpcyB0cnVlIGlmIG1vZGUgY29udGFpbnMgZGlzcGxhY2VtZW50LiAqLwotCi1jaGFyIGRpc3BfdGVzdFtdID0KLXswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gMSwgMSwgMSwgMCwgMCwgMSwgMSwgMCwKLSAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsKLQotLyogQXJyYXkgdXNlZCB0byBjYWxjdWxhdGUgbWF4IHNpemUgb2YgZGlzcGxhY2VtZW50cyAqLwotCi1jaGFyIGRpc3Bfc2l6ZVtdID0KLXs0LCAxLCAyLCAwLCA0fTsKLQwKLXN0YXRpYyB2b2lkIGV2YWx1YXRlX2V4cHIgUEFSQU1TICgoZXhwcmVzc2lvblMgKiByZXN1bHRQLCBjaGFyICpwdHIpKTsKLXN0YXRpYyB2b2lkIG1kX251bWJlcl90b19kaXNwIFBBUkFNUyAoKGNoYXIgKmJ1ZiwgbG9uZyB2YWwsIGludCBuKSk7Ci1zdGF0aWMgdm9pZCBtZF9udW1iZXJfdG9faW1tIFBBUkFNUyAoKGNoYXIgKmJ1ZiwgbG9uZyB2YWwsIGludCBuKSk7Ci0KLS8qIFBhcnNlcyBhIGdlbmVyYWwgb3BlcmFuZCBpbnRvIGFuIGFkZHJlc3Npbmdtb2RlIHN0cnVjdAotCi0gICBpbjogIHBvaW50ZXIgYXQgb3BlcmFuZCBpbiBhc2NpaSBmb3JtCi0gICBwb2ludGVyIGF0IGFkZHJfbW9kZSBzdHJ1Y3QgZm9yIHJlc3VsdAotICAgdGhlIGxldmVsIG9mIHJlY3Vyc2lvbi4gKGFsd2F5cyAwIG9yIDEpCi0KLSAgIG91dDogZGF0YSBpbiBhZGRyX21vZGUgc3RydWN0Ci0gICAqLwotaW50Ci1hZGRyX21vZGUgKG9wZXJhbmQsIGFkZHJfbW9kZVAsIHJlY3Vyc2l2ZV9sZXZlbCkKLSAgICAgY2hhciAqb3BlcmFuZDsKLSAgICAgcmVnaXN0ZXIgYWRkcl9tb2RlUyAqYWRkcl9tb2RlUDsKLSAgICAgaW50IHJlY3Vyc2l2ZV9sZXZlbDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqc3RyOwotICByZWdpc3RlciBpbnQgaTsKLSAgcmVnaXN0ZXIgaW50IHN0cmw7Ci0gIHJlZ2lzdGVyIGludCBtb2RlOwotICBpbnQgajsKLSAgbW9kZSA9IERFRkFVTFQ7CQkvKiBkZWZhdWx0ICovCi0gIGFkZHJfbW9kZVAtPnNjYWxlZF9tb2RlID0gMDsJLyogd2h5IG5vdCAqLwotICBhZGRyX21vZGVQLT5zY2FsZWRfcmVnID0gMDsJLyogaWYgMCwgbm90IHNjYWxlZCBpbmRleCAqLwotICBhZGRyX21vZGVQLT5mbG9hdF9mbGFnID0gMDsKLSAgYWRkcl9tb2RlUC0+YW1fc2l6ZSA9IDA7Ci0gIGFkZHJfbW9kZVAtPmltX2Rpc3AgPSAwOwotICBhZGRyX21vZGVQLT5wY3JlbCA9IDA7CS8qIG5vdCBzZXQgaW4gdGhpcyBmdW5jdGlvbiAqLwotICBhZGRyX21vZGVQLT5kaXNwX3N1ZmZpeFswXSA9IDA7Ci0gIGFkZHJfbW9kZVAtPmRpc3Bfc3VmZml4WzFdID0gMDsKLSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IE5VTEw7Ci0gIGFkZHJfbW9kZVAtPmRpc3BbMV0gPSBOVUxMOwotICBzdHIgPSBvcGVyYW5kOwotICBpZiAoc3RyWzBdID09IDApCi0gICAgewotICAgICAgcmV0dXJuICgwKTsKLSAgICB9CQkJCS8qIHdlIGRvbid0IHdhbnQgdGhpcyAqLwotICBzdHJsID0gc3RybGVuIChzdHIpOwotICBzd2l0Y2ggKHN0clswXSkKLSAgICB7Ci0gICAgICAvKiB0aGUgZm9sbG93aW5nIHRocmVlIGNhc2Ugc3RhdGVtZW50cyBjb250cm9scyB0aGUgbW9kZS1jaGFycwotCSB0aGlzIGlzIHRoZSBwbGFjZSB0byBlZCBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlbSAqLwotI2lmZGVmIEFCU09MVVRFX1BSRUZJWAotICAgIGNhc2UgQUJTT0xVVEVfUFJFRklYOgotICAgICAgaWYgKHN0cltzdHJsIC0gMV0gPT0gJ10nKQotCWJyZWFrOwotICAgICAgYWRkcl9tb2RlUC0+bW9kZSA9IDIxOwkvKiBhYnNvbHV0ZSAqLwotICAgICAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0ciArIDE7Ci0gICAgICByZXR1cm4gKC0xKTsKLSNlbmRpZgotI2lmZGVmIElNTUVESUFURV9QUkVGSVgKLSAgICBjYXNlIElNTUVESUFURV9QUkVGSVg6Ci0gICAgICBpZiAoc3RyW3N0cmwgLSAxXSA9PSAnXScpCi0JYnJlYWs7Ci0gICAgICBhZGRyX21vZGVQLT5tb2RlID0gMjA7CS8qIGltbWVkaWF0ZSAqLwotICAgICAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0ciArIDE7Ci0gICAgICByZXR1cm4gKC0xKTsKLSNlbmRpZgotICAgIGNhc2UgJy4nOgotICAgICAgaWYgKHN0cltzdHJsIC0gMV0gIT0gJ10nKQotCXsKLQkgIHN3aXRjaCAoc3RyWzFdKQotCSAgICB7Ci0JICAgIGNhc2UgJy0nOgotCSAgICBjYXNlICcrJzoKLQkgICAgICBpZiAoc3RyWzJdICE9ICdcMDAwJykKLQkJewotCQkgIGFkZHJfbW9kZVAtPm1vZGUgPSAyNzsJLyogcGMtcmVsYXRpdiAqLwotCQkgIGFkZHJfbW9kZVAtPmRpc3BbMF0gPSBzdHIgKyAyOwotCQkgIHJldHVybiAoLTEpOwotCQl9Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfd2FybiAoXygiSW52YWxpZCBzeW50YXggaW4gUEMtcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlIikpOwotCSAgICAgIHJldHVybiAoMCk7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdlJzoKLSAgICAgIGlmIChzdHJbc3RybCAtIDFdICE9ICddJykKLQl7Ci0JICBpZiAoKCFzdHJuY21wIChzdHIsICJleHQoIiwgNCkpICYmIHN0cmwgPiA3KQotCSAgICB7CQkJCS8qIGV4dGVybmFsICovCi0JICAgICAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0ciArIDQ7Ci0JICAgICAgaSA9IDA7Ci0JICAgICAgaiA9IDI7Ci0JICAgICAgZG8KLQkJewkJCS8qIGRpc3BbMF0ncyB0ZXJtaW5hdGlvbiBwb2ludCAqLwotCQkgIGogKz0gMTsKLQkJICBpZiAoc3RyW2pdID09ICcoJykKLQkJICAgIGkrKzsKLQkJICBpZiAoc3RyW2pdID09ICcpJykKLQkJICAgIGktLTsKLQkJfQotCSAgICAgIHdoaWxlIChqIDwgc3RybCAmJiBpICE9IDApOwotCSAgICAgIGlmIChpICE9IDAgfHwgIShzdHJbaiArIDFdID09ICctJyB8fCBzdHJbaiArIDFdID09ICcrJykpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbnZhbGlkIHN5bnRheCBpbiBFeHRlcm5hbCBhZGRyZXNzaW5nIG1vZGUiKSk7Ci0JCSAgcmV0dXJuICgwKTsKLQkJfQotCSAgICAgIHN0cltqXSA9ICdcMDAwJzsJCS8qIG51bGwgdGVybWluYXRlIGRpc3BbMF0gKi8KLQkgICAgICBhZGRyX21vZGVQLT5kaXNwWzFdID0gc3RyICsgaiArIDI7Ci0JICAgICAgYWRkcl9tb2RlUC0+bW9kZSA9IDIyOwotCSAgICAgIHJldHVybiAoLTEpOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDo7Ci0gICAgfQotICBzdHJsID0gc3RybGVuIChzdHIpOwotICBzd2l0Y2ggKHN0cmwpCi0gICAgewotICAgIGNhc2UgMjoKLSAgICAgIHN3aXRjaCAoc3RyWzBdKQotCXsKLQljYXNlICdmJzoKLQkgIGFkZHJfbW9kZVAtPmZsb2F0X2ZsYWcgPSAxOwotCWNhc2UgJ3InOgotCSAgaWYgKHN0clsxXSA+PSAnMCcgJiYgc3RyWzFdIDwgJzgnKQotCSAgICB7Ci0JICAgICAgYWRkcl9tb2RlUC0+bW9kZSA9IHN0clsxXSAtICcwJzsKLQkgICAgICByZXR1cm4gKC0xKTsKLQkgICAgfQotCX0KLSAgICBjYXNlIDM6Ci0gICAgICBpZiAoIXN0cm5jbXAgKHN0ciwgInRvcyIsIDMpKQotCXsKLQkgIGFkZHJfbW9kZVAtPm1vZGUgPSAyMzsJLyogVG9wT2ZTdGFjayAqLwotCSAgcmV0dXJuICgtMSk7Ci0JfQotICAgIGRlZmF1bHQ6OwotICAgIH0KLSAgaWYgKHN0cmwgPiA0KQotICAgIHsKLSAgICAgIGlmIChzdHJbc3RybCAtIDFdID09ICcpJykKLQl7Ci0JICBpZiAoc3RyW3N0cmwgLSAyXSA9PSAnKScpCi0JICAgIHsKLQkgICAgICBpZiAoIXN0cm5jbXAgKCZzdHJbc3RybCAtIDVdLCAiKGZwIiwgMykpCi0JCXsKLQkJICBtb2RlID0gMTY7CQkvKiBNZW1vcnkgUmVsYXRpdmUgKi8KLQkJfQotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNV0sICIoc3AiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAxNzsKLQkJfQotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNV0sICIoc2IiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAxODsKLQkJfQotCSAgICAgIGlmIChtb2RlICE9IERFRkFVTFQpCi0JCXsJCQkvKiBtZW1vcnkgcmVsYXRpdmUgKi8KLQkJICBhZGRyX21vZGVQLT5tb2RlID0gbW9kZTsKLQkJICBqID0gc3RybCAtIDU7CQkvKiB0ZW1wIGZvciBlbmQgb2YgZGlzcFswXSAqLwotCQkgIGkgPSAwOwotCQkgIGRvCi0JCSAgICB7Ci0JCSAgICAgIHN0cmwgLT0gMTsKLQkJICAgICAgaWYgKHN0cltzdHJsXSA9PSAnKScpCi0JCQlpKys7Ci0JCSAgICAgIGlmIChzdHJbc3RybF0gPT0gJygnKQotCQkJaS0tOwotCQkgICAgfQotCQkgIHdoaWxlIChzdHJsID4gLTEgJiYgaSAhPSAwKTsKLQkJICBpZiAoaSAhPSAwKQotCQkgICAgewotCQkgICAgICBhc193YXJuIChfKCJJbnZhbGlkIHN5bnRheCBpbiBNZW1vcnkgUmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlIikpOwotCQkgICAgICByZXR1cm4gKDApOwotCQkgICAgfQotCQkgIGFkZHJfbW9kZVAtPmRpc3BbMV0gPSBzdHI7Ci0JCSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0ciArIHN0cmwgKyAxOwotCQkgIHN0cltqXSA9ICdcMDAwJzsJLyogbnVsbCB0ZXJtaW5hdGUgZGlzcFswXSAqLwotCQkgIHN0cltzdHJsXSA9ICdcMDAwJzsJLyogbnVsbCB0ZXJtaW5hdGUgZGlzcFsxXSAqLwotCQkgIHJldHVybiAoLTEpOwotCQl9Ci0JICAgIH0KLQkgIHN3aXRjaCAoc3RyW3N0cmwgLSAzXSkKLQkgICAgewotCSAgICBjYXNlICdyJzoKLQkgICAgY2FzZSAnUic6Ci0JICAgICAgaWYgKHN0cltzdHJsIC0gMl0gPj0gJzAnCi0JCSAgJiYgc3RyW3N0cmwgLSAyXSA8ICc4JwotCQkgICYmIHN0cltzdHJsIC0gNF0gPT0gJygnKQotCQl7Ci0JCSAgYWRkcl9tb2RlUC0+bW9kZSA9IHN0cltzdHJsIC0gMl0gLSAnMCcgKyA4OwotCQkgIGFkZHJfbW9kZVAtPmRpc3BbMF0gPSBzdHI7Ci0JCSAgc3RyW3N0cmwgLSA0XSA9IDA7Ci0JCSAgcmV0dXJuICgtMSk7CQkvKiByZWcgcmVsICovCi0JCX0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBpZiAoIXN0cm5jbXAgKCZzdHJbc3RybCAtIDRdLCAiKGZwIiwgMykpCi0JCXsKLQkJICBtb2RlID0gMjQ7Ci0JCX0KLQkgICAgICBpZiAoIXN0cm5jbXAgKCZzdHJbc3RybCAtIDRdLCAiKHNwIiwgMykpCi0JCXsKLQkJICBtb2RlID0gMjU7Ci0JCX0KLQkgICAgICBpZiAoIXN0cm5jbXAgKCZzdHJbc3RybCAtIDRdLCAiKHNiIiwgMykpCi0JCXsKLQkJICBtb2RlID0gMjY7Ci0JCX0KLQkgICAgICBpZiAoIXN0cm5jbXAgKCZzdHJbc3RybCAtIDRdLCAiKHBjIiwgMykpCi0JCXsKLQkJICBtb2RlID0gMjc7Ci0JCX0KLQkgICAgICBpZiAobW9kZSAhPSBERUZBVUxUKQotCQl7Ci0JCSAgYWRkcl9tb2RlUC0+bW9kZSA9IG1vZGU7Ci0JCSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0cjsKLQkJICBzdHJbc3RybCAtIDRdID0gJ1wwJzsKLQkJICByZXR1cm4gKC0xKTsJCS8qIG1lbW9yeSBzcGFjZSAqLwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBubyB0cmFpbGluZyAnKScgZG8gd2UgaGF2ZSBhICddJyA/ICovCi0gICAgICBpZiAoc3RyW3N0cmwgLSAxXSA9PSAnXScpCi0JewotCSAgc3dpdGNoIChzdHJbc3RybCAtIDJdKQotCSAgICB7Ci0JICAgIGNhc2UgJ2InOgotCSAgICAgIG1vZGUgPSAyODsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAndyc6Ci0JICAgICAgbW9kZSA9IDI5OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdkJzoKLQkgICAgICBtb2RlID0gMzA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3EnOgotCSAgICAgIG1vZGUgPSAzMTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDo7Ci0JICAgICAgYXNfd2FybiAoXygiSW52YWxpZCBzY2FsZWQtaW5kZXhlZCBtb2RlLCB1c2UgKGIsdyxkLHEpIikpOwotCSAgICAgIGlmIChzdHJbc3RybCAtIDNdICE9ICc6JyB8fCBzdHJbc3RybCAtIDZdICE9ICdbJwotCQkgIHx8IHN0cltzdHJsIC0gNV0gPT0gJ3InIHx8IHN0cltzdHJsIC0gNF0gPCAnMCcKLQkJICB8fCBzdHJbc3RybCAtIDRdID4gJzcnKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiU3ludGF4IGluIHNjYWxlZC1pbmRleGVkIG1vZGUsIHVzZSBbUm46bV0gd2hlcmUgbj1bMC4uN10gbT17Yix3LGQscX0iKSk7Ci0JCX0KLQkgICAgfSAvKiBzY2FsZWQgaW5kZXggKi8KLQkgIHsKLQkgICAgaWYgKHJlY3Vyc2l2ZV9sZXZlbCA+IDApCi0JICAgICAgewotCQlhc193YXJuIChfKCJTY2FsZWQtaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGUgY29tYmluZWQgd2l0aCBzY2FsZWQtaW5kZXgiKSk7Ci0JCXJldHVybiAoMCk7Ci0JICAgICAgfQotCSAgICBhZGRyX21vZGVQLT5hbV9zaXplICs9IDE7CS8qIHNjYWxlZCBpbmRleCBieXRlICovCi0JICAgIGogPSBzdHJbc3RybCAtIDRdIC0gJzAnOwkvKiBzdG9yZSB0ZW1wb3JhcnkgKi8KLQkgICAgc3RyW3N0cmwgLSA2XSA9ICdcMDAwJzsJLyogbnVsbHRlcm1pbmF0ZSBmb3IgcmVjdXJzaXZlIGNhbGwgKi8KLQkgICAgaSA9IGFkZHJfbW9kZSAoc3RyLCBhZGRyX21vZGVQLCAxKTsKLQkgICAgaWYgKCFpIHx8IGFkZHJfbW9kZVAtPm1vZGUgPT0gMjApCi0JICAgICAgewotCQlhc193YXJuIChfKCJJbnZhbGlkIG9yIGlsbGVnYWwgYWRkcmVzc2luZyBtb2RlIGNvbWJpbmVkIHdpdGggc2NhbGVkLWluZGV4IikpOwotCQlyZXR1cm4gKDApOwotCSAgICAgIH0KLQkgICAgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPSBhZGRyX21vZGVQLT5tb2RlOwkvKiBzdG9yZSB0aGUgaW5mZXJpb3IKLQkJCQkJCQkgICBtb2RlICovCi0JICAgIGFkZHJfbW9kZVAtPm1vZGUgPSBtb2RlOwotCSAgICBhZGRyX21vZGVQLT5zY2FsZWRfcmVnID0gaiArIDE7Ci0JICAgIHJldHVybiAoLTEpOwotCSAgfQotCX0KLSAgICB9Ci0gIGFkZHJfbW9kZVAtPm1vZGUgPSBERUZBVUxUOwkvKiBkZWZhdWx0IHRvIHdoYXRldmVyICovCi0gIGFkZHJfbW9kZVAtPmRpc3BbMF0gPSBzdHI7Ci0gIHJldHVybiAoLTEpOwotfQotDAotLyogcHRyIHBvaW50cyBhdCBzdHJpbmcgYWRkcl9tb2RlUCBwb2ludHMgYXQgc3RydWN0IHdpdGggcmVzdWx0IFRoaXMKLSAgIHJvdXRpbmUgY2FsbHMgYWRkcl9tb2RlIHRvIGRldGVybWluZSB0aGUgZ2VuZXJhbCBhZGRyLm1vZGUgb2YgdGhlCi0gICBvcGVyYW5kLiBXaGVuIHRoaXMgaXMgcmVhZHkgaXQgcGFyc2VzIHRoZSBkaXNwbGFjZW1lbnRzIGZvciBzaXplCi0gICBzcGVjaWZ5aW5nIHN1ZmZpeGVzIGFuZCBkZXRlcm1pbmVzIHNpemUgb2YgaW1tZWRpYXRlIG1vZGUgdmlhCi0gICBuczMyay1vcGNvZGUuICBBbHNvIGJ1aWxkcyBpbmRleCBieXRlcyBpZiBuZWVkZWQuICAqLwotaW50Ci1nZXRfYWRkcl9tb2RlIChwdHIsIGFkZHJfbW9kZVApCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcl9tb2RlUyAqYWRkcl9tb2RlUDsKLXsKLSAgaW50IHRtcDsKLSAgYWRkcl9tb2RlIChwdHIsIGFkZHJfbW9kZVAsIDApOwotICBpZiAoYWRkcl9tb2RlUC0+bW9kZSA9PSBERUZBVUxUIHx8IGFkZHJfbW9kZVAtPnNjYWxlZF9tb2RlID09IC0xKQotICAgIHsKLSAgICAgIC8qIHJlc29sdmUgYW1iaWdpb3VzIG9wZXJhbmRzLCB0aGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgaWYKLQkgb25lIHVzZXMgc3RhbmRhcmQgTlNDIG9wZXJhbmQgc3ludGF4LiBCdXQgdGhlIHNlcXVlbnQKLQkgY29tcGlsZXIgZG9lc24ndCEhISAgVGhpcyBmaW5kcyBhIHByb3BlciBhZGRyZXNzaW5naW5nIG1vZGUKLQkgaWYgaXQgaXMgaW1wbGljaXRseSBzdGF0ZWQuIFNlZSBuczMyay1vcGNvZGUuaCAqLwotICAgICAgKHZvaWQpIGV2YWx1YXRlX2V4cHIgKCZleHByUCwgcHRyKTsgLyogdGhpcyBjYWxsIHRha2VzIHRpbWUgU2lnaCEgKi8KLSAgICAgIGlmIChhZGRyX21vZGVQLT5tb2RlID09IERFRkFVTFQpCi0JewotCSAgaWYgKGV4cHJQLlhfYWRkX3N5bWJvbCB8fCBleHByUC5YX29wX3N5bWJvbCkKLQkgICAgewotCSAgICAgIGFkZHJfbW9kZVAtPm1vZGUgPSBkZXNjLT5kZWZhdWx0X21vZGVsOyAvKiB3ZSBoYXZlIGEgbGFiZWwgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYWRkcl9tb2RlUC0+bW9kZSA9IGRlc2MtPmRlZmF1bHRfbW9kZWM7IC8qIHdlIGhhdmUgYSBjb25zdGFudCAqLwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChleHByUC5YX2FkZF9zeW1ib2wgfHwgZXhwclAuWF9vcF9zeW1ib2wpCi0JICAgIHsKLQkgICAgICBhZGRyX21vZGVQLT5zY2FsZWRfbW9kZSA9IGRlc2MtPmRlZmF1bHRfbW9kZWw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFkZHJfbW9kZVAtPnNjYWxlZF9tb2RlID0gZGVzYy0+ZGVmYXVsdF9tb2RlYzsKLQkgICAgfQotCX0KLSAgICAgIC8qIG11c3QgcHV0IHRoaXMgbWVzcyBkb3duIGluIGFkZHJfbW9kZSB0byBoYW5kbGUgdGhlIHNjYWxlZAotICAgICAgICAgY2FzZSBiZXR0ZXIgKi8KLSAgICB9Ci0gIC8qIEl0IGFwcGVhcnMgYXMgdGhlIHNlcXVlbnQgY29tcGlsZXIgd2FudHMgYW4gYWJzb2x1dGUgd2hlbiB3ZSBoYXZlCi0gICAgIGEgbGFiZWwgd2l0aG91dCBALiBDb25zdGFudHMgYmVjb21lcyBpbW1lZGlhdGVzIGJlc2lkZXMgdGhlIGFkZHIKLSAgICAgY2FzZS4gIFRoaW5rIGl0IGRvZXMgc28gd2l0aCBsb2NhbCBsYWJlbHMgdG9vLCBub3Qgb3B0aW11bSwgcGNyZWwKLSAgICAgaXMgYmV0dGVyLiAgV2hlbiBJIGhhdmUgdGltZSBJIHdpbGwgbWFrZSBnYXMgY2hlY2sgdGhpcyBhbmQKLSAgICAgc2VsZWN0IHBjcmVsIHdoZW4gcG9zc2libGUgQWN0dWFsbHkgdGhhdCBpcyB0cml2aWFsLiAgKi8KLSAgaWYgKHRtcCA9IGFkZHJfbW9kZVAtPnNjYWxlZF9yZWcpCi0gICAgewkJCQkvKiBidWlsZCBpbmRleGJ5dGUgKi8KLSAgICAgIHRtcC0tOwkJCS8qIHJlbWVtYmVyIHJlZ251bWJlciBjb21lcyBpbmNyZW1lbnRlZCBmb3IKLQkJCQkgICBmbGFncHVycG9zZSAqLwotICAgICAgdG1wIHw9IGFkZHJfbW9kZVAtPnNjYWxlZF9tb2RlIDw8IDM7Ci0gICAgICBhZGRyX21vZGVQLT5pbmRleF9ieXRlID0gKGNoYXIpIHRtcDsKLSAgICAgIGFkZHJfbW9kZVAtPmFtX3NpemUgKz0gMTsKLSAgICB9Ci0gIGlmIChkaXNwX3Rlc3RbYWRkcl9tb2RlUC0+bW9kZV0pCi0gICAgewkJCQkvKiB0aGVyZSB3YXMgYSBkaXNwbGFjZW1lbnQsIHByb2JlIGZvciBsZW5ndGgKLQkJCQkgICBzcGVjaWZ5aW5nIHN1ZmZpeCAqLwotICAgICAgewotCXJlZ2lzdGVyIGNoYXIgYzsKLQlyZWdpc3RlciBjaGFyIHN1ZmZpeDsKLQlyZWdpc3RlciBjaGFyIHN1ZmZpeF9zdWI7Ci0JcmVnaXN0ZXIgaW50IGk7Ci0JcmVnaXN0ZXIgY2hhciAqdG9QOwotCXJlZ2lzdGVyIGNoYXIgKmZyb21QOwotCi0JYWRkcl9tb2RlUC0+cGNyZWwgPSAwOwotCWlmIChkaXNwX3Rlc3RbYWRkcl9tb2RlUC0+bW9kZV0pCi0JICB7CQkJLyogdGhlcmUgaXMgYSBkaXNwbGFjZW1lbnQgKi8KLQkgICAgaWYgKGFkZHJfbW9kZVAtPm1vZGUgPT0gMjcgfHwgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPT0gMjcpCi0JICAgICAgewkJCS8qIGRvIHdlIGhhdmUgcGNyZWwuIG1vZGUgKi8KLQkJYWRkcl9tb2RlUC0+cGNyZWwgPSAxOwotCSAgICAgIH0KLQkgICAgYWRkcl9tb2RlUC0+aW1fZGlzcCA9IDE7Ci0JICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JICAgICAgewotCQlzdWZmaXhfc3ViID0gc3VmZml4ID0gMDsKLQkJaWYgKHRvUCA9IGFkZHJfbW9kZVAtPmRpc3BbaV0pCi0JCSAgewkJLyogc3VmZml4IG9mIGV4cHJlc3Npb24sIHRoZSBsYXJnZXN0IHNpemUKLQkJCQkgICBydWxlcyAqLwotCQkgICAgZnJvbVAgPSB0b1A7Ci0JCSAgICB3aGlsZSAoYyA9ICpmcm9tUCsrKQotCQkgICAgICB7Ci0JCQkqdG9QKysgPSBjOwotCQkJaWYgKGMgPT0gJzonKQotCQkJICB7Ci0JCQkgICAgc3dpdGNoICgqZnJvbVApCi0JCQkgICAgICB7Ci0JCQkgICAgICBjYXNlICdcMCc6Ci0JCQkJYXNfd2FybiAoXygiUHJlbWF0dXJlIGVuZCBvZiBzdWZmaXggLS0gRGVmYXVsdGluZyB0byBkIikpOwotCQkJCXN1ZmZpeCA9IDQ7Ci0JCQkJY29udGludWU7Ci0JCQkgICAgICBjYXNlICdiJzoKLQkJCQlzdWZmaXhfc3ViID0gMTsKLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgJ3cnOgotCQkJCXN1ZmZpeF9zdWIgPSAyOwotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAnZCc6Ci0JCQkJc3VmZml4X3N1YiA9IDQ7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBkZWZhdWx0OgotCQkJCWFzX3dhcm4gKF8oIkJhZCBzdWZmaXggYWZ0ZXIgJzonIHVzZSB7Ynx3fGR9IERlZmF1bHRpbmcgdG8gZCIpKTsKLQkJCQlzdWZmaXggPSA0OwotCQkJICAgICAgfQotCQkJICAgIGZyb21QKys7Ci0JCQkgICAgdG9QLS07CS8qIFNvIHdlIHdyaXRlIG92ZXIgdGhlICc6JyAqLwotCQkJICAgIGlmIChzdWZmaXggPCBzdWZmaXhfc3ViKQotCQkJICAgICAgc3VmZml4ID0gc3VmZml4X3N1YjsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICAqdG9QID0gJ1wwJzsvKiB0ZXJtaW5hdGUgcHJvcGVybHkgKi8KLQkJICAgIGFkZHJfbW9kZVAtPmRpc3Bfc3VmZml4W2ldID0gc3VmZml4OwotCQkgICAgYWRkcl9tb2RlUC0+YW1fc2l6ZSArPSBzdWZmaXggPyBzdWZmaXggOiA0OwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGFkZHJfbW9kZVAtPm1vZGUgPT0gMjApCi0JewkJCS8qIGxvb2sgaW4gbnMzMmtfb3Bjb2RlIGZvciBzaXplICovCi0JICBhZGRyX21vZGVQLT5kaXNwX3N1ZmZpeFswXSA9IGFkZHJfbW9kZVAtPmFtX3NpemUgPSBkZXNjLT5pbV9zaXplOwotCSAgYWRkcl9tb2RlUC0+aW1fZGlzcCA9IDA7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGFkZHJfbW9kZVAtPm1vZGU7Ci19Ci0KLQotLyogcmVhZCBhbiBvcHRpb25saXN0ICovCi12b2lkCi1vcHRsaXN0IChzdHIsIG9wdGlvblAsIGRlZmF1bHRfbWFwKQotICAgICBjaGFyICpzdHI7CQkJLyogdGhlIHN0cmluZyB0byBleHRyYWN0IG9wdGlvbnMgZnJvbSAqLwotICAgICBzdHJ1Y3QgbnMzMmtfb3B0aW9uICpvcHRpb25QOwkvKiBob3cgdG8gc2VhcmNoIHRoZSBzdHJpbmcgKi8KLSAgICAgdW5zaWduZWQgbG9uZyAqZGVmYXVsdF9tYXA7CS8qIGRlZmF1bHQgcGF0dGVybiBhbmQgb3V0cHV0ICovCi17Ci0gIHJlZ2lzdGVyIGludCBpLCBqLCBrLCBzdHJsZW4xLCBzdHJsZW4yOwotICByZWdpc3RlciBjaGFyICpwYXR0ZXJuUCwgKnN0clA7Ci0gIHN0cmxlbjEgPSBzdHJsZW4gKHN0cik7Ci0gIGlmIChzdHJsZW4xIDwgMSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiVmVyeSBzaG9ydCBpbnN0ciB0byBvcHRpb24sIGllIHlvdSBjYW4ndCBkbyBpdCBvbiBhIE5VTExzdHIiKSk7Ci0gICAgfQotICBmb3IgKGkgPSAwOyBvcHRpb25QW2ldLnBhdHRlcm4gIT0gMDsgaSsrKQotICAgIHsKLSAgICAgIHN0cmxlbjIgPSBzdHJsZW4gKG9wdGlvblBbaV0ucGF0dGVybik7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgc3RybGVuMTsgaisrKQotCXsKLQkgIHBhdHRlcm5QID0gb3B0aW9uUFtpXS5wYXR0ZXJuOwotCSAgc3RyUCA9ICZzdHJbal07Ci0JICBmb3IgKGsgPSAwOyBrIDwgc3RybGVuMjsgaysrKQotCSAgICB7Ci0JICAgICAgaWYgKCooc3RyUCsrKSAhPSAqKHBhdHRlcm5QKyspKQotCQlicmVhazsKLQkgICAgfQotCSAgaWYgKGsgPT0gc3RybGVuMikKLQkgICAgewkJCS8qIG1hdGNoICovCi0JICAgICAgKmRlZmF1bHRfbWFwIHw9IG9wdGlvblBbaV0ub3I7Ci0JICAgICAgKmRlZmF1bHRfbWFwICY9IG9wdGlvblBbaV0uYW5kOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogc2VhcmNoIHN0cnVjdCBmb3Igc3ltYm9scwotICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgc2hvcnQgaW50ZWdlciBmb3JtIG9mIHJlZyBuYW1lcyBpbgotICAgdGhlIGluc3RydWN0aW9ucyBsbXIsIHNtciwgbHByLCBzcHIgcmV0dXJuIHRydWUgaWYgc3RyIGlzIGZvdW5kIGluCi0gICBsaXN0ICovCi0KLWludAotbGlzdF9zZWFyY2ggKHN0ciwgb3B0aW9uUCwgZGVmYXVsdF9tYXApCi0gICAgIGNoYXIgKnN0cjsJCQkJLyogdGhlIHN0cmluZyB0byBtYXRjaCAqLwotICAgICBzdHJ1Y3QgbnMzMmtfb3B0aW9uICpvcHRpb25QOwkvKiBsaXN0IHRvIHNlYXJjaCAqLwotICAgICB1bnNpZ25lZCBsb25nICpkZWZhdWx0X21hcDsJLyogZGVmYXVsdCBwYXR0ZXJuIGFuZCBvdXRwdXQgKi8KLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGZvciAoaSA9IDA7IG9wdGlvblBbaV0ucGF0dGVybiAhPSAwOyBpKyspCi0gICAgewotICAgICAgaWYgKCFzdHJuY21wIChvcHRpb25QW2ldLnBhdHRlcm4sIHN0ciwgMjApKQotCXsJCQkJLyogdXNlIHN0cm5jbXAgdG8gYmUgc2FmZSAqLwotCSAgKmRlZmF1bHRfbWFwIHw9IG9wdGlvblBbaV0ub3I7Ci0JICAqZGVmYXVsdF9tYXAgJj0gb3B0aW9uUFtpXS5hbmQ7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLSAgYXNfd2FybiAoXygiTm8gc3VjaCBlbnRyeSBpbiBsaXN0LiAoY3B1L21tdSByZWdpc3RlcikiKSk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotZXZhbHVhdGVfZXhwciAocmVzdWx0UCwgcHRyKQotICAgICBleHByZXNzaW9uUyAqcmVzdWx0UDsKLSAgICAgY2hhciAqcHRyOwotewotICByZWdpc3RlciBjaGFyICp0bXBfbGluZTsKLQotICB0bXBfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gcHRyOwotICBleHByZXNzaW9uICgmZXhwclApOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0bXBfbGluZTsKLX0KLQwKLS8qIENvbnZlcnQgb3BlcmFuZHMgdG8gaWlmLWZvcm1hdCBhbmQgYWRkcyBiaXRmaWVsZHMgdG8gdGhlIG9wY29kZS4KLSAgIE9wZXJhbmRzIGFyZSBwYXJzZWQgaW4gc3VjaCBhbiBvcmRlciB0aGF0IHRoZSBvcGNvZGUgaXMgdXBkYXRlZCBmcm9tCi0gICBpdHMgbW9zdCBzaWduaWZpY2FudCBiaXQsIHRoYXQgaXMgd2hlbiB0aGUgb3BlcmFuZCBuZWVkIHRvIGFsdGVyIHRoZQotICAgb3Bjb2RlLgotICAgQmUgY2FyZWZ1bGwgbm90IHRvIHB1dCB0byBvYmplY3RzIGluIHRoZSBzYW1lIGlpZi1zbG90LgotICAgKi8KLQotdm9pZAotZW5jb2RlX29wZXJhbmQgKGFyZ2MsIGFyZ3YsIG9wZXJhbmRzUCwgc3VmZml4UCwgaW1fc2l6ZSwgb3Bjb2RlX2JpdF9wdHIpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLSAgICAgY2hhciAqb3BlcmFuZHNQOwotICAgICBjaGFyICpzdWZmaXhQOwotICAgICBjaGFyIGltX3NpemU7Ci0gICAgIGNoYXIgb3Bjb2RlX2JpdF9wdHI7Ci17Ci0gIHJlZ2lzdGVyIGludCBpLCBqOwotICBjaGFyIGQ7Ci0gIGludCBwY3JlbCwgdG1wLCBiLCBsb29wLCBwY3JlbF9hZGp1c3Q7Ci0gIGZvciAobG9vcCA9IDA7IGxvb3AgPCBhcmdjOyBsb29wKyspCi0gICAgewotICAgICAgaSA9IG9wZXJhbmRzUFtsb29wIDw8IDFdIC0gJzEnOwkvKiB3aGF0IG9wZXJhbmQgYXJlIHdlIHN1cHBvc2VkCi0JCQkJCSAgIHRvIHdvcmsgb24gKi8KLSAgICAgIGlmIChpID4gMykKLQlhc19mYXRhbCAoXygiSW50ZXJuYWwgY29uc2lzdGVuY3kgZXJyb3IuICBjaGVjayBuczMyay1vcGNvZGUuaCIpKTsKLSAgICAgIHBjcmVsID0gMDsKLSAgICAgIHBjcmVsX2FkanVzdCA9IDA7Ci0gICAgICB0bXAgPSAwOwotICAgICAgc3dpdGNoICgoZCA9IG9wZXJhbmRzUFsobG9vcCA8PCAxKSArIDFdKSkKLQl7Ci0JY2FzZSAnZic6CQkvKiBvcGVyYW5kIG9mIHNmc3IgdHVybnMgb3V0IHRvIGJlIGEgbmFzdHkKLQkJCQkgICBzcGVjaWFsY2FzZSAqLwotCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNTsKLQljYXNlICdaJzoJCS8qIGZsb2F0IG5vdCBpbW1lZGlhdGUgKi8KLQljYXNlICdGJzoJCS8qIDMyIGJpdCBmbG9hdAlnZW5lcmFsIGZvcm0gKi8KLQljYXNlICdMJzoJCS8qIDY0IGJpdCBmbG9hdAkqLwotCWNhc2UgJ0knOgkJLyogaW50ZWdlciBub3QgaW1tZWRpYXRlICovCi0JY2FzZSAnQic6CQkvKiBieXRlCSAqLwotCWNhc2UgJ1cnOgkJLyogd29yZAkgKi8KLQljYXNlICdEJzoJCS8qIGRvdWJsZS13b3JkCSovCi0JY2FzZSAnQSc6CQkvKiBkb3VibGUtd29yZAlnZW4tYWRkcmVzcy1mb3JtIGllIG5vIHJlZ3MKLQkJCQkgICBhbGxvd2VkICovCi0JICBnZXRfYWRkcl9tb2RlIChhcmd2W2ldLCAmYWRkcl9tb2RlUCk7Ci0JICBpZigoYWRkcl9tb2RlUC5tb2RlID09IDIwKSAmJgotCSAgICAgKGQgPT0gJ0knIHx8IGQgPT0gJ1onIHx8IGQgPT0gJ0EnKSkgewotCSAgICBhc19mYXRhbChkID09ICdBJz8gXygiQWRkcmVzcyBvZiBpbW1lZGlhdGUgb3BlcmFuZCIpOgotCQkgICAgIF8oIkludmFsaWQgaW1tZWRpYXRlIHdyaXRlIG9wZXJhbmQuIikpOwotCSAgfQotCi0JICBpZiAob3Bjb2RlX2JpdF9wdHIgPT0gZGVzYy0+b3Bjb2RlX3NpemUpCi0JICAgIGIgPSA0OwotCSAgZWxzZQotCSAgICBiID0gNjsKLQkgIGZvciAoaiA9IGI7IGogPCAoYiArIDIpOyBqKyspCi0JICAgIHsKLQkgICAgICBpZiAoYWRkcl9tb2RlUC5kaXNwW2ogLSBiXSkKLQkJewotCQkgIElJRiAoaiwKLQkJICAgICAgIDIsCi0JCSAgICAgICBhZGRyX21vZGVQLmRpc3Bfc3VmZml4W2ogLSBiXSwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyX21vZGVQLmRpc3BbaiAtIGJdLAotCQkgICAgICAgMCwKLQkJICAgICAgIGFkZHJfbW9kZVAucGNyZWwsCi0JCSAgICAgICBpaWYuaW5zdHJfc2l6ZSwKLQkJICAgICAgIGFkZHJfbW9kZVAuaW1fZGlzcCwKLQkJICAgICAgIElORCAoQlJBTkNILCBCWVRFKSwKLQkJICAgICAgIE5VTEwsCi0JCSAgICAgICAoYWRkcl9tb2RlUC5zY2FsZWRfcmVnID8gYWRkcl9tb2RlUC5zY2FsZWRfbW9kZQotCQkJOiBhZGRyX21vZGVQLm1vZGUpLAotCQkgICAgICAgMCk7Ci0JCX0KLQkgICAgfQotCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNTsKLQkgIGlpZi5paWZQWzFdLm9iamVjdCB8PSAoKGxvbmcpIGFkZHJfbW9kZVAubW9kZSkgPDwgb3Bjb2RlX2JpdF9wdHI7Ci0JICBpZiAoYWRkcl9tb2RlUC5zY2FsZWRfcmVnKQotCSAgICB7Ci0JICAgICAgaiA9IGIgLyAyOwotCSAgICAgIElJRiAoaiwgMSwgMSwgKHVuc2lnbmVkIGxvbmcpIGFkZHJfbW9kZVAuaW5kZXhfYnl0ZSwKLQkJICAgMCwgMCwgMCwgMCwgMCwgTlVMTCwgLTEsIDApOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdiJzoJCS8qIG11bHRpcGxlIGluc3RydWN0aW9uIGRpc3AgKi8KLQkgIGZyZWVwdHIrKzsJCS8qIE9WRTp0aGlzIGlzIGFuIHVzZWZ1bCBoYWNrICovCi0JICBzcHJpbnRmIChmcmVlcHRyLCAiKCglcy0xKSolZClcMDAwIiwgYXJndltpXSwgZGVzYy0+aW1fc2l6ZSk7Ci0JICBhcmd2W2ldID0gZnJlZXB0cjsKLQkgIHBjcmVsIC09IDE7CQkvKiBtYWtlIHBjcmVsIDAgaW5zcGl0ZSBvZiB3aGF0IGNhc2UgJ3AnOgotCQkJCSAgIHdhbnRzICovCi0JICAvKiBmYWxsIHRocnUgKi8KLQljYXNlICdwJzoJCS8qIGRpc3BsYWNlbWVudCAtIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcgKi8KLQkgIHBjcmVsICs9IDE7Ci0JICAvKiBmYWxsIHRocnUgKi8KLQljYXNlICdkJzoJCS8qIGRpc3BsYWNlbWVudCAqLwotCSAgaWlmLmluc3RyX3NpemUgKz0gc3VmZml4UFtpXSA/IHN1ZmZpeFBbaV0gOiA0OwotCSAgSUlGICgxMiwgMiwgc3VmZml4UFtpXSwgKHVuc2lnbmVkIGxvbmcpIGFyZ3ZbaV0sIDAsCi0JICAgICAgIHBjcmVsLCBwY3JlbF9hZGp1c3QsIDEsIElORCAoQlJBTkNILCBCWVRFKSwgTlVMTCwgLTEsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSAnSCc6CQkvKiBzZXF1ZW50LWhhY2s6IHRoZSBsaW5rZXIgd2FudHMgYSBiaXQgc2V0Ci0JCQkJICAgd2hlbiBic3IgKi8KLQkgIHBjcmVsID0gMTsKLQkgIGlpZi5pbnN0cl9zaXplICs9IHN1ZmZpeFBbaV0gPyBzdWZmaXhQW2ldIDogNDsKLQkgIElJRiAoMTIsIDIsIHN1ZmZpeFBbaV0sICh1bnNpZ25lZCBsb25nKSBhcmd2W2ldLCAwLAotCSAgICAgICBwY3JlbCwgcGNyZWxfYWRqdXN0LCAxLCBJTkQgKEJSQU5DSCwgQllURSksIE5VTEwsIC0xLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3EnOgkJLyogcXVpY2sgKi8KLQkgIG9wY29kZV9iaXRfcHRyIC09IDQ7Ci0JICBJSUYgKDExLCAyLCA0MiwgKHVuc2lnbmVkIGxvbmcpIGFyZ3ZbaV0sIDAsIDAsIDAsIDAsIDAsCi0JICAgICAgIGJpdF9maXhfbmV3ICg0LCBvcGNvZGVfYml0X3B0ciwgLTgsIDcsIDAsIDEsIDApLCAtMSwgMCk7Ci0JICBicmVhazsKLQljYXNlICdyJzoJCS8qIHJlZ2lzdGVyIG51bWJlciAoMyBiaXRzKSAqLwotCSAgbGlzdF9zZWFyY2ggKGFyZ3ZbaV0sIG9wdDYsICZ0bXApOwotCSAgb3Bjb2RlX2JpdF9wdHIgLT0gMzsKLQkgIGlpZi5paWZQWzFdLm9iamVjdCB8PSB0bXAgPDwgb3Bjb2RlX2JpdF9wdHI7Ci0JICBicmVhazsKLQljYXNlICdPJzoJCS8qIHNldGNmZyBpbnN0cnVjdGlvbiBvcHRpb25zbGlzdCAqLwotCSAgb3B0bGlzdCAoYXJndltpXSwgb3B0MywgJnRtcCk7Ci0JICBvcGNvZGVfYml0X3B0ciAtPSA0OwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCAxNTsKLQkgIGJyZWFrOwotCWNhc2UgJ0MnOgkJLyogY2ludiBpbnN0cnVjdGlvbiBvcHRpb25zbGlzdCAqLwotCSAgb3B0bGlzdCAoYXJndltpXSwgb3B0NCwgJnRtcCk7Ci0JICBvcGNvZGVfYml0X3B0ciAtPSA0OwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCAxNTsgLyogaW5zZXJ0IHRoZSByZWd0eXBlIGluIG9wY29kZSAqLwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6CQkvKiBzdHJpbmdpbnN0cnVjdGlvbiBvcHRpb25zbGlzdCAqLwotCSAgb3B0bGlzdCAoYXJndltpXSwgb3B0NSwgJnRtcCk7Ci0JICBvcGNvZGVfYml0X3B0ciAtPSA0OwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCAxNTsKLQkgIGJyZWFrOwotCWNhc2UgJ3UnOgotCWNhc2UgJ1UnOgkJLyogcmVnaXN0ZXJsaXN0ICovCi0JICBJSUYgKDEwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCBOVUxMLCAtMSwgMCk7Ci0JICBzd2l0Y2ggKG9wZXJhbmRzUFsoaSA8PCAxKSArIDFdKQotCSAgICB7Ci0JICAgIGNhc2UgJ3UnOgkJLyogcmVzdG9yZSwgZXhpdCAqLwotCSAgICAgIG9wdGxpc3QgKGFyZ3ZbaV0sIG9wdDEsICZpaWYuaWlmUFsxMF0ub2JqZWN0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnVSc6CQkvKiBzYXZlLGVudGVyICovCi0JICAgICAgb3B0bGlzdCAoYXJndltpXSwgb3B0MiwgJmlpZi5paWZQWzEwXS5vYmplY3QpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpaWYuaW5zdHJfc2l6ZSArPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnTSc6CQkvKiBtbXUgcmVnaXN0ZXIgKi8KLQkgIGxpc3Rfc2VhcmNoIChhcmd2W2ldLCBtbXVyZWcsICZ0bXApOwotCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNDsKLQkgIGlpZi5paWZQWzFdLm9iamVjdCB8PSB0bXAgPDwgb3Bjb2RlX2JpdF9wdHI7Ci0JICBicmVhazsKLQljYXNlICdQJzoJCS8qIGNwdSByZWdpc3RlciAgKi8KLQkgIGxpc3Rfc2VhcmNoIChhcmd2W2ldLCBjcHVyZWcsICZ0bXApOwotCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNDsKLQkgIGlpZi5paWZQWzFdLm9iamVjdCB8PSB0bXAgPDwgb3Bjb2RlX2JpdF9wdHI7Ci0JICBicmVhazsKLQljYXNlICdnJzoJCS8qIGluc3MgZXh0cyAqLwotCSAgaWlmLmluc3RyX3NpemUgKz0gMTsJLyogMSBieXRlIGlzIGFsbG9jYXRlZCBhZnRlciB0aGUgb3Bjb2RlICovCi0JICBJSUYgKDEwLCAyLCAxLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgYXJndltpXSwJLyogaSBhbHdheXMgMiBoZXJlICovCi0JICAgICAgIDAsIDAsIDAsIDAsIDAsCi0JICAgICAgIGJpdF9maXhfbmV3ICgzLCA1LCAwLCA3LCAwLCAwLCAwKSwgLyogYSBiaXRfZml4IGlzIHRhcmdldGVkIHRvCi0JCQkJCQkgICAgIHRoZSBieXRlICovCi0JICAgICAgIC0xLCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0cnOgotCSAgSUlGICgxMSwgMiwgNDIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBhcmd2W2ldLAkvKiBpIGFsd2F5cyAzIGhlcmUgKi8KLQkgICAgICAgMCwgMCwgMCwgMCwgMCwKLQkgICAgICAgYml0X2ZpeF9uZXcgKDUsIDAsIDEsIDMyLCAtMSwgMCwgLTEpLCAtMSwgMCk7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIGlpZi5pbnN0cl9zaXplICs9IDE7Ci0JICBiID0gMiArIGk7CQkvKiBwdXQgdGhlIGV4dGVuc2lvbiBieXRlIGFmdGVyIG9wY29kZSAqLwotCSAgSUlGIChiLCAyLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtMSwgMCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfZmF0YWwgKF8oIkJhZCBvcGNvZGUtdGFibGUtb3B0aW9uLCBjaGVjayBpbiBmaWxlIG5zMzJrLW9wY29kZS5oIikpOwotCX0KLSAgICB9Ci19Ci0MCi0vKiBpbjogIGluc3RydWN0aW9uIGxpbmUKLSAgIG91dDogaW50ZXJuYWwgc3RydWN0dXJlIG9mIGluc3RydWN0aW9uCi0gICB0aGF0IGhhcyBiZWVuIHByZXBhcmVkIGZvciBkaXJlY3QgY29udmVyc2lvbiB0byBmcmFnbWVudChzKSBhbmQKLSAgIGZpeGVzIGluIGEgc3lzdGVtYXRpY2FsIGZhc2hpb24KLSAgIFJldHVybi12YWx1ZSA9IHJlY3Vyc2l2ZV9sZXZlbAotICAgKi8KLS8qIGJ1aWxkIGlpZiBvZiBvbmUgYXNzZW1ibHkgdGV4dCBsaW5lICovCi1pbnQKLXBhcnNlIChsaW5lLCByZWN1cnNpdmVfbGV2ZWwpCi0gICAgIGNoYXIgKmxpbmU7Ci0gICAgIGludCByZWN1cnNpdmVfbGV2ZWw7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKmxpbmVwdHIsIGMsIHN1ZmZpeF9zZXBhcmF0b3I7Ci0gIHJlZ2lzdGVyIGludCBpOwotICBpbnQgYXJnYywgYXJnX3R5cGU7Ci0gIGNoYXIgc3FyLCBzZXA7Ci0gIGNoYXIgc3VmZml4W01BWF9BUkdTXSwgKmFyZ3ZbTUFYX0FSR1NdOwkvKiBubyBtb3JlIHRoYW4gNCBvcGVyYW5kcyAqLwotICBpZiAocmVjdXJzaXZlX2xldmVsIDw9IDApCi0gICAgewkJCQkvKiBjYWxsZWQgZnJvbSBtZF9hc3NlbWJsZSAqLwotICAgICAgZm9yIChsaW5lcHRyID0gbGluZTsgKCpsaW5lcHRyKSAhPSAnXDAnICYmICgqbGluZXB0cikgIT0gJyAnOyBsaW5lcHRyKyspOwotICAgICAgYyA9ICpsaW5lcHRyOwotICAgICAgKmxpbmVwdHIgPSAnXDAnOwotICAgICAgaWYgKCEoZGVzYyA9IChzdHJ1Y3QgbnMzMmtfb3Bjb2RlICopIGhhc2hfZmluZCAoaW5zdF9oYXNoX2hhbmRsZSwgbGluZSkpKQotCXsKLQkgIGFzX2ZhdGFsIChfKCJObyBzdWNoIG9wY29kZSIpKTsKLQl9Ci0gICAgICAqbGluZXB0ciA9IGM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGluZXB0ciA9IGxpbmU7Ci0gICAgfQotICBhcmdjID0gMDsKLSAgaWYgKCpkZXNjLT5vcGVyYW5kcykKLSAgICB7Ci0gICAgICBpZiAoKmxpbmVwdHIrKyAhPSAnXDAnKQotCXsKLQkgIHNxciA9ICdbJzsKLQkgIHNlcCA9ICcsJzsKLQkgIHdoaWxlICgqbGluZXB0ciAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgaWYgKGRlc2MtPm9wZXJhbmRzW2FyZ2MgPDwgMV0pCi0JCXsKLQkJICBzdWZmaXhbYXJnY10gPSAwOwotCQkgIGFyZ190eXBlID0gZGVzYy0+b3BlcmFuZHNbKGFyZ2MgPDwgMSkgKyAxXTsKLQkJICBzd2l0Y2ggKGFyZ190eXBlKQotCQkgICAgewotCQkgICAgY2FzZSAnZCc6Ci0JCSAgICBjYXNlICdiJzoKLQkJICAgIGNhc2UgJ3AnOgotCQkgICAgY2FzZSAnSCc6CS8qIHRoZSBvcGVyYW5kIGlzIHN1cHBvc2VkIHRvIGJlIGEKLQkJCQkgICBkaXNwbGFjZW1lbnQgKi8KLQkJICAgICAgLyogSGFja3dhcm5pbmc6IGRvIG5vdCBmb3JnZXQgdG8gdXBkYXRlIHRoZSA0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY2FzZXMgYWJvdmUgd2hlbiBlZGl0aW5nIG5zMzJrLW9wY29kZS5oICovCi0JCSAgICAgIHN1ZmZpeF9zZXBhcmF0b3IgPSAnOic7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgc3VmZml4X3NlcGFyYXRvciA9ICdcMjU1JzsgLyogaWYgdGhpcyBjaGFyIG9jY3VycyB3ZQotCQkJCQkJICAgIGxvb3NlICovCi0JCSAgICB9Ci0JCSAgc3VmZml4W2FyZ2NdID0gMDsgLyogMCB3aGVuIG5vICc6JyBpcyBlbmNvdW50ZXJlZCAqLwotCQkgIGFyZ3ZbYXJnY10gPSBmcmVlcHRyOwotCQkgICpmcmVlcHRyID0gJ1wwJzsKLQkJICB3aGlsZSAoKGMgPSAqbGluZXB0cikgIT0gJ1wwJyAmJiBjICE9IHNlcCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGMgPT0gc3FyKQotCQkJewotCQkJICBpZiAoc3FyID09ICdbJykKLQkJCSAgICB7Ci0JCQkgICAgICBzcXIgPSAnXSc7Ci0JCQkgICAgICBzZXAgPSAnXDAnOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIHNxciA9ICdbJzsKLQkJCSAgICAgIHNlcCA9ICcsJzsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGlmIChjID09IHN1ZmZpeF9zZXBhcmF0b3IpCi0JCQl7CS8qICc6JyAtIGxhYmVsL3N1ZmZpeCBzZXBhcmF0b3IgKi8KLQkJCSAgc3dpdGNoIChsaW5lcHRyWzFdKQotCQkJICAgIHsKLQkJCSAgICBjYXNlICdiJzoKLQkJCSAgICAgIHN1ZmZpeFthcmdjXSA9IDE7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlICd3JzoKLQkJCSAgICAgIHN1ZmZpeFthcmdjXSA9IDI7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlICdkJzoKLQkJCSAgICAgIHN1ZmZpeFthcmdjXSA9IDQ7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBkZWZhdWx0OgotCQkJICAgICAgYXNfd2FybiAoXygiQmFkIHN1ZmZpeCwgZGVmYXVsdGluZyB0byBkIikpOwotCQkJICAgICAgc3VmZml4W2FyZ2NdID0gNDsKLQkJCSAgICAgIGlmIChsaW5lcHRyWzFdID09ICdcMCcgfHwgbGluZXB0clsxXSA9PSBzZXApCi0JCQkJewotCQkJCSAgbGluZXB0ciArPSAxOwotCQkJCSAgY29udGludWU7Ci0JCQkJfQotCQkJICAgIH0KLQkJCSAgbGluZXB0ciArPSAyOwotCQkJICBjb250aW51ZTsKLQkJCX0KLQkJICAgICAgKmZyZWVwdHIrKyA9IGM7Ci0JCSAgICAgIGxpbmVwdHIrKzsKLQkJICAgIH0KLQkJICAqZnJlZXB0cisrID0gJ1wwJzsKLQkJICBhcmdjICs9IDE7Ci0JCSAgaWYgKCpsaW5lcHRyID09ICdcMCcpCi0JCSAgICBjb250aW51ZTsKLQkJICBsaW5lcHRyICs9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc19mYXRhbCAoXygiVG9vIG1hbnkgb3BlcmFuZHMgcGFzc2VkIHRvIGluc3RydWN0aW9uIikpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAoYXJnYyAhPSBzdHJsZW4gKGRlc2MtPm9wZXJhbmRzKSAvIDIpCi0gICAgewotICAgICAgaWYgKHN0cmxlbiAoZGVzYy0+ZGVmYXVsdF9hcmdzKSkKLQl7CQkJLyogd2UgY2FuIGFwcGx5IGRlZmF1bHQsIGRvbnQgZ29vZiAqLwotCSAgaWYgKHBhcnNlIChkZXNjLT5kZWZhdWx0X2FyZ3MsIDEpICE9IDEpCi0JICAgIHsJCQkvKiBjaGVjayBlcnJvciBpbiBkZWZhdWx0ICovCi0JICAgICAgYXNfZmF0YWwgKF8oIldyb25nIG51bWJlcnMgb2Ygb3BlcmFuZHMgaW4gZGVmYXVsdCwgY2hlY2sgbnMzMmstb3Bjb2Rlcy5oIikpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2ZhdGFsIChfKCJXcm9uZyBudW1iZXIgb2Ygb3BlcmFuZHMiKSk7Ci0JfQotCi0gICAgfQotICBmb3IgKGkgPSAwOyBpIDwgSUlGX0VOVFJJRVM7IGkrKykKLSAgICB7Ci0gICAgICBpaWYuaWlmUFtpXS50eXBlID0gMDsJLyogbWFyayBhbGwgZW50cmllcyBhcyB2b2lkKi8KLSAgICB9Ci0KLSAgLyogYnVpbGQgb3Bjb2RlIGlpZi1lbnRyeSAqLwotICBpaWYuaW5zdHJfc2l6ZSA9IGRlc2MtPm9wY29kZV9zaXplIC8gODsKLSAgSUlGICgxLCAxLCBpaWYuaW5zdHJfc2l6ZSwgZGVzYy0+b3Bjb2RlX3NlZWQsIDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAwKTsKLQotICAvKiB0aGlzIGNhbGwgZW5jb2RlcyBvcGVyYW5kcyB0byBpaWYgZm9ybWF0ICovCi0gIGlmIChhcmdjKQotICAgIHsKLSAgICAgIGVuY29kZV9vcGVyYW5kIChhcmdjLAotCQkgICAgICBhcmd2LAotCQkgICAgICAmZGVzYy0+b3BlcmFuZHNbMF0sCi0JCSAgICAgICZzdWZmaXhbMF0sCi0JCSAgICAgIGRlc2MtPmltX3NpemUsCi0JCSAgICAgIGRlc2MtPm9wY29kZV9zaXplKTsKLSAgICB9Ci0gIHJldHVybiByZWN1cnNpdmVfbGV2ZWw7Ci19Ci0MCi0KLS8qIENvbnZlcnQgaWlmIHRvIGZyYWdtZW50cy4gIEZyb20gdGhpcyBwb2ludCB3ZSBzdGFydCB0byBkcmliYmxlIHdpdGgKLSAqIGZ1bmN0aW9ucyBpbiBvdGhlciBmaWxlcyB0aGFuIHRoaXMgb25lLihFeGNlcHQgaGFzaC5jKSBTbywgaWYgaXQncwotICogcG9zc2libGUgdG8gbWFrZSBhbiBpaWYgZm9yIGFuIG90aGVyIENQVSwgeW91IGRvbid0IG5lZWQgdG8ga25vdwotICogd2hhdCBmcmFncywgcmVsYXgsIG9ic3RhY2tzLCBldGMgaXMgaW4gb3JkZXIgdG8gcG9ydCB0aGlzCi0gKiBhc3NlbWJsZXIuIFlvdSBvbmx5IG5lZWQgdG8ga25vdyBpZiBpdCdzIHBvc3NpYmxlIHRvIHJlZHVjZSB5b3VyCi0gKiBjcHUtaW5zdHJ1Y3Rpb24gdG8gaWlmLWZvcm1hdCAodGFrZXMgc29tZSB3b3JrKSBhbmQgYWRvcHQgdGhlIG90aGVyCi0gKiBtZF8/IHBhcnRzIGFjY29yZGluZyB0byBnaXZlbiBpbnN0cnVjdGlvbnMgTm90ZSB0aGF0IGlpZiB3YXMKLSAqIGludmVudGVkIGZvciB0aGUgY2xlYW4gbnMzMmtgcyBhcmNoaXRlY3VyZS4KLSAqLwotCi0vKiBHQVMgZm9yIHRoZSBuczMyayBoYXMgYSBwcm9ibGVtLiBQQyByZWxhdGl2ZSBkaXNwbGFjZW1lbnRzIGFyZQotICogcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9wY29kZSwgbm90IHRoZSBhZGRyZXNzIG9mIHRoZQotICogb3BlcmFuZC4gV2UgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgb3BlcmFuZAotICogYW5kIHRoZSBvcGNvZGUgaW4gcGNyZWxfYWRqdXN0IGZvciBlYWNoIGZyYWcgYW5kIGVhY2ggZml4LiBIb3dldmVyLAotICogd2UgZ2V0IGludG8gdHJvdWJsZSB3aGVyZSB0aGVyZSBhcmUgdHdvIG9yIG1vcmUgcGMtcmVsYXRpdmUKLSAqIG9wZXJhbmRzIGFuZCB0aGUgc2l6ZSBvZiB0aGUgZmlyc3Qgb25lIGNhbid0IGJlIGRldGVybWluZWQuIFRoZW4gaW4KLSAqIHRoZSByZWxheCBwaGFzZSwgdGhlIHNpemUgb2YgdGhlIGZpcnN0IG9wZXJhbmQgd2lsbCBjaGFuZ2UgYW5kCi0gKiBwY3JlbF9hZGp1c3Qgd2lsbCBubyBsb25nZXIgYmUgY29ycmVjdC4gIFRoZSBjdXJyZW50IHNvbHV0aW9uIGlzCi0gKiBrZWVwIGEgcG9pbnRlciB0byB0aGUgZnJhZyB3aXRoIHRoZSBvcGNvZGUgaW4gaXQgYW5kIHRoZSBvZmZzZXQgaW4KLSAqIHRoYXQgZnJhZyBmb3IgZWFjaCBmcmFnIGFuZCBlYWNoIGZpeC4gVGhlbiwgd2hlbiBuZWVkZWQsIHdlIGNhbgotICogYWx3YXlzIGZpZ3VyZSBvdXQgaG93IGZhciBpdCBpcyBiZXR3ZWVuIHRoZSBvcGNvZGUgYW5kIHRoZSBwY3JlbAotICogb2JqZWN0LiAgU2VlIGFsc28gbWRfcGNyZWxfYWRqdXN0IGFuZCBtZF9maXhfcGNyZWxfYWRqdXN0LiAgRm9yCi0gKiBvYmplY3RzIG5vdCBwYXJ0IG9mIGFuIGluc3RydWN0aW9uLCB0aGUgcG9pbnRlciB0byB0aGUgb3Bjb2RlIGZyYWcKLSAqIGlzIGFsd2F5cyB6ZXJvLiAgKi8KLQotdm9pZAotY29udmVydF9paWYgKCkKLXsKLSAgaW50IGk7Ci0gIGJpdF9maXhTICpqOwotICBmcmFnUyAqaW5zdF9mcmFnOwotICB1bnNpZ25lZCBpbnQgaW5zdF9vZmZzZXQ7Ci0gIGNoYXIgKmluc3Rfb3Bjb2RlOwotICBjaGFyICptZW1QOwotICBpbnQgbDsKLSAgaW50IGs7Ci0gIGNoYXIgdHlwZTsKLSAgY2hhciBzaXplID0gMDsKLSAgaW50IHNpemVfc29fZmFyOwotCi0gIG1lbVAgPSBmcmFnX21vcmUgKDApOwotICBpbnN0X29wY29kZSA9IG1lbVA7Ci0gIGluc3Rfb2Zmc2V0ID0gKG1lbVAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCk7Ci0gIGluc3RfZnJhZyA9IGZyYWdfbm93OwotCi0gIGZvciAoaSA9IDA7IGkgPCBJSUZfRU5UUklFUzsgaSsrKQotICAgIHsKLSAgICAgIGlmICh0eXBlID0gaWlmLmlpZlBbaV0udHlwZSkKLQl7CQkJLyogdGhlIG9iamVjdCBleGlzdCwgc28gaGFuZGxlIGl0ICovCi0JICBzd2l0Y2ggKHNpemUgPSBpaWYuaWlmUFtpXS5zaXplKQotCSAgICB7Ci0JICAgIGNhc2UgNDI6Ci0JICAgICAgc2l6ZSA9IDA7CQkvKiBpdCdzIGEgYml0Zml4IHRoYXQgb3BlcmF0ZXMgb24gYW4gZXhpc3RpbmcKLQkJCQkgICBvYmplY3QqLwotCSAgICAgIGlmIChpaWYuaWlmUFtpXS5iaXRfZml4UC0+ZnhfYml0X2Jhc2UpCi0JCXsJCS8qIGV4cGFuZCBmeF9iaXRfYmFzZSB0byBwb2ludCBhdCBvcGNvZGUgKi8KLQkJICBpaWYuaWlmUFtpXS5iaXRfZml4UC0+ZnhfYml0X2Jhc2UgPSAobG9uZykgaW5zdF9vcGNvZGU7Ci0JCX0KLQkgICAgY2FzZSA4OgkJLyogYmlnbnVtIG9yIGRvdWJsZWZsb2F0ICovCi0JICAgIGNhc2UgMToKLQkgICAgY2FzZSAyOgotCSAgICBjYXNlIDM6Ci0JICAgIGNhc2UgNDoJCS8qIHRoZSBmaW5hbCBzaXplIGluIG9iamVjdG1lbW9yeSBpcyBrbm93biAqLwotCSAgICAgIG1lbVAgPSBmcmFnX21vcmUoc2l6ZSk7Ci0JICAgICAgaiA9IGlpZi5paWZQW2ldLmJpdF9maXhQOwotCSAgICAgIHN3aXRjaCAodHlwZSkKLQkJewotCQljYXNlIDE6CS8qIHRoZSBvYmplY3QgaXMgcHVyZSBiaW5hcnkgKi8KLQkJICBpZiAoaiB8fCBpaWYuaWlmUFtpXS5wY3JlbCkKLQkJICAgIHsKLQkJICAgICAgZml4X25ld19uczMyayAoZnJhZ19ub3csCi0JCQkJICAgICAobG9uZykgKG1lbVAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCksCi0JCQkJICAgICBzaXplLAotCQkJCSAgICAgMCwKLQkJCQkgICAgIGlpZi5paWZQW2ldLm9iamVjdCwKLQkJCQkgICAgIGlpZi5paWZQW2ldLnBjcmVsLAotCQkJCSAgICAgaWlmLmlpZlBbaV0uaW1fZGlzcCwKLQkJCQkgICAgIGosCi0JCQkJICAgICBpaWYuaWlmUFtpXS5ic3IsCS8qIHNlcXVlbnQgaGFjayAqLwotCQkJCSAgICAgaW5zdF9mcmFnLCBpbnN0X29mZnNldCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewkJLyogZ29vZCwganVzdCBwdXQgdGhlbSBieXRlcyBvdXQgKi8KLQkJICAgICAgc3dpdGNoIChpaWYuaWlmUFtpXS5pbV9kaXNwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKG1lbVAsIGlpZi5paWZQW2ldLm9iamVjdCwgc2l6ZSk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAxOgotCQkJICBtZF9udW1iZXJfdG9fZGlzcCAobWVtUCwgaWlmLmlpZlBbaV0ub2JqZWN0LCBzaXplKTsKLQkJCSAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICBhc19mYXRhbCAoXygiaWlmIGNvbnZlcnQgaW50ZXJuYWwgcGNyZWwvYmluYXJ5IikpOwotCQkJfQotCQkgICAgfQotCQkgIGJyZWFrOwotCQljYXNlIDI6Ci0JCSAgLyogdGhlIG9iamVjdCBpcyBhIHBvaW50ZXIgYXQgYW4gZXhwcmVzc2lvbiwgc28KLSAgICAgICAgICAgICAgICAgICAgIHVucGFjayBpdCwgbm90ZSB0aGF0IGJpZ251bXMgbWF5IHJlc3VsdCBmcm9tIHRoZQotICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiAqLwotCQkgIGV2YWx1YXRlX2V4cHIgKCZleHByUCwgKGNoYXIgKikgaWlmLmlpZlBbaV0ub2JqZWN0KTsKLQkJICBpZiAoZXhwclAuWF9vcCA9PSBPX2JpZyB8fCBzaXplID09IDgpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgoayA9IGV4cHJQLlhfYWRkX251bWJlcikgPiAwKQotCQkJewotCQkJICAvKiB3ZSBoYXZlIGEgYmlnbnVtIGllIGEgcXVhZC4gVGhpcyBjYW4gb25seQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXBwZW5zIGluIGEgbG9uZyBzdWZmaXhlZCBpbnN0cnVjdGlvbiAqLwotCQkJICBpZiAoayAqIDIgPiBzaXplKQotCQkJICAgIGFzX3dhcm4gKF8oIkJpZ251bSB0b28gYmlnIGZvciBsb25nIikpOwotCQkJICBpZiAoayA9PSAzKQotCQkJICAgIG1lbVAgKz0gMjsKLQkJCSAgZm9yIChsID0gMDsgayA+IDA7IGstLSwgbCArPSAyKQotCQkJICAgIHsKLQkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAobWVtUCArIGwsCi0JCQkJCQkgIGdlbmVyaWNfYmlnbnVtW2wgPj4gMV0sCi0JCQkJCQkgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsJLyogZmxvbnVtICovCi0JCQkgIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotCi0JCQkgIHN3aXRjaCAoc2l6ZSkKLQkJCSAgICB7Ci0JCQkgICAgY2FzZSA0OgotCQkJICAgICAgZ2VuX3RvX3dvcmRzICh3b3JkcywgMiwgOCk7Ci0JCQkgICAgICBtZF9udW1iZXJfdG9faW1tIChtZW1QLCAobG9uZykgd29yZHNbMF0sCi0JCQkJCQlzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JCQkgICAgICBtZF9udW1iZXJfdG9faW1tIChtZW1QICsgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSksCi0JCQkJCQkobG9uZykgd29yZHNbMV0sCi0JCQkJCQlzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlIDg6Ci0JCQkgICAgICBnZW5fdG9fd29yZHMgKHdvcmRzLCA0LCAxMSk7Ci0JCQkgICAgICBtZF9udW1iZXJfdG9faW1tIChtZW1QLCAobG9uZykgd29yZHNbMF0sCi0JCQkJCQlzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JCQkgICAgICBtZF9udW1iZXJfdG9faW1tIChtZW1QICsgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSksCi0JCQkJCQkobG9uZykgd29yZHNbMV0sCi0JCQkJCQlzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JCQkgICAgICBtZF9udW1iZXJfdG9faW1tICgobWVtUCArIDIKLQkJCQkJCSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKSwKLQkJCQkJCShsb25nKSB3b3Jkc1syXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKChtZW1QICsgMwotCQkJCQkJICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpLAotCQkJCQkJKGxvbmcpIHdvcmRzWzNdLAotCQkJCQkJc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBpZiAoaiB8fAotCQkgICAgICBleHByUC5YX2FkZF9zeW1ib2wgfHwKLQkJICAgICAgZXhwclAuWF9vcF9zeW1ib2wgfHwKLQkJICAgICAgaWlmLmlpZlBbaV0ucGNyZWwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBleHByZXNzaW9uIHdhcyB1bmRlZmluZWQgZHVlIHRvIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkIGxhYmVsLiBDcmVhdGUgYSBmaXggc28gd2UgY2FuIGZpeAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvYmplY3QgbGF0ZXIuICovCi0JCSAgICAgIGV4cHJQLlhfYWRkX251bWJlciArPSBpaWYuaWlmUFtpXS5vYmplY3RfYWRqdXN0OwotCQkgICAgICBmaXhfbmV3X25zMzJrX2V4cCAoZnJhZ19ub3csCi0JCQkJCSAobG9uZykgKG1lbVAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCksCi0JCQkJCSBzaXplLAotCQkJCQkgJmV4cHJQLAotCQkJCQkgaWlmLmlpZlBbaV0ucGNyZWwsCi0JCQkJCSBpaWYuaWlmUFtpXS5pbV9kaXNwLAotCQkJCQkgaiwKLQkJCQkJIGlpZi5paWZQW2ldLmJzciwKLQkJCQkJIGluc3RfZnJhZywgaW5zdF9vZmZzZXQpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogZ29vZCwganVzdCBwdXQgdGhlbSBieXRlcyBvdXQgKi8KLQkJICAgICAgc3dpdGNoIChpaWYuaWlmUFtpXS5pbV9kaXNwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBtZF9udW1iZXJfdG9faW1tIChtZW1QLCBleHByUC5YX2FkZF9udW1iZXIsIHNpemUpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMToKLQkJCSAgbWRfbnVtYmVyX3RvX2Rpc3AgKG1lbVAsIGV4cHJQLlhfYWRkX251bWJlciwgc2l6ZSk7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgYXNfZmF0YWwgKF8oImlpZiBjb252ZXJ0IGludGVybmFsIHBjcmVsL3BvaW50ZXIiKSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYXNfZmF0YWwgKF8oIkludGVybmFsIGxvZ2ljIGVycm9yIGluIGlpZi5paWZQW25dLnR5cGUiKSk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAwOgotCSAgICAgIC8qIFRvIGJhZCwgdGhlIG9iamVjdCBtYXkgYmUgdW5kZWZpbmVkIGFzIGZhciBhcyBpdHMKLQkJIGZpbmFsIG5zaXplIGluIG9iamVjdCBtZW1vcnkgaXMgY29uY2VybmVkLiAgVGhlIHNpemUKLQkJIG9mIHRoZSBvYmplY3QgaW4gb2JqZWN0bWVtb3J5IGlzIG5vdCBleHBsaWNpdGx5Ci0JCSBnaXZlbi4gIElmIHRoZSBvYmplY3QgaXMgZGVmaW5lZCBpdHMgbGVuZ3RoIGNhbiBiZQotCQkgZGV0ZXJtaW5lZCBhbmQgYSBmaXggY2FuIHJlcGxhY2UgdGhlIGZyYWcuICovCi0JICAgICAgewotCQlldmFsdWF0ZV9leHByICgmZXhwclAsIChjaGFyICopIGlpZi5paWZQW2ldLm9iamVjdCk7Ci0JCWlmICgoZXhwclAuWF9hZGRfc3ltYm9sIHx8IGV4cHJQLlhfb3Bfc3ltYm9sKSAmJgotCQkgICAgIWlpZi5paWZQW2ldLnBjcmVsKQotCQkgIHsKLQkJICAgIC8qIFNpemUgaXMgdW5rbm93biB1bnRpbCBsaW5rIHRpbWUgc28gaGF2ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICBhbGxvdyA0IGJ5dGVzLiAqLwotCQkgICAgc2l6ZSA9IDQ7Ci0JCSAgICBtZW1QID0gZnJhZ19tb3JlKHNpemUpOwotCQkgICAgZml4X25ld19uczMya19leHAgKGZyYWdfbm93LAotCQkJCSAgICAgICAobG9uZykgKG1lbVAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCksCi0JCQkJICAgICAgIHNpemUsCi0JCQkJICAgICAgICZleHByUCwKLQkJCQkgICAgICAgMCwgLyogbmV2ZXIgaWlmLmlpZlBbaV0ucGNyZWwsICovCi0JCQkJICAgICAgIDEsIC8qIGFsd2F5cyBpaWYuaWlmUFtpXS5pbV9kaXNwICovCi0JCQkJICAgICAgIChiaXRfZml4UyAqKSAwLCAwLAotCQkJCSAgICAgICBpbnN0X2ZyYWcsCi0JCQkJICAgICAgIGluc3Rfb2Zmc2V0KTsKLQkJICAgIGJyZWFrOwkJLyogZXhpdCB0aGlzIGFic29sdXRlIGhhY2sgKi8KLQkJICB9Ci0KLQkJaWYgKGV4cHJQLlhfYWRkX3N5bWJvbCB8fCBleHByUC5YX29wX3N5bWJvbCkKLQkJICB7CQkJLyogZnJhZyBpdCAqLwotCQkgICAgaWYgKGV4cHJQLlhfb3Bfc3ltYm9sKQotCQkgICAgICB7CQkJLyogV2UgY2FudCByZWxheCB0aGlzIGNhc2UgKi8KLQkJCWFzX2ZhdGFsIChfKCJDYW4ndCByZWxheCBkaWZmZXJlbmNlIikpOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQotCQkJLyogU2l6ZSBpcyBub3QgaW1wb3J0YW50LiBUaGlzIGdldHMgZml4ZWQgYnkgcmVsYXgsCi0JCQkgKiBidXQgd2UgYXNzdW1lIDAgaW4gd2hhdCBmb2xsb3dzCi0JCQkgKi8KLQkJCW1lbVAgPSBmcmFnX21vcmUoNCk7IC8qIE1heCBzaXplICovCi0JCQlzaXplID0gMDsKLQotCQkJewotCQkJICBmcmFnUyAqb2xkX2ZyYWcgPSBmcmFnX25vdzsKLQkJCSAgZnJhZ192YXJpYW50IChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJCQkJNCwgLyogTWF4IHNpemUgKi8KLQkJCQkJMCwgLyogc2l6ZSAqLwotCQkJCQlJTkQgKEJSQU5DSCwgVU5ERUYpLCAvKiBleHBlY3RpbmcgdGhlIHdvcnN0ICovCi0JCQkJCWV4cHJQLlhfYWRkX3N5bWJvbCwKLQkJCQkJZXhwclAuWF9hZGRfbnVtYmVyLAotCQkJCQlpbnN0X29wY29kZSk7Ci0JCQkgIGZyYWdfb3Bjb2RlX2ZyYWcob2xkX2ZyYWcpID0gaW5zdF9mcmFnOwotCQkJICBmcmFnX29wY29kZV9vZmZzZXQob2xkX2ZyYWcpID0gaW5zdF9vZmZzZXQ7Ci0JCQkgIGZyYWdfYnNyKG9sZF9mcmFnKSA9IGlpZi5paWZQW2ldLmJzcjsKLQkJCX0KLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIFRoaXMgZHVwbGljYXRlcyBjb2RlIGluIG1kX251bWJlcl90b19kaXNwICovCi0JCSAgICBpZiAoLTY0IDw9IGV4cHJQLlhfYWRkX251bWJlciAmJiBleHByUC5YX2FkZF9udW1iZXIgPD0gNjMpCi0JCSAgICAgIHsKLQkJCXNpemUgPSAxOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWlmICgtODE5MiA8PSBleHByUC5YX2FkZF9udW1iZXIKLQkJCSAgICAmJiBleHByUC5YX2FkZF9udW1iZXIgPD0gODE5MSkKLQkJCSAgewotCQkJICAgIHNpemUgPSAyOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBpZiAoLTB4MjAwMDAwMDA8PWV4cHJQLlhfYWRkX251bWJlciAmJgotCQkJCWV4cHJQLlhfYWRkX251bWJlcjw9MHgxZmZmZmZmZikKLQkJCSAgICAgIHsKLQkJCQlzaXplID0gNDsKLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlCi0JCQkgICAgICB7Ci0JCQkJYXNfd2FybiAoXygiRGlzcGxhY2VtZW50IHRvIGxhcmdlIGZvciA6ZCIpKTsKLQkJCQlzaXplID0gNDsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBtZW1QID0gZnJhZ19tb3JlKHNpemUpOwotCQkgICAgbWRfbnVtYmVyX3RvX2Rpc3AgKG1lbVAsIGV4cHJQLlhfYWRkX251bWJlciwgc2l6ZSk7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19mYXRhbCAoXygiSW50ZXJuYWwgbG9naWMgZXJyb3IgaW4gaWlmLmlpZlBbXS50eXBlIikpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0vKiBUaGlzIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIHJlYWxseSBiZSBpbiB0aGUgYmZkIGxpYnJhcnkgKi8KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLXJlbG9jIChpbnQgc2l6ZSwgaW50IHBjcmVsLCBpbnQgdHlwZSkKLXsKLSAgaW50IGxlbmd0aCwgaW5kZXg7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvY3NbXSA9IHsKLSAgICBCRkRfUkVMT0NfTlMzMktfSU1NXzgsCi0gICAgQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwKLSAgICBCRkRfUkVMT0NfTlMzMktfSU1NXzMyLAotICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwKLSAgICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLAotICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwsCi0KLSAgICAvKiBuczMyayBkaXNwbGFjZW1lbnRzICovCi0gICAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwKLSAgICBCRkRfUkVMT0NfTlMzMktfRElTUF8xNiwKLSAgICBCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwKLSAgICBCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLAotICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2X1BDUkVMLAotICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyX1BDUkVMLAotCi0gICAgLyogTm9ybWFsIDIncyBjb21wbGVtZW50ICovCi0gICAgQkZEX1JFTE9DXzgsCi0gICAgQkZEX1JFTE9DXzE2LAotICAgIEJGRF9SRUxPQ18zMiwKLSAgICBCRkRfUkVMT0NfOF9QQ1JFTCwKLSAgICBCRkRfUkVMT0NfMTZfUENSRUwsCi0gICAgQkZEX1JFTE9DXzMyX1BDUkVMCi0gICAgfTsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBsZW5ndGggPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbGVuZ3RoID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGxlbmd0aCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgbGVuZ3RoID0gLTE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGluZGV4ID0gbGVuZ3RoICsgMyAqIHBjcmVsICsgNiAqIHR5cGU7Ci0gIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZW9mKHJlbG9jcykvc2l6ZW9mKHJlbG9jc1swXSkpCi0gICAgcmV0dXJuIHJlbG9jc1tpbmRleF07Ci0gIGlmIChwY3JlbCkKLSAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIGZvciBzdG9yYWdlIHR5cGUgJWQiKSwKLQkgICAgc2l6ZSwgdHlwZSk7Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIGZvciBzdG9yYWdlIHR5cGUgJWQiKSwKLQkgICAgc2l6ZSwgdHlwZSk7Ci0gIHJldHVybiBCRkRfUkVMT0NfTk9ORTsKLQotfQotCi0jZW5kaWYKLQotdm9pZAotbWRfYXNzZW1ibGUgKGxpbmUpCi0gICAgIGNoYXIgKmxpbmU7Ci17Ci0gIGZyZWVwdHIgPSBmcmVlcHRyX3N0YXRpYzsKLSAgcGFyc2UgKGxpbmUsIDApOwkJLyogZXhwbG9kZSBsaW5lIHRvIG1vcmUgZml4IGZvcm0gaW4gaWlmICovCi0gIGNvbnZlcnRfaWlmICgpOwkJLyogY29udmVydCBpaWYgdG8gZnJhZ3MsIGZpeCdzIGV0YyAqLwotI2lmZGVmIFNIT1dfTlVNCi0gIHByaW50ZiAoIiBcdFx0XHQlc1xuIiwgbGluZSk7Ci0jZW5kaWYKLX0KLQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICAvKiBidWlsZCBhIGhhc2h0YWJsZSBvZiB0aGUgaW5zdHJ1Y3Rpb25zICovCi0gIGNvbnN0IHN0cnVjdCBuczMya19vcGNvZGUgKnB0cjsKLSAgY29uc3QgY2hhciAqc3RhdDsKLSAgaW5zdF9oYXNoX2hhbmRsZSA9IGhhc2hfbmV3ICgpOwotICBmb3IgKHB0ciA9IG5zMzJrX29wY29kZXM7IHB0ciA8IGVuZG9wOyBwdHIrKykKLSAgICB7Ci0gICAgICBpZiAoKHN0YXQgPSBoYXNoX2luc2VydCAoaW5zdF9oYXNoX2hhbmRsZSwgcHRyLT5uYW1lLCAoY2hhciAqKSBwdHIpKSkKLQl7Ci0JICBhc19mYXRhbCAoXygiQ2FuJ3QgaGFzaCAlczogJXMiKSwgcHRyLT5uYW1lLCBzdGF0KTsJLypmYXRhbCovCi0JfQotICAgIH0KLSAgZnJlZXB0cl9zdGF0aWMgPSAoY2hhciAqKSBtYWxsb2MgKFBSSVZBVEVfU0laRSk7IC8qIHNvbWUgcHJpdmF0ZSBzcGFjZQotCQkJCQkJICAgICAgcGxlYXNlISAqLwotfQotCi0vKiBNdXN0IGJlIGVxdWFsIHRvIE1BWF9QUkVDSVNPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IGxpdFAgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBvZiB0eXBlIHR5cGUsIGFuZCBlbWl0IHRoZSBhcHByb3ByaWF0ZSBieXRlcy4gIFRoZSBudW1iZXIgb2YKLSAgIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqLS13b3JkUCksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQwKLS8qIENvbnZlcnQgbnVtYmVyIHRvIGNoYXJzIGluIGNvcnJlY3Qgb3JkZXIgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCBuYnl0ZXMpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbHVlOwotICAgICBpbnQgbmJ5dGVzOwotewotICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbHVlLCBuYnl0ZXMpOwotfQotCi0KLS8qIFRoaXMgaXMgYSB2YXJpYW50IG9mIG1kX251bWJlcnNfdG9fY2hhcnMuIFRoZSByZWFzb24gZm9yIGl0cycKLSAgIGV4aXN0ZW5jZSBpcyB0aGUgZmFjdCB0aGF0IG5zMzJrIHVzZXMgSHVmZm1hbiBjb2RlZAotICAgZGlzcGxhY2VtZW50cy4gVGhpcyBpbXBsaWVzIHRoYXQgdGhlIGJpdCBvcmRlciBpcyByZXZlcnNlZCBpbgotICAgZGlzcGxhY2VtZW50cyBhbmQgdGhhdCB0aGV5IGFyZSBwcmVmaXhlZCB3aXRoIGEgc2l6ZS10YWcuCi0KLSAgIGJpbmFyeTogbXNiIC0+IGxzYgotICAgMHh4eHh4eHgJCQkJYnl0ZQotICAgMTB4eHh4eHggeHh4eHh4eHgJCQl3b3JkCi0gICAxMXh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eAlkb3VibGUgd29yZAotCi0gICBUaGlzIG11c3QgYmUgdGFrZW4gY2FyZSBvZiBhbmQgd2UgZG8gaXQgaGVyZSEgICovCi1zdGF0aWMgdm9pZAotbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotICAgICBjaGFyIG47Ci17Ci0gIHN3aXRjaCAobikKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgKHZhbCA8IC02NCB8fCB2YWwgPiA2MykKLQlhc193YXJuIChfKCJCeXRlIGRpc3BsYWNlbWVudCBvdXQgb2YgcmFuZ2UuICBsaW5lIG51bWJlciBub3QgdmFsaWQiKSk7Ci0gICAgICB2YWwgJj0gMHg3ZjsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGlmICh2YWwgPCAtODE5MiB8fCB2YWwgPiA4MTkxKQotCWFzX3dhcm4gKF8oIldvcmQgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZS4gIGxpbmUgbnVtYmVyIG5vdCB2YWxpZCIpKTsKLSAgICAgIHZhbCAmPSAweDNmZmY7Ci0gICAgICB2YWwgfD0gMHg4MDAwOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gOCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaWYgKHZhbCA8IC0weDIwMDAwMDAwIHx8IHZhbCA+PSAweDIwMDAwMDAwKQotCWFzX3dhcm4gKF8oIkRvdWJsZSB3b3JkIGRpc3BsYWNlbWVudCBvdXQgb2YgcmFuZ2UiKSk7Ci0gICAgICB2YWwgfD0gMHhjMDAwMDAwMDsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDI0ICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gMTYgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiA4ICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oIkludGVybmFsIGxvZ2ljIGVycm9yLiAgbGluZSAlcywgZmlsZSBcIiVzXCIiKSwKLQkJX19MSU5FX18sIF9fRklMRV9fKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1tZF9udW1iZXJfdG9faW1tIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICBsb25nIHZhbDsKLSAgICAgY2hhciBuOwotewotICBzd2l0Y2ggKG4pCi0gICAgewotICAgIGNhc2UgMToKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDggJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDI0ICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gMTYgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiA4ICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oIkludGVybmFsIGxvZ2ljIGVycm9yLiBsaW5lICVzLCBmaWxlIFwiJXNcIiIpLAotCQlfX0xJTkVfXywgX19GSUxFX18pOwotICAgIH0KLX0KLQotCi0vKiBmYXN0IGJpdGZpZGRsaW5nIHN1cHBvcnQgKi8KLS8qIG1hc2sgdXNlZCB0byB6ZXJvIGJpdGZpZWxkIGJlZm9yZSBvcmluZyBpbiB0aGUgdHJ1ZSBmaWVsZCAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsX21hc2tbXSA9Ci17Ci0gIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmUsIDB4ZmZmZmZmZmMsIDB4ZmZmZmZmZjgsCi0gIDB4ZmZmZmZmZjAsIDB4ZmZmZmZmZTAsIDB4ZmZmZmZmYzAsIDB4ZmZmZmZmODAsCi0gIDB4ZmZmZmZmMDAsIDB4ZmZmZmZlMDAsIDB4ZmZmZmZjMDAsIDB4ZmZmZmY4MDAsCi0gIDB4ZmZmZmYwMDAsIDB4ZmZmZmUwMDAsIDB4ZmZmZmMwMDAsIDB4ZmZmZjgwMDAsCi0gIDB4ZmZmZjAwMDAsIDB4ZmZmZTAwMDAsIDB4ZmZmYzAwMDAsIDB4ZmZmODAwMDAsCi0gIDB4ZmZmMDAwMDAsIDB4ZmZlMDAwMDAsIDB4ZmZjMDAwMDAsIDB4ZmY4MDAwMDAsCi0gIDB4ZmYwMDAwMDAsIDB4ZmUwMDAwMDAsIDB4ZmMwMDAwMDAsIDB4ZjgwMDAwMDAsCi0gIDB4ZjAwMDAwMDAsIDB4ZTAwMDAwMDAsIDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsCi19Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgcl9tYXNrW10gPQotewotICAweDAwMDAwMDAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAzLCAweDAwMDAwMDA3LAotICAweDAwMDAwMDBmLCAweDAwMDAwMDFmLCAweDAwMDAwMDNmLCAweDAwMDAwMDdmLAotICAweDAwMDAwMGZmLCAweDAwMDAwMWZmLCAweDAwMDAwM2ZmLCAweDAwMDAwN2ZmLAotICAweDAwMDAwZmZmLCAweDAwMDAxZmZmLCAweDAwMDAzZmZmLCAweDAwMDA3ZmZmLAotICAweDAwMDBmZmZmLCAweDAwMDFmZmZmLCAweDAwMDNmZmZmLCAweDAwMDdmZmZmLAotICAweDAwMGZmZmZmLCAweDAwMWZmZmZmLCAweDAwM2ZmZmZmLCAweDAwN2ZmZmZmLAotICAweDAwZmZmZmZmLCAweDAxZmZmZmZmLCAweDAzZmZmZmZmLCAweDA3ZmZmZmZmLAotICAweDBmZmZmZmZmLCAweDFmZmZmZmZmLCAweDNmZmZmZmZmLCAweDdmZmZmZmZmLAotfTsKLSNkZWZpbmUgTUFTS19CSVRTIDMxCi0vKiBJbnNlcnQgYml0ZmllbGQgZGVzY3JpYmVkIGJ5IGZpZWxkX3B0ciBhbmQgdmFsIGF0IGJ1ZgotICAgVGhpcyByb3V0aW5lIGlzIHdyaXR0ZW4gZm9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgZmlyc3QgNCBieXRlcyBwb2ludGVkCi0gICB0byBieSBidWYsIHRvIHlpZWxkIHNwZWVkLgotICAgVGhlIGlmZGVmIHN0dWZmIGlzIGZvciBzZWxlY3Rpb24gYmV0d2VlbiBhIG5zMzJrLWRlcGVuZGVudCByb3V0aW5lCi0gICBhbmQgYSBnZW5lcmFsIHZlcnNpb24uIChNeSBhZHZpY2U6IHVzZSB0aGUgZ2VuZXJhbCB2ZXJzaW9uISkKLSAgICovCi0KLXN0YXRpYyB2b2lkCi1tZF9udW1iZXJfdG9fZmllbGQgKGJ1ZiwgdmFsLCBmaWVsZF9wdHIpCi0gICAgIHJlZ2lzdGVyIGNoYXIgKmJ1ZjsKLSAgICAgcmVnaXN0ZXIgbG9uZyB2YWw7Ci0gICAgIHJlZ2lzdGVyIGJpdF9maXhTICpmaWVsZF9wdHI7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgb2JqZWN0OwotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG1hc2s7Ci0gIC8qIGRlZmluZSBFTkRJQU4gb24gYSBuczMyayBtYWNoaW5lICovCi0jaWZkZWYgRU5ESUFOCi0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgKm1lbV9wdHI7Ci0jZWxzZQotICByZWdpc3RlciBjaGFyICptZW1fcHRyOwotI2VuZGlmCi0gIGlmIChmaWVsZF9wdHItPmZ4X2JpdF9taW4gPD0gdmFsICYmIHZhbCA8PSBmaWVsZF9wdHItPmZ4X2JpdF9tYXgpCi0gICAgewotI2lmZGVmIEVORElBTgotICAgICAgaWYgKGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2UpCi0JewkJCS8qIG92ZXJyaWRlIGJ1ZiAqLwotCSAgbWVtX3B0ciA9ICh1bnNpZ25lZCBsb25nICopIGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lbV9wdHIgPSAodW5zaWduZWQgbG9uZyAqKSBidWY7Ci0JfQotICAgICAgbWVtX3B0ciA9ICgodW5zaWduZWQgbG9uZyAqKQotCQkgKChjaGFyICopIG1lbV9wdHIgKyBmaWVsZF9wdHItPmZ4X2JpdF9iYXNlX2FkaikpOwotI2Vsc2UKLSAgICAgIGlmIChmaWVsZF9wdHItPmZ4X2JpdF9iYXNlKQotCXsJCQkvKiBvdmVycmlkZSBidWYgKi8KLQkgIG1lbV9wdHIgPSAoY2hhciAqKSBmaWVsZF9wdHItPmZ4X2JpdF9iYXNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1fcHRyID0gYnVmOwotCX0KLSAgICAgIG1lbV9wdHIgKz0gZmllbGRfcHRyLT5meF9iaXRfYmFzZV9hZGo7Ci0jZW5kaWYKLSNpZmRlZiBFTkRJQU4JCQkvKiB3ZSBoYXZlIGEgbmljZSBuczMyayBtYWNoaW5lIHdpdGggbG93Ynl0ZQotCQkJCSAgIGF0IGxvdy1waHlzaWNhbCBtZW0gKi8KLSAgICAgIG9iamVjdCA9ICptZW1fcHRyOwkvKiBnZXQgc29tZSBieXRlcyAqLwotI2Vsc2UgLyogT1ZFIEdvb2YhIHRoZSBtYWNoaW5lIGlzIGEgbTY4ayBvciBkaXRvICovCi0gICAgICAvKiBUaGF0IHRha2VzIG1vcmUgYnl0ZSBmaWRkbGluZyAqLwotICAgICAgb2JqZWN0ID0gMDsKLSAgICAgIG9iamVjdCB8PSBtZW1fcHRyWzNdICYgMHhmZjsKLSAgICAgIG9iamVjdCA8PD0gODsKLSAgICAgIG9iamVjdCB8PSBtZW1fcHRyWzJdICYgMHhmZjsKLSAgICAgIG9iamVjdCA8PD0gODsKLSAgICAgIG9iamVjdCB8PSBtZW1fcHRyWzFdICYgMHhmZjsKLSAgICAgIG9iamVjdCA8PD0gODsKLSAgICAgIG9iamVjdCB8PSBtZW1fcHRyWzBdICYgMHhmZjsKLSNlbmRpZgotICAgICAgbWFzayA9IDA7Ci0gICAgICBtYXNrIHw9IChyX21hc2tbZmllbGRfcHRyLT5meF9iaXRfb2Zmc2V0XSk7Ci0gICAgICBtYXNrIHw9IChsX21hc2tbZmllbGRfcHRyLT5meF9iaXRfb2Zmc2V0ICsgZmllbGRfcHRyLT5meF9iaXRfc2l6ZV0pOwotICAgICAgb2JqZWN0ICY9IG1hc2s7Ci0gICAgICB2YWwgKz0gZmllbGRfcHRyLT5meF9iaXRfYWRkOwotICAgICAgb2JqZWN0IHw9ICgodmFsIDw8IGZpZWxkX3B0ci0+ZnhfYml0X29mZnNldCkgJiAobWFzayBeIDB4ZmZmZmZmZmYpKTsKLSNpZmRlZiBFTkRJQU4KLSAgICAgICptZW1fcHRyID0gb2JqZWN0OwotI2Vsc2UKLSAgICAgIG1lbV9wdHJbMF0gPSAoY2hhcikgb2JqZWN0OwotICAgICAgb2JqZWN0ID4+PSA4OwotICAgICAgbWVtX3B0clsxXSA9IChjaGFyKSBvYmplY3Q7Ci0gICAgICBvYmplY3QgPj49IDg7Ci0gICAgICBtZW1fcHRyWzJdID0gKGNoYXIpIG9iamVjdDsKLSAgICAgIG9iamVjdCA+Pj0gODsKLSAgICAgIG1lbV9wdHJbM10gPSAoY2hhcikgb2JqZWN0OwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQml0IGZpZWxkIG91dCBvZiByYW5nZSIpKTsKLSAgICB9Ci19Ci0KLWludCBtZF9wY3JlbF9hZGp1c3QgKGZyYWdTICpmcmFnUCkKLXsKLSAgZnJhZ1MgKm9wY29kZV9mcmFnOwotICBhZGRyZXNzVCBvcGNvZGVfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IG9mZnNldDsKLSAgb3Bjb2RlX2ZyYWcgPSBmcmFnX29wY29kZV9mcmFnKGZyYWdQKTsKLSAgaWYgKG9wY29kZV9mcmFnID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIG9mZnNldCA9IGZyYWdfb3Bjb2RlX29mZnNldChmcmFnUCk7Ci0gIG9wY29kZV9hZGRyZXNzID0gb2Zmc2V0ICsgb3Bjb2RlX2ZyYWctPmZyX2FkZHJlc3M7Ci0gIHJldHVybiBmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXggLSBvcGNvZGVfYWRkcmVzczsKLX0KLQotaW50IG1kX2ZpeF9wY3JlbF9hZGp1c3QgKGZpeFMgKmZpeFApCi17Ci0gIGZyYWdTICpmcmFnUCA9IGZpeFAtPmZ4X2ZyYWc7Ci0gIGZyYWdTICpvcGNvZGVfZnJhZzsKLSAgYWRkcmVzc1Qgb3Bjb2RlX2FkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0gIG9wY29kZV9mcmFnID0gZml4X29wY29kZV9mcmFnKGZpeFApOwotICBpZiAob3Bjb2RlX2ZyYWcgPT0gMCkKLSAgICByZXR1cm4gMDsKLSAgb2Zmc2V0ID0gZml4X29wY29kZV9vZmZzZXQoZml4UCk7Ci0gIG9wY29kZV9hZGRyZXNzID0gb2Zmc2V0ICsgb3Bjb2RlX2ZyYWctPmZyX2FkZHJlc3M7Ci0gIHJldHVybiBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgLSBvcGNvZGVfYWRkcmVzczsKLX0KLQotLyogQXBwbHkgYSBmaXhTIChmaXh1cCBvZiBhbiBpbnN0cnVjdGlvbiBvciBkYXRhIHRoYXQgd2UgZGlkbid0IGhhdmUKLSAgIGVub3VnaCBpbmZvIHRvIGNvbXBsZXRlIGltbWVkaWF0ZWx5KSB0byB0aGUgZGF0YSBpbiBhIGZyYWcuCi0KLSAgIE9uIHRoZSBuczMyaywgZXZlcnl0aGluZyBpcyBpbiBhIGRpZmZlcmVudCBmb3JtYXQsIHNvIHdlIGhhdmUgYnJva2VuCi0gICBvdXQgc2VwYXJhdGUgZnVuY3Rpb25zIGZvciBlYWNoIGtpbmQgb2YgdGhpbmcgd2UgY291bGQgYmUgZml4aW5nLgotICAgVGhleSBhbGwgZ2V0IGNhbGxlZCBmcm9tIGhlcmUuICAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbHApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFscDsKLSNlbHNlCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci0jZW5kaWYKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGxvbmcgdmFsID0gKnZhbHA7Ci0jZW5kaWYKLSAgZnJhZ1MgKmZyYWdQID0gZml4UC0+ZnhfZnJhZzsKLQotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0KLSAgaWYgKGZpeF9iaXRfZml4UChmaXhQKSkKLSAgICB7CQkJCS8qIEJpdGZpZWxkcyB0byBmaXgsIHNpZ2ggKi8KLSAgICAgIG1kX251bWJlcl90b19maWVsZCAoYnVmLCB2YWwsIGZpeF9iaXRfZml4UChmaXhQKSk7Ci0gICAgfQotICBlbHNlCi0gICAgc3dpdGNoIChmaXhfaW1fZGlzcChmaXhQKSkKLSAgICAgIHsKLQotICAgICAgY2FzZSAwOgkJCS8qIEltbWVkaWF0ZSBmaWVsZCAqLwotCW1kX251bWJlcl90b19pbW0gKGJ1ZiwgdmFsLCBmaXhQLT5meF9zaXplKTsKLQlicmVhazsKLQotICAgICAgY2FzZSAxOgkJCS8qIERpc3BsYWNlbWVudCBmaWVsZCAqLwotCS8qIENhbGN1bGF0ZSBvZmZzZXQgKi8KLQl7Ci0JbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZiwKLQkJCSAgIChmaXhQLT5meF9wY3JlbCA/IHZhbCArIG1kX2ZpeF9wY3JlbF9hZGp1c3QoZml4UCkKLQkJCSAgICA6IHZhbCksIGZpeFAtPmZ4X3NpemUpOwotCX0KLQlicmVhazsKLQotICAgICAgY2FzZSAyOgkJCS8qIFBvaW50ZXIgaW4gYSBkYXRhIG9iamVjdCAqLwotCW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIGZpeFAtPmZ4X3NpemUpOwotCWJyZWFrOwotICAgICAgfQotI2lmZGVmIEJTRF9BU1NFTUJMRVIKLSAgcmV0dXJuIDE7Ci0jZW5kaWYKLX0KLQwKLS8qIENvbnZlcnQgYSByZWxheGVkIGRpc3BsYWNlbWVudCB0byBkaXR0byBpbiBmaW5hbCBvdXRwdXQgKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlYywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlYzsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotI2Vsc2UKLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWdUIHNlYzsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotI2VuZGlmCi17Ci0gIGxvbmcgZGlzcDsKLSAgbG9uZyBleHQgPSAwOwotCi0gIC8qIEFkZHJlc3MgaW4gZ2FzIGNvcmUgb2YgdGhlIHBsYWNlIHRvIHN0b3JlIHRoZSBkaXNwbGFjZW1lbnQuICAqLwotICByZWdpc3RlciBjaGFyICpidWZmZXJfYWRkcmVzcyA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfbGl0ZXJhbDsKLSAgLyogQWRkcmVzcyBpbiBvYmplY3QgY29kZSBvZiB0aGUgZGlzcGxhY2VtZW50LiAgKi8KLSAgaW50IG9iamVjdF9hZGRyZXNzOwotCi0gIGZyYWdTICpvcGNvZGVfZnJhZzsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIElORCAoQlJBTkNILCBCWVRFKToKLSAgICAgIGV4dCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElORCAoQlJBTkNILCBXT1JEKToKLSAgICAgIGV4dCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElORCAoQlJBTkNILCBET1VCTEUpOgotICAgICAgZXh0ID0gNDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZihleHQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAga25vdyAoZnJhZ1AtPmZyX3N5bWJvbCk7Ci0KLSAgb2JqZWN0X2FkZHJlc3MgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3M7Ci0gIC8qIFRoZSBkaXNwbGFjZW1lbnQgb2YgdGhlIGFkZHJlc3MsIGZyb20gY3VycmVudCBsb2NhdGlvbi4gICovCi0gIGRpc3AgPSAoU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsgZnJhZ1AtPmZyX29mZnNldCkgLSBvYmplY3RfYWRkcmVzczsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGRpc3AgKz0gc3ltYm9sX2dldF9mcmFnIChmcmFnUC0+ZnJfc3ltYm9sKS0+ZnJfYWRkcmVzczsKLSNlbmRpZgotICBkaXNwICs9IG1kX3BjcmVsX2FkanVzdChmcmFnUCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZmZlcl9hZGRyZXNzLCAobG9uZykgZGlzcCwgKGludCkgZXh0KTsKLSAgZnJhZ1AtPmZyX2ZpeCArPSBleHQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZXN0aW1hdGVkIHNpemUgYSB2YXJpYWJsZSBvYmplY3Qgd2lsbCBvY2N1cHksCi0gICBvbmUgY2FuIHNheSB0aGF0IHdlIHRyaWVzIHRvIGd1ZXNzIHRoZSBzaXplIG9mIHRoZSBvYmplY3RzIGJlZm9yZSB3ZQotICAgYWN0dWFsbHkga25vdyBpdCAqLwotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ21lbnQ7Ci17Ci0gIGludCBvbGRfZml4OwotICBvbGRfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBJTkQgKEJSQU5DSCwgVU5ERUYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQpCi0JewotCSAgLyogdGhlIHN5bWJvbCBoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IElORCAoQlJBTkNILCBCWVRFKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogd2UgZG9uJ3QgcmVsYXggc3ltYm9scyBkZWZpbmVkIGluIGFuIG90aGVyIHNlZ21lbnQgdGhlCi0JICAgICB0aGluZyB0byBkbyBpcyB0byBhc3N1bWUgdGhlIG9iamVjdCB3aWxsIG9jY3VweSA0IGJ5dGVzICovCi0JICBmaXhfbmV3X25zMzJrIChmcmFnUCwKLQkJCSAoaW50KSAoZnJhZ1AtPmZyX2ZpeCksCi0JCQkgNCwKLQkJCSBmcmFnUC0+ZnJfc3ltYm9sLAotCQkJIGZyYWdQLT5mcl9vZmZzZXQsCi0JCQkgMSwKLQkJCSAxLAotCQkJIDAsCi0JCQkgZnJhZ19ic3IoZnJhZ1ApLCAvKnNlcXVlbnQgaGFjayAqLwotCQkJIGZyYWdfb3Bjb2RlX2ZyYWcoZnJhZ1ApLAotCQkJIGZyYWdfb3Bjb2RlX29mZnNldChmcmFnUCkpOwotCSAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgLyogZnJhZ1AtPmZyX29wY29kZVsxXT0weGZmOyAqLwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JICBicmVhazsKLQl9Ci0gICAgY2FzZSBJTkQgKEJSQU5DSCwgQllURSk6Ci0gICAgICBmcmFnUC0+ZnJfdmFyICs9IDE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gZnJhZ1AtPmZyX3ZhciArIGZyYWdQLT5mcl9maXggLSBvbGRfZml4OwotfQotCi1pbnQgbWRfc2hvcnRfanVtcF9zaXplID0gMzsKLWludCBtZF9sb25nX2p1bXBfc2l6ZSA9IDU7Ci1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICB2YWx1ZVQgb2Zmc2V0OwotCi0gIG9mZnNldCA9IHRvX2FkZHIgLSBmcm9tX2FkZHI7Ci0gIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweEVBLCAxKTsKLSAgbWRfbnVtYmVyX3RvX2Rpc3AgKHB0ciArIDEsICh2YWx1ZVQpIG9mZnNldCwgMik7Ci19Ci0KLXZvaWQKLW1kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICB2YWx1ZVQgb2Zmc2V0OwotCi0gIG9mZnNldCA9IHRvX2FkZHIgLSBmcm9tX2FkZHI7Ci0gIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweEVBLCAxKTsKLSAgbWRfbnVtYmVyX3RvX2Rpc3AgKHB0ciArIDEsICh2YWx1ZVQpIG9mZnNldCwgNCk7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAibToiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ20nOgotICAgICAgaWYgKCFzdHJjbXAgKGFyZywgIjMyMDMyIikpCi0JewotCSAgY3B1cmVnID0gY3B1cmVnXzAzMjsKLQkgIG1tdXJlZyA9IG1tdXJlZ18wMzI7Ci0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiMzI1MzIiKSkKLQl7Ci0JICBjcHVyZWcgPSBjcHVyZWdfNTMyOwotCSAgbW11cmVnID0gbW11cmVnXzUzMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJpbnZhbGlkIGFyY2hpdGVjdHVyZSBvcHRpb24gLW0lcyIpLCBhcmcpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLU5TMzJLIG9wdGlvbnM6XG5cCi0tbTMyMDMyIHwgLW0zMjUzMglzZWxlY3QgdmFyaWFudCBvZiBOUzMySyBhcmNoaXRlY3R1cmVcbiIpKTsKLX0KLQotDAotLyoKLSAqCQkJYml0X2ZpeF9uZXcoKQotICoKLSAqIENyZWF0ZSBhIGJpdF9maXhTIGluIG9ic3RhY2sgJ25vdGVzJy4KLSAqIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gcHJvZmlsZSB0aGUgbm9ybWFsIGZpeC4gSWYgdGhlIGJpdF9maXhQIGlzIGEKLSAqIHZhbGlkIHBvaW50ZXIgKG5vdCBOVUxMKSB0aGUgYml0X2ZpeCBkYXRhIHdpbGwgYmUgdXNlZCB0byBmb3JtYXQgdGhlIGZpeC4KLSAqLwotYml0X2ZpeFMgKgotYml0X2ZpeF9uZXcgKHNpemUsIG9mZnNldCwgbWluLCBtYXgsIGFkZCwgYmFzZV90eXBlLCBiYXNlX2FkaikKLSAgICAgY2hhciBzaXplOwkJCS8qIExlbmd0aCBvZiBiaXRmaWVsZAkJKi8KLSAgICAgY2hhciBvZmZzZXQ7CQkvKiBCaXQgb2Zmc2V0IHRvIGJpdGZpZWxkCSovCi0gICAgIGxvbmcgbWluOwkJCS8qIFNpZ25leHRlbmRlZCBtaW4gZm9yIGJpdGZpZWxkICovCi0gICAgIGxvbmcgbWF4OwkJCS8qIFNpZ25leHRlbmRlZCBtYXggZm9yIGJpdGZpZWxkICovCi0gICAgIGxvbmcgYWRkOwkJCS8qIEFkZCBtYXNrLCB1c2VkIGZvciBodWZmbWFuIHByZWZpeCAqLwotICAgICBsb25nIGJhc2VfdHlwZTsJCS8qIDAgb3IgMSwgaWYgMSBpdCdzIGV4cGxvZGVkIHRvIG9wY29kZSBwdHIgKi8KLSAgICAgbG9uZyBiYXNlX2FkajsKLXsKLSAgcmVnaXN0ZXIgYml0X2ZpeFMgKmJpdF9maXhQOwotCi0gIGJpdF9maXhQID0gKGJpdF9maXhTICopIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mIChiaXRfZml4UykpOwotCi0gIGJpdF9maXhQLT5meF9iaXRfc2l6ZSA9IHNpemU7Ci0gIGJpdF9maXhQLT5meF9iaXRfb2Zmc2V0ID0gb2Zmc2V0OwotICBiaXRfZml4UC0+ZnhfYml0X2Jhc2UgPSBiYXNlX3R5cGU7Ci0gIGJpdF9maXhQLT5meF9iaXRfYmFzZV9hZGogPSBiYXNlX2FkajsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9tYXggPSBtYXg7Ci0gIGJpdF9maXhQLT5meF9iaXRfbWluID0gbWluOwotICBiaXRfZml4UC0+ZnhfYml0X2FkZCA9IGFkZDsKLQotICByZXR1cm4gKGJpdF9maXhQKTsKLX0KLQotdm9pZAotZml4X25ld19uczMyayAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsIG9mZnNldCwgcGNyZWwsCi0JICAgICAgIGltX2Rpc3AsIGJpdF9maXhQLCBic3IsIG9wY29kZV9mcmFnLCBvcGNvZGVfb2Zmc2V0KQotICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCi0gICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCi0gICAgIGludCBzaXplOwkJCS8qIDEsIDIgIG9yIDQgdXN1YWxseS4gKi8KLSAgICAgc3ltYm9sUyAqYWRkX3N5bWJvbDsJLyogWF9hZGRfc3ltYm9sLiAqLwotICAgICBsb25nIG9mZnNldDsJCS8qIFhfYWRkX251bWJlci4gKi8KLSAgICAgaW50IHBjcmVsOwkJCS8qIFRSVUUgaWYgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSAgICAgY2hhciBpbV9kaXNwOwkJLyogdHJ1ZSBpZiB0aGUgdmFsdWUgdG8gd3JpdGUgaXMgYQotCQkJCSAgIGRpc3BsYWNlbWVudCAqLwotICAgICBiaXRfZml4UyAqYml0X2ZpeFA7CS8qIHBvaW50ZXIgYXQgc3RydWN0IG9mIGJpdF9maXgncywgaWdub3JlZCBpZgotCQkJCSAgIE5VTEwgKi8KLSAgICAgY2hhciBic3I7CQkJLyogc2VxdWVudC1saW5rZXItaGFjazogMSB3aGVuIHJlbG9jb2JqZWN0IGlzCi0JCQkJICAgYSBic3IgKi8KLSAgICAgZnJhZ1MgKm9wY29kZV9mcmFnOwotICAgICB1bnNpZ25lZCBpbnQgb3Bjb2RlX29mZnNldDsKLQotewotICBmaXhTICpmaXhQID0gZml4X25ldyAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsCi0JCQlvZmZzZXQsIHBjcmVsLAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkJCWJpdF9maXhQPyBOT19SRUxPQzogcmVsb2Moc2l6ZSwgcGNyZWwsIGltX2Rpc3ApCi0jZWxzZQotCQkJTk9fUkVMT0MKLSNlbmRpZgotCQkJKTsKLQotICBmaXhfb3Bjb2RlX2ZyYWcoZml4UCkgPSBvcGNvZGVfZnJhZzsKLSAgZml4X29wY29kZV9vZmZzZXQoZml4UCkgPSBvcGNvZGVfb2Zmc2V0OwotICBmaXhfaW1fZGlzcChmaXhQKSA9IGltX2Rpc3A7Ci0gIGZpeF9ic3IoZml4UCkgPSBic3I7Ci0gIGZpeF9iaXRfZml4UChmaXhQKSA9IGJpdF9maXhQOwotfQkJCQkvKiBmaXhfbmV3X25zMzJrKCkgKi8KLQotdm9pZAotZml4X25ld19uczMya19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjcmVsLAotCQkgICBpbV9kaXNwLCBiaXRfZml4UCwgYnNyLCBvcGNvZGVfZnJhZywgb3Bjb2RlX29mZnNldCkKLSAgICAgZnJhZ1MgKmZyYWc7CQkvKiBXaGljaCBmcmFnPyAqLwotICAgICBpbnQgd2hlcmU7CQkJLyogV2hlcmUgaW4gdGhhdCBmcmFnPyAqLwotICAgICBpbnQgc2l6ZTsJCQkvKiAxLCAyICBvciA0IHVzdWFsbHkuICovCi0gICAgIGV4cHJlc3Npb25TICpleHA7CQkvKiBFeHByZXNzaW9uLiAqLwotICAgICBpbnQgcGNyZWw7CQkJLyogVFJVRSBpZiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICAgICBjaGFyIGltX2Rpc3A7CQkvKiB0cnVlIGlmIHRoZSB2YWx1ZSB0byB3cml0ZSBpcyBhCi0JCQkJICAgZGlzcGxhY2VtZW50ICovCi0gICAgIGJpdF9maXhTICpiaXRfZml4UDsJLyogcG9pbnRlciBhdCBzdHJ1Y3Qgb2YgYml0X2ZpeCdzLCBpZ25vcmVkIGlmCi0JCQkJICAgTlVMTCAqLwotICAgICBjaGFyIGJzcjsJCQkvKiBzZXF1ZW50LWxpbmtlci1oYWNrOiAxIHdoZW4gcmVsb2NvYmplY3QgaXMKLQkJCQkgICBhIGJzciAqLwotICAgICBmcmFnUyAqb3Bjb2RlX2ZyYWc7Ci0gICAgIHVuc2lnbmVkIGludCBvcGNvZGVfb2Zmc2V0OwotewotICBmaXhTICpmaXhQID0gZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjcmVsLAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkJCSAgICBiaXRfZml4UD8gTk9fUkVMT0M6IHJlbG9jKHNpemUsIHBjcmVsLCBpbV9kaXNwKQotI2Vsc2UKLQkJCSAgICBOT19SRUxPQwotI2VuZGlmCi0JCQkgICAgKTsKLQotICBmaXhfb3Bjb2RlX2ZyYWcoZml4UCkgPSBvcGNvZGVfZnJhZzsKLSAgZml4X29wY29kZV9vZmZzZXQoZml4UCkgPSBvcGNvZGVfb2Zmc2V0OwotICBmaXhfaW1fZGlzcChmaXhQKSA9IGltX2Rpc3A7Ci0gIGZpeF9ic3IoZml4UCkgPSBic3I7Ci0gIGZpeF9iaXRfZml4UChmaXhQKSA9IGJpdF9maXhQOwotfQkJCQkvKiBmaXhfbmV3X25zMzJrKCkgKi8KLQotLyogVGhpcyBpcyBUQ19DT05TX0ZJWF9ORVcsIGNhbGxlZCBieSBlbWl0X2V4cHIgaW4gcmVhZC5jLiAgKi8KLQotdm9pZAotY29uc19maXhfbmV3X25zMzJrIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwKQotICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCi0gICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCi0gICAgIGludCBzaXplOwkJCS8qIDEsIDIgIG9yIDQgdXN1YWxseS4gKi8KLSAgICAgZXhwcmVzc2lvblMgKmV4cDsJCS8qIEV4cHJlc3Npb24uICovCi17Ci0gIGZpeF9uZXdfbnMzMmtfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLAotCQkgICAgIDAsIDIsIDAsIDAsIDAsIDApOwotfQotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiBzaXplOwkJCS8qIEJ5dGUgYWxpZ25tZW50IGlzIGZpbmUgKi8KLX0KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPyAgT24gdGhlCi0gICBuczMyaywgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGluc3RydWN0aW9uLiAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgbG9uZyByZXM7Ci0gIHJlcyA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLSNpZmRlZiBTRVFVRU5UX0NPTVBBVEFCSUxJVFkKLSAgaWYgKGZyYWdfYnNyKGZpeFAtPmZ4X2ZyYWcpKQotICAgIHJlcyArPSAweDEyCQkJLyogRk9PIEtsdWRnZSBhbGVydCEgKi8KLSNlbmRpZgotICAgICAgcmV0dXJuIHJlczsKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWw7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotCi0gIGNvZGUgPSByZWxvYyhmaXhwLT5meF9zaXplLCBmaXhwLT5meF9wY3JlbCwgZml4X2ltX2Rpc3AoZml4cCkpOwotCi0gIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWwtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWwtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWwtPmFkZGVuZCA9IDA7Ci0KLSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgaWYgKCFyZWwtPmhvd3RvKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIG5hbWUgPSBTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCW5hbWUgPSBfKCI8dW5rbm93bj4iKTsKLSAgICAgIGFzX2ZhdGFsIChfKCJDYW5ub3QgZmluZCByZWxvY2F0aW9uIHR5cGUgZm9yIHN5bWJvbCAlcywgY29kZSAlZCIpLAotCQluYW1lLCAoaW50KSBjb2RlKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbDsKLX0KLSNlbHNlIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmZGVmIE9CSl9BT1VUCi12b2lkCi1jb25zX2ZpeF9uZXdfbnMzMmsgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIHN0cnVjdCBmaXggKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICAvKgotICAgKiBJbjogbGVuZ3RoIG9mIHJlbG9jYXRpb24gKG9yIG9mIGFkZHJlc3MpIGluIGNoYXJzOiAxLCAyIG9yIDQuCi0gICAqIE91dDogR05VIExEIHJlbG9jYXRpb24gbGVuZ3RoIGNvZGU6IDAsIDEsIG9yIDIuCi0gICAqLwotCi0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIG5ieXRlc19yX2xlbmd0aFtdID0gezQyLCAwLCAxLCA0MiwgMn07Ci0gIGxvbmcgcl9zeW1ib2xudW07Ci0KLSAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLSAgICAgICBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKLQkJICAgICAgNCk7Ci0KLSAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCi0JCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUgKyA0LAotCQkgICAgICAoKGxvbmcpIChyX3N5bWJvbG51bSkKLQkJICAgICAgIHwgKGxvbmcpIChmaXhQLT5meF9wY3JlbCA8PCAyNCkKLQkJICAgICAgIHwgKGxvbmcpIChuYnl0ZXNfcl9sZW5ndGhbZml4UC0+Znhfc2l6ZV0gPDwgMjUpCi0JCSAgICAgICB8IChsb25nKSAoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkgPDwgMjcpCi0JCSAgICAgICB8IChsb25nKSAoZml4X2JzcihmaXhQKSA8PCAyOCkKLQkJICAgICAgIHwgKGxvbmcpIChmaXhfaW1fZGlzcChmaXhQKSA8PCAyOSkpLAotCQkgICAgICA0KTsKLX0KLQotI2VuZGlmIC8qIE9CSl9BT1VUICovCi0jZW5kaWYgLyogQkZEX0FTU01FQkxFUiAqLwotCi0vKiBlbmQgb2YgdGMtbnMzMmsuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1uczMyay5oIGIvZ2FzL2NvbmZpZy90Yy1uczMyay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWM4NmVjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbnMzMmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKiB0Yy1uczMyay5oIC0tIE9wY29kZSB0YWJsZSBmb3IgTmF0aW9uYWwgU2VtaSAzMmsgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTQsIDk1LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19OUzMySwotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCTAKLQotI2RlZmluZSBUQ19QQ1JFTF9BREpVU1QoRikgbWRfcGNyZWxfYWRqdXN0KEYpCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIE5PX1JFTE9DIEJGRF9SRUxPQ19OT05FCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJCWJmZF9hcmNoX25zMzJrCi0KLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAkJLyogTWF5YmUgZGVmaW5lZCBpbiB0ZS0qLmggKi8KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LXBjNTMyLW1hY2giCi0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIE5PX1JFTE9DIDAKLSNlbmRpZgotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNpbmNsdWRlICJiaXRfZml4LmgiCi0KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGEpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCXs7fQkvKiBub3QgdXNlZCAqLwotCi0jaWZkZWYgU0VRVUVOVF9DT01QQVRBQklMSVRZCi0jZGVmaW5lIERFRl9NT0RFQyAyMAotI2RlZmluZSBERUZfTU9ERUwgMjEKLSNlbmRpZgotCi0jaWZuZGVmIERFRl9NT0RFQwotI2RlZmluZSBERUZfTU9ERUMgMjAKLSNlbmRpZgotCi0jaWZuZGVmIERFRl9NT0RFTAotI2RlZmluZSBERUZfTU9ERUwgMjAKLSNlbmRpZgotCi0jZGVmaW5lIE1BWF9BUkdTIDQKLSNkZWZpbmUgQVJHX0xFTiA1MAotCi0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfbnMzMmsKLWV4dGVybiB2b2lkIGZpeF9uZXdfbnMzMmtfZXhwIFBBUkFNUygoZnJhZ1MgKmZyYWcsCi0JCQkJICAgaW50IHdoZXJlLAotCQkJCSAgIGludCBzaXplLAotCQkJCSAgIGV4cHJlc3Npb25TICpleHAsCi0JCQkJICAgaW50IHBjcmVsLAotCQkJCSAgIGludCBpbV9kaXNwLAotCQkJCSAgIGJpdF9maXhTICpiaXRfZml4UCwJLyogcmVhbGx5IGJpdF9maXhTICovCi0JCQkJICAgaW50IGJzciwKLQkJCQkgICBmcmFnUyAqb3Bjb2RlX2ZyYWcsCi0JCQkJICAgdW5zaWduZWQgaW50IG9wY29kZV9vZmZzZXQpKTsKLQotCi1leHRlcm4gdm9pZCBmaXhfbmV3X25zMzJrIFBBUkFNUyAoKGZyYWdTICpmcmFnLAotCQkJCSAgIGludCB3aGVyZSwKLQkJCQkgICBpbnQgc2l6ZSwKLQkJCQkgICBzeW1ib2xTICphZGRfc3ltYm9sLAotCQkJCSAgIGxvbmcgb2Zmc2V0LAotCQkJCSAgIGludCBwY3JlbCwKLQkJCQkgICBpbnQgaW1fZGlzcCwKLQkJCQkgICBiaXRfZml4UyAqYml0X2ZpeFAsCS8qIHJlYWxseSBiaXRfZml4UyAqLwotCQkJCSAgIGludCBic3IsCi0JCQkJICAgZnJhZ1MgKm9wY29kZV9mcmFnLAotCQkJCSAgIHVuc2lnbmVkIGludCBvcGNvZGVfb2Zmc2V0KSk7Ci0KLWV4dGVybiB2b2lkIGNvbnNfZml4X25ld19uczMyayBQQVJBTVMgKChmcmFnUyAqZnJhZywKLQkJCQkJaW50IHdoZXJlLAotCQkJCQlpbnQgc2l6ZSwKLQkJCQkJZXhwcmVzc2lvblMgKmV4cCkpOwotCi0vKiB0aGUgTlMzMngzMiBoYXMgYSBub24gMCBub3AgaW5zdHJ1Y3Rpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW4gYWxpZ25zICovCi0jZGVmaW5lIE5PUF9PUENPREUgMHhhMgotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotI2RlZmluZSBUQ19GUkFHX1RZUEUJCQkJXAotc3RydWN0IHsJCQkJCVwKLSAgZnJhZ1MgKmZyX29wY29kZV9mcmFnUDsJCQlcCi0gIHVuc2lnbmVkIGludCBmcl9vcGNvZGVfb2Zmc2V0OwkJXAotICBjaGFyIGZyX2JzcjsJCQkJCVwKLX0KLQotI2RlZmluZSBUQ19GUkFHX0lOSVQoWCkJCQkJXAotICBkbwkJCQkJCVwKLSAgICAgewkJCQkJCVwKLSAgICAgICBmcmFnX29wY29kZV9mcmFnIChYKSA9IE5VTEw7CQlcCi0gICAgICAgZnJhZ19vcGNvZGVfb2Zmc2V0IChYKSA9IDA7CQlcCi0gICAgICAgZnJhZ19ic3IgKFgpID0gMDsJCQkJXAotICAgICB9CQkJCQkJXAotICB3aGlsZSgwKQotCi0vKiBBY2Nlc3NvciBtYWNyb3MgZm9yIHRoaW5ncyB3aGljaCBtYXkgbW92ZSBhcm91bmQgKi8KLSNkZWZpbmUgZnJhZ19vcGNvZGVfZnJhZyhYKSAgIChYKS0+dGNfZnJhZ19kYXRhLmZyX29wY29kZV9mcmFnUAotI2RlZmluZSBmcmFnX29wY29kZV9vZmZzZXQoWCkgKFgpLT50Y19mcmFnX2RhdGEuZnJfb3Bjb2RlX29mZnNldAotI2RlZmluZSBmcmFnX2JzcihYKSAgICAgICAgICAgKFgpLT50Y19mcmFnX2RhdGEuZnJfYnNyCi0KLSNkZWZpbmUgVENfRklYX1RZUEUJCQkJXAotc3RydWN0CQkJCQkJXAotewkJCQkJCVwKLSAgZnJhZ1MgKm9wY29kZV9mcmFnUDsJCQkJXAotICB1bnNpZ25lZCBpbnQgb3Bjb2RlX29mZnNldDsJCQlcCi0gIHVuc2lnbmVkIGludCBic3IgOiAxOwkJCQlcCi19Ci0KLS8qIEFjY2Vzc29yIG1hY3JvcyBmb3IgdGhpbmdzIHdoaWNoIG1heSBtb3ZlIGFyb3VuZC4KLSAgIFNlZSBjb21tZW50cyBpbiB3cml0ZS5oLiAgKi8KLSNkZWZpbmUgZml4X2ltX2Rpc3AoWCkgICAgICAgKFgpLT5meF9pbV9kaXNwCi0jZGVmaW5lIGZpeF9iaXRfZml4UChYKSAgICAgIChYKS0+ZnhfYml0X2ZpeFAKLSNkZWZpbmUgZml4X29wY29kZV9mcmFnKFgpICAgKFgpLT50Y19maXhfZGF0YS5vcGNvZGVfZnJhZ1AKLSNkZWZpbmUgZml4X29wY29kZV9vZmZzZXQoWCkgKFgpLT50Y19maXhfZGF0YS5vcGNvZGVfb2Zmc2V0Ci0jZGVmaW5lIGZpeF9ic3IoWCkgICAgICAgICAgIChYKS0+dGNfZml4X2RhdGEuYnNyCi0KLSNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShYKQkJCVwKLSAgZG8JCQkJCQlcCi0gICAgIHsJCQkJCQlcCi0gICAgICAgZml4X29wY29kZV9mcmFnKFgpID0gTlVMTDsJCVwKLSAgICAgICBmaXhfb3Bjb2RlX29mZnNldChYKSA9IDA7CQlcCi0gICAgICAgZml4X2JzcihYKSA9IDA7CQkJCVwKLSAgICAgfQkJCQkJCVwKLSAgd2hpbGUoMCkKLQotI2RlZmluZSBUQ19GSVhfREFUQV9QUklOVChGSUxFLCBGSVhQKQkJCQkJXAotICBkbwkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZnByaW50ZigoRklMRSksICJvcGNvZGVfZnJhZz0lbGQsIG9wZXJhbmQgb2Zmc2V0PSVkLCBic3I9JWRcbiIsCVwKLQkgICAgICAodW5zaWduZWQgbG9uZykgZml4X29wY29kZV9mcmFnIChGSVhQKSwJCQlcCi0JICAgICAgZml4X29wY29kZV9vZmZzZXQgKEZJWFApLAkJCQkJXAotCSAgICAgIGZpeF9ic3IgKEZJWFApKTsJCQkJCQlcCi0gICAgfQkJCQkJCQkJCVwKLSAgd2hpbGUoMCkKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtcGouYyBiL2dhcy9jb25maWcvdGMtcGouYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4MDMwOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXBqLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyotCi0gICB0Yy1wai5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIFBpY28gSmF2YQotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgVHJhbnNtZXRhLCBzYWNAcG9ib3guY29tICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9wY29kZS9wai5oIgotCi0KLWV4dGVybiBjb25zdCBwal9vcGNfaW5mb190IHBqX29wY19pbmZvWzUxMl07Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiEvIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiLyEjIjsKLQotc3RhdGljIGludCBwZW5kaW5nX3JlbG9jOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wY29kZV9oYXNoX2NvbnRyb2w7Ci0JCQkJCQkKLQotc3RhdGljIHZvaWQKLWxpdHRsZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLWJpZyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKLX0KLQotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPSB7Ci0gIHsibWwiLCAgICBsaXR0bGUsIDB9LAotICB7Im1iIiwgICAgYmlnLCAgICAwfSwKLSAgezAsIDAsIDB9Ci19OwotCi0KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi12b2lkCi1tZF9vcGVyYW5kIChvcCkKLSAgICAgZXhwcmVzc2lvblMgKm9wOwotewotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiJWhpMTYiLCA1KSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChwZW5kaW5nX3JlbG9jKQotCWFzX2JhZCAoXyAoImNvbmZ1c2luZyByZWxvY2F0aW9uIGV4cHJlc3Npb25zIikpOwotICAgICAgcGVuZGluZ19yZWxvYyA9IEJGRF9SRUxPQ19QSl9DT0RFX0hJMTY7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLSAgICAgIGV4cHJlc3Npb24gKG9wKTsKLSAgICB9Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIlbG8xNiIsIDUpID09IDApCi0gICAgewotICAgICAgaWYgKHBlbmRpbmdfcmVsb2MpCi0JYXNfYmFkIChfICgiY29uZnVzaW5nIHJlbG9jYXRpb24gZXhwcmVzc2lvbnMiKSk7Ci0gICAgICBwZW5kaW5nX3JlbG9jID0gQkZEX1JFTE9DX1BKX0NPREVfTE8xNjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA1OwotICAgICAgZXhwcmVzc2lvbiAob3ApOwotICAgIH0KLX0KLQotLyogUGFyc2UgYW4gZXhwcmVzc2lvbiBhbmQgdGhlbiByZXN0b3JlIHRoZSBpbnB1dCBsaW5lIHBvaW50ZXIuICovCi0KLXN0YXRpYyBjaGFyICoKLXBhcnNlX2V4cF9zYXZlX2lscCAocywgb3ApCi0gICAgIGNoYXIgKnM7Ci0gICAgIGV4cHJlc3Npb25TICpvcDsKLXsKLSAgY2hhciAqc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLSAgZXhwcmVzc2lvbiAob3ApOwotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICByZXR1cm4gczsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgZW1pdF9leHByIHZpYSBUQ19DT05TX0ZJWF9ORVcgd2hlbiBjcmVhdGluZyBhCi0gICByZWxvYyBmb3IgYSBjb25zLiAgV2UgY291bGQgdXNlIHRoZSBkZWZpbml0aW9uIHRoZXJlLCBleGNlcHQgdGhhdAotICAgd2Ugd2FudCB0byBoYW5kbGUgbWFnaWMgcGVuZGluZyByZWxvYyBleHByZXNzaW9ucyBzcGVjaWFsbHkuICAqLwotCi12b2lkCi1wal9jb25zX2ZpeF9uZXdfcGogKGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCkKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgaW50IG5ieXRlczsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgc3RhdGljIGludCBydls1XVsyXSA9IAotICB7IHsgMCwgMCB9LAotICAgIHsgQkZEX1JFTE9DXzgsIEJGRF9SRUxPQ184IH0sCi0gICAgeyBCRkRfUkVMT0NfUEpfQ09ERV9ESVIxNiwgQkZEX1JFTE9DXzE2IH0sCi0gICAgeyAwLCAwIH0sCi0gICAgeyBCRkRfUkVMT0NfUEpfQ09ERV9ESVIzMiwgQkZEX1JFTE9DXzMyIH19OwotCi0gIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgbmJ5dGVzLCBleHAsIDAsIAotCSAgICAgICBwZW5kaW5nX3JlbG9jID8gcGVuZGluZ19yZWxvYwotCSAgICAgICA6IHJ2IFtuYnl0ZXNdWyhub3dfc2VnLT5mbGFncyAmIFNFQ19DT0RFKSA/IDAgOiAxXSk7Ci0KLSAgcGVuZGluZ19yZWxvYyA9IDA7Ci19Ci0KLQotLyogVHVybiBhIHJlbG9jIGRlc2NyaXB0aW9uIGNoYXJhY3RlciBmcm9tIHRoZSBwai1vcGMuaCB0YWJsZSBpbnRvCi0gICBjb2RlIHdoaWNoIEJGRCBjYW4gaGFuZGxlLiAqLwotCi1zdGF0aWMgaW50Ci1jX3RvX3IgKHgpCi0gICAgIGNoYXIgeDsKLXsKLSAgc3dpdGNoICh4KQotICAgIHsKLSAgICBjYXNlIE9fUjg6Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DXzhfUENSRUw7Ci0gICAgY2FzZSBPX1U4OgotICAgIGNhc2UgT184OgotICAgICAgcmV0dXJuIEJGRF9SRUxPQ184OwotICAgIGNhc2UgT19SMTY6Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DX1BKX0NPREVfUkVMMTY7Ci0gICAgY2FzZSBPX1UxNjoKLSAgICBjYXNlIE9fMTY6Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DX1BKX0NPREVfRElSMTY7Ci0gICAgY2FzZSBPX1IzMjoKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfUEpfQ09ERV9SRUwzMjsKLSAgICBjYXNlIE9fMzI6Ci0gICAgICByZXR1cm4gQkZEX1JFTE9DX1BKX0NPREVfRElSMzI7Ci0gICAgfQotICBhYm9ydCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLS8qIEhhbmRsZXIgZm9yIHRoZSBpcHVzaCBmYWtlIG9wY29kZSwKLSAgIHR1cm5zIGlwdXNoIDxmb28+IGludG8gc2lwdXNoIGxvMTY8Zm9vPiwgc2V0aGkgaGkxNjxmb28+LiAqLwotCi1zdGF0aWMgdm9pZAotaXB1c2hfY29kZSAob3Bjb2RlLCBzdHIpCi0gICAgIHBqX29wY19pbmZvX3QgKm9wY29kZSBBVFRSSUJVVEVfVU5VU0VEOyAKLSAgICAgY2hhciAqc3RyOwotewotICBpbnQgbW9kID0gMDsKLSAgY2hhciAqYiA9IGZyYWdfbW9yZSAoNik7Ci0gIGV4cHJlc3Npb25TIGFyZzsKLSAgYlswXSA9IDB4MTE7Ci0gIGJbM10gPSAweGVkOwotICBwYXJzZV9leHBfc2F2ZV9pbHAgKHN0ciArIDEsICZhcmcsICZtb2QpOwotICBpZiAobW9kKQotICAgIGFzX2JhZCAoXyAoImNhbid0IGhhdmUgcmVsb2NhdGlvbiBmb3IgaXB1c2giKSk7Ci0KLQotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGIgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIDEsIDIsIAotCSAgICAgICAmYXJnLCAgMCwgQkZEX1JFTE9DX1BKX0NPREVfRElSMTYpOwotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGIgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIDQsIDIsCi0JICAgICAgICZhcmcsICAwLCBCRkRfUkVMT0NfUEpfQ09ERV9ISTE2KTsKLX0KLQotLyogSW5zZXJ0IG5hbWVzIGludG8gdGhlIG9wY29kZSB0YWJsZSB3aGljaCBhcmUgcmVhbGx5IG1pbmkgbWFjcm9zLAotICAgbm90IG9wY29kZXMuICBUaGUgZmFrZW5lc3MgaXMgaW5pZGljYXRlZCB3aXRoIGFuIG9wY29kZSBvZiAtMS4gKi8KLQotc3RhdGljIHZvaWQKLSAgICAgZmFrZV9vcGNvZGUgKG5hbWUsIGZ1bmMpIGNvbnN0IGNoYXIgKgotICAgICAgIG5hbWU7Ci0gICAgIHZvaWQgKCpmdW5jKSAoKTsKLXsKLSAgcGpfb3BjX2luZm9fdCAqZmFrZSA9IChwal9vcGNfaW5mb190ICopIHhtYWxsb2MgKHNpemVvZiAocGpfb3BjX2luZm9fdCkpOwotCi0gIGZha2UtPm9wY29kZSA9IC0xOwotICBmYWtlLT5vcGNvZGVfbmV4dCA9IC0xOwotICBmYWtlLT5uYW1lID0gKGNvbnN0IGNoYXIgKikgZnVuYzsKLSAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG5hbWUsIChjaGFyICopIGZha2UpOwotfQotCi0KLS8qIEVudGVyIGFub3RoZXIgZW50cnkgaW50byB0aGUgb3Bjb2RlIGhhc2ggdGFibGUgc28gdGhlIHNhbWUgb3Bjb2RlCi0gICBjYW4gaGF2ZSBhbm90aGVyIG5hbWUuICovCi1zdGF0aWMgdm9pZAotICAgICBhbGlhcyAobmV3LCBvbGQpIGNvbnN0IGNoYXIgKgotICAgICAgIG5ldzsKLSAgICAgY29uc3QgY2hhciAqb2xkOwotewotICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgbmV3LAotCSAgICAgICAoY2hhciAqKSBoYXNoX2ZpbmQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG9sZCkpOwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBJdCBzZXRzCi0gICB1cCB0aGUgaGFzaCB0YWJsZSB3aXRoIGFsbCB0aGUgb3Bjb2RlcyBpbiBpdCwgYW5kIGFsc28gaW5pdGlhbGl6ZXMKLSAgIHNvbWUgYWxpYXNlcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGFzc2VtYmxlcnMuICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNvbnN0IHBqX29wY19pbmZvX3QgKm9wY29kZTsKLSAgb3Bjb2RlX2hhc2hfY29udHJvbCA9IGhhc2hfbmV3ICgpOwotCi0gIC8qIEluc2VydCBuYW1lcyBpbnRvIGhhc2ggdGFibGUgKi8KLSAgZm9yIChvcGNvZGUgPSBwal9vcGNfaW5mbzsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCi0gIC8qIEluc2VydCB0aGUgb25seSBmYWtlIG9wY29kZS4gKi8KLSAgZmFrZV9vcGNvZGUgKCJpcHVzaCIsIGlwdXNoX2NvZGUpOwotCi0gIC8qIEFkZCBzb21lIGFsaWFzZXMgZm9yIG9wY29kZSBuYW1lcy4gKi8KLSAgYWxpYXMgKCJpZmVxX3MiLCAiaWZlcSIpOwotICBhbGlhcyAoImlmbmVfcyIsICJpZm5lIik7Ci0gIGFsaWFzICgiaWZfaWNtcGdlX3MiLCAiaWZfaWNtcGdlIik7Ci0gIGFsaWFzICgiaWZfaWNtcG5lX3MiLCAiaWZfaWNtcG5lIik7Ci0gIGFsaWFzICgiaWZfaWNtcGVxX3MiLCAiaWZfaWNtcGVxIik7Ci0gIGFsaWFzICgiaWZfaWNtcGd0X3MiLCAiaWZfaWNtcGd0Iik7Ci0gIGFsaWFzICgiZ290b19zIiwgImdvdG8iKTsKLQotICBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBUQVJHRVRfQVJDSCwgMCk7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIFNUUiBwb2ludHMgdG8gYQotICAgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGVtaXQKLSAgIHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uCi0gKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICB1bnNpZ25lZCBjaGFyICpvcF9zdGFydDsKLSAgdW5zaWduZWQgY2hhciAqb3BfZW5kOwotCi0gIC8vICBwal9vcGVyYW5faW5mbyBvcGVyYW5kWzNdOwotICBwal9vcGNfaW5mb190ICpvcGNvZGU7Ci0gIGNoYXIgKm91dHB1dDsKLSAgaW50IGlkeCA9IDA7Ci0gIGNoYXIgcGVuZDsKLQotICBpbnQgbmxlbiA9IDA7Ci0KLSAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIC8qIGZpbmQgdGhlIG9wIGNvZGUgZW5kICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSAodW5zaWduZWQgY2hhciAqKSAoc3RyKTsKLSAgICAgICAqb3BfZW5kICYmICFpc19lbmRfb2ZfbGluZVsqb3BfZW5kXSAmJiAqb3BfZW5kICE9ICcgJzsKLSAgICAgICBvcF9lbmQrKykgCi0gICAgbmxlbisrOwotCi0gIHBlbmQgPSAqb3BfZW5kOwotICAqb3BfZW5kID0gMDsKLQotICBpZiAobmxlbiA9PSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXyAoImNhbid0IGZpbmQgb3Bjb2RlICIpKTsKLSAgICB9Ci0KLSAgb3Bjb2RlID0gKHBqX29wY19pbmZvX3QgKikgaGFzaF9maW5kIChvcGNvZGVfaGFzaF9jb250cm9sLCBvcF9zdGFydCk7Ci0gICpvcF9lbmQgPSBwZW5kOwotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8gKCJ1bmtub3duIG9wY29kZSAlcyIpLCBvcF9zdGFydCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChvcGNvZGUtPm9wY29kZSA9PSAtMSkKLSAgICB7Ci0gICAgICAvKiBJdCdzIGEgZmFrZSBvcGNvZGUuLiBkaWcgb3V0IHRoZSBhcmdzIGFuZCBwcmV0ZW5kIHRoYXQgd2FzCi0gICAgICAgICB3aGF0IHdlIHdlcmUgcGFzc2VkICovCi0gICAgICAoKHZvaWQgKCopKCkpIG9wY29kZS0+bmFtZSkgKG9wY29kZSwgb3BfZW5kKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgYW47Ci0KLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAob3Bjb2RlLT5sZW4pOwotICAgICAgb3V0cHV0W2lkeCsrXSA9IG9wY29kZS0+b3Bjb2RlOwotCi0gICAgICBpZiAob3Bjb2RlLT5vcGNvZGVfbmV4dCAhPSAtMSkKLQlvdXRwdXRbaWR4KytdID0gb3Bjb2RlLT5vcGNvZGVfbmV4dDsKLQotICAgICAgZm9yIChhbiA9IDA7IG9wY29kZS0+YXJnW2FuXTsgYW4rKykKLQl7Ci0JICBleHByZXNzaW9uUyBhcmc7Ci0KLQkgIGlmICgqb3BfZW5kID09ICcsJyAmJiBhbiAhPSAwKQotCSAgICBvcF9lbmQrKzsKLQotCSAgaWYgKCpvcF9lbmQgPT0gMCkKLQkgICAgYXNfYmFkICgiZXhwZWN0ZWQgZXhwcmVzc3Npb24iKTsKLQotCSAgb3BfZW5kID0gcGFyc2VfZXhwX3NhdmVfaWxwIChvcF9lbmQsICZhcmcpOwotCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIAotCQkgICAgICAgb3V0cHV0IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBpZHgsCi0JCSAgICAgICBBU0laRSAob3Bjb2RlLT5hcmdbYW5dKSwKLQkJICAgICAgICZhcmcsCi0JCSAgICAgICBQQ1JFTCAob3Bjb2RlLT5hcmdbYW5dKSwgCi0JCSAgICAgICBwZW5kaW5nX3JlbG9jID8gcGVuZGluZ19yZWxvYyA6IGNfdG9fciAob3Bjb2RlLT5hcmdbYW5dKSk7Ci0KLQkgIGlkeCArPSBBU0laRSAob3Bjb2RlLT5hcmdbYW5dKTsKLQkgIHBlbmRpbmdfcmVsb2MgPSAwOwotCX0KLQotICAgICAgd2hpbGUgKGlzc3BhY2UgKCpvcF9lbmQpKQotCW9wX2VuZCsrOwotCi0gICAgICBpZiAoKm9wX2VuZCAhPSAwKQotCWFzX3dhcm4gKCJleHRyYSBzdHVmZiBvbiBsaW5lIGlnbm9yZWQiKTsKLQotICAgIH0KLQotICBpZiAocGVuZGluZ19yZWxvYykKLSAgICBhc19iYWQgKCJTb21ldGhpbmcgZm9yZ290IHRvIGNsZWFuIHVwXG4iKTsKLQotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKnQ7Ci0gIGludCBpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXyAoImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIDI7Ci0KLSAgaWYgKCF0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQwKLQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLQotI2RlZmluZSBPUFRJT05fTElUVExFIChPUFRJT05fTURfQkFTRSkKLSNkZWZpbmUgT1BUSU9OX0JJRyAgICAoT1BUSU9OX0xJVFRMRSArIDEpCi0KLSAgeyJsaXR0bGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJVFRMRX0sCi0gIHsiYmlnIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CSUd9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZyBBVFRSSUJVVEVfVU5VU0VEOyAKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9MSVRUTEU6Ci0gICAgICBsaXR0bGUgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9CSUc6Ci0gICAgICBiaWcgKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXyAoIlwKLVBKIG9wdGlvbnM6XG5cCi0tbGl0dGxlCQkJZ2VuZXJhdGUgbGl0dGxlIGVuZGlhbiBjb2RlXG5cCi0tYmlnCQkJZ2VuZXJhdGUgYmlnIGVuZGlhbiBjb2RlXG4iKSk7Ci19Ci0KLQotCi0vKiBBcHBseSBhIGZpeHVwIHRvIHRoZSBvYmplY3QgZmlsZS4gICovCi0KLQotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbHApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFscDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICBsb25nIHZhbCA9ICp2YWxwOwotICBsb25nIG1heCwgbWluOwotICBpbnQgc2hpZnQ7Ci0KLQotICAvKiBhZGp1c3RfcmVsb2Nfc3ltcyB3b24ndCBjb252ZXJ0IGEgcmVsb2MgYWdhaW5zdCBhIHdlYWsgc3ltYm9sCi0gICAgIGludG8gYSByZWxvYyBhZ2FpbnN0IGEgc2VjdGlvbiwgYnV0IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gd2lsbAotICAgICBzY3JldyB1cCBpZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHNvIHdlIGhhdmUgdG8gYWRqdXN0IHZhbCBoZXJlCi0gICAgIHRvIGF2b2lkIHRoZSBzY3JldyB1cCBsYXRlci4gICovCi0KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwgJiYgU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgdmFsIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSk7Ci0KLSAgbWF4ID0gbWluID0gMDsKLSAgc2hpZnQgPSAwOwotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1BKX0NPREVfUkVMMTY6Ci0gICAgICBpZiAodmFsIDwgLTB4ODAwMCB8fCB2YWwgPj0gMHg3ZmZmKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXyAoInBjcmVsIHRvbyBmYXIiKSk7Ci0gICAgICBidWZbMF0gfD0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0gICAgICBidWZbMV0gPSB2YWwgJiAweGZmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19QSl9DT0RFX0hJMTY6Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMjQ7Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMTY7Ci0gICAgICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWwgJiAweGZmZmY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1BKX0NPREVfRElSMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfUEpfQ09ERV9MTzE2OgotICAgICAgKmJ1ZisrID0gdmFsID4+IDg7Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMDsKLQotICAgICAgbWF4ID0gMHhmZmZmOwotICAgICAgbWluID0gLTB4ZmZmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICAgIG1heCA9IDB4ZmY7Ci0gICAgICBtaW4gPSAtMHhmZjsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfUEpfQ09ERV9ESVIzMjoKLSAgICAgICpidWYrKyA9IHZhbCA+PiAyNDsKLSAgICAgICpidWYrKyA9IHZhbCA+PiAxNjsKLSAgICAgICpidWYrKyA9IHZhbCA+PiA4OwotICAgICAgKmJ1ZisrID0gdmFsID4+IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCXsKLQkgICpidWYrKyA9IHZhbCA+PiAyNDsKLQkgICpidWYrKyA9IHZhbCA+PiAxNjsKLQkgICpidWYrKyA9IHZhbCA+PiA4OwotCSAgKmJ1ZisrID0gdmFsID4+IDA7Ci0JfQotICAgICAgZWxzZSAKLQl7Ci0JICAqYnVmKysgPSB2YWwgPj4gMDsKLQkgICpidWYrKyA9IHZhbCA+PiA4OwotCSAgKmJ1ZisrID0gdmFsID4+IDE2OwotCSAgKmJ1ZisrID0gdmFsID4+IDI0OwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JewotCSAgKmJ1ZisrID0gdmFsID4+IDg7Ci0JICAqYnVmKysgPSB2YWwgPj4gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmJ1ZisrID0gdmFsID4+IDA7Ci0JICAqYnVmKysgPSB2YWwgPj4gODsKLQl9Ci0gICAgICBicmVhazsKLQotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAobWF4ICE9IDAgJiYgKHZhbCA8IG1pbiB8fCB2YWwgPiBtYXgpKQotICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXyAoIm9mZnNldCBvdXQgb2YgcmFuZ2UiKSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFB1dCBudW1iZXIgaW50byB0YXJnZXQgYnl0ZSBvcmRlci4gIEFsd2F5cyBwdXQgdmFsdWVzIGluIGFuCi0gICBleGVjdXRhYmxlIHNlY3Rpb24gaW50byBiaWcgZW5kaWFuIG9yZGVyLiAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgdXNlLCBuYnl0ZXMpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgdmFsdWVUIHVzZTsKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuIHx8IG5vd19zZWctPmZsYWdzICYgU0VDX0NPREUpCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChwdHIsIHVzZSwgbmJ5dGVzKTsKLX0KLQotCi0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAqLwotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb24gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOwotCi0gIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWwtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWwtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIHJfdHlwZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgcl90eXBlKTsKLQotICBpZiAocmVsLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8gKCJDYW5ub3QgcmVwcmVzZW50IHJlbG9jYXRpb24gdHlwZSAlcyIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKHJfdHlwZSkpOwotICAgICAgLyogU2V0IGhvd3RvIHRvIGEgZ2FyYmFnZSB2YWx1ZSBzbyB0aGF0IHdlIGNhbiBrZWVwIGdvaW5nLiAgKi8KLSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgQkZEX1JFTE9DXzMyKTsKLSAgICAgIGFzc2VydCAocmVsLT5ob3d0byAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtcGouaCBiL2dhcy9jb25maWcvdGMtcGouaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiZjdiNy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXBqLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKi1UaGlzIGZpbGUgaXMgdGMtcGouaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIFRyYW5zbWV0YSwgc2FjQHBvYm94LmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCBvZiBUcmFuc21ldGEuIHNhY0Bwb2JveC5jb20uICovCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9wagotI2RlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJlbGYzMi1waiIgOiAiZWxmMzItcGpsIikKLSNkZWZpbmUgTElTVElOR19IRUFERVIgICAgICAgICAgICAgICAgICAgIAkJCQlcCi0gICh0YXJnZXRfYmlnX2VuZGlhbiAgICAgICAgICAgICAgICAgICAgICAJCQkJXAotICAgPyAiUGljbyBKYXZhIEdBUyBCaWcgRW5kaWFuIiAgICAgICAgICAgCQkJCVwKLSAgIDogIlBpY28gSmF2YSBHQVMgTGl0dGxlIEVuZGlhbiIpCi0KLQotdm9pZCBwal9jb25zX2ZpeF9uZXdfcGogUEFSQU1TICgoc3RydWN0IGZyYWcgKiwgaW50LCBpbnQsIGV4cHJlc3Npb25TICopKTsKLWFyZWxlbnQgKnRjX2dlbl9yZWxvYyBQQVJBTVMoKGFzZWN0aW9uICpzZWN0aW9uLCBzdHJ1Y3QgZml4ICpmaXhwKSk7Ci0KLSNkZWZpbmUgbWRfc2VjdGlvbl9hbGlnbihTRUdNRU5ULCBTSVpFKSAgICAgKFNJWkUpCi0jZGVmaW5lIG1kX2NvbnZlcnRfZnJhZyhCLCBTLCBGKSAgICAgICAgICAgIChhc19mYXRhbCAoXygiY29udmVydF9mcmFnXG4iKSksIDApCi0jZGVmaW5lIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KEEsIEIpIChhc19mYXRhbCAoXygiZXN0aW1hdGUgc2l6ZVxuIikpLDApCi0jZGVmaW5lIG1kX3VuZGVmaW5lZF9zeW1ib2woTkFNRSkgICAgICAgICAgIDAKLQotLyogUEMgcmVsYXRpdmUgb3BlcmFuZHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgb3Bjb2RlLCBhbmQgdGhlIG9wZXJhbmQKLSAgIGlzIGFsd2F5cyBvbmUgYnl0ZSBpbnRvIHRoZSBvcGNvZGUuICovCi0KLSNkZWZpbmUgbWRfcGNyZWxfZnJvbShGSVhQKSAJCQkJCQlcCi0JKChGSVhQKS0+Znhfd2hlcmUgKyAoRklYUCktPmZ4X2ZyYWctPmZyX2FkZHJlc3MgLSAxKQotCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXKEZSQUcsIFdIRVJFLCBOQllURVMsIEVYUCkgXAotCXBqX2NvbnNfZml4X25ld19waihGUkFHLCBXSEVSRSwgTkJZVEVTLCBFWFApCi0KLS8qIEFsd2F5cyBsZWF2ZSB2dGFibGUgcmVsb2NzIHVudG91Y2hlZCBpbiB0aGUgb3V0cHV0LiAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLSAgICAgICAgICAoKEZJWCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQgICAgICAgICAgIAlcCi0JICAgfHwgKEZJWCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShGSVgpIAkJCQkJXAotICAgICAgICAgICghICgoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCAgICAgICAgIAlcCi0JICAgfHwgKEZJWCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKSkKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtcHBjLmMgYi9nYXMvY29uZmlnL3RjLXBwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMThhMjc0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtcHBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDI2ICswLDAgQEAKLS8qIHRjLXBwYy5jIC0tIEFzc2VtYmxlIGZvciB0aGUgUG93ZXJQQyBvciBQT1dFUiAoUlMvNjAwMCkKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvcHBjLmgiCi0KLSNpZmRlZiBPQkpfRUxGCi0jaW5jbHVkZSAiZWxmL3BwYy5oIgotI2VuZGlmCi0KLSNpZmRlZiBURV9QRQotI2luY2x1ZGUgImNvZmYvcGUuaCIKLSNlbmRpZgotCi0vKiBUaGlzIGlzIHRoZSBhc3NlbWJsZXIgZm9yIHRoZSBQb3dlclBDIG9yIFBPV0VSIChSUy82MDAwKSBjaGlwcy4gICovCi0KLS8qIFRlbGwgdGhlIG1haW4gY29kZSB3aGF0IHRoZSBlbmRpYW5uZXNzIGlzLiAgKi8KLWV4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Ci0KLS8qIFdoZXRoZXIgb3Igbm90LCB3ZSd2ZSBzZXQgdGFyZ2V0X2JpZ19lbmRpYW4uICAqLwotc3RhdGljIGludCBzZXRfdGFyZ2V0X2VuZGlhbiA9IDA7Ci0KLS8qIFdoZXRoZXIgdG8gdXNlIHVzZXIgZnJpZW5kbHkgcmVnaXN0ZXIgbmFtZXMuICAqLwotI2lmbmRlZiBUQVJHRVRfUkVHX05BTUVTX1AKLSNpZmRlZiBURV9QRQotI2RlZmluZSBUQVJHRVRfUkVHX05BTUVTX1AgdHJ1ZQotI2Vsc2UKLSNkZWZpbmUgVEFSR0VUX1JFR19OQU1FU19QIGZhbHNlCi0jZW5kaWYKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiByZWdfbmFtZXNfcCA9IFRBUkdFVF9SRUdfTkFNRVNfUDsKLQotc3RhdGljIGJvb2xlYW4gcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCBwcGNfc2V0X2NwdSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBwcGNfaW5zZXJ0X29wZXJhbmQKLSAgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnNuLCBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kLAotCSAgIG9mZnNldFQgdmFsLCBjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSkpOwotc3RhdGljIHZvaWQgcHBjX21hY3JvIFBBUkFNUyAoKGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKm1hY3JvKSk7Ci1zdGF0aWMgdm9pZCBwcGNfYnl0ZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgcHBjX2lzX3RvY19zeW0gUEFSQU1TICgoc3ltYm9sUyAqc3ltKSk7Ci1zdGF0aWMgdm9pZCBwcGNfdGMgUEFSQU1TICgoaW50KSk7Ci0KLSNpZmRlZiBPQkpfWENPRkYKLXN0YXRpYyB2b2lkIHBwY19jb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2JiIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2JjIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2JmIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2JpZWkgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWYgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZXMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfY3NlY3QgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfY2hhbmdlX2NzZWN0IFBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgcHBjX2Z1bmN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2V4dGVybiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19sZ2xvYmwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19uYW1lZF9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3N0YWJ4IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3JlbmFtZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY190b2MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfeGNvZmZfY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY192Ynl0ZSBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBwcGNfZWxmX3N1ZmZpeCBQQVJBTVMgKChjaGFyICoqLCBleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWxmX2NvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWxmX3JkYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2VsZl9sY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfdmFsaWRhdGVfZml4IFBBUkFNUyAoKGZpeFMgKiwgc2VnVCkpOwotI2VuZGlmCi0KLSNpZmRlZiBURV9QRQotc3RhdGljIHZvaWQgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotc3RhdGljIHZvaWQgcHBjX3ByZXZpb3VzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3BkYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3lkYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3JlbGRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcmRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfdWFsb25nIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3pub3AgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcGVfY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19wZV9zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3BlX2Z1bmN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3BlX3RvY2QgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQwKLS8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbAotICAgdGFyZ2V0cy4gICovCi0KLSNpZmRlZiBPQkpfRUxGCi0vKiBUaGlzIHN0cmluZyBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwuICBUaGUgbWFjcm8KLSAgIHRjX2NvbW1lbnRfY2hhcnMgcG9pbnRzIHRvIHRoaXMuICBXZSB1c2UgdGhpcywgcmF0aGVyIHRoYW4gdGhlCi0gICB1c3VhbCBjb21tZW50X2NoYXJzLCBzbyB0aGF0IHdlIGNhbiBzd2l0Y2ggZm9yIFNvbGFyaXMgY29udmVudGlvbnMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgcHBjX3NvbGFyaXNfY29tbWVudF9jaGFyc1tdID0gIiMhIjsKLXN0YXRpYyBjb25zdCBjaGFyIHBwY19lYWJpX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotI2lmZGVmIFRBUkdFVF9TT0xBUklTX0NPTU1FTlQKLWNvbnN0IGNoYXIgKnBwY19jb21tZW50X2NoYXJzID0gcHBjX3NvbGFyaXNfY29tbWVudF9jaGFyczsKLSNlbHNlCi1jb25zdCBjaGFyICpwcGNfY29tbWVudF9jaGFycyA9IHBwY19lYWJpX2NvbW1lbnRfY2hhcnM7Ci0jZW5kaWYKLSNlbHNlCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLSNlbmRpZgotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEKLSAgIHNpbmdsZSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHBvbmVudCBpbiBhIGZsb2F0aW5nCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsCi0gICBhcyBpbiAwZDEuMC4gICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQwKLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgLyogUHNldWRvLW9wcyB3aGljaCBtdXN0IGJlIG92ZXJyaWRkZW4uICAqLwotICB7ICJieXRlIiwJcHBjX2J5dGUsCTAgfSwKLQotI2lmZGVmIE9CSl9YQ09GRgotICAvKiBQc2V1ZG8tb3BzIHNwZWNpZmljIHRvIHRoZSBSUy82MDAwIFhDT0ZGIGZvcm1hdC4gIFNvbWUgb2YgdGhlc2UKLSAgICAgbGVnaXRpbWF0ZWx5IGJlbG9uZyBpbiB0aGUgb2JqLSouYyBmaWxlLiAgSG93ZXZlciwgWENPRkYgaXMgYmFzZWQKLSAgICAgb24gQ09GRiwgYW5kIGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yIHRoZSBSUy82MDAwLiAgV2UganVzdCB1c2UKLSAgICAgb2JqLWNvZmYuYywgYW5kIGFkZCB3aGF0IHdlIG5lZWQgaGVyZS4gICovCi0gIHsgImNvbW0iLAlwcGNfY29tbSwJMCB9LAotICB7ICJsY29tbSIsCXBwY19jb21tLAkxIH0sCi0gIHsgImJiIiwJcHBjX2JiLAkJMCB9LAotICB7ICJiYyIsCXBwY19iYywJCTAgfSwKLSAgeyAiYmYiLAlwcGNfYmYsCQkwIH0sCi0gIHsgImJpIiwJcHBjX2JpZWksCTAgfSwKLSAgeyAiYnMiLAlwcGNfYnMsCQkwIH0sCi0gIHsgImNzZWN0IiwJcHBjX2NzZWN0LAkwIH0sCi0gIHsgImRhdGEiLAlwcGNfc2VjdGlvbiwJJ2QnIH0sCi0gIHsgImViIiwJcHBjX2ViLAkJMCB9LAotICB7ICJlYyIsCXBwY19lYywJCTAgfSwKLSAgeyAiZWYiLAlwcGNfZWYsCQkwIH0sCi0gIHsgImVpIiwJcHBjX2JpZWksCTEgfSwKLSAgeyAiZXMiLAlwcGNfZXMsCQkwIH0sCi0gIHsgImV4dGVybiIsCXBwY19leHRlcm4sCTAgfSwKLSAgeyAiZnVuY3Rpb24iLAlwcGNfZnVuY3Rpb24sCTAgfSwKLSAgeyAibGdsb2JsIiwJcHBjX2xnbG9ibCwJMCB9LAotICB7ICJyZW5hbWUiLAlwcGNfcmVuYW1lLAkwIH0sCi0gIHsgInNlY3Rpb24iLAlwcGNfbmFtZWRfc2VjdGlvbiwgMCB9LAotICB7ICJzdGFieCIsCXBwY19zdGFieCwJMCB9LAotICB7ICJ0ZXh0IiwJcHBjX3NlY3Rpb24sCSd0JyB9LAotICB7ICJ0b2MiLAlwcGNfdG9jLAkwIH0sCi0gIHsgImxvbmciLAlwcGNfeGNvZmZfY29ucywJMiB9LAotICB7ICJ3b3JkIiwJcHBjX3hjb2ZmX2NvbnMsCTEgfSwKLSAgeyAic2hvcnQiLAlwcGNfeGNvZmZfY29ucywJMSB9LAotICB7ICJ2Ynl0ZSIsICAgIHBwY192Ynl0ZSwJMCB9LAotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0gIHsgImxvbmciLAlwcGNfZWxmX2NvbnMsCTQgfSwKLSAgeyAid29yZCIsCXBwY19lbGZfY29ucywJMiB9LAotICB7ICJzaG9ydCIsCXBwY19lbGZfY29ucywJMiB9LAotICB7ICJyZGF0YSIsCXBwY19lbGZfcmRhdGEsCTAgfSwKLSAgeyAicm9kYXRhIiwJcHBjX2VsZl9yZGF0YSwJMCB9LAotICB7ICJsY29tbSIsCXBwY19lbGZfbGNvbW0sCTAgfSwKLSNlbmRpZgotCi0jaWZkZWYgVEVfUEUKLSAgLyogUHNldWRvLW9wcyBzcGVjaWZpYyB0byB0aGUgV2luZG93cyBOVCBQb3dlclBDIFBFIChjb2ZmKSBmb3JtYXQgKi8KLSAgeyAicHJldmlvdXMiLCBwcGNfcHJldmlvdXMsICAgMCB9LAotICB7ICJwZGF0YSIsICAgIHBwY19wZGF0YSwgICAgICAwIH0sCi0gIHsgInlkYXRhIiwgICAgcHBjX3lkYXRhLCAgICAgIDAgfSwKLSAgeyAicmVsZGF0YSIsICBwcGNfcmVsZGF0YSwgICAgMCB9LAotICB7ICJyZGF0YSIsICAgIHBwY19yZGF0YSwgICAgICAwIH0sCi0gIHsgInVhbG9uZyIsICAgcHBjX3VhbG9uZywgICAgIDAgfSwKLSAgeyAiem5vcCIsICAgICBwcGNfem5vcCwgICAgICAgMCB9LAotICB7ICJjb21tIiwJcHBjX3BlX2NvbW0sCTAgfSwKLSAgeyAibGNvbW0iLAlwcGNfcGVfY29tbSwJMSB9LAotICB7ICJzZWN0aW9uIiwgIHBwY19wZV9zZWN0aW9uLCAwIH0sCi0gIHsgImZ1bmN0aW9uIiwJcHBjX3BlX2Z1bmN0aW9uLDAgfSwKLSAgeyAidG9jZCIsICAgICBwcGNfcGVfdG9jZCwgICAgMCB9LAotI2VuZGlmCi0KLSAgLyogVGhpcyBwc2V1ZG8tb3AgaXMgdXNlZCBldmVuIHdoZW4gbm90IGdlbmVyYXRpbmcgWENPRkYgb3V0cHV0LiAgKi8KLSAgeyAidGMiLAlwcGNfdGMsCQkwIH0sCi0KLSAgeyBOVUxMLAlOVUxMLAkJMCB9Ci19OwotCi0MCi0vKiBQcmVkZWZpbmVkIHJlZ2lzdGVyIG5hbWVzIGlmIC1tcmVnbmFtZXMgKG9yIGRlZmF1bHQgZm9yIFdpbmRvd3MgTlQpLiAgKi8KLS8qIEluIGdlbmVyYWwsIHRoZXJlIGFyZSBsb3RzIG9mIHRoZW0sIGluIGFuIGF0dGVtcHQgdG8gYmUgY29tcGF0aWJsZSAqLwotLyogd2l0aCBhIG51bWJlciBvZiBvdGhlciBXaW5kb3dzIE5UIGFzc2VtYmxlcnMuICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCBwZF9yZWcKLSAgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IHZhbHVlOwotICB9OwotCi0vKiBMaXN0IG9mIHJlZ2lzdGVycyB0aGF0IGFyZSBwcmUtZGVmaW5lZDoKLQotICAgRWFjaCBnZW5lcmFsIHJlZ2lzdGVyIGhhcyBwcmVkZWZpbmVkIG5hbWVzIG9mIHRoZSBmb3JtOgotICAgMS4gcjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLSAgIDIuIHIuPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgotCi0KLSAgIEVhY2ggZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaGFzIHByZWRlZmluZWQgbmFtZXMgb2YgdGhlIGZvcm06Ci0gICAxLiBmPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgotICAgMi4gZi48cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0KLSAgIEVhY2ggY29uZGl0aW9uIHJlZ2lzdGVyIGhhcyBwcmVkZWZpbmVkIG5hbWVzIG9mIHRoZSBmb3JtOgotICAgMS4gY3I8cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0gICAyLiBjci48cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0KLSAgIFRoZXJlIGFyZSBpbmRpdmlkdWFsIHJlZ2lzdGVycyBhcyB3ZWxsOgotICAgc3Agb3Igci5zcCAgICAgaGFzIHRoZSB2YWx1ZSAxCi0gICBydG9jIG9yIHIudG9jICBoYXMgdGhlIHZhbHVlIDIKLSAgIGZwc2NyICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMAotICAgeGVyICAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAxCi0gICBsciAgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDgKLSAgIGN0ciAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgOQotICAgcG1yICAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAwCi0gICBkYXIgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDE5Ci0gICBkc2lzciAgICAgICAgICBoYXMgdGhlIHZhbHVlIDE4Ci0gICBkZWMgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDIyCi0gICBzZHIxICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDI1Ci0gICBzcnIwICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDI2Ci0gICBzcnIxICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDI3Ci0KLSAgIFRoZSB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBkX3JlZyBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImNyLjAiLCAwIH0sICAgIC8qIENvbmRpdGlvbiBSZWdpc3RlcnMgKi8KLSAgeyAiY3IuMSIsIDEgfSwKLSAgeyAiY3IuMiIsIDIgfSwKLSAgeyAiY3IuMyIsIDMgfSwKLSAgeyAiY3IuNCIsIDQgfSwKLSAgeyAiY3IuNSIsIDUgfSwKLSAgeyAiY3IuNiIsIDYgfSwKLSAgeyAiY3IuNyIsIDcgfSwKLQotICB7ICJjcjAiLCAwIH0sCi0gIHsgImNyMSIsIDEgfSwKLSAgeyAiY3IyIiwgMiB9LAotICB7ICJjcjMiLCAzIH0sCi0gIHsgImNyNCIsIDQgfSwKLSAgeyAiY3I1IiwgNSB9LAotICB7ICJjcjYiLCA2IH0sCi0gIHsgImNyNyIsIDcgfSwKLQotICB7ICJjdHIiLCA5IH0sCi0KLSAgeyAiZGFyIiwgMTkgfSwgICAgLyogRGF0YSBBY2Nlc3MgUmVnaXN0ZXIgKi8KLSAgeyAiZGVjIiwgMjIgfSwgICAgLyogRGVjcmVtZW50ZXIgKi8KLSAgeyAiZHNpc3IiLCAxOCB9LCAgLyogRGF0YSBTdG9yYWdlIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KLQotICB7ICJmLjAiLCAwIH0sICAgICAvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KLSAgeyAiZi4xIiwgMSB9LCAKLSAgeyAiZi4xMCIsIDEwIH0sIAotICB7ICJmLjExIiwgMTEgfSwgCi0gIHsgImYuMTIiLCAxMiB9LCAKLSAgeyAiZi4xMyIsIDEzIH0sIAotICB7ICJmLjE0IiwgMTQgfSwgCi0gIHsgImYuMTUiLCAxNSB9LCAKLSAgeyAiZi4xNiIsIDE2IH0sIAotICB7ICJmLjE3IiwgMTcgfSwgCi0gIHsgImYuMTgiLCAxOCB9LCAKLSAgeyAiZi4xOSIsIDE5IH0sIAotICB7ICJmLjIiLCAyIH0sIAotICB7ICJmLjIwIiwgMjAgfSwgCi0gIHsgImYuMjEiLCAyMSB9LCAKLSAgeyAiZi4yMiIsIDIyIH0sIAotICB7ICJmLjIzIiwgMjMgfSwgCi0gIHsgImYuMjQiLCAyNCB9LCAKLSAgeyAiZi4yNSIsIDI1IH0sIAotICB7ICJmLjI2IiwgMjYgfSwgCi0gIHsgImYuMjciLCAyNyB9LCAKLSAgeyAiZi4yOCIsIDI4IH0sIAotICB7ICJmLjI5IiwgMjkgfSwgCi0gIHsgImYuMyIsIDMgfSwgCi0gIHsgImYuMzAiLCAzMCB9LAotICB7ICJmLjMxIiwgMzEgfSwKLSAgeyAiZi40IiwgNCB9LCAKLSAgeyAiZi41IiwgNSB9LCAKLSAgeyAiZi42IiwgNiB9LCAKLSAgeyAiZi43IiwgNyB9LCAKLSAgeyAiZi44IiwgOCB9LCAKLSAgeyAiZi45IiwgOSB9LCAKLQotICB7ICJmMCIsIDAgfSwgCi0gIHsgImYxIiwgMSB9LCAKLSAgeyAiZjEwIiwgMTAgfSwgCi0gIHsgImYxMSIsIDExIH0sIAotICB7ICJmMTIiLCAxMiB9LCAKLSAgeyAiZjEzIiwgMTMgfSwgCi0gIHsgImYxNCIsIDE0IH0sIAotICB7ICJmMTUiLCAxNSB9LCAKLSAgeyAiZjE2IiwgMTYgfSwgCi0gIHsgImYxNyIsIDE3IH0sIAotICB7ICJmMTgiLCAxOCB9LCAKLSAgeyAiZjE5IiwgMTkgfSwgCi0gIHsgImYyIiwgMiB9LCAKLSAgeyAiZjIwIiwgMjAgfSwgCi0gIHsgImYyMSIsIDIxIH0sIAotICB7ICJmMjIiLCAyMiB9LCAKLSAgeyAiZjIzIiwgMjMgfSwgCi0gIHsgImYyNCIsIDI0IH0sIAotICB7ICJmMjUiLCAyNSB9LCAKLSAgeyAiZjI2IiwgMjYgfSwgCi0gIHsgImYyNyIsIDI3IH0sIAotICB7ICJmMjgiLCAyOCB9LCAKLSAgeyAiZjI5IiwgMjkgfSwgCi0gIHsgImYzIiwgMyB9LCAKLSAgeyAiZjMwIiwgMzAgfSwKLSAgeyAiZjMxIiwgMzEgfSwKLSAgeyAiZjQiLCA0IH0sIAotICB7ICJmNSIsIDUgfSwgCi0gIHsgImY2IiwgNiB9LCAKLSAgeyAiZjciLCA3IH0sIAotICB7ICJmOCIsIDggfSwgCi0gIHsgImY5IiwgOSB9LCAKLQotICB7ICJmcHNjciIsIDAgfSwKLQotICB7ICJsciIsIDggfSwgICAgIC8qIExpbmsgUmVnaXN0ZXIgKi8KLQotICB7ICJwbXIiLCAwIH0sCi0KLSAgeyAici4wIiwgMCB9LCAgICAvKiBHZW5lcmFsIFB1cnBvc2UgUmVnaXN0ZXJzICovCi0gIHsgInIuMSIsIDEgfSwKLSAgeyAici4xMCIsIDEwIH0sCi0gIHsgInIuMTEiLCAxMSB9LAotICB7ICJyLjEyIiwgMTIgfSwKLSAgeyAici4xMyIsIDEzIH0sCi0gIHsgInIuMTQiLCAxNCB9LAotICB7ICJyLjE1IiwgMTUgfSwKLSAgeyAici4xNiIsIDE2IH0sCi0gIHsgInIuMTciLCAxNyB9LAotICB7ICJyLjE4IiwgMTggfSwKLSAgeyAici4xOSIsIDE5IH0sCi0gIHsgInIuMiIsIDIgfSwKLSAgeyAici4yMCIsIDIwIH0sCi0gIHsgInIuMjEiLCAyMSB9LAotICB7ICJyLjIyIiwgMjIgfSwKLSAgeyAici4yMyIsIDIzIH0sCi0gIHsgInIuMjQiLCAyNCB9LAotICB7ICJyLjI1IiwgMjUgfSwKLSAgeyAici4yNiIsIDI2IH0sCi0gIHsgInIuMjciLCAyNyB9LAotICB7ICJyLjI4IiwgMjggfSwKLSAgeyAici4yOSIsIDI5IH0sCi0gIHsgInIuMyIsIDMgfSwKLSAgeyAici4zMCIsIDMwIH0sCi0gIHsgInIuMzEiLCAzMSB9LAotICB7ICJyLjQiLCA0IH0sCi0gIHsgInIuNSIsIDUgfSwKLSAgeyAici42IiwgNiB9LAotICB7ICJyLjciLCA3IH0sCi0gIHsgInIuOCIsIDggfSwKLSAgeyAici45IiwgOSB9LAotCi0gIHsgInIuc3AiLCAxIH0sICAgLyogU3RhY2sgUG9pbnRlciAqLwotCi0gIHsgInIudG9jIiwgMiB9LCAgLyogUG9pbnRlciB0byB0aGUgdGFibGUgb2YgY29udGVudHMgKi8KLQotICB7ICJyMCIsIDAgfSwgICAgIC8qIE1vcmUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAqLwotICB7ICJyMSIsIDEgfSwKLSAgeyAicjEwIiwgMTAgfSwKLSAgeyAicjExIiwgMTEgfSwKLSAgeyAicjEyIiwgMTIgfSwKLSAgeyAicjEzIiwgMTMgfSwKLSAgeyAicjE0IiwgMTQgfSwKLSAgeyAicjE1IiwgMTUgfSwKLSAgeyAicjE2IiwgMTYgfSwKLSAgeyAicjE3IiwgMTcgfSwKLSAgeyAicjE4IiwgMTggfSwKLSAgeyAicjE5IiwgMTkgfSwKLSAgeyAicjIiLCAyIH0sCi0gIHsgInIyMCIsIDIwIH0sCi0gIHsgInIyMSIsIDIxIH0sCi0gIHsgInIyMiIsIDIyIH0sCi0gIHsgInIyMyIsIDIzIH0sCi0gIHsgInIyNCIsIDI0IH0sCi0gIHsgInIyNSIsIDI1IH0sCi0gIHsgInIyNiIsIDI2IH0sCi0gIHsgInIyNyIsIDI3IH0sCi0gIHsgInIyOCIsIDI4IH0sCi0gIHsgInIyOSIsIDI5IH0sCi0gIHsgInIzIiwgMyB9LAotICB7ICJyMzAiLCAzMCB9LAotICB7ICJyMzEiLCAzMSB9LAotICB7ICJyNCIsIDQgfSwKLSAgeyAicjUiLCA1IH0sCi0gIHsgInI2IiwgNiB9LAotICB7ICJyNyIsIDcgfSwKLSAgeyAicjgiLCA4IH0sCi0gIHsgInI5IiwgOSB9LAotCi0gIHsgInJ0b2MiLCAyIH0sICAvKiBUYWJsZSBvZiBjb250ZW50cyAqLwotCi0gIHsgInNkcjEiLCAyNSB9LCAvKiBTdG9yYWdlIERlc2NyaXB0aW9uIFJlZ2lzdGVyIDEgKi8KLQotICB7ICJzcCIsIDEgfSwKLQotICB7ICJzcnIwIiwgMjYgfSwgLyogTWFjaGluZSBTdGF0dXMgU2F2ZS9SZXN0b3JlIFJlZ2lzdGVyIDAgKi8KLSAgeyAic3JyMSIsIDI3IH0sIC8qIE1hY2hpbmUgU3RhdHVzIFNhdmUvUmVzdG9yZSBSZWdpc3RlciAxICovCi0KLSAgeyAieGVyIiwgMSB9LAotCi19OwotCi0jZGVmaW5lIFJFR19OQU1FX0NOVAkoc2l6ZW9mKHByZV9kZWZpbmVkX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHBkX3JlZykpCi0KLS8qIEdpdmVuIE5BTUUsIGZpbmQgdGhlIHJlZ2lzdGVyIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhhdCBuYW1lLCByZXR1cm4KLSAgIHRoZSBpbnRlZ2VyIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciAtMSBvbiBmYWlsdXJlLiAgKi8KLQotc3RhdGljIGludCByZWdfbmFtZV9zZWFyY2gKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHBkX3JlZyAqLCBpbnQsIGNvbnN0IGNoYXIgKiBuYW1lKSk7Ci0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAocmVncywgcmVnY291bnQsIG5hbWUpCi0gICAgIGNvbnN0IHN0cnVjdCBwZF9yZWcgKnJlZ3M7Ci0gICAgIGludCByZWdjb3VudDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSByZWdjb3VudCAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgcmVnc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIHJlZ3NbbWlkZGxlXS52YWx1ZTsKLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi0vKgotICogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46CUlucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6CUEgZXhwcmVzc2lvblMuCi0gKiAgICAgIFRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKiAgICAgIFhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4gaXRzCi0gKiAgICAgIG9yaWdpbmFsIHN0YXRlLgotICovCi0KLXN0YXRpYyBib29sZWFuCi1yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpbnQgcmVnX251bWJlcjsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqc3RhcnQ7Ci0gIGNoYXIgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlmIChuYW1lWzBdID09ICclJyAmJiBpc2FscGhhIChuYW1lWzFdKSkKLSAgICBuYW1lID0gKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgZWxzZSBpZiAoIXJlZ19uYW1lc19wIHx8ICFpc2FscGhhIChuYW1lWzBdKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMsIFJFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0gICAgICAKLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotDAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggc3ltYm9sIHNlZW4gaW4gYW4gZXhwcmVzc2lvbi4gIEl0Ci0gICBoYW5kbGVzIHRoZSBzcGVjaWFsIHBhcnNpbmcgd2hpY2ggUG93ZXJQQyBhc3NlbWJsZXJzIGFyZSBzdXBwb3NlZAotICAgdG8gdXNlIGZvciBjb25kaXRpb24gY29kZXMuICAqLwotCi0vKiBXaGV0aGVyIHRvIGRvIHRoZSBzcGVjaWFsIHBhcnNpbmcuICAqLwotc3RhdGljIGJvb2xlYW4gY3Jfb3BlcmFuZDsKLQotLyogTmFtZXMgdG8gcmVjb2duaXplIGluIGEgY29uZGl0aW9uIGNvZGUuICBUaGlzIHRhYmxlIGlzIHNvcnRlZC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBkX3JlZyBjcl9uYW1lc1tdID0KLXsKLSAgeyAiY3IwIiwgMCB9LAotICB7ICJjcjEiLCAxIH0sCi0gIHsgImNyMiIsIDIgfSwKLSAgeyAiY3IzIiwgMyB9LAotICB7ICJjcjQiLCA0IH0sCi0gIHsgImNyNSIsIDUgfSwKLSAgeyAiY3I2IiwgNiB9LAotICB7ICJjcjciLCA3IH0sCi0gIHsgImVxIiwgMiB9LAotICB7ICJndCIsIDEgfSwKLSAgeyAibHQiLCAwIH0sCi0gIHsgInNvIiwgMyB9LAotICB7ICJ1biIsIDMgfQotfTsKLQotLyogUGFyc2luZyBmdW5jdGlvbi4gIFRoaXMgcmV0dXJucyBub24temVybyBpZiBpdCByZWNvZ25pemVkIGFuCi0gICBleHByZXNzaW9uLiAgKi8KLQotaW50Ci1wcGNfcGFyc2VfbmFtZSAobmFtZSwgZXhwcikKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZXhwcmVzc2lvblMgKmV4cHI7Ci17Ci0gIGludCB2YWw7Ci0KLSAgaWYgKCEgY3Jfb3BlcmFuZCkKLSAgICByZXR1cm4gMDsKLQotICB2YWwgPSByZWdfbmFtZV9zZWFyY2ggKGNyX25hbWVzLCBzaXplb2YgY3JfbmFtZXMgLyBzaXplb2YgY3JfbmFtZXNbMF0sCi0JCQkgbmFtZSk7Ci0gIGlmICh2YWwgPCAwKQotICAgIHJldHVybiAwOwotCi0gIGV4cHItPlhfb3AgPSBPX2NvbnN0YW50OwotICBleHByLT5YX2FkZF9udW1iZXIgPSB2YWw7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0MCi0vKiBMb2NhbCB2YXJpYWJsZXMuICAqLwotCi0vKiBUaGUgdHlwZSBvZiBwcm9jZXNzb3Igd2UgYXJlIGFzc2VtYmxpbmcgZm9yLiAgVGhpcyBpcyBvbmUgb3IgbW9yZQotICAgb2YgdGhlIFBQQ19PUENPREUgZmxhZ3MgZGVmaW5lZCBpbiBvcGNvZGUvcHBjLmguICAqLwotc3RhdGljIGludCBwcGNfY3B1ID0gMDsKLQotLyogVGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvciB3ZSBhcmUgYXNzZW1ibGluZyBmb3IuICBUaGlzIGlzIGVpdGhlcgotICAgUFBDX09QQ09ERV8zMiBvciBQUENfT1BDT0RFXzY0LiAgKi8KLXN0YXRpYyBpbnQgcHBjX3NpemUgPSBQUENfT1BDT0RFXzMyOwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcHBjX2hhc2g7Ci0KLS8qIE1hY3JvIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnBwY19tYWNyb19oYXNoOwotCi0jaWZkZWYgT0JKX0VMRgotLyogV2hhdCB0eXBlIG9mIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgdG8gdXNlICovCi1zdGF0aWMgZW51bSB7IFNITElCX05PTkUsIFNITElCX1BJQywgU0hJTEJfTVJFTE9DQVRBQkxFIH0gc2hsaWIgPSBTSExJQl9OT05FOwotCi0vKiBGbGFncyB0byBzZXQgaW4gdGhlIGVsZiBoZWFkZXIgKi8KLXN0YXRpYyBmbGFnd29yZCBwcGNfZmxhZ3MgPSAwOwotCi0vKiBXaGV0aGVyIHRoaXMgaXMgU29sYXJpcyBvciBub3QuICAqLwotI2lmZGVmIFRBUkdFVF9TT0xBUklTX0NPTU1FTlQKLSNkZWZpbmUgU09MQVJJU19QIHRydWUKLSNlbHNlCi0jZGVmaW5lIFNPTEFSSVNfUCBmYWxzZQotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIG1zb2xhcmlzID0gU09MQVJJU19QOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfWENPRkYKLQotLyogVGhlIFJTLzYwMDAgYXNzZW1ibGVyIHVzZXMgdGhlIC5jc2VjdCBwc2V1ZG8tb3AgdG8gZ2VuZXJhdGUgY29kZQotICAgdXNpbmcgYSBidW5jaCBvZiBkaWZmZXJlbnQgc2VjdGlvbnMuICBUaGVzZSBhc3NlbWJsZXIgc2VjdGlvbnMsCi0gICBob3dldmVyLCBhcmUgYWxsIGVuY29tcGFzc2VkIHdpdGhpbiB0aGUgLnRleHQgb3IgLmRhdGEgc2VjdGlvbnMgb2YKLSAgIHRoZSBmaW5hbCBvdXRwdXQgZmlsZS4gIFdlIGhhbmRsZSB0aGlzIGJ5IHVzaW5nIGRpZmZlcmVudAotICAgc3Vic2VnbWVudHMgd2l0aGluIHRoZXNlIG1haW4gc2VnbWVudHMuICAqLwotCi0vKiBOZXh0IHN1YnNlZ21lbnQgdG8gYWxsb2NhdGUgd2l0aGluIHRoZSAudGV4dCBzZWdtZW50LiAgKi8KLXN0YXRpYyBzdWJzZWdUIHBwY190ZXh0X3N1YnNlZ21lbnQgPSAyOwotCi0vKiBMaW5rZWQgbGlzdCBvZiBjc2VjdHMgaW4gdGhlIHRleHQgc2VjdGlvbi4gICovCi1zdGF0aWMgc3ltYm9sUyAqcHBjX3RleHRfY3NlY3RzOwotCi0vKiBOZXh0IHN1YnNlZ21lbnQgdG8gYWxsb2NhdGUgd2l0aGluIHRoZSAuZGF0YSBzZWdtZW50LiAgKi8KLXN0YXRpYyBzdWJzZWdUIHBwY19kYXRhX3N1YnNlZ21lbnQgPSAyOwotCi0vKiBMaW5rZWQgbGlzdCBvZiBjc2VjdHMgaW4gdGhlIGRhdGEgc2VjdGlvbi4gICovCi1zdGF0aWMgc3ltYm9sUyAqcHBjX2RhdGFfY3NlY3RzOwotCi0vKiBUaGUgY3VycmVudCBjc2VjdC4gICovCi1zdGF0aWMgc3ltYm9sUyAqcHBjX2N1cnJlbnRfY3NlY3Q7Ci0KLS8qIFRoZSBSUy82MDAwIGFzc2VtYmxlciB1c2VzIGEgVE9DIHdoaWNoIGhvbGRzIGFkZHJlc3NlcyBvZiBmdW5jdGlvbnMKLSAgIGFuZCB2YXJpYWJsZXMuICBTeW1ib2xzIGFyZSBwdXQgaW4gdGhlIFRPQyB3aXRoIHRoZSAudGMgcHNldWRvLW9wLgotICAgQSBzcGVjaWFsIHJlbG9jYXRpb24gaXMgdXNlZCB3aGVuIGFjY2Vzc2luZyBUT0MgZW50cmllcy4gIFdlIGhhbmRsZQotICAgdGhlIFRPQyBhcyBhIHN1YnNlZ21lbnQgd2l0aGluIHRoZSAuZGF0YSBzZWdtZW50LiAgV2Ugc2V0IGl0IHVwIGlmCi0gICB3ZSBzZWUgYSAudG9jIHBzZXVkby1vcCwgYW5kIHNhdmUgdGhlIGNzZWN0IHN5bWJvbCBoZXJlLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpwcGNfdG9jX2NzZWN0OwotCi0vKiBUaGUgZmlyc3QgZnJhZyBpbiB0aGUgVE9DIHN1YnNlZ21lbnQuICAqLwotc3RhdGljIGZyYWdTICpwcGNfdG9jX2ZyYWc7Ci0KLS8qIFRoZSBmaXJzdCBmcmFnIGluIHRoZSBmaXJzdCBzdWJzZWdtZW50IGFmdGVyIHRoZSBUT0MgaW4gdGhlIC5kYXRhCi0gICBzZWdtZW50LiAgTlVMTCBpZiB0aGVyZSBhcmUgbm8gc3Vic2VnbWVudHMgYWZ0ZXIgdGhlIFRPQy4gICovCi1zdGF0aWMgZnJhZ1MgKnBwY19hZnRlcl90b2NfZnJhZzsKLQotLyogVGhlIGN1cnJlbnQgc3RhdGljIGJsb2NrLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpwcGNfY3VycmVudF9ibG9jazsKLQotLyogVGhlIENPRkYgZGVidWdnaW5nIHNlY3Rpb247IHNldCBieSBtZF9iZWdpbi4gIFRoaXMgaXMgbm90IHRoZQotICAgLmRlYnVnIHNlY3Rpb24sIGJ1dCBpcyBpbnN0ZWFkIHRoZSBzZWNyZXQgQkZEIHNlY3Rpb24gd2hpY2ggd2lsbAotICAgY2F1c2UgQkZEIHRvIHNldCB0aGUgc2VjdGlvbiBudW1iZXIgb2YgYSBzeW1ib2wgdG8gTl9ERUJVRy4gICovCi1zdGF0aWMgYXNlY3Rpb24gKnBwY19jb2ZmX2RlYnVnX3NlY3Rpb247Ci0KLSNlbmRpZiAvKiBPQkpfWENPRkYgKi8KLQotI2lmZGVmIFRFX1BFCi0KLS8qIFZhcmlvdXMgc2VjdGlvbnMgdGhhdCB3ZSBuZWVkIGZvciBQRSBjb2ZmIHN1cHBvcnQuICAqLwotc3RhdGljIHNlZ1QgeWRhdGFfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIHBkYXRhX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCByZWxkYXRhX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCByZGF0YV9zZWN0aW9uOwotc3RhdGljIHNlZ1QgdG9jZGF0YV9zZWN0aW9uOwotCi0vKiBUaGUgY3VycmVudCBzZWN0aW9uIGFuZCB0aGUgcHJldmlvdXMgc2VjdGlvbi4gU2VlIHBwY19wcmV2aW91cy4gKi8KLXN0YXRpYyBzZWdUIHBwY19wcmV2aW91c19zZWN0aW9uOwotc3RhdGljIHNlZ1QgcHBjX2N1cnJlbnRfc2VjdGlvbjsKLQotI2VuZGlmIC8qIFRFX1BFICovCi0KLSNpZmRlZiBPQkpfRUxGCi1zeW1ib2xTICpHT1Rfc3ltYm9sOwkJLyogUHJlLWRlZmluZWQgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFIiAqLwotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQwKLSNpZmRlZiBPQkpfRUxGCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiYjpsOnVzbTpLOlZROiI7Ci0jZWxzZQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gInVtOiI7Ci0jZW5kaWYKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICd1JzoKLSAgICAgIC8qIC11IG1lYW5zIHRoYXQgYW55IHVuZGVmaW5lZCBzeW1ib2xzIHNob3VsZCBiZSB0cmVhdGVkIGFzCi0JIGV4dGVybmFsLCB3aGljaCBpcyB0aGUgZGVmYXVsdCBmb3IgZ2FzIGFueWhvdy4gICovCi0gICAgICBicmVhazsKLQotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlICdsJzoKLSAgICAgIC8qIFNvbGFyaXMgYXMgdGFrZXMgLWxlIChwcmVzdW1hYmx5IGZvciBsaXR0bGUgZW5kaWFuKS4gIEZvciBjb21wbGV0ZW5lc3MKLSAgICAgICAgIHNha2UsIHJlY29nbml6ZSAtYmUgYWxzby4gICovCi0gICAgICBpZiAoc3RyY21wIChhcmcsICJlIikgPT0gMCkKLQl7Ci0JICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7Ci0JICBzZXRfdGFyZ2V0X2VuZGlhbiA9IDE7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiAwOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2InOgotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiZSIpID09IDApCi0JewotCSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotCSAgc2V0X3RhcmdldF9lbmRpYW4gPSAxOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdLJzoKLSAgICAgIC8qIFJlY29nbml6ZSAtSyBQSUMgKi8KLSAgICAgIGlmIChzdHJjbXAgKGFyZywgIlBJQyIpID09IDAgfHwgc3RyY21wIChhcmcsICJwaWMiKSA9PSAwKQotCXsKLQkgIHNobGliID0gU0hMSUJfUElDOwotCSAgcHBjX2ZsYWdzIHw9IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUI7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiAwOwotCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSAnbSc6Ci0gICAgICAvKiAtbXB3cnggYW5kIC1tcHdyMiBtZWFuIHRvIGFzc2VtYmxlIGZvciB0aGUgSUJNIFBPV0VSLzIKLSAgICAgICAgIChSSU9TMikuICAqLwotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAicHdyeCIpID09IDAgfHwgc3RyY21wIChhcmcsICJwd3IyIikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfUE9XRVIyOwotICAgICAgLyogLW1wd3IgbWVhbnMgdG8gYXNzZW1ibGUgZm9yIHRoZSBJQk0gUE9XRVIgKFJJT1MxKS4gICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInB3ciIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfUE9XRVI7Ci0gICAgICAvKiAtbTYwMSBtZWFucyB0byBhc3NlbWJsZSBmb3IgdGhlIE1vdG9yb2xhIFBvd2VyUEMgNjAxLCB3aGljaCBpbmNsdWRlcwotICAgICAgICAgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGhvbGRvdmVycyBmcm9tIHRoZSBQb3dlci4gKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiNjAxIikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFXzYwMTsKLSAgICAgIC8qIC1tcHBjLCAtbXBwYzMyLCAtbTYwMywgYW5kIC1tNjA0IG1lYW4gdG8gYXNzZW1ibGUgZm9yIHRoZQotICAgICAgICAgTW90b3JvbGEgUG93ZXJQQyA2MDMvNjA0LiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAicHBjIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGFyZywgInBwYzMyIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGFyZywgIjQwMyIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChhcmcsICI2MDMiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoYXJnLCAiNjA0IikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QUEM7Ci0gICAgICAvKiAtbXBwYzY0IGFuZCAtbTYyMCBtZWFuIHRvIGFzc2VtYmxlIGZvciB0aGUgNjQtYml0IFBvd2VyUEMKLSAgICAgICAgIDYyMC4gICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInBwYzY0IikgPT0gMCB8fCBzdHJjbXAgKGFyZywgIjYyMCIpID09IDApCi0JewotCSAgcHBjX2NwdSA9IFBQQ19PUENPREVfUFBDOwotCSAgcHBjX3NpemUgPSBQUENfT1BDT0RFXzY0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAicHBjNjRicmlkZ2UiKSA9PSAwKQotCXsKLQkgIHBwY19jcHUgPSBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfNjRfQlJJREdFOwotCSAgcHBjX3NpemUgPSBQUENfT1BDT0RFXzY0OwotCX0KLSAgICAgIC8qIC1tY29tIG1lYW5zIGFzc2VtYmxlIGZvciB0aGUgY29tbW9uIGludGVyc2VjdGlvbiBiZXR3ZWVuIFBvd2VyCi0JIGFuZCBQb3dlclBDLiAgQXQgcHJlc2VudCwgd2UganVzdCBhbGxvdyB0aGUgdW5pb24sIHJhdGhlcgotCSB0aGFuIHRoZSBpbnRlcnNlY3Rpb24uICAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJjb20iKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX0NPTU1PTjsKLSAgICAgIC8qIC1tYW55IG1lYW5zIHRvIGFzc2VtYmxlIGZvciBhbnkgYXJjaGl0ZWN0dXJlIChQV1IvUFdSWC9QUEMpLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiYW55IikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9BTlk7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAicmVnbmFtZXMiKSA9PSAwKQotCXJlZ19uYW1lc19wID0gdHJ1ZTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJuby1yZWduYW1lcyIpID09IDApCi0JcmVnX25hbWVzX3AgPSBmYWxzZTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIC8qIC1tcmVsb2NhdGFibGUvLW1yZWxvY2F0YWJsZS1saWIgLS0gd2FybiBhYm91dCBpbml0aWFsaXphdGlvbnMgdGhhdCByZXF1aXJlIHJlbG9jYXRpb24gKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAicmVsb2NhdGFibGUiKSA9PSAwKQotCXsKLQkgIHNobGliID0gU0hJTEJfTVJFTE9DQVRBQkxFOwotCSAgcHBjX2ZsYWdzIHw9IEVGX1BQQ19SRUxPQ0FUQUJMRTsKLQl9Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAicmVsb2NhdGFibGUtbGliIikgPT0gMCkKLQl7Ci0JICBzaGxpYiA9IFNISUxCX01SRUxPQ0FUQUJMRTsKLQkgIHBwY19mbGFncyB8PSBFRl9QUENfUkVMT0NBVEFCTEVfTElCOwotCX0KLQotICAgICAgLyogLW1lbWIsIHNldCBlbWJlZGRlZCBiaXQgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiZW1iIikgPT0gMCkKLQlwcGNfZmxhZ3MgfD0gRUZfUFBDX0VNQjsKLQotICAgICAgLyogLW1saXR0bGUvLW1iaWcgc2V0IHRoZSBlbmRpYW5lc3MgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibGl0dGxlIikgPT0gMCB8fCBzdHJjbXAgKGFyZywgImxpdHRsZS1lbmRpYW4iKSA9PSAwKQotCXsKLQkgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLQkgIHNldF90YXJnZXRfZW5kaWFuID0gMTsKLQl9Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiYmlnIikgPT0gMCB8fCBzdHJjbXAgKGFyZywgImJpZy1lbmRpYW4iKSA9PSAwKQotCXsKLQkgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKLQkgIHNldF90YXJnZXRfZW5kaWFuID0gMTsKLQl9Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAic29sYXJpcyIpID09IDApCi0JewotCSAgbXNvbGFyaXMgPSB0cnVlOwotCSAgcHBjX2NvbW1lbnRfY2hhcnMgPSBwcGNfc29sYXJpc19jb21tZW50X2NoYXJzOwotCX0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJuby1zb2xhcmlzIikgPT0gMCkKLQl7Ci0JICBtc29sYXJpcyA9IGZhbHNlOwotCSAgcHBjX2NvbW1lbnRfY2hhcnMgPSBwcGNfZWFiaV9jb21tZW50X2NoYXJzOwotCX0KLSNlbmRpZgotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiaW52YWxpZCBzd2l0Y2ggLW0lcyIpLCBhcmcpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gICAgICAvKiAtVjogU1ZSNCBhcmd1bWVudCB0byBwcmludCB2ZXJzaW9uIElELiAgKi8KLSAgICBjYXNlICdWJzoKLSAgICAgIHByaW50X3ZlcnNpb25faWQgKCk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogLVF5LCAtUW46IFNWUjQgYXJndW1lbnRzIGNvbnRyb2xsaW5nIHdoZXRoZXIgYSAuY29tbWVudCBzZWN0aW9uCi0JIHNob3VsZCBiZSBlbWl0dGVkIG9yIG5vdC4gIEZJWE1FOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICAgIGNhc2UgJ1EnOgotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFNvbGFyaXMgdGFrZXMgLXMgdG8gc3BlY2lmeSB0aGF0IC5zdGFicyBnbyBpbiBhIC5zdGFicyBzZWN0aW9uLAotCSByYXRoZXIgdGhhbiAuc3RhYnMuZXhjbCwgd2hpY2ggaXMgaWdub3JlZCBieSB0aGUgbGlua2VyLgotCSBGSVhNRTogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgICBjYXNlICdzJzoKLSAgICAgIGlmIChhcmcpCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLVBvd2VyUEMgb3B0aW9uczpcblwKLS11CQkJaWdub3JlZFxuXAotLW1wd3J4LCAtbXB3cjIJCWdlbmVyYXRlIGNvZGUgZm9yIElCTSBQT1dFUi8yIChSSU9TMilcblwKLS1tcHdyCQkJZ2VuZXJhdGUgY29kZSBmb3IgSUJNIFBPV0VSIChSSU9TMSlcblwKLS1tNjAxCQkJZ2VuZXJhdGUgY29kZSBmb3IgTW90b3JvbGEgUG93ZXJQQyA2MDFcblwKLS1tcHBjLCAtbXBwYzMyLCAtbTQwMywgLW02MDMsIC1tNjA0XG5cCi0JCQlnZW5lcmF0ZSBjb2RlIGZvciBNb3Rvcm9sYSBQb3dlclBDIDYwMy82MDRcblwKLS1tcHBjNjQsIC1tNjIwCQlnZW5lcmF0ZSBjb2RlIGZvciBNb3Rvcm9sYSBQb3dlclBDIDYyMFxuXAotLW1wcGM2NGJyaWRnZQkJZ2VuZXJhdGUgY29kZSBmb3IgUG93ZXJQQyA2NCwgaW5jbHVkaW5nIGJyaWRnZSBpbnNuc1xuXAotLW1jb20JCQlnZW5lcmF0ZSBjb2RlIFBvd2VyL1Bvd2VyUEMgY29tbW9uIGluc3RydWN0aW9uc1xuXAotLW1hbnkJCQlnZW5lcmF0ZSBjb2RlIGZvciBhbnkgYXJjaGl0ZWN0dXJlIChQV1IvUFdSWC9QUEMpXG5cCi0tbXJlZ25hbWVzCQlBbGxvdyBzeW1ib2xpYyBuYW1lcyBmb3IgcmVnaXN0ZXJzXG5cCi0tbW5vLXJlZ25hbWVzCQlEbyBub3QgYWxsb3cgc3ltYm9saWMgbmFtZXMgZm9yIHJlZ2lzdGVyc1xuIikpOwotI2lmZGVmIE9CSl9FTEYKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLS1tcmVsb2NhdGFibGUJCXN1cHBvcnQgZm9yIEdDQydzIC1tcmVsb2NhdGJsZSBvcHRpb25cblwKLS1tcmVsb2NhdGFibGUtbGliCXN1cHBvcnQgZm9yIEdDQydzIC1tcmVsb2NhdGJsZS1saWIgb3B0aW9uXG5cCi0tbWVtYgkJCXNldCBQUENfRU1CIGJpdCBpbiBFTEYgZmxhZ3NcblwKLS1tbGl0dGxlLCAtbWxpdHRsZS1lbmRpYW5cblwKLQkJCWdlbmVyYXRlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBtYWNoaW5lXG5cCi0tbWJpZywgLW1iaWctZW5kaWFuCWdlbmVyYXRlIGNvZGUgZm9yIGEgYmlnIGVuZGlhbiBtYWNoaW5lXG5cCi0tbXNvbGFyaXMJCWdlbmVyYXRlIGNvZGUgZm9yIFNvbGFyaXNcblwKLS1tbm8tc29sYXJpcwkJZG8gbm90IGdlbmVyYXRlIGNvZGUgZm9yIFNvbGFyaXNcblwKLS1WCQkJcHJpbnQgYXNzZW1ibGVyIHZlcnNpb24gbnVtYmVyXG5cCi0tUXksIC1RbgkJaWdub3JlZFxuIikpOwotI2VuZGlmCi19Ci0MCi0vKiBTZXQgcHBjX2NwdSBpZiBpdCBpcyBub3QgYWxyZWFkeSBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX3NldF9jcHUgKCkKLXsKLSAgY29uc3QgY2hhciAqZGVmYXVsdF9vcyAgPSBUQVJHRVRfT1M7Ci0gIGNvbnN0IGNoYXIgKmRlZmF1bHRfY3B1ID0gVEFSR0VUX0NQVTsKLQotICBpZiAocHBjX2NwdSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChkZWZhdWx0X29zLCAiYWl4IiwgMykgPT0gMAotCSAgJiYgZGVmYXVsdF9vc1szXSA+PSAnNCcgJiYgZGVmYXVsdF9vc1szXSA8PSAnOScpCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfQ09NTU9OOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAoZGVmYXVsdF9vcywgImFpeDMiLCA0KSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BPV0VSOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChkZWZhdWx0X2NwdSwgInJzNjAwMCIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfUE9XRVI7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGRlZmF1bHRfY3B1LCAicG93ZXJwYyIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChkZWZhdWx0X2NwdSwgInBvd2VycGNsZSIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfUFBDOwotICAgICAgZWxzZQotCWFzX2ZhdGFsIChfKCJVbmtub3duIGRlZmF1bHQgY3B1ID0gJXMsIG9zID0gJXMiKSwgZGVmYXVsdF9jcHUsIGRlZmF1bHRfb3MpOwotICAgIH0KLX0KLQotLyogRmlndXJlIG91dCB0aGUgQkZEIGFyY2hpdGVjdHVyZSB0byB1c2UuICAqLwotCi1lbnVtIGJmZF9hcmNoaXRlY3R1cmUKLXBwY19hcmNoICgpCi17Ci0gIGNvbnN0IGNoYXIgKmRlZmF1bHRfY3B1ID0gVEFSR0VUX0NQVTsKLSAgcHBjX3NldF9jcHUgKCk7Ci0KLSAgaWYgKChwcGNfY3B1ICYgUFBDX09QQ09ERV9QUEMpICE9IDApCi0gICAgcmV0dXJuIGJmZF9hcmNoX3Bvd2VycGM7Ci0gIGVsc2UgaWYgKChwcGNfY3B1ICYgUFBDX09QQ09ERV9QT1dFUikgIT0gMCkKLSAgICByZXR1cm4gYmZkX2FyY2hfcnM2MDAwOwotICBlbHNlIGlmICgocHBjX2NwdSAmIChQUENfT1BDT0RFX0NPTU1PTiB8IFBQQ19PUENPREVfQU5ZKSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChkZWZhdWx0X2NwdSwgInJzNjAwMCIpID09IDApCi0JcmV0dXJuIGJmZF9hcmNoX3JzNjAwMDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZGVmYXVsdF9jcHUsICJwb3dlcnBjIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGRlZmF1bHRfY3B1LCAicG93ZXJwY2xlIikgPT0gMCkKLQlyZXR1cm4gYmZkX2FyY2hfcG93ZXJwYzsKLSAgICB9Ci0KLSAgYXNfZmF0YWwgKF8oIk5laXRoZXIgUG93ZXIgbm9yIFBvd2VyUEMgb3Bjb2RlcyB3ZXJlIHNlbGVjdGVkLiIpKTsKLSAgcmV0dXJuIGJmZF9hcmNoX3Vua25vd247Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGFzc2VtYmxlciBzdGFydHMgdXAuICBJdCBpcyBjYWxsZWQKLSAgIGFmdGVyIHRoZSBvcHRpb25zIGhhdmUgYmVlbiBwYXJzZWQgYW5kIHRoZSBvdXRwdXQgZmlsZSBoYXMgYmVlbgotICAgb3BlbmVkLiAgKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcDsKLSAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcF9lbmQ7Ci0gIGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICptYWNybzsKLSAgY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKm1hY3JvX2VuZDsKLSAgYm9vbGVhbiBkdXBfaW5zbiA9IGZhbHNlOwotCi0gIHBwY19zZXRfY3B1ICgpOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBTZXQgdGhlIEVMRiBmbGFncyBpZiBkZXNpcmVkLiAqLwotICBpZiAocHBjX2ZsYWdzICYmICFtc29sYXJpcykKLSAgICBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MgKHN0ZG91dHB1dCwgcHBjX2ZsYWdzKTsKLSNlbmRpZgotCi0gIC8qIEluc2VydCB0aGUgb3Bjb2RlcyBpbnRvIGEgaGFzaCB0YWJsZS4gICovCi0gIHBwY19oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgb3BfZW5kID0gcG93ZXJwY19vcGNvZGVzICsgcG93ZXJwY19udW1fb3Bjb2RlczsKLSAgZm9yIChvcCA9IHBvd2VycGNfb3Bjb2Rlczsgb3AgPCBvcF9lbmQ7IG9wKyspCi0gICAgewotICAgICAga25vdyAoKG9wLT5vcGNvZGUgJiBvcC0+bWFzaykgPT0gb3AtPm9wY29kZSk7Ci0KLSAgICAgIGlmICgob3AtPmZsYWdzICYgcHBjX2NwdSkgIT0gMAotCSAgJiYgKChvcC0+ZmxhZ3MgJiAoUFBDX09QQ09ERV8zMiB8IFBQQ19PUENPREVfNjQpKSA9PSAwCi0JICAgICAgfHwgKG9wLT5mbGFncyAmIChQUENfT1BDT0RFXzMyIHwgUFBDX09QQ09ERV82NCkpID09IHBwY19zaXplCi0JICAgICAgfHwgKHBwY19jcHUgJiBQUENfT1BDT0RFXzY0X0JSSURHRSkgIT0gMCkpCi0JewotCSAgY29uc3QgY2hhciAqcmV0dmFsOwotCi0JICByZXR2YWwgPSBoYXNoX2luc2VydCAocHBjX2hhc2gsIG9wLT5uYW1lLCAoUFRSKSBvcCk7Ci0JICBpZiAocmV0dmFsICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBJZ25vcmUgUG93ZXIgZHVwbGljYXRlcyBmb3IgLW02MDEgKi8KLQkgICAgICBpZiAoKHBwY19jcHUgJiBQUENfT1BDT0RFXzYwMSkgIT0gMAotCQkgICYmIChvcC0+ZmxhZ3MgJiBQUENfT1BDT0RFX1BPV0VSKSAhPSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIGFzX2JhZCAoXygiSW50ZXJuYWwgYXNzZW1ibGVyIGVycm9yIGZvciBpbnN0cnVjdGlvbiAlcyIpLCBvcC0+bmFtZSk7Ci0JICAgICAgZHVwX2luc24gPSB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJbnNlcnQgdGhlIG1hY3JvcyBpbnRvIGEgaGFzaCB0YWJsZS4gICovCi0gIHBwY19tYWNyb19oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgbWFjcm9fZW5kID0gcG93ZXJwY19tYWNyb3MgKyBwb3dlcnBjX251bV9tYWNyb3M7Ci0gIGZvciAobWFjcm8gPSBwb3dlcnBjX21hY3JvczsgbWFjcm8gPCBtYWNyb19lbmQ7IG1hY3JvKyspCi0gICAgewotICAgICAgaWYgKChtYWNyby0+ZmxhZ3MgJiBwcGNfY3B1KSAhPSAwKQotCXsKLQkgIGNvbnN0IGNoYXIgKnJldHZhbDsKLQotCSAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKHBwY19tYWNyb19oYXNoLCBtYWNyby0+bmFtZSwgKFBUUikgbWFjcm8pOwotCSAgaWYgKHJldHZhbCAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJJbnRlcm5hbCBhc3NlbWJsZXIgZXJyb3IgZm9yIG1hY3JvICVzIiksIG1hY3JvLT5uYW1lKTsKLQkgICAgICBkdXBfaW5zbiA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChkdXBfaW5zbikKLSAgICBhYm9ydCAoKTsKLQotICAvKiBUZWxsIHRoZSBtYWluIGNvZGUgd2hhdCB0aGUgZW5kaWFubmVzcyBpcyBpZiBpdCBpcyBub3Qgb3ZlcmlkZGVuIGJ5IHRoZSB1c2VyLiAgKi8KLSAgaWYgKCFzZXRfdGFyZ2V0X2VuZGlhbikKLSAgICB7Ci0gICAgICBzZXRfdGFyZ2V0X2VuZGlhbiA9IDE7Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IFBQQ19CSUdfRU5ESUFOOwotICAgIH0KLQotI2lmZGVmIE9CSl9YQ09GRgotICBwcGNfY29mZl9kZWJ1Z19zZWN0aW9uID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChzdGRvdXRwdXQsIE5fREVCVUcpOwotCi0gIC8qIENyZWF0ZSBkdW1teSBzeW1ib2xzIHRvIHNlcnZlIGFzIGluaXRpYWwgY3NlY3RzLiAgVGhpcyBmb3JjZXMgdGhlCi0gICAgIHRleHQgY3NlY3RzIHRvIHByZWNlZGUgdGhlIGRhdGEgY3NlY3RzLiAgVGhlc2Ugc3ltYm9scyB3aWxsIG5vdAotICAgICBiZSBvdXRwdXQuICAqLwotICBwcGNfdGV4dF9jc2VjdHMgPSBzeW1ib2xfbWFrZSAoImR1bW15XDAwMSIpOwotICBzeW1ib2xfZ2V0X3RjIChwcGNfdGV4dF9jc2VjdHMpLT53aXRoaW4gPSBwcGNfdGV4dF9jc2VjdHM7Ci0gIHBwY19kYXRhX2NzZWN0cyA9IHN5bWJvbF9tYWtlICgiZHVtbXlcMDAxIik7Ci0gIHN5bWJvbF9nZXRfdGMgKHBwY19kYXRhX2NzZWN0cyktPndpdGhpbiA9IHBwY19kYXRhX2NzZWN0czsKLSNlbmRpZgotCi0jaWZkZWYgVEVfUEUKLQotICBwcGNfY3VycmVudF9zZWN0aW9uID0gdGV4dF9zZWN0aW9uOwotICBwcGNfcHJldmlvdXNfc2VjdGlvbiA9IDA7ICAKLQotI2VuZGlmCi19Ci0KLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotcHBjX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCB2YWwsIGZpbGUsIGxpbmUpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgb2Zmc2V0VCB2YWw7Ci0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotewotICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMikKLSAgICB7Ci0gICAgICBsb25nIG1pbiwgbWF4OwotICAgICAgb2Zmc2V0VCB0ZXN0OwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9TSUdOT1BUKSAhPSAwKQotCSAgICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0JICBlbHNlCi0JICAgIG1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7Ci0KLQkgIGlmIChwcGNfc2l6ZSA9PSBQUENfT1BDT0RFXzMyKQotCSAgICB7Ci0JICAgICAgLyogU29tZSBwZW9wbGUgd3JpdGUgMzIgYml0IGhleCBjb25zdGFudHMgd2l0aCB0aGUgc2lnbgotCQkgZXh0ZW5zaW9uIGRvbmUgYnkgaGFuZC4gIFRoaXMgc2hvdWxkbid0IHJlYWxseSBiZQotCQkgdmFsaWQsIGJ1dCwgdG8gcGVybWl0IHRoaXMgY29kZSB0byBhc3NlbWJsZSBvbiBhIDY0Ci0JCSBiaXQgaG9zdCwgd2Ugc2lnbiBleHRlbmQgdGhlIDMyIGJpdCB2YWx1ZS4gICovCi0JICAgICAgaWYgKHZhbCA+IDAKLQkJICAmJiAodmFsICYgMHg4MDAwMDAwMCkgIT0gMAotCQkgICYmICh2YWwgJiAweGZmZmZmZmZmKSA9PSB2YWwpCi0JCXsKLQkJICB2YWwgLT0gMHg4MDAwMDAwMDsKLQkJICB2YWwgLT0gMHg4MDAwMDAwMDsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgIG1pbiA9IDA7Ci0JfQotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfTkVHQVRJVkUpICE9IDApCi0JdGVzdCA9IC0gdmFsOwotICAgICAgZWxzZQotCXRlc3QgPSB2YWw7Ci0KLSAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKLQl7Ci0JICBjb25zdCBjaGFyICplcnIgPQotCSAgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7Ci0JICBjaGFyIGJ1ZlsxMDBdOwotCi0JICBzcHJpbnRfdmFsdWUgKGJ1ZiwgdGVzdCk7Ci0JICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotCSAgICBhc19iYWQgKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JICBlbHNlCi0JICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgZXJyLCBidWYsIG1pbiwgbWF4KTsKLQl9Ci0gICAgfQotCi0gIGlmIChvcGVyYW5kLT5pbnNlcnQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gICAgICBlcnJtc2cgPSBOVUxMOwotICAgICAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgKGxvbmcpIHZhbCwgJmVycm1zZyk7Ci0gICAgICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JYXNfYmFkIChlcnJtc2cpOwotICAgIH0KLSAgZWxzZQotICAgIGluc24gfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpCi0JICAgICA8PCBvcGVyYW5kLT5zaGlmdCk7Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLQwKLSNpZmRlZiBPQkpfRUxGCi0vKiBQYXJzZSBAZ290LCBldGMuIGFuZCByZXR1cm4gdGhlIGRlc2lyZWQgcmVsb2NhdGlvbi4gICovCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1wcGNfZWxmX3N1ZmZpeCAoc3RyX3AsIGV4cF9wKQotICAgICBjaGFyICoqc3RyX3A7Ci0gICAgIGV4cHJlc3Npb25TICpleHBfcDsKLXsKLSAgc3RydWN0IG1hcF9iZmQgewotICAgIGNoYXIgKnN0cmluZzsKLSAgICBpbnQgbGVuZ3RoOwotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgfTsKLQotICBjaGFyIGlkZW50WzIwXTsKLSAgY2hhciAqc3RyID0gKnN0cl9wOwotICBjaGFyICpzdHIyOwotICBpbnQgY2g7Ci0gIGludCBsZW47Ci0gIHN0cnVjdCBtYXBfYmZkICpwdHI7Ci0KLSNkZWZpbmUgTUFQKHN0cixyZWxvYykgeyBzdHIsIHNpemVvZihzdHIpLTEsIHJlbG9jIH0KLQotICBzdGF0aWMgc3RydWN0IG1hcF9iZmQgbWFwcGluZ1tdID0gewotICAgIE1BUCAoImwiLAkJQkZEX1JFTE9DX0xPMTYpLAotICAgIE1BUCAoImgiLAkJQkZEX1JFTE9DX0hJMTYpLAotICAgIE1BUCAoImhhIiwJCUJGRF9SRUxPQ19ISTE2X1MpLAotICAgIE1BUCAoImJydGFrZW4iLAlCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOKSwKLSAgICBNQVAgKCJicm50YWtlbiIsCUJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOKSwKLSAgICBNQVAgKCJnb3QiLAkJQkZEX1JFTE9DXzE2X0dPVE9GRiksCi0gICAgTUFQICgiZ290QGwiLAlCRkRfUkVMT0NfTE8xNl9HT1RPRkYpLAotICAgIE1BUCAoImdvdEBoIiwJQkZEX1JFTE9DX0hJMTZfR09UT0ZGKSwKLSAgICBNQVAgKCJnb3RAaGEiLAlCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRiksCi0gICAgTUFQICgiZml4dXAiLAlCRkRfUkVMT0NfQ1RPUiksCQkvKiB3YXJuaW5ncyB3aXRoIC1tcmVsb2NhdGFibGUgKi8KLSAgICBNQVAgKCJwbHQiLAkJQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCksCi0gICAgTUFQICgicGx0cmVsMjQiLAlCRkRfUkVMT0NfMjRfUExUX1BDUkVMKSwKLSAgICBNQVAgKCJjb3B5IiwJQkZEX1JFTE9DX1BQQ19DT1BZKSwKLSAgICBNQVAgKCJnbG9iZGF0IiwJQkZEX1JFTE9DX1BQQ19HTE9CX0RBVCksCi0gICAgTUFQICgibG9jYWwyNHBjIiwJQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMpLAotICAgIE1BUCAoImxvY2FsIiwJQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMpLAotICAgIE1BUCAoInBsdHJlbCIsCUJGRF9SRUxPQ18zMl9QTFRfUENSRUwpLAotICAgIE1BUCAoInBsdEBsIiwJQkZEX1JFTE9DX0xPMTZfUExUT0ZGKSwKLSAgICBNQVAgKCJwbHRAaCIsCUJGRF9SRUxPQ19ISTE2X1BMVE9GRiksCi0gICAgTUFQICgicGx0QGhhIiwJQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYpLAotICAgIE1BUCAoInNkYXJlbCIsCUJGRF9SRUxPQ19HUFJFTDE2KSwKLSAgICBNQVAgKCJzZWN0b2ZmIiwJQkZEX1JFTE9DXzMyX0JBU0VSRUwpLAotICAgIE1BUCAoInNlY3RvZmZAbCIsCUJGRF9SRUxPQ19MTzE2X0JBU0VSRUwpLAotICAgIE1BUCAoInNlY3RvZmZAaCIsCUJGRF9SRUxPQ19ISTE2X0JBU0VSRUwpLAotICAgIE1BUCAoInNlY3RvZmZAaGEiLAlCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUwpLAotICAgIE1BUCAoIm5hZGRyIiwJQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMiksCi0gICAgTUFQICgibmFkZHIxNiIsCUJGRF9SRUxPQ19QUENfRU1CX05BRERSMTYpLAotICAgIE1BUCAoIm5hZGRyQGwiLAlCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0xPKSwKLSAgICBNQVAgKCJuYWRkckBoIiwJQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISSksCi0gICAgTUFQICgibmFkZHJAaGEiLAlCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBKSwKLSAgICBNQVAgKCJzZGFpMTYiLAlCRkRfUkVMT0NfUFBDX0VNQl9TREFJMTYpLAotICAgIE1BUCAoInNkYTJyZWwiLAlCRkRfUkVMT0NfUFBDX0VNQl9TREEyUkVMKSwKLSAgICBNQVAgKCJzZGEyaTE2IiwJQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNiksCi0gICAgTUFQICgic2RhMjEiLAlCRkRfUkVMT0NfUFBDX0VNQl9TREEyMSksCi0gICAgTUFQICgibXJrcmVmIiwJQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGKSwKLSAgICBNQVAgKCJyZWxzZWN0IiwJQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTYpLAotICAgIE1BUCAoInJlbHNlY3RAbCIsCUJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPKSwKLSAgICBNQVAgKCJyZWxzZWN0QGgiLAlCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9ISSksCi0gICAgTUFQICgicmVsc2VjdEBoYSIsCUJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBKSwKLSAgICBNQVAgKCJiaXRmbGQiLAlCRkRfUkVMT0NfUFBDX0VNQl9CSVRfRkxEKSwKLSAgICBNQVAgKCJyZWxzZGEiLAlCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREEpLAotICAgIE1BUCAoInhnb3QiLAlCRkRfUkVMT0NfUFBDX1RPQzE2KSwKLQotICAgIHsgKGNoYXIgKikwLAkwLAlCRkRfUkVMT0NfVU5VU0VEIH0KLSAgfTsKLQotICBpZiAoKnN0cisrICE9ICdAJykKLSAgICByZXR1cm4gQkZEX1JFTE9DX1VOVVNFRDsKLQotICBmb3IgKGNoID0gKnN0ciwgc3RyMiA9IGlkZW50OwotICAgICAgIChzdHIyIDwgaWRlbnQgKyBzaXplb2YgKGlkZW50KSAtIDEKLQkmJiAoaXNhbG51bSAoY2gpIHx8IGNoID09ICdAJykpOwotICAgICAgIGNoID0gKisrc3RyKQotICAgIHsKLSAgICAgICpzdHIyKysgPSAoaXNsb3dlciAoY2gpKSA/IGNoIDogdG9sb3dlciAoY2gpOwotICAgIH0KLQotICAqc3RyMiA9ICdcMCc7Ci0gIGxlbiA9IHN0cjIgLSBpZGVudDsKLQotICBjaCA9IGlkZW50WzBdOwotICBmb3IgKHB0ciA9ICZtYXBwaW5nWzBdOyBwdHItPmxlbmd0aCA+IDA7IHB0cisrKQotICAgIGlmIChjaCA9PSBwdHItPnN0cmluZ1swXQotCSYmIGxlbiA9PSBwdHItPmxlbmd0aAotCSYmIG1lbWNtcCAoaWRlbnQsIHB0ci0+c3RyaW5nLCBwdHItPmxlbmd0aCkgPT0gMCkKLSAgICAgIHsKLQlpZiAoZXhwX3AtPlhfYWRkX251bWJlciAhPSAwCi0JICAgICYmIChwdHItPnJlbG9jID09IEJGRF9SRUxPQ18xNl9HT1RPRkYKLQkJfHwgcHRyLT5yZWxvYyA9PSBCRkRfUkVMT0NfTE8xNl9HT1RPRkYKLQkJfHwgcHRyLT5yZWxvYyA9PSBCRkRfUkVMT0NfSEkxNl9HT1RPRkYKLQkJfHwgcHRyLT5yZWxvYyA9PSBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRikpCi0JICBhc193YXJuIChfKCJpZGVudGlmaWVyK2NvbnN0YW50QGdvdCBtZWFucyBpZGVudGlmaWVyQGdvdCtjb25zdGFudCIpKTsKLQotCS8qIE5vdyBjaGVjayBmb3IgaWRlbnRpZmllckBzdWZmaXgrY29uc3RhbnQgKi8KLQlpZiAoKnN0ciA9PSAnLScgfHwgKnN0ciA9PSAnKycpCi0JICB7Ci0JICAgIGNoYXIgKm9yaWdfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgZXhwcmVzc2lvblMgbmV3X2V4cDsKLQotCSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0JICAgIGV4cHJlc3Npb24gKCZuZXdfZXhwKTsKLQkgICAgaWYgKG5ld19leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICAgIHsKLQkJZXhwX3AtPlhfYWRkX251bWJlciArPSBuZXdfZXhwLlhfYWRkX251bWJlcjsKLQkJc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIH0KLQotCSAgICBpZiAoJmlucHV0X2xpbmVfcG9pbnRlciAhPSBzdHJfcCkKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcmlnX2xpbmU7Ci0JICB9Ci0KLQkqc3RyX3AgPSBzdHI7Ci0JcmV0dXJuIHB0ci0+cmVsb2M7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIEJGRF9SRUxPQ19VTlVTRUQ7Ci19Ci0KLS8qIExpa2Ugbm9ybWFsIC5sb25nLy5zaG9ydC8ud29yZCwgZXhjZXB0IHN1cHBvcnQgQGdvdCwgZXRjLiAqLwotLyogY2xvYmJlcnMgaW5wdXRfbGluZV9wb2ludGVyLCBjaGVja3MgKi8KLS8qIGVuZC1vZi1saW5lLiAqLwotc3RhdGljIHZvaWQKLXBwY19lbGZfY29ucyAobmJ5dGVzKQotICAgICByZWdpc3RlciBpbnQgbmJ5dGVzOwkvKiAxPS5ieXRlLCAyPS53b3JkLCA0PS5sb25nICovCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotCi0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRvCi0gICAgewotICAgICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICAgICBpZiAoZXhwLlhfb3AgPT0gT19zeW1ib2wKLQkgICYmICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ0AnCi0JICAmJiAocmVsb2MgPSBwcGNfZWxmX3N1ZmZpeCAoJmlucHV0X2xpbmVfcG9pbnRlciwgJmV4cCkpICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JewotCSAgcmVsb2NfaG93dG9fdHlwZSAqcmVsb2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgcmVsb2MpOwotCSAgaW50IHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQotCSAgaWYgKHNpemUgPiBuYnl0ZXMpCi0JICAgIGFzX2JhZCAoXygiJXMgcmVsb2NhdGlvbnMgZG8gbm90IGZpdCBpbiAlZCBieXRlc1xuIiksIHJlbG9jX2hvd3RvLT5uYW1lLCBuYnl0ZXMpOwotCi0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWdpc3RlciBjaGFyICpwID0gZnJhZ19tb3JlICgoaW50KSBuYnl0ZXMpOwotCSAgICAgIGludCBvZmZzZXQgPSBuYnl0ZXMgLSBzaXplOwotCi0JICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsIHNpemUsICZleHAsIDAsIHJlbG9jKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQllbWl0X2V4cHIgKCZleHAsICh1bnNpZ25lZCBpbnQpIG5ieXRlcyk7Ci0gICAgfQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyLS07CQkvKiBQdXQgdGVybWluYXRvciBiYWNrIGludG8gc3RyZWFtLiAqLwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBTb2xhcmlzIHBzZWR1byBvcCB0byBjaGFuZ2UgdG8gdGhlIC5yb2RhdGEgc2VjdGlvbi4gICovCi1zdGF0aWMgdm9pZAotcHBjX2VsZl9yZGF0YSAoeHh4KQotICAgICBpbnQgeHh4OwotewotICBjaGFyICpzYXZlX2xpbmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHN0YXRpYyBjaGFyIHNlY3Rpb25bXSA9ICIucm9kYXRhXG4iOwotCi0gIC8qIEp1c3QgcHJldGVuZCB0aGlzIGlzIC5zZWN0aW9uIC5yb2RhdGEgKi8KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2VjdGlvbjsKLSAgb2JqX2VsZl9zZWN0aW9uICh4eHgpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfbGluZTsKLX0KLQotLyogUHNldWRvIG9wIHRvIG1ha2UgZmlsZSBzY29wZSBic3MgaXRlbXMgKi8KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX2xjb21tKHh4eCkKLSAgICAgaW50IHh4eDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBjOwotICByZWdpc3RlciBjaGFyICpwOwotICBvZmZzZXRUIHNpemU7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIG9mZnNldFQgYWxpZ247Ci0gIHNlZ1Qgb2xkX3NlYzsKLSAgaW50IG9sZF9zdWJzZWM7Ci0gIGNoYXIgKnBmcmFnOwotICBpbnQgYWxpZ24yOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lOiByZXN0IG9mIGxpbmUgaWdub3JlZC4iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJCS8qIHNraXAgJywnICovCi0gIGlmICgoc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLkNPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIpLCAobG9uZykgc2l6ZSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGUgdGhpcmQgYXJndW1lbnQgdG8gLmxjb21tIGlzIHRoZSBhbGlnbm1lbnQuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgYWxpZ24gPSA4OwotICBlbHNlCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKGFsaWduIDw9IDApCi0JewotCSAgYXNfd2FybiAoXygiaWdub3JpbmcgYmFkIGFsaWdubWVudCIpKTsKLQkgIGFsaWduID0gODsKLQl9Ci0gICAgfQotCi0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0KLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgYCVzJy4iKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICYmIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAodmFsdWVUKSBzaXplKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTGVuZ3RoIG9mIC5sY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwKLQkgICAgICAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLAotCSAgICAgIChsb25nKSBzaXplKTsKLQotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogYWxsb2NhdGVfYnNzOiAqLwotICBvbGRfc2VjID0gbm93X3NlZzsKLSAgb2xkX3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gIGlmIChhbGlnbikKLSAgICB7Ci0gICAgICAvKiBjb252ZXJ0IHRvIGEgcG93ZXIgb2YgMiBhbGlnbm1lbnQgKi8KLSAgICAgIGZvciAoYWxpZ24yID0gMDsgKGFsaWduICYgMSkgPT0gMDsgYWxpZ24gPj49IDEsICsrYWxpZ24yKTsKLSAgICAgIGlmIChhbGlnbiAhPSAxKQotCXsKLQkgIGFzX2JhZCAoXygiQ29tbW9uIGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgYWxpZ24yID0gMDsKLQotICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgYWxpZ24yKTsKLSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDApOwotICBpZiAoYWxpZ24yKQotICAgIGZyYWdfYWxpZ24gKGFsaWduMiwgMCwgMCk7Ci0gIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VjdGlvbikKLSAgICBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSAwOwotICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLSAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBzeW1ib2xQLCBzaXplLAotCQkgICAgKGNoYXIgKikgMCk7Ci0gICpwZnJhZyA9IDA7Ci0gIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHNpemUpOwotICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VjdGlvbik7Ci0gIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBWYWxpZGF0ZSBhbnkgcmVsb2NhdGlvbnMgZW1pdHRlZCBmb3IgLW1yZWxvY2F0YWJsZSwgcG9zc2libHkgYWRkaW5nCi0gICBmaXh1cHMgZm9yIHdvcmQgcmVsb2NhdGlvbnMgaW4gd3JpdGFibGUgc2VnbWVudHMsIHNvIHdlIGNhbiBhZGp1c3QKLSAgIHRoZW0gYXQgcnVudGltZS4gICovCi1zdGF0aWMgdm9pZAotcHBjX2VsZl92YWxpZGF0ZV9maXggKGZpeHAsIHNlZykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIGlmIChmaXhwLT5meF9kb25lIHx8IGZpeHAtPmZ4X3BjcmVsKQotICAgIHJldHVybjsKLQotICBzd2l0Y2ggKHNobGliKQotICAgIHsKLSAgICBjYXNlIFNITElCX05PTkU6Ci0gICAgY2FzZSBTSExJQl9QSUM6Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIFNISUxCX01SRUxPQ0FUQUJMRToKLSAgICAgIGlmIChmaXhwLT5meF9yX3R5cGUgPD0gQkZEX1JFTE9DX1VOVVNFRAotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18xNl9HT1RPRkYKLQkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9HT1RPRkYKLQkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfTE8xNl9HT1RPRkYKLQkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRgotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zMl9CQVNFUkVMCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0xPMTZfQkFTRVJFTAotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X0JBU0VSRUwKLQkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUwKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmdvdDIiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5kdG9ycyIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmN0b3JzIikgIT0gMAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZml4dXAiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5zdGFiIikgIT0gMAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZ2NjX2V4Y2VwdF90YWJsZSIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmVoX2ZyYW1lIikgIT0gMAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZXhfc2hhcmVkIikgIT0gMCkKLQl7Ci0JICBpZiAoKHNlZy0+ZmxhZ3MgJiAoU0VDX1JFQURPTkxZIHwgU0VDX0NPREUpKSAhPSAwCi0JICAgICAgfHwgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19DVE9SKQotCSAgICB7Ci0JICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oIlJlbG9jYXRpb24gY2Fubm90IGJlIGRvbmUgd2hlbiB1c2luZyAtbXJlbG9jYXRhYmxlIikpOwotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0MCi0jaWZkZWYgVEVfUEUKLQotLyoKLSAqIFN1bW1hcnkgb2YgcGFyc2VfdG9jX2VudHJ5KCkuCi0gKgotICogaW46CUlucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gdGhlICdbJyBpbiBvbmUgb2Y6Ci0gKgotICogICAgICAgIFt0b2NdIFt0b2N2XSBbdG9jMzJdIFt0b2M2NF0KLSAqCi0gKiAgICAgIEFueXRoaW5nIGVsc2UgaXMgYW4gZXJyb3Igb2Ygb25lIGtpbmQgb3IgYW5vdGhlci4KLSAqCi0gKiBvdXQ6CQotICogICByZXR1cm4gdmFsdWU6IHN1Y2Nlc3Mgb3IgZmFpbHVyZQotICogICB0b2Nfa2luZDogICAgIGtpbmQgb2YgdG9jIHJlZmVyZW5jZQotICogICBpbnB1dF9saW5lX3BvaW50ZXI6Ci0gKiAgICAgc3VjY2VzczogZmlyc3QgY2hhciBhZnRlciB0aGUgJ10nCi0gKiAgICAgZmFpbHVyZTogdW5jaGFuZ2VkCi0gKgotICogc2V0dGluZ3M6Ci0gKgotICogICAgIFt0b2NdICAgLSBydiA9PSBzdWNjZXNzLCB0b2Nfa2luZCA9IGRlZmF1bHRfdG9jCi0gKiAgICAgW3RvY3ZdICAtIHJ2ID09IHN1Y2Nlc3MsIHRvY19raW5kID0gZGF0YV9pbl90b2MKLSAqICAgICBbdG9jMzJdIC0gcnYgPT0gc3VjY2VzcywgdG9jX2tpbmQgPSBtdXN0X2JlXzMyCi0gKiAgICAgW3RvYzY0XSAtIHJ2ID09IHN1Y2Nlc3MsIHRvY19raW5kID0gbXVzdF9iZV82NAotICoKLSAqLwotCi1lbnVtIHRvY19zaXplX3F1YWxpZmllciAKLXsgCi0gIGRlZmF1bHRfdG9jLCAvKiBUaGUgdG9jIGNlbGwgY29uc3RydWN0ZWQgc2hvdWxkIGJlIHRoZSBzeXN0ZW0gZGVmYXVsdCBzaXplICovCi0gIGRhdGFfaW5fdG9jLCAvKiBUaGlzIGlzIGEgZGlyZWN0IHJlZmVyZW5jZSB0byBhIHRvYyBjZWxsICAgICAgICAgICAgICAgICAgICovCi0gIG11c3RfYmVfMzIsICAvKiBUaGUgdG9jIGNlbGwgY29uc3RydWN0ZWQgbXVzdCBiZSAzMiBiaXRzIHdpZGUgICAgICAgICAgICAgICovCi0gIG11c3RfYmVfNjQgICAvKiBUaGUgdG9jIGNlbGwgY29uc3RydWN0ZWQgbXVzdCBiZSA2NCBiaXRzIHdpZGUgICAgICAgICAgICAgICovCi19OwotCi1zdGF0aWMgaW50Ci1wYXJzZV90b2NfZW50cnkodG9jX2tpbmQpCi0gICAgIGVudW0gdG9jX3NpemVfcXVhbGlmaWVyICp0b2Nfa2luZDsKLXsKLSAgY2hhciAqc3RhcnQ7Ci0gIGNoYXIgKnRvY19zcGVjOwotICBjaGFyIGM7Ci0gIGVudW0gdG9jX3NpemVfcXVhbGlmaWVyIHQ7Ci0KLSAgLyogc2F2ZSB0aGUgaW5wdXRfbGluZV9wb2ludGVyICovCi0gIHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIHNraXAgb3ZlciB0aGUgJ1snICwgYW5kIHdoaXRlc3BhY2UgKi8KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgCi0gIC8qIGZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHRvY19zcGVjID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgaWYgKHN0cmNtcCh0b2Nfc3BlYywgInRvYyIpID09IDApIAotICAgIHsKLSAgICAgIHQgPSBkZWZhdWx0X3RvYzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCh0b2Nfc3BlYywgInRvY3YiKSA9PSAwKSAKLSAgICB7Ci0gICAgICB0ID0gZGF0YV9pbl90b2M7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAodG9jX3NwZWMsICJ0b2MzMiIpID09IDApIAotICAgIHsKLSAgICAgIHQgPSBtdXN0X2JlXzMyOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wKHRvY19zcGVjLCAidG9jNjQiKSA9PSAwKSAKLSAgICB7Ci0gICAgICB0ID0gbXVzdF9iZV82NDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvcjogaW52YWxpZCB0b2Mgc3BlY2lmaWVyIGAlcyciKSwgdG9jX3NwZWMpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIG5vdyBmaW5kIHRoZSAnXScgKi8KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsJICAgICAvKiBsZWFkaW5nIHdoaXRlc3BhY2UgY291bGQgYmUgdGhlcmUuICovCi0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7IC8qIGlucHV0X2xpbmVfcG9pbnRlci0+cGFzdCBjaGFyIGluIGMuICovCi0KLSAgaWYgKGMgIT0gJ10nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yOiBleHBlY3RlZCBgXScsIGZvdW5kICBgJWMnIiksIGMpOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICp0b2Nfa2luZCA9IHQ7ICAgICAgICAgICAgIC8qIHNldCByZXR1cm4gdmFsdWUgKi8KLSAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQwKLQotLyogV2UgbmVlZCB0byBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBXZSBjYW4ndCBzaW1wbHkgZ2VuZXJhdGUgdGhlbSBhcwotICAgd2UgZ28sIGJlY2F1c2UgdGhhdCB3b3VsZCByZXF1aXJlIHVzIHRvIGZpcnN0IGNyZWF0ZSB0aGUgZnJhZywgYW5kCi0gICB0aGF0IHdvdWxkIHNjcmV3IHVwIHJlZmVyZW5jZXMgdG8gYGAuJycuICAqLwotCi1zdHJ1Y3QgcHBjX2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IG9waW5kZXg7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci0KLSNkZWZpbmUgTUFYX0lOU05fRklYVVBTICg1KQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBlYWNoIGluc3RydWN0aW9uIHRvIGJlIGFzc2VtYmxlZC4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqczsKLSAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7Ci0gIGludCBza2lwX29wdGlvbmFsOwotICBpbnQgbmVlZF9wYXJlbjsKLSAgaW50IG5leHRfb3BpbmRleDsKLSAgc3RydWN0IHBwY19maXh1cCBmaXh1cHNbTUFYX0lOU05fRklYVVBTXTsKLSAgaW50IGZjOwotICBjaGFyICpmOwotICBpbnQgaTsKLSNpZmRlZiBPQkpfRUxGCi0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSNlbmRpZgotCi0gIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICEgaXNzcGFjZSAoKnMpOyBzKyspCi0gICAgOwotICBpZiAoKnMgIT0gJ1wwJykKLSAgICAqcysrID0gJ1wwJzsKLQotICAvKiBMb29rIHVwIHRoZSBvcGNvZGUgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICBvcGNvZGUgPSAoY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICopIGhhc2hfZmluZCAocHBjX2hhc2gsIHN0cik7Ci0gIGlmIChvcGNvZGUgPT0gKGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICptYWNybzsKLQotICAgICAgbWFjcm8gPSAoY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKikgaGFzaF9maW5kIChwcGNfbWFjcm9faGFzaCwgc3RyKTsKLSAgICAgIGlmIChtYWNybyA9PSAoY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKikgTlVMTCkKLQlhc19iYWQgKF8oIlVucmVjb2duaXplZCBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICAgIGVsc2UKLQlwcGNfbWFjcm8gKHMsIG1hY3JvKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnNuID0gb3Bjb2RlLT5vcGNvZGU7Ci0KLSAgc3RyID0gczsKLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgICsrc3RyOwotCi0gIC8qIFBvd2VyUEMgb3BlcmFuZHMgYXJlIGp1c3QgZXhwcmVzc2lvbnMuICBUaGUgb25seSByZWFsIGlzc3VlIGlzCi0gICAgIHRoYXQgYSBmZXcgb3BlcmFuZCB0eXBlcyBhcmUgb3B0aW9uYWwuICBBbGwgY2FzZXMgd2hpY2ggbWlnaHQgdXNlCi0gICAgIGFuIG9wdGlvbmFsIG9wZXJhbmQgc2VwYXJhdGUgdGhlIG9wZXJhbmRzIG9ubHkgd2l0aCBjb21tYXMgKGluCi0gICAgIHNvbWUgY2FzZXMgcGFyZW50aGVzZXMgYXJlIHVzZWQsIGFzIGluIGBgbHd6IDEsMCgxKScnIGJ1dCBzdWNoCi0gICAgIGNhc2VzIG5ldmVyIGhhdmUgb3B0aW9uYWwgb3BlcmFuZHMpLiAgVGhlcmUgaXMgbmV2ZXIgbW9yZSB0aGFuCi0gICAgIG9uZSBvcHRpb25hbCBvcGVyYW5kIGZvciBhbiBpbnN0cnVjdGlvbi4gIFNvLCBiZWZvcmUgd2Ugc3RhcnQKLSAgICAgc2VyaW91c2x5IHBhcnNpbmcgdGhlIG9wZXJhbmRzLCB3ZSBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbgotICAgICBvcHRpb25hbCBvcGVyYW5kLCBhbmQsIGlmIHdlIGRvLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIGNvbW1hcyB0bwotICAgICBzZWUgd2hldGhlciB0aGUgb3BlcmFuZCBzaG91bGQgYmUgb21pdHRlZC4gICovCi0gIHNraXBfb3B0aW9uYWwgPSAwOwotICBmb3IgKG9waW5kZXhfcHRyID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXhfcHRyICE9IDA7IG9waW5kZXhfcHRyKyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZDsKLQotICAgICAgb3BlcmFuZCA9ICZwb3dlcnBjX29wZXJhbmRzWypvcGluZGV4X3B0cl07Ci0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfT1BUSU9OQUwpICE9IDApCi0JewotCSAgdW5zaWduZWQgaW50IG9wY291bnQ7Ci0KLQkgIC8qIFRoZXJlIGlzIGFuIG9wdGlvbmFsIG9wZXJhbmQuICBDb3VudCB0aGUgbnVtYmVyIG9mCi0JICAgICBjb21tYXMgaW4gdGhlIGlucHV0IGxpbmUuICAqLwotCSAgaWYgKCpzdHIgPT0gJ1wwJykKLQkgICAgb3Bjb3VudCA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvcGNvdW50ID0gMTsKLQkgICAgICBzID0gc3RyOwotCSAgICAgIHdoaWxlICgocyA9IHN0cmNociAocywgJywnKSkgIT0gKGNoYXIgKikgTlVMTCkKLQkJewotCQkgICsrb3Bjb3VudDsKLQkJICArK3M7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBJZiB0aGVyZSBhcmUgZmV3ZXIgb3BlcmFuZHMgaW4gdGhlIGxpbmUgdGhlbiBhcmUgY2FsbGVkCi0JICAgICBmb3IgYnkgdGhlIGluc3RydWN0aW9uLCB3ZSB3YW50IHRvIHNraXAgdGhlIG9wdGlvbmFsCi0JICAgICBvcGVyYW5kLiAgKi8KLQkgIGlmIChvcGNvdW50IDwgc3RybGVuIChvcGNvZGUtPm9wZXJhbmRzKSkKLQkgICAgc2tpcF9vcHRpb25hbCA9IDE7Ci0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogR2F0aGVyIHRoZSBvcGVyYW5kcy4gICovCi0gIG5lZWRfcGFyZW4gPSAwOwotICBuZXh0X29waW5kZXggPSAwOwotICBmYyA9IDA7Ci0gIGZvciAob3BpbmRleF9wdHIgPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleF9wdHIgIT0gMDsgb3BpbmRleF9wdHIrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgICAgY2hhciAqaG9sZDsKLSAgICAgIGV4cHJlc3Npb25TIGV4OwotICAgICAgY2hhciBlbmRjOwotCi0gICAgICBpZiAobmV4dF9vcGluZGV4ID09IDApCi0Jb3BlcmFuZCA9ICZwb3dlcnBjX29wZXJhbmRzWypvcGluZGV4X3B0cl07Ci0gICAgICBlbHNlCi0JewotCSAgb3BlcmFuZCA9ICZwb3dlcnBjX29wZXJhbmRzW25leHRfb3BpbmRleF07Ci0JICBuZXh0X29waW5kZXggPSAwOwotCX0KLQotICAgICAgZXJybXNnID0gTlVMTDsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIGZha2Ugb3BlcmFuZCwgdGhlbiB3ZSBkbyBub3QgZXhwZWN0IGFueXRoaW5nCi0JIGZyb20gdGhlIGlucHV0LiAgKi8KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9GQUtFKSAhPSAwKQotCXsKLQkgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIDBMLCAmZXJybXNnKTsKLQkgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkgICAgYXNfYmFkIChlcnJtc2cpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIGlzIGFuIG9wdGlvbmFsIG9wZXJhbmQsIGFuZCB3ZSBhcmUgc2tpcHBpbmcgaXQsIGp1c3QKLQkgaW5zZXJ0IGEgemVyby4gICovCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfT1BUSU9OQUwpICE9IDAKLQkgICYmIHNraXBfb3B0aW9uYWwpCi0JewotCSAgaWYgKG9wZXJhbmQtPmluc2VydCkKLQkgICAgewotCSAgICAgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIDBMLCAmZXJybXNnKTsKLQkgICAgICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JCWFzX2JhZCAoZXJybXNnKTsKLQkgICAgfQotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX05FWFQpICE9IDApCi0JICAgIG5leHRfb3BpbmRleCA9ICpvcGluZGV4X3B0ciArIDE7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdhdGhlciB0aGUgb3BlcmFuZC4gICovCi0gICAgICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0jaWZkZWYgVEVfUEUKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdbJykgCi0JewotCSAgLyogV2UgYXJlIGV4cGVjdGluZyBzb21ldGhpbmcgbGlrZSB0aGUgc2Vjb25kIGFyZ3VtZW50IGhlcmU6Ci0KLQkgICAgICAgIGx3eiByNCxbdG9jXS5HUy4wLnN0YXRpY19pbnQocnRvYykKLSAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCi0JICAgICBUaGUgYXJndW1lbnQgZm9sbG93aW5nIHRoZSBgXScgbXVzdCBiZSBhIHN5bWJvbCBuYW1lLCBhbmQgdGhlIAotICAgICAgICAgICAgIHJlZ2lzdGVyIG11c3QgYmUgdGhlIHRvYyByZWdpc3RlcjogJ3J0b2MnIG9yICcyJwotCi0JICAgICBUaGUgZWZmZWN0IGlzIHRvIDAgYXMgdGhlIGRpc3BsYWNlbWVudCBmaWVsZAotCSAgICAgaW4gdGhlIGluc3RydWN0aW9uLCBhbmQgaXNzdWUgYW4gSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiAob3IKLQkgICAgIHRoZSBhcHByb3ByaWF0ZSB2YXJpYXRpb24pIHJlbG9jIGFnYWluc3QgaXQgYmFzZWQgb24gdGhlIHN5bWJvbC4KLQkgICAgIFRoZSBsaW5rZXIgd2lsbCBidWlsZCB0aGUgdG9jLCBhbmQgaW5zZXJ0IHRoZSByZXNvbHZlZCB0b2Mgb2Zmc2V0LgotCi0JICAgICBOb3RlOgotCSAgICAgbyBUaGUgc2l6ZSBvZiB0aGUgdG9jIGVudHJ5IGlzIGN1cnJlbnRseSBhc3N1bWVkIHRvIGJlCi0JICAgICAgIDMyIGJpdHMuIFRoaXMgc2hvdWxkIG5vdCBiZSBhc3N1bWVkIHRvIGJlIGEgaGFyZCBjb2RlZAotCSAgICAgICBudW1iZXIuCi0JICAgICBvIEluIGFuIGVmZm9ydCB0byBjb3BlIHdpdGggYSBjaGFuZ2UgZnJvbSAzMiB0byA2NCBiaXRzLAotCSAgICAgICB0aGVyZSBhcmUgYWxzbyB0b2MgZW50cmllcyB0aGF0IGFyZSBzcGVjaWZpZWQgdG8gYmUKLQkgICAgICAgZWl0aGVyIDMyIG9yIDY0IGJpdHM6Ci0gICAgICAgICAgICAgICAgIGx3eiByNCxbdG9jMzJdLkdTLjAuc3RhdGljX2ludChydG9jKQotCSAgICAgICAgIGx3eiByNCxbdG9jNjRdLkdTLjAuc3RhdGljX2ludChydG9jKQotCSAgICAgICBUaGVzZSBkZW1hbmQgdG9jIGVudHJpZXMgb2YgdGhlIHNwZWNpZmllZCBzaXplLCBhbmQgdGhlCi0JICAgICAgIGluc3RydWN0aW9uIHByb2JhYmx5IHJlcXVpcmVzIGl0LgotICAgICAgICAgICovCi0KLQkgIGludCB2YWxpZF90b2M7Ci0JICBlbnVtIHRvY19zaXplX3F1YWxpZmllciB0b2Nfa2luZDsKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSB0b2NfcmVsb2M7Ci0KLQkgIC8qIGdvIHBhcnNlIG9mZiB0aGUgW3RvY1hYXSBwYXJ0ICovCi0JICB2YWxpZF90b2MgPSBwYXJzZV90b2NfZW50cnkoJnRvY19raW5kKTsKLQotCSAgaWYgKCF2YWxpZF90b2MpIAotCSAgICB7Ci0JICAgICAgLyogTm90ZTogbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIGlzc3VlZC4gICAgICovCi0JICAgICAgLyogRklYTUU6IHdoYXQgc29ydCBvZiByZWNvdmVyeSBzaG91bGQgd2UgZG8/ICovCi0JICAgICAgLyogICAgICAgIGRlbWFuZF9yZXN0X29mX2xpbmUoKTsgcmV0dXJuOyA/ICAgICovCi0JICAgIH0KLQotCSAgLyogTm93IGdldCB0aGUgc3ltYm9sIGZvbGxvd2luZyB0aGUgJ10nICovCi0JICBleHByZXNzaW9uKCZleCk7Ci0KLQkgIHN3aXRjaCAodG9jX2tpbmQpCi0JICAgIHsKLQkgICAgY2FzZSBkZWZhdWx0X3RvYzoKLQkgICAgICAvKiBJbiB0aGlzIGNhc2UsIHdlIG1heSBub3QgaGF2ZSBzZWVuIHRoZSBzeW1ib2wgeWV0LCBzaW5jZSAgKi8KLQkgICAgICAvKiBpdCBpcyBhbGxvd2VkIHRvIGFwcGVhciBvbiBhIC5leHRlcm4gb3IgLmdsb2JsIG9yIGp1c3QgYmUgKi8KLQkgICAgICAvKiBhIGxhYmVsIGluIHRoZSAuZGF0YSBzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICB0b2NfcmVsb2MgPSBCRkRfUkVMT0NfUFBDX1RPQzE2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGRhdGFfaW5fdG9jOgotCSAgICAgIC8qIDEuIFRoZSBzeW1ib2wgbXVzdCBiZSBkZWZpbmVkIGFuZCBlaXRoZXIgaW4gdGhlIHRvYyAgICAgICAgKi8KLQkgICAgICAvKiAgICBzZWN0aW9uLCBvciBhIGdsb2JhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgLyogMi4gVGhlIHJlbG9jIGdlbmVyYXRlZCBtdXN0IGhhdmUgdGhlIFRPQ0RFRk4gZmxhZyBzZXQgaW4gICAqLwotCSAgICAgIC8qICAgIHVwcGVyIGJpdCBtZXNzIG9mIHRoZSByZWxvYyB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICAvKiBGSVhNRTogSXQncyBhIGxpdHRsZSBjb25mdXNpbmcgd2hhdCB0aGUgdG9jdiBxdWFsaWZpZXIgY2FuICovCi0JICAgICAgLyogICAgICAgIGJlIHVzZWQgZm9yLiBBdCB0aGUgdmVyeSBsZWFzdCwgSSd2ZSBzZWVuIHRocmVlICAgICAqLwotCSAgICAgIC8qICAgICAgICB1c2VzLCBvbmx5IG9uZSBvZiB3aGljaCBJJ20gc3VyZSBJIGNhbiBleHBsYWluLiAgICAgKi8KLQkgICAgICBpZiAoZXguWF9vcCA9PSBPX3N5bWJvbCkgCi0JCXsJCSAgCi0JCSAgYXNzZXJ0IChleC5YX2FkZF9zeW1ib2wgIT0gTlVMTCk7Ci0JCSAgaWYgKHN5bWJvbF9nZXRfYmZkc3ltIChleC5YX2FkZF9zeW1ib2wpLT5zZWN0aW9uCi0JCSAgICAgICE9IHRvY2RhdGFfc2VjdGlvbikKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkKF8oIlt0b2N2XSBzeW1ib2wgaXMgbm90IGEgdG9jIHN5bWJvbCIpKTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgdG9jX3JlbG9jID0gQkZEX1JFTE9DX1BQQ19UT0MxNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBtdXN0X2JlXzMyOgotCSAgICAgIC8qIEZJWE1FOiB0aGVzZSBuZXh0IHR3byBzcGVjaWZpY2FsbHkgc3BlY2lmeSAzMi82NCBiaXQgdG9jICAgKi8KLQkgICAgICAvKiAgICAgICAgZW50cmllcy4gV2UgZG9uJ3Qgc3VwcG9ydCB0aGVtIHRvZGF5LiBJcyB0aGlzIHRoZSAgICovCi0JICAgICAgLyogICAgICAgIHJpZ2h0IHdheSB0byBzYXkgdGhhdD8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgIHRvY19yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICAgICAgYXNfYmFkIChfKCJVbmltcGxlbWVudGVkIHRvYzMyIGV4cHJlc3Npb24gbW9kaWZpZXIiKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgbXVzdF9iZV82NDoKLQkgICAgICAvKiBGSVhNRTogc2VlIGFib3ZlICovCi0JICAgICAgdG9jX3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkgICAgICBhc19iYWQgKF8oIlVuaW1wbGVtZW50ZWQgdG9jNjQgZXhwcmVzc2lvbiBtb2RpZmllciIpKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBmcHJpbnRmKHN0ZGVyciwgCi0JCSAgICAgIF8oIlVuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIFslZF0gZnJvbSBwYXJzZV90b2NfZW50cnkhXG4iKSwKLQkJICAgICAgdG9jX2tpbmQpOwotCSAgICAgIGFib3J0KCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLwotCSAgaWYgKGZjID49IE1BWF9JTlNOX0ZJWFVQUykKLQkgICAgYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQotCSAgZml4dXBzW2ZjXS5yZWxvYyA9IHRvY19yZWxvYzsKLQkgIGZpeHVwc1tmY10uZXhwID0gZXg7Ci0JICBmaXh1cHNbZmNdLm9waW5kZXggPSAqb3BpbmRleF9wdHI7Ci0JICArK2ZjOwotCi0gICAgICAgICAgLyogT2suIFdlJ3ZlIHNldCB1cCB0aGUgZml4dXAgZm9yIHRoZSBpbnN0cnVjdGlvbi4gTm93IG1ha2UgaXQKLQkgICAgIGxvb2sgbGlrZSB0aGUgY29uc3RhbnQgMCB3YXMgZm91bmQgaGVyZSAqLwotCSAgZXguWF91bnNpZ25lZCA9IDE7Ci0JICBleC5YX29wID0gT19jb25zdGFudDsKLQkgIGV4LlhfYWRkX251bWJlciA9IDA7Ci0JICBleC5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCSAgZXguWF9vcF9zeW1ib2wgPSBOVUxMOwotCX0KLQotICAgICAgZWxzZQotI2VuZGlmCQkvKiBURV9QRSAqLwotCXsKLQkgIGlmICghIHJlZ2lzdGVyX25hbWUgKCZleCkpCi0JICAgIHsKLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfQ1IpICE9IDApCi0JCWNyX29wZXJhbmQgPSB0cnVlOwotCSAgICAgIGV4cHJlc3Npb24gKCZleCk7Ci0JICAgICAgY3Jfb3BlcmFuZCA9IGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0gICAgICBpZiAoZXguWF9vcCA9PSBPX2lsbGVnYWwpCi0JYXNfYmFkIChfKCJpbGxlZ2FsIG9wZXJhbmQiKSk7Ci0gICAgICBlbHNlIGlmIChleC5YX29wID09IE9fYWJzZW50KQotCWFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICAgICAgZWxzZSBpZiAoZXguWF9vcCA9PSBPX3JlZ2lzdGVyKQotCXsKLQkgIGluc24gPSBwcGNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlciwKLQkJCQkgICAgIChjaGFyICopIE5VTEwsIDApOwotCX0KLSAgICAgIGVsc2UgaWYgKGV4Llhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0jaWZkZWYgT0JKX0VMRgotCSAgLyogQWxsb3cgQEhBLCBATCwgQEggb24gY29uc3RhbnRzLiAqLwotCSAgY2hhciAqb3JpZ19zdHIgPSBzdHI7Ci0KLQkgIGlmICgocmVsb2MgPSBwcGNfZWxmX3N1ZmZpeCAoJnN0ciwgJmV4KSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQkgICAgc3dpdGNoIChyZWxvYykKLQkgICAgICB7Ci0JICAgICAgZGVmYXVsdDoKLQkJc3RyID0gb3JpZ19zdHI7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLQkJLyogWF91bnNpZ25lZCBpcyB0aGUgZGVmYXVsdCwgc28gaWYgdGhlIHVzZXIgaGFzIGRvbmUKLSAgICAgICAgICAgICAgICAgICBzb21ldGhpbmcgd2hpY2ggY2xlYXJlZCBpdCwgd2UgYWx3YXlzIHByb2R1Y2UgYQotICAgICAgICAgICAgICAgICAgIHNpZ25lZCB2YWx1ZS4gICovCi0JCWlmIChleC5YX3Vuc2lnbmVkCi0JCSAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9TSUdORUQpID09IDApCi0JCSAgZXguWF9hZGRfbnVtYmVyICY9IDB4ZmZmZjsKLQkJZWxzZQotCQkgIGV4LlhfYWRkX251bWJlciA9ICgoKGV4LlhfYWRkX251bWJlciAmIDB4ZmZmZikKLQkJCQkgICAgICBeIDB4ODAwMCkKLQkJCQkgICAgIC0gMHg4MDAwKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgotCQlleC5YX2FkZF9udW1iZXIgPSAoZXguWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZjsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1M6Ci0JCWV4LlhfYWRkX251bWJlciA9ICgoKChleC5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmKQotCQkJCSAgICArICgoZXguWF9hZGRfbnVtYmVyID4+IDE1KSAmIDEpKQotCQkJCSAgICYgMHhmZmZmKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotI2VuZGlmCi0JICBpbnNuID0gcHBjX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIsCi0JCQkJICAgICAoY2hhciAqKSBOVUxMLCAwKTsKLQl9Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZWxzZSBpZiAoKHJlbG9jID0gcHBjX2VsZl9zdWZmaXggKCZzdHIsICZleCkpICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JewotCSAgLyogRm9yIHRoZSBhYnNvdWx0ZSBmb3JtcyBvZiBicmFuY2hzLCBjb252ZXJ0IHRoZSBQQyByZWxhdGl2ZSBmb3JtIGJhY2sgaW50bwotCSAgICAgdGhlIGFic29sdXRlLiAgKi8KLQkgIGlmICgob3BlcmFuZC0+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+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLQotICByZXR1cm4gcmVsb2M7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXBwYy5oIGIvZ2FzL2NvbmZpZy90Yy1wcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM2Yjk3NS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXBwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qIHRjLXBwYy5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1wcGMuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfUFBDCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBmaXg7Ci0jZW5kaWYKLQotLyogU2V0IHRoZSBlbmRpYW5uZXNzIHdlIGFyZSB1c2luZy4gIERlZmF1bHQgdG8gYmlnIGVuZGlhbi4gICovCi0jaWZuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLSNlbmRpZgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgUG93ZXJQQyBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBJZiBPQkpfQ09GRiBpcyBkZWZpbmVkLCBhbmQgVEVfUEUgaXMgbm90IGRlZmluZWQsIHdlIGFyZSBhc3NlbWJsaW5nCi0gICBYQ09GRiBmb3IgQUlYIG9yIFBvd2VyTWFjLiAgSWYgVEVfUEUgaXMgZGVmaW5lZCwgd2UgYXJlIGFzc2VtYmxpbmcKLSAgIENPRkYgZm9yIFdpbmRvd3MgTlQuICAqLwotCi0jaWZkZWYgT0JKX0NPRkYKLSNpZm5kZWYgVEVfUEUKLSNkZWZpbmUgT0JKX1hDT0ZGCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCAocHBjX2FyY2ggKCkpCi1leHRlcm4gZW51bSBiZmRfYXJjaGl0ZWN0dXJlIHBwY19hcmNoIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogV2hldGhlciBvciBub3QgdGhlIHRhcmdldCBpcyBiaWcgZW5kaWFuICovCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0vKiBUaGUgdGFyZ2V0IEJGRCBmb3JtYXQuICAqLwotI2lmZGVmIE9CSl9DT0ZGCi0jaWZkZWYgVEVfUEUKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAicGUtcG93ZXJwYyIgOiAicGUtcG93ZXJwY2xlIikKLSNlbHNlCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImFpeGNvZmYtcnM2MDAwIgotI2VuZGlmCi0jZW5kaWYKLQotLyogUG93ZXJNYWMgaGFzIGEgQkZEIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIEFJWCdzLiAgKi8KLSNpZmRlZiBURV9QT1dFUk1BQwotI2lmZGVmIFRBUkdFVF9GT1JNQVQKLSN1bmRlZiBUQVJHRVRfRk9STUFUCi0jZW5kaWYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAieGNvZmYtcG93ZXJtYWMiCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAiZWxmMzItcG93ZXJwYyIgOiAiZWxmMzItcG93ZXJwY2xlIikKLSNlbmRpZgotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogJCBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uLiAgKi8KLSNkZWZpbmUgRE9MTEFSX0RPVAotCi0vKiBTdHJpbmdzIGRvIG5vdCB1c2UgYmFja3NsYXNoIGVzY2FwZXMgdW5kZXIgQ09GRi4gICovCi0jaWZkZWYgT0JKX0NPRkYKLSNkZWZpbmUgTk9fU1RSSU5HX0VTQ0FQRVMKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIGZvby0uIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0jZW5kaWYKLQotI2lmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0jZGVmaW5lIFBQQ19CSUdfRU5ESUFOIDEKLSNlbHNlCi0jZGVmaW5lIFBQQ19CSUdfRU5ESUFOIDAKLSNlbmRpZgotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIFdlIHNldCB0aGUgZnhfZG9uZSBmaWVsZCBhcHByb3ByaWF0ZWx5IGluIG1kX2FwcGx5X2ZpeC4gICovCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotDAotI2lmZGVmIFRFX1BFCi0KLS8qIFF1ZXN0aW9uIG1hcmtzIGFyZSBwZXJtaXR0ZWQgaW4gc3ltYm9sIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX1FNIDEKLQotLyogRG9uJ3QgYWRqdXN0IFRPQyByZWxvY3MuICAqLwotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShmaXhwKSBwcGNfcGVfZml4X2FkanVzdGFibGUgKGZpeHApCi1leHRlcm4gaW50IHBwY19wZV9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfWENPRkYKLQotLyogRGVjbGFyYXRpb25zIG5lZWRlZCB3aGVuIGdlbmVyYXRpbmcgWENPRkYgY29kZS4gIFhDT0ZGIGlzIGFuCi0gICBleHRlbnNpb24gb2YgQ09GRiwgdXNlZCBvbmx5IG9uIHRoZSBSUy82MDAwLiAgUmF0aGVyIHRoYW4gY3JlYXRlIGFuCi0gICBvYmoteGNvZmYsIHdlIGp1c3QgdXNlIG9iai1jb2ZmLCBhbmQgaGFuZGxlIHRoZSBleHRlbnNpb25zIGhlcmUgaW4KLSAgIHRjLXBwYy4gICovCi0KLS8qIFdlIG5lZWQgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGZvciBzeW1ib2xzLiAgKi8KLXN0cnVjdCBwcGNfdGNfc3kKLXsKLSAgLyogV2Uga2VlcCBhIGZldyBsaW5rZWQgbGlzdHMgb2Ygc3ltYm9scy4gICovCi0gIHN5bWJvbFMgKm5leHQ7Ci0gIC8qIE5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgc2hvdWxkIGJlIG91dHB1dC4gIFRoZSBSUy82MDAwIGFzc2VtYmxlcgotICAgICBvbmx5IG91dHB1dHMgc3ltYm9scyB0aGF0IGFyZSBleHRlcm5hbCBvciBhcmUgbWVudGlvbmVkIGluIGEKLSAgICAgLmdsb2JsIG9yIC5sZ2xvYmwgc3RhdGVtZW50LiAgKi8KLSAgaW50IG91dHB1dDsKLSAgLyogVGhlIHN5bWJvbCBjbGFzcy4gICovCi0gIGludCBjbGFzczsKLSAgLyogVGhlIHJlYWwgbmFtZSwgaWYgdGhlIHN5bWJvbCB3YXMgcmVuYW1lZC4gICovCi0gIGNoYXIgKnJlYWxfbmFtZTsKLSAgLyogRm9yIGEgY3NlY3Qgc3ltYm9sLCB0aGUgc3Vic2VnbWVudCB3ZSBhcmUgdXNpbmcuICBUaGlzIGlzIHplcm8KLSAgICAgZm9yIHN5bWJvbHMgdGhhdCBhcmUgbm90IGNzZWN0cy4gICovCi0gIHN1YnNlZ1Qgc3Vic2VnOwotICAvKiBGb3IgYSBjc2VjdCBvciBjb21tb24gc3ltYm9sLCB0aGUgYWxpZ25tZW50IHRvIHVzZS4gICovCi0gIGludCBhbGlnbjsKLSAgLyogRm9yIGEgZnVuY3Rpb24gc3ltYm9sLCBhIHN5bWJvbCB3aG9zZSB2YWx1ZSBpcyB0aGUgc2l6ZS4gIFRoZQotICAgICBmaWVsZCBpcyBOVUxMIGlmIHRoZXJlIGlzIG5vIHNpemUuICAqLwotICBzeW1ib2xTICpzaXplOwotICAvKiBGb3IgYSBjc2VjdCBzeW1ib2wsIHRoZSBsYXN0IHN5bWJvbCB3aGljaCBoYXMgYmVlbiBkZWZpbmVkIGluCi0gICAgIHRoaXMgY3NlY3QsIG9yIE5VTEwgaWYgbm9uZSBoYXZlIGJlZW4gZGVmaW5lZCBzbyBmYXIuICBGb3IgYSAuYnMKLSAgICAgc3ltYm9sLCB0aGUgcmVmZXJlbmNlZCBjc2VjdCBzeW1ib2wuICAqLwotICBzeW1ib2xTICp3aXRoaW47Ci19OwotCi0jZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUgc3RydWN0IHBwY190Y19zeQotCi0vKiBXZSBuZWVkIGFuIGFkZGl0aW9uYWwgYXV4ZW50IGZvciBmdW5jdGlvbiBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMgMgotCi0vKiBTcXVhcmUgYW5kIGN1cmx5IGJyYWNrZXRzIGFyZSBwZXJtaXR0ZWQgaW4gc3ltYm9sIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX0JSIDMKLQotLyogQ2Fub25pY2FsaXplIHRoZSBzeW1ib2wgbmFtZS4gICovCi0jZGVmaW5lIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZShuYW1lKSBwcGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChuYW1lKQotZXh0ZXJuIGNoYXIgKnBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgUEFSQU1TICgoY2hhciAqKSk7Ci0KLS8qIEdldCB0aGUgc3ltYm9sIGNsYXNzIGZyb20gdGhlIG5hbWUuICAqLwotI2RlZmluZSB0Y19zeW1ib2xfbmV3X2hvb2soc3ltKSBwcGNfc3ltYm9sX25ld19ob29rIChzeW0pCi1leHRlcm4gdm9pZCBwcGNfc3ltYm9sX25ld19ob29rIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0vKiBTZXQgdGhlIHN5bWJvbCBjbGFzcyBvZiBhIGxhYmVsIGJhc2VkIG9uIHRoZSBjc2VjdC4gICovCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBwcGNfZnJvYl9sYWJlbCAoc3ltKQotZXh0ZXJuIHZvaWQgcHBjX2Zyb2JfbGFiZWwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLS8qIFRPQyByZWxvY3MgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKGZpeHApIHBwY19maXhfYWRqdXN0YWJsZSAoZml4cCkKLWV4dGVybiBpbnQgcHBjX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBBIHJlbG9jYXRpb24gZnJvbSBvbmUgY3NlY3QgdG8gYW5vdGhlciBtdXN0IGJlIGtlcHQuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWFApIHBwY19mb3JjZV9yZWxvY2F0aW9uIChGSVhQKQotZXh0ZXJuIGludCBwcGNfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotLyogV2UgbmVlZCB0byBzZXQgdGhlIHNlY3Rpb24gVk1BLiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9zZWN0aW9uKHNlYykgcHBjX2Zyb2Jfc2VjdGlvbiAoc2VjKQotZXh0ZXJuIHZvaWQgcHBjX2Zyb2Jfc2VjdGlvbiBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci0KLS8qIEZpbmlzaCB1cCB0aGUgc3ltYm9sLiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLCBwdW50KSBwdW50ID0gcHBjX2Zyb2Jfc3ltYm9sIChzeW0pCi1leHRlcm4gaW50IHBwY19mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotLyogRmluaXNoIHVwIHRoZSBlbnRpcmUgc3ltdGFiLiAgKi8KLSNkZWZpbmUgdGNfYWRqdXN0X3N5bXRhYigpIHBwY19hZGp1c3Rfc3ltdGFiICgpCi1leHRlcm4gdm9pZCBwcGNfYWRqdXN0X3N5bXRhYiBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIE5pY2xhcyBBbmRlcnNzb24gPG5pY2FuQGlkYS5saXUuc2U+IHNheXMgdGhpcyBpcyBuZWVkZWQuICAqLwotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpIDIKLQotI2VuZGlmIC8qIE9CSl9YQ09GRiAqLwotCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBCcmFuY2ggcHJlZGljdGlvbiByZWxvY2F0aW9ucyBtdXN0IGZvcmNlIHJlbG9jYXRpb24sIGFzIG11c3QKLSAgIHRoZSB2dGFibGUgZGVzY3JpcHRpb24gcmVsb2NzLiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQkJCQkJXAotKChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4JCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTgkJCVwKLSB8fCAoRklYUCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQJCQlcCi0gfHwgKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLQotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04oRklYUCxTRUMpCQkJCVwKLShUQ19GT1JDRV9SRUxPQ0FUSU9OIChGSVhQKQkJCQkJCVwKLSB8fCAoKEZJWFApLT5meF9hZGRzeSAmJiAhKEZJWFApLT5meF9zdWJzeQkJCQlcCi0gICAgICYmIFNfR0VUX1NFR01FTlQgKChGSVhQKS0+ZnhfYWRkc3kpICE9IFNFQykpCi0KLS8qIFN1cHBvcnQgZm9yIFNIRl9FWENMVURFIGFuZCBTSFRfT1JERVJFRCAqLwotZXh0ZXJuIGludCBwcGNfc2VjdGlvbl9sZXR0ZXIgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1leHRlcm4gaW50IHBwY19zZWN0aW9uX3R5cGUgUEFSQU1TICgoY2hhciAqLCBzaXplX3QpKTsKLWV4dGVybiBpbnQgcHBjX3NlY3Rpb25fd29yZCBQQVJBTVMgKChjaGFyICosIHNpemVfdCkpOwotZXh0ZXJuIGludCBwcGNfc2VjdGlvbl9mbGFncyBQQVJBTVMgKChpbnQsIGludCwgaW50KSk7Ci0KLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fbGV0dGVyKExFVFRFUiwgUFRSX01TRykJcHBjX3NlY3Rpb25fbGV0dGVyIChMRVRURVIsIFBUUl9NU0cpCi0jZGVmaW5lIG1kX2VsZl9zZWN0aW9uX3R5cGUoU1RSLCBMRU4pCQlwcGNfc2VjdGlvbl90eXBlIChTVFIsIExFTikKLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fd29yZChTVFIsIExFTikJCXBwY19zZWN0aW9uX3dvcmQgKFNUUiwgTEVOKQotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl9mbGFncyhGTEFHUywgQVRUUiwgVFlQRSkJcHBjX3NlY3Rpb25fZmxhZ3MgKEZMQUdTLCBBVFRSLCBUWVBFKQotCi0vKiBBZGQgZXh0cmEgUFBDIHNlY3Rpb25zIC0tIE5vdGUsIGZvciBub3csIG1ha2UgLnNic3MyIGFuZCAuUFBDLkVNQi5zYnNzMCBhCi0gICBub3JtYWwgc2VjdGlvbiwgYW5kIG5vdCBhIGJzcyBzZWN0aW9uIHNvIHRoYXQgdGhlIGxpbmtlciBkb2Vzbid0IGNyYXRlcgotICAgd2hlbiB0cnlpbmcgdG8gbWFrZSBtb3JlIHRoYW4gMiBzZWN0aW9ucy4gICovCi0jZGVmaW5lIEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TIFwKLSAgeyAiLnRhZ3MiLAkJU0hUX09SREVSRUQsCVNIRl9BTExPQyB9LCBcCi0gIHsgIi5zZGF0YSIsCQlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LCBcCi0gIHsgIi5zYnNzIiwJCVNIVF9OT0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LCBcCi0gIHsgIi5zZGF0YTIiLAkJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgfSwgXAotICB7ICIuc2JzczIiLAkJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgfSwgXAotICB7ICIuUFBDLkVNQi5zZGF0YTAiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyB9LCBcCi0gIHsgIi5QUEMuRU1CLnNic3MwIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgfSwKLQotI2RlZmluZSB0Y19jb21tZW50X2NoYXJzIHBwY19jb21tZW50X2NoYXJzCi1leHRlcm4gY29uc3QgY2hhciAqcHBjX2NvbW1lbnRfY2hhcnM7Ci0KLS8qIEtlZXAgcmVsb2NhdGlvbnMgcmVsYXRpdmUgdG8gdGhlIEdPVCwgb3Igbm9uLVBDIHJlbGF0aXZlLiAqLwotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVgpICAgICAgICAgICAgICAgICAgICAgICAgICAJCVwKLSAgKChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzE2X0dPVE9GRiAgICAgICAgICAgICAgCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19MTzE2X0dPVE9GRiAgICAgICAgIAkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9HT1RPRkYgICAgICAgICAJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYgICAgICAgCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19HUFJFTDE2ICAgICAgICAgICAgIAkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQJCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkJCQlcCi0gICAmJiAhIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQkJCVwKLSAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpCQkJCQlcCi0gICAmJiAoKEZJWCktPmZ4X3BjcmVsCQkJCSAgICAgICAgCQlcCi0gICAgICAgfHwgKChGSVgpLT5meF9zdWJzeSAhPSBOVUxMCQkJCQlcCi0JICAgJiYgKFNfR0VUX1NFR01FTlQgKChGSVgpLT5meF9zdWJzeSkJCQkJXAotCSAgICAgICA9PSBTX0dFVF9TRUdNRU5UICgoRklYKS0+ZnhfYWRkc3kpKSkJCQlcCi0gICAgICAgfHwgU19JU19MT0NBTCAoKEZJWCktPmZ4X2FkZHN5KSkpCi0KLS8qIFdlIG11c3QgbmV2ZXIgZXZlciB0cnkgdG8gcmVzb2x2ZSByZWZlcmVuY2VzIHRvIGV4dGVybmFsbHkgdmlzaWJsZQotICAgc3ltYm9scyBpbiB0aGUgYXNzZW1ibGVyLCBiZWNhdXNlIHRoZSAubyBmaWxlIG1pZ2h0IGdvIGludG8gYSBzaGFyZWQKLSAgIGxpYnJhcnksIGFuZCBzb21lIG90aGVyIHNoYXJlZCBsaWJyYXJ5IG1pZ2h0IG92ZXJyaWRlIHRoYXQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkgIFwKLSAgKChGSVgpLT5meF9hZGRzeSA9PSBOVUxMIFwKLSAgIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpIFwKLSAgICAgICAmJiBTX0lTX0RFRklORUQgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmICEgU19JU19DT01NT04gKChGSVgpLT5meF9hZGRzeSkpKQotCi0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0vKiBjYWxsIG1kX2FwcGx5X2ZpeDMgd2l0aCBzZWdtZW50IGluc3RlYWQgb2YgbWRfYXBwbHlfZml4ICovCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLQotLyogY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24sIG5vdCBtZF9wY3JlbF9mcm9tICovCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbihGSVhQLCBTRUMpCi1leHRlcm4gbG9uZyBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzZWdUKSk7Ci0KLSNkZWZpbmUgbWRfcGFyc2VfbmFtZShuYW1lLCBleHApIHBwY19wYXJzZV9uYW1lIChuYW1lLCBleHApCi1leHRlcm4gaW50IHBwY19wYXJzZV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IGV4cHJlc3Npb25TICopKTsKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtc2guYyBiL2dhcy9jb25maWcvdGMtc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY3YTZjMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDM2ICswLDAgQEAKLS8qIHRjLXNoLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIEhpdGFjaGkgU3VwZXItSAotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICAgV3JpdHRlbiBCeSBTdGV2ZSBDaGFtYmVybGFpbgotICAgc2FjQGN5Z251cy5jb20KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSAib3Bjb2Rlcy9zaC1vcGMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiISI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiEjIjsKLQotc3RhdGljIHZvaWQgc191c2VzIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgdm9pZCBzaF9jb3VudF9yZWxvY3MgUEFSQU1TICgoYmZkICosIHNlZ1QsIFBUUikpOwotc3RhdGljIHZvaWQgc2hfZnJvYl9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBzZWdULCBQVFIpKTsKLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gKi8KLQotdm9pZCBjb25zICgpOwotdm9pZCBzX2FsaWduX2J5dGVzICgpOwotc3RhdGljIHZvaWQgc191YWNvbnMgUEFSQU1TICgoaW50KSk7Ci0KLWludCBzaGwgPSAwOwotCi1zdGF0aWMgdm9pZAotbGl0dGxlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNobCA9IDE7Ci0gIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLX0KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJpbnQiLCBjb25zLCA0fSwKLSAgeyJ3b3JkIiwgY29ucywgMn0sCi0gIHsiZm9ybSIsIGxpc3RpbmdfcHNpemUsIDB9LAotICB7ImxpdHRsZSIsIGxpdHRsZSwgMH0sCi0gIHsiaGVhZGluZyIsIGxpc3RpbmdfdGl0bGUsIDB9LAotICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKLSAgeyJwYWdlIiwgbGlzdGluZ19lamVjdCwgMH0sCi0gIHsicHJvZ3JhbSIsIHNfaWdub3JlLCAwfSwKLSAgeyJ1c2VzIiwgc191c2VzLCAwfSwKLSAgeyJ1YXdvcmQiLCBzX3VhY29ucywgMn0sCi0gIHsidWFsb25nIiwgc191YWNvbnMsIDR9LAotICB7MCwgMCwgMH0KLX07Ci0KLS8qaW50IG1kX3JlbG9jX3NpemU7ICovCi0KLWludCBzaF9yZWxheDsJCS8qIHNldCBpZiAtcmVsYXggc2VlbiAqLwotCi0vKiBXaGV0aGVyIC1zbWFsbCB3YXMgc2Vlbi4gICovCi0KLWludCBzaF9zbWFsbDsKLQotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotI2RlZmluZSBDKGEsYikgRU5DT0RFX1JFTEFYKGEsYikKLQotI2RlZmluZSBKUkVHIDE0CQkJLyogUmVnaXN0ZXIgdXNlZCBhcyBhIHRlbXAgd2hlbiByZWxheGluZyAqLwotI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDQpICsgKGxlbmd0aCkpCi0jZGVmaW5lIEdFVF9XSEFUKHgpICgoeD4+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+YXJnWzBdID09IEFfQkRJU1A4KQotICAgIHsKLSAgICAgIHBhcnNlX2V4cCAob3BfZW5kICsgMSk7Ci0gICAgICBidWlsZF9yZWxheCAob3Bjb2RlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAob3Bjb2RlLT5hcmdbMF0gPT0gQV9FTkQpCi0JewotCSAgLyogSWdub3JlIHRyYWlsaW5nIHdoaXRlc3BhY2UuICBJZiB0aGVyZSBpcyBhbnksIGl0IGhhcyBhbHJlYWR5Ci0JICAgICBiZWVuIGNvbXByZXNzZWQgdG8gYSBzaW5nbGUgc3BhY2UuICAqLwotCSAgaWYgKCpvcF9lbmQgPT0gJyAnKQotCSAgICBvcF9lbmQrKzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3BfZW5kID0gZ2V0X29wZXJhbmRzIChvcGNvZGUsIG9wX2VuZCwgb3BlcmFuZCk7Ci0JfQotICAgICAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmQpOwotCi0gICAgICBpZiAob3Bjb2RlID09IDApCi0JewotCSAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KLQkgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgyKTsKLQotCSAgd2hlcmVbMF0gPSAweDA7Ci0JICB3aGVyZVsxXSA9IDB4MDsKLQkgIGFzX2JhZCAoXygiaW52YWxpZCBvcGVyYW5kcyBmb3Igb3Bjb2RlIikpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKCpvcF9lbmQpCi0JYXNfYmFkIChfKCJleGNlc3Mgb3BlcmFuZHM6ICclcyciKSwgb3BfZW5kKTsKLQotICAgICAgYnVpbGRfTXl0ZXMgKG9wY29kZSwgb3BlcmFuZCk7Ci0gICAgfQotCi19Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZWFjaCB0aW1lIGEgbGFiZWwgZGVmaW5pdGlvbiBpcyBzZWVuLiAgSXQKLSAgIGVtaXRzIGEgQkZEX1JFTE9DX1NIX0xBQkVMIHJlbG9jIGlmIG5lY2Vzc2FyeS4gICovCi0KLXZvaWQKLXNoX2Zyb2JfbGFiZWwgKCkKLXsKLSAgc3RhdGljIGZyYWdTICpsYXN0X2xhYmVsX2ZyYWc7Ci0gIHN0YXRpYyBpbnQgbGFzdF9sYWJlbF9vZmZzZXQ7Ci0KLSAgaWYgKHNoX3JlbGF4Ci0gICAgICAmJiBzZWdfaW5mbyAobm93X3NlZyktPnRjX3NlZ21lbnRfaW5mb19kYXRhLmluX2NvZGUpCi0gICAgewotICAgICAgaW50IG9mZnNldDsKLQotICAgICAgb2Zmc2V0ID0gZnJhZ19ub3dfZml4ICgpOwotICAgICAgaWYgKGZyYWdfbm93ICE9IGxhc3RfbGFiZWxfZnJhZwotCSAgfHwgb2Zmc2V0ICE9IGxhc3RfbGFiZWxfb2Zmc2V0KQotCXsJCi0JICBmaXhfbmV3IChmcmFnX25vdywgb2Zmc2V0LCAyLCAmYWJzX3N5bWJvbCwgMCwgMCwgQkZEX1JFTE9DX1NIX0xBQkVMKTsKLQkgIGxhc3RfbGFiZWxfZnJhZyA9IGZyYWdfbm93OwotCSAgbGFzdF9sYWJlbF9vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotICAgIH0KLX0KLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgaXMgYWJvdXQgdG8gb3V0cHV0IHNvbWUKLSAgIGRhdGEuICBJdCBlbWl0cyBhIEJGRF9SRUxPQ19TSF9EQVRBIHJlbG9jIGlmIG5lY2Vzc2FyeS4gICovCi0KLXZvaWQKLXNoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCi17Ci0gIGlmIChzaF9yZWxheAotICAgICAgJiYgc2VnX2luZm8gKG5vd19zZWcpLT50Y19zZWdtZW50X2luZm9fZGF0YS5pbl9jb2RlKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIDIsICZhYnNfc3ltYm9sLCAwLCAwLAotCSAgICAgICBCRkRfUkVMT0NfU0hfREFUQSk7Ci0gICAgICBzZWdfaW5mbyAobm93X3NlZyktPnRjX3NlZ21lbnRfaW5mb19kYXRhLmluX2NvZGUgPSAwOwotICAgIH0KLX0KLQotc3ltYm9sUyAqCi1ERUZVTiAobWRfdW5kZWZpbmVkX3N5bWJvbCwgKG5hbWUpLAotICAgICAgIGNoYXIgKm5hbWUpCi17Ci0gIHJldHVybiAwOwotfQotCi0jaWZkZWYgT0JKX0NPRkYKLQotdm9pZAotREVGVU4gKHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKLX0KLQotdm9pZAotREVGVU4gKHRjX2hlYWRlcnNfaG9vaywgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2hlYWRlcnNfaG9vayBcbiIpKTsKLX0KLQotI2VuZGlmCi0KLS8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5ICovCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIDI7Ci0KLSAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gICAgIAotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSGFuZGxlIHRoZSAudXNlcyBwc2V1ZG8tb3AuICBUaGlzIHBzZXVkby1vcCBpcyB1c2VkIGp1c3QgYmVmb3JlIGEKLSAgIGNhbGwgaW5zdHJ1Y3Rpb24uICBJdCByZWZlcnMgdG8gYSBsYWJlbCBvZiB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2gKLSAgIGxvYWRzIHRoZSByZWdpc3RlciB3aGljaCB0aGUgY2FsbCB1c2VzLiAgV2UgdXNlIGl0IHRvIGdlbmVyYXRlIGEKLSAgIHNwZWNpYWwgcmVsb2MgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1zdGF0aWMgdm9pZAotc191c2VzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGV4OwotCi0gIGlmICghIHNoX3JlbGF4KQotICAgIGFzX3dhcm4gKF8oIi51c2VzIHBzZXVkby1vcCBzZWVuIHdoZW4gbm90IHJlbGF4aW5nIikpOwotCi0gIGV4cHJlc3Npb24gKCZleCk7Ci0KLSAgaWYgKGV4Llhfb3AgIT0gT19zeW1ib2wgfHwgZXguWF9hZGRfbnVtYmVyICE9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgLnVzZXMgZm9ybWF0IikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZml4X25ld19leHAgKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIDIsICZleCwgMSwgQkZEX1JFTE9DX1NIX1VTRVMpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLQotI2RlZmluZSBPUFRJT05fUkVMQVggIChPUFRJT05fTURfQkFTRSkKLSNkZWZpbmUgT1BUSU9OX0xJVFRMRSAoT1BUSU9OX01EX0JBU0UgKyAxKQotI2RlZmluZSBPUFRJT05fU01BTEwgKE9QVElPTl9MSVRUTEUgKyAxKQotCi0gIHsicmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JFTEFYfSwKLSAgeyJsaXR0bGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJVFRMRX0sCi0gIHsic21hbGwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NNQUxMfSwKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9SRUxBWDoKLSAgICAgIHNoX3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTElUVExFOgotICAgICAgc2hsID0gMTsKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fU01BTEw6Ci0gICAgICBzaF9zbWFsbCA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotU0ggb3B0aW9uczpcblwKLS1saXR0bGUJCQlnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIGNvZGVcblwKLS1yZWxheAkJCWFsdGVyIGp1bXAgaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHNcblwKLS1zbWFsbAkJCWFsaWduIHNlY3Rpb25zIHRvIDQgYnl0ZSBib3VuZGFyaWVzLCBub3QgMTZcbiIpKTsKLX0KLQwKLXZvaWQKLXRjX05vdXRfZml4X3RvX2NoYXJzICgpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19Ob3V0X2ZpeF90b19jaGFycyBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gcGFzcyBhcmd1bWVudHMgdG8gc2hfY291bnRfcmVsb2NzIHRocm91Z2gKLSAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLXN0cnVjdCBzaF9jb3VudF9yZWxvY3MKLXsKLSAgLyogU3ltYm9sIHdlIGFyZSBsb29raW5nIGZvci4gICovCi0gIHN5bWJvbFMgKnN5bTsKLSAgLyogQ291bnQgb2YgcmVsb2NzIGZvdW5kLiAgKi8KLSAgaW50IGNvdW50OwotfTsKLQotLyogQ291bnQgdGhlIG51bWJlciBvZiBmaXh1cHMgaW4gYSBzZWN0aW9uIHdoaWNoIHJlZmVyIHRvIGEgcGFydGljdWxhcgotICAgc3ltYm9sLiAgV2hlbiB1c2luZyBCRkRfQVNTRU1CTEVSLCB0aGlzIGlzIGNhbGxlZCB2aWEKLSAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNoX2NvdW50X3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IHNoX2NvdW50X3JlbG9jcyAqaW5mbyA9IChzdHJ1Y3Qgc2hfY291bnRfcmVsb2NzICopIGRhdGE7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotICBzeW1ib2xTICpzeW07Ci0gIGZpeFMgKmZpeDsKLQotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGlmIChzZWdpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIHN5bSA9IGluZm8tPnN5bTsKLSAgZm9yIChmaXggPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4ICE9IE5VTEw7IGZpeCA9IGZpeC0+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/ICJlbGYzMi1zaGwiIDogImVsZjMyLXNoIikKLQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotLyogZW5kIG9mIHRjLXNoLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtc3BhcmMuYyBiL2dhcy9jb25maWcvdGMtc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkN2I1Yy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDA4ICswLDAgQEAKLS8qIHRjLXNwYXJjLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBTUEFSQwotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MC05NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUKLSAgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvc3BhcmMuaCIKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvc3BhcmMuaCIKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHNwYXJjX2FyY2ggKmxvb2t1cF9hcmNoIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgaW5pdF9kZWZhdWx0X2FyY2ggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBzcGFyY19pcCBQQVJBTVMgKChjaGFyICosIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiopKTsKLXN0YXRpYyBpbnQgaW5fc2lnbmVkX3JhbmdlIFBBUkFNUyAoKGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotc3RhdGljIGludCBpbl91bnNpZ25lZF9yYW5nZSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgaW50IGluX2JpdGZpZWxkX3JhbmdlIFBBUkFNUyAoKGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotc3RhdGljIGludCBzcGFyY19mZnMgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBzeW50aGV0aXplX3NldHV3IFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKikpOwotc3RhdGljIHZvaWQgc3ludGhldGl6ZV9zZXRzdyBQQVJBTVMgKChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICopKTsKLXN0YXRpYyB2b2lkIHN5bnRoZXRpemVfc2V0eCBQQVJBTVMgKChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICopKTsKLXN0YXRpYyBiZmRfdm1hIEJTUiBQQVJBTVMgKChiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBpbnQgY21wX3JlZ19lbnRyeSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIGludCBwYXJzZV9rZXl3b3JkX2FyZyBQQVJBTVMgKChpbnQgKCopIChjb25zdCBjaGFyICopLCBjaGFyICoqLCBpbnQgKikpOwotc3RhdGljIGludCBwYXJzZV9jb25zdF9leHByX2FyZyBQQVJBTVMgKChjaGFyICoqLCBpbnQgKikpOwotc3RhdGljIGludCBnZXRfZXhwcmVzc2lvbiBQQVJBTVMgKChjaGFyICpzdHIpKTsKLQotLyogRGVmYXVsdCBhcmNoaXRlY3R1cmUuICAqLwotLyogPz8/IFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSBWOCwgYnV0IHNwYXJjbGl0ZSBzdXBwb3J0IHdhcyBhZGRlZAotICAgYnkgbWFraW5nIGl0IHRoZSBkZWZhdWx0LiAgR0NDIG5vdyBwYXNzZXMgLUFzcGFyY2xpdGUsIHNvIG1heWJlIHNvbWV0aW1lIGluCi0gICB0aGUgZnV0dXJlIHdlIGNhbiBzZXQgdGhpcyB0byBWOC4gICovCi0jaWZuZGVmIERFRkFVTFRfQVJDSAotI2RlZmluZSBERUZBVUxUX0FSQ0ggInNwYXJjbGl0ZSIKLSNlbmRpZgotc3RhdGljIGNoYXIgKmRlZmF1bHRfYXJjaCA9IERFRkFVTFRfQVJDSDsKLQotLyogTm9uLXplcm8gaWYgdGhlIGluaXRpYWwgdmFsdWVzIG9mIGBtYXhfYXJjaGl0ZWN0dXJlJyBhbmQgYHNwYXJjX2FyY2hfc2l6ZScKLSAgIGhhdmUgYmVlbiBzZXQuICAqLwotc3RhdGljIGludCBkZWZhdWx0X2luaXRfcDsKLQotLyogQ3VycmVudCBhcmNoaXRlY3R1cmUuICBXZSBkb24ndCBidW1wIHVwIHVubGVzcyBuZWNlc3NhcnkuICAqLwotc3RhdGljIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIGN1cnJlbnRfYXJjaGl0ZWN0dXJlID0gU1BBUkNfT1BDT0RFX0FSQ0hfVjY7Ci0KLS8qIFRoZSBtYXhpbXVtIGFyY2hpdGVjdHVyZSBsZXZlbCB3ZSBjYW4gYnVtcCB1cCB0by4KLSAgIEluIGEgMzIgYml0IGVudmlyb25tZW50LCBkb24ndCBhbGxvdyBidW1waW5nIHVwIHRvIHY5IGJ5IGRlZmF1bHQuCi0gICBUaGUgbmF0aXZlIGFzc2VtYmxlciB3b3JrcyB0aGlzIHdheS4gIFRoZSB1c2VyIGlzIHJlcXVpcmVkIHRvIHBhc3MKLSAgIGFuIGV4cGxpY2l0IGFyZ3VtZW50IGJlZm9yZSB3ZSdsbCBjcmVhdGUgdjkgb2JqZWN0IGZpbGVzLiAgSG93ZXZlciwgaWYKLSAgIHdlIGRvbid0IHNlZSBhbnkgdjkgaW5zbnMsIGEgdjhwbHVzIG9iamVjdCBmaWxlIGlzIG5vdCBjcmVhdGVkLiAgKi8KLXN0YXRpYyBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCBtYXhfYXJjaGl0ZWN0dXJlOwotCi0vKiBFaXRoZXIgMzIgb3IgNjQsIHNlbGVjdHMgZmlsZSBmb3JtYXQuICAqLwotc3RhdGljIGludCBzcGFyY19hcmNoX3NpemU7Ci0vKiBJbml0aWFsIChkZWZhdWx0KSB2YWx1ZSwgcmVjb3JkZWQgc2VwYXJhdGVseSBpbiBjYXNlIGEgdXNlciBvcHRpb24KLSAgIGNoYW5nZXMgdGhlIHZhbHVlIGJlZm9yZSBtZF9zaG93X3VzYWdlIGlzIGNhbGxlZC4gICovCi1zdGF0aWMgaW50IGRlZmF1bHRfYXJjaF9zaXplOwotCi0jaWZkZWYgT0JKX0VMRgotLyogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2OSBtZW1vcnkgbW9kZWwuICBDdXJyZW50bHkgb25seSB1c2VkIGZvcgotICAgRUxGLiAgKi8KLXN0YXRpYyBlbnVtIHsgTU1fVFNPLCBNTV9QU08sIE1NX1JNTyB9IHNwYXJjX21lbW9yeV9tb2RlbCA9IE1NX1JNTzsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGFyY2hpdGVjdHVyZV9yZXF1ZXN0ZWQ7Ci1zdGF0aWMgaW50IHdhcm5fb25fYnVtcDsKLQotLyogSWYgd2Fybl9vbl9idW1wIGFuZCB0aGUgbmVlZGVkIGFyY2hpdGVjdHVyZSBpcyBoaWdoZXIgdGhhbiB0aGlzCi0gICBhcmNoaXRlY3R1cmUsIGlzc3VlIGEgd2FybmluZy4gICovCi1zdGF0aWMgZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmU7Ci0KLS8qIE5vbi16ZXJvIGlmIGFzIHNob3VsZCBnZW5lcmF0ZSBlcnJvciBpZiBhbiB1bmRlY2xhcmVkIGdbMjNdIHJlZ2lzdGVyCi0gICBoYXMgYmVlbiB1c2VkIGluIC02NC4gICovCi1zdGF0aWMgaW50IG5vX3VuZGVjbGFyZWRfcmVnczsKLQotLyogTm9uLXplcm8gaWYgd2UgYXJlIGdlbmVyYXRpbmcgUElDIGNvZGUuICAqLwotaW50IHNwYXJjX3BpY19jb2RlOwotCi0vKiBOb24temVybyBpZiB3ZSBzaG91bGQgZ2l2ZSBhbiBlcnJvciB3aGVuIG1pc2FsaWduZWQgZGF0YSBpcyBzZWVuLiAgKi8KLXN0YXRpYyBpbnQgZW5mb3JjZV9hbGlnbmVkX2RhdGE7Ci0KLWV4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Ci0KLXN0YXRpYyBpbnQgdGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YTsKLQotLyogU3ltYm9scyBmb3IgZ2xvYmFsIHJlZ2lzdGVycyBvbiB2OS4gICovCi1zdGF0aWMgc3ltYm9sUyAqZ2xvYmFsc1s4XTsKLQotLyogVjkgYW5kIDg2eCBoYXZlIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBkYXRhLCBidXQgaW5zdHJ1Y3Rpb25zIGFyZSBhbHdheXMgYmlnCi0gICBlbmRpYW4uICBUaGUgc3BhcmNsZXQgaGFzIGJpLWVuZGlhbiBzdXBwb3J0IGJ1dCBib3RoIGRhdGEgYW5kIGluc25zIGhhdmUKLSAgIHRoZSBzYW1lIGVuZGlhbm5lc3MuICBHbG9iYWwgYHRhcmdldF9iaWdfZW5kaWFuJyBpcyB1c2VkIGZvciBkYXRhLgotICAgVGhlIGZvbGxvd2luZyBtYWNybyBpcyB1c2VkIGZvciBpbnN0cnVjdGlvbnMuICAqLwotI2lmbmRlZiBJTlNOX0JJR19FTkRJQU4KLSNkZWZpbmUgSU5TTl9CSUdfRU5ESUFOICh0YXJnZXRfYmlnX2VuZGlhbiBcCi0JCQkgfHwgZGVmYXVsdF9hcmNoX3R5cGUgPT0gc3BhcmM4NnggXAotCQkJIHx8IFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpKQotI2VuZGlmCi0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwotCi1zdGF0aWMgaW50IGxvZzIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2RhdGExIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNfc2VnIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19wcm9jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19yZXNlcnZlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jb21tb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2VtcHR5IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc191YWNvbnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX25jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19yZWdpc3RlciBQQVJBTVMgKChpbnQpKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDB9LAkvKiBEZWZhdWx0aW5nIGlzIGludmFsaWQgKDApICovCi0gIHsiY29tbW9uIiwgc19jb21tb24sIDB9LAotICB7ImVtcHR5Iiwgc19lbXB0eSwgMH0sCi0gIHsiZ2xvYmFsIiwgc19nbG9ibCwgMH0sCi0gIHsiaGFsZiIsIGNvbnMsIDJ9LAotICB7Im53b3JkIiwgc19uY29ucywgMH0sCi0gIHsib3B0aW0iLCBzX2lnbm9yZSwgMH0sCi0gIHsicHJvYyIsIHNfcHJvYywgMH0sCi0gIHsicmVzZXJ2ZSIsIHNfcmVzZXJ2ZSwgMH0sCi0gIHsic2VnIiwgc19zZWcsIDB9LAotICB7InNraXAiLCBzX3NwYWNlLCAwfSwKLSAgeyJ3b3JkIiwgY29ucywgNH0sCi0gIHsieHdvcmQiLCBjb25zLCA4fSwKLSAgeyJ1YWhhbGYiLCBzX3VhY29ucywgMn0sCi0gIHsidWF3b3JkIiwgc191YWNvbnMsIDR9LAotICB7InVheHdvcmQiLCBzX3VhY29ucywgOH0sCi0jaWZkZWYgT0JKX0VMRgotICAvKiB0aGVzZSBhcmUgc3BlY2lmaWMgdG8gc3BhcmMvc3ZyNCAqLwotICB7IjJieXRlIiwgc191YWNvbnMsIDJ9LAotICB7IjRieXRlIiwgc191YWNvbnMsIDR9LAotICB7IjhieXRlIiwgc191YWNvbnMsIDh9LAotICB7InJlZ2lzdGVyIiwgc19yZWdpc3RlciwgMH0sCi0jZW5kaWYKLSAge05VTEwsIDAsIDB9LAotfTsKLQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSAxMjsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiISI7CS8qIEpGIHJlbW92ZWQgJ3wnIGZyb20gY29tbWVudF9jaGFycyAqLwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLwotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgc3RhcnRlZCBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzCi0gICB3b3JrIGlmICcvJyBpc24ndCBvdGhlcndpc2UgZGVmaW5lZC4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLwotCi0jZGVmaW5lIGlzb2N0YWwoYykgICgodW5zaWduZWQpKChjKSAtICcwJykgPCAnOCcpCi0KLXN0cnVjdCBzcGFyY19pdAotICB7Ci0gICAgY2hhciAqZXJyb3I7Ci0gICAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gICAgc3RydWN0IG5saXN0ICpubGlzdHA7Ci0gICAgZXhwcmVzc2lvblMgZXhwOwotICAgIGV4cHJlc3Npb25TIGV4cDI7Ci0gICAgaW50IHBjcmVsOwotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgfTsKLQotc3RydWN0IHNwYXJjX2l0IHRoZV9pbnNuLCBzZXRfaW5zbjsKLQotc3RhdGljIHZvaWQgb3V0cHV0X2luc24KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqLCBzdHJ1Y3Qgc3BhcmNfaXQgKikpOwotDAotLyogVGFibGUgb2YgYXJndW1lbnRzIHRvIC1BLgotICAgVGhlIHNwYXJjX29wY29kZV9hcmNoIHRhYmxlIGluIHNwYXJjLW9wYy5jIGlzIGluc3VmZmljaWVudCBhbmQgaW5jb3JyZWN0Ci0gICBmb3IgdGhpcyB1c2UuICBUaGF0IHRhYmxlIGlzIGZvciBvcGNvZGVzIG9ubHkuICBUaGlzIHRhYmxlIGlzIGZvciBvcGNvZGVzCi0gICBhbmQgZmlsZSBmb3JtYXRzLiAgKi8KLQotZW51bSBzcGFyY19hcmNoX3R5cGVzIHt2NiwgdjcsIHY4LCBzcGFyY2xldCwgc3BhcmNsaXRlLCBzcGFyYzg2eCwgdjhwbHVzLAotCQkgICAgICAgdjhwbHVzYSwgdjksIHY5YSwgdjlfNjR9OwotCi1zdGF0aWMgc3RydWN0IHNwYXJjX2FyY2ggewotICBjaGFyICpuYW1lOwotICBjaGFyICpvcGNvZGVfYXJjaDsKLSAgZW51bSBzcGFyY19hcmNoX3R5cGVzIGFyY2hfdHlwZTsKLSAgLyogRGVmYXVsdCB3b3JkIHNpemUsIGFzIHNwZWNpZmllZCBkdXJpbmcgY29uZmlndXJhdGlvbi4KLSAgICAgQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIGNhbid0IGJlIHVzZWQgdG8gc3BlY2lmeSBkZWZhdWx0IGFyY2hpdGVjdHVyZS4gICovCi0gIGludCBkZWZhdWx0X2FyY2hfc2l6ZTsKLSAgLyogQWxsb3dhYmxlIGFyZyB0byAtQT8gICovCi0gIGludCB1c2VyX29wdGlvbl9wOwotfSBzcGFyY19hcmNoX3RhYmxlW10gPSB7Ci0gIHsgInY2IiwgInY2IiwgdjYsIDAsIDEgfSwKLSAgeyAidjciLCAidjciLCB2NywgMCwgMSB9LAotICB7ICJ2OCIsICJ2OCIsIHY4LCAzMiwgMSB9LAotICB7ICJzcGFyY2xldCIsICJzcGFyY2xldCIsIHNwYXJjbGV0LCAzMiwgMSB9LAotICB7ICJzcGFyY2xpdGUiLCAic3BhcmNsaXRlIiwgc3BhcmNsaXRlLCAzMiwgMSB9LAotICB7ICJzcGFyYzg2eCIsICJzcGFyY2xpdGUiLCBzcGFyYzg2eCwgMzIsIDEgfSwKLSAgeyAidjhwbHVzIiwgInY5IiwgdjksIDAsIDEgfSwKLSAgeyAidjhwbHVzYSIsICJ2OWEiLCB2OSwgMCwgMSB9LAotICB7ICJ2OSIsICJ2OSIsIHY5LCAwLCAxIH0sCi0gIHsgInY5YSIsICJ2OWEiLCB2OSwgMCwgMSB9LAotICAvKiBUaGlzIGV4aXN0cyB0byBhbGxvdyBjb25maWd1cmUuaW4vTWFrZWZpbGUuaW4gdG8gcGFzcyBvbmUKLSAgICAgdmFsdWUgdG8gc3BlY2lmeSBib3RoIHRoZSBkZWZhdWx0IG1hY2hpbmUgYW5kIGRlZmF1bHQgd29yZCBzaXplLiAgKi8KLSAgeyAidjktNjQiLCAidjkiLCB2OSwgNjQsIDAgfSwKLSAgeyBOVUxMLCBOVUxMLCB2OCwgMCwgMCB9Ci19OwotCi0vKiBWYXJpYW50IG9mIGRlZmF1bHRfYXJjaCAqLwotc3RhdGljIGVudW0gc3BhcmNfYXJjaF90eXBlcyBkZWZhdWx0X2FyY2hfdHlwZTsKLQotc3RhdGljIHN0cnVjdCBzcGFyY19hcmNoICoKLWxvb2t1cF9hcmNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBzdHJ1Y3Qgc3BhcmNfYXJjaCAqc2E7Ci0KLSAgZm9yIChzYSA9ICZzcGFyY19hcmNoX3RhYmxlWzBdOyBzYS0+bmFtZSAhPSBOVUxMOyBzYSsrKQotICAgIGlmIChzdHJjbXAgKHNhLT5uYW1lLCBuYW1lKSA9PSAwKQotICAgICAgYnJlYWs7Ci0gIGlmIChzYS0+bmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gc2E7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgb3Bjb2RlIGFyY2ggYW5kIHdvcmQgc2l6ZSBmcm9tIHRoZSBkZWZhdWx0Ci0gICBhcmNoaXRlY3R1cmUgbmFtZS4gICovCi0KLXN0YXRpYyB2b2lkCi1pbml0X2RlZmF1bHRfYXJjaCAoKQotewotICBzdHJ1Y3Qgc3BhcmNfYXJjaCAqc2EgPSBsb29rdXBfYXJjaCAoZGVmYXVsdF9hcmNoKTsKLQotICBpZiAoc2EgPT0gTlVMTAotICAgICAgfHwgc2EtPmRlZmF1bHRfYXJjaF9zaXplID09IDApCi0gICAgYXNfZmF0YWwgKF8oIkludmFsaWQgZGVmYXVsdCBhcmNoaXRlY3R1cmUsIGJyb2tlbiBhc3NlbWJsZXIuIikpOwotCi0gIG1heF9hcmNoaXRlY3R1cmUgPSBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2ggKHNhLT5vcGNvZGVfYXJjaCk7Ci0gIGlmIChtYXhfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX0JBRCkKLSAgICBhc19mYXRhbCAoXygiQmFkIG9wY29kZSB0YWJsZSwgYnJva2VuIGFzc2VtYmxlci4iKSk7Ci0gIGRlZmF1bHRfYXJjaF9zaXplID0gc3BhcmNfYXJjaF9zaXplID0gc2EtPmRlZmF1bHRfYXJjaF9zaXplOwotICBkZWZhdWx0X2luaXRfcCA9IDE7Ci0gIGRlZmF1bHRfYXJjaF90eXBlID0gc2EtPmFyY2hfdHlwZTsKLX0KLQotLyogQ2FsbGVkIGJ5IFRBUkdFVF9GT1JNQVQuICAqLwotCi1jb25zdCBjaGFyICoKLXNwYXJjX3RhcmdldF9mb3JtYXQgKCkKLXsKLSAgLyogV2UgZG9uJ3QgZ2V0IGEgY2hhbmNlIHRvIGluaXRpYWxpemUgYW55dGhpbmcgYmVmb3JlIHdlJ3JlIGNhbGxlZCwKLSAgICAgc28gaGFuZGxlIHRoYXQgbm93LiAgKi8KLSAgaWYgKCEgZGVmYXVsdF9pbml0X3ApCi0gICAgaW5pdF9kZWZhdWx0X2FyY2ggKCk7Ci0KLSNpZmRlZiBPQkpfQU9VVAotI2lmZGVmIFRFX05ldEJTRAotICByZXR1cm4gImEub3V0LXNwYXJjLW5ldGJzZCI7Ci0jZWxzZQotI2lmZGVmIFRFX1NQQVJDQU9VVAotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgcmV0dXJuICJhLm91dC1zdW5vcy1iaWciOwotICBlbHNlIGlmIChkZWZhdWx0X2FyY2hfdHlwZSA9PSBzcGFyYzg2eCAmJiB0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhKQotICAgIHJldHVybiAiYS5vdXQtc3Vub3MtYmlnIjsKLSAgZWxzZSByZXR1cm4gImEub3V0LXNwYXJjLWxpdHRsZSI7Ci0jZWxzZQotICByZXR1cm4gImEub3V0LXN1bm9zLWJpZyI7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBPQkpfQk9VVAotICByZXR1cm4gImIub3V0LmJpZyI7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9DT0ZGCi0jaWZkZWYgVEVfTFlOWAotICByZXR1cm4gImNvZmYtc3BhcmMtbHlueCI7Ci0jZWxzZQotICByZXR1cm4gImNvZmYtc3BhcmMiOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSAgcmV0dXJuIHNwYXJjX2FyY2hfc2l6ZSA9PSA2NCA/ICJlbGY2NC1zcGFyYyIgOiAiZWxmMzItc3BhcmMiOwotI2VuZGlmCi0KLSAgYWJvcnQgKCk7Ci19Ci0MCi0vKgotICogbWRfcGFyc2Vfb3B0aW9uCi0gKglJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICoJU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLiAgVGhlc2UgYXJlOgotICoKLSAqCS1idW1wCi0gKgkJV2FybiBvbiBhcmNoaXRlY3R1cmUgYnVtcHMuICBTZWUgYWxzbyAtQS4KLSAqCi0gKgktQXY2LCAtQXY3LCAtQXY4LCAtQXNwYXJjbGl0ZSwgLUFzcGFyY2xldAotICoJCVN0YW5kYXJkIDMyIGJpdCBhcmNoaXRlY3R1cmVzLgotICoJLUF2OHBsdXMsIC1BdjhwbHVzYQotICoJCVNwYXJjNjQgaW4gYSAzMiBiaXQgd29ybGQuCi0gKgktQXY5LCAtQXY5YQotICoJCVNwYXJjNjQgaW4gZWl0aGVyIGEgMzIgb3IgNjQgYml0IHdvcmxkICgtMzIvLTY0IHNheXMgd2hpY2gpLgotICoJCVRoaXMgdXNlZCB0byBvbmx5IG1lYW4gNjQgYml0cywgYnV0IHByb3Blcmx5IHNwZWNpZnlpbmcgaXQKLSAqCQljb21wbGljYXRlZCBnY2MncyBBU01fU1BFQ3MsIHNvIG5vdyBvcGNvZGUgc2VsZWN0aW9uIGlzCi0gKgkJc3BlY2lmaWVkIG9ydGhvZ29uYWxseSB0byB3b3JkIHNpemUgKGV4Y2VwdCB3aGVuIHNwZWNpZnlpbmcKLSAqCQl0aGUgZGVmYXVsdCwgYnV0IHRoYXQgaXMgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsKS4KLSAqCS14YXJjaD12OHBsdXMsIC14YXJjaD12OHBsdXNhCi0gKgkJU2FtZSBhcyAtQXY4cGx1c3ssYX0sIGZvciBjb21wYXRpYmlsaXR5IHdpdGggU3VuJ3MgYXNzZW1ibGVyLgotICoKLSAqCQlTZWxlY3QgdGhlIGFyY2hpdGVjdHVyZSBhbmQgcG9zc2libHkgdGhlIGZpbGUgZm9ybWF0LgotICoJCUluc3RydWN0aW9ucyBvciBmZWF0dXJlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZAotICoJCWFyY2hpdGVjdHVyZSBjYXVzZSBmYXRhbCBlcnJvcnMuCi0gKgotICoJCVRoZSBkZWZhdWx0IGlzIHRvIHN0YXJ0IGF0IHY2LCBhbmQgYnVtcCB0aGUgYXJjaGl0ZWN0dXJlIHVwCi0gKgkJd2hlbmV2ZXIgYW4gaW5zdHJ1Y3Rpb24gaXMgc2VlbiBhdCBhIGhpZ2hlciBsZXZlbC4gIEluIDMyIGJpdAotICoJCWVudmlyb25tZW50cywgdjkgaXMgbm90IGJ1bXBlZCB1cCB0bywgdGhlIHVzZXIgbXVzdCBwYXNzCi0gKiAJCS1BdjhwbHVzeyxhfS4KLSAqCi0gKgkJSWYgLWJ1bXAgaXMgc3BlY2lmaWVkLCBhIHdhcm5pbmcgaXMgcHJpbnRpbmcgd2hlbiBidW1waW5nIHRvCi0gKgkJaGlnaGVyIGxldmVscy4KLSAqCi0gKgkJSWYgYW4gYXJjaGl0ZWN0dXJlIGlzIHNwZWNpZmllZCwgYWxsIGluc3RydWN0aW9ucyBtdXN0IG1hdGNoCi0gKgkJdGhhdCBhcmNoaXRlY3R1cmUuICBBbnkgaGlnaGVyIGxldmVsIGluc3RydWN0aW9ucyBhcmUgZmxhZ2dlZAotICoJCWFzIGVycm9ycy4gIE5vdGUgdGhhdCBpbiB0aGUgMzIgYml0IGVudmlyb25tZW50IHNwZWNpZnlpbmcKLSAqCQktQXY4cGx1cyBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHY4cGx1cyBvYmplY3QgZmlsZSwgYQotICoJCXY5IGluc24gbXVzdCBiZSBzZWVuLgotICoKLSAqCQlJZiBib3RoIGFuIGFyY2hpdGVjdHVyZSBhbmQgLWJ1bXAgYXJlIHNwZWNpZmllZCwgdGhlCi0gKgkJYXJjaGl0ZWN0dXJlIHN0YXJ0cyBhdCB0aGUgc3BlY2lmaWVkIGxldmVsLCBidXQgYnVtcHMgYXJlCi0gKgkJd2FybmluZ3MuICBOb3RlIHRoYXQgd2UgY2FuJ3Qgc2V0IGBjdXJyZW50X2FyY2hpdGVjdHVyZScgdG8KLSAqCQl0aGUgcmVxdWVzdGVkIGxldmVsIGluIHRoaXMgY2FzZTogaW4gdGhlIDMyIGJpdCBlbnZpcm9ubWVudCwKLSAqCQl3ZSBzdGlsbCBtdXN0IGF2b2lkIGNyZWF0aW5nIHY4cGx1cyBvYmplY3QgZmlsZXMgdW5sZXNzIHY5Ci0gKiAJCWluc25zIGFyZSBzZWVuLgotICoKLSAqIE5vdGU6Ci0gKgkJQnVtcGluZyBiZXR3ZWVuIGluY29tcGF0aWJsZSBhcmNoaXRlY3R1cmVzIGlzIGFsd2F5cyBhbgotICoJCWVycm9yLiAgRm9yIGV4YW1wbGUsIGZyb20gc3BhcmNsaXRlIHRvIHY5LgotICovCi0KLSNpZmRlZiBPQkpfRUxGCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiQTpLOlZROnNxIjsKLSNlbHNlCi0jaWZkZWYgT0JKX0FPVVQKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJBOmsiOwotI2Vsc2UKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJBOiI7Ci0jZW5kaWYKLSNlbmRpZgotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fQlVNUCAoT1BUSU9OX01EX0JBU0UpCi0gIHsiYnVtcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQlVNUH0sCi0jZGVmaW5lIE9QVElPTl9TUEFSQyAoT1BUSU9OX01EX0JBU0UgKyAxKQotICB7InNwYXJjIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TUEFSQ30sCi0jZGVmaW5lIE9QVElPTl9YQVJDSCAoT1BUSU9OX01EX0JBU0UgKyAyKQotICB7InhhcmNoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9YQVJDSH0sCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBPUFRJT05fMzIgKE9QVElPTl9NRF9CQVNFICsgMykKLSAgeyIzMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fMzJ9LAotI2RlZmluZSBPUFRJT05fNjQgKE9QVElPTl9NRF9CQVNFICsgNCkKLSAgeyI2NCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fNjR9LAotI2RlZmluZSBPUFRJT05fVFNPIChPUFRJT05fTURfQkFTRSArIDUpCi0gIHsiVFNPIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UU099LAotI2RlZmluZSBPUFRJT05fUFNPIChPUFRJT05fTURfQkFTRSArIDYpCi0gIHsiUFNPIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QU099LAotI2RlZmluZSBPUFRJT05fUk1PIChPUFRJT05fTURfQkFTRSArIDcpCi0gIHsiUk1PIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9STU99LAotI2VuZGlmCi0jaWZkZWYgU1BBUkNfQklFTkRJQU4KLSNkZWZpbmUgT1BUSU9OX0xJVFRMRV9FTkRJQU4gKE9QVElPTl9NRF9CQVNFICsgOCkKLSAgeyJFTCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElUVExFX0VORElBTn0sCi0jZGVmaW5lIE9QVElPTl9CSUdfRU5ESUFOIChPUFRJT05fTURfQkFTRSArIDkpCi0gIHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JJR19FTkRJQU59LAotI2VuZGlmCi0jZGVmaW5lIE9QVElPTl9FTkZPUkNFX0FMSUdORURfREFUQSAoT1BUSU9OX01EX0JBU0UgKyAxMCkKLSAgeyJlbmZvcmNlLWFsaWduZWQtZGF0YSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU5GT1JDRV9BTElHTkVEX0RBVEF9LAotI2RlZmluZSBPUFRJT05fTElUVExFX0VORElBTl9EQVRBIChPUFRJT05fTURfQkFTRSArIDExKQotICB7ImxpdHRsZS1lbmRpYW4tZGF0YSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElUVExFX0VORElBTl9EQVRBfSwKLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIE9QVElPTl9OT19VTkRFQ0xBUkVEX1JFR1MgKE9QVElPTl9NRF9CQVNFICsgMTIpCi0gIHsibm8tdW5kZWNsYXJlZC1yZWdzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19VTkRFQ0xBUkVEX1JFR1N9LAotI2VuZGlmCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIC8qIFdlIGRvbid0IGdldCBhIGNoYW5jZSB0byBpbml0aWFsaXplIGFueXRoaW5nIGJlZm9yZSB3ZSdyZSBjYWxsZWQsCi0gICAgIHNvIGhhbmRsZSB0aGF0IG5vdy4gICovCi0gIGlmICghIGRlZmF1bHRfaW5pdF9wKQotICAgIGluaXRfZGVmYXVsdF9hcmNoICgpOwotCi0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSBPUFRJT05fQlVNUDoKLSAgICAgIHdhcm5fb25fYnVtcCA9IDE7Ci0gICAgICB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZSA9IFNQQVJDX09QQ09ERV9BUkNIX1Y2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9YQVJDSDoKLSAgICAgIC8qIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTdW4ncyBhc3NlbWJsZXIuICAqLwotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAidjhwbHVzIikgIT0gMAotCSAgJiYgc3RyY21wIChhcmcsICJ2OHBsdXNhIikgIT0gMCkKLQl7Ci0JICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIC14YXJjaD0lcyIpLCBhcmcpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotICAgIGNhc2UgJ0EnOgotICAgICAgewotCXN0cnVjdCBzcGFyY19hcmNoICpzYTsKLQllbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCBvcGNvZGVfYXJjaDsKLQotCXNhID0gbG9va3VwX2FyY2ggKGFyZyk7Ci0JaWYgKHNhID09IE5VTEwKLQkgICAgfHwgISBzYS0+dXNlcl9vcHRpb25fcCkKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJpbnZhbGlkIGFyY2hpdGVjdHVyZSAtQSVzIiksIGFyZyk7Ci0JICAgIHJldHVybiAwOwotCSAgfQotCi0Jb3Bjb2RlX2FyY2ggPSBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2ggKHNhLT5vcGNvZGVfYXJjaCk7Ci0JaWYgKG9wY29kZV9hcmNoID09IFNQQVJDX09QQ09ERV9BUkNIX0JBRCkKLQkgIGFzX2ZhdGFsIChfKCJCYWQgb3Bjb2RlIHRhYmxlLCBicm9rZW4gYXNzZW1ibGVyLiIpKTsKLQotCW1heF9hcmNoaXRlY3R1cmUgPSBvcGNvZGVfYXJjaDsKLQlhcmNoaXRlY3R1cmVfcmVxdWVzdGVkID0gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fU1BBUkM6Ci0gICAgICAvKiBJZ25vcmUgLXNwYXJjLCB1c2VkIGJ5IFN1bk9TIG1ha2UgZGVmYXVsdCAucy5vIHJ1bGUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FTkZPUkNFX0FMSUdORURfREFUQToKLSAgICAgIGVuZm9yY2VfYWxpZ25lZF9kYXRhID0gMTsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgU1BBUkNfQklFTkRJQU4KLSAgICBjYXNlIE9QVElPTl9MSVRUTEVfRU5ESUFOOgotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotICAgICAgaWYgKGRlZmF1bHRfYXJjaF90eXBlICE9IHNwYXJjbGV0KQotCWFzX2ZhdGFsICgiVGhpcyB0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCAtRUwiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0xJVFRMRV9FTkRJQU5fREFUQToKLSAgICAgIHRhcmdldF9saXR0bGVfZW5kaWFuX2RhdGEgPSAxOwotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotICAgICAgaWYgKGRlZmF1bHRfYXJjaF90eXBlICE9IHNwYXJjODZ4Ci0JICAmJiBkZWZhdWx0X2FyY2hfdHlwZSAhPSB2OSkKLQlhc19mYXRhbCAoIlRoaXMgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgLS1saXR0bGUtZW5kaWFuLWRhdGEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0JJR19FTkRJQU46Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0FPVVQKLSAgICBjYXNlICdrJzoKLSAgICAgIHNwYXJjX3BpY19jb2RlID0gMTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBPUFRJT05fMzI6Ci0gICAgY2FzZSBPUFRJT05fNjQ6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqKmxpc3QsICoqbDsKLQotCXNwYXJjX2FyY2hfc2l6ZSA9IGMgPT0gT1BUSU9OXzMyID8gMzIgOiA2NDsKLQlsaXN0ID0gYmZkX3RhcmdldF9saXN0ICgpOwotCWZvciAobCA9IGxpc3Q7ICpsICE9IE5VTEw7IGwrKykKLQkgIHsKLQkgICAgaWYgKHNwYXJjX2FyY2hfc2l6ZSA9PSAzMikKLQkgICAgICB7Ci0JCWlmIChzdHJjbXAgKCpsLCAiZWxmMzItc3BhcmMiKSA9PSAwKQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWYgKHN0cmNtcCAoKmwsICJlbGY2NC1zcGFyYyIpID09IDApCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCWlmICgqbCA9PSBOVUxMKQotCSAgYXNfZmF0YWwgKF8oIk5vIGNvbXBpbGVkIGluIHN1cHBvcnQgZm9yICVkIGJpdCBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkJICAgIHNwYXJjX2FyY2hfc2l6ZSk7Ci0JZnJlZSAobGlzdCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1RTTzoKLSAgICAgIHNwYXJjX21lbW9yeV9tb2RlbCA9IE1NX1RTTzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUFNPOgotICAgICAgc3BhcmNfbWVtb3J5X21vZGVsID0gTU1fUFNPOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9STU86Ci0gICAgICBzcGFyY19tZW1vcnlfbW9kZWwgPSBNTV9STU87Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUSc6Ci0gICAgICAvKiBReSAtIGRvIGVtaXQgLmNvbW1lbnQKLQkgUW4gLSBkbyBub3QgZW1pdCAuY29tbWVudCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICAgIC8qIHVzZSAuc3RhYiBpbnN0ZWFkIG9mIC5zdGFiLmV4Y2wgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncSc6Ci0gICAgICAvKiBxdWljayAtLSBuYXRpdmUgYXNzZW1ibGVyIGRvZXMgZmV3ZXIgY2hlY2tzICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0snOgotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiUElDIikgIT0gMCkKLQlhc193YXJuIChfKCJVbnJlY29nbml6ZWQgb3B0aW9uIGZvbGxvd2luZyAtSyIpKTsKLSAgICAgIGVsc2UKLQlzcGFyY19waWNfY29kZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PX1VOREVDTEFSRURfUkVHUzoKLSAgICAgIG5vX3VuZGVjbGFyZWRfcmVncyA9IDE7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGNvbnN0IHN0cnVjdCBzcGFyY19hcmNoICphcmNoOwotCi0gIC8qIFdlIGRvbid0IGdldCBhIGNoYW5jZSB0byBpbml0aWFsaXplIGFueXRoaW5nIGJlZm9yZSB3ZSdyZSBjYWxsZWQsCi0gICAgIHNvIGhhbmRsZSB0aGF0IG5vdy4gICovCi0gIGlmICghIGRlZmF1bHRfaW5pdF9wKQotICAgIGluaXRfZGVmYXVsdF9hcmNoICgpOwotCi0gIGZwcmludGYoc3RyZWFtLCBfKCJTUEFSQyBvcHRpb25zOlxuIikpOwotICBmb3IgKGFyY2ggPSAmc3BhcmNfYXJjaF90YWJsZVswXTsgYXJjaC0+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+PSAzMikKLQkJCSAgICB7Ci0JCQkgICAgICBnb3RvIGVycm9yOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBjIC09ICcwJzsKLQkJCX0KLQkJICAgICAgbWFzayA9IGM7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCi0JCSAgaWYgKChtYXNrICYgfjEpID09IDIgJiYgc3BhcmNfYXJjaF9zaXplID09IDY0Ci0JCSAgICAgICYmIG5vX3VuZGVjbGFyZWRfcmVncyAmJiAhIGdsb2JhbHMgW21hc2tdKQotCQkgICAgYXNfYmFkIChfKCJkZXRlY3RlZCBnbG9iYWwgcmVnaXN0ZXIgdXNlIG5vdCAiCi0JCQkgICAgICAiY292ZXJlZCBieSAucmVnaXN0ZXIgcHNldWRvLW9wIikpOwotCi0JCSAgLyogR290IHRoZSByZWdpc3Rlciwgbm93IGZpZ3VyZSBvdXQgd2hlcmUKLQkJICAgICBpdCBnb2VzIGluIHRoZSBvcGNvZGUuICAqLwotCQkgIHN3aXRjaCAoKmFyZ3MpCi0JCSAgICB7Ci0JCSAgICBjYXNlICcxJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMTQ7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICcyJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2s7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdkJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMjU7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdyJzoKLQkJICAgICAgb3Bjb2RlIHw9IChtYXNrIDw8IDI1KSB8IChtYXNrIDw8IDE0KTsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ08nOgotCQkgICAgICBvcGNvZGUgfD0gKG1hc2sgPDwgMjUpIHwgKG1hc2sgPDwgMCk7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnZSc6CQkvKiBuZXh0IG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAqLwotCSAgICBjYXNlICd2JzoKLQkgICAgY2FzZSAnVic6Ci0KLQkgICAgY2FzZSAnZic6Ci0JICAgIGNhc2UgJ0InOgotCSAgICBjYXNlICdSJzoKLQotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnSCc6Ci0JICAgIGNhc2UgJ0onOgotCSAgICAgIHsKLQkJY2hhciBmb3JtYXQ7Ci0KLQkJaWYgKCpzKysgPT0gJyUnCi0JCSAgICAmJiAoKGZvcm1hdCA9ICpzKSA9PSAnZicpCi0JCSAgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKisrcykpCi0JCSAgewotCQkgICAgZm9yIChtYXNrID0gMDsgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKTsgKytzKQotCQkgICAgICB7Ci0JCQltYXNrID0gMTAgKiBtYXNrICsgKCpzIC0gJzAnKTsKLQkJICAgICAgfQkJLyogcmVhZCB0aGUgbnVtYmVyICovCi0KLQkJICAgIGlmICgoKmFyZ3MgPT0gJ3YnCi0JCQkgfHwgKmFyZ3MgPT0gJ0InCi0JCQkgfHwgKmFyZ3MgPT0gJ0gnKQotCQkJJiYgKG1hc2sgJiAxKSkKLQkJICAgICAgewotCQkJYnJlYWs7Ci0JCSAgICAgIH0JCS8qIHJlZ2lzdGVyIG11c3QgYmUgZXZlbiBudW1iZXJlZCAqLwotCi0JCSAgICBpZiAoKCphcmdzID09ICdWJwotCQkJIHx8ICphcmdzID09ICdSJwotCQkJIHx8ICphcmdzID09ICdKJykKLQkJCSYmIChtYXNrICYgMykpCi0JCSAgICAgIHsKLQkJCWJyZWFrOwotCQkgICAgICB9CQkvKiByZWdpc3RlciBtdXN0IGJlIG11bHRpcGxlIG9mIDQgKi8KLQotCQkgICAgaWYgKG1hc2sgPj0gNjQpCi0JCSAgICAgIHsKLQkJCWlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKLQkJCSAgZXJyb3JfbWVzc2FnZSA9IF8oIjogVGhlcmUgYXJlIG9ubHkgNjQgZiByZWdpc3RlcnM7IFswLTYzXSIpOwotCQkJZWxzZQotCQkJICBlcnJvcl9tZXNzYWdlID0gXygiOiBUaGVyZSBhcmUgb25seSAzMiBmIHJlZ2lzdGVyczsgWzAtMzFdIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9CS8qIG9uIGVycm9yICovCi0JCSAgICBlbHNlIGlmIChtYXNrID49IDMyKQotCQkgICAgICB7Ci0JCQlpZiAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUCAobWF4X2FyY2hpdGVjdHVyZSkpCi0JCQkgIHsKLQkJCSAgICB2OV9hcmdfcCA9IDE7Ci0JCQkgICAgbWFzayAtPSAzMTsJLyogd3JhcCBoaWdoIGJpdCAqLwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBlcnJvcl9tZXNzYWdlID0gXygiOiBUaGVyZSBhcmUgb25seSAzMiBmIHJlZ2lzdGVyczsgWzAtMzFdIik7Ci0JCQkgICAgZ290byBlcnJvcjsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgYnJlYWs7Ci0JCSAgfQkvKiBpZiBub3QgYW4gJ2YnIHJlZ2lzdGVyLiAqLwotCi0JCXN3aXRjaCAoKmFyZ3MpCi0JCSAgewotCQkgIGNhc2UgJ3YnOgotCQkgIGNhc2UgJ1YnOgotCQkgIGNhc2UgJ2UnOgotCQkgICAgb3Bjb2RlIHw9IFJTMSAobWFzayk7Ci0JCSAgICBjb250aW51ZTsKLQotCi0JCSAgY2FzZSAnZic6Ci0JCSAgY2FzZSAnQic6Ci0JCSAgY2FzZSAnUic6Ci0JCSAgICBvcGNvZGUgfD0gUlMyIChtYXNrKTsKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgY2FzZSAnZyc6Ci0JCSAgY2FzZSAnSCc6Ci0JCSAgY2FzZSAnSic6Ci0JCSAgICBvcGNvZGUgfD0gUkQgKG1hc2spOwotCQkgICAgY29udGludWU7Ci0JCSAgfQkJLyogcGFjayBpdCBpbi4gKi8KLQotCQlrbm93ICgwKTsKLQkJYnJlYWs7Ci0JICAgICAgfQkJCS8qIGZsb2F0IGFyZyAqLwotCi0JICAgIGNhc2UgJ0YnOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZzciIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcwJzoJCS8qIDY0IGJpdCBpbW1lZGlhdGUgKHNldCwgc2V0c3csIHNldHggaW5zbikgKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOyAvKiByZWxvYyBoYW5kbGVkIGVsc2V3aGVyZSAqLwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2wnOgkJLyogMjIgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDX1dESVNQMjI7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ0wnOgkJLyogMzAgYml0IGltbWVkaWF0ZSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyOwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdoJzoKLQkgICAgY2FzZSAnbic6CQkvKiAyMiBiaXQgaW1tZWRpYXRlICovCi0JICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkMyMjsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdpJzoJCS8qIDEzIGJpdCBpbW1lZGlhdGUgKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQzEzOwotCi0JICAgICAgLyogZmFsbHRocm91Z2ggKi8KLQotCSAgICBpbW1lZGlhdGU6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJcysrOwotCi0JICAgICAgewotCQljaGFyICpzMTsKLQkJY2hhciAqb3BfYXJnID0gTlVMTDsKLQkJZXhwcmVzc2lvblMgb3BfZXhwOwotCQliZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgb2xkX3JlbG9jID0gdGhlX2luc24ucmVsb2M7Ci0KLQkJLyogQ2hlY2sgZm9yICVoaSwgZXRjLiAgKi8KLQkJaWYgKCpzID09ICclJykKLQkJICB7Ci0JCSAgICBzdGF0aWMgY29uc3Qgc3RydWN0IG9wcyB7Ci0JCSAgICAgIC8qIFRoZSBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gYXNzZW1ibGVyLiAgKi8KLQkJICAgICAgY2hhciAqbmFtZTsKLQkJICAgICAgLyogc3RybGVuIChuYW1lKSwgcHJlY29tcHV0ZWQgZm9yIHNwZWVkICovCi0JCSAgICAgIGludCBsZW47Ci0JCSAgICAgIC8qIFRoZSByZWxvYyB0aGlzIHBzZXVkby1vcCB0cmFuc2xhdGVzIHRvLiAgKi8KLQkJICAgICAgaW50IHJlbG9jOwotCQkgICAgICAvKiBOb24temVybyBpZiBmb3Igdjkgb25seS4gICovCi0JCSAgICAgIGludCB2OV9wOwotCQkgICAgICAvKiBOb24temVybyBpZiBjYW4gYmUgdXNlZCBpbiBwYy1yZWxhdGl2ZSBjb250ZXh0cy4gICovCi0JCSAgICAgIGludCBwY3JlbF9wOy8qRklYTUU6d2lwKi8KLQkJICAgIH0gb3BzW10gPSB7Ci0JCSAgICAgIC8qIGhpeC9sb3ggbXVzdCBhcHBlYXIgYmVmb3JlIGhpL2xvIHNvICVoaXggd29uJ3QgYmUKLQkJCSBtaXN0YWtlbiBmb3IgJWhpLiAgKi8KLQkJICAgICAgeyAiaGl4IiwgMywgQkZEX1JFTE9DX1NQQVJDX0hJWDIyLCAxLCAwIH0sCi0JCSAgICAgIHsgImxveCIsIDMsIEJGRF9SRUxPQ19TUEFSQ19MT1gxMCwgMSwgMCB9LAotCQkgICAgICB7ICJoaSIsIDIsIEJGRF9SRUxPQ19ISTIyLCAwLCAxIH0sCi0JCSAgICAgIHsgImxvIiwgMiwgQkZEX1JFTE9DX0xPMTAsIDAsIDEgfSwKLQkJICAgICAgeyAiaGgiLCAyLCBCRkRfUkVMT0NfU1BBUkNfSEgyMiwgMSwgMSB9LAotCQkgICAgICB7ICJobSIsIDIsIEJGRF9SRUxPQ19TUEFSQ19ITTEwLCAxLCAxIH0sCi0JCSAgICAgIHsgImxtIiwgMiwgQkZEX1JFTE9DX1NQQVJDX0xNMjIsIDEsIDEgfSwKLQkJICAgICAgeyAiaDQ0IiwgMywgQkZEX1JFTE9DX1NQQVJDX0g0NCwgMSwgMCB9LAotCQkgICAgICB7ICJtNDQiLCAzLCBCRkRfUkVMT0NfU1BBUkNfTTQ0LCAxLCAwIH0sCi0JCSAgICAgIHsgImw0NCIsIDMsIEJGRF9SRUxPQ19TUEFSQ19MNDQsIDEsIDAgfSwKLQkJICAgICAgeyAidWhpIiwgMywgQkZEX1JFTE9DX1NQQVJDX0hIMjIsIDEsIDAgfSwKLQkJICAgICAgeyAidWxvIiwgMywgQkZEX1JFTE9DX1NQQVJDX0hNMTAsIDEsIDAgfSwKLQkJICAgICAgeyBOVUxMIH0KLQkJICAgIH07Ci0JCSAgICBjb25zdCBzdHJ1Y3Qgb3BzICpvOwotICAKLQkJICAgIGZvciAobyA9IG9wczsgby0+bmFtZTsgbysrKQotCQkgICAgICBpZiAoc3RybmNtcCAocyArIDEsIG8tPm5hbWUsIG8tPmxlbikgPT0gMCkKLQkJCWJyZWFrOwotCQkgICAgaWYgKG8tPm5hbWUgPT0gTlVMTCkKLQkJICAgICAgYnJlYWs7Ci0JCSAgICAgIAotCQkgICAgaWYgKHNbby0+bGVuICsgMV0gIT0gJygnKQotCQkgICAgICB7Ci0JCQlhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHM6ICUlJXMgcmVxdWlyZXMgYXJndW1lbnRzIGluICgpIiksIG8tPm5hbWUpOwotCQkJcmV0dXJuIHNwZWNpYWxfY2FzZTsKLQkJICAgICAgfQotCi0JCSAgICBvcF9hcmcgPSBvLT5uYW1lOwotCQkgICAgdGhlX2luc24ucmVsb2MgPSBvLT5yZWxvYzsKLQkJICAgIHMgKz0gby0+bGVuICsgMjsKLQkJICAgIHY5X2FyZ19wID0gby0+djlfcDsKLQkJICB9Ci0KLQkJLyogTm90ZSB0aGF0IGlmIHRoZSBnZXRfZXhwcmVzc2lvbigpIGZhaWxzLCB3ZSB3aWxsIHN0aWxsCi0JCSAgIGhhdmUgY3JlYXRlZCBVIGVudHJpZXMgaW4gdGhlIHN5bWJvbCB0YWJsZSBmb3IgdGhlCi0JCSAgICdzeW1ib2xzJyBpbiB0aGUgaW5wdXQgc3RyaW5nLiAgVHJ5IG5vdCB0byBjcmVhdGUgVQotCQkgICBzeW1ib2xzIGZvciByZWdpc3RlcnMsIGV0Yy4gICovCi0KLQkJLyogVGhpcyBzdHVmZiBjaGVja3MgdG8gc2VlIGlmIHRoZSBleHByZXNzaW9uIGVuZHMgaW4KLQkJICAgKyVyZWcuICBJZiBpdCBkb2VzLCBpdCByZW1vdmVzIHRoZSByZWdpc3RlciBmcm9tCi0JCSAgIHRoZSBleHByZXNzaW9uLCBhbmQgcmUtc2V0cyAncycgdG8gcG9pbnQgdG8gdGhlCi0JCSAgIHJpZ2h0IHBsYWNlLiAgKi8KLQotCQlpZiAob3BfYXJnKQotCQkgIHsKLQkJICAgIGludCBucGFyID0gMDsKLQotCQkgICAgZm9yIChzMSA9IHM7ICpzMSAmJiAqczEgIT0gJywnICYmICpzMSAhPSAnXSc7IHMxKyspCi0JCSAgICAgIGlmICgqczEgPT0gJygnKQotCQkJbnBhcisrOwotCQkgICAgICBlbHNlIGlmICgqczEgPT0gJyknKQotCQkJewotCQkJICBpZiAoIW5wYXIpCi0JCQkgICAgYnJlYWs7Ci0JCQkgIG5wYXItLTsKLQkJCX0KLQotCQkgICAgaWYgKCpzMSAhPSAnKScpCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiSWxsZWdhbCBvcGVyYW5kczogJSUlcyByZXF1aXJlcyBhcmd1bWVudHMgaW4gKCkiKSwgb3BfYXJnKTsKLQkJCXJldHVybiBzcGVjaWFsX2Nhc2U7Ci0JCSAgICAgIH0KLQkJICAgIAotCQkgICAgKnMxID0gJ1wwJzsKLQkJICAgICh2b2lkKSBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JCSAgICAqczEgPSAnKSc7Ci0JCSAgICBzID0gczEgKyAxOwotCQkgICAgaWYgKCpzID09ICcsJyB8fCAqcyA9PSAnXScgfHwgISpzKQotCQkgICAgICBjb250aW51ZTsKLQkJICAgIGlmICgqcyAhPSAnKycgJiYgKnMgIT0gJy0nKQotCQkgICAgICB7Ci0JCQlhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHM6IENhbid0IGRvIGFyaXRobWV0aWNzIG90aGVyIHRoYW4gKyBhbmQgLSBpbnZvbHZpbmcgJSUlcygpIiksIG9wX2FyZyk7Ci0JCQlyZXR1cm4gc3BlY2lhbF9jYXNlOwotCQkgICAgICB9Ci0JCSAgICAqczEgPSAnMCc7Ci0JCSAgICBzID0gczE7Ci0JCSAgICBvcF9leHAgPSB0aGVfaW5zbi5leHA7Ci0JCSAgICBtZW1zZXQgKCZ0aGVfaW5zbi5leHAsIDAsIHNpemVvZih0aGVfaW5zbi5leHApKTsKLQkJICB9Ci0KLQkJZm9yIChzMSA9IHM7ICpzMSAmJiAqczEgIT0gJywnICYmICpzMSAhPSAnXSc7IHMxKyspIDsKLQotCQlpZiAoczEgIT0gcyAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgczFbLTFdKSkKLQkJICB7Ci0JCSAgICBpZiAoczFbLTJdID09ICclJyAmJiBzMVstM10gPT0gJysnKQotCQkgICAgICBzMSAtPSAzOwotCQkgICAgZWxzZSBpZiAoc3RyY2hyICgiZ29saTAxMjM0NTY3ODkiLCBzMVstMl0pICYmIHMxWy0zXSA9PSAnJScgJiYgczFbLTRdID09ICcrJykKLQkJICAgICAgczEgLT0gNDsKLQkJICAgIGVsc2UKLQkJICAgICAgczEgPSBOVUxMOwotCQkgICAgaWYgKHMxKQotCQkgICAgICB7Ci0JCQkqczEgPSAnXDAnOwotCQkJaWYgKG9wX2FyZyAmJiBzMSA9PSBzICsgMSkKLQkJCSAgdGhlX2luc24uZXhwLlhfb3AgPSBPX2Fic2VudDsKLQkJCWVsc2UKLQkJCSAgKHZvaWQpIGdldF9leHByZXNzaW9uIChzKTsKLQkJCSpzMSA9ICcrJzsKLQkJCWlmIChvcF9hcmcpCi0JCQkgICpzID0gJyknOwotCQkJcyA9IHMxOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgczEgPSBOVUxMOwotCi0JCWlmICghczEpCi0JCSAgewotCQkgICAgKHZvaWQpIGdldF9leHByZXNzaW9uIChzKTsKLQkJICAgIGlmIChvcF9hcmcpCi0JCSAgICAgICpzID0gJyknOwotCQkgICAgcyA9IGV4cHJfZW5kOwotCQkgIH0KLQotCQlpZiAob3BfYXJnKQotCQkgIHsKLQkJICAgIHRoZV9pbnNuLmV4cDIgPSB0aGVfaW5zbi5leHA7Ci0JCSAgICB0aGVfaW5zbi5leHAgPSBvcF9leHA7Ci0JCSAgICBpZiAodGhlX2luc24uZXhwMi5YX29wID09IE9fYWJzZW50KQotCQkgICAgICB0aGVfaW5zbi5leHAyLlhfb3AgPSBPX2lsbGVnYWw7Ci0JCSAgICBlbHNlIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2Fic2VudCkKLQkJICAgICAgewotCQkJdGhlX2luc24uZXhwID0gdGhlX2luc24uZXhwMjsKLQkJCXRoZV9pbnNuLmV4cDIuWF9vcCA9IE9faWxsZWdhbDsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgICAgewotCQkJdmFsdWVUIHZhbCA9IHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXI7Ci0JCQlzd2l0Y2ggKHRoZV9pbnNuLnJlbG9jKQotCQkJICB7Ci0JCQkgIGRlZmF1bHQ6Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSEgyMjoKLQkJCSAgICB2YWwgPSBCU1IgKHZhbCwgMzIpOwotCQkJICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE0yMjoKLQkJCSAgY2FzZSBCRkRfUkVMT0NfSEkyMjoKLQkJCSAgICB2YWwgPSAodmFsID4+IDEwKSAmIDB4M2ZmZmZmOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0hNMTA6Ci0JCQkgICAgdmFsID0gQlNSICh2YWwsIDMyKTsKLQkJCSAgICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX0xPMTA6Ci0JCQkgICAgdmFsICY9IDB4M2ZmOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0g0NDoKLQkJCSAgICB2YWwgPj49IDIyOwotCQkJICAgIHZhbCAmPSAweDNmZmZmZjsKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19NNDQ6Ci0JCQkgICAgdmFsID4+PSAxMjsKLQkJCSAgICB2YWwgJj0gMHgzZmY7Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTDQ0OgotCQkJICAgIHZhbCAmPSAweGZmZjsKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19ISVgyMjoKLQkJCSAgICB2YWwgPSB+IHZhbDsKLQkJCSAgICB2YWwgPSAodmFsID4+IDEwKSAmIDB4M2ZmZmZmOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0xPWDEwOgotCQkJICAgIHZhbCA9ICh2YWwgJiAweDNmZikgfCAweDFjMDA7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIH0KLQkJCXRoZV9pbnNuLmV4cCA9IHRoZV9pbnNuLmV4cDI7Ci0JCQl0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICs9IHZhbDsKLQkJCXRoZV9pbnNuLmV4cDIuWF9vcCA9IE9faWxsZWdhbDsKLQkJCXRoZV9pbnNuLnJlbG9jID0gb2xkX3JlbG9jOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmICh0aGVfaW5zbi5leHAyLlhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgICAgewotCQkJYXNfYmFkIChfKCJJbGxlZ2FsIG9wZXJhbmRzOiBDYW4ndCBhZGQgbm9uLWNvbnN0YW50IGV4cHJlc3Npb24gdG8gJSUlcygpIiksIG9wX2FyZyk7Ci0JCQlyZXR1cm4gc3BlY2lhbF9jYXNlOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWlmIChvbGRfcmVsb2MgIT0gQkZEX1JFTE9DX1NQQVJDMTMKLQkJCSAgICB8fCB0aGVfaW5zbi5yZWxvYyAhPSBCRkRfUkVMT0NfTE8xMAotCQkJICAgIHx8IHNwYXJjX2FyY2hfc2l6ZSAhPSA2NAotCQkJICAgIHx8IHNwYXJjX3BpY19jb2RlKQotCQkJICB7Ci0JCQkgICAgYXNfYmFkIChfKCJJbGxlZ2FsIG9wZXJhbmRzOiBDYW4ndCBkbyBhcml0aG1ldGljcyBpbnZvbHZpbmcgJSUlcygpIG9mIGEgcmVsb2NhdGFibGUgc3ltYm9sIiksIG9wX2FyZyk7Ci0JCQkgICAgcmV0dXJuIHNwZWNpYWxfY2FzZTsKLQkJCSAgfQotCQkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkNfT0xPMTA7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgICAgIC8qIENoZWNrIGZvciBjb25zdGFudHMgdGhhdCBkb24ndCByZXF1aXJlIGVtaXR0aW5nIGEgcmVsb2MuICAqLwotCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgJiYgdGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSAwCi0JCSAgJiYgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IDApCi0JCXsKLQkJICAvKiBGb3IgcGMtcmVsYXRpdmUgY2FsbCBpbnN0cnVjdGlvbnMsIHdlIHJlamVjdAotCQkgICAgIGNvbnN0YW50cyB0byBnZXQgYmV0dGVyIGNvZGUuICAqLwotCQkgIGlmICh0aGVfaW5zbi5wY3JlbAotCQkgICAgICAmJiB0aGVfaW5zbi5yZWxvYyA9PSBCRkRfUkVMT0NfMzJfUENSRUxfUzIKLQkJICAgICAgJiYgaW5fc2lnbmVkX3JhbmdlICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyLCAweDNmZmYpKQotCQkgICAgewotCQkgICAgICBlcnJvcl9tZXNzYWdlID0gXygiOiBQQy1yZWxhdGl2ZSBvcGVyYW5kIGNhbid0IGJlIGEgY29uc3RhbnQiKTsKLQkJICAgICAgZ290byBlcnJvcjsKLQkJICAgIH0KLQotCQkgIC8qIENvbnN0YW50cyB0aGF0IHdvbid0IGZpdCBhcmUgY2hlY2tlZCBpbiBtZF9hcHBseV9maXgzCi0JCSAgICAgYW5kIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uCi0JCSAgICAgPz8/IEl0IHdvdWxkIGJlIHByZWZlcmFibGUgdG8gaW5zdGFsbCB0aGUgY29uc3RhbnRzCi0JCSAgICAgaW50byB0aGUgaW5zbiBoZXJlIGFuZCBzYXZlIGhhdmluZyB0byBjcmVhdGUgYSBmaXhTCi0JCSAgICAgZm9yIGVhY2ggb25lLiAgVGhlcmUgYWxyZWFkeSBleGlzdHMgY29kZSB0byBoYW5kbGUKLQkJICAgICBhbGwgdGhlIHZhcmlvdXMgY2FzZXMgKGUuZy4gaW4gbWRfYXBwbHlfZml4MyBhbmQKLQkJICAgICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKSBzbyBkdXBsaWNhdGluZyBhbGwgdGhhdCBjb2RlCi0JCSAgICAgaGVyZSBpc24ndCByaWdodC4gICovCi0JCX0KLQotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ2EnOgotCSAgICAgIGlmICgqcysrID09ICdhJykKLQkJewotCQkgIG9wY29kZSB8PSBBTk5VTDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0EnOgotCSAgICAgIHsKLQkJaW50IGFzaSA9IDA7Ci0KLQkJLyogUGFyc2UgYW4gYXNpLiAgKi8KLQkJaWYgKCpzID09ICcjJykKLQkJICB7Ci0JCSAgICBpZiAoISBwYXJzZV9rZXl3b3JkX2FyZyAoc3BhcmNfZW5jb2RlX2FzaSwgJnMsICZhc2kpKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIEFTSSBuYW1lIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKCEgcGFyc2VfY29uc3RfZXhwcl9hcmcgKCZzLCAmYXNpKSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBBU0kgZXhwcmVzc2lvbiIpOwotCQkJZ290byBlcnJvcjsKLQkJICAgICAgfQotCQkgICAgaWYgKGFzaSA8IDAgfHwgYXNpID4gMjU1KQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIEFTSSBudW1iZXIiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCW9wY29kZSB8PSBBU0kgKGFzaSk7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0JCQkvKiBhbHRlcm5hdGUgc3BhY2UgKi8KLQotCSAgICBjYXNlICdwJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVwc3IiLCA0KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAncSc6CQkvKiBmbG9hdGluZyBwb2ludCBxdWV1ZSAqLwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZxIiwgMykgPT0gMCkKLQkJewotCQkgIHMgKz0gMzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1EnOgkJLyogY29wcm9jZXNzb3IgcXVldWUgKi8KLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVjcSIsIDMpID09IDApCi0JCXsKLQkJICBzICs9IDM7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdTJzoKLQkgICAgICBpZiAoc3RyY21wIChzdHIsICJzZXQiKSA9PSAwCi0JCSAgfHwgc3RyY21wIChzdHIsICJzZXR1dyIpID09IDApCi0JCXsKLQkJICBzcGVjaWFsX2Nhc2UgPSBTUEVDSUFMX0NBU0VfU0VUOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChzdHIsICJzZXRzdyIpID09IDApCi0JCXsKLQkJICBzcGVjaWFsX2Nhc2UgPSBTUEVDSUFMX0NBU0VfU0VUU1c7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKHN0ciwgInNldHgiKSA9PSAwKQotCQl7Ci0JCSAgc3BlY2lhbF9jYXNlID0gU1BFQ0lBTF9DQVNFX1NFVFg7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJuY21wIChzdHIsICJmZGl2IiwgNCkgPT0gMCkKLQkJewotCQkgIHNwZWNpYWxfY2FzZSA9IFNQRUNJQUxfQ0FTRV9GRElWOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnbyc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlYXNpIiwgNCkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSA0OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3MnOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZwcnMiLCA1KSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDU7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnRSc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlY2NyIiwgNCkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSA0OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3QnOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJXRiciIsIDQpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gNDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICd3JzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiV3aW0iLCA0KSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAneCc6Ci0JICAgICAgewotCQljaGFyICpwdXNoID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQlleHByZXNzaW9uUyBlOwotCi0JCWlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0JCWV4cHJlc3Npb24gKCZlKTsKLQkJaWYgKGUuWF9vcCA9PSBPX2NvbnN0YW50KQotCQkgIHsKLQkJICAgIGludCBuID0gZS5YX2FkZF9udW1iZXI7Ci0JCSAgICBpZiAobiAhPSBlLlhfYWRkX251bWJlciB8fCAobiAmIH4weDFmZikgIT0gMCkKLQkJICAgICAgYXNfYmFkIChfKCJPUEYgaW1tZWRpYXRlIG9wZXJhbmQgb3V0IG9mIHJhbmdlICgwLTB4MWZmKSIpKTsKLQkJICAgIGVsc2UKLQkJICAgICAgb3Bjb2RlIHw9IGUuWF9hZGRfbnVtYmVyIDw8IDU7Ci0JCSAgfQotCQllbHNlCi0JCSAgYXNfYmFkIChfKCJub24taW1tZWRpYXRlIE9QRiBvcGVyYW5kLCBpZ25vcmVkIikpOwotCQlzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQlpbnB1dF9saW5lX3BvaW50ZXIgPSBwdXNoOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgY2FzZSAneSc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIleSIsIDIpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gMjsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICd1JzoKLQkgICAgY2FzZSAnVSc6Ci0JICAgICAgewotCQkvKiBQYXJzZSBhIHNwYXJjbGV0IGNwcmVnLiAgKi8KLQkJaW50IGNwcmVnOwotCQlpZiAoISBwYXJzZV9rZXl3b3JkX2FyZyAoc3BhcmNfZW5jb2RlX3NwYXJjbGV0X2NwcmVnLCAmcywgJmNwcmVnKSkKLQkJICB7Ci0JCSAgICBlcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIGNwcmVnIG5hbWUiKTsKLQkJICAgIGdvdG8gZXJyb3I7Ci0JCSAgfQotCQlvcGNvZGUgfD0gKCphcmdzID09ICdVJyA/IFJTMSAoY3ByZWcpIDogUkQgKGNwcmVnKSk7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKLQkgICAgfQkJCS8qIHN3aXRjaCBvbiBhcmcgY29kZSAqLwotCi0JICAvKiBCcmVhayBvdXQgb2YgZm9yKCkgbG9vcC4gICovCi0JICBicmVhazsKLQl9CQkJLyogZm9yIGVhY2ggYXJnIHRoYXQgd2UgZXhwZWN0ICovCi0KLSAgICBlcnJvcjoKLSAgICAgIGlmIChtYXRjaCA9PSAwKQotCXsKLQkgIC8qIEFyZ3MgZG9uJ3QgbWF0Y2guICovCi0JICBpZiAoJmluc25bMV0gLSBzcGFyY19vcGNvZGVzIDwgc3BhcmNfbnVtX29wY29kZXMKLQkgICAgICAmJiAoaW5zbi0+bmFtZSA9PSBpbnNuWzFdLm5hbWUKLQkJICB8fCAhc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpKSkKLQkgICAgewotCSAgICAgICsraW5zbjsKLQkgICAgICBzID0gYXJnc1N0YXJ0OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHMlcyIpLCBlcnJvcl9tZXNzYWdlKTsKLQkgICAgICByZXR1cm4gc3BlY2lhbF9jYXNlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGhhdmUgYSBtYXRjaC4gIE5vdyBzZWUgaWYgdGhlIGFyY2hpdGVjdHVyZSBpcyBvay4gICovCi0JICBpbnQgbmVlZGVkX2FyY2hfbWFzayA9IGluc24tPmFyY2hpdGVjdHVyZTsKLQotCSAgaWYgKHY5X2FyZ19wKQotCSAgICB7Ci0JICAgICAgbmVlZGVkX2FyY2hfbWFzayAmPSB+ICgoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOSkKLQkJCQkgICAgIHwgKDEgPDwgU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKSk7Ci0JICAgICAgbmVlZGVkX2FyY2hfbWFzayB8PSAoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOSk7Ci0JICAgIH0KLQotCSAgaWYgKG5lZWRlZF9hcmNoX21hc2sgJiBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JICAgIDsgLyogb2sgKi8KLQkgIC8qIENhbiB3ZSBidW1wIHVwIHRoZSBhcmNoaXRlY3R1cmU/ICAqLwotCSAgZWxzZSBpZiAobmVlZGVkX2FyY2hfbWFzayAmIFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKG1heF9hcmNoaXRlY3R1cmUpKQotCSAgICB7Ci0JICAgICAgZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgbmVlZGVkX2FyY2hpdGVjdHVyZSA9Ci0JCXNwYXJjX2ZmcyAoU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAobWF4X2FyY2hpdGVjdHVyZSkKLQkJCSAgICYgbmVlZGVkX2FyY2hfbWFzayk7Ci0KLQkgICAgICBhc3NlcnQgKG5lZWRlZF9hcmNoaXRlY3R1cmUgPD0gU1BBUkNfT1BDT0RFX0FSQ0hfTUFYKTsKLQkgICAgICBpZiAod2Fybl9vbl9idW1wCi0JCSAgJiYgbmVlZGVkX2FyY2hpdGVjdHVyZSA+IHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiYXJjaGl0ZWN0dXJlIGJ1bXBlZCBmcm9tIFwiJXNcIiB0byBcIiVzXCIgb24gXCIlc1wiIiksCi0JCQkgICBzcGFyY19vcGNvZGVfYXJjaHNbY3VycmVudF9hcmNoaXRlY3R1cmVdLm5hbWUsCi0JCQkgICBzcGFyY19vcGNvZGVfYXJjaHNbbmVlZGVkX2FyY2hpdGVjdHVyZV0ubmFtZSwKLQkJCSAgIHN0cik7Ci0JCSAgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmUgPSBuZWVkZWRfYXJjaGl0ZWN0dXJlOwotCQl9Ci0JICAgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgPSBuZWVkZWRfYXJjaGl0ZWN0dXJlOwotCSAgICB9Ci0JICAvKiBDb25mbGljdC4gICovCi0JICAvKiA/Pz8gVGhpcyBzZWVtcyB0byBiZSBhIGJpdCBmcmFnaWxlLiAgV2hhdCBpZiB0aGUgbmV4dCBlbnRyeSBpbgotCSAgICAgdGhlIG9wY29kZSB0YWJsZSBpcyB0aGUgb25lIHdlIHdhbnQgYW5kIGl0IGlzIHN1cHBvcnRlZD8KLQkgICAgIEl0IGlzIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIHRhYmxlIHRvZGF5IHNvIHRoYXQgdGhpcyBjYW4ndAotCSAgICAgaGFwcGVuIGJ1dCB3aGF0IGFib3V0IHRvbW9ycm93PyAgKi8KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBhcmNoLHByaW50ZWRfb25lX3AgPSAwOwotCSAgICAgIGNoYXIgKnA7Ci0JICAgICAgY2hhciByZXF1aXJlZF9hcmNoc1tTUEFSQ19PUENPREVfQVJDSF9NQVggKiAxNl07Ci0KLQkgICAgICAvKiBDcmVhdGUgYSBsaXN0IG9mIHRoZSBhcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydCB0aGUgaW5zbi4gICovCi0JICAgICAgbmVlZGVkX2FyY2hfbWFzayAmPSB+IFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKG1heF9hcmNoaXRlY3R1cmUpOwotCSAgICAgIHAgPSByZXF1aXJlZF9hcmNoczsKLQkgICAgICBhcmNoID0gc3BhcmNfZmZzIChuZWVkZWRfYXJjaF9tYXNrKTsKLQkgICAgICB3aGlsZSAoKDEgPDwgYXJjaCkgPD0gbmVlZGVkX2FyY2hfbWFzaykKLQkJewotCQkgIGlmICgoMSA8PCBhcmNoKSAmIG5lZWRlZF9hcmNoX21hc2spCi0JCSAgICB7Ci0JCSAgICAgIGlmIChwcmludGVkX29uZV9wKQotCQkJKnArKyA9ICd8JzsKLQkJICAgICAgc3RyY3B5IChwLCBzcGFyY19vcGNvZGVfYXJjaHNbYXJjaF0ubmFtZSk7Ci0JCSAgICAgIHAgKz0gc3RybGVuIChwKTsKLQkJICAgICAgcHJpbnRlZF9vbmVfcCA9IDE7Ci0JCSAgICB9Ci0JCSAgKythcmNoOwotCQl9Ci0KLQkgICAgICBhc19iYWQgKF8oIkFyY2hpdGVjdHVyZSBtaXNtYXRjaCBvbiBcIiVzXCIuIiksIHN0cik7Ci0JICAgICAgYXNfdHNrdHNrIChfKCIgKFJlcXVpcmVzICVzOyByZXF1ZXN0ZWQgYXJjaGl0ZWN0dXJlIGlzICVzLikiKSwKLQkJCSByZXF1aXJlZF9hcmNocywKLQkJCSBzcGFyY19vcGNvZGVfYXJjaHNbbWF4X2FyY2hpdGVjdHVyZV0ubmFtZSk7Ci0JICAgICAgcmV0dXJuIHNwZWNpYWxfY2FzZTsKLQkgICAgfQotCX0gLyogaWYgbm8gbWF0Y2ggKi8KLQotICAgICAgYnJlYWs7Ci0gICAgfSAvKiBmb3JldmVyIGxvb2tpbmcgZm9yIGEgbWF0Y2ggKi8KLQotICB0aGVfaW5zbi5vcGNvZGUgPSBvcGNvZGU7Ci0gIHJldHVybiBzcGVjaWFsX2Nhc2U7Ci19Ci0KLS8qIFBhcnNlIGFuIGFyZ3VtZW50IHRoYXQgY2FuIGJlIGV4cHJlc3NlZCBhcyBhIGtleXdvcmQuCi0gICAoZWc6ICNTdG9yZVN0b3JlIG9yICVjY2ZyKS4KLSAgIFRoZSByZXN1bHQgaXMgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4KLSAgIElmIHN1Y2Nlc3NmdWwsIElOUFVUX1BPSU5URVIgaXMgdXBkYXRlZC4gICovCi0KLXN0YXRpYyBpbnQKLXBhcnNlX2tleXdvcmRfYXJnIChsb29rdXBfZm4sIGlucHV0X3BvaW50ZXJQLCB2YWx1ZVApCi0gICAgIGludCAoKmxvb2t1cF9mbikgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0gICAgIGNoYXIgKippbnB1dF9wb2ludGVyUDsKLSAgICAgaW50ICp2YWx1ZVA7Ci17Ci0gIGludCB2YWx1ZTsKLSAgY2hhciBjLCAqcCwgKnE7Ci0KLSAgcCA9ICppbnB1dF9wb2ludGVyUDsKLSAgZm9yIChxID0gcCArICgqcCA9PSAnIycgfHwgKnAgPT0gJyUnKTsKLSAgICAgICBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnEpIHx8ICpxID09ICdfJzsKLSAgICAgICArK3EpCi0gICAgY29udGludWU7Ci0gIGMgPSAqcTsKLSAgKnEgPSAwOwotICB2YWx1ZSA9ICgqbG9va3VwX2ZuKSAocCk7Ci0gICpxID0gYzsKLSAgaWYgKHZhbHVlID09IC0xKQotICAgIHJldHVybiAwOwotICAqdmFsdWVQID0gdmFsdWU7Ci0gICppbnB1dF9wb2ludGVyUCA9IHE7Ci0gIHJldHVybiAxOwotfQotCi0vKiBQYXJzZSBhbiBhcmd1bWVudCB0aGF0IGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbi4KLSAgIFRoZSByZXN1bHQgaXMgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4gICovCi0KLXN0YXRpYyBpbnQKLXBhcnNlX2NvbnN0X2V4cHJfYXJnIChpbnB1dF9wb2ludGVyUCwgdmFsdWVQKQotICAgICBjaGFyICoqaW5wdXRfcG9pbnRlclA7Ci0gICAgIGludCAqdmFsdWVQOwotewotICBjaGFyICpzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gKmlucHV0X3BvaW50ZXJQOwotICAvKiBUaGUgbmV4dCBleHByZXNzaW9uIG1heSBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIGNvbnN0YW50Ci0gICAgIChzYXkgaWYgd2UncmUgbm90IHByb2Nlc3NpbmcgdGhlIHJpZ2h0IHZhcmlhbnQgb2YgdGhlIGluc24pLgotICAgICBEb24ndCBjYWxsIGV4cHJlc3Npb24gdW5sZXNzIHdlJ3JlIHN1cmUgaXQgd2lsbCBzdWNjZWVkIGFzIGl0IHdpbGwKLSAgICAgc2lnbmFsIGFuIGVycm9yICh3aGljaCB3ZSB3YW50IHRvIGRlZmVyIHVudGlsIGxhdGVyKS4gICovCi0gIC8qIEZJWE1FOiBJdCBtaWdodCBiZSBiZXR0ZXIgdG8gZGVmaW5lIG1kX29wZXJhbmQgYW5kIGhhdmUgaXQgcmVjb2duaXplCi0gICAgIHRoaW5ncyBsaWtlICVhc2ksIGV0Yy4gYnV0IGNvbnRpbnVpbmcgdGhhdCByb3V0ZSB0aHJvdWdoIHRvIHRoZSBlbmQKLSAgICAgaXMgYSBsb3Qgb2Ygd29yay4gICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICclJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgKmlucHV0X3BvaW50ZXJQID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICByZXR1cm4gMDsKLSAgKnZhbHVlUCA9IGV4cC5YX2FkZF9udW1iZXI7Ci0gIHJldHVybiAxOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIHNwYXJjX2lwIHRvIHBhcnNlIGFuIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfZXhwcmVzc2lvbiAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNhdmVfaW47Ci0gIHNlZ1Qgc2VnOwotCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgc2VnID0gZXhwcmVzc2lvbiAoJnRoZV9pbnNuLmV4cCk7Ci0gIGlmIChzZWcgIT0gYWJzb2x1dGVfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IHRleHRfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IGRhdGFfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IGJzc19zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0gICAgewotICAgICAgdGhlX2luc24uZXJyb3IgPSBfKCJiYWQgc2VnbWVudCIpOwotICAgICAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbWRfYXNzZW1ibGUgdG8gb3V0cHV0IG9uZSBpbnNuLiAgKi8KLQotc3RhdGljIHZvaWQKLW91dHB1dF9pbnNuIChpbnNuLCB0aGVfaW5zbikKLSAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLSAgICAgc3RydWN0IHNwYXJjX2l0ICp0aGVfaW5zbjsKLXsKLSAgY2hhciAqdG9QID0gZnJhZ19tb3JlICg0KTsKLQotICAvKiBwdXQgb3V0IHRoZSBvcGNvZGUgKi8KLSAgaWYgKElOU05fQklHX0VORElBTikKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuICh0b1AsICh2YWx1ZVQpIHRoZV9pbnNuLT5vcGNvZGUsIDQpOwotICBlbHNlCi0gICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAodG9QLCAodmFsdWVUKSB0aGVfaW5zbi0+b3Bjb2RlLCA0KTsKLQotICAvKiBwdXQgb3V0IHRoZSBzeW1ib2wtZGVwZW5kZW50IHN0dWZmICovCi0gIGlmICh0aGVfaW5zbi0+cmVsb2MgIT0gQkZEX1JFTE9DX05PTkUpCi0gICAgewotICAgICAgZml4UyAqZml4UCA9ICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCS8qIHdoaWNoIGZyYWcgKi8KLQkJCQkgKHRvUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwJLyogd2hlcmUgKi8KLQkJCQkgNCwJCS8qIHNpemUgKi8KLQkJCQkgJnRoZV9pbnNuLT5leHAsCi0JCQkJIHRoZV9pbnNuLT5wY3JlbCwKLQkJCQkgdGhlX2luc24tPnJlbG9jKTsKLSAgICAgIC8qIFR1cm4gb2ZmIG92ZXJmbG93IGNoZWNraW5nIGluIGZpeHVwX3NlZ21lbnQuICBXZSdsbCBkbyBvdXIKLQkgb3duIG92ZXJmbG93IGNoZWNraW5nIGluIG1kX2FwcGx5X2ZpeDMuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlCi0JIHRoZSBpbnNuIHNpemUgaXMgNCBhbmQgZml4dXBfc2VnbWVudCB3aWxsIHNpZ25hbCBhbiBvdmVyZmxvdyBmb3IKLQkgbGFyZ2UgOCBieXRlIHF1YW50aXRpZXMuICAqLwotICAgICAgZml4UC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotICAgICAgaWYgKHRoZV9pbnNuLT5yZWxvYyA9PSBCRkRfUkVMT0NfU1BBUkNfT0xPMTApCi0JZml4UC0+dGNfZml4X2RhdGEgPSB0aGVfaW5zbi0+ZXhwMi5YX2FkZF9udW1iZXI7Ci0gICAgfQotCi0gIGxhc3RfaW5zbiA9IGluc247Ci0gIGxhc3Rfb3Bjb2RlID0gdGhlX2luc24tPm9wY29kZTsKLX0KLQwKLS8qCi0gIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBtZF9hdG9mIGluIG02OGsuYy4gIEkgdGhpbmsgdGhpcyBpcyByaWdodCwKLSAgYnV0IEknbSBub3Qgc3VyZS4KLQotICBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICAqLwotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgaSxwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+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+MHhmZjsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19PTE8xMDoKLQkgIHZhbCAmPSAweDNmZjsKLQkgIHZhbCArPSBmaXhQLT50Y19maXhfZGF0YTsKLQkgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQzEzOgotCSAgaWYgKCEgaW5fc2lnbmVkX3JhbmdlICh2YWwsIDB4MWZmZikpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGluc24gfD0gdmFsICYgMHgxZmZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyOgotCSAgdmFsID0gKHZhbCA+PiAyKSArIDE7Ci0JICAvKiBGQUxMVEhST1VHSCAqLwotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0JBU0UyMjoKLQkgIGluc24gfD0gdmFsICYgMHgzZmZmZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0g0NDoKLQkgIGlmICghZml4UC0+ZnhfYWRkc3kpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHR2YWwgPSB2YWw7Ci0JICAgICAgdHZhbCA+Pj0gMjI7Ci0JICAgICAgaW5zbiB8PSB0dmFsICYgMHgzZmZmZmY7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfTTQ0OgotCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKLQkgICAgaW5zbiB8PSAodmFsID4+IDEyKSAmIDB4M2ZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19MNDQ6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICBpbnNuIHw9IHZhbCAmIDB4ZmZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19ISVgyMjoKLQkgIGlmICghZml4UC0+ZnhfYWRkc3kpCi0JICAgIHsKLQkgICAgICB2YWwgXj0gfiAob2Zmc2V0VCkgMDsKLQkgICAgICBpbnNuIHw9ICh2YWwgPj4gMTApICYgMHgzZmZmZmY7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE9YMTA6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICBpbnNuIHw9IDB4MWMwMCB8ICh2YWwgJiAweDNmZik7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX05PTkU6Ci0JZGVmYXVsdDoKLQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCV8oImJhZCBvciB1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlOiAweCUwMngiKSwKLQkJCWZpeFAtPmZ4X3JfdHlwZSk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChJTlNOX0JJR19FTkRJQU4pCi0JYmZkX3B1dGIzMiAoaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgYnVmKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyIChpbnNuLCAodW5zaWduZWQgY2hhciAqKSBidWYpOwotICAgIH0KLQotICAvKiBBcmUgd2UgZmluaXNoZWQgd2l0aCB0aGlzIHJlbG9jYXRpb24gbm93PyAgKi8KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IDAgJiYgIWZpeFAtPmZ4X3BjcmVsKQotICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQKLSAgIGZvcm1hdC4gICovCi1hcmVsZW50ICoqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhwOwotewotICBzdGF0aWMgYXJlbGVudCAqcmVsb2NzWzNdOwotICBhcmVsZW50ICpyZWxvYzsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgcmVsb2NzWzBdID0gcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2NzWzFdID0gTlVMTDsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTIyOgotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTA6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUxfUzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkMxMzoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQzIyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0JBU0UxMzoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE2OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTk6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMjoKLSAgICBjYXNlIEJGRF9SRUxPQ182NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ181OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDXzY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfNzoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ18xMDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ18xMToKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19ISDIyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0hNMTA6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE0yMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19QQ19ISDIyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1BDX0hNMTA6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfUENfTE0yMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19INDQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTTQ0OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0w0NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19ISVgyMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19MT1gxMDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19SRVYzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19PTE8xMDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX0FPVVQpCi0gIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIFBJQyBjb2RlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgZGlmZmVyZW50Ci0gICAgIHNldCBvZiByZWxvY3MuICAqLwotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBHT1RfTkFNRSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotI2Vsc2UKLSNkZWZpbmUgR09UX05BTUUgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jZW5kaWYKLQotICAvKiBUaGlzIGNvZGUgbXVzdCBiZSBwYXJhbGxlbCB0byB0aGUgT0JKX0VMRiB0Y19maXhfYWRqdXN0YWJsZS4gICovCi0KLSAgaWYgKHNwYXJjX3BpY19jb2RlKQotICAgIHsKLSAgICAgIHN3aXRjaCAoY29kZSkKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfMzJfUENSRUxfUzI6Ci0JICBpZiAoISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQotCSAgICAgIHx8IFNfSVNfQ09NTU9OIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICB8fCBTX0lTX0VYVEVSTkFMIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICB8fCBTX0lTX1dFQUsgKGZpeHAtPmZ4X2FkZHN5KSkKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19XUExUMzA7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ19ISTIyOgotCSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSwgR09UX05BTUUpID09IDApCi0JICAgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfUEMyMjsKLQkgIGVsc2UKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19HT1QyMjsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DX0xPMTA6Ci0JICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpLCBHT1RfTkFNRSkgPT0gMCkKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19QQzEwOwotCSAgZWxzZQotCSAgICBjb2RlID0gQkZEX1JFTE9DX1NQQVJDX0dPVDEwOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfU1BBUkMxMzoKLQkgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfR09UMTM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfQU9VVCkgKi8KLQotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfT0xPMTApCi0gICAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIEJGRF9SRUxPQ19MTzEwKTsKLSAgZWxzZQotICAgIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAwKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oImludGVybmFsIGVycm9yOiBjYW4ndCBleHBvcnQgcmVsb2MgdHlwZSAlZCAoYCVzJykiKSwKLQkJICAgIGZpeHAtPmZ4X3JfdHlwZSwgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICAgIHhmcmVlIChyZWxvYyk7Ci0gICAgICByZWxvY3NbMF0gPSBOVUxMOwotICAgICAgcmV0dXJuIHJlbG9jczsKLSAgICB9Ci0KLSAgLyogQEAgV2h5IGZ4X2FkZG51bWJlciBzb21ldGltZXMgYW5kIGZ4X29mZnNldCBvdGhlciB0aW1lcz8gICovCi0jaWZkZWYgT0JKX0FPVVQKLQotICBpZiAocmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSA9PSAwCi0gICAgICB8fCBjb2RlID09IEJGRF9SRUxPQ19TUEFSQ19QQzEwCi0gICAgICB8fCBjb2RlID09IEJGRF9SRUxPQ19TUEFSQ19QQzIyKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UgaWYgKHNwYXJjX3BpY19jb2RlCi0JICAgJiYgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgotCSAgICYmIGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAmJiAoU19JU19FWFRFUk5BTCAoZml4cC0+ZnhfYWRkc3kpCi0JICAgICAgIHx8IFNfSVNfV0VBSyAoZml4cC0+ZnhfYWRkc3kpKQotCSAgICYmIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpCi0JICAgJiYgISBTX0lTX0NPTU1PTiAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0IC0gcmVsb2MtPmFkZHJlc3M7Ci0KLSNlbHNlIC8qIGVsZiBvciBjb2ZmICovCi0KLSAgaWYgKHJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUgPT0gMAotICAgICAgfHwgY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfUEMxMAotICAgICAgfHwgY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfUEMyMikKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlIGlmIChzeW1ib2xfc2VjdGlvbl9wIChmaXhwLT5meF9hZGRzeSkpCi0gICAgcmVsb2MtPmFkZGVuZCA9IChzZWN0aW9uLT52bWEKLQkJICAgICArIGZpeHAtPmZ4X2FkZG51bWJlcgotCQkgICAgICsgbWRfcGNyZWxfZnJvbSAoZml4cCkpOwotICBlbHNlCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSNlbmRpZgotCi0gIC8qIFdlIGV4cGFuZCBSX1NQQVJDX09MTzEwIHRvIFJfU1BBUkNfTE8xMCBhbmQgUl9TUEFSQ18xMwotICAgICBvbiB0aGUgc2FtZSBsb2NhdGlvbi4gICovCi0gIGlmIChjb2RlID09IEJGRF9SRUxPQ19TUEFSQ19PTE8xMCkKLSAgICB7Ci0gICAgICByZWxvY3NbMV0gPSByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICAgICAgcmVsb2NzWzJdID0gTlVMTDsKLQotICAgICAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKSk7Ci0gICAgICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgICAgIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBCRkRfUkVMT0NfU1BBUkMxMyk7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+dGNfZml4X2RhdGE7Ci0gICAgfQotCi0gIHJldHVybiByZWxvY3M7Ci19Ci0MCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19CQkJCS8qIG1kX3VuZGVmaW5lZF9zeW1ib2woKSAqLwotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0jaWZuZGVmIE9CSl9FTEYKLSAgLyogVGhpcyBpcyBub3QgcmlnaHQgZm9yIEVMRjsgYS5vdXQgd2FudHMgaXQsIGFuZCBDT0ZGIHdpbGwgZm9yY2UKLSAgICAgdGhlIGFsaWdubWVudCBhbnl3YXlzLiAgKi8KLSAgdmFsdWVUIGFsaWduID0gKCh2YWx1ZVQpIDEKLQkJICA8PCAodmFsdWVUKSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpKTsKLSAgdmFsdWVUIG5ld3NpemU7Ci0gIC8qIHR1cm4gYWxpZ25tZW50IHZhbHVlIGludG8gYSBtYXNrICovCi0gIGFsaWduLS07Ci0gIG5ld3NpemUgPSAoc2l6ZSArIGFsaWduKSAmIH5hbGlnbjsKLSAgcmV0dXJuIG5ld3NpemU7Ci0jZWxzZQotICByZXR1cm4gc2l6ZTsKLSNlbmRpZgotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgc3BhcmMsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9mZnNldCwgcGx1cwotICAgaXRzIHNpemUuICBUaGlzIGdldHMgdXMgdG8gdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4KLSAgICg/Pz8gSXMgdGhpcyByaWdodD8gIEZJWE1FLVNPT04pICovCi1sb25nIAotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgbG9uZyByZXQ7Ci0KLSAgcmV0ID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotICBpZiAoISBzcGFyY19waWNfY29kZQotICAgICAgfHwgZml4UC0+ZnhfYWRkc3kgPT0gTlVMTAotICAgICAgfHwgc3ltYm9sX3NlY3Rpb25fcCAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldCArPSBmaXhQLT5meF9zaXplOwotICByZXR1cm4gcmV0OwotfQotDAotLyogUmV0dXJuIGxvZzIgKFZBTFVFKSwgb3IgLTEgaWYgVkFMVUUgaXMgbm90IGFuIGV4YWN0IHBvc2l0aXZlIHBvd2VyCi0gICBvZiB0d28uICAqLwotCi1zdGF0aWMgaW50Ci1sb2cyICh2YWx1ZSkKLSAgICAgaW50IHZhbHVlOwotewotICBpbnQgc2hpZnQ7Ci0KLSAgaWYgKHZhbHVlIDw9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIGZvciAoc2hpZnQgPSAwOyAodmFsdWUgJiAxKSA9PSAwOyB2YWx1ZSA+Pj0gMSkKLSAgICArK3NoaWZ0OwotCi0gIHJldHVybiAodmFsdWUgPT0gMSkgPyBzaGlmdCA6IC0xOwotfQotCi0vKgotICogc29ydCBvZiBsaWtlIHNfbGNvbW0KLSAqLwotCi0jaWZuZGVmIE9CSl9FTEYKLXN0YXRpYyBpbnQgbWF4X2FsaWdubWVudCA9IDE1OwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1zX3Jlc2VydmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqcDsKLSAgY2hhciBjOwotICBpbnQgYWxpZ247Ci0gIGludCBzaXplOwotICBpbnQgdGVtcDsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoKHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQlNTIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgc2l6ZSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogYmFkIGxlbmd0aCAqLwotCi0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIixcImJzc1wiIiwgNikgIT0gMAotICAgICAgJiYgc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLFwiLmJzc1wiIiwgNykgIT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCAucmVzZXJ2ZSBzZWdtZW50IC0tIGV4cGVjdGVkIEJTUyBzZWdtZW50IikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzJdID09ICcuJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNzsKLSAgZWxzZQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA2OwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyBhbGlnbm1lbnQiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgYWxpZ24gPSAoaW50KSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotI2lmbmRlZiBPQkpfRUxGCi0gICAgICBpZiAoYWxpZ24gPiBtYXhfYWxpZ25tZW50KQotCXsKLQkgIGFsaWduID0gbWF4X2FsaWdubWVudDsKLQkgIGFzX3dhcm4gKF8oImFsaWdubWVudCB0b28gbGFyZ2U7IGFzc3VtaW5nICVkIiksIGFsaWduKTsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKGFsaWduIDwgMCkKLQl7Ci0JICBhc19iYWQgKF8oIm5lZ2F0aXZlIGFsaWdubWVudCIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoYWxpZ24gIT0gMCkKLQl7Ci0JICB0ZW1wID0gbG9nMiAoYWxpZ24pOwotCSAgaWYgKHRlbXAgPCAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBhbGlnbiA9IHRlbXA7Ci0JfQotCi0gICAgICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgYWxpZ24pOwotICAgIH0KLSAgZWxzZQotICAgIGFsaWduID0gMDsKLQotICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkKLSNpZmRlZiBPQkpfQU9VVAotICAgICAgJiYgU19HRVRfT1RIRVIgKHN5bWJvbFApID09IDAKLSAgICAgICYmIFNfR0VUX0RFU0MgKHN5bWJvbFApID09IDAKLSNlbmRpZgotICAgICAgKQotICAgIHsKLSAgICAgIGlmICghIG5lZWRfcGFzc18yKQotCXsKLQkgIGNoYXIgKnBmcmFnOwotCSAgc2VnVCBjdXJyZW50X3NlZyA9IG5vd19zZWc7Ci0JICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotCSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDEpOyAvKiBzd2l0Y2ggdG8gYnNzICovCi0KLQkgIGlmIChhbGlnbikKLQkgICAgZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOyAvKiBkbyBhbGlnbm1lbnQgKi8KLQotCSAgLyogZGV0YWNoIGZyb20gb2xkIGZyYWcgKi8KLQkgIGlmIChTX0dFVF9TRUdNRU5UKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQotCSAgICBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSBOVUxMOwotCi0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLQkgIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkwLCBzeW1ib2xQLAotCQkJICAgIChvZmZzZXRUKSBzaXplLCAoY2hhciAqKTApOwotCSAgKnBmcmFnID0gMDsKLQotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYnNzX3NlY3Rpb24pOwotCi0JICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwotCi0jaWZkZWYgT0JKX0VMRgotCSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0jZW5kaWYKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfd2FybigiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sICVzIiwKLQkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0gICAgfQkJCQkvKiBpZiBub3QgcmVkZWZpbmluZyAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2NvbW1vbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIGludCB0ZW1wLCBzaXplOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJCS8qIHNraXAgJywnICovCi0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgc2l6ZSA9IHRlbXA7Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHNpemUpCi0JewotCSAgYXNfd2FybiAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWQuIiksCi0JCSAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmbmRlZiBPQkpfRUxGCi0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7Ci0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0jZW5kaWYKLSAgICB9Ci0gIGtub3cgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgY29tbW9uIGxlbmd0aCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0gICAgewotICAgICAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0jaWZuZGVmIE9CSl9FTEYKLSAgICAgIGlmICh0ZW1wID4gbWF4X2FsaWdubWVudCkKLQl7Ci0JICB0ZW1wID0gbWF4X2FsaWdubWVudDsKLQkgIGFzX3dhcm4gKF8oImFsaWdubWVudCB0b28gbGFyZ2U7IGFzc3VtaW5nICVkIiksIHRlbXApOwotCX0KLSNlbmRpZgotCi0gICAgICBpZiAodGVtcCA8IDApCi0JewotCSAgYXNfYmFkIChfKCJuZWdhdGl2ZSBhbGlnbm1lbnQiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCktPmxvY2FsKQotCXsKLQkgIHNlZ1Qgb2xkX3NlYzsKLQkgIGludCBvbGRfc3Vic2VjOwotCSAgY2hhciAqcDsKLQkgIGludCBhbGlnbjsKLQotCSAgb2xkX3NlYyA9IG5vd19zZWc7Ci0JICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLQotCSAgaWYgKHRlbXAgPT0gMCkKLQkgICAgYWxpZ24gPSAwOwotCSAgZWxzZQotCSAgICBhbGlnbiA9IGxvZzIgKHRlbXApOwotCi0JICBpZiAoYWxpZ24gPCAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgYWxpZ24pOwotCSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDApOwotCSAgaWYgKGFsaWduKQotCSAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYnNzX3NlY3Rpb24pCi0JICAgIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLQkgIHAgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBzeW1ib2xQLAotCQkJKG9mZnNldFQpIHNpemUsIChjaGFyICopIDApOwotCSAgKnAgPSAwOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYnNzX3NlY3Rpb24pOwotCSAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLQkgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOwotCX0KLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBPQkpfRUxGICovCi0JewotCWFsbG9jYXRlX2NvbW1vbjoKLQkgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBzaXplKTsKLSNpZmRlZiBPQkpfRUxGCi0JICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgdGVtcCk7Ci0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLSNlbmRpZgotCSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYmZkX2NvbV9zZWN0aW9uX3B0cik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSB1c2UgdGhlIGRvdCwgc29tZSBkb24ndC4gIENhbiB3ZSBnZXQgc29tZSBjb25zaXN0ZW5jeT8/ICAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy4nKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSBzYXkgZGF0YSwgc29tZSBzYXkgYnNzLiAgKi8KLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJic3NcIiIsIDQpCi0JICAmJiBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJkYXRhXCIiLCA1KSkKLQl7Ci0JICB3aGlsZSAoKi0taW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLQkgICAgOwotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JICBnb3RvIGJhZF9jb21tb25fc2VnbWVudDsKLQl9Ci0gICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICciJykKLQk7Ci0gICAgICBnb3RvIGFsbG9jYXRlX2NvbW1vbjsKLSAgICB9Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLQotICB7Ci0gIGJhZF9jb21tb25fc2VnbWVudDoKLSAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQotICAgICAgcCsrOwotICAgIGMgPSAqcDsKLSAgICAqcCA9ICdcMCc7Ci0gICAgYXNfYmFkIChfKCJiYWQgLmNvbW1vbiBzZWdtZW50ICVzIiksIGlucHV0X2xpbmVfcG9pbnRlciArIDEpOwotICAgICpwID0gYzsKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmVtcHR5IHBzZXVkby1vcC4gIFRoaXMgc3VwcmVzc2VzIHRoZSB3YXJuaW5ncyBhYm91dAotICAgaW52YWxpZCBkZWxheSBzbG90IHVzYWdlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZW1wdHkgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogVGhlIGVhc3kgd2F5IHRvIGltcGxlbWVudCBpcyB0byBqdXN0IGZvcmdldCBhYm91dCB0aGUgbGFzdAotICAgICBpbnN0cnVjdGlvbi4gICovCi0gIGxhc3RfaW5zbiA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX3NlZyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotCi0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJcInRleHRcIiIsIDYpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0gICAgICBzX3RleHQgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIlwiZGF0YVwiIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLSAgICAgIHNfZGF0YSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiXCJkYXRhMVwiIiwgNykgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNzsKLSAgICAgIHNfZGF0YTEgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiXCJic3NcIiIsIDUpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgMiBzZWdtZW50cyAtLSB0ZXh0IGFuZCBkYXRhIC0tIGZvciBub3csIHNvCi0JIHRoaW5ncyBpbiB0aGUgImJzcyBzZWdtZW50IiB3aWxsIGhhdmUgdG8gZ28gaW50byBkYXRhIGZvciBub3cuCi0JIFlvdSBjYW4gc3RpbGwgYWxsb2NhdGUgU0VHX0JTUyBzdHVmZiB3aXRoIC5sY29tbSBvciAucmVzZXJ2ZS4gKi8KLSAgICAgIHN1YnNlZ19zZXQgKGRhdGFfc2VjdGlvbiwgMjU1KTsJLyogRklYTUUtU09NRURBWSAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYXNfYmFkIChfKCJVbmtub3duIHNlZ21lbnQgdHlwZSIpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZGF0YTEgKCkKLXsKLSAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAxKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfcHJvYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotfQotCi0vKiBUaGlzIHN0YXRpYyB2YXJpYWJsZSBpcyBzZXQgYnkgc191YWNvbnMgdG8gdGVsbCBzcGFyY19jb25zX2FsaWduCi0gICB0aGF0IHRoZSBleHBlc3Npb24gZG9lcyBub3QgbmVlZCB0byBiZSBhbGlnbmVkLiAgKi8KLQotc3RhdGljIGludCBzcGFyY19ub19hbGlnbl9jb25zID0gMDsKLQotLyogVGhpcyBoYW5kbGVzIHRoZSB1bmFsaWduZWQgc3BhY2UgYWxsb2NhdGlvbiBwc2V1ZG8tb3BzLCBzdWNoIGFzCi0gICAudWF3b3JkLiAgLnVhd29yZCBpcyBqdXN0IGxpa2UgLndvcmQsIGJ1dCB0aGUgdmFsdWUgZG9lcyBub3QgbmVlZAotICAgdG8gYmUgYWxpZ25lZC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3VhY29ucyAoYnl0ZXMpCi0gICAgIGludCBieXRlczsKLXsKLSAgLyogVGVsbCBzcGFyY19jb25zX2FsaWduIG5vdCB0byBhbGlnbiB0aGlzIHZhbHVlLiAgKi8KLSAgc3BhcmNfbm9fYWxpZ25fY29ucyA9IDE7Ci0gIGNvbnMgKGJ5dGVzKTsKLX0KLQotLyogVGhpcyBoYW5kbGVzIHRoZSBuYXRpdmUgd29yZCBhbGxvY2F0aW9uIHBzZXVkby1vcCAubndvcmQuCi0gICBGb3Igc3BhcmNfYXJjaF9zaXplIDMyIGl0IGlzIGVxdWl2YWxlbnQgdG8gLndvcmQsICBmb3IKLSAgIHNwYXJjX2FyY2hfc2l6ZSA2NCBpdCBpcyBlcXVpdmFsZW50IHRvIC54d29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX25jb25zIChieXRlcykKLSAgICAgaW50IGJ5dGVzOwotewotICBjb25zIChzcGFyY19hcmNoX3NpemUgPT0gMzIgPyA0IDogOCk7Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBIYW5kbGUgdGhlIFNQQVJDIEVMRiAucmVnaXN0ZXIgcHNldWRvLW9wLiAgVGhpcyBzZXRzIHRoZSBiaW5kaW5nIG9mIGEKLSAgIGdsb2JhbCByZWdpc3Rlci4KLSAgIFRoZSBzeW50YXggaXM6Ci0gICAKLSAgIC5yZWdpc3RlciAlZ1syMzY3XSx7I3NjcmF0Y2h8c3ltYm9sbmFtZXwjaWdub3JlfQotICAgKi8KLQotc3RhdGljIHZvaWQKLXNfcmVnaXN0ZXIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciBjOwotICBpbnQgcmVnOwotICBpbnQgZmxhZ3M7Ci0gIGNvbnN0IGNoYXIgKnJlZ25hbWU7Ci0KLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSAhPSAnJScKLSAgICAgIHx8IGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnZycKLSAgICAgIHx8ICgoaW5wdXRfbGluZV9wb2ludGVyWzJdICYgfjEpICE9ICcyJwotCSAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsyXSAmIH4xKSAhPSAnNicpCi0gICAgICB8fCBpbnB1dF9saW5lX3BvaW50ZXJbM10gIT0gJywnKQotICAgIGFzX2JhZCAoXygicmVnaXN0ZXIgc3ludGF4IGlzIC5yZWdpc3RlciAlJWdbMjM2N10seyNzY3JhdGNofHN5bWJvbG5hbWV8I2lnbm9yZX0iKSk7Ci0gIHJlZyA9IGlucHV0X2xpbmVfcG9pbnRlclsyXSAtICcwJzsKLSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDQ7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcmVnbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIGlmIChzdHJjbXAgKHJlZ25hbWUsICJzY3JhdGNoIikgJiYgc3RyY21wIChyZWduYW1lLCAiaWdub3JlIikpCi0JYXNfYmFkIChfKCJyZWdpc3RlciBzeW50YXggaXMgLnJlZ2lzdGVyICUlZ1syMzY3XSx7I3NjcmF0Y2h8c3ltYm9sbmFtZXwjaWdub3JlfSIpKTsKLSAgICAgIGlmIChyZWduYW1lIFswXSA9PSAnaScpCi0JcmVnbmFtZSA9IE5VTEw7Ci0gICAgICBlbHNlCi0JcmVnbmFtZSA9ICIiOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlZ25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgfQotICBpZiAoc3BhcmNfYXJjaF9zaXplID09IDY0KQotICAgIHsKLSAgICAgIGlmIChnbG9iYWxzIFtyZWddKQotCXsKLQkgIGlmICgocmVnbmFtZSAmJiBnbG9iYWxzIFtyZWddICE9IChzeW1ib2xTICopMQotCSAgICAgICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKGdsb2JhbHMgW3JlZ10pLCByZWduYW1lKSkKLQkgICAgICB8fCAoKHJlZ25hbWUgIT0gTlVMTCkgXiAoZ2xvYmFscyBbcmVnXSAhPSAoc3ltYm9sUyAqKTEpKSkKLQkgICAgYXNfYmFkIChfKCJyZWRlZmluaXRpb24gb2YgZ2xvYmFsIHJlZ2lzdGVyIikpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocmVnbmFtZSA9PSBOVUxMKQotCSAgICBnbG9iYWxzIFtyZWddID0gKHN5bWJvbFMgKikxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCpyZWduYW1lKQotCQl7Ci0JCSAgaWYgKHN5bWJvbF9maW5kIChyZWduYW1lKSkKLQkJICAgIGFzX2JhZCAoXygiUmVnaXN0ZXIgc3ltYm9sICVzIGFscmVhZHkgZGVmaW5lZC4iKSwKLQkJCSAgICByZWduYW1lKTsKLQkJfQotCSAgICAgIGdsb2JhbHMgW3JlZ10gPSBzeW1ib2xfbWFrZSAocmVnbmFtZSk7Ci0JICAgICAgZmxhZ3MgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZ2xvYmFscyBbcmVnXSktPmZsYWdzOwotCSAgICAgIGlmICghICpyZWduYW1lKQotCQlmbGFncyA9IGZsYWdzICYgfihCU0ZfR0xPQkFMfEJTRl9MT0NBTHxCU0ZfV0VBSyk7Ci0JICAgICAgaWYgKCEgKGZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX0xPQ0FMfEJTRl9XRUFLKSkpCi0JCWZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0JICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKGdsb2JhbHMgW3JlZ10pLT5mbGFncyA9IGZsYWdzOwotCSAgICAgIFNfU0VUX1ZBTFVFIChnbG9iYWxzIFtyZWddLCAodmFsdWVUKXJlZyk7Ci0JICAgICAgU19TRVRfQUxJR04gKGdsb2JhbHMgW3JlZ10sIHJlZyk7Ci0JICAgICAgU19TRVRfU0laRSAoZ2xvYmFscyBbcmVnXSwgMCk7Ci0JICAgICAgLyogQWx0aG91Z2ggd2UgYWN0dWFsbHkgd2FudCB1bmRlZmluZWRfc2VjdGlvbiBoZXJlLAotCQkgd2UgaGF2ZSB0byB1c2UgYWJzb2x1dGVfc2VjdGlvbiwgYmVjYXVzZSBvdGhlcndpc2UKLQkJIGdlbmVyaWMgYXMgY29kZSB3aWxsIG1ha2UgaXQgYSBDT00gc2VjdGlvbi4KLQkJIFdlIGZpeCB0aGlzIHVwIGluIHNwYXJjX2FkanVzdF9zeW10YWIuICAqLwotCSAgICAgIFNfU0VUX1NFR01FTlQgKGdsb2JhbHMgW3JlZ10sIGFic29sdXRlX3NlY3Rpb24pOwotCSAgICAgIFNfU0VUX09USEVSIChnbG9iYWxzIFtyZWddLCAwKTsKLQkgICAgICBlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoZ2xvYmFscyBbcmVnXSkpCi0JCS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvID0KLQkJICBFTEZfU1RfSU5GTyhTVEJfR0xPQkFMLCBTVFRfUkVHSVNURVIpOwotCSAgICAgIGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChnbG9iYWxzIFtyZWddKSkKLQkJLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBBZGp1c3QgdGhlIHN5bWJvbCB0YWJsZS4gIFdlIHNldCB1bmRlZmluZWQgc2VjdGlvbnMgZm9yIFNUVF9SRUdJU1RFUgotICAgc3ltYm9scyB3aGljaCBuZWVkIGl0LiAgKi8KLSAgIAotdm9pZAotc3BhcmNfYWRqdXN0X3N5bXRhYiAoKQotewotICBzeW1ib2xTICpzeW07Ci0gICAgIAotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIGlmIChFTEZfU1RfVFlQRSAoZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpCi0JCSAgICAgICAtPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbykgIT0gU1RUX1JFR0lTVEVSKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoRUxGX1NUX1RZUEUgKGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKQotCQkgICAgICAgLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4ICE9IFNITl9VTkRFRikpCi0JY29udGludWU7Ci0KLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bSwgdW5kZWZpbmVkX3NlY3Rpb24pOwotICAgIH0KLX0KLSNlbmRpZgotCi0vKiBJZiB0aGUgLS1lbmZvcmNlLWFsaWduZWQtZGF0YSBvcHRpb24gaXMgdXNlZCwgd2UgcmVxdWlyZSAud29yZCwKLSAgIGV0LiBhbC4sIHRvIGJlIGFsaWduZWQgY29ycmVjdGx5LiAgV2UgZG8gaXQgYnkgc2V0dGluZyB1cCBhbgotICAgcnNfYWxpZ25fY29kZSBmcmFnLCBhbmQgY2hlY2tpbmcgaW4gSEFORExFX0FMSUdOIHRvIG1ha2Ugc3VyZSB0aGF0Ci0gICBubyB1bmV4cGVjdGVkIGFsaWdubWVudCB3YXMgaW50cm9kdWNlZC4KLQotICAgVGhlIFN1bk9TIGFuZCBTb2xhcmlzIG5hdGl2ZSBhc3NlbWJsZXJzIGVuZm9yY2UgYWxpZ25lZCBkYXRhIGJ5Ci0gICBkZWZhdWx0LiAgV2UgZG9uJ3Qgd2FudCB0byBkbyB0aGF0LCBiZWNhdXNlIGdjYyBjYW4gZGVsaWJlcmF0ZWx5Ci0gICBnZW5lcmF0ZSBtaXNhbGlnbmVkIGRhdGEgaWYgdGhlIHBhY2tlZCBhdHRyaWJ1dGUgaXMgdXNlZC4gIEluc3RlYWQsCi0gICB3ZSBwZXJtaXQgbWlzYWxpZ25lZCBkYXRhIGJ5IGRlZmF1bHQsIGFuZCBwZXJtaXQgdGhlIHVzZXIgdG8gc2V0IGFuCi0gICBvcHRpb24gdG8gY2hlY2sgZm9yIGl0LiAgKi8KLQotdm9pZAotc3BhcmNfY29uc19hbGlnbiAobmJ5dGVzKQotICAgICBpbnQgbmJ5dGVzOwotewotICBpbnQgbmFsaWduOwotICBjaGFyICpwOwotCi0gIC8qIE9ubHkgZG8gdGhpcyBpZiB3ZSBhcmUgZW5mb3JjaW5nIGFsaWduZWQgZGF0YS4gICovCi0gIGlmICghIGVuZm9yY2VfYWxpZ25lZF9kYXRhKQotICAgIHJldHVybjsKLQotICBpZiAoc3BhcmNfbm9fYWxpZ25fY29ucykKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFuIHVuYWxpZ25lZCBwc2V1ZG8tb3AuICAqLwotICAgICAgc3BhcmNfbm9fYWxpZ25fY29ucyA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbGlnbiA9IGxvZzIgKG5ieXRlcyk7Ci0gIGlmIChuYWxpZ24gPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgYXNzZXJ0IChuYWxpZ24gPiAwKTsKLQotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmICgoYWJzX3NlY3Rpb25fb2Zmc2V0ICYgKCgxIDw8IG5hbGlnbikgLSAxKSkgIT0gMCkKLQlhc19iYWQgKF8oIm1pc2FsaWduZWQgZGF0YSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgcCA9IGZyYWdfdmFyIChyc19hbGlnbl9jb2RlLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLAotCQkoc3ltYm9sUyAqKSBOVUxMLCAob2Zmc2V0VCkgbmFsaWduLCAoY2hhciAqKSBOVUxMKTsKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuYWxpZ24pOwotfQotCi0vKiBUaGlzIGlzIHdoZXJlIHdlIGRvIHRoZSB1bmV4cGVjdGVkIGFsaWdubWVudCBjaGVjay4KLSAgIFRoaXMgaXMgY2FsbGVkIGZyb20gSEFORExFX0FMSUdOIGluIHRjLXNwYXJjLmguICAqLwotCi12b2lkCi1zcGFyY19oYW5kbGVfYWxpZ24gKGZyYWdwKQotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGlmIChmcmFncC0+ZnJfdHlwZSA9PSByc19hbGlnbl9jb2RlICYmICFmcmFncC0+ZnJfc3VidHlwZQotICAgICAgJiYgZnJhZ3AtPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFncC0+ZnJfYWRkcmVzcyAtIGZyYWdwLT5mcl9maXggIT0gMCkKLSAgICBhc19iYWRfd2hlcmUgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwgXygibWlzYWxpZ25lZCBkYXRhIikpOwotICBpZiAoZnJhZ3AtPmZyX3R5cGUgPT0gcnNfYWxpZ25fY29kZSAmJiBmcmFncC0+ZnJfc3VidHlwZSA9PSAxMDI0KQotICAgIHsKLSAgICAgIGludCBjb3VudCA9IGZyYWdwLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ3AtPmZyX2FkZHJlc3MgLSBmcmFncC0+ZnJfZml4OwotICAgICAgCi0gICAgICBpZiAoY291bnQgPj0gNAotCSAgJiYgIShjb3VudCAmIDMpCi0JICAmJiBjb3VudCA8PSAxMDI0Ci0JICAmJiAhKChsb25nKShmcmFncC0+ZnJfbGl0ZXJhbCArIGZyYWdwLT5mcl9maXgpICYgMykpCi0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCAqcCA9ICh1bnNpZ25lZCAqKShmcmFncC0+ZnJfbGl0ZXJhbCArIGZyYWdwLT5mcl9maXgpOwotICAgICAgICAgIGludCBpOwotICAgICAgICAgIAotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSA0LCBwKyspCi0gICAgICAgICAgICBpZiAoSU5TTl9CSUdfRU5ESUFOKQotICAgICAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuICgoY2hhciAqKXAsIDB4MDEwMDAwMDAsIDQpOyAvKiBlbWl0IG5vcHMgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoKGNoYXIgKilwLCAweDEwMDAwMDAwLCA0KTsKLQotICAgICAgICAgIGlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSAmJiBjb3VudCA+IDgpCi0gICAgICAgICAgICB7Ci0JICAgICAgY2hhciAqd2FkZHIgPSAmZnJhZ3AtPmZyX2xpdGVyYWxbZnJhZ3AtPmZyX2ZpeF07Ci0JICAgICAgdW5zaWduZWQgd3ZhbCA9ICgweDMwNjgwMDAwIHwgY291bnQgPj4gMik7IC8qIGJhLGEscHQgJXhjYywgMWYgKi8KLQkgICAgICBpZiAoSU5TTl9CSUdfRU5ESUFOKQotCQludW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuICh3YWRkciwgd3ZhbCwgNCk7Ci0JICAgICAgZWxzZQotCQludW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuICh3YWRkciwgd3ZhbCwgNCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZnJhZ3AtPmZyX3ZhciA9IGNvdW50OwotICAgICAgICB9Ci0gICAgfQotfQotCi0jaWZkZWYgT0JKX0VMRgotLyogU29tZSBzcGVjaWFsIHByb2Nlc3NpbmcgZm9yIGEgU3BhcmMgRUxGIGZpbGUuICAqLwotCi12b2lkCi1zcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZyAoKQotewotICAvKiBTZXQgdGhlIFNwYXJjIEVMRiBmbGFnIGJpdHMuICBGSVhNRTogVGhlcmUgc2hvdWxkIHByb2JhYmx5IGJlIHNvbWUKLSAgICAgc29ydCBvZiBCRkQgaW50ZXJmYWNlIGZvciB0aGlzLiAgKi8KLSAgaWYgKHNwYXJjX2FyY2hfc2l6ZSA9PSA2NCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHNwYXJjX21lbW9yeV9tb2RlbCkKLQl7Ci0JY2FzZSBNTV9STU86Ci0JICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDVjlfUk1POwotCSAgYnJlYWs7Ci0JY2FzZSBNTV9QU086Ci0JICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDVjlfUFNPOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID49IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfMzJQTFVTOwotICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgPT0gU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfU1VOX1VTMTsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSBlbWl0X2V4cHIgdmlhIFRDX0NPTlNfRklYX05FVyB3aGVuIGNyZWF0aW5nIGEKLSAgIHJlbG9jIGZvciBhIGNvbnMuICBXZSBjb3VsZCB1c2UgdGhlIGRlZmluaXRpb24gdGhlcmUsIGV4Y2VwdCB0aGF0Ci0gICB3ZSB3YW50IHRvIGhhbmRsZSBsaXR0bGUgZW5kaWFuIHJlbG9jcyBzcGVjaWFsbHkuICAqLwotCi12b2lkCi1jb25zX2ZpeF9uZXdfc3BhcmMgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCkKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7Ci0KLSAgciA9IChuYnl0ZXMgPT0gMSA/IEJGRF9SRUxPQ184IDoKLSAgICAgICAobmJ5dGVzID09IDIgPyBCRkRfUkVMT0NfMTYgOgotCShuYnl0ZXMgPT0gNCA/IEJGRF9SRUxPQ18zMiA6IEJGRF9SRUxPQ182NCkpKTsKLQotICBpZiAodGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YSAmJiBuYnl0ZXMgPT0gNAotICAgICAgJiYgbm93X3NlZy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICAKLSAgICByID0gQkZEX1JFTE9DX1NQQVJDX1JFVjMyOwotICBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIChpbnQpIG5ieXRlcywgZXhwLCAwLCByKTsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLWludAotZWxmMzJfc3BhcmNfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKLSAgICAgIHN0cnVjdCBmaXggKmZpeHA7Ci17Ci0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLSAKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1zcGFyYy5oIGIvZ2FzL2NvbmZpZy90Yy1zcGFyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWZkYTIyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtc3BhcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKiB0Yy1zcGFyYy5oIC0gTWFjcm9zIGFuZCB0eXBlIGRlZmluZXMgZm9yIHRoZSBzcGFyYy4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAtOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUKLSAgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBUQ19TUEFSQwotI2RlZmluZSBUQ19TUEFSQyAxCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBmcmFnOwotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdXNlZCB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGB0YXJnZXRfYmlnX2VuZGlhbicuICAqLwotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9zcGFyYwotCi1leHRlcm4gY29uc3QgY2hhciAqc3BhcmNfdGFyZ2V0X2Zvcm1hdCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgc3BhcmNfdGFyZ2V0X2Zvcm1hdCAoKQotCi0jZGVmaW5lIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotI2RlZmluZSBNQVhfUkVMT0NfRVhQQU5TSU9OIDIKLQotI2lmIDAKLSNpZmRlZiBURV9TUEFSQ0FPVVQKLS8qIEJpLWVuZGlhbiBzdXBwb3J0IG1heSBldmVudHVhbGx5IGJlIHVuY29uZGl0aW9uYWwsIGJ1dCB1bnRpbCB0aGluZ3MgYXJlCi0gICB3b3JraW5nIHdlbGwgaXQncyBvbmx5IHByb3ZpZGVkIGZvciB0YXJnZXRzIHRoYXQgbmVlZCBpdC4gICovCi0jZGVmaW5lIFNQQVJDX0JJRU5ESUFOCi0jZW5kaWYKLSNlbmRpZgotLyogTWFrZSBpdCB1bmNvbmRpdGlvbmFsIGFuZCBjaGVjayBpZiAtRUwgaXMgdmFsaWQgYWZ0ZXIgb3B0aW9uIHBhcnNpbmcgKi8KLSNkZWZpbmUgU1BBUkNfQklFTkRJQU4KLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgbWRfY29udmVydF9mcmFnKGIscyxmKQkJe2FzX2ZhdGFsIChfKCJzcGFyYyBjb252ZXJ0X2ZyYWdcbiIpKTt9Ci0jZGVmaW5lIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KGYscykgXAotCQkJKGFzX2ZhdGFsKF8oImVzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IGNhbGxlZCIpKSwxKQotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJTUEFSQyBHQVMgIgotCi1leHRlcm4gaW50IHNwYXJjX3BpY19jb2RlOwotCi0jZGVmaW5lIG1kX2RvX2FsaWduKG4sIGZpbGwsIGxlbiwgbWF4LCBhcm91bmQpCQkJCVwKLWlmICgobikgJiYgKG4pIDw9IDEwICYmICFuZWVkX3Bhc3NfMiAmJiAhKGZpbGwpCQkJCVwKLSAgICAmJiBzdWJzZWdfdGV4dF9wIChub3dfc2VnKSkJCQkJCQlcCi0gIHsJCQkJCQkJCQlcCi0gICAgY2hhciAqcDsJCQkJCQkJCVwKLSAgICBwID0gZnJhZ192YXIgKHJzX2FsaWduX2NvZGUsIDEgPDwgbiwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMTAyNCwJXAotICAgICAgICAgICAgICAgICAgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIChuKSwgKGNoYXIgKikgMCk7CQlcCi0gICAgKnAgPSAweDAwOwkJCQkJCQkJXAotICAgIGdvdG8gYXJvdW5kOwkJCQkJCQlcCi0gIH0KLQotLyogV2UgcmVxdWlyZSAud29yZCwgZXQuIGFsLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHkuICAqLwotI2RlZmluZSBtZF9jb25zX2FsaWduKG5ieXRlcykgc3BhcmNfY29uc19hbGlnbiAobmJ5dGVzKQotZXh0ZXJuIHZvaWQgc3BhcmNfY29uc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgSEFORExFX0FMSUdOKGZyYWdwKSBzcGFyY19oYW5kbGVfYWxpZ24gKGZyYWdwKQotZXh0ZXJuIHZvaWQgc3BhcmNfaGFuZGxlX2FsaWduIFBBUkFNUyAoKHN0cnVjdCBmcmFnICopKTsKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9BT1VUKQotCi0vKiBUaGlzIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlIGlmIHRoZSByZWxvY2F0aW9uIGlzIGZvciBhIGxvY2FsCi0gICBvYmplY3QgZm9yIHdoaWNoIHdlIHN0aWxsIHdhbnQgdG8gZG8gdGhlIHJlbG9jYXRpb24gYXQgcnVudGltZS4KLSAgIFRydWUgaWYgd2UgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcKLSAgIHRoZSAubyBmaWxlLgotCi0gICBJZiB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9sLCB0aGVuIHRoZQotICAgYS5vdXQgYXNzZW1ibGVyIHNob3VsZCBub3QgZG8gdGhlIHJlbG9jYXRpb24gaWYgZ2VuZXJhdGluZyBQSUMsIGFuZAotICAgdGhlIEVMRiBhc3NlbWJsZXIgc2hvdWxkIG5ldmVyIGRvIHRoZSByZWxvY2F0aW9uLiAgKi8KLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgb2JqX3JlbG9jYXRlX2V4dGVybiAwCi0jZWxzZQotI2RlZmluZSBvYmpfcmVsb2NhdGVfZXh0ZXJuICghIHNwYXJjX3BpY19jb2RlKQotI2VuZGlmCi0KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkgIFwKLSAgKG9ial9yZWxvY2F0ZV9leHRlcm4gXAotICAgfHwgKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwgXAotICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCi0jZW5kaWYKLQotLyogSSBrbm93IHRoYXQgImNhbGwgMCIgZmFpbHMgaW4gc3BhcmMtY29mZiBpZiB0aGlzIGRvZXNuJ3QgcmV0dXJuIDEuICBJCi0gICBkb24ndCBrbm93IGFib3V0IG90aGVyIHJlbG9jYXRpb24gdHlwZXMsIG9yIG90aGVyIGZvcm1hdHMsIHlldC4gICovCi0jaWZkZWYgT0JKX0NPRkYKLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQlcCi0JKChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiBcCi0JICYmICgoRklYUCktPmZ4X2FkZHN5ID09IDAgXAotCSAgICAgfHwgU19HRVRfU0VHTUVOVCAoKEZJWFApLT5meF9hZGRzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikpCi0jZGVmaW5lIFJFTE9DX1JFUVVJUkVTX1NZTUJPTAotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgZWxmMzJfc3BhcmNfZm9yY2VfcmVsb2NhdGlvbihmaXhwKQotZXh0ZXJuIGludCBlbGYzMl9zcGFyY19mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLQotI2lmZGVmIE9CSl9FTEYKLS8qIEtlZXAgcmVsb2NhdGlvbnMgYWdhaW5zdCBnbG9iYWwgc3ltYm9scy4gIERvbid0IHR1cm4gdGhlbSBpbnRvCi0gICByZWxvY2F0aW9ucyBhZ2FpbnN0IHNlY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIGR5bmFtaWMKLSAgIGxpbmtlciB0byBvcGVyYXRlIHByb3Blcmx5LiAgV2hlbiBnZW5lcmF0aW5nIFBJQywgd2UgbmVlZCB0byBrZWVwCi0gICBhbnkgbm9uIFBDIHJlbGF0aXZlIHJlbG9jLiAgVGhlIFBJQyBwYXJ0IG9mIHRoaXMgdGVzdCBtdXN0IGJlCi0gICBwYXJhbGxlbCB0byB0aGUgY29kZSBpbiB0Y19nZW5fcmVsb2Mgd2hpY2ggY29udmVydHMgcmVsb2NhdGlvbnMgdG8KLSAgIEdPVCByZWxvY2F0aW9ucy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWCkJCQkJCQlcCi0gICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQkJCVwKLSAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpCQkJCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAkJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQkJCVwKLSAgICYmICghIHNwYXJjX3BpY19jb2RlCQkJCQkJCVwKLSAgICAgICB8fCAoKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkyMgkJCQlcCi0JICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfTE8xMAkJCVwKLQkgICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19TUEFSQzEzCQkJXAotCSAgICYmICgoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgkJXAotCSAgICAgICB8fCAoU19JU19ERUZJTkVEICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCQkgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCQkgICAmJiAhIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQlcCi0JCSAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpKSkJCQlcCi0JICAgJiYgKChGSVgpLT5meF9wY3JlbAkJCQkJCVwKLQkgICAgICAgfHwgKChGSVgpLT5meF9zdWJzeSAhPSBOVUxMCQkJCVwKLQkJICAgJiYgKFNfR0VUX1NFR01FTlQgKChGSVgpLT5meF9zdWJzeSkJCQlcCi0JCSAgICAgICA9PSBTX0dFVF9TRUdNRU5UICgoRklYKS0+ZnhfYWRkc3kpKSkJCVwKLQkgICAgICAgfHwgU19JU19MT0NBTCAoKEZJWCktPmZ4X2FkZHN5KSkpKSkKLQotLyogRmluaXNoIHVwIHRoZSBlbnRpcmUgc3ltdGFiLiAgKi8KLSNkZWZpbmUgdGNfYWRqdXN0X3N5bXRhYigpIHNwYXJjX2FkanVzdF9zeW10YWIgKCkKLWV4dGVybiB2b2lkIHNwYXJjX2FkanVzdF9zeW10YWIgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfQU9VVAotLyogV2hlbiBnZW5lcmF0aW5nIFBJQyBjb2RlLCB3ZSBtdXN0IG5vdCBhZGp1c3QgYW55IHJlbG9jIHdoaWNoIHdpbGwKLSAgIHR1cm4gaW50byBhIHJlbG9jIGFnYWluc3QgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIG5vciBhbnkgcmVsb2MKLSAgIHdoaWNoIHdlIHdpbGwgbmVlZCBpZiBhIHN5bWJvbCBpcyBvdmVycmlkZGVuLiAgKi8KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYKQkJCQkJCVwKLSAgKCEgc3BhcmNfcGljX2NvZGUJCQkJCQkJXAotICAgfHwgKChGSVgpLT5meF9wY3JlbAkJCQkJCQlcCi0gICAgICAgJiYgKChGSVgpLT5meF9hZGRzeSA9PSBOVUxMCQkJCQlcCi0JICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLQkgICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkpKSkJCQlcCi0gICB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNgkJCQkJXAotICAgfHwgKEZJWCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzIpCi0jZW5kaWYKLQotI2RlZmluZSBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyBzcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZwotZXh0ZXJuIHZvaWQgc3BhcmNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIHZvaWQgc3BhcmNfbWRfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZW5kKCkgc3BhcmNfbWRfZW5kICgpCi0KLSNlbmRpZgotCi0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfc3BhcmMKLWV4dGVybiB2b2lkIGNvbnNfZml4X25ld19zcGFyYwotICBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqLCBpbnQsIHVuc2lnbmVkIGludCwgc3RydWN0IGV4cHJlc3Npb25TICopKTsKLQotI2RlZmluZSBUQ19GSVhfVFlQRQl2YWx1ZVQKLQotI2RlZmluZSBUQ19JTklUX0ZJWF9EQVRBKFgpCQkJXAotICBkbwkJCQkJCVwKLSAgICAgewkJCQkJCVwKLSAgICAgICAoWCktPnRjX2ZpeF9kYXRhID0gMDsJCQlcCi0gICAgIH0JCQkJCQlcCi0gIHdoaWxlKDApCi0KLSNkZWZpbmUgVENfRklYX0RBVEFfUFJJTlQoRklMRSwgRklYUCkJCQkJCVwKLSAgZG8JCQkJCQkJCQlcCi0gICAgewkJCQkJCQkJCVwKLSAgICAgIGZwcmludGYoKEZJTEUpLCAiYWRkZW5kMj0lbGRcbiIsICAgCQkJCVwKLQkgICAgICAodW5zaWduZWQgbG9uZykgKEZJWFApLT50Y19maXhfZGF0YSk7CQkJXAotICAgIH0JCQkJCQkJCQlcCi0gIHdoaWxlKDApCi0KLS8qIGVuZCBvZiB0Yy1zcGFyYy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRhaG9lLmMgYi9nYXMvY29uZmlnL3RjLXRhaG9lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YTc1MjQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy10YWhvZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAyNyArMCwwIEBACi0vKiB0Yy10YWhvZS5jCi0gICBOb3QgcGFydCBvZiBHQVMgeWV0LiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLS8qIHRoaXMgYml0IGdsb21tZWQgZnJvbSB0YWhvZS1pbnN0LmggKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJ5dGU7Ci10eXBlZGVmIGJ5dGUgdGFob2Vfb3Bjb2RlVDsKLQotLyoKLSAqIFRoaXMgaXMgcGFydCBvZiB0YWhvZS1pbnMtcGFyc2UuYyAmIGZyaWVuZHMuCi0gKiBXZSB3YW50IHRvIHBhcnNlIGEgdGFob2UgaW5zdHJ1Y3Rpb24gdGV4dCBpbnRvIGEgdHJlZSBkZWZpbmVkIGhlcmUuCi0gKi8KLQotI2RlZmluZSBUSVRfTUFYX09QRVJBTkRTICg0KQkvKiBtYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyBpbiBvbmUKLQkJCQkgICBzaW5nbGUgdGFob2UgaW5zdHJ1Y3Rpb24gKi8KLQotc3RydWN0IHRvcAkJCS8qIHRhaG9lIGluc3RydWN0aW9uIG9wZXJhbmQgKi8KLXsKLSAgaW50IHRvcF9uZHg7CQkJLyogLTEsIG9yIGluZGV4IHJlZ2lzdGVyLiBlZyA3PVtSN10gKi8KLSAgaW50IHRvcF9yZWc7CQkJLyogLTEsIG9yIHJlZ2lzdGVyIG51bWJlci4gZWcgNyA9IFI3IG9yIChSNykgKi8KLSAgYnl0ZSB0b3BfbW9kZTsJCS8qIEFkZHJlc3NpbmcgbW9kZSBieXRlLiBUaGlzIGJ5dGUsIGRlZmluZXMKLQkJCQkgICB3aGljaCBvZiB0aGUgMTEgbW9kZXMgb3Bjb2RlIGlzLiAqLwotCi0gIGNoYXIgdG9wX2FjY2VzczsJCS8qIEFjY2VzcyB0eXBlIHdhbnRlZCBmb3IgdGhpcyBvcHBlcmFuZAotCQkJCSAgICdiJ2JyYW5jaCAnICduby1pbnN0cnVjdGlvbiAnYW1ydncnICovCi0gIGNoYXIgdG9wX3dpZHRoOwkJLyogT3BlcmFuZCB3aWR0aCBleHBlY3RlZCwgb25lIG9mICJid2xxPy06ISIgKi8KLQotICBjaGFyICp0b3BfZXJyb3I7CQkvKiBTYXkgaWYgb3BlcmFuZCBpcyBpbmFwcHJvcHJpYXRlICAgICAgICAgKi8KLQotICBzZWdUIHNlZ19vZl9vcGVyYW5kOwkJLyogc2VnbWVudCBhcyByZXR1cm5lZCBieSBleHByZXNzaW9uKCkqLwotCi0gIGV4cHJlc3Npb25TIGV4cF9vZl9vcGVyYW5kOwkvKiBUaGUgZXhwcmVzc2lvbiBhcyBwYXJzZWQgYnkgZXhwcmVzc2lvbigpKi8KLQotICBieXRlIHRvcF9kaXNwc2l6ZTsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgZGlzcGxhY2VtZW50IGlmIHdlCi0JCQkJICAgY2FuIGZpZ3VyZSBpdCBvdXQgKi8KLX07Ci0KLS8qIFRoZSBhZGRyZXNzaW5nIG1vZGVzIGZvciBhbiBvcGVyYW5kLiBUaGVzZSBudW1iZXJzIGFyZSB0aGUgYWN1dGFsIHZhbHVlcwotICAgZm9yIGNlcnRhaW4gbW9kZXMsIHNvIGJlIGNhcmVmdWxsIGlmIHlvdSBzY3JldyB3aXRoIHRoZW0uICovCi0jZGVmaW5lIFRBSE9FX0RJUkVDVF9SRUcgKDB4NTApCi0jZGVmaW5lIFRBSE9FX1JFR19ERUZFUlJFRCAoMHg2MCkKLQotI2RlZmluZSBUQUhPRV9SRUdfRElTUCAoMHhFMCkKLSNkZWZpbmUgVEFIT0VfUkVHX0RJU1BfREVGRVJSRUQgKDB4RjApCi0KLSNkZWZpbmUgVEFIT0VfSU1NRURJQVRFICgweDhGKQotI2RlZmluZSBUQUhPRV9JTU1FRElBVEVfQllURSAoMHg4OCkKLSNkZWZpbmUgVEFIT0VfSU1NRURJQVRFX1dPUkQgKDB4ODkpCi0jZGVmaW5lIFRBSE9FX0lNTUVESUFURV9MT05HV09SRCAoMHg4RikKLSNkZWZpbmUgVEFIT0VfQUJTT0xVVEVfQUREUiAoMHg5RikKLQotI2RlZmluZSBUQUhPRV9ESVNQTEFDRURfUkVMQVRJVkUgKDB4RUYpCi0jZGVmaW5lIFRBSE9FX0RJU1BfUkVMX0RFRkVSUkVEICgweEZGKQotCi0jZGVmaW5lIFRBSE9FX0FVVE9fREVDICgweDdFKQotI2RlZmluZSBUQUhPRV9BVVRPX0lOQyAoMHg4RSkKLSNkZWZpbmUgVEFIT0VfQVVUT19JTkNfREVGRVJSRUQgKDB4OUUpCi0vKiBJTkRFWEVEX1JFRyBpcyBkZWNpZGVkIGJ5IHRoZSBleGlzdGFuY2Ugb3IgbGFjayBvZiBhIFtyZWddICovCi0KLS8qIFRoZXNlIGFyZSBlbmNvZGVkIGludG8gdG9wX3dpZHRoIHdoZW4gdG9wX2FjY2Vzcz09J2InCi0gICBhbmQgaXQncyBhIHBzdWVkbyBvcC4qLwotI2RlZmluZSBUQUhPRV9XSURUSF9BTFdBWVNfSlVNUCAgICAgICctJwotI2RlZmluZSBUQUhPRV9XSURUSF9DT05ESVRJT05BTF9KVU1QICc/JwotI2RlZmluZSBUQUhPRV9XSURUSF9CSUdfUkVWX0pVTVAgICAgICchJwotI2RlZmluZSBUQUhPRV9XSURUSF9CSUdfTk9OX1JFVl9KVU1QICc6JwotCi0vKiBUaGUgaGV4IGNvZGUgZm9yIGNlcnRhaW4gdGFob2UgY29tbWFuZHMgYW5kIG1vZGVzLgotICAgVGhpcyBpcyBqdXN0IGZvciByZWFkYWJpbGl0eS4gKi8KLSNkZWZpbmUgVEFIT0VfSk1QICgweDcxKQotI2RlZmluZSBUQUhPRV9QQ19SRUxfTE9ORyAoMHhFRikKLSNkZWZpbmUgVEFIT0VfQlJCICgweDExKQotI2RlZmluZSBUQUhPRV9CUlcgKDB4MTMpCi0vKiBUaGVzZSwgd2hlbiAnb3JlZCcgd2l0aCwgb3IgYWRkZWQgdG8sIGEgcmVnaXN0ZXIgbnVtYmVyLAotICAgc2V0IHVwIHRoZSBudW1iZXIgZm9yIHRoZSBkaXNwbGFjZW1lbnQgbW9kZS4gKi8KLSNkZWZpbmUgVEFIT0VfUENfT1JfQllURSAoMHhBMCkKLSNkZWZpbmUgVEFIT0VfUENfT1JfV09SRCAoMHhDMCkKLSNkZWZpbmUgVEFIT0VfUENfT1JfTE9ORyAoMHhFMCkKLQotc3RydWN0IHRpdAkJCS8qIGdldCBpdCBvdXQgb2YgdGhlIHNld2VyLCBpdCBzdGFuZHMgZm9yCi0JCQkJICAgdGFob2UgaW5zdHJ1Y3Rpb24gdHJlZSAoR2VlemUhKSAqLwotewotICB0YWhvZV9vcGNvZGVUIHRpdF9vcGNvZGU7CS8qIFRoZSBvcGNvZGUuICovCi0gIGJ5dGUgdGl0X29wZXJhbmRzOwkJLyogSG93IG1hbnkgb3BlcmFuZHMgYXJlIGhlcmUuICovCi0gIHN0cnVjdCB0b3AgdGl0X29wZXJhbmRbVElUX01BWF9PUEVSQU5EU107CS8qIE9wZXJhbmRzICovCi0gIGNoYXIgKnRpdF9lcnJvcjsJCS8qICIiIG9yIGZhdGFsIGVycm9yIHRleHQgKi8KLX07Ci0KLS8qIGVuZDogdGFob2UtaW5zdC5oICovCi0KLS8qIHRhaG9lLmMgLSB0YWhvZS1zcGVjaWZpYyAtCi0gICBOb3QgcGFydCBvZiBnYXMgeWV0LgotICAgKi8KLQotI2luY2x1ZGUgIm9wY29kZS90YWhvZS5oIgotCi0vKiBUaGlzIGlzIHRoZSBudW1iZXIgdG8gcHV0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGEub3V0IGZpbGUgKi8KLWxvbmcgb21hZ2ljID0gT01BR0lDOwotCi0vKiBUaGVzZSBjaGFycyBzdGFydCBhIGNvbW1lbnQgYW55d2hlcmUgaW4gYSBzb3VyY2UgZmlsZSAoZXhjZXB0IGluc2lkZQotICAgYW5vdGhlciBjb21tZW50IG9yIGEgcXVvdGVkIHN0cmluZy4gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiM7IjsKLQotLyogVGhlc2UgY2hhcnMgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBhcyBpbiAwZjEyMy40NTYKLSAgIG9yICAgIDBkMS4yMzRFLTEyIChzZWUgZXhwIGNoYXJzIGFib3ZlKQotICAgTm90ZTogVGhlIFRhaG9lIHBvcnQgZG9lc24ndCBzdXBwb3J0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4gVGhpcyBpcwotICAgICAgICAgY29uc2lzdGFudCB3aXRoICdhcycgSWYgaXQncyBuZWVkZWQsIEkgY2FuIGFsd2F5cyBhZGQgaXQgbGF0ZXIuICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImRmIjsKLQotLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMgLiAgSWRlYWxseSBpdCBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0IGl0IGF0IGFsbCwKLSAgIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLgotICAgKFRoZSB0YWhvZSBoYXMgcGxlbnR5IG9mIHJvb20sIHNvIHRoZSBjaGFuZ2UgY3VycmVudGx5IGlzbid0IG5lZWRlZC4pCi0gICAqLwotCi1zdGF0aWMgc3RydWN0IHRpdCB0OwkJLyogQSB0YWhvZSBpbnN0cnVjdGlvbiBhZnRlciBkZWNvZGluZy4gKi8KLQotdm9pZCBmbG9hdF9jb25zICgpOwotLyogQSB0YWJsZSBvZiBwc2V1ZG8gb3BzIChzYW5zIC4pLCB0aGUgZnVuY3Rpb24gY2FsbGVkLCBhbmQgYW4gaW50ZWdlciBvcAotICAgdGhhdCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGguICovCi0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiZGZsb2F0IiwgZmxvYXRfY29ucywgJ2QnfSwKLSAgeyJmZmxvYXQiLCBmbG9hdF9jb25zLCAnZid9LAotICB7MH0KLX07Ci0MCi0vKgotICogRm9yIFRhaG9lLCByZWxhdGl2ZSBhZGRyZXNzZXMgb2YgImp1c3QgdGhlIHJpZ2h0IGxlbmd0aCIgYXJlIHByZXR0eSBlYXN5LgotICogVGhlIGJyYW5jaCBkaXNwbGFjZW1lbnQgaXMgYWx3YXlzIHRoZSBsYXN0IG9wZXJhbmQsIGV2ZW4gaW4KLSAqIHN5bnRoZXRpYyBpbnN0cnVjdGlvbnMuCi0gKiBGb3IgVGFob2UsIHdlIGVuY29kZSB0aGUgcmVsYXhfc3Vic3RhdGVUcyAoaW4gZS5nLiBmcl9zdWJzdGF0ZSkgYXM6Ci0gKgotICoJCSAgICA0ICAgICAgIDMgICAgICAgMiAgICAgICAxICAgICAgIDAJICAgICBiaXQgbnVtYmVyCi0gKgktLS0vIC8tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gKgkJfCAgICAgd2hhdCBzdGF0ZSA/CXwgIGhvdyBsb25nID8JfAotICoJLS0tLyAvLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICoKLSAqIFRoZSAiaG93IGxvbmciIGJpdHMgYXJlIDAwPWJ5dGUsIDAxPXdvcmQsIDEwPWxvbmcuCi0gKiBUaGlzIGlzIGEgVW4qeCBjb252ZW50aW9uLgotICogTm90IGFsbCBsZW5ndGhzIGFyZSBsZWdpdCBmb3IgYSBnaXZlbiB2YWx1ZSBvZiAod2hhdCBzdGF0ZSkuCi0gKiBUaGUgZm91ciBzdGF0ZXMgYXJlIGxpc3RlZCBiZWxvdy4KLSAqIFRoZSAiaG93IGxvbmciIHJlZmVycyBtZXJlbHkgdG8gdGhlIGRpc3BsYWNlbWVudCBsZW5ndGguCi0gKiBUaGUgYWRkcmVzcyB1c3VhbGx5IGhhcyBzb21lIGNvbnN0YW50IGJ5dGVzIGluIGl0IGFzIHdlbGwuCi0gKgotCi1TdGF0ZXMgZm9yIFRhaG9lIGFkZHJlc3MgcmVsYXhpbmcuCi0xLglUQUhPRV9XSURUSF9BTFdBWVNfSlVNUCAoLSkKLQlGb3JtYXQ6ICJiLSIKLQlUYWhvZSBvcGNvZGVzIGFyZToJKEhleCkKLQkJanIJCTExCi0JCWpicgkJMTEKLQlTaW1wbGUgYnJhbmNoLgotCUFsd2F5cywgMSBieXRlIG9wY29kZSwgdGhlbiBkaXNwbGFjZW1lbnQvYWJzb2x1dGUuCi0JSWYgd29yZCBvciBsb25nd29yZCwgY2hhbmdlIG9wY29kZSB0byBicncgb3Igam1wLgotCi0JCi0yLglUQUhPRV9XSURUSF9DT05ESVRJT05BTF9KVU1QICg/KQotCUo8Y29uZD4gd2hlcmUgPGNvbmQ+IGlzIGEgc2ltcGxlIGZsYWcgdGVzdC4KLQlGb3JtYXQ6ICJiPyIKLQlUYWhvZSBvcGNvZGVzIGFyZToJKEhleCkKLQkJam5lcS9qbmVxdQkyMQotCQlqZXFsL2plcWx1CTMxCi0JCWpndHIJCTQxCi0JCWpsZXEJCTUxCi0JCWpnZXEJCTgxCi0JCWpsc3MJCTkxCi0JCWpndHJ1CQlhMQotCQlqbGVxdQkJYjEKLQkJanZjCQljMQotCQlqdnMJCWQxCi0JCWpsc3N1L2pjcwllMQotCQlqZ2VxdS9qY2MJZjEKLQlBbHdheXMsIHlvdSBjb21wbGVtZW50IDR0aCBiaXQgdG8gcmV2ZXJzZSB0aGUgY29uZGl0aW9uLgotCUFsd2F5cywgMS1ieXRlIG9wY29kZSwgdGhlbiAxLWJ5dGUgZGlzcGxhY2VtZW50LgotCi0zLglUQUhPRV9XSURUSF9CSUdfUkVWX0pVTVAgKCEpCi0JSmJjL0picyB3aGVyZSBjb25kIHRlc3RzIGEgbWVtb3J5IGJpdC4KLQlGb3JtYXQ6ICJybHZsYiEiCi0JVGFob2Ugb3Bjb2RlcyBhcmU6CShIZXgpCi0JCWpicwkJMGUKLQkJamJjCQkxZQotCUFsd2F5cywgeW91IGNvbXBsZW1lbnQgNHRoIGJpdCB0byByZXZlcnNlIHRoZSBjb25kaXRpb24uCi0JQWx3YXlzLCAxLWJ5dGUgb3BjZGUsIGxvbmd3b3JkLCBsb25nd29yZC1hZGRyZXNzLCAxLXdvcmQtZGlzcGxhY2VtZW50Ci0KLTQuCVRBSE9FX1dJRFRIX0JJR19OT05fUkVWX0pVTVAgKDopCi0JSmFvYmxYWC9KYnNzaQotCUZvcm1hdDogInJsbWxiOiIKLQlUYWhvZSBvcGNvZGVzIGFyZToJKEhleCkKLQkJYW9qbHNzCQkyZgotCQlqYW9ibHNzCQkyZgotCQlhb2psZXEJCTNmCi0JCWphb2JsZXEJCTNmCi0JCWpic3NpCQk1ZgotCUFsd2F5cywgd2UgY2Fubm90IHJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBicmFuY2g7IHdlIGhhdmUgYSB3b3JkCi0JZGlzcGxhY2VtZW50LgotCi1XZSBuZWVkIHRvIG1vZGlmeSB0aGUgb3Bjb2RlIGlzIGZvciBjbGFzcyAxLCAyIGFuZCAzIGluc3RydWN0aW9ucy4KLUFmdGVyIHJlbGF4KCkgd2UgbWF5IGNvbXBsZW1lbnQgdGhlIDR0aCBiaXQgb2YgMiBvciAzIHRvIHJldmVyc2Ugc2Vuc2Ugb2YKLWJyYW5jaC4KLQotV2Ugc29tZXRpbWVzIHN0b3JlIGNvbnRleHQgaW4gdGhlIG9wZXJhbmQgbGl0ZXJhbC4gVGhpcyB3YXkgd2UgY2FuIGZpZ3VyZSBvdXQKLWFmdGVyIHJlbGF4KCkgd2hhdCB0aGUgb3JpZ2luYWwgYWRkcmVzc2luZyBtb2RlIHdhcy4gKFdhcyBpcyBwY19yZWwsIG9yCi1wY19yZWxfZGlzcD8gVGhhdCBzb3J0IG9mIHRoaW5nLikgKi8KLQwKLS8qIFRoZXNlIGRpc3BsYWNlbWVudHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBTVEFSVCBhZGRyZXNzIG9mIHRoZQotICAgZGlzcGxhY2VtZW50IHdoaWNoIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgZGlzcGxhY2VtZW50LCBub3QgdGhlIGVuZCBvZgotICAgdGhlIGluc3RydWN0aW9uLiBUaGUgaGFyZHdhcmUgcGNfcmVsIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9ucy4KLSAgIFRoYXQncyB3aHkgYWxsIHRoZSBkaXNwbGFjZW1lbnRzIGhhdmUgdGhlIGxlbmd0aCBvZiB0aGUgZGlzcGxhY2VtZW50IGFkZGVkCi0gICB0byB0aGVtLiAoV0YgKyBsZW5ndGgod29yZCkpCi0KLSAgIFRoZSBmaXJzdCBsZXR0ZXIgaXMgQnl0ZSwgV29yZC4KLSAgIDJuZCBsZXR0ZXIgaXMgRm9yd2FyZCwgQmFja3dhcmQuICovCi0jZGVmaW5lIEJGICgxKyAxMjcpCi0jZGVmaW5lIEJCICgxKy0xMjgpCi0jZGVmaW5lIFdGICgyKyAzMjc2NykKLSNkZWZpbmUgV0IgKDIrLTMyNzY4KQotLyogRG9udCBuZWVkIExGLCBMQiBiZWNhdXNlIHRoZXkgYWx3YXlzIHJlYWNoLiBbVGhleSBhcmUgY29kZWQgYXMgMC5dICovCi0KLSNkZWZpbmUgQyhhLGIpIEVOQ09ERV9SRUxBWChhLGIpCi0vKiBUaGlzIG1hY3JvIGhhcyBubyBzaWRlLWVmZmVjdHMuICovCi0jZGVmaW5lIEVOQ09ERV9SRUxBWCh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgMikgKyAobGVuZ3RoKSkKLSNkZWZpbmUgUkVMQVhfU1RBVEUod2hhdCkgKCh3aGF0KSA+PiAyKQotI2RlZmluZSBSRUxBWF9MRU5HVEgobGVuZ3RoKSAoKGxlbmd0aCkgJiYgMykKLQotI2RlZmluZSBTVEFURV9BTFdBWVNfQlJBTkNIICAgICAgICAgICAgICgxKQotI2RlZmluZSBTVEFURV9DT05ESVRJT05BTF9CUkFOQ0ggICAgICAgICgyKQotI2RlZmluZSBTVEFURV9CSUdfUkVWX0JSQU5DSCAgICAgICAgICAgICgzKQotI2RlZmluZSBTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0ggICAgICAgICg0KQotI2RlZmluZSBTVEFURV9QQ19SRUxBVElWRQkJKDUpCi0KLSNkZWZpbmUgU1RBVEVfQllURSAgICAgICAgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgU1RBVEVfV09SRCAgICAgICAgICAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgU1RBVEVfTE9ORyAgICAgICAgICAgICAgICAgICAgICAoMikKLSNkZWZpbmUgU1RBVEVfVU5ERiAgICAgICAgICAgICAgICAgICAgICAoMykJLyogU3ltYm9sIHVuZGVmaW5lZCBpbiBwYXNzMSAqLwotCi0vKiBUaGlzIGlzIHRoZSB0YWJsZSB1c2VkIGJ5IGdhcyB0byBmaWd1cmUgb3V0IHJlbGF4aW5nIG1vZGVzLiBUaGUgZmllbGRzIGFyZQotICAgZm9yd2FyZF9icmFuY2ggcmVhY2gsIGJhY2t3YXJkX2JyYW5jaCByZWFjaCwgbnVtYmVyIG9mIGJ5dGVzIGl0IHdvdWxkIHRha2UsCi0gICB3aGVyZSB0aGUgbmV4dCBiaWdnZXN0IGJyYW5jaCBpcy4gKi8KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiBlcnJvciBzZW50aW5lbCAgIDAsMAkqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDAsMQkqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDAsMgkqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDAsMwkqLwotLyogVW5jb25kaXRpb25hbCBicmFuY2ggY2FzZXMgImpyYiIKLSAgICAgVGhlIHJlbGF4IHBhcnQgaXMgdGhlIGFjdHVhbCBkaXNwbGFjZW1lbnQgKi8KLSAgewotICAgIEJGLCBCQiwgMSwgQyAoMSwgMSkKLSAgfSwJCQkJLyogYnJiIEJgZm9vCSAgICAxLDAgKi8KLSAgewotICAgIFdGLCBXQiwgMiwgQyAoMSwgMikKLSAgfSwJCQkJLyogYnJ3IFdgZm9vCSAgICAxLDEgKi8KLSAgewotICAgIDAsIDAsIDUsIDAKLSAgfSwJCQkJLyogSm1wIExgZm9vCSAgICAxLDIgKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAxLDMgKi8KLS8qIFJldmVyc2libGUgQ29uZGl0aW9uYWwgQnJhbmNoLiBJZiB0aGUgYnJhbmNoIHdvbid0IHJlYWNoLCByZXZlcnNlCi0gICAgIGl0LCBhbmQganVtcCBvdmVyIGEgYnJ3IG9yIGEgam1wIHRoYXQgd2lsbCByZWFjaC4gVGhlIHJlbGF4IHBhcnQgaXMgdGhlCi0gICAgIGFjdHVhbCBhZGRyZXNzLiAqLwotICB7Ci0gICAgQkYsIEJCLCAxLCBDICgyLCAxKQotICB9LAkJCQkvKiBiPGNvbmQ+IEJgZm9vICAgIDIsMCAqLwotICB7Ci0gICAgV0YgKyAyLCBXQiArIDIsIDQsIEMgKDIsIDIpCi0gIH0sCQkJCS8qIGJyZXYgb3ZlciwgYnJ3IFdgZm9vLCBvdmVyOiAyLDEgKi8KLSAgewotICAgIDAsIDAsIDcsIDAKLSAgfSwJCQkJLyogYnJldiBvdmVyLCBqbXAgTGBmb28sIG92ZXI6IDIsMiAqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDIsMyAqLwotLyogQW5vdGhlciB0eXBlIG9mIHJldmVyc2FibGUgYnJhbmNoLiBCdXQgdGhpcyBvbmx5IGhhcyBhIHdvcmQKLSAgICAgZGlzcGxhY2VtZW50LiAqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDMsMCAqLwotICB7Ci0gICAgV0YsIFdCLCAyLCBDICgzLCAyKQotICB9LAkJCQkvKiBqYlggV2Bmb28JICAgIDMsMSAqLwotICB7Ci0gICAgMCwgMCwgOCwgMAotICB9LAkJCQkvKiBqcmV2WCBvdmVyLCBqbXAgTGBmb28sIG92ZXI6ICAzLDIgKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICAzLDMgKi8KLS8qIFRoZXNlIGFyZSB0aGUgbm9uIHJldmVyc2FibGUgYnJhbmNoZXMsIGFsbCBvZiB3aGljaCBoYXZlIGEgd29yZAotICAgICBkaXNwbGFjZW1lbnQuIElmIEkgY2FuJ3QgcmVhY2gsIGJyYW5jaCBvdmVyIGEgYnl0ZSBicmFuY2gsIHRvIGEKLSAgICAganVtcCB0aGF0IHdpbGwgcmVhY2guIFRoZSBqdW1wZWQgYnJhbmNoIGp1bXBzIG92ZXIgdGhlIHJlYWNoaW5nCi0gICAgIGJyYW5jaCwgdG8gY29udGludWUgd2l0aCB0aGUgZmxvdyBvZiB0aGUgcHJvZ3JhbS4gSXQncyBsaWtlIHBsYXlpbmcKLSAgICAgbGVhcCBmcm9nLiAqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDQsMCAqLwotICB7Ci0gICAgV0YsIFdCLCAyLCBDICg0LCAyKQotICB9LAkJCQkvKiBhb2JsXyBXYGZvbwkgICAgNCwxICovCi0gIHsKLSAgICAwLCAwLCAxMCwgMAotICB9LAkJCQkvKmFvYmxfIFdgaG9wLGJyIG92ZXIsaG9wOiBqbXAgTF5mb28sb3ZlciA0LDIqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDQsMyAqLwotLyogTm9ybWFsIGRpc3BsYWNlbWVudCBtb2RlLCBubyBqdW1waW5nIG9yIGFueXRoaW5nIGxpa2UgdGhhdC4KLSAgICAgVGhlIHJlbGF4IHBvaW50cyB0byBvbmUgYnl0ZSBiZWZvcmUgdGhlIGFkZHJlc3MsIHRoYXRzIHdoeSBhbGwKLSAgICAgdGhlIG51bWJlcnMgYXJlIHVwIGJ5IG9uZS4gKi8KLSAgewotICAgIEJGICsgMSwgQkIgKyAxLCAyLCBDICg1LCAxKQotICB9LAkJCQkvKiBCXiJmb28iCSAgICA1LDAgKi8KLSAgewotICAgIFdGICsgMSwgV0IgKyAxLCAzLCBDICg1LCAyKQotICB9LAkJCQkvKiBXXiJmb28iCSAgICA1LDEgKi8KLSAgewotICAgIDAsIDAsIDUsIDAKLSAgfSwJCQkJLyogTF4iZm9vIgkgICAgNSwyICovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgNSwzICovCi19OwotCi0jdW5kZWYgQwotI3VuZGVmIEJGCi0jdW5kZWYgQkIKLSN1bmRlZiBXRgotI3VuZGVmIFdCCi0vKiBFbmQgcmVsYXggc3R1ZmYgKi8KLQwKLS8qIEhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUuICBOVUxMIG1lYW5zIGFueSB1c2UgYmVmb3JlCi0gICBtZF9iZWdpbigpIHdpbGwgY3Jhc2guICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7Ci0KLS8qIEluaXQgZnVuY3Rpb24uIEJ1aWxkIHRoZSBoYXNoIHRhYmxlLiAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgc3RydWN0IHRvdCAqdFA7Ci0gIGNoYXIgKmVycm9ydmFsID0gMDsKLSAgaW50IHN5bnRoZXRpY190b28gPSAxOwkvKiBJZiAwLCBqdXN0IHVzZSByZWFsIG9wY29kZXMuICovCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIGZvciAodFAgPSB0b3RzdHJzOyAqdFAtPm5hbWUgJiYgIWVycm9ydmFsOyB0UCsrKQotICAgIGVycm9ydmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIHRQLT5uYW1lLCAmdFAtPmRldGFpbCk7Ci0KLSAgaWYgKHN5bnRoZXRpY190b28pCi0gICAgZm9yICh0UCA9IHN5bnRoZXRpY190b3RzdHJzOyAqdFAtPm5hbWUgJiYgIWVycm9ydmFsOyB0UCsrKQotICAgICAgZXJyb3J2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgdFAtPm5hbWUsICZ0UC0+ZGV0YWlsKTsKLQotICBpZiAoZXJyb3J2YWwpCi0gICAgYXNfZmF0YWwgKGVycm9ydmFsKTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJhZDpTVHQ6ViI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnYSc6Ci0gICAgICBhc193YXJuIChfKCJUaGUgLWEgb3B0aW9uIGRvZXNuJ3QgZXhpc3QuIChEZXNwaXRlIHdoYXQgdGhlIG1hbiBwYWdlIHNheXMhIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIGFzX3dhcm4gKF8oIkRpc3BsYWNlbWVudCBsZW5ndGggJXMgaWdub3JlZCEiKSwgYXJnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6Ci0gICAgICBhc193YXJuIChfKCJTWU1CT0wgVEFCTEUgbm90IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIGFzX3dhcm4gKF8oIlRPS0VOIFRSQUNFIG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgICBhc193YXJuIChfKCJJIGRvbid0IG5lZWQgb3IgdXNlIHRlbXAuIGZpbGUgXCIlc1wiLiIpLCBhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgIGFzX3dhcm4gKF8oIkkgZG9uJ3QgdXNlIGFuIGludGVycGFzcyBmaWxlISAtViBpZ25vcmVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLVRhaG9lIG9wdGlvbnM6XG5cCi0tYQkJCWlnbm9yZWRcblwKLS1kIExFTkdUSAkJaWdub3JlZFxuXAotLUoJCQlpZ25vcmVkXG5cCi0tUwkJCWlnbm9yZWRcblwKLS10IEZJTEUJCQlpZ25vcmVkXG5cCi0tVAkJCWlnbm9yZWRcblwKLS1WCQkJaWdub3JlZFxuIikpOwotfQotDAotLyogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIHNlY3Rpb24gdGFrZSBudW1iZXJzIGluIHRoZSBtYWNoaW5lIGZvcm1hdCwgYW5kCi0gICBtdW5nZXMgdGhlbSBpbnRvIFRhaG9lIGJ5dGUgb3JkZXIuCi0gICBUaGV5IGV4aXN0IHByaW1hcmlseSBmb3IgY3Jvc3MgYXNzZW1ibHkgcHVycG9zZS4gKi8KLXZvaWQJCQkJLyogS25vd3MgYWJvdXQgb3JkZXIgb2YgYnl0ZXMgaW4gYWRkcmVzcy4gKi8KLW1kX251bWJlcl90b19jaGFycyAoY29uLCB2YWx1ZSwgbmJ5dGVzKQotICAgICBjaGFyIGNvbltdOwkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCi0gICAgIHZhbHVlVCB2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gKi8KLSAgICAgaW50IG5ieXRlczsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgb3V0cHV0LiAqLwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChjb24sIHZhbHVlLCBuYnl0ZXMpOwotfQotCi0jaWZkZWYgY29tbWVudAotdm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLwotbWRfbnVtYmVyX3RvX2ltbSAoY29uLCB2YWx1ZSwgbmJ5dGVzKQotICAgICBjaGFyIGNvbltdOwkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCi0gICAgIGxvbmcgaW50IHZhbHVlOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQuICovCi17Ci0gIG1kX251bWJlcl90b19jaGFycyAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKLX0KLQotI2VuZGlmIC8qIGNvbW1lbnQgKi8KLQotdm9pZAotdGNfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICAvKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkICovCi0gIGtub3cgKDApOwotfQotCi12b2lkCQkJCS8qIEtub3dzIGFib3V0IG9yZGVyIG9mIGJ5dGVzIGluIGFkZHJlc3MuICovCi1tZF9udW1iZXJfdG9fZGlzcCAoY29uLCB2YWx1ZSwgbmJ5dGVzKQotICAgICBjaGFyIGNvbltdOwkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCi0gICAgIGxvbmcgaW50IHZhbHVlOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQuICovCi17Ci0gIG1kX251bWJlcl90b19jaGFycyAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKLX0KLQotdm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLwotbWRfbnVtYmVyX3RvX2ZpZWxkIChjb24sIHZhbHVlLCBuYnl0ZXMpCi0gICAgIGNoYXIgY29uW107CQkvKiBSZXR1cm4gJ25ieXRlcycgb2YgY2hhcnMgaGVyZS4gKi8KLSAgICAgbG9uZyBpbnQgdmFsdWU7CQkvKiBUaGUgdmFsdWUgb2YgdGhlIGJpdHMuICovCi0gICAgIGludCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG91dHB1dC4gKi8KLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChjb24sIHZhbHVlLCBuYnl0ZXMpOwotfQotCi0vKiBQdXQgdGhlIGJpdHMgaW4gYW4gb3JkZXIgdGhhdCBhIHRhaG9lIHdpbGwgdW5kZXJzdGFuZCwgZGVzcGl0ZSB0aGUgb3JkZXJpbmcKLSAgIG9mIHRoZSBuYXRpdmUgbWFjaGluZS4KLSAgIE9uIFRhaG9lOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgYmlnIGVuZGlhbiBsb25nLAotICAgbmV4dCB0aHJlZSBieXRlcyBhcmUgc3ltYm9sbnVtLCBpbiBraW5kIG9mIDMgYnl0ZSBiaWcgZW5kaWFuIChsZWFzdCBzaWcuIGJ5dGUgbGFzdCkuCi0gICBUaGUgbGFzdCBieXRlIGlzIGJyb2tlbiB1cCB3aXRoIGJpdCA3IGFzIHBjcmVsLAotICAgCWJpdHMgNiAmIDUgYXMgbGVuZ3RoLAotCWJpdCA0IGFzIGV4dGVybiBhbmQgdGhlIGxhc3QgbmliYmxlIGFzICd1bmRlZmluZWQnLiAqLwotCi0jaWYgY29tbWVudAotdm9pZAotbWRfcmlfdG9fY2hhcnMgKHJpX3AsIHJpKQotICAgICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyaV9wLCByaTsKLXsKLSAgYnl0ZSB0aGVfYnl0ZXNbc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKV07Ci0gIC8qIFRoZSByZWFzb24gSSBjYW4ndCBqdXN0IGVuY29kZSB0aGVzZSBkaXJlY3RseSBpbnRvIHJpX3AgaXMgdGhhdAotICAgICByaV9wIG1heSBwb2ludCB0byByaS4gKi8KLQotICAvKiBUaGlzIGlzIGVhc3kgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpLnJfYWRkcmVzcywgc2l6ZW9mIChyaS5yX2FkZHJlc3MpKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICB0aGVfYnl0ZXNbNF0gPSAocmkucl9zeW1ib2xudW0gPj4gMTYpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s1XSA9IChyaS5yX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNl0gPSByaS5yX3N5bWJvbG51bSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbN10gPSAoKChyaS5yX2V4dGVybiA8PCA0KSAmIDB4MTApIHwgKChyaS5yX2xlbmd0aCA8PCA1KSAmIDB4NjApIHwKLQkJICAoKHJpLnJfcGNyZWwgPDwgNykgJiAweDgwKSkgJiAweGYwOwotCi0gIGJjb3B5ICh0aGVfYnl0ZXMsIChjaGFyICopIHJpX3AsIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpOwotfQotCi0jZW5kaWYgLyogY29tbWVudCAqLwotCi0vKiBQdXQgdGhlIGJpdHMgaW4gYW4gb3JkZXIgdGhhdCBhIHRhaG9lIHdpbGwgdW5kZXJzdGFuZCwgZGVzcGl0ZSB0aGUgb3JkZXJpbmcKLSAgIG9mIHRoZSBuYXRpdmUgbWFjaGluZS4KLSAgIE9uIFRhaG9lOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgYmlnIGVuZGlhbiBsb25nLAotICAgbmV4dCB0aHJlZSBieXRlcyBhcmUgc3ltYm9sbnVtLCBpbiBraW5kIG9mIDMgYnl0ZSBiaWcgZW5kaWFuIChsZWFzdCBzaWcuIGJ5dGUgbGFzdCkuCi0gICBUaGUgbGFzdCBieXRlIGlzIGJyb2tlbiB1cCB3aXRoIGJpdCA3IGFzIHBjcmVsLAotICAgCWJpdHMgNiAmIDUgYXMgbGVuZ3RoLAotCWJpdCA0IGFzIGV4dGVybiBhbmQgdGhlIGxhc3QgbmliYmxlIGFzICd1bmRlZmluZWQnLiAqLwotCi12b2lkIAotdGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBsb25nIHJfc3ltYm9sbnVtOwotCi0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0gICAgICAgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUsCi0JCSAgICAgIDQpOwotCi0gIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQotCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKLQotICB3aGVyZVs0XSA9IChyX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNl0gPSByX3N5bWJvbG51bSAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgoKGlzX3BjcmVsIChmaXhQKSA8PCA3KSAmIDB4ODApCi0JICAgICAgfCAoKCgoZml4UC0+ZnhfdHlwZSA9PSBGWF84IHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUw4Ci0JCSAgICA/IDAKLQkJICAgIDogKGZpeFAtPmZ4X3R5cGUgPT0gRlhfMTYgfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDE2Ci0JCSAgICAgICA/IDEKLQkJICAgIDogKGZpeFAtPmZ4X3R5cGUgPT0gRlhfMzIgfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDMyCi0JCSAgICAgICA/IDIKLQkJICAgICAgIDogNDIpKSkpIDw8IDUpICYgMHg2MCkKLQkgICAgICB8ICgoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpIDw8IDQpICYgMHgxMCkpOwotfQotCi0vKiBSZWxvY2F0ZSBieXRlIHN0dWZmICovCi0MCi0vKiBUaGlzIGlzIGZvciBicm9rZW4gd29yZC4gKi8KLWNvbnN0IGludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAzOwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyAxKTsKLSAgKnB0cisrID0gVEFIT0VfQlJXOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgb2Zmc2V0LCAyKTsKLX0KLQotY29uc3QgaW50IG1kX2xvbmdfanVtcF9zaXplID0gNjsKLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLwotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgdmFsdWVUIG9mZnNldDsKLQotICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDQpOwotICAqcHRyKysgPSBUQUhPRV9KTVA7Ci0gICpwdHIrKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgb2Zmc2V0LCA0KTsKLX0KLQwKLS8qCi0gKgkJCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkKLSAqCi0gKiBDYWxsZWQganVzdCBiZWZvcmUgcmVsYXgoKS4KLSAqIEFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkLCBzbyB3ZSBhc3N1bWVkCi0gKiB0aGF0IGl0IHdpbGwgYmUgcmVzb2x2ZWQgYnkgdGhlIGxpbmtlci4KLSAqIFJldHVybiB0aGUgY29ycmVjdCBmcl9zdWJ0eXBlIGluIHRoZSBmcmFnLCBmb3IgcmVsYXgoKQotICogUmV0dXJuIHRoZSBpbml0aWFsICJndWVzcyBmb3IgZnJfdmFyIiB0byBjYWxsZXIuIChIb3cgYmlnIEkgdGhpbmsgdGhpcwotICogd2lsbCBiZS4pCi0gKiBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCi0gKiBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgotICogQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQotICogMCB2YWx1ZS4KLSAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ21lbnRfdHlwZTsJCS8qIE5fREFUQSBvciBOX1RFWFQuICovCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIGludCBvbGRfZnJfZml4OwotICAvKiAgaW50IHBjX3JlbDsgRklYTUU6IHJlbW92ZSB0aGlzICovCi0KLSAgb2xkX2ZyX2ZpeCA9IGZyYWdQLT5mcl9maXg7Ci0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIC8qIFRoZSBzeW1ib2wgd2FzIGluIHRoZSBzYW1lIHNlZ21lbnQgYXMgdGhlIG9wY29kZSwgYW5kIGl0J3MKLQkgYSByZWFsIHBjX3JlbCBjYXNlIHNvIGl0J3MgYSByZWxheGFibGUgY2FzZS4gKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgY2FzZSBpcyBzdGlsbCB1bmRlZmluZWQsIHNvIGFzdW1lIGl0J3MgYSBsb25nIHdvcmQgZm9yIHRoZQotCSBsaW5rZXIgdG8gZml4LiAqLwotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgICpwIHw9IFRBSE9FX1BDX09SX0xPTkc7Ci0JICAvKiBXZSBub3cga25vdyBob3cgYmlnIGl0IHdpbGwgYmUsIG9uZSBsb25nIHdvcmQuICovCi0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAxLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCBGWF9QQ1JFTDMyLCBOVUxMKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKmZyYWdQLT5mcl9vcGNvZGUgXj0gMHgxMDsJLyogUmV2ZXJzZSBzZW5zZSBvZiBicmFuY2guICovCi0JICAqcCsrID0gNjsKLQkgICpwKysgPSBUQUhPRV9KTVA7Ci0JICAqcCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyAxICsgMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDMsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIEZYX1BDUkVMMzIsIE5VTEwpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX1JFVl9CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9Ci0JICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX1JFVl9CUkFOQ0gsIFNUQVRFX1dPUkQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKmZyYWdQLT5mcl9vcGNvZGUgXj0gMHgxMDsJLyogUmV2ZXJzZSBzZW5zZSBvZiBicmFuY2guICovCi0JICAqcCsrID0gMDsKLQkgICpwKysgPSA2OwotCSAgKnArKyA9IFRBSE9FX0pNUDsKLQkgICpwKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLQkgIGZyYWdQLT5mcl9maXggKz0gMiArIDIgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCBGWF9QQ1JFTDMyLCBOVUxMKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0gsIFNUQVRFX1dPUkQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKnArKyA9IDI7Ci0JICAqcCsrID0gMDsKLQkgICpwKysgPSBUQUhPRV9CUkI7Ci0JICAqcCsrID0gNjsKLQkgICpwKysgPSBUQUhPRV9KTVA7Ci0JICAqcCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0JICBmcmFnUC0+ZnJfZml4ICs9IDIgKyAyICsgMiArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDYsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIEZYX1BDUkVMMzIsIE5VTEwpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9CWVRFKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgICpmcmFnUC0+ZnJfb3Bjb2RlID0gVEFIT0VfSk1QOwotCSAgKnArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgRlhfUENSRUwzMiwgTlVMTCk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAoZnJhZ1AtPmZyX3ZhciArIGZyYWdQLT5mcl9maXggLSBvbGRfZnJfZml4KTsKLX0JCQkJLyogbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKSAqLwotDAotLyoKLSAqCQkJbWRfY29udmVydF9mcmFnKCk7Ci0gKgotICogQ2FsbGVkIGFmdGVyIHJlbGF4KCkgaXMgZmluaXNoZWQuCi0gKiBJbjoJQWRkcmVzcyBvZiBmcmFnLgotICoJZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudC4KLSAqCWZyX3N1YnR5cGUgaXMgd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLgotICoKLSAqIE91dDoJQW55IGZpeFNzIGFuZCBjb25zdGFudHMgYXJlIHNldCB1cC4KLSAqCUNhbGxlciB3aWxsIHR1cm4gZnJhZyBpbnRvIGEgIi5zcGFjZSAwIi4KLSAqLwotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqYWRkcmVzc1A7CS8qIC0+IF92YXIgdG8gY2hhbmdlLiAqLwotICByZWdpc3RlciBjaGFyICpvcGNvZGVQOwkvKiAtPiBvcGNvZGUgY2hhcihzKSB0byBjaGFuZ2UuICovCi0gIHJlZ2lzdGVyIHNob3J0IGludCBsZW5ndGhfY29kZTsJLyogMj1sb25nIDE9d29yZCAwPWJ5dGUgKi8KLSAgcmVnaXN0ZXIgc2hvcnQgaW50IGV4dGVuc2lvbiA9IDA7CS8qIFNpemUgb2YgcmVsYXhlZCBhZGRyZXNzLgotCQkJCSAgIEFkZGVkIHRvIGZyX2ZpeDogaW5jbC4gQUxMIHZhciBjaGFycy4gKi8KLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgcmVnaXN0ZXIgbG9uZyBpbnQgd2hlcmU7Ci0gIHJlZ2lzdGVyIGxvbmcgaW50IGFkZHJlc3Nfb2ZfdmFyOwotICAvKiBXaGVyZSwgaW4gZmlsZSBzcGFjZSwgaXMgX3ZhciBvZiAqZnJhZ1A/ICovCi0gIHJlZ2lzdGVyIGxvbmcgaW50IHRhcmdldF9hZGRyZXNzOwotICAvKiBXaGVyZSwgaW4gZmlsZSBzcGFjZSwgZG9lcyBhZGRyIHBvaW50PyAqLwotCi0gIGtub3cgKGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50KTsKLSAgbGVuZ3RoX2NvZGUgPSBSRUxBWF9MRU5HVEggKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLSAga25vdyAobGVuZ3RoX2NvZGUgPj0gMCAmJiBsZW5ndGhfY29kZSA8IDMpOwotICB3aGVyZSA9IGZyYWdQLT5mcl9maXg7Ci0gIGFkZHJlc3NQID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyB3aGVyZTsKLSAgb3Bjb2RlUCA9IGZyYWdQLT5mcl9vcGNvZGU7Ci0gIHN5bWJvbFAgPSBmcmFnUC0+ZnJfc3ltYm9sOwotICBrbm93IChzeW1ib2xQKTsKLSAgdGFyZ2V0X2FkZHJlc3MgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OwotICBhZGRyZXNzX29mX3ZhciA9IGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmU7Ci0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfQllURSk6Ci0gICAgICAvKiAqYWRkcmVzc1AgaG9sZHMgdGhlIHJlZ2lzdGVycyBudW1iZXIsIHBsdXMgMHgxMCwgaWYgaXQncyBkZWZlcnJlZAotICAgICAgIG1vZGUuIFRvIHNldCB1cCB0aGUgcmlnaHQgbW9kZSwganVzdCBPUiB0aGUgc2l6ZSBvZiB0aGlzIGRpc3BsYWNlbWVudCAqLwotICAgICAgLyogQnl0ZSBkaXNwbGFjZW1lbnQuICovCi0gICAgICAqYWRkcmVzc1ArKyB8PSBUQUhPRV9QQ19PUl9CWVRFOwotICAgICAgKmFkZHJlc3NQID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfV09SRCk6Ci0gICAgICAvKiBXb3JkIGRpc3BsYWNlbWVudC4gKi8KLSAgICAgICphZGRyZXNzUCsrIHw9IFRBSE9FX1BDX09SX1dPUkQ7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDMpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfTE9ORyk6Ci0gICAgICAvKiBMb25nIHdvcmQgZGlzcGxhY2VtZW50LiAqLwotICAgICAgKmFkZHJlc3NQKysgfD0gVEFIT0VfUENfT1JfTE9ORzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNSksIDQpOwotICAgICAgZXh0ZW5zaW9uID0gNTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfQllURSk6Ci0gICAgICAqYWRkcmVzc1AgPSB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDEpOwotICAgICAgZXh0ZW5zaW9uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICAqb3Bjb2RlUCBePSAweDEwOwkJLyogUmV2ZXJzZSBzZW5zZSBvZiB0ZXN0LiAqLwotICAgICAgKmFkZHJlc3NQKysgPSAzOwkJLyogSnVtcCBvdmVyIHdvcmQgYnJhbmNoICovCi0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX0JSVzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNCksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICAqb3Bjb2RlUCBePSAweDEwOwkJLyogUmV2ZXJzZSBzZW5zZSBvZiB0ZXN0LiAqLwotICAgICAgKmFkZHJlc3NQKysgPSA2OwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9KTVA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MsIDQpOwotICAgICAgZXh0ZW5zaW9uID0gNzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX0JZVEUpOgotICAgICAgKmFkZHJlc3NQID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAxKTsKLSAgICAgIGV4dGVuc2lvbiA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9XT1JEKToKLSAgICAgICpvcGNvZGVQID0gVEFIT0VfQlJXOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICAqb3Bjb2RlUCA9IFRBSE9FX0pNUDsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDUpLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfUkVWX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDIpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfUkVWX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICAqb3Bjb2RlUCBePSAweDEwOwotICAgICAgKmFkZHJlc3NQKysgPSAwOwotICAgICAgKmFkZHJlc3NQKysgPSA2OwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9KTVA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MsIDQpOwotICAgICAgZXh0ZW5zaW9uID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDIpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgKmFkZHJlc3NQKysgPSAwOwotICAgICAgKmFkZHJlc3NQKysgPSAyOwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9CUkI7Ci0gICAgICAqYWRkcmVzc1ArKyA9IDY7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX0pNUDsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcywgNCk7Ci0gICAgICBleHRlbnNpb24gPSAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJBRF9DQVNFIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGZyYWdQLT5mcl9maXggKz0gZXh0ZW5zaW9uOwotfQkJCQkvKiBtZF9jb252ZXJ0X2ZyYWcgKi8KLQwKLQotLyogVGhpcyBpcyB0aGUgc3R1ZmYgZm9yIG1kX2Fzc2VtYmxlLiAqLwotI2RlZmluZSBGUF9SRUcgMTMKLSNkZWZpbmUgU1BfUkVHIDE0Ci0jZGVmaW5lIFBDX1JFRyAxNQotI2RlZmluZSBCSUdHRVNUUkVHIFBDX1JFRwotCi0vKgotICogUGFyc2UgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IFNUQVJUCi0gKiBJZiBpdCByZXByZXNlbnRzIGEgdmFsaWQgcmVnaXN0ZXIsIHBvaW50IFNUQVJUIHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIKLSAqIHRoZSBsYXN0IHZhbGlkIHJlZ2lzdGVyIGNoYXIsIGFuZCByZXR1cm4gdGhlIHJlZ2lzdGVyIG51bWJlciAoMC0xNSkuCi0gKiBJZiBpbnZhbGlkLCBsZWF2ZSBTVEFSVCBhbG9uZSwgcmV0dXJuIC0xLgotICogVGhlIGZvcm1hdCBoYXMgdG8gYmUgZXhhY3QuIEkgZG9uJ3QgZG8gdGhpbmdzIGxpa2UgZWF0IGxlYWRpbmcgemVyb3MKLSAqIG9yIHRoZSBsaWtlLgotICogTm90ZTogVGhpcyBkb2Vzbid0IGNoZWNrIGZvciB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyBtYWtpbmcKLSAqIHRoaXMgaW52YWxpZC4gRXg6IFIxMjMgd291bGQgcmV0dXJuIDEyLCBpdCdzIHRoZSBjYWxsZXJzIGpvYiB0byBjaGVjawotICogd2hhdCBzdGFydCBpcyBwb2ludCB0byBhcG9uIHJldHVybi4KLSAqCi0gKiBWYWxpZCByZWdpc3RlcnMgYXJlIFIxLVIxNSwgJTEtJTE1LCBGUCAoMTMpLCBTUCAoMTQpLCBQQyAoMTUpCi0gKiBDYXNlIGRvZXNuJ3QgbWF0dGVyLgotICovCi1pbnQKLXRhaG9lX3JlZ19wYXJzZSAoc3RhcnQpCi0gICAgIGNoYXIgKipzdGFydDsJCS8qIEEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRvIHBhcnNlLiAqLwotewotICByZWdpc3RlciBjaGFyICpyZWdwb2ludCA9ICpzdGFydDsKLSAgcmVnaXN0ZXIgaW50IHJlZ251bSA9IC0xOwotCi0gIHN3aXRjaCAoKnJlZ3BvaW50KyspCi0gICAgewotICAgIGNhc2UgJyUnOgkJCS8qIFJlZ2lzdGVycyBjYW4gc3RhcnQgd2l0aCBhICUsCi0JCQkJICAgUiBvciByLCBhbmQgdGhlbiBhIG51bWJlci4gKi8KLSAgICBjYXNlICdSJzoKLSAgICBjYXNlICdyJzoKLSAgICAgIGlmIChpc2RpZ2l0ICgqcmVncG9pbnQpKQotCXsKLQkgIC8qIEdvdCB0aGUgZmlyc3QgZGlnaXQuICovCi0JICByZWdudW0gPSAqcmVncG9pbnQrKyAtICcwJzsKLQkgIGlmICgocmVnbnVtID09IDEpICYmIGlzZGlnaXQgKCpyZWdwb2ludCkpCi0JICAgIHsKLQkgICAgICAvKiBJdHMgYSB0d28gZGlnaXQgbnVtYmVyLiAqLwotCSAgICAgIHJlZ251bSA9IDEwICsgKCpyZWdwb2ludCsrIC0gJzAnKTsKLQkgICAgICBpZiAocmVnbnVtID4gQklHR0VTVFJFRykKLQkJewkJLyogTnVtYmVyIHRvbyBiaWc/ICovCi0JCSAgcmVnbnVtID0gLTE7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0YnOgkJCS8qIElzIGl0IHRoZSBGUCAqLwotICAgIGNhc2UgJ2YnOgotICAgICAgc3dpdGNoICgqcmVncG9pbnQrKykKLQl7Ci0JY2FzZSAncCc6Ci0JY2FzZSAnUCc6Ci0JICByZWdudW0gPSBGUF9SRUc7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncyc6CQkJLyogSG93IGFib3V0IHRoZSBTUCAqLwotICAgIGNhc2UgJ1MnOgotICAgICAgc3dpdGNoICgqcmVncG9pbnQrKykKLQl7Ci0JY2FzZSAncCc6Ci0JY2FzZSAnUCc6Ci0JICByZWdudW0gPSBTUF9SRUc7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncCc6CQkJLyogT1IgdGhlIFBDIGV2ZW4gKi8KLSAgICBjYXNlICdQJzoKLSAgICAgIHN3aXRjaCAoKnJlZ3BvaW50KyspCi0JewotCWNhc2UgJ2MnOgotCWNhc2UgJ0MnOgotCSAgcmVnbnVtID0gUENfUkVHOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAocmVnbnVtICE9IC0xKQotICAgIHsJCQkJLyogTm8gZXJyb3IsIHNvIG1vdmUgc3RyaW5nIHBvaW50ZXIgKi8KLSAgICAgICpzdGFydCA9IHJlZ3BvaW50OwotICAgIH0KLSAgcmV0dXJuIHJlZ251bTsJCS8qIFJldHVybiByZXN1bHRzICovCi19CQkJCS8qIHRhaG9lX3JlZ19wYXJzZSAqLwotDAotLyoKLSAqIFRoaXMgY2hvcHMgdXAgYW4gb3BlcmFuZCBhbmQgZmlndXJlcyBvdXQgaXRzIG1vZGVzIGFuZCBzdHVmZi4KLSAqIEl0J3MgYSBsaXR0bGUgdG91Y2h5IGFib3V0IGV4dHJhIGNoYXJhY3RlcnMuCi0gKiBPcHRleCB0byBzdGFydCB3aXRoIG9uZSBleHRyYSBjaGFyYWN0ZXIgc28gaXQgY2FuIGJlIG92ZXJ3cml0dGVuIGZvcgotICogdGhlIGJhY2t3YXJkIHBhcnQgb2YgdGhlIHBhcnNpbmcuCi0gKiBZb3UgY2FuJ3QgcHV0IGEgYnVuY2ggb2YgZXh0cmEgY2hhcmFjdGVycyBpbiBzaWRlIHRvCi0gKiBtYWtlIHRoZSBjb21tYW5kIGxvb2sgY3V0ZS4gaWU6ICogZm9vICggcjEgKSBbICByMCBdCi0gKiBJZiB5b3UgbGlrZSBkb2luZyBhIGxvdCBvZiB0eXBpbmcsIHRyeSBDT0JPTCEKLSAqIEFjdHVhbGx5LCB0aGlzIHBhcnNlciBpcyBhIGxpdHRsZSB3ZWFrIGFsbCBhcm91bmQuIEl0J3MgZGVzaWduZWQgdG8gYmUKLSAqIHVzZWQgd2l0aCBjb21wbGllcnMsIHNvIEkgZW1waGlzaXNlIGNvcnJlY3QgZGVjb2Rpbmcgb2YgdmFsaWQgY29kZSBxdWlja2x5Ci0gKiByYXRoZXIgdGhhdCBjYXRjaGluZyBldmVyeSBwb3NzYWJsZSBlcnJvci4KLSAqIE5vdGU6IFRoaXMgdXNlcyB0aGUgZXhwcmVzc2lvbiBmdW5jdGlvbiwgc28gc2F2ZSBpbnB1dF9saW5lX3BvaW50ZXIgYmVmb3JlCi0gKiBjYWxsaW5nLgotICoKLSAqIFNwZXJyeSBkZWZpbmVzIHRoZSBzZW1hbnRpY3Mgb2YgYWRkcmVzcyBtb2RlcyAoYW5kIHZhbHVlcykKLSAqIGJ5IGEgdHdvLWxldHRlciBjb2RlLCBleHBsYWluZWQgaGVyZS4KLSAqCi0gKiAgIGxldHRlciAxOiAgIGFjY2VzcyB0eXBlCi0gKgotICogICAgIGEgICAgICAgICBhZGRyZXNzIGNhbGN1bGF0aW9uIC0gbm8gZGF0YSBhY2Nlc3MsIHJlZ2lzdGVycyBmb3JiaWRkZW4KLSAqICAgICBiICAgICAgICAgYnJhbmNoIGRpc3BsYWNlbWVudAotICogICAgIG0gICAgICAgICByZWFkIC0gbGV0IGdvIG9mIGJ1cyAtIHdyaXRlIGJhY2sgIm1vZGlmeSIKLSAqICAgICByICAgICAgICAgcmVhZAotICogICAgIHcgICAgICAgICB3cml0ZQotICogICAgIHYgICAgICAgICBiaXQgZmllbGQgYWRkcmVzczogbGlrZSAnYScgYnV0IHJlZ2lzdGVycyBhcmUgT0sKLSAqCi0gKiAgIGxldHRlciAyOiAgIGRhdGEgdHlwZSAoaS5lLiB3aWR0aCwgYWxpZ25tZW50KQotICoKLSAqICAgICBiICAgICAgICAgYnl0ZQotICogICAgIHcgICAgICAgICB3b3JkCi0gKiAgICAgbCAgICAgICAgIGxvbmd3b3JkCi0gKiAgICAgcSAgICAgICAgIHF1YWR3b3JkIChFdmVuIHJlZ3MgPCAxNCBhbGxvd2VkKSAoaWYgMTIsIHlvdSBnZXQgYSB3YXJuaW5nKQotICogICAgIC0JIHVuY29uZGl0aW9uYWwgc3ludGhldGljIGpiciBvcGVyYW5kCi0gKiAgICAgPwkgc2ltcGxlIHN5bnRoZXRpYyByZXZlcnNhYmxlIGJyYW5jaCBvcGVyYW5kCi0gKiAgICAgIQkgY29tcGxleCBzeW50aGV0aWMgcmV2ZXJzYWJsZSBicmFuY2ggb3BlcmFuZAotICogICAgIDoJIGNvbXBsZXggc3ludGhldGljIG5vbi1yZXZlcnNhYmxlIGJyYW5jaCBvcGVyYW5kCi0gKgotICogVGhlICctPyE6JyBsZXR0ZXIgMidzIGFyZSBub3QgZm9yIGV4dGVybmFsIGNvbnN1bXB0aW9uLiBUaGV5IGFyZSB1c2VkCi0gKiBieSBHQVMgZm9yIHBzdWVkbyBvcHMgcmVsYXhpbmcgY29kZS4KLSAqCi0gKiBBZnRlciBwYXJzaW5nIHRvcFAgaGFzOgotICoKLSAqICAgdG9wX25keDogICAgICAgIC0xLCBvciB0aGUgaW5kZXggcmVnaXN0ZXIuIGVnIDc9W1I3XQotICogICB0b3BfcmVnOiAgICAgICAgLTEsIG9yIHJlZ2lzdGVyIG51bWJlci4gZWcgNyA9IFI3IG9yIChSNykKLSAqICAgdG9wX21vZGU6ICAgICAgIFRoZSBhZGRyZXNzaW5nIG1vZGUgYnl0ZS4gVGhpcyBieXRlLCBkZWZpbmVzIHdoaWNoIG9mCi0gKiAgICAgICAgICAgICAgICAgICB0aGUgMTEgbW9kZXMgb3Bjb2RlIGlzLgotICogICB0b3BfYWNjZXNzOiAgICAgQWNjZXNzIHR5cGUgd2FudGVkIGZvciB0aGlzIG9wcGVyYW5kICdiJ2JyYW5jaCAnICcKLSAqICAgICAgICAgICAgICAgICAgIG5vLWluc3RydWN0aW9uICdhbXJ2dycKLSAqICAgdG9wX3dpZHRoOiAgICAgIE9wZXJhbmQgd2lkdGggZXhwZWN0ZWQsIG9uZSBvZiAiYndscT8tOiEiCi0gKiAgIGV4cF9vZl9vcGVyYW5kOiBUaGUgZXhwcmVzc2lvbiBhcyBwYXJzZWQgYnkgZXhwcmVzc2lvbigpCi0gKiAgIHRvcF9kaXNwc2l6ZTogICBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGRpc3BsYWNlbWVudCBpZiB3ZSBjYW4gZmlndXJlIGl0Ci0gKiAgICAgICAgICAgICAgICAgICBvdXQgYW5kIGl0J3MgcmVsYXZlbnQuCi0gKgotICogTmVlZCBzeW50YXggY2hlY2tzIGJ1aWx0LgotICovCi0KLXZvaWQKLXRpcF9vcCAob3B0ZXgsIHRvcFApCi0gICAgIGNoYXIgKm9wdGV4OwkJLyogVGhlIHVzZXJzIHRleHQgaW5wdXQsIHdpdGggb25lIGxlYWRpbmcgY2hhcmFjdGVyICovCi0gICAgIHN0cnVjdCB0b3AgKnRvcFA7CQkvKiBUaGUgdGFob2UgaW5zdHJ1Y3Rpb24gd2l0aCBzb21lIGZpZWxkcyBhbHJlYWR5IHNldDoKLQkJCSBpbjogYWNjZXNzLCB3aWR0aAotCQkJIG91dDogbmR4LCByZWcsIG1vZGUsIGVycm9yLCBkaXNwc2l6ZSAqLwotCi17Ci0gIGludCBtb2RlID0gMDsJCQkvKiBUaGlzIG9wZXJhbmQncyBtb2RlLiAqLwotICBjaGFyIHNlZ2ZhdWx0ID0gKm9wdGV4OwkvKiBUbyBrZWVwIHRoZSBiYWNrIHBhcnNpbmcgZnJvbSBmcmVha2luZy4gKi8KLSAgY2hhciAqcG9pbnQgPSBvcHRleCArIDE7CS8qIFBhcnNpbmcgZnJvbSBmcm9udCB0byBiYWNrLiAqLwotICBjaGFyICplbmQ7CQkJLyogUGFyc2luZyBmcm9tIGJhY2sgdG8gZnJvbnQuICovCi0gIGludCByZWcgPSAtMTsJCQkvKiBtYWpvciByZWdpc3RlciwgLTEgbWVhbnMgYWJzZW50ICovCi0gIGludCBpbXJlZyA9IC0xOwkJLyogTWFqb3IgcmVnaXN0ZXIgaW4gaW1tZWRpYXRlIG1vZGUgKi8KLSAgaW50IG5keCA9IC0xOwkJCS8qIGluZGV4IHJlZ2lzdGVyIG51bWJlciwgLTEgbWVhbnMgYWJzZW50ICovCi0gIGNoYXIgZGVjX2luYyA9ICcgJzsJCS8qIElzIHRoZSBTUCBhdXRvLWluY3JlbWVudGVkICcrJyBvcgotCQkJCSAgIGF1dG8tZGVjcmVtZW50ZWQgJy0nIG9yIG5laXRoZXIgJyAnLiAqLwotICBpbnQgaW1tZWRpYXRlID0gMDsJCS8qIDEgaWYgJyQnIGltbWVkaWF0ZSBtb2RlICovCi0gIGludCBjYWxsX3dpZHRoID0gMDsJCS8qIElmIHRoZSBjYWxsZXIgY2FzdHMgdGhlIGRpc3BsYWNlbWVudCAqLwotICBpbnQgYWJzX3dpZHRoID0gMDsJCS8qIFRoZSB3aWR0aCBvZiB0aGUgYWJzb2x1dGUgZGlzcGxhY21lbnQgKi8KLSAgaW50IGNvbV93aWR0aCA9IDA7CQkvKiBEaXNwbGFjZW1lbnQgd2lkdGggcmVxdWlyZWQgYnkgYnJhbmNoICovCi0gIGludCBkZWZlcnJlZCA9IDA7CQkvKiAxIGlmICcqJyBkZWZlcnJhbCBpcyB1c2VkICovCi0gIGJ5dGUgZGlzcF9zaXplID0gMDsJCS8qIEhvdyBiaWcgaXMgdGhpcyBvcGVyYW5kLiAwID09IGRvbid0IGtub3cgKi8KLSAgY2hhciAqb3BfYmFkID0gIiI7CQkvKiBCYWQgb3BlcmFuZCBlcnJvciAqLwotCi0gIGNoYXIgKnRwLCAqdGVtcCwgYzsJCS8qIFRlbXBvcmFyeSBob2xkZXJzICovCi0KLSAgY2hhciBhY2Nlc3MgPSB0b3BQLT50b3BfYWNjZXNzOwkvKiBTYXZlIG9uIGEgZGVyZWYuICovCi0gIGNoYXIgd2lkdGggPSB0b3BQLT50b3Bfd2lkdGg7Ci0KLSAgaW50IHJlYWxseV9ub25lID0gMDsJCS8qIEVtcHR5IGV4cHJlc3Npb25zIGV2YWx1YXRlIHRvIDAKLQkJCQkgICBidXQgSSBuZWVkIHRvIGtub3cgaWYgaXQncyB0aGVyZSBvciBub3QgKi8KLSAgZXhwcmVzc2lvblMgKmV4cFA7CQkvKiAtPiBleHByZXNzaW9uIHZhbHVlcyBmb3IgdGhpcyBvcGVyYW5kICovCi0KLSAgLyogRG9lcyB0aGlzIGNvbW1hbmQgcmVzdHJpY3QgdGhlIGRpc3BsYWNlbWVudCBzaXplLiAqLwotICBpZiAoYWNjZXNzID09ICdiJykKLSAgICBjb21fd2lkdGggPSAod2lkdGggPT0gJ2InID8gMSA6Ci0JCSAod2lkdGggPT0gJ3cnID8gMiA6Ci0JCSAgKHdpZHRoID09ICdsJyA/IDQgOiAwKSkpOwotCi0gICpvcHRleCA9ICdcMCc7CQkvKiBUaGlzIGlzIGtpbmQgb2YgYSBiYWNrIHN0b3AgZm9yIGFsbAotCQkJCSAgIHRoZSBzZWFyY2hlcyB0byBmYWlsIG9uIGlmIG5lZWRlZC4qLwotICBpZiAoKnBvaW50ID09ICcqJykKLSAgICB7CQkJCS8qIEEgZGVyZWZlcmVuY2U/ICovCi0gICAgICBkZWZlcnJlZCA9IDE7Ci0gICAgICBwb2ludCsrOwotICAgIH0KLQotICAvKiBGb3JjZSB3b3JkcyBpbnRvIGEgY2VydGFpbiBtb2RlICovCi0gIC8qIEJpdGNoLCBCaXRjaCwgQml0Y2ghICovCi0gIC8qCi0gICAqIFVzaW5nIHRoZSBeIG9wZXJhdG9yIGlzIGFtYmlnb3VzLiBJZiBJIGhhdmUgYW4gYWJzb2x1dGUgbGFiZWwKLSAgICogY2FsbGVkICd3JyBzZXQgdG8sIHNheSAyLCBhbmQgSSBoYXZlIHRoZSBleHByZXNzaW9uICd3XjEnLCBkbyBJIGdldAotICAgKiAxLCBmb3JjZWQgdG8gYmUgaW4gd29yZCBkaXNwbGFjZW1lbnQgbW9kZSwgb3IgZG8gSSBnZXQgdGhlIHZhbHVlIG9mCi0gICAqICd3JyBvcidlZCB3aXRoIDEgKDMgaW4gdGhpcyBjYXNlKS4KLSAgICogVGhlIGRlZmF1bHQgaXMgJ3cnIGFzIGFuIG9mZnNldCwgc28gdGhhdCdzIHdoYXQgSSB1c2UuCi0gICAqIFN0aWNrIHdpdGggYCwgaXQgZG9lcyB0aGUgc2FtZSwgYW5kIGlzbid0IGFtYmlnLgotICAgKi8KLQotICBpZiAoKnBvaW50ICE9ICdcMCcgJiYgKChwb2ludFsxXSA9PSAnXicpIHx8IChwb2ludFsxXSA9PSAnYCcpKSkKLSAgICBzd2l0Y2ggKCpwb2ludCkKLSAgICAgIHsKLSAgICAgIGNhc2UgJ2InOgotICAgICAgY2FzZSAnQic6Ci0gICAgICBjYXNlICd3JzoKLSAgICAgIGNhc2UgJ1cnOgotICAgICAgY2FzZSAnbCc6Ci0gICAgICBjYXNlICdMJzoKLQlpZiAoY29tX3dpZHRoKQotCSAgYXNfd2FybiAoXygiQ2FzdGluZyBhIGJyYW5jaCBkaXNwbGFjZW1lbnQgaXMgYmFkIGZvcm0sIGFuZCBpcyBpZ25vcmVkLiIpKTsKLQllbHNlCi0JICB7Ci0JICAgIGMgPSAoaXN1cHBlciAoKnBvaW50KSA/IHRvbG93ZXIgKCpwb2ludCkgOiAqcG9pbnQpOwotCSAgICBjYWxsX3dpZHRoID0gKChjID09ICdiJykgPyAxIDoKLQkJCSAgKChjID09ICd3JykgPyAyIDogNCkpOwotCSAgfQotCXBvaW50ICs9IDI7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgLyogU2V0dGluZyBpbW1lZGlhdGUgbW9kZSAqLwotICBpZiAoKnBvaW50ID09ICckJykKLSAgICB7Ci0gICAgICBpbW1lZGlhdGUgPSAxOwotICAgICAgcG9pbnQrKzsKLSAgICB9Ci0KLSAgLyoKLSAgICogSSd2ZSBwdWxsZWQgb2ZmIGFsbCB0aGUgZWFzeSBzdHVmZiBvZmYgdGhlIGZyb250LCBtb3ZlIHRvIHRoZSBlbmQgYW5kCi0gICAqIHlhbmsuCi0gICAqLwotCi0gIGZvciAoZW5kID0gcG9pbnQ7ICplbmQgIT0gJ1wwJzsgZW5kKyspCS8qIE1vdmUgdG8gdGhlIGVuZC4gKi8KLSAgICA7Ci0KLSAgaWYgKGVuZCAhPSBwb2ludCkJCS8qIE51bGwgc3RyaW5nPyAqLwotICAgIGVuZC0tOwotCi0gIGlmIChlbmQgPiBwb2ludCAmJiAqZW5kID09ICcgJyAmJiBlbmRbLTFdICE9ICdcJycpCi0gICAgZW5kLS07CQkJLyogSG9wIHdoaXRlIHNwYWNlICovCi0KLSAgLyogSXMgdGhpcyBhbiBpbmRleCByZWcuICovCi0gIGlmICgoKmVuZCA9PSAnXScpICYmIChlbmRbLTFdICE9ICdcJycpKQotICAgIHsKLSAgICAgIHRlbXAgPSBlbmQ7Ci0KLSAgICAgIC8qIEZpbmQgb3BlbmluZyBicmFjZS4gKi8KLSAgICAgIGZvciAoLS1lbmQ7ICgqZW5kICE9ICdbJyAmJiBlbmQgIT0gcG9pbnQpOyBlbmQtLSkKLQk7Ci0KLSAgICAgIC8qIElmIEkgZm91bmQgdGhlIG9wZW5pbmcgYnJhY2UsIGdldCB0aGUgaW5kZXggcmVnaXN0ZXIgbnVtYmVyLiAqLwotICAgICAgaWYgKCplbmQgPT0gJ1snKQotCXsKLQkgIHRwID0gZW5kICsgMTsJCS8qIHRwIHNob3VsZCBwb2ludCB0byB0aGUgc3RhcnQgb2YgYSByZWcuICovCi0JICBuZHggPSB0YWhvZV9yZWdfcGFyc2UgKCZ0cCk7Ci0JICBpZiAodHAgIT0gdGVtcCkKLQkgICAgewkJCS8qIFJlZy4gcGFyc2UgZXJyb3IuICovCi0JICAgICAgbmR4ID0gLTE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVuZC0tOwkJLyogRm91bmQgaXQsIG1vdmUgcGFzdCBicmFjZS4gKi8KLQkgICAgfQotCSAgaWYgKG5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIG9wX2JhZCA9IF8oIkNvdWxkbid0IHBhcnNlIHRoZSBbaW5kZXhdIGluIHRoaXMgb3BlcmFuZC4iKTsKLQkgICAgICBlbmQgPSBwb2ludDsJLyogRm9yY2UgYWxsIHRoZSByZXN0IG9mIHRoZSB0ZXN0cyB0byBmYWlsLiAqLwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wX2JhZCA9IF8oIkNvdWxkbid0IGZpbmQgdGhlIG9wZW5pbmcgJ1snIGZvciB0aGUgaW5kZXggb2YgdGhpcyBvcGVyYW5kLiIpOwotCSAgZW5kID0gcG9pbnQ7CQkvKiBGb3JjZSBhbGwgdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHRvIGZhaWwuICovCi0JfQotICAgIH0KLQotICAvKiBQb3N0IGluY3JlbWVudD8gKi8KLSAgaWYgKCplbmQgPT0gJysnKQotICAgIHsKLSAgICAgIGRlY19pbmMgPSAnKyc7Ci0gICAgICAvKiB3YXM6ICAgICplbmQtLTsgKi8KLSAgICAgIGVuZC0tOwotICAgIH0KLQotICAvKiByZWdpc3RlciBpbiBwYXJlbnM/ICovCi0gIGlmICgoKmVuZCA9PSAnKScpICYmIChlbmRbLTFdICE9ICdcJycpKQotICAgIHsKLSAgICAgIHRlbXAgPSBlbmQ7Ci0KLSAgICAgIC8qIEZpbmQgb3BlbmluZyBwYXJlbi4gKi8KLSAgICAgIGZvciAoLS1lbmQ7ICgqZW5kICE9ICcoJyAmJiBlbmQgIT0gcG9pbnQpOyBlbmQtLSkKLQk7Ci0KLSAgICAgIC8qIElmIEkgZm91bmQgdGhlIG9wZW5pbmcgcGFyZW4sIGdldCB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAqLwotICAgICAgaWYgKCplbmQgPT0gJygnKQotCXsKLQkgIHRwID0gZW5kICsgMTsKLQkgIHJlZyA9IHRhaG9lX3JlZ19wYXJzZSAoJnRwKTsKLQkgIGlmICh0cCAhPSB0ZW1wKQotCSAgICB7Ci0JICAgICAgLyogTm90IGEgcmVnaXN0ZXIsIGJ1dCBjb3VsZCBiZSBwYXJ0IG9mIHRoZSBleHByZXNzaW9uLiAqLwotCSAgICAgIHJlZyA9IC0xOwotCSAgICAgIGVuZCA9IHRlbXA7CS8qIFJlc3QgdGhlIHBvaW50ZXIgYmFjayAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBlbmQtLTsJCS8qIEZvdW5kIHRoZSByZWcuIG1vdmUgYmVmb3JlIG9wZW5pbmcgcGFyZW4uICovCi0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3BfYmFkID0gXygiQ291bGRuJ3QgZmluZCB0aGUgb3BlbmluZyAnKCcgZm9yIHRoZSBkZXJlZiBvZiB0aGlzIG9wZXJhbmQuIik7Ci0JICBlbmQgPSBwb2ludDsJCS8qIEZvcmNlIGFsbCB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgdG8gZmFpbC4gKi8KLQl9Ci0gICAgfQotCi0gIC8qIFByZSBkZWNyZW1lbnQ/ICovCi0gIGlmICgqZW5kID09ICctJykKLSAgICB7Ci0gICAgICBpZiAoZGVjX2luYyAhPSAnICcpCi0JewotCSAgb3BfYmFkID0gXygiT3BlcmFuZCBjYW4ndCBiZSBib3RoIHByZS1pbmMgYW5kIHBvc3QtZGVjLiIpOwotCSAgZW5kID0gcG9pbnQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRlY19pbmMgPSAnLSc7Ci0JICAvKiB3YXM6ICAgICAgKmVuZC0tOyAqLwotCSAgZW5kLS07Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBFdmVyeXRoaW5nIGJldHdlZW4gcG9pbnQgYW5kIGVuZCBpcyB0aGUgJ2V4cHJlc3Npb24nLCB1bmxlc3MgaXQncwotICAgKiBhIHJlZ2lzdGVyIG5hbWUuCi0gICAqLwotCi0gIGMgPSBlbmRbMV07Ci0gIGVuZFsxXSA9ICdcMCc7Ci0KLSAgdHAgPSBwb2ludDsKLSAgaW1yZWcgPSB0YWhvZV9yZWdfcGFyc2UgKCZwb2ludCk7CS8qIEdldCB0aGUgaW1tZWRpYXRlIHJlZ2lzdGVyCi0JCQkJICAgICAgaWYgaXQgaXMgdGhlcmUuKi8KLSAgaWYgKCpwb2ludCAhPSAnXDAnKQotICAgIHsKLSAgICAgIC8qIElmIHRoZXJlIGlzIGp1bmsgYWZ0ZXIgcG9pbnQsIHRoZW4gdGhlIGl0J3Mgbm90IGltbWVkaWF0ZSByZWcuICovCi0gICAgICBwb2ludCA9IHRwOwotICAgICAgaW1yZWcgPSAtMTsKLSAgICB9Ci0KLSAgaWYgKGltcmVnICE9IC0xICYmIHJlZyAhPSAtMSkKLSAgICBvcF9iYWQgPSBfKCJJIHBhcnNlZCAyIHJlZ2lzdGVycyBpbiB0aGlzIG9wZXJhbmQuIik7Ci0KLSAgLyoKLSAgICogRXZhbHVhdGUgd2hhdHMgbGVmdCBvZiB0aGUgZXhwcmVzc2lvbiB0byBzZWUgaWYgaXQncyB2YWxpZC4KLSAgICogTm90ZSBhZ2FpbjogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGNhbGxpbmcgZXhwcmVzc2lvbiBoYXMgc2F2ZWQKLSAgICogaW5wdXRfbGluZV9wb2ludGVyLiAoTmFnLCBuYWcsIG5hZyEpCi0gICAqLwotCi0gIGlmICgqb3BfYmFkID09ICdcMCcpCi0gICAgewotICAgICAgLyogc3RhdGVtZW50IGhhcyBubyBzeW50YXggZ29vZnMgeWV0OiBsZXRzIHNuaWZmIHRoZSBleHByZXNzaW9uICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwb2ludDsKLSAgICAgIGV4cFAgPSAmKHRvcFAtPmV4cF9vZl9vcGVyYW5kKTsKLSAgICAgIHRvcFAtPnNlZ19vZl9vcGVyYW5kID0gZXhwcmVzc2lvbiAoZXhwUCk7Ci0gICAgICBzd2l0Y2ggKGV4cFAtPlhfb3ApCi0JewotCWNhc2UgT19hYnNlbnQ6Ci0JICAvKiBObyBleHByZXNzaW9uLiBGb3IgQlNENC4yIGNvbXBhdGliaWxpdHksIG1pc3NpbmcgZXhwcmVzc2lvbiBpcwotCSAgICAgYWJzb2x1dGUgMCAqLwotCSAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBleHBQLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgcmVhbGx5X25vbmUgPSAxOwotCWNhc2UgT19jb25zdGFudDoKLQkgIC8qIGZvciBTRUdfQUJTT0xVVEUsIHdlIHNob3VsZG50IG5lZWQgdG8gc2V0IFhfb3Bfc3ltYm9sLAotCSAgICAgWF9hZGRfc3ltYm9sIHRvIGFueSBwYXJ0aWN1bGFyIHZhbHVlLiAqLwotCSAgLyogQnV0LCB3ZSB3aWxsIHByb2dyYW0gZGVmZW5zaXZlbHkuIFNpbmNlIHRoaXMgc2l0dWF0aW9uIG9jY3VycwotCSAgICAgcmFyZWx5IHNvIGl0IGNvc3RzIHVzIGxpdHRsZSB0byBkbyBzby4gKi8KLQkgIGV4cFAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICBleHBQLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICAvKiBIb3cgbWFueSBieXRlcyBhcmUgbmVlZGVkIHRvIGV4cHJlc3MgdGhpcyBhYnMgdmFsdWU/ICovCi0JICBhYnNfd2lkdGggPQotCSAgICAoKCgoZXhwUC0+WF9hZGRfbnVtYmVyICYgMHhGRkZGRkY4MCkgPT0gMCkgfHwKLQkgICAgICAoKGV4cFAtPlhfYWRkX251bWJlciAmIDB4RkZGRkZGODApID09IDB4RkZGRkZGODApKSA/IDEgOgotCSAgICAgKCgoZXhwUC0+WF9hZGRfbnVtYmVyICYgMHhGRkZGODAwMCkgPT0gMCkgfHwKLQkgICAgICAoKGV4cFAtPlhfYWRkX251bWJlciAmIDB4RkZGRjgwMDApID09IDB4RkZGRjgwMDApKSA/IDIgOiA0KTsKLQotCWNhc2UgT19zeW1ib2w6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAvKgotCSAgICogTWFqb3IgYnVnLiBXZSBjYW4ndCBoYW5kbGUgdGhlIGNhc2Ugb2YgYSBvcGVyYXRvcgotCSAgICogZXhwcmVzc2lvbiBpbiBhIHN5bnRoZXRpYyBvcGNvZGUgdmFyaWFibGUtbGVuZ3RoCi0JICAgKiBpbnN0cnVjdGlvbi4gIFdlIGRvbid0IGhhdmUgYSBmcmFnIHR5cGUgdGhhdCBpcyBzbWFydAotCSAgICogZW5vdWdoIHRvIHJlbGF4IGEgb3BlcmF0b3IsIGFuZCBzbyB3ZSBqdXN0IGZvcmNlIGFsbAotCSAgICogb3BlcmF0b3JzIHRvIGJlaGF2ZSBsaWtlIFNFR19QQVNTMXMuICBDbGVhcmx5LCBpZiB0aGVyZSBpcwotCSAgICogYSBkZW1hbmQgd2UgY2FuIGludmVudCBhIG5ldyBvciBtb2RpZmllZCBmcmFnIHR5cGUgYW5kCi0JICAgKiB0aGVuIGNvZGluZyB1cCBhIGZyYWcgZm9yIHRoaXMgY2FzZSB3aWxsIGJlIGVhc3kuCi0JICAgKi8KLQkgIG5lZWRfcGFzc18yID0gMTsKLQkgIG9wX2JhZCA9IF8oIkNhbid0IHJlbG9jYXRlIGV4cHJlc3Npb24gZXJyb3IuIik7Ci0JICBicmVhazsKLQotCWNhc2UgT19iaWc6Ci0JICAvKiBUaGlzIGlzIGFuIGVycm9yLiBUYWhvZSBkb2Vzbid0IGFsbG93IGFueSBleHByZXNzaW9ucwotCSAgICAgYmlnZ2VyIHRoYXQgYSAzMiBiaXQgbG9uZyB3b3JkLiBBbnkgYmlnZ2VyIGhhcyB0byBiZSByZWZlcmVuY2VkCi0JICAgICBieSBhZGRyZXNzLiAqLwotCSAgb3BfYmFkID0gXygiRXhwcmVzc2lvbiBpcyB0b28gbGFyZ2UgZm9yIGEgMzIgYml0cy4iKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcMCcpCi0JewotCSAgb3BfYmFkID0gXygiSnVuayBhdCBlbmQgb2YgZXhwcmVzc2lvbi4iKTsKLQl9Ci0gICAgfQotCi0gIGVuZFsxXSA9IGM7Ci0KLSAgLyogSSdtIGRvbmUsIHNvIHJlc3RvcmUgb3B0ZXggKi8KLSAgKm9wdGV4ID0gc2VnZmF1bHQ7Ci0KLQotICAvKgotICAgKiBBdCB0aGlzIHBvaW50IGluIHRoZSBnYW1lLCB3ZSAoaW4gdGhlb3J5KSBoYXZlIGFsbCB0aGUgY29tcG9uZW50cyBvZgotICAgKiB0aGUgb3BlcmFuZCBhdCBsZWFzdCBwYXJzZWQuIE5vdyBpdCdzIHRpbWUgdG8gY2hlY2sgZm9yIHN5bnRheC9zZW1hbnRpYwotICAgKiBlcnJvcnMsIGFuZCBidWlsZCB0aGUgbW9kZS4KLSAgICogVGhpcyBpcyB3aGF0IEkgaGF2ZToKLSAgICogICBkZWZlcnJlZCA9IDEgaWYgJyonCi0gICAqICAgY2FsbF93aWR0aCA9IDAsMSwyLDQKLSAgICogICBhYnNfd2lkdGggPSAwLDEsMiw0Ci0gICAqICAgY29tX3dpZHRoID0gMCwxLDIsNAotICAgKiAgIGltbWVkaWF0ZSA9IDEgaWYgJyQnCi0gICAqICAgbmR4ID0gLTEgb3IgcmVnIG51bQotICAgKiAgIGRlY19pbmMgPSAnLScgb3IgJysnIG9yICcgJwotICAgKiAgIHJlZyA9IC0xIG9yIHJlZyBudW0KLSAgICogICBpbXJlZyA9IC0xIG9yIHJlZyBudW0KLSAgICogICB0b3BQLT5leHBfb2Zfb3BlcmFuZAotICAgKiAgIHJlYWxseV9ub25lCi0gICAqLwotICAvKiBJcyB0aGVyZSBhIGRpc3BsYWNlbWVudCBzaXplPyAqLwotICBkaXNwX3NpemUgPSAoY2FsbF93aWR0aCA/IGNhbGxfd2lkdGggOgotCSAgICAgICAoY29tX3dpZHRoID8gY29tX3dpZHRoIDoKLQkJYWJzX3dpZHRoID8gYWJzX3dpZHRoIDogMCkpOwotCi0gIGlmICgqb3BfYmFkID09ICdcMCcpCi0gICAgewotICAgICAgaWYgKGltcmVnICE9IC0xKQotCXsKLQkgIC8qIFJuICovCi0JICBtb2RlID0gVEFIT0VfRElSRUNUX1JFRzsKLQkgIGlmIChkZWZlcnJlZCB8fCBpbW1lZGlhdGUgfHwgKGRlY19pbmMgIT0gJyAnKSB8fAotCSAgICAgIChyZWcgIT0gLTEpIHx8ICFyZWFsbHlfbm9uZSkKLQkgICAgb3BfYmFkID0gXygiU3ludGF4IGVycm9yIGluIGRpcmVjdCByZWdpc3RlciBtb2RlLiIpOwotCSAgZWxzZSBpZiAobmR4ICE9IC0xKQotCSAgICBvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaW5kZXggYSByZWdpc3RlciBpbiBkaXJlY3QgcmVnaXN0ZXIgbW9kZS4iKTsKLQkgIGVsc2UgaWYgKGltcmVnID09IFNQX1JFRyAmJiBhY2Nlc3MgPT0gJ3InKQotCSAgICBvcF9iYWQgPQotCSAgICAgIF8oIlNQIGNhbid0IGJlIHRoZSBzb3VyY2Ugb3BlcmFuZCB3aXRoIGRpcmVjdCByZWdpc3RlciBhZGRyZXNzaW5nLiIpOwotCSAgZWxzZSBpZiAoYWNjZXNzID09ICdhJykKLQkgICAgb3BfYmFkID0gXygiQ2FuJ3QgdGFrZSB0aGUgYWRkcmVzcyBvZiBhIHJlZ2lzdGVyLiIpOwotCSAgZWxzZSBpZiAoYWNjZXNzID09ICdiJykKLQkgICAgb3BfYmFkID0gXygiRGlyZWN0IFJlZ2lzdGVyIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIik7Ci0JICBlbHNlIGlmICh3aWR0aCA9PSAncScgJiYgKChpbXJlZyAlIDIpIHx8IChpbXJlZyA+IDEzKSkpCi0JICAgIG9wX2JhZCA9IF8oIkZvciBxdWFkIGFjY2VzcywgdGhlIHJlZ2lzdGVyIG11c3QgYmUgZXZlbiBhbmQgPCAxNC4iKTsKLQkgIGVsc2UgaWYgKGNhbGxfd2lkdGgpCi0JICAgIG9wX2JhZCA9IF8oIllvdSBjYW4ndCBjYXN0IGEgZGlyZWN0IHJlZ2lzdGVyLiIpOwotCi0JICBpZiAoKm9wX2JhZCA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgLyogTm8gZXJyb3JzLCBjaGVjayBmb3Igd2FybmluZ3MgKi8KLQkgICAgICBpZiAod2lkdGggPT0gJ3EnICYmIGltcmVnID09IDEyKQotCQlhc193YXJuIChfKCJVc2luZyByZWcgMTQgZm9yIHF1YWR3b3JkcyBjYW4gdHJvbXAgdGhlIEZQIHJlZ2lzdGVyLiIpKTsKLQotCSAgICAgIHJlZyA9IGltcmVnOwotCSAgICB9Ci0KLQkgIC8qIFdlIGtub3c6IGltbSA9IC0xICovCi0JfQotICAgICAgZWxzZSBpZiAoZGVjX2luYyA9PSAnLScpCi0JewotCSAgLyogLShTUCkgKi8KLQkgIG1vZGUgPSBUQUhPRV9BVVRPX0RFQzsKLQkgIGlmIChkZWZlcnJlZCB8fCBpbW1lZGlhdGUgfHwgIXJlYWxseV9ub25lKQotCSAgICBvcF9iYWQgPSBfKCJTeW50YXggZXJyb3IgaW4gYXV0by1kZWMgbW9kZS4iKTsKLQkgIGVsc2UgaWYgKG5keCAhPSAtMSkKLQkgICAgb3BfYmFkID0gXygiWW91IGNhbid0IGhhdmUgYW4gaW5kZXggYXV0byBkZWMgbW9kZS4iKTsKLQkgIGVsc2UgaWYgKGFjY2VzcyA9PSAncicpCi0JICAgIG9wX2JhZCA9IF8oIkF1dG8gZGVjIG1vZGUgY2FudCBiZSB1c2VkIGZvciByZWFkaW5nLiIpOwotCSAgZWxzZSBpZiAocmVnICE9IFNQX1JFRykKLQkgICAgb3BfYmFkID0gXygiQXV0byBkZWMgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIik7Ci0JICBlbHNlIGlmIChhY2Nlc3MgPT0gJ2InKQotCSAgICBvcF9iYWQgPSBfKCJBdXRvIGRlYyBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIpOwotCSAgZWxzZSBpZiAod2lkdGggPT0gJ3EnKQotCSAgICBvcF9iYWQgPSBfKCJBdXRvIGRlYyB3b24ndCB3b3JrIHdpdGggcXVhZHdvcmRzLiIpOwotCi0JICAvKiBXZSBrbm93OiBpbW0gPSAtMSwgZGVjX2luYyAhPSAnLScgKi8KLQl9Ci0gICAgICBlbHNlIGlmIChkZWNfaW5jID09ICcrJykKLQl7Ci0JICBpZiAoaW1tZWRpYXRlIHx8ICFyZWFsbHlfbm9uZSkKLQkgICAgb3BfYmFkID0gXygiU3ludGF4IGVycm9yIGluIG9uZSBvZiB0aGUgYXV0by1pbmMgbW9kZXMuIik7Ci0JICBlbHNlIGlmIChkZWZlcnJlZCkKLQkgICAgewotCSAgICAgIC8qICooU1ApKyAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9BVVRPX0lOQ19ERUZFUlJFRDsKLQkgICAgICBpZiAocmVnICE9IFNQX1JFRykKLQkJb3BfYmFkID0gXygiQXV0byBpbmMgZGVmZXJyZWQgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIik7Ci0JICAgICAgZWxzZSBpZiAobmR4ICE9IC0xKQotCQlvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaGF2ZSBhbiBpbmRleCBhdXRvIGluYyBkZWZlcnJlZCBtb2RlLiIpOwotCSAgICAgIGVsc2UgaWYgKGFjY2VzcyA9PSAnYicpCi0JCW9wX2JhZCA9IF8oIkF1dG8gaW5jIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIChTUCkrICovCi0JICAgICAgbW9kZSA9IFRBSE9FX0FVVE9fSU5DOwotCSAgICAgIGlmIChhY2Nlc3MgPT0gJ20nIHx8IGFjY2VzcyA9PSAndycpCi0JCW9wX2JhZCA9IF8oIllvdSBjYW4ndCB3cml0ZSB0byBhbiBhdXRvIGluYyByZWdpc3Rlci4iKTsKLQkgICAgICBlbHNlIGlmIChyZWcgIT0gU1BfUkVHKQotCQlvcF9iYWQgPSBfKCJBdXRvIGluYyBvbmx5IHdvcmtzIG9mIHRoZSBTUCByZWdpc3Rlci4iKTsKLQkgICAgICBlbHNlIGlmIChhY2Nlc3MgPT0gJ2InKQotCQlvcF9iYWQgPSBfKCJBdXRvIGluYyBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIpOwotCSAgICAgIGVsc2UgaWYgKHdpZHRoID09ICdxJykKLQkJb3BfYmFkID0gXygiQXV0byBpbmMgd29uJ3Qgd29yayB3aXRoIHF1YWR3b3Jkcy4iKTsKLQkgICAgICBlbHNlIGlmIChuZHggIT0gLTEpCi0JCW9wX2JhZCA9IF8oIllvdSBjYW4ndCBoYXZlIGFuIGluZGV4IGluIGF1dG8gaW5jIG1vZGUuIik7Ci0JICAgIH0KLQotCSAgLyogV2Uga25vdzogaW1tID0gLTEsIGRlY19pbmMgPT0gJyAnICovCi0JfQotICAgICAgZWxzZSBpZiAocmVnICE9IC0xKQotCXsKLQkgIGlmICgobmR4ICE9IC0xKSAmJiAocmVnID09IFNQX1JFRykpCi0JICAgIG9wX2JhZCA9IF8oIllvdSBjYW4ndCBpbmRleCB0aGUgc3AgcmVnaXN0ZXIuIik7Ci0JICBpZiAoZGVmZXJyZWQpCi0JICAgIHsKLQkgICAgICAvKiAqPGRpc3A+KFJuKSAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9SRUdfRElTUF9ERUZFUlJFRDsKLQkgICAgICBpZiAoaW1tZWRpYXRlKQotCQlvcF9iYWQgPSBfKCJTeW50YXggZXJyb3IgaW4gcmVnaXN0ZXIgZGlzcGxhY2VkIG1vZGUuIik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJlYWxseV9ub25lKQotCSAgICB7Ci0JICAgICAgLyogKFJuKSAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9SRUdfREVGRVJSRUQ7Ci0JICAgICAgLyogaWYgcmVnID0gU1AgdGhlbiBjYW50IGJlIGluZGV4ZWQgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogPGRpc3A+KFJuKSAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9SRUdfRElTUDsKLQkgICAgfQotCi0JICAvKiBXZSBrbm93OiBpbW0gPSAtMSwgZGVjX2luYyA9PSAnICcsIFJlZyA9IC0xICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChyZWFsbHlfbm9uZSkKLQkgICAgb3BfYmFkID0gXygiQW4gb2ZmZXN0IGlzIG5lZWRlZCBmb3IgdGhpcyBvcGVyYW5kLiIpOwotCSAgaWYgKGRlZmVycmVkICYmIGltbWVkaWF0ZSkKLQkgICAgewotCSAgICAgIC8qICokPEFERFI+ICovCi0JICAgICAgbW9kZSA9IFRBSE9FX0FCU09MVVRFX0FERFI7Ci0JICAgICAgZGlzcF9zaXplID0gNDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW1tZWRpYXRlKQotCSAgICB7Ci0JICAgICAgLyogJDxkaXNwPiAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9JTU1FRElBVEU7Ci0JICAgICAgaWYgKG5keCAhPSAtMSkKLQkJb3BfYmFkID0gXygiWW91IGNhbid0IGluZGV4IGEgcmVnaXN0ZXIgaW4gaW1tZWRpYXRlIG1vZGUuIik7Ci0JICAgICAgaWYgKGFjY2VzcyA9PSAnYScpCi0JCW9wX2JhZCA9IF8oIkltbWVkaWF0ZSBhY2Nlc3MgY2FuJ3QgYmUgdXNlZCBhcyBhbiBhZGRyZXNzLiIpOwotCSAgICAgIC8qIHBvbmRlciB0aGUgd2lzZG9tIG9mIGEgY2FzdCBiZWNhdXNlIGl0IGRvZXNuJ3QgZG8gYW55IGdvb2QuICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKGRlZmVycmVkKQotCSAgICB7Ci0JICAgICAgLyogKjxkaXNwPiAqLwotCSAgICAgIG1vZGUgPSBUQUhPRV9ESVNQX1JFTF9ERUZFUlJFRDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogPGRpc3A+ICovCi0JICAgICAgbW9kZSA9IFRBSE9FX0RJU1BMQUNFRF9SRUxBVElWRTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICogQXQgdGhpcyBwb2ludCwgYWxsIHRoZSBlcnJvcnMgd2UgY2FuIGRvIGhhdmUgYmUgY2hlY2tlZCBmb3IuCi0gICAqIFdlIGNhbiBidWlsZCB0aGUgJ3RvcCcuICovCi0KLSAgdG9wUC0+dG9wX25keCA9IG5keDsKLSAgdG9wUC0+dG9wX3JlZyA9IHJlZzsKLSAgdG9wUC0+dG9wX21vZGUgPSBtb2RlOwotICB0b3BQLT50b3BfZXJyb3IgPSBvcF9iYWQ7Ci0gIHRvcFAtPnRvcF9kaXNwc2l6ZSA9IGRpc3Bfc2l6ZTsKLX0JCQkJLyogdGlwX29wICovCi0MCi0vKgotICogICAgICAgICAgICAgICAgICB0IGkgcCAoICkKLSAqCi0gKiBUaGlzIGNvbnZlcnRzIGEgc3RyaW5nIGludG8gYSB0YWhvZSBpbnN0cnVjdGlvbi4KLSAqIFRoZSBzdHJpbmcgbXVzdCBiZSBhIGJhcmUgc2luZ2xlIGluc3RydWN0aW9uIGluIHRhaG9lICh3aXRoIEJTRDQgZnJvYnMpCi0gKiBmb3JtYXQuCi0gKiBJdCBwcm92aWRlcyBhdCBtb3N0IG9uZSBmYXRhbCBlcnJvciBtZXNzYWdlICh3aGljaCBzdG9wcyB0aGUgc2NhbikKLSAqIHNvbWUgd2FybmluZyBtZXNzYWdlcyBhcyBpdCBmaW5kcyB0aGVtLgotICogVGhlIHRhaG9lIGluc3RydWN0aW9uIGlzIHJldHVybmVkIGluIGV4cGxvZGVkIGZvcm0uCi0gKgotICogVGhlIGV4cGxvZGVkIGluc3RydWN0aW9uIGlzIHJldHVybmVkIHRvIGEgc3RydWN0IHRpdCBvZiB5b3VyIGNob2ljZS4KLSAqICNpbmNsdWRlICJ0YWhvZS1pbnN0LmgiIHRvIGtub3cgd2hhdCBhIHN0cnVjdCB0aXQgaXMuCi0gKgotICovCi0KLXN0YXRpYyB2b2lkCi10aXAgKHRpdFAsIGluc3RyaW5nKQotICAgICBzdHJ1Y3QgdGl0ICp0aXRQOwkJLyogV2UgYnVpbGQgYW4gZXhwbG9kZWQgaW5zdHJ1Y3Rpb24gaGVyZS4gKi8KLSAgICAgY2hhciAqaW5zdHJpbmc7CQkvKiBUZXh0IG9mIGEgdmF4IGluc3RydWN0aW9uOiB3ZSBtb2RpZnkuICovCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCB0b3Rfd290ICp0d1AgPSBOVUxMOwkvKiBIb3cgdG8gYml0LWVuY29kZSB0aGlzIG9wY29kZS4gKi8KLSAgcmVnaXN0ZXIgY2hhciAqcDsJCS8qIDEvc2tpcCB3aGl0ZXNwYWNlLjIvc2NhbiB2b3RfaG93ICovCi0gIHJlZ2lzdGVyIGNoYXIgKnE7CQkvKiAgKi8KLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjb3VudDsJLyogY291bnRzIG51bWJlciBvZiBvcGVyYW5kcyBzZWVuICovCi0gIHJlZ2lzdGVyIHN0cnVjdCB0b3AgKm9wZXJhbmRwOy8qIHNjYW4gb3BlcmFuZHMgaW4gc3RydWN0IHRpdCAqLwotICByZWdpc3RlciBjaGFyICphbGxvcGVyciA9ICIiOwkvKiBlcnJvciBvdmVyIGFsbCBvcGVyYW5kcyAqLwotICByZWdpc3RlciBjaGFyIGM7CQkvKiBSZW1lbWJlciBjaGFyLCAod2UgY2xvYmJlciBpdAotCQkJCSAgIHdpdGggJ1wwJyB0ZW1wb3JhcmlseSkuICovCi0gIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmICgqaW5zdHJpbmcgPT0gJyAnKQotICAgICsraW5zdHJpbmc7CQkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICovCi0gIGZvciAocCA9IGluc3RyaW5nOyAqcCAmJiAqcCAhPSAnICc7IHArKykKLSAgICA7CQkJCS8qIE1VU1QgZW5kIGluIGVuZC1vZi1zdHJpbmcgb3IKLQkJCQkgICBleGFjdGx5IDEgc3BhY2UuICovCi0gIC8qIFNjYW5uZWQgdXAgdG8gZW5kIG9mIG9wZXJhdGlvbi1jb2RlLiAqLwotICAvKiBPcGVyYXRpb24tY29kZSBpcyBlbmRlZCB3aXRoIHdoaXRlc3BhY2UuICovCi0gIGlmIChwID09IGluc3RyaW5nKQotICAgIHsKLSAgICAgIHRpdFAtPnRpdF9lcnJvciA9IF8oIk5vIG9wZXJhdG9yIik7Ci0gICAgICBjb3VudCA9IDA7Ci0gICAgICB0aXRQLT50aXRfb3Bjb2RlID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjID0gKnA7Ci0gICAgICAqcCA9ICdcMCc7Ci0gICAgICAvKgotICAgICAqIEhlcmUgd2l0aCBpbnN0cmluZyBwb2ludGluZyB0byB3aGF0IGJldHRlciBiZSBhbiBvcC1uYW1lLCBhbmQgcAotICAgICAqIHBvaW50aW5nIHRvIGNoYXJhY3RlciBqdXN0IHBhc3QgdGhhdC4KLSAgICAgKiBXZSB0cnVzdCBpbnN0cmluZyBwb2ludHMgdG8gYW4gb3AtbmFtZSwgd2l0aCBubyB3aGl0ZXNwYWNlLgotICAgICAqLwotICAgICAgdHdQID0gKHN0cnVjdCB0b3Rfd290ICopIGhhc2hfZmluZCAob3BfaGFzaCwgaW5zdHJpbmcpOwotICAgICAgKnAgPSBjOwkJCS8qIFJlc3RvcmUgY2hhciBhZnRlciBvcC1jb2RlLiAqLwotICAgICAgaWYgKHR3UCA9PSAwKQotCXsKLQkgIHRpdFAtPnRpdF9lcnJvciA9IF8oIlVua25vd24gb3BlcmF0b3IiKTsKLQkgIGNvdW50ID0gMDsKLQkgIHRpdFAtPnRpdF9vcGNvZGUgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKgotICAgICAgICogV2UgZm91bmQgYSBtYXRjaCEgU28gbGV0cyBwaWNrIHVwIGFzIG1hbnkgb3BlcmFuZHMgYXMgdGhlCi0gICAgICAgKiBpbnN0cnVjdGlvbiB3YW50cywgYW5kIGV2ZW4gZ3JpcGUgaWYgdGhlcmUgYXJlIHRvbyBtYW55LgotICAgICAgICogV2UgZXhwZWN0IGNvbW1hIHRvIHNlcGVyYXRlIGVhY2ggb3BlcmFuZC4KLSAgICAgICAqIFdlIGxldCBpbnN0cmluZyB0cmFjayB0aGUgdGV4dCwgd2hpbGUgcCB0cmFja3MgYSBwYXJ0IG9mIHRoZQotICAgICAgICogc3RydWN0IHRvdC4KLSAgICAgICAqLwotCi0JICBjb3VudCA9IDA7CQkvKiBubyBvcGVyYW5kcyBzZWVuIHlldCAqLwotCSAgaW5zdHJpbmcgPSBwICsgKCpwICE9ICdcMCcpOwkvKiBwb2ludCBwYXN0IHRoZSBvcGVyYXRpb24gY29kZSAqLwotCSAgLyogdGlwX29wKCkgc2NyZXdzIHdpdGggdGhlIGlucHV0X2xpbmVfcG9pbnRlciwgc28gc2F2ZSBpdCBiZWZvcmUKLQkgSSBqdW1wIGluICovCi0JICBzYXZlX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGZvciAocCA9IHR3UC0+YXJncywgb3BlcmFuZHAgPSB0aXRQLT50aXRfb3BlcmFuZDsKLQkgICAgICAgISphbGxvcGVyciAmJiAqcDsKLQkgICAgICAgb3BlcmFuZHArKywgcCArPSAyKQotCSAgICB7Ci0JICAgICAgLyoKLQkgKiBIZXJlIHRvIHBhcnNlIG9uZSBvcGVyYW5kLiBMZWF2ZSBpbnN0cmluZyBwb2ludGluZyBqdXN0Ci0JICogcGFzdCBhbnkgb25lICcsJyB0aGF0IG1hcmtzIHRoZSBlbmQgb2YgdGhpcyBvcGVyYW5kLgotCSAqLwotCSAgICAgIGlmICghcFsxXSkKLQkJYXNfZmF0YWwgKF8oIkNvbXBpbGVyIGJ1ZzogT0REIG51bWJlciBvZiBieXRlcyBpbiBhcmcgc3RydWN0dXJlICVzLiIpLAotCQkJICB0d1AtPmFyZ3MpOwotCSAgICAgIGVsc2UgaWYgKCppbnN0cmluZykKLQkJewotCQkgIGZvciAocSA9IGluc3RyaW5nOyAoKnEgIT0gJywnICYmICpxICE9ICdcMCcpOyBxKyspCi0JCSAgICB7Ci0JCSAgICAgIGlmICgqcSA9PSAnXCcnICYmIHFbMV0gIT0gJ1wwJykJLyogSnVtcCBxdW90ZWQgY2hhcmFjdGVycyAqLwotCQkJcSsrOwotCQkgICAgfQotCQkgIGMgPSAqcTsKLQkJICAvKgotCSAgICogUSBwb2ludHMgdG8gJywnIG9yICdcMCcgdGhhdCBlbmRzIGFyZ3VtZW50LiBDIGlzIHRoYXQKLQkgICAqIGNoYXJhY3Rlci4KLQkgICAqLwotCQkgICpxID0gJ1wwJzsKLQkJICBvcGVyYW5kcC0+dG9wX2FjY2VzcyA9IHBbMF07Ci0JCSAgb3BlcmFuZHAtPnRvcF93aWR0aCA9IHBbMV07Ci0JCSAgdGlwX29wIChpbnN0cmluZyAtIDEsIG9wZXJhbmRwKTsKLQkJICAqcSA9IGM7CS8qIFJlc3RvcmUgaW5wdXQgdGV4dC4gKi8KLQkJICBpZiAoKihvcGVyYW5kcC0+dG9wX2Vycm9yKSkKLQkJICAgIHsKLQkJICAgICAgYWxsb3BlcnIgPSBvcGVyYW5kcC0+dG9wX2Vycm9yOwotCQkgICAgfQotCQkgIGluc3RyaW5nID0gcSArIChjID8gMSA6IDApOwkvKiBuZXh0IG9wZXJhbmQgKGlmIGFueSkgKi8KLQkJICBjb3VudCsrOwkvKiAgd29uIGFub3RoZXIgYXJndW1lbnQsIG1heSBoYXZlIGFuIG9wZXJyICovCi0JCX0KLQkgICAgICBlbHNlCi0JCWFsbG9wZXJyID0gXygiTm90IGVub3VnaCBvcGVyYW5kcyIpOwotCSAgICB9Ci0JICAvKiBSZXN0b3JlIHRoZSBwb2ludGVyLiAqLwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLQkgIGlmICghKmFsbG9wZXJyKQotCSAgICB7Ci0JICAgICAgaWYgKCppbnN0cmluZyA9PSAnICcpCi0JCWluc3RyaW5nKys7CS8qIFNraXAgd2hpdGVzcGFjZS4gKi8KLQkgICAgICBpZiAoKmluc3RyaW5nKQotCQlhbGxvcGVyciA9IF8oIlRvbyBtYW55IG9wZXJhbmRzIik7Ci0JICAgIH0KLQkgIHRpdFAtPnRpdF9lcnJvciA9IGFsbG9wZXJyOwotCX0KLSAgICB9Ci0KLSAgdGl0UC0+dGl0X29wY29kZSA9IHR3UC0+Y29kZTsJLyogVGhlIG9wLWNvZGUuICovCi0gIHRpdFAtPnRpdF9vcGVyYW5kcyA9IGNvdW50OwotfQkJCQkvKiB0aXAgKi8KLQwKLS8qIG1kX2Fzc2VtYmxlKCkgZW1pdCBmcmFncyBmb3IgMSBpbnN0cnVjdGlvbiAqLwotdm9pZAotbWRfYXNzZW1ibGUgKGluc3RydWN0aW9uX3N0cmluZykKLSAgICAgY2hhciAqaW5zdHJ1Y3Rpb25fc3RyaW5nOwkvKiBBIHN0cmluZzogYXNzZW1ibGUgMSBpbnN0cnVjdGlvbi4gKi8KLXsKLSAgY2hhciAqcDsKLSAgcmVnaXN0ZXIgc3RydWN0IHRvcCAqb3BlcmFuZFA7LyogQW4gb3BlcmFuZC4gU2NhbnMgYWxsIG9wZXJhbmRzLiAqLwotICAvKiAgY2hhciBjX3NhdmU7CWZpeG1lOiByZW1vdmUgdGhpcyBsaW5lICovLyogV2hhdCB1c2VkIHRvIGxpdmUgYWZ0ZXIgYW4gZXhwcmVzc2lvbi4gKi8KLSAgLyogIHN0cnVjdCBmcmFnICpmcmFnUDsJZml4bWU6IHJlbW92ZSB0aGlzIGxpbmUgKi8vKiBGcmFnbWVudCBvZiBjb2RlIHdlIGp1c3QgbWFkZS4gKi8KLSAgLyogIHJlZ2lzdGVyIHN0cnVjdCB0b3AgKmVuZF9vcGVyYW5kUDsgZml4bWU6IHJlbW92ZSB0aGlzIGxpbmUgKi8vKiAtPiBzbG90IGp1c3QgYWZ0ZXIgbGFzdCBvcGVyYW5kCi0JCQkJCUxpbWl0IG9mIHRoZSBmb3IgKGVhY2ggb3BlcmFuZCkuICovCi0gIHJlZ2lzdGVyIGV4cHJlc3Npb25TICpleHBQOwkvKiAtPiBleHByZXNzaW9uIHZhbHVlcyBmb3IgdGhpcyBvcGVyYW5kICovCi0KLSAgLyogVGhlc2UgcmVmZXIgdG8gYW4gaW5zdHJ1Y3Rpb24gb3BlcmFuZCBleHByZXNzaW9uLiAqLwotICBzZWdUIHRvX3NlZzsJCQkvKiBUYXJnZXQgc2VnbWVudCBvZiB0aGUgYWRkcmVzcy4JICovCi0KLSAgcmVnaXN0ZXIgdmFsdWVUIHRoaXNfYWRkX251bWJlcjsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqdGhpc19hZGRfc3ltYm9sOwkvKiArdmUgKG1pbnVlbmQpIHN5bWJvbC4gKi8KLQotICAvKiAgdGFob2Vfb3Bjb2RlVCBvcGNvZGVfYXNfbnVtYmVyOyBmaXhtZTogcmVtb3ZlIHRoaXMgbGluZSAqLy8qIFRoZSBvcGNvZGUgYXMgYSBudW1iZXIuICovCi0gIGNoYXIgKm9wY29kZVA7CQkvKiBXaGVyZSBpdCBpcyBpbiBhIGZyYWcuICovCi0gIC8qICBjaGFyICpvcG1vZGVQOwlmaXhtZTogcmVtb3ZlIHRoaXMgbGluZSAqLy8qIFdoZXJlIG9wY29kZSB0eXBlIGlzLCBpbiBhIGZyYWcuICovCi0KLSAgaW50IGRpc3BzaXplOwkJCS8qIEZyb20gdG9wX2Rpc3BzaXplOiB0YWhvZV9vcGVyYW5kX3dpZHRoCi0JCQkJICAgKGluIGJ5dGVzKSAqLwotICBpbnQgaXNfdW5kZWZpbmVkOwkJLyogMSBpZiBvcGVyYW5kIGV4cHJlc3Npb24ncwotCQkJCSAgIHNlZ21lbnQgbm90IGtub3duIHlldC4gKi8KLSAgaW50IHBjX3JlbDsJCQkvKiBJcyB0aGlzIG9wZXJhbmQgcGMgcmVsYXRpdmU/ICovCi0KLSAgLyogRGVjb2RlIHRoZSBvcGVyYW5kLiAqLwotICB0aXAgKCZ0LCBpbnN0cnVjdGlvbl9zdHJpbmcpOwotCi0gIC8qCi0gICAqIENoZWNrIHRvIHNlZSBpZiB0aGlzIG9wZXJhbmQgZGVjb2RlIHByb3Blcmx5LgotICAgKiBOb3RpY2UgdGhhdCB3ZSBoYXZlbid0IG1hZGUgYW55IGZyYWdzIHlldC4KLSAgICogSWYgaXQgZ29vZmVkLCB0aGVuIHRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCB3ZWRnZSBpbiBhbnkgcGFzcywKLSAgICogYW5kIHdlIGNhbiBzYWZlbHkgZmx1c2ggaXQsIHdpdGhvdXQgY2F1c2luZyBpbnRlcnBhc3Mgc3ltYm9sIHBoYXNlCi0gICAqIGVycm9ycy4gVGhhdCBpcywgd2l0aG91dCBjaGFuZ2luZyBsYWJlbCB2YWx1ZXMgaW4gZGlmZmVyZW50IHBhc3Nlcy4KLSAgICovCi0gIGlmICgqdC50aXRfZXJyb3IpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiSWdub3Jpbmcgc3RhdGVtZW50IGR1ZSB0byBcIiVzXCIiKSwgdC50aXRfZXJyb3IpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIHNhdyBubyBlcnJvcnMgaW4gYW55IG9wZXJhbmRzIC0gdHJ5IHRvIG1ha2UgZnJhZyhzKSAqLwotICAgICAgLyogRW1pdCBvcC1jb2RlLiAqLwotICAgICAgLyogUmVtZW1iZXIgd2hlcmUgaXQgaXMsIGluIGNhc2Ugd2Ugd2FudCB0byBtb2RpZnkgdGhlIG9wLWNvZGUgbGF0ZXIuICovCi0gICAgICBvcGNvZGVQID0gZnJhZ19tb3JlICgxKTsKLSAgICAgICpvcGNvZGVQID0gdC50aXRfb3Bjb2RlOwotICAgICAgLyogTm93IGRvIGVhY2ggb3BlcmFuZC4gKi8KLSAgICAgIGZvciAob3BlcmFuZFAgPSB0LnRpdF9vcGVyYW5kOwotCSAgIG9wZXJhbmRQIDwgdC50aXRfb3BlcmFuZCArIHQudGl0X29wZXJhbmRzOwotCSAgIG9wZXJhbmRQKyspCi0JewkJCS8qIGZvciBlYWNoIG9wZXJhbmQgKi8KLQkgIGV4cFAgPSAmKG9wZXJhbmRQLT5leHBfb2Zfb3BlcmFuZCk7Ci0JICBpZiAob3BlcmFuZFAtPnRvcF9uZHggPj0gMCkKLQkgICAgewotCSAgICAgIC8qIEluZGV4ZWQgYWRkcmVzc2luZyBieXRlCi0JICAgTGVnYWxpdHkgb2YgaW5kZXhlZCBtb2RlIGFscmVhZHkgY2hlY2tlZDogaXQgaXMgT0sgKi8KLQkgICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKDB4NDAgKyBvcGVyYW5kUC0+dG9wX25keCk7Ci0JICAgIH0JCQkvKiBpZih0b3BfbmR4Pj0wKSAqLwotCi0JICAvKiBIZXJlIHRvIG1ha2UgbWFpbiBvcGVyYW5kIGZyYWcocykuICovCi0JICB0aGlzX2FkZF9udW1iZXIgPSBleHBQLT5YX2FkZF9udW1iZXI7Ci0JICB0aGlzX2FkZF9zeW1ib2wgPSBleHBQLT5YX2FkZF9zeW1ib2w7Ci0JICB0b19zZWcgPSBvcGVyYW5kUC0+c2VnX29mX29wZXJhbmQ7Ci0JICBrbm93ICh0b19zZWcgPT0gU0VHX1VOS05PV04gfHwgXAotCQl0b19zZWcgPT0gU0VHX0FCU09MVVRFIHx8IFwKLQkJdG9fc2VnID09IFNFR19EQVRBIHx8IFwKLQkJdG9fc2VnID09IFNFR19URVhUIHx8IFwKLQkJdG9fc2VnID09IFNFR19CU1MpOwotCSAgaXNfdW5kZWZpbmVkID0gKHRvX3NlZyA9PSBTRUdfVU5LTk9XTik7Ci0JICAvKiBEbyB3ZSBrbm93IGhvdyBiaWcgdGhpcyBvcHBlcmFuZCBpcz8gKi8KLQkgIGRpc3BzaXplID0gb3BlcmFuZFAtPnRvcF9kaXNwc2l6ZTsKLQkgIHBjX3JlbCA9IDA7Ci0JICAvKiBEZWFsIHdpdGggdGhlIGJyYW5jaCBwb3NzYWJpbGl0aWVzLiAoTm90ZSwgdGhpcyBkb2Vzbid0IGluY2x1ZGUKLQkganVtcHMuKSovCi0JICBpZiAob3BlcmFuZFAtPnRvcF9hY2Nlc3MgPT0gJ2InKQotCSAgICB7Ci0JICAgICAgLyogQnJhbmNoZXMgbXVzdCBiZSBleHByZXNzaW9ucy4gQSBwc3VlZG8gYnJhbmNoIGNhbiBhbHNvIGp1bXAgdG8KLQkgICBhbiBhYnNvbHV0ZSBhZGRyZXNzLiAqLwotCSAgICAgIGlmICh0b19zZWcgPT0gbm93X3NlZyB8fCBpc191bmRlZmluZWQpCi0JCXsKLQkJICAvKiBJZiBpc191bmRlZmluZWQsIHRoZW4gaXQgbWlnaHQgQkVDT01FIG5vd19zZWcgYnkgcmVsYXggdGltZS4gKi8KLQkJICBpZiAoZGlzcHNpemUpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEkga25vdyBob3cgYmlnIHRoZSBicmFuY2ggaXMgc3VwcG9zZWQgdG8gYmUgKGl0J3MgYSBub3JtYWwKLQkgICAgICAgYnJhbmNoKSwgc28gSSBzZXQgdXAgdGhlIGZyYWcsIGFuZCBsZXQgR0FTIGRvIHRoZSByZXN0LiAqLwotCQkgICAgICBwID0gZnJhZ19tb3JlIChkaXNwc2l6ZSk7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkgICAgICAgc2l6ZV90b19meCAoZGlzcHNpemUsIDEpLAotCQkJICAgICAgIE5VTEwpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogKHRvX3NlZz09bm93X3NlZyB8fCB0b19zZWcgPT0gU0VHX1VOS05PV04pICYmIGRpc3BzaXplPT0wICovCi0JCSAgICAgIC8qIElmIHdlIGRvbid0IGtub3cgaG93IGJpZyBpdCBpcywgdGhlbiBpdHMgYSBzeW50aGV0aWMgYnJhbmNoLAotCSAgICAgICBzbyB3ZSBzZXQgdXAgYSBzaW1wbGUgcmVsYXggc3RhdGUuICovCi0JCSAgICAgIHN3aXRjaCAob3BlcmFuZFAtPnRvcF93aWR0aCkKLQkJCXsKLQkJCWNhc2UgVEFIT0VfV0lEVEhfQ09ORElUSU9OQUxfSlVNUDoKLQkJCSAgLyogU2ltcGxlIChjb25kaXRpb25hbCkganVtcC4gSSBtYXkgaGF2ZSB0byByZXZlcnNlIHRoZQotCQkgY29uZGl0aW9uIG9mIG9wY29kZVAsIGFuZCB0aGVuIGp1bXAgdG8gbXkgZGVzdGluYXRpb24uCi0JCSBJIHNldCAxIGJ5dGUgYXNpZGUgZm9yIHRoZSBicmFuY2ggb2ZmIHNldCwgYW5kIGNvdWxkIG5lZWQgNgotCQkgbW9yZSBieXRlcyBmb3IgdGhlIHBjX3JlbCBqdW1wICovCi0JCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNywgMSwKLQkJCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsCi0JCQkJICAgIGlzX3VuZGVmaW5lZCA/IFNUQVRFX1VOREYgOiBTVEFURV9CWVRFKSwKLQkJCQkgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsIG9wY29kZVApOwotCQkJICBicmVhazsKLQkJCWNhc2UgVEFIT0VfV0lEVEhfQUxXQVlTX0pVTVA6Ci0JCQkgIC8qIFNpbXBsZSAodW5jb25kaXRpb25hbCkganVtcC4gSSBtYXkgaGF2ZSB0byBjb252ZXJ0IHRoaXMgdG8KLQkJIGEgd29yZCBicmFuY2gsIG9yIGFuIGFic29sdXRlIGp1bXAuICovCi0JCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNSwgMSwKLQkJCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILAotCQkJCSAgICBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfQllURSksCi0JCQkJIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLCBvcGNvZGVQKTsKLQkJCSAgYnJlYWs7Ci0JCQkgIC8qIFRoZSBzbWFsbGVzdCBzaXplIGZvciB0aGUgbmV4dCAyIGNhc2VzIGlzIHdvcmQuICovCi0JCQljYXNlIFRBSE9FX1dJRFRIX0JJR19SRVZfSlVNUDoKLQkJCSAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCAyLAotCQkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19SRVZfQlJBTkNILAotCQkJCSAgICBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfV09SRCksCi0JCQkJICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCSAgICBvcGNvZGVQKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIFRBSE9FX1dJRFRIX0JJR19OT05fUkVWX0pVTVA6Ci0JCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTAsIDIsCi0JCQkJICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX05PTl9SRVZfQlJBTkNILAotCQkJCSAgICBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfV09SRCksCi0JCQkJICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCSAgICBvcGNvZGVQKTsKLQkJCSAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICBhc19mYXRhbCAoXygiQ29tcGxpbGVyIGJ1ZzogR290IGEgY2FzZSAoJWQpIEkgd2Fzbid0IGV4cGVjdGluZy4iKSwKLQkJCQkgICAgb3BlcmFuZFAtPnRvcF93aWR0aCk7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiB0b19zZWcgIT0gbm93X3NlZyAmJiB0b19zZWcgIT0gc2VnX3Vua25vd24gKHN0aWxsIGluIGJyYW5jaCkKLQkgICAgIEluIG90aGVyIHdvcmRzLCBJJ20ganVtcGluZyBvdXQgb2YgbXkgc2VnbWVudCBzbyBleHRlbmQgdGhlCi0JICAgICBicmFuY2hlcyB0byBqdW1wcywgYW5kIGxldCBHQVMgZml4IHRoZW0uICovCi0KLQkJICAvKiBUaGVzZSBhcmUgImJyYW5jaGVzIiB3aGF0IHdpbGwgYWx3YXlzIGJlIGJyYW5jaGVzIGFyb3VuZCBhIGp1bXAKLQkgICAgIHRvIHRoZSBjb3JyZWN0IGFkZHJlc3NzIGluIHJlYWwgbGlmZS4KLQkgICAgIElmIHRvX3NlZyBpcyBTRUdfQUJTT0xVVEUsIGp1c3QgZW5jb2RlIHRoZSBicmFuY2ggaW4sCi0JICAgICBlbHNlIGxldCBHQVMgZml4IHRoZSBhZGRyZXNzLiAqLwotCi0JCSAgc3dpdGNoIChvcGVyYW5kUC0+dG9wX3dpZHRoKQotCQkgICAgewotCQkgICAgICAvKiBUaGUgdGhlb3J5OgotCSAgICAgICBGb3IgU0VHX0FCU09MVVRFLCB0aGVuIG1vZGUgaXMgQUJTT0xVVEVfQUREUiwganVtcAotCSAgICAgICB0byB0aGF0IGFkZHJlc3NzIChub3QgcGNfcmVsKS4KLQkgICAgICAgRm9yIG90aGVyIHNlZ3MsIGFkZHJlc3MgaXMgYSBsb25nIHdvcmQgUEMgcmVsIGp1bXAuICovCi0JCSAgICBjYXNlIFRBSE9FX1dJRFRIX0NPTkRJVElPTkFMX0pVTVA6Ci0JCSAgICAgIC8qIGI8Y29uZD4gKi8KLQkJICAgICAgLyogVG8gcmV2ZXJzZSB0aGUgY29uZGl0aW9uIGluIGEgVEFIT0UgYnJhbmNoLAotCSAgICAgICBjb21wbGVtZW50IGJpdCA0ICovCi0JCSAgICAgICpvcGNvZGVQIF49IDB4MTA7Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKDcpOwotCQkgICAgICAqcCsrID0gNjsKLQkJICAgICAgKnArKyA9IFRBSE9FX0pNUDsKLQkJICAgICAgKnArKyA9IChvcGVyYW5kUC0+dG9wX21vZGUgPT0KLQkJCSAgICAgIFRBSE9FX0FCU09MVVRFX0FERFIgPyBUQUhPRV9BQlNPTFVURV9BRERSIDoKLQkJCSAgICAgIFRBSE9FX1BDX1JFTF9MT05HKTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJICAgICAgICh0b19zZWcgIT0gU0VHX0FCU09MVVRFKSA/IEZYX1BDUkVMMzIgOiBGWF8zMiwgTlVMTCk7Ci0JCSAgICAgIC8qCi0JICAgICAqIE5vdyAoZWcpCUJMRVEJMWYKLQkgICAgICoJCUpNUAlmb28KLQkgICAgICoJMToKLQkgICAgICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBUQUhPRV9XSURUSF9BTFdBWVNfSlVNUDoKLQkJICAgICAgLyogYnIsIGp1c3QgdHVybiBpdCBpbnRvIGEganVtcCAqLwotCQkgICAgICAqb3Bjb2RlUCA9IFRBSE9FX0pNUDsKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoNSk7Ci0JCSAgICAgICpwKysgPSAob3BlcmFuZFAtPnRvcF9tb2RlID09Ci0JCQkgICAgICBUQUhPRV9BQlNPTFVURV9BRERSID8gVEFIT0VfQUJTT0xVVEVfQUREUiA6Ci0JCQkgICAgICBUQUhPRV9QQ19SRUxfTE9ORyk7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCSAgICAgICAodG9fc2VnICE9IFNFR19BQlNPTFVURSkgPyBGWF9QQ1JFTDMyIDogRlhfMzIsIE5VTEwpOwotCQkgICAgICAvKiBOb3cgKGVnKSBKTVAgZm9vICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBUQUhPRV9XSURUSF9CSUdfUkVWX0pVTVA6Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKDgpOwotCQkgICAgICAqb3Bjb2RlUCBePSAweDEwOwotCQkgICAgICAqcCsrID0gMDsKLQkJICAgICAgKnArKyA9IDY7Ci0JCSAgICAgICpwKysgPSBUQUhPRV9KTVA7Ci0JCSAgICAgICpwKysgPSAob3BlcmFuZFAtPnRvcF9tb2RlID09Ci0JCQkgICAgICBUQUhPRV9BQlNPTFVURV9BRERSID8gVEFIT0VfQUJTT0xVVEVfQUREUiA6Ci0JCQkgICAgICBUQUhPRV9QQ19SRUxfTE9ORyk7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCSAgICAgICAodG9fc2VnICE9IFNFR19BQlNPTFVURSkgPyBGWF9QQ1JFTDMyIDogRlhfMzIsIE5VTEwpOwotCQkgICAgICAvKgotCSAgICAgKiBOb3cgKGVnKQlBQ0J4CTFmCi0JICAgICAqCQlKTVAgICAgIGZvbwotCSAgICAgKgkxOgotCSAgICAgKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFRBSE9FX1dJRFRIX0JJR19OT05fUkVWX0pVTVA6Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKDEwKTsKLQkJICAgICAgKnArKyA9IDA7Ci0JCSAgICAgICpwKysgPSAyOwotCQkgICAgICAqcCsrID0gVEFIT0VfQlJCOwotCQkgICAgICAqcCsrID0gNjsKLQkJICAgICAgKnArKyA9IFRBSE9FX0pNUDsKLQkJICAgICAgKnArKyA9IChvcGVyYW5kUC0+dG9wX21vZGUgPT0KLQkJCSAgICAgIFRBSE9FX0FCU09MVVRFX0FERFIgPyBUQUhPRV9BQlNPTFVURV9BRERSIDoKLQkJCSAgICAgIFRBSE9FX1BDX1JFTF9MT05HKTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJICAgICAgICh0b19zZWcgIT0gU0VHX0FCU09MVVRFKSA/IEZYX1BDUkVMMzIgOiBGWF8zMiwgTlVMTCk7Ci0JCSAgICAgIC8qCi0JICAgICAqIE5vdyAoZWcpCXhPQnh4eAkxZgotCSAgICAgKgkJQlJCCTJmCi0JICAgICAqCTE6CUpNUAlAI2ZvbwotCSAgICAgKgkyOgotCSAgICAgKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdiJzoKLQkJICAgIGNhc2UgJ3cnOgotCQkgICAgICBhc193YXJuIChfKCJSZWFsIGJyYW5jaCBkaXNwbGFjZW1lbnRzIG11c3QgYmUgZXhwcmVzc2lvbnMuIikpOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGFzX2ZhdGFsIChfKCJDb21wbGllciBlcnJvcjogSSBnb3QgYW4gdW5rbm93biBzeW50aGV0aWMgYnJhbmNoIDolYyIpLAotCQkJCW9wZXJhbmRQLT50b3Bfd2lkdGgpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBJdCBhaW4ndCBhIGJyYW5jaCBvcGVyYW5kLiAqLwotCSAgICAgIHN3aXRjaCAob3BlcmFuZFAtPnRvcF9tb2RlKQotCQl7Ci0JCSAgLyogQXV0by1mb28gYWNjZXNzLCBvbmx5IHdvcmtzIGZvciBvbmUgcmVnIChTUCkKLQkgICAgIHNvIHRoZSBvbmx5IHRoaW5nIG5lZWRlZCBpcyB0aGUgbW9kZS4gKi8KLQkJY2FzZSBUQUhPRV9BVVRPX0RFQzoKLQkJY2FzZSBUQUhPRV9BVVRPX0lOQzoKLQkJY2FzZSBUQUhPRV9BVVRPX0lOQ19ERUZFUlJFRDoKLQkJICBGUkFHX0FQUEVORF8xX0NIQVIgKG9wZXJhbmRQLT50b3BfbW9kZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJICAvKiBOdW1iZXJlZCBSZWdpc3RlciBvbmx5IGFjY2Vzcy4gT25seSB0aGluZyBuZWVkZWQgaXMgdGhlCi0JICAgICBtb2RlICsgUmVnaXN0ZXIgbnVtYmVyICovCi0JCWNhc2UgVEFIT0VfRElSRUNUX1JFRzoKLQkJY2FzZSBUQUhPRV9SRUdfREVGRVJSRUQ6Ci0JCSAgRlJBR19BUFBFTkRfMV9DSEFSIChvcGVyYW5kUC0+dG9wX21vZGUgKyBvcGVyYW5kUC0+dG9wX3JlZyk7Ci0JCSAgYnJlYWs7Ci0KLQkJICAvKiBBbiBhYnNvbHV0ZSBhZGRyZXNzLiBJdCdzIHNpemUgaXMgYWx3YXlzIDUgYnl0ZXMuCi0JICAgICAobW9kZV90eXBlICsgNCBieXRlIGFkZHJlc3MpLiAqLwotCQljYXNlIFRBSE9FX0FCU09MVVRFX0FERFI6Ci0JCSAga25vdyAoKHRoaXNfYWRkX3N5bWJvbCA9PSBOVUxMKSk7Ci0JCSAgcCA9IGZyYWdfbW9yZSAoNSk7Ci0JCSAgKnAgPSBUQUhPRV9BQlNPTFVURV9BRERSOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCArIDEsIHRoaXNfYWRkX251bWJlciwgNCk7Ci0JCSAgYnJlYWs7Ci0KLQkJICAvKiBJbW1lZGlhdGUgZGF0YS4gSWYgdGhlIHNpemUgaXNuJ3Qga25vd24sIHRoZW4gaXQncyBhbiBhZGRyZXNzCi0JICAgICArIGFuZCBvZmZzZXQsIHdoaWNoIGlzIDQgYnl0ZXMgYmlnLiAqLwotCQljYXNlIFRBSE9FX0lNTUVESUFURToKLQkJICBpZiAodGhpc19hZGRfc3ltYm9sICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKDUpOwotCQkgICAgICAqcCsrID0gVEFIT0VfSU1NRURJQVRFX0xPTkdXT1JEOwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJICAgICAgIEZYXzMyLCBOVUxMKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIEl0J3MgYSBpbnRlZ2VyLCBhbmQgSSBrbm93IGl0J3Mgc2l6ZS4gKi8KLQkJICAgICAgaWYgKCh1bnNpZ25lZCkgdGhpc19hZGRfbnVtYmVyIDwgMHg0MCkKLQkJCXsKLQkJCSAgLyogV2lsbCBpdCBmaXQgaW4gYSBsaXRlcmFsPyAqLwotCQkJICBGUkFHX0FQUEVORF8xX0NIQVIgKChieXRlKSB0aGlzX2FkZF9udW1iZXIpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHAgPSBmcmFnX21vcmUgKGRpc3BzaXplICsgMSk7Ci0JCQkgIHN3aXRjaCAoZGlzcHNpemUpCi0JCQkgICAgewotCQkJICAgIGNhc2UgMToKLQkJCSAgICAgICpwKysgPSBUQUhPRV9JTU1FRElBVEVfQllURTsKLQkJCSAgICAgICpwID0gKGJ5dGUpIHRoaXNfYWRkX251bWJlcjsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgMjoKLQkJCSAgICAgICpwKysgPSBUQUhPRV9JTU1FRElBVEVfV09SRDsKLQkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgdGhpc19hZGRfbnVtYmVyLCAyKTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgNDoKLQkJCSAgICAgICpwKysgPSBUQUhPRV9JTU1FRElBVEVfTE9OR1dPUkQ7Ci0JCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHRoaXNfYWRkX251bWJlciwgNCk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJICAvKiBEaXN0YW5jZSBmcm9tIHRoZSBQQy4gSWYgdGhlIHNpemUgaXNuJ3Qga25vd24sIHdlIGhhdmUgdG8gcmVsYXgKLQkgICAgIGludG8gaXQuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgZGlzcChzcCkgaXMgdGhhdAotCSAgICAgdGhpcyBvZmZzZXQgaXMgcGNfcmVsLCBhbmQgZGlzcChzcCkgaXNuJ3QuCi0JICAgICBOb3RlIHRoZSBkcm9wIHRocm91Z2ggY29kZS4gKi8KLQotCQljYXNlIFRBSE9FX0RJU1BMQUNFRF9SRUxBVElWRToKLQkJY2FzZSBUQUhPRV9ESVNQX1JFTF9ERUZFUlJFRDoKLQkJICBvcGVyYW5kUC0+dG9wX3JlZyA9IFBDX1JFRzsKLQkJICBwY19yZWwgPSAxOwotCi0JCSAgLyogUmVnaXN0ZXIsIHBsdXMgYSBkaXNwbGFjZW1lbnQgbW9kZS4gU2F2ZSB0aGUgcmVnaXN0ZXIgbnVtYmVyLAotCSAgICAgYW5kIHdlYXRoZXIgaXRzIGRlZmZlcmVkIG9yIG5vdCwgYW5kIHJlbGF4IHRoZSBzaXplIGlmIGl0IGlzbid0Ci0JICAgICBrbm93bi4gKi8KLQkJY2FzZSBUQUhPRV9SRUdfRElTUDoKLQkJY2FzZSBUQUhPRV9SRUdfRElTUF9ERUZFUlJFRDoKLQkJICBpZiAob3BlcmFuZFAtPnRvcF9tb2RlID09IFRBSE9FX0RJU1BfUkVMX0RFRkVSUkVEIHx8Ci0JCSAgICAgIG9wZXJhbmRQLT50b3BfbW9kZSA9PSBUQUhPRV9SRUdfRElTUF9ERUZFUlJFRCkKLQkJICAgIG9wZXJhbmRQLT50b3BfcmVnICs9IDB4MTA7CS8qIGRlZmZlcmVkIG1vZGUgaXMgYWx3YXlzIDB4MTAgaGlnaGVyCi0JCQkJCSAgdGhhbiBpdCdzIG5vbi1kZWZmZXJlZCBzaWJsaW5nLiAqLwotCi0JCSAgLyogSXMgdGhpcyBhIHZhbHVlIG91dCBvZiB0aGlzIHNlZ21lbnQ/Ci0JICAgICBUaGUgZmlyc3QgcGFydCBvZiB0aGlzIGNvbmRpdGlvbmFsIGlzIGEgY2x1ZGdlIHRvIG1ha2UgZ2FzCi0JICAgICBwcm9kdWNlIHRoZSBzYW1lIG91dHB1dCBhcyAnYXMnIHdoZW4gdGhlcmUgaXMgYSBsYWJsZSwgaW4KLQkgICAgIHRoZSBjdXJyZW50IHNlZ21lbnQsIGRpc3BsYWNlaW5nIGEgcmVnaXN0ZXIuIEl0J3Mgc3RyYW5nZSwKLQkgICAgIGFuZCBubyBvbmUgaW4gdGhlaXIgcmlnaHQgbWluZCB3b3VsZCBkbyBpdCwgYnV0IGl0J3MgZWFzeQotCSAgICAgdG8gY2x1ZGdlLiAqLwotCQkgIGlmICgoZGlzcHNpemUgPT0gMCAmJiAhcGNfcmVsKSB8fAotCQkgICAgICAodG9fc2VnICE9IG5vd19zZWcgJiYgIWlzX3VuZGVmaW5lZCAmJiB0b19zZWcgIT0gU0VHX0FCU09MVVRFKSkKLQkJICAgIGRpc3BzaXplID0gNDsKLQotCQkgIGlmIChkaXNwc2l6ZSA9PSAwKQotCQkgICAgewotCQkgICAgICAvKgotCSAgICAgKiBXZSBoYXZlIGEgU0VHX1VOS05PV04gc3ltYm9sLCBvciB0aGUgc2l6ZSBpc24ndCBjYXN0LgotCSAgICAgKiBJdCBtaWdodCB0dXJuIG91dCB0byBiZSBpbiB0aGUgc2FtZSBzZWdtZW50IGFzCi0JICAgICAqIHRoZSBpbnN0cnVjdGlvbiwgcGVybWl0dGluZyByZWxheGF0aW9uLgotCSAgICAgKi8KLQkJICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNSwgMiwKLQkJCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwKLQkJCQkgICAgaXNfdW5kZWZpbmVkID8gU1RBVEVfVU5ERiA6IFNUQVRFX0JZVEUpLAotCQkJCSAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwgMCk7Ci0JCSAgICAgICpwID0gb3BlcmFuZFAtPnRvcF9yZWc7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBFaXRoZXIgdGhpcyBpcyBhbiBhYnMsIG9yIGEgY2FzdC4gKi8KLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoZGlzcHNpemUgKyAxKTsKLQkJICAgICAgc3dpdGNoIChkaXNwc2l6ZSkKLQkJCXsKLQkJCWNhc2UgMToKLQkJCSAgKnAgPSBUQUhPRV9QQ19PUl9CWVRFICsgb3BlcmFuZFAtPnRvcF9yZWc7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAyOgotCQkJICAqcCA9IFRBSE9FX1BDX09SX1dPUkQgKyBvcGVyYW5kUC0+dG9wX3JlZzsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkgICpwID0gVEFIT0VfUENfT1JfTE9ORyArIG9wZXJhbmRQLT50b3BfcmVnOwotCQkJICBicmVhazsKLQkJCX07Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJICAgICAgIHNpemVfdG9fZnggKGRpc3BzaXplLCBwY19yZWwpLCBOVUxMKTsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhc19mYXRhbCAoXygiQmFyZiwgYmFkIG1vZGUgJXhcbiIpLCBvcGVyYW5kUC0+dG9wX21vZGUpOwotCQl9Ci0JICAgIH0KLQl9CQkJLyogZm9yKG9wZXJhbmRQKSAqLwotICAgIH0JCQkJLyogaWYoIW5lZWRfcGFzc18yICYmICFnb29mZWQpICovCi19CQkJCS8qIHRhaG9lX2Fzc2VtYmxlKCkgKi8KLQotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19CQkJCS8qIG1kX3VuZGVmaW5lZF9zeW1ib2woKSAqLwotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiAoKHNpemUgKyA3KSAmIH43KTsJLyogUm91bmQgYWxsIHNlY3RzIHRvIG11bHRpcGxlIG9mIDggKi8KLX0JCQkJLyogbWRfc2VjdGlvbl9hbGlnbigpICovCi0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KLSAgIE9uIHRoZSBzcGFyYywgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzCi0gICBpdHMgc2l6ZS4gIFRoaXMgZ2V0cyB1cyB0byB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uLgotICAgKD8/PyBJcyB0aGlzIHJpZ2h0PyAgRklYTUUtU09PTikgKi8KLWxvbmcgCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gKCgoZml4UC0+ZnhfdHlwZSA9PSBGWF84Ci0JICAgIHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUw4KQotCSAgID8gMQotCSAgIDogKChmaXhQLT5meF90eXBlID09IEZYXzE2Ci0JICAgICAgIHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUwxNikKLQkgICAgICA/IDIKLQkgICAgICA6ICgoZml4UC0+ZnhfdHlwZSA9PSBGWF8zMgotCQkgIHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUwzMikKLQkJID8gNAotCQkgOiAwKSkpICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzKTsKLX0JCQkJLyogbWRfcGNyZWxfZnJvbSgpICovCi0KLWludCAKLXRjX2lzX3BjcmVsIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICAvKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkICovCi0gIGtub3cgKDApOwotICByZXR1cm4gKDApOwotfQkJCQkvKiB0Y19pc19wY3JlbCgpICovCi0KLS8qIGVuZCBvZiB0Yy10YWhvZS5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRhaG9lLmggYi9nYXMvY29uZmlnL3RjLXRhaG9lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOGE1YmUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy10YWhvZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLXRhaG9lLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19UQUhPRSAxCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jZGVmaW5lIE5PX0xJU1RJTkcKLQotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCXs7fQkvKiBkb24ndCBuZWVkIGl0LiAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIGRvbid0IG5lZWQgaXQuICovCi0jZGVmaW5lIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soYSkJezt9Ci0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGMtdGFob2UuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10aWMzMC5jIGIvZ2FzL2NvbmZpZy90Yy10aWMzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTVjMDZhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdGljMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDE4ODggKzAsMCBAQAotLyogdGMtYzMwLmMgLS0gQXNzZW1ibHkgY29kZSBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEMzMAotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gICBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgbWFjaGluZSBzcGVjaWZpYyBnYXMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpLgotICAgQnVncyAmIHN1Z2dlc3Rpb25zIGFyZSBjb21wbGV0ZWx5IHdlbGNvbWUuICBUaGlzIGlzIGZyZWUgc29mdHdhcmUuCi0gICBQbGVhc2UgaGVscCB1cyBtYWtlIGl0IGJldHRlci4KLSAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvcGNvZGUvdGljMzAuaCIKLQotLyogcHV0IGhlcmUgYWxsIG5vbi1kaWdpdCBub24tbGV0dGVyIGNoYXJjdGVycyB0aGF0IG1heSBvY2N1ciBpbiBhbiBvcGVyYW5kICovCi1zdGF0aWMgY2hhciBvcGVyYW5kX3NwZWNpYWxfY2hhcnNbXSA9ICIlJC0rKCwpKi5ffi88PiZeITpbQF0iOwotc3RhdGljIGNoYXIgKm9yZGluYWxfbmFtZXNbXSA9Ci17ImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCIsICJmb3VydGgiLCAiZmlmdGgifTsKLQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSAwOwotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiKiI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19OwotCi1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImZGZER4WCI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogdGFibGVzIGZvciBsZXhpY2FsIGFuYWx5c2lzICovCi1zdGF0aWMgY2hhciBvcGNvZGVfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIHJlZ2lzdGVyX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBvcGVyYW5kX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBzcGFjZV9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgaWRlbnRpZmllcl9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgZGlnaXRfY2hhcnNbMjU2XTsKLQotLyogbGV4aWNhbCBtYWNyb3MgKi8KLSNkZWZpbmUgaXNfb3Bjb2RlX2NoYXIoeCkgKG9wY29kZV9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX29wZXJhbmRfY2hhcih4KSAob3BlcmFuZF9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX3JlZ2lzdGVyX2NoYXIoeCkgKHJlZ2lzdGVyX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfc3BhY2VfY2hhcih4KSAoc3BhY2VfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19pZGVudGlmaWVyX2NoYXIoeCkgKGlkZW50aWZpZXJfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19kaWdpdF9jaGFyKHgpIChkaWdpdF9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHswLCAwLCAwfQotfTsKLQotI3VuZGVmIFVTRV9TVERPVVQKLSNkZWZpbmUgVVNFX1NURE9VVCAxCi0KLSNpZmRlZiBVU0VfU1REQVJHCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotaW50Ci1kZWJ1ZyAoY29uc3QgY2hhciAqc3RyaW5nLC4uLikKLXsKLSAgaWYgKGZsYWdfZGVidWcpCi0gICAgewotICAgICAgdmFfbGlzdCBhcmdwdHI7Ci0gICAgICBjaGFyIHN0clsxMDBdOwotCi0gICAgICB2YV9zdGFydCAoYXJncHRyLCBzdHJpbmcpOwotICAgICAgdnNwcmludGYgKHN0ciwgc3RyaW5nLCBhcmdwdHIpOwotICAgICAgaWYgKHN0clswXSA9PSAnXDAnKQotCXJldHVybiAoMCk7Ci0gICAgICB2YV9lbmQgKGFyZ3B0cik7Ci0gICAgICBmcHV0cyAoc3RyLCBVU0VfU1RET1VUID8gc3Rkb3V0IDogc3RkZXJyKTsKLSAgICAgIHJldHVybiBzdHJsZW4gKHN0cik7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0jZWxzZQotaW50Ci1kZWJ1ZyAoc3RyaW5nLCB2YV9hbGlzdCkKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICB2YV9kY2wKLXsKLSAgaWYgKGZsYWdfZGVidWcpCi0gICAgewotICAgICAgdmFfbGlzdCBhcmdwdHI7Ci0gICAgICBjaGFyIHN0clsxMDBdOwotICAgICAgaW50IGNudDsKLQotICAgICAgdmFfc3RhcnQgKGFyZ3B0ciwgc3RyaW5nKTsKLSAgICAgIGNudCA9IHZzcHJpbnRmIChzdHIsIHN0cmluZywgYXJncHRyKTsKLSAgICAgIGlmIChzdHJbMF0gPT0gTlVMTCkKLQlyZXR1cm4gKDApOwotICAgICAgdmFfZW5kIChhcmdwdHIpOwotICAgICAgZnB1dHMgKHN0ciwgVVNFX1NURE9VVCA/IHN0ZG91dCA6IHN0ZGVycik7Ci0gICAgICByZXR1cm4gKGNudCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyogaGFzaCB0YWJsZSBmb3Igb3Bjb2RlIGxvb2t1cCAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7Ci0vKiBoYXNoIHRhYmxlIGZvciBwYXJhbGxlbCBvcGNvZGUgbG9va3VwICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcGFyb3BfaGFzaDsKLS8qIGhhc2ggdGFibGUgZm9yIHJlZ2lzdGVyIGxvb2t1cCAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnJlZ19oYXNoOwotLyogaGFzaCB0YWJsZSBmb3IgaW5kaXJlY3QgYWRkcmVzc2luZyBsb29rdXAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICppbmRfaGFzaDsKLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqaGFzaF9lcnI7Ci0gIGRlYnVnICgiSW4gbWRfYmVnaW4oKVxuIik7Ci0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgewotICAgIGNvbnN0IHRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gdGljMzBfb3B0YWI7Ci0gICAgZm9yICg7IGN1cnJlbnRfb3B0YWIgPCB0aWMzMF9vcHRhYl9lbmQ7IGN1cnJlbnRfb3B0YWIrKykKLSAgICAgIHsKLQloYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBjdXJyZW50X29wdGFiLT5uYW1lLCAoY2hhciAqKSBjdXJyZW50X29wdGFiKTsKLQlpZiAoaGFzaF9lcnIpCi0JICBhc19mYXRhbCAoIkludGVybmFsIEVycm9yOiBDYW4ndCBIYXNoICVzOiAlcyIsIGN1cnJlbnRfb3B0YWItPm5hbWUsIGhhc2hfZXJyKTsKLSAgICAgIH0KLSAgfQotICBwYXJvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHsKLSAgICBjb25zdCBwYXJ0ZW1wbGF0ZSAqY3VycmVudF9wYXJvcCA9IHRpYzMwX3Bhcm9wdGFiOwotICAgIGZvciAoOyBjdXJyZW50X3Bhcm9wIDwgdGljMzBfcGFyb3B0YWJfZW5kOyBjdXJyZW50X3Bhcm9wKyspCi0gICAgICB7Ci0JaGFzaF9lcnIgPSBoYXNoX2luc2VydCAocGFyb3BfaGFzaCwgY3VycmVudF9wYXJvcC0+bmFtZSwgKGNoYXIgKikgY3VycmVudF9wYXJvcCk7Ci0JaWYgKGhhc2hfZXJyKQotCSAgYXNfZmF0YWwgKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgSGFzaCAlczogJXMiLCBjdXJyZW50X3Bhcm9wLT5uYW1lLCBoYXNoX2Vycik7Ci0gICAgICB9Ci0gIH0KLSAgcmVnX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgewotICAgIGNvbnN0IHJlZyAqY3VycmVudF9yZWcgPSB0aWMzMF9yZWd0YWI7Ci0gICAgZm9yICg7IGN1cnJlbnRfcmVnIDwgdGljMzBfcmVndGFiX2VuZDsgY3VycmVudF9yZWcrKykKLSAgICAgIHsKLQloYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChyZWdfaGFzaCwgY3VycmVudF9yZWctPm5hbWUsIChjaGFyICopIGN1cnJlbnRfcmVnKTsKLQlpZiAoaGFzaF9lcnIpCi0JICBhc19mYXRhbCAoIkludGVybmFsIEVycm9yOiBDYW4ndCBIYXNoICVzOiAlcyIsIGN1cnJlbnRfcmVnLT5uYW1lLCBoYXNoX2Vycik7Ci0gICAgICB9Ci0gIH0KLSAgaW5kX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgewotICAgIGNvbnN0IGluZF9hZGRyX3R5cGUgKmN1cnJlbnRfaW5kID0gdGljMzBfaW5kYWRkcl90YWI7Ci0gICAgZm9yICg7IGN1cnJlbnRfaW5kIDwgdGljMzBfaW5kYWRkcnRhYl9lbmQ7IGN1cnJlbnRfaW5kKyspCi0gICAgICB7Ci0JaGFzaF9lcnIgPSBoYXNoX2luc2VydCAoaW5kX2hhc2gsIGN1cnJlbnRfaW5kLT5zeW50YXgsIChjaGFyICopIGN1cnJlbnRfaW5kKTsKLQlpZiAoaGFzaF9lcnIpCi0JICBhc19mYXRhbCAoIkludGVybmFsIEVycm9yOiBDYW4ndCBIYXNoICVzOiAlcyIsIGN1cnJlbnRfaW5kLT5zeW50YXgsIGhhc2hfZXJyKTsKLSAgICAgIH0KLSAgfQotICAvKiBmaWxsIGluIGxleGljYWwgdGFibGVzOiAgb3Bjb2RlX2NoYXJzLCBvcGVyYW5kX2NoYXJzLCBzcGFjZV9jaGFycyAqLwotICB7Ci0gICAgcmVnaXN0ZXIgaW50IGM7Ci0gICAgcmVnaXN0ZXIgY2hhciAqcDsKLQotICAgIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykKLSAgICAgIHsKLQlpZiAoaXNsb3dlciAoYykgfHwgaXNkaWdpdCAoYykpCi0JICB7Ci0JICAgIG9wY29kZV9jaGFyc1tjXSA9IGM7Ci0JICAgIHJlZ2lzdGVyX2NoYXJzW2NdID0gYzsKLQkgIH0KLQllbHNlIGlmIChpc3VwcGVyIChjKSkKLQkgIHsKLQkgICAgb3Bjb2RlX2NoYXJzW2NdID0gdG9sb3dlciAoYyk7Ci0JICAgIHJlZ2lzdGVyX2NoYXJzW2NdID0gb3Bjb2RlX2NoYXJzW2NdOwotCSAgfQotCWVsc2UgaWYgKGMgPT0gJyknIHx8IGMgPT0gJygnKQotCSAgewotCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IGM7Ci0JICB9Ci0JaWYgKGlzdXBwZXIgKGMpIHx8IGlzbG93ZXIgKGMpIHx8IGlzZGlnaXQgKGMpKQotCSAgb3BlcmFuZF9jaGFyc1tjXSA9IGM7Ci0JaWYgKGlzZGlnaXQgKGMpIHx8IGMgPT0gJy0nKQotCSAgZGlnaXRfY2hhcnNbY10gPSBjOwotCWlmIChpc2FscGhhIChjKSB8fCBjID09ICdfJyB8fCBjID09ICcuJyB8fCBpc2RpZ2l0IChjKSkKLQkgIGlkZW50aWZpZXJfY2hhcnNbY10gPSBjOwotCWlmIChjID09ICcgJyB8fCBjID09ICdcdCcpCi0JICBzcGFjZV9jaGFyc1tjXSA9IGM7Ci0JaWYgKGMgPT0gJ18nKQotCSAgb3Bjb2RlX2NoYXJzW2NdID0gYzsKLSAgICAgIH0KLSAgICBmb3IgKHAgPSBvcGVyYW5kX3NwZWNpYWxfY2hhcnM7ICpwICE9ICdcMCc7IHArKykKLSAgICAgIG9wZXJhbmRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpICpwXSA9ICpwOwotICB9Ci19Ci0KLS8qIEFkZHJlc3MgTW9kZSBPUiB2YWx1ZXMgKi8KLSNkZWZpbmUgQU1fUmVnaXN0ZXIgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQU1fRGlyZWN0ICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgQU1fSW5kaXJlY3QgIDB4MDA0MDAwMDAKLSNkZWZpbmUgQU1fSW1tZWRpYXRlIDB4MDA2MDAwMDAKLSNkZWZpbmUgQU1fTm90UmVxICAgIDB4RkZGRkZGRkYKLQotLyogUEMgUmVsYXRpdmUgT1IgdmFsdWVzICovCi0jZGVmaW5lIFBDX1JlZ2lzdGVyIDB4MDAwMDAwMDAKLSNkZWZpbmUgUENfUmVsYXRpdmUgMHgwMjAwMDAwMAotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBvcF90eXBlOwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBpbnQgcmVzb2x2ZWQ7Ci0gICAgICB1bnNpZ25lZCBhZGRyZXNzOwotICAgICAgY2hhciAqbGFiZWw7Ci0gICAgICBleHByZXNzaW9uUyBkaXJlY3RfZXhwcjsKLSAgICB9Ci0gIGRpcmVjdDsKLSAgc3RydWN0Ci0gICAgewotICAgICAgdW5zaWduZWQgbW9kOwotICAgICAgaW50IEFSbnVtOwotICAgICAgdW5zaWduZWQgY2hhciBkaXNwOwotICAgIH0KLSAgaW5kaXJlY3Q7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIG9wY29kZTsKLSAgICB9Ci0gIHJlZzsKLSAgc3RydWN0Ci0gICAgewotICAgICAgaW50IHJlc29sdmVkOwotICAgICAgaW50IGRlY2ltYWxfZm91bmQ7Ci0gICAgICBmbG9hdCBmX251bWJlcjsKLSAgICAgIGludCBzX251bWJlcjsKLSAgICAgIHVuc2lnbmVkIGludCB1X251bWJlcjsKLSAgICAgIGNoYXIgKmxhYmVsOwotICAgICAgZXhwcmVzc2lvblMgaW1tX2V4cHI7Ci0gICAgfQotICBpbW1lZGlhdGU7Ci19Ci1vcGVyYW5kOwotCi1pbnQgdGljMzBfcGFyYWxsZWxfaW5zbiBQQVJBTVMgKChjaGFyICopKTsKLW9wZXJhbmQgKnRpYzMwX29wZXJhbmQgUEFSQU1TICgoY2hhciAqKSk7Ci1jaGFyICp0aWMzMF9maW5kX3BhcmFsbGVsX2luc24gUEFSQU1TICgoY2hhciAqLCBjaGFyICopKTsKLQotdGVtcGxhdGUgKm9wY29kZTsKLQotc3RydWN0IHRpYzMwX2luc24KLSAgewotICAgIHRlbXBsYXRlICp0bTsJCS8qIFRlbXBsYXRlIG9mIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gKi8KLSAgICB1bnNpZ25lZCBvcGNvZGU7CQkvKiBGaW5hbCBvcGNvZGUgKi8KLSAgICBpbnQgb3BlcmFuZHM7CQkvKiBOdW1iZXIgb2YgZ2l2ZW4gb3BlcmFuZHMgKi8KLSAgICAvKiBUeXBlIG9mIG9wZXJhbmQgZ2l2ZW4gaW4gaW5zdHJ1Y3Rpb24gKi8KLSAgICBvcGVyYW5kICpvcGVyYW5kX3R5cGVbTUFYX09QRVJBTkRTXTsKLSAgICB1bnNpZ25lZCBhZGRyZXNzaW5nX21vZGU7CS8qIEZpbmFsIGFkZHJlc3NpbmcgbW9kZSBvZiBpbnN0cnVjdGlvbiAqLwotICB9OwotCi1zdHJ1Y3QgdGljMzBfaW5zbiBpbnNuOwotc3RhdGljIGludCBmb3VuZF9wYXJhbGxlbF9pbnNuOwotCi12b2lkCi1tZF9hc3NlbWJsZSAobGluZSkKLSAgICAgY2hhciAqbGluZTsKLXsKLSAgdGVtcGxhdGUgKm9wY29kZTsKLSAgY2hhciAqY3VycmVudF9wb3NuOwotICBjaGFyICp0b2tlbl9zdGFydDsKLSAgY2hhciBzYXZlX2NoYXI7Ci0gIGludCBjb3VudDsKLQotICBkZWJ1ZyAoIkluIG1kX2Fzc2VtYmxlKCkgd2l0aCBhcmd1bWVudCAlc1xuIiwgbGluZSk7Ci0gIG1lbXNldCAoJmluc24sICdcMCcsIHNpemVvZiAoaW5zbikpOwotICBpZiAoZm91bmRfcGFyYWxsZWxfaW5zbikKLSAgICB7Ci0gICAgICBkZWJ1ZyAoIkxpbmUgaXMgc2Vjb25kIHBhcnQgb2YgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25cblxuIik7Ci0gICAgICBmb3VuZF9wYXJhbGxlbF9pbnNuID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmICgoY3VycmVudF9wb3NuID0gdGljMzBfZmluZF9wYXJhbGxlbF9pbnNuIChsaW5lLCBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKSkgPT0gTlVMTCkKLSAgICBjdXJyZW50X3Bvc24gPSBsaW5lOwotICBlbHNlCi0gICAgZm91bmRfcGFyYWxsZWxfaW5zbiA9IDE7Ci0gIHdoaWxlIChpc19zcGFjZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLSAgICBjdXJyZW50X3Bvc24rKzsKLSAgdG9rZW5fc3RhcnQgPSBjdXJyZW50X3Bvc247Ci0gIGlmICghaXNfb3Bjb2RlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIkludmFsaWQgY2hhcmFjdGVyICVzIGluIG9wY29kZSIsIG91dHB1dF9pbnZhbGlkICgqY3VycmVudF9wb3NuKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBDaGVjayBpZiBpbnN0cnVjdGlvbiBpcyBhIHBhcmFsbGVsIGluc3RydWN0aW9uIGJ5IHNlZWluZyBpZiB0aGUgZmlyc3QKLSAgICAgY2hhcmFjdGVyIGlzIGEgcS4gKi8KLSAgaWYgKCp0b2tlbl9zdGFydCA9PSAncScpCi0gICAgewotICAgICAgaWYgKHRpYzMwX3BhcmFsbGVsX2luc24gKHRva2VuX3N0YXJ0KSkKLQl7Ci0JICBpZiAoZm91bmRfcGFyYWxsZWxfaW5zbikKLQkgICAgZnJlZSAodG9rZW5fc3RhcnQpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIHdoaWxlIChpc19vcGNvZGVfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0gICAgY3VycmVudF9wb3NuKys7Ci0gIHsJCQkJLyogRmluZCBpbnN0cnVjdGlvbiAqLwotICAgIHNhdmVfY2hhciA9ICpjdXJyZW50X3Bvc247Ci0gICAgKmN1cnJlbnRfcG9zbiA9ICdcMCc7Ci0gICAgb3Bjb2RlID0gKHRlbXBsYXRlICopIGhhc2hfZmluZCAob3BfaGFzaCwgdG9rZW5fc3RhcnQpOwotICAgIGlmIChvcGNvZGUpCi0gICAgICB7Ci0JZGVidWcgKCJGb3VuZCBpbnN0cnVjdGlvbiAlc1xuIiwgb3Bjb2RlLT5uYW1lKTsKLQlpbnNuLnRtID0gb3Bjb2RlOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlkZWJ1ZyAoIkRpZG4ndCBmaW5kIGluc25cbiIpOwotCWFzX2JhZCAoIlVua25vd24gVE1TMzIwQzMwIGluc3RydWN0aW9uOiAlcyIsIHRva2VuX3N0YXJ0KTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgKmN1cnJlbnRfcG9zbiA9IHNhdmVfY2hhcjsKLSAgfQotICBpZiAoKmN1cnJlbnRfcG9zbiAhPSBFTkRfT0ZfSU5TTikKLSAgICB7CQkJCS8qIEZpbmQgb3BlcmFuZHMgKi8KLSAgICAgIGludCBwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0gICAgICBpbnQgZXhwZWN0aW5nX29wZXJhbmQgPSAwOwotICAgICAgaW50IHRoaXNfb3BlcmFuZDsKLSAgICAgIGRvCi0JewotCSAgLyogc2tpcCBvcHRpb25hbCB3aGl0ZSBzcGFjZSBiZWZvcmUgb3BlcmFuZCAqLwotCSAgd2hpbGUgKCFpc19vcGVyYW5kX2NoYXIgKCpjdXJyZW50X3Bvc24pICYmICpjdXJyZW50X3Bvc24gIT0gRU5EX09GX0lOU04pCi0JICAgIHsKLQkgICAgICBpZiAoIWlzX3NwYWNlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotCQl7Ci0JCSAgYXNfYmFkICgiSW52YWxpZCBjaGFyYWN0ZXIgJXMgYmVmb3JlICVzIG9wZXJhbmQiLAotCQkJICBvdXRwdXRfaW52YWxpZCAoKmN1cnJlbnRfcG9zbiksCi0JCQkgIG9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGN1cnJlbnRfcG9zbisrOwotCSAgICB9Ci0JICB0b2tlbl9zdGFydCA9IGN1cnJlbnRfcG9zbjsJLyogYWZ0ZXIgd2hpdGUgc3BhY2UgKi8KLQkgIHBhcmVuX25vdF9iYWxhbmNlZCA9IDA7Ci0JICB3aGlsZSAocGFyZW5fbm90X2JhbGFuY2VkIHx8ICpjdXJyZW50X3Bvc24gIT0gJywnKQotCSAgICB7Ci0JICAgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gRU5EX09GX0lOU04pCi0JCXsKLQkJICBpZiAocGFyZW5fbm90X2JhbGFuY2VkKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKCJVbmJhbGFuY2VkIHBhcmVudGhlc2lzIGluICVzIG9wZXJhbmQuIiwKLQkJCSAgICAgIG9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOwotCQkgICAgICByZXR1cm47Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7CS8qIHdlIGFyZSBkb25lICovCi0JCX0KLQkgICAgICBlbHNlIGlmICghaXNfb3BlcmFuZF9jaGFyICgqY3VycmVudF9wb3NuKSAmJiAhaXNfc3BhY2VfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0JCXsKLQkJICBhc19iYWQgKCJJbnZhbGlkIGNoYXJhY3RlciAlcyBpbiAlcyBvcGVyYW5kIiwKLQkJCSAgb3V0cHV0X2ludmFsaWQgKCpjdXJyZW50X3Bvc24pLAotCQkJICBvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnKCcpCi0JCSsrcGFyZW5fbm90X2JhbGFuY2VkOwotCSAgICAgIGlmICgqY3VycmVudF9wb3NuID09ICcpJykKLQkJLS1wYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JICAgICAgY3VycmVudF9wb3NuKys7Ci0JICAgIH0KLQkgIGlmIChjdXJyZW50X3Bvc24gIT0gdG9rZW5fc3RhcnQpCi0JICAgIHsJCQkvKiB5ZXMsIHdlJ3ZlIHJlYWQgaW4gYW5vdGhlciBvcGVyYW5kICovCi0JICAgICAgdGhpc19vcGVyYW5kID0gaW5zbi5vcGVyYW5kcysrOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRzID4gTUFYX09QRVJBTkRTKQotCQl7Ci0JCSAgYXNfYmFkICgiU3B1cmlvdXMgb3BlcmFuZHM7ICglZCBvcGVyYW5kcy9pbnN0cnVjdGlvbiBtYXgpIiwKLQkJCSAgTUFYX09QRVJBTkRTKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICAvKiBub3cgcGFyc2Ugb3BlcmFuZCBhZGRpbmcgaW5mbyB0byAnaW5zbicgYXMgd2UgZ28gYWxvbmcgKi8KLQkgICAgICBzYXZlX2NoYXIgPSAqY3VycmVudF9wb3NuOwotCSAgICAgICpjdXJyZW50X3Bvc24gPSAnXDAnOwotCSAgICAgIGluc24ub3BlcmFuZF90eXBlW3RoaXNfb3BlcmFuZF0gPSB0aWMzMF9vcGVyYW5kICh0b2tlbl9zdGFydCk7Ci0JICAgICAgKmN1cnJlbnRfcG9zbiA9IHNhdmVfY2hhcjsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbdGhpc19vcGVyYW5kXSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChleHBlY3Rpbmdfb3BlcmFuZCkKLQkJewotCQkgIGFzX2JhZCAoIkV4cGVjdGluZyBvcGVyYW5kIGFmdGVyICcsJzsgZ290IG5vdGhpbmciKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnLCcpCi0JCXsKLQkJICBhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBiZWZvcmUgJywnOyBnb3Qgbm90aGluZyIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JICAvKiBub3cgKmN1cnJlbnRfcG9zbiBtdXN0IGJlIGVpdGhlciAnLCcgb3IgRU5EX09GX0lOU04gKi8KLQkgIGlmICgqY3VycmVudF9wb3NuID09ICcsJykKLQkgICAgewotCSAgICAgIGlmICgqKytjdXJyZW50X3Bvc24gPT0gRU5EX09GX0lOU04pCi0JCXsJCS8qIGp1c3Qgc2tpcCBpdCwgaWYgaXQncyBcbiBjb21wbGFpbiAqLwotCQkgIGFzX2JhZCAoIkV4cGVjdGluZyBvcGVyYW5kIGFmdGVyICcsJzsgZ290IG5vdGhpbmciKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBleHBlY3Rpbmdfb3BlcmFuZCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAoKmN1cnJlbnRfcG9zbiAhPSBFTkRfT0ZfSU5TTik7CS8qIHVudGlsIHdlIGdldCBlbmQgb2YgaW5zbiAqLwotICAgIH0KLSAgZGVidWcgKCJOdW1iZXIgb2Ygb3BlcmFuZHMgZm91bmQ6ICVkXG4iLCBpbnNuLm9wZXJhbmRzKTsKLSAgLyogQ2hlY2sgdGhhdCBudW1iZXIgb2Ygb3BlcmFuZHMgaXMgY29ycmVjdCAqLwotICBpZiAoaW5zbi5vcGVyYW5kcyAhPSBpbnNuLnRtLT5vcGVyYW5kcykKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBudW1vcHMgPSBpbnNuLnRtLT5vcGVyYW5kczsKLSAgICAgIC8qIElmIG9wZXJhbmRzIGFyZSBub3QgdGhlIHNhbWUsIHRoZW4gc2VlIGlmIGFueSBvZiB0aGUgb3BlcmFuZHMgYXJlIG5vdAotICAgICAgICAgcmVxdWlyZWQuICBUaGVuIHJlY2hlY2sgd2l0aCBudW1iZXIgb2YgZ2l2ZW4gb3BlcmFuZHMuICBJZiB0aGV5IGFyZSBzdGlsbCBub3QKLSAgICAgICAgIHRoZSBzYW1lLCB0aGVuIGdpdmUgYW4gZXJyb3IsIG90aGVyd2lzZSBjYXJyeSBvbi4gKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnNuLnRtLT5vcGVyYW5kczsgaSsrKQotCWlmIChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzW2ldICYgTm90UmVxKQotCSAgbnVtb3BzLS07Ci0gICAgICBpZiAoaW5zbi5vcGVyYW5kcyAhPSBudW1vcHMpCi0JewotCSAgYXNfYmFkICgiSW5jb3JyZWN0IG51bWJlciBvZiBvcGVyYW5kcyBnaXZlbiIpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fTm90UmVxOwotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBpbnNuLm9wZXJhbmRzOyBjb3VudCsrKQotICAgIHsKLSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVtjb3VudF0tPm9wX3R5cGUgJiBpbnNuLnRtLT5vcGVyYW5kX3R5cGVzW2NvdW50XSkKLQl7Ci0JICBkZWJ1ZyAoIk9wZXJhbmQgJWQgbWF0Y2hlc1xuIiwgY291bnQgKyAxKTsKLQkgIC8qIElmIGluc3RydWN0aW9uIGhhcyB0d28gb3BlcmFuZHMgYW5kIGhhcyBhbiBBZGRyZXNzTW9kZSBtb2RpZmllciB0aGVuIHNldAotCSAgICAgYWRkcmVzc2luZyBtb2RlIHR5cGUgZm9yIGluc3RydWN0aW9uICovCi0JICBpZiAoaW5zbi50bS0+b3Bjb2RlX21vZGlmaWVyID09IEFkZHJlc3NNb2RlKQotCSAgICB7Ci0JICAgICAgaW50IGFkZHJfaW5zbiA9IDA7Ci0JICAgICAgLyogU3RvcmUgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgc2Vjb25kIG9wZXJhbmQgZm9yIHRoZSBhZGRyZXNzIG1vZGUuICovCi0JICAgICAgaWYgKChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzFdICYgKEluZGlyZWN0IHwgRGlyZWN0KSkgPT0gKEluZGlyZWN0IHwgRGlyZWN0KSkKLQkJYWRkcl9pbnNuID0gMTsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbYWRkcl9pbnNuXS0+b3BfdHlwZSAmIChBbGxSZWcpKQotCQlpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX1JlZ2lzdGVyOwotCSAgICAgIGVsc2UgaWYgKGluc24ub3BlcmFuZF90eXBlW2FkZHJfaW5zbl0tPm9wX3R5cGUgJiBEaXJlY3QpCi0JCWluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fRGlyZWN0OwotCSAgICAgIGVsc2UgaWYgKGluc24ub3BlcmFuZF90eXBlW2FkZHJfaW5zbl0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkJaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9JbmRpcmVjdDsKLQkgICAgICBlbHNlCi0JCWluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fSW1tZWRpYXRlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoIlRoZSAlcyBvcGVyYW5kIGRvZXNuJ3QgbWF0Y2giLCBvcmRpbmFsX25hbWVzW2NvdW50XSk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgLyogTm93IHNldCB0aGUgYWRkcmVzc2luZyBtb2RlIGZvciAzIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zLiAqLwotICBpZiAoKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBvcDNUMSkgJiYgKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMV0gJiBvcDNUMikpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBhZGRyZXNzaW5nIG1vZGUgdG8gdGhlIHZhbHVlcyB1c2VkIGZvciAyIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zIGluIHRoZQotICAgICAgICAgRyBhZGRyZXNzaW5nIGZpZWxkIG9mIHRoZSBvcGNvZGUuICovCi0gICAgICBjaGFyICpwOwotICAgICAgc3dpdGNoIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSkKLQl7Ci0JY2FzZSBSbjoKLQljYXNlIEFSbjoKLQljYXNlIERQUmVnOgotCWNhc2UgT3RoZXJSZWc6Ci0JICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiAoQWxsUmVnKSkKLQkgICAgaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9SZWdpc3RlcjsKLQkgIGVsc2UgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JICAgIGluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fRGlyZWN0OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU2hvdWxkbid0IG1ha2UgaXQgdG8gdGhpcyBzdGFnZSAqLwotCSAgICAgIGFzX2JhZCAoIkluY29tcGF0aWJsZSBmaXJzdCBhbmQgc2Vjb25kIG9wZXJhbmRzIGluIGluc3RydWN0aW9uIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIEluZGlyZWN0OgotCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgKEFsbFJlZykpCi0JICAgIGluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fSW5kaXJlY3Q7Ci0JICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCSAgICBpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0ltbWVkaWF0ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFNob3VsZG4ndCBtYWtlIGl0IHRvIHRoaXMgc3RhZ2UgKi8KLQkgICAgICBhc19iYWQgKCJJbmNvbXBhdGlibGUgZmlyc3QgYW5kIHNlY29uZCBvcGVyYW5kcyBpbiBpbnN0cnVjdGlvbiIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgLyogTm93IG1ha2UgdXAgdGhlIG9wY29kZSBmb3IgdGhlIDMgb3BlcmFuZCBpbnN0cnVjdGlvbnMuICBBcyBpbiBwYXJhbGxlbAotICAgICAgICAgaW5zdHJ1Y3Rpb25zLCB0aGVyZSB3aWxsIGJlIG5vIHVucmVzb2x2ZWQgdmFsdWVzLCBzbyB0aGV5IGNhbiBiZSBmdWxseSBmb3JtZWQKLSAgICAgICAgIGFuZCBhZGRlZCB0byB0aGUgZnJhZyB0YWJsZS4gKi8KLSAgICAgIGluc24ub3Bjb2RlID0gaW5zbi50bS0+YmFzZV9vcGNvZGU7Ci0gICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQl7Ci0JICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmluZGlyZWN0LkFSbnVtKTsKLQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCX0KLSAgICAgIGVsc2UKLQlpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPnJlZy5vcGNvZGUpOwotICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JewotCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQl9Ci0gICAgICBlbHNlCi0JaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5yZWcub3Bjb2RlIDw8IDgpOwotICAgICAgaWYgKGluc24ub3BlcmFuZHMgPT0gMykKLQlpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMl0tPnJlZy5vcGNvZGUgPDwgMTYpOwotICAgICAgaW5zbi5vcGNvZGUgfD0gaW5zbi5hZGRyZXNzaW5nX21vZGU7Ci0gICAgICBwID0gZnJhZ19tb3JlIChJTlNOX1NJWkUpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7CQkJCS8qIE5vdCBhIHRocmVlIG9wZXJhbmQgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGNoYXIgKnA7Ci0gICAgICBpbnQgYW1faW5zbiA9IC0xOwotICAgICAgaW5zbi5vcGNvZGUgPSBpbnNuLnRtLT5iYXNlX29wY29kZTsKLSAgICAgIC8qIENyZWF0ZSBmcmFnIGZvciBpbnN0cnVjdGlvbiAtIGFsbCBpbnN0cnVjdGlvbnMgYXJlIDQgYnl0ZXMgbG9uZy4gKi8KLSAgICAgIHAgPSBmcmFnX21vcmUgKElOU05fU0laRSk7Ci0gICAgICBpZiAoKGluc24ub3BlcmFuZHMgPiAwKSAmJiAoaW5zbi50bS0+b3Bjb2RlX21vZGlmaWVyID09IEFkZHJlc3NNb2RlKSkKLQl7Ci0JICBpbnNuLm9wY29kZSB8PSBpbnNuLmFkZHJlc3NpbmdfbW9kZTsKLQkgIGlmIChpbnNuLmFkZHJlc3NpbmdfbW9kZSA9PSBBTV9JbmRpcmVjdCkKLQkgICAgewotCSAgICAgIC8qIERldGVybWluZSB3aGljaCBvcGVyYW5kIGdpdmVzIHRoZSBhZGRyZXNzaW5nIG1vZGUgKi8KLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkJYW1faW5zbiA9IDA7Ci0JICAgICAgaWYgKChpbnNuLm9wZXJhbmRzID4gMSkgJiYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgSW5kaXJlY3QpKQotCQlhbV9pbnNuID0gMTsKLQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmluZGlyZWN0LmRpc3ApOwotCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRzID4gMSkKLQkJaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWyFhbV9pbnNuXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5zbi5hZGRyZXNzaW5nX21vZGUgPT0gQU1fUmVnaXN0ZXIpCi0JICAgIHsKLQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPnJlZy5vcGNvZGUpOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRzID4gMSkKLQkJaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbnNuLmFkZHJlc3NpbmdfbW9kZSA9PSBBTV9EaXJlY3QpCi0JICAgIHsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUgJiBEaXJlY3QpCi0JCWFtX2luc24gPSAwOwotCSAgICAgIGlmICgoaW5zbi5vcGVyYW5kcyA+IDEpICYmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIERpcmVjdCkpCi0JCWFtX2luc24gPSAxOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRzID4gMSkKLQkJaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWyFhbV9pbnNuXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5kaXJlY3QucmVzb2x2ZWQgPT0gMSkKLQkJewotCQkgIC8qIFJlc29sdmVkIHZhbHVlcyBjYW4gYmUgcGxhY2VkIHN0cmFpZ2h0IGludG8gaW5zdHJ1Y3Rpb24gd29yZCwgYW5kIG91dHB1dCAqLwotCQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+ZGlyZWN0LmFkZHJlc3MgJiAweDAwMDBGRkZGKTsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7CQkvKiBVbnJlc29sdmVkIGRpcmVjdCBhZGRyZXNzaW5nIG1vZGUgaW5zdHJ1Y3Rpb24gKi8KLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDIgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAyLCAmaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmRpcmVjdC5kaXJlY3RfZXhwciwgMCwgMCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoaW5zbi5hZGRyZXNzaW5nX21vZGUgPT0gQU1fSW1tZWRpYXRlKQotCSAgICB7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUucmVzb2x2ZWQgPT0gMSkKLQkJewotCQkgIGNoYXIgKmtlZXBsb2M7Ci0JCSAgaW50IHNpemU7Ci0JCSAgaWYgKGluc24ub3BlcmFuZHMgPiAxKQotCQkgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkJICBzd2l0Y2ggKGluc24udG0tPmltbV9hcmdfdHlwZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgSW1tX0Zsb2F0OgotCQkgICAgICBkZWJ1ZyAoIkZsb2F0aW5nIHBvaW50IGZpcnN0IG9wZXJhbmRcbiIpOwotCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgICAgICBrZWVwbG9jID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmxhYmVsOwotCQkgICAgICBpZiAobWRfYXRvZiAoJ2YnLCBwICsgMiwgJnNpemUpICE9IDApCi0JCQl7Ci0JCQkgIGFzX2JhZCAoImludmFsaWQgc2hvcnQgZm9ybSBmbG9hdGluZyBwb2ludCBpbW1lZGlhdGUgb3BlcmFuZCIpOwotCQkJICByZXR1cm47Ci0JCQl9Ci0JCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGtlZXBsb2M7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBJbW1fVUludDoKLQkJICAgICAgZGVidWcgKCJVbnNpZ25lZCBpbnQgZmlyc3Qgb3BlcmFuZFxuIik7Ci0JCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmRlY2ltYWxfZm91bmQpCi0JCQlhc193YXJuICgicm91bmRpbmcgZG93biBmaXJzdCBvcGVyYW5kIGZsb2F0IHRvIHVuc2lnbmVkIGludCIpOwotCQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciA+IDB4RkZGRikKLQkJCWFzX3dhcm4gKCJvbmx5IGxvd2VyIDE2LWJpdHMgb2YgZmlyc3Qgb3BlcmFuZCBhcmUgdXNlZCIpOwotCQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciAmIDB4MDAwMEZGRkZMKTsKLQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIEltbV9TSW50OgotCQkgICAgICBkZWJ1ZyAoIkludCBmaXJzdCBvcGVyYW5kXG4iKTsKLQkJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuZGVjaW1hbF9mb3VuZCkKLQkJCWFzX3dhcm4gKCJyb3VuZGluZyBkb3duIGZpcnN0IG9wZXJhbmQgZmxvYXQgdG8gc2lnbmVkIGludCIpOwotCQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciA8IC0zMjc2OCB8fAotCQkJICBpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnNfbnVtYmVyID4gMzI3NjcpCi0JCQl7Ci0JCQkgIGFzX2JhZCAoImZpcnN0IG9wZXJhbmQgaXMgdG9vIGxhcmdlIGZvciAxNi1iaXQgc2lnbmVkIGludCIpOwotCQkJICByZXR1cm47Ci0JCQl9Ci0JCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnNfbnVtYmVyICYgMHgwMDAwRkZGRkwpOwotCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewkJLyogVW5yZXNvbHZlZCBpbW1lZGlhdGUgbGFiZWwgKi8KLQkJICBpZiAoaW5zbi5vcGVyYW5kcyA+IDEpCi0JCSAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMiAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDIsICZpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmltbV9leHByLCAwLCAwKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi50bS0+b3Bjb2RlX21vZGlmaWVyID09IFBDUmVsKQotCXsKLQkgIC8qIENvbmRpdGlvbmFsIEJyYW5jaCBhbmQgQ2FsbCBpbnN0cnVjdGlvbnMgKi8KLQkgIGlmICgoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSAmIChBbGxSZWcgfCBEaXNwKSkgPT0gKEFsbFJlZyB8IERpc3ApKQotCSAgICB7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgKEFsbFJlZykpCi0JCXsKLQkJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPnJlZy5vcGNvZGUpOwotCQkgIGluc24ub3Bjb2RlIHw9IFBDX1JlZ2lzdGVyOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnNuLm9wY29kZSB8PSBQQ19SZWxhdGl2ZTsKLQkJICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5yZXNvbHZlZCA9PSAxKQotCQkgICAgewotCQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciAmIDB4MDAwMEZGRkYpOwotCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMiAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDIsICZpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmltbV9leHByLCAxLCAwKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmICgoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSAmIEFSbikgPT0gQVJuKQotCSAgICB7Ci0JICAgICAgLyogRGVjcmVtZW50IGFuZCBCcmFuY2ggaW5zdHJ1Y3Rpb25zICovCi0JICAgICAgaW5zbi5vcGNvZGUgfD0gKChpbnNuLm9wZXJhbmRfdHlwZVswXS0+cmVnLm9wY29kZSAtIDB4MDgpIDw8IDIyKTsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiAoQWxsUmVnKSkKLQkJewotCQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+cmVnLm9wY29kZSk7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gUENfUmVnaXN0ZXI7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5pbW1lZGlhdGUucmVzb2x2ZWQgPT0gMSkKLQkJewotCQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmRlY2ltYWxfZm91bmQpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoImZpcnN0IG9wZXJhbmQgaXMgZmxvYXRpbmcgcG9pbnQiKTsKLQkJICAgICAgcmV0dXJuOwotCQkgICAgfQotCQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnNfbnVtYmVyIDwgLTMyNzY4IHx8Ci0JCSAgICAgIGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgPiAzMjc2NykKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkICgiZmlyc3Qgb3BlcmFuZCBpcyB0b28gbGFyZ2UgZm9yIDE2LWJpdCBzaWduZWQgaW50Iik7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQkJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPmltbWVkaWF0ZS5zX251bWJlcik7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gUENfUmVsYXRpdmU7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGluc24ub3Bjb2RlIHw9IFBDX1JlbGF0aXZlOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAyLCAmaW5zbi5vcGVyYW5kX3R5cGVbMV0tPmltbWVkaWF0ZS5pbW1fZXhwciwgMSwgMCk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gPT0gSVZlY3RvcikKLQl7Ci0JICAvKiBUcmFwIGluc3RydWN0aW9ucyAqLwotCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgSVZlY3RvcikKLQkgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIpOwotCSAgZWxzZQotCSAgICB7CQkJLyogU2hvdWxkbid0IGdldCBoZXJlICovCi0JICAgICAgYXNfYmFkICgiaW50ZXJydXB0IHZlY3RvciBmb3IgdHJhcCBpbnN0cnVjdGlvbiBvdXQgb2YgcmFuZ2UiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi50bS0+b3Bjb2RlX21vZGlmaWVyID09IFN0YWNrT3AgfHwgaW5zbi50bS0+b3Bjb2RlX21vZGlmaWVyID09IFJvdGF0ZSkKLQl7Ci0JICAvKiBQdXNoLCBQb3AgYW5kIFJvdGF0ZSBpbnN0cnVjdGlvbnMgKi8KLQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCX0KLSAgICAgIGVsc2UgaWYgKChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgKEFiczI0IHwgRGlyZWN0KSkgPT0gKEFiczI0IHwgRGlyZWN0KSkKLQl7Ci0JICAvKiBMRFAgSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgdGVzdGVkIGZvciBiZWZvcmUgdGhlIG5leHQgc2VjdGlvbiAqLwotCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgRGlyZWN0KQotCSAgICB7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5kaXJlY3QucmVzb2x2ZWQgPT0gMSkKLQkJewotCQkgIC8qIERpcmVjdCBhZGRyZXNzaW5nIHVzZXMgbG93ZXIgOCBiaXRzIG9mIGRpcmVjdCBhZGRyZXNzICovCi0JCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5kaXJlY3QuYWRkcmVzcyAmIDB4MDBGRjAwMDApID4+IDE2OwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmaXhTICpmaXg7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICBmaXggPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAzIC0gKGZyYWdfbm93LT5mcl9saXRlcmFsKSwgMSwgJmluc24ub3BlcmFuZF90eXBlWzBdLT5kaXJlY3QuZGlyZWN0X2V4cHIsIDAsIDApOwotCQkgIC8qIEVuc3VyZSB0aGF0IHRoZSBhc3NlbWJsZXIgZG9lc24ndCBjb21wbGFpbiBhYm91dCBmaXR0aW5nIGEgMjQtYml0Ci0JCSAgICAgYWRkcmVzcyBpbnRvIDggYml0cy4gKi8KLQkJICBmaXgtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5yZXNvbHZlZCA9PSAxKQotCQl7Ci0JCSAgLyogSW1tZWRpYXRlIGFkZHJlc3NpbmcgdXNlcyB1cHBlciA4IGJpdHMgb2YgYWRkcmVzcyAqLwotCQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyID4gMHgwMEZGRkZGRikKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkICgiTERQIGluc3RydWN0aW9uIG5lZWRzIGEgMjQtYml0IG9wZXJhbmQiKTsKLQkJICAgICAgcmV0dXJuOwotCQkgICAgfQotCQkgIGluc24ub3Bjb2RlIHw9ICgoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciAmIDB4MDBGRjAwMDApID4+IDE2KTsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZml4UyAqZml4OwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgZml4ID0gZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMyAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDEsICZpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmltbV9leHByLCAwLCAwKTsKLQkJICBmaXgtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSAmIChJbW0yNCkpCi0JewotCSAgLyogVW5jb25kaXRpb25hbCBCcmFuY2ggYW5kIENhbGwgaW5zdHJ1Y3Rpb25zICovCi0JICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5yZXNvbHZlZCA9PSAxKQotCSAgICB7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgPiAweDAwRkZGRkZGKQotCQlhc193YXJuICgiZmlyc3Qgb3BlcmFuZCBpcyB0b28gbGFyZ2UgZm9yIGEgMjQtYml0IGRpc3BsYWNlbWVudCIpOwotCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyICYgMHgwMEZGRkZGRik7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAxIC0gKGZyYWdfbm93LT5mcl9saXRlcmFsKSwgMywgJmluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuaW1tX2V4cHIsIDAsIDApOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSAmIE5vdFJlcSkKLQl7Ci0JICAvKiBDaGVjayBmb3IgTk9QIGluc3RydWN0aW9uIHdpdGhvdXQgYXJndW1lbnRzLiAqLwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLnRtLT5vcGVyYW5kcyA9PSAwKQotCXsKLQkgIC8qIENoZWNrIGZvciBpbnN0cnVjdGlvbnMgd2l0aG91dCBvcGVyYW5kcy4gKi8KLQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JfQotICAgIH0KLSAgZGVidWcgKCJBZGRyZXNzaW5nIG1vZGU6ICUwOFhcbiIsIGluc24uYWRkcmVzc2luZ19tb2RlKTsKLSAgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBpbnNuLm9wZXJhbmRzOyBpKyspCi0gICAgICB7Ci0JaWYgKGluc24ub3BlcmFuZF90eXBlW2ldLT5pbW1lZGlhdGUubGFiZWwpCi0JICBmcmVlIChpbnNuLm9wZXJhbmRfdHlwZVtpXS0+aW1tZWRpYXRlLmxhYmVsKTsKLQlmcmVlIChpbnNuLm9wZXJhbmRfdHlwZVtpXSk7Ci0gICAgICB9Ci0gIH0KLSAgZGVidWcgKCJGaW5hbCBvcGNvZGU6ICUwOFhcbiIsIGluc24ub3Bjb2RlKTsKLSAgZGVidWcgKCJcbiIpOwotfQotCi1zdHJ1Y3QgdGljMzBfcGFyX2luc24KLXsKLSAgcGFydGVtcGxhdGUgKnRtOwkJLyogVGVtcGxhdGUgb2YgY3VycmVudCBwYXJhbGxlbCBpbnN0cnVjdGlvbiAqLwotICBpbnQgb3BlcmFuZHNbMl07CQkvKiBOdW1iZXIgb2YgZ2l2ZW4gb3BlcmFuZHMgZm9yIGVhY2ggaW5zbiAqLwotICAvKiBUeXBlIG9mIG9wZXJhbmQgZ2l2ZW4gaW4gaW5zdHJ1Y3Rpb24gKi8KLSAgb3BlcmFuZCAqb3BlcmFuZF90eXBlWzJdW01BWF9PUEVSQU5EU107Ci0gIGludCBzd2FwX29wZXJhbmRzOwkJLyogV2hldGhlciB0byBzd2FwIG9wZXJhbmRzIGFyb3VuZC4gKi8KLSAgdW5zaWduZWQgcF9maWVsZDsJCS8qIFZhbHVlIG9mIHAgZmllbGQgaW4gbXVsdGlwbHkgYWRkL3N1YiBpbnN0cnVjdGlvbnMgKi8KLSAgdW5zaWduZWQgb3Bjb2RlOwkJLyogRmluYWwgb3Bjb2RlICovCi19OwotCi1zdHJ1Y3QgdGljMzBfcGFyX2luc24gcF9pbnNuOwotCi1pbnQKLXRpYzMwX3BhcmFsbGVsX2luc24gKGNoYXIgKnRva2VuKQotewotICBzdGF0aWMgcGFydGVtcGxhdGUgKnBfb3Bjb2RlOwotICBjaGFyICpjdXJyZW50X3Bvc24gPSB0b2tlbjsKLSAgY2hhciAqdG9rZW5fc3RhcnQ7Ci0gIGNoYXIgc2F2ZV9jaGFyOwotCi0gIGRlYnVnICgiSW4gdGljMzBfcGFyYWxsZWxfaW5zbiB3aXRoICVzXG4iLCB0b2tlbik7Ci0gIG1lbXNldCAoJnBfaW5zbiwgJ1wwJywgc2l6ZW9mIChwX2luc24pKTsKLSAgd2hpbGUgKGlzX29wY29kZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLSAgICBjdXJyZW50X3Bvc24rKzsKLSAgewkJCQkvKiBGaW5kIGluc3RydWN0aW9uICovCi0gICAgc2F2ZV9jaGFyID0gKmN1cnJlbnRfcG9zbjsKLSAgICAqY3VycmVudF9wb3NuID0gJ1wwJzsKLSAgICBwX29wY29kZSA9IChwYXJ0ZW1wbGF0ZSAqKSBoYXNoX2ZpbmQgKHBhcm9wX2hhc2gsIHRva2VuKTsKLSAgICBpZiAocF9vcGNvZGUpCi0gICAgICB7Ci0JZGVidWcgKCJGb3VuZCBpbnN0cnVjdGlvbiAlc1xuIiwgcF9vcGNvZGUtPm5hbWUpOwotCXBfaW5zbi50bSA9IHBfb3Bjb2RlOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQljaGFyIGZpcnN0X29wY29kZVs2XSA9Ci0JezB9OwotCWNoYXIgc2Vjb25kX29wY29kZVs2XSA9Ci0JezB9OwotCWludCBpOwotCWludCBjdXJyZW50X29wY29kZSA9IC0xOwotCWludCBjaGFyX3B0ciA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc3RybGVuICh0b2tlbik7IGkrKykKLQkgIHsKLQkgICAgY2hhciBjaCA9ICoodG9rZW4gKyBpKTsKLQkgICAgaWYgKGNoID09ICdfJyAmJiBjdXJyZW50X29wY29kZSA9PSAtMSkKLQkgICAgICB7Ci0JCWN1cnJlbnRfb3Bjb2RlID0gMDsKLQkJY29udGludWU7Ci0JICAgICAgfQotCSAgICBpZiAoY2ggPT0gJ18nICYmIGN1cnJlbnRfb3Bjb2RlID09IDApCi0JICAgICAgewotCQljdXJyZW50X29wY29kZSA9IDE7Ci0JCWNoYXJfcHRyID0gMDsKLQkJY29udGludWU7Ci0JICAgICAgfQotCSAgICBzd2l0Y2ggKGN1cnJlbnRfb3Bjb2RlKQotCSAgICAgIHsKLQkgICAgICBjYXNlIDA6Ci0JCWZpcnN0X29wY29kZVtjaGFyX3B0cisrXSA9IGNoOwotCQlicmVhazsKLQkgICAgICBjYXNlIDE6Ci0JCXNlY29uZF9vcGNvZGVbY2hhcl9wdHIrK10gPSBjaDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCWRlYnVnICgiZmlyc3Rfb3Bjb2RlID0gJXNcbiIsIGZpcnN0X29wY29kZSk7Ci0JZGVidWcgKCJzZWNvbmRfb3Bjb2RlID0gJXNcbiIsIHNlY29uZF9vcGNvZGUpOwotCXNwcmludGYgKHRva2VuLCAicV8lc18lcyIsIHNlY29uZF9vcGNvZGUsIGZpcnN0X29wY29kZSk7Ci0JcF9vcGNvZGUgPSAocGFydGVtcGxhdGUgKikgaGFzaF9maW5kIChwYXJvcF9oYXNoLCB0b2tlbik7Ci0JaWYgKHBfb3Bjb2RlKQotCSAgewotCSAgICBkZWJ1ZyAoIkZvdW5kIGluc3RydWN0aW9uICVzXG4iLCBwX29wY29kZS0+bmFtZSk7Ci0JICAgIHBfaW5zbi50bSA9IHBfb3Bjb2RlOwotCSAgICBwX2luc24uc3dhcF9vcGVyYW5kcyA9IDE7Ci0JICB9Ci0JZWxzZQotCSAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgKmN1cnJlbnRfcG9zbiA9IHNhdmVfY2hhcjsKLSAgfQotICB7CQkJCS8qIEZpbmQgb3BlcmFuZHMgKi8KLSAgICBpbnQgcGFyZW5fbm90X2JhbGFuY2VkOwotICAgIGludCBleHBlY3Rpbmdfb3BlcmFuZCA9IDA7Ci0gICAgaW50IGZvdW5kX3NlcGFyYXRvciA9IDA7Ci0gICAgZG8KLSAgICAgIHsKLQkvKiBza2lwIG9wdGlvbmFsIHdoaXRlIHNwYWNlIGJlZm9yZSBvcGVyYW5kICovCi0Jd2hpbGUgKCFpc19vcGVyYW5kX2NoYXIgKCpjdXJyZW50X3Bvc24pICYmICpjdXJyZW50X3Bvc24gIT0gRU5EX09GX0lOU04pCi0JICB7Ci0JICAgIGlmICghaXNfc3BhY2VfY2hhciAoKmN1cnJlbnRfcG9zbikgJiYgKmN1cnJlbnRfcG9zbiAhPSBQQVJBTExFTF9TRVBBUkFUT1IpCi0JICAgICAgewotCQlhc19iYWQgKCJJbnZhbGlkIGNoYXJhY3RlciAlcyBiZWZvcmUgJXMgb3BlcmFuZCIsCi0JCQlvdXRwdXRfaW52YWxpZCAoKmN1cnJlbnRfcG9zbiksCi0JCQlvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSBQQVJBTExFTF9TRVBBUkFUT1IpCi0JICAgICAgZm91bmRfc2VwYXJhdG9yID0gMTsKLQkgICAgY3VycmVudF9wb3NuKys7Ci0JICB9Ci0JdG9rZW5fc3RhcnQgPSBjdXJyZW50X3Bvc247CS8qIGFmdGVyIHdoaXRlIHNwYWNlICovCi0JcGFyZW5fbm90X2JhbGFuY2VkID0gMDsKLQl3aGlsZSAocGFyZW5fbm90X2JhbGFuY2VkIHx8ICpjdXJyZW50X3Bvc24gIT0gJywnKQotCSAgewotCSAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSBFTkRfT0ZfSU5TTikKLQkgICAgICB7Ci0JCWlmIChwYXJlbl9ub3RfYmFsYW5jZWQpCi0JCSAgewotCQkgICAgYXNfYmFkICgiVW5iYWxhbmNlZCBwYXJlbnRoZXNpcyBpbiAlcyBvcGVyYW5kLiIsCi0JCQkgICAgb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7Ci0JCSAgICByZXR1cm4gMTsKLQkJICB9Ci0JCWVsc2UKLQkJICBicmVhazsJLyogd2UgYXJlIGRvbmUgKi8KLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKCpjdXJyZW50X3Bvc24gPT0gUEFSQUxMRUxfU0VQQVJBVE9SKQotCSAgICAgIHsKLQkJd2hpbGUgKGlzX3NwYWNlX2NoYXIgKCooY3VycmVudF9wb3NuIC0gMSkpKQotCQkgIGN1cnJlbnRfcG9zbi0tOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKCFpc19vcGVyYW5kX2NoYXIgKCpjdXJyZW50X3Bvc24pICYmICFpc19zcGFjZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoIkludmFsaWQgY2hhcmFjdGVyICVzIGluICVzIG9wZXJhbmQiLAotCQkJb3V0cHV0X2ludmFsaWQgKCpjdXJyZW50X3Bvc24pLAotCQkJb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJygnKQotCSAgICAgICsrcGFyZW5fbm90X2JhbGFuY2VkOwotCSAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnKScpCi0JICAgICAgLS1wYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JICAgIGN1cnJlbnRfcG9zbisrOwotCSAgfQotCWlmIChjdXJyZW50X3Bvc24gIT0gdG9rZW5fc3RhcnQpCi0JICB7CQkJLyogeWVzLCB3ZSd2ZSByZWFkIGluIGFub3RoZXIgb3BlcmFuZCAqLwotCSAgICBwX2luc24ub3BlcmFuZHNbZm91bmRfc2VwYXJhdG9yXSsrOwotCSAgICBpZiAocF9pbnNuLm9wZXJhbmRzW2ZvdW5kX3NlcGFyYXRvcl0gPiBNQVhfT1BFUkFORFMpCi0JICAgICAgewotCQlhc19iYWQgKCJTcHVyaW91cyBvcGVyYW5kczsgKCVkIG9wZXJhbmRzL2luc3RydWN0aW9uIG1heCkiLAotCQkJTUFYX09QRVJBTkRTKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgICAvKiBub3cgcGFyc2Ugb3BlcmFuZCBhZGRpbmcgaW5mbyB0byAnaW5zbicgYXMgd2UgZ28gYWxvbmcgKi8KLQkgICAgc2F2ZV9jaGFyID0gKmN1cnJlbnRfcG9zbjsKLQkgICAgKmN1cnJlbnRfcG9zbiA9ICdcMCc7Ci0JICAgIHBfaW5zbi5vcGVyYW5kX3R5cGVbZm91bmRfc2VwYXJhdG9yXVtwX2luc24ub3BlcmFuZHNbZm91bmRfc2VwYXJhdG9yXSAtIDFdID0KLQkgICAgICB0aWMzMF9vcGVyYW5kICh0b2tlbl9zdGFydCk7Ci0JICAgICpjdXJyZW50X3Bvc24gPSBzYXZlX2NoYXI7Ci0JICAgIGlmICghcF9pbnNuLm9wZXJhbmRfdHlwZVtmb3VuZF9zZXBhcmF0b3JdW3BfaW5zbi5vcGVyYW5kc1tmb3VuZF9zZXBhcmF0b3JdIC0gMV0pCi0JICAgICAgcmV0dXJuIDE7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAoZXhwZWN0aW5nX29wZXJhbmQpCi0JICAgICAgewotCQlhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIik7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJywnKQotCSAgICAgIHsKLQkJYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYmVmb3JlICcsJzsgZ290IG5vdGhpbmciKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgfQotCS8qIG5vdyAqY3VycmVudF9wb3NuIG11c3QgYmUgZWl0aGVyICcsJyBvciBFTkRfT0ZfSU5TTiAqLwotCWlmICgqY3VycmVudF9wb3NuID09ICcsJykKLQkgIHsKLQkgICAgaWYgKCorK2N1cnJlbnRfcG9zbiA9PSBFTkRfT0ZfSU5TTikKLQkgICAgICB7CQkJLyoganVzdCBza2lwIGl0LCBpZiBpdCdzIFxuIGNvbXBsYWluICovCi0JCWFzX2JhZCAoIkV4cGVjdGluZyBvcGVyYW5kIGFmdGVyICcsJzsgZ290IG5vdGhpbmciKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgICBleHBlY3Rpbmdfb3BlcmFuZCA9IDE7Ci0JICB9Ci0gICAgICB9Ci0gICAgd2hpbGUgKCpjdXJyZW50X3Bvc24gIT0gRU5EX09GX0lOU04pOwkvKiB1bnRpbCB3ZSBnZXQgZW5kIG9mIGluc24gKi8KLSAgfQotICBpZiAocF9pbnNuLnN3YXBfb3BlcmFuZHMpCi0gICAgewotICAgICAgaW50IHRlbXBfbnVtLCBpOwotICAgICAgb3BlcmFuZCAqdGVtcF9vcDsKLQotICAgICAgdGVtcF9udW0gPSBwX2luc24ub3BlcmFuZHNbMF07Ci0gICAgICBwX2luc24ub3BlcmFuZHNbMF0gPSBwX2luc24ub3BlcmFuZHNbMV07Ci0gICAgICBwX2luc24ub3BlcmFuZHNbMV0gPSB0ZW1wX251bTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfT1BFUkFORFM7IGkrKykKLQl7Ci0JICB0ZW1wX29wID0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVtpXTsKLQkgIHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1baV0gPSBwX2luc24ub3BlcmFuZF90eXBlWzFdW2ldOwotCSAgcF9pbnNuLm9wZXJhbmRfdHlwZVsxXVtpXSA9IHRlbXBfb3A7Ci0JfQotICAgIH0KLSAgaWYgKHBfaW5zbi5vcGVyYW5kc1swXSAhPSBwX2luc24udG0tPm9wZXJhbmRzXzEpCi0gICAgewotICAgICAgYXNfYmFkICgiaW5jb3JyZWN0IG51bWJlciBvZiBvcGVyYW5kcyBnaXZlbiBpbiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24iKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKHBfaW5zbi5vcGVyYW5kc1sxXSAhPSBwX2luc24udG0tPm9wZXJhbmRzXzIpCi0gICAgewotICAgICAgYXNfYmFkICgiaW5jb3JyZWN0IG51bWJlciBvZiBvcGVyYW5kcyBnaXZlbiBpbiB0aGUgc2Vjb25kIGluc3RydWN0aW9uIik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGRlYnVnICgiTnVtYmVyIG9mIG9wZXJhbmRzIGluIGZpcnN0IGluc246ICVkXG4iLCBwX2luc24ub3BlcmFuZHNbMF0pOwotICBkZWJ1ZyAoIk51bWJlciBvZiBvcGVyYW5kcyBpbiBzZWNvbmQgaW5zbjogJWRcbiIsIHBfaW5zbi5vcGVyYW5kc1sxXSk7Ci0gIHsJCQkJLyogTm93IGNoZWNrIGlmIG9wZXJhbmRzIGFyZSBjb3JyZWN0ICovCi0gICAgaW50IGNvdW50OwotICAgIGludCBudW1fcm4gPSAwOwotICAgIGludCBudW1faW5kID0gMDsKLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyOyBjb3VudCsrKQotICAgICAgewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBwX2luc24ub3BlcmFuZHNbY291bnRdOyBpKyspCi0JICB7Ci0JICAgIGlmICgocF9pbnNuLm9wZXJhbmRfdHlwZVtjb3VudF1baV0tPm9wX3R5cGUgJgotCQkgcF9pbnNuLnRtLT5vcGVyYW5kX3R5cGVzW2NvdW50XVtpXSkgPT0gMCkKLQkgICAgICB7Ci0JCWFzX2JhZCAoIiVzIGluc3RydWN0aW9uLCBvcGVyYW5kICVkIGRvZXNuJ3QgbWF0Y2giLCBvcmRpbmFsX25hbWVzW2NvdW50XSwgaSArIDEpOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICAgIC8qIEdldCBudW1iZXIgb2YgUiByZWdpc3RlciBhbmQgaW5kaXJlY3QgcmVmZXJlbmNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGZpcnN0Ci0JICAgICAgIHR3byBvcGVyYW5kcyBvZiBlYWNoIGluc3RydWN0aW9uLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIG11bHRpcGx5Ci0JICAgICAgIHBhcmFsbGVsIGluc3RydWN0aW9ucyB3aGljaCByZXF1aXJlIHR3byBSIHJlZ2lzdGVycyBhbmQgdHdvIGluZGlyZWN0Ci0JICAgICAgIHJlZmVyZW5jZXMsIGJ1dCBub3QgaW4gYW55IHBhcnRpY3VsYXIgcGxhY2UuICovCi0JICAgIGlmICgocF9pbnNuLm9wZXJhbmRfdHlwZVtjb3VudF1baV0tPm9wX3R5cGUgJiBSbikgJiYgaSA8IDIpCi0JICAgICAgbnVtX3JuKys7Ci0JICAgIGVsc2UgaWYgKChwX2luc24ub3BlcmFuZF90eXBlW2NvdW50XVtpXS0+b3BfdHlwZSAmIEluZGlyZWN0KSAmJiBpIDwgMikKLQkgICAgICBudW1faW5kKys7Ci0JICB9Ci0gICAgICB9Ci0gICAgaWYgKChwX2luc24udG0tPm9wZXJhbmRfdHlwZXNbMF1bMF0gJiAoSW5kaXJlY3QgfCBSbikpID09IChJbmRpcmVjdCB8IFJuKSkKLSAgICAgIHsKLQkvKiBDaGVjayBmb3IgdGhlIG11bHRpcGx5IGluc3RydWN0aW9ucyAqLwotCWlmIChudW1fcm4gIT0gMikKLQkgIHsKLQkgICAgYXNfYmFkICgiaW5jb3JyZWN0IGZvcm1hdCBmb3IgbXVsdGlwbHkgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24iKTsKLQkgICAgcmV0dXJuIDE7Ci0JICB9Ci0JaWYgKG51bV9pbmQgIT0gMikKLQkgIHsJCQkvKiBTaG91bGRuJ3QgZ2V0IGhlcmUgKi8KLQkgICAgYXNfYmFkICgiaW5jb3JyZWN0IGZvcm1hdCBmb3IgbXVsdGlwbHkgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24iKTsKLQkgICAgcmV0dXJuIDE7Ci0JICB9Ci0JaWYgKChwX2luc24ub3BlcmFuZF90eXBlWzBdWzJdLT5yZWcub3Bjb2RlICE9IDB4MDApICYmCi0JICAgIChwX2luc24ub3BlcmFuZF90eXBlWzBdWzJdLT5yZWcub3Bjb2RlICE9IDB4MDEpKQotCSAgewotCSAgICBhc19iYWQgKCJkZXN0aW5hdGlvbiBmb3IgbXVsdGlwbHkgY2FuIG9ubHkgYmUgUjAgb3IgUjEiKTsKLQkgICAgcmV0dXJuIDE7Ci0JICB9Ci0JaWYgKChwX2luc24ub3BlcmFuZF90eXBlWzFdWzJdLT5yZWcub3Bjb2RlICE9IDB4MDIpICYmCi0JICAgIChwX2luc24ub3BlcmFuZF90eXBlWzFdWzJdLT5yZWcub3Bjb2RlICE9IDB4MDMpKQotCSAgewotCSAgICBhc19iYWQgKCJkZXN0aW5hdGlvbiBmb3IgYWRkL3N1YnRyYWN0IGNhbiBvbmx5IGJlIFIyIG9yIFIzIik7Ci0JICAgIHJldHVybiAxOwotCSAgfQotCS8qIE5vdyBkZXRlcm1pbmUgdGhlIFAgZmllbGQgZm9yIHRoZSBpbnN0cnVjdGlvbiAqLwotCWlmIChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JICB7Ci0JICAgIGlmIChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JICAgICAgcF9pbnNuLnBfZmllbGQgPSAweDAwMDAwMDAwOwkvKiBJbmQgKiBJbmQsIFJuICArLy0gUm4gICovCi0JICAgIGVsc2UgaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkgICAgICBwX2luc24ucF9maWVsZCA9IDB4MDEwMDAwMDA7CS8qIEluZCAqIFJuLCAgSW5kICsvLSBSbiAgKi8KLQkgICAgZWxzZQotCSAgICAgIHBfaW5zbi5wX2ZpZWxkID0gMHgwMzAwMDAwMDsJLyogSW5kICogUm4sICBSbiAgKy8tIEluZCAqLwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPm9wX3R5cGUgJiBSbikKLQkgICAgICBwX2luc24ucF9maWVsZCA9IDB4MDIwMDAwMDA7CS8qIFJuICAqIFJuLCAgSW5kICsvLSBJbmQgKi8KLQkgICAgZWxzZSBpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCSAgICAgIHsKLQkJb3BlcmFuZCAqdGVtcDsKLQkJcF9pbnNuLnBfZmllbGQgPSAweDAxMDAwMDAwOwkvKiBSbiAgKiBJbmQsIEluZCArLy0gUm4gICovCi0JCS8qIE5lZWQgdG8gc3dhcCB0aGUgdHdvIG11bHRpcGx5IG9wZXJhbmRzIGFyb3VuZCBzbyB0aGF0IGV2ZXJ5dGhpbmcgaXMgaW4KLQkJICAgaXRzIHBsYWNlIGZvciB0aGUgb3Bjb2RlIG1ha2V1cCBpZSBzbyBJbmQgKiBSbiwgSW5kICsvLSBSbiAqLwotCQl0ZW1wID0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXTsKLQkJcF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXSA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV07Ci0JCXBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0gPSB0ZW1wOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJb3BlcmFuZCAqdGVtcDsKLQkJcF9pbnNuLnBfZmllbGQgPSAweDAzMDAwMDAwOwkvKiBSbiAgKiBJbmQsIFJuICArLy0gSW5kICovCi0JCXRlbXAgPSBwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdOwotCQlwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdID0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXTsKLQkJcF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXSA9IHRlbXA7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICB9Ci0gIGRlYnVnICgiUCBmaWVsZDogJTA4WFxuIiwgcF9pbnNuLnBfZmllbGQpOwotICAvKiBGaW5hbGlzZSBvcGNvZGUuICBUaGlzIGlzIGVhc2llciBmb3IgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIGFzIHRoZXkgaGF2ZSB0byBiZQotICAgICBmdWxseSByZXNvbHZlZCwgdGhlcmUgYXJlIG5vIG1lbW9yeSBhZGRyZXNzZXMgYWxsb3dlZCwgZXhjZXB0IHRocm91Z2ggaW5kaXJlY3QKLSAgICAgYWRkcmVzc2luZywgc28gdGhlcmUgYXJlIG5vIGxhYmVscyB0byByZXNvbHZlLiAqLwotICB7Ci0gICAgcF9pbnNuLm9wY29kZSA9IHBfaW5zbi50bS0+YmFzZV9vcGNvZGU7Ci0gICAgc3dpdGNoIChwX2luc24udG0tPm9wb3JkZXIpCi0gICAgICB7Ci0gICAgICBjYXNlIE9PXzRvcDE6Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QuQVJudW0pOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUgPDwgMjIpOwotCWJyZWFrOwotICAgICAgY2FzZSBPT180b3AyOgotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDIyKTsKLQlpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+cmVnLm9wY29kZSA9PSBwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlKQotCSAgYXNfd2FybiAoImxvYWRpbmcgdGhlIHNhbWUgcmVnaXN0ZXIgaW4gcGFyYWxsZWwgb3BlcmF0aW9uIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE9PXzRvcDM6Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QuQVJudW0pOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPnJlZy5vcGNvZGUgPDwgMjIpOwotCWJyZWFrOwotICAgICAgY2FzZSBPT181b3AxOgotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzJdLT5yZWcub3Bjb2RlIDw8IDIyKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT09fNW9wMjoKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5BUm51bSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSA8PCAyMik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE9PX1BGaWVsZDoKLQlwX2luc24ub3Bjb2RlIHw9IHBfaW5zbi5wX2ZpZWxkOwotCWlmIChwX2luc24ub3BlcmFuZF90eXBlWzBdWzJdLT5yZWcub3Bjb2RlID09IDB4MDEpCi0JICBwX2luc24ub3Bjb2RlIHw9IDB4MDA4MDAwMDA7Ci0JaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMl0tPnJlZy5vcGNvZGUgPT0gMHgwMykKLQkgIHBfaW5zbi5vcGNvZGUgfD0gMHgwMDQwMDAwMDsKLQlzd2l0Y2ggKHBfaW5zbi5wX2ZpZWxkKQotCSAgewotCSAgY2FzZSAweDAwMDAwMDAwOgotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5BUm51bSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDB4MDEwMDAwMDA6Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0LkFSbnVtKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMHgwMjAwMDAwMDoKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0pOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAweDAzMDAwMDAwOgotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5BUm51bSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIH0JCQkJLyogT3Bjb2RlIGlzIGZpbmFsaXNlZCBhdCB0aGlzIHBvaW50IGZvciBhbGwgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zLiAqLwotICB7CQkJCS8qIE91dHB1dCBvcGNvZGUgKi8KLSAgICBjaGFyICpwOwotICAgIHAgPSBmcmFnX21vcmUgKElOU05fU0laRSk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBwX2luc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotICB9Ci0gIHsKLSAgICBpbnQgaSwgajsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgZm9yIChqID0gMDsgaiA8IHBfaW5zbi5vcGVyYW5kc1tpXTsgaisrKQotCWZyZWUgKHBfaW5zbi5vcGVyYW5kX3R5cGVbaV1bal0pOwotICB9Ci0gIGRlYnVnICgiRmluYWwgb3Bjb2RlOiAlMDhYXG4iLCBwX2luc24ub3Bjb2RlKTsKLSAgZGVidWcgKCJcbiIpOwotICByZXR1cm4gMTsKLX0KLQotb3BlcmFuZCAqCi10aWMzMF9vcGVyYW5kICh0b2tlbikKLSAgICAgY2hhciAqdG9rZW47Ci17Ci0gIGludCBjb3VudDsKLSAgY2hhciBpbmRfYnVmZmVyW3N0cmxlbiAodG9rZW4pXTsKLSAgb3BlcmFuZCAqY3VycmVudF9vcDsKLQotICBkZWJ1ZyAoIkluIHRpYzMwX29wZXJhbmQgd2l0aCAlc1xuIiwgdG9rZW4pOwotICBjdXJyZW50X29wID0gKG9wZXJhbmQgKikgbWFsbG9jIChzaXplb2YgKG9wZXJhbmQpKTsKLSAgbWVtc2V0IChjdXJyZW50X29wLCAnXDAnLCBzaXplb2YgKG9wZXJhbmQpKTsKLSAgaWYgKCp0b2tlbiA9PSBESVJFQ1RfUkVGRVJFTkNFKQotICAgIHsKLSAgICAgIGNoYXIgKnRva2VuX3Bvc24gPSB0b2tlbiArIDE7Ci0gICAgICBpbnQgZGlyZWN0X2xhYmVsID0gMDsKLSAgICAgIGRlYnVnICgiRm91bmQgZGlyZWN0IHJlZmVyZW5jZVxuIik7Ci0gICAgICB3aGlsZSAoKnRva2VuX3Bvc24pCi0JewotCSAgaWYgKCFpc19kaWdpdF9jaGFyICgqdG9rZW5fcG9zbikpCi0JICAgIGRpcmVjdF9sYWJlbCA9IDE7Ci0JICB0b2tlbl9wb3NuKys7Ci0JfQotICAgICAgaWYgKGRpcmVjdF9sYWJlbCkKLQl7Ci0JICBjaGFyICpzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHNlZ1QgcmV0dmFsOwotCSAgZGVidWcgKCJEaXJlY3QgcmVmZXJlbmNlIGlzIGEgbGFiZWxcbiIpOwotCSAgY3VycmVudF9vcC0+ZGlyZWN0LmxhYmVsID0gdG9rZW4gKyAxOwotCSAgc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0b2tlbiArIDE7Ci0JICBkZWJ1ZyAoIkN1cnJlbnQgaW5wdXRfbGluZV9wb2ludGVyOiAlc1xuIiwgaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgIHJldHZhbCA9IGV4cHJlc3Npb24gKCZjdXJyZW50X29wLT5kaXJlY3QuZGlyZWN0X2V4cHIpOwotCSAgZGVidWcgKCJFeHByZXNzaW9uIHR5cGU6ICVkXG4iLCBjdXJyZW50X29wLT5kaXJlY3QuZGlyZWN0X2V4cHIuWF9vcCk7Ci0JICBkZWJ1ZyAoIkV4cHJlc3Npb24gYWRkbnVtOiAlZFxuIiwgY3VycmVudF9vcC0+ZGlyZWN0LmRpcmVjdF9leHByLlhfYWRkX251bWJlcik7Ci0JICBkZWJ1ZyAoIlNlZ21lbnQ6ICVkXG4iLCByZXR2YWwpOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpZiAoY3VycmVudF9vcC0+ZGlyZWN0LmRpcmVjdF9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfb3AtPmRpcmVjdC5hZGRyZXNzID0gY3VycmVudF9vcC0+ZGlyZWN0LmRpcmVjdF9leHByLlhfYWRkX251bWJlcjsKLQkgICAgICBjdXJyZW50X29wLT5kaXJlY3QucmVzb2x2ZWQgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRlYnVnICgiRGlyZWN0IHJlZmVyZW5jZSBpcyBhIG51bWJlclxuIik7Ci0JICBjdXJyZW50X29wLT5kaXJlY3QuYWRkcmVzcyA9IGF0b2kgKHRva2VuICsgMSk7Ci0JICBjdXJyZW50X29wLT5kaXJlY3QucmVzb2x2ZWQgPSAxOwotCX0KLSAgICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBEaXJlY3Q7Ci0gICAgfQotICBlbHNlIGlmICgqdG9rZW4gPT0gSU5ESVJFQ1RfUkVGRVJFTkNFKQotICAgIHsJCQkJLyogSW5kaXJlY3QgcmVmZXJlbmNlIG9wZXJhbmQgKi8KLSAgICAgIGludCBmb3VuZF9hciA9IDA7Ci0gICAgICBpbnQgZm91bmRfZGlzcCA9IDA7Ci0gICAgICBpbnQgYXJfbnVtYmVyID0gLTE7Ci0gICAgICBpbnQgZGlzcF9udW1iZXIgPSAwOwotICAgICAgaW50IGJ1ZmZlcl9wb3NuID0gMTsKLSAgICAgIGluZF9hZGRyX3R5cGUgKmluZF9hZGRyX29wOwotICAgICAgZGVidWcgKCJGb3VuZCBpbmRpcmVjdCByZWZlcmVuY2VcbiIpOwotICAgICAgaW5kX2J1ZmZlclswXSA9ICp0b2tlbjsKLSAgICAgIGZvciAoY291bnQgPSAxOyBjb3VudCA8IHN0cmxlbiAodG9rZW4pOyBjb3VudCsrKQotCXsJCQkvKiBTdHJpcCBvcGVyYW5kICovCi0JICBpbmRfYnVmZmVyW2J1ZmZlcl9wb3NuXSA9IHRvbG93ZXIgKCoodG9rZW4gKyBjb3VudCkpOwotCSAgaWYgKCgqKHRva2VuICsgY291bnQgLSAxKSA9PSAnYScgfHwgKih0b2tlbiArIGNvdW50IC0gMSkgPT0gJ0EnKSAmJgotCSAgICAgICgqKHRva2VuICsgY291bnQpID09ICdyJyB8fCAqKHRva2VuICsgY291bnQpID09ICdSJykpCi0JICAgIHsKLQkgICAgICAvKiBBUiByZWZlcmVuY2UgaXMgZm91bmQsIHNvIGdldCBpdHMgbnVtYmVyIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYnVmZmVyCi0JICAgICAgICAgc28gaXQgY2FuIHBhc3MgdGhyb3VnaCBoYXNoX2ZpbmQoKSAqLwotCSAgICAgIGlmIChmb3VuZF9hcikKLQkJewotCQkgIGFzX2JhZCAoIk1vcmUgdGhhbiBvbmUgQVIgcmVnaXN0ZXIgZm91bmQgaW4gaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JCSAgcmV0dXJuIE5VTEw7Ci0JCX0KLQkgICAgICBpZiAoKih0b2tlbiArIGNvdW50ICsgMSkgPCAnMCcgfHwgKih0b2tlbiArIGNvdW50ICsgMSkgPiAnNycpCi0JCXsKLQkJICBhc19iYWQgKCJJbGxlZ2FsIEFSIHJlZ2lzdGVyIGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCQkgIHJldHVybiBOVUxMOwotCQl9Ci0JICAgICAgYXJfbnVtYmVyID0gKih0b2tlbiArIGNvdW50ICsgMSkgLSAnMCc7Ci0JICAgICAgZm91bmRfYXIgPSAxOwotCSAgICAgIGNvdW50Kys7Ci0JICAgIH0KLQkgIGlmICgqKHRva2VuICsgY291bnQpID09ICcoJykKLQkgICAgewotCSAgICAgIC8qIFBhcmVudGhlc2lzIGZvdW5kLCBzbyBjaGVjayBpZiBhIGRpc3BsYWNlbWVudCB2YWx1ZSBpcyBpbnNpZGUuICBJZiBzbywgZ2V0Ci0JICAgICAgICAgdGhlIHZhbHVlIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYnVmZmVyLiAqLwotCSAgICAgIGlmIChpc19kaWdpdF9jaGFyICgqKHRva2VuICsgY291bnQgKyAxKSkpCi0JCXsKLQkJICBjaGFyIGRpc3BbMTBdOwotCQkgIGludCBkaXNwX3Bvc24gPSAwOwotCi0JCSAgaWYgKGZvdW5kX2Rpc3ApCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoIk1vcmUgdGhhbiBvbmUgZGlzcGxhY2VtZW50IGZvdW5kIGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCQkgICAgICByZXR1cm4gTlVMTDsKLQkJICAgIH0KLQkJICBjb3VudCsrOwotCQkgIHdoaWxlICgqKHRva2VuICsgY291bnQpICE9ICcpJykKLQkJICAgIHsKLQkJICAgICAgaWYgKCFpc19kaWdpdF9jaGFyICgqKHRva2VuICsgY291bnQpKSkKLQkJCXsKLQkJCSAgYXNfYmFkICgiSW52YWxpZCBkaXNwbGFjZW1lbnQgaW4gaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JCQkgIHJldHVybiBOVUxMOwotCQkJfQotCQkgICAgICBkaXNwW2Rpc3BfcG9zbisrXSA9ICoodG9rZW4gKyAoY291bnQrKykpOwotCQkgICAgfQotCQkgIGRpc3BbZGlzcF9wb3NuXSA9ICdcMCc7Ci0JCSAgZGlzcF9udW1iZXIgPSBhdG9pIChkaXNwKTsKLQkJICBjb3VudC0tOwotCQkgIGZvdW5kX2Rpc3AgPSAxOwotCQl9Ci0JICAgIH0KLQkgIGJ1ZmZlcl9wb3NuKys7Ci0JfQotICAgICAgaW5kX2J1ZmZlcltidWZmZXJfcG9zbl0gPSAnXDAnOwotICAgICAgaWYgKCFmb3VuZF9hcikKLQl7Ci0JICBhc19iYWQgKCJBUiByZWdpc3RlciBub3QgZm91bmQgaW4gaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBpbmRfYWRkcl9vcCA9IChpbmRfYWRkcl90eXBlICopIGhhc2hfZmluZCAoaW5kX2hhc2gsIGluZF9idWZmZXIpOwotICAgICAgaWYgKGluZF9hZGRyX29wKQotCXsKLQkgIGRlYnVnICgiRm91bmQgaW5kaXJlY3QgcmVmZXJlbmNlOiAlc1xuIiwgaW5kX2FkZHJfb3AtPnN5bnRheCk7Ci0JICBpZiAoaW5kX2FkZHJfb3AtPmRpc3BsYWNlbWVudCA9PSBJTVBMSUVEX0RJU1ApCi0JICAgIHsKLQkgICAgICBmb3VuZF9kaXNwID0gMTsKLQkgICAgICBkaXNwX251bWJlciA9IDE7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChpbmRfYWRkcl9vcC0+ZGlzcGxhY2VtZW50ID09IERJU1BfUkVRVUlSRUQpICYmICFmb3VuZF9kaXNwKQotCSAgICB7Ci0JICAgICAgLyogTWF5YmUgYW4gaW1wbGllZCBkaXNwbGFjZW1lbnQgb2YgMSBhZ2FpbiAqLwotCSAgICAgIGFzX2JhZCAoInJlcXVpcmVkIGRpc3BsYWNlbWVudCB3YXNuJ3QgZ2l2ZW4gaW4gaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkICgiaWxsZWdhbCBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGlmIChmb3VuZF9kaXNwICYmIChkaXNwX251bWJlciA8IDAgfHwgZGlzcF9udW1iZXIgPiAyNTUpKQotCXsKLQkgIGFzX2JhZCAoImRpc3BsYWNlbWVudCBtdXN0IGJlIGFuIHVuc2lnbmVkIDgtYml0IG51bWJlciIpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgY3VycmVudF9vcC0+aW5kaXJlY3QubW9kID0gaW5kX2FkZHJfb3AtPm1vZGZpZWxkOwotICAgICAgY3VycmVudF9vcC0+aW5kaXJlY3QuZGlzcCA9IGRpc3BfbnVtYmVyOwotICAgICAgY3VycmVudF9vcC0+aW5kaXJlY3QuQVJudW0gPSBhcl9udW1iZXI7Ci0gICAgICBjdXJyZW50X29wLT5vcF90eXBlID0gSW5kaXJlY3Q7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVnICpyZWdvcCA9IChyZWcgKikgaGFzaF9maW5kIChyZWdfaGFzaCwgdG9rZW4pOwotICAgICAgaWYgKHJlZ29wKQotCXsKLQkgIGRlYnVnICgiRm91bmQgcmVnaXN0ZXIgb3BlcmFuZDogJXNcbiIsIHJlZ29wLT5uYW1lKTsKLQkgIGlmIChyZWdvcC0+cmVndHlwZSA9PSBSRUdfQVJuKQotCSAgICBjdXJyZW50X29wLT5vcF90eXBlID0gQVJuOwotCSAgZWxzZSBpZiAocmVnb3AtPnJlZ3R5cGUgPT0gUkVHX1JuKQotCSAgICBjdXJyZW50X29wLT5vcF90eXBlID0gUm47Ci0JICBlbHNlIGlmIChyZWdvcC0+cmVndHlwZSA9PSBSRUdfRFApCi0JICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBEUFJlZzsKLQkgIGVsc2UKLQkgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IE90aGVyUmVnOwotCSAgY3VycmVudF9vcC0+cmVnLm9wY29kZSA9IHJlZ29wLT5vcGNvZGU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghaXNfZGlnaXRfY2hhciAoKnRva2VuKSB8fCAqKHRva2VuICsgMSkgPT0gJ3gnIHx8IHN0cmNociAodG9rZW4sICdoJykpCi0JICAgIHsKLQkgICAgICBjaGFyICpzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBzZWdUIHJldHZhbDsKLQkgICAgICBkZWJ1ZyAoIlByb2JhYmx5IGEgbGFiZWw6ICVzXG4iLCB0b2tlbik7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLmxhYmVsID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKHRva2VuKSArIDEpOwotCSAgICAgIHN0cmNweSAoY3VycmVudF9vcC0+aW1tZWRpYXRlLmxhYmVsLCB0b2tlbik7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLmxhYmVsW3N0cmxlbiAodG9rZW4pXSA9ICdcMCc7Ci0JICAgICAgc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdG9rZW47Ci0JICAgICAgZGVidWcgKCJDdXJyZW50IGlucHV0X2xpbmVfcG9pbnRlcjogJXNcbiIsIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0JICAgICAgcmV0dmFsID0gZXhwcmVzc2lvbiAoJmN1cnJlbnRfb3AtPmltbWVkaWF0ZS5pbW1fZXhwcik7Ci0JICAgICAgZGVidWcgKCJFeHByZXNzaW9uIHR5cGU6ICVkXG4iLCBjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIuWF9vcCk7Ci0JICAgICAgZGVidWcgKCJFeHByZXNzaW9uIGFkZG51bTogJWRcbiIsIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5pbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCSAgICAgIGRlYnVnICgiU2VnbWVudDogJWRcbiIsIHJldHZhbCk7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaWYgKGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5pbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBjdXJyZW50X29wLT5pbW1lZGlhdGUuc19udW1iZXIgPSBjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCQkgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS51X251bWJlciA9ICh1bnNpZ25lZCBpbnQpIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0JCSAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnJlc29sdmVkID0gMTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjb3VudDsKLQkgICAgICBkZWJ1ZyAoIkZvdW5kIGEgbnVtYmVyIG9yIGRpc3BsYWNlbWVudFxuIik7Ci0JICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc3RybGVuICh0b2tlbik7IGNvdW50KyspCi0JCWlmICgqKHRva2VuICsgY291bnQpID09ICcuJykKLQkJICBjdXJyZW50X29wLT5pbW1lZGlhdGUuZGVjaW1hbF9mb3VuZCA9IDE7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLmxhYmVsID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKHRva2VuKSArIDEpOwotCSAgICAgIHN0cmNweSAoY3VycmVudF9vcC0+aW1tZWRpYXRlLmxhYmVsLCB0b2tlbik7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLmxhYmVsW3N0cmxlbiAodG9rZW4pXSA9ICdcMCc7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLmZfbnVtYmVyID0gKGZsb2F0KSBhdG9mICh0b2tlbik7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnNfbnVtYmVyID0gKGludCkgYXRvaSAodG9rZW4pOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS51X251bWJlciA9ICh1bnNpZ25lZCBpbnQpIGF0b2kgKHRva2VuKTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUucmVzb2x2ZWQgPSAxOwotCSAgICB9Ci0JICBjdXJyZW50X29wLT5vcF90eXBlID0gRGlzcCB8IEFiczI0IHwgSW1tMTYgfCBJbW0yNDsKLQkgIGlmIChjdXJyZW50X29wLT5pbW1lZGlhdGUudV9udW1iZXIgPj0gMCAmJiBjdXJyZW50X29wLT5pbW1lZGlhdGUudV9udW1iZXIgPD0gMzEpCi0JICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgfD0gSVZlY3RvcjsKLQl9Ci0gICAgfQotICByZXR1cm4gY3VycmVudF9vcDsKLX0KLQotLyogbmV4dF9saW5lIHBvaW50cyB0byB0aGUgbmV4dCBsaW5lIGFmdGVyIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIChjdXJyZW50X2xpbmUpLgotICAgU2VhcmNoIGZvciB0aGUgcGFyYWxsZWwgYmFycywgYW5kIGlmIGZvdW5kLCBtZXJnZSB0d28gbGluZXMgaW50byBpbnRlcm5hbCBzeW50YXgKLSAgIGZvciBhIHBhcmFsbGVsIGluc3RydWN0aW9uOgotICAgcV9bSU5TTjFdX1tJTlNOMl0gW09QRVJBTkRTMV0gfCBbT1BFUkFORFMyXQotICAgQnkgdGhpcyBzdGFnZSwgYWxsIGNvbW1lbnRzIGFyZSBzY3J1YmJlZCwgYW5kIG9ubHkgdGhlIGJhcmUgbGluZXMgYXJlIGdpdmVuLgotICovCi0KLSNkZWZpbmUgTk9ORSAgICAgICAgICAgMAotI2RlZmluZSBTVEFSVF9PUENPREUgICAxCi0jZGVmaW5lIEVORF9PUENPREUgICAgIDIKLSNkZWZpbmUgU1RBUlRfT1BFUkFORFMgMwotI2RlZmluZSBFTkRfT1BFUkFORFMgICA0Ci0KLWNoYXIgKgotdGljMzBfZmluZF9wYXJhbGxlbF9pbnNuIChjdXJyZW50X2xpbmUsIG5leHRfbGluZSkKLSAgICAgY2hhciAqY3VycmVudF9saW5lOwotICAgICBjaGFyICpuZXh0X2xpbmU7Ci17Ci0gIGludCBmb3VuZF9wYXJhbGxlbCA9IDA7Ci0gIGNoYXIgZmlyc3Rfb3Bjb2RlWzI1Nl07Ci0gIGNoYXIgc2Vjb25kX29wY29kZVsyNTZdOwotICBjaGFyIGZpcnN0X29wZXJhbmRzWzI1Nl07Ci0gIGNoYXIgc2Vjb25kX29wZXJhbmRzWzI1Nl07Ci0gIGNoYXIgKnBhcmFsbGVsX2luc247Ci0KLSAgZGVidWcgKCJJbiB0aWMzMF9maW5kX3BhcmFsbGVsX2luc24oKVxuIik7Ci0gIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKGludCkgKm5leHRfbGluZV0pCi0gICAgewotICAgICAgaWYgKCpuZXh0X2xpbmUgPT0gUEFSQUxMRUxfU0VQQVJBVE9SICYmICoobmV4dF9saW5lICsgMSkgPT0gUEFSQUxMRUxfU0VQQVJBVE9SKQotCXsKLQkgIGZvdW5kX3BhcmFsbGVsID0gMTsKLQkgIG5leHRfbGluZSsrOwotCSAgYnJlYWs7Ci0JfQotICAgICAgbmV4dF9saW5lKys7Ci0gICAgfQotICBpZiAoIWZvdW5kX3BhcmFsbGVsKQotICAgIHJldHVybiBOVUxMOwotICBkZWJ1ZyAoIkZvdW5kIGEgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25cbiIpOwotICB7Ci0gICAgaW50IGk7Ci0gICAgY2hhciAqb3Bjb2RlLCAqb3BlcmFuZHMsICpsaW5lOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICAgIHsKLQlpZiAoaSA9PSAwKQotCSAgewotCSAgICBvcGNvZGUgPSAmZmlyc3Rfb3Bjb2RlWzBdOwotCSAgICBvcGVyYW5kcyA9ICZmaXJzdF9vcGVyYW5kc1swXTsKLQkgICAgbGluZSA9IGN1cnJlbnRfbGluZTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIG9wY29kZSA9ICZzZWNvbmRfb3Bjb2RlWzBdOwotCSAgICBvcGVyYW5kcyA9ICZzZWNvbmRfb3BlcmFuZHNbMF07Ci0JICAgIGxpbmUgPSBuZXh0X2xpbmU7Ci0JICB9Ci0JewotCSAgaW50IHNlYXJjaF9zdGF0dXMgPSBOT05FOwotCSAgaW50IGNoYXJfcHRyID0gMDsKLQkgIGNoYXIgYzsKLQotCSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsoaW50KSAoYyA9ICpsaW5lKV0gJiYgKmxpbmUpCi0JICAgIHsKLQkgICAgICBpZiAoaXNfb3Bjb2RlX2NoYXIgKGMpICYmIHNlYXJjaF9zdGF0dXMgPT0gTk9ORSkKLQkJewotCQkgIG9wY29kZVtjaGFyX3B0cisrXSA9IHRvbG93ZXIgKGMpOwotCQkgIHNlYXJjaF9zdGF0dXMgPSBTVEFSVF9PUENPREU7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpc19vcGNvZGVfY2hhciAoYykgJiYgc2VhcmNoX3N0YXR1cyA9PSBTVEFSVF9PUENPREUpCi0JCXsKLQkJICBvcGNvZGVbY2hhcl9wdHIrK10gPSB0b2xvd2VyIChjKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKCFpc19vcGNvZGVfY2hhciAoYykgJiYgc2VhcmNoX3N0YXR1cyA9PSBTVEFSVF9PUENPREUpCi0JCXsKLQkJICBvcGNvZGVbY2hhcl9wdHJdID0gJ1wwJzsKLQkJICBjaGFyX3B0ciA9IDA7Ci0JCSAgc2VhcmNoX3N0YXR1cyA9IEVORF9PUENPREU7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpc19vcGVyYW5kX2NoYXIgKGMpICYmIHNlYXJjaF9zdGF0dXMgPT0gU1RBUlRfT1BFUkFORFMpCi0JCXsKLQkJICBvcGVyYW5kc1tjaGFyX3B0cisrXSA9IGM7Ci0JCX0KLQkgICAgICBpZiAoaXNfb3BlcmFuZF9jaGFyIChjKSAmJiBzZWFyY2hfc3RhdHVzID09IEVORF9PUENPREUpCi0JCXsKLQkJICBvcGVyYW5kc1tjaGFyX3B0cisrXSA9IGM7Ci0JCSAgc2VhcmNoX3N0YXR1cyA9IFNUQVJUX09QRVJBTkRTOwotCQl9Ci0JICAgICAgbGluZSsrOwotCSAgICB9Ci0JICBpZiAoc2VhcmNoX3N0YXR1cyAhPSBTVEFSVF9PUEVSQU5EUykKLQkgICAgcmV0dXJuIE5VTEw7Ci0JICBvcGVyYW5kc1tjaGFyX3B0cl0gPSAnXDAnOwotCX0KLSAgICAgIH0KLSAgfQotICBwYXJhbGxlbF9pbnNuID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKGZpcnN0X29wY29kZSkgKyBzdHJsZW4gKGZpcnN0X29wZXJhbmRzKSArCi0JCSAgICAgc3RybGVuIChzZWNvbmRfb3Bjb2RlKSArIHN0cmxlbiAoc2Vjb25kX29wZXJhbmRzKSArIDgpOwotICBzcHJpbnRmIChwYXJhbGxlbF9pbnNuLCAicV8lc18lcyAlcyB8ICVzIiwgZmlyc3Rfb3Bjb2RlLCBzZWNvbmRfb3Bjb2RlLCBmaXJzdF9vcGVyYW5kcywgc2Vjb25kX29wZXJhbmRzKTsKLSAgZGVidWcgKCJwYXJhbGxlbCBpbnNuID0gJXNcbiIsIHBhcmFsbGVsX2luc24pOwotICByZXR1cm4gcGFyYWxsZWxfaW5zbjsKLX0KLQotI3VuZGVmIE5PTkUKLSN1bmRlZiBTVEFSVF9PUENPREUKLSN1bmRlZiBFTkRfT1BDT0RFCi0jdW5kZWYgU1RBUlRfT1BFUkFORFMKLSN1bmRlZiBFTkRfT1BFUkFORFMKLQotLyogSW4gb3JkZXIgdG8gZ2V0IGdhcyB0byBpZ25vcmUgYW55IHwgY2hhcnMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSwKLSAgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGEgfCBpcyBmb3VuZCBpbiBhIGxpbmUuICovCi0KLWludAotdGljMzBfdW5yZWNvZ25pemVkX2xpbmUgKGMpCi0gICAgIGludCBjOwotewotICBkZWJ1ZyAoIkluIHRjX3VucmVjb2duaXplZF9saW5lXG4iKTsKLSAgcmV0dXJuIChjID09IFBBUkFMTEVMX1NFUEFSQVRPUik7Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLXsKLSAgZGVidWcgKCJJbiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpXG4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWdUIHNlYzsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotewotICBkZWJ1ZyAoIkluIG1kX2NvbnZlcnRfZnJhZygpXG4iKTsKLX0KLQotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbFApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFsUDsKLXsKLSAgdmFsdWVUIHZhbHVlID0gKnZhbFA7Ci0KLSAgZGVidWcgKCJJbiBtZF9hcHBseV9maXgoKSB3aXRoIHZhbHVlID0gJWxkXG4iLCAobG9uZykgdmFsdWUpOwotICBkZWJ1ZyAoIlZhbHVlcyBpbiBmaXhQXG4iKTsKLSAgZGVidWcgKCJmeF9zaXplID0gJWRcbiIsIGZpeFAtPmZ4X3NpemUpOwotICBkZWJ1ZyAoImZ4X3BjcmVsID0gJWRcbiIsIGZpeFAtPmZ4X3BjcmVsKTsKLSAgZGVidWcgKCJmeF93aGVyZSA9ICVkXG4iLCBmaXhQLT5meF93aGVyZSk7Ci0gIGRlYnVnICgiZnhfb2Zmc2V0ID0gJWRcbiIsIChpbnQpIGZpeFAtPmZ4X29mZnNldCk7Ci0gIHsKLSAgICBjaGFyICpidWYgPSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgdmFsdWUgLz0gSU5TTl9TSVpFOwotICAgIGlmIChmaXhQLT5meF9zaXplID09IDEpCi0gICAgICB7CQkJCS8qIFNwZWNpYWwgZml4IGZvciBMRFAgaW5zdHJ1Y3Rpb24uICovCi0JdmFsdWUgPSAodmFsdWUgJiAweDAwRkYwMDAwKSA+PiAxNjsKLSAgICAgIH0KLSAgICBkZWJ1ZyAoIm5ldyB2YWx1ZSA9ICVsZFxuIiwgKGxvbmcpIHZhbHVlKTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIGZpeFAtPmZ4X3NpemUpOwotICB9Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBpbnQgaTsKLQotICBkZWJ1ZyAoIkluIG1kX3BhcnNlX29wdGlvbigpXG4iKTsKLSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLSAgICB7Ci0gICAgICBwcmludGYgKCIlY1xuIiwgYXJnW2NdKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZGVidWcgKCJJbiBtZF9zaG93X3VzYWdlKClcbiIpOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGRlYnVnICgiSW4gbWRfdW5kZWZpbmVkX3N5bWJvbCgpXG4iKTsKLSAgcmV0dXJuIChzeW1ib2xTICopIDA7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgZGVidWcgKCJJbiBtZF9zZWN0aW9uX2FsaWduKCkgc2VnbWVudCA9ICVkIGFuZCBzaXplID0gJWRcbiIsIHNlZ21lbnQsIHNpemUpOwotICBzaXplID0gKHNpemUgKyAzKSAvIDQ7Ci0gIHNpemUgKj0gNDsKLSAgZGVidWcgKCJOZXcgc2l6ZSB2YWx1ZSA9ICVkXG4iLCBzaXplKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGludCBvZmZzZXQ7Ci0KLSAgZGVidWcgKCJJbiBtZF9wY3JlbF9mcm9tKClcbiIpOwotICBkZWJ1ZyAoImZ4X3doZXJlID0gJWRcbiIsIGZpeFAtPmZ4X3doZXJlKTsKLSAgZGVidWcgKCJmeF9zaXplID0gJWRcbiIsIGZpeFAtPmZ4X3NpemUpOwotICAvKiBGaW5kIHRoZSBvcGNvZGUgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGluIHRoZSBmcl9saXRlcmFsCi0gICAgIHN0b3JhZ2UgYXJlYSwgYW5kIGNoZWNrIGJpdCAyMS4gIEJpdCAyMSBjb250YWlucyB3aGV0aGVyIHRoZSBjdXJyZW50IGluc3RydWN0aW9uCi0gICAgIGlzIGEgZGVsYXllZCBvbmUgb3Igbm90LCBhbmQgdGhlbiBzZXQgdGhlIG9mZnNldCB2YWx1ZSBhcHByb3ByaWF0ZWx5LiAqLwotICBpZiAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbFtmaXhQLT5meF93aGVyZSAtIGZpeFAtPmZ4X3NpemUgKyAxXSAmIDB4MjApCi0gICAgb2Zmc2V0ID0gMzsKLSAgZWxzZQotICAgIG9mZnNldCA9IDE7Ci0gIGRlYnVnICgib2Zmc2V0ID0gJWRcbiIsIG9mZnNldCk7Ci0gIC8qIFBDIFJlbGF0aXZlIGluc3RydWN0aW9ucyBoYXZlIGEgZm9ybWF0OgotICAgICBkaXNwbGFjZW1lbnQgPSBMYWJlbCAtIChQQyArIG9mZnNldCkKLSAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIFBDICsgb2Zmc2V0IHdoZXJlOgotICAgICBmeF93aGVyZSAtIGZ4X3NpemUgPSBQQwotICAgICBJTlNOX1NJWkUgKiBvZmZzZXQgPSBvZmZzZXQgbnVtYmVyIG9mIGluc3RydWN0aW9ucwotICAgKi8KLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlIC0gZml4UC0+Znhfc2l6ZSArIChJTlNOX1NJWkUgKiBvZmZzZXQpOwotfQotCi1jaGFyICoKLW1kX2F0b2YgKHdoYXRfc3RhdGVtZW50X3R5cGUsIGxpdGVyYWxQLCBzaXplUCkKLSAgICAgaW50IHdoYXRfc3RhdGVtZW50X3R5cGU7Ci0gICAgIGNoYXIgKmxpdGVyYWxQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgY2hhciAqdG9rZW47Ci0gIGNoYXIga2VlcHZhbDsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgLyogIGNoYXIgKmF0b2ZfaWVlZSAoKTsgKi8KLSAgZmxvYXQgZmxvYXRfdmFsdWU7Ci0gIGRlYnVnICgiSW4gbWRfYXRvZigpXG4iKTsKLSAgZGVidWcgKCJwcmVjaXNpb24gPSAlY1xuIiwgd2hhdF9zdGF0ZW1lbnRfdHlwZSk7Ci0gIGRlYnVnICgibGl0ZXJhbCA9ICVzXG4iLCBsaXRlcmFsUCk7Ci0gIGRlYnVnICgibGluZSA9ICIpOwotICB0b2tlbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQpICppbnB1dF9saW5lX3BvaW50ZXJdICYmICgqaW5wdXRfbGluZV9wb2ludGVyKSAmJiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpKQotICAgIHsKLSAgICAgIGRlYnVnICgiJWMiLCAqaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLSAga2VlcHZhbCA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotICBkZWJ1ZyAoIlxuIik7Ci0gIGZsb2F0X3ZhbHVlID0gKGZsb2F0KSBhdG9mICh0b2tlbik7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBrZWVwdmFsOwotICBkZWJ1ZyAoImZsb2F0X3ZhbHVlID0gJWZcbiIsIGZsb2F0X3ZhbHVlKTsKLSAgc3dpdGNoICh3aGF0X3N0YXRlbWVudF90eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiAiQmFkIGNhbGwgdG8gTURfQVRPRigpIjsKLSAgICB9Ci0gIGlmIChmbG9hdF92YWx1ZSA9PSAwLjApCi0gICAgewotICAgICAgdmFsdWUgPSAocHJlYyA9PSAyKSA/IDB4MDAwMDgwMDBMIDogMHg4MDAwMDAwMEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBleHAsIHNpZ24sIG1hbnQsIHRtc2Zsb2F0OwotICAgICAgdG1zZmxvYXQgPSAqKChsb25nICopICZmbG9hdF92YWx1ZSk7Ci0gICAgICBzaWduID0gdG1zZmxvYXQgJiAweDgwMDAwMDAwOwotICAgICAgbWFudCA9IHRtc2Zsb2F0ICYgMHgwMDdGRkZGRjsKLSAgICAgIGV4cCA9IHRtc2Zsb2F0ICYgMHg3RjgwMDAwMDsKLSAgICAgIGV4cCA8PD0gMTsKLSAgICAgIGlmIChleHAgPT0gMHhGRjAwMDAwMCkKLQl7Ci0JICBpZiAobWFudCA9PSAwKQotCSAgICB2YWx1ZSA9IDB4N0Y3RkZGRkY7Ci0JICBlbHNlIGlmIChzaWduID09IDApCi0JICAgIHZhbHVlID0gMHg3RjdGRkZGRjsKLQkgIGVsc2UKLQkgICAgdmFsdWUgPSAweDdGODAwMDAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHAgLT0gMHg3RjAwMDAwMDsKLQkgIGlmIChzaWduKQotCSAgICB7Ci0JICAgICAgbWFudCA9IG1hbnQgJiAweDAwN0ZGRkZGOwotCSAgICAgIG1hbnQgPSAtbWFudDsKLQkgICAgICBtYW50ID0gbWFudCAmIDB4MDBGRkZGRkY7Ci0JICAgICAgaWYgKG1hbnQgPT0gMCkKLQkJewotCQkgIG1hbnQgfD0gMHgwMDgwMDAwMDsKLQkJICBleHAgPSAobG9uZykgZXhwIC0gMHgwMTAwMDAwMDsKLQkJfQotCSAgICB9Ci0JICB0bXNmbG9hdCA9IGV4cCB8IG1hbnQ7Ci0JICB2YWx1ZSA9IHRtc2Zsb2F0OwotCX0KLSAgICAgIGlmIChwcmVjID09IDIpCi0JewotCSAgbG9uZyBleHAsIG1hbnQ7Ci0KLQkgIGlmICh0bXNmbG9hdCA9PSAweDgwMDAwMDAwKQotCSAgICB7Ci0JICAgICAgdmFsdWUgPSAweDgwMDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHZhbHVlID0gMDsKLQkgICAgICBleHAgPSAodG1zZmxvYXQgJiAweEZGMDAwMDAwKTsKLQkgICAgICBleHAgPj49IDI0OwotCSAgICAgIG1hbnQgPSB0bXNmbG9hdCAmIDB4MDA3RkZGRkY7Ci0JICAgICAgaWYgKHRtc2Zsb2F0ICYgMHgwMDgwMDAwMCkKLQkJewotCQkgIG1hbnQgfD0gMHhGRjAwMDAwMDsKLQkJICBtYW50ICs9IDB4MDAwMDA4MDA7Ci0JCSAgbWFudCA+Pj0gMTI7Ci0JCSAgbWFudCB8PSAweDAwMDAwODAwOwotCQkgIG1hbnQgJj0gMHgwRkZGOwotCQkgIGlmIChleHAgPiA3KQotCQkgICAgdmFsdWUgPSAweDc4MDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBtYW50IHw9IDB4MDA4MDAwMDA7Ci0JCSAgbWFudCArPSAweDAwMDAwODAwOwotCQkgIGV4cCArPSAobWFudCA+PiAyNCk7Ci0JCSAgbWFudCA+Pj0gMTI7Ci0JCSAgbWFudCAmPSAweDA3RkY7Ci0JCSAgaWYgKGV4cCA+IDcpCi0JCSAgICB2YWx1ZSA9IDB4NzdGRjsKLQkJfQotCSAgICAgIGlmIChleHAgPCAtOCkKLQkJdmFsdWUgPSAweDgwMDA7Ci0JICAgICAgaWYgKHZhbHVlID09IDApCi0JCXsKLQkJICBtYW50ID0gKGV4cCA8PCAxMikgfCBtYW50OwotCQkgIHZhbHVlID0gbWFudCAmIDB4RkZGRjsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRlcmFsUCwgdmFsdWUsIHByZWMpOwotICAqc2l6ZVAgPSBwcmVjOwotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgZGVidWcgKCJJbiBtZF9udW1iZXJfdG9fY2hhcnMoKVxuIik7Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgLyogIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4oYnVmLHZhbCxuKTsgKi8KLX0KLQotI2RlZmluZSBGKFNaLFBDUkVMKQkJKCgoU1opIDw8IDEpICsgKFBDUkVMKSkKLSNkZWZpbmUgTUFQKFNaLFBDUkVMLFRZUEUpCWNhc2UgRihTWixQQ1JFTCk6IGNvZGUgPSAoVFlQRSk7IGJyZWFrCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhQKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgYXJlbGVudCAqcmVsOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSA9IDA7Ci0KLSAgZGVidWcgKCJJbiB0Y19nZW5fcmVsb2MoKVxuIik7Ci0gIGRlYnVnICgiZml4UC5zaXplID0gJWRcbiIsIGZpeFAtPmZ4X3NpemUpOwotICBkZWJ1ZyAoImZpeFAucGNyZWwgPSAlZFxuIiwgZml4UC0+ZnhfcGNyZWwpOwotICBkZWJ1ZyAoImFkZHN5Lm5hbWUgPSAlc1xuIiwgU19HRVRfTkFNRSAoZml4UC0+ZnhfYWRkc3kpKTsKLSAgc3dpdGNoIChGIChmaXhQLT5meF9zaXplLCBmaXhQLT5meF9wY3JlbCkpCi0gICAgewotICAgICAgTUFQICgxLCAwLCBCRkRfUkVMT0NfVElDMzBfTERQKTsKLSAgICAgIE1BUCAoMiwgMCwgQkZEX1JFTE9DXzE2KTsKLSAgICAgIE1BUCAoMywgMCwgQkZEX1JFTE9DXzI0KTsKLSAgICAgIE1BUCAoMiwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIE1BUCAoNCwgMCwgQkZEX1JFTE9DXzMyKTsKLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkICgiQ2FuIG5vdCBkbyAlZCBieXRlICVzcmVsb2NhdGlvbiIsIGZpeFAtPmZ4X3NpemUsCi0JICAgICAgZml4UC0+ZnhfcGNyZWwgPyAicGMtcmVsYXRpdmUgIiA6ICIiKTsKLSAgICB9Ci0jdW5kZWYgTUFQCi0jdW5kZWYgRgotCi0gIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICBhc3NlcnQgKHJlbCAhPSAwKTsKLSAgcmVsLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhQLT5meF9hZGRzeSk7Ci0gIHJlbC0+YWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZTsKLSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotICAgIHJlbC0+YWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgcmVsLT5hZGRlbmQgPSAwOwotICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICBpZiAoIXJlbC0+aG93dG8pCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIG5hbWUgPSBTX0dFVF9OQU1FIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCW5hbWUgPSAiPHVua25vd24+IjsKLSAgICAgIGFzX2ZhdGFsICgiQ2Fubm90IGdlbmVyYXRlIHJlbG9jYXRpb24gdHlwZSBmb3Igc3ltYm9sICVzLCBjb2RlICVzIiwgbmFtZSwgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICB9Ci0gIHJldHVybiByZWw7Ci19Ci0KLXZvaWQKLXRjX2FvdXRfcHJlX3dyaXRlX2hvb2sgKCkKLXsKLSAgZGVidWcgKCJJbiB0Y19hb3V0X3ByZV93cml0ZV9ob29rKClcbiIpOwotfQotCi12b2lkCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBkZWJ1ZyAoIkluIG1kX29wZXJhbmQoKVxuIik7Ci19Ci0KLWNoYXIgb3V0cHV0X2ludmFsaWRfYnVmWzhdOwotCi1jaGFyICoKLW91dHB1dF9pbnZhbGlkIChjKQotICAgICBjaGFyIGM7Ci17Ci0gIGlmIChpc3ByaW50IChjKSkKLSAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICInJWMnIiwgYyk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICIoMHgleCkiLCAodW5zaWduZWQpIGMpOwotICByZXR1cm4gb3V0cHV0X2ludmFsaWRfYnVmOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10aWMzMC5oIGIvZ2FzL2NvbmZpZy90Yy10aWMzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTcyZDJlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdGljMzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIHRjLXRpYzMwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLXRpYzMwLmMKLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9UQ19USUMzMF9IXwotI2RlZmluZSBfVENfVElDMzBfSF8KLQotI2RlZmluZSBUQ19USUMzMCAxCi0KLSNpZmRlZiBPQkpfQU9VVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC10aWMzMCIKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9BUkNICQliZmRfYXJjaF90aWMzMAotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTgkxCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi1jaGFyICpvdXRwdXRfaW52YWxpZCBQQVJBTVMgKChpbnQgYykpOwotCi0jZGVmaW5lIEVORF9PRl9JTlNOICdcMCcKLSNkZWZpbmUgTUFYX09QRVJBTkRTIDYKLSNkZWZpbmUgRElSRUNUX1JFRkVSRU5DRSAnQCcKLSNkZWZpbmUgSU5ESVJFQ1RfUkVGRVJFTkNFICcqJwotI2RlZmluZSBQQVJBTExFTF9TRVBBUkFUT1IgJ3wnCi0jZGVmaW5lIElOU05fU0laRSA0Ci0KLS8qIERlZmluZSB0aGlzIHRvIDEgaWYgeW91IHdhbnQgdGhlIGRlYnVnIG91dHB1dCB0byBiZSBvbiBzdGRvdXQsCi0gICBvdGhlcndpc2Ugc3RkZXJyIHdpbGwgYmUgdXNlZC4gIElmIHN0ZGVyciBpcyB1c2VkLCB0aGVyZSB3aWxsIGJlIGEKLSAgIGJldHRlciBzeW5jaHJvbmlzYXRpb24gd2l0aCB0aGUgYXNfYmFkIG91dHB1dHMsIGJ1dCB5b3UgY2FuJ3QKLSAgIGNhcHR1cmUgdGhlIG91dHB1dC4gKi8KLSNkZWZpbmUgVVNFX1NURE9VVCAwCi0KLSNkZWZpbmUgdGNfdW5yZWNvZ25pemVkX2xpbmUgdGljMzBfdW5yZWNvZ25pemVkX2xpbmUKLQotZXh0ZXJuIGludCB0aWMzMF91bnJlY29nbml6ZWRfbGluZSBQQVJBTVMgKChpbnQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRpYzgwLmMgYi9nYXMvY29uZmlnL3RjLXRpYzgwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMWRiYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy10aWM4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MSArMCwwIEBACi0vKiB0Yy10aWM4MC5jIC0tIEFzc2VtYmxlIGZvciB0aGUgVEkgVE1TMzIwQzgwIChNVikKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3RpYzgwLmgiCi0KLSNkZWZpbmUgaW50ZXJuYWxfZXJyb3Iod2hhdCkgXAotICBhc19mYXRhbChfKCJpbnRlcm5hbCBlcnJvcjolczolZDogJXNcbiIpLF9fRklMRV9fLF9fTElORV9fLHdoYXQpCi0jZGVmaW5lIGludGVybmFsX2Vycm9yX2Eod2hhdCxhcmcpIFwKLSAgYXNfZmF0YWwoXygiaW50ZXJuYWwgZXJyb3I6JXM6JWQ6ICVzICVkXG4iKSxfX0ZJTEVfXyxfX0xJTkVfXyx3aGF0LGFyZykKLQotDAotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsIHRhcmdldHMuICovCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIjsqIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2VwYXJhdGUgbXVsdGlwbGUgY29tbWFuZHMgb24gYSBzaW5nbGUKLSAgIGxpbmUuIFRoZSBzZW1pY29sb24gaXMgc3VjaCBhIGNoYXJhY3RlciBieSBkZWZhdWx0IGFuZCBzaG91bGQgbm90IGJlCi0gICBleHBsaWNpdGx5IGxpc3RlZC4gKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcgCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsIAotICAgYXMgaW4gMGYxLjAuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmRiI7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0KLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIGludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uICovCi0KLWV4dGVybiB2b2lkIG9ial9jb2ZmX3NlY3Rpb24gKCk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgImFsaWduIiwJc19hbGlnbl9ieXRlcywJCTQgfSwJLyogRG8gYnl0ZSBhbGlnbm1lbnQsIGRlZmF1bHQgaXMgYSA0IGJ5dGUgYm91bmRhcnkgKi8KLSAgeyAid29yZCIsCWNvbnMsCQkJNCB9LAkvKiBGSVhNRTogU2hvdWxkIHRoaXMgYmUgbWFjaGluZSBpbmRlcGVuZGVudD8gKi8KLSAgeyAiYnNzIiwJc19sY29tbV9ieXRlcywJCTEgfSwKLSAgeyAic2VjdCIsCW9ial9jb2ZmX3NlY3Rpb24sCTB9LAkvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFRJIHRvb2xzICovCi0gIHsgInNlY3Rpb24iLAlvYmpfY29mZl9zZWN0aW9uLAkwfSwJLyogU3RhbmRhcmQgQ09GRiAuc2VjdGlvbiBwc2V1ZG8tb3AgKi8KLSAgeyBOVUxMLAlOVUxMLAkJCTAgfQotfTsKLQotLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRpYzgwX2hhc2g7Ci0KLXN0YXRpYyBzdHJ1Y3QgdGljODBfb3Bjb2RlICogZmluZF9vcGNvZGUgUEFSQU1TICgoc3RydWN0IHRpYzgwX29wY29kZSAqLCBleHByZXNzaW9uUyBbXSkpOwotc3RhdGljIHZvaWQgYnVpbGRfaW5zbiBQQVJBTVMgKChzdHJ1Y3QgdGljODBfb3Bjb2RlICosIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyBpbnQgZ2V0X29wZXJhbmRzIFBBUkFNUyAoKGV4cHJlc3Npb25TIGV4cFtdKSk7Ci1zdGF0aWMgaW50IGNvbnN0X292ZXJmbG93IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbnVtLCBpbnQgYml0cywgaW50IGZsYWdzKSk7Ci0KLS8qIFJlcGxhY2Ugc2hvcnQgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIHdpdGggbG9uZyBmb3JtIHdoZW4gbmVjZXNzYXJ5LiAgQ3VycmVudGx5Ci0gICB0aGlzIGlzIG9mZiBieSBkZWZhdWx0IG9yIHdoZW4gZ2l2ZW4gdGhlIC1uby1yZWxheCBvcHRpb24uICBUdXJuaW5nIGl0IG9uIGJ5IHVzaW5nCi0gICB0aGUgLXJlbGF4IG9wdGlvbiBmb3JjZXMgYWxsIFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucyB0byB1c2UgdGhlIGxvbmcgZm9ybSwgd2hpY2gKLSAgIGlzIHdoeSBpdCBpcyBjdXJyZW50bHkgbm90IHRoZSBkZWZhdWx0LiAqLwotc3RhdGljIGludCB0aWM4MF9yZWxheCA9IDA7Ci0KLQwKLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIGludGVybmFsX2Vycm9yIChfKCJSZWxheGF0aW9uIGlzIGEgbHV4dXJ5IHdlIGNhbid0IGFmZm9yZCIpKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDQKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotICAKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mICgpIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAgIH0KLSAgCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgCi0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gKE5VTEwpOwotfQotCi0vKiBDaGVjayB0byBzZWUgaWYgdGhlIGNvbnN0YW50IHZhbHVlIGluIE5VTSB3aWxsIGZpdCBpbiBhIGZpZWxkIG9mCi0gICB3aWR0aCBCSVRTIGlmIGl0IGhhcyBmbGFncyBGTEFHUy4gKi8KLQotc3RhdGljIGludAotY29uc3Rfb3ZlcmZsb3cgKG51bSwgYml0cywgZmxhZ3MpCi0gICAgIHVuc2lnbmVkIGxvbmcgbnVtOwotICAgICBpbnQgYml0czsKLSAgICAgaW50IGZsYWdzOwotewotICBsb25nIG1pbiwgbWF4OwotICBpbnQgcmV0dmFsID0gMDsKLQotICAvKiBPbmx5IG5lZWQgdG8gY2hlY2sgZmllbGRzIGxlc3MgdGhhbiAzMiBiaXRzIHdpZGUgKi8KLSAgaWYgKGJpdHMgPCAzMikKLSAgICBpZiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NJR05FRCkKLSAgICAgIHsKLQltYXggPSAoMSA8PCAoYml0cyAtIDEpKSAtIDE7IAotCW1pbiA9IC0gKDEgPDwgKGJpdHMgLSAxKSk7ICAKLQlyZXR2YWwgPSAoKGxvbmcpIG51bSA+IG1heCkgfHwgKChsb25nKSBudW0gPCBtaW4pOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQltYXggPSAoMSA8PCBiaXRzKSAtIDE7Ci0JbWluID0gMDsKLQlyZXR2YWwgPSAobnVtID4gbWF4KSB8fCAobnVtIDwgbWluKTsKLSAgICAgIH0KLSAgcmV0dXJuIChyZXR2YWwpOwotfQotCi0vKiBnZXRfb3BlcmFuZHMoKSBwYXJzZXMgYSBzdHJpbmcgb2Ygb3BlcmFuZHMgYW5kIGZpbGxzIGluIGEgcGFzc2VkIGFycmF5IG9mCi0gICBleHByZXNzaW9ucyBpbiBFWFAuCi0KLSAgIE5vdGUgdGhhdCB3ZSB1c2UgT19hYnNlbnQgZXhwcmVzc2lvbnMgdG8gcmVjb3JkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgIGFib3V0IHRoZSBwcmV2aW91cyBub24tT19hYnNlbnQgZXhwcmVzc2lvbiwgc3VjaCBhcyAiOm0iIG9yICI6cyIKLSAgIG1vZGlmaWVycyBvciByZWdpc3RlciBudW1iZXJzIGVuY2xvc2VkIGluIHBhcmVucyBsaWtlICIocjEwKSIuCi0KLSAgIFJldHVybnMgdGhlIG51bWJlciBvZiBleHByZXNzaW9ucyB0aGF0IHdlcmUgcGxhY2VkIGluIEVYUC4KLQotICAgKi8KLQotc3RhdGljIGludAotZ2V0X29wZXJhbmRzIChleHApIAotICAgICBleHByZXNzaW9uUyBleHBbXTsKLXsKLSAgY2hhciAqcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW50IG51bWV4cCA9IDA7Ci0gIGludCBtZmxhZyA9IDA7Ci0gIGludCBzZmxhZyA9IDA7Ci0gIGludCBwYXJlbnMgPSAwOwotCi0gIHdoaWxlICgqcCkgIAotICAgIHsKLSAgICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gICAgICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJywnKSAKLQl7Ci0JICBwKys7Ci0JfQotCi0gICAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgb3BlcmFuZHMgbGVmdCB0byBwYXJzZSAqLwotICAgICAgaWYgKCpwID09IDAgfHwgKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInKSAKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgICAKLSAgICAgIC8qIE5vdGljZSBzY2FsaW5nIG9yIGRpcmVjdCBtZW1vcnkgb3BlcmFuZCBtb2RpZmllcnMgYW5kIHNhdmUgdGhlbSBpbgotCSBhbiBPX2Fic2VudCBleHByZXNzaW9uIGFmdGVyIHRoZSBleHByZXNzaW9uIHRoYXQgdGhleSBtb2RpZnkuICovCi0KLSAgICAgIGlmICgqcCA9PSAnOicpIAotCXsKLQkgIHArKzsKLQkgIGV4cFtudW1leHBdLlhfb3AgPSBPX2Fic2VudDsKLQkgIGlmICgqcCA9PSAnbScpIAotCSAgICB7Ci0JICAgICAgcCsrOwotCSAgICAgIC8qIFRoaXMgaXMgYSAiOm0iIG1vZGlmaWVyICovCi0JICAgICAgZXhwW251bWV4cF0uWF9hZGRfbnVtYmVyID0gVElDODBfT1BFUkFORF9NX1NJIHwgVElDODBfT1BFUkFORF9NX0xJOwotCSAgICB9Ci0JICBlbHNlIGlmICgqcCA9PSAncycpCi0JICAgIHsKLQkgICAgICBwKys7Ci0JICAgICAgLyogVGhpcyBpcyBhICI6cyIgbW9kaWZpZXIgKi8KLQkgICAgICBleHBbbnVtZXhwXS5YX2FkZF9udW1iZXIgPSBUSUM4MF9PUEVSQU5EX1NDQUxFRDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCInOicgbm90IGZvbGxvd2VkIGJ5ICdtJyBvciAncyciKSk7Ci0JICAgIH0KLQkgIG51bWV4cCsrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBIYW5kbGUgbGVhZGluZyAnKCcgb24gb3BlcmFuZHMgdGhhdCB1c2UgdGhlbSwgYnkgcmVjb3JkaW5nIHRoYXQgd2UKLQkgaGF2ZSBlbnRlcmVkIGEgcGFyZW4gbmVzdGluZyBsZXZlbCBhbmQgdGhlbiBjb250aW51aW5nLiAgV2UgY29tcGxhaW4KLQkgYWJvdXQgbXVsdGlwbGUgbmVzdGluZy4gKi8KLQotICAgICAgaWYgKCpwID09ICcoJykKLQl7Ci0JICBpZiAoKytwYXJlbnMgIT0gMSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygicGFyZW4gbmVzdGluZyIpKTsKLQkgICAgfQotCSAgcCsrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBIYW5kbGUgdHJhaWxpbmcgJyknIG9uIG9wZXJhbmRzIHRoYXQgdXNlIHRoZW0sIGJ5IHJlZHVjaW5nIHRoZQotCSBuZXN0aW5nIGxldmVsIGFuZCB0aGVuIGNvbnRpbnVpbmcuICBXZSBjb21wbGFpbiBpZiB0aGVyZSB3ZXJlIHRvbwotCSBtYW55IGNsb3N1cmVzLiAqLwotCi0gICAgICBpZiAoKnAgPT0gJyknKSAKLQl7Ci0JICAvKiBSZWNvcmQgdGhhdCB3ZSBoYXZlIGxlZnQgYSBwYXJlbiBncm91cCBhbmQgY29udGludWUgKi8KLQkgIGlmICgtLXBhcmVucyA8IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIm1pc21hdGNoZWQgcGFyZW50aGVzaXMiKSk7Ci0JICAgIH0KLQkgIHArKzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQmVnaW4gb3BlcmFuZCBwYXJzaW5nIGF0IHRoZSBjdXJyZW50IHNjYW4gcG9pbnQuICovCi0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgICBleHByZXNzaW9uICgmZXhwW251bWV4cF0pOwotCi0gICAgICBpZiAoZXhwW251bWV4cF0uWF9vcCA9PSBPX2lsbGVnYWwpCi0JewotCSAgYXNfYmFkIChfKCJpbGxlZ2FsIG9wZXJhbmQiKSk7Ci0JfQotICAgICAgZWxzZSBpZiAoZXhwW251bWV4cF0uWF9vcCA9PSBPX2Fic2VudCkKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLQl9Ci0KLSAgICAgIG51bWV4cCsrOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgaWYgKHBhcmVucykKLSAgICB7Ci0gICAgICBleHBbbnVtZXhwXS5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBleHBbbnVtZXhwKytdLlhfYWRkX251bWJlciA9IFRJQzgwX09QRVJBTkRfUEFSRU5TOwotICAgIH0KLQotICAvKiBNYXJrIHRoZSBlbmQgb2YgdGhlIHZhbGlkIG9wZXJhbmRzIHdpdGggYW4gaWxsZWdhbCBleHByZXNzaW9uLiAqLwotICBleHBbbnVtZXhwXS5YX29wID0gT19pbGxlZ2FsOwotCi0gIHJldHVybiAobnVtZXhwKTsKLX0KLQotLyogZmluZF9vcGNvZGUoKSBnZXRzIGEgcG9pbnRlciB0byB0aGUgZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZSB0aGF0Ci0gICBtYXRjaGVzIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBhc3NlbWJsZWQsIG9yIHJldHVybnMgTlVMTCBpZiBubyBzdWNoIG1hdGNoCi0gICBpcyBmb3VuZC4KLQotICAgRmlyc3QgaXQgcGFyc2VzIGFsbCB0aGUgb3BlcmFuZHMgYW5kIHNhdmUgdGhlbSBhcyBleHByZXNzaW9ucy4gIE5vdGUgdGhhdAotICAgd2UgdXNlIE9fYWJzZW50IGV4cHJlc3Npb25zIHRvIHJlY29yZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZQotICAgcHJldmlvdXMgbm9uLU9fYWJzZW50IGV4cHJlc3Npb24sIHN1Y2ggYXMgIjptIiBvciAiOnMiIG1vZGlmaWVycyBvcgotICAgcmVnaXN0ZXIgbnVtYmVycyBlbmNsb3NlZCBpbiBwYXJlbnMgbGlrZSAiKHIxMCkiLgotCi0gICBJdCB0aGVuIGxvb2tzIGF0IGFsbCBvcGNvZGVzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgdXNlcyB0aGUgb3BlcmFuZHMgdG8KLSAgIGNob29zZSB0aGUgY29ycmVjdCBvcGNvZGUuICAqLwotCi1zdGF0aWMgc3RydWN0IHRpYzgwX29wY29kZSAqCi1maW5kX29wY29kZSAob3Bjb2RlLCBteW9wcykKLSAgICAgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyBteW9wc1tdOwotewotICBpbnQgbnVtZXhwOwkJCQkvKiBOdW1iZXIgb2YgZXhwcmVzc2lvbnMgZnJvbSBwYXJzaW5nIG9wZXJhbmRzICovCi0gIGludCBleHBpOwkJCQkvKiBJbmRleCBvZiBjdXJyZW50IGV4cHJlc3Npb24gdG8gbWF0Y2ggKi8KLSAgaW50IG9waTsJCQkJLyogSW5kZXggb2YgY3VycmVudCBvcGVyYW5kIHRvIG1hdGNoICovCi0gIGludCBtYXRjaCA9IDA7CQkJLyogU2V0IHRvIDEgd2hlbiBhbiBvcGVyYW5kIG1hdGNoIGlzIGZvdW5kICovCi0gIHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wYyA9IG9wY29kZTsJLyogUG9pbnRlciB0byBjdXJyZW50IG9wY29kZSB0YWJsZSBlbnRyeSAqLwotICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICplbmQ7CS8qIFBvaW50ZXIgdG8gZW5kIG9mIG9wY29kZSB0YWJsZSAqLwotCi0gIC8qIEZpcnN0IHBhcnNlIGFsbCB0aGUgb3BlcmFuZHMgc28gd2Ugb25seSBoYXZlIHRvIGRvIGl0IG9uY2UuICBUaGVyZSBtYXkKLSAgICAgYmUgbW9yZSBleHByZXNzaW9ucyBnZW5lcmF0ZWQgdGhhbiB0aGVyZSBhcmUgb3BlcmFuZHMuICovCi0KLSAgbnVtZXhwID0gZ2V0X29wZXJhbmRzIChteW9wcyk7Ci0KLSAgLyogRm9yIGVhY2ggb3Bjb2RlIHdpdGggdGhlIHNhbWUgbmFtZSwgdHJ5IHRvIG1hdGNoIGl0IGFnYWluc3QgdGhlIHBhcnNlZAotICAgICBvcGVyYW5kcy4gKi8KLQotICBlbmQgPSB0aWM4MF9vcGNvZGVzICsgdGljODBfbnVtX29wY29kZXM7Ci0gIHdoaWxlICghbWF0Y2ggJiYgKG9wYyA8IGVuZCkgJiYgKHN0cmNtcCAob3BjIC0+IG5hbWUsIG9wY29kZSAtPiBuYW1lKSA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBTdGFydCBvZmYgYXNzdW1pbmcgYSBtYXRjaC4gIElmIHdlIGZpbmQgYSBtaXNtYXRjaCwgdGhlbiB0aGlzIGlzCi0JIHJlc2V0IGFuZCB0aGUgb3BlcmFuZC9leHByIG1hdGNoaW5nIGxvb3AgdGVybWluYXRlcyB3aXRoIG1hdGNoCi0JIGVxdWFsIHRvIHplcm8sIHdoaWNoIGFsbG93cyB1cyB0byB0cnkgdGhlIG5leHQgb3Bjb2RlLiAqLwotCi0gICAgICBtYXRjaCA9IDE7Ci0KLSAgICAgIC8qIEZvciBlYWNoIGV4cHJlc3Npb24sIHRyeSB0byBtYXRjaCBpdCBhZ2FpbnN0IHRoZSBjdXJyZW50IG9wZXJhbmQKLQkgZm9yIHRoZSBjdXJyZW50IG9wY29kZS4gIFVwb24gYW55IG1pc21hdGNoLCB3ZSBhYmFuZG9uIGZ1cnRoZXIKLQkgbWF0Y2hpbmcgZm9yIHRoZSBjdXJyZW50IG9wY29kZSB0YWJsZSBlbnRyeS4gICovCi0KLSAgICAgIGZvciAoZXhwaSA9IDAsIG9waSA9IC0xOyAoZXhwaSA8IG51bWV4cCkgJiYgbWF0Y2g7IGV4cGkrKykKLQl7Ci0JICBpbnQgYml0cywgZmxhZ3MsIFhfb3AsIG51bTsKLQotCSAgWF9vcCA9IG15b3BzW2V4cGldLlhfb3A7Ci0JICBudW0gPSBteW9wc1tleHBpXS5YX2FkZF9udW1iZXI7Ci0KLQkgIC8qIFRoZSBPX2Fic2VudCBleHByZXNzaW9ucyBhcHBseSB0byB0aGUgc2FtZSBvcGVyYW5kIGFzIHRoZSBtb3N0Ci0JICAgICByZWNlbnQgbm9uIE9fYWJzZW50IGV4cHJlc3Npb24uICBTbyBvbmx5IGluY3JlbWVudCB0aGUgb3BlcmFuZAotCSAgICAgaW5kZXggd2hlbiB0aGUgY3VycmVudCBleHByZXNzaW9uIGlzIG5vdCBvbmUgb2YgdGhlc2Ugc3BlY2lhbAotCSAgICAgZXhwcmVzc2lvbnMuICovCi0KLQkgIGlmIChYX29wICE9IE9fYWJzZW50KQotCSAgICB7Ci0JICAgICAgb3BpKys7Ci0JICAgIH0KLQotCSAgZmxhZ3MgPSB0aWM4MF9vcGVyYW5kc1tvcGMgLT4gb3BlcmFuZHNbb3BpXV0uZmxhZ3M7Ci0JICBiaXRzID0gdGljODBfb3BlcmFuZHNbb3BjIC0+IG9wZXJhbmRzW29waV1dLmJpdHM7Ci0KLQkgIHN3aXRjaCAoWF9vcCkKLQkgICAgewotCSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0JICAgICAgLyogQWxzbyBjaGVjayB0aGF0IHJlZ2lzdGVycyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBldmVuIGFjdHVhbGx5Ci0JCSBhcmUgZXZlbi4gKi8KLQkgICAgICBpZiAoKChmbGFncyAmIFRJQzgwX09QRVJBTkRfR1BSKSAhPSAobnVtICYgVElDODBfT1BFUkFORF9HUFIpKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0ZQQSkgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfRlBBKSkgfHwKLQkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9DUikgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfQ1IpKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0VWRU4pICYmIChudW0gJiAxKSkgfHwKLQkJICBjb25zdF9vdmVyZmxvdyAobnVtICYgflRJQzgwX09QRVJBTkRfTUFTSywgYml0cywgZmxhZ3MpKQotCQl7Ci0JCSAgbWF0Y2ggPSAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19jb25zdGFudDoKLQkgICAgICBpZiAoKGZsYWdzICYgVElDODBfT1BFUkFORF9FTkRNQVNLKSAmJiAobnVtID09IDMyKSkKLQkJewotCQkgIC8qIEVuZG1hc2sgdmFsdWVzIG9mIDAgYW5kIDMyIGdpdmUgaWRlbnRpY2FsIHJlc3VsdHMgKi8KLQkJICBudW0gPSAwOwotCQl9Ci0JICAgICAgaWYgKChmbGFncyAmIChUSUM4MF9PUEVSQU5EX0ZQQSB8IFRJQzgwX09QRVJBTkRfR1BSKSkgfHwKLQkJICBjb25zdF9vdmVyZmxvdyAobnVtLCBiaXRzLCBmbGFncykpCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX3N5bWJvbDoKLQkgICAgICBpZiAoKGJpdHMgPCAzMikgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9QQ1JFTCkgJiYgIXRpYzgwX3JlbGF4KQotCQl7Ci0JCSAgLyogVGhlIGRlZmF1bHQgaXMgdG8gcHJlZmVyIHRoZSBzaG9ydCBmb3JtIG9mIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCQkgICAgIFRoaXMgaXMgdGhlIG9ubHkgZm9ybSB0aGF0IHRoZSBUSSBhc3NlbWJsZXIgc3VwcG9ydHMuCi0JCSAgICAgSWYgdGhlIC1yZWxheCBvcHRpb24gaXMgZ2l2ZW4sIHdlIG5ldmVyIHVzZSB0aGUgc2hvcnQgZm9ybXMuCi0JCSAgICAgRklYTUU6IFNob3VsZCBiZSBhYmxlIHRvIGNob29zZSAiYmVzdC1maXQiLiAqLwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKGJpdHMgPT0gMzIpIC8qICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfQkFTRVJFTCkgKi8pCi0JCXsKLQkJICAvKiBUaGUgZGVmYXVsdCBpcyB0byBwcmVmZXIgdGhlIGxvbmcgZm9ybSBvZiBiYXNlIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCQkgICAgIFRoaXMgaXMgdGhlIG9ubHkgZm9ybSB0aGF0IHRoZSBUSSBhc3NlbWJsZXIgc3VwcG9ydHMuCi0JCSAgICAgSWYgdGhlIC1uby1yZWxheCBvcHRpb24gaXMgZ2l2ZW4sIHdlIGFsd2F5cyB1c2UgdGhlIGxvbmcgZm9ybSBvZgotCQkgICAgIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCQkgICAgIEZJWE1FOiBTaG91bGQgYmUgYWJsZSB0byBjaG9vc2UgImJlc3QtZml0Ii4gKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFN5bWJvbHMgdGhhdCBkb24ndCBtYXRjaCBvbmUgb2YgdGhlIGFib3ZlIGNhc2VzIGFyZQotCQkgICAgIHJlamVjdGVkIGFzIGFuIG9wZXJhbmQuICovCi0JCSAgbWF0Y2ggPSAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19hYnNlbnQ6Ci0JICAgICAgLyogSWYgdGhpcyBpcyBhbiBPX2Fic2VudCBleHByZXNzaW9uLCB0aGVuIGl0IG1heSBiZSBhbiBleHByZXNzaW9uIHRoYXQKLQkJIHN1cHBsaWVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wZXJhbmQsIHN1Y2ggYXMgIjptIiBvcgotCQkgIjpzIiBtb2RpZmllcnMuIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBvcGVyYW5kIG1hdGNoZXMgdGhpcyByZXF1aXJlbWVudC4gKi8KLQkgICAgICBpZiAoISgobnVtICYgVElDODBfT1BFUkFORF9NX1NJKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01fU0kpIHx8Ci0JCSAgICAobnVtICYgVElDODBfT1BFUkFORF9NX0xJKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01fTEkpIHx8Ci0JCSAgICAobnVtICYgVElDODBfT1BFUkFORF9TQ0FMRUQpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfU0NBTEVEKSkpCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2JpZzoKLQkgICAgICBpZiAoKG51bSA+IDApIHx8ICEoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0ZMT0FUKSkKLQkJewotCQkgIG1hdGNoID0gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9faWxsZWdhbDoKLQkgICAgY2FzZSBPX3N5bWJvbF9ydmE6Ci0JICAgIGNhc2UgT191bWludXM6Ci0JICAgIGNhc2UgT19iaXRfbm90OgotCSAgICBjYXNlIE9fbG9naWNhbF9ub3Q6Ci0JICAgIGNhc2UgT19tdWx0aXBseToKLQkgICAgY2FzZSBPX2RpdmlkZToKLQkgICAgY2FzZSBPX21vZHVsdXM6Ci0JICAgIGNhc2UgT19sZWZ0X3NoaWZ0OgotCSAgICBjYXNlIE9fcmlnaHRfc2hpZnQ6Ci0JICAgIGNhc2UgT19iaXRfaW5jbHVzaXZlX29yOgotCSAgICBjYXNlIE9fYml0X29yX25vdDoKLQkgICAgY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6Ci0JICAgIGNhc2UgT19iaXRfYW5kOgotCSAgICBjYXNlIE9fYWRkOgotCSAgICBjYXNlIE9fc3VidHJhY3Q6Ci0JICAgIGNhc2UgT19lcToKLQkgICAgY2FzZSBPX25lOgotCSAgICBjYXNlIE9fbHQ6Ci0JICAgIGNhc2UgT19sZToKLQkgICAgY2FzZSBPX2dlOgotCSAgICBjYXNlIE9fZ3Q6Ci0JICAgIGNhc2UgT19sb2dpY2FsX2FuZDoKLQkgICAgY2FzZSBPX2xvZ2ljYWxfb3I6Ci0JICAgIGNhc2UgT19tYXg6Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaW50ZXJuYWxfZXJyb3JfYSAoXygidW5oYW5kbGVkIGV4cHJlc3Npb24gdHlwZSIpLCBYX29wKTsKLQkgICAgfQotCX0KLSAgICAgIGlmICghbWF0Y2gpCi0JewotCSAgb3BjKys7Ci0JfQotICAgIH0gIAotCi0gIHJldHVybiAobWF0Y2ggPyBvcGMgOiBOVUxMKTsKLQotI2lmIDAKLQotICAvKiBOb3cgc2VhcmNoIHRoZSBvcGNvZGUgdGFibGUgdGFibGUgZm9yIG9uZSB3aXRoIG9wZXJhbmRzIHRoYXQKLSAgICAgbWF0Y2hlcyB3aGF0IHdlJ3ZlIGdvdC4gKi8KLQotICB3aGlsZSAoIW1hdGNoKQotICAgIHsKLSAgICAgIG1hdGNoID0gMTsKLSAgICAgIGZvciAoaSA9IDA7IG9wY29kZSAtPiBvcGVyYW5kc1tpXTsgaSsrKSAKLQl7Ci0JICBpbnQgZmxhZ3MgPSB0aWM4MF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQkgIGludCBYX29wID0gbXlvcHNbaV0uWF9vcDsKLQkgIGludCBudW0gPSBteW9wc1tpXS5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmIChYX29wID09IDApIAotCSAgICB7Ci0JICAgICAgbWF0Y2ggPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAgICAgCi0JICBpZiAoZmxhZ3MgJiAoVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX0ZQQSB8IFRJQzgwX09QRVJBTkRfQ1IpKSAKLQkgICAgewotCSAgICAgIGlmICgoWF9vcCAhPSBPX3JlZ2lzdGVyKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0dQUikgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfR1BSKSkgfHwKLQkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9GUEEpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0ZQQSkpIHx8Ci0JCSAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQ1IpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0NSKSkpCi0JCXsKLQkJICBtYXRjaD0wOwotCQkgIGJyZWFrOwotCQl9CSAgCi0JICAgIH0KLQkgICAgICAKLQkgIGlmICgoKGZsYWdzICYgVElDODBfT1BFUkFORF9NSU5VUykgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IFRJQzgwX09QRVJBTkRfTUlOVVMpKSkgfHwKLQkgICAgICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9QTFVTKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gVElDODBfT1BFUkFORF9QTFVTKSkpIHx8Ci0JICAgICAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQVRNSU5VUykgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IFRJQzgwX09QRVJBTkRfQVRNSU5VUykpKSB8fAotCSAgICAgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0FUUEFSKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gVElDODBfT1BFUkFORF9BVFBBUikpKSB8fAotCSAgICAgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0FUU0lHTikgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IFRJQzgwX09QRVJBTkRfQVRTSUdOKSkpKSAKLQkgICAgewotCSAgICAgIG1hdGNoPTA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0JICAgICAgCi0JfQotICAgICAgLyogd2UncmUgb25seSBkb25lIGlmIHRoZSBvcGVyYW5kcyBtYXRjaGVkIHNvIGZhciBBTkQgdGhlcmUKLQkgYXJlIG5vIG1vcmUgdG8gY2hlY2sgKi8KLSAgICAgIGlmIChtYXRjaCAmJiBteW9wc1tpXS5YX29wPT0wKSAKLQlicmVhazsKLSAgICAgIGVsc2UKLQltYXRjaCA9IDA7Ci0KLSAgICAgIG5leHRfb3Bjb2RlID0gb3Bjb2RlKzE7Ci0gICAgICBpZiAobmV4dF9vcGNvZGUtPm9wY29kZSA9PSAwKSAKLQlicmVhazsKLSAgICAgIGlmIChzdHJjbXAobmV4dF9vcGNvZGUtPm5hbWUsIG9wY29kZS0+bmFtZSkpCi0JYnJlYWs7Ci0gICAgICBvcGNvZGUgPSBuZXh0X29wY29kZTsKLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkgIAotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIG9wY29kZSBvciBvcGVyYW5kcyIpKTsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRoYXQgYWxsIHJlZ2lzdGVycyB0aGF0IGFyZSByZXF1aXJlZCB0byBiZSBldmVuIGFyZS4gKi8KLSAgLyogQWxzbywgaWYgYW55IG9wZXJhbmRzIHdlcmUgbWFya2VkIGFzIHJlZ2lzdGVycywgYnV0IHdlcmUgcmVhbGx5IHN5bWJvbHMgKi8KLSAgLyogZml4IHRoYXQgaGVyZS4gKi8KLSAgZm9yIChpPTA7IG9wY29kZS0+b3BlcmFuZHNbaV07IGkrKykgCi0gICAgewotICAgICAgaWYgKCh0aWM4MF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFncyAmIFRJQzgwX09QRVJBTkRfRVZFTikgJiYKLQkgIChteW9wc1tpXS5YX2FkZF9udW1iZXIgJiAxKSkgCi0JYXNfZmF0YWwgKF8oIlJlZ2lzdGVyIG51bWJlciBtdXN0IGJlIEVWRU4iKSk7Ci0gICAgICBpZiAobXlvcHNbaV0uWF9vcCA9PSBPX3JlZ2lzdGVyKQotCXsKLQkgIGlmICghKHRpYzgwX29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzICYgVElDODBfT1BFUkFORF9SRUcpKSAKLQkgICAgewotCSAgICAgIG15b3BzW2ldLlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBteW9wc1tpXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKW15b3BzW2ldLlhfb3Bfc3ltYm9sKTsKLQkgICAgICBteW9wc1tpXS5YX2FkZF9udW1iZXIgPSAwOwotCSAgICAgIG15b3BzW2ldLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNlbmRpZgotfQotCi0vKiBidWlsZF9pbnNuIHRha2VzIGEgcG9pbnRlciB0byB0aGUgb3Bjb2RlIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUKLSAgIGFuZCB0aGUgYXJyYXkgb2Ygb3BlcmFuZCBleHByZXNzaW9ucyBhbmQgd3JpdGVzIG91dCB0aGUgaW5zdHJ1Y3Rpb24uCi0KLSAgIE5vdGUgdGhhdCB0aGUgb3Bjb2RlIHdvcmQgYW5kIGV4dGVuZGVkIHdvcmQgbWF5IGJlIHdyaXR0ZW4gdG8gZGlmZmVyZW50Ci0gICBmcmFncywgd2l0aCB0aGUgb3Bjb2RlIGF0IHRoZSBlbmQgb2Ygb25lIGZyYWcgYW5kIHRoZSBleHRlbnNpb24gYXQgdGhlCi0gICBiZWdpbm5pbmcgb2YgdGhlIG5leHQuICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzKSAKLSAgICAgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyAqb3BlcnM7Ci17Ci0gIGludCBleHBpOwkJCQkvKiBJbmRleCBvZiBjdXJyZW50IGV4cHJlc3Npb24gdG8gbWF0Y2ggKi8KLSAgaW50IG9waTsJCQkJLyogSW5kZXggb2YgY3VycmVudCBvcGVyYW5kIHRvIG1hdGNoICovCi0gIHVuc2lnbmVkIGxvbmcgaW5zblsyXTsJCS8qIEluc3RydWN0aW9uIGFuZCBsb25nIGltbWVkaWF0ZSAoaWYgYW55KSAqLwotICBjaGFyICpmOwkJCQkvKiBQb2ludGVyIHRvIGZyYWcgbG9jYXRpb24gZm9yIGluc25bMF0gKi8KLSAgZnJhZ1MgKmZmcmFnOwkJCQkvKiBGcmFnIGNvbnRhaW5pbmcgbG9jYXRpb24gZiAqLwotICBjaGFyICpmeCA9IE5VTEw7CQkJLyogUG9pbnRlciB0byBmcmFnIGxvY2F0aW9uIGZvciBpbnNuWzFdICovCi0gIGZyYWdTICpmeGZyYWc7CQkJLyogRnJhZyBjb250YWluaW5nIGxvY2F0aW9uIGZ4ICovCi0KLSAgLyogU3RhcnQgd2l0aCB0aGUgcmF3IG9wY29kZSBiaXRzIGZyb20gdGhlIG9wY29kZSB0YWJsZS4gKi8KLSAgaW5zblswXSA9IG9wY29kZSAtPiBvcGNvZGU7Ci0KLSAgLyogV2UgYXJlIGdvaW5nIHRvIGluc2VydCBhdCBsZWFzdCBvbmUgMzIgYml0IG9wY29kZSBzbyBnZXQgdGhlCi0gICAgIGZyYWcgbm93LiAqLwotCi0gIGYgPSBmcmFnX21vcmUgKDQpOwotICBmZnJhZyA9IGZyYWdfbm93OwotCi0gIC8qIEZvciBlYWNoIG9wZXJhbmQgZXhwcmVzc2lvbiwgaW5zZXJ0IHRoZSBhcHByb3ByaWF0ZSBiaXRzIGludG8gdGhlCi0gICAgIGluc3RydWN0aW9uIC4gKi8KLSAgZm9yIChleHBpID0gMCwgb3BpID0gLTE7IG9wZXJzW2V4cGldLlhfb3AgIT0gT19pbGxlZ2FsOyBleHBpKyspCi0gICAgewotICAgICAgaW50IGJpdHMsIHNoaWZ0LCBmbGFncywgWF9vcCwgbnVtOwotCi0gICAgICBYX29wID0gb3BlcnNbZXhwaV0uWF9vcDsKLSAgICAgIG51bSA9IG9wZXJzW2V4cGldLlhfYWRkX251bWJlcjsKLQotICAgICAgLyogVGhlIE9fYWJzZW50IGV4cHJlc3Npb25zIGFwcGx5IHRvIHRoZSBzYW1lIG9wZXJhbmQgYXMgdGhlIG1vc3QKLQkgcmVjZW50IG5vbiBPX2Fic2VudCBleHByZXNzaW9uLiAgU28gb25seSBpbmNyZW1lbnQgdGhlIG9wZXJhbmQKLQkgaW5kZXggd2hlbiB0aGUgY3VycmVudCBleHByZXNzaW9uIGlzIG5vdCBvbmUgb2YgdGhlc2Ugc3BlY2lhbAotCSBleHByZXNzaW9ucy4gKi8KLQotICAgICAgaWYgKFhfb3AgIT0gT19hYnNlbnQpCi0JewotCSAgb3BpKys7Ci0JfQotCi0gICAgICBmbGFncyA9IHRpYzgwX29wZXJhbmRzW29wY29kZSAtPiBvcGVyYW5kc1tvcGldXS5mbGFnczsKLSAgICAgIGJpdHMgPSB0aWM4MF9vcGVyYW5kc1tvcGNvZGUgLT4gb3BlcmFuZHNbb3BpXV0uYml0czsKLSAgICAgIHNoaWZ0ID0gdGljODBfb3BlcmFuZHNbb3Bjb2RlIC0+IG9wZXJhbmRzW29waV1dLnNoaWZ0OwotCi0gICAgICBzd2l0Y2ggKFhfb3ApCi0JewotCWNhc2UgT19yZWdpc3RlcjoKLQkgIG51bSAmPSB+VElDODBfT1BFUkFORF9NQVNLOwotCSAgaW5zblswXSA9IGluc25bMF0gfCAobnVtIDw8IHNoaWZ0KTsKLQkgIGJyZWFrOwotCWNhc2UgT19jb25zdGFudDoKLQkgIGlmICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0VORE1BU0spICYmIChudW0gPT0gMzIpKQotCSAgICB7Ci0JICAgICAgLyogRW5kbWFzayB2YWx1ZXMgb2YgMCBhbmQgMzIgZ2l2ZSBpZGVudGljYWwgcmVzdWx0cyAqLwotCSAgICAgIG51bSA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQklUTlVNKSkKLQkgICAgewotCSAgICAgIC8qIEJJVE5VTSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiBvbmUncyBjb21wbGVtZW50IGZvcm0gKi8KLQkgICAgICBudW0gPSAofm51bSAmIDB4MUYpOwotCSAgICB9Ci0JICAvKiBNYXNrIG9mZiB1cHBlciBiaXRzLCBqdXN0IGl0IGNhc2UgaXQgaXMgc2lnbmVkIGFuZCBpcyBuZWdhdGl2ZSAqLwotCSAgaWYgKGJpdHMgPCAzMikKLQkgICAgewotCSAgICAgIG51bSAmPSAoMSA8PCBiaXRzKSAtIDE7Ci0JICAgICAgaW5zblswXSA9IGluc25bMF0gfCAobnVtIDw8IHNoaWZ0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnggPSBmcmFnX21vcmUgKDQpOwotCSAgICAgIGZ4ZnJhZyA9IGZyYWdfbm93OwotCSAgICAgIGluc25bMV0gPSBudW07Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT19zeW1ib2w6Ci0JICBpZiAoYml0cyA9PSAzMikKLQkgICAgewotCSAgICAgIGZ4ID0gZnJhZ19tb3JlICg0KTsKLQkgICAgICBmeGZyYWcgPSBmcmFnX25vdzsKLQkgICAgICBpbnNuWzFdID0gMDsKLQkgICAgICBpZiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BDUkVMKQotCQl7Ci0JCSAgZml4X25ld19leHAgKGZ4ZnJhZywKLQkJCSAgICAgICBmeCAtIChmeGZyYWcgLT4gZnJfbGl0ZXJhbCksCi0JCQkgICAgICAgNCwKLQkJCSAgICAgICAmb3BlcnNbZXhwaV0sIAotCQkJICAgICAgIDEsCi0JCQkgICAgICAgUl9NUFBDUik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmaXhfbmV3X2V4cCAoZnhmcmFnLAotCQkJICAgICAgIGZ4IC0gKGZ4ZnJhZyAtPiBmcl9saXRlcmFsKSwKLQkJCSAgICAgICA0LAotCQkJICAgICAgICZvcGVyc1tleHBpXSwgCi0JCQkgICAgICAgMCwKLQkJCSAgICAgICBSX1JFTExPTkdYKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfUENSRUwpCi0JICAgIHsKLQkgICAgICBmaXhfbmV3X2V4cCAoZmZyYWcsCi0JCQkgICBmIC0gKGZmcmFnIC0+IGZyX2xpdGVyYWwpLAotCQkJICAgNCwJCQkvKiBGSVhNRSEgaG93IGlzIHRoaXMgdXNlZD8gKi8KLQkJCSAgICZvcGVyc1tleHBpXSwKLQkJCSAgIDEsCi0JCQkgICBSX01QUENSMTVXKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50ZXJuYWxfZXJyb3IgKF8oInN5bWJvbCByZWxvYyB0aGF0IGlzIG5vdCBQQyByZWxhdGl2ZSBvciAzMiBiaXRzIikpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIE9fYWJzZW50OgotCSAgLyogRWFjaCBPX2Fic2VudCBleHByZXNzaW9uIGNhbiBpbmRpY2F0ZSBleGFjdGx5IG9uZSBwb3NzaWJsZSBtb2RpZmllci4gKi8KLQkgIGlmICgobnVtICYgVElDODBfT1BFUkFORF9NX1NJKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01fU0kpKQotCSAgICB7Ci0JICAgICAgaW5zblswXSA9IGluc25bMF0gfCAoMSA8PCAxNyk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChudW0gJiBUSUM4MF9PUEVSQU5EX01fTEkpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9MSSkpCi0JICAgIHsKLQkgICAgICBpbnNuWzBdID0gaW5zblswXSB8ICgxIDw8IDE1KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKG51bSAmIFRJQzgwX09QRVJBTkRfU0NBTEVEKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NDQUxFRCkpCi0JICAgIHsKLQkgICAgICBpbnNuWzBdID0gaW5zblswXSB8ICgxIDw8IDExKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKG51bSAmIFRJQzgwX09QRVJBTkRfUEFSRU5TKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BBUkVOUykpCi0JICAgIHsKLQkgICAgICAvKiBObyBjb2RlIHRvIGdlbmVyYXRlLCBqdXN0IGFjY2VwdCBhbmQgZGlzY2FyZCB0aGlzIGV4cHJlc3Npb24gKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50ZXJuYWxfZXJyb3JfYSAoXygidW5oYW5kbGVkIG9wZXJhbmQgbW9kaWZpZXIiKSwgb3BlcnNbZXhwaV0uWF9hZGRfbnVtYmVyKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPX2JpZzoKLQkgIGZ4ID0gZnJhZ19tb3JlICg0KTsKLQkgIGZ4ZnJhZyA9IGZyYWdfbm93OwotCSAgewotCSAgICBpbnQgcHJlY2lzaW9uID0gMjsKLQkgICAgbG9uZyBleHBvbmVudF9iaXRzID0gOEw7Ci0JICAgIExJVFRMRU5VTV9UWVBFIHdvcmRzWzJdOwotCSAgICAvKiBWYWx1ZSBpcyBzdGlsbCBpbiBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciAqLwotCSAgICBnZW5fdG9fd29yZHMgKHdvcmRzLCBwcmVjaXNpb24sIGV4cG9uZW50X2JpdHMpOwotCSAgICBpbnNuWzFdID0gKHdvcmRzWzBdIDw8IDE2KSB8IHdvcmRzWzFdOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPX2lsbGVnYWw6Ci0JY2FzZSBPX3N5bWJvbF9ydmE6Ci0JY2FzZSBPX3VtaW51czoKLQljYXNlIE9fYml0X25vdDoKLQljYXNlIE9fbG9naWNhbF9ub3Q6Ci0JY2FzZSBPX211bHRpcGx5OgotCWNhc2UgT19kaXZpZGU6Ci0JY2FzZSBPX21vZHVsdXM6Ci0JY2FzZSBPX2xlZnRfc2hpZnQ6Ci0JY2FzZSBPX3JpZ2h0X3NoaWZ0OgotCWNhc2UgT19iaXRfaW5jbHVzaXZlX29yOgotCWNhc2UgT19iaXRfb3Jfbm90OgotCWNhc2UgT19iaXRfZXhjbHVzaXZlX29yOgotCWNhc2UgT19iaXRfYW5kOgotCWNhc2UgT19hZGQ6Ci0JY2FzZSBPX3N1YnRyYWN0OgotCWNhc2UgT19lcToKLQljYXNlIE9fbmU6Ci0JY2FzZSBPX2x0OgotCWNhc2UgT19sZToKLQljYXNlIE9fZ2U6Ci0JY2FzZSBPX2d0OgotCWNhc2UgT19sb2dpY2FsX2FuZDoKLQljYXNlIE9fbG9naWNhbF9vcjoKLQljYXNlIE9fbWF4OgotCWRlZmF1bHQ6Ci0JICBpbnRlcm5hbF9lcnJvcl9hIChfKCJ1bmhhbmRsZWQgZXhwcmVzc2lvbiIpLCBYX29wKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbiwgZWl0aGVyIDQgb3IgOCBieXRlcy4gICovCi0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuWzBdLCA0KTsKLSAgaWYgKGZ4ICE9IE5VTEwpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmeCwgaW5zblsxXSwgNCk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgR2FzCi0gICBjYWxscyB0aGlzIGZ1bmN0aW9uIGZvciBlYWNoIGlucHV0IGxpbmUgd2hpY2ggZG9lcyBub3QgY29udGFpbiBhCi0gICBwc2V1ZG9vcC4KLQotICBTVFIgcG9pbnRzIHRvIGEgTlVMTCB0ZXJtaW5hdGVkIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcwotICBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0IHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNjYW47Ci0gIHVuc2lnbmVkIGNoYXIgKmlucHV0X2xpbmVfc2F2ZTsKLSAgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOwotICBleHByZXNzaW9uUyBteW9wc1sxNl07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotICAvKiBFbnN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlIHRvIGFzc2VtYmxlLiAqLwotICBhc3NlcnQgKHN0cik7Ci0KLSAgLyogRHJvcCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLwotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgewotICAgICAgc3RyKys7Ci0gICAgfQotCi0gIC8qIElzb2xhdGUgdGhlIG1uZW1vbmljIGZyb20gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyBieSBmaW5kaW5nIHRoZSBmaXJzdAotICAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlciBhbmQgemFwcGluZyBpdCB0byBhIG51bGwgYnl0ZS4gKi8KLSAgZm9yIChzY2FuID0gc3RyOyAqc2NhbiAhPSAnXDAwMCcgJiYgIWlzc3BhY2UgKCpzY2FuKTsgc2NhbisrKSB7O30KLSAgaWYgKCpzY2FuICE9ICdcMDAwJykKLSAgICB7Ci0gICAgICAqc2NhbisrID0gJ1wwMDAnOwotICAgIH0KLQotICAvKiBUcnkgdG8gZmluZCB0aGlzIG1uZW1vbmljIGluIHRoZSBoYXNoIHRhYmxlICovCi0gIGlmICgob3Bjb2RlID0gKHN0cnVjdCB0aWM4MF9vcGNvZGUgKikgaGFzaF9maW5kICh0aWM4MF9oYXNoLCBzdHIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBtbmVtb25pYzogJyVzJyIpLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdHIgPSBzY2FuOwotICB3aGlsZSAoaXNzcGFjZSAoKnNjYW4pKQotICAgIHsKLSAgICAgIHNjYW4rKzsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9zYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSAgb3Bjb2RlID0gZmluZF9vcGNvZGUgKG9wY29kZSwgbXlvcHMpOwotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIG9wZXJhbmRzOiAnJXMnIiksIGlucHV0X2xpbmVfc2F2ZSk7Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfc2F2ZTsKLSAgYnVpbGRfaW5zbiAob3Bjb2RlLCBteW9wcyk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgYXQgdGhlIHN0YXJ0IG9mIGFzc2VtYmx5LCBhZnRlciB0aGUgY29tbWFuZAotICAgbGluZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHBhcnNlZCBhbmQgYWxsIHRoZSBtYWNoaW5lIGluZGVwZW5kZW50Ci0gICBpbml0aWFsaXphdGlvbnMgaGF2ZSBiZWVuIGNvbXBsZXRlZC4KLQotICAgSXQgc2hvdWxkIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiwgdGhhdCB0aGUgbWFjaGluZSBkZXBlbmRlbnQgcGFydCBvZgotICAgdGhlIGFzc2VtYmxlciB3aWxsIG5lZWQuICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqb3A7Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wX2VuZDsKLSAgY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICpwZHNwOwotICBleHRlcm4gaW50IGNvZmZfZmxhZ3M7CQkJLyogRGVmaW5lZCBpbiBvYmotY29mZi5jICovCi0KLSAgLyogU2V0IEZfQVIzMldSIGluIGNvZmZfZmxhZ3MsIHdoaWNoIHdpbGwgZW5kIHVwIGluIHRoZSBmaWxlIGhlYWRlcgotICAgICBmX2ZsYWdzIGZpZWxkLiAqLwotCi0gIGNvZmZfZmxhZ3MgfD0gRl9BUjMyV1I7CS8qIFRJYzgwIGlzIDMyIGJpdCBsaXR0bGUgZW5kaWFuICovCi0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUuICBUaGUgVEljODAgaW5zdHJ1Y3Rpb24gc2V0Ci0gICAgIGhhcyBtYW55IGlkZW50aWNhbCBvcGNvZGUgbmFtZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBvcGNvZGVzIGJhc2VkCi0gICAgIG9uIHRoZSBvcGVyYW5kcy4gIFRoaXMgaGFzaCB0YWJsZSB0aGVuIHByb3ZpZGVzIGEgcXVpY2sgaW5kZXggdG8KLSAgICAgdGhlIGZpcnN0IG9wY29kZSB3aXRoIGEgcGFydGljdWxhciBuYW1lIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi0gIHRpYzgwX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgb3BfZW5kID0gdGljODBfb3Bjb2RlcyArIHRpYzgwX251bV9vcGNvZGVzOwotICBmb3IgKG9wID0gdGljODBfb3Bjb2Rlczsgb3AgPCBvcF9lbmQ7IG9wKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcCAtPiBuYW1lKSAhPSAwKSAKLQl7Ci0JICBwcmV2X25hbWUgPSAoY2hhciAqKSBvcCAtPiBuYW1lOwotCSAgaGFzaF9pbnNlcnQgKHRpYzgwX2hhc2gsIG9wIC0+IG5hbWUsIChjaGFyICopIG9wKTsKLQl9Ci0gICAgfQotCi0gIC8qIEluc2VydCB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gIFdlIHVzZSBzeW1ib2xfY3JlYXRlCi0gICAgIHJhdGhlciB0aGFuIHN5bWJvbF9uZXcgc28gdGhhdCB0aGVzZSBzeW1ib2xzIGRvbid0IGVuZCB1cCBpbiB0aGUgb2JqZWN0Ci0gICAgIGZpbGVzJyBzeW1ib2wgdGFibGUuICBOb3RlIHRoYXQgdGhlIHZhbHVlcyBvZiB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIGluY2x1ZGUKLSAgICAgc29tZSB1cHBlciBiaXRzIHRoYXQgZGlzdGluZ3Vpc2ggdGhlIHR5cGUgb2YgdGhlIHN5bWJvbCAocmVnaXN0ZXIsIGJpdG51bSwKLSAgICAgY29uZGl0aW9uIGNvZGUsIGV0YykgYW5kIHRoZXNlIGJpdHMgbXVzdCBiZSBtYXNrZWQgYXdheSBiZWZvcmUgYWN0dWFsbHkKLSAgICAgaW5zZXJ0aW5nIHRoZSB2YWx1ZXMgaW50byB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLiAgRm9yIHJlZ2lzdGVycyB3ZSBwdXQKLSAgICAgdGhlc2UgYml0cyBpbiB0aGUgc3ltYm9sIHRhYmxlIHNpbmNlIHdlIHVzZSB0aGVtIGxhdGVyIGFuZCB0aGVyZSBpcyBubwotICAgICBxdWVzdGlvbiB0aGF0IHRoZXkgYXJlbid0IHBhcnQgb2YgdGhlIHJlZ2lzdGVyIG51bWJlci4gIEZvciBjb25zdGFudHMgd2UKLSAgICAgY2FuJ3QgZG8gdGhhdCBzaW5jZSB0aGUgY29uc3RhbnQgY2FuIGJlIGFueSB2YWx1ZSwgc28gdGhleSBhcmUgbWFza2VkIG9mZgotICAgICBiZWZvcmUgcHV0dGluZyB0aGVtIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gKi8KLQotICBwZHNwID0gTlVMTDsKLSAgd2hpbGUgKChwZHNwID0gdGljODBfbmV4dF9wcmVkZWZpbmVkX3N5bWJvbCAocGRzcCkpICE9IE5VTEwpCi0gICAgewotICAgICAgc2VnVCBzZWdtZW50OwotICAgICAgdmFsdWVUIHZhbHU7Ci0gICAgICBpbnQgc3ltdHlwZTsKLQotICAgICAgc3ltdHlwZSA9IFBEU19WQUxVRSAocGRzcCkgJiBUSUM4MF9PUEVSQU5EX01BU0s7Ci0gICAgICBzd2l0Y2ggKHN5bXR5cGUpCi0JewotCWNhc2UgVElDODBfT1BFUkFORF9HUFI6Ci0JY2FzZSBUSUM4MF9PUEVSQU5EX0ZQQToKLQljYXNlIFRJQzgwX09QRVJBTkRfQ1I6Ci0JICBzZWdtZW50ID0gcmVnX3NlY3Rpb247Ci0JICB2YWx1ID0gUERTX1ZBTFVFIChwZHNwKTsKLQkgIGJyZWFrOwotCWNhc2UgVElDODBfT1BFUkFORF9DQzoKLQljYXNlIFRJQzgwX09QRVJBTkRfQklUTlVNOgotCSAgc2VnbWVudCA9IGFic29sdXRlX3NlY3Rpb247Ci0JICB2YWx1ID0gUERTX1ZBTFVFIChwZHNwKSAmIH5USUM4MF9PUEVSQU5EX01BU0s7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgaW50ZXJuYWxfZXJyb3JfYSAoXygidW5oYW5kbGVkIHByZWRlZmluZWQgc3ltYm9sIGJpdHMiKSwgc3ltdHlwZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChQRFNfTkFNRSAocGRzcCksIHNlZ21lbnQsIHZhbHUsCi0JCQkJCSAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gICAgfQotfQotCi0MCi0KLS8qIFRoZSBhc3NlbWJsZXIgYWRkcyBtZF9zaG9ydG9wdHMgdG8gdGhlIHN0cmluZyBwYXNzZWQgdG8gZ2V0b3B0LiAqLwotCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLQotLyogVGhlIGFzc2VtYmxlciBhZGRzIG1kX2xvbmdvcHRzIHRvIHRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGxvbmcgb3B0aW9ucwotICAgdGhhdCBhcmUgcGFzc2VkIHRvIGdldG9wdC4gKi8KLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotCi0jZGVmaW5lIE9QVElPTl9SRUxBWAkoT1BUSU9OX01EX0JBU0UpCi0gIHsicmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JFTEFYfSwKLQotI2RlZmluZSBPUFRJT05fTk9fUkVMQVgJKE9QVElPTl9SRUxBWCArIDEpCi0gIHsibm8tcmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1JFTEFYfSwKLQotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19OwotCi1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLS8qIFRoZSBtZF9wYXJzZV9vcHRpb24gZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgZ2V0b3B0IHJldHVybnMgYW4KLSAgIHVucmVjb2duaXplZCBjb2RlLCBwcmVzdW1hYmx5IGluZGljYXRpbmcgYSBzcGVjaWFsIGNvZGUgdmFsdWUgd2hpY2gKLSAgIGFwcGVhcnMgaW4gbWRfbG9uZ29wdHMgZm9yIG1hY2hpbmUgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuICovCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSBPUFRJT05fUkVMQVg6Ci0gICAgICB0aWM4MF9yZWxheCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9OT19SRUxBWDoKLSAgICAgIHRpYzgwX3JlbGF4ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLSAgcmV0dXJuICgxKTsKLX0KLQotLyogVGhlIG1kX3Nob3dfdXNhZ2UgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSB1c2FnZSBtZXNzYWdlIGlzCi0gICBwcmludGVkLiAgSXQgc2hvdWxkIHByaW50IGEgZGVzY3JpcHRpb24gb2YgdGhlIG1hY2hpbmUgc3BlY2lmaWMgb3B0aW9ucwotICAgZm91bmQgaW4gbWRfbG9uZ29wdHMuICovCi0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sICJcCi1USWM4MCBvcHRpb25zOlxuXAotLXJlbGF4CQkJYWx0ZXIgUEMgcmVsYXRpdmUgYnJhbmNoIGluc3RydWN0aW9ucyB0byB1c2UgbG9uZyBmb3JtIHdoZW4gbmVlZGVkXG5cCi0tbm8tcmVsYXgJCWFsd2F5cyB1c2Ugc2hvcnQgUEMgcmVsYXRpdmUgYnJhbmNoIGluc3RydWN0aW9ucywgZXJyb3Igb24gb3ZlcmZsb3dcbiIpOwotfQotCi0MCi0vKiBBdHRlbXB0IHRvIHNpbXBsaWZ5IG9yIGV2ZW4gZWxpbWluYXRlIGEgZml4dXAuICBUaGUgcmV0dXJuIHZhbHVlIGlzCi0gICBpZ25vcmVkOyBwZXJoYXBzIGl0IHdhcyBvbmNlIG1lYW5pbmdmdWwsIGJ1dCBub3cgaXQgaXMgaGlzdG9yaWNhbC4KLSAgIFRvIGluZGljYXRlIHRoYXQgYSBmaXh1cCBoYXMgYmVlbiBlbGltaW5hdGVkLCBzZXQgZml4UC0+ZnhfZG9uZS4KLSAgICovCi0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqZGVzdCA9ICBmaXhQIC0+IGZ4X2ZyYWcgLT4gZnJfbGl0ZXJhbCArIGZpeFAgLT4gZnhfd2hlcmU7Ci0gIGludCBvdmVyZmxvdzsKLQotICBzd2l0Y2ggKGZpeFAgLT4gZnhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfUkVMTE9OR1g6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGRlc3QsICh2YWx1ZVQpIHZhbCwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTVBQQ1I6Ci0gICAgICB2YWwgPj49IDI7Ci0gICAgICB2YWwgKz0gMTsJICAvKiBUYXJnZXQgYWRkcmVzcyBjb21wdXRlZCBmcm9tIGluc3Qgc3RhcnQgKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZGVzdCwgKHZhbHVlVCkgdmFsLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NUFBDUjE1VzoKLSAgICAgIG92ZXJmbG93ID0gKHZhbCA8IC02NTUzNkwpIHx8ICh2YWwgPiA2NTUzMkwpOwotICAgICAgaWYgKG92ZXJmbG93KQotCXsKLQkgIGFzX2JhZF93aGVyZSAoZml4UCAtPiBmeF9maWxlLCBmaXhQIC0+IGZ4X2xpbmUsCi0JCQlfKCJQQyBvZmZzZXQgMHglbHggb3V0c2lkZSByYW5nZSAweCVseC0weCVseCIpLAotCQkJdmFsLCAtNjU1MzZMLCA2NTUzMkwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB2YWwgPj49IDI7Ci0JICAqZGVzdCsrID0gdmFsICYgMHhGRjsKLQkgIHZhbCA+Pj0gODsKLQkgICpkZXN0ID0gKCpkZXN0ICYgMHg4MCkgfCAodmFsICYgMHg3Rik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0FCUzoKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZGVzdCwgKHZhbHVlVCkgdmFsLCBmaXhQIC0+IGZ4X3NpemUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGludGVybmFsX2Vycm9yX2EgKF8oInVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGUgaW4gZml4dXAiKSwgZml4UCAtPiBmeF9yX3R5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0MCi0vKiBGdW5jdGlvbnMgY29uY2VybmluZyByZWxvY3MuICAqLwotCi0vKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCi0gICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLgotCi0gICBGb3IgdGhlIFRJYzgwLCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSAzMiBiaXQgb3Bjb2RlIGNvbnRhaW5pbmcKLSAgIHRoZSBQQyByZWxhdGl2ZSBmaWVsZC4gKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIChmaXhQIC0+IGZ4X2ZyYWcgLT4gZnJfYWRkcmVzcyArIGZpeFAgLT4gZnhfd2hlcmUpIDsKLX0KLQotLyoKLSAqIENhbGxlZCBhZnRlciByZWxheCgpIGlzIGZpbmlzaGVkLgotICogSW46CUFkZHJlc3Mgb2YgZnJhZy4KLSAqCWZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQuCi0gKglmcl9zdWJ0eXBlIGlzIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4KLSAqCi0gKiBPdXQ6CUFueSBmaXhTcyBhbmQgY29uc3RhbnRzIGFyZSBzZXQgdXAuCi0gKglDYWxsZXIgd2lsbCB0dXJuIGZyYWcgaW50byBhICIuc3BhY2UgMCIuCi0gKi8KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgaW50ZXJuYWxfZXJyb3IgKF8oIm1kX2NvbnZlcnRfZnJhZygpIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKSk7Ci0gIGFib3J0ICgpOwotfQotCi0MCi0vKkFSR1NVU0VEKi8KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoaWdub3JlKQotICAgICBzeW1ib2xTICppZ25vcmU7Ci17Ci19Ci0KLSNpZiBkZWZpbmVkIE9CSl9DT0ZGCi0KLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIChmaXhQIC0+IGZ4X3JfdHlwZSk7Ci19Ci0KLSNlbmRpZgkvKiBPQkpfQ09GRiAqLwotCi0vKiBlbmQgb2YgdGMtdGljODAuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10aWM4MC5oIGIvZ2FzL2NvbmZpZy90Yy10aWM4MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmZmMjQ5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdGljODAuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy10aWM4MC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfVElDODAKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJYmZkX2FyY2hfdGljODAKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkiY29mZi10aWM4MCIKLSNkZWZpbmUgQkZEX0FSQ0gJVEFSR0VUX0FSQ0gKLQotLyogV2UgbmVlZCB0aGUgZXh0cmEgZmllbGQgaW4gdGhlIGZpeHVwIHN0cnVjdCB0byBwdXQgdGhlIHJlbG9jYXRpb24gaW4uICovCi0KLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUKLQotLyogRGVmaW5lIG1kX251bWJlcl90b19jaGFycyBhcyB0aGUgYXBwcm9wcmlhdGUgc3RhbmRhcmQgYmlnIGVuZGlhbiBvcgotICAgbGl0dGxlIGVuZGlhbiBmdW5jdGlvbi4gIFNob3VsZCB3ZSBzb21lZGF5IHN1cHBvcnQgZW5kaWFubmVzcyBhcyBhCi0gICBydW50aW1lIGRlY2lzaW9uLCB0aGlzIHdpbGwgbmVlZCB0byBjaGFuZ2UuICovCi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLQotLyogRGVmaW5lIGF3YXkgdGhlIGNhbGwgdG8gbWRfb3BlcmFuZCBpbiB0aGUgZXhwcmVzc2lvbiBwYXJzaW5nIGNvZGUuCi0gICBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgZXhwcmVzc2lvbiBwYXJzZXIgY2FuJ3QgcGFyc2UgdGhlIGlucHV0Ci0gICBhbmQgZ2l2ZXMgdGhlIGFzc2VtYmxlciBiYWNrZW5kIGEgY2hhbmNlIHRvIGRlYWwgd2l0aCBpdCBpbnN0ZWFkLiAqLwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2lmZGVmIE9CSl9DT0ZGCi0KLS8qIENPRkYgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLwotCi0jZGVmaW5lIENPRkZfTUFHSUMJVElDODBfQVJDSF9NQUdJQwotCi0vKiBXaGV0aGVyIGEgcmVsb2Mgc2hvdWxkIGJlIG91dHB1dC4gICovCi0KLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoZml4cCkgKChmaXhwKSAtPiBmeF9hZGRzeSAhPSBOVUxMKQotCi0vKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLwotCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIHRjX2NvZmZfZml4MnJ0eXBlKGZpeFApCi0KLWV4dGVybiBzaG9ydCB0Y19jb2ZmX2ZpeDJydHlwZSAoKTsKLQotI2VuZGlmCS8qIE9CSl9DT0ZGICovCi0KLS8qIGVuZCBvZiB0Yy10aWM4MC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXY4NTAuYyBiL2dhcy9jb25maWcvdGMtdjg1MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTMwNTRkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdjg1MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4MiArMCwwIEBACi0vKiB0Yy12ODUwLmMgLS0gQXNzZW1ibGVyIGNvZGUgZm9yIHRoZSBORUMgVjg1MAotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAotI2luY2x1ZGUgIm9wY29kZS92ODUwLmgiCi0KLSNkZWZpbmUgQVJFQV9aREEgMAotI2RlZmluZSBBUkVBX1NEQSAxCi0jZGVmaW5lIEFSRUFfVERBIDIKLQotLyogc2lnbi1leHRlbmQgYSAxNi1iaXQgbnVtYmVyICovCi0jZGVmaW5lIFNFWFQxNih4KQkoKCgoeCkgJiAweGZmZmYpIF4gKH4gMHg3ZmZmKSkgKyAweDgwMDApCi0KLS8qIFRlbXBvcmFyaWx5IGhvbGRzIHRoZSByZWxvYyBpbiBhIGNvbnMgZXhwcmVzc2lvbi4gICovCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGhvbGRfY29uc19yZWxvYzsKLQotLyogU2V0IHRvIFRSVUUgaWYgd2Ugd2FudCB0byBiZSBwZWRhbnRpYyBhYm91dCBzaWduZWQgb3ZlcmZsb3dzLiAgKi8KLXN0YXRpYyBib29sZWFuIHdhcm5fc2lnbmVkX292ZXJmbG93cyAgID0gRkFMU0U7Ci1zdGF0aWMgYm9vbGVhbiB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cyA9IEZBTFNFOwotCi0vKiBJbmRpY2F0ZXMgdGhlIHRhcmdldCBCRkQgbWFjaGluZSBudW1iZXIuICAqLwotc3RhdGljIGludCAgICAgbWFjaGluZSA9IC0xOwotCi0vKiBJbmRpY2F0ZXMgdGhlIHRhcmdldCBwcm9jZXNzb3IocykgZm9yIHRoZSBhc3NlbWJsZS4gICovCi1zdGF0aWMgdW5zaWduZWQgaW50CXByb2Nlc3Nvcl9tYXNrID0gLTE7Ci0KLQwKLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCByZWdfbmFtZQotewotICBjb25zdCBjaGFyICogbmFtZTsKLSAgaW50ICAgICAgICAgIHZhbHVlOwotfTsKLQotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsIHRhcmdldHMuICovCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIjsjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhIAotICAgc2luZ2xlIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcgCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsIAotICAgYXMgaW4gMGQxLjAuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0MCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotICAvKiBDb25kaXRpb25hbCBicmFuY2hlcy4gICovCi0gIHsweGZmLCAgICAgLTB4MTAwLCAgICAyLCAxfSwKLSAgezB4MWZmZmZmLCAtMHgyMDAwMDAsIDYsIDB9LAotICAvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgKi8KLSAgezB4ZmYsICAgICAtMHgxMDAsICAgIDIsIDN9LAotICB7MHgxZmZmZmYsIC0weDIwMDAwMCwgNCwgMH0sCi19OwotCi0KLXN0YXRpYyBzZWdUIHNkYXRhX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgdGRhdGFfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB6ZGF0YV9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHNic3Nfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB0YnNzX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgemJzc19zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHJvc2RhdGFfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCByb3pkYXRhX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1Qgc2NvbW1vbl9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHRjb21tb25fc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB6Y29tbW9uX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgY2FsbF90YWJsZV9kYXRhX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgY2FsbF90YWJsZV90ZXh0X3NlY3Rpb24gPSBOVUxMOwotCi0vKiBmaXh1cHMgKi8KLSNkZWZpbmUgTUFYX0lOU05fRklYVVBTICg1KQotc3RydWN0IHY4NTBfZml4dXAKLXsKLSAgZXhwcmVzc2lvblMgICAgICAgICAgICAgIGV4cDsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgIG9waW5kZXg7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci0KLXN0cnVjdCB2ODUwX2ZpeHVwIGZpeHVwcyBbTUFYX0lOU05fRklYVVBTXTsKLXN0YXRpYyBpbnQgZmM7Ci0KLQwKLXZvaWQKLXY4NTBfc2RhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoc2RhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3RkYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHRkYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3pkYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHpkYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3Nic3MgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoc2Jzc19zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF90YnNzIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHRic3Nfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfemJzcyAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0ICh6YnNzX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3Jvc2RhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAocm9zZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9yb3pkYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHJvemRhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfY2FsbF90YWJsZV9kYXRhIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKGNhbGxfdGFibGVfZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9jYWxsX3RhYmxlX3RleHQgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoY2FsbF90YWJsZV90ZXh0X3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX2JzcyAoaW50IGlnbm9yZSkKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAoc3Vic2VnVCkgdGVtcCk7Ci0gICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9vZmZzZXQgKGludCBpZ25vcmUpCi17Ci0gIGludCB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIAotICB0ZW1wIC09IGZyYWdfbm93X2ZpeCgpOwotICAKLSAgaWYgKHRlbXAgPiAwKQotICAgICh2b2lkKSBmcmFnX21vcmUgKHRlbXApOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogQ29waWVkIGZyb20gb2JqX2VsZl9jb21tb24oKSBpbiBnYXMvY29uZmlnL29iai1lbGYuYyAqLwotc3RhdGljIHZvaWQKLXY4NTBfY29tbSAoYXJlYSkKLSAgICAgaW50IGFyZWE7Ci17Ci0gIGNoYXIgKiAgICBuYW1lOwotICBjaGFyICAgICAgYzsKLSAgY2hhciAqICAgIHA7Ci0gIGludCAgICAgICB0ZW1wOwotICBpbnQgICAgICAgc2l6ZTsKLSAgc3ltYm9sUyAqIHN5bWJvbFA7Ci0gIGludCAgICAgICBoYXZlX2FsaWduOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgCi0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIAotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIAotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgaW5wdXRfbGluZV9wb2ludGVyICsrOwkJLyogc2tpcCAnLCcgKi8KLSAgCi0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGFzX2JhZCAoXygiLkNPTU1vbiBsZW5ndGggKCVkLikgPCAwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgc2l6ZSA9IHRlbXA7Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIAotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gc2l6ZSkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgYXNfd2FybiAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWQuIiksCi0JCSAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplKTsKLQl9Ci0gICAgfQotICAKLSAga25vdyAoc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSA9PSAmIHplcm9fYWRkcmVzc19mcmFnKTsKLSAgCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBoYXZlX2FsaWduID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGhhdmVfYWxpZ24gPSAxOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotICAKLSAgaWYgKCEgaGF2ZV9hbGlnbiB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLSAgICB7Ci0gICAgICBpZiAoISBoYXZlX2FsaWduKQotCXRlbXAgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIAotCSAgaWYgKHRlbXAgPCAwKQotCSAgICB7Ci0JICAgICAgdGVtcCA9IDA7Ci0JICAgICAgYXNfd2FybiAoXygiQ29tbW9uIGFsaWdubWVudCBuZWdhdGl2ZTsgMCBhc3N1bWVkIikpOwotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICBpZiAoc3ltYm9sX2dldF9vYmogKHN5bWJvbFApLT5sb2NhbCkKLQl7Ci0JICBzZWdUICAgb2xkX3NlYzsKLQkgIGludCAgICBvbGRfc3Vic2VjOwotCSAgY2hhciAqIHBmcmFnOwotCSAgaW50ICAgIGFsaWduOwotCSAgZmxhZ3dvcmQJYXBwbGljYWJsZTsKLQotCSAgb2xkX3NlYyA9IG5vd19zZWc7Ci0JICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgICAgIAotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JCSAgCi0JICBhcHBsaWNhYmxlICY9IFNFQ19BTExPQzsKLQkgIAotCSAgc3dpdGNoIChhcmVhKQotCSAgICB7Ci0JICAgIGNhc2UgQVJFQV9TREE6Ci0JICAgICAgaWYgKHNic3Nfc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgc2Jzc19zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5zYnNzIiwgMCk7Ci0JICAgICAgCi0JCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNic3Nfc2VjdGlvbiwgYXBwbGljYWJsZSk7Ci0JICAgICAgCi0JCSAgc2VnX2luZm8gKHNic3Nfc2VjdGlvbiktPmJzcyA9IDE7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgIAotCSAgICBjYXNlIEFSRUFfWkRBOgotCSAgICAgIGlmICh6YnNzX3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIHpic3Nfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuemJzcyIsIDApOwotCQkgIAotCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzYnNzX3NlY3Rpb24sIGFwcGxpY2FibGUpOwotCSAgICAgIAotCQkgIHNlZ19pbmZvICh6YnNzX3NlY3Rpb24pLT5ic3MgPSAxOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAKLQkgICAgY2FzZSBBUkVBX1REQToKLQkgICAgICBpZiAodGJzc19zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICB0YnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnRic3MiLCAwKTsKLQkJICAKLQkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgdGJzc19zZWN0aW9uLCBhcHBsaWNhYmxlKTsKLQkJICAKLQkJICBzZWdfaW5mbyAodGJzc19zZWN0aW9uKS0+YnNzID0gMTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmICh0ZW1wKQotCSAgICB7Ci0JICAgICAgLyogY29udmVydCB0byBhIHBvd2VyIG9mIDIgYWxpZ25tZW50ICovCi0JICAgICAgZm9yIChhbGlnbiA9IDA7ICh0ZW1wICYgMSkgPT0gMDsgdGVtcCA+Pj0gMSwgKythbGlnbikKLQkJOwotCSAgICAgIAotCSAgICAgIGlmICh0ZW1wICE9IDEpCi0JCXsKLQkJICBhc19iYWQgKF8oIkNvbW1vbiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFsaWduID0gMDsKLQkgIAotCSAgc3dpdGNoIChhcmVhKQotCSAgICB7Ci0JICAgIGNhc2UgQVJFQV9TREE6Ci0JICAgICAgcmVjb3JkX2FsaWdubWVudCAoc2Jzc19zZWN0aW9uLCBhbGlnbik7Ci0JICAgICAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0JICAgICAgc3Vic2VnX3NldCAoc2Jzc19zZWN0aW9uLCAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFSRUFfWkRBOgotCSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHpic3Nfc2VjdGlvbiwgYWxpZ24pOwotCSAgICAgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotCSAgICAgIHN1YnNlZ19zZXQgKHpic3Nfc2VjdGlvbiwgMCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBUkVBX1REQToKLQkgICAgICByZWNvcmRfYWxpZ25tZW50ICh0YnNzX3NlY3Rpb24sIGFsaWduKTsKLQkgICAgICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLQkgICAgICBzdWJzZWdfc2V0ICh0YnNzX3NlY3Rpb24sIDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCSAgCi0JICBpZiAoYWxpZ24pCi0JICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKLQotCSAgc3dpdGNoIChhcmVhKQotCSAgICB7Ci0JICAgIGNhc2UgQVJFQV9TREE6Ci0JICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHNic3Nfc2VjdGlvbikKLQkJc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFSRUFfWkRBOgotCSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSB6YnNzX3NlY3Rpb24pCi0JCXN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBUkVBX1REQToKLQkgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gdGJzc19zZWN0aW9uKQotCQlzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSAwOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIAotCSAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0JICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsCi0JCQkgICAgKG9mZnNldFQpIHNpemUsIChjaGFyICopIDApOwotCSAgKnBmcmFnID0gMDsKLQkgIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHNpemUpOwotCSAgCi0JICBzd2l0Y2ggKGFyZWEpCi0JICAgIHsKLQkgICAgY2FzZSBBUkVBX1NEQToKLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBzYnNzX3NlY3Rpb24pOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIEFSRUFfWkRBOgotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHpic3Nfc2VjdGlvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgQVJFQV9UREE6Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgdGJzc19zZWN0aW9uKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCgpOwotCSAgICB9Ci0JICAgIAotCSAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLQkgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JYWxsb2NhdGVfY29tbW9uOgotCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHNpemUpOwotCSAgU19TRVRfQUxJR04gKHN5bWJvbFAsIHRlbXApOwotCSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgCi0JICBzd2l0Y2ggKGFyZWEpCi0JICAgIHsKLQkgICAgY2FzZSBBUkVBX1NEQToKLQkgICAgICBpZiAoc2NvbW1vbl9zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICBmbGFnd29yZAlhcHBsaWNhYmxlOwotCQkgIAotCQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCQkgIAotCQkgIHNjb21tb25fc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuc2NvbW1vbiIsIDApOwotCQkgIAotCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzY29tbW9uX3NlY3Rpb24sIGFwcGxpY2FibGUKLQkJICAgICAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19EQVRBCi0JCQl8IFNFQ19IQVNfQ09OVEVOVFMpIHwgU0VDX0lTX0NPTU1PTik7Ci0JCX0KLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBzY29tbW9uX3NlY3Rpb24pOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIEFSRUFfWkRBOgotCSAgICAgIGlmICh6Y29tbW9uX3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIGZsYWd3b3JkCWFwcGxpY2FibGU7Ci0JCSAgCi0JCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JCSAgCi0JCSAgemNvbW1vbl9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi56Y29tbW9uIiwgMCk7Ci0JCSAgCi0JCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHpjb21tb25fc2VjdGlvbiwgYXBwbGljYWJsZQotCQkgICAgICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0RBVEEKLQkJCXwgU0VDX0hBU19DT05URU5UUykgfCBTRUNfSVNfQ09NTU9OKTsKLQkJfQotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHpjb21tb25fc2VjdGlvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgQVJFQV9UREE6Ci0JICAgICAgaWYgKHRjb21tb25fc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgZmxhZ3dvcmQJYXBwbGljYWJsZTsKLQkJICAKLQkJICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkJICAKLQkJICB0Y29tbW9uX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnRjb21tb24iLCAwKTsKLQkJICAKLQkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgdGNvbW1vbl9zZWN0aW9uLCBhcHBsaWNhYmxlCi0JCSAgICAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfREFUQQotCQkJfCBTRUNfSEFTX0NPTlRFTlRTKSB8IFNFQ19JU19DT01NT04pOwotCQl9Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgdGNvbW1vbl9zZWN0aW9uKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCgpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSB1c2UgdGhlIGRvdCwgc29tZSBkb24ndC4gIENhbiB3ZSBnZXQgc29tZSBjb25zaXN0ZW5jeT8/ICAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy4nKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSBzYXkgZGF0YSwgc29tZSBzYXkgYnNzLiAgKi8KLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJic3NcIiIsIDQpCi0JICAmJiBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJkYXRhXCIiLCA1KSkKLQl7Ci0JICB3aGlsZSAoKi0taW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLQkgICAgOwotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JICBnb3RvIGJhZF9jb21tb25fc2VnbWVudDsKLQl9Ci0gICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICciJykKLQk7Ci0gICAgICBnb3RvIGFsbG9jYXRlX2NvbW1vbjsKLSAgICB9Ci0KLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLQotICB7Ci0gIGJhZF9jb21tb25fc2VnbWVudDoKLSAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQotICAgICAgcCsrOwotICAgIGMgPSAqcDsKLSAgICAqcCA9ICdcMCc7Ci0gICAgYXNfYmFkIChfKCJiYWQgLmNvbW1vbiBzZWdtZW50ICVzIiksIGlucHV0X2xpbmVfcG9pbnRlciArIDEpOwotICAgICpwID0gYzsKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQKLXNldF9tYWNoaW5lIChpbnQgbnVtYmVyKQotewotICBtYWNoaW5lID0gbnVtYmVyOwotICBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBUQVJHRVRfQVJDSCwgbWFjaGluZSk7Ci0KLSAgc3dpdGNoIChtYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIDA6IHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTA7IGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfdjg1MGU6ICBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRTsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF92ODUwZWE6IHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFQTsgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7InNkYXRhIiwgICB2ODUwX3NkYXRhLCAgIDB9LAotICB7InRkYXRhIiwgICB2ODUwX3RkYXRhLCAgIDB9LAotICB7InpkYXRhIiwgICB2ODUwX3pkYXRhLCAgIDB9LAotICB7InNic3MiLCAgICB2ODUwX3Nic3MsICAgIDB9LAotICB7InRic3MiLCAgICB2ODUwX3Ric3MsICAgIDB9LAotICB7Inpic3MiLCAgICB2ODUwX3pic3MsICAgIDB9LAotICB7InJvc2RhdGEiLCB2ODUwX3Jvc2RhdGEsIDB9LAotICB7InJvemRhdGEiLCB2ODUwX3JvemRhdGEsIDB9LAotICB7ImJzcyIsICAgICB2ODUwX2JzcywgICAgIDB9LAotICB7Im9mZnNldCIsICB2ODUwX29mZnNldCwgIDB9LAotICB7IndvcmQiLCAgICBjb25zLCAgICAgICAgIDR9LAotICB7Inpjb21tIiwgICB2ODUwX2NvbW0sICAgIEFSRUFfWkRBfSwKLSAgeyJzY29tbSIsICAgdjg1MF9jb21tLCAgICBBUkVBX1NEQX0sCi0gIHsidGNvbW0iLCAgIHY4NTBfY29tbSwgICAgQVJFQV9UREF9LAotICB7InY4NTAiLCAgICBzZXRfbWFjaGluZSwgIDB9LAotICB7ImNhbGxfdGFibGVfZGF0YSIsIHY4NTBfY2FsbF90YWJsZV9kYXRhLCAwfSwKLSAgeyJjYWxsX3RhYmxlX3RleHQiLCB2ODUwX2NhbGxfdGFibGVfdGV4dCwgMH0sCi0gIHsidjg1MGUiLCAgICAgICAgICAgc2V0X21hY2hpbmUsICAgICAgICAgIGJmZF9tYWNoX3Y4NTBlfSwKLSAgeyJ2ODUwZWEiLCAgICAgICAgICBzZXRfbWFjaGluZSwgICAgICAgICAgYmZkX21hY2hfdjg1MGVhfSwKLSAgeyBOVUxMLCAgICAgTlVMTCwgICAgICAgICAwfQotfTsKLQotLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnY4NTBfaGFzaDsKLQotLyogVGhpcyB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImVwIiwgIDMwIH0sCQkvKiBlcCAtIGVsZW1lbnQgcHRyICovCi0gIHsgImdwIiwgICA0IH0sCQkvKiBncCAtIGdsb2JhbCBwdHIgKi8KLSAgeyAiaHAiLCAgIDIgfSwJCS8qIGhwIC0gaGFuZGxlciBzdGFjayBwdHIgKi8KLSAgeyAibHAiLCAgMzEgfSwJCS8qIGxwIC0gbGluayBwdHIgKi8KLSAgeyAicjAiLCAgIDAgfSwKLSAgeyAicjEiLCAgIDEgfSwKLSAgeyAicjEwIiwgMTAgfSwKLSAgeyAicjExIiwgMTEgfSwKLSAgeyAicjEyIiwgMTIgfSwKLSAgeyAicjEzIiwgMTMgfSwKLSAgeyAicjE0IiwgMTQgfSwKLSAgeyAicjE1IiwgMTUgfSwKLSAgeyAicjE2IiwgMTYgfSwKLSAgeyAicjE3IiwgMTcgfSwKLSAgeyAicjE4IiwgMTggfSwKLSAgeyAicjE5IiwgMTkgfSwKLSAgeyAicjIiLCAgIDIgfSwKLSAgeyAicjIwIiwgMjAgfSwKLSAgeyAicjIxIiwgMjEgfSwKLSAgeyAicjIyIiwgMjIgfSwKLSAgeyAicjIzIiwgMjMgfSwKLSAgeyAicjI0IiwgMjQgfSwKLSAgeyAicjI1IiwgMjUgfSwKLSAgeyAicjI2IiwgMjYgfSwKLSAgeyAicjI3IiwgMjcgfSwKLSAgeyAicjI4IiwgMjggfSwKLSAgeyAicjI5IiwgMjkgfSwKLSAgeyAicjMiLCAgIDMgfSwKLSAgeyAicjMwIiwgMzAgfSwKLSAgeyAicjMxIiwgMzEgfSwKLSAgeyAicjQiLCAgIDQgfSwKLSAgeyAicjUiLCAgIDUgfSwKLSAgeyAicjYiLCAgIDYgfSwKLSAgeyAicjciLCAgIDcgfSwKLSAgeyAicjgiLCAgIDggfSwKLSAgeyAicjkiLCAgIDkgfSwKLSAgeyAic3AiLCAgIDMgfSwJCS8qIHNwIC0gc3RhY2sgcHRyICovCi0gIHsgInRwIiwgICA1IH0sCQkvKiB0cCAtIHRleHQgcHRyICovCi0gIHsgInplcm8iLCAwIH0sCi19OwotI2RlZmluZSBSRUdfTkFNRV9DTlQJKHNpemVvZiAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKSAvIHNpemVvZiAoc3RydWN0IHJlZ19uYW1lKSkKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIHN5c3RlbV9yZWdpc3RlcnNbXSA9IAotewotICB7ICJjdGJwIiwgIDIwIH0sCi0gIHsgImN0cGMiLCAgMTYgfSwKLSAgeyAiY3Rwc3ciLCAxNyB9LAotICB7ICJkYnBjIiwgIDE4IH0sCi0gIHsgImRicHN3IiwgMTkgfSwKLSAgeyAiZWNyIiwgICAgNCB9LAotICB7ICJlaXBjIiwgICAwIH0sCi0gIHsgImVpcHN3IiwgIDEgfSwKLSAgeyAiZmVwYyIsICAgMiB9LAotICB7ICJmZXBzdyIsICAzIH0sCi0gIHsgInBzdyIsICAgIDUgfSwKLX07Ci0jZGVmaW5lIFNZU1JFR19OQU1FX0NOVAkoc2l6ZW9mIChzeXN0ZW1fcmVnaXN0ZXJzKSAvIHNpemVvZiAoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBzeXN0ZW1fbGlzdF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsiUFMiLCAgICAgIDUgfSwKLSAgeyJTUiIsICAgICAgMCArIDF9Ci19OwotI2RlZmluZSBTWVNSRUdMSVNUX05BTUVfQ05UCShzaXplb2YgKHN5c3RlbV9saXN0X3JlZ2lzdGVycykgLyBzaXplb2YgKHN0cnVjdCByZWdfbmFtZSkpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgY2NfbmFtZXNbXSA9Ci17Ci0gIHsgImMiLCAgMHgxIH0sCi0gIHsgImUiLCAgMHgyIH0sCi0gIHsgImdlIiwgMHhlIH0sCi0gIHsgImd0IiwgMHhmIH0sCi0gIHsgImgiLCAgMHhiIH0sCi0gIHsgImwiLCAgMHgxIH0sCi0gIHsgImxlIiwgMHg3IH0sCi0gIHsgImx0IiwgMHg2IH0sCi0gIHsgIm4iLCAgMHg0IH0sCi0gIHsgIm5jIiwgMHg5IH0sCi0gIHsgIm5lIiwgMHhhIH0sCi0gIHsgIm5oIiwgMHgzIH0sCi0gIHsgIm5sIiwgMHg5IH0sCi0gIHsgIm5zIiwgMHhjIH0sCi0gIHsgIm52IiwgMHg4IH0sCi0gIHsgIm56IiwgMHhhIH0sCi0gIHsgInAiLCAgMHhjIH0sCi0gIHsgInMiLCAgMHg0IH0sCi0gIHsgInNhIiwgMHhkIH0sCi0gIHsgInQiLCAgMHg1IH0sCi0gIHsgInYiLCAgMHgwIH0sCi0gIHsgInoiLCAgMHgyIH0sCi19OwotI2RlZmluZSBDQ19OQU1FX0NOVAkoc2l6ZW9mIChjY19uYW1lcykgLyBzaXplb2YgKHN0cnVjdCByZWdfbmFtZSkpCi0KLS8qIHJlZ19uYW1lX3NlYXJjaCBkb2VzIGEgYmluYXJ5IHNlYXJjaCBvZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgdGFibGUKLSAgIHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgotICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAocmVncywgcmVnY291bnQsIG5hbWUsIGFjY2VwdF9udW1iZXJzKQotICAgICBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgKiByZWdzOwotICAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZWdjb3VudDsKLSAgICAgY29uc3QgY2hhciAqICAgICAgICAgICAgbmFtZTsKLSAgICAgYm9vbGVhbiAgICAgICAgICAgICAgICAgYWNjZXB0X251bWJlcnM7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLSAgc3ltYm9sUyAqIHN5bWJvbFA7Ci0KLSAgLyogSWYgdGhlIHJlZ2lzdGVyIG5hbWUgaXMgYSBzeW1ib2wsIHRoZW4gZXZhbHVhdGUgaXQuICAqLwotICBpZiAoKHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSkpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBhbiBhbGlhcyBmb3IgYW5vdGhlciBuYW1lIHRoZW4gdXNlIHRoYXQuCi0JIElmIHRoZSBzeW1ib2wgaXMgYW4gYWxpYXMgZm9yIGEgbnVtYmVyLCB0aGVuIHJldHVybiB0aGUgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChzeW1ib2xfZXF1YXRlZF9wIChzeW1ib2xQKSkKLQl7Ci0JICBuYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzeW1ib2xQKS0+WF9hZGRfc3ltYm9sKTsKLQl9Ci0gICAgICBlbHNlIGlmIChhY2NlcHRfbnVtYmVycykKLQl7Ci0JICBpbnQgcmVnID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgCi0JICBpZiAocmVnID49IDAgJiYgcmVnIDw9IDMxKQotCSAgICByZXR1cm4gcmVnOwotCX0KLQotICAgICAgLyogT3RoZXJ3aXNlIGRyb3AgdGhyb3VnaCBhbmQgdHJ5IHBhcnNpbmcgbmFtZSBub3JtYWxseS4gICovCi0gICAgfQotICAKLSAgbG93ID0gMDsKLSAgaGlnaCA9IHJlZ2NvdW50IC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCByZWdzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gcmVnc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLSAgcmV0dXJuIC0xOwotfQotCi0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLXJlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotewotICBpbnQgICAgcmVnX251bWJlcjsKLSAgY2hhciAqIG5hbWU7Ci0gIGNoYXIgKiBzdGFydDsKLSAgY2hhciAgIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMsIFJFR19OQU1FX0NOVCwKLQkJCQluYW1lLCBGQUxTRSk7Ci0KLSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gIAotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCAgICAgICAgID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sICA9IE5VTEw7Ci0gICAgICAKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7Ci0gICAgICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIFN1bW1hcnkgb2Ygc3lzdGVtX3JlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogIElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqICAgICAgZXhwcmVzc2lvblAgcG9pbnRzIHRvIGFuIGV4cHJlc3Npb24gc3RydWN0dXJlIHRvIGJlIGZpbGxlZCBpbi4KLSAqICAgICAgYWNjZXB0X251bWJlcnMgaXMgdHJ1ZSBpZmYgbnVtZXJpY2FsIHJlZ2lzdGVyIG5hbWVzIG1heSBiZSB1c2VkLgotICogICAgICBhY2NlcHRfbGlzdF9uYW1lcyBpcyB0cnVlIGlmZiB0aGUgc3BlY2lhbCBuYW1lcyBQUyBhbmQgU1IgbWF5IGJlIAotICogICAgICBhY2NlcHRlZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMgc3RydWN0dXJlIGluIGV4cHJlc3Npb25QLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLXN5c3RlbV9yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCwgYWNjZXB0X251bWJlcnMsIGFjY2VwdF9saXN0X25hbWVzKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotICAgICBib29sZWFuICAgICAgIGFjY2VwdF9udW1iZXJzOwotICAgICBib29sZWFuICAgICAgIGFjY2VwdF9saXN0X25hbWVzOwotewotICBpbnQgICAgcmVnX251bWJlcjsKLSAgY2hhciAqIG5hbWU7Ci0gIGNoYXIgKiBzdGFydDsKLSAgY2hhciAgIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoc3lzdGVtX3JlZ2lzdGVycywgU1lTUkVHX05BTUVfQ05ULCBuYW1lLAotCQkJCWFjY2VwdF9udW1iZXJzKTsKLQotICAqIGlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAKLSAgaWYgKHJlZ19udW1iZXIgPCAwCi0gICAgICAmJiBhY2NlcHRfbnVtYmVycykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgICA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLQotICAgICAgaWYgKGlzZGlnaXQgKCogaW5wdXRfbGluZV9wb2ludGVyKSkKLQl7Ci0JICByZWdfbnVtYmVyID0gc3RydG9sIChpbnB1dF9saW5lX3BvaW50ZXIsICYgaW5wdXRfbGluZV9wb2ludGVyLCAxMCk7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSByZWdpc3RlciBudW1iZXIgaXMgYWxsb3dhYmxlLiAqLwotCSAgaWYgKCAgIHJlZ19udW1iZXIgPCAwCi0JCSB8fCByZWdfbnVtYmVyID4gNQotCQkgJiYgcmVnX251bWJlciA8IDE2Ci0JCSB8fCByZWdfbnVtYmVyID4gMjAKLQkJICkKLQkgICAgewotCSAgICAgIHJlZ19udW1iZXIgPSAtMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGFjY2VwdF9saXN0X25hbWVzKQotCXsKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKHN5c3RlbV9saXN0X3JlZ2lzdGVycywKLQkJCQkJU1lTUkVHTElTVF9OQU1FX0NOVCwgbmFtZSwgRkFMU0UpOwotCi0JICAqIGlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotCX0KLSAgICB9Ci0gIAotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCAgICAgICAgID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sICA9IE5VTEw7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7Ci0gICAgICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIFN1bW1hcnkgb2YgY2NfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLWNjX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotewotICBpbnQgICAgcmVnX251bWJlcjsKLSAgY2hhciAqIG5hbWU7Ci0gIGNoYXIgKiBzdGFydDsKLSAgY2hhciAgIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoY2NfbmFtZXMsIENDX05BTUVfQ05ULCBuYW1lLCBGQUxTRSk7Ci0KLSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wICAgICAgICAgPSBPX2NvbnN0YW50OwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgID0gTlVMTDsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsKLSAgICAgIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNraXBfd2hpdGVfc3BhY2UgKHZvaWQpCi17Ci0gIHdoaWxlICggICAqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcKLQkgfHwgKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykKLSAgICArKyBpbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLS8qIFN1bW1hcnkgb2YgcGFyc2VfcmVnaXN0ZXJfbGlzdCAoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyICBwb2ludHMgdG8gMXN0IGNoYXIgb2YgYSBsaXN0IG9mIHJlZ2lzdGVycy4KLSAqICAgICBpbnNuICAgICAgICAgICAgICAgIGlzIHRoZSBwYXJ0aWFsbHkgY29uc3RydWN0ZWQgaW5zdHJ1Y3Rpb24uCi0gKiAgICAgb3BlcmFuZCAgICAgICAgICAgICBpcyB0aGUgb3BlcmFuZCBiZWluZyBpbnNlcnRlZC4KLSAqCi0gKiBvdXQ6IE5VTEwgaWYgdGhlIHBhcnNlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSBhCi0gKiAgICAgIHBvaW50ZXIgdG8gYW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZC4gIElmIHRoZSBwYXJzZQotICogICAgICBjb21wbGV0ZXMgdGhlIGNvcnJlY3QgYml0IGZpZWxkcyBpbiB0aGUgaW5zdHJ1Y3Rpb24KLSAqICAgICAgd2lsbCBiZSBmaWxsZWQgaW4uCi0gKgotICogUGFyc2VzIHJlZ2lzdGVyIGxpc3RzIHdpdGggdGhlIHN5bnRheDoKLSAqCi0gKiAgIHsgclggfQotICogICB7IHJYLCByWSB9Ci0gKiAgIHsgclggLSByWSB9Ci0gKiAgIHsgclggLSByWSwgclogfQotICogICBldGMKLSAqCi0gKiBhbmQgYWxzbyBwYXJzZXMgY29uc3RhbnQgZXB4cmVzc2lvbnMgd2hvZXMgYml0cyBpbmRpY2F0ZSB0aGUKLSAqIHJlZ2lzdGVycyBpbiB0aGUgbGlzdHMuICBUaGUgTFNCIGluIHRoZSBleHByZXNzaW9uIHJlZmVycyB0bwotICogdGhlIGxvd2VzdCBudW1iZXJlZCBwZXJtaXNzYWJsZSByZWdpc3RlciBpbiB0aGUgcmVnaXN0ZXIgbGlzdCwKLSAqIGFuZCBzbyBvbiB1cHdhcmRzLiAgU3lzdGVtIHJlZ2lzdGVycyBhcmUgY29uc2lkZXJlZCB0byBiZSB2ZXJ5Ci0gKiBoaWdoIG51bWJlcnMuCi0gKiAKLSAqLwotc3RhdGljIGNoYXIgKgotcGFyc2VfcmVnaXN0ZXJfbGlzdAotKAotICB1bnNpZ25lZCBsb25nICogICAgICAgICAgICAgaW5zbiwKLSAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQKLSkKLXsKLSAgc3RhdGljIGludCAgdHlwZTFfcmVnc1sgMzIgXSA9IHsgMzAsICAwLCAgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAzMSwgMjksIDI4LCAyMywgMjIsIDIxLCAyMCwgMjcsIDI2LCAyNSwgMjQgfTsKLSAgc3RhdGljIGludCAgdHlwZTJfcmVnc1sgMzIgXSA9IHsgMTksIDE4LCAxNywgMTYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMwLCAzMSwgMjksIDI4LCAyMywgMjIsIDIxLCAyMCwgMjcsIDI2LCAyNSwgMjQgfTsKLSAgc3RhdGljIGludCAgdHlwZTNfcmVnc1sgMzIgXSA9IHsgIDMsICAyLCAgMSwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDE0LCAxNSwgMTMsIDEyLCAgNywgIDYsICA1LCAgNCwgMTEsIDEwLCAgOSwgIDggfTsKLSAgaW50ICogICAgICAgcmVnczsKLSAgZXhwcmVzc2lvblMgZXhwOwotCi0KLSAgLyogU2VsZWN0IGEgcmVnaXN0ZXIgYXJyYXkgdG8gcGFyc2UuICovCi0gIHN3aXRjaCAob3BlcmFuZC0+c2hpZnQpCi0gICAgewotICAgIGNhc2UgMHhmZmUwMDAwMTogcmVncyA9IHR5cGUxX3JlZ3M7IGJyZWFrOwotICAgIGNhc2UgMHhmZmY4MDAwZjogcmVncyA9IHR5cGUyX3JlZ3M7IGJyZWFrOwotICAgIGNhc2UgMHhmZmY4MDAxZjogcmVncyA9IHR5cGUzX3JlZ3M7IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3BlcmFuZCBzaGlmdDogJXhcbiIpLCBvcGVyYW5kLT5zaGlmdCk7Ci0gICAgICByZXR1cm4gXygiaW50ZXJuYWwgZmFpbHVyZSBpbiBwYXJzZV9yZWdpc3Rlcl9saXN0Iik7Ci0gICAgfQotCi0gIHNraXBfd2hpdGVfc3BhY2UgKCk7Ci0KLSAgLyogSWYgdGhlIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggYSBjdXJseSBicmFjZSBpdCBpcyBhIHJlZ2lzdGVyIGxpc3QuCi0gICAgIE90aGVyd2lzZSBpdCBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24sIHdob2VzIGJpdHMgaW5kaWNhdGUgd2hpY2gKLSAgICAgcmVnaXN0ZXJzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdC4gICovCi0gIAotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgIT0gJ3snKQotICAgIHsKLSAgICAgIGludCBiaXRzOwotICAgICAgaW50IHJlZzsKLSAgICAgIGludCBpOwotCQkKLSAgICAgIGV4cHJlc3Npb24gKCYgZXhwKTsKLSAgICAgIAotICAgICAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JcmV0dXJuIF8oImNvbnN0YW50IGV4cHJlc3Npb24gb3IgcmVnaXN0ZXIgbGlzdCBleHBlY3RlZCIpOwotCi0gICAgICBpZiAocmVncyA9PSB0eXBlMV9yZWdzKQotCXsKLQkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgMHhGRkZGRjAwMCkKLQkgICAgcmV0dXJuIF8oImhpZ2ggYml0cyBzZXQgaW4gcmVnaXN0ZXIgbGlzdCBleHByZXNzaW9uIik7Ci0JICAKLQkgIGZvciAocmVnID0gMjA7IHJlZyA8IDMyOyByZWcgKyspCi0JICAgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgKHJlZyAtIDIwKSkpCi0JICAgICAgewotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJICBpZiAocmVnc1tpXSA9PSByZWcpCi0JCSAgICAqIGluc24gfD0gKDEgPDwgaSk7Ci0JICAgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHJlZ3MgPT0gdHlwZTJfcmVncykKLQl7Ci0JICBpZiAoZXhwLlhfYWRkX251bWJlciAmIDB4RkZGRTAwMDApCi0JICAgIHJldHVybiBfKCJoaWdoIGJpdHMgc2V0IGluIHJlZ2lzdGVyIGxpc3QgZXhwcmVzc2lvbiIpOwotCSAgCi0JICBmb3IgKHJlZyA9IDE7IHJlZyA8IDE2OyByZWcgKyspCi0JICAgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgKHJlZyAtIDEpKSkKLQkgICAgICB7Ci0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQkgIGlmIChyZWdzW2ldID09IHJlZykKLQkJICAgICogaW5zbiB8PSAoMSA8PCBpKTsKLQkgICAgICB9Ci0KLQkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgMTUpKQotCSAgICAqIGluc24gfD0gKDEgPDwgMyk7Ci0JICAKLQkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgMTYpKQotCSAgICAqIGluc24gfD0gKDEgPDwgMTkpOwotCX0KLSAgICAgIGVsc2UgLyogcmVncyA9PSB0eXBlM19yZWdzICovCi0JewotCSAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAweEZGRkUwMDAwKQotCSAgICByZXR1cm4gXygiaGlnaCBiaXRzIHNldCBpbiByZWdpc3RlciBsaXN0IGV4cHJlc3Npb24iKTsKLQkgIAotCSAgZm9yIChyZWcgPSAxNjsgcmVnIDwgMzI7IHJlZyArKykKLQkgICAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAoMSA8PCAocmVnIC0gMTYpKSkKLQkgICAgICB7Ci0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQkgIGlmIChyZWdzW2ldID09IHJlZykKLQkJICAgICogaW5zbiB8PSAoMSA8PCBpKTsKLQkgICAgICB9Ci0KLQkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgMTYpKQotCSAgICAqIGluc24gfD0gKDEgPDwgMTkpOwotCX0KLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciArKzsKLQotICAvKiBQYXJzZSB0aGUgcmVnaXN0ZXIgbGlzdCB1bnRpbCBhIHRlcm1pbmF0b3IgKGNsb3NpbmcgY3VybHkgYnJhY2Ugb3IKLSAgICAgbmV3LWxpbmUpIGlzIGZvdW5kLiAgKi8KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBpZiAocmVnaXN0ZXJfbmFtZSAoJiBleHApKQotCXsKLQkgIGludCAgaTsKLQkgIAotCSAgLyogTG9jYXRlIHRoZSBnaXZlbiByZWdpc3RlciBpbiB0aGUgbGlzdCwgYW5kIGlmIGl0IGlzIHRoZXJlLAotCSAgICAgaW5zZXJ0IHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChyZWdzWyBpIF0gPT0gZXhwLlhfYWRkX251bWJlcikKLQkJewotCQkgICogaW5zbiB8PSAoMSA8PCBpKTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpID09IDMyKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIF8oImlsbGVnYWwgcmVnaXN0ZXIgaW5jbHVkZWQgaW4gbGlzdCIpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3lzdGVtX3JlZ2lzdGVyX25hbWUgKCYgZXhwLCB0cnVlLCB0cnVlKSkKLQl7Ci0JICBpZiAocmVncyA9PSB0eXBlMV9yZWdzKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIF8oInN5c3RlbSByZWdpc3RlcnMgY2Fubm90IGJlIGluY2x1ZGVkIGluIGxpc3QiKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXhwLlhfYWRkX251bWJlciA9PSA1KQotCSAgICB7Ci0JICAgICAgaWYgKHJlZ3MgPT0gdHlwZTJfcmVncykKLQkJcmV0dXJuIF8oIlBTVyBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gbGlzdCIpOwotCSAgICAgIGVsc2UKLQkJKiBpbnNuIHw9IDB4ODsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXhwLlhfYWRkX251bWJlciA8IDQpCi0JICAgICogaW5zbiB8PSAweDgwMDAwOwotCSAgZWxzZQotCSAgICByZXR1cm4gXygiSGlnaCB2YWx1ZSBzeXN0ZW0gcmVnaXN0ZXJzIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBsaXN0Iik7Ci0JfQotICAgICAgZWxzZSBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJ30nKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArKzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0JewotCSAgLyogV2UgaGF2ZSBlbmNvdW50ZXJlZCBhIHJhbmdlIG9mIHJlZ2lzdGVyczogclggLSByWSAqLwotCSAgaW50ICAgICAgICAgajsKLQkgIGV4cHJlc3Npb25TIGV4cDI7Ci0KLQkgIC8qIFNraXAgdGhlIGRhc2guICAqLwotCSAgKysgaW5wdXRfbGluZV9wb2ludGVyOwotCi0JICAvKiBHZXQgdGhlIHNlY29uZCByZWdpc3RlciBpbiB0aGUgcmFuZ2UuICAqLwotCSAgaWYgKCEgcmVnaXN0ZXJfbmFtZSAoJiBleHAyKSkKLQkgICAgewotCSAgICAgIHJldHVybiBfKCJzZWNvbmQgcmVnaXN0ZXIgc2hvdWxkIGZvbGxvdyBkYXNoIGluIHJlZ2lzdGVyIGxpc3QiKTsKLQkgICAgICBleHAyLlhfYWRkX251bWJlciA9IGV4cC5YX2FkZF9udW1iZXI7Ci0JICAgIH0KLQotCSAgLyogQWRkIHRoZSByZXN0IG9mIHRoZSByZWdpc3RlcnMgaW4gdGhlIHJhbmdlLiAgKi8KLQkgIGZvciAoaiA9IGV4cC5YX2FkZF9udW1iZXIgKyAxOyBqIDw9IGV4cDIuWF9hZGRfbnVtYmVyOyBqKyspCi0JICAgIHsKLQkgICAgICBpbnQgIGk7Ci0JICAKLQkgICAgICAvKiBMb2NhdGUgdGhlIGdpdmVuIHJlZ2lzdGVyIGluIHRoZSBsaXN0LCBhbmQgaWYgaXQgaXMgdGhlcmUsCi0JCSBpbnNlcnQgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJewotCQkgIGlmIChyZWdzWyBpIF0gPT0gaikKLQkJICAgIHsKLQkJICAgICAgKiBpbnNuIHw9ICgxIDw8IGkpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKGkgPT0gMzIpCi0JCXJldHVybiBfKCJpbGxlZ2FsIHJlZ2lzdGVyIGluY2x1ZGVkIGluIGxpc3QiKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHNraXBfd2hpdGVfc3BhY2UgKCk7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi1DT05TVCBjaGFyICogbWRfc2hvcnRvcHRzID0gIm06IjsKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIG1kX2xvbmdvcHRzOyAKLQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKiBzdHJlYW07Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiIFY4NTAgb3B0aW9uczpcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1td2Fybi1zaWduZWQtb3ZlcmZsb3cgICAgV2FybiBpZiBzaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvd1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiAgLW13YXJuLXVuc2lnbmVkLW92ZXJmbG93ICBXYXJuIGlmIHVuc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgb3ZlcmZsb3dcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1tdjg1MCAgICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgdGFyZ2V0ZWQgYXQgdGhlIHY4NTBcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1tdjg1MGUgICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgdGFyZ2V0ZWQgYXQgdGhlIHY4NTBlXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiICAtbXY4NTBlYSAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIHRhcmdldGVkIGF0IHRoZSB2ODUwZWFcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1tdjg1MGFueSAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgZ2VuZXJpYywgZGVzcGl0ZSBhbnkgcHJvY2Vzc29yIHNwZWNpZmljIGluc3RydWN0aW9uc1xuIikpOwotfQotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgICAgYzsKLSAgICAgY2hhciAqIGFyZzsKLXsKLSAgaWYgKGMgIT0gJ20nKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oInVua25vd24gY29tbWFuZCBsaW5lIG9wdGlvbjogLSVjJXNcbiIpLCBjLCBhcmcpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKGFyZywgIndhcm4tc2lnbmVkLW92ZXJmbG93IikgPT0gMCkKLSAgICB7Ci0gICAgICB3YXJuX3NpZ25lZF9vdmVyZmxvd3MgPSBUUlVFOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ3YXJuLXVuc2lnbmVkLW92ZXJmbG93IikgPT0gMCkKLSAgICB7Ci0gICAgICB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cyA9IFRSVUU7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInY4NTAiKSA9PSAwKQotICAgIHsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAidjg1MGUiKSA9PSAwKQotICAgIHsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF92ODUwZTsKLSAgICAgIHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ2ODUwZWEiKSA9PSAwKQotICAgIHsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF92ODUwZWE7Ci0gICAgICBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRUE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInY4NTBhbnkiKSA9PSAwKQotICAgIHsKLSAgICAgIG1hY2hpbmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogVGVsbCB0aGUgd29ybGQgdGhhdCB0aGlzIGlzIGZvciBhbnkgdjg1MCBjaGlwLiAgKi8KLSAgICAgIHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFQTsgLyogQnV0IHN1cHBvcnQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgZXh0ZW5kZWQgdmVyc2lvbnMuICAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oInVua25vd24gY29tbWFuZCBsaW5lIG9wdGlvbjogLSVjJXNcbiIpLCBjLCBhcmcpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqIG5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdHAsIHNpemVwKQotICBpbnQgICAgdHlwZTsKLSAgY2hhciAqIGxpdHA7Ci0gIGludCAqICBzaXplcDsKLXsKLSAgaW50ICAgICAgICAgICAgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKiAgICAgICAgIHQ7Ci0gIGludCAgICAgICAgICAgIGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVwID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mIik7Ci0gICAgfQotICAKLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVwID0gcHJlYyAqIDI7Ci0KLSAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0cCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotICAgICAgbGl0cCArPSAyOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotCi0vKiBWZXJ5IGdyb3NzLiAgKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgYmZkICogICAgICBhYmZkOwotICBhc2VjdGlvbiAqIHNlYzsKLSAgZnJhZ1MgKiAgICBmcmFnUDsKLXsKLSAgc3Vic2VnX2NoYW5nZSAoc2VjLCAwKTsKLSAgCi0gIC8qIEluIHJhbmdlIGNvbmRpdGlvbmFsIG9yIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDAgfHwgZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMikKLSAgICB7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DX1VOVVNFRCArIChpbnQpZnJhZ1AtPmZyX29wY29kZSk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICB9Ci0gIC8qIE91dCBvZiByYW5nZSBjb25kaXRpb25hbCBicmFuY2guICBFbWl0IGEgYnJhbmNoIGFyb3VuZCBhIGp1bXAuICAqLwotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IAotCSh1bnNpZ25lZCBjaGFyICopIChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWwpOwotCi0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBidWZmZXJbMF0gXj0gMHgwODsKLSAgICAgIC8qIE1hc2sgb2ZmIGFsbCB0aGUgZGlzcGxhY2VtZW50IGJpdHMuICAqLwotICAgICAgYnVmZmVyWzBdICY9IDB4OGY7Ci0gICAgICBidWZmZXJbMV0gJj0gMHgwNzsKLSAgICAgIC8qIE5vdyBzZXQgdGhlIGRpc3BsYWNlbWVudCBiaXRzIHNvIHRoYXQgd2UgYnJhbmNoCi0JIGFyb3VuZCB0aGUgdW5jb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgYnVmZmVyWzBdIHw9IDB4MzA7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlIGZpbmFsCi0JIHRhcmdldC4gICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZmZlciArIDIsIDB4MDAwMDA3ODAsIDQpOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfVU5VU0VEICsKLQkgICAgICAgKGludCkgZnJhZ1AtPmZyX29wY29kZSArIDEpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDY7Ci0gICAgfQotICAvKiBPdXQgb2YgcmFuZ2UgdW5jb25kaXRpb25hbCBicmFuY2guICBFbWl0IGEganVtcC4gICovCi0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDMpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWwsIDB4MDAwMDA3ODAsIDQpOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ19VTlVTRUQgKwotCSAgICAgICAoaW50KSBmcmFnUC0+ZnJfb3Bjb2RlICsgMSk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICogc2VnOwotICAgICB2YWx1ZVQgICAgIGFkZHI7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKLSAgcmV0dXJuICgoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfbmFtZSA9ICIiOwotICByZWdpc3RlciBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGNvZGUgKiBvcDsKLSAgZmxhZ3dvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZTsKLQotICBpZiAoc3RybmNtcCAoVEFSR0VUX0NQVSwgInY4NTBlYSIsIDYpID09IDApCi0gICAgewotICAgICAgaWYgKG1hY2hpbmUgPT0gLTEpCi0JbWFjaGluZSA9IGJmZF9tYWNoX3Y4NTBlYTsKLSAgICAgIAotICAgICAgaWYgKHByb2Nlc3Nvcl9tYXNrID09IC0xKQotCXByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFQTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKFRBUkdFVF9DUFUsICJ2ODUwZSIsIDUpID09IDApCi0gICAgewotICAgICAgaWYgKG1hY2hpbmUgPT0gLTEpCi0JbWFjaGluZSAgICAgICAgPSBiZmRfbWFjaF92ODUwZTsKLSAgICAgIAotICAgICAgaWYgKHByb2Nlc3Nvcl9tYXNrID09IC0xKQotCXByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFOwotICAgIH0KLSAgZWxzZQotICBpZiAoc3RybmNtcCAoVEFSR0VUX0NQVSwgInY4NTAiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChtYWNoaW5lID09IC0xKQotCW1hY2hpbmUgICAgICAgID0gMDsKLSAgICAgIAotICAgICAgaWYgKHByb2Nlc3Nvcl9tYXNrID09IC0xKQotCXByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTA7Ci0gICAgfQotICBlbHNlCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBhc19iYWQgKF8oIlVuYWJsZSB0byBkZXRlcm1pbmUgZGVmYXVsdCB0YXJnZXQgcHJvY2Vzc29yIGZyb20gc3RyaW5nOiAlcyIpLCAKLSAgICAgICAgICAgIFRBUkdFVF9DUFUpOwotCi0gIHY4NTBfaGFzaCA9IGhhc2hfbmV3KCk7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUuICBUaGUgVjg1MCBpbnN0cnVjdGlvbiBzZXQKLSAgICAgaGFzIG1hbnkgaWRlbnRpY2FsIG9wY29kZSBuYW1lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG9wY29kZXMgYmFzZWQKLSAgICAgb24gdGhlIG9wZXJhbmRzLiAgVGhpcyBoYXNoIHRhYmxlIHRoZW4gcHJvdmlkZXMgYSBxdWljayBpbmRleCB0bwotICAgICB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLSAgb3AgPSB2ODUwX29wY29kZXM7Ci0gIHdoaWxlIChvcC0+bmFtZSkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wLT5uYW1lKSkgCi0JewotCSAgcHJldl9uYW1lID0gKGNoYXIgKikgb3AtPm5hbWU7Ci0JICBoYXNoX2luc2VydCAodjg1MF9oYXNoLCBvcC0+bmFtZSwgKGNoYXIgKikgb3ApOwotCX0KLSAgICAgIG9wKys7Ci0gICAgfQotCi0gIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILCBtYWNoaW5lKTsKLQotICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLSAgCi0gIGNhbGxfdGFibGVfZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5jYWxsX3RhYmxlX2RhdGEiLCAwKTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGNhbGxfdGFibGVfZGF0YV9zZWN0aW9uLAotCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKLQkJCQkgICAgICAgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLSAgCi0gIGNhbGxfdGFibGVfdGV4dF9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5jYWxsX3RhYmxlX3RleHQiLCAwKTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGNhbGxfdGFibGVfdGV4dF9zZWN0aW9uLAotCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkKLQkJCQkgICAgICAgfCBTRUNfQ09ERSkpOwotICAKLSAgLyogUmVzdG9yZSB0ZXh0IHNlY3Rpb24gYXMgdGhlIGN1cnJlbnQgZGVmYXVsdC4gICovCi0gIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotaGFuZGxlX2N0b2ZmIChjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZCkKLXsKLSAgaWYgKG9wZXJhbmQgPT0gTlVMTCkKLSAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUOwotCi0gIGlmICggICBvcGVyYW5kLT5iaXRzICAhPSA2Ci0gICAgICB8fCBvcGVyYW5kLT5zaGlmdCAhPSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiY3RvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIpKTsKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfNjQ7ICAvKiBVc2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCi0gICAgfQotICAgICAgCi0gIHJldHVybiBCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VUOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1oYW5kbGVfc2Rhb2ZmIChjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZCkKLXsKLSAgaWYgKG9wZXJhbmQgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VUOwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSAxNSAmJiBvcGVyYW5kLT5zaGlmdCA9PSAxNykgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1NEQV8xNV8xNl9PRkZTRVQ7Ci0gIGlmIChvcGVyYW5kLT5iaXRzID09IC0xKSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVDsKLSAgCi0gIGlmICggICBvcGVyYW5kLT5iaXRzICAhPSAxNgotICAgICAgfHwgb3BlcmFuZC0+c2hpZnQgIT0gMTYpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIpKTsKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfNjQ7ICAvKiBVc2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCi0gICAgfQotICAKLSAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQ7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLWhhbmRsZV96ZGFvZmYgKGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kKQotewotICBpZiAob3BlcmFuZCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQ7Ci0gIGlmIChvcGVyYW5kLT5iaXRzID09IDE1ICYmIG9wZXJhbmQtPnNoaWZ0ID09IDE3KSByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfWkRBXzE1XzE2X09GRlNFVDsKLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUOwotCi0gIGlmICggICBvcGVyYW5kLT5iaXRzICAhPSAxNgotICAgICAgfHwgb3BlcmFuZC0+c2hpZnQgIT0gMTYpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ6ZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIpKTsKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfNjQ7ICAvKiBVc2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCi0gICAgfQotICAKLSAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQ7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLWhhbmRsZV90ZGFvZmYgKGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kKQotewotICBpZiAob3BlcmFuZCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQ7ICAvKiBkYXRhIGl0ZW0sIG5vdCBhbiBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChvcGVyYW5kLT5iaXRzID09IDYgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMSkgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9UREFfNl84X09GRlNFVDsgIC8qIHNsZC53L3NzdC53LCBvcGVyYW5kOiBEOF82ICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSA0ICYmIG9wZXJhbmQtPmluc2VydCAhPSBOVUxMKSByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQ7ICAvKiBzbGQuaHUsIG9wZXJhbmQ6IEQ1LTQgKi8KLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gNCAmJiBvcGVyYW5kLT5pbnNlcnQgPT0gTlVMTCkgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1REQV80XzRfT0ZGU0VUOyAgLyogc2xkLmJ1LCBvcGVyYW5kOiBENCAgICovCi0gIGlmIChvcGVyYW5kLT5iaXRzID09IDE2ICYmIG9wZXJhbmQtPnNoaWZ0ID09IDE2KSAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VUOyAvKiBzZXQxICYgY2h1bXMsIG9wZXJhbmRzOiBEMTYgKi8KLSAgCi0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ0ZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIpKTsKLSAgICAgIHJldHVybiBCRkRfUkVMT0NfNjQ7ICAvKiBVc2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCi0gICAgfQotICAKLSAgcmV0dXJuICBvcGVyYW5kLT5pbnNlcnQgIT0gTlVMTAotICAgID8gQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQgICAgIC8qIHNsZC5oL3NzdC5oLCBvcGVyYW5kOiBEOF83ICovCi0gICAgOiBCRkRfUkVMT0NfVjg1MF9UREFfN183X09GRlNFVDsgICAgLyogc2xkLmIvc3N0LmIsIG9wcmVhbmQ6IEQ3ICAgKi8KLX0KLQotLyogV2FybmluZzogVGhlIGNvZGUgaW4gdGhpcyBmdW5jdGlvbiByZWxpZXMgdXBvbiB0aGUgZGVmaW5pdGlvbnMKLSAgIGluIHRoZSB2ODUwX29wZXJhbmRzW10gYXJyYXkgKGRlZmluZWQgaW4gb3Bjb2Rlcy92ODUwLW9wYy5jKQotICAgbWF0Y2hpbmcgdGhlIGhhcmQgY29kZWQgdmFsdWVzIGNvbnRhaW5lZCBoZXJlaW4uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi12ODUwX3JlbG9jX3ByZWZpeCAoY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQpCi17Ci0gIGJvb2xlYW4gcGFyZW5fc2tpcHBlZCA9IGZhbHNlOwotCi0KLSAgLyogU2tpcCBsZWFkaW5nIG9wZW5pbmcgcGFyZW50aGVzaXMuICAqLwotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJygnKQotICAgIHsKLSAgICAgICsrIGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHBhcmVuX3NraXBwZWQgPSB0cnVlOwotICAgIH0KLQotI2RlZmluZSBDSEVDS18obmFtZSwgcmVsb2MpIAkJCQkJCVwKLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgbmFtZSMjIigiLCBzdHJsZW4gKG5hbWUpICsgMSkgPT0gMCkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gc3RybGVuIChuYW1lKTsJCQkJXAotICAgICAgcmV0dXJuIHJlbG9jOwkJCQkJCQlcCi0gICAgfQotICAKLSAgQ0hFQ0tfICgiaGkwIiwgICAgQkZEX1JFTE9DX0hJMTYpOwotICBDSEVDS18gKCJoaSIsICAgICBCRkRfUkVMT0NfSEkxNl9TKTsKLSAgQ0hFQ0tfICgibG8iLCAgICAgQkZEX1JFTE9DX0xPMTYpOwotICBDSEVDS18gKCJzZGFvZmYiLCBoYW5kbGVfc2Rhb2ZmIChvcGVyYW5kKSk7Ci0gIENIRUNLXyAoInpkYW9mZiIsIGhhbmRsZV96ZGFvZmYgKG9wZXJhbmQpKTsKLSAgQ0hFQ0tfICgidGRhb2ZmIiwgaGFuZGxlX3RkYW9mZiAob3BlcmFuZCkpOwotICBDSEVDS18gKCJoaWxvIiwgICBCRkRfUkVMT0NfMzIpOwotICBDSEVDS18gKCJjdG9mZiIsICBoYW5kbGVfY3RvZmYgKG9wZXJhbmQpKTsKLSAgCi0gIC8qIFJlc3RvcmUgc2tpcHBlZCBwYXJlbnRoZXNpcy4gICovCi0gIGlmIChwYXJlbl9za2lwcGVkKQotICAgIC0tIGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgCi0gIHJldHVybiBCRkRfUkVMT0NfVU5VU0VEOwotfQotCi0vKiBJbnNlcnQgYW4gb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXY4NTBfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIHZhbCwgZmlsZSwgbGluZSwgc3RyKQotICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgICAgICAgICAgICAgICAgICAgICB2YWw7Ci0gICAgIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICBmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgbGluZTsKLSAgICAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIHN0cjsKLXsKLSAgaWYgKG9wZXJhbmQtPmluc2VydCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICogbWVzc2FnZSA9IE5VTEw7Ci0gICAgICAKLSAgICAgIGluc24gPSBvcGVyYW5kLT5pbnNlcnQgKGluc24sIHZhbCwgJiBtZXNzYWdlKTsKLSAgICAgIGlmIChtZXNzYWdlICE9IE5VTEwpCi0JewotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCi0JICAgICAgJiYgISB3YXJuX3NpZ25lZF9vdmVyZmxvd3MKLQkgICAgICAmJiBzdHJzdHIgKG1lc3NhZ2UsICJvdXQgb2YgcmFuZ2UiKSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogc2tpcCB3YXJuaW5nLi4uICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpID09IDAKLQkJICAgJiYgISB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cwotCQkgICAmJiBzdHJzdHIgKG1lc3NhZ2UsICJvdXQgb2YgcmFuZ2UiKSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogc2tpcCB3YXJuaW5nLi4uICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cikKLQkgICAgewotCSAgICAgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0JCWFzX3dhcm4gKCIlczogJXMiLCBzdHIsIG1lc3NhZ2UpOwotCSAgICAgIGVsc2UKLQkJYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgIiVzOiAlcyIsIHN0ciwgbWVzc2FnZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0JCWFzX3dhcm4gKG1lc3NhZ2UpOwotCSAgICAgIGVsc2UKLQkJYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgbWVzc2FnZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG9wZXJhbmQtPmJpdHMgIT0gMzIpCi0JewotCSAgbG9uZyAgICBtaW4sIG1heDsKLQkgIG9mZnNldFQgdGVzdDsKLQotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISB3YXJuX3NpZ25lZF9vdmVyZmxvd3MpCi0JCW1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgICAgICBlbHNlCi0JCW1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgICAgICAKLQkgICAgICBtaW4gPSAtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0JICAgICAgCi0JICAgICAgaWYgKCEgd2Fybl91bnNpZ25lZF9vdmVyZmxvd3MpCi0JCW1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7Ci0JICAgICAgZWxzZQotCQltaW4gPSAwOwotCSAgICB9Ci0JICAKLQkgIGlmICh2YWwgPCAob2Zmc2V0VCkgbWluIHx8IHZhbCA+IChvZmZzZXRUKSBtYXgpCi0JICAgIHsKLQkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICAgIGNvbnN0IGNoYXIgKiBlcnIgPSBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7Ci0JICAgICAgY2hhciAgICAgICAgIGJ1ZlsxMDBdOwotCSAgICAgIAotCSAgICAgIC8qIFJlc3RvcmUgbWluIGFuZCBtaXggdG8gZXhwZWN0ZWQgdmFsdWVzIGZvciBkZWNpbWFsIHJhbmdlcy4gICovCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCi0JCSAgJiYgISB3YXJuX3NpZ25lZF9vdmVyZmxvd3MpCi0JCW1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQotCSAgICAgIGlmICghIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCi0JCSAgJiYgISB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cykKLQkJbWluID0gMDsKLQotCSAgICAgIGlmIChzdHIpCi0JCXsKLQkJICBzcHJpbnRmIChidWYsICIlczogIiwgc3RyKTsKLQkJICAKLQkJICBzcHJpbnRfdmFsdWUgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgdmFsKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJc3ByaW50X3ZhbHVlIChidWYsIHZhbCk7Ci0JICAgICAgCi0JICAgICAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKLQkJYXNfd2FybiAoZXJyLCBidWYsIG1pbiwgbWF4KTsKLQkgICAgICBlbHNlCi0JCWFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluc24gfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLSAgICB9Ci0gIAotICByZXR1cm4gaW5zbjsKLX0KLQotDAotc3RhdGljIGNoYXIgICAgICAgICAgICAgICAgIGNvcHlfb2ZfaW5zdHJ1Y3Rpb24gWzEyOF07Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpIAotICAgICBjaGFyICogc3RyOwotewotICBjaGFyICogICAgICAgICAgICAgICAgICAgIHM7Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgc3RhcnRfb2Zfb3BlcmFuZHM7Ci0gIHN0cnVjdCB2ODUwX29wY29kZSAqICAgICAgb3Bjb2RlOwotICBzdHJ1Y3Qgdjg1MF9vcGNvZGUgKiAgICAgIG5leHRfb3Bjb2RlOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICogICAgIG9waW5kZXhfcHRyOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgIG5leHRfb3BpbmRleDsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICByZWxheGFibGU7Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICBpbnNuX3NpemU7Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgZjsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICBpOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOwotICBib29sZWFuICAgICAgICAgICAgICAgICAgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IGZhbHNlOwotICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgIGV4dHJhX2RhdGFfbGVuOwotICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgIGV4dHJhX2RhdGE7Ci0gIGNoYXIgKgkJICAgIHNhdmVkX2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICAKLSAgc3RybmNweSAoY29weV9vZl9pbnN0cnVjdGlvbiwgc3RyLCBzaXplb2YgKGNvcHlfb2ZfaW5zdHJ1Y3Rpb24pIC0gMSk7Ci0gIAotICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0gIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhIGlzc3BhY2UgKCpzKTsgcysrKQotICAgIGNvbnRpbnVlOwotICAKLSAgaWYgKCpzICE9ICdcMCcpCi0gICAgKnMrKyA9ICdcMCc7Ci0KLSAgLyogZmluZCB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggdGhlIHByb3BlciBuYW1lICovCi0gIG9wY29kZSA9IChzdHJ1Y3Qgdjg1MF9vcGNvZGUgKikgaGFzaF9maW5kICh2ODUwX2hhc2gsIHN0cik7Ci0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdHIgPSBzOwotICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQotICAgICsrIHN0cjsKLQotICBzdGFydF9vZl9vcGVyYW5kcyA9IHN0cjsKLQotICBzYXZlZF9pbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIAotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKiBlcnJtc2cgPSBOVUxMOwotCi0gICAgICBtYXRjaCA9IDA7Ci0gICAgICAKLSAgICAgIGlmICgob3Bjb2RlLT5wcm9jZXNzb3JzICYgcHJvY2Vzc29yX21hc2spID09IDApCi0JewotCSAgZXJybXNnID0gXygiVGFyZ2V0IHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgaW5zdHJ1Y3Rpb24uIik7Ci0JICBnb3RvIGVycm9yOwotCX0KLSAgICAgIAotICAgICAgcmVsYXhhYmxlID0gMDsKLSAgICAgIGZjID0gMDsKLSAgICAgIG5leHRfb3BpbmRleCA9IDA7Ci0gICAgICBpbnNuID0gb3Bjb2RlLT5vcGNvZGU7Ci0gICAgICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSBmYWxzZTsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyID0gc3RhcnRfb2Zfb3BlcmFuZHM7Ci0KLSAgICAgIGZvciAob3BpbmRleF9wdHIgPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleF9wdHIgIT0gMDsgb3BpbmRleF9wdHIgKyspCi0JewotCSAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQ7Ci0JICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgaG9sZDsKLQkgIGV4cHJlc3Npb25TICAgICAgICAgICAgICAgICBleDsKLQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgICByZWxvYzsKLQotCSAgaWYgKG5leHRfb3BpbmRleCA9PSAwKQotCSAgICB7Ci0JICAgICAgb3BlcmFuZCA9ICYgdjg1MF9vcGVyYW5kc1sgKiBvcGluZGV4X3B0ciBdOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvcGVyYW5kICAgICAgPSAmIHY4NTBfb3BlcmFuZHNbIG5leHRfb3BpbmRleCBdOwotCSAgICAgIG5leHRfb3BpbmRleCA9IDA7Ci0JICAgIH0KLQotCSAgZXJybXNnID0gTlVMTDsKLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnIHx8ICpzdHIgPT0gJ1snIHx8ICpzdHIgPT0gJ10nKQotCSAgICArKyBzdHI7Ci0KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUxBWCkKLQkgICAgcmVsYXhhYmxlID0gMTsKLQotCSAgLyogR2F0aGVyIHRoZSBvcGVyYW5kLiAqLwotCSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQkgIAotCSAgLyogbG8oKSwgaGkoKSwgaGkwKCksIGV0Yy4uLiAqLwotCSAgaWYgKChyZWxvYyA9IHY4NTBfcmVsb2NfcHJlZml4IChvcGVyYW5kKSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBmYWtlIHJlbG9jLCB1c2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCi0JICAgICAgaWYgKHJlbG9jID09IEJGRF9SRUxPQ182NCkKLQkJewotCQkgIG1hdGNoID0gMTsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JCSAKLQkgICAgICBleHByZXNzaW9uICgmIGV4KTsKLQotCSAgICAgIGlmIChleC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBzd2l0Y2ggKHJlbG9jKQotCQkgICAgewotCQkgICAgY2FzZSBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOgotCQkgICAgICAvKiBUbyBjb3BlIHdpdGggIm5vdDEgNywgemRhb2ZmKDB4ZmZmZmYwMDYpW3IwXSIKLQkJCSBhbmQgdGhlIGxpa2UuICAqLwotCQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCQkgICAgICAKLQkJICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6Ci0JCSAgICAgIHsKLQkJCS8qIFRydW5jYXRlLCB0aGVuIHNpZ24gZXh0ZW5kIHRoZSB2YWx1ZS4gICovCi0JCQlleC5YX2FkZF9udW1iZXIgPSBTRVhUMTYgKGV4LlhfYWRkX251bWJlcik7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCi0JCSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgotCQkgICAgICB7Ci0JCQkvKiBUcnVuY2F0ZSwgdGhlbiBzaWduIGV4dGVuZCB0aGUgdmFsdWUuICAqLwotCQkJZXguWF9hZGRfbnVtYmVyID0gU0VYVDE2IChleC5YX2FkZF9udW1iZXIgPj4gMTYpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQotCQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotCQkgICAgICB7Ci0JCQkvKiBUcnVuY2F0ZSwgdGhlbiBzaWduIGV4dGVuZCB0aGUgdmFsdWUuICAqLwotCQkgICAgICAgIGludCB0ZW1wID0gKGV4LlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7Ci0KLQkJCXRlbXAgKz0gKGV4LlhfYWRkX251bWJlciA+PiAxNSkgJiAxOwotCi0JCQlleC5YX2FkZF9udW1iZXIgPSBTRVhUMTYgKHRlbXApOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIAotCQkgICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0JCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwRV9JTU1FRElBVEUzMikgPT0gMCkKLQkJCXsKLQkJCSAgZXJybXNnID0gXygiaW1tZWRpYXRlIG9wZXJhbmQgaXMgdG9vIGxhcmdlIik7Ci0JCQkgIGdvdG8gZXJyb3I7Ci0JCQl9Ci0JCSAgICAgIAotCQkgICAgICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSB0cnVlOwotCQkgICAgICBleHRyYV9kYXRhX2xlbiAgICAgICAgPSA0OwotCQkgICAgICBleHRyYV9kYXRhICAgICAgICAgICAgPSBleC5YX2FkZF9udW1iZXI7Ci0JCSAgICAgIGV4LlhfYWRkX251bWJlciAgICAgICA9IDA7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgICAKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInJlbG9jOiAlZFxuIiwgcmVsb2MpOwotCQkgICAgICBhc19iYWQgKF8oIkFBQVJHIC0+IHVuaGFuZGxlZCBjb25zdGFudCByZWxvYyIpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBpZiAoZmMgPiBNQVhfSU5TTl9GSVhVUFMpCi0JCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCQkgIAotCQkgIGZpeHVwc1sgZmMgXS5leHAgICAgID0gZXg7Ci0JCSAgZml4dXBzWyBmYyBdLm9waW5kZXggPSAqIG9waW5kZXhfcHRyOwotCQkgIGZpeHVwc1sgZmMgXS5yZWxvYyAgID0gcmVsb2M7Ci0JCSAgZmMrKzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChyZWxvYyA9PSBCRkRfUkVMT0NfMzIpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwRV9JTU1FRElBVEUzMikgPT0gMCkKLQkJCXsKLQkJCSAgZXJybXNnID0gXygiaW1tZWRpYXRlIG9wZXJhbmQgaXMgdG9vIGxhcmdlIik7Ci0JCQkgIGdvdG8gZXJyb3I7Ci0JCQl9Ci0JCSAgICAgIAotCQkgICAgICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSB0cnVlOwotCQkgICAgICBleHRyYV9kYXRhX2xlbiAgICAgICAgPSA0OwotCQkgICAgICBleHRyYV9kYXRhICAgICAgICAgICAgPSBleC5YX2FkZF9udW1iZXI7Ci0JCSAgICB9Ci0JCSAgICAgIAotCQkgIGlmIChmYyA+IE1BWF9JTlNOX0ZJWFVQUykKLQkJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0KLQkJICBmaXh1cHNbIGZjIF0uZXhwICAgICA9IGV4OwotCQkgIGZpeHVwc1sgZmMgXS5vcGluZGV4ID0gKiBvcGluZGV4X3B0cjsKLQkJICBmaXh1cHNbIGZjIF0ucmVsb2MgICA9IHJlbG9jOwotCQkgIGZjKys7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXJybXNnID0gTlVMTDsKLQkgICAgICAKLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFRykgIT0gMCkgCi0JCXsKLQkJICBpZiAoIXJlZ2lzdGVyX25hbWUgKCYgZXgpKQotCQkgICAgewotCQkgICAgICBlcnJtc2cgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIG5hbWUiKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX05PVF9SMCkKLQkJICAgICAgJiYgZXguWF9hZGRfbnVtYmVyID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGVycm1zZyA9IF8oInJlZ2lzdGVyIHIwIGNhbm5vdCBiZSB1c2VkIGhlcmUiKTsKLQkJICAgICAgCi0JCSAgICAgIC8qIEZvcmNlIGFuIGVycm9yIG1lc3NhZ2UgdG8gYmUgZ2VuZXJhdGVkIGJ5Ci0JCQkgc2tpcHBpbmcgb3ZlciBhbnkgZm9sbG93aW5nIHBvdGVudGlhbCBtYXRjaGVzCi0JCQkgZm9yIHRoaXMgb3Bjb2RlLiAgKi8KLQkJICAgICAgb3Bjb2RlICs9IDM7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU1JHKSAhPSAwKSAKLQkJewotCQkgIGlmICghc3lzdGVtX3JlZ2lzdGVyX25hbWUgKCYgZXgsIHRydWUsIGZhbHNlKSkKLQkJICAgIHsKLQkJICAgICAgZXJybXNnID0gXygiaW52YWxpZCBzeXN0ZW0gcmVnaXN0ZXIgbmFtZSIpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX0VQKSAhPSAwKQotCQl7Ci0JCSAgY2hhciAqIHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQkgIGNoYXIgICBjICAgICA9IGdldF9zeW1ib2xfZW5kICgpOwotCQkgIAotCQkgIGlmIChzdHJjbXAgKHN0YXJ0LCAiZXAiKSAhPSAwICYmIHN0cmNtcCAoc3RhcnQsICJyMzAiKSAhPSAwKQotCQkgICAgewotCQkgICAgICAvKiBQdXQgdGhpbmdzIGJhY2sgdGhlIHdheSB3ZSBmb3VuZCB0aGVtLiAgKi8KLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OwotCQkgICAgICBlcnJtc2cgPSBfKCJleHBlY3RlZCBFUCByZWdpc3RlciIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQkgIAotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIAotCQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJyB8fCAqc3RyID09ICdbJyB8fCAqc3RyID09ICddJykKLQkJICAgICsrIHN0cjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9DQykgIT0gMCkgCi0JCXsKLQkJICBpZiAoIWNjX25hbWUgKCYgZXgpKQotCQkgICAgewotCQkgICAgICBlcnJtc2cgPSBfKCJpbnZhbGlkIGNvbmRpdGlvbiBjb2RlIG5hbWUiKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MEVfUFVTSF9QT1ApIAotCQl7Ci0JCSAgZXJybXNnID0gcGFyc2VfcmVnaXN0ZXJfbGlzdCAoJiBpbnNuLCBvcGVyYW5kKTsKLQkJICAKLQkJICAvKiBUaGUgcGFyc2VfcmVnaXN0ZXJfbGlzdCgpIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGRvbmUKLQkJICAgICBldmVyeXRoaW5nLCBzbyBmYWtlIGEgZHVtbXkgZXhwcmVzc2lvbi4gICovCi0JCSAgZXguWF9vcCAgICAgICAgID0gT19jb25zdGFudDsKLQkJICBleC5YX2FkZF9udW1iZXIgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwRV9JTU1FRElBVEUxNikgCi0JCXsKLQkJICBleHByZXNzaW9uICgmIGV4KTsKLQotCQkgIGlmIChleC5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICBlcnJtc2cgPSBfKCJjb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0JCSAgZWxzZSBpZiAoZXguWF9hZGRfbnVtYmVyICYgMHhmZmZmMDAwMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGV4LlhfYWRkX251bWJlciAmIDB4ZmZmZikKLQkJCWVycm1zZyA9IF8oImNvbnN0YW50IHRvbyBiaWcgdG8gZml0IGludG8gaW5zdHJ1Y3Rpb24iKTsKLQkJICAgICAgZWxzZSBpZiAoKGluc24gJiAweDAwMWZmZmMwKSA9PSAweDAwMTMwNzgwKQotCQkJZXguWF9hZGRfbnVtYmVyID4+PSAxNjsKLQkJICAgICAgZWxzZQotCQkJZXJybXNnID0gXygiY29uc3RhbnQgdG9vIGJpZyB0byBmaXQgaW50byBpbnN0cnVjdGlvbiIpOwotCQkgICAgfQotCQkgIAotCQkgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IHRydWU7Ci0JCSAgZXh0cmFfZGF0YV9sZW4gICAgICAgID0gMjsKLQkJICBleHRyYV9kYXRhICAgICAgICAgICAgPSBleC5YX2FkZF9udW1iZXI7Ci0JCSAgZXguWF9hZGRfbnVtYmVyICAgICAgID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MEVfSU1NRURJQVRFMzIpIAotCQl7Ci0JCSAgZXhwcmVzc2lvbiAoJiBleCk7Ci0JCSAgCi0JCSAgaWYgKGV4Llhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgIGVycm1zZyA9IF8oImNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkJICAKLQkJICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSB0cnVlOwotCQkgIGV4dHJhX2RhdGFfbGVuICAgICAgICA9IDQ7Ci0JCSAgZXh0cmFfZGF0YSAgICAgICAgICAgID0gZXguWF9hZGRfbnVtYmVyOwotCQkgIGV4LlhfYWRkX251bWJlciAgICAgICA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChyZWdpc3Rlcl9uYW1lICgmIGV4KQotCQkgICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFRykgPT0gMCkKLQkJewotCQkgIGNoYXIgYzsKLQkJICBpbnQgIGV4aXN0cyA9IDA7Ci0JCSAgCi0JCSAgLyogSXQgaXMgcG9zc2libGUgdGhhdCBhbiBhbGlhcyBoYXMgYmVlbiBkZWZpbmVkIHRoYXQKLQkJICAgICBtYXRjaGVzIGEgcmVnaXN0ZXIgbmFtZS4gIEZvciBleGFtcGxlIHRoZSBjb2RlIG1heQotCQkgICAgIGluY2x1ZGUgYSAiLnNldCBaRVJPLCAwIiBkaXJlY3RpdmUsIHdoaWNoIG1hdGNoZXMKLQkJICAgICB0aGUgcmVnaXN0ZXIgbmFtZSAiemVybyIuICBBdHRlbXB0IHRvIHJlcGFyc2UgdGhlCi0JCSAgICAgZmllbGQgYXMgYW4gZXhwcmVzc2lvbiwgYW5kIG9ubHkgY29tcGxhaW4gaWYgd2UKLQkJICAgICBjYW5ub3QgZ2VuZXJhdGUgYSBjb25zdGFudC4gICovCi0KLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLQkJICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JCSAgCi0JCSAgaWYgKHN5bWJvbF9maW5kIChzdHIpICE9IE5VTEwpCi0JCSAgICBleGlzdHMgPSAxOwotCQkgIAotCQkgICogaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0JCSAgCi0JCSAgZXhwcmVzc2lvbiAoJiBleCk7Ci0KLQkJICBpZiAoZXguWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgewotCQkgICAgICAvKiBJZiB0aGlzIHJlZ2lzdGVyIGlzIGFjdHVhbGx5IG9jY3VyaW5nIHRvbyBlYXJseSBvbgotCQkJIHRoZSBwYXJzaW5nIG9mIHRoZSBpbnN0cnVjdGlvbiwgKGJlY2F1c2UgYW5vdGhlcgotCQkJIGZpZWxkIGlzIG1pc3NpbmcpIHRoZW4gcmVwb3J0IHRoaXMuICAqLwotCQkgICAgICBpZiAob3BpbmRleF9wdHJbMV0gIT0gMAotCQkJICAmJiAodjg1MF9vcGVyYW5kcyBbb3BpbmRleF9wdHIgWzFdXS5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUcpKQotCQkJZXJybXNnID0gXygic3ludGF4IGVycm9yOiB2YWx1ZSBpcyBtaXNzaW5nIGJlZm9yZSB0aGUgcmVnaXN0ZXIgbmFtZSIpOwotCQkgICAgICBlbHNlCi0JCQllcnJtc2cgPSBfKCJzeW50YXggZXJyb3I6IHJlZ2lzdGVyIG5vdCBleHBlY3RlZCIpOwotCi0JCSAgICAgIC8qIElmIHdlIGNyZWF0ZWQgYSBzeW1ib2wgaW4gdGhlIHByb2Nlc3Mgb2YgdGhpcyB0ZXN0IHRoZW4KLQkJCSBkZWxldGUgaXQgbm93LCBzbyB0aGF0IGl0IHdpbGwgbm90IGJlIG91dHB1dCB3aXRoIHRoZSByZWFsCi0JCQkgc3ltYm9scy4uLiAqLwotCQkgICAgICBpZiAoZXhpc3RzID09IDAKLQkJCSAgJiYgZXguWF9vcCA9PSBPX3N5bWJvbCkKLQkJCXN5bWJvbF9yZW1vdmUgKGV4LlhfYWRkX3N5bWJvbCwKLQkJCQkgICAgICAgJiBzeW1ib2xfcm9vdFAsICYgc3ltYm9sX2xhc3RQKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKHN5c3RlbV9yZWdpc3Rlcl9uYW1lICgmIGV4LCBmYWxzZSwgZmFsc2UpCi0JCSAgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU1JHKSA9PSAwKQotCQl7Ci0JCSAgZXJybXNnID0gXygic3ludGF4IGVycm9yOiBzeXN0ZW0gcmVnaXN0ZXIgbm90IGV4cGVjdGVkIik7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChjY19uYW1lICgmZXgpCi0JCSAgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfQ0MpID09IDApCi0JCXsKLQkJICBlcnJtc2cgPSBfKCJzeW50YXggZXJyb3I6IGNvbmRpdGlvbiBjb2RlIG5vdCBleHBlY3RlZCIpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZXhwcmVzc2lvbiAoJiBleCk7Ci0JCSAgLyogU3BlY2lhbCBjYXNlOgotCQkgICAgIElmIHdlIGFyZSBhc3NlbWJsaW5nIGEgTU9WIGluc3RydWN0aW9uIChvciBhIENBTExULi4uLiA6LSkKLQkJICAgICBhbmQgdGhlIGltbWVkaWF0ZSB2YWx1ZSBkb2VzIG5vdCBmaXQgaW50byB0aGUgYml0cwotCQkgICAgIGF2YWlsYWJsZSB0aGVuIGNyZWF0ZSBhIGZha2UgZXJyb3Igc28gdGhhdCB0aGUgbmV4dCBNT1YKLQkJICAgICBpbnN0cnVjdGlvbiB3aWxsIGJlIHNlbGVjdGVkLiAgVGhpcyBvbmUgaGFzIGEgMzIgYml0Ci0JCSAgICAgaW1tZWRpYXRlIGZpZWxkLiAgKi8KLQotCQkgIGlmICgoKGluc24gJiAweDA3ZTApID09IDB4MDIwMCkKLQkJICAgICAgJiYgZXguWF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgICAgICYmIChleC5YX2FkZF9udW1iZXIgPCAoLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkKLQkJCSAgfHwgZXguWF9hZGRfbnVtYmVyID4gKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpKQotCQkgICAgZXJybXNnID0gXygiaW1tZWRpYXRlIG9wZXJhbmQgaXMgdG9vIGxhcmdlIik7Ci0JCX0KLQotCSAgICAgIGlmIChlcnJtc2cpCi0JCWdvdG8gZXJyb3I7Ci0JICAgICAgCi0vKiBmcHJpbnRmIChzdGRlcnIsICIgaW5zbjogJXgsIG9wZXJhbmQgJWQsIG9wOiAlZCwgYWRkX251bWJlcjogJWRcbiIsCi0gICBpbnNuLCBvcGluZGV4X3B0ciAtIG9wY29kZS0+b3BlcmFuZHMsIGV4Llhfb3AsIGV4LlhfYWRkX251bWJlcik7ICovCi0KLQkgICAgICBzd2l0Y2ggKGV4Llhfb3ApIAotCQl7Ci0JCWNhc2UgT19pbGxlZ2FsOgotCQkgIGVycm1zZyA9IF8oImlsbGVnYWwgb3BlcmFuZCIpOwotCQkgIGdvdG8gZXJyb3I7Ci0JCWNhc2UgT19hYnNlbnQ6Ci0JCSAgZXJybXNnID0gXygibWlzc2luZyBvcGVyYW5kIik7Ci0JCSAgZ290byBlcnJvcjsKLQkJY2FzZSBPX3JlZ2lzdGVyOgotCQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiAoVjg1MF9PUEVSQU5EX1JFRyB8IFY4NTBfT1BFUkFORF9TUkcpKSA9PSAwKQotCQkgICAgewotCQkgICAgICBlcnJtc2cgPSBfKCJpbnZhbGlkIG9wZXJhbmQiKTsKLQkJICAgICAgZ290byBlcnJvcjsKLQkJICAgIH0KLQkJICBpbnNuID0gdjg1MF9pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgZXguWF9hZGRfbnVtYmVyLAotCQkJCQkgICAgICAoY2hhciAqKSBOVUxMLCAwLAotCQkJCQkgICAgICBjb3B5X29mX2luc3RydWN0aW9uKTsKLQkJICBicmVhazsKLQotCQljYXNlIE9fY29uc3RhbnQ6Ci0JCSAgaW5zbiA9IHY4NTBfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlciwKLQkJCQkJICAgICAgKGNoYXIgKikgTlVMTCwgMCwKLQkJCQkJICAgICAgY29weV9vZl9pbnN0cnVjdGlvbik7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JCSAgaWYgKGZjID49IE1BWF9JTlNOX0ZJWFVQUykKLQkJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0KLQkJICBmaXh1cHNbIGZjIF0uZXhwICAgICA9IGV4OwotCQkgIGZpeHVwc1sgZmMgXS5vcGluZGV4ID0gKiBvcGluZGV4X3B0cjsKLQkJICBmaXh1cHNbIGZjIF0ucmVsb2MgICA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JCSAgKytmYzsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJyB8fCAqc3RyID09ICdbJyB8fCAqc3RyID09ICddJwotCQkgfHwgKnN0ciA9PSAnKScpCi0JICAgICsrc3RyOwotCX0KLSAgICAgIG1hdGNoID0gMTsKLQotICAgIGVycm9yOgotICAgICAgaWYgKG1hdGNoID09IDApCi0gICAgICAgIHsKLQkgIG5leHRfb3Bjb2RlID0gb3Bjb2RlICsgMTsKLQkgIGlmIChuZXh0X29wY29kZS0+bmFtZSAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChuZXh0X29wY29kZS0+bmFtZSwgb3Bjb2RlLT5uYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgb3Bjb2RlID0gbmV4dF9vcGNvZGU7Ci0KLQkgICAgICAvKiBTa2lwIHZlcnNpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldAotCQkgcHJvY2Vzc29yLiAgKi8KLQkgICAgICBpZiAoKG9wY29kZS0+cHJvY2Vzc29ycyAmIHByb2Nlc3Nvcl9tYXNrKSA9PSAwKQotCQlnb3RvIGVycm9yOwotCSAgICAgIAotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICAKLQkgIGFzX2JhZCAoIiVzOiAlcyIsIGNvcHlfb2ZfaW5zdHJ1Y3Rpb24sIGVycm1zZyk7Ci0JICAKLQkgIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnXScpCi0JICAgICsrIGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIAotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVkX2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgICAgCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICBpZiAoKnN0ciAhPSAnXDAnKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgYXNfYmFkIChfKCJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIiksIHN0cik7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIAotICBpZiAocmVsYXhhYmxlICYmIGZjID4gMCkKLSAgICB7Ci0gICAgICBpbnNuX3NpemUgPSAyOwotICAgICAgZmMgPSAwOwotCi0gICAgICBpZiAoIXN0cmNtcCAob3Bjb2RlLT5uYW1lLCAiYnIiKSkKLQl7Ci0JICBmID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA0LCAyLCAyLAotCQkJZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wsCi0JCQlmaXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciwKLQkJCShjaGFyICopZml4dXBzWzBdLm9waW5kZXgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCBpbnNuX3NpemUpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmICsgMiwgMCwgMik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGYgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDYsIDQsIDAsCi0JCQlmaXh1cHNbMF0uZXhwLlhfYWRkX3N5bWJvbCwKLQkJCWZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyLAotCQkJKGNoYXIgKilmaXh1cHNbMF0ub3BpbmRleCk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIGluc25fc2l6ZSk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGYgKyAyLCAwLCA0KTsKLQl9Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIC8qIEZvdXIgYnl0ZSBpbnNucyBoYXZlIGFuIG9wY29kZSB3aXRoIHRoZSB0d28gaGlnaCBiaXRzIG9uLiAgKi8KLSAgICAgIGlmICgoaW5zbiAmIDB4MDYwMCkgPT0gMHgwNjAwKQotCWluc25fc2l6ZSA9IDQ7Ci0gICAgICBlbHNlCi0JaW5zbl9zaXplID0gMjsKLQotICAgICAgLyogU3BlY2lhbCBjYXNlOiAzMiBiaXQgTU9WICovCi0gICAgICBpZiAoKGluc24gJiAweGZmZTApID09IDB4MDYyMCkKLQlpbnNuX3NpemUgPSAyOwotICAgICAgCi0gICAgICBmID0gZnJhZ19tb3JlIChpbnNuX3NpemUpOwotICAgICAgCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIGluc25fc2l6ZSk7Ci0KLSAgICAgIGlmIChleHRyYV9kYXRhX2FmdGVyX2luc24pCi0JewotCSAgZiA9IGZyYWdfbW9yZSAoZXh0cmFfZGF0YV9sZW4pOwotCSAgCi0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGV4dHJhX2RhdGEsIGV4dHJhX2RhdGFfbGVuKTsKLQotCSAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwgYnV0IGluc3RlYWQganVzdCB1c2UgdGhlCi0gICAgIEJGRF9SRUxPQ19VTlVTRUQgcGx1cyB0aGUgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkKLSAgICAgaGFuZGxlIGZpeHVwcyBmb3IgYW55IG9wZXJhbmQgdHlwZSwgYWx0aG91Z2ggdGhhdCBpcyBhZG1pdHRlZGx5Ci0gICAgIG5vdCBhIHZlcnkgZXhjaXRpbmcgZmVhdHVyZS4gIFdlIHBpY2sgYSBCRkQgcmVsb2MgdHlwZSBpbgotICAgICBtZF9hcHBseV9maXguICAqLyAgCi0gIGZvciAoaSA9IDA7IGkgPCBmYzsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kOwotICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICAgIHJlbG9jOwotICAgICAgCi0gICAgICBvcGVyYW5kID0gJiB2ODUwX29wZXJhbmRzWyBmaXh1cHNbaV0ub3BpbmRleCBdOwotCi0gICAgICByZWxvYyA9IGZpeHVwc1tpXS5yZWxvYzsKLSAgICAgIAotICAgICAgaWYgKHJlbG9jICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JewotCSAgcmVsb2NfaG93dG9fdHlwZSAqIHJlbG9jX2hvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsCi0JCQkJCQkJCSAgcmVsb2MpOwotCSAgaW50ICAgICAgICAgICAgICAgIHNpemU7Ci0JICBpbnQgICAgICAgICAgICAgICAgYWRkcmVzczsKLQkgIGZpeFMgKiAgICAgICAgICAgICBmaXhQOwotCi0JICBpZiAoIXJlbG9jX2hvd3RvKQotCSAgICBhYm9ydCgpOwotCSAgCi0JICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWxvY19ob3d0byk7Ci0KLQkgIC8qIFhYWCBUaGlzIHdpbGwgYWJvcnQgb24gYW4gUl9WODUwXzggcmVsb2MgLQotCSAgICAgaXMgdGhpcyByZWxvYyBhY3R1YWxseSB1c2VkID8gKi8KLQkgIGlmIChzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSAKLQkgICAgYWJvcnQgKCk7Ci0KLQkgIGFkZHJlc3MgPSAoZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSArIGluc25fc2l6ZSAtIHNpemU7Ci0KLQkgIGlmIChyZWxvYyA9PSBCRkRfUkVMT0NfMzIpCi0JICAgIHsKLQkgICAgICBhZGRyZXNzICs9IDI7Ci0JICAgIH0KLQkgIAotCSAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgYWRkcmVzcywgc2l6ZSwKLQkJCSAgICAgICYgZml4dXBzW2ldLmV4cCwgCi0JCQkgICAgICByZWxvY19ob3d0by0+cGNfcmVsYXRpdmUsCi0JCQkgICAgICByZWxvYyk7Ci0KLQkgIHN3aXRjaCAocmVsb2MpCi0JICAgIHsKLQkgICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotCSAgICAgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaXhfbmV3X2V4cCAoCi0JCSAgICAgICBmcmFnX25vdywKLQkJICAgICAgIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJICAgICAgICYgZml4dXBzW2ldLmV4cCwKLQkJICAgICAgIDEgLyogRklYTUU6IFY4NTBfT1BFUkFORF9SRUxBVElWRSA/Pz8gKi8sCi0JCSAgICAgICAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSAoZml4dXBzW2ldLm9waW5kZXgKLQkJCQkJCSAgICsgKGludCkgQkZEX1JFTE9DX1VOVVNFRCkKLQkJICAgICAgICk7Ci0JfQotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlZF9pbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLQotLyogSWYgd2hpbGUgcHJvY2Vzc2luZyBhIGZpeHVwLCBhIHJlbG9jIHJlYWxseSBuZWVkcyB0byBiZSBjcmVhdGVkICovCi0vKiB0aGVuIGl0IGlzIGRvbmUgaGVyZS4gICovCi0gICAgICAgICAgICAgICAgIAotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKLSAgICAgYXNlY3Rpb24gKiBzZWc7Ci0gICAgIGZpeFMgKiAgICAgZml4cDsKLXsKLSAgYXJlbGVudCAqIHJlbG9jOwotICAKLSAgcmVsb2MgICAgICAgICAgICAgID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyAgICAgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIHJlbG9jLT5ob3d0byAgICAgICA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOwotCi0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgICAgICAgICAgICAgICBfKCJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgKGludCkgZml4cC0+Znhfcl90eXBlKTsKLQotICAgICAgeGZyZWUgKHJlbG9jKTsKLSAgICAgIAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAKLSAgaWYgKCAgIGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUKQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gIGVsc2UKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICAKLSAgcmV0dXJuIHJlbG9jOwotfQotCi0vKiBBc3N1bWUgZXZlcnl0aGluZyB3aWxsIGZpdCBpbiB0d28gYnl0ZXMsIHRoZW4gZXhwYW5kIGFzIG5lY2Vzc2FyeS4gICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqIGZyYWdwOwotICAgICBhc2VjdGlvbiAqIHNlZzsKLXsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDApCi0gICAgZnJhZ3AtPmZyX3ZhciA9IDQ7Ci0gIGVsc2UgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgZnJhZ3AtPmZyX3ZhciA9IDI7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIDI7Ci19IAotCi1sb25nCi12ODUwX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4cCwgc2VjdGlvbikKLSAgICAgZml4UyAqIGZpeHA7Ci0gICAgIHNlZ1QgICBzZWN0aW9uOwotewotICAvKiBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgb3IgaW4gYSBzZWN0aW9uIG90aGVyIHRoYW4gb3VyIG93biwKLSAgICAgb3IgaXQgaXMgd2VhayAoaW4gd2hpY2ggY2FzZSBpdCBtYXkgd2VsbCBiZSBpbiBhbm90aGVyIHNlY3Rpb24sCi0gICAgIHRoZW4gbGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiAoISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQotCSAgfHwgU19JU19XRUFLIChmaXhwLT5meF9hZGRzeSkKLQkgIHx8IChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gc2VjdGlvbikpKQotICAgIHJldHVybiAwOwotICAKLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqICAgZml4cDsKLSAgICAgdmFsdWVUICogdmFsdWVwOwotICAgICBzZWdUICAgICBzZWc7Ci17Ci0gIHZhbHVlVCB2YWx1ZTsKLSAgY2hhciAqIHdoZXJlOwotCi0gIGlmICggICBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICB7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICogdmFsdWVwOwotICAgICAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICB2YWx1ZSA9ICogdmFsdWVwOwotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gICAgICBpZiAoZml4cC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKChpbnQpIGZpeHAtPmZ4X3JfdHlwZSA+PSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBvcGluZGV4OwotICAgICAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQ7Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgaW5zbjsKLQotICAgICAgb3BpbmRleCA9IChpbnQpIGZpeHAtPmZ4X3JfdHlwZSAtIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQ7Ci0gICAgICBvcGVyYW5kID0gJiB2ODUwX29wZXJhbmRzWyBvcGluZGV4IF07Ci0KLSAgICAgIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCi0gICAgICAgICB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLgotCi0JIE5vdGUgdGhlIGluc3RydWN0aW9uIGhhcyBiZWVuIHN0b3JlZCBpbiBsaXR0bGUgZW5kaWFuCi0JIGZvcm1hdCEgICovCi0gICAgICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLQotICAgICAgaW5zbiA9IGJmZF9nZXRsMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGluc24gPSB2ODUwX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCAob2Zmc2V0VCkgdmFsdWUsCi0JCQkJICBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLCBOVUxMKTsKLSAgICAgIGJmZF9wdXRsMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0KLSAgICAgIGlmIChmaXhwLT5meF9kb25lKQotCXsKLQkgIC8qIE5vdGhpbmcgZWxzZSB0byBkbyBoZXJlLiAqLwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICAvKiBEZXRlcm1pbmUgYSBCRkQgcmVsb2MgdmFsdWUgYmFzZWQgb24gdGhlIG9wZXJhbmQgaW5mb3JtYXRpb24uICAKLQkgV2UgYXJlIG9ubHkgcHJlcGFyZWQgdG8gdHVybiBhIGZldyBvZiB0aGUgb3BlcmFuZHMgaW50byByZWxvY3MuICovCi0KLSAgICAgIGlmIChvcGVyYW5kLT5iaXRzID09IDIyKQotCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19WODUwXzIyX1BDUkVMOwotICAgICAgZWxzZSBpZiAob3BlcmFuZC0+Yml0cyA9PSA5KQotCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19WODUwXzlfUENSRUw7Ci0gICAgICBlbHNlCi0JewotCSAgLyogZnByaW50ZiAoc3RkZXJyLCAiYml0czogJWQsIGluc246ICV4XG4iLCBvcGVyYW5kLT5iaXRzLCBpbnNuKTsgKi8KLQkgIAotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgICAgXygidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIpKTsKLQkgIGZpeHAtPmZ4X2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfZG9uZSkKLSAgICB7Ci0gICAgICAvKiBXZSBzdGlsbCBoYXZlIHRvIGluc2VydCB0aGUgdmFsdWUgaW50byBtZW1vcnkhICAqLwotICAgICAgd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgICAgIGlmIChmaXhwLT5meF9zaXplID09IDEpCi0JKiB3aGVyZSA9IHZhbHVlICYgMHhmZjsKLSAgICAgIGVsc2UgaWYgKGZpeHAtPmZ4X3NpemUgPT0gMikKLQliZmRfcHV0bDE2ICh2YWx1ZSAmIDB4ZmZmZiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgZWxzZSBpZiAoZml4cC0+Znhfc2l6ZSA9PSA0KQotCWJmZF9wdXRsMzIgKHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgfQotICAKLSAgZml4cC0+ZnhfYWRkbnVtYmVyID0gdmFsdWU7Ci0gIHJldHVybiAxOwotfQotCi0MCi0vKiBQYXJzZSBhIGNvbnMgZXhwcmVzc2lvbi4gIFdlIGhhdmUgdG8gaGFuZGxlIGhpKCksIGxvKCksIGV0YwotICAgb24gdGhlIHY4NTAuICAqLwotdm9pZAotcGFyc2VfY29uc19leHByZXNzaW9uX3Y4NTAgKGV4cCkKLSAgZXhwcmVzc2lvblMgKiBleHA7Ci17Ci0gIC8qIFNlZSBpZiB0aGVyZSdzIGEgcmVsb2MgcHJlZml4IGxpa2UgaGkoKSB3ZSBoYXZlIHRvIGhhbmRsZS4gICovCi0gIGhvbGRfY29uc19yZWxvYyA9IHY4NTBfcmVsb2NfcHJlZml4IChOVUxMKTsKLQotICAvKiBEbyBub3JtYWwgZXhwcmVzc2lvbiBwYXJzaW5nLiAgKi8KLSAgZXhwcmVzc2lvbiAoZXhwKTsKLX0KLQotLyogQ3JlYXRlIGEgZml4dXAgZm9yIGEgY29ucyBleHByZXNzaW9uLiAgSWYgcGFyc2VfY29uc19leHByZXNzaW9uX3Y4NTAKLSAgIGZvdW5kIGEgcmVsb2MgcHJlZml4LCB0aGVuIHdlIHVzZSB0aGF0IHJlbG9jLCBlbHNlIHdlIGNob29zZSBhbgotICAgYXBwcm9wcmlhdGUgb25lIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBleHByZXNzaW9uLiAgKi8KLXZvaWQKLWNvbnNfZml4X25ld192ODUwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwKQotICAgICBmcmFnUyAqIGZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgaW50IHNpemU7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGlmIChob2xkX2NvbnNfcmVsb2MgPT0gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICB7Ci0gICAgICBpZiAoc2l6ZSA9PSA0KQotCWhvbGRfY29uc19yZWxvYyA9IEJGRF9SRUxPQ18zMjsKLSAgICAgIGlmIChzaXplID09IDIpCi0JaG9sZF9jb25zX3JlbG9jID0gQkZEX1JFTE9DXzE2OwotICAgICAgaWYgKHNpemUgPT0gMSkKLQlob2xkX2NvbnNfcmVsb2MgPSBCRkRfUkVMT0NfODsKLSAgICB9Ci0KLSAgaWYgKGV4cCAhPSBOVUxMKQotICAgIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCAwLCBob2xkX2NvbnNfcmVsb2MpOwotICBlbHNlCi0gICAgZml4X25ldyAoZnJhZywgd2hlcmUsIHNpemUsIE5VTEwsIDAsIDAsIGhvbGRfY29uc19yZWxvYyk7Ci19Ci0KLWJvb2xlYW4KLXY4NTBfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICAgZml4UyAqIGZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotIAotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBpZiAoU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIAotICAvKiBEb24ndCBhZGp1c3QgZnVuY3Rpb24gbmFtZXMgKi8KLSAgaWYgKFNfSVNfRlVOQ1RJT04gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBXZSBuZWVkIHRoZSBzeW1ib2wgbmFtZSBmb3IgdGhlIFZUQUJMRSBlbnRyaWVzICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIHJldHVybiAxOwotfQotIAotaW50Ci12ODUwX2ZvcmNlX3JlbG9jYXRpb24gKGZpeFApCi0gICAgICBzdHJ1Y3QgZml4ICogZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICYmIFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAxOwotICAKLSAgaWYgKCAgIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotIAotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdjg1MC5oIGIvZ2FzL2NvbmZpZy90Yy12ODUwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZDRkMWMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy12ODUwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKiB0Yy12ODUwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLXY4NTAuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX1Y4NTAKLQotI2luY2x1ZGUgPGVsZi92ODUwLmg+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+Znhfd2hlcmUgKyBiYXNlOwotICBpbnRyLT5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKLQotICBpZiAoc3ltYm9sX3B0cikKLSAgICBpbnRyLT5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKLSAgZWxzZQotICAgIGludHItPnJfc3ltbmR4ID0gLTE7Ci19Ci0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtejhrLmggYi9nYXMvY29uZmlnL3RjLXo4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODhiNjU2Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtejhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtejhrLmgKLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyLCA5MywgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNkZWZpbmUgVENfWjhLCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2lmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGludGVybmFsX3JlbG9jOwotI2VuZGlmCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTE9DQUxfTEFCRUwoeCkgMAotI2VuZGlmCi0KLS8qIFRoaXMgbWFjcm8gdHJhbnNsYXRlcyBiZXR3ZWVuIGFuIGludGVybmFsIGZpeCBhbmQgYW4gY29mZiByZWxvYyB0eXBlICovCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIGFib3J0KCk7Ci0KLSNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfejhrCi0jZGVmaW5lIENPRkZfTUFHSUMgMHg4MDAwCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgxKQotI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUwotCi0jZGVmaW5lIFRDX1JFTE9DX01BTkdMRShzLGEsYixjKSB0Y19yZWxvY19tYW5nbGUoYSxiLGMpCi1leHRlcm4gdm9pZCB0Y19yZWxvY19tYW5nbGUKLSAgUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYmZkX3ZtYSkpOwotCi0jZGVmaW5lIERPX05PVF9TVFJJUCAwCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJaaWxvZyBaODAwMCBHQVMgIgotI2RlZmluZSBORUVEX0ZYX1JfVFlQRSAxCi0jZGVmaW5lIFJFTE9DXzMyIDEyMzQKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLS8qIGVuZCBvZiB0Yy16OGsuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS0zODZic2QuaCBiL2dhcy9jb25maWcvdGUtMzg2YnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZmY5OTAuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS0zODZic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIHRlLTM4NmJzZC5oIC0tIDM4NkJTRCB0YXJnZXQgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEVfMzg2QlNECTEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRlLXN1bjMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1hdXguaCBiL2dhcy9jb25maWcvdGUtYXV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNmZhMDEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1hdXguaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNkZWZpbmUgVEVfQVVYCi0KLS8qIEZyb20gb2JqLWNvZmYuaDoKLSAgIFRoaXMgaW50ZXJuYWxfbGluZW5vIGNyYXAgaXMgdG8gc3RvcCBuYW1lc3BhY2UgcG9sbHV0aW9uIGZyb20gdGhlCi0gICBiZmQgaW50ZXJuYWwgY29mZiBoZWFkZXJmaWxlLiAqLwotI2RlZmluZSBpbnRlcm5hbF9saW5lbm8gYmZkX2ludGVybmFsX2xpbmVubwotI2luY2x1ZGUgImNvZmYvYXV4LWNvZmYuaCIJLyogb3ZlcnJpZGUgYml0cyBpbiBjb2ZmL2ludGVybmFsLmggKi8KLSN1bmRlZiBpbnRlcm5hbF9saW5lbm8KLQotI2RlZmluZSBDT0ZGX05PTE9BRF9QUk9CTEVNCi0jZGVmaW5lIEtFRVBfUkVMT0NfSU5GTwotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0jaWZuZGVmIExPQ0FMX0xBQkVMU19GQgotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWRlbHQ4OC5oIGIvZ2FzL2NvbmZpZy90ZS1kZWx0ODguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjZDZiNy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWRlbHQ4OC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRlLWRlbHRhODguaC4gICovCi0KLSNkZWZpbmUgVEVfREVMVEE4OCAxCi0KLSNkZWZpbmUgQ09GRl9OT0xPQURfUFJPQkxFTQkxCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSCTEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCCQkxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWRlbHRhLmggYi9nYXMvY29uZmlnL3RlLWRlbHRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNmM2MmMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1kZWx0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI2RlZmluZSBURV9ERUxUQQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0jZGVmaW5lIENPRkZfTk9MT0FEX1BST0JMRU0JMQotI2RlZmluZSBDT0ZGX0NPTU1PTl9BRERFTkQJMQotCi0vKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKLSAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAotICAgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUgkxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQgkJMQotCi0vKiBlbmQgb2YgdGUtZGVsdGEuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1kcHgyLmggYi9nYXMvY29uZmlnL3RlLWRweDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzNDFjYS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWRweDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIE1hY2hpbmUgc3BlY2lmaWMgZGVmaW5lcyBmb3IgdGhlIGRweDIgbWFjaGluZSAqLwotCi0vKiBUaGUgbWFnaWMgbnVtYmVyIGlzIG5vdCB0aGUgdXN1YWwgTUM2OE1BR0lDLiAqLwotI2RlZmluZSBDT0ZGX01BR0lDICAgICAgIE1DNjhLQkNTTUFHSUMKLQotI2RlZmluZSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgMQotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtbTY4ay11biIKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogZW5kIG9mIHRlLWRweDIuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1keW5peC5oIGIvZ2FzL2NvbmZpZy90ZS1keW5peC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTdiMzBmLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZHluaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLyogVGhpcyBpcyBmb3IgaTM4Ni1zZXF1ZW50LWJzZC4gIFRoZSBhc3NlbWJsZXIgcHJvYmFibHkgZG9lcyBub3QKLSAgIGFjdHVhbGx5IHdvcmssIGFzIHRoZSBzdXBwb3J0IGluIEJGRCBpcyBub3QgY29tcGxldGUgYXMgb2YgdGhpcwotICAgd3JpdGluZy4gIFNlZSBiZmQvaTM4Ni1keW5peC5jLiAgKi8KLQotI2RlZmluZSBURV9EWU5JWCAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWVwb2MtcGUuaCBiL2dhcy9jb25maWcvdGUtZXBvYy1wZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzVmOTE0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZXBvYy1wZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jZGVmaW5lIFRFX1BFCi0jZGVmaW5lIFRFX0VQT0MKLSNkZWZpbmUgTEVYX0FUIDEgLyogY2FuIGhhdmUgQCdzIGluc2lkZSBsYWJlbHMgKi8KLQotLyogVGhlIFBFIGZvcm1hdCBzdXBwb3J0cyBsb25nIHNlY3Rpb24gbmFtZXMuICAqLwotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1nZW5lcmljLmggYi9nYXMvY29uZmlnL3RlLWdlbmVyaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlZGE0NS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWdlbmVyaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtZ2VuZXJpYy5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgotICogdGFyZ2V0IGVudmlyb25tZW50IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBJdCBpcyBteSBpbnRlbnQgdGhhdCB0aGlzIGZpbGUgd2lsbCBldm9sdmUgaW50byBhIGZpbGUgc3VpdGFibGUgZm9yIGNvbmZpZywKLSAqIGNvbXBpbGUsIGFuZCBjb3B5aW5nIGFzIGFuIGFpZCBmb3IgdGVzdGluZyBhbmQgcG9ydGluZy4gIHhveG9yaWNoLgotICovCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KLSNpZmRlZiBPQkpfSEVBREVSCi0jaW5jbHVkZSBPQkpfSEVBREVSCi0jZWxzZQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLSNlbmRpZgotCi0vKiBlbmQgb2YgdGUtZ2VuZXJpYy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWdvMzIuaCBiL2dhcy9jb25maWcvdGUtZ28zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODVjOTU4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZ28zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1nbzMyLmgKLSAqLwotCi0jZGVmaW5lIFRFX0dPMzIKLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWdvMzIiCi0KLS8qIEdBUyBzaG91bGQgdHJlYXQgJy5hbGlnbiB2YWx1ZScgYXMgYW4gYWxpZ25tZW50IG9mIDIqKnZhbHVlICovCi0jZGVmaW5lIFVTRV9BTElHTl9QVFdPCi0KLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWhwMzAwLmggYi9nYXMvY29uZmlnL3RlLWhwMzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOTRhYjQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1ocDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogdGUtaHAzMDAuaCAtLSBocHV4IDkwMDAvMzAwIHRhcmdldCBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogZW5kIG9mIHRlLWhwMzAwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtaHBwYS5oIGIvZ2FzL2NvbmZpZy90ZS1ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzRmYTcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiBNYWNoaW5lIHNwZWNpZmljIGRlZmluZXMgZm9yIHRoZSBQQSBtYWNoaW5lCi0gICBDb3B5cmlnaHQgMTk4NywgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotCUhQIFBBLVJJU0MgYW5kIE9TRi8xIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yCi0JU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLgotICovCi0KLS8qIHRoZXNlIGRlZmluZSBpbnRlcmZhY2VzICovCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1pMzg2YWl4LmggYi9nYXMvY29uZmlnL3RlLWkzODZhaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmMDk0NS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWkzODZhaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtaTM4NmFpeC5oIGFuZCBpcyBidWlsdCBmcm9tIHBpZWNlcyBvZiBjb2RlIGZyb20gTWluaCBUcmFuLUxlCi0gKiA8VFJBTkxFQElOVEVMTElDT1JQLkNPTT4gYnkgcmljaEBjeWdudXMuY29tLgotICovCi0KLSNkZWZpbmUgVEVfSTM4NkFJWCAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qCi0gKiBVbmRlZmluZSBSRVZFUlNFX1NPUlRfUkVMT0NTIHRvIGtlZXAgdGhlIHJlbG9jYXRpb24gZW50cmllcyBzb3J0ZWQKLSAqIGluIGFzY2VuZGluZyB2YWRkci4KLSAqLwotI3VuZGVmIFJFVkVSU0VfU09SVF9SRUxPQ1MKLQotLyoKLSAqIERlZmluZSBLRUVQX1JFTE9DX0lORk8gc28gdGhhdCB0aGUgc3RyaXAgcmVsb2MgaW5mbyBmbGFnIEZfUkVMRkxHCi0gKiBpcyBub3QgdXNlZCBpbiB0aGUgZmlsZWhkciBmb3IgQ09GRiBvdXRwdXQuCi0gKi8KLSNkZWZpbmUgS0VFUF9SRUxPQ19JTkZPCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDc5Ci0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRlLWkzODZhaXguaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1pYzk2MC5oIGIvZ2FzL2NvbmZpZy90ZS1pYzk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzMxZmI5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtaWM5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0ZS1pYzk2MC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiwgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogVGhpcyBmaWxlIGlzIHRlLWljOTYwLmggYW5kIGlzIGludGVuZGVkIHRvIGRlZmluZSBpYzk2MCBlbnZpcm9ubWVudAotICogc3BlY2lmaWMgZGlmZmVyZW5jZXMuCi0gKi8KLQotI2RlZmluZSBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgKChuYW1lWzBdID09J0wnKSBcCi0JCQkgICB8fCAobmFtZVswXSA9PScuJyBcCi0JCQkgICAgICAgJiYgKG5hbWVbMV09PSdDJyBcCi0JCQkJICAgfHwgbmFtZVsxXT09J0knIFwKLQkJCQkgICB8fCBuYW1lWzFdPT0nLicpKSkKLSNlbmRpZgotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBlbmQgb2YgdGUtaWM5NjAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1pbnRlcml4LmggYi9nYXMvY29uZmlnL3RlLWludGVyaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczYWQyNC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWludGVyaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNkZWZpbmUgVEVfUEVfRFlOIC8qIFBFIHdpdGggZHluYW1pYyBsaW5raW5nIChVTklYIHNoYXJlZCBsaWIpIHN1cHBvcnQgKi8KLSNkZWZpbmUgVEVfUEUKLSNkZWZpbmUgTEVYX0FUIDEgLyogY2FuIGhhdmUgQCdzIGluc2lkZSBsYWJlbHMgKi8KLSNkZWZpbmUgTEVYX1FNIDMgLyogY2FuIGhhdmUgPydzIGluIG9yIGJlZ2luIGxhYmVscyAqLwotCi0vKiBUaGUgUEUgZm9ybWF0IHN1cHBvcnRzIGxvbmcgc2VjdGlvbiBuYW1lcy4gICovCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNkZWZpbmUgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotCi0vKiBCb3RoIGFyY2hpdGVjdHVyZXMgdXNlIHRoZXNlICovCi0jaWZuZGVmIExPQ0FMX0xBQkVMU19GQgotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotI2VuZGlmCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWxpbnV4LmggYi9nYXMvY29uZmlnL3RlLWxpbnV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzVhN2EuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1saW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jZGVmaW5lIFRFX0xJTlVYCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWxuZXdzLmggYi9nYXMvY29uZmlnL3RlLWxuZXdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYmNjNWEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1sbmV3cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vKiB0ZS1sbmV3cy5oIC0tIGxpdHRsZS1lbmRpYW4gTkVXUyBlbXVsYXRpb24uICAqLwotCi0jZGVmaW5lIEVDT0ZGX0xJVFRMRV9GT1JNQVQgImVjb2ZmLWJpZ2xpdHRsZW1pcHMiCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWx5bnguaCBiL2dhcy9jb25maWcvdGUtbHlueC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDg1MTVkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbHlueC5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jZGVmaW5lIFRFX0xZTlgKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotI2lmbmRlZiBMT0NBTF9MQUJFTFNfRkIKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1tYWNoLmggYi9nYXMvY29uZmlnL3RlLW1hY2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1NDdmOC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLW1hY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI2RlZmluZSBURV9NYWNoCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1tYWNvcy5oIGIvZ2FzL2NvbmZpZy90ZS1tYWNvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQ4ZGM0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbWFjb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0ZS1tYWNvcy5oLiAgKi8KLQotI2RlZmluZSBURV9QT1dFUk1BQyAxCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbXVsdGkuaCBiL2dhcy9jb25maWcvdGUtbXVsdGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlZGE0NS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLW11bHRpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHRlLWdlbmVyaWMuaCBhbmQgaXMgaW50ZW5kZWQgdG8gYmUgYSB0ZW1wbGF0ZSBmb3IKLSAqIHRhcmdldCBlbnZpcm9ubWVudCBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0gKgotICogSXQgaXMgbXkgaW50ZW50IHRoYXQgdGhpcyBmaWxlIHdpbGwgZXZvbHZlIGludG8gYSBmaWxlIHN1aXRhYmxlIGZvciBjb25maWcsCi0gKiBjb21waWxlLCBhbmQgY29weWluZyBhcyBhbiBhaWQgZm9yIHRlc3RpbmcgYW5kIHBvcnRpbmcuICB4b3hvcmljaC4KLSAqLwotCi0vKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKLSAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAotICAgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIHRoZXNlIGRlZmluZSBpbnRlcmZhY2VzICovCi0jaWZkZWYgT0JKX0hFQURFUgotI2luY2x1ZGUgT0JKX0hFQURFUgotI2Vsc2UKLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0jZW5kaWYKLQotLyogZW5kIG9mIHRlLWdlbmVyaWMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1uYnNkLmggYi9nYXMvY29uZmlnL3RlLW5ic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlNDYwMC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLW5ic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIHRlLW5ic2QuaCAtLSBOZXRCU0QgdGFyZ2V0IGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRFX05ldEJTRAkxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1uYnNkNTMyLmggYi9nYXMvY29uZmlnL3RlLW5ic2Q1MzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmOWU1Zi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLW5ic2Q1MzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtbmV0YnNkNTMyLmgKLSAqCi0gKiBXcml0dGVuIGJ5IElhbiBEYWxsIDxpZGFsbEBlbGVjZW5nLmFkZWxhaWRlLmVkdS5hdT4KLSAqIAotICogMTktSnVuLTk0Ci0gKiAKLSAqLwotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1uczMyay1uZXRic2QiCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIE1heWJlIHRoZXNlIHNob3VsZCBiZSBtb3JlIGxpa2UgVENfTlMzMjUzMiBhbmQgVENfTlMzMjM4MSBpbiBjYXNlCi0gKiBvZiBjb25mbGljdHMuIE5TMzIzODEgaXMgdXNlZCBpbiBvcGNvZGUvbnMzMmsuaCBhbmQgdGhhdCBpcyBhbHNvCi0gKiB1c2VkIGJ5IEdEQi4gTmVlZCB0byBjaGVjay4KLSAqLwotI2RlZmluZSBOUzMyNTMyCi0jZGVmaW5lIE5TMzIzODEKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtcGM1MzJtYWNoLmggYi9nYXMvY29uZmlnL3RlLXBjNTMybWFjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWU3ZmY4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtcGM1MzJtYWNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHRlLXBjNTMyLmgKLSAqCi0gKiBXcml0dGVuIGJ5IElhbiBEYWxsIDxpZGFsbEBlbGVjZW5nLmFkZWxhaWRlLmVkdS5hdT4KLSAqIAotICogMjQtTWF5LTk0Ci0gKiAKLSAqLwotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1wYzUzMi1tYWNoIgotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBNYXliZSB0aGVzZSBzaG91bGQgYmUgbW9yZSBsaWtlIFRDX05TMzI1MzIgYW5kIFRDX05TMzIzODEgaW4gY2FzZQotICogb2YgY29uZmxpY3RzLiBOUzMyMzgxIGlzIHVzZWQgaW4gb3Bjb2RlL25zMzJrLmggYW5kIHRoYXQgaXMgYWxzbwotICogdXNlZCBieSBHREIuIE5lZWQgdG8gY2hlY2suCi0gKi8KLSNkZWZpbmUgTlMzMjUzMgotI2RlZmluZSBOUzMyMzgxCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXBlLmggYi9nYXMvY29uZmlnL3RlLXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMWYwYjIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1wZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jZGVmaW5lIFRFX1BFCi0jZGVmaW5lIExFWF9BVCAxIC8qIGNhbiBoYXZlIEAncyBpbnNpZGUgbGFiZWxzICovCi0KLS8qIFRoZSBQRSBmb3JtYXQgc3VwcG9ydHMgbG9uZyBzZWN0aW9uIG5hbWVzLiAgKi8KLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtcHBjbncuaCBiL2dhcy9jb25maWcvdGUtcHBjbncuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkZjA1MC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXBwY253LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiB0ZS1wcGNudy5oIC0tIFBvd2VyIFBDIHJ1bm5pbmcgTmV0d2FyZSBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5Ci0gICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKLSAgIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiB0aGVzZSBkZWZpbmUgaW50ZXJmYWNlcyAqLwotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogZ2NjIHVzZXMgZXNjYXBlIHNlcXVlbmNlcyBmb3IgcHBjL25ldHdhcmUgKi8KLQotI3VuZGVmIE5PX1NUUklOR19FU0NBUEVTCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXBzb3MuaCBiL2dhcy9jb25maWcvdGUtcHNvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQ0MTUzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtcHNvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1wc29zLmggZm9yIGVtYmVkZGVkIHN5c3RlbXMgcnVubmluZyBwU09TLgotICogQ29udHJpYnV0ZWQgYnkgTWFydGluIEFuYW50aGFyYW1hbiAobWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlKQotICovCi0KLSNkZWZpbmUgVEVfUFNPUwotCi0vKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKLSAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAotICAgbGFiZWxzLiAgKi8KLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogVGhpcyBtYWtlcyBHQVMgbW9yZSB2ZXJzYXRpbGUgYW5kIGJsb2NrcyBzb21lIEVMRidpc21zIGluCi0gICB0Yy1tNjhrLmguICovCi0KLSNkZWZpbmUgUkVHSVNURVJfUFJFRklYX09QVElPTkFMIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogZW5kIG9mIHRlLXBzb3MuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1yaXNjaXguaCBiL2dhcy9jb25maWcvdGUtcmlzY2l4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzI1M2UuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1yaXNjaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2RlZmluZSBURV9SSVNDSVgKLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtc3BhcmNhb3V0LmggYi9nYXMvY29uZmlnL3RlLXNwYXJjYW91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzEwMTg0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtc3BhcmNhb3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiB0ZS1zcGFyY2FvdXQuaCAtLSBlbWJlZGRlZCBzcGFyYy1hb3V0IHRhcmdldCBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBURV9TUEFSQ0FPVVQJMQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtc3VuMy5oIGIvZ2FzL2NvbmZpZy90ZS1zdW4zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NWQ0MmIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1zdW4zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiB0ZS1zdW4zLmggLS0gU3VuLTMgdGFyZ2V0IGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSAjZGVmaW5lcyBzcGVjaWZpYwotICAgdG8gU1VOIGNvbXB1dGVyIFNVTiAzIHNlcmllcyBjb21wdXRlcnMuICAoVGhlIG9ubHkga2luZAotICAgd2UgaGF2ZSBhcm91bmQgaGVyZSwgdW5mb3J0dW5hdGx5LikKLQotICAgUnVtb3IgaGFzIGl0IHRoYXQgdGhpcyBmaWxlIHdpbGwgd29yayBvbiB0aGUgU3VuLTIgaWYgdGhlIGFzc2VtYmxlcgotICAgaXMgY2FsbGVkIHdpdGggLW02ODAxMCAgVGhpcyBpcyBub3QgdGVzdGVkLiAgKi8KLQotCi0jZGVmaW5lIFRFX1NVTjMJMQotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiBDb3VsZCBhbHNvIGJlIDoKLSAgICNkZWZpbmUgU19MT0NBTF9OQU1FKHMpCShTX0dFVF9OQU1FKHMpWzBdID09ICcuJyAmJgotICAgU19HRVRfTkFNRShzKVsxXSA9PSAnTCcgfHwKLSAgIFNfR0VUX05BTUUocylbMV0gPT0gJy4nKQotICAgKi8KLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRlLXN1bjMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1zdnI0LmggYi9nYXMvY29uZmlnL3RlLXN2cjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxN2VlMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXN2cjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI2RlZmluZSBURV9TVlI0Ci0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXN5c3YzMi5oIGIvZ2FzL2NvbmZpZy90ZS1zeXN2MzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZTZlNS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXN5c3YzMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0vKiBSZW1vdmUgbGVhZGluZyB1bmRlcnNjb3JlIGZyb20gdGhlIGdjYyBnZW5lcmF0ZWQgc3ltYm9sIG5hbWVzICovCi0jZGVmaW5lIFNUUklQX1VOREVSU0NPUkUKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogZW5kIG9mIHRlLXN5c3YzMi5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3ZheC1pbnN0LmggYi9nYXMvY29uZmlnL3ZheC1pbnN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDhmOTguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy92YXgtaW5zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyogdmF4LWluc3QuaCAtIEdOVSAtIFBhcnQgb2YgdmF4LmMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogVGhpcyBpcyBwYXJ0IG9mIHZheC1pbnMtcGFyc2UuYyAmIGZyaWVuZHMuCi0gKiBXZSB3YW50IHRvIHBhcnNlIGEgdmF4IGluc3RydWN0aW9uIHRleHQgaW50byBhIHRyZWUgZGVmaW5lZCBoZXJlLgotICovCi0KLSNkZWZpbmUgVklUX01BWF9PUEVSQU5EUyAoNikJLyogbWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgaW4gb25lICAgICAgICovCi0vKiBzaW5nbGUgdmF4IGluc3RydWN0aW9uICovCi0KLXN0cnVjdCB2b3AJCQkvKiB2YXggaW5zdHJ1Y3Rpb24gb3BlcmFuZCAgICAgICAgICAgICAgICAgKi8KLXsKLSAgc2hvcnQgaW50IHZvcF9uZHg7CQkvKiAtMSwgb3IgaW5kZXggcmVnaXN0ZXIuIGVnIDc9W1I3XQkgICAqLwotICBzaG9ydCBpbnQgdm9wX3JlZzsJCS8qIC0xLCBvciByZWdpc3RlciBudW1iZXIuIGVnIEBJXiM9MHhGICAgICAqLwotICAvKiBIZWxwcyBkaXN0aW5ndWlzaCAiYWJzIiBmcm9tICJhYnMoUEMpIi4gKi8KLSAgc2hvcnQgaW50IHZvcF9tb2RlOwkJLyogYWRkcmVzc2luZyBtb2RlIDQgYml0cy4gZWcgSV4jPTB4OQkgICAqLwotICBjaGFyIHZvcF9zaG9ydDsJCS8qIG9wZXJhbmQgZGlzcGxhY2VtZW50IGxlbmd0aCBhcyB3cml0dGVuICAqLwotICAvKiAnICc9bm9uZSwgImJpbHN3Ij1CXkleTF5TXldeLiAgICAgICAgICAgKi8KLSAgY2hhciB2b3BfYWNjZXNzOwkJLyogJ2InYnJhbmNoICcgJ25vLWluc3RydWN0aW9uICdhbXJ2dydub3JtICovCi0gIGNoYXIgdm9wX3dpZHRoOwkJLyogT3BlcmFuZCB3aWR0aCwgb25lIG9mICJiZGZnaGxvcXciCSAgICovCi0gIGNvbnN0IGNoYXIgKnZvcF93YXJuOwkJLyogd2FybmluZyBtZXNzYWdlIG9mIHRoaXMgb3BlcmFuZCwgaWYgYW55ICovCi0gIGNvbnN0IGNoYXIgKnZvcF9lcnJvcjsJLyogc2F5IGlmIG9wZXJhbmQgaXMgaW5hcHByb3ByaWF0ZSAgICAgICAgICovCi0gIGNoYXIgKnZvcF9leHByX2JlZ2luOwkJLyogVW5wYXJzZWQgZXhwcmVzc2lvbiwgMXN0IGNoYXIgLi4uCSAgICovCi0gIGNoYXIgKnZvcF9leHByX2VuZDsJCS8qIC4uLiBsYXN0IGNoYXIuCQkJICAgKi8KLSAgdW5zaWduZWQgY2hhciB2b3BfbmJ5dGVzOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gZGF0dW0JCSAgICovCi19OwotCi0KLXR5cGVkZWYgbG9uZyB2YXhfb3Bjb2RlVDsJLyogRm9yIGluaXRpYWxpc2luZyBhcnJheSBvZiBvcGNvZGVzCSAgICovCi0vKiBTb21lIHN5bnRoZXRpYyBvcGNvZGVzID4gMTYgYml0cyEgICAgICAgKi8KLQotI2RlZmluZSBWSVRfT1BDT0RFX1NZTlRIRVRJQyAweDgwMDAwMDAwCS8qIE5vdCByZWFsIGhhcmR3YXJlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVklUX09QQ09ERV9TUEVDSUFMICAgMHg0MDAwMDAwMAkvKiBOb3Qgbm9ybWFsIGJyYW5jaCBvcHRpbWlzaW5nLiAgICovCi0vKiBOZXZlciBzZXQgd2l0aG91dCAuLi5fU1lOVEhFVElDICovCi0KLSNkZWZpbmUgVkFYX1dJRFRIX1VOQ09ORElUSU9OQUxfSlVNUCAnLScJLyogVGhlc2UgYXJlIGVuY29kZWQgaW50byAgICAgICAgICovCi0jZGVmaW5lIFZBWF9XSURUSF9DT05ESVRJT05BTF9KVU1QICAgJz8nCS8qIHZvcF93aWR0aCB3aGVuIHZvcF9hY2Nlc3M9PSdiJyAqLwotI2RlZmluZSBWQVhfV0lEVEhfV09SRF9KVU1QICAgICAgICAgICchJwkvKiBhbmQgVklUX09QQ09ERV9TWU5USEVUSUMgc2V0LiAgKi8KLSNkZWZpbmUgVkFYX1dJRFRIX0JZVEVfSlVNUAkgICAgICc6JwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBWQVhfSk1QICgweDE3KQkJLyogVXNlZnVsIGZvciBicmFuY2ggb3B0aW1pc2luZy4gSnVtcCBpbnN0ciovCi0jZGVmaW5lIFZBWF9QQ19SRUxBVElWRV9NT0RFICgweGVmKQkvKiBVc2UgaXQgYWZ0ZXIgVkFYX0pNUAkJICAgKi8KLSNkZWZpbmUgVkFYX0FCU09MVVRFX01PREUgKDB4OUYpLyogVXNlIGFzIEAjLi4uCQkJICAgKi8KLSNkZWZpbmUgVkFYX0JSQiAoMHgxMSkJCS8qIENhbm9uaWNhbCBicmFuY2guCQkJICAgKi8KLSNkZWZpbmUgVkFYX0JSVyAoMHgzMSkJCS8qIEFub3RoZXIgY2Fub25pY2FsIGJyYW5jaAkJICAgKi8KLSNkZWZpbmUgVkFYX1dJREVOX1dPUkQgKDB4MjApCS8qIEFkZCB0aGlzIHRvIGJ5dGUgYnJhbmNoIHRvIGdldCB3b3JkIGJyLiAqLwotI2RlZmluZSBWQVhfV0lERU5fTE9ORyAoMHg2KQkvKiBBZGQgdGhpcyB0byBieXRlIGJyYW5jaCB0byBnZXQgbG9uZyBqbXAuKi8KLS8qIE5lZWRzIFZBWF9QQ19SRUxBVElWRV9NT0RFIGJ5dGUgYWZ0ZXIgaXQqLwotCi1zdHJ1Y3Qgdml0CQkJLyogdmF4IGluc3RydWN0aW9uIHRyZWUgICAgICAgICAgICAgICAgICAgICovCi17Ci0gIC8qIHZpdF9vcGNvZGUgaXMgY2hhcltdIGZvciBwb3J0YWJpbGl0eS4gICAqLwotICBjaGFyIHZpdF9vcGNvZGVbc2l6ZW9mICh2YXhfb3Bjb2RlVCldOwotICB1bnNpZ25lZCBjaGFyIHZpdF9vcGNvZGVfbmJ5dGVzOwkvKiBIb3cgbG9uZyBpcyBfb3Bjb2RlPyAoY2hhcnMpCSAgICovCi0gIHVuc2lnbmVkIGNoYXIgdml0X29wZXJhbmRzOwkvKgkJCQkJICAgKi8KLSAgc3RydWN0IHZvcCB2aXRfb3BlcmFuZFtWSVRfTUFYX09QRVJBTkRTXTsJLyogb3BlcmFuZHMgICAgICAgICAgICAgKi8KLSAgY29uc3QgY2hhciAqdml0X2Vycm9yOwkvKiAiIiBvciBlcnJvciB0ZXh0ICovCi19OwotCi0vKiBlbmQgb2YgdmF4LWluc3QuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy92bXMtYS1jb25mLmggYi9nYXMvY29uZmlnL3Ztcy1hLWNvbmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4ZmM2OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3Ztcy1hLWNvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKiB2bXMtYWxwaGEtY29uZi5oLiAgR2VuZXJhdGVkIG1hbnVhbGx5IGZyb20gY29uZi5pbiwKLSAgIGFuZCB1c2VkIGJ5IGNvbmZpZy1nYXMtYWxwaGEuY29tIHdoZW4gY29uc3RydWN0aW5nIGNvbmZpZy5oLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI3VuZGVmIENfQUxMT0NBCi0jZWxzZQotI2RlZmluZSBDX0FMTE9DQQotI2VuZGlmCi0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgaW5saW5lCi0jZWxzZQotI2RlZmluZSBpbmxpbmUKLSNlbmRpZgotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotCVNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLQlTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLQlTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAoLTEpCi0KLS8qIFNob3VsZCBnYXMgdXNlIGhpZ2gtbGV2ZWwgQkZEIGludGVyZmFjZXM/ICAqLwotI2RlZmluZSBCRkRfQVNTRU1CTEVSCi0KLS8qIFNvbWUgYXNzZXJ0L3ByZXByb2Nlc3NvciBjb21iaW5hdGlvbnMgYXJlIGluY2FwYWJsZSBvZiBoYW5kbGluZwotICAgY2VydGFpbiBraW5kcyBvZiBjb25zdHJ1Y3RzIGluIHRoZSBhcmd1bWVudCBvZiBhc3NlcnQuICBGb3IgZXhhbXBsZSwKLSAgIHF1b3RlZCBzdHJpbmdzIChpZiByZXF1b3RpbmcgaXNuJ3QgZG9uZSByaWdodCkgb3IgbmV3bGluZXMuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgQlJPS0VOX0FTU0VSVAotI2Vsc2UKLSNkZWZpbmUgQlJPS0VOX0FTU0VSVAotI2VuZGlmCi0KLS8qIElmIHdlIGFyZW4ndCBkb2luZyBjcm9zcy1hc3NlbWJsaW5nLCBzb21lIG9wZXJhdGlvbnMgY2FuIGJlIG9wdGltaXplZCwKLSAgIHNpbmNlIGJ5dGUgb3JkZXJzIGFuZCB2YWx1ZSBzaXplcyBkb24ndCBuZWVkIHRvIGJlIGFkanVzdGVkLiAgKi8KLSN1bmRlZiBDUk9TU19DT01QSUxFCi0KLS8qIFNvbWUgZ2FzIGNvZGUgd2FudHMgdG8ga25vdyB0aGVzZSBwYXJhbWV0ZXJzLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FMSUFTCSJhbHBoYS12bXMiCi0jZGVmaW5lIFRBUkdFVF9DUFUJImFscGhhIgotI2RlZmluZSBUQVJHRVRfQ0FOT05JQ0FMCSJhbHBoYS1kZWMtdm1zIgotI2RlZmluZSBUQVJHRVRfT1MJIm9wZW5WTVMvQWxwaGEiCi0jZGVmaW5lIFRBUkdFVF9WRU5ET1IJImRlYyIKLQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgbWFsbG9jIGFuZCByZWFsbG9jLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQwotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBmcmVlLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKLQotLyogU29tZXRpbWVzIGVycm5vLmggZG9lc24ndCBkZWNsYXJlIGVycm5vIGl0c2VsZi4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotCi0jdW5kZWYgTUFOWV9TRUdNRU5UUwotCi0vKiBOZWVkZWQgb25seSBmb3Igc3BhcmMgY29uZmlndXJhdGlvbiAqLwotI3VuZGVmIHNwYXJjdjkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZW1vdmUgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX1JFTU9WRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHVubGluayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9VTkxJTksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX0VSUk5PX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1REQVJHX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSAotI2Vsc2UKLSN1bmRlZiBIQVZFX1NZU19UWVBFU19ICi0jZW5kaWYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9VTklTVERfSAkvKiBjb25maWctZ2FzLmNvbSB3aWxsIG1ha2Ugb25lIGlmIG5lY2Vzc2FyeSAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YXJhcmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBUkFSR1NfSAotCi0vKiBWTVMtc3BlY2lmaWM6ICB3ZSBuZWVkIHRvIHNldCB1cCBFWElUX3h4eCBoZXJlIGJlY2F1c2UgdGhlIGRlZmF1bHQKLSAgIHZhbHVlcyBpbiBhcy5oIGFyZSBpbmFwcHJvcHJpYXRlIGZvciBWTVMsIGJ1dCB3ZSBhbHNvIHdhbnQgdG8gcHJldmVudAotICAgYXMuaCdzIGluY2x1c2lvbiBvZiA8c3RkbGliLmg+IGZyb20gdHJpZ2dlcmluZyByZWRlZmluaXRpb24gd2FybmluZ3MuCi0gICA8c3RkbGliLmg+IGd1YXJkcyBpdHNlbGYgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24sIHNvIGluY2x1ZGluZyBpdAotICAgaGVyZSB0dXJucyBhcy5oJ3MgbGF0ZXIgI2luY2x1ZGUgaW50byBhIG5vLW9wLiAgKFdlIGNhbid0IHNpbXBseSB1c2UKLSAgICNpZm5kZWYgSEFWRV9TVERMSUJfSCBoZXJlLCBiZWNhdXNlIHRoZSA8c3RkbGliLmg+IGluIHNldmVyYWwgb2xkZXIKLSAgIGdjYy12bXMgZGlzdHJpYnV0aW9ucyBuZWdsZWN0cyB0byBkZWZpbmUgdGhlc2UgdHdvIHJlcXVpcmVkIG1hY3Jvcy4pICAqLwotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmIF9fREVDQwotI3VuZGVmIEVYSVRfU1VDQ0VTUwotI3VuZGVmIEVYSVRfRkFJTFVSRQotI2RlZmluZSBFWElUX1NVQ0NFU1MgMQkJCS8qIFNTJF9OT1JNQUwsIFNUUyRLX1NVQ0NFU1MgKi8KLSNkZWZpbmUgRVhJVF9GQUlMVVJFIDB4MTAwMDAwMDIJCS8qIChTVFMkS19FUlJPUiB8IFNUUyRNX0lOSElCX01TRykgKi8KLSNlbmRpZgotCi0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2lmIF9fREVDQwotZXh0ZXJuIGludCBzdHJjYXNlY21wICgpOwotZXh0ZXJuIGludCBzdHJuY2FzZWNtcCAoKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy92bXMtY29uZi5oIGIvZ2FzL2NvbmZpZy92bXMtY29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjI1Y2ZjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdm1zLWNvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKiB2bXMtY29uZi5oLiAgR2VuZXJhdGVkIG1hbnVhbGx5IGZyb20gY29uZi5pbiwKLSAgIGFuZCB1c2VkIGJ5IGNvbmZpZy1nYXMuY29tIHdoZW4gY29uc3RydWN0aW5nIGNvbmZpZy5oLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI3VuZGVmIENfQUxMT0NBCi0jZWxzZQotI2RlZmluZSBDX0FMTE9DQQotI2VuZGlmCi0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgaW5saW5lCi0jZWxzZQotI2RlZmluZSBpbmxpbmUKLSNlbmRpZgotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAoLTEpCi0KLS8qIERlZmluZSBpZiBsZXggZGVjbGFyZXMgeXl0ZXh0IGFzIGEgY2hhciAqIGJ5IGRlZmF1bHQsIG5vdCBhIGNoYXJbXS4gICovCi0jdW5kZWYgWVlURVhUX1BPSU5URVIKLQotLyogTmFtZSBvZiBwYWNrYWdlLiAgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gb2YgcGFja2FnZS4gICovCi0vKiBEZWZpbmUgaW4gYnkgY29uZmlnLWdhcy5jb20gKi8KLS8qICN1bmRlZiBWRVJTSU9OICovCi0KLS8qIFNob3VsZCBnYXMgdXNlIGhpZ2gtbGV2ZWwgQkZEIGludGVyZmFjZXM/ICAqLwotI3VuZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogU29tZSBhc3NlcnQvcHJlcHJvY2Vzc29yIGNvbWJpbmF0aW9ucyBhcmUgaW5jYXBhYmxlIG9mIGhhbmRsaW5nCi0gICBjZXJ0YWluIGtpbmRzIG9mIGNvbnN0cnVjdHMgaW4gdGhlIGFyZ3VtZW50IG9mIGFzc2VydC4gIEZvciBleGFtcGxlLAotICAgcXVvdGVkIHN0cmluZ3MgKGlmIHJlcXVvdGluZyBpc24ndCBkb25lIHJpZ2h0KSBvciBuZXdsaW5lcy4gICovCi0jaWZkZWYgX19HTlVDX18KLSN1bmRlZiBCUk9LRU5fQVNTRVJUCi0jZWxzZQotI2RlZmluZSBCUk9LRU5fQVNTRVJUCi0jZW5kaWYKLQotLyogSWYgd2UgYXJlbid0IGRvaW5nIGNyb3NzLWFzc2VtYmxpbmcsIHNvbWUgb3BlcmF0aW9ucyBjYW4gYmUgb3B0aW1pemVkLAotICAgc2luY2UgYnl0ZSBvcmRlcnMgYW5kIHZhbHVlIHNpemVzIGRvbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQuICAqLwotI3VuZGVmIENST1NTX0NPTVBJTEUKLQotLyogU29tZSBnYXMgY29kZSB3YW50cyB0byBrbm93IHRoZXNlIHBhcmFtZXRlcnMuICAqLwotI2RlZmluZSBUQVJHRVRfQUxJQVMJInZtcyIKLSNkZWZpbmUgVEFSR0VUX0NQVQkidmF4IgotI2RlZmluZSBUQVJHRVRfQ0FOT05JQ0FMCSJ2YXgtZGVjLXZtcyIKLSNkZWZpbmUgVEFSR0VUX09TCSJ2bXMiCi0jZGVmaW5lIFRBUkdFVF9WRU5ET1IJImRlYyIKLQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgc3Ryc3RyLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBtYWxsb2MgYW5kIHJlYWxsb2MuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCi0KLS8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIGZyZWUuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBzYnJrLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLQotLyogU29tZXRpbWVzIGVycm5vLmggZG9lc24ndCBkZWNsYXJlIGVycm5vIGl0c2VsZi4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotCi0jdW5kZWYgTUFOWV9TRUdNRU5UUwotCi0vKiBUaGUgY29uZmlndXJlIHNjcmlwdCBkZWZpbmVzIHRoaXMgZm9yIHNvbWUgdGFyZ2V0cyBiYXNlZCBvbiB0aGUKLSAgIHRhcmdldCBuYW1lIHVzZWQuICBJdCBpcyBub3QgYWx3YXlzIGRlZmluZWQuICAqLwotI3VuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0KLS8qIE5lZWRlZCBvbmx5IGZvciBzb21lIGNvbmZpZ3VyYXRpb25zIHRoYXQgY2FuIHByb2R1Y2UgbXVsdGlwbGUgb3V0cHV0Ci0gICBmb3JtYXRzLiAgKi8KLSN1bmRlZiBERUZBVUxUX0VNVUxBVElPTgotI3VuZGVmIEVNVUxBVElPTlMKLSN1bmRlZiBVU0VfRU1VTEFUSU9OUwotI3VuZGVmIE9CSl9NQVlCRV9BT1VUCi0jdW5kZWYgT0JKX01BWUJFX0JPVVQKLSN1bmRlZiBPQkpfTUFZQkVfQ09GRgotI3VuZGVmIE9CSl9NQVlCRV9FQ09GRgotI3VuZGVmIE9CSl9NQVlCRV9FTEYKLSN1bmRlZiBPQkpfTUFZQkVfR0VORVJJQwotI3VuZGVmIE9CSl9NQVlCRV9IUDMwMAotI3VuZGVmIE9CSl9NQVlCRV9JRUVFCi0jdW5kZWYgT0JKX01BWUJFX1NPTQotI3VuZGVmIE9CSl9NQVlCRV9WTVMKLQotLyogVXNlZCBmb3Igc29tZSBvZiB0aGUgQ09GRiBjb25maWd1cmF0aW9ucywgd2hlbiB0aGUgQ09GRiBjb2RlIG5lZWRzCi0gICB0byBzZWxlY3Qgc29tZXRoaW5nIGJhc2VkIG9uIHRoZSBDUFUgdHlwZSBiZWZvcmUgaXQga25vd3MgaXQuLi4gKi8KLSN1bmRlZiBJMzg2Q09GRgotI3VuZGVmIE02OEtDT0ZGCi0jdW5kZWYgTTg4S0NPRkYKLQotLyogVXNpbmcgY2dlbiBjb2RlPyAgKi8KLSN1bmRlZiBVU0lOR19DR0VOCi0KLS8qIE5lZWRlZCBvbmx5IGZvciBzcGFyYyBjb25maWd1cmF0aW9uLiAgKi8KLSN1bmRlZiBERUZBVUxUX0FSQ0gKLQotLyogTmVlZGVkIG9ubHkgZm9yIFBvd2VyUEMgU29sYXJpcy4gICovCi0jdW5kZWYgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVAotCi0vKiBOZWVkZWQgb25seSBmb3IgU0NPIDUuICAqLwotI3VuZGVmIFNDT19FTEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZW1vdmUgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX1JFTU9WRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotLyogc2JyaygpIGlzIGF2YWlsYWJsZSwgYnV0IHdlIGRvbid0IHdhbnQgZ2FzIHRvIHVzZSBpdC4gICovCi0jdW5kZWYgSEFWRV9TQlJLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdW5saW5rIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1VOTElOSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfRVJSTk9fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUVNT1JZX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkYXJnLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERBUkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBIQVZFX1NZU19UWVBFU19ICi0jZWxzZQotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSNlbmRpZgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1VOSVNURF9ICS8qIGNvbmZpZy1nYXMuY29tIHdpbGwgbWFrZSBvbmUgaWYgbmVjZXNzYXJ5ICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhcmFyZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFSQVJHU19ICi0KLS8qIFZNUy1zcGVjaWZpYzogIHdlIG5lZWQgdG8gc2V0IHVwIEVYSVRfeHh4IGhlcmUgYmVjYXVzZSB0aGUgZGVmYXVsdAotICAgdmFsdWVzIGluIGFzLmggYXJlIGluYXBwcm9wcmlhdGUgZm9yIFZNUywgYnV0IHdlIGFsc28gd2FudCB0byBwcmV2ZW50Ci0gICBhcy5oJ3MgaW5jbHVzaW9uIG9mIDxzdGRsaWIuaD4gZnJvbSB0cmlnZ2VyaW5nIHJlZGVmaW5pdGlvbiB3YXJuaW5ncy4KLSAgIDxzdGRsaWIuaD4gZ3VhcmRzIGl0c2VsZiBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbiwgc28gaW5jbHVkaW5nIGl0Ci0gICBoZXJlIHR1cm5zIGFzLmgncyBsYXRlciAjaW5jbHVkZSBpbnRvIGEgbm8tb3AuICAoV2UgY2FuJ3Qgc2ltcGx5IHVzZQotICAgI2lmbmRlZiBIQVZFX1NURExJQl9IIGhlcmUsIGJlY2F1c2UgdGhlIDxzdGRsaWIuaD4gaW4gc2V2ZXJhbCBvbGRlcgotICAgZ2NjLXZtcyBkaXN0cmlidXRpb25zIG5lZ2xlY3RzIHRvIGRlZmluZSB0aGVzZSB0d28gcmVxdWlyZWQgbWFjcm9zLikgICovCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI3VuZGVmIEVYSVRfU1VDQ0VTUwotI3VuZGVmIEVYSVRfRkFJTFVSRQotI2VuZGlmCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAxCQkJLyogU1MkX05PUk1BTCwgU1RTJEtfU1VDQ0VTUyAqLwotI2RlZmluZSBFWElUX0ZBSUxVUkUgMHgxMDAwMDAwMgkJLyogKFNUUyRLX0VSUk9SIHwgU1RTJE1fSU5ISUJfTVNHKSAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZ3VyZSBiL2dhcy9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2YzQ0ZjMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDYxNDQgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWJmZC1hc3NlbWJsZXIgIHVzZSBCRkQgYmFjayBlbmQgZm9yIHdyaXRpbmcgb2JqZWN0IGZpbGVzIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgICB0YXJnZXRzICAgICAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zIGJlc2lkZXMgdGhlIHByaW1hcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPWFzLmgKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRzaXRlZmlsZSI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZWxzZQotICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIENPTkZJR19TSVRFPSIkc2l0ZWZpbGUiCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjA3OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYyODogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjQ2OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY4MTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MzQ6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KLSAgIGZpCi0KLSAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9Ci1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzkxOiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1nYXMKLQotVkVSU0lPTj0yLjkuNQotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0IiAxPiYyOyBleGl0IDE7IH0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLUVPRgotCi0KLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgzNzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYWNsb2NhbCAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFDTE9DQUw9YWNsb2NhbAotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBQ0xPQ0FMPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhY2xvY2FsIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NTA6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvY29uZiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9DT05GPWF1dG9jb25mCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9DT05GPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvY29uZiIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODYzOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b21ha2UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPTUFLRT1hdXRvbWFrZQotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPTUFLRT0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b21ha2UiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODc2OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvaGVhZGVyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0hFQURFUj1hdXRvaGVhZGVyCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9IRUFERVI9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9oZWFkZXIiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg4OTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKG1ha2VpbmZvIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgTUFLRUlORk89bWFrZWluZm8KLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgTUFLRUlORk89IiRtaXNzaW5nX2Rpci9taXNzaW5nIG1ha2VpbmZvIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zaGFyZWQ9eWVzCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIG9yIC0tZGlzYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zdGF0aWMiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zdGF0aWM9eWVzCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmFzdC1pbnN0YWxsIG9yIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZmFzdF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9mYXN0X2luc3RhbGwiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk3NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAwNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAzNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwODY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMTg6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDExMjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNjA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTY1OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTc0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExOTM6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjM2OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNjA6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI2MzogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyOTk6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMTU6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzUzOiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDE2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDIwOiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1MTg6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1Mjc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUzMDogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotcm0gLXJmIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTU2OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KLSAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KLWVsc2UKLSAgYWNfdG9vbF9wcmVmaXg9Ci1maQotCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSAxNTk4ICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTk5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MjA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjI1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY1NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2ODc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9ImRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiICYmIGFjX2N2X3Byb2dfRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBETExUT09MPSJmYWxzZSIKLWZpCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcyMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzU0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9ImFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyIgJiYgYWNfY3ZfcHJvZ19BUz0iZmFsc2UiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgQVM9ImZhbHNlIgotZmkKLWZpCi0KLQotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0gIG5lZWRfbG9ja3M9JGVuYWJsZXZhbAotZWxzZQotICBuZWVkX2xvY2tzPXllcwotZmkKLQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLQotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9Ci0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotCi11c2VyX2JmZF9nYXM9Ci0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtYmZkLWFzc2VtYmxlciBvciAtLWRpc2FibGUtYmZkLWFzc2VtYmxlciB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9iZmRfYXNzZW1ibGVyK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9iZmRfYXNzZW1ibGVyIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgbmVlZF9iZmQ9eWVzIHVzZXJfYmZkX2dhcz15ZXMgOzsKLSAgbm8pICB1c2VyX2JmZF9nYXM9bm8gOzsKLSAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZ2l2ZW4gZm9yIGJmZC1hc3NlbWJsZXIgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KLQkgICAgOzsKLSAgbm8pCSAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikJICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tbW9uYmZkbGliIG9yIC0tZGlzYWJsZS1jb21tb25iZmRsaWIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY29tbW9uYmZkbGliK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21tb25iZmRsaWIiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZmkKLQotdXNpbmdfY2dlbj1ubwotCi0jIEdlbmVyYXRlIGEgaGVhZGVyIGZpbGUKLQotCi0KLQotIyBJZiB3ZSBhcmUgb24gYSBET1MgZmlsZXN5c3RlbSwgd2UgbXVzdCB1c2UgZ2RiLmluaSByYXRoZXIgdGhhbgotIyAuZ2RiaW5pdC4KLUdEQklOSVQ9Ii5nZGJpbml0IgotY2FzZSAiJHtob3N0fSIgaW4KLSAgKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MqKQotICAgIEdEQklOSVQ9ImdkYi5pbmkiCi0gICAgOzsKLWVzYWMKLQotCi10ZV9maWxlPWdlbmVyaWMKLQotIyBNYWtlZmlsZSB0YXJnZXQgZm9yIGluc3RhbGxpbmcgZ2FzIGluICQodG9vbGRpcikvYmluLgotaW5zdGFsbF90b29sZGlyPWluc3RhbGwtZXhlYy10b29sZGlyCi0KLWNhbm9uX3RhcmdldHM9IiIKLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gIGZvciB0IGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgOyBkbwotICAgIHJlc3VsdD1gJGFjX2NvbmZpZ19zdWIgJHQgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0gICAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotIyAgICBlbHNlCi0jICAgICAgIyBQZXJtaXQgImFsbCIsIGV0Yy4gIFdlIGRvbid0IHN1cHBvcnQgaXQgeWV0IHRob3VnaC4KLSMgICAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdCIKLSAgICBmaQotICBkb25lCi0gIF9nYXNfdW5pcV9saXN0PSIkY2Fub25fdGFyZ2V0cyIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15ICRfZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgJF9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiICRfZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgJF9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSIkX2dhc191bmlxX25ld2xpc3QgJF9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLWNhbm9uX3RhcmdldHM9JF9nYXNfdW5pcV9uZXdsaXN0Ci0KLWZpCi0KLWVtdWxhdGlvbnM9IiIKLQotZm9yIHRoaXNfdGFyZ2V0IGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMgOyBkbwotCi0gICAgZXZhbCBgZWNobyAkdGhpc190YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9jcHU9XDEgdmVuZG9yPVwyIG9zPVwzLydgCi0KLSAgICAjIGNoZWNrIGZvciBhcmNoaXRlY3R1cmUgdmFyaWFudHMKLSAgICBhcmNoPQotICAgIGVuZGlhbj0KLSAgICBjYXNlICR7Y3B1fSBpbgotICAgICAgYWxwaGEqKQkJY3B1X3R5cGU9YWxwaGEgOzsKLSAgICAgIGFybWViKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1iaWcgOzsKLSAgICAgIGFybSopCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgYXJtYiopCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgYXJtdipsKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGFybXYqYikJCWNwdV90eXBlPWFybSBlbmRpYW49YmlnIDs7Ci0gICAgICBzdHJvbmdhcm0qKQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgdGh1bWIqKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGhwcGEqKQkJY3B1X3R5cGU9aHBwYSA7OwotICAgICAgaVs0NTZdODYpCQljcHVfdHlwZT1pMzg2IDs7Ci0gICAgICBtNjgwWzAxMjM0Nl0wKQljcHVfdHlwZT1tNjhrIDs7Ci0gICAgICBtNjgwMDgpCQljcHVfdHlwZT1tNjhrIDs7Ci0gICAgICBtNjgzPz8pCQljcHVfdHlwZT1tNjhrIDs7Ci0gICAgICBtNTIwMCkJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG04KikJCWNwdV90eXBlPW04OGsgOzsKLSAgICAgIG1pcHMqZWwpCQljcHVfdHlwZT1taXBzIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMqKQkJY3B1X3R5cGU9bWlwcyBlbmRpYW49YmlnIDs7Ci0gICAgICBwamwqKQkJY3B1X3R5cGU9cGogZW5kaWFuPWxpdHRsZSA7OwotICAgICAgcGoqKQkJY3B1X3R5cGU9cGogZW5kaWFuPWJpZyA7OwotICAgICAgcG93ZXJwY2xlKikJY3B1X3R5cGU9cHBjIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIHBvd2VycGMqKQkJY3B1X3R5cGU9cHBjIGVuZGlhbj1iaWcgOzsKLSAgICAgIHJzNjAwMCopCQljcHVfdHlwZT1wcGMgOzsKLSAgICAgIHNwYXJjbGl0ZSopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsaXRlIDs7Ci0gICAgICBzcGFyY2xldCopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsZXQgOzsKLSAgICAgIHNwYXJjNjQqKQkJY3B1X3R5cGU9c3BhcmMgYXJjaD12OS02NCA7OwotICAgICAgc3BhcmM4NngqKQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjODZ4ICA7OwotICAgICAgc3BhcmMqKQkJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xpdGUgOzsgIyA/Pz8gU2VlIHRjLXNwYXJjLmMuCi0gICAgICB2ODUwKikJCWNwdV90eXBlPXY4NTAgOzsKLSAgICAgICopCQljcHVfdHlwZT0ke2NwdX0gOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIHRhcmdldF9jcHVfdHlwZT0ke2NwdV90eXBlfQotICAgIGVsaWYgdGVzdCAke3RhcmdldF9jcHVfdHlwZX0gIT0gJHtjcHVfdHlwZX0gOyB0aGVuCi0gICAgICBjb250aW51ZQotICAgIGZpCi0KLSAgICBnZW5lcmljX3RhcmdldD0ke2NwdV90eXBlfS0kdmVuZG9yLSRvcwotICAgIGRldj1ubwotICAgIGJmZF9nYXM9bm8KLSAgICBlbT1nZW5lcmljCi0KLSAgICAjIGFzc2lnbiBvYmplY3QgZm9ybWF0Ci0gICAgY2FzZSAke2dlbmVyaWNfdGFyZ2V0fSBpbgotICAgICAgYTI5ay0qLWNvZmYpICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLWFtZC11ZGkpICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstYW1kLWVibW9uKSAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay1ueXUtc3ltMSkgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLSotdnh3b3JrcyopICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgYWxwaGEqLSotKnZtcyopCSAgICBmbXQ9ZXZheCA7OwotICAgICAgYWxwaGEqLSotbmV0d2FyZSopICAgIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotb3BlbmJzZCopICAgIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotb3NmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotbGludXhlY29mZiopIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotbGludXgtZ251KikgIGZtdD1lbGYgZW09bGludXggOzsKLSAgICAgIGFscGhhKi0qLW5ldGJzZCopICAgICBmbXQ9ZWxmIGVtPW5ic2QgOzsKLQotICAgICAgYXJjLSotZWxmKikgICAgICAgICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgYXJtLSotYW91dCkJICAgICAgICAgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBhcm0tKi1jb2ZmIHwgdGh1bWItKi1jb2ZmKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGFybS0qLWVsZiB8IHRodW1iLSotZWxmKSAgICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBhcm0tKi1saW51eCphb3V0KikJICAgICAgICBmbXQ9YW91dCBlbT1saW51eCA7OwotICAgICAgYXJtLSotbGludXgqIHwgYXJtdiotKi1saW51eC1nbnUpCWZtdD1lbGYgIGVtPWxpbnV4IDs7Ci0gICAgICBhcm0tKi1uZXRic2QqKQkgICAgICAgICAgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OwotICAgICAgYXJtLSotb2FiaSB8IHRodW1iLSotb2FiaSkgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIGFybS1lcG9jLXBlIHwgdGh1bWItZXBvYy1wZSkgICAgICBmbXQ9Y29mZiBlbT1lcG9jLXBlIDs7Ci0gICAgICBhcm0tKi1wZSB8IHRodW1iLSotcGUpICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGFybS0qLXJpc2NpeCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1yaXNjaXggOzsKLQotICAgICAgZDEwdi0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgZDMwdi0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0KLSAgICAgIGZyMzAtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgaHBwYS0qLSplbGYqKSAgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWxpbnV4LWdudSopICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWxpdGVzKikgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLW9zZiopICAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLXJ0ZW1zKikgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWhwdXgqKSAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLW1wZWl4KikgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWJzZCopICAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWhpdXgqKSAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotCi0gICAgICBoODMwMC0qLWNvZmYpICAgICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgaTM4Ni1pYm0tYWl4KikgICAgICAgIGZtdD1jb2ZmIGVtPWkzODZhaXggOzsKLSAgICAgIGkzODYtc2VxdWVudC1ic2QqKSAgICBmbXQ9YW91dCBlbT1keW5peCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWJlb3NwZSopICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotYmVvc2VsZiogfCBpMzg2LSotYmVvcyopIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1ic2QqKSAgICAgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1uZXRic2QwLjgpICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1uZXRic2QqKSAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKLSAgICAgIGkzODYtKi1vcGVuYnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKLSAgICAgIGkzODYtKi1saW51eCphb3V0KiB8IGkzODYtKi1saW51eG9sZGxkKSAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBpMzg2LSotbGludXgqY29mZiopICAgZm10PWNvZmYgZW09bGludXggOzsKLSAgICAgIGkzODYtKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotbHlueG9zKikgICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgaTM4Ni0qLXN5c3Y0KiB8IGkzODYtKi1zb2xhcmlzKiB8IGkzODYtKi1lbGYpCi0JCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWZyZWVic2Rhb3V0KiB8IGkzODYtKi1mcmVlYnNkMTIuKiB8IGkzODYtKi1mcmVlYnNkMTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10PWFvdXQgZW09Mzg2YnNkIDs7Ci0gICAgICBpMzg2LSotZnJlZWJzZCopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotY29mZiB8IGkzODYtKi1zeXN2KiB8IGkzODYtKi1zY28zLjJ2NSpjb2ZmIHwgaTM4Ni0qLWlzYyopCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBpMzg2LSotc2NvMy4ydjUqKSAgICAgIGZtdD1lbGYKLQkJCSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldDsgdGhlbgotCQkJCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTQ09fRUxGIDEKLUVPRgotCi0JCQkgICAgZmkKLQkJCSAgICA7OwotICAgICAgaTM4Ni0qLXNjbzMuMiopICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBpMzg2LSotdnN0YSkgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGkzODYtKi1tc2Rvc2RqZ3BwKiB8IGkzODYtKi1nbzMyKiB8IGkzODYtZ28zMi1ydGVtcyopCi0JCQkgICAgZm10PWNvZmYgZW09Z28zMjs7Ci0gICAgICBpMzg2LSotcnRlbXNlbGYqKSAgICAgZm10PWVsZiA7OwotICAgICAgaTM4Ni0qLXJ0ZW1zKikgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBpMzg2LSotZ251KikgICAgICAgICAgZm10PWVsZiA7OwotICAgICAgaTM4Ni0qLW1hY2gqKQotCQkJICAgIGZtdD1hb3V0IGVtPW1hY2ggYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1tc2RvcyopICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgaTM4Ni0qLW1vc3MqKQkgICAgZm10PWVsZiA7OwotICAgICAgaTM4Ni0qLXBlKSAgICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBpMzg2LSotY3lnd2luKikgICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1pbnRlcml4KikJICAgIGZtdD1jb2ZmIGVtPWludGVyaXggYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1taW5ndzMyKikgICAgICBmbXQ9Y29mZiBlbT1wZSBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLSpudCopICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBpMzg2LSotdnh3b3JrcyopICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGk5NjAtKi1ib3V0KSAgICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLWNvZmYpICAgICAgICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7Ci0gICAgICBpOTYwLSotcnRlbXMqKSAgICAgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKLSAgICAgIGk5NjAtKi1uaW5keSopICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3M0KikgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotdnh3b3JrczUuMCkgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzNS4qKSAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3MqKSAgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLQotICAgICAgbTMyci0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBtNjhrLSotdnh3b3JrcyogfCBtNjhrLWVyaWNzc29uLW9zZSB8IG02OGstKi1zdW5vcyopCi0JCQkgICAgZm10PWFvdXQgZW09c3VuMyA7OwotICAgICAgbTY4ay1tb3Rvcm9sYS1zeXN2KikgIGZtdD1jb2ZmIGVtPWRlbHRhIDs7Ci0gICAgICBtNjhrLWJ1bGwtc3lzdjMqKSAgICAgZm10PWNvZmYgZW09ZHB4MiA7OwotICAgICAgbTY4ay1hcG9sbG8tKikgICAgICAgIGZtdD1jb2ZmIGVtPWFwb2xsbyA7OwotICAgICAgbTY4ay0qLXN5c3Y0KikgIyBtdXN0IGJlIGJlZm9yZSAtc3lzdioKLQkJCSAgICBmbXQ9ZWxmIGVtPXN2cjQgOzsKLSAgICAgIG02OGstKi1lbGYqKQkgICAgZm10PWVsZiA7OwotICAgICAgbTY4ay0qLWNvZmYgfCBtNjhrLSotc3lzdiogfCBtNjhrLSotcnRlbXMqKQotCQkJICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBtNjhrLSotaHB1eCopICAgICAgICAgZm10PWhwMzAwIGVtPWhwMzAwIDs7Ci0gICAgICBtNjhrLSotbGludXgqYW91dCopICAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIG02OGstKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IDs7Ci0gICAgICBtNjhrLSotZ251KikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG02OGstKi1seW54b3MqKSAgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7Ci0gICAgICBtNjhrLSotbmV0YnNkKikgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OwotICAgICAgbTY4ay0qLW9wZW5ic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG02OGstYXBwbGUtYXV4KikgICAgICBmbXQ9Y29mZiBlbT1hdXggOzsKLSAgICAgIG02OGstKi1wc29zKikgICAgICAgICBmbXQ9ZWxmIGVtPXBzb3M7OwotCi0gICAgICBtODhrLW1vdG9yb2xhLXN5c3YzKikgZm10PWNvZmYgZW09ZGVsdDg4IDs7Ci0gICAgICBtODhrLSotY29mZiopICAgICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgbWNvcmUtKi1lbGYpCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtY29yZS0qLXBlKQkgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgIyBkb24ndCBjaGFuZ2UgZW0gbGlrZSAqLSotYnNkIGRvZXMKLSAgICAgIG1pcHMtZGVjLW5ldGJzZCopCSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtZGVjLW9wZW5ic2QqKSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtZGVjLWJzZCopICAgICAgICBmbXQ9YW91dCBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLXNvbnktYnNkKikgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotYnNkKikgICAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbmtub3duIHZlbmRvciBmb3IgbWlwcy1ic2QgY29uZmlndXJhdGlvbi4iIDE+JjI7IGV4aXQgMTsgfSA7OwotICAgICAgbWlwcy0qLXVsdHJpeCopICAgICAgIGZtdD1lY29mZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLSotb3NmKikgICAgICAgICAgZm10PWVjb2ZmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtKi1lY29mZiopICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1lY29mZiopICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1pcml4NiopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtaXBzLSotaXJpeDUqKSAgICAgICAgZm10PWVsZiA7OwotICAgICAgbWlwcy0qLWlyaXgqKSAgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWxuZXdzKikgICAgICAgIGZtdD1lY29mZiBlbT1sbmV3cyA7OwotICAgICAgbWlwcy0qLXJpc2NvcyopICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLXN5c3YqKSAgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWVsZiogfCBtaXBzLSotcnRlbXMqIHwgbWlwcy0qLWxpbnV4LWdudSogfCBtaXBzLSotZ251KiB8IG1pcHMtKi1vcGVuYnNkKikKLQkJCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtaXBzLSotdnh3b3JrcyopICAgICAgZm10PWVsZgotCQkJICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBNSVBTX1NUQUJTX0VMRiAxCi1FT0YKLQotCQkJICAgIDs7Ci0gICAgICBtbjEwMjAwLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG1uMTAzMDAtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgcGoqKQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIHBwYy0qLXBlIHwgcHBjLSotY3lnd2luKiB8IHBwYy0qLXdpbm50KikKLQkJICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIHBwYy0qLWFpeCopICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgcHBjLSotYmVvcyopICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBwcGMtKi0qYnNkKiB8IHBwYy0qLWVsZiogfCBwcGMtKi1lYWJpKiB8IHBwYy0qLXN5c3Y0KikKLQkJCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBwcGMtKi1saW51eC1nbnUqKQkgICAgZm10PWVsZgotCQkJICAgIGNhc2UgIiRlbmRpYW4iIGluCi0JCQkgICAgYmlnKSAgOzsKLQkJCSAgICAqKSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEdOVS9MaW51eCBtdXN0IGJlIGNvbmZpZ3VyZWQgYmlnIGVuZGlhbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci0JCQkgICAgZXNhYwotCQkJICAgIDs7Ci0gICAgICBwcGMtKi1zb2xhcmlzKikJICAgIGZtdD1lbGYKLQkJCSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldDsgdGhlbgotCQkJCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBUQVJHRVRfU09MQVJJU19DT01NRU5UIDEKLUVPRgotCi0JCQkgICAgZmkKLQkJCSAgICBpZiB0ZXN0IHgke2VuZGlhbn0gPSB4YmlnOyB0aGVuCi0JCQkJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBTb2xhcmlzIG11c3QgYmUgY29uZmlndXJlZCBsaXR0bGUgZW5kaWFuIiAxPiYyOyBleGl0IDE7IH0KLQkJCSAgICBmaQotCQkJICAgIDs7Ci0gICAgICBwcGMtKi1ydGVtcyopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBwcGMtKi1tYWNvcyogfCBwcGMtKi1tcHcqKQotCQkJICAgIGZtdD1jb2ZmIGVtPW1hY29zIDs7Ci0gICAgICBwcGMtKi1uZXR3YXJlKikgICAgICAgZm10PWVsZiBlbT1wcGNudyA7OwotICAgICAgcHBjLSotdnh3b3JrcyopICAgICAgIGZtdD1lbGYgOzsKLQotICAgICAgc2gtKi1lbGYqKQkgICAgZm10PWVsZiA7OwotICAgICAgc2gtKi1jb2ZmKikgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBzaC0qLXJ0ZW1zZWxmKikgICAgICAgZm10PWVsZiA7OwotICAgICAgc2gtKi1ydGVtcyopCSAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBuczMyay1wYzUzMi1tYWNoKiB8IG5zMzJrLXBjNTMyLXV4KikgICAgZm10PWFvdXQgZW09cGM1MzJtYWNoIDs7Ci0gICAgICBuczMyay1wYzUzMi1uZXRic2QqIHwgbnMzMmstcGM1MzItbGl0ZXMqKSAgZm10PWFvdXQgZW09bmJzZDUzMiA7OwotICAgICAgbnMzMmstcGM1MzItb3BlbmJzZCopIGZtdD1hb3V0IGVtPW5ic2Q1MzIgOzsKLQotICAgICAgc3BhcmMtKi1ydGVtcyopICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBzcGFyYy0qLXN1bm9zNCopICAgICAgZm10PWFvdXQgZW09c3VuMyA7OwotICAgICAgc3BhcmMtKi1hb3V0IHwgc3BhcmMqLSotdnh3b3JrcyopCi0JCQkgICAgZm10PWFvdXQgZW09c3BhcmNhb3V0IDs7Ci0gICAgICBzcGFyYy0qLWNvZmYpICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHNwYXJjLSotbGludXgqYW91dCopICBmbXQ9YW91dCBlbT1saW51eCA7OwotICAgICAgc3BhcmMtKi1saW51eC1nbnUqKSAgIGZtdD1lbGYgZW09bGludXggOzsKLSAgICAgIHNwYXJjLSotbHlueG9zKikgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7Ci0gICAgICBzcGFyYy1mdWppdHN1LW5vbmUpICAgZm10PWFvdXQgOzsKLSAgICAgIHNwYXJjLSotZWxmIHwgc3BhcmMtKi1zeXN2NCogfCBzcGFyYy0qLXNvbGFyaXMqKQotCQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIHNwYXJjLSotbmV0YnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIDs7Ci0gICAgICBzcGFyYy0qLW9wZW5ic2QqKSAgICAgZm10PWFvdXQgZW09bmJzZCA7OwotCi0gICAgICBzdHJvbmdhcm0tKi1jb2ZmKSAgICAgZm10PWNvZmYgOzsKLSAgICAgIHN0cm9uZ2FybS0qLWVsZikgICAgICBmbXQ9ZWxmIDs7Ci0KLSAgICAgIHRpYzMwLSotKmFvdXQqKQkgICAgZm10PWFvdXQgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHRpYzMwLSotKmNvZmYqKSAgICAgICBmbXQ9Y29mZiBiZmRfZ2FzPXllcyA7OwotICAgICAgdGljODAtKi0qKQkgICAgZm10PWNvZmYgOzsKLQotICAgICAgdjg1MC0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgdjg1MGUtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgdjg1MGVhLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgdmF4LSotYnNkKiB8IHZheC0qLXVsdHJpeCopCi0JCQkgICAgZm10PWFvdXQgOzsKLSAgICAgIHZheC0qLXZtcykgICAgICAgICAgICBmbXQ9dm1zIDs7Ci0KLQotICAgICAgejhrLSotY29mZiB8IHo4ay0qLXNpbSkKLQkJCSAgICBmbXQ9Y29mZiA7OwotCi0gICAgICB3NjUtKi0qKSAgICAgICAgICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgKi0qLWFvdXQgfCAqLSotc2NvdXQpCi0JCQkgICAgZm10PWFvdXQgOzsKLSAgICAgICotKi1uaW5keSopCi0JCQkgICAgZm10PWJvdXQgOzsKLSAgICAgICotKi1ic2QqKQotCQkJICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKLSAgICAgICotKi1nZW5lcmljKSAgICAgICAgICBmbXQ9Z2VuZXJpYyA7OwotICAgICAgKi0qLXhyYXkgfCAqLSotaG1zKSAgIGZtdD1jb2ZmIDs7Ci0gICAgICAqLSotc2ltKSAgICAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgICotKi1lbGYgfCAqLSotc3lzdjQqIHwgKi0qLXNvbGFyaXMqKQotCQkJICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogR0FTIHN1cHBvcnQgZm9yICR7Z2VuZXJpY190YXJnZXR9IGlzIGluY29tcGxldGUuIiAxPiYyCi0JCQkgICAgZm10PWVsZiBkZXY9eWVzIDs7Ci0gICAgICAqLSotdnh3b3JrcykgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgICotKi1uZXR3YXJlKSAgICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQgOyB0aGVuCi0gICAgICBlbmRpYW5fZGVmPQotICAgICAgaWYgdGVzdCB4JHtlbmRpYW59ID0geGJpZzsgdGhlbgotCWVuZGlhbl9kZWY9MQotICAgICAgZWxpZiB0ZXN0IHgke2VuZGlhbn0gPSB4bGl0dGxlOyB0aGVuCi0JZW5kaWFuX2RlZj0wCi0gICAgICBmaQotICAgICAgaWYgdGVzdCB4JHtlbmRpYW5fZGVmfSAhPSB4OyB0aGVuCi0JY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gJGVuZGlhbl9kZWYKLUVPRgotCi0gICAgICBmaQotICAgIGZpCi0KLSAgICBjYXNlICR7Y3B1X3R5cGV9LSR7Zm10fSBpbgotICAgICAgYWxwaGEqLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBhcm0tKikJYmZkX2dhcz15ZXMgOzsKLSAgICAjIG5vdCB5ZXQKLSAgICAjIGkzODYtYW91dCkJYmZkX2dhcz1wcmVmZXJyZWQgOzsKLSAgICAgIG1pcHMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIG5zMzJrLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBwcGMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHNwYXJjLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBzdHJvbmdhcm0tKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgICotZWxmKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1lY29mZikJYmZkX2dhcz15ZXMgOzsKLSAgICAgICotc29tKQliZmRfZ2FzPXllcyA7OwotICAgICNlbmFibGUgYmZkIGZvciBjb2ZmIHRvIGFsbG93IHRlc3RpbmcgaWYgYSBiZmQgdGFyZ2V0IGlzIHRoZSBwcmltYXJ5IHRhcmdldCwKLSAgICAjYnV0IG5vdCBmb3IgY29mZiBhcyB0aGUgcHJpbWFyeSB0YXJnZXQKLSAgICAgIGkzODYtY29mZikJaWYgdGVzdCB4JHtwcmltYXJ5X2JmZF9nYXN9ID0geHllczsgdGhlbiBiZmRfZ2FzPXllczsgZmkgOzsKLSAgICAgICopCQk7OwotICAgIGVzYWMKLQotIyBPdGhlciByYW5kb20gc3R1ZmYuCi0KLSAgICAjIERvIHdlIG5lZWQgdGhlIG9wY29kZXMgbGlicmFyeT8KLSAgICBjYXNlICR7Y3B1X3R5cGV9IGluCi0gICAgICB2YXggfCBpMzg2IHwgdGljMzApCi0JOzsKLQotICAgICAgKikKLQluZWVkX29wY29kZXM9eWVzCi0KLQljYXNlICIke2VuYWJsZV9zaGFyZWR9IiBpbgotCXllcykgc2hhcmVkX29wY29kZXM9dHJ1ZSA7OwotCSpvcGNvZGVzKikgc2hhcmVkX29wY29kZXM9dHJ1ZSA7OwotCSopIHNoYXJlZF9vcGNvZGVzPWZhbHNlIDs7Ci0JZXNhYwotCWlmIHRlc3QgIiR7c2hhcmVkX29wY29kZXN9IiA9ICJ0cnVlIjsgdGhlbgotCSAgIyBBIHNoYXJlZCBsaWJvcGNvZGVzIG11c3QgYmUgbGlua2VkIGFnYWluc3QgbGliYmZkLgotCSAgbmVlZF9iZmQ9eWVzCi0JZmkKLQk7OwotICAgIGVzYWMKLQotICAgICMgQW55IG90aGVyIHNwZWNpYWwgb2JqZWN0IGZpbGVzIG5lZWRlZCA/Ci0gICAgY2FzZSAke2NwdV90eXBlfSBpbgotICAgICAgZnIzMCB8IG0zMnIpCi0JdXNpbmdfY2dlbj15ZXMKLQk7OwotCi0gICAgICBtNjhrKQotCWNhc2UgJHtleHRyYV9vYmplY3RzfSBpbgotCSptNjhrLXBhcnNlLm8qKSA7OwotCSopIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIG02OGstcGFyc2UubyIgOzsKLQllc2FjCi0JOzsKLQotICAgICAgbWlwcykKLQllY2hvICR7ZXh0cmFfb2JqZWN0c30gfCBncmVwIC1zICJpdGJsLXBhcnNlLm8iIAotCWlmIHRlc3QgJD8gLW5lIDAgOyB0aGVuCi0JICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBpdGJsLXBhcnNlLm8iCi0JZmkKLQotCWVjaG8gJHtleHRyYV9vYmplY3RzfSB8IGdyZXAgLXMgIml0YmwtbGV4Lm8iIAotCWlmIHRlc3QgJD8gLW5lIDAgOyB0aGVuCi0JICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBpdGJsLWxleC5vIgotCWZpCi0KLQllY2hvICR7ZXh0cmFfb2JqZWN0c30gfCBncmVwIC1zICJpdGJsLW9wcy5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1vcHMubyIKLQlmaQotCTs7Ci0KLSAgICAgIHNwYXJjKQotCWlmIHRlc3QgJHRoaXNfdGFyZ2V0ID0gJHRhcmdldCA7IHRoZW4KLQkgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIERFRkFVTFRfQVJDSCAiJHthcmNofSIKLUVPRgotCi0JZmkKLQk7OwotICAgICAgKikKLQk7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0JY2FzZSAieCR7ZXh0cmFfb2JqZWN0c30iIGluCi0JKmNnZW4ubyopIDs7Ci0JKikgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgY2dlbi5vIiA7OwotCWVzYWMKLSAgICBmaQotCi0jIFNlZSBpZiB3ZSByZWFsbHkgY2FuIHN1cHBvcnQgdGhpcyBjb25maWd1cmF0aW9uIHdpdGggdGhlIGVtdWxhdGlvbiBjb2RlLgotCi0gICAgaWYgdGVzdCAkdGhpc190YXJnZXQgPSAkdGFyZ2V0IDsgdGhlbgotICAgICAgcHJpbWFyeV9iZmRfZ2FzPSRiZmRfZ2FzCi0gICAgICBvYmpfZm9ybWF0PSRmbXQKLSAgICAgIHRlX2ZpbGU9JGVtCi0KLSAgICAgIGlmIHRlc3QgJGJmZF9nYXMgPSBubyA7IHRoZW4KLQkjIENhbid0IHN1cHBvcnQgb3RoZXIgY29uZmlndXJhdGlvbnMgdGhpcyB3YXkuCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZWxpZiB0ZXN0ICRiZmRfZ2FzID0gbm8gOyB0aGVuCi0gICAgICAjIENhbid0IHN1cHBvcnQgdGhpcyBjb25maWd1cmF0aW9uLgotICAgICAgYnJlYWsKLSAgICBmaQotCi0jIEZyb20gdGFyZ2V0IG5hbWUgYW5kIGZvcm1hdCwgcHJvZHVjZSBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGVtdWxhdGlvbnMuCi0KLSAgICBjYXNlICR7Z2VuZXJpY190YXJnZXR9LSR7Zm10fSBpbgotICAgICAgbWlwcy0qLWlyaXg1Ki0qKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYgbWlwc2JlY29mZiBtaXBzbGVjb2ZmIG1pcHNlY29mZiIgOzsKLSAgICAgIG1pcHMtKi1saW51eC1nbnUqLSopIGNhc2UgIiRlbmRpYW4iIGluCi0JCQliaWcpCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiBtaXBzYmVjb2ZmIG1pcHNsZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJKikJZW11bGF0aW9uPSJtaXBzbGVsZiBtaXBzYmVsZiBtaXBzZWxmIG1pcHNsZWNvZmYgbWlwc2JlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgICBtaXBzLSotbG5ld3MqLWVjb2ZmKSA7OwotICAgICAgbWlwcy0qLSotZWNvZmYpCWNhc2UgIiRlbmRpYW4iIGluCi0JCQliaWcpCWVtdWxhdGlvbj0ibWlwc2JlY29mZiBtaXBzbGVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlY29mZiBtaXBzYmVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCWVzYWMgOzsKLSAgICAgIG1pcHMtKi0qLWVsZikJY2FzZSAiJGVuZGlhbiIgaW4KLQkJCWJpZykJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIiA7OwotCQkJKikJZW11bGF0aW9uPSJtaXBzbGVsZiBtaXBzYmVsZiBtaXBzZWxmIiA7OwotCQkJZXNhYyA7OwotICAgICAgaTM4Ni0qLWVsZikJZW11bGF0aW9uPSJpMzg2ZWxmIiA7OwotICAgICAgaTM4Ni0qLWNvZmYpCWVtdWxhdGlvbj0iaTM4NmNvZmYiIDs7Ci0gICAgICAjIFVuY29tbWVudGluZyB0aGUgbmV4dCBsaW5lIHdpbGwgdHVybiBvbiBzdXBwb3J0IGZvciBpMzg2IENPRkYKLSAgICAgICMgaW4gYW55IGkzODYgRUxGIGNvbmZpZ3VyYXRpb24uCi0gICAgICAjIGkzODYtKi0qLWVsZikJZW11bGF0aW9uPSJpMzg2ZWxmIGkzODZjb2ZmIiA7OwotICAgIGVzYWMKLQotICAgIGVtdWxhdGlvbnM9IiRlbXVsYXRpb25zICRlbXVsYXRpb24iCi0KLWRvbmUKLQotIyBBc3NpZ24gZmxvYXRpbmcgcG9pbnQgdHlwZS4gIE1vc3QgcHJvY2Vzc29ycyB3aXRoIEZQIHN1cHBvcnQKLSMgSUVFRSBGUC4gIE9uIHRob3NlIHRoYXQgZG9uJ3Qgc3VwcG9ydCBGUCBhdCBhbGwsIHVzdWFsbHkgSUVFRQotIyBpcyBlbXVsYXRlZC4KLWNhc2UgJHt0YXJnZXRfY3B1fSBpbgotICB2YXggfCB0YWhvZSApCWF0b2Y9JHt0YXJnZXRfY3B1fSA7OwotICAqKQkJYXRvZj1pZWVlIDs7Ci1lc2FjCi0KLWNhc2UgIiR7b2JqX2Zvcm1hdH0iIGluCi0gICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEdBUyBkb2VzIG5vdCBrbm93IHdoYXQgZm9ybWF0IHRvIHVzZSBmb3IgdGFyZ2V0ICR7dGFyZ2V0fSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLSMgVW5mb3J0dW5hdGVseSB0aGUgY3B1IGluIGNwdS1vcGMuaCBmaWxlIGlzbid0IGFsd2F5cyAkKFRBUkdFVF9DUFUpLgotY2dlbl9jcHVfcHJlZml4PSIiCi1pZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgotICBjYXNlICR7dGFyZ2V0X2NwdX0gaW4KLSAgICAqKSBjZ2VuX2NwdV9wcmVmaXg9JHt0YXJnZXRfY3B1fSA7OwotICBlc2FjCi0gIAotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgVVNJTkdfQ0dFTiAxCi1FT0YKLQotZmkKLQotCi1pZiB0ZXN0ICEgLXIgJHtzcmNkaXJ9L2NvbmZpZy90Yy0ke3RhcmdldF9jcHVfdHlwZX0uYzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEdBUyBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCBDUFUgJHt0YXJnZXRfY3B1X3R5cGV9IiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWlmIHRlc3QgISAtciAke3NyY2Rpcn0vY29uZmlnL29iai0ke29ial9mb3JtYXR9LmM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBHQVMgZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciBvYmplY3QgZmlsZSBmb3JtYXQgJHtvYmpfZm9ybWF0fSIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1jYXNlICR7dXNlcl9iZmRfZ2FzfS0ke3ByaW1hcnlfYmZkX2dhc30gaW4KLSAgeWVzLXllcyB8IG5vLW5vKQotICAgICMgV2UgZGlkbid0IG92ZXJyaWRlIHVzZXIncyBjaG9pY2UuCi0gICAgOzsKLSAgbm8teWVzKQotICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogVXNlIG9mIEJGRCBpcyByZXF1aXJlZCBmb3IgJHt0YXJnZXR9OyBvdmVycmlkaW5nIGNvbmZpZyBvcHRpb25zLiIgMT4mMgotICAgIDs7Ci0gIG5vLXByZWZlcnJlZCkKLSAgICBwcmltYXJ5X2JmZF9nYXM9bm8KLSAgICA7OwotICAqLXByZWZlcnJlZCkKLSAgICBwcmltYXJ5X2JmZF9nYXM9eWVzCi0gICAgOzsKLSAgeWVzLSopCi0gICAgcHJpbWFyeV9iZmRfZ2FzPXllcwotICAgIDs7Ci0gIC0qKQotICAgICMgVXNlciBzcGVjaWZpZWQgbm90aGluZy4KLSAgICA7OwotZXNhYwotCi0jIFNvbWUgQ09GRiBjb25maWd1cmF0aW9ucyB3YW50IHRoZXNlIHJhbmRvbSBvdGhlciBmbGFncyBzZXQuCi1jYXNlICR7b2JqX2Zvcm1hdH0gaW4KLSAgY29mZikKLSAgICBjYXNlICR7dGFyZ2V0X2NwdV90eXBlfSBpbgotICAgICAgaTM4NikgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEkzODZDT0ZGIDEKLUVPRgotIDs7Ci0gICAgICBtNjhrKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTTY4S0NPRkYgMQotRU9GCi0gOzsKLSAgICAgIG04OGspIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBNODhLQ09GRiAxCi1FT0YKLSA7OwotICAgIGVzYWMKLSAgICA7OwotZXNhYwotCi0jIEdldHRpbmcgdGhpcyBkb25lIHJpZ2h0IGlzIGdvaW5nIHRvIGJlIGEgYml0Y2guICBFYWNoIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkCi0jIHdpdGggLS1lbmFibGUtdGFyZ2V0cz0uLi4gc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGVudmlyb25tZW50LCBmb3JtYXQsIGNwdSwgYW5kCi0jIGJmZF9nYXMgc2V0dGluZy4KLSMKLSMgRm9yIGVhY2ggY29uZmlndXJhdGlvbiwgdGhlIG5lY2Vzc2FyeSBvYmplY3QgZmlsZSBzdXBwb3J0IGNvZGUgbXVzdCBiZSBsaW5rZWQKLSMgaW4uICBUaGlzIG1pZ2h0IGJlIG9ubHkgb25lLCBpdCBtaWdodCBiZSB1cCB0byBmb3VyLiAgVGhlIG5lY2Vzc2FyeSBlbXVsYXRpb24KLSMgY29kZSBuZWVkcyB0byBiZSBwcm92aWRlZCwgdG9vLgotIwotIyBBbmQgdGhlbiB0aGVyZSdzICItLWVuYWJsZS10YXJnZXRzPWFsbCIuLi4uCi0jCi0jIEZvciBub3csIGp1c3QgYWx3YXlzIGRvIGl0IGZvciBNSVBTIEVMRiBvciBFQ09GRiBjb25maWd1cmF0aW9ucy4gIFNpZ2guCi0KLWZvcm1hdHM9IiR7b2JqX2Zvcm1hdH0iCi1lbWZpbGVzPSIiCi1FTVVMQVRJT05TPSIiCi1fZ2FzX3VuaXFfbGlzdD0iJGVtdWxhdGlvbnMiCi1fZ2FzX3VuaXFfbmV3bGlzdD0iIgotZm9yIF9nYXNfdW5pcV9pIGluIF9nYXNfdW5pcV9kdW1teSAkX2dhc191bmlxX2xpc3QgOyBkbwotICBjYXNlICRfZ2FzX3VuaXFfaSBpbgotICBfZ2FzX3VuaXFfZHVtbXkpIDs7Ci0gICopIGNhc2UgIiAkX2dhc191bmlxX25ld2xpc3QgIiBpbgotICAgICAgICoiICRfZ2FzX3VuaXFfaSAiKikgOzsKLSAgICAgICAqKSBfZ2FzX3VuaXFfbmV3bGlzdD0iJF9nYXNfdW5pcV9uZXdsaXN0ICRfZ2FzX3VuaXFfaSIgOzsKLSAgICAgZXNhYyA7OwotICBlc2FjCi1kb25lCi1lbXVsYXRpb25zPSRfZ2FzX3VuaXFfbmV3bGlzdAotCi1mb3IgZW0gaW4gLiAkZW11bGF0aW9ucyA7IGRvCi0gIGNhc2UgJGVtIGluCi0gICAgLikJY29udGludWUgOzsKLSAgICBtaXBzYmVsZiB8IG1pcHNsZWxmKQotCWZtdD1lbGYgICBmaWxlPW1pcHNlbGYgOzsKLSAgICBtaXBzYmVjb2ZmIHwgbWlwc2xlY29mZikKLQlmbXQ9ZWNvZmYgZmlsZT1taXBzZWNvZmYgOzsKLSAgICBpMzg2Y29mZikKLQlmbXQ9Y29mZiAgZmlsZT1pMzg2Y29mZiA7OwotICAgIGkzODZlbGYpCi0JZm10PWVsZiAgIGZpbGU9aTM4NmVsZiA7OwotICBlc2FjCi0gIGZvcm1hdHM9IiRmb3JtYXRzICRmbXQiCi0gIGVtZmlsZXM9IiRlbWZpbGVzIGUtJGZpbGUubyIKLSAgRU1VTEFUSU9OUz0iJEVNVUxBVElPTlMgJiRlbSwiCi1kb25lCi1fZ2FzX3VuaXFfbGlzdD0iJGZvcm1hdHMiCi1fZ2FzX3VuaXFfbmV3bGlzdD0iIgotZm9yIF9nYXNfdW5pcV9pIGluIF9nYXNfdW5pcV9kdW1teSAkX2dhc191bmlxX2xpc3QgOyBkbwotICBjYXNlICRfZ2FzX3VuaXFfaSBpbgotICBfZ2FzX3VuaXFfZHVtbXkpIDs7Ci0gICopIGNhc2UgIiAkX2dhc191bmlxX25ld2xpc3QgIiBpbgotICAgICAgICoiICRfZ2FzX3VuaXFfaSAiKikgOzsKLSAgICAgICAqKSBfZ2FzX3VuaXFfbmV3bGlzdD0iJF9nYXNfdW5pcV9uZXdsaXN0ICRfZ2FzX3VuaXFfaSIgOzsKLSAgICAgZXNhYyA7OwotICBlc2FjCi1kb25lCi1mb3JtYXRzPSRfZ2FzX3VuaXFfbmV3bGlzdAotCi1fZ2FzX3VuaXFfbGlzdD0iJGVtZmlsZXMiCi1fZ2FzX3VuaXFfbmV3bGlzdD0iIgotZm9yIF9nYXNfdW5pcV9pIGluIF9nYXNfdW5pcV9kdW1teSAkX2dhc191bmlxX2xpc3QgOyBkbwotICBjYXNlICRfZ2FzX3VuaXFfaSBpbgotICBfZ2FzX3VuaXFfZHVtbXkpIDs7Ci0gICopIGNhc2UgIiAkX2dhc191bmlxX25ld2xpc3QgIiBpbgotICAgICAgICoiICRfZ2FzX3VuaXFfaSAiKikgOzsKLSAgICAgICAqKSBfZ2FzX3VuaXFfbmV3bGlzdD0iJF9nYXNfdW5pcV9uZXdsaXN0ICRfZ2FzX3VuaXFfaSIgOzsKLSAgICAgZXNhYyA7OwotICBlc2FjCi1kb25lCi1lbWZpbGVzPSRfZ2FzX3VuaXFfbmV3bGlzdAotCi1pZiB0ZXN0IGBzZXQgLiAkZm9ybWF0cyA7IHNoaWZ0IDsgZWNobyAkI2AgLWd0IDEgOyB0aGVuCi0gIGZvciBmbXQgaW4gJGZvcm1hdHMgOyBkbwotICAgIGNhc2UgJGZtdCBpbgotICAgICAgYW91dCkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9BT1VUIDEKLUVPRgotICAgOzsKLSAgICAgIGJvdXQpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfQk9VVCAxCi1FT0YKLSAgIDs7Ci0gICAgICBjb2ZmKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0NPRkYgMQotRU9GCi0gICAgOzsKLSAgICAgIGVjb2ZmKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0VDT0ZGIDEKLUVPRgotICAgOzsKLSAgICAgIGVsZikJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9FTEYgMQotRU9GCi0gICAgIDs7Ci0gICAgICBnZW5lcmljKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0dFTkVSSUMgMQotRU9GCi0gOzsKLSAgICAgIGhwMzAwKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0hQMzAwIDEKLUVPRgotICAgOzsKLSAgICAgIGllZWUpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfSUVFRSAxCi1FT0YKLSAgICA7OwotICAgICAgc29tKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX1NPTSAxCi1FT0YKLSAgICAgOzsKLSAgICAgIHZtcykJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9WTVMgMQotRU9GCi0gICAgIDs7Ci0gICAgZXNhYwotICAgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIG9iai0kZm10Lm8iCi0gIGRvbmUKLSAgb2JqX2Zvcm1hdD1tdWx0aQotZmkKLWlmIHRlc3QgYHNldCAuICRlbWZpbGVzIDsgc2hpZnQgOyBlY2hvICQjYCAtZ3QgMCA7IHRoZW4KLSAgREVGQVVMVF9FTVVMQVRJT049YHNldCAuICRlbXVsYXRpb25zIDsgZWNobyAkMmAKLSAgIyBlLW1pcHMqIGhhcyBtb3JlIHRoYW4gb25lIGVtdWxhdGlvbiBwZXIgZmlsZSwgZS1pMzg2KiBoYXMganVzdCBvbmUgYXQgdGhlCi0gICMgbW9tZW50LiAgSWYgb25seSBvbmUgZW11bGF0aW9uIGlzIHNwZWNpZmllZCwgdGhlbiBkb24ndCBkZWZpbmUKLSAgIyBVU0VfRU1VTEFUSU9OUyBvciBpbmNsdWRlIGFueSBvZiB0aGUgZS1maWxlcyBhcyB0aGV5IHdpbGwgb25seSBiZSBibG9hdC4KLSAgY2FzZSAiJHtvYmpfZm9ybWF0fSR7ZW1maWxlc30iIGluCi0gICAgbXVsdGkqIHwgKm1pcHMqKQotICAgICAgdGVfZmlsZT1tdWx0aQotICAgICAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgJGVtZmlsZXMiCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgVVNFX0VNVUxBVElPTlMgMQotRU9GCi0gOzsKLSAgZXNhYwotZmkKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgRU1VTEFUSU9OUyAkRU1VTEFUSU9OUwotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIERFRkFVTFRfRU1VTEFUSU9OICIkREVGQVVMVF9FTVVMQVRJT04iCi1FT0YKLQotCi1jYXNlICR7cHJpbWFyeV9iZmRfZ2FzfS0ke3RhcmdldF9jcHVfdHlwZX0tJHtvYmpfZm9ybWF0fSBpbgotICB5ZXMtKi1jb2ZmKQluZWVkX2JmZD15ZXMgOzsKLSAgbm8tKi1jb2ZmKQluZWVkX2JmZD15ZXMKLQkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE1BTllfU0VHTUVOVFMgMQotRU9GCi0gOzsKLWVzYWMKLQotcmVqZWN0X2Rldl9jb25maWdzPXllcwotCi1jYXNlICR7cmVqZWN0X2Rldl9jb25maWdzfS0ke2Rldn0gaW4KLSAgeWVzLXllcykgIyBPb3BzLgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogR0FTIGRvZXMgbm90IHN1cHBvcnQgdGhlICR7Z2VuZXJpY190YXJnZXR9IGNvbmZpZ3VyYXRpb24uIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotZXNhYwotCi0KLQotCi0KLQotCi1jYXNlICIke3ByaW1hcnlfYmZkX2dhc30iIGluCi0gIHllcykJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEJGRF9BU1NFTUJMRVIgMQotRU9GCi0KLQluZWVkX2JmZD15ZXMgOzsKLWVzYWMKLQotIyBkbyB3ZSBuZWVkIHRoZSBvcGNvZGVzIGxpYnJhcnk/Ci1jYXNlICIke25lZWRfb3Bjb2Rlc30iIGluCi15ZXMpCi0gIE9QQ09ERVNfTElCPS4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYQotICA7OwotZXNhYwotCi1jYXNlICIke25lZWRfYmZkfSIgaW4KLXllcykKLSAgQkZETElCPS4uL2JmZC9saWJiZmQubGEKLSAgQUxMX09CSl9ERVBTPSIkQUxMX09CSl9ERVBTIC4uL2JmZC9iZmQuaCIKLSAgOzsKLWVzYWMKLQotCi0KLQotCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFRBUkdFVF9BTElBUyAiJHt0YXJnZXRfYWxpYXN9IgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFRBUkdFVF9DQU5PTklDQUwgIiR7dGFyZ2V0fSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfQ1BVICIke3RhcmdldF9jcHV9IgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFRBUkdFVF9WRU5ET1IgIiR7dGFyZ2V0X3ZlbmRvcn0iCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVEFSR0VUX09TICIke3RhcmdldF9vc30iCi1FT0YKLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzgyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODE0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAyODI1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjgzMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODU2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg2MTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg3MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODg5OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0KLWZvciBhY19wcm9nIGluICdiaXNvbiAteScgYnlhY2MKLWRvCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTI2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfWUFDQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRZQUNDIjsgdGhlbgotICBhY19jdl9wcm9nX1lBQ0M9IiRZQUNDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ZQUNDPSIkYWNfcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotWUFDQz0iJGFjX2N2X3Byb2dfWUFDQyIKLWlmIHRlc3QgLW4gIiRZQUNDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFlBQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi10ZXN0IC1uICIkWUFDQyIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRZQUNDIiB8fCBZQUNDPSJ5YWNjIgotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk1NzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTc4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTg5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTk1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDA2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDEyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1mb3IgYWNfcHJvZyBpbiBmbGV4IGxleAotZG8KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwNDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfTEVYPSIkYWNfcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCi1pZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiRMRVgiICYmIGJyZWFrCi1kb25lCi10ZXN0IC1uICIkTEVYIiB8fCBMRVg9IiIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IiIKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJmbGV4Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBmbGV4OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwNzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfTEVYPSJmbGV4IgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19MRVgiICYmIGFjX2N2X3Byb2dfTEVYPSJsZXgiCi1maQotZmkKLUxFWD0iJGFjX2N2X3Byb2dfTEVYIgotaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRVgiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkTEVYTElCIgotdGhlbgotICBjYXNlICIkTEVYIiBpbgotICBmbGV4KikgYWNfbGliPWZsIDs7Ci0gICopIGFjX2xpYj1sIDs7Ci0gIGVzYWMKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxMDk6IGNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gJGFjX2xpYidfJ3l5d3JhcCB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWwkYWNfbGliICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxMTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciB5eXdyYXAoKTsKLQotaW50IG1haW4oKSB7Ci15eXdyYXAoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExFWExJQj0iLWwkYWNfbGliIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTUxOiBjaGVja2luZyBsZXggb3V0cHV0IGZpbGUgcm9vdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19sZXhfcm9vdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgVGhlIG1pbmltYWwgbGV4IHByb2dyYW0gaXMganVzdCBhIHNpbmdsZSBsaW5lOiAlJS4gIEJ1dCBzb21lIGJyb2tlbiBsZXhlcwotIyAoU29sYXJpcywgSSB0aGluayBpdCB3YXMpIHdhbnQgdHdvICUlIGxpbmVzLCBzbyBhY2NvbW1vZGF0ZSB0aGVtLgotZWNobyAnJSUKLSUlJyB8ICRMRVgKLWlmIHRlc3QgLWYgbGV4Lnl5LmM7IHRoZW4KLSAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXgueXkKLWVsaWYgdGVzdCAtZiBsZXh5eS5jOyB0aGVuCi0gIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4eXkKLWVsc2UKLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW5ub3QgZmluZCBvdXRwdXQgZnJvbSAkTEVYOyBnaXZpbmcgdXAiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19sZXhfcm9vdCIgMT4mNgotTEVYX09VVFBVVF9ST09UPSRhY19jdl9wcm9nX2xleF9yb290Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgeXl0ZXh0IGlzIGEgcG9pbnRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE3MjogY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgUE9TSVggc2F5cyBsZXggY2FuIGRlY2xhcmUgeXl0ZXh0IGVpdGhlciBhcyBhIHBvaW50ZXIgb3IgYW4gYXJyYXk7IHRoZQotIyBkZWZhdWx0IGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gRmlndXJlIG91dCB3aGljaCBpdCBpcywgc2luY2UKLSMgbm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgcHJvdmlkZSB0aGUgJXBvaW50ZXIgYW5kICVhcnJheSBkZWNsYXJhdGlvbnMuCi1hY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj1ubwotZWNobyAnZXh0ZXJuIGNoYXIgKnl5dGV4dDsnID4+JExFWF9PVVRQVVRfUk9PVC5jCi1hY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iJExJQlMgJExFWExJQiIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxODQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotYGNhdCAkTEVYX09VVFBVVF9ST09ULmNgCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxOTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi1ybSAtZiAiJHtMRVhfT1VUUFVUX1JPT1R9LmMiCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBZWVRFWFRfUE9JTlRFUiAxCi1FT0YKLQotZmkKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjE1OiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjM2OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjQ5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyNjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI4NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzA1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzMTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM0MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzOTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQxNTogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQyOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NTU6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0NjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ4ODogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDkzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTIzOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUyOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTM1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU1NjogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTYxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1ODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjIxOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzYyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2NTE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2NTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzA2OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzcxNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NTg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNzYzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzY4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3OTc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4MDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzgyNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg1MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzg1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk5ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMjY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MDMxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDM2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA2NjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDA3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTIzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxNTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE4NTogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTkwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE5NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyMTg6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDIzODogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjU3OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MjYyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQyNjc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0Mjg0OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyODkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQyOTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDMxMjogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzMjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzMxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzQ3OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzNTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQyMTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDQ5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDc2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDUxMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTUyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDU4NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2MTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NjU0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzQ0OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzcyOiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0Nzc3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQ3ODI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDg0NTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2Ci0gIAotCi1pZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPQotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCi1lbHNlCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJwotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9Ci1maQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4Njg6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4NzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4ODQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5MDE6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDkwNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5MTM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDkzMjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDk0MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotZm9yIGFjX2hkciBpbiBzdHJpbmcuaCBzdGRsaWIuaCBtZW1vcnkuaCBzdHJpbmdzLmggdW5pc3RkLmggc3RkYXJnLmggdmFyYXJncy5oIGVycm5vLmggc3lzL3R5cGVzLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTY3OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDk3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDk3NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotIyBQdXQgdGhpcyBoZXJlIHNvIHRoYXQgYXV0b2NvbmYncyAiY3Jvc3MtY29tcGlsaW5nIiBtZXNzYWdlIGRvZXNuJ3QgY29uZnVzZQotIyBwZW9wbGUgd2hvIGFyZSBub3QgY3Jvc3MtY29tcGlsaW5nIGJ1dCBhcmUgY29tcGlsaW5nIGNyb3NzLWFzc2VtYmxlcnMuCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGNvbXBpbGluZyBhIGNyb3NzLWFzc2VtYmxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTAwNzogY2hlY2tpbmcgd2hldGhlciBjb21waWxpbmcgYSBjcm9zcy1hc3NlbWJsZXIiID4mNQotaWYgdGVzdCAiJHtob3N0fSIgPSAiJHt0YXJnZXR9IjsgdGhlbgotICBjcm9zc19nYXM9bm8KLWVsc2UKLSAgY3Jvc3NfZ2FzPXllcwotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ1JPU1NfQ09NUElMRSAxCi1FT0YKLQotZmkKLWVjaG8gIiRhY190IiIkY3Jvc3NfZ2FzIiAxPiY2Ci0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwMjI6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDI3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwMzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDU1OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUwNjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA4ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUxMjA6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MTI1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTE1MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTE1NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTc4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUyMDU6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MjEzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUyMzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MjU0OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUyNjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjY4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLQotIyBWTVMgZG9lc24ndCBoYXZlIHVubGluay4KLWZvciBhY19mdW5jIGluIHVubGluayByZW1vdmUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUyOTg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUzMDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTMyNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgU29tZSBzeXN0ZW1zIGRvbid0IGhhdmUgc2JyaygpLgotZm9yIGFjX2Z1bmMgaW4gc2JyawotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTM1NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTM2MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzgzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgU29tZSBub24tQU5TSSBwcmVwcm9jZXNzb3JzIGJvdGNoIHJlcXVvdGluZyBpbnNpZGUgc3RyaW5ncy4gIFRoYXQncyBiYWQKLSMgZW5vdWdoLCBidXQgb24gc29tZSBvZiB0aG9zZSBzeXN0ZW1zLCB0aGUgYXNzZXJ0IG1hY3JvIHJlbGllcyBvbiByZXF1b3RpbmcKLSMgd29ya2luZyBwcm9wZXJseSEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFzc2VydCBtYWNybyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTQxMjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXNzZXJ0IG1hY3JvIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfYXNzZXJ0X29rJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTQxNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLWludCBtYWluKCkgewotCi0vKiBjaGVjayBmb3IgcmVxdW90aW5nIHByb2JsZW1zICovCi1zdGF0aWMgaW50IGEsIGIsIGMsIGQ7Ci1zdGF0aWMgY2hhciAqczsKLWFzc2VydCAoIXN0cmNtcChzLCAiZm9vIGJhciBiYXogcXV1eCIpKTsKLS8qIGNoZWNrIGZvciBuZXdsaW5lIGhhbmRsaW5nICovCi1hc3NlcnQgKGEgPT0gYgotICAgICAgICB8fCBjID09IGQpOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQzMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2Fzc2VydF9vaz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2Fzc2VydF9vaz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2Fzc2VydF9vayIgMT4mNgotdGVzdCAkZ2FzX2N2X2Fzc2VydF9vayA9IHllcyB8fCBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQlJPS0VOX0FTU0VSVCAxCi1FT0YKLQotCi0KLSMgT24gc29tZSBzeXN0ZW1zLCB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBtYXkgbm90IGRlY2xhcmUgbWFsbG9jLCByZWFsbG9jLAotIyBhbmQgZnJlZS4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgZ2FzIG5lZWRzIHRoZXNlIGZ1bmN0aW9ucyB0byBoYXZlIGJlZW4KLSMgZGVjbGFyZWQgLS0gc3VjaCBhcyB3aGVuIHRha2luZyB0aGVpciBhZGRyZXNzZXMuCi1nYXNfdGVzdF9oZWFkZXJzPSIKLSNpZmRlZiBIQVZFX01FTU9SWV9ICi0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3Igc3Ryc3RyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NDc0OiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzdHJzdHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9zdHJzdHInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NDc5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBjaGFyICooKmYpKCk7Ci1mIHg7Ci14ID0gKGYpIHN0cnN0cjsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU0OTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9zdHJzdHI9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGdhc19jdl9kZWNsX25lZWRlZF9zdHJzdHIiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9zdHJzdHIgPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIgMQotRU9GCi0KLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgbWFsbG9jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NTExOiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBtYWxsb2MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9tYWxsb2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NTE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBjaGFyICooKmYpKCk7Ci1mIHg7Ci14ID0gKGYpIG1hbGxvYzsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1Mjc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9tYWxsb2M9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX21hbGxvYz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGdhc19jdl9kZWNsX25lZWRlZF9tYWxsb2MiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9tYWxsb2MgPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MgMQotRU9GCi0KLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZnJlZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTU0ODogY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZnJlZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NTUzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiB2b2lkICgqZikoKTsKLWYgeDsKLXggPSAoZikgZnJlZTsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1NjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9mcmVlPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9mcmVlPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWUiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9mcmVlID0geWVzOyB0aGVuCi0gY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlJFRSAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzYnJrIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NTg1OiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzYnJrIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfZGVjbF9uZWVkZWRfc2Jyaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU1OTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotJGdhc190ZXN0X2hlYWRlcnMKLWludCBtYWluKCkgewotCi10eXBlZGVmIGNoYXIgKigqZikoKTsKLWYgeDsKLXggPSAoZikgc2JyazsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2MDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9zYnJrPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9zYnJrPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX3NicmsiIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9zYnJrID0geWVzOyB0aGVuCi0gY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU0JSSyAxCi1FT0YKLQotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlbnZpcm9uIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NjIyOiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlbnZpcm9uIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU2MjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotJGdhc190ZXN0X2hlYWRlcnMKLWludCBtYWluKCkgewotCi10eXBlZGVmIGNoYXIgKipmOwotZiB4OwoteCA9IChmKSBlbnZpcm9uOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTYzODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb249eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotZWNobyAiJGFjX3QiIiRnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiIgMT4mNgotaWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24gPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OIDEKLUVPRgotCi1maQotCi0KLSMgRG9lcyBlcnJuby5oIGRlY2xhcmUgZXJybm8sIG9yIGRvIHdlIGhhdmUgdG8gYWRkIGEgc2VwYXJhdGUgZGVjbGFyYXRpb24KLSMgZm9yIGl0PwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlcnJubyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTY2MjogY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZXJybm8iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9lcnJubycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU2NjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgSEFWRV9FUlJOT19ICi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBpbnQgZjsKLWYgeDsKLXggPSAoZikgZXJybm87Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NjgyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfZXJybm89bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2Vycm5vPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX2Vycm5vIiAxPiY2Ci1pZiB0ZXN0ICRnYXNfY3ZfZGVjbF9uZWVkZWRfZXJybm8gPSB5ZXM7IHRoZW4KLSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9FUlJOTyAxCi1FT0YKLQotZmkKLQotCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSAke0dEQklOSVR9OmdkYmluaXQuaW4gcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBQQUNLQUdFQCUkUEFDS0FHRSVnCi1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCi1zJUBBQ0xPQ0FMQCUkQUNMT0NBTCVnCi1zJUBBVVRPQ09ORkAlJEFVVE9DT05GJWcKLXMlQEFVVE9NQUtFQCUkQVVUT01BS0UlZwotcyVAQVVUT0hFQURFUkAlJEFVVE9IRUFERVIlZwotcyVATUFLRUlORk9AJSRNQUtFSU5GTyVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBDQ0AlJENDJWcKLXMlQExEQCUkTEQlZwotcyVATk1AJSROTSVnCi1zJUBVU0VfU1lNQk9MX1VOREVSU0NPUkVAJSRVU0VfU1lNQk9MX1VOREVSU0NPUkUlZwotcyVATE5fU0AlJExOX1MlZwotcyVARExMVE9PTEAlJERMTFRPT0wlZwotcyVAQVNAJSRBUyVnCi1zJUBMSUJUT09MQCUkTElCVE9PTCVnCi1zJUBHREJJTklUQCUkR0RCSU5JVCVnCi1zJUBjZ2VuX2NwdV9wcmVmaXhAJSRjZ2VuX2NwdV9wcmVmaXglZwotcyVAZXh0cmFfb2JqZWN0c0AlJGV4dHJhX29iamVjdHMlZwotcyVAdGFyZ2V0X2NwdV90eXBlQCUkdGFyZ2V0X2NwdV90eXBlJWcKLXMlQG9ial9mb3JtYXRAJSRvYmpfZm9ybWF0JWcKLXMlQHRlX2ZpbGVAJSR0ZV9maWxlJWcKLXMlQGluc3RhbGxfdG9vbGRpckAlJGluc3RhbGxfdG9vbGRpciVnCi1zJUBhdG9mQCUkYXRvZiVnCi1zJUBCRkRMSUJAJSRCRkRMSUIlZwotcyVAT1BDT0RFU19MSUJAJSRPUENPREVTX0xJQiVnCi1zJUBBTExfT0JKX0RFUFNAJSRBTExfT0JKX0RFUFMlZwotcyVAWUFDQ0AlJFlBQ0MlZwotcyVATEVYQCUkTEVYJWcKLXMlQExFWExJQkAlJExFWExJQiVnCi1zJUBDUFBAJSRDUFAlZwotcyVATEVYX09VVFBVVF9ST09UQCUkTEVYX09VVFBVVF9ST09UJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSAke0dEQklOSVR9OmdkYmluaXQuaW4gcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotdGFyZ2V0X2NwdV90eXBlPSR7dGFyZ2V0X2NwdV90eXBlfQotIGNnZW5fY3B1X3ByZWZpeD0ke2NnZW5fY3B1X3ByZWZpeH0KLSBvYmpfZm9ybWF0PSR7b2JqX2Zvcm1hdH0KLSB0ZV9maWxlPSR7dGVfZmlsZX0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLXJtIC1mIHRhcmctY3B1LmMgdGFyZy1jcHUuaCBvYmotZm9ybWF0Lmggb2JqLWZvcm1hdC5jIHRhcmctZW52LmggYXRvZi10YXJnLmMgaXRibC1jcHUuaAotIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiR7dGFyZ2V0X2NwdV90eXBlfSInLmgiJyA+IHRhcmctY3B1LmgKLSBlY2hvICcjaW5jbHVkZSAib2JqLSciJHtvYmpfZm9ybWF0fSInLmgiJyA+IG9iai1mb3JtYXQuaAotIGVjaG8gJyNpbmNsdWRlICJ0ZS0nIiR7dGVfZmlsZX0iJy5oIicgPiB0YXJnLWVudi5oCi0gZWNobyAnI2luY2x1ZGUgIml0YmwtJyIke3RhcmdldF9jcHVfdHlwZX0iJy5oIicgPiBpdGJsLWNwdS5oCi0gaWYgdGVzdCAieCRjZ2VuX2NwdV9wcmVmaXgiICE9IHggOyB0aGVuCi0gICBlY2hvICcjaW5jbHVkZSAib3Bjb2Rlcy8nIiR7Y2dlbl9jcHVfcHJlZml4fSInLWRlc2MuaCInID4gY2dlbi1kZXNjLmgKLSBmaQotCi0gc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZ3VyZS5pbiBiL2dhcy9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NzIxMWEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDc5NyArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLWRubAotZG5sIEFuZCBiZSBjYXJlZnVsIHdoZW4gY2hhbmdpbmcgaXQhICBJZiB5b3UgbXVzdCBhZGQgdGVzdHMgd2l0aCBzcXVhcmUKLWRubCBicmFja2V0cywgYmUgc3VyZSBjaGFuZ2VxdW90ZSBpbnZvY2F0aW9ucyBzdXJyb3VuZCBpdC4KLWRubAotZG5sCi1kbmwgdjIuNSBuZWVkZWQgZm9yIC0tYmluZGlyIGV0IGFsCi1BQ19QUkVSRVEoMi4xMykKLUFDX0lOSVQoYXMuaCkKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotCi1BTV9JTklUX0FVVE9NQUtFKGdhcywgMi45LjUpCi0KLUFNX1BST0dfTElCVE9PTAotCi11c2VyX2JmZF9nYXM9Ci1BQ19BUkdfRU5BQkxFKGJmZC1hc3NlbWJsZXIsCi1bICAtLWVuYWJsZS1iZmQtYXNzZW1ibGVyICB1c2UgQkZEIGJhY2sgZW5kIGZvciB3cml0aW5nIG9iamVjdCBmaWxlc10sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIG5lZWRfYmZkPXllcyB1c2VyX2JmZF9nYXM9eWVzIDs7Ci0gIG5vKSAgdXNlcl9iZmRfZ2FzPW5vIDs7Ci0gICopICAgQUNfTVNHX0VSUk9SKGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZ2l2ZW4gZm9yIGJmZC1hc3NlbWJsZXIgb3B0aW9uKSA7OwotZXNhY10pZG5sCi1BQ19BUkdfRU5BQkxFKHRhcmdldHMsCi1bICAgIHRhcmdldHMgICAgICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMgYmVzaWRlcyB0aGUgcHJpbWFyeV0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgQUNfRVJST1IoZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCcpCi0JICAgIDs7Ci0gIG5vKQkgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopCSAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19FTkFCTEUoY29tbW9uYmZkbGliLAotWyAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5XSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICBBQ19NU0dfRVJST1IoW2JhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIEJGRCBjb21tb25iZmRsaWIgb3B0aW9uXSkgOzsKLWVzYWNdKWRubAotCi11c2luZ19jZ2VuPW5vCi0KLSMgR2VuZXJhdGUgYSBoZWFkZXIgZmlsZQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi0KLSMgSWYgd2UgYXJlIG9uIGEgRE9TIGZpbGVzeXN0ZW0sIHdlIG11c3QgdXNlIGdkYi5pbmkgcmF0aGVyIHRoYW4KLSMgLmdkYmluaXQuCi1HREJJTklUPSIuZ2RiaW5pdCIKLWNhc2UgIiR7aG9zdH0iIGluCi0gICotKi1tc2RvcyogfCAqLSotZ28zMiogfCAqLSotbWluZ3czMiogfCAqLSotY3lnd2luKiB8ICotKi13aW5kb3dzKikKLSAgICBHREJJTklUPSJnZGIuaW5pIgotICAgIDs7Ci1lc2FjCi1BQ19TVUJTVChHREJJTklUKQotCi10ZV9maWxlPWdlbmVyaWMKLQotIyBNYWtlZmlsZSB0YXJnZXQgZm9yIGluc3RhbGxpbmcgZ2FzIGluICQodG9vbGRpcikvYmluLgotaW5zdGFsbF90b29sZGlyPWluc3RhbGwtZXhlYy10b29sZGlyCi0KLWNhbm9uX3RhcmdldHM9IiIKLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gIGZvciB0IGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgOyBkbwotICAgIHJlc3VsdD1gJGFjX2NvbmZpZ19zdWIgJHQgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0gICAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotIyAgICBlbHNlCi0jICAgICAgIyBQZXJtaXQgImFsbCIsIGV0Yy4gIFdlIGRvbid0IHN1cHBvcnQgaXQgeWV0IHRob3VnaC4KLSMgICAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdCIKLSAgICBmaQotICBkb25lCi0gIEdBU19VTklRKGNhbm9uX3RhcmdldHMpCi1maQotCi1lbXVsYXRpb25zPSIiCi0KLWZvciB0aGlzX3RhcmdldCBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzIDsgZG8KLQotY2hhbmdlcXVvdGUoLClkbmwKLSAgICBldmFsIGBlY2hvICR0aGlzX3RhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL2NwdT1cMSB2ZW5kb3I9XDIgb3M9XDMvJ2AKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQotICAgICMgY2hlY2sgZm9yIGFyY2hpdGVjdHVyZSB2YXJpYW50cwotICAgIGFyY2g9Ci0gICAgZW5kaWFuPQotICAgIGNhc2UgJHtjcHV9IGluCi0gICAgICBhbHBoYSopCQljcHVfdHlwZT1hbHBoYSA7OwotICAgICAgYXJtZWIpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWJpZyA7OwotICAgICAgYXJtKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm1iKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm12KmwpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgYXJtdipiKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1iaWcgOzsKLSAgICAgIHN0cm9uZ2FybSopCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICB0aHVtYiopCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgaHBwYSopCQljcHVfdHlwZT1ocHBhIDs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICAgICAgaVs0NTZdODYpCQljcHVfdHlwZT1pMzg2IDs7Ci0gICAgICBtNjgwWzAxMjM0Nl0wKQljcHVfdHlwZT1tNjhrIDs7Ci1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gICAgICBtNjgwMDgpCQljcHVfdHlwZT1tNjhrIDs7Ci0gICAgICBtNjgzPz8pCQljcHVfdHlwZT1tNjhrIDs7Ci0gICAgICBtNTIwMCkJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG04KikJCWNwdV90eXBlPW04OGsgOzsKLSAgICAgIG1pcHMqZWwpCQljcHVfdHlwZT1taXBzIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMqKQkJY3B1X3R5cGU9bWlwcyBlbmRpYW49YmlnIDs7Ci0gICAgICBwamwqKQkJY3B1X3R5cGU9cGogZW5kaWFuPWxpdHRsZSA7OwotICAgICAgcGoqKQkJY3B1X3R5cGU9cGogZW5kaWFuPWJpZyA7OwotICAgICAgcG93ZXJwY2xlKikJY3B1X3R5cGU9cHBjIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIHBvd2VycGMqKQkJY3B1X3R5cGU9cHBjIGVuZGlhbj1iaWcgOzsKLSAgICAgIHJzNjAwMCopCQljcHVfdHlwZT1wcGMgOzsKLSAgICAgIHNwYXJjbGl0ZSopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsaXRlIDs7Ci0gICAgICBzcGFyY2xldCopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsZXQgOzsKLSAgICAgIHNwYXJjNjQqKQkJY3B1X3R5cGU9c3BhcmMgYXJjaD12OS02NCA7OwotICAgICAgc3BhcmM4NngqKQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjODZ4ICA7OwotICAgICAgc3BhcmMqKQkJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xpdGUgOzsgIyA/Pz8gU2VlIHRjLXNwYXJjLmMuCi0gICAgICB2ODUwKikJCWNwdV90eXBlPXY4NTAgOzsKLSAgICAgICopCQljcHVfdHlwZT0ke2NwdX0gOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIHRhcmdldF9jcHVfdHlwZT0ke2NwdV90eXBlfQotICAgIGVsaWYgdGVzdCAke3RhcmdldF9jcHVfdHlwZX0gIT0gJHtjcHVfdHlwZX0gOyB0aGVuCi0gICAgICBjb250aW51ZQotICAgIGZpCi0KLSAgICBnZW5lcmljX3RhcmdldD0ke2NwdV90eXBlfS0kdmVuZG9yLSRvcwotICAgIGRldj1ubwotICAgIGJmZF9nYXM9bm8KLSAgICBlbT1nZW5lcmljCi0KLSAgICAjIGFzc2lnbiBvYmplY3QgZm9ybWF0Ci0gICAgY2FzZSAke2dlbmVyaWNfdGFyZ2V0fSBpbgotICAgICAgYTI5ay0qLWNvZmYpICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLWFtZC11ZGkpICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstYW1kLWVibW9uKSAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay1ueXUtc3ltMSkgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLSotdnh3b3JrcyopICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgYWxwaGEqLSotKnZtcyopCSAgICBmbXQ9ZXZheCA7OwotICAgICAgYWxwaGEqLSotbmV0d2FyZSopICAgIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotb3BlbmJzZCopICAgIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotb3NmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotbGludXhlY29mZiopIGZtdD1lY29mZiA7OwotICAgICAgYWxwaGEqLSotbGludXgtZ251KikgIGZtdD1lbGYgZW09bGludXggOzsKLSAgICAgIGFscGhhKi0qLW5ldGJzZCopICAgICBmbXQ9ZWxmIGVtPW5ic2QgOzsKLQotICAgICAgYXJjLSotZWxmKikgICAgICAgICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgYXJtLSotYW91dCkJICAgICAgICAgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBhcm0tKi1jb2ZmIHwgdGh1bWItKi1jb2ZmKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGFybS0qLWVsZiB8IHRodW1iLSotZWxmKSAgICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBhcm0tKi1saW51eCphb3V0KikJICAgICAgICBmbXQ9YW91dCBlbT1saW51eCA7OwotICAgICAgYXJtLSotbGludXgqIHwgYXJtdiotKi1saW51eC1nbnUpCWZtdD1lbGYgIGVtPWxpbnV4IDs7Ci0gICAgICBhcm0tKi1uZXRic2QqKQkgICAgICAgICAgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OwotICAgICAgYXJtLSotb2FiaSB8IHRodW1iLSotb2FiaSkgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIGFybS1lcG9jLXBlIHwgdGh1bWItZXBvYy1wZSkgICAgICBmbXQ9Y29mZiBlbT1lcG9jLXBlIDs7Ci0gICAgICBhcm0tKi1wZSB8IHRodW1iLSotcGUpICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGFybS0qLXJpc2NpeCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1yaXNjaXggOzsKLQotICAgICAgZDEwdi0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgZDMwdi0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0KLSAgICAgIGZyMzAtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgaHBwYS0qLSplbGYqKSAgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWxpbnV4LWdudSopICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWxpdGVzKikgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLW9zZiopICAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLXJ0ZW1zKikgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWhwdXgqKSAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLW1wZWl4KikgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWJzZCopICAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotICAgICAgaHBwYS0qLWhpdXgqKSAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OwotCi0gICAgICBoODMwMC0qLWNvZmYpICAgICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgaTM4Ni1pYm0tYWl4KikgICAgICAgIGZtdD1jb2ZmIGVtPWkzODZhaXggOzsKLSAgICAgIGkzODYtc2VxdWVudC1ic2QqKSAgICBmbXQ9YW91dCBlbT1keW5peCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWJlb3NwZSopICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotYmVvc2VsZiogfCBpMzg2LSotYmVvcyopIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1ic2QqKSAgICAgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1uZXRic2QwLjgpICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1uZXRic2QqKSAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKLSAgICAgIGkzODYtKi1vcGVuYnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKLSAgICAgIGkzODYtKi1saW51eCphb3V0KiB8IGkzODYtKi1saW51eG9sZGxkKSAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBpMzg2LSotbGludXgqY29mZiopICAgZm10PWNvZmYgZW09bGludXggOzsKLSAgICAgIGkzODYtKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotbHlueG9zKikgICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgaTM4Ni0qLXN5c3Y0KiB8IGkzODYtKi1zb2xhcmlzKiB8IGkzODYtKi1lbGYpCi0JCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWZyZWVic2Rhb3V0KiB8IGkzODYtKi1mcmVlYnNkWzEyXS4qIHwgaTM4Ni0qLWZyZWVic2RbMTJdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdD1hb3V0IGVtPTM4NmJzZCA7OwotICAgICAgaTM4Ni0qLWZyZWVic2QqKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWNvZmYgfCBpMzg2LSotc3lzdiogfCBpMzg2LSotc2NvMy4ydjUqY29mZiB8IGkzODYtKi1pc2MqKQotICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgaTM4Ni0qLXNjbzMuMnY1KikgICAgICBmbXQ9ZWxmCi0JCQkgICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQ7IHRoZW4KLQkJCQlBQ19ERUZJTkUoU0NPX0VMRiwgMSwKLQkJCQkgICAgW0RlZmluZSBpZiBkZWZhdWx0aW5nIHRvIEVMRiBvbiBTQ08gNS5dKQotCQkJICAgIGZpCi0JCQkgICAgOzsKLSAgICAgIGkzODYtKi1zY28zLjIqKSAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgaTM4Ni0qLXZzdGEpICAgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBpMzg2LSotbXNkb3NkamdwcCogfCBpMzg2LSotZ28zMiogfCBpMzg2LWdvMzItcnRlbXMqKQotCQkJICAgIGZtdD1jb2ZmIGVtPWdvMzI7OwotICAgICAgaTM4Ni0qLXJ0ZW1zZWxmKikgICAgIGZtdD1lbGYgOzsKLSAgICAgIGkzODYtKi1ydGVtcyopICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgaTM4Ni0qLWdudSopICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIGkzODYtKi1tYWNoKikKLQkJCSAgICBmbXQ9YW91dCBlbT1tYWNoIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotbXNkb3MqKSAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGkzODYtKi1tb3NzKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIGkzODYtKi1wZSkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgaTM4Ni0qLWN5Z3dpbiopICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotaW50ZXJpeCopCSAgICBmbXQ9Y29mZiBlbT1pbnRlcml4IGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotbWluZ3czMiopICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi0qbnQqKSAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgaTM4Ni0qLXZ4d29ya3MqKSAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBpOTYwLSotYm91dCkgICAgICAgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi1jb2ZmKSAgICAgICAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OwotICAgICAgaTk2MC0qLXJ0ZW1zKikgICAgICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7Ci0gICAgICBpOTYwLSotbmluZHkqKSAgICAgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzNCopICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3M1LjApICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotdnh3b3JrczUuKikgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzKikgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLWVsZiopCSAgICBmbXQ9ZWxmIDs7Ci0KLSAgICAgIG0zMnItKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgbTY4ay0qLXZ4d29ya3MqIHwgbTY4ay1lcmljc3Nvbi1vc2UgfCBtNjhrLSotc3Vub3MqKQotCQkJICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKLSAgICAgIG02OGstbW90b3JvbGEtc3lzdiopICBmbXQ9Y29mZiBlbT1kZWx0YSA7OwotICAgICAgbTY4ay1idWxsLXN5c3YzKikgICAgIGZtdD1jb2ZmIGVtPWRweDIgOzsKLSAgICAgIG02OGstYXBvbGxvLSopICAgICAgICBmbXQ9Y29mZiBlbT1hcG9sbG8gOzsKLSAgICAgIG02OGstKi1zeXN2NCopICMgbXVzdCBiZSBiZWZvcmUgLXN5c3YqCi0JCQkgICAgZm10PWVsZiBlbT1zdnI0IDs7Ci0gICAgICBtNjhrLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG02OGstKi1jb2ZmIHwgbTY4ay0qLXN5c3YqIHwgbTY4ay0qLXJ0ZW1zKikKLQkJCSAgICBmbXQ9Y29mZiA7OwotICAgICAgbTY4ay0qLWhwdXgqKSAgICAgICAgIGZtdD1ocDMwMCBlbT1ocDMwMCA7OwotICAgICAgbTY4ay0qLWxpbnV4KmFvdXQqKSAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBtNjhrLSotbGludXgtZ251KikgICAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgbTY4ay0qLWdudSopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtNjhrLSotbHlueG9zKikgICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgbTY4ay0qLW5ldGJzZCopICAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG02OGstKi1vcGVuYnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtNjhrLWFwcGxlLWF1eCopICAgICAgZm10PWNvZmYgZW09YXV4IDs7Ci0gICAgICBtNjhrLSotcHNvcyopICAgICAgICAgZm10PWVsZiBlbT1wc29zOzsKLQotICAgICAgbTg4ay1tb3Rvcm9sYS1zeXN2MyopIGZtdD1jb2ZmIGVtPWRlbHQ4OCA7OwotICAgICAgbTg4ay0qLWNvZmYqKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIG1jb3JlLSotZWxmKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgbWNvcmUtKi1wZSkJICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgICMgZG9uJ3QgY2hhbmdlIGVtIGxpa2UgKi0qLWJzZCBkb2VzCi0gICAgICBtaXBzLWRlYy1uZXRic2QqKQkgICAgZm10PWVsZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLWRlYy1vcGVuYnNkKikgICAgZm10PWVsZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLWRlYy1ic2QqKSAgICAgICAgZm10PWFvdXQgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy1zb255LWJzZCopICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWJzZCopICAgICAgICAgIEFDX01TR19FUlJPUihVbmtub3duIHZlbmRvciBmb3IgbWlwcy1ic2QgY29uZmlndXJhdGlvbi4pIDs7Ci0gICAgICBtaXBzLSotdWx0cml4KikgICAgICAgZm10PWVjb2ZmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtKi1vc2YqKSAgICAgICAgICBmbXQ9ZWNvZmYgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy0qLWVjb2ZmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWVjb2ZmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWlyaXg2KikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi1pcml4NSopICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtaXBzLSotaXJpeCopICAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotbG5ld3MqKSAgICAgICAgZm10PWVjb2ZmIGVtPWxuZXdzIDs7Ci0gICAgICBtaXBzLSotcmlzY29zKikgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotc3lzdiopICAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotZWxmKiB8IG1pcHMtKi1ydGVtcyogfCBtaXBzLSotbGludXgtZ251KiB8IG1pcHMtKi1nbnUqIHwgbWlwcy0qLW9wZW5ic2QqKQotCQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi12eHdvcmtzKikgICAgICBmbXQ9ZWxmCi0JCQkgICAgQUNfREVGSU5FKE1JUFNfU1RBQlNfRUxGLCAxLAotCQkJCVtVc2UgRUxGIHN0YWJzIGZvciBNSVBTLCBub3QgRUNPRkYgc3RhYnNdKQotCQkJICAgIDs7Ci0gICAgICBtbjEwMjAwLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG1uMTAzMDAtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgcGoqKQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIHBwYy0qLXBlIHwgcHBjLSotY3lnd2luKiB8IHBwYy0qLXdpbm50KikKLQkJICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIHBwYy0qLWFpeCopICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgcHBjLSotYmVvcyopICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBwcGMtKi0qYnNkKiB8IHBwYy0qLWVsZiogfCBwcGMtKi1lYWJpKiB8IHBwYy0qLXN5c3Y0KikKLQkJCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBwcGMtKi1saW51eC1nbnUqKQkgICAgZm10PWVsZgotCQkJICAgIGNhc2UgIiRlbmRpYW4iIGluCi0JCQkgICAgYmlnKSAgOzsKLQkJCSAgICAqKSAgICBBQ19NU0dfRVJST1IoR05VL0xpbnV4IG11c3QgYmUgY29uZmlndXJlZCBiaWcgZW5kaWFuKSA7OwotCQkJICAgIGVzYWMKLQkJCSAgICA7OwotICAgICAgcHBjLSotc29sYXJpcyopCSAgICBmbXQ9ZWxmCi0JCQkgICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQ7IHRoZW4KLQkJCQlBQ19ERUZJTkUoVEFSR0VUX1NPTEFSSVNfQ09NTUVOVCwgMSwKLQkJCQlbRGVmaW5lIGlmIGRlZmF1bHQgdGFyZ2V0IGlzIFBvd2VyUEMgU29sYXJpcy5dKQotCQkJICAgIGZpCi0JCQkgICAgaWYgdGVzdCB4JHtlbmRpYW59ID0geGJpZzsgdGhlbgotCQkJCUFDX01TR19FUlJPUihTb2xhcmlzIG11c3QgYmUgY29uZmlndXJlZCBsaXR0bGUgZW5kaWFuKQotCQkJICAgIGZpCi0JCQkgICAgOzsKLSAgICAgIHBwYy0qLXJ0ZW1zKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIHBwYy0qLW1hY29zKiB8IHBwYy0qLW1wdyopCi0JCQkgICAgZm10PWNvZmYgZW09bWFjb3MgOzsKLSAgICAgIHBwYy0qLW5ldHdhcmUqKSAgICAgICBmbXQ9ZWxmIGVtPXBwY253IDs7Ci0gICAgICBwcGMtKi12eHdvcmtzKikgICAgICAgZm10PWVsZiA7OwotCi0gICAgICBzaC0qLWVsZiopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBzaC0qLWNvZmYqKSAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHNoLSotcnRlbXNlbGYqKSAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBzaC0qLXJ0ZW1zKikJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIG5zMzJrLXBjNTMyLW1hY2gqIHwgbnMzMmstcGM1MzItdXgqKSAgICBmbXQ9YW91dCBlbT1wYzUzMm1hY2ggOzsKLSAgICAgIG5zMzJrLXBjNTMyLW5ldGJzZCogfCBuczMyay1wYzUzMi1saXRlcyopICBmbXQ9YW91dCBlbT1uYnNkNTMyIDs7Ci0gICAgICBuczMyay1wYzUzMi1vcGVuYnNkKikgZm10PWFvdXQgZW09bmJzZDUzMiA7OwotCi0gICAgICBzcGFyYy0qLXJ0ZW1zKikgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIHNwYXJjLSotc3Vub3M0KikgICAgICBmbXQ9YW91dCBlbT1zdW4zIDs7Ci0gICAgICBzcGFyYy0qLWFvdXQgfCBzcGFyYyotKi12eHdvcmtzKikKLQkJCSAgICBmbXQ9YW91dCBlbT1zcGFyY2FvdXQgOzsKLSAgICAgIHNwYXJjLSotY29mZikgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgc3BhcmMtKi1saW51eCphb3V0KikgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBzcGFyYy0qLWxpbnV4LWdudSopICAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgc3BhcmMtKi1seW54b3MqKSAgICAgIGZtdD1jb2ZmIGVtPWx5bnggOzsKLSAgICAgIHNwYXJjLWZ1aml0c3Utbm9uZSkgICBmbXQ9YW91dCA7OwotICAgICAgc3BhcmMtKi1lbGYgfCBzcGFyYy0qLXN5c3Y0KiB8IHNwYXJjLSotc29sYXJpcyopCi0JCQkgICAgZm10PWVsZiA7OwotICAgICAgc3BhcmMtKi1uZXRic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgOzsKLSAgICAgIHNwYXJjLSotb3BlbmJzZCopICAgICBmbXQ9YW91dCBlbT1uYnNkIDs7Ci0KLSAgICAgIHN0cm9uZ2FybS0qLWNvZmYpICAgICBmbXQ9Y29mZiA7OwotICAgICAgc3Ryb25nYXJtLSotZWxmKSAgICAgIGZtdD1lbGYgOzsKLQotICAgICAgdGljMzAtKi0qYW91dCopCSAgICBmbXQ9YW91dCBiZmRfZ2FzPXllcyA7OwotICAgICAgdGljMzAtKi0qY29mZiopICAgICAgIGZtdD1jb2ZmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB0aWM4MC0qLSopCSAgICBmbXQ9Y29mZiA7OwotCi0gICAgICB2ODUwLSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB2ODUwZS0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB2ODUwZWEtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICB2YXgtKi1ic2QqIHwgdmF4LSotdWx0cml4KikKLQkJCSAgICBmbXQ9YW91dCA7OwotICAgICAgdmF4LSotdm1zKSAgICAgICAgICAgIGZtdD12bXMgOzsKLQotCi0gICAgICB6OGstKi1jb2ZmIHwgejhrLSotc2ltKQotCQkJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIHc2NS0qLSopICAgICAgICAgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICAqLSotYW91dCB8ICotKi1zY291dCkKLQkJCSAgICBmbXQ9YW91dCA7OwotICAgICAgKi0qLW5pbmR5KikKLQkJCSAgICBmbXQ9Ym91dCA7OwotICAgICAgKi0qLWJzZCopCi0JCQkgICAgZm10PWFvdXQgZW09c3VuMyA7OwotICAgICAgKi0qLWdlbmVyaWMpICAgICAgICAgIGZtdD1nZW5lcmljIDs7Ci0gICAgICAqLSoteHJheSB8ICotKi1obXMpICAgZm10PWNvZmYgOzsKLSAgICAgICotKi1zaW0pICAgICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgKi0qLWVsZiB8ICotKi1zeXN2NCogfCAqLSotc29sYXJpcyopCi0JCQkgICAgQUNfTVNHX1dBUk4oR0FTIHN1cHBvcnQgZm9yICR7Z2VuZXJpY190YXJnZXR9IGlzIGluY29tcGxldGUuKQotCQkJICAgIGZtdD1lbGYgZGV2PXllcyA7OwotICAgICAgKi0qLXZ4d29ya3MpICAgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICAqLSotbmV0d2FyZSkgICAgICAgICAgZm10PWVsZiA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0IDsgdGhlbgotICAgICAgZW5kaWFuX2RlZj0KLSAgICAgIGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhiaWc7IHRoZW4KLQllbmRpYW5fZGVmPTEKLSAgICAgIGVsaWYgdGVzdCB4JHtlbmRpYW59ID0geGxpdHRsZTsgdGhlbgotCWVuZGlhbl9kZWY9MAotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgeCR7ZW5kaWFuX2RlZn0gIT0geDsgdGhlbgotCUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVRfQllURVNfQklHX0VORElBTiwgJGVuZGlhbl9kZWYsCi0JCQkgICBbRGVmaW5lIGFzIDEgaWYgYmlnIGVuZGlhbi5dKQotICAgICAgZmkKLSAgICBmaQotCi0gICAgY2FzZSAke2NwdV90eXBlfS0ke2ZtdH0gaW4KLSAgICAgIGFscGhhKi0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgYXJtLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgIyBub3QgeWV0Ci0gICAgIyBpMzg2LWFvdXQpCWJmZF9nYXM9cHJlZmVycmVkIDs7Ci0gICAgICBtaXBzLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBuczMyay0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgcHBjLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBzcGFyYy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgc3Ryb25nYXJtLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqLWVsZikJYmZkX2dhcz15ZXMgOzsKLSAgICAgICotZWNvZmYpCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqLXNvbSkJYmZkX2dhcz15ZXMgOzsKLSAgICAjZW5hYmxlIGJmZCBmb3IgY29mZiB0byBhbGxvdyB0ZXN0aW5nIGlmIGEgYmZkIHRhcmdldCBpcyB0aGUgcHJpbWFyeSB0YXJnZXQsCi0gICAgI2J1dCBub3QgZm9yIGNvZmYgYXMgdGhlIHByaW1hcnkgdGFyZ2V0Ci0gICAgICBpMzg2LWNvZmYpCWlmIHRlc3QgeCR7cHJpbWFyeV9iZmRfZ2FzfSA9IHh5ZXM7IHRoZW4gYmZkX2dhcz15ZXM7IGZpIDs7Ci0gICAgICAqKQkJOzsKLSAgICBlc2FjCi0KLSMgT3RoZXIgcmFuZG9tIHN0dWZmLgotCi0gICAgIyBEbyB3ZSBuZWVkIHRoZSBvcGNvZGVzIGxpYnJhcnk/Ci0gICAgY2FzZSAke2NwdV90eXBlfSBpbgotICAgICAgdmF4IHwgaTM4NiB8IHRpYzMwKQotCTs7Ci0KLSAgICAgICopCi0JbmVlZF9vcGNvZGVzPXllcwotCi0JY2FzZSAiJHtlbmFibGVfc2hhcmVkfSIgaW4KLQl5ZXMpIHNoYXJlZF9vcGNvZGVzPXRydWUgOzsKLQkqb3Bjb2RlcyopIHNoYXJlZF9vcGNvZGVzPXRydWUgOzsKLQkqKSBzaGFyZWRfb3Bjb2Rlcz1mYWxzZSA7OwotCWVzYWMKLQlpZiB0ZXN0ICIke3NoYXJlZF9vcGNvZGVzfSIgPSAidHJ1ZSI7IHRoZW4KLQkgICMgQSBzaGFyZWQgbGlib3Bjb2RlcyBtdXN0IGJlIGxpbmtlZCBhZ2FpbnN0IGxpYmJmZC4KLQkgIG5lZWRfYmZkPXllcwotCWZpCi0JOzsKLSAgICBlc2FjCi0KLSAgICAjIEFueSBvdGhlciBzcGVjaWFsIG9iamVjdCBmaWxlcyBuZWVkZWQgPwotICAgIGNhc2UgJHtjcHVfdHlwZX0gaW4KLSAgICAgIGZyMzAgfCBtMzJyKQotCXVzaW5nX2NnZW49eWVzCi0JOzsKLQotICAgICAgbTY4aykKLQljYXNlICR7ZXh0cmFfb2JqZWN0c30gaW4KLQkqbTY4ay1wYXJzZS5vKikgOzsKLQkqKSBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBtNjhrLXBhcnNlLm8iIDs7Ci0JZXNhYwotCTs7Ci0KLSAgICAgIG1pcHMpCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1wYXJzZS5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1wYXJzZS5vIgotCWZpCi0KLQllY2hvICR7ZXh0cmFfb2JqZWN0c30gfCBncmVwIC1zICJpdGJsLWxleC5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1sZXgubyIKLQlmaQotCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1vcHMubyIgCi0JaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KLQkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0Ymwtb3BzLm8iCi0JZmkKLQk7OwotCi0gICAgICBzcGFyYykKLQlpZiB0ZXN0ICR0aGlzX3RhcmdldCA9ICR0YXJnZXQgOyB0aGVuCi0JICBBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9BUkNILCAiJHthcmNofSIsIFtEZWZhdWx0IGFyY2hpdGVjdHVyZS5dKQotCWZpCi0JOzsKLSAgICAgICopCi0JOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgotCWNhc2UgIngke2V4dHJhX29iamVjdHN9IiBpbgotCSpjZ2VuLm8qKSA7OwotCSopIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGNnZW4ubyIgOzsKLQllc2FjCi0gICAgZmkKLQotIyBTZWUgaWYgd2UgcmVhbGx5IGNhbiBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbiB3aXRoIHRoZSBlbXVsYXRpb24gY29kZS4KLQotICAgIGlmIHRlc3QgJHRoaXNfdGFyZ2V0ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIHByaW1hcnlfYmZkX2dhcz0kYmZkX2dhcwotICAgICAgb2JqX2Zvcm1hdD0kZm10Ci0gICAgICB0ZV9maWxlPSRlbQotCi0gICAgICBpZiB0ZXN0ICRiZmRfZ2FzID0gbm8gOyB0aGVuCi0JIyBDYW4ndCBzdXBwb3J0IG90aGVyIGNvbmZpZ3VyYXRpb25zIHRoaXMgd2F5LgotCWJyZWFrCi0gICAgICBmaQotICAgIGVsaWYgdGVzdCAkYmZkX2dhcyA9IG5vIDsgdGhlbgotICAgICAgIyBDYW4ndCBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICAgIGJyZWFrCi0gICAgZmkKLQotIyBGcm9tIHRhcmdldCBuYW1lIGFuZCBmb3JtYXQsIHByb2R1Y2UgYSBsaXN0IG9mIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi0gICAgY2FzZSAke2dlbmVyaWNfdGFyZ2V0fS0ke2ZtdH0gaW4KLSAgICAgIG1pcHMtKi1pcml4NSotKikJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIG1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0gICAgICBtaXBzLSotbGludXgtZ251Ki0qKSBjYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYgbWlwc2JlY29mZiBtaXBzbGVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlbGYgbWlwc2JlbGYgbWlwc2VsZiBtaXBzbGVjb2ZmIG1pcHNiZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJZXNhYyA7OwotICAgICAgbWlwcy0qLWxuZXdzKi1lY29mZikgOzsKLSAgICAgIG1pcHMtKi0qLWVjb2ZmKQljYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQkqKQllbXVsYXRpb249Im1pcHNsZWNvZmYgbWlwc2JlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgICBtaXBzLSotKi1lbGYpCWNhc2UgIiRlbmRpYW4iIGluCi0JCQliaWcpCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlbGYgbWlwc2JlbGYgbWlwc2VsZiIgOzsKLQkJCWVzYWMgOzsKLSAgICAgIGkzODYtKi1lbGYpCWVtdWxhdGlvbj0iaTM4NmVsZiIgOzsKLSAgICAgIGkzODYtKi1jb2ZmKQllbXVsYXRpb249ImkzODZjb2ZmIiA7OwotICAgICAgIyBVbmNvbW1lbnRpbmcgdGhlIG5leHQgbGluZSB3aWxsIHR1cm4gb24gc3VwcG9ydCBmb3IgaTM4NiBDT0ZGCi0gICAgICAjIGluIGFueSBpMzg2IEVMRiBjb25maWd1cmF0aW9uLgotICAgICAgIyBpMzg2LSotKi1lbGYpCWVtdWxhdGlvbj0iaTM4NmVsZiBpMzg2Y29mZiIgOzsKLSAgICBlc2FjCi0KLSAgICBlbXVsYXRpb25zPSIkZW11bGF0aW9ucyAkZW11bGF0aW9uIgotCi1kb25lCi0KLSMgQXNzaWduIGZsb2F0aW5nIHBvaW50IHR5cGUuICBNb3N0IHByb2Nlc3NvcnMgd2l0aCBGUCBzdXBwb3J0Ci0jIElFRUUgRlAuICBPbiB0aG9zZSB0aGF0IGRvbid0IHN1cHBvcnQgRlAgYXQgYWxsLCB1c3VhbGx5IElFRUUKLSMgaXMgZW11bGF0ZWQuCi1jYXNlICR7dGFyZ2V0X2NwdX0gaW4KLSAgdmF4IHwgdGFob2UgKQlhdG9mPSR7dGFyZ2V0X2NwdX0gOzsKLSAgKikJCWF0b2Y9aWVlZSA7OwotZXNhYwotCi1jYXNlICIke29ial9mb3JtYXR9IiBpbgotICAiIikgQUNfTVNHX0VSUk9SKEdBUyBkb2VzIG5vdCBrbm93IHdoYXQgZm9ybWF0IHRvIHVzZSBmb3IgdGFyZ2V0ICR7dGFyZ2V0fSkgOzsKLWVzYWMKLQotIyBVbmZvcnR1bmF0ZWx5IHRoZSBjcHUgaW4gY3B1LW9wYy5oIGZpbGUgaXNuJ3QgYWx3YXlzICQoVEFSR0VUX0NQVSkuCi1jZ2VuX2NwdV9wcmVmaXg9IiIKLWlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0gIGNhc2UgJHt0YXJnZXRfY3B1fSBpbgotICAgICopIGNnZW5fY3B1X3ByZWZpeD0ke3RhcmdldF9jcHV9IDs7Ci0gIGVzYWMKLSAgQUNfU1VCU1QoY2dlbl9jcHVfcHJlZml4KQotICBBQ19ERUZJTkUoVVNJTkdfQ0dFTiwgMSwgW1VzaW5nIGNnZW4gY29kZT9dKQotZmkKLQotZG5sCi1kbmwgTWFrZSBzdXJlIHRoZSBkZXNpcmVkIHN1cHBvcnQgZmlsZXMgZXhpc3QuCi1kbmwKLQotaWYgdGVzdCAhIC1yICR7c3JjZGlyfS9jb25maWcvdGMtJHt0YXJnZXRfY3B1X3R5cGV9LmM7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKEdBUyBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCBDUFUgJHt0YXJnZXRfY3B1X3R5cGV9KQotZmkKLQotaWYgdGVzdCAhIC1yICR7c3JjZGlyfS9jb25maWcvb2JqLSR7b2JqX2Zvcm1hdH0uYzsgdGhlbgotICBBQ19NU0dfRVJST1IoR0FTIGRvZXMgbm90IGhhdmUgc3VwcG9ydCBmb3Igb2JqZWN0IGZpbGUgZm9ybWF0ICR7b2JqX2Zvcm1hdH0pCi1maQotCi1jYXNlICR7dXNlcl9iZmRfZ2FzfS0ke3ByaW1hcnlfYmZkX2dhc30gaW4KLSAgeWVzLXllcyB8IG5vLW5vKQotICAgICMgV2UgZGlkbid0IG92ZXJyaWRlIHVzZXIncyBjaG9pY2UuCi0gICAgOzsKLSAgbm8teWVzKQotICAgIEFDX01TR19XQVJOKFVzZSBvZiBCRkQgaXMgcmVxdWlyZWQgZm9yICR7dGFyZ2V0fTsgb3ZlcnJpZGluZyBjb25maWcgb3B0aW9ucy4pCi0gICAgOzsKLSAgbm8tcHJlZmVycmVkKQotICAgIHByaW1hcnlfYmZkX2dhcz1ubwotICAgIDs7Ci0gICotcHJlZmVycmVkKQotICAgIHByaW1hcnlfYmZkX2dhcz15ZXMKLSAgICA7OwotICB5ZXMtKikKLSAgICBwcmltYXJ5X2JmZF9nYXM9eWVzCi0gICAgOzsKLSAgLSopCi0gICAgIyBVc2VyIHNwZWNpZmllZCBub3RoaW5nLgotICAgIDs7Ci1lc2FjCi0KLSMgU29tZSBDT0ZGIGNvbmZpZ3VyYXRpb25zIHdhbnQgdGhlc2UgcmFuZG9tIG90aGVyIGZsYWdzIHNldC4KLWNhc2UgJHtvYmpfZm9ybWF0fSBpbgotICBjb2ZmKQotICAgIGNhc2UgJHt0YXJnZXRfY3B1X3R5cGV9IGluCi0gICAgICBpMzg2KSBBQ19ERUZJTkUoSTM4NkNPRkYsIDEsIFtVc2luZyBpMzg2IENPRkY/XSkgOzsKLSAgICAgIG02OGspIEFDX0RFRklORShNNjhLQ09GRiwgMSwgW1VzaW5nIG02OGsgQ09GRj9dKSA7OwotICAgICAgbTg4aykgQUNfREVGSU5FKE04OEtDT0ZGLCAxLCBbVXNpbmcgbTg4ayBDT0ZGP10pIDs7Ci0gICAgZXNhYwotICAgIDs7Ci1lc2FjCi0KLSMgR2V0dGluZyB0aGlzIGRvbmUgcmlnaHQgaXMgZ29pbmcgdG8gYmUgYSBiaXRjaC4gIEVhY2ggY29uZmlndXJhdGlvbiBzcGVjaWZpZWQKLSMgd2l0aCAtLWVuYWJsZS10YXJnZXRzPS4uLiBzaG91bGQgYmUgY2hlY2tlZCBmb3IgZW52aXJvbm1lbnQsIGZvcm1hdCwgY3B1LCBhbmQKLSMgYmZkX2dhcyBzZXR0aW5nLgotIwotIyBGb3IgZWFjaCBjb25maWd1cmF0aW9uLCB0aGUgbmVjZXNzYXJ5IG9iamVjdCBmaWxlIHN1cHBvcnQgY29kZSBtdXN0IGJlIGxpbmtlZAotIyBpbi4gIFRoaXMgbWlnaHQgYmUgb25seSBvbmUsIGl0IG1pZ2h0IGJlIHVwIHRvIGZvdXIuICBUaGUgbmVjZXNzYXJ5IGVtdWxhdGlvbgotIyBjb2RlIG5lZWRzIHRvIGJlIHByb3ZpZGVkLCB0b28uCi0jCi0jIEFuZCB0aGVuIHRoZXJlJ3MgIi0tZW5hYmxlLXRhcmdldHM9YWxsIi4uLi4KLSMKLSMgRm9yIG5vdywganVzdCBhbHdheXMgZG8gaXQgZm9yIE1JUFMgRUxGIG9yIEVDT0ZGIGNvbmZpZ3VyYXRpb25zLiAgU2lnaC4KLQotZm9ybWF0cz0iJHtvYmpfZm9ybWF0fSIKLWVtZmlsZXM9IiIKLUVNVUxBVElPTlM9IiIKLUdBU19VTklRKGVtdWxhdGlvbnMpCi1mb3IgZW0gaW4gLiAkZW11bGF0aW9ucyA7IGRvCi0gIGNhc2UgJGVtIGluCi0gICAgLikJY29udGludWUgOzsKLSAgICBtaXBzYmVsZiB8IG1pcHNsZWxmKQotCWZtdD1lbGYgICBmaWxlPW1pcHNlbGYgOzsKLSAgICBtaXBzYmVjb2ZmIHwgbWlwc2xlY29mZikKLQlmbXQ9ZWNvZmYgZmlsZT1taXBzZWNvZmYgOzsKLSAgICBpMzg2Y29mZikKLQlmbXQ9Y29mZiAgZmlsZT1pMzg2Y29mZiA7OwotICAgIGkzODZlbGYpCi0JZm10PWVsZiAgIGZpbGU9aTM4NmVsZiA7OwotICBlc2FjCi0gIGZvcm1hdHM9IiRmb3JtYXRzICRmbXQiCi0gIGVtZmlsZXM9IiRlbWZpbGVzIGUtJGZpbGUubyIKLSAgRU1VTEFUSU9OUz0iJEVNVUxBVElPTlMgJiRlbSwiCi1kb25lCi1HQVNfVU5JUShmb3JtYXRzKQotR0FTX1VOSVEoZW1maWxlcykKLWlmIHRlc3QgYHNldCAuICRmb3JtYXRzIDsgc2hpZnQgOyBlY2hvICQjYCAtZ3QgMSA7IHRoZW4KLSAgZm9yIGZtdCBpbiAkZm9ybWF0cyA7IGRvCi0gICAgY2FzZSAkZm10IGluCi0gICAgICBhb3V0KQlBQ19ERUZJTkUoT0JKX01BWUJFX0FPVVQsIDEsICAgIFthLm91dCBzdXBwb3J0P10pICAgOzsKLSAgICAgIGJvdXQpCUFDX0RFRklORShPQkpfTUFZQkVfQk9VVCwgMSwgICAgW2Iub3V0IHN1cHBvcnQ/XSkgICA7OwotICAgICAgY29mZikJQUNfREVGSU5FKE9CSl9NQVlCRV9DT0ZGLCAxLCAgICBbQ09GRiBzdXBwb3J0P10pICAgIDs7Ci0gICAgICBlY29mZikJQUNfREVGSU5FKE9CSl9NQVlCRV9FQ09GRiwgMSwgICBbRUNPRkYgc3VwcG9ydD9dKSAgIDs7Ci0gICAgICBlbGYpCUFDX0RFRklORShPQkpfTUFZQkVfRUxGLCAxLCAgICAgW0VMRiBzdXBwb3J0P10pICAgICA7OwotICAgICAgZ2VuZXJpYykJQUNfREVGSU5FKE9CSl9NQVlCRV9HRU5FUklDLCAxLCBbZ2VuZXJpYyBzdXBwb3J0P10pIDs7Ci0gICAgICBocDMwMCkJQUNfREVGSU5FKE9CSl9NQVlCRV9IUDMwMCwgMSwgICBbSFAzMDAgc3VwcG9ydD9dKSAgIDs7Ci0gICAgICBpZWVlKQlBQ19ERUZJTkUoT0JKX01BWUJFX0lFRUUsIDEsICAgIFtJRUVFIHN1cHBvcnQ/XSkgICAgOzsKLSAgICAgIHNvbSkJQUNfREVGSU5FKE9CSl9NQVlCRV9TT00sIDEsICAgICBbU09NIHN1cHBvcnQ/XSkgICAgIDs7Ci0gICAgICB2bXMpCUFDX0RFRklORShPQkpfTUFZQkVfVk1TLCAxLCAgICAgW1ZNUyBzdXBwb3J0P10pICAgICA7OwotICAgIGVzYWMKLSAgICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBvYmotJGZtdC5vIgotICBkb25lCi0gIG9ial9mb3JtYXQ9bXVsdGkKLWZpCi1pZiB0ZXN0IGBzZXQgLiAkZW1maWxlcyA7IHNoaWZ0IDsgZWNobyAkI2AgLWd0IDAgOyB0aGVuCi0gIERFRkFVTFRfRU1VTEFUSU9OPWBzZXQgLiAkZW11bGF0aW9ucyA7IGVjaG8gJDJgCi0gICMgZS1taXBzKiBoYXMgbW9yZSB0aGFuIG9uZSBlbXVsYXRpb24gcGVyIGZpbGUsIGUtaTM4NiogaGFzIGp1c3Qgb25lIGF0IHRoZQotICAjIG1vbWVudC4gIElmIG9ubHkgb25lIGVtdWxhdGlvbiBpcyBzcGVjaWZpZWQsIHRoZW4gZG9uJ3QgZGVmaW5lCi0gICMgVVNFX0VNVUxBVElPTlMgb3IgaW5jbHVkZSBhbnkgb2YgdGhlIGUtZmlsZXMgYXMgdGhleSB3aWxsIG9ubHkgYmUgYmxvYXQuCi0gIGNhc2UgIiR7b2JqX2Zvcm1hdH0ke2VtZmlsZXN9IiBpbgotICAgIG11bHRpKiB8ICptaXBzKikKLSAgICAgIHRlX2ZpbGU9bXVsdGkKLSAgICAgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzICRlbWZpbGVzIgotICAgICAgQUNfREVGSU5FKFVTRV9FTVVMQVRJT05TLCAxLCBbVXNlIGVtdWxhdGlvbiBzdXBwb3J0P10pIDs7Ci0gIGVzYWMKLWZpCi1BQ19TVUJTVChleHRyYV9vYmplY3RzKQotQUNfREVGSU5FX1VOUVVPVEVEKEVNVUxBVElPTlMsICRFTVVMQVRJT05TLCBbU3VwcG9ydGVkIGVtdWxhdGlvbnMuXSkKLUFDX0RFRklORV9VTlFVT1RFRChERUZBVUxUX0VNVUxBVElPTiwgIiRERUZBVUxUX0VNVUxBVElPTiIsCi0JCSAgIFtEZWZhdWx0IGVtdWxhdGlvbi5dKQotCi1jYXNlICR7cHJpbWFyeV9iZmRfZ2FzfS0ke3RhcmdldF9jcHVfdHlwZX0tJHtvYmpfZm9ybWF0fSBpbgotICB5ZXMtKi1jb2ZmKQluZWVkX2JmZD15ZXMgOzsKLSAgbm8tKi1jb2ZmKQluZWVkX2JmZD15ZXMKLQkJQUNfREVGSU5FKE1BTllfU0VHTUVOVFMsIDEsIFtvbGQgQ09GRiBzdXBwb3J0P10pIDs7Ci1lc2FjCi0KLXJlamVjdF9kZXZfY29uZmlncz15ZXMKLQotY2FzZSAke3JlamVjdF9kZXZfY29uZmlnc30tJHtkZXZ9IGluCi0gIHllcy15ZXMpICMgT29wcy4KLSAgICBBQ19NU0dfRVJST1IoR0FTIGRvZXMgbm90IHN1cHBvcnQgdGhlICR7Z2VuZXJpY190YXJnZXR9IGNvbmZpZ3VyYXRpb24uKQotICAgIDs7Ci1lc2FjCi0KLUFDX1NVQlNUKHRhcmdldF9jcHVfdHlwZSkKLUFDX1NVQlNUKG9ial9mb3JtYXQpCi1BQ19TVUJTVCh0ZV9maWxlKQotQUNfU1VCU1QoaW5zdGFsbF90b29sZGlyKQotQUNfU1VCU1QoYXRvZikKLWRubCBBQ19TVUJTVChlbXVsYXRpb24pCi0KLWNhc2UgIiR7cHJpbWFyeV9iZmRfZ2FzfSIgaW4KLSAgeWVzKQlBQ19ERUZJTkUoQkZEX0FTU0VNQkxFUiwgMSwgW1VzZSBCRkQgaW50ZXJmYWNlP10pCi0JbmVlZF9iZmQ9eWVzIDs7Ci1lc2FjCi0KLSMgZG8gd2UgbmVlZCB0aGUgb3Bjb2RlcyBsaWJyYXJ5PwotY2FzZSAiJHtuZWVkX29wY29kZXN9IiBpbgoteWVzKQotICBPUENPREVTX0xJQj0uLi9vcGNvZGVzL2xpYm9wY29kZXMubGEKLSAgOzsKLWVzYWMKLQotY2FzZSAiJHtuZWVkX2JmZH0iIGluCi15ZXMpCi0gIEJGRExJQj0uLi9iZmQvbGliYmZkLmxhCi0gIEFMTF9PQkpfREVQUz0iJEFMTF9PQkpfREVQUyAuLi9iZmQvYmZkLmgiCi0gIDs7Ci1lc2FjCi0KLUFDX1NVQlNUKEJGRExJQikKLUFDX1NVQlNUKE9QQ09ERVNfTElCKQotCi1BQ19TVUJTVChBTExfT0JKX0RFUFMpCi0KLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVRfQUxJQVMsCSIke3RhcmdldF9hbGlhc30iLCBbVGFyZ2V0IGFsaWFzLl0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX0NBTk9OSUNBTCwJIiR7dGFyZ2V0fSIsICAgICAgIFtDYW5vbmljYWwgdGFyZ2V0Ll0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX0NQVSwJCSIke3RhcmdldF9jcHV9IiwgICBbVGFyZ2V0IENQVS5dKQotQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9WRU5ET1IsCSIke3RhcmdldF92ZW5kb3J9IiwgW1RhcmdldCB2ZW5kb3IuXSkKLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVRfT1MsCQkiJHt0YXJnZXRfb3N9IiwgICAgW1RhcmdldCBPUy5dKQotCi1BQ19QUk9HX0NDCi0KLUFDX1BST0dfWUFDQwotQU1fUFJPR19MRVgKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi1BTV9NQUlOVEFJTkVSX01PREUKLUFDX0VYRUVYVAotCi1BQ19DSEVDS19IRUFERVJTKHN0cmluZy5oIHN0ZGxpYi5oIG1lbW9yeS5oIHN0cmluZ3MuaCB1bmlzdGQuaCBzdGRhcmcuaCB2YXJhcmdzLmggZXJybm8uaCBzeXMvdHlwZXMuaCkKLQotIyBQdXQgdGhpcyBoZXJlIHNvIHRoYXQgYXV0b2NvbmYncyAiY3Jvc3MtY29tcGlsaW5nIiBtZXNzYWdlIGRvZXNuJ3QgY29uZnVzZQotIyBwZW9wbGUgd2hvIGFyZSBub3QgY3Jvc3MtY29tcGlsaW5nIGJ1dCBhcmUgY29tcGlsaW5nIGNyb3NzLWFzc2VtYmxlcnMuCi1BQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBjb21waWxpbmcgYSBjcm9zcy1hc3NlbWJsZXIpCi1pZiB0ZXN0ICIke2hvc3R9IiA9ICIke3RhcmdldH0iOyB0aGVuCi0gIGNyb3NzX2dhcz1ubwotZWxzZQotICBjcm9zc19nYXM9eWVzCi0gIEFDX0RFRklORShDUk9TU19DT01QSUxFLCAxLCBbQ29tcGlsaW5nIGNyb3NzLWFzc2VtYmxlcj9dKQotZmkKLUFDX01TR19SRVNVTFQoJGNyb3NzX2dhcykKLQotZG5sIGFuc2lkZWNsLmggd2lsbCBkZWFsIHdpdGggY29uc3QKLWRubCBBQ19DT05TVAotQUNfRlVOQ19BTExPQ0EKLUFDX0NfSU5MSU5FCi0KLSMgVk1TIGRvZXNuJ3QgaGF2ZSB1bmxpbmsuCi1BQ19DSEVDS19GVU5DUyh1bmxpbmsgcmVtb3ZlLCBicmVhaykKLQotIyBTb21lIHN5c3RlbXMgZG9uJ3QgaGF2ZSBzYnJrKCkuCi1BQ19DSEVDS19GVU5DUyhzYnJrKQotCi0jIFNvbWUgbm9uLUFOU0kgcHJlcHJvY2Vzc29ycyBib3RjaCByZXF1b3RpbmcgaW5zaWRlIHN0cmluZ3MuICBUaGF0J3MgYmFkCi0jIGVub3VnaCwgYnV0IG9uIHNvbWUgb2YgdGhvc2Ugc3lzdGVtcywgdGhlIGFzc2VydCBtYWNybyByZWxpZXMgb24gcmVxdW90aW5nCi0jIHdvcmtpbmcgcHJvcGVybHkhCi1HQVNfV09SS0lOR19BU1NFUlQKLQotIyBPbiBzb21lIHN5c3RlbXMsIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIG1heSBub3QgZGVjbGFyZSBtYWxsb2MsIHJlYWxsb2MsCi0jIGFuZCBmcmVlLiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSBnYXMgbmVlZHMgdGhlc2UgZnVuY3Rpb25zIHRvIGhhdmUgYmVlbgotIyBkZWNsYXJlZCAtLSBzdWNoIGFzIHdoZW4gdGFraW5nIHRoZWlyIGFkZHJlc3Nlcy4KLWdhc190ZXN0X2hlYWRlcnM9IgotI2lmZGVmIEhBVkVfTUVNT1JZX0gKLSNpbmNsdWRlIDxtZW1vcnkuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotIgotR0FTX0NIRUNLX0RFQ0xfTkVFREVEKHN0cnN0ciwgZiwgY2hhciAqKCpmKSgpLCAkZ2FzX3Rlc3RfaGVhZGVycykKLUdBU19DSEVDS19ERUNMX05FRURFRChtYWxsb2MsIGYsIGNoYXIgKigqZikoKSwgJGdhc190ZXN0X2hlYWRlcnMpCi1HQVNfQ0hFQ0tfREVDTF9ORUVERUQoZnJlZSwgZiwgdm9pZCAoKmYpKCksICRnYXNfdGVzdF9oZWFkZXJzKQotR0FTX0NIRUNLX0RFQ0xfTkVFREVEKHNicmssIGYsIGNoYXIgKigqZikoKSwgJGdhc190ZXN0X2hlYWRlcnMpCi1HQVNfQ0hFQ0tfREVDTF9ORUVERUQoZW52aXJvbiwgZiwgY2hhciAqKmYsICRnYXNfdGVzdF9oZWFkZXJzKQotCi0jIERvZXMgZXJybm8uaCBkZWNsYXJlIGVycm5vLCBvciBkbyB3ZSBoYXZlIHRvIGFkZCBhIHNlcGFyYXRlIGRlY2xhcmF0aW9uCi0jIGZvciBpdD8KLUdBU19DSEVDS19ERUNMX05FRURFRChlcnJubywgZiwgaW50IGYsIFsKLSNpZmRlZiBIQVZFX0VSUk5PX0gKLSNpbmNsdWRlIDxlcnJuby5oPgotI2VuZGlmCi1dKQotCi1kbmwgVGhpcyBtdXN0IGNvbWUgbGFzdC4KLQotZG5sIFdlIHVzZWQgdG8gbWFrZSBzeW1saW5rcyB0byBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSwgYnV0IG5vdwotZG5sIHdlIGp1c3QgdXNlIHRoZSByaWdodCBuYW1lIGZvciAuYyBmaWxlcywgYW5kIGNyZWF0ZSAuaCBmaWxlcyBpbgotZG5sIHRoZSBidWlsZCBkaXJlY3Rvcnkgd2hpY2ggaW5jbHVkZSB0aGUgcmlnaHQgLmggZmlsZS4gIE1ha2Ugc3VyZQotZG5sIHRoZSBvbGQgc3ltbGlua3MgZG9uJ3QgZXhpc3QsIHNvIHRoYXQgYSByZWNvbmZpZ3VyZSBpbiBhbiBleGlzdGluZwotZG5sIGRpcmVjdG9yeSBiZWhhdmVzIHJlYXNvbmFibHkuCi0KLUFDX09VVFBVVChNYWtlZmlsZSBkb2MvTWFrZWZpbGUgJHtHREJJTklUfTpnZGJpbml0LmluIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bcm0gLWYgdGFyZy1jcHUuYyB0YXJnLWNwdS5oIG9iai1mb3JtYXQuaCBvYmotZm9ybWF0LmMgdGFyZy1lbnYuaCBhdG9mLXRhcmcuYyBpdGJsLWNwdS5oCi0gZWNobyAnI2luY2x1ZGUgInRjLSciJHt0YXJnZXRfY3B1X3R5cGV9IicuaCInID4gdGFyZy1jcHUuaAotIGVjaG8gJyNpbmNsdWRlICJvYmotJyIke29ial9mb3JtYXR9IicuaCInID4gb2JqLWZvcm1hdC5oCi0gZWNobyAnI2luY2x1ZGUgInRlLSciJHt0ZV9maWxlfSInLmgiJyA+IHRhcmctZW52LmgKLSBlY2hvICcjaW5jbHVkZSAiaXRibC0nIiR7dGFyZ2V0X2NwdV90eXBlfSInLmgiJyA+IGl0YmwtY3B1LmgKLSBpZiB0ZXN0ICJ4JGNnZW5fY3B1X3ByZWZpeCIgIT0geCA7IHRoZW4KLSAgIGVjaG8gJyNpbmNsdWRlICJvcGNvZGVzLyciJHtjZ2VuX2NwdV9wcmVmaXh9IictZGVzYy5oIicgPiBjZ2VuLWRlc2MuaAotIGZpCi0KLSBzZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGVdLAotW3RhcmdldF9jcHVfdHlwZT0ke3RhcmdldF9jcHVfdHlwZX0KLSBjZ2VuX2NwdV9wcmVmaXg9JHtjZ2VuX2NwdV9wcmVmaXh9Ci0gb2JqX2Zvcm1hdD0ke29ial9mb3JtYXR9Ci0gdGVfZmlsZT0ke3RlX2ZpbGV9XSkKZGlmZiAtLWdpdCBhL2dhcy9kZWJ1Zy5jIGIvZ2FzL2RlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OWYyM2YuLjAwMDAwMDAKLS0tIGEvZ2FzL2RlYnVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGRlYnVnLmMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBSb3V0aW5lcyBmb3IgZGVidWcgdXNlIG9ubHkuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLWRtcF9mcmFncyAoKQotewotICBmcmNoYWluUyAqY2hwOwotICBjaGFyICpwOwotCi0gIGZvciAoY2hwID0gZnJjaGFpbl9yb290OyBjaHA7IGNocCA9IGNocC0+ZnJjaF9uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAoY2hwLT5mcmNoX3NlZykKLQl7Ci0JY2FzZSBTRUdfREFUQToKLQkgIHAgPSAiRGF0YSI7Ci0JICBicmVhazsKLQljYXNlIFNFR19URVhUOgotCSAgcCA9ICJUZXh0IjsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBwID0gIj8/PyI7Ci0JICBicmVhazsKLQl9Ci0gICAgICBwcmludGYgKCJcblNFR01FTlQgJXMgJWRcbiIsIHAsIGNocC0+ZnJjaF9zdWJzZWcpOwotICAgICAgZG1wX2ZyYWcgKGNocC0+ZnJjaF9yb290LCAiXHQiKTsKLSAgICB9Ci19Ci0KLWRtcF9mcmFnIChmcCwgaW5kZW50KQotICAgICBzdHJ1Y3QgZnJhZyAqZnA7Ci0gICAgIGNoYXIgKmluZGVudDsKLXsKLSAgZm9yICg7IGZwOyBmcCA9IGZwLT5mcl9uZXh0KQotICAgIHsKLSAgICAgIHByaW50ZiAoIiVzRlJBR01FTlQgQCAweCV4XG4iLCBpbmRlbnQsIGZwKTsKLSAgICAgIHN3aXRjaCAoZnAtPmZyX3R5cGUpCi0JewotCWNhc2UgcnNfYWxpZ246Ci0JICBwcmludGYgKCIlc3JzX2FsaWduKCVkKVxuIiwgaW5kZW50LCBmcC0+ZnJfb2Zmc2V0KTsKLQkgIGJyZWFrOwotCWNhc2UgcnNfZmlsbDoKLQkgIHByaW50ZiAoIiVzcnNfZmlsbCglZClcbiIsIGluZGVudCwgZnAtPmZyX29mZnNldCk7Ci0JICBwcmludGYgKCIlcyIsIGluZGVudCk7Ci0JICB2YXJfY2hhcnMgKGZwLCBmcC0+ZnJfdmFyICsgZnAtPmZyX2ZpeCk7Ci0JICBwcmludGYgKCIlc1x0IHJlcGVhdGVkICVkIHRpbWVzLCIsCi0JCSAgaW5kZW50LCBmcC0+ZnJfb2Zmc2V0KTsKLQkgIHByaW50ZiAoIiBmaXhlZCBsZW5ndGggaWYgIyBjaGFycyA9PSAwKVxuIik7Ci0JICBicmVhazsKLQljYXNlIHJzX29yZzoKLQkgIHByaW50ZiAoIiVzcnNfb3JnKCVkK3N5bSBAMHgleClcbiIsIGluZGVudCwKLQkJICBmcC0+ZnJfb2Zmc2V0LCBmcC0+ZnJfc3ltYm9sKTsKLQkgIHByaW50ZiAoIiVzZmlsbCB3aXRoICIsIGluZGVudCk7Ci0JICB2YXJfY2hhcnMgKGZwLCAxKTsKLQkgIHByaW50ZiAoIlxuIik7Ci0JICBicmVhazsKLQljYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotCSAgcHJpbnRmICgiJXNtYWNoaW5lX2RlcFxuIiwgaW5kZW50KTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBwcmludGYgKCIlc3Vua25vd24gdHlwZVxuIiwgaW5kZW50KTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHByaW50ZiAoIiVzYWRkcj0lZCgweCV4KVxuIiwgaW5kZW50LCBmcC0+ZnJfYWRkcmVzcywgZnAtPmZyX2FkZHJlc3MpOwotICAgICAgcHJpbnRmICgiJXNmcl9maXg9JWRcbiIsIGluZGVudCwgZnAtPmZyX2ZpeCk7Ci0gICAgICBwcmludGYgKCIlc2ZyX3Zhcj0lZFxuIiwgaW5kZW50LCBmcC0+ZnJfdmFyKTsKLSAgICAgIHByaW50ZiAoIiVzZnJfb2Zmc2V0PSVkXG4iLCBpbmRlbnQsIGZwLT5mcl9vZmZzZXQpOwotICAgICAgcHJpbnRmICgiJXNjaGFycyBAIDB4JXhcbiIsIGluZGVudCwgZnAtPmZyX2xpdGVyYWwpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci19Ci0KLXZhcl9jaGFycyAoZnAsIG4pCi0gICAgIHN0cnVjdCBmcmFnICpmcDsKLSAgICAgaW50IG47Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnA7Ci0KLSAgZm9yIChwID0gKHVuc2lnbmVkIGNoYXIgKikgZnAtPmZyX2xpdGVyYWw7IG47IG4tLSwgcCsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiUwMnggIiwgKnApOwotICAgIH0KLX0KLQotLyogZW5kIG9mIGRlYnVnLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9kZXAtaW4uc2VkIGIvZ2FzL2RlcC1pbi5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzFmMGYuLjAwMDAwMDAKLS0tIGEvZ2FzL2RlcC1pbi5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi06bG9vcAotL1xcJC9OCi0vXFwkL2IgbG9vcAotCi1zISAuLi9jb25maWcuaCEhZwotcyEgLi4vLi4vYmZkL2JmZC5oISFnCi1zISAuLi9pdGJsLXBhcnNlLmghIWcKLXMhQElOQ0RJUkAhJChJTkNESVIpIWcKLXMhQEJGRERJUkAhJChCRkRESVIpIWcKLXMhQFNSQ0RJUkAvY29uZmlnISQoc3JjZGlyKS9jb25maWchZwotcyFAU1JDRElSQC8uLi9vcGNvZGVzISQoc3JjZGlyKS8uLi9vcGNvZGVzIWcKLXMhQFNSQ0RJUkAvISFnCi1zISBjb25maWcuaCEhZwotcyEgYXMuaCEhZwotcyEgYXNpbnRsLmghIWcKLXMhIHRhcmctZW52LmghIWcKLXMhIG9iai1mb3JtYXQuaCEhZwotcyEgdGFyZy1jcHUuaCEhZwotcyEgZmxvbnVtLmghIWcKLXMhIGV4cHIuaCEhZwotcyEgd3JpdGUuaCEhZwotcyEgZnJhZ3MuaCEhZwotcyEgaGFzaC5oISFnCi1zISByZWFkLmghIWcKLXMhIHN5bWJvbHMuaCEhZwotcyEgdGMuaCEhZwotcyEgb2JqLmghIWcKLXMhIGxpc3RpbmcuaCEhZwotcyEgYmlnbnVtLmghIWcKLXMhIGJpdF9maXguaCEhZwotcyEgaXRibC1jcHUuaCEhZwotcyEgXCQoc3JjZGlyKS9jb25maWcvdGUtZ2VuZXJpYy5oISFnCi1zISBcJChJTkNESVIpL2xpYmliZXJ0eS5oISFnCi1zISBcJChJTkNESVIpL2Fuc2lkZWNsLmghIWcKLXMhIFwkKElOQ0RJUikvZm9wZW4tc2FtZS5oISFnCi0KLXMvXFxcbiAqLyAvZwotCi1zLyAqJC8vCi1zLyAgKi8gL2cKLS86JC9kCi0KLXMvXCguXHs1MFx9W14gXSpcKSAvXDEgXFxcCi0gIC9nCmRpZmYgLS1naXQgYS9nYXMvZGVwZW5kLmMgYi9nYXMvZGVwZW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxN2M3YzguLjAwMDAwMDAKLS0tIGEvZ2FzL2RlcGVuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qIGRlcGVuZC5jIC0gSGFuZGxlIGRlcGVuZGVuY3kgdHJhY2tpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi0vKiBUaGUgZmlsZSB0byB3cml0ZSB0bywgb3IgTlVMTCBpZiBubyBkZXBlbmRlbmNpZXMgYmVpbmcga2VwdC4gICovCi1zdGF0aWMgY2hhciAqZGVwX2ZpbGUgPSBOVUxMOwotCi1zdHJ1Y3QgZGVwZW5kZW5jeQotewotICBjaGFyICpmaWxlOwotICBzdHJ1Y3QgZGVwZW5kZW5jeSAqbmV4dDsKLX07Ci0KLS8qIEFsbCB0aGUgZmlsZXMgd2UgZGVwZW5kIG9uLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZGVwZW5kZW5jeSAqZGVwX2NoYWluID0gTlVMTDsKLQotLyogQ3VycmVudCBjb2x1bW4gaW4gb3V0cHV0IGZpbGUuICAqLwotc3RhdGljIGludCBjb2x1bW4gPSAwOwotCi1zdGF0aWMgaW50IHF1b3RlX3N0cmluZ19mb3JfbWFrZSBQQVJBTVMgKChGSUxFICosIGNoYXIgKikpOwotc3RhdGljIHZvaWQgd3JhcF9vdXRwdXQgUEFSQU1TICgoRklMRSAqLCBjaGFyICosIGludCkpOwotCi0vKiBOdW1iZXIgb2YgY29sdW1ucyBhbGxvd2FibGUuICAqLwotI2RlZmluZSBNQVhfQ09MVU1OUyA3MgotCi0MCi0KLS8qIFN0YXJ0IHNhdmluZyBkZXBlbmRlbmNpZXMsIHRvIGJlIHdyaXR0ZW4gdG8gRklMRU5BTUUuICBJZiB0aGlzIGlzCi0gICBuZXZlciBjYWxsZWQsIHRoZW4gZGVwZW5kZW5jeSB0cmFja2luZyBpcyBzaW1wbHkgc2tpcHBlZC4gICovCi0KLXZvaWQKLXN0YXJ0X2RlcGVuZGVuY2llcyAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBkZXBfZmlsZSA9IGZpbGVuYW1lOwotfQotCi0vKiBOb3RpY2VkIGEgbmV3IGZpbGVuYW1lLCBzbyB0cnkgdG8gcmVnaXN0ZXIgaXQuICAqLwotCi12b2lkCi1yZWdpc3Rlcl9kZXBlbmRlbmN5IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN0cnVjdCBkZXBlbmRlbmN5ICpkZXA7Ci0KLSAgaWYgKGRlcF9maWxlID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoZGVwID0gZGVwX2NoYWluOyBkZXAgIT0gTlVMTDsgZGVwID0gZGVwLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIHN0cmNtcCAoZmlsZW5hbWUsIGRlcC0+ZmlsZSkpCi0JcmV0dXJuOwotICAgIH0KLQotICBkZXAgPSAoc3RydWN0IGRlcGVuZGVuY3kgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGVwZW5kZW5jeSkpOwotICBkZXAtPmZpbGUgPSB4c3RyZHVwIChmaWxlbmFtZSk7Ci0gIGRlcC0+bmV4dCA9IGRlcF9jaGFpbjsKLSAgZGVwX2NoYWluID0gZGVwOwotfQotCi0vKiBRdW90ZSBhIGZpbGUgbmFtZSB0aGUgd2F5IGBtYWtlJyB3YW50cyBpdCwgYW5kIHByaW50IGl0IHRvIEZJTEUuCi0gICBJZiBGSUxFIGlzIE5VTEwsIGRvIG5vIHByaW50aW5nLCBidXQgcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlCi0gICBxdW90ZWQgc3RyaW5nLgotCi0gICBUaGlzIGNvZGUgaXMgdGFrZW4gZnJvbSBnY2Mgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMuICAqLwotCi1zdGF0aWMgaW50Ci1xdW90ZV9zdHJpbmdfZm9yX21ha2UgKGZpbGUsIHNyYykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgY2hhciAqc3JjOwotewotICBjaGFyICpwID0gc3JjOwotICBpbnQgaSA9IDA7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgY2hhciBjID0gKnArKzsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnXDAnOgotCWNhc2UgJyAnOgotCWNhc2UgJ1x0JzoKLQkgIHsKLQkgICAgLyogR05VIG1ha2UgdXNlcyBhIHdlaXJkIHF1b3Rpbmcgc2NoZW1lIGZvciB3aGl0ZSBzcGFjZS4KLQkgICAgICAgQSBzcGFjZSBvciB0YWIgcHJlY2VkZWQgYnkgMk4rMSBiYWNrc2xhc2hlcyByZXByZXNlbnRzCi0JICAgICAgIE4gYmFja3NsYXNoZXMgZm9sbG93ZWQgYnkgc3BhY2U7IGEgc3BhY2Ugb3IgdGFiCi0JICAgICAgIHByZWNlZGVkIGJ5IDJOIGJhY2tzbGFzaGVzIHJlcHJlc2VudHMgTiBiYWNrc2xhc2hlcyBhdAotCSAgICAgICB0aGUgZW5kIG9mIGEgZmlsZSBuYW1lOyBhbmQgYmFja3NsYXNoZXMgaW4gb3RoZXIKLQkgICAgICAgY29udGV4dHMgc2hvdWxkIG5vdCBiZSBkb3VibGVkLiAgKi8KLQkgICAgY2hhciAqcTsKLQkgICAgZm9yIChxID0gcCAtIDE7IHNyYyA8IHEgJiYgcVstMV0gPT0gJ1xcJzsgIHEtLSkKLQkgICAgICB7Ci0JCWlmIChmaWxlKQotCQkgIHB1dGMgKCdcXCcsIGZpbGUpOwotCQlpKys7Ci0JICAgICAgfQotCSAgfQotCSAgaWYgKCFjKQotCSAgICByZXR1cm4gaTsKLQkgIGlmIChmaWxlKQotCSAgICBwdXRjICgnXFwnLCBmaWxlKTsKLQkgIGkrKzsKLQkgIGdvdG8gb3JkaW5hcnlfY2hhcjsKLQkgIAotCWNhc2UgJyQnOgotCSAgaWYgKGZpbGUpCi0JICAgIHB1dGMgKGMsIGZpbGUpOwotCSAgaSsrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgVGhpcyBjYW4gbWlzaGFuZGxlIHRoaW5ncyBsaWtlICIkKCIgYnV0Ci0JICAgICB0aGVyZSdzIG5vIGVhc3kgZml4LiAgKi8KLQlkZWZhdWx0OgotCW9yZGluYXJ5X2NoYXI6Ci0JICAvKiBUaGlzIGNhbiBtaXNoYW5kbGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nICJcMFxuJSo/W1xcfiI7Ci0JICAgICBleGFjdGx5IHdoaWNoIGNoYXJzIGFyZSBtaXNoYW5kbGVkIGRlcGVuZHMgb24gdGhlIGBtYWtlJyB2ZXJzaW9uLgotCSAgICAgV2Uga25vdyBvZiBubyBwb3J0YWJsZSBzb2x1dGlvbiBmb3IgdGhpczsKLQkgICAgIGV2ZW4gR05VIG1ha2UgMy43Ni4xIGRvZXNuJ3Qgc29sdmUgdGhlIHByb2JsZW0gZW50aXJlbHkuCi0JICAgICAoQWxzbywgJ1wwJyBpcyBtaXNoYW5kbGVkIGR1ZSB0byBvdXIgY2FsbGluZyBjb252ZW50aW9ucy4pICAqLwotCSAgaWYgKGZpbGUpCi0JICAgIHB1dGMgKGMsIGZpbGUpOwotCSAgaSsrOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotLyogQXBwZW5kIHNvbWUgb3V0cHV0IHRvIHRoZSBmaWxlLCBrZWVwaW5nIHRyYWNrIG9mIGNvbHVtbnMgYW5kIGRvaW5nCi0gICB3cmFwcGluZyBhcyBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgdm9pZAotd3JhcF9vdXRwdXQgKGYsIHN0cmluZywgc3BhY2VyKQotICAgICBGSUxFICpmOwotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIGludCBzcGFjZXI7Ci17Ci0gIGludCBsZW4gPSBxdW90ZV9zdHJpbmdfZm9yX21ha2UgKE5VTEwsIHN0cmluZyk7Ci0KLSAgaWYgKGxlbiA9PSAwKQotICAgIHJldHVybjsKLQotICBpZiAoY29sdW1uICYmIE1BWF9DT0xVTU5TIC0gMSAvKnNwYWNlciovIC0gMiAvKmAgXCcqLyA8IGNvbHVtbiArIGxlbikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiIFxcXG4gIik7Ci0gICAgICBjb2x1bW4gPSAwOwotICAgICAgaWYgKHNwYWNlciA9PSAnICcpCi0Jc3BhY2VyID0gJ1wwJzsKLSAgICB9Ci0KLSAgaWYgKHNwYWNlciA9PSAnICcpCi0gICAgewotICAgICAgcHV0YyAoc3BhY2VyLCBmKTsKLSAgICAgICsrY29sdW1uOwotICAgIH0KLQotICBxdW90ZV9zdHJpbmdfZm9yX21ha2UgKGYsIHN0cmluZyk7Ci0gIGNvbHVtbiArPSBsZW47Ci0KLSAgaWYgKHNwYWNlciA9PSAnOicpCi0gICAgewotICAgICAgcHV0YyAoc3BhY2VyLCBmKTsKLSAgICAgICsrY29sdW1uOwotICAgIH0KLX0KLQotLyogUHJpbnQgZGVwZW5kZW5jeSBmaWxlLiAgKi8KLQotdm9pZAotcHJpbnRfZGVwZW5kZW5jaWVzICgpCi17Ci0gIEZJTEUgKmY7Ci0gIHN0cnVjdCBkZXBlbmRlbmN5ICpkZXA7Ci0KLSAgaWYgKGRlcF9maWxlID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGYgPSBmb3BlbiAoZGVwX2ZpbGUsICJ3Iik7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQ2FuJ3Qgb3BlbiBgJXMnIGZvciB3cml0aW5nIiksIGRlcF9maWxlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29sdW1uID0gMDsKLSAgd3JhcF9vdXRwdXQgKGYsIG91dF9maWxlX25hbWUsICc6Jyk7Ci0gIGZvciAoZGVwID0gZGVwX2NoYWluOyBkZXAgIT0gTlVMTDsgZGVwID0gZGVwLT5uZXh0KQotICAgIHdyYXBfb3V0cHV0IChmLCBkZXAtPmZpbGUsICcgJyk7Ci0KLSAgcHV0YyAoJ1xuJywgZik7Ci0KLSAgaWYgKGZjbG9zZSAoZikpCi0gICAgYXNfd2FybiAoXygiQ2FuJ3QgY2xvc2UgYCVzJyIpLCBkZXBfZmlsZSk7Ci19CmRpZmYgLS1naXQgYS9nYXMvZG9jL01ha2VmaWxlLmFtIGIvZ2FzL2RvYy9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU4ZWMxMy4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLSMgV2hhdCB2ZXJzaW9uIG9mIHRoZSBtYW51YWwgeW91IHdhbnQ7ICJhbGwiIGluY2x1ZGVzIGV2ZXJ5dGhpbmcKLUNPTkZJRz1hbGwKLQotbWFuX01BTlMgPSBhcy4xCi0KLWluZm9fVEVYSU5GT1MgPSBhcy50ZXhpbmZvIGdhc3AudGV4aQotCi1hc2NvbmZpZy50ZXhpOiAkKENPTkZJRykudGV4aQotCXJtIC1mIGFzY29uZmlnLnRleGkKLQlsbiAtcyAkKHNyY2RpcikvJChDT05GSUcpLnRleGkgLi9hc2NvbmZpZy50ZXhpID4vZGV2L251bGwgMj4mMSBcCi0JICB8fCBsbiAkKHNyY2RpcikvJChDT05GSUcpLnRleGkgLi9hc2NvbmZpZy50ZXhpID4vZGV2L251bGwgMj4mMSBcCi0JICB8fCBjcCAkKHNyY2RpcikvJChDT05GSUcpLnRleGkgLi9hc2NvbmZpZy50ZXhpCi0KLUNQVV9ET0NTID0gXAotCWMtYTI5ay50ZXhpIFwKLQljLWFybS50ZXhpIFwKLQljLWQxMHYudGV4aSBcCi0JYy1oODMwMC50ZXhpIFwKLQljLWg4NTAwLnRleGkgXAotCWMtaHBwYS50ZXhpIFwKLQljLWkzODYudGV4aSBcCi0JYy1pOTYwLnRleGkgXAotCWMtbTY4ay50ZXhpIFwKLQljLW1pcHMudGV4aSBcCi0JYy1uczMyay50ZXhpIFwKLQljLXBqLnRleGkgXAotCWMtc2gudGV4aSBcCi0JYy1zcGFyYy50ZXhpIFwKLQljLXZheC50ZXhpIFwKLQljLXY4NTAudGV4aSBcCi0JYy16OGsudGV4aQotCi1nYXN2ZXIudGV4aTogTWFrZWZpbGUKLQlybSAtZiAkQAotCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+ICRACi0KLWFzLmluZm86ICQoc3JjZGlyKS9hcy50ZXhpbmZvIGFzY29uZmlnLnRleGkgZ2FzdmVyLnRleGkgJChDUFVfRE9DUykKLWFzLmR2aTogJChzcmNkaXIpL2FzLnRleGluZm8gYXNjb25maWcudGV4aSBnYXN2ZXIudGV4aSAkKENQVV9ET0NTKQotCi0jIFRoaXMgb25lIGlzbid0IHJlYWR5IGZvciBwcmltZSB0aW1lIHlldC4gIE5vdCBldmVuIGEgbGl0dGxlIGJpdC4KLQotbm9pbnN0X1RFWElORk9TID0gaW50ZXJuYWxzLnRleGkKLQotRElTVENMRUFORklMRVMgPSBhc2NvbmZpZy50ZXhpCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gZ2FzdmVyLnRleGkKZGlmZiAtLWdpdCBhL2dhcy9kb2MvTWFrZWZpbGUuaW4gYi9nYXMvZG9jL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDNjODIwLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFMTF9PQkpfREVQUyA9IEBBTExfT0JKX0RFUFNACi1BUyA9IEBBU0AKLUJGRExJQiA9IEBCRkRMSUJACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRVhFRVhUID0gQEVYRUVYVEAKLUdEQklOSVQgPSBAR0RCSU5JVEAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSU5DTFVERV9MT0NBTEVfSCA9IEBJTkNMVURFX0xPQ0FMRV9IQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotSU5UTERFUFMgPSBASU5UTERFUFNACi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTEQgPSBATERACi1MRVggPSBATEVYQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OTSA9IEBOTUAKLU9QQ09ERVNfTElCID0gQE9QQ09ERVNfTElCQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotWUFDQyA9IEBZQUNDQAotYXRvZiA9IEBhdG9mQAotY2dlbl9jcHVfcHJlZml4ID0gQGNnZW5fY3B1X3ByZWZpeEAKLWV4dHJhX29iamVjdHMgPSBAZXh0cmFfb2JqZWN0c0AKLWluc3RhbGxfdG9vbGRpciA9IEBpbnN0YWxsX3Rvb2xkaXJACi1sID0gQGxACi1vYmpfZm9ybWF0ID0gQG9ial9mb3JtYXRACi10YXJnZXRfY3B1X3R5cGUgPSBAdGFyZ2V0X2NwdV90eXBlQAotdGVfZmlsZSA9IEB0ZV9maWxlQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLSMgV2hhdCB2ZXJzaW9uIG9mIHRoZSBtYW51YWwgeW91IHdhbnQ7ICJhbGwiIGluY2x1ZGVzIGV2ZXJ5dGhpbmcKLUNPTkZJRyA9IGFsbAotCi1tYW5fTUFOUyA9IGFzLjEKLQotaW5mb19URVhJTkZPUyA9IGFzLnRleGluZm8gZ2FzcC50ZXhpCi0KLUNQVV9ET0NTID0gXAotCWMtYTI5ay50ZXhpIFwKLQljLWFybS50ZXhpIFwKLQljLWQxMHYudGV4aSBcCi0JYy1oODMwMC50ZXhpIFwKLQljLWg4NTAwLnRleGkgXAotCWMtaHBwYS50ZXhpIFwKLQljLWkzODYudGV4aSBcCi0JYy1pOTYwLnRleGkgXAotCWMtbTY4ay50ZXhpIFwKLQljLW1pcHMudGV4aSBcCi0JYy1uczMyay50ZXhpIFwKLQljLXBqLnRleGkgXAotCWMtc2gudGV4aSBcCi0JYy1zcGFyYy50ZXhpIFwKLQljLXZheC50ZXhpIFwKLQljLXY4NTAudGV4aSBcCi0JYy16OGsudGV4aQotCi0KLSMgVGhpcyBvbmUgaXNuJ3QgcmVhZHkgZm9yIHByaW1lIHRpbWUgeWV0LiAgTm90IGV2ZW4gYSBsaXR0bGUgYml0LgotCi1ub2luc3RfVEVYSU5GT1MgPSBpbnRlcm5hbHMudGV4aQotCi1ESVNUQ0xFQU5GSUxFUyA9IGFzY29uZmlnLnRleGkKLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBnYXN2ZXIudGV4aQotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IC4uL2NvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAKLVRFWEkyRFZJID0gYGlmIHRlc3QgLWYgJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IHRoZW4gZWNobyAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgZWxzZSBlY2hvIHRleGkyZHZpOyBmaWAKLVRFWElORk9fVEVYID0gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4Ci1JTkZPX0RFUFMgPSBhcy5pbmZvIGdhc3AuaW5mbwotRFZJUyA9IGFzLmR2aSBnYXNwLmR2aQotVEVYSU5GT1MgPSBhcy50ZXhpbmZvIGdhc3AudGV4aQotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1NQU5TID0gJChtYW5fTUFOUykKLQotTlJPRkYgPSBucm9mZgotRElTVF9DT01NT04gPSAgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4KLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSBndGFyCi1HWklQX0VOViA9IC0tYmVzdAotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmR2aSAuaW5mbyAucHMgLnRleGkgLnRleGluZm8gLnR4aQotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBkb2MvTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLQotYXMuaW5mbzogYXMudGV4aW5mbwotYXMuZHZpOiBhcy50ZXhpbmZvCi0KLQotZ2FzcC5pbmZvOiBnYXNwLnRleGkKLWdhc3AuZHZpOiBnYXNwLnRleGkKLQotCi1EVklQUyA9IGR2aXBzCi0KLS50ZXhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnRleGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnR4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0uZHZpLnBzOgotCSQoRFZJUFMpICQ8IC1vICRACi0KLWluc3RhbGwtaW5mby1hbTogJChJTkZPX0RFUFMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmZvZGlyKQotCUBsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgaWZpbGUgaW4gYGNkICQkZCAmJiBlY2hvICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV1gOyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgJCRkLyQkaWZpbGU7IHRoZW4gXAotCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZSI7IFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZTsgXAotCSAgICBlbHNlIDogOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQlAJChQT1NUX0lOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUiO1wKLQkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIHx8IDo7XAotCSAgZG9uZTsgXAotCWVsc2UgOiA7IGZpCi0KLXVuaW5zdGFsbC1pbmZvOgotCSQoUFJFX1VOSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpaT15ZXM7IFwKLQllbHNlIGlpPTsgZmk7IFwKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0IC16ICIkaWkiIFwKLQkgICAgfHwgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgLS1yZW1vdmUgJCRmaWxlOyBcCi0JZG9uZQotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgKGNkICQoREVTVERJUikkKGluZm9kaXIpICYmIHJtIC1mICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV0pOyBcCi0JZG9uZQotCi1kaXN0LWluZm86ICQoSU5GT19ERVBTKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBmaWxlIGluIGBjZCAkJGQgJiYgZXZhbCBlY2hvICQkYmFzZSpgOyBkbyBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLW1vc3RseWNsZWFuLWFtaW5mbzoKLQktcm0gLWYgYXMuYXV4IGFzLmNwIGFzLmNwcyBhcy5kdmkgYXMuZm4gYXMuZm5zIGFzLmt5IGFzLmt5cyBhcy5wcyBcCi0JICBhcy5sb2cgYXMucGcgYXMudG9jIGFzLnRwIGFzLnRwcyBhcy52ciBhcy52cnMgYXMub3AgYXMudHIgXAotCSAgYXMuY3YgYXMuY24gZ2FzcC5hdXggZ2FzcC5jcCBnYXNwLmNwcyBnYXNwLmR2aSBnYXNwLmZuIFwKLQkgIGdhc3AuZm5zIGdhc3Aua3kgZ2FzcC5reXMgZ2FzcC5wcyBnYXNwLmxvZyBnYXNwLnBnIGdhc3AudG9jIFwKLQkgIGdhc3AudHAgZ2FzcC50cHMgZ2FzcC52ciBnYXNwLnZycyBnYXNwLm9wIGdhc3AudHIgZ2FzcC5jdiBcCi0JICBnYXNwLmNuCi0KLWNsZWFuLWFtaW5mbzoKLQotZGlzdGNsZWFuLWFtaW5mbzoKLQotbWFpbnRhaW5lci1jbGVhbi1hbWluZm86Ci0JZm9yIGkgaW4gJChJTkZPX0RFUFMpOyBkbyBcCi0JICBybSAtZiAkJGk7IFwKLQkgIGlmIHRlc3QgImBlY2hvICQkaS1bMC05XSpgIiAhPSAiJCRpLVswLTldKiI7IHRoZW4gXAotCSAgICBybSAtZiAkJGktWzAtOV0qOyBcCi0JICBmaTsgXAotCWRvbmUKLWNsZWFuLWluZm86IG1vc3RseWNsZWFuLWFtaW5mbwotCi1pbnN0YWxsLW1hbjE6Ci0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChtYW4xZGlyKQotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQoc3JjZGlyKS8kJGk7IHRoZW4gZmlsZT0kKHNyY2RpcikvJCRpOyBcCi0JICBlbHNlIGZpbGU9JCRpOyBmaTsgXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1tYW4xOgotCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCi0JbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAotCSAgY2FzZSAiJCRpIiBpbiBcCi0JICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKLQkgIGVzYWM7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gJCRsaXN0OyBkbyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAotCSAgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotaW5zdGFsbC1tYW46ICQoTUFOUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLW1hbjEKLXVuaW5zdGFsbC1tYW46Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwtbWFuMQotdGFnczogVEFHUwotVEFHUzoKLQotCi1kaXN0ZGlyID0gJCh0b3BfYnVpbGRkaXIpLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLQotc3ViZGlyID0gZG9jCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCh0b3BfZGlzdGRpcikiIGRpc3RkaXI9IiQoZGlzdGRpcikiIGRpc3QtaW5mbwotaW5mby1hbTogJChJTkZPX0RFUFMpCi1pbmZvOiBpbmZvLWFtCi1kdmktYW06ICQoRFZJUykKLWR2aTogZHZpLWFtCi1jaGVjay1hbToKLWNoZWNrOiBjaGVjay1hbQotaW5zdGFsbGNoZWNrLWFtOgotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQotaW5zdGFsbC1leGVjLWFtOgotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLWluc3RhbGw6IGluc3RhbGwtYW0KLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLW1hbgotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLWFsbC1hbTogTWFrZWZpbGUgJChNQU5TKQotYWxsLXJlZGlyZWN0OiBhbGwtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOgotCSQobWtpbnN0YWxsZGlycykgICQoREVTVERJUikkKG1hbmRpcikvbWFuMQotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0JLXRlc3QgLXogIiQoRElTVENMRUFORklMRVMpIiB8fCBybSAtZiAkKERJU1RDTEVBTkZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1hbWluZm8gbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW4tYW06ICBjbGVhbi1hbWluZm8gY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tYW0KLQotZGlzdGNsZWFuLWFtOiAgZGlzdGNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1hbQotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLWFtCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAotCQlkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQotCi0uUEhPTlk6IGluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtaW5mbyBtb3N0bHljbGVhbi1hbWluZm8gXAotZGlzdGNsZWFuLWFtaW5mbyBjbGVhbi1hbWluZm8gbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gaW5zdGFsbC1tYW4xIFwKLXVuaW5zdGFsbC1tYW4xIGluc3RhbGwtbWFuIHVuaW5zdGFsbC1tYW4gdGFncyBkaXN0ZGlyIGluZm8tYW0gaW5mbyBcCi1kdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgaW5zdGFsbC1pbmZvLWFtIFwKLWluc3RhbGwtaW5mbyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgXAotaW5zdGFsbC1hbSBpbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgXAotaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi0KLWFzY29uZmlnLnRleGk6ICQoQ09ORklHKS50ZXhpCi0Jcm0gLWYgYXNjb25maWcudGV4aQotCWxuIC1zICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGxuICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGNwICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkKLQotZ2FzdmVyLnRleGk6IE1ha2VmaWxlCi0Jcm0gLWYgJEAKLQllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiAkQAotCi1hcy5pbmZvOiAkKHNyY2RpcikvYXMudGV4aW5mbyBhc2NvbmZpZy50ZXhpIGdhc3Zlci50ZXhpICQoQ1BVX0RPQ1MpCi1hcy5kdmk6ICQoc3JjZGlyKS9hcy50ZXhpbmZvIGFzY29uZmlnLnRleGkgZ2FzdmVyLnRleGkgJChDUFVfRE9DUykKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9hbGwudGV4aSBiL2dhcy9kb2MvYWxsLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNmIyZGMuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9hbGwudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLUBjIENvcHlyaWdodCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBHQVMgbWFudWFsCi0KLUBjIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGFsbC1pbmNsdXNpdmUgdmVyc2lvbiBvZiBtYW51YWwKLQotQGMgc3dpdGNoZXM6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AYyBQcm9wZXJ0aWVzIG9mIHRoZSBtYW51YWwKLUBjID09PT09PT09PT09PT09PT09PT09PT09PQotQGMgRGlzY3VzcyBhbGwgYXJjaGl0ZWN0dXJlcz8KLUBzZXQgQUxMLUFSQ0gKLUBjIEEgZ2VuZXJpYyBmb3JtIG9mIG1hbnVhbCAobm90IHRhaWxvcmVkIHRvIHNwZWNpZmljIHRhcmdldCk/Ci1Ac2V0IEdFTkVSSUMKLUBjIEluY2x1ZGUgdGV4dCBvbiBhc3NlbWJsZXIgaW50ZXJuYWxzPwotQGNsZWFyIElOVEVSTkFMUwotQGMgTWFueSBvYmplY3QgZm9ybWF0cyBzdXBwb3J0ZWQgaW4gdGhpcyBjb25maWc/Ci1Ac2V0IE1VTFRJLU9CSgotCi1AYyBPYmplY3QgZm9ybWF0cyBvZiBpbnRlcmVzdAotQGMgPT09PT09PT09PT09PT09PT09PT09PT09PT0KLUBzZXQgQU9VVAotQHNldCBCT1VUCi1Ac2V0IENPRkYKLUBzZXQgRUxGCi1Ac2V0IFNPTQotCi1AYyBDUFVzIG9mIGludGVyZXN0Ci1AYyA9PT09PT09PT09PT09PT09Ci1Ac2V0IEEyOUsKLUBzZXQgQVJDCi1Ac2V0IEFSTQotQHNldCBEMTBWCi1Ac2V0IEQzMFYKLUBzZXQgSDgvMzAwCi1Ac2V0IEg4LzUwMAotQHNldCBIUFBBCi1Ac2V0IEk4MDM4NgotQHNldCBJOTYwCi1Ac2V0IE0zMlIKLUBzZXQgTTY4MFgwCi1Ac2V0IE1DT1JFCi1Ac2V0IE1JUFMKLUBzZXQgUEoKLUBzZXQgU0gKLUBzZXQgU1BBUkMKLUBzZXQgVjg1MAotQHNldCBWQVgKLUBzZXQgVlhXT1JLUwotQHNldCBaODAwMAotCi1AYyBEb2VzIHRoaXMgdmVyc2lvbiBvZiB0aGUgYXNzZW1ibGVyIHVzZSB0aGUgZGlmZmVyZW5jZS10YWJsZSBrbHVnZT8KLUBzZXQgRElGRi1UQkwtS0xVR0UKLQotQGMgRG8gYWxsIG1hY2hpbmVzIGRlc2NyaWJlZCB1c2UgSUVFRSBmbG9hdGluZyBwb2ludD8KLUBjbGVhciBJRUVFRkxPQVQKLQotQGMgSXMgYSB3b3JkIDMyIGJpdHMsIG9yIDE2PwotQGNsZWFyIFczMgotQHNldCBXMTYKLQotQGMgRG8gc3ltYm9scyBoYXZlIGRpZmZlcmVudCBjaGFyYWN0ZXJzIHRoYW4gdXN1YWw/Ci1AY2xlYXIgU1BFQ0lBTC1TWU1TCi0KLUBjIHN0cmluZ3M6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AYyBOYW1lIG9mIHRoZSBhc3NlbWJsZXI6Ci1Ac2V0IEFTIGFzCi1AYyBOYW1lIG9mIEMgY29tcGlsZXI6Ci1Ac2V0IEdDQyBnY2MKLUBjIE5hbWUgb2YgbGlua2VyOgotQHNldCBMRCBsZAotQGMgVGV4dCBmb3IgdGFyZ2V0IG1hY2hpbmUgKGJlc3Qgbm90IHVzZWQgaW4gZ2VuZXJpYyBjYXNlOyBidXQganVzdCBpbiBjYXNlLi4uKQotQHNldCBUQVJHRVQgbWFjaGluZSBzcGVjaWZpYwotQGMgTmFtZSBvZiBvYmplY3QgZm9ybWF0IE5PVCBTRVQgaW4gZ2VuZXJpYyB2ZXJzaW9uCi1AY2xlYXIgT0JKLU5BTUUKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYXMuMSBiL2dhcy9kb2MvYXMuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkNTgwNS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2FzLjEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MiwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIGFzIDEgIjI5IE1hcmNoIDE5OTYiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLQotLlNIIE5BTUUKLUdOVSBhcyBcLSB0aGUgcG9ydGFibGUgR05VIGFzc2VtYmxlci4KLQotLlNIIFNZTk9QU0lTCi0ubmEKLS5CIGFzCi0uUkIgIltcfCIgXC1hICJbXHwiIGRobG5zICJcfF0iIFxjCi1cJlxbXHxcPVxjCi0uSSBmaWxlXGMKLVwmXHxdXHxdCi0uUkIgIltcfCIgXC1EICJcfF0iCi0uUkIgIltcfCIgXC1cLWRlZnN5bVwgU1lNPVZBTCAiXHxdIgotLlJCICJbXHwiIFwtZiAiXHxdIgotLlJCICJbXHwiIFwtXC1nc3RhYnMgIlx8XSIKLS5SQiAiW1x8IiBcLUkKLS5JIHBhdGhcYwotXCZcfF0KLS5SQiAiW1x8IiBcLUsgIlx8XSIKLS5SQiAiW1x8IiBcLUwgIlx8XSIKLS5SQiAiW1x8IiBcLU1cIHxcIFwtXC1tcmkgIlx8XSIKLS5SQiAiW1x8IiBcLW8gCi0uSSBvYmpmaWxlXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1SICJcfF0iCi0uUkIgIltcfCIgXC1cLXRyYWRpdGlvbmFsXC1mb3JtYXQgIlx8XSIKLS5SQiAiW1x8IiBcLXYgIlx8XSIKLS5SQiAiW1x8IiBcLXcgIlx8XSIKLS5SQiAiW1x8IiBcLVxeXC0gIlwgfFwgIiBcYwotLkkgZmlsZXNcYwotXCZcfC5cfC5cfC5cfF0KLQotLkkgaTk2MC1vbmx5IG9wdGlvbnM6Ci0uYnIKLS5SQiAiW1x8IiBcLUFDQSAiXHx8XHwiIFwtQUNBX0EgIlx8fFx8IiBcLUFDQlxjCi0uUkIgIlx8fFx8IiBcLUFDQyAiXHx8XHwiIFwtQUtBICJcfHxcfCIgXC1BS0JcYwotLlJCICJcfHxcfCIgXC1BS0MgIlx8fFx8IiBcLUFNQyAiXHxdIgotLlJCICJbXHwiIFwtYiAiXHxdIgotLlJCICJbXHwiIFwtbm8tcmVsYXggIlx8XSIKLQotLkkgbTY4MHgwLW9ubHkgb3B0aW9uczoKLS5icgotLlJCICJbXHwiIFwtbCAiXHxdIgotLlJCICJbXHwiIFwtbWM2ODAwMCAiXHx8XHwiIFwtbWM2ODAxMCAiXHx8XHwiIFwtbWM2ODAyMCAiXHxdIgotLmFkIGIKLQotLlNIIERFU0NSSVBUSU9OCi1HTlUgXGMKLS5CIGFzXGMKLVwmIGlzIHJlYWxseSBhIGZhbWlseSBvZiBhc3NlbWJsZXJzLiAgCi1JZiB5b3UgdXNlIChvciBoYXZlIHVzZWQpIHRoZSBHTlUgYXNzZW1ibGVyIG9uIG9uZSBhcmNoaXRlY3R1cmUsIHlvdQotc2hvdWxkIGZpbmQgYSBmYWlybHkgc2ltaWxhciBlbnZpcm9ubWVudCB3aGVuIHlvdSB1c2UgaXQgb24gYW5vdGhlcgotYXJjaGl0ZWN0dXJlLiAgRWFjaCB2ZXJzaW9uIGhhcyBtdWNoIGluIGNvbW1vbiB3aXRoIHRoZSBvdGhlcnMsCi1pbmNsdWRpbmcgb2JqZWN0IGZpbGUgZm9ybWF0cywgbW9zdCBhc3NlbWJsZXIgZGlyZWN0aXZlcyAob2Z0ZW4gY2FsbGVkCi1cYwotLkkgcHNldWRvLW9wcylcYwotXCYgYW5kIGFzc2VtYmxlciBzeW50YXguICAKLQotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBzeW50YXggYW5kIHBzZXVkby1vcHMgdXNlZCBieSBHTlUgXGMKLS5CIGFzXGMKLVwmLCBzZWUgYFx8XGMKLS5CIGFzXGMKLVx8JyBlbnRyeSBpbiBcYwotLkIgaW5mbyBcYwotKG9yIHRoZSBtYW51YWwgXGMKLS5JCi0uSQotVXNpbmcgYXM6IFRoZSBHTlUgQXNzZW1ibGVyXGMKLVwmKS4KLQotXGMKLS5CIGFzXGMKLVwmIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBhc3NlbWJsZSB0aGUgb3V0cHV0IG9mIHRoZSBHTlUgQwotY29tcGlsZXIgXGMKLS5CIGdjY1xjCi1cJiBmb3IgdXNlIGJ5IHRoZSBsaW5rZXIgXGMKLS5CIGxkXGMKLVwmLiAgTmV2ZXJ0aGVsZXNzLAotd2UndmUgdHJpZWQgdG8gbWFrZSBcYwotLkIgYXNcYwotXCYgYXNzZW1ibGUgY29ycmVjdGx5IGV2ZXJ5dGhpbmcgdGhhdCB0aGUgbmF0aXZlCi1hc3NlbWJsZXIgd291bGQuCi1UaGlzIGRvZXNuJ3QgbWVhbiBcYwotLkIgYXNcYwotXCYgYWx3YXlzIHVzZXMgdGhlIHNhbWUgc3ludGF4IGFzIGFub3RoZXIKLWFzc2VtYmxlciBmb3IgdGhlIHNhbWUgYXJjaGl0ZWN0dXJlOyBmb3IgZXhhbXBsZSwgd2Uga25vdyBvZiBzZXZlcmFsCi1pbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgNjgweDAgYXNzZW1ibHkgbGFuZ3VhZ2Ugc3ludGF4LgotCi1FYWNoIHRpbWUgeW91IHJ1biBcYwotLkIgYXNcYwotXCYgaXQgYXNzZW1ibGVzIGV4YWN0bHkgb25lIHNvdXJjZQotcHJvZ3JhbS4gIFRoZSBzb3VyY2UgcHJvZ3JhbSBpcyBtYWRlIHVwIG9mIG9uZSBvciBtb3JlIGZpbGVzLgotKFRoZSBzdGFuZGFyZCBpbnB1dCBpcyBhbHNvIGEgZmlsZS4pCi0KLUlmIFxjCi0uQiBhc1xjCi1cJiBpcyBnaXZlbiBubyBmaWxlIG5hbWVzIGl0IGF0dGVtcHRzIHRvIHJlYWQgb25lIGlucHV0IGZpbGUKLWZyb20gdGhlIFxjCi0uQiBhc1xjCi1cJiBzdGFuZGFyZCBpbnB1dCwgd2hpY2ggaXMgbm9ybWFsbHkgeW91ciB0ZXJtaW5hbC4gIFlvdQotbWF5IGhhdmUgdG8gdHlwZSBcYwotLkIgY3RsLURcYwotXCYgdG8gdGVsbCBcYwotLkIgYXNcYwotXCYgdGhlcmUgaXMgbm8gbW9yZSBwcm9ncmFtCi10byBhc3NlbWJsZS4gIFVzZSBgXHxcYwotLkIgXC1cXlwtXGMKLVx8JyBpZiB5b3UgbmVlZCB0byBleHBsaWNpdGx5IG5hbWUgdGhlIHN0YW5kYXJkIGlucHV0IGZpbGUKLWluIHlvdXIgY29tbWFuZCBsaW5lLgotCi0uQiBhc1xjCi1cJiBtYXkgd3JpdGUgd2FybmluZ3MgYW5kIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSBzdGFuZGFyZCBlcnJvcgotZmlsZSAodXN1YWxseSB5b3VyIHRlcm1pbmFsKS4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gd2hlbiBcYwotLkIgYXNcYwotXCYgaXMKLXJ1biBhdXRvbWF0aWNhbGx5IGJ5IGEgY29tcGlsZXIuICBXYXJuaW5ncyByZXBvcnQgYW4gYXNzdW1wdGlvbiBtYWRlIHNvCi10aGF0IFxjCi0uQiBhc1xjCi1cJiBjb3VsZCBrZWVwIGFzc2VtYmxpbmcgYSBmbGF3ZWQgcHJvZ3JhbTsgZXJyb3JzIHJlcG9ydCBhCi1ncmF2ZSBwcm9ibGVtIHRoYXQgc3RvcHMgdGhlIGFzc2VtYmx5LgotCi0uU0ggT1BUSU9OUwotLlRQCi0uQlIgXC1hCi1UdXJuIG9uIGFzc2VtYmx5IGxpc3RpbmdzLiAgVGhlcmUgYXJlIHZhcmlvdXMgc3Vib3B0aW9ucy4KLS5CIGQKLW9taXRzIGRlYnVnZ2luZyBkaXJlY3RpdmVzLgotLkIgaAotaW5jbHVkZXMgdGhlIGhpZ2ggbGV2ZWwgc291cmNlIGNvZGU7IHRoaXMgaXMgb25seSBhdmFpbGFibGUgaWYgdGhlCi1zb3VyY2UgZmlsZSBjYW4gYmUgZm91bmQsIGFuZCB0aGUgY29kZSB3YXMgY29tcGlsZWQgd2l0aAotLkIgXC1nLgotLkIgbAotaW5jbHVkZXMgYW4gYXNzZW1ibHkgbGlzdGluZy4KLS5CIG4KLW9taXRzIGZvcm1zIHByb2Nlc3NpbmcuCi0uQiBzCi1pbmNsdWRlcyBhIHN5bWJvbCBsaXN0aW5nLgotLkIgPQotLkkgZmlsZQotc2V0cyB0aGUgbGlzdGluZyBmaWxlIG5hbWU7IHRoaXMgbXVzdCBiZSB0aGUgbGFzdCBzdWJvcHRpb24uCi1UaGUgZGVmYXVsdCBzdWJvcHRpb25zIGFyZQotLkIgaGxzLgotLlRQCi0uQiBcLUQKLVRoaXMgb3B0aW9uIGlzIGFjY2VwdGVkIG9ubHkgZm9yIHNjcmlwdCBjb21wYXRpYmlsaXR5IHdpdGggY2FsbHMgdG8KLW90aGVyIGFzc2VtYmxlcnM7IGl0IGhhcyBubyBlZmZlY3Qgb24gXGMKLS5CIGFzXGMKLVwmLgotLlRQCi0uQiBcLVwtZGVmc3ltIFNZTT1WQUxVRQotRGVmaW5lIHRoZSBzeW1ib2wgU1lNIHRvIGJlIFZBTFVFIGJlZm9yZSBhc3NlbWJsaW5nIHRoZSBpbnB1dCBmaWxlLgotVkFMVUUgbXVzdCBiZSBhbiBpbnRlZ2VyIGNvbnN0YW50LiAgQXMgaW4gQywgYSBsZWFkaW5nIDB4IGluZGljYXRlcyBhCi1oZXhhZGVjaW1hbCB2YWx1ZSwgYW5kIGEgbGVhZGluZyAwIGluZGljYXRlcyBhbiBvY3RhbCB2YWx1ZS4KLS5UUAotLkIgXC1mCi1gYGZhc3QnJy0tc2tpcCBwcmVwcm9jZXNzaW5nIChhc3N1bWUgc291cmNlIGlzIGNvbXBpbGVyIG91dHB1dCkuCi0uVFAKLS5CSSAiXC1JXCAiIHBhdGgKLUFkZCAKLS5JIHBhdGgKLXRvIHRoZSBzZWFyY2ggbGlzdCBmb3IgCi0uQiAuaW5jbHVkZQotZGlyZWN0aXZlcy4KLS5UUAotLkIgXC1cLWdzdGFicwotR2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBlYWNoIGFzc2VtYmxlciBsaW5lLiAgVGhpcwotbWF5IGhlbHAgZGVidWdnaW5nIGFzc2VtYmxlciBjb2RlLCBpZiB0aGUgZGVidWdnZXIgY2FuIGhhbmRsZSBpdC4KLS5UUAotLkIgXC1LCi1Jc3N1ZSB3YXJuaW5ncyB3aGVuIGRpZmZlcmVuY2UgdGFibGVzIGFsdGVyZWQgZm9yIGxvbmcgZGlzcGxhY2VtZW50cy4KLS5UUAotLkIgXC1MCi1LZWVwIChpbiBzeW1ib2wgdGFibGUpIGxvY2FsIHN5bWJvbHMsIHN0YXJ0aW5nIHdpdGggYFx8XGMKLS5CIExcYwotXHwnCi0uVFAKLS5CIFwtTSwgXC1cLW1yaQotQXNzZW1ibGUgaW4gTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4KLS5UUAotLkJJICJcLW9cICIgb2JqZmlsZQotTmFtZSB0aGUgb2JqZWN0LWZpbGUgb3V0cHV0IGZyb20gXGMKLS5CIGFzCi0uVFAKLS5CIFwtUgotRm9sZCBkYXRhIHNlY3Rpb24gaW50byB0ZXh0IHNlY3Rpb24KLS5UUAotLkIgXC1cLXRyYWRpdGlvbmFsXC1mb3JtYXQKLVVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgYXNzZW1ibGVyLCB3aGVuIHBvc3NpYmxlLgotLlRQCi0uQiBcLXYKLUFubm91bmNlIFxjCi0uQiBhc1xjCi1cJiB2ZXJzaW9uCi0uVFAKLS5CIFwtVywgXC1cLW5vLXdhcm4KLVN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXMuCi0uVFAKLS5CIFwtXC1mYXRhbFwtd2FybmluZ3MKLUNvbnNpZGVyIHdhcm5pbmdzIHRvIGJlIGZhdGFsLgotLlRQCi0uQiBcLVwtd2FybgotSnVzdCB3YXJuIG9uIHdhcm5pbmdzLgotLlRQCi0uSVIgIlwtXF5cLSIgIlwgfFwgIiAiZmlsZXNcfC5cfC5cfC4iCi1Tb3VyY2UgZmlsZXMgdG8gYXNzZW1ibGUsIG9yIHN0YW5kYXJkIGlucHV0IChcYwotLkJSICJcLVxeXC0iICIpIgotLlRQCi0uQkkgXC1BIHZhcgotLkkKLShXaGVuIGNvbmZpZ3VyZWQgZm9yIEludGVsIDk2MC4pCi1TcGVjaWZ5IHdoaWNoIHZhcmlhbnQgb2YgdGhlIDk2MCBhcmNoaXRlY3R1cmUgaXMgdGhlIHRhcmdldC4KLS5UUAotLkIgXC1iCi0uSQotKFdoZW4gY29uZmlndXJlZCBmb3IgSW50ZWwgOTYwLikKLUFkZCBjb2RlIHRvIGNvbGxlY3Qgc3RhdGlzdGljcyBhYm91dCBicmFuY2hlcyB0YWtlbi4KLS5UUAotLkIgXC1uby1yZWxheAotLkkKLShXaGVuIGNvbmZpZ3VyZWQgZm9yIEludGVsIDk2MC4pCi1EbyBub3QgYWx0ZXIgY29tcGFyZS1hbmQtYnJhbmNoIGluc3RydWN0aW9ucyBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzOwotZXJyb3IgaWYgbmVjZXNzYXJ5LgotLlRQCi0uQiBcLWwKLS5JCi0oV2hlbiBjb25maWd1cmVkIGZvciBNb3Rvcm9sYSA2ODAwMCkuICAKLS5icgotU2hvcnRlbiByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZCBzeW1ib2xzLCB0byBvbmUgd29yZCBpbnN0ZWFkIG9mIHR3by4KLS5UUAotLkJSICJcLW1jNjgwMDAiICJcfHxcfCIgIlwtbWM2ODAxMCIgIlx8fFx8IiAiXC1tYzY4MDIwIgotLkkKLShXaGVuIGNvbmZpZ3VyZWQgZm9yIE1vdG9yb2xhIDY4MDAwKS4gIAotLmJyCi1TcGVjaWZ5IHdoYXQgcHJvY2Vzc29yIGluIHRoZSA2ODAwMCBmYW1pbHkgaXMgdGhlIHRhcmdldCAoZGVmYXVsdCA2ODAyMCkKLQotLlBQCi1PcHRpb25zIG1heSBiZSBpbiBhbnkgb3JkZXIsIGFuZCBtYXkgYmUKLWJlZm9yZSwgYWZ0ZXIsIG9yIGJldHdlZW4gZmlsZSBuYW1lcy4gIFRoZSBvcmRlciBvZiBmaWxlIG5hbWVzIGlzCi1zaWduaWZpY2FudC4KLQotYFx8XGMKLS5CIFwtXF5cLVxjCi1cfCcgKHR3byBoeXBoZW5zKSBieSBpdHNlbGYgbmFtZXMgdGhlIHN0YW5kYXJkIGlucHV0IGZpbGUKLWV4cGxpY2l0bHksIGFzIG9uZSBvZiB0aGUgZmlsZXMgZm9yIFxjCi0uQiBhc1xjCi1cJiB0byBhc3NlbWJsZS4KLQotRXhjZXB0IGZvciBgXHxcYwotLkIgXC1cXlwtXGMKLVx8JyBhbnkgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRoYXQgYmVnaW5zIHdpdGggYQotaHlwaGVuIChgXHxcYwotLkIgXC1cYwotXHwnKSBpcyBhbiBvcHRpb24uICBFYWNoIG9wdGlvbiBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZgotXGMKLS5CIGFzXGMKLVwmLiAgTm8gb3B0aW9uIGNoYW5nZXMgdGhlIHdheSBhbm90aGVyIG9wdGlvbiB3b3Jrcy4gIEFuCi1vcHRpb24gaXMgYSBgXHxcYwotLkIgXC1cYwotXHwnIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGxldHRlcnM7IHRoZSBjYXNlIG9mCi10aGUgbGV0dGVyIGlzIGltcG9ydGFudC4gICBBbGwgb3B0aW9ucyBhcmUgb3B0aW9uYWwuCi0KLVRoZSBgXHxcYwotLkIgXC1vXGMKLVx8JyBvcHRpb24gZXhwZWN0cyBleGFjdGx5IG9uZSBmaWxlIG5hbWUgdG8gZm9sbG93LiAgVGhlIGZpbGUKLW5hbWUgbWF5IGVpdGhlciBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIG9wdGlvbidzIGxldHRlciAoY29tcGF0aWJsZQotd2l0aCBvbGRlciBhc3NlbWJsZXJzKSBvciBpdCBtYXkgYmUgdGhlIG5leHQgY29tbWFuZCBhcmd1bWVudCAoR05VCi1zdGFuZGFyZCkuICAKLQotVGhlc2UgdHdvIGNvbW1hbmQgbGluZXMgYXJlIGVxdWl2YWxlbnQ6Ci0uYnIKLS5CCi1hc1wgXCBcLW9cIFwgbXlcLW9iamVjdFwtZmlsZS5vXCBcIG11bWJsZS5zCi0uYnIKLS5CCi1hc1wgXCBcLW9teVwtb2JqZWN0XC1maWxlLm9cIFwgbXVtYmxlLnMKLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBhcyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVXNpbmcgYXM6IFRoZSBHTlUgQXNzZW1ibGVyXGMKLVwmOwotLkJSIGdjYyAiKCIgMSAiKSwiCi0uQlIgbGQgIigiIDEgIikuIgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9nYXMvZG9jL2FzLnRleGluZm8gYi9nYXMvZG9jL2FzLnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMGE4YjIuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9hcy50ZXhpbmZvCisrKyAvZGV2L251bGwKQEAgLTEsNTM5NyArMCwwIEBACi1caW5wdXQgdGV4aW5mbyBAYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi1UZXhpbmZvLSotCi1AYyAgQ29weXJpZ2h0IChjKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci1AYyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBVUERBVEUhISAgT24gZnV0dXJlIHVwZGF0ZXMtLQotQGMgICAoMSkgICBjaGVjayBmb3IgbmV3IG1hY2hpbmUtZGVwIGNtZGxpbmUgb3B0aW9ucyBpbgotQGMgICAgICAgICBtZF9wYXJzZV9vcHRpb24gZGVmaW5pdGlvbnMgaW4gY29uZmlnL3RjLSouYwotQGMgICAoMikgICBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgZGlyZWN0aXZlcywgZXhhbWluZSBtZF9wc2V1ZG9fb3AKLUBjICAgICAgICAgaW4gY29uZmlnL3RjLSouYwotQGMgICAoMykgICBmb3Igb2JqZWN0LWZvcm1hdCBzcGVjaWZpYyBkaXJlY3RpdmVzLCBleGFtaW5lIG9ial9wc2V1ZG9fb3AKLUBjICAgICAgICAgaW4gY29uZmlnL29iai0qLmMgICAgICAgCi1AYyAgICg0KSAgIHBvcnRhYmxlIGRpcmVjdGl2ZXMgaW4gcG90YWJsZVtdIGluIHJlYWQuYwotQGMgJSoqc3RhcnQgb2YgaGVhZGVyCi1Ac2V0ZmlsZW5hbWUgYXMuaW5mbwotQGMgLS0tY29uZmlnLS0tCi1AYyBkZWZhdWx0cywgY29uZmlnIGZpbGUgbWF5IG92ZXJyaWRlOgotQHNldCBoYXZlLXN0YWJzCi1AYyAtLS0KLUBpbmNsdWRlIGFzY29uZmlnLnRleGkKLUBpbmNsdWRlIGdhc3Zlci50ZXhpCi1AYyAtLS0KLUBjIGNvbW1vbiBPUiBjb21iaW5hdGlvbnMgb2YgY29uZGl0aW9ucwotQGlmc2V0IEFPVVQKLUBzZXQgYW91dC1ib3V0Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgQVJNL1RodW1iCi1Ac2V0IEFSTQotQGVuZCBpZnNldAotQGlmc2V0IEJPVVQKLUBzZXQgYW91dC1ib3V0Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgvMzAwCi1Ac2V0IEg4Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgvNTAwCi1Ac2V0IEg4Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgU0gKLUBzZXQgSDgKLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi1Ac2V0IGFibm9ybWFsLXNlcGFyYXRvcgotQGVuZCBpZnNldAotQGMgLS0tLS0tLS0tLS0tCi1AaWZzZXQgR0VORVJJQwotQHNldHRpdGxlIFVzaW5nIEB2YWx1ZXtBU30KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBzZXR0aXRsZSBVc2luZyBAdmFsdWV7QVN9IChAdmFsdWV7VEFSR0VUfSkKLUBlbmQgaWZjbGVhcgotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQGMgJSoqZW5kIG9mIGhlYWRlcgotCi1AYyBAc21hbGxib29rCi1AYyBAc2V0IFNNQUxMCi1AYyBXQVJFISBTb21lIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBzZWN0aW9ucyBjb250YWluIHRhYmxlcyBvZiBtYWNoaW5lCi1AYyBpbnN0cnVjdGlvbnMuICBFeGNlcHQgaW4gbXVsdGktY29sdW1uIGZvcm1hdCwgdGhlc2UgdGFibGVzIGxvb2sgc2lsbHkuCi1AYyBVbmZvcnR1bmF0ZWx5LCBUZXhpbmZvIGRvZXNuJ3QgaGF2ZSBhIGdlbmVyYWwtcHVycG9zZSBtdWx0aS1jb2wgZm9ybWF0LCBzbwotQGMgdGhlIG11bHRpLWNvbCBmb3JtYXQgaXMgZmFrZWQgd2l0aGluIEBleGFtcGxlIHNlY3Rpb25zLgotQGMgCi1AYyBBZ2FpbiB1bmZvcnR1bmF0ZWx5LCB0aGUgbmF0dXJhbCBzaXplIHRoYXQgZml0cyBvbiBhIHBhZ2UsIGZvciB0aGVzZSB0YWJsZXMsCi1AYyBpcyBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHNtYWxsYm9vayBpcyB0dXJuZWQgb24uCi1AYyBUaGlzIG1hdHRlcnMsIGJlY2F1c2Ugb2Ygb3JkZXI6IHRleHQgZmxvdyBzd2l0Y2hlcyBjb2x1bW5zIGF0IGVhY2ggcGFnZQotQGMgYnJlYWsuCi1AYyAKLUBjIFRoZSBmb3JtYXQgZmFrZWQgaW4gdGhpcyBzb3VyY2Ugd29ya3MgcmVhc29uYWJseSB3ZWxsIGZvciBzbWFsbGJvb2ssCi1AYyBub3Qgd2VsbCBmb3IgdGhlIGRlZmF1bHQgbGFyZ2UtcGFnZSBmb3JtYXQuICBUaGlzIG1hbnVhbCBleHBlY3RzIHRoYXQgaWYgeW91Ci1AYyB0dXJuIG9uIEBzbWFsbGJvb2ssIHlvdSB3aWxsIGFsc28gdW5jb21tZW50IHRoZSAiQHNldCBTTUFMTCIgdG8gZW5hYmxlIHRoZQotQGMgdGFibGVzIGluIHF1ZXN0aW9uLiAgWW91IGNhbiB0dXJuIG9uIG9uZSB3aXRob3V0IHRoZSBvdGhlciBhdCB5b3VyCi1AYyBkaXNjcmV0aW9uLCBvZiBjb3Vyc2UuIAotQGlmaW5mbwotQHNldCBTTUFMTAotQGMgdGhlIGluc24gdGFibGVzIGxvb2sganVzdCBhcyBzaWxseSBpbiBpbmZvIGZpbGVzIHJlZ2FyZGxlc3Mgb2Ygc21hbGxib29rLAotQGMgbWlnaHQgYXMgd2VsbCBzaG93ICdlbSBhbnl3YXlzLgotQGVuZCBpZmluZm8KLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogQXM6IChhcykuICAgICAgICAgICAgICAgICAgICAgVGhlIEdOVSBhc3NlbWJsZXIuCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AZmluYWxvdXQKLUBzeW5jb2RlaW5kZXgga3kgY3AKLQotQGlmaW5mbwotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgR05VIEFzc2VtYmxlciAiQHZhbHVle0FTfSIuCi0KLUNvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZXggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotCi1AZW5kIGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcyBtYW51YWwKLXVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUgcmVzdWx0aW5nCi1kZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvCi10aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi0KLUB0aXRsZXBhZ2UKLUB0aXRsZSBVc2luZyBAdmFsdWV7QVN9Ci1Ac3VidGl0bGUgVGhlIEBzY3tnbnV9IEFzc2VtYmxlcgotQGlmY2xlYXIgR0VORVJJQwotQHN1YnRpdGxlIGZvciB0aGUgQHZhbHVle1RBUkdFVH0gZmFtaWx5Ci1AZW5kIGlmY2xlYXIKLUBzcCAxCi1Ac3VidGl0bGUgVmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0KLUBzcCAxCi1Ac3AgMTMKLVRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gSW5jLiAgdGhhbmtzIFRoZSBOaWNlIENvbXB1dGVyCi1Db21wYW55IG9mIEF1c3RyYWxpYSBmb3IgbG9hbmluZyBEZWFuIEVsc25lciB0byB3cml0ZSB0aGUKLWZpcnN0IChWYXgpIHZlcnNpb24gb2YgQGNvZGV7YXN9IGZvciBQcm9qZWN0IEBzY3tnbnV9LgotVGhlIHByb3ByaWV0b3JzLCBtYW5hZ2VtZW50IGFuZCBzdGFmZiBvZiBUTkNDQSB0aGFuayBGU0YgZm9yCi1kaXN0cmFjdGluZyB0aGUgYm9zcyB3aGlsZSB0aGV5IGdvdCBzb21lIHdvcmsKLWRvbmUuCi1Ac3AgMwotQGF1dGhvciBEZWFuIEVsc25lciwgSmF5IEZlbmxhc29uICYgZnJpZW5kcwotQHBhZ2UKLUB0ZXgKLXtccGFyc2tpcD0wcHQKLVxoZmlsbCB7XGl0IFVzaW5nIHtcdHQgQHZhbHVle0FTfX19XHBhcgotXGhmaWxsIEVkaXRlZCBieSBDeWdudXMgU3VwcG9ydFxwYXIKLX0KLSUiYm94aXQiIG1hY3JvIGZvciBmaWd1cmVzOgotJU1vZGlmaWVkIGZyb20gS251dGgncyBgYGJveGl0JycgbWFjcm8gZnJvbSBUZVhib29rIChhbnN3ZXIgdG8gZXhlcmNpc2UgMjEuMykKLVxnZGVmXGJveGl0IzEjMntcdmJveHtcaHJ1bGVcaGJveHtcdnJ1bGVca2VybjNwdAotICAgICBcdmJveHtccGFyaW5kZW50PTBwdFxwYXJza2lwPTBwdFxoc2l6ZT0jMVxrZXJuM3B0XHN0cnV0XGhmaWwKLSMyXGhmaWxcc3RydXRca2VybjNwdH1ca2VybjNwdFx2cnVsZX1caHJ1bGV9fSVib3ggd2l0aCB2aXNpYmxlIG91dGxpbmUKLVxnZGVmXGlib3gjMSMye1xoYm94IHRvICMxeyMyXGhmaWx9XGtlcm44cHR9JSBpbnZpc2libGUgYm94Ci1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcyBtYW51YWwKLXVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUgcmVzdWx0aW5nCi1kZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvCi10aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgdGl0bGVwYWdlCi0KLUBpZmluZm8KLUBub2RlIFRvcAotQHRvcCBVc2luZyBAdmFsdWV7QVN9Ci0KLVRoaXMgZmlsZSBpcyBhIHVzZXIgZ3VpZGUgdG8gdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBAY29kZXtAdmFsdWV7QVN9fSB2ZXJzaW9uCi1AdmFsdWV7VkVSU0lPTn0uCi1AaWZjbGVhciBHRU5FUklDCi1UaGlzIHZlcnNpb24gb2YgdGhlIGZpbGUgZGVzY3JpYmVzIEBjb2Rle0B2YWx1ZXtBU319IGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUKLWNvZGUgZm9yIEB2YWx1ZXtUQVJHRVR9IGFyY2hpdGVjdHVyZXMuCi1AZW5kIGlmY2xlYXIKLUBtZW51Ci0qIE92ZXJ2aWV3OjogICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3Ci0qIEludm9raW5nOjogICAgICAgICAgICAgICAgICAgIENvbW1hbmQtTGluZSBPcHRpb25zCi0qIFN5bnRheDo6ICAgICAgICAgICAgICAgICAgICAgIFN5bnRheAotKiBTZWN0aW9uczo6ICAgICAgICAgICAgICAgICAgICBTZWN0aW9ucyBhbmQgUmVsb2NhdGlvbgotKiBTeW1ib2xzOjogICAgICAgICAgICAgICAgICAgICBTeW1ib2xzCi0qIEV4cHJlc3Npb25zOjogICAgICAgICAgICAgICAgIEV4cHJlc3Npb25zCi0qIFBzZXVkbyBPcHM6OiAgICAgICAgICAgICAgICAgIEFzc2VtYmxlciBEaXJlY3RpdmVzCi0qIE1hY2hpbmUgRGVwZW5kZW5jaWVzOjogICAgICAgIE1hY2hpbmUgRGVwZW5kZW50IEZlYXR1cmVzCi0qIFJlcG9ydGluZyBCdWdzOjogICAgICAgICAgICAgIFJlcG9ydGluZyBCdWdzCi0qIEFja25vd2xlZGdlbWVudHM6OiAgICAgICAgICAgIFdobyBEaWQgV2hhdAotKiBJbmRleDo6ICAgICAgICAgICAgICAgICAgICAgICBJbmRleAotQGVuZCBtZW51Ci1AZW5kIGlmaW5mbwotCi1Abm9kZSBPdmVydmlldwotQGNoYXB0ZXIgT3ZlcnZpZXcKLUBpZnRleAotVGhpcyBtYW51YWwgaXMgYSB1c2VyIGd1aWRlIHRvIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIgQGNvZGV7QHZhbHVle0FTfX0uCi1AaWZjbGVhciBHRU5FUklDCi1UaGlzIHZlcnNpb24gb2YgdGhlIG1hbnVhbCBkZXNjcmliZXMgQGNvZGV7QHZhbHVle0FTfX0gY29uZmlndXJlZCB0byBnZW5lcmF0ZQotY29kZSBmb3IgQHZhbHVle1RBUkdFVH0gYXJjaGl0ZWN0dXJlcy4KLUBlbmQgaWZjbGVhcgotQGVuZCBpZnRleAotCi1AY2luZGV4IGludm9jYXRpb24gc3VtbWFyeQotQGNpbmRleCBvcHRpb24gc3VtbWFyeQotQGNpbmRleCBzdW1tYXJ5IG9mIG9wdGlvbnMKLUhlcmUgaXMgYSBicmllZiBzdW1tYXJ5IG9mIGhvdyB0byBpbnZva2UgQGNvZGV7QHZhbHVle0FTfX0uICBGb3IgZGV0YWlscywKLUBweHJlZntJbnZva2luZywsQ29tYW5kLUxpbmUgT3B0aW9uc30uCi0KLUBjIFdlIGRvbid0IHVzZSBkZWZmbiBhbmQgZnJpZW5kcyBmb3IgdGhlIGZvbGxvd2luZyBiZWNhdXNlIHRoZXkgc2VlbQotQGMgdG8gYmUgbGltaXRlZCB0byBvbmUgbGluZSBmb3IgdGhlIGhlYWRlci4KLUBzbWFsbGV4YW1wbGUKLUB2YWx1ZXtBU30gWyAtYVtjZGhsbnNdWz1maWxlXSBdIFsgLUQgXSAgWyAtLWRlZnN5bSBAdmFye3N5bX09QHZhcnt2YWx9IF0KLSBbIC1mIF0gWyAtLWdzdGFicyBdIFsgLS1nZHdhcmYyIF0gWyAtLWhlbHAgXSBbIC1JIEB2YXJ7ZGlyfSBdIFsgLUogXSBbIC1LIF0gWyAtTCBdCi0gWyAtLWtlZXAtbG9jYWxzIF0gWyAtbyBAdmFye29iamZpbGV9IF0gWyAtUiBdIFsgLS1zdGF0aXN0aWNzIF0gWyAtdiBdCi0gWyAtdmVyc2lvbiBdIFsgLS12ZXJzaW9uIF0gWyAtVyBdIFsgLS13YXJuIF0gWyAtLWZhdGFsLXdhcm5pbmdzIF0gCi0gWyAtdyBdIFsgLXggXSBbIC1aIF0KLUBpZnNldCBBMjlLCi1AYyBhbTI5ayBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyIG9wdGlvbnMKLUBlbmQgaWZzZXQKLUBpZnNldCBBUkMKLSBbIC1tYmlnLWVuZGlhbiB8IC1tbGl0dGxlLWVuZGlhbiBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQVJNCi0gWyAtbVthcm1dMSB8IC1tW2FybV0yIHwgLW1bYXJtXTI1MCB8IC1tW2FybV0zIHwgLW1bYXJtXTYgfCAtbVthcm1dNjAgfAotICAgLW1bYXJtXTYwMCB8IC1tW2FybV02MTAgfCAtbVthcm1dNjIwIHwgLW1bYXJtXTdbdF1bW2RdbVtpXV1bZmVdIHwgLW1bYXJtXTcwIHwKLSAgIC1tW2FybV03MDAgfCAtbVthcm1dNzEwW2NdIHwgLW1bYXJtXTcxMDAgfCAtbVthcm1dNzUwMCB8IC1tW2FybV04IHwKLSAgIC1tW2FybV04MTAgfCAtbVthcm1dOSB8IC1tW2FybV05MjAgfCAtbVthcm1dOTIwdCB8IC1tW2FybV05dGRtaSB8Ci0gICAtbXN0cm9uZ2FybSB8IC1tc3Ryb25nYXJtMTEwIHwgLW1zdHJvbmdhcm0xMTAwIF0KLSBbIC1tW2FybV12MiB8IC1tW2FybV12MmEgfCAtbVthcm1ddjMgfCAtbVthcm1ddjNtIHwgLW1bYXJtXXY0IHwgLW1bYXJtXXY0dCB8Ci0gICAtbVthcm1ddjUgfCAtW2FybV12NXQgXQotIFsgLW10aHVtYiB8IC1tYWxsIF0KLSBbIC1tZnBhMTAgfCAtbWZwYTExIHwgLW1mcGUtb2xkIHwgLW1uby1mcHUgXQotIFsgLUVCIHwgLUVMIF0KLSBbIC1tYXBjcy0zMiB8IC1tYXBjcy0yNiB8IC1tYXBjcy1mbG9hdCB8IC1tYXBjcy1yZWVudHJhbnQgXQotIFsgLW10aHVtYi1pbnRlcndvcmsgXQotIFsgLW1vYWJpIF0KLSBbIC1rIF0KLUBlbmQgaWZzZXQKLUBpZnNldCBEMTBWCi0gWyAtTyBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgRDMwVgotIFsgLU8gfCAtbiB8IC1OIF0KLUBlbmQgaWZzZXQKLUBpZnNldCBIOAotQGMgSGl0YWNoaSBmYW1pbHkgY2hpcHMgaGF2ZSBubyBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIgb3B0aW9ucwotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLUBjIEhQUEEgaGFzIG5vIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlciBvcHRpb25zICh5ZXQpLgotQGVuZCBpZnNldAotQGlmc2V0IFBKCi0gWyAtbWIgfCAtbWUgXQotQGVuZCBpZnNldAotQGlmc2V0IFNQQVJDCi1AYyBUaGUgb3JkZXIgaGVyZSBpcyBpbXBvcnRhbnQuICBTZWUgYy1zcGFyYy50ZXhpLgotIFsgLUF2NiB8IC1BdjcgfCAtQXY4IHwgLUFzcGFyY2xldCB8IC1Bc3BhcmNsaXRlCi0gICAtQXY4cGx1cyB8IC1BdjhwbHVzYSB8IC1BdjkgfCAtQXY5YSBdCi0gWyAteGFyY2g9djhwbHVzIHwgLXhhcmNoPXY4cGx1c2EgXSBbIC1idW1wIF0gWyAtMzIgfCAtNjQgXQotQGVuZCBpZnNldAotQGlmc2V0IFo4MDAwCi1AYyBaODAwMCBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyIG9wdGlvbnMKLUBlbmQgaWZzZXQKLUBpZnNldCBJOTYwCi1AYyBzZWUgbWRfcGFyc2Vfb3B0aW9uIGluIHRjLWk5NjAuYwotIFsgLUFDQSB8IC1BQ0FfQSB8IC1BQ0IgfCAtQUNDIHwgLUFLQSB8IC1BS0IgfCAtQUtDIHwgLUFNQyBdCi0gWyAtYiBdIFsgLW5vLXJlbGF4IF0KLUBlbmQgaWZzZXQKLUBpZnNldCBNNjgwWDAKLSBbIC1sIF0gWyAtbTY4MDAwIHwgLW02ODAxMCB8IC1tNjgwMjAgfCAuLi4gXQotQGVuZCBpZnNldAotQGlmc2V0IE1DT1JFCi0gWyAtanNyaTJic3IgXSBbIC1zaWZpbHRlciBdIFsgLXJlbGF4IF0KLUBlbmQgaWZzZXQKLUBpZnNldCBNSVBTCi0gWyAtbm9jcHAgXSBbIC1FTCBdIFsgLUVCIF0gWyAtRyBAdmFye251bX0gXSBbIC1tY3B1PUB2YXJ7Q1BVfSBdCi0gWyAtbWlwczEgXSBbIC1taXBzMiBdIFsgLW1pcHMzIF0gWyAtbTQ2NTAgXSBbIC1uby1tNDY1MCBdCi0gWyAtLXRyYXAgXSBbIC0tYnJlYWsgXQotIFsgLS1lbXVsYXRpb249QHZhcntuYW1lfSBdCi1AZW5kIGlmc2V0Ci0gWyAtLSB8IEB2YXJ7ZmlsZXN9IEBkb3Rze30gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYVtjZGhsbW5zXQotVHVybiBvbiBsaXN0aW5ncywgaW4gYW55IG9mIGEgdmFyaWV0eSBvZiB3YXlzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1hYwotb21pdCBmYWxzZSBjb25kaXRpb25hbHMKLQotQGl0ZW0gLWFkCi1vbWl0IGRlYnVnZ2luZyBkaXJlY3RpdmVzCi0KLUBpdGVtIC1haAotaW5jbHVkZSBoaWdoLWxldmVsIHNvdXJjZQotCi1AaXRlbSAtYWwKLWluY2x1ZGUgYXNzZW1ibHkKLQotQGl0ZW0gLWFtCi1pbmNsdWRlIG1hY3JvIGV4cGFuc2lvbnMKLQotQGl0ZW0gLWFuCi1vbWl0IGZvcm1zIHByb2Nlc3NpbmcKLQotQGl0ZW0gLWFzCi1pbmNsdWRlIHN5bWJvbHMKLQotQGl0ZW0gPWZpbGUKLXNldCB0aGUgbmFtZSBvZiB0aGUgbGlzdGluZyBmaWxlCi1AZW5kIHRhYmxlCi0KLVlvdSBtYXkgY29tYmluZSB0aGVzZSBvcHRpb25zOyBmb3IgZXhhbXBsZSwgdXNlIEBzYW1wey1hbG59IGZvciBhc3NlbWJseQotbGlzdGluZyB3aXRob3V0IGZvcm1zIHByb2Nlc3NpbmcuICBUaGUgQHNhbXB7PWZpbGV9IG9wdGlvbiwgaWYgdXNlZCwgbXVzdCBiZQotdGhlIGxhc3Qgb25lLiAgQnkgaXRzZWxmLCBAc2FtcHstYX0gZGVmYXVsdHMgdG8gQHNhbXB7LWFobHN9LgotCi1AaXRlbSAtRAotSWdub3JlZC4gIFRoaXMgb3B0aW9uIGlzIGFjY2VwdGVkIGZvciBzY3JpcHQgY29tcGF0aWJpbGl0eSB3aXRoIGNhbGxzIHRvCi1vdGhlciBhc3NlbWJsZXJzLgotCi1AaXRlbSAtLWRlZnN5bSBAdmFye3N5bX09QHZhcnt2YWx1ZX0KLURlZmluZSB0aGUgc3ltYm9sIEB2YXJ7c3ltfSB0byBiZSBAdmFye3ZhbHVlfSBiZWZvcmUgYXNzZW1ibGluZyB0aGUgaW5wdXQgZmlsZS4KLUB2YXJ7dmFsdWV9IG11c3QgYmUgYW4gaW50ZWdlciBjb25zdGFudC4gIEFzIGluIEMsIGEgbGVhZGluZyBAc2FtcHsweH0KLWluZGljYXRlcyBhIGhleGFkZWNpbWFsIHZhbHVlLCBhbmQgYSBsZWFkaW5nIEBzYW1wezB9IGluZGljYXRlcyBhbiBvY3RhbCB2YWx1ZS4KLQotQGl0ZW0gLWYKLWBgZmFzdCcnLS0tc2tpcCB3aGl0ZXNwYWNlIGFuZCBjb21tZW50IHByZXByb2Nlc3NpbmcgKGFzc3VtZSBzb3VyY2UgaXMKLWNvbXBpbGVyIG91dHB1dCkuCi0KLUBpdGVtIC0tZ3N0YWJzCi1HZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2ggYXNzZW1ibGVyIGxpbmUuICBUaGlzCi1tYXkgaGVscCBkZWJ1Z2dpbmcgYXNzZW1ibGVyIGNvZGUsIGlmIHRoZSBkZWJ1Z2dlciBjYW4gaGFuZGxlIGl0LgotCi1AaXRlbSAtLWdkd2FyZjIKLUdlbmVyYXRlIERXQVJGMiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2ggYXNzZW1ibGVyIGxpbmUuICBUaGlzCi1tYXkgaGVscCBkZWJ1Z2dpbmcgYXNzZW1ibGVyIGNvZGUsIGlmIHRoZSBkZWJ1Z2dlciBjYW4gaGFuZGxlIGl0LgotCi1AaXRlbSAtLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIGV4aXQuCi0KLUBpdGVtIC1JIEB2YXJ7ZGlyfQotQWRkIGRpcmVjdG9yeSBAdmFye2Rpcn0gdG8gdGhlIHNlYXJjaCBsaXN0IGZvciBAY29kZXsuaW5jbHVkZX0gZGlyZWN0aXZlcy4KLQotQGl0ZW0gLUoKLURvbid0IHdhcm4gYWJvdXQgc2lnbmVkIG92ZXJmbG93LgotCi1AaXRlbSAtSwotQGlmY2xlYXIgRElGRi1UQkwtS0xVR0UKLVRoaXMgb3B0aW9uIGlzIGFjY2VwdGVkIGJ1dCBoYXMgbm8gZWZmZWN0IG9uIHRoZSBAdmFsdWV7VEFSR0VUfSBmYW1pbHkuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBESUZGLVRCTC1LTFVHRQotSXNzdWUgd2FybmluZ3Mgd2hlbiBkaWZmZXJlbmNlIHRhYmxlcyBhbHRlcmVkIGZvciBsb25nIGRpc3BsYWNlbWVudHMuCi1AZW5kIGlmc2V0Ci0KLUBpdGVtIC1MCi1AaXRlbXggLS1rZWVwLWxvY2FscwotS2VlcCAoaW4gdGhlIHN5bWJvbCB0YWJsZSkgbG9jYWwgc3ltYm9scy4gIE9uIHRyYWRpdGlvbmFsIGEub3V0IHN5c3RlbXMKLXRoZXNlIHN0YXJ0IHdpdGggQHNhbXB7TH0sIGJ1dCBkaWZmZXJlbnQgc3lzdGVtcyBoYXZlIGRpZmZlcmVudCBsb2NhbAotbGFiZWwgcHJlZml4ZXMuCi0KLUBpdGVtIC1vIEB2YXJ7b2JqZmlsZX0KLU5hbWUgdGhlIG9iamVjdC1maWxlIG91dHB1dCBmcm9tIEBjb2Rle0B2YWx1ZXtBU319IEB2YXJ7b2JqZmlsZX0uCi0KLUBpdGVtIC1SCi1Gb2xkIHRoZSBkYXRhIHNlY3Rpb24gaW50byB0aGUgdGV4dCBzZWN0aW9uLgotCi1AaXRlbSAtLXN0YXRpc3RpY3MKLVByaW50IHRoZSBtYXhpbXVtIHNwYWNlIChpbiBieXRlcykgYW5kIHRvdGFsIHRpbWUgKGluIHNlY29uZHMpIHVzZWQgYnkKLWFzc2VtYmx5LgotCi1AaXRlbSAtLXN0cmlwLWxvY2FsLWFic29sdXRlCi1SZW1vdmUgbG9jYWwgYWJzb2x1dGUgc3ltYm9scyBmcm9tIHRoZSBvdXRnb2luZyBzeW1ib2wgdGFibGUuCi0KLUBpdGVtIC12Ci1AaXRlbXggLXZlcnNpb24KLVByaW50IHRoZSBAY29kZXthc30gdmVyc2lvbi4KLQotQGl0ZW0gLS12ZXJzaW9uCi1QcmludCB0aGUgQGNvZGV7YXN9IHZlcnNpb24gYW5kIGV4aXQuCi0KLUBpdGVtIC1XCi1AaXRlbXggLS1uby13YXJuCi1TdXBwcmVzcyB3YXJuaW5nIG1lc3NhZ2VzLgotCi1AaXRlbSAtLWZhdGFsLXdhcm5pbmdzCi1UcmVhdCB3YXJuaW5ncyBhcyBlcnJvcnMuCi0KLUBpdGVtIC0td2FybgotRG9uJ3Qgc3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlcyBvciB0cmVhdCB0aGVtIGFzIGVycm9ycy4KLQotQGl0ZW0gLXcKLUlnbm9yZWQuCi0KLUBpdGVtIC14Ci1JZ25vcmVkLgotCi1AaXRlbSAtWgotR2VuZXJhdGUgYW4gb2JqZWN0IGZpbGUgZXZlbiBhZnRlciBlcnJvcnMuCi0KLUBpdGVtIC0tIHwgQHZhcntmaWxlc30gQGRvdHN7fQotU3RhbmRhcmQgaW5wdXQsIG9yIHNvdXJjZSBmaWxlcyB0byBhc3NlbWJsZS4KLQotQGVuZCB0YWJsZQotCi1AaWZzZXQgQVJDCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IKLWFuIEFSQyBwcm9jZXNzb3IuCi0KLUB0YWJsZSBAY29kZQotCi1AY2luZGV4IEFSQyBlbmRpYW5uZXNzCi1AY2luZGV4IGVuZGlhbm5lc3MsIEFSQwotQGNpbmRleCBiaWcgZW5kaWFuIG91dHB1dCwgQVJDCi1AaXRlbSAtbWJpZy1lbmRpYW4KLUdlbmVyYXRlIGBgYmlnIGVuZGlhbicnIGZvcm1hdCBvdXRwdXQuCi0KLUBjaW5kZXggbGl0dGxlIGVuZGlhbiBvdXRwdXQsIEFSQwotQGl0ZW0gLW1saXR0bGUtZW5kaWFuCi1HZW5lcmF0ZSBgYGxpdHRsZSBlbmRpYW4nJyBmb3JtYXQgb3V0cHV0LgotCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBBUk0KLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvciB0aGUgQVJNCi1wcm9jZXNzb3IgZmFtaWx5LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1tW2FybV1bMXwyfDN8Nnw3fDh8OV1bLi4uXSAKLVNwZWNpZnkgd2hpY2ggQVJNIHByb2Nlc3NvciB2YXJpYW50IGlzIHRoZSB0YXJnZXQuCi1AaXRlbSAtbVthcm1ddlsyfDJhfDN8M218NHw0dHw1fDV0XQotU3BlY2lmeSB3aGljaCBBUk0gYXJjaGl0ZWN0dXJlIHZhcmlhbnQgaXMgdXNlZCBieSB0aGUgdGFyZ2V0LgotQGl0ZW0gLW10aHVtYiB8IC1tYWxsCi1FbmFibGUgb3IgZGlzYWJsZSBUaHVtYiBvbmx5IGluc3RydWN0aW9uIGRlY29kaW5nLgotQGl0ZW0gLW1mcGExMCB8IC1tZnBhMTEgfCAtbWZwZS1vbGQgfCAtbW5vLWZwdQotU2VsZWN0IHdoaWNoIEZsb2F0aW5nIFBvaW50IGFyY2hpdGN0dXJlIGlzIHRoZSB0YXJnZXQuCi1AaXRlbSAtbWFwY3MtMzIgfCAtbWFwY3MtMjYgfCAtbWFwY3MtZmxvYXQgfCAtbWFwY3MtcmVlbnRyYW50IHwgLW1vYWJpCi1TZWxlY3Qgd2hpY2ggcHJvY2VkdXJlIGNhbGxpbmcgY29udmVudGlvbiBpcyBpbiB1c2UuCi1AaXRlbSAtRUIgfCAtRUwKLVNlbGVjdCBlaXRoZXIgYmlnLWVuZGlhbiAoLUVCKSBvciBsaXR0bGUtZW5kaWFuICgtRUwpIG91dHB1dC4KLUBpdGVtIC1tdGh1bWItaW50ZXJ3b3JrCi1TcGVjaWZ5IHRoYXQgdGhlIGNvZGUgaGFzIGJlZW4gZ2VuZXJhdGVkIHdpdGggaW50ZXJ3b3JraW5nIGJldHdlZW4gVGh1bWIgYW5kCi1BUk0gY29kZSBpbiBtaW5kLgotQGl0ZW0gLWsKLVNwZWNpZnkgdGhhdCBQSUMgY29kZSBoYXMgYmVlbiBnZW5lcmF0ZWQuCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBEMTBWCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IKLWEgRDEwViBwcm9jZXNzb3IuCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggRDEwViBvcHRpbWl6YXRpb24KLUBjaW5kZXggb3B0aW1pemF0aW9uLCBEMTBWCi1AaXRlbSAtTwotT3B0aW1pemUgb3V0cHV0IGJ5IHBhcmFsbGVsaXppbmcgaW5zdHJ1Y3Rpb25zLgotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgRDMwVgotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yIGEgRDMwVgotcHJvY2Vzc29yLgotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEQzMFYgb3B0aW1pemF0aW9uCi1AY2luZGV4IG9wdGltaXphdGlvbiwgRDMwVgotQGl0ZW0gLU8KLU9wdGltaXplIG91dHB1dCBieSBwYXJhbGxlbGl6aW5nIGluc3RydWN0aW9ucy4KLQotQGNpbmRleCBEMzBWIG5vcHMKLUBpdGVtIC1uCi1XYXJuIHdoZW4gbm9wcyBhcmUgZ2VuZXJhdGVkLgotCi1AY2luZGV4IEQzMFYgbm9wcyBhZnRlciAzMi1iaXQgbXVsdGlwbHkKLUBpdGVtIC1OCi1XYXJuIHdoZW4gYSBub3AgYWZ0ZXIgYSAzMi1iaXQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb24gaXMgZ2VuZXJhdGVkLgotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgSTk2MAotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yIHRoZQotSW50ZWwgODA5NjAgcHJvY2Vzc29yLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1BQ0EgfCAtQUNBX0EgfCAtQUNCIHwgLUFDQyB8IC1BS0EgfCAtQUtCIHwgLUFLQyB8IC1BTUMKLVNwZWNpZnkgd2hpY2ggdmFyaWFudCBvZiB0aGUgOTYwIGFyY2hpdGVjdHVyZSBpcyB0aGUgdGFyZ2V0LgotCi1AaXRlbSAtYgotQWRkIGNvZGUgdG8gY29sbGVjdCBzdGF0aXN0aWNzIGFib3V0IGJyYW5jaGVzIHRha2VuLgotCi1AaXRlbSAtbm8tcmVsYXgKLURvIG5vdCBhbHRlciBjb21wYXJlLWFuZC1icmFuY2ggaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHM7Ci1lcnJvciBpZiBuZWNlc3NhcnkuCi0KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotCi1AaWZzZXQgTTY4MFgwCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IgdGhlCi1Nb3Rvcm9sYSA2ODAwMCBzZXJpZXMuCi0KLUB0YWJsZSBAY29kZQotCi1AaXRlbSAtbAotU2hvcnRlbiByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZCBzeW1ib2xzLCB0byBvbmUgd29yZCBpbnN0ZWFkIG9mIHR3by4KLQotQGl0ZW0gLW02ODAwMCB8IC1tNjgwMDggfCAtbTY4MDEwIHwgLW02ODAyMCB8IC1tNjgwMzAgfCAtbTY4MDQwIHwgLW02ODA2MAotQGl0ZW14IHwgLW02ODMwMiB8IC1tNjgzMzEgfCAtbTY4MzMyIHwgLW02ODMzMyB8IC1tNjgzNDAgfCAtbWNwdTMyIHwgLW01MjAwCi1TcGVjaWZ5IHdoYXQgcHJvY2Vzc29yIGluIHRoZSA2ODAwMCBmYW1pbHkgaXMgdGhlIHRhcmdldC4gIFRoZSBkZWZhdWx0Ci1pcyBub3JtYWxseSB0aGUgNjgwMjAsIGJ1dCB0aGlzIGNhbiBiZSBjaGFuZ2VkIGF0IGNvbmZpZ3VyYXRpb24gdGltZS4KLQotQGl0ZW0gLW02ODg4MSB8IC1tNjg4ODIgfCAtbW5vLTY4ODgxIHwgLW1uby02ODg4MgotVGhlIHRhcmdldCBtYWNoaW5lIGRvZXMgKG9yIGRvZXMgbm90KSBoYXZlIGEgZmxvYXRpbmctcG9pbnQgY29wcm9jZXNzb3IuCi1UaGUgZGVmYXVsdCBpcyB0byBhc3N1bWUgYSBjb3Byb2Nlc3NvciBmb3IgNjgwMjAsIDY4MDMwLCBhbmQgY3B1MzIuICBBbHRob3VnaAotdGhlIGJhc2ljIDY4MDAwIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIDY4ODgxLCBhIGNvbWJpbmF0aW9uIG9mIHRoZQotdHdvIGNhbiBiZSBzcGVjaWZpZWQsIHNpbmNlIGl0J3MgcG9zc2libGUgdG8gZG8gZW11bGF0aW9uIG9mIHRoZQotY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlIG1haW4gcHJvY2Vzc29yLgotCi1AaXRlbSAtbTY4ODUxIHwgLW1uby02ODg1MQotVGhlIHRhcmdldCBtYWNoaW5lIGRvZXMgKG9yIGRvZXMgbm90KSBoYXZlIGEgbWVtb3J5LW1hbmFnZW1lbnQKLXVuaXQgY29wcm9jZXNzb3IuICBUaGUgZGVmYXVsdCBpcyB0byBhc3N1bWUgYW4gTU1VIGZvciA2ODAyMCBhbmQgdXAuCi0KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFBKCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IKLWEgcGljb0phdmEgcHJvY2Vzc29yLgotCi1AdGFibGUgQGNvZGUKLQotQGNpbmRleCBQSiBlbmRpYW5uZXNzCi1AY2luZGV4IGVuZGlhbm5lc3MsIFBKCi1AY2luZGV4IGJpZyBlbmRpYW4gb3V0cHV0LCBQSgotQGl0ZW0gLW1iCi1HZW5lcmF0ZSBgYGJpZyBlbmRpYW4nJyBmb3JtYXQgb3V0cHV0LgotCi1AY2luZGV4IGxpdHRsZSBlbmRpYW4gb3V0cHV0LCBQSgotQGl0ZW0gLW1sCi1HZW5lcmF0ZSBgYGxpdHRsZSBlbmRpYW4nJyBmb3JtYXQgb3V0cHV0LgotCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLQotQGlmc2V0IFNQQVJDCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQKLWZvciB0aGUgU1BBUkMgYXJjaGl0ZWN0dXJlOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1BdjYgfCAtQXY3IHwgLUF2OCB8IC1Bc3BhcmNsZXQgfCAtQXNwYXJjbGl0ZQotQGl0ZW14IC1BdjhwbHVzIHwgLUF2OHBsdXNhIHwgLUF2OSB8IC1BdjlhCi1FeHBsaWNpdGx5IHNlbGVjdCBhIHZhcmlhbnQgb2YgdGhlIFNQQVJDIGFyY2hpdGVjdHVyZS4KLQotQHNhbXB7LUF2OHBsdXN9IGFuZCBAc2FtcHstQXY4cGx1c2F9IHNlbGVjdCBhIDMyIGJpdCBlbnZpcm9ubWVudC4KLUBzYW1wey1Bdjl9IGFuZCBAc2FtcHstQXY5YX0gc2VsZWN0IGEgNjQgYml0IGVudmlyb25tZW50LgotCi1Ac2FtcHstQXY4cGx1c2F9IGFuZCBAc2FtcHstQXY5YX0gZW5hYmxlIHRoZSBTUEFSQyBWOSBpbnN0cnVjdGlvbiBzZXQgd2l0aAotVWx0cmFTUEFSQyBleHRlbnNpb25zLgotCi1AaXRlbSAteGFyY2g9djhwbHVzIHwgLXhhcmNoPXY4cGx1c2EKLUZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFNvbGFyaXMgdjkgYXNzZW1ibGVyLiAgVGhlc2Ugb3B0aW9ucyBhcmUKLWVxdWl2YWxlbnQgdG8gLUF2OHBsdXMgYW5kIC1BdjhwbHVzYSwgcmVzcGVjdGl2ZWx5LgotCi1AaXRlbSAtYnVtcAotV2FybiB3aGVuIHRoZSBhc3NlbWJsZXIgc3dpdGNoZXMgdG8gYW5vdGhlciBhcmNoaXRlY3R1cmUuCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBNSVBTCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IKLWEgTUlQUyBwcm9jZXNzb3IuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUcgQHZhcntudW19Ci1UaGlzIG9wdGlvbiBzZXRzIHRoZSBsYXJnZXN0IHNpemUgb2YgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQKLWltcGxpY2l0bHkgd2l0aCB0aGUgQGNvZGV7Z3B9IHJlZ2lzdGVyLiAgSXQgaXMgb25seSBhY2NlcHRlZCBmb3IgdGFyZ2V0cyB0aGF0Ci11c2UgRUNPRkYgZm9ybWF0LCBzdWNoIGFzIGEgREVDc3RhdGlvbiBydW5uaW5nIFVsdHJpeC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDguCi0KLUBjaW5kZXggTUlQUyBlbmRpYW5uZXNzCi1AY2luZGV4IGVuZGlhbm5lc3MsIE1JUFMKLUBjaW5kZXggYmlnIGVuZGlhbiBvdXRwdXQsIE1JUFMKLUBpdGVtIC1FQgotR2VuZXJhdGUgYGBiaWcgZW5kaWFuJycgZm9ybWF0IG91dHB1dC4KLQotQGNpbmRleCBsaXR0bGUgZW5kaWFuIG91dHB1dCwgTUlQUwotQGl0ZW0gLUVMCi1HZW5lcmF0ZSBgYGxpdHRsZSBlbmRpYW4nJyBmb3JtYXQgb3V0cHV0LgotCi1AY2luZGV4IE1JUFMgSVNBCi1AaXRlbSAtbWlwczEKLUBpdGVteCAtbWlwczIKLUBpdGVteCAtbWlwczMKLUdlbmVyYXRlIGNvZGUgZm9yIGEgcGFydGljdWxhciBNSVBTIEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUgbGV2ZWwuCi1Ac2FtcHstbWlwczF9IGNvcnJlc3BvbmRzIHRvIHRoZSBAc2N7cjIwMDB9IGFuZCBAc2N7cjMwMDB9IHByb2Nlc3NvcnMsCi1Ac2FtcHstbWlwczJ9IHRvIHRoZSBAc2N7cjYwMDB9IHByb2Nlc3NvciwgYW5kIEBzYW1wey1taXBzM30gdG8gdGhlIEBzY3tyNDAwMH0KLXByb2Nlc3Nvci4KLQotQGl0ZW0gLW00NjUwCi1AaXRlbXggLW5vLW00NjUwCi1HZW5lcmF0ZSBjb2RlIGZvciB0aGUgTUlQUyBAc2N7cjQ2NTB9IGNoaXAuICBUaGlzIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0Ci10aGUgQHNhbXB7bWFkfSBhbmQgQHNhbXB7bWFkdX0gaW5zdHJ1Y3Rpb24sIGFuZCB0byBub3Qgc2NoZWR1bGUgQHNhbXB7bm9wfQotaW5zdHJ1Y3Rpb25zIGFyb3VuZCBhY2Nlc3NlcyB0byB0aGUgQHNhbXB7SEl9IGFuZCBAc2FtcHtMT30gcmVnaXN0ZXJzLgotQHNhbXB7LW5vLW00NjUwfSB0dXJucyBvZmYgdGhpcyBvcHRpb24uCi0KLUBpdGVtIC1tY3B1PUB2YXJ7Q1BVfQotR2VuZXJhdGUgY29kZSBmb3IgYSBwYXJ0aWN1bGFyIE1JUFMgY3B1LiAgVGhpcyBoYXMgbGl0dGxlIGVmZmVjdCBvbiB0aGUKLWFzc2VtYmxlciwgYnV0IGl0IGlzIHBhc3NlZCBieSBAY29kZXtAdmFsdWV7R0NDfX0uCi0KLUBjaW5kZXggZW11bGF0aW9uCi1AaXRlbSAtLWVtdWxhdGlvbj1AdmFye25hbWV9Ci1UaGlzIG9wdGlvbiBjYXVzZXMgQGNvZGV7QHZhbHVle0FTfX0gdG8gZW11bGF0ZSBAY29kZXtAdmFsdWV7QVN9fSBjb25maWd1cmVkCi1mb3Igc29tZSBvdGhlciB0YXJnZXQsIGluIGFsbCByZXNwZWN0cywgaW5jbHVkaW5nIG91dHB1dCBmb3JtYXQgKGNob29zaW5nCi1iZXR3ZWVuIEVMRiBhbmQgRUNPRkYgb25seSksIGhhbmRsaW5nIG9mIHBzZXVkby1vcGNvZGVzIHdoaWNoIG1heSBnZW5lcmF0ZQotZGVidWdnaW5nIGluZm9ybWF0aW9uIG9yIHN0b3JlIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiwgYW5kIGRlZmF1bHQKLWVuZGlhbm5lc3MuICBUaGUgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb24gbmFtZXMgYXJlOiBAc2FtcHttaXBzZWNvZmZ9LAotQHNhbXB7bWlwc2VsZn0sIEBzYW1we21pcHNsZWNvZmZ9LCBAc2FtcHttaXBzYmVjb2ZmfSwgQHNhbXB7bWlwc2xlbGZ9LAotQHNhbXB7bWlwc2JlbGZ9LiAgVGhlIGZpcnN0IHR3byBkbyBub3QgYWx0ZXIgdGhlIGRlZmF1bHQgZW5kaWFubmVzcyBmcm9tIHRoYXQKLW9mIHRoZSBwcmltYXJ5IHRhcmdldCBmb3Igd2hpY2ggdGhlIGFzc2VtYmxlciB3YXMgY29uZmlndXJlZDsgdGhlIG90aGVycyBjaGFuZ2UKLXRoZSBkZWZhdWx0IHRvIGxpdHRsZS0gb3IgYmlnLWVuZGlhbiBhcyBpbmRpY2F0ZWQgYnkgdGhlIEBzYW1we2J9IG9yIEBzYW1we2x9Ci1pbiB0aGUgbmFtZS4gIFVzaW5nIEBzYW1wey1FQn0gb3IgQHNhbXB7LUVMfSB3aWxsIG92ZXJyaWRlIHRoZSBlbmRpYW5uZXNzCi1zZWxlY3Rpb24gaW4gYW55IGNhc2UuCi0KLVRoaXMgb3B0aW9uIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSB3aGVuIHRoZSBwcmltYXJ5IHRhcmdldAotQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IgaXMgYSBNSVBTIEVMRiBvciBFQ09GRiB0YXJnZXQuCi1GdXJ0aGVybW9yZSwgdGhlIHByaW1hcnkgdGFyZ2V0IG9yIG90aGVycyBzcGVjaWZpZWQgd2l0aAotQHNhbXB7LS1lbmFibGUtdGFyZ2V0cz1AZG90c3t9fSBhdCBjb25maWd1cmF0aW9uIHRpbWUgbXVzdCBpbmNsdWRlIHN1cHBvcnQgZm9yCi10aGUgb3RoZXIgZm9ybWF0LCBpZiBib3RoIGFyZSB0byBiZSBhdmFpbGFibGUuICBGb3IgZXhhbXBsZSwgdGhlIElyaXggNQotY29uZmlndXJhdGlvbiBpbmNsdWRlcyBzdXBwb3J0IGZvciBib3RoLgotCi1FdmVudHVhbGx5LCB0aGlzIG9wdGlvbiB3aWxsIHN1cHBvcnQgbW9yZSBjb25maWd1cmF0aW9ucywgd2l0aCBtb3JlCi1maW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHRoZSBhc3NlbWJsZXIncyBiZWhhdmlvciwgYW5kIHdpbGwgYmUgc3VwcG9ydGVkIGZvcgotbW9yZSBwcm9jZXNzb3JzLgotCi1AaXRlbSAtbm9jcHAKLUBjb2Rle0B2YWx1ZXtBU319IGlnbm9yZXMgdGhpcyBvcHRpb24uICBJdCBpcyBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCi10aGUgbmF0aXZlIHRvb2xzLgotCi1AbmVlZCA5MDAKLUBpdGVtIC0tdHJhcAotQGl0ZW14IC0tbm8tdHJhcAotQGl0ZW14IC0tYnJlYWsKLUBpdGVteCAtLW5vLWJyZWFrCi1Db250cm9sIGhvdyB0byBkZWFsIHdpdGggbXVsdGlwbGljYXRpb24gb3ZlcmZsb3cgYW5kIGRpdmlzaW9uIGJ5IHplcm8uCi1Ac2FtcHstLXRyYXB9IG9yIEBzYW1wey0tbm8tYnJlYWt9ICh3aGljaCBhcmUgc3lub255bXMpIHRha2UgYSB0cmFwIGV4Y2VwdGlvbgotKGFuZCBvbmx5IHdvcmsgZm9yIEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUgbGV2ZWwgMiBhbmQgaGlnaGVyKTsKLUBzYW1wey0tYnJlYWt9IG9yIEBzYW1wey0tbm8tdHJhcH0gKGFsc28gc3lub255bXMsIGFuZCB0aGUgZGVmYXVsdCkgdGFrZSBhCi1icmVhayBleGNlcHRpb24uCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBNQ09SRQotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yCi1hbiBNQ29yZSBwcm9jZXNzb3IuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWpzcmkyYnNyCi1AaXRlbXggLW5vanNyaTJic3IKLUVuYWJsZSBvciBkaXNhYmxlIHRoZSBKU1JJIHRvIEJTUiB0cmFuc2Zvcm1hdGlvbi4gIEJ5IGRlZmF1bHQgdGhpcyBpcyBlbmFibGVkLgotVGhlIGNvbW1hbmQgbGluZSBvcHRpb24gQHNhbXB7LW5vanNyaTJic3J9IGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgaXQuCi0KLUBpdGVtIC1zaWZpbHRlcgotQGl0ZW14IC1ub3NpZmlsdGVyCi1FbmFibGUgb3IgZGlzYWJsZSB0aGUgc2lsaWNvbiBmaWx0ZXIgYmVoYXZpb3VyLiAgQnkgZGVmYXVsdCB0aGlzIGlzIGRpc2FibGVkLgotVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJpZGRlbiBieSB0aGUgQHNhbXB7LXNpZmlsdGVyfSBjb21tYW5kIGxpbmUgb3B0aW9uLgotCi1AaXRlbSAtcmVsYXgKLUFsdGVyIGp1bXAgaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHMuCi0KLQotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AbWVudQotKiBNYW51YWw6OiAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmUgb2YgdGhpcyBNYW51YWwKLSogR05VIEFzc2VtYmxlcjo6ICAgICAgICAgICAgICAgVGhlIEdOVSBBc3NlbWJsZXIKLSogT2JqZWN0IEZvcm1hdHM6OiAgICAgICAgICAgICAgT2JqZWN0IEZpbGUgRm9ybWF0cwotKiBDb21tYW5kIExpbmU6OiAgICAgICAgICAgICAgICBDb21tYW5kIExpbmUKLSogSW5wdXQgRmlsZXM6OiAgICAgICAgICAgICAgICAgSW5wdXQgRmlsZXMKLSogT2JqZWN0OjogICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IChPYmplY3QpIEZpbGUKLSogRXJyb3JzOjogICAgICAgICAgICAgICAgICAgICAgRXJyb3IgYW5kIFdhcm5pbmcgTWVzc2FnZXMKLUBlbmQgbWVudQotCi1Abm9kZSBNYW51YWwKLUBzZWN0aW9uIFN0cnVjdHVyZSBvZiB0aGlzIE1hbnVhbAotCi1AY2luZGV4IG1hbnVhbCwgc3RydWN0dXJlIGFuZCBwdXJwb3NlCi1UaGlzIG1hbnVhbCBpcyBpbnRlbmRlZCB0byBkZXNjcmliZSB3aGF0IHlvdSBuZWVkIHRvIGtub3cgdG8gdXNlCi1Ac2N7Z251fSBAY29kZXtAdmFsdWV7QVN9fS4gIFdlIGNvdmVyIHRoZSBzeW50YXggZXhwZWN0ZWQgaW4gc291cmNlIGZpbGVzLCBpbmNsdWRpbmcKLW5vdGF0aW9uIGZvciBzeW1ib2xzLCBjb25zdGFudHMsIGFuZCBleHByZXNzaW9uczsgdGhlIGRpcmVjdGl2ZXMgdGhhdAotQGNvZGV7QHZhbHVle0FTfX0gdW5kZXJzdGFuZHM7IGFuZCBvZiBjb3Vyc2UgaG93IHRvIGludm9rZSBAY29kZXtAdmFsdWV7QVN9fS4KLQotQGlmY2xlYXIgR0VORVJJQwotV2UgYWxzbyBjb3ZlciBzcGVjaWFsIGZlYXR1cmVzIGluIHRoZSBAdmFsdWV7VEFSR0VUfQotY29uZmlndXJhdGlvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSwgaW5jbHVkaW5nIGFzc2VtYmxlciBkaXJlY3RpdmVzLgotQGVuZCBpZmNsZWFyCi1AaWZzZXQgR0VORVJJQwotVGhpcyBtYW51YWwgYWxzbyBkZXNjcmliZXMgc29tZSBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgZmVhdHVyZXMgb2YKLXZhcmlvdXMgZmxhdm9ycyBvZiB0aGUgYXNzZW1ibGVyLgotQGVuZCBpZnNldAotCi1AY2luZGV4IG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIChub3QgY292ZXJlZCkKLU9uIHRoZSBvdGhlciBoYW5kLCB0aGlzIG1hbnVhbCBpcyBAZW1waHtub3R9IGludGVuZGVkIGFzIGFuIGludHJvZHVjdGlvbgotdG8gcHJvZ3JhbW1pbmcgaW4gYXNzZW1ibHkgbGFuZ3VhZ2UtLS1sZXQgYWxvbmUgcHJvZ3JhbW1pbmcgaW4gZ2VuZXJhbCEKLUluIGEgc2ltaWxhciB2ZWluLCB3ZSBtYWtlIG5vIGF0dGVtcHQgdG8gaW50cm9kdWNlIHRoZSBtYWNoaW5lCi1hcmNoaXRlY3R1cmU7IHdlIGRvIEBlbXBoe25vdH0gZGVzY3JpYmUgdGhlIGluc3RydWN0aW9uIHNldCwgc3RhbmRhcmQKLW1uZW1vbmljcywgcmVnaXN0ZXJzIG9yIGFkZHJlc3NpbmcgbW9kZXMgdGhhdCBhcmUgc3RhbmRhcmQgdG8gYQotcGFydGljdWxhciBhcmNoaXRlY3R1cmUuCi1AaWZzZXQgR0VORVJJQwotWW91IG1heSB3YW50IHRvIGNvbnN1bHQgdGhlIG1hbnVmYWN0dXJlcidzCi1tYWNoaW5lIGFyY2hpdGVjdHVyZSBtYW51YWwgZm9yIHRoaXMgaW5mb3JtYXRpb24uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSDgvMzAwCi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIEg4LzMwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlIEBjaXRle0g4LzMwMAotU2VyaWVzIFByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkgQURFLS02MDItLTAyNSkuICBGb3IgdGhlIEg4LzMwMEgsCi1zZWUgQGNpdGV7SDgvMzAwSCBTZXJpZXMgUHJvZ3JhbW1pbmcgTWFudWFsfSAoSGl0YWNoaSkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgvNTAwCi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIEg4LzUwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlIEBjaXRle0g4LzUwMAotU2VyaWVzIFByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkgTTIxVDAwMSkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgU0gKLUZvciBpbmZvcm1hdGlvbiBvbiB0aGUgSGl0YWNoaSBTSCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtTSC1NaWNyb2NvbXB1dGVyIFVzZXIncyBNYW51YWx9IChIaXRhY2hpIE1pY3JvIFN5c3RlbXMsIEluYy4pLgotQGVuZCBpZnNldAotQGlmc2V0IFo4MDAwCi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIFo4MDAwIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7WjgwMDAgQ1BVIFRlY2huaWNhbCBNYW51YWx9Ci1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQGMgSSB0aGluayB0aGlzIGlzIHByZW1hdHVyZS0tLWRvY0BjeWdudXMuY29tLCAxN2phbjE5OTEKLUBpZ25vcmUKLVRocm91Z2hvdXQgdGhpcyBtYW51YWwsIHdlIGFzc3VtZSB0aGF0IHlvdSBhcmUgcnVubmluZyBAZGZue0dOVX0sCi10aGUgcG9ydGFibGUgb3BlcmF0aW5nIHN5c3RlbSBmcm9tIHRoZSBAZGZue0ZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy59LiAgVGhpcyByZXN0cmljdHMgb3VyIGF0dGVudGlvbiB0byBjZXJ0YWluIGtpbmRzIG9mCi1jb21wdXRlciAoaW4gcGFydGljdWxhciwgdGhlIGtpbmRzIG9mIGNvbXB1dGVycyB0aGF0IEBzY3tnbnV9IGNhbiBydW4gb24pOwotb25jZSB0aGlzIGFzc3VtcHRpb24gaXMgZ3JhbnRlZCBleGFtcGxlcyBhbmQgZGVmaW5pdGlvbnMgbmVlZCBsZXNzCi1xdWFsaWZpY2F0aW9uLgotCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBwYXJ0IG9mIGEgdGVhbSBvZiBwcm9ncmFtcyB0aGF0IHR1cm4gYSBoaWdoLWxldmVsCi1odW1hbi1yZWFkYWJsZSBzZXJpZXMgb2YgaW5zdHJ1Y3Rpb25zIGludG8gYSBsb3ctbGV2ZWwKLWNvbXB1dGVyLXJlYWRhYmxlIHNlcmllcyBvZiBpbnN0cnVjdGlvbnMuICBEaWZmZXJlbnQgdmVyc2lvbnMgb2YKLUBjb2Rle0B2YWx1ZXtBU319IGFyZSB1c2VkIGZvciBkaWZmZXJlbnQga2luZHMgb2YgY29tcHV0ZXIuCi1AZW5kIGlnbm9yZQotCi1AYyBUaGVyZSB1c2VkIHRvIGJlIGEgc2VjdGlvbiAiVGVybWlub2xvZ3kiIGhlcmUsIHdoaWNoIGRlZmluZWQKLUBjICJjb250ZW50cyIsICJieXRlIiwgIndvcmQiLCBhbmQgImxvbmciLiAgRGVmaW5pbmcgIndvcmQiIHRvIGFueQotQGMgcGFydGljdWxhciBzaXplIGlzIGNvbmZ1c2luZyB3aGVuIHRoZSAud29yZCBkaXJlY3RpdmUgbWF5IGdlbmVyYXRlIDE2Ci1AYyBiaXRzIG9uIG9uZSBtYWNoaW5lIGFuZCAzMiBiaXRzIG9uIGFub3RoZXI7IGluIGdlbmVyYWwsIGZvciB0aGUgdXNlcgotQGMgdmVyc2lvbiBvZiB0aGlzIG1hbnVhbCwgbm9uZSBvZiB0aGVzZSB0ZXJtcyBzZWVtIGVzc2VudGlhbCB0byBkZWZpbmUuCi1AYyBUaGV5IHdlcmUgdXNlZCB2ZXJ5IGxpdHRsZSBldmVuIGluIHRoZSBmb3JtZXIgZHJhZnQgb2YgdGhlIG1hbnVhbDsKLUBjIHRoaXMgZHJhZnQgbWFrZXMgYW4gZWZmb3J0IHRvIGF2b2lkIHRoZW0gKGV4Y2VwdCBpbiBuYW1lcyBvZgotQGMgZGlyZWN0aXZlcykuCi0KLUBub2RlIEdOVSBBc3NlbWJsZXIKLUBzZWN0aW9uIFRoZSBHTlUgQXNzZW1ibGVyCi0KLUBzY3tnbnV9IEBjb2Rle2FzfSBpcyByZWFsbHkgYSBmYW1pbHkgb2YgYXNzZW1ibGVycy4KLUBpZmNsZWFyIEdFTkVSSUMKLVRoaXMgbWFudWFsIGRlc2NyaWJlcyBAY29kZXtAdmFsdWV7QVN9fSwgYSBtZW1iZXIgb2YgdGhhdCBmYW1pbHkgd2hpY2ggaXMKLWNvbmZpZ3VyZWQgZm9yIHRoZSBAdmFsdWV7VEFSR0VUfSBhcmNoaXRlY3R1cmVzLgotQGVuZCBpZmNsZWFyCi1JZiB5b3UgdXNlIChvciBoYXZlIHVzZWQpIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIgb24gb25lIGFyY2hpdGVjdHVyZSwgeW91Ci1zaG91bGQgZmluZCBhIGZhaXJseSBzaW1pbGFyIGVudmlyb25tZW50IHdoZW4geW91IHVzZSBpdCBvbiBhbm90aGVyCi1hcmNoaXRlY3R1cmUuICBFYWNoIHZlcnNpb24gaGFzIG11Y2ggaW4gY29tbW9uIHdpdGggdGhlIG90aGVycywKLWluY2x1ZGluZyBvYmplY3QgZmlsZSBmb3JtYXRzLCBtb3N0IGFzc2VtYmxlciBkaXJlY3RpdmVzIChvZnRlbiBjYWxsZWQKLUBkZm57cHNldWRvLW9wc30pIGFuZCBhc3NlbWJsZXIgc3ludGF4LkByZWZpbGwKLQotQGNpbmRleCBwdXJwb3NlIG9mIEBzY3tnbnV9IGFzc2VtYmxlcgotQGNvZGV7QHZhbHVle0FTfX0gaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGFzc2VtYmxlIHRoZSBvdXRwdXQgb2YgdGhlCi1Ac2N7Z251fSBDIGNvbXBpbGVyIEBjb2Rle0B2YWx1ZXtHQ0N9fSBmb3IgdXNlIGJ5IHRoZSBsaW5rZXIKLUBjb2Rle0B2YWx1ZXtMRH19LiAgTmV2ZXJ0aGVsZXNzLCB3ZSd2ZSB0cmllZCB0byBtYWtlIEBjb2Rle0B2YWx1ZXtBU319Ci1hc3NlbWJsZSBjb3JyZWN0bHkgZXZlcnl0aGluZyB0aGF0IG90aGVyIGFzc2VtYmxlcnMgZm9yIHRoZSBzYW1lCi1tYWNoaW5lIHdvdWxkIGFzc2VtYmxlLgotQGlmc2V0IFZBWAotQW55IGV4Y2VwdGlvbnMgYXJlIGRvY3VtZW50ZWQgZXhwbGljaXRseSAoQHB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfSkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgTTY4MFgwCi1AYyBUaGlzIHJlbWFyayBzaG91bGQgYXBwZWFyIGluIGdlbmVyaWMgdmVyc2lvbiBvZiBtYW51YWw7IGFzc3VtcHRpb24KLUBjIGhlcmUgaXMgdGhhdCBnZW5lcmljIHZlcnNpb24gc2V0cyBNNjgweDAuCi1UaGlzIGRvZXNuJ3QgbWVhbiBAY29kZXtAdmFsdWV7QVN9fSBhbHdheXMgdXNlcyB0aGUgc2FtZSBzeW50YXggYXMgYW5vdGhlcgotYXNzZW1ibGVyIGZvciB0aGUgc2FtZSBhcmNoaXRlY3R1cmU7IGZvciBleGFtcGxlLCB3ZSBrbm93IG9mIHNldmVyYWwKLWluY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiA2ODB4MCBhc3NlbWJseSBsYW5ndWFnZSBzeW50YXguCi1AZW5kIGlmc2V0Ci0KLVVubGlrZSBvbGRlciBhc3NlbWJsZXJzLCBAY29kZXtAdmFsdWV7QVN9fSBpcyBkZXNpZ25lZCB0byBhc3NlbWJsZSBhIHNvdXJjZQotcHJvZ3JhbSBpbiBvbmUgcGFzcyBvZiB0aGUgc291cmNlIGZpbGUuICBUaGlzIGhhcyBhIHN1YnRsZSBpbXBhY3Qgb24gdGhlCi1Aa2Jkey5vcmd9IGRpcmVjdGl2ZSAoQHB4cmVme09yZywsQGNvZGV7Lm9yZ319KS4KLQotQG5vZGUgT2JqZWN0IEZvcm1hdHMKLUBzZWN0aW9uIE9iamVjdCBGaWxlIEZvcm1hdHMKLQotQGNpbmRleCBvYmplY3QgZmlsZSBmb3JtYXQKLVRoZSBAc2N7Z251fSBhc3NlbWJsZXIgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBzZXZlcmFsIGFsdGVybmF0aXZlCi1vYmplY3QgZmlsZSBmb3JtYXRzLiAgRm9yIHRoZSBtb3N0IHBhcnQsIHRoaXMgZG9lcyBub3QgYWZmZWN0IGhvdyB5b3UKLXdyaXRlIGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW1zOyBidXQgZGlyZWN0aXZlcyBmb3IgZGVidWdnaW5nIHN5bWJvbHMKLWFyZSB0eXBpY2FsbHkgZGlmZmVyZW50IGluIGRpZmZlcmVudCBmaWxlIGZvcm1hdHMuICBAeHJlZntTeW1ib2wKLUF0dHJpYnV0ZXMsLFN5bWJvbCBBdHRyaWJ1dGVzfS4KLUBpZmNsZWFyIEdFTkVSSUMKLUBpZmNsZWFyIE1VTFRJLU9CSgotT24gdGhlIEB2YWx1ZXtUQVJHRVR9LCBAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIHRvIHByb2R1Y2UKLUB2YWx1ZXtPQkotTkFNRX0gZm9ybWF0IG9iamVjdCBmaWxlcy4KLUBlbmQgaWZjbGVhcgotQGMgVGhlIGZvbGxvd2luZyBzaG91bGQgZXhoYXVzdCBhbGwgY29uZmlncyB0aGF0IHNldCBNVUxUSS1PQkosIGlkZWFsbHkKLUBpZnNldCBBMjlLCi1PbiB0aGUgQHZhbHVle1RBUkdFVH0sIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBiZSBjb25maWd1cmVkIHRvIHByb2R1Y2UgZWl0aGVyCi1AY29kZXthLm91dH0gb3IgQ09GRiBmb3JtYXQgb2JqZWN0IGZpbGVzLgotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSwgQGNvZGV7QHZhbHVle0FTfX0gY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBlaXRoZXIKLUBjb2Rle2Iub3V0fSBvciBDT0ZGIGZvcm1hdCBvYmplY3QgZmlsZXMuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSFBQQQotT24gdGhlIEB2YWx1ZXtUQVJHRVR9LCBAY29kZXtAdmFsdWV7QVN9fSBjYW4gYmUgY29uZmlndXJlZCB0byBwcm9kdWNlIGVpdGhlcgotU09NIG9yIEVMRiBmb3JtYXQgb2JqZWN0IGZpbGVzLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIENvbW1hbmQgTGluZQotQHNlY3Rpb24gQ29tbWFuZCBMaW5lCi0KLUBjaW5kZXggY29tbWFuZCBsaW5lIGNvbnZlbnRpb25zCi1BZnRlciB0aGUgcHJvZ3JhbSBuYW1lIEBjb2Rle0B2YWx1ZXtBU319LCB0aGUgY29tbWFuZCBsaW5lIG1heSBjb250YWluCi1vcHRpb25zIGFuZCBmaWxlIG5hbWVzLiAgT3B0aW9ucyBtYXkgYXBwZWFyIGluIGFueSBvcmRlciwgYW5kIG1heSBiZQotYmVmb3JlLCBhZnRlciwgb3IgYmV0d2VlbiBmaWxlIG5hbWVzLiAgVGhlIG9yZGVyIG9mIGZpbGUgbmFtZXMgaXMKLXNpZ25pZmljYW50LgotCi1AY2luZGV4IHN0YW5kYXJkIGlucHV0LCBhcyBpbnB1dCBmaWxlCi1Aa2luZGV4IC0tCi1AZmlsZXstLX0gKHR3byBoeXBoZW5zKSBieSBpdHNlbGYgbmFtZXMgdGhlIHN0YW5kYXJkIGlucHV0IGZpbGUKLWV4cGxpY2l0bHksIGFzIG9uZSBvZiB0aGUgZmlsZXMgZm9yIEBjb2Rle0B2YWx1ZXtBU319IHRvIGFzc2VtYmxlLgotCi1AY2luZGV4IG9wdGlvbnMsIGNvbW1hbmQgbGluZQotRXhjZXB0IGZvciBAc2FtcHstLX0gYW55IGNvbW1hbmQgbGluZSBhcmd1bWVudCB0aGF0IGJlZ2lucyB3aXRoIGEKLWh5cGhlbiAoQHNhbXB7LX0pIGlzIGFuIG9wdGlvbi4gIEVhY2ggb3B0aW9uIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mCi1AY29kZXtAdmFsdWV7QVN9fS4gIE5vIG9wdGlvbiBjaGFuZ2VzIHRoZSB3YXkgYW5vdGhlciBvcHRpb24gd29ya3MuICBBbgotb3B0aW9uIGlzIGEgQHNhbXB7LX0gZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgbGV0dGVyczsgdGhlIGNhc2Ugb2YKLXRoZSBsZXR0ZXIgaXMgaW1wb3J0YW50LiAgIEFsbCBvcHRpb25zIGFyZSBvcHRpb25hbC4KLQotU29tZSBvcHRpb25zIGV4cGVjdCBleGFjdGx5IG9uZSBmaWxlIG5hbWUgdG8gZm9sbG93IHRoZW0uICBUaGUgZmlsZQotbmFtZSBtYXkgZWl0aGVyIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgb3B0aW9uJ3MgbGV0dGVyIChjb21wYXRpYmxlCi13aXRoIG9sZGVyIGFzc2VtYmxlcnMpIG9yIGl0IG1heSBiZSB0aGUgbmV4dCBjb21tYW5kIGFyZ3VtZW50IChAc2N7Z251fQotc3RhbmRhcmQpLiAgVGhlc2UgdHdvIGNvbW1hbmQgbGluZXMgYXJlIGVxdWl2YWxlbnQ6Ci0KLUBzbWFsbGV4YW1wbGUKLUB2YWx1ZXtBU30gLW8gbXktb2JqZWN0LWZpbGUubyBtdW1ibGUucwotQHZhbHVle0FTfSAtb215LW9iamVjdC1maWxlLm8gbXVtYmxlLnMKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIElucHV0IEZpbGVzCi1Ac2VjdGlvbiBJbnB1dCBGaWxlcwotCi1AY2luZGV4IGlucHV0Ci1AY2luZGV4IHNvdXJjZSBwcm9ncmFtCi1AY2luZGV4IGZpbGVzLCBpbnB1dAotV2UgdXNlIHRoZSBwaHJhc2UgQGRmbntzb3VyY2UgcHJvZ3JhbX0sIGFiYnJldmlhdGVkIEBkZm57c291cmNlfSwgdG8KLWRlc2NyaWJlIHRoZSBwcm9ncmFtIGlucHV0IHRvIG9uZSBydW4gb2YgQGNvZGV7QHZhbHVle0FTfX0uICBUaGUgcHJvZ3JhbSBtYXkKLWJlIGluIG9uZSBvciBtb3JlIGZpbGVzOyBob3cgdGhlIHNvdXJjZSBpcyBwYXJ0aXRpb25lZCBpbnRvIGZpbGVzCi1kb2Vzbid0IGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgc291cmNlLgotCi1AYyBJIGFkZGVkICJjb24iIHByZWZpeCB0byAiY2F0ZW5hdGlvbiIganVzdCB0byBwcm92ZSBJIGNhbiBvdmVyY29tZSBteQotQGMgQVBMIHRyYWluaW5nLi4uICAgZG9jQGN5Z251cy5jb20KLVRoZSBzb3VyY2UgcHJvZ3JhbSBpcyBhIGNvbmNhdGVuYXRpb24gb2YgdGhlIHRleHQgaW4gYWxsIHRoZSBmaWxlcywgaW4gdGhlCi1vcmRlciBzcGVjaWZpZWQuCi0KLUVhY2ggdGltZSB5b3UgcnVuIEBjb2Rle0B2YWx1ZXtBU319IGl0IGFzc2VtYmxlcyBleGFjdGx5IG9uZSBzb3VyY2UKLXByb2dyYW0uICBUaGUgc291cmNlIHByb2dyYW0gaXMgbWFkZSB1cCBvZiBvbmUgb3IgbW9yZSBmaWxlcy4KLShUaGUgc3RhbmRhcmQgaW5wdXQgaXMgYWxzbyBhIGZpbGUuKQotCi1Zb3UgZ2l2ZSBAY29kZXtAdmFsdWV7QVN9fSBhIGNvbW1hbmQgbGluZSB0aGF0IGhhcyB6ZXJvIG9yIG1vcmUgaW5wdXQgZmlsZQotbmFtZXMuICBUaGUgaW5wdXQgZmlsZXMgYXJlIHJlYWQgKGZyb20gbGVmdCBmaWxlIG5hbWUgdG8gcmlnaHQpLiAgQQotY29tbWFuZCBsaW5lIGFyZ3VtZW50IChpbiBhbnkgcG9zaXRpb24pIHRoYXQgaGFzIG5vIHNwZWNpYWwgbWVhbmluZwotaXMgdGFrZW4gdG8gYmUgYW4gaW5wdXQgZmlsZSBuYW1lLgotCi1JZiB5b3UgZ2l2ZSBAY29kZXtAdmFsdWV7QVN9fSBubyBmaWxlIG5hbWVzIGl0IGF0dGVtcHRzIHRvIHJlYWQgb25lIGlucHV0IGZpbGUKLWZyb20gdGhlIEBjb2Rle0B2YWx1ZXtBU319IHN0YW5kYXJkIGlucHV0LCB3aGljaCBpcyBub3JtYWxseSB5b3VyIHRlcm1pbmFsLiAgWW91Ci1tYXkgaGF2ZSB0byB0eXBlIEBrZXl7Y3RsLUR9IHRvIHRlbGwgQGNvZGV7QHZhbHVle0FTfX0gdGhlcmUgaXMgbm8gbW9yZSBwcm9ncmFtCi10byBhc3NlbWJsZS4KLQotVXNlIEBzYW1wey0tfSBpZiB5b3UgbmVlZCB0byBleHBsaWNpdGx5IG5hbWUgdGhlIHN0YW5kYXJkIGlucHV0IGZpbGUKLWluIHlvdXIgY29tbWFuZCBsaW5lLgotCi1JZiB0aGUgc291cmNlIGlzIGVtcHR5LCBAY29kZXtAdmFsdWV7QVN9fSBwcm9kdWNlcyBhIHNtYWxsLCBlbXB0eSBvYmplY3QKLWZpbGUuCi0KLUBzdWJoZWFkaW5nIEZpbGVuYW1lcyBhbmQgTGluZS1udW1iZXJzCi0KLUBjaW5kZXggaW5wdXQgZmlsZSBsaW5lbnVtYmVycwotQGNpbmRleCBsaW5lIG51bWJlcnMsIGluIGlucHV0IGZpbGVzCi1UaGVyZSBhcmUgdHdvIHdheXMgb2YgbG9jYXRpbmcgYSBsaW5lIGluIHRoZSBpbnB1dCBmaWxlIChvciBmaWxlcykgYW5kCi1laXRoZXIgbWF5IGJlIHVzZWQgaW4gcmVwb3J0aW5nIGVycm9yIG1lc3NhZ2VzLiAgT25lIHdheSByZWZlcnMgdG8gYSBsaW5lCi1udW1iZXIgaW4gYSBwaHlzaWNhbCBmaWxlOyB0aGUgb3RoZXIgcmVmZXJzIHRvIGEgbGluZSBudW1iZXIgaW4gYQotYGBsb2dpY2FsJycgZmlsZS4gIEB4cmVme0Vycm9ycywgLEVycm9yIGFuZCBXYXJuaW5nIE1lc3NhZ2VzfS4KLQotQGRmbntQaHlzaWNhbCBmaWxlc30gYXJlIHRob3NlIGZpbGVzIG5hbWVkIGluIHRoZSBjb21tYW5kIGxpbmUgZ2l2ZW4KLXRvIEBjb2Rle0B2YWx1ZXtBU319LgotCi1AZGZue0xvZ2ljYWwgZmlsZXN9IGFyZSBzaW1wbHkgbmFtZXMgZGVjbGFyZWQgZXhwbGljaXRseSBieSBhc3NlbWJsZXIKLWRpcmVjdGl2ZXM7IHRoZXkgYmVhciBubyByZWxhdGlvbiB0byBwaHlzaWNhbCBmaWxlcy4gIExvZ2ljYWwgZmlsZSBuYW1lcyBoZWxwCi1lcnJvciBtZXNzYWdlcyByZWZsZWN0IHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBzb3VyY2UKLWlzIGl0c2VsZiBzeW50aGVzaXplZCBmcm9tIG90aGVyIGZpbGVzLiAgQGNvZGV7QHZhbHVle0FTfX0gdW5kZXJzdGFuZHMgdGhlCi1Ac2FtcHsjfSBkaXJlY3RpdmVzIGVtaXR0ZWQgYnkgdGhlIEBjb2Rle0B2YWx1ZXtHQ0N9fSBwcmVwcm9jZXNzb3IuICBTZWUgYWxzbwotQHJlZntGaWxlLCxAY29kZXsuZmlsZX19LgotCi1Abm9kZSBPYmplY3QKLUBzZWN0aW9uIE91dHB1dCAoT2JqZWN0KSBGaWxlCi0KLUBjaW5kZXggb2JqZWN0IGZpbGUKLUBjaW5kZXggb3V0cHV0IGZpbGUKLUBraW5kZXggYS5vdXQKLUBraW5kZXggLm8KLUV2ZXJ5IHRpbWUgeW91IHJ1biBAY29kZXtAdmFsdWV7QVN9fSBpdCBwcm9kdWNlcyBhbiBvdXRwdXQgZmlsZSwgd2hpY2ggaXMKLXlvdXIgYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbSB0cmFuc2xhdGVkIGludG8gbnVtYmVycy4gIFRoaXMgZmlsZQotaXMgdGhlIG9iamVjdCBmaWxlLiAgSXRzIGRlZmF1bHQgbmFtZSBpcwotQGlmY2xlYXIgQk9VVAotQGNvZGV7YS5vdXR9LgotQGVuZCBpZmNsZWFyCi1AaWZzZXQgQk9VVAotQGlmc2V0IEdFTkVSSUMKLUBjb2Rle2Eub3V0fSwgb3IgCi1AZW5kIGlmc2V0Ci1AY29kZXtiLm91dH0gd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIGZvciB0aGUgSW50ZWwgODA5NjAuCi1AZW5kIGlmc2V0Ci1Zb3UgY2FuIGdpdmUgaXQgYW5vdGhlciBuYW1lIGJ5IHVzaW5nIHRoZSBAY29kZXstb30gb3B0aW9uLiAgQ29udmVudGlvbmFsbHksCi1vYmplY3QgZmlsZSBuYW1lcyBlbmQgd2l0aCBAZmlsZXsub30uICBUaGUgZGVmYXVsdCBuYW1lIGlzIHVzZWQgZm9yIGhpc3RvcmljYWwKLXJlYXNvbnM6IG9sZGVyIGFzc2VtYmxlcnMgd2VyZSBjYXBhYmxlIG9mIGFzc2VtYmxpbmcgc2VsZi1jb250YWluZWQgcHJvZ3JhbXMKLWRpcmVjdGx5IGludG8gYSBydW5uYWJsZSBwcm9ncmFtLiAgKEZvciBzb21lIGZvcm1hdHMsIHRoaXMgaXNuJ3QgY3VycmVudGx5Ci1wb3NzaWJsZSwgYnV0IGl0IGNhbiBiZSBkb25lIGZvciB0aGUgQGNvZGV7YS5vdXR9IGZvcm1hdC4pCi0KLUBjaW5kZXggbGlua2VyCi1Aa2luZGV4IGxkCi1UaGUgb2JqZWN0IGZpbGUgaXMgbWVhbnQgZm9yIGlucHV0IHRvIHRoZSBsaW5rZXIgQGNvZGV7QHZhbHVle0xEfX0uICBJdCBjb250YWlucwotYXNzZW1ibGVkIHByb2dyYW0gY29kZSwgaW5mb3JtYXRpb24gdG8gaGVscCBAY29kZXtAdmFsdWV7TER9fSBpbnRlZ3JhdGUKLXRoZSBhc3NlbWJsZWQgcHJvZ3JhbSBpbnRvIGEgcnVubmFibGUgZmlsZSwgYW5kIChvcHRpb25hbGx5KSBzeW1ib2xpYwotaW5mb3JtYXRpb24gZm9yIHRoZSBkZWJ1Z2dlci4KLQotQGMgbGluayBhYm92ZSB0byBzb21lIGluZm8gZmlsZShzKSBsaWtlIHRoZSBkZXNjcmlwdGlvbiBvZiBhLm91dC4KLUBjIGRvbid0IGZvcmdldCB0byBkZXNjcmliZSBAc2N7Z251fSBpbmZvIGFzIHdlbGwgYXMgVW5peCBsb3NzYWdlLgotCi1Abm9kZSBFcnJvcnMKLUBzZWN0aW9uIEVycm9yIGFuZCBXYXJuaW5nIE1lc3NhZ2VzCi0KLUBjaW5kZXggZXJyb3IgbWVzc3NhZ2VzCi1AY2luZGV4IHdhcm5pbmcgbWVzc2FnZXMKLUBjaW5kZXggbWVzc2FnZXMgZnJvbSBhc3NlbWJsZXIKLUBjb2Rle0B2YWx1ZXtBU319IG1heSB3cml0ZSB3YXJuaW5ncyBhbmQgZXJyb3IgbWVzc2FnZXMgdG8gdGhlIHN0YW5kYXJkIGVycm9yCi1maWxlICh1c3VhbGx5IHlvdXIgdGVybWluYWwpLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbiB3aGVuICBhIGNvbXBpbGVyCi1ydW5zIEBjb2Rle0B2YWx1ZXtBU319IGF1dG9tYXRpY2FsbHkuICBXYXJuaW5ncyByZXBvcnQgYW4gYXNzdW1wdGlvbiBtYWRlIHNvCi10aGF0IEBjb2Rle0B2YWx1ZXtBU319IGNvdWxkIGtlZXAgYXNzZW1ibGluZyBhIGZsYXdlZCBwcm9ncmFtOyBlcnJvcnMgcmVwb3J0IGEKLWdyYXZlIHByb2JsZW0gdGhhdCBzdG9wcyB0aGUgYXNzZW1ibHkuCi0KLUBjaW5kZXggZm9ybWF0IG9mIHdhcm5pbmcgbWVzc2FnZXMKLVdhcm5pbmcgbWVzc2FnZXMgaGF2ZSB0aGUgZm9ybWF0Ci0KLUBzbWFsbGV4YW1wbGUKLWZpbGVfbmFtZTpAYntOTk59Oldhcm5pbmcgTWVzc2FnZSBUZXh0Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLUBjaW5kZXggbGluZSBudW1iZXJzLCBpbiB3YXJuaW5ncy9lcnJvcnMKLSh3aGVyZSBAYntOTk59IGlzIGEgbGluZSBudW1iZXIpLiAgSWYgYSBsb2dpY2FsIGZpbGUgbmFtZSBoYXMgYmVlbiBnaXZlbgotKEBweHJlZntGaWxlLCxAY29kZXsuZmlsZX19KSBpdCBpcyB1c2VkIGZvciB0aGUgZmlsZW5hbWUsIG90aGVyd2lzZSB0aGUgbmFtZSBvZgotdGhlIGN1cnJlbnQgaW5wdXQgZmlsZSBpcyB1c2VkLiAgSWYgYSBsb2dpY2FsIGxpbmUgbnVtYmVyIHdhcyBnaXZlbgotQGlmc2V0IEdFTkVSSUMKLShAcHhyZWZ7TGluZSwsQGNvZGV7LmxpbmV9fSkKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZmNsZWFyIEEyOUsKLShAcHhyZWZ7TGluZSwsQGNvZGV7LmxpbmV9fSkKLUBlbmQgaWZjbGVhcgotQGlmc2V0IEEyOUsKLShAcHhyZWZ7TG4sLEBjb2Rley5sbn19KQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi10aGVuIGl0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBudW1iZXIgcHJpbnRlZCwKLW90aGVyd2lzZSB0aGUgYWN0dWFsIGxpbmUgaW4gdGhlIGN1cnJlbnQgc291cmNlIGZpbGUgaXMgcHJpbnRlZC4gIFRoZQotbWVzc2FnZSB0ZXh0IGlzIGludGVuZGVkIHRvIGJlIHNlbGYgZXhwbGFuYXRvcnkgKGluIHRoZSBncmFuZCBVbml4Ci10cmFkaXRpb24pLgotCi1AY2luZGV4IGZvcm1hdCBvZiBlcnJvciBtZXNzYWdlcwotRXJyb3IgbWVzc2FnZXMgaGF2ZSB0aGUgZm9ybWF0Ci1Ac21hbGxleGFtcGxlCi1maWxlX25hbWU6QGJ7Tk5OfTpGQVRBTDpFcnJvciBNZXNzYWdlIFRleHQKLUBlbmQgc21hbGxleGFtcGxlCi1UaGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBhcmUgZGVyaXZlZCBhcyBmb3Igd2FybmluZwotbWVzc2FnZXMuICBUaGUgYWN0dWFsIG1lc3NhZ2UgdGV4dCBtYXkgYmUgcmF0aGVyIGxlc3MgZXhwbGFuYXRvcnkKLWJlY2F1c2UgbWFueSBvZiB0aGVtIGFyZW4ndCBzdXBwb3NlZCB0byBoYXBwZW4uCi0KLUBub2RlIEludm9raW5nCi1AY2hhcHRlciBDb21tYW5kLUxpbmUgT3B0aW9ucwotCi1AY2luZGV4IG9wdGlvbnMsIGFsbCB2ZXJzaW9ucyBvZiBhc3NlbWJsZXIKLVRoaXMgY2hhcHRlciBkZXNjcmliZXMgY29tbWFuZC1saW5lIG9wdGlvbnMgYXZhaWxhYmxlIGluIEBlbXBoe2FsbH0KLXZlcnNpb25zIG9mIHRoZSBAc2N7Z251fSBhc3NlbWJsZXI7IEBweHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30sIGZvciBvcHRpb25zIHNwZWNpZmljCi1AaWZjbGVhciBHRU5FUklDCi10byB0aGUgQHZhbHVle1RBUkdFVH0uCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBHRU5FUklDCi10byBwYXJ0aWN1bGFyIG1hY2hpbmUgYXJjaGl0ZWN0dXJlcy4KLUBlbmQgaWZzZXQKLQotSWYgeW91IGFyZSBpbnZva2luZyBAY29kZXtAdmFsdWV7QVN9fSB2aWEgdGhlIEBzY3tnbnV9IEMgY29tcGlsZXIgKHZlcnNpb24gMiksCi15b3UgY2FuIHVzZSB0aGUgQHNhbXB7LVdhfSBvcHRpb24gdG8gcGFzcyBhcmd1bWVudHMgdGhyb3VnaCB0byB0aGUgYXNzZW1ibGVyLgotVGhlIGFzc2VtYmxlciBhcmd1bWVudHMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyIChhbmQgdGhlIEBzYW1wey1XYX0pCi1ieSBjb21tYXMuICBGb3IgZXhhbXBsZToKLQotQHNtYWxsZXhhbXBsZQotZ2NjIC1jIC1nIC1PIC1XYSwtYWxoLC1MIGZpbGUuYwotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGlzIHBhc3NlcyB0d28gb3B0aW9ucyB0byB0aGUgYXNzZW1ibGVyOiBAc2FtcHstYWxofSAoZW1pdCBhIGxpc3RpbmcgdG8KLXN0YW5kYXJkIG91dHB1dCB3aXRoIHdpdGggaGlnaC1sZXZlbCBhbmQgYXNzZW1ibHkgc291cmNlKSBhbmQgQHNhbXB7LUx9IChyZXRhaW4KLWxvY2FsIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZSkuCi0KLVVzdWFsbHkgeW91IGRvIG5vdCBuZWVkIHRvIHVzZSB0aGlzIEBzYW1wey1XYX0gbWVjaGFuaXNtLCBzaW5jZSBtYW55IGNvbXBpbGVyCi1jb21tYW5kLWxpbmUgb3B0aW9ucyBhcmUgYXV0b21hdGljYWxseSBwYXNzZWQgdG8gdGhlIGFzc2VtYmxlciBieSB0aGUgY29tcGlsZXIuCi0oWW91IGNhbiBjYWxsIHRoZSBAc2N7Z251fSBjb21waWxlciBkcml2ZXIgd2l0aCB0aGUgQHNhbXB7LXZ9IG9wdGlvbiB0byBzZWUKLXByZWNpc2VseSB3aGF0IG9wdGlvbnMgaXQgcGFzc2VzIHRvIGVhY2ggY29tcGlsYXRpb24gcGFzcywgaW5jbHVkaW5nIHRoZQotYXNzZW1ibGVyLikKLQotQG1lbnUKLSogYTo6ICAgICAgICAgICAgIC1hW2NkaGxuc10gZW5hYmxlIGxpc3RpbmdzCi0qIEQ6OiAgICAgICAgICAgICAtRCBmb3IgY29tcGF0aWJpbGl0eQotKiBmOjogICAgICAgICAgICAgLWYgdG8gd29yayBmYXN0ZXIKLSogSTo6ICAgICAgICAgICAgIC1JIGZvciAuaW5jbHVkZSBzZWFyY2ggcGF0aAotQGlmY2xlYXIgRElGRi1UQkwtS0xVR0UKLSogSzo6ICAgICAgICAgICAgIC1LIGZvciBjb21wYXRpYmlsaXR5Ci1AZW5kIGlmY2xlYXIKLUBpZnNldCBESUZGLVRCTC1LTFVHRQotKiBLOjogICAgICAgICAgICAgLUsgZm9yIGRpZmZlcmVuY2UgdGFibGVzCi1AZW5kIGlmc2V0Ci0KLSogTDo6ICAgICAgICAgICAgIC1MIHRvIHJldGFpbiBsb2NhbCBsYWJlbHMKLSogTTo6CQkgIC1NIG9yIC0tbXJpIHRvIGFzc2VtYmxlIGluIE1SSSBjb21wYXRpYmlsaXR5IG1vZGUKLSogTUQ6OiAgICAgICAgICAgIC0tTUQgZm9yIGRlcGVuZGVuY3kgdHJhY2tpbmcKLSogbzo6ICAgICAgICAgICAgIC1vIHRvIG5hbWUgdGhlIG9iamVjdCBmaWxlCi0qIFI6OiAgICAgICAgICAgICAtUiB0byBqb2luIGRhdGEgYW5kIHRleHQgc2VjdGlvbnMKLSogc3RhdGlzdGljczo6ICAgIC0tc3RhdGlzdGljcyB0byBzZWUgc3RhdGlzdGljcyBhYm91dCBhc3NlbWJseQotKiB0cmFkaXRpb25hbC1mb3JtYXQ6OiAtLXRyYWRpdGlvbmFsLWZvcm1hdCBmb3IgY29tcGF0aWJsZSBvdXRwdXQKLSogdjo6ICAgICAgICAgICAgIC12IHRvIGFubm91bmNlIHZlcnNpb24KLSogVzo6ICAgICAgICAgICAgIC1XLCAtLW5vLXdhcm4sIC0td2FybiwgLS1mYXRhbC13YXJuaW5ncyB0byBjb250cm9sIHdhcm5pbmdzCi0qIFo6OiAgICAgICAgICAgICAtWiB0byBtYWtlIG9iamVjdCBmaWxlIGV2ZW4gYWZ0ZXIgZXJyb3JzCi1AZW5kIG1lbnUKLQotQG5vZGUgYQotQHNlY3Rpb24gRW5hYmxlIExpc3RpbmdzOiBAY29kZXstYVtjZGhsbnNdfQotCi1Aa2luZGV4IC1hCi1Aa2luZGV4IC1hYwotQGtpbmRleCAtYWQKLUBraW5kZXggLWFoCi1Aa2luZGV4IC1hbAotQGtpbmRleCAtYW4KLUBraW5kZXggLWFzCi1AY2luZGV4IGxpc3RpbmdzLCBlbmFibGluZwotQGNpbmRleCBhc3NlbWJseSBsaXN0aW5ncywgZW5hYmxpbmcKLQotVGhlc2Ugb3B0aW9ucyBlbmFibGUgbGlzdGluZyBvdXRwdXQgZnJvbSB0aGUgYXNzZW1ibGVyLiAgQnkgaXRzZWxmLAotQHNhbXB7LWF9IHJlcXVlc3RzIGhpZ2gtbGV2ZWwsIGFzc2VtYmx5LCBhbmQgc3ltYm9scyBsaXN0aW5nLgotWW91IGNhbiB1c2Ugb3RoZXIgbGV0dGVycyB0byBzZWxlY3Qgc3BlY2lmaWMgb3B0aW9ucyBmb3IgdGhlIGxpc3Q6Ci1Ac2FtcHstYWh9IHJlcXVlc3RzIGEgaGlnaC1sZXZlbCBsYW5ndWFnZSBsaXN0aW5nLAotQHNhbXB7LWFsfSByZXF1ZXN0cyBhbiBvdXRwdXQtcHJvZ3JhbSBhc3NlbWJseSBsaXN0aW5nLCBhbmQKLUBzYW1wey1hc30gcmVxdWVzdHMgYSBzeW1ib2wgdGFibGUgbGlzdGluZy4KLUhpZ2gtbGV2ZWwgbGlzdGluZ3MgcmVxdWlyZSB0aGF0IGEgY29tcGlsZXIgZGVidWdnaW5nIG9wdGlvbiBsaWtlCi1Ac2FtcHstZ30gYmUgdXNlZCwgYW5kIHRoYXQgYXNzZW1ibHkgbGlzdGluZ3MgKEBzYW1wey1hbH0pIGJlIHJlcXVlc3RlZAotYWxzby4KLQotVXNlIHRoZSBAc2FtcHstYWN9IG9wdGlvbiB0byBvbWl0IGZhbHNlIGNvbmRpdGlvbmFscyBmcm9tIGEgbGlzdGluZy4gIEFueSBsaW5lcwotd2hpY2ggYXJlIG5vdCBhc3NlbWJsZWQgYmVjYXVzZSBvZiBhIGZhbHNlIEBjb2Rley5pZn0gKG9yIEBjb2Rley5pZmRlZn0sIG9yIGFueQotb3RoZXIgY29uZGl0aW9uYWwpLCBvciBhIHRydWUgQGNvZGV7LmlmfSBmb2xsb3dlZCBieSBhbiBAY29kZXsuZWxzZX0sIHdpbGwgYmUKLW9taXR0ZWQgZnJvbSB0aGUgbGlzdGluZy4KLQotVXNlIHRoZSBAc2FtcHstYWR9IG9wdGlvbiB0byBvbWl0IGRlYnVnZ2luZyBkaXJlY3RpdmVzIGZyb20gdGhlCi1saXN0aW5nLgotCi1PbmNlIHlvdSBoYXZlIHNwZWNpZmllZCBvbmUgb2YgdGhlc2Ugb3B0aW9ucywgeW91IGNhbiBmdXJ0aGVyIGNvbnRyb2wKLWxpc3Rpbmcgb3V0cHV0IGFuZCBpdHMgYXBwZWFyYW5jZSB1c2luZyB0aGUgZGlyZWN0aXZlcyBAY29kZXsubGlzdH0sCi1AY29kZXsubm9saXN0fSwgQGNvZGV7LnBzaXplfSwgQGNvZGV7LmVqZWN0fSwgQGNvZGV7LnRpdGxlfSwgYW5kCi1AY29kZXsuc2J0dGx9LgotVGhlIEBzYW1wey1hbn0gb3B0aW9uIHR1cm5zIG9mZiBhbGwgZm9ybXMgcHJvY2Vzc2luZy4KLUlmIHlvdSBkbyBub3QgcmVxdWVzdCBsaXN0aW5nIG91dHB1dCB3aXRoIG9uZSBvZiB0aGUgQHNhbXB7LWF9IG9wdGlvbnMsIHRoZQotbGlzdGluZy1jb250cm9sIGRpcmVjdGl2ZXMgaGF2ZSBubyBlZmZlY3QuCi0KLVRoZSBsZXR0ZXJzIGFmdGVyIEBzYW1wey1hfSBtYXkgYmUgY29tYmluZWQgaW50byBvbmUgb3B0aW9uLAotQGVtcGh7ZS5nLn0sIEBzYW1wey1hbG59LgotCi1Abm9kZSBECi1Ac2VjdGlvbiBAY29kZXstRH0KLQotQGtpbmRleCAtRAotVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCB3aGF0c29ldmVyLCBidXQgaXQgaXMgYWNjZXB0ZWQgdG8gbWFrZSBpdCBtb3JlCi1saWtlbHkgdGhhdCBzY3JpcHRzIHdyaXR0ZW4gZm9yIG90aGVyIGFzc2VtYmxlcnMgYWxzbyB3b3JrIHdpdGgKLUBjb2Rle0B2YWx1ZXtBU319LgotCi1Abm9kZSBmCi1Ac2VjdGlvbiBXb3JrIEZhc3RlcjogQGNvZGV7LWZ9Ci0KLUBraW5kZXggLWYKLUBjaW5kZXggdHJ1c3RlZCBjb21waWxlcgotQGNpbmRleCBmYXN0ZXIgcHJvY2Vzc2luZyAoQGNvZGV7LWZ9KQotQHNhbXB7LWZ9IHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBhc3NlbWJsaW5nIHByb2dyYW1zIHdyaXR0ZW4gYnkgYQotKHRydXN0ZWQpIGNvbXBpbGVyLiAgQHNhbXB7LWZ9IHN0b3BzIHRoZSBhc3NlbWJsZXIgZnJvbSBkb2luZyB3aGl0ZXNwYWNlCi1hbmQgY29tbWVudCBwcmVwcm9jZXNzaW5nIG9uCi10aGUgaW5wdXQgZmlsZShzKSBiZWZvcmUgYXNzZW1ibGluZyB0aGVtLiAgQHhyZWZ7UHJlcHJvY2Vzc2luZywKLSxQcmVwcm9jZXNzaW5nfS4KLQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IGlmIHlvdSB1c2UgQHNhbXB7LWZ9IHdoZW4gdGhlIGZpbGVzIGFjdHVhbGx5IG5lZWQgdG8gYmUKLXByZXByb2Nlc3NlZCAoaWYgdGhleSBjb250YWluIGNvbW1lbnRzLCBmb3IgZXhhbXBsZSksIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMKLW5vdCB3b3JrIGNvcnJlY3RseS4KLUBlbmQgcXVvdGF0aW9uCi0KLUBub2RlIEkKLUBzZWN0aW9uIEBjb2Rley5pbmNsdWRlfSBzZWFyY2ggcGF0aDogQGNvZGV7LUl9IEB2YXJ7cGF0aH0KLQotQGtpbmRleCAtSSBAdmFye3BhdGh9Ci1AY2luZGV4IHBhdGhzIGZvciBAY29kZXsuaW5jbHVkZX0KLUBjaW5kZXggc2VhcmNoIHBhdGggZm9yIEBjb2Rley5pbmNsdWRlfQotQGNpbmRleCBAY29kZXtpbmNsdWRlfSBkaXJlY3RpdmUgc2VhcmNoIHBhdGgKLVVzZSB0aGlzIG9wdGlvbiB0byBhZGQgYSBAdmFye3BhdGh9IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzCi1AY29kZXtAdmFsdWV7QVN9fSBzZWFyY2hlcyBmb3IgZmlsZXMgc3BlY2lmaWVkIGluIEBjb2Rley5pbmNsdWRlfQotZGlyZWN0aXZlcyAoQHB4cmVme0luY2x1ZGUsLEBjb2Rley5pbmNsdWRlfX0pLiAgWW91IG1heSB1c2UgQGNvZGV7LUl9IGFzCi1tYW55IHRpbWVzIGFzIG5lY2Vzc2FyeSB0byBpbmNsdWRlIGEgdmFyaWV0eSBvZiBwYXRocy4gIFRoZSBjdXJyZW50Ci13b3JraW5nIGRpcmVjdG9yeSBpcyBhbHdheXMgc2VhcmNoZWQgZmlyc3Q7IGFmdGVyIHRoYXQsIEBjb2Rle0B2YWx1ZXtBU319Ci1zZWFyY2hlcyBhbnkgQHNhbXB7LUl9IGRpcmVjdG9yaWVzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgd2VyZQotc3BlY2lmaWVkIChsZWZ0IHRvIHJpZ2h0KSBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi1Abm9kZSBLCi1Ac2VjdGlvbiBEaWZmZXJlbmNlIFRhYmxlczogQGNvZGV7LUt9Ci0KLUBraW5kZXggLUsKLUBpZmNsZWFyIERJRkYtVEJMLUtMVUdFCi1PbiB0aGUgQHZhbHVle1RBUkdFVH0gZmFtaWx5LCB0aGlzIG9wdGlvbiBpcyBhbGxvd2VkLCBidXQgaGFzIG5vIGVmZmVjdC4gIEl0IGlzCi1wZXJtaXR0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQHNje2dudX0gYXNzZW1ibGVyIG9uIG90aGVyIHBsYXRmb3JtcywKLXdoZXJlIGl0IGNhbiBiZSB1c2VkIHRvIHdhcm4gd2hlbiB0aGUgYXNzZW1ibGVyIGFsdGVycyB0aGUgbWFjaGluZSBjb2RlCi1nZW5lcmF0ZWQgZm9yIEBzYW1wey53b3JkfSBkaXJlY3RpdmVzIGluIGRpZmZlcmVuY2UgdGFibGVzLiAgVGhlIEB2YWx1ZXtUQVJHRVR9Ci1mYW1pbHkgZG9lcyBub3QgaGF2ZSB0aGUgYWRkcmVzc2luZyBsaW1pdGF0aW9ucyB0aGF0IHNvbWV0aW1lcyBsZWFkIHRvIHRoaXMKLWFsdGVyYXRpb24gb24gb3RoZXIgcGxhdGZvcm1zLgotQGVuZCBpZmNsZWFyCi0KLUBpZnNldCBESUZGLVRCTC1LTFVHRQotQGNpbmRleCBkaWZmZXJlbmNlIHRhYmxlcywgd2FybmluZwotQGNpbmRleCB3YXJuaW5nIGZvciBhbHRlcmVkIGRpZmZlcmVuY2UgdGFibGVzCi1AY29kZXtAdmFsdWV7QVN9fSBzb21ldGltZXMgYWx0ZXJzIHRoZSBjb2RlIGVtaXR0ZWQgZm9yIGRpcmVjdGl2ZXMgb2YgdGhlIGZvcm0KLUBzYW1wey53b3JkIEB2YXJ7c3ltMX0tQHZhcntzeW0yfX07IEBweHJlZntXb3JkLCxAY29kZXsud29yZH19LgotWW91IGNhbiB1c2UgdGhlIEBzYW1wey1LfSBvcHRpb24gaWYgeW91IHdhbnQgYSB3YXJuaW5nIGlzc3VlZCB3aGVuIHRoaXMKLWlzIGRvbmUuCi1AZW5kIGlmc2V0Ci0KLUBub2RlIEwKLUBzZWN0aW9uIEluY2x1ZGUgTG9jYWwgTGFiZWxzOiBAY29kZXstTH0KLQotQGtpbmRleCAtTAotQGNpbmRleCBsb2NhbCBsYWJlbHMsIHJldGFpbmluZyBpbiBvdXRwdXQKLUxhYmVscyBiZWdpbm5pbmcgd2l0aCBAc2FtcHtMfSAodXBwZXIgY2FzZSBvbmx5KSBhcmUgY2FsbGVkIEBkZm57bG9jYWwKLWxhYmVsc30uIEB4cmVme1N5bWJvbCBOYW1lc30uICBOb3JtYWxseSB5b3UgZG8gbm90IHNlZSBzdWNoIGxhYmVscyB3aGVuCi1kZWJ1Z2dpbmcsIGJlY2F1c2UgdGhleSBhcmUgaW50ZW5kZWQgZm9yIHRoZSB1c2Ugb2YgcHJvZ3JhbXMgKGxpa2UKLWNvbXBpbGVycykgdGhhdCBjb21wb3NlIGFzc2VtYmxlciBwcm9ncmFtcywgbm90IGZvciB5b3VyIG5vdGljZS4KLU5vcm1hbGx5IGJvdGggQGNvZGV7QHZhbHVle0FTfX0gYW5kIEBjb2Rle0B2YWx1ZXtMRH19IGRpc2NhcmQgc3VjaCBsYWJlbHMsIHNvIHlvdSBkbyBub3QKLW5vcm1hbGx5IGRlYnVnIHdpdGggdGhlbS4KLQotVGhpcyBvcHRpb24gdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gcmV0YWluIHRob3NlIEBzYW1we0xAZG90c3t9fSBzeW1ib2xzCi1pbiB0aGUgb2JqZWN0IGZpbGUuICBVc3VhbGx5IGlmIHlvdSBkbyB0aGlzIHlvdSBhbHNvIHRlbGwgdGhlIGxpbmtlcgotQGNvZGV7QHZhbHVle0xEfX0gdG8gcHJlc2VydmUgc3ltYm9scyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIEBzYW1we0x9LgotCi1CeSBkZWZhdWx0LCBhIGxvY2FsIGxhYmVsIGlzIGFueSBsYWJlbCBiZWdpbm5pbmcgd2l0aCBAc2FtcHtMfSwgYnV0IGVhY2gKLXRhcmdldCBpcyBhbGxvd2VkIHRvIHJlZGVmaW5lIHRoZSBsb2NhbCBsYWJlbCBwcmVmaXguCi1AaWZzZXQgSFBQQQotT24gdGhlIEhQUEEgbG9jYWwgbGFiZWxzIGJlZ2luIHdpdGggQHNhbXB7TCR9LgotQGVuZCBpZnNldAotQGlmc2V0IEFSTQotQHNhbXB7O30gZm9yIHRoZSBBUk0gZmFtaWx5OwotQGVuZCBpZnNldAotCi1Abm9kZSBNCi1Ac2VjdGlvbiBBc3NlbWJsZSBpbiBNUkkgQ29tcGF0aWJpbGl0eSBNb2RlOiBAY29kZXstTX0KLQotQGtpbmRleCAtTQotQGNpbmRleCBNUkkgY29tcGF0aWJpbGl0eSBtb2RlCi1UaGUgQGNvZGV7LU19IG9yIEBjb2Rley0tbXJpfSBvcHRpb24gc2VsZWN0cyBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLiAgVGhpcwotY2hhbmdlcyB0aGUgc3ludGF4IGFuZCBwc2V1ZG8tb3AgaGFuZGxpbmcgb2YgQGNvZGV7QHZhbHVle0FTfX0gdG8gbWFrZSBpdAotY29tcGF0aWJsZSB3aXRoIHRoZSBAY29kZXtBU002OEt9IG9yIHRoZSBAY29kZXtBU005NjB9IChkZXBlbmRpbmcgdXBvbiB0aGUKLWNvbmZpZ3VyZWQgdGFyZ2V0KSBhc3NlbWJsZXIgZnJvbSBNaWNyb3RlYyBSZXNlYXJjaC4gIFRoZSBleGFjdCBuYXR1cmUgb2YgdGhlCi1NUkkgc3ludGF4IHdpbGwgbm90IGJlIGRvY3VtZW50ZWQgaGVyZTsgc2VlIHRoZSBNUkkgbWFudWFscyBmb3IgbW9yZQotaW5mb3JtYXRpb24uICBOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCB0aGUgaGFuZGxpbmcgb2YgbWFjcm9zIGFuZCBtYWNybwotYXJndW1lbnRzIGlzIHNvbWV3aGF0IGRpZmZlcmVudC4gIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3B0aW9uIGlzIHRvIHBlcm1pdAotYXNzZW1ibGluZyBleGlzdGluZyBNUkkgYXNzZW1ibGVyIGNvZGUgdXNpbmcgQGNvZGV7QHZhbHVle0FTfX0uCi0KLVRoZSBNUkkgY29tcGF0aWJpbGl0eSBpcyBub3QgY29tcGxldGUuICBDZXJ0YWluIG9wZXJhdGlvbnMgb2YgdGhlIE1SSSBhc3NlbWJsZXIKLWRlcGVuZCB1cG9uIGl0cyBvYmplY3QgZmlsZSBmb3JtYXQsIGFuZCBjYW4gbm90IGJlIHN1cHBvcnRlZCB1c2luZyBvdGhlciBvYmplY3QKLWZpbGUgZm9ybWF0cy4gIFN1cHBvcnRpbmcgdGhlc2Ugd291bGQgcmVxdWlyZSBlbmhhbmNpbmcgZWFjaCBvYmplY3QgZmlsZSBmb3JtYXQKLWluZGl2aWR1YWxseS4gIFRoZXNlIGFyZToKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0gZ2xvYmFsIHN5bWJvbHMgaW4gY29tbW9uIHNlY3Rpb24KLQotVGhlIG02OGsgTVJJIGFzc2VtYmxlciBzdXBwb3J0cyBjb21tb24gc2VjdGlvbnMgd2hpY2ggYXJlIG1lcmdlZCBieSB0aGUgbGlua2VyLgotT3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cyBkbyBub3Qgc3VwcG9ydCB0aGlzLiAgQGNvZGV7QHZhbHVle0FTfX0gaGFuZGxlcwotY29tbW9uIHNlY3Rpb25zIGJ5IHRyZWF0aW5nIHRoZW0gYXMgYSBzaW5nbGUgY29tbW9uIHN5bWJvbC4gIEl0IHBlcm1pdHMgbG9jYWwKLXN5bWJvbHMgdG8gYmUgZGVmaW5lZCB3aXRoaW4gYSBjb21tb24gc2VjdGlvbiwgYnV0IGl0IGNhbiBub3Qgc3VwcG9ydCBnbG9iYWwKLXN5bWJvbHMsIHNpbmNlIGl0IGhhcyBubyB3YXkgdG8gZGVzY3JpYmUgdGhlbS4KLQotQGl0ZW0gY29tcGxleCByZWxvY2F0aW9ucwotCi1UaGUgTVJJIGFzc2VtYmxlcnMgc3VwcG9ydCByZWxvY2F0aW9ucyBhZ2FpbnN0IGEgbmVnYXRlZCBzZWN0aW9uIGFkZHJlc3MsIGFuZAotcmVsb2NhdGlvbnMgd2hpY2ggY29tYmluZSB0aGUgc3RhcnQgYWRkcmVzc2VzIG9mIHR3byBvciBtb3JlIHNlY3Rpb25zLiAgVGhlc2UKLWFyZSBub3Qgc3VwcG9ydCBieSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1AaXRlbSBAY29kZXtFTkR9IHBzZXVkby1vcCBzcGVjaWZ5aW5nIHN0YXJ0IGFkZHJlc3MKLQotVGhlIE1SSSBAY29kZXtFTkR9IHBzZXVkby1vcCBwZXJtaXRzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgc3RhcnQgYWRkcmVzcy4KLVRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLiAgVGhlIHN0YXJ0IGFkZHJlc3MgbWF5Ci1pbnN0ZWFkIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgQGNvZGV7LWV9IG9wdGlvbiB0byB0aGUgbGlua2VyLCBvciBpbiBhIGxpbmtlcgotc2NyaXB0LgotCi1AaXRlbSBAY29kZXtJRE5UfSwgQGNvZGV7LmlkZW50fSBhbmQgQGNvZGV7TkFNRX0gcHNldWRvLW9wcwotCi1UaGUgTVJJIEBjb2Rle0lETlR9LCBAY29kZXsuaWRlbnR9IGFuZCBAY29kZXtOQU1FfSBwc2V1ZG8tb3BzIGFzc2lnbiBhIG1vZHVsZQotbmFtZSB0byB0aGUgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotQGl0ZW0gQGNvZGV7T1JHfSBwc2V1ZG8tb3AKLQotVGhlIG02OGsgTVJJIEBjb2Rle09SR30gcHNldWRvLW9wIGJlZ2lucyBhbiBhYnNvbHV0ZSBzZWN0aW9uIGF0IGEgZ2l2ZW4KLWFkZHJlc3MuICBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdXN1YWwgQGNvZGV7QHZhbHVle0FTfX0gQGNvZGV7Lm9yZ30gcHNldWRvLW9wLAotd2hpY2ggY2hhbmdlcyB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBjdXJyZW50IHNlY3Rpb24uICBBYnNvbHV0ZSBzZWN0aW9ucyBhcmUKLW5vdCBzdXBwb3J0ZWQgYnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4gIFRoZSBhZGRyZXNzIG9mIGEgc2VjdGlvbiBtYXkgYmUKLWFzc2lnbmVkIHdpdGhpbiBhIGxpbmtlciBzY3JpcHQuCi1AZW5kIGl0ZW1pemUKLQotVGhlcmUgYXJlIHNvbWUgb3RoZXIgZmVhdHVyZXMgb2YgdGhlIE1SSSBhc3NlbWJsZXIgd2hpY2ggYXJlIG5vdCBzdXBwb3J0ZWQgYnkKLUBjb2Rle0B2YWx1ZXtBU319LCB0eXBpY2FsbHkgZWl0aGVyIGJlY2F1c2UgdGhleSBhcmUgZGlmZmljdWx0IG9yIGJlY2F1c2UgdGhleQotc2VlbSBvZiBsaXR0bGUgY29uc2VxdWVuY2UuICBTb21lIG9mIHRoZXNlIG1heSBiZSBzdXBwb3J0ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci0KLUBpdGVtIEVCQ0RJQyBzdHJpbmdzCi0KLUVCQ0RJQyBzdHJpbmdzIGFyZSBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBwYWNrZWQgYmluYXJ5IGNvZGVkIGRlY2ltYWwKLQotUGFja2VkIGJpbmFyeSBjb2RlZCBkZWNpbWFsIGlzIG5vdCBzdXBwb3J0ZWQuICBUaGlzIG1lYW5zIHRoYXQgdGhlIEBjb2Rle0RDLlB9Ci1hbmQgQGNvZGV7RENCLlB9IHBzZXVkby1vcHMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rle0ZFUVV9IHBzZXVkby1vcAotCi1UaGUgbTY4ayBAY29kZXtGRVFVfSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7Tk9PQkp9IHBzZXVkby1vcAotCi1UaGUgbTY4ayBAY29kZXtOT09CSn0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rle09QVH0gYnJhbmNoIGNvbnRyb2wgb3B0aW9ucwotCi1UaGUgbTY4ayBAY29kZXtPUFR9IGJyYW5jaCBjb250cm9sIG9wdGlvbnMtLS1AY29kZXtCfSwgQGNvZGV7QlJTfSwgQGNvZGV7QlJCfSwKLUBjb2Rle0JSTH0sIGFuZCBAY29kZXtCUld9LS0tYXJlIGlnbm9yZWQuICBAY29kZXtAdmFsdWV7QVN9fSBhdXRvbWF0aWNhbGx5Ci1yZWxheGVzIGFsbCBicmFuY2hlcywgd2hldGhlciBmb3J3YXJkIG9yIGJhY2t3YXJkLCB0byBhbiBhcHByb3ByaWF0ZSBzaXplLCBzbwotdGhlc2Ugb3B0aW9ucyBzZXJ2ZSBubyBwdXJwb3NlLgotCi1AaXRlbSBAY29kZXtPUFR9IGxpc3QgY29udHJvbCBvcHRpb25zCi0KLVRoZSBmb2xsb3dpbmcgbTY4ayBAY29kZXtPUFR9IGxpc3QgY29udHJvbCBvcHRpb25zIGFyZSBpZ25vcmVkOiBAY29kZXtDfSwKLUBjb2Rle0NFWH0sIEBjb2Rle0NMfSwgQGNvZGV7Q1JFfSwgQGNvZGV7RX0sIEBjb2Rle0d9LCBAY29kZXtJfSwgQGNvZGV7TX0sCi1AY29kZXtNRVh9LCBAY29kZXtNQ30sIEBjb2Rle01EfSwgQGNvZGV7WH0uCi0KLUBpdGVtIG90aGVyIEBjb2Rle09QVH0gb3B0aW9ucwotCi1UaGUgZm9sbG93aW5nIG02OGsgQGNvZGV7T1BUfSBvcHRpb25zIGFyZSBpZ25vcmVkOiBAY29kZXtORVNUfSwgQGNvZGV7T30sCi1AY29kZXtPTER9LCBAY29kZXtPUH0sIEBjb2Rle1B9LCBAY29kZXtQQ099LCBAY29kZXtQQ1J9LCBAY29kZXtQQ1N9LCBAY29kZXtSfS4KLQotQGl0ZW0gQGNvZGV7T1BUfSBAY29kZXtEfSBvcHRpb24gaXMgZGVmYXVsdAotCi1UaGUgbTY4ayBAY29kZXtPUFR9IEBjb2Rle0R9IG9wdGlvbiBpcyB0aGUgZGVmYXVsdCwgdW5saWtlIHRoZSBNUkkgYXNzZW1ibGVyLgotQGNvZGV7T1BUIE5PRH0gbWF5IGJlIHVzZWQgdG8gdHVybiBpdCBvZmYuCi0KLUBpdGVtIEBjb2Rle1hSRUZ9IHBzZXVkby1vcC4KLQotVGhlIG02OGsgQGNvZGV7WFJFRn0gcHNldWRvLW9wIGlzIGlnbm9yZWQuCi0KLUBpdGVtIEBjb2Rley5kZWJ1Z30gcHNldWRvLW9wCi0KLVRoZSBpOTYwIEBjb2Rley5kZWJ1Z30gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rley5leHRlbmRlZH0gcHNldWRvLW9wCi0KLVRoZSBpOTYwIEBjb2Rley5leHRlbmRlZH0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rley5saXN0fSBwc2V1ZG8tb3AuCi0KLVRoZSB2YXJpb3VzIG9wdGlvbnMgb2YgdGhlIGk5NjAgQGNvZGV7Lmxpc3R9IHBzZXVkby1vcCBhcmUgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7Lm9wdGltaXplfSBwc2V1ZG8tb3AKLQotVGhlIGk5NjAgQGNvZGV7Lm9wdGltaXplfSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7Lm91dHB1dH0gcHNldWRvLW9wCi0KLVRoZSBpOTYwIEBjb2Rley5vdXRwdXR9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXsuc2V0cmVhbH0gcHNldWRvLW9wCi0KLVRoZSBpOTYwIEBjb2Rley5zZXRyZWFsfSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KLQotQGVuZCBpdGVtaXplCi0KLUBub2RlIE1ECi1Ac2VjdGlvbiBEZXBlbmRlbmN5IHRyYWNraW5nOiBAY29kZXstLU1EfQotCi1Aa2luZGV4IC0tTUQKLUBjaW5kZXggZGVwZW5kZW5jeSB0cmFja2luZwotQGNpbmRleCBtYWtlIHJ1bGVzCi0KLUBjb2Rle0B2YWx1ZXtBU319IGNhbiBnZW5lcmF0ZSBhIGRlcGVuZGVuY3kgZmlsZSBmb3IgdGhlIGZpbGUgaXQgY3JlYXRlcy4gIFRoaXMKLWZpbGUgY29uc2lzdHMgb2YgYSBzaW5nbGUgcnVsZSBzdWl0YWJsZSBmb3IgQGNvZGV7bWFrZX0gZGVzY3JpYmluZyB0aGUKLWRlcGVuZGVuY2llcyBvZiB0aGUgbWFpbiBzb3VyY2UgZmlsZS4KLQotVGhlIHJ1bGUgaXMgd3JpdHRlbiB0byB0aGUgZmlsZSBuYW1lZCBpbiBpdHMgYXJndW1lbnQuCi0KLVRoaXMgZmVhdHVyZSBpcyB1c2VkIGluIHRoZSBhdXRvbWF0aWMgdXBkYXRpbmcgb2YgbWFrZWZpbGVzLgotCi1Abm9kZSBvCi1Ac2VjdGlvbiBOYW1lIHRoZSBPYmplY3QgRmlsZTogQGNvZGV7LW99Ci0KLUBraW5kZXggLW8KLUBjaW5kZXggbmFtaW5nIG9iamVjdCBmaWxlCi1AY2luZGV4IG9iamVjdCBmaWxlIG5hbWUKLVRoZXJlIGlzIGFsd2F5cyBvbmUgb2JqZWN0IGZpbGUgb3V0cHV0IHdoZW4geW91IHJ1biBAY29kZXtAdmFsdWV7QVN9fS4gIEJ5Ci1kZWZhdWx0IGl0IGhhcyB0aGUgbmFtZQotQGlmc2V0IEdFTkVSSUMKLUBpZnNldCBJOTYwCi1AZmlsZXthLm91dH0gKG9yIEBmaWxle2Iub3V0fSwgZm9yIEludGVsIDk2MCB0YXJnZXRzIG9ubHkpLgotQGVuZCBpZnNldAotQGlmY2xlYXIgSTk2MAotQGZpbGV7YS5vdXR9LgotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSTk2MAotQGZpbGV7Yi5vdXR9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgSTk2MAotQGZpbGV7YS5vdXR9LgotQGVuZCBpZmNsZWFyCi1AZW5kIGlmY2xlYXIKLVlvdSB1c2UgdGhpcyBvcHRpb24gKHdoaWNoIHRha2VzIGV4YWN0bHkgb25lIGZpbGVuYW1lKSB0byBnaXZlIHRoZQotb2JqZWN0IGZpbGUgYSBkaWZmZXJlbnQgbmFtZS4KLQotV2hhdGV2ZXIgdGhlIG9iamVjdCBmaWxlIGlzIGNhbGxlZCwgQGNvZGV7QHZhbHVle0FTfX0gb3ZlcndyaXRlcyBhbnkKLWV4aXN0aW5nIGZpbGUgb2YgdGhlIHNhbWUgbmFtZS4KLQotQG5vZGUgUgotQHNlY3Rpb24gSm9pbiBEYXRhIGFuZCBUZXh0IFNlY3Rpb25zOiBAY29kZXstUn0KLQotQGtpbmRleCAtUgotQGNpbmRleCBkYXRhIGFuZCB0ZXh0IHNlY3Rpb25zLCBqb2luaW5nCi1AY2luZGV4IHRleHQgYW5kIGRhdGEgc2VjdGlvbnMsIGpvaW5pbmcKLUBjaW5kZXggam9pbmluZyB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zCi1AY2luZGV4IG1lcmdpbmcgdGV4dCBhbmQgZGF0YSBzZWN0aW9ucwotQGNvZGV7LVJ9IHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIHdyaXRlIHRoZSBvYmplY3QgZmlsZSBhcyBpZiBhbGwKLWRhdGEtc2VjdGlvbiBkYXRhIGxpdmVzIGluIHRoZSB0ZXh0IHNlY3Rpb24uICBUaGlzIGlzIG9ubHkgZG9uZSBhdAotdGhlIHZlcnkgbGFzdCBtb21lbnQ6ICB5b3VyIGJpbmFyeSBkYXRhIGFyZSB0aGUgc2FtZSwgYnV0IGRhdGEKLXNlY3Rpb24gcGFydHMgYXJlIHJlbG9jYXRlZCBkaWZmZXJlbnRseS4gIFRoZSBkYXRhIHNlY3Rpb24gcGFydCBvZgoteW91ciBvYmplY3QgZmlsZSBpcyB6ZXJvIGJ5dGVzIGxvbmcgYmVjYXVzZSBhbGwgaXRzIGJ5dGVzIGFyZQotYXBwZW5kZWQgdG8gdGhlIHRleHQgc2VjdGlvbi4gIChAeHJlZntTZWN0aW9ucywsU2VjdGlvbnMgYW5kIFJlbG9jYXRpb259LikKLQotV2hlbiB5b3Ugc3BlY2lmeSBAY29kZXstUn0gaXQgd291bGQgYmUgcG9zc2libGUgdG8gZ2VuZXJhdGUgc2hvcnRlcgotYWRkcmVzcyBkaXNwbGFjZW1lbnRzIChiZWNhdXNlIHdlIGRvIG5vdCBoYXZlIHRvIGNyb3NzIGJldHdlZW4gdGV4dCBhbmQKLWRhdGEgc2VjdGlvbikuICBXZSByZWZyYWluIGZyb20gZG9pbmcgdGhpcyBzaW1wbHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotb2xkZXIgdmVyc2lvbnMgb2YgQGNvZGV7QHZhbHVle0FTfX0uICBJbiBmdXR1cmUsIEBjb2Rley1SfSBtYXkgd29yayB0aGlzIHdheS4KLQotQGlmc2V0IENPRkYKLVdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IgQ09GRiBvdXRwdXQsCi10aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWZ1bCBpZiB5b3UgdXNlIHNlY3Rpb25zIG5hbWVkIEBzYW1wey50ZXh0fSBhbmQKLUBzYW1wey5kYXRhfS4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhQUEEKLUBjb2Rley1SfSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbnkgb2YgdGhlIEhQUEEgdGFyZ2V0cy4gIFVzaW5nCi1AY29kZXstUn0gZ2VuZXJhdGVzIGEgd2FybmluZyBmcm9tIEBjb2Rle0B2YWx1ZXtBU319LgotQGVuZCBpZnNldAotCi1Abm9kZSBzdGF0aXN0aWNzCi1Ac2VjdGlvbiBEaXNwbGF5IEFzc2VtYmx5IFN0YXRpc3RpY3M6IEBjb2Rley0tc3RhdGlzdGljc30KLQotQGtpbmRleCAtLXN0YXRpc3RpY3MKLUBjaW5kZXggc3RhdGlzdGljcywgYWJvdXQgYXNzZW1ibHkKLUBjaW5kZXggdGltZSwgdG90YWwgZm9yIGFzc2VtYmx5Ci1AY2luZGV4IHNwYWNlIHVzZWQsIG1heGltdW0gZm9yIGFzc2VtYmx5Ci1Vc2UgQHNhbXB7LS1zdGF0aXN0aWNzfSB0byBkaXNwbGF5IHR3byBzdGF0aXN0aWNzIGFib3V0IHRoZSByZXNvdXJjZXMgdXNlZCBieQotQGNvZGV7QHZhbHVle0FTfX06IHRoZSBtYXhpbXVtIGFtb3VudCBvZiBzcGFjZSBhbGxvY2F0ZWQgZHVyaW5nIHRoZSBhc3NlbWJseQotKGluIGJ5dGVzKSwgYW5kIHRoZSB0b3RhbCBleGVjdXRpb24gdGltZSB0YWtlbiBmb3IgdGhlIGFzc2VtYmx5IChpbiBAc2N7Y3B1fQotc2Vjb25kcykuCi0KLUBub2RlIHRyYWRpdGlvbmFsLWZvcm1hdAotQHNlY3Rpb24gQ29tcGF0aWJsZSBvdXRwdXQ6IEBjb2Rley0tdHJhZGl0aW9uYWwtZm9ybWF0fQotCi1Aa2luZGV4IC0tdHJhZGl0aW9uYWwtZm9ybWF0Ci1Gb3Igc29tZSB0YXJnZXRzLCB0aGUgb3V0cHV0IG9mIEBjb2Rle0B2YWx1ZXtBU319IGlzIGRpZmZlcmVudCBpbiBzb21lIHdheXMKLWZyb20gdGhlIG91dHB1dCBvZiBzb21lIGV4aXN0aW5nIGFzc2VtYmxlci4gIFRoaXMgc3dpdGNoIHJlcXVlc3RzCi1AY29kZXtAdmFsdWV7QVN9fSB0byB1c2UgdGhlIHRyYWRpdGlvbmFsIGZvcm1hdCBpbnN0ZWFkLgotCi1Gb3IgZXhhbXBsZSwgaXQgZGlzYWJsZXMgdGhlIGV4Y2VwdGlvbiBmcmFtZSBvcHRpbWl6YXRpb25zIHdoaWNoCi1AY29kZXtAdmFsdWV7QVN9fSBub3JtYWxseSBkb2VzIGJ5IGRlZmF1bHQgb24gQGNvZGV7QHZhbHVle0dDQ319IG91dHB1dC4KLQotQG5vZGUgdgotQHNlY3Rpb24gQW5ub3VuY2UgVmVyc2lvbjogQGNvZGV7LXZ9Ci0KLUBraW5kZXggLXYKLUBraW5kZXggLXZlcnNpb24KLUBjaW5kZXggYXNzZW1ibGVyIHZlcnNpb24KLUBjaW5kZXggdmVyc2lvbiBvZiBhc3NlbWJsZXIKLVlvdSBjYW4gZmluZCBvdXQgd2hhdCB2ZXJzaW9uIG9mIGFzIGlzIHJ1bm5pbmcgYnkgaW5jbHVkaW5nIHRoZQotb3B0aW9uIEBzYW1wey12fSAod2hpY2ggeW91IGNhbiBhbHNvIHNwZWxsIGFzIEBzYW1wey12ZXJzaW9ufSkgb24gdGhlCi1jb21tYW5kIGxpbmUuCi0KLUBub2RlIFcKLUBzZWN0aW9uIENvbnRyb2wgV2FybmluZ3M6IEBjb2Rley1XfSwgQGNvZGV7LS13YXJufSwgQGNvZGV7LS1uby13YXJufSwgQGNvZGV7LS1mYXRhbC13YXJuaW5nc30KLQotQGNvZGV7QHZhbHVle0FTfX0gc2hvdWxkIG5ldmVyIGdpdmUgYSB3YXJuaW5nIG9yIGVycm9yIG1lc3NhZ2Ugd2hlbgotYXNzZW1ibGluZyBjb21waWxlciBvdXRwdXQuICBCdXQgcHJvZ3JhbXMgd3JpdHRlbiBieSBwZW9wbGUgb2Z0ZW4KLWNhdXNlIEBjb2Rle0B2YWx1ZXtBU319IHRvIGdpdmUgYSB3YXJuaW5nIHRoYXQgYSBwYXJ0aWN1bGFyIGFzc3VtcHRpb24gd2FzCi1tYWRlLiAgQWxsIHN1Y2ggd2FybmluZ3MgYXJlIGRpcmVjdGVkIHRvIHRoZSBzdGFuZGFyZCBlcnJvciBmaWxlLgotCi1Aa2luZGV4IEBzYW1wey1XfQotQGtpbmRleCBAc2FtcHstLW5vLXdhcm59Ci1AY2luZGV4IHN1cHByZXNzaW5nIHdhcm5pbmdzCi1AY2luZGV4IHdhcm5pbmdzLCBzdXBwcmVzc2luZwotSWYgeW91IHVzZSB0aGUgQGNvZGV7LVd9IGFuZCBAY29kZXstLW5vLXdhcm59IG9wdGlvbnMsIG5vIHdhcm5pbmdzIGFyZSBpc3N1ZWQuCi1UaGlzIG9ubHkgYWZmZWN0cyB0aGUgd2FybmluZyBtZXNzYWdlczogaXQgZG9lcyBub3QgY2hhbmdlIGFueSBwYXJ0aWN1bGFyIG9mCi1ob3cgQGNvZGV7QHZhbHVle0FTfX0gYXNzZW1ibGVzIHlvdXIgZmlsZS4gIEVycm9ycywgd2hpY2ggc3RvcCB0aGUgYXNzZW1ibHksCi1hcmUgc3RpbGwgcmVwb3J0ZWQuCi0KLUBraW5kZXggQHNhbXB7LS1mYXRhbC13YXJuaW5nc30KLUBjaW5kZXggZXJyb3JzLCBjYXVzZWQgYnkgd2FybmluZ3MKLUBjaW5kZXggd2FybmluZ3MsIGNhdXNpbmcgZXJyb3IKLUlmIHlvdSB1c2UgdGhlIEBjb2Rley0tZmF0YWwtd2FybmluZ3N9IG9wdGlvbiwgQGNvZGV7QHZhbHVle0FTfX0gY29uc2lkZXJzCi1maWxlcyB0aGF0IGdlbmVyYXRlIHdhcm5pbmdzIHRvIGJlIGluIGVycm9yLgotCi1Aa2luZGV4IEBzYW1wey0td2Fybn0KLUBjaW5kZXggd2FybmluZ3MsIHN3aXRjaGluZyBvbgotWW91IGNhbiBzd2l0Y2ggdGhlc2Ugb3B0aW9ucyBvZmYgYWdhaW4gYnkgc3BlY2lmeWluZyBAY29kZXstLXdhcm59LCB3aGljaAotY2F1c2VzIHdhcm5pbmdzIHRvIGJlIG91dHB1dCBhcyB1c3VhbC4KLQotQG5vZGUgWgotQHNlY3Rpb24gR2VuZXJhdGUgT2JqZWN0IEZpbGUgaW4gU3BpdGUgb2YgRXJyb3JzOiBAY29kZXstWn0KLUBjaW5kZXggb2JqZWN0IGZpbGUsIGFmdGVyIGVycm9ycwotQGNpbmRleCBlcnJvcnMsIGNvbnRpbnVpbmcgYWZ0ZXIKLUFmdGVyIGFuIGVycm9yIG1lc3NhZ2UsIEBjb2Rle0B2YWx1ZXtBU319IG5vcm1hbGx5IHByb2R1Y2VzIG5vIG91dHB1dC4gIElmIGZvcgotc29tZSByZWFzb24geW91IGFyZSBpbnRlcmVzdGVkIGluIG9iamVjdCBmaWxlIG91dHB1dCBldmVuIGFmdGVyCi1AY29kZXtAdmFsdWV7QVN9fSBnaXZlcyBhbiBlcnJvciBtZXNzYWdlIG9uIHlvdXIgcHJvZ3JhbSwgdXNlIHRoZSBAc2FtcHstWn0KLW9wdGlvbi4gIElmIHRoZXJlIGFyZSBhbnkgZXJyb3JzLCBAY29kZXtAdmFsdWV7QVN9fSBjb250aW51ZXMgYW55d2F5cywgYW5kCi13cml0ZXMgYW4gb2JqZWN0IGZpbGUgYWZ0ZXIgYSBmaW5hbCB3YXJuaW5nIG1lc3NhZ2Ugb2YgdGhlIGZvcm0gQHNhbXB7QHZhcntufQotZXJyb3JzLCBAdmFye219IHdhcm5pbmdzLCBnZW5lcmF0aW5nIGJhZCBvYmplY3QgZmlsZS59Ci0KLUBub2RlIFN5bnRheAotQGNoYXB0ZXIgU3ludGF4Ci0KLUBjaW5kZXggbWFjaGluZS1pbmRlcGVuZGVudCBzeW50YXgKLUBjaW5kZXggc3ludGF4LCBtYWNoaW5lLWluZGVwZW5kZW50Ci1UaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIHRoZSBtYWNoaW5lLWluZGVwZW5kZW50IHN5bnRheCBhbGxvd2VkIGluIGEKLXNvdXJjZSBmaWxlLiAgQGNvZGV7QHZhbHVle0FTfX0gc3ludGF4IGlzIHNpbWlsYXIgdG8gd2hhdCBtYW55IG90aGVyCi1hc3NlbWJsZXJzIHVzZTsgaXQgaXMgaW5zcGlyZWQgYnkgdGhlIEJTRCA0LjIKLUBpZmNsZWFyIFZBWAotYXNzZW1ibGVyLgotQGVuZCBpZmNsZWFyCi1AaWZzZXQgVkFYCi1hc3NlbWJsZXIsIGV4Y2VwdCB0aGF0IEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90IGFzc2VtYmxlIFZheCBiaXQtZmllbGRzLgotQGVuZCBpZnNldAotCi1AbWVudQotKiBQcmVwcm9jZXNzaW5nOjogICAgICAgICAgICAgIFByZXByb2Nlc3NpbmcKLSogV2hpdGVzcGFjZTo6ICAgICAgICAgICAgICAgICAgV2hpdGVzcGFjZQotKiBDb21tZW50czo6ICAgICAgICAgICAgICAgICAgICBDb21tZW50cwotKiBTeW1ib2wgSW50cm86OiAgICAgICAgICAgICAgICBTeW1ib2xzCi0qIFN0YXRlbWVudHM6OiAgICAgICAgICAgICAgICAgIFN0YXRlbWVudHMKLSogQ29uc3RhbnRzOjogICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzCi1AZW5kIG1lbnUKLQotQG5vZGUgUHJlcHJvY2Vzc2luZwotQHNlY3Rpb24gUHJlcHJvY2Vzc2luZwotCi1AY2luZGV4IHByZXByb2Nlc3NpbmcKLVRoZSBAY29kZXtAdmFsdWV7QVN9fSBpbnRlcm5hbCBwcmVwcm9jZXNzb3I6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AY2luZGV4IHdoaXRlc3BhY2UsIHJlbW92ZWQgYnkgcHJlcHJvY2Vzc29yCi1AaXRlbQotYWRqdXN0cyBhbmQgcmVtb3ZlcyBleHRyYSB3aGl0ZXNwYWNlLiAgSXQgbGVhdmVzIG9uZSBzcGFjZSBvciB0YWIgYmVmb3JlCi10aGUga2V5d29yZHMgb24gYSBsaW5lLCBhbmQgdHVybnMgYW55IG90aGVyIHdoaXRlc3BhY2Ugb24gdGhlIGxpbmUgaW50bwotYSBzaW5nbGUgc3BhY2UuCi0KLUBjaW5kZXggY29tbWVudHMsIHJlbW92ZWQgYnkgcHJlcHJvY2Vzc29yCi1AaXRlbQotcmVtb3ZlcyBhbGwgY29tbWVudHMsIHJlcGxhY2luZyB0aGVtIHdpdGggYSBzaW5nbGUgc3BhY2UsIG9yIGFuCi1hcHByb3ByaWF0ZSBudW1iZXIgb2YgbmV3bGluZXMuCi0KLUBjaW5kZXggY29uc3RhbnRzLCBjb252ZXJ0ZWQgYnkgcHJlcHJvY2Vzc29yCi1AaXRlbQotY29udmVydHMgY2hhcmFjdGVyIGNvbnN0YW50cyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBudW1lcmljIHZhbHVlcy4KLUBlbmQgaXRlbWl6ZQotCi1JdCBkb2VzIG5vdCBkbyBtYWNybyBwcm9jZXNzaW5nLCBpbmNsdWRlIGZpbGUgaGFuZGxpbmcsIG9yCi1hbnl0aGluZyBlbHNlIHlvdSBtYXkgZ2V0IGZyb20geW91ciBDIGNvbXBpbGVyJ3MgcHJlcHJvY2Vzc29yLiAgWW91IGNhbgotZG8gaW5jbHVkZSBmaWxlIHByb2Nlc3Npbmcgd2l0aCB0aGUgQGNvZGV7LmluY2x1ZGV9IGRpcmVjdGl2ZQotKEBweHJlZntJbmNsdWRlLCxAY29kZXsuaW5jbHVkZX19KS4gIFlvdSBjYW4gdXNlIHRoZSBAc2N7Z251fSBDIGNvbXBpbGVyIGRyaXZlcgotdG8gZ2V0IG90aGVyIGBgQ1BQJycgc3R5bGUgcHJlcHJvY2Vzc2luZywgYnkgZ2l2aW5nIHRoZSBpbnB1dCBmaWxlIGEKLUBzYW1wey5TfSBzdWZmaXguICBAeHJlZntPdmVyYWxsIE9wdGlvbnMsLCBPcHRpb25zIENvbnRyb2xsaW5nIHRoZSBLaW5kIG9mCi1PdXRwdXQsIGdjYy5pbmZvLCBVc2luZyBHTlUgQ0N9LgotCi1FeGNlc3Mgd2hpdGVzcGFjZSwgY29tbWVudHMsIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzCi1jYW5ub3QgYmUgdXNlZCBpbiB0aGUgcG9ydGlvbnMgb2YgdGhlIGlucHV0IHRleHQgdGhhdCBhcmUgbm90Ci1wcmVwcm9jZXNzZWQuCi0KLUBjaW5kZXggdHVybmluZyBwcmVwcm9jZXNzaW5nIG9uIGFuZCBvZmYKLUBjaW5kZXggcHJlcHJvY2Vzc2luZywgdHVybmluZyBvbiBhbmQgb2ZmCi1Aa2luZGV4ICNOT19BUFAKLUBraW5kZXggI0FQUAotSWYgdGhlIGZpcnN0IGxpbmUgb2YgYW4gaW5wdXQgZmlsZSBpcyBAY29kZXsjTk9fQVBQfSBvciBpZiB5b3UgdXNlIHRoZQotQHNhbXB7LWZ9IG9wdGlvbiwgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgYXJlIG5vdCByZW1vdmVkIGZyb20gdGhlIGlucHV0IGZpbGUuCi1XaXRoaW4gYW4gaW5wdXQgZmlsZSwgeW91IGNhbiBhc2sgZm9yIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcmVtb3ZhbCBpbgotc3BlY2lmaWMgcG9ydGlvbnMgb2YgdGhlIGJ5IHB1dHRpbmcgYSBsaW5lIHRoYXQgc2F5cyBAY29kZXsjQVBQfSBiZWZvcmUgdGhlCi10ZXh0IHRoYXQgbWF5IGNvbnRhaW4gd2hpdGVzcGFjZSBvciBjb21tZW50cywgYW5kIHB1dHRpbmcgYSBsaW5lIHRoYXQgc2F5cwotQGNvZGV7I05PX0FQUH0gYWZ0ZXIgdGhpcyB0ZXh0LiAgVGhpcyBmZWF0dXJlIGlzIG1haW5seSBpbnRlbmQgdG8gc3VwcG9ydAotQGNvZGV7YXNtfSBzdGF0ZW1lbnRzIGluIGNvbXBpbGVycyB3aG9zZSBvdXRwdXQgaXMgb3RoZXJ3aXNlIGZyZWUgb2YgY29tbWVudHMKLWFuZCB3aGl0ZXNwYWNlLgotCi1Abm9kZSBXaGl0ZXNwYWNlCi1Ac2VjdGlvbiBXaGl0ZXNwYWNlCi0KLUBjaW5kZXggd2hpdGVzcGFjZQotQGRmbntXaGl0ZXNwYWNlfSBpcyBvbmUgb3IgbW9yZSBibGFua3Mgb3IgdGFicywgaW4gYW55IG9yZGVyLgotV2hpdGVzcGFjZSBpcyB1c2VkIHRvIHNlcGFyYXRlIHN5bWJvbHMsIGFuZCB0byBtYWtlIHByb2dyYW1zIG5lYXRlciBmb3IKLXBlb3BsZSB0byByZWFkLiAgVW5sZXNzIHdpdGhpbiBjaGFyYWN0ZXIgY29uc3RhbnRzCi0oQHB4cmVme0NoYXJhY3RlcnMsLENoYXJhY3RlciBDb25zdGFudHN9KSwgYW55IHdoaXRlc3BhY2UgbWVhbnMgdGhlIHNhbWUKLWFzIGV4YWN0bHkgb25lIHNwYWNlLgotCi1Abm9kZSBDb21tZW50cwotQHNlY3Rpb24gQ29tbWVudHMKLQotQGNpbmRleCBjb21tZW50cwotVGhlcmUgYXJlIHR3byB3YXlzIG9mIHJlbmRlcmluZyBjb21tZW50cyB0byBAY29kZXtAdmFsdWV7QVN9fS4gIEluIGJvdGgKLWNhc2VzIHRoZSBjb21tZW50IGlzIGVxdWl2YWxlbnQgdG8gb25lIHNwYWNlLgotCi1Bbnl0aGluZyBmcm9tIEBzYW1wey8qfSB0aHJvdWdoIHRoZSBuZXh0IEBzYW1weyovfSBpcyBhIGNvbW1lbnQuCi1UaGlzIG1lYW5zIHlvdSBtYXkgbm90IG5lc3QgdGhlc2UgY29tbWVudHMuCi0KLUBzbWFsbGV4YW1wbGUKLS8qCi0gIFRoZSBvbmx5IHdheSB0byBpbmNsdWRlIGEgbmV3bGluZSAoJ1xuJykgaW4gYSBjb21tZW50Ci0gIGlzIHRvIHVzZSB0aGlzIHNvcnQgb2YgY29tbWVudC4KLSovCi0KLS8qIFRoaXMgc29ydCBvZiBjb21tZW50IGRvZXMgbm90IG5lc3QuICovCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUFueXRoaW5nIGZyb20gdGhlIEBkZm57bGluZSBjb21tZW50fSBjaGFyYWN0ZXIgdG8gdGhlIG5leHQgbmV3bGluZQotaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIGlzIGlnbm9yZWQuICBUaGUgbGluZSBjb21tZW50IGNoYXJhY3RlciBpcwotQGlmc2V0IEEyOUsKLUBzYW1wezt9IGZvciB0aGUgQU1EIDI5SyBmYW1pbHk7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgQVJDCi1Ac2FtcHs7fSBvbiB0aGUgQVJDOwotQGVuZCBpZnNldAotQGlmc2V0IEg4LzMwMAotQHNhbXB7O30gZm9yIHRoZSBIOC8zMDAgZmFtaWx5OwotQGVuZCBpZnNldAotQGlmc2V0IEg4LzUwMAotQHNhbXB7IX0gZm9yIHRoZSBIOC81MDAgZmFtaWx5OwotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLUBzYW1wezt9IGZvciB0aGUgSFBQQTsKLUBlbmQgaWZzZXQKLUBpZnNldCBJOTYwCi1Ac2FtcHsjfSBvbiB0aGUgaTk2MDsKLUBlbmQgaWZzZXQKLUBpZnNldCBQSgotQHNhbXB7O30gZm9yIHBpY29KYXZhOwotQGVuZCBpZnNldAotQGlmc2V0IFNICi1Ac2FtcHshfSBmb3IgdGhlIEhpdGFjaGkgU0g7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgU1BBUkMKLUBzYW1weyF9IG9uIHRoZSBTUEFSQzsKLUBlbmQgaWZzZXQKLUBpZnNldCBNMzJSCi1Ac2FtcHsjfSBvbiB0aGUgbTMycjsKLUBlbmQgaWZzZXQKLUBpZnNldCBNNjgwWDAKLUBzYW1we3x9IG9uIHRoZSA2ODB4MDsKLUBlbmQgaWZzZXQKLUBpZnNldCBWQVgKLUBzYW1weyN9IG9uIHRoZSBWYXg7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgWjgwMDAKLUBzYW1weyF9IGZvciB0aGUgWjgwMDA7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgVjg1MAotQHNhbXB7I30gb24gdGhlIFY4NTA7Ci1AZW5kIGlmc2V0Ci1zZWUgQHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uICBAcmVmaWxsCi1AYyBGSVhNRSBXaGF0IGFib3V0IGkzODYsIG04OGssIGk4NjA/Ci0KLUBpZnNldCBHRU5FUklDCi1PbiBzb21lIG1hY2hpbmVzIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGxpbmUgY29tbWVudCBjaGFyYWN0ZXJzLiAgT25lCi1jaGFyYWN0ZXIgb25seSBiZWdpbnMgYSBjb21tZW50IGlmIGl0IGlzIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgb24KLWEgbGluZSwgd2hpbGUgdGhlIG90aGVyIGFsd2F5cyBiZWdpbnMgYSBjb21tZW50LgotQGVuZCBpZnNldAotCi1AaWZzZXQgVjg1MAotVGhlIFY4NTAgYXNzZW1ibGVyIGFsc28gc3VwcG9ydHMgYSBkb3VibGUgZGFzaCBhcyBzdGFydGluZyBhIGNvbW1lbnQgdGhhdAotZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgotCi1Ac2FtcHstLX07Ci1AZW5kIGlmc2V0Ci0KLUBraW5kZXggIwotQGNpbmRleCBsaW5lcyBzdGFydGluZyB3aXRoIEBjb2RleyN9Ci1AY2luZGV4IGxvZ2ljYWwgbGluZSBudW1iZXJzCi1UbyBiZSBjb21wYXRpYmxlIHdpdGggcGFzdCBhc3NlbWJsZXJzLCBsaW5lcyB0aGF0IGJlZ2luIHdpdGggQHNhbXB7I30gaGF2ZSBhCi1zcGVjaWFsIGludGVycHJldGF0aW9uLiAgRm9sbG93aW5nIHRoZSBAc2FtcHsjfSBzaG91bGQgYmUgYW4gYWJzb2x1dGUKLWV4cHJlc3Npb24gKEBweHJlZntFeHByZXNzaW9uc30pOiB0aGUgbG9naWNhbCBsaW5lIG51bWJlciBvZiB0aGUgQGVtcGh7bmV4dH0KLWxpbmUuICBUaGVuIGEgc3RyaW5nIChAcHhyZWZ7U3RyaW5ncywsIFN0cmluZ3N9KSBpcyBhbGxvd2VkOiBpZiBwcmVzZW50IGl0IGlzIGEKLW5ldyBsb2dpY2FsIGZpbGUgbmFtZS4gIFRoZSByZXN0IG9mIHRoZSBsaW5lLCBpZiBhbnksIHNob3VsZCBiZSB3aGl0ZXNwYWNlLgotCi1JZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBvbiB0aGUgbGluZSBhcmUgbm90IG51bWVyaWMsCi10aGUgbGluZSBpcyBpZ25vcmVkLiAgKEp1c3QgbGlrZSBhIGNvbW1lbnQuKQotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhbiBvcmRpbmFyeSBjb21tZW50LgotIyA0Mi02ICJuZXdfZmlsZV9uYW1lIiAgICAjIE5ldyBsb2dpY2FsIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgbG9naWNhbCBsaW5lICMgMzYuCi1AZW5kIHNtYWxsZXhhbXBsZQotVGhpcyBmZWF0dXJlIGlzIGRlcHJlY2F0ZWQsIGFuZCBtYXkgZGlzYXBwZWFyIGZyb20gZnV0dXJlIHZlcnNpb25zCi1vZiBAY29kZXtAdmFsdWV7QVN9fS4KLQotQG5vZGUgU3ltYm9sIEludHJvCi1Ac2VjdGlvbiBTeW1ib2xzCi0KLUBjaW5kZXggY2hhcmFjdGVycyB1c2VkIGluIHN5bWJvbHMKLUBpZmNsZWFyIFNQRUNJQUwtU1lNUwotQSBAZGZue3N5bWJvbH0gaXMgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBjaG9zZW4gZnJvbSB0aGUgc2V0IG9mIGFsbAotbGV0dGVycyAoYm90aCB1cHBlciBhbmQgbG93ZXIgY2FzZSksIGRpZ2l0cyBhbmQgdGhlIHRocmVlIGNoYXJhY3RlcnMKLUBzYW1we18uJH0uCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBTUEVDSUFMLVNZTVMKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBIOAotQSBAZGZue3N5bWJvbH0gaXMgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBjaG9zZW4gZnJvbSB0aGUgc2V0IG9mIGFsbAotbGV0dGVycyAoYm90aCB1cHBlciBhbmQgbG93ZXIgY2FzZSksIGRpZ2l0cyBhbmQgdGhlIHRocmVlIGNoYXJhY3RlcnMKLUBzYW1wey5fJH0uICAoU2F2ZSB0aGF0LCBvbiB0aGUgSDgvMzAwIG9ubHksIHlvdSBtYXkgbm90IHVzZSBAc2FtcHskfSBpbgotc3ltYm9sIG5hbWVzLikKLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotQGVuZCBpZnNldAotQGlmc2V0IEdFTkVSSUMKLU9uIG1vc3QgbWFjaGluZXMsIHlvdSBjYW4gYWxzbyB1c2UgQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzOyBleGNlcHRpb25zCi1hcmUgbm90ZWQgaW4gQHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCi1AZW5kIGlmc2V0Ci1ObyBzeW1ib2wgbWF5IGJlZ2luIHdpdGggYSBkaWdpdC4gIENhc2UgaXMgc2lnbmlmaWNhbnQuCi1UaGVyZSBpcyBubyBsZW5ndGggbGltaXQ6IGFsbCBjaGFyYWN0ZXJzIGFyZSBzaWduaWZpY2FudC4gIFN5bWJvbHMgYXJlCi1kZWxpbWl0ZWQgYnkgY2hhcmFjdGVycyBub3QgaW4gdGhhdCBzZXQsIG9yIGJ5IHRoZSBiZWdpbm5pbmcgb2YgYSBmaWxlCi0oc2luY2UgdGhlIHNvdXJjZSBwcm9ncmFtIG11c3QgZW5kIHdpdGggYSBuZXdsaW5lLCB0aGUgZW5kIG9mIGEgZmlsZSBpcwotbm90IGEgcG9zc2libGUgc3ltYm9sIGRlbGltaXRlcikuICBAeHJlZntTeW1ib2xzfS4KLUBjaW5kZXggbGVuZ3RoIG9mIHN5bWJvbHMKLQotQG5vZGUgU3RhdGVtZW50cwotQHNlY3Rpb24gU3RhdGVtZW50cwotCi1AY2luZGV4IHN0YXRlbWVudHMsIHN0cnVjdHVyZSBvZgotQGNpbmRleCBsaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXIKLUBjaW5kZXggc3RhdGVtZW50IHNlcGFyYXRvciBjaGFyYWN0ZXIKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZmNsZWFyIGFibm9ybWFsLXNlcGFyYXRvcgotQSBAZGZue3N0YXRlbWVudH0gZW5kcyBhdCBhIG5ld2xpbmUgY2hhcmFjdGVyIChAc2FtcHtcbn0pIG9yIGF0IGEKLXNlbWljb2xvbiAoQHNhbXB7O30pLiAgVGhlIG5ld2xpbmUgb3Igc2VtaWNvbG9uIGlzIGNvbnNpZGVyZWQgcGFydCBvZgotdGhlIHByZWNlZGluZyBzdGF0ZW1lbnQuICBOZXdsaW5lcyBhbmQgc2VtaWNvbG9ucyB3aXRoaW4gY2hhcmFjdGVyCi1jb25zdGFudHMgYXJlIGFuIGV4Y2VwdGlvbjogdGhleSBkbyBub3QgZW5kIHN0YXRlbWVudHMuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBhYm5vcm1hbC1zZXBhcmF0b3IKLUBpZnNldCBBMjlLCi1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSkgb3IgYW4gYGBhdCcnCi1zaWduIChAc2FtcHtAQH0pLiAgVGhlIG5ld2xpbmUgb3IgYXQgc2lnbiBpcyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlCi1wcmVjZWRpbmcgc3RhdGVtZW50LiAgTmV3bGluZXMgYW5kIGF0IHNpZ25zIHdpdGhpbiBjaGFyYWN0ZXIgY29uc3RhbnRzCi1hcmUgYW4gZXhjZXB0aW9uOiB0aGV5IGRvIG5vdCBlbmQgc3RhdGVtZW50cy4KLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSkgb3IgYW4gZXhjbGFtYXRpb24gCi1wb2ludCAoQHNhbXB7IX0pLiAgVGhlIG5ld2xpbmUgb3IgZXhjbGFtYXRpb24gcG9pbnQgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZQotcHJlY2VkaW5nIHN0YXRlbWVudC4gIE5ld2xpbmVzIGFuZCBleGNsYW1hdGlvbiBwb2ludHMgd2l0aGluIGNoYXJhY3RlcgotY29uc3RhbnRzIGFyZSBhbiBleGNlcHRpb246IHRoZXkgZG8gbm90IGVuZCBzdGF0ZW1lbnRzLgotQGVuZCBpZnNldAotQGlmc2V0IEg4Ci1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSk7IG9yIChmb3IgdGhlCi1IOC8zMDApIGEgZG9sbGFyIHNpZ24gKEBzYW1weyR9KTsgb3IgKGZvciB0aGUKLUhpdGFjaGktU0ggb3IgdGhlCi1IOC81MDApIGEgc2VtaWNvbG9uCi0oQHNhbXB7O30pLiAgVGhlIG5ld2xpbmUgb3Igc2VwYXJhdG9yIGNoYXJhY3RlciBpcyBjb25zaWRlcmVkIHBhcnQgb2YKLXRoZSBwcmVjZWRpbmcgc3RhdGVtZW50LiAgTmV3bGluZXMgYW5kIHNlcGFyYXRvcnMgd2l0aGluIGNoYXJhY3RlcgotY29uc3RhbnRzIGFyZSBhbiBleGNlcHRpb246IHRoZXkgZG8gbm90IGVuZCBzdGF0ZW1lbnRzLgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AaWZzZXQgR0VORVJJQwotQSBAZGZue3N0YXRlbWVudH0gZW5kcyBhdCBhIG5ld2xpbmUgY2hhcmFjdGVyIChAc2FtcHtcbn0pIG9yIGxpbmUKLXNlcGFyYXRvciBjaGFyYWN0ZXIuICAoVGhlIGxpbmUgc2VwYXJhdG9yIGlzIHVzdWFsbHkgQHNhbXB7O30sIHVubGVzcwotdGhpcyBjb25mbGljdHMgd2l0aCB0aGUgY29tbWVudCBjaGFyYWN0ZXI7IEBweHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uKSAgVGhlCi1uZXdsaW5lIG9yIHNlcGFyYXRvciBjaGFyYWN0ZXIgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBwcmVjZWRpbmcKLXN0YXRlbWVudC4gIE5ld2xpbmVzIGFuZCBzZXBhcmF0b3JzIHdpdGhpbiBjaGFyYWN0ZXIgY29uc3RhbnRzIGFyZSBhbgotZXhjZXB0aW9uOiB0aGV5IGRvIG5vdCBlbmQgc3RhdGVtZW50cy4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCBuZXdsaW5lLCByZXF1aXJlZCBhdCBmaWxlIGVuZAotQGNpbmRleCBFT0YsIG5ld2xpbmUgbXVzdCBwcmVjZWRlCi1JdCBpcyBhbiBlcnJvciB0byBlbmQgYW55IHN0YXRlbWVudCB3aXRoIGVuZC1vZi1maWxlOiAgdGhlIGxhc3QKLWNoYXJhY3RlciBvZiBhbnkgaW5wdXQgZmlsZSBzaG91bGQgYmUgYSBuZXdsaW5lLkByZWZpbGwKLQotQW4gZW1wdHkgc3RhdGVtZW50IGlzIGFsbG93ZWQsIGFuZCBtYXkgaW5jbHVkZSB3aGl0ZXNwYWNlLiAgSXQgaXMgaWdub3JlZC4KLQotQGNpbmRleCBpbnN0cnVjdGlvbnMgYW5kIGRpcmVjdGl2ZXMKLUBjaW5kZXggZGlyZWN0aXZlcyBhbmQgaW5zdHJ1Y3Rpb25zCi1AYyAia2V5IHN5bWJvbCIgaXMgbm90IHVzZWQgZWxzZXdoZXJlIGluIHRoZSBkb2N1bWVudDsgc2VlbXMgcGVkYW50aWMgdG8KLUBjIEBkZWZue30gaXQgaW4gdGhhdCBjYXNlLCBhcyB3YXMgZG9uZSBwcmV2aW91c2x5Li4uICBkb2NAY3lnbnVzLmNvbSwKLUBjIDEzZmViOTEuCi1BIHN0YXRlbWVudCBiZWdpbnMgd2l0aCB6ZXJvIG9yIG1vcmUgbGFiZWxzLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEKLWtleSBzeW1ib2wgd2hpY2ggZGV0ZXJtaW5lcyB3aGF0IGtpbmQgb2Ygc3RhdGVtZW50IGl0IGlzLiAgVGhlIGtleQotc3ltYm9sIGRldGVybWluZXMgdGhlIHN5bnRheCBvZiB0aGUgcmVzdCBvZiB0aGUgc3RhdGVtZW50LiAgSWYgdGhlCi1zeW1ib2wgYmVnaW5zIHdpdGggYSBkb3QgQHNhbXB7Ln0gdGhlbiB0aGUgc3RhdGVtZW50IGlzIGFuIGFzc2VtYmxlcgotZGlyZWN0aXZlOiB0eXBpY2FsbHkgdmFsaWQgZm9yIGFueSBjb21wdXRlci4gIElmIHRoZSBzeW1ib2wgYmVnaW5zIHdpdGgKLWEgbGV0dGVyIHRoZSBzdGF0ZW1lbnQgaXMgYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgQGRmbntpbnN0cnVjdGlvbn06IGl0Ci1hc3NlbWJsZXMgaW50byBhIG1hY2hpbmUgbGFuZ3VhZ2UgaW5zdHJ1Y3Rpb24uCi1AaWZzZXQgR0VORVJJQwotRGlmZmVyZW50IHZlcnNpb25zIG9mIEBjb2Rle0B2YWx1ZXtBU319IGZvciBkaWZmZXJlbnQgY29tcHV0ZXJzCi1yZWNvZ25pemUgZGlmZmVyZW50IGluc3RydWN0aW9ucy4gIEluIGZhY3QsIHRoZSBzYW1lIHN5bWJvbCBtYXkKLXJlcHJlc2VudCBhIGRpZmZlcmVudCBpbnN0cnVjdGlvbiBpbiBhIGRpZmZlcmVudCBjb21wdXRlcidzIGFzc2VtYmx5Ci1sYW5ndWFnZS5AcmVmaWxsCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggQGNvZGV7On0gKGxhYmVsKQotQGNpbmRleCBsYWJlbCAoQGNvZGV7On0pCi1BIGxhYmVsIGlzIGEgc3ltYm9sIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgY29sb24gKEBjb2Rlezp9KS4KLVdoaXRlc3BhY2UgYmVmb3JlIGEgbGFiZWwgb3IgYWZ0ZXIgYSBjb2xvbiBpcyBwZXJtaXR0ZWQsIGJ1dCB5b3UgbWF5IG5vdAotaGF2ZSB3aGl0ZXNwYWNlIGJldHdlZW4gYSBsYWJlbCdzIHN5bWJvbCBhbmQgaXRzIGNvbG9uLiBAeHJlZntMYWJlbHN9LgotCi1AaWZzZXQgSFBQQQotRm9yIEhQUEEgdGFyZ2V0cywgbGFiZWxzIG5lZWQgbm90IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgY29sb24sIGJ1dCAKLXRoZSBkZWZpbml0aW9uIG9mIGEgbGFiZWwgbXVzdCBiZWdpbiBpbiBjb2x1bW4gemVyby4gIFRoaXMgYWxzbyBpbXBsaWVzIHRoYXQKLW9ubHkgb25lIGxhYmVsIG1heSBiZSBkZWZpbmVkIG9uIGVhY2ggbGluZS4KLUBlbmQgaWZzZXQKLQotQHNtYWxsZXhhbXBsZQotbGFiZWw6ICAgICAuZGlyZWN0aXZlICAgIGZvbGxvd2VkIGJ5IHNvbWV0aGluZwotYW5vdGhlcl9sYWJlbDogICAgICAgICAgICMgVGhpcyBpcyBhbiBlbXB0eSBzdGF0ZW1lbnQuCi0gICAgICAgICAgIGluc3RydWN0aW9uICAgb3BlcmFuZF8xLCBvcGVyYW5kXzIsIEBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIENvbnN0YW50cwotQHNlY3Rpb24gQ29uc3RhbnRzCi0KLUBjaW5kZXggY29uc3RhbnRzCi1BIGNvbnN0YW50IGlzIGEgbnVtYmVyLCB3cml0dGVuIHNvIHRoYXQgaXRzIHZhbHVlIGlzIGtub3duIGJ5Ci1pbnNwZWN0aW9uLCB3aXRob3V0IGtub3dpbmcgYW55IGNvbnRleHQuICBMaWtlIHRoaXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLS5ieXRlICA3NCwgMDExMiwgMDkyLCAweDRBLCAwWDRhLCAnSiwgJ1xKICMgQWxsIHRoZSBzYW1lIHZhbHVlLgotLmFzY2lpICJSaW5nIHRoZSBiZWxsXDciICAgICAgICAgICAgICAgICAgIyBBIHN0cmluZyBjb25zdGFudC4KLS5vY3RhICAweDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlBQkNERUYwICMgQSBiaWdudW0uCi0uZmxvYXQgMGYtMzE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3XAotOTUwMjg4NDE5NzEuNjkzOTkzNzUxRS00MCAgICAgICAgICAgICAgICAgIyAtIHBpLCBhIGZsb251bS4KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBtZW51Ci0qIENoYXJhY3RlcnM6OiAgICAgICAgICAgICAgICAgIENoYXJhY3RlciBDb25zdGFudHMKLSogTnVtYmVyczo6ICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIENvbnN0YW50cwotQGVuZCBtZW51Ci0KLUBub2RlIENoYXJhY3RlcnMKLUBzdWJzZWN0aW9uIENoYXJhY3RlciBDb25zdGFudHMKLQotQGNpbmRleCBjaGFyYWN0ZXIgY29uc3RhbnRzCi1AY2luZGV4IGNvbnN0YW50cywgY2hhcmFjdGVyCi1UaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGNoYXJhY3RlciBjb25zdGFudHMuICBBIEBkZm57Y2hhcmFjdGVyfSBzdGFuZHMKLWZvciBvbmUgY2hhcmFjdGVyIGluIG9uZSBieXRlIGFuZCBpdHMgdmFsdWUgbWF5IGJlIHVzZWQgaW4KLW51bWVyaWMgZXhwcmVzc2lvbnMuICBTdHJpbmcgY29uc3RhbnRzIChwcm9wZXJseSBjYWxsZWQgc3RyaW5nCi1AZW1waHtsaXRlcmFsc30pIGFyZSBwb3RlbnRpYWxseSBtYW55IGJ5dGVzIGFuZCB0aGVpciB2YWx1ZXMgbWF5IG5vdCBiZQotdXNlZCBpbiBhcml0aG1ldGljIGV4cHJlc3Npb25zLgotCi1AbWVudQotKiBTdHJpbmdzOjogICAgICAgICAgICAgICAgICAgICBTdHJpbmdzCi0qIENoYXJzOjogICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlcnMKLUBlbmQgbWVudQotCi1Abm9kZSBTdHJpbmdzCi1Ac3Vic3Vic2VjdGlvbiBTdHJpbmdzCi0KLUBjaW5kZXggc3RyaW5nIGNvbnN0YW50cwotQGNpbmRleCBjb25zdGFudHMsIHN0cmluZwotQSBAZGZue3N0cmluZ30gaXMgd3JpdHRlbiBiZXR3ZWVuIGRvdWJsZS1xdW90ZXMuICBJdCBtYXkgY29udGFpbgotZG91YmxlLXF1b3RlcyBvciBudWxsIGNoYXJhY3RlcnMuICBUaGUgd2F5IHRvIGdldCBzcGVjaWFsIGNoYXJhY3RlcnMKLWludG8gYSBzdHJpbmcgaXMgdG8gQGRmbntlc2NhcGV9IHRoZXNlIGNoYXJhY3RlcnM6IHByZWNlZGUgdGhlbSB3aXRoCi1hIGJhY2tzbGFzaCBAc2FtcHtcfSBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZSBAc2FtcHtcXH0gcmVwcmVzZW50cwotb25lIGJhY2tzbGFzaDogIHRoZSBmaXJzdCBAY29kZXtcfSBpcyBhbiBlc2NhcGUgd2hpY2ggdGVsbHMKLUBjb2Rle0B2YWx1ZXtBU319IHRvIGludGVycHJldCB0aGUgc2Vjb25kIGNoYXJhY3RlciBsaXRlcmFsbHkgYXMgYSBiYWNrc2xhc2gKLSh3aGljaCBwcmV2ZW50cyBAY29kZXtAdmFsdWV7QVN9fSBmcm9tIHJlY29nbml6aW5nIHRoZSBzZWNvbmQgQGNvZGV7XH0gYXMgYW4KLWVzY2FwZSBjaGFyYWN0ZXIpLiAgVGhlIGNvbXBsZXRlIGxpc3Qgb2YgZXNjYXBlcyBmb2xsb3dzLgotCi1AY2luZGV4IGVzY2FwZSBjb2RlcywgY2hhcmFjdGVyCi1AY2luZGV4IGNoYXJhY3RlciBlc2NhcGUgY29kZXMKLUB0YWJsZSBAa2JkCi1AYyAgICAgIEBpdGVtIFxhCi1AYyAgICAgIE1uZW1vbmljIGZvciBBQ0tub3dsZWRnZTsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMDcuCi1AYwotQGNpbmRleCBAY29kZXtcYn0gKGJhY2tzcGFjZSBjaGFyYWN0ZXIpCi1AY2luZGV4IGJhY2tzcGFjZSAoQGNvZGV7XGJ9KQotQGl0ZW0gXGIKLU1uZW1vbmljIGZvciBiYWNrc3BhY2U7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDEwLgotCi1AYyAgICAgIEBpdGVtIFxlCi1AYyAgICAgIE1uZW1vbmljIGZvciBFT1RleHQ7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDA0LgotQGMKLUBjaW5kZXggQGNvZGV7XGZ9IChmb3JtZmVlZCBjaGFyYWN0ZXIpCi1AY2luZGV4IGZvcm1mZWVkIChAY29kZXtcZn0pCi1AaXRlbSBcZgotTW5lbW9uaWMgZm9yIEZvcm1GZWVkOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAxNC4KLQotQGNpbmRleCBAY29kZXtcbn0gKG5ld2xpbmUgY2hhcmFjdGVyKQotQGNpbmRleCBuZXdsaW5lIChAY29kZXtcbn0pCi1AaXRlbSBcbgotTW5lbW9uaWMgZm9yIG5ld2xpbmU7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDEyLgotCi1AYyAgICAgIEBpdGVtIFxwCi1AYyAgICAgIE1uZW1vbmljIGZvciBwcmVmaXg7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDMzLCB1c3VhbGx5IGtub3duIGFzIEBjb2Rle2VzY2FwZX0uCi1AYwotQGNpbmRleCBAY29kZXtccn0gKGNhcnJpYWdlIHJldHVybiBjaGFyYWN0ZXIpCi1AY2luZGV4IGNhcnJpYWdlIHJldHVybiAoQGNvZGV7XHJ9KQotQGl0ZW0gXHIKLU1uZW1vbmljIGZvciBjYXJyaWFnZS1SZXR1cm47IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDE1LgotCi1AYyAgICAgIEBpdGVtIFxzCi1AYyAgICAgIE1uZW1vbmljIGZvciBzcGFjZTsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwNDAuICBJbmNsdWRlZCBmb3IgY29tcGxpYW5jZSB3aXRoCi1AYyAgICAgIG90aGVyIGFzc2VtYmxlcnMuCi1AYwotQGNpbmRleCBAY29kZXtcdH0gKHRhYikKLUBjaW5kZXggdGFiIChAY29kZXtcdH0pCi1AaXRlbSBcdAotTW5lbW9uaWMgZm9yIGhvcml6b250YWwgVGFiOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAxMS4KLQotQGMgICAgICBAaXRlbSBcdgotQGMgICAgICBNbmVtb25pYyBmb3IgVmVydGljYWwgdGFiOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAxMy4KLUBjICAgICAgQGl0ZW0gXHggQHZhcntkaWdpdH0gQHZhcntkaWdpdH0gQHZhcntkaWdpdH0KLUBjICAgICAgQSBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIgY29kZS4gIFRoZSBudW1lcmljIGNvZGUgaXMgMyBoZXhhZGVjaW1hbCBkaWdpdHMuCi1AYwotQGNpbmRleCBAY29kZXtcQHZhcntkZGR9fSAob2N0YWwgY2hhcmFjdGVyIGNvZGUpCi1AY2luZGV4IG9jdGFsIGNoYXJhY3RlciBjb2RlIChAY29kZXtcQHZhcntkZGR9fSkKLUBpdGVtIFwgQHZhcntkaWdpdH0gQHZhcntkaWdpdH0gQHZhcntkaWdpdH0KLUFuIG9jdGFsIGNoYXJhY3RlciBjb2RlLiAgVGhlIG51bWVyaWMgY29kZSBpcyAzIG9jdGFsIGRpZ2l0cy4KLUZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgVW5peCBzeXN0ZW1zLCA4IGFuZCA5IGFyZSBhY2NlcHRlZCBhcyBkaWdpdHM6Ci1mb3IgZXhhbXBsZSwgQGNvZGV7XDAwOH0gaGFzIHRoZSB2YWx1ZSAwMTAsIGFuZCBAY29kZXtcMDA5fSB0aGUgdmFsdWUgMDExLgotCi1AY2luZGV4IEBjb2Rle1xAdmFye3hkLi4ufX0gKGhleCBjaGFyYWN0ZXIgY29kZSkKLUBjaW5kZXggaGV4IGNoYXJhY3RlciBjb2RlIChAY29kZXtcQHZhcnt4ZC4uLn19KQotQGl0ZW0gXEBjb2Rle3h9IEB2YXJ7aGV4LWRpZ2l0cy4uLn0KLUEgaGV4IGNoYXJhY3RlciBjb2RlLiAgQWxsIHRyYWlsaW5nIGhleCBkaWdpdHMgYXJlIGNvbWJpbmVkLiAgRWl0aGVyIHVwcGVyIG9yCi1sb3dlciBjYXNlIEBjb2Rle3h9IHdvcmtzLgotCi1AY2luZGV4IEBjb2Rle1xcfSAoQHNhbXB7XH0gY2hhcmFjdGVyKQotQGNpbmRleCBiYWNrc2xhc2ggKEBjb2Rle1xcfSkKLUBpdGVtIFxcCi1SZXByZXNlbnRzIG9uZSBAc2FtcHtcfSBjaGFyYWN0ZXIuCi0KLUBjICAgICAgQGl0ZW0gXCcKLUBjICAgICAgUmVwcmVzZW50cyBvbmUgQHNhbXB7J30gKGFjY2VudCBhY3V0ZSkgY2hhcmFjdGVyLgotQGMgICAgICBUaGlzIGlzIG5lZWRlZCBpbiBzaW5nbGUgY2hhcmFjdGVyIGxpdGVyYWxzCi1AYyAgICAgIChAeHJlZntDaGFyYWN0ZXJzLCxDaGFyYWN0ZXIgQ29uc3RhbnRzfS4pIHRvIHJlcHJlc2VudAotQGMgICAgICBhIEBzYW1weyd9LgotQGMKLUBjaW5kZXggQGNvZGV7XCJ9IChkb3VibGVxdW90ZSBjaGFyYWN0ZXIpCi1AY2luZGV4IGRvdWJsZXF1b3RlIChAY29kZXtcIn0pCi1AaXRlbSBcIgotUmVwcmVzZW50cyBvbmUgQHNhbXB7In0gY2hhcmFjdGVyLiAgTmVlZGVkIGluIHN0cmluZ3MgdG8gcmVwcmVzZW50Ci10aGlzIGNoYXJhY3RlciwgYmVjYXVzZSBhbiB1bmVzY2FwZWQgQHNhbXB7In0gd291bGQgZW5kIHRoZSBzdHJpbmcuCi0KLUBpdGVtIFwgQHZhcnthbnl0aGluZy1lbHNlfQotQW55IG90aGVyIGNoYXJhY3RlciB3aGVuIGVzY2FwZWQgYnkgQGtiZHtcfSBnaXZlcyBhIHdhcm5pbmcsIGJ1dAotYXNzZW1ibGVzIGFzIGlmIHRoZSBAc2FtcHtcfSB3YXMgbm90IHByZXNlbnQuICBUaGUgaWRlYSBpcyB0aGF0IGlmCi15b3UgdXNlZCBhbiBlc2NhcGUgc2VxdWVuY2UgeW91IGNsZWFybHkgZGlkbid0IHdhbnQgdGhlIGxpdGVyYWwKLWludGVycHJldGF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyLiAgSG93ZXZlciBAY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8KLW90aGVyIGludGVycHJldGF0aW9uLCBzbyBAY29kZXtAdmFsdWV7QVN9fSBrbm93cyBpdCBpcyBnaXZpbmcgeW91IHRoZSB3cm9uZwotY29kZSBhbmQgd2FybnMgeW91IG9mIHRoZSBmYWN0LgotQGVuZCB0YWJsZQotCi1XaGljaCBjaGFyYWN0ZXJzIGFyZSBlc2NhcGFibGUsIGFuZCB3aGF0IHRob3NlIGVzY2FwZXMgcmVwcmVzZW50LAotdmFyaWVzIHdpZGVseSBhbW9uZyBhc3NlbWJsZXJzLiAgVGhlIGN1cnJlbnQgc2V0IGlzIHdoYXQgd2UgdGhpbmsKLXRoZSBCU0QgNC4yIGFzc2VtYmxlciByZWNvZ25pemVzLCBhbmQgaXMgYSBzdWJzZXQgb2Ygd2hhdCBtb3N0IEMKLWNvbXBpbGVycyByZWNvZ25pemUuICBJZiB5b3UgYXJlIGluIGRvdWJ0LCBkbyBub3QgdXNlIGFuIGVzY2FwZQotc2VxdWVuY2UuCi0KLUBub2RlIENoYXJzCi1Ac3Vic3Vic2VjdGlvbiBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggc2luZ2xlIGNoYXJhY3RlciBjb25zdGFudAotQGNpbmRleCBjaGFyYWN0ZXIsIHNpbmdsZQotQGNpbmRleCBjb25zdGFudCwgc2luZ2xlIGNoYXJhY3RlcgotQSBzaW5nbGUgY2hhcmFjdGVyIG1heSBiZSB3cml0dGVuIGFzIGEgc2luZ2xlIHF1b3RlIGltbWVkaWF0ZWx5Ci1mb2xsb3dlZCBieSB0aGF0IGNoYXJhY3Rlci4gIFRoZSBzYW1lIGVzY2FwZXMgYXBwbHkgdG8gY2hhcmFjdGVycyBhcwotdG8gc3RyaW5ncy4gIFNvIGlmIHlvdSB3YW50IHRvIHdyaXRlIHRoZSBjaGFyYWN0ZXIgYmFja3NsYXNoLCB5b3UKLW11c3Qgd3JpdGUgQGtiZHsnXFx9IHdoZXJlIHRoZSBmaXJzdCBAY29kZXtcfSBlc2NhcGVzIHRoZSBzZWNvbmQKLUBjb2Rle1x9LiAgQXMgeW91IGNhbiBzZWUsIHRoZSBxdW90ZSBpcyBhbiBhY3V0ZSBhY2NlbnQsIG5vdCBhCi1ncmF2ZSBhY2NlbnQuICBBIG5ld2xpbmUKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZmNsZWFyIGFibm9ybWFsLXNlcGFyYXRvcgotKG9yIHNlbWljb2xvbiBAc2FtcHs7fSkKLUBlbmQgaWZjbGVhcgotQGlmc2V0IGFibm9ybWFsLXNlcGFyYXRvcgotQGlmc2V0IEEyOUsKLShvciBhdCBzaWduIEBzYW1we0BAfSkKLUBlbmQgaWZzZXQKLUBpZnNldCBIOAotKG9yIGRvbGxhciBzaWduIEBzYW1weyR9LCBmb3IgdGhlIEg4LzMwMDsgb3Igc2VtaWNvbG9uIEBzYW1wezt9IGZvciB0aGUKLUhpdGFjaGkgU0ggb3IKLUg4LzUwMCkKLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotaW1tZWRpYXRlbHkgZm9sbG93aW5nIGFuIGFjdXRlIGFjY2VudCBpcyB0YWtlbiBhcyBhIGxpdGVyYWwgY2hhcmFjdGVyCi1hbmQgZG9lcyBub3QgY291bnQgYXMgdGhlIGVuZCBvZiBhIHN0YXRlbWVudC4gIFRoZSB2YWx1ZSBvZiBhIGNoYXJhY3RlcgotY29uc3RhbnQgaW4gYSBudW1lcmljIGV4cHJlc3Npb24gaXMgdGhlIG1hY2hpbmUncyBieXRlLXdpZGUgY29kZSBmb3IKLXRoYXQgY2hhcmFjdGVyLiAgQGNvZGV7QHZhbHVle0FTfX0gYXNzdW1lcyB5b3VyIGNoYXJhY3RlciBjb2RlIGlzIEFTQ0lJOgotQGtiZHsnQX0gbWVhbnMgNjUsIEBrYmR7J0J9IG1lYW5zIDY2LCBhbmQgc28gb24uIEByZWZpbGwKLQotQG5vZGUgTnVtYmVycwotQHN1YnNlY3Rpb24gTnVtYmVyIENvbnN0YW50cwotCi1AY2luZGV4IGNvbnN0YW50cywgbnVtYmVyCi1AY2luZGV4IG51bWJlciBjb25zdGFudHMKLUBjb2Rle0B2YWx1ZXtBU319IGRpc3Rpbmd1aXNoZXMgdGhyZWUga2luZHMgb2YgbnVtYmVycyBhY2NvcmRpbmcgdG8gaG93IHRoZXkKLWFyZSBzdG9yZWQgaW4gdGhlIHRhcmdldCBtYWNoaW5lLiAgQGVtcGh7SW50ZWdlcnN9IGFyZSBudW1iZXJzIHRoYXQKLXdvdWxkIGZpdCBpbnRvIGFuIEBjb2Rle2ludH0gaW4gdGhlIEMgbGFuZ3VhZ2UuICBAZW1waHtCaWdudW1zfSBhcmUKLWludGVnZXJzLCBidXQgdGhleSBhcmUgc3RvcmVkIGluIG1vcmUgdGhhbiAzMiBiaXRzLiAgQGVtcGh7RmxvbnVtc30KLWFyZSBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBkZXNjcmliZWQgYmVsb3cuCi0KLUBtZW51Ci0qIEludGVnZXJzOjogICAgICAgICAgICAgICAgICAgIEludGVnZXJzCi0qIEJpZ251bXM6OiAgICAgICAgICAgICAgICAgICAgIEJpZ251bXMKLSogRmxvbnVtczo6ICAgICAgICAgICAgICAgICAgICAgRmxvbnVtcwotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEk5NjAKLSogQml0IEZpZWxkczo6ICAgICAgICAgICAgICAgICAgQml0IEZpZWxkcwotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AZW5kIG1lbnUKLQotQG5vZGUgSW50ZWdlcnMKLUBzdWJzdWJzZWN0aW9uIEludGVnZXJzCi1AY2luZGV4IGludGVnZXJzCi1AY2luZGV4IGNvbnN0YW50cywgaW50ZWdlcgotCi1AY2luZGV4IGJpbmFyeSBpbnRlZ2VycwotQGNpbmRleCBpbnRlZ2VycywgYmluYXJ5Ci1BIGJpbmFyeSBpbnRlZ2VyIGlzIEBzYW1wezBifSBvciBAc2FtcHswQn0gZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIG9mCi10aGUgYmluYXJ5IGRpZ2l0cyBAc2FtcHswMX0uCi0KLUBjaW5kZXggb2N0YWwgaW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlcnMsIG9jdGFsCi1BbiBvY3RhbCBpbnRlZ2VyIGlzIEBzYW1wezB9IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBvZiB0aGUgb2N0YWwKLWRpZ2l0cyAoQHNhbXB7MDEyMzQ1Njd9KS4KLQotQGNpbmRleCBkZWNpbWFsIGludGVnZXJzCi1AY2luZGV4IGludGVnZXJzLCBkZWNpbWFsCi1BIGRlY2ltYWwgaW50ZWdlciBzdGFydHMgd2l0aCBhIG5vbi16ZXJvIGRpZ2l0IGZvbGxvd2VkIGJ5IHplcm8gb3IKLW1vcmUgZGlnaXRzIChAc2FtcHswMTIzNDU2Nzg5fSkuCi0KLUBjaW5kZXggaGV4YWRlY2ltYWwgaW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlcnMsIGhleGFkZWNpbWFsCi1BIGhleGFkZWNpbWFsIGludGVnZXIgaXMgQHNhbXB7MHh9IG9yIEBzYW1wezBYfSBmb2xsb3dlZCBieSBvbmUgb3IKLW1vcmUgaGV4YWRlY2ltYWwgZGlnaXRzIGNob3NlbiBmcm9tIEBzYW1wezAxMjM0NTY3ODlhYmNkZWZBQkNERUZ9LgotCi1JbnRlZ2VycyBoYXZlIHRoZSB1c3VhbCB2YWx1ZXMuICBUbyBkZW5vdGUgYSBuZWdhdGl2ZSBpbnRlZ2VyLCB1c2UKLXRoZSBwcmVmaXggb3BlcmF0b3IgQHNhbXB7LX0gZGlzY3Vzc2VkIHVuZGVyIGV4cHJlc3Npb25zCi0oQHB4cmVme1ByZWZpeCBPcHMsLFByZWZpeCBPcGVyYXRvcnN9KS4KLQotQG5vZGUgQmlnbnVtcwotQHN1YnN1YnNlY3Rpb24gQmlnbnVtcwotCi1AY2luZGV4IGJpZ251bXMKLUBjaW5kZXggY29uc3RhbnRzLCBiaWdudW0KLUEgQGRmbntiaWdudW19IGhhcyB0aGUgc2FtZSBzeW50YXggYW5kIHNlbWFudGljcyBhcyBhbiBpbnRlZ2VyCi1leGNlcHQgdGhhdCB0aGUgbnVtYmVyIChvciBpdHMgbmVnYXRpdmUpIHRha2VzIG1vcmUgdGhhbiAzMiBiaXRzIHRvCi1yZXByZXNlbnQgaW4gYmluYXJ5LiAgVGhlIGRpc3RpbmN0aW9uIGlzIG1hZGUgYmVjYXVzZSBpbiBzb21lIHBsYWNlcwotaW50ZWdlcnMgYXJlIHBlcm1pdHRlZCB3aGlsZSBiaWdudW1zIGFyZSBub3QuCi0KLUBub2RlIEZsb251bXMKLUBzdWJzdWJzZWN0aW9uIEZsb251bXMKLUBjaW5kZXggZmxvbnVtcwotQGNpbmRleCBmbG9hdGluZyBwb2ludCBudW1iZXJzCi1AY2luZGV4IGNvbnN0YW50cywgZmxvYXRpbmcgcG9pbnQKLQotQGNpbmRleCBwcmVjaXNpb24sIGZsb2F0aW5nIHBvaW50Ci1BIEBkZm57ZmxvbnVtfSByZXByZXNlbnRzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgVGhlIHRyYW5zbGF0aW9uIGlzCi1pbmRpcmVjdDogYSBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IG51bWJlciBmcm9tIHRoZSB0ZXh0IGlzIGNvbnZlcnRlZCBieQotQGNvZGV7QHZhbHVle0FTfX0gdG8gYSBnZW5lcmljIGJpbmFyeSBmbG9hdGluZyBwb2ludCBudW1iZXIgb2YgbW9yZSB0aGFuCi1zdWZmaWNpZW50IHByZWNpc2lvbi4gIFRoaXMgZ2VuZXJpYyBmbG9hdGluZyBwb2ludCBudW1iZXIgaXMgY29udmVydGVkCi10byBhIHBhcnRpY3VsYXIgY29tcHV0ZXIncyBmbG9hdGluZyBwb2ludCBmb3JtYXQgKG9yIGZvcm1hdHMpIGJ5IGEKLXBvcnRpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gc3BlY2lhbGl6ZWQgdG8gdGhhdCBjb21wdXRlci4KLQotQSBmbG9udW0gaXMgd3JpdHRlbiBieSB3cml0aW5nIChpbiBvcmRlcikKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1UaGUgZGlnaXQgQHNhbXB7MH0uCi1AaWZzZXQgSFBQQQotKEBzYW1wezB9IGlzIG9wdGlvbmFsIG9uIHRoZSBIUFBBLikKLUBlbmQgaWZzZXQKLQotQGl0ZW0KLUEgbGV0dGVyLCB0byB0ZWxsIEBjb2Rle0B2YWx1ZXtBU319IHRoZSByZXN0IG9mIHRoZSBudW1iZXIgaXMgYSBmbG9udW0uCi1AaWZzZXQgR0VORVJJQwotQGtiZHtlfSBpcyByZWNvbW1lbmRlZC4gIENhc2UgaXMgbm90IGltcG9ydGFudC4KLUBpZ25vcmUKLUBjIEZJWE1FOiB2ZXJpZnkgaWYgZmxvbnVtIHN5bnRheCByZWFsbHkgdGhpcyB2YWd1ZSBmb3IgbW9zdCBjYXNlcwotKEFueSBvdGhlcndpc2UgaWxsZWdhbCBsZXR0ZXIgd29ya3MgaGVyZSwgYnV0IHRoYXQgbWlnaHQgYmUgY2hhbmdlZC4gIFZheCBCU0QKLTQuMiBhc3NlbWJsZXIgc2VlbXMgdG8gYWxsb3cgYW55IG9mIEBzYW1we2RlZmdoREVGR0h9LikKLUBlbmQgaWdub3JlCi0KLU9uIHRoZSBIOC8zMDAsIEg4LzUwMCwKLUhpdGFjaGkgU0gsCi1hbmQgQU1EIDI5SyBhcmNoaXRlY3R1cmVzLCB0aGUgbGV0dGVyIG11c3QgYmUKLW9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlBSU1h9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLQotT24gdGhlIEFSQywgdGhlIGxldHRlciBtdXN0IGJlIG9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlJTfQotKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotCi1PbiB0aGUgSW50ZWwgOTYwIGFyY2hpdGVjdHVyZSwgdGhlIGxldHRlciBtdXN0IGJlCi1vbmUgb2YgdGhlIGxldHRlcnMgQHNhbXB7REZUfSAoaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSkuCi0KLU9uIHRoZSBIUFBBIGFyY2hpdGVjdHVyZSwgdGhlIGxldHRlciBtdXN0IGJlIEBzYW1we0V9ICh1cHBlciBjYXNlIG9ubHkpLgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEEyOUsKLU9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlBSU1h9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBBUkMKLU9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlJTfSAoaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgKLU9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlBSU1h9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi1UaGUgbGV0dGVyIEBzYW1we0V9ICh1cHBlciBjYXNlIG9ubHkpLgotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLU9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlR9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1AaXRlbQotQW4gb3B0aW9uYWwgc2lnbjogZWl0aGVyIEBzYW1weyt9IG9yIEBzYW1wey19LgotCi1AaXRlbQotQW4gb3B0aW9uYWwgQGRmbntpbnRlZ2VyIHBhcnR9OiB6ZXJvIG9yIG1vcmUgZGVjaW1hbCBkaWdpdHMuCi0KLUBpdGVtCi1BbiBvcHRpb25hbCBAZGZue2ZyYWN0aW9uYWwgcGFydH06IEBzYW1wey59IGZvbGxvd2VkIGJ5IHplcm8KLW9yIG1vcmUgZGVjaW1hbCBkaWdpdHMuCi0KLUBpdGVtCi1BbiBvcHRpb25hbCBleHBvbmVudCwgY29uc2lzdGluZyBvZjoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUFuIEBzYW1we0V9IG9yIEBzYW1we2V9LgotQGMgSSBjYW4ndCBmaW5kIGEgY29uZmlnIHdoZXJlICJFWFBfQ0hBUlMiIGlzIG90aGVyIHRoYW4gJ2VFJywgYnV0IGluCi1AYyBwcmluY2lwbGUgdGhpcyBjYW4gcGVyZmVjdGx5IHdlbGwgYmUgZGlmZmVyZW50IG9uIGRpZmZlcmVudCB0YXJnZXRzLgotQGl0ZW0KLU9wdGlvbmFsIHNpZ246IGVpdGhlciBAc2FtcHsrfSBvciBAc2FtcHstfS4KLUBpdGVtCi1PbmUgb3IgbW9yZSBkZWNpbWFsIGRpZ2l0cy4KLUBlbmQgaXRlbWl6ZQotCi1AZW5kIGl0ZW1pemUKLQotQXQgbGVhc3Qgb25lIG9mIHRoZSBpbnRlZ2VyIHBhcnQgb3IgdGhlIGZyYWN0aW9uYWwgcGFydCBtdXN0IGJlCi1wcmVzZW50LiAgVGhlIGZsb2F0aW5nIHBvaW50IG51bWJlciBoYXMgdGhlIHVzdWFsIGJhc2UtMTAgdmFsdWUuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGRvZXMgYWxsIHByb2Nlc3NpbmcgdXNpbmcgaW50ZWdlcnMuICBGbG9udW1zIGFyZSBjb21wdXRlZAotaW5kZXBlbmRlbnRseSBvZiBhbnkgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUgaW4gdGhlIGNvbXB1dGVyIHJ1bm5pbmcKLUBjb2Rle0B2YWx1ZXtBU319LgotCi1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSTk2MAotQGMgQml0IGZpZWxkcyBhcmUgd3JpdHRlbiBhcyBhIGdlbmVyYWwgZmFjaWxpdHkgYnV0IGFyZSBhbHNvIGNvbnRyb2xsZWQKLUBjIGJ5IGEgY29uZGl0aW9uYWwtY29tcGlsYXRpb24gZmxhZy0tLXdoaWNoIGlzIGFzIG9mIG5vdyAoMjFtYXI5MSkKLUBjIHR1cm5lZCBvbiBvbmx5IGJ5IHRoZSBpOTYwIGNvbmZpZyBvZiBHQVMuCi1Abm9kZSBCaXQgRmllbGRzCi1Ac3Vic3Vic2VjdGlvbiBCaXQgRmllbGRzCi0KLUBjaW5kZXggYml0IGZpZWxkcwotQGNpbmRleCBjb25zdGFudHMsIGJpdCBmaWVsZAotWW91IGNhbiBhbHNvIGRlZmluZSBudW1lcmljIGNvbnN0YW50cyBhcyBAZGZue2JpdCBmaWVsZHN9Lgotc3BlY2lmeSB0d28gbnVtYmVycyBzZXBhcmF0ZWQgYnkgYSBjb2xvbi0tLQotQGV4YW1wbGUKLUB2YXJ7bWFza306QHZhcnt2YWx1ZX0KLUBlbmQgZXhhbXBsZQotQG5vaW5kZW50Ci1AY29kZXtAdmFsdWV7QVN9fSBhcHBsaWVzIGEgYml0d2lzZSBAc2N7YW5kfSBiZXR3ZWVuIEB2YXJ7bWFza30gYW5kCi1AdmFye3ZhbHVlfS4KLQotVGhlIHJlc3VsdGluZyBudW1iZXIgaXMgdGhlbiBwYWNrZWQKLUBpZnNldCBHRU5FUklDCi1AYyB0aGlzIGNvbmRpdGlvbmFsIHBhcmVuIGluIGNhc2UgYml0IGZpZWxkcyB0dXJuZWQgb24gZWxzZXdoZXJlIHRoYW4gOTYwCi0oaW4gaG9zdC1kZXBlbmRlbnQgYnl0ZSBvcmRlcikKLUBlbmQgaWZzZXQKLWludG8gYSBmaWVsZCB3aG9zZSB3aWR0aCBkZXBlbmRzIG9uIHdoaWNoIGFzc2VtYmxlciBkaXJlY3RpdmUgaGFzIHRoZQotYml0LWZpZWxkIGFzIGl0cyBhcmd1bWVudC4gIE92ZXJmbG93IChhIHJlc3VsdCBmcm9tIHRoZSBiaXR3aXNlIGFuZAotcmVxdWlyaW5nIG1vcmUgYmluYXJ5IGRpZ2l0cyB0byByZXByZXNlbnQpIGlzIG5vdCBhbiBlcnJvcjsgaW5zdGVhZCwKLW1vcmUgY29uc3RhbnRzIGFyZSBnZW5lcmF0ZWQsIG9mIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGJlZ2lubmluZyB3aXRoIHRoZQotbGVhc3Qgc2lnbmlmaWNhbnQgZGlnaXRzLkByZWZpbGwKLQotVGhlIGRpcmVjdGl2ZXMgQGNvZGV7LmJ5dGV9LCBAY29kZXsuaHdvcmR9LCBAY29kZXsuaW50fSwgQGNvZGV7Lmxvbmd9LAotQGNvZGV7LnNob3J0fSwgYW5kIEBjb2Rley53b3JkfSBhY2NlcHQgYml0LWZpZWxkIGFyZ3VtZW50cy4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBTZWN0aW9ucwotQGNoYXB0ZXIgU2VjdGlvbnMgYW5kIFJlbG9jYXRpb24KLUBjaW5kZXggc2VjdGlvbnMKLUBjaW5kZXggcmVsb2NhdGlvbgotCi1AbWVudQotKiBTZWNzIEJhY2tncm91bmQ6OiAgICAgICAgICAgICBCYWNrZ3JvdW5kCi0qIExkIFNlY3Rpb25zOjogICAgICAgICAgICAgICAgIExpbmtlciBTZWN0aW9ucwotKiBBcyBTZWN0aW9uczo6ICAgICAgICAgICAgICAgICBBc3NlbWJsZXIgSW50ZXJuYWwgU2VjdGlvbnMKLSogU3ViLVNlY3Rpb25zOjogICAgICAgICAgICAgICAgU3ViLVNlY3Rpb25zCi0qIGJzczo6ICAgICAgICAgICAgICAgICAgICAgICAgIGJzcyBTZWN0aW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgU2VjcyBCYWNrZ3JvdW5kCi1Ac2VjdGlvbiBCYWNrZ3JvdW5kCi0KLVJvdWdobHksIGEgc2VjdGlvbiBpcyBhIHJhbmdlIG9mIGFkZHJlc3Nlcywgd2l0aCBubyBnYXBzOyBhbGwgZGF0YQotYGBpbicnIHRob3NlIGFkZHJlc3NlcyBpcyB0cmVhdGVkIHRoZSBzYW1lIGZvciBzb21lIHBhcnRpY3VsYXIgcHVycG9zZS4KLUZvciBleGFtcGxlIHRoZXJlIG1heSBiZSBhIGBgcmVhZCBvbmx5Jycgc2VjdGlvbi4KLQotQGNpbmRleCBsaW5rZXIsIGFuZCBhc3NlbWJsZXIKLUBjaW5kZXggYXNzZW1ibGVyLCBhbmQgbGlua2VyCi1UaGUgbGlua2VyIEBjb2Rle0B2YWx1ZXtMRH19IHJlYWRzIG1hbnkgb2JqZWN0IGZpbGVzIChwYXJ0aWFsIHByb2dyYW1zKSBhbmQKLWNvbWJpbmVzIHRoZWlyIGNvbnRlbnRzIHRvIGZvcm0gYSBydW5uYWJsZSBwcm9ncmFtLiAgV2hlbiBAY29kZXtAdmFsdWV7QVN9fQotZW1pdHMgYW4gb2JqZWN0IGZpbGUsIHRoZSBwYXJ0aWFsIHByb2dyYW0gaXMgYXNzdW1lZCB0byBzdGFydCBhdCBhZGRyZXNzIDAuCi1AY29kZXtAdmFsdWV7TER9fSBhc3NpZ25zIHRoZSBmaW5hbCBhZGRyZXNzZXMgZm9yIHRoZSBwYXJ0aWFsIHByb2dyYW0sIHNvIHRoYXQKLWRpZmZlcmVudCBwYXJ0aWFsIHByb2dyYW1zIGRvIG5vdCBvdmVybGFwLiAgVGhpcyBpcyBhY3R1YWxseSBhbgotb3ZlcnNpbXBsaWZpY2F0aW9uLCBidXQgaXQgc3VmZmljZXMgdG8gZXhwbGFpbiBob3cgQGNvZGV7QHZhbHVle0FTfX0gdXNlcwotc2VjdGlvbnMuCi0KLUBjb2Rle0B2YWx1ZXtMRH19IG1vdmVzIGJsb2NrcyBvZiBieXRlcyBvZiB5b3VyIHByb2dyYW0gdG8gdGhlaXIgcnVuLXRpbWUKLWFkZHJlc3Nlcy4gIFRoZXNlIGJsb2NrcyBzbGlkZSB0byB0aGVpciBydW4tdGltZSBhZGRyZXNzZXMgYXMgcmlnaWQKLXVuaXRzOyB0aGVpciBsZW5ndGggZG9lcyBub3QgY2hhbmdlIGFuZCBuZWl0aGVyIGRvZXMgdGhlIG9yZGVyIG9mIGJ5dGVzCi13aXRoaW4gdGhlbS4gIFN1Y2ggYSByaWdpZCB1bml0IGlzIGNhbGxlZCBhIEBlbXBoe3NlY3Rpb259LiAgQXNzaWduaW5nCi1ydW4tdGltZSBhZGRyZXNzZXMgdG8gc2VjdGlvbnMgaXMgY2FsbGVkIEBkZm57cmVsb2NhdGlvbn0uICBJdCBpbmNsdWRlcwotdGhlIHRhc2sgb2YgYWRqdXN0aW5nIG1lbnRpb25zIG9mIG9iamVjdC1maWxlIGFkZHJlc3NlcyBzbyB0aGV5IHJlZmVyIHRvCi10aGUgcHJvcGVyIHJ1bi10aW1lIGFkZHJlc3Nlcy4KLUBpZnNldCBIOAotRm9yIHRoZSBIOC8zMDAgYW5kIEg4LzUwMCwKLWFuZCBmb3IgdGhlIEhpdGFjaGkgU0gsCi1AY29kZXtAdmFsdWV7QVN9fSBwYWRzIHNlY3Rpb25zIGlmIG5lZWRlZCB0bwotZW5zdXJlIHRoZXkgZW5kIG9uIGEgd29yZCAoc2l4dGVlbiBiaXQpIGJvdW5kYXJ5LgotQGVuZCBpZnNldAotCi1AY2luZGV4IHN0YW5kYXJkIGFzc2VtYmxlciBzZWN0aW9ucwotQW4gb2JqZWN0IGZpbGUgd3JpdHRlbiBieSBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYXQgbGVhc3QgdGhyZWUgc2VjdGlvbnMsIGFueQotb2Ygd2hpY2ggbWF5IGJlIGVtcHR5LiAgVGhlc2UgYXJlIG5hbWVkIEBkZm57dGV4dH0sIEBkZm57ZGF0YX0gYW5kCi1AZGZue2Jzc30gc2VjdGlvbnMuCi0KLUBpZnNldCBDT0ZGCi1AaWZzZXQgR0VORVJJQwotV2hlbiBpdCBnZW5lcmF0ZXMgQ09GRiBvdXRwdXQsCi1AZW5kIGlmc2V0Ci1AY29kZXtAdmFsdWV7QVN9fSBjYW4gYWxzbyBnZW5lcmF0ZSB3aGF0ZXZlciBvdGhlciBuYW1lZCBzZWN0aW9ucyB5b3Ugc3BlY2lmeQotdXNpbmcgdGhlIEBzYW1wey5zZWN0aW9ufSBkaXJlY3RpdmUgKEBweHJlZntTZWN0aW9uLCxAY29kZXsuc2VjdGlvbn19KS4KLUlmIHlvdSBkbyBub3QgdXNlIGFueSBkaXJlY3RpdmVzIHRoYXQgcGxhY2Ugb3V0cHV0IGluIHRoZSBAc2FtcHsudGV4dH0KLW9yIEBzYW1wey5kYXRhfSBzZWN0aW9ucywgdGhlc2Ugc2VjdGlvbnMgc3RpbGwgZXhpc3QsIGJ1dCBhcmUgZW1wdHkuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIUFBBCi1AaWZzZXQgR0VORVJJQwotV2hlbiBAY29kZXtAdmFsdWV7QVN9fSBnZW5lcmF0ZXMgU09NIG9yIEVMRiBvdXRwdXQgZm9yIHRoZSBIUFBBLAotQGVuZCBpZnNldAotQGNvZGV7QHZhbHVle0FTfX0gY2FuIGFsc28gZ2VuZXJhdGUgd2hhdGV2ZXIgb3RoZXIgbmFtZWQgc2VjdGlvbnMgeW91Ci1zcGVjaWZ5IHVzaW5nIHRoZSBAc2FtcHsuc3BhY2V9IGFuZCBAc2FtcHsuc3Vic3BhY2V9IGRpcmVjdGl2ZXMuICBTZWUKLUBjaXRle0hQOTAwMCBTZXJpZXMgODAwIEFzc2VtYmx5IExhbmd1YWdlIFJlZmVyZW5jZSBNYW51YWx9Ci0oSFAgOTI0MzItOTAwMDEpIGZvciBkZXRhaWxzIG9uIHRoZSBAc2FtcHsuc3BhY2V9IGFuZCBAc2FtcHsuc3Vic3BhY2V9Ci1hc3NlbWJsZXIgZGlyZWN0aXZlcy4KLQotQGlmc2V0IFNPTQotQWRkaXRpb25hbGx5LCBAY29kZXtAdmFsdWV7QVN9fSB1c2VzIGRpZmZlcmVudCBuYW1lcyBmb3IgdGhlIHN0YW5kYXJkCi10ZXh0LCBkYXRhLCBhbmQgYnNzIHNlY3Rpb25zIHdoZW4gZ2VuZXJhdGluZyBTT00gb3V0cHV0LiAgUHJvZ3JhbSB0ZXh0Ci1pcyBwbGFjZWQgaW50byB0aGUgQHNhbXB7JENPREUkfSBzZWN0aW9uLCBkYXRhIGludG8gQHNhbXB7JERBVEEkfSwgYW5kCi1CU1MgaW50byBAc2FtcHskQlNTJH0uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLVdpdGhpbiB0aGUgb2JqZWN0IGZpbGUsIHRoZSB0ZXh0IHNlY3Rpb24gc3RhcnRzIGF0IGFkZHJlc3MgQGNvZGV7MH0sIHRoZQotZGF0YSBzZWN0aW9uIGZvbGxvd3MsIGFuZCB0aGUgYnNzIHNlY3Rpb24gZm9sbG93cyB0aGUgZGF0YSBzZWN0aW9uLgotCi1AaWZzZXQgSFBQQQotV2hlbiBnZW5lcmF0aW5nIGVpdGhlciBTT00gb3IgRUxGIG91dHB1dCBmaWxlcyBvbiB0aGUgSFBQQSwgdGhlIHRleHQKLXNlY3Rpb24gc3RhcnRzIGF0IGFkZHJlc3MgQGNvZGV7MH0sIHRoZSBkYXRhIHNlY3Rpb24gYXQgYWRkcmVzcwotQGNvZGV7MHg0MDAwMDAwfSwgYW5kIHRoZSBic3Mgc2VjdGlvbiBmb2xsb3dzIHRoZSBkYXRhIHNlY3Rpb24uCi1AZW5kIGlmc2V0Ci0KLVRvIGxldCBAY29kZXtAdmFsdWV7TER9fSBrbm93IHdoaWNoIGRhdGEgY2hhbmdlcyB3aGVuIHRoZSBzZWN0aW9ucyBhcmUKLXJlbG9jYXRlZCwgYW5kIGhvdyB0byBjaGFuZ2UgdGhhdCBkYXRhLCBAY29kZXtAdmFsdWV7QVN9fSBhbHNvIHdyaXRlcyB0byB0aGUKLW9iamVjdCBmaWxlIGRldGFpbHMgb2YgdGhlIHJlbG9jYXRpb24gbmVlZGVkLiAgVG8gcGVyZm9ybSByZWxvY2F0aW9uCi1AY29kZXtAdmFsdWV7TER9fSBtdXN0IGtub3csIGVhY2ggdGltZSBhbiBhZGRyZXNzIGluIHRoZSBvYmplY3QKLWZpbGUgaXMgbWVudGlvbmVkOgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVdoZXJlIGluIHRoZSBvYmplY3QgZmlsZSBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgcmVmZXJlbmNlIHRvCi1hbiBhZGRyZXNzPwotQGl0ZW0KLUhvdyBsb25nIChpbiBieXRlcykgaXMgdGhpcyByZWZlcmVuY2U/Ci1AaXRlbQotV2hpY2ggc2VjdGlvbiBkb2VzIHRoZSBhZGRyZXNzIHJlZmVyIHRvPyAgV2hhdCBpcyB0aGUgbnVtZXJpYyB2YWx1ZSBvZgotQGRpc3BsYXkKLShAdmFye2FkZHJlc3N9KSBAbWludXN7fSAoQHZhcntzdGFydC1hZGRyZXNzIG9mIHNlY3Rpb259KT8KLUBlbmQgZGlzcGxheQotQGl0ZW0KLUlzIHRoZSByZWZlcmVuY2UgdG8gYW4gYWRkcmVzcyBgYFByb2dyYW0tQ291bnRlciByZWxhdGl2ZScnPwotQGVuZCBpdGVtaXplCi0KLUBjaW5kZXggYWRkcmVzc2VzLCBmb3JtYXQgb2YKLUBjaW5kZXggc2VjdGlvbi1yZWxhdGl2ZSBhZGRyZXNzaW5nCi1JbiBmYWN0LCBldmVyeSBhZGRyZXNzIEBjb2Rle0B2YWx1ZXtBU319IGV2ZXIgdXNlcyBpcyBleHByZXNzZWQgYXMKLUBkaXNwbGF5Ci0oQHZhcntzZWN0aW9ufSkgKyAoQHZhcntvZmZzZXQgaW50byBzZWN0aW9ufSkKLUBlbmQgZGlzcGxheQotQG5vaW5kZW50Ci1GdXJ0aGVyLCBtb3N0IGV4cHJlc3Npb25zIEBjb2Rle0B2YWx1ZXtBU319IGNvbXB1dGVzIGhhdmUgdGhpcyBzZWN0aW9uLXJlbGF0aXZlCi1uYXR1cmUuCi1AaWZzZXQgU09NCi0oRm9yIHNvbWUgb2JqZWN0IGZvcm1hdHMsIHN1Y2ggYXMgU09NIGZvciB0aGUgSFBQQSwgc29tZSBleHByZXNzaW9ucyBhcmUKLXN5bWJvbC1yZWxhdGl2ZSBpbnN0ZWFkLikKLUBlbmQgaWZzZXQKLQotSW4gdGhpcyBtYW51YWwgd2UgdXNlIHRoZSBub3RhdGlvbiBAe0B2YXJ7c2VjbmFtZX0gQHZhcntOfUB9IHRvIG1lYW4gYGBvZmZzZXQKLUB2YXJ7Tn0gaW50byBzZWN0aW9uIEB2YXJ7c2VjbmFtZX0uJycKLQotQXBhcnQgZnJvbSB0ZXh0LCBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgeW91IG5lZWQgdG8ga25vdyBhYm91dCB0aGUKLUBkZm57YWJzb2x1dGV9IHNlY3Rpb24uICBXaGVuIEBjb2Rle0B2YWx1ZXtMRH19IG1peGVzIHBhcnRpYWwgcHJvZ3JhbXMsCi1hZGRyZXNzZXMgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24gcmVtYWluIHVuY2hhbmdlZC4gIEZvciBleGFtcGxlLCBhZGRyZXNzCi1AY29kZXtAe2Fic29sdXRlIDBAfX0gaXMgYGByZWxvY2F0ZWQnJyB0byBydW4tdGltZSBhZGRyZXNzIDAgYnkKLUBjb2Rle0B2YWx1ZXtMRH19LiAgQWx0aG91Z2ggdGhlIGxpbmtlciBuZXZlciBhcnJhbmdlcyB0d28gcGFydGlhbCBwcm9ncmFtcycKLWRhdGEgc2VjdGlvbnMgd2l0aCBvdmVybGFwcGluZyBhZGRyZXNzZXMgYWZ0ZXIgbGlua2luZywgQGVtcGh7YnkgZGVmaW5pdGlvbn0KLXRoZWlyIGFic29sdXRlIHNlY3Rpb25zIG11c3Qgb3ZlcmxhcC4gIEFkZHJlc3MgQGNvZGV7QHthYnNvbHV0ZUAgMjM5QH19IGluIG9uZQotcGFydCBvZiBhIHByb2dyYW0gaXMgYWx3YXlzIHRoZSBzYW1lIGFkZHJlc3Mgd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW5uaW5nIGFzCi1hZGRyZXNzIEBjb2Rle0B7YWJzb2x1dGVAIDIzOUB9fSBpbiBhbnkgb3RoZXIgcGFydCBvZiB0aGUgcHJvZ3JhbS4KLQotVGhlIGlkZWEgb2Ygc2VjdGlvbnMgaXMgZXh0ZW5kZWQgdG8gdGhlIEBkZm57dW5kZWZpbmVkfSBzZWN0aW9uLiAgQW55Ci1hZGRyZXNzIHdob3NlIHNlY3Rpb24gaXMgdW5rbm93biBhdCBhc3NlbWJseSB0aW1lIGlzIGJ5IGRlZmluaXRpb24KLXJlbmRlcmVkIEB7dW5kZWZpbmVkIEB2YXJ7VX1AfS0tLXdoZXJlIEB2YXJ7VX0gaXMgZmlsbGVkIGluIGxhdGVyLgotU2luY2UgbnVtYmVycyBhcmUgYWx3YXlzIGRlZmluZWQsIHRoZSBvbmx5IHdheSB0byBnZW5lcmF0ZSBhbiB1bmRlZmluZWQKLWFkZHJlc3MgaXMgdG8gbWVudGlvbiBhbiB1bmRlZmluZWQgc3ltYm9sLiAgQSByZWZlcmVuY2UgdG8gYSBuYW1lZAotY29tbW9uIGJsb2NrIHdvdWxkIGJlIHN1Y2ggYSBzeW1ib2w6IGl0cyB2YWx1ZSBpcyB1bmtub3duIGF0IGFzc2VtYmx5Ci10aW1lIHNvIGl0IGhhcyBzZWN0aW9uIEBlbXBoe3VuZGVmaW5lZH0uCi0KLUJ5IGFuYWxvZ3kgdGhlIHdvcmQgQGVtcGh7c2VjdGlvbn0gaXMgdXNlZCB0byBkZXNjcmliZSBncm91cHMgb2Ygc2VjdGlvbnMgaW4KLXRoZSBsaW5rZWQgcHJvZ3JhbS4gIEBjb2Rle0B2YWx1ZXtMRH19IHB1dHMgYWxsIHBhcnRpYWwgcHJvZ3JhbXMnIHRleHQKLXNlY3Rpb25zIGluIGNvbnRpZ3VvdXMgYWRkcmVzc2VzIGluIHRoZSBsaW5rZWQgcHJvZ3JhbS4gIEl0IGlzCi1jdXN0b21hcnkgdG8gcmVmZXIgdG8gdGhlIEBlbXBoe3RleHQgc2VjdGlvbn0gb2YgYSBwcm9ncmFtLCBtZWFuaW5nIGFsbAotdGhlIGFkZHJlc3NlcyBvZiBhbGwgcGFydGlhbCBwcm9ncmFtcycgdGV4dCBzZWN0aW9ucy4gIExpa2V3aXNlIGZvcgotZGF0YSBhbmQgYnNzIHNlY3Rpb25zLgotCi1Tb21lIHNlY3Rpb25zIGFyZSBtYW5pcHVsYXRlZCBieSBAY29kZXtAdmFsdWV7TER9fTsgb3RoZXJzIGFyZSBpbnZlbnRlZCBmb3IKLXVzZSBvZiBAY29kZXtAdmFsdWV7QVN9fSBhbmQgaGF2ZSBubyBtZWFuaW5nIGV4Y2VwdCBkdXJpbmcgYXNzZW1ibHkuCi0KLUBub2RlIExkIFNlY3Rpb25zCi1Ac2VjdGlvbiBMaW5rZXIgU2VjdGlvbnMKLUBjb2Rle0B2YWx1ZXtMRH19IGRlYWxzIHdpdGgganVzdCBmb3VyIGtpbmRzIG9mIHNlY3Rpb25zLCBzdW1tYXJpemVkIGJlbG93LgotCi1AdGFibGUgQHN0cm9uZwotCi1AaWZzZXQgQ09GRgotQGNpbmRleCBuYW1lZCBzZWN0aW9ucwotQGNpbmRleCBzZWN0aW9ucywgbmFtZWQKLUBpdGVtIG5hbWVkIHNlY3Rpb25zCi1AZW5kIGlmc2V0Ci1AaWZzZXQgYW91dC1ib3V0Ci1AY2luZGV4IHRleHQgc2VjdGlvbgotQGNpbmRleCBkYXRhIHNlY3Rpb24KLUBpdGVteCB0ZXh0IHNlY3Rpb24KLUBpdGVteCBkYXRhIHNlY3Rpb24KLUBlbmQgaWZzZXQKLVRoZXNlIHNlY3Rpb25zIGhvbGQgeW91ciBwcm9ncmFtLiAgQGNvZGV7QHZhbHVle0FTfX0gYW5kIEBjb2Rle0B2YWx1ZXtMRH19IHRyZWF0IHRoZW0gYXMKLXNlcGFyYXRlIGJ1dCBlcXVhbCBzZWN0aW9ucy4gIEFueXRoaW5nIHlvdSBjYW4gc2F5IG9mIG9uZSBzZWN0aW9uIGlzCi10cnVlIGFub3RoZXIuCi1AaWZzZXQgYW91dC1ib3V0Ci1XaGVuIHRoZSBwcm9ncmFtIGlzIHJ1bm5pbmcsIGhvd2V2ZXIsIGl0IGlzCi1jdXN0b21hcnkgZm9yIHRoZSB0ZXh0IHNlY3Rpb24gdG8gYmUgdW5hbHRlcmFibGUuICBUaGUKLXRleHQgc2VjdGlvbiBpcyBvZnRlbiBzaGFyZWQgYW1vbmcgcHJvY2Vzc2VzOiBpdCBjb250YWlucwotaW5zdHJ1Y3Rpb25zLCBjb25zdGFudHMgYW5kIHRoZSBsaWtlLiAgVGhlIGRhdGEgc2VjdGlvbiBvZiBhIHJ1bm5pbmcKLXByb2dyYW0gaXMgdXN1YWxseSBhbHRlcmFibGU6IGZvciBleGFtcGxlLCBDIHZhcmlhYmxlcyB3b3VsZCBiZSBzdG9yZWQKLWluIHRoZSBkYXRhIHNlY3Rpb24uCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggYnNzIHNlY3Rpb24KLUBpdGVtIGJzcyBzZWN0aW9uCi1UaGlzIHNlY3Rpb24gY29udGFpbnMgemVyb2VkIGJ5dGVzIHdoZW4geW91ciBwcm9ncmFtIGJlZ2lucyBydW5uaW5nLiAgSXQKLWlzIHVzZWQgdG8gaG9sZCB1bml0aWFsaXplZCB2YXJpYWJsZXMgb3IgY29tbW9uIHN0b3JhZ2UuICBUaGUgbGVuZ3RoIG9mCi1lYWNoIHBhcnRpYWwgcHJvZ3JhbSdzIGJzcyBzZWN0aW9uIGlzIGltcG9ydGFudCwgYnV0IGJlY2F1c2UgaXQgc3RhcnRzCi1vdXQgY29udGFpbmluZyB6ZXJvZWQgYnl0ZXMgdGhlcmUgaXMgbm8gbmVlZCB0byBzdG9yZSBleHBsaWNpdCB6ZXJvCi1ieXRlcyBpbiB0aGUgb2JqZWN0IGZpbGUuICBUaGUgYnNzIHNlY3Rpb24gd2FzIGludmVudGVkIHRvIGVsaW1pbmF0ZQotdGhvc2UgZXhwbGljaXQgemVyb3MgZnJvbSBvYmplY3QgZmlsZXMuCi0KLUBjaW5kZXggYWJzb2x1dGUgc2VjdGlvbgotQGl0ZW0gYWJzb2x1dGUgc2VjdGlvbgotQWRkcmVzcyAwIG9mIHRoaXMgc2VjdGlvbiBpcyBhbHdheXMgYGByZWxvY2F0ZWQnJyB0byBydW50aW1lIGFkZHJlc3MgMC4KLVRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJlZmVyIHRvIGFuIGFkZHJlc3MgdGhhdCBAY29kZXtAdmFsdWV7TER9fSBtdXN0Ci1ub3QgY2hhbmdlIHdoZW4gcmVsb2NhdGluZy4gIEluIHRoaXMgc2Vuc2Ugd2Ugc3BlYWsgb2YgYWJzb2x1dGUKLWFkZHJlc3NlcyBiZWluZyBgYHVucmVsb2NhdGFibGUnJzogdGhleSBkbyBub3QgY2hhbmdlIGR1cmluZyByZWxvY2F0aW9uLgotCi1AY2luZGV4IHVuZGVmaW5lZCBzZWN0aW9uCi1AaXRlbSB1bmRlZmluZWQgc2VjdGlvbgotVGhpcyBgYHNlY3Rpb24nJyBpcyBhIGNhdGNoLWFsbCBmb3IgYWRkcmVzcyByZWZlcmVuY2VzIHRvIG9iamVjdHMgbm90IGluCi10aGUgcHJlY2VkaW5nIHNlY3Rpb25zLgotQGMgRklYTUU6IHJlZiB0byBzb21lIG90aGVyIGRvYyBvbiBvYmotZmlsZSBmb3JtYXRzIGNvdWxkIGdvIGhlcmUuCi1AZW5kIHRhYmxlCi0KLUBjaW5kZXggcmVsb2NhdGlvbiBleGFtcGxlCi1BbiBpZGVhbGl6ZWQgZXhhbXBsZSBvZiB0aHJlZSByZWxvY2F0YWJsZSBzZWN0aW9ucyBmb2xsb3dzLgotQGlmc2V0IENPRkYKLVRoZSBleGFtcGxlIHVzZXMgdGhlIHRyYWRpdGlvbmFsIHNlY3Rpb24gbmFtZXMgQHNhbXB7LnRleHR9IGFuZCBAc2FtcHsuZGF0YX0uCi1AZW5kIGlmc2V0Ci1NZW1vcnkgYWRkcmVzc2VzIGFyZSBvbiB0aGUgaG9yaXpvbnRhbCBheGlzLgotCi1AYyBURVhJMlJPRkYtS0lMTAotQGlmaW5mbwotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICAgICAgICAgICAgICAgKy0tLS0tKy0tLS0rLS0rCi1wYXJ0aWFsIHByb2dyYW0gIyAxOiAgfHR0dHR0fGRkZGR8MDB8Ci0gICAgICAgICAgICAgICAgICAgICAgKy0tLS0tKy0tLS0rLS0rCi0KLSAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICAgZGF0YSBic3MKLSAgICAgICAgICAgICAgICAgICAgICBzZWcuICAgc2VnLiBzZWcuCi0KLSAgICAgICAgICAgICAgICAgICAgICArLS0tKy0tLSstLS0rCi1wYXJ0aWFsIHByb2dyYW0gIyAyOiAgfFRUVHxERER8MDAwfAotICAgICAgICAgICAgICAgICAgICAgICstLS0rLS0tKy0tLSsKLQotICAgICAgICAgICAgICAgICAgICAgICstLSstLS0rLS0tLS0rLS0rLS0tLSstLS0rLS0tLS0rfn4KLWxpbmtlZCBwcm9ncmFtOiAgICAgICB8ICB8VFRUfHR0dHR0fCAgfGRkZGR8REREfDAwMDAwfAotICAgICAgICAgICAgICAgICAgICAgICstLSstLS0rLS0tLS0rLS0rLS0tLSstLS0rLS0tLS0rfn4KLQotICAgIGFkZHJlc3NlczogICAgICAgIDAgQGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLUBjIFRFWEkyUk9GRi1LSUxMCi1AZW5kIGlmaW5mbwotQG5lZWQgNTAwMAotQHRleAotCi1cbGluZXtcaXQgUGFydGlhbCBwcm9ncmFtIFwjMTogXGhmaWx9Ci1cbGluZXtcaWJveHsyLjVjbX17XHR0IHRleHR9XGlib3h7MmNtfXtcdHQgZGF0YX1caWJveHsxY219e1x0dCBic3N9XGhmaWx9Ci1cbGluZXtcYm94aXR7Mi41Y219e1x0dCB0dHR0dH1cYm94aXR7MmNtfXtcdHQgZGRkZH1cYm94aXR7MWNtfXtcdHQgMDB9XGhmaWx9Ci0KLVxsaW5le1xpdCBQYXJ0aWFsIHByb2dyYW0gXCMyOiBcaGZpbH0KLVxsaW5le1xpYm94ezFjbX17XHR0IHRleHR9XGlib3h7MS41Y219e1x0dCBkYXRhfVxpYm94ezFjbX17XHR0IGJzc31caGZpbH0KLVxsaW5le1xib3hpdHsxY219e1x0dCBUVFR9XGJveGl0ezEuNWNtfXtcdHQgRERERH1cYm94aXR7MWNtfXtcdHQgMDAwfVxoZmlsfQotCi1cbGluZXtcaXQgbGlua2VkIHByb2dyYW06IFxoZmlsfQotXGxpbmV7XGlib3h7LjVjbX17fVxpYm94ezFjbX17XHR0IHRleHR9XGlib3h7Mi41Y219e31caWJveHsuNzVjbX17fVxpYm94ezJjbX17XHR0IGRhdGF9XGlib3h7MS41Y219e31caWJveHsyY219e1x0dCBic3N9XGhmaWx9Ci1cbGluZXtcYm94aXR7LjVjbX17fVxib3hpdHsxY219e1x0dCBUVFR9XGJveGl0ezIuNWNtfXtcdHQKLXR0dHR0fVxib3hpdHsuNzVjbX17fVxib3hpdHsyY219e1x0dCBkZGRkfVxib3hpdHsxLjVjbX17XHR0Ci1EREREfVxib3hpdHsyY219e1x0dCAwMDAwMH1cIFxkb3RzXGhmaWx9Ci0KLVxsaW5le1xpdCBhZGRyZXNzZXM6IFxoZmlsfQotXGxpbmV7MFxkb3RzXGhmaWx9Ci0KLUBlbmQgdGV4Ci1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLQotQG5vZGUgQXMgU2VjdGlvbnMKLUBzZWN0aW9uIEFzc2VtYmxlciBJbnRlcm5hbCBTZWN0aW9ucwotCi1AY2luZGV4IGludGVybmFsIGFzc2VtYmxlciBzZWN0aW9ucwotQGNpbmRleCBzZWN0aW9ucyBpbiBtZXNzYWdlcywgaW50ZXJuYWwKLVRoZXNlIHNlY3Rpb25zIGFyZSBtZWFudCBvbmx5IGZvciB0aGUgaW50ZXJuYWwgdXNlIG9mIEBjb2Rle0B2YWx1ZXtBU319LiAgVGhleQotaGF2ZSBubyBtZWFuaW5nIGF0IHJ1bi10aW1lLiAgWW91IGRvIG5vdCByZWFsbHkgbmVlZCB0byBrbm93IGFib3V0IHRoZXNlCi1zZWN0aW9ucyBmb3IgbW9zdCBwdXJwb3NlczsgYnV0IHRoZXkgY2FuIGJlIG1lbnRpb25lZCBpbiBAY29kZXtAdmFsdWV7QVN9fQotd2FybmluZyBtZXNzYWdlcywgc28gaXQgbWlnaHQgYmUgaGVscGZ1bCB0byBoYXZlIGFuIGlkZWEgb2YgdGhlaXIKLW1lYW5pbmdzIHRvIEBjb2Rle0B2YWx1ZXtBU319LiAgVGhlc2Ugc2VjdGlvbnMgYXJlIHVzZWQgdG8gcGVybWl0IHRoZQotdmFsdWUgb2YgZXZlcnkgZXhwcmVzc2lvbiBpbiB5b3VyIGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW0gdG8gYmUgYQotc2VjdGlvbi1yZWxhdGl2ZSBhZGRyZXNzLgotCi1AdGFibGUgQGIKLUBjaW5kZXggYXNzZW1ibGVyIGludGVybmFsIGxvZ2ljIGVycm9yCi1AaXRlbSBBU1NFTUJMRVItSU5URVJOQUwtTE9HSUMtRVJST1IhCi1BbiBpbnRlcm5hbCBhc3NlbWJsZXIgbG9naWMgZXJyb3IgaGFzIGJlZW4gZm91bmQuICBUaGlzIG1lYW5zIHRoZXJlIGlzIGEKLWJ1ZyBpbiB0aGUgYXNzZW1ibGVyLgotCi1AY2luZGV4IGV4cHIgKGludGVybmFsIHNlY3Rpb24pCi1AaXRlbSBleHByIHNlY3Rpb24KLVRoZSBhc3NlbWJsZXIgc3RvcmVzIGNvbXBsZXggZXhwcmVzc2lvbiBpbnRlcm5hbGx5IGFzIGNvbWJpbmF0aW9ucyBvZgotc3ltYm9scy4gIFdoZW4gaXQgbmVlZHMgdG8gcmVwcmVzZW50IGFuIGV4cHJlc3Npb24gYXMgYSBzeW1ib2wsIGl0IHB1dHMKLWl0IGluIHRoZSBleHByIHNlY3Rpb24uCi1AYyBGSVhNRSBpdGVtIGRlYnVnCi1AYyBGSVhNRSBpdGVtIHRyYW5zZmVyW3RdIHZlY3RvciBwcmVsb2FkCi1AYyBGSVhNRSBpdGVtIHRyYW5zZmVyW3RdIHZlY3RvciBwb3N0bG9hZAotQGMgRklYTUUgaXRlbSByZWdpc3RlcgotQGVuZCB0YWJsZQotCi1Abm9kZSBTdWItU2VjdGlvbnMKLUBzZWN0aW9uIFN1Yi1TZWN0aW9ucwotCi1AY2luZGV4IG51bWJlcmVkIHN1YnNlY3Rpb25zCi1AY2luZGV4IGdyb3VwaW5nIGRhdGEKLUBpZnNldCBhb3V0LWJvdXQKLUFzc2VtYmxlZCBieXRlcwotQGlmc2V0IENPRkYKLWNvbnZlbnRpb25hbGx5Ci1AZW5kIGlmc2V0Ci1mYWxsIGludG8gdHdvIHNlY3Rpb25zOiB0ZXh0IGFuZCBkYXRhLgotQGVuZCBpZnNldAotWW91IG1heSBoYXZlIHNlcGFyYXRlIGdyb3VwcyBvZgotQGlmc2V0IEdFTkVSSUMKLWRhdGEgaW4gbmFtZWQgc2VjdGlvbnMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZmNsZWFyIGFvdXQtYm91dAotZGF0YSBpbiBuYW1lZCBzZWN0aW9ucwotQGVuZCBpZmNsZWFyCi1AaWZzZXQgYW91dC1ib3V0Ci10ZXh0IG9yIGRhdGEKLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotdGhhdCB5b3Ugd2FudCB0byBlbmQgdXAgbmVhciB0byBlYWNoIG90aGVyIGluIHRoZSBvYmplY3QgZmlsZSwgZXZlbiB0aG91Z2ggdGhleQotYXJlIG5vdCBjb250aWd1b3VzIGluIHRoZSBhc3NlbWJsZXIgc291cmNlLiAgQGNvZGV7QHZhbHVle0FTfX0gYWxsb3dzIHlvdSB0bwotdXNlIEBkZm57c3Vic2VjdGlvbnN9IGZvciB0aGlzIHB1cnBvc2UuICBXaXRoaW4gZWFjaCBzZWN0aW9uLCB0aGVyZSBjYW4gYmUKLW51bWJlcmVkIHN1YnNlY3Rpb25zIHdpdGggdmFsdWVzIGZyb20gMCB0byA4MTkyLiAgT2JqZWN0cyBhc3NlbWJsZWQgaW50byB0aGUKLXNhbWUgc3Vic2VjdGlvbiBnbyBpbnRvIHRoZSBvYmplY3QgZmlsZSB0b2dldGhlciB3aXRoIG90aGVyIG9iamVjdHMgaW4gdGhlIHNhbWUKLXN1YnNlY3Rpb24uICBGb3IgZXhhbXBsZSwgYSBjb21waWxlciBtaWdodCB3YW50IHRvIHN0b3JlIGNvbnN0YW50cyBpbiB0aGUgdGV4dAotc2VjdGlvbiwgYnV0IG1pZ2h0IG5vdCB3YW50IHRvIGhhdmUgdGhlbSBpbnRlcnNwZXJzZWQgd2l0aCB0aGUgcHJvZ3JhbSBiZWluZwotYXNzZW1ibGVkLiAgSW4gdGhpcyBjYXNlLCB0aGUgY29tcGlsZXIgY291bGQgaXNzdWUgYSBAc2FtcHsudGV4dCAwfSBiZWZvcmUgZWFjaAotc2VjdGlvbiBvZiBjb2RlIGJlaW5nIG91dHB1dCwgYW5kIGEgQHNhbXB7LnRleHQgMX0gYmVmb3JlIGVhY2ggZ3JvdXAgb2YKLWNvbnN0YW50cyBiZWluZyBvdXRwdXQuCi0KLVN1YnNlY3Rpb25zIGFyZSBvcHRpb25hbC4gIElmIHlvdSBkbyBub3QgdXNlIHN1YnNlY3Rpb25zLCBldmVyeXRoaW5nCi1nb2VzIGluIHN1YnNlY3Rpb24gbnVtYmVyIHplcm8uCi0KLUBpZnNldCBHRU5FUklDCi1FYWNoIHN1YnNlY3Rpb24gaXMgemVyby1wYWRkZWQgdXAgdG8gYSBtdWx0aXBsZSBvZiBmb3VyIGJ5dGVzLgotKFN1YnNlY3Rpb25zIG1heSBiZSBwYWRkZWQgYSBkaWZmZXJlbnQgYW1vdW50IG9uIGRpZmZlcmVudCBmbGF2b3JzCi1vZiBAY29kZXtAdmFsdWV7QVN9fS4pCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSDgKLU9uIHRoZSBIOC8zMDAgYW5kIEg4LzUwMCBwbGF0Zm9ybXMsIGVhY2ggc3Vic2VjdGlvbiBpcyB6ZXJvLXBhZGRlZCB0byBhIHdvcmQKLWJvdW5kYXJ5ICh0d28gYnl0ZXMpLgotVGhlIHNhbWUgaXMgdHJ1ZSBvbiB0aGUgSGl0YWNoaSBTSC4KLUBlbmQgaWZzZXQKLUBpZnNldCBJOTYwCi1AYyBGSVhNRSBzZWN0aW9uIHBhZGRpbmcgKGFsaWdubWVudCk/Ci1AYyBSaWNoIFBpeGxleSBzYXlzIHBhZGRpbmcgaGVyZSBkZXBlbmRzIG9uIHRhcmdldCBvYmogY29kZSBmb3JtYXQ7IHRoYXQKLUBjIGRvZXNuJ3Qgc2VlbSBwYXJ0aWN1bGFybHkgdXNlZnVsIHRvIHNheSB3aXRob3V0IGZ1cnRoZXIgZWxhYm9yYXRpb24sCi1AYyBzbyBmb3Igbm93IEkgc2F5IG5vdGhpbmcgYWJvdXQgaXQuICBJZiB0aGlzIGlzIGEgZ2VuZXJpYyBCRkQgaXNzdWUsCi1AYyB0aGVzZSBwYXJhZ3JhcGhzIG1pZ2h0IG5lZWQgdG8gdmFuaXNoIGZyb20gdGhpcyBtYW51YWwsIGFuZCBiZQotQGMgZGlzY3Vzc2VkIGluIEJGRCBjaGFwdGVyIG9mIGJpbnV0aWxzIChvciBzb21lIHN1Y2gpLgotQGVuZCBpZnNldAotQGlmc2V0IEEyOUsKLU9uIHRoZSBBTUQgMjlLIGZhbWlseSwgbm8gcGFydGljdWxhciBwYWRkaW5nIGlzIGFkZGVkIHRvIHNlY3Rpb24gb3IKLXN1YnNlY3Rpb24gc2l6ZXM7IEB2YWx1ZXtBU30gZm9yY2VzIG5vIGFsaWdubWVudCBvbiB0aGlzIHBsYXRmb3JtLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLVN1YnNlY3Rpb25zIGFwcGVhciBpbiB5b3VyIG9iamVjdCBmaWxlIGluIG51bWVyaWMgb3JkZXIsIGxvd2VzdCBudW1iZXJlZAotdG8gaGlnaGVzdC4gIChBbGwgdGhpcyB0byBiZSBjb21wYXRpYmxlIHdpdGggb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycy4pCi1UaGUgb2JqZWN0IGZpbGUgY29udGFpbnMgbm8gcmVwcmVzZW50YXRpb24gb2Ygc3Vic2VjdGlvbnM7IEBjb2Rle0B2YWx1ZXtMRH19IGFuZAotb3RoZXIgcHJvZ3JhbXMgdGhhdCBtYW5pcHVsYXRlIG9iamVjdCBmaWxlcyBzZWUgbm8gdHJhY2Ugb2YgdGhlbS4KLVRoZXkganVzdCBzZWUgYWxsIHlvdXIgdGV4dCBzdWJzZWN0aW9ucyBhcyBhIHRleHQgc2VjdGlvbiwgYW5kIGFsbCB5b3VyCi1kYXRhIHN1YnNlY3Rpb25zIGFzIGEgZGF0YSBzZWN0aW9uLgotCi1UbyBzcGVjaWZ5IHdoaWNoIHN1YnNlY3Rpb24geW91IHdhbnQgc3Vic2VxdWVudCBzdGF0ZW1lbnRzIGFzc2VtYmxlZAotaW50bywgdXNlIGEgbnVtZXJpYyBhcmd1bWVudCB0byBzcGVjaWZ5IGl0LCBpbiBhIEBzYW1wey50ZXh0Ci1AdmFye2V4cHJlc3Npb259fSBvciBhIEBzYW1wey5kYXRhIEB2YXJ7ZXhwcmVzc2lvbn19IHN0YXRlbWVudC4KLUBpZnNldCBDT0ZGCi1AaWZzZXQgR0VORVJJQwotV2hlbiBnZW5lcmF0aW5nIENPRkYgb3V0cHV0LCB5b3UKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLVlvdQotQGVuZCBpZmNsZWFyCi1jYW4gYWxzbyB1c2UgYW4gZXh0cmEgc3Vic2VjdGlvbgotYXJndW1lbnQgd2l0aCBhcmJpdHJhcnkgbmFtZWQgc2VjdGlvbnM6IEBzYW1wey5zZWN0aW9uIEB2YXJ7bmFtZX0sCi1AdmFye2V4cHJlc3Npb259fS4KLUBlbmQgaWZzZXQKLUB2YXJ7RXhwcmVzc2lvbn0gc2hvdWxkIGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24uCi0oQHhyZWZ7RXhwcmVzc2lvbnN9LikgIElmIHlvdSBqdXN0IHNheSBAc2FtcHsudGV4dH0gdGhlbiBAc2FtcHsudGV4dCAwfQotaXMgYXNzdW1lZC4gIExpa2V3aXNlIEBzYW1wey5kYXRhfSBtZWFucyBAc2FtcHsuZGF0YSAwfS4gIEFzc2VtYmx5Ci1iZWdpbnMgaW4gQGNvZGV7dGV4dCAwfS4gIEZvciBpbnN0YW5jZToKLUBzbWFsbGV4YW1wbGUKLS50ZXh0IDAgICAgICMgVGhlIGRlZmF1bHQgc3Vic2VjdGlvbiBpcyB0ZXh0IDAgYW55d2F5LgotLmFzY2lpICJUaGlzIGxpdmVzIGluIHRoZSBmaXJzdCB0ZXh0IHN1YnNlY3Rpb24uICoiCi0udGV4dCAxCi0uYXNjaWkgIkJ1dCB0aGlzIGxpdmVzIGluIHRoZSBzZWNvbmQgdGV4dCBzdWJzZWN0aW9uLiIKLS5kYXRhIDAKLS5hc2NpaSAiVGhpcyBsaXZlcyBpbiB0aGUgZGF0YSBzZWN0aW9uLCIKLS5hc2NpaSAiaW4gdGhlIGZpcnN0IGRhdGEgc3Vic2VjdGlvbi4iCi0udGV4dCAwCi0uYXNjaWkgIlRoaXMgbGl2ZXMgaW4gdGhlIGZpcnN0IHRleHQgc2VjdGlvbiwiCi0uYXNjaWkgImltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgYXN0ZXJpc2sgKCopLiIKLUBlbmQgc21hbGxleGFtcGxlCi0KLUVhY2ggc2VjdGlvbiBoYXMgYSBAZGZue2xvY2F0aW9uIGNvdW50ZXJ9IGluY3JlbWVudGVkIGJ5IG9uZSBmb3IgZXZlcnkgYnl0ZQotYXNzZW1ibGVkIGludG8gdGhhdCBzZWN0aW9uLiAgQmVjYXVzZSBzdWJzZWN0aW9ucyBhcmUgbWVyZWx5IGEgY29udmVuaWVuY2UKLXJlc3RyaWN0ZWQgdG8gQGNvZGV7QHZhbHVle0FTfX0gdGhlcmUgaXMgbm8gY29uY2VwdCBvZiBhIHN1YnNlY3Rpb24gbG9jYXRpb24KLWNvdW50ZXIuICBUaGVyZSBpcyBubyB3YXkgdG8gZGlyZWN0bHkgbWFuaXB1bGF0ZSBhIGxvY2F0aW9uIGNvdW50ZXItLS1idXQgdGhlCi1AY29kZXsuYWxpZ259IGRpcmVjdGl2ZSBjaGFuZ2VzIGl0LCBhbmQgYW55IGxhYmVsIGRlZmluaXRpb24gY2FwdHVyZXMgaXRzCi1jdXJyZW50IHZhbHVlLiAgVGhlIGxvY2F0aW9uIGNvdW50ZXIgb2YgdGhlIHNlY3Rpb24gd2hlcmUgc3RhdGVtZW50cyBhcmUgYmVpbmcKLWFzc2VtYmxlZCBpcyBzYWlkIHRvIGJlIHRoZSBAZGZue2FjdGl2ZX0gbG9jYXRpb24gY291bnRlci4KLQotQG5vZGUgYnNzCi1Ac2VjdGlvbiBic3MgU2VjdGlvbgotCi1AY2luZGV4IGJzcyBzZWN0aW9uCi1AY2luZGV4IGNvbW1vbiB2YXJpYWJsZSBzdG9yYWdlCi1UaGUgYnNzIHNlY3Rpb24gaXMgdXNlZCBmb3IgbG9jYWwgY29tbW9uIHZhcmlhYmxlIHN0b3JhZ2UuCi1Zb3UgbWF5IGFsbG9jYXRlIGFkZHJlc3Mgc3BhY2UgaW4gdGhlIGJzcyBzZWN0aW9uLCBidXQgeW91IG1heQotbm90IGRpY3RhdGUgZGF0YSB0byBsb2FkIGludG8gaXQgYmVmb3JlIHlvdXIgcHJvZ3JhbSBleGVjdXRlcy4gIFdoZW4KLXlvdXIgcHJvZ3JhbSBzdGFydHMgcnVubmluZywgYWxsIHRoZSBjb250ZW50cyBvZiB0aGUgYnNzCi1zZWN0aW9uIGFyZSB6ZXJvZWQgYnl0ZXMuCi0KLVRoZSBAY29kZXsubGNvbW19IHBzZXVkby1vcCBkZWZpbmVzIGEgc3ltYm9sIGluIHRoZSBic3Mgc2VjdGlvbjsgc2VlCi1AcmVme0xjb21tLCxAY29kZXsubGNvbW19fS4KLQotVGhlIEBjb2Rley5jb21tfSBwc2V1ZG8tb3AgbWF5IGJlIHVzZWQgdG8gZGVjbGFyZSBhIGNvbW1vbiBzeW1ib2wsIHdoaWNoIGlzCi1hbm90aGVyIGZvcm0gb2YgdW5pbml0aWFsaXplZCBzeW1ib2w7IHNlZSBAeHJlZntDb21tLCxAY29kZXsuY29tbX19LgotCi1AaWZzZXQgR0VORVJJQwotV2hlbiBhc3NlbWJsaW5nIGZvciBhIHRhcmdldCB3aGljaCBzdXBwb3J0cyBtdWx0aXBsZSBzZWN0aW9ucywgc3VjaCBhcyBFTEYgb3IKLUNPRkYsIHlvdSBtYXkgc3dpdGNoIGludG8gdGhlIEBjb2Rley5ic3N9IHNlY3Rpb24gYW5kIGRlZmluZSBzeW1ib2xzIGFzIHVzdWFsOwotc2VlIEByZWZ7U2VjdGlvbiwsQGNvZGV7LnNlY3Rpb259fS4gIFlvdSBtYXkgb25seSBhc3NlbWJsZSB6ZXJvIHZhbHVlcyBpbnRvIHRoZQotc2VjdGlvbi4gIFR5cGljYWxseSB0aGUgc2VjdGlvbiB3aWxsIG9ubHkgY29udGFpbiBzeW1ib2wgZGVmaW5pdGlvbnMgYW5kCi1AY29kZXsuc2tpcH0gZGlyZWN0aXZlcyAoQHB4cmVme1NraXAsLEBjb2Rley5za2lwfX0pLgotQGVuZCBpZnNldAotCi1Abm9kZSBTeW1ib2xzCi1AY2hhcHRlciBTeW1ib2xzCi0KLUBjaW5kZXggc3ltYm9scwotU3ltYm9scyBhcmUgYSBjZW50cmFsIGNvbmNlcHQ6IHRoZSBwcm9ncmFtbWVyIHVzZXMgc3ltYm9scyB0byBuYW1lCi10aGluZ3MsIHRoZSBsaW5rZXIgdXNlcyBzeW1ib2xzIHRvIGxpbmssIGFuZCB0aGUgZGVidWdnZXIgdXNlcyBzeW1ib2xzCi10byBkZWJ1Zy4KLQotQHF1b3RhdGlvbgotQGNpbmRleCBkZWJ1Z2dlcnMsIGFuZCBzeW1ib2wgb3JkZXIKLUBlbXBoe1dhcm5pbmc6fSBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIG5vdCBwbGFjZSBzeW1ib2xzIGluIHRoZSBvYmplY3QgZmlsZSBpbgotdGhlIHNhbWUgb3JkZXIgdGhleSB3ZXJlIGRlY2xhcmVkLiAgVGhpcyBtYXkgYnJlYWsgc29tZSBkZWJ1Z2dlcnMuCi1AZW5kIHF1b3RhdGlvbgotCi1AbWVudQotKiBMYWJlbHM6OiAgICAgICAgICAgICAgICAgICAgICBMYWJlbHMKLSogU2V0dGluZyBTeW1ib2xzOjogICAgICAgICAgICAgR2l2aW5nIFN5bWJvbHMgT3RoZXIgVmFsdWVzCi0qIFN5bWJvbCBOYW1lczo6ICAgICAgICAgICAgICAgIFN5bWJvbCBOYW1lcwotKiBEb3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgU3BlY2lhbCBEb3QgU3ltYm9sCi0qIFN5bWJvbCBBdHRyaWJ1dGVzOjogICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgTGFiZWxzCi1Ac2VjdGlvbiBMYWJlbHMKLQotQGNpbmRleCBsYWJlbHMKLUEgQGRmbntsYWJlbH0gaXMgd3JpdHRlbiBhcyBhIHN5bWJvbCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGNvbG9uCi1Ac2FtcHs6fS4gIFRoZSBzeW1ib2wgdGhlbiByZXByZXNlbnRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZQotYWN0aXZlIGxvY2F0aW9uIGNvdW50ZXIsIGFuZCBpcywgZm9yIGV4YW1wbGUsIGEgc3VpdGFibGUgaW5zdHJ1Y3Rpb24KLW9wZXJhbmQuICBZb3UgYXJlIHdhcm5lZCBpZiB5b3UgdXNlIHRoZSBzYW1lIHN5bWJvbCB0byByZXByZXNlbnQgdHdvCi1kaWZmZXJlbnQgbG9jYXRpb25zOiB0aGUgZmlyc3QgZGVmaW5pdGlvbiBvdmVycmlkZXMgYW55IG90aGVyCi1kZWZpbml0aW9ucy4KLQotQGlmc2V0IEhQUEEKLU9uIHRoZSBIUFBBLCB0aGUgdXN1YWwgZm9ybSBmb3IgYSBsYWJlbCBuZWVkIG5vdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhCi1jb2xvbiwgYnV0IGluc3RlYWQgbXVzdCBzdGFydCBpbiBjb2x1bW4gemVyby4gIE9ubHkgb25lIGxhYmVsIG1heSBiZSBkZWZpbmVkIG9uCi1hIHNpbmdsZSBsaW5lLiAgVG8gd29yayBhcm91bmQgdGhpcywgdGhlIEhQUEEgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBhbHNvCi1wcm92aWRlcyBhIHNwZWNpYWwgZGlyZWN0aXZlIEBjb2Rley5sYWJlbH0gZm9yIGRlZmluaW5nIGxhYmVscyBtb3JlIGZsZXhpYmx5LgotQGVuZCBpZnNldAotCi1Abm9kZSBTZXR0aW5nIFN5bWJvbHMKLUBzZWN0aW9uIEdpdmluZyBTeW1ib2xzIE90aGVyIFZhbHVlcwotCi1AY2luZGV4IGFzc2lnbmluZyB2YWx1ZXMgdG8gc3ltYm9scwotQGNpbmRleCBzeW1ib2wgdmFsdWVzLCBhc3NpZ25pbmcKLUEgc3ltYm9sIGNhbiBiZSBnaXZlbiBhbiBhcmJpdHJhcnkgdmFsdWUgYnkgd3JpdGluZyBhIHN5bWJvbCwgZm9sbG93ZWQKLWJ5IGFuIGVxdWFscyBzaWduIEBzYW1wez19LCBmb2xsb3dlZCBieSBhbiBleHByZXNzaW9uCi0oQHB4cmVme0V4cHJlc3Npb25zfSkuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgdGhlIEBjb2Rley5zZXR9Ci1kaXJlY3RpdmUuICBAeHJlZntTZXQsLEBjb2Rley5zZXR9fS4KLQotQG5vZGUgU3ltYm9sIE5hbWVzCi1Ac2VjdGlvbiBTeW1ib2wgTmFtZXMKLQotQGNpbmRleCBzeW1ib2wgbmFtZXMKLUBjaW5kZXggbmFtZXMsIHN5bWJvbAotQGlmY2xlYXIgU1BFQ0lBTC1TWU1TCi1TeW1ib2wgbmFtZXMgYmVnaW4gd2l0aCBhIGxldHRlciBvciB3aXRoIG9uZSBvZiBAc2FtcHsuX30uICBPbiBtb3N0Ci1tYWNoaW5lcywgeW91IGNhbiBhbHNvIHVzZSBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXM7IGV4Y2VwdGlvbnMgYXJlCi1ub3RlZCBpbiBAcmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4gIFRoYXQgY2hhcmFjdGVyIG1heSBiZSBmb2xsb3dlZCBieSBhbnkKLXN0cmluZyBvZiBkaWdpdHMsIGxldHRlcnMsIGRvbGxhciBzaWducyAodW5sZXNzIG90aGVyd2lzZSBub3RlZCBpbgotQHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30pLCBhbmQgdW5kZXJzY29yZXMuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBBMjlLCi1Gb3IgdGhlIEFNRCAyOUsgZmFtaWx5LCBAc2FtcHs/fSBpcyBhbHNvIGFsbG93ZWQgaW4gdGhlCi1ib2R5IG9mIGEgc3ltYm9sIG5hbWUsIHRob3VnaCBub3QgYXQgaXRzIGJlZ2lubmluZy4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IFNQRUNJQUwtU1lNUwotQGlmc2V0IEg4Ci1TeW1ib2wgbmFtZXMgYmVnaW4gd2l0aCBhIGxldHRlciBvciB3aXRoIG9uZSBvZiBAc2FtcHsuX30uICBPbiB0aGUKLUhpdGFjaGkgU0ggb3IgdGhlCi1IOC81MDAsIHlvdSBjYW4gYWxzbyB1c2UgQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzLiAgVGhhdCBjaGFyYWN0ZXIgbWF5Ci1iZSBmb2xsb3dlZCBieSBhbnkgc3RyaW5nIG9mIGRpZ2l0cywgbGV0dGVycywgZG9sbGFyIHNpZ25zIChzYXZlIG9uIHRoZQotSDgvMzAwKSwgYW5kIHVuZGVyc2NvcmVzLgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1DYXNlIG9mIGxldHRlcnMgaXMgc2lnbmlmaWNhbnQ6IEBjb2Rle2Zvb30gaXMgYSBkaWZmZXJlbnQgc3ltYm9sIG5hbWUKLXRoYW4gQGNvZGV7Rm9vfS4KLQotRWFjaCBzeW1ib2wgaGFzIGV4YWN0bHkgb25lIG5hbWUuICBFYWNoIG5hbWUgaW4gYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbQotcmVmZXJzIHRvIGV4YWN0bHkgb25lIHN5bWJvbC4gIFlvdSBtYXkgdXNlIHRoYXQgc3ltYm9sIG5hbWUgYW55IG51bWJlciBvZiB0aW1lcwotaW4gYSBwcm9ncmFtLgotCi1Ac3ViaGVhZGluZyBMb2NhbCBTeW1ib2wgTmFtZXMKLQotQGNpbmRleCBsb2NhbCBzeW1ib2wgbmFtZXMKLUBjaW5kZXggc3ltYm9sIG5hbWVzLCBsb2NhbAotQGNpbmRleCB0ZW1wb3Jhcnkgc3ltYm9sIG5hbWVzCi1AY2luZGV4IHN5bWJvbCBuYW1lcywgdGVtcG9yYXJ5Ci1Mb2NhbCBzeW1ib2xzIGhlbHAgY29tcGlsZXJzIGFuZCBwcm9ncmFtbWVycyB1c2UgbmFtZXMgdGVtcG9yYXJpbHkuCi1UaGVyZSBhcmUgdGVuIGxvY2FsIHN5bWJvbCBuYW1lcywgd2hpY2ggYXJlIHJlLXVzZWQgdGhyb3VnaG91dCB0aGUKLXByb2dyYW0uICBZb3UgbWF5IHJlZmVyIHRvIHRoZW0gdXNpbmcgdGhlIG5hbWVzIEBzYW1wezB9IEBzYW1wezF9Ci1AZG90c3t9IEBzYW1wezl9LiAgVG8gZGVmaW5lIGEgbG9jYWwgc3ltYm9sLCB3cml0ZSBhIGxhYmVsIG9mIHRoZSBmb3JtCi1Ac2FtcHtAYntOfTp9ICh3aGVyZSBAYntOfSByZXByZXNlbnRzIGFueSBkaWdpdCkuICBUbyByZWZlciB0byB0aGUgbW9zdAotcmVjZW50IHByZXZpb3VzIGRlZmluaXRpb24gb2YgdGhhdCBzeW1ib2wgd3JpdGUgQHNhbXB7QGJ7Tn1ifSwgdXNpbmcgdGhlCi1zYW1lIGRpZ2l0IGFzIHdoZW4geW91IGRlZmluZWQgdGhlIGxhYmVsLiAgVG8gcmVmZXIgdG8gdGhlIG5leHQKLWRlZmluaXRpb24gb2YgYSBsb2NhbCBsYWJlbCwgd3JpdGUgQHNhbXB7QGJ7Tn1mfS0tLXdoZXJlIEBie059IGdpdmVzIHlvdQotYSBjaG9pY2Ugb2YgMTAgZm9yd2FyZCByZWZlcmVuY2VzLiAgVGhlIEBzYW1we2J9IHN0YW5kcyBmb3IKLWBgYmFja3dhcmRzJycgYW5kIHRoZSBAc2FtcHtmfSBzdGFuZHMgZm9yIGBgZm9yd2FyZHMnJy4KLQotTG9jYWwgc3ltYm9scyBhcmUgbm90IGVtaXR0ZWQgYnkgdGhlIGN1cnJlbnQgQHNje2dudX0gQyBjb21waWxlci4KLQotVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gaG93IHlvdSBjYW4gdXNlIHRoZXNlIGxhYmVscywgYnV0Ci1yZW1lbWJlciB0aGF0IGF0IGFueSBwb2ludCBpbiB0aGUgYXNzZW1ibHkgeW91IGNhbiByZWZlciB0byBhdCBtb3N0Ci0xMCBwcmlvciBsb2NhbCBsYWJlbHMgYW5kIHRvIGF0IG1vc3QgMTAgZm9yd2FyZCBsb2NhbCBsYWJlbHMuCi0KLUxvY2FsIHN5bWJvbCBuYW1lcyBhcmUgb25seSBhIG5vdGF0aW9uIGRldmljZS4gIFRoZXkgYXJlIGltbWVkaWF0ZWx5Ci10cmFuc2Zvcm1lZCBpbnRvIG1vcmUgY29udmVudGlvbmFsIHN5bWJvbCBuYW1lcyBiZWZvcmUgdGhlIGFzc2VtYmxlcgotdXNlcyB0aGVtLiAgVGhlIHN5bWJvbCBuYW1lcyBzdG9yZWQgaW4gdGhlIHN5bWJvbCB0YWJsZSwgYXBwZWFyaW5nIGluCi1lcnJvciBtZXNzYWdlcyBhbmQgb3B0aW9uYWxseSBlbWl0dGVkIHRvIHRoZSBvYmplY3QgZmlsZSBoYXZlIHRoZXNlCi1wYXJ0czoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBMCi1BbGwgbG9jYWwgbGFiZWxzIGJlZ2luIHdpdGggQHNhbXB7TH0uIE5vcm1hbGx5IGJvdGggQGNvZGV7QHZhbHVle0FTfX0gYW5kCi1AY29kZXtAdmFsdWV7TER9fSBmb3JnZXQgc3ltYm9scyB0aGF0IHN0YXJ0IHdpdGggQHNhbXB7TH0uIFRoZXNlIGxhYmVscyBhcmUKLXVzZWQgZm9yIHN5bWJvbHMgeW91IGFyZSBuZXZlciBpbnRlbmRlZCB0byBzZWUuICBJZiB5b3UgdXNlIHRoZQotQHNhbXB7LUx9IG9wdGlvbiB0aGVuIEBjb2Rle0B2YWx1ZXtBU319IHJldGFpbnMgdGhlc2Ugc3ltYm9scyBpbiB0aGUKLW9iamVjdCBmaWxlLiBJZiB5b3UgYWxzbyBpbnN0cnVjdCBAY29kZXtAdmFsdWV7TER9fSB0byByZXRhaW4gdGhlc2Ugc3ltYm9scywKLXlvdSBtYXkgdXNlIHRoZW0gaW4gZGVidWdnaW5nLgotCi1AaXRlbSBAdmFye2RpZ2l0fQotSWYgdGhlIGxhYmVsIGlzIHdyaXR0ZW4gQHNhbXB7MDp9IHRoZW4gdGhlIGRpZ2l0IGlzIEBzYW1wezB9LgotSWYgdGhlIGxhYmVsIGlzIHdyaXR0ZW4gQHNhbXB7MTp9IHRoZW4gdGhlIGRpZ2l0IGlzIEBzYW1wezF9LgotQW5kIHNvIG9uIHVwIHRocm91Z2ggQHNhbXB7OTp9LgotCi1AaXRlbSBAa2Jke0MtQX0KLVRoaXMgdW51c3VhbCBjaGFyYWN0ZXIgaXMgaW5jbHVkZWQgc28geW91IGRvIG5vdCBhY2NpZGVudGFsbHkgaW52ZW50Ci1hIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lLiAgVGhlIGNoYXJhY3RlciBoYXMgQVNDSUkgdmFsdWUKLUBzYW1we1wwMDF9LgotCi1AaXRlbSBAZW1waHtvcmRpbmFsIG51bWJlcn0KLVRoaXMgaXMgYSBzZXJpYWwgbnVtYmVyIHRvIGtlZXAgdGhlIGxhYmVscyBkaXN0aW5jdC4gIFRoZSBmaXJzdAotQHNhbXB7MDp9IGdldHMgdGhlIG51bWJlciBAc2FtcHsxfTsgVGhlIDE1dGggQHNhbXB7MDp9IGdldHMgdGhlCi1udW1iZXIgQHNhbXB7MTV9OyBAZW1waHtldGMufS4gIExpa2V3aXNlIGZvciB0aGUgb3RoZXIgbGFiZWxzIEBzYW1wezE6fQotdGhyb3VnaCBAc2FtcHs5On0uCi1AZW5kIHRhYmxlCi0KLUZvciBpbnN0YW5jZSwgdGhlIGZpcnN0IEBjb2RlezE6fSBpcyBuYW1lZCBAY29kZXtMMUBrYmR7Qy1BfTF9LCB0aGUgNDR0aAotQGNvZGV7Mzp9IGlzIG5hbWVkIEBjb2Rle0wzQGtiZHtDLUF9NDR9LgotCi1Abm9kZSBEb3QKLUBzZWN0aW9uIFRoZSBTcGVjaWFsIERvdCBTeW1ib2wKLQotQGNpbmRleCBkb3QgKHN5bWJvbCkKLUBjaW5kZXggQGNvZGV7Ln0gKHN5bWJvbCkKLUBjaW5kZXggY3VycmVudCBhZGRyZXNzCi1AY2luZGV4IGxvY2F0aW9uIGNvdW50ZXIKLVRoZSBzcGVjaWFsIHN5bWJvbCBAc2FtcHsufSByZWZlcnMgdG8gdGhlIGN1cnJlbnQgYWRkcmVzcyB0aGF0Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBhc3NlbWJsaW5nIGludG8uICBUaHVzLCB0aGUgZXhwcmVzc2lvbiBAc2FtcHttZWx2aW46Ci0ubG9uZyAufSBkZWZpbmVzIEBjb2Rle21lbHZpbn0gdG8gY29udGFpbiBpdHMgb3duIGFkZHJlc3MuCi1Bc3NpZ25pbmcgYSB2YWx1ZSB0byBAY29kZXsufSBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIGEgQGNvZGV7Lm9yZ30KLWRpcmVjdGl2ZS4gIFRodXMsIHRoZSBleHByZXNzaW9uIEBzYW1wey49Lis0fSBpcyB0aGUgc2FtZSBhcyBzYXlpbmcKLUBpZmNsZWFyIG5vLXNwYWNlLWRpcgotQHNhbXB7LnNwYWNlIDR9LgotQGVuZCBpZmNsZWFyCi1AaWZzZXQgbm8tc3BhY2UtZGlyCi1AaWZzZXQgQTI5SwotQHNhbXB7LmJsb2NrIDR9LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBTeW1ib2wgQXR0cmlidXRlcwotQHNlY3Rpb24gU3ltYm9sIEF0dHJpYnV0ZXMKLQotQGNpbmRleCBzeW1ib2wgYXR0cmlidXRlcwotQGNpbmRleCBhdHRyaWJ1dGVzLCBzeW1ib2wKLUV2ZXJ5IHN5bWJvbCBoYXMsIGFzIHdlbGwgYXMgaXRzIG5hbWUsIHRoZSBhdHRyaWJ1dGVzIGBgVmFsdWUnJyBhbmQKLWBgVHlwZScnLiAgRGVwZW5kaW5nIG9uIG91dHB1dCBmb3JtYXQsIHN5bWJvbHMgY2FuIGFsc28gaGF2ZSBhdXhpbGlhcnkKLWF0dHJpYnV0ZXMuCi1AaWZzZXQgSU5URVJOQUxTCi1UaGUgZGV0YWlsZWQgZGVmaW5pdGlvbnMgYXJlIGluIEBmaWxle2Eub3V0Lmh9LgotQGVuZCBpZnNldAotCi1JZiB5b3UgdXNlIGEgc3ltYm9sIHdpdGhvdXQgZGVmaW5pbmcgaXQsIEBjb2Rle0B2YWx1ZXtBU319IGFzc3VtZXMgemVybyBmb3IKLWFsbCB0aGVzZSBhdHRyaWJ1dGVzLCBhbmQgcHJvYmFibHkgd29uJ3Qgd2FybiB5b3UuICBUaGlzIG1ha2VzIHRoZQotc3ltYm9sIGFuIGV4dGVybmFsbHkgZGVmaW5lZCBzeW1ib2wsIHdoaWNoIGlzIGdlbmVyYWxseSB3aGF0IHlvdQotd291bGQgd2FudC4KLQotQG1lbnUKLSogU3ltYm9sIFZhbHVlOjogICAgICAgICAgICAgICAgVmFsdWUKLSogU3ltYm9sIFR5cGU6OiAgICAgICAgICAgICAgICAgVHlwZQotQGlmc2V0IGFvdXQtYm91dAotQGlmc2V0IEdFTkVSSUMKLSogYS5vdXQgU3ltYm9sczo6ICAgICAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXM6IEBjb2Rle2Eub3V0fQotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgQk9VVAotKiBhLm91dCBTeW1ib2xzOjogICAgICAgICAgICAgICBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9Ci1AZW5kIGlmY2xlYXIKLUBpZnNldCBCT1VUCi0qIGEub3V0IFN5bWJvbHM6OiAgICAgICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0sIEBjb2Rle2Iub3V0fQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQ09GRgotKiBDT0ZGIFN5bWJvbHM6OiAgICAgICAgICAgICAgICBTeW1ib2wgQXR0cmlidXRlcyBmb3IgQ09GRgotQGVuZCBpZnNldAotQGlmc2V0IFNPTQotKiBTT00gU3ltYm9sczo6ICAgICAgICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzIGZvciBTT00KLUBlbmQgaWZzZXQKLUBlbmQgbWVudQotCi1Abm9kZSBTeW1ib2wgVmFsdWUKLUBzdWJzZWN0aW9uIFZhbHVlCi0KLUBjaW5kZXggdmFsdWUgb2YgYSBzeW1ib2wKLUBjaW5kZXggc3ltYm9sIHZhbHVlCi1UaGUgdmFsdWUgb2YgYSBzeW1ib2wgaXMgKHVzdWFsbHkpIDMyIGJpdHMuICBGb3IgYSBzeW1ib2wgd2hpY2ggbGFiZWxzIGEKLWxvY2F0aW9uIGluIHRoZSB0ZXh0LCBkYXRhLCBic3Mgb3IgYWJzb2x1dGUgc2VjdGlvbnMgdGhlIHZhbHVlIGlzIHRoZQotbnVtYmVyIG9mIGFkZHJlc3NlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGF0IHNlY3Rpb24gdG8gdGhlIGxhYmVsLgotTmF0dXJhbGx5IGZvciB0ZXh0LCBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGNoYW5nZXMKLWFzIEBjb2Rle0B2YWx1ZXtMRH19IGNoYW5nZXMgc2VjdGlvbiBiYXNlIGFkZHJlc3NlcyBkdXJpbmcgbGlua2luZy4gIEFic29sdXRlCi1zeW1ib2xzJyB2YWx1ZXMgZG8gbm90IGNoYW5nZSBkdXJpbmcgbGlua2luZzogdGhhdCBpcyB3aHkgdGhleSBhcmUKLWNhbGxlZCBhYnNvbHV0ZS4KLQotVGhlIHZhbHVlIG9mIGFuIHVuZGVmaW5lZCBzeW1ib2wgaXMgdHJlYXRlZCBpbiBhIHNwZWNpYWwgd2F5LiAgSWYgaXQgaXMKLTAgdGhlbiB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgYXNzZW1ibGVyIHNvdXJjZSBmaWxlLCBhbmQKLUBjb2Rle0B2YWx1ZXtMRH19IHRyaWVzIHRvIGRldGVybWluZSBpdHMgdmFsdWUgZnJvbSBvdGhlciBmaWxlcyBsaW5rZWQgaW50byB0aGUKLXNhbWUgcHJvZ3JhbS4gIFlvdSBtYWtlIHRoaXMga2luZCBvZiBzeW1ib2wgc2ltcGx5IGJ5IG1lbnRpb25pbmcgYSBzeW1ib2wKLW5hbWUgd2l0aG91dCBkZWZpbmluZyBpdC4gIEEgbm9uLXplcm8gdmFsdWUgcmVwcmVzZW50cyBhIEBjb2Rley5jb21tfQotY29tbW9uIGRlY2xhcmF0aW9uLiAgVGhlIHZhbHVlIGlzIGhvdyBtdWNoIGNvbW1vbiBzdG9yYWdlIHRvIHJlc2VydmUsIGluCi1ieXRlcyAoYWRkcmVzc2VzKS4gIFRoZSBzeW1ib2wgcmVmZXJzIHRvIHRoZSBmaXJzdCBhZGRyZXNzIG9mIHRoZQotYWxsb2NhdGVkIHN0b3JhZ2UuCi0KLUBub2RlIFN5bWJvbCBUeXBlCi1Ac3Vic2VjdGlvbiBUeXBlCi0KLUBjaW5kZXggdHlwZSBvZiBhIHN5bWJvbAotQGNpbmRleCBzeW1ib2wgdHlwZQotVGhlIHR5cGUgYXR0cmlidXRlIG9mIGEgc3ltYm9sIGNvbnRhaW5zIHJlbG9jYXRpb24gKHNlY3Rpb24pCi1pbmZvcm1hdGlvbiwgYW55IGZsYWcgc2V0dGluZ3MgaW5kaWNhdGluZyB0aGF0IGEgc3ltYm9sIGlzIGV4dGVybmFsLCBhbmQKLShvcHRpb25hbGx5KSwgb3RoZXIgaW5mb3JtYXRpb24gZm9yIGxpbmtlcnMgYW5kIGRlYnVnZ2Vycy4gIFRoZSBleGFjdAotZm9ybWF0IGRlcGVuZHMgb24gdGhlIG9iamVjdC1jb2RlIG91dHB1dCBmb3JtYXQgaW4gdXNlLgotCi1AaWZzZXQgYW91dC1ib3V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgQk9VVAotQGMgVGhlIGZvbGxvd2luZyBhdm9pZHMgYSAid2lkb3ciIHN1YnNlY3Rpb24gdGl0bGUuICBAZ3JvdXAgd291bGQgYmUKLUBjIGJldHRlciBpZiBpdCB3ZXJlIGF2YWlsYWJsZSBvdXRzaWRlIGV4YW1wbGVzLgotQG5lZWQgMTAwMAotQG5vZGUgYS5vdXQgU3ltYm9scwotQHN1YnNlY3Rpb24gU3ltYm9sIEF0dHJpYnV0ZXM6IEBjb2Rle2Eub3V0fSwgQGNvZGV7Yi5vdXR9Ci0KLUBjaW5kZXggQGNvZGV7Yi5vdXR9IHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBAY29kZXtiLm91dH0KLVRoZXNlIHN5bWJvbCBhdHRyaWJ1dGVzIGFwcGVhciBvbmx5IHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IKLW9uZSBvZiB0aGUgQmVya2VsZXktZGVzY2VuZGVkIG9iamVjdCBvdXRwdXQgZm9ybWF0cy0tLUBjb2Rle2Eub3V0fSBvcgotQGNvZGV7Yi5vdXR9LgotCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBCT1VUCi1Abm9kZSBhLm91dCBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9Ci0KLUBjaW5kZXggQGNvZGV7YS5vdXR9IHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBAY29kZXthLm91dH0KLQotQGVuZCBpZmNsZWFyCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBHRU5FUklDCi1Abm9kZSBhLm91dCBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9Ci0KLUBjaW5kZXggQGNvZGV7YS5vdXR9IHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBAY29kZXthLm91dH0KLQotQGVuZCBpZnNldAotQG1lbnUKLSogU3ltYm9sIERlc2M6OiAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcgotKiBTeW1ib2wgT3RoZXI6OiAgICAgICAgICAgICAgICBPdGhlcgotQGVuZCBtZW51Ci0KLUBub2RlIFN5bWJvbCBEZXNjCi1Ac3Vic3Vic2VjdGlvbiBEZXNjcmlwdG9yCi0KLUBjaW5kZXggZGVzY3JpcHRvciwgb2YgQGNvZGV7YS5vdXR9IHN5bWJvbAotVGhpcyBpcyBhbiBhcmJpdHJhcnkgMTYtYml0IHZhbHVlLiAgWW91IG1heSBlc3RhYmxpc2ggYSBzeW1ib2wncwotZGVzY3JpcHRvciB2YWx1ZSBieSB1c2luZyBhIEBjb2Rley5kZXNjfSBzdGF0ZW1lbnQKLShAcHhyZWZ7RGVzYywsQGNvZGV7LmRlc2N9fSkuICBBIGRlc2NyaXB0b3IgdmFsdWUgbWVhbnMgbm90aGluZyB0bwotQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBub2RlIFN5bWJvbCBPdGhlcgotQHN1YnN1YnNlY3Rpb24gT3RoZXIKLQotQGNpbmRleCBvdGhlciBhdHRyaWJ1dGUsIG9mIEBjb2Rle2Eub3V0fSBzeW1ib2wKLVRoaXMgaXMgYW4gYXJiaXRyYXJ5IDgtYml0IHZhbHVlLiAgSXQgbWVhbnMgbm90aGluZyB0byBAY29kZXtAdmFsdWV7QVN9fS4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IENPRkYKLUBub2RlIENPRkYgU3ltYm9scwotQHN1YnNlY3Rpb24gU3ltYm9sIEF0dHJpYnV0ZXMgZm9yIENPRkYKLQotQGNpbmRleCBDT0ZGIHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBDT0ZGCi0KLVRoZSBDT0ZGIGZvcm1hdCBzdXBwb3J0cyBhIG11bHRpdHVkZSBvZiBhdXhpbGlhcnkgc3ltYm9sIGF0dHJpYnV0ZXM7Ci1saWtlIHRoZSBwcmltYXJ5IHN5bWJvbCBhdHRyaWJ1dGVzLCB0aGV5IGFyZSBzZXQgYmV0d2VlbiBAY29kZXsuZGVmfSBhbmQKLUBjb2Rley5lbmRlZn0gZGlyZWN0aXZlcy4KLQotQHN1YnN1YnNlY3Rpb24gUHJpbWFyeSBBdHRyaWJ1dGVzCi0KLUBjaW5kZXggcHJpbWFyeSBhdHRyaWJ1dGVzLCBDT0ZGIHN5bWJvbHMKLVRoZSBzeW1ib2wgbmFtZSBpcyBzZXQgd2l0aCBAY29kZXsuZGVmfTsgdGhlIHZhbHVlIGFuZCB0eXBlLAotcmVzcGVjdGl2ZWx5LCB3aXRoIEBjb2Rley52YWx9IGFuZCBAY29kZXsudHlwZX0uCi0KLUBzdWJzdWJzZWN0aW9uIEF1eGlsaWFyeSBBdHRyaWJ1dGVzCi0KLUBjaW5kZXggYXV4aWxpYXJ5IGF0dHJpYnV0ZXMsIENPRkYgc3ltYm9scwotVGhlIEBjb2Rle0B2YWx1ZXtBU319IGRpcmVjdGl2ZXMgQGNvZGV7LmRpbX0sIEBjb2Rley5saW5lfSwgQGNvZGV7LnNjbH0sCi1AY29kZXsuc2l6ZX0sIGFuZCBAY29kZXsudGFnfSBjYW4gZ2VuZXJhdGUgYXV4aWxpYXJ5IHN5bWJvbCB0YWJsZQotaW5mb3JtYXRpb24gZm9yIENPRkYuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBTT00KLUBub2RlIFNPTSBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlcyBmb3IgU09NCi0KLUBjaW5kZXggU09NIHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBTT00KLQotVGhlIFNPTSBmb3JtYXQgZm9yIHRoZSBIUFBBIHN1cHBvcnRzIGEgbXVsdGl0dWRlIG9mIHN5bWJvbCBhdHRyaWJ1dGVzIHNldCB3aXRoCi10aGUgQGNvZGV7LkVYUE9SVH0gYW5kIEBjb2Rley5JTVBPUlR9IGRpcmVjdGl2ZXMuCi0KLVRoZSBhdHRyaWJ1dGVzIGFyZSBkZXNjcmliZWQgaW4gQGNpdGV7SFA5MDAwIFNlcmllcyA4MDAgQXNzZW1ibHkgCi1MYW5ndWFnZSBSZWZlcmVuY2UgTWFudWFsfSAoSFAgOTI0MzItOTAwMDEpIHVuZGVyIHRoZSBAY29kZXtJTVBPUlR9IGFuZAotQGNvZGV7RVhQT1JUfSBhc3NlbWJsZXIgZGlyZWN0aXZlIGRvY3VtZW50YXRpb24uCi1AZW5kIGlmc2V0Ci0KLUBub2RlIEV4cHJlc3Npb25zCi1AY2hhcHRlciBFeHByZXNzaW9ucwotCi1AY2luZGV4IGV4cHJlc3Npb25zCi1AY2luZGV4IGFkZHJlc3NlcwotQGNpbmRleCBudW1lcmljIHZhbHVlcwotQW4gQGRmbntleHByZXNzaW9ufSBzcGVjaWZpZXMgYW4gYWRkcmVzcyBvciBudW1lcmljIHZhbHVlLgotV2hpdGVzcGFjZSBtYXkgcHJlY2VkZSBhbmQvb3IgZm9sbG93IGFuIGV4cHJlc3Npb24uCi0KLVRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiBtdXN0IGJlIGFuIGFic29sdXRlIG51bWJlciwgb3IgZWxzZSBhbiBvZmZzZXQgaW50bwotYSBwYXJ0aWN1bGFyIHNlY3Rpb24uICBJZiBhbiBleHByZXNzaW9uIGlzIG5vdCBhYnNvbHV0ZSwgYW5kIHRoZXJlIGlzIG5vdAotZW5vdWdoIGluZm9ybWF0aW9uIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gc2VlcyB0aGUgZXhwcmVzc2lvbiB0byBrbm93IGl0cwotc2VjdGlvbiwgYSBzZWNvbmQgcGFzcyBvdmVyIHRoZSBzb3VyY2UgcHJvZ3JhbSBtaWdodCBiZSBuZWNlc3NhcnkgdG8gaW50ZXJwcmV0Ci10aGUgZXhwcmVzc2lvbi0tLWJ1dCB0aGUgc2Vjb25kIHBhc3MgaXMgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZC4KLUBjb2Rle0B2YWx1ZXtBU319IGFib3J0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhpcyBzaXR1YXRpb24uCi0KLUBtZW51Ci0qIEVtcHR5IEV4cHJzOjogICAgICAgICAgICAgICAgIEVtcHR5IEV4cHJlc3Npb25zCi0qIEludGVnZXIgRXhwcnM6OiAgICAgICAgICAgICAgIEludGVnZXIgRXhwcmVzc2lvbnMKLUBlbmQgbWVudQotCi1Abm9kZSBFbXB0eSBFeHBycwotQHNlY3Rpb24gRW1wdHkgRXhwcmVzc2lvbnMKLQotQGNpbmRleCBlbXB0eSBleHByZXNzaW9ucwotQGNpbmRleCBleHByZXNzaW9ucywgZW1wdHkKLUFuIGVtcHR5IGV4cHJlc3Npb24gaGFzIG5vIHZhbHVlOiBpdCBpcyBqdXN0IHdoaXRlc3BhY2Ugb3IgbnVsbC4KLVdoZXJldmVyIGFuIGFic29sdXRlIGV4cHJlc3Npb24gaXMgcmVxdWlyZWQsIHlvdSBtYXkgb21pdCB0aGUKLWV4cHJlc3Npb24sIGFuZCBAY29kZXtAdmFsdWV7QVN9fSBhc3N1bWVzIGEgdmFsdWUgb2YgKGFic29sdXRlKSAwLiAgVGhpcwotaXMgY29tcGF0aWJsZSB3aXRoIG90aGVyIGFzc2VtYmxlcnMuCi0KLUBub2RlIEludGVnZXIgRXhwcnMKLUBzZWN0aW9uIEludGVnZXIgRXhwcmVzc2lvbnMKLQotQGNpbmRleCBpbnRlZ2VyIGV4cHJlc3Npb25zCi1AY2luZGV4IGV4cHJlc3Npb25zLCBpbnRlZ2VyCi1BbiBAZGZue2ludGVnZXIgZXhwcmVzc2lvbn0gaXMgb25lIG9yIG1vcmUgQGVtcGh7YXJndW1lbnRzfSBkZWxpbWl0ZWQKLWJ5IEBlbXBoe29wZXJhdG9yc30uCi0KLUBtZW51Ci0qIEFyZ3VtZW50czo6ICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50cwotKiBPcGVyYXRvcnM6OiAgICAgICAgICAgICAgICAgICBPcGVyYXRvcnMKLSogUHJlZml4IE9wczo6ICAgICAgICAgICAgICAgICAgUHJlZml4IE9wZXJhdG9ycwotKiBJbmZpeCBPcHM6OiAgICAgICAgICAgICAgICAgICBJbmZpeCBPcGVyYXRvcnMKLUBlbmQgbWVudQotCi1Abm9kZSBBcmd1bWVudHMKLUBzdWJzZWN0aW9uIEFyZ3VtZW50cwotCi1AY2luZGV4IGV4cHJlc3Npb24gYXJndW1lbnRzCi1AY2luZGV4IGFyZ3VtZW50cyBpbiBleHByZXNzaW9ucwotQGNpbmRleCBvcGVyYW5kcyBpbiBleHByZXNzaW9ucwotQGNpbmRleCBhcml0aG1ldGljIG9wZXJhbmRzCi1AZGZue0FyZ3VtZW50c30gYXJlIHN5bWJvbHMsIG51bWJlcnMgb3Igc3ViZXhwcmVzc2lvbnMuICBJbiBvdGhlcgotY29udGV4dHMgYXJndW1lbnRzIGFyZSBzb21ldGltZXMgY2FsbGVkIGBgYXJpdGhtZXRpYyBvcGVyYW5kcycnLiAgSW4KLXRoaXMgbWFudWFsLCB0byBhdm9pZCBjb25mdXNpbmcgdGhlbSB3aXRoIHRoZSBgYGluc3RydWN0aW9uIG9wZXJhbmRzJycgb2YKLXRoZSBtYWNoaW5lIGxhbmd1YWdlLCB3ZSB1c2UgdGhlIHRlcm0gYGBhcmd1bWVudCcnIHRvIHJlZmVyIHRvIHBhcnRzIG9mCi1leHByZXNzaW9ucyBvbmx5LCByZXNlcnZpbmcgdGhlIHdvcmQgYGBvcGVyYW5kJycgdG8gcmVmZXIgb25seSB0byBtYWNoaW5lCi1pbnN0cnVjdGlvbiBvcGVyYW5kcy4KLQotU3ltYm9scyBhcmUgZXZhbHVhdGVkIHRvIHlpZWxkIEB7QHZhcntzZWN0aW9ufSBAdmFye05OTn1AfSB3aGVyZQotQHZhcntzZWN0aW9ufSBpcyBvbmUgb2YgdGV4dCwgZGF0YSwgYnNzLCBhYnNvbHV0ZSwKLW9yIHVuZGVmaW5lZC4gIEB2YXJ7Tk5OfSBpcyBhIHNpZ25lZCwgMidzIGNvbXBsZW1lbnQgMzIgYml0Ci1pbnRlZ2VyLgotCi1OdW1iZXJzIGFyZSB1c3VhbGx5IGludGVnZXJzLgotCi1BIG51bWJlciBjYW4gYmUgYSBmbG9udW0gb3IgYmlnbnVtLiAgSW4gdGhpcyBjYXNlLCB5b3UgYXJlIHdhcm5lZAotdGhhdCBvbmx5IHRoZSBsb3cgb3JkZXIgMzIgYml0cyBhcmUgdXNlZCwgYW5kIEBjb2Rle0B2YWx1ZXtBU319IHByZXRlbmRzCi10aGVzZSAzMiBiaXRzIGFyZSBhbiBpbnRlZ2VyLiAgWW91IG1heSB3cml0ZSBpbnRlZ2VyLW1hbmlwdWxhdGluZwotaW5zdHJ1Y3Rpb25zIHRoYXQgYWN0IG9uIGV4b3RpYyBjb25zdGFudHMsIGNvbXBhdGlibGUgd2l0aCBvdGhlcgotYXNzZW1ibGVycy4KLQotQGNpbmRleCBzdWJleHByZXNzaW9ucwotU3ViZXhwcmVzc2lvbnMgYXJlIGEgbGVmdCBwYXJlbnRoZXNpcyBAc2FtcHsofSBmb2xsb3dlZCBieSBhbiBpbnRlZ2VyCi1leHByZXNzaW9uLCBmb2xsb3dlZCBieSBhIHJpZ2h0IHBhcmVudGhlc2lzIEBzYW1weyl9OyBvciBhIHByZWZpeAotb3BlcmF0b3IgZm9sbG93ZWQgYnkgYW4gYXJndW1lbnQuCi0KLUBub2RlIE9wZXJhdG9ycwotQHN1YnNlY3Rpb24gT3BlcmF0b3JzCi0KLUBjaW5kZXggb3BlcmF0b3JzLCBpbiBleHByZXNzaW9ucwotQGNpbmRleCBhcml0aG1ldGljIGZ1bmN0aW9ucwotQGNpbmRleCBmdW5jdGlvbnMsIGluIGV4cHJlc3Npb25zCi1AZGZue09wZXJhdG9yc30gYXJlIGFyaXRobWV0aWMgZnVuY3Rpb25zLCBsaWtlIEBjb2Rleyt9IG9yIEBjb2RleyV9LiAgUHJlZml4Ci1vcGVyYXRvcnMgYXJlIGZvbGxvd2VkIGJ5IGFuIGFyZ3VtZW50LiAgSW5maXggb3BlcmF0b3JzIGFwcGVhcgotYmV0d2VlbiB0aGVpciBhcmd1bWVudHMuICBPcGVyYXRvcnMgbWF5IGJlIHByZWNlZGVkIGFuZC9vciBmb2xsb3dlZCBieQotd2hpdGVzcGFjZS4KLQotQG5vZGUgUHJlZml4IE9wcwotQHN1YnNlY3Rpb24gUHJlZml4IE9wZXJhdG9yCi0KLUBjaW5kZXggcHJlZml4IG9wZXJhdG9ycwotQGNvZGV7QHZhbHVle0FTfX0gaGFzIHRoZSBmb2xsb3dpbmcgQGRmbntwcmVmaXggb3BlcmF0b3JzfS4gIFRoZXkgZWFjaCB0YWtlCi1vbmUgYXJndW1lbnQsIHdoaWNoIG11c3QgYmUgYWJzb2x1dGUuCi0KLUBjIHRoZSB0ZXgvZW5kIHRleCBzdHVmZiBzdXJyb3VuZGluZyB0aGlzIHNtYWxsIHRhYmxlIGlzIG1lYW50IHRvIG1ha2UKLUBjIGl0IGFsaWduLCBvbiB0aGUgcHJpbnRlZCBwYWdlLCB3aXRoIHRoZSBzaW1pbGFyIHRhYmxlIGluIHRoZSBuZXh0Ci1AYyBzZWN0aW9uICh3aGljaCBpcyBpbnNpZGUgYW4gZW51bWVyYXRlKS4KLUB0ZXgKLVxnbG9iYWxcYWR2YW5jZVxsZWZ0c2tpcCBieSBcaXRlbWluZGVudAotQGVuZCB0ZXgKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtCi1AZGZue05lZ2F0aW9ufS4gIFR3bydzIGNvbXBsZW1lbnQgbmVnYXRpb24uCi1AaXRlbSB+Ci1AZGZue0NvbXBsZW1lbnRhdGlvbn0uICBCaXR3aXNlIG5vdC4KLUBlbmQgdGFibGUKLQotQHRleAotXGdsb2JhbFxhZHZhbmNlXGxlZnRza2lwIGJ5IC1caXRlbWluZGVudAotQGVuZCB0ZXgKLQotQG5vZGUgSW5maXggT3BzCi1Ac3Vic2VjdGlvbiBJbmZpeCBPcGVyYXRvcnMKLQotQGNpbmRleCBpbmZpeCBvcGVyYXRvcnMKLUBjaW5kZXggb3BlcmF0b3JzLCBwZXJtaXR0ZWQgYXJndW1lbnRzCi1AZGZue0luZml4IG9wZXJhdG9yc30gdGFrZSB0d28gYXJndW1lbnRzLCBvbmUgb24gZWl0aGVyIHNpZGUuICBPcGVyYXRvcnMKLWhhdmUgcHJlY2VkZW5jZSwgYnV0IG9wZXJhdGlvbnMgd2l0aCBlcXVhbCBwcmVjZWRlbmNlIGFyZSBwZXJmb3JtZWQgbGVmdAotdG8gcmlnaHQuICBBcGFydCBmcm9tIEBjb2Rleyt9IG9yIEBjb2Rley19LCBib3RoIGFyZ3VtZW50cyBtdXN0IGJlCi1hYnNvbHV0ZSwgYW5kIHRoZSByZXN1bHQgaXMgYWJzb2x1dGUuCi0KLUBlbnVtZXJhdGUKLUBjaW5kZXggb3BlcmF0b3IgcHJlY2VkZW5jZQotQGNpbmRleCBwcmVjZWRlbmNlIG9mIG9wZXJhdG9ycwotCi1AaXRlbQotSGlnaGVzdCBQcmVjZWRlbmNlCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gKgotQGRmbntNdWx0aXBsaWNhdGlvbn0uCi0KLUBpdGVtIC8KLUBkZm57RGl2aXNpb259LiAgVHJ1bmNhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgQyBvcGVyYXRvciBAc2FtcHsvfQotCi1AaXRlbSAlCi1AZGZue1JlbWFpbmRlcn0uCi0KLUBpdGVtIDwKLUBpdGVteCA8PAotQGRmbntTaGlmdCBMZWZ0fS4gIFNhbWUgYXMgdGhlIEMgb3BlcmF0b3IgQHNhbXB7PDx9LgotCi1AaXRlbSA+Ci1AaXRlbXggPj4KLUBkZm57U2hpZnQgUmlnaHR9LiAgU2FtZSBhcyB0aGUgQyBvcGVyYXRvciBAc2FtcHs+Pn0uCi1AZW5kIHRhYmxlCi0KLUBpdGVtCi1JbnRlcm1lZGlhdGUgcHJlY2VkZW5jZQotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHwKLQotQGRmbntCaXR3aXNlIEluY2x1c2l2ZSBPcn0uCi0KLUBpdGVtICYKLUBkZm57Qml0d2lzZSBBbmR9LgotCi1AaXRlbSBeCi1AZGZue0JpdHdpc2UgRXhjbHVzaXZlIE9yfS4KLQotQGl0ZW0gIQotQGRmbntCaXR3aXNlIE9yIE5vdH0uCi1AZW5kIHRhYmxlCi0KLUBpdGVtCi1Mb3dlc3QgUHJlY2VkZW5jZQotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggYWRkaXRpb24sIHBlcm1pdHRlZCBhcmd1bWVudHMKLUBjaW5kZXggcGx1cywgcGVybWl0dGVkIGFyZ3VtZW50cwotQGNpbmRleCBhcmd1bWVudHMgZm9yIGFkZGl0aW9uCi1AaXRlbSArCi1AZGZue0FkZGl0aW9ufS4gIElmIGVpdGhlciBhcmd1bWVudCBpcyBhYnNvbHV0ZSwgdGhlIHJlc3VsdCBoYXMgdGhlIHNlY3Rpb24gb2YKLXRoZSBvdGhlciBhcmd1bWVudC4gIFlvdSBtYXkgbm90IGFkZCB0b2dldGhlciBhcmd1bWVudHMgZnJvbSBkaWZmZXJlbnQKLXNlY3Rpb25zLgotCi1AY2luZGV4IHN1YnRyYWN0aW9uLCBwZXJtaXR0ZWQgYXJndW1lbnRzCi1AY2luZGV4IG1pbnVzLCBwZXJtaXR0ZWQgYXJndW1lbnRzCi1AY2luZGV4IGFyZ3VtZW50cyBmb3Igc3VidHJhY3Rpb24KLUBpdGVtIC0KLUBkZm57U3VidHJhY3Rpb259LiAgSWYgdGhlIHJpZ2h0IGFyZ3VtZW50IGlzIGFic29sdXRlLCB0aGUKLXJlc3VsdCBoYXMgdGhlIHNlY3Rpb24gb2YgdGhlIGxlZnQgYXJndW1lbnQuCi1JZiBib3RoIGFyZ3VtZW50cyBhcmUgaW4gdGhlIHNhbWUgc2VjdGlvbiwgdGhlIHJlc3VsdCBpcyBhYnNvbHV0ZS4KLVlvdSBtYXkgbm90IHN1YnRyYWN0IGFyZ3VtZW50cyBmcm9tIGRpZmZlcmVudCBzZWN0aW9ucy4KLUBjIEZJWE1FIGlzIHRoZXJlIHN0aWxsIHNvbWV0aGluZyB1c2VmdWwgdG8gc2F5IGFib3V0IHVuZGVmaW5lZCAtIHVuZGVmaW5lZCA/Ci1AZW5kIHRhYmxlCi1AZW5kIGVudW1lcmF0ZQotCi1JbiBzaG9ydCwgaXQncyBvbmx5IG1lYW5pbmdmdWwgdG8gYWRkIG9yIHN1YnRyYWN0IHRoZSBAZW1waHtvZmZzZXRzfSBpbiBhbgotYWRkcmVzczsgeW91IGNhbiBvbmx5IGhhdmUgYSBkZWZpbmVkIHNlY3Rpb24gaW4gb25lIG9mIHRoZSB0d28gYXJndW1lbnRzLgotCi1Abm9kZSBQc2V1ZG8gT3BzCi1AY2hhcHRlciBBc3NlbWJsZXIgRGlyZWN0aXZlcwotCi1AY2luZGV4IGRpcmVjdGl2ZXMsIG1hY2hpbmUgaW5kZXBlbmRlbnQKLUBjaW5kZXggcHNldWRvLW9wcywgbWFjaGluZSBpbmRlcGVuZGVudAotQGNpbmRleCBtYWNoaW5lIGluZGVwZW5kZW50IGRpcmVjdGl2ZXMKLUFsbCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBoYXZlIG5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIHBlcmlvZCAoQHNhbXB7Ln0pLgotVGhlIHJlc3Qgb2YgdGhlIG5hbWUgaXMgbGV0dGVycywgdXN1YWxseSBpbiBsb3dlciBjYXNlLgotCi1UaGlzIGNoYXB0ZXIgZGlzY3Vzc2VzIGRpcmVjdGl2ZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHJlZ2FyZGxlc3Mgb2YgdGhlCi10YXJnZXQgbWFjaGluZSBjb25maWd1cmF0aW9uIGZvciB0aGUgQHNje2dudX0gYXNzZW1ibGVyLgotQGlmc2V0IEdFTkVSSUMKLVNvbWUgbWFjaGluZSBjb25maWd1cmF0aW9ucyBwcm92aWRlIGFkZGl0aW9uYWwgZGlyZWN0aXZlcy4KLUB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBtYWNoaW5lLWRpcmVjdGl2ZXMKLUB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfSBmb3IgYWRkaXRpb25hbCBkaXJlY3RpdmVzLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBtZW51Ci0qIEFib3J0OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5hYm9ydH0KLUBpZnNldCBDT0ZGCi0qIEFCT1JUOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5BQk9SVH0KLUBlbmQgaWZzZXQKLQotKiBBbGlnbjo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYWxpZ24gQHZhcnthYnMtZXhwcn0gLCBAdmFye2Ficy1leHByfX0KLSogQXNjaWk6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmFzY2lpICJAdmFye3N0cmluZ30ifUBkb3Rze30KLSogQXNjaXo6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmFzY2l6ICJAdmFye3N0cmluZ30ifUBkb3Rze30KLSogQmFsaWduOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmJhbGlnbiBAdmFye2Ficy1leHByfSAsIEB2YXJ7YWJzLWV4cHJ9fQotKiBCeXRlOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYnl0ZSBAdmFye2V4cHJlc3Npb25zfX0KLSogQ29tbTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmNvbW0gQHZhcntzeW1ib2x9ICwgQHZhcntsZW5ndGh9IH0KLSogRGF0YTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRhdGEgQHZhcntzdWJzZWN0aW9ufX0KLUBpZnNldCBDT0ZGCi0qIERlZjo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5kZWYgQHZhcntuYW1lfX0KLUBlbmQgaWZzZXQKLUBpZnNldCBhb3V0LWJvdXQKLSogRGVzYzo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRlc2MgQHZhcntzeW1ib2x9LCBAdmFye2Ficy1leHByZXNzaW9ufX0KLUBlbmQgaWZzZXQKLUBpZnNldCBDT0ZGCi0qIERpbTo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5kaW19Ci1AZW5kIGlmc2V0Ci0KLSogRG91YmxlOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRvdWJsZSBAdmFye2Zsb251bXN9fQotKiBFamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZWplY3R9Ci0qIEVsc2U6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lbHNlfQotKiBFbmQ6OgkJCQlAY29kZXsuZW5kfQotQGlmc2V0IENPRkYKLSogRW5kZWY6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVuZGVmfQotQGVuZCBpZnNldAotCi0qIEVuZGZ1bmM6OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lbmRmdW5jfQotKiBFbmRpZjo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZW5kaWZ9Ci0qIEVxdTo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lcXUgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotKiBFcXVpdjo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZXF1aXYgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotKiBFcnI6OgkJCQlAY29kZXsuZXJyfQotKiBFeGl0bTo6CQkJQGNvZGV7LmV4aXRtfQotKiBFeHRlcm46OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZXh0ZXJufQotKiBGYWlsOjoJCQlAY29kZXsuZmFpbH0KLUBpZmNsZWFyIG5vLWZpbGUtZGlyCi0qIEZpbGU6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5maWxlIEB2YXJ7c3RyaW5nfX0KLUBlbmQgaWZjbGVhcgotCi0qIEZpbGw6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5maWxsIEB2YXJ7cmVwZWF0fSAsIEB2YXJ7c2l6ZX0gLCBAdmFye3ZhbHVlfX0KLSogRmxvYXQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmZsb2F0IEB2YXJ7ZmxvbnVtc319Ci0qIEZ1bmM6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5mdW5jfSAgCi0qIEdsb2JhbDo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5nbG9iYWwgQHZhcntzeW1ib2x9fSwgQGNvZGV7Lmdsb2JsIEB2YXJ7c3ltYm9sfX0KLSogaHdvcmQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7Lmh3b3JkIEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBJZGVudDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuaWRlbnR9Ci0qIElmOjogICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5pZiBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259fQotKiBJbmNsdWRlOjogICAgICAgICAgICAgICAgICAgICBAY29kZXsuaW5jbHVkZSAiQHZhcntmaWxlfSJ9Ci0qIEludDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5pbnQgQHZhcntleHByZXNzaW9uc319Ci0qIElycDo6CQkJCUBjb2Rley5pcnAgQHZhcntzeW1ib2x9LEB2YXJ7dmFsdWVzfX1AZG90c3t9Ci0qIElycGM6OgkJCUBjb2Rley5pcnBjIEB2YXJ7c3ltYm9sfSxAdmFye3ZhbHVlc319QGRvdHN7fQotKiBMY29tbTo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubGNvbW0gQHZhcntzeW1ib2x9ICwgQHZhcntsZW5ndGh9fQotKiBMZmxhZ3M6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubGZsYWdzfQotQGlmY2xlYXIgbm8tbGluZS1kaXIKLSogTGluZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmxpbmUgQHZhcntsaW5lLW51bWJlcn19Ci1AZW5kIGlmY2xlYXIKLQotKiBMbjo6ICAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubG4gQHZhcntsaW5lLW51bWJlcn19Ci0qIExpbmtvbmNlOjoJCQlAY29kZXsubGlua29uY2UgW0B2YXJ7dHlwZX1dfQotKiBMaXN0OjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubGlzdH0KLSogTG9uZzo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmxvbmcgQHZhcntleHByZXNzaW9uc319Ci1AaWdub3JlCi0qIExzeW06OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5sc3ltIEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KLUBlbmQgaWdub3JlCi0KLSogTWFjcm86OgkJCUBjb2Rley5tYWNybyBAdmFye25hbWV9IEB2YXJ7YXJnc319QGRvdHN7fQotKiBNUkk6OgkJCQlAY29kZXsubXJpIEB2YXJ7dmFsfX0KLQotKiBOb2xpc3Q6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubm9saXN0fQotKiBPY3RhOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsub2N0YSBAdmFye2JpZ251bXN9fQotKiBPcmc6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsub3JnIEB2YXJ7bmV3LWxjfSAsIEB2YXJ7ZmlsbH19Ci0qIFAyYWxpZ246OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5wMmFsaWduIEB2YXJ7YWJzLWV4cHJ9ICwgQHZhcnthYnMtZXhwcn19Ci0qIFByaW50OjoJCQlAY29kZXsucHJpbnQgQHZhcntzdHJpbmd9fQotKiBQc2l6ZTo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsucHNpemUgQHZhcntsaW5lc30sIEB2YXJ7Y29sdW1uc319Ci0qIFB1cmdlbTo6CQkJQGNvZGV7LnB1cmdlbSBAdmFye25hbWV9fQotKiBRdWFkOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsucXVhZCBAdmFye2JpZ251bXN9fQotKiBSZXB0OjoJCQlAY29kZXsucmVwdCBAdmFye2NvdW50fX0KLSogU2J0dGw6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNidHRsICJAdmFye3N1YmhlYWRpbmd9In0KLUBpZnNldCBDT0ZGCi0qIFNjbDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zY2wgQHZhcntjbGFzc319Ci0qIFNlY3Rpb246OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zZWN0aW9uIEB2YXJ7bmFtZX0sIEB2YXJ7c3Vic2VjdGlvbn19Ci1AZW5kIGlmc2V0Ci0KLSogU2V0OjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNldCBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0qIFNob3J0OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zaG9ydCBAdmFye2V4cHJlc3Npb25zfX0KLSogU2luZ2xlOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNpbmdsZSBAdmFye2Zsb251bXN9fQotQGlmc2V0IENPRkYKLSogU2l6ZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNpemV9Ci1AZW5kIGlmc2V0Ci0KLSogU2tpcDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNraXAgQHZhcntzaXplfSAsIEB2YXJ7ZmlsbH19Ci0qIFNsZWIxMjg6OgkJCUBjb2Rley5zbGViMTI4IEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBTcGFjZTo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc3BhY2UgQHZhcntzaXplfSAsIEB2YXJ7ZmlsbH19Ci1AaWZzZXQgaGF2ZS1zdGFicwotKiBTdGFiOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc3RhYmQsIC5zdGFibiwgLnN0YWJzfQotQGVuZCBpZnNldAotCi0qIFN0cmluZzo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zdHJpbmcgIkB2YXJ7c3RyfSJ9Ci0qIFN0cnVjdDo6CQkJQGNvZGV7LnN0cnVjdCBAdmFye2V4cHJlc3Npb259fQotQGlmc2V0IEVMRgotKiBTeW12ZXI6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc3ltdmVyIEB2YXJ7bmFtZX0sQHZhcntuYW1lMkBAbm9kZW5hbWV9fQotQGVuZCBpZnNldAotQGlmc2V0IENPRkYKLSogVGFnOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnRhZyBAdmFye3N0cnVjdG5hbWV9fQotQGVuZCBpZnNldAotCi0qIFRleHQ6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley50ZXh0IEB2YXJ7c3Vic2VjdGlvbn19Ci0qIFRpdGxlOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley50aXRsZSAiQHZhcntoZWFkaW5nfSJ9Ci1AaWZzZXQgQ09GRgotKiBUeXBlOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsudHlwZSBAdmFye2ludH19Ci0qIFZhbDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley52YWwgQHZhcnthZGRyfX0KLUBlbmQgaWZzZXQKLQotKiBVbGViMTI4OjogICAgICAgICAgICAgICAgICAgICBAY29kZXsudWxlYjEyOCBAdmFye2V4cHJlc3Npb25zfX0KLSogV29yZDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LndvcmQgQHZhcntleHByZXNzaW9uc319Ci0qIERlcHJlY2F0ZWQ6OiAgICAgICAgICAgICAgICAgIERlcHJlY2F0ZWQgRGlyZWN0aXZlcwotQGVuZCBtZW51Ci0KLUBub2RlIEFib3J0Ci1Ac2VjdGlvbiBAY29kZXsuYWJvcnR9Ci0KLUBjaW5kZXggQGNvZGV7YWJvcnR9IGRpcmVjdGl2ZQotQGNpbmRleCBzdG9wcGluZyB0aGUgYXNzZW1ibHkKLVRoaXMgZGlyZWN0aXZlIHN0b3BzIHRoZSBhc3NlbWJseSBpbW1lZGlhdGVseS4gIEl0IGlzIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGFzc2VtYmxlcnMuICBUaGUgb3JpZ2luYWwgaWRlYSB3YXMgdGhhdCB0aGUKLWFzc2VtYmx5IGxhbmd1YWdlIHNvdXJjZSB3b3VsZCBiZSBwaXBlZCBpbnRvIHRoZSBhc3NlbWJsZXIuICBJZiB0aGUgc2VuZGVyCi1vZiB0aGUgc291cmNlIHF1aXQsIGl0IGNvdWxkIHVzZSB0aGlzIGRpcmVjdGl2ZSB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0bwotcXVpdCBhbHNvLiAgT25lIGRheSBAY29kZXsuYWJvcnR9IHdpbGwgbm90IGJlIHN1cHBvcnRlZC4KLQotQGlmc2V0IENPRkYKLUBub2RlIEFCT1JUCi1Ac2VjdGlvbiBAY29kZXsuQUJPUlR9Ci0KLUBjaW5kZXggQGNvZGV7QUJPUlR9IGRpcmVjdGl2ZQotV2hlbiBwcm9kdWNpbmcgQ09GRiBvdXRwdXQsIEBjb2Rle0B2YWx1ZXtBU319IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYXMgYQotc3lub255bSBmb3IgQHNhbXB7LmFib3J0fS4KLQotQGlmc2V0IEJPVVQKLVdoZW4gcHJvZHVjaW5nIEBjb2Rle2Iub3V0fSBvdXRwdXQsIEBjb2Rle0B2YWx1ZXtBU319IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUsCi1idXQgaWdub3JlcyBpdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQG5vZGUgQWxpZ24KLUBzZWN0aW9uIEBjb2Rley5hbGlnbiBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn0sIEB2YXJ7YWJzLWV4cHJ9fQotCi1AY2luZGV4IHBhZGRpbmcgdGhlIGxvY2F0aW9uIGNvdW50ZXIKLUBjaW5kZXggQGNvZGV7YWxpZ259IGRpcmVjdGl2ZQotUGFkIHRoZSBsb2NhdGlvbiBjb3VudGVyIChpbiB0aGUgY3VycmVudCBzdWJzZWN0aW9uKSB0byBhIHBhcnRpY3VsYXIgc3RvcmFnZQotYm91bmRhcnkuICBUaGUgZmlyc3QgZXhwcmVzc2lvbiAod2hpY2ggbXVzdCBiZSBhYnNvbHV0ZSkgaXMgdGhlIGFsaWdubWVudAotcmVxdWlyZWQsIGFzIGRlc2NyaWJlZCBiZWxvdy4KLQotVGhlIHNlY29uZCBleHByZXNzaW9uIChhbHNvIGFic29sdXRlKSBnaXZlcyB0aGUgZmlsbCB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gdGhlCi1wYWRkaW5nIGJ5dGVzLiAgSXQgKGFuZCB0aGUgY29tbWEpIG1heSBiZSBvbWl0dGVkLiAgSWYgaXQgaXMgb21pdHRlZCwgdGhlCi1wYWRkaW5nIGJ5dGVzIGFyZSBub3JtYWxseSB6ZXJvLiAgSG93ZXZlciwgb24gc29tZSBzeXN0ZW1zLCBpZiB0aGUgc2VjdGlvbiBpcwotbWFya2VkIGFzIGNvbnRhaW5pbmcgY29kZSBhbmQgdGhlIGZpbGwgdmFsdWUgaXMgb21pdHRlZCwgdGhlIHNwYWNlIGlzIGZpbGxlZAotd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMuCi0KLVRoZSB0aGlyZCBleHByZXNzaW9uIGlzIGFsc28gYWJzb2x1dGUsIGFuZCBpcyBhbHNvIG9wdGlvbmFsLiAgSWYgaXQgaXMgcHJlc2VudCwKLWl0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGJ5IHRoaXMgYWxpZ25tZW50Ci1kaXJlY3RpdmUuICBJZiBkb2luZyB0aGUgYWxpZ25tZW50IHdvdWxkIHJlcXVpcmUgc2tpcHBpbmcgbW9yZSBieXRlcyB0aGFuIHRoZQotc3BlY2lmaWVkIG1heGltdW0sIHRoZW4gdGhlIGFsaWdubWVudCBpcyBub3QgZG9uZSBhdCBhbGwuICBZb3UgY2FuIG9taXQgdGhlCi1maWxsIHZhbHVlICh0aGUgc2Vjb25kIGFyZ3VtZW50KSBlbnRpcmVseSBieSBzaW1wbHkgdXNpbmcgdHdvIGNvbW1hcyBhZnRlciB0aGUKLXJlcXVpcmVkIGFsaWdubWVudDsgdGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBhbGlnbm1lbnQgdG8gYmUgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucyB3aGVuIGFwcHJvcHJpYXRlLgotCi1UaGUgd2F5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQgaXMgc3BlY2lmaWVkIHZhcmllcyBmcm9tIHN5c3RlbSB0byBzeXN0ZW0uCi1Gb3IgdGhlIGEyOWssIGhwcGEsIG02OGssIG04OGssIHc2NSwgc3BhcmMsIGFuZCBIaXRhY2hpIFNILCBhbmQgaTM4NiB1c2luZyBFTEYKLWZvcm1hdCwKLXRoZSBmaXJzdCBleHByZXNzaW9uIGlzIHRoZQotYWxpZ25tZW50IHJlcXVlc3QgaW4gYnl0ZXMuICBGb3IgZXhhbXBsZSBAc2FtcHsuYWxpZ24gOH0gYWR2YW5jZXMKLXRoZSBsb2NhdGlvbiBjb3VudGVyIHVudGlsIGl0IGlzIGEgbXVsdGlwbGUgb2YgOC4gIElmIHRoZSBsb2NhdGlvbiBjb3VudGVyCi1pcyBhbHJlYWR5IGEgbXVsdGlwbGUgb2YgOCwgbm8gY2hhbmdlIGlzIG5lZWRlZC4KLQotRm9yIG90aGVyIHN5c3RlbXMsIGluY2x1ZGluZyB0aGUgaTM4NiB1c2luZyBhLm91dCBmb3JtYXQsIGl0IGlzIHRoZQotbnVtYmVyIG9mIGxvdy1vcmRlciB6ZXJvIGJpdHMgdGhlIGxvY2F0aW9uIGNvdW50ZXIgbXVzdCBoYXZlIGFmdGVyCi1hZHZhbmNlbWVudC4gIEZvciBleGFtcGxlIEBzYW1wey5hbGlnbiAzfSBhZHZhbmNlcyB0aGUgbG9jYXRpb24KLWNvdW50ZXIgdW50aWwgaXQgYSBtdWx0aXBsZSBvZiA4LiAgSWYgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgYWxyZWFkeSBhCi1tdWx0aXBsZSBvZiA4LCBubyBjaGFuZ2UgaXMgbmVlZGVkLgotCi1UaGlzIGluY29uc2lzdGVuY3kgaXMgZHVlIHRvIHRoZSBkaWZmZXJlbnQgYmVoYXZpb3JzIG9mIHRoZSB2YXJpb3VzCi1uYXRpdmUgYXNzZW1ibGVycyBmb3IgdGhlc2Ugc3lzdGVtcyB3aGljaCBHQVMgbXVzdCBlbXVsYXRlLgotR0FTIGFsc28gcHJvdmlkZXMgQGNvZGV7LmJhbGlnbn0gYW5kIEBjb2Rley5wMmFsaWdufSBkaXJlY3RpdmVzLAotZGVzY3JpYmVkIGxhdGVyLCB3aGljaCBoYXZlIGEgY29uc2lzdGVudCBiZWhhdmlvciBhY3Jvc3MgYWxsCi1hcmNoaXRlY3R1cmVzIChidXQgYXJlIHNwZWNpZmljIHRvIEdBUykuCi0KLUBub2RlIEFzY2lpCi1Ac2VjdGlvbiBAY29kZXsuYXNjaWkgIkB2YXJ7c3RyaW5nfSJ9QGRvdHN7fQotCi1AY2luZGV4IEBjb2Rle2FzY2lpfSBkaXJlY3RpdmUKLUBjaW5kZXggc3RyaW5nIGxpdGVyYWxzCi1AY29kZXsuYXNjaWl9IGV4cGVjdHMgemVybyBvciBtb3JlIHN0cmluZyBsaXRlcmFscyAoQHB4cmVme1N0cmluZ3N9KQotc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEl0IGFzc2VtYmxlcyBlYWNoIHN0cmluZyAod2l0aCBubyBhdXRvbWF0aWMKLXRyYWlsaW5nIHplcm8gYnl0ZSkgaW50byBjb25zZWN1dGl2ZSBhZGRyZXNzZXMuCi0KLUBub2RlIEFzY2l6Ci1Ac2VjdGlvbiBAY29kZXsuYXNjaXogIkB2YXJ7c3RyaW5nfSJ9QGRvdHN7fQotCi1AY2luZGV4IEBjb2Rle2FzY2l6fSBkaXJlY3RpdmUKLUBjaW5kZXggemVyby10ZXJtaW5hdGVkIHN0cmluZ3MKLUBjaW5kZXggbnVsbC10ZXJtaW5hdGVkIHN0cmluZ3MKLUBjb2Rley5hc2Npen0gaXMganVzdCBsaWtlIEBjb2Rley5hc2NpaX0sIGJ1dCBlYWNoIHN0cmluZyBpcyBmb2xsb3dlZCBieQotYSB6ZXJvIGJ5dGUuICBUaGUgYGB6JycgaW4gQHNhbXB7LmFzY2l6fSBzdGFuZHMgZm9yIGBgemVybycnLgotCi1Abm9kZSBCYWxpZ24KLUBzZWN0aW9uIEBjb2Rley5iYWxpZ25bd2xdIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn19Ci0KLUBjaW5kZXggcGFkZGluZyB0aGUgbG9jYXRpb24gY291bnRlciBnaXZlbiBudW1iZXIgb2YgYnl0ZXMKLUBjaW5kZXggQGNvZGV7YmFsaWdufSBkaXJlY3RpdmUKLVBhZCB0aGUgbG9jYXRpb24gY291bnRlciAoaW4gdGhlIGN1cnJlbnQgc3Vic2VjdGlvbikgdG8gYSBwYXJ0aWN1bGFyCi1zdG9yYWdlIGJvdW5kYXJ5LiAgVGhlIGZpcnN0IGV4cHJlc3Npb24gKHdoaWNoIG11c3QgYmUgYWJzb2x1dGUpIGlzIHRoZQotYWxpZ25tZW50IHJlcXVlc3QgaW4gYnl0ZXMuICBGb3IgZXhhbXBsZSBAc2FtcHsuYmFsaWduIDh9IGFkdmFuY2VzCi10aGUgbG9jYXRpb24gY291bnRlciB1bnRpbCBpdCBpcyBhIG11bHRpcGxlIG9mIDguICBJZiB0aGUgbG9jYXRpb24gY291bnRlcgotaXMgYWxyZWFkeSBhIG11bHRpcGxlIG9mIDgsIG5vIGNoYW5nZSBpcyBuZWVkZWQuCi0KLVRoZSBzZWNvbmQgZXhwcmVzc2lvbiAoYWxzbyBhYnNvbHV0ZSkgZ2l2ZXMgdGhlIGZpbGwgdmFsdWUgdG8gYmUgc3RvcmVkIGluIHRoZQotcGFkZGluZyBieXRlcy4gIEl0IChhbmQgdGhlIGNvbW1hKSBtYXkgYmUgb21pdHRlZC4gIElmIGl0IGlzIG9taXR0ZWQsIHRoZQotcGFkZGluZyBieXRlcyBhcmUgbm9ybWFsbHkgemVyby4gIEhvd2V2ZXIsIG9uIHNvbWUgc3lzdGVtcywgaWYgdGhlIHNlY3Rpb24gaXMKLW1hcmtlZCBhcyBjb250YWluaW5nIGNvZGUgYW5kIHRoZSBmaWxsIHZhbHVlIGlzIG9taXR0ZWQsIHRoZSBzcGFjZSBpcyBmaWxsZWQKLXdpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zLgotCi1UaGUgdGhpcmQgZXhwcmVzc2lvbiBpcyBhbHNvIGFic29sdXRlLCBhbmQgaXMgYWxzbyBvcHRpb25hbC4gIElmIGl0IGlzIHByZXNlbnQsCi1pdCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBzaG91bGQgYmUgc2tpcHBlZCBieSB0aGlzIGFsaWdubWVudAotZGlyZWN0aXZlLiAgSWYgZG9pbmcgdGhlIGFsaWdubWVudCB3b3VsZCByZXF1aXJlIHNraXBwaW5nIG1vcmUgYnl0ZXMgdGhhbiB0aGUKLXNwZWNpZmllZCBtYXhpbXVtLCB0aGVuIHRoZSBhbGlnbm1lbnQgaXMgbm90IGRvbmUgYXQgYWxsLiAgWW91IGNhbiBvbWl0IHRoZQotZmlsbCB2YWx1ZSAodGhlIHNlY29uZCBhcmd1bWVudCkgZW50aXJlbHkgYnkgc2ltcGx5IHVzaW5nIHR3byBjb21tYXMgYWZ0ZXIgdGhlCi1yZXF1aXJlZCBhbGlnbm1lbnQ7IHRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0aGUgYWxpZ25tZW50IHRvIGJlIGZpbGxlZAotd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMgd2hlbiBhcHByb3ByaWF0ZS4KLQotQGNpbmRleCBAY29kZXtiYWxpZ253fSBkaXJlY3RpdmUKLUBjaW5kZXggQGNvZGV7YmFsaWdubH0gZGlyZWN0aXZlCi1UaGUgQGNvZGV7LmJhbGlnbnd9IGFuZCBAY29kZXsuYmFsaWdubH0gZGlyZWN0aXZlcyBhcmUgdmFyaWFudHMgb2YgdGhlCi1AY29kZXsuYmFsaWdufSBkaXJlY3RpdmUuICBUaGUgQGNvZGV7LmJhbGlnbnd9IGRpcmVjdGl2ZSB0cmVhdHMgdGhlIGZpbGwKLXBhdHRlcm4gYXMgYSB0d28gYnl0ZSB3b3JkIHZhbHVlLiAgVGhlIEBjb2Rley5iYWxpZ25sfSBkaXJlY3RpdmVzIHRyZWF0cyB0aGUKLWZpbGwgcGF0dGVybiBhcyBhIGZvdXIgYnl0ZSBsb25nd29yZCB2YWx1ZS4gIEZvciBleGFtcGxlLCBAY29kZXsuYmFsaWdudwotNCwweDM2OGR9IHdpbGwgYWxpZ24gdG8gYSBtdWx0aXBsZSBvZiA0LiAgSWYgaXQgc2tpcHMgdHdvIGJ5dGVzLCB0aGV5IHdpbGwgYmUKLWZpbGxlZCBpbiB3aXRoIHRoZSB2YWx1ZSAweDM2OGQgKHRoZSBleGFjdCBwbGFjZW1lbnQgb2YgdGhlIGJ5dGVzIGRlcGVuZHMgdXBvbgotdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHByb2Nlc3NvcikuICBJZiBpdCBza2lwcyAxIG9yIDMgYnl0ZXMsIHRoZSBmaWxsIHZhbHVlIGlzCi11bmRlZmluZWQuCi0KLUBub2RlIEJ5dGUKLUBzZWN0aW9uIEBjb2Rley5ieXRlIEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle2J5dGV9IGRpcmVjdGl2ZQotQGNpbmRleCBpbnRlZ2Vycywgb25lIGJ5dGUKLUBjb2Rley5ieXRlfSBleHBlY3RzIHplcm8gb3IgbW9yZSBleHByZXNzaW9ucywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLUVhY2ggZXhwcmVzc2lvbiBpcyBhc3NlbWJsZWQgaW50byB0aGUgbmV4dCBieXRlLgotCi1Abm9kZSBDb21tCi1Ac2VjdGlvbiBAY29kZXsuY29tbSBAdmFye3N5bWJvbH0gLCBAdmFye2xlbmd0aH0gfQotCi1AY2luZGV4IEBjb2Rle2NvbW19IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wsIGNvbW1vbgotQGNvZGV7LmNvbW19IGRlY2xhcmVzIGEgY29tbW9uIHN5bWJvbCBuYW1lZCBAdmFye3N5bWJvbH0uICBXaGVuIGxpbmtpbmcsIGEKLWNvbW1vbiBzeW1ib2wgaW4gb25lIG9iamVjdCBmaWxlIG1heSBiZSBtZXJnZWQgd2l0aCBhIGRlZmluZWQgb3IgY29tbW9uIHN5bWJvbAotb2YgdGhlIHNhbWUgbmFtZSBpbiBhbm90aGVyIG9iamVjdCBmaWxlLiAgSWYgQGNvZGV7QHZhbHVle0xEfX0gZG9lcyBub3Qgc2VlIGEKLWRlZmluaXRpb24gZm9yIHRoZSBzeW1ib2wtLWp1c3Qgb25lIG9yIG1vcmUgY29tbW9uIHN5bWJvbHMtLXRoZW4gaXQgd2lsbAotYWxsb2NhdGUgQHZhcntsZW5ndGh9IGJ5dGVzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiAgQHZhcntsZW5ndGh9IG11c3QgYmUgYW4KLWFic29sdXRlIGV4cHJlc3Npb24uICBJZiBAY29kZXtAdmFsdWV7TER9fSBzZWVzIG11bHRpcGxlIGNvbW1vbiBzeW1ib2xzIHdpdGgKLXRoZSBzYW1lIG5hbWUsIGFuZCB0aGV5IGRvIG5vdCBhbGwgaGF2ZSB0aGUgc2FtZSBzaXplLCBpdCB3aWxsIGFsbG9jYXRlIHNwYWNlCi11c2luZyB0aGUgbGFyZ2VzdCBzaXplLgotCi1AaWZzZXQgRUxGCi1XaGVuIHVzaW5nIEVMRiwgdGhlIEBjb2Rley5jb21tfSBkaXJlY3RpdmUgdGFrZXMgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQuCi1UaGlzIGlzIHRoZSBkZXNpcmVkIGFsaWdubWVudCBvZiB0aGUgc3ltYm9sLCBzcGVjaWZpZWQgYXMgYSBieXRlIGJvdW5kYXJ5IChmb3IKLWV4YW1wbGUsIGFuIGFsaWdubWVudCBvZiAxNiBtZWFucyB0aGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCA0IGJpdHMgb2YgdGhlCi1hZGRyZXNzIHNob3VsZCBiZSB6ZXJvKS4gIFRoZSBhbGlnbm1lbnQgbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLCBhbmQgaXQKLW11c3QgYmUgYSBwb3dlciBvZiB0d28uICBJZiBAY29kZXtAdmFsdWV7TER9fSBhbGxvY2F0ZXMgdW5pbml0aWFsaXplZCBtZW1vcnkKLWZvciB0aGUgY29tbW9uIHN5bWJvbCwgaXQgd2lsbCB1c2UgdGhlIGFsaWdubWVudCB3aGVuIHBsYWNpbmcgdGhlIHN5bWJvbC4gIElmCi1ubyBhbGlnbm1lbnQgaXMgc3BlY2lmaWVkLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIHNldCB0aGUgYWxpZ25tZW50IHRvIHRoZQotbGFyZ2VzdCBwb3dlciBvZiB0d28gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBzeW1ib2wsIHVwIHRvIGEKLW1heGltdW0gb2YgMTYuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIUFBBCi1UaGUgc3ludGF4IGZvciBAY29kZXsuY29tbX0gZGlmZmVycyBzbGlnaHRseSBvbiB0aGUgSFBQQS4gIFRoZSBzeW50YXggaXMKLUBzYW1we0B2YXJ7c3ltYm9sfSAuY29tbSwgQHZhcntsZW5ndGh9fTsgQHZhcntzeW1ib2x9IGlzIG9wdGlvbmFsLgotQGVuZCBpZnNldAotCi1Abm9kZSBEYXRhCi1Ac2VjdGlvbiBAY29kZXsuZGF0YSBAdmFye3N1YnNlY3Rpb259fQotCi1AY2luZGV4IEBjb2Rle2RhdGF9IGRpcmVjdGl2ZQotQGNvZGV7LmRhdGF9IHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGFzc2VtYmxlIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyBvbnRvIHRoZQotZW5kIG9mIHRoZSBkYXRhIHN1YnNlY3Rpb24gbnVtYmVyZWQgQHZhcntzdWJzZWN0aW9ufSAod2hpY2ggaXMgYW4KLWFic29sdXRlIGV4cHJlc3Npb24pLiAgSWYgQHZhcntzdWJzZWN0aW9ufSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cwotdG8gemVyby4KLQotQGlmc2V0IENPRkYKLUBub2RlIERlZgotQHNlY3Rpb24gQGNvZGV7LmRlZiBAdmFye25hbWV9fQotCi1AY2luZGV4IEBjb2Rle2RlZn0gZGlyZWN0aXZlCi1AY2luZGV4IENPRkYgc3ltYm9scywgZGVidWdnaW5nCi1AY2luZGV4IGRlYnVnZ2luZyBDT0ZGIHN5bWJvbHMKLUJlZ2luIGRlZmluaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wgQHZhcntuYW1lfTsgdGhlCi1kZWZpbml0aW9uIGV4dGVuZHMgdW50aWwgdGhlIEBjb2Rley5lbmRlZn0gZGlyZWN0aXZlIGlzIGVuY291bnRlcmVkLgotQGlmc2V0IEJPVVQKLQotVGhpcyBkaXJlY3RpdmUgaXMgb25seSBvYnNlcnZlZCB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yIENPRkYKLWZvcm1hdCBvdXRwdXQ7IHdoZW4gcHJvZHVjaW5nIEBjb2Rle2Iub3V0fSwgQHNhbXB7LmRlZn0gaXMgcmVjb2duaXplZCwKLWJ1dCBpZ25vcmVkLgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1AaWZzZXQgYW91dC1ib3V0Ci1Abm9kZSBEZXNjCi1Ac2VjdGlvbiBAY29kZXsuZGVzYyBAdmFye3N5bWJvbH0sIEB2YXJ7YWJzLWV4cHJlc3Npb259fQotCi1AY2luZGV4IEBjb2Rle2Rlc2N9IGRpcmVjdGl2ZQotQGNpbmRleCBDT0ZGIHN5bWJvbCBkZXNjcmlwdG9yCi1AY2luZGV4IHN5bWJvbCBkZXNjcmlwdG9yLCBDT0ZGCi1UaGlzIGRpcmVjdGl2ZSBzZXRzIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBzeW1ib2wgKEBweHJlZntTeW1ib2wgQXR0cmlidXRlc30pCi10byB0aGUgbG93IDE2IGJpdHMgb2YgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4KLQotQGlmc2V0IENPRkYKLVRoZSBAc2FtcHsuZGVzY30gZGlyZWN0aXZlIGlzIG5vdCBhdmFpbGFibGUgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcwotY29uZmlndXJlZCBmb3IgQ09GRiBvdXRwdXQ7IGl0IGlzIG9ubHkgZm9yIEBjb2Rle2Eub3V0fSBvciBAY29kZXtiLm91dH0KLW9iamVjdCBmb3JtYXQuICBGb3IgdGhlIHNha2Ugb2YgY29tcGF0aWJpbGl0eSwgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cwotaXQsIGJ1dCBwcm9kdWNlcyBubyBvdXRwdXQsIHdoZW4gY29uZmlndXJlZCBmb3IgQ09GRi4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQGlmc2V0IENPRkYKLUBub2RlIERpbQotQHNlY3Rpb24gQGNvZGV7LmRpbX0KLQotQGNpbmRleCBAY29kZXtkaW19IGRpcmVjdGl2ZQotQGNpbmRleCBDT0ZGIGF1eGlsaWFyeSBzeW1ib2wgaW5mb3JtYXRpb24KLUBjaW5kZXggYXV4aWxpYXJ5IHN5bWJvbCBpbmZvcm1hdGlvbiwgQ09GRgotVGhpcyBkaXJlY3RpdmUgaXMgZ2VuZXJhdGVkIGJ5IGNvbXBpbGVycyB0byBpbmNsdWRlIGF1eGlsaWFyeSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICBJdCBpcyBvbmx5IHBlcm1pdHRlZCBpbnNpZGUKLUBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpcnMuCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsuZGltfSBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiBnZW5lcmF0aW5nIENPRkYgZm9ybWF0IG91dHB1dDsgd2hlbgotQGNvZGV7QHZhbHVle0FTfX0gaXMgZ2VuZXJhdGluZyBAY29kZXtiLm91dH0sIGl0IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYnV0Ci1pZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBEb3VibGUKLUBzZWN0aW9uIEBjb2Rley5kb3VibGUgQHZhcntmbG9udW1zfX0KLQotQGNpbmRleCBAY29kZXtkb3VibGV9IGRpcmVjdGl2ZQotQGNpbmRleCBmbG9hdGluZyBwb2ludCBudW1iZXJzIChkb3VibGUpCi1AY29kZXsuZG91YmxlfSBleHBlY3RzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgSXQKLWFzc2VtYmxlcyBmbG9hdGluZyBwb2ludCBudW1iZXJzLgotQGlmc2V0IEdFTkVSSUMKLVRoZSBleGFjdCBraW5kIG9mIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgZW1pdHRlZCBkZXBlbmRzIG9uIGhvdwotQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZC4gIEB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBJRUVFRkxPQVQKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSBmYW1pbHkgQHNhbXB7LmRvdWJsZX0gZW1pdHMgNjQtYml0IGZsb2F0aW5nLXBvaW50IG51bWJlcnMKLWluIEBzY3tpZWVlfSBmb3JtYXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG5vZGUgRWplY3QKLUBzZWN0aW9uIEBjb2Rley5lamVjdH0KLQotQGNpbmRleCBAY29kZXtlamVjdH0gZGlyZWN0aXZlCi1AY2luZGV4IG5ldyBwYWdlLCBpbiBsaXN0aW5ncwotQGNpbmRleCBwYWdlLCBpbiBsaXN0aW5ncwotQGNpbmRleCBsaXN0aW5nIGNvbnRyb2w6IG5ldyBwYWdlCi1Gb3JjZSBhIHBhZ2UgYnJlYWsgYXQgdGhpcyBwb2ludCwgd2hlbiBnZW5lcmF0aW5nIGFzc2VtYmx5IGxpc3RpbmdzLgotCi1Abm9kZSBFbHNlCi1Ac2VjdGlvbiBAY29kZXsuZWxzZX0KLQotQGNpbmRleCBAY29kZXtlbHNlfSBkaXJlY3RpdmUKLUBjb2Rley5lbHNlfSBpcyBwYXJ0IG9mIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0IGZvciBjb25kaXRpb25hbAotYXNzZW1ibHk7IEBweHJlZntJZiwsQGNvZGV7LmlmfX0uICBJdCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2VjdGlvbgotb2YgY29kZSB0byBiZSBhc3NlbWJsZWQgaWYgdGhlIGNvbmRpdGlvbiBmb3IgdGhlIHByZWNlZGluZyBAY29kZXsuaWZ9Ci13YXMgZmFsc2UuCi0KLUBub2RlIEVuZAotQHNlY3Rpb24gQGNvZGV7LmVuZH0KLQotQGNpbmRleCBAY29kZXtlbmR9IGRpcmVjdGl2ZQotQGNvZGV7LmVuZH0gbWFya3MgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHkgZmlsZS4gIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90Ci1wcm9jZXNzIGFueXRoaW5nIGluIHRoZSBmaWxlIHBhc3QgdGhlIEBjb2Rley5lbmR9IGRpcmVjdGl2ZS4KLQotQGlmc2V0IENPRkYKLUBub2RlIEVuZGVmCi1Ac2VjdGlvbiBAY29kZXsuZW5kZWZ9Ci0KLUBjaW5kZXggQGNvZGV7ZW5kZWZ9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgZmxhZ3MgdGhlIGVuZCBvZiBhIHN5bWJvbCBkZWZpbml0aW9uIGJlZ3VuIHdpdGgKLUBjb2Rley5kZWZ9LgotQGlmc2V0IEJPVVQKLQotQHNhbXB7LmVuZGVmfSBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiBnZW5lcmF0aW5nIENPRkYgZm9ybWF0IG91dHB1dDsgaWYKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUgQGNvZGV7Yi5vdXR9LCBpdCBhY2NlcHRzIHRoaXMKLWRpcmVjdGl2ZSBidXQgaWdub3JlcyBpdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQG5vZGUgRW5kZnVuYwotQHNlY3Rpb24gQGNvZGV7LmVuZGZ1bmN9Ci1AY2luZGV4IEBjb2Rle2VuZGZ1bmN9IGRpcmVjdGl2ZQotQGNvZGV7LmVuZGZ1bmN9IG1hcmtzIHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBzcGVjaWZpZWQgd2l0aCBAY29kZXsuZnVuY30uCi0KLUBub2RlIEVuZGlmCi1Ac2VjdGlvbiBAY29kZXsuZW5kaWZ9Ci0KLUBjaW5kZXggQGNvZGV7ZW5kaWZ9IGRpcmVjdGl2ZQotQGNvZGV7LmVuZGlmfSBpcyBwYXJ0IG9mIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0IGZvciBjb25kaXRpb25hbCBhc3NlbWJseTsKLWl0IG1hcmtzIHRoZSBlbmQgb2YgYSBibG9jayBvZiBjb2RlIHRoYXQgaXMgb25seSBhc3NlbWJsZWQKLWNvbmRpdGlvbmFsbHkuICBAeHJlZntJZiwsQGNvZGV7LmlmfX0uCi0KLUBub2RlIEVxdQotQHNlY3Rpb24gQGNvZGV7LmVxdSBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZXF1fSBkaXJlY3RpdmUKLUBjaW5kZXggYXNzaWduaW5nIHZhbHVlcyB0byBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIGFzc2lnbmluZyB2YWx1ZXMgdG8KLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIHZhbHVlIG9mIEB2YXJ7c3ltYm9sfSB0byBAdmFye2V4cHJlc3Npb259LgotSXQgaXMgc3lub255bW91cyB3aXRoIEBzYW1wey5zZXR9OyBAcHhyZWZ7U2V0LCxAY29kZXsuc2V0fX0uCi0KLUBpZnNldCBIUFBBCi1UaGUgc3ludGF4IGZvciBAY29kZXtlcXV9IG9uIHRoZSBIUFBBIGlzIAotQHNhbXB7QHZhcntzeW1ib2x9IC5lcXUgQHZhcntleHByZXNzaW9ufX0uCi1AZW5kIGlmc2V0Ci0KLUBub2RlIEVxdWl2Ci1Ac2VjdGlvbiBAY29kZXsuZXF1aXYgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotQGNpbmRleCBAY29kZXtlcXVpdn0gZGlyZWN0aXZlCi1UaGUgQGNvZGV7LmVxdWl2fSBkaXJlY3RpdmUgaXMgbGlrZSBAY29kZXsuZXF1fSBhbmQgQGNvZGV7LnNldH0sIGV4Y2VwdCB0aGF0Ci10aGUgYXNzZW1ibGVyIHdpbGwgc2lnbmFsIGFuIGVycm9yIGlmIEB2YXJ7c3ltYm9sfSBpcyBhbHJlYWR5IGRlZmluZWQuCi0KLUV4Y2VwdCBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBlcnJvciBtZXNzYWdlLCB0aGlzIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byAKLUBzbWFsbGV4YW1wbGUKLS5pZmRlZiBTWU0KLS5lcnIKLS5lbmRpZgotLmVxdSBTWU0sVkFMCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBFcnIKLUBzZWN0aW9uIEBjb2Rley5lcnJ9Ci1AY2luZGV4IEBjb2Rle2Vycn0gZGlyZWN0aXZlCi1JZiBAY29kZXtAdmFsdWV7QVN9fSBhc3NlbWJsZXMgYSBAY29kZXsuZXJyfSBkaXJlY3RpdmUsIGl0IHdpbGwgcHJpbnQgYW4gZXJyb3IKLW1lc3NhZ2UgYW5kLCB1bmxlc3MgdGhlIEBjb2Rley1afSBvcHRpb24gd2FzIHVzZWQsIGl0IHdpbGwgbm90IGdlbmVyYXRlIGFuCi1vYmplY3QgZmlsZS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2lnbmFsIGVycm9yIGFuIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgY29kZS4KLQotQG5vZGUgRXhpdG0KLUBzZWN0aW9uIEBjb2Rley5leGl0bX0KLUV4aXQgZWFybHkgZnJvbSB0aGUgY3VycmVudCBtYWNybyBkZWZpbml0aW9uLiAgQHhyZWZ7TWFjcm99LgotCi1Abm9kZSBFeHRlcm4KLUBzZWN0aW9uIEBjb2Rley5leHRlcm59Ci0KLUBjaW5kZXggQGNvZGV7ZXh0ZXJufSBkaXJlY3RpdmUKLUBjb2Rley5leHRlcm59IGlzIGFjY2VwdGVkIGluIHRoZSBzb3VyY2UgcHJvZ3JhbS0tLWZvciBjb21wYXRpYmlsaXR5Ci13aXRoIG90aGVyIGFzc2VtYmxlcnMtLS1idXQgaXQgaXMgaWdub3JlZC4gIEBjb2Rle0B2YWx1ZXtBU319IHRyZWF0cwotYWxsIHVuZGVmaW5lZCBzeW1ib2xzIGFzIGV4dGVybmFsLgotCi1Abm9kZSBGYWlsCi1Ac2VjdGlvbiBAY29kZXsuZmFpbCBAdmFye2V4cHJlc3Npb259fQotCi1AY2luZGV4IEBjb2Rle2ZhaWx9IGRpcmVjdGl2ZQotR2VuZXJhdGVzIGFuIGVycm9yIG9yIGEgd2FybmluZy4gIElmIHRoZSB2YWx1ZSBvZiB0aGUgQHZhcntleHByZXNzaW9ufSBpcyA1MDAKLW9yIG1vcmUsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgcHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UuICBJZiB0aGUgdmFsdWUgaXMgbGVzcwotdGhhbiA1MDAsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4gIFRoZSBtZXNzYWdlIHdpbGwKLWluY2x1ZGUgdGhlIHZhbHVlIG9mIEB2YXJ7ZXhwcmVzc2lvbn0uICBUaGlzIGNhbiBvY2Nhc2lvbmFsbHkgYmUgdXNlZnVsIGluc2lkZQotY29tcGxleCBuZXN0ZWQgbWFjcm9zIG9yIGNvbmRpdGlvbmFsIGFzc2VtYmx5LgotCi1AaWZjbGVhciBuby1maWxlLWRpcgotQG5vZGUgRmlsZQotQHNlY3Rpb24gQGNvZGV7LmZpbGUgQHZhcntzdHJpbmd9fQotCi1AY2luZGV4IEBjb2Rle2ZpbGV9IGRpcmVjdGl2ZQotQGNpbmRleCBsb2dpY2FsIGZpbGUgbmFtZQotQGNpbmRleCBmaWxlIG5hbWUsIGxvZ2ljYWwKLUBjb2Rley5maWxlfSB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0aGF0IHdlIGFyZSBhYm91dCB0byBzdGFydCBhIG5ldyBsb2dpY2FsCi1maWxlLiAgQHZhcntzdHJpbmd9IGlzIHRoZSBuZXcgZmlsZSBuYW1lLiAgSW4gZ2VuZXJhbCwgdGhlIGZpbGVuYW1lIGlzCi1yZWNvZ25pemVkIHdoZXRoZXIgb3Igbm90IGl0IGlzIHN1cnJvdW5kZWQgYnkgcXVvdGVzIEBzYW1weyJ9OyBidXQgaWYgeW91IHdpc2gKLXRvIHNwZWNpZnkgYW4gZW1wdHkgZmlsZSBuYW1lLCB5b3UgbXVzdCBnaXZlIHRoZSBxdW90ZXMtLUBjb2RleyIifS4gIFRoaXMKLXN0YXRlbWVudCBtYXkgZ28gYXdheSBpbiBmdXR1cmU6IGl0IGlzIG9ubHkgcmVjb2duaXplZCB0byBiZSBjb21wYXRpYmxlIHdpdGgKLW9sZCBAY29kZXtAdmFsdWV7QVN9fSBwcm9ncmFtcy4KLUBpZnNldCBBMjlLCi1JbiBzb21lIGNvbmZpZ3VyYXRpb25zIG9mIEBjb2Rle0B2YWx1ZXtBU319LCBAY29kZXsuZmlsZX0gaGFzIGFscmVhZHkgYmVlbgotcmVtb3ZlZCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBvdGhlciBhc3NlbWJsZXJzLiAgQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIEZpbGwKLUBzZWN0aW9uIEBjb2Rley5maWxsIEB2YXJ7cmVwZWF0fSAsIEB2YXJ7c2l6ZX0gLCBAdmFye3ZhbHVlfX0KLQotQGNpbmRleCBAY29kZXtmaWxsfSBkaXJlY3RpdmUKLUBjaW5kZXggd3JpdGluZyBwYXR0ZXJucyBpbiBtZW1vcnkKLUBjaW5kZXggcGF0dGVybnMsIHdyaXRpbmcgaW4gbWVtb3J5Ci1AdmFye3Jlc3VsdH0sIEB2YXJ7c2l6ZX0gYW5kIEB2YXJ7dmFsdWV9IGFyZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4KLVRoaXMgZW1pdHMgQHZhcntyZXBlYXR9IGNvcGllcyBvZiBAdmFye3NpemV9IGJ5dGVzLiAgQHZhcntSZXBlYXR9Ci1tYXkgYmUgemVybyBvciBtb3JlLiAgQHZhcntTaXplfSBtYXkgYmUgemVybyBvciBtb3JlLCBidXQgaWYgaXQgaXMKLW1vcmUgdGhhbiA4LCB0aGVuIGl0IGlzIGRlZW1lZCB0byBoYXZlIHRoZSB2YWx1ZSA4LCBjb21wYXRpYmxlIHdpdGgKLW90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMuICBUaGUgY29udGVudHMgb2YgZWFjaCBAdmFye3JlcGVhdH0gYnl0ZXMKLWlzIHRha2VuIGZyb20gYW4gOC1ieXRlIG51bWJlci4gIFRoZSBoaWdoZXN0IG9yZGVyIDQgYnl0ZXMgYXJlCi16ZXJvLiAgVGhlIGxvd2VzdCBvcmRlciA0IGJ5dGVzIGFyZSBAdmFye3ZhbHVlfSByZW5kZXJlZCBpbiB0aGUKLWJ5dGUtb3JkZXIgb2YgYW4gaW50ZWdlciBvbiB0aGUgY29tcHV0ZXIgQGNvZGV7QHZhbHVle0FTfX0gaXMgYXNzZW1ibGluZyBmb3IuCi1FYWNoIEB2YXJ7c2l6ZX0gYnl0ZXMgaW4gYSByZXBldGl0aW9uIGlzIHRha2VuIGZyb20gdGhlIGxvd2VzdCBvcmRlcgotQHZhcntzaXplfSBieXRlcyBvZiB0aGlzIG51bWJlci4gIEFnYWluLCB0aGlzIGJpemFycmUgYmVoYXZpb3IgaXMKLWNvbXBhdGlibGUgd2l0aCBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzLgotCi1AdmFye3NpemV9IGFuZCBAdmFye3ZhbHVlfSBhcmUgb3B0aW9uYWwuCi1JZiB0aGUgc2Vjb25kIGNvbW1hIGFuZCBAdmFye3ZhbHVlfSBhcmUgYWJzZW50LCBAdmFye3ZhbHVlfSBpcwotYXNzdW1lZCB6ZXJvLiAgSWYgdGhlIGZpcnN0IGNvbW1hIGFuZCBmb2xsb3dpbmcgdG9rZW5zIGFyZSBhYnNlbnQsCi1AdmFye3NpemV9IGlzIGFzc3VtZWQgdG8gYmUgMS4KLQotQG5vZGUgRmxvYXQKLUBzZWN0aW9uIEBjb2Rley5mbG9hdCBAdmFye2Zsb251bXN9fQotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKHNpbmdsZSkKLUBjaW5kZXggQGNvZGV7ZmxvYXR9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgYXNzZW1ibGVzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgSXQKLWhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgQGNvZGV7LnNpbmdsZX0uCi1AaWZzZXQgR0VORVJJQwotVGhlIGV4YWN0IGtpbmQgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBlbWl0dGVkIGRlcGVuZHMgb24gaG93Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkLgotQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IElFRUVGTE9BVAotT24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseSwgQGNvZGV7LmZsb2F0fSBlbWl0cyAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycwotaW4gQHNje2llZWV9IGZvcm1hdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBGdW5jCi1Ac2VjdGlvbiBAY29kZXsuZnVuYyBAdmFye25hbWV9WyxAdmFye2xhYmVsfV19Ci1AY2luZGV4IEBjb2Rle2Z1bmN9IGRpcmVjdGl2ZQotQGNvZGV7LmZ1bmN9IGVtaXRzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBkZW5vdGUgZnVuY3Rpb24gQHZhcntuYW1lfSwgYW5kCi1pcyBpZ25vcmVkIHVubGVzcyB0aGUgZmlsZSBpcyBhc3NlbWJsZWQgd2l0aCBkZWJ1Z2dpbmcgZW5hYmxlZC4KLU9ubHkgQHNhbXB7LS1nc3RhYnN9IGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuCi1AdmFye2xhYmVsfSBpcyB0aGUgZW50cnkgcG9pbnQgb2YgdGhlIGZ1bmN0aW9uIGFuZCBpZiBvbWl0dGVkIEB2YXJ7bmFtZX0KLXByZXBlbmRlZCB3aXRoIHRoZSBAc2FtcHtsZWFkaW5nIGNoYXJ9IGlzIHVzZWQuCi1Ac2FtcHtsZWFkaW5nIGNoYXJ9IGlzIHVzdWFsbHkgQGNvZGV7X30gb3Igbm90aGluZywgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuCi1BbGwgZnVuY3Rpb25zIGFyZSBjdXJyZW50bHkgZGVmaW5lZCB0byBoYXZlIEBjb2Rle3ZvaWR9IHJldHVybiB0eXBlLgotVGhlIGZ1bmN0aW9uIG11c3QgYmUgdGVybWluYXRlZCB3aXRoIEBjb2Rley5lbmRmdW5jfS4KLQotQG5vZGUgR2xvYmFsCi1Ac2VjdGlvbiBAY29kZXsuZ2xvYmFsIEB2YXJ7c3ltYm9sfX0sIEBjb2Rley5nbG9ibCBAdmFye3N5bWJvbH19Ci0KLUBjaW5kZXggQGNvZGV7Z2xvYmFsfSBkaXJlY3RpdmUKLUBjaW5kZXggc3ltYm9sLCBtYWtpbmcgdmlzaWJsZSB0byBsaW5rZXIKLUBjb2Rley5nbG9iYWx9IG1ha2VzIHRoZSBzeW1ib2wgdmlzaWJsZSB0byBAY29kZXtAdmFsdWV7TER9fS4gIElmIHlvdSBkZWZpbmUKLUB2YXJ7c3ltYm9sfSBpbiB5b3VyIHBhcnRpYWwgcHJvZ3JhbSwgaXRzIHZhbHVlIGlzIG1hZGUgYXZhaWxhYmxlIHRvCi1vdGhlciBwYXJ0aWFsIHByb2dyYW1zIHRoYXQgYXJlIGxpbmtlZCB3aXRoIGl0LiAgT3RoZXJ3aXNlLAotQHZhcntzeW1ib2x9IHRha2VzIGl0cyBhdHRyaWJ1dGVzIGZyb20gYSBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZQotZnJvbSBhbm90aGVyIGZpbGUgbGlua2VkIGludG8gdGhlIHNhbWUgcHJvZ3JhbS4KLQotQm90aCBzcGVsbGluZ3MgKEBzYW1wey5nbG9ibH0gYW5kIEBzYW1wey5nbG9iYWx9KSBhcmUgYWNjZXB0ZWQsIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGFzc2VtYmxlcnMuCi0KLUBpZnNldCBIUFBBCi1PbiB0aGUgSFBQQSwgQGNvZGV7Lmdsb2JhbH0gaXMgbm90IGFsd2F5cyBlbm91Z2ggdG8gbWFrZSBpdCBhY2Nlc3NpYmxlIHRvIG90aGVyCi1wYXJ0aWFsIHByb2dyYW1zLiAgWW91IG1heSBuZWVkIHRoZSBIUFBBLW9ubHkgQGNvZGV7LkVYUE9SVH0gZGlyZWN0aXZlIGFzIHdlbGwuCi1AeHJlZntIUFBBIERpcmVjdGl2ZXMsLCBIUFBBIEFzc2VtYmxlciBEaXJlY3RpdmVzfS4KLUBlbmQgaWZzZXQKLQotQG5vZGUgaHdvcmQKLUBzZWN0aW9uIEBjb2Rley5od29yZCBAdmFye2V4cHJlc3Npb25zfX0KLQotQGNpbmRleCBAY29kZXtod29yZH0gZGlyZWN0aXZlCi1AY2luZGV4IGludGVnZXJzLCAxNi1iaXQKLUBjaW5kZXggbnVtYmVycywgMTYtYml0Ci1AY2luZGV4IHNpeHRlZW4gYml0IGludGVnZXJzCi1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIEB2YXJ7ZXhwcmVzc2lvbnN9LCBhbmQgZW1pdHMKLWEgMTYgYml0IG51bWJlciBmb3IgZWFjaC4KLQotQGlmc2V0IEdFTkVSSUMKLVRoaXMgZGlyZWN0aXZlIGlzIGEgc3lub255bSBmb3IgQHNhbXB7LnNob3J0fTsgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQKLWFyY2hpdGVjdHVyZSwgaXQgbWF5IGFsc28gYmUgYSBzeW5vbnltIGZvciBAc2FtcHsud29yZH0uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgVzMyCi1UaGlzIGRpcmVjdGl2ZSBpcyBhIHN5bm9ueW0gZm9yIEBzYW1wey5zaG9ydH0uCi1AZW5kIGlmc2V0Ci1AaWZzZXQgVzE2Ci1UaGlzIGRpcmVjdGl2ZSBpcyBhIHN5bm9ueW0gZm9yIGJvdGggQHNhbXB7LnNob3J0fSBhbmQgQHNhbXB7LndvcmR9LgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIElkZW50Ci1Ac2VjdGlvbiBAY29kZXsuaWRlbnR9Ci0KLUBjaW5kZXggQGNvZGV7aWRlbnR9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgaXMgdXNlZCBieSBzb21lIGFzc2VtYmxlcnMgdG8gcGxhY2UgdGFncyBpbiBvYmplY3QgZmlsZXMuCi1AY29kZXtAdmFsdWV7QVN9fSBzaW1wbHkgYWNjZXB0cyB0aGUgZGlyZWN0aXZlIGZvciBzb3VyY2UtZmlsZQotY29tcGF0aWJpbGl0eSB3aXRoIHN1Y2ggYXNzZW1ibGVycywgYnV0IGRvZXMgbm90IGFjdHVhbGx5IGVtaXQgYW55dGhpbmcKLWZvciBpdC4KLQotQG5vZGUgSWYKLUBzZWN0aW9uIEBjb2Rley5pZiBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259fQotCi1AY2luZGV4IGNvbmRpdGlvbmFsIGFzc2VtYmx5Ci1AY2luZGV4IEBjb2Rle2lmfSBkaXJlY3RpdmUKLUBjb2Rley5pZn0gbWFya3MgdGhlIGJlZ2lubmluZyBvZiBhIHNlY3Rpb24gb2YgY29kZSB3aGljaCBpcyBvbmx5Ci1jb25zaWRlcmVkIHBhcnQgb2YgdGhlIHNvdXJjZSBwcm9ncmFtIGJlaW5nIGFzc2VtYmxlZCBpZiB0aGUgYXJndW1lbnQKLSh3aGljaCBtdXN0IGJlIGFuIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0pIGlzIG5vbi16ZXJvLiAgVGhlIGVuZCBvZgotdGhlIGNvbmRpdGlvbmFsIHNlY3Rpb24gb2YgY29kZSBtdXN0IGJlIG1hcmtlZCBieSBAY29kZXsuZW5kaWZ9Ci0oQHB4cmVme0VuZGlmLCxAY29kZXsuZW5kaWZ9fSk7IG9wdGlvbmFsbHksIHlvdSBtYXkgaW5jbHVkZSBjb2RlIGZvciB0aGUKLWFsdGVybmF0aXZlIGNvbmRpdGlvbiwgZmxhZ2dlZCBieSBAY29kZXsuZWxzZX0gKEBweHJlZntFbHNlLCxAY29kZXsuZWxzZX19KS4KLQotVGhlIGZvbGxvd2luZyB2YXJpYW50cyBvZiBAY29kZXsuaWZ9IGFyZSBhbHNvIHN1cHBvcnRlZDoKLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtpZmRlZn0gZGlyZWN0aXZlCi1AaXRlbSAuaWZkZWYgQHZhcntzeW1ib2x9Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIHNwZWNpZmllZCBAdmFye3N5bWJvbH0KLWhhcyBiZWVuIGRlZmluZWQuCi0KLUBjaW5kZXggQGNvZGV7aWZjfSBkaXJlY3RpdmUKLUBpdGVtIC5pZmMgQHZhcntzdHJpbmcxfSxAdmFye3N0cmluZzJ9Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSB0aGUgc2FtZS4gIFRoZQotc3RyaW5ncyBtYXkgYmUgb3B0aW9uYWxseSBxdW90ZWQgd2l0aCBzaW5nbGUgcXVvdGVzLiAgSWYgdGhleSBhcmUgbm90IHF1b3RlZCwKLXRoZSBmaXJzdCBzdHJpbmcgc3RvcHMgYXQgdGhlIGZpcnN0IGNvbW1hLCBhbmQgdGhlIHNlY29uZCBzdHJpbmcgc3RvcHMgYXQgdGhlCi1lbmQgb2YgdGhlIGxpbmUuICBTdHJpbmdzIHdoaWNoIGNvbnRhaW4gd2hpdGVzcGFjZSBzaG91bGQgYmUgcXVvdGVkLiAgVGhlCi1zdHJpbmcgY29tcGFyaXNvbiBpcyBjYXNlIHNlbnNpdGl2ZS4KLQotQGNpbmRleCBAY29kZXtpZmVxfSBkaXJlY3RpdmUKLUBpdGVtIC5pZmVxIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgemVyby4KLQotQGNpbmRleCBAY29kZXtpZmVxc30gZGlyZWN0aXZlCi1AaXRlbSAuaWZlcXMgQHZhcntzdHJpbmcxfSxAdmFye3N0cmluZzJ9Ci1Bbm90aGVyIGZvcm0gb2YgQGNvZGV7LmlmY30uICBUaGUgc3RyaW5ncyBtdXN0IGJlIHF1b3RlZCB1c2luZyBkb3VibGUgcXVvdGVzLgotCi1AY2luZGV4IEBjb2Rle2lmZ2V9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmZ2UgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBhcmd1bWVudCBpcyBncmVhdGVyIHRoYW4gb3IKLWVxdWFsIHRvIHplcm8uCi0KLUBjaW5kZXggQGNvZGV7aWZndH0gZGlyZWN0aXZlCi1AaXRlbSAuaWZndCBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgotCi1AY2luZGV4IEBjb2Rle2lmbGV9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmbGUgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBhcmd1bWVudCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwKLXRvIHplcm8uCi0KLUBjaW5kZXggQGNvZGV7aWZsdH0gZGlyZWN0aXZlCi1AaXRlbSAuaWZsdCBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiB6ZXJvLgotCi1AY2luZGV4IEBjb2Rle2lmbmN9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmbmMgQHZhcntzdHJpbmcxfSxAdmFye3N0cmluZzJ9LgotTGlrZSBAY29kZXsuaWZjfSwgYnV0IHRoZSBzZW5zZSBvZiB0aGUgdGVzdCBpcyByZXZlcnNlZDogdGhpcyBhc3NlbWJsZXMgdGhlCi1mb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSB0d28gc3RyaW5ncyBhcmUgbm90IHRoZSBzYW1lLgotCi1AY2luZGV4IEBjb2Rle2lmbmRlZn0gZGlyZWN0aXZlCi1AY2luZGV4IEBjb2Rle2lmbm90ZGVmfSBkaXJlY3RpdmUKLUBpdGVtIC5pZm5kZWYgQHZhcntzeW1ib2x9Ci1AaXRlbXggLmlmbm90ZGVmIEB2YXJ7c3ltYm9sfQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBzcGVjaWZpZWQgQHZhcntzeW1ib2x9Ci1oYXMgbm90IGJlZW4gZGVmaW5lZC4gIEJvdGggc3BlbGxpbmcgdmFyaWFudHMgYXJlIGVxdWl2YWxlbnQuCi0KLUBjaW5kZXggQGNvZGV7aWZuZX0gZGlyZWN0aXZlCi1AaXRlbSAuaWZuZSBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBlcXVhbCB0byB6ZXJvCi0oaW4gb3RoZXIgd29yZHMsIHRoaXMgaXMgZXF1aXZhbGVudCB0byBAY29kZXsuaWZ9KS4KLQotQGNpbmRleCBAY29kZXtpZm5lc30gZGlyZWN0aXZlCi1AaXRlbSAuaWZuZXMgQHZhcntzdHJpbmcxfSxAdmFye3N0cmluZzJ9Ci1MaWtlIEBjb2Rley5pZmVxc30sIGJ1dCB0aGUgc2Vuc2Ugb2YgdGhlIHRlc3QgaXMgcmV2ZXJzZWQ6IHRoaXMgYXNzZW1ibGVzIHRoZQotZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgdHdvIHN0cmluZ3MgYXJlIG5vdCB0aGUgc2FtZS4KLUBlbmQgdGFibGUKLQotQG5vZGUgSW5jbHVkZQotQHNlY3Rpb24gQGNvZGV7LmluY2x1ZGUgIkB2YXJ7ZmlsZX0ifQotCi1AY2luZGV4IEBjb2Rle2luY2x1ZGV9IGRpcmVjdGl2ZQotQGNpbmRleCBzdXBwb3J0aW5nIGZpbGVzLCBpbmNsdWRpbmcKLUBjaW5kZXggZmlsZXMsIGluY2x1ZGluZwotVGhpcyBkaXJlY3RpdmUgcHJvdmlkZXMgYSB3YXkgdG8gaW5jbHVkZSBzdXBwb3J0aW5nIGZpbGVzIGF0IHNwZWNpZmllZAotcG9pbnRzIGluIHlvdXIgc291cmNlIHByb2dyYW0uICBUaGUgY29kZSBmcm9tIEB2YXJ7ZmlsZX0gaXMgYXNzZW1ibGVkIGFzCi1pZiBpdCBmb2xsb3dlZCB0aGUgcG9pbnQgb2YgdGhlIEBjb2Rley5pbmNsdWRlfTsgd2hlbiB0aGUgZW5kIG9mIHRoZQotaW5jbHVkZWQgZmlsZSBpcyByZWFjaGVkLCBhc3NlbWJseSBvZiB0aGUgb3JpZ2luYWwgZmlsZSBjb250aW51ZXMuICBZb3UKLWNhbiBjb250cm9sIHRoZSBzZWFyY2ggcGF0aHMgdXNlZCB3aXRoIHRoZSBAc2FtcHstSX0gY29tbWFuZC1saW5lIG9wdGlvbgotKEBweHJlZntJbnZva2luZywsQ29tbWFuZC1MaW5lIE9wdGlvbnN9KS4gIFF1b3RhdGlvbiBtYXJrcyBhcmUgcmVxdWlyZWQKLWFyb3VuZCBAdmFye2ZpbGV9LgotCi1Abm9kZSBJbnQKLUBzZWN0aW9uIEBjb2Rley5pbnQgQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7aW50fSBkaXJlY3RpdmUKLUBjaW5kZXggaW50ZWdlcnMsIDMyLWJpdAotRXhwZWN0IHplcm8gb3IgbW9yZSBAdmFye2V4cHJlc3Npb25zfSwgb2YgYW55IHNlY3Rpb24sIHNlcGFyYXRlZCBieSBjb21tYXMuCi1Gb3IgZWFjaCBleHByZXNzaW9uLCBlbWl0IGEgbnVtYmVyIHRoYXQsIGF0IHJ1biB0aW1lLCBpcyB0aGUgdmFsdWUgb2YgdGhhdAotZXhwcmVzc2lvbi4gIFRoZSBieXRlIG9yZGVyIGFuZCBiaXQgc2l6ZSBvZiB0aGUgbnVtYmVyIGRlcGVuZHMgb24gd2hhdCBraW5kCi1vZiB0YXJnZXQgdGhlIGFzc2VtYmx5IGlzIGZvci4KLQotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEg4Ci1PbiB0aGUgSDgvNTAwIGFuZCBtb3N0IGZvcm1zIG9mIHRoZSBIOC8zMDAsIEBjb2Rley5pbnR9IGVtaXRzIDE2LWJpdAotaW50ZWdlcnMuICBPbiB0aGUgSDgvMzAwSCBhbmQgdGhlIEhpdGFjaGkgU0gsIGhvd2V2ZXIsIEBjb2Rley5pbnR9IGVtaXRzCi0zMi1iaXQgaW50ZWdlcnMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG5vZGUgSXJwCi1Ac2VjdGlvbiBAY29kZXsuaXJwIEB2YXJ7c3ltYm9sfSxAdmFye3ZhbHVlc319QGRvdHN7fQotCi1AY2luZGV4IEBjb2Rle2lycH0gZGlyZWN0aXZlCi1FdmFsdWF0ZSBhIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgYXNzaWduaW5nIGRpZmZlcmVudCB2YWx1ZXMgdG8gQHZhcntzeW1ib2x9LgotVGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgc3RhcnRzIGF0IHRoZSBAY29kZXsuaXJwfSBkaXJlY3RpdmUsIGFuZCBpcwotdGVybWluYXRlZCBieSBhbiBAY29kZXsuZW5kcn0gZGlyZWN0aXZlLiAgRm9yIGVhY2ggQHZhcnt2YWx1ZX0sIEB2YXJ7c3ltYm9sfSBpcwotc2V0IHRvIEB2YXJ7dmFsdWV9LCBhbmQgdGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgaXMgYXNzZW1ibGVkLiAgSWYgbm8KLUB2YXJ7dmFsdWV9IGlzIGxpc3RlZCwgdGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgaXMgYXNzZW1ibGVkIG9uY2UsIHdpdGgKLUB2YXJ7c3ltYm9sfSBzZXQgdG8gdGhlIG51bGwgc3RyaW5nLiAgVG8gcmVmZXIgdG8gQHZhcntzeW1ib2x9IHdpdGhpbiB0aGUKLXNlcXVlbmNlIG9mIHN0YXRlbWVudHMsIHVzZSBAdmFye1xzeW1ib2x9LgotCi1Gb3IgZXhhbXBsZSwgYXNzZW1ibGluZwotCi1AZXhhbXBsZQotICAgICAgICAuaXJwICAgIHBhcmFtLDEsMiwzCi0gICAgICAgIG1vdmUgICAgZFxwYXJhbSxzcEBALQotICAgICAgICAuZW5kcgotQGVuZCBleGFtcGxlCi0KLWlzIGVxdWl2YWxlbnQgdG8gYXNzZW1ibGluZwotCi1AZXhhbXBsZQotICAgICAgICBtb3ZlICAgIGQxLHNwQEAtCi0gICAgICAgIG1vdmUgICAgZDIsc3BAQC0KLSAgICAgICAgbW92ZSAgICBkMyxzcEBALQotQGVuZCBleGFtcGxlCi0KLUBub2RlIElycGMKLUBzZWN0aW9uIEBjb2Rley5pcnBjIEB2YXJ7c3ltYm9sfSxAdmFye3ZhbHVlc319QGRvdHN7fQotCi1AY2luZGV4IEBjb2Rle2lycGN9IGRpcmVjdGl2ZQotRXZhbHVhdGUgYSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGFzc2lnbmluZyBkaWZmZXJlbnQgdmFsdWVzIHRvIEB2YXJ7c3ltYm9sfS4KLVRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIHN0YXJ0cyBhdCB0aGUgQGNvZGV7LmlycGN9IGRpcmVjdGl2ZSwgYW5kIGlzCi10ZXJtaW5hdGVkIGJ5IGFuIEBjb2Rley5lbmRyfSBkaXJlY3RpdmUuICBGb3IgZWFjaCBjaGFyYWN0ZXIgaW4gQHZhcnt2YWx1ZX0sCi1AdmFye3N5bWJvbH0gaXMgc2V0IHRvIHRoZSBjaGFyYWN0ZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBpcwotYXNzZW1ibGVkLiAgSWYgbm8gQHZhcnt2YWx1ZX0gaXMgbGlzdGVkLCB0aGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBpcwotYXNzZW1ibGVkIG9uY2UsIHdpdGggQHZhcntzeW1ib2x9IHNldCB0byB0aGUgbnVsbCBzdHJpbmcuICBUbyByZWZlciB0bwotQHZhcntzeW1ib2x9IHdpdGhpbiB0aGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cywgdXNlIEB2YXJ7XHN5bWJvbH0uCi0KLUZvciBleGFtcGxlLCBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIC5pcnBjICAgIHBhcmFtLDEyMwotICAgICAgICBtb3ZlICAgIGRccGFyYW0sc3BAQC0KLSAgICAgICAgLmVuZHIKLUBlbmQgZXhhbXBsZQotCi1pcyBlcXVpdmFsZW50IHRvIGFzc2VtYmxpbmcKLQotQGV4YW1wbGUKLSAgICAgICAgbW92ZSAgICBkMSxzcEBALQotICAgICAgICBtb3ZlICAgIGQyLHNwQEAtCi0gICAgICAgIG1vdmUgICAgZDMsc3BAQC0KLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBMY29tbQotQHNlY3Rpb24gQGNvZGV7Lmxjb21tIEB2YXJ7c3ltYm9sfSAsIEB2YXJ7bGVuZ3RofX0KLQotQGNpbmRleCBAY29kZXtsY29tbX0gZGlyZWN0aXZlCi1AY2luZGV4IGxvY2FsIGNvbW1vbiBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIGxvY2FsIGNvbW1vbgotUmVzZXJ2ZSBAdmFye2xlbmd0aH0gKGFuIGFic29sdXRlIGV4cHJlc3Npb24pIGJ5dGVzIGZvciBhIGxvY2FsIGNvbW1vbgotZGVub3RlZCBieSBAdmFye3N5bWJvbH0uICBUaGUgc2VjdGlvbiBhbmQgdmFsdWUgb2YgQHZhcntzeW1ib2x9IGFyZQotdGhvc2Ugb2YgdGhlIG5ldyBsb2NhbCBjb21tb24uICBUaGUgYWRkcmVzc2VzIGFyZSBhbGxvY2F0ZWQgaW4gdGhlIGJzcwotc2VjdGlvbiwgc28gdGhhdCBhdCBydW4tdGltZSB0aGUgYnl0ZXMgc3RhcnQgb2ZmIHplcm9lZC4gIEB2YXJ7U3ltYm9sfQotaXMgbm90IGRlY2xhcmVkIGdsb2JhbCAoQHB4cmVme0dsb2JhbCwsQGNvZGV7Lmdsb2JhbH19KSwgc28gaXMgbm9ybWFsbHkKLW5vdCB2aXNpYmxlIHRvIEBjb2Rle0B2YWx1ZXtMRH19LgotCi1AaWZzZXQgR0VORVJJQwotU29tZSB0YXJnZXRzIHBlcm1pdCBhIHRoaXJkIGFyZ3VtZW50IHRvIGJlIHVzZWQgd2l0aCBAY29kZXsubGNvbW19LiAgVGhpcwotYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIGFsaWdubWVudCBvZiB0aGUgc3ltYm9sIGluIHRoZSBic3Mgc2VjdGlvbi4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhQUEEKLVRoZSBzeW50YXggZm9yIEBjb2Rley5sY29tbX0gZGlmZmVycyBzbGlnaHRseSBvbiB0aGUgSFBQQS4gIFRoZSBzeW50YXggaXMKLUBzYW1we0B2YXJ7c3ltYm9sfSAubGNvbW0sIEB2YXJ7bGVuZ3RofX07IEB2YXJ7c3ltYm9sfSBpcyBvcHRpb25hbC4KLUBlbmQgaWZzZXQKLQotQG5vZGUgTGZsYWdzCi1Ac2VjdGlvbiBAY29kZXsubGZsYWdzfQotCi1AY2luZGV4IEBjb2Rle2xmbGFnc30gZGlyZWN0aXZlIChpZ25vcmVkKQotQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgotYXNzZW1ibGVycywgYnV0IGlnbm9yZXMgaXQuCi0KLUBpZmNsZWFyIG5vLWxpbmUtZGlyCi1Abm9kZSBMaW5lCi1Ac2VjdGlvbiBAY29kZXsubGluZSBAdmFye2xpbmUtbnVtYmVyfX0KLQotQGNpbmRleCBAY29kZXtsaW5lfSBkaXJlY3RpdmUKLUBlbmQgaWZjbGVhcgotQGlmc2V0IG5vLWxpbmUtZGlyCi1Abm9kZSBMbgotQHNlY3Rpb24gQGNvZGV7LmxuIEB2YXJ7bGluZS1udW1iZXJ9fQotCi1AY2luZGV4IEBjb2Rle2xufSBkaXJlY3RpdmUKLUBlbmQgaWZzZXQKLUBjaW5kZXggbG9naWNhbCBsaW5lIG51bWJlcgotQGlmc2V0IGFvdXQtYm91dAotQ2hhbmdlIHRoZSBsb2dpY2FsIGxpbmUgbnVtYmVyLiAgQHZhcntsaW5lLW51bWJlcn0gbXVzdCBiZSBhbiBhYnNvbHV0ZQotZXhwcmVzc2lvbi4gIFRoZSBuZXh0IGxpbmUgaGFzIHRoYXQgbG9naWNhbCBsaW5lIG51bWJlci4gIFRoZXJlZm9yZSBhbnkgb3RoZXIKLXN0YXRlbWVudHMgb24gdGhlIGN1cnJlbnQgbGluZSAoYWZ0ZXIgYSBzdGF0ZW1lbnQgc2VwYXJhdG9yIGNoYXJhY3RlcikgYXJlCi1yZXBvcnRlZCBhcyBvbiBsb2dpY2FsIGxpbmUgbnVtYmVyIEB2YXJ7bGluZS1udW1iZXJ9IEBtaW51c3t9IDEuICBPbmUgZGF5Ci1AY29kZXtAdmFsdWV7QVN9fSB3aWxsIG5vIGxvbmdlciBzdXBwb3J0IHRoaXMgZGlyZWN0aXZlOiBpdCBpcyByZWNvZ25pemVkIG9ubHkKLWZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgYXNzZW1ibGVyIHByb2dyYW1zLgotCi1AaWZzZXQgR0VORVJJQwotQGlmc2V0IEEyOUsKLUBlbXBoe1dhcm5pbmc6fSBJbiB0aGUgQU1EMjlLIGNvbmZpZ3VyYXRpb24gb2YgQHZhbHVle0FTfSwgdGhpcyBjb21tYW5kIGlzCi1ub3QgYXZhaWxhYmxlOyB1c2UgdGhlIHN5bm9ueW0gQGNvZGV7LmxufSBpbiB0aGF0IGNvbnRleHQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBpZmNsZWFyIG5vLWxpbmUtZGlyCi1FdmVuIHRob3VnaCB0aGlzIGlzIGEgZGlyZWN0aXZlIGFzc29jaWF0ZWQgd2l0aCB0aGUgQGNvZGV7YS5vdXR9IG9yCi1AY29kZXtiLm91dH0gb2JqZWN0LWNvZGUgZm9ybWF0cywgQGNvZGV7QHZhbHVle0FTfX0gc3RpbGwgcmVjb2duaXplcyBpdAotd2hlbiBwcm9kdWNpbmcgQ09GRiBvdXRwdXQsIGFuZCB0cmVhdHMgQHNhbXB7LmxpbmV9IGFzIHRob3VnaCBpdAotd2VyZSB0aGUgQ09GRiBAc2FtcHsubG59IEBlbXBoe2lmfSBpdCBpcyBmb3VuZCBvdXRzaWRlIGEKLUBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpci4KLQotSW5zaWRlIGEgQGNvZGV7LmRlZn0sIEBzYW1wey5saW5lfSBpcywgaW5zdGVhZCwgb25lIG9mIHRoZSBkaXJlY3RpdmVzCi11c2VkIGJ5IGNvbXBpbGVycyB0byBnZW5lcmF0ZSBhdXhpbGlhcnkgc3ltYm9sIGluZm9ybWF0aW9uIGZvcgotZGVidWdnaW5nLgotQGVuZCBpZmNsZWFyCi0KLUBub2RlIExpbmtvbmNlCi1Ac2VjdGlvbiBAY29kZXsubGlua29uY2UgW0B2YXJ7dHlwZX1dfQotQGNpbmRleCBDT01EQVQKLUBjaW5kZXggQGNvZGV7bGlua29uY2V9IGRpcmVjdGl2ZQotQGNpbmRleCBjb21tb24gc2VjdGlvbnMKLU1hcmsgdGhlIGN1cnJlbnQgc2VjdGlvbiBzbyB0aGF0IHRoZSBsaW5rZXIgb25seSBpbmNsdWRlcyBhIHNpbmdsZSBjb3B5IG9mIGl0LgotVGhpcyBtYXkgYmUgdXNlZCB0byBpbmNsdWRlIHRoZSBzYW1lIHNlY3Rpb24gaW4gc2V2ZXJhbCBkaWZmZXJlbnQgb2JqZWN0IGZpbGVzLAotYnV0IGVuc3VyZSB0aGF0IHRoZSBsaW5rZXIgd2lsbCBvbmx5IGluY2x1ZGUgaXQgb25jZSBpbiB0aGUgZmluYWwgb3V0cHV0IGZpbGUuCi1UaGUgQGNvZGV7LmxpbmtvbmNlfSBwc2V1ZG8tb3AgbXVzdCBiZSB1c2VkIGZvciBlYWNoIGluc3RhbmNlIG9mIHRoZSBzZWN0aW9uLgotRHVwbGljYXRlIHNlY3Rpb25zIGFyZSBkZXRlY3RlZCBiYXNlZCBvbiB0aGUgc2VjdGlvbiBuYW1lLCBzbyBpdCBzaG91bGQgYmUKLXVuaXF1ZS4KLQotVGhpcyBkaXJlY3RpdmUgaXMgb25seSBzdXBwb3J0ZWQgYnkgYSBmZXcgb2JqZWN0IGZpbGUgZm9ybWF0czsgYXMgb2YgdGhpcwotd3JpdGluZywgdGhlIG9ubHkgb2JqZWN0IGZpbGUgZm9ybWF0IHdoaWNoIHN1cHBvcnRzIGl0IGlzIHRoZSBQb3J0YWJsZQotRXhlY3V0YWJsZSBmb3JtYXQgdXNlZCBvbiBXaW5kb3dzIE5ULgotCi1UaGUgQHZhcnt0eXBlfSBhcmd1bWVudCBpcyBvcHRpb25hbC4gIElmIHNwZWNpZmllZCwgaXQgbXVzdCBiZSBvbmUgb2YgdGhlCi1mb2xsb3dpbmcgc3RyaW5ncy4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotLmxpbmtvbmNlIHNhbWVfc2l6ZQotQGVuZCBzbWFsbGV4YW1wbGUKLU5vdCBhbGwgdHlwZXMgbWF5IGJlIHN1cHBvcnRlZCBvbiBhbGwgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBkaXNjYXJkCi1TaWxlbnRseSBkaXNjYXJkIGR1cGxpY2F0ZSBzZWN0aW9ucy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCi0KLUBpdGVtIG9uZV9vbmx5Ci1XYXJuIGlmIHRoZXJlIGFyZSBkdXBsaWNhdGUgc2VjdGlvbnMsIGJ1dCBzdGlsbCBrZWVwIG9ubHkgb25lIGNvcHkuCi0KLUBpdGVtIHNhbWVfc2l6ZQotV2FybiBpZiBhbnkgb2YgdGhlIGR1cGxpY2F0ZXMgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuCi0KLUBpdGVtIHNhbWVfY29udGVudHMKLVdhcm4gaWYgYW55IG9mIHRoZSBkdXBsaWNhdGVzIGRvIG5vdCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgY29udGVudHMuCi1AZW5kIHRhYmxlCi0KLUBub2RlIExuCi1Ac2VjdGlvbiBAY29kZXsubG4gQHZhcntsaW5lLW51bWJlcn19Ci0KLUBjaW5kZXggQGNvZGV7bG59IGRpcmVjdGl2ZQotQGlmY2xlYXIgbm8tbGluZS1kaXIKLUBzYW1wey5sbn0gaXMgYSBzeW5vbnltIGZvciBAc2FtcHsubGluZX0uCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBuby1saW5lLWRpcgotVGVsbCBAY29kZXtAdmFsdWV7QVN9fSB0byBjaGFuZ2UgdGhlIGxvZ2ljYWwgbGluZSBudW1iZXIuICBAdmFye2xpbmUtbnVtYmVyfQotbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgVGhlIG5leHQgbGluZSBoYXMgdGhhdCBsb2dpY2FsCi1saW5lIG51bWJlciwgc28gYW55IG90aGVyIHN0YXRlbWVudHMgb24gdGhlIGN1cnJlbnQgbGluZSAoYWZ0ZXIgYQotc3RhdGVtZW50IHNlcGFyYXRvciBjaGFyYWN0ZXIgQGNvZGV7O30pIGFyZSByZXBvcnRlZCBhcyBvbiBsb2dpY2FsCi1saW5lIG51bWJlciBAdmFye2xpbmUtbnVtYmVyfSBAbWludXN7fSAxLgotQGlmc2V0IEJPVVQKLQotVGhpcyBkaXJlY3RpdmUgaXMgYWNjZXB0ZWQsIGJ1dCBpZ25vcmVkLCB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzCi1jb25maWd1cmVkIGZvciBAY29kZXtiLm91dH07IGl0cyBlZmZlY3QgaXMgb25seSBhc3NvY2lhdGVkIHdpdGggQ09GRgotb3V0cHV0IGZvcm1hdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQG5vZGUgTVJJCi1Ac2VjdGlvbiBAY29kZXsubXJpIEB2YXJ7dmFsfX0KLQotQGNpbmRleCBAY29kZXttcml9IGRpcmVjdGl2ZQotQGNpbmRleCBNUkkgbW9kZSwgdGVtcG9yYXJpbHkKLUlmIEB2YXJ7dmFsfSBpcyBub24temVybywgdGhpcyB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0byBlbnRlciBNUkkgbW9kZS4gIElmCi1AdmFye3ZhbH0gaXMgemVybywgdGhpcyB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0byBleGl0IE1SSSBtb2RlLiAgVGhpcyBjaGFuZ2UKLWFmZmVjdHMgY29kZSBhc3NlbWJsZWQgdW50aWwgdGhlIG5leHQgQGNvZGV7Lm1yaX0gZGlyZWN0aXZlLCBvciB1bnRpbCB0aGUgZW5kCi1vZiB0aGUgZmlsZS4gIEB4cmVme00sIE1SSSBtb2RlLCBNUkkgbW9kZX0uCi0KLUBub2RlIExpc3QKLUBzZWN0aW9uIEBjb2Rley5saXN0fQotCi1AY2luZGV4IEBjb2Rle2xpc3R9IGRpcmVjdGl2ZQotQGNpbmRleCBsaXN0aW5nIGNvbnRyb2wsIHR1cm5pbmcgb24KLUNvbnRyb2wgKGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEBjb2Rley5ub2xpc3R9IGRpcmVjdGl2ZSkgd2hldGhlciBvcgotbm90IGFzc2VtYmx5IGxpc3RpbmdzIGFyZSBnZW5lcmF0ZWQuICBUaGVzZSB0d28gZGlyZWN0aXZlcyBtYWludGFpbiBhbgotaW50ZXJuYWwgY291bnRlciAod2hpY2ggaXMgemVybyBpbml0aWFsbHkpLiAgIEBjb2Rley5saXN0fSBpbmNyZW1lbnRzIHRoZQotY291bnRlciwgYW5kIEBjb2Rley5ub2xpc3R9IGRlY3JlbWVudHMgaXQuICBBc3NlbWJseSBsaXN0aW5ncyBhcmUKLWdlbmVyYXRlZCB3aGVuZXZlciB0aGUgY291bnRlciBpcyBncmVhdGVyIHRoYW4gemVyby4KLQotQnkgZGVmYXVsdCwgbGlzdGluZ3MgYXJlIGRpc2FibGVkLiAgV2hlbiB5b3UgZW5hYmxlIHRoZW0gKHdpdGggdGhlCi1Ac2FtcHstYX0gY29tbWFuZCBsaW5lIG9wdGlvbjsgQHB4cmVme0ludm9raW5nLCxDb21tYW5kLUxpbmUgT3B0aW9uc30pLAotdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGxpc3RpbmcgY291bnRlciBpcyBvbmUuCi0KLUBub2RlIExvbmcKLUBzZWN0aW9uIEBjb2Rley5sb25nIEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle2xvbmd9IGRpcmVjdGl2ZQotQGNvZGV7Lmxvbmd9IGlzIHRoZSBzYW1lIGFzIEBzYW1wey5pbnR9LCBAcHhyZWZ7SW50LCxAY29kZXsuaW50fX0uCi0KLUBpZ25vcmUKLUBjIG5vIG9uZSBzZWVtcyB0byBrbm93IHdoYXQgdGhpcyBpcyBmb3Igb3Igd2hldGhlciB0aGlzIGRlc2NyaXB0aW9uIGlzCi1AYyB3aGF0IGl0IHJlYWxseSBvdWdodCB0byBkbwotQG5vZGUgTHN5bQotQHNlY3Rpb24gQGNvZGV7LmxzeW0gQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotCi1AY2luZGV4IEBjb2Rle2xzeW19IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wsIG5vdCByZWZlcmVuY2VkIGluIGFzc2VtYmx5Ci1AY29kZXsubHN5bX0gY3JlYXRlcyBhIG5ldyBzeW1ib2wgbmFtZWQgQHZhcntzeW1ib2x9LCBidXQgZG9lcyBub3QgcHV0IGl0IGluCi10aGUgaGFzaCB0YWJsZSwgZW5zdXJpbmcgaXQgY2Fubm90IGJlIHJlZmVyZW5jZWQgYnkgbmFtZSBkdXJpbmcgdGhlCi1yZXN0IG9mIHRoZSBhc3NlbWJseS4gIFRoaXMgc2V0cyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgc3ltYm9sIHRvIGJlCi10aGUgc2FtZSBhcyB0aGUgZXhwcmVzc2lvbiB2YWx1ZToKLUBzbWFsbGV4YW1wbGUKLUB2YXJ7b3RoZXJ9ID0gQHZhcntkZXNjcmlwdG9yfSA9IDAKLUB2YXJ7dHlwZX0gPSBAcnsoc2VjdGlvbiBvZiBAdmFye2V4cHJlc3Npb259KX0KLUB2YXJ7dmFsdWV9ID0gQHZhcntleHByZXNzaW9ufQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhlIG5ldyBzeW1ib2wgaXMgbm90IGZsYWdnZWQgYXMgZXh0ZXJuYWwuCi1AZW5kIGlnbm9yZQotCi1Abm9kZSBNYWNybwotQHNlY3Rpb24gQGNvZGV7Lm1hY3JvfQotCi1AY2luZGV4IG1hY3JvcwotVGhlIGNvbW1hbmRzIEBjb2Rley5tYWNyb30gYW5kIEBjb2Rley5lbmRtfSBhbGxvdyB5b3UgdG8gZGVmaW5lIG1hY3JvcyB0aGF0Ci1nZW5lcmF0ZSBhc3NlbWJseSBvdXRwdXQuICBGb3IgZXhhbXBsZSwgdGhpcyBkZWZpbml0aW9uIHNwZWNpZmllcyBhIG1hY3JvCi1AY29kZXtzdW19IHRoYXQgcHV0cyBhIHNlcXVlbmNlIG9mIG51bWJlcnMgaW50byBtZW1vcnk6Ci0KLUBleGFtcGxlCi0gICAgICAgIC5tYWNybyAgc3VtIGZyb209MCwgdG89NQotICAgICAgICAubG9uZyAgIFxmcm9tCi0gICAgICAgIC5pZiAgICAgXHRvLVxmcm9tCi0gICAgICAgIHN1bSAgICAgIihcZnJvbSsxKSIsXHRvCi0gICAgICAgIC5lbmRpZgotICAgICAgICAuZW5kbQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotV2l0aCB0aGF0IGRlZmluaXRpb24sIEBzYW1we1NVTSAwLDV9IGlzIGVxdWl2YWxlbnQgdG8gdGhpcyBhc3NlbWJseSBpbnB1dDoKLQotQGV4YW1wbGUKLSAgICAgICAgLmxvbmcgICAwCi0gICAgICAgIC5sb25nICAgMQotICAgICAgICAubG9uZyAgIDIKLSAgICAgICAgLmxvbmcgICAzCi0gICAgICAgIC5sb25nICAgNAotICAgICAgICAubG9uZyAgIDUKLUBlbmQgZXhhbXBsZQotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAubWFjcm8gQHZhcnttYWNuYW1lfQotQGl0ZW14IC5tYWNybyBAdmFye21hY25hbWV9IEB2YXJ7bWFjYXJnc30gQGRvdHN7fQotQGNpbmRleCBAY29kZXttYWNyb30gZGlyZWN0aXZlCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAdmFye21hY25hbWV9LiAgSWYgeW91ciBtYWNybwotZGVmaW5pdGlvbiByZXF1aXJlcyBhcmd1bWVudHMsIHNwZWNpZnkgdGhlaXIgbmFtZXMgYWZ0ZXIgdGhlIG1hY3JvIG5hbWUsCi1zZXBhcmF0ZWQgYnkgY29tbWFzIG9yIHNwYWNlcy4gIFlvdSBjYW4gc3VwcGx5IGEgZGVmYXVsdCB2YWx1ZSBmb3IgYW55Ci1tYWNybyBhcmd1bWVudCBieSBmb2xsb3dpbmcgdGhlIG5hbWUgd2l0aCBAc2FtcHs9QHZhcntkZWZsdH19LiAgRm9yCi1leGFtcGxlLCB0aGVzZSBhcmUgYWxsIHZhbGlkIEBjb2Rley5tYWNyb30gc3RhdGVtZW50czoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAubWFjcm8gY29tbQotQmVnaW4gdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQGNvZGV7Y29tbX0sIHdoaWNoIHRha2VzIG5vCi1hcmd1bWVudHMuCi0KLUBpdGVtIC5tYWNybyBwbHVzMSBwLCBwMQotQGl0ZW14IC5tYWNybyBwbHVzMSBwIHAxCi1FaXRoZXIgc3RhdGVtZW50IGJlZ2lucyB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtwbHVzMX0sCi13aGljaCB0YWtlcyB0d28gYXJndW1lbnRzOyB3aXRoaW4gdGhlIG1hY3JvIGRlZmluaXRpb24sIHdyaXRlCi1Ac2FtcHtccH0gb3IgQHNhbXB7XHAxfSB0byBldmFsdWF0ZSB0aGUgYXJndW1lbnRzLgotCi1AaXRlbSAubWFjcm8gcmVzZXJ2ZV9zdHIgcDE9MCBwMgotQmVnaW4gdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQGNvZGV7cmVzZXJ2ZV9zdHJ9LCB3aXRoIHR3bwotYXJndW1lbnRzLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGhhcyBhIGRlZmF1bHQgdmFsdWUsIGJ1dCBub3QgdGhlIHNlY29uZC4KLUFmdGVyIHRoZSBkZWZpbml0aW9uIGlzIGNvbXBsZXRlLCB5b3UgY2FuIGNhbGwgdGhlIG1hY3JvIGVpdGhlciBhcwotQHNhbXB7cmVzZXJ2ZV9zdHIgQHZhcnthfSxAdmFye2J9fSAod2l0aCBAc2FtcHtccDF9IGV2YWx1YXRpbmcgdG8KLUB2YXJ7YX0gYW5kIEBzYW1we1xwMn0gZXZhbHVhdGluZyB0byBAdmFye2J9KSwgb3IgYXMgQHNhbXB7cmVzZXJ2ZV9zdHIKLSxAdmFye2J9fSAod2l0aCBAc2FtcHtccDF9IGV2YWx1YXRpbmcgYXMgdGhlIGRlZmF1bHQsIGluIHRoaXMgY2FzZQotQHNhbXB7MH0sIGFuZCBAc2FtcHtccDJ9IGV2YWx1YXRpbmcgdG8gQHZhcntifSkuCi1AZW5kIHRhYmxlCi0KLVdoZW4geW91IGNhbGwgYSBtYWNybywgeW91IGNhbiBzcGVjaWZ5IHRoZSBhcmd1bWVudCB2YWx1ZXMgZWl0aGVyIGJ5Ci1wb3NpdGlvbiwgb3IgYnkga2V5d29yZC4gIEZvciBleGFtcGxlLCBAc2FtcHtzdW0gOSwxN30gaXMgZXF1aXZhbGVudCB0bwotQHNhbXB7c3VtIHRvPTE3LCBmcm9tPTl9LgotCi1AaXRlbSAuZW5kbQotQGNpbmRleCBAY29kZXtlbmRtfSBkaXJlY3RpdmUKLU1hcmsgdGhlIGVuZCBvZiBhIG1hY3JvIGRlZmluaXRpb24uCi0KLUBpdGVtIC5leGl0bQotQGNpbmRleCBAY29kZXtleGl0bX0gZGlyZWN0aXZlCi1FeGl0IGVhcmx5IGZyb20gdGhlIGN1cnJlbnQgbWFjcm8gZGVmaW5pdGlvbi4KLQotQGNpbmRleCBudW1iZXIgb2YgbWFjcm9zIGV4ZWN1dGVkCi1AY2luZGV4IG1hY3JvcywgY291bnQgZXhlY3V0ZWQKLUBpdGVtIFxAQAotQGNvZGV7QHZhbHVle0FTfX0gbWFpbnRhaW5zIGEgY291bnRlciBvZiBob3cgbWFueSBtYWNyb3MgaXQgaGFzCi1leGVjdXRlZCBpbiB0aGlzIHBzZXVkby12YXJpYWJsZTsgeW91IGNhbiBjb3B5IHRoYXQgbnVtYmVyIHRvIHlvdXIKLW91dHB1dCB3aXRoIEBzYW1we1xAQH0sIGJ1dCBAZW1waHtvbmx5IHdpdGhpbiBhIG1hY3JvIGRlZmluaXRpb259LgotCi1AaWdub3JlCi1AaXRlbSBMT0NBTCBAdmFye25hbWV9IFsgLCBAZG90c3t9IF0KLUBlbXBoe1dhcm5pbmc6IEBjb2Rle0xPQ0FMfSBpcyBvbmx5IGF2YWlsYWJsZSBpZiB5b3Ugc2VsZWN0IGBgYWx0ZXJuYXRlCi1tYWNybyBzeW50YXgnJyB3aXRoIEBzYW1wey1hfSBvciBAc2FtcHstLWFsdGVybmF0ZX0ufSAgQHhyZWZ7QWx0ZXJuYXRlLCwKLUFsdGVybmF0ZSBtYWNybyBzeW50YXh9LgotCi1HZW5lcmF0ZSBhIHN0cmluZyByZXBsYWNlbWVudCBmb3IgZWFjaCBvZiB0aGUgQHZhcntuYW1lfSBhcmd1bWVudHMsIGFuZAotcmVwbGFjZSBhbnkgaW5zdGFuY2VzIG9mIEB2YXJ7bmFtZX0gaW4gZWFjaCBtYWNybyBleHBhbnNpb24uICBUaGUKLXJlcGxhY2VtZW50IHN0cmluZyBpcyB1bmlxdWUgaW4gdGhlIGFzc2VtYmx5LCBhbmQgZGlmZmVyZW50IGZvciBlYWNoCi1zZXBhcmF0ZSBtYWNybyBleHBhbnNpb24uICBAY29kZXtMT0NBTH0gYWxsb3dzIHlvdSB0byB3cml0ZSBtYWNyb3MgdGhhdAotZGVmaW5lIHN5bWJvbHMsIHdpdGhvdXQgZmVhciBvZiBjb25mbGljdCBiZXR3ZWVuIHNlcGFyYXRlIG1hY3JvIGV4cGFuc2lvbnMuCi1AZW5kIGlnbm9yZQotQGVuZCBmdGFibGUKLQotQG5vZGUgTm9saXN0Ci1Ac2VjdGlvbiBAY29kZXsubm9saXN0fQotCi1AY2luZGV4IEBjb2Rle25vbGlzdH0gZGlyZWN0aXZlCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbCwgdHVybmluZyBvZmYKLUNvbnRyb2wgKGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEBjb2Rley5saXN0fSBkaXJlY3RpdmUpIHdoZXRoZXIgb3IKLW5vdCBhc3NlbWJseSBsaXN0aW5ncyBhcmUgZ2VuZXJhdGVkLiAgVGhlc2UgdHdvIGRpcmVjdGl2ZXMgbWFpbnRhaW4gYW4KLWludGVybmFsIGNvdW50ZXIgKHdoaWNoIGlzIHplcm8gaW5pdGlhbGx5KS4gICBAY29kZXsubGlzdH0gaW5jcmVtZW50cyB0aGUKLWNvdW50ZXIsIGFuZCBAY29kZXsubm9saXN0fSBkZWNyZW1lbnRzIGl0LiAgQXNzZW1ibHkgbGlzdGluZ3MgYXJlCi1nZW5lcmF0ZWQgd2hlbmV2ZXIgdGhlIGNvdW50ZXIgaXMgZ3JlYXRlciB0aGFuIHplcm8uCi0KLUBub2RlIE9jdGEKLUBzZWN0aW9uIEBjb2Rley5vY3RhIEB2YXJ7YmlnbnVtc319Ci0KLUBjIEZJWE1FOiBkb3VibGUgc2l6ZSBlbWl0dGVkIGZvciAib2N0YSIgb24gaTk2MCwgb3RoZXJzPyAgT3Igd2Fybj8KLUBjaW5kZXggQGNvZGV7b2N0YX0gZGlyZWN0aXZlCi1AY2luZGV4IGludGVnZXIsIDE2LWJ5dGUKLUBjaW5kZXggc2l4dGVlbiBieXRlIGludGVnZXIKLVRoaXMgZGlyZWN0aXZlIGV4cGVjdHMgemVybyBvciBtb3JlIGJpZ251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMuICBGb3IgZWFjaAotYmlnbnVtLCBpdCBlbWl0cyBhIDE2LWJ5dGUgaW50ZWdlci4KLQotVGhlIHRlcm0gYGBvY3RhJycgY29tZXMgZnJvbSBjb250ZXh0cyBpbiB3aGljaCBhIGBgd29yZCcnIGlzIHR3byBieXRlczsKLWhlbmNlIEBlbXBoe29jdGF9LXdvcmQgZm9yIDE2IGJ5dGVzLgotCi1Abm9kZSBPcmcKLUBzZWN0aW9uIEBjb2Rley5vcmcgQHZhcntuZXctbGN9ICwgQHZhcntmaWxsfX0KLQotQGNpbmRleCBAY29kZXtvcmd9IGRpcmVjdGl2ZQotQGNpbmRleCBsb2NhdGlvbiBjb3VudGVyLCBhZHZhbmNpbmcKLUBjaW5kZXggYWR2YW5jaW5nIGxvY2F0aW9uIGNvdW50ZXIKLUBjaW5kZXggY3VycmVudCBhZGRyZXNzLCBhZHZhbmNpbmcKLUFkdmFuY2UgdGhlIGxvY2F0aW9uIGNvdW50ZXIgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbiB0bwotQHZhcntuZXctbGN9LiAgQHZhcntuZXctbGN9IGlzIGVpdGhlciBhbiBhYnNvbHV0ZSBleHByZXNzaW9uIG9yIGFuCi1leHByZXNzaW9uIHdpdGggdGhlIHNhbWUgc2VjdGlvbiBhcyB0aGUgY3VycmVudCBzdWJzZWN0aW9uLiAgVGhhdCBpcywKLXlvdSBjYW4ndCB1c2UgQGNvZGV7Lm9yZ30gdG8gY3Jvc3Mgc2VjdGlvbnM6IGlmIEB2YXJ7bmV3LWxjfSBoYXMgdGhlCi13cm9uZyBzZWN0aW9uLCB0aGUgQGNvZGV7Lm9yZ30gZGlyZWN0aXZlIGlzIGlnbm9yZWQuICBUbyBiZSBjb21wYXRpYmxlCi13aXRoIGZvcm1lciBhc3NlbWJsZXJzLCBpZiB0aGUgc2VjdGlvbiBvZiBAdmFye25ldy1sY30gaXMgYWJzb2x1dGUsCi1AY29kZXtAdmFsdWV7QVN9fSBpc3N1ZXMgYSB3YXJuaW5nLCB0aGVuIHByZXRlbmRzIHRoZSBzZWN0aW9uIG9mIEB2YXJ7bmV3LWxjfQotaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgc3Vic2VjdGlvbi4KLQotQGNvZGV7Lm9yZ30gbWF5IG9ubHkgaW5jcmVhc2UgdGhlIGxvY2F0aW9uIGNvdW50ZXIsIG9yIGxlYXZlIGl0Ci11bmNoYW5nZWQ7IHlvdSBjYW5ub3QgdXNlIEBjb2Rley5vcmd9IHRvIG1vdmUgdGhlIGxvY2F0aW9uIGNvdW50ZXIKLWJhY2t3YXJkcy4KLQotQGMgZG91YmxlIG5lZ2F0aXZlIHVzZWQgYmVsb3cgIm5vdCB1bmRlZmluZWQiIGJlY2F1c2UgdGhpcyBpcyBhIHNwZWNpZmljCi1AYyByZWZlcmVuY2UgdG8gInVuZGVmaW5lZCIgKGFzIFNFR19VTktOT1dOIGlzIGNhbGxlZCBpbiB0aGlzIG1hbnVhbCkKLUBjIHNlY3Rpb24uIGRvY0BjeWdudXMuY29tIDE4ZmViOTEKLUJlY2F1c2UgQGNvZGV7QHZhbHVle0FTfX0gdHJpZXMgdG8gYXNzZW1ibGUgcHJvZ3JhbXMgaW4gb25lIHBhc3MsIEB2YXJ7bmV3LWxjfQotbWF5IG5vdCBiZSB1bmRlZmluZWQuICBJZiB5b3UgcmVhbGx5IGRldGVzdCB0aGlzIHJlc3RyaWN0aW9uIHdlIGVhZ2VybHkgYXdhaXQKLWEgY2hhbmNlIHRvIHNoYXJlIHlvdXIgaW1wcm92ZWQgYXNzZW1ibGVyLgotCi1CZXdhcmUgdGhhdCB0aGUgb3JpZ2luIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiwgbm90Ci10byB0aGUgc3RhcnQgb2YgdGhlIHN1YnNlY3Rpb24uICBUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCBvdGhlcgotcGVvcGxlJ3MgYXNzZW1ibGVycy4KLQotV2hlbiB0aGUgbG9jYXRpb24gY291bnRlciAob2YgdGhlIGN1cnJlbnQgc3Vic2VjdGlvbikgaXMgYWR2YW5jZWQsIHRoZQotaW50ZXJ2ZW5pbmcgYnl0ZXMgYXJlIGZpbGxlZCB3aXRoIEB2YXJ7ZmlsbH0gd2hpY2ggc2hvdWxkIGJlIGFuCi1hYnNvbHV0ZSBleHByZXNzaW9uLiAgSWYgdGhlIGNvbW1hIGFuZCBAdmFye2ZpbGx9IGFyZSBvbWl0dGVkLAotQHZhcntmaWxsfSBkZWZhdWx0cyB0byB6ZXJvLgotCi1Abm9kZSBQMmFsaWduCi1Ac2VjdGlvbiBAY29kZXsucDJhbGlnblt3bF0gQHZhcnthYnMtZXhwcn0sIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfX0KLQotQGNpbmRleCBwYWRkaW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyIGdpdmVuIGEgcG93ZXIgb2YgdHdvCi1AY2luZGV4IEBjb2Rle3AyYWxpZ259IGRpcmVjdGl2ZQotUGFkIHRoZSBsb2NhdGlvbiBjb3VudGVyIChpbiB0aGUgY3VycmVudCBzdWJzZWN0aW9uKSB0byBhIHBhcnRpY3VsYXIKLXN0b3JhZ2UgYm91bmRhcnkuICBUaGUgZmlyc3QgZXhwcmVzc2lvbiAod2hpY2ggbXVzdCBiZSBhYnNvbHV0ZSkgaXMgdGhlCi1udW1iZXIgb2YgbG93LW9yZGVyIHplcm8gYml0cyB0aGUgbG9jYXRpb24gY291bnRlciBtdXN0IGhhdmUgYWZ0ZXIKLWFkdmFuY2VtZW50LiAgRm9yIGV4YW1wbGUgQHNhbXB7LnAyYWxpZ24gM30gYWR2YW5jZXMgdGhlIGxvY2F0aW9uCi1jb3VudGVyIHVudGlsIGl0IGEgbXVsdGlwbGUgb2YgOC4gIElmIHRoZSBsb2NhdGlvbiBjb3VudGVyIGlzIGFscmVhZHkgYQotbXVsdGlwbGUgb2YgOCwgbm8gY2hhbmdlIGlzIG5lZWRlZC4KLQotVGhlIHNlY29uZCBleHByZXNzaW9uIChhbHNvIGFic29sdXRlKSBnaXZlcyB0aGUgZmlsbCB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gdGhlCi1wYWRkaW5nIGJ5dGVzLiAgSXQgKGFuZCB0aGUgY29tbWEpIG1heSBiZSBvbWl0dGVkLiAgSWYgaXQgaXMgb21pdHRlZCwgdGhlCi1wYWRkaW5nIGJ5dGVzIGFyZSBub3JtYWxseSB6ZXJvLiAgSG93ZXZlciwgb24gc29tZSBzeXN0ZW1zLCBpZiB0aGUgc2VjdGlvbiBpcwotbWFya2VkIGFzIGNvbnRhaW5pbmcgY29kZSBhbmQgdGhlIGZpbGwgdmFsdWUgaXMgb21pdHRlZCwgdGhlIHNwYWNlIGlzIGZpbGxlZAotd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMuCi0KLVRoZSB0aGlyZCBleHByZXNzaW9uIGlzIGFsc28gYWJzb2x1dGUsIGFuZCBpcyBhbHNvIG9wdGlvbmFsLiAgSWYgaXQgaXMgcHJlc2VudCwKLWl0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGJ5IHRoaXMgYWxpZ25tZW50Ci1kaXJlY3RpdmUuICBJZiBkb2luZyB0aGUgYWxpZ25tZW50IHdvdWxkIHJlcXVpcmUgc2tpcHBpbmcgbW9yZSBieXRlcyB0aGFuIHRoZQotc3BlY2lmaWVkIG1heGltdW0sIHRoZW4gdGhlIGFsaWdubWVudCBpcyBub3QgZG9uZSBhdCBhbGwuICBZb3UgY2FuIG9taXQgdGhlCi1maWxsIHZhbHVlICh0aGUgc2Vjb25kIGFyZ3VtZW50KSBlbnRpcmVseSBieSBzaW1wbHkgdXNpbmcgdHdvIGNvbW1hcyBhZnRlciB0aGUKLXJlcXVpcmVkIGFsaWdubWVudDsgdGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBhbGlnbm1lbnQgdG8gYmUgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucyB3aGVuIGFwcHJvcHJpYXRlLgotCi1AY2luZGV4IEBjb2Rle3AyYWxpZ253fSBkaXJlY3RpdmUKLUBjaW5kZXggQGNvZGV7cDJhbGlnbmx9IGRpcmVjdGl2ZQotVGhlIEBjb2Rley5wMmFsaWdud30gYW5kIEBjb2Rley5wMmFsaWdubH0gZGlyZWN0aXZlcyBhcmUgdmFyaWFudHMgb2YgdGhlCi1AY29kZXsucDJhbGlnbn0gZGlyZWN0aXZlLiAgVGhlIEBjb2Rley5wMmFsaWdud30gZGlyZWN0aXZlIHRyZWF0cyB0aGUgZmlsbAotcGF0dGVybiBhcyBhIHR3byBieXRlIHdvcmQgdmFsdWUuICBUaGUgQGNvZGV7LnAyYWxpZ25sfSBkaXJlY3RpdmVzIHRyZWF0cyB0aGUKLWZpbGwgcGF0dGVybiBhcyBhIGZvdXIgYnl0ZSBsb25nd29yZCB2YWx1ZS4gIEZvciBleGFtcGxlLCBAY29kZXsucDJhbGlnbncKLTIsMHgzNjhkfSB3aWxsIGFsaWduIHRvIGEgbXVsdGlwbGUgb2YgNC4gIElmIGl0IHNraXBzIHR3byBieXRlcywgdGhleSB3aWxsIGJlCi1maWxsZWQgaW4gd2l0aCB0aGUgdmFsdWUgMHgzNjhkICh0aGUgZXhhY3QgcGxhY2VtZW50IG9mIHRoZSBieXRlcyBkZXBlbmRzIHVwb24KLXRoZSBlbmRpYW5uZXNzIG9mIHRoZSBwcm9jZXNzb3IpLiAgSWYgaXQgc2tpcHMgMSBvciAzIGJ5dGVzLCB0aGUgZmlsbCB2YWx1ZSBpcwotdW5kZWZpbmVkLgotCi1Abm9kZSBQcmludAotQHNlY3Rpb24gQGNvZGV7LnByaW50IEB2YXJ7c3RyaW5nfX0KLQotQGNpbmRleCBAY29kZXtwcmludH0gZGlyZWN0aXZlCi1AY29kZXtAdmFsdWV7QVN9fSB3aWxsIHByaW50IEB2YXJ7c3RyaW5nfSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGR1cmluZwotYXNzZW1ibHkuICBZb3UgbXVzdCBwdXQgQHZhcntzdHJpbmd9IGluIGRvdWJsZSBxdW90ZXMuCi0KLUBub2RlIFBzaXplCi1Ac2VjdGlvbiBAY29kZXsucHNpemUgQHZhcntsaW5lc30gLCBAdmFye2NvbHVtbnN9fQotCi1AY2luZGV4IEBjb2Rle3BzaXplfSBkaXJlY3RpdmUKLUBjaW5kZXggbGlzdGluZyBjb250cm9sOiBwYXBlciBzaXplCi1AY2luZGV4IHBhcGVyIHNpemUsIGZvciBsaXN0aW5ncwotVXNlIHRoaXMgZGlyZWN0aXZlIHRvIGRlY2xhcmUgdGhlIG51bWJlciBvZiBsaW5lcy0tLWFuZCwgb3B0aW9uYWxseSwgdGhlCi1udW1iZXIgb2YgY29sdW1ucy0tLXRvIHVzZSBmb3IgZWFjaCBwYWdlLCB3aGVuIGdlbmVyYXRpbmcgbGlzdGluZ3MuCi0KLUlmIHlvdSBkbyBub3QgdXNlIEBjb2Rley5wc2l6ZX0sIGxpc3RpbmdzIHVzZSBhIGRlZmF1bHQgbGluZS1jb3VudAotb2YgNjAuICBZb3UgbWF5IG9taXQgdGhlIGNvbW1hIGFuZCBAdmFye2NvbHVtbnN9IHNwZWNpZmljYXRpb247IHRoZQotZGVmYXVsdCB3aWR0aCBpcyAyMDAgY29sdW1ucy4KLQotQGNvZGV7QHZhbHVle0FTfX0gZ2VuZXJhdGVzIGZvcm1mZWVkcyB3aGVuZXZlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZgotbGluZXMgaXMgZXhjZWVkZWQgKG9yIHdoZW5ldmVyIHlvdSBleHBsaWNpdGx5IHJlcXVlc3Qgb25lLCB1c2luZwotQGNvZGV7LmVqZWN0fSkuCi0KLUlmIHlvdSBzcGVjaWZ5IEB2YXJ7bGluZXN9IGFzIEBjb2RlezB9LCBubyBmb3JtZmVlZHMgYXJlIGdlbmVyYXRlZCBzYXZlCi10aG9zZSBleHBsaWNpdGx5IHNwZWNpZmllZCB3aXRoIEBjb2Rley5lamVjdH0uCi0KLUBub2RlIFB1cmdlbQotQHNlY3Rpb24gQGNvZGV7LnB1cmdlbSBAdmFye25hbWV9fQotCi1AY2luZGV4IEBjb2Rle3B1cmdlbX0gZGlyZWN0aXZlCi1VbmRlZmluZSB0aGUgbWFjcm8gQHZhcntuYW1lfSwgc28gdGhhdCBsYXRlciB1c2VzIG9mIHRoZSBzdHJpbmcgd2lsbCBub3QgYmUKLWV4cGFuZGVkLiAgQHhyZWZ7TWFjcm99LgotCi1Abm9kZSBRdWFkCi1Ac2VjdGlvbiBAY29kZXsucXVhZCBAdmFye2JpZ251bXN9fQotCi1AY2luZGV4IEBjb2Rle3F1YWR9IGRpcmVjdGl2ZQotQGNvZGV7LnF1YWR9IGV4cGVjdHMgemVybyBvciBtb3JlIGJpZ251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMuICBGb3IKLWVhY2ggYmlnbnVtLCBpdCBlbWl0cwotQGlmY2xlYXIgYmlnbnVtLTE2Ci1hbiA4LWJ5dGUgaW50ZWdlci4gIElmIHRoZSBiaWdudW0gd29uJ3QgZml0IGluIDggYnl0ZXMsIGl0IHByaW50cyBhCi13YXJuaW5nIG1lc3NhZ2U7IGFuZCBqdXN0IHRha2VzIHRoZSBsb3dlc3Qgb3JkZXIgOCBieXRlcyBvZiB0aGUgYmlnbnVtLgotQGNpbmRleCBlaWdodC1ieXRlIGludGVnZXIKLUBjaW5kZXggaW50ZWdlciwgOC1ieXRlCi0KLVRoZSB0ZXJtIGBgcXVhZCcnIGNvbWVzIGZyb20gY29udGV4dHMgaW4gd2hpY2ggYSBgYHdvcmQnJyBpcyB0d28gYnl0ZXM7Ci1oZW5jZSBAZW1waHtxdWFkfS13b3JkIGZvciA4IGJ5dGVzLgotQGVuZCBpZmNsZWFyCi1AaWZzZXQgYmlnbnVtLTE2Ci1hIDE2LWJ5dGUgaW50ZWdlci4gIElmIHRoZSBiaWdudW0gd29uJ3QgZml0IGluIDE2IGJ5dGVzLCBpdCBwcmludHMgYQotd2FybmluZyBtZXNzYWdlOyBhbmQganVzdCB0YWtlcyB0aGUgbG93ZXN0IG9yZGVyIDE2IGJ5dGVzIG9mIHRoZSBiaWdudW0uCi1AY2luZGV4IHNpeHRlZW4tYnl0ZSBpbnRlZ2VyCi1AY2luZGV4IGludGVnZXIsIDE2LWJ5dGUKLUBlbmQgaWZzZXQKLQotQG5vZGUgUmVwdAotQHNlY3Rpb24gQGNvZGV7LnJlcHQgQHZhcntjb3VudH19Ci0KLUBjaW5kZXggQGNvZGV7cmVwdH0gZGlyZWN0aXZlCi1SZXBlYXQgdGhlIHNlcXVlbmNlIG9mIGxpbmVzIGJldHdlZW4gdGhlIEBjb2Rley5yZXB0fSBkaXJlY3RpdmUgYW5kIHRoZSBuZXh0Ci1AY29kZXsuZW5kcn0gZGlyZWN0aXZlIEB2YXJ7Y291bnR9IHRpbWVzLgotCi1Gb3IgZXhhbXBsZSwgYXNzZW1ibGluZwotCi1AZXhhbXBsZQotICAgICAgICAucmVwdCAgIDMKLSAgICAgICAgLmxvbmcgICAwCi0gICAgICAgIC5lbmRyCi1AZW5kIGV4YW1wbGUKLQotaXMgZXF1aXZhbGVudCB0byBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIC5sb25nICAgMAotICAgICAgICAubG9uZyAgIDAKLSAgICAgICAgLmxvbmcgICAwCi1AZW5kIGV4YW1wbGUKLQotQG5vZGUgU2J0dGwKLUBzZWN0aW9uIEBjb2Rley5zYnR0bCAiQHZhcntzdWJoZWFkaW5nfSJ9Ci0KLUBjaW5kZXggQGNvZGV7c2J0dGx9IGRpcmVjdGl2ZQotQGNpbmRleCBzdWJ0aXRsZXMgZm9yIGxpc3RpbmdzCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbDogc3VidGl0bGUKLVVzZSBAdmFye3N1YmhlYWRpbmd9IGFzIHRoZSB0aXRsZSAodGhpcmQgbGluZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCi10aXRsZSBsaW5lKSB3aGVuIGdlbmVyYXRpbmcgYXNzZW1ibHkgbGlzdGluZ3MuCi0KLVRoaXMgZGlyZWN0aXZlIGFmZmVjdHMgc3Vic2VxdWVudCBwYWdlcywgYXMgd2VsbCBhcyB0aGUgY3VycmVudCBwYWdlIGlmCi1pdCBhcHBlYXJzIHdpdGhpbiB0ZW4gbGluZXMgb2YgdGhlIHRvcCBvZiBhIHBhZ2UuCi0KLUBpZnNldCBDT0ZGCi1Abm9kZSBTY2wKLUBzZWN0aW9uIEBjb2Rley5zY2wgQHZhcntjbGFzc319Ci0KLUBjaW5kZXggQGNvZGV7c2NsfSBkaXJlY3RpdmUKLUBjaW5kZXggc3ltYm9sIHN0b3JhZ2UgY2xhc3MgKENPRkYpCi1AY2luZGV4IENPRkYgc3ltYm9sIHN0b3JhZ2UgY2xhc3MKLVNldCB0aGUgc3RvcmFnZS1jbGFzcyB2YWx1ZSBmb3IgYSBzeW1ib2wuICBUaGlzIGRpcmVjdGl2ZSBtYXkgb25seSBiZQotdXNlZCBpbnNpZGUgYSBAY29kZXsuZGVmfS9AY29kZXsuZW5kZWZ9IHBhaXIuICBTdG9yYWdlIGNsYXNzIG1heSBmbGFnCi13aGV0aGVyIGEgc3ltYm9sIGlzIHN0YXRpYyBvciBleHRlcm5hbCwgb3IgaXQgbWF5IHJlY29yZCBmdXJ0aGVyCi1zeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi1AaWZzZXQgQk9VVAotCi1UaGUgQHNhbXB7LnNjbH0gZGlyZWN0aXZlIGlzIHByaW1hcmlseSBhc3NvY2lhdGVkIHdpdGggQ09GRiBvdXRwdXQ7IHdoZW4KLWNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUgQGNvZGV7Yi5vdXR9IG91dHB1dCBmb3JtYXQsIEBjb2Rle0B2YWx1ZXtBU319Ci1hY2NlcHRzIHRoaXMgZGlyZWN0aXZlIGJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBTZWN0aW9uCi1Ac2VjdGlvbiBAY29kZXsuc2VjdGlvbiBAdmFye25hbWV9fQotCi1AY2luZGV4IEBjb2Rle3NlY3Rpb259IGRpcmVjdGl2ZQotQGNpbmRleCBuYW1lZCBzZWN0aW9uCi1Vc2UgdGhlIEBjb2Rley5zZWN0aW9ufSBkaXJlY3RpdmUgdG8gYXNzZW1ibGUgdGhlIGZvbGxvd2luZyBjb2RlIGludG8gYSBzZWN0aW9uCi1uYW1lZCBAdmFye25hbWV9LgotCi1UaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgdGFyZ2V0cyB0aGF0IGFjdHVhbGx5IHN1cHBvcnQgYXJiaXRyYXJpbHkKLW5hbWVkIHNlY3Rpb25zOyBvbiBAY29kZXthLm91dH0gdGFyZ2V0cywgZm9yIGV4YW1wbGUsIGl0IGlzIG5vdCBhY2NlcHRlZCwgZXZlbgotd2l0aCBhIHN0YW5kYXJkIEBjb2Rle2Eub3V0fSBzZWN0aW9uIG5hbWUuCi0KLUBpZnNldCBDT0ZGCi1Gb3IgQ09GRiB0YXJnZXRzLCB0aGUgQGNvZGV7LnNlY3Rpb259IGRpcmVjdGl2ZSBpcyB1c2VkIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nCi13YXlzOgotQHNtYWxsZXhhbXBsZQotLnNlY3Rpb24gQHZhcntuYW1lfVssICJAdmFye2ZsYWdzfSJdCi0uc2VjdGlvbiBAdmFye25hbWV9WywgQHZhcntzdWJzZWdtZW50fV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUlmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBpcyBxdW90ZWQsIGl0IGlzIHRha2VuIGFzIGZsYWdzIHRvIHVzZSBmb3IgdGhlCi1zZWN0aW9uLiAgRWFjaCBmbGFnIGlzIGEgc2luZ2xlIGNoYXJhY3Rlci4gIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIHJlY29nbml6ZWQ6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIGIKLWJzcyBzZWN0aW9uICh1bmluaXRpYWxpemVkIGRhdGEpCi1AaXRlbSBuCi1zZWN0aW9uIGlzIG5vdCBsb2FkZWQKLUBpdGVtIHcKLXdyaXRhYmxlIHNlY3Rpb24KLUBpdGVtIGQKLWRhdGEgc2VjdGlvbgotQGl0ZW0gcgotcmVhZC1vbmx5IHNlY3Rpb24KLUBpdGVtIHgKLWV4ZWN1dGFibGUgc2VjdGlvbgotQGl0ZW0gcwotc2hhcmVkIHNlY3Rpb24gKG1lYW5pbmdmdWwgZm9yIFBFIHRhcmdldHMpCi1AZW5kIHRhYmxlCi0KLUlmIG5vIGZsYWdzIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGZsYWdzIGRlcGVuZCB1cG9uIHRoZSBzZWN0aW9uIG5hbWUuICBJZgotdGhlIHNlY3Rpb24gbmFtZSBpcyBub3QgcmVjb2duaXplZCwgdGhlIGRlZmF1bHQgd2lsbCBiZSBmb3IgdGhlIHNlY3Rpb24gdG8gYmUKLWxvYWRlZCBhbmQgd3JpdGFibGUuCi0KLUlmIHRoZSBvcHRpb25hbCBhcmd1bWVudCB0byB0aGUgQGNvZGV7LnNlY3Rpb259IGRpcmVjdGl2ZSBpcyBub3QgcXVvdGVkLCBpdCBpcwotdGFrZW4gYXMgYSBzdWJzZWdtZW50IG51bWJlciAoQHB4cmVme1N1Yi1TZWN0aW9uc30pLgotQGVuZCBpZnNldAotCi1AaWZzZXQgRUxGCi1Gb3IgRUxGIHRhcmdldHMsIHRoZSBAY29kZXsuc2VjdGlvbn0gZGlyZWN0aXZlIGlzIHVzZWQgbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotLnNlY3Rpb24gQHZhcntuYW1lfVssICJAdmFye2ZsYWdzfSJbLCBAQEB2YXJ7dHlwZX1dXQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSBvcHRpb25hbCBAdmFye2ZsYWdzfSBhcmd1bWVudCBpcyBhIHF1b3RlZCBzdHJpbmcgd2hpY2ggbWF5IGNvbnRhaW4gYW55Ci1jb21iaW50aW9uIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKLUB0YWJsZSBAY29kZQotQGl0ZW0gYQotc2VjdGlvbiBpcyBhbGxvY2F0YWJsZQotQGl0ZW0gdwotc2VjdGlvbiBpcyB3cml0YWJsZQotQGl0ZW0geAotc2VjdGlvbiBpcyBleGVjdXRhYmxlCi1AZW5kIHRhYmxlCi0KLVRoZSBvcHRpb25hbCBAdmFye3R5cGV9IGFyZ3VtZW50IG1heSBjb250YWluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50czoKLUB0YWJsZSBAY29kZQotQGl0ZW0gQEBwcm9nYml0cwotc2VjdGlvbiBjb250YWlucyBkYXRhCi1AaXRlbSBAQG5vYml0cwotc2VjdGlvbiBkb2VzIG5vdCBjb250YWluIGRhdGEgKGkuZS4sIHNlY3Rpb24gb25seSBvY2N1cGllcyBzcGFjZSkKLUBlbmQgdGFibGUKLQotSWYgbm8gZmxhZ3MgYXJlIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgZmxhZ3MgZGVwZW5kIHVwb24gdGhlIHNlY3Rpb24gbmFtZS4gIElmCi10aGUgc2VjdGlvbiBuYW1lIGlzIG5vdCByZWNvZ25pemVkLCB0aGUgZGVmYXVsdCB3aWxsIGJlIGZvciB0aGUgc2VjdGlvbiB0byBoYXZlCi1ub25lIG9mIHRoZSBhYm92ZSBmbGFnczogaXQgd2lsbCBub3QgYmUgYWxsb2NhdGVkIGluIG1lbW9yeSwgbm9yIHdyaXRhYmxlLCBub3IKLWV4ZWN1dGFibGUuICBUaGUgc2VjdGlvbiB3aWxsIGNvbnRhaW4gZGF0YS4KLQotRm9yIEVMRiB0YXJnZXRzLCB0aGUgYXNzZW1ibGVyIHN1cHBvcnRzIGFub3RoZXIgdHlwZSBvZiBAY29kZXsuc2VjdGlvbn0KLWRpcmVjdGl2ZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBTb2xhcmlzIGFzc2VtYmxlcjoKLUBzbWFsbGV4YW1wbGUKLS5zZWN0aW9uICJAdmFye25hbWV9IlssIEB2YXJ7ZmxhZ3N9Li4uXQotQGVuZCBzbWFsbGV4YW1wbGUKLU5vdGUgdGhhdCB0aGUgc2VjdGlvbiBuYW1lIGlzIHF1b3RlZC4gIFRoZXJlIG1heSBiZSBhIHNlcXVlbmNlIG9mIGNvbW1hCi1zZXBhcmF0ZWQgZmxhZ3M6Ci1AdGFibGUgQGNvZGUKLUBpdGVtICNhbGxvYwotc2VjdGlvbiBpcyBhbGxvY2F0YWJsZQotQGl0ZW0gI3dyaXRlCi1zZWN0aW9uIGlzIHdyaXRhYmxlCi1AaXRlbSAjZXhlY2luc3RyCi1zZWN0aW9uIGlzIGV4ZWN1dGFibGUKLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQG5vZGUgU2V0Ci1Ac2VjdGlvbiBAY29kZXsuc2V0IEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KLQotQGNpbmRleCBAY29kZXtzZXR9IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wgdmFsdWUsIHNldHRpbmcKLVNldCB0aGUgdmFsdWUgb2YgQHZhcntzeW1ib2x9IHRvIEB2YXJ7ZXhwcmVzc2lvbn0uICBUaGlzCi1jaGFuZ2VzIEB2YXJ7c3ltYm9sfSdzIHZhbHVlIGFuZCB0eXBlIHRvIGNvbmZvcm0gdG8KLUB2YXJ7ZXhwcmVzc2lvbn0uICBJZiBAdmFye3N5bWJvbH0gd2FzIGZsYWdnZWQgYXMgZXh0ZXJuYWwsIGl0IHJlbWFpbnMKLWZsYWdnZWQgKEBweHJlZntTeW1ib2wgQXR0cmlidXRlc30pLgotCi1Zb3UgbWF5IEBjb2Rley5zZXR9IGEgc3ltYm9sIG1hbnkgdGltZXMgaW4gdGhlIHNhbWUgYXNzZW1ibHkuCi0KLUlmIHlvdSBAY29kZXsuc2V0fSBhIGdsb2JhbCBzeW1ib2wsIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIG9iamVjdAotZmlsZSBpcyB0aGUgbGFzdCB2YWx1ZSBzdG9yZWQgaW50byBpdC4KLQotQGlmc2V0IEhQUEEKLVRoZSBzeW50YXggZm9yIEBjb2Rle3NldH0gb24gdGhlIEhQUEEgaXMKLUBzYW1we0B2YXJ7c3ltYm9sfSAuc2V0IEB2YXJ7ZXhwcmVzc2lvbn19LgotQGVuZCBpZnNldAotCi1Abm9kZSBTaG9ydAotQHNlY3Rpb24gQGNvZGV7LnNob3J0IEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle3Nob3J0fSBkaXJlY3RpdmUKLUBpZnNldCBHRU5FUklDCi1AY29kZXsuc2hvcnR9IGlzIG5vcm1hbGx5IHRoZSBzYW1lIGFzIEBzYW1wey53b3JkfS4KLUB4cmVme1dvcmQsLEBjb2Rley53b3JkfX0uCi0KLUluIHNvbWUgY29uZmlndXJhdGlvbnMsIGhvd2V2ZXIsIEBjb2Rley5zaG9ydH0gYW5kIEBjb2Rley53b3JkfSBnZW5lcmF0ZQotbnVtYmVycyBvZiBkaWZmZXJlbnQgbGVuZ3RoczsgQHB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBXMTYKLUBjb2Rley5zaG9ydH0gaXMgdGhlIHNhbWUgYXMgQHNhbXB7LndvcmR9LiAgQHhyZWZ7V29yZCwsQGNvZGV7LndvcmR9fS4KLUBlbmQgaWZzZXQKLUBpZnNldCBXMzIKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgQHZhcntleHByZXNzaW9uc30sIGFuZCBlbWl0cwotYSAxNiBiaXQgbnVtYmVyIGZvciBlYWNoLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIFNpbmdsZQotQHNlY3Rpb24gQGNvZGV7LnNpbmdsZSBAdmFye2Zsb251bXN9fQotCi1AY2luZGV4IEBjb2Rle3NpbmdsZX0gZGlyZWN0aXZlCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKHNpbmdsZSkKLVRoaXMgZGlyZWN0aXZlIGFzc2VtYmxlcyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEl0Ci1oYXMgdGhlIHNhbWUgZWZmZWN0IGFzIEBjb2Rley5mbG9hdH0uCi1AaWZzZXQgR0VORVJJQwotVGhlIGV4YWN0IGtpbmQgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBlbWl0dGVkIGRlcGVuZHMgb24gaG93Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkLiAgQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IElFRUVGTE9BVAotT24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseSwgQGNvZGV7LnNpbmdsZX0gZW1pdHMgMzItYml0IGZsb2F0aW5nIHBvaW50Ci1udW1iZXJzIGluIEBzY3tpZWVlfSBmb3JtYXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQGlmc2V0IENPRkYKLUBub2RlIFNpemUKLUBzZWN0aW9uIEBjb2Rley5zaXplfQotCi1AY2luZGV4IEBjb2Rle3NpemV9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgaXMgZ2VuZXJhdGVkIGJ5IGNvbXBpbGVycyB0byBpbmNsdWRlIGF1eGlsaWFyeSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICBJdCBpcyBvbmx5IHBlcm1pdHRlZCBpbnNpZGUKLUBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpcnMuCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsuc2l6ZX0gaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gZ2VuZXJhdGluZyBDT0ZGIGZvcm1hdCBvdXRwdXQ7IHdoZW4KLUBjb2Rle0B2YWx1ZXtBU319IGlzIGdlbmVyYXRpbmcgQGNvZGV7Yi5vdXR9LCBpdCBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlIGJ1dAotaWdub3JlcyBpdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQG5vZGUgU2xlYjEyOAotQHNlY3Rpb24gQGNvZGV7LnNsZWIxMjggQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7c2xlYjEyOH0gZGlyZWN0aXZlCi1AdmFye3NsZWIxMjh9IHN0YW5kcyBmb3IgYGBzaWduZWQgbGl0dGxlIGVuZGlhbiBiYXNlIDEyOC4nJyAgVGhpcyBpcyBhIAotY29tcGFjdCwgdmFyaWFibGUgbGVuZ3RoIHJlcHJlc2VudGF0aW9uIG9mIG51bWJlcnMgdXNlZCBieSB0aGUgRFdBUkYKLXN5bWJvbGljIGRlYnVnZ2luZyBmb3JtYXQuICBAeHJlZntVbGViMTI4LEBjb2Rley51bGViMTI4fX0uCi0KLUBpZmNsZWFyIG5vLXNwYWNlLWRpcgotQG5vZGUgU2tpcAotQHNlY3Rpb24gQGNvZGV7LnNraXAgQHZhcntzaXplfSAsIEB2YXJ7ZmlsbH19Ci0KLUBjaW5kZXggQGNvZGV7c2tpcH0gZGlyZWN0aXZlCi1AY2luZGV4IGZpbGxpbmcgbWVtb3J5Ci1UaGlzIGRpcmVjdGl2ZSBlbWl0cyBAdmFye3NpemV9IGJ5dGVzLCBlYWNoIG9mIHZhbHVlIEB2YXJ7ZmlsbH0uICBCb3RoCi1AdmFye3NpemV9IGFuZCBAdmFye2ZpbGx9IGFyZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4gIElmIHRoZSBjb21tYSBhbmQKLUB2YXJ7ZmlsbH0gYXJlIG9taXR0ZWQsIEB2YXJ7ZmlsbH0gaXMgYXNzdW1lZCB0byBiZSB6ZXJvLiAgVGhpcyBpcyB0aGUgc2FtZSBhcwotQHNhbXB7LnNwYWNlfS4KLQotQG5vZGUgU3BhY2UKLUBzZWN0aW9uIEBjb2Rley5zcGFjZSBAdmFye3NpemV9ICwgQHZhcntmaWxsfX0KLQotQGNpbmRleCBAY29kZXtzcGFjZX0gZGlyZWN0aXZlCi1AY2luZGV4IGZpbGxpbmcgbWVtb3J5Ci1UaGlzIGRpcmVjdGl2ZSBlbWl0cyBAdmFye3NpemV9IGJ5dGVzLCBlYWNoIG9mIHZhbHVlIEB2YXJ7ZmlsbH0uICBCb3RoCi1AdmFye3NpemV9IGFuZCBAdmFye2ZpbGx9IGFyZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4gIElmIHRoZSBjb21tYQotYW5kIEB2YXJ7ZmlsbH0gYXJlIG9taXR0ZWQsIEB2YXJ7ZmlsbH0gaXMgYXNzdW1lZCB0byBiZSB6ZXJvLiAgVGhpcyBpcyB0aGUgc2FtZQotYXMgQHNhbXB7LnNraXB9LgotCi1AaWZzZXQgSFBQQQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IEBjb2Rley5zcGFjZX0gaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgbWVhbmluZyBmb3IgSFBQQQotdGFyZ2V0czsgdXNlIEBjb2Rley5ibG9ja30gYXMgYSBzdWJzdGl0dXRlLiAgU2VlIEBjaXRle0hQOTAwMCBTZXJpZXMgODAwCi1Bc3NlbWJseSBMYW5ndWFnZSBSZWZlcmVuY2UgTWFudWFsfSAoSFAgOTI0MzItOTAwMDEpIGZvciB0aGUgbWVhbmluZyBvZiB0aGUKLUBjb2Rley5zcGFjZX0gZGlyZWN0aXZlLiAgQHhyZWZ7SFBQQSBEaXJlY3RpdmVzLCxIUFBBIEFzc2VtYmxlciBEaXJlY3RpdmVzfSwKLWZvciBhIHN1bW1hcnkuCi1AZW5kIHF1b3RhdGlvbgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBpZnNldCBBMjlLCi1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBTcGFjZQotQHNlY3Rpb24gQGNvZGV7LnNwYWNlfQotQGNpbmRleCBAY29kZXtzcGFjZX0gZGlyZWN0aXZlCi1AZW5kIGlmY2xlYXIKLU9uIHRoZSBBTUQgMjlLLCB0aGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkOyBpdCBpcyBhY2NlcHRlZCBmb3IKLWNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBBTUQgMjlLIGFzc2VtYmxlcnMuCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBJbiBtb3N0IHZlcnNpb25zIG9mIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIsIHRoZSBkaXJlY3RpdmUKLUBjb2Rley5zcGFjZX0gaGFzIHRoZSBlZmZlY3Qgb2YgQGNvZGV7LmJsb2NrfSAgQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBxdW90YXRpb24KLUBlbmQgaWZzZXQKLQotQGlmc2V0IGhhdmUtc3RhYnMKLUBub2RlIFN0YWIKLUBzZWN0aW9uIEBjb2Rley5zdGFiZCwgLnN0YWJuLCAuc3RhYnN9Ci0KLUBjaW5kZXggc3ltYm9saWMgZGVidWdnZXJzLCBpbmZvcm1hdGlvbiBmb3IKLUBjaW5kZXggQGNvZGV7c3RhYkB2YXJ7eH19IGRpcmVjdGl2ZXMKLVRoZXJlIGFyZSB0aHJlZSBkaXJlY3RpdmVzIHRoYXQgYmVnaW4gQHNhbXB7LnN0YWJ9LgotQWxsIGVtaXQgc3ltYm9scyAoQHB4cmVme1N5bWJvbHN9KSwgZm9yIHVzZSBieSBzeW1ib2xpYyBkZWJ1Z2dlcnMuCi1UaGUgc3ltYm9scyBhcmUgbm90IGVudGVyZWQgaW4gdGhlIEBjb2Rle0B2YWx1ZXtBU319IGhhc2ggdGFibGU6IHRoZXkKLWNhbm5vdCBiZSByZWZlcmVuY2VkIGVsc2V3aGVyZSBpbiB0aGUgc291cmNlIGZpbGUuCi1VcCB0byBmaXZlIGZpZWxkcyBhcmUgcmVxdWlyZWQ6Ci0KLUB0YWJsZSBAdmFyCi1AaXRlbSBzdHJpbmcKLVRoaXMgaXMgdGhlIHN5bWJvbCdzIG5hbWUuICBJdCBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVyIGV4Y2VwdAotQHNhbXB7XDAwMH0sIHNvIGlzIG1vcmUgZ2VuZXJhbCB0aGFuIG9yZGluYXJ5IHN5bWJvbCBuYW1lcy4gIFNvbWUKLWRlYnVnZ2VycyB1c2VkIHRvIGNvZGUgYXJiaXRyYXJpbHkgY29tcGxleCBzdHJ1Y3R1cmVzIGludG8gc3ltYm9sIG5hbWVzCi11c2luZyB0aGlzIGZpZWxkLgotCi1AaXRlbSB0eXBlCi1BbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgVGhlIHN5bWJvbCdzIHR5cGUgaXMgc2V0IHRvIHRoZSBsb3cgOCBiaXRzIG9mCi10aGlzIGV4cHJlc3Npb24uICBBbnkgYml0IHBhdHRlcm4gaXMgcGVybWl0dGVkLCBidXQgQGNvZGV7QHZhbHVle0xEfX0KLWFuZCBkZWJ1Z2dlcnMgY2hva2Ugb24gc2lsbHkgYml0IHBhdHRlcm5zLgotCi1AaXRlbSBvdGhlcgotQW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFRoZSBzeW1ib2wncyBgYG90aGVyJycgYXR0cmlidXRlIGlzIHNldCB0byB0aGUKLWxvdyA4IGJpdHMgb2YgdGhpcyBleHByZXNzaW9uLgotCi1AaXRlbSBkZXNjCi1BbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgVGhlIHN5bWJvbCdzIGRlc2NyaXB0b3IgaXMgc2V0IHRvIHRoZSBsb3cgMTYKLWJpdHMgb2YgdGhpcyBleHByZXNzaW9uLgotCi1AaXRlbSB2YWx1ZQotQW4gYWJzb2x1dGUgZXhwcmVzc2lvbiB3aGljaCBiZWNvbWVzIHRoZSBzeW1ib2wncyB2YWx1ZS4KLUBlbmQgdGFibGUKLQotSWYgYSB3YXJuaW5nIGlzIGRldGVjdGVkIHdoaWxlIHJlYWRpbmcgYSBAY29kZXsuc3RhYmR9LCBAY29kZXsuc3RhYm59LAotb3IgQGNvZGV7LnN0YWJzfSBzdGF0ZW1lbnQsIHRoZSBzeW1ib2wgaGFzIHByb2JhYmx5IGFscmVhZHkgYmVlbiBjcmVhdGVkOwoteW91IGdldCBhIGhhbGYtZm9ybWVkIHN5bWJvbCBpbiB5b3VyIG9iamVjdCBmaWxlLiAgVGhpcyBpcwotY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIgYXNzZW1ibGVycyEKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle3N0YWJkfSBkaXJlY3RpdmUKLUBpdGVtIC5zdGFiZCBAdmFye3R5cGV9ICwgQHZhcntvdGhlcn0gLCBAdmFye2Rlc2N9Ci0KLVRoZSBgYG5hbWUnJyBvZiB0aGUgc3ltYm9sIGdlbmVyYXRlZCBpcyBub3QgZXZlbiBhbiBlbXB0eSBzdHJpbmcuCi1JdCBpcyBhIG51bGwgcG9pbnRlciwgZm9yIGNvbXBhdGliaWxpdHkuICBPbGRlciBhc3NlbWJsZXJzIHVzZWQgYQotbnVsbCBwb2ludGVyIHNvIHRoZXkgZGlkbid0IHdhc3RlIHNwYWNlIGluIG9iamVjdCBmaWxlcyB3aXRoIGVtcHR5Ci1zdHJpbmdzLgotCi1UaGUgc3ltYm9sJ3MgdmFsdWUgaXMgc2V0IHRvIHRoZSBsb2NhdGlvbiBjb3VudGVyLAotcmVsb2NhdGFibHkuICBXaGVuIHlvdXIgcHJvZ3JhbSBpcyBsaW5rZWQsIHRoZSB2YWx1ZSBvZiB0aGlzIHN5bWJvbAotaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgd2hlbiB0aGUgQGNvZGV7LnN0YWJkfSB3YXMKLWFzc2VtYmxlZC4KLQotQGNpbmRleCBAY29kZXtzdGFibn0gZGlyZWN0aXZlCi1AaXRlbSAuc3RhYm4gQHZhcnt0eXBlfSAsIEB2YXJ7b3RoZXJ9ICwgQHZhcntkZXNjfSAsIEB2YXJ7dmFsdWV9Ci1UaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGlzIHNldCB0byB0aGUgZW1wdHkgc3RyaW5nIEBjb2RleyIifS4KLQotQGNpbmRleCBAY29kZXtzdGFic30gZGlyZWN0aXZlCi1AaXRlbSAuc3RhYnMgQHZhcntzdHJpbmd9ICwgIEB2YXJ7dHlwZX0gLCBAdmFye290aGVyfSAsIEB2YXJ7ZGVzY30gLCBAdmFye3ZhbHVlfQotQWxsIGZpdmUgZmllbGRzIGFyZSBzcGVjaWZpZWQuCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci1AYyBlbmQgICAgIGhhdmUtc3RhYnMKLQotQG5vZGUgU3RyaW5nCi1Ac2VjdGlvbiBAY29kZXsuc3RyaW5nfSAiQHZhcntzdHJ9IgotCi1AY2luZGV4IHN0cmluZywgY29weWluZyB0byBvYmplY3QgZmlsZQotQGNpbmRleCBAY29kZXtzdHJpbmd9IGRpcmVjdGl2ZQotCi1Db3B5IHRoZSBjaGFyYWN0ZXJzIGluIEB2YXJ7c3RyfSB0byB0aGUgb2JqZWN0IGZpbGUuICBZb3UgbWF5IHNwZWNpZnkgbW9yZSB0aGFuCi1vbmUgc3RyaW5nIHRvIGNvcHksIHNlcGFyYXRlZCBieSBjb21tYXMuICBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBmb3IgYQotcGFydGljdWxhciBtYWNoaW5lLCB0aGUgYXNzZW1ibGVyIG1hcmtzIHRoZSBlbmQgb2YgZWFjaCBzdHJpbmcgd2l0aCBhIDAgYnl0ZS4KLVlvdSBjYW4gdXNlIGFueSBvZiB0aGUgZXNjYXBlIHNlcXVlbmNlcyBkZXNjcmliZWQgaW4gQHJlZntTdHJpbmdzLCxTdHJpbmdzfS4KLQotQG5vZGUgU3RydWN0Ci1Ac2VjdGlvbiBAY29kZXsuc3RydWN0IEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7c3RydWN0fSBkaXJlY3RpdmUKLVN3aXRjaCB0byB0aGUgYWJzb2x1dGUgc2VjdGlvbiwgYW5kIHNldCB0aGUgc2VjdGlvbiBvZmZzZXQgdG8gQHZhcntleHByZXNzaW9ufSwKLXdoaWNoIG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFlvdSBtaWdodCB1c2UgdGhpcyBhcyBmb2xsb3dzOgotQHNtYWxsZXhhbXBsZQotICAgICAgICAuc3RydWN0IDAKLWZpZWxkMToKLSAgICAgICAgLnN0cnVjdCBmaWVsZDEgKyA0Ci1maWVsZDI6Ci0gICAgICAgIC5zdHJ1Y3QgZmllbGQyICsgNAotZmllbGQzOgotQGVuZCBzbWFsbGV4YW1wbGUKLVRoaXMgd291bGQgZGVmaW5lIHRoZSBzeW1ib2wgQGNvZGV7ZmllbGQxfSB0byBoYXZlIHRoZSB2YWx1ZSAwLCB0aGUgc3ltYm9sCi1AY29kZXtmaWVsZDJ9IHRvIGhhdmUgdGhlIHZhbHVlIDQsIGFuZCB0aGUgc3ltYm9sIEBjb2Rle2ZpZWxkM30gdG8gaGF2ZSB0aGUKLXZhbHVlIDguICBBc3NlbWJseSB3b3VsZCBiZSBsZWZ0IGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLCBhbmQgeW91IHdvdWxkIG5lZWQgdG8KLXVzZSBhIEBjb2Rley5zZWN0aW9ufSBkaXJlY3RpdmUgb2Ygc29tZSBzb3J0IHRvIGNoYW5nZSB0byBzb21lIG90aGVyIHNlY3Rpb24KLWJlZm9yZSBmdXJ0aGVyIGFzc2VtYmx5LgotCi1AaWZzZXQgRUxGCi1Abm9kZSBTeW12ZXIKLUBzZWN0aW9uIEBjb2Rley5zeW12ZXJ9Ci1AY2luZGV4IEBjb2Rle3N5bXZlcn0gZGlyZWN0aXZlCi1AY2luZGV4IHN5bWJvbCB2ZXJzaW9uaW5nCi1AY2luZGV4IHZlcnNpb25zIG9mIHN5bWJvbHMKLVVzZSB0aGUgQGNvZGV7LnN5bXZlcn0gZGlyZWN0aXZlIHRvIGJpbmQgc3ltYm9scyB0byBzcGVjaWZpYyB2ZXJzaW9uIG5vZGVzCi13aXRoaW4gYSBzb3VyY2UgZmlsZS4gIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgb24gRUxGIHBsYXRmb3JtcywgYW5kIGlzCi10eXBpY2FsbHkgdXNlZCB3aGVuIGFzc2VtYmxpbmcgZmlsZXMgdG8gYmUgbGlua2VkIGludG8gYSBzaGFyZWQgbGlicmFyeS4KLVRoZXJlIGFyZSBjYXNlcyB3aGVyZSBpdCBtYXkgbWFrZSBzZW5zZSB0byB1c2UgdGhpcyBpbiBvYmplY3RzIHRvIGJlIGJvdW5kCi1pbnRvIGFuIGFwcGxpY2F0aW9uIGl0c2VsZiBzbyBhcyB0byBvdmVycmlkZSBhIHZlcnNpb25lZCBzeW1ib2wgZnJvbSBhCi1zaGFyZWQgbGlicmFyeS4KLQotRm9yIEVMRiB0YXJnZXRzLCB0aGUgQGNvZGV7LnN5bXZlcn0gZGlyZWN0aXZlIGlzIHVzZWQgbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotLnN5bXZlciBAdmFye25hbWV9LCBAdmFye25hbWUyQEBub2RlbmFtZX0KLUBlbmQgc21hbGxleGFtcGxlCi1JbiB0aGlzIGNhc2UsIHRoZSBzeW1ib2wgQHZhcntuYW1lfSBtdXN0IGV4aXN0IGFuZCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZmlsZQotYmVpbmcgYXNzZW1ibGVkLiAgVGhlIEBjb2Rley52ZXJzeW19IGRpcmVjdGl2ZSBlZmZlY3RpdmVseSBjcmVhdGVzIGEgc3ltYm9sCi1hbGlhcyB3aXRoIHRoZSBuYW1lIEB2YXJ7bmFtZTJAQG5vZGVuYW1lfSwgYW5kIGluIGZhY3QgdGhlIG1haW4gcmVhc29uIHRoYXQgd2UKLWp1c3QgZG9uJ3QgdHJ5IGFuZCBjcmVhdGUgYSByZWd1bGFyIGFsaWFzIGlzIHRoYXQgdGhlIEB2YXJ7QEB9IGNoYXJhY3RlciBpc24ndAotcGVybWl0dGVkIGluIHN5bWJvbCBuYW1lcy4gIFRoZSBAdmFye25hbWUyfSBwYXJ0IG9mIHRoZSBuYW1lIGlzIHRoZSBhY3R1YWwgbmFtZQotb2YgdGhlIHN5bWJvbCBieSB3aGljaCBpdCB3aWxsIGJlIGV4dGVybmFsbHkgcmVmZXJlbmNlZC4gIFRoZSBuYW1lIEB2YXJ7bmFtZX0KLWl0c2VsZiBpcyBtZXJlbHkgYSBuYW1lIG9mIGNvbnZlbmllbmNlIHRoYXQgaXMgdXNlZCBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvCi1oYXZlIGRlZmluaXRpb25zIGZvciBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBhIGZ1bmN0aW9uIHdpdGhpbiBhIHNpbmdsZSBzb3VyY2UKLWZpbGUsIGFuZCBzbyB0aGF0IHRoZSBjb21waWxlciBjYW4gdW5hbWJpZ3VvdXNseSBrbm93IHdoaWNoIHZlcnNpb24gb2YgYQotZnVuY3Rpb24gaXMgYmVpbmcgbWVudGlvbmVkLiAgVGhlIEB2YXJ7bm9kZW5hbWV9IHBvcnRpb24gb2YgdGhlIGFsaWFzIHNob3VsZCBiZQotdGhlIG5hbWUgb2YgYSBub2RlIHNwZWNpZmllZCBpbiB0aGUgdmVyc2lvbiBzY3JpcHQgc3VwcGxpZWQgdG8gdGhlIGxpbmtlciB3aGVuCi1idWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgSWYgeW91IGFyZSBhdHRlbXB0aW5nIHRvIG92ZXJyaWRlIGEgdmVyc2lvbmVkCi1zeW1ib2wgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIEB2YXJ7bm9kZW5hbWV9IHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZQotbm9kZW5hbWUgb2YgdGhlIHN5bWJvbCB5b3UgYXJlIHRyeWluZyB0byBvdmVycmlkZS4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IENPRkYKLUBub2RlIFRhZwotQHNlY3Rpb24gQGNvZGV7LnRhZyBAdmFye3N0cnVjdG5hbWV9fQotCi1AY2luZGV4IENPRkYgc3RydWN0dXJlIGRlYnVnZ2luZwotQGNpbmRleCBzdHJ1Y3R1cmUgZGVidWdnaW5nLCBDT0ZGCi1AY2luZGV4IEBjb2Rle3RhZ30gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSBpcyBnZW5lcmF0ZWQgYnkgY29tcGlsZXJzIHRvIGluY2x1ZGUgYXV4aWxpYXJ5IGRlYnVnZ2luZwotaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEl0IGlzIG9ubHkgcGVybWl0dGVkIGluc2lkZQotQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycy4gIFRhZ3MgYXJlIHVzZWQgdG8gbGluayBzdHJ1Y3R1cmUKLWRlZmluaXRpb25zIGluIHRoZSBzeW1ib2wgdGFibGUgd2l0aCBpbnN0YW5jZXMgb2YgdGhvc2Ugc3RydWN0dXJlcy4KLUBpZnNldCBCT1VUCi0KLUBzYW1wey50YWd9IGlzIG9ubHkgdXNlZCB3aGVuIGdlbmVyYXRpbmcgQ09GRiBmb3JtYXQgb3V0cHV0OyB3aGVuCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBnZW5lcmF0aW5nIEBjb2Rle2Iub3V0fSwgaXQgYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBidXQKLWlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFRleHQKLUBzZWN0aW9uIEBjb2Rley50ZXh0IEB2YXJ7c3Vic2VjdGlvbn19Ci0KLUBjaW5kZXggQGNvZGV7dGV4dH0gZGlyZWN0aXZlCi1UZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0byBhc3NlbWJsZSB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHMgb250byB0aGUgZW5kIG9mCi10aGUgdGV4dCBzdWJzZWN0aW9uIG51bWJlcmVkIEB2YXJ7c3Vic2VjdGlvbn0sIHdoaWNoIGlzIGFuIGFic29sdXRlCi1leHByZXNzaW9uLiAgSWYgQHZhcntzdWJzZWN0aW9ufSBpcyBvbWl0dGVkLCBzdWJzZWN0aW9uIG51bWJlciB6ZXJvCi1pcyB1c2VkLgotCi1Abm9kZSBUaXRsZQotQHNlY3Rpb24gQGNvZGV7LnRpdGxlICJAdmFye2hlYWRpbmd9In0KLQotQGNpbmRleCBAY29kZXt0aXRsZX0gZGlyZWN0aXZlCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbDogdGl0bGUgbGluZQotVXNlIEB2YXJ7aGVhZGluZ30gYXMgdGhlIHRpdGxlIChzZWNvbmQgbGluZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCi1zb3VyY2UgZmlsZSBuYW1lIGFuZCBwYWdlbnVtYmVyKSB3aGVuIGdlbmVyYXRpbmcgYXNzZW1ibHkgbGlzdGluZ3MuCi0KLVRoaXMgZGlyZWN0aXZlIGFmZmVjdHMgc3Vic2VxdWVudCBwYWdlcywgYXMgd2VsbCBhcyB0aGUgY3VycmVudCBwYWdlIGlmCi1pdCBhcHBlYXJzIHdpdGhpbiB0ZW4gbGluZXMgb2YgdGhlIHRvcCBvZiBhIHBhZ2UuCi0KLUBpZnNldCBDT0ZGCi1Abm9kZSBUeXBlCi1Ac2VjdGlvbiBAY29kZXsudHlwZSBAdmFye2ludH19Ci0KLUBjaW5kZXggQ09GRiBzeW1ib2wgdHlwZQotQGNpbmRleCBzeW1ib2wgdHlwZSwgQ09GRgotQGNpbmRleCBAY29kZXt0eXBlfSBkaXJlY3RpdmUKLVRoaXMgZGlyZWN0aXZlLCBwZXJtaXR0ZWQgb25seSB3aXRoaW4gQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycywKLXJlY29yZHMgdGhlIGludGVnZXIgQHZhcntpbnR9IGFzIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KLUBpZnNldCBCT1VUCi0KLUBzYW1wey50eXBlfSBpcyBhc3NvY2lhdGVkIG9ubHkgd2l0aCBDT0ZGIGZvcm1hdCBvdXRwdXQ7IHdoZW4KLUBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yIEBjb2Rle2Iub3V0fSBvdXRwdXQsIGl0IGFjY2VwdHMgdGhpcwotZGlyZWN0aXZlIGJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1AaWZzZXQgQ09GRgotQG5vZGUgVmFsCi1Ac2VjdGlvbiBAY29kZXsudmFsIEB2YXJ7YWRkcn19Ci0KLUBjaW5kZXggQGNvZGV7dmFsfSBkaXJlY3RpdmUKLUBjaW5kZXggQ09GRiB2YWx1ZSBhdHRyaWJ1dGUKLUBjaW5kZXggdmFsdWUgYXR0cmlidXRlLCBDT0ZGCi1UaGlzIGRpcmVjdGl2ZSwgcGVybWl0dGVkIG9ubHkgd2l0aGluIEBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpcnMsCi1yZWNvcmRzIHRoZSBhZGRyZXNzIEB2YXJ7YWRkcn0gYXMgdGhlIHZhbHVlIGF0dHJpYnV0ZSBvZiBhIHN5bWJvbCB0YWJsZQotZW50cnkuCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsudmFsfSBpcyB1c2VkIG9ubHkgZm9yIENPRkYgb3V0cHV0OyB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzCi1jb25maWd1cmVkIGZvciBAY29kZXtiLm91dH0sIGl0IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYnV0IGlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFVsZWIxMjgKLUBzZWN0aW9uIEBjb2Rley51bGViMTI4IEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle3VsZWIxMjh9IGRpcmVjdGl2ZQotQHZhcnt1bGViMTI4fSBzdGFuZHMgZm9yIGBgdW5zaWduZWQgbGl0dGxlIGVuZGlhbiBiYXNlIDEyOC4nJyAgVGhpcyBpcyBhIAotY29tcGFjdCwgdmFyaWFibGUgbGVuZ3RoIHJlcHJlc2VudGF0aW9uIG9mIG51bWJlcnMgdXNlZCBieSB0aGUgRFdBUkYKLXN5bWJvbGljIGRlYnVnZ2luZyBmb3JtYXQuICBAeHJlZntTbGViMTI4LEBjb2Rley5zbGViMTI4fX0uCi0KLUBub2RlIFdvcmQKLUBzZWN0aW9uIEBjb2Rley53b3JkIEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle3dvcmR9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgQHZhcntleHByZXNzaW9uc30sIG9mIGFueSBzZWN0aW9uLAotc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBXMzIKLUZvciBlYWNoIGV4cHJlc3Npb24sIEBjb2Rle0B2YWx1ZXtBU319IGVtaXRzIGEgMzItYml0IG51bWJlci4KLUBlbmQgaWZzZXQKLUBpZnNldCBXMTYKLUZvciBlYWNoIGV4cHJlc3Npb24sIEBjb2Rle0B2YWx1ZXtBU319IGVtaXRzIGEgMTYtYml0IG51bWJlci4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotQGlmc2V0IEdFTkVSSUMKLQotVGhlIHNpemUgb2YgdGhlIG51bWJlciBlbWl0dGVkLCBhbmQgaXRzIGJ5dGUgb3JkZXIsCi1kZXBlbmQgb24gd2hhdCB0YXJnZXQgY29tcHV0ZXIgdGhlIGFzc2VtYmx5IGlzIGZvci4KLUBlbmQgaWZzZXQKLQotQGMgb24gYW1kMjlrLCBpOTYwLCBzcGFyYyB0aGUgInNwZWNpYWwgdHJlYXRtZW50IHRvIHN1cHBvcnQgY29tcGlsZXJzIiBkb2Vzbid0Ci1AYyBoYXBwZW4tLS0zMi1iaXQgYWRkcmVzc2FiaWxpdHksIHBlcmlvZDsgbm8gbG9uZy9zaG9ydCBqdW1wcy4KLUBpZnNldCBESUZGLVRCTC1LTFVHRQotQGNpbmRleCBkaWZmZXJlbmNlIHRhYmxlcyBhbHRlcmVkCi1AY2luZGV4IGFsdGVyZWQgZGlmZmVyZW5jZSB0YWJsZXMKLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6IFNwZWNpYWwgVHJlYXRtZW50IHRvIHN1cHBvcnQgQ29tcGlsZXJzfQotQGVuZCBxdW90YXRpb24KLQotQGlmc2V0IEdFTkVSSUMKLU1hY2hpbmVzIHdpdGggYSAzMi1iaXQgYWRkcmVzcyBzcGFjZSwgYnV0IHRoYXQgZG8gbGVzcyB0aGFuIDMyLWJpdAotYWRkcmVzc2luZywgcmVxdWlyZSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgdHJlYXRtZW50LiAgSWYgdGhlIG1hY2hpbmUgb2YKLWludGVyZXN0IHRvIHlvdSBkb2VzIDMyLWJpdCBhZGRyZXNzaW5nIChvciBkb2Vzbid0IHJlcXVpcmUgaXQ7Ci1AcHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9KSwgeW91IGNhbiBpZ25vcmUgdGhpcyBpc3N1ZS4KLQotQGVuZCBpZnNldAotSW4gb3JkZXIgdG8gYXNzZW1ibGUgY29tcGlsZXIgb3V0cHV0IGludG8gc29tZXRoaW5nIHRoYXQgd29ya3MsCi1AY29kZXtAdmFsdWV7QVN9fSBvY2Nhc2lvbmxseSBkb2VzIHN0cmFuZ2UgdGhpbmdzIHRvIEBzYW1wey53b3JkfSBkaXJlY3RpdmVzLgotRGlyZWN0aXZlcyBvZiB0aGUgZm9ybSBAc2FtcHsud29yZCBzeW0xLXN5bTJ9IGFyZSBvZnRlbiBlbWl0dGVkIGJ5Ci1jb21waWxlcnMgYXMgcGFydCBvZiBqdW1wIHRhYmxlcy4gIFRoZXJlZm9yZSwgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBhc3NlbWJsZXMgYQotZGlyZWN0aXZlIG9mIHRoZSBmb3JtIEBzYW1wey53b3JkIHN5bTEtc3ltMn0sIGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi1AY29kZXtzeW0xfSBhbmQgQGNvZGV7c3ltMn0gZG9lcyBub3QgZml0IGluIDE2IGJpdHMsIEBjb2Rle0B2YWx1ZXtBU319Ci1jcmVhdGVzIGEgQGRmbntzZWNvbmRhcnkganVtcCB0YWJsZX0sIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgbmV4dCBsYWJlbC4KLVRoaXMgc2Vjb25kYXJ5IGp1bXAgdGFibGUgaXMgcHJlY2VkZWQgYnkgYSBzaG9ydC1qdW1wIHRvIHRoZQotZmlyc3QgYnl0ZSBhZnRlciB0aGUgc2Vjb25kYXJ5IHRhYmxlLiAgVGhpcyBzaG9ydC1qdW1wIHByZXZlbnRzIHRoZSBmbG93Ci1vZiBjb250cm9sIGZyb20gYWNjaWRlbnRhbGx5IGZhbGxpbmcgaW50byB0aGUgbmV3IHRhYmxlLiAgSW5zaWRlIHRoZQotdGFibGUgaXMgYSBsb25nLWp1bXAgdG8gQGNvZGV7c3ltMn0uICBUaGUgb3JpZ2luYWwgQHNhbXB7LndvcmR9Ci1jb250YWlucyBAY29kZXtzeW0xfSBtaW51cyB0aGUgYWRkcmVzcyBvZiB0aGUgbG9uZy1qdW1wIHRvCi1AY29kZXtzeW0yfS4KLQotSWYgdGhlcmUgd2VyZSBzZXZlcmFsIG9jY3VycmVuY2VzIG9mIEBzYW1wey53b3JkIHN5bTEtc3ltMn0gYmVmb3JlIHRoZQotc2Vjb25kYXJ5IGp1bXAgdGFibGUsIGFsbCBvZiB0aGVtIGFyZSBhZGp1c3RlZC4gIElmIHRoZXJlIHdhcyBhCi1Ac2FtcHsud29yZCBzeW0zLXN5bTR9LCB0aGF0IGFsc28gZGlkIG5vdCBmaXQgaW4gc2l4dGVlbiBiaXRzLCBhCi1sb25nLWp1bXAgdG8gQGNvZGV7c3ltNH0gaXMgaW5jbHVkZWQgaW4gdGhlIHNlY29uZGFyeSBqdW1wIHRhYmxlLAotYW5kIHRoZSBAY29kZXsud29yZH0gZGlyZWN0aXZlcyBhcmUgYWRqdXN0ZWQgdG8gY29udGFpbiBAY29kZXtzeW0zfQotbWludXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvbmctanVtcCB0byBAY29kZXtzeW00fTsgYW5kIHNvIG9uLCBmb3IgYXMgbWFueQotZW50cmllcyBpbiB0aGUgb3JpZ2luYWwganVtcCB0YWJsZSBhcyBuZWNlc3NhcnkuCi0KLUBpZnNldCBJTlRFUk5BTFMKLUBlbXBoe1RoaXMgZmVhdHVyZSBtYXkgYmUgZGlzYWJsZWQgYnkgY29tcGlsaW5nIEBjb2Rle0B2YWx1ZXtBU319IHdpdGggdGhlCi1Ac2FtcHstRFdPUktJTkdfRE9UX1dPUkR9IG9wdGlvbi59IFRoaXMgZmVhdHVyZSBpcyBsaWtlbHkgdG8gY29uZnVzZQotYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbW1lcnMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci1AYyBlbmQgICAgIERJRkYtVEJMLUtMVUdFCi0KLUBub2RlIERlcHJlY2F0ZWQKLUBzZWN0aW9uIERlcHJlY2F0ZWQgRGlyZWN0aXZlcwotCi1AY2luZGV4IGRlcHJlY2F0ZWQgZGlyZWN0aXZlcwotQGNpbmRleCBvYnNvbGVzY2VudCBkaXJlY3RpdmVzCi1PbmUgZGF5IHRoZXNlIGRpcmVjdGl2ZXMgd29uJ3Qgd29yay4KLVRoZXkgYXJlIGluY2x1ZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgYXNzZW1ibGVycy4KLUB0YWJsZSBAdAotQGl0ZW0gLmFib3J0Ci1AaXRlbSAubGluZQotQGVuZCB0YWJsZQotCi1AaWZzZXQgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIE1hY2hpbmUgRGVwZW5kZW50IEZlYXR1cmVzCi0KLUBjaW5kZXggbWFjaGluZSBkZXBlbmRlbmNpZXMKLVRoZSBtYWNoaW5lIGluc3RydWN0aW9uIHNldHMgYXJlIChhbG1vc3QgYnkgZGVmaW5pdGlvbikgZGlmZmVyZW50IG9uCi1lYWNoIG1hY2hpbmUgd2hlcmUgQGNvZGV7QHZhbHVle0FTfX0gcnVucy4gIEZsb2F0aW5nIHBvaW50IHJlcHJlc2VudGF0aW9ucwotdmFyeSBhcyB3ZWxsLCBhbmQgQGNvZGV7QHZhbHVle0FTfX0gb2Z0ZW4gc3VwcG9ydHMgYSBmZXcgYWRkaXRpb25hbAotZGlyZWN0aXZlcyBvciBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi1hc3NlbWJsZXJzIG9uIGEgcGFydGljdWxhciBwbGF0Zm9ybS4gIEZpbmFsbHksIHNvbWUgdmVyc2lvbnMgb2YKLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnQgc3BlY2lhbCBwc2V1ZG8taW5zdHJ1Y3Rpb25zIGZvciBicmFuY2gKLW9wdGltaXphdGlvbi4KLQotVGhpcyBjaGFwdGVyIGRpc2N1c3NlcyBtb3N0IG9mIHRoZXNlIGRpZmZlcmVuY2VzLCB0aG91Z2ggaXQgZG9lcyBub3QKLWluY2x1ZGUgZGV0YWlscyBvbiBhbnkgbWFjaGluZSdzIGluc3RydWN0aW9uIHNldC4gIEZvciBkZXRhaWxzIG9uIHRoYXQKLXN1YmplY3QsIHNlZSB0aGUgaGFyZHdhcmUgbWFudWZhY3R1cmVyJ3MgbWFudWFsLgotCi1AbWVudQotQGlmc2V0IEEyOUsKLSogQU1EMjlLLURlcGVuZGVudDo6ICAgICAgICAgICAgQU1EIDI5SyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBBUkMKLSogQVJDLURlcGVuZGVudDo6ICAgICAgICAgICAgICAgQVJDIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEFSTQotKiBBUk0tRGVwZW5kZW50OjogICAgICAgICAgICAgICBBUk0gRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgRDEwVgotKiBEMTBWLURlcGVuZGVudDo6ICAgICAgICAgICAgICBEMTBWIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEQzMFYKLSogRDMwVi1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgRDMwViBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBIOC8zMDAKLSogSDgvMzAwLURlcGVuZGVudDo6ICAgICAgICAgICAgSGl0YWNoaSBIOC8zMDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgvNTAwCi0qIEg4LzUwMC1EZXBlbmRlbnQ6OiAgICAgICAgICAgIEhpdGFjaGkgSDgvNTAwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLSogSFBQQS1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgSFBQQSBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBJODAzODYKLSogaTM4Ni1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgSW50ZWwgODAzODYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotKiBpOTYwLURlcGVuZGVudDo6ICAgICAgICAgICAgICBJbnRlbCA4MDk2MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBNNjgwWDAKLSogTTY4Sy1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgTTY4MHgwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IE1JUFMKLSogTUlQUy1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgTUlQUyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBTSAotKiBTSC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgICBIaXRhY2hpIFNIIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IFBKCi0qIFBKLURlcGVuZGVudDo6ICAgICAgICAgICAgICAgIHBpY29KYXZhIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IFNQQVJDCi0qIFNwYXJjLURlcGVuZGVudDo6ICAgICAgICAgICAgIFNQQVJDIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IFY4NTAKLSogVjg1MC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgVjg1MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBaODAwMAotKiBaODAwMC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICBaODAwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBWQVgKLSogVmF4LURlcGVuZGVudDo6ICAgICAgICAgICAgICAgVkFYIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGVuZCBtZW51Ci0KLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmc2V0Ci0KLUBjIFRoZSBmb2xsb3dpbmcgbWFqb3Igbm9kZXMgYXJlICpzZWN0aW9ucyogaW4gdGhlIEdFTkVSSUMgdmVyc2lvbiwgKmNoYXB0ZXJzKgotQGMgaW4gc2luZ2xlLWNwdSB2ZXJzaW9ucy4gIFRoaXMgaXMgbWFpbmx5IGFjaGlldmVkIGJ5IEBsb3dlcnNlY3Rpb25zLiAgVGhlcmUgaXMgYQotQGMgcGVjdWxpYXJpdHk6IHRvIHByZXNlcnZlIGNyb3NzLXJlZmVyZW5jZXMsIHRoZXJlIG11c3QgYmUgYSBub2RlIGNhbGxlZAotQGMgIk1hY2hpbmUgRGVwZW5kZW5jaWVzIi4gIEhlbmNlIHRoZSBjb25kaXRpb25hbCBub2RlbmFtZXMgaW4gZWFjaAotQGMgbWFqb3Igbm9kZSBiZWxvdy4gIE5vZGUgZGVmYXVsdGluZyBpbiBtYWtlaW5mbyByZXF1aXJlcyBhZGphY2VuY3kgb2YKLUBjIG5vZGUgYW5kIHNlY3Rpb25pbmcgY29tbWFuZHM7IGhlbmNlIHRoZSByZXBldGl0aW9uIG9mIEBjaGFwdGVyIEJMQUgKLUBjIGluIGJvdGggY29uZGl0aW9uYWwgYmxvY2tzLgotCi1AaWZzZXQgQVJDCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIEFSQy1EZXBlbmRlbnQKLUBjaGFwdGVyIEFSQyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBBUkMgc3VwcG9ydAotQG1lbnUKLSogQVJDLU9wdHM6OiAgICAgICAgICAgICAgICAgICAgT3B0aW9ucwotKiBBUkMtRmxvYXQ6OiAgICAgICAgICAgICAgICAgICBGbG9hdGluZyBQb2ludAotKiBBUkMtRGlyZWN0aXZlczo6ICAgICAgICAgICAgICBTcGFyYyBNYWNoaW5lIERpcmVjdGl2ZXMKLUBlbmQgbWVudQotCi1Abm9kZSBBUkMtT3B0cwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IG9wdGlvbnMgZm9yIEFSQwotQGNpbmRleCBBUkMgb3B0aW9ucwotQGNpbmRleCBhcmNoaXRlY3R1cmVzLCBBUkMKLUBjaW5kZXggQVJDIGFyY2hpdGVjdHVyZXMKLVRoZSBBUkMgY2hpcCBmYW1pbHkgaW5jbHVkZXMgc2V2ZXJhbCBzdWNjZXNzaXZlIGxldmVscyAob3Igb3RoZXIKLXZhcmlhbnRzKSBvZiBjaGlwLCB1c2luZyB0aGUgc2FtZSBjb3JlIGluc3RydWN0aW9uIHNldCwgYnV0IGluY2x1ZGluZwotYSBmZXcgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgYXQgZWFjaCBsZXZlbC4KLQotQnkgZGVmYXVsdCwgQGNvZGV7QHZhbHVle0FTfX0gYXNzdW1lcyB0aGUgY29yZSBpbnN0cnVjdGlvbiBzZXQgKEFSQwotYmFzZSkuICBUaGUgQGNvZGV7LmNwdX0gcHNldWRvLW9wIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gc2VsZWN0Ci10aGUgdmFyaWFudC4KLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rley1tYmlnLWVuZGlhbn0gb3B0aW9uIChBUkMpCi1AY2luZGV4IEBjb2Rley1tbGl0dGxlLWVuZGlhbn0gb3B0aW9uIChBUkMpCi1AY2luZGV4IEFSQyBiaWctZW5kaWFuIG91dHB1dAotQGNpbmRleCBBUkMgbGl0dGxlLWVuZGlhbiBvdXRwdXQKLUBjaW5kZXggYmlnLWVuZGlhbiBvdXRwdXQsIEFSQwotQGNpbmRleCBsaXR0bGUtZW5kaWFuIG91dHB1dCwgQVJDCi1AaXRlbSAtbWJpZy1lbmRpYW4KLUBpdGVteCAtbWxpdHRsZS1lbmRpYW4KLUFueSBAc2N7YXJjfSBjb25maWd1cmF0aW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBzZWxlY3QgYmlnLWVuZGlhbiBvcgotbGl0dGxlLWVuZGlhbiBvdXRwdXQgYXQgcnVuIHRpbWUgKHVubGlrZSBtb3N0IG90aGVyIEBzY3tnbnV9IGRldmVsb3BtZW50Ci10b29scywgd2hpY2ggbXVzdCBiZSBjb25maWd1cmVkIGZvciBvbmUgb3IgdGhlIG90aGVyKS4gIFVzZQotQHNhbXB7LW1iaWctZW5kaWFufSB0byBzZWxlY3QgYmlnLWVuZGlhbiBvdXRwdXQsIGFuZCBAc2FtcHstbWxpdHRsZS1lbmRpYW59Ci1mb3IgbGl0dGxlLWVuZGlhbi4KLUBlbmQgdGFibGUKLQotQG5vZGUgQVJDLUZsb2F0Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBBUkMgKEBzY3tpZWVlfSkKLUBjaW5kZXggQVJDIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgQVJDIGNwdSBmYW1pbHkgY3VycmVudGx5IGRvZXMgbm90IGhhdmUgaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQKLXN1cHBvcnQuICBTb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IGlzIHByb3ZpZGVkIGJ5IEBjb2Rle0dDQ30KLWFuZCB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCi1Abm9kZSBBUkMtRGlyZWN0aXZlcwotQHNlY3Rpb24gQVJDIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IEFSQyBtYWNoaW5lIGRpcmVjdGl2ZXMKLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBBUkMKLVRoZSBBUkMgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwKLW1hY2hpbmUgZGlyZWN0aXZlczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAuY3B1Ci1AY2luZGV4IEBjb2Rle2NwdX0gZGlyZWN0aXZlLCBTUEFSQwotVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBkZXNpcmVkIGNwdS4KLVRoZSBBUkMgaXMgaW50ZW5kZWQgdG8gYmUgY3VzdG9taXphYmxlLCBAY29kZXsuY3B1fSBpcyB1c2VkIHRvCi1zZWxlY3QgdGhlIGRlc2lyZWQgdmFyaWFudCBbdGhvdWdoIGN1cnJlbnRseSB0aGVyZSBhcmUgbm9uZV0uCi0KLUBlbmQgdGFibGUKLQotQGVuZCBpZnNldAotCi1AaWZzZXQgQTI5SwotQGluY2x1ZGUgYy1hMjlrLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEFSTQotQGluY2x1ZGUgYy1hcm0udGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSGl0YWNoaS1hbGwKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBNYWNoaW5lIERlcGVuZGVudCBGZWF0dXJlcwotCi1UaGUgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXRzIGFyZSBkaWZmZXJlbnQgb24gZWFjaCBIaXRhY2hpIGNoaXAgZmFtaWx5LAotYW5kIHRoZXJlIGFyZSBhbHNvIHNvbWUgc3ludGF4IGRpZmZlcmVuY2VzIGFtb25nIHRoZSBmYW1pbGllcy4gIFRoaXMKLWNoYXB0ZXIgZGVzY3JpYmVzIHRoZSBzcGVjaWZpYyBAY29kZXtAdmFsdWV7QVN9fSBmZWF0dXJlcyBmb3IgZWFjaAotZmFtaWx5LgotCi1AbWVudQotKiBIOC8zMDAtRGVwZW5kZW50OjogICAgICAgICAgICBIaXRhY2hpIEg4LzMwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLSogSDgvNTAwLURlcGVuZGVudDo6ICAgICAgICAgICAgSGl0YWNoaSBIOC81MDAgRGVwZW5kZW50IEZlYXR1cmVzCi0qIFNILURlcGVuZGVudDo6ICAgICAgICAgICAgICAgIEhpdGFjaGkgU0ggRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIG1lbnUKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEQxMFYKLUBpbmNsdWRlIGMtZDEwdi50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBEMzBWCi1AaW5jbHVkZSBjLWQzMHYudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSDgvMzAwCi1AaW5jbHVkZSBjLWg4MzAwLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEg4LzUwMAotQGluY2x1ZGUgYy1oODUwMC50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIUFBBCi1AaW5jbHVkZSBjLWhwcGEudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSTgwMzg2Ci1AaW5jbHVkZSBjLWkzODYudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSTk2MAotQGluY2x1ZGUgYy1pOTYwLnRleGkKLUBlbmQgaWZzZXQKLQotCi1AaWZzZXQgTTY4MFgwCi1AaW5jbHVkZSBjLW02OGsudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgTUlQUwotQGluY2x1ZGUgYy1taXBzLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IE5TMzJLCi1AaW5jbHVkZSBjLW5zMzJrLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFBKCi1AaW5jbHVkZSBjLXBqLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFNICi1AaW5jbHVkZSBjLXNoLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFNQQVJDCi1AaW5jbHVkZSBjLXNwYXJjLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFo4MDAwCi1AaW5jbHVkZSBjLXo4ay50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBWQVgKLUBpbmNsdWRlIGMtdmF4LnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IFY4NTAKLUBpbmNsdWRlIGMtdjg1MC50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBHRU5FUklDCi1AYyByZXZlcnNlIGVmZmVjdCBvZiBAZG93biBhdCB0b3Agb2YgZ2VuZXJpYyBNYWNoaW5lLURlcCBjaGFwdGVyCi1AcmFpc2VzZWN0aW9ucwotQGVuZCBpZnNldAotCi1Abm9kZSBSZXBvcnRpbmcgQnVncwotQGNoYXB0ZXIgUmVwb3J0aW5nIEJ1Z3MKLUBjaW5kZXggYnVncyBpbiBhc3NlbWJsZXIKLUBjaW5kZXggcmVwb3J0aW5nIGJ1Z3MgaW4gYXNzZW1ibGVyCi0KLVlvdXIgYnVnIHJlcG9ydHMgcGxheSBhbiBlc3NlbnRpYWwgcm9sZSBpbiBtYWtpbmcgQGNvZGV7QHZhbHVle0FTfX0gcmVsaWFibGUuCi0KLVJlcG9ydGluZyBhIGJ1ZyBtYXkgaGVscCB5b3UgYnkgYnJpbmdpbmcgYSBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0sIG9yIGl0IG1heQotbm90LiAgQnV0IGluIGFueSBjYXNlIHRoZSBwcmluY2lwYWwgZnVuY3Rpb24gb2YgYSBidWcgcmVwb3J0IGlzIHRvIGhlbHAgdGhlCi1lbnRpcmUgY29tbXVuaXR5IGJ5IG1ha2luZyB0aGUgbmV4dCB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHdvcmsgYmV0dGVyLgotQnVnIHJlcG9ydHMgYXJlIHlvdXIgY29udHJpYnV0aW9uIHRvIHRoZSBtYWludGVuYW5jZSBvZiBAY29kZXtAdmFsdWV7QVN9fS4KLQotSW4gb3JkZXIgZm9yIGEgYnVnIHJlcG9ydCB0byBzZXJ2ZSBpdHMgcHVycG9zZSwgeW91IG11c3QgaW5jbHVkZSB0aGUKLWluZm9ybWF0aW9uIHRoYXQgZW5hYmxlcyB1cyB0byBmaXggdGhlIGJ1Zy4KLQotQG1lbnUKLSogQnVnIENyaXRlcmlhOjogICAgICAgICAgICAgICAgSGF2ZSB5b3UgZm91bmQgYSBidWc/Ci0qIEJ1ZyBSZXBvcnRpbmc6OiAgICAgICAgICAgICAgIEhvdyB0byByZXBvcnQgYnVncwotQGVuZCBtZW51Ci0KLUBub2RlIEJ1ZyBDcml0ZXJpYQotQHNlY3Rpb24gSGF2ZSB5b3UgZm91bmQgYSBidWc/Ci1AY2luZGV4IGJ1ZyBjcml0ZXJpYQotCi1JZiB5b3UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgeW91IGhhdmUgZm91bmQgYSBidWcsIGhlcmUgYXJlIHNvbWUgZ3VpZGVsaW5lczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGNpbmRleCBmYXRhbCBzaWduYWwKLUBjaW5kZXggYXNzZW1ibGVyIGNyYXNoCi1AY2luZGV4IGNyYXNoIG9mIGFzc2VtYmxlcgotQGl0ZW0KLUlmIHRoZSBhc3NlbWJsZXIgZ2V0cyBhIGZhdGFsIHNpZ25hbCwgZm9yIGFueSBpbnB1dCB3aGF0ZXZlciwgdGhhdCBpcyBhCi1AY29kZXtAdmFsdWV7QVN9fSBidWcuICBSZWxpYWJsZSBhc3NlbWJsZXJzIG5ldmVyIGNyYXNoLgotCi1AY2luZGV4IGVycm9yIG9uIHZhbGlkIGlucHV0Ci1AaXRlbQotSWYgQGNvZGV7QHZhbHVle0FTfX0gcHJvZHVjZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdmFsaWQgaW5wdXQsIHRoYXQgaXMgYSBidWcuCi0KLUBjaW5kZXggaW52YWxpZCBpbnB1dAotQGl0ZW0KLUlmIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90IHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZSBmb3IgaW52YWxpZCBpbnB1dCwgdGhhdAotaXMgYSBidWcuICBIb3dldmVyLCB5b3Ugc2hvdWxkIG5vdGUgdGhhdCB5b3VyIGlkZWEgb2YgYGBpbnZhbGlkIGlucHV0JycgbWlnaHQKLWJlIG91ciBpZGVhIG9mIGBgYW4gZXh0ZW5zaW9uJycgb3IgYGBzdXBwb3J0IGZvciB0cmFkaXRpb25hbCBwcmFjdGljZScnLgotCi1AaXRlbQotSWYgeW91IGFyZSBhbiBleHBlcmllbmNlZCB1c2VyIG9mIGFzc2VtYmxlcnMsIHlvdXIgc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50Ci1vZiBAY29kZXtAdmFsdWV7QVN9fSBhcmUgd2VsY29tZSBpbiBhbnkgY2FzZS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCdWcgUmVwb3J0aW5nCi1Ac2VjdGlvbiBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBjaW5kZXggYnVnIHJlcG9ydHMKLUBjaW5kZXggYXNzZW1ibGVyIGJ1Z3MsIHJlcG9ydGluZwotCi1BIG51bWJlciBvZiBjb21wYW5pZXMgYW5kIGluZGl2aWR1YWxzIG9mZmVyIHN1cHBvcnQgZm9yIEBzY3tnbnV9IHByb2R1Y3RzLiAgSWYKLXlvdSBvYnRhaW5lZCBAY29kZXtAdmFsdWV7QVN9fSBmcm9tIGEgc3VwcG9ydCBvcmdhbml6YXRpb24sIHdlIHJlY29tbWVuZCB5b3UKLWNvbnRhY3QgdGhhdCBvcmdhbml6YXRpb24gZmlyc3QuCi0KLVlvdSBjYW4gZmluZCBjb250YWN0IGluZm9ybWF0aW9uIGZvciBtYW55IHN1cHBvcnQgY29tcGFuaWVzIGFuZAotaW5kaXZpZHVhbHMgaW4gdGhlIGZpbGUgQGZpbGV7ZXRjL1NFUlZJQ0V9IGluIHRoZSBAc2N7Z251fSBFbWFjcwotZGlzdHJpYnV0aW9uLgotCi1JbiBhbnkgZXZlbnQsIHdlIGFsc28gcmVjb21tZW5kIHRoYXQgeW91IHNlbmQgYnVnIHJlcG9ydHMgZm9yIEBjb2Rle0B2YWx1ZXtBU319Ci10byBAc2FtcHtidWctZ251LXV0aWxzQEBnbnUub3JnfS4KLQotVGhlIGZ1bmRhbWVudGFsIHByaW5jaXBsZSBvZiByZXBvcnRpbmcgYnVncyB1c2VmdWxseSBpcyB0aGlzOgotQHN0cm9uZ3tyZXBvcnQgYWxsIHRoZSBmYWN0c30uICBJZiB5b3UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgdG8gc3RhdGUgYQotZmFjdCBvciBsZWF2ZSBpdCBvdXQsIHN0YXRlIGl0IQotCi1PZnRlbiBwZW9wbGUgb21pdCBmYWN0cyBiZWNhdXNlIHRoZXkgdGhpbmsgdGhleSBrbm93IHdoYXQgY2F1c2VzIHRoZSBwcm9ibGVtCi1hbmQgYXNzdW1lIHRoYXQgc29tZSBkZXRhaWxzIGRvIG5vdCBtYXR0ZXIuICBUaHVzLCB5b3UgbWlnaHQgYXNzdW1lIHRoYXQgdGhlCi1uYW1lIG9mIGEgc3ltYm9sIHlvdSB1c2UgaW4gYW4gZXhhbXBsZSBkb2VzIG5vdCBtYXR0ZXIuICBXZWxsLCBwcm9iYWJseSBpdCBkb2VzCi1ub3QsIGJ1dCBvbmUgY2Fubm90IGJlIHN1cmUuICBQZXJoYXBzIHRoZSBidWcgaXMgYSBzdHJheSBtZW1vcnkgcmVmZXJlbmNlIHdoaWNoCi1oYXBwZW5zIHRvIGZldGNoIGZyb20gdGhlIGxvY2F0aW9uIHdoZXJlIHRoYXQgbmFtZSBpcyBzdG9yZWQgaW4gbWVtb3J5OwotcGVyaGFwcywgaWYgdGhlIG5hbWUgd2VyZSBkaWZmZXJlbnQsIHRoZSBjb250ZW50cyBvZiB0aGF0IGxvY2F0aW9uIHdvdWxkIGZvb2wKLXRoZSBhc3NlbWJsZXIgaW50byBkb2luZyB0aGUgcmlnaHQgdGhpbmcgZGVzcGl0ZSB0aGUgYnVnLiAgUGxheSBpdCBzYWZlIGFuZAotZ2l2ZSBhIHNwZWNpZmljLCBjb21wbGV0ZSBleGFtcGxlLiAgVGhhdCBpcyB0aGUgZWFzaWVzdCB0aGluZyBmb3IgeW91IHRvIGRvLAotYW5kIHRoZSBtb3N0IGhlbHBmdWwuCi0KLUtlZXAgaW4gbWluZCB0aGF0IHRoZSBwdXJwb3NlIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcgaWYKLWl0IGlzIG5ldyB0byB1cy4gIFRoZXJlZm9yZSwgYWx3YXlzIHdyaXRlIHlvdXIgYnVnIHJlcG9ydHMgb24gdGhlIGFzc3VtcHRpb24KLXRoYXQgdGhlIGJ1ZyBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgcHJldmlvdXNseS4KLQotU29tZXRpbWVzIHBlb3BsZSBnaXZlIGEgZmV3IHNrZXRjaHkgZmFjdHMgYW5kIGFzaywgYGBEb2VzIHRoaXMgcmluZyBhCi1iZWxsPycnICBUaG9zZSBidWcgcmVwb3J0cyBhcmUgdXNlbGVzcywgYW5kIHdlIHVyZ2UgZXZlcnlvbmUgdG8KLUBlbXBoe3JlZnVzZSB0byByZXNwb25kIHRvIHRoZW19IGV4Y2VwdCB0byBjaGlkZSB0aGUgc2VuZGVyIHRvIHJlcG9ydAotYnVncyBwcm9wZXJseS4KLQotVG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYWxsIHRoZXNlIHRoaW5nczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319LiAgQGNvZGV7QHZhbHVle0FTfX0gYW5ub3VuY2VzIGl0IGlmIHlvdSBzdGFydAotaXQgd2l0aCB0aGUgQHNhbXB7LS12ZXJzaW9ufSBhcmd1bWVudC4KLQotV2l0aG91dCB0aGlzLCB3ZSB3aWxsIG5vdCBrbm93IHdoZXRoZXIgdGhlcmUgaXMgYW55IHBvaW50IGluIGxvb2tpbmcgZm9yCi10aGUgYnVnIGluIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBpdGVtCi1BbnkgcGF0Y2hlcyB5b3UgbWF5IGhhdmUgYXBwbGllZCB0byB0aGUgQGNvZGV7QHZhbHVle0FTfX0gc291cmNlLgotCi1AaXRlbQotVGhlIHR5cGUgb2YgbWFjaGluZSB5b3UgYXJlIHVzaW5nLCBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gbmFtZSBhbmQKLXZlcnNpb24gbnVtYmVyLgotCi1AaXRlbQotV2hhdCBjb21waWxlciAoYW5kIGl0cyB2ZXJzaW9uKSB3YXMgdXNlZCB0byBjb21waWxlIEBjb2Rle0B2YWx1ZXtBU319LS0tZS5nLgotYGBAY29kZXtnY2MtMi43fScnLgotCi1AaXRlbQotVGhlIGNvbW1hbmQgYXJndW1lbnRzIHlvdSBnYXZlIHRoZSBhc3NlbWJsZXIgdG8gYXNzZW1ibGUgeW91ciBleGFtcGxlIGFuZAotb2JzZXJ2ZSB0aGUgYnVnLiAgVG8gZ3VhcmFudGVlIHlvdSB3aWxsIG5vdCBvbWl0IHNvbWV0aGluZyBpbXBvcnRhbnQsIGxpc3QgdGhlbQotYWxsLiAgQSBjb3B5IG9mIHRoZSBNYWtlZmlsZSAob3IgdGhlIG91dHB1dCBmcm9tIG1ha2UpIGlzIHN1ZmZpY2llbnQuCi0KLUlmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCi1hbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCi0KLUBpdGVtCi1BIGNvbXBsZXRlIGlucHV0IGZpbGUgdGhhdCB3aWxsIHJlcHJvZHVjZSB0aGUgYnVnLiAgSWYgdGhlIGJ1ZyBpcyBvYnNlcnZlZCB3aGVuCi10aGUgYXNzZW1ibGVyIGlzIGludm9rZWQgdmlhIGEgY29tcGlsZXIsIHNlbmQgdGhlIGFzc2VtYmxlciBzb3VyY2UsIG5vdCB0aGUKLWhpZ2ggbGV2ZWwgbGFuZ3VhZ2Ugc291cmNlLiAgTW9zdCBjb21waWxlcnMgd2lsbCBwcm9kdWNlIHRoZSBhc3NlbWJsZXIgc291cmNlCi13aGVuIHJ1biB3aXRoIHRoZSBAc2FtcHstU30gb3B0aW9uLiAgSWYgeW91IGFyZSB1c2luZyBAY29kZXtAdmFsdWV7R0NDfX0sIHVzZQotdGhlIG9wdGlvbnMgQHNhbXB7LXYgLS1zYXZlLXRlbXBzfTsgdGhpcyB3aWxsIHNhdmUgdGhlIGFzc2VtYmxlciBzb3VyY2UgaW4gYQotZmlsZSB3aXRoIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsuc30sIGFuZCBhbHNvIHNob3cgeW91IGV4YWN0bHkgaG93Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBiZWluZyBydW4uCi0KLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHdoYXQgYmVoYXZpb3IgeW91IG9ic2VydmUgdGhhdCB5b3UgYmVsaWV2ZSBpcwotaW5jb3JyZWN0LiAgRm9yIGV4YW1wbGUsIGBgSXQgZ2V0cyBhIGZhdGFsIHNpZ25hbC4nJwotCi1PZiBjb3Vyc2UsIGlmIHRoZSBidWcgaXMgdGhhdCBAY29kZXtAdmFsdWV7QVN9fSBnZXRzIGEgZmF0YWwgc2lnbmFsLCB0aGVuIHdlCi13aWxsIGNlcnRhaW5seSBub3RpY2UgaXQuICBCdXQgaWYgdGhlIGJ1ZyBpcyBpbmNvcnJlY3Qgb3V0cHV0LCB3ZSBtaWdodCBub3QKLW5vdGljZSB1bmxlc3MgaXQgaXMgZ2xhcmluZ2x5IHdyb25nLiAgWW91IG1pZ2h0IGFzIHdlbGwgbm90IGdpdmUgdXMgYSBjaGFuY2UgdG8KLW1ha2UgYSBtaXN0YWtlLgotCi1FdmVuIGlmIHRoZSBwcm9ibGVtIHlvdSBleHBlcmllbmNlIGlzIGEgZmF0YWwgc2lnbmFsLCB5b3Ugc2hvdWxkIHN0aWxsIHNheSBzbwotZXhwbGljaXRseS4gIFN1cHBvc2Ugc29tZXRoaW5nIHN0cmFuZ2UgaXMgZ29pbmcgb24sIHN1Y2ggYXMsIHlvdXIgY29weSBvZgotQGNvZGV7QHZhbHVle0FTfX0gaXMgb3V0IG9mIHN5bmNoLCBvciB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGJ1ZyBpbiB0aGUgQwotbGlicmFyeSBvbiB5b3VyIHN5c3RlbS4gIChUaGlzIGhhcyBoYXBwZW5lZCEpICBZb3VyIGNvcHkgbWlnaHQgY3Jhc2ggYW5kIG91cnMKLXdvdWxkIG5vdC4gIElmIHlvdSB0b2xkIHVzIHRvIGV4cGVjdCBhIGNyYXNoLCB0aGVuIHdoZW4gb3VycyBmYWlscyB0byBjcmFzaCwgd2UKLXdvdWxkIGtub3cgdGhhdCB0aGUgYnVnIHdhcyBub3QgaGFwcGVuaW5nIGZvciB1cy4gIElmIHlvdSBoYWQgbm90IHRvbGQgdXMgdG8KLWV4cGVjdCBhIGNyYXNoLCB0aGVuIHdlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIGRyYXcgYW55IGNvbmNsdXNpb24gZnJvbSBvdXIKLW9ic2VydmF0aW9ucy4KLQotQGl0ZW0KLUlmIHlvdSB3aXNoIHRvIHN1Z2dlc3QgY2hhbmdlcyB0byB0aGUgQGNvZGV7QHZhbHVle0FTfX0gc291cmNlLCBzZW5kIHVzIGNvbnRleHQKLWRpZmZzLCBhcyBnZW5lcmF0ZWQgYnkgQGNvZGV7ZGlmZn0gd2l0aCB0aGUgQHNhbXB7LXV9LCBAc2FtcHstY30sIG9yIEBzYW1wey1wfQotb3B0aW9uLiAgQWx3YXlzIHNlbmQgZGlmZnMgZnJvbSB0aGUgb2xkIGZpbGUgdG8gdGhlIG5ldyBmaWxlLiAgSWYgeW91IGV2ZW4KLWRpc2N1c3Mgc29tZXRoaW5nIGluIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzb3VyY2UsIHJlZmVyIHRvIGl0IGJ5IGNvbnRleHQsIG5vdAotYnkgbGluZSBudW1iZXIuCi0KLVRoZSBsaW5lIG51bWJlcnMgaW4gb3VyIGRldmVsb3BtZW50IHNvdXJjZXMgd2lsbCBub3QgbWF0Y2ggdGhvc2UgaW4geW91cgotc291cmNlcy4gIFlvdXIgbGluZSBudW1iZXJzIHdvdWxkIGNvbnZleSBubyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gdXMuCi1AZW5kIGl0ZW1pemUKLQotSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeToKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUEgZGVzY3JpcHRpb24gb2YgdGhlIGVudmVsb3BlIG9mIHRoZSBidWcuCi0KLU9mdGVuIHBlb3BsZSB3aG8gZW5jb3VudGVyIGEgYnVnIHNwZW5kIGEgbG90IG9mIHRpbWUgaW52ZXN0aWdhdGluZwotd2hpY2ggY2hhbmdlcyB0byB0aGUgaW5wdXQgZmlsZSB3aWxsIG1ha2UgdGhlIGJ1ZyBnbyBhd2F5IGFuZCB3aGljaAotY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgaXQuCi0KLVRoaXMgaXMgb2Z0ZW4gdGltZSBjb25zdW1pbmcgYW5kIG5vdCB2ZXJ5IHVzZWZ1bCwgYmVjYXVzZSB0aGUgd2F5IHdlCi13aWxsIGZpbmQgdGhlIGJ1ZyBpcyBieSBydW5uaW5nIGEgc2luZ2xlIGV4YW1wbGUgdW5kZXIgdGhlIGRlYnVnZ2VyCi13aXRoIGJyZWFrcG9pbnRzLCBub3QgYnkgcHVyZSBkZWR1Y3Rpb24gZnJvbSBhIHNlcmllcyBvZiBleGFtcGxlcy4KLVdlIHJlY29tbWVuZCB0aGF0IHlvdSBzYXZlIHlvdXIgdGltZSBmb3Igc29tZXRoaW5nIGVsc2UuCi0KLU9mIGNvdXJzZSwgaWYgeW91IGNhbiBmaW5kIGEgc2ltcGxlciBleGFtcGxlIHRvIHJlcG9ydCBAZW1waHtpbnN0ZWFkfQotb2YgdGhlIG9yaWdpbmFsIG9uZSwgdGhhdCBpcyBhIGNvbnZlbmllbmNlIGZvciB1cy4gIEVycm9ycyBpbiB0aGUKLW91dHB1dCB3aWxsIGJlIGVhc2llciB0byBzcG90LCBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciB3aWxsIHRha2UKLWxlc3MgdGltZSwgYW5kIHNvIG9uLgotCi1Ib3dldmVyLCBzaW1wbGlmaWNhdGlvbiBpcyBub3Qgdml0YWw7IGlmIHlvdSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLAotcmVwb3J0IHRoZSBidWcgYW55d2F5IGFuZCBzZW5kIHVzIHRoZSBlbnRpcmUgdGVzdCBjYXNlIHlvdSB1c2VkLgotCi1AaXRlbQotQSBwYXRjaCBmb3IgdGhlIGJ1Zy4KLQotQSBwYXRjaCBmb3IgdGhlIGJ1ZyBkb2VzIGhlbHAgdXMgaWYgaXQgaXMgYSBnb29kIG9uZS4gIEJ1dCBkbyBub3Qgb21pdAotdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdGVzdCBjYXNlLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0Ci1hIHBhdGNoIGlzIGFsbCB3ZSBuZWVkLiAgV2UgbWlnaHQgc2VlIHByb2JsZW1zIHdpdGggeW91ciBwYXRjaCBhbmQgZGVjaWRlCi10byBmaXggdGhlIHByb2JsZW0gYW5vdGhlciB3YXksIG9yIHdlIG1pZ2h0IG5vdCB1bmRlcnN0YW5kIGl0IGF0IGFsbC4KLQotU29tZXRpbWVzIHdpdGggYSBwcm9ncmFtIGFzIGNvbXBsaWNhdGVkIGFzIEBjb2Rle0B2YWx1ZXtBU319IGl0IGlzIHZlcnkgaGFyZCB0bwotY29uc3RydWN0IGFuIGV4YW1wbGUgdGhhdCB3aWxsIG1ha2UgdGhlIHByb2dyYW0gZm9sbG93IGEgY2VydGFpbiBwYXRoIHRocm91Z2gKLXRoZSBjb2RlLiAgSWYgeW91IGRvIG5vdCBzZW5kIHVzIHRoZSBleGFtcGxlLCB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbnN0cnVjdAotb25lLCBzbyB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIHZlcmlmeSB0aGF0IHRoZSBidWcgaXMgZml4ZWQuCi0KLUFuZCBpZiB3ZSBjYW5ub3QgdW5kZXJzdGFuZCB3aGF0IGJ1ZyB5b3UgYXJlIHRyeWluZyB0byBmaXgsIG9yIHdoeSB5b3VyCi1wYXRjaCBzaG91bGQgYmUgYW4gaW1wcm92ZW1lbnQsIHdlIHdpbGwgbm90IGluc3RhbGwgaXQuICBBIHRlc3QgY2FzZSB3aWxsCi1oZWxwIHVzIHRvIHVuZGVyc3RhbmQuCi0KLUBpdGVtCi1BIGd1ZXNzIGFib3V0IHdoYXQgdGhlIGJ1ZyBpcyBvciB3aGF0IGl0IGRlcGVuZHMgb24uCi0KLVN1Y2ggZ3Vlc3NlcyBhcmUgdXN1YWxseSB3cm9uZy4gIEV2ZW4gd2UgY2Fubm90IGd1ZXNzIHJpZ2h0IGFib3V0IHN1Y2gKLXRoaW5ncyB3aXRob3V0IGZpcnN0IHVzaW5nIHRoZSBkZWJ1Z2dlciB0byBmaW5kIHRoZSBmYWN0cy4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBBY2tub3dsZWRnZW1lbnRzCi1AY2hhcHRlciBBY2tub3dsZWRnZW1lbnRzCi0KLUlmIHlvdSBoYXZlIGNvbnRyaWJ1dGVkIHRvIEBjb2Rle0B2YWx1ZXtBU319IGFuZCB5b3VyIG5hbWUgaXNuJ3QgbGlzdGVkIGhlcmUsCi1pdCBpcyBub3QgbWVhbnQgYXMgYSBzbGlnaHQuICBXZSBqdXN0IGRvbid0IGtub3cgYWJvdXQgaXQuICBTZW5kIG1haWwgdG8gdGhlCi1tYWludGFpbmVyLCBhbmQgd2UnbGwgY29ycmVjdCB0aGUgc2l0dWF0aW9uLiAgQ3VycmVudGx5IAotQGMgKEphbnVhcnkgMTk5NCksIAotdGhlIG1haW50YWluZXIgaXMgS2VuIFJhZWJ1cm4gKGVtYWlsIGFkZHJlc3MgQGNvZGV7cmFlYnVybkBAY3lnbnVzLmNvbX0pLgotCi1EZWFuIEVsc25lciB3cm90ZSB0aGUgb3JpZ2luYWwgQHNje2dudX0gYXNzZW1ibGVyIGZvciB0aGUgVkFYLkBmb290bm90ZXtBbnkKLW1vcmUgZGV0YWlscz99Ci0KLUpheSBGZW5sYXNvbiBtYWludGFpbmVkIEdBUyBmb3IgYSB3aGlsZSwgYWRkaW5nIHN1cHBvcnQgZm9yIEdEQi1zcGVjaWZpYyBkZWJ1ZwotaW5mb3JtYXRpb24gYW5kIHRoZSA2OGsgc2VyaWVzIG1hY2hpbmVzLCBtb3N0IG9mIHRoZSBwcmVwcm9jZXNzaW5nIHBhc3MsIGFuZAotZXh0ZW5zaXZlIGNoYW5nZXMgaW4gQGZpbGV7bWVzc2FnZXMuY30sIEBmaWxle2lucHV0LWZpbGUuY30sIEBmaWxle3dyaXRlLmN9LgotCi1LLiBSaWNoYXJkIFBpeGxleSBtYWludGFpbmVkIEdBUyBmb3IgYSB3aGlsZSwgYWRkaW5nIHZhcmlvdXMgZW5oYW5jZW1lbnRzIGFuZAotbWFueSBidWcgZml4ZXMsIGluY2x1ZGluZyBtZXJnaW5nIHN1cHBvcnQgZm9yIHNldmVyYWwgcHJvY2Vzc29ycywgYnJlYWtpbmcgR0FTCi11cCB0byBoYW5kbGUgbXVsdGlwbGUgb2JqZWN0IGZpbGUgZm9ybWF0IGJhY2sgZW5kcyAoaW5jbHVkaW5nIGhlYXZ5IHJld3JpdGUsCi10ZXN0aW5nLCBhbiBpbnRlZ3JhdGlvbiBvZiB0aGUgY29mZiBhbmQgYi5vdXQgYmFjayBlbmRzKSwgYWRkaW5nIGNvbmZpZ3VyYXRpb24KLWluY2x1ZGluZyBoZWF2eSB0ZXN0aW5nIGFuZCB2ZXJpZmljYXRpb24gb2YgY3Jvc3MgYXNzZW1ibGVycyBhbmQgZmlsZSBzcGxpdHMKLWFuZCByZW5hbWluZywgY29udmVydGVkIEdBUyB0byBzdHJpY3RseSBBTlNJIEMgaW5jbHVkaW5nIGZ1bGwgcHJvdG90eXBlcywgYWRkZWQKLXN1cHBvcnQgZm9yIG02ODBbMzRdMCBhbmQgY3B1MzIsIGRpZCBjb25zaWRlcmFibGUgd29yayBvbiBpOTYwIGluY2x1ZGluZyBhIENPRkYKLXBvcnQgKGluY2x1ZGluZyBjb25zaWRlcmFibGUgYW1vdW50cyBvZiByZXZlcnNlIGVuZ2luZWVyaW5nKSwgYSBTUEFSQyBvcGNvZGUKLWZpbGUgcmV3cml0ZSwgREVDc3RhdGlvbiwgcnM2MDAwLCBhbmQgaHAzMDBocHV4IGhvc3QgcG9ydHMsIHVwZGF0ZWQgYGBrbm93JycKLWFzc2VydGlvbnMgYW5kIG1hZGUgdGhlbSB3b3JrLCBtdWNoIG90aGVyIHJlb3JnYW5pemF0aW9uLCBjbGVhbnVwLCBhbmQgbGludC4KLQotS2VuIFJhZWJ1cm4gd3JvdGUgdGhlIGhpZ2gtbGV2ZWwgQkZEIGludGVyZmFjZSBjb2RlIHRvIHJlcGxhY2UgbW9zdCBvZiB0aGUgY29kZQotaW4gZm9ybWF0LXNwZWNpZmljIEkvTyBtb2R1bGVzLgotCi1UaGUgb3JpZ2luYWwgVk1TIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IERhdmlkIEwuIEthc2h0YW4uICBFcmljIFlvdW5nZGFsZQotaGFzIGRvbmUgbXVjaCB3b3JrIHdpdGggaXQgc2luY2UuCi0KLVRoZSBJbnRlbCA4MDM4NiBtYWNoaW5lIGRlc2NyaXB0aW9uIHdhcyB3cml0dGVuIGJ5IEVsaW90IERyZXNzZWxoYXVzLgotCi1NaW5oIFRyYW4tTGUgYXQgSW50ZWxsaUNvcnAgY29udHJpYnV0ZWQgc29tZSBBSVggMzg2IHN1cHBvcnQuCi0KLVRoZSBNb3Rvcm9sYSA4OGsgbWFjaGluZSBkZXNjcmlwdGlvbiB3YXMgY29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YgQnVmZmFsbwotVW5pdmVyc2l0eSBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCi0KLUtlaXRoIEtub3dsZXMgYXQgdGhlIE9wZW4gU29mdHdhcmUgRm91bmRhdGlvbiB3cm90ZSB0aGUgb3JpZ2luYWwgTUlQUyBiYWNrIGVuZAotKEBmaWxle3RjLW1pcHMuY30sIEBmaWxle3RjLW1pcHMuaH0pLCBhbmQgY29udHJpYnV0ZWQgUm9zZSBmb3JtYXQgc3VwcG9ydAotKHdoaWNoIGhhc24ndCBiZWVuIG1lcmdlZCBpbiB5ZXQpLiAgUmFscGggQ2FtcGJlbGwgd29ya2VkIHdpdGggdGhlIE1JUFMgY29kZSB0bwotc3VwcG9ydCBhLm91dCBmb3JtYXQuCi0KLVN1cHBvcnQgZm9yIHRoZSBaaWxvZyBaOGsgYW5kIEhpdGFjaGkgSDgvMzAwIGFuZCBIOC81MDAgcHJvY2Vzc29ycyAodGMtejhrLAotdGMtaDgzMDAsIHRjLWg4NTAwKSwgYW5kIElFRUUgNjk1IG9iamVjdCBmaWxlIGZvcm1hdCAob2JqLWllZWUpLCB3YXMgd3JpdHRlbiBieQotU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuICBTdGV2ZSBhbHNvIG1vZGlmaWVkIHRoZSBDT0ZGIGJhY2sgZW5kIHRvCi11c2UgQkZEIGZvciBzb21lIGxvdy1sZXZlbCBvcGVyYXRpb25zLCBmb3IgdXNlIHdpdGggdGhlIEg4LzMwMCBhbmQgQU1EIDI5awotdGFyZ2V0cy4KLQotSm9obiBHaWxtb3JlIGJ1aWx0IHRoZSBBTUQgMjkwMDAgc3VwcG9ydCwgYWRkZWQgQGNvZGV7LmluY2x1ZGV9IHN1cHBvcnQsIGFuZAotc2ltcGxpZmllZCB0aGUgY29uZmlndXJhdGlvbiBvZiB3aGljaCB2ZXJzaW9ucyBhY2NlcHQgd2hpY2ggZGlyZWN0aXZlcy4gIEhlCi11cGRhdGVkIHRoZSA2OGsgbWFjaGluZSBkZXNjcmlwdGlvbiBzbyB0aGF0IE1vdG9yb2xhJ3Mgb3Bjb2RlcyBhbHdheXMgcHJvZHVjZWQKLWZpeGVkLXNpemUgaW5zdHJ1Y3Rpb25zIChlLmcuIEBjb2Rle2pzcn0pLCB3aGlsZSBzeW50aGV0aWMgaW5zdHJ1Y3Rpb25zCi1yZW1haW5lZCBzaHJpbmthYmxlIChAY29kZXtqYnNyfSkuICBKb2huIGZpeGVkIG1hbnkgYnVncywgaW5jbHVkaW5nIHRydWUgdGVzdGVkCi1jcm9zcy1jb21waWxhdGlvbiBzdXBwb3J0LCBhbmQgb25lIGJ1ZyBpbiByZWxheGF0aW9uIHRoYXQgdG9vayBhIHdlZWsgYW5kCi1yZXF1aXJlZCB0aGUgcHJvdmVyYmlhbCBvbmUtYml0IGZpeC4KLQotSWFuIExhbmNlIFRheWxvciBvZiBDeWdudXMgU3VwcG9ydCBtZXJnZWQgdGhlIE1vdG9yb2xhIGFuZCBNSVQgc3ludGF4IGZvciB0aGUKLTY4aywgY29tcGxldGVkIHN1cHBvcnQgZm9yIHNvbWUgQ09GRiB0YXJnZXRzICg2OGssIGkzODYgU1ZSMywgYW5kIFNDTyBVbml4KSwKLWFkZGVkIHN1cHBvcnQgZm9yIE1JUFMgRUNPRkYgYW5kIEVMRiB0YXJnZXRzLCB3cm90ZSB0aGUgaW5pdGlhbCBSUy82MDAwIGFuZAotUG93ZXJQQyBhc3NlbWJsZXIsIGFuZCBtYWRlIGEgZmV3IG90aGVyIG1pbm9yIHBhdGNoZXMuCi0KLVN0ZXZlIENoYW1iZXJsYWluIG1hZGUgQGNvZGV7QHZhbHVle0FTfX0gYWJsZSB0byBnZW5lcmF0ZSBsaXN0aW5ncy4KLQotSGV3bGV0dC1QYWNrYXJkIGNvbnRyaWJ1dGVkIHN1cHBvcnQgZm9yIHRoZSBIUDkwMDAvMzAwLgotCi1KZWZmIExhdyB3cm90ZSBHQVMgYW5kIEJGRCBzdXBwb3J0IGZvciB0aGUgbmF0aXZlIEhQUEEgb2JqZWN0IGZvcm1hdCAoU09NKQotYWxvbmcgd2l0aCBhIGZhaXJseSBleHRlbnNpdmUgSFBQQSB0ZXN0c3VpdGUgKGZvciBib3RoIFNPTSBhbmQgRUxGIG9iamVjdAotZm9ybWF0cykuICBUaGlzIHdvcmsgd2FzIHN1cHBvcnRlZCBieSBib3RoIHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQKLXRoZSBVbml2ZXJzaXR5IG9mIFV0YWggYW5kIEN5Z251cyBTdXBwb3J0LgotCi1TdXBwb3J0IGZvciBFTEYgZm9ybWF0IGZpbGVzIGhhcyBiZWVuIHdvcmtlZCBvbiBieSBNYXJrIEVpY2hpbiBvZiBDeWdudXMKLVN1cHBvcnQgKG9yaWdpbmFsLCBpbmNvbXBsZXRlIGltcGxlbWVudGF0aW9uIGZvciBTUEFSQyksIFBldGUgSG9vZ2VuYm9vbSBhbmQKLUplZmYgTGF3IGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggKEhQUEEgbWFpbmx5KSwgTWljaGFlbCBNZWlzc25lciBvZiB0aGUgT3BlbgotU29mdHdhcmUgRm91bmRhdGlvbiAoaTM4NiBtYWlubHkpLCBhbmQgS2VuIFJhZWJ1cm4gb2YgQ3lnbnVzIFN1cHBvcnQgKHNwYXJjLAotYW5kIHNvbWUgaW5pdGlhbCA2NC1iaXQgc3VwcG9ydCkuCi0KLVJpY2hhcmQgSGVuZGVyc29uIHJld3JvdGUgdGhlIEFscGhhIGFzc2VtYmxlci4gS2xhdXMgS2FlbXBmIHdyb3RlIEdBUyBhbmQgQkZECi1zdXBwb3J0IGZvciBvcGVuVk1TL0FscGhhLgotCi1TZXZlcmFsIGVuZ2luZWVycyBhdCBDeWdudXMgU3VwcG9ydCBoYXZlIGFsc28gcHJvdmlkZWQgbWFueSBzbWFsbCBidWcgZml4ZXMgYW5kCi1jb25maWd1cmF0aW9uIGVuaGFuY2VtZW50cy4KLQotTWFueSBvdGhlcnMgaGF2ZSBjb250cmlidXRlZCBsYXJnZSBvciBzbWFsbCBidWdmaXhlcyBhbmQgZW5oYW5jZW1lbnRzLiAgSWYKLXlvdSBoYXZlIGNvbnRyaWJ1dGVkIHNpZ25pZmljYW50IHdvcmsgYW5kIGFyZSBub3QgbWVudGlvbmVkIG9uIHRoaXMgbGlzdCwgYW5kCi13YW50IHRvIGJlLCBsZXQgdXMga25vdy4gIFNvbWUgb2YgdGhlIGhpc3RvcnkgaGFzIGJlZW4gbG9zdDsgd2UgYXJlIG5vdAotaW50ZW50aW9uYWxseSBsZWF2aW5nIGFueW9uZSBvdXQuCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AY29udGVudHMKLUBieWUKLUBjIExvY2FsIFZhcmlhYmxlczoKLUBjIGZpbGwtY29sdW1uOiA3OQotQGMgRW5kOgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWEyOWsudGV4aSBiL2dhcy9kb2MvYy1hMjlrLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTE1ZDguLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWEyOWsudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgQU1EMjlLLURlcGVuZGVudAotQGNoYXB0ZXIgQU1EIDI5SyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBBTUQgMjlLIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggQU1EIDI5SyBzdXBwb3J0Ci1AY2luZGV4IDI5SyBzdXBwb3J0Ci1AbWVudQotKiBBTUQyOUsgT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIEFNRDI5SyBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBBTUQyOUsgRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBBTUQyOUsgRGlyZWN0aXZlczo6ICAgICAgICAgICBBTUQgMjlLIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBBTUQyOUsgT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQU1EMjlLIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLUBjaW5kZXggQU1EIDI5SyBvcHRpb25zIChub25lKQotQGNpbmRleCBvcHRpb25zIGZvciBBTUQyOUsgKG5vbmUpCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIEFNRAotMjlLIGZhbWlseS4KLQotQG5vZGUgQU1EMjlLIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AbWVudQotKiBBTUQyOUstTWFjcm9zOjoJCU1hY3JvcwotKiBBTUQyOUstQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogQU1EMjlLLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLUBlbmQgbWVudQotCi1Abm9kZSBBTUQyOUstTWFjcm9zCi1Ac3Vic2VjdGlvbiBNYWNyb3MKLQotQGNpbmRleCBNYWNyb3MsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBtYWNyb3MKLVRoZSBtYWNybyBzeW50YXggdXNlZCBvbiB0aGUgQU1EIDI5SyBpcyBsaWtlIHRoYXQgZGVzY3JpYmVkIGluIHRoZSBBTUQKLTI5SyBGYW1pbHkgTWFjcm8gQXNzZW1ibGVyIFNwZWNpZmljYXRpb24uICBOb3JtYWwgQGNvZGV7QHZhbHVle0FTfX0KLW1hY3JvcyBzaG91bGQgc3RpbGwgd29yay4KLQotQG5vZGUgQU1EMjlLLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7O30gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBjaW5kZXggaWRlbnRpZmllcnMsIEFNRCAyOUsKLUBjaW5kZXggQU1EIDI5SyBpZGVudGlmaWVycwotVGhlIGNoYXJhY3RlciBAc2FtcHs/fSBpcyBwZXJtaXR0ZWQgaW4gaWRlbnRpZmllcnMgKGJ1dCBtYXkgbm90IGJlZ2luCi1hbiBpZGVudGlmaWVyKS4KLQotQG5vZGUgQU1EMjlLLVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggQU1EIDI5SyByZWdpc3RlciBuYW1lcwotQGNpbmRleCByZWdpc3RlciBuYW1lcywgQU1EIDI5SwotR2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycyBhcmUgcmVwcmVzZW50ZWQgYnkgcHJlZGVmaW5lZCBzeW1ib2xzIG9mIHRoZQotZm9ybSBAc2FtcHtHUkB2YXJ7bm5ufX0gKGZvciBnbG9iYWwgcmVnaXN0ZXJzKSBvciBAc2FtcHtMUkB2YXJ7bm5ufX0KLShmb3IgbG9jYWwgcmVnaXN0ZXJzKSwgd2hlcmUgQHZhcntubm59IHJlcHJlc2VudHMgYSBudW1iZXIgYmV0d2VlbgotQGNvZGV7MH0gYW5kIEBjb2RlezEyN30sIHdyaXR0ZW4gd2l0aCBubyBsZWFkaW5nIHplcm9zLiAgVGhlIGxlYWRpbmcKLWxldHRlcnMgbWF5IGJlIGluIGVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlOyBmb3IgZXhhbXBsZSwgQHNhbXB7Z3IxM30KLWFuZCBAc2FtcHtMUjd9IGFyZSBib3RoIHZhbGlkIHJlZ2lzdGVyIG5hbWVzLgotCi1Zb3UgbWF5IGFsc28gcmVmZXIgdG8gZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycyBieSBzcGVjaWZ5aW5nIHRoZQotcmVnaXN0ZXIgbnVtYmVyIGFzIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiAocHJlZml4ZWQgd2l0aCBAc2FtcHslJX0KLXRvIGZsYWcgdGhlIGV4cHJlc3Npb24gYXMgYSByZWdpc3RlciBudW1iZXIpOgotQHNtYWxsZXhhbXBsZQotJSVAdmFye2V4cHJlc3Npb259Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci0tLS13aGVyZSBAdmFye2V4cHJlc3Npb259IG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBldmFsdWF0aW5nIHRvIGEKLW51bWJlciBiZXR3ZWVuIEBjb2RlezB9IGFuZCBAY29kZXsyNTV9LiAgVGhlIHJhbmdlIFswLCAxMjddIHJlZmVycyB0bwotZ2xvYmFsIHJlZ2lzdGVycywgYW5kIHRoZSByYW5nZSBbMTI4LCAyNTVdIHRvIGxvY2FsIHJlZ2lzdGVycy4KLQotQGNpbmRleCBzcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgc3BlY2lhbCBwdXJwb3NlIHJlZ2lzdGVycwotQGNpbmRleCBwcm90ZWN0ZWQgcmVnaXN0ZXJzLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgcHJvdGVjdGVkIHJlZ2lzdGVycwotSW4gYWRkaXRpb24sIEBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgcHJvdGVjdGVkCi1zcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbmFtZXMgZm9yIHRoZSBBTUQgMjlLIGZhbWlseToKLQotQHNtYWxsZXhhbXBsZQotICB2YWIgICAgY2hkICAgIHBjMAotICBvcHMgICAgY2hjICAgIHBjMQotICBjcHMgICAgcmJwICAgIHBjMgotICBjZmcgICAgdG1jICAgIG1tdQotICBjaGEgICAgdG1yICAgIGxydQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlc2UgdW5wcm90ZWN0ZWQgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyIG5hbWVzIGFyZSBhbHNvIHJlY29nbml6ZWQ6Ci1Ac21hbGxleGFtcGxlCi0gIGlwYyAgICBhbHUgICAgZnBlCi0gIGlwYSAgICBicCAgICAgaW50ZQotICBpcGIgICAgZmMgICAgIGZwcwotICBxICAgICAgY3IgICAgIGV4b3AKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIEFNRDI5SyBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgQU1EIDI5SyAoQHNje2llZWV9KQotQGNpbmRleCBBTUQgMjlLIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgQU1EIDI5SyBmYW1pbHkgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotQG5vZGUgQU1EMjlLIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEFNRCAyOUsgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgbWFjaGluZSBkaXJlY3RpdmVzCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7YmxvY2t9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLmJsb2NrIEB2YXJ7c2l6ZX0gLCBAdmFye2ZpbGx9Ci1UaGlzIGRpcmVjdGl2ZSBlbWl0cyBAdmFye3NpemV9IGJ5dGVzLCBlYWNoIG9mIHZhbHVlIEB2YXJ7ZmlsbH0uICBCb3RoCi1AdmFye3NpemV9IGFuZCBAdmFye2ZpbGx9IGFyZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4gIElmIHRoZSBjb21tYQotYW5kIEB2YXJ7ZmlsbH0gYXJlIG9taXR0ZWQsIEB2YXJ7ZmlsbH0gaXMgYXNzdW1lZCB0byBiZSB6ZXJvLgotCi1JbiBvdGhlciB2ZXJzaW9ucyBvZiB0aGUgQHNje2dudX0gYXNzZW1ibGVyLCB0aGlzIGRpcmVjdGl2ZSBpcyBjYWxsZWQKLUBzYW1wey5zcGFjZX0uCi1AZW5kIHRhYmxlCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtjcHV0eXBlfSBkaXJlY3RpdmUsIEFNRCAyOUsKLUBpdGVtIC5jcHV0eXBlCi1UaGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkOyBpdCBpcyBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi1BTUQgMjlLIGFzc2VtYmxlcnMuCi0KLUBjaW5kZXggQGNvZGV7ZmlsZX0gZGlyZWN0aXZlLCBBTUQgMjlLCi1AaXRlbSAuZmlsZQotVGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZDsgaXQgaXMgYWNjZXB0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgotQU1EIDI5SyBhc3NlbWJsZXJzLgotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gaW4gb3RoZXIgdmVyc2lvbnMgb2YgdGhlIEBzY3tnbnV9IGFzc2VtYmxlciwgQGNvZGV7LmZpbGV9IGlzCi11c2VkIGZvciB0aGUgZGlyZWN0aXZlIGNhbGxlZCBAY29kZXsuYXBwLWZpbGV9IGluIHRoZSBBTUQgMjlLIHN1cHBvcnQuCi1AZW5kIHF1b3RhdGlvbgotCi1AY2luZGV4IEBjb2Rle2xpbmV9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLmxpbmUKLVRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQ7IGl0IGlzIGFjY2VwdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLUFNRCAyOUsgYXNzZW1ibGVycy4KLQotQGlnbm9yZQotQGMgc2luY2Ugd2UncmUgaWdub3JpbmcgLmxzeW0uLi4KLUBjaW5kZXggQGNvZGV7cmVnfSBkaXJlY3RpdmUsIEFNRCAyOUsKLUBpdGVtIC5yZWcgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259Ci1AY29kZXsucmVnfSBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIEBjb2Rley5sc3ltfTsgQHB4cmVme0xzeW0sLEBjb2Rley5sc3ltfX0uCi1AZW5kIGlnbm9yZQotCi1AY2luZGV4IEBjb2Rle3NlY3R9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLnNlY3QKLVRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQ7IGl0IGlzIGFjY2VwdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLUFNRCAyOUsgYXNzZW1ibGVycy4KLQotQGNpbmRleCBAY29kZXt1c2V9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLnVzZSBAdmFye3NlY3Rpb24gbmFtZX0KLUVzdGFibGlzaGVzIHRoZSBzZWN0aW9uIGFuZCBzdWJzZWN0aW9uIGZvciB0aGUgZm9sbG93aW5nIGNvZGU7Ci1AdmFye3NlY3Rpb24gbmFtZX0gbWF5IGJlIG9uZSBvZiBAY29kZXsudGV4dH0sIEBjb2Rley5kYXRhfSwKLUBjb2Rley5kYXRhMX0sIG9yIEBjb2Rley5saXR9LiAgV2l0aCBvbmUgb2YgdGhlIGZpcnN0IHRocmVlIEB2YXJ7c2VjdGlvbgotbmFtZX0gb3B0aW9ucywgQHNhbXB7LnVzZX0gaXMgZXF1aXZhbGVudCB0byB0aGUgbWFjaGluZSBkaXJlY3RpdmUKLUB2YXJ7c2VjdGlvbiBuYW1lfTsgdGhlIHJlbWFpbmluZyBjYXNlLCBAc2FtcHsudXNlIC5saXR9LCBpcyB0aGUgc2FtZSBhcwotQHNhbXB7LmRhdGEgMjAwfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQU1EMjlLIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBBTUQgMjlLIG9wY29kZXMKLUBjaW5kZXggb3Bjb2RlcyBmb3IgQU1EIDI5SwotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEFNRCAyOUsgb3Bjb2Rlcy4gIE5vCi1hZGRpdGlvbmFsIHBzZXVkby1pbnN0cnVjdGlvbnMgYXJlIG5lZWRlZCBvbiB0aGlzIGZhbWlseS4KLQotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSAyOUsgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtBbTI5MDAwCi1Vc2VyJ3MgTWFudWFsfSwgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtYXJtLnRleGkgYi9nYXMvZG9jL2MtYXJtLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNGMyYjMuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWFybS50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIEFSTS1EZXBlbmRlbnQKLUBjaGFwdGVyIEFSTSBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIEFSTSBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IEFSTSBzdXBwb3J0Ci1AY2luZGV4IFRodW1iIHN1cHBvcnQKLUBtZW51Ci0qIEFSTSBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogQVJNIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4Ci0qIEFSTSBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEFSTSBEaXJlY3RpdmVzOjogICAgICAgICAgIEFSTSBNYWNoaW5lIERpcmVjdGl2ZXMKLSogQVJNIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEFSTSBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi1AY2luZGV4IEFSTSBvcHRpb25zIChub25lKQotQGNpbmRleCBvcHRpb25zIGZvciBBUk0gKG5vbmUpCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7LW1hcm19IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1hcm0gW0B2YXJ7Mn18QHZhcnsyNTB9fEB2YXJ7M318QHZhcns2fXxAdmFyezYwfXxAdmFyezYwMH18QHZhcns2MTB9fEB2YXJ7NjIwfXxAdmFyezd9fEB2YXJ7N219fEB2YXJ7N2R9fEB2YXJ7N2RtfXxAdmFyezdkaX18QHZhcns3ZG1pfXxAdmFyezcwfXxAdmFyezcwMH18QHZhcns3MDBpfXxAdmFyezcxMH18QHZhcns3MTBjfXxAdmFyezcxMDB9fEB2YXJ7NzUwMH18QHZhcns3NTAwZmV9fEB2YXJ7N3RkbWl9fEB2YXJ7OH18QHZhcns4MTB9fEB2YXJ7OX18QHZhcns5dGRtaX18QHZhcns5MjB9fEB2YXJ7c3Ryb25nYXJtfXxAdmFye3N0cm9uZ2FybTExMH18QHZhcntzdHJvbmdhcm0xMTAwfV0KLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGUgdGFyZ2V0IHByb2Nlc3Nvci4gIFRoZSBhc3NlbWJsZXIgd2lsbCBpc3N1ZSBhbgotZXJyb3IgbWVzc2FnZSBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24gd2hpY2gKLXdpbGwgbm90IGV4ZWN1dGUgb24gdGhlIHRhcmdldCBwcm9jZXNzb3IuCi1AY2luZGV4IEBjb2Rley1tYXJtdn0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbWFybXYgW0B2YXJ7Mn18QHZhcnsyYX18QHZhcnszfXxAdmFyezNtfXxAdmFyezR9fEB2YXJ7NHR9fEB2YXJ7NX18QHZhcns1dH1dCi1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuICBUaGUgYXNzZW1ibGVyIHdpbGwgaXNzdWUKLWFuIGVycm9yIG1lc3NhZ2UgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFzc2VtYmxlIGFuIGluc3RydWN0aW9uIHdoaWNoCi13aWxsIG5vdCBleGVjdXRlIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgotQGNpbmRleCBAY29kZXstbXRodW1ifSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tdGh1bWIKLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGF0IG9ubHkgVGh1bWIgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBhc3NlbWJsZWQuCi1AY2luZGV4IEBjb2Rley1tYWxsfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tYWxsCi1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhhdCBhbnkgQXJtIG9yIFRodW1iIGluc3RydWN0aW9uIHNob3VsZCBiZSBhc3NlbWJsZWQuCi1AY2luZGV4IEBjb2Rley1tZnBhfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tZnBhIFtAdmFyezEwfXxAdmFyezExfV0KLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGUgZmxvYXRpbmcgcG9pbnQgYXJjaGl0ZWN0dXJlIGluIHVzZSBvbiB0aGUKLXRhcmdldCBwcm9jZXNzb3IuIAotQGNpbmRleCBAY29kZXstbWZwZS1vbGR9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1mcGUtb2xkCi1EbyBub3QgYWxsb3cgdGhlIGFzc2VtYmxlIG9mIGZsb2F0aW5nIHBvaW50IG11bHRpcGxlIGluc3RydWN0aW9ucy4KLUBjaW5kZXggQGNvZGV7LW1uby1mcHV9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1uby1mcHUKLURvIG5vdCBhbGxvdyB0aGUgYXNzZW1ibHkgb2YgYW55IGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4KLUBjaW5kZXggQGNvZGV7LW10aHVtYi1pbnRlcndvcmt9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW10aHVtYi1pbnRlcndvcmsKLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGF0IHRoZSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXIgc2hvdWxkCi1iZSBtYXJrZWQgYXMgc3VwcG9ydGluZyBpbnRlcndvcmtpbmcuCi1AY2luZGV4IEBjb2Rley1tYXBjc30gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbWFwY3MgW0B2YXJ7MjZ9fEB2YXJ7MzJ9XQotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciBzaG91bGQKLWJlIG1hcmtlZCBhcyBzdXBwb3J0aW5nIHRoZSBpbmRpY2F0ZWQgdmVyc2lvbiBvZiB0aGUgQXJtIFByb2NlZHVyZS4KLUNhbGxpbmcgU3RhbmRhcmQuCi1AaXRlbSAtbWFwY3MtZmxvYXQKLVRoaXMgaW5kaWNhdGVzIHRoZSB0aGUgZmxvYXRpbmcgcG9pbnQgdmFyaWFudCBvZiB0aGUgQVBDUyBzaG91bGQgYmUKLXVzZWQuICBJbiB0aGlzIHZhcmlhbnQgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gRlAKLXJlZ2lzdGVycyByYXRlaHIgdGhhbiBpbnRlZ2VyIHJlZ2lzdGVycy4KLUBpdGVtIC1tYXBjcy1yZWVudHJhbnQKLVRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJlZW50cmFudCB2YXJpYW50IG9mIHRoZSBBUENTIHNob3VsZCBiZSB1c2VkLgotVGhpcyB2YXJpYW50IHN1cHBvcnRzIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUuCi1AY2luZGV4IEBjb2Rley1FQn0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtRUIKLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGF0IHRoZSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXIgc2hvdWxkCi1iZSBtYXJrZWQgYXMgYmVpbmcgZW5jb2RlZCBmb3IgYSBiaWctZW5kaWFuIHByb2Nlc3Nvci4KLUBjaW5kZXggQGNvZGV7LUVMfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1FTAotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciBzaG91bGQKLWJlIG1hcmtlZCBhcyBiZWluZyBlbmNvZGVkIGZvciBhIGxpdHRsZS1lbmRpYW4gcHJvY2Vzc29yLgotQGNpbmRleCBAY29kZXsta30gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AY2luZGV4IFBJQyBjb2RlIGdlbmVyYXRpb24gZm9yIEFSTQotQGl0ZW0gLWsKLVRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIGdlbmVyYXRpb24gb2YgUElDIChwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlKS4KLUBpdGVtIC1tb2FiaQotVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29kZSBzaG91bGQgYmUgYXNzZW1ibGVkIHVzaW5nIHRoZSBvbGQgQVJNIEVMRgotY29udmVudGlvbnMsIGJhc2VkIG9uIGEgYmV0YSByZWxlYXNlIHJlbGVhc2Ugb2YgdGhlIEFSTS1FTEYKLXNwZWNpZmljYXRpb25zLCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBjb252ZW50aW9ucyB3aGljaCBhcmUgYmFzZWQgb24KLXRoZSBmaW5hbCByZWxlYXNlIG9mIHRoZSBBUk0tRUxGIHNwZWNpZmljYXRpb25zLgotQGVuZCB0YWJsZQotCi0KLUBub2RlIEFSTSBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotQG1lbnUKLSogQVJNLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIEFSTS1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQVJNLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBBUk0KLUBjaW5kZXggQVJNIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLVRoZSBwcmVzZW5jZSBvZiBhIEBzYW1weyN9IGFuZCBAc2FtcHtAQH0gb24gYSBsaW5lIGluZGljYXRlcyB0aGUgc3RhcnQgb2YKLWEgY29tbWVudCB0aGF0IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLgotCi1AY2luZGV4IGlkZW50aWZpZXJzLCBBUk0KLUBjaW5kZXggQVJNIGlkZW50aWZpZXJzCi0qVE9ETyogRXhwbGFpbiBhYm91dCAvZGF0YSBtb2RpZmllciBvbiBzeW1ib2xzLgotCi1Abm9kZSBBUk0tUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBBUk0gcmVnaXN0ZXIgbmFtZXMKLUBjaW5kZXggcmVnaXN0ZXIgbmFtZXMsIEFSTQotKlRPRE8qIEV4cGxhaW4gYWJvdXQgQVJNIHJlZ2lzdGVyIG5hbWluZywgYW5kIHRoZSBwcmVkZWZpbmVkIG5hbWVzLgotCi1Abm9kZSBBUk0gRmxvYXRpbmcgUG9pbnQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEFSTSAoQHNje2llZWV9KQotQGNpbmRleCBBUk0gZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBBUk0gZmFtaWx5IHVzZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0KLQotCi1Abm9kZSBBUk0gRGlyZWN0aXZlcwotQHNlY3Rpb24gQVJNIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgQVJNCi1AY2luZGV4IEFSTSBtYWNoaW5lIGRpcmVjdGl2ZXMKLUB0YWJsZSBAY29kZQotCi1AY2luZGV4IEBjb2Rle3JlcX0gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIEB2YXJ7bmFtZX0gLnJlcSBAdmFye3JlZ2lzdGVyIG5hbWV9Ci1UaGlzIGNyZWF0ZXMgYW4gYWxpYXMgZm9yIEB2YXJ7cmVnaXN0ZXIgbmFtZX0gY2FsbGVkIEB2YXJ7bmFtZX0uICBGb3IKLWV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgZm9vIC5yZXEgcjAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjaW5kZXggQGNvZGV7Y29kZX0gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC5jb2RlIFtAdmFyezE2fXxAdmFyezMyfV0KLVRoaXMgZGlyZWN0aXZlIHNlbGVjdHMgdGhlIGluc3RydWN0aW9uIHNldCBiZWluZyBnZW5lcmF0ZWQuIFRoZSB2YWx1ZSAxNgotc2VsZWN0cyBUaHVtYiwgd2l0aCB0aGUgdmFsdWUgMzIgc2VsZWN0aW5nIEFSTS4KLQotQGNpbmRleCBAY29kZXt0aHVtYn0gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC50aHVtYgotVGhpcyBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24gYXMgQHZhcnsuY29kZSAxNn0uCi0KLUBjaW5kZXggQGNvZGV7YXJtfSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLmFybQotVGhpcyBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24gYXMgQHZhcnsuY29kZSAzMn0uCi0KLUBjaW5kZXggQGNvZGV7Zm9yY2VfdGh1bWJ9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAuZm9yY2VfdGh1bWIKLVRoaXMgZGlyZWN0aXZlIGZvcmNlcyB0aGUgc2VsZWN0aW9uIG9mIFRodW1iIGluc3RydWN0aW9ucywgZXZlbiBpZiB0aGUKLXRhcmdldCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCB0aG9zZSBpbnN0cnVjdGlvbnMKLQotQGNpbmRleCBAY29kZXt0aHVtYl9mdW5jfSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLnRodW1iX2Z1bmMKLVRoaXMgZGlyZWN0aXZlIHNwZWNpZmllcyB0aGF0IHRoZSBmb2xsb3dpbmcgc3ltYm9sIGlzIHRoZSBuYW1lIG9mIGEKLVRodW1iIGVuY29kZWQgZnVuY3Rpb24uICBUaGlzIGluZm9ybWF0aW9uIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBhbGxvdwotdGhlIGFzc2VtYmxlciBhbmQgbGlua2VyIHRvIGdlbmVyYXRlIGNvcnJlY3QgY29kZSBmb3IgaW50ZXJ3b3JraW5nCi1iZXR3ZWVuIEFybSBhbmQgVGh1bWIgaW5zdHJ1Y3Rpb25zIGFuZCBzaG91bGQgYmUgdXNlZCBldmVuIGlmCi1pbnRlcndvcmtpbmcgaXMgbm90IGdvaW5nIHRvIGJlIHBlcmZvcm1lZC4KLQotQGNpbmRleCBAY29kZXt0aHVtYl9zZXR9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAudGh1bWJfc2V0Ci1UaGlzIHBlcmZvcm1zIHRoZSBlcXVpdmFsZW50IG9mIGEgQGNvZGV7LnNldH0gZGlyZWN0aXZlIGluIHRoYXQgaXQKLWNyZWF0ZXMgYSBzeW1ib2wgd2hpY2ggaXMgYW4gYWxpYXMgZm9yIGFub3RoZXIgc3ltYm9sIChwb3NzaWJseSBub3QgeWV0Ci1kZWZpbmVkKS4gIFRoaXMgZGlyZWN0aXZlIGFsc28gaGFzIHRoZSBhZGRlZCBwcm9wZXJ0eSBpbiB0aGF0IGl0IG1hcmtzCi10aGUgYWxpYXNlZCBzeW1ib2wgYXMgYmVpbmcgYSB0aHVtYiBmdW5jdGlvbiBlbnRyeSBwb2ludCwgaW4gdGhlIHNhbWUKLXdheSB0aGF0IHRoZSBAY29kZXsudGh1bWJfZnVuY30gZGlyZWN0aXZlIGRvZXMuCi0KLUBjaW5kZXggQGNvZGV7Lmx0b3JnfSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLmx0b3JnCi1UaGlzIGRpcmVjdGl2ZSBjYXVzZXMgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGxpdGVyYWwgcG9vbCB0byBiZQotZHVtcGVkIGludG8gdGhlIGN1cnJlbnQgc2VjdGlvbiAod2hpY2ggaXMgYXNzdW1lZCB0byBiZSB0aGUgLnRleHQKLXNlY3Rpb24pIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uIChhbGlnbmVkIHRvIGEgd29yZCBib3VuZGFyeSkuCi0KLUBjaW5kZXggQGNvZGV7LnBvb2x9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAucG9vbAotVGhpcyBpcyBhIHN5bm9ueW0gZm9yIC5sdG9yZy4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBBUk0gT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IEFSTSBvcGNvZGVzCi1AY2luZGV4IG9wY29kZXMgZm9yIEFSTQotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEFSTSBvcGNvZGVzLiAgSXQgYWxzbwotaW1wbGVtZW50cyBzZXZlcmFsIHBzZXVkbyBvcGNvZGVzLCBpbmNsdWRpbmcgc2V2ZXJhbCBzeW50aGV0aWMgbG9hZAotaW5zdHJ1Y3Rpb25zLiAKLQotQHRhYmxlIEBjb2RlCi0KLUBjaW5kZXggQGNvZGV7Tk9QfSBwc2V1ZG8gb3AsIEFSTQotQGl0ZW0gTk9QCi1Ac21hbGxleGFtcGxlCi0gIG5vcAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhpcyBwc2V1ZG8gb3Agd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gYSBsZWdhbCBBUk0gaW5zdHJ1Y3Rpb24gdGhhdCBkb2VzCi1ub3RoaW5nLiAgQ3VycmVudGx5IGl0IHdpbGwgZXZhbHVhdGUgdG8gTU9WIHIwLCByMC4KLQotQGNpbmRleCBAY29kZXtMRFIgcmVnLD08bGFiZWw+fSBwc2V1ZG8gb3AsIEFSTQotQGl0ZW0gTERSIAotQHNtYWxsZXhhbXBsZQotICBsZHIgPHJlZ2lzdGVyPiAsID0gPGV4cHJlc3Npb24+Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1JZiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIG51bWVyaWMgY29uc3RhbnQgdGhlbiBhIE1PViBvciBNVk4KLWluc3RydWN0aW9uIHdpbGwgYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgTERSIGluc3RydWN0aW9uLCBpZiB0aGUKLWNvbnN0YW50IGNhbiBiZSBnZW5lcmF0ZWQgYnkgZWl0aGVyIG9mIHRoZXNlIGluc3RydWN0aW9ucy4gIE90aGVyd2lzZQotdGhlIGNvbnN0YW50IHdpbGwgYmUgcGxhY2VkIGludG8gdGhlIG5lYXJlc3QgbGl0ZXJhbCBwb29sIChpZiBpdCBub3QKLWFscmVhZHkgdGhlcmUpIGFuZCBhIFBDIHJlbGF0aXZlIExEUiBpbnN0cnVjdGlvbiB3aWxsIGJlIGdlbmVyYXRlZC4KLQotQGNpbmRleCBAY29kZXtBRFIgcmVnLDxsYWJlbD59IHBzZXVkbyBvcCwgQVJNCi1AaXRlbSBBRFIKLUBzbWFsbGV4YW1wbGUKLSAgYWRyIDxyZWdpc3Rlcj4gPGxhYmVsPgotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhpcyBpbnN0cnVjdGlvbiB3aWxsIGxvYWQgdGhlIGFkZHJlc3Mgb2YgQHZhcntsYWJlbH0gaW50byB0aGUgaW5kaWNhdGVkCi1yZWdpc3Rlci4gIFRoZSBpbnN0cnVjdGlvbiB3aWxsIGV2YWx1YXRlIHRvIGEgUEMgcmVsYXRpdmUgQUREIG9yIFNVQgotaW5zdHJ1Y3Rpb24gZGVwZW5kaW5nIHVwb24gd2hlcmUgdGhlIGxhYmVsIGlzIGxvY2F0ZWQuICBJZiB0aGUgbGFiZWwgaXMKLW91dCBvZiByYW5nZSwgb3IgaWYgaXQgaXMgbm90IGRlZmluZWQgaW4gdGhlIHNhbWUgZmlsZSAoYW5kIHNlY3Rpb24pIGFzCi10aGUgQURSIGluc3RydWN0aW9uLCB0aGVuIGFuIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkLiAgVGhpcyBpbnN0cnVjdGlvbgotd2lsbCBub3QgbWFrZSB1c2Ugb2YgdGhlIGxpdGVyYWwgcG9vbC4KLQotQGNpbmRleCBAY29kZXtBRFJMIHJlZyw8bGFiZWw+fSBwc2V1ZG8gb3AsIEFSTQotQGl0ZW0gQURSTCAKLUBzbWFsbGV4YW1wbGUKLSAgYWRybCA8cmVnaXN0ZXI+IDxsYWJlbD4KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCBsb2FkIHRoZSBhZGRyZXNzIG9mIEB2YXJ7bGFiZWx9IGludG8gdGhlIGluZGljYXRlZAotcmVnaXN0ZXIuICBUaGUgaW5zdHJ1Y3Rpb24gd2lsbCBldmFsdWF0ZSB0byBvbmUgb3IgdHdvIGEgUEMgcmVsYXRpdmUgQURECi1vciBTVUIgaW5zdHJ1Y3Rpb25zIGRlcGVuZGluZyB1cG9uIHdoZXJlIHRoZSBsYWJlbCBpcyBsb2NhdGVkLiAgSWYgYQotc2Vjb25kIGluc3RydWN0aW9uIGlzIG5vdCBuZWVkZWQgYSBOT1AgaW5zdHJ1Y3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQgaW4KLWl0cyBwbGFjZSwgc28gdGhhdCB0aGlzIGluc3RydWN0aW9uIGlzIGFsd2F5cyA4IGJ5dGVzIGxvbmcuCi0KLUlmIHRoZSBsYWJlbCBpcyBvdXQgb2YgcmFuZ2UsIG9yIGlmIGl0IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBzYW1lIGZpbGUKLShhbmQgc2VjdGlvbikgYXMgdGhlIEFEUkwgaW5zdHJ1Y3Rpb24sIHRoZW4gYW4gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQuCi1UaGlzIGluc3RydWN0aW9uIHdpbGwgbm90IG1ha2UgdXNlIG9mIHRoZSBsaXRlcmFsIHBvb2wuCi0KLUBlbmQgdGFibGUKLQotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBBUk0gb3IgVGh1bWIgaW5zdHJ1Y3Rpb24gc2V0cywgc2VlIEBjaXRle0FSTQotU29mdHdhcmUgRGV2ZWxvcG1lbnQgVG9vbGtpdCBSZWZlcmVuY2UgTWFudWFsfSwgQWR2YW5jZWQgUklTQyBNYWNoaW5lcwotTHRkLgotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtZDEwdi50ZXhpIGIvZ2FzL2RvYy9jLWQxMHYudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3YmY4OC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtZDEwdi50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBEMTBWLURlcGVuZGVudAotQGNoYXB0ZXIgRDEwViBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBEMTBWIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggRDEwViBzdXBwb3J0Ci1AbWVudQotKiBEMTBWLU9wdHM6OiAgICAgICAgICAgICAgICAgICBEMTBWIE9wdGlvbnMKLSogRDEwVi1TeW50YXg6OiAgICAgICAgICAgICAgICAgU3ludGF4Ci0qIEQxMFYtRmxvYXQ6OiAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEQxMFYtT3Bjb2Rlczo6ICAgICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBEMTBWLU9wdHMKLUBzZWN0aW9uIEQxMFYgT3B0aW9ucwotQGNpbmRleCBvcHRpb25zLCBEMTBWCi1AY2luZGV4IEQxMFYgb3B0aW9ucwotVGhlIE1pdHN1YmlzaGkgRDEwViB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGhhcyBhIGZldyBtYWNoaW5lCi1kZXBlbmRlbnQgb3B0aW9ucy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSAtTwotVGhlIEQxMFYgY2FuIG9mdGVuIGV4ZWN1dGUgdHdvIHN1Yi1pbnN0cnVjdGlvbnMgaW4gcGFyYWxsZWwuIFdoZW4gdGhpcyBvcHRpb24KLWlzIHVzZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYXR0ZW1wdCB0byBvcHRpbWl6ZSBpdHMgb3V0cHV0IGJ5IGRldGVjdGluZyB3aGVuCi1pbnN0cnVjdGlvbnMgY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLgotQGl0ZW0gLS1ub3dhcm5zd2FwCi1UbyBvcHRpbWl6ZSBleGVjdXRpb24gcGVyZm9ybWFuY2UsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgc29tZXRpbWVzIHN3YXAgdGhlCi1vcmRlciBvZiBpbnN0cnVjdGlvbnMuIE5vcm1hbGx5IHRoaXMgZ2VuZXJhdGVzIGEgd2FybmluZy4gV2hlbiB0aGlzIG9wdGlvbiAKLWlzIHVzZWQsIG5vIHdhcm5pbmcgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBpbnN0cnVjdGlvbnMgYXJlIHN3YXBwZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEQxMFYtU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBjaW5kZXggRDEwViBzeW50YXgKLUBjaW5kZXggc3ludGF4LCBEMTBWCi0KLVRoZSBEMTBWIHN5bnRheCBpcyBiYXNlZCBvbiB0aGUgc3ludGF4IGluIE1pdHN1YmlzaGkncyBEMTBWIGFyY2hpdGVjdHVyZSBtYW51YWwuCi1UaGUgZGlmZmVyZW5jZXMgYXJlIGRldGFpbGVkIGJlbG93LgotCi1AbWVudQotKiBEMTBWLVNpemU6OiAgICAgICAgICAgICAgICAgU2l6ZSBNb2RpZmllcnMKLSogRDEwVi1TdWJzOjogICAgICAgICAgICAgICAgIFN1Yi1JbnN0cnVjdGlvbnMKLSogRDEwVi1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBEMTBWLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLSogRDEwVi1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKLSogRDEwVi1Xb3JkOjogICAgICAgICAgICAgICAgIEBAV09SRCBNb2RpZmllcgotQGVuZCBtZW51Ci0KLQotQG5vZGUgRDEwVi1TaXplCi1Ac3Vic2VjdGlvbiBTaXplIE1vZGlmaWVycwotQGNpbmRleCBEMTBWIHNpemUgbW9kaWZpZXJzCi1AY2luZGV4IHNpemUgbW9kaWZpZXJzLCBEMTBWCi1UaGUgRDEwViB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHVzZXMgdGhlIGluc3RydWN0aW9uIG5hbWVzIGluIHRoZSBEMTBWCi1BcmNoaXRlY3R1cmUgTWFudWFsLiAgSG93ZXZlciwgdGhlIG5hbWVzIGluIHRoZSBtYW51YWwgYXJlIHNvbWV0aW1lcyBhbWJpZ3VvdXMuCi1UaGVyZSBhcmUgaW5zdHJ1Y3Rpb24gbmFtZXMgdGhhdCBjYW4gYXNzZW1ibGUgdG8gYSBzaG9ydCBvciBsb25nIGZvcm0gb3Bjb2RlLgotSG93IGRvZXMgdGhlIGFzc2VtYmxlciBwaWNrIHRoZSBjb3JyZWN0IGZvcm0/ICBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGFsd2F5cyBwaWNrIHRoZQotc21hbGxlc3QgZm9ybSBpZiBpdCBjYW4uICBXaGVuIGRlYWxpbmcgd2l0aCBhIHN5bWJvbCB0aGF0IGlzIG5vdCBkZWZpbmVkIHlldCB3aGVuIGEKLWxpbmUgaXMgYmVpbmcgYXNzZW1ibGVkLCBpdCB3aWxsIGFsd2F5cyB1c2UgdGhlIGxvbmcgZm9ybS4gIElmIHlvdSBuZWVkIHRvIGZvcmNlIHRoZSAKLWFzc2VtYmxlciB0byB1c2UgZWl0aGVyIHRoZSBzaG9ydCBvciBsb25nIGZvcm0gb2YgdGhlIGluc3RydWN0aW9uLCB5b3UgY2FuIGFwcGVuZAotZWl0aGVyIEBzYW1wey5zfSAoc2hvcnQpIG9yIEBzYW1wey5sfSAobG9uZykgdG8gaXQuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB3cml0aW5nIAotYW4gYXNzZW1ibHkgcHJvZ3JhbSBhbmQgeW91IHdhbnQgdG8gZG8gYSBicmFuY2ggdG8gYSBzeW1ib2wgdGhhdCBpcyBkZWZpbmVkIGxhdGVyCi1pbiB5b3VyIHByb2dyYW0sIHlvdSBjYW4gd3JpdGUgQHNhbXB7YnJhLnMgICBmb299LiAgCi1PYmpkdW1wIGFuZCBHREIgd2lsbCBhbHdheXMgYXBwZW5kIEBzYW1wey5zfSBvciBAc2FtcHsubH0gdG8gaW5zdHJ1Y3Rpb25zIHdoaWNoCi1oYXZlIGJvdGggc2hvcnQgYW5kIGxvbmcgZm9ybXMuCi0KLUBub2RlIEQxMFYtU3VicwotQHN1YnNlY3Rpb24gU3ViLUluc3RydWN0aW9ucwotQGNpbmRleCBEMTBWIHN1Yi1pbnN0cnVjdGlvbnMKLUBjaW5kZXggc3ViLWluc3RydWN0aW9ucywgRDEwVgotVGhlIEQxMFYgYXNzZW1ibGVyIHRha2VzIGFzIGlucHV0IGEgc2VyaWVzIG9mIGluc3RydWN0aW9ucywgZWl0aGVyIG9uZS1wZXItbGluZSwKLW9yIGluIHRoZSBzcGVjaWFsIHR3by1wZXItbGluZSBmb3JtYXQgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uICBTb21lIG9mIHRoZXNlCi1pbnN0cnVjdGlvbnMgd2lsbCBiZSBzaG9ydC1mb3JtIG9yIHN1Yi1pbnN0cnVjdGlvbnMuICBUaGVzZSBzdWItaW5zdHJ1Y3Rpb25zIGNhbiBiZSBwYWNrZWQKLWludG8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uICBUaGUgYXNzZW1ibGVyIHdpbGwgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LiAgSXQgd2lsbCBhbHNvIGRldGVjdAotd2hlbiBpdCBzaG91bGQgbm90IHBhY2sgaW5zdHJ1Y3Rpb25zLiAgRm9yIGV4YW1wbGUsIHdoZW4gYSBsYWJlbCBpcyBkZWZpbmVkLCB0aGUgbmV4dAotaW5zdHJ1Y3Rpb24gd2lsbCBuZXZlciBiZSBwYWNrYWdlZCB3aXRoIHRoZSBwcmV2aW91cyBvbmUuICBXaGVuZXZlciBhIGJyYW5jaCBhbmQgbGluawotaW5zdHJ1Y3Rpb24gaXMgY2FsbGVkLCBpdCB3aWxsIG5vdCBiZSBwYWNrYWdlZCB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uIHNvIHRoZSByZXR1cm4KLWFkZHJlc3Mgd2lsbCBiZSB2YWxpZC4gIE5vcHMgYXJlIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgd2hlbiBuZWNlc3NhcnkuCi0KLUlmIHlvdSBkbyBub3Qgd2FudCB0aGUgYXNzZW1ibGVyIGF1dG9tYXRpY2FsbHkgbWFraW5nIHRoZXNlIGRlY2lzaW9ucywgeW91IGNhbiBjb250cm9sCi10aGUgcGFja2FnaW5nIGFuZCBleGVjdXRpb24gdHlwZSAocGFyYWxsZWwgb3Igc2VxdWVudGlhbCkgd2l0aCB0aGUgc3BlY2lhbCBleGVjdXRpb24gCi1zeW1ib2xzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLiAgCi0KLUBub2RlIEQxMFYtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBEMTBWCi1AY2luZGV4IEQxMFYgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7O30gYW5kIEBzYW1weyN9IGFyZSB0aGUgbGluZSBjb21tZW50IGNoYXJhY3RlcnMuCi1AY2luZGV4IHN1Yi1pbnN0cnVjdGlvbiBvcmRlcmluZywgRDEwVgotQGNpbmRleCBEMTBWIHN1Yi1pbnN0cnVjdGlvbiBvcmRlcmluZwotU3ViLWluc3RydWN0aW9ucyBtYXkgYmUgZXhlY3V0ZWQgaW4gb3JkZXIsIGluIHJldmVyc2Utb3JkZXIsIG9yIGluIHBhcmFsbGVsLgotSW5zdHJ1Y3Rpb25zIGxpc3RlZCBpbiB0aGUgc3RhbmRhcmQgb25lLXBlci1saW5lIGZvcm1hdCB3aWxsIGJlIGV4ZWN1dGVkIHNlcXVlbnRpYWxseS4KLVRvIHNwZWNpZnkgdGhlIGV4ZWN1dGluZyBvcmRlciwgdXNlIHRoZSBmb2xsb3dpbmcgc3ltYm9sczogCi1AdGFibGUgQHNhbXAKLUBpdGVtIC0+Ci1TZXF1ZW50aWFsIHdpdGggaW5zdHJ1Y3Rpb24gb24gdGhlIGxlZnQgZmlyc3QuCi1AaXRlbSA8LQotU2VxdWVudGlhbCB3aXRoIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBmaXJzdC4KLUBpdGVtIHx8Ci1QYXJhbGxlbAotQGVuZCB0YWJsZQotVGhlIEQxMFYgc3ludGF4IGFsbG93cyBlaXRoZXIgb25lIGluc3RydWN0aW9uIHBlciBsaW5lLCBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGxpbmUgd2l0aAotdGhlIGV4ZWN1dGlvbiBzeW1ib2wsIG9yIHR3byBpbnN0cnVjdGlvbnMgcGVyIGxpbmUuICBGb3IgZXhhbXBsZQotQHRhYmxlIEBjb2RlCi1AaXRlbSBhYnMgICAgICAgYTEgICAgICAtPiAgICAgIGFicyAgICAgcjAKLUV4ZWN1dGUgdGhlc2Ugc2VxdWVudGlhbGx5LiAgVGhlIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBpcyBpbiB0aGUgcmlnaHQKLWNvbnRhaW5lciBhbmQgaXMgZXhlY3V0ZWQgc2Vjb25kLgotQGl0ZW0gYWJzICAgICAgIHIwICAgICAgPC0gICAgICBhYnMgICAgIGExCi1FeGVjdXRlIHRoZXNlIHJldmVyc2Utc2VxdWVudGlhbGx5LiAgVGhlIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBpcyBpbiB0aGUgcmlnaHQKLWNvbnRhaW5lciwgYW5kIGlzIGV4ZWN1dGVkIGZpcnN0LgotQGl0ZW0gbGQydyAgICByMixAQHI4KyAgICAgICAgIHx8ICAgICAgbWFjICAgICBhMCxyMCxyNwotRXhlY3V0ZSB0aGVzZSBpbiBwYXJhbGxlbC4KLUBpdGVtIGxkMncgICAgcjIsQEByOCsgICAgICAgICB8fCAgICAgIAotQGl0ZW14IG1hYyAgICAgYTAscjAscjcKLVR3by1saW5lIGZvcm1hdC4gRXhlY3V0ZSB0aGVzZSBpbiBwYXJhbGxlbC4KLUBpdGVtIGxkMncgICAgcjIsQEByOCsgICAgICAgICAKLUBpdGVteCBtYWMgICAgIGEwLHIwLHI3Ci1Ud28tbGluZSBmb3JtYXQuIEV4ZWN1dGUgdGhlc2Ugc2VxdWVudGlhbGx5LiAgQXNzZW1ibGVyIHdpbGwKLXB1dCB0aGVtIGluIHRoZSBwcm9wZXIgY29udGFpbmVycy4KLUBpdGVtIGxkMncgICAgcjIsQEByOCsgICAgICAgICAtPgotQGl0ZW14IG1hYyAgICAgYTAscjAscjcKLVR3by1saW5lIGZvcm1hdC4gRXhlY3V0ZSB0aGVzZSBzZXF1ZW50aWFsbHkuICBTYW1lIGFzIGFib3ZlIGJ1dAotc2Vjb25kIGluc3RydWN0aW9uIHdpbGwgYWx3YXlzIGdvIGludG8gcmlnaHQgY29udGFpbmVyLiAgCi1AZW5kIHRhYmxlCi1AY2luZGV4IHN5bWJvbCBuYW1lcywgQHNhbXB7JH0gaW4KLUBjaW5kZXggQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzCi1TaW5jZSBAc2FtcHskfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLCB5b3UgbWF5IHVzZSBpdCBpbiBzeW1ib2wgbmFtZXMuCi0KLUBub2RlIEQxMFYtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLUBjaW5kZXggRDEwViByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXJzLCBEMTBWCi1Zb3UgY2FuIHVzZSB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIEBzYW1we3IwfSB0aHJvdWdoIEBzYW1we3IxNX0gdG8gcmVmZXIgdG8gdGhlIEQxMFYgCi1yZWdpc3RlcnMuICBZb3UgY2FuIGFsc28gdXNlIEBzYW1we3NwfSBhcyBhbiBhbGlhcyBmb3IgQHNhbXB7cjE1fS4gIFRoZSBhY2N1bXVsYXRvcnMKLWFyZSBAc2FtcHthMH0gYW5kIEBzYW1we2ExfS4gIFRoZXJlIGFyZSBzcGVjaWFsIHJlZ2lzdGVyLXBhaXIgbmFtZXMgdGhhdCBtYXkgCi1vcHRpb25hbGx5IGJlIHVzZWQgaW4gb3Bjb2RlcyB0aGF0IHJlcXVpcmUgZXZlbi1udW1iZXJlZCByZWdpc3RlcnMuIFJlZ2lzdGVyIG5hbWVzIGFyZSAKLW5vdCBjYXNlIHNlbnNpdGl2ZS4gIAotCi1SZWdpc3RlciBQYWlycwotQHRhYmxlIEBjb2RlCi1AaXRlbSByMC1yMQotQGl0ZW0gcjItcjMKLUBpdGVtIHI0LXI1Ci1AaXRlbSByNi1yNwotQGl0ZW0gcjgtcjkKLUBpdGVtIHIxMC1yMTEKLUBpdGVtIHIxMi1yMTMKLUBpdGVtIHIxNC1yMTUKLUBlbmQgdGFibGUKLQotVGhlIEQxMFYgYWxzbyBoYXMgcHJlZGVmaW5lZCBzeW1ib2xzIGZvciB0aGVzZSBjb250cm9sIHJlZ2lzdGVycyBhbmQgc3RhdHVzIGJpdHM6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIHBzdwotUHJvY2Vzc29yIFN0YXR1cyBXb3JkCi1AaXRlbSBicHN3Ci1CYWNrdXAgUHJvY2Vzc29yIFN0YXR1cyBXb3JkCi1AaXRlbSBwYwotUHJvZ3JhbSBDb3VudGVyCi1AaXRlbSBicGMKLUJhY2t1cCBQcm9ncmFtIENvdW50ZXIKLUBpdGVtIHJwdF9jCi1SZXBlYXQgQ291bnQKLUBpdGVtIHJwdF9zCi1SZXBlYXQgU3RhcnQgYWRkcmVzcwotQGl0ZW0gcnB0X2UKLVJlcGVhdCBFbmQgYWRkcmVzcwotQGl0ZW0gbW9kX3MKLU1vZHVsbyBTdGFydCBhZGRyZXNzCi1AaXRlbSBtb2RfZQotTW9kdWxvIEVuZCBhZGRyZXNzCi1AaXRlbSBpYmEKLUluc3RydWN0aW9uIEJyZWFrIEFkZHJlc3MKLUBpdGVtIGYwCi1GbGFnIDAKLUBpdGVtIGYxCi1GbGFnIDEKLUBpdGVtIGMKLUNhcnJ5IGZsYWcKLUBlbmQgdGFibGUKLSAgICAgICAgCi1Abm9kZSBEMTBWLUFkZHJlc3NpbmcKLUBzdWJzZWN0aW9uIEFkZHJlc3NpbmcgTW9kZXMKLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgRDEwVgotQGNpbmRleCBEMTBWIGFkZHJlc3NpbmcgbW9kZXMKLUBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIEQxMFYuCi1AY29kZXtSQHZhcntufX0gaW4gdGhlIGZvbGxvd2luZyByZWZlcnMgdG8gYW55IG9mIHRoZSBudW1iZXJlZAotcmVnaXN0ZXJzLCBidXQgQGVtcGh7bm90fSB0aGUgY29udHJvbCByZWdpc3RlcnMuCi1AdGFibGUgQGNvZGUKLUBpdGVtIFJAdmFye259Ci1SZWdpc3RlciBkaXJlY3QKLUBpdGVtIEBAUkB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0Ci1AaXRlbSBAQFJAdmFye259KwotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWluY3JlbWVudAotQGl0ZW0gQEBSQHZhcntufS0KLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1kZWNyZW1lbnQKLUBpdGVtIEBALVNQCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHByZS1kZWNyZW1lbnQKLUBpdGVtIEBAKEB2YXJ7ZGlzcH0sIFJAdmFye259KQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKLUBpdGVtIEB2YXJ7YWRkcn0KLVBDIHJlbGF0aXZlIGFkZHJlc3MgKGZvciBicmFuY2ggb3IgcmVwKS4gCi1AaXRlbSAjQHZhcntpbW19Ci1JbW1lZGlhdGUgZGF0YSAodGhlIEBzYW1weyN9IGlzIG9wdGlvbmFsIGFuZCBpZ25vcmVkKQotQGVuZCB0YWJsZQotCi1Abm9kZSBEMTBWLVdvcmQKLUBzdWJzZWN0aW9uIEBAV09SRCBNb2RpZmllcgotQGNpbmRleCBEMTBWIEBAd29yZCBtb2RpZmllcgotQGNpbmRleCBAQHdvcmQgbW9kaWZpZXIsIEQxMFYKLUFueSBzeW1ib2wgZm9sbG93ZWQgYnkgQGNvZGV7QEB3b3JkfSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBzeW1ib2wncyB2YWx1ZQotc2hpZnRlZCByaWdodCBieSAyLiAgVGhpcyBpcyB1c2VkIGluIHNpdHVhdGlvbnMgc3VjaCBhcyBsb2FkaW5nIGEgcmVnaXN0ZXIKLXdpdGggdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiAob3IgYW55IG90aGVyIGNvZGUgZnJhZ21lbnQpLiAgRm9yIGV4YW1wbGUsIGlmCi15b3Ugd2FudCB0byBsb2FkIGEgcmVnaXN0ZXIgd2l0aCB0aGUgbG9jYXRpb24gb2YgdGhlIGZ1bmN0aW9uIEBjb2Rle21haW59IHRoZW4KLWp1bXAgdG8gdGhhdCBmdW5jdGlvbiwgeW91IGNvdWxkIGRvIGl0IGFzIGZvbGx3czoKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotbGRpICAgICByMiwgbWFpbkBAd29yZAotam1wICAgICByMgotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgRDEwVi1GbG9hdAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEQxMFYKLUBjaW5kZXggRDEwViBmbG9hdGluZyBwb2ludAotVGhlIEQxMFYgaGFzIG5vIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgdGhlIEBjb2Rley5mbG9hdH0gYW5kIEBjb2Rley5kb3VibGV9Ci1kaXJlY3RpdmVzIGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBvdGhlciBkZXZlbG9wbWVudCB0b29scy4gCi0KLUBub2RlIEQxMFYtT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotQGNpbmRleCBEMTBWIG9wY29kZSBzdW1tYXJ5Ci1AY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBEMTBWCi1AY2luZGV4IG1uZW1vbmljcywgRDEwVgotQGNpbmRleCBpbnN0cnVjdGlvbiBzdW1tYXJ5LCBEMTBWCi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEQxMFYgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7RDEwViBBcmNoaXRlY3R1cmU6IEEgVkxJVyBNaWNyb3Byb2Nlc3NvciBmb3IgTXVsdGltZWRpYSBBcHBsaWNhdGlvbnN9IAotKE1pdHN1YmlzaGkgRWxlY3RyaWMgQ29ycC4pLgotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEQxMFYgb3Bjb2Rlcy4gIFRoZSBvbmx5IGNoYW5nZXMgYXJlIHRob3NlCi1kZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gb24gc2l6ZSBtb2RpZmllcnMKLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWQzMHYudGV4aSBiL2dhcy9kb2MvYy1kMzB2LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMWIzNDQuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWQzMHYudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgRDMwVi1EZXBlbmRlbnQKLUBjaGFwdGVyIEQzMFYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgRDMwViBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IEQzMFYgc3VwcG9ydAotQG1lbnUKLSogRDMwVi1PcHRzOjogICAgICAgICAgICAgICAgICAgRDMwViBPcHRpb25zCi0qIEQzMFYtU3ludGF4OjogICAgICAgICAgICAgICAgIFN5bnRheAotKiBEMzBWLUZsb2F0OjogICAgICAgICAgICAgICAgICBGbG9hdGluZyBQb2ludAotKiBEMzBWLU9wY29kZXM6OiAgICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgRDMwVi1PcHRzCi1Ac2VjdGlvbiBEMzBWIE9wdGlvbnMKLUBjaW5kZXggb3B0aW9ucywgRDMwVgotQGNpbmRleCBEMzBWIG9wdGlvbnMKLVRoZSBNaXRzdWJpc2hpIEQzMFYgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYSBmZXcgbWFjaGluZQotZGVwZW5kZW50IG9wdGlvbnMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gLU8KLVRoZSBEMzBWIGNhbiBvZnRlbiBleGVjdXRlIHR3byBzdWItaW5zdHJ1Y3Rpb25zIGluIHBhcmFsbGVsLiBXaGVuIHRoaXMgb3B0aW9uCi1pcyB1c2VkLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGF0dGVtcHQgdG8gb3B0aW1pemUgaXRzIG91dHB1dCBieSBkZXRlY3Rpbmcgd2hlbgotaW5zdHJ1Y3Rpb25zIGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4KLQotQGl0ZW0gLW4KLVdoZW4gdGhpcyBvcHRpb24gaXMgdXNlZCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBpc3N1ZSBhIHdhcm5pbmcgZXZlcnkKLXRpbWUgaXQgYWRkcyBhIG5vcCBpbnN0cnVjdGlvbi4KLQotQGl0ZW0gLU4KLVdoZW4gdGhpcyBvcHRpb24gaXMgdXNlZCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBpc3N1ZSBhIHdhcm5pbmcgaWYgaXQKLW5lZWRzIHRvIGluc2VydCBhIG5vcCBhZnRlciBhIDMyLWJpdCBtdWx0aXBseSBiZWZvcmUgYSBsb2FkIG9yIDE2LWJpdAotbXVsdGlwbHkgaW5zdHJ1Y3Rpb24uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEQzMFYtU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBjaW5kZXggRDMwViBzeW50YXgKLUBjaW5kZXggc3ludGF4LCBEMzBWCi0KLVRoZSBEMzBWIHN5bnRheCBpcyBiYXNlZCBvbiB0aGUgc3ludGF4IGluIE1pdHN1YmlzaGkncyBEMzBWIGFyY2hpdGVjdHVyZSBtYW51YWwuCi1UaGUgZGlmZmVyZW5jZXMgYXJlIGRldGFpbGVkIGJlbG93LgotCi1AbWVudQotKiBEMzBWLVNpemU6OiAgICAgICAgICAgICAgICAgU2l6ZSBNb2RpZmllcnMKLSogRDMwVi1TdWJzOjogICAgICAgICAgICAgICAgIFN1Yi1JbnN0cnVjdGlvbnMKLSogRDMwVi1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBEMzBWLUd1YXJkZWQ6OiAgICAgICAgICAgICAgR3VhcmRlZCBFeGVjdXRpb24KLSogRDMwVi1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi0qIEQzMFYtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCi1AZW5kIG1lbnUKLQotCi1Abm9kZSBEMzBWLVNpemUKLUBzdWJzZWN0aW9uIFNpemUgTW9kaWZpZXJzCi1AY2luZGV4IEQzMFYgc2l6ZSBtb2RpZmllcnMKLUBjaW5kZXggc2l6ZSBtb2RpZmllcnMsIEQzMFYKLVRoZSBEMzBWIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gdXNlcyB0aGUgaW5zdHJ1Y3Rpb24gbmFtZXMgaW4gdGhlIEQzMFYKLUFyY2hpdGVjdHVyZSBNYW51YWwuICBIb3dldmVyLCB0aGUgbmFtZXMgaW4gdGhlIG1hbnVhbCBhcmUgc29tZXRpbWVzIGFtYmlndW91cy4KLVRoZXJlIGFyZSBpbnN0cnVjdGlvbiBuYW1lcyB0aGF0IGNhbiBhc3NlbWJsZSB0byBhIHNob3J0IG9yIGxvbmcgZm9ybSBvcGNvZGUuCi1Ib3cgZG9lcyB0aGUgYXNzZW1ibGVyIHBpY2sgdGhlIGNvcnJlY3QgZm9ybT8gIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYWx3YXlzIHBpY2sgdGhlCi1zbWFsbGVzdCBmb3JtIGlmIGl0IGNhbi4gIFdoZW4gZGVhbGluZyB3aXRoIGEgc3ltYm9sIHRoYXQgaXMgbm90IGRlZmluZWQgeWV0IHdoZW4gYQotbGluZSBpcyBiZWluZyBhc3NlbWJsZWQsIGl0IHdpbGwgYWx3YXlzIHVzZSB0aGUgbG9uZyBmb3JtLiAgSWYgeW91IG5lZWQgdG8gZm9yY2UgdGhlIAotYXNzZW1ibGVyIHRvIHVzZSBlaXRoZXIgdGhlIHNob3J0IG9yIGxvbmcgZm9ybSBvZiB0aGUgaW5zdHJ1Y3Rpb24sIHlvdSBjYW4gYXBwZW5kCi1laXRoZXIgQHNhbXB7LnN9IChzaG9ydCkgb3IgQHNhbXB7Lmx9IChsb25nKSB0byBpdC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHdyaXRpbmcgCi1hbiBhc3NlbWJseSBwcm9ncmFtIGFuZCB5b3Ugd2FudCB0byBkbyBhIGJyYW5jaCB0byBhIHN5bWJvbCB0aGF0IGlzIGRlZmluZWQgbGF0ZXIKLWluIHlvdXIgcHJvZ3JhbSwgeW91IGNhbiB3cml0ZSBAc2FtcHticmEucyBmb299LiAKLU9iamR1bXAgYW5kIEdEQiB3aWxsIGFsd2F5cyBhcHBlbmQgQHNhbXB7LnN9IG9yIEBzYW1wey5sfSB0byBpbnN0cnVjdGlvbnMgd2hpY2gKLWhhdmUgYm90aCBzaG9ydCBhbmQgbG9uZyBmb3Jtcy4KLQotQG5vZGUgRDMwVi1TdWJzCi1Ac3Vic2VjdGlvbiBTdWItSW5zdHJ1Y3Rpb25zCi1AY2luZGV4IEQzMFYgc3ViLWluc3RydWN0aW9ucwotQGNpbmRleCBzdWItaW5zdHJ1Y3Rpb25zLCBEMzBWCi1UaGUgRDMwViBhc3NlbWJsZXIgdGFrZXMgYXMgaW5wdXQgYSBzZXJpZXMgb2YgaW5zdHJ1Y3Rpb25zLCBlaXRoZXIgb25lLXBlci1saW5lLAotb3IgaW4gdGhlIHNwZWNpYWwgdHdvLXBlci1saW5lIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4gIFNvbWUgb2YgdGhlc2UKLWluc3RydWN0aW9ucyB3aWxsIGJlIHNob3J0LWZvcm0gb3Igc3ViLWluc3RydWN0aW9ucy4gIFRoZXNlIHN1Yi1pbnN0cnVjdGlvbnMgY2FuIGJlIHBhY2tlZAotaW50byBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gIFRoZSBhc3NlbWJsZXIgd2lsbCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkuICBJdCB3aWxsIGFsc28gZGV0ZWN0Ci13aGVuIGl0IHNob3VsZCBub3QgcGFjayBpbnN0cnVjdGlvbnMuICBGb3IgZXhhbXBsZSwgd2hlbiBhIGxhYmVsIGlzIGRlZmluZWQsIHRoZSBuZXh0Ci1pbnN0cnVjdGlvbiB3aWxsIG5ldmVyIGJlIHBhY2thZ2VkIHdpdGggdGhlIHByZXZpb3VzIG9uZS4gIFdoZW5ldmVyIGEgYnJhbmNoIGFuZCBsaW5rCi1pbnN0cnVjdGlvbiBpcyBjYWxsZWQsIGl0IHdpbGwgbm90IGJlIHBhY2thZ2VkIHdpdGggdGhlIG5leHQgaW5zdHJ1Y3Rpb24gc28gdGhlIHJldHVybgotYWRkcmVzcyB3aWxsIGJlIHZhbGlkLiAgTm9wcyBhcmUgYXV0b21hdGljYWxseSBpbnNlcnRlZCB3aGVuIG5lY2Vzc2FyeS4KLQotSWYgeW91IGRvIG5vdCB3YW50IHRoZSBhc3NlbWJsZXIgYXV0b21hdGljYWxseSBtYWtpbmcgdGhlc2UgZGVjaXNpb25zLCB5b3UgY2FuIGNvbnRyb2wKLXRoZSBwYWNrYWdpbmcgYW5kIGV4ZWN1dGlvbiB0eXBlIChwYXJhbGxlbCBvciBzZXF1ZW50aWFsKSB3aXRoIHRoZSBzcGVjaWFsIGV4ZWN1dGlvbiAKLXN5bWJvbHMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uICAKLQotQG5vZGUgRDMwVi1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEQzMFYKLUBjaW5kZXggRDMwViBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHs7fSBhbmQgQHNhbXB7I30gYXJlIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVycy4KLUBjaW5kZXggc3ViLWluc3RydWN0aW9uIG9yZGVyaW5nLCBEMzBWCi1AY2luZGV4IEQzMFYgc3ViLWluc3RydWN0aW9uIG9yZGVyaW5nCi1TdWItaW5zdHJ1Y3Rpb25zIG1heSBiZSBleGVjdXRlZCBpbiBvcmRlciwgaW4gcmV2ZXJzZS1vcmRlciwgb3IgaW4gcGFyYWxsZWwuCi1JbnN0cnVjdGlvbnMgbGlzdGVkIGluIHRoZSBzdGFuZGFyZCBvbmUtcGVyLWxpbmUgZm9ybWF0IHdpbGwgYmUgZXhlY3V0ZWQKLXNlcXVlbnRpYWxseSB1bmxlc3MgeW91IHVzZSB0aGUgQHNhbXB7LU99IG9wdGlvbi4KLQotVG8gc3BlY2lmeSB0aGUgZXhlY3V0aW5nIG9yZGVyLCB1c2UgdGhlIGZvbGxvd2luZyBzeW1ib2xzOiAKLUB0YWJsZSBAc2FtcAotQGl0ZW0gLT4KLVNlcXVlbnRpYWwgd2l0aCBpbnN0cnVjdGlvbiBvbiB0aGUgbGVmdCBmaXJzdC4KLQotQGl0ZW0gPC0KLVNlcXVlbnRpYWwgd2l0aCBpbnN0cnVjdGlvbiBvbiB0aGUgcmlnaHQgZmlyc3QuCi0KLUBpdGVtIHx8Ci1QYXJhbGxlbAotQGVuZCB0YWJsZQotCi1UaGUgRDMwViBzeW50YXggYWxsb3dzIGVpdGhlciBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGxpbmUsIG9uZSBpbnN0cnVjdGlvbiBwZXIgbGluZSB3aXRoCi10aGUgZXhlY3V0aW9uIHN5bWJvbCwgb3IgdHdvIGluc3RydWN0aW9ucyBwZXIgbGluZS4gIEZvciBleGFtcGxlCi1AdGFibGUgQGNvZGUKLUBpdGVtIGFicyByMixyMyAtPiBhYnMgcjQscjUKLUV4ZWN1dGUgdGhlc2Ugc2VxdWVudGlhbGx5LiAgVGhlIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBpcyBpbiB0aGUgcmlnaHQKLWNvbnRhaW5lciBhbmQgaXMgZXhlY3V0ZWQgc2Vjb25kLgotCi1AaXRlbSBhYnMgcjIscjMgPC0gYWJzIHI0LHI1Ci1FeGVjdXRlIHRoZXNlIHJldmVyc2Utc2VxdWVudGlhbGx5LiAgVGhlIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBpcyBpbiB0aGUgcmlnaHQKLWNvbnRhaW5lciwgYW5kIGlzIGV4ZWN1dGVkIGZpcnN0LgotCi1AaXRlbSBhYnMgcjIscjMgfHwgYWJzIHI0LHI1Ci1FeGVjdXRlIHRoZXNlIGluIHBhcmFsbGVsLgotCi1AaXRlbSBsZHcgcjIsQEAocjMscjQpIHx8Ci1AaXRlbXggbXVseCByNixyOCxyOQotVHdvLWxpbmUgZm9ybWF0LiBFeGVjdXRlIHRoZXNlIGluIHBhcmFsbGVsLgotCi1AaXRlbSBtdWx4IGEwLHI4LHI5Ci1AaXRlbXggc3R3IHIyLEBAKHIzLHI0KQotVHdvLWxpbmUgZm9ybWF0LiBFeGVjdXRlIHRoZXNlIHNlcXVlbnRpYWxseSB1bmxlc3MgQHNhbXB7LU99IG9wdGlvbiBpcwotdXNlZC4gIElmIHRoZSBAc2FtcHstT30gb3B0aW9uIGlzIHVzZWQsIHRoZSBhc3NlbWJsZXIgd2lsbCBkZXRlcm1pbmUgaWYKLXRoZSBpbnN0cnVjdGlvbnMgY291bGQgYmUgZG9uZSBpbiBwYXJhbGxlbCAodGhlIGFib3ZlIHR3byBpbnN0cnVjdGlvbnMKLWNhbiBiZSBkb25lIGluIHBhcmFsbGVsKSwgYW5kIGlmIHNvLCBlbWl0IHRoZW0gYXMgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zLgotVGhlIGFzc2VtYmxlciB3aWxsIHB1dCB0aGVtIGluIHRoZSBwcm9wZXIgY29udGFpbmVycy4gIEluIHRoZSBhYm92ZQotZXhhbXBsZSwgdGhlIGFzc2VtYmxlciB3aWxsIHB1dCB0aGUgQHNhbXB7c3R3fSBpbnN0cnVjdGlvbiBpbiBsZWZ0Ci1jb250YWluZXIgYW5kIHRoZSBAc2FtcHttdWx4fSBpbnN0cnVjdGlvbiBpbiB0aGUgcmlnaHQgY29udGFpbmVyLgotCi1AaXRlbSBzdHcgcjIsQEAocjMscjQpIC0+Ci1AaXRlbXggbXVseCBhMCxyOCxyOQotVHdvLWxpbmUgZm9ybWF0LiAgRXhlY3V0ZSB0aGUgQHNhbXB7c3R3fSBpbnN0cnVjdGlvbiBmb2xsb3dlZCBieSB0aGUKLUBzYW1we211bHh9IGluc3RydWN0aW9uIHNlcXVlbnRpYWxseS4gIFRoZSBmaXJzdCBpbnN0cnVjdGlvbiBnb2VzIGluIHRoZQotbGVmdCBjb250YWluZXIgYW5kIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gZ29lcyBpbnRvIHJpZ2h0IGNvbnRhaW5lci4KLVRoZSBhc3NlbWJsZXIgd2lsbCBnaXZlIGFuIGVycm9yIGlmIHRoZSBtYWNoaW5lIG9yZGVyaW5nIGNvbnN0cmFpbnRzIGFyZQotdmlvbGF0ZWQuCi0KLUBpdGVtIHN0dyByMixAQChyMyxyNCkgPC0KLUBpdGVteCBtdWx4IGEwLHI4LHI5Ci1TYW1lIGFzIHByZXZpb3VzIGV4YW1wbGUsIGV4Y2VwdCB0aGF0IHRoZSBAc2FtcHttdWx4fSBpbnN0cnVjdGlvbiBpcwotZXhlY3V0ZWQgYmVmb3JlIHRoZSBAc2FtcHtzdHd9IGluc3RydWN0aW9uLgotQGVuZCB0YWJsZQotCi1AY2luZGV4IHN5bWJvbCBuYW1lcywgQHNhbXB7JH0gaW4KLUBjaW5kZXggQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzCi1TaW5jZSBAc2FtcHskfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLCB5b3UgbWF5IHVzZSBpdCBpbiBzeW1ib2wgbmFtZXMuCi0KLUBub2RlIEQzMFYtR3VhcmRlZAotQHN1YnNlY3Rpb24gR3VhcmRlZCBFeGVjdXRpb24KLUBjaW5kZXggRDMwViBHdWFyZGVkIEV4ZWN1dGlvbgotQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgdGhlIGZ1bGwgcmFuZ2Ugb2YgZ3VhcmRlZCBleGVjdXRpb24KLWRpcmVjdGl2ZXMgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24uICBKdXN0IGFwcGVuZCB0aGUgZGlyZWN0aXZlIGFmdGVyIHRoZQotaW5zdHJ1Y3Rpb24gcHJvcGVyLiAgVGhlIGRpcmVjdGl2ZXMgYXJlOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIC90eAotRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgZmxhZyBmMCBpcyB0cnVlLgotQGl0ZW0gL2Z4Ci1FeGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpZiBmbGFnIGYwIGlzIGZhbHNlLgotQGl0ZW0gL3h0Ci1FeGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpZiBmbGFnIGYxIGlzIHRydWUuCi1AaXRlbSAveGYKLUV4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGZsYWcgZjEgaXMgZmFsc2UuCi1AaXRlbSAvdHQKLUV4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGJvdGggZmxhZ3MgZjAgYW5kIGYxIGFyZSB0cnVlLgotQGl0ZW0gL3RmCi1FeGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpZiBmbGFnIGYwIGlzIHRydWUgYW5kIGZsYWcgZjEgaXMgZmFsc2UuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEQzMFYtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLUBjaW5kZXggRDMwViByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXJzLCBEMzBWCi1Zb3UgY2FuIHVzZSB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIEBzYW1we3IwfSB0aHJvdWdoIEBzYW1we3I2M30gdG8gcmVmZXIKLXRvIHRoZSBEMzBWIHJlZ2lzdGVycy4gIFlvdSBjYW4gYWxzbyB1c2UgQHNhbXB7c3B9IGFzIGFuIGFsaWFzIGZvcgotQHNhbXB7cjYzfSBhbmQgQHNhbXB7bGlua30gYXMgYW4gYWxpYXMgZm9yIEBzYW1we3I2Mn0uICBUaGUgYWNjdW11bGF0b3JzCi1hcmUgQHNhbXB7YTB9IGFuZCBAc2FtcHthMX0uCi0KLVRoZSBEMzBWIGFsc28gaGFzIHByZWRlZmluZWQgc3ltYm9scyBmb3IgdGhlc2UgY29udHJvbCByZWdpc3RlcnMgYW5kIHN0YXR1cyBiaXRzOgotQHRhYmxlIEBjb2RlCi1AaXRlbSBwc3cKLVByb2Nlc3NvciBTdGF0dXMgV29yZAotQGl0ZW0gYnBzdwotQmFja3VwIFByb2Nlc3NvciBTdGF0dXMgV29yZAotQGl0ZW0gcGMKLVByb2dyYW0gQ291bnRlcgotQGl0ZW0gYnBjCi1CYWNrdXAgUHJvZ3JhbSBDb3VudGVyCi1AaXRlbSBycHRfYwotUmVwZWF0IENvdW50Ci1AaXRlbSBycHRfcwotUmVwZWF0IFN0YXJ0IGFkZHJlc3MKLUBpdGVtIHJwdF9lCi1SZXBlYXQgRW5kIGFkZHJlc3MKLUBpdGVtIG1vZF9zCi1Nb2R1bG8gU3RhcnQgYWRkcmVzcwotQGl0ZW0gbW9kX2UKLU1vZHVsbyBFbmQgYWRkcmVzcwotQGl0ZW0gaWJhCi1JbnN0cnVjdGlvbiBCcmVhayBBZGRyZXNzCi1AaXRlbSBmMAotRmxhZyAwCi1AaXRlbSBmMQotRmxhZyAxCi1AaXRlbSBmMgotRmxhZyAyCi1AaXRlbSBmMwotRmxhZyAzCi1AaXRlbSBmNAotRmxhZyA0Ci1AaXRlbSBmNQotRmxhZyA1Ci1AaXRlbSBmNgotRmxhZyA2Ci1AaXRlbSBmNwotRmxhZyA3Ci1AaXRlbSBzCi1TYW1lIGFzIGZsYWcgNCAoc2F0dXJhdGlvbiBmbGFnKQotQGl0ZW0gdgotU2FtZSBhcyBmbGFnIDUgKG92ZXJmbG93IGZsYWcpCi1AaXRlbSB2YQotU2FtZSBhcyBmbGFnIDYgKHN0aWNreSBvdmVyZmxvdyBmbGFnKQotQGl0ZW0gYwotU2FtZSBhcyBmbGFnIDcgKGNhcnJ5L2JvcnJvdyBmbGFnKQotQGl0ZW0gYgotU2FtZSBhcyBmbGFnIDcgKGNhcnJ5L2JvcnJvdyBmbGFnKQotQGVuZCB0YWJsZQotICAgICAgICAKLUBub2RlIEQzMFYtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotQGNpbmRleCBhZGRyZXNzaW5nIG1vZGVzLCBEMzBWCi1AY2luZGV4IEQzMFYgYWRkcmVzc2luZyBtb2RlcwotQGNvZGV7QHZhbHVle0FTfX0gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciB0aGUgRDMwVi4KLUBjb2Rle1JAdmFye259fSBpbiB0aGUgZm9sbG93aW5nIHJlZmVycyB0byBhbnkgb2YgdGhlIG51bWJlcmVkCi1yZWdpc3RlcnMsIGJ1dCBAZW1waHtub3R9IHRoZSBjb250cm9sIHJlZ2lzdGVycy4KLUB0YWJsZSBAY29kZQotQGl0ZW0gUkB2YXJ7bn0KLVJlZ2lzdGVyIGRpcmVjdAotQGl0ZW0gQEBSQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3QKLUBpdGVtIEBAUkB2YXJ7bn0rCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtaW5jcmVtZW50Ci1AaXRlbSBAQFJAdmFye259LQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWRlY3JlbWVudAotQGl0ZW0gQEAtU1AKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlLWRlY3JlbWVudAotQGl0ZW0gQEAoQHZhcntkaXNwfSwgUkB2YXJ7bn0pCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIGRpc3BsYWNlbWVudAotQGl0ZW0gQHZhcnthZGRyfQotUEMgcmVsYXRpdmUgYWRkcmVzcyAoZm9yIGJyYW5jaCBvciByZXApLiAKLUBpdGVtICNAdmFye2ltbX0KLUltbWVkaWF0ZSBkYXRhICh0aGUgQHNhbXB7I30gaXMgb3B0aW9uYWwgYW5kIGlnbm9yZWQpCi1AZW5kIHRhYmxlCi0KLUBub2RlIEQzMFYtRmxvYXQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBEMzBWCi1AY2luZGV4IEQzMFYgZmxvYXRpbmcgcG9pbnQKLVRoZSBEMzBWIGhhcyBubyBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCwgYnV0IHRoZSBAY29kZXsuZmxvYXR9IGFuZCBAY29kZXsuZG91YmxlfQotZGlyZWN0aXZlcyBnZW5lcmF0ZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgZGV2ZWxvcG1lbnQgdG9vbHMuIAotCi1Abm9kZSBEMzBWLU9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLUBjaW5kZXggRDMwViBvcGNvZGUgc3VtbWFyeQotQGNpbmRleCBvcGNvZGUgc3VtbWFyeSwgRDMwVgotQGNpbmRleCBtbmVtb25pY3MsIEQzMFYKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgRDMwVgotRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBEMzBWIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle0QzMFYgQXJjaGl0ZWN0dXJlOiBBIFZMSVcgTWljcm9wcm9jZXNzb3IgZm9yIE11bHRpbWVkaWEgQXBwbGljYXRpb25zfSAKLShNaXRzdWJpc2hpIEVsZWN0cmljIENvcnAuKS4KLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBEMzBWIG9wY29kZXMuICBUaGUgb25seSBjaGFuZ2VzIGFyZSB0aG9zZQotZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIG9uIHNpemUgbW9kaWZpZXJzCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1oODMwMC50ZXhpIGIvZ2FzL2RvYy9jLWg4MzAwLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNzA5MTguLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWg4MzAwLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBlbmQgaWZzZXQKLUBub2RlIEg4LzMwMC1EZXBlbmRlbnQKLUBjaGFwdGVyIEg4LzMwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCBIOC8zMDAgc3VwcG9ydAotQG1lbnUKLSogSDgvMzAwIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotKiBIOC8zMDAgU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogSDgvMzAwIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKLSogSDgvMzAwIERpcmVjdGl2ZXM6OiAgICAgICAgICAgSDgvMzAwIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBIOC8zMDAgT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgSDgvMzAwIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBIOC8zMDAgb3B0aW9ucyAobm9uZSkKLUBjaW5kZXggb3B0aW9ucywgSDgvMzAwIChub25lKQotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vIGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBIaXRhY2hpCi1IOC8zMDAgZmFtaWx5LgotCi1Abm9kZSBIOC8zMDAgU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBtZW51Ci0qIEg4LzMwMC1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBIOC8zMDAtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotKiBIOC8zMDAtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgSDgvMzAwLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBIOC8zMDAKLUBjaW5kZXggSDgvMzAwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1wezt9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1AY2luZGV4IGxpbmUgc2VwYXJhdG9yLCBIOC8zMDAKLUBjaW5kZXggc3RhdGVtZW50IHNlcGFyYXRvciwgSDgvMzAwCi1AY2luZGV4IEg4LzMwMCBsaW5lIHNlcGFyYXRvcgotQHNhbXB7JH0gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIG5ld2xpbmUgdG8gc2VwYXJhdGUgc3RhdGVtZW50cy4KLVRoZXJlZm9yZSBAZW1waHt5b3UgbWF5IG5vdCB1c2UgQHNhbXB7JH0gaW4gc3ltYm9sIG5hbWVzfSBvbiB0aGUgSDgvMzAwLgotCi1Abm9kZSBIOC8zMDAtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBIOC8zMDAgcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVyIG5hbWVzLCBIOC8zMDAKLVlvdSBjYW4gdXNlIHByZWRlZmluZWQgc3ltYm9scyBvZiB0aGUgZm9ybSBAc2FtcHtyQHZhcntufWh9IGFuZAotQHNhbXB7ckB2YXJ7bn1sfSB0byByZWZlciB0byB0aGUgSDgvMzAwIHJlZ2lzdGVycyBhcyBzaXh0ZWVuIDgtYml0Ci1nZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzLiAgQHZhcntufSBpcyBhIGRpZ2l0IGZyb20gQHNhbXB7MH0gdG8KLUBzYW1wezd9KTsgZm9yIGluc3RhbmNlLCBib3RoIEBzYW1we3IwaH0gYW5kIEBzYW1we3I3bH0gYXJlIHZhbGlkCi1yZWdpc3RlciBuYW1lcy4KLQotWW91IGNhbiBhbHNvIHVzZSB0aGUgZWlnaHQgcHJlZGVmaW5lZCBzeW1ib2xzIEBzYW1we3JAdmFye259fSB0byByZWZlcgotdG8gdGhlIEg4LzMwMCByZWdpc3RlcnMgYXMgMTYtYml0IHJlZ2lzdGVycyAoeW91IG11c3QgdXNlIHRoaXMgZm9ybSBmb3IKLWFkZHJlc3NpbmcpLgotCi1PbiB0aGUgSDgvMzAwSCwgeW91IGNhbiBhbHNvIHVzZSB0aGUgZWlnaHQgcHJlZGVmaW5lZCBzeW1ib2xzCi1Ac2FtcHtlckB2YXJ7bn19IChAc2FtcHtlcjB9IEBkb3Rze30gQHNhbXB7ZXI3fSkgdG8gcmVmZXIgdG8gdGhlIDMyLWJpdAotZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4KLQotVGhlIHR3byBjb250cm9sIHJlZ2lzdGVycyBhcmUgY2FsbGVkIEBjb2Rle3BjfSAocHJvZ3JhbSBjb3VudGVyOyBhCi0xNi1iaXQgcmVnaXN0ZXIsIGV4Y2VwdCBvbiB0aGUgSDgvMzAwSCB3aGVyZSBpdCBpcyAyNCBiaXRzKSBhbmQKLUBjb2Rle2Njcn0gKGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyOyBhbiA4LWJpdCByZWdpc3RlcikuICBAY29kZXtyN30gaXMKLXVzZWQgYXMgdGhlIHN0YWNrIHBvaW50ZXIsIGFuZCBjYW4gYWxzbyBiZSBjYWxsZWQgQGNvZGV7c3B9LgotCi1Abm9kZSBIOC8zMDAtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIEg4LzMwMAotQGNpbmRleCBIOC8zMDAgYWRkcmVzc2luZyBtb2RlcwotQHZhbHVle0FTfSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBIOC8zMDA6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIHJAdmFye259Ci1SZWdpc3RlciBkaXJlY3QKLQotQGl0ZW0gQEByQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3QKLQotQG5lZWQgMTIwMAotQGl0ZW0gQEAoQHZhcntkfSwgckB2YXJ7bn0pCi1AaXRlbXggQEAoQHZhcntkfToxNiwgckB2YXJ7bn0pCi1AaXRlbXggQEAoQHZhcntkfToyNCwgckB2YXJ7bn0pCi1SZWdpc3RlciBpbmRpcmVjdDogMTYtYml0IG9yIDI0LWJpdCBkaXNwbGFjZW1lbnQgQHZhcntkfSBmcm9tIHJlZ2lzdGVyCi1AdmFye259LiAgKDI0LWJpdCBkaXNwbGFjZW1lbnRzIGFyZSBvbmx5IG1lYW5pbmdmdWwgb24gdGhlIEg4LzMwMEguKQotCi1AaXRlbSBAQHJAdmFye259KwotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWluY3JlbWVudAotCi1AaXRlbSBAQC1yQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmUtZGVjcmVtZW50Ci0KLUBpdGVtIEBjb2Rle0BAfUB2YXJ7YWF9Ci1AaXRlbXggQGNvZGV7QEB9QHZhcnthYX06OAotQGl0ZW14IEBjb2Rle0BAfUB2YXJ7YWF9OjE2Ci1AaXRlbXggQGNvZGV7QEB9QHZhcnthYX06MjQKLUFic29sdXRlIGFkZHJlc3MgQGNvZGV7YWF9LiAgKFRoZSBhZGRyZXNzIHNpemUgQHNhbXB7OjI0fSBvbmx5IG1ha2VzCi1zZW5zZSBvbiB0aGUgSDgvMzAwSC4pCi0KLUBpdGVtICNAdmFye3h4fQotQGl0ZW14ICNAdmFye3h4fTo4Ci1AaXRlbXggI0B2YXJ7eHh9OjE2Ci1AaXRlbXggI0B2YXJ7eHh9OjMyCi1JbW1lZGlhdGUgZGF0YSBAdmFye3h4fS4gIFlvdSBtYXkgc3BlY2lmeSB0aGUgQHNhbXB7Ojh9LCBAc2FtcHs6MTZ9LCBvcgotQHNhbXB7OjMyfSBmb3IgY2xhcml0eSwgaWYgeW91IHdpc2g7IGJ1dCBAY29kZXtAdmFsdWV7QVN9fSBuZWl0aGVyCi1yZXF1aXJlcyB0aGlzIG5vciB1c2VzIGl0LS0tdGhlIGRhdGEgc2l6ZSByZXF1aXJlZCBpcyB0YWtlbiBmcm9tCi1jb250ZXh0LgotCi1AaXRlbSBAY29kZXtAQH1AY29kZXtAQH1AdmFye2FhfQotQGl0ZW14IEBjb2Rle0BAfUBjb2Rle0BAfUB2YXJ7YWF9OjgKLU1lbW9yeSBpbmRpcmVjdC4gIFlvdSBtYXkgc3BlY2lmeSB0aGUgQHNhbXB7Ojh9IGZvciBjbGFyaXR5LCBpZiB5b3UKLXdpc2g7IGJ1dCBAY29kZXtAdmFsdWV7QVN9fSBuZWl0aGVyIHJlcXVpcmVzIHRoaXMgbm9yIHVzZXMgaXQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEg4LzMwMCBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgSDgvMzAwIChAc2N7aWVlZX0pCi1AY2luZGV4IEg4LzMwMCBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIEg4LzMwMCBmYW1pbHkgaGFzIG5vIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgdGhlIEBjb2Rley5mbG9hdH0KLWRpcmVjdGl2ZSBnZW5lcmF0ZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgZGV2ZWxvcG1lbnQgdG9vbHMuCi0KLUBwYWdlCi1Abm9kZSBIOC8zMDAgRGlyZWN0aXZlcwotQHNlY3Rpb24gSDgvMzAwIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IEg4LzMwMCBtYWNoaW5lIGRpcmVjdGl2ZXMgKG5vbmUpCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgSDgvMzAwIChub25lKQotQGNpbmRleCBAY29kZXt3b3JkfSBkaXJlY3RpdmUsIEg4LzMwMAotQGNpbmRleCBAY29kZXtpbnR9IGRpcmVjdGl2ZSwgSDgvMzAwCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgb25seSBvbmUgbWFjaGluZS1kZXBlbmRlbnQgZGlyZWN0aXZlIGZvciB0aGUKLUg4LzMwMDoKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEg4LzMwMEgsIGFzc2VtYmxpbmcgZm9yCi1AaXRlbSAuaDgzMDBoCi1SZWNvZ25pemUgYW5kIGVtaXQgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBIOC8zMDBIIHZhcmlhbnQsIGFuZAotYWxzbyBtYWtlIEBjb2Rley5pbnR9IGVtaXQgMzItYml0IG51bWJlcnMgcmF0aGVyIHRoYW4gdGhlIHVzdWFsICgxNi1iaXQpCi1mb3IgdGhlIEg4LzMwMCBmYW1pbHkuCi1AZW5kIHRhYmxlCi0KLU9uIHRoZSBIOC8zMDAgZmFtaWx5IChpbmNsdWRpbmcgdGhlIEg4LzMwMEgpIEBzYW1wey53b3JkfSBkaXJlY3RpdmVzCi1nZW5lcmF0ZSAxNi1iaXQgbnVtYmVycy4KLQotQG5vZGUgSDgvMzAwIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBIOC8zMDAgb3Bjb2RlIHN1bW1hcnkKLUBjaW5kZXggb3Bjb2RlIHN1bW1hcnksIEg4LzMwMAotQGNpbmRleCBtbmVtb25pY3MsIEg4LzMwMAotQGNpbmRleCBpbnN0cnVjdGlvbiBzdW1tYXJ5LCBIOC8zMDAKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgSDgvMzAwIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle0g4LzMwMCBTZXJpZXMgUHJvZ3JhbW1pbmcgTWFudWFsfSAoSGl0YWNoaSBBREUtLTYwMi0tMDI1KS4gIEZvcgotaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIEg4LzMwMEgsIHNlZSBAY2l0ZXtIOC8zMDBIIFNlcmllcwotUHJvZ3JhbW1pbmcgTWFudWFsfSAoSGl0YWNoaSkuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBIOC8zMDAgb3Bjb2Rlcy4gIE5vIGFkZGl0aW9uYWwKLXBzZXVkby1pbnN0cnVjdGlvbnMgYXJlIG5lZWRlZCBvbiB0aGlzIGZhbWlseS4KLQotQGlmc2V0IFNNQUxMCi1AYyB0aGlzIHRhYmxlLCBkdWUgdG8gdGhlIG11bHRpLWNvbCBmYWtpbmcgYW5kIGhhcmRjb2RlZCBvcmRlciwgbG9va3Mgc2lsbHkKLUBjIGV4Y2VwdCBpbiBzbWFsbGJvb2suICBTZWUgY29tbWVudHMgYmVsb3cgIkBzZXQgU01BTEwiIG5lYXIgdG9wIG9mIHRoaXMgZmlsZS4KLQotVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBIOC8zMDAgb3Bjb2RlcywgYW5kIHRoZWlyIGFyZ3VtZW50cy4KLUVudHJpZXMgbWFya2VkIEBzYW1weyp9IGFyZSBvcGNvZGVzIHVzZWQgb25seSBvbiB0aGUgSDgvMzAwSC4KLQotQHNtYWxsZXhhbXBsZQotQGMgVXNpbmcgQGdyb3VwIHNlZW1zIHRvIHVzZSB0aGUgbm9ybWFsIGJhc2VsaW5lc2tpcCwgbm90IHRoZSBzbWFsbGV4YW1wbGUKLUBjIGJhc2VsaW5lc2tpcDsgbG9va3MgYXBwcm94IGRvdWJsZXNwYWNlZC4KLSAgICAgICAgIEBpe0xlZ2VuZDp9Ci0gICAgICAgICAgICBScyAgIEBye3NvdXJjZSByZWdpc3Rlcn0KLSAgICAgICAgICAgIFJkICAgQHJ7ZGVzdGluYXRpb24gcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBhYnMgIEBye2Fic29sdXRlIGFkZHJlc3N9Ci0gICAgICAgICAgICBpbW0gIEBye2ltbWVkaWF0ZSBkYXRhfQotICAgICAgICAgZGlzcDpOICBAcntOLWJpdCBkaXNwbGFjZW1lbnQgZnJvbSBhIHJlZ2lzdGVyfQotICAgICAgICBwY3JlbDpOICBAcntOLWJpdCBkaXNwbGFjZW1lbnQgcmVsYXRpdmUgdG8gcHJvZ3JhbSBjb3VudGVyfQotCi0gICBhZGQuYiAjaW1tLHJkICAgICAgICAgICAgICAqICBhbmRjICNpbW0sY2NyCi0gICBhZGQuYiBycyxyZCAgICAgICAgICAgICAgICAgICBiYW5kICNpbW0scmQKLSAgIGFkZC53IHJzLHJkICAgICAgICAgICAgICAgICAgIGJhbmQgI2ltbSxAQHJkCi0qICBhZGQudyAjaW1tLHJkICAgICAgICAgICAgICAgICBiYW5kICNpbW0sQEBhYnM6OAotKiAgYWRkLmwgcnMscmQgICAgICAgICAgICAgICAgICAgYnJhICBwY3JlbDo4Ci0qICBhZGQubCAjaW1tLHJkICAgICAgICAgICAgICAqICBicmEgIHBjcmVsOjE2Ci0gICBhZGRzICNpbW0scmQgICAgICAgICAgICAgICAgICBidCAgIHBjcmVsOjgKLSAgIGFkZHggI2ltbSxyZCAgICAgICAgICAgICAgICogIGJ0ICAgcGNyZWw6MTYKLSAgIGFkZHggcnMscmQgICAgICAgICAgICAgICAgICAgIGJybiAgcGNyZWw6OAotICAgYW5kLmIgI2ltbSxyZCAgICAgICAgICAgICAgKiAgYnJuICBwY3JlbDoxNgotICAgYW5kLmIgcnMscmQgICAgICAgICAgICAgICAgICAgYmYgICBwY3JlbDo4Ci0qICBhbmQudyBycyxyZCAgICAgICAgICAgICAgICAqICBiZiAgIHBjcmVsOjE2Ci0qICBhbmQudyAjaW1tLHJkICAgICAgICAgICAgICAgICBiaGkgIHBjcmVsOjgKLSogIGFuZC5sICNpbW0scmQgICAgICAgICAgICAgICogIGJoaSAgcGNyZWw6MTYKLSogIGFuZC5sIHJzLHJkICAgICAgICAgICAgICAgICAgIGJscyAgcGNyZWw6OAotQHBhZ2UKLSogIGJscyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJsZCAgI2ltbSxyZAotICAgYmNjICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYmxkICAjaW1tLEBAcmQKLSogIGJjYyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJsZCAgI2ltbSxAQGFiczo4Ci0gICBiaHMgIHBjcmVsOjggICAgICAgICAgICAgICAgICBibm90ICNpbW0scmQKLSogIGJocyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJub3QgI2ltbSxAQHJkCi0gICBiY3MgIHBjcmVsOjggICAgICAgICAgICAgICAgICBibm90ICNpbW0sQEBhYnM6OAotKiAgYmNzICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYm5vdCBycyxyZAotICAgYmxvICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYm5vdCBycyxAQHJkCi0qICBibG8gIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBibm90IHJzLEBAYWJzOjgKLSAgIGJuZSAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJvciAgI2ltbSxyZAotKiAgYm5lICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYm9yICAjaW1tLEBAcmQKLSAgIGJlcSAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJvciAgI2ltbSxAQGFiczo4Ci0qICBiZXEgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBic2V0ICNpbW0scmQKLSAgIGJ2YyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJzZXQgI2ltbSxAQHJkCi0qICBidmMgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBic2V0ICNpbW0sQEBhYnM6OAotICAgYnZzICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnNldCBycyxyZAotKiAgYnZzICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnNldCBycyxAQHJkCi0gICBicGwgIHBjcmVsOjggICAgICAgICAgICAgICAgICBic2V0IHJzLEBAYWJzOjgKLSogIGJwbCAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzciAgcGNyZWw6OAotICAgYm1pICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnNyICBwY3JlbDoxNgotKiAgYm1pICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnN0ICAjaW1tLHJkCi0gICBiZ2UgIHBjcmVsOjggICAgICAgICAgICAgICAgICBic3QgICNpbW0sQEByZAotKiAgYmdlICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnN0ICAjaW1tLEBAYWJzOjgKLSAgIGJsdCAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJ0c3QgI2ltbSxyZAotKiAgYmx0ICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnRzdCAjaW1tLEBAcmQKLSAgIGJndCAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJ0c3QgI2ltbSxAQGFiczo4Ci0qICBiZ3QgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBidHN0IHJzLHJkCi0gICBibGUgIHBjcmVsOjggICAgICAgICAgICAgICAgICBidHN0IHJzLEBAcmQKLSogIGJsZSAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJ0c3QgcnMsQEBhYnM6OAotICAgYmNsciAjaW1tLHJkICAgICAgICAgICAgICAgICAgYnhvciAjaW1tLHJkCi0gICBiY2xyICNpbW0sQEByZCAgICAgICAgICAgICAgICAgYnhvciAjaW1tLEBAcmQKLSAgIGJjbHIgI2ltbSxAQGFiczo4ICAgICAgICAgICAgICBieG9yICNpbW0sQEBhYnM6OAotICAgYmNsciBycyxyZCAgICAgICAgICAgICAgICAgICAgY21wLmIgI2ltbSxyZAotICAgYmNsciBycyxAQHJkICAgICAgICAgICAgICAgICAgIGNtcC5iIHJzLHJkCi0gICBiY2xyIHJzLEBAYWJzOjggICAgICAgICAgICAgICAgY21wLncgcnMscmQKLSAgIGJpYW5kICNpbW0scmQgICAgICAgICAgICAgICAgIGNtcC53IHJzLHJkCi0gICBiaWFuZCAjaW1tLEBAcmQgICAgICAgICAgICAgKiAgY21wLncgI2ltbSxyZAotICAgYmlhbmQgI2ltbSxAQGFiczo4ICAgICAgICAgICogIGNtcC5sICNpbW0scmQKLSAgIGJpbGQgI2ltbSxyZCAgICAgICAgICAgICAgICogIGNtcC5sIHJzLHJkCi0gICBiaWxkICNpbW0sQEByZCAgICAgICAgICAgICAgICAgZGFhICBycwotICAgYmlsZCAjaW1tLEBAYWJzOjggICAgICAgICAgICAgIGRhcyAgcnMKLSAgIGJpb3IgI2ltbSxyZCAgICAgICAgICAgICAgICAgIGRlYy5iIHJzCi0gICBiaW9yICNpbW0sQEByZCAgICAgICAgICAgICAgKiAgZGVjLncgI2ltbSxyZAotICAgYmlvciAjaW1tLEBAYWJzOjggICAgICAgICAgICogIGRlYy5sICNpbW0scmQKLSAgIGJpc3QgI2ltbSxyZCAgICAgICAgICAgICAgICAgIGRpdnh1LmIgcnMscmQKLSAgIGJpc3QgI2ltbSxAQHJkICAgICAgICAgICAgICAqICBkaXZ4dS53IHJzLHJkCi0gICBiaXN0ICNpbW0sQEBhYnM6OCAgICAgICAgICAgKiAgZGl2eHMuYiBycyxyZAotICAgYml4b3IgI2ltbSxyZCAgICAgICAgICAgICAgKiAgZGl2eHMudyBycyxyZAotICAgYml4b3IgI2ltbSxAQHJkICAgICAgICAgICAgICAgIGVlcG1vdgotICAgYml4b3IgI2ltbSxAQGFiczo4ICAgICAgICAgICogIGVlcG1vdncKLUBwYWdlCi0qICBleHRzLncgcmQgICAgICAgICAgICAgICAgICAgICBtb3YudyBycyxAQGFiczoxNgotKiAgZXh0cy5sIHJkICAgICAgICAgICAgICAgICAgKiAgbW92LmwgI2ltbSxyZAotKiAgZXh0dS53IHJkICAgICAgICAgICAgICAgICAgKiAgbW92LmwgcnMscmQKLSogIGV4dHUubCByZCAgICAgICAgICAgICAgICAgICogIG1vdi5sIEBAcnMscmQKLSAgIGluYyAgcnMgICAgICAgICAgICAgICAgICAgICogIG1vdi5sIEBAKGRpc3A6MTYscnMpLHJkCi0qICBpbmMudyAjaW1tLHJkICAgICAgICAgICAgICAqICBtb3YubCBAQChkaXNwOjI0LHJzKSxyZAotKiAgaW5jLmwgI2ltbSxyZCAgICAgICAgICAgICAgKiAgbW92LmwgQEBycysscmQKLSAgIGptcCAgQEBycyAgICAgICAgICAgICAgICAgICAqICBtb3YubCBAQGFiczoxNixyZAotICAgam1wICBhYnMgICAgICAgICAgICAgICAgICAgKiAgbW92LmwgQEBhYnM6MjQscmQKLSAgIGptcCAgQEBAQGFiczo4ICAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEByZAotICAganNyICBAQHJzICAgICAgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBAKGRpc3A6MTYscmQpCi0gICBqc3IgIGFicyAgICAgICAgICAgICAgICAgICAqICBtb3YubCBycyxAQChkaXNwOjI0LHJkKQotICAganNyICBAQEBAYWJzOjggICAgICAgICAgICAgICAqICBtb3YubCBycyxAQC1yZAotICAgbGRjICAjaW1tLGNjciAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEBhYnM6MTYKLSAgIGxkYyAgcnMsY2NyICAgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBAYWJzOjI0Ci0qICBsZGMgIEBAYWJzOjE2LGNjciAgICAgICAgICAgICAgbW92ZnBlIEBAYWJzOjE2LHJkCi0qICBsZGMgIEBAYWJzOjI0LGNjciAgICAgICAgICAgICAgbW92dHBlIHJzLEBAYWJzOjE2Ci0qICBsZGMgIEBAKGRpc3A6MTYscnMpLGNjciAgICAgICAgbXVseHUuYiBycyxyZAotKiAgbGRjICBAQChkaXNwOjI0LHJzKSxjY3IgICAgICogIG11bHh1LncgcnMscmQKLSogIGxkYyAgQEBycyssY2NyICAgICAgICAgICAgICAqICBtdWx4cy5iIHJzLHJkCi0qICBsZGMgIEBAcnMsY2NyICAgICAgICAgICAgICAgKiAgbXVseHMudyBycyxyZAotKiAgbW92LmIgQEAoZGlzcDoyNCxycykscmQgICAgICAgIG5lZy5iIHJzCi0qICBtb3YuYiBycyxAQChkaXNwOjI0LHJkKSAgICAgKiAgbmVnLncgcnMKLSAgIG1vdi5iIEBAYWJzOjE2LHJkICAgICAgICAgICAqICBuZWcubCBycwotICAgbW92LmIgcnMscmQgICAgICAgICAgICAgICAgICAgbm9wCi0gICBtb3YuYiBAQGFiczo4LHJkICAgICAgICAgICAgICAgbm90LmIgcnMKLSAgIG1vdi5iIHJzLEBAYWJzOjggICAgICAgICAgICAqICBub3QudyBycwotICAgbW92LmIgcnMscmQgICAgICAgICAgICAgICAgKiAgbm90LmwgcnMKLSAgIG1vdi5iICNpbW0scmQgICAgICAgICAgICAgICAgIG9yLmIgI2ltbSxyZAotICAgbW92LmIgQEBycyxyZCAgICAgICAgICAgICAgICAgIG9yLmIgcnMscmQKLSAgIG1vdi5iIEBAKGRpc3A6MTYscnMpLHJkICAgICAqICBvci53ICNpbW0scmQKLSAgIG1vdi5iIEBAcnMrLHJkICAgICAgICAgICAgICAqICBvci53IHJzLHJkCi0gICBtb3YuYiBAQGFiczo4LHJkICAgICAgICAgICAgKiAgb3IubCAjaW1tLHJkCi0gICBtb3YuYiBycyxAQHJkICAgICAgICAgICAgICAgKiAgb3IubCBycyxyZAotICAgbW92LmIgcnMsQEAoZGlzcDoxNixyZCkgICAgICAgIG9yYyAgI2ltbSxjY3IKLSAgIG1vdi5iIHJzLEBALXJkICAgICAgICAgICAgICAgICBwb3AudyBycwotICAgbW92LmIgcnMsQEBhYnM6OCAgICAgICAgICAgICogIHBvcC5sIHJzCi0gICBtb3YudyBycyxAQHJkICAgICAgICAgICAgICAgICAgcHVzaC53IHJzCi0qICBtb3YudyBAQChkaXNwOjI0LHJzKSxyZCAgICAgKiAgcHVzaC5sIHJzCi0qICBtb3YudyBycyxAQChkaXNwOjI0LHJkKSAgICAgICAgcm90bC5iIHJzCi0qICBtb3YudyBAQGFiczoyNCxyZCAgICAgICAgICAgKiAgcm90bC53IHJzCi0qICBtb3YudyBycyxAQGFiczoyNCAgICAgICAgICAgKiAgcm90bC5sIHJzCi0gICBtb3YudyBycyxyZCAgICAgICAgICAgICAgICAgICByb3RyLmIgcnMKLSAgIG1vdi53ICNpbW0scmQgICAgICAgICAgICAgICogIHJvdHIudyBycwotICAgbW92LncgQEBycyxyZCAgICAgICAgICAgICAgICogIHJvdHIubCBycwotICAgbW92LncgQEAoZGlzcDoxNixycykscmQgICAgICAgIHJvdHhsLmIgcnMKLSAgIG1vdi53IEBAcnMrLHJkICAgICAgICAgICAgICAqICByb3R4bC53IHJzCi0gICBtb3YudyBAQGFiczoxNixyZCAgICAgICAgICAgKiAgcm90eGwubCBycwotICAgbW92LncgcnMsQEAoZGlzcDoxNixyZCkgICAgICAgIHJvdHhyLmIgcnMKLSAgIG1vdi53IHJzLEBALXJkICAgICAgICAgICAgICAqICByb3R4ci53IHJzCi1AcGFnZQotKiAgcm90eHIubCBycyAgICAgICAgICAgICAgICAgKiAgc3RjICBjY3IsQEAoZGlzcDoyNCxyZCkKLSAgIGJwdCAgICAgICAgICAgICAgICAgICAgICAgICogIHN0YyAgY2NyLEBALXJkCi0gICBydGUgICAgICAgICAgICAgICAgICAgICAgICAqICBzdGMgIGNjcixAQGFiczoxNgotICAgcnRzICAgICAgICAgICAgICAgICAgICAgICAgKiAgc3RjICBjY3IsQEBhYnM6MjQKLSAgIHNoYWwuYiBycyAgICAgICAgICAgICAgICAgICAgIHN1Yi5iIHJzLHJkCi0qICBzaGFsLncgcnMgICAgICAgICAgICAgICAgICAgICBzdWIudyBycyxyZAotKiAgc2hhbC5sIHJzICAgICAgICAgICAgICAgICAgKiAgc3ViLncgI2ltbSxyZAotICAgc2hhci5iIHJzICAgICAgICAgICAgICAgICAgKiAgc3ViLmwgcnMscmQKLSogIHNoYXIudyBycyAgICAgICAgICAgICAgICAgICogIHN1Yi5sICNpbW0scmQKLSogIHNoYXIubCBycyAgICAgICAgICAgICAgICAgICAgIHN1YnMgI2ltbSxyZAotICAgc2hsbC5iIHJzICAgICAgICAgICAgICAgICAgICAgc3VieCAjaW1tLHJkCi0qICBzaGxsLncgcnMgICAgICAgICAgICAgICAgICAgICBzdWJ4IHJzLHJkCi0qICBzaGxsLmwgcnMgICAgICAgICAgICAgICAgICAqICB0cmFwYSAjaW1tCi0gICBzaGxyLmIgcnMgICAgICAgICAgICAgICAgICAgICB4b3IgICNpbW0scmQKLSogIHNobHIudyBycyAgICAgICAgICAgICAgICAgICAgIHhvciAgcnMscmQKLSogIHNobHIubCBycyAgICAgICAgICAgICAgICAgICogIHhvci53ICNpbW0scmQKLSAgIHNsZWVwICAgICAgICAgICAgICAgICAgICAgICogIHhvci53IHJzLHJkCi0gICBzdGMgIGNjcixyZCAgICAgICAgICAgICAgICAqICB4b3IubCAjaW1tLHJkCi0qICBzdGMgIGNjcixAQHJzICAgICAgICAgICAgICAgKiAgeG9yLmwgcnMscmQKLSogIHN0YyAgY2NyLEBAKGRpc3A6MTYscmQpICAgICAgICB4b3JjICNpbW0sY2NyCi1AZW5kIHNtYWxsZXhhbXBsZQotQGVuZCBpZnNldAotCi1AY2luZGV4IHNpemUgc3VmZml4ZXMsIEg4LzMwMAotQGNpbmRleCBIOC8zMDAgc2l6ZSBzdWZmaXhlcwotRm91ciBIOC8zMDAgaW5zdHJ1Y3Rpb25zIChAY29kZXthZGR9LCBAY29kZXtjbXB9LCBAY29kZXttb3Z9LAotQGNvZGV7c3VifSkgYXJlIGRlZmluZWQgd2l0aCB2YXJpYW50cyB1c2luZyB0aGUgc3VmZml4ZXMgQHNhbXB7LmJ9LAotQHNhbXB7Lnd9LCBhbmQgQHNhbXB7Lmx9IHRvIHNwZWNpZnkgdGhlIHNpemUgb2YgYSBtZW1vcnkgb3BlcmFuZC4KLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZXNlIHN1ZmZpeGVzLCBidXQgZG9lcyBub3QgcmVxdWlyZSB0aGVtOwotc2luY2Ugb25lIG9mIHRoZSBvcGVyYW5kcyBpcyBhbHdheXMgYSByZWdpc3RlciwgQGNvZGV7QHZhbHVle0FTfX0gY2FuCi1kZWR1Y2UgdGhlIGNvcnJlY3Qgc2l6ZS4KLQotRm9yIGV4YW1wbGUsIHNpbmNlIEBjb2Rle3IwfSByZWZlcnMgdG8gYSAxNi1iaXQgcmVnaXN0ZXIsCi1AZXhhbXBsZQotbW92ICAgIHIwLEBAZm9vCi1AZXhkZW50IGlzIGVxdWl2YWxlbnQgdG8KLW1vdi53ICByMCxAQGZvbwotQGVuZCBleGFtcGxlCi0KLUlmIHlvdSB1c2UgdGhlIHNpemUgc3VmZml4ZXMsIEBjb2Rle0B2YWx1ZXtBU319IGlzc3VlcyBhIHdhcm5pbmcgd2hlbgotdGhlIHN1ZmZpeCBhbmQgdGhlIHJlZ2lzdGVyIHNpemUgZG8gbm90IG1hdGNoLgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWg4NTAwLnRleGkgYi9nYXMvZG9jL2MtaDg1MDAudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmMGU2NC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtaDg1MDAudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBwYWdlCi1Abm9kZSBIOC81MDAtRGVwZW5kZW50Ci1AY2hhcHRlciBIOC81MDAgRGVwZW5kZW50IEZlYXR1cmVzCi0KLUBjaW5kZXggSDgvNTAwIHN1cHBvcnQKLUBtZW51Ci0qIEg4LzUwMCBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogSDgvNTAwIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4Ci0qIEg4LzUwMCBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEg4LzUwMCBEaXJlY3RpdmVzOjogICAgICAgICAgIEg4LzUwMCBNYWNoaW5lIERpcmVjdGl2ZXMKLSogSDgvNTAwIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEg4LzUwMCBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggSDgvNTAwIG9wdGlvbnMgKG5vbmUpCi1AY2luZGV4IG9wdGlvbnMsIEg4LzUwMCAobm9uZSkKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgSGl0YWNoaQotSDgvNTAwIGZhbWlseS4KLQotQG5vZGUgSDgvNTAwIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci0KLUBtZW51Ci0qIEg4LzUwMC1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotKiBIOC81MDAtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotKiBIOC81MDAtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgSDgvNTAwLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBIOC81MDAKLUBjaW5kZXggSDgvNTAwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1weyF9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1AY2luZGV4IGxpbmUgc2VwYXJhdG9yLCBIOC81MDAKLUBjaW5kZXggc3RhdGVtZW50IHNlcGFyYXRvciwgSDgvNTAwCi1AY2luZGV4IEg4LzUwMCBsaW5lIHNlcGFyYXRvcgotQHNhbXB7O30gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIG5ld2xpbmUgdG8gc2VwYXJhdGUgc3RhdGVtZW50cy4KLQotQGNpbmRleCBzeW1ib2wgbmFtZXMsIEBzYW1weyR9IGluCi1AY2luZGV4IEBjb2RleyR9IGluIHN5bWJvbCBuYW1lcwotU2luY2UgQHNhbXB7JH0gaGFzIG5vIHNwZWNpYWwgbWVhbmluZywgeW91IG1heSB1c2UgaXQgaW4gc3ltYm9sIG5hbWVzLgotCi1Abm9kZSBIOC81MDAtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBIOC81MDAgcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVycywgSDgvNTAwCi1Zb3UgY2FuIHVzZSB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIEBzYW1we3IwfSwgQHNhbXB7cjF9LCBAc2FtcHtyMn0sCi1Ac2FtcHtyM30sIEBzYW1we3I0fSwgQHNhbXB7cjV9LCBAc2FtcHtyNn0sIGFuZCBAc2FtcHtyN30gdG8gcmVmZXIgdG8KLXRoZSBIOC81MDAgcmVnaXN0ZXJzLgotCi1UaGUgSDgvNTAwIGFsc28gaGFzIHRoZXNlIGNvbnRyb2wgcmVnaXN0ZXJzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGNwCi1jb2RlIHBvaW50ZXIKLQotQGl0ZW0gZHAKLWRhdGEgcG9pbnRlcgotCi1AaXRlbSBicAotYmFzZSBwb2ludGVyCi0KLUBpdGVtIHRwCi1zdGFjayB0b3AgcG9pbnRlcgotCi1AaXRlbSBlcAotZXh0cmEgcG9pbnRlcgotCi1AaXRlbSBzcgotc3RhdHVzIHJlZ2lzdGVyCi0KLUBpdGVtIGNjcgotY29uZGl0aW9uIGNvZGUgcmVnaXN0ZXIKLUBlbmQgdGFibGUKLQotQWxsIHJlZ2lzdGVycyBhcmUgMTYgYml0cyBsb25nLiAgVG8gcmVwcmVzZW50IDMyIGJpdCBudW1iZXJzLCB1c2UgdHdvCi1hZGphY2VudCByZWdpc3RlcnM7IGZvciBkaXN0YW50IG1lbW9yeSBhZGRyZXNzZXMsIHVzZSBvbmUgb2YgdGhlIHNlZ21lbnQKLXBvaW50ZXJzIChAY29kZXtjcH0gZm9yIHRoZSBwcm9ncmFtIGNvdW50ZXI7IEBjb2Rle2RwfSBmb3IKLUBjb2Rle3IwfS0tQGNvZGV7cjN9OyBAY29kZXtlcH0gZm9yIEBjb2Rle3I0fSBhbmQgQGNvZGV7cjV9OyBhbmQKLUBjb2Rle3RwfSBmb3IgQGNvZGV7cjZ9IGFuZCBAY29kZXtyN30uCi0KLUBub2RlIEg4LzUwMC1BZGRyZXNzaW5nCi1Ac3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCi0KLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgSDgvNTAwCi1AY2luZGV4IEg4LzUwMCBhZGRyZXNzaW5nIG1vZGVzCi1AdmFsdWV7QVN9IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIEg4LzUwMDoKLUB0YWJsZSBAY29kZQotQGl0ZW0gUkB2YXJ7bn0KLVJlZ2lzdGVyIGRpcmVjdAotCi1AaXRlbSBAQFJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdAotCi1AaXRlbSBAQChkOjgsIFJAdmFye259KQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50Ci0KLUBpdGVtIEBAKGQ6MTYsIFJAdmFye259KQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCAxNiBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudAotCi1AaXRlbSBAQC1SQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmUtZGVjcmVtZW50Ci0KLUBpdGVtIEBAUkB2YXJ7bn0rCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtaW5jcmVtZW50Ci0KLUBpdGVtIEBAQHZhcnthYX06OAotOCBiaXQgYWJzb2x1dGUgYWRkcmVzcwotCi1AaXRlbSBAQEB2YXJ7YWF9OjE2Ci0xNiBiaXQgYWJzb2x1dGUgYWRkcmVzcwotCi1AaXRlbSAjQHZhcnt4eH06OAotOCBiaXQgaW1tZWRpYXRlCi0KLUBpdGVtICNAdmFye3h4fToxNgotMTYgYml0IGltbWVkaWF0ZQotQGVuZCB0YWJsZQotCi1Abm9kZSBIOC81MDAgRmxvYXRpbmcgUG9pbnQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEg4LzUwMCAoQHNje2llZWV9KQotQGNpbmRleCBIOC81MDAgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBIOC81MDAgZmFtaWx5IGhhcyBubyBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCwgYnV0IHRoZSBAY29kZXsuZmxvYXR9Ci1kaXJlY3RpdmUgZ2VuZXJhdGVzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIG90aGVyIGRldmVsb3BtZW50IHRvb2xzLgotCi1Abm9kZSBIOC81MDAgRGlyZWN0aXZlcwotQHNlY3Rpb24gSDgvNTAwIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IEg4LzUwMCBtYWNoaW5lIGRpcmVjdGl2ZXMgKG5vbmUpCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgSDgvNTAwIChub25lKQotQGNpbmRleCBAY29kZXt3b3JkfSBkaXJlY3RpdmUsIEg4LzUwMAotQGNpbmRleCBAY29kZXtpbnR9IGRpcmVjdGl2ZSwgSDgvNTAwCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgZGlyZWN0aXZlcyBmb3IgdGhlIEg4LzUwMC4KLUhvd2V2ZXIsIG9uIHRoaXMgcGxhdGZvcm0gdGhlIEBzYW1wey5pbnR9IGFuZCBAc2FtcHsud29yZH0gZGlyZWN0aXZlcwotZ2VuZXJhdGUgMTYtYml0IG51bWJlcnMuCi0KLUBub2RlIEg4LzUwMCBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggSDgvNTAwIG9wY29kZSBzdW1tYXJ5Ci1AY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBIOC81MDAKLUBjaW5kZXggbW5lbW9uaWNzLCBIOC81MDAKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgSDgvNTAwCi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEg4LzUwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtIOC81MDAgU2VyaWVzIFByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkgTTIxVDAwMSkuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBIOC81MDAgb3Bjb2Rlcy4gIE5vIGFkZGl0aW9uYWwKLXBzZXVkby1pbnN0cnVjdGlvbnMgYXJlIG5lZWRlZCBvbiB0aGlzIGZhbWlseS4KLQotQGlmc2V0IFNNQUxMCi1AYyB0aGlzIHRhYmxlLCBkdWUgdG8gdGhlIG11bHRpLWNvbCBmYWtpbmcgYW5kIGhhcmRjb2RlZCBvcmRlciwgbG9va3Mgc2lsbHkKLUBjIGV4Y2VwdCBpbiBzbWFsbGJvb2suICBTZWUgY29tbWVudHMgYmVsb3cgIkBzZXQgU01BTEwiIG5lYXIgdG9wIG9mIHRoaXMgZmlsZS4KLQotVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIEg4LzUwMCBvcGNvZGVzIGFuZCB0aGVpciBvcGVyYW5kczoKLQotQGMgVXNlIEBncm91cCBpZiBpdCBldmVyIHdvcmtzLCBpbnN0ZWFkIG9mIEBwYWdlCi1AcGFnZQotQHNtYWxsZXhhbXBsZQotQGl7TGVnZW5kOn0KLWFiczggICAgICBAcns4LWJpdCBhYnNvbHV0ZSBhZGRyZXNzfQotYWJzMTYgICAgIEByezE2LWJpdCBhYnNvbHV0ZSBhZGRyZXNzfQotYWJzMjQgICAgIEByezI0LWJpdCBhYnNvbHV0ZSBhZGRyZXNzfQotY3JiICAgICAgIEBye0Bjb2Rle2Njcn0sIEBjb2Rle2JyfSwgQGNvZGV7ZXB9LCBAY29kZXtkcH0sIEBjb2Rle3RwfSwgQGNvZGV7ZHB9fQotZGlzcDggICAgIEByezgtYml0IGRpc3BsYWNlbWVudH0KLWVhICAgICAgICBAcntAY29kZXtybn0sIEBjb2Rle0BAcm59LCBAY29kZXtAQChkOjgsIHJuKX0sIEBjb2Rle0BAKGQ6MTYsIHJuKX0sfQotICAgICAgICAgIEBye0Bjb2Rle0BALXJufSwgQGNvZGV7QEBybit9LCBAY29kZXtAQGFhOjh9LCBAY29kZXtAQGFhOjE2fSx9Ci0gICAgICAgICAgQHJ7QGNvZGV7I3h4Ojh9LCBAY29kZXsjeHg6MTZ9fQotZWFfbWVtICAgIEBye0Bjb2Rle0BAcm59LCBAY29kZXtAQChkOjgsIHJuKX0sIEBjb2Rle0BAKGQ6MTYsIHJuKX0sfQotICAgICAgICAgIEBye0Bjb2Rle0BALXJufSwgQGNvZGV7QEBybit9LCBAY29kZXtAQGFhOjh9LCBAY29kZXtAQGFhOjE2fX0KLWVhX25vaW1tICBAcntAY29kZXtybn0sIEBjb2Rle0BAcm59LCBAY29kZXtAQChkOjgsIHJuKX0sIEBjb2Rle0BAKGQ6MTYsIHJuKX0sfQotICAgICAgICAgIEBye0Bjb2Rle0BALXJufSwgQGNvZGV7QEBybit9LCBAY29kZXtAQGFhOjh9LCBAY29kZXtAQGFhOjE2fX0KLWZwICAgICAgICByNgotaW1tNCAgICAgIEByezQtYml0IGltbWVkaWF0ZSBkYXRhfQotaW1tOCAgICAgIEByezgtYml0IGltbWVkaWF0ZSBkYXRhfQotaW1tMTYgICAgIEByezE2LWJpdCBpbW1lZGlhdGUgZGF0YX0KLXBjcmVsOCAgICBAcns4LWJpdCBvZmZzZXQgZnJvbSBwcm9ncmFtIGNvdW50ZXJ9Ci1wY3JlbDE2ICAgQHJ7MTYtYml0IG9mZnNldCBmcm9tIHByb2dyYW0gY291bnRlcn0KLXFpbSAgICAgICBAcntAY29kZXstMn0sIEBjb2Rley0xfSwgQGNvZGV7MX0sIEBjb2RlezJ9fQotcmQgICAgICAgIEBye2FueSByZWdpc3Rlcn0KLXJzICAgICAgICBAcnthIHJlZ2lzdGVyIGRpc3RpbmN0IGZyb20gcmR9Ci1ybGlzdCAgICAgQHJ7Y29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVnaXN0ZXJzIGluIHBhcmVudGhlc2VzO30KLSAgICAgICAgICBAcntyZWdpc3RlciByYW5nZXMgQGNvZGV7cmQtcnN9IGFyZSBhbGxvd2VkfQotc3AgICAgICAgIEBye3N0YWNrIHBvaW50ZXIgKEBjb2Rle3I3fSl9Ci1zciAgICAgICAgQHJ7c3RhdHVzIHJlZ2lzdGVyfQotc3ogICAgICAgIEBye3NpemU7IEBzYW1wey5ifSBvciBAc2FtcHsud30uICBJZiBvbWl0dGVkLCBkZWZhdWx0IEBzYW1wey53fX0KLQotbGRjWy5iXSBlYSxjcmIgICAgICAgICAgICAgICAgIGJjY1sud10gcGNyZWwxNgotbGRjWy53XSBlYSxzciAgICAgICAgICAgICAgICAgIGJjY1suYl0gcGNyZWw4IAotYWRkWzpxXSBzeiBxaW0sZWFfbm9pbW0gICAgICAgIGJoc1sud10gcGNyZWwxNgotYWRkWzpnXSBzeiBlYSxyZCAgICAgICAgICAgICAgIGJoc1suYl0gcGNyZWw4IAotYWRkcyBzeiBlYSxyZCAgICAgICAgICAgICAgICAgIGJjc1sud10gcGNyZWwxNgotYWRkeCBzeiBlYSxyZCAgICAgICAgICAgICAgICAgIGJjc1suYl0gcGNyZWw4IAotYW5kIHN6IGVhLHJkICAgICAgICAgICAgICAgICAgIGJsb1sud10gcGNyZWwxNgotYW5kY1suYl0gaW1tOCxjcmIgICAgICAgICAgICAgIGJsb1suYl0gcGNyZWw4IAotYW5kY1sud10gaW1tMTYsc3IgICAgICAgICAgICAgIGJuZVsud10gcGNyZWwxNgotYnB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJuZVsuYl0gcGNyZWw4IAotYnJhWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIGJlcVsud10gcGNyZWwxNgotYnJhWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIGJlcVsuYl0gcGNyZWw4IAotYnRbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgIGJ2Y1sud10gcGNyZWwxNgotYnRbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgIGJ2Y1suYl0gcGNyZWw4IAotYnJuWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIGJ2c1sud10gcGNyZWwxNgotYnJuWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIGJ2c1suYl0gcGNyZWw4IAotYmZbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgIGJwbFsud10gcGNyZWwxNgotYmZbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgIGJwbFsuYl0gcGNyZWw4IAotYmhpWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIGJtaVsud10gcGNyZWwxNgotYmhpWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIGJtaVsuYl0gcGNyZWw4IAotYmxzWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIGJnZVsud10gcGNyZWwxNgotYmxzWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIGJnZVsuYl0gcGNyZWw4IAotQHBhZ2UKLWJsdFsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBtb3ZbOmddWy5iXSBpbW04LGVhX21lbSAgICAgICAKLWJsdFsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBtb3ZbOmddWy53XSBpbW0xNixlYV9tZW0gICAgICAKLWJndFsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBtb3ZmcGVbLmJdIGVhLHJkICAgICAgICAgICAgICAKLWJndFsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBtb3Z0cGVbLmJdIHJzLGVhX25vaW1tICAgICAgICAKLWJsZVsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBtdWx4dSBzeiBlYSxyZCAgICAgICAgICAgICAgICAKLWJsZVsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBuZWcgc3ogZWEgICAgICAgICAgICAgICAgICAgICAKLWJjbHIgc3ogaW1tNCxlYV9ub2ltbSAgICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWJjbHIgc3ogcnMsZWFfbm9pbW0gICAgICAgICAgICBub3Qgc3ogZWEgICAgICAgICAgICAgICAgICAgICAKLWJub3Qgc3ogaW1tNCxlYV9ub2ltbSAgICAgICAgICBvciBzeiBlYSxyZCAgICAgICAgICAgICAgICAgICAKLWJub3Qgc3ogcnMsZWFfbm9pbW0gICAgICAgICAgICBvcmNbLmJdIGltbTgsY3JiICAgICAgICAgICAgICAKLWJzZXQgc3ogaW1tNCxlYV9ub2ltbSAgICAgICAgICBvcmNbLnddIGltbTE2LHNyICAgICAgICAgICAgICAKLWJzZXQgc3ogcnMsZWFfbm9pbW0gICAgICAgICAgICBwam1wIGFiczI0ICAgICAgICAgICAgICAgICAgICAKLWJzclsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBwam1wIEBAcmQgICAgICAgICAgICAgICAgICAgICAKLWJzclsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBwanNyIGFiczI0ICAgICAgICAgICAgICAgICAgICAKLWJ0c3Qgc3ogaW1tNCxlYV9ub2ltbSAgICAgICAgICBwanNyIEBAcmQgICAgICAgICAgICAgICAgICAgICAKLWJ0c3Qgc3ogcnMsZWFfbm9pbW0gICAgICAgICAgICBwcnRkIGltbTggICAgICAgICAgICAgICAgICAgICAKLWNsciBzeiBlYSAgICAgICAgICAgICAgICAgICAgICBwcnRkIGltbTE2ICAgICAgICAgICAgICAgICAgICAKLWNtcFs6ZV1bLmJdIGltbTgscmQgICAgICAgICAgICBwcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAKLWNtcFs6aV1bLnddIGltbTE2LHJkICAgICAgICAgICByb3RsIHN6IGVhICAgICAgICAgICAgICAgICAgICAKLWNtcFs6Z10uYiBpbW04LGVhX25vaW1tICAgICAgICByb3RyIHN6IGVhICAgICAgICAgICAgICAgICAgICAKLWNtcFs6Z11bLnddIGltbTE2LGVhX25vaW1tICAgICByb3R4bCBzeiBlYSAgICAgICAgICAgICAgICAgICAKLUNtcFs6Z10gc3ogZWEscmQgICAgICAgICAgICAgICByb3R4ciBzeiBlYSAgICAgICAgICAgICAgICAgICAKLWRhZGQgcnMscmQgICAgICAgICAgICAgICAgICAgICBydGQgaW1tOCAgICAgICAgICAgICAgICAgICAgIAotZGl2eHUgc3ogZWEscmQgICAgICAgICAgICAgICAgIHJ0ZCBpbW0xNiAgICAgICAgICAgICAgICAgICAgCi1kc3ViIHJzLHJkICAgICAgICAgICAgICAgICAgICAgcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAKLWV4dHNbLmJdIHJkICAgICAgICAgICAgICAgICAgICBzY2IvZiBycyxwY3JlbDggICAgICAgICAgICAgICAKLWV4dHVbLmJdIHJkICAgICAgICAgICAgICAgICAgICBzY2IvbmUgcnMscGNyZWw4ICAgICAgICAgICAgIAotam1wIEBAcmQgICAgICAgICAgICAgICAgICAgICAgICBzY2IvZXEgcnMscGNyZWw4ICAgICAgICAgICAgIAotam1wIEBAKGltbTgscmQpICAgICAgICAgICAgICAgICBzaGFsIHN6IGVhICAgICAgICAgICAgICAgICAgIAotam1wIEBAKGltbTE2LHJkKSAgICAgICAgICAgICAgICBzaGFyIHN6IGVhICAgICAgICAgICAgICAgICAgICAKLWptcCBhYnMxNiAgICAgICAgICAgICAgICAgICAgICBzaGxsIHN6IGVhICAgICAgICAgICAgCi1qc3IgQEByZCAgICAgICAgICAgICAgICAgICAgICAgIHNobHIgc3ogZWEgICAgICAgICAgICAKLWpzciBAQChpbW04LHJkKSAgICAgICAgICAgICAgICAgc2xlZXAgICAgICAgICAgICAgICAgIAotanNyIEBAKGltbTE2LHJkKSAgICAgICAgICAgICAgICBzdGNbLmJdIGNyYixlYV9ub2ltbSAgCi1qc3IgYWJzMTYgICAgICAgICAgICAgICAgICAgICAgc3RjWy53XSBzcixlYV9ub2ltbSAgIAotbGRtIEBAc3ArLChybGlzdCkgICAgICAgICAgICAgICBzdG0gKHJsaXN0KSxAQC1zcCAgICAgCi1saW5rIGZwLGltbTggICAgICAgICAgICAgICAgICAgc3ViIHN6IGVhLHJkICAgICAgICAgIAotbGluayBmcCxpbW0xNiAgICAgICAgICAgICAgICAgIHN1YnMgc3ogZWEscmQgICAgICAgICAKLW1vdls6ZV1bLmJdIGltbTgscmQgICAgICAgICAgICBzdWJ4IHN6IGVhLHJkICAgICAgICAgCi1tb3ZbOmldWy53XSBpbW0xNixyZCAgICAgICAgICAgc3dhcFsuYl0gcmQgICAgICAgICAgIAotbW92WzpsXVsud10gYWJzOCxyZCAgICAgICAgICAgIHRhc1suYl0gZWEgICAgIAotbW92WzpsXS5iIGFiczgscmQgICAgICAgICAgICAgIHRyYXBhIGltbTQgICAgIAotbW92WzpzXVsud10gcnMsYWJzOCAgICAgICAgICAgIHRyYXAvdnMgICAgICAgIAotbW92WzpzXS5iIHJzLGFiczggICAgICAgICAgICAgIHRzdCBzeiBlYSAgICAgIAotbW92WzpmXVsud10gQEAoZGlzcDgsZnApLHJkICAgICB1bmxrIGZwICAgICAgICAKLW1vdls6Zl1bLnddIHJzLEBAKGRpc3A4LGZwKSAgICAgeGNoWy53XSBycyxyZCAKLW1vdls6Zl0uYiBAQChkaXNwOCxmcCkscmQgICAgICAgeG9yIHN6IGVhLHJkICAgCi1tb3ZbOmZdLmIgcnMsQEAoZGlzcDgsZnApICAgICAgIHhvcmMuYiBpbW04LGNyYgotbW92WzpnXSBzeiBycyxlYV9tZW0gICAgICAgICAgIHhvcmMudyBpbW0xNixzcgotbW92WzpnXSBzeiBlYSxyZCAgICAgICAgICAgICAgCi1AZW5kIHNtYWxsZXhhbXBsZQotQGVuZCBpZnNldApkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWhwcGEudGV4aSBiL2dhcy9kb2MvYy1ocHBhLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYTUzNWYuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLWhwcGEudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBwYWdlCi1Abm9kZSBIUFBBLURlcGVuZGVudAotQGNoYXB0ZXIgSFBQQSBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCAgc3VwcG9ydAotQG1lbnUKLSogSFBQQSBOb3Rlczo6ICAgICAgICAgICAgICAgIE5vdGVzCi0qIEhQUEEgT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIEhQUEEgU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogSFBQQSBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEhQUEEgRGlyZWN0aXZlczo6ICAgICAgICAgICBIUFBBIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBIUFBBIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEhQUEEgTm90ZXMKLUBzZWN0aW9uIE5vdGVzCi1BcyBhIGJhY2sgZW5kIGZvciBAc2N7Z251fSBAc2N7Y2N9IEBjb2Rle0B2YWx1ZXtBU319IGhhcyBiZWVuIHRocm91Z2hseSB0ZXN0ZWQgYW5kIHNob3VsZAotd29yayBleHRyZW1lbHkgd2VsbC4gIFdlIGhhdmUgdGVzdGVkIGl0IG9ubHkgbWluaW1hbGx5IG9uIGhhbmQgd3JpdHRlbiBhc3NlbWJseQotY29kZSBhbmQgbm8gb25lIGhhcyB0ZXN0ZWQgaXQgbXVjaCBvbiB0aGUgYXNzZW1ibHkgb3V0cHV0IGZyb20gdGhlIEhQCi1jb21waWxlcnMuCi0KLVRoZSBmb3JtYXQgb2YgdGhlIGRlYnVnZ2luZyBzZWN0aW9ucyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgb3JpZ2luYWwKLUBjb2Rle0B2YWx1ZXtBU319IHBvcnQgKHZlcnNpb24gMS4zWCkgd2FzIHJlbGVhc2VkOyB0aGVyZWZvcmUsCi15b3UgbXVzdCByZWJ1aWxkIGFsbCBIUFBBIG9iamVjdHMgYW5kIGxpYnJhcmllcyB3aXRoIHRoZSBuZXcgCi1hc3NlbWJsZXIgc28gdGhhdCB5b3UgY2FuIGRlYnVnIHRoZSBmaW5hbCBleGVjdXRhYmxlLgotCi1UaGUgSFBQQSBAY29kZXtAdmFsdWV7QVN9fSBwb3J0IGdlbmVyYXRlcyBhIHNtYWxsIHN1YnNldCBvZiB0aGUgcmVsb2NhdGlvbnMKLWF2YWlsYWJsZSBpbiB0aGUgU09NIGFuZCBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0cy4gIEFkZGl0aW9uYWwgcmVsb2NhdGlvbgotc3VwcG9ydCB3aWxsIGJlIGFkZGVkIGFzIGl0IGJlY29tZXMgbmVjZXNzYXJ5LiAgCi0KLUBub2RlIEhQUEEgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vIG1hY2hpbmUtZGVwZW5kZW50IGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgSFBQQS4KLQotQGNpbmRleCBIUFBBIFN5bnRheAotQG5vZGUgSFBQQSBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotVGhlIGFzc2VtYmxlciBzeW50YXggY2xvc2VseSBmb2xsb3dzIHRoZSBIUFBBIGluc3RydWN0aW9uIHNldAotcmVmZXJlbmNlIG1hbnVhbDsgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgYW5kIGdlbmVyYWwgc3ludGF4IGNsb3NlbHkgZm9sbG93IHRoZQotSFBQQSBhc3NlbWJseSBsYW5ndWFnZSByZWZlcmVuY2UgbWFudWFsLCB3aXRoIGEgZmV3IG5vdGV3b3J0aHkgZGlmZmVyZW5jZXMuCi0KLUZpcnN0LCBhIGNvbG9uIG1heSBpbW1lZGlhdGVseSBmb2xsb3cgYSBsYWJlbCBkZWZpbml0aW9uLiAgVGhpcyBpcwotc2ltcGx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggaG93IG1vc3QgYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbW1lcnMKLXdyaXRlIGNvZGUuCi0KLVNvbWUgb2JzY3VyZSBleHByZXNzaW9uIHBhcnNpbmcgcHJvYmxlbXMgbWF5IGFmZmVjdCBoYW5kIHdyaXR0ZW4gY29kZSB3aGljaAotdXNlcyB0aGUgQGNvZGV7c3BvcH0gaW5zdHJ1Y3Rpb25zLCBvciBjb2RlIHdoaWNoIG1ha2VzIHNpZ25pZmljYW50Ci11c2Ugb2YgdGhlIEBjb2RleyF9IGxpbmUgc2VwYXJhdG9yLgotCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBtdWNoIGxlc3MgZm9yZ2l2aW5nIGFib3V0IG1pc3NpbmcgYXJndW1lbnRzIGFuZCBvdGhlcgotc2ltaWxhciBvdmVyc2lnaHRzIHRoYW4gdGhlIEhQIGFzc2VtYmxlci4gIEBjb2Rle0B2YWx1ZXtBU319IG5vdGlmaWVzIHlvdQotb2YgbWlzc2luZyBhcmd1bWVudHMgYXMgc3ludGF4IGVycm9yczsgdGhpcyBpcyByZWdhcmRlZCBhcyBhIGZlYXR1cmUsIG5vdCBhCi1idWcuCi0KLUZpbmFsbHksIEBjb2Rle0B2YWx1ZXtBU319IGFsbG93cyB5b3UgdG8gdXNlIGFuIGV4dGVybmFsIHN5bWJvbCB3aXRob3V0Ci1leHBsaWNpdGx5IGltcG9ydGluZyB0aGUgc3ltYm9sLiAgQGVtcGh7V2FybmluZzp9IGluIHRoZSBmdXR1cmUgdGhpcyB3aWxsIGJlCi1hbiBlcnJvciBmb3IgSFBQQSB0YXJnZXRzLgotCi1TcGVjaWFsIGNoYXJhY3RlcnMgZm9yIEhQUEEgdGFyZ2V0cyBpbmNsdWRlOgotCi1Ac2FtcHs7fSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLQotQHNhbXB7IX0gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIG5ld2xpbmUgdG8gc2VwYXJhdGUgc3RhdGVtZW50cy4KLQotU2luY2UgQHNhbXB7JH0gaGFzIG5vIHNwZWNpYWwgbWVhbmluZywgeW91IG1heSB1c2UgaXQgaW4gc3ltYm9sIG5hbWVzLgotCi1Abm9kZSBIUFBBIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgSFBQQSAoQHNje2llZWV9KQotQGNpbmRleCBIUFBBIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgSFBQQSBmYW1pbHkgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotQG5vZGUgSFBQQSBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBIUFBBIEFzc2VtYmxlciBEaXJlY3RpdmVzCi0KLUBjb2Rle0B2YWx1ZXtBU319IGZvciB0aGUgSFBQQSBzdXBwb3J0cyBtYW55IGFkZGl0aW9uYWwgZGlyZWN0aXZlcyBmb3IKLWNvbXBhdGliaWxpdHkgd2l0aCB0aGUgbmF0aXZlIGFzc2VtYmxlci4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlbSBvbmx5Ci1icmllZmx5LiAgRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIEhQUEEtc3BlY2lmaWMgYXNzZW1ibGVyIGRpcmVjdGl2ZXMsIHNlZQotQGNpdGV7SFA5MDAwIFNlcmllcyA4MDAgQXNzZW1ibHkgTGFuZ3VhZ2UgUmVmZXJlbmNlIE1hbnVhbH0gKEhQIDkyNDMyLTkwMDAxKS4KLQotQGNpbmRleCBIUFBBIGRpcmVjdGl2ZXMgbm90IHN1cHBvcnRlZAotQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBAZW1waHtub3R9IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBhc3NlbWJsZXIgZGlyZWN0aXZlcwotZGVzY3JpYmVkIGluIHRoZSBIUCBtYW51YWw6Ci0KLUBleGFtcGxlCi0uZW5kbSAgICAgICAgICAgLmxpc3RvbgotLmVudGVyICAgICAgICAgIC5sb2NjdAotLmxlYXZlICAgICAgICAgIC5tYWNybyAgCi0ubGlzdG9mZgotQGVuZCBleGFtcGxlCi0KLUBjaW5kZXggQGNvZGV7LnBhcmFtfSBvbiBIUFBBCi1CZXlvbmQgdGhvc2UgaW1wbGVtZW50ZWQgZm9yIGNvbXBhdGliaWxpdHksIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIG9uZQotYWRkaXRpb25hbCBhc3NlbWJsZXIgZGlyZWN0aXZlIGZvciB0aGUgSFBQQTogQGNvZGV7LnBhcmFtfS4gIEl0IGNvbnZleXMKLXJlZ2lzdGVyIGFyZ3VtZW50IGxvY2F0aW9ucyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gIEl0cyBzeW50YXggY2xvc2VseSBmb2xsb3dzCi10aGUgQGNvZGV7LmV4cG9ydH0gZGlyZWN0aXZlLgotCi1AY2luZGV4IEhQUEEtb25seSBkaXJlY3RpdmVzCi1UaGVzZSBhcmUgdGhlIGFkZGl0aW9uYWwgZGlyZWN0aXZlcyBpbiBAY29kZXtAdmFsdWV7QVN9fSBmb3IgdGhlIEhQUEE6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLmJsb2NrIEB2YXJ7bn0KLUBpdGVteCAuYmxvY2t6IEB2YXJ7bn0KLVJlc2VydmUgQHZhcntufSBieXRlcyBvZiBzdG9yYWdlLCBhbmQgaW5pdGlhbGl6ZSB0aGVtIHRvIHplcm8uCi0KLUBpdGVtIC5jYWxsIAotTWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgcHJvY2VkdXJlIGNhbGwuICBPbmx5IHRoZSBzcGVjaWFsIGNhc2Ugd2l0aCBAZW1waHtubwotYXJndW1lbnRzfSBpcyBhbGxvd2VkLgotCi1AaXRlbSAuY2FsbGluZm8gWyBAdmFye3BhcmFtfT1AdmFye3ZhbHVlfSwgQGRvdHN7fSBdICBbIEB2YXJ7ZmxhZ30sIEBkb3Rze30gXQotU3BlY2lmeSBhIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFuZCBmbGFncyB0aGF0IGRlZmluZSB0aGUgZW52aXJvbm1lbnQgZm9yIGEKLXByb2NlZHVyZS4KLQotQHZhcntwYXJhbX0gbWF5IGJlIGFueSBvZiBAc2FtcHtmcmFtZX0gKGZyYW1lIHNpemUpLCBAc2FtcHtlbnRyeV9ncn0gKGVuZCBvZgotZ2VuZXJhbCByZWdpc3RlciByYW5nZSksIEBzYW1we2VudHJ5X2ZyfSAoZW5kIG9mIGZsb2F0IHJlZ2lzdGVyIHJhbmdlKSwKLUBzYW1we2VudHJ5X3NyfSAoZW5kIG9mIHNwYWNlIHJlZ2lzdGVyIHJhbmdlKS4KLQotVGhlIHZhbHVlcyBmb3IgQHZhcntmbGFnfSBhcmUgQHNhbXB7Y2FsbHN9IG9yIEBzYW1we2NhbGxlcn0gKHByb2MgaGFzCi1zdWJyb3V0aW5lcyksIEBzYW1we25vX2NhbGxzfSAocHJvYyBkb2VzIG5vdCBjYWxsIHN1YnJvdXRpbmVzKSwgQHNhbXB7c2F2ZV9ycH0KLShwcmVzZXJ2ZSByZXR1cm4gcG9pbnRlciksIEBzYW1we3NhdmVfc3B9IChwcm9jIHByZXNlcnZlcyBzdGFjayBwb2ludGVyKSwKLUBzYW1we25vX3Vud2luZH0gKGRvIG5vdCB1bndpbmQgdGhpcyBwcm9jKSwgQHNhbXB7aHB1eF9pbnR9IChwcm9jIGlzIGludGVycnVwdAotcm91dGluZSkuCi0KLUBpdGVtIC5jb2RlCi1Bc3NlbWJsZSBpbnRvIHRoZSBzdGFuZGFyZCBzZWN0aW9uIGNhbGxlZCBAc2FtcHskVEVYVCR9LCBzdWJzZWN0aW9uCi1Ac2FtcHskQ09ERSR9LgotCi1AaWZzZXQgU09NCi1AaXRlbSAuY29weXJpZ2h0ICJAdmFye3N0cmluZ30iCi1JbiB0aGUgU09NIG9iamVjdCBmb3JtYXQsIGluc2VydCBAdmFye3N0cmluZ30gaW50byB0aGUgb2JqZWN0IGNvZGUsIG1hcmtlZCBhcyBhCi1jb3B5cmlnaHQgc3RyaW5nLgotQGVuZCBpZnNldAotCi1AaWZzZXQgRUxGCi1AaXRlbSAuY29weXJpZ2h0ICJAdmFye3N0cmluZ30iCi1JbiB0aGUgRUxGIG9iamVjdCBmb3JtYXQsIGluc2VydCBAdmFye3N0cmluZ30gaW50byB0aGUgb2JqZWN0IGNvZGUsIG1hcmtlZCBhcyBhCi12ZXJzaW9uIHN0cmluZy4KLUBlbmQgaWZzZXQKLQotQGl0ZW0gLmVudGVyCi1Ob3QgeWV0IHN1cHBvcnRlZDsgdGhlIGFzc2VtYmxlciByZWplY3RzIHByb2dyYW1zIGNvbnRhaW5pbmcgdGhpcyBkaXJlY3RpdmUuCi0KLUBpdGVtIC5lbnRyeQotTWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgcHJvY2VkdXJlLgotCi1AaXRlbSAuZXhpdAotTWFyayB0aGUgZW5kIG9mIGEgcHJvY2VkdXJlLgotCi1AaXRlbSAuZXhwb3J0IEB2YXJ7bmFtZX0gWyAsQHZhcnt0eXB9IF0gIFsgLEB2YXJ7cGFyYW19PUB2YXJ7cn0gXQotTWFrZSBhIHByb2NlZHVyZSBAdmFye25hbWV9IGF2YWlsYWJsZSB0byBjYWxsZXJzLiAgQHZhcnt0eXB9LCBpZiBwcmVzZW50LCBtdXN0Ci1iZSBvbmUgb2YgQHNhbXB7YWJzb2x1dGV9LCBAc2FtcHtjb2RlfSAoRUxGIG9ubHksIG5vdCBTT00pLCBAc2FtcHtkYXRhfSwKLUBzYW1we2VudHJ5fSwgQHNhbXB7ZGF0YX0sIEBzYW1we2VudHJ5fSwgQHNhbXB7bWlsbGljb2RlfSwgQHNhbXB7cGxhYmVsfSwKLUBzYW1we3ByaV9wcm9nfSwgb3IgQHNhbXB7c2VjX3Byb2d9LgotCi1AdmFye3BhcmFtfSwgaWYgcHJlc2VudCwgcHJvdmlkZXMgZWl0aGVyIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZQotcHJvY2VkdXJlIGFyZ3VtZW50cyBhbmQgcmVzdWx0LCBvciBhIHByaXZpbGVnZSBsZXZlbC4gIEB2YXJ7cGFyYW19IG1heSBiZQotQHNhbXB7YXJnd0B2YXJ7bn19ICh3aGVyZSBAdmFye259IHJhbmdlcyBmcm9tIEBjb2RlezB9IHRvIEBjb2RlezN9LCBhbmQKLWluZGljYXRlcyBvbmUgb2YgZm91ciBvbmUtd29yZCBhcmd1bWVudHMpOyBAc2FtcHtydG52YWx9ICh0aGUgcHJvY2VkdXJlJ3MKLXJlc3VsdCk7IG9yIEBzYW1we3ByaXZfbGV2fSAocHJpdmlsZWdlIGxldmVsKS4gIEZvciBhcmd1bWVudHMgb3IgdGhlIHJlc3VsdCwKLUB2YXJ7cn0gc3BlY2lmaWVzIGhvdyB0byByZWxvY2F0ZSwgYW5kIG11c3QgYmUgb25lIG9mIEBzYW1we25vfSAobm90Ci1yZWxvY2F0YWJsZSksIEBzYW1we2dyfSAoYXJndW1lbnQgaXMgaW4gZ2VuZXJhbCByZWdpc3RlciksIEBzYW1we2ZyfSAoaW4KLWZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyKSwgb3IgQHNhbXB7ZnV9ICh1cHBlciBoYWxmIG9mIGZsb2F0IHJlZ2lzdGVyKS4KLUZvciBAc2FtcHtwcml2X2xldn0sIEB2YXJ7cn0gaXMgYW4gaW50ZWdlci4KLQotQGl0ZW0gLmhhbGYgQHZhcntufQotRGVmaW5lIGEgdHdvLWJ5dGUgaW50ZWdlciBjb25zdGFudCBAdmFye259OyBzeW5vbnltIGZvciB0aGUgcG9ydGFibGUKLUBjb2Rle0B2YWx1ZXtBU319IGRpcmVjdGl2ZSBAY29kZXsuc2hvcnR9LgotCi1AaXRlbSAuaW1wb3J0IEB2YXJ7bmFtZX0gWyAsQHZhcnt0eXB9IF0KLUNvbnZlcnNlIG9mIEBjb2Rley5leHBvcnR9OyBtYWtlIGEgcHJvY2VkdXJlIGF2YWlsYWJsZSB0byBjYWxsLiAgVGhlIGFyZ3VtZW50cwotdXNlIHRoZSBzYW1lIGNvbnZlbnRpb25zIGFzIHRoZSBmaXJzdCB0d28gYXJndW1lbnRzIGZvciBAY29kZXsuZXhwb3J0fS4KLQotQGl0ZW0gLmxhYmVsIEB2YXJ7bmFtZX0KLURlZmluZSBAdmFye25hbWV9IGFzIGEgbGFiZWwgZm9yIHRoZSBjdXJyZW50IGFzc2VtYmx5IGxvY2F0aW9uLgotCi1AaXRlbSAubGVhdmUKLU5vdCB5ZXQgc3VwcG9ydGVkOyB0aGUgYXNzZW1ibGVyIHJlamVjdHMgcHJvZ3JhbXMgY29udGFpbmluZyB0aGlzIGRpcmVjdGl2ZS4KLQotQGl0ZW0gLm9yaWdpbiBAdmFye2xjfQotQWR2YW5jZSBsb2NhdGlvbiBjb3VudGVyIHRvIEB2YXJ7bGN9LiBTeW5vbnltIGZvciB0aGUgQGNvZGV7QHZhbHVle2FzfX0KLXBvcnRhYmxlIGRpcmVjdGl2ZSBAY29kZXsub3JnfS4KLQotQGl0ZW0gLnBhcmFtIEB2YXJ7bmFtZX0gWyAsQHZhcnt0eXB9IF0gIFsgLEB2YXJ7cGFyYW19PUB2YXJ7cn0gXQotQGMgTm90IGluIEhQIG1hbnVhbDsgQHNje2dudX0gSFBQQSBleHRlbnNpb24KLVNpbWlsYXIgdG8gQGNvZGV7LmV4cG9ydH0sIGJ1dCB1c2VkIGZvciBzdGF0aWMgcHJvY2VkdXJlcy4KLQotQGl0ZW0gLnByb2MKLVVzZSBwcmVjZWRpbmcgdGhlIGZpcnN0IHN0YXRlbWVudCBvZiBhIHByb2NlZHVyZS4KLQotQGl0ZW0gLnByb2NlbmQKLVVzZSBmb2xsb3dpbmcgdGhlIGxhc3Qgc3RhdGVtZW50IG9mIGEgcHJvY2VkdXJlLgotCi1AaXRlbSBAdmFye2xhYmVsfSAucmVnIEB2YXJ7ZXhwcn0KLUBjID8/IE5vdCBpbiBIUCBtYW51YWwgKEphbiAxOTg4IHZuKQotU3lub255bSBmb3IgQGNvZGV7LmVxdX07IGRlZmluZSBAdmFye2xhYmVsfSB3aXRoIHRoZSBhYnNvbHV0ZSBleHByZXNzaW9uCi1AdmFye2V4cHJ9IGFzIGl0cyB2YWx1ZS4KLQotQGl0ZW0gLnNwYWNlIEB2YXJ7c2VjbmFtZX0gWyAsQHZhcntwYXJhbXN9IF0KLVN3aXRjaCB0byBzZWN0aW9uIEB2YXJ7c2VjbmFtZX0sIGNyZWF0aW5nIGEgbmV3IHNlY3Rpb24gYnkgdGhhdCBuYW1lIGlmCi1uZWNlc3NhcnkuICBZb3UgbWF5IG9ubHkgdXNlIEB2YXJ7cGFyYW1zfSB3aGVuIGNyZWF0aW5nIGEgbmV3IHNlY3Rpb24sIG5vdAotd2hlbiBzd2l0Y2hpbmcgdG8gYW4gZXhpc3Rpbmcgb25lLiAgQHZhcntzZWNuYW1lfSBtYXkgaWRlbnRpZnkgYSBzZWN0aW9uIGJ5Ci1udW1iZXIgcmF0aGVyIHRoYW4gYnkgbmFtZS4KLQotSWYgc3BlY2lmaWVkLCB0aGUgbGlzdCBAdmFye3BhcmFtc30gZGVjbGFyZXMgYXR0cmlidXRlcyBvZiB0aGUgc2VjdGlvbiwKLWlkZW50aWZpZWQgYnkga2V5d29yZHMuICBUaGUga2V5d29yZHMgcmVjb2duaXplZCBhcmUgQHNhbXB7c3BudW09QHZhcntleHB9fQotKGlkZW50aWZ5IHRoaXMgc2VjdGlvbiBieSB0aGUgbnVtYmVyIEB2YXJ7ZXhwfSwgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiksCi1Ac2FtcHtzb3J0PUB2YXJ7ZXhwfX0gKG9yZGVyIHNlY3Rpb25zIGFjY29yZGluZyB0byB0aGlzIHNvcnQga2V5IHdoZW4gbGlua2luZzsKLUB2YXJ7ZXhwfSBpcyBhbiBhYnNvbHV0ZSBleHByZXNzaW9uKSwgQHNhbXB7dW5sb2FkYWJsZX0gKHNlY3Rpb24gY29udGFpbnMgbm8KLWxvYWRhYmxlIGRhdGEpLCBAc2FtcHtub3RkZWZpbmVkfSAodGhpcyBzZWN0aW9uIGRlZmluZWQgZWxzZXdoZXJlKSwgYW5kCi1Ac2FtcHtwcml2YXRlfSAoZGF0YSBpbiB0aGlzIHNlY3Rpb24gbm90IGF2YWlsYWJsZSB0byBvdGhlciBwcm9ncmFtcykuCi0KLUBpdGVtIC5zcG51bSBAdmFye3NlY25hbX0KLUBjID8/IE5vdCBpbiBIUCBtYW51YWwgKEphbiAxOTg4KQotQWxsb2NhdGUgZm91ciBieXRlcyBvZiBzdG9yYWdlLCBhbmQgaW5pdGlhbGl6ZSB0aGVtIHdpdGggdGhlIHNlY3Rpb24gbnVtYmVyIG9mCi10aGUgc2VjdGlvbiBuYW1lZCBAdmFye3NlY25hbX0uICAoWW91IGNhbiBkZWZpbmUgdGhlIHNlY3Rpb24gbnVtYmVyIHdpdGggdGhlCi1IUFBBIEBjb2Rley5zcGFjZX0gZGlyZWN0aXZlLikKLQotQGNpbmRleCBAY29kZXtzdHJpbmd9IGRpcmVjdGl2ZSBvbiBIUFBBCi1AaXRlbSAuc3RyaW5nICJAdmFye3N0cn0iCi1Db3B5IHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgQHZhcntzdHJ9IHRvIHRoZSBvYmplY3QgZmlsZS4KLUB4cmVme1N0cmluZ3MsLFN0cmluZ3N9LCBmb3IgaW5mb3JtYXRpb24gb24gZXNjYXBlIHNlcXVlbmNlcyB5b3UgY2FuIHVzZSBpbgotQGNvZGV7QHZhbHVle0FTfX0gc3RyaW5ncy4KLQotQGVtcGh7V2FybmluZyF9IFRoZSBIUFBBIHZlcnNpb24gb2YgQGNvZGV7LnN0cmluZ30gZGlmZmVycyBmcm9tIHRoZQotdXN1YWwgQGNvZGV7QHZhbHVle0FTfX0gZGVmaW5pdGlvbjogaXQgZG9lcyBAZW1waHtub3R9IHdyaXRlIGEgemVybyBieXRlCi1hZnRlciBjb3B5aW5nIEB2YXJ7c3RyfS4KLQotQGl0ZW0gLnN0cmluZ3ogIkB2YXJ7c3RyfSIKLUxpa2UgQGNvZGV7LnN0cmluZ30sIGJ1dCBhcHBlbmRzIGEgemVybyBieXRlIGFmdGVyIGNvcHlpbmcgQHZhcntzdHJ9IHRvIG9iamVjdAotZmlsZS4KLQotQGl0ZW0gLnN1YnNwYSBAdmFye25hbWV9IFsgLEB2YXJ7cGFyYW1zfSBdCi1AaXRlbXggLm5zdWJzcGEgQHZhcntuYW1lfSBbICxAdmFye3BhcmFtc30gXQotU2ltaWxhciB0byBAY29kZXsuc3BhY2V9LCBidXQgc2VsZWN0cyBhIHN1YnNlY3Rpb24gQHZhcntuYW1lfSB3aXRoaW4gdGhlCi1jdXJyZW50IHNlY3Rpb24uICBZb3UgbWF5IG9ubHkgc3BlY2lmeSBAdmFye3BhcmFtc30gd2hlbiB5b3UgY3JlYXRlIGEKLXN1YnNlY3Rpb24gKGluIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBAY29kZXsuc3Vic3BhfSBmb3IgdGhpcyBAdmFye25hbWV9KS4KLQotSWYgc3BlY2lmaWVkLCB0aGUgbGlzdCBAdmFye3BhcmFtc30gZGVjbGFyZXMgYXR0cmlidXRlcyBvZiB0aGUgc3Vic2VjdGlvbiwKLWlkZW50aWZpZWQgYnkga2V5d29yZHMuICBUaGUga2V5d29yZHMgcmVjb2duaXplZCBhcmUgQHNhbXB7cXVhZD1AdmFye2V4cHJ9fQotKGBgcXVhZHJhbnQnJyBmb3IgdGhpcyBzdWJzZWN0aW9uKSwgQHNhbXB7YWxpZ249QHZhcntleHByfX0gKGFsaWdubWVudCBmb3IKLWJlZ2lubmluZyBvZiB0aGlzIHN1YnNlY3Rpb247IGEgcG93ZXIgb2YgdHdvKSwgQHNhbXB7YWNjZXNzPUB2YXJ7ZXhwcn19ICh2YWx1ZQotZm9yIGBgYWNjZXNzIHJpZ2h0cycnIGZpZWxkKSwgQHNhbXB7c29ydD1AdmFye2V4cHJ9fSAoc29ydGluZyBvcmRlciBmb3IgdGhpcwotc3Vic3BhY2UgaW4gbGluayksIEBzYW1we2NvZGVfb25seX0gKHN1YnNlY3Rpb24gY29udGFpbnMgb25seSBjb2RlKSwKLUBzYW1we3VubG9hZGFibGV9IChzdWJzZWN0aW9uIGNhbm5vdCBiZSBsb2FkZWQgaW50byBtZW1vcnkpLCBAc2FtcHtjb21tb259Ci0oc3Vic2VjdGlvbiBpcyBjb21tb24gYmxvY2spLCBAc2FtcHtkdXBfY29tbX0gKGluaXRpYWxpemVkIGRhdGEgbWF5IGhhdmUKLWR1cGxpY2F0ZSBuYW1lcyksIG9yIEBzYW1we3plcm99IChzdWJzZWN0aW9uIGlzIGFsbCB6ZXJvcywgZG8gbm90IHdyaXRlIGluCi1vYmplY3QgZmlsZSkuCi0KLUBjb2Rley5uc3Vic3BhfSBhbHdheXMgY3JlYXRlcyBhIG5ldyBzdWJzcGFjZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBldmVuCi1pZiBvbmUgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotCi1AaXRlbSAudmVyc2lvbiAiQHZhcntzdHJ9IgotV3JpdGUgQHZhcntzdHJ9IGFzIHZlcnNpb24gaWRlbnRpZmllciBpbiBvYmplY3QgY29kZS4KLUBlbmQgdGFibGUKLQotQG5vZGUgSFBQQSBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEhQUEEgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7UEEtUklTQyBBcmNoaXRlY3R1cmUgYW5kIEluc3RydWN0aW9uIFNldCBSZWZlcmVuY2UgTWFudWFsfSAKLShIUCAwOTc0MC05MDAzOSkuCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtaTM4Ni50ZXhpIGIvZ2FzL2RvYy9jLWkzODYudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5Yzg1YS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtaTM4Ni50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIGkzODYtRGVwZW5kZW50Ci1AY2hhcHRlciA4MDM4NiBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciA4MDM4NiBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IGkzODYgc3VwcG9ydAotQGNpbmRleCBpODAzMDYgc3VwcG9ydAotQG1lbnUKLSogaTM4Ni1PcHRpb25zOjogICAgICAgICAgICAgICAgT3B0aW9ucwotKiBpMzg2LVN5bnRheDo6ICAgICAgICAgICAgICAgICBBVCZUIFN5bnRheCB2ZXJzdXMgSW50ZWwgU3ludGF4Ci0qIGkzODYtTW5lbW9uaWNzOjogICAgICAgICAgICAgIEluc3RydWN0aW9uIE5hbWluZwotKiBpMzg2LVJlZ3M6OiAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1pbmcKLSogaTM4Ni1QcmVmaXhlczo6ICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gUHJlZml4ZXMKLSogaTM4Ni1NZW1vcnk6OiAgICAgICAgICAgICAgICAgTWVtb3J5IFJlZmVyZW5jZXMKLSogaTM4Ni1qdW1wczo6ICAgICAgICAgICAgICAgICAgSGFuZGxpbmcgb2YgSnVtcCBJbnN0cnVjdGlvbnMKLSogaTM4Ni1GbG9hdDo6ICAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogaTM4Ni1TSU1EOjogICAgICAgICAgICAgICAgICAgSW50ZWwncyBNTVggYW5kIEFNRCdzIDNETm93ISBTSU1EIE9wZXJhdGlvbnMKLSogaTM4Ni0xNmJpdDo6ICAgICAgICAgICAgICAgICAgV3JpdGluZyAxNi1iaXQgQ29kZQotKiBpMzg2LUJ1Z3M6OiAgICAgICAgICAgICAgICAgICBBVCZUIFN5bnRheCBidWdzCi0qIGkzODYtTm90ZXM6OiAgICAgICAgICAgICAgICAgIE5vdGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgaTM4Ni1PcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggb3B0aW9ucyBmb3IgaTM4NiAobm9uZSkKLUBjaW5kZXggaTM4NiBvcHRpb25zIChub25lKQotVGhlIDgwMzg2IGhhcyBubyBtYWNoaW5lIGRlcGVuZGVudCBvcHRpb25zLgotCi1Abm9kZSBpMzg2LVN5bnRheAotQHNlY3Rpb24gQVQmVCBTeW50YXggdmVyc3VzIEludGVsIFN5bnRheAotCi1AY2luZGV4IGkzODYgc3ludGF4IGNvbXBhdGliaWxpdHkKLUBjaW5kZXggc3ludGF4IGNvbXBhdGliaWxpdHksIGkzODYKLUluIG9yZGVyIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb3V0cHV0IG9mIEBjb2Rle0B2YWx1ZXtHQ0N9fSwKLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIEFUJlQgU3lzdGVtIFYvMzg2IGFzc2VtYmxlciBzeW50YXguICBUaGlzIGlzIHF1aXRlCi1kaWZmZXJlbnQgZnJvbSBJbnRlbCBzeW50YXguICBXZSBtZW50aW9uIHRoZXNlIGRpZmZlcmVuY2VzIGJlY2F1c2UKLWFsbW9zdCBhbGwgODAzODYgZG9jdW1lbnRzIHVzZSBJbnRlbCBzeW50YXguICBOb3RhYmxlIGRpZmZlcmVuY2VzCi1iZXR3ZWVuIHRoZSB0d28gc3ludGF4ZXMgYXJlOgotCi1AY2luZGV4IGltbWVkaWF0ZSBvcGVyYW5kcywgaTM4NgotQGNpbmRleCBpMzg2IGltbWVkaWF0ZSBvcGVyYW5kcwotQGNpbmRleCByZWdpc3RlciBvcGVyYW5kcywgaTM4NgotQGNpbmRleCBpMzg2IHJlZ2lzdGVyIG9wZXJhbmRzCi1AY2luZGV4IGp1bXAvY2FsbCBvcGVyYW5kcywgaTM4NgotQGNpbmRleCBpMzg2IGp1bXAvY2FsbCBvcGVyYW5kcwotQGNpbmRleCBvcGVyYW5kIGRlbGltaXRlcnMsIGkzODYKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1BVCZUIGltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgcHJlY2VkZWQgYnkgQHNhbXB7JH07IEludGVsIGltbWVkaWF0ZQotb3BlcmFuZHMgYXJlIHVuZGVsaW1pdGVkIChJbnRlbCBAc2FtcHtwdXNoIDR9IGlzIEFUJlQgQHNhbXB7cHVzaGwgJDR9KS4KLUFUJlQgcmVnaXN0ZXIgb3BlcmFuZHMgYXJlIHByZWNlZGVkIGJ5IEBzYW1weyV9OyBJbnRlbCByZWdpc3RlciBvcGVyYW5kcwotYXJlIHVuZGVsaW1pdGVkLiAgQVQmVCBhYnNvbHV0ZSAoYXMgb3Bwb3NlZCB0byBQQyByZWxhdGl2ZSkganVtcC9jYWxsCi1vcGVyYW5kcyBhcmUgcHJlZml4ZWQgYnkgQHNhbXB7Kn07IHRoZXkgYXJlIHVuZGVsaW1pdGVkIGluIEludGVsIHN5bnRheC4KLQotQGNpbmRleCBpMzg2IHNvdXJjZSwgZGVzdGluYXRpb24gb3BlcmFuZHMKLUBjaW5kZXggc291cmNlLCBkZXN0aW5hdGlvbiBvcGVyYW5kczsgaTM4NgotQGl0ZW0KLUFUJlQgYW5kIEludGVsIHN5bnRheCB1c2UgdGhlIG9wcG9zaXRlIG9yZGVyIGZvciBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCi1vcGVyYW5kcy4gIEludGVsIEBzYW1we2FkZCBlYXgsIDR9IGlzIEBzYW1we2FkZGwgJDQsICVlYXh9LiAgVGhlCi1Ac2FtcHtzb3VyY2UsIGRlc3R9IGNvbnZlbnRpb24gaXMgbWFpbnRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCi1wcmV2aW91cyBVbml4IGFzc2VtYmxlcnMuICBOb3RlIHRoYXQgaW5zdHJ1Y3Rpb25zIHdpdGggbW9yZSB0aGFuIG9uZQotc291cmNlIG9wZXJhbmQsIHN1Y2ggYXMgdGhlIEBzYW1we2VudGVyfSBpbnN0cnVjdGlvbiwgZG8gQGVtcGh7bm90fSBoYXZlCi1yZXZlcnNlZCBvcmRlci4gIEByZWZ7aTM4Ni1CdWdzfS4KLQotQGNpbmRleCBtbmVtb25pYyBzdWZmaXhlcywgaTM4NgotQGNpbmRleCBzaXplcyBvcGVyYW5kcywgaTM4NgotQGNpbmRleCBpMzg2IHNpemUgc3VmZml4ZXMKLUBpdGVtCi1JbiBBVCZUIHN5bnRheCB0aGUgc2l6ZSBvZiBtZW1vcnkgb3BlcmFuZHMgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBsYXN0Ci1jaGFyYWN0ZXIgb2YgdGhlIGluc3RydWN0aW9uIG1uZW1vbmljLiAgTW5lbW9uaWMgc3VmZml4ZXMgb2YgQHNhbXB7Yn0sCi1Ac2FtcHt3fSwgYW5kIEBzYW1we2x9IHNwZWNpZnkgYnl0ZSAoOC1iaXQpLCB3b3JkICgxNi1iaXQpLCBhbmQgbG9uZwotKDMyLWJpdCkgbWVtb3J5IHJlZmVyZW5jZXMuICBJbnRlbCBzeW50YXggYWNjb21wbGlzaGVzIHRoaXMgYnkgcHJlZml4aW5nCi1tZW1vcnkgb3BlcmFuZHMgKEBlbXBoe25vdH0gdGhlIGluc3RydWN0aW9uIG1uZW1vbmljcykgd2l0aCBAc2FtcHtieXRlCi1wdHJ9LCBAc2FtcHt3b3JkIHB0cn0sIGFuZCBAc2FtcHtkd29yZCBwdHJ9LiAgVGh1cywgSW50ZWwgQHNhbXB7bW92IGFsLAotYnl0ZSBwdHIgQHZhcntmb299fSBpcyBAc2FtcHttb3ZiIEB2YXJ7Zm9vfSwgJWFsfSBpbiBBVCZUIHN5bnRheC4KLQotQGNpbmRleCByZXR1cm4gaW5zdHJ1Y3Rpb25zLCBpMzg2Ci1AY2luZGV4IGkzODYganVtcCwgY2FsbCwgcmV0dXJuCi1AaXRlbQotSW1tZWRpYXRlIGZvcm0gbG9uZyBqdW1wcyBhbmQgY2FsbHMgYXJlCi1Ac2FtcHtsY2FsbC9sam1wICRAdmFye3NlY3Rpb259LCAkQHZhcntvZmZzZXR9fSBpbiBBVCZUIHN5bnRheDsgdGhlCi1JbnRlbCBzeW50YXggaXMKLUBzYW1we2NhbGwvam1wIGZhciBAdmFye3NlY3Rpb259OkB2YXJ7b2Zmc2V0fX0uICBBbHNvLCB0aGUgZmFyIHJldHVybgotaW5zdHJ1Y3Rpb24KLWlzIEBzYW1we2xyZXQgJEB2YXJ7c3RhY2stYWRqdXN0fX0gaW4gQVQmVCBzeW50YXg7IEludGVsIHN5bnRheCBpcwotQHNhbXB7cmV0IGZhciBAdmFye3N0YWNrLWFkanVzdH19LgotCi1AY2luZGV4IHNlY3Rpb25zLCBpMzg2Ci1AY2luZGV4IGkzODYgc2VjdGlvbnMKLUBpdGVtCi1UaGUgQVQmVCBhc3NlbWJsZXIgZG9lcyBub3QgcHJvdmlkZSBzdXBwb3J0IGZvciBtdWx0aXBsZSBzZWN0aW9uCi1wcm9ncmFtcy4gIFVuaXggc3R5bGUgc3lzdGVtcyBleHBlY3QgYWxsIHByb2dyYW1zIHRvIGJlIHNpbmdsZSBzZWN0aW9ucy4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBpMzg2LU1uZW1vbmljcwotQHNlY3Rpb24gSW5zdHJ1Y3Rpb24gTmFtaW5nCi0KLUBjaW5kZXggaTM4NiBpbnN0cnVjdGlvbiBuYW1pbmcKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gbmFtaW5nLCBpMzg2Ci1JbnN0cnVjdGlvbiBtbmVtb25pY3MgYXJlIHN1ZmZpeGVkIHdpdGggb25lIGNoYXJhY3RlciBtb2RpZmllcnMgd2hpY2gKLXNwZWNpZnkgdGhlIHNpemUgb2Ygb3BlcmFuZHMuICBUaGUgbGV0dGVycyBAc2FtcHtifSwgQHNhbXB7d30sIGFuZAotQHNhbXB7bH0gc3BlY2lmeSBieXRlLCB3b3JkLCBhbmQgbG9uZyBvcGVyYW5kcy4gIElmIG5vIHN1ZmZpeCBpcwotc3BlY2lmaWVkIGJ5IGFuIGluc3RydWN0aW9uIHRoZW4gQGNvZGV7QHZhbHVle0FTfX0gdHJpZXMgdG8gZmlsbCBpbiB0aGUKLW1pc3Npbmcgc3VmZml4IGJhc2VkIG9uIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBvcGVyYW5kICh0aGUgbGFzdCBvbmUKLWJ5IGNvbnZlbnRpb24pLiAgVGh1cywgQHNhbXB7bW92ICVheCwgJWJ4fSBpcyBlcXVpdmFsZW50IHRvIEBzYW1we21vdncKLSVheCwgJWJ4fTsgYWxzbywgQHNhbXB7bW92ICQxLCAlYnh9IGlzIGVxdWl2YWxlbnQgdG8gQHNhbXB7bW92dyAkMSwKLSVieH0uICBOb3RlIHRoYXQgdGhpcyBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQVQmVCBVbml4IGFzc2VtYmxlciB3aGljaAotYXNzdW1lcyB0aGF0IGEgbWlzc2luZyBtbmVtb25pYyBzdWZmaXggaW1wbGllcyBsb25nIG9wZXJhbmQgc2l6ZS4gIChUaGlzCi1pbmNvbXBhdGliaWxpdHkgZG9lcyBub3QgYWZmZWN0IGNvbXBpbGVyIG91dHB1dCBzaW5jZSBjb21waWxlcnMgYWx3YXlzCi1leHBsaWNpdGx5IHNwZWNpZnkgdGhlIG1uZW1vbmljIHN1ZmZpeC4pCi0KLUFsbW9zdCBhbGwgaW5zdHJ1Y3Rpb25zIGhhdmUgdGhlIHNhbWUgbmFtZXMgaW4gQVQmVCBhbmQgSW50ZWwgZm9ybWF0LgotVGhlcmUgYXJlIGEgZmV3IGV4Y2VwdGlvbnMuICBUaGUgc2lnbiBleHRlbmQgYW5kIHplcm8gZXh0ZW5kCi1pbnN0cnVjdGlvbnMgbmVlZCB0d28gc2l6ZXMgdG8gc3BlY2lmeSB0aGVtLiAgVGhleSBuZWVkIGEgc2l6ZSB0bwotc2lnbi96ZXJvIGV4dGVuZCBAZW1waHtmcm9tfSBhbmQgYSBzaXplIHRvIHplcm8gZXh0ZW5kIEBlbXBoe3RvfS4gIFRoaXMKLWlzIGFjY29tcGxpc2hlZCBieSB1c2luZyB0d28gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMgaW4gQVQmVAotc3ludGF4LiAgQmFzZSBuYW1lcyBmb3Igc2lnbiBleHRlbmQgYW5kIHplcm8gZXh0ZW5kIGFyZQotQHNhbXB7bW92c0Bkb3Rze319IGFuZCBAc2FtcHttb3Z6QGRvdHN7fX0gaW4gQVQmVCBzeW50YXggKEBzYW1we21vdnN4fQotYW5kIEBzYW1we21vdnp4fSBpbiBJbnRlbCBzeW50YXgpLiAgVGhlIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzCi1hcmUgdGFja2VkIG9uIHRvIHRoaXMgYmFzZSBuYW1lLCB0aGUgQGVtcGh7ZnJvbX0gc3VmZml4IGJlZm9yZSB0aGUKLUBlbXBoe3RvfSBzdWZmaXguICBUaHVzLCBAc2FtcHttb3ZzYmwgJWFsLCAlZWR4fSBpcyBBVCZUIHN5bnRheCBmb3IKLWBgbW92ZSBzaWduIGV4dGVuZCBAZW1waHtmcm9tfSAlYWwgQGVtcGh7dG99ICVlZHguJycgIFBvc3NpYmxlIHN1ZmZpeGVzLAotdGh1cywgYXJlIEBzYW1we2JsfSAoZnJvbSBieXRlIHRvIGxvbmcpLCBAc2FtcHtid30gKGZyb20gYnl0ZSB0byB3b3JkKSwKLWFuZCBAc2FtcHt3bH0gKGZyb20gd29yZCB0byBsb25nKS4KLQotQGNpbmRleCBjb252ZXJzaW9uIGluc3RydWN0aW9ucywgaTM4NgotQGNpbmRleCBpMzg2IGNvbnZlcnNpb24gaW5zdHJ1Y3Rpb25zCi1UaGUgSW50ZWwtc3ludGF4IGNvbnZlcnNpb24gaW5zdHJ1Y3Rpb25zCi0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Ac2FtcHtjYnd9IC0tLSBzaWduLWV4dGVuZCBieXRlIGluIEBzYW1weyVhbH0gdG8gd29yZCBpbiBAc2FtcHslYXh9LAotCi1AaXRlbQotQHNhbXB7Y3dkZX0gLS0tIHNpZ24tZXh0ZW5kIHdvcmQgaW4gQHNhbXB7JWF4fSB0byBsb25nIGluIEBzYW1weyVlYXh9LAotCi1AaXRlbQotQHNhbXB7Y3dkfSAtLS0gc2lnbi1leHRlbmQgd29yZCBpbiBAc2FtcHslYXh9IHRvIGxvbmcgaW4gQHNhbXB7JWR4OiVheH0sCi0KLUBpdGVtCi1Ac2FtcHtjZHF9IC0tLSBzaWduLWV4dGVuZCBkd29yZCBpbiBAc2FtcHslZWF4fSB0byBxdWFkIGluIEBzYW1weyVlZHg6JWVheH0sCi1AZW5kIGl0ZW1pemUKLQotQG5vaW5kZW50Ci1hcmUgY2FsbGVkIEBzYW1we2NidHd9LCBAc2FtcHtjd3RsfSwgQHNhbXB7Y3d0ZH0sIGFuZCBAc2FtcHtjbHRkfSBpbgotQVQmVCBuYW1pbmcuICBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIGVpdGhlciBuYW1pbmcgZm9yIHRoZXNlIGluc3RydWN0aW9ucy4KLQotQGNpbmRleCBqdW1wIGluc3RydWN0aW9ucywgaTM4NgotQGNpbmRleCBjYWxsIGluc3RydWN0aW9ucywgaTM4NgotRmFyIGNhbGwvanVtcCBpbnN0cnVjdGlvbnMgYXJlIEBzYW1we2xjYWxsfSBhbmQgQHNhbXB7bGptcH0gaW4KLUFUJlQgc3ludGF4LCBidXQgYXJlIEBzYW1we2NhbGwgZmFyfSBhbmQgQHNhbXB7anVtcCBmYXJ9IGluIEludGVsCi1jb252ZW50aW9uLgotCi1Abm9kZSBpMzg2LVJlZ3MKLUBzZWN0aW9uIFJlZ2lzdGVyIE5hbWluZwotCi1AY2luZGV4IGkzODYgcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVycywgaTM4NgotUmVnaXN0ZXIgb3BlcmFuZHMgYXJlIGFsd2F5cyBwcmVmaXhlZCB3aXRoIEBzYW1weyV9LiAgVGhlIDgwMzg2IHJlZ2lzdGVycwotY29uc2lzdCBvZgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotdGhlIDggMzItYml0IHJlZ2lzdGVycyBAc2FtcHslZWF4fSAodGhlIGFjY3VtdWxhdG9yKSwgQHNhbXB7JWVieH0sCi1Ac2FtcHslZWN4fSwgQHNhbXB7JWVkeH0sIEBzYW1weyVlZGl9LCBAc2FtcHslZXNpfSwgQHNhbXB7JWVicH0gKHRoZQotZnJhbWUgcG9pbnRlciksIGFuZCBAc2FtcHslZXNwfSAodGhlIHN0YWNrIHBvaW50ZXIpLgotCi1AaXRlbQotdGhlIDggMTYtYml0IGxvdy1lbmRzIG9mIHRoZXNlOiBAc2FtcHslYXh9LCBAc2FtcHslYnh9LCBAc2FtcHslY3h9LAotQHNhbXB7JWR4fSwgQHNhbXB7JWRpfSwgQHNhbXB7JXNpfSwgQHNhbXB7JWJwfSwgYW5kIEBzYW1weyVzcH0uCi0KLUBpdGVtCi10aGUgOCA4LWJpdCByZWdpc3RlcnM6IEBzYW1weyVhaH0sIEBzYW1weyVhbH0sIEBzYW1weyViaH0sCi1Ac2FtcHslYmx9LCBAc2FtcHslY2h9LCBAc2FtcHslY2x9LCBAc2FtcHslZGh9LCBhbmQgQHNhbXB7JWRsfSAoVGhlc2UKLWFyZSB0aGUgaGlnaC1ieXRlcyBhbmQgbG93LWJ5dGVzIG9mIEBzYW1weyVheH0sIEBzYW1weyVieH0sCi1Ac2FtcHslY3h9LCBhbmQgQHNhbXB7JWR4fSkKLQotQGl0ZW0KLXRoZSA2IHNlY3Rpb24gcmVnaXN0ZXJzIEBzYW1weyVjc30gKGNvZGUgc2VjdGlvbiksIEBzYW1weyVkc30KLShkYXRhIHNlY3Rpb24pLCBAc2FtcHslc3N9IChzdGFjayBzZWN0aW9uKSwgQHNhbXB7JWVzfSwgQHNhbXB7JWZzfSwKLWFuZCBAc2FtcHslZ3N9LgotCi1AaXRlbQotdGhlIDMgcHJvY2Vzc29yIGNvbnRyb2wgcmVnaXN0ZXJzIEBzYW1weyVjcjB9LCBAc2FtcHslY3IyfSwgYW5kCi1Ac2FtcHslY3IzfS4KLQotQGl0ZW0KLXRoZSA2IGRlYnVnIHJlZ2lzdGVycyBAc2FtcHslZGIwfSwgQHNhbXB7JWRiMX0sIEBzYW1weyVkYjJ9LAotQHNhbXB7JWRiM30sIEBzYW1weyVkYjZ9LCBhbmQgQHNhbXB7JWRiN30uCi0KLUBpdGVtCi10aGUgMiB0ZXN0IHJlZ2lzdGVycyBAc2FtcHsldHI2fSBhbmQgQHNhbXB7JXRyN30uCi0KLUBpdGVtCi10aGUgOCBmbG9hdGluZyBwb2ludCByZWdpc3RlciBzdGFjayBAc2FtcHslc3R9IG9yIGVxdWl2YWxlbnRseQotQHNhbXB7JXN0KDApfSwgQHNhbXB7JXN0KDEpfSwgQHNhbXB7JXN0KDIpfSwgQHNhbXB7JXN0KDMpfSwKLUBzYW1weyVzdCg0KX0sIEBzYW1weyVzdCg1KX0sIEBzYW1weyVzdCg2KX0sIGFuZCBAc2FtcHslc3QoNyl9LgotQGVuZCBpdGVtaXplCi0KLUBub2RlIGkzODYtUHJlZml4ZXMKLUBzZWN0aW9uIEluc3RydWN0aW9uIFByZWZpeGVzCi0KLUBjaW5kZXggaTM4NiBpbnN0cnVjdGlvbiBwcmVmaXhlcwotQGNpbmRleCBpbnN0cnVjdGlvbiBwcmVmaXhlcywgaTM4NgotQGNpbmRleCBwcmVmaXhlcywgaTM4NgotSW5zdHJ1Y3Rpb24gcHJlZml4ZXMgYXJlIHVzZWQgdG8gbW9kaWZ5IHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24uICBUaGV5Ci1hcmUgdXNlZCB0byByZXBlYXQgc3RyaW5nIGluc3RydWN0aW9ucywgdG8gcHJvdmlkZSBzZWN0aW9uIG92ZXJyaWRlcywgdG8KLXBlcmZvcm0gYnVzIGxvY2sgb3BlcmF0aW9ucywgYW5kIHRvIGNoYW5nZSBvcGVyYW5kIGFuZCBhZGRyZXNzIHNpemVzLgotKE1vc3QgaW5zdHJ1Y3Rpb25zIHRoYXQgbm9ybWFsbHkgb3BlcmF0ZSBvbiAzMi1iaXQgb3BlcmFuZHMgd2lsbCB1c2UKLTE2LWJpdCBvcGVyYW5kcyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGFuIGBgb3BlcmFuZCBzaXplJycgcHJlZml4LikKLUluc3RydWN0aW9uIHByZWZpeGVzIGFyZSBiZXN0IHdyaXR0ZW4gb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgaW5zdHJ1Y3Rpb24KLXRoZXkgYWN0IHVwb24uIEZvciBleGFtcGxlLCB0aGUgQHNhbXB7c2Nhc30gKHNjYW4gc3RyaW5nKSBpbnN0cnVjdGlvbiBpcwotcmVwZWF0ZWQgd2l0aDoKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICByZXBuZSBzY2FzICVlczooJWVkaSksJWFsCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Zb3UgbWF5IGFsc28gcGxhY2UgcHJlZml4ZXMgb24gdGhlIGxpbmVzIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0aGUKLWluc3RydWN0aW9uLCBidXQgdGhpcyBjaXJjdW12ZW50cyBjaGVja3MgdGhhdCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzCi13aXRoIHByZWZpeGVzLCBhbmQgd2lsbCBub3Qgd29yayB3aXRoIGFsbCBwcmVmaXhlcy4KLQotSGVyZSBpcyBhIGxpc3Qgb2YgaW5zdHJ1Y3Rpb24gcHJlZml4ZXM6Ci0KLUBjaW5kZXggc2VjdGlvbiBvdmVycmlkZSBwcmVmaXhlcywgaTM4NgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVNlY3Rpb24gb3ZlcnJpZGUgcHJlZml4ZXMgQHNhbXB7Y3N9LCBAc2FtcHtkc30sIEBzYW1we3NzfSwgQHNhbXB7ZXN9LAotQHNhbXB7ZnN9LCBAc2FtcHtnc30uICBUaGVzZSBhcmUgYXV0b21hdGljYWxseSBhZGRlZCBieSBzcGVjaWZ5aW5nCi11c2luZyB0aGUgQHZhcntzZWN0aW9ufTpAdmFye21lbW9yeS1vcGVyYW5kfSBmb3JtIGZvciBtZW1vcnkgcmVmZXJlbmNlcy4KLQotQGNpbmRleCBzaXplIHByZWZpeGVzLCBpMzg2Ci1AaXRlbQotT3BlcmFuZC9BZGRyZXNzIHNpemUgcHJlZml4ZXMgQHNhbXB7ZGF0YTE2fSBhbmQgQHNhbXB7YWRkcjE2fQotY2hhbmdlIDMyLWJpdCBvcGVyYW5kcy9hZGRyZXNzZXMgaW50byAxNi1iaXQgb3BlcmFuZHMvYWRkcmVzc2VzLAotd2hpbGUgQHNhbXB7ZGF0YTMyfSBhbmQgQHNhbXB7YWRkcjMyfSBjaGFuZ2UgMTYtYml0IG9uZXMgKGluIGEKLUBjb2Rley5jb2RlMTZ9IHNlY3Rpb24pIGludG8gMzItYml0IG9wZXJhbmRzL2FkZHJlc3Nlcy4gIFRoZXNlIHByZWZpeGVzCi1AZW1waHttdXN0fSBhcHBlYXIgb24gdGhlIHNhbWUgbGluZSBvZiBjb2RlIGFzIHRoZSBpbnN0cnVjdGlvbiB0aGV5Ci1tb2RpZnkuIEZvciBleGFtcGxlLCBpbiBhIDE2LWJpdCBAY29kZXsuY29kZTE2fSBzZWN0aW9uLCB5b3UgbWlnaHQKLXdyaXRlOgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgIGFkZHIzMiBqbXBsICooJWVieCkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjaW5kZXggYnVzIGxvY2sgcHJlZml4ZXMsIGkzODYKLUBjaW5kZXggaW5oaWJpdGluZyBpbnRlcnJ1cHRzLCBpMzg2Ci1AaXRlbQotVGhlIGJ1cyBsb2NrIHByZWZpeCBAc2FtcHtsb2NrfSBpbmhpYml0cyBpbnRlcnJ1cHRzIGR1cmluZyBleGVjdXRpb24gb2YKLXRoZSBpbnN0cnVjdGlvbiBpdCBwcmVjZWRlcy4gIChUaGlzIGlzIG9ubHkgdmFsaWQgd2l0aCBjZXJ0YWluCi1pbnN0cnVjdGlvbnM7IHNlZSBhIDgwMzg2IG1hbnVhbCBmb3IgZGV0YWlscykuCi0KLUBjaW5kZXggY29wcm9jZXNzb3Igd2FpdCwgaTM4NgotQGl0ZW0KLVRoZSB3YWl0IGZvciBjb3Byb2Nlc3NvciBwcmVmaXggQHNhbXB7d2FpdH0gd2FpdHMgZm9yIHRoZSBjb3Byb2Nlc3NvciB0bwotY29tcGxldGUgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIHNob3VsZCBuZXZlciBiZSBuZWVkZWQgZm9yIHRoZQotODAzODYvODAzODcgY29tYmluYXRpb24uCi0KLUBjaW5kZXggcmVwZWF0IHByZWZpeGVzLCBpMzg2Ci1AaXRlbQotVGhlIEBzYW1we3JlcH0sIEBzYW1we3JlcGV9LCBhbmQgQHNhbXB7cmVwbmV9IHByZWZpeGVzIGFyZSBhZGRlZAotdG8gc3RyaW5nIGluc3RydWN0aW9ucyB0byBtYWtlIHRoZW0gcmVwZWF0IEBzYW1weyVlY3h9IHRpbWVzIChAc2FtcHslY3h9Ci10aW1lcyBpZiB0aGUgY3VycmVudCBhZGRyZXNzIHNpemUgaXMgMTYtYml0cykuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgaTM4Ni1NZW1vcnkKLUBzZWN0aW9uIE1lbW9yeSBSZWZlcmVuY2VzCi0KLUBjaW5kZXggaTM4NiBtZW1vcnkgcmVmZXJlbmNlcwotQGNpbmRleCBtZW1vcnkgcmVmZXJlbmNlcywgaTM4NgotQW4gSW50ZWwgc3ludGF4IGluZGlyZWN0IG1lbW9yeSByZWZlcmVuY2Ugb2YgdGhlIGZvcm0KLQotQHNtYWxsZXhhbXBsZQotQHZhcntzZWN0aW9ufTpbQHZhcntiYXNlfSArIEB2YXJ7aW5kZXh9KkB2YXJ7c2NhbGV9ICsgQHZhcntkaXNwfV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotaXMgdHJhbnNsYXRlZCBpbnRvIHRoZSBBVCZUIHN5bnRheAotCi1Ac21hbGxleGFtcGxlCi1AdmFye3NlY3Rpb259OkB2YXJ7ZGlzcH0oQHZhcntiYXNlfSwgQHZhcntpbmRleH0sIEB2YXJ7c2NhbGV9KQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVyZSBAdmFye2Jhc2V9IGFuZCBAdmFye2luZGV4fSBhcmUgdGhlIG9wdGlvbmFsIDMyLWJpdCBiYXNlIGFuZAotaW5kZXggcmVnaXN0ZXJzLCBAdmFye2Rpc3B9IGlzIHRoZSBvcHRpb25hbCBkaXNwbGFjZW1lbnQsIGFuZAotQHZhcntzY2FsZX0sIHRha2luZyB0aGUgdmFsdWVzIDEsIDIsIDQsIGFuZCA4LCBtdWx0aXBsaWVzIEB2YXJ7aW5kZXh9Ci10byBjYWxjdWxhdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIG9wZXJhbmQuICBJZiBubyBAdmFye3NjYWxlfSBpcwotc3BlY2lmaWVkLCBAdmFye3NjYWxlfSBpcyB0YWtlbiB0byBiZSAxLiAgQHZhcntzZWN0aW9ufSBzcGVjaWZpZXMgdGhlCi1vcHRpb25hbCBzZWN0aW9uIHJlZ2lzdGVyIGZvciB0aGUgbWVtb3J5IG9wZXJhbmQsIGFuZCBtYXkgb3ZlcnJpZGUgdGhlCi1kZWZhdWx0IHNlY3Rpb24gcmVnaXN0ZXIgKHNlZSBhIDgwMzg2IG1hbnVhbCBmb3Igc2VjdGlvbiByZWdpc3RlcgotZGVmYXVsdHMpLiBOb3RlIHRoYXQgc2VjdGlvbiBvdmVycmlkZXMgaW4gQVQmVCBzeW50YXggQGVtcGh7bXVzdH0KLWJlIHByZWNlZGVkIGJ5IGEgQHNhbXB7JX0uICBJZiB5b3Ugc3BlY2lmeSBhIHNlY3Rpb24gb3ZlcnJpZGUgd2hpY2gKLWNvaW5jaWRlcyB3aXRoIHRoZSBkZWZhdWx0IHNlY3Rpb24gcmVnaXN0ZXIsIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgQGVtcGh7bm90fQotb3V0cHV0IGFueSBzZWN0aW9uIHJlZ2lzdGVyIG92ZXJyaWRlIHByZWZpeGVzIHRvIGFzc2VtYmxlIHRoZSBnaXZlbgotaW5zdHJ1Y3Rpb24uICBUaHVzLCBzZWN0aW9uIG92ZXJyaWRlcyBjYW4gYmUgc3BlY2lmaWVkIHRvIGVtcGhhc2l6ZSB3aGljaAotc2VjdGlvbiByZWdpc3RlciBpcyB1c2VkIGZvciBhIGdpdmVuIG1lbW9yeSBvcGVyYW5kLgotCi1IZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIEludGVsIGFuZCBBVCZUIHN0eWxlIG1lbW9yeSByZWZlcmVuY2VzOgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIEFUJlQ6IEBzYW1wey00KCVlYnApfSwgSW50ZWw6ICBAc2FtcHtbZWJwIC0gNF19Ci1AdmFye2Jhc2V9IGlzIEBzYW1weyVlYnB9OyBAdmFye2Rpc3B9IGlzIEBzYW1wey00fS4gQHZhcntzZWN0aW9ufSBpcwotbWlzc2luZywgYW5kIHRoZSBkZWZhdWx0IHNlY3Rpb24gaXMgdXNlZCAoQHNhbXB7JXNzfSBmb3IgYWRkcmVzc2luZyB3aXRoCi1Ac2FtcHslZWJwfSBhcyB0aGUgYmFzZSByZWdpc3RlcikuICBAdmFye2luZGV4fSwgQHZhcntzY2FsZX0gYXJlIGJvdGggbWlzc2luZy4KLQotQGl0ZW0gQVQmVDogQHNhbXB7Zm9vKCwlZWF4LDQpfSwgSW50ZWw6IEBzYW1we1tmb28gKyBlYXgqNF19Ci1AdmFye2luZGV4fSBpcyBAc2FtcHslZWF4fSAoc2NhbGVkIGJ5IGEgQHZhcntzY2FsZX0gNCk7IEB2YXJ7ZGlzcH0gaXMKLUBzYW1we2Zvb30uICBBbGwgb3RoZXIgZmllbGRzIGFyZSBtaXNzaW5nLiAgVGhlIHNlY3Rpb24gcmVnaXN0ZXIgaGVyZQotZGVmYXVsdHMgdG8gQHNhbXB7JWRzfS4KLQotQGl0ZW0gQVQmVDogQHNhbXB7Zm9vKCwxKX07IEludGVsIEBzYW1we1tmb29dfQotVGhpcyB1c2VzIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IEBzYW1we2Zvb30gYXMgYSBtZW1vcnkgb3BlcmFuZC4KLU5vdGUgdGhhdCBAdmFye2Jhc2V9IGFuZCBAdmFye2luZGV4fSBhcmUgYm90aCBtaXNzaW5nLCBidXQgdGhlcmUgaXMgb25seQotQGVtcGh7b25lfSBAc2FtcHssfS4gIFRoaXMgaXMgYSBzeW50YWN0aWMgZXhjZXB0aW9uLgotCi1AaXRlbSBBVCZUOiBAc2FtcHslZ3M6Zm9vfTsgSW50ZWwgQHNhbXB7Z3M6Zm9vfQotVGhpcyBzZWxlY3RzIHRoZSBjb250ZW50cyBvZiB0aGUgdmFyaWFibGUgQHNhbXB7Zm9vfSB3aXRoIHNlY3Rpb24KLXJlZ2lzdGVyIEB2YXJ7c2VjdGlvbn0gYmVpbmcgQHNhbXB7JWdzfS4KLUBlbmQgdGFibGUKLQotQWJzb2x1dGUgKGFzIG9wcG9zZWQgdG8gUEMgcmVsYXRpdmUpIGNhbGwgYW5kIGp1bXAgb3BlcmFuZHMgbXVzdCBiZQotcHJlZml4ZWQgd2l0aCBAc2FtcHsqfS4gIElmIG5vIEBzYW1weyp9IGlzIHNwZWNpZmllZCwgQGNvZGV7QHZhbHVle0FTfX0KLWFsd2F5cyBjaG9vc2VzIFBDIHJlbGF0aXZlIGFkZHJlc3NpbmcgZm9yIGp1bXAvY2FsbCBsYWJlbHMuCi0KLUFueSBpbnN0cnVjdGlvbiB0aGF0IGhhcyBhIG1lbW9yeSBvcGVyYW5kLCBidXQgbm8gcmVnaXN0ZXIgb3BlcmFuZCwKLUBlbXBoe211c3R9IHNwZWNpZnkgaXRzIHNpemUgKGJ5dGUsIHdvcmQsIG9yIGxvbmcpIHdpdGggYW4gaW5zdHJ1Y3Rpb24KLW1uZW1vbmljIHN1ZmZpeCAoQHNhbXB7Yn0sIEBzYW1we3d9LCBvciBAc2FtcHtsfSwgcmVzcGVjdGl2ZWx5KS4KLQotQG5vZGUgaTM4Ni1qdW1wcwotQHNlY3Rpb24gSGFuZGxpbmcgb2YgSnVtcCBJbnN0cnVjdGlvbnMKLQotQGNpbmRleCBqdW1wIG9wdGltaXphdGlvbiwgaTM4NgotQGNpbmRleCBpMzg2IGp1bXAgb3B0aW1pemF0aW9uCi1KdW1wIGluc3RydWN0aW9ucyBhcmUgYWx3YXlzIG9wdGltaXplZCB0byB1c2UgdGhlIHNtYWxsZXN0IHBvc3NpYmxlCi1kaXNwbGFjZW1lbnRzLiAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgYnl0ZSAoOC1iaXQpIGRpc3BsYWNlbWVudAotanVtcHMgd2hlbmV2ZXIgdGhlIHRhcmdldCBpcyBzdWZmaWNpZW50bHkgY2xvc2UuICBJZiBhIGJ5dGUgZGlzcGxhY2VtZW50Ci1pcyBpbnN1ZmZpY2llbnQgYSBsb25nICgzMi1iaXQpIGRpc3BsYWNlbWVudCBpcyB1c2VkLiAgV2UgZG8gbm90IHN1cHBvcnQKLXdvcmQgKDE2LWJpdCkgZGlzcGxhY2VtZW50IGp1bXBzIGluIDMyLWJpdCBtb2RlIChpLmUuIHByZWZpeGluZyB0aGUganVtcAotaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgQHNhbXB7ZGF0YTE2fSBpbnN0cnVjdGlvbiBwcmVmaXgpLCBzaW5jZSB0aGUgODAzODYKLWluc2lzdHMgdXBvbiBtYXNraW5nIEBzYW1weyVlaXB9IHRvIDE2IGJpdHMgYWZ0ZXIgdGhlIHdvcmQgZGlzcGxhY2VtZW50Ci1pcyBhZGRlZC4KLQotTm90ZSB0aGF0IHRoZSBAc2FtcHtqY3h6fSwgQHNhbXB7amVjeHp9LCBAc2FtcHtsb29wfSwgQHNhbXB7bG9vcHp9LAotQHNhbXB7bG9vcGV9LCBAc2FtcHtsb29wbnp9IGFuZCBAc2FtcHtsb29wbmV9IGluc3RydWN0aW9ucyBvbmx5IGNvbWUgaW4gYnl0ZQotZGlzcGxhY2VtZW50cywgc28gdGhhdCBpZiB5b3UgdXNlIHRoZXNlIGluc3RydWN0aW9ucyAoQGNvZGV7QHZhbHVle0dDQ319IGRvZXMKLW5vdCB1c2UgdGhlbSkgeW91IG1heSBnZXQgYW4gZXJyb3IgbWVzc2FnZSAoYW5kIGluY29ycmVjdCBjb2RlKS4gIFRoZSBBVCZUCi04MDM4NiBhc3NlbWJsZXIgdHJpZXMgdG8gZ2V0IGFyb3VuZCB0aGlzIHByb2JsZW0gYnkgZXhwYW5kaW5nIEBzYW1we2pjeHogZm9vfQotdG8KLQotQHNtYWxsZXhhbXBsZQotICAgICAgICAgamN4eiBjeF96ZXJvCi0gICAgICAgICBqbXAgY3hfbm9uemVybwotY3hfemVybzogam1wIGZvbwotY3hfbm9uemVybzoKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIGkzODYtRmxvYXQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggaTM4NiBmbG9hdGluZyBwb2ludAotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgaTM4NgotQWxsIDgwMzg3IGZsb2F0aW5nIHBvaW50IHR5cGVzIGV4Y2VwdCBwYWNrZWQgQkNEIGFyZSBzdXBwb3J0ZWQuCi0oQkNEIHN1cHBvcnQgbWF5IGJlIGFkZGVkIHdpdGhvdXQgbXVjaCBkaWZmaWN1bHR5KS4gIFRoZXNlIGRhdGEKLXR5cGVzIGFyZSAxNi0sIDMyLSwgYW5kIDY0LSBiaXQgaW50ZWdlcnMsIGFuZCBzaW5nbGUgKDMyLWJpdCksCi1kb3VibGUgKDY0LWJpdCksIGFuZCBleHRlbmRlZCAoODAtYml0KSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQuCi1FYWNoIHN1cHBvcnRlZCB0eXBlIGhhcyBhbiBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggYW5kIGEgY29uc3RydWN0b3IKLWFzc29jaWF0ZWQgd2l0aCBpdC4gIEluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzIHNwZWNpZnkgdGhlIG9wZXJhbmQncwotZGF0YSB0eXBlLiAgQ29uc3RydWN0b3JzIGJ1aWxkIHRoZXNlIGRhdGEgdHlwZXMgaW50byBtZW1vcnkuCi0KLUBjaW5kZXggQGNvZGV7ZmxvYXR9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXtzaW5nbGV9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXtkb3VibGV9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXt0ZmxvYXR9IGRpcmVjdGl2ZSwgaTM4NgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUZsb2F0aW5nIHBvaW50IGNvbnN0cnVjdG9ycyBhcmUgQHNhbXB7LmZsb2F0fSBvciBAc2FtcHsuc2luZ2xlfSwKLUBzYW1wey5kb3VibGV9LCBhbmQgQHNhbXB7LnRmbG9hdH0gZm9yIDMyLSwgNjQtLCBhbmQgODAtYml0IGZvcm1hdHMuCi1UaGVzZSBjb3JyZXNwb25kIHRvIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzIEBzYW1we3N9LCBAc2FtcHtsfSwKLWFuZCBAc2FtcHt0fS4gQHNhbXB7dH0gc3RhbmRzIGZvciA4MC1iaXQgKHRlbiBieXRlKSByZWFsLiAgVGhlIDgwMzg3Ci1vbmx5IHN1cHBvcnRzIHRoaXMgZm9ybWF0IHZpYSB0aGUgQHNhbXB7ZmxkdH0gKGxvYWQgODAtYml0IHJlYWwgdG8gc3RhY2sKLXRvcCkgYW5kIEBzYW1we2ZzdHB0fSAoc3RvcmUgODAtYml0IHJlYWwgYW5kIHBvcCBzdGFjaykgaW5zdHJ1Y3Rpb25zLgotCi1AY2luZGV4IEBjb2Rle3dvcmR9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXtsb25nfSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7aW50fSBkaXJlY3RpdmUsIGkzODYKLUBjaW5kZXggQGNvZGV7cXVhZH0gZGlyZWN0aXZlLCBpMzg2Ci1AaXRlbQotSW50ZWdlciBjb25zdHJ1Y3RvcnMgYXJlIEBzYW1wey53b3JkfSwgQHNhbXB7Lmxvbmd9IG9yIEBzYW1wey5pbnR9LCBhbmQKLUBzYW1wey5xdWFkfSBmb3IgdGhlIDE2LSwgMzItLCBhbmQgNjQtYml0IGludGVnZXIgZm9ybWF0cy4gIFRoZQotY29ycmVzcG9uZGluZyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcyBhcmUgQHNhbXB7c30gKHNpbmdsZSksCi1Ac2FtcHtsfSAobG9uZyksIGFuZCBAc2FtcHtxfSAocXVhZCkuICBBcyB3aXRoIHRoZSA4MC1iaXQgcmVhbCBmb3JtYXQsCi10aGUgNjQtYml0IEBzYW1we3F9IGZvcm1hdCBpcyBvbmx5IHByZXNlbnQgaW4gdGhlIEBzYW1we2ZpbGRxfSAobG9hZAotcXVhZCBpbnRlZ2VyIHRvIHN0YWNrIHRvcCkgYW5kIEBzYW1we2Zpc3RwcX0gKHN0b3JlIHF1YWQgaW50ZWdlciBhbmQgcG9wCi1zdGFjaykgaW5zdHJ1Y3Rpb25zLgotQGVuZCBpdGVtaXplCi0KLVJlZ2lzdGVyIHRvIHJlZ2lzdGVyIG9wZXJhdGlvbnMgc2hvdWxkIG5vdCB1c2UgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMuCi1Ac2FtcHtmc3RsICVzdCwgJXN0KDEpfSB3aWxsIGdpdmUgYSB3YXJuaW5nLCBhbmQgYmUgYXNzZW1ibGVkIGFzIGlmIHlvdQotd3JvdGUgQHNhbXB7ZnN0ICVzdCwgJXN0KDEpfSwgc2luY2UgYWxsIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyIG9wZXJhdGlvbnMKLXVzZSA4MC1iaXQgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZHMuIChDb250cmFzdCB0aGlzIHdpdGggQHNhbXB7ZnN0bCAlc3QsIG1lbX0sCi13aGljaCBjb252ZXJ0cyBAc2FtcHslc3R9IGZyb20gODAtYml0IHRvIDY0LWJpdCBmbG9hdGluZyBwb2ludCBmb3JtYXQsCi10aGVuIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoZSA0IGJ5dGUgbG9jYXRpb24gQHNhbXB7bWVtfSkKLQotQG5vZGUgaTM4Ni1TSU1ECi1Ac2VjdGlvbiBJbnRlbCdzIE1NWCBhbmQgQU1EJ3MgM0ROb3chIFNJTUQgT3BlcmF0aW9ucwotCi1AY2luZGV4IE1NWCwgaTM4NgotQGNpbmRleCAzRE5vdyEsIGkzODYKLUBjaW5kZXggU0lNRCwgaTM4NgotCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBJbnRlbCdzIE1NWCBpbnN0cnVjdGlvbiBzZXQgKFNJTUQKLWluc3RydWN0aW9ucyBmb3IgaW50ZWdlciBkYXRhKSwgYXZhaWxhYmxlIG9uIEludGVsJ3MgUGVudGl1bSBNTVgKLXByb2Nlc3NvcnMgYW5kIFBlbnRpdW0gSUkgcHJvY2Vzc29ycywgQU1EJ3MgSzYgYW5kIEs2LTIgcHJvY2Vzc29ycywKLUN5cml4JyBNMiBwcm9jZXNzb3IsIGFuZCBwcm9iYWJseSBvdGhlcnMuICBJdCBhbHNvIHN1cHBvcnRzIEFNRCdzIDNETm93IQotaW5zdHJ1Y3Rpb24gc2V0IChTSU1EIGluc3RydWN0aW9ucyBmb3IgMzItYml0IGZsb2F0aW5nIHBvaW50IGRhdGEpCi1hdmFpbGFibGUgb24gQU1EJ3MgSzYtMiBwcm9jZXNzb3IgYW5kIHBvc3NpYmx5IG90aGVycyBpbiB0aGUgZnV0dXJlLgotCi1DdXJyZW50bHksIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90IHN1cHBvcnQgSW50ZWwncyBmbG9hdGluZyBwb2ludAotU0lNRCwgS2F0bWFpIChLTkkpLgotCi1UaGUgZWlnaHQgNjQtYml0IE1NWCBvcGVyYW5kcywgYWxzbyB1c2VkIGJ5IDNETm93ISwgYXJlIGNhbGxlZCBAc2FtcHslbW0wfSwKLUBzYW1weyVtbTF9LCAuLi4gQHNhbXB7JW1tN30uICBUaGV5IGNvbnRhaW4gZWlnaHQgOC1iaXQgaW50ZWdlcnMsIGZvdXIKLTE2LWJpdCBpbnRlZ2VycywgdHdvIDMyLWJpdCBpbnRlZ2Vycywgb25lIDY0LWJpdCBpbnRlZ2VyLCBvciB0d28gMzItYml0Ci1mbG9hdGluZyBwb2ludCB2YWx1ZXMuICBUaGUgTU1YIHJlZ2lzdGVycyBjYW5ub3QgYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lCi1hcyB0aGUgZmxvYXRpbmcgcG9pbnQgc3RhY2suCi0KLVNlZSBJbnRlbCBhbmQgQU1EIGRvY3VtZW50YXRpb24sIGtlZXBpbmcgaW4gbWluZCB0aGF0IHRoZSBvcGVyYW5kIG9yZGVyIGluCi1pbnN0cnVjdGlvbnMgaXMgcmV2ZXJzZWQgZnJvbSB0aGUgSW50ZWwgc3ludGF4LgotCi1Abm9kZSBpMzg2LTE2Yml0Ci1Ac2VjdGlvbiBXcml0aW5nIDE2LWJpdCBDb2RlCi0KLUBjaW5kZXggaTM4NiAxNi1iaXQgY29kZQotQGNpbmRleCAxNi1iaXQgY29kZSwgaTM4NgotQGNpbmRleCByZWFsLW1vZGUgY29kZSwgaTM4NgotQGNpbmRleCBAY29kZXtjb2RlMTZnY2N9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXtjb2RlMTZ9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXtjb2RlMzJ9IGRpcmVjdGl2ZSwgaTM4NgotV2hpbGUgQGNvZGV7QHZhbHVle0FTfX0gbm9ybWFsbHkgd3JpdGVzIG9ubHkgYGBwdXJlJycgMzItYml0IGkzODYgY29kZSwKLWl0IGFsc28gc3VwcG9ydHMgd3JpdGluZyBjb2RlIHRvIHJ1biBpbiByZWFsIG1vZGUgb3IgaW4gMTYtYml0IHByb3RlY3RlZAotbW9kZSBjb2RlIHNlZ21lbnRzLiAgVG8gZG8gdGhpcywgcHV0IGEgQHNhbXB7LmNvZGUxNn0gb3IKLUBzYW1wey5jb2RlMTZnY2N9IGRpcmVjdGl2ZSBiZWZvcmUgdGhlIGFzc2VtYmx5IGxhbmd1YWdlIGluc3RydWN0aW9ucyB0bwotYmUgcnVuIGluIDE2LWJpdCBtb2RlLiAgWW91IGNhbiBzd2l0Y2ggQGNvZGV7QHZhbHVle0FTfX0gYmFjayB0byB3cml0aW5nCi1ub3JtYWwgMzItYml0IGNvZGUgd2l0aCB0aGUgQHNhbXB7LmNvZGUzMn0gZGlyZWN0aXZlLgotCi1Ac2FtcHsuY29kZTE2Z2NjfSBwcm92aWRlcyBleHBlcmltZW50YWwgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyAxNi1iaXQKLWNvZGUgZnJvbSBnY2MsIGFuZCBkaWZmZXJzIGZyb20gQHNhbXB7LmNvZGUxNn0gaW4gdGhhdCBAc2FtcHtjYWxsfSwKLUBzYW1we3JldH0sIEBzYW1we2VudGVyfSwgQHNhbXB7bGVhdmV9LCBAc2FtcHtwdXNofSwgQHNhbXB7cG9wfSwKLUBzYW1we3B1c2hhfSwgQHNhbXB7cG9wYX0sIEBzYW1we3B1c2hmfSwgYW5kIEBzYW1we3BvcGZ9IGluc3RydWN0aW9ucwotZGVmYXVsdCB0byAzMi1iaXQgc2l6ZS4gIFRoaXMgaXMgc28gdGhhdCB0aGUgc3RhY2sgcG9pbnRlciBpcwotbWFuaXB1bGF0ZWQgaW4gdGhlIHNhbWUgd2F5IG92ZXIgZnVuY3Rpb24gY2FsbHMsIGFsbG93aW5nIGFjY2VzcyB0bwotZnVuY3Rpb24gcGFyYW1ldGVycyBhdCB0aGUgc2FtZSBzdGFjayBvZmZzZXRzIGFzIGluIDMyLWJpdCBtb2RlLgotQHNhbXB7LmNvZGUxNmdjY30gYWxzbyBhdXRvbWF0aWNhbGx5IGFkZHMgYWRkcmVzcyBzaXplIHByZWZpeGVzIHdoZXJlCi1uZWNlc3NhcnkgdG8gdXNlIHRoZSAzMi1iaXQgYWRkcmVzc2luZyBtb2RlcyB0aGF0IGdjYyBnZW5lcmF0ZXMuCi0KLVRoZSBjb2RlIHdoaWNoIEBjb2Rle0B2YWx1ZXtBU319IGdlbmVyYXRlcyBpbiAxNi1iaXQgbW9kZSB3aWxsIG5vdAotbmVjZXNzYXJpbHkgcnVuIG9uIGEgMTYtYml0IHByZS04MDM4NiBwcm9jZXNzb3IuICBUbyB3cml0ZSBjb2RlIHRoYXQKLXJ1bnMgb24gc3VjaCBhIHByb2Nlc3NvciwgeW91IG11c3QgcmVmcmFpbiBmcm9tIHVzaW5nIEBlbXBoe2FueX0gMzItYml0Ci1jb25zdHJ1Y3RzIHdoaWNoIHJlcXVpcmUgQGNvZGV7QHZhbHVle0FTfX0gdG8gb3V0cHV0IGFkZHJlc3Mgb3Igb3BlcmFuZAotc2l6ZSBwcmVmaXhlcy4KLQotTm90ZSB0aGF0IHdyaXRpbmcgMTYtYml0IGNvZGUgaW5zdHJ1Y3Rpb25zIGJ5IGV4cGxpY2l0bHkgc3BlY2lmeWluZyBhCi1wcmVmaXggb3IgYW4gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IHdpdGhpbiBhIDMyLWJpdCBjb2RlIHNlY3Rpb24KLWdlbmVyYXRlcyBkaWZmZXJlbnQgbWFjaGluZSBpbnN0cnVjdGlvbnMgdGhhbiB0aG9zZSBnZW5lcmF0ZWQgZm9yIGEKLTE2LWJpdCBjb2RlIHNlZ21lbnQuICBJbiBhIDMyLWJpdCBjb2RlIHNlY3Rpb24sIHRoZSBmb2xsb3dpbmcgY29kZQotZ2VuZXJhdGVzIHRoZSBtYWNoaW5lIG9wY29kZSBieXRlcyBAc2FtcHs2NiA2YSAwNH0sIHdoaWNoIHB1c2hlcyB0aGUKLXZhbHVlIEBzYW1wezR9IG9udG8gdGhlIHN0YWNrLCBkZWNyZW1lbnRpbmcgQHNhbXB7JWVzcH0gYnkgMi4KLQotQHNtYWxsZXhhbXBsZQotICAgICAgICBwdXNodyAkNAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIHNhbWUgY29kZSBpbiBhIDE2LWJpdCBjb2RlIHNlY3Rpb24gd291bGQgZ2VuZXJhdGUgdGhlIG1hY2hpbmUKLW9wY29kZSBieXRlcyBAc2FtcHs2YSAwNH0gKGllLiB3aXRob3V0IHRoZSBvcGVyYW5kIHNpemUgcHJlZml4KSwgd2hpY2gKLWlzIGNvcnJlY3Qgc2luY2UgdGhlIHByb2Nlc3NvciBkZWZhdWx0IG9wZXJhbmQgc2l6ZSBpcyBhc3N1bWVkIHRvIGJlIDE2Ci1iaXRzIGluIGEgMTYtYml0IGNvZGUgc2VjdGlvbi4KLQotQG5vZGUgaTM4Ni1CdWdzCi1Ac2VjdGlvbiBBVCZUIFN5bnRheCBidWdzCi0KLVRoZSBVbml4V2FyZSBhc3NlbWJsZXIsIGFuZCBwcm9iYWJseSBvdGhlciBBVCZUIGRlcml2ZWQgaXg4NiBVbml4Ci1hc3NlbWJsZXJzLCBnZW5lcmF0ZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgd2l0aCByZXZlcnNlZCBzb3VyY2UKLWFuZCBkZXN0aW5hdGlvbiByZWdpc3RlcnMgaW4gY2VydGFpbiBjYXNlcy4gIFVuZm9ydHVuYXRlbHksIGdjYyBhbmQKLXBvc3NpYmx5IG1hbnkgb3RoZXIgcHJvZ3JhbXMgdXNlIHRoaXMgcmV2ZXJzZWQgc3ludGF4LCBzbyB3ZSdyZSBzdHVjawotd2l0aCBpdC4KLQotRm9yIGV4YW1wbGUKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICBmc3ViICVzdCwlc3QoMykKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXJlc3VsdHMgaW4gQHNhbXB7JXN0KDMpfSBiZWluZyB1cGRhdGVkIHRvIEBzYW1weyVzdCAtICVzdCgzKX0gcmF0aGVyCi10aGFuIHRoZSBleHBlY3RlZCBAc2FtcHslc3QoMykgLSAlc3R9LiAgVGhpcyBoYXBwZW5zIHdpdGggYWxsIHRoZQotbm9uLWNvbW11dGF0aXZlIGFyaXRobWV0aWMgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucyB3aXRoIHR3byByZWdpc3Rlcgotb3BlcmFuZHMgd2hlcmUgdGhlIHNvdXJjZSByZWdpc3RlciBpcyBAc2FtcHslc3R9IGFuZCB0aGUgZGVzdGluYXRpb24KLXJlZ2lzdGVyIGlzIEBzYW1weyVzdChpKX0uCi0KLUBub2RlIGkzODYtTm90ZXMKLUBzZWN0aW9uIE5vdGVzCi0KLUBjaW5kZXggaTM4NiBAY29kZXttdWx9LCBAY29kZXtpbXVsfSBpbnN0cnVjdGlvbnMKLUBjaW5kZXggQGNvZGV7bXVsfSBpbnN0cnVjdGlvbiwgaTM4NgotQGNpbmRleCBAY29kZXtpbXVsfSBpbnN0cnVjdGlvbiwgaTM4NgotVGhlcmUgaXMgc29tZSB0cmlja2VyeSBjb25jZXJuaW5nIHRoZSBAc2FtcHttdWx9IGFuZCBAc2FtcHtpbXVsfQotaW5zdHJ1Y3Rpb25zIHRoYXQgZGVzZXJ2ZXMgbWVudGlvbi4gIFRoZSAxNi0sIDMyLSwgYW5kIDY0LWJpdCBleHBhbmRpbmcKLW11bHRpcGxpZXMgKGJhc2Ugb3Bjb2RlIEBzYW1wezB4ZjZ9OyBleHRlbnNpb24gNCBmb3IgQHNhbXB7bXVsfSBhbmQgNQotZm9yIEBzYW1we2ltdWx9KSBjYW4gYmUgb3V0cHV0IG9ubHkgaW4gdGhlIG9uZSBvcGVyYW5kIGZvcm0uICBUaHVzLAotQHNhbXB7aW11bCAlZWJ4LCAlZWF4fSBkb2VzIEBlbXBoe25vdH0gc2VsZWN0IHRoZSBleHBhbmRpbmcgbXVsdGlwbHk7Ci10aGUgZXhwYW5kaW5nIG11bHRpcGx5IHdvdWxkIGNsb2JiZXIgdGhlIEBzYW1weyVlZHh9IHJlZ2lzdGVyLCBhbmQgdGhpcwotd291bGQgY29uZnVzZSBAY29kZXtAdmFsdWV7R0NDfX0gb3V0cHV0LiAgVXNlIEBzYW1we2ltdWwgJWVieH0gdG8gZ2V0IHRoZQotNjQtYml0IHByb2R1Y3QgaW4gQHNhbXB7JWVkeDolZWF4fS4KLQotV2UgaGF2ZSBhZGRlZCBhIHR3byBvcGVyYW5kIGZvcm0gb2YgQHNhbXB7aW11bH0gd2hlbiB0aGUgZmlyc3Qgb3BlcmFuZAotaXMgYW4gaW1tZWRpYXRlIG1vZGUgZXhwcmVzc2lvbiBhbmQgdGhlIHNlY29uZCBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIuCi1UaGlzIGlzIGp1c3QgYSBzaG9ydGhhbmQsIHNvIHRoYXQsIG11bHRpcGx5aW5nIEBzYW1weyVlYXh9IGJ5IDY5LCBmb3IKLWV4YW1wbGUsIGNhbiBiZSBkb25lIHdpdGggQHNhbXB7aW11bCAkNjksICVlYXh9IHJhdGhlciB0aGFuIEBzYW1we2ltdWwKLSQ2OSwgJWVheCwgJWVheH0uCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1pOTYwLnRleGkgYi9nYXMvZG9jL2MtaTk2MC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzcwMzBhLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1pOTYwLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIGk5NjAtRGVwZW5kZW50Ci1AY2hhcHRlciBJbnRlbCA4MDk2MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBJbnRlbCA4MDk2MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IGk5NjAgc3VwcG9ydAotQG1lbnUKLSogT3B0aW9ucy1pOTYwOjogICAgICAgICAgICAgICAgaTk2MCBDb21tYW5kLWxpbmUgT3B0aW9ucwotKiBGbG9hdGluZyBQb2ludC1pOTYwOjogICAgICAgICBGbG9hdGluZyBQb2ludAotKiBEaXJlY3RpdmVzLWk5NjA6OiAgICAgICAgICAgICBpOTYwIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBPcGNvZGVzIGZvciBpOTYwOjogICAgICAgICAgICBpOTYwIE9wY29kZXMKLUBlbmQgbWVudQotCi1AYyBGSVhNRSEgQWRkIFN5bnRheCBzZWMgd2l0aCBkaXNjdXNzaW9uIG9mIGJpdGZpZWxkcyBoZXJlLCBhdCBsZWFzdCBzbwotQGMgbG9uZyBhcyB0aGV5J3JlIG5vdCB0dXJuZWQgb24gZm9yIG90aGVyIG1hY2hpbmVzIHRoYW4gOTYwLgotCi1Abm9kZSBPcHRpb25zLWk5NjAKLQotQHNlY3Rpb24gaTk2MCBDb21tYW5kLWxpbmUgT3B0aW9ucwotCi1AY2luZGV4IGk5NjAgb3B0aW9ucwotQGNpbmRleCBvcHRpb25zLCBpOTYwCi1AdGFibGUgQGNvZGUKLQotQGNpbmRleCBpOTYwIGFyY2hpdGVjdHVyZSBvcHRpb25zCi1AY2luZGV4IGFyY2hpdGVjdHVyZSBvcHRpb25zLCBpOTYwCi1AY2luZGV4IEBjb2Rley1BfSBvcHRpb25zLCBpOTYwCi1AaXRlbSAtQUNBIHwgLUFDQV9BIHwgLUFDQiB8IC1BQ0MgfCAtQUtBIHwgLUFLQiB8IC1BS0MgfCAtQU1DCi1TZWxlY3QgdGhlIDgwOTYwIGFyY2hpdGVjdHVyZS4gIEluc3RydWN0aW9ucyBvciBmZWF0dXJlcyBub3Qgc3VwcG9ydGVkCi1ieSB0aGUgc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlIGNhdXNlIGZhdGFsIGVycm9ycy4KLQotQHNhbXB7LUFDQX0gaXMgZXF1aXZhbGVudCB0byBAc2FtcHstQUNBX0F9OyBAc2FtcHstQUtDfSBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHstQU1DfS4gIFN5bm9ueW1zIGFyZSBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHRvb2xzLgotCi1JZiB5b3UgZG8gbm90IHNwZWNpZnkgYW55IG9mIHRoZXNlIG9wdGlvbnMsIEBjb2Rle0B2YWx1ZXtBU319IGdlbmVyYXRlcyBjb2RlCi1mb3IgYW55IGluc3RydWN0aW9uIG9yIGZlYXR1cmUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgQGVtcGh7c29tZX0gdmVyc2lvbiBvZiB0aGUKLTk2MCAoZXZlbiBpZiB0aGlzIG1lYW5zIG1peGluZyBhcmNoaXRlY3R1cmVzISkuICBJbiBwcmluY2lwbGUsCi1AY29kZXtAdmFsdWV7QVN9fSBhdHRlbXB0cyB0byBkZWR1Y2UgdGhlIG1pbmltYWwgc3VmZmljaWVudCBwcm9jZXNzb3IgdHlwZSBpZgotbm9uZSBpcyBzcGVjaWZpZWQ7IGRlcGVuZGluZyBvbiB0aGUgb2JqZWN0IGNvZGUgZm9ybWF0LCB0aGUgcHJvY2Vzc29yIHR5cGUgbWF5Ci1iZSByZWNvcmRlZCBpbiB0aGUgb2JqZWN0IGZpbGUuICBJZiBpdCBpcyBjcml0aWNhbCB0aGF0IHRoZSBAY29kZXtAdmFsdWV7QVN9fQotb3V0cHV0IG1hdGNoIGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlLCBzcGVjaWZ5IHRoYXQgYXJjaGl0ZWN0dXJlIGV4cGxpY2l0bHkuCi0KLUBjaW5kZXggQGNvZGV7LWJ9IG9wdGlvbiwgaTk2MAotQGNpbmRleCBicmFuY2ggcmVjb3JkaW5nLCBpOTYwCi1AY2luZGV4IGk5NjAgYnJhbmNoIHJlY29yZGluZwotQGl0ZW0gLWIKLUFkZCBjb2RlIHRvIGNvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgY29uZGl0aW9uYWwgYnJhbmNoZXMgdGFrZW4sIGZvcgotbGF0ZXIgb3B0aW1pemF0aW9uIHVzaW5nIGJyYW5jaCBwcmVkaWN0aW9uIGJpdHMuICAoVGhlIGNvbmRpdGlvbmFsIGJyYW5jaAotaW5zdHJ1Y3Rpb25zIGhhdmUgYnJhbmNoIHByZWRpY3Rpb24gYml0cyBpbiB0aGUgQ0EsIENCLCBhbmQgQ0MKLWFyY2hpdGVjdHVyZXMuKSAgSWYgQHZhcntCUn0gcmVwcmVzZW50cyBhIGNvbmRpdGlvbmFsIGJyYW5jaCBpbnN0cnVjdGlvbiwKLXRoZSBmb2xsb3dpbmcgcmVwcmVzZW50cyB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciB3aGVuCi1Ac2FtcHstYn0gaXMgc3BlY2lmaWVkOgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgIGNhbGwgICAgQHZhcntpbmNyZW1lbnQgcm91dGluZX0KLSAgICAgICAgLndvcmQgICAwICAgICAgICMgcHJlLWNvdW50ZXIKLUxhYmVsOiAgQHZhcntCUn0KLSAgICAgICAgY2FsbCAgICBAdmFye2luY3JlbWVudCByb3V0aW5lfQotICAgICAgICAud29yZCAgIDAgICAgICAgIyBwb3N0LWNvdW50ZXIKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBjb3VudGVyIGZvbGxvd2luZyBhIGJyYW5jaCByZWNvcmRzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBicmFuY2gKLXdhcyBAZW1waHtub3R9IHRha2VuOyB0aGUgZGlmZmVyZW5jIGJldHdlZW4gdGhlIHR3byBjb3VudGVycyBpcyB0aGUKLW51bWJlciBvZiB0aW1lcyB0aGUgYnJhbmNoIEBlbXBoe3dhc30gdGFrZW4uCi0KLUBjaW5kZXggQGNvZGV7Z2JyOTYwfSwgaTk2MCBwb3N0cHJvY2Vzc29yCi1AY2luZGV4IGJyYW5jaCBzdGF0aXN0aWNzIHRhYmxlLCBpOTYwCi1BIHRhYmxlIG9mIGV2ZXJ5IHN1Y2ggQGNvZGV7TGFiZWx9IGlzIGFsc28gZ2VuZXJhdGVkLCBzbyB0aGF0IHRoZQotZXh0ZXJuYWwgcG9zdHByb2Nlc3NvciBAY29kZXtnYnI5NjB9IChzdXBwbGllZCBieSBJbnRlbCkgY2FuIGxvY2F0ZSBhbGwKLXRoZSBjb3VudGVycy4gIFRoaXMgdGFibGUgaXMgYWx3YXlzIGxhYmVsbGVkIEBzYW1we19fQlJBTkNIX1RBQkxFX199OwotdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCB0byBwZXJtaXQgY29sbGVjdGluZyBzdGF0aXN0aWNzIGZvciBtYW55IHNlcGFyYXRlCi1vYmplY3QgZmlsZXMuICBUaGUgdGFibGUgaXMgd29yZCBhbGlnbmVkLCBhbmQgYmVnaW5zIHdpdGggYSB0d28td29yZAotaGVhZGVyLiAgVGhlIGZpcnN0IHdvcmQsIGluaXRpYWxpemVkIHRvIDAsIGlzIHVzZWQgaW4gbWFpbnRhaW5pbmcgbGlua2VkCi1saXN0cyBvZiBicmFuY2ggdGFibGVzLiAgVGhlIHNlY29uZCB3b3JkIGlzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZgotZW50cmllcyBpbiB0aGUgdGFibGUsIHdoaWNoIGZvbGxvdyBpbW1lZGlhdGVseTogZWFjaCBpcyBhIHdvcmQsIHBvaW50aW5nCi10byBvbmUgb2YgdGhlIGxhYmVscyBpbGx1c3RyYXRlZCBhYm92ZS4KLQotQGMgVEVYSTJST0ZGLUtJTEwKLUBpZmluZm8KLUBjIEVORCBURVhJMlJPRkYtS0lMTAotQGV4YW1wbGUKLSArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rIC4uLiArLS0tLS0tLS0tLS0tKwotIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgIHwgICAgICAgICAgICB8Ci0gfCAgKk5FWFQgICAgIHwgIENPVU5UOiBOICB8ICpCUkxBQiAxICAgfCAgICAgfCAqQlJMQUIgTiAgIHwKLSB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICB8ICAgICAgICAgICAgfAotICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsgLi4uICstLS0tLS0tLS0tLS0rCi0KLSAgICAgICAgICAgICAgIF9fQlJBTkNIX1RBQkxFX18gbGF5b3V0Ci1AZW5kIGV4YW1wbGUKLUBjIFRFWEkyUk9GRi1LSUxMCi1AZW5kIGlmaW5mbwotQG5lZWQgMjAwMAotQHRleAotXHZza2lwIDFwYwotXGxpbmV7XGxlZnRza2lwPTBwdFxoc2tpcFx0YWJsZWluZGVudAotXGJveGl0ezJjbX17XHR0ICpORVhUfVxib3hpdHsyY219e1x0dCBDT1VOVDogXGl0IE59XGJveGl0ezJjbX17XHR0Ci0qQlJMQUIgMX1caWJveHsxY219e1xxdWFkXGRvdHN9XGJveGl0ezJjbX17XHR0ICpCUkxBQiBcaXQgTn1caGZpbH0KLVxjZW50ZXJsaW5le1xpdCB7XHR0IFxfXF9CUkFOQ0hcX1RBQkxFXF9cX30gbGF5b3V0fQotQGVuZCB0ZXgKLUBjIEVORCBURVhJMlJPRkYtS0lMTAotCi1UaGUgZmlyc3Qgd29yZCBvZiB0aGUgaGVhZGVyIGlzIHVzZWQgdG8gbG9jYXRlIG11bHRpcGxlIGJyYW5jaCB0YWJsZXMsCi1zaW5jZSBlYWNoIG9iamVjdCBmaWxlIG1heSBjb250YWluIG9uZS4gTm9ybWFsbHkgdGhlIGxpbmtzIGFyZQotbWFpbnRhaW5lZCB3aXRoIGEgY2FsbCB0byBhbiBpbml0aWFsaXphdGlvbiByb3V0aW5lLCBwbGFjZWQgYXQgdGhlCi1iZWdpbm5pbmcgb2YgZWFjaCBmdW5jdGlvbiBpbiB0aGUgZmlsZS4gIFRoZSBAc2N7Z251fSBDIGNvbXBpbGVyCi1nZW5lcmF0ZXMgdGhlc2UgY2FsbHMgYXV0b21hdGljYWxseSB3aGVuIHlvdSBnaXZlIGl0IGEgQHNhbXB7LWJ9IG9wdGlvbi4KLUZvciBmdXJ0aGVyIGRldGFpbHMsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBAc2FtcHtnYnI5NjB9LgotCi1AY2luZGV4IEBjb2Rley1uby1yZWxheH0gb3B0aW9uLCBpOTYwCi1AaXRlbSAtbm8tcmVsYXgKLU5vcm1hbGx5LCBDb21wYXJlLWFuZC1CcmFuY2ggaW5zdHJ1Y3Rpb25zIHdpdGggdGFyZ2V0cyB0aGF0IHJlcXVpcmUKLWRpc3BsYWNlbWVudHMgZ3JlYXRlciB0aGFuIDEzIGJpdHMgKG9yIHRoYXQgaGF2ZSBleHRlcm5hbCB0YXJnZXRzKSBhcmUKLXJlcGxhY2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29tcGFyZSAob3IgQHNhbXB7Y2hrYml0fSkgYW5kIGJyYW5jaAotaW5zdHJ1Y3Rpb25zLiAgWW91IGNhbiB1c2UgdGhlIEBzYW1wey1uby1yZWxheH0gb3B0aW9uIHRvIHNwZWNpZnkgdGhhdAotQGNvZGV7QHZhbHVle0FTfX0gc2hvdWxkIGdlbmVyYXRlIGVycm9ycyBpbnN0ZWFkLCBpZiB0aGUgdGFyZ2V0IGRpc3BsYWNlbWVudAotaXMgbGFyZ2VyIHRoYW4gMTMgYml0cy4KLQotVGhpcyBvcHRpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBDb21wYXJlLWFuZC1KdW1wIGluc3RydWN0aW9uczsgdGhlIGNvZGUKLWVtaXR0ZWQgZm9yIHRoZW0gaXMgQGVtcGh7YWx3YXlzfSBhZGp1c3RlZCB3aGVuIG5lY2Vzc2FyeSAoZGVwZW5kaW5nIG9uCi1kaXNwbGFjZW1lbnQgc2l6ZSksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB5b3UgdXNlIEBzYW1wey1uby1yZWxheH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEZsb2F0aW5nIFBvaW50LWk5NjAKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIGk5NjAgKEBzY3tpZWVlfSkKLUBjaW5kZXggaTk2MCBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotQGNvZGV7QHZhbHVle0FTfX0gZ2VuZXJhdGVzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGZvciB0aGUgZGlyZWN0aXZlcwotQHNhbXB7LmZsb2F0fSwgQHNhbXB7LmRvdWJsZX0sIEBzYW1wey5leHRlbmRlZH0sIGFuZCBAc2FtcHsuc2luZ2xlfS4KLQotQG5vZGUgRGlyZWN0aXZlcy1pOTYwCi1Ac2VjdGlvbiBpOTYwIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgaTk2MAotQGNpbmRleCBpOTYwIG1hY2hpbmUgZGlyZWN0aXZlcwotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7YnNzfSBkaXJlY3RpdmUsIGk5NjAKLUBpdGVtIC5ic3MgQHZhcntzeW1ib2x9LCBAdmFye2xlbmd0aH0sIEB2YXJ7YWxpZ259Ci1SZXNlcnZlIEB2YXJ7bGVuZ3RofSBieXRlcyBpbiB0aGUgYnNzIHNlY3Rpb24gZm9yIGEgbG9jYWwgQHZhcntzeW1ib2x9LAotYWxpZ25lZCB0byB0aGUgcG93ZXIgb2YgdHdvIHNwZWNpZmllZCBieSBAdmFye2FsaWdufS4gIEB2YXJ7bGVuZ3RofSBhbmQKLUB2YXJ7YWxpZ259IG11c3QgYmUgcG9zaXRpdmUgYWJzb2x1dGUgZXhwcmVzc2lvbnMuICBUaGlzIGRpcmVjdGl2ZQotZGlmZmVycyBmcm9tIEBzYW1wey5sY29tbX0gb25seSBpbiB0aGF0IGl0IHBlcm1pdHMgeW91IHRvIHNwZWNpZnkKLWFuIGFsaWdubWVudC4gIEB4cmVme0xjb21tLCxAY29kZXsubGNvbW19fS4KLUBlbmQgdGFibGUKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2V4dGVuZGVkfSBkaXJlY3RpdmUsIGk5NjAKLUBpdGVtIC5leHRlbmRlZCBAdmFye2Zsb251bXN9Ci1AY29kZXsuZXh0ZW5kZWR9IGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXM7IGZvcgotZWFjaCBmbG9udW0sIEBzYW1wey5leHRlbmRlZH0gZW1pdHMgYW4gQHNje2llZWV9IGV4dGVuZGVkLWZvcm1hdCAoODAtYml0KQotZmxvYXRpbmctcG9pbnQgbnVtYmVyLgotCi1AY2luZGV4IEBjb2Rle2xlYWZwcm9jfSBkaXJlY3RpdmUsIGk5NjAKLUBpdGVtIC5sZWFmcHJvYyBAdmFye2NhbGwtbGFifSwgQHZhcntiYWwtbGFifQotWW91IGNhbiB1c2UgdGhlIEBzYW1wey5sZWFmcHJvY30gZGlyZWN0aXZlIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCi1vcHRpbWl6ZWQgQGNvZGV7Y2FsbGp9IGluc3RydWN0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgY2FsbHMgb2YgbGVhZgotcHJvY2VkdXJlcy4gIElmIGEgcHJvY2VkdXJlIGlzIGtub3duIHRvIGNhbGwgbm8gb3RoZXIgcHJvY2VkdXJlcywgeW91Ci1tYXkgZGVmaW5lIGFuIGVudHJ5IHBvaW50IHRoYXQgc2tpcHMgcHJvY2VkdXJlIHByb2xvZyBjb2RlIChhbmQgdGhhdCBkb2VzCi1ub3QgZGVwZW5kIG9uIHN5c3RlbS1zdXBwbGllZCBzYXZlZCBjb250ZXh0KSwgYW5kIGRlY2xhcmUgaXQgYXMgdGhlCi1AdmFye2JhbC1sYWJ9IHVzaW5nIEBzYW1wey5sZWFmcHJvY30uICBJZiB0aGUgcHJvY2VkdXJlIGFsc28gaGFzIGFuCi1lbnRyeSBwb2ludCB0aGF0IGdvZXMgdGhyb3VnaCB0aGUgbm9ybWFsIHByb2xvZywgeW91IGNhbiBzcGVjaWZ5IHRoYXQKLWVudHJ5IHBvaW50IGFzIEB2YXJ7Y2FsbC1sYWJ9LgotCi1BIEBzYW1wey5sZWFmcHJvY30gZGVjbGFyYXRpb24gaXMgbWVhbnQgZm9yIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotb3B0aW1pemVkIGNhbGwgaW5zdHJ1Y3Rpb24gQHNhbXB7Y2FsbGp9OyB0aGUgZGlyZWN0aXZlIHJlY29yZHMgdGhlIGRhdGEKLW5lZWRlZCBsYXRlciB0byBjaG9vc2UgYmV0d2VlbiBjb252ZXJ0aW5nIHRoZSBAc2FtcHtjYWxsan0gaW50byBhCi1AY29kZXtiYWx9IG9yIGEgQGNvZGV7Y2FsbH0uCi0KLUB2YXJ7Y2FsbC1sYWJ9IGlzIG9wdGlvbmFsOyBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwcmVzZW50LCBvciBpZiB0aGUKLXR3byBhcmd1bWVudHMgYXJlIGlkZW50aWNhbCwgdGhlIHNpbmdsZSBhcmd1bWVudCBpcyBhc3N1bWVkIHRvIGJlIHRoZQotQGNvZGV7YmFsfSBlbnRyeSBwb2ludC4KLQotQGNpbmRleCBAY29kZXtzeXNwcm9jfSBkaXJlY3RpdmUsIGk5NjAKLUBpdGVtIC5zeXNwcm9jIEB2YXJ7bmFtZX0sIEB2YXJ7aW5kZXh9Ci1UaGUgQHNhbXB7LnN5c3Byb2N9IGRpcmVjdGl2ZSBkZWZpbmVzIGEgbmFtZSBmb3IgYSBzeXN0ZW0gcHJvY2VkdXJlLgotQWZ0ZXIgeW91IGRlZmluZSBpdCB1c2luZyBAc2FtcHsuc3lzcHJvY30sIHlvdSBjYW4gdXNlIEB2YXJ7bmFtZX0gdG8KLXJlZmVyIHRvIHRoZSBzeXN0ZW0gcHJvY2VkdXJlIGlkZW50aWZpZWQgYnkgQHZhcntpbmRleH0gd2hlbiBjYWxsaW5nCi1wcm9jZWR1cmVzIHdpdGggdGhlIG9wdGltaXplZCBjYWxsIGluc3RydWN0aW9uIEBzYW1we2NhbGxqfS4KLQotQm90aCBhcmd1bWVudHMgYXJlIHJlcXVpcmVkOyBAdmFye2luZGV4fSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMzEKLShpbmNsdXNpdmUpLgotQGVuZCB0YWJsZQotCi1Abm9kZSBPcGNvZGVzIGZvciBpOTYwCi1Ac2VjdGlvbiBpOTYwIE9wY29kZXMKLQotQGNpbmRleCBvcGNvZGVzLCBpOTYwCi1AY2luZGV4IGk5NjAgb3Bjb2RlcwotQWxsIEludGVsIDk2MCBtYWNoaW5lIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkOwotQHB4cmVme09wdGlvbnMtaTk2MCwsaTk2MCBDb21tYW5kLWxpbmUgT3B0aW9uc30gZm9yIGEgZGlzY3Vzc2lvbiBvZgotc2VsZWN0aW5nIHRoZSBpbnN0cnVjdGlvbiBzdWJzZXQgZm9yIGEgcGFydGljdWxhciA5NjAKLWFyY2hpdGVjdHVyZS5AcmVmaWxsCi0KLVNvbWUgb3Bjb2RlcyBhcmUgcHJvY2Vzc2VkIGJleW9uZCBzaW1wbHkgZW1pdHRpbmcgYSBzaW5nbGUgY29ycmVzcG9uZGluZwotaW5zdHJ1Y3Rpb246IEBzYW1we2NhbGxqfSwgYW5kIENvbXBhcmUtYW5kLUJyYW5jaCBvciBDb21wYXJlLWFuZC1KdW1wCi1pbnN0cnVjdGlvbnMgd2l0aCB0YXJnZXQgZGlzcGxhY2VtZW50cyBsYXJnZXIgdGhhbiAxMyBiaXRzLgotCi1AbWVudQotKiBjYWxsai1pOTYwOjogICAgICAgICAgICAgICAgICBAY29kZXtjYWxsan0KLSogQ29tcGFyZS1hbmQtYnJhbmNoLWk5NjA6OiAgICAgQ29tcGFyZS1hbmQtQnJhbmNoCi1AZW5kIG1lbnUKLQotQG5vZGUgY2FsbGotaTk2MAotQHN1YnNlY3Rpb24gQGNvZGV7Y2FsbGp9Ci0KLUBjaW5kZXggQGNvZGV7Y2FsbGp9LCBpOTYwIHBzZXVkby1vcGNvZGUKLUBjaW5kZXggaTk2MCBAY29kZXtjYWxsan0gcHNldWRvLW9wY29kZQotWW91IGNhbiB3cml0ZSBAY29kZXtjYWxsan0gdG8gaGF2ZSB0aGUgYXNzZW1ibGVyIG9yIHRoZSBsaW5rZXIgZGV0ZXJtaW5lCi10aGUgbW9zdCBhcHByb3ByaWF0ZSBmb3JtIG9mIHN1YnJvdXRpbmUgY2FsbDogQHNhbXB7Y2FsbH0sCi1Ac2FtcHtiYWx9LCBvciBAc2FtcHtjYWxsc30uICBJZiB0aGUgYXNzZW1ibHkgc291cmNlIGNvbnRhaW5zCi1lbm91Z2ggaW5mb3JtYXRpb24tLS1hIEBzYW1wey5sZWFmcHJvY30gb3IgQHNhbXB7LnN5c3Byb2N9IGRpcmVjdGl2ZQotZGVmaW5pbmcgdGhlIG9wZXJhbmQtLS10aGVuIEBjb2Rle0B2YWx1ZXtBU319IHRyYW5zbGF0ZXMgdGhlCi1AY29kZXtjYWxsan07IGlmIG5vdCwgaXQgc2ltcGx5IGVtaXRzIHRoZSBAY29kZXtjYWxsan0sIGxlYXZpbmcgaXQKLWZvciB0aGUgbGlua2VyIHRvIHJlc29sdmUuCi0KLUBub2RlIENvbXBhcmUtYW5kLWJyYW5jaC1pOTYwCi1Ac3Vic2VjdGlvbiBDb21wYXJlLWFuZC1CcmFuY2gKLQotQGNpbmRleCBpOTYwIGNvbXBhcmUvYnJhbmNoIGluc3RydWN0aW9ucwotQGNpbmRleCBjb21wYXJlL2JyYW5jaCBpbnN0cnVjdGlvbnMsIGk5NjAKLVRoZSA5NjAgYXJjaGl0ZWN0dXJlcyBwcm92aWRlIGNvbWJpbmVkIENvbXBhcmUtYW5kLUJyYW5jaCBpbnN0cnVjdGlvbnMKLXRoYXQgcGVybWl0IHlvdSB0byBzdG9yZSB0aGUgYnJhbmNoIHRhcmdldCBpbiB0aGUgbG93ZXIgMTMgYml0cyBvZiB0aGUKLWluc3RydWN0aW9uIHdvcmQgaXRzZWxmLiAgSG93ZXZlciwgaWYgeW91IHNwZWNpZnkgYSBicmFuY2ggdGFyZ2V0IGZhcgotZW5vdWdoIGF3YXkgdGhhdCBpdHMgYWRkcmVzcyB3b24ndCBmaXQgaW4gMTMgYml0cywgdGhlIGFzc2VtYmxlciBjYW4KLWVpdGhlciBpc3N1ZSBhbiBlcnJvciwgb3IgY29udmVydCB5b3VyIENvbXBhcmUtYW5kLUJyYW5jaCBpbnN0cnVjdGlvbgotaW50byBzZXBhcmF0ZSBpbnN0cnVjdGlvbnMgdG8gZG8gdGhlIGNvbXBhcmUgYW5kIHRoZSBicmFuY2guCi0KLUBjaW5kZXggY29tcGFyZSBhbmQganVtcCBleHBhbnNpb25zLCBpOTYwCi1AY2luZGV4IGk5NjAgY29tcGFyZSBhbmQganVtcCBleHBhbnNpb25zCi1XaGV0aGVyIEBjb2Rle0B2YWx1ZXtBU319IGdpdmVzIGFuIGVycm9yIG9yIGV4cGFuZHMgdGhlIGluc3RydWN0aW9uIGRlcGVuZHMKLW9uIHR3byBjaG9pY2VzIHlvdSBjYW4gbWFrZTogd2hldGhlciB5b3UgdXNlIHRoZSBAc2FtcHstbm8tcmVsYXh9IG9wdGlvbiwKLWFuZCB3aGV0aGVyIHlvdSB1c2UgYSBgYENvbXBhcmUgYW5kIEJyYW5jaCcnIGluc3RydWN0aW9uIG9yIGEgYGBDb21wYXJlCi1hbmQgSnVtcCcnIGluc3RydWN0aW9uLiAgVGhlIGBgSnVtcCcnIGluc3RydWN0aW9ucyBhcmUgQGVtcGh7YWx3YXlzfQotZXhwYW5kZWQgaWYgbmVjZXNzYXJ5OyB0aGUgYGBCcmFuY2gnJyBpbnN0cnVjdGlvbnMgYXJlIGV4cGFuZGVkIHdoZW4KLW5lY2Vzc2FyeSBAZW1waHt1bmxlc3N9IHlvdSBzcGVjaWZ5IEBjb2Rley1uby1yZWxheH0tLS1pbiB3aGljaCBjYXNlCi1AY29kZXtAdmFsdWV7QVN9fSBnaXZlcyBhbiBlcnJvciBpbnN0ZWFkLgotCi1UaGVzZSBhcmUgdGhlIENvbXBhcmUtYW5kLUJyYW5jaCBpbnN0cnVjdGlvbnMsIHRoZWlyIGBgSnVtcCcnIHZhcmlhbnRzLAotYW5kIHRoZSBpbnN0cnVjdGlvbiBwYWlycyB0aGV5IG1heSBleHBhbmQgaW50bzoKLQotQGMgVEVYSTJST0ZGLUtJTEwKLUBpZmluZm8KLUBjIEVORCBURVhJMlJPRkYtS0lMTAotQGV4YW1wbGUKLSAgICAgICAgQ29tcGFyZSBhbmQKLSAgICAgQnJhbmNoICAgICAgSnVtcCAgICAgICBFeHBhbmRlZCB0bwotICAgICAtLS0tLS0gICAgLS0tLS0tICAgICAgIC0tLS0tLS0tLS0tLQotICAgICAgICBiYmMgICAgICAgICAgICAgICAgIGNoa2JpdDsgYm5vCi0gICAgICAgIGJicyAgICAgICAgICAgICAgICAgY2hrYml0OyBibwotICAgICBjbXBpYmUgICAgY21waWplICAgICAgIGNtcGk7IGJlCi0gICAgIGNtcGliZyAgICBjbXBpamcgICAgICAgY21waTsgYmcKLSAgICBjbXBpYmdlICAgY21waWpnZSAgICAgICBjbXBpOyBiZ2UKLSAgICAgY21waWJsICAgIGNtcGlqbCAgICAgICBjbXBpOyBibAotICAgIGNtcGlibGUgICBjbXBpamxlICAgICAgIGNtcGk7IGJsZQotICAgIGNtcGlibm8gICBjbXBpam5vICAgICAgIGNtcGk7IGJubwotICAgIGNtcGlibmUgICBjbXBpam5lICAgICAgIGNtcGk7IGJuZQotICAgICBjbXBpYm8gICAgY21waWpvICAgICAgIGNtcGk7IGJvCi0gICAgIGNtcG9iZSAgICBjbXBvamUgICAgICAgY21wbzsgYmUKLSAgICAgY21wb2JnICAgIGNtcG9qZyAgICAgICBjbXBvOyBiZwotICAgIGNtcG9iZ2UgICBjbXBvamdlICAgICAgIGNtcG87IGJnZQotICAgICBjbXBvYmwgICAgY21wb2psICAgICAgIGNtcG87IGJsCi0gICAgY21wb2JsZSAgIGNtcG9qbGUgICAgICAgY21wbzsgYmxlCi0gICAgY21wb2JuZSAgIGNtcG9qbmUgICAgICAgY21wbzsgYm5lCi1AZW5kIGV4YW1wbGUKLUBjIFRFWEkyUk9GRi1LSUxMCi1AZW5kIGlmaW5mbwotQHRleAotXGhza2lwXHRhYmxlaW5kZW50Ci1caGFsaWdue1xoZmlsIHtcdHQgI31ccXVhZCZcaGZpbCB7XHR0ICN9XHFxdWFkJntcdHQgI31caGZpbFxjcgotXG9taXR7XGhmaWxcaXQgQ29tcGFyZSBhbmRcaGZpbH1cc3BhblxvbWl0Jlxjcgote1xpdCBCcmFuY2h9JntcaXQgSnVtcH0me1xpdCBFeHBhbmRlZCB0b31cY3IKLSAgICAgICAgYmJjJiAgICAgICAgICAgICAgICAgJiBjaGtiaXQ7IGJub1xjcgotICAgICAgICBiYnMmICAgICAgICAgICAgICAgICAmIGNoa2JpdDsgYm9cY3IKLSAgICAgY21waWJlJiAgICBjbXBpamUmICAgICAgIGNtcGk7IGJlXGNyCi0gICAgIGNtcGliZyYgICAgY21waWpnJiAgICAgICBjbXBpOyBiZ1xjcgotICAgIGNtcGliZ2UmICAgY21waWpnZSYgICAgICAgY21waTsgYmdlXGNyCi0gICAgIGNtcGlibCYgICAgY21waWpsJiAgICAgICBjbXBpOyBibFxjcgotICAgIGNtcGlibGUmICAgY21waWpsZSYgICAgICAgY21waTsgYmxlXGNyCi0gICAgY21waWJubyYgICBjbXBpam5vJiAgICAgICBjbXBpOyBibm9cY3IKLSAgICBjbXBpYm5lJiAgIGNtcGlqbmUmICAgICAgIGNtcGk7IGJuZVxjcgotICAgICBjbXBpYm8mICAgIGNtcGlqbyYgICAgICAgY21waTsgYm9cY3IKLSAgICAgY21wb2JlJiAgICBjbXBvamUmICAgICAgIGNtcG87IGJlXGNyCi0gICAgIGNtcG9iZyYgICAgY21wb2pnJiAgICAgICBjbXBvOyBiZ1xjcgotICAgIGNtcG9iZ2UmICAgY21wb2pnZSYgICAgICAgY21wbzsgYmdlXGNyCi0gICAgIGNtcG9ibCYgICAgY21wb2psJiAgICAgICBjbXBvOyBibFxjcgotICAgIGNtcG9ibGUmICAgY21wb2psZSYgICAgICAgY21wbzsgYmxlXGNyCi0gICAgY21wb2JuZSYgICBjbXBvam5lJiAgICAgICBjbXBvOyBibmVcY3J9Ci1AZW5kIHRleAotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtbTMyci50ZXhpIGIvZ2FzL2RvYy9jLW0zMnIudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiNTQ1NmQuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLW0zMnIudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIE0zMlItRGVwZW5kZW50Ci1AY2hhcHRlciBNMzJSIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIE0zMlIgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBNMzJSIHN1cHBvcnQKLUBtZW51Ci0qIE0zMlItT3B0czo6ICAgICAgICAgICAgICAgICAgIE0zMlIgT3B0aW9ucwotKiBNMzJSLVdhcm5pbmdzOjogICAgICAgICAgICAgICBNMzJSIFdhcm5pbmdzCi1AZW5kIG1lbnUKLQotQG5vZGUgTTMyUi1PcHRzCi1Ac2VjdGlvbiBNMzJSIE9wdGlvbnMKLQotQGNpbmRleCBvcHRpb25zLCBNMzJSCi1AY2luZGV4IE0zMlIgb3B0aW9ucwotCi1UaGUgTWl0c3ViaXNoaSBNMzJSIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gaGFzIGEgZmV3IG1hY2hpbmUKLWRlcGVuZGVudCBvcHRpb25zOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1tMzJyeAotQGNpbmRleCBAc2FtcHstbTMycnh9IG9wdGlvbiwgTTMyUlgKLUBjaW5kZXggYXJjaGl0ZWN0dXJlIG9wdGlvbnMsIE0zMlJYCi1AY2luZGV4IE0zMlIgYXJjaGl0ZWN0dXJlIG9wdGlvbnMKLUBjb2Rle0B2YWx1ZXtBU319IGNhbiBhc3NlbWJsZSBjb2RlIGZvciBzZXZlcmFsIGRpZmZlcmVudCBtZW1iZXJzIG9mIHRoZQotTWl0c3ViaXNoaSBNMzJSIGZhbWlseS4gIE5vcm1hbGx5IHRoZSBkZWZhdWx0IGlzIHRvIGFzc2VtYmxlIGNvZGUgZm9yCi10aGUgTTMyUiBtaWNyb3Byb2Nlc3Nvci4gIFRoaXMgb3B0aW9uIG1heSBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdAotdG8gdGhlIE0zMlJYIG1pY3JvcHJvY2Vzc29yLCB3aGljaCBhZGRzIHNvbWUgbW9yZSBpbnN0cnVjdGlvbnMgdG8gdGhlCi1iYXNpYyBNMzJSIGluc3RydWN0aW9uIHNldCwgYW5kIHNvbWUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHNvbWUgb2YKLXRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbnMuCi0KLUBpdGVtIC13YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0cwotQGNpbmRleCBAc2FtcHstd2Fybi1leHBsaWNpdC1wYXJhbGxlbC1jb25mbGljdHN9IG9wdGlvbiwgTTMyUlgKLUluc3RydWN0cyBAY29kZXtAdmFsdWV7QVN9fSB0byBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMgd2hlbgotcXVlc3Rpb25hYmxlIHBhcmFsbGVsIGluc3RydWN0aW9ucyBhcmUgZW5jb3VudGVyZWQuICBUaGlzIG9wdGlvbiBpcwotZW5hYmxlZCBieSBkZWZhdWx0LCBidXQgQGNvZGV7QHZhbHVle0dDQ319IGRpc2FibGVzIGl0IHdoZW4gaXQgaW52b2tlcwotQGNvZGV7QHZhbHVle0FTfX0gZGlyZWN0bHkuICBRdWVzdGlvbmFibGUgaW5zdHJ1Y3Rpb25zIGFyZSB0aG9zZSB3aG9lcwotYmVoYXZpb3VyIHdvdWxkIGJlIGRpZmZlcmVudCBpZiB0aGV5IHdlcmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5LiAgRm9yCi1leGFtcGxlIHRoZSBjb2RlIGZyYWdtZW50IEBzYW1we212IHIxLCByMiB8fCBtdiByMywgcjF9IHByb2R1Y2VzIGEKLWRpZmZlcmVudCByZXN1bHQgZnJvbSBAc2FtcHttdiByMSwgcjIgXG4gbXYgcjMsIHIxfSBzaW5jZSB0aGUgZm9ybWVyCi1tb3ZlcyByMSBpbnRvIHIzIGFuZCB0aGVuIHIyIGludG8gcjEsIHdoZXJlYXMgdGhlIGxhdGVyIG1vdmVzIHIyIGludG8gcjEKLWFuZCByMy4KLQotQGl0ZW0gLVdwCi1AY2luZGV4IEBzYW1wey1XcH0gb3B0aW9uLCBNMzJSWAotVGhpcyBpcyBhIHNob3J0ZXIgc3lub255bSBmb3IgdGhlIEBlbXBoey13YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0c30KLW9wdGlvbi4KLQotQGl0ZW0gLW5vLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzCi1AY2luZGV4IEBzYW1wey1uby13YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0c30gb3B0aW9uLCBNMzJSWAotSW5zdHJ1Y3RzIEBjb2Rle0B2YWx1ZXtBU319IG5vdCB0byBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMgd2hlbgotcXVlc3Rpb25hYmxlIHBhcmFsbGVsIGluc3RydWN0aW9ucyBhcmUgZW5jb3VudGVyZWQuCi0KLUBpdGVtIC1XbnAKLUBjaW5kZXggQHNhbXB7LVducH0gb3B0aW9uLCBNMzJSWAotVGhpcyBpcyBhIHNob3J0ZXIgc3lub255bSBmb3IgdGhlIEBlbXBoey1uby13YXJuLWV4cGxpY2l0LXBhcmFsbGVsLWNvbmZsaWN0c30KLW9wdGlvbi4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBNMzJSLVdhcm5pbmdzCi1Ac2VjdGlvbiBNMzJSIFdhcm5pbmdzCi0KLUBjaW5kZXggd2FybmluZ3MsIE0zMlIKLUBjaW5kZXggTTMyUiB3YXJuaW5ncwotCi1UaGVyZSBhcmUgc2V2ZXJhbCB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcyB0aGF0IGNhbiBiZSBwcm9kdWNlZCBieQotQGNvZGV7QHZhbHVle0FTfX0gd2hpY2ggYXJlIHNwZWNpZmljIHRvIHRoZSBNMzJSOgotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gb3V0cHV0IG9mIDFzdCBpbnN0cnVjdGlvbiBpcyB0aGUgc2FtZSBhcyBhbiBpbnB1dCB0byAybmQgaW5zdHJ1Y3Rpb24gLSBpcyB0aGlzIGludGVudGlvbmFsID8KLVRoaXMgbWVzc2FnZSBpcyBvbmx5IHByb2R1Y2VkIGlmIHdhcm5pbmdzIGZvciBleHBsaWNpdCBwYXJhbGxlbAotY29uZmxpY3RzIGhhdmUgYmVlbiBlbmFibGVkLiAgSXQgaW5kaWNhdGVzIHRoYXQgdGhlIGFzc2VtYmxlciBoYXMKLWVuY291bnRlcmVkIGEgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24gaW4gd2hpY2ggdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIG9mCi10aGUgbGVmdCBoYW5kIGluc3RydWN0aW9uIGlzIHVzZWQgYXMgYW4gaW5wdXQgcmVnaXN0ZXIgaW4gdGhlIHJpZ2h0IGhhbmQKLWluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGUgaW4gdGhpcyBjb2RlIGZyYWdtZW50Ci1Ac2FtcHttdiByMSwgcjIgfHwgbmVnIHIzLCByMX0gcmVnaXN0ZXIgcjEgaXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZQotbW92ZSBpbnN0cnVjdGlvbiBhbmQgdGhlIGlucHV0IHRvIHRoZSBuZWcgaW5zdHJ1Y3Rpb24uCi0KLUBpdGVtIG91dHB1dCBvZiAybmQgaW5zdHJ1Y3Rpb24gaXMgdGhlIHNhbWUgYXMgYW4gaW5wdXQgdG8gMXN0IGluc3RydWN0aW9uIC0gaXMgdGhpcyBpbnRlbnRpb25hbCA/Ci1UaGlzIG1lc3NhZ2UgaXMgb25seSBwcm9kdWNlZCBpZiB3YXJuaW5ncyBmb3IgZXhwbGljaXQgcGFyYWxsZWwKLWNvbmZsaWN0cyBoYXZlIGJlZW4gZW5hYmxlZC4gIEl0IGluZGljYXRlcyB0aGF0IHRoZSBhc3NlbWJsZXIgaGFzCi1lbmNvdW50ZXJlZCBhIHBhcmFsbGVsIGluc3RydWN0aW9uIGluIHdoaWNoIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBvZgotdGhlIHJpZ2h0IGhhbmQgaW5zdHJ1Y3Rpb24gaXMgdXNlZCBhcyBhbiBpbnB1dCByZWdpc3RlciBpbiB0aGUgbGVmdCBoYW5kCi1pbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlIGluIHRoaXMgY29kZSBmcmFnbWVudAotQHNhbXB7bXYgcjEsIHIyIHx8IG5lZyByMiwgcjN9IHJlZ2lzdGVyIHIyIGlzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUKLW5lZyBpbnN0cnVjdGlvbiBhbmQgdGhlIGlucHV0IHRvIHRoZSBtb3ZlIGluc3RydWN0aW9uLgotCi1AaXRlbSBpbnN0cnVjdGlvbiBAc2FtcHsuLi59IGlzIGZvciB0aGUgTTMyUlggb25seQotVGhpcyBtZXNzYWdlIGlzIHByb2R1Y2VkIHdoZW4gdGhlIGFzc2VtYmxlciBlbmNvdW50ZXJzIGFuIGluc3RydWN0aW9uCi13aGljaCBpcyBvbmx5IHN1cHBvcnRlZCBieSB0aGUgTTMyUnggcHJvY2Vzc29yLCBhbmQgdGhlIEBzYW1wey1tMzJyeH0KLWNvbW1hbmQgbGluZSBmbGFnIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgdG8gYWxsb3cgYXNzZW1ibHkgb2Ygc3VjaAotaW5zdHJ1Y3Rpb25zLiAKLQotQGl0ZW0gdW5rbm93biBpbnN0cnVjdGlvbiBAc2FtcHsuLi59Ci1UaGlzIG1lc3NhZ2UgaXMgcHJvZHVjZWQgd2hlbiB0aGUgYXNzZW1ibGVyIGVuY291bnRlcnMgYW4gaW5zdHJ1Y3Rpb24KLXdoaWNoIGl0IGRvZSBzbm90IHJlY29nbmlzZS4KLQotQGl0ZW0gb25seSB0aGUgTk9QIGluc3RydWN0aW9uIGNhbiBiZSBpc3N1ZWQgaW4gcGFyYWxsZWwgb24gdGhlIG0zMnIKLVRoaXMgbWVzc2FnZSBpcyBwcm9kdWNlZCB3aGVuIHRoZSBhc3NlbWJsZXIgZW5jb3VudGVycyBhIHBhcmFsbGVsCi1pbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBpbnZvbHZlIGEgTk9QIGluc3RydWN0aW9uIGFuZCB0aGUKLUBzYW1wey1tMzJyeH0gY29tbWFuZCBsaW5lIGZsYWcgaGFzIG5vdCBiZWVuIHNwZWNpZmllZC4gIE9ubHkgdGhlIE0zMlJ4Ci1wcm9jZXNzb3IgaXMgYWJsZSB0byBleGVjdXRlIHR3byBpbnN0cnVjdGlvbnMgaW4gcGFyYWxsZWwuCi0KLUBpdGVtIGluc3RydWN0aW9uIEBzYW1wey4uLn0gY2Fubm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLgotVGhpcyBtZXNzYWdlIGlzIHByb2R1Y2VkIHdoZW4gdGhlIGFzc2VtYmxlciBlbmNvdW50ZXJzIGEgcGFyYWxsZWwKLWluc3RydWN0aW9uIHdoaWNoIGlzIG1hZGUgdXAgb2Ygb25lIG9yIHR3byBpbnN0cnVjdGlvbnMgd2hpY2ggY2Fubm90IGJlCi1leGVjdXRlZCBpbiBwYXJhbGxlbC4KLQotQGl0ZW0gSW5zdHJ1Y3Rpb25zIHNoYXJlIHRoZSBzYW1lIGV4ZWN1dGlvbiBwaXBlbGluZQotVGhpcyBtZXNzYWdlIGlzIHByb2R1Y2VkIHdoZW4gdGhlIGFzc2VtYmxlciBlbmNvdW50ZXJzIGEgcGFyYWxsZWwKLWluc3RydWN0aW9uIHdob2VzIGNvbXBvbmVudHMgYm90aCB1c2UgdGhlIHNhbWUgZXhlY3V0aW9uIHBpcGVsaW5lLgotCi1AaXRlbSBJbnN0cnVjdGlvbnMgd3JpdGUgdG8gdGhlIHNhbWUgZGVzdGluYXRpb24gcmVnaXN0ZXIuCi1UaGlzIG1lc3NhZ2UgaXMgcHJvZHVjZWQgd2hlbiB0aGUgYXNzZW1ibGVyIGVuY291bnRlcnMgYSBwYXJhbGxlbAotaW5zdHJ1Y3Rpb24gd2hlcmUgYm90aCBjb21wb25lbnRzIGF0dGVtcHQgdG8gbW9kaWZ5IHRoZSBzYW1lIHJlZ2lzdGVyLgotRm9yIGV4YW1wbGUgdGhlc2UgY29kZSBmcmFnbWVudHMgd2lsbCBwcm9kdWNlIHRoaXMgbWVzc2FnZToKLUBzYW1we212IHIxLCByMiB8fCBuZWcgcjEsIHIzfQotQHNhbXB7amwgcjAgfHwgbXYgcjE0LCByMX0KLUBzYW1we3N0IHIyLCBAQC1yMSB8fCBtdiByMSwgcjN9IAotQHNhbXB7bXYgcjEsIHIyIHx8IGxkIHIwLCBAQHIxK30gCi1Ac2FtcHtjbXAgcjEsIHIyIHx8IGFkZHggcjMsIHI0fSAoQm90aCB3cml0ZSB0byB0aGUgY29uZGl0aW9uIGJpdCkKLQotQGVuZCB0YWJsZQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLW02OGsudGV4aSBiL2dhcy9kb2MvYy1tNjhrLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Zjg1N2YuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLW02OGsudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBNNjhLLURlcGVuZGVudAotQGNoYXB0ZXIgTTY4MHgwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIE02ODB4MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IE02ODB4MCBzdXBwb3J0Ci1AbWVudQotKiBNNjhLLU9wdHM6OiAgICAgICAgICAgICAgICAgICBNNjgweDAgT3B0aW9ucwotKiBNNjhLLVN5bnRheDo6ICAgICAgICAgICAgICAgICBTeW50YXgKLSogTTY4Sy1Nb3RvLVN5bnRheDo6ICAgICAgICAgICAgTW90b3JvbGEgU3ludGF4Ci0qIE02OEstRmxvYXQ6OiAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIE02OEstRGlyZWN0aXZlczo6ICAgICAgICAgICAgIDY4MHgwIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBNNjhLLW9wY29kZXM6OiAgICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgTTY4Sy1PcHRzCi1Ac2VjdGlvbiBNNjgweDAgT3B0aW9ucwotCi1AY2luZGV4IG9wdGlvbnMsIE02ODB4MAotQGNpbmRleCBNNjgweDAgb3B0aW9ucwotVGhlIE1vdG9yb2xhIDY4MHgwIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gaGFzIGEgZmV3IG1hY2hpbmUKLWRlcGVuZGVudCBvcHRpb25zLgotCi1AY2luZGV4IEBzYW1wey1sfSBvcHRpb24sIE02ODB4MAotWW91IGNhbiB1c2UgdGhlIEBzYW1wey1sfSBvcHRpb24gdG8gc2hvcnRlbiB0aGUgc2l6ZSBvZiByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZAotc3ltYm9scy4gIElmIHlvdSBkbyBub3QgdXNlIHRoZSBAc2FtcHstbH0gb3B0aW9uLCByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZAotc3ltYm9scyBhcmUgd2lkZSBlbm91Z2ggZm9yIGEgZnVsbCBAY29kZXtsb25nfSAoMzIgYml0cykuICAoU2luY2UKLUBjb2Rle0B2YWx1ZXtBU319IGNhbm5vdCBrbm93IHdoZXJlIHRoZXNlIHN5bWJvbHMgZW5kIHVwLCBAY29kZXtAdmFsdWV7QVN9fSBjYW4KLW9ubHkgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBsaW5rZXIgdG8gZmlsbCBpbiBsYXRlci4gIFNpbmNlIEBjb2Rle0B2YWx1ZXtBU319Ci1kb2VzIG5vdCBrbm93IGhvdyBmYXIgYXdheSB0aGVzZSBzeW1ib2xzIGFyZSwgaXQgYWxsb2NhdGVzIGFzIG11Y2ggc3BhY2UgYXMgaXQKLWNhbi4pICBJZiB5b3UgdXNlIHRoaXMgb3B0aW9uLCB0aGUgcmVmZXJlbmNlcyBhcmUgb25seSBvbmUgd29yZCB3aWRlICgxNiBiaXRzKS4KLVRoaXMgbWF5IGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0aGUgb2JqZWN0IGZpbGUgdG8gYmUgYXMgc21hbGwgYXMgcG9zc2libGUsIGFuZAoteW91IGtub3cgdGhhdCB0aGUgcmVsZXZhbnQgc3ltYm9scyBhcmUgYWx3YXlzIGxlc3MgdGhhbiAxNyBiaXRzIGF3YXkuCi0KLUBjaW5kZXggQHNhbXB7LS1yZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWx9IG9wdGlvbiwgTTY4MHgwCi1Gb3Igc29tZSBjb25maWd1cmF0aW9ucywgZXNwZWNpYWxseSB0aG9zZSB3aGVyZSB0aGUgY29tcGlsZXIgbm9ybWFsbHkKLWRvZXMgbm90IHByZXBlbmQgYW4gdW5kZXJzY29yZSB0byB0aGUgbmFtZXMgb2YgdXNlciB2YXJpYWJsZXMsIHRoZQotYXNzZW1ibGVyIHJlcXVpcmVzIGEgQHNhbXB7JX0gYmVmb3JlIGFueSB1c2Ugb2YgYSByZWdpc3RlciBuYW1lLiAgVGhpcwotaXMgaW50ZW5kZWQgdG8gbGV0IHRoZSBhc3NlbWJsZXIgZGlzdGluZ3Vpc2ggYmV0d2VlbiBDIHZhcmlhYmxlcyBhbmQKLWZ1bmN0aW9ucyBuYW1lZCBAc2FtcHthMH0gdGhyb3VnaCBAc2FtcHthN30sIGFuZCBzbyBvbi4gIFRoZSBAc2FtcHslfSBpcwotYWx3YXlzIGFjY2VwdGVkLCBidXQgaXMgbm90IHJlcXVpcmVkIGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zLCBub3RhYmx5Ci1Ac2FtcHtzdW4zfS4gIFRoZSBAc2FtcHstLXJlZ2lzdGVyLXByZWZpeC1vcHRpb25hbH0gb3B0aW9uIG1heSBiZSB1c2VkCi10byBwZXJtaXQgb21pdHRpbmcgdGhlIEBzYW1weyV9IGV2ZW4gZm9yIGNvbmZpZ3VyYXRpb25zIGZvciB3aGljaCBpdCBpcwotbm9ybWFsbHkgcmVxdWlyZWQuICBJZiB0aGlzIGlzIGRvbmUsIGl0IHdpbGwgZ2VuZXJhbGx5IGJlIGltcG9zc2libGUgdG8KLXJlZmVyIHRvIEMgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lcyBhcyByZWdpc3RlcgotbmFtZXMuCi0KLUBjaW5kZXggQHNhbXB7LS1iaXR3aXNlLW9yfSBvcHRpb24sIE02ODB4MAotTm9ybWFsbHkgdGhlIGNoYXJhY3RlciBAc2FtcHt8fSBpcyB0cmVhdGVkIGFzIGEgY29tbWVudCBjaGFyYWN0ZXIsIHdoaWNoCi1tZWFucyB0aGF0IGl0IGNhbiBub3QgYmUgdXNlZCBpbiBleHByZXNzaW9ucy4gIFRoZSBAc2FtcHstLWJpdHdpc2Utb3J9Ci1vcHRpb24gdHVybnMgQHNhbXB7fH0gaW50byBhIG5vcm1hbCBjaGFyYWN0ZXIuICBJbiB0aGlzIG1vZGUsIHlvdSBtdXN0Ci1laXRoZXIgdXNlIEMgc3R5bGUgY29tbWVudHMsIG9yIHN0YXJ0IGNvbW1lbnRzIHdpdGggYSBAc2FtcHsjfSBjaGFyYWN0ZXIKLWF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgotCi1AY2luZGV4IEBzYW1wey0tYmFzZS1zaXplLWRlZmF1bHQtMTZ9Ci1AY2luZGV4IEBzYW1wey0tYmFzZS1zaXplLWRlZmF1bHQtMzJ9Ci1JZiB5b3UgdXNlIGFuIGFkZHJlc3NpbmcgbW9kZSB3aXRoIGEgYmFzZSByZWdpc3RlciB3aXRob3V0IHNwZWNpZnlpbmcKLXRoZSBzaXplLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIG5vcm1hbGx5IHVzZSB0aGUgZnVsbCAzMiBiaXQgdmFsdWUuCi1Gb3IgZXhhbXBsZSwgdGhlIGFkZHJlc3NpbmcgbW9kZSBAc2FtcHslYTBAQCglZDApfSBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHslYTBAQCglZDA6bCl9LiAgWW91IG1heSB1c2UgdGhlIEBzYW1wey0tYmFzZS1zaXplLWRlZmF1bHQtMTZ9Ci1vcHRpb24gdG8gdGVsbCBAY29kZXtAdmFsdWV7QVN9fSB0byBkZWZhdWx0IHRvIHVzaW5nIHRoZSAxNiBiaXQgdmFsdWUuCi1JbiB0aGlzIGNhc2UsIEBzYW1weyVhMEBAKCVkMCl9IGlzIGVxdWl2YWxlbnQgdG8gQHNhbXB7JWEwQEAoJWQwOncpfS4KLVlvdSBtYXkgdXNlIHRoZSBAc2FtcHstLWJhc2Utc2l6ZS1kZWZhdWx0LTMyfSBvcHRpb24gdG8gcmVzdG9yZSB0aGUKLWRlZmF1bHQgYmVoYXZpb3VyLgotCi1AY2luZGV4IEBzYW1wey0tZGlzcC1zaXplLWRlZmF1bHQtMTZ9Ci1AY2luZGV4IEBzYW1wey0tZGlzcC1zaXplLWRlZmF1bHQtMzJ9Ci1JZiB5b3UgdXNlIGFuIGFkZHJlc3NpbmcgbW9kZSB3aXRoIGEgZGlzcGxhY2VtZW50LCBhbmQgdGhlIHZhbHVlIG9mIHRoZQotZGlzcGxhY2VtZW50IGlzIG5vdCBrbm93biwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBub3JtYWxseSBhc3N1bWUgdGhhdAotdGhlIHZhbHVlIGlzIDMyIGJpdHMuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHN5bWJvbCBAc2FtcHtkaXNwfSBoYXMgbm90Ci1iZWVuIGRlZmluZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYXNzZW1ibGUgdGhlIGFkZHJlc3NpbmcgbW9kZQotQHNhbXB7JWEwQEAoZGlzcCwlZDApfSBhcyB0aG91Z2ggQHNhbXB7ZGlzcH0gaXMgYSAzMiBiaXQgdmFsdWUuICBZb3UgbWF5Ci11c2UgdGhlIEBzYW1wey0tZGlzcC1zaXplLWRlZmF1bHQtMTZ9IG9wdGlvbiB0byB0ZWxsIEBjb2Rle0B2YWx1ZXtBU319Ci10byBpbnN0ZWFkIGFzc3VtZSB0aGF0IHRoZSBkaXNwbGFjZW1lbnQgaXMgMTYgYml0cy4gIEluIHRoaXMgY2FzZSwKLUBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYXNzZW1ibGUgQHNhbXB7JWEwQEAoZGlzcCwlZDApfSBhcyB0aG91Z2gKLUBzYW1we2Rpc3B9IGlzIGEgMTYgYml0IHZhbHVlLiAgWW91IG1heSB1c2UgdGhlCi1Ac2FtcHstLWRpc3Atc2l6ZS1kZWZhdWx0LTMyfSBvcHRpb24gdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuCi0KLUBjaW5kZXggQHNhbXB7LW02ODAwMH0gYW5kIHJlbGF0ZWQgb3B0aW9ucwotQGNpbmRleCBhcmNoaXRlY3R1cmUgb3B0aW9ucywgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBhcmNoaXRlY3R1cmUgb3B0aW9ucwotQGNvZGV7QHZhbHVle0FTfX0gY2FuIGFzc2VtYmxlIGNvZGUgZm9yIHNldmVyYWwgZGlmZmVyZW50IG1lbWJlcnMgb2YgdGhlCi1Nb3Rvcm9sYSA2ODB4MCBmYW1pbHkuICBUaGUgZGVmYXVsdCBkZXBlbmRzIHVwb24gaG93IEBjb2Rle0B2YWx1ZXtBU319Ci13YXMgY29uZmlndXJlZCB3aGVuIGl0IHdhcyBidWlsdDsgbm9ybWFsbHksIHRoZSBkZWZhdWx0IGlzIHRvIGFzc2VtYmxlCi1jb2RlIGZvciB0aGUgNjgwMjAgbWljcm9wcm9jZXNzb3IuICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgbWF5IGJlIHVzZWQgdG8KLWNoYW5nZSB0aGUgZGVmYXVsdC4gIFRoZXNlIG9wdGlvbnMgY29udHJvbCB3aGljaCBpbnN0cnVjdGlvbnMgYW5kCi1hZGRyZXNzaW5nIG1vZGVzIGFyZSBwZXJtaXR0ZWQuICBUaGUgbWVtYmVycyBvZiB0aGUgNjgweDAgZmFtaWx5IGFyZQotdmVyeSBzaW1pbGFyLiAgRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaWZmZXJlbmNlcywgc2VlIHRoZQotTW90b3JvbGEgbWFudWFscy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSAtbTY4MDAwCi1AaXRlbXggLW02OGVjMDAwCi1AaXRlbXggLW02OGhjMDAwCi1AaXRlbXggLW02OGhjMDAxCi1AaXRlbXggLW02ODAwOAotQGl0ZW14IC1tNjgzMDIKLUBpdGVteCAtbTY4MzA2Ci1AaXRlbXggLW02ODMwNwotQGl0ZW14IC1tNjgzMjIKLUBpdGVteCAtbTY4MzU2Ci1Bc3NlbWJsZSBmb3IgdGhlIDY4MDAwLiBAc2FtcHstbTY4MDA4fSwgQHNhbXB7LW02ODMwMn0sIGFuZCBzbyBvbiBhcmUgc3lub255bXMKLWZvciBAc2FtcHstbTY4MDAwfSwgc2luY2UgdGhlIGNoaXBzIGFyZSB0aGUgc2FtZSBmcm9tIHRoZSBwb2ludCBvZiB2aWV3Ci1vZiB0aGUgYXNzZW1ibGVyLgotCi1AaXRlbSAtbTY4MDEwCi1Bc3NlbWJsZSBmb3IgdGhlIDY4MDEwLgotCi1AaXRlbSAtbTY4MDIwCi1AaXRlbXggLW02OGVjMDIwCi1Bc3NlbWJsZSBmb3IgdGhlIDY4MDIwLiAgVGhpcyBpcyBub3JtYWxseSB0aGUgZGVmYXVsdC4KLQotQGl0ZW0gLW02ODAzMAotQGl0ZW14IC1tNjhlYzAzMAotQXNzZW1ibGUgZm9yIHRoZSA2ODAzMC4KLQotQGl0ZW0gLW02ODA0MAotQGl0ZW14IC1tNjhlYzA0MAotQXNzZW1ibGUgZm9yIHRoZSA2ODA0MC4KLQotQGl0ZW0gLW02ODA2MAotQGl0ZW14IC1tNjhlYzA2MAotQXNzZW1ibGUgZm9yIHRoZSA2ODA2MC4KLQotQGl0ZW0gLW1jcHUzMgotQGl0ZW14IC1tNjgzMzAKLUBpdGVteCAtbTY4MzMxCi1AaXRlbXggLW02ODMzMgotQGl0ZW14IC1tNjgzMzMKLUBpdGVteCAtbTY4MzM0Ci1AaXRlbXggLW02ODMzNgotQGl0ZW14IC1tNjgzNDAKLUBpdGVteCAtbTY4MzQxCi1AaXRlbXggLW02ODM0OQotQGl0ZW14IC1tNjgzNjAKLUFzc2VtYmxlIGZvciB0aGUgQ1BVMzIgZmFtaWx5IG9mIGNoaXBzLgotCi1AaXRlbSAtbTUyMDAKLUFzc2VtYmxlIGZvciB0aGUgQ29sZEZpcmUgZmFtaWx5IG9mIGNoaXBzLgotCi1AaXRlbSAtbTY4ODgxCi1AaXRlbXggLW02ODg4MgotQXNzZW1ibGUgNjg4ODEgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlCi02ODAyMCwgNjgwMzAsIGFuZCB0aGUgQ1BVMzIuICBUaGUgNjgwNDAgYW5kIDY4MDYwIGFsd2F5cyBzdXBwb3J0Ci1mbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuCi0KLUBpdGVtIC1tbm8tNjg4ODEKLURvIG5vdCBhc3NlbWJsZSA2ODg4MSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0Ci1mb3IgNjgwMDAgYW5kIHRoZSA2ODAxMC4gIFRoZSA2ODA0MCBhbmQgNjgwNjAgYWx3YXlzIHN1cHBvcnQgZmxvYXRpbmcKLXBvaW50IGluc3RydWN0aW9ucywgZXZlbiBpZiB0aGlzIG9wdGlvbiBpcyB1c2VkLgotCi1AaXRlbSAtbTY4ODUxCi1Bc3NlbWJsZSA2ODg1MSBNTVUgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlIDY4MDIwLAotNjgwMzAsIGFuZCA2ODA2MC4gIFRoZSA2ODA0MCBhY2NlcHRzIGEgc29tZXdoYXQgZGlmZmVyZW50IHNldCBvZiBNTVUKLWluc3RydWN0aW9uczsgQHNhbXB7LW02ODg1MX0gYW5kIEBzYW1wey1tNjgwNDB9IHNob3VsZCBub3QgYmUgdXNlZAotdG9nZXRoZXIuCi0KLUBpdGVtIC1tbm8tNjg4NTEKLURvIG5vdCBhc3NlbWJsZSA2ODg1MSBNTVUgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlCi02ODAwMCwgNjgwMTAsIGFuZCB0aGUgQ1BVMzIuICBUaGUgNjgwNDAgYWNjZXB0cyBhIHNvbWV3aGF0IGRpZmZlcmVudCBzZXQKLW9mIE1NVSBpbnN0cnVjdGlvbnMuCi1AZW5kIHRhYmxlCi0KLUBub2RlIE02OEstU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLQotQGNpbmRleCBAc2N7bWl0fQotVGhpcyBzeW50YXggZm9yIHRoZSBNb3Rvcm9sYSA2ODB4MCB3YXMgZGV2ZWxvcGVkIGF0IEBzY3ttaXR9LgotCi1AY2luZGV4IE02ODB4MCBzeW50YXgKLUBjaW5kZXggc3ludGF4LCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIHNpemUgbW9kaWZpZXJzCi1AY2luZGV4IHNpemUgbW9kaWZpZXJzLCBNNjgweDAKLVRoZSA2ODB4MCB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHVzZXMgaW5zdHJ1Y3Rpb25zIG5hbWVzIGFuZAotc3ludGF4IGNvbXBhdGlibGUgd2l0aCB0aGUgU3VuIGFzc2VtYmxlci4gIEludGVydmVuaW5nIHBlcmlvZHMgYXJlCi1pZ25vcmVkOyBmb3IgZXhhbXBsZSwgQHNhbXB7bW92bH0gaXMgZXF1aXZhbGVudCB0byBAc2FtcHttb3YubH0uCi0KLUluIHRoZSBmb2xsb3dpbmcgdGFibGUgQHZhcnthcGN9IHN0YW5kcyBmb3IgYW55IG9mIHRoZSBhZGRyZXNzIHJlZ2lzdGVycwotKEBzYW1weyVhMH0gdGhyb3VnaCBAc2FtcHslYTd9KSwgdGhlIHByb2dyYW0gY291bnRlciAoQHNhbXB7JXBjfSksIHRoZQotemVyby1hZGRyZXNzIHJlbGF0aXZlIHRvIHRoZSBwcm9ncmFtIGNvdW50ZXIgKEBzYW1weyV6cGN9KSwgYSBzdXBwcmVzc2VkCi1hZGRyZXNzIHJlZ2lzdGVyIChAc2FtcHslemEwfSB0aHJvdWdoIEBzYW1weyV6YTd9KSwgb3IgaXQgbWF5IGJlIG9taXR0ZWQKLWVudGlyZWx5LiAgVGhlIHVzZSBvZiBAdmFye3NpemV9IG1lYW5zIG9uZSBvZiBAc2FtcHt3fSBvciBAc2FtcHtsfSwgYW5kCi1pdCBtYXkgYmUgb21pdHRlZCwgYWxvbmcgd2l0aCB0aGUgbGVhZGluZyBjb2xvbiwgdW5sZXNzIGEgc2NhbGUgaXMgYWxzbwotc3BlY2lmaWVkLiAgVGhlIHVzZSBvZiBAdmFye3NjYWxlfSBtZWFucyBvbmUgb2YgQHNhbXB7MX0sIEBzYW1wezJ9LAotQHNhbXB7NH0sIG9yIEBzYW1wezh9LCBhbmQgaXQgbWF5IGFsd2F5cyBiZSBvbWl0dGVkIGFsb25nIHdpdGggdGhlCi1sZWFkaW5nIGNvbG9uLgotCi1AY2luZGV4IE02ODB4MCBhZGRyZXNzaW5nIG1vZGVzCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIE02ODB4MAotVGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGFyZSB1bmRlcnN0b29kOgotQHRhYmxlIEBkZm4KLUBpdGVtIEltbWVkaWF0ZQotQHNhbXB7I0B2YXJ7bnVtYmVyfX0KLQotQGl0ZW0gRGF0YSBSZWdpc3RlcgotQHNhbXB7JWQwfSB0aHJvdWdoIEBzYW1weyVkN30KLQotQGl0ZW0gQWRkcmVzcyBSZWdpc3RlcgotQHNhbXB7JWEwfSB0aHJvdWdoIEBzYW1weyVhN31AKgotQHNhbXB7JWE3fSBpcyBhbHNvIGtub3duIGFzIEBzYW1weyVzcH0sIGkuZS4gdGhlIFN0YWNrIFBvaW50ZXIuICBAY29kZXslYTZ9Ci1pcyBhbHNvIGtub3duIGFzIEBzYW1weyVmcH0sIHRoZSBGcmFtZSBQb2ludGVyLgotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIEluZGlyZWN0Ci1Ac2FtcHslYTBAQH0gdGhyb3VnaCBAc2FtcHslYTdAQH0KLQotQGl0ZW0gQWRkcmVzcyBSZWdpc3RlciBQb3N0aW5jcmVtZW50Ci1Ac2FtcHslYTBAQCt9IHRocm91Z2ggQHNhbXB7JWE3QEArfQotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIFByZWRlY3JlbWVudAotQHNhbXB7JWEwQEAtfSB0aHJvdWdoIEBzYW1weyVhN0BALX0KLQotQGl0ZW0gSW5kaXJlY3QgUGx1cyBPZmZzZXQKLUBzYW1we0B2YXJ7YXBjfUBAKEB2YXJ7bnVtYmVyfSl9Ci0KLUBpdGVtIEluZGV4Ci1Ac2FtcHtAdmFye2FwY31AQChAdmFye251bWJlcn0sQHZhcntyZWdpc3Rlcn06QHZhcntzaXplfTpAdmFye3NjYWxlfSl9Ci0KLVRoZSBAdmFye251bWJlcn0gbWF5IGJlIG9taXR0ZWQuCi0KLUBpdGVtIFBvc3RpbmRleAotQHNhbXB7QHZhcnthcGN9QEAoQHZhcntudW1iZXJ9KUBAKEB2YXJ7b251bWJlcn0sQHZhcntyZWdpc3Rlcn06QHZhcntzaXplfTpAdmFye3NjYWxlfSl9Ci0KLVRoZSBAdmFye29udW1iZXJ9IG9yIHRoZSBAdmFye3JlZ2lzdGVyfSwgYnV0IG5vdCBib3RoLCBtYXkgYmUgb21pdHRlZC4KLQotQGl0ZW0gUHJlaW5kZXgKLUBzYW1we0B2YXJ7YXBjfUBAKEB2YXJ7bnVtYmVyfSxAdmFye3JlZ2lzdGVyfTpAdmFye3NpemV9OkB2YXJ7c2NhbGV9KUBAKEB2YXJ7b251bWJlcn0pfQotCi1UaGUgQHZhcntudW1iZXJ9IG1heSBiZSBvbWl0dGVkLiAgT21pdHRpbmcgdGhlIEB2YXJ7cmVnaXN0ZXJ9IHByb2R1Y2VzCi10aGUgUG9zdGluZGV4IGFkZHJlc3NpbmcgbW9kZS4KLQotQGl0ZW0gQWJzb2x1dGUKLUBzYW1we0B2YXJ7c3ltYm9sfX0sIG9yIEBzYW1we0B2YXJ7ZGlnaXRzfX0sIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkKLUBzYW1wezpifSwgQHNhbXB7Ond9LCBvciBAc2FtcHs6bH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIE02OEstTW90by1TeW50YXgKLUBzZWN0aW9uIE1vdG9yb2xhIFN5bnRheAotCi1AY2luZGV4IE1vdG9yb2xhIHN5bnRheCBmb3IgdGhlIDY4MHgwCi1AY2luZGV4IGFsdGVybmF0ZSBzeW50YXggZm9yIHRoZSA2ODB4MAotCi1UaGUgc3RhbmRhcmQgTW90b3JvbGEgc3ludGF4IGZvciB0aGlzIGNoaXAgZGlmZmVycyBmcm9tIHRoZSBzeW50YXgKLWFscmVhZHkgZGlzY3Vzc2VkIChAcHhyZWZ7TTY4Sy1TeW50YXgsLFN5bnRheH0pLiAgQGNvZGV7QHZhbHVle0FTfX0gY2FuCi1hY2NlcHQgTW90b3JvbGEgc3ludGF4IGZvciBvcGVyYW5kcywgZXZlbiBpZiBAc2N7bWl0fSBzeW50YXggaXMgdXNlZCBmb3IKLW90aGVyIG9wZXJhbmRzIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgVGhlIHR3byBraW5kcyBvZiBzeW50YXggYXJlCi1mdWxseSBjb21wYXRpYmxlLgotCi1JbiB0aGUgZm9sbG93aW5nIHRhYmxlIEB2YXJ7YXBjfSBzdGFuZHMgZm9yIGFueSBvZiB0aGUgYWRkcmVzcyByZWdpc3RlcnMKLShAc2FtcHslYTB9IHRocm91Z2ggQHNhbXB7JWE3fSksIHRoZSBwcm9ncmFtIGNvdW50ZXIgKEBzYW1weyVwY30pLCB0aGUKLXplcm8tYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgcHJvZ3JhbSBjb3VudGVyIChAc2FtcHslenBjfSksIG9yIGEKLXN1cHByZXNzZWQgYWRkcmVzcyByZWdpc3RlciAoQHNhbXB7JXphMH0gdGhyb3VnaCBAc2FtcHslemE3fSkuICBUaGUgdXNlCi1vZiBAdmFye3NpemV9IG1lYW5zIG9uZSBvZiBAc2FtcHt3fSBvciBAc2FtcHtsfSwgYW5kIGl0IG1heSBhbHdheXMgYmUKLW9taXR0ZWQgYWxvbmcgd2l0aCB0aGUgbGVhZGluZyBkb3QuICBUaGUgdXNlIG9mIEB2YXJ7c2NhbGV9IG1lYW5zIG9uZSBvZgotQHNhbXB7MX0sIEBzYW1wezJ9LCBAc2FtcHs0fSwgb3IgQHNhbXB7OH0sIGFuZCBpdCBtYXkgYWx3YXlzIGJlIG9taXR0ZWQKLWFsb25nIHdpdGggdGhlIGxlYWRpbmcgYXN0ZXJpc2suCi0KLVRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhZGRyZXNzaW5nIG1vZGVzIGFyZSB1bmRlcnN0b29kOgotCi1AdGFibGUgQGRmbgotQGl0ZW0gQWRkcmVzcyBSZWdpc3RlciBJbmRpcmVjdAotQHNhbXB7KCVhMCl9IHRocm91Z2ggQHNhbXB7KCVhNyl9QCogCi1Ac2FtcHslYTd9IGlzIGFsc28ga25vd24gYXMgQHNhbXB7JXNwfSwgaS5lLiB0aGUgU3RhY2sgUG9pbnRlci4gIEBjb2RleyVhNn0KLWlzIGFsc28ga25vd24gYXMgQHNhbXB7JWZwfSwgdGhlIEZyYW1lIFBvaW50ZXIuCi0KLUBpdGVtIEFkZHJlc3MgUmVnaXN0ZXIgUG9zdGluY3JlbWVudAotQHNhbXB7KCVhMCkrfSB0aHJvdWdoIEBzYW1weyglYTcpK30KLQotQGl0ZW0gQWRkcmVzcyBSZWdpc3RlciBQcmVkZWNyZW1lbnQKLUBzYW1wey0oJWEwKX0gdGhyb3VnaCBAc2FtcHstKCVhNyl9Ci0KLUBpdGVtIEluZGlyZWN0IFBsdXMgT2Zmc2V0Ci1Ac2FtcHtAdmFye251bWJlcn0oQHZhcnslYTB9KX0gdGhyb3VnaCBAc2FtcHtAdmFye251bWJlcn0oQHZhcnslYTd9KX0sCi1vciBAc2FtcHtAdmFye251bWJlcn0oQHZhcnslcGN9KX0uCi0KLVRoZSBAdmFye251bWJlcn0gbWF5IGFsc28gYXBwZWFyIHdpdGhpbiB0aGUgcGFyZW50aGVzZXMsIGFzIGluCi1Ac2FtcHsoQHZhcntudW1iZXJ9LEB2YXJ7JWEwfSl9LiAgV2hlbiB1c2VkIHdpdGggdGhlIEB2YXJ7cGN9LCB0aGUKLUB2YXJ7bnVtYmVyfSBtYXkgYmUgb21pdHRlZCAod2l0aCBhbiBhZGRyZXNzIHJlZ2lzdGVyLCBvbWl0dGluZyB0aGUKLUB2YXJ7bnVtYmVyfSBwcm9kdWNlcyBBZGRyZXNzIFJlZ2lzdGVyIEluZGlyZWN0IG1vZGUpLgotCi1AaXRlbSBJbmRleAotQHNhbXB7QHZhcntudW1iZXJ9KEB2YXJ7YXBjfSxAdmFye3JlZ2lzdGVyfS5AdmFye3NpemV9KkB2YXJ7c2NhbGV9KX0KLQotVGhlIEB2YXJ7bnVtYmVyfSBtYXkgYmUgb21pdHRlZCwgb3IgaXQgbWF5IGFwcGVhciB3aXRoaW4gdGhlCi1wYXJlbnRoZXNlcy4gIFRoZSBAdmFye2FwY30gbWF5IGJlIG9taXR0ZWQuICBUaGUgQHZhcntyZWdpc3Rlcn0gYW5kIHRoZQotQHZhcnthcGN9IG1heSBhcHBlYXIgaW4gZWl0aGVyIG9yZGVyLiAgSWYgYm90aCBAdmFye2FwY30gYW5kCi1AdmFye3JlZ2lzdGVyfSBhcmUgYWRkcmVzcyByZWdpc3RlcnMsIGFuZCB0aGUgQHZhcntzaXplfSBhbmQgQHZhcntzY2FsZX0KLWFyZSBvbWl0dGVkLCB0aGVuIHRoZSBmaXJzdCByZWdpc3RlciBpcyB0YWtlbiBhcyB0aGUgYmFzZSByZWdpc3RlciwgYW5kCi10aGUgc2Vjb25kIGFzIHRoZSBpbmRleCByZWdpc3Rlci4KLQotQGl0ZW0gUG9zdGluZGV4Ci1Ac2FtcHsoW0B2YXJ7bnVtYmVyfSxAdmFye2FwY31dLEB2YXJ7cmVnaXN0ZXJ9LkB2YXJ7c2l6ZX0qQHZhcntzY2FsZX0sQHZhcntvbnVtYmVyfSl9Ci0KLVRoZSBAdmFye29udW1iZXJ9LCBvciB0aGUgQHZhcntyZWdpc3Rlcn0sIG9yIGJvdGgsIG1heSBiZSBvbWl0dGVkLgotRWl0aGVyIHRoZSBAdmFye251bWJlcn0gb3IgdGhlIEB2YXJ7YXBjfSBtYXkgYmUgb21pdHRlZCwgYnV0IG5vdCBib3RoLgotCi1AaXRlbSBQcmVpbmRleAotQHNhbXB7KFtAdmFye251bWJlcn0sQHZhcnthcGN9LEB2YXJ7cmVnaXN0ZXJ9LkB2YXJ7c2l6ZX0qQHZhcntzY2FsZX1dLEB2YXJ7b251bWJlcn0pfQotCi1UaGUgQHZhcntudW1iZXJ9LCBvciB0aGUgQHZhcnthcGN9LCBvciB0aGUgQHZhcntyZWdpc3Rlcn0sIG9yIGFueSB0d28gb2YKLXRoZW0sIG1heSBiZSBvbWl0dGVkLiAgVGhlIEB2YXJ7b251bWJlcn0gbWF5IGJlIG9taXR0ZWQuICBUaGUKLUB2YXJ7cmVnaXN0ZXJ9IGFuZCB0aGUgQHZhcnthcGN9IG1heSBhcHBlYXIgaW4gZWl0aGVyIG9yZGVyLiAgSWYgYm90aAotQHZhcnthcGN9IGFuZCBAdmFye3JlZ2lzdGVyfSBhcmUgYWRkcmVzcyByZWdpc3RlcnMsIGFuZCB0aGUgQHZhcntzaXplfQotYW5kIEB2YXJ7c2NhbGV9IGFyZSBvbWl0dGVkLCB0aGVuIHRoZSBmaXJzdCByZWdpc3RlciBpcyB0YWtlbiBhcyB0aGUKLWJhc2UgcmVnaXN0ZXIsIGFuZCB0aGUgc2Vjb25kIGFzIHRoZSBpbmRleCByZWdpc3Rlci4KLUBlbmQgdGFibGUKLQotQG5vZGUgTTY4Sy1GbG9hdAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBmbG9hdGluZyBwb2ludAotUGFja2VkIGRlY2ltYWwgKFApIGZvcm1hdCBmbG9hdGluZyBsaXRlcmFscyBhcmUgbm90IHN1cHBvcnRlZC4KLUZlZWwgZnJlZSB0byBhZGQgdGhlIGNvZGUhCi0KLVRoZSBmbG9hdGluZyBwb2ludCBmb3JtYXRzIGdlbmVyYXRlZCBieSBkaXJlY3RpdmVzIGFyZSB0aGVzZS4KLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2Zsb2F0fSBkaXJlY3RpdmUsIE02ODB4MAotQGl0ZW0gLmZsb2F0Ci1AY29kZXtTaW5nbGV9IHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi0KLUBjaW5kZXggQGNvZGV7ZG91YmxlfSBkaXJlY3RpdmUsIE02ODB4MAotQGl0ZW0gLmRvdWJsZQotQGNvZGV7RG91YmxlfSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotCi1AY2luZGV4IEBjb2Rle2V4dGVuZH0gZGlyZWN0aXZlIE02ODB4MAotQGNpbmRleCBAY29kZXtsZG91YmxlfSBkaXJlY3RpdmUgTTY4MHgwCi1AaXRlbSAuZXh0ZW5kCi1AaXRlbXggLmxkb3VibGUKLUBjb2Rle0V4dGVuZGVkfSBwcmVjaXNpb24gKEBjb2Rle2xvbmcgZG91YmxlfSkgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotQGVuZCB0YWJsZQotCi1Abm9kZSBNNjhLLURpcmVjdGl2ZXMKLUBzZWN0aW9uIDY4MHgwIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IE02ODB4MCBkaXJlY3RpdmVzCi1AY2luZGV4IGRpcmVjdGl2ZXMsIE02ODB4MAotSW4gb3JkZXIgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBTdW4gYXNzZW1ibGVyIHRoZSA2ODB4MCBhc3NlbWJsZXIKLXVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcy4KLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2RhdGExfSBkaXJlY3RpdmUsIE02ODB4MAotQGl0ZW0gLmRhdGExCi1UaGlzIGRpcmVjdGl2ZSBpcyBpZGVudGljYWwgdG8gYSBAY29kZXsuZGF0YSAxfSBkaXJlY3RpdmUuCi0KLUBjaW5kZXggQGNvZGV7ZGF0YTJ9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZGF0YTIKLVRoaXMgZGlyZWN0aXZlIGlzIGlkZW50aWNhbCB0byBhIEBjb2Rley5kYXRhIDJ9IGRpcmVjdGl2ZS4KLQotQGNpbmRleCBAY29kZXtldmVufSBkaXJlY3RpdmUsIE02ODB4MAotQGl0ZW0gLmV2ZW4KLVRoaXMgZGlyZWN0aXZlIGlzIGEgc3BlY2lhbCBjYXNlIG9mIHRoZSBAY29kZXsuYWxpZ259IGRpcmVjdGl2ZTsgaXQKLWFsaWducyB0aGUgb3V0cHV0IHRvIGFuIGV2ZW4gYnl0ZSBib3VuZGFyeS4KLQotQGNpbmRleCBAY29kZXtza2lwfSBkaXJlY3RpdmUsIE02ODB4MAotQGl0ZW0gLnNraXAKLVRoaXMgZGlyZWN0aXZlIGlzIGlkZW50aWNhbCB0byBhIEBjb2Rley5zcGFjZX0gZGlyZWN0aXZlLgotQGVuZCB0YWJsZQotCi1AbmVlZCAyMDAwCi1Abm9kZSBNNjhLLW9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBNNjgweDAgb3Bjb2RlcwotQGNpbmRleCBvcGNvZGVzLCBNNjgweDAKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc2V0LCBNNjgweDAKLUBjIGRvY0BjeWdudXMuY29tOiBJIGRvbid0IHNlZSBhbnkgcG9pbnQgaW4gdGhlIGZvbGxvd2luZwotQGMgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoLiAgQnVncyBhcmUgYnVnczsgaG93IGRvZXMgc2F5aW5nIHRoaXMKLUBjICAgICAgICAgICAgICAgICAgIGhlbHAgYW55b25lPwotQGlnbm9yZQotRGFuZ2VyOiAgU2V2ZXJhbCBidWdzIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgb3Bjb2RlIHRhYmxlIChhbmQKLWZpeGVkKS4gIE1vcmUgYnVncyBtYXkgZXhpc3QuICBCZSBjYXJlZnVsIHdoZW4gdXNpbmcgb2JzY3VyZQotaW5zdHJ1Y3Rpb25zLgotQGVuZCBpZ25vcmUKLQotQG1lbnUKLSogTTY4Sy1CcmFuY2g6OiAgICAgICAgICAgICAgICAgQnJhbmNoIEltcHJvdmVtZW50Ci0qIE02OEstQ2hhcnM6OiAgICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotQGVuZCBtZW51Ci0KLUBub2RlIE02OEstQnJhbmNoCi1Ac3Vic2VjdGlvbiBCcmFuY2ggSW1wcm92ZW1lbnQKLQotQGNpbmRleCBwc2V1ZG8tb3Bjb2RlcywgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBwc2V1ZG8tb3Bjb2RlcwotQGNpbmRleCBicmFuY2ggaW1wcm92ZW1lbnQsIE02ODB4MAotQGNpbmRleCBNNjgweDAgYnJhbmNoIGltcHJvdmVtZW50Ci1DZXJ0YWluIHBzZXVkbyBvcGNvZGVzIGFyZSBwZXJtaXR0ZWQgZm9yIGJyYW5jaCBpbnN0cnVjdGlvbnMuCi1UaGV5IGV4cGFuZCB0byB0aGUgc2hvcnRlc3QgYnJhbmNoIGluc3RydWN0aW9uIHRoYXQgcmVhY2ggdGhlCi10YXJnZXQuICBHZW5lcmFsbHkgdGhlc2UgbW5lbW9uaWNzIGFyZSBtYWRlIGJ5IHN1YnN0aXR1dGluZyBAc2FtcHtqfSBmb3IKLUBzYW1we2J9IGF0IHRoZSBzdGFydCBvZiBhIE1vdG9yb2xhIG1uZW1vbmljLgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIHBzZXVkby1vcGVyYXRpb25zLiAgQSBAY29kZXsqfSBmbGFncwotY2FzZXMgdGhhdCBhcmUgbW9yZSBmdWxseSBkZXNjcmliZWQgYWZ0ZXIgdGhlIHRhYmxlOgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICAgRGlzcGxhY2VtZW50Ci0gICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICB8ICAgICAgICAgICAgICAgIDY4MDIwICAgNjgwMDAvMTAKLVBzZXVkby1PcCB8QllURSAgICBXT1JEICAgIExPTkcgICAgTE9ORyAgICAgIG5vbi1QQyByZWxhdGl2ZQotICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGpic3IgfGJzcnMgICAgYnNyICAgICBic3JsICAgIGpzciAgICAgICBqc3IKLSAgICAgIGpyYSB8YnJhcyAgICBicmEgICAgIGJyYWwgICAgam1wICAgICAgIGptcAotKiAgICAgalhYIHxiWFhzICAgIGJYWCAgICAgYlhYbCAgICBiTlhzO2ptcGwgYk5YcztqbXAKLSogICAgZGJYWCB8ZGJYWCAgICBkYlhYICAgICAgICBkYlhYOyBicmE7IGptcGwKLSogICAgZmpYWCB8ZmJYWHcgICBmYlhYdyAgIGZiWFhsICAgICAgICAgICAgIGZiTlh3O2ptcAotCi1YWDogY29uZGl0aW9uCi1OWDogbmVnYXRpdmUgb2YgY29uZGl0aW9uIFhYCi0KLUBlbmQgc21hbGxleGFtcGxlCi1AY2VudGVyIEBjb2Rleyp9LS0tc2VlIGZ1bGwgZGVzY3JpcHRpb24gYmVsb3cKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBqYnNyCi1AaXRlbXgganJhCi1UaGVzZSBhcmUgdGhlIHNpbXBsZXN0IGp1bXAgcHNldWRvLW9wZXJhdGlvbnM7IHRoZXkgYWx3YXlzIG1hcCB0byBvbmUKLXBhcnRpY3VsYXIgbWFjaGluZSBpbnN0cnVjdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBkaXNwbGFjZW1lbnQgdG8gdGhlCi1icmFuY2ggdGFyZ2V0LgotCi1AaXRlbSBqQHZhcntYWH0KLUhlcmUsIEBzYW1we2pAdmFye1hYfX0gc3RhbmRzIGZvciBhbiBlbnRpcmUgZmFtaWx5IG9mIHBzZXVkby1vcGVyYXRpb25zLAotd2hlcmUgQHZhcntYWH0gaXMgYSBjb25kaXRpb25hbCBicmFuY2ggb3IgY29uZGl0aW9uLWNvZGUgdGVzdC4gIFRoZSBmdWxsCi1saXN0IG9mIHBzZXVkby1vcHMgaW4gdGhpcyBmYW1pbHkgaXM6Ci1Ac21hbGxleGFtcGxlCi0gamhpICAgamxzICAgamNjICAgamNzICAgam5lICAgamVxICAganZjCi0ganZzICAganBsICAgam1pICAgamdlICAgamx0ICAgamd0ICAgamxlCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Gb3IgdGhlIGNhc2VzIG9mIG5vbi1QQyByZWxhdGl2ZSBkaXNwbGFjZW1lbnRzIGFuZCBsb25nIGRpc3BsYWNlbWVudHMgb24KLXRoZSA2ODAwMCBvciA2ODAxMCwgQGNvZGV7QHZhbHVle0FTfX0gaXNzdWVzIGEgbG9uZ2VyIGNvZGUgZnJhZ21lbnQgaW4gdGVybXMgb2YKLUB2YXJ7Tlh9LCB0aGUgb3Bwb3NpdGUgY29uZGl0aW9uIHRvIEB2YXJ7WFh9LiAgRm9yIGV4YW1wbGUsIGZvciB0aGUKLW5vbi1QQyByZWxhdGl2ZSBjYXNlOgotQHNtYWxsZXhhbXBsZQotICAgIGpAdmFye1hYfSBmb28KLUBlbmQgc21hbGxleGFtcGxlCi1naXZlcwotQHNtYWxsZXhhbXBsZQotICAgICBiQHZhcntOWH1zIG9vZgotICAgICBqbXAgZm9vCi0gb29mOgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0gZGJAdmFye1hYfQotVGhlIGZ1bGwgZmFtaWx5IG9mIHBzZXVkby1vcGVyYXRpb25zIGNvdmVyZWQgaGVyZSBpcwotQHNtYWxsZXhhbXBsZQotIGRiaGkgICBkYmxzICAgZGJjYyAgIGRiY3MgICBkYm5lICAgZGJlcSAgIGRidmMKLSBkYnZzICAgZGJwbCAgIGRibWkgICBkYmdlICAgZGJsdCAgIGRiZ3QgICBkYmxlCi0gZGJmICAgIGRicmEgICBkYnQKLUBlbmQgc21hbGxleGFtcGxlCi0KLU90aGVyIHRoYW4gZm9yIHdvcmQgYW5kIGJ5dGUgZGlzcGxhY2VtZW50cywgd2hlbiB0aGUgc291cmNlIHJlYWRzCi1Ac2FtcHtkYkB2YXJ7WFh9IGZvb30sIEBjb2Rle0B2YWx1ZXtBU319IGVtaXRzCi1Ac21hbGxleGFtcGxlCi0gICAgIGRiQHZhcntYWH0gb28xCi0gICAgIGJyYSBvbzIKLSBvbzE6am1wbCBmb28KLSBvbzI6Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSBmakB2YXJ7WFh9Ci1UaGlzIGZhbWlseSBpbmNsdWRlcwotQHNtYWxsZXhhbXBsZQotIGZqbmUgICBmamVxICAgZmpnZSAgIGZqbHQgICBmamd0ICAgZmpsZSAgIGZqZgotIGZqdCAgICBmamdsICAgZmpnbGUgIGZqbmdlICBmam5nbCAgZmpuZ2xlIGZqbmd0Ci0gZmpubGUgIGZqbmx0ICBmam9nZSAgZmpvZ2wgIGZqb2d0ICBmam9sZSAgZmpvbHQKLSBmam9yICAgZmpzZXEgIGZqc2YgICBmanNuZSAgZmpzdCAgIGZqdWVxICBmanVnZQotIGZqdWd0ICBmanVsZSAgZmp1bHQgIGZqdW4KLUBlbmQgc21hbGxleGFtcGxlCi0KLUZvciBicmFuY2ggdGFyZ2V0cyB0aGF0IGFyZSBub3QgUEMgcmVsYXRpdmUsIEBjb2Rle0B2YWx1ZXtBU319IGVtaXRzCi1Ac21hbGxleGFtcGxlCi0gICAgIGZiQHZhcntOWH0gb29mCi0gICAgIGptcCBmb28KLSBvb2Y6Ci1AZW5kIHNtYWxsZXhhbXBsZQotd2hlbiBpdCBlbmNvdW50ZXJzIEBzYW1we2ZqQHZhcntYWH0gZm9vfS4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBNNjhLLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBzcGVjaWFsIGNoYXJhY3RlcnMsIE02ODB4MAotQGNpbmRleCBNNjgweDAgaW1tZWRpYXRlIGNoYXJhY3RlcgotQGNpbmRleCBpbW1lZGlhdGUgY2hhcmFjdGVyLCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgTTY4MHgwCi1AY2luZGV4IGNvbW1lbnRzLCBNNjgweDAKLVRoZSBpbW1lZGlhdGUgY2hhcmFjdGVyIGlzIEBzYW1weyN9IGZvciBTdW4gY29tcGF0aWJpbGl0eS4gIFRoZQotbGluZS1jb21tZW50IGNoYXJhY3RlciBpcyBAc2FtcHt8fSAodW5sZXNzIHRoZSBAc2FtcHstLWJpdHdpc2Utb3J9Ci1vcHRpb24gaXMgdXNlZCkuICBJZiBhIEBzYW1weyN9IGFwcGVhcnMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUsIGl0Ci1pcyB0cmVhdGVkIGFzIGEgY29tbWVudCB1bmxlc3MgaXQgbG9va3MgbGlrZSBAc2FtcHsjIGxpbmUgZmlsZX0sIGluCi13aGljaCBjYXNlIGl0IGlzIHRyZWF0ZWQgbm9ybWFsbHkuCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1taXBzLnRleGkgYi9nYXMvZG9jL2MtbWlwcy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjNkZGEzLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1taXBzLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBNSVBTLURlcGVuZGVudAotQGNoYXB0ZXIgTUlQUyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBNSVBTIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggTUlQUyBwcm9jZXNzb3IKLUBzY3tnbnV9IEBjb2Rle0B2YWx1ZXtBU319IGZvciBAc2N7bWlwc30gYXJjaGl0ZWN0dXJlcyBzdXBwb3J0cyBzZXZlcmFsCi1kaWZmZXJlbnQgQHNje21pcHN9IHByb2Nlc3NvcnMsIGFuZCBNSVBTIElTQSBsZXZlbHMgSSB0aHJvdWdoIElWLiAgRm9yCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgQHNje21pcHN9IGluc3RydWN0aW9uIHNldCwgc2VlIEBjaXRle01JUFMgUklTQwotQXJjaGl0ZWN0dXJlfSwgYnkgS2FuZSBhbmQgSGVpbmRyaWNoIChQcmVudGljZS1IYWxsKS4gIEZvciBhbiBvdmVydmlldwotb2YgQHNje21pcHN9IGFzc2VtYmx5IGNvbnZlbnRpb25zLCBzZWUgYGBBcHBlbmRpeCBEOiBBc3NlbWJseSBMYW5ndWFnZQotUHJvZ3JhbW1pbmcnJyBpbiB0aGUgc2FtZSB3b3JrLgotCi1AbWVudQotKiBNSVBTIE9wdHM6OiAgIAlBc3NlbWJsZXIgb3B0aW9ucwotKiBNSVBTIE9iamVjdDo6IAlFQ09GRiBvYmplY3QgY29kZQotKiBNSVBTIFN0YWJzOjogIAlEaXJlY3RpdmVzIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLSogTUlQUyBJU0E6OiAgICAJRGlyZWN0aXZlcyB0byBvdmVycmlkZSB0aGUgSVNBIGxldmVsCi0qIE1JUFMgYXV0b2V4dGVuZDo6CURpcmVjdGl2ZXMgZm9yIGV4dGVuZGluZyBNSVBTIDE2IGJpdCBpbnN0cnVjdGlvbnMKLSogTUlQUyBpbnNuOjoJCURpcmVjdGl2ZSB0byBtYXJrIGRhdGEgYXMgYW4gaW5zdHJ1Y3Rpb24KLSogTUlQUyBvcHRpb24gc3RhY2s6OglEaXJlY3RpdmVzIHRvIHNhdmUgYW5kIHJlc3RvcmUgb3B0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIE1JUFMgT3B0cwotQHNlY3Rpb24gQXNzZW1ibGVyIG9wdGlvbnMKLQotVGhlIEBzY3ttaXBzfSBjb25maWd1cmF0aW9ucyBvZiBAc2N7Z251fSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0IHRoZXNlCi1zcGVjaWFsIG9wdGlvbnM6Ci0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXstR30gb3B0aW9uIChNSVBTKQotQGl0ZW0gLUcgQHZhcntudW19Ci1UaGlzIG9wdGlvbiBzZXRzIHRoZSBsYXJnZXN0IHNpemUgb2YgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQKLWltcGxpY2l0bHkgd2l0aCB0aGUgQGNvZGV7Z3B9IHJlZ2lzdGVyLiAgSXQgaXMgb25seSBhY2NlcHRlZCBmb3IgdGFyZ2V0cwotdGhhdCB1c2UgQHNje2Vjb2ZmfSBmb3JtYXQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LgotCi1AY2luZGV4IEBjb2Rley1FQn0gb3B0aW9uIChNSVBTKQotQGNpbmRleCBAY29kZXstRUx9IG9wdGlvbiAoTUlQUykKLUBjaW5kZXggTUlQUyBiaWctZW5kaWFuIG91dHB1dAotQGNpbmRleCBNSVBTIGxpdHRsZS1lbmRpYW4gb3V0cHV0Ci1AY2luZGV4IGJpZy1lbmRpYW4gb3V0cHV0LCBNSVBTCi1AY2luZGV4IGxpdHRsZS1lbmRpYW4gb3V0cHV0LCBNSVBTCi1AaXRlbSAtRUIKLUBpdGVteCAtRUwKLUFueSBAc2N7bWlwc30gY29uZmlndXJhdGlvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBjYW4gc2VsZWN0IGJpZy1lbmRpYW4gb3IKLWxpdHRsZS1lbmRpYW4gb3V0cHV0IGF0IHJ1biB0aW1lICh1bmxpa2UgdGhlIG90aGVyIEBzY3tnbnV9IGRldmVsb3BtZW50Ci10b29scywgd2hpY2ggbXVzdCBiZSBjb25maWd1cmVkIGZvciBvbmUgb3IgdGhlIG90aGVyKS4gIFVzZSBAc2FtcHstRUJ9Ci10byBzZWxlY3QgYmlnLWVuZGlhbiBvdXRwdXQsIGFuZCBAc2FtcHstRUx9IGZvciBsaXR0bGUtZW5kaWFuLgotCi1AY2luZGV4IE1JUFMgYXJjaGl0ZWN0dXJlIG9wdGlvbnMKLUBpdGVtIC1taXBzMQotQGl0ZW14IC1taXBzMgotQGl0ZW14IC1taXBzMwotQGl0ZW14IC1taXBzNAotR2VuZXJhdGUgY29kZSBmb3IgYSBwYXJ0aWN1bGFyIE1JUFMgSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSBsZXZlbC4KLUBzYW1wey1taXBzMX0gY29ycmVzcG9uZHMgdG8gdGhlIEBzY3tyMjAwMH0gYW5kIEBzY3tyMzAwMH0gcHJvY2Vzc29ycywKLUBzYW1wey1taXBzMn0gdG8gdGhlIEBzY3tyNjAwMH0gcHJvY2Vzc29yLCBAc2FtcHstbWlwczN9IHRvIHRoZQotQHNje3I0MDAwfSBwcm9jZXNzb3IsIGFuZCBAc2FtcHstbWlwczR9IHRvIHRoZSBAc2N7cjgwMDB9IGFuZAotQHNje3IxMDAwMH0gcHJvY2Vzc29ycy4gIFlvdSBjYW4gYWxzbyBzd2l0Y2ggaW5zdHJ1Y3Rpb24gc2V0cyBkdXJpbmcgdGhlCi1hc3NlbWJseTsgc2VlIEByZWZ7TUlQUyBJU0EsLCBEaXJlY3RpdmVzIHRvIG92ZXJyaWRlIHRoZSBJU0EgbGV2ZWx9LgotCi1AaXRlbSAtbWlwczE2Ci1AaXRlbXggLW5vLW1pcHMxNgotR2VuZXJhdGUgY29kZSBmb3IgdGhlIE1JUFMgMTYgcHJvY2Vzc29yLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHB1dHRpbmcKLUBzYW1wey5zZXQgbWlwczE2fSBhdCB0aGUgc3RhcnQgb2YgdGhlIGFzc2VtYmx5IGZpbGUuICBAc2FtcHstbm8tbWlwczE2fQotdHVybnMgb2ZmIHRoaXMgb3B0aW9uLgotCi1AaXRlbSAtbTQwMTAKLUBpdGVteCAtbm8tbTQwMTAKLUdlbmVyYXRlIGNvZGUgZm9yIHRoZSBMU0kgQHNje3I0MDEwfSBjaGlwLiAgVGhpcyB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvCi1hY2NlcHQgdGhlIEBzY3tyNDAxMH0gc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIChAc2FtcHthZGRjaXV9LCBAc2FtcHtmZmN9LAotZXRjLiksIGFuZCB0byBub3Qgc2NoZWR1bGUgQHNhbXB7bm9wfSBpbnN0cnVjdGlvbnMgYXJvdW5kIGFjY2Vzc2VzIHRvCi10aGUgQHNhbXB7SEl9IGFuZCBAc2FtcHtMT30gcmVnaXN0ZXJzLiAgQHNhbXB7LW5vLW00MDEwfSB0dXJucyBvZmYgdGhpcwotb3B0aW9uLgotCi1AaXRlbSAtbTQ2NTAKLUBpdGVteCAtbm8tbTQ2NTAKLUdlbmVyYXRlIGNvZGUgZm9yIHRoZSBNSVBTIEBzY3tyNDY1MH0gY2hpcC4gIFRoaXMgdGVsbHMgdGhlIGFzc2VtYmxlciB0byBhY2NlcHQKLXRoZSBAc2FtcHttYWR9IGFuZCBAc2FtcHttYWR1fSBpbnN0cnVjdGlvbiwgYW5kIHRvIG5vdCBzY2hlZHVsZSBAc2FtcHtub3B9Ci1pbnN0cnVjdGlvbnMgYXJvdW5kIGFjY2Vzc2VzIHRvIHRoZSBAc2FtcHtISX0gYW5kIEBzYW1we0xPfSByZWdpc3RlcnMuCi1Ac2FtcHstbm8tbTQ2NTB9IHR1cm5zIG9mZiB0aGlzIG9wdGlvbi4KLQotQGl0ZW14IC1tMzkwMAotQGl0ZW14IC1uby1tMzkwMAotQGl0ZW14IC1tNDEwMAotQGl0ZW14IC1uby1tNDEwMAotRm9yIGVhY2ggb3B0aW9uIEBzYW1wey1tQHZhcntubm5ufX0sIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBNSVBTCi1Ac2N7ckB2YXJ7bm5ubn19IGNoaXAuICBUaGlzIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0IGluc3RydWN0aW9ucwotc3BlY2lmaWMgdG8gdGhhdCBjaGlwLCBhbmQgdG8gc2NoZWR1bGUgZm9yIHRoYXQgY2hpcCdzIGhhemFyZHMuCi0KLUBpdGVtIC1tY3B1PUB2YXJ7Y3B1fQotR2VuZXJhdGUgY29kZSBmb3IgYSBwYXJ0aWN1bGFyIE1JUFMgY3B1LiAgSXQgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvCi1Ac2FtcHstbUB2YXJ7Y3B1fX0sIGV4Y2VwdCB0aGF0IHRoZXJlIGFyZSBtb3JlIHZhbHVlIG9mIEB2YXJ7Y3B1fQotdW5kZXJzdG9vZC4gIFZhbGlkIEB2YXJ7Y3B1fSB2YWx1ZSBhcmU6Ci0KLUBxdW90YXRpb24KLTIwMDAsCi0zMDAwLAotMzkwMCwKLTQwMDAsCi00MDEwLAotNDEwMCwKLTQxMTEsCi00MzAwLAotNDQwMCwKLTQ2MDAsCi00NjUwLAotNTAwMCwKLTYwMDAsCi04MDAwLAotMTAwMDAKLUBlbmQgcXVvdGF0aW9uCi0KLQotQGNpbmRleCBAY29kZXstbm9jcHB9IGlnbm9yZWQgKE1JUFMpCi1AaXRlbSAtbm9jcHAKLVRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuICBJdCBpcyBhY2NlcHRlZCBmb3IgY29tbWFuZC1saW5lIGNvbXBhdGliaWxpdHkgd2l0aAotb3RoZXIgYXNzZW1ibGVycywgd2hpY2ggdXNlIGl0IHRvIHR1cm4gb2ZmIEMgc3R5bGUgcHJlcHJvY2Vzc2luZy4gIFdpdGgKLUBzY3tnbnV9IEBjb2Rle0B2YWx1ZXtBU319LCB0aGVyZSBpcyBubyBuZWVkIGZvciBAc2FtcHstbm9jcHB9LCBiZWNhdXNlIHRoZQotQHNje2dudX0gYXNzZW1ibGVyIGl0c2VsZiBuZXZlciBydW5zIHRoZSBDIHByZXByb2Nlc3Nvci4KLQotQGl0ZW0gLS10cmFwCi1AaXRlbXggLS1uby1icmVhawotQGMgRklYTUUhICAoMSkgcmVmbGVjdCB0aGVzZSBvcHRpb25zIChuZXh0IGl0ZW0gdG9vKSBpbiBvcHRpb24gc3VtbWFyaWVzOwotQGMgICAgICAgICAoMikgc3RvcCB0ZWFzaW5nLCBzYXkgX3doaWNoXyBpbnN0cnVjdGlvbnMgZXhwYW5kZWQgX2hvd18uCi1AY29kZXtAdmFsdWV7QVN9fSBhdXRvbWF0aWNhbGx5IG1hY3JvIGV4cGFuZHMgY2VydGFpbiBkaXZpc2lvbiBhbmQKLW11bHRpcGxpY2F0aW9uIGluc3RydWN0aW9ucyB0byBjaGVjayBmb3Igb3ZlcmZsb3cgYW5kIGRpdmlzaW9uIGJ5IHplcm8uICBUaGlzCi1vcHRpb24gY2F1c2VzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGdlbmVyYXRlIGNvZGUgdG8gdGFrZSBhIHRyYXAgZXhjZXB0aW9uCi1yYXRoZXIgdGhhbiBhIGJyZWFrIGV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIGlzIGRldGVjdGVkLiAgVGhlIHRyYXAgaW5zdHJ1Y3Rpb25zCi1hcmUgb25seSBzdXBwb3J0ZWQgYXQgSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSBsZXZlbCAyIGFuZCBoaWdoZXIuCi0KLUBpdGVtIC0tYnJlYWsKLUBpdGVteCAtLW5vLXRyYXAKLUdlbmVyYXRlIGNvZGUgdG8gdGFrZSBhIGJyZWFrIGV4Y2VwdGlvbiByYXRoZXIgdGhhbiBhIHRyYXAgZXhjZXB0aW9uIHdoZW4gYW4KLWVycm9yIGlzIGRldGVjdGVkLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KLUBlbmQgdGFibGUKLQotQG5vZGUgTUlQUyBPYmplY3QKLUBzZWN0aW9uIE1JUFMgRUNPRkYgb2JqZWN0IGNvZGUKLQotQGNpbmRleCBFQ09GRiBzZWN0aW9ucwotQGNpbmRleCBNSVBTIEVDT0ZGIHNlY3Rpb25zCi1Bc3NlbWJsaW5nIGZvciBhIEBzY3ttaXBzfSBAc2N7ZWNvZmZ9IHRhcmdldCBzdXBwb3J0cyBzb21lIGFkZGl0aW9uYWwgc2VjdGlvbnMKLWJlc2lkZXMgdGhlIHVzdWFsIEBjb2Rley50ZXh0fSwgQGNvZGV7LmRhdGF9IGFuZCBAY29kZXsuYnNzfS4gIFRoZQotYWRkaXRpb25hbCBzZWN0aW9ucyBhcmUgQGNvZGV7LnJkYXRhfSwgdXNlZCBmb3IgcmVhZC1vbmx5IGRhdGEsCi1AY29kZXsuc2RhdGF9LCB1c2VkIGZvciBzbWFsbCBkYXRhLCBhbmQgQGNvZGV7LnNic3N9LCB1c2VkIGZvciBzbWFsbAotY29tbW9uIG9iamVjdHMuCi0KLUBjaW5kZXggc21hbGwgb2JqZWN0cywgTUlQUyBFQ09GRgotQGNpbmRleCBAY29kZXtncH0gcmVnaXN0ZXIsIE1JUFMKLVdoZW4gYXNzZW1ibGluZyBmb3IgQHNje2Vjb2ZmfSwgdGhlIGFzc2VtYmxlciB1c2VzIHRoZSBAY29kZXskZ3B9IChAY29kZXskMjh9KQotcmVnaXN0ZXIgdG8gZm9ybSB0aGUgYWRkcmVzcyBvZiBhIGBgc21hbGwgb2JqZWN0JycuICBBbnkgb2JqZWN0IGluIHRoZQotQGNvZGV7LnNkYXRhfSBvciBAY29kZXsuc2Jzc30gc2VjdGlvbnMgaXMgY29uc2lkZXJlZCBgYHNtYWxsJycgaW4gdGhpcyBzZW5zZS4KLUZvciBleHRlcm5hbCBvYmplY3RzLCBvciBmb3Igb2JqZWN0cyBpbiB0aGUgQGNvZGV7LmJzc30gc2VjdGlvbiwgeW91IGNhbiB1c2UKLXRoZSBAY29kZXtAdmFsdWV7R0NDfX0gQHNhbXB7LUd9IG9wdGlvbiB0byBjb250cm9sIHRoZSBzaXplIG9mIG9iamVjdHMgYWRkcmVzc2VkIHZpYQotQGNvZGV7JGdwfTsgdGhlIGRlZmF1bHQgdmFsdWUgaXMgOCwgbWVhbmluZyB0aGF0IGEgcmVmZXJlbmNlIHRvIGFueSBvYmplY3QKLWVpZ2h0IGJ5dGVzIG9yIHNtYWxsZXIgdXNlcyBAY29kZXskZ3B9LiAgUGFzc2luZyBAc2FtcHstRyAwfSB0bwotQGNvZGV7QHZhbHVle0FTfX0gcHJldmVudHMgaXQgZnJvbSB1c2luZyB0aGUgQGNvZGV7JGdwfSByZWdpc3RlciBvbiB0aGUgYmFzaXMKLW9mIG9iamVjdCBzaXplIChidXQgdGhlIGFzc2VtYmxlciB1c2VzIEBjb2RleyRncH0gZm9yIG9iamVjdHMgaW4gQGNvZGV7LnNkYXRhfQotb3IgQGNvZGV7c2Jzc30gaW4gYW55IGNhc2UpLiAgVGhlIHNpemUgb2YgYW4gb2JqZWN0IGluIHRoZSBAY29kZXsuYnNzfSBzZWN0aW9uCi1pcyBzZXQgYnkgdGhlIEBjb2Rley5jb21tfSBvciBAY29kZXsubGNvbW19IGRpcmVjdGl2ZSB0aGF0IGRlZmluZXMgaXQuICBUaGUKLXNpemUgb2YgYW4gZXh0ZXJuYWwgb2JqZWN0IG1heSBiZSBzZXQgd2l0aCB0aGUgQGNvZGV7LmV4dGVybn0gZGlyZWN0aXZlLiAgRm9yCi1leGFtcGxlLCBAc2FtcHsuZXh0ZXJuIHN5bSw0fSBkZWNsYXJlcyB0aGF0IHRoZSBvYmplY3QgYXQgQGNvZGV7c3ltfSBpcyA0IGJ5dGVzCi1pbiBsZW5ndGgsIHdoaWUgbGVhdmluZyBAY29kZXtzeW19IG90aGVyd2lzZSB1bmRlZmluZWQuCi0KLVVzaW5nIHNtYWxsIEBzY3tlY29mZn0gb2JqZWN0cyByZXF1aXJlcyBsaW5rZXIgc3VwcG9ydCwgYW5kIGFzc3VtZXMgdGhhdCB0aGUKLUBjb2RleyRncH0gcmVnaXN0ZXIgaXMgY29ycmVjdGx5IGluaXRpYWxpemVkIChub3JtYWxseSBkb25lIGF1dG9tYXRpY2FsbHkgYnkKLXRoZSBzdGFydHVwIGNvZGUpLiAgQHNje21pcHN9IEBzY3tlY29mZn0gYXNzZW1ibHkgY29kZSBtdXN0IG5vdCBtb2RpZnkgdGhlCi1AY29kZXskZ3B9IHJlZ2lzdGVyLgotCi1Abm9kZSBNSVBTIFN0YWJzCi1Ac2VjdGlvbiBEaXJlY3RpdmVzIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLQotQGNpbmRleCBNSVBTIGRlYnVnZ2luZyBkaXJlY3RpdmVzCi1Ac2N7bWlwc30gQHNje2Vjb2ZmfSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBzZXZlcmFsIGRpcmVjdGl2ZXMgdXNlZCBmb3IKLWdlbmVyYXRpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWNoIGFyZSBub3Qgc3VwcG9ydCBieSB0cmFkaXRpb25hbCBAc2N7bWlwc30KLWFzc2VtYmxlcnMuICBUaGVzZSBhcmUgQGNvZGV7LmRlZn0sIEBjb2Rley5lbmRlZn0sIEBjb2Rley5kaW19LCBAY29kZXsuZmlsZX0sCi1AY29kZXsuc2NsfSwgQGNvZGV7LnNpemV9LCBAY29kZXsudGFnfSwgQGNvZGV7LnR5cGV9LCBAY29kZXsudmFsfSwKLUBjb2Rley5zdGFiZH0sIEBjb2Rley5zdGFibn0sIGFuZCBAY29kZXsuc3RhYnN9LiAgVGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotZ2VuZXJhdGVkIGJ5IHRoZSB0aHJlZSBAY29kZXsuc3RhYn0gZGlyZWN0aXZlcyBjYW4gb25seSBiZSByZWFkIGJ5IEBzY3tnZGJ9LAotbm90IGJ5IHRyYWRpdGlvbmFsIEBzY3ttaXBzfSBkZWJ1Z2dlcnMgKHRoaXMgZW5oYW5jZW1lbnQgaXMgcmVxdWlyZWQgdG8gZnVsbHkKLXN1cHBvcnQgQysrIGRlYnVnZ2luZykuICBUaGVzZSBkaXJlY3RpdmVzIGFyZSBwcmltYXJpbHkgdXNlZCBieSBjb21waWxlcnMsIG5vdAotYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbW1lcnMhCi0KLUBub2RlIE1JUFMgSVNBCi1Ac2VjdGlvbiBEaXJlY3RpdmVzIHRvIG92ZXJyaWRlIHRoZSBJU0EgbGV2ZWwKLQotQGNpbmRleCBNSVBTIElTQSBvdmVycmlkZQotQGtpbmRleCBAY29kZXsuc2V0IG1pcHNAdmFye259fQotQHNje2dudX0gQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgYW4gYWRkaXRpb25hbCBkaXJlY3RpdmUgdG8gY2hhbmdlCi10aGUgQHNje21pcHN9IEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUgbGV2ZWwgb24gdGhlIGZseTogQGNvZGV7LnNldAotbWlwc0B2YXJ7bn19LiAgQHZhcntufSBzaG91bGQgYmUgYSBudW1iZXIgZnJvbSAwIHRvIDQuICBBIHZhbHVlIGZyb20gMQotdG8gNCBtYWtlcyB0aGUgYXNzZW1ibGVyIGFjY2VwdCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBjb3JyZXNwb25kaW5nCi1Ac2N7aXNhfSBsZXZlbCwgZnJvbSB0aGF0IHBvaW50IG9uIGluIHRoZSBhc3NlbWJseS4gIEBjb2Rley5zZXQKLW1pcHNAdmFye259fSBhZmZlY3RzIG5vdCBvbmx5IHdoaWNoIGluc3RydWN0aW9ucyBhcmUgcGVybWl0dGVkLCBidXQgYWxzbwotaG93IGNlcnRhaW4gbWFjcm9zIGFyZSBleHBhbmRlZC4gIEBjb2Rley5zZXQgbWlwczB9IHJlc3RvcmVzIHRoZQotQHNje2lzYX0gbGV2ZWwgdG8gaXRzIG9yaWdpbmFsIGxldmVsOiBlaXRoZXIgdGhlIGxldmVsIHlvdSBzZWxlY3RlZCB3aXRoCi1jb21tYW5kIGxpbmUgb3B0aW9ucywgb3IgdGhlIGRlZmF1bHQgZm9yIHlvdXIgY29uZmlndXJhdGlvbi4gIFlvdSBjYW4KLXVzZSB0aGlzIGZlYXR1cmUgdG8gcGVybWl0IHNwZWNpZmljIEBzY3tyNDAwMH0gaW5zdHJ1Y3Rpb25zIHdoaWxlCi1hc3NlbWJsaW5nIGluIDMyIGJpdCBtb2RlLiAgVXNlIHRoaXMgZGlyZWN0aXZlIHdpdGggY2FyZSEKLQotVGhlIGRpcmVjdGl2ZSBAc2FtcHsuc2V0IG1pcHMxNn0gcHV0cyB0aGUgYXNzZW1ibGVyIGludG8gTUlQUyAxNiBtb2RlLAotaW4gd2hpY2ggaXQgd2lsbCBhc3NlbWJsZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBNSVBTIDE2IHByb2Nlc3Nvci4gIFVzZQotQHNhbXB7LnNldCBub21pcHMxNn0gdG8gcmV0dXJuIHRvIG5vcm1hbCAzMiBiaXQgbW9kZS4KLQotVHJhZGl0aW9uYWwgQHNje21pcHN9IGFzc2VtYmxlcnMgZG8gbm90IHN1cHBvcnQgdGhpcyBkaXJlY3RpdmUuICAKLQotQG5vZGUgTUlQUyBhdXRvZXh0ZW5kCi1Ac2VjdGlvbiBEaXJlY3RpdmVzIGZvciBleHRlbmRpbmcgTUlQUyAxNiBiaXQgaW5zdHJ1Y3Rpb25zCi0KLUBraW5kZXggQGNvZGV7LnNldCBhdXRvZXh0ZW5kfQotQGtpbmRleCBAY29kZXsuc2V0IG5vYXV0b2V4dGVuZH0KLUJ5IGRlZmF1bHQsIE1JUFMgMTYgaW5zdHJ1Y3Rpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGV4dGVuZGVkIHRvIDMyIGJpdHMKLXdoZW4gbmVjZXNzYXJ5LiAgVGhlIGRpcmVjdGl2ZSBAc2FtcHsuc2V0IG5vYXV0b2V4dGVuZH0gd2lsbCB0dXJuIHRoaXMKLW9mZi4gIFdoZW4gQHNhbXB7LnNldCBub2F1dG9leHRlbmR9IGlzIGluIGVmZmVjdCwgYW55IDMyIGJpdCBpbnN0cnVjdGlvbgotbXVzdCBiZSBleHBsaWNpdGx5IGV4dGVuZGVkIHdpdGggdGhlIEBzYW1wey5lfSBtb2RpZmllciAoZS5nLiwKLUBzYW1we2xpLmUgJDQsMTAwMH0pLiAgVGhlIGRpcmVjdGl2ZSBAc2FtcHsuc2V0IGF1dG9leHRlbmR9IG1heSBiZSB1c2VkCi10byBvbmNlIGFnYWluIGF1dG9tYXRpY2FsbHkgZXh0ZW5kIGluc3RydWN0aW9ucyB3aGVuIG5lY2Vzc2FyeS4KLQotVGhpcyBkaXJlY3RpdmUgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gaW4gTUlQUyAxNiBtb2RlLiAgVHJhZGl0aW9uYWwKLUBzY3ttaXBzfSBhc3NlbWJsZXJzIGRvIG5vdCBzdXBwb3J0IHRoaXMgZGlyZWN0aXZlLgotCi1Abm9kZSBNSVBTIGluc24KLUBzZWN0aW9uIERpcmVjdGl2ZSB0byBtYXJrIGRhdGEgYXMgYW4gaW5zdHJ1Y3Rpb24KLQotQGtpbmRleCBAY29kZXsuaW5zbn0KLVRoZSBAY29kZXsuaW5zbn0gZGlyZWN0aXZlIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRoYXQgdGhlIGZvbGxvd2luZwotZGF0YSBpcyBhY3R1YWxseSBpbnN0cnVjdGlvbnMuICBUaGlzIG1ha2VzIGEgZGlmZmVyZW5jZSBpbiBNSVBTIDE2IG1vZGU6Ci13aGVuIGxvYWRpbmcgdGhlIGFkZHJlc3Mgb2YgYSBsYWJlbCB3aGljaCBwcmVjZWRlcyBpbnN0cnVjdGlvbnMsCi1AY29kZXtAdmFsdWV7QVN9fSBhdXRvbWF0aWNhbGx5IGFkZHMgMSB0byB0aGUgdmFsdWUsIHNvIHRoYXQganVtcGluZyB0bwotdGhlIGxvYWRlZCBhZGRyZXNzIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nLgotCi1Abm9kZSBNSVBTIG9wdGlvbiBzdGFjawotQHNlY3Rpb24gRGlyZWN0aXZlcyB0byBzYXZlIGFuZCByZXN0b3JlIG9wdGlvbnMKLQotQGNpbmRleCBNSVBTIG9wdGlvbiBzdGFjawotQGtpbmRleCBAY29kZXsuc2V0IHB1c2h9Ci1Aa2luZGV4IEBjb2Rley5zZXQgcG9wfQotVGhlIGRpcmVjdGl2ZXMgQGNvZGV7LnNldCBwdXNofSBhbmQgQGNvZGV7LnNldCBwb3B9IG1heSBiZSB1c2VkIHRvIHNhdmUKLWFuZCByZXN0b3JlIHRoZSBjdXJyZW50IHNldHRpbmdzIGZvciBhbGwgdGhlIG9wdGlvbnMgd2hpY2ggYXJlCi1jb250cm9sbGVkIGJ5IEBjb2Rley5zZXR9LiAgVGhlIEBjb2Rley5zZXQgcHVzaH0gZGlyZWN0aXZlIHNhdmVzIHRoZQotY3VycmVudCBzZXR0aW5ncyBvbiBhIHN0YWNrLiAgVGhlIEBjb2Rley5zZXQgcG9wfSBkaXJlY3RpdmUgcG9wcyB0aGUKLXN0YWNrIGFuZCByZXN0b3JlcyB0aGUgc2V0dGluZ3MuCi0KLVRoZXNlIGRpcmVjdGl2ZXMgY2FuIGJlIHVzZWZ1bCBpbnNpZGUgYW4gbWFjcm8gd2hpY2ggbXVzdCBjaGFuZ2UgYW4KLW9wdGlvbiBzdWNoIGFzIHRoZSBJU0EgbGV2ZWwgb3IgaW5zdHJ1Y3Rpb24gcmVvcmRlcmluZyBidXQgZG9lcyBub3Qgd2FudAotdG8gY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgY29kZSB3aGljaCBpbnZva2VkIHRoZSBtYWNyby4KLQotVHJhZGl0aW9uYWwgQHNje21pcHN9IGFzc2VtYmxlcnMgZG8gbm90IHN1cHBvcnQgdGhlc2UgZGlyZWN0aXZlcy4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1uczMyay50ZXhpIGIvZ2FzL2RvYy9jLW5zMzJrLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YzYxZDkuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLW5zMzJrLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AYyAgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi0KLUBpZ25vcmUKLUBjIEZJWE1FISAgU3RvcCBpZ25vcmluZyB3aGVuIGZpbGxlZCBpbi4KLUBub2RlIDMyeDMyCi1AY2hhcHRlciAzMngzMgotCi1Ac2VjdGlvbiBPcHRpb25zCi1UaGUgMzJ4MzIgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIGEgQHNhbXB7LW0zMjAzMn0gb3B0aW9uIHRvCi1zcGVjaWZ5IHRoaWF0IGl0IGlzIGNvbXBpbGluZyBmb3IgYSAzMjAzMiBwcm9jZXNzb3IsIG9yIGEKLUBzYW1wey1tMzI1MzJ9IHRvIHNwZWNpZnkgdGhhdCBpdCBpcyBjb21waWxpbmcgZm9yIGEgMzI1MzIgb3B0aW9uLgotVGhlIGRlZmF1bHQgKGlmIG5laXRoZXIgaXMgc3BlY2lmaWVkKSBpcyBjaG9zZW4gd2hlbiB0aGUgYXNzZW1ibGVyCi1pcyBjb21waWxlZC4KLQotQHNlY3Rpb24gU3ludGF4Ci1JIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIDMyeDMyIHN5bnRheCBhc3NlbWJsZWQgYnkKLUBjb2Rle0B2YWx1ZXtBU319LiAgU29tZW9uZSB3aG8gdW5kZXJzYW5kcyB0aGUgcHJvY2Vzc29yIChJJ3ZlIG5ldmVyIHNlZW4KLW9uZSkgYW5kIHRoZSBwb3NzaWJsZSBzeW50YXhlcyBzaG91bGQgd3JpdGUgdGhpcyBzZWN0aW9uLgotCi1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotVGhlIDMyeDMyIHVzZXMgQHNje2llZWV9IGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGJ1dCBAY29kZXtAdmFsdWV7QVN9fQotb25seSBjcmVhdGVzIHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIHZhbHVlcy4gIEkgZG9uJ3Qga25vdyBpZiB0aGUKLTMyeDMyIHVuZGVyc3RhbmRzIGV4dGVuZGVkIHByZWNpc2lvbiBudW1iZXJzLgotCi1Ac2VjdGlvbiAzMngzMiBNYWNoaW5lIERpcmVjdGl2ZXMKLVRoZSAzMngzMiBoYXMgbm8gbWFjaGluZSBkZXBlbmRlbnQgZGlyZWN0aXZlcy4KLQotQGVuZCBpZ25vcmUKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1wai50ZXhpIGIvZ2FzL2RvYy9jLXBqLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNjAwMTUuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXBqLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBwYWdlCi1Abm9kZSBQSi1EZXBlbmRlbnQKLUBjaGFwdGVyIHBpY29KYXZhIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IFBKIHN1cHBvcnQKLUBtZW51Ci0qIFBKIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIFBKIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBQSiBvcHRpb25zCi1AY2luZGV4IG9wdGlvbnMsIFBKCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgdHdvIGFkZGlpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgcGljb0phdmEKLWFyY2hpdGVjdHVyZS4KLUB0YWJsZSBAY29kZQotQGl0ZW0gLW1sCi1UaGlzIG9wdGlvbiBzZWxlY3RzIGxpdHRsZSBlbmRpYW4gZGF0YSBvdXRwdXQuCi0KLUBpdGVtIC1tYgotVGhpcyBvcHRpb24gc2VsZWN0cyBiaWcgZW5kaWFuIGRhdGEgb3V0cHV0LgotQGVuZCB0YWJsZQotCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1zaC50ZXhpIGIvZ2FzL2RvYy9jLXNoLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMGY1NTQuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXNoLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQHBhZ2UKLUBub2RlIFNILURlcGVuZGVudAotQGNoYXB0ZXIgSGl0YWNoaSBTSCBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCBTSCBzdXBwb3J0Ci1AbWVudQotKiBTSCBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogU0ggU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogU0ggRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBTSCBEaXJlY3RpdmVzOjogICAgICAgICAgIFNIIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBTSCBPcGNvZGVzOjogICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBTSCBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggU0ggb3B0aW9ucyAobm9uZSkKLUBjaW5kZXggb3B0aW9ucywgU0ggKG5vbmUpCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIEhpdGFjaGkKLVNIIGZhbWlseS4KLQotQG5vZGUgU0ggU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLQotQG1lbnUKLSogU0gtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogU0gtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotKiBTSC1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBTSC1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgU0gKLUBjaW5kZXggU0ggbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7IX0gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBjaW5kZXggbGluZSBzZXBhcmF0b3IsIFNICi1AY2luZGV4IHN0YXRlbWVudCBzZXBhcmF0b3IsIFNICi1AY2luZGV4IFNIIGxpbmUgc2VwYXJhdG9yCi1Zb3UgY2FuIHVzZSBAc2FtcHs7fSBpbnN0ZWFkIG9mIGEgbmV3bGluZSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzLgotCi1AY2luZGV4IHN5bWJvbCBuYW1lcywgQHNhbXB7JH0gaW4KLUBjaW5kZXggQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzCi1TaW5jZSBAc2FtcHskfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLCB5b3UgbWF5IHVzZSBpdCBpbiBzeW1ib2wgbmFtZXMuCi0KLUBub2RlIFNILVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggU0ggcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVycywgU0gKLVlvdSBjYW4gdXNlIHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgQHNhbXB7cjB9LCBAc2FtcHtyMX0sIEBzYW1we3IyfSwKLUBzYW1we3IzfSwgQHNhbXB7cjR9LCBAc2FtcHtyNX0sIEBzYW1we3I2fSwgQHNhbXB7cjd9LCBAc2FtcHtyOH0sCi1Ac2FtcHtyOX0sIEBzYW1we3IxMH0sIEBzYW1we3IxMX0sIEBzYW1we3IxMn0sIEBzYW1we3IxM30sIEBzYW1we3IxNH0sCi1hbmQgQHNhbXB7cjE1fSB0byByZWZlciB0byB0aGUgU0ggcmVnaXN0ZXJzLgotCi1UaGUgU0ggYWxzbyBoYXMgdGhlc2UgY29udHJvbCByZWdpc3RlcnM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gcHIKLXByb2NlZHVyZSByZWdpc3RlciAoaG9sZHMgcmV0dXJuIGFkZHJlc3MpCi0KLUBpdGVtIHBjCi1wcm9ncmFtIGNvdW50ZXIKLQotQGl0ZW0gbWFjaAotQGl0ZW14IG1hY2wKLWhpZ2ggYW5kIGxvdyBtdWx0aXBseSBhY2N1bXVsYXRvciByZWdpc3RlcnMKLQotQGl0ZW0gc3IKLXN0YXR1cyByZWdpc3RlcgotCi1AaXRlbSBnYnIKLWdsb2JhbCBiYXNlIHJlZ2lzdGVyCi0KLUBpdGVtIHZicgotdmVjdG9yIGJhc2UgcmVnaXN0ZXIgKGZvciBpbnRlcnJ1cHQgdmVjdG9ycykKLUBlbmQgdGFibGUKLQotQG5vZGUgU0gtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIFNICi1AY2luZGV4IFNIIGFkZHJlc3NpbmcgbW9kZXMKLUBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIFNILgotQGNvZGV7UkB2YXJ7bn19IGluIHRoZSBmb2xsb3dpbmcgcmVmZXJzIHRvIGFueSBvZiB0aGUgbnVtYmVyZWQKLXJlZ2lzdGVycywgYnV0IEBlbXBoe25vdH0gdGhlIGNvbnRyb2wgcmVnaXN0ZXJzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFJAdmFye259Ci1SZWdpc3RlciBkaXJlY3QKLQotQGl0ZW0gQEBSQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3QKLQotQGl0ZW0gQEAtUkB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlLWRlY3JlbWVudAotCi1AaXRlbSBAQFJAdmFye259KwotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWluY3JlbWVudAotCi1AaXRlbSBAQChAdmFye2Rpc3B9LCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci0KLUBpdGVtIEBAKFIwLCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGV4ZWQKLQotQGl0ZW0gQEAoQHZhcntkaXNwfSwgR0JSKQotQGNvZGV7R0JSfSBvZmZzZXQKLQotQGl0ZW0gQEAoUjAsIEdCUikKLUdCUiBpbmRleGVkCi0KLUBpdGVtIEB2YXJ7YWRkcn0KLUBpdGVteCBAQChAdmFye2Rpc3B9LCBQQykKLVBDIHJlbGF0aXZlIGFkZHJlc3MgKGZvciBicmFuY2ggb3IgZm9yIGFkZHJlc3NpbmcgbWVtb3J5KS4gIFRoZQotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50YXRpb24gYWxsb3dzIHlvdSB0byB1c2UgdGhlIHNpbXBsZXIgZm9ybQotQHZhcnthZGRyfSBhbnl3aGVyZSBhIFBDIHJlbGF0aXZlIGFkZHJlc3MgaXMgY2FsbGVkIGZvcjsgdGhlIGFsdGVybmF0ZQotZm9ybSBpcyBzdXBwb3J0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBhc3NlbWJsZXJzLgotCi1AaXRlbSAjQHZhcntpbW19Ci1JbW1lZGlhdGUgZGF0YQotQGVuZCB0YWJsZQotCi1Abm9kZSBTSCBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgU0ggKEBzY3tpZWVlfSkKLUBjaW5kZXggU0ggZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBTSCBmYW1pbHkgaGFzIG5vIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgdGhlIEBjb2Rley5mbG9hdH0KLWRpcmVjdGl2ZSBnZW5lcmF0ZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgZGV2ZWxvcG1lbnQgdG9vbHMuCi0KLUBub2RlIFNIIERpcmVjdGl2ZXMKLUBzZWN0aW9uIFNIIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IFNIIG1hY2hpbmUgZGlyZWN0aXZlcwotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIFNICi1AY2luZGV4IEBjb2Rle3Vhd29yZH0gZGlyZWN0aXZlLCBTSAotQGNpbmRleCBAY29kZXt1YWxvbmd9IGRpcmVjdGl2ZSwgU0gKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSB1YXdvcmQKLUBpdGVteCB1YWxvbmcKLUBjb2Rle0B2YWx1ZXtBU319IHdpbGwgaXNzdWUgYSB3YXJuaW5nIHdoZW4gYSBtaXNhbGlnbmVkIEBjb2Rley53b3JkfSBvcgotQGNvZGV7Lmxvbmd9IGRpcmVjdGl2ZSBpcyB1c2VkLiAgWW91IG1heSB1c2UgQGNvZGV7LnVhd29yZH0gb3IKLUBjb2Rley51YWxvbmd9IHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIGlzIGludGVudGlvbmFsbHkgbWlzYWxpZ25lZC4KLUBlbmQgdGFibGUKLQotQG5vZGUgU0ggT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IFNIIG9wY29kZSBzdW1tYXJ5Ci1AY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBTSAotQGNpbmRleCBtbmVtb25pY3MsIFNICi1AY2luZGV4IGluc3RydWN0aW9uIHN1bW1hcnksIFNICi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIFNIIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle1NILU1pY3JvY29tcHV0ZXIgVXNlcidzIE1hbnVhbH0gKEhpdGFjaGkgTWljcm8gU3lzdGVtcywgSW5jLikuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBTSCBvcGNvZGVzLiAgTm8gYWRkaXRpb25hbAotcHNldWRvLWluc3RydWN0aW9ucyBhcmUgbmVlZGVkIG9uIHRoaXMgZmFtaWx5LiAgTm90ZSwgaG93ZXZlciwgdGhhdAotYmVjYXVzZSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBhIHNpbXBsZXIgZm9ybSBvZiBQQy1yZWxhdGl2ZQotYWRkcmVzc2luZywgeW91IG1heSBzaW1wbHkgd3JpdGUgKGZvciBleGFtcGxlKQotCi1AZXhhbXBsZQotbW92LmwgIGJhcixyMAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd2hlcmUgb3RoZXIgYXNzZW1ibGVycyBtaWdodCByZXF1aXJlIGFuIGV4cGxpY2l0IGRpc3BsYWNlbWVudCB0bwotQGNvZGV7YmFyfSBmcm9tIHRoZSBwcm9ncmFtIGNvdW50ZXI6Ci0KLUBleGFtcGxlCi1tb3YubCAgQEAoQHZhcntkaXNwfSwgUEMpCi1AZW5kIGV4YW1wbGUKLQotQGlmc2V0IFNNQUxMCi1AYyB0aGlzIHRhYmxlLCBkdWUgdG8gdGhlIG11bHRpLWNvbCBmYWtpbmcgYW5kIGhhcmRjb2RlZCBvcmRlciwgbG9va3Mgc2lsbHkKLUBjIGV4Y2VwdCBpbiBzbWFsbGJvb2suICBTZWUgY29tbWVudHMgYmVsb3cgIkBzZXQgU01BTEwiIG5lYXIgdG9wIG9mIHRoaXMgZmlsZS4KLQotSGVyZSBpcyBhIHN1bW1hcnkgb2YgU0ggb3Bjb2RlczoKLQotQHBhZ2UKLUBzbWFsbGV4YW1wbGUKLUBpe0xlZ2VuZDp9Ci1SbiAgICAgICAgQHJ7YSBudW1iZXJlZCByZWdpc3Rlcn0KLVJtICAgICAgICBAcnthbm90aGVyIG51bWJlcmVkIHJlZ2lzdGVyfQotI2ltbSAgICAgIEBye2ltbWVkaWF0ZSBkYXRhfQotZGlzcCAgICAgIEBye2Rpc3BsYWNlbWVudH0KLWRpc3A4ICAgICBAcns4LWJpdCBkaXNwbGFjZW1lbnR9Ci1kaXNwMTIgICAgQHJ7MTItYml0IGRpc3BsYWNlbWVudH0KLQotYWRkICNpbW0sUm4gICAgICAgICAgICAgICAgICAgIGxkcy5sIEBAUm4rLFBSICAgICAgICAgICAgICAKLWFkZCBSbSxSbiAgICAgICAgICAgICAgICAgICAgICBtYWMudyBAQFJtKyxAQFJuKyAgICAgICAgICAgCi1hZGRjIFJtLFJuICAgICAgICAgICAgICAgICAgICAgbW92ICNpbW0sUm4gICAgICAgICAgICAgICAgIAotYWRkdiBSbSxSbiAgICAgICAgICAgICAgICAgICAgIG1vdiBSbSxSbiAgICAgICAgICAgICAgICAgICAKLWFuZCAjaW1tLFIwICAgICAgICAgICAgICAgICAgICBtb3YuYiBSbSxAQChSMCxSbikgICAgICAgICAgCi1hbmQgUm0sUm4gICAgICAgICAgICAgICAgICAgICAgbW92LmIgUm0sQEAtUm4gICAgICAgICAgICAgIAotYW5kLmIgI2ltbSxAQChSMCxHQlIpICAgICAgICAgICBtb3YuYiBSbSxAQFJuICAgICAgICAgICAgICAgCi1iZiBkaXNwOCAgICAgICAgICAgICAgICAgICAgICAgbW92LmIgQEAoZGlzcCxSbSksUjAgICAgICAgIAotYnJhIGRpc3AxMiAgICAgICAgICAgICAgICAgICAgIG1vdi5iIEBAKGRpc3AsR0JSKSxSMCAgICAgICAKLWJzciBkaXNwMTIgICAgICAgICAgICAgICAgICAgICBtb3YuYiBAQChSMCxSbSksUm4gICAgICAgICAgCi1idCBkaXNwOCAgICAgICAgICAgICAgICAgICAgICAgbW92LmIgQEBSbSssUm4gICAgICAgICAgICAgIAotY2xybWFjICAgICAgICAgICAgICAgICAgICAgICAgIG1vdi5iIEBAUm0sUm4gICAgICAgICAgICAgICAKLWNscnQgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3YuYiBSMCxAQChkaXNwLFJtKSAgICAgICAgCi1jbXAvZXEgI2ltbSxSMCAgICAgICAgICAgICAgICAgbW92LmIgUjAsQEAoZGlzcCxHQlIpICAgICAgIAotY21wL2VxIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi5sIFJtLEBAKGRpc3AsUm4pICAgICAgICAKLWNtcC9nZSBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YubCBSbSxAQChSMCxSbikgICAgICAgICAgCi1jbXAvZ3QgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LmwgUm0sQEAtUm4gICAgICAgICAgICAgIAotY21wL2hpIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi5sIFJtLEBAUm4gICAgICAgICAgICAgICAKLWNtcC9ocyBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YubCBAQChkaXNwLFJuKSxSbSAgICAgICAgCi1jbXAvcGwgUm4gICAgICAgICAgICAgICAgICAgICAgbW92LmwgQEAoZGlzcCxHQlIpLFIwICAgICAgIAotY21wL3B6IFJuICAgICAgICAgICAgICAgICAgICAgIG1vdi5sIEBAKGRpc3AsUEMpLFJuICAgICAgICAKLWNtcC9zdHIgUm0sUm4gICAgICAgICAgICAgICAgICBtb3YubCBAQChSMCxSbSksUm4gICAgICAgICAgCi1kaXYwcyBSbSxSbiAgICAgICAgICAgICAgICAgICAgbW92LmwgQEBSbSssUm4gICAgICAgICAgICAgIAotZGl2MHUgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdi5sIEBAUm0sUm4gICAgICAgICAgICAgICAKLWRpdjEgUm0sUm4gICAgICAgICAgICAgICAgICAgICBtb3YubCBSMCxAQChkaXNwLEdCUikgICAgICAgCi1leHRzLmIgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LncgUm0sQEAoUjAsUm4pICAgICAgICAgIAotZXh0cy53IFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi53IFJtLEBALVJuICAgICAgICAgICAgICAKLWV4dHUuYiBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YudyBSbSxAQFJuICAgICAgICAgICAgICAgCi1leHR1LncgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LncgQEAoZGlzcCxSbSksUjAgICAgICAgIAotam1wIEBAUm4gICAgICAgICAgICAgICAgICAgICAgICBtb3YudyBAQChkaXNwLEdCUiksUjAgICAgICAgCi1qc3IgQEBSbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdi53IEBAKGRpc3AsUEMpLFJuICAgICAgICAKLWxkYyBSbixHQlIgICAgICAgICAgICAgICAgICAgICBtb3YudyBAQChSMCxSbSksUm4gICAgICAgICAgCi1sZGMgUm4sU1IgICAgICAgICAgICAgICAgICAgICAgbW92LncgQEBSbSssUm4gICAgICAgICAgICAgIAotbGRjIFJuLFZCUiAgICAgICAgICAgICAgICAgICAgIG1vdi53IEBAUm0sUm4gICAgICAgICAgICAgICAKLWxkYy5sIEBAUm4rLEdCUiAgICAgICAgICAgICAgICAgbW92LncgUjAsQEAoZGlzcCxSbSkgICAgICAgIAotbGRjLmwgQEBSbissU1IgICAgICAgICAgICAgICAgICBtb3YudyBSMCxAQChkaXNwLEdCUikgICAgICAgCi1sZGMubCBAQFJuKyxWQlIgICAgICAgICAgICAgICAgIG1vdmEgQEAoZGlzcCxQQyksUjAgICAgICAgICAKLWxkcyBSbixNQUNIICAgICAgICAgICAgICAgICAgICBtb3Z0IFJuICAgICAgICAgICAgICAgICAgICAgCi1sZHMgUm4sTUFDTCAgICAgICAgICAgICAgICAgICAgbXVscyBSbSxSbiAgICAgICAgICAgICAgICAgIAotbGRzIFJuLFBSICAgICAgICAgICAgICAgICAgICAgIG11bHUgUm0sUm4gICAgICAgICAgICAgICAgICAKLWxkcy5sIEBAUm4rLE1BQ0ggICAgICAgICAgICAgICAgbmVnIFJtLFJuICAgICAgICAgICAgICAgICAgIAotbGRzLmwgQEBSbissTUFDTCAgICAgICAgICAgICAgICBuZWdjIFJtLFJuICAgICAgICAgICAgICAgICAgCi1AcGFnZQotbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YyBWQlIsUm4gICAgICAgICAgICAgICAgCi1ub3QgUm0sUm4gICAgICAgICAgICAgICAgICAgICAgc3RjLmwgR0JSLEBALVJuICAgICAgICAgICAKLW9yICNpbW0sUjAgICAgICAgICAgICAgICAgICAgICBzdGMubCBTUixAQC1SbiAgICAgICAgICAgIAotb3IgUm0sUm4gICAgICAgICAgICAgICAgICAgICAgIHN0Yy5sIFZCUixAQC1SbiAgICAgICAgICAgCi1vci5iICNpbW0sQEAoUjAsR0JSKSAgICAgICAgICAgIHN0cyBNQUNILFJuICAgICAgICAgICAgICAgCi1yb3RjbCBSbiAgICAgICAgICAgICAgICAgICAgICAgc3RzIE1BQ0wsUm4gICAgICAgICAgICAgICAKLXJvdGNyIFJuICAgICAgICAgICAgICAgICAgICAgICBzdHMgUFIsUm4gICAgICAgICAgICAgICAgIAotcm90bCBSbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cy5sIE1BQ0gsQEAtUm4gICAgICAgICAgCi1yb3RyIFJuICAgICAgICAgICAgICAgICAgICAgICAgc3RzLmwgTUFDTCxAQC1SbiAgICAgICAgICAKLXJ0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHMubCBQUixAQC1SbiAgICAgICAgICAgIAotcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiBSbSxSbiAgICAgICAgICAgICAgICAgCi1zZXR0ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViYyBSbSxSbiAgICAgICAgICAgICAgICAKLXNoYWwgUm4gICAgICAgICAgICAgICAgICAgICAgICBzdWJ2IFJtLFJuICAgICAgICAgICAgICAgIAotc2hhciBSbiAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAuYiBSbSxSbiAgICAgICAgICAgICAgCi1zaGxsIFJuICAgICAgICAgICAgICAgICAgICAgICAgc3dhcC53IFJtLFJuICAgICAgICAgICAgICAKLXNobGwxNiBSbiAgICAgICAgICAgICAgICAgICAgICB0YXMuYiBAQFJuICAgICAgICAgICAgICAgIAotc2hsbDIgUm4gICAgICAgICAgICAgICAgICAgICAgIHRyYXBhICNpbW0gICAgICAgICAgICAgICAgCi1zaGxsOCBSbiAgICAgICAgICAgICAgICAgICAgICAgdHN0ICNpbW0sUjAgICAgICAgICAgICAgICAKLXNobHIgUm4gICAgICAgICAgICAgICAgICAgICAgICB0c3QgUm0sUm4gICAgICAgICAgICAgICAgIAotc2hscjE2IFJuICAgICAgICAgICAgICAgICAgICAgIHRzdC5iICNpbW0sQEAoUjAsR0JSKSAgICAgCi1zaGxyMiBSbiAgICAgICAgICAgICAgICAgICAgICAgeG9yICNpbW0sUjAgICAgICAgICAgICAgICAKLXNobHI4IFJuICAgICAgICAgICAgICAgICAgICAgICB4b3IgUm0sUm4gICAgICAgICAgICAgICAgIAotc2xlZXAgICAgICAgICAgICAgICAgICAgICAgICAgIHhvci5iICNpbW0sQEAoUjAsR0JSKSAgICAgCi1zdGMgR0JSLFJuICAgICAgICAgICAgICAgICAgICAgeHRyY3QgUm0sUm4gICAgICAgICAgICAgICAKLXN0YyBTUixSbgotQGVuZCBzbWFsbGV4YW1wbGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhpdGFjaGktYWxsCi1AaWZjbGVhciBHRU5FUklDCi1AcmFpc2VzZWN0aW9ucwotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1zcGFyYy50ZXhpIGIvZ2FzL2RvYy9jLXNwYXJjLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNTRlYjIuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXNwYXJjLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIFNwYXJjLURlcGVuZGVudAotQGNoYXB0ZXIgU1BBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgU1BBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBTUEFSQyBzdXBwb3J0Ci1AbWVudQotKiBTcGFyYy1PcHRzOjogICAgICAgICAgICAgICAgICBPcHRpb25zCi0qIFNwYXJjLUFsaWduZWQtRGF0YTo6CQlPcHRpb24gdG8gZW5mb3JjZSBhbGlnbmVkIGRhdGEKLSogU3BhcmMtRmxvYXQ6OiAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogU3BhcmMtRGlyZWN0aXZlczo6ICAgICAgICAgICAgU3BhcmMgTWFjaGluZSBEaXJlY3RpdmVzCi1AZW5kIG1lbnUKLQotQG5vZGUgU3BhcmMtT3B0cwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IG9wdGlvbnMgZm9yIFNQQVJDCi1AY2luZGV4IFNQQVJDIG9wdGlvbnMKLUBjaW5kZXggYXJjaGl0ZWN0dXJlcywgU1BBUkMKLUBjaW5kZXggU1BBUkMgYXJjaGl0ZWN0dXJlcwotVGhlIFNQQVJDIGNoaXAgZmFtaWx5IGluY2x1ZGVzIHNldmVyYWwgc3VjY2Vzc2l2ZSBsZXZlbHMsIHVzaW5nIHRoZSBzYW1lCi1jb3JlIGluc3RydWN0aW9uIHNldCwgYnV0IGluY2x1ZGluZyBhIGZldyBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyBhdAotZWFjaCBsZXZlbC4gIFRoZXJlIGFyZSBleGNlcHRpb25zIHRvIHRoaXMgaG93ZXZlci4gIEZvciBkZXRhaWxzIG9uIHdoYXQKLWluc3RydWN0aW9ucyBlYWNoIHZhcmlhbnQgc3VwcG9ydHMsIHBsZWFzZSBzZWUgdGhlIGNoaXAncyBhcmNoaXRlY3R1cmUKLXJlZmVyZW5jZSBtYW51YWwuCi0KLUJ5IGRlZmF1bHQsIEBjb2Rle0B2YWx1ZXtBU319IGFzc3VtZXMgdGhlIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0IChTUEFSQwotdjYpLCBidXQgYGBidW1wcycnIHRoZSBhcmNoaXRlY3R1cmUgbGV2ZWwgYXMgbmVlZGVkOiBpdCBzd2l0Y2hlcyB0bwotc3VjY2Vzc2l2ZWx5IGhpZ2hlciBhcmNoaXRlY3R1cmVzIGFzIGl0IGVuY291bnRlcnMgaW5zdHJ1Y3Rpb25zIHRoYXQKLW9ubHkgZXhpc3QgaW4gdGhlIGhpZ2hlciBsZXZlbHMuCi0KLUlmIG5vdCBjb25maWd1cmVkIGZvciBTUEFSQyB2OSAoQGNvZGV7c3BhcmM2NC0qLSp9KSBHQVMgd2lsbCBub3QgYnVtcAotcGFzc2VkIHNwYXJjbGl0ZSBieSBkZWZhdWx0LCBhbiBvcHRpb24gbXVzdCBiZSBwYXNzZWQgdG8gZW5hYmxlIHRoZQotdjkgaW5zdHJ1Y3Rpb25zLgotCi1HQVMgdHJlYXRzIHNwYXJjbGl0ZSBhcyBiZWluZyBjb21wYXRpYmxlIHdpdGggdjgsIHVubGVzcyBhbiBhcmNoaXRlY3R1cmUKLWlzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgU1BBUkMgdjkgaXMgYWx3YXlzIGluY29tcGF0aWJsZSB3aXRoIHNwYXJjbGl0ZS4KLQotQGMgVGhlIG9yZGVyIGhlcmUgaXMgdGhlIHNhbWUgYXMgdGhlIG9yZGVyIG9mIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsCi1AYyB0byBnaXZlIHRoZSB1c2VyIGEgc2Vuc2Ugb2YgdGhlIG9yZGVyIG9mIHRoZSAiYnVtcGluZyIuCi0KLUB0YWJsZSBAY29kZQotQGtpbmRleCAtQXY2Ci1Aa2luZGV4IEF2NwotQGtpbmRleCAtQXY4Ci1Aa2luZGV4IC1Bc3BhcmNsZXQKLUBraW5kZXggLUFzcGFyY2xpdGUKLUBraW5kZXggLUF2OQotQGtpbmRleCAtQXY5YQotQGl0ZW0gLUF2NiB8IC1BdjcgfCAtQXY4IHwgLUFzcGFyY2xldCB8IC1Bc3BhcmNsaXRlCi1AaXRlbXggLUF2OHBsdXMgfCAtQXY4cGx1c2EgfCAtQXY5IHwgLUF2OWEKLVVzZSBvbmUgb2YgdGhlIEBzYW1wey1BfSBvcHRpb25zIHRvIHNlbGVjdCBvbmUgb2YgdGhlIFNQQVJDCi1hcmNoaXRlY3R1cmVzIGV4cGxpY2l0bHkuICBJZiB5b3Ugc2VsZWN0IGFuIGFyY2hpdGVjdHVyZSBleHBsaWNpdGx5LAotQGNvZGV7QHZhbHVle0FTfX0gcmVwb3J0cyBhIGZhdGFsIGVycm9yIGlmIGl0IGVuY291bnRlcnMgYW4gaW5zdHJ1Y3Rpb24KLW9yIGZlYXR1cmUgcmVxdWlyaW5nIGFuIGluY29tcGF0aWJsZSBvciBoaWdoZXIgbGV2ZWwuCi0KLUBzYW1wey1BdjhwbHVzfSBhbmQgQHNhbXB7LUF2OHBsdXNhfSBzZWxlY3QgYSAzMiBiaXQgZW52aXJvbm1lbnQuCi0KLUBzYW1wey1Bdjl9IGFuZCBAc2FtcHstQXY5YX0gc2VsZWN0IGEgNjQgYml0IGVudmlyb25tZW50IGFuZCBhcmUgbm90Ci1hdmFpbGFibGUgdW5sZXNzIEdBUyBpcyBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgd2l0aCA2NCBiaXQgZW52aXJvbm1lbnQKLXN1cHBvcnQuCi0KLUBzYW1wey1BdjhwbHVzYX0gYW5kIEBzYW1wey1BdjlhfSBlbmFibGUgdGhlIFNQQVJDIFY5IGluc3RydWN0aW9uIHNldCB3aXRoCi1VbHRyYVNQQVJDIGV4dGVuc2lvbnMuCi0KLUBpdGVtIC14YXJjaD12OHBsdXMgfCAteGFyY2g9djhwbHVzYQotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgU29sYXJpcyB2OSBhc3NlbWJsZXIuICBUaGVzZSBvcHRpb25zIGFyZQotZXF1aXZhbGVudCB0byAtQXY4cGx1cyBhbmQgLUF2OHBsdXNhLCByZXNwZWN0aXZlbHkuCi0KLUBpdGVtIC1idW1wCi1XYXJuIHdoZW5ldmVyIGl0IGlzIG5lY2Vzc2FyeSB0byBzd2l0Y2ggdG8gYW5vdGhlciBsZXZlbC4KLUlmIGFuIGFyY2hpdGVjdHVyZSBsZXZlbCBpcyBleHBsaWNpdGx5IHJlcXVlc3RlZCwgR0FTIHdpbGwgbm90IGlzc3VlCi13YXJuaW5ncyB1bnRpbCB0aGF0IGxldmVsIGlzIHJlYWNoZWQsIGFuZCB3aWxsIHRoZW4gYnVtcCB0aGUgbGV2ZWwKLWFzIHJlcXVpcmVkIChleGNlcHQgYmV0d2VlbiBpbmNvbXBhdGlibGUgbGV2ZWxzKS4KLQotQGl0ZW0gLTMyIHwgLTY0Ci1TZWxlY3QgdGhlIHdvcmQgc2l6ZSwgZWl0aGVyIDMyIGJpdHMgb3IgNjQgYml0cy4KLVRoZXNlIG9wdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIHdpdGggdGhlIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQsCi1hbmQgcmVxdWlyZSB0aGF0IHRoZSBuZWNlc3NhcnkgQkZEIHN1cHBvcnQgaGFzIGJlZW4gaW5jbHVkZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIFNwYXJjLUFsaWduZWQtRGF0YQotQHNlY3Rpb24gRW5mb3JjaW5nIGFsaWduZWQgZGF0YQotCi1AY2luZGV4IGRhdGEgYWxpZ25tZW50IG9uIFNQQVJDCi1AY2luZGV4IFNQQVJDIGRhdGEgYWxpZ25tZW50Ci1TUEFSQyBHQVMgbm9ybWFsbHkgcGVybWl0cyBkYXRhIHRvIGJlIG1pc2FsaWduZWQuICBGb3IgZXhhbXBsZSwgaXQKLXBlcm1pdHMgdGhlIEBjb2Rley5sb25nfSBwc2V1ZG8tb3AgdG8gYmUgdXNlZCBvbiBhIGJ5dGUgYm91bmRhcnkuCi1Ib3dldmVyLCB0aGUgbmF0aXZlIFN1bk9TIGFuZCBTb2xhcmlzIGFzc2VtYmxlcnMgaXNzdWUgYW4gZXJyb3Igd2hlbgotdGhleSBzZWUgbWlzYWxpZ25lZCBkYXRhLgotCi1Aa2luZGV4IC0tZW5mb3JjZS1hbGlnbmVkLWRhdGEKLVlvdSBjYW4gdXNlIHRoZSBAY29kZXstLWVuZm9yY2UtYWxpZ25lZC1kYXRhfSBvcHRpb24gdG8gbWFrZSBTUEFSQyBHQVMKLWFsc28gaXNzdWUgYW4gZXJyb3IgYWJvdXQgbWlzYWxpZ25lZCBkYXRhLCBqdXN0IGFzIHRoZSBTdW5PUyBhbmQgU29sYXJpcwotYXNzZW1ibGVycyBkby4KLQotVGhlIEBjb2Rley0tZW5mb3JjZS1hbGlnbmVkLWRhdGF9IG9wdGlvbiBpcyBub3QgdGhlIGRlZmF1bHQgYmVjYXVzZSBnY2MKLWlzc3VlcyBtaXNhbGlnbmVkIGRhdGEgcHNldWRvLW9wcyB3aGVuIGl0IGluaXRpYWxpemVzIGNlcnRhaW4gcGFja2VkCi1kYXRhIHN0cnVjdHVyZXMgKHN0cnVjdHVyZXMgZGVmaW5lZCB1c2luZyB0aGUgQGNvZGV7cGFja2VkfSBhdHRyaWJ1dGUpLgotWW91IG1heSBoYXZlIHRvIGFzc2VtYmxlIHdpdGggR0FTIGluIG9yZGVyIHRvIGluaXRpYWxpemUgcGFja2VkIGRhdGEKLXN0cnVjdHVyZXMgaW4geW91ciBvd24gY29kZS4KLQotQGlnbm9yZQotQGMgRklYTUU6IChzcGFyYykgRmlsbCBpbiAic3ludGF4IiBzZWN0aW9uIQotQGMgc3Vic2VjdGlvbiBzeW50YXgKLUkgZG9uJ3Qga25vdyBhbnl0aGluZyBhYm91dCBTcGFyYyBzeW50YXguICBTb21lb25lIHdobyBkb2VzCi13aWxsIGhhdmUgdG8gd3JpdGUgdGhpcyBzZWN0aW9uLgotQGVuZCBpZ25vcmUKLQotQG5vZGUgU3BhcmMtRmxvYXQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIFNQQVJDIChAc2N7aWVlZX0pCi1AY2luZGV4IFNQQVJDIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgU3BhcmMgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotQG5vZGUgU3BhcmMtRGlyZWN0aXZlcwotQHNlY3Rpb24gU3BhcmMgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggU1BBUkMgbWFjaGluZSBkaXJlY3RpdmVzCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgU1BBUkMKLVRoZSBTcGFyYyB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbAotbWFjaGluZSBkaXJlY3RpdmVzOgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7YWxpZ259IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5hbGlnbgotVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBkZXNpcmVkIGFsaWdubWVudCBpbiBieXRlcy4KLQotQGNpbmRleCBAY29kZXtjb21tb259IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5jb21tb24KLVRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHN5bWJvbCBuYW1lLCBhIHBvc2l0aXZlIG51bWJlciwgYW5kCi1AY29kZXsiYnNzIn0uICBUaGlzIGJlaGF2ZXMgc29tZXdoYXQgbGlrZSBAY29kZXsuY29tbX0sIGJ1dCB0aGUKLXN5bnRheCBpcyBkaWZmZXJlbnQuCi0KLUBjaW5kZXggQGNvZGV7aGFsZn0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLmhhbGYKLVRoaXMgaXMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byBAY29kZXsuc2hvcnR9LgotCi1AY2luZGV4IEBjb2Rle253b3JkfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAubndvcmQKLU9uIHRoZSBTcGFyYywgdGhlIEBjb2Rley5ud29yZH0gZGlyZWN0aXZlIHByb2R1Y2VzIG5hdGl2ZSB3b3JkIHNpemVkIHZhbHVlLAotaWUuIGlmIGFzc2VtYmxpbmcgd2l0aCAtMzIgaXQgaXMgZXF1aXZhbGVudCB0byBAY29kZXsud29yZH0sIGlmIGFzc2VtYmxpbmcKLXdpdGggLTY0IGl0IGlzIGVxdWl2YWxlbnQgdG8gQGNvZGV7Lnh3b3JkfS4KLQotQGNpbmRleCBAY29kZXtwcm9jfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAucHJvYwotVGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZC4gIEFueSB0ZXh0IGZvbGxvd2luZyBpdCBvbiB0aGUgc2FtZQotbGluZSBpcyBhbHNvIGlnbm9yZWQuCi0KLUBjaW5kZXggQGNvZGV7cmVnaXN0ZXJ9IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5yZWdpc3RlcgotVGhpcyBkaXJlY3RpdmUgZGVjbGFyZXMgdXNlIG9mIGEgZ2xvYmFsIGFwcGxpY2F0aW9uIG9yIHN5c3RlbSByZWdpc3Rlci4KLUl0IG11c3QgYmUgZm9sbG93ZWQgYnkgYSByZWdpc3RlciBuYW1lICVnMiwgJWczLCAlZzYgb3IgJWc3LCBjb21tYSBhbmQKLXRoZSBzeW1ib2wgbmFtZSBmb3IgdGhhdCByZWdpc3Rlci4gIElmIHN5bWJvbCBuYW1lIGlzIEBjb2RleyNzY3JhdGNofSwKLWl0IGlzIGEgc2NyYXRjaCByZWdpc3RlciwgaWYgaXQgaXMgQGNvZGV7I2lnbm9yZX0sIGl0IGp1c3Qgc3VycHJlc3NlcyBhbnkKLWVycm9ycyBhYm91dCB1c2luZyB1bmRlY2xhcmVkIGdsb2JhbCByZWdpc3RlciwgYnV0IGRvZXMgbm90IGVtaXQgYW55Ci1pbmZvcm1hdGlvbiBhYm91dCBpdCBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBlLmcuIGlmIHlvdQotc2F2ZSB0aGUgcmVnaXN0ZXIgYmVmb3JlIHVzZSBhbmQgcmVzdG9yZSBpdCBhZnRlci4KLQotQGNpbmRleCBAY29kZXtyZXNlcnZlfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAucmVzZXJ2ZQotVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3ltYm9sIG5hbWUsIGEgcG9zaXRpdmUgbnVtYmVyLCBhbmQKLUBjb2RleyJic3MifS4gIFRoaXMgYmVoYXZlcyBzb21ld2hhdCBsaWtlIEBjb2Rley5sY29tbX0sIGJ1dCB0aGUKLXN5bnRheCBpcyBkaWZmZXJlbnQuCi0KLUBjaW5kZXggQGNvZGV7c2VnfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAuc2VnCi1UaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgQGNvZGV7InRleHQifSwgQGNvZGV7ImRhdGEifSwgb3IKLUBjb2RleyJkYXRhMSJ9LiAgSXQgYmVoYXZlcyBsaWtlIEBjb2Rley50ZXh0fSwgQGNvZGV7LmRhdGF9LCBvcgotQGNvZGV7LmRhdGEgMX0uCi0KLUBjaW5kZXggQGNvZGV7c2tpcH0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLnNraXAKLVRoaXMgaXMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byB0aGUgQGNvZGV7LnNwYWNlfSBkaXJlY3RpdmUuCi0KLUBjaW5kZXggQGNvZGV7d29yZH0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLndvcmQKLU9uIHRoZSBTcGFyYywgdGhlIEBjb2Rley53b3JkfSBkaXJlY3RpdmUgcHJvZHVjZXMgMzIgYml0IHZhbHVlcywKLWluc3RlYWQgb2YgdGhlIDE2IGJpdCB2YWx1ZXMgaXQgcHJvZHVjZXMgb24gbWFueSBvdGhlciBtYWNoaW5lcy4KLQotQGNpbmRleCBAY29kZXt4d29yZH0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLnh3b3JkCi1PbiB0aGUgU3BhcmMgVjkgcHJvY2Vzc29yLCB0aGUgQGNvZGV7Lnh3b3JkfSBkaXJlY3RpdmUgcHJvZHVjZXMKLTY0IGJpdCB2YWx1ZXMuCi1AZW5kIHRhYmxlCmRpZmYgLS1naXQgYS9nYXMvZG9jL2Mtdjg1MC50ZXhpIGIvZ2FzL2RvYy9jLXY4NTAudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxNmUwZi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2Mtdjg1MC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotCi1Abm9kZSBWODUwLURlcGVuZGVudAotQGNoYXB0ZXIgdjg1MCBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCBWODUwIHN1cHBvcnQKLUBtZW51Ci0qIFY4NTAgT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIFY4NTAgU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogVjg1MCBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIFY4NTAgRGlyZWN0aXZlczo6ICAgICAgICAgICBWODUwIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBWODUwIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIFY4NTAgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotQGNpbmRleCBWODUwIG9wdGlvbnMgKG5vbmUpCi1AY2luZGV4IG9wdGlvbnMgZm9yIFY4NTAgKG5vbmUpCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMKLWZvciB0aGUgVjg1MCBwcm9jZXNzb3IgZmFtaWx5OgotCi1AY2luZGV4IGNvbW1hbmQgbGluZSBvcHRpb25zLCBWODUwCi1AY2luZGV4IFY4NTAgY29tbWFuZCBsaW5lIG9wdGlvbnMKLUB0YWJsZSBAY29kZQotCi1AY2luZGV4IEBjb2Rley13c2lnbmVkX292ZXJmbG93fSBjb21tYW5kIGxpbmUgb3B0aW9uLCBWODUwCi1AaXRlbSAtd3NpZ25lZF9vdmVyZmxvdwotQ2F1c2VzIHdhcm5pbmdzIHRvIGJlIHByb2R1Y2VkIHdoZW4gc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgb3ZlcmZsb3cgdGhlCi1zcGFjZSBhdmFpbGFibGUgZm9yIHRoZW4gd2l0aGluIHRoZWlyIG9wY29kZXMuICBCeSBkZWZhdWx0IHRoaXMgb3B0aW9uCi1pcyBkaXNhYmxlZCBhcyBpdCBpcyBwb3NzaWJsZSB0byByZWNlaXZlIHNwdXJpb3VzIHdhcm5pbmdzIGR1ZSB0byB1c2luZwotZXhhY3QgYml0IHBhdHRlcm5zIGFzIGltbWVkaWF0ZSBjb25zdGFudHMuCi0KLUBjaW5kZXggQGNvZGV7LXd1bnNpZ25lZF9vdmVyZmxvd30gY29tbWFuZCBsaW5lIG9wdGlvbiwgVjg1MAotQGl0ZW0gLXd1bnNpZ25lZF9vdmVyZmxvdwotQ2F1c2VzIHdhcm5pbmdzIHRvIGJlIHByb2R1Y2VkIHdoZW4gdW5zaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvdwotdGhlIHNwYWNlIGF2YWlsYWJsZSBmb3IgdGhlbiB3aXRoaW4gdGhlaXIgb3Bjb2Rlcy4gIEJ5IGRlZmF1bHQgdGhpcwotb3B0aW9uIGlzIGRpc2FibGVkIGFzIGl0IGlzIHBvc3NpYmxlIHRvIHJlY2VpdmUgc3B1cmlvdXMgd2FybmluZ3MgZHVlIHRvCi11c2luZyBleGFjdCBiaXQgcGF0dGVybnMgYXMgaW1tZWRpYXRlIGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXstbXY4NTB9IGNvbW1hbmQgbGluZSBvcHRpb24sIFY4NTAKLUBpdGVtIC1tdjg1MAotU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKLXRoZSBWODUwIHByb2Nlc3Nvci4gIFRoaXMgYWxsb3dzIHRoZSBsaW5rZXIgdG8gZGV0ZWN0IGF0dGVtcHRzIHRvIGxpbmsKLXN1Y2ggY29kZSB3aXRoIGNvZGUgYXNzZW1ibGVkIGZvciBvdGhlciBwcm9jZXNzb3JzLgotCi1AY2luZGV4IEBjb2Rley1tdjg1MGV9IGNvbW1hbmQgbGluZSBvcHRpb24sIFY4NTAKLUBpdGVtIC1tdjg1MGUKLVNwZWNpZmllcyB0aGF0IHRoZSBhc3NlbWJsZWQgY29kZSBzaG91bGQgYmUgbWFya2VkIGFzIGJlaW5nIHRhcmdldGVkIGF0Ci10aGUgVjg1MEUgcHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gbGluawotc3VjaCBjb2RlIHdpdGggY29kZSBhc3NlbWJsZWQgZm9yIG90aGVyIHByb2Nlc3NvcnMuCi0KLUBjaW5kZXggQGNvZGV7LW12ODUwYW55fSBjb21tYW5kIGxpbmUgb3B0aW9uLCBWODUwCi1AaXRlbSAtbXY4NTBhbnkKLVNwZWNpZmllcyB0aGF0IHRoZSBhc3NlbWJsZWQgY29kZSBzaG91bGQgYmUgbWFya2VkIGFzIGJlaW5nIHRhcmdldGVkIGF0Ci10aGUgVjg1MCBwcm9jZXNzb3IgYnV0IHN1cHBvcnQgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZQotZXh0ZW5kZWQgdmFyaWFudHMgb2YgdGhlIHByb2Nlc3MuICBUaGlzIGFsbG93cyB0aGUgcHJvZHVjdGlvbiBvZgotYmluYXJpZXMgdGhhdCBjb250YWluIHRhcmdldCBzcGVjaWZpYyBjb2RlLCBidXQgd2hpY2ggYXJlIGFsc28gaW50ZW5kZWQKLXRvIGJlIHVzZWQgaW4gYSBnZW5lcmljIGZhc2hpb24uICBGb3IgZXhhbXBsZSBsaWJnY2MuYSBjb250YWlucyBnZW5lcmljCi1yb3V0aW5lcyB1c2VkIGJ5IHRoZSBjb2RlIHByb2R1Y2VkIGJ5IEdDQyBmb3IgYWxsIHZlcnNpb25zIG9mIHRoZSB2ODUwCi1hcmNoaXRlY3R1cmUsIHRvZ2V0aGVyIHdpdGggc3VwcG9ydCByb3V0aW5lcyBvbmx5IHVzZWQgYnkgdGhlIFY4NTBFCi1hcmNoaXRlY3R1cmUuCi0KLUBlbmQgdGFibGUKLQotCi1Abm9kZSBWODUwIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1AbWVudQotKiBWODUwLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIFY4NTAtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotQGVuZCBtZW51Ci0KLUBub2RlIFY4NTAtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIFY4NTAKLUBjaW5kZXggVjg1MCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHsjfSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KLUBub2RlIFY4NTAtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBWODUwIHJlZ2lzdGVyIG5hbWVzCi1AY2luZGV4IHJlZ2lzdGVyIG5hbWVzLCBWODUwCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG5hbWVzIGZvciByZWdpc3RlcnM6Ci1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7emVyb30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMAotcjAsIHplcm8KLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMQotcjEKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMgotcjIsIGhwCi1AY2luZGV4IEBjb2Rle3NwfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAzCi1yMywgc3AKLUBjaW5kZXggQGNvZGV7Z3B9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDQKLXI0LCBncAotQGNpbmRleCBAY29kZXt0cH0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgNQotcjUsIHRwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDYKLXI2Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDcKLXI3Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDgKLXI4Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDkKLXI5Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDEwCi1yMTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTEKLXIxMQotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxMgotcjEyCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDEzCi1yMTMKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTQKLXIxNAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxNQotcjE1Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE2Ci1yMTYKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTcKLXIxNwotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxOAotcjE4Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE5Ci1yMTkKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjAKLXIyMAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyMQotcjIxCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDIyCi1yMjIKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjMKLXIyMwotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyNAotcjI0Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI1Ci1yMjUKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjYKLXIyNgotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyNwotcjI3Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI4Ci1yMjgKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjkKLXIyOQotQGNpbmRleCBAY29kZXtlcH0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMzAKLXIzMCwgZXAKLUBjaW5kZXggQGNvZGV7bHB9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDMxCi1yMzEsIGxwCi1AY2luZGV4IEBjb2Rle2VpcGN9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMAotZWlwYwotQGNpbmRleCBAY29kZXtlaXBzd30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAxCi1laXBzdwotQGNpbmRleCBAY29kZXtmZXBjfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDIKLWZlcGMKLUBjaW5kZXggQGNvZGV7ZmVwc3d9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMwotZmVwc3cKLUBjaW5kZXggQGNvZGV7ZWNyfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDQKLWVjcgotQGNpbmRleCBAY29kZXtwc3d9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgNQotcHN3Ci1AY2luZGV4IEBjb2Rle2N0cGN9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMTYKLWN0cGMKLUBjaW5kZXggQGNvZGV7Y3Rwc3d9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMTcKLWN0cHN3Ci1AY2luZGV4IEBjb2Rle2RicGN9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMTgKLWRicGMKLUBjaW5kZXggQGNvZGV7ZGJwc3d9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMTkKLWRicHN3Ci1AY2luZGV4IEBjb2Rle2N0YnB9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMjAKLWN0YnAKLUBlbmQgdGFibGUKLQotQG5vZGUgVjg1MCBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgVjg1MCAoQHNje2llZWV9KQotQGNpbmRleCBWODUwIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgVjg1MCBmYW1pbHkgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotQG5vZGUgVjg1MCBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBWODUwIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgVjg1MAotQGNpbmRleCBWODUwIG1hY2hpbmUgZGlyZWN0aXZlcwotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle29mZnNldH0gZGlyZWN0aXZlLCBWODUwCi1AaXRlbSAub2Zmc2V0IEB2YXJ7PGV4cHJlc3Npb24+fQotTW92ZXMgdGhlIG9mZnNldCBpbnRvIHRoZSBjdXJyZW50IHNlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBhbW91bnQuIAotCi1AY2luZGV4IEBjb2Rle3NlY3Rpb259IGRpcmVjdGl2ZSwgVjg1MAotQGl0ZW0gLnNlY3Rpb24gIm5hbWUiLCA8dHlwZT4KLVRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBzdGFuZGFyZCAuc2VjdGlvbiBkaXJlY3RpdmUuICBJdCBzZXRzIHRoZQotY3VycmVudCBzZWN0aW9uIHRvIGJlIDx0eXBlPiBhbmQgY3JlYXRlcyBhbiBhbGlhcyBmb3IgdGhpcyBzZWN0aW9uCi1jYWxsZWQgIm5hbWUiLiAKLQotQGNpbmRleCBAY29kZXsudjg1MH0gZGlyZWN0aXZlLCBWODUwCi1AaXRlbSAudjg1MAotU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKLXRoZSBWODUwIHByb2Nlc3Nvci4gIFRoaXMgYWxsb3dzIHRoZSBsaW5rZXIgdG8gZGV0ZWN0IGF0dGVtcHRzIHRvIGxpbmsKLXN1Y2ggY29kZSB3aXRoIGNvZGUgYXNzZW1ibGVkIGZvciBvdGhlciBwcm9jZXNzb3JzLgotCi1AY2luZGV4IEBjb2Rley52ODUwZX0gZGlyZWN0aXZlLCBWODUwCi1AaXRlbSAudjg1MGUKLVNwZWNpZmllcyB0aGF0IHRoZSBhc3NlbWJsZWQgY29kZSBzaG91bGQgYmUgbWFya2VkIGFzIGJlaW5nIHRhcmdldGVkIGF0Ci10aGUgVjg1MEUgcHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gbGluawotc3VjaCBjb2RlIHdpdGggY29kZSBhc3NlbWJsZWQgZm9yIG90aGVyIHByb2Nlc3NvcnMuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgVjg1MCBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggVjg1MCBvcGNvZGVzCi1AY2luZGV4IG9wY29kZXMgZm9yIFY4NTAKLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBWODUwIG9wY29kZXMuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGFsc28gaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIHBzZXVkbyBvcHM6Ci0KLUB0YWJsZSBAY29kZQotCi1AY2luZGV4IEBjb2Rle2hpMH0gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBoaTAoKQotQ29tcHV0ZXMgdGhlIGhpZ2hlciAxNiBiaXRzIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uIGFuZCBzdG9yZXMgaXQgaW50bwotdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGZpZWxkIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlOgotCi0gICAgQHNhbXB7bXVsaGkgaGkwKGhlcmUgLSB0aGVyZSksIHI1LCByNn0KLQotY29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiBsYWJlbHMgJ2hlcmUnIGFuZAotJ3RoZXJlJywgdGFrZXMgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhpcyBkaWZmZXJlbmNlLCBzaGlmdHMgaXQgZG93biAxNgotYml0cyBhbmQgdGhlbiBtdXRsaXBsaWVzIGl0IGJ5IHRoZSBsb3dlciAxNiBiaXRzIGluIHJlZ2lzdGVyIDUsIHB1dHRpbmcKLXRoZSByZXN1bHQgaW50byByZWdpc3RlciA2LiAKLQotQGNpbmRleCBAY29kZXtsb30gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBsbygpCi1Db21wdXRlcyB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgc3RvcmVzIGl0IGludG8KLXRoZSBpbW1lZGlhdGUgb3BlcmFuZCBmaWVsZCBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZToKLQotICAgIEBzYW1we2FkZGkgbG8oaGVyZSAtIHRoZXJlKSwgcjUsIHI2fQotCi1jb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGxhYmVscyAnaGVyZScgYW5kCi0ndGhlcmUnLCB0YWtlcyB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGlzIGRpZmZlcmVuY2UgYW5kIGFkZHMgaXQgdG8KLXJlZ2lzdGVyIDUsIHB1dHRpbmcgdGhlIHJlc3VsdCBpbnRvIHJlZ2lzdGVyIDYuCi0KLUBjaW5kZXggQGNvZGV7aGl9IHBzZXVkby1vcCwgVjg1MAotQGl0ZW0gaGkoKQotQ29tcHV0ZXMgdGhlIGhpZ2hlciAxNiBiaXRzIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uIGFuZCB0aGVuIGFkZHMgdGhlCi12YWx1ZSBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIGV4cHJlc3Npb24KLWFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbnRvIHRoZSBpbW1lZGlhdGUgb3BlcmFuZCBmaWVsZCBvZiB0aGUgZ2l2ZW4KLWluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlCi1hZGRyZXNzIG9mIHRoZSBsYWJlbCAnaGVyZScgYW5kIHN0b3JlIGl0IGludG8gcmVnaXN0ZXIgNjoKLQotICAgIEBzYW1we21vdmhpIGhpKGhlcmUpLCByMCwgcjZ9Ci0gICAgQHNhbXB7bW92ZWEgbG8oaGVyZSksIHI2LCByNn0KLQotVGhlIHJlYXNvbiBmb3IgdGhpcyBzcGVjaWFsIGJlaGF2aW91ciBpcyB0aGF0IG1vdmVhIHBlcmZvcm1zIGEgc2lnbgotZXh0ZW50aW9uIG9uIGl0cyBpbW1lZGlhdGUgb3BlcmFuZC4gIFNvIGZvciBleGFtcGxlIGlmIHRoZSBhZGRyZXNzIG9mCi0naGVyZScgd2FzIDB4RkZGRkZGRkYgdGhlbiB3aXRob3V0IHRoZSBzcGVjaWFsIGJlaGF2aW91ciBvZiB0aGUgaGkoKQotcHNldWRvLW9wIHRoZSBtb3ZoaSBpbnN0cnVjdGlvbiB3b3VsZCBwdXQgMHhGRkZGMDAwMCBpbnRvIHI2LCB0aGVuIHRoZQotbW92ZWEgaW5zdHJ1Y3Rpb24gd291bGQgdGFrZXMgaXRzIGltbWVkaWF0ZSBvcGVyYW5kLCAweEZGRkYsIHNpZ24gZXh0ZW5kCi1pdCB0byAzMiBiaXRzLCAweEZGRkZGRkZGLCBhbmQgdGhlbiBhZGQgaXQgaW50byByNiBnaXZpbmcgMHhGRkZFRkZGRgotd2hpY2ggaXMgd3JvbmcgKHRoZSBmaWZ0aCBuaWJibGUgaXMgRSkuICBXaXRoIHRoZSBoaSgpIHBzZXVkbyBvcCBhZGRpbmcKLWluIHRoZSB0b3AgYml0IG9mIHRoZSBsbygpIHBzZXVkbyBvcCwgdGhlIG1vdmhpIGluc3RydWN0aW9uIGFjdHVhbGx5Ci1zdG9yZXMgMCBpbnRvIHI2ICgweEZGRkYgKyAxID0gMHgwMDAwKSwgc28gdGhhdCB0aGUgbW92ZWEgaW5zdHJ1Y3Rpb24KLXN0b3JlcyAweEZGRkZGRkZGIGludG8gcjYgLSB0aGUgcmlnaHQgdmFsdWUuCi0KLUBjaW5kZXggQGNvZGV7aGlsb30gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBoaWxvKCkKLUNvbXB1dGVzIHRoZSAzMiBiaXQgdmFsdWUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHN0b3JlcyBpdCBpbnRvCi10aGUgaW1tZWRpYXRlIG9wZXJhbmQgZmllbGQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uICh3aGljaCBtdXN0IGJlIGEKLW1vdiBpbnN0cnVjdGlvbikuICBGb3IgZXhhbXBsZToKLQotICAgIEBzYW1we21vdiBoaWxvKGhlcmUpLCByNn0KLQotY29tcHV0ZXMgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgbGFiZWwgJ2hlcmUnIGFuZCBwdXRzIHRoZSByZXN1bHQgaW50bwotcmVnaXN0ZXIgNi4gIAotCi1AY2luZGV4IEBjb2Rle3NkYW9mZn0gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBzZGFvZmYoKQotQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgbmFtZWQgdmFyaWFibGUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIFNtYWxsCi1EYXRhIEFyZWEgKHdob2VzIGFkZHJlc3MgaXMgaGVsZCBpbiByZWdpc3RlciA0LCB0aGUgR1AgcmVnaXN0ZXIpIGFuZAotc3RvcmVzIHRoZSByZXN1bHQgYXMgYSAxNiBiaXQgc2lnbmVkIHZhbHVlIGluIHRoZSBpbW1lZGlhdGUgb3BlcmFuZAotZmllbGQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGU6IAotCi0gICAgICBAc2FtcHtsZC53IHNkYW9mZihfYV92YXJpYWJsZSlbZ3BdLHI2fQotCi1sb2FkcyB0aGUgY29udGVudHMgb2YgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIGxhYmVsICdfYV92YXJpYWJsZScKLWludG8gcmVnaXN0ZXIgNiwgcHJvdmlkZWQgdGhhdCB0aGUgbGFiZWwgaXMgbG9jYXRlZCBzb21ld2hlcmUgd2l0aGluICsvLQotMzJLIG9mIHRoZSBhZGRyZXNzIGhlbGQgaW4gdGhlIEdQIHJlZ2lzdGVyLiAgW05vdGUgdGhlIGxpbmtlciBhc3N1bWVzCi10aGF0IHRoZSBHUCByZWdpc3RlciBjb250YWlucyBhIGZpeGVkIGFkZHJlc3Mgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZQotbGFiZWwgY2FsbGVkICdfX2dwJy4gIFRoaXMgY2FuIGVpdGhlciBiZSBzZXQgdXAgYXV0b21hdGljYWxseSBieSB0aGUKLWxpbmtlciwgb3Igc3BlY2lmaWNhbGx5IHNldCBieSB1c2luZyB0aGUgQHNhbXB7LS1kZWZzeW0gX19ncD08dmFsdWU+fQotY29tbWFuZCBsaW5lIG9wdGlvbl0uCi0KLUBjaW5kZXggQGNvZGV7dGRhb2ZmfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIHRkYW9mZigpCi1Db21wdXRlcyB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lZCB2YXJpYWJsZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgVGlueQotRGF0YSBBcmVhICh3aG9lcyBhZGRyZXNzIGlzIGhlbGQgaW4gcmVnaXN0ZXIgMzAsIHRoZSBFUCByZWdpc3RlcikgYW5kCi1zdG9yZXMgdGhlIHJlc3VsdCBhcyBhIDQsNSwgNyBvciA4IGJpdCB1bnNpZ25lZCB2YWx1ZSBpbiB0aGUgaW1tZWRpYXRlCi1vcGVyYW5kIGZpZWxkIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlOgotCi0gICAgICBAc2FtcHtzbGQudyB0ZGFvZmYoX2FfdmFyaWFibGUpW2VwXSxyNn0KLQotbG9hZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBsYWJlbCAnX2FfdmFyaWFibGUnCi1pbnRvIHJlZ2lzdGVyIDYsIHByb3ZpZGVkIHRoYXQgdGhlIGxhYmVsIGlzIGxvY2F0ZWQgc29tZXdoZXJlIHdpdGhpbiArMjU2Ci1ieXRlcyBvZiB0aGUgYWRkcmVzcyBoZWxkIGluIHRoZSBFUCByZWdpc3Rlci4gIFtOb3RlIHRoZSBsaW5rZXIgYXNzdW1lcwotdGhhdCB0aGUgRVAgcmVnaXN0ZXIgY29udGFpbnMgYSBmaXhlZCBhZGRyZXNzIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUKLWxhYmVsIGNhbGxlZCAnX19lcCcuICBUaGlzIGNhbiBlaXRoZXIgYmUgc2V0IHVwIGF1dG9tYXRpY2FsbHkgYnkgdGhlCi1saW5rZXIsIG9yIHNwZWNpZmljYWxseSBzZXQgYnkgdXNpbmcgdGhlIEBzYW1wey0tZGVmc3ltIF9fZXA9PHZhbHVlPn0KLWNvbW1hbmQgbGluZSBvcHRpb25dLgotCi1AY2luZGV4IEBjb2Rle3pkYW9mZn0gcHNldWRvLW9wLCBWODUwCi1AaXRlbSB6ZGFvZmYoKQotQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgbmFtZWQgdmFyaWFibGUgZnJvbSBhZGRyZXNzIDAgYW5kIHN0b3JlcyB0aGUKLXJlc3VsdCBhcyBhIDE2IGJpdCBzaWduZWQgdmFsdWUgaW4gdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGZpZWxkIG9mIHRoZQotZ2l2ZW4gaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZToKLQotICAgICAgQHNhbXB7bW92ZWEgemRhb2ZmKF9hX3ZhcmlhYmxlKSx6ZXJvLHI2fQotCi1wdXRzIHRoZSBhZGRyZXNzIG9mIHRoZSBsYWJlbCAnX2FfdmFyaWFibGUnIGludG8gcmVnaXN0ZXIgNiwgYXNzdW1pbmcKLXRoYXQgdGhlIGxhYmVsIGlzIHNvbWV3aGVyZSB3aXRoaW4gdGhlIGZpcnN0IDMySyBvZiBtZW1vcnkuICAoU3RyaWN0bHkKLXNwZWFraW5nIGl0IGFsc28gcG9zc2libGUgdG8gYWNjZXNzIHRoZSBsYXN0IDMySyBvZiBtZW1vcnkgYXMgd2VsbCwgYXMKLXRoZSBvZmZzZXRzIGFyZSBzaWduZWQpLgotCi1AY2luZGV4IEBjb2Rle2N0b2ZmfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIGN0b2ZmKCkKLUNvbXB1dGVzIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWVkIHZhcmlhYmxlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBDYWxsCi1UYWJsZSBBcmVhICh3aG9lcyBhZGRyZXNzIGlzIGhlbGcgaW4gc3lzdGVtIHJlZ2lzdGVyIDIwLCB0aGUgQ1RCUAotcmVnaXN0ZXIpIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBhIDYgb3IgMTYgYml0IHVuc2lnbmVkIHZhbHVlIGluIHRoZQotaW1tZWRpYXRlIGZpZWxkIG9mIHRoZW4gZ2l2ZW4gaW5zdHJ1Y3Rpb24gb3IgcGllY2Ugb2YgZGF0YS4gIEZvcgotZXhhbXBsZToKLQotICAgICBAc2FtcHtjYWxsdCBjdG9mZih0YWJsZV9mdW5jMSl9Ci0KLXdpbGwgcHV0IHRoZSBjYWxsIHRoZSBmdW5jdGlvbiB3aG9lcyBhZGRyZXNzIGlzIGhlbGQgaW4gdGhlIGNhbGwgdGFibGUKLWF0IHRoZSBsb2NhdGlvbiBsYWJlbGVkICd0YWJsZV9mdW5jMScuCi0KLUBlbmQgdGFibGUKLQotCi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIFY4NTAgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7Vjg1MAotRmFtaWx5IDMyLS8xNi1CaXQgc2luZ2xlLUNoaXAgTWljcm9jb250cm9sbGVyIEFyY2hpdGVjdHVyZSBNYW51YWx9IGZyb20gTkVDLgotTHRkLgotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtdmF4LnRleGkgYi9nYXMvZG9jL2MtdmF4LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxM2Q3ZTUuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXZheC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AYyBWQVgvVk1TIGRlc2NyaXB0aW9uIGV4aGFuY2VkIGFuZCBjb3JyZWN0ZWQgYnkgS2xhdXMgSyJhZW1wZiwga2thZW1wZkBwcm9naXMuZGUKLUBpZnNldCBHRU5FUklDCi1Abm9kZSBWYXgtRGVwZW5kZW50Ci1AY2hhcHRlciBWQVggRGVwZW5kZW50IEZlYXR1cmVzCi1AY2luZGV4IFZBWCBzdXBwb3J0Ci0KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBWQVggRGVwZW5kZW50IEZlYXR1cmVzCi1AY2luZGV4IFZBWCBzdXBwb3J0Ci0KLUBlbmQgaWZjbGVhcgotCi1AbWVudQotKiBWQVgtT3B0czo6ICAgICAgICAgICAgICAgICAgICBWQVggQ29tbWFuZC1MaW5lIE9wdGlvbnMKLSogVkFYLWZsb2F0OjogICAgICAgICAgICAgICAgICAgVkFYIEZsb2F0aW5nIFBvaW50Ci0qIFZBWC1kaXJlY3RpdmVzOjogICAgICAgICAgICAgIFZheCBNYWNoaW5lIERpcmVjdGl2ZXMKLSogVkFYLW9wY29kZXM6OiAgICAgICAgICAgICAgICAgVkFYIE9wY29kZXMKLSogVkFYLWJyYW5jaDo6ICAgICAgICAgICAgICAgICAgVkFYIEJyYW5jaCBJbXByb3ZlbWVudAotKiBWQVgtb3BlcmFuZHM6OiAgICAgICAgICAgICAgICBWQVggT3BlcmFuZHMKLSogVkFYLW5vOjogICAgICAgICAgICAgICAgICAgICAgTm90IFN1cHBvcnRlZCBvbiBWQVgKLUBlbmQgbWVudQotCi0KLUBub2RlIFZBWC1PcHRzCi1Ac2VjdGlvbiBWQVggQ29tbWFuZC1MaW5lIE9wdGlvbnMKLQotQGNpbmRleCBjb21tYW5kLWxpbmUgb3B0aW9ucyBpZ25vcmVkLCBWQVgKLUBjaW5kZXggVkFYIGNvbW1hbmQtbGluZSBvcHRpb25zIGlnbm9yZWQKLVRoZSBWYXggdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMsCi1naXZlcyBhIHdhcm5pbmcgbWVzc2FnZSB0aGF0IHRoZSBvcHRpb24gd2FzIGlnbm9yZWQgYW5kIHByb2NlZWRzLgotVGhlc2Ugb3B0aW9ucyBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzY3JpcHRzIGRlc2lnbmVkIGZvciBvdGhlcgotcGVvcGxlJ3MgYXNzZW1ibGVycy4KLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rley1EfSwgaWdub3JlZCBvbiBWQVgKLUBjaW5kZXggQGNvZGV7LVN9LCBpZ25vcmVkIG9uIFZBWAotQGNpbmRleCBAY29kZXstVH0sIGlnbm9yZWQgb24gVkFYCi1AaXRlbSBAY29kZXstRH0gKERlYnVnKQotQGl0ZW14IEBjb2Rley1TfSAoU3ltYm9sIFRhYmxlKQotQGl0ZW14IEBjb2Rley1UfSAoVG9rZW4gVHJhY2UpCi1UaGVzZSBhcmUgb2Jzb2xldGUgb3B0aW9ucyB1c2VkIHRvIGRlYnVnIG9sZCBhc3NlbWJsZXJzLgotCi1AY2luZGV4IEBjb2Rley1kfSwgVkFYIG9wdGlvbgotQGl0ZW0gQGNvZGV7LWR9IChEaXNwbGFjZW1lbnQgc2l6ZSBmb3IgSlVNUHMpCi1UaGlzIG9wdGlvbiBleHBlY3RzIGEgbnVtYmVyIGZvbGxvd2luZyB0aGUgQHNhbXB7LWR9LiAgTGlrZSBvcHRpb25zCi10aGF0IGV4cGVjdCBmaWxlbmFtZXMsIHRoZSBudW1iZXIgbWF5IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUKLUBzYW1wey1kfSAob2xkIHN0YW5kYXJkKSBvciBjb25zdGl0dXRlIHRoZSB3aG9sZSBvZiB0aGUgY29tbWFuZCBsaW5lCi1hcmd1bWVudCB0aGF0IGZvbGxvd3MgQHNhbXB7LWR9IChAc2N7Z251fSBzdGFuZGFyZCkuCi0KLUBjaW5kZXggQGNvZGV7LVZ9LCByZWR1bmRhbnQgb24gVkFYCi1AaXRlbSBAY29kZXstVn0gKFZpcnR1YWxpemUgSW50ZXJwYXNzIFRlbXBvcmFyeSBGaWxlKQotU29tZSBvdGhlciBhc3NlbWJsZXJzIHVzZSBhIHRlbXBvcmFyeSBmaWxlLiAgVGhpcyBvcHRpb24KLWNvbW1hbmRlZCB0aGVtIHRvIGtlZXAgdGhlIGluZm9ybWF0aW9uIGluIGFjdGl2ZSBtZW1vcnkgcmF0aGVyCi10aGFuIGluIGEgZGlzayBmaWxlLiAgQGNvZGV7QHZhbHVle0FTfX0gYWx3YXlzIGRvZXMgdGhpcywgc28gdGhpcwotb3B0aW9uIGlzIHJlZHVuZGFudC4KLQotQGNpbmRleCBAY29kZXstSn0sIGlnbm9yZWQgb24gVkFYCi1AaXRlbSBAY29kZXstSn0gKEpVTVBpZnkgTG9uZ2VyIEJyYW5jaGVzKQotTWFueSAzMi1iaXQgY29tcHV0ZXJzIHBlcm1pdCBhIHZhcmlldHkgb2YgYnJhbmNoIGluc3RydWN0aW9ucwotdG8gZG8gdGhlIHNhbWUgam9iLiAgU29tZSBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgYXJlIHNob3J0IChhbmQKLWZhc3QpIGJ1dCBoYXZlIGEgbGltaXRlZCByYW5nZTsgb3RoZXJzIGFyZSBsb25nIChhbmQgc2xvdykgYnV0Ci1jYW4gYnJhbmNoIGFueXdoZXJlIGluIHZpcnR1YWwgbWVtb3J5LiAgT2Z0ZW4gdGhlcmUgYXJlIDMKLWZsYXZvcnMgb2YgYnJhbmNoOiBzaG9ydCwgbWVkaXVtIGFuZCBsb25nLiAgU29tZSBvdGhlcgotYXNzZW1ibGVycyB3b3VsZCBlbWl0IHNob3J0IGFuZCBtZWRpdW0gYnJhbmNoZXMsIHVubGVzcyB0b2xkIGJ5Ci10aGlzIG9wdGlvbiB0byBlbWl0IHNob3J0IGFuZCBsb25nIGJyYW5jaGVzLgotCi1AY2luZGV4IEBjb2Rley10fSwgaWdub3JlZCBvbiBWQVgKLUBpdGVtIEBjb2Rley10fSAoVGVtcG9yYXJ5IEZpbGUgRGlyZWN0b3J5KQotU29tZSBvdGhlciBhc3NlbWJsZXJzIG1heSB1c2UgYSB0ZW1wb3JhcnkgZmlsZSwgYW5kIHRoaXMgb3B0aW9uCi10YWtlcyBhIGZpbGVuYW1lIGJlaW5nIHRoZSBkaXJlY3RvcnkgdG8gc2l0ZSB0aGUgdGVtcG9yYXJ5Ci1maWxlLiAgU2luY2UgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3QgdXNlIGEgdGVtcG9yYXJ5IGRpc2sgZmlsZSwgdGhpcwotb3B0aW9uIG1ha2VzIG5vIGRpZmZlcmVuY2UuICBAc2FtcHstdH0gbmVlZHMgZXhhY3RseSBvbmUKLWZpbGVuYW1lLgotQGVuZCB0YWJsZQotCi1AY2luZGV4IFZNUyAoVkFYKSBvcHRpb25zCi1AY2luZGV4IG9wdGlvbnMgZm9yIFZBWC9WTVMKLUBjaW5kZXggVkFYL1ZNUyBvcHRpb25zCi1AY2luZGV4IFZheC0xMSBDIGNvbXBhdGliaWxpdHkKLUBjaW5kZXggc3ltYm9scyB3aXRoIHVwcGVyY2FzZSwgVkFYL1ZNUwotVGhlIFZheCB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIgYWNjZXB0cyBhZGRpdGlvbmFsIG9wdGlvbnMgd2hlbgotY29tcGlsZWQgZm9yIFZNUzoKLQotQHRhYmxlIEBzYW1wCi1AY2luZGV4IEBzYW1wey1ofSBvcHRpb24sIFZBWC9WTVMKLUBpdGVtIC1oIEB2YXJ7bn0KLUV4dGVybmFsIHN5bWJvbCBvciBzZWN0aW9uICh1c2VkIGZvciBnbG9iYWwgdmFyaWFibGVzKSBuYW1lcyBhcmUgbm90Ci1jYXNlIHNlbnNpdGl2ZSBvbiBWQVgvVk1TIGFuZCBhbHdheXMgbWFwcGVkIHRvIHVwcGVyIGNhc2UuICBUaGlzIGlzCi1jb250cmFyeSB0byB0aGUgQyBsYW5ndWFnZSBkZWZpbml0aW9uIHdoaWNoIGV4cGxpY2l0bHkgZGlzdGluZ3Vpc2hlcwotdXBwZXIgYW5kIGxvd2VyIGNhc2UuICBUbyBpbXBsZW1lbnQgYSBzdGFuZGFyZCBjb25mb3JtaW5nIEMgY29tcGlsZXIsCi1uYW1lcyBtdXN0IGJlIGNoYW5nZWQgKG1hcHBlZCkgdG8gcHJlc2VydmUgdGhlIGNhc2UgaW5mb3JtYXRpb24uICBUaGUKLWRlZmF1bHQgbWFwcGluZyBpcyB0byBjb252ZXJ0IGFsbCBsb3dlciBjYXNlIGNoYXJhY3RlcnMgdG8gdXBwZXJjYXNlIGFuZAotYWRkaW5nIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgYSA2IGRpZ2l0IGhleCB2YWx1ZSwgcmVwcmVzZW50aW5nIGEgMjQKLWRpZ2l0IGJpbmFyeSB2YWx1ZS4gIFRoZSBvbmUgZGlnaXRzIGluIHRoZSBiaW5hcnkgdmFsdWUgcmVwcmVzZW50IHdoaWNoCi1jaGFyYWN0ZXJzIGFyZSB1cHBlcmNhc2UgaW4gdGhlIG9yaWdpbmFsIHN5bWJvbCBuYW1lLgotCi1UaGUgQHNhbXB7LWggQHZhcntufX0gb3B0aW9uIGRldGVybWluZXMgaG93IHdlIG1hcCBuYW1lcy4gIFRoaXMgdGFrZXMKLXNldmVyYWwgdmFsdWVzLiAgTm8gQHNhbXB7LWh9IHN3aXRjaCBhdCBhbGwgYWxsb3dzIGNhc2UgaGFja2luZyBhcwotZGVzY3JpYmVkIGFib3ZlLiAgQSB2YWx1ZSBvZiB6ZXJvIChAc2FtcHstaDB9KSBpbXBsaWVzIG5hbWVzIHNob3VsZCBiZQotdXBwZXIgY2FzZSwgYW5kIGluaGliaXRzIHRoZSBjYXNlIGhhY2suICBBIHZhbHVlIG9mIDIgKEBzYW1wey1oMn0pCi1pbXBsaWVzIG5hbWVzIHNob3VsZCBiZSBhbGwgbG93ZXIgY2FzZSwgd2l0aCBubyBjYXNlIGhhY2suICBBIHZhbHVlIG9mIDMKLShAc2FtcHstaDN9KSBpbXBsaWVzIHRoYXQgY2FzZSBzaG91bGQgYmUgcHJlc2VydmVkLiAgVGhlIHZhbHVlIDEgaXMKLXVudXNlZC4gIFRoZSBAY29kZXstSH0gb3B0aW9uIGRpcmVjdHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gZGlzcGxheQotZXZlcnkgbWFwcGVkIHN5bWJvbCBkdXJpbmcgYXNzZW1ibHkuCi0KLVN5bWJvbHMgd2hvc2UgbmFtZXMgaW5jbHVkZSBhIGRvbGxhciBzaWduIEBzYW1weyR9IGFyZSBleGNlcHRpb25zIHRvIHRoZQotZ2VuZXJhbCBuYW1lIG1hcHBpbmcuICBUaGVzZSBzeW1ib2xzIGFyZSBub3JtYWxseSBvbmx5IHVzZWQgdG8gcmVmZXJlbmNlCi1WTVMgbGlicmFyeSBuYW1lcy4gIFN1Y2ggc3ltYm9scyBhcmUgYWx3YXlzIG1hcHBlZCB0byB1cHBlciBjYXNlLgotCi1AY2luZGV4IEBzYW1wey0rfSBvcHRpb24sIFZBWC9WTVMKLUBpdGVtIC0rCi1UaGUgQHNhbXB7LSt9IG9wdGlvbiBjYXVzZXMgQGNvZGV7QHZhbHVle0FTfX0gdG8gdHJ1bmNhdGUgYW55IHN5bWJvbAotbmFtZSBsYXJnZXIgdGhhbiAzMSBjaGFyYWN0ZXJzLiAgVGhlIEBzYW1wey0rfSBvcHRpb24gYWxzbyBwcmV2ZW50cyBzb21lCi1jb2RlIGZvbGxvd2luZyB0aGUgQHNhbXB7X21haW59IHN5bWJvbCBub3JtYWxseSBhZGRlZCB0byBtYWtlIHRoZSBvYmplY3QKLWZpbGUgY29tcGF0aWJsZSB3aXRoIFZheC0xMSAiQyIuCi0KLUBjaW5kZXggQHNhbXB7LTF9IG9wdGlvbiwgVkFYL1ZNUwotQGl0ZW0gLTEKLVRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBAY29kZXtAdmFsdWV7QVN9fQotdmVyc2lvbiAxLnguCi0KLUBjaW5kZXggQHNhbXB7LUh9IG9wdGlvbiwgVkFYL1ZNUwotQGl0ZW0gLUgKLVRoZSBAc2FtcHstSH0gb3B0aW9uIGNhdXNlcyBAY29kZXtAdmFsdWV7QVN9fSB0byBwcmludCBldmVyeSBzeW1ib2wKLXdoaWNoIHdhcyBjaGFuZ2VkIGJ5IGNhc2UgbWFwcGluZy4KLUBlbmQgdGFibGUKLQotQG5vZGUgVkFYLWZsb2F0Ci1Ac2VjdGlvbiBWQVggRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBWQVggZmxvYXRpbmcgcG9pbnQKLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIFZBWAotQ29udmVyc2lvbiBvZiBmbG9udW1zIHRvIGZsb2F0aW5nIHBvaW50IGlzIGNvcnJlY3QsIGFuZAotY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIGFzc2VtYmxlcnMuICBSb3VuZGluZyBpcwotdG93YXJkcyB6ZXJvIGlmIHRoZSByZW1haW5kZXIgaXMgZXhhY3RseSBoYWxmIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuCi0KLUBjb2Rle0R9LCBAY29kZXtGfSwgQGNvZGV7R30gYW5kIEBjb2Rle0h9IGZsb2F0aW5nIHBvaW50IGZvcm1hdHMKLWFyZSB1bmRlcnN0b29kLgotCi1JbW1lZGlhdGUgZmxvYXRpbmcgbGl0ZXJhbHMgKEBlbXBoe2UuZy59IEBzYW1we1NgJDYuOX0pCi1hcmUgcmVuZGVyZWQgY29ycmVjdGx5LiAgQWdhaW4sIHJvdW5kaW5nIGlzIHRvd2FyZHMgemVybyBpbiB0aGUKLWJvdW5kYXJ5IGNhc2UuCi0KLUBjaW5kZXggQGNvZGV7ZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AY2luZGV4IEBjb2Rle2RvdWJsZX0gZGlyZWN0aXZlLCBWQVgKLVRoZSBAY29kZXsuZmxvYXR9IGRpcmVjdGl2ZSBwcm9kdWNlcyBAY29kZXtmfSBmb3JtYXQgbnVtYmVycy4KLVRoZSBAY29kZXsuZG91YmxlfSBkaXJlY3RpdmUgcHJvZHVjZXMgQGNvZGV7ZH0gZm9ybWF0IG51bWJlcnMuCi0KLUBub2RlIFZBWC1kaXJlY3RpdmVzCi1Ac2VjdGlvbiBWYXggTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBWQVgKLUBjaW5kZXggVkFYIG1hY2hpbmUgZGlyZWN0aXZlcwotVGhlIFZheCB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIgc3VwcG9ydHMgZm91ciBkaXJlY3RpdmVzIGZvcgotZ2VuZXJhdGluZyBWYXggZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLiAgVGhleSBhcmUgZGVzY3JpYmVkIGluIHRoZQotdGFibGUgYmVsb3cuCi0KLUBjaW5kZXggd2lkZSBmbG9hdGluZyBwb2ludCBkaXJlY3RpdmVzLCBWQVgKLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtkZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AaXRlbSAuZGZsb2F0Ci1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZAotYXNzZW1ibGVzIFZheCBAY29kZXtkfSBmb3JtYXQgNjQtYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXtmZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AaXRlbSAuZmZsb2F0Ci1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZAotYXNzZW1ibGVzIFZheCBAY29kZXtmfSBmb3JtYXQgMzItYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXtnZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AaXRlbSAuZ2Zsb2F0Ci1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZAotYXNzZW1ibGVzIFZheCBAY29kZXtnfSBmb3JtYXQgNjQtYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXtoZmxvYXR9IGRpcmVjdGl2ZSwgVkFYCi1AaXRlbSAuaGZsb2F0Ci1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZAotYXNzZW1ibGVzIFZheCBAY29kZXtofSBmb3JtYXQgMTI4LWJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgVkFYLW9wY29kZXMKLUBzZWN0aW9uIFZBWCBPcGNvZGVzCi0KLUBjaW5kZXggVkFYIG9wY29kZSBtbmVtb25pY3MKLUBjaW5kZXggb3Bjb2RlIG1uZW1vbmljcywgVkFYCi1AY2luZGV4IG1uZW1vbmljcyBmb3Igb3Bjb2RlcywgVkFYCi1BbGwgREVDIG1uZW1vbmljcyBhcmUgc3VwcG9ydGVkLiAgQmV3YXJlIHRoYXQgQGNvZGV7Y2FzZUBkb3Rze319Ci1pbnN0cnVjdGlvbnMgaGF2ZSBleGFjdGx5IDMgb3BlcmFuZHMuICBUaGUgZGlzcGF0Y2ggdGFibGUgdGhhdAotZm9sbG93cyB0aGUgQGNvZGV7Y2FzZUBkb3Rze319IGluc3RydWN0aW9uIHNob3VsZCBiZSBtYWRlIHdpdGgKLUBjb2Rley53b3JkfSBzdGF0ZW1lbnRzLiAgVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggYWxsIHVuaXgKLWFzc2VtYmxlcnMgd2Uga25vdyBvZi4KLQotQG5vZGUgVkFYLWJyYW5jaAotQHNlY3Rpb24gVkFYIEJyYW5jaCBJbXByb3ZlbWVudAotCi1AY2luZGV4IFZBWCBicmFuY2ggaW1wcm92ZW1lbnQKLUBjaW5kZXggYnJhbmNoIGltcHJvdmVtZW50LCBWQVgKLUBjaW5kZXggcHNldWRvLW9wcyBmb3IgYnJhbmNoLCBWQVgKLUNlcnRhaW4gcHNldWRvIG9wY29kZXMgYXJlIHBlcm1pdHRlZC4gIFRoZXkgYXJlIGZvciBicmFuY2gKLWluc3RydWN0aW9ucy4gIFRoZXkgZXhwYW5kIHRvIHRoZSBzaG9ydGVzdCBicmFuY2ggaW5zdHJ1Y3Rpb24gdGhhdAotcmVhY2hlcyB0aGUgdGFyZ2V0LiAgR2VuZXJhbGx5IHRoZXNlIG1uZW1vbmljcyBhcmUgbWFkZSBieQotc3Vic3RpdHV0aW5nIEBzYW1we2p9IGZvciBAc2FtcHtifSBhdCB0aGUgc3RhcnQgb2YgYSBERUMgbW5lbW9uaWMuCi1UaGlzIGZlYXR1cmUgaXMgaW5jbHVkZWQgYm90aCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgdG8gaGVscAotY29tcGlsZXJzLiAgSWYgeW91IGRvIG5vdCBuZWVkIHRoaXMgZmVhdHVyZSwgYXZvaWQgdGhlc2UKLW9wY29kZXMuICBIZXJlIGFyZSB0aGUgbW5lbW9uaWNzLCBhbmQgdGhlIGNvZGUgdGhleSBjYW4gZXhwYW5kIGludG8uCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gamJzYgotQHNhbXB7SnNifSBpcyBhbHJlYWR5IGFuIGluc3RydWN0aW9uIG1uZW1vbmljLCBzbyB3ZSBjaG9zZSBAc2FtcHtqYnNifS4KLUB0YWJsZSBAYXNpcwotQGl0ZW0gKGJ5dGUgZGlzcGxhY2VtZW50KQotQGtiZHtic2JiIEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JzYncgQGRvdHN7fX0KLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBrYmR7anNiIEBkb3Rze319Ci1AZW5kIHRhYmxlCi1AaXRlbSBqYnIKLUBpdGVteCBqcgotVW5jb25kaXRpb25hbCBicmFuY2guCi1AdGFibGUgQGFzaXMKLUBpdGVtIChieXRlIGRpc3BsYWNlbWVudCkKLUBrYmR7YnJiIEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JydyBAZG90c3t9fQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGtiZHtqbXAgQGRvdHN7fX0KLUBlbmQgdGFibGUKLUBpdGVtIGpAdmFye0NPTkR9Ci1AdmFye0NPTkR9IG1heSBiZSBhbnkgb25lIG9mIHRoZSBjb25kaXRpb25hbCBicmFuY2hlcwotQGNvZGV7bmVxfSwgQGNvZGV7bmVxdX0sIEBjb2Rle2VxbH0sIEBjb2Rle2VxbHV9LCBAY29kZXtndHJ9LAotQGNvZGV7Z2VxfSwgQGNvZGV7bHNzfSwgQGNvZGV7Z3RydX0sIEBjb2Rle2xlcXV9LCBAY29kZXt2Y30sIEBjb2Rle3ZzfSwKLUBjb2Rle2dlcXV9LCBAY29kZXtjY30sIEBjb2Rle2xzc3V9LCBAY29kZXtjc30uCi1AdmFye0NPTkR9IG1heSBhbHNvIGJlIG9uZSBvZiB0aGUgYml0IHRlc3RzCi1AY29kZXtic30sIEBjb2Rle2JjfSwgQGNvZGV7YnNzfSwgQGNvZGV7YmNzfSwgQGNvZGV7YnNjfSwgQGNvZGV7YmNjfSwKLUBjb2Rle2Jzc2l9LCBAY29kZXtiY2NpfSwgQGNvZGV7bGJzfSwgQGNvZGV7bGJjfS4KLUB2YXJ7Tk9UQ09ORH0gaXMgdGhlIG9wcG9zaXRlIGNvbmRpdGlvbiB0byBAdmFye0NPTkR9LgotQHRhYmxlIEBhc2lzCi1AaXRlbSAoYnl0ZSBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JAdmFye0NPTkR9IEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JAdmFye05PVENPTkR9IGZvbyA7IGJydyBAZG90c3t9IDsgZm9vOn0KLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBrYmR7YkB2YXJ7Tk9UQ09ORH0gZm9vIDsgam1wIEBkb3Rze30gOyBmb286fQotQGVuZCB0YWJsZQotQGl0ZW0gamFjYkB2YXJ7WH0KLUB2YXJ7WH0gbWF5IGJlIG9uZSBvZiBAY29kZXtiIGQgZiBnIGggbCB3fS4KLUB0YWJsZSBAYXNpcwotQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQotQGtiZHtAdmFye09QQ09ERX0gQGRvdHN7fX0KLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBleGFtcGxlCi1AdmFye09QQ09ERX0gQGRvdHN7fSwgZm9vIDsKLWJyYiBiYXIgOwotZm9vOiBqbXAgQGRvdHN7fSA7Ci1iYXI6Ci1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLUBpdGVtIGphb2JAdmFye1lZWX0KLUB2YXJ7WVlZfSBtYXkgYmUgb25lIG9mIEBjb2Rle2xzcyBsZXF9LgotQGl0ZW0ganNvYkB2YXJ7WlpafQotQHZhcntaWlp9IG1heSBiZSBvbmUgb2YgQGNvZGV7Z2VxIGd0cn0uCi1AdGFibGUgQGFzaXMKLUBpdGVtIChieXRlIGRpc3BsYWNlbWVudCkKLUBrYmR7QHZhcntPUENPREV9IEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1AZXhhbXBsZQotQHZhcntPUENPREV9IEBkb3Rze30sIGZvbyA7Ci1icmIgYmFyIDsKLWZvbzogYnJ3IEB2YXJ7ZGVzdGluYXRpb259IDsKLWJhcjoKLUBlbmQgZXhhbXBsZQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGV4YW1wbGUKLUB2YXJ7T1BDT0RFfSBAZG90c3t9LCBmb28gOwotYnJiIGJhciA7Ci1mb286IGptcCBAdmFye2Rlc3RpbmF0aW9ufSA7Ci1iYXI6Ci1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLUBpdGVtIGFvYmxlcQotQGl0ZW14IGFvYmxzcwotQGl0ZW14IHNvYmdlcQotQGl0ZW14IHNvYmd0cgotQHRhYmxlIEBhc2lzCi1AaXRlbSAoYnl0ZSBkaXNwbGFjZW1lbnQpCi1Aa2Jke0B2YXJ7T1BDT0RFfSBAZG90c3t9fQotQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQotQGV4YW1wbGUKLUB2YXJ7T1BDT0RFfSBAZG90c3t9LCBmb28gOwotYnJiIGJhciA7Ci1mb286IGJydyBAdmFye2Rlc3RpbmF0aW9ufSA7Ci1iYXI6Ci1AZW5kIGV4YW1wbGUKLUBpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKLUBleGFtcGxlCi1AdmFye09QQ09ERX0gQGRvdHN7fSwgZm9vIDsKLWJyYiBiYXIgOwotZm9vOiBqbXAgQHZhcntkZXN0aW5hdGlvbn0gOwotYmFyOgotQGVuZCBleGFtcGxlCi1AZW5kIHRhYmxlCi1AZW5kIHRhYmxlCi0KLUBub2RlIFZBWC1vcGVyYW5kcwotQHNlY3Rpb24gVkFYIE9wZXJhbmRzCi0KLUBjaW5kZXggVkFYIG9wZXJhbmQgbm90YXRpb24KLUBjaW5kZXggb3BlcmFuZCBub3RhdGlvbiwgVkFYCi1AY2luZGV4IGltbWVkaWF0ZSBjaGFyYWN0ZXIsIFZBWAotQGNpbmRleCBWQVggaW1tZWRpYXRlIGNoYXJhY3RlcgotVGhlIGltbWVkaWF0ZSBjaGFyYWN0ZXIgaXMgQHNhbXB7JH0gZm9yIFVuaXggY29tcGF0aWJpbGl0eSwgbm90Ci1Ac2FtcHsjfSBhcyBERUMgd3JpdGVzIGl0LgotCi1AY2luZGV4IGluZGlyZWN0IGNoYXJhY3RlciwgVkFYCi1AY2luZGV4IFZBWCBpbmRpcmVjdCBjaGFyYWN0ZXIKLVRoZSBpbmRpcmVjdCBjaGFyYWN0ZXIgaXMgQHNhbXB7Kn0gZm9yIFVuaXggY29tcGF0aWJpbGl0eSwgbm90Ci1Ac2FtcHtAQH0gYXMgREVDIHdyaXRlcyBpdC4KLQotQGNpbmRleCBkaXNwbGFjZW1lbnQgc2l6aW5nIGNoYXJhY3RlciwgVkFYCi1AY2luZGV4IFZBWCBkaXNwbGFjZW1lbnQgc2l6aW5nIGNoYXJhY3RlcgotVGhlIGRpc3BsYWNlbWVudCBzaXppbmcgY2hhcmFjdGVyIGlzIEBzYW1we2B9IChhbiBhY2NlbnQgZ3JhdmUpIGZvcgotVW5peCBjb21wYXRpYmlsaXR5LCBub3QgQHNhbXB7Xn0gYXMgREVDIHdyaXRlcyBpdC4gIFRoZSBsZXR0ZXIKLXByZWNlZGluZyBAc2FtcHtgfSBtYXkgaGF2ZSBlaXRoZXIgY2FzZS4gIEBzYW1we0d9IGlzIG5vdAotdW5kZXJzdG9vZCwgYnV0IGFsbCBvdGhlciBsZXR0ZXJzIChAY29kZXtiIGkgbCBzIHd9KSBhcmUgdW5kZXJzdG9vZC4KLQotQGNpbmRleCByZWdpc3RlciBuYW1lcywgVkFYCi1AY2luZGV4IFZBWCByZWdpc3RlciBuYW1lcwotUmVnaXN0ZXIgbmFtZXMgdW5kZXJzdG9vZCBhcmUgQGNvZGV7cjAgcjEgcjIgQGRvdHN7fSByMTUgYXAgZnAgc3AKLXBjfS4gIFVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcnMgYXJlIGVxdWl2YWxlbnQuCi0KLUZvciBpbnN0YW5jZQotQHNtYWxsZXhhbXBsZQotdHN0YiAqd2AkNChyNSkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUFueSBleHByZXNzaW9uIGlzIHBlcm1pdHRlZCBpbiBhbiBvcGVyYW5kLiAgT3BlcmFuZHMgYXJlIGNvbW1hCi1zZXBhcmF0ZWQuCi0KLUBjIFRoZXJlIGlzIHNvbWUgYnVnIHRvIGRvIHdpdGggcmVjb2duaXppbmcgZXhwcmVzc2lvbnMKLUBjIGluIG9wZXJhbmRzLCBidXQgSSBmb3JnZXQgd2hhdCBpdCBpcy4gIEl0IGlzCi1AYyBhIHN5bnRheCBjbGFzaCBiZWNhdXNlICgpIGlzIHVzZWQgYXMgYW4gYWRkcmVzcyBtb2RlCi1AYyBhbmQgdG8gZW5jYXBzdWxhdGUgc3ViLWV4cHJlc3Npb25zLgotCi1Abm9kZSBWQVgtbm8KLUBzZWN0aW9uIE5vdCBTdXBwb3J0ZWQgb24gVkFYCi0KLUBjaW5kZXggVkFYIGJpdGZpZWxkcyBub3Qgc3VwcG9ydGVkCi1AY2luZGV4IGJpdGZpZWxkcywgbm90IHN1cHBvcnRlZCBvbiBWQVgKLVZheCBiaXQgZmllbGRzIGNhbiBub3QgYmUgYXNzZW1ibGVkIHdpdGggQGNvZGV7QHZhbHVle0FTfX0uICBTb21lb25lCi1jYW4gYWRkIHRoZSByZXF1aXJlZCBjb2RlIGlmIHRoZXkgcmVhbGx5IG5lZWQgaXQuCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtejhrLnRleGkgYi9nYXMvZG9jL2MtejhrLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYjEwZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXo4ay50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBaODAwMC1EZXBlbmRlbnQKLUBjaGFwdGVyIFo4MDAwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIFo4MDAwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggWjgwMDAgc3VwcG9ydAotVGhlIFo4MDAwIEB2YWx1ZXtBU30gc3VwcG9ydHMgYm90aCBtZW1iZXJzIG9mIHRoZSBaODAwMCBmYW1pbHk6IHRoZQotdW5zZWdtZW50ZWQgWjgwMDIsIHdpdGggMTYgYml0IGFkZHJlc3NlcywgYW5kIHRoZSBzZWdtZW50ZWQgWjgwMDEgd2l0aAotMjQgYml0IGFkZHJlc3Nlcy4KLQotV2hlbiB0aGUgYXNzZW1ibGVyIGlzIGluIHVuc2VnbWVudGVkIG1vZGUgKHNwZWNpZmllZCB3aXRoIHRoZQotQGNvZGV7dW5zZWdtfSBkaXJlY3RpdmUpLCBhbiBhZGRyZXNzIHRha2VzIHVwIG9uZSB3b3JkICgxNiBiaXQpCi1zaXplZCByZWdpc3Rlci4gIFdoZW4gdGhlIGFzc2VtYmxlciBpcyBpbiBzZWdtZW50ZWQgbW9kZSAoc3BlY2lmaWVkIHdpdGgKLXRoZSBAY29kZXtzZWdtfSBkaXJlY3RpdmUpLCBhIDI0LWJpdCBhZGRyZXNzIHRha2VzIHVwIGEgbG9uZyAoMzIgYml0KQotcmVnaXN0ZXIuICBAeHJlZntaODAwMCBEaXJlY3RpdmVzLCxBc3NlbWJsZXIgRGlyZWN0aXZlcyBmb3IgdGhlIFo4MDAwfSwKLWZvciBhIGxpc3Qgb2Ygb3RoZXIgWjgwMDAgc3BlY2lmaWMgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuCi0KLUBtZW51Ci0qIFo4MDAwIE9wdGlvbnM6OiAgICAgICAgICAgICAgIE5vIHNwZWNpYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIFo4MDAwCi0qIFo4MDAwIFN5bnRheDo6ICAgICAgICAgICAgICAgIEFzc2VtYmxlciBzeW50YXggZm9yIHRoZSBaODAwMAotKiBaODAwMCBEaXJlY3RpdmVzOjogICAgICAgICAgICBTcGVjaWFsIGRpcmVjdGl2ZXMgZm9yIHRoZSBaODAwMAotKiBaODAwMCBPcGNvZGVzOjogICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgWjgwMDAgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IFo4MDAwIG9wdGlvbnMKLUBjaW5kZXggb3B0aW9ucywgWjgwMDAKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgWmlsb2cKLVo4MDAwIGZhbWlseS4KLQotQG5vZGUgWjgwMDAgU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBtZW51Ci0qIFo4MDAwLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIFo4MDAwLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLSogWjgwMDAtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgWjgwMDAtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIFo4MDAwCi1AY2luZGV4IFo4MDAwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1weyF9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1AY2luZGV4IGxpbmUgc2VwYXJhdG9yLCBaODAwMAotQGNpbmRleCBzdGF0ZW1lbnQgc2VwYXJhdG9yLCBaODAwMAotQGNpbmRleCBaODAwMCBsaW5lIHNlcGFyYXRvcgotWW91IGNhbiB1c2UgQHNhbXB7O30gaW5zdGVhZCBvZiBhIG5ld2xpbmUgdG8gc2VwYXJhdGUgc3RhdGVtZW50cy4KLQotQG5vZGUgWjgwMDAtUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBaODAwMCByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXJzLCBaODAwMAotVGhlIFo4MDAwIGhhcyBzaXh0ZWVuIDE2IGJpdCByZWdpc3RlcnMsIG51bWJlcmVkIDAgdG8gMTUuICBZb3UgY2FuIHJlZmVyCi10byBkaWZmZXJlbnQgc2l6ZWQgZ3JvdXBzIG9mIHJlZ2lzdGVycyBieSByZWdpc3RlciBudW1iZXIsIHdpdGggdGhlCi1wcmVmaXggQHNhbXB7cn0gZm9yIDE2IGJpdCByZWdpc3RlcnMsIEBzYW1we3JyfSBmb3IgMzIgYml0IHJlZ2lzdGVycyBhbmQKLUBzYW1we3JxfSBmb3IgNjQgYml0IHJlZ2lzdGVycy4gIFlvdSBjYW4gYWxzbyByZWZlciB0byB0aGUgY29udGVudHMgb2YKLXRoZSBmaXJzdCBlaWdodCAob2YgdGhlIHNpeHRlZW4gMTYgYml0IHJlZ2lzdGVycykgYnkgYnl0ZXMuICBUaGV5IGFyZQotbmFtZWQgQHNhbXB7ckB2YXJ7bn1ofSBhbmQgQHNhbXB7ckB2YXJ7bn1sfS4KLQotQHNtYWxsZXhhbXBsZQotQGV4ZGVudCBAZW1waHtieXRlIHJlZ2lzdGVyc30KLXIwbCByMGggcjFoIHIxbCByMmggcjJsIHIzaCByM2wKLXI0aCByNGwgcjVoIHI1bCByNmggcjZsIHI3aCByN2wKLQotQGV4ZGVudCBAZW1waHt3b3JkIHJlZ2lzdGVyc30KLXIwIHIxIHIyIHIzIHI0IHI1IHI2IHI3IHI4IHI5IHIxMCByMTEgcjEyIHIxMyByMTQgcjE1Ci0KLUBleGRlbnQgQGVtcGh7bG9uZyB3b3JkIHJlZ2lzdGVyc30KLXJyMCBycjIgcnI0IHJyNiBycjggcnIxMCBycjEyIHJyMTQKLQotQGV4ZGVudCBAZW1waHtxdWFkIHdvcmQgcmVnaXN0ZXJzfQotcnEwIHJxNCBycTggcnExMgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgWjgwMDAtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIFo4MDAwCi1AY2luZGV4IFo4MDAgYWRkcmVzc2luZyBtb2RlcwotQHZhbHVle0FTfSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBaODAwMDoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSByQHZhcntufQotUmVnaXN0ZXIgZGlyZWN0Ci0KLUBpdGVtIEBAckB2YXJ7bn0KLUluZGlyZWN0IHJlZ2lzdGVyCi0KLUBpdGVtIEB2YXJ7YWRkcn0KLURpcmVjdDogdGhlIDE2IGJpdCBvciAyNCBiaXQgYWRkcmVzcyAoZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGFzc2VtYmxlcgotaXMgaW4gc2VnbWVudGVkIG9yIHVuc2VnbWVudGVkIG1vZGUpIG9mIHRoZSBvcGVyYW5kIGlzIGluIHRoZSBpbnN0cnVjdGlvbi4KLQotQGl0ZW0gYWRkcmVzcyhyQHZhcntufSkKLUluZGV4ZWQ6IHRoZSAxNiBvciAyNCBiaXQgYWRkcmVzcyBpcyBhZGRlZCB0byB0aGUgMTYgYml0IHJlZ2lzdGVyIHRvIHByb2R1Y2UKLXRoZSBmaW5hbCBhZGRyZXNzIGluIG1lbW9yeSBvZiB0aGUgb3BlcmFuZC4KLQotQGl0ZW0gckB2YXJ7bn0oI0B2YXJ7aW1tfSkKLUJhc2UgQWRkcmVzczogdGhlIDE2IG9yIDI0IGJpdCByZWdpc3RlciBpcyBhZGRlZCB0byB0aGUgMTYgYml0IHNpZ24KLWV4dGVuZGVkIGltbWVkaWF0ZSBkaXNwbGFjZW1lbnQgdG8gcHJvZHVjZSB0aGUgZmluYWwgYWRkcmVzcyBpbiBtZW1vcnkKLW9mIHRoZSBvcGVyYW5kLgotCi1AaXRlbSByQHZhcntufShyQHZhcnttfSkKLUJhc2UgSW5kZXg6IHRoZSAxNiBvciAyNCBiaXQgcmVnaXN0ZXIgckB2YXJ7bn0gaXMgYWRkZWQgdG8gdGhlIHNpZ24KLWV4dGVuZGVkIDE2IGJpdCBpbmRleCByZWdpc3RlciByQHZhcnttfSB0byBwcm9kdWNlIHRoZSBmaW5hbCBhZGRyZXNzIGluCi1tZW1vcnkgb2YgdGhlIG9wZXJhbmQuCi0KLUBpdGVtICNAdmFye3h4fQotSW1tZWRpYXRlIGRhdGEgQHZhcnt4eH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIFo4MDAwIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEFzc2VtYmxlciBEaXJlY3RpdmVzIGZvciB0aGUgWjgwMDAKLQotQGNpbmRleCBaODAwMCBkaXJlY3RpdmVzCi1AY2luZGV4IGRpcmVjdGl2ZXMsIFo4MDAwCi1UaGUgWjgwMDAgcG9ydCBvZiBAdmFsdWV7QVN9IGluY2x1ZGVzIHRoZXNlIGFkZGl0aW9uYWwgYXNzZW1ibGVyIGRpcmVjdGl2ZXMsCi1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIFo4MDAwIGFzc2VtYmxlcnMuICBBcyBzaG93biwgdGhlc2UgZG8gbm90Ci1iZWdpbiB3aXRoIEBzYW1wey59ICh1bmxpa2UgdGhlIG9yZGluYXJ5IEB2YWx1ZXtBU30gZGlyZWN0aXZlcykuCi0KLUB0YWJsZSBAY29kZQotQGtpbmRleCBzZWdtCi1AaXRlbSBzZWdtCi1HZW5lcmF0ZXMgY29kZSBmb3IgdGhlIHNlZ21lbnRlZCBaODAwMS4KLQotQGtpbmRleCB1bnNlZ20KLUBpdGVtIHVuc2VnbQotR2VuZXJhdGVzIGNvZGUgZm9yIHRoZSB1bnNlZ21lbnRlZCBaODAwMi4KLQotQGtpbmRleCBuYW1lCi1AaXRlbSBuYW1lCi1TeW5vbnltIGZvciBAY29kZXsuZmlsZX0KLQotQGtpbmRleCBnbG9iYWwKLUBpdGVtIGdsb2JhbAotU3lub255bSBmb3IgQGNvZGV7Lmdsb2JhbH0KLQotQGtpbmRleCB3dmFsCi1AaXRlbSB3dmFsCi1TeW5vbnltIGZvciBAY29kZXsud29yZH0KLQotQGtpbmRleCBsdmFsCi1AaXRlbSBsdmFsCi1TeW5vbnltIGZvciBAY29kZXsubG9uZ30KLQotQGtpbmRleCBidmFsCi1AaXRlbSBidmFsCi1TeW5vbnltIGZvciBAY29kZXsuYnl0ZX0KLQotQGtpbmRleCBzdmFsCi1AaXRlbSBzdmFsCi1Bc3NlbWJsZSBhIHN0cmluZy4gIEBjb2Rle3N2YWx9IGV4cGVjdHMgb25lIHN0cmluZyBsaXRlcmFsLCBkZWxpbWl0ZWQgYnkKLXNpbmdsZSBxdW90ZXMuICBJdCBhc3NlbWJsZXMgZWFjaCBieXRlIG9mIHRoZSBzdHJpbmcgaW50byBjb25zZWN1dGl2ZQotYWRkcmVzc2VzLiAgWW91IGNhbiB1c2UgdGhlIGVzY2FwZSBzZXF1ZW5jZSBAc2FtcHslQHZhcnt4eH19ICh3aGVyZQotQHZhcnt4eH0gcmVwcmVzZW50cyBhIHR3by1kaWdpdCBoZXhhZGVjaW1hbCBudW1iZXIpIHRvIHJlcHJlc2VudCB0aGUKLWNoYXJhY3RlciB3aG9zZSBAc2N7YXNjaWl9IHZhbHVlIGlzIEB2YXJ7eHh9LiAgVXNlIHRoaXMgZmVhdHVyZSB0bwotZGVzY3JpYmUgc2luZ2xlIHF1b3RlIGFuZCBvdGhlciBjaGFyYWN0ZXJzIHRoYXQgbWF5IG5vdCBhcHBlYXIgaW4gc3RyaW5nCi1saXRlcmFscyBhcyB0aGVtc2VsdmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBDIHN0YXRlbWVudCBAd3tAc2FtcHtjaGFyICphID0KLSJoZSBzYWlkIFwiaXQncyA1MCUgb2ZmXCIiO319IGlzIHJlcHJlc2VudGVkIGluIFo4MDAwIGFzc2VtYmx5IGxhbmd1YWdlCi0oc2hvd24gd2l0aCB0aGUgYXNzZW1ibGVyIG91dHB1dCBpbiBoZXggYXQgdGhlIGxlZnQpIGFzCi0KLUBpZnRleAotQGJlZ2luZ3JvdXAKLUBsZXRAbm9uYXJyb3dpbmc9QGNvbW1lbnQKLUBlbmQgaWZ0ZXgKLUBzbWFsbGV4YW1wbGUKLTY4NjUyMDczICAgIHN2YWwgICAgJ2hlIHNhaWQgJTIyaXQlMjdzIDUwJTI1IG9mZiUyMiUwMCcKLTYxNjk2NDIwCi0yMjY5NzQyNwotNzMyMDM1MzAKLTI1MjA2RjY2Ci02NjIyMDAKLUBlbmQgc21hbGxleGFtcGxlCi1AaWZ0ZXgKLUBlbmRncm91cAotQGVuZCBpZnRleAotCi1Aa2luZGV4IHJzZWN0Ci1AaXRlbSByc2VjdAotc3lub255bSBmb3IgQGNvZGV7LnNlY3Rpb259Ci0KLUBraW5kZXggYmxvY2sKLUBpdGVtIGJsb2NrCi1zeW5vbnltIGZvciBAY29kZXsuc3BhY2V9Ci0KLUBraW5kZXggZXZlbgotQGl0ZW0gZXZlbgotc3BlY2lhbCBjYXNlIG9mIEBjb2Rley5hbGlnbn07IGFsaWducyBvdXRwdXQgdG8gZXZlbiBieXRlIGJvdW5kYXJ5LgotQGVuZCB0YWJsZQotCi1Abm9kZSBaODAwMCBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggWjgwMDAgb3Bjb2RlIHN1bW1hcnkKLUBjaW5kZXggb3Bjb2RlIHN1bW1hcnksIFo4MDAwCi1AY2luZGV4IG1uZW1vbmljcywgWjgwMDAKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgWjgwMDAKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgWjgwMDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7WjgwMDAgVGVjaG5pY2FsIE1hbnVhbH0uCi0KLUBpZnNldCBTTUFMTAotQGMgdGhpcyB0YWJsZSwgZHVlIHRvIHRoZSBtdWx0aS1jb2wgZmFraW5nIGFuZCBoYXJkY29kZWQgb3JkZXIsIGxvb2tzIHNpbGx5Ci1AYyBleGNlcHQgaW4gc21hbGxib29rLiAgU2VlIGNvbW1lbnRzIGJlbG93ICJAc2V0IFNNQUxMIiBuZWFyIHRvcCBvZiB0aGlzIGZpbGUuCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgb3Bjb2RlcyBhbmQgdGhlaXIgYXJndW1lbnRzOgotQGlmdGV4Ci1AYmVnaW5ncm91cAotQGxldEBub25hcnJvd2luZz1AY29tbWVudAotQGVuZCBpZnRleAotQHNtYWxsZXhhbXBsZQotCi0gICAgICAgICAgICBycyAgIEByezE2IGJpdCBzb3VyY2UgcmVnaXN0ZXJ9Ci0gICAgICAgICAgICByZCAgIEByezE2IGJpdCBkZXN0aW5hdGlvbiByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJicyAgIEByezggYml0IHNvdXJjZSByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJiZCAgIEByezggYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyfQotICAgICAgICAgICAgcnJzICAgQHJ7MzIgYml0IHNvdXJjZSByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJyZCAgIEByezMyIGJpdCBkZXN0aW5hdGlvbiByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJxcyAgIEByezY0IGJpdCBzb3VyY2UgcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBycWQgICBAcns2NCBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBhZGRyIEByezE2LzI0IGJpdCBhZGRyZXNzfQotICAgICAgICAgICAgaW1tICBAcntpbW1lZGlhdGUgZGF0YX0KLQotYWRjIHJkLHJzICAgICAgICAgICAgICAgY2xyYiBhZGRyICAgICAgICAgICAgICAgY3BzaXIgQEByZCxAQHJzLHJyLGNjCi1hZGNiIHJiZCxyYnMgICAgICAgICAgICBjbHJiIGFkZHIocmQpICAgICAgICAgICBjcHNpcmIgQEByZCxAQHJzLHJyLGNjCi1hZGQgcmQsQEBycyAgICAgICAgICAgICAgY2xyYiByYmQgICAgICAgICAgICAgICAgZGFiIHJiZAotYWRkIHJkLGFkZHIgICAgICAgICAgICAgY29tIEBAcmQgICAgICAgICAgICAgICAgIGRiam56IHJiZCxkaXNwNwotYWRkIHJkLGFkZHIocnMpICAgICAgICAgY29tIGFkZHIgICAgICAgICAgICAgICAgZGVjIEBAcmQsaW1tNG0xCi1hZGQgcmQsaW1tMTYgICAgICAgICAgICBjb20gYWRkcihyZCkgICAgICAgICAgICBkZWMgYWRkcihyZCksaW1tNG0xCi1hZGQgcmQscnMgICAgICAgICAgICAgICBjb20gcmQgICAgICAgICAgICAgICAgICBkZWMgYWRkcixpbW00bTEKLWFkZGIgcmJkLEBAcnMgICAgICAgICAgICBjb21iIEBAcmQgICAgICAgICAgICAgICAgZGVjIHJkLGltbTRtMQotYWRkYiByYmQsYWRkciAgICAgICAgICAgY29tYiBhZGRyICAgICAgICAgICAgICAgZGVjYiBAQHJkLGltbTRtMQotYWRkYiByYmQsYWRkcihycykgICAgICAgY29tYiBhZGRyKHJkKSAgICAgICAgICAgZGVjYiBhZGRyKHJkKSxpbW00bTEKLWFkZGIgcmJkLGltbTggICAgICAgICAgIGNvbWIgcmJkICAgICAgICAgICAgICAgIGRlY2IgYWRkcixpbW00bTEKLWFkZGIgcmJkLHJicyAgICAgICAgICAgIGNvbWZsZyBmbGFncyAgICAgICAgICAgIGRlY2IgcmJkLGltbTRtMQotYWRkbCBycmQsQEBycyAgICAgICAgICAgIGNwIEBAcmQsaW1tMTYgICAgICAgICAgICBkaSBpMgotYWRkbCBycmQsYWRkciAgICAgICAgICAgY3AgYWRkcihyZCksaW1tMTYgICAgICAgZGl2IHJyZCxAQHJzCi1hZGRsIHJyZCxhZGRyKHJzKSAgICAgICBjcCBhZGRyLGltbTE2ICAgICAgICAgICBkaXYgcnJkLGFkZHIKLWFkZGwgcnJkLGltbTMyICAgICAgICAgIGNwIHJkLEBAcnMgICAgICAgICAgICAgICBkaXYgcnJkLGFkZHIocnMpCi1hZGRsIHJyZCxycnMgICAgICAgICAgICBjcCByZCxhZGRyICAgICAgICAgICAgICBkaXYgcnJkLGltbTE2Ci1hbmQgcmQsQEBycyAgICAgICAgICAgICAgY3AgcmQsYWRkcihycykgICAgICAgICAgZGl2IHJyZCxycwotYW5kIHJkLGFkZHIgICAgICAgICAgICAgY3AgcmQsaW1tMTYgICAgICAgICAgICAgZGl2bCBycWQsQEBycwotYW5kIHJkLGFkZHIocnMpICAgICAgICAgY3AgcmQscnMgICAgICAgICAgICAgICAgZGl2bCBycWQsYWRkcgotYW5kIHJkLGltbTE2ICAgICAgICAgICAgY3BiIEBAcmQsaW1tOCAgICAgICAgICAgIGRpdmwgcnFkLGFkZHIocnMpCi1hbmQgcmQscnMgICAgICAgICAgICAgICBjcGIgYWRkcihyZCksaW1tOCAgICAgICBkaXZsIHJxZCxpbW0zMgotYW5kYiByYmQsQEBycyAgICAgICAgICAgIGNwYiBhZGRyLGltbTggICAgICAgICAgIGRpdmwgcnFkLHJycwotYW5kYiByYmQsYWRkciAgICAgICAgICAgY3BiIHJiZCxAQHJzICAgICAgICAgICAgIGRqbnogcmQsZGlzcDcKLWFuZGIgcmJkLGFkZHIocnMpICAgICAgIGNwYiByYmQsYWRkciAgICAgICAgICAgIGVpIGkyCi1hbmRiIHJiZCxpbW04ICAgICAgICAgICBjcGIgcmJkLGFkZHIocnMpICAgICAgICBleCByZCxAQHJzCi1hbmRiIHJiZCxyYnMgICAgICAgICAgICBjcGIgcmJkLGltbTggICAgICAgICAgICBleCByZCxhZGRyCi1iaXQgQEByZCxpbW00ICAgICAgICAgICAgY3BiIHJiZCxyYnMgICAgICAgICAgICAgZXggcmQsYWRkcihycykKLWJpdCBhZGRyKHJkKSxpbW00ICAgICAgIGNwZCByZCxAQHJzLHJyLGNjICAgICAgICBleCByZCxycwotYml0IGFkZHIsaW1tNCAgICAgICAgICAgY3BkYiByYmQsQEBycyxycixjYyAgICAgIGV4YiByYmQsQEBycwotYml0IHJkLGltbTQgICAgICAgICAgICAgY3BkciByZCxAQHJzLHJyLGNjICAgICAgIGV4YiByYmQsYWRkcgotYml0IHJkLHJzICAgICAgICAgICAgICAgY3BkcmIgcmJkLEBAcnMscnIsY2MgICAgIGV4YiByYmQsYWRkcihycykKLWJpdGIgQEByZCxpbW00ICAgICAgICAgICBjcGkgcmQsQEBycyxycixjYyAgICAgICAgZXhiIHJiZCxyYnMKLWJpdGIgYWRkcihyZCksaW1tNCAgICAgIGNwaWIgcmJkLEBAcnMscnIsY2MgICAgICBleHQwZSBpbW04Ci1iaXRiIGFkZHIsaW1tNCAgICAgICAgICBjcGlyIHJkLEBAcnMscnIsY2MgICAgICAgZXh0MGYgaW1tOAotYml0YiByYmQsaW1tNCAgICAgICAgICAgY3BpcmIgcmJkLEBAcnMscnIsY2MgICAgIGV4dDhlIGltbTgKLWJpdGIgcmJkLHJzICAgICAgICAgICAgIGNwbCBycmQsQEBycyAgICAgICAgICAgICBleHQ4ZiBpbW04Ci1icHQgICAgICAgICAgICAgICAgICAgICBjcGwgcnJkLGFkZHIgICAgICAgICAgICBleHRzIHJyZAotY2FsbCBAQHJkICAgICAgICAgICAgICAgIGNwbCBycmQsYWRkcihycykgICAgICAgIGV4dHNiIHJkCi1jYWxsIGFkZHIgICAgICAgICAgICAgICBjcGwgcnJkLGltbTMyICAgICAgICAgICBleHRzbCBycWQKLWNhbGwgYWRkcihyZCkgICAgICAgICAgIGNwbCBycmQscnJzICAgICAgICAgICAgIGhhbHQKLWNhbHIgZGlzcDEyICAgICAgICAgICAgIGNwc2QgQEByZCxAQHJzLHJyLGNjICAgICAgaW4gcmQsQEBycwotY2xyIEBAcmQgICAgICAgICAgICAgICAgIGNwc2RiIEBAcmQsQEBycyxycixjYyAgICAgaW4gcmQsaW1tMTYKLWNsciBhZGRyICAgICAgICAgICAgICAgIGNwc2RyIEBAcmQsQEBycyxycixjYyAgICAgaW5iIHJiZCxAQHJzCi1jbHIgYWRkcihyZCkgICAgICAgICAgICBjcHNkcmIgQEByZCxAQHJzLHJyLGNjICAgIGluYiByYmQsaW1tMTYKLWNsciByZCAgICAgICAgICAgICAgICAgIGNwc2kgQEByZCxAQHJzLHJyLGNjICAgICAgaW5jIEBAcmQsaW1tNG0xCi1jbHJiIEBAcmQgICAgICAgICAgICAgICAgY3BzaWIgQEByZCxAQHJzLHJyLGNjICAgICBpbmMgYWRkcihyZCksaW1tNG0xCi1pbmMgYWRkcixpbW00bTEgICAgICAgICBsZGIgcmJkLHJzKHJ4KSAgICAgICAgICBtdWx0IHJyZCxhZGRyKHJzKQotaW5jIHJkLGltbTRtMSAgICAgICAgICAgbGRiIHJkKGltbTE2KSxyYnMgICAgICAgbXVsdCBycmQsaW1tMTYKLWluY2IgQEByZCxpbW00bTEgICAgICAgICBsZGIgcmQocngpLHJicyAgICAgICAgICBtdWx0IHJyZCxycwotaW5jYiBhZGRyKHJkKSxpbW00bTEgICAgbGRjdGwgY3RybCxycyAgICAgICAgICAgbXVsdGwgcnFkLEBAcnMKLWluY2IgYWRkcixpbW00bTEgICAgICAgIGxkY3RsIHJkLGN0cmwgICAgICAgICAgIG11bHRsIHJxZCxhZGRyCi1pbmNiIHJiZCxpbW00bTEgICAgICAgICBsZGQgQEBycyxAQHJkLHJyICAgICAgICAgIG11bHRsIHJxZCxhZGRyKHJzKQotaW5kIEBAcmQsQEBycyxyYSAgICAgICAgICBsZGRiIEBAcnMsQEByZCxyciAgICAgICAgIG11bHRsIHJxZCxpbW0zMgotaW5kYiBAQHJkLEBAcnMscmJhICAgICAgICBsZGRyIEBAcnMsQEByZCxyciAgICAgICAgIG11bHRsIHJxZCxycnMKLWluaWIgQEByZCxAQHJzLHJhICAgICAgICAgbGRkcmIgQEBycyxAQHJkLHJyICAgICAgICBuZWcgQEByZAotaW5pYnIgQEByZCxAQHJzLHJhICAgICAgICBsZGkgQEByZCxAQHJzLHJyICAgICAgICAgIG5lZyBhZGRyCi1pcmV0ICAgICAgICAgICAgICAgICAgICBsZGliIEBAcmQsQEBycyxyciAgICAgICAgIG5lZyBhZGRyKHJkKQotanAgY2MsQEByZCAgICAgICAgICAgICAgIGxkaXIgQEByZCxAQHJzLHJyICAgICAgICAgbmVnIHJkCi1qcCBjYyxhZGRyICAgICAgICAgICAgICBsZGlyYiBAQHJkLEBAcnMscnIgICAgICAgIG5lZ2IgQEByZAotanAgY2MsYWRkcihyZCkgICAgICAgICAgbGRrIHJkLGltbTQgICAgICAgICAgICAgbmVnYiBhZGRyCi1qciBjYyxkaXNwOCAgICAgICAgICAgICBsZGwgQEByZCxycnMgICAgICAgICAgICAgbmVnYiBhZGRyKHJkKQotbGQgQEByZCxpbW0xNiAgICAgICAgICAgIGxkbCBhZGRyKHJkKSxycnMgICAgICAgIG5lZ2IgcmJkCi1sZCBAQHJkLHJzICAgICAgICAgICAgICAgbGRsIGFkZHIscnJzICAgICAgICAgICAgbm9wCi1sZCBhZGRyKHJkKSxpbW0xNiAgICAgICBsZGwgcmQoaW1tMTYpLHJycyAgICAgICBvciByZCxAQHJzCi1sZCBhZGRyKHJkKSxycyAgICAgICAgICBsZGwgcmQocngpLHJycyAgICAgICAgICBvciByZCxhZGRyCi1sZCBhZGRyLGltbTE2ICAgICAgICAgICBsZGwgcnJkLEBAcnMgICAgICAgICAgICAgb3IgcmQsYWRkcihycykKLWxkIGFkZHIscnMgICAgICAgICAgICAgIGxkbCBycmQsYWRkciAgICAgICAgICAgIG9yIHJkLGltbTE2Ci1sZCByZChpbW0xNikscnMgICAgICAgICBsZGwgcnJkLGFkZHIocnMpICAgICAgICBvciByZCxycwotbGQgcmQocngpLHJzICAgICAgICAgICAgbGRsIHJyZCxpbW0zMiAgICAgICAgICAgb3JiIHJiZCxAQHJzCi1sZCByZCxAQHJzICAgICAgICAgICAgICAgbGRsIHJyZCxycnMgICAgICAgICAgICAgb3JiIHJiZCxhZGRyCi1sZCByZCxhZGRyICAgICAgICAgICAgICBsZGwgcnJkLHJzKGltbTE2KSAgICAgICBvcmIgcmJkLGFkZHIocnMpCi1sZCByZCxhZGRyKHJzKSAgICAgICAgICBsZGwgcnJkLHJzKHJ4KSAgICAgICAgICBvcmIgcmJkLGltbTgKLWxkIHJkLGltbTE2ICAgICAgICAgICAgIGxkbSBAQHJkLHJzLG4gICAgICAgICAgICBvcmIgcmJkLHJicwotbGQgcmQscnMgICAgICAgICAgICAgICAgbGRtIGFkZHIocmQpLHJzLG4gICAgICAgb3V0IEBAcmQscnMKLWxkIHJkLHJzKGltbTE2KSAgICAgICAgIGxkbSBhZGRyLHJzLG4gICAgICAgICAgIG91dCBpbW0xNixycwotbGQgcmQscnMocngpICAgICAgICAgICAgbGRtIHJkLEBAcnMsbiAgICAgICAgICAgIG91dGIgQEByZCxyYnMKLWxkYSByZCxhZGRyICAgICAgICAgICAgIGxkbSByZCxhZGRyKHJzKSxuICAgICAgIG91dGIgaW1tMTYscmJzCi1sZGEgcmQsYWRkcihycykgICAgICAgICBsZG0gcmQsYWRkcixuICAgICAgICAgICBvdXRkIEBAcmQsQEBycyxyYQotbGRhIHJkLHJzKGltbTE2KSAgICAgICAgbGRwcyBAQHJzICAgICAgICAgICAgICAgIG91dGRiIEBAcmQsQEBycyxyYmEKLWxkYSByZCxycyhyeCkgICAgICAgICAgIGxkcHMgYWRkciAgICAgICAgICAgICAgIG91dGliIEBAcmQsQEBycyxyYQotbGRhciByZCxkaXNwMTYgICAgICAgICAgbGRwcyBhZGRyKHJzKSAgICAgICAgICAgb3V0aWJyIEBAcmQsQEBycyxyYQotbGRiIEBAcmQsaW1tOCAgICAgICAgICAgIGxkciBkaXNwMTYscnMgICAgICAgICAgIHBvcCBAQHJkLEBAcnMKLWxkYiBAQHJkLHJicyAgICAgICAgICAgICBsZHIgcmQsZGlzcDE2ICAgICAgICAgICBwb3AgYWRkcihyZCksQEBycwotbGRiIGFkZHIocmQpLGltbTggICAgICAgbGRyYiBkaXNwMTYscmJzICAgICAgICAgcG9wIGFkZHIsQEBycwotbGRiIGFkZHIocmQpLHJicyAgICAgICAgbGRyYiByYmQsZGlzcDE2ICAgICAgICAgcG9wIHJkLEBAcnMKLWxkYiBhZGRyLGltbTggICAgICAgICAgIGxkcmwgZGlzcDE2LHJycyAgICAgICAgIHBvcGwgQEByZCxAQHJzCi1sZGIgYWRkcixyYnMgICAgICAgICAgICBsZHJsIHJyZCxkaXNwMTYgICAgICAgICBwb3BsIGFkZHIocmQpLEBAcnMKLWxkYiByYmQsQEBycyAgICAgICAgICAgICBtYml0ICAgICAgICAgICAgICAgICAgICBwb3BsIGFkZHIsQEBycwotbGRiIHJiZCxhZGRyICAgICAgICAgICAgbXJlcSByZCAgICAgICAgICAgICAgICAgcG9wbCBycmQsQEBycwotbGRiIHJiZCxhZGRyKHJzKSAgICAgICAgbXJlcyAgICAgICAgICAgICAgICAgICAgcHVzaCBAQHJkLEBAcnMKLWxkYiByYmQsaW1tOCAgICAgICAgICAgIG1zZXQgICAgICAgICAgICAgICAgICAgIHB1c2ggQEByZCxhZGRyCi1sZGIgcmJkLHJicyAgICAgICAgICAgICBtdWx0IHJyZCxAQHJzICAgICAgICAgICAgcHVzaCBAQHJkLGFkZHIocnMpCi1sZGIgcmJkLHJzKGltbTE2KSAgICAgICBtdWx0IHJyZCxhZGRyICAgICAgICAgICBwdXNoIEBAcmQsaW1tMTYKLXB1c2ggQEByZCxycyAgICAgICAgICAgICBzZXQgYWRkcixpbW00ICAgICAgICAgICBzdWJsIHJyZCxpbW0zMgotcHVzaGwgQEByZCxAQHJzICAgICAgICAgICBzZXQgcmQsaW1tNCAgICAgICAgICAgICBzdWJsIHJyZCxycnMKLXB1c2hsIEBAcmQsYWRkciAgICAgICAgICBzZXQgcmQscnMgICAgICAgICAgICAgICB0Y2MgY2MscmQKLXB1c2hsIEBAcmQsYWRkcihycykgICAgICBzZXRiIEBAcmQsaW1tNCAgICAgICAgICAgdGNjYiBjYyxyYmQKLXB1c2hsIEBAcmQscnJzICAgICAgICAgICBzZXRiIGFkZHIocmQpLGltbTQgICAgICB0ZXN0IEBAcmQKLXJlcyBAQHJkLGltbTQgICAgICAgICAgICBzZXRiIGFkZHIsaW1tNCAgICAgICAgICB0ZXN0IGFkZHIKLXJlcyBhZGRyKHJkKSxpbW00ICAgICAgIHNldGIgcmJkLGltbTQgICAgICAgICAgIHRlc3QgYWRkcihyZCkKLXJlcyBhZGRyLGltbTQgICAgICAgICAgIHNldGIgcmJkLHJzICAgICAgICAgICAgIHRlc3QgcmQKLXJlcyByZCxpbW00ICAgICAgICAgICAgIHNldGZsZyBpbW00ICAgICAgICAgICAgIHRlc3RiIEBAcmQKLXJlcyByZCxycyAgICAgICAgICAgICAgIHNpbmIgcmJkLGltbTE2ICAgICAgICAgIHRlc3RiIGFkZHIKLXJlc2IgQEByZCxpbW00ICAgICAgICAgICBzaW5iIHJkLGltbTE2ICAgICAgICAgICB0ZXN0YiBhZGRyKHJkKQotcmVzYiBhZGRyKHJkKSxpbW00ICAgICAgc2luZCBAQHJkLEBAcnMscmEgICAgICAgICB0ZXN0YiByYmQKLXJlc2IgYWRkcixpbW00ICAgICAgICAgIHNpbmRiIEBAcmQsQEBycyxyYmEgICAgICAgdGVzdGwgQEByZAotcmVzYiByYmQsaW1tNCAgICAgICAgICAgc2luaWIgQEByZCxAQHJzLHJhICAgICAgICB0ZXN0bCBhZGRyCi1yZXNiIHJiZCxycyAgICAgICAgICAgICBzaW5pYnIgQEByZCxAQHJzLHJhICAgICAgIHRlc3RsIGFkZHIocmQpCi1yZXNmbGcgaW1tNCAgICAgICAgICAgICBzbGEgcmQsaW1tOCAgICAgICAgICAgICB0ZXN0bCBycmQKLXJldCBjYyAgICAgICAgICAgICAgICAgIHNsYWIgcmJkLGltbTggICAgICAgICAgIHRyZGIgQEByZCxAQHJzLHJiYQotcmwgcmQsaW1tMW9yMiAgICAgICAgICAgc2xhbCBycmQsaW1tOCAgICAgICAgICAgdHJkcmIgQEByZCxAQHJzLHJiYQotcmxiIHJiZCxpbW0xb3IyICAgICAgICAgc2xsIHJkLGltbTggICAgICAgICAgICAgdHJpYiBAQHJkLEBAcnMscmJyCi1ybGMgcmQsaW1tMW9yMiAgICAgICAgICBzbGxiIHJiZCxpbW04ICAgICAgICAgICB0cmlyYiBAQHJkLEBAcnMscmJyCi1ybGNiIHJiZCxpbW0xb3IyICAgICAgICBzbGxsIHJyZCxpbW04ICAgICAgICAgICB0cnRkcmIgQEByYSxAQHJiLHJicgotcmxkYiByYmIscmJhICAgICAgICAgICAgc291dCBpbW0xNixycyAgICAgICAgICAgdHJ0aWIgQEByYSxAQHJiLHJyCi1yciByZCxpbW0xb3IyICAgICAgICAgICBzb3V0YiBpbW0xNixyYnMgICAgICAgICB0cnRpcmIgQEByYSxAQHJiLHJicgotcnJiIHJiZCxpbW0xb3IyICAgICAgICAgc291dGQgQEByZCxAQHJzLHJhICAgICAgICB0cnRyYiBAQHJhLEBAcmIscmJyCi1ycmMgcmQsaW1tMW9yMiAgICAgICAgICBzb3V0ZGIgQEByZCxAQHJzLHJiYSAgICAgIHRzZXQgQEByZAotcnJjYiByYmQsaW1tMW9yMiAgICAgICAgc291dGliIEBAcmQsQEBycyxyYSAgICAgICB0c2V0IGFkZHIKLXJyZGIgcmJiLHJiYSAgICAgICAgICAgIHNvdXRpYnIgQEByZCxAQHJzLHJhICAgICAgdHNldCBhZGRyKHJkKQotcnN2ZDM2ICAgICAgICAgICAgICAgICAgc3JhIHJkLGltbTggICAgICAgICAgICAgdHNldCByZAotcnN2ZDM4ICAgICAgICAgICAgICAgICAgc3JhYiByYmQsaW1tOCAgICAgICAgICAgdHNldGIgQEByZAotcnN2ZDc4ICAgICAgICAgICAgICAgICAgc3JhbCBycmQsaW1tOCAgICAgICAgICAgdHNldGIgYWRkcgotcnN2ZDdlICAgICAgICAgICAgICAgICAgc3JsIHJkLGltbTggICAgICAgICAgICAgdHNldGIgYWRkcihyZCkKLXJzdmQ5ZCAgICAgICAgICAgICAgICAgIHNybGIgcmJkLGltbTggICAgICAgICAgIHRzZXRiIHJiZAotcnN2ZDlmICAgICAgICAgICAgICAgICAgc3JsbCBycmQsaW1tOCAgICAgICAgICAgeG9yIHJkLEBAcnMKLXJzdmRiOSAgICAgICAgICAgICAgICAgIHN1YiByZCxAQHJzICAgICAgICAgICAgICB4b3IgcmQsYWRkcgotcnN2ZGJmICAgICAgICAgICAgICAgICAgc3ViIHJkLGFkZHIgICAgICAgICAgICAgeG9yIHJkLGFkZHIocnMpCi1zYmMgcmQscnMgICAgICAgICAgICAgICBzdWIgcmQsYWRkcihycykgICAgICAgICB4b3IgcmQsaW1tMTYKLXNiY2IgcmJkLHJicyAgICAgICAgICAgIHN1YiByZCxpbW0xNiAgICAgICAgICAgIHhvciByZCxycwotc2MgaW1tOCAgICAgICAgICAgICAgICAgc3ViIHJkLHJzICAgICAgICAgICAgICAgeG9yYiByYmQsQEBycwotc2RhIHJkLHJzICAgICAgICAgICAgICAgc3ViYiByYmQsQEBycyAgICAgICAgICAgIHhvcmIgcmJkLGFkZHIKLXNkYWIgcmJkLHJzICAgICAgICAgICAgIHN1YmIgcmJkLGFkZHIgICAgICAgICAgIHhvcmIgcmJkLGFkZHIocnMpCi1zZGFsIHJyZCxycyAgICAgICAgICAgICBzdWJiIHJiZCxhZGRyKHJzKSAgICAgICB4b3JiIHJiZCxpbW04Ci1zZGwgcmQscnMgICAgICAgICAgICAgICBzdWJiIHJiZCxpbW04ICAgICAgICAgICB4b3JiIHJiZCxyYnMKLXNkbGIgcmJkLHJzICAgICAgICAgICAgIHN1YmIgcmJkLHJicyAgICAgICAgICAgIHhvcmIgcmJkLHJicwotc2RsbCBycmQscnMgICAgICAgICAgICAgc3VibCBycmQsQEBycwotc2V0IEBAcmQsaW1tNCAgICAgICAgICAgIHN1YmwgcnJkLGFkZHIKLXNldCBhZGRyKHJkKSxpbW00ICAgICAgIHN1YmwgcnJkLGFkZHIocnMpCi1AZW5kIHNtYWxsZXhhbXBsZQotQGlmdGV4Ci1AZW5kZ3JvdXAKLUBlbmQgaWZ0ZXgKLUBlbmQgaWZzZXQKLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9nYXNwLnRleGkgYi9nYXMvZG9jL2dhc3AudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjZDZmNC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2dhc3AudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDEwODYgKzAsMCBAQAotXGlucHV0IHRleGluZm8gICAgICAgICAgICAgICBAYyAgICAgICAgICAgICAtKi0gVGV4aW5mbyAtKi0KLUBzZXRmaWxlbmFtZSBnYXNwLmluZm8KLUBjCi1AYyBUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBhc3NlbWJseSBwcmVwcm9jZXNzb3IgIkdBU1AiCi1AYwotQGMgQ29weXJpZ2h0IChjKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMKLUBjIFRoaXMgdGV4dCBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi1AYyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi1AaWZpbmZvCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBnYXNwOiAoZ2FzcCkuICAgICAgICAgICAgICAgICAgICAgVGhlIEdOVSBBc3NlbWJsZXIgUHJlcHJvY2Vzc29yCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1Ac3luY29kZWluZGV4IGt5IGNwCi1Ac3luY29kZWluZGV4IGZuIGNwCi0KLUBmaW5hbG91dAotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldHRpdGxlIEdBU1AKLUB0aXRsZXBhZ2UKLUBjIEZJWE1FIGJvcmluZyB0aXRsZQotQHRpdGxlIEdBU1AsIGFuIGFzc2VtYmx5IHByZXByb2Nlc3NvcgotQHN1YnRpdGxlIGZvciBHQVNQIHZlcnNpb24gMQotQHNwIDEKLUBzdWJ0aXRsZSBNYXJjaCAxOTk0Ci1AYXV0aG9yIFJvbGFuZCBQZXNjaAotQHBhZ2UKLQotQHRleAote1xwYXJza2lwPTBwdCBcaGZpbGwgQ3lnbnVzIFN1cHBvcnRccGFyCi19Ci1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLQotQGlmaW5mbwotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRlWCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGEgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLUBlbmQgaWdub3JlCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Ci10aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLQotQG5vZGUgVG9wCi1AdG9wIEdBU1AKLQotR0FTUCBpcyBhIHByZXByb2Nlc3NvciBmb3IgYXNzZW1ibHkgcHJvZ3JhbXMuCi0KLVRoaXMgZmlsZSBkZXNjcmliZXMgdmVyc2lvbiAxIG9mIEdBU1AuCi0KLVN0ZXZlIENoYW1iZXJsYWluIHdyb3RlIEdBU1A7IFJvbGFuZCBQZXNjaCB3cm90ZSB0aGlzIG1hbnVhbC4KLQotQG1lbnUKLSogT3ZlcnZpZXc6OiAgICAgICAgICAgICAgICAgICAgV2hhdCBpcyBHQVNQPwotKiBJbnZva2luZyBHQVNQOjogICAgICAgICAgICAgICBDb21tYW5kIGxpbmUgb3B0aW9ucy4KLSogQ29tbWFuZHM6OiAgICAgICAgICAgICAgICAgICAgUHJlcHJvY2Vzc29yIGNvbW1hbmRzLgotKiBJbmRleDo6ICAgICAgICAgICAgICAgICAgICAgICBJbmRleC4KLUBlbmQgbWVudQotQGVuZCBpZmluZm8KLQotQG5vZGUgT3ZlcnZpZXcKLUBjaGFwdGVyIFdoYXQgaXMgR0FTUD8KLQotVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGUgQHNje2dudX0gYXNzZW1ibGVyIGlzIHRvIGFzc2VtYmxlIHRoZSBvdXRwdXQgb2YKLW90aGVyIHByb2dyYW1zLS0tbm90YWJseSBjb21waWxlcnMuICBXaGVuIHlvdSBoYXZlIHRvIGhhbmQtY29kZQotc3BlY2lhbGl6ZWQgcm91dGluZXMgaW4gYXNzZW1ibHksIHRoYXQgbWVhbnMgdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBpcwotYW4gdW5mcmllbmRseSBwcm9jZXNzb3I6IGl0IGhhcyBubyBkaXJlY3RpdmVzIGZvciBtYWNyb3MsIGNvbmRpdGlvbmFscywKLW9yIG1hbnkgb3RoZXIgY29udmVuaWVuY2VzIHRoYXQgeW91IG1pZ2h0IGV4cGVjdC4KLQotSW4gc29tZSBjYXNlcyB5b3UgY2FuIHNpbXBseSB1c2UgdGhlIEMgcHJlcHJvY2Vzc29yLCBvciBhIGdlbmVyYWxpemVkCi1wcmVwcm9jZXNzb3IgbGlrZSBAc2N7bTR9OyBidXQgdGhpcyBjYW4gYmUgYXdrd2FyZCwgc2luY2Ugbm9uZSBvZiB0aGVzZQotdGhpbmdzIGFyZSBkZXNpZ25lZCB3aXRoIGFzc2VtYmx5IGluIG1pbmQuCi0KLUBzY3tnYXNwfSBmaWxscyB0aGlzIG5lZWQuICBJdCBpcyBleHByZXNzbHkgZGVzaWduZWQgdG8gcHJvdmlkZSB0aGUKLWZhY2lsaXRpZXMgeW91IG5lZWQgd2l0aCBoYW5kLWNvZGVkIGFzc2VtYmx5IGNvZGUuICBJbXBsZW1lbnRpbmcgaXQgYXMgYQotcHJlcHJvY2Vzc29yLCByYXRoZXIgdGhhbiBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIsIGFsbG93cyB0aGUgbWF4aW11bQotZmxleGliaWxpdHk6IHlvdSBjYW4gdXNlIGl0IHdpdGggaGFuZC1jb2RlZCBhc3NlbWJseSwgd2l0aG91dCBwYXlpbmcgYQotcGVuYWx0eSBvZiBhZGRlZCBjb21wbGV4aXR5IGluIHRoZSBhc3NlbWJsZXIgeW91IHVzZSBmb3IgY29tcGlsZXIKLW91dHB1dC4KLQotSGVyZSBpcyBhIHNtYWxsIGV4YW1wbGUgdG8gZ2l2ZSB0aGUgZmxhdm9yIG9mIEBzY3tnYXNwfS4gIFRoaXMgaW5wdXQgdG8KLUBzY3tnYXNwfQotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotICAgICAgICAuTUFDUk8gIHNhdmVyZWdzIGZyb209OCB0bz0xNAotY291bnQgICAuQVNTSUdOQSBcZnJvbQotICAgICAgICAhIHNhdmUgclxmcm9tLi5yXHRvCi0gICAgICAgIC5BV0hJTEUgIFwmY291bnQgTEUgXHRvCi0gICAgICAgIG1vdiAgICAgclwmY291bnQsQEAtc3AKLWNvdW50ICAgLkFTU0lHTkEgIFwmY291bnQgKyAxCi0gICAgICAgIC5BRU5EVwotICAgICAgICAuRU5ETQotCi0gICAgICAgIHNhdmVyZWdzIGZyb209MTIKLQotYmFyOiAgICBtb3YgICAgICNIJ2RlYWQrMTAscjAKLWZvbyAgICAgLlNEQVRBQyAiaGVsbG8iPDEwPgotICAgICAgICAuRU5ECi1AZW5kIGV4YW1wbGUKLUBlbmQgY2FydG91Y2hlCi0KLUBub2luZGVudAotZ2VuZXJhdGVzIHRoaXMgYXNzZW1ibHkgcHJvZ3JhbToKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLSAgICAgICAgISBzYXZlIHIxMi4ucjE0Ci0gICAgICAgIG1vdiAgICAgcjEyLEBALXNwCi0gICAgICAgIG1vdiAgICAgcjEzLEBALXNwCi0gICAgICAgIG1vdiAgICAgcjE0LEBALXNwCi0KLWJhcjogICAgbW92ICAgICAjNTcwMDUrMTAscjAKLWZvbzogICAgLmJ5dGUgICA2LDEwNCwxMDEsMTA4LDEwOCwxMTEsMTAKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQG5vZGUgSW52b2tpbmcgR0FTUAotQGNoYXB0ZXIgQ29tbWFuZCBMaW5lIE9wdGlvbnMKLQotQGMgRklYTUUhICBPciBpcyB0aGVyZSBhIHNpbXBsZXIgd2F5LCBjYWxsaW5nIGZyb20gR0FTIG9wdGlvbj8KLVRoZSBzaW1wbGVzdCB3YXkgdG8gdXNlIEBzY3tnYXNwfSBpcyB0byBydW4gaXQgYXMgYSBmaWx0ZXIgYW5kIGFzc2VtYmxlCi1pdHMgb3V0cHV0LiAgSW4gVW5peCBhbmQgaXRzIGlsaywgeW91IGNhbiBkbyB0aGlzLCBmb3IgZXhhbXBsZToKLQotQGMgRklYTUUhIEdBU1AgZmlsZW5hbWUgc3VmZml4IGNvbnZlbnRpb24/Ci1AZXhhbXBsZQotJCBnYXNwIHByb2cuYXNtIHwgYXMgLW8gcHJvZy5vCi1AZW5kIGV4YW1wbGUKLQotTmF0dXJhbGx5LCB0aGVyZSBhcmUgYWxzbyBhIGZldyBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhbGxvdyB5b3UgdG8KLXJlcXVlc3QgdmFyaWF0aW9ucyBvbiB0aGlzIGJhc2ljIHRoZW1lLiAgSGVyZSBpcyB0aGUgZnVsbCBzZXQgb2YKLXBvc3NpYmlsaXRpZXMgZm9yIHRoZSBAc2N7Z2FzcH0gY29tbWFuZCBsaW5lLgotCi1AZXhhbXBsZQotZ2FzcCAgWyAtYSB8IC0tYWx0ZXJuYXRlIF0KLSAgICAgIFsgLWMgQHZhcntjaGFyfSB8IC0tY29tbWVudGNoYXIgQHZhcntjaGFyfSBdCi0gICAgICBbIC1kIHwgLS1kZWJ1ZyBdICBbIC1oIHwgLS1oZWxwIF0gWyAtTSB8IC0tbXJpIF0KLSAgICAgIFsgLW8gQHZhcntvdXRmaWxlfSB8IC0tb3V0cHV0IEB2YXJ7b3V0ZmlsZX0gXQotICAgICAgWyAtcCB8IC0tcHJpbnQgXSAgWyAtcyB8IC0tY29weXNvdXJjZSBdCi0gICAgICBbIC11IHwgLS11bnJlYXNvbmFibGUgXSAgWyAtdiB8IC0tdmVyc2lvbiBdCi0gICAgICBAdmFye2luZmlsZX0gQGRvdHN7fQotQGVuZCBleGFtcGxlCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIEB2YXJ7aW5maWxlfSBAZG90c3t9Ci1AYyBGSVhNRSEgV2h5IG5vdCBzdGRpbiBhcyBkZWZhdWx0IGluZmlsZT8KLVRoZSBpbnB1dCBmaWxlIG5hbWVzLiAgWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsZTsgaWYgeW91Ci1zcGVjaWZ5IG1vcmUsIEBzY3tnYXNwfSBwcmVwcm9jZXNzZXMgdGhlbSBhbGwsIGNvbmNhdGVuYXRpbmcgdGhlIG91dHB1dAotaW4gdGhlIG9yZGVyIHlvdSBsaXN0IHRoZSBAdmFye2luZmlsZX0gYXJndW1lbnRzLgotCi1NYXJrIHRoZSBlbmQgb2YgZWFjaCBpbnB1dCBmaWxlIHdpdGggdGhlIHByZXByb2Nlc3NvciBjb21tYW5kCi1AY29kZXsuRU5EfS4gIEB4cmVme090aGVyIENvbW1hbmRzLCwgTWlzY2VsbGFuZW91cyBjb21tYW5kc30uCi0KLUBpdGVtIC1hCi1AaXRlbXggLS1hbHRlcm5hdGUKLVVzZSBhbHRlcm5hdGl2ZSBtYWNybyBzeW50YXguICBAeHJlZntBbHRlcm5hdGUsLCBBbHRlcm5hdGUgbWFjcm8KLXN5bnRheH0sIGZvciBhIGRpc2N1c3Npb24gb2YgaG93IHRoaXMgc3ludGF4IGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdAotQHNje2dhc3B9IHN5bnRheC4KLQotQGNpbmRleCBjb21tZW50IGNoYXJhY3RlciwgY2hhbmdpbmcKLUBjaW5kZXggc2VtaWNvbG9uLCBhcyBjb21tZW50Ci1AY2luZGV4IGV4Y2xhbWF0aW9uIG1hcmssIGFzIGNvbW1lbnQKLUBjaW5kZXggc2hyaWVrLCBhcyBjb21tZW50Ci1AY2luZGV4IGJhbmcsIGFzIGNvbW1lbnQKLUBjaW5kZXggQGNvZGV7IX0gZGVmYXVsdCBjb21tZW50IGNoYXIKLUBjaW5kZXggQGNvZGV7O30gYXMgY29tbWVudCBjaGFyCi1AaXRlbSAtYyAnQHZhcntjaGFyfScKLUBpdGVteCAtLWNvbW1lbnRjaGFyICdAdmFye2NoYXJ9JwotVXNlIEB2YXJ7Y2hhcn0gYXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLiAgVGhlIGRlZmF1bHQgY29tbWVudCBjaGFyYWN0ZXIKLWlzIEBzYW1weyF9LiAgRm9yIGV4YW1wbGUsIHRvIHVzZSBhIHNlbWljb2xvbiBhcyB0aGUgY29tbWVudCBjaGFyYWN0ZXIsCi1zcGVjaWZ5IEB3e0BzYW1wey1jICc7J319IG9uIHRoZSBAc2N7Z2FzcH0gY29tbWFuZCBsaW5lLiAgU2luY2UKLWFzc2VtYmxlciBjb21tYW5kIGNoYXJhY3RlcnMgb2Z0ZW4gaGF2ZSBzcGVjaWFsIHNpZ25pZmljYW5jZSB0byBjb21tYW5kCi1zaGVsbHMsIGl0IGlzIGEgZ29vZCBpZGVhIHRvIHF1b3RlIG9yIGVzY2FwZSBAdmFye2NoYXJ9IHdoZW4geW91IHNwZWNpZnkKLWEgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5LCBhbGwgZXhhbXBsZXMgaW4gdGhpcyBtYW51YWwgdXNlIHRoZSBkZWZhdWx0Ci1jb21tZW50IGNoYXJhY3RlciBAc2FtcHshfS4KLQotQGl0ZW0gLWQKLUBpdGVteCAtLWRlYnVnCi1TaG93IGRlYnVnZ2luZyBzdGF0aXN0aWNzLiAgSW4gdGhpcyB2ZXJzaW9uIG9mIEBzY3tnYXNwfSwgdGhpcyBvcHRpb24KLXByb2R1Y2VzIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHN0cmluZyBidWZmZXJzIHRoYXQgQHNje2dhc3B9IGFsbG9jYXRlcwotaW50ZXJuYWxseS4gIEZvciBlYWNoIGRlZmluZWQgYnVmZmVyc2l6ZSBAdmFye3N9LCBAc2N7Z2FzcH0gc2hvd3MgdGhlCi1udW1iZXIgb2Ygc3RyaW5ncyBAdmFye259IHRoYXQgaXQgYWxsb2NhdGVkLCB3aXRoIGEgbGluZSBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1zdHJpbmdzIHNpemUgQHZhcntzfSA6IEB2YXJ7bn0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLUBzY3tnYXNwfSBkaXNwbGF5cyB0aGVzZSBzdGF0aXN0aWNzIG9uIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0sIHdoZW4KLWRvbmUgcHJlcHJvY2Vzc2luZy4KLQotQGl0ZW0gLWgKLUBpdGVteCAtLWhlbHAKLURpc3BsYXkgYSBzdW1tYXJ5IG9mIHRoZSBAc2N7Z2FzcH0gY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0KLUBpdGVtIC1NCi1AaXRlbXggLS1tcmkKLVVzZSBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLiAgVXNpbmcgdGhpcyBvcHRpb24gY2F1c2VzIEBzY3tnYXNwfSB0bwotYWNjZXB0IHRoZSBzeW50YXggYW5kIHBzZXVkby1vcHMgdXNlZCBieSB0aGUgTWljcm90ZWMgUmVzZWFyY2gKLUBjb2Rle0FTTTY4S30gYXNzZW1ibGVyLgotCi1AaXRlbSAtbyBAdmFye291dGZpbGV9Ci1AaXRlbXggLS1vdXRwdXQgQHZhcntvdXRmaWxlfQotV3JpdGUgdGhlIG91dHB1dCBpbiBhIGZpbGUgY2FsbGVkIEB2YXJ7b3V0ZmlsZX0uICBJZiB5b3UgZG8gbm90IHVzZSB0aGUKLUBzYW1wey1vfSBvcHRpb24sIEBzY3tnYXNwfSB3cml0ZXMgaXRzIG91dHB1dCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0Ci1zdHJlYW0uCi0KLUBpdGVtIC1wCi1AaXRlbXggLS1wcmludAotUHJpbnQgbGluZSBudW1iZXJzLiAgQHNje2dhc3B9IG9iZXlzIHRoaXMgb3B0aW9uIEBlbXBoe29ubHl9IGlmIHlvdSBhbHNvCi1zcGVjaWZ5IEBzYW1wey1zfSB0byBjb3B5IHNvdXJjZSBsaW5lcyB0byBpdHMgb3V0cHV0LiAgV2l0aCBAc2FtcHstcwotLXB9LCBAc2N7Z2FzcH0gZGlzcGxheXMgdGhlIGxpbmUgbnVtYmVyIG9mIGVhY2ggc291cmNlIGxpbmUgY29waWVkCi0oaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvbW1lbnQgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUpLgotCi1AaXRlbSAtcwotQGl0ZW14IC0tY29weXNvdXJjZQotQ29weSB0aGUgc291cmNlIGxpbmVzIHRvIHRoZSBvdXRwdXQgZmlsZS4gIFVzZSB0aGlzIG9wdGlvbgotdG8gc2VlIHRoZSBlZmZlY3Qgb2YgZWFjaCBwcmVwcm9jZXNzb3IgbGluZSBvbiB0aGUgQHNje2dhc3B9IG91dHB1dC4KLUBzY3tnYXNwfSBwbGFjZXMgYSBjb21tZW50IGNoYXJhY3RlciAoQHNhbXB7IX0gYnkgZGVmYXVsdCkgYXQKLXRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzb3VyY2UgbGluZSBpdCBjb3BpZXMsIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcwotb3B0aW9uIGFuZCBzdGlsbCBhc3NlbWJsZSB0aGUgcmVzdWx0LgotCi1AaXRlbSAtdQotQGl0ZW14IC0tdW5yZWFzb25hYmxlCi1CeXBhc3MgYGB1bnJlYXNvbmFibGUgZXhwYW5zaW9uJycgbGltaXQuICBTaW5jZSB5b3UgY2FuIGRlZmluZSBAc2N7Z2FzcH0KLW1hY3JvcyBpbnNpZGUgb3RoZXIgbWFjcm8gZGVmaW5pdGlvbnMsIHRoZSBwcmVwcm9jZXNzb3Igbm9ybWFsbHkKLWluY2x1ZGVzIGEgc2FuaXR5IGNoZWNrLiAgSWYgeW91ciBwcm9ncmFtIHJlcXVpcmVzIG1vcmUgdGhhbiAxLDAwMAotbmVzdGVkIGV4cGFuc2lvbnMsIEBzY3tnYXNwfSBub3JtYWxseSBleGl0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuICBVc2UKLXRoaXMgb3B0aW9uIHRvIHR1cm4gb2ZmIHRoaXMgY2hlY2ssIGFsbG93aW5nIHVubGltaXRlZCBuZXN0ZWQKLWV4cGFuc2lvbnMuCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1EaXNwbGF5IHRoZSBAc2N7Z2FzcH0gdmVyc2lvbiBudW1iZXIuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBDb21tYW5kcwotQGNoYXB0ZXIgUHJlcHJvY2Vzc29yIENvbW1hbmRzCi0KLUBzY3tnYXNwfSBjb21tYW5kcyBoYXZlIGEgc3RyYWlnaHRmb3J3YXJkIHN5bnRheCB0aGF0IGZpdHMgaW4gd2VsbCB3aXRoCi1hc3NlbWJseSBjb252ZW50aW9ucy4gIEluIGdlbmVyYWwsIGEgY29tbWFuZCBleHRlbmRzIGZvciBhIGxpbmUsIGFuZCBtYXkKLWhhdmUgdXAgdG8gdGhyZWUgZmllbGRzOiBhbiBvcHRpb25hbCBsYWJlbCwgdGhlIGNvbW1hbmQgaXRzZWxmLCBhbmQKLW9wdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgY29tbWFuZC4gIFlvdSBjYW4gd3JpdGUgY29tbWFuZHMgaW4gdXBwZXIgb3IKLWxvd2VyIGNhc2UsIHRob3VnaCB0aGlzIG1hbnVhbCBzaG93cyB0aGVtIGluIHVwcGVyIGNhc2UuICBAeHJlZntTeW50YXgKLURldGFpbHMsLCBEZXRhaWxzIG9mIHRoZSBHQVNQIHN5bnRheH0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AbWVudQotKiBDb25kaXRpb25hbHM6OgotKiBMb29wczo6Ci0qIFZhcmlhYmxlczo6Ci0qIE1hY3Jvczo6Ci0qIERhdGE6OgotKiBMaXN0aW5nczo6Ci0qIE90aGVyIENvbW1hbmRzOjoKLSogU3ludGF4IERldGFpbHM6OgotKiBBbHRlcm5hdGU6OgotQGVuZCBtZW51Ci0KLUBub2RlIENvbmRpdGlvbmFscwotQHNlY3Rpb24gQ29uZGl0aW9uYWwgYXNzZW1ibHkKLQotVGhlIGNvbmRpdGlvbmFsLWFzc2VtYmx5IGRpcmVjdGl2ZXMgYWxsb3cgeW91IHRvIGluY2x1ZGUgb3IgZXhjbHVkZQotcG9ydGlvbnMgb2YgYW4gYXNzZW1ibHkgZGVwZW5kaW5nIG9uIGhvdyBhIHBhaXIgb2YgZXhwcmVzc2lvbnMsIG9yIGEKLXBhaXIgb2Ygc3RyaW5ncywgY29tcGFyZS4KLQotVGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIGNvbmRpdGlvbmFscyBpcyBmYW1pbGlhciBmcm9tIG1hbnkgb3RoZXIKLWNvbnRleHRzLiAgQGNvZGV7LkFJRn0gbWFya3MgdGhlIHN0YXJ0IG9mIGEgY29uZGl0aW9uYWwsIGFuZCBwcmVjZWRlcwotYXNzZW1ibHkgZm9yIHRoZSBjYXNlIHdoZW4gdGhlIGNvbmRpdGlvbiBpcyB0cnVlLiAgIEFuIG9wdGlvbmFsCi1AY29kZXsuQUVMU0V9IHByZWNlZGVzIGFzc2VtYmx5IGZvciB0aGUgY29udmVyc2UgY2FzZSwgYW5kIGFuCi1AY29kZXsuQUVOREl9IG1hcmtzIHRoZSBlbmQgb2YgdGhlIGNvbmRpdGlvbi4KLQotQGMgRklYTUUhIFdoeSBkb2Vzbid0IC11IHR1cm4gb2ZmIHRoaXMgY2hlY2s/Ci1Zb3UgbWF5IG5lc3QgY29uZGl0aW9uYWxzIHVwIHRvIGEgZGVwdGggb2YgMTAwOyBAc2N7Z2FzcH0gcmVqZWN0cwotbmVzdGluZyBiZXlvbmQgdGhhdCwgYmVjYXVzZSBpdCBtYXkgaW5kaWNhdGUgYSBidWcgaW4geW91ciBtYWNybwotc3RydWN0dXJlLgotCi1AYyBGSVhNRSEgV2h5IGlzbid0IHRoZXJlIHNvbWV0aGluZyBsaWtlIGNwcCdzIC1EIG9wdGlvbj8gIENvbmRpdGlvbmFscwotQGMgICAgICAgIHdvdWxkIGJlIG11Y2ggbW9yZSB1c2VmdWwgaWYgdGhlcmUgd2VyZS4KLUNvbmRpdGlvbmFscyBhcmUgcHJpbWFyaWx5IHVzZWZ1bCBpbnNpZGUgbWFjcm8gZGVmaW5pdGlvbnMsIHdoZXJlIHlvdQotb2Z0ZW4gbmVlZCBkaWZmZXJlbnQgZWZmZWN0cyBkZXBlbmRpbmcgb24gYXJndW1lbnQgdmFsdWVzLgotQHhyZWZ7TWFjcm9zLCwgRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30sIGZvciBkZXRhaWxzIGFib3V0IGRlZmluaW5nCi1tYWNyb3MuCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5BSUYgQHZhcntleHByYX0gQHZhcntjbXB9IEB2YXJ7ZXhwcmJ9Ci1AaXRlbXggLkFJRiAiQHZhcntzdHJhfSIgQHZhcntjbXB9ICJAdmFye3N0cmJ9IgotCi1UaGUgZ292ZXJuaW5nIGNvbmRpdGlvbiBnb2VzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIEBjb2Rley5BSUZ9Ci1wcmVwcm9jZXNzb3IgY29tbWFuZC4gIFlvdSBtYXkgY29tcGFyZSBlaXRoZXIgdHdvIHN0cmluZ3MsIG9yIHR3bwotZXhwcmVzc2lvbnMuCi0KLVdoZW4geW91IGNvbXBhcmUgc3RyaW5ncywgb25seSB0d28gY29uZGl0aW9uYWwgQHZhcntjbXB9IGNvbXBhcmlzb24KLW9wZXJhdG9ycyBhcmUgYXZhaWxhYmxlOiBAc2FtcHtFUX0gKHRydWUgaWYgQHZhcntzdHJhfSBhbmQgQHZhcntzdHJifQotYXJlIGlkZW50aWNhbCksIGFuZCBAc2FtcHtORX0gKHRoZSBvcHBvc2l0ZSkuCi0KLVdoZW4geW91IGNvbXBhcmUgdHdvIGV4cHJlc3Npb25zLCBAZW1waHtib3RoIGV4cHJlc3Npb25zIG11c3QgYmUKLWFic29sdXRlfSAoQHB4cmVme0V4cHJlc3Npb25zLCwgQXJpdGhtZXRpYyBleHByZXNzaW9ucyBpbiBHQVNQfSkuICBZb3UKLWNhbiB1c2UgdGhlc2UgQHZhcntjbXB9IGNvbXBhcmlzb24gb3BlcmF0b3JzIHdpdGggZXhwcmVzc2lvbnM6Ci0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIEVRCi1BcmUgQHZhcntleHByYX0gYW5kIEB2YXJ7ZXhwcmJ9IGVxdWFsPyAgKEZvciBzdHJpbmdzLCBhcmUgQHZhcntzdHJhfSBhbmQKLUB2YXJ7c3RyYn0gaWRlbnRpY2FsPykKLQotQGl0ZW0gTkUKLUFyZSBAdmFye2V4cHJhfSBhbmQgQHZhcntleHByYn0gZGlmZmVyZW50PyAgKEZvciBzdHJpbmdzLCBhcmUgQHZhcntzdHJhfQotYW5kIEB2YXJ7c3RyYn0gZGlmZmVyZW50PwotCi1AaXRlbSBMVAotSXMgQHZhcntleHByYX0gbGVzcyB0aGFuIEB2YXJ7ZXhwcmJ9PyAgKE5vdCBhbGxvd2VkIGZvciBzdHJpbmdzLikKLQotQGl0ZW0gTEUKLUlzIEB2YXJ7ZXhwcmF9IGxlc3MgdGhhbiBvciBlcXVhbCB0byBAdmFye2V4cHJifT8gIChOb3QgYWxsb3dlZCBmb3Igc3RyaW5ncy4pCi0KLUBpdGVtIEdUCi1JcyBAdmFye2V4cHJhfSBncmVhdGVyIHRoYW4gQHZhcntleHByYn0/ICAoTm90IGFsbG93ZWQgZm9yIHN0cmluZ3MuKQotCi1AaXRlbSBHRQotSXMgQHZhcntleHByYX0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIEB2YXJ7ZXhwcmJ9PyAgKE5vdCBhbGxvd2VkIGZvcgotc3RyaW5ncy4pCi1AZW5kIGZ0YWJsZQotCi1AaXRlbSAuQUVMU0UKLU1hcmtzIHRoZSBzdGFydCBvZiBhc3NlbWJseSBjb2RlIHRvIGJlIGluY2x1ZGVkIGlmIHRoZSBjb25kaXRpb24gZmFpbHMuCi1PcHRpb25hbCwgYW5kIG9ubHkgYWxsb3dlZCB3aXRoaW4gYSBjb25kaXRpb25hbCAoYmV0d2VlbiBAY29kZXsuQUlGfSBhbmQKLUBjb2Rley5BRU5ESX0pLgotCi1AaXRlbSAuQUVOREkKLU1hcmtzIHRoZSBlbmQgb2YgYSBjb25kaXRpb25hbCBhc3NlbWJseS4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIExvb3BzCi1Ac2VjdGlvbiBSZXBldGl0aXZlIHNlY3Rpb25zIG9mIGFzc2VtYmx5Ci0KLVR3byBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBhbGxvdyB5b3UgdG8gcmVwZWF0ZWRseSBpc3N1ZSBjb3BpZXMgb2YgdGhlCi1zYW1lIGJsb2NrIG9mIGFzc2VtYmx5IGNvZGUuCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5BUkVQRUFUIEB2YXJ7YWV4cH0KLUBpdGVteCAuQUVORFIKLUlmIHlvdSBzaW1wbHkgbmVlZCB0byByZXBlYXQgdGhlIHNhbWUgYmxvY2sgb2YgYXNzZW1ibHkgb3ZlciBhbmQgb3ZlciBhCi1maXhlZCBudW1iZXIgb2YgdGltZXMsIHNhbmR3aWNoIG9uZSBpbnN0YW5jZSBvZiB0aGUgcmVwZWF0ZWQgYmxvY2sKLWJldHdlZW4gQGNvZGV7LkFSRVBFQVR9IGFuZCBAY29kZXsuQUVORFJ9LiAgU3BlY2lmeSB0aGUgbnVtYmVyIG9mCi1jb3BpZXMgYXMgQHZhcnthZXhwfSAod2hpY2ggbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uKS4gIEZvcgotZXhhbXBsZSwgdGhpcyByZXBlYXRzIHR3byBhc3NlbWJseSBzdGF0ZW1lbnRzIHRocmVlIHRpbWVzIGluIHN1Y2Nlc3Npb246Ci0KLUBjYXJ0b3VjaGUKLUBleGFtcGxlCi0gICAgICAgIC5BUkVQRUFUICAgICAgICAzCi0gICAgICAgIHJvdGNsICAgcjIKLSAgICAgICAgZGl2MSAgICByMCxyMQotICAgICAgICAuQUVORFIKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQGl0ZW0gLkFXSElMRSBAdmFye2V4cHJhfSBAdmFye2NtcH0gQHZhcntleHByYn0KLUBpdGVteCAuQUVORFcKLUBpdGVteCAuQVdISUxFIEB2YXJ7c3RyYX0gQHZhcntjbXB9IEB2YXJ7c3RyYn0KLUBpdGVteCAuQUVORFcKLVRvIHJlcGVhdCBhIGJsb2NrIG9mIGFzc2VtYmx5IGRlcGVuZGluZyBvbiBhIGNvbmRpdGlvbmFsIHRlc3QsIHJhdGhlcgotdGhhbiByZXBlYXRpbmcgaXQgZm9yIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHRpbWVzLCB1c2UgQGNvZGV7LkFXSElMRX0uCi1AY29kZXsuQUVORFd9IG1hcmtzIHRoZSBlbmQgb2YgdGhlIHJlcGVhdGVkIGJsb2NrLiAgVGhlIGNvbmRpdGlvbmFsCi1jb21wYXJpc29uIHdvcmtzIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIGZvciBAY29kZXsuQUlGfSwgd2l0aCB0aGUgc2FtZQotY29tcGFyaXNvbiBvcGVyYXRvcnMgKEBweHJlZntDb25kaXRpb25hbHMsLCBDb25kaXRpb25hbCBhc3NlbWJseX0pLgotCi1TaW5jZSB0aGUgdGVybXMgb2YgdGhlIGNvbXBhcmlzb24gbXVzdCBiZSBhYnNvbHV0ZSBleHByZXNzaW9uLAotQGNvZGV7LkFXSElMRX0gaXMgcHJpbWFyaWx5IHVzZWZ1bCB3aXRoaW4gbWFjcm9zLiAgQHhyZWZ7TWFjcm9zLCwKLURlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LgotQGVuZCBmdGFibGUKLQotQGNpbmRleCBsb29wcywgYnJlYWtpbmcgb3V0IG9mCi1AY2luZGV4IGJyZWFraW5nIG91dCBvZiBsb29wcwotWW91IGNhbiB1c2UgdGhlIEBjb2Rley5FWElUTX0gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSB0byBicmVhayBvdXQgb2YKLWxvb3BzIGVhcmx5IChhcyB3ZWxsIGFzIHRvIGJyZWFrIG91dCBvZiBtYWNyb3MpLiAgQHhyZWZ7TWFjcm9zLCwKLURlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LgotCi1Abm9kZSBWYXJpYWJsZXMKLUBzZWN0aW9uIFByZXByb2Nlc3NvciB2YXJpYWJsZXMKLQotWW91IGNhbiB1c2UgdmFyaWFibGVzIGluIEBzY3tnYXNwfSB0byByZXByZXNlbnQgc3RyaW5ncywgcmVnaXN0ZXJzLCBvcgotdGhlIHJlc3VsdHMgb2YgZXhwcmVzc2lvbnMuCi0KLVlvdSBtdXN0IGRpc3Rpbmd1aXNoIHR3byBraW5kcyBvZiB2YXJpYWJsZXM6IAotQGVudW1lcmF0ZQotQGl0ZW0KLVZhcmlhYmxlcyBkZWZpbmVkIHdpdGggQGNvZGV7LkVRVX0gb3IgQGNvZGV7LkFTU0lHTn0uICBUbyBldmFsdWF0ZSB0aGlzCi1raW5kIG9mIHZhcmlhYmxlIGluIHlvdXIgYXNzZW1ibHkgb3V0cHV0LCBzaW1wbHkgbWVudGlvbiBpdHMgbmFtZS4gIEZvcgotZXhhbXBsZSwgdGhlc2UgdHdvIGxpbmVzIGRlZmluZSBhbmQgdXNlIGEgdmFyaWFibGUgQHNhbXB7ZWd9OgotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotZWcgICAgIC5FUVUgICBGTElQLTY0Ci0gICAgICAgQGRvdHN7fQotICAgICAgIG1vdi5sICBlZyxyMAotQGVuZCBleGFtcGxlCi1AZW5kIGNhcnRvdWNoZQotCi1AZW1waHtEbyBub3QgdXNlfSB0aGlzIGtpbmQgb2YgdmFyaWFibGUgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMgb3IKLXdoaWxlIGxvb3BzOyBAc2N7Z2FzcH0gb25seSBldmFsdWF0ZXMgdGhlc2UgdmFyaWFibGVzIHdoZW4gd3JpdGluZwotYXNzZW1ibHkgb3V0cHV0LgotCi1AaXRlbQotVmFyaWFibGVzIGZvciB1c2UgZHVyaW5nIHByZXByb2Nlc3NpbmcuICBZb3UgY2FuIGRlZmluZSB0aGVzZQotd2l0aCBAY29kZXsuQVNTSUdOQ30gb3IgQGNvZGV7LkFTU0lHTkF9LiAgVG8gZXZhbHVhdGUgdGhpcwota2luZCBvZiB2YXJpYWJsZSwgd3JpdGUgQHNhbXB7XCZ9IGJlZm9yZSB0aGUgdmFyaWFibGUgbmFtZTsgZm9yIGV4YW1wbGUsCi0KLUBjYXJ0b3VjaGUKLUBleGFtcGxlCi1vcGNpdCAgLkFTU0lHTkEgIDQ3Ci0gICAgICAgQGRvdHN7fQotICAgICAgIC5BV0hJTEUgIFwmb3BjaXQgR1QgMAotICAgICAgIEBkb3Rze30KLSAgICAgICAuQUVORFcKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQHNje2dhc3B9IHRyZWF0cyBtYWNybyBhcmd1bWVudHMgYWxtb3N0IHRoZSBzYW1lIHdheSwgYnV0IHRvIGV2YWx1YXRlCi10aGVtIHlvdSB1c2UgdGhlIHByZWZpeCBAc2FtcHtcfSByYXRoZXIgdGhhbiBAc2FtcHtcJn0uCi1AeHJlZntNYWNyb3MsLCBEZWZpbmluZyB5b3VyIG93biBkaXJlY3RpdmVzfS4KLUBlbmQgZW51bWVyYXRlCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIEB2YXJ7cHZhcn0gLkVRVSBAdmFye2V4cHJ9Ci1AYyBGSVhNRSEgIEFueXRoaW5nIHRvIGJld2FyZSBvZiByZSBHQVMgZGlyZWN0aXZlIG9mIHNhbWUgbmFtZT8KLUFzc2lnbiBwcmVwcm9jZXNzb3IgdmFyaWFibGUgQHZhcntwdmFyfSB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24KLUB2YXJ7ZXhwcn0uICBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHJlZGVmaW5pdGlvbjsgdXNlIEBzYW1wey5FUVV9Ci13aXRoIHRoZSBzYW1lIEB2YXJ7cHZhcn0gYXMgb2Z0ZW4gYXMgeW91IGZpbmQgaXQgY29udmVuaWVudC4KLQotQGl0ZW0gQHZhcntwdmFyfSAuQVNTSUdOIEB2YXJ7ZXhwcn0KLUFsbW9zdCB0aGUgc2FtZSBhcyBAY29kZXsuRVFVfSwgc2F2ZSB0aGF0IHlvdSBtYXkgbm90IHJlZGVmaW5lCi1AdmFye3B2YXJ9IHVzaW5nIEBjb2Rley5BU1NJR059IG9uY2UgaXQgaGFzIGEgdmFsdWUuCi1AYyBGSVhNRSEhICBTdXBwb3NlZCB0byB3b3JrIHRoaXMgd2F5LCBhcHBhcmVudGx5LCBidXQgb24gOWZlYjk0IHdvcmtzCi1AYyAgICAgICAgICBqdXN0IGxpa2UgLkVRVQotCi1AaXRlbSBAdmFye3B2YXJ9IC5BU1NJR05BIEB2YXJ7YWV4cHJ9Ci1EZWZpbmUgYSB2YXJpYWJsZSB3aXRoIGEgbnVtZXJpYyB2YWx1ZSwgZm9yIHVzZSBkdXJpbmcgcHJlcHJvY2Vzc2luZy4KLUB2YXJ7YWV4cHJ9IG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFlvdSBjYW4gcmVkZWZpbmUgdmFyaWFibGVzCi13aXRoIEBjb2Rley5BU1NJR05BfSBhdCBhbnkgdGltZS4KLQotQGl0ZW0gQHZhcntwdmFyfSAuQVNTSUdOQyAiQHZhcntzdHJ9IgotRGVmaW5lIGEgdmFyaWFibGUgd2l0aCBhIHN0cmluZyB2YWx1ZSwgZm9yIHVzZSBkdXJpbmcgcHJlcHJvY2Vzc2luZy4KLVlvdSBjYW4gcmVkZWZpbmUgdmFyaWFibGVzIHdpdGggQGNvZGV7LkFTU0lHTkN9IGF0IGFueSB0aW1lLgotCi1AaXRlbSBAdmFye3B2YXJ9IC5SRUcgKEB2YXJ7cmVnaXN0ZXJ9KQotVXNlIEBjb2Rley5SRUd9IHRvIGRlZmluZSBhIHZhcmlhYmxlIHRoYXQgcmVwcmVzZW50cyBhIHJlZ2lzdGVyLiAgSW4KLXBhcnRpY3VsYXIsIEB2YXJ7cmVnaXN0ZXJ9IGlzIEBlbXBoe25vdCBldmFsdWF0ZWR9IGFzIGFuIGV4cHJlc3Npb24uCi1Zb3UgbWF5IHVzZSBAY29kZXsuUkVHfSBhdCB3aWxsIHRvIHJlZGVmaW5lIHJlZ2lzdGVyIHZhcmlhYmxlcy4KLUBlbmQgZnRhYmxlCi0KLUFsbCB0aGVzZSBkaXJlY3RpdmVzIGFjY2VwdCB0aGUgdmFyaWFibGUgbmFtZSBpbiB0aGUgYGBsYWJlbCcnIHBvc2l0aW9uLAotdGhhdCBpcyBhdCB0aGUgbGVmdCBtYXJnaW4uICBZb3UgbWF5IHNwZWNpZnkgYSBjb2xvbiBhZnRlciB0aGUgdmFyaWFibGUKLW5hbWUgaWYgeW91IHdpc2g7IHRoZSBmaXJzdCBleGFtcGxlIGFib3ZlIGNvdWxkIGhhdmUgc3RhcnRlZCBAc2FtcHtlZzp9Ci13aXRoIHRoZSBzYW1lIGVmZmVjdC4KLQotQGMgcGFnZWJyZWFrIG1ha2VzIGZvciBiZXR0ZXIgYWVzdGhldGljcy0tLWVuc3VyZXMgbWFjcm8gYW5kIGV4cGFuc2lvbiB0b2dldGhlcgotQHBhZ2UKLUBub2RlIE1hY3JvcwotQHNlY3Rpb24gRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlcwotCi1UaGUgY29tbWFuZHMgQGNvZGV7Lk1BQ1JPfSBhbmQgQGNvZGV7LkVORE19IGFsbG93IHlvdSB0byBkZWZpbmUgbWFjcm9zCi10aGF0IGdlbmVyYXRlIGFzc2VtYmx5IG91dHB1dC4gIFlvdSBjYW4gdXNlIHRoZXNlIG1hY3JvcyB3aXRoIGEgc3ludGF4Ci1zaW1pbGFyIHRvIGJ1aWx0LWluIEBzY3tnYXNwfSBvciBhc3NlbWJsZXIgZGlyZWN0aXZlcy4gIEZvciBleGFtcGxlLAotdGhpcyBkZWZpbml0aW9uIHNwZWNpZmllcyBhIG1hY3JvIEBjb2Rle1NVTX0gdGhhdCBhZGRzIHRvZ2V0aGVyIGEgcmFuZ2Ugb2YKLWNvbnNlY3V0aXZlIHJlZ2lzdGVyczoKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLSAgICAgICAgLk1BQ1JPICBTVU0gRlJPTT0wLCBUTz05Ci0gICAgICAgICEgXEZST00gXFRPCi0gICAgICAgIG1vdiAgICAgclxGUk9NLHIxMAotQ09VTlQgICAuQVNTSUdOQSAgICAgICAgXEZST00rMQotICAgICAgICAuQVdISUxFIFwmQ09VTlQgTEUgXFRPCi0gICAgICAgIGFkZCAgICAgclwmQ09VTlQscjEwCi1DT1VOVCAgIC5BU1NJR05BICAgICAgICBcJkNPVU5UKzEKLSAgICAgICAgLkFFTkRXCi0gICAgICAgIC5FTkRNCi1AZW5kIGV4YW1wbGUKLUBlbmQgY2FydG91Y2hlCi0KLUBub2luZGVudAotV2l0aCB0aGF0IGRlZmluaXRpb24sIEBzYW1we1NVTSAwLDV9IGdlbmVyYXRlcyB0aGlzIGFzc2VtYmx5IG91dHB1dDoKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLSAgICAgICAgISAwIDUKLSAgICAgICAgbW92ICAgICByMCxyMTAKLSAgICAgICAgYWRkICAgICByMSxyMTAKLSAgICAgICAgYWRkICAgICByMixyMTAKLSAgICAgICAgYWRkICAgICByMyxyMTAKLSAgICAgICAgYWRkICAgICByNCxyMTAKLSAgICAgICAgYWRkICAgICByNSxyMTAKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLk1BQ1JPIEB2YXJ7bWFjbmFtZX0KLUBpdGVteCAuTUFDUk8gQHZhcnttYWNuYW1lfSBAdmFye21hY2FyZ3N9IEBkb3Rze30KLUJlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEB2YXJ7bWFjbmFtZX0uICBJZiB5b3VyIG1hY3JvCi1kZWZpbml0aW9uIHJlcXVpcmVzIGFyZ3VtZW50cywgc3BlY2lmeSB0aGVpciBuYW1lcyBhZnRlciB0aGUgbWFjcm8gbmFtZSwKLXNlcGFyYXRlZCBieSBjb21tYXMgb3Igc3BhY2VzLiAgWW91IGNhbiBzdXBwbHkgYSBkZWZhdWx0IHZhbHVlIGZvciBhbnkKLW1hY3JvIGFyZ3VtZW50IGJ5IGZvbGxvd2luZyB0aGUgbmFtZSB3aXRoIEBzYW1wez1AdmFye2RlZmx0fX0uICBGb3IKLWV4YW1wbGUsIHRoZXNlIGFyZSBhbGwgdmFsaWQgQGNvZGV7Lk1BQ1JPfSBzdGF0ZW1lbnRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC5NQUNSTyBDT01NCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtDT01NfSwgd2hpY2ggdGFrZXMgbm8KLWFyZ3VtZW50cy4KLQotQGl0ZW0gLk1BQ1JPIFBMVVMxIFAsIFAxCi1AaXRlbXggLk1BQ1JPIFBMVVMxIFAgUDEKLUVpdGhlciBzdGF0ZW1lbnQgYmVnaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle1BMVVMxfSwKLXdoaWNoIHRha2VzIHR3byBhcmd1bWVudHM7IHdpdGhpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbiwgd3JpdGUKLUBzYW1we1xQfSBvciBAc2FtcHtcUDF9IHRvIGV2YWx1YXRlIHRoZSBhcmd1bWVudHMuCi0KLUBpdGVtIC5NQUNSTyBSRVNFUlZFX1NUUiBQMT0wIFAyCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtSRVNFUlZFX1NUUn0sIHdpdGggdHdvCi1hcmd1bWVudHMuICBUaGUgZmlyc3QgYXJndW1lbnQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYnV0IG5vdCB0aGUgc2Vjb25kLgotQWZ0ZXIgdGhlIGRlZmluaXRpb24gaXMgY29tcGxldGUsIHlvdSBjYW4gY2FsbCB0aGUgbWFjcm8gZWl0aGVyIGFzCi1Ac2FtcHtSRVNFUlZFX1NUUiBAdmFye2F9LEB2YXJ7Yn19ICh3aXRoIEBzYW1we1xQMX0gZXZhbHVhdGluZyB0bwotQHZhcnthfSBhbmQgQHNhbXB7XFAyfSBldmFsdWF0aW5nIHRvIEB2YXJ7Yn0pLCBvciBhcyBAc2FtcHtSRVNFUlZFX1NUUgotLEB2YXJ7Yn19ICh3aXRoIEBzYW1we1xQMX0gZXZhbHVhdGluZyBhcyB0aGUgZGVmYXVsdCwgaW4gdGhpcyBjYXNlCi1Ac2FtcHswfSwgYW5kIEBzYW1we1xQMn0gZXZhbHVhdGluZyB0byBAdmFye2J9KS4KLUBlbmQgdGFibGUKLQotV2hlbiB5b3UgY2FsbCBhIG1hY3JvLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHZhbHVlcyBlaXRoZXIgYnkKLXBvc2l0aW9uLCBvciBieSBrZXl3b3JkLiAgRm9yIGV4YW1wbGUsIEBzYW1we1NVTSA5LDE3fSBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHtTVU0gVE89MTcsIEZST009OX0uICBNYWNybyBhcmd1bWVudHMgYXJlIHByZXByb2Nlc3NvciB2YXJpYWJsZXMKLXNpbWlsYXIgdG8gdGhlIHZhcmlhYmxlcyB5b3UgZGVmaW5lIHdpdGggQHNhbXB7LkFTU0lHTkF9IG9yCi1Ac2FtcHsuQVNTSUdOQ307IGluIHBhcnRpY3VsYXIsIHlvdSBjYW4gdXNlIHRoZW0gaW4gY29uZGl0aW9uYWxzIG9yIGZvcgotbG9vcCBjb250cm9sLiAgKFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhlIHByZWZpeCB5b3Ugd3JpdGUgdG8gZXZhbHVhdGUKLXRoZSB2YXJpYWJsZTogZm9yIGEgbWFjcm8gYXJndW1lbnQsIHdyaXRlIEBzYW1we1xAdmFye2FyZ25hbWV9fSwgYnV0IGZvcgotYSBwcmVwcm9jZXNzb3IgdmFyaWFibGUsIHdyaXRlIEBzYW1we1wmQHZhcnt2YXJuYW1lfX0uKQotCi1AaXRlbSBAdmFye25hbWV9IC5NQUNSTwotQGl0ZW14IEB2YXJ7bmFtZX0gLk1BQ1JPICggQHZhcnttYWNhcmdzfSBAZG90c3t9ICkKLUBjIEZJWE1FIGNoZWNrOiBJIHRoaW5rIG5vIGVycm9yIF9hbmRfIG5vIGFyZ3MgcmVjb2duaXplZCBpZiBJIHVzZSBmb3JtCi1AYyAgICAgICBOQU1FICAuTUFDUk8gICBBUkcgQVJHCi1BbiBhbHRlcm5hdGl2ZSBmb3JtIG9mIGludHJvZHVjaW5nIGEgbWFjcm8gZGVmaW5pdGlvbjogc3BlY2lmeSB0aGUgbWFjcm8KLW5hbWUgaW4gdGhlIGxhYmVsIHBvc2l0aW9uLCBhbmQgdGhlIGFyZ3VtZW50cyAoaWYgYW55KSBiZXR3ZWVuCi1wYXJlbnRoZXNlcyBhZnRlciB0aGUgbmFtZS4gIERlZmF1bHRpbmcgcnVsZXMgYW5kIHVzYWdlIHdvcmsgdGhlIHNhbWUKLXdheSBhcyBmb3IgdGhlIG90aGVyIG1hY3JvIGRlZmluaXRpb24gc3ludGF4LgotCi1AaXRlbSAuRU5ETQotTWFyayB0aGUgZW5kIG9mIGEgbWFjcm8gZGVmaW5pdGlvbi4KLQotQGl0ZW0gLkVYSVRNCi1FeGl0IGVhcmx5IGZyb20gdGhlIGN1cnJlbnQgbWFjcm8gZGVmaW5pdGlvbiwgQGNvZGV7LkFSRVBFQVR9IGxvb3AsIG9yCi1AY29kZXsuQVdISUxFfSBsb29wLgotCi1AY2luZGV4IG51bWJlciBvZiBtYWNyb3MgZXhlY3V0ZWQKLUBjaW5kZXggbWFjcm9zLCBjb3VudCBleGVjdXRlZAotQGl0ZW0gXEBACi1Ac2N7Z2FzcH0gbWFpbnRhaW5zIGEgY291bnRlciBvZiBob3cgbWFueSBtYWNyb3MgaXQgaGFzCi1leGVjdXRlZCBpbiB0aGlzIHBzZXVkby12YXJpYWJsZTsgeW91IGNhbiBjb3B5IHRoYXQgbnVtYmVyIHRvIHlvdXIKLW91dHB1dCB3aXRoIEBzYW1we1xAQH0sIGJ1dCBAZW1waHtvbmx5IHdpdGhpbiBhIG1hY3JvIGRlZmluaXRpb259LgotCi1AaXRlbSBMT0NBTCBAdmFye25hbWV9IFsgLCBAZG90c3t9IF0KLUBlbXBoe1dhcm5pbmc6IEBjb2Rle0xPQ0FMfSBpcyBvbmx5IGF2YWlsYWJsZSBpZiB5b3Ugc2VsZWN0IGBgYWx0ZXJuYXRlCi1tYWNybyBzeW50YXgnJyB3aXRoIEBzYW1wey1hfSBvciBAc2FtcHstLWFsdGVybmF0ZX0ufSAgQHhyZWZ7QWx0ZXJuYXRlLCwKLUFsdGVybmF0ZSBtYWNybyBzeW50YXh9LgotCi1HZW5lcmF0ZSBhIHN0cmluZyByZXBsYWNlbWVudCBmb3IgZWFjaCBvZiB0aGUgQHZhcntuYW1lfSBhcmd1bWVudHMsIGFuZAotcmVwbGFjZSBhbnkgaW5zdGFuY2VzIG9mIEB2YXJ7bmFtZX0gaW4gZWFjaCBtYWNybyBleHBhbnNpb24uICBUaGUKLXJlcGxhY2VtZW50IHN0cmluZyBpcyB1bmlxdWUgaW4gdGhlIGFzc2VtYmx5LCBhbmQgZGlmZmVyZW50IGZvciBlYWNoCi1zZXBhcmF0ZSBtYWNybyBleHBhbnNpb24uICBAY29kZXtMT0NBTH0gYWxsb3dzIHlvdSB0byB3cml0ZSBtYWNyb3MgdGhhdAotZGVmaW5lIHN5bWJvbHMsIHdpdGhvdXQgZmVhciBvZiBjb25mbGljdCBiZXR3ZWVuIHNlcGFyYXRlIG1hY3JvIGV4cGFuc2lvbnMuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBEYXRhCi1Ac2VjdGlvbiBEYXRhIG91dHB1dAotCi1JbiBhc3NlbWJseSBjb2RlLCB5b3Ugb2Z0ZW4gbmVlZCB0byBzcGVjaWZ5IHdvcmtpbmcgYXJlYXMgb2YgbWVtb3J5OwotZGVwZW5kaW5nIG9uIHRoZSBhcHBsaWNhdGlvbiwgeW91IG1heSB3YW50IHRvIGluaXRpYWxpemUgc3VjaCBtZW1vcnkgb3IKLW5vdC4gIEBzY3tnYXNwfSBwcm92aWRlcyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyB0byBoZWxwIHlvdSBhdm9pZAotcmVwZXRpdGl2ZSBjb2RpbmcgZm9yIGJvdGggcHVycG9zZXMuCi0KLVlvdSBjYW4gdXNlIGxhYmVscyBhcyB1c3VhbCB0byBtYXJrIHRoZSBkYXRhIGFyZWFzLgotCi1AbWVudQotKiBJbml0aWFsaXplZDo6Ci0qIFVuaW5pdGlhbGl6ZWQ6OgotQGVuZCBtZW51Ci0KLUBub2RlIEluaXRpYWxpemVkCi1Ac3Vic2VjdGlvbiBJbml0aWFsaXplZCBkYXRhCi0KLVRoZXNlIGFyZSB0aGUgQHNje2dhc3B9IGRpcmVjdGl2ZXMgZm9yIGluaXRpYWxpemVkIGRhdGEsIGFuZCB0aGUgc3RhbmRhcmQKLUBzY3tnbnV9IGFzc2VtYmxlciBkaXJlY3RpdmVzIHRoZXkgZXhwYW5kIHRvOgotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuREFUQSBAdmFye2V4cHJ9LCBAdmFye2V4cHJ9LCBAZG90c3t9Ci1AaXRlbXggLkRBVEEuQiBAdmFye2V4cHJ9LCBAdmFye2V4cHJ9LCBAZG90c3t9Ci1AaXRlbXggLkRBVEEuVyBAdmFye2V4cHJ9LCBAdmFye2V4cHJ9LCBAZG90c3t9Ci1AaXRlbXggLkRBVEEuTCBAdmFye2V4cHJ9LCBAdmFye2V4cHJ9LCBAZG90c3t9Ci1FdmFsdWF0ZSBhcml0aG1ldGljIGV4cHJlc3Npb25zIEB2YXJ7ZXhwcn0sIGFuZCBlbWl0IHRoZSBjb3JyZXNwb25kaW5nCi1AY29kZXthc30gZGlyZWN0aXZlIChsYWJlbGxlZCB3aXRoIEB2YXJ7bGFifSkuICBUaGUgdW5xdWFsaWZpZWQKLUBjb2Rley5EQVRBfSBlbWl0cyBAc2FtcHsubG9uZ307IEBjb2Rley5EQVRBLkJ9IGVtaXRzIEBzYW1wey5ieXRlfTsKLUBjb2Rley5EQVRBLld9IGVtaXRzIEBzYW1wey5zaG9ydH07IGFuZCBAY29kZXsuREFUQS5MfSBlbWl0cwotQHNhbXB7Lmxvbmd9LgotCi1Gb3IgZXhhbXBsZSwgQHNhbXB7Zm9vIC5EQVRBIDEsMiwzfSBlbWl0cyBAc2FtcHtmb286IC5sb25nIDEsMiwzfS4KLQotQGl0ZW0gLkRBVEFCIEB2YXJ7cmVwZWF0fSwgQHZhcntleHByfQotQGl0ZW14IC5EQVRBQi5CIEB2YXJ7cmVwZWF0fSwgQHZhcntleHByfQotQGl0ZW14IC5EQVRBQi5XIEB2YXJ7cmVwZWF0fSwgQHZhcntleHByfQotQGl0ZW14IC5EQVRBQi5MIEB2YXJ7cmVwZWF0fSwgQHZhcntleHByfQotQGMgRklYTUUhIExvb2tzIGxpa2UgZ2FzcCBhY2NlcHRzIGFuZCBpZ25vcmVzIGFyZ3MgYWZ0ZXIgMm5kLgotTWFrZSBAY29kZXthc30gZW1pdCBAdmFye3JlcGVhdH0gY29waWVzIG9mIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbgotQHZhcntleHByfSAodXNpbmcgdGhlIEBjb2Rle2FzfSBkaXJlY3RpdmUgQGNvZGV7LmZpbGx9KS4KLUBzYW1wey5EQVRBQi5CfSByZXBlYXRzIG9uZS1ieXRlIHZhbHVlczsgQHNhbXB7LkRBVEFCLld9IHJlcGVhdHMKLXR3by1ieXRlIHZhbHVlczsgYW5kIEBzYW1wey5EQVRBQi5MfSByZXBlYXRzIGZvdXItYnl0ZSB2YWx1ZXMuCi1Ac2FtcHsuREFUQUJ9IHdpdGhvdXQgYSBzdWZmaXggcmVwZWF0cyBmb3VyLWJ5dGUgdmFsdWVzLCBqdXN0IGxpa2UKLUBzYW1wey5EQVRBQi5MfS4KLQotQGMgRklYTUUhIEFsbG93aW5nIHplcm8gbWlnaHQgYmUgdXNlZnVsIGZvciBlZGdlIGNvbmRpdGlvbnMgaW4gbWFjcm9zLgotQHZhcntyZXBlYXR9IG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiB3aXRoIGEgcG9zaXRpdmUgdmFsdWUuCi0KLUBpdGVtIC5TREFUQSAiQHZhcntzdHJ9IiBAZG90c3t9Ci1TdHJpbmcgZGF0YS4gIEVtaXRzIGEgY29uY2F0ZW5hdGlvbiBvZiBieXRlcywgcHJlY2lzZWx5IGFzIHlvdSBzcGVjaWZ5Ci10aGVtIChpbiBwYXJ0aWN1bGFyLCBAZW1waHtub3RoaW5nIGlzIGFkZGVkIHRvIG1hcmsgdGhlIGVuZH0gb2YgdGhlCi1zdHJpbmcpLiAgQHhyZWZ7Q29uc3RhbnRzLCwgU3RyaW5nIGFuZCBudW1lcmljIGNvbnN0YW50c30sIGZvciBkZXRhaWxzCi1hYm91dCBob3cgdG8gd3JpdGUgc3RyaW5ncy4gIEBjb2Rley5TREFUQX0gY29uY2F0ZW5hdGVzIG11bHRpcGxlCi1hcmd1bWVudHMsIG1ha2luZyBpdCBlYXN5IHRvIHN3aXRjaCBiZXR3ZWVuIHN0cmluZyByZXByZXNlbnRhdGlvbnMuICBZb3UKLWNhbiB1c2UgY29tbWFzIHRvIHNlcGFyYXRlIHRoZSBpbmRpdmlkdWFsIGFyZ3VtZW50cyBmb3IgY2xhcml0eSwgaWYgeW91Ci1jaG9vc2UuCi0KLUBpdGVtIC5TREFUQUIgQHZhcntyZXBlYXR9LCAiQHZhcntzdHJ9IiBAZG90c3t9Ci1SZXBlYXRlZCBzdHJpbmcgZGF0YS4gIFRoZSBmaXJzdCBhcmd1bWVudCBzcGVjaWZpZXMgaG93IG1hbnkgY29waWVzIG9mCi10aGUgc3RyaW5nIHRvIGVtaXQ7IHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHNwZWNpZnkgdGhlIHN0cmluZywgaW4gdGhlCi1zYW1lIHdheSBhcyB0aGUgYXJndW1lbnRzIHRvIEBjb2Rley5TREFUQX0uCi0KLUBpdGVtIC5TREFUQVogIkB2YXJ7c3RyfSIgQGRvdHN7fQotWmVyby10ZXJtaW5hdGVkIHN0cmluZyBkYXRhLiAgSnVzdCBsaWtlIEBjb2Rley5TREFUQX0sIGV4Y2VwdCB0aGF0Ci1AY29kZXsuU0RBVEFafSB3cml0ZXMgYSB6ZXJvIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgotCi1AaXRlbSAuU0RBVEFDICJAdmFye3N0cn0iIEBkb3Rze30KLUNvdW50LXByZWZpeGVkIHN0cmluZyBkYXRhLiAgSnVzdCBsaWtlIEBjb2Rley5TREFUQX0sIGV4Y2VwdCB0aGF0Ci1Ac2N7Z2FzcH0gcHJlY2VkZXMgdGhlIHN0cmluZyB3aXRoIGEgbGVhZGluZyBvbmUtYnl0ZSBjb3VudC4gIEZvcgotZXhhbXBsZSwgQHNhbXB7LlNEQVRBQyAiSEkifSBnZW5lcmF0ZXMgQHNhbXB7LmJ5dGUgMiw3Miw3M30uICBTaW5jZSB0aGUKLWNvdW50IGZpZWxkIGlzIG9ubHkgb25lIGJ5dGUsIHlvdSBjYW4gb25seSB1c2UgQGNvZGV7LlNEQVRBQ30gZm9yCi1zdHJpbmdzIGxlc3MgdGhhbiAyNTYgYnl0ZXMgaW4gbGVuZ3RoLgotQGVuZCBmdGFibGUKLQotQG5vZGUgVW5pbml0aWFsaXplZAotQHN1YnNlY3Rpb24gVW5pbml0aWFsaXplZCBkYXRhCi0KLUBjIEZJWE1FISAgLnNwYWNlIGRpZmZlcmVudCBvbiBzb21lIHBsYXRmb3Jtcywgbm90YWJseSBIUFBBLiAgQ29uZmlnPwotVXNlIHRoZSBAY29kZXsuUkVTfSwgQGNvZGV7LlNSRVN9LCBAY29kZXsuU1JFU0N9LCBhbmQgQGNvZGV7LlNSRVNafQotZGlyZWN0aXZlcyB0byByZXNlcnZlIG1lbW9yeSBhbmQgbGVhdmUgaXQgdW5pbml0aWFsaXplZC4gIEBzY3tnYXNwfQotcmVzb2x2ZXMgdGhlc2UgZGlyZWN0aXZlcyB0byBhcHByb3ByaWF0ZSBjYWxscyBvZiB0aGUgQHNje2dudX0KLUBjb2Rle2FzfSBAY29kZXsuc3BhY2V9IGRpcmVjdGl2ZS4KLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLlJFUyBAdmFye2NvdW50fQotQGl0ZW14IC5SRVMuQiBAdmFye2NvdW50fQotQGl0ZW14IC5SRVMuVyBAdmFye2NvdW50fQotQGl0ZW14IC5SRVMuTCBAdmFye2NvdW50fQotUmVzZXJ2ZSByb29tIGZvciBAdmFye2NvdW50fSB1bmluaXRpYWxpemVkIGVsZW1lbnRzIG9mIGRhdGEuICBUaGUKLXN1ZmZpeCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgZWFjaCBlbGVtZW50OiBAY29kZXsuUkVTLkJ9IHJlc2VydmVzCi1AdmFye2NvdW50fSBieXRlcywgQGNvZGV7LlJFUy5XfSByZXNlcnZlcyBAdmFye2NvdW50fSBwYWlycyBvZiBieXRlcywKLWFuZCBAY29kZXsuUkVTLkx9IHJlc2VydmVzIEB2YXJ7Y291bnR9IHF1YXJ0ZXRzLiAgQGNvZGV7LlJFU30gd2l0aG91dCBhCi1zdWZmaXggaXMgZXF1aXZhbGVudCB0byBAY29kZXsuUkVTLkx9LgotCi1AaXRlbSAuU1JFUyBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTLkIgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFUy5XIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVMuTCBAdmFye2NvdW50fQotQGMgRklYTUUhICBUaGlzIGlzIGJvcmluZy4gIFNob3VsZG4ndCBpdCBhdCBsZWFzdCBoYXZlIGEgZGlmZmVyZW50Ci1AYyAgICAgICAgIGRlZmF1bHQgc2l6ZT8gIChlLmcuIHRoZSAiUyIgc3VnZ2VzdHMgInN0cmluZyIsIGZvciB3aGljaCAuQgotQGMgICAgICAgICB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlKQotQGNvZGV7LlNSRVN9IGlzIGEgc3lub255bSBmb3IgQHNhbXB7LlJFU30uCi0KLUBpdGVtIC5TUkVTQyBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTQy5CIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVNDLlcgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFU0MuTCBAdmFye2NvdW50fQotTGlrZSBAY29kZXsuU1JFU30sIGJ1dCByZXNlcnZlcyBzcGFjZSBmb3IgQGNvZGV7QHZhcntjb3VudH0rMX0gZWxlbWVudHMuCi0KLUBpdGVtIC5TUkVTWiBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTWi5CIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVNaLlcgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFU1ouTCBAdmFye2NvdW50fQotTGlrZSBAY29kZXsuU1JFU30sIGJ1dCByZXNlcnZlcyBzcGFjZSBmb3IgQGNvZGV7QHZhcntjb3VudH0rMX0gZWxlbWVudHMuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBMaXN0aW5ncwotQHNlY3Rpb24gQXNzZW1ibHkgbGlzdGluZyBjb250cm9sCi0KLVRoZSBAc2N7Z2FzcH0gbGlzdGluZy1jb250cm9sIGRpcmVjdGl2ZXMgY29ycmVzcG9uZCB0bwotcmVsYXRlZCBAc2N7Z251fSBAY29kZXthc30gZGlyZWN0aXZlcy4KLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLlBSSU5UIExJU1QKLUBpdGVteCAuUFJJTlQgTk9MSVNUCi1QcmludCBjb250cm9sLiAgVGhpcyBkaXJlY3RpdmUgZW1pdHMgdGhlIEBzY3tnbnV9IEBjb2Rle2FzfSBkaXJlY3RpdmUKLUBjb2Rley5saXN0fSBvciBAY29kZXsubm9saXN0fSwgYWNjb3JkaW5nIHRvIGl0cyBhcmd1bWVudC4gIEB4cmVme0xpc3QsLAotQGNvZGV7Lmxpc3R9LCBhcy5pbmZvLCBVc2luZyBhc30sIGZvciBkZXRhaWxzIG9uIGhvdyB0aGVzZSBkaXJlY3RpdmVzCi1pbnRlcmFjdC4KLQotQGl0ZW0gLkZPUk0gTElOPUB2YXJ7bG59Ci1AaXRlbXggLkZPUk0gQ09MPUB2YXJ7Y29sc30KLUBpdGVteCAuRk9STSBMSU49QHZhcntsbn0gQ09MPUB2YXJ7Y29sc30KLVNwZWNpZnkgdGhlIHBhZ2Ugc2l6ZSBmb3IgYXNzZW1ibHkgbGlzdGluZ3M6IEB2YXJ7bG59IHJlcHJlc2VudHMgdGhlCi1udW1iZXIgb2YgbGluZXMsIGFuZCBAdmFye2NvbHN9IHRoZSBudW1iZXIgb2YgY29sdW1ucy4gIFlvdSBtYXkgc3BlY2lmeQotZWl0aGVyIHBhZ2UgZGltZW5zaW9uIGluZGVwZW5kZW50bHksIG9yIGJvdGggdG9nZXRoZXIuICBJZiB5b3UgZG8gbm90Ci1zcGVjaWZ5IHRoZSBudW1iZXIgb2YgbGluZXMsIEBzY3tnYXNwfSBhc3N1bWVzIDYwIGxpbmVzOyBpZiB5b3UgZG8gbm90Ci1zcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucywgQHNje2dhc3B9IGFzc3VtZXMgMTMyIGNvbHVtbnMuCi0oQW55IHZhbHVlcyB5b3UgbWF5IGhhdmUgc3BlY2lmaWVkIGluIHByZXZpb3VzIGluc3RhbmNlcyBvZiBAY29kZXsuRk9STX0KLWRvIEBlbXBoe25vdH0gY2Fycnkgb3ZlciBhcyBkZWZhdWx0cy4pICBFbWl0cyB0aGUgQGNvZGV7LnBzaXplfQotYXNzZW1ibGVyIGRpcmVjdGl2ZS4KLQotQGl0ZW0gLkhFQURJTkcgQHZhcntzdHJpbmd9Ci1TcGVjaWZ5IEB2YXJ7c3RyaW5nfSBhcyB0aGUgdGl0bGUgb2YgeW91ciBhc3NlbWJseSBsaXN0aW5ncy4gIEVtaXRzCi1Ac2FtcHsudGl0bGUgIkB2YXJ7c3RyaW5nfSJ9LgotCi1AaXRlbSAuUEFHRQotRm9yY2UgYSBuZXcgcGFnZSBpbiBhc3NlbWJseSBsaXN0aW5ncy4gIEVtaXRzIEBzYW1wey5lamVjdH0uCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBPdGhlciBDb21tYW5kcwotQHNlY3Rpb24gTWlzY2VsbGFuZW91cyBjb21tYW5kcwotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuQUxURVJOQVRFCi1Vc2UgdGhlIGFsdGVybmF0ZSBtYWNybyBzeW50YXggaGVuY2Vmb3J0aCBpbiB0aGUgYXNzZW1ibHkuCi1AeHJlZntBbHRlcm5hdGUsLCBBbHRlcm5hdGUgbWFjcm8gc3ludGF4fS4KLQotQGl0ZW0gLk9SRwotQGMgRklYTUUhICBUaGlzIGlzIHZlcnkgc3RyYW5nZSwgc2luY2UgX0dBU18gdW5kZXJzdGFuZHMgLm9yZwotVGhpcyBjb21tYW5kIGlzIHJlY29nbml6ZWQsIGJ1dCBub3QgeWV0IGltcGxlbWVudGVkLiAgQHNje2dhc3B9Ci1nZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgcHJvZ3JhbXMgdGhhdCB1c2UgQGNvZGV7Lk9SR30uCi0KLUBpdGVtIC5SQURJWCBAdmFye3N9Ci1AYyBGSVhNRSBubyB0ZXN0IGNhc2VzIGluIHRlc3RzdWl0ZS9nYXNwCi1Ac2N7Z2FzcH0gdW5kZXJzdGFuZHMgbnVtYmVycyBpbiBhbnkgb2YgYmFzZSB0d28sIGVpZ2h0LCB0ZW4sIG9yCi1zaXh0ZWVuLiAgWW91IGNhbiBlbmNvZGUgdGhlIGJhc2UgZXhwbGljaXRseSBpbiBhbnkgbnVtZXJpYyBjb25zdGFudAotKEBweHJlZntDb25zdGFudHMsLCBTdHJpbmcgYW5kIG51bWVyaWMgY29uc3RhbnRzfSkuICBJZiB5b3Ugd3JpdGUKLW51bWJlcnMgd2l0aG91dCBhbiBleHBsaWNpdCBpbmRpY2F0aW9uIG9mIHRoZSBiYXNlLCB0aGUgbW9zdCByZWNlbnQKLUBzYW1wey5SQURJWCBAdmFye3N9fSBjb21tYW5kIGRldGVybWluZXMgaG93IHRoZXkgYXJlIGludGVycHJldGVkLgotQHZhcntzfSBpcyBhIHNpbmdsZSBsZXR0ZXIsIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC5SQURJWCBCCi1CYXNlIDIuCi0KLUBpdGVtIC5SQURJWCBRCi1CYXNlIDguCi0KLUBpdGVtIC5SQURJWCBECi1CYXNlIDEwLiAgVGhpcyBpcyB0aGUgb3JpZ2luYWwgZGVmYXVsdCByYWRpeC4KLQotQGl0ZW0gLlJBRElYIEgKLUJhc2UgMTYuCi1AZW5kIHRhYmxlCi0KLVlvdSBtYXkgc3BlY2lmeSB0aGUgYXJndW1lbnQgQHZhcntzfSBpbiBsb3dlciBjYXNlIChhbnkgb2YgQHNhbXB7YnFkaH0pCi13aXRoIHRoZSBzYW1lIGVmZmVjdHMuCi0KLUBpdGVtIC5FWFBPUlQgQHZhcntuYW1lfQotQGl0ZW14IC5HTE9CQUwgQHZhcntuYW1lfQotQGMgRklYTUUhIE5vIHRlc3QgY2FzZXMgaW4gdGVzdHN1aXRlL2dhc3AKLURlY2xhcmUgQHZhcntuYW1lfSBnbG9iYWwgKGVtaXRzIEBzYW1wey5nbG9iYWwgQHZhcntuYW1lfX0pLiAgVGhlIHR3bwotZGlyZWN0aXZlcyBhcmUgc3lub255bW91cy4KLQotQGl0ZW0gLlBST0dSQU0KLU5vIGVmZmVjdDogQHNje2dhc3B9IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUsIGFuZCBzaWxlbnRseSBpZ25vcmVzIGl0LgotCi1AaXRlbSAuRU5ECi1NYXJrIGVuZCBvZiBlYWNoIHByZXByb2Nlc3NvciBmaWxlLiAgQHNje2dhc3B9IGlzc3VlcyBhIHdhcm5pbmcgaWYgaXQKLXJlYWNoZXMgZW5kIG9mIGZpbGUgd2l0aG91dCBzZWVpbmcgdGhpcyBjb21tYW5kLgotCi1AaXRlbSAuSU5DTFVERSAiQHZhcntzdHJ9IgotUHJlcHJvY2VzcyB0aGUgZmlsZSBuYW1lZCBieSBAdmFye3N0cn0sIGFzIGlmIGl0cyBjb250ZW50cyBhcHBlYXJlZAotd2hlcmUgdGhlIEBjb2Rley5JTkNMVURFfSBkaXJlY3RpdmUgZG9lcy4gIEBzY3tnYXNwfSBpbXBvc2VzIGEgbWF4aW11bQotbGltaXQgb2YgMzAgc3RhY2tlZCBpbmNsdWRlIGZpbGVzLCBhcyBhIHNhbml0eSBjaGVjay4KLUBjIEZJWE1FISAgV2h5IGlzIGluY2x1ZGUgZGVwdGggbm90IGFmZmVjdGVkIGJ5IC11PwotCi1AaXRlbSAuQUxJR04gQHZhcntzaXplfQotQGMgRklYTUUhIFdoeSBpcyB0aGlzIG5vdCB1dHRlcmx5IHBvaW50bGVzcz8KLUV2YWx1YXRlIHRoZSBhYnNvbHV0ZSBleHByZXNzaW9uIEB2YXJ7c2l6ZX0sIGFuZCBlbWl0IHRoZSBhc3NlbWJseQotaW5zdHJ1Y3Rpb24gQHNhbXB7LmFsaWduIEB2YXJ7c2l6ZX19IHVzaW5nIHRoZSByZXN1bHQuCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBTeW50YXggRGV0YWlscwotQHNlY3Rpb24gRGV0YWlscyBvZiB0aGUgR0FTUCBzeW50YXgKLQotU2luY2UgQHNje2dhc3B9IGlzIG1lYW50IHRvIHdvcmsgd2l0aCBhc3NlbWJseSBjb2RlLCBpdHMgc3RhdGVtZW50Ci1zeW50YXggaGFzIG5vIHN1cnByaXNlcyBmb3IgdGhlIGFzc2VtYmx5IHByb2dyYW1tZXIuCi0KLUBjaW5kZXggd2hpdGVzcGFjZQotQGVtcGh7V2hpdGVzcGFjZX0gKGJsYW5rcyBvciB0YWJzOyBAZW1waHtub3R9IG5ld2xpbmUpIGlzIHBhcnRpYWxseQotc2lnbmlmaWNhbnQsIGluIHRoYXQgaXQgZGVsaW1pdHMgdXAgdG8gdGhyZWUgZmllbGRzIGluIGEgbGluZS4gIFRoZQotYW1vdW50IG9mIHdoaXRlc3BhY2UgZG9lcyBub3QgbWF0dGVyOyB5b3UgbWF5IGxpbmUgdXAgZmllbGRzIGluIHNlcGFyYXRlCi1saW5lcyBpZiB5b3Ugd2lzaCwgYnV0IEBzY3tnYXNwfSBkb2VzIG5vdCByZXF1aXJlIHRoYXQuCi0KLUBjaW5kZXggZmllbGRzIG9mIEBzY3tnYXNwfSBzb3VyY2UgbGluZQotQGNpbmRleCBsYWJlbCBmaWVsZAotVGhlIEBlbXBoe2ZpcnN0IGZpZWxkfSwgYW4gb3B0aW9uYWwgQGRmbntsYWJlbH0sIG11c3QgYmUgZmx1c2ggbGVmdCBpbiBhCi1saW5lICh3aXRoIG5vIGxlYWRpbmcgd2hpdGVzcGFjZSkgaWYgaXQgYXBwZWFycyBhdCBhbGwuICBZb3UgbWF5IHVzZSBhCi1jb2xvbiBhZnRlciB0aGUgbGFiZWwgaWYgeW91IHdpc2g7IEBzY3tnYXNwfSBuZWl0aGVyIHJlcXVpcmVzIHRoZSBjb2xvbgotbm9yIG9iamVjdHMgdG8gaXQgKGJ1dCB3aWxsIG5vdCBpbmNsdWRlIGl0IGFzIHBhcnQgb2YgdGhlIGxhYmVsIG5hbWUpLgotCi1AY2luZGV4IGRpcmVjdGl2ZSBmaWVsZAotVGhlIEBlbXBoe3NlY29uZCBmaWVsZH0sIHdoaWNoIG11c3QgYXBwZWFyIGFmdGVyIHNvbWUgd2hpdGVzcGFjZSwKLWNvbnRhaW5zIGEgQHNje2dhc3B9IG9yIGFzc2VtYmx5IEBkZm57ZGlyZWN0aXZlfS4KLQotQGNpbmRleCBhcmd1bWVudCBmaWVsZHMKLUFueSBAZW1waHtmdXJ0aGVyIGZpZWxkc30gb24gYSBsaW5lIGFyZSBAZGZue2FyZ3VtZW50c30gdG8gdGhlCi1kaXJlY3RpdmU7IHlvdSBjYW4gc2VwYXJhdGUgdGhlbSBmcm9tIG9uZSBhbm90aGVyIHVzaW5nIGVpdGhlciBjb21tYXMgb3IKLXdoaXRlc3BhY2UuCi0KLUBtZW51Ci0qIE1hcmtlcnM6OgotKiBDb25zdGFudHM6OgotKiBTeW1ib2xzOjoKLSogRXhwcmVzc2lvbnM6OgotKiBTdHJpbmcgQnVpbHRpbnM6OgotQGVuZCBtZW51Ci0KLUBub2RlIE1hcmtlcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgc3ludGFjdGljIG1hcmtlcnMKLQotQHNje2dhc3B9IHJlY29nbml6ZXMgYSBmZXcgc3BlY2lhbCBtYXJrZXJzOiB0byBkZWxpbWl0IGNvbW1lbnRzLCB0bwotY29udGludWUgYSBzdGF0ZW1lbnQgb24gdGhlIG5leHQgbGluZSwgdG8gc2VwYXJhdGUgc3ltYm9scyBmcm9tIG90aGVyCi1jaGFyYWN0ZXJzLCBhbmQgdG8gY29weSB0ZXh0IHRvIHRoZSBvdXRwdXQgbGl0ZXJhbGx5LiAgKE9uZSBvdGhlcgotc3BlY2lhbCBtYXJrZXIsIEBzYW1we1xAQH0sIHdvcmtzIG9ubHkgd2l0aGluIG1hY3JvIGRlZmluaXRpb25zOwotQHB4cmVme01hY3JvcywsIERlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LikKLQotQGNpbmRleCBjb21tZW50cwotVGhlIHRyYWlsaW5nIHBhcnQgb2YgYW55IEBzY3tnYXNwfSBzb3VyY2UgbGluZSBtYXkgYmUgYSBAZGZue2NvbW1lbnR9LgotQSBjb21tZW50IGJlZ2lucyB3aXRoIHRoZSBmaXJzdCB1bnF1b3RlZCBjb21tZW50IGNoYXJhY3RlciAoQHNhbXB7IX0gYnkKLWRlZmF1bHQpLCBvciBhbiBlc2NhcGVkIG9yIGRvdWJsZWQgY29tbWVudCBjaGFyYWN0ZXIgKEBzYW1we1whfSBvcgotQHNhbXB7ISF9IGJ5IGRlZmF1bHQpLCBhbmQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIGEgbGluZS4gIFlvdSBjYW4KLXNwZWNpZnkgd2hhdCBjb21tZW50IGNoYXJhY3RlciB0byB1c2Ugd2l0aCB0aGUgQHNhbXB7LWN9IG9wdGlvbgotKEBweHJlZntJbnZva2luZyBHQVNQLCwgQ29tbWFuZCBMaW5lIE9wdGlvbnN9KS4gIFRoZSB0d28ga2luZHMgb2YKLWNvbW1lbnQgbWFya2VycyBsZWFkIHRvIHNsaWdodGx5IGRpZmZlcmVudCB0cmVhdG1lbnQ6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gIQotQSBzaW5nbGUsIHVuLWVzY2FwZWQgY29tbWVudCBjaGFyYWN0ZXIgZ2VuZXJhdGVzIGFuIGFzc2VtYmx5IGNvbW1lbnQgaW4KLXRoZSBAc2N7Z2FzcH0gb3V0cHV0LiAgQHNje2dhc3B9IGV2YWx1YXRlcyBhbnkgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcwotKG1hY3JvIGFyZ3VtZW50cywgb3IgdmFyaWFibGVzIGRlZmluZWQgd2l0aCBAY29kZXsuQVNTSUdOQX0gb3IKLUBjb2Rley5BU1NJR05DfSkgcHJlc2VudC4gIEZvciBleGFtcGxlLCBhIG1hY3JvIHRoYXQgYmVnaW5zIGxpa2UgdGhpcwotCi1AZXhhbXBsZQotICAgICAgICAuTUFDUk8gIFNVTSBGUk9NPTAsIFRPPTkKLSAgICAgICAgISBcRlJPTSBcVE8KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLWlzc3VlcyBhcyB0aGUgZmlyc3QgbGluZSBvZiBvdXRwdXQgYSBjb21tZW50IHRoYXQgcmVjb3JkcyB0aGUKLXZhbHVlcyB5b3UgdXNlZCB0byBjYWxsIHRoZSBtYWNyby4KLQotQGMgY29tbWVudHMsIHByZXByb2Nlc3Nvci1vbmx5Ci1AYyBwcmVwcm9jZXNzb3Itb25seSBjb21tZW50cwotQGMgR0FTUC1vbmx5IGNvbW1lbnRzCi1AaXRlbSBcIQotQGl0ZW14ICEhCi1FaXRoZXIgYW4gZXNjYXBlZCBjb21tZW50IGNoYXJhY3Rlciwgb3IgYSBkb3VibGUgY29tbWVudCBjaGFyYWN0ZXIsCi1tYXJrcyBhIEBzY3tnYXNwfSBzb3VyY2UgY29tbWVudC4gIEBzY3tnYXNwfSBkb2VzIG5vdCBjb3B5IHN1Y2ggY29tbWVudHMKLXRvIHRoZSBhc3NlbWJseSBvdXRwdXQuCi1AZW5kIHRhYmxlCi0KLUBjaW5kZXggY29udGludWF0aW9uIGNoYXJhY3RlcgotQGtpbmRleCArCi1UbyBAZW1waHtjb250aW51ZSBhIHN0YXRlbWVudH0gb24gdGhlIG5leHQgbGluZSBvZiB0aGUgZmlsZSwgYmVnaW4gdGhlCi1zZWNvbmQgbGluZSB3aXRoIHRoZSBjaGFyYWN0ZXIgQHNhbXB7K30uCi0KLUBjaW5kZXggbGl0ZXJhbCBjb3B5IHRvIG91dHB1dAotQGNpbmRleCBjb3B5aW5nIGxpdGVyYWxseSB0byBvdXRwdXQKLUBjaW5kZXggcHJlcHJvY2Vzc2luZywgYXZvaWRpbmcKLUBjaW5kZXggYXZvaWRpbmcgcHJlcHJvY2Vzc2luZwotT2NjYXNpb25hbGx5IHlvdSBtYXkgd2FudCB0byBwcmV2ZW50IEBzY3tnYXNwfSBmcm9tIHByZXByb2Nlc3Npbmcgc29tZQotcGFydGljdWxhciBiaXQgb2YgdGV4dC4gIFRvIEBlbXBoe2NvcHkgbGl0ZXJhbGx5fSBmcm9tIHRoZSBAc2N7Z2FzcH0KLXNvdXJjZSB0byBpdHMgb3V0cHV0LCBwbGFjZSBAc2FtcHtcKH0gYmVmb3JlIHRoZSBzdHJpbmcgdG8gY29weSwgYW5kCi1Ac2FtcHspfSBhdCB0aGUgZW5kLiAgRm9yIGV4YW1wbGUsIHdyaXRlIEBzYW1we1woXCEpfSBpZiB5b3UgbmVlZCB0aGUKLWNoYXJhY3RlcnMgQHNhbXB7XCF9IGluIHlvdXIgYXNzZW1ibHkgb3V0cHV0LgotCi1AY2luZGV4IHN5bWJvbCBzZXBhcmF0b3IKLUBjaW5kZXggdGV4dCwgc2VwYXJhdGluZyBmcm9tIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgc2VwYXJhdGluZyBmcm9tIHRleHQKLVRvIEBlbXBoe3NlcGFyYXRlIGEgcHJlcHJvY2Vzc29yIHZhcmlhYmxlfSBmcm9tIHRleHQgdG8gYXBwZWFyCi1pbW1lZGlhdGVseSBhZnRlciBpdHMgdmFsdWUsIHdyaXRlIGEgc2luZ2xlIHF1b3RlIChAY29kZXsnfSkuICBGb3IKLWV4YW1wbGUsIEBzYW1wey5TREFUQSAiXFAnMSJ9IHdyaXRlcyBhIHN0cmluZyBidWlsdCBieSBjb25jYXRlbmF0aW5nIHRoZQotdmFsdWUgb2YgQGNvZGV7UH0gYW5kIHRoZSBkaWdpdCBAc2FtcHsxfS4gIChZb3UgY2Fubm90IGFjaGlldmUgdGhpcyBieQotd3JpdGluZyBqdXN0IEBzYW1we1xQMX0sIHNpbmNlIEBzYW1we1AxfSBpcyBpdHNlbGYgYSB2YWxpZCBuYW1lIGZvciBhCi1wcmVwcm9jZXNzb3IgdmFyaWFibGUuKQotCi1Abm9kZSBDb25zdGFudHMKLUBzdWJzZWN0aW9uIFN0cmluZyBhbmQgbnVtZXJpYyBjb25zdGFudHMKLQotVGhlcmUgYXJlIHR3byB3YXlzIG9mIHdyaXRpbmcgQGRmbntzdHJpbmcgY29uc3RhbnRzfSBpbiBAc2N7Z2FzcH06IGFzCi1saXRlcmFsIHRleHQsIGFuZCBieSBudW1lcmljIGJ5dGUgdmFsdWUuICBTcGVjaWZ5IGEgc3RyaW5nIGxpdGVyYWwKLWJldHdlZW4gZG91YmxlIHF1b3RlcyAoQGNvZGV7IkB2YXJ7c3RyfSJ9KS4gIFNwZWNpZnkgYW4gaW5kaXZpZHVhbAotbnVtZXJpYyBieXRlIHZhbHVlIGFzIGFuIGFic29sdXRlIGV4cHJlc3Npb24gYmV0d2VlbiBhbmdsZSBicmFja2V0cwotKEBjb2RlezxAdmFye2V4cHJ9Pn0uICBEaXJlY3RpdmVzIHRoYXQgb3V0cHV0IHN0cmluZ3MgYWxsb3cgeW91IHRvCi1zcGVjaWZ5IGFueSBudW1iZXIgb2YgZWl0aGVyIGtpbmQgb2YgdmFsdWUsIGluIHdoYXRldmVyIG9yZGVyIGlzCi1jb252ZW5pZW50LCBhbmQgY29uY2F0ZW5hdGUgdGhlIHJlc3VsdC4gIChBbHRlcm5hdGUgc3ludGF4IG1vZGUKLWludHJvZHVjZXMgYSBudW1iZXIgb2YgYWx0ZXJuYXRpdmUgc3RyaW5nIG5vdGF0aW9uczsgQHB4cmVme0FsdGVybmF0ZSwsCi1BbHRlcm5hdGUgbWFjcm8gc3ludGF4fS4pCi0KLUBjIERldGFpbHMgb2YgbnVtZXJpYyBub3RhdGlvbiwgZS5nLiBiYXNlIHByZWZpeGVzCi1Zb3UgY2FuIHdyaXRlIEBkZm57bnVtZXJpYyBjb25zdGFudHN9IGVpdGhlciBpbiBhIHNwZWNpZmljIGJhc2UsIG9yIGluCi13aGF0ZXZlciBiYXNlIGlzIGN1cnJlbnRseSBzZWxlY3RlZCAoZWl0aGVyIDEwLCBvciBzZWxlY3RlZCBieSB0aGUgbW9zdAotcmVjZW50IEBjb2Rley5SQURJWH0pLgotCi1UbyB3cml0ZSBhIG51bWJlciBpbiBhIEBlbXBoe3NwZWNpZmljIGJhc2V9LCB1c2UgdGhlIHBhdHRlcm4KLUBjb2Rle0B2YXJ7c30nQHZhcntkZGR9fTogYSBiYXNlIHNwZWNpZmllciBjaGFyYWN0ZXIgQHZhcntzfSwgZm9sbG93ZWQKLWJ5IGEgc2luZ2xlIHF1b3RlIGZvbGxvd2VkIGJ5IGRpZ2l0cyBAdmFye2RkZH0uICBUaGUgYmFzZSBzcGVjaWZpZXIKLWNoYXJhY3RlciBtYXRjaGVzIHRob3NlIHlvdSBjYW4gc3BlY2lmeSB3aXRoIEBjb2Rley5SQURJWH06IEBzYW1we0J9IGZvcgotYmFzZSAyLCBAc2FtcHtRfSBmb3IgYmFzZSA4LCBAc2FtcHtEfSBmb3IgYmFzZSAxMCwgYW5kIEBzYW1we0h9IGZvciBiYXNlCi0xNi4gIChZb3UgY2FuIHdyaXRlIHRoaXMgY2hhcmFjdGVyIGluIGxvd2VyIGNhc2UgaWYgeW91IHByZWZlci4pCi0KLUBjIEZJWE1FISBXaGF0IGFyZSBydWxlcyBmb3IgcmVjb2duaXppbmcgbnVtYmVyIGluIGRlZmx0IGJhc2U/ICBXaGF0ZXZlcgotQGMgICAgICAgIGlzIGxlZnQgb3ZlciBhZnRlciBwYXJzaW5nIG90aGVyIHRoaW5ncz8/Ci0KLUBub2RlIFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbHMKLQotQHNje2dhc3B9IHJlY29nbml6ZXMgc3ltYm9sIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCBhbnkgYWxwaGFiZXRpYyBjaGFyYWN0ZXIsCi1Ac2FtcHtffSwgb3IgQHNhbXB7JH0sIGFuZCBjb250aW51ZSB3aXRoIGFueSBvZiB0aGUgc2FtZSBjaGFyYWN0ZXJzIG9yCi13aXRoIGRpZ2l0cy4gIExhYmVsIG5hbWVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcy4KLQotQG5vZGUgRXhwcmVzc2lvbnMKLUBzdWJzZWN0aW9uIEFyaXRobWV0aWMgZXhwcmVzc2lvbnMgaW4gR0FTUAotCi1AY2luZGV4IGFic29sdXRlIGV4cHJlc3Npb25zCi1AY2luZGV4IHJlbG9jYXRhYmxlIGV4cHJlc3Npb25zCi1UaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGV4cHJlc3Npb25zLCBkZXBlbmRpbmcgb24gdGhlaXIgcmVzdWx0OgotQGRmbnthYnNvbHV0ZX0gZXhwcmVzc2lvbnMsIHdoaWNoIHJlc29sdmUgdG8gYSBjb25zdGFudCAodGhhdCBpcywgdGhleQotZG8gbm90IGludm9sdmUgYW55IHZhbHVlcyB1bmtub3duIHRvIEBzY3tnYXNwfSksIGFuZCBAZGZue3JlbG9jYXRhYmxlfQotZXhwcmVzc2lvbnMsIHdoaWNoIG11c3QgcmVkdWNlIHRvIHRoZSBmb3JtCi0KLUBleGFtcGxlCi1AdmFye2FkZHN5bX0rQHZhcntjb25zdH0tQHZhcntzdWJzeW19Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVyZSBAdmFye2FkZHN5bX0gYW5kIEB2YXJ7c3Vic3ltfSBhcmUgYXNzZW1ibHkgc3ltYm9scyBvZiB1bmtub3duCi12YWx1ZSwgYW5kIEB2YXJ7Y29uc3R9IGlzIGEgY29uc3RhbnQuCi0KLUFyaXRobWV0aWMgZm9yIEBzY3tnYXNwfSBleHByZXNzaW9ucyBmb2xsb3dzIHZlcnkgc2ltaWxhciBydWxlcyB0byBDLgotWW91IGNhbiB1c2UgcGFyZW50aGVzZXMgdG8gY2hhbmdlIHByZWNlZGVuY2U7IG90aGVyd2lzZSwgYXJpdGhtZXRpYwotcHJpbWl0aXZlcyBoYXZlIGRlY3JlYXNpbmcgcHJlY2VkZW5jZSBpbiB0aGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZwotbGlzdC4KLQotQGVudW1lcmF0ZQotQGl0ZW0KLVNpbmdsZS1hcmd1bWVudCBAY29kZXsrfSAoaWRlbnRpdHkpLCBAY29kZXstfSAoYXJpdGhtZXRpYyBvcHBvc2l0ZSksIG9yCi1AY29kZXt+fSAoYml0d2lzZSBuZWdhdGlvbikuICBAZW1waHtUaGUgYXJndW1lbnQgbXVzdCBiZSBhbiBhYnNvbHV0ZQotZXhwcmVzc2lvbi59Ci0KLUBpdGVtCi1AY29kZXsqfSAobXVsdGlwbGljYXRpb24pIGFuZCBAY29kZXsvfSAoZGl2aXNpb24pLiAgQGVtcGh7Qm90aCBhcmd1bWVudHMKLW11c3QgYmUgYWJzb2x1dGUgZXhwcmVzc2lvbnMufQotCi1AaXRlbQotQGNvZGV7K30gKGFkZGl0aW9uKSBhbmQgQGNvZGV7LX0gKHN1YnRyYWN0aW9uKS4gIEBlbXBoe0F0IGxlYXN0IG9uZSBhcmd1bWVudAotbXVzdCBiZSBhYnNvbHV0ZS59Ci1AYyBGSVhNRSEgIEFjdHVhbGx5LCBzdWJ0cmFjdGlvbiBkb2Vzbid0IGNoZWNrIGZvciB0aGlzLgotCi1AaXRlbQotQGNvZGV7Jn0gKGJpdHdpc2UgYW5kKS4gIEBlbXBoe0JvdGggYXJndW1lbnRzIG11c3QgYmUgYWJzb2x1dGUufQotCi1AaXRlbQotQGMgRklYTUUhICBJIGFncmVlIH4gaXMgYSBiZXR0ZXIgbm90YXRpb24gdGhhbiBeIGZvciB4b3IsIGJ1dCBpcyB0aGUKLUBjICAgICAgICAgaW1wcm92ZW1lbnQgd29ydGggZGlmZmVyaW5nIGZyb20gQz8KLUBjb2Rle3x9IChiaXR3aXNlIG9yKSBhbmQgQGNvZGV7fn0gKGJpdHdpc2UgZXhjbHVzaXZlIG9yOyBAY29kZXtefSBpbgotQykuICBAZW1waHtCb3RoIGFyZ3VtZW50cyBtdXN0IGJlIGFic29sdXRlLn0KLUBlbmQgZW51bWVyYXRlCi0KLUBub2RlIFN0cmluZyBCdWlsdGlucwotQHN1YnNlY3Rpb24gU3RyaW5nIHByaW1pdGl2ZXMKLQotWW91IGNhbiB1c2UgdGhlc2UgcHJpbWl0aXZlcyB0byBtYW5pcHVsYXRlIHN0cmluZ3MgKGluIHRoZSBhcmd1bWVudAotZmllbGQgb2YgQHNje2dhc3B9IHN0YXRlbWVudHMpOgotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuTEVOKCJAdmFye3N0cn0iKQotQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2Ygc3RyaW5nIEBjb2RleyJAdmFye3N0cn0ifSwgYXMgYW4gYWJzb2x1dGUKLWV4cHJlc3Npb24uICBGb3IgZXhhbXBsZSwgQHNhbXB7LlJFUy5CIC5MRU4oInNhbXBsZSIpfSByZXNlcnZlcyBzaXgKLWJ5dGVzIG9mIG1lbW9yeS4KLQotQGl0ZW0gLklOU1RSKCJAdmFye3N0cmluZ30iLCAiQHZhcntzZWd9IiwgQHZhcntpeH0pCi1TZWFyY2ggZm9yIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIEB2YXJ7c2VnfSBhZnRlciBwb3NpdGlvbiBAdmFye2l4fSBvZgotQHZhcntzdHJpbmd9LiAgRm9yIGV4YW1wbGUsIEBzYW1wey5JTlNUUigiQUJDREVGRyIsICJDREUiLCAwKX0gZXZhbHVhdGVzCi10byB0aGUgYWJzb2x1dGUgcmVzdWx0IEBjb2RlezJ9LgotCi1UaGUgcmVzdWx0IGlzIEBjb2Rley0xfSBpZiBAdmFye3NlZ30gZG9lcyBub3Qgb2NjdXIgaW4gQHZhcntzdHJpbmd9Ci1hZnRlciBwb3NpdGlvbiBAdmFye2l4fS4KLQotQGl0ZW0gLlNVQlNUUigiQHZhcntzdHJpbmd9IixAdmFye3N0YXJ0fSxAdmFye2xlbn0pCi1UaGUgc3Vic3RyaW5nIG9mIEB2YXJ7c3RyaW5nfSBiZWdpbm5pbmcgYXQgYnl0ZSBudW1iZXIgQHZhcntzdGFydH0gYW5kCi1leHRlbmRpbmcgZm9yIEB2YXJ7bGVufSBieXRlcy4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIEFsdGVybmF0ZQotQHNlY3Rpb24gQWx0ZXJuYXRlIG1hY3JvIHN5bnRheAotCi1JZiB5b3Ugc3BlY2lmeSBAc2FtcHstYX0gb3IgQHNhbXB7LS1hbHRlcm5hdGV9IG9uIHRoZSBAc2N7Z2FzcH0gY29tbWFuZAotbGluZSwgdGhlIHByZXByb2Nlc3NvciB1c2VzIHNvbWV3aGF0IGRpZmZlcmVudCBzeW50YXguICBUaGlzIHN5bnRheCBpcwotcmVtaW5pc2NlbnQgb2YgdGhlIHN5bnRheCBvZiBQaGFyIExhcCBtYWNybyBhc3NlbWJsZXIsIGJ1dCBpdAotaXMgQGVtcGh7bm90fSBtZWFudCB0byBiZSBhIGZ1bGwgZW11bGF0aW9uIG9mIFBoYXIgTGFwIG9yIHNpbWlsYXIKLWFzc2VtYmxlcnMuICBJbiBwYXJ0aWN1bGFyLCBAc2N7Z2FzcH0gZG9lcyBub3Qgc3VwcG9ydCBkaXJlY3RpdmVzIHN1Y2gKLWFzIEBjb2Rle0RCfSBhbmQgQGNvZGV7SVJQfSwgZXZlbiBpbiBhbHRlcm5hdGUgc3ludGF4IG1vZGUuCi0KLUluIHBhcnRpY3VsYXIsIEBzYW1wey1hfSAob3IgQHNhbXB7LS1hbHRlcm5hdGV9KSBlbGljaXRzIHRoZXNlCi1kaWZmZXJlbmNlczoKLQotQHRhYmxlIEBlbXBoCi1AaXRlbSBQcmVwcm9jZXNzb3IgZGlyZWN0aXZlcwotWW91IGNhbiB1c2UgQHNje2dhc3B9IHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHdpdGhvdXQgYSBsZWFkaW5nIEBzYW1wey59Ci1kb3QuICBGb3IgZXhhbXBsZSwgeW91IGNhbiB3cml0ZSBAc2FtcHtTREFUQX0gd2l0aCB0aGUgc2FtZSBlZmZlY3QgYXMKLUBzYW1wey5TREFUQX0uCi0KLUBpdGVtIExPQ0FMCi1PbmUgYWRkaXRpb25hbCBkaXJlY3RpdmUsIEBjb2Rle0xPQ0FMfSwgaXMgYXZhaWxhYmxlLiAgQHhyZWZ7TWFjcm9zLCwKLURlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LCBmb3IgYW4gZXhwbGFuYXRpb24gb2YgaG93IHRvIHVzZQotQGNvZGV7TE9DQUx9LgotCi1AbmVlZCAyMDAwCi1AaXRlbSBTdHJpbmcgZGVsaW1pdGVycwotWW91IGNhbiB3cml0ZSBzdHJpbmdzIGRlbGltaXRlZCBpbiB0aGVzZSBvdGhlciB3YXlzIGJlc2lkZXMKLUBjb2RleyJAdmFye3N0cmluZ30ifToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAnQHZhcntzdHJpbmd9JwotWW91IGNhbiBkZWxpbWl0IHN0cmluZ3Mgd2l0aCBzaW5nbGUtcXVvdGUgY2hhcmF0ZXJzLgotCi1AaXRlbSA8QHZhcntzdHJpbmd9PgotWW91IGNhbiBkZWxpbWl0IHN0cmluZ3Mgd2l0aCBtYXRjaGluZyBhbmdsZSBicmFja2V0cy4KLUBlbmQgdGFibGUKLQotQGl0ZW0gc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcgZXNjYXBlCi1UbyBpbmNsdWRlIGFueSBzaW5nbGUgY2hhcmFjdGVyIGxpdGVyYWxseSBpbiBhIHN0cmluZyAoZXZlbiBpZiB0aGUKLWNoYXJhY3RlciB3b3VsZCBvdGhlcndpc2UgaGF2ZSBzb21lIHNwZWNpYWwgbWVhbmluZyksIHlvdSBjYW4gcHJlZml4IHRoZQotY2hhcmFjdGVyIHdpdGggQHNhbXB7IX0gKGFuIGV4Y2xhbWF0aW9uIG1hcmspLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4KLXdyaXRlIEBzYW1wezw0LjMgIT4gNS40ISE+fSB0byBnZXQgdGhlIGxpdGVyYWwgdGV4dCBAc2FtcHs0LjMgPiA1LjQhfS4KLQotQGl0ZW0gRXhwcmVzc2lvbiByZXN1bHRzIGFzIHN0cmluZ3MKLVlvdSBjYW4gd3JpdGUgQHNhbXB7JUB2YXJ7ZXhwcn19IHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIEB2YXJ7ZXhwcn0KLWFuZCB1c2UgdGhlIHJlc3VsdCBhcyBhIHN0cmluZy4gIAotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmRleAotQHVubnVtYmVyZWQgSW5kZXgKLQotQHByaW50aW5kZXggY3AKLQotQGNvbnRlbnRzCi1AYnllCmRpZmYgLS1naXQgYS9nYXMvZG9jL2g4LnRleGkgYi9nYXMvZG9jL2g4LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjE3MTQuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9oOC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotQGNsZWFyIEFMTC1BUkNICi1AY2xlYXIgR0VORVJJQwotQGNsZWFyIElOVEVSTkFMUwotQGNsZWFyIE1VTFRJLU9CSgotQGNsZWFyIEFPVVQKLUBjbGVhciBCT1VUCi1Ac2V0IENPRkYKLUBjbGVhciBFTEYKLUBzZXQgSGl0YWNoaS1hbGwKLUBzZXQgSDgvMzAwCi1Ac2V0IEg4LzUwMAotQHNldCBTSAotQGNsZWFyIERJRkYtVEJMLUtMVUdFCi1Ac2V0IElFRUVGTE9BVAotQGNsZWFyIFczMgotQHNldCBXMTYKLUBzZXQgU1BFQ0lBTC1TWU1TCi1Ac2V0IEFTIGFzCi1Ac2V0IEdDQyBnY2MKLUBzZXQgTEQgbGQKLUBzZXQgVEFSR0VUIEg4LzMwMCBhbmQgSDgvNTAwCi1Ac2V0IFRBUkdFVCBIOC8zMDAsIEg4LzUwMCwgYW5kIEhpdGFjaGkgU0gKLUBzZXQgT0JKLU5BTUUgQ09GRgotQGMKLUBjbGVhciBoYXZlLXN0YWJzCi1Ac2V0IGFibm9ybWFsLXNlcGFyYXRvcgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9pbnRlcm5hbHMudGV4aSBiL2dhcy9kb2MvaW50ZXJuYWxzLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYzlhYzcuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9pbnRlcm5hbHMudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE2OTQgKzAsMCBAQAotXGlucHV0IHRleGluZm8KLUBzZXRmaWxlbmFtZSBpbnRlcm5hbHMuaW5mbwotQG5vZGUgVG9wCi1AdG9wIEFzc2VtYmxlciBJbnRlcm5hbHMKLUByYWlzZXNlY3Rpb25zCi1AY2luZGV4IGludGVybmFscwotCi1UaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIGFzc2VtYmxlci4gIEl0IGlzIGluY29tcGxldGUsIGJ1dAotaXQgbWF5IGhlbHAgYSBiaXQuCi0KLVRoaXMgY2hhcHRlciB3YXMgbGFzdCBtb2RpZmllZCBvbiAkRGF0ZSQuICBJdCBpcyBub3QgdXBkYXRlZCByZWd1bGFybHksIGFuZCBpdAotbWF5IGJlIG91dCBvZiBkYXRlLgotCi1AbWVudQotKiBHQVMgdmVyc2lvbnM6OiAgICAgICAgR0FTIHZlcnNpb25zCi0qIERhdGEgdHlwZXM6OgkJRGF0YSB0eXBlcwotKiBHQVMgcHJvY2Vzc2luZzo6ICAgICAgV2hhdCBHQVMgZG9lcyB3aGVuIGl0IHJ1bnMKLSogUG9ydGluZyBHQVM6OiAgICAgICAgIFBvcnRpbmcgR0FTCi0qIFJlbGF4YXRpb246OiAgICAgICAgICBSZWxheGF0aW9uCi0qIEJyb2tlbiB3b3Jkczo6ICAgICAgICBCcm9rZW4gd29yZHMKLSogSW50ZXJuYWwgZnVuY3Rpb25zOjogIEludGVybmFsIGZ1bmN0aW9ucwotKiBUZXN0IHN1aXRlOjogICAgICAgICAgVGVzdCBzdWl0ZQotQGVuZCBtZW51Ci0KLUBub2RlIEdBUyB2ZXJzaW9ucwotQHNlY3Rpb24gR0FTIHZlcnNpb25zCi0KLUdBUyBoYXMgYWNxdWlyZWQgbGF5ZXJzIG9mIGNvZGUgb3ZlciB0aW1lLiAgVGhlIG9yaWdpbmFsIEdBUyBvbmx5IHN1cHBvcnRlZCB0aGUKLWEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCwgd2l0aCB0aHJlZSBzZWN0aW9ucy4gIFN1cHBvcnQgZm9yIG11bHRpcGxlIHNlY3Rpb25zCi1oYXMgYmVlbiBhZGRlZCBpbiB0d28gZGlmZmVyZW50IHdheXMuCi0KLVRoZSBwcmVmZXJyZWQgYXBwcm9hY2ggaXMgdG8gdXNlIHRoZSB2ZXJzaW9uIG9mIEdBUyBjcmVhdGVkIHdoZW4gdGhlIHN5bWJvbAotQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgZGVmaW5lZC4gIFRoZSBvdGhlciB2ZXJzaW9ucyBvZiBHQVMgYXJlIGRvY3VtZW50ZWQgZm9yCi1oaXN0b3JpY2FsIHB1cnBvc2VzLCBhbmQgdG8gaGVscCBhbnlib2R5IHdobyBoYXMgdG8gZGVidWcgY29kZSB3cml0dGVuIGZvcgotdGhlbS4KLQotVGhlIHR5cGUgQGNvZGV7c2VnVH0gaXMgdXNlZCB0byByZXByZXNlbnQgYSBzZWN0aW9uIGluIGNvZGUgd2hpY2ggbXVzdCB3b3JrCi13aXRoIGFsbCB2ZXJzaW9ucyBvZiBHQVMuCi0KLUBtZW51Ci0qIE9yaWdpbmFsIEdBUzo6ICAgICAgICBPcmlnaW5hbCBHQVMgdmVyc2lvbgotKiBNQU5ZX1NFR01FTlRTOjogICAgICAgTUFOWV9TRUdNRU5UUyBnYXMgdmVyc2lvbgotKiBCRkRfQVNTRU1CTEVSOjogICAgICAgQkZEX0FTU0VNQkxFUiBnYXMgdmVyc2lvbgotQGVuZCBtZW51Ci0KLUBub2RlIE9yaWdpbmFsIEdBUwotQHN1YnNlY3Rpb24gT3JpZ2luYWwgR0FTCi0KLVRoZSBvcmlnaW5hbCBHQVMgb25seSBzdXBwb3J0ZWQgdGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCB3aXRoIHRocmVlCi1zZWN0aW9uczogQHNhbXB7LnRleHR9LCBAc2FtcHsuZGF0YX0sIGFuZCBAc2FtcHsuYnNzfS4gIFRoaXMgaXMgdGhlIHZlcnNpb24gb2YKLUdBUyB0aGF0IGlzIGNvbXBpbGVkIGlmIG5laXRoZXIgQGNvZGV7QkZEX0FTU0VNQkxFUn0gbm9yIEBjb2Rle01BTllfU0VHTUVOVFN9Ci1pcyBkZWZpbmVkLiAgVGhpcyB2ZXJzaW9uIG9mIEdBUyBpcyBzdGlsbCB1c2VkIGZvciB0aGUgbTY4ay1hb3V0IHRhcmdldCwgYW5kCi1wZXJoYXBzIG90aGVycy4KLQotVGhpcyB2ZXJzaW9uIG9mIEdBUyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGFueSBuZXcgZGV2ZWxvcG1lbnQuCi0KLVRoZXJlIGlzIHN0aWxsIGNvZGUgdGhhdCBpcyBzcGVjaWZpYyB0byB0aGlzIHZlcnNpb24gb2YgR0FTLCBub3RhYmx5IGluCi1AZmlsZXt3cml0ZS5jfS4gIFRoZXJlIGlzIG5vIHdheSBmb3IgdGhpcyBjb2RlIHRvIGxvb3AgdGhyb3VnaCBhbGwgdGhlCi1zZWN0aW9uczsgaXQgc2ltcGx5IGxvb2tzIGF0IGdsb2JhbCB2YXJpYWJsZXMgbGlrZSBAY29kZXt0ZXh0X2ZyYWdfcm9vdH0gYW5kCi1AY29kZXtkYXRhX2ZyYWdfcm9vdH0uCi0KLVRoZSB0eXBlIEBjb2Rle3NlZ1R9IGlzIGFuIGVudW0uCi0KLUBub2RlIE1BTllfU0VHTUVOVFMKLUBzdWJzZWN0aW9uIE1BTllfU0VHTUVOVFMgZ2FzIHZlcnNpb24KLUBjaW5kZXggTUFOWV9TRUdNRU5UUwotCi1UaGUgQGNvZGV7TUFOWV9TRUdNRU5UU30gdmVyc2lvbiBvZiBnYXMgaXMgb25seSB1c2VkIGZvciBDT0ZGLiAgSXQgdXNlcyB0aGUgQkZECi1saWJyYXJ5LCBidXQgaXQgd3JpdGVzIG91dCBhbGwgdGhlIGRhdGEgaXRzZWxmIHVzaW5nIEBjb2Rle2JmZF93cml0ZX0uICBUaGlzCi12ZXJzaW9uIG9mIGdhcyBzdXBwb3J0cyB1cCB0byA0MCBub3JtYWwgc2VjdGlvbnMuICBUaGUgc2VjdGlvbiBuYW1lcyBhcmUgc3RvcmVkCi1pbiB0aGUgQGNvZGV7c2VnX25hbWV9IGFycmF5LiAgT3RoZXIgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZQotQGNvZGV7c2VnbWVudF9pbmZvfSBhcnJheS4KLQotVGhlIHR5cGUgQGNvZGV7c2VnVH0gaXMgYW4gZW51bS4gIENvZGUgdGhhdCB3YW50cyB0byBleGFtaW5lIGFsbCB0aGUgc2VjdGlvbnMKLWNhbiB1c2UgYSBAY29kZXtzZWdUfSB2YXJpYWJsZSBhcyBsb29wIGluZGV4IGZyb20gQGNvZGV7U0VHX0UwfSB1cCB0byBidXQgbm90Ci1pbmNsdWRpbmcgQGNvZGV7U0VHX1VOS05PV059LgotCi1Nb3N0IG9mIHRoZSBjb2RlIHNwZWNpZmljIHRvIHRoaXMgdmVyc2lvbiBvZiBHQVMgaXMgaW4gdGhlIGZpbGUKLUBmaWxle2NvbmZpZy9vYmotY29mZi5jfSwgaW4gdGhlIHBvcnRpb24gb2YgdGhhdCBmaWxlIHRoYXQgaXMgY29tcGlsZWQgd2hlbgotQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuCi0KLVRoaXMgdmVyc2lvbiBvZiBHQVMgaXMgc3RpbGwgdXNlZCBmb3Igc2V2ZXJhbCBDT0ZGIHRhcmdldHMuCi0KLUBub2RlIEJGRF9BU1NFTUJMRVIKLUBzdWJzZWN0aW9uIEJGRF9BU1NFTUJMRVIgZ2FzIHZlcnNpb24KLUBjaW5kZXggQkZEX0FTU0VNQkxFUgotCi1UaGUgcHJlZmVycmVkIHZlcnNpb24gb2YgR0FTIGlzIHRoZSBAY29kZXtCRkRfQVNTRU1CTEVSfSB2ZXJzaW9uLiAgSW4gdGhpcwotdmVyc2lvbiBvZiBHQVMsIHRoZSBvdXRwdXQgZmlsZSBpcyBhIG5vcm1hbCBCRkQsIGFuZCB0aGUgQkZEIHJvdXRpbmVzIGFyZSB1c2VkCi10byBnZW5lcmF0ZSB0aGUgb3V0cHV0LgotCi1AY29kZXtCRkRfQVNTRU1CTEVSfSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdXNlZCBmb3IgY2VydGFpbiB0YXJnZXRzLCBpbmNsdWRpbmcKLXRob3NlIHRoYXQgdXNlIHRoZSBFTEYsIEVDT0ZGLCBhbmQgU09NIG9iamVjdCBmaWxlIGZvcm1hdHMsIGFuZCBhbHNvIGFsbCBBbHBoYSwKLU1JUFMsIFBvd2VyUEMsIGFuZCBTUEFSQyB0YXJnZXRzLiAgWW91IGNhbiBmb3JjZSB0aGUgdXNlIG9mCi1AY29kZXtCRkRfQVNTRU1CTEVSfSBmb3Igb3RoZXIgdGFyZ2V0cyB3aXRoIHRoZSBjb25maWd1cmUgb3B0aW9uCi1Ac2FtcHstLWVuYWJsZS1iZmQtYXNzZW1ibGVyfTsgaG93ZXZlciwgaXQgaGFzIG5vdCBiZWVuIHRlc3RlZCBmb3IgbWFueQotdGFyZ2V0cywgYW5kIGNhbiBub3QgYmUgYXNzdW1lZCB0byB3b3JrLgotCi1Abm9kZSBEYXRhIHR5cGVzCi1Ac2VjdGlvbiBEYXRhIHR5cGVzCi1AY2luZGV4IGludGVybmFscywgZGF0YSB0eXBlcwotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNvbWUgZnVuZGFtZW50YWwgR0FTIGRhdGEgdHlwZXMuCi0KLUBtZW51Ci0qIFN5bWJvbHM6OiAgICAgICAgICAgICBUaGUgc3ltYm9sUyBzdHJ1Y3R1cmUKLSogRXhwcmVzc2lvbnM6OiAgICAgICAgIFRoZSBleHByZXNzaW9uUyBzdHJ1Y3R1cmUKLSogRml4dXBzOjoJCVRoZSBmaXhTIHN0cnVjdHVyZQotKiBGcmFnczo6ICAgICAgICAgICAgICAgVGhlIGZyYWdTIHN0cnVjdHVyZQotQGVuZCBtZW51Ci0KLUBub2RlIFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbHMKLUBjaW5kZXggaW50ZXJuYWxzLCBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIGludGVybmFsCi1AY2luZGV4IHN5bWJvbFMgc3RydWN0dXJlCi0KLVRoZSBkZWZpbml0aW9uIGZvciB0aGUgc3ltYm9sIHN0cnVjdHVyZSwgQGNvZGV7c3ltYm9sU30sIGlzIGxvY2F0ZWQgaW4KLUBmaWxle3N0cnVjLXN5bWJvbC5ofS4KLQotSW4gZ2VuZXJhbCwgdGhlIGZpZWxkcyBvZiB0aGlzIHN0cnVjdHVyZSBtYXkgbm90IGJlIHJlZmVycmVkIHRvIGRpcmVjdGx5LgotSW5zdGVhZCwgeW91IG11c3QgdXNlIG9uZSBvZiB0aGUgYWNjZXNzb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gQGZpbGV7c3ltYm9sLmh9LgotVGhlc2UgYWNjZXNzb3IgZnVuY3Rpb25zIHNob3VsZCB3b3JrIGZvciBhbnkgR0FTIHZlcnNpb24uCi0KLVN5bWJvbCBzdHJ1Y3R1cmVzIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWVsZHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gc3lfdmFsdWUKLVRoaXMgaXMgYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHRoYXQgZGVzY3JpYmVzIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgSXQgbWlnaHQKLXJlZmVyIHRvIG9uZSBvciBtb3JlIG90aGVyIHN5bWJvbHM7IGlmIHNvLCBpdHMgdHJ1ZSB2YWx1ZSBtYXkgbm90IGJlIGtub3duCi11bnRpbCBAY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0gaXMgY2FsbGVkIGluIEBjb2Rle3dyaXRlX29iamVjdF9maWxlfS4KLQotVGhlIGV4cHJlc3Npb24gaXMgb2Z0ZW4gc2ltcGx5IGEgY29uc3RhbnQuICBCZWZvcmUgQGNvZGV7cmVzb2x2ZV9zeW1ib2xfdmFsdWV9Ci1pcyBjYWxsZWQsIHRoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGZyYWcgKEBweHJlZntGcmFnc30pLiAgQWZ0ZXJ3YXJkLAotdGhlIGZyYWcgYWRkcmVzcyBoYXMgYmVlbiBhZGRlZCBpbi4KLQotQGl0ZW0gc3lfcmVzb2x2ZWQKLVRoaXMgZmllbGQgaXMgbm9uLXplcm8gaWYgdGhlIHN5bWJvbCdzIHZhbHVlIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVzb2x2ZWQuICBJdAotaXMgdXNlZCBkdXJpbmcgdGhlIGZpbmFsIHBhc3Mgb3ZlciB0aGUgc3ltYm9sIHRhYmxlLgotCi1AaXRlbSBzeV9yZXNvbHZpbmcKLVRoaXMgZmllbGQgaXMgdXNlZCB0byBkZXRlY3QgbG9vcHMgd2hpbGUgcmVzb2x2aW5nIHRoZSBzeW1ib2wncyB2YWx1ZS4KLQotQGl0ZW0gc3lfdXNlZF9pbl9yZWxvYwotVGhpcyBmaWVsZCBpcyBub24temVybyBpZiB0aGUgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvY2F0aW9uIGVudHJ5LiAgSWYgYSBsb2NhbAotc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uIGVudHJ5LCBpdCBtdXN0IGJlIHBvc3NpYmxlIHRvIHJlZGlyZWN0IHRob3NlCi1yZWxvY2F0aW9ucyB0byBvdGhlciBzeW1ib2xzLCBvciB0aGlzIHN5bWJvbCBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBmaW5hbAotc3ltYm9sIGxpc3QuCi0KLUBpdGVtIHN5X25leHQKLUBpdGVteCBzeV9wcmV2aW91cwotVGhlc2UgcG9pbnRlcnMgdG8gb3RoZXIgQGNvZGV7c3ltYm9sU30gc3RydWN0dXJlcyBkZXNjcmliZSBhIHNpbmdseSBvciBkb3VibHkKLWxpbmtlZCBsaXN0LiAgKElmIEBjb2Rle1NZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlN9IGlzIG5vdCBkZWZpbmVkLCB0aGUKLUBjb2Rle3N5X3ByZXZpb3VzfSBmaWVsZCB3aWxsIGJlIG9taXR0ZWQ7IEBjb2Rle1NZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlN9IGlzCi1hbHdheXMgZGVmaW5lZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfS4pICBUaGVzZSBmaWVsZHMgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGgKLXRoZSBAY29kZXtzeW1ib2xfbmV4dH0gYW5kIEBjb2Rle3N5bWJvbF9wcmV2aW91c30gbWFjcm9zLgotCi1AaXRlbSBzeV9mcmFnCi1UaGlzIHBvaW50cyB0byB0aGUgZnJhZyAoQHB4cmVme0ZyYWdzfSkgdGhhdCB0aGlzIHN5bWJvbCBpcyBhdHRhY2hlZCB0by4KLQotQGl0ZW0gc3lfdXNlZAotV2hldGhlciB0aGUgc3ltYm9sIGlzIHVzZWQgYXMgYW4gb3BlcmFuZCBvciBpbiBhbiBleHByZXNzaW9uLiAgTm90ZTogTm90IGFsbCBvZgotdGhlIGJhY2tlbmRzIGtlZXAgdGhpcyBpbmZvcm1hdGlvbiBhY2N1cmF0ZTsgYmFja2VuZHMgd2hpY2ggdXNlIHRoaXMgYml0IGFyZQotcmVzcG9uc2libGUgZm9yIHNldHRpbmcgaXQgd2hlbiBhIHN5bWJvbCBpcyB1c2VkIGluIGJhY2tlbmQgcm91dGluZXMuCi0KLUBpdGVtIHN5X21yaV9jb21tb24KLVdoZXRoZXIgdGhlIHN5bWJvbCBpcyBhbiBNUkkgY29tbW9uIHN5bWJvbCBjcmVhdGVkIGJ5IHRoZSBAY29kZXtDT01NT059Ci1wc2V1ZG8tb3Agd2hlbiBhc3NlbWJsaW5nIGluIE1SSSBtb2RlLgotCi1AaXRlbSBic3ltCi1JZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBkZWZpbmVkLCB0aGlzIHBvaW50cyB0byB0aGUgQkZEIEBjb2Rle2FzeW1ib2x9IHRoYXQKLXdpbGwgYmUgdXNlZCBpbiB3cml0aW5nIHRoZSBvYmplY3QgZmlsZS4KLQotQGl0ZW0gc3lfbmFtZV9vZmZzZXQKLShPbmx5IHVzZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuKSAgVGhpcyBpcyB0aGUgcG9zaXRpb24gb2YKLXRoZSBzeW1ib2wncyBuYW1lIGluIHRoZSBzdHJpbmcgdGFibGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgT24gc29tZSBmb3JtYXRzLAotdGhpcyB3aWxsIHN0YXJ0IGF0IHBvc2l0aW9uIDQsIHdpdGggcG9zaXRpb24gMCByZXNlcnZlZCBmb3IgdW5uYW1lZCBzeW1ib2xzLgotVGhpcyBmaWVsZCBpcyBub3QgdXNlZCB1bnRpbCBAY29kZXt3cml0ZV9vYmplY3RfZmlsZX0gaXMgY2FsbGVkLgotCi1AaXRlbSBzeV9zeW1ib2wKLShPbmx5IHVzZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuKSAgVGhpcyBpcyB0aGUKLWZvcm1hdC1zcGVjaWZpYyBzeW1ib2wgc3RydWN0dXJlLCBhcyBpdCB3b3VsZCBiZSB3cml0dGVuIGludG8gdGhlIG9iamVjdCBmaWxlLgotCi1AaXRlbSBzeV9udW1iZXIKLShPbmx5IHVzZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuKSAgVGhpcyBpcyBhIDI0LWJpdCBzeW1ib2wKLW51bWJlciwgZm9yIHVzZSBpbiBjb25zdHJ1Y3RpbmcgcmVsb2NhdGlvbiB0YWJsZSBlbnRyaWVzLgotCi1AaXRlbSBzeV9vYmoKLVRoaXMgZm9ybWF0LXNwZWNpZmljIGRhdGEgaXMgb2YgdHlwZSBAY29kZXtPQkpfU1lNRklFTERfVFlQRX0uICBJZiBubyBtYWNybyBieQotdGhhdCBuYW1lIGlzIGRlZmluZWQgaW4gQGZpbGV7b2JqLWZvcm1hdC5ofSwgdGhpcyBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQotQGl0ZW0gc3lfdGMKLVRoaXMgcHJvY2Vzc29yLXNwZWNpZmljIGRhdGEgaXMgb2YgdHlwZSBAY29kZXtUQ19TWU1GSUVMRF9UWVBFfS4gIElmIG5vIG1hY3JvCi1ieSB0aGF0IG5hbWUgaXMgZGVmaW5lZCBpbiBAZmlsZXt0YXJnLWNwdS5ofSwgdGhpcyBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQotQGVuZCB0YWJsZQotCi1IZXJlIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucy4gIFRoZXNlIHNob3VsZCBiZSB1c2VkIHJhdGhlcgotdGhhbiByZWZlcnJpbmcgdG8gdGhlIGZpZWxkcyBvZiBAY29kZXtzeW1ib2xTfSBkaXJlY3RseS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBTX1NFVF9WQUxVRQotQGNpbmRleCBTX1NFVF9WQUxVRQotU2V0IHRoZSBzeW1ib2wncyB2YWx1ZS4KLQotQGl0ZW0gU19HRVRfVkFMVUUKLUBjaW5kZXggU19HRVRfVkFMVUUKLUdldCB0aGUgc3ltYm9sJ3MgdmFsdWUuICBUaGlzIHdpbGwgY2F1c2UgQGNvZGV7cmVzb2x2ZV9zeW1ib2xfdmFsdWV9IHRvIGJlCi1jYWxsZWQgaWYgbmVjZXNzYXJ5LCBzbyBAY29kZXtTX0dFVF9WQUxVRX0gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gaXQgaXMKLXNhZmUgdG8gcmVzb2x2ZSBzeW1ib2xzIChpLmUuLCBhZnRlciB0aGUgZW50aXJlIGlucHV0IGZpbGUgaGFzIGJlZW4gcmVhZCBhbmQKLWFsbCBzeW1ib2xzIGhhdmUgYmVlbiBkZWZpbmVkKS4KLQotQGl0ZW0gU19TRVRfU0VHTUVOVAotQGNpbmRleCBTX1NFVF9TRUdNRU5UCi1TZXQgdGhlIHNlY3Rpb24gb2YgdGhlIHN5bWJvbC4KLQotQGl0ZW0gU19HRVRfU0VHTUVOVAotQGNpbmRleCBTX0dFVF9TRUdNRU5UCi1HZXQgdGhlIHN5bWJvbCdzIHNlY3Rpb24uCi0KLUBpdGVtIFNfR0VUX05BTUUKLUBjaW5kZXggU19HRVRfTkFNRQotR2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuCi0KLUBpdGVtIFNfU0VUX05BTUUKLUBjaW5kZXggU19TRVRfTkFNRQotU2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuCi0KLUBpdGVtIFNfSVNfRVhURVJOQUwKLUBjaW5kZXggU19JU19FWFRFUk5BTAotUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLgotCi1AaXRlbSBTX0lTX0VYVEVSTgotQGNpbmRleCBTX0lTX0VYVEVSTgotQSBzeW5vbnltIGZvciBAY29kZXtTX0lTX0VYVEVSTkFMfS4gIERvbid0IHVzZSBpdC4KLQotQGl0ZW0gU19JU19XRUFLCi1AY2luZGV4IFNfSVNfV0VBSwotUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgaXMgd2Vhay4KLQotQGl0ZW0gU19JU19DT01NT04KLUBjaW5kZXggU19JU19DT01NT04KLVJldHVybiBub24temVybyBpZiB0aGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gIENvbW1vbiBzeW1ib2xzIGFyZSBzb21ldGltZXMKLXJlcHJlc2VudGVkIGFzIHVuZGVmaW5lZCBzeW1ib2xzIHdpdGggYSB2YWx1ZSwgaW4gd2hpY2ggY2FzZSB0aGlzIGZ1bmN0aW9uIHdpbGwKLW5vdCBiZSByZWxpYWJsZS4KLQotQGl0ZW0gU19JU19ERUZJTkVECi1AY2luZGV4IFNfSVNfREVGSU5FRAotUmV0dXJuIG5vbi16ZXJvIGlmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxpYWJsZSB3aGVuCi1jYWxsZWQgb24gYSBjb21tb24gc3ltYm9sLgotCi1AaXRlbSBTX0lTX0RFQlVHCi1AY2luZGV4IFNfSVNfREVCVUcKLVJldHVybiBub24temVybyBpZiB0aGlzIGlzIGEgZGVidWdnaW5nIHN5bWJvbC4KLQotQGl0ZW0gU19JU19MT0NBTAotQGNpbmRleCBTX0lTX0xPQ0FMCi1SZXR1cm4gbm9uLXplcm8gaWYgdGhpcyBpcyBhIGxvY2FsIGFzc2VtYmxlciBzeW1ib2wgd2hpY2ggc2hvdWxkIG5vdCBiZQotaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHN5bWJvbCB0YWJsZS4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgb3Bwb3NpdGUgb2YKLUBjb2Rle1NfSVNfRVhURVJOQUx9LiAgVGhlIEBzYW1wey1MfSBhc3NlbWJsZXIgb3B0aW9uIGFmZmVjdHMgdGhlIHJldHVybiB2YWx1ZQotb2YgdGhpcyBmdW5jdGlvbi4KLQotQGl0ZW0gU19TRVRfRVhURVJOQUwKLUBjaW5kZXggU19TRVRfRVhURVJOQUwKLU1hcmsgdGhlIHN5bWJvbCBhcyBleHRlcm5hbGx5IHZpc2libGUuCi0KLUBpdGVtIFNfQ0xFQVJfRVhURVJOQUwKLUBjaW5kZXggU19DTEVBUl9FWFRFUk5BTAotTWFyayB0aGUgc3ltYm9sIGFzIG5vdCBleHRlcm5hbGx5IHZpc2libGUuCi0KLUBpdGVtIFNfU0VUX1dFQUsKLUBjaW5kZXggU19TRVRfV0VBSwotTWFyayB0aGUgc3ltYm9sIGFzIHdlYWsuCi0KLUBpdGVtIFNfR0VUX1RZUEUKLUBpdGVtIFNfR0VUX0RFU0MKLUBpdGVtIFNfR0VUX09USEVSCi1AY2luZGV4IFNfR0VUX1RZUEUKLUBjaW5kZXggU19HRVRfREVTQwotQGNpbmRleCBTX0dFVF9PVEhFUgotR2V0IHRoZSBAY29kZXt0eXBlfSwgQGNvZGV7ZGVzY30sIGFuZCBAY29kZXtvdGhlcn0gZmllbGRzIG9mIHRoZSBzeW1ib2wuICBUaGVzZQotYXJlIG9ubHkgZGVmaW5lZCBmb3Igb2JqZWN0IGZpbGUgZm9ybWF0cyBmb3Igd2hpY2ggdGhleSBtYWtlIHNlbnNlIChwcmltYXJpbHkKLWEub3V0KS4KLQotQGl0ZW0gU19TRVRfVFlQRQotQGl0ZW0gU19TRVRfREVTQwotQGl0ZW0gU19TRVRfT1RIRVIKLUBjaW5kZXggU19TRVRfVFlQRQotQGNpbmRleCBTX1NFVF9ERVNDCi1AY2luZGV4IFNfU0VUX09USEVSCi1TZXQgdGhlIEBjb2Rle3R5cGV9LCBAY29kZXtkZXNjfSwgYW5kIEBjb2Rle290aGVyfSBmaWVsZHMgb2YgdGhlIHN5bWJvbC4gIFRoZXNlCi1hcmUgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvciB3aGljaCB0aGV5IG1ha2Ugc2Vuc2UgKHByaW1hcmlseQotYS5vdXQpLgotCi1AaXRlbSBTX0dFVF9TSVpFCi1AY2luZGV4IFNfR0VUX1NJWkUKLUdldCB0aGUgc2l6ZSBvZiBhIHN5bWJvbC4gIFRoaXMgaXMgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvcgotd2hpY2ggaXQgbWFrZXMgc2Vuc2UgKHByaW1hcmlseSBFTEYpLgotCi1AaXRlbSBTX1NFVF9TSVpFCi1AY2luZGV4IFNfU0VUX1NJWkUKLVNldCB0aGUgc2l6ZSBvZiBhIHN5bWJvbC4gIFRoaXMgaXMgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvcgotd2hpY2ggaXQgbWFrZXMgc2Vuc2UgKHByaW1hcmlseSBFTEYpLgotCi1AaXRlbSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24KLUBjaW5kZXggc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uCi1HZXQgYSBwb2ludGVyIHRvIGFuIEBjb2Rle2V4cHJlc3Npb25TfSBzdHJ1Y3R1cmUgd2hpY2ggcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YKLXRoZSBzeW1ib2wgYXMgYW4gZXhwcmVzc2lvbi4KLQotQGl0ZW0gc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uCi1AY2luZGV4IHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbgotU2V0IHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCB0byBhbiBleHByZXNzaW9uLgotCi1AaXRlbSBzeW1ib2xfc2V0X2ZyYWcKLUBjaW5kZXggc3ltYm9sX3NldF9mcmFnCi1TZXQgdGhlIGZyYWcgd2hlcmUgYSBzeW1ib2wgaXMgZGVmaW5lZC4KLQotQGl0ZW0gc3ltYm9sX2dldF9mcmFnCi1AY2luZGV4IHN5bWJvbF9nZXRfZnJhZwotR2V0IHRoZSBmcmFnIHdoZXJlIGEgc3ltYm9sIGlzIGRlZmluZWQuCi0KLUBpdGVtIHN5bWJvbF9tYXJrX3VzZWQKLUBjaW5kZXggc3ltYm9sX21hcmtfdXNlZAotTWFyayBhIHN5bWJvbCBhcyBoYXZpbmcgYmVlbiB1c2VkIGluIGFuIGV4cHJlc3Npb24uCi0KLUBpdGVtIHN5bWJvbF9jbGVhcl91c2VkCi1AY2luZGV4IHN5bWJvbF9jbGVhcl91c2VkCi1DbGVhciB0aGUgbWFyayBpbmRpY2F0aW5nIHRoYXQgYSBzeW1ib2wgd2FzIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4KLQotQGl0ZW0gc3ltYm9sX3VzZWRfcAotQGNpbmRleCBzeW1ib2xfdXNlZF9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCB3YXMgdXNlZCBpbiBhbiBleHByZXNzaW9uLgotCi1AaXRlbSBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jCi1AY2luZGV4IHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MKLU1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gdXNlZCBieSBhIHJlbG9jYXRpb24uCi0KLUBpdGVtIHN5bWJvbF9jbGVhcl91c2VkX2luX3JlbG9jCi1AY2luZGV4IHN5bWJvbF9jbGVhcl91c2VkX2luX3JlbG9jCi1DbGVhciB0aGUgbWFyayBpbmRpY2F0aW5nIHRoYXQgYSBzeW1ib2wgd2FzIHVzZWQgaW4gYSByZWxvY2F0aW9uLgotCi1AaXRlbSBzeW1ib2xfdXNlZF9pbl9yZWxvY19wCi1AY2luZGV4IHN5bWJvbF91c2VkX2luX3JlbG9jX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIHdhcyB1c2VkIGluIGEgcmVsb2NhdGlvbi4KLQotQGl0ZW0gc3ltYm9sX21hcmtfbXJpX2NvbW1vbgotQGNpbmRleCBzeW1ib2xfbWFya19tcmlfY29tbW9uCi1NYXJrIGEgc3ltYm9sIGFzIGFuIE1SSSBjb21tb24gc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfY2xlYXJfbXJpX2NvbW1vbgotQGNpbmRleCBzeW1ib2xfY2xlYXJfbXJpX2NvbW1vbgotQ2xlYXIgdGhlIG1hcmsgaW5kaWNhdGluZyB0aGF0IGEgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfbXJpX2NvbW1vbl9wCi1AY2luZGV4IHN5bWJvbF9tcmlfY29tbW9uX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfbWFya193cml0dGVuCi1AY2luZGV4IHN5bWJvbF9tYXJrX3dyaXR0ZW4KLU1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gd3JpdHRlbi4KLQotQGl0ZW0gc3ltYm9sX2NsZWFyX3dyaXR0ZW4KLUBjaW5kZXggc3ltYm9sX2NsZWFyX3dyaXR0ZW4KLUNsZWFyIHRoZSBtYXJrIGluZGljYXRpbmcgdGhhdCBhIHN5bWJvbCB3YXMgd3JpdHRlbi4KLQotQGl0ZW0gc3ltYm9sX3dyaXR0ZW5fcAotQGNpbmRleCBzeW1ib2xfd3JpdHRlbl9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCB3YXMgd3JpdHRlbi4KLQotQGl0ZW0gc3ltYm9sX21hcmtfcmVzb2x2ZWQKLUBjaW5kZXggc3ltYm9sX21hcmtfcmVzb2x2ZWQKLU1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gcmVzb2x2ZWQuCi0KLUBpdGVtIHN5bWJvbF9yZXNvbHZlZF9wCi1AY2luZGV4IHN5bWJvbF9yZXNvbHZlZF9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYmVlbiByZXNvbHZlZC4KLQotQGl0ZW0gc3ltYm9sX3NlY3Rpb25fcAotQGNpbmRleCBzeW1ib2xfc2VjdGlvbl9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCBpcyBhIHNlY3Rpb24gc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfZXF1YXRlZF9wCi1AY2luZGV4IHN5bWJvbF9lcXVhdGVkX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGVxdWF0ZWQgdG8gYW5vdGhlciBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9jb25zdGFudF9wCi1AY2luZGV4IHN5bWJvbF9jb25zdGFudF9wCi1SZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYSBjb25zdGFudCB2YWx1ZSwgaW5jbHVkaW5nIGJlaW5nIGFuIG9mZnNldCB3aXRoaW4KLXNvbWUgZnJhZy4KLQotQGl0ZW0gc3ltYm9sX2dldF9iZmRzeW0KLUBjaW5kZXggc3ltYm9sX2dldF9iZmRzeW0KLVJldHVybiB0aGUgQkZEIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYSBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9zZXRfYmZkc3ltCi1AY2luZGV4IHN5bWJvbF9zZXRfYmZkc3ltCi1TZXQgdGhlIEJGRCBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfZ2V0X29iagotQGNpbmRleCBzeW1ib2xfZ2V0X29iagotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgQGNvZGV7T0JKX1NZTUZJRUxEX1RZUEV9IGZpZWxkIG9mIGEgc3ltYm9sLgotCi1AaXRlbSBzeW1ib2xfc2V0X29iagotQGNpbmRleCBzeW1ib2xfc2V0X29iagotU2V0IHRoZSBAY29kZXtPQkpfU1lNRklFTERfVFlQRX0gZmllbGQgb2YgYSBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9nZXRfdGMKLUBjaW5kZXggc3ltYm9sX2dldF90YwotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgQGNvZGV7VENfU1lNRklFTERfVFlQRX0gZmllbGQgb2YgYSBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9zZXRfdGMKLUBjaW5kZXggc3ltYm9sX3NldF90YwotU2V0IHRoZSBAY29kZXtUQ19TWU1GSUVMRF9UWVBFfSBmaWVsZCBvZiBhIHN5bWJvbC4KLQotQGVuZCB0YWJsZQotCi1XaGVuIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IGlzIGRlZmluZWQsIEdBUyBhdHRlbXB0cyB0byBzdG9yZSBsb2NhbAotc3ltYm9scy0tc3ltYm9scyB3aGljaCB3aWxsIG5vdCBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZS0tdXNpbmcgYQotZGlmZmVyZW50IHN0cnVjdHVyZSwgQGNvZGV7c3RydWN0IGxvY2FsX3N5bWJvbH0uICBUaGlzIHN0cnVjdHVyZSBjYW4gb25seQotcmVwcmVzZW50IHN5bWJvbHMgd2hvc2UgdmFsdWUgaXMgYW4gb2Zmc2V0IHdpdGhpbiBhIGZyYWcuCi0KLUNvZGUgb3V0c2lkZSBvZiB0aGUgc3ltYm9sIGhhbmRsZXIgd2lsbCBhbHdheXMgZGVhbCB3aXRoIEBjb2Rle3N5bWJvbFN9Ci1zdHJ1Y3R1cmVzIGFuZCB1c2UgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucy4gIFRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgY29ycmVjdGx5Ci1kZWFsIHdpdGggbG9jYWwgc3ltYm9scy4gIEBjb2Rle3N0cnVjdCBsb2NhbF9zeW1ib2x9IGlzIG11Y2ggc21hbGxlciB0aGFuCi1AY29kZXtzeW1ib2xTfSAod2hpY2ggYWxzbyBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSBiZmQgQGNvZGV7YXN5bWJvbH0KLXN0cnVjdHVyZSksIHNvIHRoaXMgc2F2ZXMgc3BhY2Ugd2hlbiBhc3NlbWJsaW5nIGxhcmdlIGZpbGVzLgotCi1UaGUgZmlyc3QgZmllbGQgb2YgQGNvZGV7c3ltYm9sU30gaXMgQGNvZGV7YnN5bX0sIHRoZSBwb2ludGVyIHRvIHRoZSBCRkQKLXN5bWJvbC4gIFRoZSBmaXJzdCBmaWVsZCBvZiBAY29kZXtzdHJ1Y3QgbG9jYWxfc3ltYm9sfSBpcyBhIHBvaW50ZXIgd2hpY2ggaXMKLWFsd2F5cyBzZXQgdG8gTlVMTC4gIFRoaXMgaXMgaG93IHRoZSBzeW1ib2wgYWNjZXNzb3IgZnVuY3Rpb25zIGNhbiBkaXN0aW5ndWlzaAotbG9jYWwgc3ltYm9scyBmcm9tIG9yZGluYXJ5IHN5bWJvbHMuICBUaGUgc3ltYm9sIGFjY2Vzc29yIGZ1bmN0aW9ucwotYXV0b21hdGljYWxseSBjb252ZXJ0IGEgbG9jYWwgc3ltYm9sIGludG8gYW4gb3JkaW5hcnkgc3ltYm9sIHdoZW4gbmVjZXNzYXJ5LgotCi1Abm9kZSBFeHByZXNzaW9ucwotQHN1YnNlY3Rpb24gRXhwcmVzc2lvbnMKLUBjaW5kZXggaW50ZXJuYWxzLCBleHByZXNzaW9ucwotQGNpbmRleCBleHByZXNzaW9ucywgaW50ZXJuYWwKLUBjaW5kZXggZXhwcmVzc2lvblMgc3RydWN0dXJlCi0KLUV4cHJlc3Npb25zIGFyZSBzdG9yZWQgaW4gYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZS4gIFRoZSBzdHJ1Y3R1cmUgaXMKLWRlZmluZWQgaW4gQGZpbGV7ZXhwci5ofS4KLQotQGNpbmRleCBleHByZXNzaW9uCi1UaGUgbWFjcm8gQGNvZGV7ZXhwcmVzc2lvbn0gd2lsbCBjcmVhdGUgYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZSBiYXNlZAotb24gdGhlIHRleHQgZm91bmQgYXQgdGhlIGdsb2JhbCB2YXJpYWJsZSBAY29kZXtpbnB1dF9saW5lX3BvaW50ZXJ9LgotCi1AY2luZGV4IG1ha2VfZXhwcl9zeW1ib2wKLUBjaW5kZXggZXhwcl9zeW1ib2xfd2hlcmUKLUEgc2luZ2xlIEBjb2Rle2V4cHJlc3Npb25TfSBzdHJ1Y3R1cmUgY2FuIHJlcHJlc2VudCBhIHNpbmdsZSBvcGVyYXRpb24uCi1Db21wbGV4IGV4cHJlc3Npb25zIGFyZSBmb3JtZWQgYnkgY3JlYXRpbmcgQGRmbntleHByZXNzaW9uIHN5bWJvbHN9IGFuZAotY29tYmluaW5nIHRoZW0gaW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZXMuICBBbiBleHByZXNzaW9uIHN5bWJvbCBpcwotY3JlYXRlZCBieSBjYWxsaW5nIEBjb2Rle21ha2VfZXhwcl9zeW1ib2x9LiAgQW4gZXhwcmVzc2lvbiBzeW1ib2wgc2hvdWxkCi1uYXR1cmFsbHkgbmV2ZXIgYXBwZWFyIGluIGEgc3ltYm9sIHRhYmxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mCi1AY29kZXtTX0lTX0xPQ0FMfSAoQHB4cmVme1N5bWJvbHN9KSByZWZsZWN0cyB0aGF0LiAgVGhlIGZ1bmN0aW9uCi1AY29kZXtleHByX3N5bWJvbF93aGVyZX0gcmV0dXJucyBub24temVybyBpZiBhIHN5bWJvbCBpcyBhbiBleHByZXNzaW9uIHN5bWJvbCwKLWFuZCBhbHNvIHJldHVybnMgdGhlIGZpbGUgYW5kIGxpbmUgZm9yIHRoZSBleHByZXNzaW9uIHdoaWNoIGNhdXNlZCBpdCB0byBiZQotY3JlYXRlZC4KLQotVGhlIEBjb2Rle2V4cHJlc3Npb25TfSBzdHJ1Y3R1cmUgaGFzIHR3byBzeW1ib2wgZmllbGRzLCBhIG51bWJlciBmaWVsZCwgYW4KLW9wZXJhdG9yIGZpZWxkLCBhbmQgYSBmaWVsZCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG51bWJlciBpcyB1bnNpZ25lZC4KLQotVGhlIG9wZXJhdG9yIGZpZWxkIGlzIG9mIHR5cGUgQGNvZGV7b3BlcmF0b3JUfSwgYW5kIGRlc2NyaWJlcyBob3cgdG8gaW50ZXJwcmV0Ci10aGUgb3RoZXIgZmllbGRzOyBzZWUgdGhlIGRlZmluaXRpb24gaW4gQGZpbGV7ZXhwci5ofSBmb3IgdGhlIHBvc3NpYmlsaXRpZXMuCi0KLUFuIEBjb2Rle29wZXJhdG9yVH0gdmFsdWUgb2YgQGNvZGV7T19iaWd9IGluZGljYXRlcyBlaXRoZXIgYSBmbG9hdGluZyBwb2ludAotbnVtYmVyLCBzdG9yZWQgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSBAY29kZXtnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcn0sIG9yCi1hbiBpbnRlZ2VyIHRvIGxhcmdlIHRvIHN0b3JlIGluIGFuIEBjb2Rle29mZnNldFR9IHR5cGUsIHN0b3JlZCBpbiB0aGUgZ2xvYmFsCi1hcnJheSBAY29kZXtnZW5lcmljX2JpZ251bX0uICBUaGlzIHJhdGhlciBpbmZsZXhpYmxlIGFwcHJvYWNoIG1ha2VzIGl0Ci1pbXBvc3NpYmxlIHRvIHVzZSBmbG9hdGluZyBwb2ludCBudW1iZXJzIG9yIGxhcmdlIGV4cHJlc3Npb25zIGluIGNvbXBsZXgKLWV4cHJlc3Npb25zLgotCi1Abm9kZSBGaXh1cHMKLUBzdWJzZWN0aW9uIEZpeHVwcwotQGNpbmRleCBpbnRlcm5hbHMsIGZpeHVwcwotQGNpbmRleCBmaXh1cHMKLUBjaW5kZXggZml4UyBzdHJ1Y3R1cmUKLQotQSBAZGZue2ZpeHVwfSBpcyBiYXNpY2FsbHkgYW55dGhpbmcgd2hpY2ggY2FuIG5vdCBiZSByZXNvbHZlZCBpbiB0aGUgZmlyc3QKLXBhc3MuICBTb21ldGltZXMgYSBmaXh1cCBjYW4gYmUgcmVzb2x2ZWQgYnkgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHk7IGlmIG5vdCwKLXRoZSBmaXh1cCBiZWNvbWVzIGEgcmVsb2NhdGlvbiBlbnRyeSBpbiB0aGUgb2JqZWN0IGZpbGUuCi0KLUBjaW5kZXggZml4X25ldwotQGNpbmRleCBmaXhfbmV3X2V4cAotQSBmaXh1cCBpcyBjcmVhdGVkIGJ5IGEgY2FsbCB0byBAY29kZXtmaXhfbmV3fSBvciBAY29kZXtmaXhfbmV3X2V4cH0uICBCb3RoCi10YWtlIGEgZnJhZyAoQHB4cmVme0ZyYWdzfSksIGEgcG9zaXRpb24gd2l0aGluIHRoZSBmcmFnLCBhIHNpemUsIGFuIGluZGljYXRpb24KLW9mIHdoZXRoZXIgdGhlIGZpeHVwIGlzIFBDIHJlbGF0aXZlLCBhbmQgYSB0eXBlLiAgSW4gYSBAY29kZXtCRkRfQVNTRU1CTEVSfQotR0FTLCB0aGUgdHlwZSBpcyBub21pbmFsbHkgYSBAY29kZXtiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGV9LCBidXQgc2V2ZXJhbAotdGFyZ2V0cyB1c2Ugb3RoZXIgdHlwZSBjb2RlcyB0byByZXByZXNlbnQgZml4dXBzIHRoYXQgY2FuIG5vdCBiZSBkZXNjcmliZWQgYXMKLXJlbG9jYXRpb25zLgotCi1UaGUgQGNvZGV7Zml4U30gc3RydWN0dXJlIGhhcyBhIG51bWJlciBvZiBmaWVsZHMsIHNldmVyYWwgb2Ygd2hpY2ggYXJlIG9ic29sZXRlCi1vciBhcmUgb25seSB1c2VkIGJ5IGEgcGFydGljdWxhciB0YXJnZXQuICBUaGUgaW1wb3J0YW50IGZpZWxkcyBhcmU6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gZnhfZnJhZwotVGhlIGZyYWcgKEBweHJlZntGcmFnc30pIHRoaXMgZml4dXAgaXMgaW4uCi0KLUBpdGVtIGZ4X3doZXJlCi1UaGUgbG9jYXRpb24gd2l0aGluIHRoZSBmcmFnIHdoZXJlIHRoZSBmaXh1cCBvY2N1cnMuCi0KLUBpdGVtIGZ4X2FkZHN5Ci1UaGUgc3ltYm9sIHRoaXMgZml4dXAgaXMgYWdhaW5zdC4gIFR5cGljYWxseSwgdGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGlzIGFkZGVkCi1pbnRvIHRoZSBvYmplY3QgY29udGVudHMuICBUaGlzIG1heSBiZSBOVUxMLgotCi1AaXRlbSBmeF9zdWJzeQotVGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGlzIHN1YnRyYWN0ZWQgZnJvbSB0aGUgb2JqZWN0IGNvbnRlbnRzLiAgVGhpcyBpcwotbm9ybWFsbHkgTlVMTC4KLQotQGl0ZW0gZnhfb2Zmc2V0Ci1BIG51bWJlciB3aGljaCBpcyBhZGRlZCBpbnRvIHRoZSBmaXh1cC4KLQotQGl0ZW0gZnhfYWRkbnVtYmVyCi1Tb21lIENQVSBiYWNrZW5kcyB1c2UgdGhpcyBmaWVsZCB0byBjb252ZXkgaW5mb3JtYXRpb24gYmV0d2VlbgotQGNvZGV7bWRfYXBwbHlfZml4fSBhbmQgQGNvZGV7dGNfZ2VuX3JlbG9jfS4gIFRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGNvZGUgZG9lcwotbm90IHVzZSBpdC4KLQotQGl0ZW0gZnhfbmV4dAotVGhlIG5leHQgZml4dXAgaW4gdGhlIHNlY3Rpb24uCi0KLUBpdGVtIGZ4X3JfdHlwZQotVGhlIHR5cGUgb2YgdGhlIGZpeHVwLiAgVGhpcyBmaWVsZCBpcyBvbmx5IGRlZmluZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0sIG9yCi1pZiB0aGUgdGFyZ2V0IGRlZmluZXMgQGNvZGV7TkVFRF9GWF9SX1RZUEV9LgotCi1AaXRlbSBmeF9zaXplCi1UaGUgc2l6ZSBvZiB0aGUgZml4dXAuICBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBlcnJvciBjaGVja2luZy4KLQotQGl0ZW0gZnhfcGNyZWwKLVdoZXRoZXIgdGhlIGZpeHVwIGlzIFBDIHJlbGF0aXZlLgotCi1AaXRlbSBmeF9kb25lCi1Ob24temVybyBpZiB0aGUgZml4dXAgaGFzIGJlZW4gYXBwbGllZCwgYW5kIG5vIHJlbG9jYXRpb24gZW50cnkgbmVlZHMgdG8gYmUKLWdlbmVyYXRlZC4KLQotQGl0ZW0gZnhfZmlsZQotQGl0ZW14IGZ4X2xpbmUKLVRoZSBmaWxlIGFuZCBsaW5lIHdoZXJlIHRoZSBmaXh1cCB3YXMgY3JlYXRlZC4KLQotQGl0ZW0gdGNfZml4X2RhdGEKLVRoaXMgaGFzIHRoZSB0eXBlIEBjb2Rle1RDX0ZJWF9UWVBFfSwgYW5kIGlzIG9ubHkgZGVmaW5lZCBpZiB0aGUgdGFyZ2V0IGRlZmluZXMKLXRoYXQgbWFjcm8uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEZyYWdzCi1Ac3Vic2VjdGlvbiBGcmFncwotQGNpbmRleCBpbnRlcm5hbHMsIGZyYWdzCi1AY2luZGV4IGZyYWdzCi1AY2luZGV4IGZyYWdTIHN0cnVjdHVyZS4KLQotVGhlIEBjb2Rle2ZyYWdTfSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBAZmlsZXthcy5ofS4gIEVhY2ggZnJhZyByZXByZXNlbnRzIGEKLXBvcnRpb24gb2YgdGhlIGZpbmFsIG9iamVjdCBmaWxlLiAgQXMgR0FTIHJlYWRzIHRoZSBzb3VyY2UgZmlsZSwgaXQgY3JlYXRlcwotZnJhZ3MgdG8gaG9sZCB0aGUgZGF0YSB0aGF0IGl0IHJlYWRzLiAgQXQgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHkgdGhlIGZyYWdzIGFuZAotZml4dXBzIGFyZSBwcm9jZXNzZWQgdG8gcHJvZHVjZSB0aGUgZmluYWwgY29udGVudHMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gZnJfYWRkcmVzcwotVGhlIGFkZHJlc3Mgb2YgdGhlIGZyYWcuICBUaGlzIGlzIG5vdCBzZXQgdW50aWwgdGhlIGFzc2VtYmxlciByZXNjYW5zIHRoZSBsaXN0Ci1vZiBhbGwgZnJhZ3MgYWZ0ZXIgdGhlIGVudGlyZSBpbnB1dCBmaWxlIGlzIHBhcnNlZC4gIFRoZSBmdW5jdGlvbgotQGNvZGV7cmVsYXhfc2VnbWVudH0gZmlsbHMgaW4gdGhpcyBmaWVsZC4KLQotQGl0ZW0gZnJfbmV4dAotUG9pbnRlciB0byB0aGUgbmV4dCBmcmFnIGluIHRoaXMgKHN1YilzZWN0aW9uLgotCi1AaXRlbSBmcl9maXgKLUZpeGVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdlIGtub3cgd2UncmUgZ29pbmcgdG8gZW1pdCB0byB0aGUgb3V0cHV0IGZpbGUuICBNYXkKLWJlIHplcm8uCi0KLUBpdGVtIGZyX3ZhcgotVmFyaWFibGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2UgbWF5IG91dHB1dCwgYWZ0ZXIgdGhlIGluaXRpYWwgQGNvZGV7ZnJfZml4fQotY2hhcmFjdGVycy4gIE1heSBiZSB6ZXJvLgotCi1AaXRlbSBmcl9vZmZzZXQKLVRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGZpZWxkIGlzIGNvbnRyb2xsZWQgYnkgQGNvZGV7ZnJfdHlwZX0uICBHZW5lcmFsbHksCi1pZiBAY29kZXtmcl92YXJ9IGlzIG5vbi16ZXJvLCB0aGlzIGlzIGEgcmVwZWF0IGNvdW50OiB0aGUgQGNvZGV7ZnJfdmFyfQotY2hhcmFjdGVycyBhcmUgb3V0cHV0IEBjb2Rle2ZyX29mZnNldH0gdGltZXMuCi0KLUBpdGVtIGxpbmUKLUhvbGRzIGxpbmUgbnVtYmVyIGluZm8gd2hlbiBhbiBhc3NlbWJsZXIgbGlzdGluZyB3YXMgcmVxdWVzdGVkLgotCi1AaXRlbSBmcl90eXBlCi1SZWxheGF0aW9uIHN0YXRlLiAgVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGludGVycHJldGF0aW9uIG9mIEBjb2Rle2ZyX29mZnNldH0sCi1AY29kZXtmcl9zeW1ib2x9IGFuZCB0aGUgdmFyaWFibGUtbGVuZ3RoIHRhaWwgb2YgdGhlIGZyYWcsIGFzIHdlbGwgYXMgdGhlCi10cmVhdG1lbnQgaXQgZ2V0cyBpbiB2YXJpb3VzIHBoYXNlcyBvZiBwcm9jZXNzaW5nLiAgSXQgZG9lcyBub3QgYWZmZWN0IHRoZQotaW5pdGlhbCBAY29kZXtmcl9maXh9IGNoYXJhY3RlcnM7IHRoZXkgYXJlIGFsd2F5cyBzdXBwb3NlZCB0byBiZSBvdXRwdXQKLXZlcmJhdGltIChmaXh1cHMgYXNpZGUpLiAgU2VlIGJlbG93IGZvciBzcGVjaWZpYyB2YWx1ZXMgdGhpcyBmaWVsZCBjYW4gaGF2ZS4KLQotQGl0ZW0gZnJfc3VidHlwZQotUmVsYXhhdGlvbiBzdWJzdGF0ZS4gIElmIHRoZSBtYWNybyBAY29kZXttZF9yZWxheF9mcmFnfSBpc24ndCBkZWZpbmVkLCB0aGlzIGlzCi1hc3N1bWVkIHRvIGJlIGFuIGluZGV4IGludG8gQGNvZGV7VENfR0VORVJJQ19SRUxBWF9UQUJMRX0gZm9yIHRoZSBnZW5lcmljCi1yZWxheGF0aW9uIGNvZGUgdG8gcHJvY2VzcyAoQHB4cmVme1JlbGF4YXRpb259KS4gIElmIEBjb2Rle21kX3JlbGF4X2ZyYWd9IGlzCi1kZWZpbmVkLCB0aGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgYW55IHVzZSBieSB0aGUgQ1BVLXNwZWNpZmljIGNvZGUuCi0KLUBpdGVtIGZyX3N5bWJvbAotVGhpcyBub3JtYWxseSBpbmRpY2F0ZXMgdGhlIHN5bWJvbCB0byB1c2Ugd2hlbiByZWxheGluZyB0aGUgZnJhZyBhY2NvcmRpbmcgdG8KLUBjb2Rle2ZyX3R5cGV9LgotCi1AaXRlbSBmcl9vcGNvZGUKLVBvaW50cyB0byB0aGUgbG93ZXN0LWFkZHJlc3NlZCBieXRlIG9mIHRoZSBvcGNvZGUsIGZvciB1c2UgaW4gcmVsYXhhdGlvbi4KLQotQGl0ZW0gdGNfZnJhZ19kYXRhCi1UYXJnZXQgc3BlY2lmaWMgZnJhZ21lbnQgZGF0YSBvZiB0eXBlIFRDX0ZSQUdfVFlQRS4KLU9ubHkgcHJlc2VudCBpZiBAY29kZXtUQ19GUkFHX1RZUEV9IGlzIGRlZmluZWQuCi0KLUBpdGVtIGZyX2ZpbGUKLUBpdGVteCBmcl9saW5lCi1UaGUgZmlsZSBhbmQgbGluZSB3aGVyZSB0aGlzIGZyYWcgd2FzIGxhc3QgbW9kaWZpZWQuCi0KLUBpdGVtIGZyX2xpdGVyYWwKLURlY2xhcmVkIGFzIGEgb25lLWNoYXJhY3RlciBhcnJheSwgdGhpcyBsYXN0IGZpZWxkIGdyb3dzIGFyYml0cmFyaWx5IGxhcmdlIHRvCi1ob2xkIHRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlIGZyYWcuCi1AZW5kIHRhYmxlCi0KLVRoZXNlIGFyZSB0aGUgcG9zc2libGUgcmVsYXhhdGlvbiBzdGF0ZXMsIHByb3ZpZGVkIGluIHRoZSBlbnVtZXJhdGlvbiB0eXBlCi1AY29kZXtyZWxheF9zdGF0ZVR9LCBhbmQgdGhlIGludGVycHJldGF0aW9ucyB0aGV5IHJlcHJlc2VudCBmb3IgdGhlIG90aGVyCi1maWVsZHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gcnNfYWxpZ24KLUBpdGVteCByc19hbGlnbl9jb2RlCi1UaGUgc3RhcnQgb2YgdGhlIGZvbGxvd2luZyBmcmFnIHNob3VsZCBiZSBhbGlnbmVkIG9uIHNvbWUgYm91bmRhcnkuICBJbiB0aGlzCi1mcmFnLCBAY29kZXtmcl9vZmZzZXR9IGlzIHRoZSBsb2dhcml0aG0gKGJhc2UgMikgb2YgdGhlIGFsaWdubWVudCBpbiBieXRlcy4KLShGb3IgZXhhbXBsZSwgaWYgYWxpZ25tZW50IG9uIGFuIDgtYnl0ZSBib3VuZGFyeSB3ZXJlIGRlc2lyZWQsIEBjb2Rle2ZyX29mZnNldH0KLXdvdWxkIGhhdmUgYSB2YWx1ZSBvZiAzLikgIFRoZSB2YXJpYWJsZSBjaGFyYWN0ZXJzIGluZGljYXRlIHRoZSBmaWxsIHBhdHRlcm4gdG8KLWJlIHVzZWQuICBUaGUgQGNvZGV7ZnJfc3VidHlwZX0gZmllbGQgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAKLXdoZW4gZG9pbmcgdGhpcyBhbGlnbm1lbnQuICBJZiBtb3JlIGJ5dGVzIGFyZSBuZWVkZWQsIHRoZSBhbGlnbm1lbnQgaXMgbm90Ci1kb25lLiAgQW4gQGNvZGV7ZnJfc3VidHlwZX0gdmFsdWUgb2YgMCBtZWFucyBubyBtYXhpbXVtLCB3aGljaCBpcyB0aGUgbm9ybWFsCi1jYXNlLiAgVGFyZ2V0IGJhY2tlbmRzIGNhbiB1c2UgQGNvZGV7cnNfYWxpZ25fY29kZX0gdG8gaGFuZGxlIGNlcnRhaW4gdHlwZXMgb2YKLWFsaWdubWVudCBkaWZmZXJlbnRseS4KLQotQGl0ZW0gcnNfYnJva2VuX3dvcmQKLVRoaXMgaW5kaWNhdGVzIHRoYXQgYGBicm9rZW4gd29yZCcnIHByb2Nlc3Npbmcgc2hvdWxkIGJlIGRvbmUgKEBweHJlZntCcm9rZW4KLXdvcmRzfSkuICBJZiBicm9rZW4gd29yZCBwcm9jZXNzaW5nIGlzIG5vdCBuZWNlc3Nhcnkgb24gdGhlIHRhcmdldCBtYWNoaW5lLAotdGhpcyBlbnVtZXJhdG9yIHZhbHVlIHdpbGwgbm90IGJlIGRlZmluZWQuCi0KLUBpdGVtIHJzX2NmYQotVGhpcyBzdGF0ZSBpcyB1c2VkIHRvIGltcGxlbWVudCBleGNlcHRpb24gZnJhbWUgb3B0aW1pemF0aW9ucy4gIFRoZQotQGNvZGV7ZnJfc3ltYm9sfSBpcyBhbiBleHByZXNzaW9uIHN5bWJvbCBmb3IgdGhlIHN1YnRyYWN0aW9uIHdoaWNoIG1heSBiZQotcmVsYXhlZC4gIFRoZSBAY29kZXtmcl9vcGNvZGV9IGZpZWxkIGhvbGRzIHRoZSBmcmFnIGZvciB0aGUgcHJlY2VkaW5nIGNvbW1hbmQKLWJ5dGUuICBUaGUgQGNvZGV7ZnJfb2Zmc2V0fSBmaWVsZCBob2xkcyB0aGUgb2Zmc2V0IHdpdGhpbiB0aGF0IGZyYWcuICBUaGUKLUBjb2Rle2ZyX3N1YnR5cGV9IGZpZWxkIGlzIHVzZWQgZHVyaW5nIHJlbGF4YXRpb24gdG8gaG9sZCB0aGUgY3VycmVudCBzaXplIG9mCi10aGUgZnJhZy4KLQotQGl0ZW0gcnNfZmlsbAotVGhlIHZhcmlhYmxlIGNoYXJhY3RlcnMgYXJlIHRvIGJlIHJlcGVhdGVkIEBjb2Rle2ZyX29mZnNldH0gdGltZXMuICBJZgotQGNvZGV7ZnJfb2Zmc2V0fSBpcyAwLCB0aGlzIGZyYWcgaGFzIGEgbGVuZ3RoIG9mIEBjb2Rle2ZyX2ZpeH0uICBNb3N0IGZyYWdzCi1oYXZlIHRoaXMgdHlwZS4KLQotQGl0ZW0gcnNfbGViMTI4Ci1UaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBEV0FSRiBgYGxpdHRsZSBlbmRpYW4gYmFzZSAxMjgnJyAKLXZhcmlhYmxlIGxlbmd0aCBudW1iZXIgZm9ybWF0LiAgVGhlIEBjb2Rle2ZyX3N5bWJvbH0gaXMgYWx3YXlzIGFuIGV4cHJlc3Npb24KLXN5bWJvbCwgYXMgY29uc3RhbnQgZXhwcmVzc2lvbnMgYXJlIGVtaXR0ZWQgZGlyZWN0bHkuICBUaGUgQGNvZGV7ZnJfb2Zmc2V0fQotZmllbGQgaXMgdXNlZCBkdXJpbmcgcmVsYXhhdGlvbiB0byBob2xkIHRoZSBwcmV2aW91cyBzaXplIG9mIHRoZSBudW1iZXIgc28KLXRoYXQgd2UgY2FuIGRldGVybWluZSBpZiB0aGUgZnJhZ21lbnQgY2hhbmdlZCBzaXplLgotCi1AaXRlbSByc19tYWNoaW5lX2RlcGVuZGVudAotRGlzcGxhY2VtZW50IHJlbGF4YXRpb24gaXMgdG8gYmUgZG9uZSBvbiB0aGlzIGZyYWcuICBUaGUgdGFyZ2V0IGlzIGluZGljYXRlZCBieQotQGNvZGV7ZnJfc3ltYm9sfSBhbmQgQGNvZGV7ZnJfb2Zmc2V0fSwgYW5kIEBjb2Rle2ZyX3N1YnR5cGV9IGluZGljYXRlcyB0aGUKLXBhcnRpY3VsYXIgbWFjaGluZS1zcGVjaWZpYyBhZGRyZXNzaW5nIG1vZGUgZGVzaXJlZC4gIEB4cmVme1JlbGF4YXRpb259LgotCi1AaXRlbSByc19vcmcKLVRoZSBzdGFydCBvZiB0aGUgZm9sbG93aW5nIGZyYWcgc2hvdWxkIGJlIHB1c2hlZCBiYWNrIHRvIHNvbWUgc3BlY2lmaWMgb2Zmc2V0Ci13aXRoaW4gdGhlIHNlY3Rpb24uICAoU29tZSBhc3NlbWJsZXJzIHVzZSB0aGUgdmFsdWUgYXMgYW4gYWJzb2x1dGUgYWRkcmVzczsgR0FTCi1kb2VzIG5vdCBoYW5kbGUgZmluYWwgYWJzb2x1dGUgYWRkcmVzc2VzLCBidXQgcmF0aGVyIHJlcXVpcmVzIHRoYXQgdGhlIGxpbmtlcgotc2V0IHRoZW0uKSAgVGhlIG9mZnNldCBpcyBnaXZlbiBieSBAY29kZXtmcl9zeW1ib2x9IGFuZCBAY29kZXtmcl9vZmZzZXR9OyBvbmUKLWNoYXJhY3RlciBmcm9tIHRoZSB2YXJpYWJsZS1sZW5ndGggdGFpbCBpcyB1c2VkIGFzIHRoZSBmaWxsIGNoYXJhY3Rlci4KLUBlbmQgdGFibGUKLQotQGNpbmRleCBmcmNoYWluUyBzdHJ1Y3R1cmUKLUEgY2hhaW4gb2YgZnJhZ3MgaXMgYnVpbHQgdXAgZm9yIGVhY2ggc3Vic2VjdGlvbi4gIFRoZSBkYXRhIHN0cnVjdHVyZQotZGVzY3JpYmluZyBhIGNoYWluIGlzIGNhbGxlZCBhIEBjb2Rle2ZyY2hhaW5TfSwgYW5kIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKLWZpZWxkczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBmcmNoX3Jvb3QKLVBvaW50cyB0byB0aGUgZmlyc3QgZnJhZyBpbiB0aGUgY2hhaW4uICBNYXkgYmUgTlVMTCBpZiB0aGVyZSBhcmUgbm8gZnJhZ3MgaW4KLXRoaXMgY2hhaW4uCi1AaXRlbSBmcmNoX2xhc3QKLVBvaW50cyB0byB0aGUgbGFzdCBmcmFnIGluIHRoZSBjaGFpbiwgb3IgTlVMTCBpZiB0aGVyZSBhcmUgbm9uZS4KLUBpdGVtIGZyY2hfbmV4dAotTmV4dCBpbiB0aGUgbGlzdCBvZiBAY29kZXtmcmNoYWluU30gc3RydWN0dXJlcy4KLUBpdGVtIGZyY2hfc2VnCi1JbmRpY2F0ZXMgdGhlIHNlY3Rpb24gdGhpcyBmcmFnIGNoYWluIGJlbG9uZ3MgdG8uCi1AaXRlbSBmcmNoX3N1YnNlZwotU3Vic2VjdGlvbiAoc3Vic2VnbWVudCkgbnVtYmVyIG9mIHRoaXMgZnJhZyBjaGFpbi4KLUBpdGVtIGZpeF9yb290LCBmaXhfdGFpbAotKERlZmluZWQgb25seSBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBkZWZpbmVkKS4gIFBvaW50IHRvIGZpcnN0IGFuZCBsYXN0Ci1AY29kZXtmaXhTfSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNlY3Rpb24uCi1AaXRlbSBmcmNoX29ic3RhY2sKLU5vdCBjdXJyZW50bHkgdXNlZC4gIEludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGZyYWcgYWxsb2NhdGlvbiBmb3IgdGhpcwotc3Vic2VjdGlvbi4gIFRoaXMgc2hvdWxkIHJlZHVjZSBmcmFnIGdlbmVyYXRpb24gY2F1c2VkIGJ5IHN3aXRjaGluZyBzZWN0aW9ucy4KLUBpdGVtIGZyY2hfZnJhZ19ub3cKLVRoZSBjdXJyZW50IGZyYWcgZm9yIHRoaXMgc3Vic2VnbWVudC4KLUBlbmQgdGFibGUKLQotQSBAY29kZXtmcmNoYWluU30gY29ycmVzcG9uZHMgdG8gYSBzdWJzZWN0aW9uOyBlYWNoIHNlY3Rpb24gaGFzIGEgbGlzdCBvZgotQGNvZGV7ZnJjaGFpblN9IHJlY29yZHMgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSW4gbW9zdCBjYXNlcywgb25seSBvbmUgc3Vic2VjdGlvbgotb2YgZWFjaCBzZWN0aW9uIGlzIHVzZWQsIHNvIHRoZSBsaXN0IHdpbGwgb25seSBiZSBvbmUgZWxlbWVudCBsb25nLCBidXQgYW55Ci1wcm9jZXNzaW5nIG9mIGZyYWcgY2hhaW5zIHNob3VsZCBiZSBwcmVwYXJlZCB0byBkZWFsIHdpdGggbXVsdGlwbGUgY2hhaW5zIHBlcgotc2VjdGlvbi4KLQotQWZ0ZXIgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBjb21wbGV0ZWx5IHByb2Nlc3NlZCwgYW5kIG5vIG1vcmUgZnJhZ3MgYXJlIHRvCi1iZSBnZW5lcmF0ZWQsIHRoZSBmcmFnIGNoYWlucyBhcmUgam9pbmVkIGludG8gb25lIHBlciBzZWN0aW9uIGZvciBmdXJ0aGVyCi1wcm9jZXNzaW5nLiAgQWZ0ZXIgdGhpcyBwb2ludCwgaXQgaXMgc2FmZSB0byBvcGVyYXRlIG9uIG9uZSBjaGFpbiBwZXIgc2VjdGlvbi4KLQotVGhlIGFzc2VtYmxlciBhbHdheXMgaGFzIGEgY3VycmVudCBmcmFnLCBuYW1lZCBAY29kZXtmcmFnX25vd30uICBNb3JlIHNwYWNlIGlzCi1hbGxvY2F0ZWQgZm9yIHRoZSBjdXJyZW50IGZyYWcgdXNpbmcgdGhlIEBjb2Rle2ZyYWdfbW9yZX0gZnVuY3Rpb247IHRoaXMKLXJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhbW91bnQgb2YgcmVxdWVzdGVkIHNwYWNlLiAgUmVsYXhpbmcgaXMgZG9uZSB1c2luZwotdmFyaWFudCBmcmFncyBhbGxvY2F0ZWQgYnkgQGNvZGV7ZnJhZ192YXJ9IG9yIEBjb2Rle2ZyYWdfdmFyaWFudH0KLShAcHhyZWZ7UmVsYXhhdGlvbn0pLgotCi1Abm9kZSBHQVMgcHJvY2Vzc2luZwotQHNlY3Rpb24gV2hhdCBHQVMgZG9lcyB3aGVuIGl0IHJ1bnMKLUBjaW5kZXggaW50ZXJuYWxzLCBvdmVydmlldwotCi1UaGlzIGlzIGEgcXVpY2sgbG9vayBhdCB3aGF0IGFuIGFzc2VtYmxlciBydW4gbG9va3MgbGlrZS4KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSBhc3NlbWJsZXIgaW5pdGlhbGl6ZXMgaXRzZWxmIGJ5IGNhbGxpbmcgdmFyaW91cyBpbml0IHJvdXRpbmVzLgotCi1AaXRlbQotRm9yIGVhY2ggc291cmNlIGZpbGUsIHRoZSBAY29kZXtyZWFkX2Ffc291cmNlX2ZpbGV9IGZ1bmN0aW9uIHJlYWRzIGluIHRoZSBmaWxlCi1hbmQgcGFyc2VzIGl0LiAgVGhlIGdsb2JhbCB2YXJpYWJsZSBAY29kZXtpbnB1dF9saW5lX3BvaW50ZXJ9IHBvaW50cyB0byB0aGUKLWN1cnJlbnQgdGV4dDsgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IHVwIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGJ1dCBub3QKLWZhcnRoZXIuCi0KLUBpdGVtCi1Gb3IgZWFjaCBsaW5lLCB0aGUgYXNzZW1ibGVyIHBhc3NlcyBsYWJlbHMgdG8gdGhlIEBjb2Rle2NvbG9ufSBmdW5jdGlvbiwgYW5kCi1pc29sYXRlcyB0aGUgZmlyc3Qgd29yZC4gIElmIGl0IGxvb2tzIGxpa2UgYSBwc2V1ZG8tb3AsIHRoZSB3b3JkIGlzIGxvb2tlZCB1cAotaW4gdGhlIHBzZXVkby1vcCBoYXNoIHRhYmxlIEBjb2Rle3BvX2hhc2h9IGFuZCBkaXNwYXRjaGVkIHRvIGEgcHNldWRvLW9wCi1yb3V0aW5lLiAgT3RoZXJ3aXNlLCB0aGUgdGFyZ2V0IGRlcGVuZGVudCBAY29kZXttZF9hc3NlbWJsZX0gcm91dGluZSBpcyBjYWxsZWQKLXRvIHBhcnNlIHRoZSBpbnN0cnVjdGlvbi4KLQotQGl0ZW0KLVdoZW4gcHNldWRvLW9wcyBvciBpbnN0cnVjdGlvbnMgb3V0cHV0IGRhdGEsIHRoZXkgYWRkIGl0IHRvIGEgZnJhZywgY2FsbGluZwotQGNvZGV7ZnJhZ19tb3JlfSB0byBnZXQgc3BhY2UgdG8gc3RvcmUgaXQgaW4uCi0KLUBpdGVtCi1Qc2V1ZG8tb3BzIGFuZCBpbnN0cnVjdGlvbnMgY2FuIGFsc28gb3V0cHV0IGZpeHVwcyBjcmVhdGVkIGJ5IEBjb2Rle2ZpeF9uZXd9IG9yCi1AY29kZXtmaXhfbmV3X2V4cH0uCi0KLUBpdGVtCi1Gb3IgY2VydGFpbiB0YXJnZXRzLCBpbnN0cnVjdGlvbnMgY2FuIGNyZWF0ZSB2YXJpYW50IGZyYWdzIHdoaWNoIGFyZSB1c2VkIHRvCi1zdG9yZSByZWxheGF0aW9uIGluZm9ybWF0aW9uIChAcHhyZWZ7UmVsYXhhdGlvbn0pLgotCi1AaXRlbQotV2hlbiB0aGUgaW5wdXQgZmlsZSBpcyBmaW5pc2hlZCwgdGhlIEBjb2Rle3dyaXRlX29iamVjdF9maWxlfSByb3V0aW5lIGlzCi1jYWxsZWQuICBJdCBhc3NpZ25zIGFkZHJlc3NlcyB0byBhbGwgdGhlIGZyYWdzIChAY29kZXtyZWxheF9zZWdtZW50fSksIHJlc29sdmVzCi1hbGwgdGhlIGZpeHVwcyAoQGNvZGV7Zml4dXBfc2VnbWVudH0pLCByZXNvbHZlcyBhbGwgdGhlIHN5bWJvbCB2YWx1ZXMgKHVzaW5nCi1AY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0pLCBhbmQgZmluYWxseSB3cml0ZXMgb3V0IHRoZSBmaWxlIChpbiB0aGUKLUBjb2Rle0JGRF9BU1NFTUJMRVJ9IGNhc2UsIHRoaXMgaXMgZG9uZSBieSBzaW1wbHkgY2FsbGluZyBAY29kZXtiZmRfY2xvc2V9KS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBQb3J0aW5nIEdBUwotQHNlY3Rpb24gUG9ydGluZyBHQVMKLUBjaW5kZXggcG9ydGluZwotCi1FYWNoIEdBUyB0YXJnZXQgc3BlY2lmaWVzIHR3byBtYWluIHRoaW5nczogdGhlIENQVSBmaWxlIGFuZCB0aGUgb2JqZWN0IGZvcm1hdAotZmlsZS4gIFR3byBtYWluIHN3aXRjaGVzIGluIHRoZSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgaGFuZGxlIHRoaXMuICBUaGUKLWZpcnN0IHN3aXRjaGVzIG9uIENQVSB0eXBlIHRvIHNldCB0aGUgc2hlbGwgdmFyaWFibGUgQGNvZGV7Y3B1X3R5cGV9LiAgVGhlCi1zZWNvbmQgc3dpdGNoZXMgb24gdGhlIGVudGlyZSB0YXJnZXQgdG8gc2V0IHRoZSBzaGVsbCB2YXJpYWJsZSBAY29kZXtmbXR9LgotCi1UaGUgY29uZmlndXJlIHNjcmlwdCB1c2VzIHRoZSB2YWx1ZSBvZiBAY29kZXtjcHVfdHlwZX0gdG8gc2VsZWN0IHR3byBmaWxlcyBpbgotdGhlIEBmaWxle2NvbmZpZ30gZGlyZWN0b3J5OiBAZmlsZXt0Yy1AdmFye0NQVX0uY30gYW5kIEBmaWxle3RjLUB2YXJ7Q1BVfS5ofS4KLVRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3Mgd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle3RhcmctY3B1Lmh9IGluIHRoZQotYnVpbGQgZGlyZWN0b3J5IHdoaWNoIGluY2x1ZGVzIEBmaWxle3RjLUB2YXJ7Q1BVfS5ofS4KLQotVGhlIGNvbmZpZ3VyZSBzY3JpcHQgYWxzbyB1c2VzIHRoZSB2YWx1ZSBvZiBAY29kZXtmbXR9IHRvIHNlbGVjdCB0d28gZmlsZXM6Ci1AZmlsZXtvYmotQHZhcntmbXR9LmN9IGFuZCBAZmlsZXtvYmotQHZhcntmbXR9Lmh9LiAgVGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcwotd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle29iai1mb3JtYXQuaH0gaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSB3aGljaAotaW5jbHVkZXMgQGZpbGV7b2JqLUB2YXJ7Zm10fS5ofS4KLQotWW91IGNhbiBhbHNvIHNldCB0aGUgZW11bGF0aW9uIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGJ5IHNldHRpbmcgdGhlIEBjb2Rle2VtfQotdmFyaWFibGUuICBOb3JtYWxseSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBAc2FtcHtnZW5lcmljfSBpcyBmaW5lLiAgVGhlCi1jb25maWd1cmF0aW9uIHByb2Nlc3Mgd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle3RhcmctZW52Lmh9IGluIHRoZSBidWlsZAotZGlyZWN0b3J5IHdoaWNoIGluY2x1ZGVzIEBmaWxle3RlLUB2YXJ7ZW19Lmh9LgotCi1Qb3J0aW5nIEdBUyB0byBhIG5ldyBDUFUgcmVxdWlyZXMgd3JpdGluZyB0aGUgQGZpbGV7dGMtQHZhcntDUFV9fSBmaWxlcy4KLVBvcnRpbmcgR0FTIHRvIGEgbmV3IG9iamVjdCBmaWxlIGZvcm1hdCByZXF1aXJlcyB3cml0aW5nIHRoZQotQGZpbGV7b2JqLUB2YXJ7Zm10fX0gZmlsZXMuICBUaGVyZSBpcyBzb21ldGltZXMgc29tZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZXNlCi10d28gZmlsZXMsIGJ1dCBpdCBpcyBub3JtYWxseSBtaW5pbWFsLgotCi1UaGUgYmVzdCBhcHByb2FjaCBpcywgb2YgY291cnNlLCB0byBjb3B5IGV4aXN0aW5nIGZpbGVzLiAgVGhlIGRvY3VtZW50YXRpb24KLWJlbG93IGFzc3VtZXMgdGhhdCB5b3UgYXJlIGxvb2tpbmcgYXQgZXhpc3RpbmcgZmlsZXMgdG8gc2VlIHVzYWdlIGRldGFpbHMuCi0KLVRoZXNlIGludGVyZmFjZXMgaGF2ZSBncm93biBvdmVyIHRpbWUsIGFuZCBoYXZlIG5ldmVyIGJlZW4gY2FyZWZ1bGx5IHRob3VnaHQKLW91dCBvciBkZXNpZ25lZC4gIE5vdGhpbmcgYWJvdXQgdGhlIGludGVyZmFjZXMgZGVzY3JpYmVkIGhlcmUgaXMgY2FzdCBpbiBzdG9uZS4KLUl0IGlzIHBvc3NpYmxlIHRoYXQgdGhleSB3aWxsIGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIgdG8gdGhlCi1uZXh0LiAgQWxzbywgbmV3IG1hY3JvcyBhcmUgYWRkZWQgYWxsIHRoZSB0aW1lIGFzIHRoZXkgYXJlIG5lZWRlZC4KLQotQG1lbnUKLSogQ1BVIGJhY2tlbmQ6OiAgICAgICAgICAgICAgICAgV3JpdGluZyBhIENQVSBiYWNrZW5kCi0qIE9iamVjdCBmb3JtYXQgYmFja2VuZDo6ICAgICAgIFdyaXRpbmcgYW4gb2JqZWN0IGZvcm1hdCBiYWNrZW5kCi0qIEVtdWxhdGlvbnM6OiAgICAgICAgICAgICAgICAgIFdyaXRpbmcgZW11bGF0aW9uIGZpbGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQ1BVIGJhY2tlbmQKLUBzdWJzZWN0aW9uIFdyaXRpbmcgYSBDUFUgYmFja2VuZAotQGNpbmRleCBDUFUgYmFja2VuZAotQGNpbmRleCBAZmlsZXt0Yy1AdmFye0NQVX19Ci0KLVRoZSBDUFUgYmFja2VuZCBmaWxlcyBhcmUgdGhlIGhlYXJ0IG9mIHRoZSBhc3NlbWJsZXIuICBUaGV5IGFyZSB0aGUgb25seSBwYXJ0cwotb2YgdGhlIGFzc2VtYmxlciB3aGljaCBhY3R1YWxseSBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBpbnN0cnVjdGlvbiBzZXQgb2YgdGhlCi1wcm9jZXNzb3IuCi0KLVlvdSBtdXN0IGRlZmluZSBhIHJlYXNvbmFibHkgc21hbGwgbGlzdCBvZiBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBpbiB0aGUgQ1BVCi1iYWNrZW5kIGZpbGVzLiAgWW91IG1heSBkZWZpbmUgYSBsYXJnZSBudW1iZXIgb2YgYWRkaXRpb25hbCBtYWNyb3MgaW4gdGhlIENQVQotYmFja2VuZCBmaWxlcywgbm90IGFsbCBvZiB3aGljaCBhcmUgZG9jdW1lbnRlZCBoZXJlLiAgWW91IG11c3QsIG9mIGNvdXJzZSwKLWRlZmluZSBtYWNyb3MgaW4gdGhlIEBmaWxley5ofSBmaWxlLCB3aGljaCBpcyBpbmNsdWRlZCBieSBldmVyeSBhc3NlbWJsZXIKLXNvdXJjZSBmaWxlLiAgWW91IG1heSBkZWZpbmUgdGhlIGZ1bmN0aW9ucyBhcyBtYWNyb3MgaW4gdGhlIEBmaWxley5ofSBmaWxlLCBvcgotYXMgZnVuY3Rpb25zIGluIHRoZSBAZmlsZXsuY30gZmlsZS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBUQ19AdmFye0NQVX0KLUBjaW5kZXggVENfQHZhcntDUFV9Ci1CeSBjb252ZW50aW9uLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIGluIHRoZSBAZmlsZXsuaH0gZmlsZS4gIEZvcgotZXhhbXBsZSwgQGZpbGV7dGMtbTY4ay5ofSBkZWZpbmVzIEBjb2Rle1RDX002OEt9LiAgWW91IG1pZ2h0IGhhdmUgdG8gdXNlIHRoaXMKLWlmIGl0IGlzIG5lY2Vzc2FyeSB0byBhZGQgQ1BVIHNwZWNpZmljIGNvZGUgdG8gdGhlIG9iamVjdCBmb3JtYXQgZmlsZS4KLQotQGl0ZW0gVEFSR0VUX0ZPUk1BVAotVGhpcyBtYWNybyBpcyB0aGUgQkZEIHRhcmdldCBuYW1lIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMKLXdpbGwgbm9ybWFsbHkgZGVwZW5kIHVwb24gdGhlIEBjb2Rle09CSl9AdmFye0ZNVH19IG1hY3JvLgotCi1AaXRlbSBUQVJHRVRfQVJDSAotVGhpcyBtYWNybyBpcyB0aGUgQkZEIGFyY2hpdGVjdHVyZSB0byBwYXNzIHRvIEBjb2Rle2JmZF9zZXRfYXJjaF9tYWNofS4KLQotQGl0ZW0gVEFSR0VUX01BQ0gKLVRoaXMgbWFjcm8gaXMgdGhlIEJGRCBtYWNoaW5lIG51bWJlciB0byBwYXNzIHRvIEBjb2Rle2JmZF9zZXRfYXJjaF9tYWNofS4gIElmCi1pdCBpcyBub3QgZGVmaW5lZCwgR0FTIHdpbGwgdXNlIDAuCi0KLUBpdGVtIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi1Zb3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIHRvIGJlIG5vbi16ZXJvIGlmIHRoZSB0YXJnZXQgaXMgYmlnIGVuZGlhbiwgYW5kCi16ZXJvIGlmIHRoZSB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbi4KLQotQGl0ZW0gbWRfc2hvcnRvcHRzCi1AaXRlbXggbWRfbG9uZ29wdHMKLUBpdGVteCBtZF9sb25nb3B0c19zaXplCi1AaXRlbXggbWRfcGFyc2Vfb3B0aW9uCi1AaXRlbXggbWRfc2hvd191c2FnZQotQGNpbmRleCBtZF9zaG9ydG9wdHMKLUBjaW5kZXggbWRfbG9uZ29wdHMKLUBjaW5kZXggbWRfbG9uZ29wdHNfc2l6ZQotQGNpbmRleCBtZF9wYXJzZV9vcHRpb24KLUBjaW5kZXggbWRfc2hvd191c2FnZQotR0FTIHVzZXMgdGhlc2UgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZHVyaW5nIG9wdGlvbiBwcm9jZXNzaW5nLgotQGNvZGV7bWRfc2hvcnRvcHRzfSBpcyBhIEBjb2Rle2NvbnN0IGNoYXIgKn0gd2hpY2ggR0FTIGFkZHMgdG8gdGhlIG1hY2hpbmUKLWluZGVwZW5kZW50IHN0cmluZyBwYXNzZWQgdG8gQGNvZGV7Z2V0b3B0fS4gIEBjb2Rle21kX2xvbmdvcHRzfSBpcyBhCi1AY29kZXtzdHJ1Y3Qgb3B0aW9uIFtdfSB3aGljaCBHQVMgYWRkcyB0byB0aGUgbWFjaGluZSBpbmRlcGVuZGVudCBsb25nIG9wdGlvbnMKLXBhc3NlZCB0byBAY29kZXtnZXRvcHR9OyB5b3UgbWF5IHVzZSBAY29kZXtPUFRJT05fTURfQkFTRX0sIGRlZmluZWQgaW4KLUBmaWxle2FzLmh9LCBhcyB0aGUgc3RhcnQgb2YgYSBzZXQgb2YgbG9uZyBvcHRpb24gaW5kaWNlcywgaWYgbmVjZXNzYXJ5LgotQGNvZGV7bWRfbG9uZ29wdHNfc2l6ZX0gaXMgYSBAY29kZXtzaXplX3R9IGhvbGRpbmcgdGhlIHNpemUgQGNvZGV7bWRfbG9uZ29wdHN9LgotR0FTIHdpbGwgY2FsbCBAY29kZXttZF9wYXJzZV9vcHRpb259IHdoZW5ldmVyIEBjb2Rle2dldG9wdH0gcmV0dXJucyBhbgotdW5yZWNvZ25pemVkIGNvZGUsIHByZXN1bWFibHkgaW5kaWNhdGluZyBhIHNwZWNpYWwgY29kZSB2YWx1ZSB3aGljaCBhcHBlYXJzIGluCi1AY29kZXttZF9sb25nb3B0c30uICBHQVMgd2lsbCBjYWxsIEBjb2Rle21kX3Nob3dfdXNhZ2V9IHdoZW4gYSB1c2FnZSBtZXNzYWdlIGlzCi1wcmludGVkOyBpdCBzaG91bGQgcHJpbnQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbWFjaGluZSBzcGVjaWZpYyBvcHRpb25zLgotCi1AaXRlbSBtZF9iZWdpbgotQGNpbmRleCBtZF9iZWdpbgotR0FTIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgYXNzZW1ibHksIGFmdGVyIHRoZSBjb21tYW5kCi1saW5lIGFyZ3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIGFuZCBhbGwgdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb25zCi1oYXZlIGJlZW4gY29tcGxldGVkLgotCi1AaXRlbSBtZF9jbGVhbnVwCi1AY2luZGV4IG1kX2NsZWFudXAKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhdCB0aGUgZW5kIG9mIGVhY2ggaW5wdXQgZmlsZS4KLQotQGl0ZW0gbWRfYXNzZW1ibGUKLUBjaW5kZXggbWRfYXNzZW1ibGUKLUdBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgZWFjaCBpbnB1dCBsaW5lIHdoaWNoIGRvZXMgbm90IGNvbnRhaW4gYQotcHNldWRvLW9wLiAgVGhlIGFyZ3VtZW50IGlzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSBmdW5jdGlvbiBzaG91bGQKLWFzc2VtYmxlIHRoZSBzdHJpbmcgYXMgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBvcGVyYW5kcy4gIE5vcm1hbGx5Ci1AY29kZXttZF9hc3NlbWJsZX0gd2lsbCBkbyB0aGlzIGJ5IGNhbGxpbmcgQGNvZGV7ZnJhZ19tb3JlfSBhbmQgd3JpdGluZyBvdXQKLXNvbWUgYnl0ZXMgKEBweHJlZntGcmFnc30pLiAgQGNvZGV7bWRfYXNzZW1ibGV9IHdpbGwgY2FsbCBAY29kZXtmaXhfbmV3fSB0bwotY3JlYXRlIGZpeHVwcyBhcyBuZWVkZWQgKEBweHJlZntGaXh1cHN9KS4gIFRhcmdldHMgd2hpY2ggbmVlZCB0byBkbyBzcGVjaWFsCi1wdXJwb3NlIHJlbGF4YXRpb24gd2lsbCBjYWxsIEBjb2Rle2ZyYWdfdmFyfS4KLQotQGl0ZW0gbWRfcHNldWRvX3RhYmxlCi1AY2luZGV4IG1kX3BzZXVkb190YWJsZQotVGhpcyBpcyBhIGNvbnN0IGFycmF5IG9mIHR5cGUgQGNvZGV7cHNldWRvX3R5cGVTfS4gIEl0IGlzIGEgbWFwcGluZyBmcm9tCi1wc2V1ZG8tb3AgbmFtZXMgdG8gZnVuY3Rpb25zLiAgWW91IHNob3VsZCB1c2UgdGhpcyB0YWJsZSB0byBpbXBsZW1lbnQKLXBzZXVkby1vcHMgd2hpY2ggYXJlIHNwZWNpZmljIHRvIHRoZSBDUFUuCi0KLUBpdGVtIHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wCi1AY2luZGV4IHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wCi1JZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIEdBUyB3aWxsIGNhbGwgaXQgd2l0aCBhIEBjb2Rle3BzZXVkb190eXBlU30gYXJndW1lbnQuCi1JdCBzaG91bGQgcmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBwc2V1ZG8tb3AgaXMgYSBjb25kaXRpb25hbCB3aGljaCBjb250cm9scwotd2hldGhlciBjb2RlIGlzIGFzc2VtYmxlZCwgc3VjaCBhcyBAc2FtcHsuaWZ9LiAgR0FTIGtub3dzIGFib3V0IHRoZSBub3JtYWwKLWNvbmRpdGlvbmFsIHBzZXVkby1vcHMsYW5kIHlvdSBzaG91bGQgbm9ybWFsbHkgbm90IGhhdmUgdG8gZGVmaW5lIHRoaXMgbWFjcm8uCi0KLUBpdGVtIGNvbW1lbnRfY2hhcnMKLUBjaW5kZXggY29tbWVudF9jaGFycwotVGhpcyBpcyBhIG51bGwgdGVybWluYXRlZCBAY29kZXtjb25zdCBjaGFyfSBhcnJheSBvZiBjaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEKLWNvbW1lbnQuCi0KLUBpdGVtIHRjX2NvbW1lbnRfY2hhcnMKLUBjaW5kZXggdGNfY29tbWVudF9jaGFycwotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBHQVMgd2lsbCB1c2UgaXQgaW5zdGVhZCBvZiBAY29kZXtjb21tZW50X2NoYXJzfS4KLQotQGl0ZW0gdGNfc3ltYm9sX2NoYXJzCi1AY2luZGV4IHRjX3N5bWJvbF9jaGFycwotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBpdCBpcyBhIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgbGlzdCBvZgotY2hhcmFjdGVycyB3aGljaCBtYXkgYXBwZWFyIGluIGFuIG9wZXJhbmQuICBHQVMgYWxyZWFkeSBhc3N1bWVzIHRoYXQgYWxsCi1hbHBoYW51bWJlcmljIGNoYXJhY3RlcnMsIGFuZCBAc2FtcHskfSwgQHNhbXB7Ln0sIGFuZCBAc2FtcHtffSBtYXkgYXBwZWFyIGluIGFuCi1vcGVyYW5kIChzZWUgQHNhbXB7c3ltYm9sX2NoYXJzfSBpbiBAZmlsZXthcHAuY30pLiAgVGhpcyBtYWNybyBtYXkgYmUgZGVmaW5lZAotdG8gdHJlYXQgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGFzIGFwcGVhcmluZyBpbiBhbiBvcGVyYW5kLiAgVGhpcyBhZmZlY3RzIHRoZQotd2F5IGluIHdoaWNoIEdBUyByZW1vdmVzIHdoaXRlc3BhY2UgYmVmb3JlIHBhc3NpbmcgdGhlIHN0cmluZyB0bwotQHNhbXB7bWRfYXNzZW1ibGV9LgotCi1AaXRlbSBsaW5lX2NvbW1lbnRfY2hhcnMKLUBjaW5kZXggbGluZV9jb21tZW50X2NoYXJzCi1UaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYQotY29tbWVudCB3aGVuIHRoZXkgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCi0KLUBpdGVtIGxpbmVfc2VwYXJhdG9yX2NoYXJzCi1AY2luZGV4IGxpbmVfc2VwYXJhdG9yX2NoYXJzCi1UaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggc2VwYXJhdGUKLWxpbmVzIChzZW1pY29sb24gYW5kIG5ld2xpbmUgYXJlIHN1Y2ggY2hhcmFjdGVycyBieSBkZWZhdWx0LCBhbmQgbmVlZCBub3QgYmUKLWxpc3RlZCBpbiB0aGlzIGFycmF5KS4KLQotQGl0ZW0gRVhQX0NIQVJTCi1AY2luZGV4IEVYUF9DSEFSUwotVGhpcyBpcyBhIG51bGwgdGVybWluYXRlZCBAY29kZXtjb25zdCBjaGFyfSBhcnJheSBvZiBjaGFyYWN0ZXJzIHdoaWNoIG1heSBiZQotdXNlZCBhcyB0aGUgZXhwb25lbnQgY2hhcmFjdGVyIGluIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgVGhpcyBpcyBub3JtYWxseQotQGNvZGV7ImVFIn0uCi0KLUBpdGVtIEZMVF9DSEFSUwotQGNpbmRleCBGTFRfQ0hBUlMKLVRoaXMgaXMgYSBudWxsIHRlcm1pbmF0ZWQgQGNvZGV7Y29uc3QgY2hhcn0gYXJyYXkgb2YgY2hhcmFjdGVycyB3aGljaCBtYXkgYmUKLXVzZWQgdG8gaW5kaWNhdGUgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gIEEgemVybyBmb2xsb3dlZCBieSBvbmUgb2YgdGhlc2UKLWNoYXJhY3RlcnMgaXMgYXNzdW1lZCB0byBiZSBmb2xsb3dlZCBieSBhIGZsb2F0aW5nIHBvaW50IG51bWJlcjsgdGh1cyB0aGV5Ci1vcGVyYXRlIHRoZSB3YXkgdGhhdCBAY29kZXsweH0gaXMgdXNlZCB0byBpbmRpY2F0ZSBhIGhleGFkZWNpbWFsIGNvbnN0YW50LgotVXN1YWxseSB0aGlzIGluY2x1ZGVzIEBzYW1we3J9IGFuZCBAc2FtcHtmfS4KLQotQGl0ZW0gTEVYX0FUCi1AY2luZGV4IExFWF9BVAotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byB0aGUgbGV4aWNhbCB0eXBlIG9mIHRoZSBAa2Jke0B9fSBjaGFyYWN0ZXIuICBUaGUKLWRlZmF1bHQgaXMgemVyby4KLQotTGV4aWNhbCB0eXBlcyBhcmUgYSBjb21iaW5hdGlvbiBvZiBAY29kZXtMRVhfTkFNRX0gYW5kIEBjb2Rle0xFWF9CRUdJTl9OQU1FfSwKLWJvdGggZGVmaW5lZCBpbiBAZmlsZXtyZWFkLmh9LiAgQGNvZGV7TEVYX05BTUV9IGluZGljYXRlcyB0aGF0IHRoZSBjaGFyYWN0ZXIKLW1heSBhcHBlYXIgaW4gYSBuYW1lLiAgQGNvZGV7TEVYX0JFR0lOX05BTUV9IGluZGljYXRlcyB0aGF0IHRoZSBjaGFyYWN0ZXIgbWF5Ci1hcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG5lbS4KLQotQGl0ZW0gTEVYX0JSCi1AY2luZGV4IExFWF9CUgotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byB0aGUgbGV4aWNhbCB0eXBlIG9mIHRoZSBicmFjZSBjaGFyYWN0ZXJzIEBrYmR7QHt9LAotQGtiZHtAfX0sIEBrYmR7W30sIGFuZCBAa2Jke119LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgemVyby4KLQotQGl0ZW0gTEVYX1BDVAotQGNpbmRleCBMRVhfUENUCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBsZXhpY2FsIHR5cGUgb2YgdGhlIEBrYmR7JX0gY2hhcmFjdGVyLiAgVGhlCi1kZWZhdWx0IHZhbHVlIGlzIHplcm8uCi0KLUBpdGVtIExFWF9RTQotQGNpbmRleCBMRVhfUU0KLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhlIGxleGljYWwgdHlwZSBvZiB0aGUgQGtiZHs/fSBjaGFyYWN0ZXIuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXQgemVyby4KLQotQGl0ZW0gTEVYX0RPTExBUgotQGNpbmRleCBMRVhfRE9MTEFSCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBsZXhpY2FsIHR5cGUgb2YgdGhlIEBrYmR7JH0gY2hhcmFjdGVyLiAgVGhlCi1kZWZhdWx0IHZhbHVlIGlzIEBjb2Rle0xFWF9OQU1FIHwgTEVYX0JFR0lOX05BTUV9LgotCi1AaXRlbSBTSU5HTEVfUVVPVEVfU1RSSU5HUwotQGNpbmRleCBTSU5HTEVfUVVPVEVfU1RSSU5HUwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCB0cmVhdCBzaW5nbGUgcXVvdGVzIGFzIHN0cmluZyBkZWxpbWl0ZXJzLgotTm9ybWFsbHkgb25seSBkb3VibGUgcXVvdGVzIGFyZSBhY2NlcHRlZCBhcyBzdHJpbmcgZGVsaW1pdGVycy4KLQotQGl0ZW0gTk9fU1RSSU5HX0VTQ0FQRVMKLUBjaW5kZXggTk9fU1RSSU5HX0VTQ0FQRVMKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgbm90IHBlcm1pdCBlc2NhcGUgc2VxdWVuY2VzIGluIGEgc3RyaW5nLgotCi1AaXRlbSBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMKLUBjaW5kZXggT05MWV9TVEFOREFSRF9FU0NBUEVTCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHdhcm4gYWJvdXQgdGhlIHVzZSBvZiBub25zdGFuZGFyZCBlc2NhcGUKLXNlcXVlbmNlcyBpbiBhIHN0cmluZy4KLQotQGl0ZW0gbWRfc3RhcnRfbGluZV9ob29rCi1AY2luZGV4IG1kX3N0YXJ0X2xpbmVfaG9vawotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGF0IHRoZSBzdGFydCBvZiBlYWNoIGxpbmUuCi0KLUBpdGVtIExBQkVMU19XSVRIT1VUX0NPTE9OUwotQGNpbmRleCBMQUJFTFNfV0lUSE9VVF9DT0xPTlMKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgYXNzdW1lIHRoYXQgYW55IHRleHQgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZQotaXMgYSBsYWJlbCwgZXZlbiBpZiBpdCBkb2VzIG5vdCBoYXZlIGEgY29sb24uCi0KLUBpdGVtIFRDX1NUQVJUX0xBQkVMCi1AY2luZGV4IFRDX1NUQVJUX0xBQkVMCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGNvbnRyb2wgd2hhdCBHQVMgY29uc2lkZXJzIHRvIGJlIGEgbGFiZWwuICBUaGUKLWRlZmF1bHQgZGVmaW5pdGlvbiBpcyB0byBhY2NlcHQgYW55IG5hbWUgZm9sbG93ZWQgYnkgYSBjb2xvbiBjaGFyYWN0ZXIuCi0KLUBpdGVtIE5PX1BTRVVET19ET1QKLUBjaW5kZXggTk9fUFNFVURPX0RPVAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBub3QgcmVxdWlyZSBwc2V1ZG8tb3BzIHRvIHN0YXJ0IHdpdGggYQotQGtiZHsufSBjaGFyYWN0ZXIuCi0KLUBpdGVtIFRDX0VRVUFMX0lOX0lOU04KLUBjaW5kZXggVENfRVFVQUxfSU5fSU5TTgotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBpdCBzaG91bGQgcmV0dXJuIG5vbnplcm8gaWYgdGhlIGluc3RydWN0aW9uIGlzCi1wZXJtaXR0ZWQgdG8gY29udGFpbiBhbiBAa2Jkez19IGNoYXJhY3Rlci4gIEdBUyB3aWxsIHVzZSB0aGlzIHRvIGRlY2lkZSBpZiBhCi1Aa2Jkez19IGlzIGFuIGFzc2lnbm1lbnQgb3IgYW4gaW5zdHJ1Y3Rpb24uCi0KLUBpdGVtIFRDX0VPTF9JTl9JTlNOCi1AY2luZGV4IFRDX0VPTF9JTl9JTlNOCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGl0IHNob3VsZCByZXR1cm4gbm9uemVybyBpZiB0aGUgY3VycmVudCBpbnB1dCBsaW5lCi1wb2ludGVyIHNob3VsZCBiZSB0cmVhdGVkIGFzIHRoZSBlbmQgb2YgYSBsaW5lLgotCi1AaXRlbSBtZF9wYXJzZV9uYW1lCi1AY2luZGV4IG1kX3BhcnNlX25hbWUKLUlmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgR0FTIHdpbGwgY2FsbCBpdCBmb3IgYW55IHN5bWJvbCBmb3VuZCBpbiBhbgotZXhwcmVzc2lvbi4gIFlvdSBjYW4gZGVmaW5lIHRoaXMgdG8gaGFuZGxlIHNwZWNpYWwgc3ltYm9scyBpbiBhIHNwZWNpYWwgd2F5LgotSWYgYSBzeW1ib2wgYWx3YXlzIGhhcyBhIGNlcnRhaW4gdmFsdWUsIHlvdSBzaG91bGQgbm9ybWFsbHkgZW50ZXIgaXQgaW4gdGhlCi1zeW1ib2wgdGFibGUsIHBlcmhhcHMgdXNpbmcgQGNvZGV7cmVnX3NlY3Rpb259LgotCi1AaXRlbSBtZF91bmRlZmluZWRfc3ltYm9sCi1AY2luZGV4IG1kX3VuZGVmaW5lZF9zeW1ib2wKLUdBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIGEgc3ltYm9sIHRhYmxlIGxvb2t1cCBmYWlscywgYmVmb3JlIGl0Ci1jcmVhdGVzIGEgbmV3IHN5bWJvbC4gIFR5cGljYWxseSB0aGlzIHdvdWxkIGJlIHVzZWQgdG8gc3VwcGx5IHN5bWJvbHMgd2hvc2UKLW5hbWUgb3IgdmFsdWUgY2hhbmdlcyBkeW5hbWljYWxseSwgcG9zc2libHkgaW4gYSBjb250ZXh0IHNlbnNpdGl2ZSB3YXkuCi1QcmVkZWZpbmVkIHN5bWJvbHMgd2l0aCBmaXhlZCB2YWx1ZXMsIHN1Y2ggYXMgcmVnaXN0ZXIgbmFtZXMgb3IgY29uZGl0aW9uCi1jb2RlcywgYXJlIHR5cGljYWxseSBlbnRlcmVkIGRpcmVjdGx5IGludG8gdGhlIHN5bWJvbCB0YWJsZSB3aGVuIEBjb2Rle21kX2JlZ2lufQotaXMgY2FsbGVkLgotCi1AaXRlbSBtZF9vcGVyYW5kCi1AY2luZGV4IG1kX29wZXJhbmQKLUdBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgYW55IGV4cHJlc3Npb24gdGhhdCBjYW4gbm90IGJlIHJlY29nbml6ZWQuCi1XaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQsIEBjb2Rle2lucHV0X2xpbmVfcG9pbnRlcn0gd2lsbCBwb2ludCB0byB0aGUgc3RhcnQKLW9mIHRoZSBleHByZXNzaW9uLgotCi1AaXRlbSB0Y191bnJlY29nbml6ZWRfbGluZQotQGNpbmRleCB0Y191bnJlY29nbml6ZWRfbGluZQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IHdoZW4gaXQgZmluZHMgYSBsaW5lIHRoYXQgaXQgY2FuIG5vdAotcGFyc2UuCi0KLUBpdGVtIG1kX2RvX2FsaWduCi1AY2luZGV4IG1kX2RvX2FsaWduCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGhhbmRsZSBhbiBhbGlnbm1lbnQgZGlyZWN0aXZlLiAgR0FTIHdpbGwgY2FsbCBpdAotd2hlbiB0aGUgZGlyZWN0aXZlIGlzIHNlZW4gaW4gdGhlIGlucHV0IGZpbGUuICBGb3IgZXhhbXBsZSwgdGhlIGkzODYgYmFja2VuZAotdXNlcyB0aGlzIHRvIGdlbmVyYXRlIGVmZmljaWVudCBub3AgaW5zdHJ1Y3Rpb25zIG9mIHZhcnlpbmcgbGVuZ3RocywgZGVwZW5kaW5nCi11cG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB0aGUgYWxpZ25tZW50IHdpbGwgc2tpcC4KLQotQGl0ZW0gSEFORExFX0FMSUdOCi1AY2luZGV4IEhBTkRMRV9BTElHTgotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBkbyBzcGVjaWFsIGhhbmRsaW5nIGZvciBhbiBhbGlnbm1lbnQgZGlyZWN0aXZlLgotR0FTIHdpbGwgY2FsbCBpdCBhdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseS4KLQotQGl0ZW0gbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLUBjaW5kZXggbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBlYWNoIHRpbWUgaXQgc2tpcHMgYW55IHNwYWNlIGJlY2F1c2Ugb2YgYQotc3BhY2UgZmlsbGluZyBvciBhbGlnbm1lbnQgb3IgZGF0YSBhbGxvY2F0aW9uIHBzZXVkby1vcC4KLQotQGl0ZW0gVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OCi1AY2luZGV4IFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTgotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBwYXJzZSBhbiBleHByZXNzaW9uIHVzZWQgaW4gYSBkYXRhIGFsbG9jYXRpb24KLXBzZXVkby1vcCBzdWNoIGFzIEBjb2Rley53b3JkfS4gIFlvdSBjYW4gdXNlIHRoaXMgdG8gcmVjb2duaXplIHJlbG9jYXRpb24KLWRpcmVjdGl2ZXMgdGhhdCBtYXkgYXBwZWFyIGluIHN1Y2ggZGlyZWN0aXZlcy4KLQotQGl0ZW0gQklURklFTERfQ09OU19FWFBSRVNTSU9OCi1AY2luZGV4IEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTgotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCByZWNvZ25pemUgYml0ZmllbGQgaW5zdHJ1Y3Rpb25zIGluIGRhdGEKLWFsbG9jYXRpb24gcHNldWRvLW9wcywgYXMgdXNlZCBvbiB0aGUgaTk2MC4KLQotQGl0ZW0gUkVQRUFUX0NPTlNfRVhQUkVTU0lPTgotQGNpbmRleCBSRVBFQVRfQ09OU19FWFBSRVNTSU9OCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHJlY29nbml6ZSByZXBlYXQgY291bnRzIGluIGRhdGEgYWxsb2NhdGlvbgotcHNldWRvLW9wcywgYXMgdXNlZCBvbiB0aGUgTUlQUy4KLQotQGl0ZW0gbWRfY29uc19hbGlnbgotQGNpbmRleCBtZF9jb25zX2FsaWduCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGRvIGFueSBzcGVjaWFsIGFsaWdubWVudCBiZWZvcmUgYSBkYXRhIGFsbG9jYXRpb24KLXBzZXVkby1vcC4KLQotQGl0ZW0gVENfQ09OU19GSVhfTkVXCi1AY2luZGV4IFRDX0NPTlNfRklYX05FVwotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciBhIGRhdGEgYWxsb2NhdGlvbiBwc2V1ZG8tb3AuCi0KLUBpdGVtIFRDX0lOSVRfRklYX0RBVEEgKEB2YXJ7Zml4cH0pCi1AY2luZGV4IFRDX0lOSVRfRklYX0RBVEEKLUEgQyBzdGF0ZW1lbnQgdG8gaW5pdGlhbGl6ZSB0aGUgdGFyZ2V0IHNwZWNpZmljIGZpZWxkcyBvZiBmaXh1cCBAdmFye2ZpeHB9LgotVGhlc2UgZmllbGRzIGFyZSBkZWZpbmVkIHdpdGggdGhlIEBjb2Rle1RDX0ZJWF9UWVBFfSBtYWNyby4KLQotQGl0ZW0gVENfRklYX0RBVEFfUFJJTlQgKEB2YXJ7c3RyZWFtfSwgQHZhcntmaXhwfSkKLUBjaW5kZXggVENfRklYX0RBVEFfUFJJTlQKLUEgQyBzdGF0ZW1lbnQgdG8gb3V0cHV0IHRhcmdldCBzcGVjaWZpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yCi1maXh1cCBAdmFye2ZpeHB9IHRvIEB2YXJ7c3RyZWFtfS4gIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGJ5IEBjb2Rle3ByaW50X2ZpeHVwfS4KLQotQGl0ZW0gVENfRlJBR19JTklUIChAdmFye2ZyYWdwfSkKLUBjaW5kZXggVENfRlJBR19JTklUCi1BIEMgc3RhdGVtZW50IHRvIGluaXRpYWxpemUgdGhlIHRhcmdldCBzcGVjaWZpYyBmaWVsZHMgb2YgZnJhZyBAdmFye2ZyYWdwfS4KLVRoZXNlIGZpZWxkcyBhcmUgZGVmaW5lZCB3aXRoIHRoZSBAY29kZXtUQ19GUkFHX1RZUEV9IG1hY3JvLgotCi1AaXRlbSBtZF9udW1iZXJfdG9fY2hhcnMKLUBjaW5kZXggbWRfbnVtYmVyX3RvX2NoYXJzCi1UaGlzIHNob3VsZCBqdXN0IGNhbGwgZWl0aGVyIEBjb2Rle251bWJlcl90b19jaGFyc19iaWdlbmRpYW59IG9yCi1AY29kZXtudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFufSwgd2hpY2hldmVyIGlzIGFwcHJvcHJpYXRlLiAgT24gdGFyZ2V0cyBsaWtlCi10aGUgTUlQUyB3aGljaCBzdXBwb3J0IG9wdGlvbnMgdG8gY2hhbmdlIHRoZSBlbmRpYW5uZXNzLCB3aGljaCBmdW5jdGlvbiB0byBjYWxsCi1pcyBhIHJ1bnRpbWUgZGVjaXNpb24uICBPbiBvdGhlciB0YXJnZXRzLCBAY29kZXttZF9udW1iZXJfdG9fY2hhcnN9IGNhbiBiZSBhCi1zaW1wbGUgbWFjcm8uCi0KLUBpdGVtIG1kX3JlbG9jX3NpemUKLUBjaW5kZXggbWRfcmVsb2Nfc2l6ZQotVGhpcyB2YXJpYWJsZSBpcyBvbmx5IHVzZWQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgZ2FzIChub3QKLUBjb2Rle0JGRF9BU1NFTUJMRVJ9IGFuZCBub3QgQGNvZGV7TUFOWV9TRUdNRU5UU30pLiAgSXQgaG9sZHMgdGhlIHNpemUgb2YgYQotcmVsb2NhdGlvbiBlbnRyeS4KLQotQGl0ZW0gV09SS0lOR19ET1RfV09SRAotQGl0ZW14IG1kX3Nob3J0X2p1bXBfc2l6ZQotQGl0ZW14IG1kX2xvbmdfanVtcF9zaXplCi1AaXRlbXggbWRfY3JlYXRlX3Nob3J0X2p1bXAKLUBpdGVteCBtZF9jcmVhdGVfbG9uZ19qdW1wCi1AY2luZGV4IFdPUktJTkdfRE9UX1dPUkQKLUBjaW5kZXggbWRfc2hvcnRfanVtcF9zaXplCi1AY2luZGV4IG1kX2xvbmdfanVtcF9zaXplCi1AY2luZGV4IG1kX2NyZWF0ZV9zaG9ydF9qdW1wCi1AY2luZGV4IG1kX2NyZWF0ZV9sb25nX2p1bXAKLUlmIEBjb2Rle1dPUktJTkdfRE9UX1dPUkR9IGlzIGRlZmluZWQsIEdBUyB3aWxsIG5vdCBkbyBicm9rZW4gd29yZCBwcm9jZXNzaW5nCi0oQHB4cmVme0Jyb2tlbiB3b3Jkc30pLiAgT3RoZXJ3aXNlLCB5b3Ugc2hvdWxkIHNldCBAY29kZXttZF9zaG9ydF9qdW1wX3NpemV9IHRvCi10aGUgc2l6ZSBvZiBhIHNob3J0IGp1bXAgKGEganVtcCB0aGF0IGlzIGp1c3QgbG9uZyBlbm91Z2ggdG8ganVtcCBhcm91bmQgYSBsb25nCi1qbXApIGFuZCBAY29kZXttZF9sb25nX2p1bXBfc2l6ZX0gdG8gdGhlIHNpemUgb2YgYSBsb25nIGp1bXAgKGEganVtcCB0aGF0IGNhbgotZ28gYW55d2hlcmUgaW4gdGhlIGZ1bmN0aW9uKSwgWW91IHNob3VsZCBkZWZpbmUgQGNvZGV7bWRfY3JlYXRlX3Nob3J0X2p1bXB9IHRvCi1jcmVhdGUgYSBzaG9ydCBqdW1wIGFyb3VuZCBhIGxvbmcganVtcCwgYW5kIGRlZmluZSBAY29kZXttZF9jcmVhdGVfbG9uZ19qdW1wfQotdG8gY3JlYXRlIGEgbG9uZyBqdW1wLgotCi1AaXRlbSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheAotQGNpbmRleCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheAotVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBzaXplIG9mIGEgQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9Ci1mcmFnIGJlZm9yZSBhbnkgcmVsYXhpbmcgaXMgZG9uZS4gIEl0IG1heSBhbHNvIGNyZWF0ZSBhbnkgbmVjZXNzYXJ5Ci1yZWxvY2F0aW9ucy4KLQotQGl0ZW0gbWRfcmVsYXhfZnJhZwotQGNpbmRleCBtZF9yZWxheF9mcmFnCi1UaGlzIG1hY3JvIG1heSBiZSBkZWZpbmVkIHRvIHJlbGF4IGEgZnJhZy4gIEdBUyB3aWxsIGNhbGwgdGhpcyB3aXRoIHRoZSBmcmFnCi1hbmQgdGhlIGNoYW5nZSBpbiBzaXplIG9mIGFsbCBwcmV2aW91cyBmcmFnczsgQGNvZGV7bWRfcmVsYXhfZnJhZ30gc2hvdWxkCi1yZXR1cm4gdGhlIGNoYW5nZSBpbiBzaXplIG9mIHRoZSBmcmFnLiAgQHhyZWZ7UmVsYXhhdGlvbn0uCi0KLUBpdGVtIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUKLUBjaW5kZXggVENfR0VORVJJQ19SRUxBWF9UQUJMRQotSWYgeW91IGRvIG5vdCBkZWZpbmUgQGNvZGV7bWRfcmVsYXhfZnJhZ30sIHlvdSBtYXkgZGVmaW5lCi1AY29kZXtUQ19HRU5FUklDX1JFTEFYX1RBQkxFfSBhcyBhIHRhYmxlIG9mIEBjb2Rle3JlbGF4X3R5cGVTfSBzdHJ1Y3R1cmVzLiAgVGhlCi1tYWNoaW5lIGluZGVwZW5kZW50IGNvZGUga25vd3MgaG93IHRvIHVzZSBzdWNoIGEgdGFibGUgdG8gcmVsYXggUEMgcmVsYXRpdmUKLXJlZmVyZW5jZXMuICBTZWUgQGZpbGV7dGMtbTY4ay5jfSBmb3IgYW4gZXhhbXBsZS4gIEB4cmVme1JlbGF4YXRpb259LgotCi1AaXRlbSBtZF9wcmVwYXJlX3JlbGF4X3NjYW4KLUBjaW5kZXggbWRfcHJlcGFyZV9yZWxheF9zY2FuCi1JZiBkZWZpbmVkLCBpdCBpcyBhIEMgc3RhdGVtZW50IHRoYXQgaXMgaW52b2tlZCBwcmlvciB0byBzY2FubmluZwotdGhlIHJlbGF4IHRhYmxlLgotCi1AaXRlbSBMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZCi1AY2luZGV4IExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgYW5kIHRoZSBnbG9iYWwgdmFyaWFibGUgQHNhbXB7bGlua3JlbGF4fSBpcyBzZXQKLShiZWNhdXNlIG9mIGEgY29tbWFuZCBsaW5lIG9wdGlvbiwgb3IgdW5jb25kaXRpb25hbGx5IGluIEBjb2Rle21kX2JlZ2lufSksIGEKLUBzYW1wey5hbGlnbn0gZGlyZWN0aXZlIHdpbGwgY2F1c2UgZXh0cmEgc3BhY2UgdG8gYmUgYWxsb2NhdGVkLiAgVGhlIGxpbmtlciBjYW4KLXRoZW4gZGlzY2FyZCB0aGlzIHNwYWNlIHdoZW4gcmVsYXhpbmcgdGhlIHNlY3Rpb24uCi0KLUBpdGVtIG1kX2NvbnZlcnRfZnJhZwotQGNpbmRleCBtZF9jb252ZXJ0X2ZyYWcKLUdBUyB3aWxsIGNhbGwgdGhpcyBmb3IgZWFjaCByc19tYWNoaW5lX2RlcGVuZGVudCBmcmFnbWVudC4KLVRoZSBpbnN0cnVjdGlvbiBpcyBjb21wbGV0ZWQgdXNpbmcgdGhlIGRhdGEgZnJvbSB0aGUgcmVsYXhhdGlvbiBwYXNzLgotSXQgbWF5IGFsc28gY3JlYXRlIGFueSBuZWNlc3NhcnkgcmVsb2NhdGlvbnMuCi1AeHJlZntSZWxheGF0aW9ufS4KLQotQGl0ZW0gbWRfYXBwbHlfZml4Ci1AY2luZGV4IG1kX2FwcGx5X2ZpeAotR0FTIHdpbGwgY2FsbCB0aGlzIGZvciBlYWNoIGZpeHVwLiAgSXQgc2hvdWxkIHN0b3JlIHRoZSBjb3JyZWN0IHZhbHVlIGluIHRoZQotb2JqZWN0IGZpbGUuICBAY29kZXtmaXh1cF9zZWdtZW50fSBwZXJmb3JtcyBhIGdlbmVyaWMgb3ZlcmZsb3cgY2hlY2sgb24gdGhlCi1AY29kZXt2YWx1ZVQgKnZhbH0gYXJndW1lbnQgYWZ0ZXIgQGNvZGV7bWRfYXBwbHlfZml4fSByZXR1cm5zLiAgSWYgdGhlIG92ZXJmbG93Ci1jaGVjayBpcyByZWxldmFudCBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLCB0aGVuIEBjb2Rle21kX2FwcGx5X2ZpeH0gc2hvdWxkCi1tb2RpZnkgQGNvZGV7dmFsdWVUICp2YWx9LCB0eXBpY2FsbHkgdG8gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgb2JqZWN0IGZpbGUuCi0KLUBpdGVtIFRDX0hBTkRMRVNfRlhfRE9ORQotQGNpbmRleCBUQ19IQU5ETEVTX0ZYX0RPTkUKLUlmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgaXQgbWVhbnMgdGhhdCBAY29kZXttZF9hcHBseV9maXh9IGNvcnJlY3RseSBzZXRzIHRoZQotQGNvZGV7ZnhfZG9uZX0gZmllbGQgaW4gdGhlIGZpeHVwLgotCi1AaXRlbSB0Y19nZW5fcmVsb2MKLUBjaW5kZXggdGNfZ2VuX3JlbG9jCi1BIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IEdBUyB3aWxsIGNhbGwgdGhpcyB0byBnZW5lcmF0ZSBhIHJlbG9jLiAgR0FTIHdpbGwgcGFzcwotdGhlIHJlc3VsdGluZyByZWxvYyB0byBAY29kZXtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufS4gIFRoaXMgY3VycmVudGx5IHdvcmtzCi1wb29ybHksIGFzIEBjb2Rle2JmZF9pbnN0YWxsX3JlbG9jYXRpb259IG9mdGVuIGRvZXMgdGhlIHdyb25nIHRoaW5nLCBhbmQKLWluc3RhbmNlcyBvZiBAY29kZXt0Y19nZW5fcmVsb2N9IGhhdmUgYmVlbiB3cml0dGVuIHRvIHdvcmsgYXJvdW5kIHRoZSBwcm9ibGVtcywKLXdoaWNoIGluIHR1cm5zIG1ha2VzIGl0IGRpZmZpY3VsdCB0byBmaXggQGNvZGV7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0uCi0KLUBpdGVtIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotQGNpbmRleCBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgaXQgbWVhbnMgdGhhdCBAY29kZXt0Y19nZW5fcmVsb2N9IG1heSByZXR1cm4gbXVsdGlwbGUKLXJlbG9jYXRpb24gZW50cmllcyBmb3IgYSBzaW5nbGUgZml4dXAuICBJbiB0aGlzIGNhc2UsIHRoZSByZXR1cm4gdmFsdWUgb2YKLUBjb2Rle3RjX2dlbl9yZWxvY30gaXMgYSBwb2ludGVyIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIGFycmF5LgotCi1AaXRlbSBNQVhfUkVMT0NfRVhQQU5TSU9OCi1AY2luZGV4IE1BWF9SRUxPQ19FWFBBTlNJT04KLVlvdSBtdXN0IGRlZmluZSB0aGlzIGlmIEBjb2Rle1JFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRX0gaXMgZGVmaW5lZDsgaXQKLWluZGljYXRlcyB0aGUgbGFyZ2VzdCBudW1iZXIgb2YgcmVsb2NzIHdoaWNoIEBjb2Rle3RjX2dlbl9yZWxvY30gbWF5IHJldHVybiBmb3IKLWEgc2luZ2xlIGZpeHVwLgotCi1AaXRlbSB0Y19maXhfYWRqdXN0YWJsZQotQGNpbmRleCB0Y19maXhfYWRqdXN0YWJsZQotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgZml4dXAgYWdhaW5zdCBhIGxvY2FsbHkgZGVmaW5lZAotc3ltYm9sIHNob3VsZCBiZSBhZGp1c3RlZCB0byBiZSBhZ2FpbnN0IHRoZSBzZWN0aW9uIHN5bWJvbC4gIEl0IHNob3VsZCByZXR1cm4gYQotbm9uLXplcm8gdmFsdWUgaWYgdGhlIGFkanVzdG1lbnQgaXMgYWNjZXB0YWJsZS4KLQotQGl0ZW0gTURfUENSRUxfRlJPTV9TRUNUSU9OCi1AY2luZGV4IE1EX1BDUkVMX0ZST01fU0VDVElPTgotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBpdCBzaG91bGQgcmV0dXJuIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiBhCi1QQyByZWxhdGl2ZSBmaXh1cCBhbmQgdGhlIHBvc2l0aW9uIGZyb20gd2hpY2ggdGhlIFBDIHJlbGF0aXZlIGFkanVzdG1lbnQgc2hvdWxkCi1iZSBtYWRlLiAgT24gbWFueSBwcm9jZXNzb3JzLCB0aGUgYmFzZSBvZiBhIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIGlzIHRoZSBuZXh0Ci1pbnN0cnVjdGlvbiwgc28gdGhpcyBtYWNybyB3b3VsZCByZXR1cm4gdGhlIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbi4KLQotQGl0ZW0gbWRfcGNyZWxfZnJvbQotQGNpbmRleCBtZF9wY3JlbF9mcm9tCi1UaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIEBjb2Rle01EX1BDUkVMX0ZST01fU0VDVElPTn0uICBUaGUgZGlmZmVyZW5jZSBpcwotdGhhdCBAY29kZXttZF9wY3JlbF9mcm9tfSBkb2VzIG5vdCB0YWtlIGEgc2VjdGlvbiBhcmd1bWVudC4KLQotQGl0ZW0gdGNfZnJvYl9sYWJlbAotQGNpbmRleCB0Y19mcm9iX2xhYmVsCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgZWFjaCB0aW1lIGEgbGFiZWwgaXMgZGVmaW5lZC4KLQotQGl0ZW0gbWRfc2VjdGlvbl9hbGlnbgotQGNpbmRleCBtZF9zZWN0aW9uX2FsaWduCi1HQVMgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGVhY2ggc2VjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseSwgdG8KLXBlcm1pdCB0aGUgQ1BVIGJhY2tlbmQgdG8gYWRqdXN0IHRoZSBhbGlnbm1lbnQgb2YgYSBzZWN0aW9uLgotCi1AaXRlbSB0Y19mcm9iX3NlY3Rpb24KLUBjaW5kZXggdGNfZnJvYl9zZWN0aW9uCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGEgQGNvZGV7QkZEX0FTU0VNQkxFUn0gR0FTIHdpbGwgY2FsbCBpdCBmb3IgZWFjaAotc2VjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseS4KLQotQGl0ZW0gdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKLUBjaW5kZXggdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhZnRlciB0aGUgc3ltYm9sIHZhbHVlcyBhcmUKLXJlc29sdmVkLCBidXQgYmVmb3JlIHRoZSBmaXh1cHMgaGF2ZSBiZWVuIGNoYW5nZWQgZnJvbSBsb2NhbCBzeW1ib2xzIHRvIHNlY3Rpb24KLXN5bWJvbHMuCi0KLUBpdGVtIHRjX2Zyb2Jfc3ltYm9sCi1AY2luZGV4IHRjX2Zyb2Jfc3ltYm9sCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgZm9yIGVhY2ggc3ltYm9sLiAgWW91IGNhbiBpbmRpY2F0ZQotdGhhdCB0aGUgc3ltYm9sIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG9iamVjdCBmaWxlIGJ5IGRlZmluaW5pbmcgdGhpcwotbWFjcm8gdG8gc2V0IGl0cyBzZWNvbmQgYXJndW1lbnQgdG8gYSBub24temVybyB2YWx1ZS4KLQotQGl0ZW0gdGNfZnJvYl9maWxlCi1AY2luZGV4IHRjX2Zyb2JfZmlsZQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4KLWNvbXBsZXRlZCwgYnV0IGJlZm9yZSB0aGUgcmVsb2NhdGlvbnMgaGF2ZSBiZWVuIGdlbmVyYXRlZC4KLQotQGl0ZW0gdGNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSByZWxvY3MgaGF2ZSBiZWVuCi1nZW5lcmF0ZWQuCi0KLUBpdGVtIExJU1RJTkdfSEVBREVSCi1BIHN0cmluZyB0byB1c2Ugb24gdGhlIGhlYWRlciBsaW5lIG9mIGEgbGlzdGluZy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHNpbXBseQotQGNvZGV7IkdBUyBMSVNUSU5HIn0uCi0KLUBpdGVtIExJU1RJTkdfV09SRF9TSVpFCi1UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHB1dCBpbnRvIGEgd29yZCBpbiBhIGxpc3RpbmcuICBUaGlzIGFmZmVjdHMgdGhlIHdheSB0aGUKLWJ5dGVzIGFyZSBjbHVtcGVkIHRvZ2V0aGVyIGluIHRoZSBsaXN0aW5nLiAgRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgMiBtaWdodAotcHJpbnQgQHNhbXB7MTIzNCA1Njc4fSB3aGVyZSBhIHZhbHVlIG9mIDEgd291bGQgcHJpbnQgQHNhbXB7MTIgMzQgNTYgNzh9LiAgVGhlCi1kZWZhdWx0IHZhbHVlIGlzIDQuCi0KLUBpdGVtIExJU1RJTkdfTEhTX1dJRFRICi1UaGUgbnVtYmVyIG9mIHdvcmRzIG9mIGRhdGEgdG8gcHJpbnQgb24gdGhlIGZpcnN0IGxpbmUgb2YgYSBsaXN0aW5nIGZvciBhCi1wYXJ0aWN1bGFyIHNvdXJjZSBsaW5lLCB3aGVyZSBlYWNoIHdvcmQgaXMgQGNvZGV7TElTVElOR19XT1JEX1NJWkV9IGJ5dGVzLiAgVGhlCi1kZWZhdWx0IHZhbHVlIGlzIDEuCi0KLUBpdGVtIExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORAotTGlrZSBAY29kZXtMSVNUSU5HX0xIU19XSURUSH0sIGJ1dCBhcHBseWluZyB0byB0aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGxpbmUKLW9mIHRoZSBkYXRhIHByaW50ZWQgZm9yIGEgcGFydGljdWxhciBzb3VyY2UgbGluZS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuCi0KLUBpdGVtIExJU1RJTkdfTEhTX0NPTlRfTElORVMKLVRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250aW51YXRpb24gbGluZXMgdG8gcHJpbnQgaW4gYSBsaXN0aW5nIGZvciBhIHBhcnRpY3VsYXIKLXNvdXJjZSBsaW5lLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNC4KLQotQGl0ZW0gTElTVElOR19SSFNfV0lEVEgKLVRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHByaW50IGZyb20gb25lIGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgMTAwLgotQGVuZCB0YWJsZQotCi1Abm9kZSBPYmplY3QgZm9ybWF0IGJhY2tlbmQKLUBzdWJzZWN0aW9uIFdyaXRpbmcgYW4gb2JqZWN0IGZvcm1hdCBiYWNrZW5kCi1AY2luZGV4IG9iamVjdCBmb3JtYXQgYmFja2VuZAotQGNpbmRleCBAZmlsZXtvYmotQHZhcntmbXR9fQotCi1BcyB3aXRoIHRoZSBDUFUgYmFja2VuZCwgdGhlIG9iamVjdCBmb3JtYXQgYmFja2VuZCBtdXN0IGRlZmluZSBhIGZldyB0aGluZ3MsCi1hbmQgbWF5IGRlZmluZSBzb21lIG90aGVyIHRoaW5ncy4gIFRoZSBpbnRlcmZhY2UgdG8gdGhlIG9iamVjdCBmb3JtYXQgYmFja2VuZAotaXMgZ2VuZXJhbGx5IHNpbXBsZXI7IG1vc3Qgb2YgdGhlIHN1cHBvcnQgZm9yIGFuIG9iamVjdCBmaWxlIGZvcm1hdCBjb25zaXN0cyBvZgotZGVmaW5pbmcgYSBudW1iZXIgb2YgcHNldWRvLW9wcy4KLQotVGhlIG9iamVjdCBmb3JtYXQgQGZpbGV7Lmh9IGZpbGUgbXVzdCBpbmNsdWRlIEBmaWxle3RhcmctY3B1Lmh9LgotCi1UaGlzIHNlY3Rpb24gd2lsbCBvbmx5IGRlZmluZSB0aGUgQGNvZGV7QkZEX0FTU0VNQkxFUn0gdmVyc2lvbiBvZiBHQVMuICBJdCBpcwotaW1wb3NzaWJsZSB0byBzdXBwb3J0IGEgbmV3IG9iamVjdCBmaWxlIGZvcm1hdCB1c2luZyBhbnkgb3RoZXIgdmVyc2lvbiBhbnlob3csCi1hcyB0aGUgb3JpZ2luYWwgR0FTIHZlcnNpb24gb25seSBzdXBwb3J0cyBhLm91dCwgYW5kIHRoZSBAY29kZXtNQU5ZX1NFR01FTlRTfQotR0FTIHZlcnNpb24gb25seSBzdXBwb3J0cyBDT0ZGLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIE9CSl9AdmFye2Zvcm1hdH0KLUBjaW5kZXggT0JKX0B2YXJ7Zm9ybWF0fQotQnkgY29udmVudGlvbiwgeW91IHNob3VsZCBkZWZpbmUgdGhpcyBtYWNybyBpbiB0aGUgQGZpbGV7Lmh9IGZpbGUuICBGb3IKLWV4YW1wbGUsIEBmaWxle29iai1lbGYuaH0gZGVmaW5lcyBAY29kZXtPQkpfRUxGfS4gIFlvdSBtaWdodCBoYXZlIHRvIHVzZSB0aGlzCi1pZiBpdCBpcyBuZWNlc3NhcnkgdG8gYWRkIG9iamVjdCBmaWxlIGZvcm1hdCBzcGVjaWZpYyBjb2RlIHRvIHRoZSBDUFUgZmlsZS4KLQotQGl0ZW0gb2JqX2JlZ2luCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBhc3NlbWJseSwgYWZ0ZXIKLXRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQgYW5kIGFsbCB0aGUgbWFjaGluZSBpbmRlcGVuZGVudAotaW5pdGlhbGl6YXRpb25zIGhhdmUgYmVlbiBjb21wbGV0ZWQuCi0KLUBpdGVtIG9ial9hcHBfZmlsZQotQGNpbmRleCBvYmpfYXBwX2ZpbGUKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgaW52b2tlIGl0IHdoZW4gaXQgc2VlcyBhIEBjb2Rley5maWxlfQotcHNldWRvLW9wIG9yIGEgQHNhbXB7I30gbGluZSBhcyB1c2VkIGJ5IHRoZSBDIHByZXByb2Nlc3Nvci4KLQotQGl0ZW0gT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMKLUBjaW5kZXggT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMKLVlvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gdG8gY29weSBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20KLW9uZSBzeW1ib2wgdG8gYW5vdGhlci4gIEdBUyB3aWxsIGNhbGwgaXQgd2hlbiBvbmUgc3ltYm9sIGlzIGVxdWF0ZWQgdG8KLWFub3RoZXIuCi0KLUBpdGVtIG9ial9maXhfYWRqdXN0YWJsZQotQGNpbmRleCBvYmpfZml4X2FkanVzdGFibGUKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaW5kaWNhdGUgd2hldGhlciBhIGZpeHVwIGFnYWluc3QgYSBsb2NhbGx5IGRlZmluZWQKLXN5bWJvbCBzaG91bGQgYmUgYWRqdXN0ZWQgdG8gYmUgYWdhaW5zdCB0aGUgc2VjdGlvbiBzeW1ib2wuICBJdCBzaG91bGQgcmV0dXJuIGEKLW5vbi16ZXJvIHZhbHVlIGlmIHRoZSBhZGp1c3RtZW50IGlzIGFjY2VwdGFibGUuCi0KLUBpdGVtIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYwotQGNpbmRleCBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBPSyB0byB1c2UgYSBzZWN0aW9uIHN5bWJvbCBpbgotYSByZWxvY2F0ZWlvbiBlbnRyeS4gIElmIGl0IGlzIG5vdCwgR0FTIHdpbGwgZGVmaW5lIGEgbmV3IHN5bWJvbCBhdCB0aGUgc3RhcnQKLW9mIGEgc2VjdGlvbi4KLQotQGl0ZW0gRU1JVF9TRUNUSU9OX1NZTUJPTFMKLUBjaW5kZXggRU1JVF9TRUNUSU9OX1NZTUJPTFMKLVlvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gd2l0aCBhIHplcm8gdmFsdWUgaWYgeW91IGRvIG5vdCB3YW50IHRvIGluY2x1ZGUKLXNlY3Rpb24gc3ltYm9scyBpbiB0aGUgb3V0cHV0IHN5bWJvbCB0YWJsZS4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIG1hY3JvCi1pcyBvbmUuCi0KLUBpdGVtIG9ial9hZGp1c3Rfc3ltdGFiCi1AY2luZGV4IG9ial9hZGp1c3Rfc3ltdGFiCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGludm9rZSBpdCBqdXN0IGJlZm9yZSBzZXR0aW5nIHRoZSBzeW1ib2wKLXRhYmxlIG9mIHRoZSBvdXRwdXQgQkZELiAgRm9yIGV4YW1wbGUsIHRoZSBDT0ZGIHN1cHBvcnQgdXNlcyB0aGlzIG1hY3JvIHRvCi1nZW5lcmF0ZSBhIEBjb2Rley5maWxlfSBzeW1ib2wgaWYgbm9uZSB3YXMgZ2VuZXJhdGVkIHByZXZpb3VzbHkuCi0KLUBpdGVtIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMKLUBjaW5kZXggU0VQQVJBVEVfU1RBQl9TRUNUSU9OUwotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB0aGF0IHN0YWJzIHNob3VsZCBiZSBwbGFjZWQgaW4gc2VwYXJhdGUKLXNlY3Rpb25zLCBhcyBpbiBFTEYuCi0KLUBpdGVtIElOSVRfU1RBQl9TRUNUSU9OCi1AY2luZGV4IElOSVRfU1RBQl9TRUNUSU9OCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGluaXRpYWxpemUgdGhlIHN0YWJzIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLgotCi1AaXRlbSBPQkpfUFJPQ0VTU19TVEFCCi1AY2luZGV4IE9CSl9QUk9DRVNTX1NUQUIKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gZG8gc3BlY2lmaWMgcHJvY2Vzc2luZyBvbiBhIHN0YWJzIGVudHJ5LgotCi1AaXRlbSBvYmpfZnJvYl9zZWN0aW9uCi1AY2luZGV4IG9ial9mcm9iX3NlY3Rpb24KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBmb3IgZWFjaCBzZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlCi1hc3NlbWJseS4KLQotQGl0ZW0gb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0Ci1AY2luZGV4IG9ial9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSBzeW1ib2wgdmFsdWVzIGFyZQotcmVzb2x2ZWQsIGJ1dCBiZWZvcmUgdGhlIGZpeHVwcyBoYXZlIGJlZW4gY2hhbmdlZCBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gc2VjdGlvbgotc3ltYm9scy4KLQotQGl0ZW0gb2JqX2Zyb2Jfc3ltYm9sCi1AY2luZGV4IG9ial9mcm9iX3N5bWJvbAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGZvciBlYWNoIHN5bWJvbC4gIFlvdSBjYW4gaW5kaWNhdGUKLXRoYXQgdGhlIHN5bWJvbCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBvYmplY3QgZmlsZSBieSBkZWZpbmluaW5nIHRoaXMKLW1hY3JvIHRvIHNldCBpdHMgc2Vjb25kIGFyZ3VtZW50IHRvIGEgbm9uLXplcm8gdmFsdWUuCi0KLUBpdGVtIG9ial9mcm9iX2ZpbGUKLUBjaW5kZXggb2JqX2Zyb2JfZmlsZQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4KLWNvbXBsZXRlZCwgYnV0IGJlZm9yZSB0aGUgcmVsb2NhdGlvbnMgaGF2ZSBiZWVuIGdlbmVyYXRlZC4KLQotQGl0ZW0gb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhZnRlciB0aGUgcmVsb2NzIGhhdmUgYmVlbgotZ2VuZXJhdGVkLgotCi1AaXRlbSBTRVRfU0VDVElPTl9SRUxPQ1MgKEB2YXJ7c2VjfSwgQHZhcntyZWxvY3N9LCBAdmFye259KQotQGNpbmRleCBTRVRfU0VDVElPTl9SRUxPQ1MKLUlmIHlvdSBkZWZpbmUgdGhpcywgaXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHJlbG9jYXRpb25zIGhhdmUgYmVlbiBzZXQgZm9yCi10aGUgc2VjdGlvbiBAdmFye3NlY30uICBUaGUgbGlzdCBvZiByZWxvY2F0aW9ucyBpcyBpbiBAdmFye3JlbG9jc30sIGFuZCB0aGUKLW51bWJlciBvZiByZWxvY2F0aW9ucyBpcyBpbiBAdmFye259LiAgVGhpcyBpcyBvbmx5IHVzZWQgd2l0aAotQGNvZGV7QkZEX0FTU0VNQkxFUn0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEVtdWxhdGlvbnMKLUBzdWJzZWN0aW9uIFdyaXRpbmcgZW11bGF0aW9uIGZpbGVzCi0KLU5vcm1hbGx5IHlvdSBkbyBub3QgaGF2ZSB0byB3cml0ZSBhbiBlbXVsYXRpb24gZmlsZS4gIFlvdSBjYW4ganVzdCB1c2UKLUBmaWxle3RlLWdlbmVyaWMuaH0uCi0KLUlmIHlvdSBkbyB3cml0ZSB5b3VyIG93biBlbXVsYXRpb24gZmlsZSwgaXQgbXVzdCBpbmNsdWRlIEBmaWxle29iai1mb3JtYXQuaH0uCi0KLUFuIGVtdWxhdGlvbiBmaWxlIHdpbGwgb2Z0ZW4gZGVmaW5lIEBjb2Rle1RFX0B2YXJ7RU19fTsgdGhpcyBtYXkgdGhlbiBiZSB1c2VkCi1pbiBvdGhlciBmaWxlcyB0byBjaGFuZ2UgdGhlIG91dHB1dC4KLQotQG5vZGUgUmVsYXhhdGlvbgotQHNlY3Rpb24gUmVsYXhhdGlvbgotQGNpbmRleCByZWxheGF0aW9uCi0KLUBkZm57UmVsYXhhdGlvbn0gaXMgYSBnZW5lcmljIHRlcm0gdXNlZCB3aGVuIHRoZSBzaXplIG9mIHNvbWUgaW5zdHJ1Y3Rpb24gb3IKLWRhdGEgZGVwZW5kcyB1cG9uIHRoZSB2YWx1ZSBvZiBzb21lIHN5bWJvbCBvciBvdGhlciBkYXRhLgotCi1HQVMga25vd3MgdG8gcmVsYXggYSBwYXJ0aWN1bGFyIHR5cGUgb2YgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiB1c2luZyBhIHRhYmxlLgotWW91IGNhbiBhbHNvIGRlZmluZSBhcmJpdHJhcmlseSBjb21wbGV4IGZvcm1zIG9mIHJlbGF4YXRpb24geW91cnNlbGYuCi0KLUBtZW51Ci0qIFJlbGF4aW5nIHdpdGggYSB0YWJsZTo6ICAgICAgIFJlbGF4aW5nIHdpdGggYSB0YWJsZQotKiBHZW5lcmFsIHJlbGF4aW5nOjogICAgICAgICAgICBHZW5lcmFsIHJlbGF4aW5nCi1AZW5kIG1lbnUKLQotQG5vZGUgUmVsYXhpbmcgd2l0aCBhIHRhYmxlCi1Ac3Vic2VjdGlvbiBSZWxheGluZyB3aXRoIGEgdGFibGUKLQotSWYgeW91IGRvIG5vdCBkZWZpbmUgQGNvZGV7bWRfcmVsYXhfZnJhZ30sIGFuZCB5b3UgZG8gZGVmaW5lCi1AY29kZXtUQ19HRU5FUklDX1JFTEFYX1RBQkxFfSwgR0FTIHdpbGwgcmVsYXggQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9IGZyYWdzCi1iYXNlZCBvbiB0aGUgZnJhZyBzdWJ0eXBlIGFuZCB0aGUgZGlzcGxhY2VtZW50IHRvIHNvbWUgc3BlY2lmaWVkIHRhcmdldAotYWRkcmVzcy4gIFRoZSBiYXNpYyBpZGVhIGlzIHRoYXQgc2V2ZXJhbCBtYWNoaW5lcyBoYXZlIGRpZmZlcmVudCBhZGRyZXNzaW5nCi1tb2RlcyBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIHNwZWNpZnkgZGlmZmVyZW50IHJhbmdlcyBvZiB2YWx1ZXMsIHdpdGgKLXN1Y2Nlc3NpdmUgbW9kZXMgYWJsZSB0byBhY2Nlc3Mgd2lkZXIgcmFuZ2VzLCBpbmNsdWRpbmcgdGhlIGVudGlyZXR5IG9mIHRoZQotcHJldmlvdXMgcmFuZ2UuICBTbWFsbGVyIHJhbmdlcyBhcmUgYXNzdW1lZCB0byBiZSBtb3JlIGRlc2lyYWJsZSAocGVyaGFwcyB0aGUKLWluc3RydWN0aW9uIHJlcXVpcmVzIG9uZSB3b3JkIGluc3RlYWQgb2YgdHdvIG9yIHRocmVlKTsgaWYgdGhpcyBpcyBub3QgdGhlCi1jYXNlLCBkb24ndCBkZXNjcmliZSB0aGUgc21hbGxlci1yYW5nZSwgaW5mZXJpb3IgbW9kZS4KLQotVGhlIEBjb2Rle2ZyX3N1YnR5cGV9IGZpZWxkIG9mIGEgZnJhZyBpcyBhbiBpbmRleCBpbnRvIGEgQ1BVLXNwZWNpZmljCi1yZWxheGF0aW9uIHRhYmxlLiAgVGhhdCB0YWJsZSBlbnRyeSBpbmRpY2F0ZXMgdGhlIHJhbmdlIG9mIHZhbHVlcyB0aGF0IGNhbiBiZQotc3RvcmVkLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2lsbCBoYXZlIHRvIGJlIGFkZGVkIHRvIHRoZSBmcmFnIHRvCi1hY2NvbW9kYXRlIHRoZSBhZGRyZXNzaW5nIG1vZGUsIGFuZCB0aGUgaW5kZXggb2YgdGhlIG5leHQgZW50cnkgdG8gZXhhbWluZSBpZgotdGhlIHZhbHVlIHRvIGJlIHN0b3JlZCBpcyBvdXRzaWRlIHRoZSByYW5nZSBhY2Nlc3NpYmxlIGJ5IHRoZSBjdXJyZW50Ci1hZGRyZXNzaW5nIG1vZGUuICBUaGUgQGNvZGV7ZnJfc3ltYm9sfSBmaWVsZCBvZiB0aGUgZnJhZyBpbmRpY2F0ZXMgd2hhdCBzeW1ib2wKLWlzIHRvIGJlIGFjY2Vzc2VkOyB0aGUgQGNvZGV7ZnJfb2Zmc2V0fSBmaWVsZCBpcyBhZGRlZCBpbi4KLQotSWYgdGhlIEBjb2Rle1RDX1BDUkVMX0FESlVTVH0gbWFjcm8gaXMgZGVmaW5lZCwgd2hpY2ggY3VycmVudGx5IHNob3VsZCBvbmx5IGhhcHBlbgotZm9yIHRoZSBOUzMyayBmYW1pbHksIHRoZSBAY29kZXtUQ19QQ1JFTF9BREpVU1R9IG1hY3JvIGlzIGNhbGxlZCBvbiB0aGUgZnJhZyB0bwotY29tcHV0ZSBhbiBhZGp1c3RtZW50IHRvIGJlIG1hZGUgdG8gdGhlIGRpc3BsYWNlbWVudC4KLQotVGhlIHZhbHVlIGZpdHRlZCBieSB0aGUgcmVsYXhhdGlvbiBjb2RlIGlzIGFsd2F5cyBhc3N1bWVkIHRvIGJlIGEgZGlzcGxhY2VtZW50Ci1mcm9tIHRoZSBjdXJyZW50IGZyYWcuICAoTW9yZSBzcGVjaWZpY2FsbHksIGZyb20gQGNvZGV7ZnJfZml4fSBieXRlcyBpbnRvIHRoZQotZnJhZy4pCi1AaWdub3JlCi1UaGlzIHNlZW1zIGtpbmRhIHNpbGx5LiAgV2hhdCBhYm91dCBmaXR0aW5nIHNtYWxsIGFic29sdXRlIHZhbHVlcz8gIEkgc3VwcG9zZQotQGNvZGV7bWRfYXNzZW1ibGV9IGlzIHN1cHBvc2VkIHRvIHRha2UgY2FyZSBvZiB0aGF0LCBidXQgaWYgdGhlIG9wZXJhbmQgaXMgYQotZGlmZmVyZW5jZSBiZXR3ZWVuIHN5bWJvbHMsIGl0IG1pZ2h0IG5vdCBiZSBhYmxlIHRvLCBpZiB0aGUgZGlmZmVyZW5jZSB3YXMgbm90Ci1jb21wdXRhYmxlIHlldC4KLUBlbmQgaWdub3JlCi0KLVRoZSBlbmQgb2YgdGhlIHJlbGF4YXRpb24gc2VxdWVuY2UgaXMgaW5kaWNhdGVkIGJ5IGEgYGBuZXh0JycgdmFsdWUgb2YgMC4gIFRoaXMKLW1lYW5zIHRoYXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YWJsZSBjYW4ndCBiZSB1c2VkLgotCi1Gb3Igc29tZSBjb25maWd1cmF0aW9ucywgdGhlIGxpbmtlciBjYW4gZG8gcmVsYXhpbmcgd2l0aGluIGEgc2VjdGlvbiBvZiBhbgotb2JqZWN0IGZpbGUuICBJZiBjYWxsIGluc3RydWN0aW9ucyBvZiB2YXJpb3VzIHNpemVzIGV4aXN0LCB0aGUgbGlua2VyIGNhbgotZGV0ZXJtaW5lIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIGVhY2ggaW5zdGFuY2UsIHdoZW4gYSBzeW1ib2wncyB2YWx1ZSBpcwotcmVzb2x2ZWQuICBJbiBvcmRlciBmb3IgdGhlIGxpbmtlciB0byBhdm9pZCB3YXN0aW5nIHNwYWNlIGFuZCBoYXZpbmcgdG8gaW5zZXJ0Ci1uby1vcCBpbnN0cnVjdGlvbnMsIGl0IG11c3QgYmUgYWJsZSB0byBleHBhbmQgb3Igc2hyaW5rIHRoZSBzZWN0aW9uIGNvbnRlbnRzCi13aGlsZSBzdGlsbCBwcmVzZXJ2aW5nIGludHJhLXNlY3Rpb24gcmVmZXJlbmNlcyBhbmQgbWVldGluZyBhbGlnbm1lbnQKLXJlcXVpcmVtZW50cy4KLQotRm9yIHRoZSBpOTYwIHVzaW5nIGIub3V0IGZvcm1hdCwgbm8gZXhwYW5zaW9uIGlzIGRvbmU7IGluc3RlYWQsIGVhY2gKLUBzYW1wey5hbGlnbn0gZGlyZWN0aXZlIGNhdXNlcyBleHRyYSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQsIGVub3VnaCB0aGF0IHdoZW4KLXRoZSBsaW5rZXIgaXMgcmVsYXhpbmcgYSBzZWN0aW9uIGFuZCByZW1vdmluZyB1bm5lZWRlZCBzcGFjZSwgaXQgY2FuIGRpc2NhcmQKLXNvbWUgb3IgYWxsIG9mIHRoaXMgZXh0cmEgcGFkZGluZyBhbmQgY2F1c2UgdGhlIGZvbGxvd2luZyBkYXRhIHRvIGJlIGNvcnJlY3RseQotYWxpZ25lZC4KLQotRm9yIHRoZSBIOC8zMDAsIEkgdGhpbmsgdGhlIGxpbmtlciBleHBhbmRzIGNhbGxzIHRoYXQgY2FuJ3QgcmVhY2gsIGFuZCBkb2Vzbid0Ci13b3JyeSBhYm91dCBhbGlnbm1lbnQgaXNzdWVzOyB0aGUgY3B1IHByb2JhYmx5IG5ldmVyIG5lZWRzIGFueSBzaWduaWZpY2FudAotYWxpZ25tZW50IGJleW9uZCB0aGUgaW5zdHJ1Y3Rpb24gc2l6ZS4KLQotVGhlIHJlbGF4YXRpb24gdGFibGUgdHlwZSBjb250YWlucyB0aGVzZSBmaWVsZHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gbG9uZyBybHhfZm9yd2FyZAotRm9yd2FyZCByZWFjaCwgbXVzdCBiZSBub24tbmVnYXRpdmUuCi1AaXRlbSBsb25nIHJseF9iYWNrd2FyZAotQmFja3dhcmQgcmVhY2gsIG11c3QgYmUgemVybyBvciBuZWdhdGl2ZS4KLUBpdGVtIHJseF9sZW5ndGgKLUxlbmd0aCBpbiBieXRlcyBvZiB0aGlzIGFkZHJlc3NpbmcgbW9kZS4KLUBpdGVtIHJseF9tb3JlCi1JbmRleCBvZiB0aGUgbmV4dC1sb25nZXIgcmVsYXggc3RhdGUsIG9yIHplcm8gaWYgdGhlcmUgaXMgbm8gbmV4dCByZWxheCBzdGF0ZS4KLUBlbmQgdGFibGUKLQotVGhlIHJlbGF4YXRpb24gaXMgZG9uZSBpbiBAY29kZXtyZWxheF9zZWdtZW50fSBpbiBAZmlsZXt3cml0ZS5jfS4gIFRoZQotZGlmZmVyZW5jZSBpbiB0aGUgbGVuZ3RoIGZpZWxkcyBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBtb2RlIGFuZCB0aGUgb25lIGZpbmFsbHkKLWNob3NlbiBieSB0aGUgcmVsYXhpbmcgY29kZSBpcyB0YWtlbiBhcyB0aGUgc2l6ZSBieSB3aGljaCB0aGUgY3VycmVudCBmcmFnIHdpbGwKLWJlIGluY3JlYXNlZCBpbiBzaXplLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBpbml0aWFsIHJlbGF4aW5nIG1vZGUgaGFzIGEgbGVuZ3RoCi1vZiAyIGJ5dGVzLCBhbmQgYmVjYXVzZSBvZiB0aGUgc2l6ZSBvZiB0aGUgZGlzcGxhY2VtZW50LCBpdCBnZXRzIHVwZ3JhZGVkIHRvIGEKLW1vZGUgd2l0aCBhIHNpemUgb2YgNiBieXRlcywgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFnIHdpbGwgZ3JvdyBieSA0IGJ5dGVzLgotKFRoZSBpbml0aWFsIHR3byBieXRlcyBzaG91bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIGZpeGVkIHBvcnRpb24gb2YgdGhlIGZyYWcsCi1zaW5jZSBpdCBpcyBhbHJlYWR5IGtub3duIHRoYXQgdGhleSB3aWxsIGJlIG91dHB1dC4pICBUaGlzIGdyb3d0aCBtdXN0IGJlCi1lZmZlY3RlZCBieSBAY29kZXttZF9jb252ZXJ0X2ZyYWd9OyBpdCBzaG91bGQgaW5jcmVhc2UgdGhlIEBjb2Rle2ZyX2ZpeH0gZmllbGQKLWJ5IHRoZSBhcHByb3ByaWF0ZSBzaXplLCBhbmQgZmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgb2YgdGhlIGZyYWcuCi0oRW5vdWdoIHNwYWNlIGZvciB0aGUgbWF4aW11bSBncm93dGggc2hvdWxkIGhhdmUgYmVlbiBhbGxvY2F0ZWQgaW4gdGhlIGNhbGwgdG8KLWZyYWdfdmFyIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuKQotCi1JZiByZWxvY2F0aW9uIHJlY29yZHMgYXJlIG5lZWRlZCwgdGhleSBzaG91bGQgYmUgZW1pdHRlZCBieQotQGNvZGV7bWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXh9LiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgZXhhbWluZSB0aGUgdGFyZ2V0Ci1zeW1ib2wgb2YgdGhlIHN1cHBsaWVkIGZyYWcgYW5kIGNvcnJlY3QgdGhlIEBjb2Rle2ZyX3N1YnR5cGV9IG9mIHRoZSBmcmFnIGlmCi1uZWVkZWQuICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBpZiB0aGUgc3ltYm9sIGhhcyBub3QgeWV0IGJlZW4gZGVmaW5lZCwKLWl0IHdpbGwgbm90IGJlY29tZSBkZWZpbmVkIGxhdGVyOyBob3dldmVyLCBpdHMgdmFsdWUgbWF5IHN0aWxsIGNoYW5nZSBpZiB0aGUKLXNlY3Rpb24gaXQgaXMgaW4gZ2V0cyByZWxheGVkLgotCi1Vc3VhbGx5LCBpZiB0aGUgc3ltYm9sIGlzIGluIHRoZSBzYW1lIHNlY3Rpb24gYXMgdGhlIGZyYWcgKGdpdmVuIGJ5IHRoZQotQHZhcntzZWN9IGFyZ3VtZW50KSwgdGhlIG5hcnJvd2VzdCBsaWtlbHkgcmVsYXhhdGlvbiBtb2RlIGlzIHN0b3JlZCBpbgotQGNvZGV7ZnJfc3VidHlwZX0sIGFuZCB0aGF0J3MgdGhhdC4KLQotSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIG9yIGluIGEgZGlmZmVyZW50IHNlY3Rpb24gKGFuZCB0aGVyZWZvcmUgbW92ZWFibGUKLXRvIGFuIGFyYml0cmFyaWx5IGxhcmdlIGRpc3RhbmNlKSwgdGhlIGxhcmdlc3QgYXZhaWxhYmxlIHJlbGF4YXRpb24gbW9kZSBpcwotc3BlY2lmaWVkLCBAY29kZXtmaXhfbmV3fSBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgcmVsb2NhdGlvbiByZWNvcmQsCi1AY29kZXtmcl9maXh9IGlzIGluY3JlYXNlZCB0byBpbmNsdWRlIHRoZSByZWxvY2F0ZWQgZmllbGQgKHJlbWVtYmVyLCB0aGlzCi1zdG9yYWdlIHdhcyBhbGxvY2F0ZWQgd2hlbiBAY29kZXtmcmFnX3Zhcn0gd2FzIGNhbGxlZCksIGFuZCBAY29kZXtmcmFnX3dhbmV9IGlzCi1jYWxsZWQgdG8gY29udmVydCB0aGUgZnJhZyB0byBhbiBAY29kZXtyc19maWxsfSBmcmFnIHdpdGggbm8gdmFyaWFudCBwYXJ0LgotU29tZXRpbWVzIGNoYW5naW5nIGFkZHJlc3NpbmcgbW9kZXMgbWF5IGFsc28gcmVxdWlyZSByZXdyaXRpbmcgdGhlIGluc3RydWN0aW9uLgotSXQgY2FuIGJlIGFjY2Vzc2VkIHZpYSBAY29kZXtmcl9vcGNvZGV9IG9yIEBjb2Rle2ZyX2ZpeH0uCi0KLVNvbWV0aW1lcyBAY29kZXtmcl92YXJ9IGlzIGluY3JlYXNlZCBpbnN0ZWFkLCBhbmQgQGNvZGV7ZnJhZ193YW5lfSBpcyBub3QKLWNhbGxlZC4gIEknbSBub3Qgc3VyZSwgYnV0IEkgdGhpbmsgdGhpcyBpcyB0byBrZWVwIEBjb2Rle2ZyX2ZpeH0gcmVmZXJyaW5nIHRvCi1hbiBlYXJsaWVyIGJ5dGUsIGFuZCBAY29kZXtmcl9zdWJ0eXBlfSBzZXQgdG8gQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9IHNvCi10aGF0IEBjb2Rle21kX2NvbnZlcnRfZnJhZ30gd2lsbCBnZXQgY2FsbGVkLgotCi1Abm9kZSBHZW5lcmFsIHJlbGF4aW5nCi1Ac3Vic2VjdGlvbiBHZW5lcmFsIHJlbGF4aW5nCi0KLUlmIHVzaW5nIGEgc2ltcGxlIHRhYmxlIGlzIG5vdCBzdWl0YWJsZSwgeW91IG1heSBpbXBsZW1lbnQgYXJiaXRyYXJpbHkgY29tcGxleAotcmVsYXhhdGlvbiBzZW1hbnRpY3MgeW91cnNlbGYuICBGb3IgZXhhbXBsZSwgdGhlIE1JUFMgYmFja2VuZCB1c2VzIHRoaXMgdG8gZW1pdAotZGlmZmVyZW50IGluc3RydWN0aW9uIHNlcXVlbmNlcyBkZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGJlaW5nCi1hY2Nlc3NlZC4KLQotV2hlbiB5b3UgYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBtYXkgbmVlZCByZWxheGF0aW9uLCB5b3Ugc2hvdWxkIGFsbG9jYXRlCi1hIGZyYWcgdXNpbmcgQGNvZGV7ZnJhZ192YXJ9IG9yIEBjb2Rle2ZyYWdfdmFyaWFudH0gd2l0aCBhIHR5cGUgb2YKLUBjb2Rle3JzX21hY2hpbmVfZGVwZW5kZW50fS4gIFlvdSBzaG91bGQgc3RvcmUgc29tZSBzb3J0IG9mIGluZm9ybWF0aW9uIGluIHRoZQotQGNvZGV7ZnJfc3VidHlwZX0gZmllbGQgc28gdGhhdCB5b3UgY2FuIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIHRoZSBmcmFnCi1sYXRlci4KLQotV2hlbiBHQVMgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLCBpdCB3aWxsIGxvb2sgdGhyb3VnaCB0aGUgZnJhZ3MgYW5kCi13b3JrIG91dCB0aGVpciBmaW5hbCBzaXplcy4KLQotR0FTIHdpbGwgZmlyc3QgY2FsbCBAY29kZXttZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheH0gb24gZWFjaAotQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9IGZyYWcuICBUaGlzIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGFuIGVzdGltYXRlZCBzaXplCi1mb3IgdGhlIGZyYWcuCi0KLUdBUyB3aWxsIHRoZW4gbG9vcCBvdmVyIHRoZSBmcmFncywgY2FsbGluZyBAY29kZXttZF9yZWxheF9mcmFnfSBvbiBlYWNoCi1AY29kZXtyc19tYWNoaW5lX2RlcGVuZGVudH0gZnJhZy4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgY2hhbmdlIGluCi1zaXplIG9mIHRoZSBmcmFnLiAgR0FTIHdpbGwga2VlcCBsb29waW5nIG92ZXIgdGhlIGZyYWdzIHVudGlsIG5vbmUgb2YgdGhlIGZyYWdzCi1jaGFuZ2VzIHNpemUuCi0KLUBub2RlIEJyb2tlbiB3b3JkcwotQHNlY3Rpb24gQnJva2VuIHdvcmRzCi1AY2luZGV4IGludGVybmFscywgYnJva2VuIHdvcmRzCi1AY2luZGV4IGJyb2tlbiB3b3JkcwotCi1Tb21lIGNvbXBpbGVycywgaW5jbHVkaW5nIEdDQywgd2lsbCBzb21ldGltZXMgZW1pdCBzd2l0Y2ggdGFibGVzIHNwZWNpZnlpbmcKLTE2LWJpdCBAY29kZXsud29yZH0gZGlzcGxhY2VtZW50cyB0byBicmFuY2ggdGFyZ2V0cywgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMKLXRoYXQgbG9hZCBlbnRyaWVzIGZyb20gdGhhdCB0YWJsZSB0byBjb21wdXRlIHRoZSB0YXJnZXQgYWRkcmVzcy4gIElmIHRoaXMgaXMKLWRvbmUgb24gYSAzMi1iaXQgbWFjaGluZSwgdGhlcmUgaXMgYSBjaGFuY2UgKGF0IGxlYXN0IHdpdGggcmVhbGx5IGxhcmdlCi1mdW5jdGlvbnMpIHRoYXQgdGhlIGRpc3BsYWNlbWVudCB3aWxsIG5vdCBmaXQgaW4gMTYgYml0cy4gIFRoZSBhc3NlbWJsZXIKLWhhbmRsZXMgdGhpcyB1c2luZyBhIGNvbmNlcHQgY2FsbGVkIEBkZm57YnJva2VuIHdvcmRzfS4gIFRoaXMgaWRlYSBpcyB3ZWxsCi1uYW1lZCwgc2luY2UgdGhlcmUgaXMgYW4gaW1wbGllZCBwcm9taXNlIHRoYXQgdGhlIDE2LWJpdCBmaWVsZCB3aWxsIGluIGZhY3QKLWhvbGQgdGhlIHNwZWNpZmllZCBkaXNwbGFjZW1lbnQuCi0KLUlmIGJyb2tlbiB3b3JkIHByb2Nlc3NpbmcgaXMgZW5hYmxlZCwgYW5kIGEgc2l0dWF0aW9uIGxpa2UgdGhpcyBpcyBlbmNvdW50ZXJlZCwKLXRoZSBhc3NlbWJsZXIgd2lsbCBpbnNlcnQgYSBqdW1wIGluc3RydWN0aW9uIGludG8gdGhlIGluc3RydWN0aW9uIHN0cmVhbSwgY2xvc2UKLWVub3VnaCB0byBiZSByZWFjaGVkIHdpdGggdGhlIDE2LWJpdCBkaXNwbGFjZW1lbnQuICBUaGlzIGp1bXAgaW5zdHJ1Y3Rpb24gd2lsbAotdHJhbnNmZXIgdG8gdGhlIHJlYWwgZGVzaXJlZCB0YXJnZXQgYWRkcmVzcy4gIFRodXMsIGFzIGxvbmcgYXMgdGhlIEBjb2Rley53b3JkfQotdmFsdWUgcmVhbGx5IGlzIHVzZWQgYXMgYSBkaXNwbGFjZW1lbnQgdG8gY29tcHV0ZSBhbiBhZGRyZXNzIHRvIGp1bXAgdG8sIHRoZQotbmV0IGVmZmVjdCB3aWxsIGJlIGNvcnJlY3QgKG1pbnVzIGEgdmVyeSBzbWFsbCBlZmZpY2llbmN5IGNvc3QpLiAgSWYKLUBjb2Rley53b3JkfSBkaXJlY3RpdmVzIHdpdGggbGFiZWwgZGlmZmVyZW5jZXMgZm9yIHZhbHVlcyBhcmUgdXNlZCBmb3Igb3RoZXIKLXB1cnBvc2VzLCBob3dldmVyLCB0aGluZ3MgbWF5IG5vdCB3b3JrIHByb3Blcmx5LiAgRm9yIHRhcmdldHMgd2hpY2ggdXNlIGJyb2tlbgotd29yZHMsIHRoZSBAc2FtcHstS30gb3B0aW9uIHdpbGwgd2FybiB3aGVuIGEgYnJva2VuIHdvcmQgaXMgZGlzY292ZXJlZC4KLQotVGhlIGJyb2tlbiB3b3JkIGNvZGUgaXMgdHVybmVkIG9mZiBieSB0aGUgQGNvZGV7V09SS0lOR19ET1RfV09SRH0gbWFjcm8uICBJdAotaXNuJ3QgbmVlZGVkIGlmIEBjb2Rley53b3JkfSBlbWl0cyBhIHZhbHVlIGxhcmdlIGVub3VnaCB0byBjb250YWluIGFuIGFkZHJlc3MKLShvciwgbW9yZSBjb3JyZWN0bHksIGFueSBwb3NzaWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGFkZHJlc3NlcykuCi0KLUBub2RlIEludGVybmFsIGZ1bmN0aW9ucwotQHNlY3Rpb24gSW50ZXJuYWwgZnVuY3Rpb25zCi0KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgYmFzaWMgaW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgYnkgR0FTLgotCi1AbWVudQotKiBXYXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlczo6ICBXYXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcwotKiBIYXNoIHRhYmxlczo6ICAgICAgICAgICAgICAgICBIYXNoIHRhYmxlcwotQGVuZCBtZW51Ci0KLUBub2RlIFdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzCi1Ac3Vic2VjdGlvbiBXYXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcwotCi1AZGVmdHlwZWZ1biAgQHtAfSBpbnQgaGFkX3dhcm5pbmdzICh2b2lkKQotQGRlZnR5cGVmdW54IEB7QH0gaW50IGhhZF9lcnJvcnMgKHZvaWQpCi1SZXR1cm5zIG5vbi16ZXJvIGlmIGFueSB3YXJuaW5ncyBvciBlcnJvcnMsIHJlc3BlY3RpdmVseSwgaGF2ZSBiZWVuIHByaW50ZWQKLWR1cmluZyB0aGlzIGludm9jYXRpb24uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSB2b2lkIGFzX3BlcnJvciAoY29uc3QgY2hhciAqQHZhcntncmlwZX0sIGNvbnN0IGNoYXIgKkB2YXJ7ZmlsZW5hbWV9KQotRGlzcGxheXMgYSBCRkQgb3Igc3lzdGVtIGVycm9yLCB0aGVuIGNsZWFycyB0aGUgZXJyb3Igc3RhdHVzLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuICBAe0B9IHZvaWQgYXNfdHNrdHNrIChjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIC4uLikKLUBkZWZ0eXBlZnVueCBAe0B9IHZvaWQgYXNfd2FybiAoY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1AZGVmdHlwZWZ1bnggQHtAfSB2b2lkIGFzX2JhZCAoY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1AZGVmdHlwZWZ1bnggQHtAfSB2b2lkIGFzX2ZhdGFsIChjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIC4uLikKLVRoZXNlIGZ1bmN0aW9ucyBkaXNwbGF5IG1lc3NhZ2VzIGFib3V0IHNvbWV0aGluZyBhbWlzcyB3aXRoIHRoZSBpbnB1dCBmaWxlLCBvcgotaW50ZXJuYWwgcHJvYmxlbXMgaW4gdGhlIGFzc2VtYmxlciBpdHNlbGYuICBUaGUgY3VycmVudCBmaWxlIG5hbWUgYW5kIGxpbmUKLW51bWJlciBhcmUgcHJpbnRlZCwgZm9sbG93ZWQgYnkgdGhlIHN1cHBsaWVkIG1lc3NhZ2UsIGZvcm1hdHRlZCB1c2luZwotQGNvZGV7dmZwcmludGZ9LCBhbmQgYSBmaW5hbCBuZXdsaW5lLgotCi1BbiBlcnJvciBpbmRpY2F0ZWQgYnkgQGNvZGV7YXNfYmFkfSB3aWxsIHJlc3VsdCBpbiBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzIHdoZW4KLXRoZSBhc3NlbWJsZXIgaGFzIGZpbmlzaGVkLiAgQ2FsbGluZyBAY29kZXthc19mYXRhbH0gd2lsbCByZXN1bHQgaW4gaW1tZWRpYXRlCi10ZXJtaW5hdGlvbiBvZiB0aGUgYXNzZW1ibGVyIHByb2Nlc3MuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSB2b2lkIGFzX3dhcm5fd2hlcmUgKGNoYXIgKkB2YXJ7ZmlsZX0sIHVuc2lnbmVkIGludCBAdmFye2xpbmV9LCBjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIC4uLikKLUBkZWZ0eXBlZnVueCBAe0B9IHZvaWQgYXNfYmFkX3doZXJlIChjaGFyICpAdmFye2ZpbGV9LCB1bnNpZ25lZCBpbnQgQHZhcntsaW5lfSwgY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1UaGVzZSB2YXJpYW50cyBwZXJtaXQgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciwgYW5kIGFyZQotdXNlZCB3aGVuIHByb2JsZW1zIGFyZSBkZXRlY3RlZCB3aGVuIHJlcHJvY2Vzc2luZyBpbmZvcm1hdGlvbiBzYXZlZCBhd2F5IHdoZW4KLXByb2Nlc3Npbmcgc29tZSBlYXJsaWVyIHBhcnQgb2YgdGhlIGZpbGUuICBGb3IgZXhhbXBsZSwgZml4dXBzIGFyZSBwcm9jZXNzZWQKLWFmdGVyIGFsbCBpbnB1dCBoYXMgYmVlbiByZWFkLCBidXQgbWVzc2FnZXMgYWJvdXQgZml4dXBzIHNob3VsZCByZWZlciB0byB0aGUKLW9yaWdpbmFsIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciB0aGF0IHRoZXkgYXJlIGFwcGxpY2FibGUgdG8uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSB2b2lkIGZwcmludF92YWx1ZSAoRklMRSAqQHZhcntmaWxlfSwgdmFsdWVUIEB2YXJ7dmFsfSkKLUBkZWZ0eXBlZnVueCBAe0B9IHZvaWQgc3ByaW50X3ZhbHVlIChjaGFyICpAdmFye2J1Zn0sIHZhbHVlVCBAdmFye3ZhbH0pCi1UaGVzZSBmdW5jdGlvbnMgYXJlIGhlbHBmdWwgZm9yIGNvbnZlcnRpbmcgYSBAY29kZXt2YWx1ZVR9IHZhbHVlIGludG8gcHJpbnRhYmxlCi1mb3JtYXQsIGluIGNhc2UgaXQncyB3aWRlciB0aGFuIG1vZGVzIHRoYXQgQGNvZGV7KnByaW50Zn0gY2FuIGhhbmRsZS4gIElmIHRoZQotdHlwZSBpcyBuYXJyb3cgZW5vdWdoLCBhIGRlY2ltYWwgbnVtYmVyIHdpbGwgYmUgcHJvZHVjZWQ7IG90aGVyd2lzZSwgaXQgd2lsbCBiZQotaW4gaGV4YWRlY2ltYWwuICBUaGUgdmFsdWUgaXRzZWxmIGlzIG5vdCBleGFtaW5lZCB0byBtYWtlIHRoaXMgZGV0ZXJtaW5hdGlvbi4KLUBlbmQgZGVmdHlwZWZ1bgotCi1Abm9kZSBIYXNoIHRhYmxlcwotQHN1YnNlY3Rpb24gSGFzaCB0YWJsZXMKLUBjaW5kZXggaGFzaCB0YWJsZXMKLQotQGRlZnR5cGVmdW4gQHtAfSBAe3N0cnVjdCBoYXNoX2NvbnRyb2wgKkB9IGhhc2hfbmV3ICh2b2lkKQotQ3JlYXRlcyB0aGUgaGFzaCB0YWJsZSBjb250cm9sIHN0cnVjdHVyZS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBAe0B9IHZvaWQgaGFzaF9kaWUgKHN0cnVjdCBoYXNoX2NvbnRyb2wgKikKLURlc3Ryb3kgYSBoYXNoIHRhYmxlLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gUFRSIGhhc2hfZGVsZXRlIChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKikKLURlbGV0ZXMgZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZSwgcmV0dXJucyB0aGUgdmFsdWUgaXQgaGFkLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gUFRSIGhhc2hfcmVwbGFjZSAoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICosIFBUUikKLVVwZGF0ZXMgdGhlIHZhbHVlIGZvciBhbiBlbnRyeSBhbHJlYWR5IGluIHRoZSB0YWJsZSwgcmV0dXJuaW5nIHRoZSBvbGQgdmFsdWUuCi1JZiBubyBlbnRyeSB3YXMgZm91bmQsIGp1c3QgcmV0dXJucyBOVUxMLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gQHtjb25zdCBjaGFyICpAfSBoYXNoX2luc2VydCAoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICosIFBUUikKLUluc2VydGluZyBhIHZhbHVlIGFscmVhZHkgaW4gdGhlIHRhYmxlIGlzIGFuIGVycm9yLgotUmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSBAe2NvbnN0IGNoYXIgKkB9IGhhc2hfamFtIChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKiwgUFRSKQotSW5zZXJ0cyBpZiB0aGUgdmFsdWUgaXNuJ3QgYWxyZWFkeSBwcmVzZW50LCB1cGRhdGVzIGl0IGlmIGl0IGlzLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBub2RlIFRlc3Qgc3VpdGUKLUBzZWN0aW9uIFRlc3Qgc3VpdGUKLUBjaW5kZXggdGVzdCBzdWl0ZQotCi1UaGUgdGVzdCBzdWl0ZSBpcyBraW5kIG9mIGxhbWUgZm9yIG1vc3QgcHJvY2Vzc29ycy4gIE9mdGVuIGl0IG9ubHkgY2hlY2tzIHRvCi1zZWUgaWYgYSBjb3VwbGUgb2YgZmlsZXMgY2FuIGJlIGFzc2VtYmxlZCB3aXRob3V0IHRoZSBhc3NlbWJsZXIgcmVwb3J0aW5nIGFueQotZXJyb3JzLiAgRm9yIG1vcmUgY29tcGxldGUgdGVzdGluZywgd3JpdGUgYSB0ZXN0IHdoaWNoIGVpdGhlciBleGFtaW5lcyB0aGUKLWFzc2VtYmxlciBsaXN0aW5nLCBvciBydW5zIEBjb2Rle29iamR1bXB9IGFuZCBleGFtaW5lcyBpdHMgb3V0cHV0LiAgRm9yIHRoZQotbGF0dGVyLCB0aGUgVENMIHByb2NlZHVyZSBAY29kZXtydW5fZHVtcF90ZXN0fSBtYXkgY29tZSBpbiBoYW5keS4gIEl0IHRha2VzIHRoZQotYmFzZSBuYW1lIG9mIGEgZmlsZSwgYW5kIGxvb2tzIGZvciBAZmlsZXtAdmFye2ZpbGV9LmR9LiAgVGhpcyBmaWxlIHNob3VsZAotY29udGFpbiBhcyBpdHMgaW5pdGlhbCBsaW5lcyBhIHNldCBvZiB2YXJpYWJsZSBzZXR0aW5ncyBpbiBAc2FtcHsjfSBjb21tZW50cywKLWluIHRoZSBmb3JtOgotCi1AZXhhbXBsZQotICAgICAgICAjQHZhcnt2YXJuYW1lfTogQHZhcnt2YWx1ZX0KLUBlbmQgZXhhbXBsZQotCi1UaGUgQHZhcnt2YXJuYW1lfSBtYXkgYmUgQGNvZGV7b2JqZHVtcH0sIEBjb2Rle25tfSwgb3IgQGNvZGV7YXN9LCBpbiB3aGljaCBjYXNlCi1pdCBzcGVjaWZpZXMgdGhlIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbXMuICBFeGFjdGx5IG9uZQotb2YgQGNvZGV7b2JqZHVtcH0gb3IgQGNvZGV7bm19IG11c3QgYmUgc3BlY2lmaWVkLCBhcyB0aGF0IGFsc28gc3BlY2lmaWVzIHdoaWNoCi1wcm9ncmFtIHRvIHJ1biBhZnRlciB0aGUgYXNzZW1ibGVyIGhhcyBmaW5pc2hlZC4gIElmIEB2YXJ7dmFybmFtZX0gaXMKLUBjb2Rle3NvdXJjZX0sIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGU7IG90aGVyd2lzZSwKLUBmaWxle0B2YXJ7ZmlsZX0uc30gaXMgdXNlZC4gIElmIEB2YXJ7dmFybmFtZX0gaXMgQGNvZGV7bmFtZX0sIGl0IHNwZWNpZmllcyB0aGUKLW5hbWUgb2YgdGhlIHRlc3QgdG8gYmUgdXNlZCBpbiB0aGUgQGNvZGV7cGFzc30gb3IgQGNvZGV7ZmFpbH0gbWVzc2FnZXMuCi0KLVRoZSBub24tY29tbWVudGVkIHBhcnRzIG9mIHRoZSBmaWxlIGFyZSBpbnRlcnByZXRlZCBhcyByZWd1bGFyIGV4cHJlc3Npb25zLCBvbmUKLXBlciBsaW5lLiAgQmxhbmsgbGluZXMgaW4gdGhlIEBjb2Rle29iamR1bXB9IG9yIEBjb2Rle25tfSBvdXRwdXQgYXJlIHNraXBwZWQsCi1hcyBhcmUgYmxhbmsgbGluZXMgaW4gdGhlIEBjb2Rley5kfSBmaWxlOyB0aGUgb3RoZXIgbGluZXMgYXJlIHRlc3RlZCB0byBzZWUgaWYKLXRoZSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlcyB0aGUgcHJvZ3JhbSBvdXRwdXQuICBJZiBpdCBkb2VzIG5vdCwgdGhlIHRlc3QKLWZhaWxzLgotCi1Ob3RlIHRoYXQgdGhpcyBtZWFucyB0aGUgdGVzdHMgbXVzdCBiZSBtb2RpZmllZCBpZiB0aGUgQGNvZGV7b2JqZHVtcH0gb3V0cHV0Ci1zdHlsZSBpcyBjaGFuZ2VkLgotCi1AYnllCi1AYyBMb2NhbCBWYXJpYWJsZXM6Ci1AYyBmaWxsLWNvbHVtbjogNzkKLUBjIEVuZDoKZGlmZiAtLWdpdCBhL2dhcy9kd2FyZjJkYmcuYyBiL2dhcy9kd2FyZjJkYmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTczNTU5Mi4uMDAwMDAwMAotLS0gYS9nYXMvZHdhcmYyZGJnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjkgKzAsMCBAQAotLyogZHdhcmYyZGJnLmMgLSBEV0FSRjIgZGVidWcgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBMb2dpY2FsIGxpbmUgbnVtYmVycyBjYW4gYmUgY29udHJvbGxlZCBieSB0aGUgY29tcGlsZXIgdmlhIHRoZQotICAgZm9sbG93aW5nIHR3byBkaXJlY3RpdmVzOgotCi0JLmZpbGUgRklMRU5PICJmaWxlLmMiCi0JLmxvYyAgRklMRU5PIExJTkVOTyBbQ09MVU1OXQotCi0gICBGSUxFTk8gaXMgdGhlIGZpbGVudW1iZXIuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiZHdhcmYyZGJnLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaW5jbHVkZSAiZWxmL2R3YXJmMi5oIgotCi0vKiBTaW5jZSB3ZSBjYW4ndCBnZW5lcmF0ZSB0aGUgcHJvbG9nIHVudGlsIHRoZSBib2R5IGlzIGNvbXBsZXRlLCB3ZQotICAgdXNlIHRocmVlIGRpZmZlcmVudCBzdWJzZWdtZW50cyBmb3IgLmRlYnVnX2xpbmU6IG9uZSBob2xkaW5nIHRoZQotICAgcHJvbG9nLCBvbmUgZm9yIHRoZSBkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIGluZm8sIGFuZCBvbmUgZm9yIHRoZQotICAgYm9keSAoInN0YXRlbWVudCBwcm9ncmFtIikuICAqLwotI2RlZmluZSBETF9QUk9MT0cJMAotI2RlZmluZSBETF9GSUxFUwkxCi0jZGVmaW5lIERMX0JPRFkJCTIKLQotLyogRmlyc3Qgc3BlY2lhbCBsaW5lIG9wY2RlIC0gbGVhdmUgcm9vbSBmb3IgdGhlIHN0YW5kYXJkIG9wY29kZXMuCi0gICBOb3RlOiBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhpcywgeW91J2xsIGhhdmUgdG8gdXBkYXRlIHRoZQotICAgInN0YW5kYXJkX29wY29kZV9sZW5ndGhzIiB0YWJsZSB0aGF0IGlzIGVtaXR0ZWQgYmVsb3cgaW4KLSAgIGR3YXJmMl9maW5pc2goKS4gICovCi0jZGVmaW5lIERXQVJGMl9MSU5FX09QQ09ERV9CQVNFCQkxMAotCi0jaWZuZGVmIERXQVJGMl9MSU5FX0JBU0UKLSAgLyogTWluaW11bSBsaW5lIG9mZnNldCBpbiBhIHNwZWNpYWwgbGluZSBpbmZvLiBvcGNvZGUuICBUaGlzIHZhbHVlCi0gICAgIHdhcyBjaG9zZW4gdG8gZ2l2ZSBhIHJlYXNvbmFibGUgcmFuZ2Ugb2YgdmFsdWVzLiAgKi8KLSMgZGVmaW5lIERXQVJGMl9MSU5FX0JBU0UJCS01Ci0jZW5kaWYKLQotLyogUmFuZ2Ugb2YgbGluZSBvZmZzZXRzIGluIGEgc3BlY2lhbCBsaW5lIGluZm8uIG9wY29kZS4gICovCi0jaWZuZGVmIERXQVJGMl9MSU5FX1JBTkdFCi0jIGRlZmluZSBEV0FSRjJfTElORV9SQU5HRQkJMTQKLSNlbmRpZgotCi0jaWZuZGVmIERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSAotICAvKiBEZWZpbmUgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgbWluaW11bSBpbnN0cnVjdGlvbiBsZW5ndGggKGluCi0gICAgIGJ5dGVzKS4gIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHJhdGhlciB0b28gc21hbGwgdGhhbiB0b28gYmlnLiAgKi8KLSMgZGVmaW5lIERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSAk0Ci0jZW5kaWYKLQotLyogRmxhZyB0aGF0IGluZGljYXRlcyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgaXNfc3RtdF9zdGFydCBmbGFnLgotICAgSW4gdGhlIHByZXNlbnQgaW1wbGVtZW50YXRpb24sIHdlIGRvIG5vdCBtYXJrIGFueSBsaW5lcyBhcwotICAgdGhlIGJlZ2lubmluZyBvZiBhIHNvdXJjZSBzdGF0ZW1lbnQsIGJlY2F1c2UgdGhhdCBpbmZvcm1hdGlvbgotICAgaXMgbm90IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBHQ0MgZnJvbnQtZW5kLiAgKi8KLSNkZWZpbmUJRFdBUkYyX0xJTkVfREVGQVVMVF9JU19TVE1UCTEKLQotLyogRmxhZyB0aGF0IGluZGljYXRlcyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgaXNfc3RtdF9zdGFydCBmbGFnLgotICAgSW4gdGhlIHByZXNlbnQgaW1wbGVtZW50YXRpb24sIHdlIGRvIG5vdCBtYXJrIGFueSBsaW5lcyBhcwotICAgdGhlIGJlZ2lubmluZyBvZiBhIHNvdXJjZSBzdGF0ZW1lbnQsIGJlY2F1c2UgdGhhdCBpbmZvcm1hdGlvbgotICAgaXMgbm90IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBHQ0MgZnJvbnQtZW5kLiAgKi8KLSNkZWZpbmUJRFdBUkYyX0xJTkVfREVGQVVMVF9JU19TVE1UCTEKLQotLyogR2l2ZW4gYSBzcGVjaWFsIG9wLCByZXR1cm4gdGhlIGxpbmUgc2tpcCBhbW91bnQuICAqLwotI2RlZmluZSBTUEVDSUFMX0xJTkUob3ApIFwKLQkoKChvcCkgLSBEV0FSRjJfTElORV9PUENPREVfQkFTRSklRFdBUkYyX0xJTkVfUkFOR0UgKyBEV0FSRjJfTElORV9CQVNFKQotCi0vKiBHaXZlbiBhIHNwZWNpYWwgb3AsIHJldHVybiB0aGUgYWRkcmVzcyBza2lwIGFtb3VudCAoaW4gdW5pdHMgb2YKLSAgIERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSC4gICovCi0jZGVmaW5lIFNQRUNJQUxfQUREUihvcCkgKCgob3ApIC0gRFdBUkYyX0xJTkVfT1BDT0RFX0JBU0UpL0RXQVJGMl9MSU5FX1JBTkdFKQotCi0vKiBUaGUgbWF4aW11bSBhZGRyZXNzIHNraXAgYW1vdW50IHRoYXQgY2FuIGJlIGVuY29kZWQgd2l0aCBhIHNwZWNpYWwgb3AuICAqLwotI2RlZmluZSBNQVhfU1BFQ0lBTF9BRERSX0RFTFRBCQlTUEVDSUFMX0FERFIoMjU1KQotCi0jZGVmaW5lIElOSVRJQUxfU1RBVEUJCQkJCQlcCi0gIC8qIEluaXRpYWxpemUgYXMgcGVyIERXQVJGMi4wIHN0YW5kYXJkLiAgKi8JCQlcCi0gIDAsCQkJCQkvKiBhZGRyZXNzICovCQlcCi0gIDEsCQkJCQkvKiBmaWxlICovCQlcCi0gIDEsCQkJCQkvKiBsaW5lICovCQlcCi0gIDAsCQkJCQkvKiBjb2x1bW4gKi8JCVwKLSAgRFdBUkYyX0xJTkVfREVGQVVMVF9JU19TVE1ULAkJLyogaXNfc3RtdCAqLwkJXAotICAwLAkJCQkJLyogYmFzaWNfYmxvY2sgKi8JXAotICAxCQkJCQkvKiBlbXB0eV9zZXF1ZW5jZSAqLwotCi1zdGF0aWMgc3RydWN0Ci0gIHsKLSAgICAvKiBzdGF0ZSBtYWNoaW5lIHN0YXRlIGFzIHBlciBEV0FSRjIgbWFudWFsOiAqLwotICAgIHN0cnVjdCBkd2FyZjJfc20KLSAgICAgIHsKLQlhZGRyZXNzVCBhZGRyOwotCXVuc2lnbmVkIGludCBmaWxlbnVtOwotCXVuc2lnbmVkIGludCBsaW5lOwotCXVuc2lnbmVkIGludCBjb2x1bW47Ci0JdW5zaWduZWQgaW50Ci0JICBpc19zdG10IDogMSwKLQkgIGJhc2ljX2Jsb2NrIDogMSwKLQkgIGVtcHR5X3NlcXVlbmNlIDogMTsJCS8qIGN1cnJlbnQgY29kZSBzZXF1ZW5jZSBoYXMgbm8gRFdBUkYyIGRpcmVjdGl2ZXM/ICovCi0gICAgICB9Ci0gICAgc207Ci0KLSAgICB1bnNpZ25lZCBpbnQKLSAgICAgIGFueV9kd2FyZjJfZGlyZWN0aXZlcyA6IDE7CS8qIGRpZCB3ZSBlbWl0IGFueSBEV0FSRjIgbGluZSBkZWJ1ZyBkaXJlY3RpdmVzPyAqLwotCi0gICAgZnJhZ1MgKiBmcmFnOwkvKiBmcmFnIHRoYXQgImFkZHIiIGlzIHJlbGF0aXZlIHRvICovCi0gICAgc2VnVCB0ZXh0X3NlZzsJLyogdGV4dCBzZWdtZW50ICJhZGRyIiBpcyByZWxhdGl2ZSB0byAqLwotICAgIHN1YnNlZ1QgdGV4dF9zdWJzZWc7Ci0gICAgc2VnVCBsaW5lX3NlZzsJLyogIi5kZWJ1Z19saW5lIiBzZWdtZW50ICovCi0gICAgaW50IGxhc3RfZmlsZW5hbWU7CS8qIGluZGV4IG9mIGxhc3QgZmlsZW5hbWUgdGhhdCB3YXMgdXNlZCAqLwotICAgIGludCBudW1fZmlsZW5hbWVzOwkvKiBpbmRleCBvZiBsYXN0IGZpbGVuYW1lIGluIHVzZSAqLwotICAgIGludCBmaWxlbmFtZV9sZW47CS8qIGxlbmd0aCBvZiB0aGUgZmlsZW5hbWUgYXJyYXkgKi8KLSAgICBzdHJ1Y3QKLSAgICAgIHsKLQlpbnQgZGlyOwkvKiB2YWxpZCBhZnRlciBnZW5fZGlyX2xpc3QoKSBvbmx5ICovCi0JY2hhciAqbmFtZTsgLyogZnVsbCBwYXRoIGJlZm9yZSBnZW5fZGlyX2xpc3QoKSwgZmlsZW5hbWUgYWZ0ZXJ3YXJkcyAqLwotICAgICAgfQotICAgICpmaWxlOwotCi0gICAgc3RydWN0IGR3YXJmMl9saW5lX2luZm8gY3VycmVudDsJLyogY3VycmVudCBzb3VyY2UgaW5mbzogKi8KLQotICAgIC8qIGNvdW50ZXJzIGZvciBzdGF0aXN0aWNhbCBwdXJwb3NlczogKi8KLSAgICB1bnNpZ25lZCBpbnQgbnVtX2xpbmVfZW50cmllczsKLSAgICB1bnNpZ25lZCBpbnQgb3Bjb2RlX2hpc3RbMjU2XTsJLyogaGlzdG9ncmFtIG9mIG9wY29kZSBmcmVxdWVuY2llcyAqLwotICB9Ci1scyA9Ci0gIHsKLSAgICB7Ci0gICAgICBJTklUSUFMX1NUQVRFCi0gICAgfSwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgTlVMTCwKLSAgICB7IE5VTEwsIDAsIDAsIDAsIDAgfSwKLSAgICAwLAotICAgIHsKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLSAgICB9Ci0gIH07Ci0KLQotLyogRnVuY3Rpb24gcHJvdG90eXBlczogKi8KLXN0YXRpYyB2b2lkIG91dF91bGViMTI4IFBBUkFNUyAoKGFkZHJlc3NUKSk7Ci1zdGF0aWMgdm9pZCBvdXRfc2xlYjEyOCBQQVJBTVMgKChvZmZzZXRUKSk7Ci1zdGF0aWMgdm9pZCBnZW5fYWRkcl9saW5lIFBBUkFNUyAoKGludCwgYWRkcmVzc1QpKTsKLXN0YXRpYyB2b2lkIHJlc2V0X3N0YXRlX21hY2hpbmUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgb3V0X3NldF9hZGRyIFBBUkFNUyAoKGFkZHJlc3NUKSk7Ci1zdGF0aWMgdm9pZCBvdXRfZW5kX3NlcXVlbmNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZ2V0X2ZpbGVudW0gUEFSQU1TICgoaW50LCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGdlbl9kaXJfbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnZW5fZmlsZV9saXN0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHByaW50X3N0YXRzIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLQotCi0jZGVmaW5lIG91dF9ieXRlKGJ5dGUpCUZSQUdfQVBQRU5EXzFfQ0hBUihieXRlKQotI2RlZmluZSBvdXRfb3Bjb2RlKG9wYykJKG91dF9ieXRlICgob3BjKSksICsrbHMub3Bjb2RlX2hpc3RbKG9wYykgJiAweGZmXSkKLQotLyogT3V0cHV0IGFuIHVuc2lnbmVkICJsaXR0bGUtZW5kaWFuIGJhc2UgMTI4IiBudW1iZXIuICAqLwotc3RhdGljIHZvaWQKLW91dF91bGViMTI4ICh2YWx1ZSkKLSAgICAgYWRkcmVzc1QgdmFsdWU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgYnl0ZSwgbW9yZSA9IDB4ODA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBieXRlID0gdmFsdWUgJiAweDdmOwotICAgICAgdmFsdWUgPj49IDc7Ci0gICAgICBpZiAodmFsdWUgPT0gMCkKLQltb3JlID0gMDsKLSAgICAgIG91dF9ieXRlIChtb3JlIHwgYnl0ZSk7Ci0gICAgfQotICB3aGlsZSAobW9yZSk7Ci19Ci0KLS8qIE91dHB1dCBhIHNpZ25lZCAibGl0dGxlLWVuZGlhbiBiYXNlIDEyOCIgbnVtYmVyLiAgKi8KLXN0YXRpYyB2b2lkCi1vdXRfc2xlYjEyOCAodmFsdWUpCi0gICAgIG9mZnNldFQgdmFsdWU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgYnl0ZSwgbW9yZSA9IDB4ODA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBieXRlID0gdmFsdWUgJiAweDdmOwotICAgICAgdmFsdWUgPj49IDc7Ci0gICAgICBpZiAoKCh2YWx1ZSA9PSAwKSAmJiAoKGJ5dGUgJiAweDQwKSA9PSAwKSkKLQkgIHx8ICgodmFsdWUgPT0gLTEpICYmICgoYnl0ZSAmIDB4NDApICE9IDApKSkKLQltb3JlID0gMDsKLSAgICAgIG91dF9ieXRlIChtb3JlIHwgYnl0ZSk7Ci0gICAgfQotICB3aGlsZSAobW9yZSk7Ci19Ci0KLS8qIEVuY29kZSBhIHBhaXIgb2YgbGluZSBhbmQgYWRkcmVzcyBza2lwcyBhcyBlZmZpY2llbnRseSBhcyBwb3NzaWJsZS4KLSAgIE5vdGUgdGhhdCB0aGUgbGluZSBza2lwIGlzIHNpZ25lZCwgd2hlcmVhcyB0aGUgYWRkcmVzcyBza2lwIGlzCi0gICB1bnNpZ25lZC4gICovCi1zdGF0aWMgdm9pZAotZ2VuX2FkZHJfbGluZSAobGluZV9kZWx0YSwgYWRkcl9kZWx0YSkKLSAgICAgaW50IGxpbmVfZGVsdGE7Ci0gICAgIGFkZHJlc3NUIGFkZHJfZGVsdGE7Ci17Ci0gIHVuc2lnbmVkIGludCB0bXAsIG9wY29kZTsKLQotICB0bXAgPSBsaW5lX2RlbHRhIC0gRFdBUkYyX0xJTkVfQkFTRTsKLQotICBpZiAodG1wID49IERXQVJGMl9MSU5FX1JBTkdFKQotICAgIHsKLSAgICAgIG91dF9vcGNvZGUgKERXX0xOU19hZHZhbmNlX2xpbmUpOwotICAgICAgb3V0X3NsZWIxMjggKGxpbmVfZGVsdGEpOwotICAgICAgdG1wID0gMCAtIERXQVJGMl9MSU5FX0JBU0U7Ci0gICAgICBsaW5lX2RlbHRhID0gMDsKLSAgICB9Ci0KLSAgdG1wICs9IERXQVJGMl9MSU5FX09QQ09ERV9CQVNFOwotCi0gIC8qIHRyeSB1c2luZyBhIHNwZWNpYWwgb3Bjb2RlOiAqLwotICBvcGNvZGUgPSB0bXAgKyBhZGRyX2RlbHRhKkRXQVJGMl9MSU5FX1JBTkdFOwotICBpZiAob3Bjb2RlIDw9IDI1NSkKLSAgICB7Ci0gICAgICBvdXRfb3Bjb2RlIChvcGNvZGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiB0cnkgdXNpbmcgRFdfTE5TX2NvbnN0X2FkZF9wYyBmb2xsb3dlZCBieSBzcGVjaWFsIG9wOiAqLwotICBvcGNvZGUgPSB0bXAgKyAoYWRkcl9kZWx0YSAtIE1BWF9TUEVDSUFMX0FERFJfREVMVEEpKkRXQVJGMl9MSU5FX1JBTkdFOwotICBpZiAob3Bjb2RlIDw9IDI1NSkKLSAgICB7Ci0gICAgICBvdXRfb3Bjb2RlIChEV19MTlNfY29uc3RfYWRkX3BjKTsKLSAgICAgIG91dF9vcGNvZGUgKG9wY29kZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG91dF9vcGNvZGUgKERXX0xOU19hZHZhbmNlX3BjKTsKLSAgb3V0X3VsZWIxMjggKGFkZHJfZGVsdGEpOwotCi0gIGlmIChsaW5lX2RlbHRhKQotICAgIG91dF9vcGNvZGUgKHRtcCk7CQkvKiBvdXRwdXQgbGluZS1kZWx0YSAqLwotICBlbHNlCi0gICAgb3V0X29wY29kZSAoRFdfTE5TX2NvcHkpOwkvKiBhcHBlbmQgbmV3IHJvdyB3aXRoIGN1cnJlbnQgaW5mbyAqLwotfQotCi1zdGF0aWMgdm9pZAotcmVzZXRfc3RhdGVfbWFjaGluZSAoKQotewotICBzdGF0aWMgY29uc3Qgc3RydWN0IGR3YXJmMl9zbSBpbml0aWFsX3N0YXRlID0geyBJTklUSUFMX1NUQVRFIH07Ci0KLSAgbHMuc20gPSBpbml0aWFsX3N0YXRlOwotfQotCi0vKiBTZXQgYW4gYWJzb2x1dGUgYWRkcmVzcyAobWF5IHJlc3VsdHMgaW4gYSByZWxvY2F0aW9uIGVudHJ5KTogKi8KLXN0YXRpYyB2b2lkCi1vdXRfc2V0X2FkZHIgKGFkZHIpCi0gICAgIGFkZHJlc3NUIGFkZHI7Ci17Ci0gIHN1YnNlZ1Qgc2F2ZWRfc3Vic2VnOwotICBzZWdUIHNhdmVkX3NlZzsKLSAgZXhwcmVzc2lvblMgZXhwcjsKLSAgc3ltYm9sUyAqc3ltOwotICBpbnQgYnl0ZXNfcGVyX2FkZHJlc3M7Ci0KLSAgc2F2ZWRfc2VnID0gbm93X3NlZzsKLSAgc2F2ZWRfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotICBzdWJzZWdfc2V0IChscy50ZXh0X3NlZywgbHMudGV4dF9zdWJzZWcpOwotICBzeW0gPSBzeW1ib2xfbmV3ICgiLkwwXDAwMSIsIG5vd19zZWcsIGFkZHIsIGZyYWdfbm93KTsKLQotICBzdWJzZWdfc2V0IChzYXZlZF9zZWcsIHNhdmVkX3N1YnNlZyk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGJ5dGVzX3Blcl9hZGRyZXNzID0gYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSAvIDg7Ci0jZWxzZQotICAvKiBGSVhNRS4gICovCi0gIGJ5dGVzX3Blcl9hZGRyZXNzID0gNDsKLSNlbmRpZgotCi0gIG91dF9vcGNvZGUgKERXX0xOU19leHRlbmRlZF9vcCk7Ci0gIG91dF91bGViMTI4IChieXRlc19wZXJfYWRkcmVzcyArIDEpOwotCi0gIG91dF9vcGNvZGUgKERXX0xORV9zZXRfYWRkcmVzcyk7Ci0gIGV4cHIuWF9vcCA9IE9fc3ltYm9sOwotICBleHByLlhfYWRkX3N5bWJvbCA9IHN5bTsKLSAgZXhwci5YX2FkZF9udW1iZXIgPSAwOwotICBlbWl0X2V4cHIgKCZleHByLCBieXRlc19wZXJfYWRkcmVzcyk7Ci19Ci0KLS8qIEVtaXQgRFdfTE5TX2VuZF9zZXF1ZW5jZSBhbmQgcmVzZXQgc3RhdGUgbWFjaGluZS4gIERvZXMgbm90Ci0gICBwcmVzZXJ2ZSB0aGUgY3VycmVudCBzZWdtZW50L3N1Yi1zZWdtZW50ISAgKi8KLXN0YXRpYyB2b2lkCi1vdXRfZW5kX3NlcXVlbmNlICgpCi17Ci0gIGFkZHJlc3NUIGFkZHIsIGRlbHRhOwotICBmcmFnUyAqdGV4dF9mcmFnOwotCi0gIGlmIChscy50ZXh0X3NlZykKLSAgICB7Ci0gICAgICBzdWJzZWdfc2V0IChscy50ZXh0X3NlZywgbHMudGV4dF9zdWJzZWcpOwotI2lmZGVmIG1kX2N1cnJlbnRfdGV4dF9hZGRyCi0gICAgICBhZGRyID0gbWRfY3VycmVudF90ZXh0X2FkZHIgKCk7Ci0jZWxzZQotICAgICAgYWRkciA9IGZyYWdfbm93X2ZpeCAoKTsKLSNlbmRpZgotICAgICAgdGV4dF9mcmFnID0gZnJhZ19ub3c7Ci0gICAgICBzdWJzZWdfc2V0IChscy5saW5lX3NlZywgRExfQk9EWSk7Ci0gICAgICBpZiAodGV4dF9mcmFnICE9IGxzLmZyYWcpCi0JewotCSAgb3V0X3NldF9hZGRyIChhZGRyKTsKLQkgIGxzLnNtLmFkZHIgPSBhZGRyOwotCSAgbHMuZnJhZyA9IHRleHRfZnJhZzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZGVsdGEgPSAoYWRkciAtIGxzLnNtLmFkZHIpIC8gRFdBUkYyX0xJTkVfTUlOX0lOU05fTEVOR1RIOwotCSAgaWYgKGRlbHRhID4gMCkKLQkgICAgewotCSAgICAgIC8qIEFkdmFuY2UgYWRkcmVzcyB3aXRob3V0IHVwZGF0aW5nIHRoZSBsaW5lLWRlYnVnCi0JCSBtYXRyaXgtLS10aGUgZW5kX3NlcXVlbmNlIGVudHJ5IGlzIHVzZWQgb25seSB0byB0ZWxsCi0JCSB0aGUgZGVidWdnZXIgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuKi8KLQkgICAgICBvdXRfb3Bjb2RlIChEV19MTlNfYWR2YW5jZV9wYyk7Ci0JICAgICAgb3V0X3VsZWIxMjggKGRlbHRhKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBzdWJzZWdfc2V0IChscy5saW5lX3NlZywgRExfQk9EWSk7Ci0KLSAgb3V0X29wY29kZSAoRFdfTE5TX2V4dGVuZGVkX29wKTsKLSAgb3V0X3VsZWIxMjggKDEpOwotICBvdXRfYnl0ZSAoRFdfTE5FX2VuZF9zZXF1ZW5jZSk7Ci0KLSAgcmVzZXRfc3RhdGVfbWFjaGluZSAoKTsKLX0KLQotLyogTG9vayB1cCBhIGZpbGVudW1iZXIgZWl0aGVyIGJ5IGZpbGVuYW1lIG9yIGJ5IGZpbGVudW1iZXIuICBJZiBib3RoCi0gICBhIGZpbGVudW1iZXIgYW5kIGEgZmlsZW5hbWUgYXJlIHNwZWNpZmllZCwgbG9va3VwIGJ5IGZpbGVuYW1lIHRha2VzCi0gICBwcmVjZWRlbmNlLiAgSWYgdGhlIGZpbGVuYW1lIGNhbm5vdCBiZSBmb3VuZCwgaXQgaXMgYWRkZWQgdG8gdGhlCi0gICBmaWxldGFibGUgYW5kIHRoZSBmaWxlbnVtYmVyIGZvciB0aGUgbmV3IGVudHJ5IGlzIHJldHVybmVkLiAgKi8KLXN0YXRpYyBpbnQKLWdldF9maWxlbnVtIChmaWxlbnVtLCBmaWxlKQotICAgICBpbnQgZmlsZW51bTsKLSAgICAgY2hhciAqZmlsZTsKLXsKLSAgaW50IGksIGxhc3QgPSBmaWxlbnVtIC0gMTsKLSAgY2hhciBjaGFyMCA9IGZpbGVbMF07Ci0KLSAgLyogSWYgZmlsZW51bSBpcyBvdXQgb2YgcmFuZ2Ugb2YgdGhlIGZpbGVuYW1lIHRhYmxlLCB0aGVuIHRyeSB1c2luZyB0aGUKLSAgICAgdGFibGUgZW50cnkgcmV0dXJuZWQgZnJvbSB0aGUgcHJldmlvdXMgY2FsbC4gICovCi0gIGlmIChsYXN0ID49IGxzLm51bV9maWxlbmFtZXMgfHwgbGFzdCA8IDApCi0gICAgbGFzdCA9IGxzLmxhc3RfZmlsZW5hbWU7Ci0KLSAgLyogRG8gYSBxdWljayBjaGVjayBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgb3IgcHJldmlvdXNseSB1c2VkIGZpbGVudW0uICAqLwotICBpZiAobHMubnVtX2ZpbGVuYW1lcyA+IDAgJiYgbHMuZmlsZVtsYXN0XS5uYW1lWzBdID09IGNoYXIwCi0gICAgICAmJiBzdHJjbXAgKGxzLmZpbGVbbGFzdF0ubmFtZSArIDEsIGZpbGUgKyAxKSA9PSAwKQotICAgIHJldHVybiBsYXN0ICsgMTsKLQotICAvKiBubyBtYXRjaCwgZmFsbCBiYWNrIHRvIHNpbXBsZSBsaW5lYXIgc2NhbjogKi8KLSAgZm9yIChpID0gMDsgaSA8IGxzLm51bV9maWxlbmFtZXM7ICsraSkKLSAgICB7Ci0gICAgICBpZiAobHMuZmlsZVtpXS5uYW1lWzBdID09IGNoYXIwCi0JICAmJiBzdHJjbXAgKGxzLmZpbGVbaV0ubmFtZSArIDEsIGZpbGUgKyAxKSA9PSAwKQotCXsKLQkgIGxzLmxhc3RfZmlsZW5hbWUgPSBpOwotCSAgcmV0dXJuIGkgKyAxOwotCX0KLSAgICB9Ci0KLSAgLyogbm8gbWF0Y2g6IGVudGVyIG5ldyBmaWxlbmFtZSAqLwotICBpZiAobHMubnVtX2ZpbGVuYW1lcyA+PSBscy5maWxlbmFtZV9sZW4pCi0gICAgewotICAgICAgbHMuZmlsZW5hbWVfbGVuICs9IDEzOwotICAgICAgbHMuZmlsZSA9IHhyZWFsbG9jIChscy5maWxlLCBscy5maWxlbmFtZV9sZW4gKiBzaXplb2YgKGxzLmZpbGVbMF0pKTsKLSAgICB9Ci0gIGxzLmZpbGVbbHMubnVtX2ZpbGVuYW1lc10uZGlyID0gMDsKLSAgbHMuZmlsZVtscy5udW1fZmlsZW5hbWVzXS5uYW1lID0gZmlsZTsKLSAgbHMubGFzdF9maWxlbmFtZSA9IGxzLm51bV9maWxlbmFtZXM7Ci0gIHJldHVybiArK2xzLm51bV9maWxlbmFtZXM7Ci19Ci0KLS8qIEVtaXQgYW4gZW50cnkgaW4gdGhlIGxpbmUgbnVtYmVyIHRhYmxlIGlmIHRoZSBhZGRyZXNzIG9yIGxpbmUgaGFzIGNoYW5nZWQuCi0gICBBRERSIGlzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZyYWcgaW4gdGhlIHRleHQgc2VjdGlvbi4gICovCi0KLXZvaWQKLWR3YXJmMl9nZW5fbGluZV9pbmZvIChhZGRyLCBsKQotICAgICBhZGRyZXNzVCBhZGRyOwotICAgICBzdHJ1Y3QgZHdhcmYyX2xpbmVfaW5mbyAqbDsKLXsKLSAgdW5zaWduZWQgaW50IGZpbGVudW0gPSBsLT5maWxlbnVtOwotICB1bnNpZ25lZCBpbnQgYW55X291dHB1dCA9IDA7Ci0gIHN1YnNlZ1Qgc2F2ZWRfc3Vic2VnOwotICBzZWdUIHNhdmVkX3NlZzsKLSAgZnJhZ1MgKnNhdmVkX2ZyYWc7Ci0KLSAgaWYgKGZsYWdfZGVidWcpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAibGluZTogYWRkciAlbHggZmlsZSBgJXMnIGxpbmUgJXUgY29sICV1IGZsYWdzICV4XG4iLAotCSAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHIsIGwtPmZpbGVuYW1lLCBsLT5saW5lLCBsLT5jb2x1bW4sIGwtPmZsYWdzKTsKLQotICBpZiAoZmlsZW51bSA+IDAgJiYgIWwtPmZpbGVuYW1lKQotICAgIHsKLSAgICAgIGlmIChmaWxlbnVtID49ICh1bnNpZ25lZCBpbnQpIGxzLm51bV9maWxlbmFtZXMpCi0JewotCSAgYXNfd2FybiAoIkVuY291bnRlcmVkIGJhZCBmaWxlIG51bWJlciBpbiBsaW5lIG51bWJlciBkZWJ1ZyBpbmZvISIpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGwtPmZpbGVuYW1lKQotICAgIGZpbGVudW0gPSBnZXRfZmlsZW51bSAoZmlsZW51bSwgbC0+ZmlsZW5hbWUpOwotICBlbHNlCi0gICAgcmV0dXJuOwkvKiBubyBmaWxlbmFtZSwgbm8gZmlsbnVtID0+IG5vIHBsYXkgKi8KLQotICAvKiBNdXN0IHNhdmUgdGhlc2UgYmVmb3JlIHRoZSBzdWJzZWdfbmV3IGNhbGwsIGFzIHRoYXQgY2FsbCB3aWxsIGNoYW5nZQotICAgICB0aGVtLiAgKi8KLSAgc2F2ZWRfc2VnID0gbm93X3NlZzsKLSAgc2F2ZWRfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgc2F2ZWRfZnJhZyA9IGZyYWdfbm93OwotCi0gIGlmICghbHMubGluZV9zZWcpCi0gICAgewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIHN5bWJvbFMgKnNlY3N5bTsKLSNlbmRpZgotCi0gICAgICBscy5saW5lX3NlZyA9IHN1YnNlZ19uZXcgKCIuZGVidWdfbGluZSIsIDApOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGxzLmxpbmVfc2VnLCBTRUNfUkVBRE9OTFkpOwotCi0gICAgICAvKiBXZSdyZSBnb2luZyB0byBuZWVkIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIHNlY3N5bSA9IHN5bWJvbF9maW5kICgiLmRlYnVnX2xpbmUiKTsKLSAgICAgIGlmIChzZWNzeW0gIT0gTlVMTCkKLSAgICAgICAgc3ltYm9sX3NldF9iZmRzeW0gKHNlY3N5bSwgbHMubGluZV9zZWctPnN5bWJvbCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHNlY3Rpb25fc3ltYm9sIChscy5saW5lX3NlZykpOwotI2VuZGlmCi0gICAgfQotCi0gIHN1YnNlZ19zZXQgKGxzLmxpbmVfc2VnLCBETF9CT0RZKTsKLQotICBpZiAobHMudGV4dF9zZWcgIT0gc2F2ZWRfc2VnIHx8IGxzLnRleHRfc3Vic2VnICE9IHNhdmVkX3N1YnNlZykKLSAgICB7Ci0gICAgICBpZiAoIWxzLnNtLmVtcHR5X3NlcXVlbmNlKQotCXsKLQkgIG91dF9lbmRfc2VxdWVuY2UgKCk7CQkvKiB0ZXJtaW5hdGUgcHJldmlvdXMgc2VxdWVuY2UgKi8KLQkgIGxzLnNtLmVtcHR5X3NlcXVlbmNlID0gMTsKLQl9Ci0gICAgICBhbnlfb3V0cHV0ID0gMTsKLSAgICAgIGxzLnRleHRfc2VnID0gc2F2ZWRfc2VnOwotICAgICAgbHMudGV4dF9zdWJzZWcgPSBzYXZlZF9zdWJzZWc7Ci0gICAgICBvdXRfc2V0X2FkZHIgKGFkZHIpOwotICAgICAgbHMuc20uYWRkciA9IGFkZHI7Ci0gICAgICBscy5mcmFnID0gc2F2ZWRfZnJhZzsKLSAgICB9Ci0KLSAgaWYgKGxzLnNtLmZpbGVudW0gIT0gZmlsZW51bSkKLSAgICB7Ci0gICAgICBhbnlfb3V0cHV0ID0gMTsKLSAgICAgIG91dF9vcGNvZGUgKERXX0xOU19zZXRfZmlsZSk7Ci0gICAgICBvdXRfdWxlYjEyOCAoZmlsZW51bSk7Ci0gICAgICBscy5zbS5maWxlbnVtID0gZmlsZW51bTsKLSAgICB9Ci0KLSAgaWYgKGxzLnNtLmNvbHVtbiAhPSBsLT5jb2x1bW4pCi0gICAgewotICAgICAgYW55X291dHB1dCA9IDE7Ci0gICAgICBvdXRfb3Bjb2RlIChEV19MTlNfc2V0X2NvbHVtbik7Ci0gICAgICBvdXRfdWxlYjEyOCAobC0+Y29sdW1uKTsKLSAgICAgIGxzLnNtLmNvbHVtbiA9IGwtPmNvbHVtbjsKLSAgICB9Ci0KLSAgaWYgKCgobC0+ZmxhZ3MgJiBEV0FSRjJfRkxBR19CRUdJTl9TVE1UKSAhPSAwKSAhPSBscy5zbS5pc19zdG10KQotICAgIHsKLSAgICAgIGFueV9vdXRwdXQgPSAxOwotICAgICAgb3V0X29wY29kZSAoRFdfTE5TX25lZ2F0ZV9zdG10KTsKLSAgICB9Ci0KLSAgaWYgKGwtPmZsYWdzICYgRFdBUkYyX0ZMQUdfQkVHSU5fQkxPQ0spCi0gICAgewotICAgICAgYW55X291dHB1dCA9IDE7Ci0gICAgICBvdXRfb3Bjb2RlIChEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrKTsKLSAgICB9Ci0KLSAgaWYgKGxzLnNtLmxpbmUgIT0gbC0+bGluZSkKLSAgICB7Ci0gICAgICBhbnlfb3V0cHV0ID0gMTsKLSAgICAgIGlmIChzYXZlZF9mcmFnICE9IGxzLmZyYWcpCi0JewotCSAgLyogSWYgYSBuZXcgZnJhZyBnb3QgYWxsb2NhdGVkIChmb3Igd2hhdGV2ZXIgcmVhc29uKSwgdGhlbgotCSAgICAgZGVhbCB3aXRoIGl0IGJ5IGdlbmVyYXRpbmcgYSByZWZlcmVuY2Ugc3ltYm9sLiAgTm90ZTogbm8KLQkgICAgIGVuZF9zZXF1ZW5jZSBuZWVkcyB0byBiZSBnZW5lcmF0ZWQgYmVjYXVzZSB0aGUgYWRkcmVzcyBkaWQKLQkgICAgIG5vdCByZWFsbHkgZGVjcmVhc2UgKG9ubHkgdGhlIHJlZmVyZW5jZSBwb2ludCBjaGFuZ2VkKS4gICovCi0JICBvdXRfc2V0X2FkZHIgKGFkZHIpOwotCSAgbHMuc20uYWRkciA9IGFkZHI7Ci0JICBscy5mcmFnID0gc2F2ZWRfZnJhZzsKLQl9Ci0gICAgICBnZW5fYWRkcl9saW5lIChsLT5saW5lIC0gbHMuc20ubGluZSwKLQkJICAgICAoYWRkciAtIGxzLnNtLmFkZHIpIC8gRFdBUkYyX0xJTkVfTUlOX0lOU05fTEVOR1RIKTsKLSAgICAgIGxzLnNtLmJhc2ljX2Jsb2NrID0gMDsKLSAgICAgIGxzLnNtLmxpbmUgPSBsLT5saW5lOwotICAgICAgbHMuc20uYWRkciA9IGFkZHI7Ci0gICAgfQotCi0gIHN1YnNlZ19zZXQgKHNhdmVkX3NlZywgc2F2ZWRfc3Vic2VnKTsKLQotICBscy5udW1fbGluZV9lbnRyaWVzICs9IGFueV9vdXRwdXQ7Ci0gIGlmIChhbnlfb3V0cHV0KQotICAgIGxzLnNtLmVtcHR5X3NlcXVlbmNlID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLWdlbl9kaXJfbGlzdCAoKQotewotICBjaGFyICpzdHIsICpzbGFzaCwgKmRpcl9saXN0LCAqZHAsICpjcDsKLSAgaW50IGksIGosIG51bV9kaXJzOwotCi0gIGRpcl9saXN0ID0gZnJhZ19tb3JlICgwKTsKLSAgbnVtX2RpcnMgPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBscy5udW1fZmlsZW5hbWVzOyArK2kpCi0gICAgewotICAgICAgc3RyID0gbHMuZmlsZVtpXS5uYW1lOwotICAgICAgc2xhc2ggPSBzdHJyY2hyIChzdHIsICcvJyk7Ci0gICAgICBpZiAoc2xhc2gpCi0JewotCSAgKnNsYXNoID0gJ1wwJzsKLQkgIGZvciAoaiA9IDAsIGRwID0gZGlyX2xpc3Q7IGogPCBudW1fZGlyczsgKytqKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAoc3RyLCBkcCkgPT0gMCkKLQkJewotCQkgIGxzLmZpbGVbaV0uZGlyID0gaiArIDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBkcCArPSBzdHJsZW4gKGRwKTsKLQkgICAgfQotCSAgaWYgKGogPj0gbnVtX2RpcnMpCi0JICAgIHsKLQkgICAgICAvKiBkaWRuJ3QgZmluZCB0aGlzIGRpcmVjdG9yeTogYXBwZW5kIGl0IHRvIHRoZSBsaXN0ICovCi0JICAgICAgc2l6ZV90IHNpemUgPSBzdHJsZW4gKHN0cikgKyAxOwotCSAgICAgIGNwID0gZnJhZ19tb3JlIChzaXplKTsKLQkgICAgICBtZW1jcHkgKGNwLCBzdHIsIHNpemUpOwotCSAgICAgIGxzLmZpbGVbaV0uZGlyID0gKytudW1fZGlyczsKLQkgICAgfQotCSAgKnNsYXNoID0gJy8nOwotCSAgbHMuZmlsZVtpXS5uYW1lID0gc2xhc2ggKyAxOwotCX0KLSAgICB9Ci0gIG91dF9ieXRlICgnXDAnKTsJLyogdGVybWluYXRlIGRpcmVjdG9yeSBsaXN0ICovCi19Ci0KLXN0YXRpYyB2b2lkCi1nZW5fZmlsZV9saXN0ICgpCi17Ci0gIHNpemVfdCBzaXplOwotICBjaGFyICpjcDsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGxzLm51bV9maWxlbmFtZXM7ICsraSkKLSAgICB7Ci0gICAgICBzaXplID0gc3RybGVuIChscy5maWxlW2ldLm5hbWUpICsgMTsKLSAgICAgIGNwID0gZnJhZ19tb3JlIChzaXplKTsKLSAgICAgIG1lbWNweSAoY3AsIGxzLmZpbGVbaV0ubmFtZSwgc2l6ZSk7Ci0KLSAgICAgIG91dF91bGViMTI4IChscy5maWxlW2ldLmRpcik7CS8qIGRpcmVjdG9yeSBudW1iZXIgKi8KLSAgICAgIG91dF91bGViMTI4ICgwKTsJCQkvKiBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgKi8KLSAgICAgIG91dF91bGViMTI4ICgwKTsJCQkvKiBmaWxlc2l6ZSAqLwotICAgIH0KLSAgb3V0X2J5dGUgKDApOwkJLyogdGVybWluYXRlIGZpbGVuYW1lIGxpc3QgKi8KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3N0YXRzICh0b3RhbF9zaXplKQotICAgICB1bnNpZ25lZCBsb25nIHRvdGFsX3NpemU7Ci17Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpvcGNfbmFtZVtdID0KLSAgICB7Ci0gICAgICAiZXh0ZW5kZWQiLCAiY29weSIsICJhZHZhbmNlX3BjIiwgImFkdmFuY2VfbGluZSIsICJzZXRfZmlsZSIsCi0gICAgICAic2V0X2NvbHVtbiIsICJuZWdhdGVfc3RtdCIsICJzZXRfYmFzaWNfYmxvY2siLCAiY29uc3RfYWRkX3BjIiwKLSAgICAgICJmaXhlZF9hZHZhbmNlX3BjIgotICAgIH07Ci0gIHNpemVfdCBpOwotICBpbnQgajsKLQotICBmcHJpbnRmIChzdGRlcnIsICJBdmVyYWdlIHNpemU6ICVnIGJ5dGVzL2xpbmVcbiIsCi0JICAgdG90YWxfc2l6ZSAvIChkb3VibGUpIGxzLm51bV9saW5lX2VudHJpZXMpOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuU3RhbmRhcmQgb3Bjb2RlIGhpc3RvZ3JhbTpcbiIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wY19uYW1lKS9zaXplb2YgKG9wY19uYW1lWzBdKTsgKytpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzIiwgb3BjX25hbWVbaV0pOwotICAgICAgZm9yIChqID0gc3RybGVuIChvcGNfbmFtZVtpXSk7IGogPCAxNjsgKytqKQotCWZwcmludGYgKHN0ZGVyciwgIiAiKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogJXVcbiIsIGxzLm9wY29kZV9oaXN0W2ldKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiXG5TcGVjaWFsIG9wY29kZXM6XG5hZGRyXHRcdFx0XHRsaW5lIHNraXBcbiIpOwotCi0gIGZwcmludGYgKHN0ZGVyciwgInNraXA6ICIpOwotICBmb3IgKGogPSBEV0FSRjJfTElORV9CQVNFOyBqIDwgRFdBUkYyX0xJTkVfQkFTRSArIERXQVJGMl9MSU5FX1JBTkdFOyArK2opCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJTNkIiwgaik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuLS0tLS0iKTsKLQotICBmb3IgKDsgaSA8IDI1NjsgKytpKQotICAgIHsKLSAgICAgIGogPSBTUEVDSUFMX0xJTkUgKGkpOwotICAgICAgaWYgKGogPT0gRFdBUkYyX0xJTkVfQkFTRSkKLQlmcHJpbnRmIChzdGRlcnIsICJcbiU0dTogIiwKLQkJIERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSCpTUEVDSUFMX0FERFIgKGkpKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAlMnUiLCBscy5vcGNvZGVfaGlzdFtpXSk7Ci0gICAgfQotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi12b2lkCi1kd2FyZjJfZmluaXNoICgpCi17Ci0gIGFkZHJlc3NUIGJvZHlfc2l6ZSwgdG90YWxfc2l6ZSwgcHJvbG9nX3NpemU7Ci0gIHN1YnNlZ1Qgc2F2ZWRfc3Vic2VnOwotICBzZWdUIHNhdmVkX3NlZzsKLSAgY2hhciAqY3A7Ci0KLSAgaWYgKCFscy5saW5lX3NlZykKLSAgICAvKiBubyAuZGVidWdfbGluZSBzZWdtZW50LCBubyB3b3JrIHRvIGRvLi4uICovCi0gICAgcmV0dXJuOwotCi0gIHNhdmVkX3NlZyA9IG5vd19zZWc7Ci0gIHNhdmVkX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLSAgaWYgKCFscy5zbS5lbXB0eV9zZXF1ZW5jZSkKLSAgICBvdXRfZW5kX3NlcXVlbmNlICgpOwotICB0b3RhbF9zaXplID0gYm9keV9zaXplID0gZnJhZ19ub3dfZml4ICgpOwotCi0gIC8qIG5vdyBnZW5lcmF0ZSB0aGUgZGlyZWN0b3J5IGFuZCBmaWxlIGxpc3RzOiAqLwotICBzdWJzZWdfc2V0IChscy5saW5lX3NlZywgRExfRklMRVMpOwotICBnZW5fZGlyX2xpc3QgKCk7Ci0gIGdlbl9maWxlX2xpc3QgKCk7Ci0gIHRvdGFsX3NpemUgKz0gZnJhZ19ub3dfZml4ICgpOwotCi0gIC8qIGFuZCBub3cgdGhlIGhlYWRlciAoInN0YXRlbWVudCBwcm9ncmFtIHByb2xvZyIsIGluIERXQVJGMiBsaW5nby4uLikgKi8KLSAgc3Vic2VnX3NldCAobHMubGluZV9zZWcsIERMX1BST0xPRyk7Ci0KLSAgY3AgPSBmcmFnX21vcmUgKDE1ICsgRFdBUkYyX0xJTkVfT1BDT0RFX0JBU0UgLSAxKTsKLQotICB0b3RhbF9zaXplICs9IGZyYWdfbm93X2ZpeCAoKTsKLSAgcHJvbG9nX3NpemUgPSB0b3RhbF9zaXplIC0gYm9keV9zaXplIC0gMTA7Ci0KLSMgZGVmaW5lIFNUVUZGKHZhbCxzaXplKQltZF9udW1iZXJfdG9fY2hhcnMgKGNwLCB2YWwsIHNpemUpOyBjcCArPSBzaXplOwotICBTVFVGRiAodG90YWxfc2l6ZSAtIDQsIDQpOwkvKiBsZW5ndGggKi8KLSAgU1RVRkYgKDIsIDIpOwkJCS8qIHZlcnNpb24gKi8KLSAgU1RVRkYgKHByb2xvZ19zaXplLCA0KTsJLyogcHJvbG9ndWVfbGVuZ3RoICovCi0gIFNUVUZGIChEV0FSRjJfTElORV9NSU5fSU5TTl9MRU5HVEgsIDEpOwotICBTVFVGRiAoRFdBUkYyX0xJTkVfREVGQVVMVF9JU19TVE1ULCAxKTsKLSAgU1RVRkYgKERXQVJGMl9MSU5FX0JBU0UsIDEpOwotICBTVFVGRiAoRFdBUkYyX0xJTkVfUkFOR0UsIDEpOwotICBTVFVGRiAoRFdBUkYyX0xJTkVfT1BDT0RFX0JBU0UsIDEpOwotCi0gIC8qIHN0YW5kYXJkX29wY29kZV9sZW5ndGhzOiAqLwotICBTVFVGRiAoMCwgMSk7CQkJLyogRFdfTE5TX2NvcHkgKi8KLSAgU1RVRkYgKDEsIDEpOwkJCS8qIERXX0xOU19hZHZhbmNlX3BjICovCi0gIFNUVUZGICgxLCAxKTsJCQkvKiBEV19MTlNfYWR2YW5jZV9saW5lICovCi0gIFNUVUZGICgxLCAxKTsJCQkvKiBEV19MTlNfc2V0X2ZpbGUgKi8KLSAgU1RVRkYgKDEsIDEpOwkJCS8qIERXX0xOU19zZXRfY29sdW1uICovCi0gIFNUVUZGICgwLCAxKTsJCQkvKiBEV19MTlNfbmVnYXRlX3N0bXQgKi8KLSAgU1RVRkYgKDAsIDEpOwkJCS8qIERXX0xOU19zZXRfYmFzaWNfYmxvY2sgKi8KLSAgU1RVRkYgKDAsIDEpOwkJCS8qIERXX0xOU19jb25zdF9hZGRfcGMgKi8KLSAgU1RVRkYgKDEsIDEpOwkJCS8qIERXX0xOU19maXhlZF9hZHZhbmNlX3BjICovCi0KLSAgc3Vic2VnX3NldCAoc2F2ZWRfc2VnLCBzYXZlZF9zdWJzZWcpOwotCi0gIGlmIChmbGFnX2RlYnVnKQotICAgIHByaW50X3N0YXRzICh0b3RhbF9zaXplKTsKLX0KLQotdm9pZAotZHdhcmYyX2RpcmVjdGl2ZV9maWxlIChkdW1teSkKLSAgICAgaW50IGR1bW15IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBsZW47Ci0KLSAgLyogQ29udGludWUgdG8gYWNjZXB0IGEgYmFyZSBzdHJpbmcgYW5kIHBhc3MgaXQgb2ZmLiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0gICAgewotICAgICAgc19hcHBfZmlsZSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxzLmFueV9kd2FyZjJfZGlyZWN0aXZlcyA9IDE7Ci0KLSAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfTk9ORSkKLSAgICAvKiBBdXRvbWF0aWNhbGx5IHR1cm4gb24gRFdBUkYyIGRlYnVnIGluZm8gdW5sZXNzIHNvbWV0aGluZyBlbHNlCi0gICAgICAgaGFzIGJlZW4gc2VsZWN0ZWQuICAqLwotICAgIGRlYnVnX3R5cGUgPSBERUJVR19EV0FSRjI7Ci0KLSAgbHMuY3VycmVudC5maWxlbnVtID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGxzLmN1cnJlbnQuZmlsZW5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotZHdhcmYyX2RpcmVjdGl2ZV9sb2MgKGR1bW15KQotICAgICBpbnQgZHVtbXkgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgbHMuYW55X2R3YXJmMl9kaXJlY3RpdmVzID0gMTsKLQotICBscy5jdXJyZW50LmZpbGVudW0gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBscy5jdXJyZW50LmxpbmUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBscy5jdXJyZW50LmNvbHVtbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGxzLmN1cnJlbnQuZmxhZ3MgPSBEV0FSRjJfRkxBR19CRUdJTl9TVE1UOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgaWYgKGxpc3RpbmcpCi0gICAgbGlzdGluZ19zb3VyY2VfbGluZSAobHMuY3VycmVudC5saW5lKTsKLSNlbmRpZgotfQotCi12b2lkCi1kd2FyZjJfd2hlcmUgKGxpbmUpCi0gICAgIHN0cnVjdCBkd2FyZjJfbGluZV9pbmZvICpsaW5lOwotewotICBpZiAobHMuYW55X2R3YXJmMl9kaXJlY3RpdmVzKQotICAgICpsaW5lID0gbHMuY3VycmVudDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3doZXJlICgmbGluZS0+ZmlsZW5hbWUsICZsaW5lLT5saW5lKTsKLSAgICAgIGxpbmUtPmZpbGVudW0gPSAwOwotICAgICAgbGluZS0+Y29sdW1uID0gMDsKLSAgICAgIGxpbmUtPmZsYWdzID0gRFdBUkYyX0ZMQUdfQkVHSU5fU1RNVDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvZHdhcmYyZGJnLmggYi9nYXMvZHdhcmYyZGJnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZWVjMWMuLjAwMDAwMDAKLS0tIGEvZ2FzL2R3YXJmMmRiZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogZHdhcmYyZGJnLmggLSBEV0FSRjIgZGVidWcgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEFTX0RXQVJGMkRCR19ICi0jZGVmaW5lIEFTX0RXQVJGMkRCR19ICi0KLSNpbmNsdWRlICJhcy5oIgotCi0jZGVmaW5lIERXQVJGMl9GTEFHX0JFR0lOX1NUTVQJKDEgPDwgMCkJLyogYmVnaW5uaW5nIG9mIHN0YXRlbWVudCAqLwotI2RlZmluZSBEV0FSRjJfRkxBR19CRUdJTl9CTE9DSwkoMSA8PCAxKQkvKiBiZWdpbm5pbmcgb2YgYmFzaWMgYmxvY2sgKi8KLQotc3RydWN0IGR3YXJmMl9saW5lX2luZm8KLSAgewotICAgIGNoYXIgKmZpbGVuYW1lOwotICAgIHVuc2lnbmVkIGludCBmaWxlbnVtOwotICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgIHVuc2lnbmVkIGludCBjb2x1bW47Ci0gICAgdW5zaWduZWQgaW50IGZsYWdzOwotICB9OwotCi0vKiBJbXBsZW1lbnRzIHRoZSAuZmlsZSBGSUxFTk8gIkZJTEVOQU1FIiBkaXJlY3RpdmUuICBGSUxFTk8gY2FuIGJlIDAKLSAgIHRvIGluZGljYXRlIHRoYXQgbm8gZmlsZSBudW1iZXIgaGFzIGJlZW4gYXNzaWduZWQuICBBbGwgcmVhbCBmaWxlCi0gICBudW1iZXIgbXVzdCBiZSA+MC4gICovCi1leHRlcm4gdm9pZCBkd2FyZjJfZGlyZWN0aXZlX2ZpbGUgUEFSQU1TICgoaW50IGR1bW15KSk7Ci0KLS8qIEltcGxlbWVudHMgdGhlIC5sb2MgRklMRU5PIExJTkVOTyBbQ09MVU1OXSBkaXJlY3RpdmUuICBGSUxFTk8gaXMKLSAgIHRoZSBmaWxlIG51bWJlciwgTElORU5PIHRoZSBsaW5lIG51bWJlciBhbmQgdGhlIChvcHRpb25hbCkgQ09MVU1OCi0gICB0aGUgY29sdW1uIG9mIHRoZSBzb3VyY2UgY29kZSB0aGF0IHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24KLSAgIGNvcnJlc3BvbmRzIHRvLiAgRklMRU5PIGNhbiBiZSAwIHRvIGluZGljYXRlIHRoYXQgdGhlIGZpbGVuYW1lCi0gICBzcGVjaWZpZWQgYnkgdGhlIHRleHR1YWxseSBtb3N0IHJlY2VudCAuZmlsZSBkaXJlY3RpdmUgc2hvdWxkIGJlCi0gICB1c2VkLiAgKi8KLWV4dGVybiB2b2lkIGR3YXJmMl9kaXJlY3RpdmVfbG9jIFBBUkFNUyAoKGludCBkdW1teSkpOwotCi0vKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNvdXJjZSBpbmZvcm1hdGlvbi4gIElmIC5maWxlIGRpcmVjdGl2ZXMgaGF2ZQotICAgYmVlbiBlbmNvdW50ZXJlZCwgdGhlIGluZm8gZm9yIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlIGlzCi0gICByZXR1cm5lZC4gIE90aGVyd2lzZSwgdGhlIGluZm8gZm9yIHRoZSBhc3NlbWJseSBzb3VyY2UgZmlsZSBpcwotICAgcmV0dXJuZWQuICAqLwotZXh0ZXJuIHZvaWQgZHdhcmYyX3doZXJlIFBBUkFNUyAoKHN0cnVjdCBkd2FyZjJfbGluZV9pbmZvICpsKSk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIC5kZWJ1Z19saW5lIGluZm8gYmFzZWQgb24gdGhlIGFkZHJlc3MgYW5kCi0gICBzb3VyY2UgaW5mb3JtYXRpb24gcGFzc2VkIGluIHRoZSBhcmd1bWVudHMuICBBRERSIHNob3VsZCBiZSB0aGUKLSAgIGZyYWctcmVsYXRpdmUgb2Zmc2V0IG9mIHRoZSBpbnN0cnVjdGlvbiB0aGUgaW5mb3JtYXRpb24gaXMgZm9yIGFuZAotICAgTCBpcyB0aGUgc291cmNlIGluZm9ybWF0aW9uIHRoYXQgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGF0Ci0gICBhZGRyZXNzLiAqLwotZXh0ZXJuIHZvaWQgZHdhcmYyX2dlbl9saW5lX2luZm8gUEFSQU1TICgoYWRkcmVzc1QgYWRkciwKLQkJCQkJICBzdHJ1Y3QgZHdhcmYyX2xpbmVfaW5mbyAqbCkpOwotCi0vKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBhbGwgb3RoZXIgaW5wdXQgaXMgcHJvY2Vzc2VkIHRvIGZpbmlzaCB1cCB0aGUKLSAgIC5kZWJ1Z19saW5lIHNlY3Rpb24uICAqLwotZXh0ZXJuIHZvaWQgZHdhcmYyX2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZiAvKiBBU19EV0FSRjJEQkdfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2Vjb2ZmLmMgYi9nYXMvZWNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM2YzhjNC4uMDAwMDAwMAotLS0gYS9nYXMvZWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDUzMTggKzAsMCBAQAotLyogRUNPRkYgZGVidWdnaW5nIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgVGhpcyBmaWxlIHdhcyBwdXQgdG9nZXRoZXIgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LiAgQQotICAgZ29vZCBkZWFsIG9mIGl0IGNvbWVzIGRpcmVjdGx5IGZyb20gbWlwcy10ZmlsZS5jLCBieSBNaWNoYWVsCi0gICBNZWlzc25lciA8bWVpc3NuZXJAb3NmLm9yZz4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLS8qIFRoaXMgZmlsZSBpcyBjb21waWxlZCBjb25kaXRpb25hbGx5IGZvciB0aG9zZSB0YXJnZXRzIHdoaWNoIHVzZQotICAgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIChlLmcuLCBNSVBTIEVDT0ZGLCBNSVBTIEVMRiwgQWxwaGEKLSAgIEVDT0ZGKS4gICovCi0KLSNpbmNsdWRlICJlY29mZi5oIgotCi0jaWZkZWYgRUNPRkZfREVCVUdHSU5HCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLS8qIFdoeSBpc24ndCB0aGlzIGluIGNvZmYvc3ltLmg/ICAqLwotI2RlZmluZSBTVF9SRkRFU0NBUEUgMHhmZmYKLQotLyogVGhpcyBmaWxlIGNvbnN0cnVjdHMgdGhlIGluZm9ybWF0aW9uIHVzZWQgYnkgdGhlIEVDT0ZGIGRlYnVnZ2luZwotICAgZm9ybWF0LiAgSXQganVzdCBidWlsZHMgYSBsYXJnZSBibG9jayBvZiBkYXRhLgotCi0gICBXZSBzdXBwb3J0IGJvdGggRUNPRkYgc3R5bGUgZGVidWdnaW5nIGFuZCBzdGFicyBkZWJ1Z2dpbmcgKHRoZQotICAgc3RhYnMgc3ltYm9scyBhcmUgZW5jYXBzdWxhdGVkIGluIEVDT0ZGIHN5bWJvbHMpLiAgVGhpcyBzaG91bGQgbGV0Ci0gICB1cyBoYW5kbGUgYW55dGhpbmcgdGhlIGNvbXBpbGVyIG1pZ2h0IHRocm93IGF0IHVzLiAgKi8KLQotLyogSGVyZSBpcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBNSVBTIEVDT0ZGIHN5bWJvbCB0YWJsZSwgYnkKLSAgIE1pY2hhZWwgTWVpc3NuZXIuICBUaGUgTUlQUyBzeW1ib2wgdGFibGUgaGFzIHRoZSBmb2xsb3dpbmcgcGllY2VzOgotCi0JU3ltYm9saWMgSGVhZGVyCi0JICAgIHwKLQkgICAgKy0tCUF1eGlsaWFyeSBTeW1ib2xzCi0JICAgIHwKLQkgICAgKy0tCURlbnNlIG51bWJlciB0YWJsZQotCSAgICB8Ci0JICAgICstLQlPcHRpbWl6ZXIgU3ltYm9scwotCSAgICB8Ci0JICAgICstLQlFeHRlcm5hbCBTdHJpbmdzCi0JICAgIHwKLQkgICAgKy0tCUV4dGVybmFsIFN5bWJvbHMKLQkgICAgfAotCSAgICArLS0JUmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9ycwotCSAgICB8Ci0JICAgICstLQlGaWxlIHRhYmxlCi0JCSAgICB8Ci0JCSAgICArLS0JUHJvY2VkdXJlIHRhYmxlCi0JCSAgICB8Ci0JCSAgICArLS0JTGluZSBudW1iZXIgdGFibGUKLQkJICAgIHwKLQkJICAgICstLQlMb2NhbCBTdHJpbmdzCi0JCSAgICB8Ci0JCSAgICArLS0JTG9jYWwgU3ltYm9scwotCi0gICBUaGUgc3ltYm9saWMgaGVhZGVyIHBvaW50cyB0byBlYWNoIG9mIHRoZSBvdGhlciB0YWJsZXMsIGFuZCBhbHNvCi0gICBjb250YWlucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMuICBJdCBhbHNvIGNvbnRhaW5zIGEgbWFnaWMgbnVtYmVyCi0gICBhbmQgTUlQUyBjb21waWxlciB2ZXJzaW9uIG51bWJlciwgc3VjaCBhcyAyLjAuCi0KLSAgIFRoZSBhdXhpbGlhcnkgdGFibGUgaXMgYSBzZXJpZXMgb2YgMzIgYml0IGludGVnZXJzLCB0aGF0IGFyZQotICAgcmVmZXJlbmNlZCBhcyBuZWVkZWQgZnJvbSB0aGUgbG9jYWwgc3ltYm9sIHRhYmxlLiAgVW5saWtlIHN0YW5kYXJkCi0gICBDT0ZGLCB0aGUgYXV4LiAgaW5mb3JtYXRpb24gZG9lcyBub3QgZm9sbG93IHRoZSBzeW1ib2wgdGhhdCB1c2VzCi0gICBpdCwgYnV0IHJhdGhlciBpcyBhIHNlcGFyYXRlIHRhYmxlLiAgSW4gdGhlb3J5LCB0aGlzIHdvdWxkIGFsbG93Ci0gICB0aGUgTUlQUyBjb21waWxlcnMgdG8gY29sbGFwc2UgZHVwbGljYXRlIGF1eC4gZW50cmllcywgYnV0IEkndmUgbm90Ci0gICBub3RpY2VkIHRoaXMgaGFwcGVuaW5nIHdpdGggdGhlIDEuMzEgY29tcGlsZXIgc3VpdGUuICBUaGUgZGlmZmVyZW50Ci0gICB0eXBlcyBvZiBhdXguIGVudHJpZXMgYXJlOgotCi0gICAgMSkJZG5Mb3c6IExvdyBib3VuZCBvbiBhcnJheSBkaW1lbnNpb24uCi0KLSAgICAyKQlkbkhpZ2g6IEhpZ2ggYm91bmQgb24gYXJyYXkgZGltZW5zaW9uLgotCi0gICAgMykJaXN5bTogSW5kZXggdG8gdGhlIGxvY2FsIHN5bWJvbCB3aGljaCBpcyB0aGUgc3RhcnQgb2YgdGhlCi0JZnVuY3Rpb24gZm9yIHRoZSBlbmQgb2YgZnVuY3Rpb24gZmlyc3QgYXV4LiBlbnRyeS4KLQotICAgIDQpCXdpZHRoOiBXaWR0aCBvZiBzdHJ1Y3R1cmVzIGFuZCBiaXRmaWVsZHMuCi0KLSAgICA1KQljb3VudDogQ291bnQgb2YgcmFuZ2VzIGZvciB2YXJpYW50IHBhcnQuCi0KLSAgICA2KQlybmR4OiBBIHJlbGF0aXZlIGluZGV4IGludG8gdGhlIHN5bWJvbCB0YWJsZS4gIFRoZSByZWxhdGl2ZQotCWluZGV4IGZpZWxkIGhhcyB0d28gcGFydHM6IHJmZCB3aGljaCBpcyBhIHBvaW50ZXIgaW50byB0aGUKLQlyZWxhdGl2ZSBmaWxlIGluZGV4IHRhYmxlIG9yIFNUX1JGREVTQ0FQRSB3aGljaCBzYXlzIHRoZSBuZXh0Ci0JYXV4LiBlbnRyeSBpcyB0aGUgZmlsZSBudW1iZXIsIGFuZCBpbmRleDogd2hpY2ggaXMgdGhlIHBvaW50ZXIKLQlpbnRvIHRoZSBsb2NhbCBzeW1ib2wgd2l0aGluIGEgZ2l2ZW4gZmlsZSB0YWJsZS4gIFRoaXMgaXMgZm9yCi0JdGhpbmdzIGxpa2UgcmVmZXJlbmNlcyB0byB0eXBlcyBkZWZpbmVkIGluIGFub3RoZXIgZmlsZS4KLQotICAgIDcpCVR5cGUgaW5mb3JtYXRpb246IFRoaXMgaXMgbGlrZSB0aGUgQ09GRiB0eXBlIGJpdHMsIGV4Y2VwdCBpdAotCWlzIDMyIGJpdHMgaW5zdGVhZCBvZiAxNjsgdGhleSBzdGlsbCBoYXZlIHJvb20gdG8gYWRkIG5ldwotCWJhc2ljIHR5cGVzOyBhbmQgdGhleSBjYW4gaGFuZGxlIG1vcmUgdGhhbiA2IGxldmVscyBvZiBhcnJheSwKLQlwb2ludGVyLCBmdW5jdGlvbiwgZXRjLiAgRWFjaCB0eXBlIGluZm9ybWF0aW9uIGZpZWxkIGNvbnRhaW5zCi0JdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVyczoKLQotCSAgICBhKQlmQml0ZmllbGQ6IGEgYml0IHRoYXQgc2F5cyB0aGlzIGlzIGEgYml0ZmllbGQsIGFuZCB0aGUKLQkJc2l6ZSBpbiBiaXRzIGZvbGxvd3MgYXMgdGhlIG5leHQgYXV4LiBlbnRyeS4KLQotCSAgICBiKQljb250aW51ZWQ6IGEgYml0IHRoYXQgc2F5cyB0aGUgbmV4dCBhdXguIGVudHJ5IGlzIGEKLQkJY29udGludWF0aW9uIG9mIHRoZSBjdXJyZW50IHR5cGUgaW5mb3JtYXRpb24gKGluIGNhc2UKLQkJdGhlcmUgYXJlIG1vcmUgdGhhbiA2IGxldmVscyBvZiBhcnJheS9wdHIvZnVuY3Rpb24pLgotCi0JICAgIGMpCWJ0OiBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGJhc2UgdHlwZSBiZWZvcmUgYWRkaW5nCi0JCWFycmF5LCBwb2ludGVyLCBmdW5jdGlvbiwgZXRjLiBxdWFsaWZpZXJzLiAgVGhlCi0JCWN1cnJlbnQgYmFzZSB0eXBlcyB0aGF0IEkgaGF2ZSBkb2N1bWVudGF0aW9uIGZvciBhcmU6Ci0KLQkJCWJ0TmlsCQktLSB1bmRlZmluZWQKLQkJCWJ0QWRyCQktLSBhZGRyZXNzIC0gaW50ZWdlciBzYW1lIHNpemUgYXMgcHRyCi0JCQlidENoYXIJCS0tIGNoYXJhY3RlcgotCQkJYnRVQ2hhcgkJLS0gdW5zaWduZWQgY2hhcmFjdGVyCi0JCQlidFNob3J0CQktLSBzaG9ydAotCQkJYnRVU2hvcnQJLS0gdW5zaWduZWQgc2hvcnQKLQkJCWJ0SW50CQktLSBpbnQKLQkJCWJ0VUludAkJLS0gdW5zaWduZWQgaW50Ci0JCQlidExvbmcJCS0tIGxvbmcKLQkJCWJ0VUxvbmcJCS0tIHVuc2lnbmVkIGxvbmcKLQkJCWJ0RmxvYXQJCS0tIGZsb2F0IChyZWFsKQotCQkJYnREb3VibGUJLS0gRG91YmxlIChyZWFsKQotCQkJYnRTdHJ1Y3QJLS0gU3RydWN0dXJlIChSZWNvcmQpCi0JCQlidFVuaW9uCQktLSBVbmlvbiAodmFyaWFudCkKLQkJCWJ0RW51bQkJLS0gRW51bWVyYXRlZAotCQkJYnRUeXBlZGVmCS0tIGRlZmluZWQgdmlhIGEgdHlwZWRlZiBpc3ltUmVmCi0JCQlidFJhbmdlCQktLSBzdWJyYW5nZSBvZiBpbnQKLQkJCWJ0U2V0CQktLSBwYXNjYWwgc2V0cwotCQkJYnRDb21wbGV4CS0tIGZvcnRyYW4gY29tcGxleAotCQkJYnREQ29tcGxleAktLSBmb3J0cmFuIGRvdWJsZSBjb21wbGV4Ci0JCQlidEluZGlyZWN0CS0tIGZvcndhcmQgb3IgdW5uYW1lZCB0eXBlZGVmCi0JCQlidEZpeGVkRGVjCS0tIEZpeGVkIERlY2ltYWwKLQkJCWJ0RmxvYXREZWMJLS0gRmxvYXQgRGVjaW1hbAotCQkJYnRTdHJpbmcJLS0gVmFyeWluZyBMZW5ndGggQ2hhcmFjdGVyIFN0cmluZwotCQkJYnRCaXQJCS0tIEFsaWduZWQgQml0IFN0cmluZwotCQkJYnRQaWN0dXJlCS0tIFBpY3R1cmUKLQkJCWJ0Vm9pZAkJLS0gVm9pZCAoTUlQUyBjYyByZXZpc2lvbiA+PSAyLjAwKQotCi0JICAgIGQpCXRxMCAtIHRxNTogdHlwZSBxdWFsaWZpZXIgZmllbGRzIGFzIG5lZWRlZC4gIFRoZQotCQljdXJyZW50IHR5cGUgcXVhbGlmaWVyIGZpZWxkcyBJIGhhdmUgZG9jdW1lbnRhdGlvbiBmb3IKLQkJYXJlOgotCi0JCQl0cU5pbAkJLS0gbm8gbW9yZSBxdWFsaWZpZXJzCi0JCQl0cVB0cgkJLS0gcG9pbnRlcgotCQkJdHFQcm9jCQktLSBwcm9jZWR1cmUKLQkJCXRxQXJyYXkJCS0tIGFycmF5Ci0JCQl0cUZhcgkJLS0gODA4NiBmYXIgcG9pbnRlcnMKLQkJCXRxVm9sCQktLSB2b2xhdGlsZQotCi0KLSAgIFRoZSBkZW5zZSBudW1iZXIgdGFibGUgaXMgdXNlZCBpbiB0aGUgZnJvbnQgZW5kcywgYW5kIGRpc2FwcGVhcnMgYnkKLSAgIHRoZSB0aW1lIHRoZSAubyBpcyBjcmVhdGVkLgotCi0gICBXaXRoIHRoZSAxLjMxIGNvbXBpbGVyIHN1aXRlLCB0aGUgb3B0aW1pemF0aW9uIHN5bWJvbHMgZG9uJ3Qgc2VlbQotICAgdG8gYmUgdXNlZCBhcyBmYXIgYXMgSSBjYW4gdGVsbC4KLQotICAgVGhlIGxpbmtlciBpcyB0aGUgZmlyc3QgZW50aXR5IHRoYXQgY3JlYXRlcyB0aGUgcmVsYXRpdmUgZmlsZQotICAgZGVzY3JpcHRvciB0YWJsZSwgYW5kIEkgYmVsaWV2ZSBpdCBpcyB1c2VkIHNvIHRoYXQgdGhlIGluZGl2aWR1YWwKLSAgIGZpbGUgdGFibGUgcG9pbnRlcnMgZG9uJ3QgaGF2ZSB0byBiZSByZXdyaXR0ZW4gd2hlbiB0aGUgb2JqZWN0cyBhcmUKLSAgIG1lcmdlZCB0b2dldGhlciBpbnRvIHRoZSBwcm9ncmFtIGZpbGUuCi0KLSAgIFVubGlrZSBDT0ZGLCB0aGUgYmFzaWMgc3ltYm9sICYgc3RyaW5nIHRhYmxlcyBhcmUgc3BsaXQgaW50bwotICAgZXh0ZXJuYWwgYW5kIGxvY2FsIHN5bWJvbHMvc3RyaW5ncy4gIFRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uCi0gICBvbmx5IGdvZXMgb2ZmIG9mIHRoZSBleHRlcm5hbCBzeW1ib2wgdGFibGUsIGFuZCB0aGUgZGVidWcKLSAgIGluZm9ybWF0aW9uIG9ubHkgZ29lcyBvZmYgb2YgdGhlIGludGVybmFsIHN5bWJvbCB0YWJsZS4gIFRoZQotICAgZXh0ZXJuYWwgc3ltYm9scyBjYW4gaGF2ZSBsaW5rcyB0byBhbiBhcHByb3ByaWF0ZSBmaWxlIGluZGV4IGFuZAotICAgc3ltYm9sIHdpdGhpbiB0aGUgZmlsZSB0byBnaXZlIGl0IHRoZSBhcHByb3ByaWF0ZSB0eXBlIGluZm9ybWF0aW9uLgotICAgQmVjYXVzZSBvZiB0aGlzLCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBhcmUgYWN0dWFsbHkgbGFyZ2VyIHRoYW4gdGhlCi0gICBpbnRlcm5hbCBzeW1ib2xzICh0byBjb250YWluIHRoZSBsaW5rIGluZm9ybWF0aW9uKSwgYW5kIGNvbnRhaW4gdGhlCi0gICBsb2NhbCBzeW1ib2wgc3RydWN0dXJlIGFzIGEgbWVtYmVyLCB0aG91Z2ggdGhpcyBtZW1iZXIgaXMgbm90IHRoZQotICAgZmlyc3QgbWVtYmVyIG9mIHRoZSBleHRlcm5hbCBzeW1ib2wgc3RydWN0dXJlICghKS4gIEkgc3VzcGVjdCB0aGlzCi0gICBzcGxpdCBpcyB0byBtYWtlIHN0cmlwIGVhc2llciB0byBkZWFsIHdpdGguCi0KLSAgIEVhY2ggZmlsZSB0YWJsZSBoYXMgb2Zmc2V0cyBmb3Igd2hlcmUgdGhlIGxpbmUgbnVtYmVycywgbG9jYWwKLSAgIHN0cmluZ3MsIGxvY2FsIHN5bWJvbHMsIGFuZCBwcm9jZWR1cmUgdGFibGUgc3RhcnRzIGZyb20gd2l0aGluIHRoZQotICAgZ2xvYmFsIHRhYmxlcywgYW5kIHRoZSBpbmRleHMgYXJlIHJlc2V0IHRvIDAgZm9yIGVhY2ggb2YgdGhvc2UKLSAgIHRhYmxlcyBmb3IgdGhlIGZpbGUuCi0KLSAgIFRoZSBwcm9jZWR1cmUgdGFibGUgY29udGFpbnMgdGhlIGJpbmFyeSBlcXVpdmFsZW50cyBvZiB0aGUgLmVudAotICAgKHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBhZGRyZXNzKSwgLmZyYW1lICh3aGF0IHJlZ2lzdGVyIGlzIHRoZQotICAgdmlydHVhbCBmcmFtZSBwb2ludGVyLCBjb25zdGFudCBvZmZzZXQgZnJvbSB0aGUgcmVnaXN0ZXIgdG8gb2J0YWluCi0gICB0aGUgVkZQLCBhbmQgd2hhdCByZWdpc3RlciBob2xkcyB0aGUgcmV0dXJuIGFkZHJlc3MpLCAubWFzay8uZm1hc2sKLSAgIChiaXRtYXNrIG9mIHNhdmVkIHJlZ2lzdGVycywgYW5kIHdoZXJlIHRoZSBmaXJzdCByZWdpc3RlciBpcyBzdG9yZWQKLSAgIHJlbGF0aXZlIHRvIHRoZSBWRlApIGFzc2VtYmxlciBkaXJlY3RpdmVzLiAgSXQgYWxzbyBjb250YWlucyB0aGUKLSAgIGxvdyBhbmQgaGlnaCBib3VuZHMgb2YgdGhlIGxpbmUgbnVtYmVycyBpZiBkZWJ1Z2dpbmcgaXMgdHVybmVkIG9uLgotCi0gICBUaGUgbGluZSBudW1iZXIgdGFibGUgaXMgYSBjb21wcmVzc2VkIGZvcm0gb2YgdGhlIG5vcm1hbCBDT0ZGIGxpbmUKLSAgIHRhYmxlLiAgRWFjaCBsaW5lIG51bWJlciBlbnRyeSBpcyBlaXRoZXIgMSBvciAzIGJ5dGVzIGxvbmcsIGFuZAotICAgY29udGFpbnMgYSBzaWduZWQgZGVsdGEgZnJvbSB0aGUgcHJldmlvdXMgbGluZSwgYW5kIGFuIHVuc2lnbmVkCi0gICBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0aGlzIHN0YXRlbWVudCB0YWtlcy4KLQotICAgVGhlIGxvY2FsIHN5bWJvbCB0YWJsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkczoKLQotICAgIDEpCWlzczogaW5kZXggdG8gdGhlIGxvY2FsIHN0cmluZyB0YWJsZSBnaXZpbmcgdGhlIG5hbWUgb2YgdGhlCi0Jc3ltYm9sLgotCi0gICAgMikJdmFsdWU6IHZhbHVlIG9mIHRoZSBzeW1ib2wgKGFkZHJlc3MsIHJlZ2lzdGVyIG51bWJlciwgZXRjLikuCi0KLSAgICAzKQlzdDogc3ltYm9sIHR5cGUuICBUaGUgY3VycmVudCBzeW1ib2wgdHlwZXMgYXJlOgotCi0JICAgIHN0TmlsCSAgLS0gTnV0aGluJyBzcGVjaWFsCi0JICAgIHN0R2xvYmFsCSAgLS0gZXh0ZXJuYWwgc3ltYm9sCi0JICAgIHN0U3RhdGljCSAgLS0gc3RhdGljCi0JICAgIHN0UGFyYW0JICAtLSBwcm9jZWR1cmUgYXJndW1lbnQKLQkgICAgc3RMb2NhbAkgIC0tIGxvY2FsIHZhcmlhYmxlCi0JICAgIHN0TGFiZWwJICAtLSBsYWJlbAotCSAgICBzdFByb2MJICAtLSBFeHRlcm5hbCBQcm9jZWR1cmUKLQkgICAgc3RCbG9jawkgIC0tIGJlZ2lubmluZyBvZiBibG9jawotCSAgICBzdEVuZAkgIC0tIGVuZCAob2YgYW55dGhpbmcpCi0JICAgIHN0TWVtYmVyCSAgLS0gbWVtYmVyIChvZiBhbnl0aGluZykKLQkgICAgc3RUeXBlZGVmCSAgLS0gdHlwZSBkZWZpbml0aW9uCi0JICAgIHN0RmlsZQkgIC0tIGZpbGUgbmFtZQotCSAgICBzdFJlZ1JlbG9jCSAgLS0gcmVnaXN0ZXIgcmVsb2NhdGlvbgotCSAgICBzdEZvcndhcmQJICAtLSBmb3J3YXJkaW5nIGFkZHJlc3MKLQkgICAgc3RTdGF0aWNQcm9jICAtLSBTdGF0aWMgcHJvY2VkdXJlCi0JICAgIHN0Q29uc3RhbnQJICAtLSBjb25zdAotCi0gICAgNCkJc2M6IHN0b3JhZ2UgY2xhc3MuICBUaGUgY3VycmVudCBzdG9yYWdlIGNsYXNzZXMgYXJlOgotCi0JICAgIHNjVGV4dAkgIC0tIHRleHQgc3ltYm9sCi0JICAgIHNjRGF0YQkgIC0tIGluaXRpYWxpemVkIGRhdGEgc3ltYm9sCi0JICAgIHNjQnNzCSAgLS0gdW4taW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wKLQkgICAgc2NSZWdpc3RlcgkgIC0tIHZhbHVlIG9mIHN5bWJvbCBpcyByZWdpc3RlciBudW1iZXIKLQkgICAgc2NBYnMJICAtLSB2YWx1ZSBvZiBzeW1ib2wgaXMgYWJzb2x1dGUKLQkgICAgc2NVbmRlZmluZWQgICAtLSB3aG8ga25vd3M/Ci0JICAgIHNjQ2RiTG9jYWwJICAtLSB2YXJpYWJsZSdzIHZhbHVlIGlzIElOIHNlLT52YS4/PwotCSAgICBzY0JpdHMJICAtLSB0aGlzIGlzIGEgYml0IGZpZWxkCi0JICAgIHNjQ2RiU3lzdGVtCSAgLS0gdmFsdWUgaXMgSU4gZGVidWdnZXIncyBhZGRyZXNzIHNwYWNlCi0JICAgIHNjUmVnSW1hZ2UJICAtLSByZWdpc3RlciB2YWx1ZSBzYXZlZCBvbiBzdGFjawotCSAgICBzY0luZm8JICAtLSBzeW1ib2wgY29udGFpbnMgZGVidWdnZXIgaW5mb3JtYXRpb24KLQkgICAgc2NVc2VyU3RydWN0ICAtLSBhZGRyIGluIHN0cnVjdCB1c2VyIGZvciBjdXJyZW50IHByb2Nlc3MKLQkgICAgc2NTRGF0YQkgIC0tIGxvYWQgdGltZSBvbmx5IHNtYWxsIGRhdGEKLQkgICAgc2NTQnNzCSAgLS0gbG9hZCB0aW1lIG9ubHkgc21hbGwgY29tbW9uCi0JICAgIHNjUkRhdGEJICAtLSBsb2FkIHRpbWUgb25seSByZWFkIG9ubHkgZGF0YQotCSAgICBzY1ZhcgkgIC0tIFZhciBwYXJhbWV0ZXIgKGZvcnRyYW5wYXNjYWwpCi0JICAgIHNjQ29tbW9uCSAgLS0gY29tbW9uIHZhcmlhYmxlCi0JICAgIHNjU0NvbW1vbgkgIC0tIHNtYWxsIGNvbW1vbgotCSAgICBzY1ZhclJlZ2lzdGVyIC0tIFZhciBwYXJhbWV0ZXIgaW4gYSByZWdpc3RlcgotCSAgICBzY1ZhcmlhbnQJICAtLSBWYXJpYW50IHJlY29yZAotCSAgICBzY1NVbmRlZmluZWQgIC0tIHNtYWxsIHVuZGVmaW5lZChleHRlcm5hbCkgZGF0YQotCSAgICBzY0luaXQJICAtLSAuaW5pdCBzZWN0aW9uIHN5bWJvbAotCi0gICAgNSkJaW5kZXg6IHBvaW50ZXIgdG8gYSBsb2NhbCBzeW1ib2wgb3IgYXV4LiBlbnRyeS4KLQotCi0KLSAgIEZvciB0aGUgZm9sbG93aW5nIHByb2dyYW06Ci0KLQkjaW5jbHVkZSA8c3RkaW8uaD4KLQotCW1haW4oKXsKLQkJcHJpbnRmKCJIZWxsbyBXb3JsZCFcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLSAgIE1pcHMtdGR1bXAgcHJvZHVjZXMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKLQotICAgR2xvYmFsIGZpbGUgaGVhZGVyOgotICAgICAgIG1hZ2ljIG51bWJlciAgICAgICAgICAgICAweDE2MgotICAgICAgICMgc2VjdGlvbnMgICAgICAgICAgICAgICAyCi0gICAgICAgdGltZXN0YW1wICAgICAgICAgICAgICAgIDY0NTMxMTc5OSwgV2VkIEp1biAxMyAxNzoxNjozOSAxOTkwCi0gICAgICAgc3ltYm9saWMgaGVhZGVyIG9mZnNldCAgIDI4NAotICAgICAgIHN5bWJvbGljIGhlYWRlciBzaXplICAgICA5NgotICAgICAgIG9wdGlvbmFsIGhlYWRlciAgICAgICAgICA1NgotICAgICAgIGZsYWdzICAgICAgICAgICAgICAgICAgICAweDAKLQotICAgU3ltYm9saWMgaGVhZGVyLCBtYWdpYyBudW1iZXIgPSAweDcwMDksIHZzdGFtcCA9IDEuMzE6Ci0KLSAgICAgICBJbmZvICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgIE51bWJlciAgICAgICBCeXRlcwotICAgICAgID09PT0gICAgICAgICAgICAgICAgICAgICAgPT09PT09ICAgICAgPT09PT09ICAgICAgPT09PT0KLQotICAgICAgIExpbmUgbnVtYmVycyAgICAgICAgICAgICAgICAgMzgwICAgICAgICAgICA0ICAgICAgICAgICA0IFsxM10KLSAgICAgICBEZW5zZSBudW1iZXJzICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMAotICAgICAgIFByb2NlZHVyZXMgVGFibGVzICAgICAgICAgICAgMzg0ICAgICAgICAgICAxICAgICAgICAgIDUyCi0gICAgICAgTG9jYWwgU3ltYm9scyAgICAgICAgICAgICAgICA0MzYgICAgICAgICAgMTYgICAgICAgICAxOTIKLSAgICAgICBPcHRpbWl6YXRpb24gU3ltYm9scyAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMAotICAgICAgIEF1eGlsaWFyeSBTeW1ib2xzICAgICAgICAgICAgNjI4ICAgICAgICAgIDM5ICAgICAgICAgMTU2Ci0gICAgICAgTG9jYWwgU3RyaW5ncyAgICAgICAgICAgICAgICA3ODQgICAgICAgICAgODAgICAgICAgICAgODAKLSAgICAgICBFeHRlcm5hbCBTdHJpbmdzICAgICAgICAgICAgIDg2NCAgICAgICAgIDE0NCAgICAgICAgIDE0NAotICAgICAgIEZpbGUgVGFibGVzICAgICAgICAgICAgICAgICAxMDA4ICAgICAgICAgICAyICAgICAgICAgMTQ0Ci0gICAgICAgUmVsYXRpdmUgRmlsZXMgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAKLSAgICAgICBFeHRlcm5hbCBTeW1ib2xzICAgICAgICAgICAgMTE1MiAgICAgICAgICAyMCAgICAgICAgIDMyMAotCi0gICBGaWxlICMwLCAiaGVsbG8yLmMiCi0KLSAgICAgICBOYW1lIGluZGV4ICA9IDEgICAgICAgICAgUmVhZGluICAgICAgPSBObwotICAgICAgIE1lcmdlICAgICAgID0gTm8gICAgICAgICBFbmRpYW4gICAgICA9IExJVFRMRQotICAgICAgIERlYnVnIGxldmVsID0gRzIgICAgICAgICBMYW5ndWFnZSAgICA9IEMKLSAgICAgICBBZHIgICAgICAgICA9IDB4MDAwMDAwMDAKLQotICAgICAgIEluZm8gICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ICAgICAgTnVtYmVyICAgICAgICBTaXplICAgICAgT2Zmc2V0Ci0gICAgICAgPT09PSAgICAgICAgICAgICAgICAgICAgICAgPT09PT0gICAgICA9PT09PT0gICAgICAgID09PT0gICAgICA9PT09PT0KLSAgICAgICBMb2NhbCBzdHJpbmdzICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAxNSAgICAgICAgICAxNSAgICAgICAgIDc4NAotICAgICAgIExvY2FsIHN5bWJvbHMgICAgICAgICAgICAgICAgICAwICAgICAgICAgICA2ICAgICAgICAgIDcyICAgICAgICAgNDM2Ci0gICAgICAgTGluZSBudW1iZXJzICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgMTMgICAgICAgICAgMTMgICAgICAgICAzODAKLSAgICAgICBPcHRpbWl6YXRpb24gc3ltYm9scyAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMAotICAgICAgIFByb2NlZHVyZXMgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAxICAgICAgICAgIDUyICAgICAgICAgMzg0Ci0gICAgICAgQXV4aWxpYXJ5IHN5bWJvbHMgICAgICAgICAgICAgIDAgICAgICAgICAgMTQgICAgICAgICAgNTYgICAgICAgICA2MjgKLSAgICAgICBSZWxhdGl2ZSBGaWxlcyAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMAotCi0gICAgVGhlcmUgYXJlIDYgbG9jYWwgc3ltYm9scywgc3RhcnRpbmcgYXQgNDM2Ci0KLQlTeW1ib2wjIDA6ICJoZWxsbzIuYyIKLQkgICAgRW5kKzEgc3ltYm9sICA9IDYKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDYKLQkgICAgU3ltYm9sIHR5cGUgICA9IEZpbGUgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTogIm1haW4iCi0JICAgIEVuZCsxIHN5bWJvbCAgPSA1Ci0JICAgIFR5cGUgICAgICAgICAgPSBpbnQKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAxMgotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAyOiAiIgotCSAgICBFbmQrMSBzeW1ib2wgID0gNAotCSAgICBTdHJpbmcgaW5kZXggID0gMAotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gNAotCSAgICBTeW1ib2wgdHlwZSAgID0gQmxvY2sgICAgICAgVmFsdWUgID0gOAotCi0JU3ltYm9sIyAzOiAiIgotCSAgICBGaXJzdCBzeW1ib2wgID0gMgotCSAgICBTdHJpbmcgaW5kZXggID0gMAotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gMgotCSAgICBTeW1ib2wgdHlwZSAgID0gRW5kICAgICAgICAgVmFsdWUgID0gMjgKLQotCVN5bWJvbCMgNDogIm1haW4iCi0JICAgIEZpcnN0IHN5bWJvbCAgPSAxCi0JICAgIFN0cmluZyBpbmRleCAgPSAxMAotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gMQotCSAgICBTeW1ib2wgdHlwZSAgID0gRW5kICAgICAgICAgVmFsdWUgID0gNTIKLQotCVN5bWJvbCMgNTogImhlbGxvMi5jIgotCSAgICBGaXJzdCBzeW1ib2wgID0gMAotCSAgICBTdHJpbmcgaW5kZXggID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gMAotCSAgICBTeW1ib2wgdHlwZSAgID0gRW5kICAgICAgICAgVmFsdWUgID0gMAotCi0gICAgVGhlcmUgYXJlIDE0IGF1eGlsaWFyeSB0YWJsZSBlbnRyaWVzLCBzdGFydGluZyBhdCA2MjguCi0KLQkqICMwICAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMSAgICAgICAgICAgICAgMjQsIFsgIDI0LyAgICAgIDBdLCBbIDYgMDowIDA6MDowOjA6MDowXQotCSogIzIgICAgICAgICAgICAgICA4LCBbICAgOC8gICAgICAwXSwgWyAyIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzICAgICAgICAgICAgICAxNiwgWyAgMTYvICAgICAgMF0sIFsgNCAwOjAgMDowOjA6MDowOjBdCi0JKiAjNCAgICAgICAgICAgICAgMjQsIFsgIDI0LyAgICAgIDBdLCBbIDYgMDowIDA6MDowOjA6MDowXQotCSogIzUgICAgICAgICAgICAgIDMyLCBbICAzMi8gICAgICAwXSwgWyA4IDA6MCAwOjA6MDowOjA6MF0KLQkqICM2ICAgICAgICAgICAgICA0MCwgWyAgNDAvICAgICAgMF0sIFsxMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjNyAgICAgICAgICAgICAgNDQsIFsgIDQ0LyAgICAgIDBdLCBbMTEgMDowIDA6MDowOjA6MDowXQotCSogIzggICAgICAgICAgICAgIDEyLCBbICAxMi8gICAgICAwXSwgWyAzIDA6MCAwOjA6MDowOjA6MF0KLQkqICM5ICAgICAgICAgICAgICAyMCwgWyAgMjAvICAgICAgMF0sIFsgNSAwOjAgMDowOjA6MDowOjBdCi0JKiAjMTAgICAgICAgICAgICAgMjgsIFsgIDI4LyAgICAgIDBdLCBbIDcgMDowIDA6MDowOjA6MDowXQotCSogIzExICAgICAgICAgICAgIDM2LCBbICAzNi8gICAgICAwXSwgWyA5IDA6MCAwOjA6MDowOjA6MF0KLQkgICMxMiAgICAgICAgICAgICAgNSwgWyAgIDUvICAgICAgMF0sIFsgMSAxOjAgMDowOjA6MDowOjBdCi0JICAjMTMgICAgICAgICAgICAgMjQsIFsgIDI0LyAgICAgIDBdLCBbIDYgMDowIDA6MDowOjA6MDowXQotCi0gICAgVGhlcmUgYXJlIDEgcHJvY2VkdXJlIGRlc2NyaXB0b3IgZW50cmllcywgc3RhcnRpbmcgYXQgMC4KLQotCVByb2NlZHVyZSBkZXNjcmlwdG9yIDA6Ci0JICAgIE5hbWUgaW5kZXggICA9IDEwICAgICAgICAgIE5hbWUgICAgICAgICAgPSAibWFpbiIKLQkgICAgLm1hc2sgMHg4MDAwMDAwMCwtNCAgICAgICAgLmZtYXNrIDB4MDAwMDAwMDAsMAotCSAgICAuZnJhbWUgJDI5LDI0LCQzMQotCSAgICBPcHQuIHN0YXJ0ICAgPSAtMSAgICAgICAgICBTeW1ib2xzIHN0YXJ0ID0gMQotCSAgICBGaXJzdCBsaW5lICMgPSAzICAgICAgICAgICBMYXN0IGxpbmUgIyAgID0gNgotCSAgICBMaW5lIE9mZnNldCAgPSAwICAgICAgICAgICBBZGRyZXNzICAgICAgID0gMHgwMDAwMDAwMAotCi0JVGhlcmUgYXJlIDQgYnl0ZXMgaG9sZGluZyBsaW5lIG51bWJlcnMsIHN0YXJ0aW5nIGF0IDM4MC4KLQkgICAgTGluZSAgICAgICAgICAgMywgICBkZWx0YSAgICAgMCwgICBjb3VudCAgMgotCSAgICBMaW5lICAgICAgICAgICA0LCAgIGRlbHRhICAgICAxLCAgIGNvdW50ICAzCi0JICAgIExpbmUgICAgICAgICAgIDUsICAgZGVsdGEgICAgIDEsICAgY291bnQgIDIKLQkgICAgTGluZSAgICAgICAgICAgNiwgICBkZWx0YSAgICAgMSwgICBjb3VudCAgNgotCi0gICBGaWxlICMxLCAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiCi0KLSAgICBOYW1lIGluZGV4ICA9IDEgICAgICAgICAgUmVhZGluICAgICAgPSBObwotICAgIE1lcmdlICAgICAgID0gWWVzICAgICAgICBFbmRpYW4gICAgICA9IExJVFRMRQotICAgIERlYnVnIGxldmVsID0gRzIgICAgICAgICBMYW5ndWFnZSAgICA9IEMKLSAgICBBZHIgICAgICAgICA9IDB4MDAwMDAwMDAKLQotICAgIEluZm8gICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ICAgICAgTnVtYmVyICAgICAgICBTaXplICAgICAgT2Zmc2V0Ci0gICAgPT09PSAgICAgICAgICAgICAgICAgICAgICAgPT09PT0gICAgICA9PT09PT0gICAgICAgID09PT0gICAgICA9PT09PT0KLSAgICBMb2NhbCBzdHJpbmdzICAgICAgICAgICAgICAgICAxNSAgICAgICAgICA2NSAgICAgICAgICA2NSAgICAgICAgIDc5OQotICAgIExvY2FsIHN5bWJvbHMgICAgICAgICAgICAgICAgICA2ICAgICAgICAgIDEwICAgICAgICAgMTIwICAgICAgICAgNTA4Ci0gICAgTGluZSBudW1iZXJzICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAzODAKLSAgICBPcHRpbWl6YXRpb24gc3ltYm9scyAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMAotICAgIFByb2NlZHVyZXMgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgNDM2Ci0gICAgQXV4aWxpYXJ5IHN5bWJvbHMgICAgICAgICAgICAgMTQgICAgICAgICAgMjUgICAgICAgICAxMDAgICAgICAgICA2ODQKLSAgICBSZWxhdGl2ZSBGaWxlcyAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMAotCi0gICAgVGhlcmUgYXJlIDEwIGxvY2FsIHN5bWJvbHMsIHN0YXJ0aW5nIGF0IDQ0MgotCi0JU3ltYm9sIyAwOiAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiCi0JICAgIEVuZCsxIHN5bWJvbCAgPSAxMAotCSAgICBTdHJpbmcgaW5kZXggID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gMTAKLQkgICAgU3ltYm9sIHR5cGUgICA9IEZpbGUgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTogIl9pb2J1ZiIKLQkgICAgRW5kKzEgc3ltYm9sICA9IDkKLQkgICAgU3RyaW5nIGluZGV4ICA9IDIyCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSA5Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBCbG9jayAgICAgICBWYWx1ZSAgPSAyMAotCi0JU3ltYm9sIyAyOiAiX2NudCIKLQkgICAgVHlwZSAgICAgICAgICA9IGludAotCSAgICBTdHJpbmcgaW5kZXggID0gMjkKLQkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDQKLQkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMzogIl9wdHIiCi0JICAgIFR5cGUgICAgICAgICAgPSBwdHIgdG8gY2hhcgotCSAgICBTdHJpbmcgaW5kZXggID0gMzQKLQkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDE1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBNZW1iZXIgICAgICBWYWx1ZSAgPSAzMgotCi0JU3ltYm9sIyA0OiAiX2Jhc2UiCi0JICAgIFR5cGUgICAgICAgICAgPSBwdHIgdG8gY2hhcgotCSAgICBTdHJpbmcgaW5kZXggID0gMzkKLQkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDE2Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBNZW1iZXIgICAgICBWYWx1ZSAgPSA2NAotCi0JU3ltYm9sIyA1OiAiX2J1ZnNpeiIKLQkgICAgVHlwZSAgICAgICAgICA9IGludAotCSAgICBTdHJpbmcgaW5kZXggID0gNDUKLQkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDQKLQkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDk2Ci0KLQlTeW1ib2wjIDY6ICJfZmxhZyIKLQkgICAgVHlwZSAgICAgICAgICA9IHNob3J0Ci0JICAgIFN0cmluZyBpbmRleCAgPSA1MwotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMwotCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gMTI4Ci0KLQlTeW1ib2wjIDc6ICJfZmlsZSIKLQkgICAgVHlwZSAgICAgICAgICA9IGNoYXIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDU5Ci0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSAyCi0JICAgIFN5bWJvbCB0eXBlICAgPSBNZW1iZXIgICAgICBWYWx1ZSAgPSAxNDQKLQotCVN5bWJvbCMgODogIiIKLQkgICAgRmlyc3Qgc3ltYm9sICA9IDEKLQkgICAgU3RyaW5nIGluZGV4ICA9IDAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDEKLQkgICAgU3ltYm9sIHR5cGUgICA9IEVuZCAgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgOTogIi91c3IvaW5jbHVkZS9zdGRpby5oIgotCSAgICBGaXJzdCBzeW1ib2wgID0gMAotCSAgICBTdHJpbmcgaW5kZXggID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gMAotCSAgICBTeW1ib2wgdHlwZSAgID0gRW5kICAgICAgICAgVmFsdWUgID0gMAotCi0gICAgVGhlcmUgYXJlIDI1IGF1eGlsaWFyeSB0YWJsZSBlbnRyaWVzLCBzdGFydGluZyBhdCA2NDIuCi0KLQkqICMxNCAgICAgICAgICAgICAtMSwgWzQwOTUvMTA0ODU3NV0sIFs2MyAxOjEgZjpmOmY6ZjpmOmZdCi0JICAjMTUgICAgICAgICAgNjU1NDQsIFsgICA4LyAgICAgMTZdLCBbIDIgMDowIDE6MDowOjA6MDowXQotCSAgIzE2ICAgICAgICAgIDY1NTQ0LCBbICAgOC8gICAgIDE2XSwgWyAyIDA6MCAxOjA6MDowOjA6MF0KLQkqICMxNyAgICAgICAgIDE5NjY1NiwgWyAgNDgvICAgICA0OF0sIFsxMiAwOjAgMzowOjA6MDowOjBdCi0JKiAjMTggICAgICAgICAgIDgxOTEsIFs0MDk1LyAgICAgIDFdLCBbNjMgMToxIDA6MDowOjA6ZjoxXQotCSogIzE5ICAgICAgICAgICAgICAxLCBbICAgMS8gICAgICAwXSwgWyAwIDE6MCAwOjA6MDowOjA6MF0KLQkqICMyMCAgICAgICAgICAyMDQ3OSwgWzQwOTUvICAgICAgNF0sIFs2MyAxOjEgMDowOjA6MDpmOjRdCi0JKiAjMjEgICAgICAgICAgICAgIDEsIFsgICAxLyAgICAgIDBdLCBbIDAgMTowIDA6MDowOjA6MDowXQotCSogIzIyICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMyMyAgICAgICAgICAgICAgMiwgWyAgIDIvICAgICAgMF0sIFsgMCAwOjEgMDowOjA6MDowOjBdCi0JKiAjMjQgICAgICAgICAgICAxNjAsIFsgMTYwLyAgICAgIDBdLCBbNDAgMDowIDA6MDowOjA6MDowXQotCSogIzI1ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMyNiAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMjcgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzI4ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMyOSAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzAgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzMxICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzMiAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzMgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzM0ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzNSAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzYgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzM3ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzOCAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0KLSAgICBUaGVyZSBhcmUgMCBwcm9jZWR1cmUgZGVzY3JpcHRvciBlbnRyaWVzLCBzdGFydGluZyBhdCAxLgotCi0gICBUaGVyZSBhcmUgMjAgZXh0ZXJuYWwgc3ltYm9scywgc3RhcnRpbmcgYXQgMTE1MgotCi0JU3ltYm9sIyAwOiAiX2lvYiIKLQkgICAgVHlwZSAgICAgICAgICA9IGFycmF5IFszIHsxNjB9XSBvZiBzdHJ1Y3QgX2lvYnVmIHsgaWZkID0gMSwgaW5kZXggPSAxIH0KLQkgICAgU3RyaW5nIGluZGV4ICA9IDAgICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDE3Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBHbG9iYWwgICAgICBWYWx1ZSAgPSA2MAotCi0JU3ltYm9sIyAxOiAiZm9wZW4iCi0JICAgIFN0cmluZyBpbmRleCAgPSA1ICAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDI6ICJmZG9wZW4iCi0JICAgIFN0cmluZyBpbmRleCAgPSAxMSAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDM6ICJmcmVvcGVuIgotCSAgICBTdHJpbmcgaW5kZXggID0gMTggICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyA0OiAicG9wZW4iCi0JICAgIFN0cmluZyBpbmRleCAgPSAyNiAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDU6ICJ0bXBmaWxlIgotCSAgICBTdHJpbmcgaW5kZXggID0gMzIgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyA2OiAiZnRlbGwiCi0JICAgIFN0cmluZyBpbmRleCAgPSA0MCAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDc6ICJyZXdpbmQiCi0JICAgIFN0cmluZyBpbmRleCAgPSA0NiAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDg6ICJzZXRidWYiCi0JICAgIFN0cmluZyBpbmRleCAgPSA1MyAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDk6ICJzZXRidWZmZXIiCi0JICAgIFN0cmluZyBpbmRleCAgPSA2MCAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDEwOiAic2V0bGluZWJ1ZiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDcwICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTE6ICJmZ2V0cyIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDgxICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTI6ICJnZXRzIgotCSAgICBTdHJpbmcgaW5kZXggID0gODcgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxMzogImN0ZXJtaWQiCi0JICAgIFN0cmluZyBpbmRleCAgPSA5MiAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE0OiAiY3VzZXJpZCIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEwMCAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTU6ICJ0ZW1wbmFtIgotCSAgICBTdHJpbmcgaW5kZXggID0gMTA4ICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxNjogInRtcG5hbSIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDExNiAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTc6ICJzcHJpbnRmIgotCSAgICBTdHJpbmcgaW5kZXggID0gMTIzICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxODogIm1haW4iCi0JICAgIFR5cGUgICAgICAgICAgPSBpbnQKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEzMSAgICAgICAgIElmZCAgICA9IDAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDEKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTk6ICJwcmludGYiCi0JICAgIFN0cmluZyBpbmRleCAgPSAxMzYgICAgICAgICBJZmQgICAgPSAwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBVbmRlZmluZWQgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLSAgIFRoZSBmb2xsb3dpbmcgYXV4aWxpYXJ5IHRhYmxlIGVudHJpZXMgd2VyZSB1bnVzZWQ6Ci0KLSAgICAjMCAgICAgICAgICAgICAgIDAgIDB4MDAwMDAwMDAgIHZvaWQKLSAgICAjMiAgICAgICAgICAgICAgIDggIDB4MDAwMDAwMDggIGNoYXIKLSAgICAjMyAgICAgICAgICAgICAgMTYgIDB4MDAwMDAwMTAgIHNob3J0Ci0gICAgIzQgICAgICAgICAgICAgIDI0ICAweDAwMDAwMDE4ICBpbnQKLSAgICAjNSAgICAgICAgICAgICAgMzIgIDB4MDAwMDAwMjAgIGxvbmcKLSAgICAjNiAgICAgICAgICAgICAgNDAgIDB4MDAwMDAwMjggIGZsb2F0Ci0gICAgIzcgICAgICAgICAgICAgIDQ0ICAweDAwMDAwMDJjICBkb3VibGUKLSAgICAjOCAgICAgICAgICAgICAgMTIgIDB4MDAwMDAwMGMgIHVuc2lnbmVkIGNoYXIKLSAgICAjOSAgICAgICAgICAgICAgMjAgIDB4MDAwMDAwMTQgIHVuc2lnbmVkIHNob3J0Ci0gICAgIzEwICAgICAgICAgICAgIDI4ICAweDAwMDAwMDFjICB1bnNpZ25lZCBpbnQKLSAgICAjMTEgICAgICAgICAgICAgMzYgIDB4MDAwMDAwMjQgIHVuc2lnbmVkIGxvbmcKLSAgICAjMTQgICAgICAgICAgICAgIDAgIDB4MDAwMDAwMDAgIHZvaWQKLSAgICAjMTUgICAgICAgICAgICAgMjQgIDB4MDAwMDAwMTggIGludAotICAgICMxOSAgICAgICAgICAgICAzMiAgMHgwMDAwMDAyMCAgbG9uZwotICAgICMyMCAgICAgICAgICAgICA0MCAgMHgwMDAwMDAyOCAgZmxvYXQKLSAgICAjMjEgICAgICAgICAgICAgNDQgIDB4MDAwMDAwMmMgIGRvdWJsZQotICAgICMyMiAgICAgICAgICAgICAxMiAgMHgwMDAwMDAwYyAgdW5zaWduZWQgY2hhcgotICAgICMyMyAgICAgICAgICAgICAyMCAgMHgwMDAwMDAxNCAgdW5zaWduZWQgc2hvcnQKLSAgICAjMjQgICAgICAgICAgICAgMjggIDB4MDAwMDAwMWMgIHVuc2lnbmVkIGludAotICAgICMyNSAgICAgICAgICAgICAzNiAgMHgwMDAwMDAyNCAgdW5zaWduZWQgbG9uZwotICAgICMyNiAgICAgICAgICAgICA0OCAgMHgwMDAwMDAzMCAgc3RydWN0IG5vIG5hbWUgeyBpZmQgPSAtMSwgaW5kZXggPSAxMDQ4NTc1IH0KLSovCi0MCi0vKiBSZWRlZmluaXRpb24gb2Ygb2Ygc3RvcmFnZSBjbGFzc2VzIGFzIGFuIGVudW1lcmF0aW9uIGZvciBiZXR0ZXIKLSAgIGRlYnVnZ2luZy4gICovCi0KLXR5cGVkZWYgZW51bSBzYyB7Ci0gIHNjX05pbAkgPSBzY05pbCwJICAvKiBubyBzdG9yYWdlIGNsYXNzICovCi0gIHNjX1RleHQJID0gc2NUZXh0LAkgIC8qIHRleHQgc3ltYm9sICovCi0gIHNjX0RhdGEJID0gc2NEYXRhLAkgIC8qIGluaXRpYWxpemVkIGRhdGEgc3ltYm9sICovCi0gIHNjX0JzcwkgPSBzY0JzcywJICAvKiB1bi1pbml0aWFsaXplZCBkYXRhIHN5bWJvbCAqLwotICBzY19SZWdpc3RlcgkgPSBzY1JlZ2lzdGVyLAkgIC8qIHZhbHVlIG9mIHN5bWJvbCBpcyByZWdpc3RlciBudW1iZXIgKi8KLSAgc2NfQWJzCSA9IHNjQWJzLAkgIC8qIHZhbHVlIG9mIHN5bWJvbCBpcyBhYnNvbHV0ZSAqLwotICBzY19VbmRlZmluZWQJID0gc2NVbmRlZmluZWQsCSAgLyogd2hvIGtub3dzPyAqLwotICBzY19DZGJMb2NhbAkgPSBzY0NkYkxvY2FsLAkgIC8qIHZhcmlhYmxlJ3MgdmFsdWUgaXMgSU4gc2UtPnZhLj8/ICovCi0gIHNjX0JpdHMJID0gc2NCaXRzLAkgIC8qIHRoaXMgaXMgYSBiaXQgZmllbGQgKi8KLSAgc2NfQ2RiU3lzdGVtCSA9IHNjQ2RiU3lzdGVtLAkgIC8qIHZhbHVlIGlzIElOIENEQidzIGFkZHJlc3Mgc3BhY2UgKi8KLSAgc2NfUmVnSW1hZ2UJID0gc2NSZWdJbWFnZSwJICAvKiByZWdpc3RlciB2YWx1ZSBzYXZlZCBvbiBzdGFjayAqLwotICBzY19JbmZvCSA9IHNjSW5mbywJICAvKiBzeW1ib2wgY29udGFpbnMgZGVidWdnZXIgaW5mb3JtYXRpb24gKi8KLSAgc2NfVXNlclN0cnVjdAkgPSBzY1VzZXJTdHJ1Y3QsICAvKiBhZGRyIGluIHN0cnVjdCB1c2VyIGZvciBjdXJyZW50IHByb2Nlc3MgKi8KLSAgc2NfU0RhdGEJID0gc2NTRGF0YSwJICAvKiBsb2FkIHRpbWUgb25seSBzbWFsbCBkYXRhICovCi0gIHNjX1NCc3MJID0gc2NTQnNzLAkgIC8qIGxvYWQgdGltZSBvbmx5IHNtYWxsIGNvbW1vbiAqLwotICBzY19SRGF0YQkgPSBzY1JEYXRhLAkgIC8qIGxvYWQgdGltZSBvbmx5IHJlYWQgb25seSBkYXRhICovCi0gIHNjX1ZhcgkgPSBzY1ZhciwJICAvKiBWYXIgcGFyYW1ldGVyIChmb3J0cmFuLHBhc2NhbCkgKi8KLSAgc2NfQ29tbW9uCSA9IHNjQ29tbW9uLAkgIC8qIGNvbW1vbiB2YXJpYWJsZSAqLwotICBzY19TQ29tbW9uCSA9IHNjU0NvbW1vbiwJICAvKiBzbWFsbCBjb21tb24gKi8KLSAgc2NfVmFyUmVnaXN0ZXIgPSBzY1ZhclJlZ2lzdGVyLCAvKiBWYXIgcGFyYW1ldGVyIGluIGEgcmVnaXN0ZXIgKi8KLSAgc2NfVmFyaWFudAkgPSBzY1ZhcmlhbnQsCSAgLyogVmFyaWFudCByZWNvcmQgKi8KLSAgc2NfU1VuZGVmaW5lZAkgPSBzY1NVbmRlZmluZWQsICAvKiBzbWFsbCB1bmRlZmluZWQoZXh0ZXJuYWwpIGRhdGEgKi8KLSAgc2NfSW5pdAkgPSBzY0luaXQsCSAgLyogLmluaXQgc2VjdGlvbiBzeW1ib2wgKi8KLSAgc2NfTWF4CSA9IHNjTWF4CSAgLyogTWF4IHN0b3JhZ2UgY2xhc3MrMSAqLwotfSBzY190OwotCi0vKiBSZWRlZmluaXRpb24gb2Ygc3ltYm9sIHR5cGUuICAqLwotCi10eXBlZGVmIGVudW0gc3QgewotICBzdF9OaWwJPSBzdE5pbCwJLyogTnV0aGluJyBzcGVjaWFsICovCi0gIHN0X0dsb2JhbAk9IHN0R2xvYmFsLAkvKiBleHRlcm5hbCBzeW1ib2wgKi8KLSAgc3RfU3RhdGljCT0gc3RTdGF0aWMsCS8qIHN0YXRpYyAqLwotICBzdF9QYXJhbQk9IHN0UGFyYW0sCS8qIHByb2NlZHVyZSBhcmd1bWVudCAqLwotICBzdF9Mb2NhbAk9IHN0TG9jYWwsCS8qIGxvY2FsIHZhcmlhYmxlICovCi0gIHN0X0xhYmVsCT0gc3RMYWJlbCwJLyogbGFiZWwgKi8KLSAgc3RfUHJvYwk9IHN0UHJvYywJLyogICAgICIgICAgICAiCSBQcm9jZWR1cmUgKi8KLSAgc3RfQmxvY2sJPSBzdEJsb2NrLAkvKiBiZWdpbm5pbmcgb2YgYmxvY2sgKi8KLSAgc3RfRW5kCT0gc3RFbmQsCS8qIGVuZCAob2YgYW55dGhpbmcpICovCi0gIHN0X01lbWJlcgk9IHN0TWVtYmVyLAkvKiBtZW1iZXIgKG9mIGFueXRoaW5nCS0gc3RydWN0L3VuaW9uL2VudW0gKi8KLSAgc3RfVHlwZWRlZgk9IHN0VHlwZWRlZiwJLyogdHlwZSBkZWZpbml0aW9uICovCi0gIHN0X0ZpbGUJPSBzdEZpbGUsCS8qIGZpbGUgbmFtZSAqLwotICBzdF9SZWdSZWxvYwk9IHN0UmVnUmVsb2MsCS8qIHJlZ2lzdGVyIHJlbG9jYXRpb24gKi8KLSAgc3RfRm9yd2FyZAk9IHN0Rm9yd2FyZCwJLyogZm9yd2FyZGluZyBhZGRyZXNzICovCi0gIHN0X1N0YXRpY1Byb2MJPSBzdFN0YXRpY1Byb2MsCS8qIGxvYWQgdGltZSBvbmx5IHN0YXRpYyBwcm9jcyAqLwotICBzdF9Db25zdGFudAk9IHN0Q29uc3RhbnQsCS8qIGNvbnN0ICovCi0gIHN0X1N0cgk9IHN0U3RyLAkvKiBzdHJpbmcgKi8KLSAgc3RfTnVtYmVyCT0gc3ROdW1iZXIsCS8qIHB1cmUgbnVtYmVyIChpZS4gNCBOT1IgMisyKSAqLwotICBzdF9FeHByCT0gc3RFeHByLAkvKiAyKzIgdnMuIDQgKi8KLSAgc3RfVHlwZQk9IHN0VHlwZSwJLyogcG9zdC1jb2VyY2lvbiBTRVIgKi8KLSAgc3RfTWF4CT0gc3RNYXgJCS8qIG1heCB0eXBlKzEgKi8KLX0gc3RfdDsKLQotLyogUmVkZWZpbml0aW9uIG9mIHR5cGUgcXVhbGlmaWVycy4gICovCi0KLXR5cGVkZWYgZW51bSB0cSB7Ci0gIHRxX05pbAk9IHRxTmlsLAkvKiBidCBpcyB3aGF0IHlvdSBzZWUgKi8KLSAgdHFfUHRyCT0gdHFQdHIsCS8qIHBvaW50ZXIgKi8KLSAgdHFfUHJvYwk9IHRxUHJvYywJLyogcHJvY2VkdXJlICovCi0gIHRxX0FycmF5CT0gdHFBcnJheSwJLyogZHVoICovCi0gIHRxX0Zhcgk9IHRxRmFyLAkvKiBsb25nZXIgYWRkcmVzc2luZyAtIDgwODYvOCBsYW5kICovCi0gIHRxX1ZvbAk9IHRxVm9sLAkvKiB2b2xhdGlsZSAqLwotICB0cV9NYXgJPSB0cU1heAkJLyogTWF4IHR5cGUgcXVhbGlmaWVyKzEgKi8KLX0gdHFfdDsKLQotLyogUmVkZWZpbml0aW9uIG9mIGJhc2ljIHR5cGVzLiAgKi8KLQotdHlwZWRlZiBlbnVtIGJ0IHsKLSAgYnRfTmlsCT0gYnROaWwsCS8qIHVuZGVmaW5lZCAqLwotICBidF9BZHIJPSBidEFkciwJLyogYWRkcmVzcyAtIGludGVnZXIgc2FtZSBzaXplIGFzIHBvaW50ZXIgKi8KLSAgYnRfQ2hhcgk9IGJ0Q2hhciwJLyogY2hhcmFjdGVyICovCi0gIGJ0X1VDaGFyCT0gYnRVQ2hhciwJLyogdW5zaWduZWQgY2hhcmFjdGVyICovCi0gIGJ0X1Nob3J0CT0gYnRTaG9ydCwJLyogc2hvcnQgKi8KLSAgYnRfVVNob3J0CT0gYnRVU2hvcnQsCS8qIHVuc2lnbmVkIHNob3J0ICovCi0gIGJ0X0ludAk9IGJ0SW50LAkvKiBpbnQgKi8KLSAgYnRfVUludAk9IGJ0VUludCwJLyogdW5zaWduZWQgaW50ICovCi0gIGJ0X0xvbmcJPSBidExvbmcsCS8qIGxvbmcgKi8KLSAgYnRfVUxvbmcJPSBidFVMb25nLAkvKiB1bnNpZ25lZCBsb25nICovCi0gIGJ0X0Zsb2F0CT0gYnRGbG9hdCwJLyogZmxvYXQgKHJlYWwpICovCi0gIGJ0X0RvdWJsZQk9IGJ0RG91YmxlLAkvKiBEb3VibGUgKHJlYWwpICovCi0gIGJ0X1N0cnVjdAk9IGJ0U3RydWN0LAkvKiBTdHJ1Y3R1cmUgKFJlY29yZCkgKi8KLSAgYnRfVW5pb24JPSBidFVuaW9uLAkvKiBVbmlvbiAodmFyaWFudCkgKi8KLSAgYnRfRW51bQk9IGJ0RW51bSwJLyogRW51bWVyYXRlZCAqLwotICBidF9UeXBlZGVmCT0gYnRUeXBlZGVmLAkvKiBkZWZpbmVkIHZpYSBhIHR5cGVkZWYsIGlzeW1SZWYgcG9pbnRzICovCi0gIGJ0X1JhbmdlCT0gYnRSYW5nZSwJLyogc3VicmFuZ2Ugb2YgaW50ICovCi0gIGJ0X1NldAk9IGJ0U2V0LAkvKiBwYXNjYWwgc2V0cyAqLwotICBidF9Db21wbGV4CT0gYnRDb21wbGV4LAkvKiBmb3J0cmFuIGNvbXBsZXggKi8KLSAgYnRfRENvbXBsZXgJPSBidERDb21wbGV4LAkvKiBmb3J0cmFuIGRvdWJsZSBjb21wbGV4ICovCi0gIGJ0X0luZGlyZWN0CT0gYnRJbmRpcmVjdCwJLyogZm9yd2FyZCBvciB1bm5hbWVkIHR5cGVkZWYgKi8KLSAgYnRfRml4ZWREZWMJPSBidEZpeGVkRGVjLAkvKiBGaXhlZCBEZWNpbWFsICovCi0gIGJ0X0Zsb2F0RGVjCT0gYnRGbG9hdERlYywJLyogRmxvYXQgRGVjaW1hbCAqLwotICBidF9TdHJpbmcJPSBidFN0cmluZywJLyogVmFyeWluZyBMZW5ndGggQ2hhcmFjdGVyIFN0cmluZyAqLwotICBidF9CaXQJPSBidEJpdCwJLyogQWxpZ25lZCBCaXQgU3RyaW5nICovCi0gIGJ0X1BpY3R1cmUJPSBidFBpY3R1cmUsCS8qIFBpY3R1cmUgKi8KLSAgYnRfVm9pZAk9IGJ0Vm9pZCwJLyogVm9pZCAqLwotICBidF9NYXgJPSBidE1heAkJLyogTWF4IGJhc2ljIHR5cGUrMSAqLwotfSBidF90OwotCi0jZGVmaW5lIE5fVFEgaXRxTWF4Ci0KLS8qIFN0YXRlcyBmb3Igd2hldGhlciB0byBoYXNoIHR5cGUgb3Igbm90LiAgKi8KLXR5cGVkZWYgZW51bSBoYXNoX3N0YXRlIHsKLSAgaGFzaF9ubwk9IDAsCQkvKiBkb24ndCBoYXNoIHR5cGUgKi8KLSAgaGFzaF95ZXMJPSAxLAkJLyogb2sgdG8gaGFzaCB0eXBlLCBvciB1c2UgcHJldmlvdXMgaGFzaCAqLwotICBoYXNoX3JlY29yZAk9IDIJCS8qIG9rIHRvIHJlY29yZCBoYXNoLCBidXQgZG9uJ3QgdXNlIHByZXYuICovCi19IGhhc2hfc3RhdGVfdDsKLQotLyogVHlwZXMgb2YgZGlmZmVyZW50IHNpemVkIGFsbG9jYXRpb24gcmVxdWVzdHMuICAqLwotZW51bSBhbGxvY190eXBlIHsKLSAgYWxsb2NfdHlwZV9ub25lLAkJLyogZHVtbXkgdmFsdWUgKi8KLSAgYWxsb2NfdHlwZV9zY29wZSwJCS8qIG5lc3RlZCBzY29wZXMgbGlua2VkIGxpc3QgKi8KLSAgYWxsb2NfdHlwZV92bGlua3MsCQkvKiBnbHVlIGxpbmtpbmcgcGFnZXMgaW4gdmFycmF5ICovCi0gIGFsbG9jX3R5cGVfc2hhc2gsCQkvKiBzdHJpbmcgaGFzaCBlbGVtZW50ICovCi0gIGFsbG9jX3R5cGVfdGhhc2gsCQkvKiB0eXBlIGhhc2ggZWxlbWVudCAqLwotICBhbGxvY190eXBlX3RhZywJCS8qIHN0cnVjdC91bmlvbi90YWcgZWxlbWVudCAqLwotICBhbGxvY190eXBlX2ZvcndhcmQsCQkvKiBlbGVtZW50IHRvIGhvbGQgdW5rbm93biB0YWcgKi8KLSAgYWxsb2NfdHlwZV90aGVhZCwJCS8qIGhlYWQgb2YgdHlwZSBoYXNoIGxpc3QgKi8KLSAgYWxsb2NfdHlwZV92YXJyYXksCQkvKiBnZW5lcmFsIHZhcnJheSBhbGxvY2F0aW9uICovCi0gIGFsbG9jX3R5cGVfbGluZW5vLAkJLyogbGluZSBudW1iZXIgbGlzdCAqLwotICBhbGxvY190eXBlX2xhc3QJCS8qIGxhc3QrMSBlbGVtZW50IGZvciBhcnJheSBib3VuZHMgKi8KLX07Ci0KLS8qIFR5cGVzIG9mIGF1eGlsaWFyeSB0eXBlIGluZm9ybWF0aW9uLiAgKi8KLWVudW0gYXV4X3R5cGUgewotICBhdXhfdGlyLAkJCS8qIFRJUiB0eXBlIGluZm9ybWF0aW9uICovCi0gIGF1eF9ybmR4LAkJCS8qIHJlbGF0aXZlIGluZGV4IGludG8gc3ltYm9sIHRhYmxlICovCi0gIGF1eF9kbkxvdywJCQkvKiBsb3cgZGltZW5zaW9uICovCi0gIGF1eF9kbkhpZ2gsCQkJLyogaGlnaCBkaW1lbnNpb24gKi8KLSAgYXV4X2lzeW0sCQkJLyogc3ltYm9sIHRhYmxlIGluZGV4IChlbmQgb2YgcHJvYykgKi8KLSAgYXV4X2lzcywJCQkvKiBpbmRleCBpbnRvIHN0cmluZyBzcGFjZSAobm90IHVzZWQpICovCi0gIGF1eF93aWR0aCwJCQkvKiB3aWR0aCBmb3Igbm9uLWRlZmF1bHQgc2l6ZWQgc3RydWMgZmllbGRzICovCi0gIGF1eF9jb3VudAkJCS8qIGNvdW50IG9mIHJhbmdlcyBmb3IgdmFyaWFudCBhcm0gKi8KLX07Ci0MCi0vKiBTdHJ1Y3R1cmVzIHRvIHByb3ZpZGUgbi1udW1iZXIgb2YgdmlydHVhbCBhcnJheXMsIGVhY2ggb2Ygd2hpY2ggY2FuCi0gICBncm93IGxpbmVhcmx5LCBhbmQgd2hpY2ggYXJlIHdyaXR0ZW4gaW4gdGhlIG9iamVjdCBmaWxlIGFzCi0gICBzZXF1ZW50aWFsIHBhZ2VzLiAgT24gc3lzdGVtcyB3aXRoIGEgQlNEIG1hbGxvYywgdGhlCi0gICBNQVhfQ0xVU1RFUl9QQUdFUyBzaG91bGQgYmUgMSBsZXNzIHRoYW4gYSBwb3dlciBvZiB0d28sIHNpbmNlCi0gICBtYWxsb2MgYWRkcyBpdCdzIG92ZXJoZWFkLCBhbmQgcm91bmRzIHVwIHRvIHRoZSBuZXh0IHBvd2VyIG9mIDIuCi0gICBQYWdlcyBhcmUgbGlua2VkIHRvZ2V0aGVyIHZpYSBhIGxpbmtlZCBsaXN0LgotCi0gICBJZiBQQUdFX1NJWkUgaXMgPiA0MDk2LCB0aGUgc3RyaW5nIGxlbmd0aCBpbiB0aGUgc2hhc2hfdCBzdHJ1Y3R1cmUKLSAgIGNhbid0IGJlIHJlcHJlc2VudGVkIChhc3N1bWluZyB0aGVyZSBhcmUgc3RyaW5ncyA+IDQwOTYgYnl0ZXMpLiAgKi8KLQotLyogRklYTUU6IFllcywgdGhlcmUgY2FuIGJlIHN1Y2ggc3RyaW5ncyB3aGlsZSBlbWl0dGluZyBDKysgY2xhc3MgZGVidWcKLSAgIGluZm8uICBUZW1wbGF0ZXMgYXJlIHRoZSBvZmZlbmRlciBoZXJlLCB0aGUgdGVzdCBjYXNlIGluIHF1ZXN0aW9uIAotICAgaGF2aW5nIGEgbWFuZ2xlZCBjbGFzcyBuYW1lIG9mCi0KLSAgICAgdDdyYl90cmVlNFo0eGtleVp0NHBhaXIyWkM0eGtleVp0N3hzb2NrZXQxWjRVc2VyWnQ5c2VsZWN0MXN0Mlp0NHBhaXJcCi0gICAgIDJaQzR4a2V5WnQ3eHNvY2tldDFaNFVzZXJaNHhrZXladDRsZXNzMVo0eGtleQotCi0gICBSZXBlYXQgdGhhdCBhIGNvdXBsZSBkb3plbiB0aW1lcyB3aGlsZSBsaXN0aW5nIHRoZSBjbGFzcyBtZW1iZXJzIGFuZAotICAgeW91J3ZlIGdvdCBzdHJpbmdzIG92ZXIgNGsuICBIYWNrIGFyb3VuZCB0aGlzIGZvciBub3cgYnkgaW5jcmVhc2luZwotICAgdGhlIHBhZ2Ugc2l6ZS4gIEEgcHJvcGVyIHNvbHV0aW9uIHdvdWxkIGFiYW5kb24gdGhpcyBzdHJ1Y3R1cmUgc2NoZW1lCi0gICBjZXJ0YWlubHkgZm9yIHZlcnkgbGFyZ2Ugc3RyaW5ncywgYW5kIHBvc3NpYmx5IGVudGlyZWx5LiAgKi8KLQotI2lmbmRlZiBQQUdFX1NJWkUKLSNkZWZpbmUgUEFHRV9TSVpFICg4KjEwMjQpCS8qIHNpemUgb2YgdmFycmF5IHBhZ2VzICovCi0jZW5kaWYKLQotI2RlZmluZSBQQUdFX1VTSVpFICgodW5zaWduZWQgbG9uZykgUEFHRV9TSVpFKQotCi0jaWZuZGVmIE1BWF9DTFVTVEVSX1BBR0VTCS8qICMgcGFnZXMgdG8gZ2V0IGZyb20gc3lzdGVtICovCi0jZGVmaW5lIE1BWF9DTFVTVEVSX1BBR0VTIDYzCi0jZW5kaWYKLQotLyogTGlua2VkIGxpc3QgY29ubmVjdGluZyBzZXBhcmF0ZSBwYWdlIGFsbG9jYXRpb25zLiAgKi8KLXR5cGVkZWYgc3RydWN0IHZsaW5rcyB7Ci0gIHN0cnVjdCB2bGlua3MJKnByZXY7CQkvKiBwcmV2aW91cyBzZXQgb2YgcGFnZXMgKi8KLSAgc3RydWN0IHZsaW5rcyAqbmV4dDsJCS8qIG5leHQgc2V0IG9mIHBhZ2VzICovCi0gIHVuaW9uICBwYWdlICAgKmRhdHVtOwkJLyogc3RhcnQgb2YgcGFnZSAqLwotICB1bnNpZ25lZCBsb25nCSBzdGFydF9pbmRleDsJLyogc3RhcnRpbmcgaW5kZXggIyBvZiBwYWdlICovCi19IHZsaW5rc190OwotCi0KLS8qIFZpcnR1YWwgYXJyYXkgaGVhZGVyLiAgKi8KLXR5cGVkZWYgc3RydWN0IHZhcnJheSB7Ci0gIHZsaW5rc190CSpmaXJzdDsJCQkvKiBmaXJzdCBwYWdlIGxpbmsgKi8KLSAgdmxpbmtzX3QJKmxhc3Q7CQkJLyogbGFzdCBwYWdlIGxpbmsgKi8KLSAgdW5zaWduZWQgbG9uZwkgbnVtX2FsbG9jYXRlZDsJCS8qICMgb2JqZWN0cyBhbGxvY2F0ZWQgKi8KLSAgdW5zaWduZWQgc2hvcnQgb2JqZWN0X3NpemU7CQkvKiBzaXplIGluIGJ5dGVzIG9mIGVhY2ggb2JqZWN0ICovCi0gIHVuc2lnbmVkIHNob3J0IG9iamVjdHNfcGVyX3BhZ2U7CS8qICMgb2JqZWN0cyB0aGF0IGNhbiBmaXQgb24gYSBwYWdlICovCi0gIHVuc2lnbmVkIHNob3J0IG9iamVjdHNfbGFzdF9wYWdlOwkvKiAjIG9iamVjdHMgYWxsb2NhdGVkIG9uIGxhc3QgcGFnZSAqLwotfSB2YXJyYXlfdDsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLSNkZWZpbmUgT0JKRUNUU19QRVJfUEFHRSh0eXBlKSAoUEFHRV9TSVpFIC8gc2l6ZW9mICh0eXBlKSkKLSNlbHNlCi0jZGVmaW5lIE9CSkVDVFNfUEVSX1BBR0UodHlwZSkgKChzaXplb2YgKHR5cGUpID4gMSkgPyAxIDogUEFHRV9TSVpFKQotI2VuZGlmCi0KLSNkZWZpbmUgSU5JVF9WQVJSQVkodHlwZSkgewkvKiBtYWNybyB0byBpbml0aWFsaXplIGEgdmFycmF5ICovCVwKLSAgKHZsaW5rc190ICopMCwJCS8qIGZpcnN0ICovCQkJCVwKLSAgKHZsaW5rc190ICopMCwJCS8qIGxhc3QgKi8JCQkJXAotICAwLAkJCQkvKiBudW1fYWxsb2NhdGVkICovCQkJXAotICBzaXplb2YgKHR5cGUpLAkJLyogb2JqZWN0X3NpemUgKi8JCQlcCi0gIE9CSkVDVFNfUEVSX1BBR0UgKHR5cGUpLAkvKiBvYmplY3RzX3Blcl9wYWdlICovCQkJXAotICBPQkpFQ1RTX1BFUl9QQUdFICh0eXBlKSwJLyogb2JqZWN0c19sYXN0X3BhZ2UgKi8JCQlcCi19Ci0KLQotLyogTWFzdGVyIHR5cGUgZm9yIGluZGV4ZXMgd2l0aGluIHRoZSBzeW1ib2wgdGFibGUuICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgc3ltaW50X3Q7Ci0KLQotLyogTGlua2VkIGxpc3Qgc3VwcG9ydCBmb3IgbmVzdGVkIHNjb3BlcyAoZmlsZSwgYmxvY2ssIHN0cnVjdHVyZSwgZXRjLikuICAqLwotdHlwZWRlZiBzdHJ1Y3Qgc2NvcGUgewotICBzdHJ1Y3Qgc2NvcGUJKnByZXY7CQkvKiBwcmV2aW91cyBzY29wZSBsZXZlbCAqLwotICBzdHJ1Y3Qgc2NvcGUJKmZyZWU7CQkvKiBmcmVlIGxpc3QgcG9pbnRlciAqLwotICBzdHJ1Y3QgbG9jYWxzeW0gKmxzeW07CS8qIHBvaW50ZXIgdG8gbG9jYWwgc3ltYm9sIG5vZGUgKi8KLSAgc3RfdAkJIHR5cGU7CQkvKiB0eXBlIG9mIHRoZSBub2RlICovCi19IHNjb3BlX3Q7Ci0KLQotLyogRm9yIGEgbG9jYWwgc3ltYm9sIHdlIHN0b3JlIGEgZ2FzIHN5bWJvbCBhcyB3ZWxsIGFzIHRoZSBkZWJ1Z2dpbmcKLSAgIGluZm9ybWF0aW9uIHdlIGdlbmVyYXRlLiAgVGhlIGdhcyBzeW1ib2wgd2lsbCBiZSBOVUxMIGlmIHRoaXMgaXMKLSAgIG9ubHkgYSBkZWJ1Z2dpbmcgc3ltYm9sLiAgKi8KLXR5cGVkZWYgc3RydWN0IGxvY2Fsc3ltIHsKLSAgY29uc3QgY2hhciAqbmFtZTsJCS8qIHN5bWJvbCBuYW1lICovCi0gIHN5bWJvbFMgKmFzX3N5bTsJCS8qIHN5bWJvbCBhcyBzZWVuIGJ5IGdhcyAqLwotICBiZmRfdm1hIGFkZGVuZDsJCS8qIGFkZGVuZCB0byBhc19zeW0gdmFsdWUgKi8KLSAgc3RydWN0IGVmZHIgKmZpbGVfcHRyOwkvKiBmaWxlIHBvaW50ZXIgKi8KLSAgc3RydWN0IGVjb2ZmX3Byb2MgKnByb2NfcHRyOwkvKiBwcm9jIHBvaW50ZXIgKi8KLSAgc3RydWN0IGxvY2Fsc3ltICpiZWdpbl9wdHI7CS8qIHN5bWJvbCBhdCBzdGFydCBvZiBibG9jayAqLwotICBzdHJ1Y3QgZWNvZmZfYXV4ICppbmRleF9wdHI7CS8qIGluZGV4IHZhbHVlIHRvIGJlIGZpbGxlZCBpbiAqLwotICBzdHJ1Y3QgZm9yd2FyZCAqZm9yd2FyZF9yZWY7CS8qIGZvcndhcmQgcmVmZXJlbmNlcyB0byB0aGlzIHN5bWJvbCAqLwotICBsb25nIHN5bV9pbmRleDsJCS8qIGZpbmFsIHN5bWJvbCBpbmRleCAqLwotICBFWFRSIGVjb2ZmX3N5bTsJCS8qIEVDT0ZGIGRlYnVnZ2luZyBzeW1ib2wgKi8KLX0gbG9jYWxzeW1fdDsKLQotCi0vKiBGb3IgYXV4IGluZm9ybWF0aW9uIHdlIGtlZXAgdGhlIHR5cGUgYW5kIHRoZSBkYXRhLiAgKi8KLXR5cGVkZWYgc3RydWN0IGVjb2ZmX2F1eCB7Ci0gIGVudW0gYXV4X3R5cGUgdHlwZTsJCS8qIGF1eCB0eXBlICovCi0gIEFVWFUgZGF0YTsJCQkvKiBhdXggZGF0YSAqLwotfSBhdXhfdDsKLQotLyogRm9yIGEgcHJvY2VkdXJlIHdlIHN0b3JlIHRoZSBnYXMgc3ltYm9sIGFzIHdlbGwgYXMgdGhlIFBEUgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0IGVjb2ZmX3Byb2MgewotICBsb2NhbHN5bV90ICpzeW07CQkvKiBhc3NvY2lhdGVkIHN5bWJvbCAqLwotICBQRFIgcGRyOwkJCS8qIEVDT0ZGIGRlYnVnZ2luZyBpbmZvICovCi19IHByb2NfdDsKLQotLyogTnVtYmVyIG9mIHByb2NfdCBzdHJ1Y3R1cmVzIGFsbG9jYXRlZC4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwcm9jX2NudDsKLQotCi0vKiBGb3J3YXJkIHJlZmVyZW5jZSBsaXN0IGZvciB0YWdzIHJlZmVyZW5jZWQsIGJ1dCBub3QgeWV0IGRlZmluZWQuICAqLwotdHlwZWRlZiBzdHJ1Y3QgZm9yd2FyZCB7Ci0gIHN0cnVjdCBmb3J3YXJkICpuZXh0OwkJLyogbmV4dCBmb3J3YXJkIHJlZmVyZW5jZSAqLwotICBzdHJ1Y3QgZm9yd2FyZCAqZnJlZTsJCS8qIGZyZWUgbGlzdCBwb2ludGVyICovCi0gIGF1eF90CQkgKmlmZF9wdHI7CS8qIHBvaW50ZXIgdG8gc3RvcmUgZmlsZSBpbmRleCAqLwotICBhdXhfdAkJICppbmRleF9wdHI7CS8qIHBvaW50ZXIgdG8gc3RvcmUgc3ltYm9sIGluZGV4ICovCi19IGZvcndhcmRfdDsKLQotCi0vKiBMaW5rZWQgbGlzdCBzdXBwb3J0IGZvciB0YWdzLiAgVGhlIGZpcnN0IHRhZyBpbiB0aGUgbGlzdCBpcyBhbHdheXMKLSAgIHRoZSBjdXJyZW50IHRhZyBmb3IgdGhhdCBibG9jay4gICovCi10eXBlZGVmIHN0cnVjdCB0YWcgewotICBzdHJ1Y3QgdGFnCSAqZnJlZTsJCS8qIGZyZWUgbGlzdCBwb2ludGVyICovCi0gIHN0cnVjdCBzaGFzaAkgKmhhc2hfcHRyOwkvKiBwb2ludGVyIHRvIHRoZSBoYXNoIHRhYmxlIGhlYWQgKi8KLSAgc3RydWN0IHRhZwkgKnNhbWVfbmFtZTsJLyogdGFnIHdpdGggc2FtZSBuYW1lIGluIG91dGVyIHNjb3BlICovCi0gIHN0cnVjdCB0YWcJICpzYW1lX2Jsb2NrOwkvKiBuZXh0IHRhZyBkZWZpbmVkIGluIHRoZSBzYW1lIGJsb2NrLiAgKi8KLSAgc3RydWN0IGZvcndhcmQgKmZvcndhcmRfcmVmOwkvKiBsaXN0IG9mIGZvcndhcmQgcmVmZXJlbmNlcyAqLwotICBidF90CQkgIGJhc2ljX3R5cGU7CS8qIGJ0X1N0cnVjdCwgYnRfVW5pb24sIG9yIGJ0X0VudW0gKi8KLSAgc3ltaW50X3QJICBpZmQ7CQkvKiBmaWxlICMgdGFnIGRlZmluZWQgaW4gKi8KLSAgbG9jYWxzeW1fdAkgKnN5bTsJCS8qIGZpbGUncyBsb2NhbCBzeW1ib2xzICovCi19IHRhZ190OwotCi0KLS8qIEhlYWQgb2YgYSBibG9jaydzIGxpbmtlZCBsaXN0IG9mIHRhZ3MuICAqLwotdHlwZWRlZiBzdHJ1Y3QgdGhlYWQgewotICBzdHJ1Y3QgdGhlYWQJKnByZXY7CQkvKiBwcmV2aW91cyBibG9jayAqLwotICBzdHJ1Y3QgdGhlYWQJKmZyZWU7CQkvKiBmcmVlIGxpc3QgcG9pbnRlciAqLwotICBzdHJ1Y3QgdGFnCSpmaXJzdF90YWc7CS8qIGZpcnN0IHRhZyBpbiBibG9jayBkZWZpbmVkICovCi19IHRoZWFkX3Q7Ci0KLQotLyogVW5pb24gY29udGFpbmluZyBwb2ludGVycyB0byBlYWNoIHRoZSBzbWFsbCBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSBmcmVlZCB1cC4gICovCi10eXBlZGVmIHVuaW9uIHNtYWxsX2ZyZWUgewotICBzY29wZV90CSpmX3Njb3BlOwkvKiBzY29wZSBzdHJ1Y3R1cmUgKi8KLSAgdGhlYWRfdAkqZl90aGVhZDsJLyogdGFnIGhlYWQgc3RydWN0dXJlICovCi0gIHRhZ190CQkqZl90YWc7CQkvKiB0YWcgZWxlbWVudCBzdHJ1Y3R1cmUgKi8KLSAgZm9yd2FyZF90CSpmX2ZvcndhcmQ7CS8qIGZvcndhcmQgdGFnIHJlZmVyZW5jZSAqLwotfSBzbWFsbF9mcmVlX3Q7Ci0KLQotLyogU3RyaW5nIGhhc2ggdGFibGUgZW50cnkuICAqLwotCi10eXBlZGVmIHN0cnVjdCBzaGFzaCB7Ci0gIGNoYXIJCSpzdHJpbmc7CS8qIHN0cmluZyB3ZSBhcmUgaGFzaGluZyAqLwotICBzeW1pbnRfdAkgaW5keDsJCS8qIGluZGV4IHdpdGhpbiBzdHJpbmcgdGFibGUgKi8KLSAgRVhUUgkJKmVzeW1fcHRyOwkvKiBnbG9iYWwgc3ltYm9sIHBvaW50ZXIgKi8KLSAgbG9jYWxzeW1fdAkqc3ltX3B0cjsJLyogbG9jYWwgc3ltYm9sIHBvaW50ZXIgKi8KLSAgbG9jYWxzeW1fdAkqZW5kX3B0cjsJLyogc3ltYm9sIHBvaW50ZXIgdG8gZW5kIGJsb2NrICovCi0gIHRhZ190CQkqdGFnX3B0cjsJLyogdGFnIHBvaW50ZXIgKi8KLSAgcHJvY190CSpwcm9jX3B0cjsJLyogcHJvY2VkdXJlIGRlc2NyaXB0b3IgcG9pbnRlciAqLwotfSBzaGFzaF90OwotCi0KLS8qIFR5cGUgaGFzaCB0YWJsZSBzdXBwb3J0LiAgVGhlIHNpemUgb2YgdGhlIGhhc2ggdGFibGUgbXVzdCBmaXQKLSAgIHdpdGhpbiBhIHBhZ2Ugd2l0aCB0aGUgb3RoZXIgZXh0ZW5kZWQgZmlsZSBkZXNjcmlwdG9yIGluZm9ybWF0aW9uLgotICAgQmVjYXVzZSB1bmlxdWUgdHlwZXMgd2hpY2ggYXJlIGhhc2hlZCBhcmUgZmV3ZXIgaW4gbnVtYmVyIHRoYW4KLSAgIHN0cmluZ3MsIHdlIHVzZSBhIHNtYWxsZXIgaGFzaCB2YWx1ZS4gICovCi0KLSNkZWZpbmUgSEFTSEJJVFMgMzAKLQotI2lmbmRlZiBUSEFTSF9TSVpFCi0jZGVmaW5lIFRIQVNIX1NJWkUgMTEzCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgdGhhc2ggewotICBzdHJ1Y3QgdGhhc2gJKm5leHQ7CQkvKiBuZXh0IGhhc2ggdmFsdWUgKi8KLSAgQVVYVQkJIHR5cGU7CQkvKiB0eXBlIHdlIGFyZSBoYXNoaW5nICovCi0gIHN5bWludF90CSBpbmR4OwkJLyogaW5kZXggd2l0aGluIHN0cmluZyB0YWJsZSAqLwotfSB0aGFzaF90OwotCi0KLS8qIEV4dGVuZGVkIGZpbGUgZGVzY3JpcHRvciB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgc3VwcG9ydCBuZWNlc3NhcnkKLSAgIHRvIGFkZCB0aGluZ3MgdG8gZWFjaCBmaWxlIHNlcGFyYXRlbHkuICAqLwotdHlwZWRlZiBzdHJ1Y3QgZWZkciB7Ci0gIEZEUgkJIGZkcjsJCS8qIEZpbGUgaGVhZGVyIHRvIGJlIHdyaXR0ZW4gb3V0ICovCi0gIEZEUgkJKm9yaWdfZmRyOwkvKiBvcmlnaW5hbCBmaWxlIGhlYWRlciAqLwotICBjaGFyCQkqbmFtZTsJCS8qIGZpbGVuYW1lICovCi0gIGludAkJIGZha2U7CQkvKiB3aGV0aGVyIHRoaXMgaXMgZmFrZWQgLmZpbGUgKi8KLSAgc3ltaW50X3QJIHZvaWRfdHlwZTsJLyogYXV4LiBwb2ludGVyIHRvICd2b2lkJyB0eXBlICovCi0gIHN5bWludF90CSBpbnRfdHlwZTsJLyogYXV4LiBwb2ludGVyIHRvICdpbnQnIHR5cGUgKi8KLSAgc2NvcGVfdAkqY3VyX3Njb3BlOwkvKiBjdXJyZW50IG5lc3RlZCBzY29wZXMgKi8KLSAgc3ltaW50X3QJIGZpbGVfaW5kZXg7CS8qIGN1cnJlbnQgZmlsZSBudW1iZXIgKi8KLSAgaW50CQkgbmVzdGVkX3Njb3BlczsJLyogIyBuZXN0ZWQgc2NvcGVzICovCi0gIHZhcnJheV90CSBzdHJpbmdzOwkvKiBsb2NhbCBzdHJpbmdzICovCi0gIHZhcnJheV90CSBzeW1ib2xzOwkvKiBsb2NhbCBzeW1ib2xzICovCi0gIHZhcnJheV90CSBwcm9jczsJCS8qIHByb2NlZHVyZXMgKi8KLSAgdmFycmF5X3QJIGF1eF9zeW1zOwkvKiBhdXhpbGlhcnkgc3ltYm9scyAqLwotICBzdHJ1Y3QgZWZkcgkqbmV4dF9maWxlOwkvKiBuZXh0IGZpbGUgZGVzY3JpcHRvciAqLwotCQkJCS8qIHN0cmluZy90eXBlIGhhc2ggdGFibGVzICovCi0gIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnN0cl9oYXNoOwkvKiBzdHJpbmcgaGFzaCB0YWJsZSAqLwotICB0aGFzaF90CSp0aGFzaF9oZWFkW1RIQVNIX1NJWkVdOwotfSBlZmRyX3Q7Ci0KLS8qIFByZS1pbml0aWFsaXplZCBleHRlbmRlZCBmaWxlIHN0cnVjdHVyZS4gICovCi1zdGF0aWMgY29uc3QgZWZkcl90IGluaXRfZmlsZSA9Ci17Ci0gIHsJCQkvKiBGRFIgc3RydWN0dXJlICovCi0gICAgMCwJCQkvKiBhZHI6CQltZW1vcnkgYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2YgZmlsZSAqLwotICAgIDAsCQkJLyogcnNzOgkJZmlsZSBuYW1lIChvZiBzb3VyY2UsIGlmIGtub3duKSAqLwotICAgIDAsCQkJLyogaXNzQmFzZToJZmlsZSdzIHN0cmluZyBzcGFjZSAqLwotICAgIDAsCQkJLyogY2JTczoJbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzcyAqLwotICAgIDAsCQkJLyogaXN5bUJhc2U6CWJlZ2lubmluZyBvZiBzeW1ib2xzICovCi0gICAgMCwJCQkvKiBjc3ltOgljb3VudCBmaWxlJ3Mgb2Ygc3ltYm9scyAqLwotICAgIDAsCQkJLyogaWxpbmVCYXNlOglmaWxlJ3MgbGluZSBzeW1ib2xzICovCi0gICAgMCwJCQkvKiBjbGluZToJY291bnQgb2YgZmlsZSdzIGxpbmUgc3ltYm9scyAqLwotICAgIDAsCQkJLyogaW9wdEJhc2U6CWZpbGUncyBvcHRpbWl6YXRpb24gZW50cmllcyAqLwotICAgIDAsCQkJLyogY29wdDoJY291bnQgb2YgZmlsZSdzIG9wdGltaXphdGlvbiBlbnRyaWVzICovCi0gICAgMCwJCQkvKiBpcGRGaXJzdDoJc3RhcnQgb2YgcHJvY2VkdXJlcyBmb3IgdGhpcyBmaWxlICovCi0gICAgMCwJCQkvKiBjcGQ6CQljb3VudCBvZiBwcm9jZWR1cmVzIGZvciB0aGlzIGZpbGUgKi8KLSAgICAwLAkJCS8qIGlhdXhCYXNlOglmaWxlJ3MgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLSAgICAwLAkJCS8qIGNhdXg6CWNvdW50IG9mIGZpbGUncyBhdXhpbGlhcnkgZW50cmllcyAqLwotICAgIDAsCQkJLyogcmZkQmFzZToJaW5kZXggaW50byB0aGUgZmlsZSBpbmRpcmVjdCB0YWJsZSAqLwotICAgIDAsCQkJLyogY3JmZDoJY291bnQgZmlsZSBpbmRpcmVjdCBlbnRyaWVzICovCi0gICAgbGFuZ0MsCQkvKiBsYW5nOglsYW5ndWFnZSBmb3IgdGhpcyBmaWxlICovCi0gICAgMSwJCQkvKiBmTWVyZ2U6CXdoZXRoZXIgdGhpcyBmaWxlIGNhbiBiZSBtZXJnZWQgKi8KLSAgICAwLAkJCS8qIGZSZWFkaW46CXRydWUgaWYgcmVhZCBpbiAobm90IGp1c3QgY3JlYXRlZCkgKi8KLSAgICBUQVJHRVRfQllURVNfQklHX0VORElBTiwgIC8qIGZCaWdlbmRpYW46CWlmIDEsIGNvbXBpbGVkIG9uIGJpZyBlbmRpYW4gbWFjaGluZSAqLwotICAgIEdMRVZFTF8yLAkJLyogZ2xldmVsOglsZXZlbCB0aGlzIGZpbGUgd2FzIGNvbXBpbGVkIHdpdGggKi8KLSAgICAwLAkJCS8qIHJlc2VydmVkOglyZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotICAgIDAsCQkJLyogY2JMaW5lT2Zmc2V0OiBieXRlIG9mZnNldCBmcm9tIGhlYWRlciBmb3IgdGhpcyBmaWxlIGxuJ3MgKi8KLSAgICAwLAkJCS8qIGNiTGluZToJc2l6ZSBvZiBsaW5lcyBmb3IgdGhpcyBmaWxlICovCi0gIH0sCi0KLSAgKEZEUiAqKTAsCQkvKiBvcmlnX2ZkcjoJb3JpZ2luYWwgZmlsZSBoZWFkZXIgcG9pbnRlciAqLwotICAoY2hhciAqKTAsCQkvKiBuYW1lOglwb2ludGVyIHRvIGZpbGVuYW1lICovCi0gIDAsCQkJLyogZmFrZToJd2hldGhlciB0aGlzIGlzIGEgZmFrZWQgLmZpbGUgKi8KLSAgMCwJCQkvKiB2b2lkX3R5cGU6CXB0ciB0byBhdXggbm9kZSBmb3Igdm9pZCB0eXBlICovCi0gIDAsCQkJLyogaW50X3R5cGU6CXB0ciB0byBhdXggbm9kZSBmb3IgaW50IHR5cGUgKi8KLSAgKHNjb3BlX3QgKikwLAkJLyogY3VyX3Njb3BlOgljdXJyZW50IHNjb3BlIGJlaW5nIHByb2Nlc3NlZCAqLwotICAwLAkJCS8qIGZpbGVfaW5kZXg6CWN1cnJlbnQgZmlsZSAjICovCi0gIDAsCQkJLyogbmVzdGVkX3Njb3BlczogIyBuZXN0ZWQgc2NvcGVzICovCi0gIElOSVRfVkFSUkFZIChjaGFyKSwJLyogc3RyaW5nczoJbG9jYWwgc3RyaW5nIHZhcnJheSAqLwotICBJTklUX1ZBUlJBWSAobG9jYWxzeW1fdCksCS8qIHN5bWJvbHM6CWxvY2FsIHN5bWJvbHMgdmFycmF5ICovCi0gIElOSVRfVkFSUkFZIChwcm9jX3QpLAkvKiBwcm9jczoJcHJvY2VkdXJlIHZhcnJheSAqLwotICBJTklUX1ZBUlJBWSAoYXV4X3QpLAkvKiBhdXhfc3ltczoJYXV4aWxpYXJ5IHN5bWJvbHMgdmFycmF5ICovCi0KLSAgKHN0cnVjdCBlZmRyICopMCwJLyogbmV4dF9maWxlOgluZXh0IGZpbGUgc3RydWN0dXJlICovCi0KLSAgKHN0cnVjdCBoYXNoX2NvbnRyb2wgKikwLAkvKiBzdHJfaGFzaDoJc3RyaW5nIGhhc2ggdGFibGUgKi8KLSAgeyAwIH0sCQkvKiB0aGFzaF9oZWFkOgl0eXBlIGhhc2ggdGFibGUgKi8KLX07Ci0KLQotc3RhdGljIGVmZHJfdCAqZmlyc3RfZmlsZTsJCQkvKiBmaXJzdCBmaWxlIGRlc2NyaXB0b3IgKi8KLXN0YXRpYyBlZmRyX3QgKipsYXN0X2ZpbGVfcHRyID0gJmZpcnN0X2ZpbGU7CS8qIGZpbGUgZGVzY3JpcHRvciB0YWlsICovCi0KLQotLyogTGluZSBudW1iZXIgaW5mb3JtYXRpb24gaXMga2VwdCBpbiBhIGxpc3QgdW50aWwgdGhlIGFzc2VtYmx5IGlzCi0gICBmaW5pc2hlZC4gICovCi10eXBlZGVmIHN0cnVjdCBsaW5lbm9fbGlzdCB7Ci0gIHN0cnVjdCBsaW5lbm9fbGlzdCAqbmV4dDsJLyogbmV4dCBlbGVtZW50IGluIGxpc3QgKi8KLSAgZWZkcl90ICpmaWxlOwkJCS8qIGZpbGUgdGhpcyBsaW5lIGlzIGluICovCi0gIHByb2NfdCAqcHJvYzsJCQkvKiBwcm9jZWR1cmUgdGhpcyBsaW5lIGlzIGluICovCi0gIGZyYWdTICpmcmFnOwkJCS8qIGZyYWdtZW50IHRoaXMgbGluZSBudW1iZXIgaXMgaW4gKi8KLSAgdW5zaWduZWQgbG9uZyBwYWRkcjsJCS8qIG9mZnNldCB3aXRoaW4gZnJhZ21lbnQgKi8KLSAgbG9uZyBsaW5lbm87CQkJLyogYWN0dWFsIGxpbmUgbnVtYmVyICovCi19IGxpbmVub19saXN0X3Q7Ci0KLXN0YXRpYyBsaW5lbm9fbGlzdF90ICpmaXJzdF9saW5lbm87Ci1zdGF0aWMgbGluZW5vX2xpc3RfdCAqbGFzdF9saW5lbm87Ci1zdGF0aWMgbGluZW5vX2xpc3RfdCAqKmxhc3RfbGluZW5vX3B0ciA9ICZmaXJzdF9saW5lbm87Ci0KLS8qIFNvbWV0aW1lcyB0aGVyZSB3aWxsIGJlIHNvbWUgLmxvYyBzdGF0ZW1lbnRzIGJlZm9yZSBhIC5lbnQuICBXZQotICAga2VlcCB0aGVtIGluIHRoaXMgbGlzdCBzbyB0aGF0IHdlIGNhbiBmaWxsIGluIHRoZSBwcm9jZWR1cmUgcG9pbnRlcgotICAgYWZ0ZXIgd2Ugc2VlIHRoZSAuZW50LiAgKi8KLXN0YXRpYyBsaW5lbm9fbGlzdF90ICpub3Byb2NfbGluZW5vOwotCi0vKiBVbmlvbiBvZiB2YXJpb3VzIHRoaW5ncyB0aGF0IGFyZSBoZWxkIGluIHBhZ2VzLiAgKi8KLXR5cGVkZWYgdW5pb24gcGFnZSB7Ci0gIGNoYXIJCWJ5dGUJWyBQQUdFX1NJWkUgXTsKLSAgdW5zaWduZWQgY2hhcgl1Ynl0ZQlbIFBBR0VfU0laRSBdOwotICBlZmRyX3QJZmlsZQlbIFBBR0VfU0laRSAvIHNpemVvZiAoZWZkcl90KQkgICAgIF07Ci0gIEZEUgkJb2ZpbGUJWyBQQUdFX1NJWkUgLyBzaXplb2YgKEZEUikJICAgICBdOwotICBwcm9jX3QJcHJvYwlbIFBBR0VfU0laRSAvIHNpemVvZiAocHJvY190KQkgICAgIF07Ci0gIGxvY2Fsc3ltX3QJc3ltCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChsb2NhbHN5bV90KSAgICBdOwotICBhdXhfdAkJYXV4CVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChhdXhfdCkJICAgICBdOwotICBETlIJCWRlbnNlCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChETlIpCSAgICAgXTsKLSAgc2NvcGVfdAlzY29wZQlbIFBBR0VfU0laRSAvIHNpemVvZiAoc2NvcGVfdCkJICAgICBdOwotICB2bGlua3NfdAl2bGlua3MJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHZsaW5rc190KQkgICAgIF07Ci0gIHNoYXNoX3QJc2hhc2gJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHNoYXNoX3QpCSAgICAgXTsKLSAgdGhhc2hfdAl0aGFzaAlbIFBBR0VfU0laRSAvIHNpemVvZiAodGhhc2hfdCkJICAgICBdOwotICB0YWdfdAkJdGFnCVsgUEFHRV9TSVpFIC8gc2l6ZW9mICh0YWdfdCkJICAgICBdOwotICBmb3J3YXJkX3QJZm9yd2FyZAlbIFBBR0VfU0laRSAvIHNpemVvZiAoZm9yd2FyZF90KSAgICAgXTsKLSAgdGhlYWRfdAl0aGVhZAlbIFBBR0VfU0laRSAvIHNpemVvZiAodGhlYWRfdCkJICAgICBdOwotICBsaW5lbm9fbGlzdF90CWxpbmVubwlbIFBBR0VfU0laRSAvIHNpemVvZiAobGluZW5vX2xpc3RfdCkgXTsKLX0gcGFnZV90eXBlOwotCi0KLS8qIFN0cnVjdHVyZSBob2xkaW5nIGFsbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHNtYWxsIHNpemVkIHN0cnVjdHVyZXMuICAqLwotdHlwZWRlZiBzdHJ1Y3QgYWxsb2NfaW5mbyB7Ci0gIGNoYXIJCSphbGxvY19uYW1lOwkvKiBuYW1lIG9mIHRoaXMgYWxsb2NhdGlvbiB0eXBlIChtdXN0IGJlIGZpcnN0KSAqLwotICBwYWdlX3R5cGUJKmN1cl9wYWdlOwkvKiBjdXJyZW50IHBhZ2UgYmVpbmcgYWxsb2NhdGVkIGZyb20gKi8KLSAgc21hbGxfZnJlZV90CSBmcmVlX2xpc3Q7CS8qIGN1cnJlbnQgZnJlZSBsaXN0IGlmIGFueSAqLwotICBpbnQJCSB1bmFsbG9jYXRlZDsJLyogbnVtYmVyIG9mIGVsZW1lbnRzIHVuYWxsb2NhdGVkIG9uIHBhZ2UgKi8KLSAgaW50CQkgdG90YWxfYWxsb2M7CS8qIHRvdGFsIG51bWJlciBvZiBhbGxvY2F0aW9ucyAqLwotICBpbnQJCSB0b3RhbF9mcmVlOwkvKiB0b3RhbCBudW1iZXIgb2YgZnJlZXMgKi8KLSAgaW50CQkgdG90YWxfcGFnZXM7CS8qIHRvdGFsIG51bWJlciBvZiBwYWdlcyBhbGxvY2F0ZWQgKi8KLX0gYWxsb2NfaW5mb190OwotCi0KLS8qIFR5cGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIHRvZ2V0aGVyLiAgKi8KLXR5cGVkZWYgc3RydWN0IHR5cGVfaW5mbyB7Ci0gIGJ0X3QJICAgICAgYmFzaWNfdHlwZTsJCS8qIGJhc2ljIHR5cGUgKi8KLSAgaW50CSAgICAgIG9yaWdfdHlwZTsJCS8qIG9yaWdpbmFsIENPRkYtYmFzZWQgdHlwZSAqLwotICBpbnQJICAgICAgbnVtX3RxOwkJCS8qICMgdHlwZSBxdWFsaWZpZXJzICovCi0gIGludAkgICAgICBudW1fZGltczsJCQkvKiAjIGRpbWVuc2lvbnMgKi8KLSAgaW50CSAgICAgIG51bV9zaXplczsJCS8qICMgc2l6ZXMgKi8KLSAgaW50CSAgICAgIGV4dHJhX3NpemVzOwkJLyogIyBleHRyYSBzaXplcyBub3QgdGllZCB3aXRoIGRpbXMgKi8KLSAgdGFnX3QgKiAgICAgdGFnX3B0cjsJCQkvKiB0YWcgcG9pbnRlciAqLwotICBpbnQJICAgICAgYml0ZmllbGQ7CQkJLyogc3ltYm9sIGlzIGEgYml0ZmllbGQgKi8KLSAgdHFfdAkgICAgICB0eXBlX3F1YWxpZmllcnNbTl9UUV07CS8qIHR5cGUgcXVhbGlmaWVycyAocHRyLCBmdW5jLCBhcnJheSkqLwotICBzeW1pbnRfdCAgICBkaW1lbnNpb25zICAgICBbTl9UUV07CS8qIGRpbWVuc2lvbnMgZm9yIGVhY2ggYXJyYXkgKi8KLSAgc3ltaW50X3QgICAgc2l6ZXMJICAgICBbTl9UUSsyXTsJLyogc2l6ZXMgb2YgZWFjaCBhcnJheSBzbGljZSArIHNpemUgb2YKLQkJCQkJICAgc3RydWN0L3VuaW9uL2VudW0gKyBiaXRmaWVsZCBzaXplICovCi19IHR5cGVfaW5mb190OwotCi0vKiBQcmUtaW5pdGlhbGl6ZWQgdHlwZV9pbmZvIHN0cnVjdC4gICovCi1zdGF0aWMgY29uc3QgdHlwZV9pbmZvX3QgdHlwZV9pbmZvX2luaXQgPSB7Ci0gIGJ0X05pbCwJCQkJLyogYmFzaWMgdHlwZSAqLwotICBUX05VTEwsCQkJCS8qIG9yaWdpbmFsIENPRkYtYmFzZWQgdHlwZSAqLwotICAwLAkJCQkJLyogIyB0eXBlIHF1YWxpZmllcnMgKi8KLSAgMCwJCQkJCS8qICMgZGltZW5zaW9ucyAqLwotICAwLAkJCQkJLyogIyBzaXplcyAqLwotICAwLAkJCQkJLyogc2l6ZXMgbm90IHRpZWQgd2l0aCBkaW1zICovCi0gIE5VTEwsCQkJCQkvKiBwdHIgdG8gdGFnICovCi0gIDAsCQkJCQkvKiBiaXRmaWVsZCAqLwotICB7CQkJCQkvKiB0eXBlIHF1YWxpZmllcnMgKi8KLSAgICB0cV9OaWwsCi0gICAgdHFfTmlsLAotICAgIHRxX05pbCwKLSAgICB0cV9OaWwsCi0gICAgdHFfTmlsLAotICAgIHRxX05pbCwKLSAgfSwKLSAgewkJCQkJLyogZGltZW5zaW9ucyAqLwotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwCi0gIH0sCi0gIHsJCQkJCS8qIHNpemVzICovCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICB9LAotfTsKLQotLyogR2xvYmFsIGhhc2ggdGFibGUgZm9yIHRoZSB0YWdzIHRhYmxlIGFuZCBnbG9iYWwgdGFibGUgZm9yIGZpbGUKLSAgIGRlc2NyaXB0b3JzLiAgKi8KLQotc3RhdGljIHZhcnJheV90IGZpbGVfZGVzYwk9IElOSVRfVkFSUkFZIChlZmRyX3QpOwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqdGFnX2hhc2g7Ci0KLS8qIFN0YXRpYyB0eXBlcyBmb3IgaW50IGFuZCB2b2lkLiAgQWxzbywgcmVtZW1iZXIgdGhlIGxhc3QgZnVuY3Rpb24ncwotICAgdHlwZSAod2hpY2ggaXMgc2V0IHVwIHdoZW4gd2UgZW5jb3VudGVyIHRoZSBkZWNsYXJhdGlvbiBmb3IgdGhlCi0gICBmdW5jdGlvbiwgYW5kIHVzZWQgd2hlbiB0aGUgZW5kIGJsb2NrIGZvciB0aGUgZnVuY3Rpb24gaXMgZW1pdHRlZC4gICovCi0KLXN0YXRpYyB0eXBlX2luZm9fdCBpbnRfdHlwZV9pbmZvOwotc3RhdGljIHR5cGVfaW5mb190IHZvaWRfdHlwZV9pbmZvOwotc3RhdGljIHR5cGVfaW5mb190IGxhc3RfZnVuY190eXBlX2luZm87Ci1zdGF0aWMgc3ltYm9sUyAqbGFzdF9mdW5jX3N5bV92YWx1ZTsKLQotCi0vKiBDb252ZXJ0IENPRkYgYmFzaWMgdHlwZSB0byBFQ09GRiBiYXNpYyB0eXBlLiAgVGhlIFRfTlVMTCB0eXBlCi0gICByZWFsbHkgc2hvdWxkIHVzZSBidF9Wb2lkLCBidXQgdGhpcyBjYXVzZXMgdGhlIGN1cnJlbnQgZWNvZmYgR0RCIHRvCi0gICBpc3N1ZSB1bnN1cHBvcnRlZCB0eXBlIG1lc3NhZ2VzLCBhbmQgdGhlIFVsdHJpeCA0LjAwIGRieCAoYWthIE1JUFMKLSAgIDIuMCkgZG9lc24ndCB1bmRlcnN0YW5kIGl0LCBldmVuIHRob3VnaCB0aGUgY29tcGlsZXIgZ2VuZXJhdGVzIGl0LgotICAgTWF5YmUgdGhpcyB3aWxsIGJlIGZpeGVkIGluIDIuMTAgb3IgMi4yMCBvZiB0aGUgTUlQUyBjb21waWxlcgotICAgc3VpdGUsIGJ1dCBmb3Igbm93IGdvIHdpdGggd2hhdCB3b3Jrcy4KLQotICAgSXQgd291bGQgbWFrZSBzZW5zZSBmb3IgdGhlIC50eXBlIGFuZCAuc2NsIGRpcmVjdGl2ZXMgdG8gdXNlIHRoZQotICAgRUNPRkYgbnVtYmVycyBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIENPRkYgbnVtYmVycyBhbmQKLSAgIG1hcHBpbmcgdGhlbS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgaXMgaGlzdG9yaWNhbGx5IHdoYXQgbWlwcy10ZmlsZQotICAgZXhwZWN0cywgYW5kIGNoYW5naW5nIGdjYyBub3cgd291bGQgYmUgYSBjb25zaWRlcmFibGUgcGFpbiAodGhlCi0gICBuYXRpdmUgY29tcGlsZXIgZ2VuZXJhdGVzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbnRlcm5hbGx5LCByYXRoZXIKLSAgIHRoYW4gdmlhIHRoZSBhc3NlbWJsZXIsIHNvIGl0IHdpbGwgbmV2ZXIgdXNlIC50eXBlIG9yIC5zY2wpLiAgKi8KLQotc3RhdGljIGNvbnN0IGJ0X3QgbWFwX2NvZmZfdHlwZXNbXSA9IHsKLSAgYnRfTmlsLAkJCS8qIFRfTlVMTCAqLwotICBidF9OaWwsCQkJLyogVF9BUkcgKi8KLSAgYnRfQ2hhciwJCQkvKiBUX0NIQVIgKi8KLSAgYnRfU2hvcnQsCQkJLyogVF9TSE9SVCAqLwotICBidF9JbnQsCQkJLyogVF9JTlQgKi8KLSAgYnRfTG9uZywJCQkvKiBUX0xPTkcgKi8KLSAgYnRfRmxvYXQsCQkJLyogVF9GTE9BVCAqLwotICBidF9Eb3VibGUsCQkJLyogVF9ET1VCTEUgKi8KLSAgYnRfU3RydWN0LAkJCS8qIFRfU1RSVUNUICovCi0gIGJ0X1VuaW9uLAkJCS8qIFRfVU5JT04gKi8KLSAgYnRfRW51bSwJCQkvKiBUX0VOVU0gKi8KLSAgYnRfRW51bSwJCQkvKiBUX01PRSAqLwotICBidF9VQ2hhciwJCQkvKiBUX1VDSEFSICovCi0gIGJ0X1VTaG9ydCwJCQkvKiBUX1VTSE9SVCAqLwotICBidF9VSW50LAkJCS8qIFRfVUlOVCAqLwotICBidF9VTG9uZwkJCS8qIFRfVUxPTkcgKi8KLX07Ci0KLS8qIENvbnZlcnQgQ09GRiBzdG9yYWdlIGNsYXNzIHRvIEVDT0ZGIHN0b3JhZ2UgY2xhc3MuICAqLwotc3RhdGljIGNvbnN0IHNjX3QgbWFwX2NvZmZfc3RvcmFnZVtdID0gewotICBzY19OaWwsCQkJLyogICAwOiBDX05VTEwgKi8KLSAgc2NfQWJzLAkJCS8qICAgMTogQ19BVVRPCSAgYXV0byB2YXIgKi8KLSAgc2NfVW5kZWZpbmVkLAkJCS8qICAgMjogQ19FWFQJICBleHRlcm5hbCAqLwotICBzY19EYXRhLAkJCS8qICAgMzogQ19TVEFUCSAgc3RhdGljICovCi0gIHNjX1JlZ2lzdGVyLAkJCS8qICAgNDogQ19SRUcJICByZWdpc3RlciAqLwotICBzY19VbmRlZmluZWQsCQkJLyogICA1OiBDX0VYVERFRiAgPz8/ICovCi0gIHNjX1RleHQsCQkJLyogICA2OiBDX0xBQkVMCSAgbGFiZWwgKi8KLSAgc2NfVGV4dCwJCQkvKiAgIDc6IENfVUxBQkVMICB1c2VyIGxhYmVsICovCi0gIHNjX0luZm8sCQkJLyogICA4OiBDX01PUwkgIG1lbWJlciBvZiBzdHJ1Y3QgKi8KLSAgc2NfQWJzLAkJCS8qICAgOTogQ19BUkcJICBhcmd1bWVudCAqLwotICBzY19JbmZvLAkJCS8qICAxMDogQ19TVFJUQUcgIHN0cnVjdCB0YWcgKi8KLSAgc2NfSW5mbywJCQkvKiAgMTE6IENfTU9VCSAgbWVtYmVyIG9mIHVuaW9uICovCi0gIHNjX0luZm8sCQkJLyogIDEyOiBDX1VOVEFHICAgdW5pb24gdGFnICovCi0gIHNjX0luZm8sCQkJLyogIDEzOiBDX1RQREVGCSAgdHlwZWRlZiAqLwotICBzY19EYXRhLAkJCS8qICAxNDogQ19VU1RBVElDID8/PyAqLwotICBzY19JbmZvLAkJCS8qICAxNTogQ19FTlRBRwkgIGVudW0gdGFnICovCi0gIHNjX0luZm8sCQkJLyogIDE2OiBDX01PRQkgIG1lbWJlciBvZiBlbnVtICovCi0gIHNjX1JlZ2lzdGVyLAkJCS8qICAxNzogQ19SRUdQQVJNIHJlZ2lzdGVyIHBhcmFtZXRlciAqLwotICBzY19CaXRzLAkJCS8qICAxODsgQ19GSUVMRAkgIGJpdGZpZWxkICovCi0gIHNjX05pbCwJCQkvKiAgMTkgKi8KLSAgc2NfTmlsLAkJCS8qICAyMCAqLwotICBzY19OaWwsCQkJLyogIDIxICovCi0gIHNjX05pbCwJCQkvKiAgMjIgKi8KLSAgc2NfTmlsLAkJCS8qICAyMyAqLwotICBzY19OaWwsCQkJLyogIDI0ICovCi0gIHNjX05pbCwJCQkvKiAgMjUgKi8KLSAgc2NfTmlsLAkJCS8qICAyNiAqLwotICBzY19OaWwsCQkJLyogIDI3ICovCi0gIHNjX05pbCwJCQkvKiAgMjggKi8KLSAgc2NfTmlsLAkJCS8qICAyOSAqLwotICBzY19OaWwsCQkJLyogIDMwICovCi0gIHNjX05pbCwJCQkvKiAgMzEgKi8KLSAgc2NfTmlsLAkJCS8qICAzMiAqLwotICBzY19OaWwsCQkJLyogIDMzICovCi0gIHNjX05pbCwJCQkvKiAgMzQgKi8KLSAgc2NfTmlsLAkJCS8qICAzNSAqLwotICBzY19OaWwsCQkJLyogIDM2ICovCi0gIHNjX05pbCwJCQkvKiAgMzcgKi8KLSAgc2NfTmlsLAkJCS8qICAzOCAqLwotICBzY19OaWwsCQkJLyogIDM5ICovCi0gIHNjX05pbCwJCQkvKiAgNDAgKi8KLSAgc2NfTmlsLAkJCS8qICA0MSAqLwotICBzY19OaWwsCQkJLyogIDQyICovCi0gIHNjX05pbCwJCQkvKiAgNDMgKi8KLSAgc2NfTmlsLAkJCS8qICA0NCAqLwotICBzY19OaWwsCQkJLyogIDQ1ICovCi0gIHNjX05pbCwJCQkvKiAgNDYgKi8KLSAgc2NfTmlsLAkJCS8qICA0NyAqLwotICBzY19OaWwsCQkJLyogIDQ4ICovCi0gIHNjX05pbCwJCQkvKiAgNDkgKi8KLSAgc2NfTmlsLAkJCS8qICA1MCAqLwotICBzY19OaWwsCQkJLyogIDUxICovCi0gIHNjX05pbCwJCQkvKiAgNTIgKi8KLSAgc2NfTmlsLAkJCS8qICA1MyAqLwotICBzY19OaWwsCQkJLyogIDU0ICovCi0gIHNjX05pbCwJCQkvKiAgNTUgKi8KLSAgc2NfTmlsLAkJCS8qICA1NiAqLwotICBzY19OaWwsCQkJLyogIDU3ICovCi0gIHNjX05pbCwJCQkvKiAgNTggKi8KLSAgc2NfTmlsLAkJCS8qICA1OSAqLwotICBzY19OaWwsCQkJLyogIDYwICovCi0gIHNjX05pbCwJCQkvKiAgNjEgKi8KLSAgc2NfTmlsLAkJCS8qICA2MiAqLwotICBzY19OaWwsCQkJLyogIDYzICovCi0gIHNjX05pbCwJCQkvKiAgNjQgKi8KLSAgc2NfTmlsLAkJCS8qICA2NSAqLwotICBzY19OaWwsCQkJLyogIDY2ICovCi0gIHNjX05pbCwJCQkvKiAgNjcgKi8KLSAgc2NfTmlsLAkJCS8qICA2OCAqLwotICBzY19OaWwsCQkJLyogIDY5ICovCi0gIHNjX05pbCwJCQkvKiAgNzAgKi8KLSAgc2NfTmlsLAkJCS8qICA3MSAqLwotICBzY19OaWwsCQkJLyogIDcyICovCi0gIHNjX05pbCwJCQkvKiAgNzMgKi8KLSAgc2NfTmlsLAkJCS8qICA3NCAqLwotICBzY19OaWwsCQkJLyogIDc1ICovCi0gIHNjX05pbCwJCQkvKiAgNzYgKi8KLSAgc2NfTmlsLAkJCS8qICA3NyAqLwotICBzY19OaWwsCQkJLyogIDc4ICovCi0gIHNjX05pbCwJCQkvKiAgNzkgKi8KLSAgc2NfTmlsLAkJCS8qICA4MCAqLwotICBzY19OaWwsCQkJLyogIDgxICovCi0gIHNjX05pbCwJCQkvKiAgODIgKi8KLSAgc2NfTmlsLAkJCS8qICA4MyAqLwotICBzY19OaWwsCQkJLyogIDg0ICovCi0gIHNjX05pbCwJCQkvKiAgODUgKi8KLSAgc2NfTmlsLAkJCS8qICA4NiAqLwotICBzY19OaWwsCQkJLyogIDg3ICovCi0gIHNjX05pbCwJCQkvKiAgODggKi8KLSAgc2NfTmlsLAkJCS8qICA4OSAqLwotICBzY19OaWwsCQkJLyogIDkwICovCi0gIHNjX05pbCwJCQkvKiAgOTEgKi8KLSAgc2NfTmlsLAkJCS8qICA5MiAqLwotICBzY19OaWwsCQkJLyogIDkzICovCi0gIHNjX05pbCwJCQkvKiAgOTQgKi8KLSAgc2NfTmlsLAkJCS8qICA5NSAqLwotICBzY19OaWwsCQkJLyogIDk2ICovCi0gIHNjX05pbCwJCQkvKiAgOTcgKi8KLSAgc2NfTmlsLAkJCS8qICA5OCAqLwotICBzY19OaWwsCQkJLyogIDk5ICovCi0gIHNjX1RleHQsCQkJLyogMTAwOiBDX0JMT0NLICBibG9jayBzdGFydC9lbmQgKi8KLSAgc2NfVGV4dCwJCQkvKiAxMDE6IENfRkNOCSBmdW5jdGlvbiBzdGFydC9lbmQgKi8KLSAgc2NfSW5mbywJCQkvKiAxMDI6IENfRU9TCSBlbmQgb2Ygc3RydWN0L3VuaW9uL2VudW0gKi8KLSAgc2NfTmlsLAkJCS8qIDEwMzogQ19GSUxFCSBmaWxlIHN0YXJ0ICovCi0gIHNjX05pbCwJCQkvKiAxMDQ6IENfTElORQkgbGluZSBudW1iZXIgKi8KLSAgc2NfTmlsLAkJCS8qIDEwNTogQ19BTElBUwkgY29tYmluZWQgdHlwZSBpbmZvICovCi0gIHNjX05pbCwJCQkvKiAxMDY6IENfSElEREVOID8/PyAqLwotfTsKLQotLyogQ29udmVydCBDT0ZGIHN0b3JhZ2UgY2xhc3MgdG8gRUNPRkYgc3ltYm9sIHR5cGUuICAqLwotc3RhdGljIGNvbnN0IHN0X3QgbWFwX2NvZmZfc3ltX3R5cGVbXSA9IHsKLSAgc3RfTmlsLAkJCS8qICAgMDogQ19OVUxMICovCi0gIHN0X0xvY2FsLAkJCS8qICAgMTogQ19BVVRPCSAgYXV0byB2YXIgKi8KLSAgc3RfR2xvYmFsLAkJCS8qICAgMjogQ19FWFQJICBleHRlcm5hbCAqLwotICBzdF9TdGF0aWMsCQkJLyogICAzOiBDX1NUQVQJICBzdGF0aWMgKi8KLSAgc3RfTG9jYWwsCQkJLyogICA0OiBDX1JFRwkgIHJlZ2lzdGVyICovCi0gIHN0X0dsb2JhbCwJCQkvKiAgIDU6IENfRVhUREVGICA/Pz8gKi8KLSAgc3RfTGFiZWwsCQkJLyogICA2OiBDX0xBQkVMCSAgbGFiZWwgKi8KLSAgc3RfTGFiZWwsCQkJLyogICA3OiBDX1VMQUJFTCAgdXNlciBsYWJlbCAqLwotICBzdF9NZW1iZXIsCQkJLyogICA4OiBDX01PUwkgIG1lbWJlciBvZiBzdHJ1Y3QgKi8KLSAgc3RfUGFyYW0sCQkJLyogICA5OiBDX0FSRwkgIGFyZ3VtZW50ICovCi0gIHN0X0Jsb2NrLAkJCS8qICAxMDogQ19TVFJUQUcgIHN0cnVjdCB0YWcgKi8KLSAgc3RfTWVtYmVyLAkJCS8qICAxMTogQ19NT1UJICBtZW1iZXIgb2YgdW5pb24gKi8KLSAgc3RfQmxvY2ssCQkJLyogIDEyOiBDX1VOVEFHICAgdW5pb24gdGFnICovCi0gIHN0X1R5cGVkZWYsCQkJLyogIDEzOiBDX1RQREVGCSAgdHlwZWRlZiAqLwotICBzdF9TdGF0aWMsCQkJLyogIDE0OiBDX1VTVEFUSUMgPz8/ICovCi0gIHN0X0Jsb2NrLAkJCS8qICAxNTogQ19FTlRBRwkgIGVudW0gdGFnICovCi0gIHN0X01lbWJlciwJCQkvKiAgMTY6IENfTU9FCSAgbWVtYmVyIG9mIGVudW0gKi8KLSAgc3RfUGFyYW0sCQkJLyogIDE3OiBDX1JFR1BBUk0gcmVnaXN0ZXIgcGFyYW1ldGVyICovCi0gIHN0X01lbWJlciwJCQkvKiAgMTg7IENfRklFTEQJICBiaXRmaWVsZCAqLwotICBzdF9OaWwsCQkJLyogIDE5ICovCi0gIHN0X05pbCwJCQkvKiAgMjAgKi8KLSAgc3RfTmlsLAkJCS8qICAyMSAqLwotICBzdF9OaWwsCQkJLyogIDIyICovCi0gIHN0X05pbCwJCQkvKiAgMjMgKi8KLSAgc3RfTmlsLAkJCS8qICAyNCAqLwotICBzdF9OaWwsCQkJLyogIDI1ICovCi0gIHN0X05pbCwJCQkvKiAgMjYgKi8KLSAgc3RfTmlsLAkJCS8qICAyNyAqLwotICBzdF9OaWwsCQkJLyogIDI4ICovCi0gIHN0X05pbCwJCQkvKiAgMjkgKi8KLSAgc3RfTmlsLAkJCS8qICAzMCAqLwotICBzdF9OaWwsCQkJLyogIDMxICovCi0gIHN0X05pbCwJCQkvKiAgMzIgKi8KLSAgc3RfTmlsLAkJCS8qICAzMyAqLwotICBzdF9OaWwsCQkJLyogIDM0ICovCi0gIHN0X05pbCwJCQkvKiAgMzUgKi8KLSAgc3RfTmlsLAkJCS8qICAzNiAqLwotICBzdF9OaWwsCQkJLyogIDM3ICovCi0gIHN0X05pbCwJCQkvKiAgMzggKi8KLSAgc3RfTmlsLAkJCS8qICAzOSAqLwotICBzdF9OaWwsCQkJLyogIDQwICovCi0gIHN0X05pbCwJCQkvKiAgNDEgKi8KLSAgc3RfTmlsLAkJCS8qICA0MiAqLwotICBzdF9OaWwsCQkJLyogIDQzICovCi0gIHN0X05pbCwJCQkvKiAgNDQgKi8KLSAgc3RfTmlsLAkJCS8qICA0NSAqLwotICBzdF9OaWwsCQkJLyogIDQ2ICovCi0gIHN0X05pbCwJCQkvKiAgNDcgKi8KLSAgc3RfTmlsLAkJCS8qICA0OCAqLwotICBzdF9OaWwsCQkJLyogIDQ5ICovCi0gIHN0X05pbCwJCQkvKiAgNTAgKi8KLSAgc3RfTmlsLAkJCS8qICA1MSAqLwotICBzdF9OaWwsCQkJLyogIDUyICovCi0gIHN0X05pbCwJCQkvKiAgNTMgKi8KLSAgc3RfTmlsLAkJCS8qICA1NCAqLwotICBzdF9OaWwsCQkJLyogIDU1ICovCi0gIHN0X05pbCwJCQkvKiAgNTYgKi8KLSAgc3RfTmlsLAkJCS8qICA1NyAqLwotICBzdF9OaWwsCQkJLyogIDU4ICovCi0gIHN0X05pbCwJCQkvKiAgNTkgKi8KLSAgc3RfTmlsLAkJCS8qICA2MCAqLwotICBzdF9OaWwsCQkJLyogIDYxICovCi0gIHN0X05pbCwJCQkvKiAgNjIgKi8KLSAgc3RfTmlsLAkJCS8qICA2MyAqLwotICBzdF9OaWwsCQkJLyogIDY0ICovCi0gIHN0X05pbCwJCQkvKiAgNjUgKi8KLSAgc3RfTmlsLAkJCS8qICA2NiAqLwotICBzdF9OaWwsCQkJLyogIDY3ICovCi0gIHN0X05pbCwJCQkvKiAgNjggKi8KLSAgc3RfTmlsLAkJCS8qICA2OSAqLwotICBzdF9OaWwsCQkJLyogIDcwICovCi0gIHN0X05pbCwJCQkvKiAgNzEgKi8KLSAgc3RfTmlsLAkJCS8qICA3MiAqLwotICBzdF9OaWwsCQkJLyogIDczICovCi0gIHN0X05pbCwJCQkvKiAgNzQgKi8KLSAgc3RfTmlsLAkJCS8qICA3NSAqLwotICBzdF9OaWwsCQkJLyogIDc2ICovCi0gIHN0X05pbCwJCQkvKiAgNzcgKi8KLSAgc3RfTmlsLAkJCS8qICA3OCAqLwotICBzdF9OaWwsCQkJLyogIDc5ICovCi0gIHN0X05pbCwJCQkvKiAgODAgKi8KLSAgc3RfTmlsLAkJCS8qICA4MSAqLwotICBzdF9OaWwsCQkJLyogIDgyICovCi0gIHN0X05pbCwJCQkvKiAgODMgKi8KLSAgc3RfTmlsLAkJCS8qICA4NCAqLwotICBzdF9OaWwsCQkJLyogIDg1ICovCi0gIHN0X05pbCwJCQkvKiAgODYgKi8KLSAgc3RfTmlsLAkJCS8qICA4NyAqLwotICBzdF9OaWwsCQkJLyogIDg4ICovCi0gIHN0X05pbCwJCQkvKiAgODkgKi8KLSAgc3RfTmlsLAkJCS8qICA5MCAqLwotICBzdF9OaWwsCQkJLyogIDkxICovCi0gIHN0X05pbCwJCQkvKiAgOTIgKi8KLSAgc3RfTmlsLAkJCS8qICA5MyAqLwotICBzdF9OaWwsCQkJLyogIDk0ICovCi0gIHN0X05pbCwJCQkvKiAgOTUgKi8KLSAgc3RfTmlsLAkJCS8qICA5NiAqLwotICBzdF9OaWwsCQkJLyogIDk3ICovCi0gIHN0X05pbCwJCQkvKiAgOTggKi8KLSAgc3RfTmlsLAkJCS8qICA5OSAqLwotICBzdF9CbG9jaywJCQkvKiAxMDA6IENfQkxPQ0sgIGJsb2NrIHN0YXJ0L2VuZCAqLwotICBzdF9Qcm9jLAkJCS8qIDEwMTogQ19GQ04JIGZ1bmN0aW9uIHN0YXJ0L2VuZCAqLwotICBzdF9FbmQsCQkJLyogMTAyOiBDX0VPUwkgZW5kIG9mIHN0cnVjdC91bmlvbi9lbnVtICovCi0gIHN0X0ZpbGUsCQkJLyogMTAzOiBDX0ZJTEUJIGZpbGUgc3RhcnQgKi8KLSAgc3RfTmlsLAkJCS8qIDEwNDogQ19MSU5FCSBsaW5lIG51bWJlciAqLwotICBzdF9OaWwsCQkJLyogMTA1OiBDX0FMSUFTCSBjb21iaW5lZCB0eXBlIGluZm8gKi8KLSAgc3RfTmlsLAkJCS8qIDEwNjogQ19ISURERU4gPz8/ICovCi19OwotCi0KLS8qIEtlZXAgdHJhY2sgb2YgZGlmZmVyZW50IHNpemVkIGFsbG9jYXRpb24gcmVxdWVzdHMuICAqLwotc3RhdGljIGFsbG9jX2luZm9fdCBhbGxvY19jb3VudHNbIChpbnQpYWxsb2NfdHlwZV9sYXN0IF07Ci0MCi0vKiBSZWNvcmQgd2hldGhlciB3ZSBoYXZlIHNlZW4gYW55IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1pbnQgZWNvZmZfZGVidWdnaW5nX3NlZW4gPSAwOwotCi0vKiBWYXJpb3VzIHN0YXRpY3MuICAqLwotc3RhdGljIGVmZHJfdCAgKmN1cl9maWxlX3B0cgk9IChlZmRyX3QgKikgMDsJLyogY3VycmVudCBmaWxlIGRlc2MuIGhlYWRlciAqLwotc3RhdGljIHByb2NfdCAgKmN1cl9wcm9jX3B0cgk9IChwcm9jX3QgKikgMDsJLyogY3VycmVudCBwcm9jZWR1cmUgaGVhZGVyICovCi1zdGF0aWMgcHJvY190ICAqZmlyc3RfcHJvY19wdHIgID0gKHByb2NfdCAqKSAwOyAvKiBmaXJzdCBwcm9jZWR1cmUgaGVhZGVyICovCi1zdGF0aWMgdGhlYWRfdCAqdG9wX3RhZ19oZWFkCT0gKHRoZWFkX3QgKikgMDsgLyogdG9wIGxldmVsIHRhZyBoZWFkICovCi1zdGF0aWMgdGhlYWRfdCAqY3VyX3RhZ19oZWFkCT0gKHRoZWFkX3QgKikgMDsgLyogY3VycmVudCB0YWcgaGVhZCAqLwotI2lmZGVmIEVDT0ZGX0RFQlVHCi1zdGF0aWMgaW50CWRlYnVnCQk9IDA7IAkJLyogdHJhY2UgZnVuY3Rpb25zICovCi0jZW5kaWYKLXN0YXRpYyBpbnQJc3RhYnNfc2Vlbgk9IDA7CQkvKiAhPSAwIGlmIHN0YWJzIGhhdmUgYmVlbiBzZWVuICovCi0KLXN0YXRpYyBpbnQgY3VycmVudF9maWxlX2lkeDsKLXN0YXRpYyBjb25zdCBjaGFyICpjdXJyZW50X3N0YWJzX2ZpbGVuYW1lOwotCi0vKiBQc2V1ZG8gc3ltYm9sIHRvIHVzZSB3aGVuIHB1dHRpbmcgc3RhYnMgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSNpZm5kZWYgU1RBQlNfU1lNQk9MCi0jZGVmaW5lIFNUQUJTX1NZTUJPTCAiQHN0YWJzIgotI2VuZGlmCi0KLXN0YXRpYyBjaGFyIHN0YWJzX3N5bWJvbFtdID0gU1RBQlNfU1lNQk9MOwotDAotLyogUHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQgYWRkX3ZhcnJheV9wYWdlIFBBUkFNUyAoKHZhcnJheV90ICp2cCkpOwotc3RhdGljIHN5bWludF90IGFkZF9zdHJpbmcgUEFSQU1TICgodmFycmF5X3QgKnZwLAotCQkJCSAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoYXNoX3RibCwKLQkJCQkgICAgY29uc3QgY2hhciAqc3RyLAotCQkJCSAgICBzaGFzaF90ICoqcmV0X2hhc2gpKTsKLXN0YXRpYyBsb2NhbHN5bV90ICphZGRfZWNvZmZfc3ltYm9sIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnN0ciwgc3RfdCB0eXBlLAotCQkJCQkgICAgIHNjX3Qgc3RvcmFnZSwgc3ltYm9sUyAqc3ltLAotCQkJCQkgICAgIGJmZF92bWEgYWRkZW5kLCBzeW1pbnRfdCB2YWx1ZSwKLQkJCQkJICAgICBzeW1pbnRfdCBpbmR4KSk7Ci1zdGF0aWMgc3ltaW50X3QgYWRkX2F1eF9zeW1fc3ltaW50IFBBUkFNUyAoKHN5bWludF90IGF1eF93b3JkKSk7Ci1zdGF0aWMgc3ltaW50X3QgYWRkX2F1eF9zeW1fcm5keCBQQVJBTVMgKChpbnQgZmlsZV9pbmRleCwKLQkJCQkJICBzeW1pbnRfdCBzeW1faW5kZXgpKTsKLXN0YXRpYyBzeW1pbnRfdCBhZGRfYXV4X3N5bV90aXIgUEFSQU1TICgodHlwZV9pbmZvX3QgKnQsCi0JCQkJCSBoYXNoX3N0YXRlX3Qgc3RhdGUsCi0JCQkJCSB0aGFzaF90ICoqaGFzaF90YmwpKTsKLXN0YXRpYyB0YWdfdCAqZ2V0X3RhZyBQQVJBTVMgKChjb25zdCBjaGFyICp0YWcsIGxvY2Fsc3ltX3QgKnN5bSwKLQkJCSAgICAgICBidF90IGJhc2ljX3R5cGUpKTsKLXN0YXRpYyB2b2lkIGFkZF91bmtub3duX3RhZyBQQVJBTVMgKCh0YWdfdCAqcHRhZykpOwotc3RhdGljIHZvaWQgYWRkX3Byb2NlZHVyZSBQQVJBTVMgKChjaGFyICpmdW5jKSk7Ci1zdGF0aWMgdm9pZCBhZGRfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlX25hbWUsIGludCBpbmR4LCBpbnQgZmFrZSkpOwotI2lmZGVmIEVDT0ZGX0RFQlVHCi1zdGF0aWMgY2hhciAqc2NfdG9fc3RyaW5nIFBBUkFNUyAoKHNjX3Qgc3RvcmFnZV9jbGFzcykpOwotc3RhdGljIGNoYXIgKnN0X3RvX3N0cmluZyBQQVJBTVMgKChzdF90IHN5bWJvbF90eXBlKSk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIG1hcmtfc3RhYnMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgY2hhciAqZWNvZmZfYWRkX2J5dGVzIFBBUkFNUyAoKGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JCQkJICAgICAgY2hhciAqYnVmcHRyLCB1bnNpZ25lZCBsb25nIG5lZWQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX3BhZGRpbmdfYWRqdXN0Ci0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBjaGFyICoqYnVmcHRycHRyKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9saW5lbm8KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGxvbmcgKmxpbmVjbnRwdHIpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX3N5bWJvbHMKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX3Byb2NzCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9hdXgKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX3N0cmluZ3MgUEFSQU1TICgoY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkJCQkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0JCQkJCQkgIHZhcnJheV90ICp2cCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfc3MKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX2ZkcgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOwotc3RhdGljIHZvaWQgZWNvZmZfc2V0dXBfZXh0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBwYWdlX3R5cGUgKmFsbG9jYXRlX2NsdXN0ZXIgUEFSQU1TICgodW5zaWduZWQgbG9uZyBucGFnZXMpKTsKLXN0YXRpYyBwYWdlX3R5cGUgKmFsbG9jYXRlX3BhZ2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHNjb3BlX3QgKmFsbG9jYXRlX3Njb3BlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGZyZWVfc2NvcGUgUEFSQU1TICgoc2NvcGVfdCAqcHRyKSk7Ci1zdGF0aWMgdmxpbmtzX3QgKmFsbG9jYXRlX3ZsaW5rcyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgc2hhc2hfdCAqYWxsb2NhdGVfc2hhc2ggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHRoYXNoX3QgKmFsbG9jYXRlX3RoYXNoIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB0YWdfdCAqYWxsb2NhdGVfdGFnIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGZyZWVfdGFnIFBBUkFNUyAoKHRhZ190ICpwdHIpKTsKLXN0YXRpYyBmb3J3YXJkX3QgKmFsbG9jYXRlX2ZvcndhcmQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHRoZWFkX3QgKmFsbG9jYXRlX3RoZWFkIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGZyZWVfdGhlYWQgUEFSQU1TICgodGhlYWRfdCAqcHRyKSk7Ci1zdGF0aWMgbGluZW5vX2xpc3RfdCAqYWxsb2NhdGVfbGluZW5vX2xpc3QgUEFSQU1TICgodm9pZCkpOwotDAotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGFzc2VtYmxlciBzdGFydHMgdXAuICAqLwotCi12b2lkCi1lY29mZl9yZWFkX2JlZ2luX2hvb2sgKCkKLXsKLSAgdGFnX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgdG9wX3RhZ19oZWFkID0gYWxsb2NhdGVfdGhlYWQgKCk7Ci0gIHRvcF90YWdfaGVhZC0+Zmlyc3RfdGFnID0gKHRhZ190ICopIE5VTEw7Ci0gIHRvcF90YWdfaGVhZC0+ZnJlZSA9ICh0aGVhZF90ICopIE5VTEw7Ci0gIHRvcF90YWdfaGVhZC0+cHJldiA9IGN1cl90YWdfaGVhZDsKLSAgY3VyX3RhZ19oZWFkID0gdG9wX3RhZ19oZWFkOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIHN5bWJvbCBpcyBjcmVhdGVkLiAgKi8KLQotdm9pZAotZWNvZmZfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBPQkpfU1lNRklFTERfVFlQRSAqb2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSBmaWxlIHBvaW50ZXIsIGJ1dCBvbmx5IGlmIHdlIGhhdmUgc2VlbiBhCi0gICAgIGZpbGUuICBJZiB3ZSBoYXZlbid0IHNlZW4gYSBmaWxlLCB0aGVuIHRoaXMgaXMgYSBwcm9iYWJseSBzcGVjaWFsCi0gICAgIHN5bWJvbCBjcmVhdGVkIGJ5IG1kX2JlZ2luIHdoaWNoIG1heSByZXF1aXJlZCBzcGVjaWFsIGhhbmRsaW5nIGF0Ci0gICAgIHNvbWUgcG9pbnQuICBDcmVhdGluZyBhIGR1bW15IGZpbGUgd2l0aCBhIGR1bW15IG5hbWUgaXMgY2VydGFpbmx5Ci0gICAgIHdyb25nLiAgKi8KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwKLSAgICAgICYmIHNlZW5fYXRfbGVhc3RfMV9maWxlICgpKQotICAgIGFkZF9maWxlICgoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAxKTsKLSAgb2JqID0gc3ltYm9sX2dldF9vYmogKHN5bWJvbFApOwotICBvYmotPmVjb2ZmX2ZpbGUgPSBjdXJfZmlsZV9wdHI7Ci0gIG9iai0+ZWNvZmZfc3ltYm9sID0gTlVMTDsKLSAgb2JqLT5lY29mZl9leHRlcm5fc2l6ZSA9IDA7Ci19Ci0MCi0vKiBBZGQgYSBwYWdlIHRvIGEgdmFycmF5IG9iamVjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGRfdmFycmF5X3BhZ2UgKHZwKQotICAgICB2YXJyYXlfdCAqdnA7CQkJCS8qIHZhcnJheSB0byBhZGQgcGFnZSB0byAqLwotewotICB2bGlua3NfdCAqbmV3X2xpbmtzID0gYWxsb2NhdGVfdmxpbmtzICgpOwotCi0jaWZkZWYgTUFMTE9DX0NIRUNLCi0gIGlmICh2cC0+b2JqZWN0X3NpemUgPiAxKQotICAgIG5ld19saW5rcy0+ZGF0dW0gPSAocGFnZV90eXBlICopIHhjYWxsb2MgKDEsIHZwLT5vYmplY3Rfc2l6ZSk7Ci0gIGVsc2UKLSNlbmRpZgotICAgIG5ld19saW5rcy0+ZGF0dW0gPSBhbGxvY2F0ZV9wYWdlICgpOwotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmFycmF5XS50b3RhbF9hbGxvYysrOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZhcnJheV0udG90YWxfcGFnZXMrKzsKLQotICBuZXdfbGlua3MtPnN0YXJ0X2luZGV4ID0gdnAtPm51bV9hbGxvY2F0ZWQ7Ci0gIHZwLT5vYmplY3RzX2xhc3RfcGFnZSA9IDA7Ci0KLSAgaWYgKHZwLT5maXJzdCA9PSAodmxpbmtzX3QgKikgTlVMTCkJCS8qIGZpcnN0IGFsbG9jYXRpb24/ICovCi0gICAgdnAtPmZpcnN0ID0gdnAtPmxhc3QgPSBuZXdfbGlua3M7Ci0gIGVsc2UKLSAgICB7CQkJCQkJLyogMm5kIG9yIGdyZWF0ZXIgYWxsb2NhdGlvbiAqLwotICAgICAgbmV3X2xpbmtzLT5wcmV2ID0gdnAtPmxhc3Q7Ci0gICAgICB2cC0+bGFzdC0+bmV4dCA9IG5ld19saW5rczsKLSAgICAgIHZwLT5sYXN0ID0gbmV3X2xpbmtzOwotICAgIH0KLX0KLQwKLS8qIEFkZCBhIHN0cmluZyAoYW5kIG51bGwgcGFkKSB0byBvbmUgb2YgdGhlIHN0cmluZyB0YWJsZXMuICAqLwotCi1zdGF0aWMgc3ltaW50X3QKLWFkZF9zdHJpbmcgKHZwLCBoYXNoX3RibCwgc3RyLCByZXRfaGFzaCkKLSAgICAgdmFycmF5X3QgKnZwOwkJCS8qIHN0cmluZyBvYnN0YWNrICovCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhc2hfdGJsOwkvKiBwdHIgdG8gaGFzaCB0YWJsZSAqLwotICAgICBjb25zdCBjaGFyICpzdHI7CQkJLyogc3RyaW5nICovCi0gICAgIHNoYXNoX3QgKipyZXRfaGFzaDsJCS8qIHJldHVybiBoYXNoIHBvaW50ZXIgKi8KLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBsZW4gPSBzdHJsZW4gKHN0cik7Ci0gIHJlZ2lzdGVyIHNoYXNoX3QgKmhhc2hfcHRyOwotCi0gIGlmIChsZW4gPj0gUEFHRV9VU0laRSkKLSAgICBhc19mYXRhbCAoXygiU3RyaW5nIHRvbyBiaWcgKCVsdSBieXRlcykiKSwgbGVuKTsKLQotICBoYXNoX3B0ciA9IChzaGFzaF90ICopIGhhc2hfZmluZCAoaGFzaF90YmwsIHN0cik7Ci0gIGlmIChoYXNoX3B0ciA9PSAoc2hhc2hfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmVycjsKLQotICAgICAgaWYgKHZwLT5vYmplY3RzX2xhc3RfcGFnZSArIGxlbiA+PSBQQUdFX1VTSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgdnAtPm51bV9hbGxvY2F0ZWQgPQotICAgICAgICAgICAgKCh2cC0+bnVtX2FsbG9jYXRlZCArIFBBR0VfVVNJWkUgLSAxKSAvIFBBR0VfVVNJWkUpICogUEFHRV9VU0laRTsKLSAgICAgICAgICBhZGRfdmFycmF5X3BhZ2UgKHZwKTsKLSAgICAgICAgfQotCi0gICAgICBoYXNoX3B0ciA9IGFsbG9jYXRlX3NoYXNoICgpOwotICAgICAgaGFzaF9wdHItPmluZHggPSB2cC0+bnVtX2FsbG9jYXRlZDsKLQotICAgICAgaGFzaF9wdHItPnN0cmluZyA9ICZ2cC0+bGFzdC0+ZGF0dW0tPmJ5dGVbdnAtPm9iamVjdHNfbGFzdF9wYWdlXTsKLQotICAgICAgdnAtPm9iamVjdHNfbGFzdF9wYWdlICs9IGxlbiArIDE7Ci0gICAgICB2cC0+bnVtX2FsbG9jYXRlZCArPSBsZW4gKyAxOwotCi0gICAgICBzdHJjcHkgKGhhc2hfcHRyLT5zdHJpbmcsIHN0cik7Ci0KLSAgICAgIGVyciA9IGhhc2hfaW5zZXJ0IChoYXNoX3RibCwgc3RyLCAoY2hhciAqKSBoYXNoX3B0cik7Ci0gICAgICBpZiAoZXJyKQotCWFzX2ZhdGFsIChfKCJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3RyaW5nIGhhc2ggdGFibGU6ICVzIiksCi0JCSAgc3RyLCBlcnIpOwotICAgIH0KLQotICBpZiAocmV0X2hhc2ggIT0gKHNoYXNoX3QgKiopIE5VTEwpCi0gICAgKnJldF9oYXNoID0gaGFzaF9wdHI7Ci0KLSAgcmV0dXJuIGhhc2hfcHRyLT5pbmR4OwotfQotDAotLyogQWRkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotCi1zdGF0aWMgbG9jYWxzeW1fdCAqCi1hZGRfZWNvZmZfc3ltYm9sIChzdHIsIHR5cGUsIHN0b3JhZ2UsIHN5bV92YWx1ZSwgYWRkZW5kLCB2YWx1ZSwgaW5keCkKLSAgICAgY29uc3QgY2hhciAqc3RyOwkJCS8qIHN5bWJvbCBuYW1lICovCi0gICAgIHN0X3QgdHlwZTsJCQkJLyogc3ltYm9sIHR5cGUgKi8KLSAgICAgc2NfdCBzdG9yYWdlOwkJCS8qIHN0b3JhZ2UgY2xhc3MgKi8KLSAgICAgc3ltYm9sUyAqc3ltX3ZhbHVlOwkJLyogYXNzb2NpYXRlZCBzeW1ib2wuICAqLwotICAgICBiZmRfdm1hIGFkZGVuZDsJCQkvKiBhZGRlbmQgdG8gc3ltX3ZhbHVlLiAgKi8KLSAgICAgc3ltaW50X3QgdmFsdWU7CQkJLyogdmFsdWUgb2Ygc3ltYm9sICovCi0gICAgIHN5bWludF90IGluZHg7CQkJLyogaW5kZXggdG8gbG9jYWwvYXV4LiBzeW1zICovCi17Ci0gIGxvY2Fsc3ltX3QgKnBzeW07Ci0gIHJlZ2lzdGVyIHNjb3BlX3QgKnBzY29wZTsKLSAgcmVnaXN0ZXIgdGhlYWRfdCAqcHRhZ19oZWFkOwotICByZWdpc3RlciB0YWdfdCAqcHRhZzsKLSAgcmVnaXN0ZXIgdGFnX3QgKnB0YWdfbmV4dDsKLSAgcmVnaXN0ZXIgdmFycmF5X3QgKnZwOwotICByZWdpc3RlciBpbnQgc2NvcGVfZGVsdGEgPSAwOwotICBzaGFzaF90ICpoYXNoX3B0ciA9IChzaGFzaF90ICopIE5VTEw7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIm5vIGN1cnJlbnQgZmlsZSBwb2ludGVyIikpOwotCi0gIHZwID0gJmN1cl9maWxlX3B0ci0+c3ltYm9sczsKLQotIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPT0gdnAtPm9iamVjdHNfcGVyX3BhZ2UpCi0gICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7Ci0KLSAgcHN5bSA9ICZ2cC0+bGFzdC0+ZGF0dW0tPnN5bVsgdnAtPm9iamVjdHNfbGFzdF9wYWdlKysgXTsKLQotICBpZiAoc3RyID09IChjb25zdCBjaGFyICopIE5VTEwgJiYgc3ltX3ZhbHVlICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgcHN5bS0+bmFtZSA9IFNfR0VUX05BTUUgKHN5bV92YWx1ZSk7Ci0gIGVsc2UKLSAgICBwc3ltLT5uYW1lID0gc3RyOwotICBwc3ltLT5hc19zeW0gPSBzeW1fdmFsdWU7Ci0gIGlmIChzeW1fdmFsdWUgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICBzeW1ib2xfZ2V0X29iaiAoc3ltX3ZhbHVlKS0+ZWNvZmZfc3ltYm9sID0gcHN5bTsKLSAgcHN5bS0+YWRkZW5kID0gYWRkZW5kOwotICBwc3ltLT5maWxlX3B0ciA9IGN1cl9maWxlX3B0cjsKLSAgcHN5bS0+cHJvY19wdHIgPSBjdXJfcHJvY19wdHI7Ci0gIHBzeW0tPmJlZ2luX3B0ciA9IChsb2NhbHN5bV90ICopIE5VTEw7Ci0gIHBzeW0tPmluZGV4X3B0ciA9IChhdXhfdCAqKSBOVUxMOwotICBwc3ltLT5mb3J3YXJkX3JlZiA9IChmb3J3YXJkX3QgKikgTlVMTDsKLSAgcHN5bS0+c3ltX2luZGV4ID0gLTE7Ci0gIG1lbXNldCAoJnBzeW0tPmVjb2ZmX3N5bSwgMCwgc2l6ZW9mIChFWFRSKSk7Ci0gIHBzeW0tPmVjb2ZmX3N5bS5hc3ltLnZhbHVlID0gdmFsdWU7Ci0gIHBzeW0tPmVjb2ZmX3N5bS5hc3ltLnN0ID0gKHVuc2lnbmVkKSB0eXBlOwotICBwc3ltLT5lY29mZl9zeW0uYXN5bS5zYyA9ICh1bnNpZ25lZCkgc3RvcmFnZTsKLSAgcHN5bS0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBpbmR4OwotCi0gIC8qIElmIHRoZXJlIGlzIGFuIGFzc29jaWF0ZWQgc3ltYm9sLCB3ZSB3YWl0IHVudGlsIHRoZSBlbmQgb2YgdGhlCi0gICAgIGFzc2VtYmx5IGJlZm9yZSBkZWNpZGluZyB3aGVyZSB0byBwdXQgdGhlIG5hbWUgKGl0IG1heSBiZSBqdXN0IGFuCi0gICAgIGV4dGVybmFsIHN5bWJvbCkuICBPdGhlcndpc2UsIHRoaXMgaXMganVzdCBhIGRlYnVnZ2luZyBzeW1ib2wgYW5kCi0gICAgIHRoZSBuYW1lIHNob3VsZCBnbyB3aXRoIHRoZSBjdXJyZW50IGZpbGUuICAqLwotICBpZiAoc3ltX3ZhbHVlID09IChzeW1ib2xTICopIE5VTEwpCi0gICAgcHN5bS0+ZWNvZmZfc3ltLmFzeW0uaXNzID0gKChzdHIgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkJCQk/IDAKLQkJCQk6IGFkZF9zdHJpbmcgKCZjdXJfZmlsZV9wdHItPnN0cmluZ3MsCi0JCQkJCSAgICAgIGN1cl9maWxlX3B0ci0+c3RyX2hhc2gsCi0JCQkJCSAgICAgIHN0ciwKLQkJCQkJICAgICAgJmhhc2hfcHRyKSk7Ci0KLSAgKyt2cC0+bnVtX2FsbG9jYXRlZDsKLQotICBpZiAoRUNPRkZfSVNfU1RBQiAoJnBzeW0tPmVjb2ZmX3N5bS5hc3ltKSkKLSAgICByZXR1cm4gcHN5bTsKLQotICAvKiBTYXZlIHRoZSBzeW1ib2wgd2l0aGluIHRoZSBoYXNoIHRhYmxlIGlmIHRoaXMgaXMgYSBzdGF0aWMKLSAgICAgaXRlbSwgYW5kIGl0IGhhcyBhIG5hbWUuICAqLwotICBpZiAoaGFzaF9wdHIgIT0gKHNoYXNoX3QgKikgTlVMTAotICAgICAgJiYgKHR5cGUgPT0gc3RfR2xvYmFsIHx8IHR5cGUgPT0gc3RfU3RhdGljIHx8IHR5cGUgPT0gc3RfTGFiZWwKLQkgIHx8IHR5cGUgPT0gc3RfUHJvYyB8fCB0eXBlID09IHN0X1N0YXRpY1Byb2MpKQotICAgIGhhc2hfcHRyLT5zeW1fcHRyID0gcHN5bTsKLQotICAvKiBwdXNoIG9yIHBvcCBhIHNjb3BlIGlmIGFwcHJvcHJpYXRlLiAgKi8KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHN0X0ZpbGU6CQkJLyogYmVnaW5uaW5nIG9mIGZpbGUgKi8KLSAgICBjYXNlIHN0X1Byb2M6CQkJLyogcHJvY2VkdXJlICovCi0gICAgY2FzZSBzdF9TdGF0aWNQcm9jOgkJCS8qIHN0YXRpYyBwcm9jZWR1cmUgKi8KLSAgICBjYXNlIHN0X0Jsb2NrOgkJCS8qIGJlZ2luIHNjb3BlICovCi0gICAgICBwc2NvcGUgPSBhbGxvY2F0ZV9zY29wZSAoKTsKLSAgICAgIHBzY29wZS0+cHJldiA9IGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlOwotICAgICAgcHNjb3BlLT5sc3ltID0gcHN5bTsKLSAgICAgIHBzY29wZS0+dHlwZSA9IHR5cGU7Ci0gICAgICBjdXJfZmlsZV9wdHItPmN1cl9zY29wZSA9IHBzY29wZTsKLQotICAgICAgaWYgKHR5cGUgIT0gc3RfRmlsZSkKLQlzY29wZV9kZWx0YSA9IDE7Ci0KLSAgICAgIC8qIEZvciBldmVyeSBibG9jayB0eXBlIGV4Y2VwdCBmaWxlLCBzdHJ1Y3QsIHVuaW9uLCBvcgotCSBlbnVtZXJhdGlvbiBibG9ja3MsIHB1c2ggYSBsZXZlbCBvbiB0aGUgdGFnIHN0YWNrLiAgV2Ugb21pdAotCSBmaWxlIHR5cGVzLCBzbyB0aGF0IHRhZ3MgY2FuIHNwYW4gZmlsZSBib3VuZGFyaWVzLiAgKi8KLSAgICAgIGlmICh0eXBlICE9IHN0X0ZpbGUgJiYgc3RvcmFnZSAhPSBzY19JbmZvKQotCXsKLQkgIHB0YWdfaGVhZCA9IGFsbG9jYXRlX3RoZWFkICgpOwotCSAgcHRhZ19oZWFkLT5maXJzdF90YWcgPSAwOwotCSAgcHRhZ19oZWFkLT5wcmV2ID0gY3VyX3RhZ19oZWFkOwotCSAgY3VyX3RhZ19oZWFkID0gcHRhZ19oZWFkOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBzdF9FbmQ6Ci0gICAgICBwc2NvcGUgPSBjdXJfZmlsZV9wdHItPmN1cl9zY29wZTsKLSAgICAgIGlmIChwc2NvcGUgPT0gKHNjb3BlX3QgKikgTlVMTCkKLQlhc19mYXRhbCAoXygidG9vIG1hbnkgc3RfRW5kJ3MiKSk7Ci0gICAgICBlbHNlCi0JewotCSAgc3RfdCBiZWdpbl90eXBlID0gKHN0X3QpIHBzY29wZS0+bHN5bS0+ZWNvZmZfc3ltLmFzeW0uc3Q7Ci0KLQkgIHBzeW0tPmJlZ2luX3B0ciA9IHBzY29wZS0+bHN5bTsKLQotCSAgaWYgKGJlZ2luX3R5cGUgIT0gc3RfRmlsZSkKLQkgICAgc2NvcGVfZGVsdGEgPSAtMTsKLQotCSAgLyogRXhjZXB0IGZvciBmaWxlLCBzdHJ1Y3R1cmUsIHVuaW9uLCBvciBlbnVtZXJhdGlvbiBlbmQKLQkgICAgIGJsb2NrcyByZW1vdmUgYWxsIHRhZ3MgY3JlYXRlZCB3aXRoaW4gdGhpcyBzY29wZS4gICovCi0JICBpZiAoYmVnaW5fdHlwZSAhPSBzdF9GaWxlICYmIHN0b3JhZ2UgIT0gc2NfSW5mbykKLQkgICAgewotCSAgICAgIHB0YWdfaGVhZCA9IGN1cl90YWdfaGVhZDsKLQkgICAgICBjdXJfdGFnX2hlYWQgPSBwdGFnX2hlYWQtPnByZXY7Ci0KLQkgICAgICBmb3IgKHB0YWcgPSBwdGFnX2hlYWQtPmZpcnN0X3RhZzsKLQkJICAgcHRhZyAhPSAodGFnX3QgKikgTlVMTDsKLQkJICAgcHRhZyA9IHB0YWdfbmV4dCkKLQkJewotCQkgIGlmIChwdGFnLT5mb3J3YXJkX3JlZiAhPSAoZm9yd2FyZF90ICopIE5VTEwpCi0JCSAgICBhZGRfdW5rbm93bl90YWcgKHB0YWcpOwotCi0JCSAgcHRhZ19uZXh0ID0gcHRhZy0+c2FtZV9ibG9jazsKLQkJICBwdGFnLT5oYXNoX3B0ci0+dGFnX3B0ciA9IHB0YWctPnNhbWVfbmFtZTsKLQkJICBmcmVlX3RhZyAocHRhZyk7Ci0JCX0KLQotCSAgICAgIGZyZWVfdGhlYWQgKHB0YWdfaGVhZCk7Ci0JICAgIH0KLQotCSAgY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUgPSBwc2NvcGUtPnByZXY7Ci0KLQkgIC8qIGJsb2NrIGJlZ2luIGdldHMgbmV4dCBzeW0gIy4gIFRoaXMgaXMgc2V0IHdoZW4gd2Uga25vdwotCSAgICAgdGhlIHN5bWJvbCBpbmRleCB2YWx1ZS4gICovCi0KLQkgIC8qIEZ1bmN0aW9ucyBwdXNoIHR3byBvciBtb3JlIGF1eCB3b3JkcyBhcyBmb2xsb3dzOgotCSAgICAgMXN0IHdvcmQ6IGluZGV4KzEgb2YgdGhlIGVuZCBzeW1ib2wgKGZpbGxlZCBpbiBsYXRlcikuCi0JICAgICAybmQgd29yZDogdHlwZSBvZiB0aGUgZnVuY3Rpb24gKHBsdXMgYW55IGF1eCB3b3JkcyBuZWVkZWQpLgotCSAgICAgQWxzbywgdGllIHRoZSBleHRlcm5hbCBwb2ludGVyIGJhY2sgdG8gdGhlIGZ1bmN0aW9uIGJlZ2luIHN5bWJvbC4gICovCi0JICBpZiAoYmVnaW5fdHlwZSAhPSBzdF9GaWxlICYmIGJlZ2luX3R5cGUgIT0gc3RfQmxvY2spCi0JICAgIHsKLQkgICAgICBzeW1pbnRfdCB0eTsKLQkgICAgICB2YXJyYXlfdCAqc3ZwID0gJmN1cl9maWxlX3B0ci0+YXV4X3N5bXM7Ci0KLQkgICAgICBwc2NvcGUtPmxzeW0tPmVjb2ZmX3N5bS5hc3ltLmluZGV4ID0gYWRkX2F1eF9zeW1fc3ltaW50ICgwKTsKLQkgICAgICBwc2NvcGUtPmxzeW0tPmluZGV4X3B0ciA9Ci0JCSZzdnAtPmxhc3QtPmRhdHVtLT5hdXhbc3ZwLT5vYmplY3RzX2xhc3RfcGFnZSAtIDFdOwotCSAgICAgIHR5ID0gYWRkX2F1eF9zeW1fdGlyICgmbGFzdF9mdW5jX3R5cGVfaW5mbywKLQkJCQkgICAgaGFzaF9ubywKLQkJCQkgICAgJmN1cl9maWxlX3B0ci0+dGhhc2hfaGVhZFswXSk7Ci0KLS8qIFRoaXMgc2VlbXMgdG8gYmUgdW5uZWNlc3NhcnkuICBJJ20gbm90IGV2ZW4gc3VyZSB3aGF0IGl0IGlzCi0gKiBpbnRlbmRlZCB0byBkby4gIEl0J3MgZnJvbSBtaXBzLXRmaWxlLgotICoJICAgICAgaWYgKGxhc3RfZnVuY19zeW1fdmFsdWUgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAqCQl7Ci0gKgkJICBsYXN0X2Z1bmNfc3ltX3ZhbHVlLT5pZmQgPSBjdXJfZmlsZV9wdHItPmZpbGVfaW5kZXg7Ci0gKgkJICBsYXN0X2Z1bmNfc3ltX3ZhbHVlLT5pbmRleCA9IHR5OwotICoJCX0KLSAqLwotCSAgICB9Ci0KLQkgIGZyZWVfc2NvcGUgKHBzY29wZSk7Ci0JfQotICAgIH0KLQotICBjdXJfZmlsZV9wdHItPm5lc3RlZF9zY29wZXMgKz0gc2NvcGVfZGVsdGE7Ci0KLSNpZmRlZiBFQ09GRl9ERUJVRwotICBpZiAoZGVidWcgJiYgdHlwZSAhPSBzdF9GaWxlCi0gICAgICAmJiAoZGVidWcgPiAyIHx8IHR5cGUgPT0gc3RfQmxvY2sgfHwgdHlwZSA9PSBzdF9FbmQKLQkgIHx8IHR5cGUgPT0gc3RfUHJvYyB8fCB0eXBlID09IHN0X1N0YXRpY1Byb2MpKQotICAgIHsKLSAgICAgIGNoYXIgKnNjX3N0ciA9IHNjX3RvX3N0cmluZyAoc3RvcmFnZSk7Ci0gICAgICBjaGFyICpzdF9zdHIgPSBzdF90b19zdHJpbmcgKHR5cGUpOwotICAgICAgaW50IGRlcHRoID0gY3VyX2ZpbGVfcHRyLT5uZXN0ZWRfc2NvcGVzICsgKHNjb3BlX2RlbHRhIDwgMCk7Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgICAgIlx0bHN5bVx0dj0gJTEwbGQsIGRlcHRoPSAlMmQsIHNjPSAlLTEycyIsCi0JICAgICAgIHZhbHVlLCBkZXB0aCwgc2Nfc3RyKTsKLQotICAgICAgaWYgKHN0cl9zdGFydCAmJiBzdHJfZW5kX3AxIC0gc3RyX3N0YXJ0ID4gMCkKLQlmcHJpbnRmIChzdGRlcnIsICIgc3Q9ICUtMTFzIG5hbWU9ICUuKnNcbiIsIHN0X3N0ciwgc3RyX2VuZF9wMSAtIHN0cl9zdGFydCwgc3RyX3N0YXJ0KTsKLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGxlbiA9IHN0cmxlbiAoc3Rfc3RyKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiBzdD0gJS4qc1xuIiwgbGVuLTEsIHN0X3N0cik7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiBwc3ltOwotfQotDAotLyogQWRkIGFuIGF1eGlsaWFyeSBzeW1ib2wgKHBhc3NpbmcgYSBzeW1pbnQpLiAgVGhpcyBpcyBhY3R1YWxseSB1c2VkCi0gICBmb3IgaW50ZWdyYWwgYXV4IHR5cGVzLCBub3QganVzdCBzeW1pbnRzLiAgKi8KLQotc3RhdGljIHN5bWludF90Ci1hZGRfYXV4X3N5bV9zeW1pbnQgKGF1eF93b3JkKQotICAgICBzeW1pbnRfdCBhdXhfd29yZDsJCS8qIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiB3b3JkICovCi17Ci0gIHJlZ2lzdGVyIHZhcnJheV90ICp2cDsKLSAgcmVnaXN0ZXIgYXV4X3QgKmF1eF9wdHI7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIm5vIGN1cnJlbnQgZmlsZSBwb2ludGVyIikpOwotCi0gIHZwID0gJmN1cl9maWxlX3B0ci0+YXV4X3N5bXM7Ci0KLSAgaWYgKHZwLT5vYmplY3RzX2xhc3RfcGFnZSA9PSB2cC0+b2JqZWN0c19wZXJfcGFnZSkKLSAgICBhZGRfdmFycmF5X3BhZ2UgKHZwKTsKLQotICBhdXhfcHRyID0gJnZwLT5sYXN0LT5kYXR1bS0+YXV4W3ZwLT5vYmplY3RzX2xhc3RfcGFnZSsrXTsKLSAgYXV4X3B0ci0+dHlwZSA9IGF1eF9pc3ltOwotICBhdXhfcHRyLT5kYXRhLmlzeW0gPSBhdXhfd29yZDsKLQotICByZXR1cm4gdnAtPm51bV9hbGxvY2F0ZWQrKzsKLX0KLQotCi0vKiBBZGQgYW4gYXV4aWxpYXJ5IHN5bWJvbCAocGFzc2luZyBhIGZpbGUvc3ltYm9sIGluZGV4IGNvbWJvKS4gICovCi0KLXN0YXRpYyBzeW1pbnRfdAotYWRkX2F1eF9zeW1fcm5keCAoZmlsZV9pbmRleCwgc3ltX2luZGV4KQotICAgICBpbnQgZmlsZV9pbmRleDsKLSAgICAgc3ltaW50X3Qgc3ltX2luZGV4OwotewotICByZWdpc3RlciB2YXJyYXlfdCAqdnA7Ci0gIHJlZ2lzdGVyIGF1eF90ICphdXhfcHRyOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKLQotICB2cCA9ICZjdXJfZmlsZV9wdHItPmF1eF9zeW1zOwotCi0gIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPT0gdnAtPm9iamVjdHNfcGVyX3BhZ2UpCi0gICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7Ci0KLSAgYXV4X3B0ciA9ICZ2cC0+bGFzdC0+ZGF0dW0tPmF1eFt2cC0+b2JqZWN0c19sYXN0X3BhZ2UrK107Ci0gIGF1eF9wdHItPnR5cGUgPSBhdXhfcm5keDsKLSAgYXV4X3B0ci0+ZGF0YS5ybmR4LnJmZCAgID0gZmlsZV9pbmRleDsKLSAgYXV4X3B0ci0+ZGF0YS5ybmR4LmluZGV4ID0gc3ltX2luZGV4OwotCi0gIHJldHVybiB2cC0+bnVtX2FsbG9jYXRlZCsrOwotfQotDAotLyogQWRkIGFuIGF1eGlsaWFyeSBzeW1ib2wgKHBhc3NpbmcgdGhlIGJhc2ljIHR5cGUgYW5kIHBvc3NpYmx5Ci0gICB0eXBlIHF1YWxpZmllcnMpLiAgKi8KLQotc3RhdGljIHN5bWludF90Ci1hZGRfYXV4X3N5bV90aXIgKHQsIHN0YXRlLCBoYXNoX3RibCkKLSAgICAgdHlwZV9pbmZvX3QgKnQ7CQkvKiBjdXJyZW50IHR5cGUgaW5mb3JtYXRpb24gKi8KLSAgICAgaGFzaF9zdGF0ZV90IHN0YXRlOwkvKiB3aGV0aGVyIHRvIGhhc2ggdHlwZSBvciBub3QgKi8KLSAgICAgdGhhc2hfdCAqKmhhc2hfdGJsOwkvKiBwb2ludGVyIHRvIGhhc2ggdGFibGUgdG8gdXNlICovCi17Ci0gIHJlZ2lzdGVyIHZhcnJheV90ICp2cDsKLSAgcmVnaXN0ZXIgYXV4X3QgKmF1eF9wdHI7Ci0gIHN0YXRpYyBBVVhVIGluaXRfYXV4OwotICBzeW1pbnRfdCByZXQ7Ci0gIGludCBpOwotICBBVVhVIGF1eDsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICBhc19mYXRhbCAoXygibm8gY3VycmVudCBmaWxlIHBvaW50ZXIiKSk7Ci0KLSAgdnAgPSAmY3VyX2ZpbGVfcHRyLT5hdXhfc3ltczsKLQotICBhdXggPSBpbml0X2F1eDsKLSAgYXV4LnRpLmJ0ID0gKGludCkgdC0+YmFzaWNfdHlwZTsKLSAgYXV4LnRpLmNvbnRpbnVlZCA9IDA7Ci0gIGF1eC50aS5mQml0ZmllbGQgPSB0LT5iaXRmaWVsZDsKLQotICBhdXgudGkudHEwID0gKGludCkgdC0+dHlwZV9xdWFsaWZpZXJzWzBdOwotICBhdXgudGkudHExID0gKGludCkgdC0+dHlwZV9xdWFsaWZpZXJzWzFdOwotICBhdXgudGkudHEyID0gKGludCkgdC0+dHlwZV9xdWFsaWZpZXJzWzJdOwotICBhdXgudGkudHEzID0gKGludCkgdC0+dHlwZV9xdWFsaWZpZXJzWzNdOwotICBhdXgudGkudHE0ID0gKGludCkgdC0+dHlwZV9xdWFsaWZpZXJzWzRdOwotICBhdXgudGkudHE1ID0gKGludCkgdC0+dHlwZV9xdWFsaWZpZXJzWzVdOwotCi0KLSAgLyogRm9yIGFueXRoaW5nIHRoYXQgYWRkcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCB3ZSBtdXN0IG5vdCBoYXNoLAotICAgICBzbyBjaGVjayBoZXJlLCBhbmQgcmVzZXQgb3VyIHN0YXRlLiAqLwotCi0gIGlmIChzdGF0ZSAhPSBoYXNoX25vCi0gICAgICAmJiAodC0+dHlwZV9xdWFsaWZpZXJzWzBdID09IHRxX0FycmF5Ci0JICB8fCB0LT50eXBlX3F1YWxpZmllcnNbMV0gPT0gdHFfQXJyYXkKLQkgIHx8IHQtPnR5cGVfcXVhbGlmaWVyc1syXSA9PSB0cV9BcnJheQotCSAgfHwgdC0+dHlwZV9xdWFsaWZpZXJzWzNdID09IHRxX0FycmF5Ci0JICB8fCB0LT50eXBlX3F1YWxpZmllcnNbNF0gPT0gdHFfQXJyYXkKLQkgIHx8IHQtPnR5cGVfcXVhbGlmaWVyc1s1XSA9PSB0cV9BcnJheQotCSAgfHwgdC0+YmFzaWNfdHlwZSA9PSBidF9TdHJ1Y3QKLQkgIHx8IHQtPmJhc2ljX3R5cGUgPT0gYnRfVW5pb24KLQkgIHx8IHQtPmJhc2ljX3R5cGUgPT0gYnRfRW51bQotCSAgfHwgdC0+Yml0ZmllbGQKLQkgIHx8IHQtPm51bV9kaW1zID4gMCkpCi0gICAgc3RhdGUgPSBoYXNoX25vOwotCi0gIC8qIFNlZSBpZiB3ZSBjYW4gaGFzaCB0aGlzIHR5cGUsIGFuZCBzYXZlIHNvbWUgc3BhY2UsIGJ1dCBzb21lIHR5cGVzCi0gICAgIGNhbid0IGJlIGhhc2hlZCAoYmVjYXVzZSB0aGV5IGNvbnRhaW4gYXJyYXlzIG9yIGNvbnRpbnVhdGlvbnMpLAotICAgICBhbmQgb3RoZXJzIGNhbiBiZSBwdXQgaW50byB0aGUgaGFzaCBsaXN0LCBidXQgY2Fubm90IHVzZSBleGlzdGluZwotICAgICB0eXBlcyBiZWNhdXNlIG90aGVyIGF1eCBlbnRyaWVzIHByZWNlZGUgdGhpcyBvbmUuICAqLwotCi0gIGlmIChzdGF0ZSAhPSBoYXNoX25vKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHRoYXNoX3QgKmhhc2hfcHRyOwotICAgICAgcmVnaXN0ZXIgc3ltaW50X3QgaGk7Ci0KLSAgICAgIGhpID0gYXV4LmlzeW0gJiAoKDEgPDwgSEFTSEJJVFMpIC0gMSk7Ci0gICAgICBoaSAlPSBUSEFTSF9TSVpFOwotCi0gICAgICBmb3IgKGhhc2hfcHRyID0gaGFzaF90YmxbaGldOwotCSAgIGhhc2hfcHRyICE9ICh0aGFzaF90ICopMDsKLQkgICBoYXNoX3B0ciA9IGhhc2hfcHRyLT5uZXh0KQotCXsKLQkgIGlmIChhdXguaXN5bSA9PSBoYXNoX3B0ci0+dHlwZS5pc3ltKQotCSAgICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChoYXNoX3B0ciAhPSAodGhhc2hfdCAqKSBOVUxMICYmIHN0YXRlID09IGhhc2hfeWVzKQotCXJldHVybiBoYXNoX3B0ci0+aW5keDsKLQotICAgICAgaWYgKGhhc2hfcHRyID09ICh0aGFzaF90ICopIE5VTEwpCi0JewotCSAgaGFzaF9wdHIgPSBhbGxvY2F0ZV90aGFzaCAoKTsKLQkgIGhhc2hfcHRyLT5uZXh0ID0gaGFzaF90YmxbaGldOwotCSAgaGFzaF9wdHItPnR5cGUgPSBhdXg7Ci0JICBoYXNoX3B0ci0+aW5keCA9IHZwLT5udW1fYWxsb2NhdGVkOwotCSAgaGFzaF90YmxbaGldID0gaGFzaF9wdHI7Ci0JfQotICAgIH0KLQotICAvKiBFdmVyeXRoaW5nIGlzIHNldCB1cCwgYWRkIHRoZSBhdXggc3ltYm9sLiAqLwotICBpZiAodnAtPm9iamVjdHNfbGFzdF9wYWdlID09IHZwLT5vYmplY3RzX3Blcl9wYWdlKQotICAgIGFkZF92YXJyYXlfcGFnZSAodnApOwotCi0gIGF1eF9wdHIgPSAmdnAtPmxhc3QtPmRhdHVtLT5hdXhbIHZwLT5vYmplY3RzX2xhc3RfcGFnZSsrIF07Ci0gIGF1eF9wdHItPnR5cGUgPSBhdXhfdGlyOwotICBhdXhfcHRyLT5kYXRhID0gYXV4OwotCi0gIHJldCA9IHZwLT5udW1fYWxsb2NhdGVkKys7Ci0KLSAgLyogQWRkIGJpdGZpZWxkIGxlbmd0aCBpZiBpdCBleGlzdHMuCi0KLSAgICAgTk9URTogIE1pcHMgZG9jdW1lbnRhdGlvbiBjbGFpbXMgYml0ZmllbGQgZ29lcyBhdCB0aGUgZW5kIG9mIHRoZQotICAgICBBVVggcmVjb3JkLCBidXQgdGhlIERFQ3N0YXRpb24gY29tcGlsZXIgZW1pdHMgaXQgaGVyZS4KLSAgICAgKFRoaXMgd291bGQgb25seSBtYWtlIGEgZGlmZmVyZW5jZSBmb3IgZW51bSBiaXRmaWVsZHMuKQotCi0gICAgIEFsc28gbm90ZTogIFdlIHVzZSB0aGUgbGFzdCBzaXplIGdpdmVuIHNpbmNlIGdjYyBtYXkgZW1pdCAyCi0gICAgIGZvciBhbiBlbnVtIGJpdGZpZWxkLiAgKi8KLQotICBpZiAodC0+Yml0ZmllbGQpCi0gICAgKHZvaWQpIGFkZF9hdXhfc3ltX3N5bWludCAoKHN5bWludF90KXQtPnNpemVzW3QtPm51bV9zaXplcy0xXSk7Ci0KLQotICAvKiBBZGQgdGFnIGluZm9ybWF0aW9uIGlmIG5lZWRlZC4gIFN0cnVjdHVyZSwgdW5pb24sIGFuZCBlbnVtCi0gICAgIHJlZmVyZW5jZXMgYWRkIDIgYXV4IHN5bWJvbHM6IGEgW2ZpbGUgaW5kZXgsIHN5bWJvbCBpbmRleF0KLSAgICAgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHR5cGUsIGFuZCB0aGUgY3VycmVudCBmaWxlIGluZGV4LiAgKi8KLQotICBpZiAodC0+YmFzaWNfdHlwZSA9PSBidF9TdHJ1Y3QKLSAgICAgIHx8IHQtPmJhc2ljX3R5cGUgPT0gYnRfVW5pb24KLSAgICAgIHx8IHQtPmJhc2ljX3R5cGUgPT0gYnRfRW51bSkKLSAgICB7Ci0gICAgICByZWdpc3RlciBzeW1pbnRfdCBmaWxlX2luZGV4ID0gdC0+dGFnX3B0ci0+aWZkOwotICAgICAgcmVnaXN0ZXIgbG9jYWxzeW1fdCAqc3ltICA9IHQtPnRhZ19wdHItPnN5bTsKLSAgICAgIHJlZ2lzdGVyIGZvcndhcmRfdCAqZm9yd2FyZF9yZWYgPSBhbGxvY2F0ZV9mb3J3YXJkICgpOwotCi0gICAgICBpZiAoc3ltICE9IChsb2NhbHN5bV90ICopIE5VTEwpCi0JewotCSAgZm9yd2FyZF9yZWYtPm5leHQgPSBzeW0tPmZvcndhcmRfcmVmOwotCSAgc3ltLT5mb3J3YXJkX3JlZiA9IGZvcndhcmRfcmVmOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3J3YXJkX3JlZi0+bmV4dCA9IHQtPnRhZ19wdHItPmZvcndhcmRfcmVmOwotCSAgdC0+dGFnX3B0ci0+Zm9yd2FyZF9yZWYgPSBmb3J3YXJkX3JlZjsKLQl9Ci0KLSAgICAgICh2b2lkKSBhZGRfYXV4X3N5bV9ybmR4IChTVF9SRkRFU0NBUEUsIGluZGV4TmlsKTsKLSAgICAgIGZvcndhcmRfcmVmLT5pbmRleF9wdHIKLQk9ICZ2cC0+bGFzdC0+ZGF0dW0tPmF1eFsgdnAtPm9iamVjdHNfbGFzdF9wYWdlIC0gMV07Ci0KLSAgICAgICh2b2lkKSBhZGRfYXV4X3N5bV9zeW1pbnQgKGZpbGVfaW5kZXgpOwotICAgICAgZm9yd2FyZF9yZWYtPmlmZF9wdHIKLQk9ICZ2cC0+bGFzdC0+ZGF0dW0tPmF1eFsgdnAtPm9iamVjdHNfbGFzdF9wYWdlIC0gMV07Ci0gICAgfQotCi0gIC8qIEFkZCBpbmZvcm1hdGlvbiBhYm91dCBhcnJheSBib3VuZHMgaWYgdGhleSBleGlzdC4gICovCi0gIGZvciAoaSA9IDA7IGkgPCB0LT5udW1fZGltczsgaSsrKQotICAgIHsKLSAgICAgICh2b2lkKSBhZGRfYXV4X3N5bV9ybmR4IChTVF9SRkRFU0NBUEUsCi0JCQkgICAgICAgY3VyX2ZpbGVfcHRyLT5pbnRfdHlwZSk7Ci0KLSAgICAgICh2b2lkKSBhZGRfYXV4X3N5bV9zeW1pbnQgKGN1cl9maWxlX3B0ci0+ZmlsZV9pbmRleCk7CS8qIGZpbGUgaW5kZXgqLwotICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3N5bWludCAoKHN5bWludF90KSAwKTsJCQkvKiBsb3cgYm91bmQgKi8KLSAgICAgICh2b2lkKSBhZGRfYXV4X3N5bV9zeW1pbnQgKHQtPmRpbWVuc2lvbnNbaV0gLSAxKTsJCS8qIGhpZ2ggYm91bmQqLwotICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3N5bWludCAoKHQtPmRpbWVuc2lvbnNbaV0gPT0gMCkJLyogc3RyaWRlICovCi0JCQkJID8gMAotCQkJCSA6ICh0LT5zaXplc1tpXSAqIDgpIC8gdC0+ZGltZW5zaW9uc1tpXSk7Ci0gICAgfTsKLQotICAvKiBOT1RFOiAgTWlwcyBkb2N1bWVudGF0aW9uIGNsYWltcyB0aGF0IHRoZSBiaXRmaWVsZCB3aWR0aCBnb2VzIGhlcmUuCi0gICAgIEJ1dCBpdCBuZWVkcyB0byBiZSBlbWl0dGVkIGVhcmxpZXIuICovCi0KLSAgcmV0dXJuIHJldDsKLX0KLQwKLS8qIEFkZCBhIHRhZyB0byB0aGUgdGFnIHRhYmxlICh1bmxlc3MgaXQgYWxyZWFkeSBleGlzdHMpLiAgKi8KLQotc3RhdGljIHRhZ190ICoKLWdldF90YWcgKHRhZywgc3ltLCBiYXNpY190eXBlKQotICAgICBjb25zdCBjaGFyICp0YWc7CQkJLyogdGFnIG5hbWUgKi8KLSAgICAgbG9jYWxzeW1fdCAqc3ltOwkJCS8qIHRhZyBzdGFydCBibG9jayAqLwotICAgICBidF90IGJhc2ljX3R5cGU7CQkJLyogYnRfU3RydWN0LCBidF9Vbmlvbiwgb3IgYnRfRW51bSAqLwotewotICBzaGFzaF90ICpoYXNoX3B0cjsKLSAgY29uc3QgY2hhciAqZXJyOwotICB0YWdfdCAqdGFnX3B0cjsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICBhc19mYXRhbCAoXygibm8gY3VycmVudCBmaWxlIHBvaW50ZXIiKSk7Ci0KLSAgaGFzaF9wdHIgPSAoc2hhc2hfdCAqKSBoYXNoX2ZpbmQgKHRhZ19oYXNoLCB0YWcpOwotCi0gIGlmIChoYXNoX3B0ciAhPSAoc2hhc2hfdCAqKSBOVUxMCi0gICAgICAmJiBoYXNoX3B0ci0+dGFnX3B0ciAhPSAodGFnX3QgKikgTlVMTCkKLSAgewotICAgIHRhZ19wdHIgPSBoYXNoX3B0ci0+dGFnX3B0cjsKLSAgICBpZiAoc3ltICE9IChsb2NhbHN5bV90ICopIE5VTEwpCi0gICAgICB7Ci0JdGFnX3B0ci0+YmFzaWNfdHlwZSA9IGJhc2ljX3R5cGU7Ci0JdGFnX3B0ci0+aWZkCSAgICA9IGN1cl9maWxlX3B0ci0+ZmlsZV9pbmRleDsKLQl0YWdfcHRyLT5zeW0JICAgID0gc3ltOwotICAgICAgfQotICAgIHJldHVybiB0YWdfcHRyOwotICB9Ci0KLSAgaWYgKGhhc2hfcHRyID09IChzaGFzaF90ICopIE5VTEwpCi0gICAgewotICAgICAgY2hhciAqcGVybTsKLQotICAgICAgcGVybSA9IHhtYWxsb2MgKCh1bnNpZ25lZCBsb25nKSAoc3RybGVuICh0YWcpICsgMSkpOwotICAgICAgc3RyY3B5IChwZXJtLCB0YWcpOwotICAgICAgaGFzaF9wdHIgPSBhbGxvY2F0ZV9zaGFzaCAoKTsKLSAgICAgIGVyciA9IGhhc2hfaW5zZXJ0ICh0YWdfaGFzaCwgcGVybSwgKGNoYXIgKikgaGFzaF9wdHIpOwotICAgICAgaWYgKGVycikKLQlhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHRhZyBoYXNoIHRhYmxlOiAlcyIpLAotCQkgIHRhZywgZXJyKTsKLSAgICAgIGhhc2hfcHRyLT5zdHJpbmcgPSBwZXJtOwotICAgIH0KLQotICB0YWdfcHRyID0gYWxsb2NhdGVfdGFnICgpOwotICB0YWdfcHRyLT5mb3J3YXJkX3JlZgk9IChmb3J3YXJkX3QgKikgTlVMTDsKLSAgdGFnX3B0ci0+aGFzaF9wdHIJPSBoYXNoX3B0cjsKLSAgdGFnX3B0ci0+c2FtZV9uYW1lCT0gaGFzaF9wdHItPnRhZ19wdHI7Ci0gIHRhZ19wdHItPmJhc2ljX3R5cGUJPSBiYXNpY190eXBlOwotICB0YWdfcHRyLT5zeW0JCT0gc3ltOwotICB0YWdfcHRyLT5pZmQJCT0gKChzeW0gPT0gKGxvY2Fsc3ltX3QgKikgTlVMTCkKLQkJCSAgID8gKHN5bWludF90KSAtMQotCQkJICAgOiBjdXJfZmlsZV9wdHItPmZpbGVfaW5kZXgpOwotICB0YWdfcHRyLT5zYW1lX2Jsb2NrCT0gY3VyX3RhZ19oZWFkLT5maXJzdF90YWc7Ci0KLSAgY3VyX3RhZ19oZWFkLT5maXJzdF90YWcgPSB0YWdfcHRyOwotICBoYXNoX3B0ci0+dGFnX3B0cgkgID0gdGFnX3B0cjsKLQotICByZXR1cm4gdGFnX3B0cjsKLX0KLQwKLS8qIEFkZCBhbiB1bmtub3duIHtzdHJ1Y3QsIHVuaW9uLCBlbnVtfSB0YWcuICAqLwotCi1zdGF0aWMgdm9pZAotYWRkX3Vua25vd25fdGFnIChwdGFnKQotICAgICB0YWdfdAkqcHRhZzsJCS8qIHBvaW50ZXIgdG8gdGFnIGluZm9ybWF0aW9uICovCi17Ci0gIHNoYXNoX3QgKmhhc2hfcHRyCT0gcHRhZy0+aGFzaF9wdHI7Ci0gIGNoYXIgKm5hbWUJCT0gaGFzaF9wdHItPnN0cmluZzsKLSAgbG9jYWxzeW1fdCAqc3ltOwotICBmb3J3YXJkX3QgKipwZjsKLQotI2lmZGVmIEVDT0ZGX0RFQlVHCi0gIGlmIChkZWJ1ZyA+IDEpCi0gICAgewotICAgICAgY2hhciAqYWdnX3R5cGUJPSAie3Vua25vd24gYWdncmVnYXRlIHR5cGV9IjsKLSAgICAgIHN3aXRjaCAocHRhZy0+YmFzaWNfdHlwZSkKLQl7Ci0JY2FzZSBidF9TdHJ1Y3Q6CWFnZ190eXBlID0gInN0cnVjdCI7CWJyZWFrOwotCWNhc2UgYnRfVW5pb246CWFnZ190eXBlID0gInVuaW9uIjsJYnJlYWs7Ci0JY2FzZSBidF9FbnVtOglhZ2dfdHlwZSA9ICJlbnVtIjsJYnJlYWs7Ci0JZGVmYXVsdDoJCQkJYnJlYWs7Ci0JfQotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJ1bmtub3duICVzICUuKnMgZm91bmRcbiIsIGFnZ190eXBlLAotCSAgICAgICBoYXNoX3B0ci0+bGVuLCBuYW1lX3N0YXJ0KTsKLSAgICB9Ci0jZW5kaWYKLQotICBzeW0gPSBhZGRfZWNvZmZfc3ltYm9sIChuYW1lLAotCQkJICBzdF9CbG9jaywKLQkJCSAgc2NfSW5mbywKLQkJCSAgKHN5bWJvbFMgKikgTlVMTCwKLQkJCSAgKGJmZF92bWEpIDAsCi0JCQkgIChzeW1pbnRfdCkgMCwKLQkJCSAgKHN5bWludF90KSAwKTsKLQotICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAobmFtZSwKLQkJCSAgIHN0X0VuZCwKLQkJCSAgIHNjX0luZm8sCi0JCQkgICAoc3ltYm9sUyAqKSBOVUxMLAotCQkJICAgKGJmZF92bWEpIDAsCi0JCQkgICAoc3ltaW50X3QpIDAsCi0JCQkgICAoc3ltaW50X3QpIDApOwotCi0gIGZvciAocGYgPSAmc3ltLT5mb3J3YXJkX3JlZjsgKnBmICE9IChmb3J3YXJkX3QgKikgTlVMTDsgcGYgPSAmKCpwZiktPm5leHQpCi0gICAgOwotICAqcGYgPSBwdGFnLT5mb3J3YXJkX3JlZjsKLX0KLQwKLS8qIEFkZCBhIHByb2NlZHVyZSB0byB0aGUgY3VycmVudCBmaWxlJ3MgbGlzdCBvZiBwcm9jZWR1cmVzLCBhbmQgcmVjb3JkCi0gICB0aGlzIGlzIHRoZSBjdXJyZW50IHByb2NlZHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGRfcHJvY2VkdXJlIChmdW5jKQotICAgICBjaGFyICpmdW5jOwkJCS8qIGZ1bmMgbmFtZSAqLwotewotICByZWdpc3RlciB2YXJyYXlfdCAqdnA7Ci0gIHJlZ2lzdGVyIHByb2NfdCAqbmV3X3Byb2NfcHRyOwotICBzeW1ib2xTICpzeW07Ci0KLSNpZmRlZiBFQ09GRl9ERUJVRwotICBpZiAoZGVidWcpCi0gICAgZnB1dGMgKCdcbicsIHN0ZGVycik7Ci0jZW5kaWYKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICBhc19mYXRhbCAoXygibm8gY3VycmVudCBmaWxlIHBvaW50ZXIiKSk7Ci0KLSAgdnAgPSAmY3VyX2ZpbGVfcHRyLT5wcm9jczsKLQotICBpZiAodnAtPm9iamVjdHNfbGFzdF9wYWdlID09IHZwLT5vYmplY3RzX3Blcl9wYWdlKQotICAgIGFkZF92YXJyYXlfcGFnZSAodnApOwotCi0gIGN1cl9wcm9jX3B0ciA9IG5ld19wcm9jX3B0ciA9ICZ2cC0+bGFzdC0+ZGF0dW0tPnByb2NbdnAtPm9iamVjdHNfbGFzdF9wYWdlKytdOwotCi0gIGlmIChmaXJzdF9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgZmlyc3RfcHJvY19wdHIgPSBuZXdfcHJvY19wdHI7Ci0KLSAgdnAtPm51bV9hbGxvY2F0ZWQrKzsKLQotICBuZXdfcHJvY19wdHItPnBkci5pc3ltID0gLTE7Ci0gIG5ld19wcm9jX3B0ci0+cGRyLmlsaW5lID0gLTE7Ci0gIG5ld19wcm9jX3B0ci0+cGRyLmxuTG93ID0gLTE7Ci0gIG5ld19wcm9jX3B0ci0+cGRyLmxuSGlnaCA9IC0xOwotCi0gIC8qIFNldCB0aGUgQlNGX0ZVTkNUSU9OIGZsYWcgZm9yIHRoZSBzeW1ib2wuICAqLwotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChmdW5jKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQotICAvKiBQdXNoIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICAqLwotICBuZXdfcHJvY19wdHItPnN5bSA9IGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsIHN0X1Byb2MsIHNjX1RleHQsCi0JCQkJCXN5bSwgKGJmZF92bWEpIDAsIChzeW1pbnRfdCkgMCwKLQkJCQkJKHN5bWludF90KSAwKTsKLQotICArK3Byb2NfY250OwotCi0gIC8qIEZpbGwgaW4gdGhlIGxpbmVub3MgcHJlY2VkaW5nIHRoZSAuZW50LCBpZiBhbnkuICAqLwotICBpZiAobm9wcm9jX2xpbmVubyAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmVub19saXN0X3QgKmw7Ci0KLSAgICAgIGZvciAobCA9IG5vcHJvY19saW5lbm87IGwgIT0gKGxpbmVub19saXN0X3QgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0JbC0+cHJvYyA9IG5ld19wcm9jX3B0cjsKLSAgICAgICpsYXN0X2xpbmVub19wdHIgPSBub3Byb2NfbGluZW5vOwotICAgICAgd2hpbGUgKCpsYXN0X2xpbmVub19wdHIgIT0gTlVMTCkKLQl7Ci0JICBsYXN0X2xpbmVubyA9ICpsYXN0X2xpbmVub19wdHI7Ci0JICBsYXN0X2xpbmVub19wdHIgPSAmbGFzdF9saW5lbm8tPm5leHQ7Ci0JfQotICAgICAgbm9wcm9jX2xpbmVubyA9IChsaW5lbm9fbGlzdF90ICopIE5VTEw7Ci0gICAgfQotfQotCi1zeW1ib2xTICoKLWVjb2ZmX2dldF9jdXJfcHJvY19zeW0gKCkKLXsKLSAgcmV0dXJuIChjdXJfcHJvY19wdHIgPyBjdXJfcHJvY19wdHItPnN5bS0+YXNfc3ltIDogTlVMTCk7Ci19Ci0MCi0vKiBBZGQgYSBuZXcgZmlsZW5hbWUsIGFuZCBzZXQgdXAgYWxsIG9mIHRoZSBmaWxlIHJlbGF0aXZlCi0gICB2aXJ0dWFsIGFycmF5cyAoc3RyaW5ncywgc3ltYm9scywgYXV4IHN5bXMsIGV0Yy4pLiAgUmVjb3JkCi0gICB3aGVyZSB0aGUgY3VycmVudCBmaWxlIHN0cnVjdHVyZSBsaXZlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGRfZmlsZSAoZmlsZV9uYW1lLCBpbmR4LCBmYWtlKQotICAgICBjb25zdCBjaGFyICpmaWxlX25hbWU7CQkvKiBmaWxlIG5hbWUgKi8KLSAgICAgaW50IGluZHg7Ci0gICAgIGludCBmYWtlOwotewotICByZWdpc3RlciBpbnQgZmlyc3RfY2g7Ci0gIHJlZ2lzdGVyIGVmZHJfdCAqZmlsX3B0cjsKLQotI2lmZGVmIEVDT0ZGX0RFQlVHCi0gIGlmIChkZWJ1ZykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJcdGZpbGVcdCUuKnNcbiIsIGxlbiwgZmlsZV9zdGFydCk7Ci0jZW5kaWYKLQotICAvKiBJZiB0aGUgZmlsZSBuYW1lIGlzIE5VTEwsIHRoZW4gbm8gLmZpbGUgc3ltYm9sIGFwcGVhcmVkLCBhbmQgd2UKLSAgICAgd2FudCB0byB1c2UgdGhlIGFjdHVhbCBmaWxlIG5hbWUuICAqLwotICBpZiAoZmlsZV9uYW1lID09IChjb25zdCBjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgY2hhciAqZmlsZTsKLQotICAgICAgaWYgKGZpcnN0X2ZpbGUgIT0gKGVmZHJfdCAqKSBOVUxMKQotCWFzX2ZhdGFsIChfKCJmYWtlIC5maWxlIGFmdGVyIHJlYWwgb25lIikpOwotICAgICAgYXNfd2hlcmUgKCZmaWxlLCAodW5zaWduZWQgaW50ICopIE5VTEwpOwotICAgICAgZmlsZV9uYW1lID0gKGNvbnN0IGNoYXIgKikgZmlsZTsKLQotICAgICAgLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHNpbmNlIEkKLSAgICAgICAgIHRoaW5rIHRoYXQncyB3aGF0IG90aGVyIEVDT0ZGIGFzc2VtYmxlcnMgZG8uICBXZSBkb24ndCBkbwotICAgICAgICAgdGhpcyBpZiB3ZSBzZWUgYSAuZmlsZSBkaXJlY3RpdmUgd2l0aCBhIHN0cmluZywgc2luY2UgdGhhdAotICAgICAgICAgaW1wbGllcyB0aGF0IHNvbWUgc29ydCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgYmVpbmcKLSAgICAgICAgIHByb3ZpZGVkLiAgKi8KLSAgICAgIGlmICghIHN5bWJvbF90YWJsZV9mcm96ZW4gJiYgZGVidWdfdHlwZSA9PSBERUJVR19OT05FKQotCWRlYnVnX3R5cGUgPSBERUJVR19FQ09GRjsKLSAgICB9Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICBpZiAobGlzdGluZykKLSAgICBsaXN0aW5nX3NvdXJjZV9maWxlIChmaWxlX25hbWUpOwotI2VuZGlmCi0KLSAgY3VycmVudF9zdGFic19maWxlbmFtZSA9IGZpbGVfbmFtZTsKLQotICAvKiBJZiB3ZSdyZSBjcmVhdGluZyBzdGFicywgdGhlbiB3ZSBkb24ndCBhY3R1YWxseSBtYWtlIGEgbmV3IEZEUi4KLSAgICAgSW5zdGVhZCwgd2UganVzdCBjcmVhdGUgYSBzdGFicyBzeW1ib2wuICAqLwotICBpZiAoc3RhYnNfc2VlbikKLSAgICB7Ci0gICAgICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoZmlsZV9uYW1lLCBzdF9OaWwsIHNjX05pbCwKLQkJCSAgICAgICBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywKLQkJCQkJICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJCQkgICBmcmFnX25vdyksCi0JCQkgICAgICAgKGJmZF92bWEpIDAsIDAsIEVDT0ZGX01BUktfU1RBQiAoTl9TT0wpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZmlyc3RfY2ggPSAqZmlsZV9uYW1lOwotCi0gIC8qIEZJWE1FOiBXZSBjYW4ndCBzYWZlbHkgbWVyZ2UgZmlsZXMgd2hpY2ggaGF2ZSBsaW5lIG51bWJlcgotICAgICBpbmZvcm1hdGlvbiAoZk1lcmdlIHdpbGwgYmUgemVybyBpbiB0aGlzIGNhc2UpLiAgT3RoZXJ3aXNlLCB3ZQotICAgICBnZXQgaW5jb3JyZWN0IGxpbmUgbnVtYmVyIGRlYnVnZ2luZyBpbmZvLiAgU2VlIGZvciBpbnN0YW5jZQotICAgICBlY29mZl9idWlsZF9saW5lbm8sIHdoaWNoIHdpbGwgZW5kIHVwIHNldHRpbmcgYWxsIGZpbGUtPmZkci4qCi0gICAgIGZpZWxkcyBtdWx0aXBsZSB0aW1lcywgcmVzdWx0aW5nIGluIGluY29ycmVjdCBkZWJ1ZyBpbmZvLiAgSW4KLSAgICAgb3JkZXIgdG8gbWFrZSB0aGlzIHdvcmsgcmlnaHQsIGFsbCBsaW5lIG51bWJlciBhbmQgc3ltYm9sIGluZm8KLSAgICAgZm9yIHRoZSBzYW1lIHNvdXJjZSBmaWxlIGhhcyB0byBiZSBhZGphY2VudCBpbiB0aGUgb2JqZWN0IGZpbGUsCi0gICAgIHNvIHRoYXQgYSBzaW5nbGUgZmlsZSBkZXNjcmlwdG9yIGNhbiBiZSB1c2VkIHRvIHBvaW50IHRvIHRoZW0uCi0gICAgIFRoaXMgd291bGQgcmVxdWlyZSBtYWludGFpbmluZyBmaWxlIHNwZWNpZmljIGxpc3RzIG9mIGxpbmUKLSAgICAgbnVtYmVycyBhbmQgc3ltYm9scyBmb3IgZWFjaCBmaWxlLCBzbyB0aGF0IHRoZXkgY2FuIGJlIG1lcmdlZAotICAgICB0b2dldGhlciAob3Igb3V0cHV0IHRvZ2V0aGVyKSB3aGVuIHR3byAuZmlsZSBwc2V1ZG8tb3BzIGFyZQotICAgICBtZXJnZWQgaW50byBvbmUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KLQotICAvKiBTZWUgaWYgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLiAgKi8KLSAgZm9yIChmaWxfcHRyID0gZmlyc3RfZmlsZTsKLSAgICAgICBmaWxfcHRyICE9IChlZmRyX3QgKikgTlVMTDsKLSAgICAgICBmaWxfcHRyID0gZmlsX3B0ci0+bmV4dF9maWxlKQotICAgIHsKLSAgICAgIGlmIChmaXJzdF9jaCA9PSBmaWxfcHRyLT5uYW1lWzBdCi0JICAmJiBzdHJjbXAgKGZpbGVfbmFtZSwgZmlsX3B0ci0+bmFtZSkgPT0gMAotCSAgJiYgZmlsX3B0ci0+ZmRyLmZNZXJnZSkKLQl7Ci0JICBjdXJfZmlsZV9wdHIgPSBmaWxfcHRyOwotCSAgaWYgKCEgZmFrZSkKLQkgICAgY3VyX2ZpbGVfcHRyLT5mYWtlID0gMDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIG5ldyBmaWxlLCBjcmVhdGUgaXQuICovCi0gIGlmIChmaWxfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlID09IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlKQotCWFkZF92YXJyYXlfcGFnZSAoJmZpbGVfZGVzYyk7Ci0KLSAgICAgIGZpbF9wdHIgPSBjdXJfZmlsZV9wdHIgPQotCSZmaWxlX2Rlc2MubGFzdC0+ZGF0dW0tPmZpbGVbZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlKytdOwotICAgICAgKmZpbF9wdHIgPSBpbml0X2ZpbGU7Ci0KLSAgICAgIGZpbF9wdHItPmZpbGVfaW5kZXggPSBjdXJyZW50X2ZpbGVfaWR4Kys7Ci0gICAgICArK2ZpbGVfZGVzYy5udW1fYWxsb2NhdGVkOwotCi0gICAgICBmaWxfcHRyLT5mYWtlID0gZmFrZTsKLQotICAgICAgLyogQWxsb2NhdGUgdGhlIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGZpbF9wdHItPnN0cl9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSAwIGJ5dGUgaW4gc3RyaW5nIHRhYmxlIGlzIG51bGwgICovCi0gICAgICBhZGRfc3RyaW5nICgmZmlsX3B0ci0+c3RyaW5ncywKLQkJICBmaWxfcHRyLT5zdHJfaGFzaCwKLQkJICAiIiwKLQkJICAoc2hhc2hfdCAqKikwKTsKLQotICAgICAgaWYgKHN0cmxlbiAoZmlsZV9uYW1lKSA+IFBBR0VfVVNJWkUgLSAyKQotCWFzX2ZhdGFsIChfKCJGaWxlbmFtZSBnb2VzIG92ZXIgb25lIHBhZ2UgYm91bmRhcnkuIikpOwotCi0gICAgICAvKiBQdXNoIHRoZSBzdGFydCBvZiB0aGUgZmlsZW5hbWUuIFdlIGFzc3VtZSB0aGF0IHRoZSBmaWxlbmFtZQotICAgICAgICAgd2lsbCBiZSBzdG9yZWQgYXQgc3RyaW5nIG9mZnNldCAxLiAgKi8KLSAgICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChmaWxlX25hbWUsIHN0X0ZpbGUsIHNjX1RleHQsCi0JCQkgICAgICAgKHN5bWJvbFMgKikgTlVMTCwgKGJmZF92bWEpIDAsCi0JCQkgICAgICAgKHN5bWludF90KSAwLCAoc3ltaW50X3QpIDApOwotICAgICAgZmlsX3B0ci0+ZmRyLnJzcyA9IDE7Ci0gICAgICBmaWxfcHRyLT5uYW1lID0gJmZpbF9wdHItPnN0cmluZ3MubGFzdC0+ZGF0dW0tPmJ5dGVbMV07Ci0KLSAgICAgIC8qIFVwZGF0ZSB0aGUgbGlua2VkIGxpc3Qgb2YgZmlsZSBkZXNjcmlwdG9ycy4gICovCi0gICAgICAqbGFzdF9maWxlX3B0ciA9IGZpbF9wdHI7Ci0gICAgICBsYXN0X2ZpbGVfcHRyID0gJmZpbF9wdHItPm5leHRfZmlsZTsKLQotICAgICAgLyogQWRkIHZvaWQgJiBpbnQgdHlwZXMgdG8gdGhlIGZpbGUgKHZvaWQgc2hvdWxkIGJlIGZpcnN0IHRvIGNhdGNoCi0JIGVycmFudCAwJ3Mgd2l0aGluIHRoZSBpbmRleCBmaWVsZHMpLiAgKi8KLSAgICAgIGZpbF9wdHItPnZvaWRfdHlwZSA9IGFkZF9hdXhfc3ltX3RpciAoJnZvaWRfdHlwZV9pbmZvLAotCQkJCQkgICAgaGFzaF95ZXMsCi0JCQkJCSAgICAmY3VyX2ZpbGVfcHRyLT50aGFzaF9oZWFkWzBdKTsKLQotICAgICAgZmlsX3B0ci0+aW50X3R5cGUgPSBhZGRfYXV4X3N5bV90aXIgKCZpbnRfdHlwZV9pbmZvLAotCQkJCQkgICBoYXNoX3llcywKLQkJCQkJICAgJmN1cl9maWxlX3B0ci0+dGhhc2hfaGVhZFswXSk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgbm90aWNlcyBhIHByZXByb2Nlc3NvcgotICAgZGlyZWN0aXZlIHN3aXRjaGluZyB0byBhIG5ldyBmaWxlLiAgVGhpcyB3aWxsIG5vdCBoYXBwZW4gaW4KLSAgIGNvbXBpbGVyIG91dHB1dCwgb25seSBpbiBoYW5kIGNvZGVkIGFzc2VtYmxlci4gICovCi0KLXZvaWQKLWVjb2ZmX25ld19maWxlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAoY3VyX2ZpbGVfcHRyICE9IE5VTEwgJiYgc3RyY21wIChjdXJfZmlsZV9wdHItPm5hbWUsIG5hbWUpID09IDApCi0gICAgcmV0dXJuOwotICBhZGRfZmlsZSAobmFtZSwgMCwgMCk7Ci0KLSAgLyogVGhpcyBpcyBhIGhhbmQgY29kZWQgYXNzZW1ibGVyIGZpbGUsIHNvIGF1dG9tYXRpY2FsbHkgdHVybiBvbgotICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19OT05FKQotICAgIGRlYnVnX3R5cGUgPSBERUJVR19FQ09GRjsKLX0KLQwKLSNpZmRlZiBFQ09GRl9ERUJVRwotCi0vKiBDb252ZXJ0IHN0b3JhZ2UgY2xhc3MgdG8gc3RyaW5nLiAgKi8KLQotc3RhdGljIGNoYXIgKgotc2NfdG9fc3RyaW5nKHN0b3JhZ2VfY2xhc3MpCi0gICAgIHNjX3Qgc3RvcmFnZV9jbGFzczsKLXsKLSAgc3dpdGNoKHN0b3JhZ2VfY2xhc3MpCi0gICAgewotICAgIGNhc2Ugc2NfTmlsOgkgcmV0dXJuICJOaWwsIjsKLSAgICBjYXNlIHNjX1RleHQ6CSByZXR1cm4gIlRleHQsIjsKLSAgICBjYXNlIHNjX0RhdGE6CSByZXR1cm4gIkRhdGEsIjsKLSAgICBjYXNlIHNjX0JzczoJIHJldHVybiAiQnNzLCI7Ci0gICAgY2FzZSBzY19SZWdpc3RlcjoJIHJldHVybiAiUmVnaXN0ZXIsIjsKLSAgICBjYXNlIHNjX0FiczoJIHJldHVybiAiQWJzLCI7Ci0gICAgY2FzZSBzY19VbmRlZmluZWQ6CSByZXR1cm4gIlVuZGVmaW5lZCwiOwotICAgIGNhc2Ugc2NfQ2RiTG9jYWw6CSByZXR1cm4gIkNkYkxvY2FsLCI7Ci0gICAgY2FzZSBzY19CaXRzOgkgcmV0dXJuICJCaXRzLCI7Ci0gICAgY2FzZSBzY19DZGJTeXN0ZW06CSByZXR1cm4gIkNkYlN5c3RlbSwiOwotICAgIGNhc2Ugc2NfUmVnSW1hZ2U6CSByZXR1cm4gIlJlZ0ltYWdlLCI7Ci0gICAgY2FzZSBzY19JbmZvOgkgcmV0dXJuICJJbmZvLCI7Ci0gICAgY2FzZSBzY19Vc2VyU3RydWN0OgkgcmV0dXJuICJVc2VyU3RydWN0LCI7Ci0gICAgY2FzZSBzY19TRGF0YToJIHJldHVybiAiU0RhdGEsIjsKLSAgICBjYXNlIHNjX1NCc3M6CSByZXR1cm4gIlNCc3MsIjsKLSAgICBjYXNlIHNjX1JEYXRhOgkgcmV0dXJuICJSRGF0YSwiOwotICAgIGNhc2Ugc2NfVmFyOgkgcmV0dXJuICJWYXIsIjsKLSAgICBjYXNlIHNjX0NvbW1vbjoJIHJldHVybiAiQ29tbW9uLCI7Ci0gICAgY2FzZSBzY19TQ29tbW9uOgkgcmV0dXJuICJTQ29tbW9uLCI7Ci0gICAgY2FzZSBzY19WYXJSZWdpc3RlcjogcmV0dXJuICJWYXJSZWdpc3RlciwiOwotICAgIGNhc2Ugc2NfVmFyaWFudDoJIHJldHVybiAiVmFyaWFudCwiOwotICAgIGNhc2Ugc2NfU1VuZGVmaW5lZDoJIHJldHVybiAiU1VuZGVmaW5lZCwiOwotICAgIGNhc2Ugc2NfSW5pdDoJIHJldHVybiAiSW5pdCwiOwotICAgIGNhc2Ugc2NfTWF4OgkgcmV0dXJuICJNYXgsIjsKLSAgICB9Ci0KLSAgcmV0dXJuICI/Pz8sIjsKLX0KLQotI2VuZGlmIC8qIERFQlVHICovCi0MCi0jaWZkZWYgRUNPRkZfREVCVUcKLQotLyogQ29udmVydCBzeW1ib2wgdHlwZSB0byBzdHJpbmcuICAqLwotCi1zdGF0aWMgY2hhciAqCi1zdF90b19zdHJpbmcoc3ltYm9sX3R5cGUpCi0gICAgIHN0X3Qgc3ltYm9sX3R5cGU7Ci17Ci0gIHN3aXRjaChzeW1ib2xfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBzdF9OaWw6CXJldHVybiAiTmlsLCI7Ci0gICAgY2FzZSBzdF9HbG9iYWw6CXJldHVybiAiR2xvYmFsLCI7Ci0gICAgY2FzZSBzdF9TdGF0aWM6CXJldHVybiAiU3RhdGljLCI7Ci0gICAgY2FzZSBzdF9QYXJhbToJcmV0dXJuICJQYXJhbSwiOwotICAgIGNhc2Ugc3RfTG9jYWw6CXJldHVybiAiTG9jYWwsIjsKLSAgICBjYXNlIHN0X0xhYmVsOglyZXR1cm4gIkxhYmVsLCI7Ci0gICAgY2FzZSBzdF9Qcm9jOglyZXR1cm4gIlByb2MsIjsKLSAgICBjYXNlIHN0X0Jsb2NrOglyZXR1cm4gIkJsb2NrLCI7Ci0gICAgY2FzZSBzdF9FbmQ6CXJldHVybiAiRW5kLCI7Ci0gICAgY2FzZSBzdF9NZW1iZXI6CXJldHVybiAiTWVtYmVyLCI7Ci0gICAgY2FzZSBzdF9UeXBlZGVmOglyZXR1cm4gIlR5cGVkZWYsIjsKLSAgICBjYXNlIHN0X0ZpbGU6CXJldHVybiAiRmlsZSwiOwotICAgIGNhc2Ugc3RfUmVnUmVsb2M6CXJldHVybiAiUmVnUmVsb2MsIjsKLSAgICBjYXNlIHN0X0ZvcndhcmQ6CXJldHVybiAiRm9yd2FyZCwiOwotICAgIGNhc2Ugc3RfU3RhdGljUHJvYzoJcmV0dXJuICJTdGF0aWNQcm9jLCI7Ci0gICAgY2FzZSBzdF9Db25zdGFudDoJcmV0dXJuICJDb25zdGFudCwiOwotICAgIGNhc2Ugc3RfU3RyOglyZXR1cm4gIlN0cmluZywiOwotICAgIGNhc2Ugc3RfTnVtYmVyOglyZXR1cm4gIk51bWJlciwiOwotICAgIGNhc2Ugc3RfRXhwcjoJcmV0dXJuICJFeHByLCI7Ci0gICAgY2FzZSBzdF9UeXBlOglyZXR1cm4gIlR5cGUsIjsKLSAgICBjYXNlIHN0X01heDoJcmV0dXJuICJNYXgsIjsKLSAgICB9Ci0KLSAgcmV0dXJuICI/Pz8sIjsKLX0KLQotI2VuZGlmIC8qIERFQlVHICovCi0MCi0vKiBQYXJzZSAuYmVnaW4gZGlyZWN0aXZlcyB3aGljaCBoYXZlIGEgbGFiZWwgYXMgdGhlIGZpcnN0IGFyZ3VtZW50Ci0gICB3aGljaCBnaXZlcyB0aGUgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBibG9jay4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9iZWdpbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVfZW5kOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5iZWdpbiBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZmlsZSBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuYmVnaW4gZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sICgoY29uc3QgY2hhciAqKSBOVUxMLCBzdF9CbG9jaywgc2NfVGV4dCwKLQkJCSAgIHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpLAotCQkJICAgKGJmZF92bWEpIDAsIChzeW1pbnRfdCkgMCwgKHN5bWludF90KSAwKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgLyogVGhlIGxpbmUgbnVtYmVyIGZvbGxvd3MsIGJ1dCB3ZSBkb24ndCB1c2UgaXQuICAqLwotICAodm9pZCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBQYXJzZSAuYmVuZCBkaXJlY3RpdmVzIHdoaWNoIGhhdmUgYSBsYWJlbCBhcyB0aGUgZmlyc3QgYXJndW1lbnQKLSAgIHdoaWNoIGdpdmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBibG9jay4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9iZW5kIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0gIHN5bWJvbFMgKmVuZHN5bTsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuYmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZmlsZSBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuYmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgLyogVGhlIHZhbHVlIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSAuYmVuZCBkaXJlY3RpdmUgYW5kIHRoZQotICAgICBjb3JyZXNwb25kaW5nIHN5bWJvbC4gIFdlIGZpbGwgaW4gdGhlIG9mZnNldCB3aGVuIHdlIHdyaXRlIG91dAotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgZW5kc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICBpZiAoZW5kc3ltID09IChzeW1ib2xTICopIE5VTEwpCi0gICAgYXNfd2FybiAoXygiLmJlbmQgZGlyZWN0aXZlIG5hbWVzIHVua25vd24gc3ltYm9sIikpOwotICBlbHNlCi0gICAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsIHN0X0VuZCwgc2NfVGV4dCwgZW5kc3ltLAotCQkJICAgICAoYmZkX3ZtYSkgMCwgKHN5bWludF90KSAwLCAoc3ltaW50X3QpIDApOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICAvKiBUaGUgbGluZSBudW1iZXIgZm9sbG93cywgYnV0IHdlIGRvbid0IHVzZSBpdC4gICovCi0gICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGFzIGEgc2VyaWVzIG9mIGRpcmVjdGl2ZXMKLSAgICguZGVmLCAuc2NsLCBldGMuKS4gIFdlIGJ1aWxkIHVwIGluZm9ybWF0aW9uIGFzIHdlIHJlYWQgdGhlCi0gICBkaXJlY3RpdmVzIGluIHRoZSBmb2xsb3dpbmcgc3RhdGljIHZhcmlhYmxlcywgYW5kIGZpbGUgaXQgYXdheSB3aGVuCi0gICB3ZSByZWFjaCB0aGUgLmVuZGVmIGRpcmVjdGl2ZS4gICovCi1zdGF0aWMgY2hhciAqY29mZl9zeW1fbmFtZTsKLXN0YXRpYyB0eXBlX2luZm9fdCBjb2ZmX3R5cGU7Ci1zdGF0aWMgc2NfdCBjb2ZmX3N0b3JhZ2VfY2xhc3M7Ci1zdGF0aWMgc3RfdCBjb2ZmX3N5bWJvbF90eXA7Ci1zdGF0aWMgaW50IGNvZmZfaXNfZnVuY3Rpb247Ci1zdGF0aWMgY2hhciAqY29mZl90YWc7Ci1zdGF0aWMgdmFsdWVUIGNvZmZfdmFsdWU7Ci1zdGF0aWMgc3ltYm9sUyAqY29mZl9zeW1fdmFsdWU7Ci1zdGF0aWMgYmZkX3ZtYSBjb2ZmX3N5bV9hZGRlbmQ7Ci1zdGF0aWMgaW50IGNvZmZfaW5zaWRlX2VudW1lcmF0aW9uOwotCi0vKiBIYW5kbGUgYSAuZGVmIGRpcmVjdGl2ZTogc3RhcnQgZGVmaW5pbmcgYSBzeW1ib2wuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZGVmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0KLSAgZWNvZmZfZGVidWdnaW5nX3NlZW4gPSAxOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lICE9IChjaGFyICopIE5VTEwpCi0gICAgYXNfd2FybiAoXygiLmRlZiBwc2V1ZG8tb3AgdXNlZCBpbnNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gIGVsc2UgaWYgKCpuYW1lID09ICdcMCcpCi0gICAgYXNfd2FybiAoXygiRW1wdHkgc3ltYm9sIG5hbWUgaW4gLmRlZjsgaWdub3JlZCIpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3N5bV9uYW1lICE9IChjaGFyICopIE5VTEwpCi0JZnJlZSAoY29mZl9zeW1fbmFtZSk7Ci0gICAgICBpZiAoY29mZl90YWcgIT0gKGNoYXIgKikgTlVMTCkKLQlmcmVlIChjb2ZmX3RhZyk7Ci0gICAgICBjb2ZmX3N5bV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpIChzdHJsZW4gKG5hbWUpICsgMSkpOwotICAgICAgc3RyY3B5IChjb2ZmX3N5bV9uYW1lLCBuYW1lKTsKLSAgICAgIGNvZmZfdHlwZSA9IHR5cGVfaW5mb19pbml0OwotICAgICAgY29mZl9zdG9yYWdlX2NsYXNzID0gc2NfTmlsOwotICAgICAgY29mZl9zeW1ib2xfdHlwID0gc3RfTmlsOwotICAgICAgY29mZl9pc19mdW5jdGlvbiA9IDA7Ci0gICAgICBjb2ZmX3RhZyA9IChjaGFyICopIE5VTEw7Ci0gICAgICBjb2ZmX3ZhbHVlID0gMDsKLSAgICAgIGNvZmZfc3ltX3ZhbHVlID0gKHN5bWJvbFMgKikgTlVMTDsKLSAgICAgIGNvZmZfc3ltX2FkZGVuZCA9IDA7Ci0gICAgfQotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuZGltIGRpcmVjdGl2ZSwgdXNlZCB0byBnaXZlIGRpbWVuc2lvbnMgZm9yIGFuIGFycmF5LiAgVGhlCi0gICBhcmd1bWVudHMgYXJlIGNvbW1hIHNlcGFyYXRlZCBudW1iZXJzLiAgbWlwcy10ZmlsZSBhc3N1bWVzIHRoYXQKLSAgIHRoZXJlIHdpbGwgbm90IGJlIG1vcmUgdGhhbiA2IGRpbWVuc2lvbnMsIGFuZCBnZGIgd29uJ3QgcmVhZCBhbnkKLSAgIG1vcmUgdGhhbiB0aGF0IGFueWhvdywgc28gSSB3aWxsIGFsc28gbWFrZSB0aGF0IGFzc3VtcHRpb24uICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZGltIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBkaW1lbnNbTl9UUV07Ci0gIGludCBpOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5fVFE7IGkrKykKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBkaW1lbnNbaV0gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXG4nCi0JICAgICAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnOycpCi0JICAgIGFzX3dhcm4gKF8oIkJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGkgPT0gTl9UUSkKLSAgICAtLWk7Ci0KLSAgLyogVGhlIGRpbWVuc2lvbnMgYXJlIHN0b3JlZCBhd2F5IGluIHJldmVyc2Ugb3JkZXIuICAqLwotICBmb3IgKDsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgaWYgKGNvZmZfdHlwZS5udW1fZGltcyA+PSBOX1RRKQotCXsKLQkgIGFzX3dhcm4gKF8oIlRvbyBtYW55IC5kaW0gZW50cmllcyIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGNvZmZfdHlwZS5kaW1lbnNpb25zW2NvZmZfdHlwZS5udW1fZGltc10gPSBkaW1lbnNbaV07Ci0gICAgICArK2NvZmZfdHlwZS5udW1fZGltczsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLnNjbCBkaXJlY3RpdmUsIHdoaWNoIHNldHMgdGhlIENPRkYgc3RvcmFnZSBjbGFzcyBvZiB0aGUKLSAgIHN5bWJvbC4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9zY2wgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuc2NsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB2YWwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBjb2ZmX3N5bWJvbF90eXAgPSBtYXBfY29mZl9zeW1fdHlwZVt2YWxdOwotICBjb2ZmX3N0b3JhZ2VfY2xhc3MgPSBtYXBfY29mZl9zdG9yYWdlW3ZhbF07Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLnNpemUgZGlyZWN0aXZlLiAgRm9yIHNvbWUgcmVhc29uIG1pcHMtdGZpbGUuYyB0aGlua3MgdGhhdAotICAgLnNpemUgY2FuIGhhdmUgbXVsdGlwbGUgYXJndW1lbnRzLiAgV2UgaHVtb3IgaXQsIGFsdGhvdWdoIGdjYyB3aWxsCi0gICBuZXZlciBnZW5lcmF0ZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX3NpemUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IHNpemVzW05fVFFdOwotICBpbnQgaTsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgTl9UUTsgaSsrKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIHNpemVzW2ldID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1xuJwotCSAgICAgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJzsnKQotCSAgICBhc193YXJuIChfKCJCYWRseSBmb3JtZWQgLnNpemUgZGlyZWN0aXZlIikpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoaSA9PSBOX1RRKQotICAgIC0taTsKLQotICAvKiBUaGUgc2l6ZXMgYXJlIHN0b3JlZCBhd2F5IGluIHJldmVyc2Ugb3JkZXIuICAqLwotICBmb3IgKDsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgaWYgKGNvZmZfdHlwZS5udW1fc2l6ZXMgPj0gTl9UUSkKLQl7Ci0JICBhc193YXJuIChfKCJUb28gbWFueSAuc2l6ZSBlbnRyaWVzIikpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgY29mZl90eXBlLnNpemVzW2NvZmZfdHlwZS5udW1fc2l6ZXNdID0gc2l6ZXNbaV07Ci0gICAgICArK2NvZmZfdHlwZS5udW1fc2l6ZXM7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnR5cGUgZGlyZWN0aXZlLCB3aGljaCBnaXZlcyB0aGUgQ09GRiB0eXBlIG9mIHRoZQotICAgc3ltYm9sLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX3R5cGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0gIHRxX3QgKnRxX3B0cjsKLSAgdHFfdCAqdHFfc2hmdDsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi50eXBlIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB2YWwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBjb2ZmX3R5cGUub3JpZ190eXBlID0gQlRZUEUgKHZhbCk7Ci0gIGNvZmZfdHlwZS5iYXNpY190eXBlID0gbWFwX2NvZmZfdHlwZXNbY29mZl90eXBlLm9yaWdfdHlwZV07Ci0KLSAgdHFfcHRyID0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbTl9UUV07Ci0gIHdoaWxlICh2YWwgJn4gTl9CVE1BU0spCi0gICAgewotICAgICAgaWYgKHRxX3B0ciA9PSAmY29mZl90eXBlLnR5cGVfcXVhbGlmaWVyc1swXSkKLQl7Ci0JICAvKiBGSVhNRTogV2UgY291bGQgaGFuZGxlIHRoaXMgYnkgc2V0dGluZyB0aGUgY29udGludWVkIGJpdC4KLSAgICAgICAgICAgICBUaGVyZSB3b3VsZCBzdGlsbCBiZSBhIGxpbWl0OiB0aGUgLnR5cGUgYXJndW1lbnQgY2FuIG5vdAotICAgICAgICAgICAgIGJlIGluZmluaXRlLiAgKi8KLQkgIGFzX3dhcm4gKF8oIlRoZSB0eXBlIG9mICVzIGlzIHRvbyBjb21wbGV4OyBpdCB3aWxsIGJlIHNpbXBsaWZpZWQiKSwKLQkJICAgY29mZl9zeW1fbmFtZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoSVNQVFIgKHZhbCkpCi0JKi0tdHFfcHRyID0gdHFfUHRyOwotICAgICAgZWxzZSBpZiAoSVNGQ04gKHZhbCkpCi0JKi0tdHFfcHRyID0gdHFfUHJvYzsKLSAgICAgIGVsc2UgaWYgKElTQVJZICh2YWwpKQotCSotLXRxX3B0ciA9IHRxX0FycmF5OwotICAgICAgZWxzZQotCWFzX2ZhdGFsIChfKCJVbnJlY29nbml6ZWQgLnR5cGUgYXJndW1lbnQiKSk7Ci0KLSAgICAgIHZhbCA9IERFQ1JFRiAodmFsKTsKLSAgICB9Ci0KLSAgdHFfc2hmdCA9ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzWzBdOwotICB3aGlsZSAodHFfcHRyICE9ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzW05fVFFdKQotICAgICp0cV9zaGZ0KysgPSAqdHFfcHRyKys7Ci0KLSAgaWYgKHRxX3NoZnQgIT0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbMF0gJiYgdHFfc2hmdFstMV0gPT0gdHFfUHJvYykKLSAgICB7Ci0gICAgICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIGlnbm9yZSBpdCwgc28gdGhhdCB3ZSBkb24ndCBnZXQgdHdvCi0JIGVudHJpZXMgKG9uZSBmcm9tIHRoZSAuZW50LCBhbmQgb25lIGZvciB0aGUgLmRlZiB0aGF0Ci0JIHByZWNlZGVzIGl0KS4gIFNhdmUgdGhlIHR5cGUgaW5mb3JtYXRpb24gc28gdGhhdCB0aGUgZW5kCi0JIGJsb2NrIGNhbiBwcm9wZXJseSBhZGQgaXQgYWZ0ZXIgdGhlIGJlZ2luIGJsb2NrIGluZGV4LiAgRm9yCi0JIE1JUFMga25vd3Mgd2hhdCByZWFzb24sIHdlIG11c3Qgc3RyaXAgb2ZmIHRoZSBmdW5jdGlvbiB0eXBlCi0JIGF0IHRoaXMgcG9pbnQuICAqLwotICAgICAgY29mZl9pc19mdW5jdGlvbiA9IDE7Ci0gICAgICB0cV9zaGZ0Wy0xXSA9IHRxX05pbDsKLSAgICB9Ci0KLSAgd2hpbGUgKHRxX3NoZnQgIT0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbTl9UUV0pCi0gICAgKnRxX3NoZnQrKyA9IHRxX05pbDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC50YWcgZGlyZWN0aXZlLCB3aGljaCBnaXZlcyB0aGUgbmFtZSBvZiBhIHN0cnVjdHVyZSwKLSAgIHVuaW9uIG9yIGVudW0uICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfdGFnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgbmFtZV9lbmQ7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudGFnIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGNvZmZfdGFnID0gKGNoYXIgKikgeG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpIChzdHJsZW4gKG5hbWUpICsgMSkpOwotICBzdHJjcHkgKGNvZmZfdGFnLCBuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAudmFsIGRpcmVjdGl2ZSwgd2hpY2ggZ2l2ZXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBJdAotICAgbWF5IGJlIHRoZSBuYW1lIG9mIGEgc3RhdGljIG9yIGdsb2JhbCBzeW1ib2wuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfdmFsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi52YWwgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudCAmJiBleHAuWF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi52YWwgZXhwcmVzc2lvbiBpcyB0b28gY29wbWxleCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChleHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIGNvZmZfdmFsdWUgPSBleHAuWF9hZGRfbnVtYmVyOwotICBlbHNlCi0gICAgewotICAgICAgY29mZl9zeW1fdmFsdWUgPSBleHAuWF9hZGRfc3ltYm9sOwotICAgICAgY29mZl9zeW1fYWRkZW5kID0gZXhwLlhfYWRkX251bWJlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuZW5kZWYgZGlyZWN0aXZlLCB3aGljaCB0ZXJtaW5hdGVzIHByb2Nlc3Npbmcgb2YgQ09GRgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBzeW1pbnRfdCBpbmR4OwotICBsb2NhbHN5bV90ICpzeW07Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5lbmRlZiBwc2V1ZG8tb3AgdXNlZCBiZWZvcmUgLmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IGNvZmZfc3ltX25hbWU7Ci0gIGNvZmZfc3ltX25hbWUgPSAoY2hhciAqKSBOVUxMOwotCi0gIC8qIElmIHRoZSBzeW1ib2wgaXMgYSBzdGF0aWMgb3IgZXh0ZXJuYWwsIHdlIGhhdmUgYWxyZWFkeSBnb3R0ZW4gdGhlCi0gICAgIGFwcHJvcHJpYXRlIHR5cGUgYW5kIGNsYXNzLCBzbyBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcnJpZGUgdGhvc2UKLSAgICAgdmFsdWVzLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGVyZSBhcmUgc29tZSB0eXBlIGFuZCBjbGFzc2VzCi0gICAgIHRoYXQgYXJlIG5vdCBpbiBDT0ZGLCBzdWNoIGFzIHNob3J0IGRhdGEsIGV0Yy4gICovCi0gIGlmIChjb2ZmX3N5bV92YWx1ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cCA9IHN0X05pbDsKLSAgICAgIGNvZmZfc3RvcmFnZV9jbGFzcyA9IHNjX05pbDsKLSAgICB9Ci0KLSAgY29mZl90eXBlLmV4dHJhX3NpemVzID0gY29mZl90YWcgIT0gKGNoYXIgKikgTlVMTDsKLSAgaWYgKGNvZmZfdHlwZS5udW1fZGltcyA+IDApCi0gICAgewotICAgICAgaW50IGRpZmYgPSBjb2ZmX3R5cGUubnVtX2RpbXMgLSBjb2ZmX3R5cGUubnVtX3NpemVzOwotICAgICAgaW50IGkgPSBjb2ZmX3R5cGUubnVtX2RpbXMgLSAxOwotICAgICAgaW50IGo7Ci0KLSAgICAgIGlmIChjb2ZmX3R5cGUubnVtX3NpemVzICE9IDEgfHwgZGlmZiA8IDApCi0JewotCSAgYXNfd2FybiAoXygiQmFkIENPRkYgZGVidWdnaW5nIGluZm8iKSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIGlzIGFuIGFycmF5LCBtYWtlIHN1cmUgdGhlIHNhbWUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKLQkgYW5kIHNpemVzIHdlcmUgcGFzc2VkLCBjcmVhdGluZyBleHRyYSBzaXplcyBmb3IgbXVsdGlwbHkKLQkgZGltZW5zaW9uZWQgYXJyYXlzIGlmIG5vdCBwYXNzZWQuICAqLwotICAgICAgY29mZl90eXBlLmV4dHJhX3NpemVzID0gMDsKLSAgICAgIGlmIChkaWZmKQotCXsKLQkgIGogPSAoc2l6ZW9mIChjb2ZmX3R5cGUuc2l6ZXMpIC8gc2l6ZW9mIChjb2ZmX3R5cGUuc2l6ZXNbMF0pKSAtIDE7Ci0JICB3aGlsZSAoaiA+PSAwKQotCSAgICB7Ci0JICAgICAgY29mZl90eXBlLnNpemVzW2pdID0gKCgoaiAtIGRpZmYpID49IDApCi0JCQkJICAgID8gY29mZl90eXBlLnNpemVzW2ogLSBkaWZmXQotCQkJCSAgICA6IDApOwotCSAgICAgIGotLTsKLQkgICAgfQotCi0JICBjb2ZmX3R5cGUubnVtX3NpemVzID0gaSArIDE7Ci0JICBmb3IgKGktLTsgaSA+PSAwOyBpLS0pCi0JICAgIGNvZmZfdHlwZS5zaXplc1tpXSA9IChjb2ZmX3R5cGUuZGltZW5zaW9uc1tpICsgMV0gPT0gMAotCQkJCSAgPyAwCi0JCQkJICA6IChjb2ZmX3R5cGUuc2l6ZXNbaSArIDFdCi0JCQkJICAgICAvIGNvZmZfdHlwZS5kaW1lbnNpb25zW2kgKyAxXSkpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGNvZmZfc3ltYm9sX3R5cCA9PSBzdF9NZW1iZXIKLQkgICAmJiBjb2ZmX3R5cGUubnVtX3NpemVzIC0gY29mZl90eXBlLmV4dHJhX3NpemVzID09IDEpCi0gICAgewotICAgICAgLyogSXMgdGhpcyBhIGJpdGZpZWxkPyAgVGhpcyBpcyBpbmRpY2F0ZWQgYnkgYSBzdHJ1Y3R1cmUgbWVtZWJlcgotCSBoYXZpbmcgYSBzaXplIGZpZWxkIHRoYXQgaXNuJ3QgYW4gYXJyYXkuICAqLwotICAgICAgY29mZl90eXBlLmJpdGZpZWxkID0gMTsKLSAgICB9Ci0KLSAgLyogRXhjZXB0IGZvciBlbnVtZXJhdGlvbiBtZW1iZXJzICYgYmVnaW4vZW5kaW5nIG9mIHNjb3BlcywgcHV0IHRoZQotICAgICB0eXBlIHdvcmQgaW4gdGhlIGF1eC4gc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKGNvZmZfc3ltYm9sX3R5cCA9PSBzdF9CbG9jayB8fCBjb2ZmX3N5bWJvbF90eXAgPT0gc3RfRW5kKQotICAgIGluZHggPSAwOwotICBlbHNlIGlmIChjb2ZmX2luc2lkZV9lbnVtZXJhdGlvbikKLSAgICBpbmR4ID0gY3VyX2ZpbGVfcHRyLT52b2lkX3R5cGU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoY29mZl90eXBlLmJhc2ljX3R5cGUgPT0gYnRfU3RydWN0Ci0JICB8fCBjb2ZmX3R5cGUuYmFzaWNfdHlwZSA9PSBidF9VbmlvbgotCSAgfHwgY29mZl90eXBlLmJhc2ljX3R5cGUgPT0gYnRfRW51bSkKLQl7Ci0JICBpZiAoY29mZl90YWcgPT0gKGNoYXIgKikgTlVMTCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oIk5vIHRhZyBzcGVjaWZpZWQgZm9yICVzIiksIG5hbWUpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBjb2ZmX3R5cGUudGFnX3B0ciA9IGdldF90YWcgKGNvZmZfdGFnLCAobG9jYWxzeW1fdCAqKSBOVUxMLAotCQkJCSAgICAgICBjb2ZmX3R5cGUuYmFzaWNfdHlwZSk7Ci0JfQotCi0gICAgICBpZiAoY29mZl9pc19mdW5jdGlvbikKLQl7Ci0JICBsYXN0X2Z1bmNfdHlwZV9pbmZvID0gY29mZl90eXBlOwotCSAgbGFzdF9mdW5jX3N5bV92YWx1ZSA9IGNvZmZfc3ltX3ZhbHVlOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaW5keCA9IGFkZF9hdXhfc3ltX3RpciAoJmNvZmZfdHlwZSwKLQkJCSAgICAgIGhhc2hfeWVzLAotCQkJICAgICAgJmN1cl9maWxlX3B0ci0+dGhhc2hfaGVhZFswXSk7Ci0gICAgfQotCi0gIC8qIERvIGFueSBsYXN0IG1pbnV0ZSBhZGp1c3RtZW50cyB0aGF0IGFyZSBuZWNlc3NhcnkuICAqLwotICBzd2l0Y2ggKGNvZmZfc3ltYm9sX3R5cCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBGb3IgdGhlIGJlZ2lubmluZyBvZiBzdHJ1Y3RzLCB1bmlvbnMsIGFuZCBlbnVtZXJhdGlvbnMsIHRoZQotCSBzaXplIGluZm8gbmVlZHMgdG8gYmUgcGFzc2VkIGluIHRoZSB2YWx1ZSBmaWVsZC4gICovCi0gICAgY2FzZSBzdF9CbG9jazoKLSAgICAgIGlmIChjb2ZmX3R5cGUubnVtX3NpemVzIC0gY29mZl90eXBlLm51bV9kaW1zIC0gY29mZl90eXBlLmV4dHJhX3NpemVzCi0JICAhPSAxKQotCXsKLQkgIGFzX3dhcm4gKF8oIkJhZCBDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JY29mZl92YWx1ZSA9IGNvZmZfdHlwZS5zaXplc1swXTsKLQotICAgICAgY29mZl9pbnNpZGVfZW51bWVyYXRpb24gPSAoY29mZl90eXBlLm9yaWdfdHlwZSA9PSBUX0VOVU0pOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIEZvciB0aGUgZW5kIG9mIHN0cnVjdHMsIHVuaW9ucywgYW5kIGVudW1lcmF0aW9ucywgb21pdCB0aGUKLQkgbmFtZSB3aGljaCBpcyBhbHdheXMgIi5lb3MiLiAgVGhpcyBuZWVkcyB0byBiZSBkb25lIGxhc3QsIHNvCi0JIHRoYXQgYW55IGVycm9yIHJlcG9ydGluZyBhYm92ZSBnaXZlcyB0aGUgY29ycmVjdCBuYW1lLiAgKi8KLSAgICBjYXNlIHN0X0VuZDoKLSAgICAgIGZyZWUgKG5hbWUpOwotICAgICAgbmFtZSA9IChjaGFyICopIE5VTEw7Ci0gICAgICBjb2ZmX3ZhbHVlID0gMDsKLSAgICAgIGNvZmZfaW5zaWRlX2VudW1lcmF0aW9uID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBNZW1iZXJzIG9mIHN0cnVjdHVyZXMgYW5kIHVuaW9ucyB0aGF0IGFyZW4ndCBiaXRmaWVsZHMsIG5lZWQKLQkgdG8gYWRqdXN0IHRoZSB2YWx1ZSBmcm9tIGEgYnl0ZSBvZmZzZXQgdG8gYSBiaXQgb2Zmc2V0LgotCSBNZW1iZXJzIG9mIGVudW1lcmF0aW9ucyBkbyBub3QgaGF2ZSB0aGUgdmFsdWUgYWRqdXN0ZWQsIGFuZAotCSBjYW4gYmUgZGlzdGluZ3Vpc2hlZCBieSBpbmR4ID09IGluZGV4TmlsLiAgRm9yIGVudW1lcmF0aW9ucywKLQkgdXBkYXRlIHRoZSBtYXhpbXVtIGVudW1lcmF0aW9uIHZhbHVlLiAgKi8KLSAgICBjYXNlIHN0X01lbWJlcjoKLSAgICAgIGlmICghIGNvZmZfdHlwZS5iaXRmaWVsZCAmJiAhIGNvZmZfaW5zaWRlX2VudW1lcmF0aW9uKQotCWNvZmZfdmFsdWUgKj0gODsKLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEFkZCB0aGUgc3ltYm9sLiAgKi8KLSAgc3ltID0gYWRkX2Vjb2ZmX3N5bWJvbCAobmFtZSwKLQkJCSAgY29mZl9zeW1ib2xfdHlwLAotCQkJICBjb2ZmX3N0b3JhZ2VfY2xhc3MsCi0JCQkgIGNvZmZfc3ltX3ZhbHVlLAotCQkJICBjb2ZmX3N5bV9hZGRlbmQsCi0JCQkgIChzeW1pbnRfdCkgY29mZl92YWx1ZSwKLQkJCSAgaW5keCk7Ci0KLSAgLyogZGVhbCB3aXRoIHN0cnVjdCwgdW5pb24sIGFuZCBlbnVtIHRhZ3MuICAqLwotICBpZiAoY29mZl9zeW1ib2xfdHlwID09IHN0X0Jsb2NrKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBvciB1cGRhdGUgdGhlIHRhZyBpbmZvcm1hdGlvbi4gICovCi0gICAgICB0YWdfdCAqdGFnX3B0ciA9IGdldF90YWcgKG5hbWUsCi0JCQkJc3ltLAotCQkJCWNvZmZfdHlwZS5iYXNpY190eXBlKTsKLSAgICAgIGZvcndhcmRfdCAqKnBmOwotCi0gICAgICAvKiBSZW1lbWJlciBhbnkgZm9yd2FyZCByZWZlcmVuY2VzLiAgKi8KLSAgICAgIGZvciAocGYgPSAmc3ltLT5mb3J3YXJkX3JlZjsKLQkgICAqcGYgIT0gKGZvcndhcmRfdCAqKSBOVUxMOwotCSAgIHBmID0gJigqcGYpLT5uZXh0KQotCTsKLSAgICAgICpwZiA9IHRhZ19wdHItPmZvcndhcmRfcmVmOwotICAgICAgdGFnX3B0ci0+Zm9yd2FyZF9yZWYgPSAoZm9yd2FyZF90ICopIE5VTEw7Ci0gICAgfQotfQotDAotLyogUGFyc2UgLmVuZCBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2VuZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVfZW5kOwotICByZWdpc3RlciBpbnQgY2g7Ci0gIHN5bWJvbFMgKmVudDsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5maWxlIGRpcmVjdGl2ZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGNoID0gKm5hbWU7Ci0gIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKGNoKSkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSBoYXMgbm8gbmFtZSIpKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFRoZSB2YWx1ZSBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgLmVuZCBkaXJlY3RpdmUgYW5kIHRoZQotICAgICBjb3JyZXNwb25kaW5nIHN5bWJvbC4gIFdlIGNyZWF0ZSBhIGZha2Ugc3ltYm9sIHRvIGhvbGQgdGhlCi0gICAgIGN1cnJlbnQgbG9jYXRpb24sIGFuZCBwdXQgaW4gdGhlIG9mZnNldCB3aGVuIHdlIHdyaXRlIG91dCB0aGUKLSAgICAgc3ltYm9sLiAgKi8KLSAgZW50ID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICBpZiAoZW50ID09IChzeW1ib2xTICopIE5VTEwpCi0gICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgbmFtZXMgdW5rbm93biBzeW1ib2wiKSk7Ci0gIGVsc2UKLSAgICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwgc3RfRW5kLCBzY19UZXh0LAotCQkJICAgICBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywKLQkJCQkJICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwKLQkJCQkJIGZyYWdfbm93KSwKLQkJCSAgICAgKGJmZF92bWEpIDAsIChzeW1pbnRfdCkgMCwgKHN5bWludF90KSAwKTsKLQotICBjdXJfcHJvY19wdHIgPSAocHJvY190ICopIE5VTEw7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUGFyc2UgLmVudCBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2VudCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVfZW5kOwotICByZWdpc3RlciBpbnQgY2g7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYWRkX2ZpbGUgKChjb25zdCBjaGFyICopIE5VTEwsIDAsIDEpOwotCi0gIGlmIChjdXJfcHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInNlY29uZCAuZW50IGRpcmVjdGl2ZSBmb3VuZCBiZWZvcmUgLmVuZCBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGNoID0gKm5hbWU7Ci0gIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKGNoKSkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gbmFtZSIpKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFkZF9wcm9jZWR1cmUgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICAvKiBUaGUgLmVudCBkaXJlY3RpdmUgaXMgc29tZXRpbWVzIGZvbGxvd2VkIGJ5IGEgbnVtYmVyLiAgSSdtIG5vdAotICAgICByZWFsbHkgc3VyZSB3aGF0IHRoZSBudW1iZXIgbWVhbnMuICBJIGRvbid0IHNlZSBhbnkgd2F5IHRvIHN0b3JlCi0gICAgIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgUERSLiAgVGhlIElyaXggNCBhc3NlbWJsZXIgc2VlbXMgdG8gaWdub3JlCi0gICAgIHRoZSBpbmZvcm1hdGlvbi4gICovCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKQotICAgICAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0gICAgKHZvaWQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBQYXJzZSAuZXh0ZXJuIGRpcmVjdGl2ZXMuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZXh0ZXJuIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xwOwotICB2YWx1ZVQgc2l6ZTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bWJvbHAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbHApOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIHN5bWJvbF9nZXRfb2JqIChzeW1ib2xwKS0+ZWNvZmZfZXh0ZXJuX3NpemUgPSBzaXplOwotfQotDAotLyogUGFyc2UgLmZpbGUgZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9maWxlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBpbmR4OwotICBjaGFyICpuYW1lOwotICBpbnQgbGVuOwotCi0gIGlmIChjdXJfcHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIk5vIHdheSB0byBoYW5kbGUgLmZpbGUgd2l0aGluIC5lbnQvLmVuZCBzZWN0aW9uIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5keCA9IChpbnQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIC8qIEZJWE1FOiB3ZSBkb24ndCBoYXZlIHRvIHNhdmUgdGhlIG5hbWUgaGVyZS4gICovCi0gIG5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7Ci0KLSAgYWRkX2ZpbGUgKG5hbWUsIGluZHggLSAxLCAwKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUGFyc2UgLmZtYXNrIGRpcmVjdGl2ZXMuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZm1hc2sgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmZtYXNrIG91dHNpZGUgb2YgLmVudCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZm1hc2sgZGlyZWN0aXZlIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPnBkci5mcmVnbWFzayA9IHZhbDsKLSAgY3VyX3Byb2NfcHRyLT5wZHIuZnJlZ29mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBQYXJzZSAuZnJhbWUgZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZnJhbWUgb3V0c2lkZSBvZiAuZW50IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIuZnJhbWVyZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDEpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnLCcKLSAgICAgIHx8IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5mcmFtZSBkaXJlY3RpdmUiKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGN1cl9wcm9jX3B0ci0+cGRyLmZyYW1lb2Zmc2V0ID0gdmFsOwotCi0gIGN1cl9wcm9jX3B0ci0+cGRyLnBjcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgwKTsKLQotI2lmIDAgLyogQWxwaGEtT1NGMSBhZGRzICJ0aGUgb2Zmc2V0IG9mIHNhdmVkICRhMCBmcm9tICRzcCIsIGFjY29yZGluZwotCSB0byBTYW5kcm8uICBJIGRvbid0IHlldCBrbm93IHdoZXJlIHRoaXMgdmFsdWUgc2hvdWxkIGJlIHN0b3JlZCwgaWYKLQkgYW55d2hlcmUuICAqLwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotI2Vsc2UKLSAgc19pZ25vcmUgKDQyKTsKLSNlbmRpZgotfQotDAotLyogUGFyc2UgLm1hc2sgZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9tYXNrIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5tYXNrIG91dHNpZGUgb2YgLmVudCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAubWFzayBkaXJlY3RpdmUiKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGN1cl9wcm9jX3B0ci0+cGRyLnJlZ21hc2sgPSB2YWw7Ci0gIGN1cl9wcm9jX3B0ci0+cGRyLnJlZ29mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBQYXJzZSAubG9jIGRpcmVjdGl2ZXMuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfbG9jIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxpbmVub19saXN0X3QgKmxpc3Q7Ci0gIHN5bWludF90IGxpbmVubzsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIubG9jIGJlZm9yZSAuZmlsZSIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChub3dfc2VnICE9IHRleHRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIubG9jIG91dHNpZGUgb2YgLnRleHQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBTa2lwIHRoZSBmaWxlIG51bWJlci4gICovCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBsaW5lbm8gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGlmIChsaXN0aW5nKQotICAgIGxpc3Rpbmdfc291cmNlX2xpbmUgKGxpbmVubyk7Ci0jZW5kaWYKLQotICAvKiBJZiB3ZSdyZSBidWlsZGluZyBzdGFicywgdGhlbiBvdXRwdXQgYSBzcGVjaWFsIGxhYmVsIHJhdGhlciB0aGFuCi0gICAgIEVDT0ZGIGxpbmUgbnVtYmVyIGluZm8uICAqLwotICBpZiAoc3RhYnNfc2VlbikKLSAgICB7Ci0gICAgICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoKGNoYXIgKikgTlVMTCwgc3RfTGFiZWwsIHNjX1RleHQsCi0JCQkgICAgICAgc3ltYm9sX25ldyAoIkwwXDAwMSIsIG5vd19zZWcsCi0JCQkJCSAgICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwKLQkJCQkJICAgZnJhZ19ub3cpLAotCQkJICAgICAgIChiZmRfdm1hKSAwLCAwLCBsaW5lbm8pOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBsaXN0ID0gYWxsb2NhdGVfbGluZW5vX2xpc3QgKCk7Ci0KLSAgbGlzdC0+bmV4dCA9IChsaW5lbm9fbGlzdF90ICopIE5VTEw7Ci0gIGxpc3QtPmZpbGUgPSBjdXJfZmlsZV9wdHI7Ci0gIGxpc3QtPnByb2MgPSBjdXJfcHJvY19wdHI7Ci0gIGxpc3QtPmZyYWcgPSBmcmFnX25vdzsKLSAgbGlzdC0+cGFkZHIgPSBmcmFnX25vd19maXggKCk7Ci0gIGxpc3QtPmxpbmVubyA9IGxpbmVubzsKLQotICAvKiBXZSBkb24ndCB3YW50IHRvIG1lcmdlIGZpbGVzIHdoaWNoIGhhdmUgbGluZSBudW1iZXJzLiAgKi8KLSAgY3VyX2ZpbGVfcHRyLT5mZHIuZk1lcmdlID0gMDsKLQotICAvKiBBIC5sb2MgZGlyZWN0aXZlIHdpbGwgc29tZXRpbWVzIGFwcGVhciBiZWZvcmUgYSAuZW50IGRpcmVjdGl2ZSwKLSAgICAgd2hpY2ggbWVhbnMgdGhhdCBjdXJfcHJvY19wdHIgd2lsbCBiZSBOVUxMIGhlcmUuICBBcnJhbmdlIHRvCi0gICAgIHBhdGNoIHRoaXMgdXAuICAqLwotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBsaW5lbm9fbGlzdF90ICoqcGw7Ci0KLSAgICAgIHBsID0gJm5vcHJvY19saW5lbm87Ci0gICAgICB3aGlsZSAoKnBsICE9IChsaW5lbm9fbGlzdF90ICopIE5VTEwpCi0JcGwgPSAmKCpwbCktPm5leHQ7Ci0gICAgICAqcGwgPSBsaXN0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxhc3RfbGluZW5vID0gbGlzdDsKLSAgICAgICpsYXN0X2xpbmVub19wdHIgPSBsaXN0OwotICAgICAgbGFzdF9saW5lbm9fcHRyID0gJmxpc3QtPm5leHQ7Ci0gICAgfQotfQotCi0vKiBUaGUgTUlQUyBhc3NlbWJsZXIgc29tZXRpbWVzIGluc2VydHMgbm9wIGluc3RydWN0aW9ucyBpbiB0aGUKLSAgIGluc3RydWN0aW9uIHN0cmVhbS4gIFdoZW4gdGhpcyBoYXBwZW5zLCB3ZSBtdXN0IHBhdGNoIHVwIHRoZSAubG9jCi0gICBpbmZvcm1hdGlvbiBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIG5vcC4gICovCi0KLXZvaWQKLWVjb2ZmX2ZpeF9sb2MgKG9sZF9mcmFnLCBvbGRfZnJhZ19vZmZzZXQpCi0gICAgIGZyYWdTICpvbGRfZnJhZzsKLSAgICAgdW5zaWduZWQgbG9uZyBvbGRfZnJhZ19vZmZzZXQ7Ci17Ci0gIGlmIChsYXN0X2xpbmVubyAhPSBOVUxMCi0gICAgICAmJiBsYXN0X2xpbmVuby0+ZnJhZyA9PSBvbGRfZnJhZwotICAgICAgJiYgbGFzdF9saW5lbm8tPnBhZGRyID09IG9sZF9mcmFnX29mZnNldCkKLSAgICB7Ci0gICAgICBsYXN0X2xpbmVuby0+ZnJhZyA9IGZyYWdfbm93OwotICAgICAgbGFzdF9saW5lbm8tPnBhZGRyID0gZnJhZ19ub3dfZml4ICgpOwotICAgIH0KLX0KLQwKLS8qIE1ha2Ugc3VyZSB0aGUgQHN0YWJzIHN5bWJvbCBpcyBlbWl0dGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLW1hcmtfc3RhYnMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKCEgc3RhYnNfc2VlbikKLSAgICB7Ci0gICAgICAvKiBBZGQgYSBkdW1teSBAc3RhYnMgZHltYm9sLiAqLwotICAgICAgc3RhYnNfc2VlbiA9IDE7Ci0gICAgICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoc3RhYnNfc3ltYm9sLCBzdE5pbCwgc2NJbmZvLAotCQkJICAgICAgIChzeW1ib2xTICopIE5VTEwsCi0JCQkgICAgICAgKGJmZF92bWEpIDAsIChzeW1pbnRfdCkgLTEsCi0JCQkgICAgICAgRUNPRkZfTUFSS19TVEFCICgwKSk7Ci0gICAgfQotfQotDAotLyogUGFyc2UgLndlYWtleHQgZGlyZWN0aXZlcy4gICovCi0jaWZuZGVmIFRDX01JUFMKLS8qIEZvciBUQ19NSVBTIHVzZSB0aGUgdmVyc2lvbiBpbiB0Yy1taXBzLmMuICovCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfd2Vha2V4dCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgZXhwcmVzc2lvblMgZXhwOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCXsKLQkgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZWRlZmluZSBzeW1ib2wgYCVzJy4iKSwKLQkJICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JewotCSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0JICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImJhZCAud2Vha2V4dCBkaXJlY3RpdmUiKSk7Ci0JICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChzeW1ib2xQLCAmZXhwKTsKLQl9Ci0gICAgfQotCi0gIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0jZW5kaWYgLyogbm90IFRDX01JUFMgKi8KLQwKLS8qIEhhbmRsZSAuc3RhYnMgZGlyZWN0aXZlcy4gIFRoZSBhY3R1YWwgcGFyc2luZyByb3V0aW5lIGlzIGRvbmUgYnkgYQotICAgZ2VuZXJpYyByb3V0aW5lLiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB2aWEgT0JKX1BST0NFU1NfU1RBQi4KLSAgIFdoZW4gdGhpcyBpcyBjYWxsZWQsIGlucHV0X2xpbmVfcG9pbnRlciB3aWxsIGJlIHBvaW50aW5nIGF0IHRoZQotICAgdmFsdWUgZmllbGQgb2YgdGhlIHN0YWIuCi0KLSAgIC5zdGFicyBkaXJlY3RpdmVzIGhhdmUgZml2ZSBmaWVsZHM6Ci0JInN0cmluZyIJYSBzdHJpbmcsIGVuY29kaW5nIHRoZSB0eXBlIGluZm9ybWF0aW9uLgotCWNvZGUJCWEgbnVtZXJpYyBjb2RlLCBkZWZpbmVkIGluIDxzdGFiLmg+Ci0JMAkJYSB6ZXJvCi0JZGVzYwkJYSB6ZXJvIG9yIGxpbmUgbnVtYmVyCi0JdmFsdWUJCWEgbnVtZXJpYyB2YWx1ZSBvciBhbiBhZGRyZXNzLgotCi0gICAgSWYgdGhlIHZhbHVlIGlzIHJlbG9jYXRhYmxlLCB3ZSB0cmFuc2Zvcm0gdGhpcyBpbnRvOgotCWlzcwkJcG9pbnRzIGFzIGFuIGluZGV4IGludG8gc3RyaW5nIHNwYWNlCi0JdmFsdWUJCXZhbHVlIGZyb20gbG9va3VwIG9mIHRoZSBuYW1lCi0Jc3QJCXN0IGZyb20gbG9va3VwIG9mIHRoZSBuYW1lCi0Jc2MJCXNjIGZyb20gbG9va3VwIG9mIHRoZSBuYW1lCi0JaW5kZXgJCWNvZGV8Q09ERV9NQVNLCi0KLSAgICBJZiB0aGUgdmFsdWUgaXMgbm90IHJlbG9jYXRhYmxlLCB3ZSB0cmFuc2Zvcm0gdGhpcyBpbnRvOgotCWlzcwkJcG9pbnRzIGFzIGFuIGluZGV4IGludG8gc3RyaW5nIHNwYWNlCi0JdmFsdWUJCXZhbHVlCi0Jc3QJCXN0X05pbAotCXNjCQlzY19OaWwKLQlpbmRleAkJY29kZXxDT0RFX01BU0sKLQotICAgIC5zdGFibiBkaXJlY3RpdmVzIGhhdmUgZm91ciBmaWVsZHMgKHN0cmluZyBpcyBudWxsKToKLQljb2RlCQlhIG51bWVyaWMgY29kZSwgZGVmaW5lZCBpbiA8c3RhYi5oPgotCTAJCWEgemVybwotCWRlc2MJCWEgemVybyBvciBhIGxpbmUgbnVtYmVyCi0JdmFsdWUJCWEgbnVtZXJpYyB2YWx1ZSBvciBhbiBhZGRyZXNzLiAgKi8KLQotdm9pZAotZWNvZmZfc3RhYiAoc2VjLCB3aGF0LCBzdHJpbmcsIHR5cGUsIG90aGVyLCBkZXNjKQotICAgICBzZWdUIHNlYzsKLSAgICAgaW50IHdoYXQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBvdGhlcjsKLSAgICAgaW50IGRlc2M7Ci17Ci0gIGVmZHJfdCAqc2F2ZV9maWxlX3B0ciA9IGN1cl9maWxlX3B0cjsKLSAgc3ltYm9sUyAqc3ltOwotICBzeW1pbnRfdCB2YWx1ZTsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIHN0X3Qgc3Q7Ci0gIHNjX3Qgc2M7Ci0gIHN5bWludF90IGluZHg7Ci0gIGxvY2Fsc3ltX3QgKmhvbGQgPSBOVUxMOwotCi0gIGVjb2ZmX2RlYnVnZ2luZ19zZWVuID0gMTsKLQotICAvKiBXZSBkb24ndCBoYW5kbGUgLnN0YWJkLiAgKi8KLSAgaWYgKHdoYXQgIT0gJ3MnICYmIHdoYXQgIT0gJ24nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLnN0YWIlYyBpcyBub3Qgc3VwcG9ydGVkIiksIHdoYXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBBIC5zdGFibiB1c2VzIGEgbnVsbCBuYW1lLCBub3QgYW4gZW1wdHkgc3RyaW5nLiAgKi8KLSAgaWYgKHdoYXQgPT0gJ24nKQotICAgIHN0cmluZyA9IE5VTEw7Ci0KLSAgLyogV2UgaWdub3JlIHRoZSBvdGhlciBmaWVsZC4gICovCi0gIGlmIChvdGhlciAhPSAwKQotICAgIGFzX3dhcm4gKF8oIi5zdGFiJWM6IGlnbm9yaW5nIG5vbi16ZXJvIG90aGVyIGZpZWxkIiksIHdoYXQpOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgY3VycmVudCBmaWxlLiAgKi8KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgYWRkX2ZpbGUgKChjb25zdCBjaGFyICopIE5VTEwsIDAsIDEpOwotICAgICAgc2F2ZV9maWxlX3B0ciA9IGN1cl9maWxlX3B0cjsKLSAgICB9Ci0KLSAgLyogRm9yIHN0YWJzIGluIEVDT0ZGLCB0aGUgZmlyc3Qgc3ltYm9sIG11c3QgYmUgQHN0YWJzLiAgVGhpcyBpcyBhCi0gICAgIHNpZ25hbCB0byBnZGIuICAqLwotICBpZiAoc3RhYnNfc2VlbiA9PSAwKQotICAgIG1hcmtfc3RhYnMgKDApOwotCi0gIC8qIExpbmUgbnVtYmVyIHN0YWJzIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCBzaW5jZSB0aGV5IGhhdmUgdHdvCi0gICAgIHZhbHVlcywgdGhlIGxpbmUgbnVtYmVyIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgbGFiZWwuICBXZSB1c2UgdGhlCi0gICAgIGluZGV4IGZpZWxkIChha2EgZGVzYykgdG8gaG9sZCB0aGUgbGluZSBudW1iZXIsIGFuZCB0aGUgdmFsdWUKLSAgICAgZmllbGQgdG8gaG9sZCB0aGUgYWRkcmVzcy4gIFRoZSBzeW1ib2wgdHlwZSBpcyBzdF9MYWJlbCwgd2hpY2gKLSAgICAgc2hvdWxkIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlciBzdGFicywgc28gdGhhdCBnZGIgY2FuCi0gICAgIHJlY29nbml6ZSBpdC4gICovCi0gIGlmICh0eXBlID09IE5fU0xJTkUpCi0gICAgewotICAgICAgU1lNUiBkdW1teV9zeW1yOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgbmFtZV9lbmQ7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICAgICAgaWYgKGxpc3RpbmcpCi0JbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgZGVzYyk7Ci0jZW5kaWYKLQotICAgICAgZHVtbXlfc3ltci5pbmRleCA9IGRlc2M7Ci0gICAgICBpZiAoZHVtbXlfc3ltci5pbmRleCAhPSBkZXNjKQotCXsKLQkgIGFzX3dhcm4gKF8oIkxpbmUgbnVtYmVyICglZCkgZm9yIC5zdGFiJWMgZGlyZWN0aXZlIGNhbm5vdCBmaXQgaW4gaW5kZXggZmllbGQgKDIwIGJpdHMpIiksCi0JCSAgIGRlc2MsIHdoYXQpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgICAgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBhZGRlbmQgPSAwOwotICAgICAgc3QgPSBzdF9MYWJlbDsKLSAgICAgIHNjID0gc2NfVGV4dDsKLSAgICAgIGluZHggPSBkZXNjOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZm5kZWYgTk9fTElTVElORwotICAgICAgaWYgKGxpc3RpbmcgJiYgKHR5cGUgPT0gTl9TTyB8fCB0eXBlID09IE5fU09MKSkKLQlsaXN0aW5nX3NvdXJjZV9maWxlIChzdHJpbmcpOwotI2VuZGlmCi0KLSAgICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikKLQkgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nCi0JICB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICcrJykKLQl7Ci0JICBzdCA9IHN0X05pbDsKLQkgIHNjID0gc2NfTmlsOwotCSAgc3ltID0gKHN5bWJvbFMgKikgTlVMTDsKLQkgIHZhbHVlID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICBhZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgaXNfbmFtZV9iZWdpbm5lciAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotCXsKLQkgIGFzX3dhcm4gKF8oIklsbGVnYWwgLnN0YWIlYyBkaXJlY3RpdmUsIGJhZCBjaGFyYWN0ZXIiKSwgd2hhdCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4cHJlc3Npb25TIGV4cDsKLQotCSAgc2MgPSBzY19OaWw7Ci0JICBzdCA9IHN0X05pbDsKLQotCSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0JICBpZiAoZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIHN5bSA9IE5VTEw7Ci0JICAgICAgdmFsdWUgPSBleHAuWF9hZGRfbnVtYmVyOwotCSAgICAgIGFkZGVuZCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGV4cC5YX29wID09IE9fc3ltYm9sKQotCSAgICB7Ci0JICAgICAgc3ltID0gZXhwLlhfYWRkX3N5bWJvbDsKLQkgICAgICB2YWx1ZSA9IDA7Ci0JICAgICAgYWRkZW5kID0gZXhwLlhfYWRkX251bWJlcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ltID0gbWFrZV9leHByX3N5bWJvbCAoJmV4cCk7Ci0JICAgICAgdmFsdWUgPSAwOwotCSAgICAgIGFkZGVuZCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluZHggPSBFQ09GRl9NQVJLX1NUQUIgKHR5cGUpOwotICAgIH0KLQotICAvKiBEb24ndCBzdG9yZSB0aGUgc3RhYnMgc3ltYm9sIHdlIGFyZSBjcmVhdGluZyBhcyB0aGUgdHlwZSBvZiB0aGUKLSAgICAgRUNPRkYgc3ltYm9sLiAgV2Ugd2FudCB0byBjb21wdXRlIHRoZSB0eXBlIG9mIHRoZSBFQ09GRiBzeW1ib2wKLSAgICAgaW5kZXBlbmRlbnRseS4gICovCi0gIGlmIChzeW0gIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICBob2xkID0gc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX3N5bWJvbDsKLQotICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoc3RyaW5nLCBzdCwgc2MsIHN5bSwgYWRkZW5kLCB2YWx1ZSwgaW5keCk7Ci0KLSAgaWYgKHN5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9zeW1ib2wgPSBob2xkOwotCi0gIC8qIFJlc3RvcmUgbm9ybWFsIGZpbGUgdHlwZS4gICovCi0gIGN1cl9maWxlX3B0ciA9IHNhdmVfZmlsZV9wdHI7Ci19Ci0MCi0vKiBGcm9iIGFuIEVDT0ZGIHN5bWJvbC4gIFNtYWxsIGNvbW1vbiBzeW1ib2xzIGdvIGludG8gYSBzcGVjaWFsCi0gICAuc2NvbW1vbiBzZWN0aW9uIHJhdGhlciB0aGFuIGJmZF9jb21fc2VjdGlvbi4gICovCi0KLXZvaWQKLWVjb2ZmX2Zyb2Jfc3ltYm9sIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgaWYgKFNfSVNfQ09NTU9OIChzeW0pCi0gICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltKSA+IDAKLSAgICAgICYmIFNfR0VUX1ZBTFVFIChzeW0pIDw9IGJmZF9nZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0KSkKLSAgICB7Ci0gICAgICBzdGF0aWMgYXNlY3Rpb24gc2NvbV9zZWN0aW9uOwotICAgICAgc3RhdGljIGFzeW1ib2wgc2NvbV9zeW1ib2w7Ci0KLSAgICAgIC8qIFdlIG11c3QgY29uc3RydWN0IGEgZmFrZSBzZWN0aW9uIHNpbWlsYXIgdG8gYmZkX2NvbV9zZWN0aW9uCi0JIGJ1dCB3aXRoIHRoZSBuYW1lIC5zY29tbW9uLiAgKi8KLSAgICAgIGlmIChzY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIHNjb21fc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbjsKLQkgIHNjb21fc2VjdGlvbi5uYW1lID0gIi5zY29tbW9uIjsKLQkgIHNjb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICZzY29tX3NlY3Rpb247Ci0JICBzY29tX3NlY3Rpb24uc3ltYm9sID0gJnNjb21fc3ltYm9sOwotCSAgc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJnNjb21fc2VjdGlvbi5zeW1ib2w7Ci0JICBzY29tX3N5bWJvbCA9ICpiZmRfY29tX3NlY3Rpb24uc3ltYm9sOwotCSAgc2NvbV9zeW1ib2wubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBzY29tX3N5bWJvbC5zZWN0aW9uID0gJnNjb21fc2VjdGlvbjsKLQl9Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW0sICZzY29tX3NlY3Rpb24pOwotICAgIH0KLQotICAvKiBEb3VibGUgY2hlY2sgd2VhayBzeW1ib2xzLiAgKi8KLSAgaWYgKFNfSVNfV0VBSyAoc3ltKSkKLSAgICB7Ci0gICAgICBpZiAoU19JU19DT01NT04gKHN5bSkpCi0JYXNfYmFkIChfKCJTeW1ib2wgYCVzJyBjYW4gbm90IGJlIGJvdGggd2VhayBhbmQgY29tbW9uIiksCi0JCVNfR0VUX05BTUUgKHN5bSkpOwotICAgIH0KLX0KLQwKLS8qIEFkZCBieXRlcyB0byB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gYnVmZmVyLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgYnVmcHRyLCBuZWVkKQotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICBjaGFyICpidWZwdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbmVlZDsKLXsKLSAgdW5zaWduZWQgbG9uZyBhdDsKLSAgdW5zaWduZWQgbG9uZyB3YW50OwotCi0gIGF0ID0gYnVmcHRyIC0gKmJ1ZjsKLSAgbmVlZCAtPSAqYnVmZW5kIC0gYnVmcHRyOwotICBpZiAobmVlZCA8IFBBR0VfU0laRSkKLSAgICBuZWVkID0gUEFHRV9TSVpFOwotICB3YW50ID0gKCpidWZlbmQgLSAqYnVmKSArIG5lZWQ7Ci0gICpidWYgPSB4cmVhbGxvYyAoKmJ1Ziwgd2FudCk7Ci0gICpidWZlbmQgPSAqYnVmICsgd2FudDsKLSAgcmV0dXJuICpidWYgKyBhdDsKLX0KLQotLyogQWRqdXN0IHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBidWZmZXIgdG8gdGhlIGFsaWdubWVudCByZXF1aXJlZAotICAgZm9yIHRoZSBFQ09GRiB0YXJnZXQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX3BhZGRpbmdfYWRqdXN0IChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0LCBidWZwdHJwdHIpCi0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLSAgICAgY2hhciAqKmJ1ZnB0cnB0cjsKLXsKLSAgYmZkX3NpemVfdHlwZSBhbGlnbjsKLQotICBhbGlnbiA9IGJhY2tlbmQtPmRlYnVnX2FsaWduOwotICBpZiAoKG9mZnNldCAmIChhbGlnbiAtIDEpKSAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkOwotCi0gICAgICBhZGQgPSBhbGlnbiAtIChvZmZzZXQgJiAoYWxpZ24gLSAxKSk7Ci0gICAgICBpZiAoKmJ1ZmVuZCAtICgqYnVmICsgb2Zmc2V0KSA8IGFkZCkKLQkodm9pZCkgZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgKmJ1ZiArIG9mZnNldCwgYWRkKTsKLSAgICAgIG1lbXNldCAoKmJ1ZiArIG9mZnNldCwgMCwgYWRkKTsKLSAgICAgIG9mZnNldCArPSBhZGQ7Ci0gICAgICBpZiAoYnVmcHRycHRyICE9IChjaGFyICoqKSBOVUxMKQotCSpidWZwdHJwdHIgPSAqYnVmICsgb2Zmc2V0OwotICAgIH0KLQotICByZXR1cm4gb2Zmc2V0OwotfQotCi0vKiBCdWlsZCB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfbGluZW5vIChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0LCBsaW5lY250cHRyKQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gICAgIGxvbmcgKmxpbmVjbnRwdHI7Ci17Ci0gIGNoYXIgKmJ1ZnB0cjsKLSAgcmVnaXN0ZXIgbGluZW5vX2xpc3RfdCAqbDsKLSAgbGluZW5vX2xpc3RfdCAqbGFzdDsKLSAgZWZkcl90ICpmaWxlOwotICBwcm9jX3QgKnByb2M7Ci0gIHVuc2lnbmVkIGxvbmcgYzsKLSAgbG9uZyBpbGluZTsKLSAgbG9uZyB0b3Rjb3VudDsKLSAgbGluZW5vX2xpc3RfdCBmaXJzdDsKLSAgbGluZW5vX2xpc3RfdCAqbG9jYWxfZmlyc3RfbGluZW5vID0gZmlyc3RfbGluZW5vOwotCi0gIGlmIChsaW5lY250cHRyICE9IChsb25nICopIE5VTEwpCi0gICAgKmxpbmVjbnRwdHIgPSAwOwotCi0gIGJ1ZnB0ciA9ICpidWYgKyBvZmZzZXQ7Ci0KLSAgZmlsZSA9IChlZmRyX3QgKikgTlVMTDsKLSAgcHJvYyA9IChwcm9jX3QgKikgTlVMTDsKLSAgbGFzdCA9IChsaW5lbm9fbGlzdF90ICopIE5VTEw7Ci0gIGMgPSBvZmZzZXQ7Ci0gIGlsaW5lID0gMDsKLSAgdG90Y291bnQgPSAwOwotCi0gIC8qIEZvciBzb21lIHJlYXNvbiB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcHJvY2VkdXJlIGlzIGlnbm9yZWQKLSAgICAgd2hlbiByZWFkaW5nIGxpbmUgbnVtYmVycy4gIFRoaXMgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIGZpcnN0IHByb2NlZHVyZSBpcyAwLCBidXQgd2hlbiBnY2MgaXMgZ2VuZXJhdGluZyBNSVBTCi0gICAgIGVtYmVkZGVkIFBJQyBjb2RlLCBpdCB3aWxsIHB1dCBzdHJpbmdzIGluIHRoZSAudGV4dCBzZWN0aW9uCi0gICAgIGJlZm9yZSB0aGUgZmlyc3QgcHJvY2VkdXJlLiAgV2UgY29wZSBieSBpbnNlcnRpbmcgYSBkdW1teSBsaW5lIGlmCi0gICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBwcm9jZWR1cmUgaXMgbm90IDAuICBIb3BlZnVsbHkgdGhpcwotICAgICB3b24ndCBzY3JldyB0aGluZ3MgdXAgdG9vIGJhZGx5LiAgCi0KLSAgICAgRG9uJ3QgZG8gdGhpcyBmb3IgRUNPRkYgYXNzZW1ibHkgc291cmNlIGxpbmUgbnVtYmVycy4gIFRoZXkgd29yawotICAgICB3aXRob3V0IHRoaXMgZXh0cmEgYXR0ZW50aW9uLiAgKi8KLSAgaWYgKGRlYnVnX3R5cGUgIT0gREVCVUdfRUNPRkYKLSAgICAgICYmIGZpcnN0X3Byb2NfcHRyICE9IChwcm9jX3QgKikgTlVMTAotICAgICAgJiYgbG9jYWxfZmlyc3RfbGluZW5vICE9IChsaW5lbm9fbGlzdF90ICopIE5VTEwKLSAgICAgICYmICgoU19HRVRfVkFMVUUgKGZpcnN0X3Byb2NfcHRyLT5zeW0tPmFzX3N5bSkKLQkgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwKLQkJCQkgIFNfR0VUX1NFR01FTlQgKGZpcnN0X3Byb2NfcHRyLT5zeW0tPmFzX3N5bSkpKQotCSAgIT0gMCkpCi0gICAgewotICAgICAgZmlyc3QuZmlsZSA9IGxvY2FsX2ZpcnN0X2xpbmVuby0+ZmlsZTsKLSAgICAgIGZpcnN0LnByb2MgPSBsb2NhbF9maXJzdF9saW5lbm8tPnByb2M7Ci0gICAgICBmaXJzdC5mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotICAgICAgZmlyc3QucGFkZHIgPSAwOwotICAgICAgZmlyc3QubGluZW5vID0gMDsKLQotICAgICAgZmlyc3QubmV4dCA9IGxvY2FsX2ZpcnN0X2xpbmVubzsKLSAgICAgIGxvY2FsX2ZpcnN0X2xpbmVubyA9ICZmaXJzdDsKLSAgICB9Ci0KLSAgZm9yIChsID0gbG9jYWxfZmlyc3RfbGluZW5vOyBsICE9IChsaW5lbm9fbGlzdF90ICopIE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGxvbmcgY291bnQ7Ci0gICAgICBsb25nIGRlbHRhOwotCi0gICAgICAvKiBHZXQgdGhlIG9mZnNldCB0byB0aGUgbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIG5leHQgbGluZSBudW1iZXIKLQkgKGluIHdvcmRzKS4gIERvIHRoaXMgZmlyc3QsIHNvIHRoYXQgd2UgY2FuIHNraXAgYWhlYWQgdG8gdGhlCi0JIG5leHQgdXNlZnVsIGxpbmUgbnVtYmVyIGVudHJ5LiAgKi8KLSAgICAgIGlmIChsLT5uZXh0ID09IChsaW5lbm9fbGlzdF90ICopIE5VTEwpCi0JewotCSAgLyogV2Ugd2FudCBhIGNvdW50IG9mIHplcm8sIGJ1dCBpdCB3aWxsIGJlIGRlY3JlbWVudGVkCi0JICAgICBiZWZvcmUgaXQgaXMgdXNlZC4gICovCi0JICBjb3VudCA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAobC0+bmV4dC0+ZnJhZy0+ZnJfYWRkcmVzcyArIGwtPm5leHQtPnBhZGRyCi0JICAgICAgID4gbC0+ZnJhZy0+ZnJfYWRkcmVzcyArIGwtPnBhZGRyKQotCXsKLQkgIGNvdW50ID0gKChsLT5uZXh0LT5mcmFnLT5mcl9hZGRyZXNzICsgbC0+bmV4dC0+cGFkZHIKLQkJICAgIC0gKGwtPmZyYWctPmZyX2FkZHJlc3MgKyBsLT5wYWRkcikpCi0JCSAgID4+IDIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEb24ndCBjaGFuZ2UgbGFzdCwgc28gd2Ugc3RpbGwgZ2V0IHRoZSByaWdodCBkZWx0YS4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChsLT5maWxlICE9IGZpbGUgfHwgbC0+cHJvYyAhPSBwcm9jKQotCXsKLQkgIGlmIChsLT5wcm9jICE9IHByb2MgJiYgcHJvYyAhPSAocHJvY190ICopIE5VTEwpCi0JICAgIHByb2MtPnBkci5sbkhpZ2ggPSBsYXN0LT5saW5lbm87Ci0JICBpZiAobC0+ZmlsZSAhPSBmaWxlICYmIGZpbGUgIT0gKGVmZHJfdCAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgZmlsZS0+ZmRyLmNiTGluZSA9IGMgLSBmaWxlLT5mZHIuY2JMaW5lT2Zmc2V0OwotCSAgICAgIGZpbGUtPmZkci5jbGluZSA9IHRvdGNvdW50ICsgY291bnQ7Ci0JICAgICAgaWYgKGxpbmVjbnRwdHIgIT0gKGxvbmcgKikgTlVMTCkKLQkJKmxpbmVjbnRwdHIgKz0gdG90Y291bnQgKyBjb3VudDsKLQkgICAgICB0b3Rjb3VudCA9IDA7Ci0JICAgIH0KLQotCSAgaWYgKGwtPmZpbGUgIT0gZmlsZSkKLQkgICAgewotCSAgICAgIGVmZHJfdCAqbGFzdF9maWxlID0gZmlsZTsKLQotCSAgICAgIGZpbGUgPSBsLT5maWxlOwotCSAgICAgIGlmIChsYXN0X2ZpbGUgIT0gKGVmZHJfdCAqKSBOVUxMKQotCQlmaWxlLT5mZHIuaWxpbmVCYXNlCi0JCSAgPSBsYXN0X2ZpbGUtPmZkci5pbGluZUJhc2UgKyBsYXN0X2ZpbGUtPmZkci5jbGluZTsKLQkgICAgICBlbHNlCi0JCWZpbGUtPmZkci5pbGluZUJhc2UgPSAwOwotCSAgICAgIGZpbGUtPmZkci5jYkxpbmVPZmZzZXQgPSBjOwotCSAgICB9Ci0JICBpZiAobC0+cHJvYyAhPSBwcm9jKQotCSAgICB7Ci0JICAgICAgcHJvYyA9IGwtPnByb2M7Ci0JICAgICAgaWYgKHByb2MgIT0gKHByb2NfdCAqKSBOVUxMKQotCQl7Ci0JCSAgcHJvYy0+cGRyLmxuTG93ID0gbC0+bGluZW5vOwotCQkgIHByb2MtPnBkci5jYkxpbmVPZmZzZXQgPSBjIC0gZmlsZS0+ZmRyLmNiTGluZU9mZnNldDsKLQkJICBwcm9jLT5wZHIuaWxpbmUgPSB0b3Rjb3VudDsKLQkJfQotCSAgICB9Ci0KLQkgIGxhc3QgPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOwotCX0KLQotICAgICAgdG90Y291bnQgKz0gY291bnQ7Ci0KLSAgICAgIC8qIEdldCB0aGUgb2Zmc2V0IHRvIHRoaXMgbGluZSBudW1iZXIuICAqLwotICAgICAgaWYgKGxhc3QgPT0gKGxpbmVub19saXN0X3QgKikgTlVMTCkKLQlkZWx0YSA9IDA7Ci0gICAgICBlbHNlCi0JZGVsdGEgPSBsLT5saW5lbm8gLSBsYXN0LT5saW5lbm87Ci0KLSAgICAgIC8qIFB1dCBpbiB0aGUgb2Zmc2V0IHRvIHRoaXMgbGluZSBudW1iZXIuICAqLwotICAgICAgd2hpbGUgKGRlbHRhICE9IDApCi0JewotCSAgaW50IHNldGNvdW50OwotCi0JICAvKiAxIGlzIGFkZGVkIHRvIGVhY2ggY291bnQgcmVhZC4gICovCi0JICAtLWNvdW50OwotCSAgLyogV2UgY2FuIG9ubHkgYWRqdXN0IHRoZSB3b3JkIGNvdW50IGJ5IHVwIHRvIDE1IHdvcmRzIGF0IGEKLQkgICAgIHRpbWUuICAqLwotCSAgaWYgKGNvdW50IDw9IDB4MGYpCi0JICAgIHsKLQkgICAgICBzZXRjb3VudCA9IGNvdW50OwotCSAgICAgIGNvdW50ID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2V0Y291bnQgPSAweDBmOwotCSAgICAgIGNvdW50IC09IDB4MGY7Ci0JICAgIH0KLQkgIGlmIChkZWx0YSA+PSAtNyAmJiBkZWx0YSA8PSA3KQotCSAgICB7Ci0JICAgICAgaWYgKGJ1ZnB0ciA+PSAqYnVmZW5kKQotCQlidWZwdHIgPSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCBidWZwdHIsIChsb25nKSAxKTsKLQkgICAgICAqYnVmcHRyKysgPSBzZXRjb3VudCArIChkZWx0YSA8PCA0KTsKLQkgICAgICBkZWx0YSA9IDA7Ci0JICAgICAgKytjOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgc2V0OwotCi0JICAgICAgaWYgKCpidWZlbmQgLSBidWZwdHIgPCAzKQotCQlidWZwdHIgPSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCBidWZwdHIsIChsb25nKSAzKTsKLQkgICAgICAqYnVmcHRyKysgPSBzZXRjb3VudCArICg4IDw8IDQpOwotCSAgICAgIGlmIChkZWx0YSA8IC0weDgwMDApCi0JCXsKLQkJICBzZXQgPSAtMHg4MDAwOwotCQkgIGRlbHRhICs9IDB4ODAwMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGRlbHRhID4gMHg3ZmZmKQotCQl7Ci0JCSAgc2V0ID0gMHg3ZmZmOwotCQkgIGRlbHRhIC09IDB4N2ZmZjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHNldCA9IGRlbHRhOwotCQkgIGRlbHRhID0gMDsKLQkJfQotCSAgICAgICpidWZwdHIrKyA9IHNldCA+PiA4OwotCSAgICAgICpidWZwdHIrKyA9IHNldCAmIDB4ZmZmZjsKLQkgICAgICBjICs9IDM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEZpbmlzaCBhZGp1c3RpbmcgdGhlIGNvdW50LiAgKi8KLSAgICAgIHdoaWxlIChjb3VudCA+IDApCi0JewotCSAgaWYgKGJ1ZnB0ciA+PSAqYnVmZW5kKQotCSAgICBidWZwdHIgPSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCBidWZwdHIsIChsb25nKSAxKTsKLQkgIC8qIDEgaXMgYWRkZWQgdG8gZWFjaCBjb3VudCByZWFkLiAgKi8KLQkgIC0tY291bnQ7Ci0JICBpZiAoY291bnQgPiAweDBmKQotCSAgICB7Ci0JICAgICAgKmJ1ZnB0cisrID0gMHgwZjsKLQkgICAgICBjb3VudCAtPSAweDBmOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqYnVmcHRyKysgPSBjb3VudDsKLQkgICAgICBjb3VudCA9IDA7Ci0JICAgIH0KLQkgICsrYzsKLQl9Ci0KLSAgICAgICsraWxpbmU7Ci0gICAgICBsYXN0ID0gbDsKLSAgICB9Ci0KLSAgaWYgKHByb2MgIT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHByb2MtPnBkci5sbkhpZ2ggPSBsYXN0LT5saW5lbm87Ci0gIGlmIChmaWxlICE9IChlZmRyX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBmaWxlLT5mZHIuY2JMaW5lID0gYyAtIGZpbGUtPmZkci5jYkxpbmVPZmZzZXQ7Ci0gICAgICBmaWxlLT5mZHIuY2xpbmUgPSB0b3Rjb3VudDsKLSAgICB9Ci0KLSAgaWYgKGxpbmVjbnRwdHIgIT0gKGxvbmcgKikgTlVMTCkKLSAgICAqbGluZWNudHB0ciArPSB0b3Rjb3VudDsKLQotICBjID0gZWNvZmZfcGFkZGluZ19hZGp1c3QgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBjLCAmYnVmcHRyKTsKLQotICByZXR1cm4gYzsKLX0KLQotLyogQnVpbGQgYW5kIHN3YXAgb3V0IHRoZSBzeW1ib2xzLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX3N5bWJvbHMgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQpCi0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLXsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX3N5bV9zaXplOwotICB2b2lkICgqIGNvbnN0IHN3YXBfc3ltX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFNZTVIgKiwgUFRSKSkKLSAgICA9IGJhY2tlbmQtPnN3YXBfc3ltX291dDsKLSAgY2hhciAqc3ltX291dDsKLSAgbG9uZyBpc3ltOwotICB2bGlua3NfdCAqZmlsZV9saW5rOwotCi0gIHN5bV9vdXQgPSAqYnVmICsgb2Zmc2V0OwotCi0gIGlzeW0gPSAwOwotCi0gIC8qIFRoZSBzeW1ib2xzIGFyZSBzdG9yZWQgYnkgZmlsZS4gICovCi0gIGZvciAoZmlsZV9saW5rID0gZmlsZV9kZXNjLmZpcnN0OwotICAgICAgIGZpbGVfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLSAgICAgICBmaWxlX2xpbmsgPSBmaWxlX2xpbmstPm5leHQpCi0gICAgewotICAgICAgaW50IGlmaWxlc3ltOwotICAgICAgaW50IGZpbF9jbnQ7Ci0gICAgICBlZmRyX3QgKmZpbF9wdHI7Ci0gICAgICBlZmRyX3QgKmZpbF9lbmQ7Ci0KLSAgICAgIGlmIChmaWxlX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX2xhc3RfcGFnZTsKLSAgICAgIGVsc2UKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfcGVyX3BhZ2U7Ci0gICAgICBmaWxfcHRyID0gZmlsZV9saW5rLT5kYXR1bS0+ZmlsZTsKLSAgICAgIGZpbF9lbmQgPSBmaWxfcHRyICsgZmlsX2NudDsKLSAgICAgIGZvciAoOyBmaWxfcHRyIDwgZmlsX2VuZDsgZmlsX3B0cisrKQotCXsKLQkgIHZsaW5rc190ICpzeW1fbGluazsKLQotCSAgZmlsX3B0ci0+ZmRyLmlzeW1CYXNlID0gaXN5bTsKLQkgIGlmaWxlc3ltID0gaXN5bTsKLQkgIGZvciAoc3ltX2xpbmsgPSBmaWxfcHRyLT5zeW1ib2xzLmZpcnN0OwotCSAgICAgICBzeW1fbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLQkgICAgICAgc3ltX2xpbmsgPSBzeW1fbGluay0+bmV4dCkKLQkgICAgewotCSAgICAgIGludCBzeW1fY250OwotCSAgICAgIGxvY2Fsc3ltX3QgKnN5bV9wdHI7Ci0JICAgICAgbG9jYWxzeW1fdCAqc3ltX2VuZDsKLQotCSAgICAgIGlmIChzeW1fbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQkJc3ltX2NudCA9IGZpbF9wdHItPnN5bWJvbHMub2JqZWN0c19sYXN0X3BhZ2U7Ci0JICAgICAgZWxzZQotCQlzeW1fY250ID0gZmlsX3B0ci0+c3ltYm9scy5vYmplY3RzX3Blcl9wYWdlOwotCSAgICAgIHN5bV9wdHIgPSBzeW1fbGluay0+ZGF0dW0tPnN5bTsKLQkgICAgICBzeW1fZW5kID0gc3ltX3B0ciArIHN5bV9jbnQ7Ci0JICAgICAgZm9yICg7IHN5bV9wdHIgPCBzeW1fZW5kOyBzeW1fcHRyKyspCi0JCXsKLQkJICBpbnQgbG9jYWw7Ci0JCSAgc3ltYm9sUyAqYXNfc3ltOwotCQkgIGZvcndhcmRfdCAqZjsKLQotCQkgIGtub3cgKHN5bV9wdHItPmZpbGVfcHRyID09IGZpbF9wdHIpOwotCi0JCSAgLyogSWYgdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCBnYXMgc3ltYm9sLCB0aGVuIHRoaXMKLQkJICAgICBpcyBhIHB1cmUgZGVidWdnaW5nIHN5bWJvbC4gIFdlIGhhdmUgYWxyZWFkeQotCQkgICAgIGFkZGVkIHRoZSBuYW1lIChpZiBhbnkpIHRvIGZpbF9wdHItPnN0cmluZ3MuCi0JCSAgICAgT3RoZXJ3aXNlIHdlIG11c3QgZGVjaWRlIHdoZXRoZXIgdGhpcyBpcyBhbgotCQkgICAgIGV4dGVybmFsIG9yIGEgbG9jYWwgc3ltYm9sIChhY3R1YWxseSwgaXQgbWF5IGJlCi0JCSAgICAgYm90aCBpZiB0aGUgbG9jYWwgcHJvdmlkZXMgYWRkaXRpb25hbCBkZWJ1Z2dpbmcKLQkJICAgICBpbmZvcm1hdGlvbiBmb3IgdGhlIGV4dGVybmFsKS4gICovCi0JCSAgbG9jYWwgPSAxOwotCQkgIGFzX3N5bSA9IHN5bV9wdHItPmFzX3N5bTsKLQkJICBpZiAoYXNfc3ltICE9IChzeW1ib2xTICopIE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHN5bWludF90IGluZHg7Ci0KLQkJICAgICAgLyogVGhlIHZhbHVlIG9mIGEgYmxvY2sgc3RhcnQgc3ltYm9sIGlzIHRoZQotCQkJIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcHJvY2VkdXJlLiAgRm9yCi0JCQkgb3RoZXIgc3ltYm9scyB3ZSBqdXN0IHVzZSB0aGUgZ2FzIHZhbHVlIChidXQKLQkJCSB3ZSBtdXN0IG9mZnNldCBpdCBieSB0aGUgdm1hIG9mIHRoZSBzZWN0aW9uLAotCQkJIGp1c3QgYXMgQkZEIGRvZXMsIGJlY2F1c2UgQkZEIHdpbGwgbm90IHNlZQotCQkJIHRoaXMgdmFsdWUpLiAgKi8KLQkJICAgICAgaWYgKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID09IChpbnQpIHN0X0Jsb2NrCi0JCQkgICYmIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnNjID09IChpbnQpIHNjX1RleHQpCi0JCQl7Ci0JCQkgIHN5bWJvbFMgKmJlZ2luX3N5bTsKLQotCQkJICBrbm93IChzeW1fcHRyLT5wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwpOwotCQkJICBiZWdpbl9zeW0gPSBzeW1fcHRyLT5wcm9jX3B0ci0+c3ltLT5hc19zeW07Ci0JCQkgIGlmIChTX0dFVF9TRUdNRU5UIChhc19zeW0pCi0JCQkgICAgICAhPSBTX0dFVF9TRUdNRU5UIChiZWdpbl9zeW0pKQotCQkJICAgIGFzX3dhcm4gKF8oIi5iZWdpbi8uYmVuZCBpbiBkaWZmZXJlbnQgc2VnbWVudHMiKSk7Ci0JCQkgIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlID0KLQkJCSAgICBTX0dFVF9WQUxVRSAoYXNfc3ltKSAtIFNfR0VUX1ZBTFVFIChiZWdpbl9zeW0pOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQlzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9Ci0JCQkgIChTX0dFVF9WQUxVRSAoYXNfc3ltKQotCQkJICAgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsCi0JCQkJCQkgIFNfR0VUX1NFR01FTlQgKGFzX3N5bSkpCi0JCQkgICArIHN5bV9wdHItPmFkZGVuZCk7Ci0KLQkJICAgICAgc3ltX3B0ci0+ZWNvZmZfc3ltLndlYWtleHQgPSBTX0lTX1dFQUsgKGFzX3N5bSk7Ci0KLQkJICAgICAgLyogU2V0IHN0X1Byb2MgdG8gc3RfU3RhdGljUHJvYyBmb3IgbG9jYWwKLQkJCSBmdW5jdGlvbnMuICAqLwotCQkgICAgICBpZiAoc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgPT0gc3RfUHJvYwotCQkJICAmJiBTX0lTX0RFRklORUQgKGFzX3N5bSkKLQkJCSAgJiYgISBTX0lTX0VYVEVSTkFMIChhc19zeW0pCi0JCQkgICYmICEgU19JU19XRUFLIChhc19zeW0pKQotCQkJc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgPSBzdF9TdGF0aWNQcm9jOwotCi0JCSAgICAgIC8qIEdldCB0aGUgdHlwZSBhbmQgc3RvcmFnZSBjbGFzcyBiYXNlZCBvbiB3aGVyZQotCQkJIHRoZSBzeW1ib2wgYWN0dWFsbHkgd291bmQgdXAuICBUcmFkaXRpb25hbGx5LAotCQkJIE5fTEJSQUMgYW5kIE5fUkJSQUMgYXJlICpub3QqIHJlbG9jYXRlZC4gKi8KLQkJICAgICAgaW5keCA9IHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLmluZGV4OwotCQkgICAgICBpZiAoc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgPT0gc3RfTmlsCi0JCQkgICYmIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnNjID09IHNjX05pbAotCQkJICAmJiAoISBFQ09GRl9JU19TVEFCICgmc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0pCi0JCQkgICAgICB8fCAoKEVDT0ZGX1VOTUFSS19TVEFCIChpbmR4KSAhPSBOX0xCUkFDKQotCQkJCSAgJiYgKEVDT0ZGX1VOTUFSS19TVEFCIChpbmR4KSAhPSBOX1JCUkFDKSkpKQotCQkJewotCQkJICBzZWdUIHNlZzsKLQkJCSAgY29uc3QgY2hhciAqc2VnbmFtZTsKLQkJCSAgc3RfdCBzdDsKLQkJCSAgc2NfdCBzYzsKLQotCQkJICBzZWcgPSBTX0dFVF9TRUdNRU5UIChhc19zeW0pOwotCQkJICBzZWduYW1lID0gc2VnbWVudF9uYW1lIChzZWcpOwotCi0JCQkgIGlmICghIEVDT0ZGX0lTX1NUQUIgKCZzeW1fcHRyLT5lY29mZl9zeW0uYXN5bSkKLQkJCSAgICAgICYmIChTX0lTX0VYVEVSTkFMIChhc19zeW0pCi0JCQkJICB8fCBTX0lTX1dFQUsgKGFzX3N5bSkKLQkJCQkgIHx8ICEgU19JU19ERUZJTkVEIChhc19zeW0pKSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoKHN5bWJvbF9nZXRfYmZkc3ltIChhc19zeW0pLT5mbGFncwotCQkJCSAgICYgQlNGX0ZVTkNUSU9OKSAhPSAwKQotCQkJCXN0ID0gc3RfUHJvYzsKLQkJCSAgICAgIGVsc2UKLQkJCQlzdCA9IHN0X0dsb2JhbDsKLQkJCSAgICB9Ci0JCQkgIGVsc2UgaWYgKHNlZyA9PSB0ZXh0X3NlY3Rpb24pCi0JCQkgICAgc3QgPSBzdF9MYWJlbDsKLQkJCSAgZWxzZQotCQkJICAgIHN0ID0gc3RfU3RhdGljOwotCi0JCQkgIGlmICghIFNfSVNfREVGSU5FRCAoYXNfc3ltKSkKLQkJCSAgICB7Ci0JCQkgICAgICB2YWx1ZVQgczsKLQotCQkJICAgICAgcyA9IHN5bWJvbF9nZXRfb2JqIChhc19zeW0pLT5lY29mZl9leHRlcm5fc2l6ZTsKLQkJCSAgICAgIGlmIChzID09IDAKLQkJCQkgIHx8IHMgPiBiZmRfZ2V0X2dwX3NpemUgKHN0ZG91dHB1dCkpCi0JCQkJc2MgPSBzY19VbmRlZmluZWQ7Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAgc2MgPSBzY19TVW5kZWZpbmVkOwotCQkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPSBzOwotCQkJCX0KLSNpZmRlZiBTX1NFVF9TSVpFCi0JCQkgICAgICBTX1NFVF9TSVpFIChhc19zeW0sIHMpOwotI2VuZGlmCi0JCQkgICAgfQotCQkJICBlbHNlIGlmIChTX0lTX0NPTU1PTiAoYXNfc3ltKSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoU19HRVRfVkFMVUUgKGFzX3N5bSkgPiAwCi0JCQkJICAmJiAoU19HRVRfVkFMVUUgKGFzX3N5bSkKLQkJCQkgICAgICA8PSBiZmRfZ2V0X2dwX3NpemUgKHN0ZG91dHB1dCkpKQotCQkJCXNjID0gc2NfU0NvbW1vbjsKLQkJCSAgICAgIGVsc2UKLQkJCQlzYyA9IHNjX0NvbW1vbjsKLQkJCSAgICB9Ci0JCQkgIGVsc2UgaWYgKHNlZyA9PSB0ZXh0X3NlY3Rpb24pCi0JCQkgICAgc2MgPSBzY19UZXh0OwotCQkJICBlbHNlIGlmIChzZWcgPT0gZGF0YV9zZWN0aW9uKQotCQkJICAgIHNjID0gc2NfRGF0YTsKLQkJCSAgZWxzZSBpZiAoc3RyY21wIChzZWduYW1lLCAiLnJkYXRhIikgPT0gMAotCQkJCSAgIHx8IHN0cmNtcCAoc2VnbmFtZSwgIi5yb2RhdGEiKSA9PSAwKQotCQkJICAgIHNjID0gc2NfUkRhdGE7Ci0JCQkgIGVsc2UgaWYgKHN0cmNtcCAoc2VnbmFtZSwgIi5zZGF0YSIpID09IDApCi0JCQkgICAgc2MgPSBzY19TRGF0YTsKLQkJCSAgZWxzZSBpZiAoc2VnID09IGJzc19zZWN0aW9uKQotCQkJICAgIHNjID0gc2NfQnNzOwotCQkJICBlbHNlIGlmIChzdHJjbXAgKHNlZ25hbWUsICIuc2JzcyIpID09IDApCi0JCQkgICAgc2MgPSBzY19TQnNzOwotCQkJICBlbHNlIGlmIChzZWcgPT0gJmJmZF9hYnNfc2VjdGlvbikKLQkJCSAgICBzYyA9IHNjX0FiczsKLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIC8qIFRoaXMgbXVzdCBiZSBhIHVzZXIgbmFtZWQgc2VjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgbm90IHBvc3NpYmxlIGluIEVDT0ZGLCBidXQgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluIEVMRi4gICovCi0JCQkgICAgICBzYyA9IHNjX0RhdGE7Ci0JCQkgICAgfQotCi0JCQkgIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID0gKGludCkgc3Q7Ci0JCQkgIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnNjID0gKGludCkgc2M7Ci0JCQl9Ci0KLQkJICAgICAgLyogVGhpcyBpcyBqdXN0IGFuIGV4dGVybmFsIHN5bWJvbCBpZiBpdCBpcwotCQkJIG91dHNpZGUgYSBwcm9jZWR1cmUgYW5kIGl0IGhhcyBhIHR5cGUuCi0JCQkgRklYTUU6IGcrKyB3aWxsIGdlbmVyYXRlIHN5bWJvbHMgd2hpY2ggaGF2ZQotCQkJIGRpZmZlcmVudCBuYW1lcyBpbiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0JCQkgdGhhbiB0aGUgYWN0dWFsIHN5bWJvbC4gIFNob3VsZCB3ZSBoYW5kbGUKLQkJCSB0aGVtIGhlcmU/ICAqLwotCQkgICAgICBpZiAoKFNfSVNfRVhURVJOQUwgKGFzX3N5bSkKLQkJCSAgIHx8IFNfSVNfV0VBSyAoYXNfc3ltKQotCQkJICAgfHwgISBTX0lTX0RFRklORUQgKGFzX3N5bSkpCi0JCQkgICYmIHN5bV9wdHItPnByb2NfcHRyID09IChwcm9jX3QgKikgTlVMTAotCQkJICAmJiBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCAhPSAoaW50KSBzdF9OaWwKLQkJCSAgJiYgISBFQ09GRl9JU19TVEFCICgmc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0pKQotCQkJbG9jYWwgPSAwOwotCi0JCSAgICAgIC8qIFRoaXMgaXMganVzdCBhbiBleHRlcm5hbCBzeW1ib2wgaWYgaXQgaXMgYQotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbiBzeW1ib2wuICAqLwotCQkgICAgICBpZiAoU19JU19DT01NT04gKGFzX3N5bSkpCi0JCQlsb2NhbCA9IDA7Ci0KLQkJICAgICAgLyogSWYgYW4gc3RfZW5kIHN5bWJvbCBoYXMgYW4gYXNzb2NpYXRlZCBnYXMKLQkJCSBzeW1ib2wsIHRoZW4gaXQgaXMgYSBsb2NhbCBsYWJlbCBjcmVhdGVkIGZvcgotCQkJIGEgLmJlbmQgb3IgLmVuZCBkaXJlY3RpdmUuICBTdGFicyBsaW5lCi0JCQkgbnVtYmVycyB3aWxsIGhhdmUgXDAwMSBpbiB0aGUgbmFtZXMuICAqLwotCQkgICAgICBpZiAobG9jYWwKLQkJCSAgJiYgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgIT0gc3RfRW5kCi0JCQkgICYmIHN0cmNociAoc3ltX3B0ci0+bmFtZSwgJ1wwMDEnKSA9PSAwKQotCQkJc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaXNzID0KLQkJCSAgYWRkX3N0cmluZyAoJmZpbF9wdHItPnN0cmluZ3MsCi0JCQkJICAgICAgZmlsX3B0ci0+c3RyX2hhc2gsCi0JCQkJICAgICAgc3ltX3B0ci0+bmFtZSwKLQkJCQkgICAgICAoc2hhc2hfdCAqKikgTlVMTCk7Ci0JCSAgICB9Ci0KLQkJICAvKiBXZSBub3cga25vdyB0aGUgaW5kZXggb2YgdGhpcyBzeW1ib2w7IGZpbGwgaW4KLQkJICAgICBsb2NhdGlvbnMgdGhhdCBoYXZlIGJlZW4gd2FpdGluZyBmb3IgdGhhdAotCQkgICAgIGluZm9ybWF0aW9uLiAgKi8KLQkJICBpZiAoc3ltX3B0ci0+YmVnaW5fcHRyICE9IChsb2NhbHN5bV90ICopIE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGxvY2Fsc3ltX3QgKmJlZ2luX3B0cjsKLQkJICAgICAgc3RfdCBiZWdpbl90eXBlOwotCi0JCSAgICAgIGtub3cgKGxvY2FsKTsKLQkJICAgICAgYmVnaW5fcHRyID0gc3ltX3B0ci0+YmVnaW5fcHRyOwotCQkgICAgICBrbm93IChiZWdpbl9wdHItPnN5bV9pbmRleCAhPSAtMSk7Ci0JCSAgICAgIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLmluZGV4ID0gYmVnaW5fcHRyLT5zeW1faW5kZXg7Ci0JCSAgICAgIGlmIChzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zYyAhPSAoaW50KSBzY19JbmZvKQotCQkJc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaXNzID0KLQkJCSAgYmVnaW5fcHRyLT5lY29mZl9zeW0uYXN5bS5pc3M7Ci0KLQkJICAgICAgYmVnaW5fdHlwZSA9IGJlZ2luX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3Q7Ci0JCSAgICAgIGlmIChiZWdpbl90eXBlID09IHN0X0ZpbGUKLQkJCSAgfHwgYmVnaW5fdHlwZSA9PSBzdF9CbG9jaykKLQkJCXsKLQkJCSAgYmVnaW5fcHRyLT5lY29mZl9zeW0uYXN5bS5pbmRleCA9Ci0JCQkgICAgaXN5bSAtIGlmaWxlc3ltICsgMTsKLQkJCSAgKCpzd2FwX3N5bV9vdXQpIChzdGRvdXRwdXQsCi0JCQkJCSAgICZiZWdpbl9wdHItPmVjb2ZmX3N5bS5hc3ltLAotCQkJCQkgICAoKmJ1ZgotCQkJCQkgICAgKyBvZmZzZXQKLQkJCQkJICAgICsgKGJlZ2luX3B0ci0+c3ltX2luZGV4Ci0JCQkJCSAgICAgICAqIGV4dGVybmFsX3N5bV9zaXplKSkpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGtub3cgKGJlZ2luX3B0ci0+aW5kZXhfcHRyICE9IChhdXhfdCAqKSBOVUxMKTsKLQkJCSAgYmVnaW5fcHRyLT5pbmRleF9wdHItPmRhdGEuaXN5bSA9Ci0JCQkgICAgaXN5bSAtIGlmaWxlc3ltICsgMTsKLQkJCX0KLQotCQkgICAgICAvKiBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBtYXJraW5nIHRoZSBlbmQgb2YgYQotCQkJIHByb2NlZHVyZSBpcyB0aGUgc2l6ZSBvZiB0aGUgcHJvY2VkdXJlLiAgVGhlCi0JCQkgdmFsdWUgb2YgdGhlIHN5bWJvbCBtYXJraW5nIHRoZSBlbmQgb2YgYQotCQkJIGJsb2NrIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCi0JCQkgcHJvY2VkdXJlIHRvIHRoZSBibG9jay4gICovCi0JCSAgICAgIGlmIChiZWdpbl90eXBlID09IHN0X1Byb2MKLQkJCSAgfHwgYmVnaW5fdHlwZSA9PSBzdF9TdGF0aWNQcm9jKQotCQkJewotCQkJICBrbm93IChhc19zeW0gIT0gKHN5bWJvbFMgKikgTlVMTCk7Ci0JCQkgIGtub3cgKGJlZ2luX3B0ci0+YXNfc3ltICE9IChzeW1ib2xTICopIE5VTEwpOwotCQkJICBpZiAoU19HRVRfU0VHTUVOVCAoYXNfc3ltKQotCQkJICAgICAgIT0gU19HRVRfU0VHTUVOVCAoYmVnaW5fcHRyLT5hc19zeW0pKQotCQkJICAgIGFzX3dhcm4gKF8oIi5iZWdpbi8uYmVuZCBpbiBkaWZmZXJlbnQgc2VnbWVudHMiKSk7Ci0JCQkgIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlID0KLQkJCSAgICAoU19HRVRfVkFMVUUgKGFzX3N5bSkKLQkJCSAgICAgLSBTX0dFVF9WQUxVRSAoYmVnaW5fcHRyLT5hc19zeW0pKTsKLQotCQkJICAvKiBJZiB0aGUgc2l6ZSBpcyBvZGQsIHRoaXMgaXMgcHJvYmFibHkgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXBzMTYgZnVuY3Rpb247IGZvcmNlIGl0IHRvIGJlIGV2ZW4uICAqLwotCQkJICBpZiAoKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlICYgMSkgIT0gMCkKLQkJCSAgICArK3N5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlOwotCi0jaWZkZWYgU19TRVRfU0laRQotCQkJICBTX1NFVF9TSVpFIChiZWdpbl9wdHItPmFzX3N5bSwKLQkJCQkgICAgICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSk7Ci0jZW5kaWYKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoYmVnaW5fdHlwZSA9PSBzdF9CbG9jawotCQkJICAgICAgICYmIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnNjICE9IChpbnQpIHNjX0luZm8pCi0JCQl7Ci0JCQkgIHN5bWJvbFMgKmJlZ2luX3N5bTsKLQotCQkJICBrbm93IChhc19zeW0gIT0gKHN5bWJvbFMgKikgTlVMTCk7Ci0JCQkgIGtub3cgKHN5bV9wdHItPnByb2NfcHRyICE9IChwcm9jX3QgKikgTlVMTCk7Ci0JCQkgIGJlZ2luX3N5bSA9IHN5bV9wdHItPnByb2NfcHRyLT5zeW0tPmFzX3N5bTsKLQkJCSAgaWYgKFNfR0VUX1NFR01FTlQgKGFzX3N5bSkKLQkJCSAgICAgICE9IFNfR0VUX1NFR01FTlQgKGJlZ2luX3N5bSkpCi0JCQkgICAgYXNfd2FybiAoXygiLmJlZ2luLy5iZW5kIGluIGRpZmZlcmVudCBzZWdtZW50cyIpKTsKLQkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPQotCQkJICAgIFNfR0VUX1ZBTFVFIChhc19zeW0pIC0gU19HRVRfVkFMVUUgKGJlZ2luX3N5bSk7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBmb3IgKGYgPSBzeW1fcHRyLT5mb3J3YXJkX3JlZjsKLQkJICAgICAgIGYgIT0gKGZvcndhcmRfdCAqKSBOVUxMOwotCQkgICAgICAgZiA9IGYtPm5leHQpCi0JCSAgICB7Ci0JCSAgICAgIGtub3cgKGxvY2FsKTsKLQkJICAgICAgZi0+aWZkX3B0ci0+ZGF0YS5pc3ltID0gZmlsX3B0ci0+ZmlsZV9pbmRleDsKLQkJICAgICAgZi0+aW5kZXhfcHRyLT5kYXRhLnJuZHguaW5kZXggPSBpc3ltIC0gaWZpbGVzeW07Ci0JCSAgICB9Ci0KLQkJICBpZiAobG9jYWwpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgqYnVmZW5kIC0gc3ltX291dCA8IGV4dGVybmFsX3N5bV9zaXplKQotCQkJc3ltX291dCA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsCi0JCQkJCQkgICBzeW1fb3V0LAotCQkJCQkJICAgZXh0ZXJuYWxfc3ltX3NpemUpOwotCQkgICAgICAoKnN3YXBfc3ltX291dCkgKHN0ZG91dHB1dCwgJnN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLAotCQkJCSAgICAgICBzeW1fb3V0KTsKLQkJICAgICAgc3ltX291dCArPSBleHRlcm5hbF9zeW1fc2l6ZTsKLQotCQkgICAgICBzeW1fcHRyLT5zeW1faW5kZXggPSBpc3ltOwotCi0JCSAgICAgIGlmIChzeW1fcHRyLT5wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwKLQkJCSAgJiYgc3ltX3B0ci0+cHJvY19wdHItPnN5bSA9PSBzeW1fcHRyKQotCQkJc3ltX3B0ci0+cHJvY19wdHItPnBkci5pc3ltID0gaXN5bSAtIGlmaWxlc3ltOwotCi0JCSAgICAgICsraXN5bTsKLQkJICAgIH0KLQotCQkgIC8qIFJlY29yZCB0aGUgbG9jYWwgc3ltYm9sIGluZGV4IGFuZCBmaWxlIG51bWJlciBpbgotCQkgICAgIGNhc2UgdGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wuICBOb3RlIHRoYXQgdGhpcwotCQkgICAgIGRlc3Ryb3lzIHRoZSBhc3ltLmluZGV4IGZpZWxkLiAgKi8KLQkJICBpZiAoYXNfc3ltICE9IChzeW1ib2xTICopIE5VTEwKLQkJICAgICAgJiYgc3ltYm9sX2dldF9vYmogKGFzX3N5bSktPmVjb2ZmX3N5bWJvbCA9PSBzeW1fcHRyKQotCQkgICAgewotCQkgICAgICBpZiAoKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID09IHN0X1Byb2MKLQkJCSAgIHx8IHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID09IHN0X1N0YXRpY1Byb2MpCi0JCQkgICYmIGxvY2FsKQotCQkJc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBpc3ltIC0gaWZpbGVzeW0gLSAxOwotCQkgICAgICBzeW1fcHRyLT5lY29mZl9zeW0uaWZkID0gZmlsX3B0ci0+ZmlsZV9pbmRleDsKLQotCQkgICAgICAvKiBEb24ndCB0cnkgdG8gbWVyZ2UgYW4gRkRSIHdoaWNoIGhhcyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHN5bWJvbCBhdHRhY2hlZCB0byBpdC4gICovCi0JCSAgICAgIGlmIChTX0lTX0VYVEVSTkFMIChhc19zeW0pIHx8IFNfSVNfV0VBSyAoYXNfc3ltKSkKLQkJCWZpbF9wdHItPmZkci5mTWVyZ2UgPSAwOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGZpbF9wdHItPmZkci5jc3ltID0gaXN5bSAtIGZpbF9wdHItPmZkci5pc3ltQmFzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBvZmZzZXQgKyBpc3ltICogZXh0ZXJuYWxfc3ltX3NpemU7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBwcm9jZWR1cmUgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfcHJvY3MgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQpCi0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLXsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX3Bkcl9zaXplOwotICB2b2lkICgqIGNvbnN0IHN3YXBfcGRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFBEUiAqLCBQVFIpKQotICAgID0gYmFja2VuZC0+c3dhcF9wZHJfb3V0OwotICBjaGFyICpwZHJfb3V0OwotICBsb25nIGlwcm9jOwotICB2bGlua3NfdCAqZmlsZV9saW5rOwotCi0gIHBkcl9vdXQgPSAqYnVmICsgb2Zmc2V0OwotCi0gIGlwcm9jID0gMDsKLQotICAvKiBUaGUgcHJvY2VkdXJlcyBhcmUgc3RvcmVkIGJ5IGZpbGUuICAqLwotICBmb3IgKGZpbGVfbGluayA9IGZpbGVfZGVzYy5maXJzdDsKLSAgICAgICBmaWxlX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0gICAgICAgZmlsZV9saW5rID0gZmlsZV9saW5rLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBmaWxfY250OwotICAgICAgZWZkcl90ICpmaWxfcHRyOwotICAgICAgZWZkcl90ICpmaWxfZW5kOwotCi0gICAgICBpZiAoZmlsZV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2U7Ci0gICAgICBlbHNlCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlOwotICAgICAgZmlsX3B0ciA9IGZpbGVfbGluay0+ZGF0dW0tPmZpbGU7Ci0gICAgICBmaWxfZW5kID0gZmlsX3B0ciArIGZpbF9jbnQ7Ci0gICAgICBmb3IgKDsgZmlsX3B0ciA8IGZpbF9lbmQ7IGZpbF9wdHIrKykKLQl7Ci0JICB2bGlua3NfdCAqcHJvY19saW5rOwotCSAgaW50IGZpcnN0OwotCi0JICBmaWxfcHRyLT5mZHIuaXBkRmlyc3QgPSBpcHJvYzsKLQkgIGZpcnN0ID0gMTsKLQkgIGZvciAocHJvY19saW5rID0gZmlsX3B0ci0+cHJvY3MuZmlyc3Q7Ci0JICAgICAgIHByb2NfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLQkgICAgICAgcHJvY19saW5rID0gcHJvY19saW5rLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaW50IHByY19jbnQ7Ci0JICAgICAgcHJvY190ICpwcm9jX3B0cjsKLQkgICAgICBwcm9jX3QgKnByb2NfZW5kOwotCi0JICAgICAgaWYgKHByb2NfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQkJcHJjX2NudCA9IGZpbF9wdHItPnByb2NzLm9iamVjdHNfbGFzdF9wYWdlOwotCSAgICAgIGVsc2UKLQkJcHJjX2NudCA9IGZpbF9wdHItPnByb2NzLm9iamVjdHNfcGVyX3BhZ2U7Ci0JICAgICAgcHJvY19wdHIgPSBwcm9jX2xpbmstPmRhdHVtLT5wcm9jOwotCSAgICAgIHByb2NfZW5kID0gcHJvY19wdHIgKyBwcmNfY250OwotCSAgICAgIGZvciAoOyBwcm9jX3B0ciA8IHByb2NfZW5kOyBwcm9jX3B0cisrKQotCQl7Ci0JCSAgc3ltYm9sUyAqYWRyX3N5bTsKLQkJICB1bnNpZ25lZCBsb25nIGFkcjsKLQotCQkgIGFkcl9zeW0gPSBwcm9jX3B0ci0+c3ltLT5hc19zeW07Ci0JCSAgYWRyID0gKFNfR0VUX1ZBTFVFIChhZHJfc3ltKQotCQkJICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LAotCQkJCQkJU19HRVRfU0VHTUVOVCAoYWRyX3N5bSkpKTsKLQkJICBpZiAoZmlyc3QpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgY29kZSB1c2VkIHRvIGZvcmNlIHRoZSBhZHIgb2YgdGhlIHZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBmZHIgdG8gYmUgMC4gIEhvd2V2ZXIsIHRoZSBuYXRpdmUgdG9vbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBkbyB0aGF0LCBhbmQgSSBjYW4ndCByZW1lbWJlciB3aHkgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHdvcmsgdGhhdCB3YXksIHNvIEkgdG9vayBpdCBvdXQuICAqLwotCQkgICAgICBmaWxfcHRyLT5mZHIuYWRyID0gYWRyOwotCQkgICAgICBmaXJzdCA9IDA7Ci0JCSAgICB9Ci0JCSAgcHJvY19wdHItPnBkci5hZHIgPSBhZHIgLSBmaWxfcHRyLT5mZHIuYWRyOwotCQkgIGlmICgqYnVmZW5kIC0gcGRyX291dCA8IGV4dGVybmFsX3Bkcl9zaXplKQotCQkgICAgcGRyX291dCA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsCi0JCQkJCSAgICAgICBwZHJfb3V0LAotCQkJCQkgICAgICAgZXh0ZXJuYWxfcGRyX3NpemUpOwotCQkgICgqc3dhcF9wZHJfb3V0KSAoc3Rkb3V0cHV0LCAmcHJvY19wdHItPnBkciwgcGRyX291dCk7Ci0JCSAgcGRyX291dCArPSBleHRlcm5hbF9wZHJfc2l6ZTsKLQkJICArK2lwcm9jOwotCQl9Ci0JICAgIH0KLQkgIGZpbF9wdHItPmZkci5jcGQgPSBpcHJvYyAtIGZpbF9wdHItPmZkci5pcGRGaXJzdDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBvZmZzZXQgKyBpcHJvYyAqIGV4dGVybmFsX3Bkcl9zaXplOwotfQotCi0vKiBTd2FwIG91dCB0aGUgYXV4IGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX2F1eCAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCkKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotewotICBpbnQgYmlnZW5kaWFuOwotICB1bmlvbiBhdXhfZXh0ICphdXhfb3V0OwotICBsb25nIGlhdXg7Ci0gIHZsaW5rc190ICpmaWxlX2xpbms7Ci0KLSAgYmlnZW5kaWFuID0gYmZkX2JpZ19lbmRpYW4gKHN0ZG91dHB1dCk7Ci0KLSAgYXV4X291dCA9ICh1bmlvbiBhdXhfZXh0ICopICgqYnVmICsgb2Zmc2V0KTsKLQotICBpYXV4ID0gMDsKLQotICAvKiBUaGUgYXV4IGVudHJpZXMgYXJlIHN0b3JlZCBieSBmaWxlLiAgKi8KLSAgZm9yIChmaWxlX2xpbmsgPSBmaWxlX2Rlc2MuZmlyc3Q7Ci0gICAgICAgZmlsZV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotICAgICAgIGZpbGVfbGluayA9IGZpbGVfbGluay0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgZmlsX2NudDsKLSAgICAgIGVmZHJfdCAqZmlsX3B0cjsKLSAgICAgIGVmZHJfdCAqZmlsX2VuZDsKLQotICAgICAgaWYgKGZpbGVfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlOwotICAgICAgZWxzZQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZTsKLSAgICAgIGZpbF9wdHIgPSBmaWxlX2xpbmstPmRhdHVtLT5maWxlOwotICAgICAgZmlsX2VuZCA9IGZpbF9wdHIgKyBmaWxfY250OwotICAgICAgZm9yICg7IGZpbF9wdHIgPCBmaWxfZW5kOyBmaWxfcHRyKyspCi0JewotCSAgdmxpbmtzX3QgKmF1eF9saW5rOwotCi0JICBmaWxfcHRyLT5mZHIuZkJpZ2VuZGlhbiA9IGJpZ2VuZGlhbjsKLQkgIGZpbF9wdHItPmZkci5pYXV4QmFzZSA9IGlhdXg7Ci0JICBmb3IgKGF1eF9saW5rID0gZmlsX3B0ci0+YXV4X3N5bXMuZmlyc3Q7Ci0JICAgICAgIGF1eF9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotCSAgICAgICBhdXhfbGluayA9IGF1eF9saW5rLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaW50IGF1eF9jbnQ7Ci0JICAgICAgYXV4X3QgKmF1eF9wdHI7Ci0JICAgICAgYXV4X3QgKmF1eF9lbmQ7Ci0KLQkgICAgICBpZiAoYXV4X2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JCWF1eF9jbnQgPSBmaWxfcHRyLT5hdXhfc3ltcy5vYmplY3RzX2xhc3RfcGFnZTsKLQkgICAgICBlbHNlCi0JCWF1eF9jbnQgPSBmaWxfcHRyLT5hdXhfc3ltcy5vYmplY3RzX3Blcl9wYWdlOwotCSAgICAgIGF1eF9wdHIgPSBhdXhfbGluay0+ZGF0dW0tPmF1eDsKLQkgICAgICBhdXhfZW5kID0gYXV4X3B0ciArIGF1eF9jbnQ7Ci0JICAgICAgZm9yICg7IGF1eF9wdHIgPCBhdXhfZW5kOyBhdXhfcHRyKyspCi0JCXsKLQkJICBpZiAoKmJ1ZmVuZCAtIChjaGFyICopIGF1eF9vdXQgPCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKQotCQkgICAgYXV4X291dCA9ICgodW5pb24gYXV4X2V4dCAqKQotCQkJICAgICAgIGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsCi0JCQkJCQkoY2hhciAqKSBhdXhfb3V0LAotCQkJCQkJc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSkpOwotCQkgIHN3aXRjaCAoYXV4X3B0ci0+dHlwZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgYXV4X3RpcjoKLQkJICAgICAgKCpiYWNrZW5kLT5zd2FwX3Rpcl9vdXQpIChiaWdlbmRpYW4sCi0JCQkJCQkmYXV4X3B0ci0+ZGF0YS50aSwKLQkJCQkJCSZhdXhfb3V0LT5hX3RpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF9ybmR4OgotCQkgICAgICAoKmJhY2tlbmQtPnN3YXBfcm5keF9vdXQpIChiaWdlbmRpYW4sCi0JCQkJCQkgJmF1eF9wdHItPmRhdGEucm5keCwKLQkJCQkJCSAmYXV4X291dC0+YV9ybmR4KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF9kbkxvdzoKLQkJICAgICAgQVVYX1BVVF9ETkxPVyAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLmRuTG93LAotCQkJCSAgICAgYXV4X291dCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfZG5IaWdoOgotCQkgICAgICBBVVhfUFVUX0ROSElHSCAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLmRuSGlnaCwKLQkJCQkgICAgICBhdXhfb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF9pc3ltOgotCQkgICAgICBBVVhfUFVUX0lTWU0gKGJpZ2VuZGlhbiwgYXV4X3B0ci0+ZGF0YS5pc3ltLAotCQkJCSAgICBhdXhfb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF9pc3M6Ci0JCSAgICAgIEFVWF9QVVRfSVNTIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEuaXNzLAotCQkJCSAgIGF1eF9vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X3dpZHRoOgotCQkgICAgICBBVVhfUFVUX1dJRFRIIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEud2lkdGgsCi0JCQkJICAgICBhdXhfb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF9jb3VudDoKLQkJICAgICAgQVVYX1BVVF9DT1VOVCAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLmNvdW50LAotCQkJCSAgICAgYXV4X291dCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgKythdXhfb3V0OwotCQkgICsraWF1eDsKLQkJfQotCSAgICB9Ci0JICBmaWxfcHRyLT5mZHIuY2F1eCA9IGlhdXggLSBmaWxfcHRyLT5mZHIuaWF1eEJhc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gZWNvZmZfcGFkZGluZ19hZGp1c3QgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLAotCQkJICAgICAgIG9mZnNldCArIGlhdXggKiBzaXplb2YgKHVuaW9uIGF1eF9leHQpLAotCQkJICAgICAgIChjaGFyICoqKSBOVUxMKTsKLX0KLQotLyogQ29weSBvdXQgdGhlIHN0cmluZ3MgZnJvbSBhIHZhcnJheV90LiAgVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgIGJ5dGVzIGNvcGllZCwgcmF0aGVyIHRoYW4gdGhlIG5ldyBvZmZzZXQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfc3RyaW5ncyAoYnVmLCBidWZlbmQsIG9mZnNldCwgdnApCi0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICB2YXJyYXlfdCAqdnA7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaXN0cjsKLSAgY2hhciAqc3RyX291dDsKLSAgdmxpbmtzX3QgKnN0cl9saW5rOwotCi0gIHN0cl9vdXQgPSAqYnVmICsgb2Zmc2V0OwotCi0gIGlzdHIgPSAwOwotCi0gIGZvciAoc3RyX2xpbmsgPSB2cC0+Zmlyc3Q7Ci0gICAgICAgc3RyX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0gICAgICAgc3RyX2xpbmsgPSBzdHJfbGluay0+bmV4dCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHN0cl9jbnQ7Ci0KLSAgICAgIGlmIChzdHJfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQlzdHJfY250ID0gdnAtPm9iamVjdHNfbGFzdF9wYWdlOwotICAgICAgZWxzZQotCXN0cl9jbnQgPSB2cC0+b2JqZWN0c19wZXJfcGFnZTsKLQotICAgICAgaWYgKCpidWZlbmQgLSBzdHJfb3V0IDwgc3RyX2NudCkKLQlzdHJfb3V0ID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgc3RyX291dCwgc3RyX2NudCk7Ci0KLSAgICAgIG1lbWNweSAoc3RyX291dCwgc3RyX2xpbmstPmRhdHVtLT5ieXRlLCBzdHJfY250KTsKLSAgICAgIHN0cl9vdXQgKz0gc3RyX2NudDsKLSAgICAgIGlzdHIgKz0gc3RyX2NudDsKLSAgICB9Ci0KLSAgcmV0dXJuIGlzdHI7Ci19Ci0KLS8qIER1bXAgb3V0IHRoZSBsb2NhbCBzdHJpbmdzLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX3NzIChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0KQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci17Ci0gIGxvbmcgaXNzOwotICB2bGlua3NfdCAqZmlsZV9saW5rOwotCi0gIGlzcyA9IDA7Ci0KLSAgZm9yIChmaWxlX2xpbmsgPSBmaWxlX2Rlc2MuZmlyc3Q7Ci0gICAgICAgZmlsZV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotICAgICAgIGZpbGVfbGluayA9IGZpbGVfbGluay0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgZmlsX2NudDsKLSAgICAgIGVmZHJfdCAqZmlsX3B0cjsKLSAgICAgIGVmZHJfdCAqZmlsX2VuZDsKLQotICAgICAgaWYgKGZpbGVfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlOwotICAgICAgZWxzZQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZTsKLSAgICAgIGZpbF9wdHIgPSBmaWxlX2xpbmstPmRhdHVtLT5maWxlOwotICAgICAgZmlsX2VuZCA9IGZpbF9wdHIgKyBmaWxfY250OwotICAgICAgZm9yICg7IGZpbF9wdHIgPCBmaWxfZW5kOyBmaWxfcHRyKyspCi0JewotCSAgbG9uZyBzc19jbnQ7Ci0KLQkgIGZpbF9wdHItPmZkci5pc3NCYXNlID0gaXNzOwotCSAgc3NfY250ID0gZWNvZmZfYnVpbGRfc3RyaW5ncyAoYnVmLCBidWZlbmQsIG9mZnNldCArIGlzcywKLQkJCQkJJmZpbF9wdHItPnN0cmluZ3MpOwotCSAgZmlsX3B0ci0+ZmRyLmNiU3MgPSBzc19jbnQ7Ci0JICBpc3MgKz0gc3NfY250OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGVjb2ZmX3BhZGRpbmdfYWRqdXN0IChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0ICsgaXNzLAotCQkJICAgICAgIChjaGFyICoqKSBOVUxMKTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIGZpbGUgZGVzY3JpcHRvcnMuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfZmRyIChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0KQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9mZHJfc2l6ZTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX2Zkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBGRFIgKiwgUFRSKSkKLSAgICA9IGJhY2tlbmQtPnN3YXBfZmRyX291dDsKLSAgbG9uZyBpZmlsZTsKLSAgY2hhciAqZmRyX291dDsKLSAgdmxpbmtzX3QgKmZpbGVfbGluazsKLQotICBpZmlsZSA9IDA7Ci0KLSAgZmRyX291dCA9ICpidWYgKyBvZmZzZXQ7Ci0KLSAgZm9yIChmaWxlX2xpbmsgPSBmaWxlX2Rlc2MuZmlyc3Q7Ci0gICAgICAgZmlsZV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotICAgICAgIGZpbGVfbGluayA9IGZpbGVfbGluay0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgZmlsX2NudDsKLSAgICAgIGVmZHJfdCAqZmlsX3B0cjsKLSAgICAgIGVmZHJfdCAqZmlsX2VuZDsKLQotICAgICAgaWYgKGZpbGVfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlOwotICAgICAgZWxzZQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZTsKLSAgICAgIGZpbF9wdHIgPSBmaWxlX2xpbmstPmRhdHVtLT5maWxlOwotICAgICAgZmlsX2VuZCA9IGZpbF9wdHIgKyBmaWxfY250OwotICAgICAgZm9yICg7IGZpbF9wdHIgPCBmaWxfZW5kOyBmaWxfcHRyKyspCi0JewotCSAgaWYgKCpidWZlbmQgLSBmZHJfb3V0IDwgZXh0ZXJuYWxfZmRyX3NpemUpCi0JICAgIGZkcl9vdXQgPSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCBmZHJfb3V0LAotCQkJCSAgICAgICBleHRlcm5hbF9mZHJfc2l6ZSk7Ci0JICAoKnN3YXBfZmRyX291dCkgKHN0ZG91dHB1dCwgJmZpbF9wdHItPmZkciwgZmRyX291dCk7Ci0JICBmZHJfb3V0ICs9IGV4dGVybmFsX2Zkcl9zaXplOwotCSAgKytpZmlsZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBvZmZzZXQgKyBpZmlsZSAqIGV4dGVybmFsX2Zkcl9zaXplOwotfQotCi0vKiBTZXQgdXAgdGhlIGV4dGVybmFsIHN5bWJvbHMuICBUaGVzZSBhcmUgc3VwcG9zZWQgdG8gYmUgaGFuZGxlZCBieQotICAgdGhlIGJhY2tlbmQuICBUaGlzIHJvdXRpbmUganVzdCBnZXRzIHRoZSByaWdodCBpbmZvcm1hdGlvbiBhbmQKLSAgIGNhbGxzIGEgYmFja2VuZCBmdW5jdGlvbiB0byBkZWFsIHdpdGggaXQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc2V0dXBfZXh0ICgpCi17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bTsKLQotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IChzeW1ib2xTICopIE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfc3ltYm9sID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wsIHRoZW4gZm9yY2UgdGhlIGZpZWxkcyB0byB6ZXJvLiAgKi8KLSAgICAgIGlmICghIFNfSVNfRVhURVJOQUwgKHN5bSkKLQkgICYmICEgU19JU19XRUFLIChzeW0pCi0JICAmJiBTX0lTX0RFRklORUQgKHN5bSkpCi0JewotCSAgc3RydWN0IGxvY2Fsc3ltICpsc3ltOwotCi0JICBsc3ltID0gc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX3N5bWJvbDsKLQkgIGxzeW0tPmVjb2ZmX3N5bS5hc3ltLnZhbHVlID0gMDsKLQkgIGxzeW0tPmVjb2ZmX3N5bS5hc3ltLnN0ID0gKGludCkgc3RfTmlsOwotCSAgbHN5bS0+ZWNvZmZfc3ltLmFzeW0uc2MgPSAoaW50KSBzY19OaWw7Ci0JICBsc3ltLT5lY29mZl9zeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotCX0KLQotICAgICAgb2JqX2Vjb2ZmX3NldF9leHQgKHN5bSwgJnN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9zeW1ib2wtPmVjb2ZmX3N5bSk7Ci0gICAgfQotfQotCi0vKiBCdWlsZCB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotdW5zaWduZWQgbG9uZwotZWNvZmZfYnVpbGRfZGVidWcgKGhkciwgYnVmcCwgYmFja2VuZCkKLSAgICAgSERSUiAqaGRyOwotICAgICBjaGFyICoqYnVmcDsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcGRyX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9wZHJfc2l6ZTsKLSAgdGFnX3QgKnB0YWc7Ci0gIHRhZ190ICpwdGFnX25leHQ7Ci0gIGVmZHJfdCAqZmlsX3B0cjsKLSAgaW50IGVuZF93YXJuaW5nOwotICBlZmRyX3QgKmhvbGRfZmlsZV9wdHI7Ci0gIHByb2NfdCAqIGhvbGRfcHJvY19wdHI7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgY2hhciAqYnVmOwotICBjaGFyICpidWZlbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZmlsZS4gICovCi0gIGlmIChmaXJzdF9maWxlID09IChlZmRyX3QgKikgTlVMTCkKLSAgICBhZGRfZmlsZSAoKGNvbnN0IGNoYXIgKikgTlVMTCwgMCwgMSk7Ci0KLSAgLyogSGFuZGxlIGFueSB0b3AgbGV2ZWwgdGFncy4gICovCi0gIGZvciAocHRhZyA9IHRvcF90YWdfaGVhZC0+Zmlyc3RfdGFnOwotICAgICAgIHB0YWcgIT0gKHRhZ190ICopIE5VTEw7Ci0gICAgICAgcHRhZyA9IHB0YWdfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAocHRhZy0+Zm9yd2FyZF9yZWYgIT0gKGZvcndhcmRfdCAqKSBOVUxMKQotCWFkZF91bmtub3duX3RhZyAocHRhZyk7Ci0KLSAgICAgIHB0YWdfbmV4dCA9IHB0YWctPnNhbWVfYmxvY2s7Ci0gICAgICBwdGFnLT5oYXNoX3B0ci0+dGFnX3B0ciA9IHB0YWctPnNhbWVfbmFtZTsKLSAgICAgIGZyZWVfdGFnIChwdGFnKTsKLSAgICB9Ci0KLSAgZnJlZV90aGVhZCAodG9wX3RhZ19oZWFkKTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHN5bWJvbHMuICBBZGQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBlYWNoCi0gICAgIHN5bWJvbCB0aGF0IGhhcyBub3QgYWxyZWFkeSByZWNlaXZlZCBpdC4gICovCi0gIGhvbGRfZmlsZV9wdHIgPSBjdXJfZmlsZV9wdHI7Ci0gIGhvbGRfcHJvY19wdHIgPSBjdXJfcHJvY19wdHI7Ci0gIGN1cl9wcm9jX3B0ciA9IChwcm9jX3QgKikgTlVMTDsKLSAgZm9yIChzeW0gPSBzeW1ib2xfcm9vdFA7IHN5bSAhPSAoc3ltYm9sUyAqKSBOVUxMOyBzeW0gPSBzeW1ib2xfbmV4dCAoc3ltKSkKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX3N5bWJvbCAhPSBOVUxMCi0JICB8fCBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfZmlsZSA9PSAoZWZkcl90ICopIE5VTEwKLQkgIHx8IChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIGN1cl9maWxlX3B0ciA9IHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9maWxlOwotICAgICAgYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwgc3RfTmlsLCBzY19OaWwsIHN5bSwKLQkJCShiZmRfdm1hKSAwLCBTX0dFVF9WQUxVRSAoc3ltKSwgaW5kZXhOaWwpOwotICAgIH0KLSAgY3VyX3Byb2NfcHRyID0gaG9sZF9wcm9jX3B0cjsKLSAgY3VyX2ZpbGVfcHRyID0gaG9sZF9maWxlX3B0cjsKLQotICAvKiBPdXRwdXQgYW4gZW5kaW5nIHN5bWJvbCBmb3IgYWxsIHRoZSBmaWxlcy4gIFdlIGhhdmUgdG8gZG8gdGhpcwotICAgICBoZXJlIGZvciB0aGUgbGFzdCBmaWxlLCBzbyB3ZSBtYXkgYXMgd2VsbCBkbyBpdCBmb3IgYWxsIG9mIHRoZQotICAgICBmaWxlcy4gICovCi0gIGVuZF93YXJuaW5nID0gMDsKLSAgZm9yIChmaWxfcHRyID0gZmlyc3RfZmlsZTsKLSAgICAgICBmaWxfcHRyICE9IChlZmRyX3QgKikgTlVMTDsKLSAgICAgICBmaWxfcHRyID0gZmlsX3B0ci0+bmV4dF9maWxlKQotICAgIHsKLSAgICAgIGN1cl9maWxlX3B0ciA9IGZpbF9wdHI7Ci0gICAgICB3aGlsZSAoY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUgIT0gKHNjb3BlX3QgKikgTlVMTAotCSAgICAgJiYgY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUtPnByZXYgIT0gKHNjb3BlX3QgKikgTlVMTCkKLQl7Ci0JICBjdXJfZmlsZV9wdHItPmN1cl9zY29wZSA9IGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlLT5wcmV2OwotCSAgaWYgKCEgZW5kX3dhcm5pbmcgJiYgISBjdXJfZmlsZV9wdHItPmZha2UpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJNaXNzaW5nIC5lbmQgb3IgLmJlbmQgYXQgZW5kIG9mIGZpbGUiKSk7Ci0JICAgICAgZW5kX3dhcm5pbmcgPSAxOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlICE9IChzY29wZV90ICopIE5VTEwpCi0JKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJIHN0X0VuZCwgc2NfVGV4dCwKLQkJCQkgKHN5bWJvbFMgKikgTlVMTCwKLQkJCQkgKGJmZF92bWEpIDAsCi0JCQkJIChzeW1pbnRfdCkgMCwKLQkJCQkgKHN5bWludF90KSAwKTsKLSAgICB9Ci0KLSAgLyogQnVpbGQgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgb2Zmc2V0ID0gMDsKLSAgYnVmID0geG1hbGxvYyAoUEFHRV9TSVpFKTsKLSAgYnVmZW5kID0gYnVmICsgUEFHRV9TSVpFOwotCi0gIC8qIEJ1aWxkIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gICovCi0gIGhkci0+Y2JMaW5lT2Zmc2V0ID0gb2Zmc2V0OwotICBvZmZzZXQgPSBlY29mZl9idWlsZF9saW5lbm8gKGJhY2tlbmQsICZidWYsICZidWZlbmQsIG9mZnNldCwKLQkJCSAgICAgICAmaGRyLT5pbGluZU1heCk7Ci0gIGhkci0+Y2JMaW5lID0gb2Zmc2V0IC0gaGRyLT5jYkxpbmVPZmZzZXQ7Ci0KLSAgLyogV2UgZG9uJ3QgdXNlIGRlbnNlIG51bWJlcnMgYXQgYWxsLiAgKi8KLSAgaGRyLT5pZG5NYXggPSAwOwotICBoZHItPmNiRG5PZmZzZXQgPSAwOwotCi0gIC8qIFdlIGNhbid0IGJ1aWxkIHRoZSBQRFIgdGFibGUgdW50aWwgd2UgaGF2ZSBidWlsdCB0aGUgc3ltYm9scywKLSAgICAgYmVjYXVzZSBhIFBEUiBjb250YWlucyBhIHN5bWJvbCBpbmRleC4gIEhvd2V2ZXIsIHdlIHNldCBhc2lkZQotICAgICBzcGFjZSBhdCB0aGlzIHBvaW50LiAgKi8KLSAgaGRyLT5pcGRNYXggPSBwcm9jX2NudDsKLSAgaGRyLT5jYlBkT2Zmc2V0ID0gb2Zmc2V0OwotICBpZiAoYnVmZW5kIC0gKGJ1ZiArIG9mZnNldCkgPCBwcm9jX2NudCAqIGV4dGVybmFsX3Bkcl9zaXplKQotICAgICh2b2lkKSBlY29mZl9hZGRfYnl0ZXMgKCZidWYsICZidWZlbmQsIGJ1ZiArIG9mZnNldCwKLQkJCSAgICBwcm9jX2NudCAqIGV4dGVybmFsX3Bkcl9zaXplKTsKLSAgb2Zmc2V0ICs9IHByb2NfY250ICogZXh0ZXJuYWxfcGRyX3NpemU7Ci0KLSAgLyogQnVpbGQgdGhlIGxvY2FsIHN5bWJvbHMuICAqLwotICBoZHItPmNiU3ltT2Zmc2V0ID0gb2Zmc2V0OwotICBvZmZzZXQgPSBlY29mZl9idWlsZF9zeW1ib2xzIChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBvZmZzZXQpOwotICBoZHItPmlzeW1NYXggPSAob2Zmc2V0IC0gaGRyLT5jYlN5bU9mZnNldCkgLyBiYWNrZW5kLT5leHRlcm5hbF9zeW1fc2l6ZTsKLQotICAvKiBCdWlsZGluZyB0aGUgc3ltYm9scyBpbml0aWFsaXplcyB0aGUgc3ltYm9sIGluZGV4IGluIHRoZSBQRFIncy4KLSAgICAgTm93IHdlIGNhbiBzd2FwIG91dCB0aGUgUERSJ3MuICAqLwotICAodm9pZCkgZWNvZmZfYnVpbGRfcHJvY3MgKGJhY2tlbmQsICZidWYsICZidWZlbmQsIGhkci0+Y2JQZE9mZnNldCk7Ci0KLSAgLyogV2UgZG9uJ3QgdXNlIG9wdGltaXphdGlvbiBzeW1ib2xzLiAgKi8KLSAgaGRyLT5pb3B0TWF4ID0gMDsKLSAgaGRyLT5jYk9wdE9mZnNldCA9IDA7Ci0KLSAgLyogU3dhcCBvdXQgdGhlIGF1eGlsaWFyeSB0eXBlIGluZm9ybWF0aW9uLiAgKi8KLSAgaGRyLT5jYkF1eE9mZnNldCA9IG9mZnNldDsKLSAgb2Zmc2V0ID0gZWNvZmZfYnVpbGRfYXV4IChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBvZmZzZXQpOwotICBoZHItPmlhdXhNYXggPSAob2Zmc2V0IC0gaGRyLT5jYkF1eE9mZnNldCkgLyBzaXplb2YgKHVuaW9uIGF1eF9leHQpOwotCi0gIC8qIENvcHkgb3V0IHRoZSBsb2NhbCBzdHJpbmdzLiAgKi8KLSAgaGRyLT5jYlNzT2Zmc2V0ID0gb2Zmc2V0OwotICBvZmZzZXQgPSBlY29mZl9idWlsZF9zcyAoYmFja2VuZCwgJmJ1ZiwgJmJ1ZmVuZCwgb2Zmc2V0KTsKLSAgaGRyLT5pc3NNYXggPSBvZmZzZXQgLSBoZHItPmNiU3NPZmZzZXQ7Ci0KLSAgLyogV2UgZG9uJ3QgdXNlIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvcnMuICAqLwotICBoZHItPmNyZmQgPSAwOwotICBoZHItPmNiUmZkT2Zmc2V0ID0gMDsKLQotICAvKiBTd2FwIG91dCB0aGUgZmlsZSBkZXNjcmlwdG9ycy4gICovCi0gIGhkci0+Y2JGZE9mZnNldCA9IG9mZnNldDsKLSAgb2Zmc2V0ID0gZWNvZmZfYnVpbGRfZmRyIChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBvZmZzZXQpOwotICBoZHItPmlmZE1heCA9IChvZmZzZXQgLSBoZHItPmNiRmRPZmZzZXQpIC8gYmFja2VuZC0+ZXh0ZXJuYWxfZmRyX3NpemU7Ci0KLSAgLyogU2V0IHVwIHRoZSBleHRlcm5hbCBzeW1ib2xzLCB3aGljaCBhcmUgaGFuZGxlZCBieSB0aGUgQkZEIGJhY2sKLSAgICAgZW5kLiAgKi8KLSAgaGRyLT5pc3NFeHRNYXggPSAwOwotICBoZHItPmNiU3NFeHRPZmZzZXQgPSAwOwotICBoZHItPmlleHRNYXggPSAwOwotICBoZHItPmNiRXh0T2Zmc2V0ID0gMDsKLSAgZWNvZmZfc2V0dXBfZXh0ICgpOwotCi0gIGtub3cgKChvZmZzZXQgJiAoYmFja2VuZC0+ZGVidWdfYWxpZ24gLSAxKSkgPT0gMCk7Ci0KLSAgLyogRklYTUU6IFRoaXMgdmFsdWUgc2hvdWxkIGJlIGRldGVybWluZWQgZnJvbSB0aGUgLnZlcnN0YW1wIGRpcmVjdGl2ZSwKLSAgICAgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzIGluIGNvbmZpZyBmaWxlcy4gICovCi0jaWZkZWYgVENfQUxQSEEKLSAgaGRyLT52c3RhbXAgPSAweDAzMGI7Ci0jZWxzZQotICBoZHItPnZzdGFtcCA9IDB4MDIwYjsKLSNlbmRpZgotCi0gICpidWZwID0gYnVmOwotICByZXR1cm4gb2Zmc2V0OwotfQotDAotLyogQWxsb2NhdGUgYSBjbHVzdGVyIG9mIHBhZ2VzLiAgKi8KLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotc3RhdGljIHBhZ2VfdHlwZSAqCi1hbGxvY2F0ZV9jbHVzdGVyIChucGFnZXMpCi0gICAgIHVuc2lnbmVkIGxvbmcgbnBhZ2VzOwotewotICByZWdpc3RlciBwYWdlX3R5cGUgKnZhbHVlID0gKHBhZ2VfdHlwZSAqKSB4bWFsbG9jIChucGFnZXMgKiBQQUdFX1VTSVpFKTsKLQotI2lmZGVmIEVDT0ZGX0RFQlVHCi0gIGlmIChkZWJ1ZyA+IDMpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiXHRhbGxvY1x0bnBhZ2VzID0gJWQsIHZhbHVlID0gMHglLjh4XG4iLCBucGFnZXMsIHZhbHVlKTsKLSNlbmRpZgotCi0gIG1lbXNldCAodmFsdWUsIDAsIG5wYWdlcyAqIFBBR0VfVVNJWkUpOwotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotCi1zdGF0aWMgcGFnZV90eXBlICpjbHVzdGVyX3B0ciA9IE5VTEw7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlc19sZWZ0ID0gMDsKLQotI2VuZGlmIC8qIE1BTExPQ19DSEVDSyAqLwotCi0vKiBBbGxvY2F0ZSBvbmUgcGFnZSAod2hpY2ggaXMgaW5pdGlhbGl6ZWQgdG8gMCkuICAqLwotCi1zdGF0aWMgcGFnZV90eXBlICoKLWFsbG9jYXRlX3BhZ2UgKCkKLXsKLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgaWYgKHBhZ2VzX2xlZnQgPT0gMCkKLSAgICB7Ci0gICAgICBwYWdlc19sZWZ0ID0gTUFYX0NMVVNURVJfUEFHRVM7Ci0gICAgICBjbHVzdGVyX3B0ciA9IGFsbG9jYXRlX2NsdXN0ZXIgKHBhZ2VzX2xlZnQpOwotICAgIH0KLQotICBwYWdlc19sZWZ0LS07Ci0gIHJldHVybiBjbHVzdGVyX3B0cisrOwotCi0jZWxzZQkvKiBNQUxMT0NfQ0hFQ0sgKi8KLQotICBwYWdlX3R5cGUgKnB0cjsKLQotICBwdHIgPSB4bWFsbG9jIChQQUdFX1VTSVpFKTsKLSAgbWVtc2V0IChwdHIsIDAsIFBBR0VfVVNJWkUpOwotICByZXR1cm4gcHRyOwotCi0jZW5kaWYJLyogTUFMTE9DX0NIRUNLICovCi19Ci0MCi0vKiBBbGxvY2F0ZSBzY29waW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHNjb3BlX3QgKgotYWxsb2NhdGVfc2NvcGUgKCkKLXsKLSAgcmVnaXN0ZXIgc2NvcGVfdCAqcHRyOwotICBzdGF0aWMgc2NvcGVfdCBpbml0aWFsX3Njb3BlOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHB0ciA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLmZyZWVfbGlzdC5mX3Njb3BlOwotICBpZiAocHRyICE9IChzY29wZV90ICopIE5VTEwpCi0gICAgYWxsb2NfY291bnRzWyAoaW50KWFsbG9jX3R5cGVfc2NvcGUgXS5mcmVlX2xpc3QuZl9zY29wZSA9IHB0ci0+ZnJlZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZAk9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnVuYWxsb2NhdGVkOwotICAgICAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZQk9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLmN1cl9wYWdlOwotCi0gICAgICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLQl7Ci0JICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAoc2NvcGVfdCk7Ci0JICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLQkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnRvdGFsX3BhZ2VzKys7Ci0JfQotCi0gICAgICBwdHIgPSAmY3VyX3BhZ2UtPnNjb3BlWy0tdW5hbGxvY2F0ZWRdOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLSAgICB9Ci0KLSNlbHNlCi0KLSAgcHRyID0gKHNjb3BlX3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzY29wZV90KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX3Njb3BlOwotICByZXR1cm4gcHRyOwotfQotCi0vKiBGcmVlIHNjb3BpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZnJlZV9zY29wZSAocHRyKQotICAgICBzY29wZV90ICpwdHI7Ci17Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnRvdGFsX2ZyZWUrKzsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLSAgcHRyLT5mcmVlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0uZnJlZV9saXN0LmZfc2NvcGU7Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLmZyZWVfbGlzdC5mX3Njb3BlID0gcHRyOwotI2Vsc2UKLSAgZnJlZSAoKFBUUikgcHRyKTsKLSNlbmRpZgotfQotDAotLyogQWxsb2NhdGUgbGlua3MgZm9yIHBhZ2VzIGluIGEgdmlydHVhbCBhcnJheS4gICovCi0KLXN0YXRpYyB2bGlua3NfdCAqCi1hbGxvY2F0ZV92bGlua3MgKCkKLXsKLSAgcmVnaXN0ZXIgdmxpbmtzX3QgKnB0cjsKLSAgc3RhdGljIHZsaW5rc190IGluaXRpYWxfdmxpbmtzOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS51bmFsbG9jYXRlZDsKLSAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS5jdXJfcGFnZTsKLQotICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLSAgICB7Ci0gICAgICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAodmxpbmtzX3QpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLnRvdGFsX3BhZ2VzKys7Ci0gICAgfQotCi0gIHB0ciA9ICZjdXJfcGFnZS0+dmxpbmtzWy0tdW5hbGxvY2F0ZWRdOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLQotI2Vsc2UKLQotICBwdHIgPSAodmxpbmtzX3QgKikgeG1hbGxvYyAoc2l6ZW9mICh2bGlua3NfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfdmxpbmtzOwotICByZXR1cm4gcHRyOwotfQotDAotLyogQWxsb2NhdGUgc3RyaW5nIGhhc2ggYnVja2V0cy4gICovCi0KLXN0YXRpYyBzaGFzaF90ICoKLWFsbG9jYXRlX3NoYXNoICgpCi17Ci0gIHJlZ2lzdGVyIHNoYXNoX3QgKnB0cjsKLSAgc3RhdGljIHNoYXNoX3QgaW5pdGlhbF9zaGFzaDsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3NoYXNoXS51bmFsbG9jYXRlZDsKLSAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLmN1cl9wYWdlOwotCi0gIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotICAgIHsKLSAgICAgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mIChzaGFzaF90KTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0udG90YWxfcGFnZXMrKzsKLSAgICB9Ci0KLSAgcHRyID0gJmN1cl9wYWdlLT5zaGFzaFstLXVuYWxsb2NhdGVkXTsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLQotI2Vsc2UKLQotICBwdHIgPSAoc2hhc2hfdCAqKSB4bWFsbG9jIChzaXplb2YgKHNoYXNoX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfc2hhc2g7Ci0gIHJldHVybiBwdHI7Ci19Ci0MCi0vKiBBbGxvY2F0ZSB0eXBlIGhhc2ggYnVja2V0cy4gICovCi0KLXN0YXRpYyB0aGFzaF90ICoKLWFsbG9jYXRlX3RoYXNoICgpCi17Ci0gIHJlZ2lzdGVyIHRoYXNoX3QgKnB0cjsKLSAgc3RhdGljIHRoYXNoX3QgaW5pdGlhbF90aGFzaDsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoYXNoXS51bmFsbG9jYXRlZDsKLSAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLmN1cl9wYWdlOwotCi0gIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotICAgIHsKLSAgICAgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGFzaF90KTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0udG90YWxfcGFnZXMrKzsKLSAgICB9Ci0KLSAgcHRyID0gJmN1cl9wYWdlLT50aGFzaFstLXVuYWxsb2NhdGVkXTsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLQotI2Vsc2UKLQotICBwdHIgPSAodGhhc2hfdCAqKSB4bWFsbG9jIChzaXplb2YgKHRoYXNoX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfdGhhc2g7Ci0gIHJldHVybiBwdHI7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBzdHJ1Y3R1cmUsIHVuaW9uLCBvciBlbnVtIHRhZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB0YWdfdCAqCi1hbGxvY2F0ZV90YWcgKCkKLXsKLSAgcmVnaXN0ZXIgdGFnX3QgKnB0cjsKLSAgc3RhdGljIHRhZ190IGluaXRpYWxfdGFnOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHB0ciA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS5mcmVlX2xpc3QuZl90YWc7Ci0gIGlmIChwdHIgIT0gKHRhZ190ICopIE5VTEwpCi0gICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLmZyZWVfbGlzdC5mX3RhZyA9IHB0ci0+ZnJlZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS51bmFsbG9jYXRlZDsKLSAgICAgIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uY3VyX3BhZ2U7Ci0KLSAgICAgIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotCXsKLQkgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mICh0YWdfdCk7Ci0JICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0JICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10udG90YWxfcGFnZXMrKzsKLQl9Ci0KLSAgICAgIHB0ciA9ICZjdXJfcGFnZS0+dGFnWy0tdW5hbGxvY2F0ZWRdOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0gICAgfQotCi0jZWxzZQotCi0gIHB0ciA9ICh0YWdfdCAqKSB4bWFsbG9jIChzaXplb2YgKHRhZ190KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF90YWc7Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIEZyZWUgc2NvcGluZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1mcmVlX3RhZyAocHRyKQotICAgICB0YWdfdCAqcHRyOwotewotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10udG90YWxfZnJlZSsrOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotICBwdHItPmZyZWUgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uZnJlZV9saXN0LmZfdGFnOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uZnJlZV9saXN0LmZfdGFnID0gcHRyOwotI2Vsc2UKLSAgZnJlZSAoKFBUUl9UKSBwdHIpOwotI2VuZGlmCi19Ci0MCi0vKiBBbGxvY2F0ZSBmb3J3YXJkIHJlZmVyZW5jZSB0byBhIHlldCB1bmtub3duIHRhZy4gICovCi0KLXN0YXRpYyBmb3J3YXJkX3QgKgotYWxsb2NhdGVfZm9yd2FyZCAoKQotewotICByZWdpc3RlciBmb3J3YXJkX3QgKnB0cjsKLSAgc3RhdGljIGZvcndhcmRfdCBpbml0aWFsX2ZvcndhcmQ7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS51bmFsbG9jYXRlZDsKLSAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0uY3VyX3BhZ2U7Ci0KLSAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0gICAgewotICAgICAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKGZvcndhcmRfdCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2ZvcndhcmRdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS50b3RhbF9wYWdlcysrOwotICAgIH0KLQotICBwdHIgPSAmY3VyX3BhZ2UtPmZvcndhcmRbLS11bmFsbG9jYXRlZF07Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLQotI2Vsc2UKLQotICBwdHIgPSAoZm9yd2FyZF90ICopIHhtYWxsb2MgKHNpemVvZiAoZm9yd2FyZF90KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfZm9yd2FyZDsKLSAgcmV0dXJuIHB0cjsKLX0KLQwKLS8qIEFsbG9jYXRlIGhlYWQgb2YgdHlwZSBoYXNoIGxpc3QuICAqLwotCi1zdGF0aWMgdGhlYWRfdCAqCi1hbGxvY2F0ZV90aGVhZCAoKQotewotICByZWdpc3RlciB0aGVhZF90ICpwdHI7Ci0gIHN0YXRpYyB0aGVhZF90IGluaXRpYWxfdGhlYWQ7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcHRyID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0uZnJlZV9saXN0LmZfdGhlYWQ7Ci0gIGlmIChwdHIgIT0gKHRoZWFkX3QgKikgTlVMTCkKLSAgICBhbGxvY19jb3VudHNbIChpbnQpYWxsb2NfdHlwZV90aGVhZCBdLmZyZWVfbGlzdC5mX3RoZWFkID0gcHRyLT5mcmVlOwotICBlbHNlCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udW5hbGxvY2F0ZWQ7Ci0gICAgICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0uY3VyX3BhZ2U7Ci0KLSAgICAgIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotCXsKLQkgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGVhZF90KTsKLQkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotCSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udG90YWxfcGFnZXMrKzsKLQl9Ci0KLSAgICAgIHB0ciA9ICZjdXJfcGFnZS0+dGhlYWRbLS11bmFsbG9jYXRlZF07Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotICAgIH0KLQotI2Vsc2UKLQotICBwdHIgPSAodGhlYWRfdCAqKSB4bWFsbG9jIChzaXplb2YgKHRoZWFkX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfdGhlYWQ7Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIEZyZWUgc2NvcGluZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1mcmVlX3RoZWFkIChwdHIpCi0gICAgIHRoZWFkX3QgKnB0cjsKLXsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udG90YWxfZnJlZSsrOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotICBwdHItPmZyZWUgPSAodGhlYWRfdCAqKSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS5mcmVlX2xpc3QuZl90aGVhZDsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0uZnJlZV9saXN0LmZfdGhlYWQgPSBwdHI7Ci0jZWxzZQotICBmcmVlICgoUFRSX1QpIHB0cik7Ci0jZW5kaWYKLX0KLQwKLXN0YXRpYyBsaW5lbm9fbGlzdF90ICoKLWFsbG9jYXRlX2xpbmVub19saXN0ICgpCi17Ci0gIHJlZ2lzdGVyIGxpbmVub19saXN0X3QgKnB0cjsKLSAgc3RhdGljIGxpbmVub19saXN0X3QgaW5pdGlhbF9saW5lbm9fbGlzdDsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10udW5hbGxvY2F0ZWQ7Ci0gIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10uY3VyX3BhZ2U7Ci0KLSAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0gICAgewotICAgICAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKGxpbmVub19saXN0X3QpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLnRvdGFsX3BhZ2VzKys7Ci0gICAgfQotCi0gIHB0ciA9ICZjdXJfcGFnZS0+bGluZW5vWy0tdW5hbGxvY2F0ZWRdOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLQotI2Vsc2UKLQotICBwdHIgPSAobGluZW5vX2xpc3RfdCAqKSB4bWFsbG9jIChzaXplb2YgKGxpbmVub19saXN0X3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX2xpbmVub19saXN0OwotICByZXR1cm4gcHRyOwotfQotCi12b2lkCi1lY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUgKHN6KQotICAgICBpbnQgc3o7Ci17Ci0gIGlmIChjdXJfcHJvY19wdHIgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIuZ3BfcHJvbG9ndWUgPSBzejsKLSAgaWYgKGN1cl9wcm9jX3B0ci0+cGRyLmdwX3Byb2xvZ3VlICE9IHN6KQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkdQIHByb2xvZ3VlIHNpemUgZXhjZWVkcyBmaWVsZCBzaXplLCB1c2luZyAwIGluc3RlYWQiKSk7Ci0gICAgICBjdXJfcHJvY19wdHItPnBkci5ncF9wcm9sb2d1ZSA9IDA7Ci0gICAgfQotCi0gIGN1cl9wcm9jX3B0ci0+cGRyLmdwX3VzZWQgPSAxOwotfQotCi1pbnQgCi1lY29mZl9ub19jdXJyZW50X2ZpbGUgKCkKLXsKLSAgcmV0dXJuIGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEw7Ci19Ci0KLXZvaWQKLWVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8gKCkKLXsKLSAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGxpbmVub19saXN0X3QgKmxpc3Q7Ci0KLSAgYXNfd2hlcmUgKCZmaWxlbmFtZSwgJmxpbmVubyk7Ci0KLSAgaWYgKGN1cnJlbnRfc3RhYnNfZmlsZW5hbWUgPT0gKGNoYXIgKilOVUxMCi0gICAgICB8fCBzdHJjbXAgKGN1cnJlbnRfc3RhYnNfZmlsZW5hbWUsIGZpbGVuYW1lKSkKLSAgICBhZGRfZmlsZSAoZmlsZW5hbWUsIDAsIDEpOwotCi0gIGxpc3QgPSBhbGxvY2F0ZV9saW5lbm9fbGlzdCAoKTsKLQotICBsaXN0LT5uZXh0ID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKLSAgbGlzdC0+ZmlsZSA9IGN1cl9maWxlX3B0cjsKLSAgbGlzdC0+cHJvYyA9IGN1cl9wcm9jX3B0cjsKLSAgbGlzdC0+ZnJhZyA9IGZyYWdfbm93OwotICBsaXN0LT5wYWRkciA9IGZyYWdfbm93X2ZpeCAoKTsKLSAgbGlzdC0+bGluZW5vID0gbGluZW5vOwotCi0gIC8qIFdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgZmlsZXMgd2hpY2ggaGF2ZSBsaW5lIG51bWJlcnMuICAqLwotICBjdXJfZmlsZV9wdHItPmZkci5mTWVyZ2UgPSAwOwotCi0gIC8qIEEgLmxvYyBkaXJlY3RpdmUgd2lsbCBzb21ldGltZXMgYXBwZWFyIGJlZm9yZSBhIC5lbnQgZGlyZWN0aXZlLAotICAgICB3aGljaCBtZWFucyB0aGF0IGN1cl9wcm9jX3B0ciB3aWxsIGJlIE5VTEwgaGVyZS4gIEFycmFuZ2UgdG8KLSAgICAgcGF0Y2ggdGhpcyB1cC4gICovCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmVub19saXN0X3QgKipwbDsKLQotICAgICAgcGwgPSAmbm9wcm9jX2xpbmVubzsKLSAgICAgIHdoaWxlICgqcGwgIT0gKGxpbmVub19saXN0X3QgKikgTlVMTCkKLSAgICAgICAgcGwgPSAmKCpwbCktPm5leHQ7Ci0gICAgICAqcGwgPSBsaXN0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxhc3RfbGluZW5vID0gbGlzdDsKLSAgICAgICpsYXN0X2xpbmVub19wdHIgPSBsaXN0OwotICAgICAgbGFzdF9saW5lbm9fcHRyID0gJmxpc3QtPm5leHQ7Ci0gICAgfQotfQotCi0jZWxzZQotCi12b2lkCi1lY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vICgpCi17Ci19Ci0KLSNlbmRpZiAvKiBFQ09GRl9ERUJVR0dJTkcgKi8KZGlmZiAtLWdpdCBhL2dhcy9lY29mZi5oIGIvZ2FzL2Vjb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYzY1ZjguLjAwMDAwMDAKLS0tIGEvZ2FzL2Vjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyogZWNvZmYuaCAtLSBoZWFkZXIgZmlsZSBmb3IgRUNPRkYgZGVidWdnaW5nIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBQdXQgdG9nZXRoZXIgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEdBU19FQ09GRl9ICi0jZGVmaW5lIEdBU19FQ09GRl9ICi0KLSNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKLQotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotCi0vKiBXaGV0aGVyIHdlIGhhdmUgc2VlbiBhbnkgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiBpbnQgZWNvZmZfZGVidWdnaW5nX3NlZW47Ci0KLS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgYXNzZW1ibHksIGJ5Ci0gICBvYmpfcmVhZF9iZWdpbl9ob29rLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX3JlYWRfYmVnaW5faG9vayBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgc3dpdGNoZXMgdG8gYSBuZXcKLSAgIGZpbGUuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfbmV3X2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgbmV3IHN5bWJvbCBpcyBjcmVhdGVkLCBieQotICAgb2JqX3N5bWJvbF9uZXdfaG9vay4gICovCi1leHRlcm4gdm9pZCBlY29mZl9zeW1ib2xfbmV3X2hvb2sgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgb2JqX2Zyb2Jfc3ltYm9sIGhvb2suICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLS8qIEJ1aWxkIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkKLSAgIG9ial9mcm9iX2ZpbGUuICBUaGlzIGZpbGxzIGluIHRoZSBjb3VudHMgaW4gKkhEUjsgdGhlIG9mZnNldHMgYXJlCi0gICBmaWxsZWQgaW4gcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSAqQlVGUC4gIEl0IHNldHMgKkJVRlAgdG8gYQotICAgYmxvY2sgb2YgbWVtb3J5IGhvbGRpbmcgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEl0IHJldHVybnMgdGhlCi0gICBsZW5ndGggb2YgKkJVRlAuICAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfZGVidWcKLSAgUEFSQU1TICgoSERSUiAqaGRyLCBjaGFyICoqYnVmcCwgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKikpOwotCi0vKiBGdW5jdGlvbnMgdG8gaGFuZGxlIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgZGlyZWN0aXZlcy4gICovCi1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfYmVnaW4gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfYmVuZCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9lbmQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZW50IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2ZtYXNrIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2ZyYW1lIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2xvYyBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9tYXNrIFBBUkFNUyAoKGludCkpOwotCi0vKiBPdGhlciBFQ09GRiBkaXJlY3RpdmVzLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9leHRlcm4gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfd2Vha2V4dCBQQVJBTVMgKChpbnQpKTsKLQotLyogRnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgQ09GRiBkZWJ1Z2dpbmcgZGlyZWN0aXZlcy4gICovCi1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZGVmIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2RpbSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9maWxlIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX3NjbCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9zaXplIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX3RhZyBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV90eXBlIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX3ZhbCBQQVJBTVMgKChpbnQpKTsKLQotLyogSGFuZGxlIHN0YWJzLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX3N0YWIgUEFSQU1TICgoc2VnVCBzZWMsIGludCB3aGF0LCBjb25zdCBjaGFyICpzdHJpbmcsCi0JCQkJaW50IHR5cGUsIGludCBvdGhlciwgaW50IGRlc2MpKTsKLQotLyogU2V0IHRoZSBHUCBwcm9sb2d1ZSBzaXplLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSBQQVJBTVMgKChpbnQgc3opKTsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHRoZSBFQ09GRiBjb2RlIHRvIHNldCB0aGUgZXh0ZXJuYWwKLSAgIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCi0jaWZuZGVmIG9ial9lY29mZl9zZXRfZXh0Ci1leHRlcm4gdm9pZCBvYmpfZWNvZmZfc2V0X2V4dCBQQVJBTVMgKChzeW1ib2xTICosIEVYVFIgKikpOwotI2VuZGlmCi0KLS8qIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHBhdGNoIHVwIGEgbGluZSBudW1iZXIgZGlyZWN0aXZlIHdoZW4KLSAgIGluc3RydWN0aW9ucyBhcmUgbW92ZWQgYXJvdW5kLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX2ZpeF9sb2MgUEFSQU1TICgoZnJhZ1MgKiwgdW5zaWduZWQgbG9uZykpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHJlYWQuYyB0byBwZWVrIGF0IGN1cl9maWxlX3B0ci4gICovCi1leHRlcm4gaW50IGVjb2ZmX25vX2N1cnJlbnRfZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBwcm9jLiAgKi8KLWV4dGVybiBzeW1ib2xTICplY29mZl9nZXRfY3VyX3Byb2Nfc3ltIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmIC8qIEVDT0ZGX0RFQlVHR0lORyAqLwotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gcmVhZC5jIHRvIGdlbmVyYXRlIGxpbmUgbnVtYmVyIGZvciAucyBmaWxlLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8gUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogISBHQVNfRUNPRkZfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2Vob3B0LmMgYi9nYXMvZWhvcHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhNWY2Mi4uMDAwMDAwMAotLS0gYS9nYXMvZWhvcHQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi0vKiBlaG9wdC5jLS1vcHRpbWl6ZSBnY2MgZXhjZXB0aW9uIGZyYW1lIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0vKiBXZSBpbmNsdWRlIHRoaXMgRUxGIGZpbGUsIGV2ZW4gdGhvdWdoIHdlIG1heSBub3QgYmUgYXNzZW1ibGluZyBmb3IKLSAgIEVMRiwgc2luY2UgdGhlIGV4Y2VwdGlvbiBmcmFtZSBpbmZvcm1hdGlvbiBpcyBhbHdheXMgaW4gYSBmb3JtYXQKLSAgIGRlcml2ZWQgZnJvbSBEV0FSRi4gICovCi0KLSNpbmNsdWRlICJlbGYvZHdhcmYyLmgiCi0KLS8qIFRyeSB0byBvcHRpbWl6ZSBnY2MgMi44IGV4Y2VwdGlvbiBmcmFtZSBpbmZvcm1hdGlvbi4KLQotICAgRXhjZXB0aW9uIGZyYW1lIGluZm9ybWF0aW9uIGlzIGVtaXR0ZWQgZm9yIGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZQotICAgLmVoX2ZyYW1lIHNlY3Rpb24uICBTaW1wbGUgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24gd2l0aCBubwotICAgZXhjZXB0aW9ucyBsb29rcyBsaWtlIHRoaXM6Ci0KLV9fRlJBTUVfQkVHSU5fXzoKLQkuNGJ5dGUJLkxMQ0lFMQkvIExlbmd0aCBvZiBDb21tb24gSW5mb3JtYXRpb24gRW50cnkKLS5MU0NJRTE6Ci0JLjRieXRlCTB4MAkvIENJRSBJZGVudGlmaWVyIFRhZwotCS5ieXRlCTB4MQkvIENJRSBWZXJzaW9uCi0JLmJ5dGUJMHgwCS8gQ0lFIEF1Z21lbnRhdGlvbiAobm9uZSkKLQkuYnl0ZQkweDEJLyBVTEVCMTI4IDB4MSAoQ0lFIENvZGUgQWxpZ25tZW50IEZhY3RvcikKLQkuYnl0ZQkweDdjCS8gU0xFQjEyOCAtNCAoQ0lFIERhdGEgQWxpZ25tZW50IEZhY3RvcikKLQkuYnl0ZQkweDgJLyBDSUUgUkEgQ29sdW1uCi0JLmJ5dGUJMHhjCS8gRFdfQ0ZBX2RlZl9jZmEKLQkuYnl0ZQkweDQJLyBVTEVCMTI4IDB4NAotCS5ieXRlCTB4NAkvIFVMRUIxMjggMHg0Ci0JLmJ5dGUJMHg4OAkvIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDgKLQkuYnl0ZQkweDEJLyBVTEVCMTI4IDB4MQotCS5hbGlnbiA0Ci0uTEVDSUUxOgotCS5zZXQJLkxMQ0lFMSwuTEVDSUUxLS5MU0NJRTEJLyBDSUUgTGVuZ3RoIFN5bWJvbAotCS40Ynl0ZQkuTExGREUxCS8gRkRFIExlbmd0aAotLkxTRkRFMToKLQkuNGJ5dGUJLkxTRkRFMS1fX0ZSQU1FX0JFR0lOX18JLyBGREUgQ0lFIG9mZnNldAotCS40Ynl0ZQkuTEZCMQkvIEZERSBpbml0aWFsIGxvY2F0aW9uCi0JLjRieXRlCS5MRkUxLS5MRkIxCS8gRkRFIGFkZHJlc3MgcmFuZ2UKLQkuYnl0ZQkweDQJLyBEV19DRkFfYWR2YW5jZV9sb2M0Ci0JLjRieXRlCS5MQ0ZJMC0uTEZCMQotCS5ieXRlCTB4ZQkvIERXX0NGQV9kZWZfY2ZhX29mZnNldAotCS5ieXRlCTB4OAkvIFVMRUIxMjggMHg4Ci0JLmJ5dGUJMHg4NQkvIERXX0NGQV9vZmZzZXQsIGNvbHVtbiAweDUKLQkuYnl0ZQkweDIJLyBVTEVCMTI4IDB4MgotCS5ieXRlCTB4NAkvIERXX0NGQV9hZHZhbmNlX2xvYzQKLQkuNGJ5dGUJLkxDRkkxLS5MQ0ZJMAotCS5ieXRlCTB4ZAkvIERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyCi0JLmJ5dGUJMHg1CS8gVUxFQjEyOCAweDUKLQkuYnl0ZQkweDQJLyBEV19DRkFfYWR2YW5jZV9sb2M0Ci0JLjRieXRlCS5MQ0ZJMi0uTENGSTEKLQkuYnl0ZQkweDJlCS8gRFdfQ0ZBX0dOVV9hcmdzX3NpemUKLQkuYnl0ZQkweDQJLyBVTEVCMTI4IDB4NAotCS5ieXRlCTB4NAkvIERXX0NGQV9hZHZhbmNlX2xvYzQKLQkuNGJ5dGUJLkxDRkkzLS5MQ0ZJMgotCS5ieXRlCTB4MmUJLyBEV19DRkFfR05VX2FyZ3Nfc2l6ZQotCS5ieXRlCTB4MAkvIFVMRUIxMjggMHgwCi0JLmFsaWduIDQKLS5MRUZERTE6Ci0JLnNldAkuTExGREUxLC5MRUZERTEtLkxTRkRFMQkvIEZERSBMZW5ndGggU3ltYm9sCi0KLSAgIFRoZSBpbW1lZGlhdGUgaXNzdWUgd2UgY2FuIGFkZHJlc3MgaW4gdGhlIGFzc2VtYmxlciBpcyB0aGUKLSAgIERXX0NGQV9hZHZhbmNlX2xvYzQgZm9sbG93ZWQgYnkgYSBmb3VyIGJ5dGUgdmFsdWUuICBUaGUgdmFsdWUgaXMKLSAgIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBhZGRyZXNzZXMgaW4gdGhlIGZ1bmN0aW9uLiAgU2luY2UgZ2NjIGRvZXMKLSAgIG5vdCBrbm93IHRoaXMgdmFsdWUsIGl0IGFsd2F5cyB1c2VzIGZvdXIgYnl0ZXMuICBXZSB3aWxsIGtub3cgdGhlCi0gICB2YWx1ZSBhdCB0aGUgZW5kIG9mIGFzc2VtYmx5LCBzbyB3ZSBjYW4gZG8gYmV0dGVyLiAgKi8KLQotc3RhdGljIGludCBlaF9mcmFtZV9jb2RlX2FsaWdubWVudCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEdldCB0aGUgY29kZSBhbGlnbm1lbnQgZmFjdG9yIGZyb20gdGhlIENJRS4gICovCi0KLXN0YXRpYyBpbnQKLWVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50ICgpCi17Ci0gIHN0YXRpYyBpbnQgY29kZV9hbGlnbm1lbnQ7Ci0gIHNlZ1QgY3VycmVudF9zZWc7Ci0gIHN1YnNlZ1QgY3VycmVudF9zdWJzZWc7Ci0gIGZyYWdTICpmOwotICBmaXhTICpmaXg7Ci0gIGludCBvZmZzZXQ7Ci0gIGNoYXIgYXVnbWVudGF0aW9uWzEwXTsKLSAgaW50IGlhdWc7Ci0KLSAgaWYgKGNvZGVfYWxpZ25tZW50ICE9IDApCi0gICAgcmV0dXJuIGNvZGVfYWxpZ25tZW50OwotCi0gIC8qIFdlIHNob3VsZCBmaW5kIHRoZSBDSUUgYXQgdGhlIHN0YXJ0IG9mIHRoZSAuZWhfZnJhbWUgc2VjdGlvbi4gICovCi0KLSAgY3VycmVudF9zZWcgPSBub3dfc2VnOwotICBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIHN1YnNlZ19uZXcgKCIuZWhfZnJhbWUiLCAwKTsKLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCBkZWZpbmVkIChNQU5ZX1NFR01FTlRTKQotICBmID0gc2VnX2luZm8gKG5vd19zZWcpLT5mcmNoYWluUC0+ZnJjaF9yb290OwotI2Vsc2UKLSAgZiA9IGZyY2hhaW5fbm93LT5mcmNoX3Jvb3Q7Ci0jZW5kaWYKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGZpeCA9IHNlZ19pbmZvIChub3dfc2VnKS0+ZnJjaGFpblAtPmZpeF9yb290OwotI2Vsc2UKLSAgZml4ID0gKnNlZ19maXhfcm9vdFA7Ci0jZW5kaWYKLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWcsIGN1cnJlbnRfc3Vic2VnKTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIGZyYWdzIG9mIHRoZSBzZWN0aW9uIHRvIGZpbmQgdGhlIGNvZGUgYWxpZ25tZW50LiAgKi8KLQotICAvKiBGaXJzdCBtYWtlIHN1cmUgdGhhdCB0aGUgQ0lFIElkZW50aWZpZXIgVGFnIGlzIDAuICAqLwotCi0gIG9mZnNldCA9IDQ7Ci0gIHdoaWxlIChmICE9IE5VTEwgJiYgb2Zmc2V0ID49IGYtPmZyX2ZpeCkKLSAgICB7Ci0gICAgICBvZmZzZXQgLT0gZi0+ZnJfZml4OwotICAgICAgZiA9IGYtPmZyX25leHQ7Ci0gICAgfQotICBpZiAoZiA9PSBOVUxMCi0gICAgICB8fCBmLT5mcl9maXggLSBvZmZzZXQgPCA0Ci0gICAgICB8fCBmLT5mcl9saXRlcmFsW29mZnNldF0gIT0gMAotICAgICAgfHwgZi0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSAhPSAwCi0gICAgICB8fCBmLT5mcl9saXRlcmFsW29mZnNldCArIDJdICE9IDAKLSAgICAgIHx8IGYtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM10gIT0gMCkKLSAgICB7Ci0gICAgICBjb2RlX2FsaWdubWVudCA9IC0xOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBOZXh0IG1ha2Ugc3VyZSB0aGUgQ0lFIHZlcnNpb24gbnVtYmVyIGlzIDEuICAqLwotCi0gIG9mZnNldCArPSA0OwotICB3aGlsZSAoZiAhPSBOVUxMICYmIG9mZnNldCA+PSBmLT5mcl9maXgpCi0gICAgewotICAgICAgb2Zmc2V0IC09IGYtPmZyX2ZpeDsKLSAgICAgIGYgPSBmLT5mcl9uZXh0OwotICAgIH0KLSAgaWYgKGYgPT0gTlVMTAotICAgICAgfHwgZi0+ZnJfZml4IC0gb2Zmc2V0IDwgMQotICAgICAgfHwgZi0+ZnJfbGl0ZXJhbFtvZmZzZXRdICE9IDEpCi0gICAgewotICAgICAgY29kZV9hbGlnbm1lbnQgPSAtMTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogU2tpcCB0aGUgYXVnbWVudGF0aW9uIChhIG51bGwgdGVybWluYXRlZCBzdHJpbmcpLiAgKi8KLQotICBpYXVnID0gMDsKLSAgKytvZmZzZXQ7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHdoaWxlIChmICE9IE5VTEwgJiYgb2Zmc2V0ID49IGYtPmZyX2ZpeCkKLQl7Ci0JICBvZmZzZXQgLT0gZi0+ZnJfZml4OwotCSAgZiA9IGYtPmZyX25leHQ7Ci0JfQotICAgICAgaWYgKGYgPT0gTlVMTCkKLQl7Ci0JICBjb2RlX2FsaWdubWVudCA9IC0xOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIHdoaWxlIChvZmZzZXQgPCBmLT5mcl9maXggJiYgZi0+ZnJfbGl0ZXJhbFtvZmZzZXRdICE9ICdcMCcpCi0JewotCSAgaWYgKChzaXplX3QpIGlhdWcgPCAoc2l6ZW9mIGF1Z21lbnRhdGlvbikgLSAxKQotCSAgICB7Ci0JICAgICAgYXVnbWVudGF0aW9uW2lhdWddID0gZi0+ZnJfbGl0ZXJhbFtvZmZzZXRdOwotCSAgICAgICsraWF1ZzsKLQkgICAgfQotCSAgKytvZmZzZXQ7Ci0JfQotICAgICAgaWYgKG9mZnNldCA8IGYtPmZyX2ZpeCkKLQlicmVhazsKLSAgICB9Ci0gICsrb2Zmc2V0OwotICB3aGlsZSAoZiAhPSBOVUxMICYmIG9mZnNldCA+PSBmLT5mcl9maXgpCi0gICAgewotICAgICAgb2Zmc2V0IC09IGYtPmZyX2ZpeDsKLSAgICAgIGYgPSBmLT5mcl9uZXh0OwotICAgIH0KLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb2RlX2FsaWdubWVudCA9IC0xOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBhdWdtZW50YXRpb25baWF1Z10gPSAnXDAnOwotICBpZiAoYXVnbWVudGF0aW9uWzBdID09ICdcMCcpCi0gICAgewotICAgICAgLyogTm8gYXVnbWVudGF0aW9uLiAgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXVnbWVudGF0aW9uLCAiZWgiKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgdG8gc2tpcCBhIHBvaW50ZXIuICBVbmZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBrbm93IGhvdwotCSBsYXJnZSBpdCBpcy4gIFdlIGZpbmQgb3V0IGJ5IGxvb2tpbmcgZm9yIGEgbWF0Y2hpbmcgZml4dXAuICAqLwotICAgICAgd2hpbGUgKGZpeCAhPSBOVUxMCi0JICAgICAmJiAoZml4LT5meF9mcmFnICE9IGYgfHwgZml4LT5meF93aGVyZSAhPSBvZmZzZXQpKQotCWZpeCA9IGZpeC0+ZnhfbmV4dDsKLSAgICAgIGlmIChmaXggPT0gTlVMTCkKLQlvZmZzZXQgKz0gNDsKLSAgICAgIGVsc2UKLQlvZmZzZXQgKz0gZml4LT5meF9zaXplOwotICAgICAgd2hpbGUgKGYgIT0gTlVMTCAmJiBvZmZzZXQgPj0gZi0+ZnJfZml4KQotCXsKLQkgIG9mZnNldCAtPSBmLT5mcl9maXg7Ci0JICBmID0gZi0+ZnJfbmV4dDsKLQl9Ci0gICAgICBpZiAoZiA9PSBOVUxMKQotCXsKLQkgIGNvZGVfYWxpZ25tZW50ID0gLTE7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvZGVfYWxpZ25tZW50ID0gLTE7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIFdlJ3JlIG5vdyBhdCB0aGUgY29kZSBhbGlnbm1lbnQgZmFjdG9yLCB3aGljaCBpcyBhIFVMRUIxMjguICBJZgotICAgICBpdCBpc24ndCBhIHNpbmdsZSBieXRlLCBmb3JnZXQgaXQuICAqLwotCi0gIGNvZGVfYWxpZ25tZW50ID0gZi0+ZnJfbGl0ZXJhbFtvZmZzZXRdICYgMHhmZjsKLSAgaWYgKChjb2RlX2FsaWdubWVudCAmIDB4ODApICE9IDAgfHwgY29kZV9hbGlnbm1lbnQgPT0gMCkKLSAgICB7Ci0gICAgICBjb2RlX2FsaWdubWVudCA9IC0xOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gY29kZV9hbGlnbm1lbnQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gZW1pdF9leHByLiAgSXQgbG9va3MgZm9yIGNhc2VzIHdoaWNoCi0gICB3ZSBjYW4gb3B0aW1pemUuCi0KLSAgIFJhdGhlciB0aGFuIHRyeSB0byBwYXJzZSBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhcyB3ZSByZWFkIGl0LCB3ZQotICAgbG9vayBmb3IgYSBzaW5nbGUgYnl0ZSBEV19DRkFfYWR2YW5jZV9sb2M0IGZvbGxvd2VkIGJ5IGEgNCBieXRlCi0gICBkaWZmZXJlbmNlLiAgV2UgdHVybiB0aGF0IGludG8gYSByc19jZmFfYWR2YW5jZSBmcmFnLCBhbmQgaGFuZGxlCi0gICB0aG9zZSBmcmFncyBhdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseS4gIElmIHRoZSBnY2Mgb3V0cHV0IGNoYW5nZXMKLSAgIHNvbWV3aGF0LCB0aGlzIG9wdGltaXphdGlvbiBtYXkgc3RvcCB3b3JraW5nLgotCi0gICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gaWYgaXQgaGFuZGxlZCB0aGUgZXhwcmVzc2lvbiBhbmQKLSAgIGVtaXRfZXhwciBzaG91bGQgbm90IGRvIGFueXRoaW5nLCBvciB6ZXJvIG90aGVyd2lzZS4gIEl0IGNhbiBhbHNvCi0gICBjaGFuZ2UgKkVYUCBhbmQgKlBOQllURVMuICAqLwotCi1pbnQKLWNoZWNrX2VoX2ZyYW1lIChleHAsIHBuYnl0ZXMpCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIHVuc2lnbmVkIGludCAqcG5ieXRlczsKLXsKLSAgc3RhdGljIGludCBzYXdfc2l6ZTsKLSAgc3RhdGljIHN5bWJvbFMgKnNpemVfZW5kX3N5bTsKLSAgc3RhdGljIGludCBzYXdfYWR2YW5jZV9sb2M0OwotICBzdGF0aWMgZnJhZ1MgKmxvYzRfZnJhZzsKLSAgc3RhdGljIGludCBsb2M0X2ZpeDsKLQotICBpZiAoc2F3X3NpemUKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoc2l6ZV9lbmRfc3ltKSkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGNvbWUgdG8gdGhlIGVuZCBvZiB0aGUgQ0lFIG9yIEZERS4gIFNlZSBiZWxvdyB3aGVyZQotICAgICAgICAgd2Ugc2V0IHNhd19zaXplLiAgV2UgbXVzdCBjaGVjayB0aGlzIGZpcnN0IGJlY2F1c2Ugd2UgbWF5IG5vdwotICAgICAgICAgYmUgbG9va2luZyBhdCB0aGUgbmV4dCBzaXplLiAgKi8KLSAgICAgIHNhd19zaXplID0gMDsKLSAgICAgIHNhd19hZHZhbmNlX2xvYzQgPSAwOwotICAgIH0KLQotICBpZiAoZmxhZ190cmFkaXRpb25hbF9mb3JtYXQpCi0gICAgewotICAgICAgLyogRG9uJ3Qgb3B0aW1pemUuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChzZWdtZW50X25hbWUgKG5vd19zZWcpLCAiLmVoX2ZyYW1lIikgIT0gMCkKLSAgICB7Ci0gICAgICBzYXdfc2l6ZSA9IDA7Ci0gICAgICBzYXdfYWR2YW5jZV9sb2M0ID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgc2F3X3NpemUKLQkgICAmJiAqcG5ieXRlcyA9PSA0KQotICAgIHsKLSAgICAgIC8qIFRoaXMgbWlnaHQgYmUgdGhlIHNpemUgb2YgdGhlIENJRSBvciBGREUuICBXZSB3YW50IHRvIGtub3cKLSAgICAgICAgIHRoZSBzaXplIHNvIHRoYXQgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IG9wdGltaXplIGFjcm9zcyBhbiBGREUKLSAgICAgICAgIGJvdW5kYXJ5LiAgV2UgcmVjb2duaXplIHRoZSBzaXplIGluIG9uZSBvZiB0d28gZm9ybXM6IGEKLSAgICAgICAgIHN5bWJvbCB3aGljaCB3aWxsIGxhdGVyIGJlIGRlZmluZWQgYXMgYSBkaWZmZXJlbmNlLCBvciBhCi0gICAgICAgICBzdWJ0cmFjdGlvbiBvZiB0d28gc3ltYm9scy4gIEVpdGhlciB3YXksIHdlIGNhbiB0ZWxsIHdoZW4gd2UKLSAgICAgICAgIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBGREUgYmVjYXVzZSB0aGUgc3ltYm9sIGJlY29tZXMgZGVmaW5lZAotICAgICAgICAgKGluIHRoZSBjYXNlIG9mIGEgc3VidHJhY3Rpb24sIHRoZSBlbmQgc3ltYm9sLCBmcm9tIHdoaWNoIHRoZQotICAgICAgICAgc3RhcnQgc3ltYm9sIGlzIGJlaW5nIHN1YnRyYWN0ZWQpLiAgT3RoZXIgd2F5cyBvZiBkZXNjcmliaW5nCi0gICAgICAgICB0aGUgc2l6ZSB3aWxsIG5vdCBiZSBvcHRpbWl6ZWQuICAqLwotICAgICAgaWYgKChleHAtPlhfb3AgPT0gT19zeW1ib2wgfHwgZXhwLT5YX29wID09IE9fc3VidHJhY3QpCi0JICAmJiAhIFNfSVNfREVGSU5FRCAoZXhwLT5YX2FkZF9zeW1ib2wpKQotCXsKLQkgIHNhd19zaXplID0gMTsKLQkgIHNpemVfZW5kX3N5bSA9IGV4cC0+WF9hZGRfc3ltYm9sOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHNhd19zaXplCi0JICAgJiYgKnBuYnl0ZXMgPT0gMQotCSAgICYmIGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gRFdfQ0ZBX2FkdmFuY2VfbG9jNCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIG1pZ2h0IGJlIGEgRFdfQ0ZBX2FkdmFuY2VfbG9jNC4gIFJlY29yZCB0aGUgZnJhZyBhbmQgdGhlCi0gICAgICAgICBwb3NpdGlvbiB3aXRoaW4gdGhlIGZyYWcsIHNvIHRoYXQgd2UgY2FuIGNoYW5nZSBpdCBsYXRlci4gICovCi0gICAgICBzYXdfYWR2YW5jZV9sb2M0ID0gMTsKLSAgICAgIGZyYWdfZ3JvdyAoMSk7Ci0gICAgICBsb2M0X2ZyYWcgPSBmcmFnX25vdzsKLSAgICAgIGxvYzRfZml4ID0gZnJhZ19ub3dfZml4ICgpOwotICAgIH0KLSAgZWxzZSBpZiAoc2F3X2FkdmFuY2VfbG9jNAotCSAgICYmICpwbmJ5dGVzID09IDQKLQkgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpbnQgY2E7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBjYXNlIHdoaWNoIHdlIGNhbiBvcHRpbWl6ZS4gIFRoZSB0d28gc3ltYm9scyBiZWluZwotICAgICAgICAgc3VidHJhY3RlZCB3ZXJlIGluIHRoZSBzYW1lIGZyYWcgYW5kIHRoZSBleHByZXNzaW9uIHdhcwotICAgICAgICAgcmVkdWNlZCB0byBhIGNvbnN0YW50LiAgV2UgY2FuIGRvIHRoZSBvcHRpbWl6YXRpb24gZW50aXJlbHkKLSAgICAgICAgIGluIHRoaXMgZnVuY3Rpb24uICAqLwotCi0gICAgICBzYXdfYWR2YW5jZV9sb2M0ID0gMDsKLQotICAgICAgY2EgPSBlaF9mcmFtZV9jb2RlX2FsaWdubWVudCAoKTsKLSAgICAgIGlmIChjYSA8IDApCi0JewotCSAgLyogRG9uJ3Qgb3B0aW1pemUuICAqLwotCX0KLSAgICAgIGVsc2UgaWYgKGV4cC0+WF9hZGRfbnVtYmVyICUgY2EgPT0gMAotCSAgICAgICAmJiBleHAtPlhfYWRkX251bWJlciAvIGNhIDwgMHg0MCkKLQl7Ci0JICBsb2M0X2ZyYWctPmZyX2xpdGVyYWxbbG9jNF9maXhdCi0JICAgID0gRFdfQ0ZBX2FkdmFuY2VfbG9jIHwgKGV4cC0+WF9hZGRfbnVtYmVyIC8gY2EpOwotCSAgLyogTm8gbW9yZSBieXRlcyBuZWVkZWQuICAqLwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgZWxzZSBpZiAoZXhwLT5YX2FkZF9udW1iZXIgPCAweDEwMCkKLQl7Ci0JICBsb2M0X2ZyYWctPmZyX2xpdGVyYWxbbG9jNF9maXhdID0gRFdfQ0ZBX2FkdmFuY2VfbG9jMTsKLQkgICpwbmJ5dGVzID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChleHAtPlhfYWRkX251bWJlciA8IDB4MTAwMDApCi0JewotCSAgbG9jNF9mcmFnLT5mcl9saXRlcmFsW2xvYzRfZml4XSA9IERXX0NGQV9hZHZhbmNlX2xvYzI7Ci0JICAqcG5ieXRlcyA9IDI7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc2F3X2FkdmFuY2VfbG9jNAotCSAgICYmICpwbmJ5dGVzID09IDQKLQkgICAmJiBleHAtPlhfb3AgPT0gT19zdWJ0cmFjdCkKLSAgICB7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBjYXNlIHdlIGNhbiBvcHRpbWl6ZS4gIFRoZSBleHByZXNzaW9uIHdhcyBub3QKLSAgICAgICAgIHJlZHVjZWQsIHNvIHdlIGNhbiBub3QgZmluaXNoIHRoZSBvcHRpbWl6YXRpb24gdW50aWwgdGhlIGVuZAotICAgICAgICAgb2YgdGhlIGFzc2VtYmx5LiAgV2Ugc2V0IHVwIGEgdmFyaWFudCBmcmFnIHdoaWNoIHdlIGhhbmRsZQotICAgICAgICAgbGF0ZXIuICAqLwotCi0gICAgICBzYXdfYWR2YW5jZV9sb2M0ID0gMDsKLQotICAgICAgZnJhZ192YXIgKHJzX2NmYSwgNCwgMCwgMCwgbWFrZV9leHByX3N5bWJvbCAoZXhwKSwKLQkJbG9jNF9maXgsIChjaGFyICopIGxvYzRfZnJhZyk7Ci0KLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHNhd19hZHZhbmNlX2xvYzQgPSAwOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBUaGUgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBzaXplIG9mIGEgcnNfY2ZhIHZhcmlhbnQgZnJhZyBiYXNlZCBvbgotICAgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBzeW1ib2xzLiAgSXQgaXMgY2FsbGVkIGJlZm9yZSB0aGUKLSAgIHJlbGF4YXRpb24gbG9vcC4gIFdlIHNldCBmcl9zdWJ0eXBlIHRvIHRoZSBleHBlY3RlZCBsZW5ndGguICAqLwotCi1pbnQKLWVoX2ZyYW1lX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgaW50IGNhOwotICBvZmZzZXRUIGRpZmY7Ci0gIGludCByZXQ7Ci0KLSAgY2EgPSBlaF9mcmFtZV9jb2RlX2FsaWdubWVudCAoKTsKLSAgZGlmZiA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmcmFnLT5mcl9zeW1ib2wsIDApOwotCi0gIGlmIChjYSA8IDApCi0gICAgcmV0ID0gNDsKLSAgZWxzZSBpZiAoZGlmZiAlIGNhID09IDAgJiYgZGlmZiAvIGNhIDwgMHg0MCkKLSAgICByZXQgPSAwOwotICBlbHNlIGlmIChkaWZmIDwgMHgxMDApCi0gICAgcmV0ID0gMTsKLSAgZWxzZSBpZiAoZGlmZiA8IDB4MTAwMDApCi0gICAgcmV0ID0gMjsKLSAgZWxzZQotICAgIHJldCA9IDQ7Ci0KLSAgZnJhZy0+ZnJfc3VidHlwZSA9IHJldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJlbGF4ZXMgYSByc19jZmEgdmFyaWFudCBmcmFnIGJhc2VkIG9uIHRoZSBjdXJyZW50Ci0gICB2YWx1ZXMgb2YgdGhlIHN5bWJvbHMuICBmcl9zdWJ0eXBlIGlzIHRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGUKLSAgIGZyYWcuICBUaGlzIHJldHVybnMgdGhlIGNoYW5nZSBpbiBmcmFnIGxlbmd0aC4gICovCi0KLWludAotZWhfZnJhbWVfcmVsYXhfZnJhZyAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIGludCBvbGRzaXplLCBuZXdzaXplOwotCi0gIG9sZHNpemUgPSBmcmFnLT5mcl9zdWJ0eXBlOwotICBuZXdzaXplID0gZWhfZnJhbWVfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWcpOwotICByZXR1cm4gbmV3c2l6ZSAtIG9sZHNpemU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYSByc19jZmEgdmFyaWFudCBmcmFnIGludG8gYSBub3JtYWwgZmlsbAotICAgZnJhZy4gIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFsbCByZWxheGF0aW9uIGhhcyBiZWVuIGRvbmUuCi0gICBmcl9zdWJ0eXBlIHdpbGwgYmUgdGhlIGRlc2lyZWQgbGVuZ3RoIG9mIHRoZSBmcmFnLiAgKi8KLQotdm9pZAotZWhfZnJhbWVfY29udmVydF9mcmFnIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgb2Zmc2V0VCBkaWZmOwotICBmcmFnUyAqbG9jNF9mcmFnOwotICBpbnQgbG9jNF9maXg7Ci0KLSAgbG9jNF9mcmFnID0gKGZyYWdTICopIGZyYWctPmZyX29wY29kZTsKLSAgbG9jNF9maXggPSAoaW50KSBmcmFnLT5mcl9vZmZzZXQ7Ci0KLSAgZGlmZiA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmcmFnLT5mcl9zeW1ib2wsIDEpOwotCi0gIGlmIChmcmFnLT5mcl9zdWJ0eXBlID09IDApCi0gICAgewotICAgICAgaW50IGNhOwotCi0gICAgICBjYSA9IGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50ICgpOwotICAgICAgYXNzZXJ0IChjYSA+IDAgJiYgZGlmZiAlIGNhID09IDAgJiYgZGlmZiAvIGNhIDwgMHg0MCk7Ci0gICAgICBsb2M0X2ZyYWctPmZyX2xpdGVyYWxbbG9jNF9maXhdID0gRFdfQ0ZBX2FkdmFuY2VfbG9jIHwgKGRpZmYgLyBjYSk7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnLT5mcl9zdWJ0eXBlID09IDEpCi0gICAgewotICAgICAgYXNzZXJ0IChkaWZmIDwgMHgxMDApOwotICAgICAgbG9jNF9mcmFnLT5mcl9saXRlcmFsW2xvYzRfZml4XSA9IERXX0NGQV9hZHZhbmNlX2xvYzE7Ci0gICAgICBmcmFnLT5mcl9saXRlcmFsW2ZyYWctPmZyX2ZpeF0gPSBkaWZmOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZy0+ZnJfc3VidHlwZSA9PSAyKQotICAgIHsKLSAgICAgIGFzc2VydCAoZGlmZiA8IDB4MTAwMDApOwotICAgICAgbG9jNF9mcmFnLT5mcl9saXRlcmFsW2xvYzRfZml4XSA9IERXX0NGQV9hZHZhbmNlX2xvYzI7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWctPmZyX2xpdGVyYWwgKyBmcmFnLT5mcl9maXgsIGRpZmYsIDIpOwotICAgIH0KLSAgZWxzZQotICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZy0+ZnJfbGl0ZXJhbCArIGZyYWctPmZyX2ZpeCwgZGlmZiwgNCk7Ci0KLSAgZnJhZy0+ZnJfZml4ICs9IGZyYWctPmZyX3N1YnR5cGU7Ci0gIGZyYWctPmZyX3R5cGUgPSByc19maWxsOwotICBmcmFnLT5mcl9vZmZzZXQgPSAwOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2VtdWwtdGFyZ2V0LmggYi9nYXMvZW11bC10YXJnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwNDA1MC4uMDAwMDAwMAotLS0gYS9nYXMvZW11bC10YXJnZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSNpZm5kZWYgZW11bF9pbml0Ci0jZGVmaW5lIGVtdWxfaW5pdAkJCWNvbW1vbl9lbXVsX2luaXQKLSNlbmRpZgotCi0jaWZuZGVmIGVtdWxfYmZkX25hbWUKLSNkZWZpbmUgZW11bF9iZmRfbmFtZQkJCWRlZmF1bHRfZW11bF9iZmRfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgZW11bF9sb2NhbF9sYWJlbHNfZmIKLSNkZWZpbmUgZW11bF9sb2NhbF9sYWJlbHNfZmIJCTAKLSNlbmRpZgotCi0jaWZuZGVmIGVtdWxfbG9jYWxfbGFiZWxzX2RvbGxhcgotI2RlZmluZSBlbXVsX2xvY2FsX2xhYmVsc19kb2xsYXIJMAotI2VuZGlmCi0KLSNpZm5kZWYgZW11bF9sZWFkaW5nX3VuZGVyc2NvcmUKLSNkZWZpbmUgZW11bF9sZWFkaW5nX3VuZGVyc2NvcmUJCTIKLSNlbmRpZgotCi0jaWZuZGVmIGVtdWxfc3RyaXBfdW5kZXJzY29yZQotI2RlZmluZSBlbXVsX3N0cmlwX3VuZGVyc2NvcmUJCTAKLSNlbmRpZgotCi0jaWZuZGVmIGVtdWxfZGVmYXVsdF9lbmRpYW4KLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbgkJMgotI2VuZGlmCi0KLSNpZm5kZWYgZW11bF9mYWtlX2xhYmVsX25hbWUKLSNkZWZpbmUgZW11bF9mYWtlX2xhYmVsX25hbWUJCTAKLSNlbmRpZgotCi1zdHJ1Y3QgZW11bGF0aW9uIGVtdWxfc3RydWN0X25hbWUgPSB7Ci0gIDAsCi0gIGVtdWxfbmFtZSwKLSAgZW11bF9pbml0LAotICBlbXVsX2JmZF9uYW1lLAotICBlbXVsX2xvY2FsX2xhYmVsc19mYiwgZW11bF9sb2NhbF9sYWJlbHNfZG9sbGFyLAotICBlbXVsX2xlYWRpbmdfdW5kZXJzY29yZSwgZW11bF9zdHJpcF91bmRlcnNjb3JlLAotICBlbXVsX2RlZmF1bHRfZW5kaWFuLAotICBlbXVsX2Zha2VfbGFiZWxfbmFtZSwKLSAgZW11bF9mb3JtYXQsCi19OwpkaWZmIC0tZ2l0IGEvZ2FzL2VtdWwuaCBiL2dhcy9lbXVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YzQ2ZDguLjAwMDAwMDAKLS0tIGEvZ2FzL2VtdWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNpZm5kZWYgRU1VTF9ERUZTCi0jZGVmaW5lIEVNVUxfREVGUwotCi1zdHJ1Y3QgZW11bGF0aW9uIHsKLSAgdm9pZCAoKm1hdGNoKSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdm9pZCAoKmluaXQpIFBBUkFNUyAoKHZvaWQpKTsKLSAgY29uc3QgY2hhciAqKCpiZmRfbmFtZSkgUEFSQU1TICgodm9pZCkpOwotICB1bnNpZ25lZCBsb2NhbF9sYWJlbHNfZmIgOiAxOwotICB1bnNpZ25lZCBsb2NhbF9sYWJlbHNfZG9sbGFyIDogMTsKLSAgdW5zaWduZWQgbGVhZGluZ191bmRlcnNjb3JlIDogMjsKLSAgdW5zaWduZWQgc3RyaXBfdW5kZXJzY29yZSA6IDE7Ci0gIHVuc2lnbmVkIGRlZmF1bHRfZW5kaWFuIDogMjsKLSAgY29uc3QgY2hhciAqZmFrZV9sYWJlbF9uYW1lOwotICBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyAqZm9ybWF0OwotfTsKLQotQ09NTU9OIHN0cnVjdCBlbXVsYXRpb24gKnRoaXNfZW11bGF0aW9uOwotCi1leHRlcm4gY29uc3QgY2hhciAqZGVmYXVsdF9lbXVsX2JmZF9uYW1lIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGNvbW1vbl9lbXVsX2luaXQgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9leHByLmMgYi9nYXMvZXhwci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQxMjM5Li4wMDAwMDAwCi0tLSBhL2dhcy9leHByLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTA0ICswLDAgQEAKLS8qIGV4cHIuYyAtb3BlcmFuZHMsIGV4cHJlc3Npb25zLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKgotICogVGhpcyBpcyByZWFsbHkgYSBicmFuY2ggb2ZmaWNlIG9mIGFzLXJlYWQuYy4gSSBzcGxpdCBpdCBvdXQgdG8gY2xlYXJseQotICogZGlzdGluZ3Vpc2ggdGhlIHdvcmxkIG9mIGV4cHJlc3Npb25zIGZyb20gdGhlIHdvcmxkIG9mIHN0YXRlbWVudHMuCi0gKiAoSXQgYWxzbyBnaXZlcyBzbWFsbGVyIGZpbGVzIHRvIHJlLWNvbXBpbGUuKQotICogSGVyZSwgIm9wZXJhbmQicyBhcmUgb2YgZXhwcmVzc2lvbnMsIG5vdCBpbnN0cnVjdGlvbnMuCi0gKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZGVmaW5lIG1pbihhLCBiKSAgICAgICAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLXN0YXRpYyB2b2lkIGZsb2F0aW5nX2NvbnN0YW50IFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXhwcmVzc2lvblApKTsKLXN0YXRpYyB2YWx1ZVQgZ2VuZXJpY19iaWdudW1fdG9faW50MzIgUEFSQU1TICgodm9pZCkpOwotI2lmZGVmIEJGRDY0Ci1zdGF0aWMgdmFsdWVUIGdlbmVyaWNfYmlnbnVtX3RvX2ludDY0IFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgaW50ZWdlcl9jb25zdGFudCBQQVJBTVMgKChpbnQgcmFkaXgsIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblApKTsKLXN0YXRpYyB2b2lkIG1yaV9jaGFyX2NvbnN0YW50IFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIGN1cnJlbnRfbG9jYXRpb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotc3RhdGljIHZvaWQgY2xlYW5fdXBfZXhwcmVzc2lvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgc2VnVCBvcGVyYW5kIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyBvcGVyYXRvclQgb3BlcmF0b3IgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gY29uc3QgY2hhciBFWFBfQ0hBUlNbXSwgRkxUX0NIQVJTW107Ci0KLS8qIFdlIGtlZXAgYSBtYXBwaW5nIG9mIGV4cHJlc3Npb24gc3ltYm9scyB0byBmaWxlIHBvc2l0aW9ucywgc28gdGhhdAotICAgd2UgY2FuIHByb3ZpZGUgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLiAgKi8KLQotc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUKLXsKLSAgc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUgKm5leHQ7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUgKmV4cHJfc3ltYm9sX2xpbmVzOwotDAotLyogQnVpbGQgYSBkdW1teSBzeW1ib2wgdG8gaG9sZCBhIGNvbXBsZXggZXhwcmVzc2lvbi4gIFRoaXMgaXMgaG93IHdlCi0gICBidWlsZCBleHByZXNzaW9ucyB1cCBvdXQgb2Ygb3RoZXIgZXhwcmVzc2lvbnMuICBUaGUgc3ltYm9sIGlzIHB1dAotICAgaW50byB0aGUgZmFrZSBzZWN0aW9uIGV4cHJfc2VjdGlvbi4gICovCi0KLXN5bWJvbFMgKgotbWFrZV9leHByX3N5bWJvbCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgZXhwcmVzc2lvblMgemVybzsKLSAgY29uc3QgY2hhciAqZmFrZTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUgKm47Ci0KLSAgaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fc3ltYm9sCi0gICAgICAmJiBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID09IDApCi0gICAgcmV0dXJuIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2w7Ci0KLSAgaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fYmlnKQotICAgIHsKLSAgICAgIC8qIFRoaXMgd29uJ3Qgd29yaywgYmVjYXVzZSB0aGUgYWN0dWFsIHZhbHVlIGlzIHN0b3JlZCBpbgotICAgICAgICAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgb3IgZ2VuZXJpY19iaWdudW0sIGFuZCB3ZSBhcmUKLSAgICAgICAgIGdvaW5nIHRvIGxvc2UgaXQgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID4gMCkKLQlhc19iYWQgKF8oImJpZ251bSBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJmbG9hdGluZyBwb2ludCBudW1iZXIgaW52YWxpZDsgemVybyBhc3N1bWVkIikpOwotICAgICAgemVyby5YX29wID0gT19jb25zdGFudDsKLSAgICAgIHplcm8uWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIHplcm8uWF91bnNpZ25lZCA9IDA7Ci0gICAgICBjbGVhbl91cF9leHByZXNzaW9uICgmemVybyk7Ci0gICAgICBleHByZXNzaW9uUCA9ICZ6ZXJvOwotICAgIH0KLQotICBmYWtlID0gRkFLRV9MQUJFTF9OQU1FOwotCi0gIC8qIFB1dHRpbmcgY29uc3RhbnQgc3ltYm9scyBpbiBhYnNvbHV0ZV9zZWN0aW9uIHJhdGhlciB0aGFuCi0gICAgIGV4cHJfc2VjdGlvbiBpcyBjb252ZW5pZW50IGZvciB0aGUgb2xkIGEub3V0IGNvZGUsIGZvciB3aGljaAotICAgICBTX0dFVF9TRUdNRU5UIGRvZXMgbm90IGFsd2F5cyByZXRyaWV2ZSB0aGUgdmFsdWUgcHV0IGluIGJ5Ci0gICAgIFNfU0VUX1NFR01FTlQuICAqLwotICBzeW1ib2xQID0gc3ltYm9sX2NyZWF0ZSAoZmFrZSwKLQkJCSAgIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JCQkgICAgPyBhYnNvbHV0ZV9zZWN0aW9uCi0JCQkgICAgOiBleHByX3NlY3Rpb24pLAotCQkJICAgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChzeW1ib2xQLCBleHByZXNzaW9uUCk7Ci0KLSAgaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fY29uc3RhbnQpCi0gICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbFAsIDEpOwotCi0gIG4gPSAoc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbi0+c3ltID0gc3ltYm9sUDsKLSAgYXNfd2hlcmUgKCZuLT5maWxlLCAmbi0+bGluZSk7Ci0gIG4tPm5leHQgPSBleHByX3N5bWJvbF9saW5lczsKLSAgZXhwcl9zeW1ib2xfbGluZXMgPSBuOwotCi0gIHJldHVybiBzeW1ib2xQOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZvciBhbiBleHByIHN5bWJvbC4gIFJldHVybgotICAgbm9uLXplcm8gaWYgc29tZXRoaW5nIHdhcyBmb3VuZCwgMCBpZiBubyBpbmZvcm1hdGlvbiBpcyBrbm93biBmb3IKLSAgIHRoZSBzeW1ib2wuICAqLwotCi1pbnQKLWV4cHJfc3ltYm9sX3doZXJlIChzeW0sIHBmaWxlLCBwbGluZSkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBjaGFyICoqcGZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCAqcGxpbmU7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBleHByX3N5bWJvbF9saW5lICpsOwotCi0gIGZvciAobCA9IGV4cHJfc3ltYm9sX2xpbmVzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT5zeW0gPT0gc3ltKQotCXsKLQkgICpwZmlsZSA9IGwtPmZpbGU7Ci0JICAqcGxpbmUgPSBsLT5saW5lOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQwKLS8qIFV0aWxpdGllcyBmb3IgYnVpbGRpbmcgZXhwcmVzc2lvbnMuCi0gICBTaW5jZSBjb21wbGV4IGV4cHJlc3Npb25zIGFyZSByZWNvcmRlZCBhcyBzeW1ib2xzIGZvciB1c2UgaW4gb3RoZXIKLSAgIGV4cHJlc3Npb25zIHRoZXNlIHJldHVybiBhIHN5bWJvbFMgKiBhbmQgbm90IGFuIGV4cHJlc3Npb25TICouCi0gICBUaGVzZSBleHBsaWNpdGx5IGRvIG5vdCB0YWtlIGFuICJhZGRfbnVtYmVyIiBhcmd1bWVudC4gICovCi0vKiA/Pz8gRm9yIGNvbXBsZXRlbmVzcycgc2FrZSBvbmUgbWlnaHQgd2FudCBleHByX2J1aWxkX3N5bWJvbC4KLSAgIEl0IHdvdWxkIGp1c3QgcmV0dXJuIGl0cyBhcmd1bWVudC4gICovCi0KLS8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gZm9yIGFuIHVuc2lnbmVkIGNvbnN0YW50LgotICAgVGhlIGNvcnJlc3BvbmRpbmcgb25lIGZvciBzaWduZWQgY29uc3RhbnRzIGlzIG1pc3NpbmcgYmVjYXVzZQotICAgdGhlcmUncyBjdXJyZW50bHkgbm8gbmVlZCBmb3IgaXQuICBPbmUgY291bGQgYWRkIGFuIHVuc2lnbmVkX3AgZmxhZwotICAgYnV0IHRoYXQgc2VlbXMgbW9yZSBjbHVtc3kuICAqLwotCi1zeW1ib2xTICoKLWV4cHJfYnVpbGRfdWNvbnN0YW50ICh2YWx1ZSkKLSAgICAgb2Zmc2V0VCB2YWx1ZTsKLXsKLSAgZXhwcmVzc2lvblMgZTsKLQotICBlLlhfb3AgPSBPX2NvbnN0YW50OwotICBlLlhfYWRkX251bWJlciA9IHZhbHVlOwotICBlLlhfdW5zaWduZWQgPSAxOwotICByZXR1cm4gbWFrZV9leHByX3N5bWJvbCAoJmUpOwotfQotCi0vKiBCdWlsZCBhbiBleHByZXNzaW9uIGZvciBPUCBzMS4gICovCi0KLXN5bWJvbFMgKgotZXhwcl9idWlsZF91bmFyeSAob3AsIHMxKQotICAgICBvcGVyYXRvclQgb3A7Ci0gICAgIHN5bWJvbFMgKnMxOwotewotICBleHByZXNzaW9uUyBlOwotCi0gIGUuWF9vcCA9IG9wOwotICBlLlhfYWRkX3N5bWJvbCA9IHMxOwotICBlLlhfYWRkX251bWJlciA9IDA7Ci0gIHJldHVybiBtYWtlX2V4cHJfc3ltYm9sICgmZSk7Ci19Ci0KLS8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gZm9yIHMxIE9QIHMyLiAgKi8KLQotc3ltYm9sUyAqCi1leHByX2J1aWxkX2JpbmFyeSAob3AsIHMxLCBzMikKLSAgICAgb3BlcmF0b3JUIG9wOwotICAgICBzeW1ib2xTICpzMTsKLSAgICAgc3ltYm9sUyAqczI7Ci17Ci0gIGV4cHJlc3Npb25TIGU7Ci0KLSAgZS5YX29wID0gb3A7Ci0gIGUuWF9hZGRfc3ltYm9sID0gczE7Ci0gIGUuWF9vcF9zeW1ib2wgPSBzMjsKLSAgZS5YX2FkZF9udW1iZXIgPSAwOwotICByZXR1cm4gbWFrZV9leHByX3N5bWJvbCAoJmUpOwotfQotCi0vKiBCdWlsZCBhbiBleHByZXNzaW9uIGZvciB0aGUgY3VycmVudCBsb2NhdGlvbiAoJy4nKS4gICovCi0KLXN5bWJvbFMgKgotZXhwcl9idWlsZF9kb3QgKCkKLXsKLSAgZXhwcmVzc2lvblMgZTsKLQotICBjdXJyZW50X2xvY2F0aW9uICgmZSk7Ci0gIHJldHVybiBtYWtlX2V4cHJfc3ltYm9sICgmZSk7Ci19Ci0MCi0vKgotICogQnVpbGQgYW55IGZsb2F0aW5nLXBvaW50IGxpdGVyYWwgaGVyZS4KLSAqIEFsc28gYnVpbGQgYW55IGJpZ251bSBsaXRlcmFsIGhlcmUuCi0gKi8KLQotLyogU2VlbXMgYXRvZl9tYWNoaW5lIGNhbiBiYWNrc2NhbiB0aHJvdWdoIGdlbmVyaWNfYmlnbnVtIGFuZCBoaXQgd2hhdGV2ZXIKLSAgIGhhcHBlbnMgdG8gYmUgbG9hZGVkIGJlZm9yZSBpdCBpbiBtZW1vcnkuICBBbmQgaXRzIHdheSB0b28gY29tcGxpY2F0ZWQKLSAgIGZvciBtZSB0byBmaXggcmlnaHQuICBUaHVzIGEgaGFjay4gIEpGOiAgSnVzdCBtYWtlIGdlbmVyaWNfYmlnbnVtIGJpZ2dlciwKLSAgIGFuZCBuZXZlciB3cml0ZSBpbnRvIHRoZSBlYXJseSB3b3JkcywgdGh1cyB0aGV5J2xsIGFsd2F5cyBiZSB6ZXJvLgotICAgSSBoYXRlIERlYW4ncyBmbG9hdGluZy1wb2ludCBjb2RlLiAgQmxlaC4gICovCi1MSVRUTEVOVU1fVFlQRSBnZW5lcmljX2JpZ251bVtTSVpFX09GX0xBUkdFX05VTUJFUiArIDZdOwotRkxPTlVNX1RZUEUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgPQotewotICAmZ2VuZXJpY19iaWdudW1bNl0sCQkvKiBsb3cgKEpGOiBXYXMgMCkgKi8KLSAgJmdlbmVyaWNfYmlnbnVtW1NJWkVfT0ZfTEFSR0VfTlVNQkVSICsgNiAtIDFdLCAvKiBoaWdoIEpGOiAoYWRkZWQgKzYpICovCi0gIDAsCQkJCS8qIGxlYWRlciAqLwotICAwLAkJCQkvKiBleHBvbmVudCAqLwotICAwCQkJCS8qIHNpZ24gKi8KLX07Ci0vKiBJZiBub256ZXJvLCB3ZSd2ZSBiZWVuIGFza2VkIHRvIGFzc2VtYmxlIG5hbiwgK2luZiBvciAtaW5mICovCi1pbnQgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9tYWdpYzsKLQwKLXN0YXRpYyB2b2lkCi1mbG9hdGluZ19jb25zdGFudCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgLyogaW5wdXRfbGluZV9wb2ludGVyLT4qLwotICAvKiBmbG9hdGluZy1wb2ludCBjb25zdGFudC4gKi8KLSAgaW50IGVycm9yX2NvZGU7Ci0KLSAgZXJyb3JfY29kZSA9IGF0b2ZfZ2VuZXJpYyAoJmlucHV0X2xpbmVfcG9pbnRlciwgIi4iLCBFWFBfQ0hBUlMsCi0JCQkgICAgICZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcik7Ci0KLSAgaWYgKGVycm9yX2NvZGUpCi0gICAgewotICAgICAgaWYgKGVycm9yX2NvZGUgPT0gRVJST1JfRVhQT05FTlRfT1ZFUkZMT1cpCi0JewotCSAgYXNfYmFkIChfKCJiYWQgZmxvYXRpbmctcG9pbnQgY29uc3RhbnQ6IGV4cG9uZW50IG92ZXJmbG93LCBwcm9iYWJseSBhc3NlbWJsaW5nIGp1bmsiKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiYmFkIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50OiB1bmtub3duIGVycm9yIGNvZGU9JWQuIiksIGVycm9yX2NvZGUpOwotCX0KLSAgICB9Ci0gIGV4cHJlc3Npb25QLT5YX29wID0gT19iaWc7Ci0gIC8qIGlucHV0X2xpbmVfcG9pbnRlci0+anVzdCBhZnRlciBjb25zdGFudCwgKi8KLSAgLyogd2hpY2ggbWF5IHBvaW50IHRvIHdoaXRlc3BhY2UuICovCi0gIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAtMTsKLX0KLQotc3RhdGljIHZhbHVlVCAKLWdlbmVyaWNfYmlnbnVtX3RvX2ludDMyICgpIAotewotICB2YWx1ZVQgbnVtYmVyID0KLQkgICAoKGdlbmVyaWNfYmlnbnVtWzFdICYgTElUVExFTlVNX01BU0spIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICB8IChnZW5lcmljX2JpZ251bVswXSAmIExJVFRMRU5VTV9NQVNLKTsKLSAgbnVtYmVyICY9IDB4ZmZmZmZmZmY7Ci0gIHJldHVybiBudW1iZXI7Ci19Ci0KLSNpZmRlZiBCRkQ2NAotc3RhdGljIHZhbHVlVCAKLWdlbmVyaWNfYmlnbnVtX3RvX2ludDY0ICgpIAotewotICB2YWx1ZVQgbnVtYmVyID0gCi0JICAgKCgoKCgoKCh2YWx1ZVQpIGdlbmVyaWNfYmlnbnVtWzNdICYgTElUVExFTlVNX01BU0spCi0JCSA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgICAgICB8ICgodmFsdWVUKSBnZW5lcmljX2JpZ251bVsyXSAmIExJVFRMRU5VTV9NQVNLKSkKLQkgICAgICAgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgICAgIHwgKCh2YWx1ZVQpIGdlbmVyaWNfYmlnbnVtWzFdICYgTElUVExFTlVNX01BU0spKQotCSAgICAgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgICB8ICgodmFsdWVUKSBnZW5lcmljX2JpZ251bVswXSAmIExJVFRMRU5VTV9NQVNLKSk7Ci0gIHJldHVybiBudW1iZXI7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLWludGVnZXJfY29uc3RhbnQgKHJhZGl4LCBleHByZXNzaW9uUCkKLSAgICAgaW50IHJhZGl4OwotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGNoYXIgKnN0YXJ0OwkJLyogc3RhcnQgb2YgbnVtYmVyLiAqLwotICBjaGFyICpzdWZmaXggPSBOVUxMOwotICBjaGFyIGM7Ci0gIHZhbHVlVCBudW1iZXI7CS8qIG9mZnNldCBvciAoYWJzb2x1dGUpIHZhbHVlICovCi0gIHNob3J0IGludCBkaWdpdDsJLyogdmFsdWUgb2YgbmV4dCBkaWdpdCBpbiBjdXJyZW50IHJhZGl4ICovCi0gIHNob3J0IGludCBtYXhkaWcgPSAwOy8qIGhpZ2hlc3QgcGVybWl0dGVkIGRpZ2l0IHZhbHVlLiAqLwotICBpbnQgdG9vX21hbnlfZGlnaXRzID0gMDsJLyogaWYgd2Ugc2VlID49IHRoaXMgbnVtYmVyIG9mICovCi0gIGNoYXIgKm5hbWU7CQkvKiBwb2ludHMgdG8gbmFtZSBvZiBzeW1ib2wgKi8KLSAgc3ltYm9sUyAqc3ltYm9sUDsJLyogcG9pbnRzIHRvIHN5bWJvbCAqLwotCi0gIGludCBzbWFsbDsJCQkvKiB0cnVlIGlmIGZpdHMgaW4gMzIgYml0cy4gKi8KLQotICAvKiBNYXkgYmUgYmlnbnVtLCBvciBtYXkgZml0IGluIDMyIGJpdHMuICovCi0gIC8qIE1vc3QgbnVtYmVycyBmaXQgaW50byAzMiBiaXRzLCBhbmQgd2Ugd2FudCB0aGlzIGNhc2UgdG8gYmUgZmFzdC4KLSAgICAgc28gd2UgcHJldGVuZCBpdCB3aWxsIGZpdCBpbnRvIDMyIGJpdHMuICBJZiwgYWZ0ZXIgbWFraW5nIHVwIGEgMzIKLSAgICAgYml0IG51bWJlciwgd2UgcmVhbGlzZSB0aGF0IHdlIGhhdmUgc2Nhbm5lZCBtb3JlIGRpZ2l0cyB0aGFuCi0gICAgIGNvbWZvcnRhYmx5IGZpdCBpbnRvIDMyIGJpdHMsIHdlIHJlLXNjYW4gdGhlIGRpZ2l0cyBjb2RpbmcgdGhlbQotICAgICBpbnRvIGEgYmlnbnVtLiAgRm9yIGRlY2ltYWwgYW5kIG9jdGFsIG51bWJlcnMgd2UgYXJlCi0gICAgIGNvbnNlcnZhdGl2ZTogU29tZSBudW1iZXJzIG1heSBiZSBhc3N1bWVkIGJpZ251bXMgd2hlbiBpbiBmYWN0Ci0gICAgIHRoZXkgZG8gZml0IGludG8gMzIgYml0cy4gIE51bWJlcnMgb2YgYW55IHJhZGl4IGNhbiBoYXZlIGV4Y2VzcwotICAgICBsZWFkaW5nIHplcm9zOiBXZSBzdHJpdmUgdG8gcmVjb2duaXNlIHRoaXMgYW5kIGNhc3QgdGhlbSBiYWNrCi0gICAgIGludG8gMzIgYml0cy4gIFdlIG11c3QgY2hlY2sgdGhhdCB0aGUgYmlnbnVtIHJlYWxseSBpcyBtb3JlIHRoYW4KLSAgICAgMzIgYml0cywgYW5kIGNoYW5nZSBpdCBiYWNrIHRvIGEgMzItYml0IG51bWJlciBpZiBpdCBmaXRzLiAgVGhlCi0gICAgIG51bWJlciB3ZSBhcmUgbG9va2luZyBmb3IgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUsIGJ1dCBpZiBpdAotICAgICBmaXRzIGludG8gMzIgYml0cyBhcyBhbiB1bnNpZ25lZCBudW1iZXIsIHdlIGxldCBpdCBiZSBhIDMyLWJpdAotICAgICBudW1iZXIuICBUaGUgY2F2YWxpZXIgYXBwcm9hY2ggaXMgZm9yIHNwZWVkIGluIG9yZGluYXJ5IGNhc2VzLiAqLwotICAvKiBUaGlzIGhhcyBiZWVuIGV4dGVuZGVkIGZvciA2NCBiaXRzLiAgV2UgYmxpbmRseSBhc3N1bWUgdGhhdCBpZgotICAgICB5b3UncmUgY29tcGlsaW5nIGluIDY0LWJpdCBtb2RlLCB0aGUgdGFyZ2V0IGlzIGEgNjQtYml0IG1hY2hpbmUuCi0gICAgIFRoaXMgc2hvdWxkIGJlIGNsZWFuZWQgdXAuICAqLwotCi0jaWZkZWYgQkZENjQKLSNkZWZpbmUgdmFsdWVzaXplIDY0Ci0jZWxzZSAvKiBpbmNsdWRlcyBub24tYmZkIGNhc2UsIG1vc3RseSAqLwotI2RlZmluZSB2YWx1ZXNpemUgMzIKLSNlbmRpZgotCi0gIGlmIChmbGFnX202OGtfbXJpICYmIHJhZGl4ID09IDApCi0gICAgewotICAgICAgaW50IGZsdCA9IDA7Ci0KLSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGUgbnVtYmVyIG1heSBoYXZlIGEgc3VmZml4IGluZGljYXRpbmcgdGhlCi0gICAgICAgICByYWRpeC4gIEZvciB0aGF0IG1hdHRlciwgaXQgbWlnaHQgYWN0dWFsbHkgYmUgYSBmbG9hdGluZwotICAgICAgICAgcG9pbnQgY29uc3RhbnQuICAqLwotICAgICAgZm9yIChzdWZmaXggPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpzdWZmaXgpOwotCSAgIHN1ZmZpeCsrKQotCXsKLQkgIGlmICgqc3VmZml4ID09ICdlJyB8fCAqc3VmZml4ID09ICdFJykKLQkgICAgZmx0ID0gMTsKLQl9Ci0KLSAgICAgIGlmIChzdWZmaXggPT0gaW5wdXRfbGluZV9wb2ludGVyKQotCXsKLQkgIHJhZGl4ID0gMTA7Ci0JICBzdWZmaXggPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjID0gKi0tc3VmZml4OwotCSAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgYyA9IHRvdXBwZXIgKGMpOwotCSAgaWYgKGMgPT0gJ0InKQotCSAgICByYWRpeCA9IDI7Ci0JICBlbHNlIGlmIChjID09ICdEJykKLQkgICAgcmFkaXggPSAxMDsKLQkgIGVsc2UgaWYgKGMgPT0gJ08nIHx8IGMgPT0gJ1EnKQotCSAgICByYWRpeCA9IDg7Ci0JICBlbHNlIGlmIChjID09ICdIJykKLQkgICAgcmFkaXggPSAxNjsKLQkgIGVsc2UgaWYgKHN1ZmZpeFsxXSA9PSAnLicgfHwgYyA9PSAnRScgfHwgZmx0KQotCSAgICB7Ci0JICAgICAgZmxvYXRpbmdfY29uc3RhbnQgKGV4cHJlc3Npb25QKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJhZGl4ID0gMTA7Ci0JICAgICAgc3VmZml4ID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc3dpdGNoIChyYWRpeCkKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgbWF4ZGlnID0gMjsKLSAgICAgIHRvb19tYW55X2RpZ2l0cyA9IHZhbHVlc2l6ZSArIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBtYXhkaWcgPSByYWRpeCA9IDg7Ci0gICAgICB0b29fbWFueV9kaWdpdHMgPSAodmFsdWVzaXplICsgMikgLyAzICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBtYXhkaWcgPSByYWRpeCA9IDE2OwotICAgICAgdG9vX21hbnlfZGlnaXRzID0gKHZhbHVlc2l6ZSArIDMpIC8gNCArIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEwOgotICAgICAgbWF4ZGlnID0gcmFkaXggPSAxMDsKLSAgICAgIHRvb19tYW55X2RpZ2l0cyA9ICh2YWx1ZXNpemUgKyAxMSkgLyA0OyAvKiB2ZXJ5IHJvdWdoICovCi0gICAgfQotI3VuZGVmIHZhbHVlc2l6ZQotICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgZm9yIChudW1iZXIgPSAwOwotICAgICAgIChkaWdpdCA9IGhleF92YWx1ZSAoYykpIDwgbWF4ZGlnOwotICAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspCi0gICAgewotICAgICAgbnVtYmVyID0gbnVtYmVyICogcmFkaXggKyBkaWdpdDsKLSAgICB9Ci0gIC8qIGMgY29udGFpbnMgY2hhcmFjdGVyIGFmdGVyIG51bWJlci4gKi8KLSAgLyogaW5wdXRfbGluZV9wb2ludGVyLT5jaGFyIGFmdGVyIGMuICovCi0gIHNtYWxsID0gKGlucHV0X2xpbmVfcG9pbnRlciAtIHN0YXJ0IC0gMSkgPCB0b29fbWFueV9kaWdpdHM7Ci0KLSAgaWYgKHJhZGl4ID09IDE2ICYmIGMgPT0gJ18nKSAKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGxpdGVyYWwgb2YgdGhlIGZvcm0gMHgzMzNfMF8xMjM0NTY3OF8xLgotICAgICAgICAgVGhpcyBleGFtcGxlIGlzIGVxdWl2YWxlbnQgdG8gMHgwMDAwMDMzMzAwMDAwMDAwMTIzNDU2NzgwMDAwMDAwMS4gICovCi0KLSAgICAgIGludCBudW1fbGl0dGxlX2RpZ2l0cyA9IDA7Ci0gICAgICBpbnQgaTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OwkvKi0+MXN0IGRpZ2l0LiAqLwotCi0gICAgICBrbm93IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgPT0gMTYpOwotCi0gICAgICBmb3IgKGMgPSAnXyc7IGMgPT0gJ18nOyBudW1fbGl0dGxlX2RpZ2l0cys9MikKLQl7Ci0KLQkgIC8qIENvbnZlcnQgb25lIDY0LWJpdCB3b3JkLiAqLwotCSAgaW50IG5kaWdpdCA9IDA7IAotCSAgbnVtYmVyID0gMDsKLQkgIGZvciAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICAgKGRpZ2l0ID0gaGV4X3ZhbHVlIChjKSkgPCBtYXhkaWc7Ci0JICAgICAgIGMgPSAqKGlucHV0X2xpbmVfcG9pbnRlcisrKSkKLQkgICAgewotCSAgICAgIG51bWJlciA9IG51bWJlciAqIHJhZGl4ICsgZGlnaXQ7Ci0JICAgICAgbmRpZ2l0Kys7Ci0JICAgIH0KLQotCSAgLyogQ2hlY2sgZm9yIDggZGlnaXQgcGVyIHdvcmQgbWF4LiAgKi8KLQkgIGlmIChuZGlnaXQgPiA4KSAKLQkgICAgYXNfYmFkIChfKCJBIGJpZ251bSB3aXRoIHVuZGVyc2NvcmVzIG1heSBub3QgaGF2ZSBtb3JlIHRoYW4gOCBoZXggZGlnaXRzIGluIGFueSB3b3JkLiIpKTsKLQotCSAgLyogQWRkIHRoaXMgY2h1bmsgdG8gdGhlIGJpZ251bS4gIFNoaWZ0IHRoaW5ncyBkb3duIDIgbGl0dGxlIGRpZ2l0cy4qLwotCSAga25vdyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTID09IDE2KTsKLQkgIGZvciAoaSA9IG1pbiAobnVtX2xpdHRsZV9kaWdpdHMgKyAxLCBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDEpOyBpID49IDI7IGktLSkKLQkgICAgZ2VuZXJpY19iaWdudW1baV0gPSBnZW5lcmljX2JpZ251bVtpLTJdOwotCi0JICAvKiBBZGQgdGhlIG5ldyBkaWdpdHMgYXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IG5ldyBvbmVzLiAqLwotCSAgZ2VuZXJpY19iaWdudW1bMF0gPSBudW1iZXIgJiAweGZmZmZmZmZmOwotCSAgZ2VuZXJpY19iaWdudW1bMV0gPSBudW1iZXIgPj4gMTY7Ci0JfQotCi0gICAgICAvKiBBZ2FpbiwgYyBpcyBjaGFyIGFmdGVyIG51bWJlciwgaW5wdXRfbGluZV9wb2ludGVyLT5hZnRlciBjLiAqLwotCi0gICAgICBpZiAobnVtX2xpdHRsZV9kaWdpdHMgPiBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDEpCi0JbnVtX2xpdHRsZV9kaWdpdHMgPSBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDE7Ci0KLSAgICAgIGFzc2VydCAobnVtX2xpdHRsZV9kaWdpdHMgPj0gNCk7Ci0KLSAgICAgIGlmIChudW1fbGl0dGxlX2RpZ2l0cyAhPSA4KQotCWFzX2JhZCAoXygiQSBiaWdudW0gd2l0aCB1bmRlcnNjb3JlcyBtdXN0IGhhdmUgZXhhY3RseSA0IHdvcmRzLiIpKTsKLQotICAgICAgLyogV2UgbWlnaHQgaGF2ZSBzb21lIGxlYWRpbmcgemVyb3MuICBUaGVzZSBjYW4gYmUgdHJpbW1lZCB0byBnaXZlCi0gICAgICAgKiB1cyBhIGNoYW5nZSB0byBmaXQgdGhpcyBjb25zdGFudCBpbnRvIGEgc21hbGwgbnVtYmVyLgotICAgICAgICovCi0gICAgICB3aGlsZSAoZ2VuZXJpY19iaWdudW1bbnVtX2xpdHRsZV9kaWdpdHMtMV0gPT0gMCAmJiBudW1fbGl0dGxlX2RpZ2l0cyA+IDEpCi0JbnVtX2xpdHRsZV9kaWdpdHMtLTsKLQkKLSAgICAgIGlmIChudW1fbGl0dGxlX2RpZ2l0cyA8PSAyKQotCXsKLQkgIC8qIHdpbGwgZml0IGludG8gMzIgYml0cy4gKi8KLQkgIG51bWJlciA9IGdlbmVyaWNfYmlnbnVtX3RvX2ludDMyICgpOwotCSAgc21hbGwgPSAxOwotCX0KLSNpZmRlZiBCRkQ2NAotICAgICAgZWxzZSBpZiAobnVtX2xpdHRsZV9kaWdpdHMgPD0gNCkKLQl7Ci0JICAvKiBXaWxsIGZpdCBpbnRvIDY0IGJpdHMuICAqLwotCSAgbnVtYmVyID0gZ2VuZXJpY19iaWdudW1fdG9faW50NjQgKCk7Ci0JICBzbWFsbCA9IDE7Ci0JfQotI2VuZGlmCi0gICAgICBlbHNlCi0JewotCSAgc21hbGwgPSAwOwotCSAgbnVtYmVyID0gbnVtX2xpdHRsZV9kaWdpdHM7IC8qIG51bWJlciBvZiBsaXR0bGVudW1zIGluIHRoZSBiaWdudW0uICovCi0JfQotICAgIH0KLSAgZWxzZSBpZiAoIXNtYWxsKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiB3ZSBzYXcgYSBsb3Qgb2YgZGlnaXRzLiBtYW51ZmFjdHVyZSBhIGJpZ251bSB0aGUgaGFyZCB3YXkuCi0gICAgICAgKi8KLSAgICAgIExJVFRMRU5VTV9UWVBFICpsZWFkZXI7CS8qLT5oaWdoIG9yZGVyIGxpdHRsZW51bSBvZiB0aGUgYmlnbnVtLiAqLwotICAgICAgTElUVExFTlVNX1RZUEUgKnBvaW50ZXI7CS8qLT5saXR0bGVudW0gd2UgYXJlIGZyb2JiaW5nIG5vdy4gKi8KLSAgICAgIGxvbmcgY2Fycnk7Ci0KLSAgICAgIGxlYWRlciA9IGdlbmVyaWNfYmlnbnVtOwotICAgICAgZ2VuZXJpY19iaWdudW1bMF0gPSAwOwotICAgICAgZ2VuZXJpY19iaWdudW1bMV0gPSAwOwotICAgICAgZ2VuZXJpY19iaWdudW1bMl0gPSAwOwotICAgICAgZ2VuZXJpY19iaWdudW1bM10gPSAwOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7CS8qLT4xc3QgZGlnaXQuICovCi0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgZm9yICg7Ci0JICAgKGNhcnJ5ID0gaGV4X3ZhbHVlIChjKSkgPCBtYXhkaWc7Ci0JICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykKLQl7Ci0JICBmb3IgKHBvaW50ZXIgPSBnZW5lcmljX2JpZ251bTsKLQkgICAgICAgcG9pbnRlciA8PSBsZWFkZXI7Ci0JICAgICAgIHBvaW50ZXIrKykKLQkgICAgewotCSAgICAgIGxvbmcgd29yazsKLQotCSAgICAgIHdvcmsgPSBjYXJyeSArIHJhZGl4ICogKnBvaW50ZXI7Ci0JICAgICAgKnBvaW50ZXIgPSB3b3JrICYgTElUVExFTlVNX01BU0s7Ci0JICAgICAgY2FycnkgPSB3b3JrID4+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgICAgfQotCSAgaWYgKGNhcnJ5KQotCSAgICB7Ci0JICAgICAgaWYgKGxlYWRlciA8IGdlbmVyaWNfYmlnbnVtICsgU0laRV9PRl9MQVJHRV9OVU1CRVIgLSAxKQotCQl7Ci0JCSAgLyogcm9vbSB0byBncm93IGEgbG9uZ2VyIGJpZ251bS4gKi8KLQkJICAqKytsZWFkZXIgPSBjYXJyeTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgLyogYWdhaW4sIGMgaXMgY2hhciBhZnRlciBudW1iZXIsICovCi0gICAgICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPmFmdGVyIGMuICovCi0gICAgICBrbm93IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgPT0gMTYpOwotICAgICAgaWYgKGxlYWRlciA8IGdlbmVyaWNfYmlnbnVtICsgMikKLQl7Ci0JICAvKiB3aWxsIGZpdCBpbnRvIDMyIGJpdHMuICovCi0JICBudW1iZXIgPSBnZW5lcmljX2JpZ251bV90b19pbnQzMiAoKTsKLQkgIHNtYWxsID0gMTsKLQl9Ci0jaWZkZWYgQkZENjQKLSAgICAgIGVsc2UgaWYgKGxlYWRlciA8IGdlbmVyaWNfYmlnbnVtICsgNCkKLQl7Ci0JICAvKiBXaWxsIGZpdCBpbnRvIDY0IGJpdHMuICAqLwotCSAgbnVtYmVyID0gZ2VuZXJpY19iaWdudW1fdG9faW50NjQgKCk7Ci0JICBzbWFsbCA9IDE7Ci0JfQotI2VuZGlmCi0gICAgICBlbHNlCi0JewotCSAgbnVtYmVyID0gbGVhZGVyIC0gZ2VuZXJpY19iaWdudW0gKyAxOwkvKiBudW1iZXIgb2YgbGl0dGxlbnVtcyBpbiB0aGUgYmlnbnVtLiAqLwotCX0KLSAgICB9Ci0KLSAgaWYgKGZsYWdfbTY4a19tcmkgJiYgc3VmZml4ICE9IE5VTEwgJiYgaW5wdXRfbGluZV9wb2ludGVyIC0gMSA9PSBzdWZmaXgpCi0gICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotICBpZiAoc21hbGwpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIGhlcmUgd2l0aCBudW1iZXIsIGluIGNvcnJlY3QgcmFkaXguIGMgaXMgdGhlIG5leHQgY2hhci4KLSAgICAgICAqIG5vdGUgdGhhdCB1bmxpa2UgdW4qeCwgd2UgYWxsb3cgIjAxMWYiICIweDlmIiB0bwotICAgICAgICogYm90aCBtZWFuIHRoZSBzYW1lIGFzIHRoZSAoY29udmVudGlvbmFsKSAiOWYiLiB0aGlzIGlzIHNpbXBseSBlYXNpZXIKLSAgICAgICAqIHRoYW4gY2hlY2tpbmcgZm9yIHN0cmljdCBjYW5vbmljYWwgZm9ybS4gc3ludGF4IHN1eCEKLSAgICAgICAqLwotCi0gICAgICBpZiAoTE9DQUxfTEFCRUxTX0ZCICYmIGMgPT0gJ2InKQotCXsKLQkgIC8qCi0JICAgKiBiYWNrd2FyZCByZWYgdG8gbG9jYWwgbGFiZWwuCi0JICAgKiBiZWNhdXNlIGl0IGlzIGJhY2t3YXJkLCBleHBlY3QgaXQgdG8gYmUgZGVmaW5lZC4KLQkgICAqLwotCSAgLyogQ29uc3RydWN0IGEgbG9jYWwgbGFiZWwuICAqLwotCSAgbmFtZSA9IGZiX2xhYmVsX25hbWUgKChpbnQpIG51bWJlciwgMCk7Ci0KLQkgIC8qIHNlZW4gYmVmb3JlLCBvciBzeW1ib2wgaXMgZGVmaW5lZDogb2sgKi8KLQkgIHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0JICBpZiAoKHN5bWJvbFAgIT0gTlVMTCkgJiYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpKQotCSAgICB7Ci0JICAgICAgLyogbG9jYWwgbGFiZWxzIGFyZSBuZXZlciBhYnNvbHV0ZS4gZG9uJ3Qgd2FzdGUgdGltZQotCQkgY2hlY2tpbmcgYWJzb2x1dGVuZXNzLiAqLwotCSAgICAgIGtub3cgKFNFR19OT1JNQUwgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApKSk7Ci0KLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBlaXRoZXIgbm90IHNlZW4gb3Igbm90IGRlZmluZWQuICovCi0JICAgICAgLyogQEAgU2hvdWxkIHByaW50IG91dCB0aGUgb3JpZ2luYWwgc3RyaW5nIGluc3RlYWQgb2YKLQkJIHRoZSBwYXJzZWQgbnVtYmVyLiAgKi8KLQkgICAgICBhc19iYWQgKF8oImJhY2t3LiByZWYgdG8gdW5rbm93biBsYWJlbCBcIiVkOlwiLCAwIGFzc3VtZWQuIiksCi0JCSAgICAgIChpbnQpIG51bWJlcik7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICB9Ci0KLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCX0JCQkvKiBjYXNlICdiJyAqLwotICAgICAgZWxzZSBpZiAoTE9DQUxfTEFCRUxTX0ZCICYmIGMgPT0gJ2YnKQotCXsKLQkgIC8qCi0JICAgKiBmb3J3YXJkIHJlZmVyZW5jZS4gZXhwZWN0IHN5bWJvbCB0byBiZSB1bmRlZmluZWQgb3IKLQkgICAqIHVua25vd24uIHVuZGVmaW5lZDogc2VlbiBpdCBiZWZvcmUuIHVua25vd246IG5ldmVyIHNlZW4KLQkgICAqIGl0IGJlZm9yZS4KLQkgICAqIGNvbnN0cnVjdCBhIGxvY2FsIGxhYmVsIG5hbWUsIHRoZW4gYW4gdW5kZWZpbmVkIHN5bWJvbC4KLQkgICAqIGRvbid0IGNyZWF0ZSBhIHhzZWcgZnJhZyBmb3IgaXQ6IGNhbGxlciBtYXkgZG8gdGhhdC4KLQkgICAqIGp1c3QgcmV0dXJuIGl0IGFzIG5ldmVyIHNlZW4gYmVmb3JlLgotCSAgICovCi0JICBuYW1lID0gZmJfbGFiZWxfbmFtZSAoKGludCkgbnVtYmVyLCAxKTsKLQkgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQkgIC8qIHdlIGhhdmUgbm8gbmVlZCB0byBjaGVjayBzeW1ib2wgcHJvcGVydGllcy4gKi8KLSNpZm5kZWYgbWFueV9zZWdtZW50cwotCSAgLyogc2luY2UgImtub3ciIHB1dHMgaXRzIGFyZyBpbnRvIGEgInN0cmluZyIsIHdlCi0JICAgICBjYW4ndCBoYXZlIG5ld2xpbmVzIGluIHRoZSBhcmd1bWVudC4gICovCi0JICBrbm93IChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSB1bmRlZmluZWRfc2VjdGlvbiB8fCBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSB0ZXh0X3NlY3Rpb24gfHwgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gZGF0YV9zZWN0aW9uKTsKLSNlbmRpZgotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JfQkJCS8qIGNhc2UgJ2YnICovCi0gICAgICBlbHNlIGlmIChMT0NBTF9MQUJFTFNfRE9MTEFSICYmIGMgPT0gJyQnKQotCXsKLQkgIC8qIElmIHRoZSBkb2xsYXIgbGFiZWwgaXMgKmN1cnJlbnRseSogZGVmaW5lZCwgdGhlbiB0aGlzIGlzIGp1c3QKLQkgICAgIGFub3RoZXIgcmVmZXJlbmNlIHRvIGl0LiAgSWYgaXQgaXMgbm90ICpjdXJyZW50bHkqIGRlZmluZWQsCi0JICAgICB0aGVuIHRoaXMgaXMgYSBmcmVzaCBpbnN0YW50aWF0aW9uIG9mIHRoYXQgbnVtYmVyLCBzbyBjcmVhdGUKLQkgICAgIGl0LiAgKi8KLQotCSAgaWYgKGRvbGxhcl9sYWJlbF9kZWZpbmVkICgobG9uZykgbnVtYmVyKSkKLQkgICAgewotCSAgICAgIG5hbWUgPSBkb2xsYXJfbGFiZWxfbmFtZSAoKGxvbmcpIG51bWJlciwgMCk7Ci0JICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLQkgICAgICBrbm93IChzeW1ib2xQICE9IE5VTEwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gZG9sbGFyX2xhYmVsX25hbWUgKChsb25nKSBudW1iZXIsIDEpOwotCSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQkgICAgfQotCi0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbFA7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQl9CQkJLyogY2FzZSAnJCcgKi8KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0jaWZkZWYgVEFSR0VUX1dPUkRfU0laRQotCSAgLyogU2lnbiBleHRlbmQgTlVNQkVSLiAgKi8KLQkgIG51bWJlciB8PSAoLShudW1iZXIgPj4gKFRBUkdFVF9XT1JEX1NJWkUgLSAxKSkpIDw8IChUQVJHRVRfV09SRF9TSVpFIC0gMSk7Ci0jZW5kaWYKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSBudW1iZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsJLyogcmVzdG9yZSBmb2xsb3dpbmcgY2hhcmFjdGVyLiAqLwotCX0JCQkvKiByZWFsbHkganVzdCBhIG51bWJlciAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIG5vdCBhIHNtYWxsIG51bWJlciAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2JpZzsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSBudW1iZXI7CS8qIG51bWJlciBvZiBsaXR0bGVudW1zICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXItLTsJLyotPmNoYXIgZm9sbG93aW5nIG51bWJlci4gKi8KLSAgICB9Ci19Ci0KLS8qIFBhcnNlIGFuIE1SSSBtdWx0aSBjaGFyYWN0ZXIgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgdm9pZAotbXJpX2NoYXJfY29uc3RhbnQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCBpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycKLSAgICAgICYmIGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnXCcnKQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBJbiBvcmRlciB0byBnZXQgdGhlIGNvcnJlY3QgYnl0ZSBvcmRlcmluZywgd2UgbXVzdCBidWlsZCB0aGUKLSAgICAgbnVtYmVyIGluIHJldmVyc2UuICAqLwotICBmb3IgKGkgPSBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIGludCBqOwotCi0gICAgICBnZW5lcmljX2JpZ251bVtpXSA9IDA7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgQ0hBUlNfUEVSX0xJVFRMRU5VTTsgaisrKQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycpCi0JICAgIHsKLQkgICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICdcJycpCi0JCWJyZWFrOwotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0JICBnZW5lcmljX2JpZ251bVtpXSA8PD0gODsKLQkgIGdlbmVyaWNfYmlnbnVtW2ldICs9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0KLSAgICAgIGlmIChpIDwgU0laRV9PRl9MQVJHRV9OVU1CRVIgLSAxKQotCXsKLQkgIC8qIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgbGl0dGxlbnVtLCBsZWZ0IGp1c3RpZnkgdGhlCi0gICAgICAgICAgICAgbGFzdCBvbmUgdG8gbWFrZSBpdCBtYXRjaCB0aGUgZWFybGllciBvbmVzLiAgSWYgdGhlcmUgaXMKLSAgICAgICAgICAgICBvbmx5IG9uZSwgd2UgY2FuIGp1c3QgdXNlIHRoZSB2YWx1ZSBkaXJlY3RseS4gICovCi0JICBmb3IgKDsgaiA8IENIQVJTX1BFUl9MSVRUTEVOVU07IGorKykKLQkgICAgZ2VuZXJpY19iaWdudW1baV0gPDw9IDg7Ci0JfQotCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnCi0JICAmJiBpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJ1wnJykKLQlicmVhazsKLSAgICB9Ci0KLSAgaWYgKGkgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQ2hhcmFjdGVyIGNvbnN0YW50IHRvbyBsYXJnZSIpKTsKLSAgICAgIGkgPSAwOwotICAgIH0KLQotICBpZiAoaSA+IDApCi0gICAgewotICAgICAgaW50IGM7Ci0gICAgICBpbnQgajsKLQotICAgICAgYyA9IFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gaTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBjOyBqKyspCi0JZ2VuZXJpY19iaWdudW1bal0gPSBnZW5lcmljX2JpZ251bVtpICsgal07Ci0gICAgICBpID0gYzsKLSAgICB9Ci0KLSAga25vdyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTID09IDE2KTsKLSAgaWYgKGkgPiAyKQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19iaWc7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gaTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBpZiAoaSA8IDIpCi0JZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IGdlbmVyaWNfYmlnbnVtWzBdICYgTElUVExFTlVNX01BU0s7Ci0gICAgICBlbHNlCi0JZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9Ci0JICAoKChnZW5lcmljX2JpZ251bVsxXSAmIExJVFRMRU5VTV9NQVNLKQotCSAgICA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgfCAoZ2VuZXJpY19iaWdudW1bMF0gJiBMSVRUTEVOVU1fTUFTSykpOwotICAgIH0KLQotICAvKiBTa2lwIHRoZSBmaW5hbCBjbG9zaW5nIHF1b3RlLiAgKi8KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLS8qIFJldHVybiBhbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBsb2NhdGlvbi4gIFRoaXMKLSAgIGhhbmRsZXMgdGhlIG1hZ2ljIHN5bWJvbCBgLicuICAqLwotCi1zdGF0aWMgdm9pZAotY3VycmVudF9sb2NhdGlvbiAoZXhwcmVzc2lvbnApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9ucDsKLXsKLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBleHByZXNzaW9ucC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHByZXNzaW9ucC0+WF9hZGRfbnVtYmVyID0gYWJzX3NlY3Rpb25fb2Zmc2V0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bWJvbHA7Ci0KLSAgICAgIHN5bWJvbHAgPSBzeW1ib2xfbmV3IChGQUtFX0xBQkVMX05BTUUsIG5vd19zZWcsCi0JCQkgICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJICAgIGZyYWdfbm93KTsKLSAgICAgIGV4cHJlc3Npb25wLT5YX29wID0gT19zeW1ib2w7Ci0gICAgICBleHByZXNzaW9ucC0+WF9hZGRfc3ltYm9sID0gc3ltYm9scDsKLSAgICAgIGV4cHJlc3Npb25wLT5YX2FkZF9udW1iZXIgPSAwOwotICAgIH0KLX0KLQotLyoKLSAqIFN1bW1hcnkgb2Ygb3BlcmFuZCgpLgotICoKLSAqIGluOglJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQsIHdoaWNoIG1heQotICoJYmUgYSBzcGFjZS4KLSAqCi0gKiBvdXQ6CUEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGVtcHR5OiBpbiB0aGlzIGNhc2UgWF9vcCA9PSBPX2Fic2VudC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQuCi0gKi8KLQotc3RhdGljIHNlZ1QKLW9wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGNoYXIgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsJLyogcG9pbnRzIHRvIHN5bWJvbCAqLwotICBjaGFyICpuYW1lOwkJLyogcG9pbnRzIHRvIG5hbWUgb2Ygc3ltYm9sICovCi0gIHNlZ1Qgc2VnbWVudDsKLQotICAvKiBBbGwgaW50ZWdlcnMgYXJlIHJlZ2FyZGVkIGFzIHVuc2lnbmVkIHVubGVzcyB0aGV5IGFyZSBuZWdhdGVkLgotICAgICBUaGlzIGlzIGJlY2F1c2UgdGhlIG9ubHkgdGhpbmcgd2hpY2ggY2FyZXMgd2hldGhlciBhIG51bWJlciBpcwotICAgICB1bnNpZ25lZCBpcyB0aGUgY29kZSBpbiBlbWl0X2V4cHIgd2hpY2ggZXh0ZW5kcyBjb25zdGFudHMgaW50bwotICAgICBiaWdudW1zLiAgSXQgc2hvdWxkIG9ubHkgc2lnbiBleHRlbmQgbmVnYXRpdmUgbnVtYmVycywgc28gdGhhdAotICAgICBzb21ldGhpbmcgbGlrZSBgYC5xdWFkIDB4ODAwMDAwMDAnJyBpcyBub3Qgc2lnbiBleHRlbmRlZCBldmVuCi0gICAgIHRob3VnaCBpdCBhcHBlYXJzIG5lZ2F0aXZlIGlmIHZhbHVlVCBpcyAzMiBiaXRzLiAgKi8KLSAgZXhwcmVzc2lvblAtPlhfdW5zaWduZWQgPSAxOwotCi0gIC8qIGRpZ2l0cywgYXNzdW1lIGl0IGlzIGEgYmlnbnVtLiAqLwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsJCS8qIGxlYWRpbmcgd2hpdGVzcGFjZSBpcyBwYXJ0IG9mIG9wZXJhbmQuICovCi0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7CS8qIGlucHV0X2xpbmVfcG9pbnRlci0+cGFzdCBjaGFyIGluIGMuICovCi0KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc3JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICc5JzoKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCi0gICAgICBpbnRlZ2VyX2NvbnN0YW50IChmbGFnX202OGtfbXJpID8gMCA6IDEwLCBleHByZXNzaW9uUCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzAnOgotICAgICAgLyogbm9uLWRlY2ltYWwgcmFkaXggKi8KLQotICAgICAgaWYgKGZsYWdfbTY4a19tcmkpCi0JewotCSAgY2hhciAqczsKLQotCSAgLyogQ2hlY2sgZm9yIGEgaGV4IGNvbnN0YW50LiAgKi8KLQkgIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlcjsgaGV4X3AgKCpzKTsgcysrKQotCSAgICA7Ci0JICBpZiAoKnMgPT0gJ2gnIHx8ICpzID09ICdIJykKLQkgICAgewotCSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGludGVnZXJfY29uc3RhbnQgKDAsIGV4cHJlc3Npb25QKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ28nOgotCWNhc2UgJ08nOgotCWNhc2UgJ3EnOgotCWNhc2UgJ1EnOgotCWNhc2UgJzgnOgotCWNhc2UgJzknOgotCSAgaWYgKGZsYWdfbTY4a19tcmkpCi0JICAgIHsKLQkgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgwLCBleHByZXNzaW9uUCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JZGVmYXVsdDoKLQlkZWZhdWx0X2Nhc2U6Ci0JICBpZiAoYyAmJiBzdHJjaHIgKEZMVF9DSEFSUywgYykpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICBmbG9hdGluZ19jb25zdGFudCAoZXhwcmVzc2lvblApOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPQotCQktIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgYykgPyB0b2xvd2VyIChjKSA6IGMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGUgc3RyaW5nIHdhcyBvbmx5IHplcm8gKi8KLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlICd4JzoKLQljYXNlICdYJzoKLQkgIGlmIChmbGFnX202OGtfbXJpKQotCSAgICBnb3RvIGRlZmF1bHRfY2FzZTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgaW50ZWdlcl9jb25zdGFudCAoMTYsIGV4cHJlc3Npb25QKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYic6Ci0JICBpZiAoTE9DQUxfTEFCRUxTX0ZCICYmICEgZmxhZ19tNjhrX21yaSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgY29kZSB1c2VkIHRvIGNoZWNrIGZvciAnKycgYW5kICctJyBoZXJlLCBhbmQsIGluCi0JCSBzb21lIGNvbmRpdGlvbnMsIGZhbGwgdGhyb3VnaCB0byBjYWxsCi0JCSBpbnRlZ2VyX2NvbnN0YW50LiAgSG93ZXZlciwgdGhhdCBkaWRuJ3QgbWFrZSBzZW5zZSwKLQkJIGFzIGludGVnZXJfY29uc3RhbnQgb25seSBhY2NlcHRzIGRpZ2l0cy4gICovCi0JICAgICAgLyogU29tZSBvZiBvdXIgY29kZSBlbHNld2hlcmUgZG9lcyBwZXJtaXQgZGlnaXRzIGdyZWF0ZXIKLQkJIHRoYW4gdGhlIGV4cGVjdGVkIGJhc2U7IGZvciBjb25zaXN0ZW5jeSwgZG8gdGhlIHNhbWUKLQkJIGhlcmUuICAqLwotCSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gPCAnMCcKLQkJICB8fCBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPiAnOScpCi0JCXsKLQkJICAvKiBQYXJzZSB0aGlzIGFzIGEgYmFjayByZWZlcmVuY2UgdG8gbGFiZWwgMC4gICovCi0JCSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JCSAgaW50ZWdlcl9jb25zdGFudCAoMTAsIGV4cHJlc3Npb25QKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIC8qIE90aGVyd2lzZSwgcGFyc2UgdGhpcyBhcyBhIGJpbmFyeSBudW1iZXIuICAqLwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgJ0InOgotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBpZiAoZmxhZ19tNjhrX21yaSkKLQkgICAgZ290byBkZWZhdWx0X2Nhc2U7Ci0JICBpbnRlZ2VyX2NvbnN0YW50ICgyLCBleHByZXNzaW9uUCk7Ci0JICBicmVhazsKLQotCWNhc2UgJzAnOgotCWNhc2UgJzEnOgotCWNhc2UgJzInOgotCWNhc2UgJzMnOgotCWNhc2UgJzQnOgotCWNhc2UgJzUnOgotCWNhc2UgJzYnOgotCWNhc2UgJzcnOgotCSAgaW50ZWdlcl9jb25zdGFudCAoZmxhZ19tNjhrX21yaSA/IDAgOiA4LCBleHByZXNzaW9uUCk7Ci0JICBicmVhazsKLQotCWNhc2UgJ2YnOgotCSAgaWYgKExPQ0FMX0xBQkVMU19GQikKLQkgICAgewotCSAgICAgIC8qIElmIGl0IHNheXMgIjBmIiBhbmQgaXQgY291bGQgcG9zc2libHkgYmUgYSBmbG9hdGluZyBwb2ludAotCQkgbnVtYmVyLCBtYWtlIGl0IG9uZS4gIE90aGVyd2lzZSwgbWFrZSBpdCBhIGxvY2FsIGxhYmVsLAotCQkgYW5kIHRyeSB0byBkZWFsIHdpdGggcGFyc2luZyB0aGUgcmVzdCBsYXRlci4gICovCi0JICAgICAgaWYgKCFpbnB1dF9saW5lX3BvaW50ZXJbMV0KLQkJICB8fCAoaXNfZW5kX29mX2xpbmVbMHhmZiAmIGlucHV0X2xpbmVfcG9pbnRlclsxXV0pKQotCQlnb3RvIGlzXzBmX2xhYmVsOwotCSAgICAgIHsKLQkJY2hhciAqY3AgPSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxOwotCQlpbnQgciA9IGF0b2ZfZ2VuZXJpYyAoJmNwLCAiLiIsIEVYUF9DSEFSUywKLQkJCQkgICAgICAmZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpOwotCQlzd2l0Y2ggKHIpCi0JCSAgewotCQkgIGNhc2UgMDoKLQkJICBjYXNlIEVSUk9SX0VYUE9ORU5UX09WRVJGTE9XOgotCQkgICAgaWYgKCpjcCA9PSAnZicgfHwgKmNwID09ICdiJykKLQkJICAgICAgLyogbG9va3MgbGlrZSBhIGRpZmZlcmVuY2UgZXhwcmVzc2lvbiAqLwotCQkgICAgICBnb3RvIGlzXzBmX2xhYmVsOwotCQkgICAgZWxzZSBpZiAoY3AgPT0gaW5wdXRfbGluZV9wb2ludGVyICsgMSkKLQkJICAgICAgLyogTm8gY2hhcmFjdGVycyBoYXMgYmVlbiBhY2NlcHRlZCAtLSBsb29rcyBsaWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZW5kIG9mIG9wZXJhbmQuICovCi0JCSAgICAgIGdvdG8gaXNfMGZfbGFiZWw7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGdvdG8gaXNfMGZfZmxvYXQ7Ci0JCSAgZGVmYXVsdDoKLQkJICAgIGFzX2ZhdGFsIChfKCJleHByLmMob3BlcmFuZCk6IGJhZCBhdG9mX2dlbmVyaWMgcmV0dXJuIHZhbCAlZCIpLAotCQkJICAgICAgcik7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAgIC8qIE9rYXksIG5vdyB3ZSd2ZSBzb3J0ZWQgaXQgb3V0LiAgV2UgcmVzdW1lIGF0IG9uZSBvZiB0aGVzZQotCQkgdHdvIGxhYmVscywgZGVwZW5kaW5nIG9uIHdoYXQgd2UndmUgZGVjaWRlZCB3ZSdyZSBwcm9iYWJseQotCQkgbG9va2luZyBhdC4gICovCi0JICAgIGlzXzBmX2xhYmVsOgotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCSAgICAgIGludGVnZXJfY29uc3RhbnQgKDEwLCBleHByZXNzaW9uUCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgaXNfMGZfZmxvYXQ6Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0JICAgICAgOwotCSAgICB9Ci0KLQljYXNlICdkJzoKLQljYXNlICdEJzoKLQkgIGlmIChmbGFnX202OGtfbXJpKQotCSAgICB7Ci0JICAgICAgaW50ZWdlcl9jb25zdGFudCAoMCwgZXhwcmVzc2lvblApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgJ0YnOgotCWNhc2UgJ3InOgotCWNhc2UgJ2UnOgotCWNhc2UgJ0UnOgotCWNhc2UgJ2cnOgotCWNhc2UgJ0cnOgotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBmbG9hdGluZ19jb25zdGFudCAoZXhwcmVzc2lvblApOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9Ci0JICAgIC0gKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSA/IHRvbG93ZXIgKGMpIDogYyk7Ci0JICBicmVhazsKLQotCWNhc2UgJyQnOgotCSAgaWYgKExPQ0FMX0xBQkVMU19ET0xMQVIpCi0JICAgIHsKLQkgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgxMCwgZXhwcmVzc2lvblApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGdvdG8gZGVmYXVsdF9jYXNlOwotCX0KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcoJzoKLSNpZm5kZWYgTkVFRF9JTkRFWF9PUEVSQVRPUgotICAgIGNhc2UgJ1snOgotI2VuZGlmCi0gICAgICAvKiBkaWRuJ3QgYmVnaW4gd2l0aCBkaWdpdCAmIG5vdCBhIG5hbWUgKi8KLSAgICAgIHNlZ21lbnQgPSBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgICAvKiBFeHByZXNzaW9uKCkgd2lsbCBwYXNzIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KLSAgICAgIGlmICgoYyA9PSAnKCcgJiYgKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICcpJykKLQkgIHx8IChjID09ICdbJyAmJiAqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJ10nKSkKLQl7Ci0JICBhc19iYWQgKF8oIk1pc3NpbmcgJyknIGFzc3VtZWQiKSk7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQl9Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICAvKiBoZXJlIHdpdGggaW5wdXRfbGluZV9wb2ludGVyLT5jaGFyIGFmdGVyICIoLi4uKSIgKi8KLSAgICAgIHJldHVybiBzZWdtZW50OwotCi0gICAgY2FzZSAnRSc6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wnJykKLQlnb3RvIGRlX2ZhdWx0OwotICAgICAgYXNfYmFkIChfKCJFQkNESUMgY29uc3RhbnRzIGFyZSBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICdBJzoKLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCcnKQotCWdvdG8gZGVfZmF1bHQ7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSAnXCcnOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQl7Ci0JICAvKiBXYXJuaW5nOiB0byBjb25mb3JtIHRvIG90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMgTk8KLQkgICAgIEVTQ0FQRU1FTlQgaXMgcGVybWl0dGVkIGZvciBhIHNpbmdsZSBxdW90ZS4gVGhlIG5leHQKLQkgICAgIGNoYXJhY3RlciwgcGFyaXR5IGVycm9ycyBhbmQgYWxsLCBpcyB0YWtlbiBhcyB0aGUgdmFsdWUKLQkgICAgIG9mIHRoZSBvcGVyYW5kLiBWRVJZIEtJTktZLiAgKi8KLQkgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIG1yaV9jaGFyX2NvbnN0YW50IChleHByZXNzaW9uUCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJysnOgotICAgICAgKHZvaWQpIG9wZXJhbmQgKGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnIic6Ci0gICAgICAvKiBEb3VibGUgcXVvdGUgaXMgdGhlIGJpdHdpc2Ugbm90IG9wZXJhdG9yIGluIE1SSSBtb2RlLiAgKi8KLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkpCi0JZ290byBkZV9mYXVsdDsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSAnfic6Ci0gICAgICAvKiB+IGlzIHBlcm1pdHRlZCB0byBzdGFydCBhIGxhYmVsIG9uIHRoZSBEZWx0YS4gICovCi0gICAgICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoYykpCi0JZ290byBpc25hbWU7Ci0gICAgY2FzZSAnISc6Ci0gICAgY2FzZSAnLSc6Ci0gICAgICB7Ci0Jb3BlcmFuZCAoZXhwcmVzc2lvblApOwotCWlmIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgewotCSAgICAvKiBpbnB1dF9saW5lX3BvaW50ZXIgLT4gY2hhciBhZnRlciBvcGVyYW5kICovCi0JICAgIGlmIChjID09ICctJykKLQkgICAgICB7Ci0JCWV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAtIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXI7Ci0JCS8qIE5vdGljZTogJy0nIG1heSBvdmVyZmxvdzogbm8gd2FybmluZyBpcyBnaXZlbi4gVGhpcyBpcwotCQkgICBjb21wYXRpYmxlIHdpdGggb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycy4gU2lnaC4gICovCi0JCWV4cHJlc3Npb25QLT5YX3Vuc2lnbmVkID0gMDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKGMgPT0gJ34nIHx8IGMgPT0gJyInKQotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSB+IGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXI7Ci0JICAgIGVsc2UKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gISBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyOwotCSAgfQotCWVsc2UgaWYgKGV4cHJlc3Npb25QLT5YX29wICE9IE9faWxsZWdhbAotCQkgJiYgZXhwcmVzc2lvblAtPlhfb3AgIT0gT19hYnNlbnQpCi0JICB7Ci0JICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sIChleHByZXNzaW9uUCk7Ci0JICAgIGlmIChjID09ICctJykKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fdW1pbnVzOwotCSAgICBlbHNlIGlmIChjID09ICd+JyB8fCBjID09ICciJykKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fYml0X25vdDsKLQkgICAgZWxzZQotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19sb2dpY2FsX25vdDsKLQkgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JICB9Ci0JZWxzZQotCSAgYXNfd2FybiAoXygiVW5hcnkgb3BlcmF0b3IgJWMgaWdub3JlZCBiZWNhdXNlIGJhZCBvcGVyYW5kIGZvbGxvd3MiKSwKLQkJICAgYyk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyQnOgotICAgICAgLyogJCBpcyB0aGUgcHJvZ3JhbSBjb3VudGVyIHdoZW4gaW4gTVJJIG1vZGUsIG9yIHdoZW4gRE9MTEFSX0RPVAotICAgICAgICAgaXMgZGVmaW5lZC4gICovCi0jaWZuZGVmIERPTExBUl9ET1QKLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkpCi0JZ290byBkZV9mYXVsdDsKLSNlbmRpZgotICAgICAgaWYgKGZsYWdfbTY4a19tcmkgJiYgaGV4X3AgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotCXsKLQkgIC8qIEluIE1SSSBtb2RlLCAkIGlzIGFsc28gdXNlZCBhcyB0aGUgcHJlZml4IGZvciBhCi0gICAgICAgICAgICAgaGV4YWRlY2ltYWwgY29uc3RhbnQuICAqLwotCSAgaW50ZWdlcl9jb25zdGFudCAoMTYsIGV4cHJlc3Npb25QKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGlzX3BhcnRfb2ZfbmFtZSAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JZ290byBpc25hbWU7Ci0KLSAgICAgIGN1cnJlbnRfbG9jYXRpb24gKGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLic6Ci0gICAgICBpZiAoIWlzX3BhcnRfb2ZfbmFtZSAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JewotCSAgY3VycmVudF9sb2NhdGlvbiAoZXhwcmVzc2lvblApOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJzdGFydG9mLiIsIDgpID09IDAKLQkJJiYgISBpc19wYXJ0X29mX25hbWUgKGlucHV0X2xpbmVfcG9pbnRlcls4XSkpCi0JICAgICAgIHx8IChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAic2l6ZW9mLiIsIDcpID09IDAKLQkJICAgJiYgISBpc19wYXJ0X29mX25hbWUgKGlucHV0X2xpbmVfcG9pbnRlcls3XSkpKQotCXsKLQkgIGludCBzdGFydDsKLQotCSAgc3RhcnQgPSAoaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICd0JwotCQkgICB8fCBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ1QnKTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSBzdGFydCA/IDggOiA3OwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJygnKQotCSAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiAuc3RhcnRvZi4gb3IgLnNpemVvZi4iKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICpidWY7Ci0KLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMTApOwotCSAgICAgIGlmIChzdGFydCkKLQkJc3ByaW50ZiAoYnVmLCAiLnN0YXJ0b2YuJXMiLCBuYW1lKTsKLQkgICAgICBlbHNlCi0JCXNwcmludGYgKGJ1ZiwgIi5zaXplb2YuJXMiLCBuYW1lKTsKLQkgICAgICBzeW1ib2xQID0gc3ltYm9sX21ha2UgKGJ1Zik7Ci0JICAgICAgZnJlZSAoYnVmKTsKLQotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbFA7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyknKQotCQlhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiAuc3RhcnRvZi4gb3IgLnNpemVvZi4iKSk7Ci0JICAgICAgZWxzZQotCQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGdvdG8gaXNuYW1lOwotCX0KLSAgICBjYXNlICcsJzoKLSAgICBjYXNlICdcbic6Ci0gICAgY2FzZSAnXDAnOgotICAgIGVvbDoKLSAgICAgIC8qIGNhbid0IGltYWdpbmUgYW55IG90aGVyIGtpbmQgb2Ygb3BlcmFuZCAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2Fic2VudDsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICclJzoKLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkpCi0JZ290byBkZV9mYXVsdDsKLSAgICAgIGludGVnZXJfY29uc3RhbnQgKDIsIGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQCc6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpKQotCWdvdG8gZGVfZmF1bHQ7Ci0gICAgICBpbnRlZ2VyX2NvbnN0YW50ICg4LCBleHByZXNzaW9uUCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzonOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQlnb3RvIGRlX2ZhdWx0OwotCi0gICAgICAvKiBJbiBNUkkgbW9kZSwgdGhpcyBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IHJlcHJlc2VudGVkCi0gICAgICAgICB1c2luZyBoZXhhZGVjaW1hbCBkaWdpdHMuICAqLwotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGludGVnZXJfY29uc3RhbnQgKDE2LCBleHByZXNzaW9uUCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyonOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSB8fCBpc19wYXJ0X29mX25hbWUgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotCWdvdG8gZGVfZmF1bHQ7Ci0KLSAgICAgIGN1cnJlbnRfbG9jYXRpb24gKGV4cHJlc3Npb25QKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICBkZV9mYXVsdDoKLSAgICAgIGlmIChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgY10pCi0JZ290byBlb2w7Ci0gICAgICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoYykpCS8qIGhlcmUgaWYgZGlkIG5vdCBiZWdpbiB3aXRoIGEgZGlnaXQgKi8KLQl7Ci0JICAvKgotCSAgICogSWRlbnRpZmllciBiZWdpbnMgaGVyZS4KLQkgICAqIFRoaXMgaXMga2x1ZGdlZCBmb3Igc3BlZWQsIHNvIGNvZGUgaXMgcmVwZWF0ZWQuCi0JICAgKi8KLQlpc25hbWU6Ci0JICBuYW1lID0gLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSNpZmRlZiBtZF9wYXJzZV9uYW1lCi0JICAvKiBUaGlzIGlzIGEgaG9vayBmb3IgdGhlIGJhY2tlbmQgdG8gcGFyc2UgY2VydGFpbiBuYW1lcwotICAgICAgICAgICAgIHNwZWNpYWxseSBpbiBjZXJ0YWluIGNvbnRleHRzLiAgSWYgYSBuYW1lIGFsd2F5cyBoYXMgYQotICAgICAgICAgICAgIHNwZWNpZmljIHZhbHVlLCBpdCBjYW4gb2Z0ZW4gYmUgaGFuZGxlZCBieSBzaW1wbHkKLSAgICAgICAgICAgICBlbnRlcmluZyBpdCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQkgIGlmIChtZF9wYXJzZV9uYW1lIChuYW1lLCBleHByZXNzaW9uUCkpCi0JICAgIHsKLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBicmVhazsKLQkgICAgfQotI2VuZGlmCi0KLSNpZmRlZiBUQ19JOTYwCi0JICAvKiBUaGUgTVJJIGk5NjAgYXNzZW1ibGVyIHBlcm1pdHMKLQkgICAgICAgICBsZGEgc2l6ZW9mIGNvZGUsZzEzCi0JICAgICBGSVhNRTogVGhpcyBzaG91bGQgdXNlIG1kX3BhcnNlX25hbWUuICAqLwotCSAgaWYgKGZsYWdfbXJpCi0JICAgICAgJiYgKHN0cmNhc2VjbXAgKG5hbWUsICJzaXplb2YiKSA9PSAwCi0JCSAgfHwgc3RyY2FzZWNtcCAobmFtZSwgInN0YXJ0b2YiKSA9PSAwKSkKLQkgICAgewotCSAgICAgIGludCBzdGFydDsKLQkgICAgICBjaGFyICpidWY7Ci0KLQkgICAgICBzdGFydCA9IChuYW1lWzFdID09ICd0JwotCQkgICAgICAgfHwgbmFtZVsxXSA9PSAnVCcpOwotCi0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0JICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkgICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMTApOwotCSAgICAgIGlmIChzdGFydCkKLQkJc3ByaW50ZiAoYnVmLCAiLnN0YXJ0b2YuJXMiLCBuYW1lKTsKLQkgICAgICBlbHNlCi0JCXNwcmludGYgKGJ1ZiwgIi5zaXplb2YuJXMiLCBuYW1lKTsKLQkgICAgICBzeW1ib2xQID0gc3ltYm9sX21ha2UgKGJ1Zik7Ci0JICAgICAgZnJlZSAoYnVmKTsKLQotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbFA7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQkgICAgICAKLSNlbmRpZgotCi0JICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLQkgIC8qIElmIHdlIGhhdmUgYW4gYWJzb2x1dGUgc3ltYm9sIG9yIGEgcmVnLCB0aGVuIHdlIGtub3cgaXRzCi0JICAgICB2YWx1ZSBub3cuICAqLwotCSAgc2VnbWVudCA9IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApOwotCSAgaWYgKHNlZ21lbnQgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgICB9Ci0JICBlbHNlIGlmIChzZWdtZW50ID09IHJlZ19zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbFA7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JICAgIH0KLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBMZXQgdGhlIHRhcmdldCB0cnkgdG8gcGFyc2UgaXQuICBTdWNjZXNzIGlzIGluZGljYXRlZCBieSBjaGFuZ2luZwotCSAgICAgdGhlIFhfb3AgZmllbGQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gT19hYnNlbnQgYW5kIHBvaW50aW5nCi0JICAgICBpbnB1dF9saW5lX3BvaW50ZXIgcGFzc2VkIHRoZSBleHByZXNzaW9uLiAgSWYgaXQgY2FuJ3QgcGFyc2UgdGhlCi0JICAgICBleHByZXNzaW9uLCBYX29wIGFuZCBpbnB1dF9saW5lX3BvaW50ZXIgc2hvdWxkIGJlIHVuY2hhbmdlZC4gICovCi0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fYWJzZW50OwotCSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBtZF9vcGVyYW5kIChleHByZXNzaW9uUCk7Ci0JICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19hYnNlbnQpCi0JICAgIHsKLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBhc19iYWQgKF8oIkJhZCBleHByZXNzaW9uIikpOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKgotICAgKiBJdCBpcyBtb3JlICdlZmZpY2llbnQnIHRvIGNsZWFuIHVwIHRoZSBleHByZXNzaW9uUyB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuCi0gICAqIERvaW5nIGl0IGhlcmUgc2F2ZXMgbGluZXMgb2YgY29kZS4KLSAgICovCi0gIGNsZWFuX3VwX2V4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgU0tJUF9XSElURVNQQUNFICgpOwkJLyotPjFzdCBjaGFyIGFmdGVyIG9wZXJhbmQuICovCi0gIGtub3cgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyAnKTsKLQotICAvKiBUaGUgUEEgcG9ydCBuZWVkcyB0aGlzIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpCi0gICAgc3ltYm9sX21hcmtfdXNlZCAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCk7Ci0KLSAgc3dpdGNoIChleHByZXNzaW9uUC0+WF9vcCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBhYnNvbHV0ZV9zZWN0aW9uOwotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICByZXR1cm4gU19HRVRfU0VHTUVOVCAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCk7Ci0gICAgY2FzZSBPX3JlZ2lzdGVyOgotICAgICAgcmV0dXJuIHJlZ19zZWN0aW9uOwotICAgIH0KLX0JCQkJLyogb3BlcmFuZCgpICovCi0MCi0vKiBJbnRlcm5hbC4gU2ltcGxpZnkgYSBzdHJ1Y3QgZXhwcmVzc2lvbiBmb3IgdXNlIGJ5IGV4cHIoKSAqLwotCi0vKgotICogSW46CWFkZHJlc3Mgb2YgYSBleHByZXNzaW9uUy4KLSAqCVRoZSBYX29wIGZpZWxkIG9mIHRoZSBleHByZXNzaW9uUyBtYXkgb25seSB0YWtlIGNlcnRhaW4gdmFsdWVzLgotICoJRWxzZXdpc2Ugd2Ugd2FzdGUgdGltZSBzcGVjaWFsLWNhc2UgdGVzdGluZy4gU2lnaC4gRGl0dG8gU0VHX0FCU0VOVC4KLSAqIE91dDoJZXhwcmVzc2lvblMgbWF5IGhhdmUgYmVlbiBtb2RpZmllZDoKLSAqCSdmb28tZm9vJyBzeW1ib2wgcmVmZXJlbmNlcyBjYW5jZWxsZWQgdG8gMCwKLSAqCQl3aGljaCBjaGFuZ2VzIFhfb3AgZnJvbSBPX3N1YnRyYWN0IHRvIE9fY29uc3RhbnQuCi0gKglVbnVzZWQgZmllbGRzIHplcm9lZCB0byBoZWxwIGV4cHIoKS4KLSAqLwotCi1zdGF0aWMgdm9pZAotY2xlYW5fdXBfZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgc3dpdGNoIChleHByZXNzaW9uUC0+WF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2lsbGVnYWw6Ci0gICAgY2FzZSBPX2Fic2VudDoKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIE9fYmlnOgotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICBjYXNlIE9fdW1pbnVzOgotICAgIGNhc2UgT19iaXRfbm90OgotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19zdWJ0cmFjdDoKLSAgICAgIGlmIChleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPT0gZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbAotCSAgfHwgKChzeW1ib2xfZ2V0X2ZyYWcgKGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCkKLQkgICAgICAgPT0gc3ltYm9sX2dldF9mcmFnIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKSkKLQkgICAgICAmJiBTRUdfTk9STUFMIChTX0dFVF9TRUdNRU5UIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKSkKLQkgICAgICAmJiAoU19HRVRfVkFMVUUgKGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCkKLQkJICA9PSBTX0dFVF9WQUxVRSAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCkpKSkKLQl7Ci0JICBhZGRyZXNzVCBkaWZmID0gKFNfR0VUX1ZBTFVFIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKQotCQkJICAgLSBTX0dFVF9WQUxVRSAoZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sKSk7Ci0KLQkgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCSAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgKz0gZGlmZjsKLQl9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotLyogRXhwcmVzc2lvbiBwYXJzZXIuICovCi0KLS8qCi0gKiBXZSBhbGxvdyBhbiBlbXB0eSBleHByZXNzaW9uLCBhbmQganVzdCBhc3N1bWUgKGFic29sdXRlLDApIHNpbGVudGx5LgotICogVW5hcnkgb3BlcmF0b3JzIGFuZCBwYXJlbnRoZXRpY2FsIGV4cHJlc3Npb25zIGFyZSB0cmVhdGVkIGFzIG9wZXJhbmRzLgotICogQXMgdXN1YWwsIFE9PXF1YW50aXR5PT1vcGVyYW5kLCBPPT1vcGVyYXRvciwgWD09ZXhwcmVzc2lvbiBtbmVtb25pY3MuCi0gKgotICogV2UgdXNlZCB0byBkbyBhIGFoby91bGxtYW4gc2hpZnQtcmVkdWNlIHBhcnNlciwgYnV0IHRoZSBsb2dpYyBnb3Qgc28KLSAqIHdhcnBlZCB0aGF0IEkgZmx1c2hlZCBpdCBhbmQgd3JvdGUgYSByZWN1cnNpdmUtZGVzY2VudCBwYXJzZXIgaW5zdGVhZC4KLSAqIE5vdyB0aGluZ3MgYXJlIHN0YWJsZSwgd291bGQgYW55Ym9keSBsaWtlIHRvIHdyaXRlIGEgZmFzdCBwYXJzZXI/Ci0gKiBNb3N0IGV4cHJlc3Npb25zIGFyZSBlaXRoZXIgcmVnaXN0ZXIgKHdoaWNoIGRvZXMgbm90IGV2ZW4gcmVhY2ggaGVyZSkKLSAqIG9yIDEgc3ltYm9sLiBUaGVuICJzeW1ib2wrY29uc3RhbnQiIGFuZCAic3ltYm9sLXN5bWJvbCIgYXJlIGNvbW1vbi4KLSAqIFNvIEkgZ3Vlc3MgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyIGhvdyBpbmVmZmljaWVudCBtb3JlIGNvbXBsZXggZXhwcmVzc2lvbnMKLSAqIGFyZSBwYXJzZWQuCi0gKgotICogQWZ0ZXIgZXhwcihSQU5LLHJlc3VsdFApIGlucHV0X2xpbmVfcG9pbnRlci0+b3BlcmF0b3Igb2YgcmFuayA8PSBSQU5LLgotICogQWxzbywgd2UgaGF2ZSBjb25zdW1lZCBhbnkgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgKG9wZXJhbmQgZG9lcyB0aGF0KQotICogYW5kIGRvbmUgYWxsIGludGVydmVuaW5nIG9wZXJhdG9ycy4KLSAqCi0gKiBUaGlzIHJldHVybnMgdGhlIHNlZ21lbnQgb2YgdGhlIHJlc3VsdCwgd2hpY2ggd2lsbCBiZQotICogYWJzb2x1dGVfc2VjdGlvbiBvciB0aGUgc2VnbWVudCBvZiBhIHN5bWJvbC4KLSAqLwotCi0jdW5kZWYgX18KLSNkZWZpbmUgX18gT19pbGxlZ2FsCi0KLXN0YXRpYyBjb25zdCBvcGVyYXRvclQgb3BfZW5jb2RpbmdbMjU2XSA9Ci17CQkJCS8qIG1hcHMgQVNDSUktPm9wZXJhdG9ycyAqLwotCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLQotICBfXywgT19iaXRfb3Jfbm90LCBfXywgX18sIF9fLCBPX21vZHVsdXMsIE9fYml0X2FuZCwgX18sCi0gIF9fLCBfXywgT19tdWx0aXBseSwgT19hZGQsIF9fLCBPX3N1YnRyYWN0LCBfXywgT19kaXZpZGUsCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIE9fbHQsIF9fLCBPX2d0LCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywKLSNpZmRlZiBORUVEX0lOREVYX09QRVJBVE9SCi0gIE9faW5kZXgsCi0jZWxzZQotICBfXywKLSNlbmRpZgotICBfXywgX18sIE9fYml0X2V4Y2x1c2l2ZV9vciwgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBPX2JpdF9pbmNsdXNpdmVfb3IsIF9fLCBfXywgX18sCi0KLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fCi19OwotCi0KLS8qCi0gKglSYW5rCUV4YW1wbGVzCi0gKgkwCW9wZXJhbmQsIChleHByZXNzaW9uKQotICoJMQl8fAotICoJMgkmJgotICoJMwk9IDw+IDwgPD0gPj0gPgotICoJNAkrIC0KLSAqCTUJdXNlZCBmb3IgKiAvICUgaW4gTVJJIG1vZGUKLSAqCTYJJiBeICEgfAotICoJNwkqIC8gJSA8PCA+PgotICoJOAl1bmFyeSAtIHVuYXJ5IH4KLSAqLwotc3RhdGljIG9wZXJhdG9yX3JhbmtUIG9wX3JhbmtbXSA9Ci17Ci0gIDAsCS8qIE9faWxsZWdhbCAqLwotICAwLAkvKiBPX2Fic2VudCAqLwotICAwLAkvKiBPX2NvbnN0YW50ICovCi0gIDAsCS8qIE9fc3ltYm9sICovCi0gIDAsCS8qIE9fc3ltYm9sX3J2YSAqLwotICAwLAkvKiBPX3JlZ2lzdGVyICovCi0gIDAsCS8qIE9fYml0ICovCi0gIDksCS8qIE9fdW1pbnVzICovCi0gIDksCS8qIE9fYml0X25vdCAqLwotICA5LAkvKiBPX2xvZ2ljYWxfbm90ICovCi0gIDgsCS8qIE9fbXVsdGlwbHkgKi8KLSAgOCwJLyogT19kaXZpZGUgKi8KLSAgOCwJLyogT19tb2R1bHVzICovCi0gIDgsCS8qIE9fbGVmdF9zaGlmdCAqLwotICA4LAkvKiBPX3JpZ2h0X3NoaWZ0ICovCi0gIDcsCS8qIE9fYml0X2luY2x1c2l2ZV9vciAqLwotICA3LAkvKiBPX2JpdF9vcl9ub3QgKi8KLSAgNywJLyogT19iaXRfZXhjbHVzaXZlX29yICovCi0gIDcsCS8qIE9fYml0X2FuZCAqLwotICA1LAkvKiBPX2FkZCAqLwotICA1LAkvKiBPX3N1YnRyYWN0ICovCi0gIDQsCS8qIE9fZXEgKi8KLSAgNCwJLyogT19uZSAqLwotICA0LAkvKiBPX2x0ICovCi0gIDQsCS8qIE9fbGUgKi8KLSAgNCwJLyogT19nZSAqLwotICA0LAkvKiBPX2d0ICovCi0gIDMsCS8qIE9fbG9naWNhbF9hbmQgKi8KLSAgMiwJLyogT19sb2dpY2FsX29yICovCi0gIDEsCS8qIE9faW5kZXggKi8KLSAgMCwJLyogT19tZDEgKi8KLSAgMCwJLyogT19tZDIgKi8KLSAgMCwJLyogT19tZDMgKi8KLSAgMCwJLyogT19tZDQgKi8KLSAgMCwJLyogT19tZDUgKi8KLSAgMCwJLyogT19tZDYgKi8KLSAgMCwJLyogT19tZDcgKi8KLSAgMCwJLyogT19tZDggKi8KLSAgMCwJLyogT19tZDkgKi8KLSAgMCwJLyogT19tZDEwICovCi0gIDAsCS8qIE9fbWQxMSAqLwotICAwLAkvKiBPX21kMTIgKi8KLSAgMCwJLyogT19tZDEzICovCi0gIDAsCS8qIE9fbWQxNCAqLwotICAwLAkvKiBPX21kMTUgKi8KLSAgMCwJLyogT19tZDE2ICovCi19OwotCi0vKiBVbmZvcnR1bmF0ZWx5LCBpbiBNUkkgbW9kZSBmb3IgdGhlIG02OGssIG11bHRpcGxpY2F0aW9uIGFuZAotICAgZGl2aXNpb24gaGF2ZSBsb3dlciBwcmVjZWRlbmNlIHRoYW4gdGhlIGJpdCB3aXNlIG9wZXJhdG9ycy4gIFRoaXMKLSAgIGZ1bmN0aW9uIHNldHMgdGhlIG9wZXJhdG9yIHByZWNlZGVuY2VzIGNvcnJlY3RseSBmb3IgdGhlIGN1cnJlbnQKLSAgIG1vZGUuICBBbHNvLCBNUkkgdXNlcyBhIGRpZmZlcmVudCBiaXRfbm90IG9wZXJhdG9yLCBhbmQgdGhpcyBmaXhlcwotICAgdGhhdCBhcyB3ZWxsLiAgKi8KLQotI2RlZmluZSBTVEFOREFSRF9NVUxfUFJFQ0VERU5DRSAoNykKLSNkZWZpbmUgTVJJX01VTF9QUkVDRURFTkNFICg1KQotCi12b2lkCi1leHByX3NldF9wcmVjZWRlbmNlICgpCi17Ci0gIGlmIChmbGFnX202OGtfbXJpKQotICAgIHsKLSAgICAgIG9wX3JhbmtbT19tdWx0aXBseV0gPSBNUklfTVVMX1BSRUNFREVOQ0U7Ci0gICAgICBvcF9yYW5rW09fZGl2aWRlXSA9IE1SSV9NVUxfUFJFQ0VERU5DRTsKLSAgICAgIG9wX3JhbmtbT19tb2R1bHVzXSA9IE1SSV9NVUxfUFJFQ0VERU5DRTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvcF9yYW5rW09fbXVsdGlwbHldID0gU1RBTkRBUkRfTVVMX1BSRUNFREVOQ0U7Ci0gICAgICBvcF9yYW5rW09fZGl2aWRlXSA9IFNUQU5EQVJEX01VTF9QUkVDRURFTkNFOwotICAgICAgb3BfcmFua1tPX21vZHVsdXNdID0gU1RBTkRBUkRfTVVMX1BSRUNFREVOQ0U7Ci0gICAgfQotfQotCi0vKiBJbml0aWFsaXplIHRoZSBleHByZXNzaW9uIHBhcnNlci4gICovCi0KLXZvaWQKLWV4cHJfYmVnaW4gKCkKLXsKLSAgZXhwcl9zZXRfcHJlY2VkZW5jZSAoKTsKLQotICAvKiBWZXJpZnkgdGhhdCBYX29wIGZpZWxkIGlzIHdpZGUgZW5vdWdoLiAgKi8KLSAgewotICAgIGV4cHJlc3Npb25TIGU7Ci0gICAgZS5YX29wID0gT19tYXg7Ci0gICAgYXNzZXJ0IChlLlhfb3AgPT0gT19tYXgpOwotICB9Ci19Ci0MCi0vKiBSZXR1cm4gdGhlIGVuY29kaW5nIGZvciB0aGUgb3BlcmF0b3IgYXQgSU5QVVRfTElORV9QT0lOVEVSLgotICAgQWR2YW5jZSBJTlBVVF9MSU5FX1BPSU5URVIgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBvcGVyYXRvcgotICAgKGkuZS4sIGRvbid0IGNoYW5nZSBpdCBmb3IgYSBzaW5nbGUgY2hhcmFjdGVyIG9wZXJhdG9yKS4gICovCi0KLXN0YXRpYyBpbmxpbmUgb3BlcmF0b3JUCi1vcGVyYXRvciAoKQotewotICBpbnQgYzsKLSAgb3BlcmF0b3JUIHJldDsKLQotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlciAmIDB4ZmY7Ci0KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCi0gICAgY2FzZSAnPCc6Ci0gICAgICBzd2l0Y2ggKGlucHV0X2xpbmVfcG9pbnRlclsxXSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQljYXNlICc8JzoKLQkgIHJldCA9IE9fbGVmdF9zaGlmdDsKLQkgIGJyZWFrOwotCWNhc2UgJz4nOgotCSAgcmV0ID0gT19uZTsKLQkgIGJyZWFrOwotCWNhc2UgJz0nOgotCSAgcmV0ID0gT19sZTsKLQkgIGJyZWFrOwotCX0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcmV0dXJuIHJldDsKLQotICAgIGNhc2UgJz0nOgotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnPScpCi0JcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiBPX2VxOwotCi0gICAgY2FzZSAnPic6Ci0gICAgICBzd2l0Y2ggKGlucHV0X2xpbmVfcG9pbnRlclsxXSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQljYXNlICc+JzoKLQkgIHJldCA9IE9fcmlnaHRfc2hpZnQ7Ci0JICBicmVhazsKLQljYXNlICc9JzoKLQkgIHJldCA9IE9fZ2U7Ci0JICBicmVhazsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBjYXNlICchJzoKLSAgICAgIC8qIFdlIGFjY2VwdCAhISBhcyBlcXVpdmFsZW50IHRvIF4gZm9yIE1SSSBjb21wYXRpYmlsaXR5LiAgKi8KLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJyEnKQotCXsKLQkgIGlmIChmbGFnX202OGtfbXJpKQotCSAgICByZXR1cm4gT19iaXRfaW5jbHVzaXZlX29yOwotCSAgcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCX0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcmV0dXJuIE9fYml0X2V4Y2x1c2l2ZV9vcjsKLQotICAgIGNhc2UgJ3wnOgotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnfCcpCi0JcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiBPX2xvZ2ljYWxfb3I7Ci0KLSAgICBjYXNlICcmJzoKLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJyYnKQotCXJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICByZXR1cm4gT19sb2dpY2FsX2FuZDsKLSAgICB9Ci0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogUGFyc2UgYW4gZXhwcmVzc2lvbi4gICovCi0KLXNlZ1QKLWV4cHIgKHJhbmthcmcsIHJlc3VsdFApCi0gICAgIGludCByYW5rYXJnOwkvKiBMYXJnZXIgIyBpcyBoaWdoZXIgcmFuay4gKi8KLSAgICAgZXhwcmVzc2lvblMgKnJlc3VsdFA7CS8qIERlbGl2ZXIgcmVzdWx0IGhlcmUuICovCi17Ci0gIG9wZXJhdG9yX3JhbmtUIHJhbmsgPSAob3BlcmF0b3JfcmFua1QpIHJhbmthcmc7Ci0gIHNlZ1QgcmV0dmFsOwotICBleHByZXNzaW9uUyByaWdodDsKLSAgb3BlcmF0b3JUIG9wX2xlZnQ7Ci0gIG9wZXJhdG9yVCBvcF9yaWdodDsKLQotICBrbm93IChyYW5rID49IDApOwotCi0gIHJldHZhbCA9IG9wZXJhbmQgKHJlc3VsdFApOwotCi0gIGtub3cgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyAnKTsJLyogT3BlcmFuZCgpIGdvYmJsZXMgc3BhY2VzLiAqLwotCi0gIG9wX2xlZnQgPSBvcGVyYXRvciAoKTsKLSAgd2hpbGUgKG9wX2xlZnQgIT0gT19pbGxlZ2FsICYmIG9wX3JhbmtbKGludCkgb3BfbGVmdF0gPiByYW5rKQotICAgIHsKLSAgICAgIHNlZ1QgcmlnaHRzZWc7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwkvKi0+YWZ0ZXIgMXN0IGNoYXJhY3RlciBvZiBvcGVyYXRvci4gKi8KLQotICAgICAgcmlnaHRzZWcgPSBleHByIChvcF9yYW5rWyhpbnQpIG9wX2xlZnRdLCAmcmlnaHQpOwotICAgICAgaWYgKHJpZ2h0Llhfb3AgPT0gT19hYnNlbnQpCi0JewotCSAgYXNfd2FybiAoXygibWlzc2luZyBvcGVyYW5kOyB6ZXJvIGFzc3VtZWQiKSk7Ci0JICByaWdodC5YX29wID0gT19jb25zdGFudDsKLQkgIHJpZ2h0LlhfYWRkX251bWJlciA9IDA7Ci0JICByaWdodC5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCSAgcmlnaHQuWF9vcF9zeW1ib2wgPSBOVUxMOwotCX0KLQotICAgICAga25vdyAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnICcpOwotCi0gICAgICBpZiAob3BfbGVmdCA9PSBPX2luZGV4KQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICddJykKLQkgICAgYXNfYmFkICgibWlzc2luZyByaWdodCBicmFja2V0Iik7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChyZXR2YWwgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JewotCSAgaWYgKFNFR19OT1JNQUwgKHJpZ2h0c2VnKSkKLQkgICAgcmV0dmFsID0gcmlnaHRzZWc7Ci0JfQotICAgICAgZWxzZSBpZiAoISBTRUdfTk9STUFMIChyZXR2YWwpKQotCXJldHZhbCA9IHJpZ2h0c2VnOwotICAgICAgZWxzZSBpZiAoU0VHX05PUk1BTCAocmlnaHRzZWcpCi0JICAgICAgICYmIHJldHZhbCAhPSByaWdodHNlZwotI2lmZGVmIERJRkZfRVhQUl9PSwotCSAgICAgICAmJiBvcF9sZWZ0ICE9IE9fc3VidHJhY3QKLSNlbmRpZgotCSAgICAgICApCi0JYXNfYmFkIChfKCJvcGVyYXRpb24gY29tYmluZXMgc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VnbWVudHMiKSk7Ci0KLSAgICAgIG9wX3JpZ2h0ID0gb3BlcmF0b3IgKCk7Ci0KLSAgICAgIGtub3cgKG9wX3JpZ2h0ID09IE9faWxsZWdhbCB8fCBvcF9yYW5rWyhpbnQpIG9wX3JpZ2h0XSA8PSBvcF9yYW5rWyhpbnQpIG9wX2xlZnRdKTsKLSAgICAgIGtub3cgKChpbnQpIG9wX2xlZnQgPj0gKGludCkgT19tdWx0aXBseQotCSAgICAmJiAoaW50KSBvcF9sZWZ0IDw9IChpbnQpIE9fbG9naWNhbF9vcik7Ci0KLSAgICAgIC8qIGlucHV0X2xpbmVfcG9pbnRlci0+YWZ0ZXIgcmlnaHQtaGFuZCBxdWFudGl0eS4gKi8KLSAgICAgIC8qIGxlZnQtaGFuZCBxdWFudGl0eSBpbiByZXN1bHRQICovCi0gICAgICAvKiByaWdodC1oYW5kIHF1YW50aXR5IGluIHJpZ2h0LiAqLwotICAgICAgLyogb3BlcmF0b3IgaW4gb3BfbGVmdC4gKi8KLQotICAgICAgaWYgKHJlc3VsdFAtPlhfb3AgPT0gT19iaWcpCi0JewotCSAgaWYgKHJlc3VsdFAtPlhfYWRkX251bWJlciA+IDApCi0JICAgIGFzX3dhcm4gKF8oImxlZnQgb3BlcmFuZCBpcyBhIGJpZ251bTsgaW50ZWdlciAwIGFzc3VtZWQiKSk7Ci0JICBlbHNlCi0JICAgIGFzX3dhcm4gKF8oImxlZnQgb3BlcmFuZCBpcyBhIGZsb2F0OyBpbnRlZ2VyIDAgYXNzdW1lZCIpKTsKLQkgIHJlc3VsdFAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgIHJlc3VsdFAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICByZXN1bHRQLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotICAgICAgaWYgKHJpZ2h0Llhfb3AgPT0gT19iaWcpCi0JewotCSAgaWYgKHJpZ2h0LlhfYWRkX251bWJlciA+IDApCi0JICAgIGFzX3dhcm4gKF8oInJpZ2h0IG9wZXJhbmQgaXMgYSBiaWdudW07IGludGVnZXIgMCBhc3N1bWVkIikpOwotCSAgZWxzZQotCSAgICBhc193YXJuIChfKCJyaWdodCBvcGVyYW5kIGlzIGEgZmxvYXQ7IGludGVnZXIgMCBhc3N1bWVkIikpOwotCSAgcmlnaHQuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICByaWdodC5YX2FkZF9udW1iZXIgPSAwOwotCSAgcmlnaHQuWF9hZGRfc3ltYm9sID0gTlVMTDsKLQkgIHJpZ2h0Llhfb3Bfc3ltYm9sID0gTlVMTDsKLQl9Ci0KLSAgICAgIC8qIE9wdGltaXplIGNvbW1vbiBjYXNlcy4gICovCi0gICAgICBpZiAob3BfbGVmdCA9PSBPX2FkZCAmJiByaWdodC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgLyogWCArIGNvbnN0YW50LiAgKi8KLQkgIHJlc3VsdFAtPlhfYWRkX251bWJlciArPSByaWdodC5YX2FkZF9udW1iZXI7Ci0JfQotICAgICAgLyogVGhpcyBjYXNlIGNvbWVzIHVwIGluIFBJQyBjb2RlLiAgKi8KLSAgICAgIGVsc2UgaWYgKG9wX2xlZnQgPT0gT19zdWJ0cmFjdAotCSAgICAgICAmJiByaWdodC5YX29wID09IE9fc3ltYm9sCi0JICAgICAgICYmIHJlc3VsdFAtPlhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAgJiYgKHN5bWJvbF9nZXRfZnJhZyAocmlnaHQuWF9hZGRfc3ltYm9sKQotCQkgICA9PSBzeW1ib2xfZ2V0X2ZyYWcgKHJlc3VsdFAtPlhfYWRkX3N5bWJvbCkpCi0JICAgICAgICYmIFNFR19OT1JNQUwgKFNfR0VUX1NFR01FTlQgKHJpZ2h0LlhfYWRkX3N5bWJvbCkpKQotCi0JewotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyIC09IHJpZ2h0LlhfYWRkX251bWJlcjsKLQkgIHJlc3VsdFAtPlhfYWRkX251bWJlciArPSAoU19HRVRfVkFMVUUgKHJlc3VsdFAtPlhfYWRkX3N5bWJvbCkKLQkJCQkgICAgLSBTX0dFVF9WQUxVRSAocmlnaHQuWF9hZGRfc3ltYm9sKSk7Ci0JICByZXN1bHRQLT5YX29wID0gT19jb25zdGFudDsKLQkgIHJlc3VsdFAtPlhfYWRkX3N5bWJvbCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAob3BfbGVmdCA9PSBPX3N1YnRyYWN0ICYmIHJpZ2h0Llhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBYIC0gY29uc3RhbnQuICAqLwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyIC09IHJpZ2h0LlhfYWRkX251bWJlcjsKLQl9Ci0gICAgICBlbHNlIGlmIChvcF9sZWZ0ID09IE9fYWRkICYmIHJlc3VsdFAtPlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBDb25zdGFudCArIFguICAqLwotCSAgcmVzdWx0UC0+WF9vcCA9IHJpZ2h0Llhfb3A7Ci0JICByZXN1bHRQLT5YX2FkZF9zeW1ib2wgPSByaWdodC5YX2FkZF9zeW1ib2w7Ci0JICByZXN1bHRQLT5YX29wX3N5bWJvbCA9IHJpZ2h0Llhfb3Bfc3ltYm9sOwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyICs9IHJpZ2h0LlhfYWRkX251bWJlcjsKLQkgIHJldHZhbCA9IHJpZ2h0c2VnOwotCX0KLSAgICAgIGVsc2UgaWYgKHJlc3VsdFAtPlhfb3AgPT0gT19jb25zdGFudCAmJiByaWdodC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgLyogQ29uc3RhbnQgT1AgY29uc3RhbnQuICAqLwotCSAgb2Zmc2V0VCB2ID0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCSAgaWYgKHYgPT0gMCAmJiAob3BfbGVmdCA9PSBPX2RpdmlkZSB8fCBvcF9sZWZ0ID09IE9fbW9kdWx1cykpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJkaXZpc2lvbiBieSB6ZXJvIikpOwotCSAgICAgIHYgPSAxOwotCSAgICB9Ci0JICBzd2l0Y2ggKG9wX2xlZnQpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoJCQlhYm9ydCAoKTsKLQkgICAgY2FzZSBPX211bHRpcGx5OgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyICo9IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fZGl2aWRlOgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIC89IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fbW9kdWx1czoJCXJlc3VsdFAtPlhfYWRkX251bWJlciAlPSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2xlZnRfc2hpZnQ6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPDw9IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fcmlnaHRfc2hpZnQ6Ci0JICAgICAgLyogV2UgYWx3YXlzIHVzZSB1bnNpZ25lZCBzaGlmdHMsIHRvIGF2b2lkIHJlbHlpbmcgb24KLSAgICAgICAgICAgICAgICAgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgZ2FzLiAgKi8KLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQkob2Zmc2V0VCkgKCh2YWx1ZVQpIHJlc3VsdFAtPlhfYWRkX251bWJlciA+PiAodmFsdWVUKSB2KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6CXJlc3VsdFAtPlhfYWRkX251bWJlciB8PSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2JpdF9vcl9ub3Q6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgfD0gfnY7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X2V4Y2x1c2l2ZV9vcjoJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIF49IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X2FuZDoJCXJlc3VsdFAtPlhfYWRkX251bWJlciAmPSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2FkZDoJCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgKz0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19zdWJ0cmFjdDoJCXJlc3VsdFAtPlhfYWRkX251bWJlciAtPSB2OyBicmVhazsKLQkgICAgY2FzZSBPX2VxOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCXJlc3VsdFAtPlhfYWRkX251bWJlciA9PSB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19uZToKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgIT0gdiA/IH4gKG9mZnNldFQpIDAgOiAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fbHQ6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KLQkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIDwgIHYgPyB+IChvZmZzZXRUKSAwIDogMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2xlOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCXJlc3VsdFAtPlhfYWRkX251bWJlciA8PSB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19nZToKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPj0gdiA/IH4gKG9mZnNldFQpIDAgOiAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fZ3Q6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KLQkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyID4gIHYgPyB+IChvZmZzZXRUKSAwIDogMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2xvZ2ljYWxfYW5kOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9IHJlc3VsdFAtPlhfYWRkX251bWJlciAmJiB2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fbG9naWNhbF9vcjoKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPSByZXN1bHRQLT5YX2FkZF9udW1iZXIgfHwgdjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHJlc3VsdFAtPlhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAgJiYgcmlnaHQuWF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICAmJiAob3BfbGVmdCA9PSBPX2FkZAotCQkgICB8fCBvcF9sZWZ0ID09IE9fc3VidHJhY3QKLQkJICAgfHwgKHJlc3VsdFAtPlhfYWRkX251bWJlciA9PSAwCi0JCSAgICAgICAmJiByaWdodC5YX2FkZF9udW1iZXIgPT0gMCkpKQotCXsKLQkgIC8qIFN5bWJvbCBPUCBzeW1ib2wuICAqLwotCSAgcmVzdWx0UC0+WF9vcCA9IG9wX2xlZnQ7Ci0JICByZXN1bHRQLT5YX29wX3N5bWJvbCA9IHJpZ2h0LlhfYWRkX3N5bWJvbDsKLQkgIGlmIChvcF9sZWZ0ID09IE9fYWRkKQotCSAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgKz0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCSAgZWxzZSBpZiAob3BfbGVmdCA9PSBPX3N1YnRyYWN0KQotCSAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgLT0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGUgZ2VuZXJhbCBjYXNlLiAgKi8KLQkgIHJlc3VsdFAtPlhfYWRkX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKHJlc3VsdFApOwotCSAgcmVzdWx0UC0+WF9vcF9zeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sICgmcmlnaHQpOwotCSAgcmVzdWx0UC0+WF9vcCA9IG9wX2xlZnQ7Ci0JICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgcmVzdWx0UC0+WF91bnNpZ25lZCA9IDE7Ci0JfQotCi0gICAgICBvcF9sZWZ0ID0gb3BfcmlnaHQ7Ci0gICAgfQkJCQkvKiBXaGlsZSBuZXh0IG9wZXJhdG9yIGlzID49IHRoaXMgcmFuay4gKi8KLQotICAvKiBUaGUgUEEgcG9ydCBuZWVkcyB0aGlzIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKHJlc3VsdFAtPlhfYWRkX3N5bWJvbCkKLSAgICBzeW1ib2xfbWFya191c2VkIChyZXN1bHRQLT5YX2FkZF9zeW1ib2wpOwotCi0gIHJldHVybiByZXN1bHRQLT5YX29wID09IE9fY29uc3RhbnQgPyBhYnNvbHV0ZV9zZWN0aW9uIDogcmV0dmFsOwotfQotDAotLyoKLSAqCQkJZ2V0X3N5bWJvbF9lbmQoKQotICoKLSAqIFRoaXMgbGl2ZXMgaGVyZSBiZWNhdXNlIGl0IGJlbG9uZ3MgZXF1YWxseSBpbiBleHByLmMgJiByZWFkLmMuCi0gKiBFeHByLmMgaXMganVzdCBhIGJyYW5jaCBvZmZpY2UgcmVhZC5jIGFueXdheSwgYW5kIHB1dHRpbmcgaXQKLSAqIGhlcmUgbGVzc2VucyB0aGUgY3Jvd2QgYXQgcmVhZC5jLgotICoKLSAqIEFzc3VtZSBpbnB1dF9saW5lX3BvaW50ZXIgaXMgYXQgc3RhcnQgb2Ygc3ltYm9sIG5hbWUuCi0gKiBBZHZhbmNlIGlucHV0X2xpbmVfcG9pbnRlciBwYXN0IHN5bWJvbCBuYW1lLgotICogVHVybiB0aGF0IGNoYXJhY3RlciBpbnRvIGEgJ1wwJywgcmV0dXJuaW5nIGl0cyBmb3JtZXIgdmFsdWUuCi0gKiBUaGlzIGFsbG93cyBhIHN0cmluZyBjb21wYXJlIChSTVMgd2FudHMgc3ltYm9sIG5hbWVzIHRvIGJlIHN0cmluZ3MpCi0gKiBvZiB0aGUgc3ltYm9sIG5hbWUuCi0gKiBUaGVyZSB3aWxsIGFsd2F5cyBiZSBhIGNoYXIgZm9sbG93aW5nIHN5bWJvbCBuYW1lLCBiZWNhdXNlIGFsbCBnb29kCi0gKiBsaW5lcyBlbmQgaW4gZW5kLW9mLWxpbmUuCi0gKi8KLWNoYXIKLWdldF9zeW1ib2xfZW5kICgpCi17Ci0gIGNoYXIgYzsKLQotICAvKiBXZSBhY2NlcHQgXDAwMSBpbiBhIG5hbWUgaW4gY2FzZSB0aGlzIGlzIGJlaW5nIGNhbGxlZCB3aXRoIGEKLSAgICAgY29uc3RydWN0ZWQgc3RyaW5nLiAgKi8KLSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspIHx8IGMgPT0gJ1wwMDEnKQotICAgIHsKLSAgICAgIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspCi0JICAgICB8fCBjID09ICdcMDAxJykKLQk7Ci0gICAgICBpZiAoaXNfbmFtZV9lbmRlciAoYykpCi0JYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gICotLWlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gIHJldHVybiAoYyk7Ci19Ci0KLQotdW5zaWduZWQgaW50Ci1nZXRfc2luZ2xlX251bWJlciAoKQotewotICBleHByZXNzaW9uUyBleHA7Ci0gIG9wZXJhbmQgKCZleHApOwotICByZXR1cm4gZXhwLlhfYWRkX251bWJlcjsKLQotfQotCi0vKiBlbmQgb2YgZXhwci5jICovCmRpZmYgLS1naXQgYS9nYXMvZXhwci5oIGIvZ2FzL2V4cHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVkNmFmNi4uMDAwMDAwMAotLS0gYS9nYXMvZXhwci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qIGV4cHIuaCAtPiBoZWFkZXIgZmlsZSBmb3IgZXhwci5jCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogQnkgcG9wdWxhciBkZW1hbmQsIHdlIGRlZmluZSBhIHN0cnVjdCB0byByZXByZXNlbnQgYW4gZXhwcmVzc2lvbi4KLSAqIFRoaXMgd2lsbCBubyBkb3VidCBtdXRhdGUgYXMgZXhwcmVzc2lvbnMgYmVjb21lIGJhcm9xdWUuCi0gKgotICogQ3VycmVudGx5LCB3ZSBzdXBwb3J0IGV4cHJlc3Npb25zIGxpa2UgImZvbyBPUCBiYXIgKyA0MiIuICBJbiBvdGhlcgotICogd29yZHMgd2UgcGVybWl0IGEgKHBvc3NpYmx5IHVuZGVmaW5lZCkgc3ltYm9sLCBhIChwb3NzaWJseQotICogdW5kZWZpbmVkKSBzeW1ib2wgYW5kIHRoZSBvcGVyYXRpb24gdXNlZCB0byBjb21iaW5lIHRoZSBzeW1ib2xzLAotICogYW5kIGFuIChhYnNvbHV0ZSkgYXVnZW5kLiAgUk1TIHNheXMgdGhpcyBpcyBzbyB3ZSBjYW4gaGF2ZSAxLXBhc3MKLSAqIGFzc2VtYmx5IGZvciBhbnkgY29tcGlsZXIgZW1pc3Npb25zLCBhbmQgYSAnY2FzZScgc3RhdGVtZW50IG1pZ2h0Ci0gKiBlbWl0ICd1bmRlZmluZWQxIC0gdW5kZWZpbmVkMicuCi0gKgotICogVGhlIHR5cGUgb2YgYW4gZXhwcmVzc2lvbiB1c2VkIHRvIGJlIHN0b3JlZCBhcyBhIHNlZ21lbnQuICBUaGF0IGdvdAotICogY29uZnVzaW5nIGJlY2F1c2UgaXQgb3ZlcmxvYWRlZCB0aGUgY29uY2VwdCBvZiBhIHNlZ21lbnQuICBJIGFkZGVkCi0gKiBhbiBvcGVyYXRvciBmaWVsZCwgaW5zdGVhZC4KLSAqLwotCi0vKiBUaGlzIGlzIHRoZSB0eXBlIG9mIGFuIGV4cHJlc3Npb24uICBUaGUgb3BlcmF0b3IgdHlwZXMgYXJlIGFsc28KLSAgIHVzZWQgd2hpbGUgcGFyc2luZyBhbiBleHByZXNzaW9uLgotCi0gICBOT1RFOiBUaGlzIGVudW1lcmF0aW9uIG11c3QgbWF0Y2ggdGhlIG9wX3JhbmsgYXJyYXkgaW4gZXhwci5jLiAgKi8KLQotdHlwZWRlZiBlbnVtCi17Ci0gIC8qIEFuIGlsbGVnYWwgZXhwcmVzc2lvbi4gICovCi0gIE9faWxsZWdhbCwKLSAgLyogQSBub25leGlzdGVudCBleHByZXNzaW9uLiAgKi8KLSAgT19hYnNlbnQsCi0gIC8qIFhfYWRkX251bWJlciAoYSBjb25zdGFudCBleHByZXNzaW9uKS4gICovCi0gIE9fY29uc3RhbnQsCi0gIC8qIFhfYWRkX3N5bWJvbCArIFhfYWRkX251bWJlci4gICovCi0gIE9fc3ltYm9sLAotICAvKiBYX2FkZF9zeW1ib2wgKyBYX2FkZF9udW1iZXIgLSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBpbWFnZS4gICovCi0gIE9fc3ltYm9sX3J2YSwKLSAgLyogQSByZWdpc3RlciAoWF9hZGRfbnVtYmVyIGlzIHJlZ2lzdGVyIG51bWJlcikuICAqLwotICBPX3JlZ2lzdGVyLAotICAvKiBBIGJpZyB2YWx1ZS4gIElmIFhfYWRkX251bWJlciBpcyBuZWdhdGl2ZSBvciAwLCB0aGUgdmFsdWUgaXMgaW4KLSAgICAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuICBPdGhlcndpc2UgdGhlIHZhbHVlIGlzIGluCi0gICAgIGdlbmVyaWNfYmlnbnVtLCBhbmQgWF9hZGRfbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgTElUVExFTlVNcyBpbgotICAgICB0aGUgdmFsdWUuICAqLwotICBPX2JpZywKLSAgLyogKC0gWF9hZGRfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fdW1pbnVzLAotICAvKiAofiBYX2FkZF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19iaXRfbm90LAotICAvKiAoISBYX2FkZF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sb2dpY2FsX25vdCwKLSAgLyogKFhfYWRkX3N5bWJvbCAqIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbXVsdGlwbHksCi0gIC8qIChYX2FkZF9zeW1ib2wgLyBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2RpdmlkZSwKLSAgLyogWF9hZGRfc3ltYm9sICUgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19tb2R1bHVzLAotICAvKiBYX2FkZF9zeW1ib2wgPDwgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sZWZ0X3NoaWZ0LAotICAvKiBYX2FkZF9zeW1ib2wgPj4gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19yaWdodF9zaGlmdCwKLSAgLyogWF9hZGRfc3ltYm9sIHwgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19iaXRfaW5jbHVzaXZlX29yLAotICAvKiBYX2FkZF9zeW1ib2wgfH4gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19iaXRfb3Jfbm90LAotICAvKiBYX2FkZF9zeW1ib2wgXiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2JpdF9leGNsdXNpdmVfb3IsCi0gIC8qIFhfYWRkX3N5bWJvbCAmIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fYml0X2FuZCwKLSAgLyogWF9hZGRfc3ltYm9sICsgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19hZGQsCi0gIC8qIFhfYWRkX3N5bWJvbCAtIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fc3VidHJhY3QsCi0gIC8qIChYX2FkZF9zeW1ib2wgPT0gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19lcSwKLSAgLyogKFhfYWRkX3N5bWJvbCAhPSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX25lLAotICAvKiAoWF9hZGRfc3ltYm9sIDwgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sdCwKLSAgLyogKFhfYWRkX3N5bWJvbCA8PSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2xlLAotICAvKiAoWF9hZGRfc3ltYm9sID49IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fZ2UsCi0gIC8qIChYX2FkZF9zeW1ib2wgPiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2d0LAotICAvKiAoWF9hZGRfc3ltYm9sICYmIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbG9naWNhbF9hbmQsCi0gIC8qIChYX2FkZF9zeW1ib2wgfHwgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sb2dpY2FsX29yLAotICAvKiBYX29wX3N5bWJvbCBbIFhfYWRkX3N5bWJvbCBdICovCi0gIE9faW5kZXgsCi0gIC8qIG1hY2hpbmUgZGVwZW5kZW50IG9wZXJhdG9ycyAqLwotICBPX21kMSwgIE9fbWQyLCAgT19tZDMsICBPX21kNCwgIE9fbWQ1LCAgT19tZDYsICBPX21kNywgIE9fbWQ4LAotICBPX21kOSwgIE9fbWQxMCwgT19tZDExLCBPX21kMTIsIE9fbWQxMywgT19tZDE0LCBPX21kMTUsIE9fbWQxNiwKLSAgLyogdGhpcyBtdXN0IGJlIHRoZSBsYXJnZXN0IHZhbHVlICovCi0gIE9fbWF4Ci19IG9wZXJhdG9yVDsKLQotdHlwZWRlZiBzdHJ1Y3QgZXhwcmVzc2lvblMKLXsKLSAgLyogVGhlIG1haW4gc3ltYm9sLiAgKi8KLSAgc3ltYm9sUyAqWF9hZGRfc3ltYm9sOwotICAvKiBUaGUgc2Vjb25kIHN5bWJvbCwgaWYgbmVlZGVkLiAgKi8KLSAgc3ltYm9sUyAqWF9vcF9zeW1ib2w7Ci0gIC8qIEEgbnVtYmVyIHRvIGFkZC4gICovCi0gIG9mZnNldFQgWF9hZGRfbnVtYmVyOwotCi0gIC8qIFRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uLiAgV2UgY2FuJ3QgYXNzdW1lIHRoYXQgYW4gYXJiaXRyYXJ5Ci0gICAgIGNvbXBpbGVyIGNhbiBoYW5kbGUgYSBiaXRmaWVsZCBvZiBlbnVtIHR5cGUuICBGSVhNRTogV2UgY291bGQKLSAgICAgY2hlY2sgdGhpcyB1c2luZyBhdXRvY29uZi4gICovCi0jaWZkZWYgX19HTlVDX18KLSAgb3BlcmF0b3JUIFhfb3AgOiA4OwotI2Vsc2UKLSAgdW5zaWduZWQgY2hhciBYX29wOwotI2VuZGlmCi0KLSAgLyogTm9uLXplcm8gaWYgWF9hZGRfbnVtYmVyIHNob3VsZCBiZSByZWdhcmRlZCBhcyB1bnNpZ25lZC4gIFRoaXMgaXMKLSAgICAgb25seSB2YWxpZCBmb3IgT19jb25zdGFudCBleHByZXNzaW9ucy4gIEl0IGlzIG9ubHkgdXNlZCB3aGVuIGFuCi0gICAgIE9fY29uc3RhbnQgbXVzdCBiZSBleHRlbmRlZCBpbnRvIGEgYmlnbnVtIChpLmUuLCBpdCBpcyBub3QgdXNlZAotICAgICB3aGVuIHBlcmZvcm1pbmcgYXJpdGhtZXRpYyBvbiB0aGVzZSB2YWx1ZXMpLgotICAgICBGSVhNRTogVGhpcyBmaWVsZCBpcyBub3Qgc2V0IHZlcnkgcmVsaWFibHkuICAqLwotICB1bnNpZ25lZCBpbnQgWF91bnNpZ25lZCA6IDE7Ci0KLSAgLyogNyBhZGRpdGlvbmFsIGJpdHMgY2FuIGJlIGRlZmluZWQgaWYgbmVlZGVkLiAgKi8KLQotICAvKiBNYWNoaW5lIGRlcGVuZGVudCBmaWVsZCAqLwotICB1bnNpZ25lZCBzaG9ydCBYX21kOwotfSBleHByZXNzaW9uUzsKLQotLyogInJlc3VsdCIgc2hvdWxkIGJlIHR5cGUgKGV4cHJlc3Npb25TICopLiAqLwotI2RlZmluZSBleHByZXNzaW9uKHJlc3VsdCkgZXhwciAoMCwgcmVzdWx0KQotCi0vKiBJZiBhbiBleHByZXNzaW9uIGlzIE9fYmlnLCBsb29rIGhlcmUgZm9yIGl0cyB2YWx1ZS4gVGhlc2UgY29tbW9uCi0gICBkYXRhIG1heSBiZSBjbG9iYmVyZWQgd2hlbmV2ZXIgZXhwcigpIGlzIGNhbGxlZC4gKi8KLS8qIEZsb251bXMgcmV0dXJuZWQgaGVyZS4gIEJpZyBlbm91Z2ggdG8gaG9sZCBtb3N0IHByZWNpc2UgZmxvbnVtLiAqLwotZXh0ZXJuIEZMT05VTV9UWVBFIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyOwotLyogQmlnbnVtcyByZXR1cm5lZCBoZXJlLiAqLwotZXh0ZXJuIExJVFRMRU5VTV9UWVBFIGdlbmVyaWNfYmlnbnVtW107Ci0vKiBOdW1iZXIgb2YgbGl0dGxlbnVtcyBpbiBhYm92ZS4gKi8KLSNkZWZpbmUgU0laRV9PRl9MQVJHRV9OVU1CRVIgKDIwKQotCi10eXBlZGVmIGNoYXIgb3BlcmF0b3JfcmFua1Q7Ci0KLWV4dGVybiBjaGFyIGdldF9zeW1ib2xfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGV4cHJfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgZXhwcl9zZXRfcHJlY2VkZW5jZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gc2VnVCBleHByIFBBUkFNUyAoKGludCByYW5rLCBleHByZXNzaW9uUyAqIHJlc3VsdFApKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgZ2V0X3NpbmdsZV9udW1iZXIgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHN5bWJvbFMgKm1ha2VfZXhwcl9zeW1ib2wgUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOwotZXh0ZXJuIGludCBleHByX3N5bWJvbF93aGVyZQotICBQQVJBTVMgKChzeW1ib2xTICosIGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci0KLWV4dGVybiBzeW1ib2xTICpleHByX2J1aWxkX3Vjb25zdGFudCBQQVJBTVMgKChvZmZzZXRUKSk7Ci1leHRlcm4gc3ltYm9sUyAqZXhwcl9idWlsZF91bmFyeSBQQVJBTVMgKChvcGVyYXRvclQsIHN5bWJvbFMgKikpOwotZXh0ZXJuIHN5bWJvbFMgKmV4cHJfYnVpbGRfYmluYXJ5IFBBUkFNUyAoKG9wZXJhdG9yVCwgc3ltYm9sUyAqLCBzeW1ib2xTICopKTsKLWV4dGVybiBzeW1ib2xTICpleHByX2J1aWxkX2RvdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIGVuZCBvZiBleHByLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9mbG9udW0tY29weS5jIGIvZ2FzL2Zsb251bS1jb3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViY2M1Y2MuLjAwMDAwMDAKLS0tIGEvZ2FzL2Zsb251bS1jb3B5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBmbG9udW1fY29weS5jIC0gY29weSBhIGZsb251bQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi12b2lkCi1mbG9udW1fY29weSAoaW4sIG91dCkKLSAgICAgRkxPTlVNX1RZUEUgKmluOwotICAgICBGTE9OVU1fVFlQRSAqb3V0OwotewotICB1bnNpZ25lZCBpbnQgaW5fbGVuZ3RoOwkJLyogMCBvcmlnaW4gKi8KLSAgdW5zaWduZWQgaW50IG91dF9sZW5ndGg7CQkvKiAwIG9yaWdpbiAqLwotCi0gIG91dC0+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+ZnJfbGl0ZXJhbCk7Ci19Ci0KLXZvaWQKLWZyYWdfYXBwZW5kXzFfY2hhciAoZGF0dW0pCi0gICAgIGludCBkYXR1bTsKLXsKLSAgaWYgKG9ic3RhY2tfcm9vbSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spIDw9IDEpCi0gICAgewotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25ldyAoMCk7Ci0gICAgfQotICBvYnN0YWNrXzFncm93ICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaywgZGF0dW0pOwotfQotCi0vKiBlbmQgb2YgZnJhZ3MuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2ZyYWdzLmggYi9nYXMvZnJhZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4OGUzMy4uMDAwMDAwMAotLS0gYS9nYXMvZnJhZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKiBmcmFncy5oIC0gSGVhZGVyIGZpbGUgZm9yIHRoZSBmcmFnIGNvbmNlcHQuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTQsIDk1LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEZSQUdTX0gKLSNkZWZpbmUgRlJBR1NfSAotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3Qgb2JzdGFjazsKLSNlbmRpZgotCi0vKgotICogQSBjb2RlIGZyYWdtZW50IChmcmFnKSBpcyBzb21lIGtub3duIG51bWJlciBvZiBjaGFycywgZm9sbG93ZWQgYnkgc29tZQotICogdW5rbm93biBudW1iZXIgb2YgY2hhcnMuIFR5cGljYWxseSB0aGUgdW5rbm93biBudW1iZXIgb2YgY2hhcnMgaXMgYW4KLSAqIGluc3RydWN0aW9uIGFkZHJlc3Mgd2hvc2Ugc2l6ZSBpcyB5ZXQgdW5rbm93bi4gV2UgYWx3YXlzIGtub3cgdGhlIGdyZWF0ZXN0Ci0gKiBwb3NzaWJsZSBzaXplIHRoZSB1bmtub3duIG51bWJlciBvZiBjaGFycyBtYXkgYmVjb21lLCBhbmQgcmVzZXJ2ZSB0aGF0Ci0gKiBtdWNoIHJvb20gYXQgdGhlIGVuZCBvZiB0aGUgZnJhZy4KLSAqIE9uY2UgY3JlYXRlZCwgZnJhZ3MgZG8gbm90IGNoYW5nZSBhZGRyZXNzIGR1cmluZyBhc3NlbWJseS4KLSAqIFdlIGNoYWluIHRoZSBmcmFncyBpbiAoYSkgZm9yd2FyZC1saW5rZWQgbGlzdChzKS4gVGhlIG9iamVjdC1maWxlIGFkZHJlc3MKLSAqIG9mIHRoZSAxc3QgY2hhciBvZiBhIGZyYWcgaXMgZ2VuZXJhbGx5IG5vdCBrbm93biB1bnRpbCBhZnRlciByZWxheCgpLgotICogTWFueSB0aGluZ3MgYXQgYXNzZW1ibHkgdGltZSBkZXNjcmliZSBhbiBhZGRyZXNzIGJ5IHtvYmplY3QtZmlsZS1hZGRyZXNzCi0gKiBvZiBhIHBhcnRpY3VsYXIgZnJhZ30rb2Zmc2V0LgotCi0gQlVHOiBpdCBtYXkgYmUgc21hcnRlciB0byBoYXZlIGEgc2luZ2xlIHBvaW50ZXIgb2ZmIHRvIHZhcmlvdXMgZGlmZmVyZW50Ci0gbm90ZXMgZm9yIGRpZmZlcmVudCBmcmFnIGtpbmRzLiBTZWUgaG93IGNvZGUgcGFucwotICovCi0KLXN0cnVjdCBmcmFnCi17Ci0gIC8qIE9iamVjdCBmaWxlIGFkZHJlc3MuICovCi0gIGFkZHJlc3NUIGZyX2FkZHJlc3M7Ci0gIC8qIENoYWluIGZvcndhcmQ7IGFzY2VuZGluZyBhZGRyZXNzIG9yZGVyLiAgUm9vdGVkIGluIGZyY2hfcm9vdC4gKi8KLSAgc3RydWN0IGZyYWcgKmZyX25leHQ7Ci0KLSAgLyogKEZpeGVkKSBudW1iZXIgb2YgY2hhcnMgd2Uga25vdyB3ZSBoYXZlLiAgTWF5IGJlIDAuICovCi0gIG9mZnNldFQgZnJfZml4OwotICAvKiAoVmFyaWFibGUpIG51bWJlciBvZiBjaGFycyBhZnRlciBhYm92ZS4gIE1heSBiZSAwLiAqLwotICBvZmZzZXRUIGZyX3ZhcjsKLSAgLyogRm9yIHZhcmlhYmxlLWxlbmd0aCB0YWlsLiAqLwotICBzeW1ib2xTICpmcl9zeW1ib2w7Ci0gIC8qIEZvciB2YXJpYWJsZS1sZW5ndGggdGFpbC4gKi8KLSAgb2Zmc2V0VCBmcl9vZmZzZXQ7Ci0gIC8qIFBvaW50cyB0byBvcGNvZGUgbG93IGFkZHIgYnl0ZSwgZm9yIHJlbGF4YXRpb24uICAqLwotICBjaGFyICpmcl9vcGNvZGU7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICBzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqbGluZTsKLSNlbmRpZgotCi0gIC8qIFdoYXQgc3RhdGUgaXMgbXkgdGFpbCBpbj8gKi8KLSAgcmVsYXhfc3RhdGVUIGZyX3R5cGU7Ci0gIHJlbGF4X3N1YnN0YXRlVCBmcl9zdWJ0eXBlOwotCi0jaWZkZWYgVVNJTkdfQ0dFTgotICAvKiBEb24ndCBpbmNsdWRlIHRoaXMgdW5sZXNzIHVzaW5nIENHRU4gdG8ga2VlcCBmcmFnIHNpemUgZG93bi4gICovCi0gIHN0cnVjdCB7Ci0gICAgLyogQ0dFTl9JTlNOIGVudHJ5IGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KLSAgICBjb25zdCBzdHJ1Y3QgY2dlbl9pbnNuICppbnNuOwotICAgIC8qIEluZGV4IGludG8gb3BlcmFuZCB0YWJsZS4gICovCi0gICAgaW50IG9waW5kZXg7Ci0gICAgLyogVGFyZ2V0IHNwZWNpZmljIGRhdGEsIHVzdWFsbHkgcmVsb2MgbnVtYmVyLiAgKi8KLSAgICBpbnQgb3BpbmZvOwotICB9IGZyX2NnZW47Ci0jZW5kaWYKLQotI2lmZGVmIFRDX0ZSQUdfVFlQRQotICBUQ19GUkFHX1RZUEUgdGNfZnJhZ19kYXRhOwotI2VuZGlmCi0KLSAgLyogV2hlcmUgdGhlIGZyYWcgd2FzIGNyZWF0ZWQsIG9yIHdoZXJlIGl0IGJlY2FtZSBhIHZhcmlhbnQgZnJhZy4gICovCi0gIGNoYXIgKmZyX2ZpbGU7Ci0gIHVuc2lnbmVkIGludCBmcl9saW5lOwotCi0gIC8qIERhdGEgYmVnaW5zIGhlcmUuICAqLwotICBjaGFyIGZyX2xpdGVyYWxbMV07Ci19OwotCi0jZGVmaW5lIFNJWkVPRl9TVFJVQ1RfRlJBRyBcCi0oKGNoYXIgKil6ZXJvX2FkZHJlc3NfZnJhZy5mcl9saXRlcmFsLShjaGFyICopJnplcm9fYWRkcmVzc19mcmFnKQotLyogV2Ugd2FudCB0byBzYXkgZnJfbGl0ZXJhbFswXSBhYm92ZS4gKi8KLQotLyogQ3VycmVudCBmcmFnIHdlIGFyZSBidWlsZGluZy4gIFRoaXMgZnJhZyBpcyBpbmNvbXBsZXRlLiAgSXQgaXMsCi0gICBob3dldmVyLCBpbmNsdWRlZCBpbiBmcmNoYWluX25vdy4gIFRoZSBmcl9maXggZmllbGQgaXMgYm9ndXM7Ci0gICBpbnN0ZWFkLCB1c2UgZnJhZ19ub3dfZml4ICgpLiAgKi8KLUNPTU1PTiBmcmFnUyAqZnJhZ19ub3c7Ci1leHRlcm4gYWRkcmVzc1QgZnJhZ19ub3dfZml4IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogRm9yIGZvcmVpZ24tc2VnbWVudCBzeW1ib2wgZml4dXBzLiAqLwotQ09NTU9OIGZyYWdTIHplcm9fYWRkcmVzc19mcmFnOwotLyogRm9yIGxvY2FsIGNvbW1vbiAoTl9CU1Mgc2VnbWVudCkgZml4dXBzLiAqLwotQ09NTU9OIGZyYWdTIGJzc19hZGRyZXNzX2ZyYWc7Ci0KLSNpZiAwCi0vKgotICogQSBtYWNybyB0byBzcGVlZCB1cCBhcHBlbmRpbmcgZXhhY3RseSAxIGNoYXIKLSAqIHRvIGN1cnJlbnQgZnJhZy4KLSAqLwotLyogSkYgY2hhbmdlZCA8IDEgdG8gPD0gMSB0byBhdm9pZCBhIHJhY2UgY29uZGl0b24gKi8KLSNkZWZpbmUgRlJBR19BUFBFTkRfMV9DSEFSKGRhdHVtKQlcCi17CQkJCQlcCi0gIGlmIChvYnN0YWNrX3Jvb20oICZmcmFncyApIDw9IDEpIHtcCi0gICAgZnJhZ193YW5lIChmcmFnX25vdyk7CVwKLSAgICBmcmFnX25ldyAoMCk7CQlcCi0gIH0JCQkJXAotICBvYnN0YWNrXzFncm93KCAmZnJhZ3MsIGRhdHVtICk7CVwKLX0KLSNlbHNlCi1leHRlcm4gdm9pZCBmcmFnX2FwcGVuZF8xX2NoYXIgUEFSQU1TICgoaW50KSk7Ci0jZGVmaW5lIEZSQUdfQVBQRU5EXzFfQ0hBUihYKSBmcmFnX2FwcGVuZF8xX2NoYXIgKFgpCi0jZW5kaWYKLQotCi12b2lkIGZyYWdfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1mcmFnUyAqZnJhZ19hbGxvYyBQQVJBTVMgKChzdHJ1Y3Qgb2JzdGFjayAqKSk7Ci12b2lkIGZyYWdfZ3JvdyBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgbmNoYXJzKSk7Ci1jaGFyICpmcmFnX21vcmUgUEFSQU1TICgoaW50IG5jaGFycykpOwotdm9pZCBmcmFnX2FsaWduIFBBUkFNUyAoKGludCBhbGlnbm1lbnQsIGludCBmaWxsX2NoYXJhY3RlciwgaW50IG1heCkpOwotdm9pZCBmcmFnX2FsaWduX3BhdHRlcm4gUEFSQU1TICgoaW50IGFsaWdubWVudCwKLQkJCQkgY29uc3QgY2hhciAqZmlsbF9wYXR0ZXJuLAotCQkJCSBpbnQgbl9maWxsLAotCQkJCSBpbnQgbWF4KSk7Ci12b2lkIGZyYWdfbmV3IFBBUkFNUyAoKGludCBvbGRfZnJhZ3NfdmFyX21heF9zaXplKSk7Ci12b2lkIGZyYWdfd2FuZSBQQVJBTVMgKChmcmFnUyAqIGZyYWdQKSk7Ci0KLWNoYXIgKmZyYWdfdmFyaWFudCBQQVJBTVMgKChyZWxheF9zdGF0ZVQgdHlwZSwKLQkJCSAgICBpbnQgbWF4X2NoYXJzLAotCQkJICAgIGludCB2YXIsCi0JCQkgICAgcmVsYXhfc3Vic3RhdGVUIHN1YnR5cGUsCi0JCQkgICAgc3ltYm9sUyAqIHN5bWJvbCwKLQkJCSAgICBvZmZzZXRUIG9mZnNldCwKLQkJCSAgICBjaGFyICpvcGNvZGUpKTsKLQotY2hhciAqZnJhZ192YXIgUEFSQU1TICgocmVsYXhfc3RhdGVUIHR5cGUsCi0JCQlpbnQgbWF4X2NoYXJzLAotCQkJaW50IHZhciwKLQkJCXJlbGF4X3N1YnN0YXRlVCBzdWJ0eXBlLAotCQkJc3ltYm9sUyAqIHN5bWJvbCwKLQkJCW9mZnNldFQgb2Zmc2V0LAotCQkJY2hhciAqb3Bjb2RlKSk7Ci0KLSNlbmRpZiAvKiBGUkFHU19IICovCmRpZmYgLS1naXQgYS9nYXMvZ2FzcC5jIGIvZ2FzL2dhc3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiMzA3Ni4uMDAwMDAwMAotLS0gYS9nYXMvZ2FzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc1MCArMCwwIEBACi0vKiBnYXNwLmMgLSBHbnUgYXNzZW1ibGVyIHByZXByb2Nlc3NvciBtYWluIHByb2dyYW0uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAotICAgICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTUCwgdGhlIEdOVSBBc3NlbWJsZXIgUHJlcHJvY2Vzc29yLgotCi0gICBHQVNQIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTUCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBU1A7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qCi0KLVRoaXMgcHJvZ3JhbSB0cmFuc2xhdGVzIHRoZSBpbnB1dCBtYWNyb3MgYW5kIHN0dWZmIGludG8gYSBmb3JtCi1zdWl0YWJsZSBmb3IgZ2FzIHRvIGNvbnN1bWUuCi0KLQotICBnYXNwIFstc2RoYXVdIFstYyBjaGFyXSBbLW8gPG91dGZpbGU+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+dHlwZSA9PSB0eXBlKQotCXsKLQkgIGluY2x1ZGVfcG9wICgpOwotCX0KLSAgICB9Ci19Ci0KLS8qIC5BUkVQRUFUICovCi0KLXN0YXRpYyB2b2lkCi1kb19hcmVwZWF0IChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGludCBsaW5lID0gbGluZWNvdW50ICgpOwotICBzYiBleHA7CQkJLyogYnVmZmVyIHdpdGggZXhwcmVzc2lvbiBpbiBpdCAqLwotICBzYiBjb3B5OwkJCS8qIGV4cGFuZGVkIHJlcGVhdCBibG9jayAqLwotICBzYiBzdWI7CQkJLyogY29udGVudHMgb2YgQVJFUEVBVCAqLwotICBpbnQgcmM7Ci0gIGludCByZXQ7Ci0gIGNoYXIgYnVmZmVyWzMwXTsKLQotICBzYl9uZXcgKCZleHApOwotICBzYl9uZXcgKCZjb3B5KTsKLSAgc2JfbmV3ICgmc3ViKTsKLSAgcHJvY2Vzc19hc3NpZ25zIChpZHgsIGluLCAmZXhwKTsKLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkFSRVBFQVQgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmQuXG4iKSwgMCwgJmV4cCwgJnJjKTsKLSAgaWYgKCFtcmkpCi0gICAgcmV0ID0gYnVmZmVyX2FuZF9uZXN0ICgiQVJFUEVBVCIsICJBRU5EUiIsICZzdWIsIGdldF9saW5lKTsKLSAgZWxzZQotICAgIHJldCA9IGJ1ZmZlcl9hbmRfbmVzdCAoIlJFUFQiLCAiRU5EUiIsICZzdWIsIGdldF9saW5lKTsKLSAgaWYgKCEgcmV0KQotICAgIEZBVEFMICgoc3RkZXJyLCBfKCJBUkVQRUFUIHdpdGhvdXQgYSBBRU5EUiBhdCAlZC5cbiIpLCBsaW5lIC0gMSkpOwotICBpZiAocmMgPiAwKQotICAgIHsKLSAgICAgIC8qIFB1c2ggYmFjayB0aGUgdGV4dCBmb2xsb3dpbmcgdGhlIHJlcGVhdCwgYW5kIGFub3RoZXIgcmVwZWF0IGJsb2NrCi0JIHNvCi0JIC5BUkVQRUFUIDIwCi0JIGZvbwotCSAuQUVORFIKLQkgZ2V0cyB0dXJuZWQgaW50bwotCSBmb28KLQkgLkFSRVBFQVQgMTkKLQkgZm9vCi0JIC5BRU5EUgotCSAqLwotICAgICAgaW50IGluZGV4ID0gaW5jbHVkZV9uZXh0X2luZGV4ICgpOwotICAgICAgc2JfYWRkX3NiICgmY29weSwgJnN1Yik7Ci0gICAgICBpZiAocmMgPiAxKQotCXsKLQkgIGlmICghbXJpKQotCSAgICBzcHJpbnRmIChidWZmZXIsICJcdC5BUkVQRUFUCSVkXG4iLCByYyAtIDEpOwotCSAgZWxzZQotCSAgICBzcHJpbnRmIChidWZmZXIsICJcdFJFUFQJJWRcbiIsIHJjIC0gMSk7Ci0JICBzYl9hZGRfc3RyaW5nICgmY29weSwgYnVmZmVyKTsKLQkgIHNiX2FkZF9zYiAoJmNvcHksICZzdWIpOwotCSAgaWYgKCFtcmkpCi0JICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiCS5BRU5EUlxuIik7Ci0JICBlbHNlCi0JICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiCUVORFJcbiIpOwotCX0KLQotICAgICAgaW5jbHVkZV9idWYgKCZleHAsICZjb3B5LCBpbmNsdWRlX3JlcGVhdCwgaW5kZXgpOwotICAgIH0KLSAgc2Jfa2lsbCAoJmV4cCk7Ci0gIHNiX2tpbGwgKCZzdWIpOwotICBzYl9raWxsICgmY29weSk7Ci19Ci0KLS8qIC5FTkRNICovCi0KLXN0YXRpYyB2b2lkCi1kb19lbmRtICgpCi17Ci0gIEVSUk9SICgoc3RkZXJyLCBfKCIuRU5ETSB3aXRob3V0IGEgbWF0Y2hpbmcgLk1BQ1JPLlxuIikpKTsKLX0KLQotLyogTVJJIElSUCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotZG9faXJwIChpZHgsIGluLCBpcnBjKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCBpcnBjOwotewotICBjb25zdCBjaGFyICplcnI7Ci0gIHNiIG91dDsKLQotICBzYl9uZXcgKCZvdXQpOwotCi0gIGVyciA9IGV4cGFuZF9pcnAgKGlycGMsIGlkeCwgaW4sICZvdXQsIGdldF9saW5lLCBjb21tZW50X2NoYXIpOwotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgRVJST1IgKChzdGRlcnIsICIlc1xuIiwgZXJyKSk7Ci0KLSAgZnByaW50ZiAob3V0ZmlsZSwgIiVzIiwgc2JfdGVybWluYXRlICgmb3V0KSk7Ci0KLSAgc2Jfa2lsbCAoJm91dCk7Ci19Ci0KLS8qIE1BQ1JPIFBST0NFU1NJTkcgKi8KLQotLyogUGFyc2Ugb2ZmIExPQ0FMIG4xLCBuMiwuLi4gSW52ZW50IGEgbGFiZWwgbmFtZSBmb3IgaXQgKi8KLXN0YXRpYwotdm9pZCAKLWRvX2xvY2FsIChpZHgsIGxpbmUpCi0gICAgIGludCBpZHggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc2IgKmxpbmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgRVJST1IgKChzdGRlcnIsIF8oIkxPQ0FMIG91dHNpZGUgb2YgTUFDUk8iKSkpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbWFjcm8gKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgY29uc3QgY2hhciAqZXJyOwotICBpbnQgbGluZSA9IGxpbmVjb3VudCAoKTsKLQotICBlcnIgPSBkZWZpbmVfbWFjcm8gKGlkeCwgaW4sICZsYWJlbCwgZ2V0X2xpbmUsIChjb25zdCBjaGFyICoqKSBOVUxMKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIEVSUk9SICgoc3RkZXJyLCBfKCJtYWNybyBhdCBsaW5lICVkOiAlc1xuIiksIGxpbmUgLSAxLCBlcnIpKTsKLX0KLQotc3RhdGljIGludAotbWFjcm9fb3AgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgY29uc3QgY2hhciAqZXJyOwotICBzYiBvdXQ7Ci0gIHNiIG5hbWU7Ci0KLSAgaWYgKCEgbWFjcm9fZGVmaW5lZCkKLSAgICByZXR1cm4gMDsKLQotICBzYl90ZXJtaW5hdGUgKGluKTsKLSAgaWYgKCEgY2hlY2tfbWFjcm8gKGluLT5wdHIgKyBpZHgsICZvdXQsIGNvbW1lbnRfY2hhciwgJmVycikpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIEVSUk9SICgoc3RkZXJyLCAiJXNcbiIsIGVycikpOwotCi0gIHNiX25ldyAoJm5hbWUpOwotICBzYl9hZGRfc3RyaW5nICgmbmFtZSwgXygibWFjcm8gZXhwYW5zaW9uIikpOwotCi0gIGluY2x1ZGVfYnVmICgmbmFtZSwgJm91dCwgaW5jbHVkZV9tYWNybywgaW5jbHVkZV9uZXh0X2luZGV4ICgpKTsKLQotICBzYl9raWxsICgmbmFtZSk7Ci0gIHNiX2tpbGwgKCZvdXQpOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBTVFJJTkcgSEFORExJTkcgKi8KLQotc3RhdGljIGludAotZ2V0c3RyaW5nIChpZHgsIGluLCBhY2MpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKmFjYzsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgd2hpbGUgKGlkeCA8IGluLT5sZW4KLQkgJiYgKGluLT5wdHJbaWR4XSA9PSAnIicgCi0JICAgICB8fCBpbi0+cHRyW2lkeF0gPT0gJzwnIAotCSAgICAgfHwgKGluLT5wdHJbaWR4XSA9PSAnXCcnICYmIGFsdGVybmF0ZSkpKQotICAgIHsKLSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJzwnKQotCXsKLQkgIGlmIChhbHRlcm5hdGUgfHwgbXJpKQotCSAgICB7Ci0JICAgICAgaW50IG5lc3QgPSAwOwotCSAgICAgIGlkeCsrOwotCSAgICAgIHdoaWxlICgoaW4tPnB0cltpZHhdICE9ICc+JyB8fCBuZXN0KQotCQkgICAgICYmIGlkeCA8IGluLT5sZW4pCi0JCXsKLQkJICBpZiAoaW4tPnB0cltpZHhdID09ICchJykKLQkJICAgIHsKLQkJICAgICAgaWR4KysgIDsKLQkJICAgICAgc2JfYWRkX2NoYXIgKGFjYywgaW4tPnB0cltpZHgrK10pOwotCQkgICAgfQotCQkgIGVsc2UgewotCQkgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnPicpCi0JCSAgICAgIG5lc3QtLTsKLQkJICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJzwnKQotCQkgICAgICBuZXN0Kys7Ci0JCSAgICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeCsrXSk7Ci0JCSAgfQotCQl9Ci0JICAgICAgaWR4Kys7Ci0JICAgIH0KLQkgIGVsc2UgewotCSAgICBpbnQgY29kZTsKLQkgICAgaWR4Kys7Ci0JICAgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJDaGFyYWN0ZXIgY29kZSBpbiBzdHJpbmcgbXVzdCBiZSBhYnNvbHV0ZSBleHByZXNzaW9uLlxuIiksCi0JCQkgICAgICAgaWR4LCBpbiwgJmNvZGUpOwotCSAgICBzYl9hZGRfY2hhciAoYWNjLCBjb2RlKTsKLQotCSAgICBpZiAoaW4tPnB0cltpZHhdICE9ICc+JykKLQkgICAgICBFUlJPUiAoKHN0ZGVyciwgXygiTWlzc2luZyA+IGZvciBjaGFyYWN0ZXIgY29kZS5cbiIpKSk7Ci0JICAgIGlkeCsrOwotCSAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicgfHwgaW4tPnB0cltpZHhdID09ICdcJycpCi0JewotCSAgY2hhciB0Y2hhciA9IGluLT5wdHJbaWR4XTsKLQkgIGlkeCsrOwotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4pCi0JICAgIHsKLQkgICAgICBpZiAoYWx0ZXJuYXRlICYmIGluLT5wdHJbaWR4XSA9PSAnIScpCi0JCXsKLQkJICBpZHgrKyAgOwotCQkgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4KytdKTsKLQkJfQotCSAgICAgIGVsc2UgewotCQlpZiAoaW4tPnB0cltpZHhdID09IHRjaGFyKQotCQkgIHsKLQkJICAgIGlkeCsrOwotCQkgICAgaWYgKGlkeCA+PSBpbi0+bGVuIHx8IGluLT5wdHJbaWR4XSAhPSB0Y2hhcikKLQkJICAgICAgYnJlYWs7Ci0JCSAgfQotCQlzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeF0pOwotCQlpZHgrKzsKLQkgICAgICB9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogLlNEQVRBW0N8Wl0gPHN0cmluZz4gKi8KLQotc3RhdGljCi12b2lkCi1kb19zZGF0YSAoaWR4LCBpbiwgdHlwZSkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgdHlwZTsKLXsKLSAgaW50IG5jID0gMDsKLSAgaW50IHBpZHggPSAtMTsKLSAgc2IgYWNjOwotICBzYl9uZXcgKCZhY2MpOwotICBmcHJpbnRmIChvdXRmaWxlLCAiLmJ5dGVcdCIpOwotCi0gIHdoaWxlICghZW9sIChpZHgsIGluKSkKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHNiX3Jlc2V0ICgmYWNjKTsKLSAgICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICAgICAgd2hpbGUgKCFlb2wgKGlkeCwgaW4pKQotCXsKLQkgIHBpZHggPSBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4LCBpbiwgJmFjYywgMCwgMSk7Ci0JICBpZiAodHlwZSA9PSAnYycpCi0JICAgIHsKLQkgICAgICBpZiAoYWNjLmxlbiA+IDI1NSkKLQkJewotCQkgIEVSUk9SICgoc3RkZXJyLCBfKCJzdHJpbmcgZm9yIFNEQVRBQyBsb25nZXIgdGhhbiAyNTUgY2hhcmFjdGVycyAoJWQpLlxuIiksIGFjYy5sZW4pKTsKLQkJfQotCSAgICAgIGZwcmludGYgKG91dGZpbGUsICIlZCIsIGFjYy5sZW4pOwotCSAgICAgIG5jID0gMTsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgYWNjLmxlbjsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKG5jKQotCQl7Ci0JCSAgZnByaW50ZiAob3V0ZmlsZSwgIiwiKTsKLQkJfQotCSAgICAgIGZwcmludGYgKG91dGZpbGUsICIlZCIsIGFjYy5wdHJbaV0pOwotCSAgICAgIG5jID0gMTsKLQkgICAgfQotCi0JICBpZiAodHlwZSA9PSAneicpCi0JICAgIHsKLQkgICAgICBpZiAobmMpCi0JCWZwcmludGYgKG91dGZpbGUsICIsIik7Ci0JICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIjAiKTsKLQkgICAgfQotCSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0JICBpZiAoaWR4ID09IHBpZHgpIGJyZWFrOwotCX0KLSAgICAgIGlmICghYWx0ZXJuYXRlICYmIGluLT5wdHJbaWR4XSAhPSAnLCcgJiYgaWR4ICE9IGluLT5sZW4pCi0JewotCSAgZnByaW50ZiAob3V0ZmlsZSwgIlxuIik7Ci0JICBFUlJPUiAoKHN0ZGVyciwgXygiaWxsZWdhbCBjaGFyYWN0ZXIgaW4gU0RBVEEgbGluZSAoMHgleCkuXG4iKSwgaW4tPnB0cltpZHhdKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZHgrKzsKLSAgICB9Ci0gIHNiX2tpbGwgKCZhY2MpOwotICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKLX0KLQotLyogLlNEQVRBQiA8Y291bnQ+IDxzdHJpbmc+ICovCi0KLXN0YXRpYyB2b2lkCi1kb19zZGF0YWIgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaW50IHJlcGVhdDsKLSAgaW50IGk7Ci0gIHNiIGFjYzsKLSAgc2JfbmV3ICgmYWNjKTsKLQotICBpZHggPSBleHBfZ2V0X2FicyAoXygiTXVzdCBoYXZlIGFic29sdXRlIFNEQVRBQiByZXBlYXQgY291bnQuXG4iKSwgaWR4LCBpbiwgJnJlcGVhdCk7Ci0gIGlmIChyZXBlYXQgPD0gMCkKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiTXVzdCBoYXZlIHBvc2l0aXZlIFNEQVRBQiByZXBlYXQgY291bnQgKCVkKS5cbiIpLCByZXBlYXQpKTsKLSAgICAgIHJlcGVhdCA9IDE7Ci0gICAgfQotCi0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZhY2MpOwotCi0gIGZvciAoaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSkKLQlmcHJpbnRmIChvdXRmaWxlLCAiXHQiKTsKLSAgICAgIGZwcmludGYgKG91dGZpbGUsICIuYnl0ZVx0Iik7Ci0gICAgICBzYl9wcmludCAob3V0ZmlsZSwgJmFjYyk7Ci0gICAgICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKLSAgICB9Ci0gIHNiX2tpbGwgKCZhY2MpOwotCi19Ci0KLXN0YXRpYyBpbnQKLW5ld19maWxlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBGSUxFICpuZXdvbmUgPSBmb3BlbiAobmFtZSwgInIiKTsKLSAgaWYgKCFuZXdvbmUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKGlzcCA9PSBNQVhfSU5DTFVERVMpCi0gICAgRkFUQUwgKChzdGRlcnIsIF8oIlVucmVhc29uYWJsZSBpbmNsdWRlIGRlcHRoICglbGQpLlxuIiksIChsb25nKSBpc3ApKTsKLQotICBzcCsrOwotICBzcC0+aGFuZGxlID0gbmV3b25lOwotCi0gIHNiX25ldyAoJnNwLT5uYW1lKTsKLSAgc2JfYWRkX3N0cmluZyAoJnNwLT5uYW1lLCBuYW1lKTsKLQotICBzcC0+bGluZWNvdW50ID0gMTsKLSAgc3AtPnB1c2hiYWNrX2luZGV4ID0gMDsKLSAgc3AtPnR5cGUgPSBpbmNsdWRlX2ZpbGU7Ci0gIHNwLT5pbmRleCA9IDA7Ci0gIHNiX25ldyAoJnNwLT5wdXNoYmFjayk7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotZG9faW5jbHVkZSAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBzYiB0OwotICBzYiBjYXQ7Ci0gIGluY2x1ZGVfcGF0aCAqaW5jbHVkZXM7Ci0KLSAgc2JfbmV3ICgmdCk7Ci0gIHNiX25ldyAoJmNhdCk7Ci0KLSAgaWYgKCEgbXJpKQotICAgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJnQpOwotICBlbHNlCi0gICAgewotICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gICAgICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiAhIElTV0hJVEUgKGluLT5wdHJbaWR4XSkpCi0JewotCSAgc2JfYWRkX2NoYXIgKCZ0LCBpbi0+cHRyW2lkeF0pOwotCSAgKytpZHg7Ci0JfQotICAgIH0KLQotICBmb3IgKGluY2x1ZGVzID0gcGF0aHNfaGVhZDsgaW5jbHVkZXM7IGluY2x1ZGVzID0gaW5jbHVkZXMtPm5leHQpCi0gICAgewotICAgICAgc2JfcmVzZXQgKCZjYXQpOwotICAgICAgc2JfYWRkX3NiICgmY2F0LCAmaW5jbHVkZXMtPnBhdGgpOwotICAgICAgc2JfYWRkX2NoYXIgKCZjYXQsICcvJyk7Ci0gICAgICBzYl9hZGRfc2IgKCZjYXQsICZ0KTsKLSAgICAgIGlmIChuZXdfZmlsZSAoc2JfbmFtZSAoJmNhdCkpKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGlmICghaW5jbHVkZXMpCi0gICAgewotICAgICAgaWYgKCEgbmV3X2ZpbGUgKHNiX25hbWUgKCZ0KSkpCi0JRkFUQUwgKChzdGRlcnIsIF8oIkNhbid0IG9wZW4gaW5jbHVkZSBmaWxlIGAlcycuXG4iKSwgc2JfbmFtZSAoJnQpKSk7Ci0gICAgfQotICBzYl9raWxsICgmY2F0KTsKLSAgc2Jfa2lsbCAoJnQpOwotfQotCi1zdGF0aWMgdm9pZAotaW5jbHVkZV9wb3AgKCkKLXsKLSAgaWYgKHNwICE9IGluY2x1ZGVfc3RhY2spCi0gICAgewotICAgICAgaWYgKHNwLT5oYW5kbGUpCi0JZmNsb3NlIChzcC0+aGFuZGxlKTsKLSAgICAgIHNwLS07Ci0gICAgfQotfQotCi0vKiBHZXQgdGhlIG5leHQgY2hhcmFjdGVyIGZyb20gdGhlIGluY2x1ZGUgc3RhY2suICBJZiB0aGVyZSdzIGFueXRoaW5nCi0gICBpbiB0aGUgcHVzaGJhY2sgYnVmZmVyLCB0YWtlIHRoYXQgZmlyc3QuICBJZiB3ZSdyZSBhdCBlb2YsIHBvcCBmcm9tCi0gICB0aGUgc3RhY2sgYW5kIHRyeSBhZ2Fpbi4gIEtlZXAgdGhlIGxpbmVjb3VudCB1cCB0byBkYXRlLiAqLwotCi1zdGF0aWMgaW50Ci1nZXQgKCkKLXsKLSAgaW50IHI7Ci0KLSAgaWYgKHNwLT5wdXNoYmFjay5sZW4gIT0gc3AtPnB1c2hiYWNrX2luZGV4KQotICAgIHsKLSAgICAgIHIgPSAoY2hhcikgKHNwLT5wdXNoYmFjay5wdHJbc3AtPnB1c2hiYWNrX2luZGV4KytdKTsKLSAgICAgIC8qIFdoZW4gdGhleSd2ZSBhbGwgZ29uZSwgcmVzZXQgdGhlIHBvaW50ZXIgKi8KLSAgICAgIGlmIChzcC0+cHVzaGJhY2tfaW5kZXggPT0gc3AtPnB1c2hiYWNrLmxlbikKLQl7Ci0JICBzcC0+cHVzaGJhY2subGVuID0gMDsKLQkgIHNwLT5wdXNoYmFja19pbmRleCA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3AtPmhhbmRsZSkKLSAgICB7Ci0gICAgICByID0gZ2V0YyAoc3AtPmhhbmRsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgciA9IEVPRjsKLQotICBpZiAociA9PSBFT0YgJiYgaXNwKQotICAgIHsKLSAgICAgIGluY2x1ZGVfcG9wICgpOwotICAgICAgciA9IGdldCAoKTsKLSAgICAgIHdoaWxlIChyID09IEVPRiAmJiBpc3ApCi0JewotCSAgaW5jbHVkZV9wb3AgKCk7Ci0JICByID0gZ2V0ICgpOwotCX0KLSAgICAgIHJldHVybiByOwotICAgIH0KLSAgaWYgKHIgPT0gJ1xuJykKLSAgICB7Ci0gICAgICBzcC0+bGluZWNvdW50Kys7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotCi1zdGF0aWMgaW50Ci1saW5lY291bnQgKCkKLXsKLSAgcmV0dXJuIHNwLT5saW5lY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWluY2x1ZGVfbmV4dF9pbmRleCAoKQotewotICBzdGF0aWMgaW50IGluZGV4OwotICBpZiAoIXVucmVhc29uYWJsZQotICAgICAgJiYgaW5kZXggPiBNQVhfUkVBU09OQUJMRSkKLSAgICBGQVRBTCAoKHN0ZGVyciwgXygiVW5yZWFzb25hYmxlIGV4cGFuc2lvbiAoLXUgdHVybnMgb2ZmIGNoZWNrKS5cbiIpKSk7Ci0gIHJldHVybiArK2luZGV4OwotfQotCi0KLS8qIEluaXRpYWxpemUgdGhlIGNoYXJ0eXBlIHZlY3Rvci4gKi8KLQotc3RhdGljIHZvaWQKLWNoYXJ0eXBlX2luaXQgKCkKLXsKLSAgaW50IHg7Ci0gIGZvciAoeCA9IDA7IHggPCAyNTY7IHgrKykKLSAgICB7Ci0gICAgICBpZiAoaXNhbHBoYSAoeCkgfHwgeCA9PSAnXycgfHwgeCA9PSAnJCcpCi0JY2hhcnR5cGVbeF0gfD0gRklSU1RCSVQ7Ci0KLSAgICAgIGlmIChtcmkgJiYgeCA9PSAnLicpCi0JY2hhcnR5cGVbeF0gfD0gRklSU1RCSVQ7Ci0KLSAgICAgIGlmIChpc2RpZ2l0ICh4KSB8fCBpc2FscGhhICh4KSB8fCB4ID09ICdfJyB8fCB4ID09ICckJykKLQljaGFydHlwZVt4XSB8PSBORVhUQklUOwotCi0gICAgICBpZiAoeCA9PSAnICcgfHwgeCA9PSAnXHQnIHx8IHggPT0gJywnIHx8IHggPT0gJyInIHx8IHggPT0gJzsnCi0JICB8fCB4ID09ICciJyB8fCB4ID09ICc8JyB8fCB4ID09ICc+JyB8fCB4ID09ICcpJyB8fCB4ID09ICcoJykKLQljaGFydHlwZVt4XSB8PSBTRVBCSVQ7Ci0KLSAgICAgIGlmICh4ID09ICdiJyB8fCB4ID09ICdCJwotCSAgfHwgeCA9PSAncScgfHwgeCA9PSAnUScKLQkgIHx8IHggPT0gJ2gnIHx8IHggPT0gJ0gnCi0JICB8fCB4ID09ICdkJyB8fCB4ID09ICdEJykKLQljaGFydHlwZSBbeF0gfD0gQkFTRUJJVDsKLQkgIAotICAgICAgaWYgKHggPT0gJyAnIHx8IHggPT0gJ1x0JykKLQljaGFydHlwZVt4XSB8PSBXSElURUJJVDsKLQotICAgICAgaWYgKHggPT0gY29tbWVudF9jaGFyKQotCWNoYXJ0eXBlW3hdIHw9IENPTU1FTlRCSVQ7Ci0gICAgfQotfQotCi0KLQotLyogV2hhdCB0byBkbyB3aXRoIGFsbCB0aGUga2V5d29yZHMgKi8KLSNkZWZpbmUgUFJPQ0VTUyAJMHgxMDAwICAvKiBSdW4gc3Vic3RpdHV0aW9uIG92ZXIgdGhlIGxpbmUgKi8KLSNkZWZpbmUgTEFCCQkweDIwMDAgIC8qIFNwaXQgb3V0IHRoZSBsYWJlbCAqLwotCi0jZGVmaW5lIEtfRVFVIAkJKFBST0NFU1N8MSkKLSNkZWZpbmUgS19BU1NJR04gCShQUk9DRVNTfDIpCi0jZGVmaW5lIEtfUkVHIAkJKFBST0NFU1N8MykKLSNkZWZpbmUgS19PUkcgCQkoUFJPQ0VTU3w0KQotI2RlZmluZSBLX1JBRElYIAkoUFJPQ0VTU3w1KQotI2RlZmluZSBLX0RBVEEgCQkoTEFCfFBST0NFU1N8NikKLSNkZWZpbmUgS19EQVRBQiAJKExBQnxQUk9DRVNTfDcpCi0jZGVmaW5lIEtfU0RBVEEgCShMQUJ8UFJPQ0VTU3w4KQotI2RlZmluZSBLX1NEQVRBQiAJKExBQnxQUk9DRVNTfDkpCi0jZGVmaW5lIEtfU0RBVEFDIAkoTEFCfFBST0NFU1N8MTApCi0jZGVmaW5lIEtfU0RBVEFaCShMQUJ8UFJPQ0VTU3wxMSkKLSNkZWZpbmUgS19SRVMgCQkoTEFCfFBST0NFU1N8MTIpCi0jZGVmaW5lIEtfU1JFUyAJCShMQUJ8UFJPQ0VTU3wxMykKLSNkZWZpbmUgS19TUkVTQyAJKExBQnxQUk9DRVNTfDE0KQotI2RlZmluZSBLX1NSRVNaIAkoTEFCfFBST0NFU1N8MTUpCi0jZGVmaW5lIEtfRVhQT1JUIAkoTEFCfFBST0NFU1N8MTYpCi0jZGVmaW5lIEtfR0xPQkFMIAkoTEFCfFBST0NFU1N8MTcpCi0jZGVmaW5lIEtfUFJJTlQgCShMQUJ8UFJPQ0VTU3wxOSkKLSNkZWZpbmUgS19GT1JNIAkJKExBQnxQUk9DRVNTfDIwKQotI2RlZmluZSBLX0hFQURJTkcJKExBQnxQUk9DRVNTfDIxKQotI2RlZmluZSBLX1BBR0UJCShMQUJ8UFJPQ0VTU3wyMikKLSNkZWZpbmUgS19JTVBPUlQJKExBQnxQUk9DRVNTfDIzKQotI2RlZmluZSBLX1BST0dSQU0JKExBQnxQUk9DRVNTfDI0KQotI2RlZmluZSBLX0VORAkJKFBST0NFU1N8MjUpCi0jZGVmaW5lIEtfSU5DTFVERQkoUFJPQ0VTU3wyNikKLSNkZWZpbmUgS19JR05PUkVECShQUk9DRVNTfDI3KQotI2RlZmluZSBLX0FTU0lHTkEJKFBST0NFU1N8MjgpCi0jZGVmaW5lIEtfQVNTSUdOQwkoMjkpCi0jZGVmaW5lIEtfQUlGCQkoUFJPQ0VTU3wzMCkKLSNkZWZpbmUgS19BRUxTRQkJKFBST0NFU1N8MzEpCi0jZGVmaW5lIEtfQUVOREkJCShQUk9DRVNTfDMyKQotI2RlZmluZSBLX0FSRVBFQVQJKFBST0NFU1N8MzMpCi0jZGVmaW5lIEtfQUVORFIJCShQUk9DRVNTfDM0KQotI2RlZmluZSBLX0FXSElMRQkoMzUpCi0jZGVmaW5lIEtfQUVORFcJCShQUk9DRVNTfDM2KQotI2RlZmluZSBLX0VYSVRNCQkoMzcpCi0jZGVmaW5lIEtfTUFDUk8JCShQUk9DRVNTfDM4KQotI2RlZmluZSBLX0VORE0JCSgzOSkKLSNkZWZpbmUgS19BTElHTgkJKFBST0NFU1N8TEFCfDQwKQotI2RlZmluZSBLX0FMVEVSTkFURSAgICAgKDQxKQotI2RlZmluZSBLX0RCCQkoTEFCfFBST0NFU1N8NDIpCi0jZGVmaW5lIEtfRFcJCShMQUJ8UFJPQ0VTU3w0MykKLSNkZWZpbmUgS19ETAkJKExBQnxQUk9DRVNTfDQ0KQotI2RlZmluZSBLX0xPQ0FMCQkoNDUpCi0jZGVmaW5lIEtfSUZFUQkJKFBST0NFU1N8NDYpCi0jZGVmaW5lIEtfSUZORQkJKFBST0NFU1N8NDcpCi0jZGVmaW5lIEtfSUZMVAkJKFBST0NFU1N8NDgpCi0jZGVmaW5lIEtfSUZMRQkJKFBST0NFU1N8NDkpCi0jZGVmaW5lIEtfSUZHRQkJKFBST0NFU1N8NTApCi0jZGVmaW5lIEtfSUZHVAkJKFBST0NFU1N8NTEpCi0jZGVmaW5lIEtfSUZDCQkoUFJPQ0VTU3w1MikKLSNkZWZpbmUgS19JRk5DCQkoUFJPQ0VTU3w1MykKLSNkZWZpbmUgS19JUlAJCShQUk9DRVNTfDU0KQotI2RlZmluZSBLX0lSUEMJCShQUk9DRVNTfDU1KQotCi0KLXN0cnVjdCBrZXl3b3JkCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjb2RlOwotICBpbnQgZXh0cmE7Ci19OwotCi1zdGF0aWMgc3RydWN0IGtleXdvcmQga2luZm9bXSA9Ci17Ci0gIHsgIkVRVSIsIEtfRVFVLCAwIH0sCi0gIHsgIkFMVEVSTkFURSIsIEtfQUxURVJOQVRFLCAwIH0sCi0gIHsgIkFTU0lHTiIsIEtfQVNTSUdOLCAwIH0sCi0gIHsgIlJFRyIsIEtfUkVHLCAwIH0sCi0gIHsgIk9SRyIsIEtfT1JHLCAwIH0sCi0gIHsgIlJBRElYIiwgS19SQURJWCwgMCB9LAotICB7ICJEQVRBIiwgS19EQVRBLCAwIH0sCi0gIHsgIkRCIiwgS19EQiwgMCB9LAotICB7ICJEVyIsIEtfRFcsIDAgfSwKLSAgeyAiREwiLCBLX0RMLCAwIH0sCi0gIHsgIkRBVEFCIiwgS19EQVRBQiwgMCB9LAotICB7ICJTREFUQSIsIEtfU0RBVEEsIDAgfSwKLSAgeyAiU0RBVEFCIiwgS19TREFUQUIsIDAgfSwKLSAgeyAiU0RBVEFaIiwgS19TREFUQVosIDAgfSwKLSAgeyAiU0RBVEFDIiwgS19TREFUQUMsIDAgfSwKLSAgeyAiUkVTIiwgS19SRVMsIDAgfSwKLSAgeyAiU1JFUyIsIEtfU1JFUywgMCB9LAotICB7ICJTUkVTQyIsIEtfU1JFU0MsIDAgfSwKLSAgeyAiU1JFU1oiLCBLX1NSRVNaLCAwIH0sCi0gIHsgIkVYUE9SVCIsIEtfRVhQT1JULCAwIH0sCi0gIHsgIkdMT0JBTCIsIEtfR0xPQkFMLCAwIH0sCi0gIHsgIlBSSU5UIiwgS19QUklOVCwgMCB9LAotICB7ICJGT1JNIiwgS19GT1JNLCAwIH0sCi0gIHsgIkhFQURJTkciLCBLX0hFQURJTkcsIDAgfSwKLSAgeyAiUEFHRSIsIEtfUEFHRSwgMCB9LAotICB7ICJQUk9HUkFNIiwgS19JR05PUkVELCAwIH0sCi0gIHsgIkVORCIsIEtfRU5ELCAwIH0sCi0gIHsgIklOQ0xVREUiLCBLX0lOQ0xVREUsIDAgfSwKLSAgeyAiQVNTSUdOQSIsIEtfQVNTSUdOQSwgMCB9LAotICB7ICJBU1NJR05DIiwgS19BU1NJR05DLCAwIH0sCi0gIHsgIkFJRiIsIEtfQUlGLCAwIH0sCi0gIHsgIkFFTFNFIiwgS19BRUxTRSwgMCB9LAotICB7ICJBRU5ESSIsIEtfQUVOREksIDAgfSwKLSAgeyAiQVJFUEVBVCIsIEtfQVJFUEVBVCwgMCB9LAotICB7ICJBRU5EUiIsIEtfQUVORFIsIDAgfSwKLSAgeyAiRVhJVE0iLCBLX0VYSVRNLCAwIH0sCi0gIHsgIk1BQ1JPIiwgS19NQUNSTywgMCB9LAotICB7ICJFTkRNIiwgS19FTkRNLCAwIH0sCi0gIHsgIkFXSElMRSIsIEtfQVdISUxFLCAwIH0sCi0gIHsgIkFMSUdOIiwgS19BTElHTiwgMCB9LAotICB7ICJBRU5EVyIsIEtfQUVORFcsIDAgfSwKLSAgeyAiQUxURVJOQVRFIiwgS19BTFRFUk5BVEUsIDAgfSwKLSAgeyAiTE9DQUwiLCBLX0xPQ0FMLCAwIH0sCi0gIHsgTlVMTCwgMCwgMCB9Ci19OwotCi0vKiBBbHRob3VnaCB0aGUgY29uZGl0aW9uYWwgb3BlcmF0b3JzIGFyZSBoYW5kbGVkIGJ5IGdhcywgd2UgbmVlZCB0bwotICAgaGFuZGxlIHRoZW0gaGVyZSBhcyB3ZWxsLCBpbiBjYXNlIHRoZXkgYXJlIHVzZWQgaW4gYSByZWN1cnNpdmUKLSAgIG1hY3JvIHRvIGVuZCB0aGUgcmVjdXJzaW9uLiAgKi8KLQotc3RhdGljIHN0cnVjdCBrZXl3b3JkIG1yaWtpbmZvW10gPQotewotICB7ICJJRkVRIiwgS19JRkVRLCAwIH0sCi0gIHsgIklGTkUiLCBLX0lGTkUsIDAgfSwKLSAgeyAiSUZMVCIsIEtfSUZMVCwgMCB9LAotICB7ICJJRkxFIiwgS19JRkxFLCAwIH0sCi0gIHsgIklGR0UiLCBLX0lGR0UsIDAgfSwKLSAgeyAiSUZHVCIsIEtfSUZHVCwgMCB9LAotICB7ICJJRkMiLCBLX0lGQywgMCB9LAotICB7ICJJRk5DIiwgS19JRk5DLCAwIH0sCi0gIHsgIkVMU0VDIiwgS19BRUxTRSwgMCB9LAotICB7ICJFTkRDIiwgS19BRU5ESSwgMCB9LAotICB7ICJNRVhJVCIsIEtfRVhJVE0sIDAgfSwKLSAgeyAiUkVQVCIsIEtfQVJFUEVBVCwgMCB9LAotICB7ICJJUlAiLCBLX0lSUCwgMCB9LAotICB7ICJJUlBDIiwgS19JUlBDLCAwIH0sCi0gIHsgIkVORFIiLCBLX0FFTkRSLCAwIH0sCi0gIHsgTlVMTCwgMCwgMCB9Ci19OwotCi0vKiBMb29rIGZvciBhIHBzZXVkbyBvcCBvbiB0aGUgbGluZS4gSWYgb25lJ3MgdGhlcmUgdGhlbiBjYWxsCi0gICBpdHMgaGFuZGxlci4gKi8KLQotc3RhdGljIGludAotcHJvY2Vzc19wc2V1ZG9fb3AgKGlkeCwgbGluZSwgYWNjKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqbGluZTsKLSAgICAgc2IgKmFjYzsKLXsKLSAgaW50IG9pZHggPSBpZHg7Ci0KLSAgaWYgKGxpbmUtPnB0cltpZHhdID09ICcuJyB8fCBhbHRlcm5hdGUgfHwgbXJpKQotICAgIHsKLSAgICAgIC8qIFNjYW4gZm9yd2FyZCBhbmQgZmluZCBwc2V1ZG8gbmFtZSAqLwotICAgICAgY2hhciAqaW47Ci0gICAgICBoYXNoX2VudHJ5ICpwdHI7Ci0KLSAgICAgIGNoYXIgKnM7Ci0gICAgICBjaGFyICplOwotICAgICAgaWYgKGxpbmUtPnB0cltpZHhdID09ICcuJykKLQlpZHgrKzsKLSAgICAgIGluID0gbGluZS0+cHRyICsgaWR4OwotICAgICAgcyA9IGluOwotICAgICAgZSA9IHM7Ci0gICAgICBzYl9yZXNldCAoYWNjKTsKLQotICAgICAgd2hpbGUgKGlkeCA8IGxpbmUtPmxlbiAmJiAqZSAmJiBJU0ZJUlNUQ0hBUiAoKmUpKQotCXsKLQkgIHNiX2FkZF9jaGFyIChhY2MsICplKTsKLQkgIGUrKzsKLQkgIGlkeCsrOwotCX0KLQotICAgICAgcHRyID0gaGFzaF9sb29rdXAgKCZrZXl3b3JkX2hhc2hfdGFibGUsIGFjYyk7Ci0KLSAgICAgIGlmICghcHRyKQotCXsKLSNpZiAwCi0JICAvKiBUaGlzIG9uZSBjYXVzZXMgbG90cyBvZiBwYWluIHdoZW4gdHJ5aW5nIHRvIHByZXByb2Nlc3MKLQkgICAgIG9yZGluYXJ5IGNvZGUgKi8KLQkgIFdBUk5JTkcgKChzdGRlcnIsIF8oIlVucmVjb2duaXNlZCBwc2V1ZG8gb3AgYCVzJy5cbiIpLCBzYl9uYW1lIChhY2MpKSk7Ci0jZW5kaWYKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGlmIChwdHItPnZhbHVlLmkgJiBMQUIpCi0JewkJCS8qIG91dHB1dCB0aGUgbGFiZWwgKi8KLQkgIGlmIChsYWJlbC5sZW4pCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChvdXRmaWxlLCAiJXM6XHQiLCBzYl9uYW1lICgmbGFiZWwpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBmcHJpbnRmIChvdXRmaWxlLCAiXHQiKTsKLQl9Ci0KLSAgICAgIGlmIChtcmkgJiYgcHRyLT52YWx1ZS5pID09IEtfRU5EKQotCXsKLQkgIHNiIHQ7Ci0KLQkgIHNiX25ldyAoJnQpOwotCSAgc2JfYWRkX2J1ZmZlciAoJnQsIGxpbmUtPnB0ciArIG9pZHgsIGlkeCAtIG9pZHgpOwotCSAgZnByaW50ZiAob3V0ZmlsZSwgIlx0JXMiLCBzYl9uYW1lICgmdCkpOwotCSAgc2Jfa2lsbCAoJnQpOwotCX0KLQotICAgICAgaWYgKHB0ci0+dmFsdWUuaSAmIFBST0NFU1MpCi0JewotCSAgLyogUG9saXNoIHRoZSByZXN0IG9mIHRoZSBsaW5lIGJlZm9yZSBoYW5kbGluZyB0aGUgcHNldWRvIG9wICovCi0jaWYgMAotCSAgc3RyaXBfY29tbWVudHMobGluZSk7Ci0jZW5kaWYKLQkgIHNiX3Jlc2V0IChhY2MpOwotCSAgcHJvY2Vzc19hc3NpZ25zIChpZHgsIGxpbmUsIGFjYyk7Ci0JICBzYl9yZXNldChsaW5lKTsKLQkgIGNoYW5nZV9iYXNlICgwLCBhY2MsIGxpbmUpOwotCSAgaWR4ID0gMDsKLQl9Ci0gICAgICBpZiAoIWNvbmRhc3Nfb24gKCkpCi0JewotCSAgc3dpdGNoIChwdHItPnZhbHVlLmkpCi0JICAgIHsKLQkgICAgY2FzZSBLX0FJRjoKLQkgICAgICBkb19haWYgKGlkeCwgbGluZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgS19BRUxTRToKLQkgICAgICBkb19hZWxzZSAoKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBLX0FFTkRJOgotCSAgICAgIGRvX2FlbmRpICgpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChwdHItPnZhbHVlLmkpCi0JICAgIHsKLQkgICAgY2FzZSBLX0FMVEVSTkFURToKLQkgICAgICBhbHRlcm5hdGUgPSAxOwotCSAgICAgIG1hY3JvX2luaXQgKDEsIG1yaSwgMCwgZXhwX2dldF9hYnMpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQUVMU0U6Ci0JICAgICAgZG9fYWVsc2UgKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BRU5ESToKLQkgICAgICBkb19hZW5kaSAoKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX09SRzoKLQkgICAgICBFUlJPUiAoKHN0ZGVyciwgXygiT1JHIGNvbW1hbmQgbm90IGFsbG93ZWQuXG4iKSkpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEtfUkFESVg6Ci0JICAgICAgZG9fcmFkaXggKGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfREI6Ci0JICAgICAgZG9fZGF0YSAoaWR4LCBsaW5lLCAxKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0RXOgotCSAgICAgIGRvX2RhdGEgKGlkeCwgbGluZSwgMik7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19ETDoKLQkgICAgICBkb19kYXRhIChpZHgsIGxpbmUsIDQpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfREFUQToKLQkgICAgICBkb19kYXRhIChpZHgsIGxpbmUsIDApOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfREFUQUI6Ci0JICAgICAgZG9fZGF0YWIgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TREFUQToKLQkgICAgICBkb19zZGF0YSAoaWR4LCBsaW5lLCAwKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NEQVRBQjoKLQkgICAgICBkb19zZGF0YWIgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TREFUQUM6Ci0JICAgICAgZG9fc2RhdGEgKGlkeCwgbGluZSwgJ2MnKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NEQVRBWjoKLQkgICAgICBkb19zZGF0YSAoaWR4LCBsaW5lLCAneicpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQVNTSUdOOgotCSAgICAgIGRvX2Fzc2lnbiAoMCwgMCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BSUY6Ci0JICAgICAgZG9fYWlmIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQVJFUEVBVDoKLQkgICAgICBkb19hcmVwZWF0IChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQUVORFc6Ci0JICAgICAgZG9fYWVuZHcgKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BV0hJTEU6Ci0JICAgICAgZG9fYXdoaWxlIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQUVORFI6Ci0JICAgICAgZG9fYWVuZHIgKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19FUVU6Ci0JICAgICAgZG9fYXNzaWduICgxLCBpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQUxJR046Ci0JICAgICAgZG9fYWxpZ24gKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19SRVM6Ci0JICAgICAgZG9fcmVzIChpZHgsIGxpbmUsIDApOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfU1JFUzoKLQkgICAgICBkb19yZXMgKGlkeCwgbGluZSwgJ3MnKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lOQ0xVREU6Ci0JICAgICAgZG9faW5jbHVkZSAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0xPQ0FMOgotCSAgICAgIGRvX2xvY2FsIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfTUFDUk86Ci0JICAgICAgZG9fbWFjcm8gKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19FTkRNOgotCSAgICAgIGRvX2VuZG0gKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TUkVTQzoKLQkgICAgICBkb19yZXMgKGlkeCwgbGluZSwgJ2MnKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1BSSU5UOgotCSAgICAgIGRvX3ByaW50IChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfRk9STToKLQkgICAgICBkb19mb3JtIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSEVBRElORzoKLQkgICAgICBkb19oZWFkaW5nIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfUEFHRToKLQkgICAgICBkb19wYWdlICgpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfR0xPQkFMOgotCSAgICBjYXNlIEtfRVhQT1JUOgotCSAgICAgIGRvX2V4cG9ydCAobGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JTVBPUlQ6Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TUkVTWjoKLQkgICAgICBkb19yZXMgKGlkeCwgbGluZSwgJ3onKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lHTk9SRUQ6Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19FTkQ6Ci0JICAgICAgZG9fZW5kIChsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0FTU0lHTkE6Ci0JICAgICAgZG9fYXNzaWduYSAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0FTU0lHTkM6Ci0JICAgICAgZG9fYXNzaWduYyAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0VYSVRNOgotCSAgICAgIGRvX2V4aXRtICgpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfUkVHOgotCSAgICAgIGRvX3JlZyAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGRVE6Ci0JICAgICAgZG9faWYgKGlkeCwgbGluZSwgRVEpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUZORToKLQkgICAgICBkb19pZiAoaWR4LCBsaW5lLCBORSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JRkxUOgotCSAgICAgIGRvX2lmIChpZHgsIGxpbmUsIExUKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGTEU6Ci0JICAgICAgZG9faWYgKGlkeCwgbGluZSwgTEUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUZHRToKLQkgICAgICBkb19pZiAoaWR4LCBsaW5lLCBHRSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JRkdUOgotCSAgICAgIGRvX2lmIChpZHgsIGxpbmUsIEdUKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGQzoKLQkgICAgICBkb19pZmMgKGlkeCwgbGluZSwgMCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JRk5DOgotCSAgICAgIGRvX2lmYyAoaWR4LCBsaW5lLCAxKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lSUDoKLQkgICAgICBkb19pcnAgKGlkeCwgbGluZSwgMCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JUlBDOgotCSAgICAgIGRvX2lycCAoaWR4LCBsaW5lLCAxKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLQotLyogQWRkIGEga2V5d29yZCB0byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGRfa2V5d29yZCAobmFtZSwgY29kZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGNvZGU7Ci17Ci0gIHNiIGxhYmVsOwotICBpbnQgajsKLQotICBzYl9uZXcgKCZsYWJlbCk7Ci0gIHNiX2FkZF9zdHJpbmcgKCZsYWJlbCwgbmFtZSk7Ci0KLSAgaGFzaF9hZGRfdG9faW50X3RhYmxlICgma2V5d29yZF9oYXNoX3RhYmxlLCAmbGFiZWwsIGNvZGUpOwotCi0gIHNiX3Jlc2V0ICgmbGFiZWwpOwotICBmb3IgKGogPSAwOyBuYW1lW2pdOyBqKyspCi0gICAgc2JfYWRkX2NoYXIgKCZsYWJlbCwgbmFtZVtqXSAtICdBJyArICdhJyk7Ci0gIGhhc2hfYWRkX3RvX2ludF90YWJsZSAoJmtleXdvcmRfaGFzaF90YWJsZSwgJmxhYmVsLCBjb2RlKTsKLQotICBzYl9raWxsICgmbGFiZWwpOwotfSAgCi0KLS8qIEJ1aWxkIHRoZSBrZXl3b3JkIGhhc2ggdGFibGUgLSBwdXQgZWFjaCBrZXl3b3JkIGluIHRoZSB0YWJsZSB0d2ljZSwKLSAgIG9uY2UgdXBwZXIgYW5kIG9uY2UgbG93ZXIgY2FzZS4qLwotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19pbml0ICgpCi17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGtpbmZvW2ldLm5hbWU7IGkrKykKLSAgICBhZGRfa2V5d29yZCAoa2luZm9baV0ubmFtZSwga2luZm9baV0uY29kZSk7Ci0KLSAgaWYgKG1yaSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBtcmlraW5mb1tpXS5uYW1lOyBpKyspCi0JYWRkX2tleXdvcmQgKG1yaWtpbmZvW2ldLm5hbWUsIG1yaWtpbmZvW2ldLmNvZGUpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotZG9fZGVmaW5lIChzdHJpbmcpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc2IgbGFiZWw7Ci0gIGludCByZXMgPSAxOwotICBoYXNoX2VudHJ5ICpwdHI7Ci0gIHNiX25ldyAoJmxhYmVsKTsKLQotCi0gIHdoaWxlICgqc3RyaW5nKQotICAgIHsKLSAgICAgIGlmICgqc3RyaW5nID09ICc9JykgCi0JewotCSAgc2IgdmFsdWU7Ci0JICBzYl9uZXcgKCZ2YWx1ZSk7Ci0JICBzdHJpbmcrKzsKLQkgIHdoaWxlICgqc3RyaW5nKQotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKCZ2YWx1ZSwgKnN0cmluZyk7Ci0JICAgICAgc3RyaW5nKys7Ci0JICAgIH0KLQkgIGV4cF9nZXRfYWJzIChfKCJJbnZhbGlkIGV4cHJlc3Npb24gb24gY29tbWFuZCBsaW5lLlxuIiksIDAsICZ2YWx1ZSwgJnJlcyk7Ci0JICBzYl9raWxsICgmdmFsdWUpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgc2JfYWRkX2NoYXIgKCZsYWJlbCwgKnN0cmluZyk7Ci0KLSAgICAgIHN0cmluZyArKzsKLSAgICB9Ci0KLSAgcHRyID0gaGFzaF9jcmVhdGUgKCZ2YXJzLCAmbGFiZWwpOwotICBmcmVlX29sZF9lbnRyeSAocHRyKTsKLSAgcHRyLT50eXBlID0gaGFzaF9pbnRlZ2VyOwotICBwdHItPnZhbHVlLmkgPSByZXM7Ci0gIHNiX2tpbGwgKCZsYWJlbCk7Ci19Ci1jaGFyICpwcm9ncmFtX25hbWU7Ci0KLS8qIFRoZSBsaXN0IG9mIGxvbmcgb3B0aW9ucy4gICovCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsgImFsdGVybmF0ZSIsIG5vX2FyZ3VtZW50LCAwLCAnYScgfSwKLSAgeyAiaW5jbHVkZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSScgfSwKLSAgeyAiY29tbWVudGNoYXIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2MnIH0sCi0gIHsgImNvcHlzb3VyY2UiLCBub19hcmd1bWVudCwgMCwgJ3MnIH0sCi0gIHsgImRlYnVnIiwgbm9fYXJndW1lbnQsIDAsICdkJyB9LAotICB7ICJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJyB9LAotICB7ICJtcmkiLCBub19hcmd1bWVudCwgMCwgJ00nIH0sCi0gIHsgIm91dHB1dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbycgfSwKLSAgeyAicHJpbnQiLCBub19hcmd1bWVudCwgMCwgJ3AnIH0sCi0gIHsgInVucmVhc29uYWJsZSIsIG5vX2FyZ3VtZW50LCAwLCAndScgfSwKLSAgeyAidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAndicgfSwKLSAgeyAiZGVmaW5lIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdkJyB9LAotICB7IE5VTEwsIG5vX2FyZ3VtZW50LCAwLCAwIH0KLX07Ci0KLS8qIFNob3cgYSB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LiAgKi8KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIlwKLVVzYWdlOiAlcyBcblwKLSAgWy1hXSAgICAgIFstLWFsdGVybmF0ZV0gICAgICAgICBlbnRlciBhbHRlcm5hdGUgbWFjcm8gbW9kZVxuXAotICBbLWMgY2hhcl0gWy0tY29tbWVudGNoYXIgY2hhcl0gIGNoYW5nZSB0aGUgY29tbWVudCBjaGFyYWN0ZXIgZnJvbSAhXG5cCi0gIFstZF0gICAgICBbLS1kZWJ1Z10gICAgICAgICAgICAgcHJpbnQgc29tZSBkZWJ1Z2dpbmcgaW5mb1xuXAotICBbLWhdICAgICAgWy0taGVscF0gICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZVxuXAotICBbLU1dICAgICAgWy0tbXJpXSAgICAgICAgICAgICAgIGVudGVyIE1SSSBjb21wYXRpYmlsaXR5IG1vZGVcblwKLSAgWy1vIG91dF0gIFstLW91dHB1dCBvdXRdICAgICAgICBzZXQgdGhlIG91dHB1dCBmaWxlXG5cCi0gIFstcF0gICAgICBbLS1wcmludF0gICAgICAgICAgICAgcHJpbnQgbGluZSBudW1iZXJzXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiXAotICBbLXNdICAgICAgWy0tY29weXNvdXJjZV0gICAgICAgIGNvcHkgc291cmNlIHRocm91Z2ggYXMgY29tbWVudHMgXG5cCi0gIFstdV0gICAgICBbLS11bnJlYXNvbmFibGVdICAgICAgYWxsb3cgdW5yZWFzb25hYmxlIG5lc3RpbmdcblwKLSAgWy12XSAgICAgIFstLXZlcnNpb25dICAgICAgICAgICBwcmludCB0aGUgcHJvZ3JhbSB2ZXJzaW9uXG5cCi0gIFstRG5hbWU9dmFsdWVdICAgICAgICAgICAgICAgICAgY3JlYXRlIHByZXByb2Nlc3NvciB2YXJpYWJsZSBjYWxsZWQgbmFtZSwgd2l0aCB2YWx1ZVxuXAotICBbLUlwYXRoXSAgICAgICAgICAgICAgICAgICAgICAgIGFkZCB0byBpbmNsdWRlIHBhdGggbGlzdFxuXAotICBbaW4tZmlsZV1cbiIpKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIHByaW50ZiAoXygiXG5SZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotLyogRGlzcGxheSBhIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4gICovCi1zdGF0aWMgdm9pZAotc2hvd19oZWxwICgpCi17Ci0gIHByaW50ZiAoXygiJXM6IEdudSBBc3NlbWJsZXIgTWFjcm8gUHJlcHJvY2Vzc29yXG4iKSwKLQkgIHByb2dyYW1fbmFtZSk7Ci0gIHNob3dfdXNhZ2UgKHN0ZG91dCwgMCk7Ci19Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgb3B0OwotICBjaGFyICpvdXRfbmFtZSA9IDA7Ci0gIHNwID0gaW5jbHVkZV9zdGFjazsKLQotICBpZnN0YWNrWzBdLm9uID0gMTsKLSAgaWZpID0gMDsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBoYXNoX25ld190YWJsZSAoMTAxLCAma2V5d29yZF9oYXNoX3RhYmxlKTsKLSAgaGFzaF9uZXdfdGFibGUgKDEwMSwgJmFzc2lnbl9oYXNoX3RhYmxlKTsKLSAgaGFzaF9uZXdfdGFibGUgKDEwMSwgJnZhcnMpOwotCi0gIHNiX25ldyAoJmxhYmVsKTsKLQotICB3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiSTpzZGhhdmM6dXBvOkQ6TSIsIGxvbmdfb3B0aW9ucywKLQkJCSAgICAgKGludCAqKSBOVUxMKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3B0KQotCXsKLQljYXNlICdvJzoKLQkgIG91dF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAndSc6Ci0JICB1bnJlYXNvbmFibGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnSSc6Ci0JICB7Ci0JICAgIGluY2x1ZGVfcGF0aCAqcCA9IChpbmNsdWRlX3BhdGggKikgeG1hbGxvYyAoc2l6ZW9mIChpbmNsdWRlX3BhdGgpKTsKLQkgICAgcC0+bmV4dCA9IE5VTEw7Ci0JICAgIHNiX25ldyAoJnAtPnBhdGgpOwotCSAgICBzYl9hZGRfc3RyaW5nICgmcC0+cGF0aCwgb3B0YXJnKTsKLQkgICAgaWYgKHBhdGhzX3RhaWwpCi0JICAgICAgcGF0aHNfdGFpbC0+bmV4dCA9IHA7Ci0JICAgIGVsc2UKLQkgICAgICBwYXRoc19oZWFkID0gcDsKLQkgICAgcGF0aHNfdGFpbCA9IHA7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIHByaW50X2xpbmVfbnVtYmVyID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2MnOgotCSAgY29tbWVudF9jaGFyID0gb3B0YXJnWzBdOwotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICBhbHRlcm5hdGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBjb3B5c291cmNlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgc3RhdHMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICBkb19kZWZpbmUgKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdNJzoKLQkgIG1yaSA9IDE7Ci0JICBjb21tZW50X2NoYXIgPSAnOyc7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHNob3dfaGVscCAoKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAndic6Ci0JICAvKiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuICAqLwotCSAgcHJpbnRmIChfKCJHTlUgYXNzZW1ibGVyIHByZS1wcm9jZXNzb3IgJXNcbiIpLCBwcm9ncmFtX3ZlcnNpb24pOwotCSAgcHJpbnRmIChfKCJDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIpKTsKLQkgIHByaW50ZiAoXygiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuXAotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIikpOwotCSAgZXhpdCAoMCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgMDoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgLypOT1RSRUFDSEVEKi8KLQl9Ci0gICAgfQotCi0gIHByb2Nlc3NfaW5pdCAoKTsKLQotICBtYWNyb19pbml0IChhbHRlcm5hdGUsIG1yaSwgMCwgZXhwX2dldF9hYnMpOwotCi0gIGlmIChvdXRfbmFtZSkgewotICAgIG91dGZpbGUgPSBmb3BlbiAob3V0X25hbWUsICJ3Iik7Ci0gICAgaWYgKCFvdXRmaWxlKQotICAgICAgewotCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IG9wZW4gb3V0cHV0IGZpbGUgYCVzJy5cbiIpLAotCQkgcHJvZ3JhbV9uYW1lLCBvdXRfbmFtZSk7Ci0JZXhpdCAoMSk7Ci0gICAgICB9Ci0gIH0KLSAgZWxzZSAgewotICAgIG91dGZpbGUgPSBzdGRvdXQ7Ci0gIH0KLQotICBjaGFydHlwZV9pbml0ICgpOwotICBpZiAoIW91dGZpbGUpCi0gICAgb3V0ZmlsZSA9IHN0ZG91dDsKLQotICAvKiBQcm9jZXNzIGFsbCB0aGUgaW5wdXQgZmlsZXMgKi8KLQotICB3aGlsZSAob3B0aW5kIDwgYXJnYykKLSAgICB7Ci0gICAgICBpZiAobmV3X2ZpbGUgKGFyZ3Zbb3B0aW5kXSkpCi0JewotCSAgcHJvY2Vzc19maWxlICgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBDYW4ndCBvcGVuIGlucHV0IGZpbGUgYCVzJy5cbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIGFyZ3Zbb3B0aW5kXSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgICBvcHRpbmQrKzsKLSAgICB9Ci0KLSAgcXVpdCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBiZWNhdXNlIGFuIGFib3J0IGluIHNvbWUgb2YgdGhlIG90aGVyIGZpbGVzCi0gICBtYXkgYmUgY29tcGlsZWQgaW50byBhc19hYm9ydCBiZWNhdXNlIHRoZXkgaW5jbHVkZSBhcy5oLiAgKi8KLQotdm9pZAotYXNfYWJvcnQgKGZpbGUsIGxpbmUsIGZuKQotICAgICBjb25zdCBjaGFyICpmaWxlLCAqZm47Ci0gICAgIGludCBsaW5lOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oIkludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkIiksIGZpbGUsIGxpbmUpOwotICBpZiAoZm4pCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIGluICVzIiwgZm4pOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIlxuUGxlYXNlIHJlcG9ydCB0aGlzIGJ1Zy5cbiIpKTsKLSAgZXhpdCAoMSk7Ci19CmRpZmYgLS1naXQgYS9nYXMvZ2RiaW5pdC5pbiBiL2dhcy9nZGJpbml0LmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTQ2NzI2Li4wMDAwMDAwCi0tLSBhL2dhcy9nZGJpbml0LmluCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotZGlyIEBzcmNkaXJACi1kaXIgLgotCi1icmVhayBhc193YXJuCi1icmVhayBhc193YXJuX3doZXJlCi1icmVhayBhc19iYWQKLWJyZWFrIGFzX2JhZF93aGVyZQotYnJlYWsgYXNfZmF0YWwKLWJyZWFrIGFzX3BlcnJvcgotYnJlYWsgYXNfYXNzZXJ0Ci1icmVhayBhc19hYm9ydAotCi1kZWZpbmUgcGUKLWNhbGwgcHJpbnRfZXhwciAoJCkKLWVuZAotCi1kb2N1bWVudCBwZQotUHJpbnQgKiQgYXMgYW4gZXhwcmVzc2lvblMsIGV4cGFuZGluZyBwYXJhbWV0ZXJzLgotZW5kCi0KLWRlZmluZSBwcwotY2FsbCBwcmludF9zeW1ib2xfdmFsdWUgKCQpCi1lbmQKLQotZG9jdW1lbnQgcHMKLVByaW50ICokIGFzIGEgc3ltYm9sUywgaW5jbHVkaW5nIGV4cHJlc3Npb24gdmFsdWUuCi1lbmQKLQotZGVmaW5lIHBmCi1jYWxsIHByaW50X2ZpeHVwICgkKQotZW5kCi0KLWRvY3VtZW50IHBmCi1QcmludCAqJCBhcyBhIGZpeFMsIGluY2x1ZGluZyBzeW1ib2wgdmFsdWUuCi1lbmQKLQotIyBQdXQgdGhpcyBsYXN0LCBpbiBjYXNlIGl0IGZhaWxzLgotCi1icmVhayBhYm9ydApkaWZmIC0tZ2l0IGEvZ2FzL2hhc2guYyBiL2dhcy9oYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTI5ZmIuLjAwMDAwMDAKLS0tIGEvZ2FzL2hhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDYwMSArMCwwIEBACi0vKiBoYXNoLmMgLS0gZ2FzIGhhc2ggdGFibGUgY29kZQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHZlcnNpb24gb2YgdGhlIGhhc2ggdGFibGUgY29kZSBpcyBhIHdob2xlc2NhbGUgcmVwbGFjZW1lbnQgb2YKLSAgIHRoZSBvbGQgaGFzaCB0YWJsZSBjb2RlLCB3aGljaCB3YXMgZmFpcmx5IGJhZC4gIFRoaXMgaXMgYmFzZWQgb24KLSAgIHRoZSBoYXNoIHRhYmxlIGNvZGUgaW4gQkZELCBidXQgb3B0aW1pemVkIHNsaWdodGx5IGZvciB0aGUKLSAgIGFzc3NlbWJsZXIuICBUaGUgYXNzZW1ibGVyIGRvZXMgbm90IG5lZWQgdG8gZGVyaXZlIHN0cnVjdHVyZXMgdGhhdAotICAgYXJlIHN0b3JlZCBpbiB0aGUgaGFzaCB0YWJsZS4gIEluc3RlYWQsIGl0IGFsd2F5cyBzdG9yZXMgYSBwb2ludGVyLgotICAgVGhlIGFzc2VtYmxlciB1c2VzIHRoZSBoYXNoIHRhYmxlIG1vc3RseSB0byBzdG9yZSBzeW1ib2xzLCBhbmQgd2UKLSAgIGRvbid0IG5lZWQgdG8gY29uZnVzZSB0aGUgc3ltYm9sIHN0cnVjdHVyZSB3aXRoIGEgaGFzaCB0YWJsZQotICAgc3RydWN0dXJlLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgZW50cmllcyB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIERFRkFVTFRfU0laRSAoNDA1MSkKLQotLyogQW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGhhc2hfZW50cnkKLXsKLSAgLyogTmV4dCBlbnRyeSBmb3IgdGhpcyBoYXNoIGNvZGUuICAqLwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqbmV4dDsKLSAgLyogU3RyaW5nIGJlaW5nIGhhc2hlZC4gICovCi0gIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgLyogSGFzaCBjb2RlLiAgVGhpcyBpcyB0aGUgZnVsbCBoYXNoIGNvZGUsIG5vdCB0aGUgaW5kZXggaW50byB0aGUKLSAgICAgdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0gIC8qIFBvaW50ZXIgYmVpbmcgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgUFRSIGRhdGE7Ci19OwotCi0vKiBBIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgaGFzaF9jb250cm9sCi17Ci0gIC8qIFRoZSBoYXNoIGFycmF5LiAgKi8KLSAgc3RydWN0IGhhc2hfZW50cnkgKip0YWJsZTsKLSAgLyogVGhlIG51bWJlciBvZiBzbG90cyBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotICAvKiBBbiBvYnN0YWNrIGZvciB0aGlzIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3Qgb2JzdGFjayBtZW1vcnk7Ci0KLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgLyogU3RhdGlzdGljcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbG9va3VwczsKLSAgdW5zaWduZWQgbG9uZyBoYXNoX2NvbXBhcmVzOwotICB1bnNpZ25lZCBsb25nIHN0cmluZ19jb21wYXJlczsKLSAgdW5zaWduZWQgbG9uZyBpbnNlcnRpb25zOwotICB1bnNpZ25lZCBsb25nIHJlcGxhY2VtZW50czsKLSAgdW5zaWduZWQgbG9uZyBkZWxldGlvbnM7Ci0jZW5kaWYgLyogSEFTSF9TVEFUSVNUSUNTICovCi19OwotCi0vKiBDcmVhdGUgYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm4gYSBjb250cm9sIGJsb2NrLiAgKi8KLQotc3RydWN0IGhhc2hfY29udHJvbCAqCi1oYXNoX25ldyAoKQotewotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgc3RydWN0IGhhc2hfY29udHJvbCAqcmV0OwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgc2l6ZSA9IERFRkFVTFRfU0laRTsKLQotICByZXQgPSAoc3RydWN0IGhhc2hfY29udHJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIG9ic3RhY2tfYmVnaW4gKCZyZXQtPm1lbW9yeSwgY2h1bmtzaXplKTsKLSAgYWxsb2MgPSBzaXplICogc2l6ZW9mIChzdHJ1Y3QgaGFzaF9lbnRyeSAqKTsKLSAgcmV0LT50YWJsZSA9IChzdHJ1Y3QgaGFzaF9lbnRyeSAqKikgb2JzdGFja19hbGxvYyAoJnJldC0+bWVtb3J5LCBhbGxvYyk7Ci0gIG1lbXNldCAocmV0LT50YWJsZSwgMCwgYWxsb2MpOwotICByZXQtPnNpemUgPSBzaXplOwotCi0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gIHJldC0+bG9va3VwcyA9IDA7Ci0gIHJldC0+aGFzaF9jb21wYXJlcyA9IDA7Ci0gIHJldC0+c3RyaW5nX2NvbXBhcmVzID0gMDsKLSAgcmV0LT5pbnNlcnRpb25zID0gMDsKLSAgcmV0LT5yZXBsYWNlbWVudHMgPSAwOwotICByZXQtPmRlbGV0aW9ucyA9IDA7Ci0jZW5kaWYKLQotICByZXR1cm4gcmV0OyAgCi19Ci0KLS8qIERlbGV0ZSBhIGhhc2ggdGFibGUsIGZyZWVpbmcgYWxsIGFsbG9jYXRlZCBtZW1vcnkuICAqLwotCi12b2lkCi1oYXNoX2RpZSAodGFibGUpCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhYmxlOwotewotICBvYnN0YWNrX2ZyZWUgKCZ0YWJsZS0+bWVtb3J5LCAwKTsKLSAgZnJlZSAodGFibGUpOwotfQotCi0vKiBMb29rIHVwIGEgc3RyaW5nIGluIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCi0gICBoYXNoX2VudHJ5LCBvciBOVUxMIGlmIHRoZSBzdHJpbmcgaXMgbm90IGluIHRoZSB0YWJsZS4gIElmIFBMSVNUIGlzCi0gICBub3QgTlVMTCwgdGhpcyBzZXRzICpQTElTVCB0byBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIGxpc3Qgd2hpY2gKLSAgIHdvdWxkIGhvbGQgdGhpcyBoYXNoIGVudHJ5LiAgSWYgUEhBU0ggaXMgbm90IE5VTEwsIHRoaXMgc2V0cyAqUEhBU0gKLSAgIHRvIHRoZSBoYXNoIGNvZGUgZm9yIEtFWS4KLQotICAgRWFjaCB0aW1lIHdlIGxvb2sgdXAgYSBzdHJpbmcsIHdlIG1vdmUgaXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaXN0Ci0gICBmb3IgaXRzIGhhc2ggY29kZSwgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgcmVmZXJlbnRpYWwgbG9jYWxpdHkuICAqLwotCi1zdGF0aWMgc3RydWN0IGhhc2hfZW50cnkgKmhhc2hfbG9va3VwIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwKLQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBoYXNoX2VudHJ5ICoqKiwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKikpOwotCi1zdGF0aWMgc3RydWN0IGhhc2hfZW50cnkgKgotaGFzaF9sb29rdXAgKHRhYmxlLCBrZXksIHBsaXN0LCBwaGFzaCkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgc3RydWN0IGhhc2hfZW50cnkgKioqcGxpc3Q7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnBoYXNoOwotewotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGhhc2g7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBjOwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICoqbGlzdDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpwcmV2OwotCi0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gICsrdGFibGUtPmxvb2t1cHM7Ci0jZW5kaWYKLQotICBoYXNoID0gMDsKLSAgbGVuID0gMDsKLSAgcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIGtleTsKLSAgd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBoYXNoICs9IGMgKyAoYyA8PCAxNyk7Ci0gICAgICBoYXNoIF49IGhhc2ggPj4gMjsKLSAgICAgICsrbGVuOwotICAgIH0KLSAgaGFzaCArPSBsZW4gKyAobGVuIDw8IDE3KTsKLSAgaGFzaCBePSBoYXNoID4+IDI7Ci0KLSAgaWYgKHBoYXNoICE9IE5VTEwpCi0gICAgKnBoYXNoID0gaGFzaDsKLQotICBpbmRleCA9IGhhc2ggJSB0YWJsZS0+c2l6ZTsKLSAgbGlzdCA9IHRhYmxlLT50YWJsZSArIGluZGV4OwotCi0gIGlmIChwbGlzdCAhPSBOVUxMKQotICAgICpwbGlzdCA9IGxpc3Q7Ci0KLSAgcHJldiA9IE5VTEw7Ci0gIGZvciAocCA9ICpsaXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIHsKLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgICAgICsrdGFibGUtPmhhc2hfY29tcGFyZXM7Ci0jZW5kaWYKLQotICAgICAgaWYgKHAtPmhhc2ggPT0gaGFzaCkKLQl7Ci0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0JICArK3RhYmxlLT5zdHJpbmdfY29tcGFyZXM7Ci0jZW5kaWYKLQotCSAgaWYgKHN0cmNtcCAocC0+c3RyaW5nLCBrZXkpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAocHJldiAhPSBOVUxMKQotCQl7Ci0JCSAgcHJldi0+bmV4dCA9IHAtPm5leHQ7Ci0JCSAgcC0+bmV4dCA9ICpsaXN0OwotCQkgICpsaXN0ID0gcDsKLQkJfQotCi0JICAgICAgcmV0dXJuIHA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHByZXYgPSBwOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSW5zZXJ0IGFuIGVudHJ5IGludG8gYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm5zIE5VTEwgb24gc3VjY2Vzcy4KLSAgIE9uIGVycm9yLCBpdCByZXR1cm5zIGEgcHJpbnRhYmxlIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBlcnJvci4gIEl0Ci0gICBpcyBjb25zaWRlcmVkIHRvIGJlIGFuIGVycm9yIGlmIHRoZSBlbnRyeSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKLSAgIGhhc2ggdGFibGUuICAqLwotCi1jb25zdCBjaGFyICoKLWhhc2hfaW5zZXJ0ICh0YWJsZSwga2V5LCB2YWx1ZSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgUFRSIHZhbHVlOwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKipsaXN0OwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0KLSAgcCA9IGhhc2hfbG9va3VwICh0YWJsZSwga2V5LCAmbGlzdCwgJmhhc2gpOwotICBpZiAocCAhPSBOVUxMKQotICAgIHJldHVybiAiZXhpc3RzIjsKLQotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICArK3RhYmxlLT5pbnNlcnRpb25zOwotI2VuZGlmCi0KLSAgcCA9IG9ic3RhY2tfYWxsb2MgKCZ0YWJsZS0+bWVtb3J5LCBzaXplb2YgKnApOwotICBwLT5zdHJpbmcgPSBrZXk7Ci0gIHAtPmhhc2ggPSBoYXNoOwotICBwLT5kYXRhID0gdmFsdWU7Ci0KLSAgcC0+bmV4dCA9ICpsaXN0OwotICAqbGlzdCA9IHA7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEluc2VydCBvciByZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBOVUxMIG9uCi0gICBzdWNjZXNzLiAgT24gZXJyb3IsIGl0IHJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIGluZGljYXRpbmcgdGhlCi0gICBlcnJvci4gIElmIGFuIGVudHJ5IGFscmVhZHkgZXhpc3RzLCBpdHMgdmFsdWUgaXMgcmVwbGFjZWQuICAqLwotCi1jb25zdCBjaGFyICoKLWhhc2hfamFtICh0YWJsZSwga2V5LCB2YWx1ZSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgUFRSIHZhbHVlOwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKipsaXN0OwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0KLSAgcCA9IGhhc2hfbG9va3VwICh0YWJsZSwga2V5LCAmbGlzdCwgJmhhc2gpOwotICBpZiAocCAhPSBOVUxMKQotICAgIHsKLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgICAgICsrdGFibGUtPnJlcGxhY2VtZW50czsKLSNlbmRpZgotCi0gICAgICBwLT5kYXRhID0gdmFsdWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICAgICAgKyt0YWJsZS0+aW5zZXJ0aW9uczsKLSNlbmRpZgotCi0gICAgICBwID0gb2JzdGFja19hbGxvYyAoJnRhYmxlLT5tZW1vcnksIHNpemVvZiAqcCk7Ci0gICAgICBwLT5zdHJpbmcgPSBrZXk7Ci0gICAgICBwLT5oYXNoID0gaGFzaDsKLSAgICAgIHAtPmRhdGEgPSB2YWx1ZTsKLQotICAgICAgcC0+bmV4dCA9ICpsaXN0OwotICAgICAgKmxpc3QgPSBwOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmVwbGFjZSBhbiBleGlzdGluZyBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgdGhlIG9sZAotICAgdmFsdWUgc3RvcmVkIGZvciB0aGUgZW50cnkuICBJZiB0aGUgZW50cnkgaXMgbm90IGZvdW5kIGluIHRoZSBoYXNoCi0gICB0YWJsZSwgdGhpcyBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMgTlVMTC4gICovCi0KLVBUUgotaGFzaF9yZXBsYWNlICh0YWJsZSwga2V5LCB2YWx1ZSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgUFRSIHZhbHVlOwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLSAgUFRSIHJldDsKLQotICBwID0gaGFzaF9sb29rdXAgKHRhYmxlLCBrZXksIE5VTEwsIE5VTEwpOwotICBpZiAocCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gICsrdGFibGUtPnJlcGxhY2VtZW50czsKLSNlbmRpZgotCi0gIHJldCA9IHAtPmRhdGE7Ci0KLSAgcC0+ZGF0YSA9IHZhbHVlOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEZpbmQgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLCByZXR1cm5pbmcgaXRzIHZhbHVlLiAgUmV0dXJucyBOVUxMCi0gICBpZiB0aGUgZW50cnkgaXMgbm90IGZvdW5kLiAgKi8KLQotUFRSCi1oYXNoX2ZpbmQgKHRhYmxlLCBrZXkpCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICprZXk7Ci17Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpwOwotCi0gIHAgPSBoYXNoX2xvb2t1cCAodGFibGUsIGtleSwgTlVMTCwgTlVMTCk7Ci0gIGlmIChwID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIHAtPmRhdGE7Ci19Ci0KLS8qIERlbGV0ZSBhbiBlbnRyeSBmcm9tIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkCi0gICBmb3IgdGhhdCBlbnRyeSwgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBzdWNoIGVudHJ5LiAgKi8KLQotUFRSCi1oYXNoX2RlbGV0ZSAodGFibGUsIGtleSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLXsKLSAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICoqbGlzdDsKLQotICBwID0gaGFzaF9sb29rdXAgKHRhYmxlLCBrZXksICZsaXN0LCBOVUxMKTsKLSAgaWYgKHAgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAocCAhPSAqbGlzdCkKLSAgICBhYm9ydCAoKTsKLQotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICArK3RhYmxlLT5kZWxldGlvbnM7Ci0jZW5kaWYKLQotICAqbGlzdCA9IHAtPm5leHQ7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIG5ldmVyIHJlY2xhaW0gdGhlIG1lbW9yeSBmb3IgdGhpcyBlbnRyeS4gIElmIGdhcwotICAgICBldmVyIHN0YXJ0cyBkZWxldGluZyBoYXNoIHRhYmxlIGVudHJpZXMgaW4gYSBiaWcgd2F5LCB0aGlzIHdpbGwKLSAgICAgaGF2ZSB0byBjaGFuZ2UuICAqLwotCi0gIHJldHVybiBwLT5kYXRhOwotfQotCi0vKiBUcmF2ZXJzZSBhIGhhc2ggdGFibGUuICBDYWxsIHRoZSBmdW5jdGlvbiBvbiBldmVyeSBlbnRyeSBpbiB0aGUKLSAgIGhhc2ggdGFibGUuICAqLwotCi12b2lkCi1oYXNoX3RyYXZlcnNlICh0YWJsZSwgcGZuKQotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLSAgICAgdm9pZCAoKnBmbikgUEFSQU1TICgoY29uc3QgY2hhciAqa2V5LCBQVFIgdmFsdWUpKTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyArK2kpCi0gICAgewotICAgICAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0KLSAgICAgIGZvciAocCA9IHRhYmxlLT50YWJsZVtpXTsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkoKnBmbikgKHAtPnN0cmluZywgcC0+ZGF0YSk7Ci0gICAgfQotfQotCi0vKiBQcmludCBoYXNoIHRhYmxlIHN0YXRpc3RpY3Mgb24gdGhlIHNwZWNpZmllZCBmaWxlLiAgTkFNRSBpcyB0aGUKLSAgIG5hbWUgb2YgdGhlIGhhc2ggdGFibGUsIHVzZWQgZm9yIHByaW50aW5nIGEgaGVhZGVyLiAgKi8KLQotdm9pZAotaGFzaF9wcmludF9zdGF0aXN0aWNzIChmLCBuYW1lLCB0YWJsZSkKLSAgICAgRklMRSAqZiBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhYmxlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBsb25nIHRvdGFsOwotICB1bnNpZ25lZCBsb25nIGVtcHR5OwotCi0gIGZwcmludGYgKGYsICIlcyBoYXNoIHN0YXRpc3RpY3M6XG4iLCBuYW1lKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IGxvb2t1cHNcbiIsIHRhYmxlLT5sb29rdXBzKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IGhhc2ggY29tcGFyaXNvbnNcbiIsIHRhYmxlLT5oYXNoX2NvbXBhcmVzKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IHN0cmluZyBjb21wYXJpc29uc1xuIiwgdGFibGUtPnN0cmluZ19jb21wYXJlcyk7Ci0gIGZwcmludGYgKGYsICJcdCVsdSBpbnNlcnRpb25zXG4iLCB0YWJsZS0+aW5zZXJ0aW9ucyk7Ci0gIGZwcmludGYgKGYsICJcdCVsdSByZXBsYWNlbWVudHNcbiIsIHRhYmxlLT5yZXBsYWNlbWVudHMpOwotICBmcHJpbnRmIChmLCAiXHQlbHUgZGVsZXRpb25zXG4iLCB0YWJsZS0+ZGVsZXRpb25zKTsKLQotICB0b3RhbCA9IDA7Ci0gIGVtcHR5ID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyArK2kpCi0gICAgewotICAgICAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0KLSAgICAgIGlmICh0YWJsZS0+dGFibGVbaV0gPT0gTlVMTCkKLQkrK2VtcHR5OwotICAgICAgZWxzZQotCXsKLQkgIGZvciAocCA9IHRhYmxlLT50YWJsZVtpXTsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkgICAgKyt0b3RhbDsKLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGYsICJcdCVnIGF2ZXJhZ2UgY2hhaW4gbGVuZ3RoXG4iLCAoZG91YmxlKSB0b3RhbCAvIHRhYmxlLT5zaXplKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IGVtcHR5IHNsb3RzXG4iLCBlbXB0eSk7Ci0jZW5kaWYKLX0KLQwKLSNpZmRlZiBURVNUCi0KLS8qIFRoaXMgdGVzdCBwcm9ncmFtIGlzIGxlZnQgb3ZlciBmcm9tIHRoZSBvbGQgaGFzaCB0YWJsZSBjb2RlLiAgKi8KLQotI2RlZmluZSBUQUJMRVMgKDYpCQkvKiBudW1iZXIgb2YgaGFzaCB0YWJsZXMgdG8gbWFpbnRhaW4gKi8KLQkJCQkvKiAoYXQgb25jZSkgaW4gYW55IHRlc3RpbmcgKi8KLSNkZWZpbmUgU1RBVEJVRlNJWkUgKDEyKQkvKiB3ZSBjYW4gaGF2ZSAxMiBzdGF0aXN0aWNzICovCi0KLWludCBzdGF0YnVmW1NUQVRCVUZTSVpFXTsJLyogZGlzcGxheSBzdGF0aXN0aWNzIGhlcmUgKi8KLWNoYXIgYW5zd2VyWzEwMF07CQkvKiBodW1hbiBmYXJ0cyBoZXJlICovCi1jaGFyICpoYXNodGFibGVbVEFCTEVTXTsJLyogd2UgdGVzdCBtYW55IGhhc2ggdGFibGVzIGF0IG9uY2UgKi8KLWNoYXIgKmg7CQkJLyogcG9pbnRzIHRvIGN1cmVudCBoYXNoX2NvbnRyb2wgKi8KLWNoYXIgKipwcDsKLWNoYXIgKnA7Ci1jaGFyICpuYW1lOwotY2hhciAqdmFsdWU7Ci1pbnQgc2l6ZTsKLWludCB1c2VkOwotY2hhciBjb21tYW5kOwotaW50IG51bWJlcjsJCQkvKiBudW1iZXIgMDpUQUJMRVMtMSBvZiBjdXJyZW50IGhhc2hlZCAqLwotCQkJCS8qIHN5bWJvbCB0YWJsZSAqLwotCi1pbnQKLW1haW4gKCkKLXsKLSAgdm9pZCBhcHBsaWNhdGVlICgpOwotICB2b2lkIGRlc3Ryb3kgKCk7Ci0gIGNoYXIgKndoYXQgKCk7Ci0gIGludCAqaXA7Ci0KLSAgbnVtYmVyID0gMDsKLSAgaCA9IDA7Ci0gIHByaW50ZiAoInR5cGUgaCA8UkVUVVJOPiBmb3IgaGVscFxuIik7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgcHJpbnRmICgiaGFzaF90ZXN0IGNvbW1hbmQ6ICIpOwotICAgICAgZ2V0cyAoYW5zd2VyKTsKLSAgICAgIGNvbW1hbmQgPSBhbnN3ZXJbMF07Ci0gICAgICBpZiAoaXN1cHBlciAoY29tbWFuZCkpCi0JY29tbWFuZCA9IHRvbG93ZXIgKGNvbW1hbmQpOwkvKiBlY2NoISAqLwotICAgICAgc3dpdGNoIChjb21tYW5kKQotCXsKLQljYXNlICcjJzoKLQkgIHByaW50ZiAoIm9sZCBoYXNoIHRhYmxlICM9JWQuXG4iLCBudW1iZXIpOwotCSAgd2hhdHRhYmxlICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAnPyc6Ci0JICBmb3IgKHBwID0gaGFzaHRhYmxlOyBwcCA8IGhhc2h0YWJsZSArIFRBQkxFUzsgcHArKykKLQkgICAgewotCSAgICAgIHByaW50ZiAoImFkZHJlc3Mgb2YgaGFzaCB0YWJsZSAjJWQgY29udHJvbCBibG9jayBpcyAleHhcbiIKLQkJICAgICAgLHBwIC0gaGFzaHRhYmxlLCAqcHApOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIGhhc2hfdHJhdmVyc2UgKGgsIGFwcGxpY2F0ZWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBoYXNoX3RyYXZlcnNlIChoLCBkZXN0cm95KTsKLQkgIGhhc2hfZGllIChoKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgcCA9IGhhc2hfZmluZCAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSk7Ci0JICBwcmludGYgKCJ2YWx1ZSBvZiBcIiVzXCIgaXMgXCIlc1wiXG4iLCBuYW1lLCBwID8gcCA6ICJOT1QtUFJFU0VOVCIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICBwcmludGYgKCIjIHNob3cgb2xkLCBzZWxlY3QgbmV3IGRlZmF1bHQgaGFzaCB0YWJsZSBudW1iZXJcbiIpOwotCSAgcHJpbnRmICgiPyBkaXNwbGF5IGFsbCBoYXNodGFibGUgY29udHJvbCBibG9jayBhZGRyZXNzZXNcbiIpOwotCSAgcHJpbnRmICgiYSBhcHBseSBhIHNpbXBsZSBkaXNwbGF5LWVyIHRvIGVhY2ggc3ltYm9sIGluIHRhYmxlXG4iKTsKLQkgIHByaW50ZiAoImQgZGllOiBkZXN0cm95IGhhc2h0YWJsZVxuIik7Ci0JICBwcmludGYgKCJmIGZpbmQgdmFsdWUgb2Ygbm9taW5hdGVkIHN5bWJvbFxuIik7Ci0JICBwcmludGYgKCJoIHRoaXMgaGVscFxuIik7Ci0JICBwcmludGYgKCJpIGluc2VydCB2YWx1ZSBpbnRvIHN5bWJvbFxuIik7Ci0JICBwcmludGYgKCJqIGphbSB2YWx1ZSBpbnRvIHN5bWJvbFxuIik7Ci0JICBwcmludGYgKCJuIG5ldyBoYXNodGFibGVcbiIpOwotCSAgcHJpbnRmICgiciByZXBsYWNlIGEgdmFsdWUgd2l0aCBhbm90aGVyXG4iKTsKLQkgIHByaW50ZiAoInMgc2F5IHdoYXQgJSUgb2YgdGFibGUgaXMgdXNlZFxuIik7Ci0JICBwcmludGYgKCJxIGV4aXQgdGhpcyBwcm9ncmFtXG4iKTsKLQkgIHByaW50ZiAoInggZGVsZXRlIGEgc3ltYm9sIGZyb20gdGFibGUsIHJlcG9ydCBpdHMgdmFsdWVcbiIpOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICBwID0gaGFzaF9pbnNlcnQgKGgsIG5hbWUgPSB3aGF0ICgic3ltYm9sIiksIHZhbHVlID0gd2hhdCAoInZhbHVlIikpOwotCSAgaWYgKHApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJzeW1ib2w9XCIlc1wiICB2YWx1ZT1cIiVzXCIgIGVycm9yPSVzXG4iLCBuYW1lLCB2YWx1ZSwKLQkJICAgICAgcCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ2onOgotCSAgcCA9IGhhc2hfamFtIChoLCBuYW1lID0gd2hhdCAoInN5bWJvbCIpLCB2YWx1ZSA9IHdoYXQgKCJ2YWx1ZSIpKTsKLQkgIGlmIChwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgic3ltYm9sPVwiJXNcIiAgdmFsdWU9XCIlc1wiICBlcnJvcj0lc1xuIiwgbmFtZSwgdmFsdWUsIHApOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIGggPSBoYXNodGFibGVbbnVtYmVyXSA9IChjaGFyICopIGhhc2hfbmV3ICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAncSc6Ci0JICBleGl0IChFWElUX1NVQ0NFU1MpOwotCWNhc2UgJ3InOgotCSAgcCA9IGhhc2hfcmVwbGFjZSAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSwgdmFsdWUgPSB3aGF0ICgidmFsdWUiKSk7Ci0JICBwcmludGYgKCJvbGQgdmFsdWUgd2FzIFwiJXNcIlxuIiwgcCA/IHAgOiAie30iKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgaGFzaF9zYXkgKGgsIHN0YXRidWYsIFNUQVRCVUZTSVpFKTsKLQkgIGZvciAoaXAgPSBzdGF0YnVmOyBpcCA8IHN0YXRidWYgKyBTVEFUQlVGU0laRTsgaXArKykKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVkICIsICppcCk7Ci0JICAgIH0KLQkgIHByaW50ZiAoIlxuIik7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIHAgPSBoYXNoX2RlbGV0ZSAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSk7Ci0JICBwcmludGYgKCJvbGQgdmFsdWUgd2FzIFwiJXNcIlxuIiwgcCA/IHAgOiAie30iKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBwcmludGYgKCJJIGNhbid0IHVuZGVyc3RhbmQgY29tbWFuZCBcIiVjXCJcbiIsIGNvbW1hbmQpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotY2hhciAqCi13aGF0IChkZXNjcmlwdGlvbikKLSAgICAgY2hhciAqZGVzY3JpcHRpb247Ci17Ci0gIGNoYXIgKnJldHZhbDsKLSAgY2hhciAqbWFsbG9jICgpOwotCi0gIHByaW50ZiAoIiAgICVzIDogIiwgZGVzY3JpcHRpb24pOwotICBnZXRzIChhbnN3ZXIpOwotICAvKiB3aWxsIG9uZSBkYXkgY2xlYW4gdXAgYW5zd2VyIGhlcmUgKi8KLSAgcmV0dmFsID0gbWFsbG9jIChzdHJsZW4gKGFuc3dlcikgKyAxKTsKLSAgaWYgKCFyZXR2YWwpCi0gICAgewotICAgICAgZXJyb3IgKCJyb29tIik7Ci0gICAgfQotICAodm9pZCkgc3RyY3B5IChyZXR2YWwsIGFuc3dlcik7Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQotdm9pZAotZGVzdHJveSAoc3RyaW5nLCB2YWx1ZSkKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBjaGFyICp2YWx1ZTsKLXsKLSAgZnJlZSAoc3RyaW5nKTsKLSAgZnJlZSAodmFsdWUpOwotfQotCi0KLXZvaWQKLWFwcGxpY2F0ZWUgKHN0cmluZywgdmFsdWUpCi0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgY2hhciAqdmFsdWU7Ci17Ci0gIHByaW50ZiAoIiUuMjBzLSUuMjBzXG4iLCBzdHJpbmcsIHZhbHVlKTsKLX0KLQotdm9pZAotd2hhdHRhYmxlICgpCQkJLyogZGV0ZXJtaW5lIG51bWJlcjogd2hhdCBoYXNoIHRhYmxlIHRvIHVzZSAqLwotCQkJICAgICAgICAvKiBhbHNvIGRldGVybWluZSBoOiBwb2ludHMgdG8gaGFzaF9jb250cm9sICovCi17Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBwcmludGYgKCIgICB3aGF0IGhhc2ggdGFibGUgKCVkOiVkKSA/ICAiLCAwLCBUQUJMRVMgLSAxKTsKLSAgICAgIGdldHMgKGFuc3dlcik7Ci0gICAgICBzc2NhbmYgKGFuc3dlciwgIiVkIiwgJm51bWJlcik7Ci0gICAgICBpZiAobnVtYmVyID49IDAgJiYgbnVtYmVyIDwgVEFCTEVTKQotCXsKLQkgIGggPSBoYXNodGFibGVbbnVtYmVyXTsKLQkgIGlmICghaCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIndhcm5pbmc6IGN1cnJlbnQgaGFzaC10YWJsZS0jJWQuIGhhcyBubyBoYXNoLWNvbnRyb2xcbiIsIG51bWJlcik7Ci0JICAgIH0KLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiaW52YWxpZCBoYXNoIHRhYmxlIG51bWJlcjogJWRcbiIsIG51bWJlcik7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmIC8qICNpZmRlZiBURVNUICovCi0KLS8qIGVuZCBvZiBoYXNoLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9oYXNoLmggYi9nYXMvaGFzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjU5ZDlmLi4wMDAwMDAwCi0tLSBhL2dhcy9oYXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiBoYXNoLmggLS0gaGVhZGVyIGZpbGUgZm9yIGdhcyBoYXNoIHRhYmxlIHJvdXRpbmVzCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgSEFTSF9ICi0jZGVmaW5lIEhBU0hfSAotCi1zdHJ1Y3QgaGFzaF9jb250cm9sOwotCi0vKiBDcmVhdGUgYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm4gYSBjb250cm9sIGJsb2NrLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhc2hfbmV3IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogRGVsZXRlIGEgaGFzaCB0YWJsZSwgZnJlZWluZyBhbGwgYWxsb2NhdGVkIG1lbW9yeS4gICovCi0KLWV4dGVybiB2b2lkIGhhc2hfZGllIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKikpOwotCi0vKiBJbnNlcnQgYW4gZW50cnkgaW50byBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgTlVMTCBvbiBzdWNjZXNzLgotICAgT24gZXJyb3IsIGl0IHJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIGluZGljYXRpbmcgdGhlIGVycm9yLiAgSXQKLSAgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gZXJyb3IgaWYgdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RzIGluIHRoZQotICAgaGFzaCB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpoYXNoX2luc2VydCBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosCi0JCQkJCWNvbnN0IGNoYXIgKmtleSwgUFRSIHZhbHVlKSk7Ci0KLS8qIEluc2VydCBvciByZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBOVUxMIG9uCi0gICBzdWNjZXNzLiAgT24gZXJyb3IsIGl0IHJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIGluZGljYXRpbmcgdGhlCi0gICBlcnJvci4gIElmIGFuIGVudHJ5IGFscmVhZHkgZXhpc3RzLCBpdHMgdmFsdWUgaXMgcmVwbGFjZWQuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqaGFzaF9qYW0gUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLAotCQkJCSAgICAgY29uc3QgY2hhciAqa2V5LCBQVFIgdmFsdWUpKTsKLQotLyogUmVwbGFjZSBhbiBleGlzdGluZyBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgdGhlIG9sZAotICAgdmFsdWUgc3RvcmVkIGZvciB0aGUgZW50cnkuICBJZiB0aGUgZW50cnkgaXMgbm90IGZvdW5kIGluIHRoZSBoYXNoCi0gICB0YWJsZSwgdGhpcyBkb2VzIG5vdGhpbmcgYW5kIHJldHVybnMgTlVMTC4gICovCi0KLWV4dGVybiBQVFIgaGFzaF9yZXBsYWNlIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqa2V5LAotCQkJCSBQVFIgdmFsdWUpKTsKLQotLyogRmluZCBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUsIHJldHVybmluZyBpdHMgdmFsdWUuICBSZXR1cm5zIE5VTEwKLSAgIGlmIHRoZSBlbnRyeSBpcyBub3QgZm91bmQuICAqLwotCi1leHRlcm4gUFRSIGhhc2hfZmluZCBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKmtleSkpOwotCi0vKiBEZWxldGUgYW4gZW50cnkgZnJvbSBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZAotICAgZm9yIHRoYXQgZW50cnksIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm8gc3VjaCBlbnRyeS4gICovCi0KLWV4dGVybiBQVFIgaGFzaF9kZWxldGUgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICprZXkpKTsKLQotLyogVHJhdmVyc2UgYSBoYXNoIHRhYmxlLiAgQ2FsbCB0aGUgZnVuY3Rpb24gb24gZXZlcnkgZW50cnkgaW4gdGhlCi0gICBoYXNoIHRhYmxlLiAgKi8KLQotZXh0ZXJuIHZvaWQgaGFzaF90cmF2ZXJzZSBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosCi0JCQkJICAgdm9pZCAoKnBmbikgKGNvbnN0IGNoYXIgKmtleSwgUFRSIHZhbHVlKSkpOwotCi0vKiBQcmludCBoYXNoIHRhYmxlIHN0YXRpc3RpY3Mgb24gdGhlIHNwZWNpZmllZCBmaWxlLiAgTkFNRSBpcyB0aGUKLSAgIG5hbWUgb2YgdGhlIGhhc2ggdGFibGUsIHVzZWQgZm9yIHByaW50aW5nIGEgaGVhZGVyLiAgKi8KLQotZXh0ZXJuIHZvaWQgaGFzaF9wcmludF9zdGF0aXN0aWNzIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJICAgc3RydWN0IGhhc2hfY29udHJvbCAqKSk7Ci0KLSNlbmRpZiAvKiBIQVNIX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9pbnB1dC1maWxlLmMgYi9nYXMvaW5wdXQtZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRmNmY3Li4wMDAwMDAwCi0tLSBhL2dhcy9pbnB1dC1maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyogaW5wdXRfZmlsZS5jIC0gRGVhbCB3aXRoIElucHV0IEZpbGVzIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogQ29uZmluZXMgYWxsIGRldGFpbHMgb2YgcmVhZGluZyBzb3VyY2UgYnl0ZXMgdG8gdGhpcyBtb2R1bGUuCi0gKiBBbGwgTy9TIHNwZWNpZmljIGNyb2NrcyBzaG91bGQgbGl2ZSBoZXJlLgotICogV2hhdCB3ZSBsb3NlIGluICJlZmZpY2llbmN5IiB3ZSBnYWluIGluIG1vZHVsYXJpdHkuCi0gKiBOb3RlIHdlIGRvbid0IG5lZWQgdG8gI2luY2x1ZGUgdGhlICJhcy5oIiBmaWxlLiBObyBjb21tb24gY291cGxpbmchCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImlucHV0LWZpbGUuaCIKLQotc3RhdGljIGludCBpbnB1dF9maWxlX2dldCBQQVJBTVMgKChjaGFyICosIGludCkpOwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIG5vbi16ZXJvIGlmIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyByZWFkIHNob3VsZCBiZQotICAgcHJlcHJvY2Vzc2VkIGJ5IGFwcC4gIEl0IGlzIHplcm8gaWYgdGhlIGZpbGUgY2FuIGJlIHJlYWQgc3RyYWlnaHQgaW4uCi0gICAqLwotaW50IHByZXByb2Nlc3MgPSAwOwotCi0vKgotICogVGhpcyBjb2RlIG9wZW5zIGEgZmlsZSwgdGhlbiBkZWxpdmVycyBCVUZGRVJfU0laRSBjaGFyYWN0ZXIKLSAqIGNodW5rcyBvZiB0aGUgZmlsZSBvbiBkZW1hbmQuCi0gKiBCVUZGRVJfU0laRSBpcyBzdXBwb3NlZCB0byBiZSBhIG51bWJlciBjaG9zZW4gZm9yIHNwZWVkLgotICogVGhlIGNhbGxlciBvbmx5IGFza3Mgb25jZSB3aGF0IEJVRkZFUl9TSVpFIGlzLCBhbmQgYXNrcyBiZWZvcmUKLSAqIHRoZSBuYXR1cmUgb2YgdGhlIGlucHV0IGZpbGVzIChpZiBhbnkpIGlzIGtub3duLgotICovCi0KLSNkZWZpbmUgQlVGRkVSX1NJWkUgKDMyICogMTAyNCkKLQotLyoKLSAqIFdlIHVzZSBzdGF0aWMgZGF0YTogdGhlIGRhdGEgYXJlYSBpcyBub3Qgc2hhcmFibGUuCi0gKi8KLQotc3RhdGljIEZJTEUgKmZfaW47Ci1zdGF0aWMgY2hhciAqZmlsZV9uYW1lOwotCi0vKiBTdHJ1Y3QgZm9yIHNhdmluZyB0aGUgc3RhdGUgb2YgdGhpcyBtb2R1bGUgZm9yIGZpbGUgaW5jbHVkZXMuICAqLwotc3RydWN0IHNhdmVkX2ZpbGUKLSAgewotICAgIEZJTEUgKmZfaW47Ci0gICAgY2hhciAqZmlsZV9uYW1lOwotICAgIGludCBwcmVwcm9jZXNzOwotICAgIGNoYXIgKmFwcF9zYXZlOwotICB9OwotDAotLyogVGhlc2UgaG9va3MgYWNjb21vZGF0ZSBtb3N0IG9wZXJhdGluZyBzeXN0ZW1zLiAqLwotCi12b2lkIAotaW5wdXRfZmlsZV9iZWdpbiAoKQotewotICBmX2luID0gKEZJTEUgKikgMDsKLX0KLQotdm9pZCAKLWlucHV0X2ZpbGVfZW5kICgpCi17Ci19Ci0KLS8qIFJldHVybiBCVUZGRVJfU0laRS4gKi8KLXVuc2lnbmVkIGludCAKLWlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCkKLXsKLSAgcmV0dXJuIChCVUZGRVJfU0laRSk7Ci19Ci0KLWludCAKLWlucHV0X2ZpbGVfaXNfb3BlbiAoKQotewotICByZXR1cm4gZl9pbiAhPSAoRklMRSAqKSAwOwotfQotCi0vKiBQdXNoIHRoZSBzdGF0ZSBvZiBvdXIgaW5wdXQsIHJldHVybmluZyBhIHBvaW50ZXIgdG8gc2F2ZWQgaW5mbyB0aGF0Ci0gICBjYW4gYmUgcmVzdG9yZWQgd2l0aCBpbnB1dF9maWxlX3BvcCAoKS4gICovCi1jaGFyICoKLWlucHV0X2ZpbGVfcHVzaCAoKQotewotICByZWdpc3RlciBzdHJ1Y3Qgc2F2ZWRfZmlsZSAqc2F2ZWQ7Ci0KLSAgc2F2ZWQgPSAoc3RydWN0IHNhdmVkX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpzYXZlZCk7Ci0KLSAgc2F2ZWQtPmZfaW4gPSBmX2luOwotICBzYXZlZC0+ZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotICBzYXZlZC0+cHJlcHJvY2VzcyA9IHByZXByb2Nlc3M7Ci0gIGlmIChwcmVwcm9jZXNzKQotICAgIHNhdmVkLT5hcHBfc2F2ZSA9IGFwcF9wdXNoICgpOwotCi0gIGlucHV0X2ZpbGVfYmVnaW4gKCk7CQkvKiBJbml0aWFsaXplIGZvciBuZXcgZmlsZSAqLwotCi0gIHJldHVybiAoY2hhciAqKSBzYXZlZDsKLX0KLQotdm9pZAotaW5wdXRfZmlsZV9wb3AgKGFyZykKLSAgICAgY2hhciAqYXJnOwotewotICByZWdpc3RlciBzdHJ1Y3Qgc2F2ZWRfZmlsZSAqc2F2ZWQgPSAoc3RydWN0IHNhdmVkX2ZpbGUgKikgYXJnOwotCi0gIGlucHV0X2ZpbGVfZW5kICgpOwkJLyogQ2xvc2Ugb3V0IG9sZCBmaWxlICovCi0KLSAgZl9pbiA9IHNhdmVkLT5mX2luOwotICBmaWxlX25hbWUgPSBzYXZlZC0+ZmlsZV9uYW1lOwotICBwcmVwcm9jZXNzID0gc2F2ZWQtPnByZXByb2Nlc3M7Ci0gIGlmIChwcmVwcm9jZXNzKQotICAgIGFwcF9wb3AgKHNhdmVkLT5hcHBfc2F2ZSk7Ci0KLSAgZnJlZSAoYXJnKTsKLX0KLQwKLXZvaWQKLWlucHV0X2ZpbGVfb3BlbiAoZmlsZW5hbWUsIHByZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7CQkvKiAiIiBtZWFucyB1c2Ugc3RkaW4uIE11c3Qgbm90IGJlIDAuICovCi0gICAgIGludCBwcmU7Ci17Ci0gIGludCBjOwotICBjaGFyIGJ1Zls4MF07Ci0KLSAgcHJlcHJvY2VzcyA9IHByZTsKLQotICBhc3NlcnQgKGZpbGVuYW1lICE9IDApOwkvKiBGaWxlbmFtZSBtYXkgbm90IGJlIE5VTEwuICovCi0gIGlmIChmaWxlbmFtZVswXSkKLSAgICB7CQkJCS8qIFdlIGhhdmUgYSBmaWxlIG5hbWUuIFN1Y2sgaXQgYW5kIHNlZS4gKi8KLSAgICAgIGZfaW4gPSBmb3BlbiAoZmlsZW5hbWUsICJyIik7Ci0gICAgICBmaWxlX25hbWUgPSBmaWxlbmFtZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7CQkJCS8qIHVzZSBzdGRpbiBmb3IgdGhlIGlucHV0IGZpbGUuICovCi0gICAgICBmX2luID0gc3RkaW47Ci0gICAgICBmaWxlX25hbWUgPSBfKCJ7c3RhbmRhcmQgaW5wdXR9Iik7CS8qIEZvciBlcnJvciBtZXNzYWdlcy4gKi8KLSAgICB9Ci0gIGlmIChmX2luID09IChGSUxFICopIDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDYW4ndCBvcGVuICVzIGZvciByZWFkaW5nLiIpLCBmaWxlX25hbWUpOwotICAgICAgYXNfcGVycm9yICgiJXMiLCBmaWxlX25hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjID0gZ2V0YyAoZl9pbik7Ci0gIGlmIChjID09ICcjJykKLSAgICB7CQkJCS8qIEJlZ2lucyB3aXRoIGNvbW1lbnQsIG1heSBub3Qgd2FudCB0byBwcmVwcm9jZXNzICovCi0gICAgICBjID0gZ2V0YyAoZl9pbik7Ci0gICAgICBpZiAoYyA9PSAnTicpCi0JewotCSAgZmdldHMgKGJ1ZiwgODAsIGZfaW4pOwotCSAgaWYgKCFzdHJjbXAgKGJ1ZiwgIk9fQVBQXG4iKSkKLQkgICAgcHJlcHJvY2VzcyA9IDA7Ci0JICBpZiAoIXN0cmNociAoYnVmLCAnXG4nKSkKLQkgICAgdW5nZXRjICgnIycsIGZfaW4pOwkvKiBJdCB3YXMgbG9uZ2VyICovCi0JICBlbHNlCi0JICAgIHVuZ2V0YyAoJ1xuJywgZl9pbik7Ci0JfQotICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nKQotCXVuZ2V0YyAoJ1xuJywgZl9pbik7Ci0gICAgICBlbHNlCi0JdW5nZXRjICgnIycsIGZfaW4pOwotICAgIH0KLSAgZWxzZQotICAgIHVuZ2V0YyAoYywgZl9pbik7Ci19Ci0KLS8qIENsb3NlIGlucHV0IGZpbGUuICAqLwotdm9pZCAKLWlucHV0X2ZpbGVfY2xvc2UgKCkKLXsKLSAgaWYgKGZfaW4gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmY2xvc2UgKGZfaW4pOwotICAgIH0JCQkJLyogZG9uJ3QgY2xvc2UgYSBudWxsIGZpbGUgcG9pbnRlciAqLwotICBmX2luID0gMDsKLX0JCQkJLyogaW5wdXRfZmlsZV9jbG9zZSgpICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIGRvX3NjcnViX2NoYXJzLiAgKi8KLQotc3RhdGljIGludAotaW5wdXRfZmlsZV9nZXQgKGJ1ZiwgYnVmbGVuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBidWZsZW47Ci17Ci0gIGludCBzaXplOwotCi0gIHNpemUgPSBmcmVhZCAoYnVmLCBzaXplb2YgKGNoYXIpLCBidWZsZW4sIGZfaW4pOwotICBpZiAoc2l6ZSA8IDApCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJDYW4ndCByZWFkIGZyb20gJXMiKSwgZmlsZV9uYW1lKTsKLSAgICAgIHNpemUgPSAwOwotICAgIH0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIFJlYWQgYSBidWZmZXIgZnJvbSB0aGUgaW5wdXQgZmlsZS4gICovCi0KLWNoYXIgKgotaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyICh3aGVyZSkKLSAgICAgY2hhciAqd2hlcmU7CQkvKiBXaGVyZSB0byBwbGFjZSAxc3QgY2hhcmFjdGVyIG9mIG5ldyBidWZmZXIuICovCi17Ci0gIGNoYXIgKnJldHVybl92YWx1ZTsJCS8qIC0+IExhc3QgY2hhciBvZiB3aGF0IHdlIHJlYWQsICsgMS4gKi8KLSAgcmVnaXN0ZXIgaW50IHNpemU7Ci0KLSAgaWYgKGZfaW4gPT0gKEZJTEUgKikgMCkKLSAgICByZXR1cm4gMDsKLSAgLyoKLSAgICogZmZsdXNoIChzdGRpbik7IGNvdWxkIGJlIGRvbmUgaGVyZSBpZiB5b3Ugd2FudCB0byBzeW5jaHJvbmlzZQotICAgKiBzdGRpbiBhbmQgc3Rkb3V0LCBmb3IgdGhlIGNhc2Ugd2hlcmUgb3VyIGlucHV0IGZpbGUgaXMgc3RkaW4uCi0gICAqIFNpbmNlIHRoZSBhc3NlbWJsZXIgc2hvdWxkbid0IGRvIGFueSBvdXRwdXQgdG8gc3Rkb3V0LCB3ZQotICAgKiBkb24ndCBib3RoZXIgdG8gc3luY2ggb3V0cHV0IGFuZCBpbnB1dC4KLSAgICovCi0gIGlmIChwcmVwcm9jZXNzKQotICAgIHNpemUgPSBkb19zY3J1Yl9jaGFycyAoaW5wdXRfZmlsZV9nZXQsIHdoZXJlLCBCVUZGRVJfU0laRSk7Ci0gIGVsc2UKLSAgICBzaXplID0gZnJlYWQgKHdoZXJlLCBzaXplb2YgKGNoYXIpLCBCVUZGRVJfU0laRSwgZl9pbik7Ci0gIGlmIChzaXplIDwgMCkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkNhbid0IHJlYWQgZnJvbSAlcyIpLCBmaWxlX25hbWUpOwotICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotICBpZiAoc2l6ZSkKLSAgICByZXR1cm5fdmFsdWUgPSB3aGVyZSArIHNpemU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZmNsb3NlIChmX2luKSkKLQlhc19wZXJyb3IgKF8oIkNhbid0IGNsb3NlICVzIiksIGZpbGVfbmFtZSk7Ci0gICAgICBmX2luID0gKEZJTEUgKikgMDsKLSAgICAgIHJldHVybl92YWx1ZSA9IDA7Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0KLS8qIGVuZCBvZiBpbnB1dC1maWxlLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9pbnB1dC1maWxlLmggYi9nYXMvaW5wdXQtZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjliZjI4Li4wMDAwMDAwCi0tLSBhL2dhcy9pbnB1dC1maWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKiBpbnB1dF9maWxlLmggaGVhZGVyIGZvciBpbnB1dC1maWxlLmMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiJpbnB1dF9maWxlLmMiOk9wZXJhdGluZy1zeXN0ZW0gZGVwZW5kYW50IGZ1bmN0aW9ucyB0byByZWFkIHNvdXJjZSBmaWxlcy4qLwotCi0KLS8qCi0gKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgdGhpcyBtb2R1bGUgbXVzdCBwcm92aWRlIHRoZQotICogZm9sbG93aW5nIHNlcnZpY2VzIHRvIGl0cyBjYWxsZXJzLgotICoKLSAqIGlucHV0X2ZpbGVfYmVnaW4oKQkJCUNhbGwgb25jZSBiZWZvcmUgYW55dGhpbmcgZWxzZS4KLSAqCi0gKiBpbnB1dF9maWxlX2VuZCgpCQkJQ2FsbCBvbmNlIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4KLSAqCi0gKiBpbnB1dF9maWxlX2J1ZmZlcl9zaXplKCkJCUNhbGwgYW55dGltZS4gUmV0dXJucyBsYXJnZXN0IHBvc3NpYmxlCi0gKgkJCQkJZGVsaXZlcnkgZnJvbQotICoJCQkJCWlucHV0X2ZpbGVfZ2l2ZV9uZXh0X2J1ZmZlcigpLgotICoKLSAqIGlucHV0X2ZpbGVfb3BlbihuYW1lKQkJQ2FsbCBvbmNlIGZvciBlYWNoIGlucHV0IGZpbGUuCi0gKgotICogaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKHdoZXJlKQlDYWxsIG9uY2UgdG8gZ2V0IGVhY2ggbmV3IGJ1ZmZlci4KLSAqCQkJCQlSZXR1cm4gMDogbm8gbW9yZSBjaGFycyBsZWZ0IGluIGZpbGUsCi0gKgkJCQkJICAgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuCi0gKgkJCQkJT3RoZXJ3aXNlOiByZXR1cm4gYSBwb2ludGVyIHRvIGp1c3QKLSAqCQkJCQkgICBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgd2UgcmVhZAotICoJCQkJCSAgIGludG8gdGhlIGJ1ZmZlci4KLSAqCQkJCQlJZiB3ZSBjYW4gb25seSByZWFkIDAgY2hhcmFjdGVycywgdGhlbgotICoJCQkJCWVuZC1vZi1maWxlIGlzIGZha2VkLgotICoKLSAqIGlucHV0X2ZpbGVfcHVzaCgpCQkJUHVzaCBzdGF0ZSwgd2hpY2ggY2FuIGJlIHJlc3RvcmVkCi0gKgkJCQkJbGF0ZXIuICBEb2VzIGltcGxpY2l0IGlucHV0X2ZpbGVfYmVnaW4uCi0gKgkJCQkJUmV0dXJucyBjaGFyICogdG8gc2F2ZWQgc3RhdGUuCi0gKgotICogaW5wdXRfZmlsZV9wb3AgKGFyZykJCQlQb3BzIHByZXZpb3VzbHkgc2F2ZWQgc3RhdGUuCi0gKgotICogaW5wdXRfZmlsZV9jbG9zZSAoKQkJCUNsb3NlcyBvcGVuZWQgZmlsZS4KLSAqCi0gKiBBbGwgZXJyb3JzIGFyZSByZXBvcnRlZCAodXNpbmcgYXNfcGVycm9yKSBzbyBjYWxsZXIgZG9lc24ndCBoYXZlIHRvIHRoaW5rCi0gKiBhYm91dCBJL08gZXJyb3JzLiBObyBJL08gZXJyb3JzIGFyZSBmYXRhbDogYW4gZW5kLW9mLWZpbGUgbWF5IGJlIGZha2VkLgotICovCi0KLWNoYXIgKmlucHV0X2ZpbGVfZ2l2ZV9uZXh0X2J1ZmZlciBQQVJBTVMgKChjaGFyICp3aGVyZSkpOwotY2hhciAqaW5wdXRfZmlsZV9wdXNoIFBBUkFNUyAoKHZvaWQpKTsKLXVuc2lnbmVkIGludCBpbnB1dF9maWxlX2J1ZmZlcl9zaXplIFBBUkFNUyAoKHZvaWQpKTsKLWludCBpbnB1dF9maWxlX2lzX29wZW4gUEFSQU1TICgodm9pZCkpOwotdm9pZCBpbnB1dF9maWxlX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfZmlsZV9jbG9zZSBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGlucHV0X2ZpbGVfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfZmlsZV9vcGVuIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lLCBpbnQgcHJlKSk7Ci12b2lkIGlucHV0X2ZpbGVfcG9wIFBBUkFNUyAoKGNoYXIgKmFyZykpOwotCi0vKiBlbmQgb2YgaW5wdXRfZmlsZS5oICovCmRpZmYgLS1naXQgYS9nYXMvaW5wdXQtc2NydWIuYyBiL2dhcy9pbnB1dC1zY3J1Yi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmEzYmIzLi4wMDAwMDAwCi0tLSBhL2dhcy9pbnB1dC1zY3J1Yi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8qIGlucHV0X3NjcnViLmMgLSBCcmVhayB1cCBpbnB1dCBidWZmZXJzIGludG8gd2hvbGUgbnVtYmVycyBvZiBsaW5lcy4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgkJLyogTmVlZCB0aGlzIHRvIG1ha2UgZXJybm8gZGVjbGFyYXRpb24gcmlnaHQgKi8KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImlucHV0LWZpbGUuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgImxpc3RpbmcuaCIKLQotLyoKLSAqIE8vUyBpbmRlcGVuZGVudCBtb2R1bGUgdG8gc3VwcGx5IGJ1ZmZlcnMgb2Ygc2FuaXRpc2VkIHNvdXJjZSBjb2RlCi0gKiB0byByZXN0IG9mIGFzc2VtYmxlci4gIFdlIGdldCBzYW5pdGlzZWQgaW5wdXQgZGF0YSBvZiBhcmJpdHJhcnkgbGVuZ3RoLgotICogV2UgYnJlYWsgdGhlc2UgYnVmZmVycyBvbiBsaW5lIGJvdW5kYXJpZXMsIHJlY29tYmluZSBwaWVjZXMgdGhhdAotICogd2VyZSBicm9rZW4gYWNyb3NzIGJ1ZmZlcnMsIGFuZCByZXR1cm4gYSBidWZmZXIgb2YgZnVsbCBsaW5lcyB0bwotICogdGhlIGNhbGxlci4KLSAqIFRoZSBsYXN0IHBhcnRpYWwgbGluZSBiZWdpbnMgdGhlIG5leHQgYnVmZmVyIHdlIGJ1aWxkIGFuZCByZXR1cm4gdG8gY2FsbGVyLgotICogVGhlIGJ1ZmZlciByZXR1cm5lZCB0byBjYWxsZXIgaXMgcHJlY2VlZGVkIGJ5IEJFRk9SRV9TVFJJTkcgYW5kIGZvbGxvd2VkCi0gKiBieSBBRlRFUl9TVFJJTkcsIGFzIHNlbnRpbmVscy4gVGhlIGxhc3QgY2hhcmFjdGVyIGJlZm9yZSBBRlRFUl9TVFJJTkcKLSAqIGlzIGEgbmV3bGluZS4KLSAqIEFsc28gbG9va3MgYWZ0ZXIgbGluZSBudW1iZXJzLCBmb3IgZS5nLiBlcnJvciBtZXNzYWdlcy4KLSAqLwotCi0vKgotICogV2UgZG9uJ3QgY2FyZSBob3cgZmlsdGh5IG91ciBidWZmZXJzIGFyZSwgYnV0IG91ciBjYWxsZXJzIGFzc3VtZQotICogdGhhdCB0aGUgZm9sbG93aW5nIHNhbml0YXRpb24gaGFzIGFscmVhZHkgYmVlbiBkb25lLgotICoKLSAqIE5vIGNvbW1lbnRzLCByZWR1Y2UgYSBjb21tZW50IHRvIGEgc3BhY2UuCi0gKiBSZWR1Y2UgYSB0YWIgdG8gYSBzcGFjZSB1bmxlc3MgaXQgaXMgMXN0IGNoYXIgb2YgbGluZS4KLSAqIEFsbCBtdWx0aXBsZSB0YWJzIGFuZCBzcGFjZXMgY29sbGFwc2VkIGludG8gMSBjaGFyLiBUYWIgb25seQotICogICBsZWdhbCBpZiAxc3QgY2hhciBvZiBsaW5lLgotICogIyBsaW5lIGZpbGUgc3RhdGVtZW50cyBjb252ZXJ0ZWQgdG8gLmxpbmUgeDsuZmlsZSB5OyBzdGF0ZW1lbnRzLgotICogRXNjYXBlZCBuZXdsaW5lcyBhdCBlbmQgb2YgbGluZTogcmVtb3ZlIHRoZW0gYnV0IGFkZCBhcyBtYW55IG5ld2xpbmVzCi0gKiAgIHRvIGVuZCBvZiBzdGF0ZW1lbnQgYXMgeW91IHJlbW92ZWQgaW4gdGhlIG1pZGRsZSwgdG8gc3luY2ggbGluZSBudW1iZXJzLgotICovCi0MCi0jZGVmaW5lIEJFRk9SRV9TVFJJTkcgKCJcbiIpCi0jZGVmaW5lIEFGVEVSX1NUUklORyAoIlwwIikJLyogbWVtY3B5IG9mIDAgY2hhcnMgbWlnaHQgY2hva2UuICovCi0jZGVmaW5lIEJFRk9SRV9TSVpFICgxKQotI2RlZmluZSBBRlRFUl9TSVpFICAoMSkKLQotc3RhdGljIGNoYXIgKmJ1ZmZlcl9zdGFydDsJLyotPjFzdCBjaGFyIG9mIGZ1bGwgYnVmZmVyIGFyZWEuICovCi1zdGF0aWMgY2hhciAqcGFydGlhbF93aGVyZTsJLyotPmFmdGVyIGxhc3QgZnVsbCBsaW5lIGluIGJ1ZmZlci4gKi8KLXN0YXRpYyBpbnQgcGFydGlhbF9zaXplOwkvKiA+PTAuIE51bWJlciBvZiBjaGFycyBpbiBwYXJ0aWFsIGxpbmUgaW4gYnVmZmVyLiAqLwotc3RhdGljIGNoYXIgc2F2ZV9zb3VyY2VbQUZURVJfU0laRV07Ci0vKiBCZWNhdXNlIHdlIG5lZWQgQUZURVJfU1RSSU5HIGp1c3QgYWZ0ZXIgbGFzdCAqLwotLyogZnVsbCBsaW5lLCBpdCBjbG9iYmVycyAxc3QgcGFydCBvZiBwYXJ0aWFsICovCi0vKiBsaW5lLiBTbyB3ZSBwcmVzZXJ2ZSAxc3QgcGFydCBvZiBwYXJ0aWFsICovCi0vKiBsaW5lIGhlcmUuICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGJ1ZmZlcl9sZW5ndGg7CS8qIFdoYXQgaXMgdGhlIGxhcmdlc3Qgc2l6ZSBidWZmZXIgdGhhdCAqLwotLyogaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKCkgY291bGQgKi8KLS8qIHJldHVybiB0byB1cz8gKi8KLQotLyogVGhlIGluZGV4IGludG8gYW4gc2Igc3RydWN0dXJlIHdlIGFyZSByZWFkaW5nIGZyb20uICAtMSBpZiBub25lLiAgKi8KLXN0YXRpYyBpbnQgc2JfaW5kZXggPSAtMTsKLQotLyogSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBhbiBzYiBzdHJ1Y3R1cmUsIHRoaXMgaXMgaXQuICAqLwotc3RhdGljIHNiIGZyb21fc2I7Ci0KLS8qIFRoZSBudW1iZXIgb2YgbmVzdGVkIHNiIHN0cnVjdHVyZXMgd2UgaGF2ZSBpbmNsdWRlZC4gICovCi1pbnQgbWFjcm9fbmVzdDsKLQotLyogV2UgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBzb3VyY2UgZmlsZSBvcGVuIGF0IG9uY2UsIHRob3VnaCB0aGUgaW5mbyBmb3IgYWxsCi0gICBidXQgdGhlIGxhdGVzdCBvbmUgYXJlIHNhdmVkIG9mZiBpbiBhIHN0cnVjdCBpbnB1dF9zYXZlLiAgVGhlc2UgZmlsZXMgcmVtYWluCi0gICBvcGVuLCBzbyB3ZSBhcmUgbGltaXRlZCBieSB0aGUgbnVtYmVyIG9mIG9wZW4gZmlsZXMgYWxsb3dlZCBieSB0aGUKLSAgIHVuZGVybHlpbmcgT1MuIFdlIG1heSBhbHNvIHNlcXVlbnRpYWxseSByZWFkIG1vcmUgdGhhbiBvbmUgc291cmNlIGZpbGUgaW4gYW4KLSAgIGFzc2VtYmx5LiAqLwotCi0vKiBXZSBtdXN0IHRyYWNrIHRoZSBwaHlzaWNhbCBmaWxlIGFuZCBsaW5lIG51bWJlciBmb3IgZXJyb3IgbWVzc2FnZXMuIFdlIGFsc28KLSAgIHRyYWNrIGEgImxvZ2ljYWwiIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gKEM/KSAgY29tcGlsZXIKLSAgIHNvdXJjZSBsaW5lIG51bWJlcnMuICBXaGVuZXZlciB3ZSBvcGVuIGEgZmlsZSB3ZSBtdXN0IGZpbGwgaW4KLSAgIHBoeXNpY2FsX2lucHV0X2ZpbGUuIFNvIGlmIGl0IGlzIE5VTEwgd2UgaGF2ZSBub3Qgb3BlbmVkIGFueSBmaWxlcyB5ZXQuICovCi0KLXN0YXRpYyBjaGFyICpwaHlzaWNhbF9pbnB1dF9maWxlOwotc3RhdGljIGNoYXIgKmxvZ2ljYWxfaW5wdXRfZmlsZTsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXJUOwkvKiAxLW9yaWdpbiBsaW5lIG51bWJlciBpbiBhIHNvdXJjZSBmaWxlLiAqLwotLyogQSBsaW5lIGVuZHMgaW4gJ1xuJyBvciBlb2YuICovCi0KLXN0YXRpYyBsaW5lX251bWJlclQgcGh5c2ljYWxfaW5wdXRfbGluZTsKLXN0YXRpYyBpbnQgbG9naWNhbF9pbnB1dF9saW5lOwotCi0vKiBTdHJ1Y3QgdXNlZCB0byBzYXZlIHRoZSBzdGF0ZSBvZiB0aGUgaW5wdXQgaGFuZGxlciBkdXJpbmcgaW5jbHVkZSBmaWxlcyAqLwotc3RydWN0IGlucHV0X3NhdmUKLSAgewotICAgIGNoYXIgKmJ1ZmZlcl9zdGFydDsKLSAgICBjaGFyICpwYXJ0aWFsX3doZXJlOwotICAgIGludCBwYXJ0aWFsX3NpemU7Ci0gICAgY2hhciBzYXZlX3NvdXJjZVtBRlRFUl9TSVpFXTsKLSAgICB1bnNpZ25lZCBpbnQgYnVmZmVyX2xlbmd0aDsKLSAgICBjaGFyICpwaHlzaWNhbF9pbnB1dF9maWxlOwotICAgIGNoYXIgKmxvZ2ljYWxfaW5wdXRfZmlsZTsKLSAgICBsaW5lX251bWJlclQgcGh5c2ljYWxfaW5wdXRfbGluZTsKLSAgICBpbnQgbG9naWNhbF9pbnB1dF9saW5lOwotICAgIGludCBzYl9pbmRleDsKLSAgICBzYiBmcm9tX3NiOwotICAgIHN0cnVjdCBpbnB1dF9zYXZlICpuZXh0X3NhdmVkX2ZpbGU7CS8qIENoYWluIG9mIGlucHV0X3NhdmVzICovCi0gICAgY2hhciAqaW5wdXRfZmlsZV9zYXZlOwkvKiBTYXZlZCBzdGF0ZSBvZiBpbnB1dCByb3V0aW5lcyAqLwotICAgIGNoYXIgKnNhdmVkX3Bvc2l0aW9uOwkvKiBDYWxsZXIncyBzYXZlZCBwb3NpdGlvbiBpbiBidWYgKi8KLSAgfTsKLQotc3RhdGljIHN0cnVjdCBpbnB1dF9zYXZlICppbnB1dF9zY3J1Yl9wdXNoIFBBUkFNUyAoKGNoYXIgKnNhdmVkX3Bvc2l0aW9uKSk7Ci1zdGF0aWMgY2hhciAqaW5wdXRfc2NydWJfcG9wIFBBUkFNUyAoKHN0cnVjdCBpbnB1dF9zYXZlICphcmcpKTsKLXN0YXRpYyB2b2lkIGFzXzFfY2hhciBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgYywgRklMRSAqIHN0cmVhbSkpOwotCi0vKiBTYXZlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZSB0aGF0IC5pbmNsdWRlJ2QgdGhpcyBvbmUuICBXaGVuIHdlIGhpdCBFT0YsCi0gICB3ZSBhdXRvbWF0aWNhbGx5IHBvcCB0byB0aGF0IGZpbGUuICovCi0KLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfc2F2ZSAqbmV4dF9zYXZlZF9maWxlOwotCi0vKiBQdXNoIHRoZSBzdGF0ZSBvZiBpbnB1dCByZWFkaW5nIGFuZCBzY3J1YmJpbmcgc28gdGhhdCB3ZSBjYW4gI2luY2x1ZGUuCi0gICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgJ3ZvaWQgKicgKGZ1ZGdlZCBmb3Igb2xkIGNvbXBpbGVycykgdG8gYSBzYXZlCi0gICBhcmVhLCB3aGljaCBjYW4gYmUgcmVzdG9yZWQgYnkgcGFzc2luZyBpdCB0byBpbnB1dF9zY3J1Yl9wb3AoKS4gKi8KLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfc2F2ZSAqCi1pbnB1dF9zY3J1Yl9wdXNoIChzYXZlZF9wb3NpdGlvbikKLSAgICAgY2hhciAqc2F2ZWRfcG9zaXRpb247Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBpbnB1dF9zYXZlICpzYXZlZDsKLQotICBzYXZlZCA9IChzdHJ1Y3QgaW5wdXRfc2F2ZSAqKSB4bWFsbG9jIChzaXplb2YgKnNhdmVkKTsKLQotICBzYXZlZC0+c2F2ZWRfcG9zaXRpb24gPSBzYXZlZF9wb3NpdGlvbjsKLSAgc2F2ZWQtPmJ1ZmZlcl9zdGFydCA9IGJ1ZmZlcl9zdGFydDsKLSAgc2F2ZWQtPnBhcnRpYWxfd2hlcmUgPSBwYXJ0aWFsX3doZXJlOwotICBzYXZlZC0+cGFydGlhbF9zaXplID0gcGFydGlhbF9zaXplOwotICBzYXZlZC0+YnVmZmVyX2xlbmd0aCA9IGJ1ZmZlcl9sZW5ndGg7Ci0gIHNhdmVkLT5waHlzaWNhbF9pbnB1dF9maWxlID0gcGh5c2ljYWxfaW5wdXRfZmlsZTsKLSAgc2F2ZWQtPmxvZ2ljYWxfaW5wdXRfZmlsZSA9IGxvZ2ljYWxfaW5wdXRfZmlsZTsKLSAgc2F2ZWQtPnBoeXNpY2FsX2lucHV0X2xpbmUgPSBwaHlzaWNhbF9pbnB1dF9saW5lOwotICBzYXZlZC0+bG9naWNhbF9pbnB1dF9saW5lID0gbG9naWNhbF9pbnB1dF9saW5lOwotICBzYXZlZC0+c2JfaW5kZXggPSBzYl9pbmRleDsKLSAgc2F2ZWQtPmZyb21fc2IgPSBmcm9tX3NiOwotICBtZW1jcHkgKHNhdmVkLT5zYXZlX3NvdXJjZSwgc2F2ZV9zb3VyY2UsIHNpemVvZiAoc2F2ZV9zb3VyY2UpKTsKLSAgc2F2ZWQtPm5leHRfc2F2ZWRfZmlsZSA9IG5leHRfc2F2ZWRfZmlsZTsKLSAgc2F2ZWQtPmlucHV0X2ZpbGVfc2F2ZSA9IGlucHV0X2ZpbGVfcHVzaCAoKTsKLQotICBpbnB1dF9maWxlX2JlZ2luICgpOwkJLyogUmVpbml0aWFsaXplISAqLwotICBsb2dpY2FsX2lucHV0X2xpbmUgPSAtMTsKLSAgbG9naWNhbF9pbnB1dF9maWxlID0gKGNoYXIgKikgTlVMTDsKLSAgYnVmZmVyX2xlbmd0aCA9IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCk7Ci0gIHNiX2luZGV4ID0gLTE7Ci0KLSAgYnVmZmVyX3N0YXJ0ID0geG1hbGxvYyAoKEJFRk9SRV9TSVpFICsgYnVmZmVyX2xlbmd0aCArIGJ1ZmZlcl9sZW5ndGggKyBBRlRFUl9TSVpFKSk7Ci0gIG1lbWNweSAoYnVmZmVyX3N0YXJ0LCBCRUZPUkVfU1RSSU5HLCAoaW50KSBCRUZPUkVfU0laRSk7Ci0KLSAgcmV0dXJuIHNhdmVkOwotfQkJCQkvKiBpbnB1dF9zY3J1Yl9wdXNoKCkgKi8KLQotc3RhdGljIGNoYXIgKgotaW5wdXRfc2NydWJfcG9wIChzYXZlZCkKLSAgICAgc3RydWN0IGlucHV0X3NhdmUgKnNhdmVkOwotewotICBjaGFyICpzYXZlZF9wb3NpdGlvbjsKLQotICBpbnB1dF9zY3J1Yl9lbmQgKCk7CQkvKiBGaW5pc2ggb2ZmIG9sZCBidWZmZXIgKi8KLQotICBpbnB1dF9maWxlX3BvcCAoc2F2ZWQtPmlucHV0X2ZpbGVfc2F2ZSk7Ci0gIHNhdmVkX3Bvc2l0aW9uID0gc2F2ZWQtPnNhdmVkX3Bvc2l0aW9uOwotICBidWZmZXJfc3RhcnQgPSBzYXZlZC0+YnVmZmVyX3N0YXJ0OwotICBidWZmZXJfbGVuZ3RoID0gc2F2ZWQtPmJ1ZmZlcl9sZW5ndGg7Ci0gIHBoeXNpY2FsX2lucHV0X2ZpbGUgPSBzYXZlZC0+cGh5c2ljYWxfaW5wdXRfZmlsZTsKLSAgbG9naWNhbF9pbnB1dF9maWxlID0gc2F2ZWQtPmxvZ2ljYWxfaW5wdXRfZmlsZTsKLSAgcGh5c2ljYWxfaW5wdXRfbGluZSA9IHNhdmVkLT5waHlzaWNhbF9pbnB1dF9saW5lOwotICBsb2dpY2FsX2lucHV0X2xpbmUgPSBzYXZlZC0+bG9naWNhbF9pbnB1dF9saW5lOwotICBzYl9pbmRleCA9IHNhdmVkLT5zYl9pbmRleDsKLSAgZnJvbV9zYiA9IHNhdmVkLT5mcm9tX3NiOwotICBwYXJ0aWFsX3doZXJlID0gc2F2ZWQtPnBhcnRpYWxfd2hlcmU7Ci0gIHBhcnRpYWxfc2l6ZSA9IHNhdmVkLT5wYXJ0aWFsX3NpemU7Ci0gIG5leHRfc2F2ZWRfZmlsZSA9IHNhdmVkLT5uZXh0X3NhdmVkX2ZpbGU7Ci0gIG1lbWNweSAoc2F2ZV9zb3VyY2UsIHNhdmVkLT5zYXZlX3NvdXJjZSwgc2l6ZW9mIChzYXZlX3NvdXJjZSkpOwotCi0gIGZyZWUgKHNhdmVkKTsKLSAgcmV0dXJuIHNhdmVkX3Bvc2l0aW9uOwotfQotDAotCi12b2lkCi1pbnB1dF9zY3J1Yl9iZWdpbiAoKQotewotICBrbm93IChzdHJsZW4gKEJFRk9SRV9TVFJJTkcpID09IEJFRk9SRV9TSVpFKTsKLSAga25vdyAoc3RybGVuIChBRlRFUl9TVFJJTkcpID09IEFGVEVSX1NJWkUgfHwgKEFGVEVSX1NUUklOR1swXSA9PSAnXDAnICYmIEFGVEVSX1NJWkUgPT0gMSkpOwotCi0gIGlucHV0X2ZpbGVfYmVnaW4gKCk7Ci0KLSAgYnVmZmVyX2xlbmd0aCA9IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCk7Ci0KLSAgYnVmZmVyX3N0YXJ0ID0geG1hbGxvYyAoKEJFRk9SRV9TSVpFICsgYnVmZmVyX2xlbmd0aCArIGJ1ZmZlcl9sZW5ndGggKyBBRlRFUl9TSVpFKSk7Ci0gIG1lbWNweSAoYnVmZmVyX3N0YXJ0LCBCRUZPUkVfU1RSSU5HLCAoaW50KSBCRUZPUkVfU0laRSk7Ci0KLSAgLyogTGluZSBudW1iZXIgdGhpbmdzLiAqLwotICBsb2dpY2FsX2lucHV0X2xpbmUgPSAtMTsKLSAgbG9naWNhbF9pbnB1dF9maWxlID0gKGNoYXIgKikgTlVMTDsKLSAgcGh5c2ljYWxfaW5wdXRfZmlsZSA9IE5VTEw7CS8qIE5vIGZpbGUgcmVhZCB5ZXQuICovCi0gIG5leHRfc2F2ZWRfZmlsZSA9IE5VTEw7CS8qIEF0IEVPRiwgZG9uJ3QgcG9wIHRvIGFueSBvdGhlciBmaWxlICovCi0gIGRvX3NjcnViX2JlZ2luIChmbGFnX202OGtfbXJpKTsKLX0KLQotdm9pZAotaW5wdXRfc2NydWJfZW5kICgpCi17Ci0gIGlmIChidWZmZXJfc3RhcnQpCi0gICAgewotICAgICAgZnJlZSAoYnVmZmVyX3N0YXJ0KTsKLSAgICAgIGJ1ZmZlcl9zdGFydCA9IDA7Ci0gICAgICBpbnB1dF9maWxlX2VuZCAoKTsKLSAgICB9Ci19Ci0KLS8qIFN0YXJ0IHJlYWRpbmcgaW5wdXQgZnJvbSBhIG5ldyBmaWxlLiAqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIHN0YXJ0IG9mIGNhbGxlcidzIHBhcnQgb2YgYnVmZmVyLiAqLwotaW5wdXRfc2NydWJfbmV3X2ZpbGUgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaW5wdXRfZmlsZV9vcGVuIChmaWxlbmFtZSwgIWZsYWdfbm9fY29tbWVudHMpOwotICBwaHlzaWNhbF9pbnB1dF9maWxlID0gZmlsZW5hbWVbMF0gPyBmaWxlbmFtZSA6IF8oIntzdGFuZGFyZCBpbnB1dH0iKTsKLSAgcGh5c2ljYWxfaW5wdXRfbGluZSA9IDA7Ci0KLSAgcGFydGlhbF9zaXplID0gMDsKLSAgcmV0dXJuIChidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRSk7Ci19Ci0KLQotLyogSW5jbHVkZSBhIGZpbGUgZnJvbSB0aGUgY3VycmVudCBmaWxlLiAgU2F2ZSBvdXIgc3RhdGUsIGNhdXNlIGl0IHRvCi0gICBiZSByZXN0b3JlZCBvbiBFT0YsIGFuZCBiZWdpbiBoYW5kbGluZyBhIG5ldyBmaWxlLiAgU2FtZSByZXN1bHQgYXMKLSAgIGlucHV0X3NjcnViX25ld19maWxlLiAqLwotCi1jaGFyICoKLWlucHV0X3NjcnViX2luY2x1ZGVfZmlsZSAoZmlsZW5hbWUsIHBvc2l0aW9uKQotICAgICBjaGFyICpmaWxlbmFtZTsKLSAgICAgY2hhciAqcG9zaXRpb247Ci17Ci0gIG5leHRfc2F2ZWRfZmlsZSA9IGlucHV0X3NjcnViX3B1c2ggKHBvc2l0aW9uKTsKLSAgcmV0dXJuIGlucHV0X3NjcnViX25ld19maWxlIChmaWxlbmFtZSk7Ci19Ci0KLS8qIFN0YXJ0IGdldHRpbmcgaW5wdXQgZnJvbSBhbiBzYiBzdHJ1Y3R1cmUuICBUaGlzIGlzIHVzZWQgd2hlbgotICAgZXhwYW5kaW5nIGEgbWFjcm8uICAqLwotCi12b2lkCi1pbnB1dF9zY3J1Yl9pbmNsdWRlX3NiIChmcm9tLCBwb3NpdGlvbikKLSAgICAgc2IgKmZyb207Ci0gICAgIGNoYXIgKnBvc2l0aW9uOwotewotICBpZiAobWFjcm9fbmVzdCA+IG1heF9tYWNyb19uZXN0KQotICAgIGFzX2ZhdGFsIChfKCJtYWNyb3MgbmVzdGVkIHRvbyBkZWVwbHkiKSk7Ci0gICsrbWFjcm9fbmVzdDsKLQotICBuZXh0X3NhdmVkX2ZpbGUgPSBpbnB1dF9zY3J1Yl9wdXNoIChwb3NpdGlvbik7Ci0KLSAgc2JfbmV3ICgmZnJvbV9zYik7Ci0gIGlmIChmcm9tLT5sZW4gPj0gMSAmJiBmcm9tLT5wdHJbMF0gIT0gJ1xuJykKLSAgICB7Ci0gICAgICAvKiBBZGQgdGhlIHNlbnRpbmVsIHJlcXVpcmVkIGJ5IHJlYWQuYy4gICovCi0gICAgICBzYl9hZGRfY2hhciAoJmZyb21fc2IsICdcbicpOwotICAgIH0KLSAgc2JfYWRkX3NiICgmZnJvbV9zYiwgZnJvbSk7Ci0gIHNiX2luZGV4ID0gMTsKLQotICAvKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHJlc2V0IGJ5IGlucHV0X3NjcnViX3B1c2guICBSZXN0b3JlIHRoZW0KLSAgICAgc2luY2Ugd2UgYXJlLCBhZnRlciBhbGwsIHN0aWxsIGF0IHRoZSBzYW1lIHBvaW50IGluIHRoZSBmaWxlLiAgKi8KLSAgbG9naWNhbF9pbnB1dF9saW5lID0gbmV4dF9zYXZlZF9maWxlLT5sb2dpY2FsX2lucHV0X2xpbmU7Ci0gIGxvZ2ljYWxfaW5wdXRfZmlsZSA9IG5leHRfc2F2ZWRfZmlsZS0+bG9naWNhbF9pbnB1dF9maWxlOwotfQotCi12b2lkCi1pbnB1dF9zY3J1Yl9jbG9zZSAoKQotewotICBpbnB1dF9maWxlX2Nsb3NlICgpOwotfQotCi1jaGFyICoKLWlucHV0X3NjcnViX25leHRfYnVmZmVyIChidWZwKQotICAgICBjaGFyICoqYnVmcDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbGltaXQ7CQkvKi0+anVzdCBhZnRlciBsYXN0IGNoYXIgb2YgYnVmZmVyLiAqLwotCi0gIGlmIChzYl9pbmRleCA+PSAwKQotICAgIHsKLSAgICAgIGlmIChzYl9pbmRleCA+PSBmcm9tX3NiLmxlbikKLQl7Ci0JICBzYl9raWxsICgmZnJvbV9zYik7Ci0JICBjb25kX2ZpbmlzaF9jaGVjayAobWFjcm9fbmVzdCk7Ci0JICAtLW1hY3JvX25lc3Q7Ci0JICBwYXJ0aWFsX3doZXJlID0gTlVMTDsKLQkgIGlmIChuZXh0X3NhdmVkX2ZpbGUgIT0gTlVMTCkKLQkgICAgKmJ1ZnAgPSBpbnB1dF9zY3J1Yl9wb3AgKG5leHRfc2F2ZWRfZmlsZSk7Ci0JICByZXR1cm4gcGFydGlhbF93aGVyZTsKLQl9Ci0KLSAgICAgIHBhcnRpYWxfd2hlcmUgPSBmcm9tX3NiLnB0ciArIGZyb21fc2IubGVuOwotICAgICAgcGFydGlhbF9zaXplID0gMDsKLSAgICAgICpidWZwID0gZnJvbV9zYi5wdHIgKyBzYl9pbmRleDsKLSAgICAgIHNiX2luZGV4ID0gZnJvbV9zYi5sZW47Ci0gICAgICByZXR1cm4gcGFydGlhbF93aGVyZTsKLSAgICB9Ci0KLSAgKmJ1ZnAgPSBidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRTsKLQotICBpZiAocGFydGlhbF9zaXplKQotICAgIHsKLSAgICAgIG1lbWNweSAoYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkUsIHBhcnRpYWxfd2hlcmUsCi0JICAgICAgKHVuc2lnbmVkIGludCkgcGFydGlhbF9zaXplKTsKLSAgICAgIG1lbWNweSAoYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkUsIHNhdmVfc291cmNlLCBBRlRFUl9TSVpFKTsKLSAgICB9Ci0gIGxpbWl0ID0gaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyIChidWZmZXJfc3RhcnQKLQkJCQkgICAgICAgKyBCRUZPUkVfU0laRQotCQkJCSAgICAgICArIHBhcnRpYWxfc2l6ZSk7Ci0gIGlmIChsaW1pdCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBjaGFyICpwOwkJLyogRmluZCBsYXN0IG5ld2xpbmUuICovCi0KLSAgICAgIGZvciAocCA9IGxpbWl0IC0gMTsgKnAgIT0gJ1xuJzsgLS1wKQotCTsKLSAgICAgICsrcDsKLQotICAgICAgd2hpbGUgKHAgPD0gYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkUpCi0JewotCSAgaW50IGxpbW9mZjsKLQotCSAgbGltb2ZmID0gbGltaXQgLSBidWZmZXJfc3RhcnQ7Ci0JICBidWZmZXJfbGVuZ3RoICs9IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCk7Ci0JICBidWZmZXJfc3RhcnQgPSB4cmVhbGxvYyAoYnVmZmVyX3N0YXJ0LAotCQkJCSAgIChCRUZPUkVfU0laRQotCQkJCSAgICArIDIgKiBidWZmZXJfbGVuZ3RoCi0JCQkJICAgICsgQUZURVJfU0laRSkpOwotCSAgKmJ1ZnAgPSBidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRTsKLQkgIGxpbWl0ID0gaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyIChidWZmZXJfc3RhcnQgKyBsaW1vZmYpOwotCi0JICBpZiAobGltaXQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oInBhcnRpYWwgbGluZSBhdCBlbmQgb2YgZmlsZSBpZ25vcmVkIikpOwotCSAgICAgIHBhcnRpYWxfd2hlcmUgPSBOVUxMOwotCSAgICAgIGlmIChuZXh0X3NhdmVkX2ZpbGUpCi0JCSpidWZwID0gaW5wdXRfc2NydWJfcG9wIChuZXh0X3NhdmVkX2ZpbGUpOwotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0KLQkgIGZvciAocCA9IGxpbWl0IC0gMTsgKnAgIT0gJ1xuJzsgLS1wKQotCSAgICA7Ci0JICArK3A7Ci0JfQotCi0gICAgICBwYXJ0aWFsX3doZXJlID0gcDsKLSAgICAgIHBhcnRpYWxfc2l6ZSA9IGxpbWl0IC0gcDsKLSAgICAgIG1lbWNweSAoc2F2ZV9zb3VyY2UsIHBhcnRpYWxfd2hlcmUsIChpbnQpIEFGVEVSX1NJWkUpOwotICAgICAgbWVtY3B5IChwYXJ0aWFsX3doZXJlLCBBRlRFUl9TVFJJTkcsIChpbnQpIEFGVEVSX1NJWkUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHBhcnRpYWxfd2hlcmUgPSAwOwotICAgICAgaWYgKHBhcnRpYWxfc2l6ZSA+IDApCi0JewotCSAgYXNfd2FybiAoXygiUGFydGlhbCBsaW5lIGF0IGVuZCBvZiBmaWxlIGlnbm9yZWQiKSk7Ci0JfQotCi0gICAgICAvKiBUZWxsIHRoZSBsaXN0aW5nIHdlJ3ZlIGZpbmlzaGVkIHRoZSBmaWxlLiAgKi8KLSAgICAgIExJU1RJTkdfRU9GICgpOwotCi0gICAgICAvKiBJZiB3ZSBzaG91bGQgcG9wIHRvIGFub3RoZXIgZmlsZSBhdCBFT0YsIGRvIGl0LiAqLwotICAgICAgaWYgKG5leHRfc2F2ZWRfZmlsZSkKLQl7Ci0JICAqYnVmcCA9IGlucHV0X3NjcnViX3BvcCAobmV4dF9zYXZlZF9maWxlKTsJLyogUG9wIHN0YXRlICovCi0JICAvKiBwYXJ0aWFsX3doZXJlIGlzIG5vdyBjb3JyZWN0IHRvIHJldHVybiwgc2luY2Ugd2UgcG9wcGVkIGl0LiAqLwotCX0KLSAgICB9Ci0gIHJldHVybiAocGFydGlhbF93aGVyZSk7Ci19CQkJCS8qIGlucHV0X3NjcnViX25leHRfYnVmZmVyKCkgKi8KLQwKLS8qCi0gKiBUaGUgcmVtYWluaW5nIHBhcnQgb2YgdGhpcyBmaWxlIGRlYWxzIHdpdGggbGluZSBudW1iZXJzLCBlcnJvcgotICogbWVzc2FnZXMgYW5kIHNvIG9uLgotICovCi0KLQotaW50Ci1zZWVuX2F0X2xlYXN0XzFfZmlsZSAoKQkJLyogVFJVRSBpZiB3ZSBvcGVuZWQgYW55IGZpbGUuICovCi17Ci0gIHJldHVybiAocGh5c2ljYWxfaW5wdXRfZmlsZSAhPSBOVUxMKTsKLX0KLQotdm9pZAotYnVtcF9saW5lX2NvdW50ZXJzICgpCi17Ci0gIGlmIChzYl9pbmRleCA8IDApCi0gICAgewotICAgICAgKytwaHlzaWNhbF9pbnB1dF9saW5lOwotICAgICAgaWYgKGxvZ2ljYWxfaW5wdXRfbGluZSA+PSAwKQotCSsrbG9naWNhbF9pbnB1dF9saW5lOwotICAgIH0KLX0KLQwKLS8qCi0gKgkJCW5ld19sb2dpY2FsX2xpbmUoKQotICoKLSAqIFRlbGxzIHVzIHdoYXQgdGhlIG5ldyBsb2dpY2FsIGxpbmUgbnVtYmVyIGFuZCBmaWxlIGFyZS4KLSAqIElmIHRoZSBsaW5lX251bWJlciBpcyAtMSwgd2UgZG9uJ3QgY2hhbmdlIHRoZSBjdXJyZW50IGxvZ2ljYWwgbGluZQotICogbnVtYmVyLiAgSWYgaXQgaXMgLTIsIHdlIGRlY3JlbWVudCB0aGUgbG9naWNhbCBsaW5lIG51bWJlciAodGhpcyBpcwotICogdG8gc3VwcG9ydCB0aGUgLmFwcGZpbGUgcHNldWRvLW9wIGluc2VydGVkIGludG8gdGhlIHN0cmVhbSBieQotICogZG9fc2NydWJfY2hhcnMpLgotICogSWYgdGhlIGZuYW1lIGlzIE5VTEwsIHdlIGRvbid0IGNoYW5nZSB0aGUgY3VycmVudCBsb2dpY2FsIGZpbGUgbmFtZS4KLSAqIFJldHVybnMgbm9uemVybyBpZiB0aGUgZmlsZW5hbWUgYWN0dWFsbHkgY2hhbmdlcy4KLSAqLwotaW50Ci1uZXdfbG9naWNhbF9saW5lIChmbmFtZSwgbGluZV9udW1iZXIpCi0gICAgIGNoYXIgKmZuYW1lOwkJLyogRE9OJ1QgZGVzdHJveSBpdCEgV2UgcG9pbnQgdG8gaXQhICovCi0gICAgIGludCBsaW5lX251bWJlcjsKLXsKLSAgaWYgKGxpbmVfbnVtYmVyID49IDApCi0gICAgbG9naWNhbF9pbnB1dF9saW5lID0gbGluZV9udW1iZXI7Ci0gIGVsc2UgaWYgKGxpbmVfbnVtYmVyID09IC0yICYmIGxvZ2ljYWxfaW5wdXRfbGluZSA+IDApCi0gICAgLS1sb2dpY2FsX2lucHV0X2xpbmU7Ci0KLSAgaWYgKGZuYW1lCi0gICAgICAmJiAobG9naWNhbF9pbnB1dF9maWxlID09IE5VTEwKLQkgIHx8IHN0cmNtcCAobG9naWNhbF9pbnB1dF9maWxlLCBmbmFtZSkpKQotICAgIHsKLSAgICAgIGxvZ2ljYWxfaW5wdXRfZmlsZSA9IGZuYW1lOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19CQkJCS8qIG5ld19sb2dpY2FsX2xpbmUoKSAqLwotDAotLyoKLSAqCQkJYSBzIF8gdyBoIGUgciBlICgpCi0gKgotICogUmV0dXJuIHRoZSBjdXJyZW50IGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIuCi0gKiBuYW1lcCBzaG91bGQgYmUgY2hhciAqIGNvbnN0ICosIGJ1dCB0aGVyZSBhcmUgY29tcGlsZXJzIHdoaWNoIHNjcmV3Ci0gKiB1cCBkZWNsYXJhdGlvbnMgbGlrZSB0aGF0LCBhbmQgaXQncyBlYXNpZXIgdG8gYXZvaWQgaXQuCi0gKi8KLXZvaWQgCi1hc193aGVyZSAobmFtZXAsIGxpbmVwKQotICAgICBjaGFyICoqbmFtZXA7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZXA7Ci17Ci0gIGlmIChsb2dpY2FsX2lucHV0X2ZpbGUgIT0gTlVMTAotICAgICAgJiYgKGxpbmVwID09IE5VTEwgfHwgbG9naWNhbF9pbnB1dF9saW5lID49IDApKQotICAgIHsKLSAgICAgICpuYW1lcCA9IGxvZ2ljYWxfaW5wdXRfZmlsZTsKLSAgICAgIGlmIChsaW5lcCAhPSBOVUxMKQotCSpsaW5lcCA9IGxvZ2ljYWxfaW5wdXRfbGluZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHBoeXNpY2FsX2lucHV0X2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqbmFtZXAgPSBwaHlzaWNhbF9pbnB1dF9maWxlOwotICAgICAgaWYgKGxpbmVwICE9IE5VTEwpCi0JKmxpbmVwID0gcGh5c2ljYWxfaW5wdXRfbGluZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqbmFtZXAgPSAwOwotICAgICAgaWYgKGxpbmVwICE9IE5VTEwpCi0JKmxpbmVwID0gMDsKLSAgICB9Ci19CQkJCS8qIGFzX3doZXJlKCkgKi8KLQwKLQotCi0KLS8qCi0gKgkJCWEgcyBfIGggbyB3IG0gdSBjIGggKCkKLSAqCi0gKiBPdXRwdXQgdG8gZ2l2ZW4gc3RyZWFtIGhvdyBtdWNoIG9mIGxpbmUgd2UgaGF2ZSBzY2FubmVkIHNvIGZhci4KLSAqIEFzc3VtZXMgd2UgaGF2ZSBzY2FubmVkIHVwIHRvIGFuZCBpbmNsdWRpbmcgaW5wdXRfbGluZV9wb2ludGVyLgotICogTm8gZnJlZSAnXG4nIGF0IGVuZCBvZiBsaW5lLgotICovCi12b2lkCi1hc19ob3dtdWNoIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsJCS8qIE9wZW5lZCBmb3Igd3JpdGUgcGxlYXNlLiAqLwotewotICByZWdpc3RlciBjaGFyICpwOwkJLyogU2NhbiBpbnB1dCBsaW5lLiAqLwotICAvKiByZWdpc3RlciBjaGFyIGM7IEpGIHVudXNlZCAqLwotCi0gIGZvciAocCA9IGlucHV0X2xpbmVfcG9pbnRlciAtIDE7ICpwICE9ICdcbic7IC0tcCkKLSAgICB7Ci0gICAgfQotICArK3A7CQkJCS8qIHAtPjFzdCBjaGFyIG9mIGxpbmUuICovCi0gIGZvciAoOyBwIDw9IGlucHV0X2xpbmVfcG9pbnRlcjsgcCsrKQotICAgIHsKLSAgICAgIC8qIEFzc3VtZSBBU0NJSS4gRUJDRElDICYgb3RoZXIgbWljcm8tY29tcHV0ZXIgY2hhciBzZXRzIGlnbm9yZWQuICovCi0gICAgICBhc18xX2NoYXIgKCh1bnNpZ25lZCBjaGFyKSAqcCwgc3RyZWFtKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIAotYXNfMV9jaGFyIChjLCBzdHJlYW0pCi0gICAgIHVuc2lnbmVkIGludCBjOwotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGlmIChjID4gMTI3KQotICAgIHsKLSAgICAgICh2b2lkKSBwdXRjICgnJScsIHN0cmVhbSk7Ci0gICAgICBjIC09IDEyODsKLSAgICB9Ci0gIGlmIChjIDwgMzIpCi0gICAgewotICAgICAgKHZvaWQpIHB1dGMgKCdeJywgc3RyZWFtKTsKLSAgICAgIGMgKz0gJ0AnOwotICAgIH0KLSAgKHZvaWQpIHB1dGMgKGMsIHN0cmVhbSk7Ci19Ci0KLS8qIGVuZCBvZiBpbnB1dF9zY3J1Yi5jICovCmRpZmYgLS1naXQgYS9nYXMvaXRibC1sZXgubCBiL2dhcy9pdGJsLWxleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTA1ZGRkLi4wMDAwMDAwCi0tLSBhL2dhcy9pdGJsLWxleC5sCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qIGl0YmwtbGV4LmwKLSAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0lewotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJpdGJsLXBhcnNlLmgiCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBEQkcoeCkgcHJpbnRmIHgKLSNkZWZpbmUgTURCRyh4KSBwcmludGYgeAotI2Vsc2UKLSNkZWZpbmUgREJHKHgpCi0jZGVmaW5lIE1EQkcoeCkKLSNlbmRpZgotCi1pbnQgaW5zbnRibF9saW5lID0gMTsKLSV9Ci0KLUFMTlVNCVtBLVphLXowLTlfXQotRElHSVQJWzAtOV0KLUFMUEhBCVtBLVphLXpfXQotSEVYCVswLTlBLUZhLWZdCi0KLSUlCi0KLSJjcmVnInwiQ1JFRyIgewotICAgIHJldHVybiBDUkVHOwotICB9Ci0iZHJlZyJ8IkRSRUciIHsKLSAgICByZXR1cm4gRFJFRzsKLSAgfQotImdyZWcifCJHUkVHIiB7Ci0gICAgcmV0dXJuIEdSRUc7Ci0gIH0KLSJpbW1lZCJ8IklNTUVEIiB7Ci0gICAgcmV0dXJuIElNTUVEOwotICB9Ci0iYWRkciJ8IkFERFIiIHsKLSAgICByZXR1cm4gQUREUjsKLSAgfQotImluc24ifCJJTlNOIiB7Ci0gICAgcmV0dXJuIElOU047Ci0gIH0KLSJwIntESUdJVH0gewotICAgIHl5dGV4dFt5eWxlbmddID0gMDsKLSAgICB5eWx2YWwucHJvY2Vzc29yID0gc3RydG91bCAoeXl0ZXh0KzEsIDAsIDApOwotICAgIHJldHVybiBQTlVNOwotICB9Ci17RElHSVR9KyB7Ci0gICAgeXl0ZXh0W3l5bGVuZ10gPSAwOwotICAgIHl5bHZhbC5udW0gPSBzdHJ0b3VsICh5eXRleHQsIDAsIDApOwotICAgIHJldHVybiBOVU07Ci0gIH0KLSIweCJ7SEVYfSsgewotICAgIHl5dGV4dFt5eWxlbmddID0gMDsKLSAgICB5eWx2YWwubnVtID0gc3RydG91bCAoeXl0ZXh0LCAwLCAwKTsKLSAgICByZXR1cm4gTlVNOwotICB9Ci17QUxQSEF9e0FMTlVNfSoJewotICAgIHl5dGV4dFt5eWxlbmddID0gMDsKLSAgICB5eWx2YWwuc3RyID0gc3RyZHVwICh5eXRleHQpOwotICAgIHJldHVybiBJRDsKLSAgfQotIjsifCIjIgl7Ci0gICAgaW50IGM7Ci0gICAgd2hpbGUgKChjID0gaW5wdXQgKCkpICE9ICBFT0YpIAotICAgICAgewotICAgICAgICBpZiAoYyA9PSAgJ1xuJykgCi0gICAgCXsKLSAgICAJCXVucHV0IChjKTsKLSAgICAJCWJyZWFrOwotICAgIAl9Ci0gICAgICB9Ci0gIH0KLSJcbiIJeyAKLSAgICBpbnNudGJsX2xpbmUrKzsgCi0gICAgTURCRyAoKCJpbiBsZXgsIE5MID0gJWQgKHgleClcbiIsIE5MLCBOTCkpOwotICAgIHJldHVybiBOTDsgCi0gIH0KLSIgInwiXHQiIHsgCi0gIH0KLS4gewotICAgIE1EQkcgKCgiY2hhciA9ICV4LCAlZFxuIiwgeXl0ZXh0WzBdLCB5eXRleHRbMF0pKTsKLSAgICByZXR1cm4geXl0ZXh0WzBdOwotICB9Ci0lJQotCi0jaWZuZGVmIHl5d3JhcAotaW50IAoteXl3cmFwICgpIAotICB7IAotICAgIHJldHVybiAxOyAKLSAgfQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvaXRibC1vcHMuYyBiL2dhcy9pdGJsLW9wcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2NjYTYwLi4wMDAwMDAwCi0tLSBhL2dhcy9pdGJsLW9wcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTE2ICswLDAgQEAKLS8qIGl0Ymwtb3BzLmMKLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qCi0gKiBIZXJlaW4gbGllcyB0aGUgc3VwcG9ydCBmb3IgZHluYW1pYyBzcGVjaWZpY2F0aW9uIG9mIHByb2Nlc3NvcgotICogaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlcnMuICBNbmVtb25pY3MsIHZhbHVlcywgYW5kIGZvcm1hdHMgZm9yIGVhY2gKLSAqIGluc3RydWN0aW9uIGFuZCByZWdpc3RlciBhcmUgc3BlY2lmaWVkIGluIGFuIGFzY2lpIGZpbGUgY29uc2lzdGluZyBvZgotICogdGFibGUgZW50cmllcy4gIFRoZSBncmFtbWFyIGZvciB0aGUgdGFibGUgaXMgZGVmaW5lZCBpbiB0aGUgZG9jdW1lbnQKLSAqICJQcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gdGFibGUgc3BlY2lmaWNhdGlvbiIuCi0gKgotICogSW5zdHJ1Y3Rpb25zIHVzZSB0aGUgZ251IGFzc2VtYmxlciBzeW50YXgsIHdpdGggdGhlIGFkZGl0aW9uIG9mCi0gKiBhbGxvd2luZyBtbmVtb25pY3MgZm9yIHJlZ2lzdGVyLgotICogRWcuICJmdW5jICQyLHJlZzMsMHgxMDAsc3ltYm9sIDsgY29tbWVudCIKLSAqIAlmdW5jIC0gb3Bjb2RlIG5hbWUKLSAqIAkkbiAtIHJlZ2lzdGVyIG4KLSAqIAlyZWczIC0gbW5lbW9uaWMgZm9yIHByb2Nlc3NvcidzIHJlZ2lzdGVyIGRlZmluZWQgaW4gdGFibGUKLSAqIAkweGRkZC4uZCAtIGltbWVkaWF0ZSB2YWx1ZQotICogCXN5bWJvbCAtIGFkZHJlc3Mgb2YgbGFiZWwgb3IgZXh0ZXJuYWwgc3ltYm9sCi0gKgotICogRmlyc3QsIGl0YmxfcGFyc2UgcmVhZHMgaW4gdGhlIHRhYmxlIG9mIHJlZ2lzdGVyIGFuZCBpbnN0cnVjdGlvbgotICogbmFtZXMgYW5kIGZvcm1hdHMsIGFuZCBidWlsZHMgYSBsaXN0IG9mIGVudHJpZXMgZm9yIGVhY2gKLSAqIHByb2Nlc3Nvci90eXBlIGNvbWJpbmF0aW9uLiAgbGV4IGFuZCB5YWNjIGFyZSB1c2VkIHRvIHBhcnNlCi0gKiB0aGUgZW50cmllcyBpbiB0aGUgdGFibGUgYW5kIGNhbGwgZnVuY3Rpb25zIGRlZmluZWQgaGVyZSB0bwotICogYWRkIGVhY2ggZW50cnkgdG8gb3VyIGxpc3QuCi0gKgotICogVGhlbiwgd2hlbiBhc3NlbWJsaW5nIG9yIGRpc2Fzc2VtYmxpbmcsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHRvCi0gKiAxKSBnZXQgaW5mb3JtYXRpb24gb24gYSBwcm9jZXNzb3IncyByZWdpc3RlcnMgYW5kCi0gKiAyKSBhc3NlbWJsZS9kaXNhc3NlbWJsZSBhbiBpbnN0cnVjdGlvbi4KLSAqIFRvIGFzc2VtYmxlKGRpc2Fzc2VtYmxlKSBhbiBpbnN0cnVjdGlvbiwgdGhlIGZ1bmN0aW9uCi0gKiBpdGJsX2Fzc2VtYmxlKGl0YmxfZGlzYXNzZW1ibGUpIGlzIGNhbGxlZCB0byBzZWFyY2ggdGhlIGxpc3Qgb2YKLSAqIGluc3RydWN0aW9uIGVudHJpZXMsIGFuZCBpZiBhIG1hdGNoIGlzIGZvdW5kLCB1c2VzIHRoZSBmb3JtYXQKLSAqIGRlc2NyaWJlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gZW50cnkgc3RydWN0dXJlIHRvIGNvbXBsZXRlIHRoZSBhY3Rpb24uCi0gKgotICogRWcuIFN1cHBvc2Ugd2UgaGF2ZSBhIE1pcHMgY29wcm9jZXNzb3IgImNvcDMiIHdpdGggZGF0YSByZWdpc3RlciAiZDIiCi0gKiBhbmQgd2Ugd2FudCB0byBkZWZpbmUgZnVuY3Rpb24gInBpZyIgd2hpY2ggdGFrZXMgdHdvIG9wZXJhbmRzLgotICoKLSAqIEdpdmVuIHRoZSB0YWJsZSBlbnRyaWVzOgotICogCSJwMyBpbnNuIHBpZyAweDE6MjQtMjEgZHJlZzoyMC0xNiBpbW1lZDoxNS0wIgotICogCSJwMyBkcmVnIGQyIDB4MiIKLSAqIGFuZCB0aGF0IHRoZSBpbnN0cnVjdGlvbiBlbmNvZGluZyBmb3IgY29wcm9jZXNzb3IgcHogaGFzIGVuY29kaW5nOgotICogCSNkZWZpbmUgTUlQU19FTkNPREVfQ09QX05VTSh6KSAoKDB4MjF8KHo8PDEpKTw8MjUpCi0gKiAJI2RlZmluZSBJVEJMX0VOQ09ERV9QTlVNKHBudW0pIE1JUFNfRU5DT0RFX0NPUF9OVU0ocG51bSkKLSAqCi0gKiBhIHN0cnVjdHVyZSB0byBkZXNjcmliZSB0aGUgaW5zdHJ1Y3Rpb24gbWlnaHQgbG9vayBzb21ldGhpbmcgbGlrZToKLSAqICAgICAgc3RydWN0IGl0YmxfZW50cnkgPSB7Ci0gKiAgICAgIGVfcHJvY2Vzc29yIHByb2Nlc3NvciA9IGVfcDMKLSAqICAgICAgZV90eXBlIHR5cGUgPSBlX2luc24KLSAqICAgICAgY2hhciAqbmFtZSA9ICJwaWciCi0gKiAgICAgIHVpbnQgdmFsdWUgPSAweDEKLSAqICAgICAgdWludCBmbGFncyA9IDAKLSAqICAgICAgc3RydWN0IGl0YmxfcmFuZ2UgcmFuZ2UgPSAyNC0yMQotICogICAgICBzdHJ1Y3QgaXRibF9maWVsZCAqZmllbGQgPSB7Ci0gKiAgICAgICAgICAgICAgZV90eXBlIHR5cGUgPSBlX2RyZWcKLSAqICAgICAgICAgICAgICBzdHJ1Y3QgaXRibF9yYW5nZSByYW5nZSA9IDIwLTE2Ci0gKiAgICAgICAgICAgICAgc3RydWN0IGl0YmxfZmllbGQgKm5leHQgPSB7Ci0gKiAgICAgICAgICAgICAgICAgICAgICBlX3R5cGUgdHlwZSA9IGVfaW1tZWQKLSAqICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpdGJsX3JhbmdlIHJhbmdlID0gMTUtMAotICogICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl0YmxfZmllbGQgKm5leHQgPSAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB9OwotICogICAgICAgICAgICAgIH07Ci0gKiAgICAgIHN0cnVjdCBpdGJsX2VudHJ5ICpuZXh0ID0gMAotICogICAgICB9OwotICoKLSAqIEFuZCB0aGUgYXNzZW1ibGVyIGluc3RydWN0aW9uczoKLSAqIAkicGlnIGQyLDB4MTAwIgotICogCSJwaWcgJDIsMHgxMDAiCi0gKgotICogd291bGQgYm90aCBhc3NlbWJsZSB0byB0aGUgaGV4IHZhbHVlOgotICogCSIweDRlMjIwMTAwIgotICoKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJpdGJsLW9wcy5oIgotI2luY2x1ZGUgIml0YmwtcGFyc2UuaCIKLQotLyogI2RlZmluZSBERUJVRyAqLwotCi0jaWZkZWYgREVCVUcKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNkZWZpbmUgQVNTRVJUKHgpIGFzc2VydCh4KQotI2RlZmluZSBEQkcoeCkgcHJpbnRmIHgKLSNlbHNlCi0jZGVmaW5lIEFTU0VSVCh4KQotI2RlZmluZSBEQkcoeCkKLSNlbmRpZgotCi0jaWZuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoYTxiP2E6YikKLSNlbmRpZgotCi1pbnQgaXRibF9oYXZlX2VudHJpZXMgPSAwOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogc3RydWN0dXJlcyBmb3Iga2VlcGluZyBpdGJsIGZvcm1hdCBlbnRyaWVzICovCi0KLXN0cnVjdCBpdGJsX3JhbmdlCi0gIHsKLSAgICBpbnQgc2JpdDsJCQkvKiBtYXNrIHN0YXJ0aW5nIGJpdCBwb3NpdGlvbiAqLwotICAgIGludCBlYml0OwkJCS8qIG1hc2sgZW5kaW5nIGJpdCBwb3NpdGlvbiAqLwotICB9OwotCi1zdHJ1Y3QgaXRibF9maWVsZAotICB7Ci0gICAgZV90eXBlIHR5cGU7CQkvKiBkcmVnL2NyZWcvZ3JlZy9pbW1lZC9zeW1iICovCi0gICAgc3RydWN0IGl0YmxfcmFuZ2UgcmFuZ2U7CS8qIGZpZWxkJ3MgYml0ZmllbGQgcmFuZ2Ugd2l0aGluIGluc3RydWN0aW9uICovCi0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsJLyogZmllbGQgZmxhZ3MgKi8KLSAgICBzdHJ1Y3QgaXRibF9maWVsZCAqbmV4dDsJLyogbmV4dCBmaWVsZCBpbiBsaXN0ICovCi0gIH07Ci0KLQotLyogVGhlc2Ugc3RydWN0dXJlcyBkZWZpbmUgdGhlIGluc3RydWN0aW9ucyBhbmQgcmVnaXN0ZXJzIGZvciBhIHByb2Nlc3Nvci4KLSAqIElmIHRoZSB0eXBlIGlzIGFuIGluc3RydWN0aW9uLCB0aGUgc3RydWN0dXJlIGRlZmluZXMgdGhlIGZvcm1hdCBvZiBhbgotICogaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIGZpZWxkcyBhcmUgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0gKiBUaGUgZmxhZ3MgZmllbGQgYmVsb3cgdXNlcyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhvc2UgZGVmaW5lZCBpbiB0aGUKLSAqIGdudSBhc3NlbWJsZXIgYW5kIGFyZSBtYWNoaW5lIHNwZWNpZmljLiAqLwotc3RydWN0IGl0YmxfZW50cnkKLSAgewotICAgIGVfcHJvY2Vzc29yIHByb2Nlc3NvcjsJLyogcHJvY2Vzc29yIG51bWJlciAqLwotICAgIGVfdHlwZSB0eXBlOwkJLyogZHJlZy9jcmVnL2dyZWcvaW5zbiAqLwotICAgIGNoYXIgKm5hbWU7CQkJLyogbW5lbWlvbmljIG5hbWUgZm9yIGluc24vcmVnaXN0ZXIgKi8KLSAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwkvKiBvcGNvZGUvaW5zdHJ1Y3Rpb24gbWFzay9yZWdpc3RlciBudW1iZXIgKi8KLSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBlZmZlY3RzIG9mIHRoZSBpbnN0cnVjdGlvbiAqLwotICAgIHN0cnVjdCBpdGJsX3JhbmdlIHJhbmdlOwkvKiBiaXQgcmFuZ2Ugd2l0aGluIGluc3RydWN0aW9uIGZvciB2YWx1ZSAqLwotICAgIHN0cnVjdCBpdGJsX2ZpZWxkICpmaWVsZHM7CS8qIGxpc3Qgb2Ygb3BlcmFuZCBkZWZpbml0aW9ucyAoaWYgYW55KSAqLwotICAgIHN0cnVjdCBpdGJsX2VudHJ5ICpuZXh0OwkvKiBuZXh0IGVudHJ5ICovCi0gIH07Ci0KLQotLyogbG9jYWwgZGF0YSBhbmQgc3RydWN0dXJlcyAqLwotCi1zdGF0aWMgaW50IGl0YmxfbnVtX29wY29kZXMgPSAwOwotLyogQXJyYXkgb2YgZW50cmllcyBmb3IgZWFjaCBwcm9jZXNzb3IgYW5kIGVudHJ5IHR5cGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqZW50cmllc1tlX25wcm9jc11bZV9udHlwZXNdID0KLXsKLSAgezAsIDAsIDAsIDAsIDAsIDB9LAotICB7MCwgMCwgMCwgMCwgMCwgMH0sCi0gIHswLCAwLCAwLCAwLCAwLCAwfSwKLSAgezAsIDAsIDAsIDAsIDAsIDB9Ci19OwotCi0vKiBsb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBidWlsZF9vcGNvZGUgUEFSQU1TICgoc3RydWN0IGl0YmxfZW50cnkgKmUpKTsKLXN0YXRpYyBlX3R5cGUgZ2V0X3R5cGUgUEFSQU1TICgoaW50IHl5dHlwZSkpOwotc3RhdGljIGVfcHJvY2Vzc29yIGdldF9wcm9jZXNzb3IgUEFSQU1TICgoaW50IHl5cHJvYykpOwotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICoqZ2V0X2VudHJpZXMgUEFSQU1TICgoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCAKLQkJCQkJCWVfdHlwZSB0eXBlKSk7Ci1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKmZpbmRfZW50cnlfYnluYW1lIFBBUkFNUyAoKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgCi0JCQkJCWVfdHlwZSB0eXBlLCBjaGFyICpuYW1lKSk7Ci1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKmZpbmRfZW50cnlfYnl2YWwgUEFSQU1TICgoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCAKLQkJCWVfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbCwgc3RydWN0IGl0YmxfcmFuZ2UgKnIpKTsKLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqYWxsb2NfZW50cnkgUEFSQU1TICgoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCAKLQkJZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGFwcGx5X3JhbmdlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgdmFsdWUsIAotCQkJCQkJc3RydWN0IGl0YmxfcmFuZ2UgcikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh0cmFjdF9yYW5nZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHZhbHVlLCAKLQkJCQkJCXN0cnVjdCBpdGJsX3JhbmdlIHIpKTsKLXN0YXRpYyBzdHJ1Y3QgaXRibF9maWVsZCAqYWxsb2NfZmllbGQgUEFSQU1TICgoZV90eXBlIHR5cGUsIGludCBzYml0LCAKLQkJCQkJaW50IGViaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogSW50ZXJmYWNlcyB0byB0aGUgcGFyc2VyICovCi0KLQotLyogT3BlbiB0aGUgdGFibGUgYW5kIHVzZSBsZXggYW5kIHlhY2MgdG8gcGFyc2UgdGhlIGVudHJpZXMuCi0gKiBSZXR1cm4gMSBmb3IgZmFpbHVyZTsgMCBmb3Igc3VjY2Vzcy4gICovCi0KLWludCAKLWl0YmxfcGFyc2UgKGNoYXIgKmluc250YmwpCi17Ci0gIGV4dGVybiBGSUxFICp5eWluOwotICBleHRlcm4gaW50IHl5cGFyc2UgKHZvaWQpOwotICB5eWluID0gZm9wZW4gKGluc250YmwsICJyIik7Ci0gIGlmICh5eWluID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiQ2FuJ3Qgb3BlbiBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gc3BlY2lmaWNhdGlvbiBmaWxlIFwiJXNcIlxuIiwKLQkgICAgICBpbnNudGJsKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlICh5eXBhcnNlICgpKTsKLSAgICB9Ci0gIGZjbG9zZSAoeXlpbik7Ci0gIGl0YmxfaGF2ZV9lbnRyaWVzID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEFkZCBhIHJlZ2lzdGVyIGVudHJ5ICovCi0KLXN0cnVjdCBpdGJsX2VudHJ5ICoKLWl0YmxfYWRkX3JlZyAoaW50IHl5cHJvY2Vzc29yLCBpbnQgeXl0eXBlLCBjaGFyICpyZWduYW1lLAotCSAgICAgIGludCByZWdudW0pCi17Ci0jaWYgMAkJCQkKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN5bWJvbHMuaCIKLSAgLyogU2luY2UgcmVnaXN0ZXIgbmFtZXMgZG9uJ3QgaGF2ZSBhIHByZWZpeCwgd2UgcHV0IHRoZW0gaW4gdGhlIHN5bWJvbCB0YWJsZSBzbwotICAgICB0aGV5IGNhbid0IGJlIHVzZWQgYXMgc3ltYm9scy4gIFRoaXMgYWxzbyBzaW1wbGlmaWVzIGFyZ3VtZW50IHBhcnNpbmcgYXMKLSAgICAgd2UgY2FuIGxldCBnYXMgcGFyc2UgcmVnaXN0ZXJzIGZvciB1cy4gIFRoZSByZWNvcmRlZCByZWdpc3RlciBudW1iZXIgaXMKLSAgICAgcmVnbnVtLiAgKi8KLSAgLyogVXNlIHN5bWJvbF9jcmVhdGUgaGVyZSBpbnN0ZWFkIG9mIHN5bWJvbF9uZXcgc28gd2UgZG9uJ3QgdHJ5IHRvCi0gICAgIG91dHB1dCByZWdpc3RlcnMgaW50byB0aGUgb2JqZWN0IGZpbGUncyBzeW1ib2wgdGFibGUuICAqLwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChyZWduYW1lLCByZWdfc2VjdGlvbiwKLQkJCQkgICAgICByZWdudW0sICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotI2VuZGlmCi0gIHJldHVybiBhbGxvY19lbnRyeSAoZ2V0X3Byb2Nlc3NvciAoeXlwcm9jZXNzb3IpLCBnZXRfdHlwZSAoeXl0eXBlKSwgcmVnbmFtZSwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIHJlZ251bSk7Ci19Ci0KLS8qIEFkZCBhbiBpbnN0cnVjdGlvbiBlbnRyeSAqLwotCi1zdHJ1Y3QgaXRibF9lbnRyeSAqCi1pdGJsX2FkZF9pbnNuIChpbnQgeXlwcm9jZXNzb3IsIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgdmFsdWUsCi0JICAgICAgIGludCBzYml0LCBpbnQgZWJpdCwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmU7Ci0gIGUgPSBhbGxvY19lbnRyeSAoZ2V0X3Byb2Nlc3NvciAoeXlwcm9jZXNzb3IpLCBlX2luc24sIG5hbWUsIHZhbHVlKTsKLSAgaWYgKGUpCi0gICAgewotICAgICAgZS0+cmFuZ2Uuc2JpdCA9IHNiaXQ7Ci0gICAgICBlLT5yYW5nZS5lYml0ID0gZWJpdDsKLSAgICAgIGUtPmZsYWdzID0gZmxhZ3M7Ci0gICAgICBpdGJsX251bV9vcGNvZGVzKys7Ci0gICAgfQotICByZXR1cm4gZTsKLX0KLQotLyogQWRkIGFuIG9wZXJhbmQgdG8gYW4gaW5zdHJ1Y3Rpb24gZW50cnkgKi8KLQotc3RydWN0IGl0YmxfZmllbGQgKgotaXRibF9hZGRfb3BlcmFuZCAoc3RydWN0IGl0YmxfZW50cnkgKmUsIGludCB5eXR5cGUsIGludCBzYml0LAotCQkgIGludCBlYml0LCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotICBzdHJ1Y3QgaXRibF9maWVsZCAqZiwgKipsYXN0X2Y7Ci0gIGlmICghZSkKLSAgICByZXR1cm4gMDsKLSAgLyogQWRkIHRvIGVuZCBvZiBmaWVsZHMnIGxpc3QuICovCi0gIGYgPSBhbGxvY19maWVsZCAoZ2V0X3R5cGUgKHl5dHlwZSksIHNiaXQsIGViaXQsIGZsYWdzKTsKLSAgaWYgKGYpCi0gICAgewotICAgICAgbGFzdF9mID0gJmUtPmZpZWxkczsKLSAgICAgIHdoaWxlICgqbGFzdF9mKQotCWxhc3RfZiA9ICYoKmxhc3RfZiktPm5leHQ7Ci0gICAgICAqbGFzdF9mID0gZjsKLSAgICAgIGYtPm5leHQgPSAwOwotICAgIH0KLSAgcmV0dXJuIGY7Ci19Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIEludGVyZmFjZXMgZm9yIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyICovCi0KLSNpZm5kZWYgU1RBTkRfQUxPTkUKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN5bWJvbHMuaCIKLXN0YXRpYyB2b2lkIGFwcGVuZF9pbnNuc19hc19tYWNyb3MgKHZvaWQpOwotCi0vKiBpbml0aWFsaXplIGZvciBnYXMgKi8KLXZvaWQgCi1pdGJsX2luaXQgKHZvaWQpCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplLCAqKmVzOwotICBlX3Byb2Nlc3NvciBwcm9jbjsKLSAgZV90eXBlIHR5cGU7Ci0KLSAgaWYgKCFpdGJsX2hhdmVfZW50cmllcykKLQlyZXR1cm47Ci0KLSAgLyogU2luY2UgcmVnaXN0ZXIgbmFtZXMgZG9uJ3QgaGF2ZSBhIHByZWZpeCwgcHV0IHRoZW0gaW4gdGhlIHN5bWJvbCB0YWJsZSBzbwotICAgICB0aGV5IGNhbid0IGJlIHVzZWQgYXMgc3ltYm9scy4gIFRoaXMgc2ltcGxpZmllcyBhcmd1bWVudCBwYXJzaW5nIGFzCi0gICAgIHdlIGNhbiBsZXQgZ2FzIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuICovCi0gIC8qIFVzZSBzeW1ib2xfY3JlYXRlIGluc3RlYWQgb2Ygc3ltYm9sX25ldyBzbyB3ZSBkb24ndCB0cnkgdG8KLSAgICAgb3V0cHV0IHJlZ2lzdGVycyBpbnRvIHRoZSBvYmplY3QgZmlsZSdzIHN5bWJvbCB0YWJsZS4gICovCi0KLSAgZm9yICh0eXBlID0gZV9yZWd0eXBlMDsgdHlwZSA8IGVfbnJlZ3R5cGVzOyB0eXBlKyspCi0gICAgZm9yIChwcm9jbiA9IGVfcDA7IHByb2NuIDwgZV9ucHJvY3M7IHByb2NuKyspCi0gICAgICB7Ci0JZXMgPSBnZXRfZW50cmllcyAocHJvY24sIHR5cGUpOwotCWZvciAoZSA9ICplczsgZTsgZSA9IGUtPm5leHQpCi0JICB7Ci0JICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9jcmVhdGUgKGUtPm5hbWUsIHJlZ19zZWN0aW9uLAotCQkJCQkgICAgIGUtPnZhbHVlLCAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLQkgIH0KLSAgICAgIH0KLSAgYXBwZW5kX2luc25zX2FzX21hY3JvcyAoKTsKLX0KLQotCi0vKiBBcHBlbmQgaW5zbnMgdG8gb3Bjb2RlcyB0YWJsZSBhbmQgaW5jcmVhc2UgbnVtYmVyIG9mIG9wY29kZXMgCi0gKiBTdHJ1Y3R1cmUgb2Ygb3Bjb2RlcyB0YWJsZTogCi0gKiBzdHJ1Y3QgaXRibF9vcGNvZGUKLSAqIHsKLSAqICAgY29uc3QgY2hhciAqbmFtZTsKLSAqICAgY29uc3QgY2hhciAqYXJnczsgCQktIHN0cmluZyBkZXNjcmliaW5nIHRoZSBhcmd1bWVudHMuICAKLSAqICAgdW5zaWduZWQgbG9uZyBtYXRjaDsgCS0gb3Bjb2RlLCBvciBJU0EgbGV2ZWwgaWYgcGluZm89SU5TTl9NQUNSTyAKLSAqICAgdW5zaWduZWQgbG9uZyBtYXNrOyAJLSBvcGNvZGUgbWFzaywgb3IgbWFjcm8gaWQgaWYgcGluZm89SU5TTl9NQUNSTyAKLSAqICAgdW5zaWduZWQgbG9uZyBwaW5mbzsgCS0gaW5zbiBmbGFncywgb3IgSU5TTl9NQUNSTyAKLSAqIH07Ci0gKiBleGFtcGxlczoKLSAqCXsibGkiLCAgICAgICJ0LGkiLCAgMHgzNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCAgICB9LAotICoJeyJsaSIsICAgICAgInQsSSIsICAwLCAgICAoaW50KSBNX0xJLCAgIElOU05fTUFDUk8gIH0sCi0gKi8KLQotc3RhdGljIGNoYXIgKmZvcm1fYXJncyAoc3RydWN0IGl0YmxfZW50cnkgKmUpOwotc3RhdGljIHZvaWQgCi1hcHBlbmRfaW5zbnNfYXNfbWFjcm9zICh2b2lkKQotewotICBzdHJ1Y3QgSVRCTF9PUENPREVfU1RSVUNUICpuZXdfb3Bjb2RlcywgKm87Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplLCAqKmVzOwotICBpbnQgbiwgaWQsIHNpemUsIG5ld19zaXplLCBuZXdfbnVtX29wY29kZXM7Ci0KLSAgaWYgKCFpdGJsX2hhdmVfZW50cmllcykKLQlyZXR1cm47Ci0KLSAgaWYgKCFpdGJsX251bV9vcGNvZGVzKQkvKiBubyBuZXcgaW5zdHJ1Y3Rpb25zIHRvIGFkZCEgKi8KLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBEQkcgKCgicHJldmlvdXMgbnVtX29wY29kZXM9JWRcbiIsIElUQkxfTlVNX09QQ09ERVMpKTsKLQotICBuZXdfbnVtX29wY29kZXMgPSBJVEJMX05VTV9PUENPREVTICsgaXRibF9udW1fb3Bjb2RlczsKLSAgQVNTRVJUIChuZXdfbnVtX29wY29kZXMgPj0gaXRibF9udW1fb3Bjb2Rlcyk7Ci0KLSAgc2l6ZSA9IHNpemVvZiAoc3RydWN0IElUQkxfT1BDT0RFX1NUUlVDVCkgKiBJVEJMX05VTV9PUENPREVTOwotICBBU1NFUlQgKHNpemUgPj0gMCk7Ci0gIERCRyAoKCJJIGdldD0lZFxuIiwgc2l6ZSAvIHNpemVvZiAoSVRCTF9PUENPREVTWzBdKSkpOwotCi0gIG5ld19zaXplID0gc2l6ZW9mIChzdHJ1Y3QgSVRCTF9PUENPREVfU1RSVUNUKSAqIG5ld19udW1fb3Bjb2RlczsKLSAgQVNTRVJUIChuZXdfc2l6ZSA+IHNpemUpOwotCi0gIC8qIEZJWE1FIHNpbmNlIElUQkxfT1BDT0RFUyBjdWxkIGJlIGEgc3RhdGljIHRhYmxlLAotCQl3ZSBjYW4ndCByZWFsbG9jIG9yIGRlbGV0ZSB0aGUgb2xkIG1lbW9yeS4gKi8KLSAgbmV3X29wY29kZXMgPSAoc3RydWN0IElUQkxfT1BDT0RFX1NUUlVDVCAqKSBtYWxsb2MgKG5ld19zaXplKTsKLSAgaWYgKCFuZXdfb3Bjb2RlcykKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5ldyBpbnN0cnVjdGlvbnNcbiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChzaXplKQkJCS8qIGNvcHkgcHJleGlzdGluZyBvcGNvZGVzIHRhYmxlICovCi0gICAgbWVtY3B5IChuZXdfb3Bjb2RlcywgSVRCTF9PUENPREVTLCBzaXplKTsKLQotICAvKiBGSVhNRSEgc29tZSBOVU1PUENPREVTIGFyZSBjYWxjdWxhdGVkIGV4cHJlc3Npb25zLgotCQlUaGVzZSBuZWVkIHRvIGJlIGNoYW5nZWQgYmVmb3JlIGl0YmxzIGNhbiBiZSBzdXBwb3J0ZWQuICovCi0KLSAgaWQgPSBJVEJMX05VTV9NQUNST1M7CQkvKiBiZWdpbiB0aGUgbmV4dCBtYWNybyBpZCBhZnRlciB0aGUgbGFzdCAqLwotICBvID0gJm5ld19vcGNvZGVzW0lUQkxfTlVNX09QQ09ERVNdOwkvKiBhcHBlbmQgbWFjcm8gdG8gb3Bjb2RlcyBsaXN0ICovCi0gIGZvciAobiA9IGVfcDA7IG4gPCBlX25wcm9jczsgbisrKQotICAgIHsKLSAgICAgIGVzID0gZ2V0X2VudHJpZXMgKG4sIGVfaW5zbik7Ci0gICAgICBmb3IgKGUgPSAqZXM7IGU7IGUgPSBlLT5uZXh0KQotCXsKLQkgIC8qIG5hbWUsICAgIGFyZ3MsICAgbWFzaywgICAgICAgbWF0Y2gsICBwaW5mbwotCQkgKiB7ImxpIiwgICAgICAidCxpIiwgIDB4MzQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QgICAgfSwKLQkJICogeyJsaSIsICAgICAgInQsSSIsICAwLCAgICAoaW50KSBNX0xJLCAgIElOU05fTUFDUk8gIH0sCi0JCSAqIENvbnN0cnVjdCBhcmdzIGZyb20gaXRibF9maWVsZHMuCi0JCSovCi0JICBvLT5uYW1lID0gZS0+bmFtZTsKLQkgIG8tPmFyZ3MgPSBzdHJkdXAgKGZvcm1fYXJncyAoZSkpOwotCSAgby0+bWFzayA9IGFwcGx5X3JhbmdlIChlLT52YWx1ZSwgZS0+cmFuZ2UpOwotCSAgLyogRklYTUUgaG93IHRvIGNhdGNoIGR1cnJpbmcgYXNzZW1ibHk/ICovCi0JICAvKiBtYXNrIHRvIGlkZW50aWZ5IHRoaXMgaW5zbiAqLwotCSAgby0+bWF0Y2ggPSBhcHBseV9yYW5nZSAoZS0+dmFsdWUsIGUtPnJhbmdlKTsKLQkgIG8tPnBpbmZvID0gMDsKLQotI2lmZGVmIFVTRV9NQUNST1MKLQkgIG8tPm1hc2sgPSBpZCsrOwkvKiBGSVhNRSBob3cgdG8gY2F0Y2ggZHVycmluZyBhc3NlbWJseT8gKi8KLQkgIG8tPm1hdGNoID0gMDsJCS8qIGZvciBtYWNyb3MsIHRoZSBpbnNuX2lzYSBudW1iZXIgKi8KLQkgIG8tPnBpbmZvID0gSU5TTl9NQUNSTzsKLSNlbmRpZgotCi0JICAvKiBEb24ndCBhZGQgaW5zdHJ1Y3Rpb25zIHdoaWNoIGNhdXNlZCBhbiBlcnJvciAqLwotCSAgaWYgKG8tPmFyZ3MpCi0JICAgIG8rKzsKLQkgIGVsc2UKLQkgICAgbmV3X251bV9vcGNvZGVzLS07Ci0JfQotICAgIH0KLSAgSVRCTF9PUENPREVTID0gbmV3X29wY29kZXM7Ci0gIElUQkxfTlVNX09QQ09ERVMgPSBuZXdfbnVtX29wY29kZXM7Ci0KLSAgLyogRklYTUUKLQkJQXQgdGhpcyBwb2ludCwgd2UgY2FuIGZyZWUgdGhlIGVudHJpZXMsIGFzIHRoZXkgc2hvdWxkIGhhdmUKLQkJYmVlbiBhZGRlZCB0byB0aGUgYXNzZW1ibGVyJ3MgdGFibGVzLgotCQlEb24ndCBmcmVlIG5hbWUgdGhvdWdoLCBzaW5jZSBuYW1lIGlzIGJlaW5nIHVzZWQgYnkgdGhlIG5ldwotCQlvcGNvZGVzIHRhYmxlLgotCi0JCUV2ZW50dWFsbHksIHdlIHNob3VsZCBhbHNvIGZyZWUgdGhlIG5ldyBvcGNvZGVzIHRhYmxlIGl0c2VsZiAKLQkJb24gZXhpdC4KLQkqLwotfQotCi1zdGF0aWMgY2hhciAqCi1mb3JtX2FyZ3MgKHN0cnVjdCBpdGJsX2VudHJ5ICplKQotewotICBzdGF0aWMgY2hhciBzWzMxXTsKLSAgY2hhciBjID0gMCwgKnAgPSBzOwotICBzdHJ1Y3QgaXRibF9maWVsZCAqZjsKLQotICBBU1NFUlQgKGUpOwotICBmb3IgKGYgPSBlLT5maWVsZHM7IGY7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAoZi0+dHlwZSkKLQl7Ci0JY2FzZSBlX2RyZWc6Ci0JICBjID0gJ2QnOwotCSAgYnJlYWs7Ci0JY2FzZSBlX2NyZWc6Ci0JICBjID0gJ3QnOwotCSAgYnJlYWs7Ci0JY2FzZSBlX2dyZWc6Ci0JICBjID0gJ3MnOwotCSAgYnJlYWs7Ci0JY2FzZSBlX2ltbWVkOgotCSAgYyA9ICdpJzsKLQkgIGJyZWFrOwotCWNhc2UgZV9hZGRyOgotCSAgYyA9ICdhJzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBjID0gMDsJCS8qIGlnbm9yZTsgdW5rbm93biBmaWVsZCB0eXBlICovCi0JfQotICAgICAgaWYgKGMpCi0JewotCSAgaWYgKHAgIT0gcykKLQkgICAgKnArKyA9ICcsJzsKLQkgICpwKysgPSBjOwotCX0KLSAgICB9Ci0gICpwID0gMDsKLSAgcmV0dXJuIHM7Ci19Ci0jZW5kaWYgLyogIVNUQU5EX0FMT05FICovCi0KLQotLyogR2V0IHByb2Nlc3NvcidzIHJlZ2lzdGVyIG5hbWUgZnJvbSB2YWwgKi8KLQotaW50Ci1pdGJsX2dldF9yZWdfdmFsIChjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpwdmFsKQotewotICBlX3R5cGUgdDsKLSAgZV9wcm9jZXNzb3IgcDsKLQotICBmb3IgKHAgPSBlX3AwOyBwIDwgZV9ucHJvY3M7IHArKykKLSAgICB7Ci0gICAgICBmb3IgKHQgPSBlX3JlZ3R5cGUwOyB0IDwgZV9ucmVndHlwZXM7IHQrKykKLQl7Ci0JICBpZiAoaXRibF9nZXRfdmFsIChwLCB0LCBuYW1lLCBwdmFsKSkKLQkgICAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotaXRibF9nZXRfbmFtZSAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwgdW5zaWduZWQgbG9uZyB2YWwpCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICpyOwotICAvKiB0eXBlIGRlcGVuZHMgb24gaW5zdHJ1Y3Rpb24gcGFzc2VkICovCi0gIHIgPSBmaW5kX2VudHJ5X2J5dmFsIChwcm9jZXNzb3IsIHR5cGUsIHZhbCwgMCk7Ci0gIGlmIChyKQotICAgIHJldHVybiByLT5uYW1lOwotICBlbHNlCi0gICAgcmV0dXJuIDA7CQkJLyogZXJyb3I7IGludmFsaWQgb3BlcmFuZCAqLwotfQotCi0vKiBHZXQgcHJvY2Vzc29yJ3MgcmVnaXN0ZXIgdmFsdWUgZnJvbSBuYW1lICovCi0KLWludAotaXRibF9nZXRfdmFsIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLCBjaGFyICpuYW1lLAotCSAgICAgIHVuc2lnbmVkIGxvbmcgKnB2YWwpCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICpyOwotICAvKiB0eXBlIGRlcGVuZHMgb24gaW5zdHJ1Y3Rpb24gcGFzc2VkICovCi0gIHIgPSBmaW5kX2VudHJ5X2J5bmFtZSAocHJvY2Vzc29yLCB0eXBlLCBuYW1lKTsKLSAgaWYgKHIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgKnB2YWwgPSByLT52YWx1ZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyogQXNzZW1ibGUgaW5zdHJ1Y3Rpb24gIm5hbWUiIHdpdGggb3BlcmFuZHMgInMiLgotICogbmFtZSAtIG5hbWUgb2YgaW5zdHJ1Y3Rpb24KLSAqIHMgLSBvcGVyYW5kcwotICogcmV0dXJucyAtIGxvbmcgd29yZCBmb3IgYXNzZW1ibGVkIGluc3RydWN0aW9uICovCi0KLXVuc2lnbmVkIGxvbmcgCi1pdGJsX2Fzc2VtYmxlIChjaGFyICpuYW1lLCBjaGFyICpzKQotewotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmU7Ci0gIHN0cnVjdCBpdGJsX2ZpZWxkICpmOwotICBjaGFyICpuOwotICBpbnQgcHJvY2Vzc29yOwotCi0gIGlmICghbmFtZSB8fCAhKm5hbWUpCi0gICAgcmV0dXJuIDA7CQkJLyogZXJyb3IhICBtdXN0IGhhdmUgYSBvcGNvZGUgbmFtZS9leHByICovCi0KLSAgLyogZmluZCBlbnRyeSBpbiBsaXN0IG9mIGluc3RydWN0aW9ucyBmb3IgYWxsIHByb2Nlc3NvcnMgKi8KLSAgZm9yIChwcm9jZXNzb3IgPSAwOyBwcm9jZXNzb3IgPCBlX25wcm9jczsgcHJvY2Vzc29yKyspCi0gICAgewotICAgICAgZSA9IGZpbmRfZW50cnlfYnluYW1lIChwcm9jZXNzb3IsIGVfaW5zbiwgbmFtZSk7Ci0gICAgICBpZiAoZSkKLQlicmVhazsKLSAgICB9Ci0gIGlmICghZSkKLSAgICByZXR1cm4gMDsJCQkvKiBvcGNvZGUgbm90IGluIHRhYmxlOyBpbnZhbGlkIGluc3RydXN0aW9uICovCi0gIG9wY29kZSA9IGJ1aWxkX29wY29kZSAoZSk7Ci0KLSAgLyogcGFyc2Ugb3Bjb2RlJ3MgYXJncyAoaWYgYW55KSAqLwotICBmb3IgKGYgPSBlLT5maWVsZHM7IGY7IGYgPSBmLT5uZXh0KQkvKiBmb3IgZWFjaCBhcmcsIC4uLiAqLwotICAgIHsKLSAgICAgIHN0cnVjdCBpdGJsX2VudHJ5ICpyOwotICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgIGlmICghcyB8fCAhKnMpCi0JcmV0dXJuIDA7CQkvKiBlcnJvciAtIG5vdCBlbm91Z2ggb3BlcmFuZHMgKi8KLSAgICAgIG4gPSBpdGJsX2dldF9maWVsZCAoJnMpOwotICAgICAgLyogbiBzaG91bGQgYmUgaW4gZm9ybSAkbiBvciAweGhoaCAoYXJlIHN5bWJvbCBuYW1lcyB2YWxpZD8/ICovCi0gICAgICBzd2l0Y2ggKGYtPnR5cGUpCi0JewotCWNhc2UgZV9kcmVnOgotCWNhc2UgZV9jcmVnOgotCWNhc2UgZV9ncmVnOgotCSAgLyogQWNjZXB0IGVpdGhlciBhIHN0cmluZyBuYW1lCi0JCQkgKiBvciAnJCcgZm9sbG93ZWQgYnkgdGhlIHJlZ2lzdGVyIG51bWJlciAqLwotCSAgaWYgKCpuID09ICckJykKLQkgICAgewotCSAgICAgIG4rKzsKLQkgICAgICB2YWx1ZSA9IHN0cnRvbCAobiwgMCwgMTApOwotCSAgICAgIC8qIEZJWE1FISBjb3VsZCBoYXZlICIwbCIuLi4gdGhlbiB3aGF0Pz8gKi8KLQkgICAgICBpZiAodmFsdWUgPT0gMCAmJiAqbiAhPSAnMCcpCi0JCXJldHVybiAwOwkvKiBlcnJvcjsgaW52YWxpZCBvcGVyYW5kICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHIgPSBmaW5kX2VudHJ5X2J5bmFtZSAoZS0+cHJvY2Vzc29yLCBmLT50eXBlLCBuKTsKLQkgICAgICBpZiAocikKLQkJdmFsdWUgPSByLT52YWx1ZTsKLQkgICAgICBlbHNlCi0JCXJldHVybiAwOwkvKiBlcnJvcjsgaW52YWxpZCBvcGVyYW5kICovCi0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgZV9hZGRyOgotCSAgLyogdXNlIGFzc2VtYmxlcidzIHN5bWJvbCB0YWJsZSB0byBmaW5kIHN5bWJvbCAqLwotCSAgLyogRklYTUUhISBEbyB3ZSBuZWVkIHRoaXM/Ci0JCQkJaWYgc28sIHdoYXQgYWJvdXQgcmVsb2NzPz8KLQkJCQlteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCQkJCXJldHVybiAwOwkvLSogZXJyb3I7IGludmFsaWQgb3BlcmFuZCAqLS8KLQkJCQlicmVhazsKLQkJCSovCi0JICAvKiBJZiBub3QgYSBzeW1ib2wsIGZhbGwgdGhydSB0byBJTU1FRCAqLwotCWNhc2UgZV9pbW1lZDoKLQkgIGlmICgqbiA9PSAnMCcgJiYgKihuICsgMSkgPT0gJ3gnKQkvKiBoZXggYmVnaW5zIDB4Li4uICovCi0JICAgIHsKLQkgICAgICBuICs9IDI7Ci0JICAgICAgdmFsdWUgPSBzdHJ0b2wgKG4sIDAsIDE2KTsKLQkgICAgICAvKiBGSVhNRSEgY291bGQgaGF2ZSAiMHhsIi4uLiB0aGVuIHdoYXQ/PyAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IHN0cnRvbCAobiwgMCwgMTApOwotCSAgICAgIC8qIEZJWE1FISBjb3VsZCBoYXZlICIwbCIuLi4gdGhlbiB3aGF0Pz8gKi8KLQkgICAgICBpZiAodmFsdWUgPT0gMCAmJiAqbiAhPSAnMCcpCi0JCXJldHVybiAwOwkvKiBlcnJvcjsgaW52YWxpZCBvcGVyYW5kICovCi0JICAgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICByZXR1cm4gMDsJCS8qIGVycm9yOyBpbnZhbGlkIGZpZWxkIHNwZWMgKi8KLQl9Ci0gICAgICBvcGNvZGUgfD0gYXBwbHlfcmFuZ2UgKHZhbHVlLCBmLT5yYW5nZSk7Ci0gICAgfQotICBpZiAocyAmJiAqcykKLSAgICByZXR1cm4gMDsJCQkvKiBlcnJvciAtIHRvbyBtYW55IG9wZXJhbmRzICovCi0gIHJldHVybiBvcGNvZGU7CQkvKiBkb25lISAqLwotfQotCi0vKiBEaXNhc3NlbWJsZSBpbnN0cnVjdGlvbiAiaW5zbiIuCi0gKiBpbnNuIC0gaW5zdHJ1Y3Rpb24KLSAqIHMgLSBidWZmZXIgdG8gaG9sZCBkaXNhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24KLSAqIHJldHVybnMgLSAxIGlmIHN1Y2NlZWRlZDsgMCBpZiBmYWlsZWQKLSAqLwotCi1pbnQgCi1pdGJsX2Rpc2Fzc2VtYmxlIChjaGFyICpzLCB1bnNpZ25lZCBsb25nIGluc24pCi17Ci0gIGVfcHJvY2Vzc29yIHByb2Nlc3NvcjsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmU7Ci0gIHN0cnVjdCBpdGJsX2ZpZWxkICpmOwotCi0gIGlmICghSVRCTF9JU19JTlNOIChpbnNuKSkKLSAgICByZXR1cm4gMDsJCQkvKiBlcnJvciovCi0gIHByb2Nlc3NvciA9IGdldF9wcm9jZXNzb3IgKElUQkxfREVDT0RFX1BOVU0gKGluc24pKTsKLQotICAvKiBmaW5kIGVudHJ5IGluIGxpc3QgKi8KLSAgZSA9IGZpbmRfZW50cnlfYnl2YWwgKHByb2Nlc3NvciwgZV9pbnNuLCBpbnNuLCAwKTsKLSAgaWYgKCFlKQotICAgIHJldHVybiAwOwkJCS8qIG9wY29kZSBub3QgaW4gdGFibGU7IGludmFsaWQgaW5zdHJ1c3Rpb24gKi8KLSAgc3RyY3B5IChzLCBlLT5uYW1lKTsKLQotICAvKiBwYXJzZSBpbnNuJ3MgYXJncyAoaWYgYW55KSAqLwotICBmb3IgKGYgPSBlLT5maWVsZHM7IGY7IGYgPSBmLT5uZXh0KQkvKiBmb3IgZWFjaCBhcmcsIC4uLiAqLwotICAgIHsKLSAgICAgIHN0cnVjdCBpdGJsX2VudHJ5ICpyOwotICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotICAgICAgaWYgKGYgPT0gZS0+ZmllbGRzKQkvKiBmaXJzdCBvcGVyYW5kIGlzIHByZWNlZWRlZCBieSB0YWIgKi8KLQlzdHJjYXQgKHMsICJcdCIpOwotICAgICAgZWxzZQkJCS8qICcsJ3Mgc2VwYXJhdGUgZm9sbG93aW5nIG9wZXJhbmRzICovCi0Jc3RyY2F0IChzLCAiLCIpOwotICAgICAgdmFsdWUgPSBleHRyYWN0X3JhbmdlIChpbnNuLCBmLT5yYW5nZSk7Ci0gICAgICAvKiBuIHNob3VsZCBiZSBpbiBmb3JtICRuIG9yIDB4aGhoIChhcmUgc3ltYm9sIG5hbWVzIHZhbGlkPz8gKi8KLSAgICAgIHN3aXRjaCAoZi0+dHlwZSkKLQl7Ci0JY2FzZSBlX2RyZWc6Ci0JY2FzZSBlX2NyZWc6Ci0JY2FzZSBlX2dyZWc6Ci0JICAvKiBBY2NlcHQgZWl0aGVyIGEgc3RyaW5nIG5hbWUKLQkJCSAqIG9yICckJyBmb2xsb3dlZCBieSB0aGUgcmVnaXN0ZXIgbnVtYmVyICovCi0JICByID0gZmluZF9lbnRyeV9ieXZhbCAoZS0+cHJvY2Vzc29yLCBmLT50eXBlLCB2YWx1ZSwgJmYtPnJhbmdlKTsKLQkgIGlmIChyKQotCSAgICBzdHJjYXQgKHMsIHItPm5hbWUpOwotCSAgZWxzZQotCSAgICBzcHJpbnRmIChzLCAiJXMkJWx1IiwgcywgdmFsdWUpOwotCSAgYnJlYWs7Ci0JY2FzZSBlX2FkZHI6Ci0JICAvKiB1c2UgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlIHRvIGZpbmQgc3ltYm9sICovCi0JICAvKiBGSVhNRSEhIERvIHdlIG5lZWQgdGhpcz8KLQkJCSAqICAgaWYgc28sIHdoYXQgYWJvdXQgcmVsb2NzPz8KLQkJCSovCi0JICAvKiBJZiBub3QgYSBzeW1ib2wsIGZhbGwgdGhydSB0byBJTU1FRCAqLwotCWNhc2UgZV9pbW1lZDoKLQkgIHNwcmludGYgKHMsICIlczB4JWx4IiwgcywgdmFsdWUpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiAwOwkJLyogZXJyb3I7IGludmFsaWQgZmllbGQgc3BlYyAqLwotCX0KLSAgICB9Ci0gIHJldHVybiAxOwkJCS8qIGRvbmUhICovCi19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKgotICogTG9jYWwgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgcHJpdmF0ZSBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcKLSAqIHRoZSBuYW1lcyBhbmQgZm9ybWF0IGZvciB0aGUgbmV3IGluc3RydWN0aW9ucyBhbmQgcmVnaXN0ZXJzCi0gKiBmb3IgZWFjaCBwcm9jZXNzb3IuCi0gKi8KLQotLyogQ2FsY3VsYXRlIGluc3RydWN0aW9uJ3Mgb3Bjb2RlIGFuZCBmdW5jdGlvbiB2YWx1ZXMgZnJvbSBlbnRyeSAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAKLWJ1aWxkX29wY29kZSAoc3RydWN0IGl0YmxfZW50cnkgKmUpCi17Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIG9wY29kZSA9IGFwcGx5X3JhbmdlIChlLT52YWx1ZSwgZS0+cmFuZ2UpOwotICBvcGNvZGUgfD0gSVRCTF9FTkNPREVfUE5VTSAoZS0+cHJvY2Vzc29yKTsKLSAgcmV0dXJuIG9wY29kZTsKLX0KLQotLyogQ2FsY3VsYXRlIGFic29sdXRlIHZhbHVlIGdpdmVuIHRoZSByZWxhdGl2ZSB2YWx1ZSBhbmQgYml0IHBvc2l0aW9uIHJhbmdlCi0gKiB3aXRoaW4gdGhlIGluc3RydWN0aW9uLgotICogVGhlIHJhbmdlIGlzIGluY2x1c2l2ZSB3aGVyZSAwIGlzIGxlYXN0IHNpZ25pZmljYW50IGJpdC4KLSAqIEEgcmFuZ2Ugb2YgeyAyNCwgMjAgfSB3aWxsIGhhdmUgYSBtYXNrIG9mCi0gKiBiaXQgICAzICAgICAgICAgICAyICAgICAgICAgICAgMQotICogcG9zOiAxMDk4IDc2NTQgMzIxMCA5ODc2IDU0MzIgMTA5OCA3NjU0IDMyMTAKLSAqIGJpbjogMDAwMCAwMDAxIDExMTEgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwCi0gKiBoZXg6ICAgIDAgICAgMSAgICBmICAgIDAgICAgMCAgICAwICAgIDAgICAgMAotICogbWFzazogMHgwMWYwMDAwMC4KLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAKLWFwcGx5X3JhbmdlICh1bnNpZ25lZCBsb25nIHJ2YWwsIHN0cnVjdCBpdGJsX3JhbmdlIHIpCi17Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgdW5zaWduZWQgbG9uZyBhdmFsOwotICBpbnQgbGVuID0gTUFYX0JJVFBPUyAtIHIuc2JpdDsKLQotICBBU1NFUlQgKHIuc2JpdCA+PSByLmViaXQpOwotICBBU1NFUlQgKE1BWF9CSVRQT1MgPj0gci5zYml0KTsKLSAgQVNTRVJUIChyLmViaXQgPj0gMCk7Ci0KLSAgLyogY3JlYXRlIG1hc2sgYnkgdHJ1bmNhdGluZyAxcyBieSBzaGlmdGluZyAqLwotICBtYXNrID0gMHhmZmZmZmZmZiA8PCBsZW47Ci0gIG1hc2sgPSBtYXNrID4+IGxlbjsKLSAgbWFzayA9IG1hc2sgPj4gci5lYml0OwotICBtYXNrID0gbWFzayA8PCByLmViaXQ7Ci0KLSAgYXZhbCA9IChydmFsIDw8IHIuZWJpdCkgJiBtYXNrOwotICByZXR1cm4gYXZhbDsKLX0KLQotLyogQ2FsY3VsYXRlIHJlbGF0aXZlIHZhbHVlIGdpdmVuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBhbmQgYml0IHBvc2l0aW9uIHJhbmdlCi0gKiB3aXRoaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgCi1leHRyYWN0X3JhbmdlICh1bnNpZ25lZCBsb25nIGF2YWwsIHN0cnVjdCBpdGJsX3JhbmdlIHIpCi17Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgdW5zaWduZWQgbG9uZyBydmFsOwotICBpbnQgbGVuID0gTUFYX0JJVFBPUyAtIHIuc2JpdDsKLQotICAvKiBjcmVhdGUgbWFzayBieSB0cnVuY2F0aW5nIDFzIGJ5IHNoaWZ0aW5nICovCi0gIG1hc2sgPSAweGZmZmZmZmZmIDw8IGxlbjsKLSAgbWFzayA9IG1hc2sgPj4gbGVuOwotICBtYXNrID0gbWFzayA+PiByLmViaXQ7Ci0gIG1hc2sgPSBtYXNrIDw8IHIuZWJpdDsKLQotICBydmFsID0gKGF2YWwgJiBtYXNrKSA+PiByLmViaXQ7Ci0gIHJldHVybiBydmFsOwotfQotCi0vKiBFeHRyYWN0IHByb2Nlc3NvcidzIGFzc2VtYmx5IGluc3RydWN0aW9uIGZpZWxkIG5hbWUgZnJvbSBzOwotICogZm9ybXMgYXJlICJuIGFyZ3MiICJuLGFyZ3MiIG9yICJuIiAqLwotLyogUmV0dXJuIG5leHQgYXJndW1lbnQgZnJvbSBzdHJpbmcgcG9pbnRlciAicyIgYW5kIGFkdmFuY2Ugcy4KLSAqIGRlbGltaXRlcnMgYXJlICIgLCgpIiAqLwotCi1jaGFyICoKLWl0YmxfZ2V0X2ZpZWxkIChjaGFyICoqUykKLXsKLSAgc3RhdGljIGNoYXIgblsxMjhdOwotICBjaGFyICpzOwotICBpbnQgbGVuOwotCi0gIHMgPSAqUzsKLSAgaWYgKCFzIHx8ICEqcykKLSAgICByZXR1cm4gMDsKLSAgLyogRklYTUU6IFRoaXMgaXMgYSB3ZWlyZCBzZXQgb2YgZGVsaW1pdGVycy4gICovCi0gIGxlbiA9IHN0cmNzcG4gKHMsICIgXHQsKCkiKTsKLSAgQVNTRVJUICgxMjggPiBsZW4gKyAxKTsKLSAgc3RybmNweSAobiwgcywgbGVuKTsKLSAgbltsZW5dID0gMDsKLSAgaWYgKHNbbGVuXSA9PSAnXDAnKQotICAgIHMgPSAwOwkJCS8qIG5vIG1vcmUgYXJncyAqLwotICBlbHNlCi0gICAgcyArPSBsZW4gKyAxOwkJLyogYWR2YW5jZSB0byBuZXh0IGFyZyAqLwotCi0gICpTID0gczsKLSAgcmV0dXJuIG47Ci19Ci0KLS8qIFNlYXJjaCBlbnRyaWVzIGZvciBhIGdpdmVuIHByb2Nlc3NvciBhbmQgdHlwZQotICogdG8gZmluZCBvbmUgbWF0Y2hpbmcgdGhlIG5hbWUgIm4iLgotICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZW50cnkgKi8KLQotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICoKLWZpbmRfZW50cnlfYnluYW1lIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsCi0JCSAgIGVfdHlwZSB0eXBlLCBjaGFyICpuKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgKiplczsKLQotICBlcyA9IGdldF9lbnRyaWVzIChwcm9jZXNzb3IsIHR5cGUpOwotICBmb3IgKGUgPSAqZXM7IGU7IGUgPSBlLT5uZXh0KQkvKiBmb3IgZWFjaCBlbnRyeSwgLi4uICovCi0gICAgewotICAgICAgaWYgKCFzdHJjbXAgKGUtPm5hbWUsIG4pKQotCXJldHVybiBlOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFNlYXJjaCBlbnRyaWVzIGZvciBhIGdpdmVuIHByb2Nlc3NvciBhbmQgdHlwZQotICogdG8gZmluZCBvbmUgbWF0Y2hpbmcgdGhlIHZhbHVlICJ2YWwiIGZvciB0aGUgcmFuZ2UgInIiLgotICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZW50cnkuCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGRpc2Fzc2VtYmxpbmcgZmllbGRzIG9mIGFuIGluc3RydWN0aW9uLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqCi1maW5kX2VudHJ5X2J5dmFsIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLAotCQkgIHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3QgaXRibF9yYW5nZSAqcikKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7Ci0gIHVuc2lnbmVkIGxvbmcgZXZhbDsKLQotICBlcyA9IGdldF9lbnRyaWVzIChwcm9jZXNzb3IsIHR5cGUpOwotICBmb3IgKGUgPSAqZXM7IGU7IGUgPSBlLT5uZXh0KQkvKiBmb3IgZWFjaCBlbnRyeSwgLi4uICovCi0gICAgewotICAgICAgaWYgKHByb2Nlc3NvciAhPSBlLT5wcm9jZXNzb3IpCi0JY29udGludWU7Ci0gICAgICAvKiBGb3IgaW5zbnMsIHdlIG1pZ2h0IG5vdCBrbm93IHRoZSByYW5nZSBvZiB0aGUgb3Bjb2RlLAotCSAqIHNvIGEgcmFuZ2Ugb2YgMCB3aWxsIGFsbG93IHRoaXMgcm91dGluZSB0byBtYXRjaCBhZ2FpbnN0Ci0JICogdGhlIHJhbmdlIG9mIHRoZSBlbnRyeSB0byBiZSBjb21wYXJlZCB3aXRoLgotCSAqIFRoaXMgY291bGQgY2F1c2UgYW1iaWd1aXRpZXMuCi0JICogRm9yIG9wZXJhbmRzLCB3ZSBnZXQgYW4gZXh0cmFjdGVkIHZhbHVlIGFuZCBhIHJhbmdlLgotCSAqLwotICAgICAgLyogaWYgcmFuZ2UgaXMgMCwgbWFzayB2YWwgYWdhaW5zdCB0aGUgcmFuZ2Ugb2YgdGhlIGNvbXBhcmVkIGVudHJ5LiAqLwotICAgICAgaWYgKHIgPT0gMCkJCS8qIGlmIG5vIHJhbmdlIHBhc3NlZCwgbXVzdCBiZSB3aG9sZSAzMi1iaXRzCi0JCQkgKiBzbyBjcmVhdGUgMzItYml0IHZhbHVlIGZyb20gZW50cnkncyByYW5nZSAqLwotCXsKLQkgIGV2YWwgPSBhcHBseV9yYW5nZSAoZS0+dmFsdWUsIGUtPnJhbmdlKTsKLQkgIHZhbCAmPSBhcHBseV9yYW5nZSAoMHhmZmZmZmZmZiwgZS0+cmFuZ2UpOwotCX0KLSAgICAgIGVsc2UgaWYgKChyLT5zYml0ID09IGUtPnJhbmdlLnNiaXQgJiYgci0+ZWJpdCA9PSBlLT5yYW5nZS5lYml0KQotCSAgICAgICB8fCAoZS0+cmFuZ2Uuc2JpdCA9PSAwICYmIGUtPnJhbmdlLmViaXQgPT0gMCkpCi0JewotCSAgZXZhbCA9IGFwcGx5X3JhbmdlIChlLT52YWx1ZSwgKnIpOwotCSAgdmFsID0gYXBwbHlfcmFuZ2UgKHZhbCwgKnIpOwotCX0KLSAgICAgIGVsc2UKLQljb250aW51ZTsKLSAgICAgIGlmICh2YWwgPT0gZXZhbCkKLQlyZXR1cm4gZTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBsaXN0IG9mIGVudHJpZXMgZm9yIGEgZ2l2ZW4gcHJvY2Vzc29yIGFuZCB0eXBlLiAqLwotCi1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKioKLWdldF9lbnRyaWVzIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlKQotewotICByZXR1cm4gJmVudHJpZXNbcHJvY2Vzc29yXVt0eXBlXTsKLX0KLQotLyogUmV0dXJuIGFuIGludGVncmFsIHZhbHVlIGZvciB0aGUgcHJvY2Vzc29yIHBhc3NlZCBmcm9tIHl5cGFyc2UuICovCi0KLXN0YXRpYyBlX3Byb2Nlc3NvciAKLWdldF9wcm9jZXNzb3IgKGludCB5eXByb2MpCi17Ci0gIC8qIHRyYW5zbGF0ZSBmcm9tIHlhY2MncyBwcm9jZXNzb3IgdG8gZW51bSAqLwotICBpZiAoeXlwcm9jID49IGVfcDAgJiYgeXlwcm9jIDwgZV9ucHJvY3MpCi0gICAgcmV0dXJuIChlX3Byb2Nlc3NvcikgeXlwcm9jOwotICByZXR1cm4gZV9pbnZwcm9jOwkJLyogZXJyb3I7IGludmFsaWQgcHJvY2Vzc29yICovCi19Ci0KLS8qIFJldHVybiBhbiBpbnRlZ3JhbCB2YWx1ZSBmb3IgdGhlIGVudHJ5IHR5cGUgcGFzc2VkIGZyb20geXlwYXJzZS4gKi8KLQotc3RhdGljIGVfdHlwZSAKLWdldF90eXBlIChpbnQgeXl0eXBlKQotewotICBzd2l0Y2ggKHl5dHlwZSkKLSAgICB7Ci0gICAgICAvKiB0cmFuc2xhdGUgZnJvbSB5YWNjJ3MgdHlwZSB0byBlbnVtICovCi0gICAgY2FzZSBJTlNOOgotICAgICAgcmV0dXJuIGVfaW5zbjsKLSAgICBjYXNlIERSRUc6Ci0gICAgICByZXR1cm4gZV9kcmVnOwotICAgIGNhc2UgQ1JFRzoKLSAgICAgIHJldHVybiBlX2NyZWc7Ci0gICAgY2FzZSBHUkVHOgotICAgICAgcmV0dXJuIGVfZ3JlZzsKLSAgICBjYXNlIEFERFI6Ci0gICAgICByZXR1cm4gZV9hZGRyOwotICAgIGNhc2UgSU1NRUQ6Ci0gICAgICByZXR1cm4gZV9pbW1lZDsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGVfaW52dHlwZTsJCS8qIGVycm9yOyBpbnZhbGlkIHR5cGUgKi8KLSAgICB9Ci19Ci0KLQotLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gZW50cnkgKi8KLQotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICoKLWFsbG9jX2VudHJ5IChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLAotCSAgICAgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7Ci0gIGlmICghbmFtZSkKLSAgICByZXR1cm4gMDsKLSAgZSA9IChzdHJ1Y3QgaXRibF9lbnRyeSAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGl0YmxfZW50cnkpKTsKLSAgaWYgKGUpCi0gICAgewotICAgICAgbWVtc2V0IChlLCAwLCBzaXplb2YgKHN0cnVjdCBpdGJsX2VudHJ5KSk7Ci0gICAgICBlLT5uYW1lID0gKGNoYXIgKikgbWFsbG9jIChzaXplb2YgKHN0cmxlbiAobmFtZSkpICsgMSk7Ci0gICAgICBpZiAoZS0+bmFtZSkKLQlzdHJjcHkgKGUtPm5hbWUsIG5hbWUpOwotICAgICAgZS0+cHJvY2Vzc29yID0gcHJvY2Vzc29yOwotICAgICAgZS0+dHlwZSA9IHR5cGU7Ci0gICAgICBlLT52YWx1ZSA9IHZhbHVlOwotICAgICAgZXMgPSBnZXRfZW50cmllcyAoZS0+cHJvY2Vzc29yLCBlLT50eXBlKTsKLSAgICAgIGUtPm5leHQgPSAqZXM7Ci0gICAgICAqZXMgPSBlOwotICAgIH0KLSAgcmV0dXJuIGU7Ci19Ci0KLS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIGVudHJ5J3MgZmllbGQgKi8KLQotc3RhdGljIHN0cnVjdCBpdGJsX2ZpZWxkICoKLWFsbG9jX2ZpZWxkIChlX3R5cGUgdHlwZSwgaW50IHNiaXQsIGludCBlYml0LAotCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLSAgc3RydWN0IGl0YmxfZmllbGQgKmY7Ci0gIGYgPSAoc3RydWN0IGl0YmxfZmllbGQgKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBpdGJsX2ZpZWxkKSk7Ci0gIGlmIChmKQotICAgIHsKLSAgICAgIG1lbXNldCAoZiwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXRibF9maWVsZCkpOwotICAgICAgZi0+dHlwZSA9IHR5cGU7Ci0gICAgICBmLT5yYW5nZS5zYml0ID0gc2JpdDsKLSAgICAgIGYtPnJhbmdlLmViaXQgPSBlYml0OwotICAgICAgZi0+ZmxhZ3MgPSBmbGFnczsKLSAgICB9Ci0gIHJldHVybiBmOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2l0Ymwtb3BzLmggYi9nYXMvaXRibC1vcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5ZWE3Zi4uMDAwMDAwMAotLS0gYS9nYXMvaXRibC1vcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKiBpdGJsLW9wcy5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEV4dGVybmFsIGZ1bmN0aW9ucywgY29uc3RhbnRzIGFuZCBkZWZpbmVzIGZvciBpdGJsIHN1cHBvcnQgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIEluY2x1ZGUgZmlsZSBub3RlczogImV4cHIuaCIgbmVlZGVkIGJlZm9yZSB0YXJnLSouaCwKLSAqICJ0YXJnLWVudi5oIiBpbmNsdWRlcyB0aGUgY2hhaW4gb2YgdGFyZ2V0IGRlcGVuZGFudCBoZWFkZXJzLAotICogInRhcmctY3B1LmgiIGhhcyB0aGUgSEFWRV9JVEJMX0NQVSBkZWZpbmUsIGFuZAotICogYXMuaCBpbmNsdWRlcyB0aGVtIGFsbCAqLwotI2luY2x1ZGUgImFzLmgiCi0KLSNpZmRlZiBIQVZFX0lUQkxfQ1BVCi0jaW5jbHVkZSAiaXRibC1jcHUuaCIKLSNlbmRpZgotCi0vKiBEZWZhdWx0cyBmb3IgZGVmaW5pdGlvbnMgcmVxdWlyZWQgYnkgZ2VuZXJpYyBjb2RlICovCi0jaWZuZGVmIElUQkxfTlVNQkVSX09GX1BST0NFU1NPUlMKLSNkZWZpbmUgSVRCTF9OVU1CRVJfT0ZfUFJPQ0VTU09SUyAxCi0jZW5kaWYKLQotI2lmbmRlZiBJVEJMX01BWF9CSVRQT1MKLSNkZWZpbmUgSVRCTF9NQVhfQklUUE9TIDMxCi0jZW5kaWYKLQotI2lmbmRlZiBJVEJMX1RZUEUKLSNkZWZpbmUgSVRCTF9UWVBFIHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi0jaWZuZGVmIElUQkxfSVNfSU5TTgotI2RlZmluZSBJVEJMX0lTX0lOU04oaW5zbikgMQotI2VuZGlmCi0KLSNpZm5kZWYgSVRCTF9ERUNPREVfUE5VTQotI2RlZmluZSBJVEJMX0RFQ09ERV9QTlVNKGluc24pIDAKLSNlbmRpZgotCi0jaWZuZGVmIElUQkxfRU5DT0RFX1BOVU0KLSNkZWZpbmUgSVRCTF9FTkNPREVfUE5VTShwbnVtKSAwCi0jZW5kaWYKLQotdHlwZWRlZiBJVEJMX1RZUEUgdF9pbnNuOwotCi0vKiB0eXBlcyBvZiBlbnRyaWVzICovCi10eXBlZGVmIGVudW0KLSAgewotICAgIGVfaW5zbiwKLSAgICBlX2RyZWcsCi0gICAgZV9yZWd0eXBlMCA9IGVfZHJlZywKLSAgICBlX2NyZWcsCi0gICAgZV9ncmVnLAotICAgIGVfYWRkciwKLSAgICBlX25yZWd0eXBlcyA9IGVfZ3JlZyArIDEsCi0gICAgZV9pbW1lZCwKLSAgICBlX250eXBlcywKLSAgICBlX2ludnR5cGUJCQkvKiBpbnZhbGlkIHR5cGUgKi8KLSAgfSBlX3R5cGU7Ci0KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgZV9wMCwKLSAgICBlX25wcm9jcyA9IE5VTUJFUl9PRl9QUk9DRVNTT1JTLAotICAgIGVfaW52cHJvYwkJCS8qIGludmFsaWQgcHJvY2Vzc29yICovCi0gIH0gZV9wcm9jZXNzb3I7Ci0KLS8qIDAgbWVhbnMgYW4gaW5zdHJ1Y3Rpb24gdGFibGUgd2FzIG5vdCBzcGVjaWZpZWQuICovCi1leHRlcm4gaW50IGl0YmxfaGF2ZV9lbnRyaWVzOwotCi0vKiBUaGVzZSByb3V0aW5lcyBhcmUgdmlzaWJsZSB0byB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgKi8KLQotaW50IGl0YmxfcGFyc2UgUEFSQU1TICgoY2hhciAqaW5zbnRibCkpOwotdm9pZCBpdGJsX2luaXQgUEFSQU1TICgodm9pZCkpOwotY2hhciAqaXRibF9nZXRfZmllbGQgUEFSQU1TICgoY2hhciAqKnMpKTsKLXVuc2lnbmVkIGxvbmcgaXRibF9hc3NlbWJsZSBQQVJBTVMgKChjaGFyICpuYW1lLCBjaGFyICpvcGVyYW5kcykpOwotaW50IGl0YmxfZGlzYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGluc24pKTsKLWludCBpdGJsX3BhcnNlIFBBUkFNUyAoKGNoYXIgKnRibCkpOwkvKiBwYXJzZXMgaW5zbiB0YmwgKi8KLWludCBpdGJsX2dldF9yZWdfdmFsIFBBUkFNUyAoKGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKnB2YWwpKTsKLWludCBpdGJsX2dldF92YWwgUEFSQU1TICgoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwgY2hhciAqbmFtZSwKLQkJCSAgdW5zaWduZWQgbG9uZyAqcHZhbCkpOwotY2hhciAqaXRibF9nZXRfbmFtZSBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLAotCQkJICAgICB1bnNpZ25lZCBsb25nIHZhbCkpOwotCi0vKiBUaGVzZSByb3V0aW5lcyBhcmUgY2FsbGVkIGJ5IHRoZSB0YWJsZSBwYXJzZXIgdXNlZCB0byBidWlsZCB0aGUKLSAgIGR5bmFtaWMgbGlzdCBvZiBuZXcgcHJvY2Vzc29yIGluc3RydWN0aW9ucyBhbmQgcmVnaXN0ZXJzLiAqLwotCi1zdHJ1Y3QgaXRibF9lbnRyeSAqaXRibF9hZGRfcmVnIFBBUkFNUyAoKGludCB5eXByb2MsIGludCB5eXR5cGUsCi0JCQkJCSBjaGFyICpyZWduYW1lLCBpbnQgcmVnbnVtKSk7Ci1zdHJ1Y3QgaXRibF9lbnRyeSAqaXRibF9hZGRfaW5zbiBQQVJBTVMgKChpbnQgeXlwcm9jLCBjaGFyICpuYW1lLAotCSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgaW50IHNiaXQsIGludCBlYml0LCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdHJ1Y3QgaXRibF9maWVsZCAqaXRibF9hZGRfb3BlcmFuZCBQQVJBTVMgKChzdHJ1Y3QgaXRibF9lbnRyeSAqIGUsIGludCB5eXR5cGUsCi0JCQkJICBpbnQgc2JpdCwgaW50IGViaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKZGlmZiAtLWdpdCBhL2dhcy9pdGJsLXBhcnNlLnkgYi9nYXMvaXRibC1wYXJzZS55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTY2ZWU4Li4wMDAwMDAwCi0tLSBhL2dhcy9pdGJsLXBhcnNlLnkKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyogaXRibC1wYXJzZS55Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTcgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0lewotCi0vKiAKLQotWWFjYyBncmFtbWFyIGZvciBpbnN0cnVjdGlvbiB0YWJsZSBlbnRyaWVzLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotT3JpZ2luYWwgSW5zdHJ1Y3Rpb24gdGFibGUgc3BlY2lmaWNhdGlvbiBkb2N1bWVudDoKLQotCSAgICBNSVBTIENvcHJvY2Vzc29yIFRhYmxlIFNwZWNpZmljYXRpb24KLQkgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIE1JUFMgY29wcm9jZXNzb3IgdGFibGUuICBUaGUKLXRhYmxlIHNwZWNpZmllcyBhIGxpc3Qgb2YgdmFsaWQgZnVuY3Rpb25zLCBkYXRhIHJlZ2lzdGVycyBhbmQgY29udHJvbAotcmVnaXN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgaW4gY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBsaXN0LAotdG9nZXRoZXIgd2l0aCB0aGUgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gY2xhc3NlcyBsaXN0ZWQgYmVsb3csCi1zcGVjaWZpZXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgd2lsbAotYmUgcmVjb2duaXplZCBhbmQgYXNzZW1ibGVkIGJ5IHRoZSBHTlUgYXNzZW1ibGVyLiAgSW4gZWZmZWN0LAotdGhpcyBtYWtlcyB0aGUgR05VIGFzc2VtYmxlciB0YWJsZS1kcml2ZW4sIHdoZXJlIHRoZSB0YWJsZSBpcwotc3BlY2lmaWVkIGJ5IHRoZSBwcm9ncmFtbWVyLgotCi1UaGUgdGFibGUgaXMgYW4gb3JkaW5hcnkgdGV4dCBmaWxlIHRoYXQgdGhlIEdOVSBhc3NlbWJsZXIgcmVhZHMgd2hlbgotaXQgc3RhcnRzLiAgVXNpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoZSB0YWJsZSwgdGhlIGFzc2VtYmxlcgotZ2VuZXJhdGVzIGFuIGludGVybmFsIGxpc3Qgb2YgdmFsaWQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzIGFuZAotZnVuY3Rpb25zLiAgVGhlIGFzc2VtYmxlciB1c2VzIHRoaXMgaW50ZXJuYWwgbGlzdCBpbiBhZGRpdGlvbiB0byB0aGUKLXN0YW5kYXJkIE1JUFMgcmVnaXN0ZXJzIGFuZCBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIGJ1aWx0LWluIHRvIHRoZSAKLWFzc2VtYmxlciBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCi1UbyBzcGVjaWZ5IHRoZSBjb3Byb2Nlc3NvciB0YWJsZSB3aGVuIGludm9raW5nIHRoZSBHTlUgYXNzZW1ibGVyLCB1c2UKLXRoZSBjb21tYW5kIGxpbmUgb3B0aW9uICItLWl0YmwgZmlsZSIsIHdoZXJlIGZpbGUgaXMgdGhlCi1jb21wbGV0ZSBuYW1lIG9mIHRoZSB0YWJsZSwgaW5jbHVkaW5nIHBhdGggYW5kIGV4dGVuc2lvbi4KLQotRXhhbXBsZXM6Ci0KLQkgICAgZ2FzIC10IGNvcC50YmwgdGVzdC5zIC1vIHRlc3QubwotCSAgICBnYXMgLXQgL3Vzci9sb2NhbC9saWIvY29wLnRibCB0ZXN0LnMgLW8gdGVzdC5vCi0JICAgIGdhcyAtLWl0YmwgZDpcZ251XGRhdGFcY29wLnRibCB0ZXN0LnMgLW8gdGVzdC5vCi0KLU9ubHkgb25lIHRhYmxlIG1heSBiZSBzdXBwbGllZCBkdXJpbmcgYSBzaW5nbGUgaW52b2NhdGlvbiBvZgotdGhlIGFzc2VtYmxlci4KLQotCi1JbnN0cnVjdGlvbiBjbGFzc2VzCi09PT09PT09PT09PT09PT09PT09Ci0KLUJlbG93IGlzIGEgbGlzdCBvZiB0aGUgdmFsaWQgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gY2xhc3NlcyBmb3IKLWFueSBnaXZlbiBjb3Byb2Nlc3NvciAieiIuICBUaGVzZSBpbnN0cnVjdGlvbnMgYXJlIGFscmVhZHkgcmVjb2duaXplZAotYnkgdGhlIGFzc2VtYmxlciwgYW5kIGFyZSBsaXN0ZWQgaGVyZSBvbmx5IGZvciByZWZlcmVuY2UuCi0KLUNsYXNzICAgZm9ybWF0CSAgICAJICAgIAkgICAgICBpbnN0cnVjdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNsYXNzMToKLQlvcCBiYXNlIHJ0IG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBMV0N6IHJ0LG9mZnNldCAoYmFzZSkKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgU1dDeiBydCxvZmZzZXQgKGJhc2UpCi1DbGFzczI6Ci0JQ09QeiBzdWIgcnQgcmQgMAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBNVEN6IHJ0LHJkCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIE1GQ3ogcnQscmQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQ1RDeiBydCxyZAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBDRkN6IHJ0LHJkCi1DbGFzczM6Ci0JQ09QeiBDTyBjb2Z1bgotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBDT1B6IGNvZnVuCi1DbGFzczQ6Ci0JQ09QeiBCQyBiciBvZmZzZXQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQkN6VCBvZmZzZXQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQkN6RiBvZmZzZXQKLUNsYXNzNToKLQlDT1B6IHN1YiBydCByZCAwCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIERNRkN6IHJ0LHJkCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIERNVEN6IHJ0LHJkCi1DbGFzczY6Ci0Jb3AgYmFzZSBydCBvZmZzZXQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgTERDeiBydCxvZmZzZXQgKGJhc2UpCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIFNEQ3ogcnQsb2Zmc2V0IChiYXNlKQotQ2xhc3M3OgotCUNPUHogQkMgYnIgb2Zmc2V0Ci0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIEJDelRMIG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBCQ3pGTCBvZmZzZXQKLQotVGhlIGNvcHJvY2Vzc29yIHRhYmxlIGRlZmluZXMgY29wcm9jZXNzb3Itc3BlY2lmaWMgcmVnaXN0ZXJzIHRoYXQgY2FuCi1iZSB1c2VkIHdpdGggYWxsIG9mIHRoZSBhYm92ZSBjbGFzc2VzIG9mIGluc3RydWN0aW9ucywgd2hlcmUKLWFwcHJvcHJpYXRlLiAgSXQgYWxzbyBkZWZpbmVzIGFkZGl0aW9uYWwgY29wcm9jZXNzb3Itc3BlY2lmaWMKLWZ1bmN0aW9ucyBmb3IgQ2xhc3MzIChDT1B6IGNvZnVuKSBpbnN0cnVjdGlvbnMsIFRodXMsIHRoZSB0YWJsZSBhbGxvd3MKLXRoZSBwcm9ncmFtbWVyIHRvIHVzZSBjb252ZW5pZW50IG1uZW1vbmljcyBhbmQgb3BlcmFuZHMgZm9yIHRoZXNlCi1mdW5jdGlvbnMsIGluc3RlYWQgb2YgdGhlIENPUHogbW1lbm1vbmljIGFuZCBjb2Z1biBvcGVyYW5kLgotCi1UaGUgbmFtZXMgb2YgdGhlIE1JUFMgZ2VuZXJhbCByZWdpc3RlcnMgYW5kIHRoZWlyIGFsaWFzZXMgYXJlIGRlZmluZWQKLWJ5IHRoZSBhc3NlbWJsZXIgYW5kIHdpbGwgYmUgcmVjb2duaXplZCBhcyB2YWxpZCByZWdpc3RlciBuYW1lcyBieSB0aGUKLWFzc2VtYmxlciB3aGVuIHVzZWQgKHdoZXJlIGFsbG93ZWQpIGluIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucy4KLUhvd2V2ZXIsIHRoZSBuYW1lcyBhbmQgdmFsdWVzIG9mIGFsbCBjb3Byb2Nlc3NvciBkYXRhIGFuZCBjb250cm9sCi1yZWdpc3RlciBtbmVtb25pY3MgbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGhlIGNvcHJvY2Vzc29yIHRhYmxlLgotCi0KLVRhYmxlIEdyYW1tYXIKLT09PT09PT09PT09PT0KLQotSGVyZSBpcyB0aGUgZ3JhbW1hciBmb3IgdGhlIGNvcHJvY2Vzc29yIHRhYmxlOgotCi0JICAgIHRhYmxlIC0+IGVudHJ5KgotCi0JICAgIGVudHJ5IC0+IFt6IGVudHJ5ZGVmXSBbY29tbWVudF0gJ1xuJwotCi0JICAgIGVudHJ5ZGVmIC0+IHR5cGUgbmFtZSB2YWwKLQkgICAgZW50cnlkZWYgLT4gJ2luc24nIG5hbWUgdmFsIGZ1bmNkZWYgOyB0eXBlIG9mIGVudHJ5IChpbnN0cnVjdGlvbikKLQotCSAgICB6IC0+ICdwJ1snMCcuLiczJ10JICAgIAkgICAgIDsgcHJvY2Vzc29yIG51bWJlciAKLQkgICAgdHlwZSAtPiBbJ2RyZWcnIHwgJ2NyZWcnIHwgJ2dyZWcnIF0JICAgICA7IHR5cGUgb2YgZW50cnkgKHJlZ2lzdGVyKQotCTsgJ2RyZWcnLCAnY3JlZycgb3IgJ2dyZWcnIHNwZWNpZmllcyBhIGRhdGEsIGNvbnRyb2wsIG9yIGdlbmVyYWwKLQk7CSAgICByZWdpc3RlciBtbmVtb25pYywgcmVzcGVjdGl2ZWx5Ci0JICAgIG5hbWUgLT4gW2x0cnxkZWNdKgkgICAgCSAgICAgOyBtbmVtb25pYyBvZiByZWdpc3Rlci9mdW5jdGlvbgotCSAgICB2YWwgLT4gW2RlY3xoZXhdCSAgICAJICAgICA7IHJlZ2lzdGVyL2Z1bmN0aW9uIG51bWJlciAoaW50ZWdlciBjb25zdGFudCkKLQotCSAgICBmdW5jZGVmIC0+IGZyYW5nZSBmbGFncyBmaWVsZHMKLQkgICAgCSAgICAJICAgIAk7IGJpdGZpZWxkIHJhbmdlIGZvciBvcGNvZGUKLQkgICAgCSAgICAJICAgIAk7IGxpc3Qgb2YgZmllbGRzJyBmb3JtYXRzCi0JICAgIGZpZWxkcyAtPiBmaWVsZCoKLQkgICAgZmllbGQgLT4gWycsJ10gZnR5cGUgZnJhbmdlIGZsYWdzCi0JICAgIGZsYWdzIC0+IFsnKicgZmxhZ2V4cHJdCi0JICAgIGZsYWdleHByIC0+ICdbJyBmbGFnZXhwciAnXScKLQkgICAgZmxhZ2V4cHIgLT4gdmFsICd8JyBmbGFnZXhwciAKLQkgICAgZnR5cGUgLT4gWyB0eXBlIHwgJ2ltbWVkJyB8ICdhZGRyJyBdCi0JOyAnaW1tZWQnIHNwZWNpZmllcyBhbiBpbW1lZGlhdGUgdmFsdWU7IHNlZSBncmFtbWFyIGZvciAidmFsIiBhYm92ZQotCSAgICAJOyAnYWRkcicgc3BlY2lmaWVzIGEgQyBpZGVudGlmaWVyOyBuYW1lIG9mIHN5bWJvbCB0byBiZSByZXNvbHZlZCBhdCAKLQk7CSAgICBsaW5rIHRpbWUKLQkgICAgZnJhbmdlIC0+ICc6JyB2YWwgJy0nIHZhbAk7IHN0YXJ0aW5nIHRvIGVuZGluZyBiaXQgcG9zaXRpb25zLCB3aGVyZQotCSAgICAJICAgIAkgICAgCTsgd2hlcmUgMCBpcyBsZWFzdCBzaWduaWZpY2FudCBiaXQKLQkgICAgZnJhbmdlIC0+IChudWxsKQkgICAgCTsgZGVmYXVsdCByYW5nZSBvZiAzMS0wIHdpbGwgYmUgYXNzdW1lZAotCi0JICAgIGNvbW1lbnQgLT4gWyc7J3wnIyddIFtjaGFyXSoKLQkgICAgY2hhciAtPiBhbnkgcHJpbnRhYmxlIGNoYXJhY3RlcgotCSAgICBsdHIgLT4gWydhJy4uJ3onfCdBJy4uJ1onXSAKLQkgICAgZGVjIC0+IFsnMCcuLic5J10qCSAgICAJICAgIAkgICAgCSAgICAJICAgICA7IHZhbHVlIGluIGRlY2ltYWwKLQkgICAgaGV4IC0+ICcweCdbJzAnLi4nOScgfCAnYScuLidmJyB8ICdBJy4uJ0YnXSoJOyB2YWx1ZSBpbiBoZXhpZGVjaW1hbCAKLQotCi1FeGFtcGxlcwotPT09PT09PT0KLQotRXhhbXBsZSAxOgotCi1UaGUgdGFibGU6Ci0KLQkgICAgcDEgZHJlZyBkMSAxCSAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMSIgZm9yIENPUDEgaGFzIHZhbHVlIDEKLQkgICAgcDEgY3JlZyBjMyAzCSAgICAgOyBjdHJsIHJlZ2lzdGVyICJjMyIgZm9yIENPUDEgaGFzIHZhbHVlIDMKLQkgICAgcDMgZnVuYyBmaWxsIDB4MWY6MjQtMjAJICAgICAgOyBmdW5jdGlvbiAiZmlsbCIgZm9yIENPUDMgaGFzIHZhbHVlIDMxIGFuZCAKLQkgICAgCSAgICAJOyBubyBmaWVsZHMKLQotd2lsbCBhbGxvdyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdCB0aGUgZm9sbG93aW5nIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uczoKLQotCSAgICBMV0MxIGQxLDB4MTAwICgkMikKLQkgICAgZmlsbAotCi1IZXJlLCB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyICIkMiIsIGFuZCBpbnN0cnVjdGlvbiAiTFdDMSIsIGFyZSBzdGFuZGFyZCAKLW1uZW1vbmljcyBidWlsdC1pbiB0byB0aGUgTUlQUyBhc3NlbWJsZXIuICAKLQotCi1FeGFtcGxlIDI6Ci0KLVRoZSB0YWJsZToKLQotCSAgICBwMyBkcmVnIGQzIDMJICAgICA7IGRhdGEgcmVnaXN0ZXIgImQzIiBmb3IgQ09QMyBoYXMgdmFsdWUgMwotCSAgICBwMyBjcmVnIGMyIDIyCSAgICAgOyBjb250cm9sIHJlZ2lzdGVyICJjMiIgZm9yIENPUDMgaGFzIHZhbHVlIDIyCi0JICAgIHAzIGZ1bmMgZmVlIDB4MWY6MjQtMjAgZHJlZzoxNy0xMyBjcmVnOjEyLTggaW1tZWQ6Ny0wIAotCSAgICAJOyBmdW5jdGlvbiAiZmVlIiBmb3IgQ09QMyBoYXMgdmFsdWUgMzEsIGFuZCAzIGZpZWxkcyAKLQkgICAgCTsgY29uc2lzdGluZyBvZiBhIGRhdGEgcmVnaXN0ZXIsIGEgY29udHJvbCByZWdpc3RlciwgCi0JICAgIAk7IGFuZCBhbiBpbW1lZGlhdGUgdmFsdWUuCi0KLXdpbGwgYWxsb3cgdGhlIGFzc2VtYmxlciB0byBhY2NlcHQgdGhlIGZvbGxvd2luZyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbjoKLQotCSAgICBmZWUgZDMsYzIsMHgxCi0KLWFuZCB3aWxsIGVtaXQgdGhlIG9iamVjdCBjb2RlOgotCi0JICAgIDMxLTI2ICAyNSAyNC0yMCAxOS0xOCAgMTctMTMgMTItOCAgNy0wCi0JICAgIENPUHogICBDTyBmdW4JICAgIAkgICAgICBkcmVnICBjcmVnICBpbW1lZAotCSAgICAwMTAwMTEgMSAgMTExMTEgMDAJICAgICAwMDAxMSAxMDExMCAwMDAwMDAwMSAKLQotCSAgICAweDRmZjA3NjAxCi0KLQotRXhhbXBsZSAzOgotCi1UaGUgdGFibGU6Ci0KLQkgICAgcDMgZHJlZyBkMyAzCSAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKLQkgICAgcDMgY3JlZyBjMiAyMgkgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgotCSAgICBwMyBmdW5jIGZ1dSAweDAxZjAwMDAxIGRyZWc6MTctMTMgY3JlZzoxMi04Ci0KLXdpbGwgYWxsb3cgdGhlIGFzc2VtYmxlciB0byBhY2NlcHQgdGhlIGZvbGxvd2luZyBjb3Byb2Nlc3NvcgotaW5zdHJ1Y3Rpb246Ci0KLQkgICAgZnV1IGQzLGMyCi0KLWFuZCB3aWxsIGVtaXQgdGhlIG9iamVjdCBjb2RlOgotCi0JICAgIDMxLTI2ICAyNSAyNC0yMCAxOS0xOCAgMTctMTMgMTItOCAgNy0wCi0JICAgIENPUHogICBDTyBmdW4JICAgIAkgICAgICBkcmVnICBjcmVnICAKLQkgICAgMDEwMDExIDEgIDExMTExIDAwCSAgICAgMDAwMTEgMTAxMTAgMDAwMDAwMDEgCi0KLQkgICAgMHg0ZmYwNzYwMQotCi1JbiB0aGlzIHdheSwgdGhlIHByb2dyYW1tZXIgY2FuIGZvcmNlIGFyYml0cmFyeSBiaXRzIG9mIGFuIGluc3RydWN0aW9uCi10byBoYXZlIHByZWRlZmluZWQgdmFsdWVzLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQWRkaXRpb25hbCBub3RlczoKLQotRW5jb2Rpbmcgb2YgcmFuZ2VzOgotVG8gaGFuZGxlIG1vcmUgdGhhbiBvbmUgYml0IHBvc2l0aW9uIHJhbmdlIHdpdGhpbiBhbiBpbnN0cnVjdGlvbiwKLXVzZSAwcyB0byBtYXNrIG91dCB0aGUgcmFuZ2VzIHdoaWNoIGRvbid0IGFwcGx5LgotTWF5IGRlY2lkZSB0byBtb2RpZnkgdGhlIHN5bnRheCB0byBhbGxvdyBjb21tYXMgc2VwYXJhdGUgbXVsdGlwbGUgCi1yYW5nZXMgd2l0aGluIGFuIGluc3RydWN0aW9uIChyYW5nZScsJ3JhbmdlKS4KLQotQ2hhbmdlcyBpbiBncmFtbWFyOgotCVRoZSBudW1iZXIgb2YgcGFybXMgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uIGVudHJ5Ci13YXMgZGVsZXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBmb3JtYXQgc3VjaCB0aGF0IHdlIG5vdyBjb3VudCB0aGUgZmllbGRzLgotCi0tLS0tCi1GSVhNRSEgc2hvdWxkIHJlYWxseSBjaGFuZ2UgbGV4aWNhbCBhbmFseXplciAKLXRvIHJlY29nbml6ZSAnZHJlZycgZXRjLiBpbiBjb250ZXh0IHNlbnNhdGl2ZSB3YXkuCi1DdXJyZW50bHkgZnVuY3Rpb24gbmFtZXMgb3IgbW5lbW9uaWNzIG1heSBiZSBpbmNvcnJlY3RseSBwYXJzZWQgYXMga2V5d29yZHMKLQotRklYTUUhIGhleCBpcyBhbWJpZ3VvdXMgd2l0aCBhbnkgZGlnaXQKLQotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiaXRibC1vcHMuaCIKLQotLyogI2RlZmluZSBERUJVRyAqLwotCi0jaWZkZWYgREVCVUcKLSNpZm5kZWYgREJHX0xWTAotI2RlZmluZSBEQkdfTFZMIDEKLSNlbmRpZgotI2Vsc2UKLSNkZWZpbmUgREJHX0xWTCAwCi0jZW5kaWYKLQotI2lmIERCR19MVkwgPj0gMQotI2RlZmluZSBEQkcoeCkgcHJpbnRmIHgKLSNlbHNlCi0jZGVmaW5lIERCRyh4KSAKLSNlbmRpZgotCi0jaWYgREJHX0xWTCA+PSAyCi0jZGVmaW5lIERCR0wyKHgpIHByaW50ZiB4Ci0jZWxzZQotI2RlZmluZSBEQkdMMih4KSAKLSNlbmRpZgotCi1zdGF0aWMgaW50IHNiaXQsIGViaXQ7Ci1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKmluc249MDsKLWV4dGVybiBpbnQgaW5zbnRibF9saW5lOwotaW50IHl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgeXllcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotJX0KLQotJXVuaW9uIAotICB7Ci0gICAgY2hhciAqc3RyOwotICAgIGludCBudW07Ci0gICAgaW50IHByb2Nlc3NvcjsKLSAgICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgfQotCi0ldG9rZW4JICAgIERSRUcgQ1JFRyBHUkVHIElNTUVEIEFERFIgSU5TTiBOVU0gSUQgTkwgUE5VTQotJXR5cGUJICAgIDx2YWw+IHZhbHVlIGZsYWdzIGZsYWdleHByCi0ldHlwZQkgICAgPG51bT4gbnVtYmVyIE5VTSBmdHlwZSByZWd0eXBlIHBudW0gUE5VTQotJXR5cGUJICAgIDxzdHI+IElEIG5hbWUKLQotJXN0YXJ0IGluc250YmwKLQotJSUKLQotaW5zbnRibDoKLQllbnRyeXMKLQk7Ci0KLWVudHJ5czoKLQllbnRyeSBlbnRyeXMKLQl8Ci0JOwotCi1lbnRyeToKLQlwbnVtIHJlZ3R5cGUgbmFtZSB2YWx1ZSBOTAotCSAgewotCSAgICBEQkcgKCgibGluZSAlZDogZW50cnkgcG51bT0lZCB0eXBlPSVkIG5hbWU9JXMgdmFsdWU9eCV4XG4iLCAKLQkgICAgCSAgICBpbnNudGJsX2xpbmUsICQxLCAkMiwgJDMsICQ0KSk7Ci0JICAgIGl0YmxfYWRkX3JlZyAoJDEsICQyLCAkMywgJDQpOwotCSAgfQotCXwgcG51bSBJTlNOIG5hbWUgdmFsdWUgcmFuZ2UgZmxhZ3MKLQkgIHsKLQkgICAgREJHICgoImxpbmUgJWQ6IGVudHJ5IHBudW09JWQgdHlwZT1JTlNOIG5hbWU9JXMgdmFsdWU9eCV4IiwKLQkgICAgCSAgICBpbnNudGJsX2xpbmUsICQxLCAkMywgJDQpKTsKLQkgICAgREJHICgoIiBzYml0PSVkIGViaXQ9JWQgZmxhZ3M9MHgleFxuIiwgc2JpdCwgZWJpdCwgJDYpKTsKLQkgICAgaW5zbj1pdGJsX2FkZF9pbnNuICgkMSwgJDMsICQ0LCBzYml0LCBlYml0LCAkNik7Ci0JICB9Ci0JZmllbGRzcGVjcyBOTAotCXwgTkwKLQl8IGVycm9yIE5MCi0JOwotCi1maWVsZHNwZWNzOgotCScsJyBmaWVsZHNwZWMgZmllbGRzcGVjcwotCXwgZmllbGRzcGVjIGZpZWxkc3BlY3MKLQl8Ci0JOwotCi1mdHlwZToKLQlyZWd0eXBlIAotCSAgewotCSAgICBEQkdMMiAoKCJmdHlwZVxuIikpOwotCSAgICAkJCA9ICQxOwotCSAgfQotCXwgQUREUiAKLQkgIHsKLQkgICAgREJHTDIgKCgiYWRkclxuIikpOwotCSAgICAkJCA9IEFERFI7Ci0JICB9Ci0JfCBJTU1FRAotCSAgewotCSAgICBEQkdMMiAoKCJpbW1lZFxuIikpOwotCSAgICAkJCA9IElNTUVEOwotCSAgfQotCTsKLQotZmllbGRzcGVjOgotCWZ0eXBlIHJhbmdlIGZsYWdzCi0JICB7Ci0JICAgIERCRyAoKCJsaW5lICVkOiBmaWVsZCB0eXBlPSVkIHNiaXQ9JWQgZWJpdD0lZCwgZmxhZ3M9MHgleFxuIiwgCi0JICAgIAkgICAgaW5zbnRibF9saW5lLCAkMSwgc2JpdCwgZWJpdCwgJDMpKTsKLQkgICAgaXRibF9hZGRfb3BlcmFuZCAoaW5zbiwgJDEsIHNiaXQsIGViaXQsICQzKTsKLQkgIH0KLQk7Ci0KLWZsYWdleHByOgotCU5VTSAnfCcgZmxhZ2V4cHIKLQkgIHsKLQkgICAgJCQgPSAkMSB8ICQzOwotCSAgfQotCXwgJ1snIGZsYWdleHByICddJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCXwgTlVNCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi1mbGFnczoKLQknKicgZmxhZ2V4cHIKLQkgIHsKLQkgICAgREJHTDIgKCgiZmxhZ3M9JWRcbiIsICQyKSk7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JfCAKLQkgIHsKLQkgICAgJCQgPSAwOwotCSAgfQotCTsKLQotcmFuZ2U6Ci0JJzonIE5VTSAnLScgTlVNCi0JICB7Ci0JICAgIERCR0wyICgoInJhbmdlICVkICVkXG4iLCAkMiwgJDQpKTsKLQkgICAgc2JpdCA9ICQyOwotCSAgICBlYml0ID0gJDQ7Ci0JICB9Ci0JfAotCSAgewotCSAgICBzYml0ID0gMzE7Ci0JICAgIGViaXQgPSAwOwotCSAgfQotCTsKLQkgICAgCi1wbnVtOgotCVBOVU0KLQkgIHsKLQkgICAgREJHTDIgKCgicG51bT0lZFxuIiwkMSkpOwotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotcmVndHlwZToKLQkgICAgIERSRUcKLQkgIHsKLQkgICAgREJHTDIgKCgiZHJlZ1xuIikpOwotCSAgICAkJCA9IERSRUc7Ci0JICB9Ci0JfCBDUkVHCi0JICB7Ci0JICAgIERCR0wyICgoImNyZWdcbiIpKTsKLQkgICAgJCQgPSBDUkVHOwotCSAgfQotCXwgR1JFRwotCSAgewotCSAgICBEQkdMMiAoKCJncmVnXG4iKSk7Ci0JICAgICQkID0gR1JFRzsKLQkgIH0KLQk7Ci0KLW5hbWU6Ci0JSUQKLQkgIHsKLQkgICAgREJHTDIgKCgibmFtZT0lc1xuIiwkMSkpOwotCSAgICAkJCA9ICQxOyAKLQkgIH0KLQk7Ci0KLW51bWJlcjoKLQlOVU0KLQkgIHsKLQkgICAgREJHTDIgKCgibnVtPSVkXG4iLCQxKSk7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi12YWx1ZToKLQlOVU0KLQkgIHsKLQkgICAgREJHTDIgKCgidmFsPXgleFxuIiwkMSkpOwotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLSUlCi0KLXN0YXRpYyBpbnQKLXl5ZXJyb3IgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBwcmludGYgKCJsaW5lICVkOiAlc1xuIiwgaW5zbnRibF9saW5lLCBtc2cpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9saW5rLmNtZCBiL2dhcy9saW5rLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAzNWNhOC4uMDAwMDAwMAotLS0gYS9nYXMvbGluay5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1BTElHTj0xMDI0Ci1SRVNOVU0gMHgwMDAwLCAweDgwMDAKLTsgUHV0dGluZyBpbiAubGl0MSBnaXZlcyBlcnJvcnMuCi1PUkRFUiAuZGF0YT0weDgwMDAyMDAwLCAuZGF0YTEsIC5saXQsIC5ic3MKLTsgTGV0J3MgcHV0IHRoaXMgb24gdGhlIGNvbW1hbmQgbGluZSBzbyBpdCBnb2VzIGZpcnN0LCB3aGljaCBpcyB3aGF0Ci07IEdEQiBleHBlY3RzLgotOyBMT0FEIC9zMi9hbWQvMjlrL2xpYi9jcnQwLm8KLUxPQUQgL3MyL2FtZC8yOWsvbGliL2xpYnFjYjBoLmxpYgotTE9BRCAvczIvYW1kLzI5ay9saWIvbGlic2NiMGgubGliCi1MT0FEIC9zMi9hbWQvMjlrL2xpYi9saWJhY2IwaC5saWIKZGlmZiAtLWdpdCBhL2dhcy9saXN0aW5nLmMgYi9nYXMvbGlzdGluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWIwZGRlLi4wMDAwMDAwCi0tLSBhL2dhcy9saXN0aW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIwICswLDAgQEAKLS8qIGxpc3RpbmcuYyAtIG1haW50aW5nIGFzc2VtYmx5IGxpc3RpbmdzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKgotIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gCQlzYWNAY3lnbnVzLmNvbQotCi0KLSBBIGxpc3RpbmcgcGFnZSBsb29rcyBsaWtlOgotCi0gTElTVElOR19IRUFERVIgIHNvdXJjZWZpbGVuYW1lIHBhZ2VudW1iZXIKLSBUSVRMRSBMSU5FCi0gU1VCVElUTEUgTElORQotIGxpbmVudW1iZXIgYWRkcmVzcyBkYXRhICBzb3VyY2UKLSBsaW5lbnVtYmVyIGFkZHJlc3MgZGF0YSAgc291cmNlCi0gbGluZW51bWJlciBhZGRyZXNzIGRhdGEgIHNvdXJjZQotIGxpbmVudW1iZXIgYWRkcmVzcyBkYXRhICBzb3VyY2UKLQotIElmIG5vdCBvdmVycmlkZGVuLCB0aGUgbGlzdGluZyBjb21tYW5kcyBhcmU6Ci0KLSAudGl0bGUgICJzdHVmZiIKLSAJUHV0ICJzdHVmZiIgb250byB0aGUgdGl0bGUgbGluZQotIC5zYnR0bCAgInN0dWZmIgotICAgICAgICBQdXQgc3R1ZmYgb250byB0aGUgc3VidGl0bGUgbGluZQotCi0gIElmIHRoZXNlIGNvbW1hbmRzIGNvbWUgd2l0aGluIDEwIGxpbmVzIG9mIHRoZSB0b3Agb2YgdGhlIHBhZ2UsIHRoZXkKLSAgd2lsbCBhZmZlY3QgdGhlIHBhZ2UgdGhleSBhcmUgb24sIGFzIHdlbGwgYXMgYW55IHN1YnNlcXVlbnQgcGFnZQotCi0gLmVqZWN0Ci0gCVRob3cgYSBwYWdlCi0gLmxpc3QKLSAJSW5jcmVtZW50IHRoZSBlbmFibGUgbGlzdGluZyBjb3VudGVyCi0gLm5vbGlzdAotIAlEZWNyZW1lbnQgdGhlIGVuYWJsZSBsaXN0aW5nIGNvdW50ZXIKLQotIC5wc2l6ZSBZWyxYXQotIAlTZXQgdGhlIHBhcGVyIHNpemUgdG8gWCB3aWRlIGFuZCBZIGhpZ2guIFNldHRpbmcgYSBwc2l6ZSBZIG9mCi0JemVybyB3aWxsIHN1cHByZXNzIGZvcm0gZmVlZHMgZXhjZXB0IHdoZXJlIGRlbWFuZGVkIGJ5IC5lamVjdAotCi0gSWYgdGhlIGNvdW50ZXIgZ29lcyBiZWxvdyB6ZXJvLCBsaXN0aW5nIGlzIHN1cHByZXNzZWQuCi0KLQotIExpc3RpbmdzIGFyZSBhIG1haW50YWluZWQgYnkgcmVhZCBjYWxsaW5nIHZhcmlvdXMgbGlzdGluZ188Zm9vPgotIGZ1bmN0aW9ucy4gIFdoYXQgaGFwcGVucyBtb3N0IGlzIHRoYXQgdGhlIG1hY3JvIE5PX0xJU1RJTkcgaXMgbm90Ci0gZGVmaW5lZCAoZnJvbSB0aGUgTWFrZWZpbGUpLCB0aGVuIHRoZSBtYWNybyBMSVNUSU5HX05FV0xJTkUgZXhwYW5kcwotIGludG8gYSBjYWxsIHRvIGxpc3RpbmdfbmV3bGluZS4gIFRoZSBjYWxsIGlzIGRvbmUgZnJvbSByZWFkLmMsIGV2ZXJ5Ci0gdGltZSBpdCBzZWVzIGEgbmV3bGluZSwgYW5kIC1sIGlzIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLSBUaGUgZnVuY3Rpb24gbGlzdGluZ19uZXdsaW5lIHJlbWVtYmVycyB0aGUgZnJhZyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gbmV3bGluZSwgYW5kIGNyZWF0ZXMgYSBuZXcgZnJhZyAtIG5vdGUgdGhhdCB0aGlzIGlzIHdhc3RlZnVsLCBidXQgbm90Ci0gYSBiaWcgZGVhbCwgc2luY2UgbGlzdGluZyBzbG93cyB0aGluZ3MgZG93biBhIGxvdCBhbnl3YXkuICBUaGUKLSBmdW5jdGlvbiBhbHNvIHJlbWVtZWJlcnMgd2hlbiB0aGUgZmlsZW5hbWUgY2hhbmdlcy4KLQotIFdoZW4gYWxsIHRoZSBpbnB1dCBoYXMgZmluaXNoZWQsIGFuZCBnYXMgaGFzIGhhZCBhIGNoYW5jZSB0byBzZXR0bGUKLSBkb3duLCB0aGUgbGlzdGluZyBpcyBvdXRwdXQuIFRoaXMgaXMgZG9uZSBieSBydW5uaW5nIGRvd24gdGhlIGxpc3Qgb2YKLSBmcmFnL3NvdXJjZSBmaWxlIHJlY29yZHMsIGFuZCBvcGVuaW5nIHRoZSBmaWxlcyBhcyBuZWVkZWQgYW5kIHByaW50aW5nCi0gb3V0IHRoZSBieXRlcyBhbmQgY2hhcnMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCi0KLSBUaGUgb25seSB0aGluZ3Mgd2hpY2ggdGhlIGFyY2hpdGVjdHVyZSBjYW4gY2hhbmdlIGFib3V0IHRoZSBsaXN0aW5nCi0gYXJlIGRlZmluZWQgaW4gdGhlc2UgbWFjcm9zOgotCi0gTElTVElOR19IRUFERVIJCVRoZSBuYW1lIG9mIHRoZSBhcmNoaXRlY3R1cmUKLSBMSVNUSU5HX1dPUkRfU0laRSAgICAgIFRoZSBtYWtlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSB3b3JkLCB0aGlzIGRldGVybWluZXMKLSAJCQl0aGUgY2x1bXBpbmcgb2YgdGhlIG91dHB1dCBkYXRhLiBlZyBhIHZhbHVlIG9mCi0JCQkyIG1ha2VzIHdvcmRzIGxvb2sgbGlrZSAxMjM0IDU2NzgsIHdoaWxzdCAxCi0JCQl3b3VsZCBtYWtlIHRoZSBzYW1lIHZhbHVlIGxvb2sgbGlrZSAxMiAzNCA1NgotCQkJNzgKLSBMSVNUSU5HX0xIU19XSURUSCAgICAgIE51bWJlciBvZiB3b3JkcyBvZiBhYm92ZSBzaXplIGZvciB0aGUgbGhzCi0KLSBMSVNUSU5HX0xIU19XSURUSF9TRUNPTkQgICBOdW1iZXIgb2Ygd29yZHMgZm9yIHRoZSBkYXRhIG9uIHRoZSBsaHMKLSAJCQlmb3IgdGhlIHNlY29uZCBsaW5lCi0KLSBMSVNUSU5HX0xIU19DT05UX0xJTkVTCU1heCBudW1iZXIgb2YgbGluZXMgdG8gdXNlIHVwIGZvciBhIGNvbnRpbnV0YXRpb24KLSBMSVNUSU5HX1JIU19XSURUSCAgICAgIE51bWJlciBvZiBjaGFycyBmcm9tIHRoZSBpbnB1dCBmaWxlIHRvIHByaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbiBhIGxpbmUKLSovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlIDxvYnN0YWNrLmg+Ci0jaW5jbHVkZSAiaW5wdXQtZmlsZS5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0KLSNpZm5kZWYgTElTVElOR19IRUFERVIKLSNkZWZpbmUgTElTVElOR19IRUFERVIgIkdBUyBMSVNUSU5HIgotI2VuZGlmCi0jaWZuZGVmIExJU1RJTkdfV09SRF9TSVpFCi0jZGVmaW5lIExJU1RJTkdfV09SRF9TSVpFIDQKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX0xIU19XSURUSAotI2RlZmluZSBMSVNUSU5HX0xIU19XSURUSCAxCi0jZW5kaWYKLSNpZm5kZWYgTElTVElOR19MSFNfV0lEVEhfU0VDT05ECi0jZGVmaW5lIExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORCAxCi0jZW5kaWYKLSNpZm5kZWYgTElTVElOR19SSFNfV0lEVEgKLSNkZWZpbmUgTElTVElOR19SSFNfV0lEVEggMTAwCi0jZW5kaWYKLSNpZm5kZWYgTElTVElOR19MSFNfQ09OVF9MSU5FUwotI2RlZmluZSBMSVNUSU5HX0xIU19DT05UX0xJTkVTIDQKLSNlbmRpZgotCi0vKiBUaGlzIHN0cnVjdHVyZSByZW1lbWJlcnMgd2hpY2ggLnMgd2VyZSB1c2VkICovCi10eXBlZGVmIHN0cnVjdCBmaWxlX2luZm9fc3RydWN0Ci17Ci0gIHN0cnVjdCBmaWxlX2luZm9fc3RydWN0ICogbmV4dDsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTsKLSAgbG9uZyAgICAgICAgICAgICAgICAgICAgICBwb3M7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgbGluZW51bTsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICBhdF9lbmQ7Ci19Ci1maWxlX2luZm9fdHlwZTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgcmVtZW1lYnJzIHdoaWNoIGxpbmUgZnJvbSB3aGljaCBmaWxlIGdvZXMgaW50byB3aGljaAotICAgZnJhZyAqLwotc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QKLXsKLSAgLyogRnJhZyB3aGljaCB0aGlzIGxpbmUgb2Ygc291cmNlIGlzIG5lYXJlc3QgdG8gKi8KLSAgZnJhZ1MgKiBmcmFnOwotCi0gIC8qIFRoZSBhY3R1YWwgbGluZSBpbiB0aGUgc291cmNlIGZpbGUgKi8KLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIC8qIFBvaW50ZXIgdG8gdGhlIGZpbGUgaW5mbyBzdHJ1Y3QgZm9yIHRoZSBmaWxlIHdoaWNoIHRoaXMgbGluZQotICAgICBiZWxvbmdzIHRvICovCi0gIGZpbGVfaW5mb190eXBlICogZmlsZTsKLQotICAvKiBUaGUgZXhwYW5kZWQgdGV4dCBvZiBhbnkgbWFjcm8gdGhhdCBtYXkgaGF2ZSBiZWVuIGV4ZWN1dGluZy4gICovCi0gIGNoYXIgKiBsaW5lX2NvbnRlbnRzOwotCi0gIC8qIE5leHQgaW4gbGlzdCAqLwotICBzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqIG5leHQ7Ci0KLSAgLyogUG9pbnRlciB0byB0aGUgZmlsZSBpbmZvIHN0cnVjdCBmb3IgdGhlIGhpZ2ggbGV2ZWwgbGFuZ3VhZ2UKLSAgICAgc291cmNlIGxpbmUgdGhhdCBiZWxvbmdzIGhlcmUgKi8KLSAgZmlsZV9pbmZvX3R5cGUgKiBobGxfZmlsZTsKLSAgLyogSGlnaCBsZXZlbCBsYW5ndWFnZSBzb3VyY2UgbGluZSAqLwotICB1bnNpZ25lZCBpbnQgaGxsX2xpbmU7Ci0KLSAgLyogUG9pbnRlciB0byBhbnkgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaW5lICovCi0gIGNoYXIgKiBtZXNzYWdlOwotCi0gIGVudW0KLSAgICB7Ci0gICAgICBFRElDVF9OT05FLAotICAgICAgRURJQ1RfU0JUVEwsCi0gICAgICBFRElDVF9USVRMRSwKLSAgICAgIEVESUNUX05PTElTVCwKLSAgICAgIEVESUNUX0xJU1QsCi0gICAgICBFRElDVF9OT0xJU1RfTkVYVCwKLSAgICAgIEVESUNUX0VKRUNUCi0gICAgfSBlZGljdDsKLSAgY2hhciAqIGVkaWN0X2FyZzsKLQotICAvKiBOb256ZXJvIGlmIHRoaXMgbGluZSBpcyB0byBiZSBvbWl0dGVkIGJlY2F1c2UgaXQgY29udGFpbnMKLSAgICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBjYW4gYmVjb21lIGEgZmxhZ3MgZmllbGQgaWYgd2UgY29tZQotICAgICB1cCB3aXRoIG1vcmUgaW5mb3JtYXRpb24gdG8gc3RvcmUgaGVyZS4gICovCi0gIGludCBkZWJ1Z2dpbmc7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0IGxpc3RfaW5mb190eXBlOwotCi0KLWludCBsaXN0aW5nX2xoc193aWR0aCAgICAgICAgPSBMSVNUSU5HX0xIU19XSURUSDsKLWludCBsaXN0aW5nX2xoc193aWR0aF9zZWNvbmQgPSBMSVNUSU5HX0xIU19XSURUSF9TRUNPTkQ7Ci1pbnQgbGlzdGluZ19saHNfY29udF9saW5lcyAgID0gTElTVElOR19MSFNfQ09OVF9MSU5FUzsKLWludCBsaXN0aW5nX3Joc193aWR0aCAgICAgICAgPSBMSVNUSU5HX1JIU19XSURUSDsKLQotc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgKiAgICAgICAgbGlzdGluZ190YWlsOwotCi1zdGF0aWMgZmlsZV9pbmZvX3R5cGUgKiAgICAgICAgICBmaWxlX2luZm9faGVhZDsKLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqICAgICAgICAgIGxhc3Rfb3Blbl9maWxlX2luZm87Ci1zdGF0aWMgRklMRSAqICAgICAgICAgICAgICAgICAgICBsYXN0X29wZW5fZmlsZTsKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqIGhlYWQ7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgICAgICAgICBwYXBlcl93aWR0aCA9IDIwMDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgICAgICAgIHBhcGVyX2hlaWdodCA9IDYwOwotCi1leHRlcm4gaW50ICAgICAgICAgICAgICAgICAgICAgICBsaXN0aW5nOwotCi0vKiBGaWxlIHRvIG91dHB1dCBsaXN0aW5ncyB0by4gICovCi1zdGF0aWMgRklMRSAqIGxpc3RfZmlsZTsKLQotLyogVGhpcyBzdGF0aWMgYXJyYXkgaXMgdXNlZCB0byBrZWVwIHRoZSB0ZXh0IG9mIGRhdGEgdG8gYmUgcHJpbnRlZAotICAgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgbGluZS4gICovCi0KLSNkZWZpbmUgTUFYX0JZVEVTCQkJCQkJCVwKLSAgKCgoTElTVElOR19XT1JEX1NJWkUgKiAyKSArIDEpICogbGlzdGluZ19saHNfd2lkdGgJCQlcCi0gICArICgoKChMSVNUSU5HX1dPUkRfU0laRSAqIDIpICsgMSkgKiBsaXN0aW5nX2xoc193aWR0aF9zZWNvbmQpCVwKLSAgICAgICogbGlzdGluZ19saHNfY29udF9saW5lcykJCQkJCQlcCi0gICArIDIwKQotCi1zdGF0aWMgY2hhciAqIGRhdGFfYnVmZmVyOwotCi0vKiBQcm90b3R5cGVzLiAgKi8KLXN0YXRpYyB2b2lkIGxpc3RpbmdfbWVzc2FnZSBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICptZXNzYWdlKSk7Ci1zdGF0aWMgZmlsZV9pbmZvX3R5cGUgKiBmaWxlX2luZm8gUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZV9uYW1lKSk7Ci1zdGF0aWMgdm9pZCBuZXdfZnJhZyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqIGJ1ZmZlcl9saW5lIFBBUkFNUyAoKGZpbGVfaW5mb190eXBlICpmaWxlLAotCQkJCSAgY2hhciAqbGluZSwgdW5zaWduZWQgaW50IHNpemUpKTsKLXN0YXRpYyB2b2lkIGxpc3RpbmdfcGFnZSBQQVJBTVMgKChsaXN0X2luZm9fdHlwZSAqbGlzdCkpOwotc3RhdGljIHVuc2lnbmVkIGludCBjYWxjX2hleCBQQVJBTVMgKChsaXN0X2luZm9fdHlwZSAqbGlzdCkpOwotc3RhdGljIHZvaWQgcHJpbnRfbGluZXMgUEFSQU1TICgobGlzdF9pbmZvX3R5cGUgKiwgdW5zaWduZWQgaW50LAotCQkJCSBjaGFyICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgbGlzdF9zeW1ib2xfdGFibGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgcHJpbnRfc291cmNlIFBBUkFNUyAoKGZpbGVfaW5mb190eXBlICpjdXJyZW50X2ZpbGUsCi0JCQkJICBsaXN0X2luZm9fdHlwZSAqbGlzdCwKLQkJCQkgIGNoYXIgKmJ1ZmZlciwKLQkJCQkgIHVuc2lnbmVkIGludCB3aWR0aCkpOwotc3RhdGljIGludCBkZWJ1Z2dpbmdfcHNldWRvIFBBUkFNUyAoKGxpc3RfaW5mb190eXBlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgbGlzdGluZ19saXN0aW5nIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKLQotCi1zdGF0aWMgdm9pZAotbGlzdGluZ19tZXNzYWdlIChuYW1lLCBtZXNzYWdlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICptZXNzYWdlOwotewotICB1bnNpZ25lZCBpbnQgbCA9IHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKG1lc3NhZ2UpICsgMTsKLSAgY2hhciAqbiA9IChjaGFyICopIHhtYWxsb2MgKGwpOwotICBzdHJjcHkgKG4sIG5hbWUpOwotICBzdHJjYXQgKG4sIG1lc3NhZ2UpOwotICBpZiAobGlzdGluZ190YWlsICE9IChsaXN0X2luZm9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGxpc3RpbmdfdGFpbC0+bWVzc2FnZSA9IG47Ci0gICAgfQotfQotCi12b2lkCi1saXN0aW5nX3dhcm5pbmcgKG1lc3NhZ2UpCi0gICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGxpc3RpbmdfbWVzc2FnZSAoXygiV2FybmluZzoiKSwgbWVzc2FnZSk7Ci19Ci0KLXZvaWQKLWxpc3RpbmdfZXJyb3IgKG1lc3NhZ2UpCi0gICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGxpc3RpbmdfbWVzc2FnZSAoXygiRXJyb3I6IiksIG1lc3NhZ2UpOwotfQotCi1zdGF0aWMgZmlsZV9pbmZvX3R5cGUgKgotZmlsZV9pbmZvIChmaWxlX25hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZTsKLXsKLSAgLyogRmluZCBhbiBlbnRyeSB3aXRoIHRoaXMgZmlsZSBuYW1lICovCi0gIGZpbGVfaW5mb190eXBlICpwID0gZmlsZV9pbmZvX2hlYWQ7Ci0KLSAgd2hpbGUgKHAgIT0gKGZpbGVfaW5mb190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocC0+ZmlsZW5hbWUsIGZpbGVfbmFtZSkgPT0gMCkKLQlyZXR1cm4gcDsKLSAgICAgIHAgPSBwLT5uZXh0OwotICAgIH0KLQotICAvKiBNYWtlIG5ldyBlbnRyeSAqLwotCi0gIHAgPSAoZmlsZV9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChmaWxlX2luZm9fdHlwZSkpOwotICBwLT5uZXh0ID0gZmlsZV9pbmZvX2hlYWQ7Ci0gIGZpbGVfaW5mb19oZWFkID0gcDsKLSAgcC0+ZmlsZW5hbWUgPSB4bWFsbG9jICgodW5zaWduZWQgbG9uZykgc3RybGVuIChmaWxlX25hbWUpICsgMSk7Ci0gIHN0cmNweSAocC0+ZmlsZW5hbWUsIGZpbGVfbmFtZSk7Ci0gIHAtPnBvcyA9IDA7Ci0gIHAtPmxpbmVudW0gPSAwOwotICBwLT5hdF9lbmQgPSAwOwotCi0gIHJldHVybiBwOwotfQotCi0KLXN0YXRpYyB2b2lkCi1uZXdfZnJhZyAoKQotewotCi0gIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICBmcmFnX25ldyAoMCk7Ci0KLX0KLQotdm9pZAotbGlzdGluZ19uZXdsaW5lIChwcykKLSAgICAgY2hhciAqcHM7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICBzdGF0aWMgdW5zaWduZWQgaW50IGxhc3RfbGluZSA9IDB4ZmZmZjsKLSAgc3RhdGljIGNoYXIgKmxhc3RfZmlsZSA9IE5VTEw7Ci0gIGxpc3RfaW5mb190eXBlICpuZXcgPSBOVUxMOwotCi0gIGlmIChsaXN0aW5nID09IDApCi0gICAgcmV0dXJuOwotCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgcmV0dXJuOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBJbiBFTEYsIGFueXRoaW5nIGluIGEgc2VjdGlvbiBiZWdpbm5pbmcgd2l0aCAuZGVidWcgb3IgLmxpbmUgaXMKLSAgICAgY29uc2lkZXJlZCB0byBiZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGluY2x1ZGVzIHRoZQotICAgICBzdGF0ZW1lbnQgd2hpY2ggc3dpdGNoZXMgdXMgaW50byB0aGUgZGVidWdnaW5nIHNlY3Rpb24sIHdoaWNoIHdlCi0gICAgIGNhbiBvbmx5IHNldCBhZnRlciB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgZGVidWdnaW5nIHNlY3Rpb24uICAqLwotICBpZiAoKGxpc3RpbmcgJiBMSVNUSU5HX05PREVCVUcpICE9IDAKLSAgICAgICYmIGxpc3RpbmdfdGFpbCAhPSBOVUxMCi0gICAgICAmJiAhIGxpc3RpbmdfdGFpbC0+ZGVidWdnaW5nKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0KLSAgICAgIHNlZ25hbWUgPSBzZWdtZW50X25hbWUgKG5vd19zZWcpOwotICAgICAgaWYgKHN0cm5jbXAgKHNlZ25hbWUsICIuZGVidWciLCBzaXplb2YgIi5kZWJ1ZyIgLSAxKSA9PSAwCi0JICB8fCBzdHJuY21wIChzZWduYW1lLCAiLmxpbmUiLCBzaXplb2YgIi5saW5lIiAtIDEpID09IDApCi0JbGlzdGluZ190YWlsLT5kZWJ1Z2dpbmcgPSAxOwotICAgIH0KLSNlbmRpZgotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotICBpZiAocHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobGluZSA9PSBsYXN0X2xpbmUgJiYgIShsYXN0X2ZpbGUgJiYgZmlsZSAmJiBzdHJjbXAgKGZpbGUsIGxhc3RfZmlsZSkpKQotCXJldHVybjsKLQotICAgICAgbmV3ID0gKGxpc3RfaW5mb190eXBlICopIHhtYWxsb2MgKHNpemVvZiAobGlzdF9pbmZvX3R5cGUpKTsKLQotICAgICAgLyogRGV0ZWN0IGlmIHdlIGFyZSByZWFkaW5nIGZyb20gc3RkaW4gYnkgZXhhbWluaW5nIHRoZSBmaWxlCi0JIG5hbWUgcmV0dXJuZWQgYnkgYXNfd2hlcmUoKS4KLQotCSBbRklYTUU6IFdlIHJlbHkgdXBvbiB0aGUgbmFtZSBpbiB0aGUgc3RyY21wIGJlbG93IGJlaW5nIHRoZQotCSBzYW1lIGFzIHRoZSBvbmUgdXNlZCBieSBpbnB1dF9zY3J1Yl9uZXdfZmlsZSgpLCBpZiB0aGF0IGlzCi0JIG5vdCB0cnVlLCB0aGVuIHRoaXMgY29kZSB3aWxsIGZhaWxdLgotCi0JIElmIHdlIGFyZSByZWFkaW5nIGZyb20gc3RkaW4sIHRoZW4gd2UgbmVlZCB0byBzYXZlIGVhY2ggaW5wdXQgbGluZQotCSBoZXJlIChhc3N1bWluZyBvZiBjb3Vyc2UgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIGEgbGluZSBvZiBpbnB1dCB0byByZWFkKSwKLQkgc28gdGhhdCBpdCBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0aW5nIHRoYXQgaXMgcHJvZHVjZWQgYXQgdGhlIGVuZAotCSBvZiB0aGUgYXNzZW1ibHkuICAqLwotICAgICAgaWYgKHN0cmNtcCAoZmlsZSwgXygie3N0YW5kYXJkIGlucHV0fSIpKSA9PSAwCi0JICAmJiBpbnB1dF9saW5lX3BvaW50ZXIgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICogY29weTsKLQkgIGludCBsZW47Ci0JICBpbnQgc2Vlbl9xdW90ZSA9IDA7Ci0KLQkgIGZvciAoY29weSA9IGlucHV0X2xpbmVfcG9pbnRlciAtIDE7Ci0JICAgICAgICogY29weSAmJiAoc2Vlbl9xdW90ZQotCQkJICB8fCAoISBpc19lbmRfb2ZfbGluZSBbKHVuc2lnbmVkIGNoYXIpICogY29weV0pKTsKLQkgICAgICAgY29weSArKykKLQkgICAgaWYgKCogY29weSA9PSAnIicgJiYgY29weVstMV0gIT0gJ1xcJykKLQkgICAgICBzZWVuX3F1b3RlID0gISBzZWVuX3F1b3RlOwotCi0JICBsZW4gPSAoY29weSAtIGlucHV0X2xpbmVfcG9pbnRlcikgKyAyOwotCi0JICBjb3B5ID0geG1hbGxvYyAobGVuKTsKLQotCSAgaWYgKGNvcHkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNoYXIgKiBzcmMgPSBpbnB1dF9saW5lX3BvaW50ZXIgLSAxOwotCSAgICAgIGNoYXIgKiBkZXN0ID0gY29weTsKLQkgICAgICAKLQkgICAgICB3aGlsZSAoLS1sZW4pCi0JCXsKLQkJICB1bnNpZ25lZCBjaGFyIGMgPSAqIHNyYyArKzsKLQotCQkgIC8qIE9taXQgY29udHJvbCBjaGFyYWN0ZXJzIGluIHRoZSBsaXN0aW5nLiAgKi8KLQkJICBpZiAoaXNhc2NpaSAoYykgJiYgISBpc2NudHJsIChjKSkKLQkJICAgICogZGVzdCArKyA9IGM7Ci0JCX0KLQkgICAgICAKLQkgICAgICAqZGVzdCA9IDA7Ci0JICAgIH0KLQkgIAotCSAgbmV3LT5saW5lX2NvbnRlbnRzID0gY29weTsKLQl9Ci0gICAgICBlbHNlCi0JbmV3LT5saW5lX2NvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXcgPSAobGlzdF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChsaXN0X2luZm9fdHlwZSkpOwotICAgICAgbmV3LT5saW5lX2NvbnRlbnRzID0gcHM7Ci0gICAgfQotCi0gIGxhc3RfbGluZSA9IGxpbmU7Ci0gIGxhc3RfZmlsZSA9IGZpbGU7Ci0gIAotICBuZXdfZnJhZyAoKTsKLQotICBpZiAobGlzdGluZ190YWlsKQotICAgIGxpc3RpbmdfdGFpbC0+bmV4dCA9IG5ldzsKLSAgZWxzZQotICAgIGhlYWQgPSBuZXc7Ci0gIAotICBsaXN0aW5nX3RhaWwgPSBuZXc7Ci0KLSAgbmV3LT5mcmFnID0gZnJhZ19ub3c7Ci0gIG5ldy0+bGluZSA9IGxpbmU7Ci0gIG5ldy0+ZmlsZSA9IGZpbGVfaW5mbyAoZmlsZSk7Ci0gIG5ldy0+bmV4dCA9IChsaXN0X2luZm9fdHlwZSAqKSBOVUxMOwotICBuZXctPm1lc3NhZ2UgPSAoY2hhciAqKSBOVUxMOwotICBuZXctPmVkaWN0ID0gRURJQ1RfTk9ORTsKLSAgbmV3LT5obGxfZmlsZSA9IChmaWxlX2luZm9fdHlwZSAqKSBOVUxMOwotICBuZXctPmhsbF9saW5lID0gMDsKLSAgbmV3LT5kZWJ1Z2dpbmcgPSAwOwotICAKLSAgbmV3X2ZyYWcgKCk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIEluIEVMRiwgYW55dGhpbmcgaW4gYSBzZWN0aW9uIGJlZ2lubmluZyB3aXRoIC5kZWJ1ZyBvciAubGluZSBpcwotICAgICBjb25zaWRlcmVkIHRvIGJlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmICgobGlzdGluZyAmIExJU1RJTkdfTk9ERUJVRykgIT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotCi0gICAgICBzZWduYW1lID0gc2VnbWVudF9uYW1lIChub3dfc2VnKTsKLSAgICAgIGlmIChzdHJuY21wIChzZWduYW1lLCAiLmRlYnVnIiwgc2l6ZW9mICIuZGVidWciIC0gMSkgPT0gMAotCSAgfHwgc3RybmNtcCAoc2VnbmFtZSwgIi5saW5lIiwgc2l6ZW9mICIubGluZSIgLSAxKSA9PSAwKQotCW5ldy0+ZGVidWdnaW5nID0gMTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotLyogQXR0YWNoIGFsbCBjdXJyZW50IGZyYWdzIHRvIHRoZSBwcmV2aW91cyBsaW5lIGluc3RlYWQgb2YgdGhlCi0gICBjdXJyZW50IGxpbmUuICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgTUlQUyBiYWNrZW5kIHdoZW4gaXQgZGlzY292ZXJzCi0gICB0aGF0IGl0IG5lZWRzIHRvIGFkZCBzb21lIE5PUCBpbnN0cnVjdGlvbnM7IHRoZSBhZGRlZCBOT1AKLSAgIGluc3RydWN0aW9ucyBzaG91bGQgZ28gd2l0aCB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBoYXMgdGhlIGRlbGF5LCBub3QKLSAgIHdpdGggdGhlIG5ldyBpbnN0cnVjdGlvbi4gICovCi0KLXZvaWQKLWxpc3RpbmdfcHJldl9saW5lICgpCi17Ci0gIGxpc3RfaW5mb190eXBlICpsOwotICBmcmFnUyAqZjsKLQotICBpZiAoaGVhZCA9PSAobGlzdF9pbmZvX3R5cGUgKikgTlVMTAotICAgICAgfHwgaGVhZCA9PSBsaXN0aW5nX3RhaWwpCi0gICAgcmV0dXJuOwotCi0gIG5ld19mcmFnICgpOwotCi0gIGZvciAobCA9IGhlYWQ7IGwtPm5leHQgIT0gbGlzdGluZ190YWlsOyBsID0gbC0+bmV4dCkKLSAgICA7Ci0KLSAgZm9yIChmID0gZnJjaGFpbl9ub3ctPmZyY2hfcm9vdDsgZiAhPSAoZnJhZ1MgKikgTlVMTDsgZiA9IGYtPmZyX25leHQpCi0gICAgaWYgKGYtPmxpbmUgPT0gbGlzdGluZ190YWlsKQotICAgICAgZi0+bGluZSA9IGw7Ci0KLSAgbGlzdGluZ190YWlsLT5mcmFnID0gZnJhZ19ub3c7Ci0gIG5ld19mcmFnICgpOwotfQotCi0vKgotIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmV4dCBzb3VyY2UgbGluZSBmcm9tIHRoZSBmaWxlIHN1cHBsaWVkLAotIHRydW5jYXRlZCB0byBzaXplLiAgSXQgYXBwZW5kcyBhIGZha2UgbGluZSB0byB0aGUgZW5kIG9mIGVhY2ggaW5wdXQKLSBmaWxlIHRvIG1ha2UKLSovCi0KLXN0YXRpYyBjaGFyICoKLWJ1ZmZlcl9saW5lIChmaWxlLCBsaW5lLCBzaXplKQotICAgICBmaWxlX2luZm9fdHlwZSAqIGZpbGU7Ci0gICAgIGNoYXIgKmxpbmU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICB1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotICBpbnQgYzsKLQotICBjaGFyICpwID0gbGluZTsKLQotICAvKiBJZiB3ZSBjb3VsZG4ndCBvcGVuIHRoZSBmaWxlLCByZXR1cm4gYW4gZW1wdHkgbGluZSAqLwotICBpZiAoZmlsZS0+YXRfZW5kKQotICAgIHJldHVybiAiIjsKLQotICAvKiBDaGVjayB0aGUgY2FjaGUgYW5kIHNlZSBpZiB3ZSBsYXN0IHVzZWQgdGhpcyBmaWxlLiAgKi8KLSAgaWYgKCFsYXN0X29wZW5fZmlsZV9pbmZvIHx8IGZpbGUgIT0gbGFzdF9vcGVuX2ZpbGVfaW5mbykKLSAgICB7Ci0gICAgICBpZiAobGFzdF9vcGVuX2ZpbGUpCi0JewotCSAgbGFzdF9vcGVuX2ZpbGVfaW5mby0+cG9zID0gZnRlbGwgKGxhc3Rfb3Blbl9maWxlKTsKLQkgIGZjbG9zZSAobGFzdF9vcGVuX2ZpbGUpOwotCX0KLQotICAgICAgbGFzdF9vcGVuX2ZpbGVfaW5mbyA9IGZpbGU7Ci0gICAgICBsYXN0X29wZW5fZmlsZSA9IGZvcGVuIChmaWxlLT5maWxlbmFtZSwgInIiKTsKLSAgICAgIGlmIChsYXN0X29wZW5fZmlsZSA9PSBOVUxMKQotCXsKLQkgIGZpbGUtPmF0X2VuZCA9IDE7Ci0JICByZXR1cm4gIiI7Ci0JfQotICAgICAgCi0gICAgICAvKiBTZWVrIHRvIHdoZXJlIHdlIHdlcmUgbGFzdCB0aW1lIHRoaXMgZmlsZSB3YXMgb3Blbi4gICovCi0gICAgICBpZiAoZmlsZS0+cG9zKQotCWZzZWVrKGxhc3Rfb3Blbl9maWxlLCBmaWxlLT5wb3MsIFNFRUtfU0VUKTsKLSAgICB9Ci0KLSAgYyA9IGZnZXRjIChsYXN0X29wZW5fZmlsZSk7Ci0KLSAgc2l6ZSAtPSAxOwkJCS8qIGxlYXZlIHJvb20gZm9yIG51bGwgKi8KLQotICB3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQotICAgIHsKLSAgICAgIGlmIChjb3VudCA8IHNpemUpCi0JKnArKyA9IGM7Ci0gICAgICBjb3VudCsrOwotCi0gICAgICBjID0gZmdldGMgKGxhc3Rfb3Blbl9maWxlKTsKLQotICAgIH0KLSAgaWYgKGMgPT0gRU9GKQotICAgIHsKLSAgICAgIGZpbGUtPmF0X2VuZCA9IDE7Ci0gICAgICAqcCsrID0gJy4nOwotICAgICAgKnArKyA9ICcuJzsKLSAgICAgICpwKysgPSAnLic7Ci0gICAgfQotICBmaWxlLT5saW5lbnVtKys7Ci0gICpwKysgPSAwOwotICByZXR1cm4gbGluZTsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqZm47Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZWplY3Q7CS8qIEVqZWN0IHBlbmRpbmcgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFnZTsJLyogQ3VycmVudCBwYWdlIG51bWJlciAqLwotc3RhdGljIGNoYXIgKnRpdGxlOwkJLyogY3VycmVudCB0aXRsZSAqLwotc3RhdGljIGNoYXIgKnN1YnRpdGxlOwkJLyogY3VycmVudCBzdWJ0aXRsZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBvbl9wYWdlOwkvKiBudW1iZXIgb2YgbGluZXMgcHJpbnRlZCBvbiBjdXJyZW50IHBhZ2UgKi8KLQotCi1zdGF0aWMgdm9pZAotbGlzdGluZ19wYWdlIChsaXN0KQotICAgICBsaXN0X2luZm9fdHlwZSAqbGlzdDsKLXsKLSAgLyogR3JvcGUgYXJvdW5kLCBzZWUgaWYgd2UgY2FuIHNlZSBhIHRpdGxlIG9yIHN1YnRpdGxlIGVkaWN0IGNvbWluZyB1cAotICAgICBzb29uICAod2UgbG9vayBkb3duIDEwIGxpbmVzIG9mIHRoZSBwYWdlIGFuZCBzZWUgaWYgaXQncyB0aGVyZSkqLwotICBpZiAoKGVqZWN0IHx8IChvbl9wYWdlID49ICh1bnNpZ25lZCBpbnQpIHBhcGVyX2hlaWdodCkpICYmIHBhcGVyX2hlaWdodCAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjID0gMTA7Ci0gICAgICBpbnQgaGFkX3RpdGxlID0gMDsKLSAgICAgIGludCBoYWRfc3VidGl0bGUgPSAwOwotCi0gICAgICBwYWdlKys7Ci0KLSAgICAgIHdoaWxlIChjICE9IDAgJiYgbGlzdCkKLQl7Ci0JICBpZiAobGlzdC0+ZWRpY3QgPT0gRURJQ1RfU0JUVEwgJiYgIWhhZF9zdWJ0aXRsZSkKLQkgICAgewotCSAgICAgIGhhZF9zdWJ0aXRsZSA9IDE7Ci0JICAgICAgc3VidGl0bGUgPSBsaXN0LT5lZGljdF9hcmc7Ci0JICAgIH0KLQkgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9USVRMRSAmJiAhaGFkX3RpdGxlKQotCSAgICB7Ci0JICAgICAgaGFkX3RpdGxlID0gMTsKLQkgICAgICB0aXRsZSA9IGxpc3QtPmVkaWN0X2FyZzsKLQkgICAgfQotCSAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0JICBjLS07Ci0JfQotCi0KLSAgICAgIGlmIChwYWdlID4gMSkKLQl7Ci0JICBmcHJpbnRmIChsaXN0X2ZpbGUsICJcZiIpOwotCX0KLQotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJXMgJXMgXHRcdFx0cGFnZSAlZFxuIiwgTElTVElOR19IRUFERVIsIGZuLCBwYWdlKTsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVzXG4iLCB0aXRsZSk7Ci0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlc1xuIiwgc3VidGl0bGUpOwotICAgICAgb25fcGFnZSA9IDM7Ci0gICAgICBlamVjdCA9IDA7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNhbGNfaGV4IChsaXN0KQotICAgICBsaXN0X2luZm9fdHlwZSAqIGxpc3Q7Ci17Ci0gIGludCBkYXRhX2J1ZmZlcl9zaXplOwotICBsaXN0X2luZm9fdHlwZSAqZmlyc3QgPSBsaXN0OwotICB1bnNpZ25lZCBpbnQgYWRkcmVzcyA9IH4gKHVuc2lnbmVkIGludCkgMDsKLSAgZnJhZ1MgKmZyYWc7Ci0gIGZyYWdTICpmcmFnX3B0cjsKLSAgdW5zaWduZWQgaW50IGJ5dGVfaW5fZnJhZzsKLQotICAvKiBGaW5kIGZpcnN0IGZyYWcgd2hpY2ggc2F5cyBpdCBiZWxvbmdzIHRvIHRoaXMgbGluZSAqLwotICBmcmFnID0gbGlzdC0+ZnJhZzsKLSAgd2hpbGUgKGZyYWcgJiYgZnJhZy0+bGluZSAhPSBsaXN0KQotICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotCi0gIGZyYWdfcHRyID0gZnJhZzsKLQotICBkYXRhX2J1ZmZlcl9zaXplID0gMDsKLQotICAvKiBEdW1wIGFsbCB0aGUgZnJhZ3Mgd2hpY2ggYmVsb25nIHRvIHRoaXMgbGluZSAqLwotICB3aGlsZSAoZnJhZ19wdHIgIT0gKGZyYWdTICopIE5VTEwgJiYgZnJhZ19wdHItPmxpbmUgPT0gZmlyc3QpCi0gICAgewotICAgICAgLyogUHJpbnQgYXMgbWFueSBieXRlcyBmcm9tIHRoZSBmaXhlZCBwYXJ0IGFzIGlzIHNlbnNpYmxlICovCi0gICAgICBieXRlX2luX2ZyYWcgPSAwOwotICAgICAgd2hpbGUgKChvZmZzZXRUKSBieXRlX2luX2ZyYWcgPCBmcmFnX3B0ci0+ZnJfZml4Ci0JICAgICAmJiBkYXRhX2J1ZmZlcl9zaXplIDwgTUFYX0JZVEVTIC0gMykKLQl7Ci0JICBpZiAoYWRkcmVzcyA9PSB+ICh1bnNpZ25lZCBpbnQpIDApCi0JICAgIHsKLQkgICAgICBhZGRyZXNzID0gZnJhZ19wdHItPmZyX2FkZHJlc3M7Ci0JICAgIH0KLQotCSAgc3ByaW50ZiAoZGF0YV9idWZmZXIgKyBkYXRhX2J1ZmZlcl9zaXplLAotCQkgICAiJTAyWCIsCi0JCSAgIChmcmFnX3B0ci0+ZnJfbGl0ZXJhbFtieXRlX2luX2ZyYWddKSAmIDB4ZmYpOwotCSAgZGF0YV9idWZmZXJfc2l6ZSArPSAyOwotCSAgYnl0ZV9pbl9mcmFnKys7Ci0JfQotICAgICAgewotCXVuc2lnbmVkIGludCB2YXJfcmVwX21heCA9IGJ5dGVfaW5fZnJhZzsKLQl1bnNpZ25lZCBpbnQgdmFyX3JlcF9pZHggPSBieXRlX2luX2ZyYWc7Ci0KLQkvKiBQcmludCBhcyBtYW55IGJ5dGVzIGZyb20gdGhlIHZhcmlhYmxlIHBhcnQgYXMgaXMgc2Vuc2libGUgKi8KLQl3aGlsZSAoKChvZmZzZXRUKSBieXRlX2luX2ZyYWcKLQkJPCBmcmFnX3B0ci0+ZnJfZml4ICsgZnJhZ19wdHItPmZyX3ZhciAqIGZyYWdfcHRyLT5mcl9vZmZzZXQpCi0JICAgICAgICYmIGRhdGFfYnVmZmVyX3NpemUgPCBNQVhfQllURVMgLSAzKQotCSAgewotCSAgICBpZiAoYWRkcmVzcyA9PSB+ICh1bnNpZ25lZCBpbnQpIDApCi0JICAgICAgewotCQlhZGRyZXNzID0gZnJhZ19wdHItPmZyX2FkZHJlc3M7Ci0JICAgICAgfQotCSAgICBzcHJpbnRmIChkYXRhX2J1ZmZlciArIGRhdGFfYnVmZmVyX3NpemUsCi0JCSAgICAgIiUwMlgiLAotCQkgICAgIChmcmFnX3B0ci0+ZnJfbGl0ZXJhbFt2YXJfcmVwX2lkeF0pICYgMHhmZik7Ci0jaWYgMAotCSAgICBkYXRhX2J1ZmZlcltkYXRhX2J1ZmZlcl9zaXplKytdID0gJyonOwotCSAgICBkYXRhX2J1ZmZlcltkYXRhX2J1ZmZlcl9zaXplKytdID0gJyonOwotI2VuZGlmCi0JICAgIGRhdGFfYnVmZmVyX3NpemUgKz0gMjsKLQotCSAgICB2YXJfcmVwX2lkeCsrOwotCSAgICBieXRlX2luX2ZyYWcrKzsKLQotCSAgICBpZiAoKG9mZnNldFQpIHZhcl9yZXBfaWR4ID49IGZyYWdfcHRyLT5mcl9maXggKyBmcmFnX3B0ci0+ZnJfdmFyKQotCSAgICAgIHZhcl9yZXBfaWR4ID0gdmFyX3JlcF9tYXg7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAgIGZyYWdfcHRyID0gZnJhZ19wdHItPmZyX25leHQ7Ci0gICAgfQotICBkYXRhX2J1ZmZlcltkYXRhX2J1ZmZlcl9zaXplXSA9ICdcMCc7Ci0gIHJldHVybiBhZGRyZXNzOwotfQotCi0KLQotCi0KLQotc3RhdGljIHZvaWQKLXByaW50X2xpbmVzIChsaXN0LCBsaW5lbm8sIHN0cmluZywgYWRkcmVzcykKLSAgICAgbGlzdF9pbmZvX3R5cGUgKmxpc3Q7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lbm87Ci0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgdW5zaWduZWQgaW50IGFkZHJlc3M7Ci17Ci0gIHVuc2lnbmVkIGludCBpZHg7Ci0gIHVuc2lnbmVkIGludCBuY2hhcnM7Ci0gIHVuc2lnbmVkIGludCBsaW5lczsKLSAgdW5zaWduZWQgaW50IGJ5dGVfaW5fd29yZCA9IDA7Ci0gIGNoYXIgKnNyYyA9IGRhdGFfYnVmZmVyOwotCi0gIC8qIFByaW50IHRoZSBzdHVmZiBvbiB0aGUgZmlyc3QgbGluZSAqLwotICBsaXN0aW5nX3BhZ2UgKGxpc3QpOwotICBuY2hhcnMgPSAoTElTVElOR19XT1JEX1NJWkUgKiAyICsgMSkgKiBsaXN0aW5nX2xoc193aWR0aDsKLSAgCi0gIC8qIFByaW50IHRoZSBoZXggZm9yIHRoZSBmaXJzdCBsaW5lICovCi0gIGlmIChhZGRyZXNzID09IH4gKHVuc2lnbmVkIGludCkgMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlIDRkICAgICAiLCBsaW5lbm8pOwotICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBuY2hhcnM7IGlkeCsrKQotCWZwcmludGYgKGxpc3RfZmlsZSwgIiAiKTsKLQotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiXHQlc1xuIiwgc3RyaW5nID8gc3RyaW5nIDogIiIpOwotICAgICAgCi0gICAgICBvbl9wYWdlICsrOwotICAgICAgCi0gICAgICBsaXN0aW5nX3BhZ2UgKDApOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChoYWRfZXJyb3JzICgpKQotICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiUgNGQgPz8/PyAiLCBsaW5lbm8pOwotICBlbHNlCi0gICAgZnByaW50ZiAobGlzdF9maWxlLCAiJSA0ZCAlMDR4ICIsIGxpbmVubywgYWRkcmVzcyk7Ci0KLSAgLyogQW5kIHRoZSBkYXRhIHRvIGdvIGFsb25nIHdpdGggaXQgKi8KLSAgaWR4ID0gMDsKLSAgCi0gIHdoaWxlICgqc3JjICYmIGlkeCA8IG5jaGFycykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlYyVjIiwgc3JjWzBdLCBzcmNbMV0pOwotICAgICAgc3JjICs9IDI7Ci0gICAgICBieXRlX2luX3dvcmQrKzsKLSAgICAgIAotICAgICAgaWYgKGJ5dGVfaW5fd29yZCA9PSBMSVNUSU5HX1dPUkRfU0laRSkKLQl7Ci0JICBmcHJpbnRmIChsaXN0X2ZpbGUsICIgIik7Ci0JICBpZHgrKzsKLQkgIGJ5dGVfaW5fd29yZCA9IDA7Ci0JfQotICAgICAgCi0gICAgICBpZHggKz0gMjsKLSAgICB9Ci0gIAotICBmb3IgKDsgaWR4IDwgbmNoYXJzOyBpZHgrKykKLSAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIgIik7Ci0gIAotICBmcHJpbnRmIChsaXN0X2ZpbGUsICJcdCVzXG4iLCBzdHJpbmcgPyBzdHJpbmcgOiAiIik7Ci0gIG9uX3BhZ2UrKzsKLSAgbGlzdGluZ19wYWdlIChsaXN0KTsKLSAgCi0gIGlmIChsaXN0LT5tZXNzYWdlKQotICAgIHsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIioqKiogICVzXG4iLCBsaXN0LT5tZXNzYWdlKTsKLSAgICAgIGxpc3RpbmdfcGFnZSAobGlzdCk7Ci0gICAgICBvbl9wYWdlKys7Ci0gICAgfQotICAKLSAgZm9yIChsaW5lcyA9IDA7Ci0gICAgICAgbGluZXMgPCAodW5zaWduZWQgaW50KSBsaXN0aW5nX2xoc19jb250X2xpbmVzCi0JICYmICpzcmM7Ci0gICAgICAgbGluZXMgKyspCi0gICAgewotICAgICAgbmNoYXJzID0gKChMSVNUSU5HX1dPUkRfU0laRSAqIDIpICsgMSkKLQkqIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCAtIDE7Ci0gICAgICBpZHggPSAwOwotICAgICAgCi0gICAgICAvKiBQcmludCBhbnkgbW9yZSBsaW5lcyBvZiBkYXRhLCBidXQgbW9yZSBjb21wYWN0bHkgKi8KLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiUgNGQgICAgICAiLCBsaW5lbm8pOwotICAgICAgCi0gICAgICB3aGlsZSAoKnNyYyAmJiBpZHggPCBuY2hhcnMpCi0JewotCSAgZnByaW50ZiAobGlzdF9maWxlLCAiJWMlYyIsIHNyY1swXSwgc3JjWzFdKTsKLQkgIHNyYyArPSAyOwotCSAgaWR4ICs9IDI7Ci0JICBieXRlX2luX3dvcmQrKzsKLQkgIAotCSAgaWYgKGJ5dGVfaW5fd29yZCA9PSBMSVNUSU5HX1dPUkRfU0laRSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiAiKTsKLQkgICAgICBpZHgrKzsKLQkgICAgICBieXRlX2luX3dvcmQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgCi0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJcbiIpOwotICAgICAgb25fcGFnZSArKzsKLSAgICAgIGxpc3RpbmdfcGFnZSAobGlzdCk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1saXN0X3N5bWJvbF90YWJsZSAoKQotewotICBleHRlcm4gc3ltYm9sUyAqc3ltYm9sX3Jvb3RQOwotICBpbnQgZ290X3NvbWUgPSAwOwotCi0gIHN5bWJvbFMgKnB0cjsKLSAgZWplY3QgPSAxOwotICBsaXN0aW5nX3BhZ2UgKDApOwotCi0gIGZvciAocHRyID0gc3ltYm9sX3Jvb3RQOyBwdHIgIT0gKHN5bWJvbFMgKikgTlVMTDsgcHRyID0gc3ltYm9sX25leHQgKHB0cikpCi0gICAgewotICAgICAgaWYgKFNFR19OT1JNQUwgKFNfR0VUX1NFR01FTlQgKHB0cikpCi0JICB8fCBTX0dFVF9TRUdNRU5UIChwdHIpID09IGFic29sdXRlX3NlY3Rpb24pCi0JewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgIC8qIERvbid0IHJlcG9ydCBzZWN0aW9uIHN5bWJvbHMuICBUaGV5IGFyZSBub3QgaW50ZXJlc3RpbmcuICAqLwotCSAgaWYgKHN5bWJvbF9zZWN0aW9uX3AgKHB0cikpCi0JICAgIGNvbnRpbnVlOwotI2VuZGlmCi0JICBpZiAoU19HRVRfTkFNRSAocHRyKSkKLQkgICAgewotCSAgICAgIGNoYXIgYnVmWzMwXSwgZm10WzhdOwotCSAgICAgIHZhbHVlVCB2YWwgPSBTX0dFVF9WQUxVRSAocHRyKTsKLQotCSAgICAgIC8qIEBAIE5vdGUgdGhhdCB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgY29tcGlsYXRpb24gb3B0aW9ucywKLQkJIG5vdCBzb2xlbHkgb24gdGhlIHRhcmdldCBjaGFyYWN0ZXJpc3RpY3MuICAqLwotCSAgICAgIGlmIChzaXplb2YgKHZhbCkgPT0gNCAmJiBzaXplb2YgKGludCkgPT0gNCkKLQkJc3ByaW50ZiAoYnVmLCAiJTA4bHgiLCAodW5zaWduZWQgbG9uZykgdmFsKTsKLQkgICAgICBlbHNlIGlmIChzaXplb2YgKHZhbCkgPD0gc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkKLQkJewotCQkgIHNwcmludGYgKGZtdCwgIiUlMCVsdWx4IiwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSAoc2l6ZW9mICh2YWwpICogMikpOwotCQkgIHNwcmludGYgKGJ1ZiwgZm10LCAodW5zaWduZWQgbG9uZykgdmFsKTsKLQkJfQotI2lmIGRlZmluZWQgKEJGRDY0KQotCSAgICAgIGVsc2UgaWYgKHNpemVvZiAodmFsKSA+IDQpCi0JCXNwcmludGZfdm1hIChidWYsIHZhbCk7Ci0jZW5kaWYKLQkgICAgICBlbHNlCi0JCWFib3J0ICgpOwotCi0JICAgICAgaWYgKCFnb3Rfc29tZSkKLQkJewotCQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIkRFRklORUQgU1lNQk9MU1xuIik7Ci0JCSAgb25fcGFnZSsrOwotCQkgIGdvdF9zb21lID0gMTsKLQkJfQotCi0JICAgICAgaWYgKHN5bWJvbF9nZXRfZnJhZyAocHRyKSAmJiBzeW1ib2xfZ2V0X2ZyYWcgKHB0ciktPmxpbmUpCi0JCXsKLQkJICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlMjBzOiUtNWQgICVzOiVzICVzXG4iLAotCQkJICAgc3ltYm9sX2dldF9mcmFnIChwdHIpLT5saW5lLT5maWxlLT5maWxlbmFtZSwKLQkJCSAgIHN5bWJvbF9nZXRfZnJhZyAocHRyKS0+bGluZS0+bGluZSwKLQkJCSAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAocHRyKSksCi0JCQkgICBidWYsIFNfR0VUX05BTUUgKHB0cikpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZnByaW50ZiAobGlzdF9maWxlLCAiJTMzczolcyAlc1xuIiwKLQkJCSAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAocHRyKSksCi0JCQkgICBidWYsIFNfR0VUX05BTUUgKHB0cikpOwotCQl9Ci0KLQkgICAgICBvbl9wYWdlICsrOwotCSAgICAgIGxpc3RpbmdfcGFnZSAoMCk7Ci0JICAgIH0KLQl9Ci0KLSAgICB9Ci0gIGlmICghZ290X3NvbWUpCi0gICAgewotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiTk8gREVGSU5FRCBTWU1CT0xTXG4iKTsKLSAgICAgIG9uX3BhZ2UrKzsKLSAgICB9Ci0gIGZwcmludGYgKGxpc3RfZmlsZSwgIlxuIik7Ci0gIG9uX3BhZ2UrKzsKLSAgbGlzdGluZ19wYWdlICgwKTsKLQotICBnb3Rfc29tZSA9IDA7Ci0KLSAgZm9yIChwdHIgPSBzeW1ib2xfcm9vdFA7IHB0ciAhPSAoc3ltYm9sUyAqKSBOVUxMOyBwdHIgPSBzeW1ib2xfbmV4dCAocHRyKSkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfTkFNRSAocHRyKSAmJiBzdHJsZW4gKFNfR0VUX05BTUUgKHB0cikpICE9IDApCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHB0cikgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBpZiAoIWdvdF9zb21lKQotCQl7Ci0JCSAgZ290X3NvbWUgPSAxOwotCQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIlVOREVGSU5FRCBTWU1CT0xTXG4iKTsKLQkJICBvbl9wYWdlKys7Ci0JCSAgbGlzdGluZ19wYWdlICgwKTsKLQkJfQotCSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVzXG4iLCBTX0dFVF9OQU1FIChwdHIpKTsKLQkgICAgICBvbl9wYWdlKys7Ci0JICAgICAgbGlzdGluZ19wYWdlICgwKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmICghZ290X3NvbWUpCi0gICAgewotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiTk8gVU5ERUZJTkVEIFNZTUJPTFNcbiIpOwotICAgICAgb25fcGFnZSsrOwotICAgICAgbGlzdGluZ19wYWdlICgwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zb3VyY2UgKGN1cnJlbnRfZmlsZSwgbGlzdCwgYnVmZmVyLCB3aWR0aCkKLSAgICAgZmlsZV9pbmZvX3R5cGUgKmN1cnJlbnRfZmlsZTsKLSAgICAgbGlzdF9pbmZvX3R5cGUgKmxpc3Q7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICAgdW5zaWduZWQgaW50IHdpZHRoOwotewotICBpZiAoIWN1cnJlbnRfZmlsZS0+YXRfZW5kKQotICAgIHsKLSAgICAgIHdoaWxlIChjdXJyZW50X2ZpbGUtPmxpbmVudW0gPCBsaXN0LT5obGxfbGluZQotCSAgICAgJiYgIWN1cnJlbnRfZmlsZS0+YXRfZW5kKQotCXsKLQkgIGNoYXIgKnAgPSBidWZmZXJfbGluZSAoY3VycmVudF9maWxlLCBidWZmZXIsIHdpZHRoKTsKLQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIiU0dTolLTEzcyAqKioqICVzXG4iLCBjdXJyZW50X2ZpbGUtPmxpbmVudW0sCi0JCSAgIGN1cnJlbnRfZmlsZS0+ZmlsZW5hbWUsIHApOwotCSAgb25fcGFnZSsrOwotCSAgbGlzdGluZ19wYWdlIChsaXN0KTsKLQl9Ci0gICAgfQotfQotCi0vKiBTb21ldGltZXMgdGhlIHVzZXIgZG9lc24ndCB3YW50IHRvIGJlIGJvdGhlcmVkIGJ5IHRoZSBkZWJ1Z2dpbmcKLSAgIHJlY29yZHMgaW5zZXJ0ZWQgYnkgdGhlIGNvbXBpbGVyLCBzZWUgaWYgdGhlIGxpbmUgaXMgc3VzcGljaW91cy4gICovCi0KLXN0YXRpYyBpbnQKLWRlYnVnZ2luZ19wc2V1ZG8gKGxpc3QsIGxpbmUpCi0gICAgIGxpc3RfaW5mb190eXBlICpsaXN0OwotICAgICBjb25zdCBjaGFyICpsaW5lOwotewotICBzdGF0aWMgaW50IGluX2RlYnVnOwotICBpbnQgd2FzX2RlYnVnOwotCi0gIGlmIChsaXN0LT5kZWJ1Z2dpbmcpCi0gICAgewotICAgICAgaW5fZGVidWcgPSAxOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIHdhc19kZWJ1ZyA9IGluX2RlYnVnOwotICBpbl9kZWJ1ZyA9IDA7Ci0KLSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqbGluZSkpCi0gICAgbGluZSsrOwotCi0gIGlmICgqbGluZSAhPSAnLicpCi0gICAgewotI2lmZGVmIE9CSl9FTEYKLSAgICAgIC8qIFRoZSBFTEYgY29tcGlsZXIgc29tZXRpbWVzIGVtaXRzIGJsYW5rIGxpbmVzIGFmdGVyIHN3aXRjaGluZwotICAgICAgICAgb3V0IG9mIGEgZGVidWdnaW5nIHNlY3Rpb24uICBJZiB0aGUgbmV4dCBsaW5lIGRyb3BzIHVzIGJhY2sKLSAgICAgICAgIGludG8gZGVidWdnaW5nIGluZm9ybWF0aW9uLCB0aGVuIGRvbid0IHByaW50IHRoZSBibGFuayBsaW5lLgotICAgICAgICAgVGhpcyBpcyBhIGhhY2sgZm9yIGEgcGFydGljdWxhciBjb21waWxlciBiZWhhdmlvdXIsIG5vdCBhCi0gICAgICAgICBnZW5lcmFsIGNhc2UuICAqLwotICAgICAgaWYgKHdhc19kZWJ1ZwotCSAgJiYgKmxpbmUgPT0gJ1wwJwotCSAgJiYgbGlzdC0+bmV4dCAhPSBOVUxMCi0JICAmJiBsaXN0LT5uZXh0LT5kZWJ1Z2dpbmcpCi0JewotCSAgaW5fZGVidWcgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotI2VuZGlmCi0KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBsaW5lKys7Ci0KLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJkZWYiLCAzKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgInZhbCIsIDMpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAic2NsIiwgMykgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJsaW5lIiwgNCkgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJlbmRlZiIsIDUpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAibG4iLCAyKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgInR5cGUiLCA0KSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgInNpemUiLCA0KSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgImRpbSIsIDMpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAidGFnIiwgMykgPT0gMCkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoc3RybmNtcCAobGluZSwgInN0YWJzIiwgNSkgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJzdGFibiIsIDUpID09IDApCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1saXN0aW5nX2xpc3RpbmcgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgbGlzdF9pbmZvX3R5cGUgKmxpc3QgPSBoZWFkOwotICBmaWxlX2luZm9fdHlwZSAqY3VycmVudF9obGxfZmlsZSA9IChmaWxlX2luZm9fdHlwZSAqKSBOVUxMOwotICBjaGFyICptZXNzYWdlOwotICBjaGFyICpidWZmZXI7Ci0gIGNoYXIgKnA7Ci0gIGludCBzaG93X2xpc3RpbmcgPSAxOwotICB1bnNpZ25lZCBpbnQgd2lkdGg7Ci0KLSAgYnVmZmVyID0geG1hbGxvYyAobGlzdGluZ19yaHNfd2lkdGgpOwotICBkYXRhX2J1ZmZlciA9IHhtYWxsb2MgKE1BWF9CWVRFUyk7Ci0gIGVqZWN0ID0gMTsKLSAgbGlzdCA9IGhlYWQ7Ci0KLSAgd2hpbGUgKGxpc3QgIT0gKGxpc3RfaW5mb190eXBlICopIE5VTEwgJiYgMCkKLSAgICB7Ci0gICAgICBpZiAobGlzdC0+bmV4dCkKLQlsaXN0LT5mcmFnID0gbGlzdC0+bmV4dC0+ZnJhZzsKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotCi0gICAgfQotCi0gIGxpc3QgPSBoZWFkLT5uZXh0OwotCi0KLSAgd2hpbGUgKGxpc3QpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGxpc3RfbGluZTsKLQotICAgICAgd2lkdGggPSBsaXN0aW5nX3Joc193aWR0aCA+IHBhcGVyX3dpZHRoID8gcGFwZXJfd2lkdGggOgotCWxpc3RpbmdfcmhzX3dpZHRoOwotCi0gICAgICBsaXN0X2xpbmUgPSBsaXN0LT5saW5lOwotICAgICAgc3dpdGNoIChsaXN0LT5lZGljdCkKLQl7Ci0JY2FzZSBFRElDVF9MSVNUOgotCSAgLyogU2tpcCBhbGwgbGluZXMgdXAgdG8gdGhlIGN1cnJlbnQuICAqLwotCSAgbGlzdF9saW5lLS07Ci0JICBicmVhazsKLQljYXNlIEVESUNUX05PTElTVDoKLQkgIHNob3dfbGlzdGluZy0tOwotCSAgYnJlYWs7Ci0JY2FzZSBFRElDVF9OT0xJU1RfTkVYVDoKLQkgIGJyZWFrOwotCWNhc2UgRURJQ1RfRUpFQ1Q6Ci0JICBicmVhazsKLQljYXNlIEVESUNUX05PTkU6Ci0JICBicmVhazsKLQljYXNlIEVESUNUX1RJVExFOgotCSAgdGl0bGUgPSBsaXN0LT5lZGljdF9hcmc7Ci0JICBicmVhazsKLQljYXNlIEVESUNUX1NCVFRMOgotCSAgc3VidGl0bGUgPSBsaXN0LT5lZGljdF9hcmc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBpZiAoc2hvd19saXN0aW5nIDw9IDApCi0JewotCSAgd2hpbGUgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUKLQkJICYmICFsaXN0LT5maWxlLT5hdF9lbmQpCi0JICAgIHAgPSBidWZmZXJfbGluZSAobGlzdC0+ZmlsZSwgYnVmZmVyLCB3aWR0aCk7Ci0JfQotCi0gICAgICBpZiAobGlzdC0+ZWRpY3QgPT0gRURJQ1RfTElTVCkKLQl7Ci0JICAvKiBFbmFibGUgbGlzdGluZyBmb3IgdGhlIHNpbmdsZSBsaW5lIHRoYXQgY2F1c2VkIHRoZSBlbmFibGUuICAqLwotCSAgbGlzdF9saW5lKys7Ci0JICBzaG93X2xpc3RpbmcrKzsKLQl9Ci0KLSAgICAgIGlmIChzaG93X2xpc3RpbmcgPiAwKQotCXsKLQkgIC8qIFNjYW4gZG93biB0aGUgbGlzdCBhbmQgcHJpbnQgYWxsIHRoZSBzdHVmZiB3aGljaCBjYW4gYmUgZG9uZQotCSAgICAgd2l0aCB0aGlzIGxpbmUgKG9yIGxpbmVzKS4gICovCi0JICBtZXNzYWdlID0gMDsKLQotCSAgaWYgKGxpc3QtPmhsbF9maWxlKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9obGxfZmlsZSA9IGxpc3QtPmhsbF9maWxlOwotCSAgICB9Ci0KLQkgIGlmIChjdXJyZW50X2hsbF9maWxlICYmIGxpc3QtPmhsbF9saW5lICYmIChsaXN0aW5nICYgTElTVElOR19ITEwpKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc291cmNlIChjdXJyZW50X2hsbF9maWxlLCBsaXN0LCBidWZmZXIsIHdpZHRoKTsKLQkgICAgfQotCi0JICBpZiAobGlzdC0+bGluZV9jb250ZW50cykKLQkgICAgewotCSAgICAgIGlmICghKChsaXN0aW5nICYgTElTVElOR19OT0RFQlVHKQotCQkgICAgJiYgZGVidWdnaW5nX3BzZXVkbyAobGlzdCwgbGlzdC0+bGluZV9jb250ZW50cykpKQotCQl7Ci0gCQkgIHByaW50X2xpbmVzIChsaXN0LAotCQkJICAgICAgIGxpc3QtPmZpbGUtPmxpbmVudW0gPT0gMCA/IGxpc3QtPmxpbmUgOiBsaXN0LT5maWxlLT5saW5lbnVtLAotCQkJICAgICAgIGxpc3QtPmxpbmVfY29udGVudHMsIGNhbGNfaGV4IChsaXN0KSk7Ci0JCX0KLQkgICAgICBmcmVlIChsaXN0LT5saW5lX2NvbnRlbnRzKTsKLQkgICAgICBsaXN0LT5saW5lX2NvbnRlbnRzID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUKLQkJICAgICAmJiAhbGlzdC0+ZmlsZS0+YXRfZW5kKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IGFkZHJlc3M7Ci0KLQkJICBwID0gYnVmZmVyX2xpbmUgKGxpc3QtPmZpbGUsIGJ1ZmZlciwgd2lkdGgpOwotCi0JCSAgaWYgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUpCi0JCSAgICBhZGRyZXNzID0gfiAodW5zaWduZWQgaW50KSAwOwotCQkgIGVsc2UKLQkJICAgIGFkZHJlc3MgPSBjYWxjX2hleCAobGlzdCk7Ci0KLQkJICBpZiAoISgobGlzdGluZyAmIExJU1RJTkdfTk9ERUJVRykKLQkJCSYmIGRlYnVnZ2luZ19wc2V1ZG8gKGxpc3QsIHApKSkKLQkJICAgIHByaW50X2xpbmVzIChsaXN0LCBsaXN0LT5maWxlLT5saW5lbnVtLCBwLCBhZGRyZXNzKTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9FSkVDVCkKLQkgICAgewotCSAgICAgIGVqZWN0ID0gMTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGxpc3QtPmVkaWN0ID09IEVESUNUX05PTElTVF9ORVhUKQotCS0tc2hvd19saXN0aW5nOwotCi0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICB9Ci0KLSAgZnJlZSAoYnVmZmVyKTsKLSAgZnJlZSAoZGF0YV9idWZmZXIpOwotICBkYXRhX2J1ZmZlciA9IE5VTEw7Ci19Ci0KLXZvaWQKLWxpc3RpbmdfcHJpbnQgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGludCB1c2luZ19zdGRvdXQ7Ci0gIAotICB0aXRsZSA9ICIiOwotICBzdWJ0aXRsZSA9ICIiOwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgewotICAgICAgbGlzdF9maWxlID0gc3Rkb3V0OwotICAgICAgdXNpbmdfc3Rkb3V0ID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0X2ZpbGUgPSBmb3BlbiAobmFtZSwgInciKTsKLSAgICAgIGlmIChsaXN0X2ZpbGUgIT0gTlVMTCkKLQl1c2luZ19zdGRvdXQgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGFzX3BlcnJvciAoXygiY2FuJ3Qgb3BlbiBsaXN0IGZpbGU6ICVzIiksIG5hbWUpOwotCSAgbGlzdF9maWxlID0gc3Rkb3V0OwotCSAgdXNpbmdfc3Rkb3V0ID0gMTsKLQl9Ci0gICAgfQotCi0gIGlmIChsaXN0aW5nICYgTElTVElOR19OT0ZPUk0pCi0gICAgewotICAgICAgcGFwZXJfaGVpZ2h0ID0gMDsKLSAgICB9Ci0KLSAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX0xJU1RJTkcpCi0gICAgewotICAgICAgbGlzdGluZ19saXN0aW5nIChuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX1NZTUJPTFMpCi0gICAgewotICAgICAgbGlzdF9zeW1ib2xfdGFibGUgKCk7Ci0gICAgfQotCi0gIGlmICghIHVzaW5nX3N0ZG91dCkKLSAgICB7Ci0gICAgICBpZiAoZmNsb3NlIChsaXN0X2ZpbGUpID09IEVPRikKLQlhc19wZXJyb3IgKF8oImVycm9yIGNsb3NpbmcgbGlzdCBmaWxlOiAlcyIpLCBuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGxhc3Rfb3Blbl9maWxlKQotICAgIHsKLSAgICAgIGZjbG9zZSAobGFzdF9vcGVuX2ZpbGUpOwotICAgIH0KLX0KLQotCi12b2lkCi1saXN0aW5nX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGZuID0gbmFtZTsKLX0KLQotdm9pZAotbGlzdGluZ19lamVjdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChsaXN0aW5nKQotICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBFRElDVF9FSkVDVDsKLX0KLQotdm9pZAotbGlzdGluZ19mbGFncyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHdoaWxlICgoKmlucHV0X2xpbmVfcG9pbnRlcisrKSAmJiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXG4nKSkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotfQotCi0vKiBUdXJuIGxpc3Rpbmcgb24gb3Igb2ZmLiAgQW4gYXJndW1lbnQgb2YgMCBtZWFucyB0byB0dXJuIG9mZgotICAgbGlzdGluZy4gIEFuIGFyZ3VtZW50IG9mIDEgbWVhbnMgdG8gdHVybiBvbiBsaXN0aW5nLiAgQW4gYXJndW1lbnQKLSAgIG9mIDIgbWVhbnMgdG8gdHVybiBvZmYgbGlzdGluZywgYnV0IGFzIG9mIHRoZSBuZXh0IGxpbmU7IHRoYXQgaXMsCi0gICB0aGUgY3VycmVudCBsaW5lIHNob3VsZCBiZSBsaXN0ZWQsIGJ1dCB0aGUgbmV4dCBsaW5lIHNob3VsZCBub3QuICAqLwotCi12b2lkCi1saXN0aW5nX2xpc3QgKG9uKQotICAgICBpbnQgb247Ci17Ci0gIGlmIChsaXN0aW5nKQotICAgIHsKLSAgICAgIHN3aXRjaCAob24pCi0JewotCWNhc2UgMDoKLQkgIGlmIChsaXN0aW5nX3RhaWwtPmVkaWN0ID09IEVESUNUX0xJU1QpCi0JICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBFRElDVF9OT05FOwotCSAgZWxzZQotCSAgICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfTk9MSVNUOwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgaWYgKGxpc3RpbmdfdGFpbC0+ZWRpY3QgPT0gRURJQ1RfTk9MSVNUCi0JICAgICAgfHwgbGlzdGluZ190YWlsLT5lZGljdCA9PSBFRElDVF9OT0xJU1RfTkVYVCkKLQkgICAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX05PTkU7Ci0JICBlbHNlCi0JICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBFRElDVF9MSVNUOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX05PTElTVF9ORVhUOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci19Ci0KLQotdm9pZAotbGlzdGluZ19wc2l6ZSAod2lkdGhfb25seSkKLSAgICAgaW50IHdpZHRoX29ubHk7Ci17Ci0gIGlmICghIHdpZHRoX29ubHkpCi0gICAgewotICAgICAgcGFwZXJfaGVpZ2h0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgICAgIGlmIChwYXBlcl9oZWlnaHQgPCAwIHx8IHBhcGVyX2hlaWdodCA+IDEwMDApCi0JewotCSAgcGFwZXJfaGVpZ2h0ID0gMDsKLQkgIGFzX3dhcm4gKF8oInN0cmFuZ2UgcGFwZXIgaGVpZ2h0LCBzZXQgdG8gbm8gZm9ybSIpKTsKLQl9Ci0KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQl7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIHBhcGVyX3dpZHRoID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotbGlzdGluZ19ub3BhZ2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBwYXBlcl9oZWlnaHQgPSAwOwotfQotCi12b2lkCi1saXN0aW5nX3RpdGxlIChkZXB0aCkKLSAgICAgaW50IGRlcHRoOwotewotICBpbnQgcXVvdGVkOwotICBjaGFyICpzdGFydDsKLSAgY2hhciAqdHRsOwotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wiJykKLSAgICBxdW90ZWQgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgcXVvdGVkID0gMTsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICB7Ci0gICAgICBpZiAocXVvdGVkCi0JICA/ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJwotCSAgOiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JewotCSAgaWYgKGxpc3RpbmcpCi0JICAgIHsKLQkgICAgICBsZW5ndGggPSBpbnB1dF9saW5lX3BvaW50ZXIgLSBzdGFydDsKLQkgICAgICB0dGwgPSB4bWFsbG9jIChsZW5ndGggKyAxKTsKLQkgICAgICBtZW1jcHkgKHR0bCwgc3RhcnQsIGxlbmd0aCk7Ci0JICAgICAgdHRsW2xlbmd0aF0gPSAwOwotCSAgICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBkZXB0aCA/IEVESUNUX1NCVFRMIDogRURJQ1RfVElUTEU7Ci0JICAgICAgbGlzdGluZ190YWlsLT5lZGljdF9hcmcgPSB0dGw7Ci0JICAgIH0KLQkgIGlmIChxdW90ZWQpCi0JICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JewotCSAgYXNfYmFkIChfKCJOZXcgbGluZSBpbiB0aXRsZSIpKTsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCX0KLSAgICB9Ci19Ci0KLQotCi12b2lkCi1saXN0aW5nX3NvdXJjZV9saW5lIChsaW5lKQotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLXsKLSAgaWYgKGxpc3RpbmcpCi0gICAgewotICAgICAgbmV3X2ZyYWcgKCk7Ci0gICAgICBsaXN0aW5nX3RhaWwtPmhsbF9saW5lID0gbGluZTsKLSAgICAgIG5ld19mcmFnICgpOwotICAgIH0KLX0KLQotdm9pZAotbGlzdGluZ19zb3VyY2VfZmlsZSAoZmlsZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgaWYgKGxpc3RpbmcpCi0gICAgbGlzdGluZ190YWlsLT5obGxfZmlsZSA9IGZpbGVfaW5mbyAoZmlsZSk7Ci19Ci0KLQotCi0jZWxzZQotCi0KLS8qIER1bW15IGZ1bmN0aW9ucyBmb3Igd2hlbiBjb21waWxlZCB3aXRob3V0IGxpc3RpbmcgZW5hYmxlZCAqLwotCi12b2lkCi1saXN0aW5nX2ZsYWdzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZCAKLWxpc3RpbmdfbGlzdCAob24pCi0gICAgIGludCBvbjsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkIAotbGlzdGluZ19lamVjdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzX2lnbm9yZSAoMCk7Ci19Ci0KLXZvaWQgCi1saXN0aW5nX3BzaXplIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZAotbGlzdGluZ19ub3BhZ2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkIAotbGlzdGluZ190aXRsZSAoZGVwdGgpCi0gICAgIGludCBkZXB0aDsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkCi1saXN0aW5nX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0KLX0KLQotdm9pZCAKLWxpc3RpbmdfbmV3bGluZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLQotfQotCi12b2lkIAotbGlzdGluZ19zb3VyY2VfbGluZSAobikKLSAgICAgdW5zaWduZWQgaW50IG47Ci17Ci0KLX0KLXZvaWQgCi1saXN0aW5nX3NvdXJjZV9maWxlIChuKQotICAgICBjb25zdCBjaGFyICpuOwotewotCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2xpc3RpbmcuaCBiL2dhcy9saXN0aW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZDVjMzcuLjAwMDAwMDAKLS0tIGEvZ2FzL2xpc3RpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBsaXN0aW5nLmgKLSAgIENvcHlyaWdodCAoQykgMTk4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfX2xpc3RpbmdfaF9fCi0jZGVmaW5lIF9fbGlzdGluZ19oX18KLQotI2RlZmluZSBMSVNUSU5HX0xJU1RJTkcgICAgMQotI2RlZmluZSBMSVNUSU5HX1NZTUJPTFMgICAgMgotI2RlZmluZSBMSVNUSU5HX05PRk9STSAgICAgNAotI2RlZmluZSBMSVNUSU5HX0hMTCAgICAgICAgOAotI2RlZmluZSBMSVNUSU5HX05PREVCVUcgICAxNgotI2RlZmluZSBMSVNUSU5HX05PQ09ORAkgIDMyCi0jZGVmaW5lIExJU1RJTkdfTUFDRVhQCSAgNjQKLQotI2RlZmluZSBMSVNUSU5HX0RFRkFVTFQgICAgKExJU1RJTkdfTElTVElORyB8IExJU1RJTkdfSExMIHwgTElTVElOR19TWU1CT0xTKQotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSNkZWZpbmUgTElTVElOR19ORVdMSU5FKCkgeyBpZiAobGlzdGluZykgbGlzdGluZ19uZXdsaW5lKE5VTEwpOyB9Ci0jZWxzZQotI2RlZmluZSBMSVNUSU5HX05FV0xJTkUoKSB7O30KLSNlbmRpZgotI2RlZmluZSBMSVNUSU5HX0VPRigpICAgICBMSVNUSU5HX05FV0xJTkUoKQotCi0jZGVmaW5lIExJU1RJTkdfU0tJUF9DT05EKCkgKChsaXN0aW5nICYgTElTVElOR19OT0NPTkQpICE9IDApCi0KLXZvaWQgbGlzdGluZ19lamVjdCBQQVJBTVMgKChpbnQpKTsKLXZvaWQgbGlzdGluZ19lcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICptZXNzYWdlKSk7Ci12b2lkIGxpc3RpbmdfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci12b2lkIGxpc3RpbmdfZmxhZ3MgUEFSQU1TICgoaW50KSk7Ci12b2lkIGxpc3RpbmdfbGlzdCBQQVJBTVMgKChpbnQgb24pKTsKLXZvaWQgbGlzdGluZ19uZXdsaW5lIFBBUkFNUyAoKGNoYXIgKnBzKSk7Ci12b2lkIGxpc3RpbmdfcHJldl9saW5lIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgbGlzdGluZ19wcmludCBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci12b2lkIGxpc3RpbmdfcHNpemUgUEFSQU1TICgoaW50KSk7Ci12b2lkIGxpc3Rpbmdfbm9wYWdlIFBBUkFNUyAoKGludCkpOwotdm9pZCBsaXN0aW5nX3NvdXJjZV9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotdm9pZCBsaXN0aW5nX3NvdXJjZV9saW5lIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotdm9pZCBsaXN0aW5nX3RpdGxlIFBBUkFNUyAoKGludCBkZXB0aCkpOwotdm9pZCBsaXN0aW5nX3dhcm5pbmcgUEFSQU1TICgoY29uc3QgY2hhciAqbWVzc2FnZSkpOwotdm9pZCBsaXN0aW5nX3dpZHRoIFBBUkFNUyAoKHVuc2lnbmVkIGludCB4KSk7Ci0KLWV4dGVybiBpbnQgbGlzdGluZ19saHNfd2lkdGg7Ci1leHRlcm4gaW50IGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZDsKLWV4dGVybiBpbnQgbGlzdGluZ19saHNfY29udF9saW5lczsKLWV4dGVybiBpbnQgbGlzdGluZ19yaHNfd2lkdGg7Ci0KLSNlbmRpZiAvKiBfX2xpc3RpbmdfaF9fICovCi0KLS8qIGVuZCBvZiBsaXN0aW5nLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9saXRlcmFsLmMgYi9nYXMvbGl0ZXJhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2Y4ZmM0Li4wMDAwMDAwCi0tLSBhL2dhcy9saXRlcmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiBhcy5jIC0gR0FTIGxpdGVyYWwgcG9vbCBtYW5hZ2VtZW50LgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybiAocmFlYnVybkBjeWdudXMuY29tKS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qIFRoaXMgaXNuJ3QgcXVpdGUgYSAiY29uc3RhbnQiIHBvb2wuICBTb21lIG9mIHRoZSB2YWx1ZXMgbWF5IGdldAotICAgYWRqdXN0ZWQgYXQgcnVuIHRpbWUsIGUuZy4sIGZvciBzeW1ib2xpYyByZWxvY2F0aW9ucyB3aGVuIHNoYXJlZAotICAgbGlicmFyaWVzIGFyZSBpbiB1c2UuICBJdCdzIG1vcmUgb2YgYSAibGl0ZXJhbCIgcG9vbC4KLQotICAgT24gdGhlIEFscGhhLCB0aGlzIHNob3VsZCBiZSB1c2VkIGZvciAubGl0YSBhbmQgLmxpdDguICAoSXMgdGhlcmUKLSAgIGV2ZXIgYSAubGl0ND8pICBPbiB0aGUgTUlQUywgaXQgY291bGQgYmUgdXNlZCBmb3IgLmxpdDQgYXMgd2VsbC4KLQotICAgVGhlIGV4cHJlc3Npb25zIHBhc3NlZCBoZXJlIHNob3VsZCBjb250YWluIGVpdGhlciBjb25zdGFudHMgb3Igc3ltYm9scywKLSAgIG5vdCBhIGNvbWJpbmF0aW9uIG9mIGJvdGguICBUeXBpY2FsbHksIHRoZSBjb25zdGFudCBwb29sIGlzIGFjY2Vzc2VkCi0gICB3aXRoIHNvbWUgc29ydCBvZiBHUCByZWdpc3Rlciwgc28gdGhlIHNpemUgb2YgdGhlIHBvb2wgbXVzdCBiZSBrZXB0IGRvd24KLSAgIGlmIHBvc3NpYmxlLiAgVGhlIGV4Y2VwdGlvbiBpcyBzZWN0aW9uIG9mZnNldHMgLS0gaWYgeW91J3JlIHN0b3JpbmcgYQotICAgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgLmRhdGEsIGZvciBleGFtcGxlLCBhbmQgeW91ciBtYWNoaW5lIHByb3ZpZGVzCi0gICBmb3IgMTYtYml0IHNpZ25lZCBhZGRlbmRzLCB5b3UgbWlnaHQgd2FudCB0byBzdG9yZSAuZGF0YSszMkssIHNvIHRoYXQKLSAgIHlvdSBjYW4gYWNjZXNzIGFsbCBvZiB0aGUgZmlyc3QgNjRLIG9mIC5kYXRhIHdpdGggdGhlIG9uZSBwb2ludGVyLgotCi0gICBUaGlzIGlzbid0IGEgcmVxdWlyZW1lbnQsIGp1c3QgYSBndWlkZWxpbmUgdGhhdCBjYW4gaGVscCBrZWVwIC5vIGZpbGUKLSAgIHNpemUgZG93bi4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmIGRlZmluZWQgKE5FRURfTElURVJBTF9QT09MKQotCi12YWx1ZVQKLWFkZF90b19saXRlcmFsX3Bvb2wgKHN5bSwgYWRkZW5kLCBzZWMsIHNpemUpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgdmFsdWVUIGFkZGVuZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGludCBzaXplOwotewotICBzZWdUIGN1cnJlbnRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBjdXJyZW50X3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvY190eXBlOwotICBjaGFyICpwOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBmaXhTICpmaXhwOwotCi0gIG9mZnNldCA9IDA7Ci0gIC8qIEBAIFRoaXMgYXNzdW1lcyBhbGwgZW50cmllcyBpbiBhIGdpdmVuIHNlY3Rpb24gd2lsbCBiZSBvZiB0aGUgc2FtZQotICAgICBzaXplLi4uICBQcm9iYWJseSBjb3JyZWN0LCBidXQgdW53aXNlIHRvIHJlbHkgb24uICAqLwotICAvKiBUaGlzIG11c3QgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIHRoZSBzYW1lIHN1YnNlZ21lbnQuICAqLwotICBpZiAoc2VnaW5mby0+ZnJjaGFpblApCi0gICAgZm9yIChmaXhwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZpeF9yb290OwotCSBmaXhwICE9IChmaXhTICopIE5VTEw7Ci0JIGZpeHAgPSBmaXhwLT5meF9uZXh0LCBvZmZzZXQgKz0gc2l6ZSkKLSAgICAgIHsKLQlpZiAoZml4cC0+ZnhfYWRkc3kgPT0gc3ltICYmIGZpeHAtPmZ4X29mZnNldCA9PSBhZGRlbmQpCi0JICByZXR1cm4gb2Zmc2V0OwotICAgICAgfQotCi0gIHN1YnNlZ19zZXQgKHNlYywgMCk7Ci0gIHAgPSBmcmFnX21vcmUgKHNpemUpOwotICBtZW1zZXQgKHAsIDAsIHNpemUpOwotCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfNjQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBzaXplLCBzeW0sIGFkZGVuZCwgMCwKLQkgICByZWxvY190eXBlKTsKLQotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfc3Vic2VjKTsKLSAgb2Zmc2V0ID0gc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemU7Ci0gIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IHNpemU7Ci0gIHJldHVybiBvZmZzZXQ7Ci19Ci0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL21hYy1hcy5yIGIvZ2FzL21hYy1hcy5yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzZjMDMzLi4wMDAwMDAwCi0tLSBhL2dhcy9tYWMtYXMucgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIFJlc291cmNlcyBmb3IgR05VIEFTLiAqLwotCi0jaW5jbHVkZSAiU3lzVHlwZXMuciIKLQotLyogVmVyc2lvbiByZXNvdXJjZXMuICovCi0KLXJlc291cmNlICd2ZXJzJyAoMSkgIHsKLQkwLAotCTAsCi0JMCwKLQkwLAotCXZlclVzLAotCVZFUlNJT05fU1RSSU5HLAotCVZFUlNJT05fU1RSSU5HICAiIChDKSAxOTg2LTk1IEZTRiwgSW5jLiIKLX07Ci0KLXJlc291cmNlICd2ZXJzJyAoMiwgcHVyZ2VhYmxlKSAgewotCTAsCi0JMCwKLQkwLAotCTAsCi0JdmVyVXMsCi0JVkVSU0lPTl9TVFJJTkcsCi0JIkdBUyAiIFZFUlNJT05fU1RSSU5HICIgZm9yIE1QVyIKLX07Ci0KLSNpZmRlZiBXQU5UX0NGUkcKLQotI2luY2x1ZGUgIkNvZGVGcmFnbWVudFR5cGVzLnIiCi0KLXJlc291cmNlICdjZnJnJyAoMCkgewotCXsKLQkJa1Bvd2VyUEMsCi0JCWtGdWxsTGliLAotCQlrTm9WZXJzaW9uTnVtLCBrTm9WZXJzaW9uTnVtLAotCQkwLDAsCi0JCWtJc0FwcCwga09uRGlza0ZsYXQsIGtaZXJvT2Zmc2V0LCBrV2hvbGVGb3JrLAotCQlQUk9HX05BTUUKLQl9Ci19OwotCi0jZW5kaWYgLyogV0FOVF9DRlJHICovCmRpZmYgLS1naXQgYS9nYXMvbWFjcm8uYyBiL2dhcy9tYWNyby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDA3ZjFkLi4wMDAwMDAwCi0tLSBhL2dhcy9tYWNyby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2MyArMCwwIEBACi0vKiBtYWNyby5jIC0gbWFjcm8gc3VwcG9ydCBmb3IgZ2FzIGFuZCBnYXNwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAotICAgICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLS8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gICovCi0jaWZkZWYgX19HTlVDX18KLSMgaWZuZGVmIGFsbG9jYQotIyAgaWZkZWYgX19TVERDX18KLWV4dGVybiB2b2lkICphbGxvY2EgKCk7Ci0jICBlbHNlCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbHNlCi0jIGlmIEhBVkVfQUxMT0NBX0gKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotIyAgICBpZiAhZGVmaW5lZCAoX19TVERDX18pICYmICFkZWZpbmVkIChfX2hwdXgpCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgICBlbHNlCi1leHRlcm4gdm9pZCAqYWxsb2NhICgpOwotIyAgICBlbmRpZiAvKiBfX1NURENfXywgX19ocHV4ICovCi0jICAgZW5kaWYgLyogYWxsb2NhICovCi0jICBlbmRpZiAvKiBfQUlYICovCi0jIGVuZGlmIC8qIEhBVkVfQUxMT0NBX0ggKi8KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic2IuaCIKLSNpbmNsdWRlICJoYXNoLmgiCi0jaW5jbHVkZSAibWFjcm8uaCIKLQotI2luY2x1ZGUgImFzaW50bC5oIgotCi0vKiBUaGUgcm91dGluZXMgaW4gdGhpcyBmaWxlIGhhbmRsZSBtYWNybyBkZWZpbml0aW9uIGFuZCBleHBhbnNpb24uCi0gICBUaGV5IGFyZSBjYWxsZWQgYnkgYm90aCBnYXNwIGFuZCBnYXMuICAqLwotCi0vKiBTdHJ1Y3R1cmVzIHVzZWQgdG8gc3RvcmUgbWFjcm9zLiAKLQotICAgRWFjaCBtYWNybyBrbm93cyBpdHMgbmFtZSBhbmQgaW5jbHVkZWQgdGV4dC4gIEl0IGdldHMgYnVpbHQgd2l0aCBhCi0gICBsaXN0IG9mIGZvcm1hbCBhcmd1bWVudHMsIGFuZCBhbHNvIGtlZXBzIGEgaGFzaCB0YWJsZSB3aGljaCBwb2ludHMKLSAgIGludG8gdGhlIGxpc3QgdG8gc3BlZWQgdXAgZm9ybWFsIHNlYXJjaC4gIEVhY2ggZm9ybWFsIGtub3dzIGl0cwotICAgbmFtZSBhbmQgaXRzIGRlZmF1bHQgdmFsdWUuICBFYWNoIHRpbWUgdGhlIG1hY3JvIGlzIGV4cGFuZGVkLCB0aGUKLSAgIGZvcm1hbHMgZ2V0IHRoZSBhY3R1YWwgdmFsdWVzIGF0dGF0Y2hlZCB0byB0aGVtLiAqLwotCi0vKiBkZXNjcmliZSB0aGUgZm9ybWFsIGFyZ3VtZW50cyB0byBhIG1hY3JvICovCi0KLXR5cGVkZWYgc3RydWN0IGZvcm1hbF9zdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBmb3JtYWxfc3RydWN0ICpuZXh0OwkvKiBuZXh0IGZvcm1hbCBpbiBsaXN0ICovCi0gICAgc2IgbmFtZTsJCQkvKiBuYW1lIG9mIHRoZSBmb3JtYWwgKi8KLSAgICBzYiBkZWY7CQkJLyogdGhlIGRlZmF1bHQgdmFsdWUgKi8KLSAgICBzYiBhY3R1YWw7CQkJLyogdGhlIGFjdHVhbCBhcmd1bWVudCAoY2hhbmdlZCBvbiBlYWNoIGV4cGFuc2lvbikgKi8KLSAgICBpbnQgaW5kZXg7CQkJLyogdGhlIGluZGV4IG9mIHRoZSBmb3JtYWwgMC4uZm9ybWFsX2NvdW50LTEgKi8KLSAgfQotZm9ybWFsX2VudHJ5OwotCi0vKiBPdGhlciB2YWx1ZXMgZm91bmQgaW4gdGhlIGluZGV4IGZpZWxkIG9mIGEgZm9ybWFsX2VudHJ5LiAgKi8KLSNkZWZpbmUgUVVBTF9JTkRFWCAoLTEpCi0jZGVmaW5lIE5BUkdfSU5ERVggKC0yKQotI2RlZmluZSBMT0NBTF9JTkRFWCAoLTMpCi0KLS8qIGRlc2NyaWJlIHRoZSBtYWNyby4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbWFjcm9fc3RydWN0Ci0gIHsKLSAgICBzYiBzdWI7CQkJLyogc3Vic3RpdHV0aW9uIHRleHQuICovCi0gICAgaW50IGZvcm1hbF9jb3VudDsJCS8qIG51bWJlciBvZiBmb3JtYWwgYXJncy4gKi8KLSAgICBmb3JtYWxfZW50cnkgKmZvcm1hbHM7CS8qIHBvaW50ZXIgdG8gbGlzdCBvZiBmb3JtYWxfc3RydWN0cyAqLwotICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmZvcm1hbF9oYXNoOyAvKiBoYXNoIHRhYmxlIG9mIGZvcm1hbHMuICovCi0gIH0KLW1hY3JvX2VudHJ5OwotCi0vKiBJbnRlcm5hbCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgaW50IGdldF90b2tlbiBQQVJBTVMgKChpbnQsIHNiICosIHNiICopKTsKLXN0YXRpYyBpbnQgZ2V0c3RyaW5nIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIGludCBnZXRfYW55X3N0cmluZyBQQVJBTVMgKChpbnQsIHNiICosIHNiICosIGludCwgaW50KSk7Ci1zdGF0aWMgaW50IGRvX2Zvcm1hbHMgUEFSQU1TICgobWFjcm9fZW50cnkgKiwgaW50LCBzYiAqKSk7Ci1zdGF0aWMgaW50IGdldF9hcG9zdF90b2tlbiBQQVJBTVMgKChpbnQsIHNiICosIHNiICosIGludCkpOwotc3RhdGljIGludCBzdWJfYWN0dWFsCi0gIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKiwgc3RydWN0IGhhc2hfY29udHJvbCAqLCBpbnQsIHNiICosIGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKm1hY3JvX2V4cGFuZF9ib2R5Ci0gIFBBUkFNUyAoKHNiICosIHNiICosIGZvcm1hbF9lbnRyeSAqLCBzdHJ1Y3QgaGFzaF9jb250cm9sICosIGludCwgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqbWFjcm9fZXhwYW5kIFBBUkFNUyAoKGludCwgc2IgKiwgbWFjcm9fZW50cnkgKiwgc2IgKiwgaW50KSk7Ci0KLSNkZWZpbmUgSVNXSElURSh4KSAoKHgpID09ICcgJyB8fCAoeCkgPT0gJ1x0JykKLQotI2RlZmluZSBJU1NFUCh4KSBcCi0gKCh4KSA9PSAnICcgfHwgKHgpID09ICdcdCcgfHwgKHgpID09ICcsJyB8fCAoeCkgPT0gJyInIHx8ICh4KSA9PSAnOycgXAotICB8fCAoeCkgPT0gJyknIHx8ICh4KSA9PSAnKCcgXAotICB8fCAoKG1hY3JvX2FsdGVybmF0ZSB8fCBtYWNyb19tcmkpICYmICgoeCkgPT0gJzwnIHx8ICh4KSA9PSAnPicpKSkKLQotI2RlZmluZSBJU0JBU0UoeCkgXAotICAoKHgpID09ICdiJyB8fCAoeCkgPT0gJ0InIFwKLSAgIHx8ICh4KSA9PSAncScgfHwgKHgpID09ICdRJyBcCi0gICB8fCAoeCkgPT0gJ2gnIHx8ICh4KSA9PSAnSCcgXAotICAgfHwgKHgpID09ICdkJyB8fCAoeCkgPT0gJ0QnKQotCi0vKiBUaGUgbWFjcm8gaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICptYWNyb19oYXNoOwotCi0vKiBXaGV0aGVyIGFueSBtYWNyb3MgaGF2ZSBiZWVuIGRlZmluZWQuICAqLwotCi1pbnQgbWFjcm9fZGVmaW5lZDsKLQotLyogV2hldGhlciB3ZSBhcmUgaW4gR0FTUCBhbHRlcm5hdGUgbW9kZS4gICovCi0KLXN0YXRpYyBpbnQgbWFjcm9fYWx0ZXJuYXRlOwotCi0vKiBXaGV0aGVyIHdlIGFyZSBpbiBNUkkgbW9kZS4gICovCi0KLXN0YXRpYyBpbnQgbWFjcm9fbXJpOwotCi0vKiBXaGV0aGVyIHdlIHNob3VsZCBzdHJpcCAnQCcgY2hhcmFjdGVycy4gICovCi0KLXN0YXRpYyBpbnQgbWFjcm9fc3RyaXBfYXQ7Ci0KLS8qIEZ1bmN0aW9uIHRvIHVzZSB0byBwYXJzZSBhbiBleHByZXNzaW9uLiAgKi8KLQotc3RhdGljIGludCAoKm1hY3JvX2V4cHIpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBzYiAqLCBpbnQgKikpOwotCi0vKiBOdW1iZXIgb2YgbWFjcm8gZXhwYW5zaW9ucyB0aGF0IGhhdmUgYmVlbiBkb25lLiAgKi8KLQotc3RhdGljIGludCBtYWNyb19udW1iZXI7Ci0KLS8qIEluaXRpYWxpemUgbWFjcm8gcHJvY2Vzc2luZy4gICovCi0KLXZvaWQKLW1hY3JvX2luaXQgKGFsdGVybmF0ZSwgbXJpLCBzdHJpcF9hdCwgZXhwcikKLSAgICAgaW50IGFsdGVybmF0ZTsKLSAgICAgaW50IG1yaTsKLSAgICAgaW50IHN0cmlwX2F0OwotICAgICBpbnQgKCpleHByKSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKTsKLXsKLSAgbWFjcm9faGFzaCA9IGhhc2hfbmV3ICgpOwotICBtYWNyb19kZWZpbmVkID0gMDsKLSAgbWFjcm9fYWx0ZXJuYXRlID0gYWx0ZXJuYXRlOwotICBtYWNyb19tcmkgPSBtcmk7Ci0gIG1hY3JvX3N0cmlwX2F0ID0gc3RyaXBfYXQ7Ci0gIG1hY3JvX2V4cHIgPSBleHByOwotfQotCi0vKiBTd2l0Y2ggaW4gYW5kIG91dCBvZiBNUkkgbW9kZSBvbiB0aGUgZmx5LiAgKi8KLQotdm9pZAotbWFjcm9fbXJpX21vZGUgKG1yaSkKLSAgICAgaW50IG1yaTsKLXsKLSAgbWFjcm9fbXJpID0gbXJpOwotfQotCi0vKiBSZWFkIGlucHV0IGxpbmVzIHRpbGwgd2UgZ2V0IHRvIGEgVE8gc3RyaW5nLgotICAgSW5jcmVhc2UgbmVzdGluZyBkZXB0aCBpZiB3ZSBnZXQgYSBGUk9NIHN0cmluZy4KLSAgIFB1dCB0aGUgcmVzdWx0cyBpbnRvIHNiIGF0IFBUUi4KLSAgIEFkZCBhIG5ldyBpbnB1dCBsaW5lIHRvIGFuIHNiIHVzaW5nIEdFVF9MSU5FLgotICAgUmV0dXJuIDEgb24gc3VjY2VzcywgMCBvbiB1bmV4cGVjdGVkIEVPRi4gICovCi0KLWludAotYnVmZmVyX2FuZF9uZXN0IChmcm9tLCB0bywgcHRyLCBnZXRfbGluZSkKLSAgICAgY29uc3QgY2hhciAqZnJvbTsKLSAgICAgY29uc3QgY2hhciAqdG87Ci0gICAgIHNiICpwdHI7Ci0gICAgIGludCAoKmdldF9saW5lKSBQQVJBTVMgKChzYiAqKSk7Ci17Ci0gIGludCBmcm9tX2xlbiA9IHN0cmxlbiAoZnJvbSk7Ci0gIGludCB0b19sZW4gPSBzdHJsZW4gKHRvKTsKLSAgaW50IGRlcHRoID0gMTsKLSAgaW50IGxpbmVfc3RhcnQgPSBwdHItPmxlbjsKLQotICBpbnQgbW9yZSA9IGdldF9saW5lIChwdHIpOwotCi0gIHdoaWxlIChtb3JlKQotICAgIHsKLSAgICAgIC8qIFRyeSBhbmQgZmluZCB0aGUgZmlyc3QgcHNldWRvIG9wIG9uIHRoZSBsaW5lICovCi0gICAgICBpbnQgaSA9IGxpbmVfc3RhcnQ7Ci0KLSAgICAgIGlmICghIG1hY3JvX2FsdGVybmF0ZSAmJiAhIG1hY3JvX21yaSkKLQl7Ci0JICAvKiBXaXRoIG5vcm1hbCBzeW50YXggd2UgY2FuIHN1Y2sgd2hhdCB3ZSB3YW50IHRpbGwgd2UgZ2V0Ci0JICAgICB0byB0aGUgZG90LiAgV2l0aCB0aGUgYWx0ZXJuYXRlLCBsYWJlbHMgaGF2ZSB0byBzdGFydCBpbgotCSAgICAgdGhlIGZpcnN0IGNvbHVtbiwgc2luY2Ugd2UgY2FudCB0ZWxsIHdoYXQncyBhIGxhYmVsIGFuZAotCSAgICAgd2hhdHMgYSBwc2V1ZG9vcCAqLwotCi0JICAvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotCSAgd2hpbGUgKGkgPCBwdHItPmxlbiAmJiBJU1dISVRFIChwdHItPnB0cltpXSkpCi0JICAgIGkrKzsKLQotCSAgLyogU2tpcCBvdmVyIGEgbGFiZWwgKi8KLQkgIHdoaWxlIChpIDwgcHRyLT5sZW4KLQkJICYmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgcHRyLT5wdHJbaV0pCi0JCSAgICAgfHwgcHRyLT5wdHJbaV0gPT0gJ18nCi0JCSAgICAgfHwgcHRyLT5wdHJbaV0gPT0gJyQnKSkKLQkgICAgaSsrOwotCi0JICAvKiBBbmQgYSBjb2xvbiAqLwotCSAgaWYgKGkgPCBwdHItPmxlbgotCSAgICAgICYmIHB0ci0+cHRyW2ldID09ICc6JykKLQkgICAgaSsrOwotCi0JfQotICAgICAgLyogU2tpcCB0cmFpbGluZyB3aGl0ZXNwYWNlICovCi0gICAgICB3aGlsZSAoaSA8IHB0ci0+bGVuICYmIElTV0hJVEUgKHB0ci0+cHRyW2ldKSkKLQlpKys7Ci0KLSAgICAgIGlmIChpIDwgcHRyLT5sZW4gJiYgKHB0ci0+cHRyW2ldID09ICcuJwotCQkJICAgfHwgbWFjcm9fYWx0ZXJuYXRlCi0JCQkgICB8fCBtYWNyb19tcmkpKQotCXsKLQkgIGlmIChwdHItPnB0cltpXSA9PSAnLicpCi0JICAgICAgaSsrOwotCSAgaWYgKHN0cm5jYXNlY21wIChwdHItPnB0ciArIGksIGZyb20sIGZyb21fbGVuKSA9PSAwCi0JICAgICAgJiYgKHB0ci0+bGVuID09IChpICsgZnJvbV9sZW4pIHx8ICEgaXNhbG51bSAocHRyLT5wdHJbaSArIGZyb21fbGVuXSkpKQotCSAgICBkZXB0aCsrOwotCSAgaWYgKHN0cm5jYXNlY21wIChwdHItPnB0ciArIGksIHRvLCB0b19sZW4pID09IDAKLQkgICAgICAmJiAocHRyLT5sZW4gPT0gKGkgKyB0b19sZW4pIHx8ICEgaXNhbG51bSAocHRyLT5wdHJbaSArIHRvX2xlbl0pKSkKLQkgICAgewotCSAgICAgIGRlcHRoLS07Ci0JICAgICAgaWYgKGRlcHRoID09IDApCi0JCXsKLQkJICAvKiBSZXNldCB0aGUgc3RyaW5nIHRvIG5vdCBpbmNsdWRlIHRoZSBlbmRpbmcgcnVuZSAqLwotCQkgIHB0ci0+bGVuID0gbGluZV9zdGFydDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBBZGQgYSBDUiB0byB0aGUgZW5kIGFuZCBrZWVwIHJ1bm5pbmcgKi8KLSAgICAgIHNiX2FkZF9jaGFyIChwdHIsICdcbicpOwotICAgICAgbGluZV9zdGFydCA9IHB0ci0+bGVuOwotICAgICAgbW9yZSA9IGdldF9saW5lIChwdHIpOwotICAgIH0KLQotICAvKiBSZXR1cm4gMSBvbiBzdWNjZXNzLCAwIG9uIHVuZXhwZWN0ZWQgRU9GLiAgKi8KLSAgcmV0dXJuIGRlcHRoID09IDA7Ci19Ci0KLS8qIFBpY2sgdXAgYSB0b2tlbi4gICovCi0KLXN0YXRpYyBpbnQKLWdldF90b2tlbiAoaWR4LCBpbiwgbmFtZSkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqbmFtZTsKLXsKLSAgaWYgKGlkeCA8IGluLT5sZW4KLSAgICAgICYmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHhdKQotCSAgfHwgaW4tPnB0cltpZHhdID09ICdfJwotCSAgfHwgaW4tPnB0cltpZHhdID09ICckJykpCi0gICAgewotICAgICAgc2JfYWRkX2NoYXIgKG5hbWUsIGluLT5wdHJbaWR4KytdKTsKLSAgICAgIHdoaWxlIChpZHggPCBpbi0+bGVuCi0JICAgICAmJiAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4XSkKLQkJIHx8IGluLT5wdHJbaWR4XSA9PSAnXycKLQkJIHx8IGluLT5wdHJbaWR4XSA9PSAnJCcpKQotCXsKLQkgIHNiX2FkZF9jaGFyIChuYW1lLCBpbi0+cHRyW2lkeCsrXSk7Ci0JfQotICAgIH0KLSAgLyogSWdub3JlIHRyYWlsaW5nICYgKi8KLSAgaWYgKG1hY3JvX2FsdGVybmF0ZSAmJiBpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSA9PSAnJicpCi0gICAgaWR4Kys7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIFBpY2sgdXAgYSBzdHJpbmcuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRzdHJpbmcgKGlkeCwgaW4sIGFjYykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqYWNjOwotewotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCSAmJiAoaW4tPnB0cltpZHhdID09ICciJyAKLQkgICAgIHx8IChpbi0+cHRyW2lkeF0gPT0gJzwnICYmIChtYWNyb19hbHRlcm5hdGUgfHwgbWFjcm9fbXJpKSkKLQkgICAgIHx8IChpbi0+cHRyW2lkeF0gPT0gJ1wnJyAmJiBtYWNyb19hbHRlcm5hdGUpKSkKLSAgICB7Ci0gICAgICBpZiAoaW4tPnB0cltpZHhdID09ICc8JykKLQl7Ci0JICBpbnQgbmVzdCA9IDA7Ci0JICBpZHgrKzsKLQkgIHdoaWxlICgoaW4tPnB0cltpZHhdICE9ICc+JyB8fCBuZXN0KQotCQkgJiYgaWR4IDwgaW4tPmxlbikKLQkgICAgewotCSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyEnKQotCQl7Ci0JCSAgaWR4KysgIDsKLQkJICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeCsrXSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoaW4tPnB0cltpZHhdID09ICc+JykKLQkJICAgIG5lc3QtLTsKLQkJICBpZiAoaW4tPnB0cltpZHhdID09ICc8JykKLQkJICAgIG5lc3QrKzsKLQkJICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeCsrXSk7Ci0JCX0KLQkgICAgfQotCSAgaWR4Kys7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICciJyB8fCBpbi0+cHRyW2lkeF0gPT0gJ1wnJykKLQl7Ci0JICBjaGFyIHRjaGFyID0gaW4tPnB0cltpZHhdOwotCSAgaWR4Kys7Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKLQkgICAgewotCSAgICAgIGlmIChtYWNyb19hbHRlcm5hdGUgJiYgaW4tPnB0cltpZHhdID09ICchJykKLQkJewotCQkgIGlkeCsrICA7Ci0JCSAgc2JfYWRkX2NoYXIgKGFjYywgaW4tPnB0cltpZHgrK10pOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGluLT5wdHJbaWR4XSA9PSB0Y2hhcikKLQkJICAgIHsKLQkJICAgICAgaWR4Kys7Ci0JCSAgICAgIGlmIChpZHggPj0gaW4tPmxlbiB8fCBpbi0+cHRyW2lkeF0gIT0gdGNoYXIpCi0JCQlicmVhazsKLQkJICAgIH0KLQkJICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeF0pOwotCQkgIGlkeCsrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogRmV0Y2ggc3RyaW5nIGZyb20gdGhlIGlucHV0IHN0cmVhbSwKLSAgIHJ1bGVzOgotICAgICdCeHl4PHdoaXRlc3BhY2U+ICAJLT4gcmV0dXJuICdCeHl6YQotICAgICU8Y2hhcj4JCS0+IHJldHVybiBzdHJpbmcgb2YgZGVjaW1hbCB2YWx1ZSBvZiB4Ci0gICAgIjxzdHJpbmc+IgkJLT4gcmV0dXJuIHN0cmluZwotICAgIHh5eDx3aGl0ZXNwYWNlPiAgICAgLT4gcmV0dXJuIHh5egotKi8KLQotc3RhdGljIGludAotZ2V0X2FueV9zdHJpbmcgKGlkeCwgaW4sIG91dCwgZXhwYW5kLCBwcmV0ZW5kX3F1b3RlZCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotICAgICBpbnQgZXhwYW5kOwotICAgICBpbnQgcHJldGVuZF9xdW90ZWQ7Ci17Ci0gIHNiX3Jlc2V0IChvdXQpOwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICBpZiAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBpZiAoaW4tPmxlbiA+IDIgJiYgaW4tPnB0cltpZHgrMV0gPT0gJ1wnJyAmJiBJU0JBU0UgKGluLT5wdHJbaWR4XSkpCi0JewotCSAgd2hpbGUgKCFJU1NFUCAoaW4tPnB0cltpZHhdKSkKLQkgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnJScKLQkgICAgICAgJiYgbWFjcm9fYWx0ZXJuYXRlCi0JICAgICAgICYmIGV4cGFuZCkKLQl7Ci0JICBpbnQgdmFsOwotCSAgY2hhciBidWZbMjBdOwotCSAgLyogVHVybnMgdGhlIG5leHQgZXhwcmVzc2lvbiBpbnRvIGEgc3RyaW5nICovCi0JICBpZHggPSAoKm1hY3JvX2V4cHIpIChfKCIlIG9wZXJhdG9yIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24iKSwKLQkJCSAgICAgICBpZHggKyAxLAotCQkJICAgICAgIGluLAotCQkJICAgICAgICZ2YWwpOwotCSAgc3ByaW50ZihidWYsICIlZCIsIHZhbCk7Ci0JICBzYl9hZGRfc3RyaW5nIChvdXQsIGJ1Zik7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICciJwotCSAgICAgICB8fCAoaW4tPnB0cltpZHhdID09ICc8JyAmJiAobWFjcm9fYWx0ZXJuYXRlIHx8IG1hY3JvX21yaSkpCi0JICAgICAgIHx8IChtYWNyb19hbHRlcm5hdGUgJiYgaW4tPnB0cltpZHhdID09ICdcJycpKQotCXsKLQkgIGlmIChtYWNyb19hbHRlcm5hdGUKLQkgICAgICAmJiAhIG1hY3JvX3N0cmlwX2F0Ci0JICAgICAgJiYgZXhwYW5kKQotCSAgICB7Ci0JICAgICAgLyogS2VlcCB0aGUgcXVvdGVzICovCi0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgICdcIicpOwotCi0JICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCBvdXQpOwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICAnXCInKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCBvdXQpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSAKLQl7Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAKLQkJICYmIChpbi0+cHRyW2lkeF0gPT0gJyInCi0JCSAgICAgfHwgaW4tPnB0cltpZHhdID09ICdcJycKLQkJICAgICB8fCBwcmV0ZW5kX3F1b3RlZCAKLQkJICAgICB8fCAoaW4tPnB0cltpZHhdICE9ICcgJwotCQkJICYmIGluLT5wdHJbaWR4XSAhPSAnXHQnCi0JCQkgJiYgaW4tPnB0cltpZHhdICE9ICcsJwotCQkJICYmIChpbi0+cHRyW2lkeF0gIT0gJzwnCi0JCQkgICAgIHx8ICghIG1hY3JvX2FsdGVybmF0ZSAmJiAhIG1hY3JvX21yaSkpKSkpCi0JICAgIHsKLQkgICAgICBpZiAoaW4tPnB0cltpZHhdID09ICciJyAKLQkJICB8fCBpbi0+cHRyW2lkeF0gPT0gJ1wnJykKLQkJewotCQkgIGNoYXIgdGNoYXIgPSBpbi0+cHRyW2lkeF07Ci0JCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwotCQkgIHdoaWxlIChpZHggPCBpbi0+bGVuCi0JCQkgJiYgaW4tPnB0cltpZHhdICE9IHRjaGFyKQotCQkgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwkJICAgIAotCQkgIGlmIChpZHggPT0gaW4tPmxlbikKLQkJICAgIHJldHVybiBpZHg7CSAgICAgIAotCQl9Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gaWR4OwotfQotCi0vKiBQaWNrIHVwIHRoZSBmb3JtYWwgcGFyYW1ldGVycyBvZiBhIG1hY3JvIGRlZmluaXRpb24uICAqLwotCi1zdGF0aWMgaW50Ci1kb19mb3JtYWxzIChtYWNybywgaWR4LCBpbikKLSAgICAgbWFjcm9fZW50cnkgKm1hY3JvOwotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGZvcm1hbF9lbnRyeSAqKnAgPSAmbWFjcm8tPmZvcm1hbHM7Ci0KLSAgbWFjcm8tPmZvcm1hbF9jb3VudCA9IDA7Ci0gIG1hY3JvLT5mb3JtYWxfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBmb3JtYWxfZW50cnkgKmZvcm1hbDsKLQotICAgICAgZm9ybWFsID0gKGZvcm1hbF9lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKGZvcm1hbF9lbnRyeSkpOwotCi0gICAgICBzYl9uZXcgKCZmb3JtYWwtPm5hbWUpOwotICAgICAgc2JfbmV3ICgmZm9ybWFsLT5kZWYpOwotICAgICAgc2JfbmV3ICgmZm9ybWFsLT5hY3R1YWwpOwotCi0gICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgICAgIGlkeCA9IGdldF90b2tlbiAoaWR4LCBpbiwgJmZvcm1hbC0+bmFtZSk7Ci0gICAgICBpZiAoZm9ybWFsLT5uYW1lLmxlbiA9PSAwKQotCWJyZWFrOwotICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gICAgICBpZiAoZm9ybWFsLT5uYW1lLmxlbikKLQl7Ci0JICAvKiBUaGlzIGlzIGEgZm9ybWFsICovCi0JICBpZiAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gPT0gJz0nKQotCSAgICB7Ci0JICAgICAgLyogR290IGEgZGVmYXVsdCAqLwotCSAgICAgIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHggKyAxLCBpbiwgJmZvcm1hbC0+ZGVmLCAxLCAwKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogQWRkIHRvIG1hY3JvJ3MgaGFzaCB0YWJsZSAqLwotICAgICAgaGFzaF9qYW0gKG1hY3JvLT5mb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICgmZm9ybWFsLT5uYW1lKSwgZm9ybWFsKTsKLQotICAgICAgZm9ybWFsLT5pbmRleCA9IG1hY3JvLT5mb3JtYWxfY291bnQ7Ci0gICAgICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgICAgIG1hY3JvLT5mb3JtYWxfY291bnQrKzsKLSAgICAgICpwID0gZm9ybWFsOwotICAgICAgcCA9ICZmb3JtYWwtPm5leHQ7Ci0gICAgICAqcCA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChtYWNyb19tcmkpCi0gICAgewotICAgICAgZm9ybWFsX2VudHJ5ICpmb3JtYWw7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICAvKiBBZGQgYSBzcGVjaWFsIE5BUkcgZm9ybWFsLCB3aGljaCBtYWNyb19leHBhbmQgd2lsbCBzZXQgdG8gdGhlCi0gICAgICAgICBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLSAgICAgIGZvcm1hbCA9IChmb3JtYWxfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChmb3JtYWxfZW50cnkpKTsKLQotICAgICAgc2JfbmV3ICgmZm9ybWFsLT5uYW1lKTsKLSAgICAgIHNiX25ldyAoJmZvcm1hbC0+ZGVmKTsKLSAgICAgIHNiX25ldyAoJmZvcm1hbC0+YWN0dWFsKTsKLQotICAgICAgLyogVGhlIHNhbWUgTVJJIGFzc2VtYmxlcnMgd2hpY2ggdHJlYXQgJ0AnIGNoYXJhY3RlcnMgYWxzbyB1c2UKLSAgICAgICAgIHRoZSBuYW1lICROQVJHLiAgQXQgbGVhc3QgdW50aWwgd2UgZmluZCBhbiBleGNlcHRpb24uICAqLwotICAgICAgaWYgKG1hY3JvX3N0cmlwX2F0KQotCW5hbWUgPSAiJE5BUkciOwotICAgICAgZWxzZQotCW5hbWUgPSAiTkFSRyI7Ci0KLSAgICAgIHNiX2FkZF9zdHJpbmcgKCZmb3JtYWwtPm5hbWUsIG5hbWUpOwotCi0gICAgICAvKiBBZGQgdG8gbWFjcm8ncyBoYXNoIHRhYmxlICovCi0gICAgICBoYXNoX2phbSAobWFjcm8tPmZvcm1hbF9oYXNoLCBuYW1lLCBmb3JtYWwpOwotCi0gICAgICBmb3JtYWwtPmluZGV4ID0gTkFSR19JTkRFWDsKLSAgICAgICpwID0gZm9ybWFsOwotICAgICAgZm9ybWFsLT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogRGVmaW5lIGEgbmV3IG1hY3JvLiAgUmV0dXJucyBOVUxMIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSByZXR1cm5zIGFuCi0gICBlcnJvciBtZXNzYWdlLiAgSWYgTkFNRVAgaXMgbm90IE5VTEwsICpOQU1FUCBpcyBzZXQgdG8gdGhlIG5hbWUgb2YKLSAgIHRoZSBtYWNybyB3aGljaCB3YXMgZGVmaW5lZC4gICovCi0KLWNvbnN0IGNoYXIgKgotZGVmaW5lX21hY3JvIChpZHgsIGluLCBsYWJlbCwgZ2V0X2xpbmUsIG5hbWVwKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpsYWJlbDsKLSAgICAgaW50ICgqZ2V0X2xpbmUpIFBBUkFNUyAoKHNiICopKTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwOwotewotICBtYWNyb19lbnRyeSAqbWFjcm87Ci0gIHNiIG5hbWU7Ci0gIGNvbnN0IGNoYXIgKm5hbWVzdHI7Ci0KLSAgbWFjcm8gPSAobWFjcm9fZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChtYWNyb19lbnRyeSkpOwotICBzYl9uZXcgKCZtYWNyby0+c3ViKTsKLSAgc2JfbmV3ICgmbmFtZSk7Ci0KLSAgbWFjcm8tPmZvcm1hbF9jb3VudCA9IDA7Ci0gIG1hY3JvLT5mb3JtYWxzID0gMDsKLQotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgaWYgKCEgYnVmZmVyX2FuZF9uZXN0ICgiTUFDUk8iLCAiRU5ETSIsICZtYWNyby0+c3ViLCBnZXRfbGluZSkpCi0gICAgcmV0dXJuIF8oInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gbWFjcm8gZGVmaW5pdGlvbiIpOwotICBpZiAobGFiZWwgIT0gTlVMTCAmJiBsYWJlbC0+bGVuICE9IDApCi0gICAgewotICAgICAgc2JfYWRkX3NiICgmbmFtZSwgbGFiZWwpOwotICAgICAgaWYgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdID09ICcoJykKLQl7Ci0JICAvKiBJdCdzIHRoZSBsYWJlbDogTUFDUk8gKGZvcm1hbHMsLi4uKSAgc29ydCAqLwotCSAgaWR4ID0gZG9fZm9ybWFscyAobWFjcm8sIGlkeCArIDEsIGluKTsKLQkgIGlmIChpbi0+cHRyW2lkeF0gIT0gJyknKQotCSAgICByZXR1cm4gXygibWlzc2luZyApIGFmdGVyIGZvcm1hbHMiKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogSXQncyB0aGUgbGFiZWw6IE1BQ1JPIGZvcm1hbHMsLi4uICBzb3J0ICovCi0JICBpZHggPSBkb19mb3JtYWxzIChtYWNybywgaWR4LCBpbik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlkeCA9IGdldF90b2tlbiAoaWR4LCBpbiwgJm5hbWUpOwotICAgICAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gICAgICBpZHggPSBkb19mb3JtYWxzIChtYWNybywgaWR4LCBpbik7Ci0gICAgfQotCi0gIC8qIGFuZCBzdGljayBpdCBpbiB0aGUgbWFjcm8gaGFzaCB0YWJsZSAqLwotICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5hbWUubGVuOyBpZHgrKykKLSAgICBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpIG5hbWUucHRyW2lkeF0pKQotICAgICAgbmFtZS5wdHJbaWR4XSA9IHRvbG93ZXIgKG5hbWUucHRyW2lkeF0pOwotICBuYW1lc3RyID0gc2JfdGVybWluYXRlICgmbmFtZSk7Ci0gIGhhc2hfamFtIChtYWNyb19oYXNoLCBuYW1lc3RyLCAoUFRSKSBtYWNybyk7Ci0KLSAgbWFjcm9fZGVmaW5lZCA9IDE7Ci0KLSAgaWYgKG5hbWVwICE9IE5VTEwpCi0gICAgKm5hbWVwID0gbmFtZXN0cjsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2NhbiBhIHRva2VuLCBhbmQgdGhlbiBza2lwIEtJTkQuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfYXBvc3RfdG9rZW4gKGlkeCwgaW4sIG5hbWUsIGtpbmQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm5hbWU7Ci0gICAgIGludCBraW5kOwotewotICBpZHggPSBnZXRfdG9rZW4gKGlkeCwgaW4sIG5hbWUpOwotICBpZiAoaWR4IDwgaW4tPmxlbgotICAgICAgJiYgaW4tPnB0cltpZHhdID09IGtpbmQKLSAgICAgICYmICghIG1hY3JvX21yaSB8fCBtYWNyb19zdHJpcF9hdCkKLSAgICAgICYmICghIG1hY3JvX3N0cmlwX2F0IHx8IGtpbmQgPT0gJ0AnKSkKLSAgICBpZHgrKzsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogU3Vic3RpdHV0ZSB0aGUgYWN0dWFsIHZhbHVlIGZvciBhIGZvcm1hbCBwYXJhbWV0ZXIuICAqLwotCi1zdGF0aWMgaW50Ci1zdWJfYWN0dWFsIChzdGFydCwgaW4sIHQsIGZvcm1hbF9oYXNoLCBraW5kLCBvdXQsIGNvcHlpZm5vdHRoZXJlKQotICAgICBpbnQgc3RhcnQ7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKnQ7Ci0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmZvcm1hbF9oYXNoOwotICAgICBpbnQga2luZDsKLSAgICAgc2IgKm91dDsKLSAgICAgaW50IGNvcHlpZm5vdHRoZXJlOwotewotICBpbnQgc3JjOwotICBmb3JtYWxfZW50cnkgKnB0cjsKLQotICBzcmMgPSBnZXRfYXBvc3RfdG9rZW4gKHN0YXJ0LCBpbiwgdCwga2luZCk7Ci0gIC8qIFNlZSBpZiBpdCdzIGluIHRoZSBtYWNybydzIGhhc2ggdGFibGUsIHVubGVzcyB0aGlzIGlzCi0gICAgIG1hY3JvX3N0cmlwX2F0IGFuZCBraW5kIGlzICdAJyBhbmQgdGhlIHRva2VuIGRpZCBub3QgZW5kIGluICdAJy4gICovCi0gIGlmIChtYWNyb19zdHJpcF9hdAotICAgICAgJiYga2luZCA9PSAnQCcKLSAgICAgICYmIChzcmMgPT0gc3RhcnQgfHwgaW4tPnB0cltzcmMgLSAxXSAhPSAnQCcpKQotICAgIHB0ciA9IE5VTEw7Ci0gIGVsc2UKLSAgICBwdHIgPSAoZm9ybWFsX2VudHJ5ICopIGhhc2hfZmluZCAoZm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAodCkpOwotICBpZiAocHRyKQotICAgIHsKLSAgICAgIGlmIChwdHItPmFjdHVhbC5sZW4pCi0JewotCSAgc2JfYWRkX3NiIChvdXQsICZwdHItPmFjdHVhbCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNiX2FkZF9zYiAob3V0LCAmcHRyLT5kZWYpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGtpbmQgPT0gJyYnKQotICAgIHsKLSAgICAgIC8qIERvaW5nIHRoaXMgcGVybWl0cyBwZW9wbGUgdG8gdXNlICYgaW4gbWFjcm8gYm9kaWVzLiAgKi8KLSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICcmJyk7Ci0gICAgfQotICBlbHNlIGlmIChjb3B5aWZub3R0aGVyZSkKLSAgICB7Ci0gICAgICBzYl9hZGRfc2IgKG91dCwgdCk7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICdcXCcpOwotICAgICAgc2JfYWRkX3NiIChvdXQsIHQpOwotICAgIH0KLSAgcmV0dXJuIHNyYzsKLX0KLQotLyogRXhwYW5kIHRoZSBib2R5IG9mIGEgbWFjcm8uICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1tYWNyb19leHBhbmRfYm9keSAoaW4sIG91dCwgZm9ybWFscywgZm9ybWFsX2hhc2gsIGNvbW1lbnRfY2hhciwgbG9jYWxzKQotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGZvcm1hbF9lbnRyeSAqZm9ybWFsczsKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqZm9ybWFsX2hhc2g7Ci0gICAgIGludCBjb21tZW50X2NoYXI7Ci0gICAgIGludCBsb2NhbHM7Ci17Ci0gIHNiIHQ7Ci0gIGludCBzcmMgPSAwOwotICBpbnQgaW5xdW90ZSA9IDA7Ci0gIGZvcm1hbF9lbnRyeSAqbG9jbGlzdCA9IE5VTEw7Ci0KLSAgc2JfbmV3ICgmdCk7Ci0KLSAgd2hpbGUgKHNyYyA8IGluLT5sZW4pCi0gICAgewotICAgICAgaWYgKGluLT5wdHJbc3JjXSA9PSAnJicpCi0JewotCSAgc2JfcmVzZXQgKCZ0KTsKLQkgIGlmIChtYWNyb19tcmkpCi0JICAgIHsKLQkgICAgICBpZiAoc3JjICsgMSA8IGluLT5sZW4gJiYgaW4tPnB0cltzcmMgKyAxXSA9PSAnJicpCi0JCXNyYyA9IHN1Yl9hY3R1YWwgKHNyYyArIDIsIGluLCAmdCwgZm9ybWFsX2hhc2gsICdcJycsIG91dCwgMSk7Ci0JICAgICAgZWxzZQotCQlzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW3NyYysrXSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBXaHkgZG8gd2UgZG8gdGhpcz8gICovCi0JICAgICAgc3JjID0gc3ViX2FjdHVhbCAoc3JjICsgMSwgaW4sICZ0LCBmb3JtYWxfaGFzaCwgJyYnLCBvdXQsIDApOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltzcmNdID09ICdcXCcpCi0JewotCSAgc3JjKys7Ci0JICBpZiAoaW4tPnB0cltzcmNdID09IGNvbW1lbnRfY2hhciAmJiBjb21tZW50X2NoYXIgIT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBjb21tZW50LCBqdXN0IGRyb3AgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgKi8KLQkgICAgICB3aGlsZSAoc3JjIDwgaW4tPmxlbgotCQkgICAgICYmIGluLT5wdHJbc3JjXSAhPSAnXG4nKQotCQlzcmMrKzsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW4tPnB0cltzcmNdID09ICcoJykKLQkgICAgewotCSAgICAgIC8qIFN1YiBpbiB0aWxsIHRoZSBuZXh0ICcpJyBsaXRlcmFsbHkgKi8KLQkgICAgICBzcmMrKzsKLQkgICAgICB3aGlsZSAoc3JjIDwgaW4tPmxlbiAmJiBpbi0+cHRyW3NyY10gIT0gJyknKQotCQl7Ci0JCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltzcmMrK10pOwotCQl9Ci0JICAgICAgaWYgKGluLT5wdHJbc3JjXSA9PSAnKScpCi0JCXNyYysrOwotCSAgICAgIGVsc2UKLQkJcmV0dXJuIF8oIm1pc3NwbGFjZWQgKSIpOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJ0AnKQotCSAgICB7Ci0JICAgICAgLyogU3ViIGluIHRoZSBtYWNybyBpbnZvY2F0aW9uIG51bWJlciAqLwotCi0JICAgICAgY2hhciBidWZmZXJbMTBdOwotCSAgICAgIHNyYysrOwotCSAgICAgIHNwcmludGYgKGJ1ZmZlciwgIiUwNWQiLCBtYWNyb19udW1iZXIpOwotCSAgICAgIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmZmVyKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW4tPnB0cltzcmNdID09ICcmJykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBwcmVwcm9jZXNzb3IgdmFyaWFibGUgbmFtZSwgd2UgZG9uJ3QgZG8gdGhlbQotCQkgaGVyZSAqLwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICdcXCcpOwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICcmJyk7Ci0JICAgICAgc3JjKys7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG1hY3JvX21yaQotCQkgICAmJiBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltzcmNdKSkKLQkgICAgewotCSAgICAgIGludCBpbmQ7Ci0JICAgICAgZm9ybWFsX2VudHJ5ICpmOwotCi0JICAgICAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW3NyY10pKQotCQlpbmQgPSBpbi0+cHRyW3NyY10gLSAnMCc7Ci0JICAgICAgZWxzZSBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbc3JjXSkpCi0JCWluZCA9IGluLT5wdHJbc3JjXSAtICdBJyArIDEwOwotCSAgICAgIGVsc2UKLQkJaW5kID0gaW4tPnB0cltzcmNdIC0gJ2EnICsgMTA7Ci0JICAgICAgKytzcmM7Ci0JICAgICAgZm9yIChmID0gZm9ybWFsczsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLQkJewotCQkgIGlmIChmLT5pbmRleCA9PSBpbmQgLSAxKQotCQkgICAgewotCQkgICAgICBpZiAoZi0+YWN0dWFsLmxlbiAhPSAwKQotCQkJc2JfYWRkX3NiIChvdXQsICZmLT5hY3R1YWwpOwotCQkgICAgICBlbHNlCi0JCQlzYl9hZGRfc2IgKG91dCwgJmYtPmRlZik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNiX3Jlc2V0ICgmdCk7Ci0JICAgICAgc3JjID0gc3ViX2FjdHVhbCAoc3JjLCBpbiwgJnQsIGZvcm1hbF9oYXNoLCAnXCcnLCBvdXQsIDApOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoKG1hY3JvX2FsdGVybmF0ZSB8fCBtYWNyb19tcmkpCi0JICAgICAgICYmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltzcmNdKQotCQkgICB8fCBpbi0+cHRyW3NyY10gPT0gJ18nCi0JCSAgIHx8IGluLT5wdHJbc3JjXSA9PSAnJCcpCi0JICAgICAgICYmICghIGlucXVvdGUKLQkJICAgfHwgISBtYWNyb19zdHJpcF9hdAotCQkgICB8fCAoc3JjID4gMCAmJiBpbi0+cHRyW3NyYyAtIDFdID09ICdAJykpKQotCXsKLQkgIGlmICghIGxvY2FscwotCSAgICAgIHx8IHNyYyArIDUgPj0gaW4tPmxlbgotCSAgICAgIHx8IHN0cm5jYXNlY21wIChpbi0+cHRyICsgc3JjLCAiTE9DQUwiLCA1KSAhPSAwCi0JICAgICAgfHwgISBJU1dISVRFIChpbi0+cHRyW3NyYyArIDVdKSkKLQkgICAgewotCSAgICAgIHNiX3Jlc2V0ICgmdCk7Ci0JICAgICAgc3JjID0gc3ViX2FjdHVhbCAoc3JjLCBpbiwgJnQsIGZvcm1hbF9oYXNoLAotCQkJCShtYWNyb19zdHJpcF9hdCAmJiBpbnF1b3RlKSA/ICdAJyA6ICdcJycsCi0JCQkJb3V0LCAxKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZm9ybWFsX2VudHJ5ICpmOwotCi0JICAgICAgc3JjID0gc2Jfc2tpcF93aGl0ZSAoc3JjICsgNSwgaW4pOwotCSAgICAgIHdoaWxlIChpbi0+cHRyW3NyY10gIT0gJ1xuJyAmJiBpbi0+cHRyW3NyY10gIT0gY29tbWVudF9jaGFyKQotCQl7Ci0JCSAgc3RhdGljIGludCBsb2NjbnQ7Ci0JCSAgY2hhciBidWZbMjBdOwotCQkgIGNvbnN0IGNoYXIgKmVycjsKLQotCQkgIGYgPSAoZm9ybWFsX2VudHJ5ICopIHhtYWxsb2MgKHNpemVvZiAoZm9ybWFsX2VudHJ5KSk7Ci0JCSAgc2JfbmV3ICgmZi0+bmFtZSk7Ci0JCSAgc2JfbmV3ICgmZi0+ZGVmKTsKLQkJICBzYl9uZXcgKCZmLT5hY3R1YWwpOwotCQkgIGYtPmluZGV4ID0gTE9DQUxfSU5ERVg7Ci0JCSAgZi0+bmV4dCA9IGxvY2xpc3Q7Ci0JCSAgbG9jbGlzdCA9IGY7Ci0KLQkJICBzcmMgPSBnZXRfdG9rZW4gKHNyYywgaW4sICZmLT5uYW1lKTsKLQkJICArK2xvY2NudDsKLQkJICBzcHJpbnRmIChidWYsICJMTCUwNHgiLCBsb2NjbnQpOwotCQkgIHNiX2FkZF9zdHJpbmcgKCZmLT5hY3R1YWwsIGJ1Zik7Ci0KLQkJICBlcnIgPSBoYXNoX2phbSAoZm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJmYtPm5hbWUpLCBmKTsKLQkJICBpZiAoZXJyICE9IE5VTEwpCi0JCSAgICByZXR1cm4gZXJyOwotCi0JCSAgc3JjID0gc2Jfc2tpcF9jb21tYSAoc3JjLCBpbik7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGNvbW1lbnRfY2hhciAhPSAnXDAnCi0JICAgICAgICYmIGluLT5wdHJbc3JjXSA9PSBjb21tZW50X2NoYXIKLQkgICAgICAgJiYgc3JjICsgMSA8IGluLT5sZW4KLQkgICAgICAgJiYgaW4tPnB0cltzcmMgKyAxXSA9PSBjb21tZW50X2NoYXIKLQkgICAgICAgJiYgIWlucXVvdGUpCi0JewotCSAgLyogVHdvIGNvbW1lbnQgY2hhcnMgaW4gYSByb3cgY2F1c2UgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgdG8KLSAgICAgICAgICAgICBiZSBkcm9wcGVkLiAgKi8KLQkgIHdoaWxlIChzcmMgPCBpbi0+bGVuICYmIGluLT5wdHJbc3JjXSAhPSAnXG4nKQotCSAgICBzcmMrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJyInCi0JICAgICAgIHx8IChtYWNyb19tcmkgJiYgaW4tPnB0cltzcmNdID09ICdcJycpKQotCXsKLQkgIGlucXVvdGUgPSAhaW5xdW90ZTsKLQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbc3JjKytdKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJ0AnICYmIG1hY3JvX3N0cmlwX2F0KQotCXsKLQkgICsrc3JjOwotCSAgaWYgKHNyYyA8IGluLT5sZW4KLQkgICAgICAmJiBpbi0+cHRyW3NyY10gPT0gJ0AnKQotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJ0AnKTsKLQkgICAgICArK3NyYzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG1hY3JvX21yaQotCSAgICAgICAmJiBpbi0+cHRyW3NyY10gPT0gJz0nCi0JICAgICAgICYmIHNyYyArIDEgPCBpbi0+bGVuCi0JICAgICAgICYmIGluLT5wdHJbc3JjICsgMV0gPT0gJz0nKQotCXsKLQkgIGZvcm1hbF9lbnRyeSAqcHRyOwotCi0JICBzYl9yZXNldCAoJnQpOwotCSAgc3JjID0gZ2V0X3Rva2VuIChzcmMgKyAyLCBpbiwgJnQpOwotCSAgcHRyID0gKGZvcm1hbF9lbnRyeSAqKSBoYXNoX2ZpbmQgKGZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKCZ0KSk7Ci0JICBpZiAocHRyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHJlYWxseSByZXR1cm4gYSB3YXJuaW5nIHN0cmluZyBoZXJlLAotICAgICAgICAgICAgICAgICBidXQgd2UgY2FuJ3QsIGJlY2F1c2UgdGhlID09IG1pZ2h0IGJlIGluIHRoZSBNUkkKLSAgICAgICAgICAgICAgICAgY29tbWVudCBmaWVsZCwgYW5kLCBzaW5jZSB0aGUgbmF0dXJlIG9mIHRoZSBNUkkKLSAgICAgICAgICAgICAgICAgY29tbWVudCBmaWVsZCBkZXBlbmRzIHVwb24gdGhlIGV4YWN0IGluc3RydWN0aW9uCi0gICAgICAgICAgICAgICAgIGJlaW5nIHVzZWQsIHdlIGRvbid0IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIGhlcmUgdG8KLSAgICAgICAgICAgICAgICAgZmlndXJlIG91dCB3aGV0aGVyIGl0IGlzIG9yIG5vdC4gIEluc3RlYWQsIHdlIGxlYXZlCi0gICAgICAgICAgICAgICAgIHRoZSA9PSBpbiBwbGFjZSwgd2hpY2ggc2hvdWxkIGNhdXNlIGEgc3ludGF4IGVycm9yIGlmCi0gICAgICAgICAgICAgICAgIGl0IGlzIG5vdCBpbiBhIGNvbW1lbnQuICAqLwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICc9Jyk7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJz0nKTsKLQkgICAgICBzYl9hZGRfc2IgKG91dCwgJnQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocHRyLT5hY3R1YWwubGVuKQotCQl7Ci0JCSAgc2JfYWRkX3N0cmluZyAob3V0LCAiLTEiKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHNiX2FkZF9jaGFyIChvdXQsICcwJyk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW3NyYysrXSk7Ci0JfQotICAgIH0KLQotICBzYl9raWxsICgmdCk7Ci0KLSAgd2hpbGUgKGxvY2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3JtYWxfZW50cnkgKmY7Ci0KLSAgICAgIGYgPSBsb2NsaXN0LT5uZXh0OwotICAgICAgLyogU2V0dGluZyB0aGUgdmFsdWUgdG8gTlVMTCBlZmZlY3RpdmVseSBkZWxldGVzIHRoZSBlbnRyeS4gIFdlCi0gICAgICAgICBhdm9pZCBjYWxsaW5nIGhhc2hfZGVsZXRlIGJlY2F1c2UgaXQgZG9lc24ndCByZWNsYWltIG1lbW9yeS4gICovCi0gICAgICBoYXNoX2phbSAoZm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJmxvY2xpc3QtPm5hbWUpLCBOVUxMKTsKLSAgICAgIHNiX2tpbGwgKCZsb2NsaXN0LT5uYW1lKTsKLSAgICAgIHNiX2tpbGwgKCZsb2NsaXN0LT5kZWYpOwotICAgICAgc2Jfa2lsbCAoJmxvY2xpc3QtPmFjdHVhbCk7Ci0gICAgICBmcmVlIChsb2NsaXN0KTsKLSAgICAgIGxvY2xpc3QgPSBmOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQXNzaWduIHZhbHVlcyB0byB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgYSBtYWNybywgYW5kIGV4cGFuZCB0aGUKLSAgIGJvZHkuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1tYWNyb19leHBhbmQgKGlkeCwgaW4sIG0sIG91dCwgY29tbWVudF9jaGFyKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIG1hY3JvX2VudHJ5ICptOwotICAgICBzYiAqb3V0OwotICAgICBpbnQgY29tbWVudF9jaGFyOwotewotICBzYiB0OwotICBmb3JtYWxfZW50cnkgKnB0cjsKLSAgZm9ybWFsX2VudHJ5ICpmOwotICBpbnQgaXNfcG9zaXRpb25hbCA9IDA7Ci0gIGludCBpc19rZXl3b3JkID0gMDsKLSAgaW50IG5hcmcgPSAwOwotICBjb25zdCBjaGFyICplcnI7Ci0KLSAgc2JfbmV3ICgmdCk7Ci0gIAotICAvKiBSZXNldCBhbnkgb2xkIHZhbHVlIHRoZSBhY3R1YWxzIG1heSBoYXZlICovCi0gIGZvciAoZiA9IG0tPmZvcm1hbHM7IGY7IGYgPSBmLT5uZXh0KQotICAgICAgc2JfcmVzZXQgKCZmLT5hY3R1YWwpOwotICBmID0gbS0+Zm9ybWFsczsKLSAgd2hpbGUgKGYgIT0gTlVMTCAmJiBmLT5pbmRleCA8IDApCi0gICAgZiA9IGYtPm5leHQ7Ci0KLSAgaWYgKG1hY3JvX21yaSkKLSAgICB7Ci0gICAgICAvKiBUaGUgbWFjcm8gbWF5IGJlIGNhbGxlZCB3aXRoIGFuIG9wdGlvbmFsIHF1YWxpZmllciwgd2hpY2ggbWF5Ci0gICAgICAgICBiZSByZWZlcnJlZCB0byBpbiB0aGUgbWFjcm8gYm9keSBhcyBcMC4gICovCi0gICAgICBpZiAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gPT0gJy4nKQotCXsKLQkgIGZvcm1hbF9lbnRyeSAqbjsKLQotCSAgbiA9IChmb3JtYWxfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChmb3JtYWxfZW50cnkpKTsKLQkgIHNiX25ldyAoJm4tPm5hbWUpOwotCSAgc2JfbmV3ICgmbi0+ZGVmKTsKLQkgIHNiX25ldyAoJm4tPmFjdHVhbCk7Ci0JICBuLT5pbmRleCA9IFFVQUxfSU5ERVg7Ci0KLQkgIG4tPm5leHQgPSBtLT5mb3JtYWxzOwotCSAgbS0+Zm9ybWFscyA9IG47Ci0KLQkgIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHggKyAxLCBpbiwgJm4tPmFjdHVhbCwgMSwgMCk7Ci0JfQotICAgIH0KLQotICAvKiBQZWVsIG9mZiB0aGUgYWN0dWFscyBhbmQgc3RvcmUgdGhlbSBhd2F5IGluIHRoZSBoYXNoIHRhYmxlcycgYWN0dWFscyAqLwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdICE9IGNvbW1lbnRfY2hhcikKLSAgICB7Ci0gICAgICBpbnQgc2NhbjsKLQotICAgICAgLyogTG9vayBhbmQgc2VlIGlmIGl0J3MgYSBwb3NpdGlvbmFsIG9yIGtleXdvcmQgYXJnICovCi0gICAgICBzY2FuID0gaWR4OwotICAgICAgd2hpbGUgKHNjYW4gPCBpbi0+bGVuCi0JICAgICAmJiAhSVNTRVAgKGluLT5wdHJbc2Nhbl0pCi0JICAgICAmJiAhKG1hY3JvX21yaSAmJiBpbi0+cHRyW3NjYW5dID09ICdcJycpCi0JICAgICAmJiAoIW1hY3JvX2FsdGVybmF0ZSAmJiBpbi0+cHRyW3NjYW5dICE9ICc9JykpCi0Jc2NhbisrOwotICAgICAgaWYgKHNjYW4gPCBpbi0+bGVuICYmICFtYWNyb19hbHRlcm5hdGUgJiYgaW4tPnB0cltzY2FuXSA9PSAnPScpCi0JewotCSAgaXNfa2V5d29yZCA9IDE7Ci0KLQkgIC8qIEl0J3MgT0sgdG8gZ28gZnJvbSBwb3NpdGlvbmFsIHRvIGtleXdvcmQuICAqLwotCi0JICAvKiBUaGlzIGlzIGEga2V5d29yZCBhcmcsIGZldGNoIHRoZSBmb3JtYWwgbmFtZSBhbmQKLQkgICAgIHRoZW4gdGhlIGFjdHVhbCBzdHVmZiAqLwotCSAgc2JfcmVzZXQgKCZ0KTsKLQkgIGlkeCA9IGdldF90b2tlbiAoaWR4LCBpbiwgJnQpOwotCSAgaWYgKGluLT5wdHJbaWR4XSAhPSAnPScpCi0JICAgIHJldHVybiBfKCJjb25mdXNpb24gaW4gZm9ybWFsIHBhcmFtZXRlcnMiKTsKLQotCSAgLyogTG9va3VwIHRoZSBmb3JtYWwgaW4gdGhlIG1hY3JvJ3MgbGlzdCAqLwotCSAgcHRyID0gKGZvcm1hbF9lbnRyeSAqKSBoYXNoX2ZpbmQgKG0tPmZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKCZ0KSk7Ci0JICBpZiAoIXB0cikKLQkgICAgcmV0dXJuIF8oIm1hY3JvIGZvcm1hbCBhcmd1bWVudCBkb2VzIG5vdCBleGlzdCIpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSW5zZXJ0IHRoaXMgdmFsdWUgaW50byB0aGUgcmlnaHQgcGxhY2UgKi8KLQkgICAgICBzYl9yZXNldCAoJnB0ci0+YWN0dWFsKTsKLQkgICAgICBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4ICsgMSwgaW4sICZwdHItPmFjdHVhbCwgMCwgMCk7Ci0JICAgICAgaWYgKHB0ci0+YWN0dWFsLmxlbiA+IDApCi0JCSsrbmFyZzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcG9zaXRpb25hbCBhcmcgKi8KLQkgIGlzX3Bvc2l0aW9uYWwgPSAxOwotCSAgaWYgKGlzX2tleXdvcmQpCi0JICAgIHJldHVybiBfKCJjYW4ndCBtaXggcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmd1bWVudHMiKTsKLQotCSAgaWYgKCFmKQotCSAgICB7Ci0JICAgICAgZm9ybWFsX2VudHJ5ICoqcGY7Ci0JICAgICAgaW50IGM7Ci0KLQkgICAgICBpZiAoIW1hY3JvX21yaSkKLQkJcmV0dXJuIF8oInRvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzIik7Ci0KLQkgICAgICBmID0gKGZvcm1hbF9lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKGZvcm1hbF9lbnRyeSkpOwotCSAgICAgIHNiX25ldyAoJmYtPm5hbWUpOwotCSAgICAgIHNiX25ldyAoJmYtPmRlZik7Ci0JICAgICAgc2JfbmV3ICgmZi0+YWN0dWFsKTsKLQkgICAgICBmLT5uZXh0ID0gTlVMTDsKLQotCSAgICAgIGMgPSAtMTsKLQkgICAgICBmb3IgKHBmID0gJm0tPmZvcm1hbHM7ICpwZiAhPSBOVUxMOyBwZiA9ICYoKnBmKS0+bmV4dCkKLQkJaWYgKCgqcGYpLT5pbmRleCA+PSBjKQotCQkgIGMgPSAoKnBmKS0+aW5kZXggKyAxOwotCSAgICAgIGlmIChjID09IC0xKQotCQljID0gMDsKLQkgICAgICAqcGYgPSBmOwotCSAgICAgIGYtPmluZGV4ID0gYzsKLQkgICAgfQotCi0JICBzYl9yZXNldCAoJmYtPmFjdHVhbCk7Ci0JICBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4LCBpbiwgJmYtPmFjdHVhbCwgMSwgMCk7Ci0JICBpZiAoZi0+YWN0dWFsLmxlbiA+IDApCi0JICAgICsrbmFyZzsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBmID0gZi0+bmV4dDsKLQkgICAgfQotCSAgd2hpbGUgKGYgIT0gTlVMTCAmJiBmLT5pbmRleCA8IDApOwotCX0KLQotICAgICAgaWYgKCEgbWFjcm9fbXJpKQotCWlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJywnKQotCSAgICArK2lkeDsKLQkgIGlmIChJU1dISVRFIChpbi0+cHRyW2lkeF0pKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChtYWNyb19tcmkpCi0gICAgewotICAgICAgY2hhciBidWZmZXJbMjBdOwotCi0gICAgICBzYl9yZXNldCAoJnQpOwotICAgICAgc2JfYWRkX3N0cmluZyAoJnQsIG1hY3JvX3N0cmlwX2F0ID8gIiROQVJHIiA6ICJOQVJHIik7Ci0gICAgICBwdHIgPSAoZm9ybWFsX2VudHJ5ICopIGhhc2hfZmluZCAobS0+Zm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJnQpKTsKLSAgICAgIHNiX3Jlc2V0ICgmcHRyLT5hY3R1YWwpOwotICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCBuYXJnKTsKLSAgICAgIHNiX2FkZF9zdHJpbmcgKCZwdHItPmFjdHVhbCwgYnVmZmVyKTsKLSAgICB9Ci0KLSAgZXJyID0gbWFjcm9fZXhwYW5kX2JvZHkgKCZtLT5zdWIsIG91dCwgbS0+Zm9ybWFscywgbS0+Zm9ybWFsX2hhc2gsCi0JCQkgICBjb21tZW50X2NoYXIsIDEpOwotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgcmV0dXJuIGVycjsKLQotICAvKiBEaXNjYXJkIGFueSB1bm5hbWVkIGZvcm1hbCBhcmd1bWVudHMuICAqLwotICBpZiAobWFjcm9fbXJpKQotICAgIHsKLSAgICAgIGZvcm1hbF9lbnRyeSAqKnBmOwotCi0gICAgICBwZiA9ICZtLT5mb3JtYWxzOwotICAgICAgd2hpbGUgKCpwZiAhPSBOVUxMKQotCXsKLQkgIGlmICgoKnBmKS0+bmFtZS5sZW4gIT0gMCkKLQkgICAgcGYgPSAmKCpwZiktPm5leHQ7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzYl9raWxsICgmKCpwZiktPm5hbWUpOwotCSAgICAgIHNiX2tpbGwgKCYoKnBmKS0+ZGVmKTsKLQkgICAgICBzYl9raWxsICgmKCpwZiktPmFjdHVhbCk7Ci0JICAgICAgZiA9ICgqcGYpLT5uZXh0OwotCSAgICAgIGZyZWUgKCpwZik7Ci0JICAgICAgKnBmID0gZjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc2Jfa2lsbCAoJnQpOwotICBtYWNyb19udW1iZXIrKzsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQ2hlY2sgZm9yIGEgbWFjcm8uICBJZiBvbmUgaXMgZm91bmQsIHB1dCB0aGUgZXhwYW5zaW9uIGludG8KLSAgICpFWFBBTkQuICBDT01NRU5UX0NIQVIgaXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLS10aGlzIGlzIHVzZWQgYnkKLSAgIGdhc3AuICBSZXR1cm4gMSBpZiBhIG1hY3JvIGlzIGZvdW5kLCAwIG90aGVyd2lzZS4gICovCi0KLWludAotY2hlY2tfbWFjcm8gKGxpbmUsIGV4cGFuZCwgY29tbWVudF9jaGFyLCBlcnJvcikKLSAgICAgY29uc3QgY2hhciAqbGluZTsKLSAgICAgc2IgKmV4cGFuZDsKLSAgICAgaW50IGNvbW1lbnRfY2hhcjsKLSAgICAgY29uc3QgY2hhciAqKmVycm9yOwotewotICBjb25zdCBjaGFyICpzOwotICBjaGFyICpjb3B5LCAqY3M7Ci0gIG1hY3JvX2VudHJ5ICptYWNybzsKLSAgc2IgbGluZV9zYjsKLQotICBpZiAoISBpc2FscGhhICgodW5zaWduZWQgY2hhcikgKmxpbmUpCi0gICAgICAmJiAqbGluZSAhPSAnXycKLSAgICAgICYmICpsaW5lICE9ICckJwotICAgICAgJiYgKCEgbWFjcm9fbXJpIHx8ICpsaW5lICE9ICcuJykpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcyA9IGxpbmUgKyAxOwotICB3aGlsZSAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpzKQotCSB8fCAqcyA9PSAnXycKLQkgfHwgKnMgPT0gJyQnKQotICAgICsrczsKLQotICBjb3B5ID0gKGNoYXIgKikgYWxsb2NhIChzIC0gbGluZSArIDEpOwotICBtZW1jcHkgKGNvcHksIGxpbmUsIHMgLSBsaW5lKTsKLSAgY29weVtzIC0gbGluZV0gPSAnXDAnOwotICBmb3IgKGNzID0gY29weTsgKmNzICE9ICdcMCc7IGNzKyspCi0gICAgaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSAqY3MpKQotICAgICAgKmNzID0gdG9sb3dlciAoKmNzKTsKLQotICBtYWNybyA9IChtYWNyb19lbnRyeSAqKSBoYXNoX2ZpbmQgKG1hY3JvX2hhc2gsIGNvcHkpOwotCi0gIGlmIChtYWNybyA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIC8qIFdyYXAgdGhlIGxpbmUgdXAgaW4gYW4gc2IuICAqLwotICBzYl9uZXcgKCZsaW5lX3NiKTsKLSAgd2hpbGUgKCpzICE9ICdcMCcgJiYgKnMgIT0gJ1xuJyAmJiAqcyAhPSAnXHInKQotICAgIHNiX2FkZF9jaGFyICgmbGluZV9zYiwgKnMrKyk7Ci0KLSAgc2JfbmV3IChleHBhbmQpOwotICAqZXJyb3IgPSBtYWNyb19leHBhbmQgKDAsICZsaW5lX3NiLCBtYWNybywgZXhwYW5kLCBjb21tZW50X2NoYXIpOwotCi0gIHNiX2tpbGwgKCZsaW5lX3NiKTsKLQotICByZXR1cm4gMTsKLX0KLQotLyogRGVsZXRlIGEgbWFjcm8uICAqLwotCi12b2lkCi1kZWxldGVfbWFjcm8gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGhhc2hfZGVsZXRlIChtYWNyb19oYXNoLCBuYW1lKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgSVJQIGFuZCBJUlBDIHBzZXVkby1vcHMuICBUaGVzZSBhcmUgaGFuZGxlZCBhcyBhCi0gICBjb21iaW5lZCBtYWNybyBkZWZpbml0aW9uIGFuZCBleGVjdXRpb24uICBUaGlzIHJldHVybnMgTlVMTCBvbgotICAgc3VjY2Vzcywgb3IgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuICAqLwotCi1jb25zdCBjaGFyICoKLWV4cGFuZF9pcnAgKGlycGMsIGlkeCwgaW4sIG91dCwgZ2V0X2xpbmUsIGNvbW1lbnRfY2hhcikKLSAgICAgaW50IGlycGM7Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLSAgICAgaW50ICgqZ2V0X2xpbmUpIFBBUkFNUyAoKHNiICopKTsKLSAgICAgaW50IGNvbW1lbnRfY2hhcjsKLXsKLSAgY29uc3QgY2hhciAqbW47Ci0gIHNiIHN1YjsKLSAgZm9ybWFsX2VudHJ5IGY7Ci0gIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmg7Ci0gIGNvbnN0IGNoYXIgKmVycjsKLQotICBpZiAoaXJwYykKLSAgICBtbiA9ICJJUlBDIjsKLSAgZWxzZQotICAgIG1uID0gIklSUCI7Ci0KLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgc2JfbmV3ICgmc3ViKTsKLSAgaWYgKCEgYnVmZmVyX2FuZF9uZXN0IChtbiwgIkVORFIiLCAmc3ViLCBnZXRfbGluZSkpCi0gICAgcmV0dXJuIF8oInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gaXJwIG9yIGlycGMiKTsKLSAgCi0gIHNiX25ldyAoJmYubmFtZSk7Ci0gIHNiX25ldyAoJmYuZGVmKTsKLSAgc2JfbmV3ICgmZi5hY3R1YWwpOwotCi0gIGlkeCA9IGdldF90b2tlbiAoaWR4LCBpbiwgJmYubmFtZSk7Ci0gIGlmIChmLm5hbWUubGVuID09IDApCi0gICAgcmV0dXJuIF8oIm1pc3NpbmcgbW9kZWwgcGFyYW1ldGVyIik7Ci0KLSAgaCA9IGhhc2hfbmV3ICgpOwotICBlcnIgPSBoYXNoX2phbSAoaCwgc2JfdGVybWluYXRlICgmZi5uYW1lKSwgJmYpOwotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgcmV0dXJuIGVycjsKLQotICBmLmluZGV4ID0gMTsKLSAgZi5uZXh0ID0gTlVMTDsKLQotICBzYl9yZXNldCAob3V0KTsKLQotICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgaWYgKGlkeCA+PSBpbi0+bGVuIHx8IGluLT5wdHJbaWR4XSA9PSBjb21tZW50X2NoYXIpCi0gICAgewotICAgICAgLyogRXhwYW5kIG9uY2Ugd2l0aCBhIG51bGwgc3RyaW5nLiAgKi8KLSAgICAgIGVyciA9IG1hY3JvX2V4cGFuZF9ib2R5ICgmc3ViLCBvdXQsICZmLCBoLCBjb21tZW50X2NoYXIsIDApOwotICAgICAgaWYgKGVyciAhPSBOVUxMKQotCXJldHVybiBlcnI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGlycGMgJiYgaW4tPnB0cltpZHhdID09ICciJykKLQkrK2lkeDsKLSAgICAgIHdoaWxlIChpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSAhPSBjb21tZW50X2NoYXIpCi0JewotCSAgaWYgKCFpcnBjKQotCSAgICBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4LCBpbiwgJmYuYWN0dWFsLCAxLCAwKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInKQotCQl7Ci0JCSAgaW50IG54dDsKLQotCQkgIG54dCA9IHNiX3NraXBfd2hpdGUgKGlkeCArIDEsIGluKTsKLQkJICBpZiAobnh0ID49IGluLT5sZW4gfHwgaW4tPnB0cltueHRdID09IGNvbW1lbnRfY2hhcikKLQkJICAgIHsKLQkJICAgICAgaWR4ID0gbnh0OwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIHNiX3Jlc2V0ICgmZi5hY3R1YWwpOwotCSAgICAgIHNiX2FkZF9jaGFyICgmZi5hY3R1YWwsIGluLT5wdHJbaWR4XSk7Ci0JICAgICAgKytpZHg7Ci0JICAgIH0KLQkgIGVyciA9IG1hY3JvX2V4cGFuZF9ib2R5ICgmc3ViLCBvdXQsICZmLCBoLCBjb21tZW50X2NoYXIsIDApOwotCSAgaWYgKGVyciAhPSBOVUxMKQotCSAgICByZXR1cm4gZXJyOwotCSAgaWYgKCFpcnBjKQotCSAgICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLQkgIGVsc2UKLQkgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0JfQotICAgIH0KLQotICBoYXNoX2RpZSAoaCk7Ci0gIHNiX2tpbGwgKCZzdWIpOwotCi0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL21hY3JvLmggYi9nYXMvbWFjcm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlZWE0YS4uMDAwMDAwMAotLS0gYS9nYXMvbWFjcm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qIG1hY3JvLmggLSBoZWFkZXIgZmlsZSBmb3IgbWFjcm8gc3VwcG9ydCBmb3IgZ2FzIGFuZCBnYXNwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgYW5kIEp1ZHkgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsCi0gICAgICBzYWNAY3lnbnVzLmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZm5kZWYgTUFDUk9fSAotCi0jZGVmaW5lIE1BQ1JPX0gKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAic2IuaCIKLQotLyogV2hldGhlciBhbnkgbWFjcm9zIGhhdmUgYmVlbiBkZWZpbmVkLiAgKi8KLQotZXh0ZXJuIGludCBtYWNyb19kZWZpbmVkOwotCi0vKiBUaGUgbWFjcm8gbmVzdGluZyBsZXZlbC4gICovCi0KLWV4dGVybiBpbnQgbWFjcm9fbmVzdDsKLQotZXh0ZXJuIGludCBidWZmZXJfYW5kX25lc3QKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHNiICosIGludCAoKikgUEFSQU1TICgoc2IgKikpKSk7Ci1leHRlcm4gdm9pZCBtYWNyb19pbml0Ci0gIFBBUkFNUyAoKGludCBhbHRlcm5hdGUsIGludCBtcmksIGludCBzdHJpcF9hdCwKLQkgICBpbnQgKCopIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBzYiAqLCBpbnQgKikpKSk7Ci1leHRlcm4gdm9pZCBtYWNyb19tcmlfbW9kZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBjb25zdCBjaGFyICpkZWZpbmVfbWFjcm8KLSAgUEFSQU1TICgoaW50IGlkeCwgc2IgKmluLCBzYiAqbGFiZWwsIGludCAoKmdldF9saW5lKSBQQVJBTVMgKChzYiAqKSksCi0JICAgY29uc3QgY2hhciAqKm5hbWVwKSk7Ci1leHRlcm4gaW50IGNoZWNrX21hY3JvIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc2IgKiwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1leHRlcm4gdm9pZCBkZWxldGVfbWFjcm8gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqZXhwYW5kX2lycAotICBQQVJBTVMgKChpbnQsIGludCwgc2IgKiwgc2IgKiwgaW50ICgqKSBQQVJBTVMgKChzYiAqKSksIGludCkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9tYWtlZmlsZS52bXMgYi9nYXMvbWFrZWZpbGUudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGMzMGQ0Li4wMDAwMDAwCi0tLSBhL2dhcy9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIwotIyBtYWtlZmlsZSBmb3IgZ2FzCi0jCi0jIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmLCBra2FlbXBmQHByb2dpcy5kZQotIwotQ0M9Z2NjCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotaWZlcSAoJChDQyksZ2NjKQotREVGUz0KLUNGTEFHUz0vaW5jbHVkZT0oW10sWy0uYmZkXSxbLmNvbmZpZ10sWy0uaW5jbHVkZV0sWy1dKSQoREVGUykKLUxGTEFHUz0KLUxJQlM9LEdOVV9DQ19MSUJSQVJZOmxpYmdjYy9saWIsc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYixHTlVfQ0NfTElCUkFSWTpjcnQwLm9iagotZWxzZQotREVGUz0vZGVmaW5lPSgidGFibGVfc2l6ZV9vZl9mbG9udW1fcG93ZXJzX29mX3RlbiI9InRhYnNpel9mbG9udW1fcG93ZXJzX29mX3RlbiIsXAotIl9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3ciPSJfYmZkX2dlbmVyaWNfZ2V0X3dpbl9zZWN0aW9uX2NvbnQiLFwKLSJfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiI9Il9iZmRfZWxmX3NlY19mcm9tX2JmZF9zZWMiLCJjb25zdD0iKQotQ0ZMQUdTPS9ub29wdC9ub2RlYnVnL2luY2x1ZGU9KFtdLFstLmJmZF0sWy5jb25maWddLFstLmluY2x1ZGVdLFstXSkkKERFRlMpXAotL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLHB0cm1pc21hdGNoLHVuZGVmZXNjYXAsbG9uZ2V4dGVybixkdXB0eXBlc3BlYykKLUxGTEFHUz0KLUxJQlM9LHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIKLWVuZGlmCi0KLWVsc2UJIyBBUkNIIG5vdCBBTFBIQQotCi1pZmVxICgkKENDKSxnY2MpCi1ERUZTPQotQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLmNvbmZpZ10sWy0uaW5jbHVkZV0sWy1dKSQoREVGUykKLUxGTEFHUz0KLUxJQlM9LEdOVV9DQ19MSUJSQVJZOmxpYmdjYy9saWIsc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYixHTlVfQ0NfTElCUkFSWTpjcnRiZWdpbi5vYmosR05VX0NDX0xJQlJBUlk6Y3J0ZW5kLm9iagotI0xJQlM9LGdudV9jYzpbMDAwMDAwXWdjY2xpYi5vbGIvbGliLHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIKLWVsc2UKLWVycm9yIERFQ0MgaXMgYnJva2VuIG9uIFZBWAotREVGUz0vZGVmaW5lPSgidGFibGVfc2l6ZV9vZl9mbG9udW1fcG93ZXJzX29mX3RlbiI9InRhYnNpel9mbG9udW1fcG93ZXJzX29mX3RlbiIsImNvbnN0PSIpCi1DRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFsuY29uZmlnXSxbLS5pbmNsdWRlXSxbLV0pJChERUZTKVwKLS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYyxwdHJtaXNtYXRjaCx1bmRlZmVzY2FwLGxvbmdleHRlcm4sZHVwdHlwZXNwZWMpCi1MRkxBR1M9Ci1MSUJTPSxzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCi1lbmRpZgotZW5kaWYKLQotCi1PQkpTPXRhcmctY3B1Lm9iaixvYmotZm9ybWF0Lm9iaixhdG9mLXRhcmcub2JqLGFwcC5vYmosYXMub2JqLGF0b2YtZ2VuZXJpYy5vYmosXAotICBiaWdudW0tY29weS5vYmosY29uZC5vYmosZGVwZW5kLm9iaixleHByLm9iaixmbG9udW0ta29uc3Qub2JqLGZsb251bS1jb3B5Lm9iaixcCi0gIGZsb251bS1tdWx0Lm9iaixmcmFncy5vYmosaGFzaC5vYmosaW5wdXQtZmlsZS5vYmosaW5wdXQtc2NydWIub2JqLFwKLSAgbGl0ZXJhbC5vYmosbWVzc2FnZXMub2JqLG91dHB1dC1maWxlLm9iaixyZWFkLm9iaixzdWJzZWdzLm9iaixzeW1ib2xzLm9iaixcCi0gIHdyaXRlLm9iaixsaXN0aW5nLm9iaixlY29mZi5vYmosc3RhYnMub2JqLHNiLm9iaixtYWNyby5vYmosZWhvcHQub2JqCi0KLUdBU1BPQkpTID0gZ2FzcC5vYmosbWFjcm8ub2JqLHNiLm9iaixoYXNoLm9iagotCi1MSUJJQkVSVFkgPSBbLS5saWJpYmVydHldbGliaWJlcnR5Lm9sYgotCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotTElCQkZEID0gWy0uYmZkXWxpYmJmZC5vbGIKLUxJQk9QQ09ERVMgPSBbLS5vcGNvZGVzXWxpYm9wY29kZXMub2xiCi1CRkRERVAgPSBbLS5iZmRdYmZkLmgKLWVsc2UKLUxJQkJGRCA9Ci1MSUJPUENPREVTID0KLUJGRERFUCA9Ci1lbmRpZgotCi1hbGw6IGNvbmZpZy5zdGF0dXMgJChCRkRERVApIGFzLmV4ZSBnYXNwLmV4ZQotCi1hcy5leGU6ICQoT0JKUykgJChMSUJPUENPREVTKSAkKExJQkJGRCkgJChMSUJJQkVSVFkpCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotCWxpbmskKExGTEFHUykvZXhlPSRAICQoT0JKUyksJChMSUJPUENPREVTKS9saWIsJChMSUJCRkQpL2xpYiwkKExJQklCRVJUWSkvbGliJChMSUJTKQotZWxzZQotCWxpbmskKExGTEFHUykvZXhlPSRAICQoT0JKUyksJChMSUJJQkVSVFkpL2xpYiQoTElCUykKLWVuZGlmCi0KLWdhc3AuZXhlOiAkKEdBU1BPQkpTKSAkKExJQkJGRCkgJChMSUJJQkVSVFkpCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotCWxpbmskKExGTEFHUykvZXhlPSRAICQoR0FTUE9CSlMpLCQoTElCQkZEKS9saWIsJChMSUJJQkVSVFkpL2xpYiQoTElCUykKLWVsc2UKLQlsaW5rJChMRkxBR1MpL2V4ZT0kQCAkKEdBU1BPQkpTKSwkKExJQklCRVJUWSkvbGliJChMSUJTKQotZW5kaWYKLQotY29uZmlnLnN0YXR1czoKLQkkJCBAY29uZmlnLWdhcwotCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotQ1BVPWFscGhhCi1PQkpGT1JNQVQ9ZXZheAotRkxURk9STUFUPWllZWUKLWVsc2UKLUNQVT12YXgKLU9CSkZPUk1BVD12bXMKLUZMVEZPUk1BVD12YXgKLWVuZGlmCi0KLXRhcmctY3B1LmM6IFsuY29uZmlnXXRjLSQoQ1BVKS5jCi0JY29weSAkPCAkQAotdGFyZy1jcHUuaDogWy5jb25maWdddGMtJChDUFUpLmgKLQljb3B5ICQ8ICRACi10YXJnLWVudi5oOiBbLmNvbmZpZ110ZS1nZW5lcmljLmgKLQljb3B5ICQ8ICRACi1vYmotZm9ybWF0Lmg6IFsuY29uZmlnXW9iai0kKE9CSkZPUk1BVCkuaAotCWNvcHkgJDwgJEAKLW9iai1mb3JtYXQuYzogWy5jb25maWddb2JqLSQoT0JKRk9STUFUKS5jCi0JY29weSAkPCAkQAotYXRvZi10YXJnLmM6IFsuY29uZmlnXWF0b2YtJChGTFRGT1JNQVQpLmMKLQljb3B5ICQ8ICRACi0KLXRhcmctY3B1Lm9iajogdGFyZy1jcHUuYyB0YXJnLWNwdS5oIFsuY29uZmlnXWF0b2YtdmF4LmMKLQotWy0uYmZkXWJmZC5oOgotCSQoQ0QpIFstLmJmZF0KLQlnbWFrZSAtZiBtYWtlZmlsZS52bXMgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLmdhc10KLQotaW5zdGFsbDogYXMuZXhlIGdhc3AuZXhlCi0JJChDUCkgJF4gR05VX1JPT1RcOltCSU5dCi0KLWNsZWFuOgotCSQkIHB1cmdlCi0JJChSTSkgKi5vYmo7Ci0JJChSTSkgKi5leGU7Ci0JJChSTSkgYXRvZi10YXJnLmM7Ci0JJChSTSkgb2JqLWZvcm1hdC5jOwotCSQoUk0pIG9iai1mb3JtYXQuaDsKLQkkKFJNKSB0YXJnLWVudi5oOwotCSQoUk0pIHRhcmctY3B1Lmg7Ci0JJChSTSkgdGFyZy1jcHUuYzsKLQkkKFJNKSBjb25maWcuc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZ2FzL21lc3NhZ2VzLmMgYi9nYXMvbWVzc2FnZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiN2FkMC4uMDAwMDAwMAotLS0gYS9nYXMvbWVzc2FnZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDU0MSArMCwwIEBACi0vKiBtZXNzYWdlcy5jIC0gZXJyb3IgcmVwb3J0ZXIgLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX0VSUk5PX0gKLSNpbmNsdWRlIDxlcnJuby5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfU1REQVJHCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9WQVJBUkdTCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoVVNFX1NUREFSRykgJiYgIWRlZmluZWQgKFVTRV9WQVJBUkdTKQotLyogUm9sbCBvdXIgb3duLiAgKi8KLSNkZWZpbmUgdmFfYWxpc3QgUkVTVAotI2RlZmluZSB2YV9kY2wKLXR5cGVkZWYgaW50ICogdmFfbGlzdDsKLSNkZWZpbmUgdmFfc3RhcnQoQVJHUykJQVJHUyA9ICZSRVNUCi0jZGVmaW5lIHZhX2VuZChBUkdTKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGlkZW50aWZ5IFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgYXNfc2hvd193aGVyZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBhc193YXJuX2ludGVybmFsIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgaW50LCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGFzX2JhZF9pbnRlcm5hbCBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGludCwgY2hhciAqKSk7Ci0KLS8qCi0gKiBEZXNwaXRlIHRoZSByZXN0IG9mIHRoZSBjb21tZW50cyBpbiB0aGlzIGZpbGUsIChGSVhNRS1TT09OKSwKLSAqIGhlcmUgaXMgdGhlIGN1cnJlbnQgc2NoZW1lIGZvciBlcnJvciBtZXNzYWdlcyBldGM6Ci0gKgotICogYXNfZmF0YWwoKSBpcyB1c2VkIHdoZW4gZ2FzIGlzIHF1aXRlIGNvbmZ1c2VkIGFuZAotICogY29udGludWluZyB0aGUgYXNzZW1ibHkgaXMgcG9pbnRsZXNzLiAgSW4gdGhpcyBjYXNlIHdlCi0gKiBleGl0IGltbWVkaWF0ZWx5IHdpdGggZXJyb3Igc3RhdHVzLgotICoKLSAqIGFzX2JhZCgpIGlzIHVzZWQgdG8gbWFyayBlcnJvcnMgdGhhdCByZXN1bHQgaW4gd2hhdCB3ZQotICogcHJlc3VtZSB0byBiZSBhIHVzZWxlc3Mgb2JqZWN0IGZpbGUuICBTYXksIHdlIGlnbm9yZWQKLSAqIHNvbWV0aGluZyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiB2aXRhbC4gIElmIHdlIHNlZSBhbnkgb2YKLSAqIHRoZXNlLCBhc3NlbWJseSB3aWxsIGNvbnRpbnVlIHRvIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSwKLSAqIG5vIG9iamVjdCBmaWxlIHdpbGwgYmUgcHJvZHVjZWQsIGFuZCB3ZSB3aWxsIHRlcm1pbmF0ZQotICogd2l0aCBlcnJvciBzdGF0dXMuICBUaGUgbmV3IG9wdGlvbiwgLVosIHRlbGxzIHVzIHRvCi0gKiBwcm9kdWNlIGFuIG9iamVjdCBmaWxlIGFueXdheSBidXQgd2Ugc3RpbGwgZXhpdCB3aXRoCi0gKiBlcnJvciBzdGF0dXMuICBUaGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgeW91IGRvbid0IHdhbnQKLSAqIHRoaXMgb2JqZWN0IGZpbGUgYnV0IHdlIGNvdWxkIGJlIHdyb25nLgotICoKLSAqIGFzX3dhcm4oKSBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBhbiBlcnJvciBmcm9tIHdoaWNoIHdlCi0gKiBoYXZlIGEgcGxhdXNpYmxlIGVycm9yIHJlY292ZXJ5LiAgZWcsIG1hc2tpbmcgdGhlIHRvcAotICogYml0cyBvZiBhIGNvbnN0YW50IHRoYXQgaXMgbG9uZ2VyIHRoYW4gd2lsbCBmaXQgaW4gdGhlCi0gKiBkZXN0aW5hdGlvbi4gIEluIHRoaXMgY2FzZSB3ZSB3aWxsIGNvbnRpbnVlIHRvIGFzc2VtYmxlCi0gKiB0aGUgc291cmNlLCBhbHRob3VnaCB3ZSBtYXkgaGF2ZSBtYWRlIGEgYmFkIGFzc3VtcHRpb24sCi0gKiBhbmQgd2Ugd2lsbCBwcm9kdWNlIGFuIG9iamVjdCBmaWxlIGFuZCByZXR1cm4gbm9ybWFsIGV4aXQKLSAqIHN0YXR1cyAoaWUsIG5vIGVycm9yKS4gIFRoZSBuZXcgb3B0aW9uIC1YIHRlbGxzIHVzIHRvCi0gKiB0cmVhdCBhbGwgYXNfd2FybigpIGVycm9ycyBhcyBhc19iYWQoKSBlcnJvcnMuICBUaGF0IGlzLAotICogbm8gb2JqZWN0IGZpbGUgd2lsbCBiZSBwcm9kdWNlZCBhbmQgd2Ugd2lsbCBleGl0IHdpdGgKLSAqIGVycm9yIHN0YXR1cy4gIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCB3ZSBkb24ndCBraWxsIGFuCi0gKiBlbnRpcmUgbWFrZSBiZWNhdXNlIG9mIGFuIGVycm9yIHRoYXQgd2Uga25ldyBob3cgdG8KLSAqIGNvcnJlY3QuICBPbiB0aGUgb3RoZXIgaGFuZCwgc29tZXRpbWVzIHlvdSBtaWdodCB3YW50IHRvCi0gKiBzdG9wIHRoZSBtYWtlIGF0IHRoZXNlIHBvaW50cy4KLSAqCi0gKiBhc190c2t0c2soKSBpcyB1c2VkIHdoZW4gd2Ugc2VlIGEgbWlub3IgZXJyb3IgZm9yIHdoaWNoCi0gKiBvdXIgZXJyb3IgcmVjb3ZlcnkgYWN0aW9uIGlzIGFsbW9zdCBjZXJ0YWlubHkgY29ycmVjdC4KLSAqIEluIHRoaXMgY2FzZSwgd2UgcHJpbnQgYSBtZXNzYWdlIGFuZCB0aGVuIGFzc2VtYmx5Ci0gKiBjb250aW51ZXMgYXMgdGhvdWdoIG5vIGVycm9yIG9jY3VycmVkLgotICovCi0KLXN0YXRpYyB2b2lkCi1pZGVudGlmeSAoZmlsZSkKLSAgICAgY2hhciAqZmlsZTsKLXsKLSAgc3RhdGljIGludCBpZGVudGlmaWVkOwotICBpZiAoaWRlbnRpZmllZCkKLSAgICByZXR1cm47Ci0gIGlkZW50aWZpZWQrKzsKLQotICBpZiAoIWZpbGUpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHg7Ci0gICAgICBhc193aGVyZSAoJmZpbGUsICZ4KTsKLSAgICB9Ci0KLSAgaWYgKGZpbGUpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIGZpbGUpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIkFzc2VtYmxlciBtZXNzYWdlczpcbiIpKTsKLX0KLQotc3RhdGljIGludCB3YXJuaW5nX2NvdW50OwkvKiBDb3VudCBvZiBudW1iZXIgb2Ygd2FybmluZ3MgaXNzdWVkICovCi0KLWludCAKLWhhZF93YXJuaW5ncyAoKQotewotICByZXR1cm4gKHdhcm5pbmdfY291bnQpOwotfQotCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIGhpdCBhICdiYWQgZXJyb3InLCBhbmQgc2hvdWxkIG5vdCB3cml0ZSBhbiBvYmogZmlsZSwKLSAgIGFuZCBleGl0IHdpdGggYSBub256ZXJvIGVycm9yIGNvZGUgKi8KLQotc3RhdGljIGludCBlcnJvcl9jb3VudDsKLQotaW50IAotaGFkX2Vycm9ycyAoKQotewotICByZXR1cm4gKGVycm9yX2NvdW50KTsKLX0KLQotCi0vKiBQcmludCB0aGUgY3VycmVudCBsb2NhdGlvbiB0byBzdGRlcnIuICAqLwotCi1zdGF0aWMgdm9pZAotYXNfc2hvd193aGVyZSAoKQotewotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLQotICBhc193aGVyZSAoJmZpbGUsICZsaW5lKTsKLSAgaWRlbnRpZnkgKGZpbGUpOwotICBpZiAoZmlsZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczoldTogIiwgZmlsZSwgbGluZSk7Ci19Ci0KLS8qCi0gKgkJCWEgcyBfIHAgZSByIHIgbyByCi0gKgotICogTGlrZSBwZXJyb3IoMyksIGJ1dCB3aXRoIG1vcmUgaW5mby4KLSAqLwotCi12b2lkIAotYXNfcGVycm9yIChncmlwZSwgZmlsZW5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmdyaXBlOwkJLyogVW5wdW5jdHVhdGVkIGVycm9yIHRoZW1lLiAqLwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqZXJydHh0OwotCi0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgZ3JpcGUsIGZpbGVuYW1lKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGVycnR4dCA9IGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpOwotI2Vsc2UKLSAgZXJydHh0ID0geHN0cmVycm9yIChlcnJubyk7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3RkZXJyLCAiOiAlc1xuIiwgZXJydHh0KTsKLSAgZXJybm8gPSAwOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLSNlbmRpZgotfQotCi0vKgotICoJCQlhIHMgXyB0IHMgayB0IHMgayAoKQotICoKLSAqIFNlbmQgdG8gc3RkZXJyIGEgc3RyaW5nIGFzIGEgd2FybmluZywgYW5kIGxvY2F0ZSB3YXJuaW5nCi0gKiBpbiBpbnB1dCBmaWxlKHMpLgotICogUGxlYXNlIG9ubHkgdXNlIHRoaXMgZm9yIHdoZW4gd2UgaGF2ZSBzb21lIHJlY292ZXJ5IGFjdGlvbi4KLSAqIFBsZWFzZSBleHBsYWluIGluIHN0cmluZyAod2hpY2ggbWF5IGhhdmUgJ1xuJ3MpIHdoYXQgcmVjb3Zlcnkgd2FzIGRvbmUuCi0gKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXZvaWQgCi1hc190c2t0c2sgKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICBhc19zaG93X3doZXJlICgpOwotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Ci19CQkJCS8qIGFzX3Rza3RzaygpICovCi0jZWxzZQotdm9pZCAKLWFzX3Rza3RzayAoZm9ybWF0LCB2YV9hbGlzdCkKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9kY2wKLXsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Ci19CQkJCS8qIGFzX3Rza3RzaygpICovCi0jZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLwotCi0vKiBUaGUgY29tbW9uIHBvcnRpb24gb2YgYXNfd2FybiBhbmQgYXNfd2Fybl93aGVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1hc193YXJuX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpCi0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICBjaGFyICpidWZmZXI7Ci17Ci0gICsrd2FybmluZ19jb3VudDsKLQotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotCi0gIGlkZW50aWZ5IChmaWxlKTsKLSAgaWYgKGZpbGUpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXU6ICIsIGZpbGUsIGxpbmUpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIldhcm5pbmc6ICIpKTsKLSAgZnB1dHMgKGJ1ZmZlciwgc3RkZXJyKTsKLSAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Ci0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgbGlzdGluZ193YXJuaW5nIChidWZmZXIpOwotI2VuZGlmCi19Ci0KLS8qCi0gKgkJCWEgcyBfIHcgYSByIG4gKCkKLSAqCi0gKiBTZW5kIHRvIHN0ZGVyciBhIHN0cmluZyBhcyBhIHdhcm5pbmcsIGFuZCBsb2NhdGUgd2FybmluZwotICogaW4gaW5wdXQgZmlsZShzKS4KLSAqIFBsZWFzZSBvbmx5IHVzZSB0aGlzIGZvciB3aGVuIHdlIGhhdmUgc29tZSByZWNvdmVyeSBhY3Rpb24uCi0gKiBQbGVhc2UgZXhwbGFpbiBpbiBzdHJpbmcgKHdoaWNoIG1heSBoYXZlICdcbidzKSB3aGF0IHJlY292ZXJ5IHdhcyBkb25lLgotICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi12b2lkIAotYXNfd2FybiAoY29uc3QgY2hhciAqZm9ybWF0LC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICBpZiAoIWZsYWdfbm9fd2FybmluZ3MpCi0gICAgewotICAgICAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gICAgICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICAgIGFzX3dhcm5faW50ZXJuYWwgKChjaGFyICopIE5VTEwsIDAsIGJ1ZmZlcik7Ci0gICAgfQotfQkJCQkvKiBhc193YXJuKCkgKi8KLSNlbHNlCi0vKlZBUkFSR1MxICovCi12b2lkIAotYXNfd2FybiAoZm9ybWF0LCB2YV9hbGlzdCkKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9kY2wKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICBpZiAoIWZsYWdfbm9fd2FybmluZ3MpCi0gICAgewotICAgICAgdmFfc3RhcnQgKGFyZ3MpOwotICAgICAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgICAgIHZhX2VuZCAoYXJncyk7Ci0gICAgICBhc193YXJuX2ludGVybmFsICgoY2hhciAqKSBOVUxMLCAwLCBidWZmZXIpOwotICAgIH0KLX0JCQkJLyogYXNfd2FybigpICovCi0jZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLwotCi0vKiBhc193YXJuX3doZXJlLCBsaWtlIGFzX2JhZCBidXQgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgYXJlCi0gICBwYXNzZWQgaW4uICBVbmZvcnR1bmF0ZWx5LCB3ZSBoYXZlIHRvIHJlcGVhdCB0aGUgZnVuY3Rpb24gaW4gb3JkZXIKLSAgIHRvIGhhbmRsZSB0aGUgdmFyYXJncyBjb3JyZWN0bHkgYW5kIHBvcnRhYmx5LiAgKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXZvaWQgCi1hc193YXJuX3doZXJlIChjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm9ybWF0LC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICBpZiAoIWZsYWdfbm9fd2FybmluZ3MpCi0gICAgewotICAgICAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gICAgICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICAgIGFzX3dhcm5faW50ZXJuYWwgKGZpbGUsIGxpbmUsIGJ1ZmZlcik7Ci0gICAgfQotfQkJCQkvKiBhc193YXJuKCkgKi8KLSNlbHNlCi0vKlZBUkFSR1MxICovCi12b2lkIAotYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgZm9ybWF0LCB2YV9hbGlzdCkKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgaWYgKCFmbGFnX25vX3dhcm5pbmdzKQotICAgIHsKLSAgICAgIHZhX3N0YXJ0IChhcmdzKTsKLSAgICAgIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gICAgICB2YV9lbmQgKGFyZ3MpOwotICAgICAgYXNfd2Fybl9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKTsKLSAgICB9Ci19CQkJCS8qIGFzX3dhcm4oKSAqLwotI2VuZGlmIC8qIG5vdCBOT19TVERBUkcgKi8KLQotLyogVGhlIGNvbW1vbiBwb3J0aW9uIG9mIGFzX2JhZCBhbmQgYXNfYmFkX3doZXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFzX2JhZF9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKQotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgY2hhciAqYnVmZmVyOwotewotICArK2Vycm9yX2NvdW50OwotCi0gIGlmIChmaWxlID09IE5VTEwpCi0gICAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0KLSAgaWRlbnRpZnkgKGZpbGUpOwotICBpZiAoZmlsZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczoldTogIiwgZmlsZSwgbGluZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiRXJyb3I6ICIpKTsKLSAgZnB1dHMgKGJ1ZmZlciwgc3RkZXJyKTsKLSAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Ci0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgbGlzdGluZ19lcnJvciAoYnVmZmVyKTsKLSNlbmRpZgotfQotCi0vKgotICoJCQlhIHMgXyBiIGEgZCAoKQotICoKLSAqIFNlbmQgdG8gc3RkZXJyIGEgc3RyaW5nIGFzIGEgd2FybmluZywgYW5kIGxvY2F0ZSB3YXJuaW5nIGluIGlucHV0IGZpbGUocykuCi0gKiBQbGVhc2UgdXMgd2hlbiB0aGVyZSBpcyBubyByZWNvdmVyeSwgYnV0IHdlIHdhbnQgdG8gY29udGludWUgcHJvY2Vzc2luZwotICogYnV0IG5vdCBwcm9kdWNlIGFuIG9iamVjdCBmaWxlLgotICogUGxlYXNlIGV4cGxhaW4gaW4gc3RyaW5nICh3aGljaCBtYXkgaGF2ZSAnXG4ncykgd2hhdCByZWNvdmVyeSB3YXMgZG9uZS4KLSAqLwotCi0jaWZkZWYgVVNFX1NUREFSRwotdm9pZCAKLWFzX2JhZCAoY29uc3QgY2hhciAqZm9ybWF0LC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLQotICBhc19iYWRfaW50ZXJuYWwgKChjaGFyICopIE5VTEwsIDAsIGJ1ZmZlcik7Ci19Ci0KLSNlbHNlCi0vKlZBUkFSR1MxICovCi12b2lkIAotYXNfYmFkIChmb3JtYXQsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2RjbAotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLQotICBhc19iYWRfaW50ZXJuYWwgKChjaGFyICopIE5VTEwsIDAsIGJ1ZmZlcik7Ci19Ci0jZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLwotCi0vKiBhc19iYWRfd2hlcmUsIGxpa2UgYXNfYmFkIGJ1dCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBhcmUKLSAgIHBhc3NlZCBpbi4gIFVuZm9ydHVuYXRlbHksIHdlIGhhdmUgdG8gcmVwZWF0IHRoZSBmdW5jdGlvbiBpbiBvcmRlcgotICAgdG8gaGFuZGxlIHRoZSB2YXJhcmdzIGNvcnJlY3RseSBhbmQgcG9ydGFibHkuICAqLwotCi0jaWZkZWYgVVNFX1NUREFSRwotdm9pZCAKLWFzX2JhZF93aGVyZSAoY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0KLSAgYXNfYmFkX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpOwotfQotCi0jZWxzZQotLypWQVJBUkdTMSAqLwotdm9pZCAKLWFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgZm9ybWF0LCB2YV9hbGlzdCkKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgdmFfc3RhcnQgKGFyZ3MpOwotICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotCi0gIGFzX2JhZF9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKTsKLX0KLSNlbmRpZiAvKiBub3QgTk9fU1REQVJHICovCi0KLS8qCi0gKgkJCWEgcyBfIGYgYSB0IGEgbCAoKQotICoKLSAqIFNlbmQgdG8gc3RkZXJyIGEgc3RyaW5nIGFzIGEgZmF0YWwgbWVzc2FnZSwgYW5kIHByaW50IGxvY2F0aW9uIG9mIGVycm9yIGluCi0gKiBpbnB1dCBmaWxlKHMpLgotICogUGxlYXNlIG9ubHkgdXNlIHRoaXMgZm9yIHdoZW4gd2UgRE9OJ1QgaGF2ZSBzb21lIHJlY292ZXJ5IGFjdGlvbi4KLSAqIEl0IHhleGl0KClzIHdpdGggYSB3YXJuaW5nIHN0YXR1cy4KLSAqLwotCi0jaWZkZWYgVVNFX1NUREFSRwotdm9pZCAKLWFzX2ZhdGFsIChjb25zdCBjaGFyICpmb3JtYXQsLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiRmF0YWwgZXJyb3I6ICIpKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKLSAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHhleGl0IChFWElUX0ZBSUxVUkUpOwotfQkJCQkvKiBhc19mYXRhbCgpICovCi0jZWxzZQotLypWQVJBUkdTMSovCi12b2lkIAotYXNfZmF0YWwgKGZvcm1hdCwgdmFfYWxpc3QpCi0gICAgIGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICBhc19zaG93X3doZXJlICgpOwotICB2YV9zdGFydCAoYXJncyk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiRmF0YWwgZXJyb3I6ICIpKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKLSAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHhleGl0IChFWElUX0ZBSUxVUkUpOwotfQkJCQkvKiBhc19mYXRhbCgpICovCi0jZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLwotCi0vKgotICogYXNfYXNzZXJ0OiBJbmRpY2F0ZSBhc3NlcnRpb24gZmFpbHVyZS4KLSAqIEFyZ3VtZW50czogRmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBvcHRpb25hbCBmdW5jdGlvbiBuYW1lLgotICovCi0KLXZvaWQKLWFzX2Fzc2VydCAoZmlsZSwgbGluZSwgZm4pCi0gICAgIGNvbnN0IGNoYXIgKmZpbGUsICpmbjsKLSAgICAgaW50IGxpbmU7Ci17Ci0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiSW50ZXJuYWwgZXJyb3IhXG4iKSk7Ci0gIGlmIChmbikKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIkFzc2VydGlvbiBmYWlsdXJlIGluICVzIGF0ICVzIGxpbmUgJWQuXG4iKSwKLQkgICAgIGZuLCBmaWxlLCBsaW5lKTsKLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiQXNzZXJ0aW9uIGZhaWx1cmUgYXQgJXMgbGluZSAlZC5cbiIpLCBmaWxlLCBsaW5lKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIikpOwotICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLX0KLQotLyogYXNfYWJvcnQ6IFByaW50IGEgZnJpZW5kbHkgbWVzc2FnZSBzYXlpbmcgaG93IHRvdGFsbHkgaG9zZWQgd2UgYXJlLAotICAgYW5kIGV4aXQgd2l0aG91dCBwcm9kdWNpbmcgYSBjb3JlIGZpbGUuICAqLwotdm9pZAotYXNfYWJvcnQgKGZpbGUsIGxpbmUsIGZuKQotICAgICBjb25zdCBjaGFyICpmaWxlLCAqZm47Ci0gICAgIGludCBsaW5lOwotewotICBhc19zaG93X3doZXJlICgpOwotICBpZiAoZm4pCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZCBpbiAlc1xuIiksCi0JICAgICBmaWxlLCBsaW5lLCBmbik7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIkludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkXG4iKSwKLQkgICAgIGZpbGUsIGxpbmUpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIlBsZWFzZSByZXBvcnQgdGhpcyBidWcuXG4iKSk7Ci0gIHhleGl0IChFWElUX0ZBSUxVUkUpOwotfQotCi0vKiBTdXBwb3J0IHJvdXRpbmVzLiAgKi8KLQotdm9pZAotZnByaW50X3ZhbHVlIChmaWxlLCB2YWwpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIHZhbHVlVCB2YWw7Ci17Ci0gIGlmIChzaXplb2YgKHZhbCkgPD0gc2l6ZW9mIChsb25nKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJWxkIiwgKGxvbmcpIHZhbCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKGJmZF92bWEpKQotICAgIHsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCB2YWwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICBhYm9ydCAoKTsKLX0KLQotdm9pZAotc3ByaW50X3ZhbHVlIChidWYsIHZhbCkKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotewotICBpZiAoc2l6ZW9mICh2YWwpIDw9IHNpemVvZiAobG9uZykpCi0gICAgewotICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkIiwgKGxvbmcpIHZhbCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKGJmZF92bWEpKQotICAgIHsKLSAgICAgIHNwcmludGZfdm1hIChidWYsIHZhbCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gIGFib3J0ICgpOwotfQotCi0vKiBlbmQgb2YgbWVzc2FnZXMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL21wdy1jb25maWcuaW4gYi9nYXMvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyOWIxZC4uMDAwMDAwMAotLS0gYS9nYXMvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIEdBUy4KLQotU2V0IHRhcmdldF9hcmNoIGBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAtZSAncy8tLiotLiovLydgCi0KLUlmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvcG93ZXJwYy8KLQlTZXQgc2hvcnRfYXJjaF9uYW1lICJwcGMiCi0JU2V0IHRhcmdldF9jcHUgInBvd2VycGMiCi1FbHNlCi0JU2V0IHNob3J0X2FyY2hfbmFtZSAie3RhcmdldF9hcmNofSIKLUVuZCBJZgotCi0jIFRoZSBmb2xsb3dpbmcgd29ya3MgZm9yIG1hbnkgY29uZmlndXJhdGlvbnMsIHRob3VnaCBub3QgYWxsLgotCi1TZXQgb2JqX2Zvcm1hdCBgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgLWUgJ3MvLiotLiotLy8nYAotU2V0IHRhcmdldF9vcyBgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgLWUgJ3MvLiotLiotLy8nYAotCi1TZXQgYmZkX2dhcyBubwotCi1TZXQgVERFRklORVMgIiIKLQotU2V0IEVYVFJBX09CSkVDVFMgIiIKLQotIyBEZWZhdWx0IGVtdWxhdGlvbi4KLQotU2V0IGVtIGdlbmVyaWMKLQotSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL202OGstYXBwbGUtbWFjb3MvCi0JU2V0IG9ial9mb3JtYXQgImNvZmYiCi0JU2V0IFRERUZJTkVTICctZCBNNjhLQ09GRicKLQlTZXQgRVhUUkFfT0JKRUNUUyAnIntvfSJtNjhrLXBhcnNlLmMubycKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvcG93ZXJwYy1hcHBsZS1tYWNvcy8KLQlTZXQgb2JqX2Zvcm1hdCAiY29mZiIKLQlTZXQgYmZkX2dhcyB5ZXMKLQlTZXQgZW0gbWFjb3MKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvaTM4Ni1cT3B0aW9uLXgtZ28zMi8KLQlTZXQgb2JqX2Zvcm1hdCAiY29mZiIKLQlTZXQgVERFRklORVMgJy1kIEkzODZDT0ZGJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9tNjhrLVxPcHRpb24teC1jb2ZmLwotCVNldCBUREVGSU5FUyAnLWQgTTY4S0NPRkYnCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL21pcHMtaWR0LWVjb2ZmLwotCVNldCBiZmRfZ2FzIHllcwotCVNldCBUREVGSU5FUyAnLWQgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU49MScKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1cT3B0aW9uLXgtXE9wdGlvbi14LwotCSMgQXNzdW1lIG90aGVyIE9TZXMgZXRjIHVzZSBFTEYKLQlTZXQgb2JqX2Zvcm1hdCAiZWxmIgotCVNldCBiZmRfZ2FzIHllcwotCVNldCBUREVGSU5FUyAnLWQgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU49MScKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJiZmQ6ZWxmLWJmZC5oICdiZmQvZWxmLWJmZC5oJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9zaC1cT3B0aW9uLXgtaG1zLwotCVNldCBvYmpfZm9ybWF0ICJjb2ZmIgotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9Im9wY29kZXM6c2gtb3BjLmggJ29wY29kZXMvc2gtb3BjLmgnCi1FbmQgSWYKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6dGMte3Nob3J0X2FyY2hfbmFtZX0uYyB0YXJnLWNwdS5jCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzp0Yy17c2hvcnRfYXJjaF9uYW1lfS5oIHRhcmctY3B1LmgKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6b2JqLXtvYmpfZm9ybWF0fS5jIG9iai1mb3JtYXQuYwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6b2JqLXtvYmpfZm9ybWF0fS5oIG9iai1mb3JtYXQuaAotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzp0ZS17ZW19LmggdGFyZy1lbnYuaAotCi0jIFNwZWNpYWwgY2FzZXMgZm9yIGZsb2F0IGhhbmRsaW5nLgotCi1JZiAie3RhcmdldF9hcmNofSIgPX4gL25zMzJrLwotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOmF0b2YtbnMzMmsuYyBhdG9mLXRhcmcuYwotRWxzZSBJZiAie3RhcmdldF9hcmNofSIgPX4gL3RhaG9lLwotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOmF0b2YtdGFob2UuYyBhdG9mLXRhcmcuYwotRWxzZSBJZiAie3RhcmdldF9hcmNofSIgPX4gL3ZheC8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzphdG9mLXZheC5jIGF0b2YtdGFyZy5jCi1FbHNlCi0JIyBVc2UgSUVFRSBieSBkZWZhdWx0LgotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOmF0b2YtaWVlZS5jIGF0b2YtdGFyZy5jCi1FbmQgSWYKLQotRWNobyAnIyBGcm9tIG1wdy1jb25maWcuaW4nICAgICAJCSA+ICJ7b30ibWsudG1wCi1FY2hvICJUREVGSU5FUyA9ICIge1RERUZJTkVTfQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJFWFRSQV9PQkpFQ1RTID0gIiB7RVhUUkFfT0JKRUNUU30JCT4+ICJ7b30ibWsudG1wCi0jIChXZSB1c2UgdGhlIC1uIG9wdGlvbiBoZXJlIHNvIGFzIG5vdCB0byBnZXQgZXh0cmEgc3BhY2VzIGluc2VydGVkKQotRWNobyAtbiAnVEFSR19DUFVfREVQID0ge1RBUkdfQ1BVX0RFUF8nCQk+PiAie299Im1rLnRtcAotRWNobyAtbiB7c2hvcnRfYXJjaF9uYW1lfQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvIC1uICd9JwkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJyMgRW5kIGZyb20gbXB3LWNvbmZpZy5pbicJCQk+PiAie299Im1rLnRtcAotCi1FY2hvICcvKiBjb25mLiAgR2VuZXJhdGVkIGJ5IG1wdy1jb25maWd1cmUuICAqLycgPiAie299ImNvbmYubmV3Ci1FY2hvIC1uICcjZGVmaW5lIFRBUkdFVF9DUFUgICAgICAgIicgICAgICAgCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gInt0YXJnZXRfY3B1fSIgICAgICAgCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAgICAnIicgICAgICAgCQkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gJyNkZWZpbmUgVEFSR0VUX09TICAgICAgICInICAgICAgIAk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICJ7dGFyZ2V0X29zfSIgICAgICAgCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAgICAnIicgICAgICAgCQkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gJyNkZWZpbmUgVEFSR0VUX0FMSUFTICAgICAgICInICAgICAgIAk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICJ7dGFyZ2V0X2FsaWFzfSIgICAgICAgCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAgICAnIicgICAgICAgCQkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gJyNkZWZpbmUgVEFSR0VUX0NBTk9OSUNBTCAgICAgICAiJyAgICAgCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gLW4gInt0YXJnZXRfY2Fub25pY2FsfSIJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICAgICciJyAgICAgICAJCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAnI2luY2x1ZGUgIm1wdy5oIicJCQkJPj4gIntvfSJjb25mLm5ldwotSWYgIntiZmRfZ2FzfSIgPX4gL3llcy8KLQlFY2hvICIjZGVmaW5lIEJGRF9BU1NFTUJMRVIiCQk+PiAie299ImNvbmYubmV3Ci1FbHNlCi0JRWNobyAiI2RlZmluZSBNQU5ZX1NFR01FTlRTIgkJPj4gIntvfSJjb25mLm5ldwotRW5kIElmCi1FY2hvICcjZGVmaW5lIENSX0VPTCcJCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAnI2RlZmluZSBPQkpfQ09GRl9PTUlUX1RJTUVTVEFNUCcJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gJyNkZWZpbmUgTE9TSU5HX0NPTVBJTEVSJwkJCT4+ICJ7b30iY29uZi5uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29uZi5uZXcgIntvfSJjb25mCi0KLXNlZCAtZSAicy9Ac3JjZGlyQC97c3JjZGlyfS8iICJ7c3JjZGlyfSJnZGJpbml0LmluID4gIntvfSJfZ2RiaW5pdApkaWZmIC0tZ2l0IGEvZ2FzL21wdy1tYWtlLnNlZCBiL2dhcy9tcHctbWFrZS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjEyYTUuLjAwMDAwMDAKLS0tIGEvZ2FzL21wdy1tYWtlLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0aGF0IGZpbmlzaCB0cmFuc2xhdGluZyB0aGUgR0FTIFVuaXggTWFrZWZpbGUgdG8gTVBXIHN5bnRheC4KLQotL14jIEB0YXJnZXRfZnJhZ0AvYVwKLVwKLUhERUZJTkVTID0gXAotTE9DQUxfTE9BRExJQkVTID0gXAotCi0vXnNyY3Jvb3QgPSAvcy9eLyMvCi0vXnRhcmdldF9hbGlhcyA9IC9zL14vIy8KLQotL0lOQ0xVREVTL3MvLWkgIntzcmNkaXJ9IjpcKFthLXpdKlwpLy1pICJ7dG9wc3JjZGlyfSJcMS8KLS9JTkNMVURFUy9zLy1pICJ7c3JjZGlyfSJcLlwuLy1pICJ7dG9wc3JjZGlyfSIvCi0KLS9eSU5DTFVERVMgPSAuKiQvcy8kLyAtaSAie3RvcHNyY2Rpcn0iaW5jbHVkZTptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCi0KLS8kKFRBUkdfQ1BVX0RFUF9AdGFyZ2V0X2NwdV90eXBlQCkvcy8kKFRBUkdfQ1BVX0RFUF9AdGFyZ2V0X2NwdV90eXBlQCkve1RBUkdfQ1BVX0RFUH0vCi0KLS9AT1BDT0RFU19MSUJAL3MvQE9QQ09ERVNfTElCQC86Om9wY29kZXM6bGlib3Bjb2Rlcy5vLwotL0BCRkRMSUJAL3MvQEJGRExJQkAvOjpiZmQ6bGliYmZkLm8vCi0KLSMgUG9pbnQgYXQgdGhlIGxpYnJhcmllcyBkaXJlY3RseS4KLS9AT1BDT0RFU19ERVBAL3MvQE9QQ09ERVNfREVQQC86Om9wY29kZXM6bGlib3Bjb2Rlcy5vLwotL0BCRkRERVBAL3MvQEJGRERFUEAvOjpiZmQ6bGliYmZkLm8vCi0KLSMgRG9uJ3QgbmVlZCB0aGlzLgotL0BITERGTEFHU0Avcy9ASExERkxBR1NALy8KLQotL2V4dHJhX29iamVjdHNAL3MvZXh0cmFfb2JqZWN0c0Ave0VYVFJBX09CSkVDVFN9LwotCi0vTE9BRExJQkVTL3Mve0xPQURMSUJFU30ve0VYVFJBTElCU30vCi0KLS9AQUxMX09CSl9ERVBTQC9zL0BBTExfT0JKX0RFUFNALzo6YmZkOmJmZC5oLwotCi0jIFRoaXMgY2F1c2VzIHByb2JsZW1zIC0gbm90IHN1cmUgd2h5LgotL150YWdzIFRBR1MvLC9ldGFncyAvZAotCi0vXm1ha2UtZ2FzLmNvbS9zL14vIy8KLQotL3RydWUvcy8gOyBAdHJ1ZSQvLwotCi0jIFJlbW92ZSByZWZlcmVuY2VzIHRvIGNvbmYuaW4sIHdlIGRvbid0IG5lZWQgdGhlbS4KLS9jb25mXC5pbi9zL2NvbmZcLmluLy9nCi0KLSMgVXNlIF9nZGJpbml0IGV2ZXJ5d2hlcmUgaW5zdGVhZCBvZiAuZ2RiaW5pdC4KLS9nZGJpbml0L3MvXC5nZGJpbml0L19nZGJpbml0L2cKLQotL2F0b2YtdGFyZy9zLyJ7c30iYXRvZi10YXJnXC5jLyJ7b30iYXRvZi10YXJnLmMvZwotL2NvbmZpZy9zLyJ7c30iY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvZwotL2NvbmZpZy9zL15jb25maWdcLmgvIntvfSJjb25maWcuaC8KLS9vYmotZm9ybWF0L3MvIntzfSJvYmotZm9ybWF0XC5jLyJ7b30ib2JqLWZvcm1hdC5jL2cKLS9vYmotZm9ybWF0L3MvIntzfSJvYmotZm9ybWF0XC5oLyJ7b30ib2JqLWZvcm1hdC5oL2cKLS90YXJnLWNwdS9zLyJ7c30idGFyZy1jcHVcLmMvIntvfSJ0YXJnLWNwdS5jL2cKLS90YXJnLWNwdS9zLyJ7c30idGFyZy1jcHVcLmgvIntvfSJ0YXJnLWNwdS5oL2cKLS90YXJnLWVudi9zLyJ7c30idGFyZy1lbnZcLmgvIntvfSJ0YXJnLWVudi5oL2cKLQotL202OGstcGFyc2UuYy9zLyJ7c30ibTY4ay1wYXJzZVwuYy8ie299Im02OGstcGFyc2UuYy9nCi0vbTY4ay1wYXJzZS5jL3MvXm02OGstcGFyc2VcLmMvIntvfSJtNjhrLXBhcnNlLmMvCi0KLSMgV2hhY2sgb3V0IHRoZSBjb25maWcuaCBkZXBlbmRlbmN5LCBpdCBvbmx5IGNhdXNlcyBleGNlc3MgcmVidWlsZHMuCi0ve09CSlN9L3Mve09CSlN9IFxcT3B0aW9uLWYgIntvfSJjb25maWcuaC97T0JKU30gXFxPcHRpb24tZi8KLS9nYXNwLmMvcy9nYXNwXC5jICJ7b30iY29uZmlnLmgvZ2FzcC5jLwotCi0jIEFMTF9DRkxBR1MgaW5jbHVkZXMgVERFRklORVMsIHdoaWNoIGlzIG5vdCBkZXNpcmFibGUgYXQgbGluayB0aW1lLgotL0NDX0xEL3MvQUxMX0NGTEFHUy9DRkxBR1MvZwotCi0jIFRoZSByZXNvdXJjZSBmaWxlIGlzIGNhbGxlZCBtYWMtYXMuci4KLS9hcy5uZXcuci9zL2FzXC5uZXdcLnIvbWFjLWFzLnIvCi0vZ2FzcC5uZXcuci9zL2dhc3BcLm5ld1wuci9tYWMtYXMuci8KLQotIyAuLi5hbmQgdGhlIFBST0dfTkFNRSBkb2Vzbid0IGhhdmUgYSAubmV3IGluIGl0LgotL1BST0dfTkFNRS9zL1BST0dfTkFNRT0nIidhcy5uZXcnIicvUFJPR19OQU1FPSciJ2FzJyInLwotL1BST0dfTkFNRS9zL1BST0dfTkFNRT0nIidnYXNwLm5ldyciJy9QUk9HX05BTUU9JyInZ2FzcCciJy8KLQotIyBXaGFjayBvdXQgcmVjdXJzaXZlIG1ha2VzLCB0aGV5IHdvbid0IHdvcmsuCi0vXlsgCV1bIAldKnNyY3Jvb3Q9LywvXlsgCV1bIAldKihjZCAvZAotCi0jIFdvcmsgYXJvdW5kIHF1b3RpbmcgcHJvYmxlbXMgYnkgdXNpbmcgbXVsdGlwbGUgZWNobyBjb21tYW5kcy4KLS8nI2RlZmluZSBHQVNfVkVSU0lPTiAie1ZFUlNJT059IicvY1wKLQlFY2hvIC1uICcjZGVmaW5lIEdBU19WRVJTSU9OICInID4+ICJ7b30iY29uZmlnLm5ld1wKLQlFY2hvIC1uICJ7VkVSU0lPTn0iID4+ICJ7b30iY29uZmlnLm5ld1wKLQlFY2hvIC1uICciJyA+PiAie299ImNvbmZpZy5uZXcKLQotIyBBZGQgYSAic3RhbXBzIiB0YXJnZXQuCi0kYVwKLXN0YW1wcyBcXE9wdGlvbi1mIGNvbmZpZy1zdGFtcFwKLQotL15pbnN0YWxsIFxcT3B0aW9uLWYvLC9eJC9jXAotaW5zdGFsbCBcXE9wdGlvbi1mIGFsbCBpbnN0YWxsLW9ubHlcCi1cCi1pbnN0YWxsLW9ubHkgXFxPcHRpb24tZlwKLQlOZXdGb2xkZXJSZWN1cnNpdmUgIntiaW5kaXJ9IlwKLQlEdXBsaWNhdGUgLXkgOmFzLm5ldyAie2JpbmRpcn0iYXNcCi0JRHVwbGljYXRlIC15IDpnYXNwLm5ldyAie2JpbmRpcn0iZ2FzcFwKLQotCi0jIFdoYWNrIG91dCBjb25maWctcmVidWlsZGluZyB0YXJnZXRzLCB0aGV5IHdvbid0IHdvcmsuCi0vXk1ha2VmaWxlIFxcT3B0aW9uLWYvLC9eJC9kCi0vXmNvbmZpZy5zdGF0dXMgXFxPcHRpb24tZi8sL14kL2QKLQotL14ie299ImNvbmZpZy5oIFxcT3B0aW9uLWYvcy9eLyMvCmRpZmYgLS1naXQgYS9nYXMvb2JqLmggYi9nYXMvb2JqLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NWU3NWMuLjAwMDAwMDAKLS0tIGEvZ2FzL29iai5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogb2JqLmggLSBkZWZpbmVzIHRoZSBvYmplY3QgZGVwZW5kZW50IGhvb2tzIGZvciBhbGwgb2JqZWN0Ci0gICBmb3JtYXQgYmFja2VuZHMuCi0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk1LCA5NiwgOTcsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1jaGFyICpvYmpfZGVmYXVsdF9vdXRwdXRfZmlsZV9uYW1lIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgb2JqX2VtaXRfcmVsb2NhdGlvbnMgUEFSQU1TICgoY2hhciAqKndoZXJlLCBmaXhTICogZml4UCwKLQkJCQkgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkpOwotdm9pZCBvYmpfZW1pdF9zdHJpbmdzIFBBUkFNUyAoKGNoYXIgKip3aGVyZSkpOwotdm9pZCBvYmpfZW1pdF9zeW1ib2xzIFBBUkFNUyAoKGNoYXIgKip3aGVyZSwgc3ltYm9sUyAqIHN5bWJvbHMpKTsKLSNpZm5kZWYgb2JqX3JlYWRfYmVnaW5faG9vawotdm9pZCBvYmpfcmVhZF9iZWdpbl9ob29rIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi12b2lkIG9ial9jcmF3bF9zeW1ib2xfY2hhaW4gUEFSQU1TICgob2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKSk7Ci12b2lkIG9ial9oZWFkZXJfYXBwZW5kIFBBUkFNUyAoKGNoYXIgKip3aGVyZSwgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKSk7Ci0jaWZuZGVmIG9ial9wcmVfd3JpdGVfaG9vawotdm9pZCBvYmpfcHJlX3dyaXRlX2hvb2sgUEFSQU1TICgob2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKSk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIG9ial9zeW1ib2xfbmV3X2hvb2sKLXZvaWQgb2JqX3N5bWJvbF9uZXdfaG9vayBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sUCkpOwotI2VuZGlmCi0KLXZvaWQgb2JqX3N5bWJvbF90b19jaGFycyBQQVJBTVMgKChjaGFyICoqd2hlcmUsIHN5bWJvbFMgKiBzeW1ib2xQKSk7Ci0KLWV4dGVybiBjb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RydWN0IGZvcm1hdF9vcHMgewotICBpbnQgZmxhdm9yOwotICB1bnNpZ25lZCBkZmxfbGVhZGluZ191bmRlcnNjb3JlIDogMTsKLSAgdW5zaWduZWQgZW1pdF9zZWN0aW9uX3N5bWJvbHMgOiAxOwotICB2b2lkICgqZnJvYl9zeW1ib2wpIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50ICopKTsKLSAgdm9pZCAoKmZyb2JfZmlsZSkgUEFSQU1TICgodm9pZCkpOwotICB2b2lkICgqZnJvYl9maWxlX2FmdGVyX3JlbG9jcykgUEFSQU1TICgodm9pZCkpOwotICBiZmRfdm1hICgqc19nZXRfc2l6ZSkgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0gIHZvaWQgKCpzX3NldF9zaXplKSBQQVJBTVMgKChzeW1ib2xTICosIGJmZF92bWEpKTsKLSAgYmZkX3ZtYSAoKnNfZ2V0X2FsaWduKSBQQVJBTVMgKChzeW1ib2xTICopKTsKLSAgdm9pZCAoKnNfc2V0X2FsaWduKSBQQVJBTVMgKChzeW1ib2xTICosIGJmZF92bWEpKTsKLSAgdm9pZCAoKmNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7Ci0gIHZvaWQgKCpnZW5lcmF0ZV9hc21fbGluZW5vKSBQQVJBTVMgKCh2b2lkKSk7Ci0gIHZvaWQgKCpwcm9jZXNzX3N0YWIpIFBBUkFNUyAoKHNlZ1QsIGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50KSk7Ci0gIGludCAoKnNlY19zeW1fb2tfZm9yX3JlbG9jKSBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci0gIHZvaWQgKCpwb3BfaW5zZXJ0KSBQQVJBTVMgKCh2b2lkKSk7Ci0gIC8qIEZvciBjb25maWd1cmF0aW9ucyB1c2luZyBFQ09GRl9ERUJVR0dJTkcsIHRoaXMgY2FsbGJhY2sgaXMgdXNlZC4gICovCi0gIHZvaWQgKCplY29mZl9zZXRfZXh0KSBQQVJBTVMgKChzeW1ib2xTICosIHN0cnVjdCBlY29mZl9leHRyICopKTsKLQotICB2b2lkICgqcmVhZF9iZWdpbl9ob29rKSBQQVJBTVMgKCh2b2lkKSk7Ci0gIHZvaWQgKCpzeW1ib2xfbmV3X2hvb2spIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmb3JtYXRfb3BzIGVsZl9mb3JtYXRfb3BzOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmb3JtYXRfb3BzIGVjb2ZmX2Zvcm1hdF9vcHM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgY29mZl9mb3JtYXRfb3BzOwotCi0jaWZuZGVmIHRoaXNfZm9ybWF0Ci1DT01NT04gY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgKnRoaXNfZm9ybWF0OwotI2VuZGlmCi0jZW5kaWYKLQotLyogZW5kIG9mIG9iai5oICovCmRpZmYgLS1naXQgYS9nYXMvb3V0cHV0LWZpbGUuYyBiL2dhcy9vdXRwdXQtZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2RmNzJmLi4wMDAwMDAwCi0tLSBhL2dhcy9vdXRwdXQtZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qIG91dHB1dC1maWxlLmMgLSAgRGVhbCB3aXRoIHRoZSBvdXRwdXQgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkzLCA5MiwgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotCi0jaW5jbHVkZSAib3V0cHV0LWZpbGUuaCIKLQotI2lmZGVmIEJGRF9IRUFERVJTCi0jZGVmaW5lIFVTRV9CRkQKLSNlbmRpZgotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBVU0VfQkZECi0jaWZuZGVmIFRBUkdFVF9NQUNICi0jZGVmaW5lIFRBUkdFVF9NQUNIIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfQkZECi0jaW5jbHVkZSAiYmZkLmgiCi1iZmQgKnN0ZG91dHB1dDsKLQotdm9pZAotb3V0cHV0X2ZpbGVfY3JlYXRlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSAnLScgJiYgbmFtZVsxXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJDYW4ndCBvcGVuIGEgYmZkIG9uIHN0ZG91dCAlcyAiKSwgbmFtZSk7Ci0gICAgfQotICBlbHNlIGlmICghKHN0ZG91dHB1dCA9IGJmZF9vcGVudyAobmFtZSwgVEFSR0VUX0ZPUk1BVCkpKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNyZWF0ZSAlcyIpLCBuYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICBiZmRfc2V0X2Zvcm1hdCAoc3Rkb3V0cHV0LCBiZmRfb2JqZWN0KTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILCBUQVJHRVRfTUFDSCk7Ci0jZW5kaWYKLSAgaWYgKGZsYWdfdHJhZGl0aW9uYWxfZm9ybWF0KQotICAgIHN0ZG91dHB1dC0+ZmxhZ3MgfD0gQkZEX1RSQURJVElPTkFMX0ZPUk1BVDsKLX0KLQotdm9pZAotb3V0cHV0X2ZpbGVfY2xvc2UgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIC8qIENsb3NlIHRoZSBiZmQuICAqLwotICBpZiAoYmZkX2Nsb3NlIChzdGRvdXRwdXQpID09IDApCi0gICAgewotICAgICAgYmZkX3BlcnJvciAoZmlsZW5hbWUpOwotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY2xvc2UgJXNcbiIpLCBmaWxlbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSNlbHNlCi0gIC8qIENsb3NlIHRoZSBiZmQgd2l0aG91dCBnZXR0aW5nIGJmZCB0byB3cml0ZSBvdXQgYW55dGhpbmcgYnkgaXRzZWxmICovCi0gIGlmIChiZmRfY2xvc2VfYWxsX2RvbmUgKHN0ZG91dHB1dCkgPT0gMCkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjbG9zZSAlc1xuIiksIGZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotI2VuZGlmCi0gIHN0ZG91dHB1dCA9IE5VTEw7CQkvKiBUcnVzdCBub2JvZHkhICovCi19Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotdm9pZAotb3V0cHV0X2ZpbGVfYXBwZW5kICh3aGVyZSwgbGVuZ3RoLCBmaWxlbmFtZSkKLSAgICAgY2hhciAqd2hlcmUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgbG9uZyBsZW5ndGggQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY2hhciAqZmlsZW5hbWUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0jZW5kaWYKLQotI2Vsc2UKLQotc3RhdGljIEZJTEUgKnN0ZG91dHB1dDsKLQotdm9pZAotb3V0cHV0X2ZpbGVfY3JlYXRlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSAnLScgJiYgbmFtZVsxXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIHN0ZG91dHB1dCA9IHN0ZG91dDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3Rkb3V0cHV0ID0gZm9wZW4gKG5hbWUsICJ3YiIpOwotCi0gIC8qIFNvbWUgc3lzdGVtcyBkb24ndCBncm9rICJiIiBpbiBmb3BlbiBtb2Rlcy4gICovCi0gIGlmIChzdGRvdXRwdXQgPT0gTlVMTCkKLSAgICBzdGRvdXRwdXQgPSBmb3BlbiAobmFtZSwgInciKTsKLQotICBpZiAoc3Rkb3V0cHV0ID09IE5VTEwpCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY3JlYXRlICVzIiksIG5hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci19Ci0KLXZvaWQKLW91dHB1dF9maWxlX2Nsb3NlIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmIChFT0YgPT0gZmNsb3NlIChzdGRvdXRwdXQpKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNsb3NlICVzIiksIGZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICBzdGRvdXRwdXQgPSBOVUxMOwkJLyogVHJ1c3Qgbm9ib2R5ISAqLwotfQotCi12b2lkCi1vdXRwdXRfZmlsZV9hcHBlbmQgKHdoZXJlLCBsZW5ndGgsIGZpbGVuYW1lKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgbG9uZyBsZW5ndGg7Ci0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBmb3IgKDsgbGVuZ3RoOyBsZW5ndGgtLSwgd2hlcmUrKykKLSAgICB7Ci0gICAgICAodm9pZCkgcHV0YyAoKndoZXJlLCBzdGRvdXRwdXQpOwotICAgICAgaWYgKGZlcnJvciAoc3Rkb3V0cHV0KSkKLQkvKiBpZiAoIEVPRiA9PSAocHV0YyggKndoZXJlLCBzdGRvdXRwdXQgKSkgKSAqLwotCXsKLQkgIGFzX3BlcnJvciAoXygiRmFpbGVkIHRvIGVtaXQgYW4gb2JqZWN0IGJ5dGUiKSwgZmlsZW5hbWUpOwotCSAgYXNfZmF0YWwgKF8oIkNhbid0IGNvbnRpbnVlIikpOwotCX0KLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0vKiBlbmQgb2Ygb3V0cHV0LWZpbGUuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL291dHB1dC1maWxlLmggYi9nYXMvb3V0cHV0LWZpbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyZjFlZi4uMDAwMDAwMAotLS0gYS9nYXMvb3V0cHV0LWZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBvdXRwdXQtZmlsZS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXZvaWQgb3V0cHV0X2ZpbGVfYXBwZW5kIFBBUkFNUyAoKGNoYXIgKndoZXJlLCBsb25nIGxlbmd0aCwgY2hhciAqZmlsZW5hbWUpKTsKLXZvaWQgb3V0cHV0X2ZpbGVfY2xvc2UgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLXZvaWQgb3V0cHV0X2ZpbGVfY3JlYXRlIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKLQotLyogZW5kIG9mIG91dHB1dC1maWxlLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9wby9NYWtlLWluIGIvZ2FzL3BvL01ha2UtaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTJkYjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3BvL01ha2UtaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLUBTRVRfTUFLRUAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCi1zdWJkaXIgPSBwbwotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1DQyA9IEBDQ0AKLUdFTkNBVCA9IEBHRU5DQVRACi1HTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAotTVNHRk1UID0gQE1TR0ZNVEAKLVhHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKLU1TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCi0KLURFRlMgPSBAREVGU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLQotSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLVNPVVJDRVMgPSBjYXQtaWQtdGJsLmMKLVBPRklMRVMgPSBAUE9GSUxFU0AKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKLXN0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKLQotUE9URklMRVMgPSBcCi0KLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKLQotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0KLS5wby5wb3g6Ci0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKLQotLnBvLm1vOgotCSQoTVNHRk1UKSAtbyAkQCAkPAotCi0ucG8uZ21vOgotCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKLQkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAotCi0ucG8uY2F0OgotCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCi0JICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCi0KLQotYWxsOiBhbGwtQFVTRV9OTFNACi0KLWFsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKLWFsbC1ubzoKLQotJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQotCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKLQkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCi0JICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCi0Jcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0JbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQotJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgotJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKLQlybSAtZiBjYXQtaWQtdGJsLnRtcAotCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKLQkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKLQlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCi0JICBybSBjYXQtaWQtdGJsLnRtcDsgXAotCWVsc2UgXAotCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAotCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCWZpCi0JY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAotCi0KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzoKLWluc3RhbGwtaW5mbzoKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKLQllbHNlIFwKLQkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCi0JZmkKLQlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGNhc2UgIiQkY2F0IiBpbiBcCi0JICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKLQkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAotCSAgZXNhYzsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGVsc2UgXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgIGVsc2UgXAotCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKLQkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAotCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JZG9uZQotCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KLQotY2hlY2s6IGFsbAotCi1jYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCi0KLWR2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAotCXJtIC1mciAqLm8KLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0Jcm0gLWYgJChHTU9GSUxFUykKLQotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQotCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotdXBkYXRlLXBvOiBNYWtlZmlsZQotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKLQljZCAkKHNyY2Rpcik7IFwKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAotCSAgZWNobyAiJCRsYW5nOiI7IFwKLQkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAotCSAgICBybSAtZiAkJGxhbmcucG87IFwKLQkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1QT1RGSUxFUzogUE9URklMRVMuaW4KLQkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAotCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCi0JICBlbHNlIFwKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKLQkgIGZpOyBcCi0JICBybSAtZiAkQC10ICRAIFwKLQkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAotCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCi0JCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKLQkgICAgJiYgY2htb2QgYS13ICRALXQgXAotCSAgICAmJiBtdiAkQC10ICRAICkKLQotUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKLQljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCi0KLU1ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKLQljZCAuLiBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKLQkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZ2FzL3BvL1BPVEZJTEVTLmluIGIvZ2FzL3BvL1BPVEZJTEVTLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjY3ZjI3Li4wMDAwMDAwCi0tLSBhL2dhcy9wby9QT1RGSUxFUy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi1hcHAuYwotYXBwLmMKLWFzLmMKLWFzLmMKLWFzLmgKLWFzaW50bC5oCi1hdG9mLWdlbmVyaWMuYwotYXRvZi1nZW5lcmljLmMKLWJpZ251bS1jb3B5LmMKLWJpZ251bS1jb3B5LmMKLWJpZ251bS5oCi1iaXRfZml4LmgKLWNnZW4uaAotY29uZC5jCi1jb25kLmMKLWNvbmZpZy9lLWkzODZjb2ZmLmMKLWNvbmZpZy9lLWkzODZlbGYuYwotY29uZmlnL2UtbWlwc2Vjb2ZmLmMKLWNvbmZpZy9lLW1pcHNlbGYuYwotY29uZmlnL29iai1hb3V0LmMKLWNvbmZpZy9vYmotYW91dC5oCi1jb25maWcvb2JqLWJvdXQuYwotY29uZmlnL29iai1ib3V0LmgKLWNvbmZpZy9vYmotY29mZi5jCi1jb25maWcvb2JqLWNvZmYuaAotY29uZmlnL29iai1lY29mZi5jCi1jb25maWcvb2JqLWVjb2ZmLmgKLWNvbmZpZy9vYmotZWxmLmMKLWNvbmZpZy9vYmotZWxmLmgKLWNvbmZpZy9vYmotZXZheC5jCi1jb25maWcvb2JqLWV2YXguaAotY29uZmlnL29iai1ocDMwMC5jCi1jb25maWcvb2JqLWhwMzAwLmgKLWNvbmZpZy9vYmotaWVlZS5jCi1jb25maWcvb2JqLWllZWUuaAotY29uZmlnL29iai1zb20uYwotY29uZmlnL29iai1zb20uaAotY29uZmlnL29iai12bXMuYwotY29uZmlnL29iai12bXMuaAotY29uZmlnL3RjLWEyOWsuYwotY29uZmlnL3RjLWEyOWsuaAotY29uZmlnL3RjLWFscGhhLmMKLWNvbmZpZy90Yy1hbHBoYS5oCi1jb25maWcvdGMtYXJjLmMKLWNvbmZpZy90Yy1hcmMuaAotY29uZmlnL3RjLWFybS5jCi1jb25maWcvdGMtYXJtLmgKLWNvbmZpZy90Yy1kMTB2LmMKLWNvbmZpZy90Yy1kMTB2LmgKLWNvbmZpZy90Yy1kMzB2LmMKLWNvbmZpZy90Yy1kMzB2LmgKLWNvbmZpZy90Yy1oODMwMC5jCi1jb25maWcvdGMtaDgzMDAuaAotY29uZmlnL3RjLWg4NTAwLmMKLWNvbmZpZy90Yy1oODUwMC5oCi1jb25maWcvdGMtaHBwYS5jCi1jb25maWcvdGMtaHBwYS5oCi1jb25maWcvdGMtaTM4Ni5jCi1jb25maWcvdGMtaTM4Ni5oCi1jb25maWcvdGMtaTg2MC5jCi1jb25maWcvdGMtaTg2MC5oCi1jb25maWcvdGMtaTk2MC5jCi1jb25maWcvdGMtaTk2MC5oCi1jb25maWcvdGMtbTMyci5jCi1jb25maWcvdGMtbTMyci5oCi1jb25maWcvdGMtbTY4ay5jCi1jb25maWcvdGMtbTY4ay5oCi1jb25maWcvdGMtbTg4ay5jCi1jb25maWcvdGMtbTg4ay5oCi1jb25maWcvdGMtbWNvcmUuYwotY29uZmlnL3RjLW1jb3JlLmgKLWNvbmZpZy90Yy1taXBzLmMKLWNvbmZpZy90Yy1taXBzLmgKLWNvbmZpZy90Yy1tbjEwMjAwLmMKLWNvbmZpZy90Yy1tbjEwMjAwLmgKLWNvbmZpZy90Yy1tbjEwMzAwLmMKLWNvbmZpZy90Yy1tbjEwMzAwLmgKLWNvbmZpZy90Yy1uczMyay5jCi1jb25maWcvdGMtbnMzMmsuaAotY29uZmlnL3RjLXBwYy5jCi1jb25maWcvdGMtcHBjLmgKLWNvbmZpZy90Yy1zaC5jCi1jb25maWcvdGMtc2guaAotY29uZmlnL3RjLXNwYXJjLmMKLWNvbmZpZy90Yy1zcGFyYy5oCi1jb25maWcvdGMtdGFob2UuYwotY29uZmlnL3RjLXRhaG9lLmgKLWNvbmZpZy90Yy10aWMzMC5jCi1jb25maWcvdGMtdGljMzAuaAotY29uZmlnL3RjLXRpYzgwLmMKLWNvbmZpZy90Yy10aWM4MC5oCi1jb25maWcvdGMtdjg1MC5jCi1jb25maWcvdGMtdjg1MC5oCi1jb25maWcvdGMtdmF4LmMKLWNvbmZpZy90Yy12YXguaAotY29uZmlnL3RjLXc2NS5jCi1jb25maWcvdGMtdzY1LmgKLWNvbmZpZy90Yy16OGsuYwotY29uZmlnL3RjLXo4ay5oCi1kZXBlbmQuYwotZGVwZW5kLmMKLWR3YXJmMmRiZy5jCi1kd2FyZjJkYmcuYwotZHdhcmYyZGJnLmgKLWVjb2ZmLmMKLWVjb2ZmLmMKLWVjb2ZmLmgKLWVob3B0LmMKLWVob3B0LmMKLWVtdWwtdGFyZ2V0LmgKLWVtdWwuaAotZXhwci5jCi1leHByLmMKLWV4cHIuaAotZmxvbnVtLWNvcHkuYwotZmxvbnVtLWNvcHkuYwotZmxvbnVtLWtvbnN0LmMKLWZsb251bS1rb25zdC5jCi1mbG9udW0tbXVsdC5jCi1mbG9udW0tbXVsdC5jCi1mbG9udW0uaAotZnJhZ3MuYwotZnJhZ3MuYwotZnJhZ3MuaAotZ2FzcC5jCi1oYXNoLmMKLWhhc2guYwotaGFzaC5oCi1pbnB1dC1maWxlLmMKLWlucHV0LWZpbGUuYwotaW5wdXQtZmlsZS5oCi1pbnB1dC1zY3J1Yi5jCi1pbnB1dC1zY3J1Yi5jCi1pdGJsLW9wcy5jCi1pdGJsLW9wcy5oCi1saXN0aW5nLmMKLWxpc3RpbmcuYwotbGlzdGluZy5oCi1saXRlcmFsLmMKLWxpdGVyYWwuYwotbWFjcm8uYwotbWFjcm8uYwotbWFjcm8uaAotbWVzc2FnZXMuYwotbWVzc2FnZXMuYwotb2JqLmgKLW91dHB1dC1maWxlLmMKLW91dHB1dC1maWxlLmMKLW91dHB1dC1maWxlLmgKLXJlYWQuYwotcmVhZC5jCi1yZWFkLmgKLXNiLmMKLXNiLmMKLXNiLmgKLXN0YWJzLmMKLXN0YWJzLmMKLXN0cnVjLXN5bWJvbC5oCi1zdWJzZWdzLmMKLXN1YnNlZ3MuYwotc3Vic2Vncy5oCi1zeW1ib2xzLmMKLXN5bWJvbHMuYwotc3ltYm9scy5oCi10Yy5oCi13cml0ZS5jCi13cml0ZS5jCi13cml0ZS5oCmRpZmYgLS1naXQgYS9nYXMvcG8vZ2FzLnBvdCBiL2dhcy9wby9nYXMucG90CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjQwZWUxLi4wMDAwMDAwCi0tLSBhL2dhcy9wby9nYXMucG90CisrKyAvZGV2L251bGwKQEAgLTEsNzE2NiArMCwwIEBACi0jIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCi0jIENvcHlyaWdodCAoQykgWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KLSMKLSMsIGZ1enp5Ci1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMTk5OS0wNi0wMyAwMzowMC0wNzAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogRU5DT0RJTkdcbiIKLQotIzogYXBwLmM6NDQ4IGFwcC5jOjQ2MgotbXNnaWQgImVuZCBvZiBmaWxlIGluIGNvbW1lbnQiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6NTQxCi1tc2dpZCAiZW5kIG9mIGZpbGUgaW4gc3RyaW5nOiBpbnNlcnRlZCAnXCInIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjYwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIGVzY2FwZSAnXFwlYycgaW4gc3RyaW5nOiBJZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjYxNgotbXNnaWQgIkVuZCBvZiBmaWxlIGluIHN0cmluZzogJ1wiJyBpbnNlcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzo3MzYKLW1zZ2lkICJlbmQgb2YgZmlsZSBub3QgYXQgZW5kIG9mIGEgbGluZTsgbmV3bGluZSBpbnNlcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzo4ODIKLW1zZ2lkICJlbmQgb2YgZmlsZSBpbiBtdWx0aWxpbmUgY29tbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzo5MzEKLW1zZ2lkICJlbmQgb2YgZmlsZSBhZnRlciBhIG9uZS1jaGFyYWN0ZXIgcXVvdGU7IFxcMCBpbnNlcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzo5MzkKLW1zZ2lkICJlbmQgb2YgZmlsZSBpbiBlc2NhcGUgY2hhcmFjdGVyIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjk1MQotbXNnaWQgIk1pc3NpbmcgY2xvc2UgcXVvdGU6IChhc3N1bWVkKSIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzoxMDEwIGFwcC5jOjEwNjQgYXBwLmM6MTEzMwotbXNnaWQgImVuZCBvZiBmaWxlIGluIGNvbW1lbnQ7IG5ld2xpbmUgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6MTA3NAotbXNnaWQgIkVPRiBpbiBDb21tZW50OiBOZXdsaW5lIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkdOVSBhc3NlbWJsZXIgdmVyc2lvbiAlcyAoJXMpIHVzaW5nIEJGRCB2ZXJzaW9uICVzIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MTI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkdOVSBhc3NlbWJsZXIgdmVyc2lvbiAlcyAoJXMpIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MTMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlOiAlcyBbb3B0aW9uLi4uXSBbYXNtZmlsZS4uLl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjEzNQotbXNnaWQgIiIKLSJPcHRpb25zOlxuIgotIiAgLWFbc3ViLW9wdGlvbi4uLl1cdHR1cm4gb24gbGlzdGluZ3NcbiIKLSIgICAgU3ViLW9wdGlvbnMgW2RlZmF1bHQgaGxzXTpcbiIKLSIgICAgYyAgIG9taXQgZmFsc2UgY29uZGl0aW9uYWxzXG4iCi0iICAgIGQgICBvbWl0IGRlYnVnZ2luZyBkaXJlY3RpdmVzXG4iCi0iICAgIGggICBpbmNsdWRlIGhpZ2gtbGV2ZWwgc291cmNlXG4iCi0iICAgIGwgICBpbmNsdWRlIGFzc2VtYmx5XG4iCi0iICAgIG0gICBpbmNsdWRlIG1hY3JvIGV4cGFuc2lvbnNcbiIKLSIgICAgbiAgIG9taXQgZm9ybXMgcHJvY2Vzc2luZ1xuIgotIiAgICBzICAgaW5jbHVkZSBzeW1ib2xzXG4iCi0iICAgIEwgICBpbmNsdWRlIGxpbmUgZGVidWcgc3RhdGlzdGljcyAoaWYgYXBwbGljYWJsZSlcbiIKLSIgICAgPWZpbGUgc2V0IGxpc3RpbmcgZmlsZSBuYW1lIChtdXN0IGJlIGxhc3Qgc3ViLW9wdGlvbilcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjE0OQotbXNnaWQgIiIKLSIgIC1EXHRcdCAgICAgICAgICBwcm9kdWNlIGFzc2VtYmxlciBkZWJ1Z2dpbmcgbWVzc2FnZXNcbiIKLSIgIC0tZGVmc3ltIFNZTT1WQUwgICAgICAgIGRlZmluZSBzeW1ib2wgU1lNIHRvIGdpdmVuIHZhbHVlXG4iCi0iICAtZlx0XHQgICAgICAgICAgc2tpcCB3aGl0ZXNwYWNlIGFuZCBjb21tZW50IHByZXByb2Nlc3NpbmdcbiIKLSIgIC0tZ3N0YWJzXHQgICAgICAgICAgZ2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4iCi0iICAtLWhlbHBcdFx0ICBzaG93IHRoaXMgbWVzc2FnZSBhbmQgZXhpdFxuIgotIiAgLUkgRElSXHRcdCAgYWRkIERJUiB0byBzZWFyY2ggbGlzdCBmb3IgLmluY2x1ZGUgZGlyZWN0aXZlc1xuIgotIiAgLUpcdFx0ICAgICAgICAgIGRvbid0IHdhcm4gYWJvdXQgc2lnbmVkIG92ZXJmbG93XG4iCi0iICAtS1x0XHQgICAgICAgICAgd2FybiB3aGVuIGRpZmZlcmVuY2VzIGFsdGVyZWQgZm9yIGxvbmcgZGlzcGxhY2VtZW50c1xuIgotIiAgLUwsLS1rZWVwLWxvY2FscyAgICAgICAga2VlcCBsb2NhbCBzeW1ib2xzIChlLmcuIHN0YXJ0aW5nIHdpdGggYEwnKVxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MTYwCi1tc2dpZCAiIgotIiAgLU0sLS1tcmlcdCAgICAgICAgICBhc3NlbWJsZSBpbiBNUkkgY29tcGF0aWJpbGl0eSBtb2RlXG4iCi0iICAtLU1EIEZJTEVcdCAgICAgICAgICB3cml0ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGluIEZJTEUgKGRlZmF1bHQgbm9uZSlcbiIKLSIgIC1ub2NwcFx0XHQgIGlnbm9yZWRcbiIKLSIgIC1vIE9CSkZJTEVcdCAgICAgICAgICBuYW1lIHRoZSBvYmplY3QtZmlsZSBvdXRwdXQgT0JKRklMRSAoZGVmYXVsdCBhLm91dClcbiIKLSIgIC1SXHRcdCAgICAgICAgICBmb2xkIGRhdGEgc2VjdGlvbiBpbnRvIHRleHQgc2VjdGlvblxuIgotIiAgLS1zdGF0aXN0aWNzXHQgICAgICAgICAgcHJpbnQgdmFyaW91cyBtZWFzdXJlZCBzdGF0aXN0aWNzIGZyb20gZXhlY3V0aW9uXG4iCi0iICAtLXN0cmlwLWxvY2FsLWFic29sdXRlICBzdHJpcCBsb2NhbCBhYnNvbHV0ZSBzeW1ib2xzXG4iCi0iICAtLXRyYWRpdGlvbmFsLWZvcm1hdFx0ICBVc2Ugc2FtZSBmb3JtYXQgYXMgbmF0aXZlIGFzc2VtYmxlciB3aGVuIHBvc3NpYmxlXG4iCi0iICAtLXZlcnNpb25cdFx0ICBwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXRcbiIKLSIgIC1XXHRcdFx0ICBzdXBwcmVzcyB3YXJuaW5nc1xuIgotIiAgLS1pdGJsIElOU1RUQkxcdCAgZXh0ZW5kIGluc3RydWN0aW9uIHNldCB0byBpbmNsdWRlIGluc3RydWN0aW9uc1xuIgotIlx0XHRcdCAgbWF0Y2hpbmcgdGhlIHNwZWNpZmljYXRpb25zIGRlZmluZWQgaW4gZmlsZSBJTlNUVEJMXG4iCi0iICAtd1x0XHRcdCAgaWdub3JlZFxuIgotIiAgLVhcdFx0XHQgIGlnbm9yZWRcbiIKLSIgIC1aXHRcdFx0ICBnZW5lcmF0ZSBvYmplY3QgZmlsZSBldmVuIGFmdGVyIGVycm9yc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6MTc3Ci1tc2dpZCAiIgotIiAgLS1saXN0aW5nLWxocy13aWR0aFx0ICBzZXQgdGhlIHdpZHRoIGluIHdvcmRzIG9mIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW4gIgotIm9mXG4iCi0iXHRcdFx0ICB0aGUgbGlzdGluZ1xuIgotIiAgLS1saXN0aW5nLWxocy13aWR0aDJcdCAgc2V0IHRoZSB3aWR0aCBpbiB3b3JkcyBvZiB0aGUgY29udGludWF0aW9uIGxpbmVzXG4iCi0iXHRcdFx0ICBvZiB0aGUgb3V0cHV0IGRhdGEgY29sdW1uOyBpZ25vcmVkIGlmIHNtYWxsZXIgdGhhblxuIgotIlx0XHRcdCAgdGhlIHdpZHRoIG9mIHRoZSBmaXJzdCBsaW5lXG4iCi0iICAtLWxpc3RpbmctcmhzLXdpZHRoXHQgIHNldCB0aGUgbWF4IHdpZHRoIGluIGNoYXJhY3RlcnMgb2YgdGhlIGxpbmVzIGZyb21cbiIKLSJcdFx0XHQgIHRoZSBzb3VyY2UgZmlsZVxuIgotIiAgLS1saXN0aW5nLWNvbnQtbGluZXNcdCAgc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250aW51YXRpb24gbGluZXMgdXNlZFxuIgotIlx0XHRcdCAgZm9yIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW4gb2YgdGhlIGxpc3RpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjE5MCBnYXNwLmM6MzU4OAotbXNnaWQgIiIKLSJcbiIKLSJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjIyNwotbXNnaWQgIm1pc3NpbmcgZW11bGF0aW9uIG1vZGUgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjI0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgZW11bGF0aW9uIG5hbWUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jLiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuCi0jOiBhcy5jOjQ2MgotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgYXNzZW1ibGVyICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0NjMKLW1zZ2lkICJDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjQ2NCBnYXNwLmM6MzY4MgotbXNnaWQgIiIKLSJUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG4iCi0idGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlRoaXMgYXNzZW1ibGVyIHdhcyBjb25maWd1cmVkIGZvciBhIHRhcmdldCBvZiBgJXMnLlxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDc0Ci1tc2dpZCAibXVsdGlwbGUgZW11bGF0aW9uIG5hbWVzIHNwZWNpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjQ3NgotbXNnaWQgImVtdWxhdGlvbnMgbm90IGhhbmRsZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImFsaWFzID0gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjQ4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5vbmljYWwgPSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDgzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNwdS10eXBlID0gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjQ4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJmb3JtYXQgPSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJmZC10YXJnZXQgPSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NTAxCi1tc2dpZCAiYmFkIGRlZnN5bTsgZm9ybWF0IGlzIC0tZGVmc3ltIG5hbWU9dmFsdWUiCi1tc2dzdHIgIiIKLQotIzogYXMuYzo1MjEKLW1zZ2lkICJObyBmaWxlIG5hbWUgZm9sbG93aW5nIC10IG9wdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkZhaWxlZCB0byByZWFkIGluc3RydWN0aW9uIHRhYmxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo2NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBsaXN0aW5nIG9wdGlvbiBgJWMnIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6ODYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB0b3RhbCB0aW1lIGluIGFzc2VtYmx5OiAlbGQuJTA2bGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjg2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZGF0YSBzaXplICVsZFxuIgotbXNnc3RyICIiCi0KLSMuCi0jLiAqIFdlIGhhdmUgYSBHUk9TUyBpbnRlcm5hbCBlcnJvci4KLSMuICogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLgotIy4KLSM6IGF0b2YtZ2VuZXJpYy5jOjQzOCBjb25maWcvdGMtYTI5ay5jOjU0NCBjb25maWcvdGMtaTg2MC5jOjMzNQotIzogY29uZmlnL3RjLWk4NjAuYzo3MDggY29uZmlnL3RjLW02OGsuYzozMTI0IGNvbmZpZy90Yy1tNjhrLmM6MzE1MwotIzogY29uZmlnL3RjLXNwYXJjLmM6MjE1NwotbXNnaWQgImZhaWxlZCBzYW5pdHkgY2hlY2suIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzo3NQotbXNnaWQgImludmFsaWQgaWRlbnRpZmllciBmb3IgXCIuaWZkZWZcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6MTI4Ci1tc2dpZCAibm9uLWNvbnN0YW50IGV4cHJlc3Npb24gaW4gXCIuaWZcIiBzdGF0ZW1lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjIyNAotbXNnaWQgImJhZCBmb3JtYXQgZm9yIGlmYyBvciBpZm5jIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoyNTcKLW1zZ2lkICJcIi5lbmRpZlwiIHdpdGhvdXQgXCIuaWZcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6Mjg3Ci1tc2dpZCAiLmVsc2Ugd2l0aG91dCBtYXRjaGluZyAuaWYgLSBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoyOTIKLW1zZ2lkICJkdXBsaWNhdGUgXCJlbHNlXCIgLSBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoyOTUKLW1zZ2lkICJoZXJlIGlzIHRoZSBwcmV2aW91cyBcImVsc2VcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6Mjk4Ci1tc2dpZCAiaGVyZSBpcyB0aGUgcHJldmlvdXMgXCJpZlwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzozNDMKLW1zZ2lkICIuaWZlcXMgc3ludGF4IGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzo0MzAKLW1zZ2lkICJlbmQgb2YgbWFjcm8gaW5zaWRlIGNvbmRpdGlvbmFsIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzo0MzIKLW1zZ2lkICJlbmQgb2YgZmlsZSBpbnNpZGUgY29uZGl0aW9uYWwiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjQzNQotbXNnaWQgImhlcmUgaXMgdGhlIHN0YXJ0IG9mIHRoZSB1bnRlcm1pbmF0ZWQgY29uZGl0aW9uYWwiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjQzOQotbXNnaWQgImhlcmUgaXMgdGhlIFwiZWxzZVwiIG9mIHRoZSB1bnRlcm1pbmF0ZWQgY29uZGl0aW9uYWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MTYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkF0dGVtcHQgdG8gcHV0IGEgY29tbW9uIHN5bWJvbCBpbnRvIHNldCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzoxNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXR0ZW1wdCB0byBwdXQgYW4gdW5kZWZpbmVkIHN5bWJvbCBpbnRvIHNldCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzoxOTYgY29uZmlnL29iai1lbGYuYzoxNTQwIGVjb2ZmLmM6MzY2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgYCVzJyBjYW4gbm90IGJlIGJvdGggd2VhayBhbmQgY29tbW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjI1NCBjb25maWcvb2JqLWNvZmYuYzoxNzcwCi1tc2dpZCAidW5yZXNvbHZlZCByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjI1NiBjb25maWcvb2JqLWNvZmYuYzoxNzcyCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCByZWxvY2F0aW9uOiBzeW1ib2wgYCVzJyBub3QgaW4gc3ltYm9sIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjM0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmFkIHR5cGUgZm9yIHdlYWsgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjQ1NyBjb25maWcvb2JqLWNvZmYuYzoyNzA0IHdyaXRlLmM6MTgwMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZ2xvYmFsIHN5bWJvbHMgbm90IHN1cHBvcnRlZCBpbiBjb21tb24gc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6NTI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzo2MTIKLW1zZ2lkICJzdWJzZWdtZW50IGluZGV4IHRvbyBoaWdoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYm91dC5jOjMxMiBjb25maWcvb2JqLXZtcy5jOjU2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJMb2NhbCBzeW1ib2wgJXMgbmV2ZXIgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoxMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN0cnVjdHVyZSB0YWJsZSBmYWlsZWQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQ1MyBjb25maWcvb2JqLWNvZmYuYzoyMTE3Ci1tc2dpZCAiLmxuIHBzZXVkby1vcCBpbnNpZGUgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjUxMyBjb25maWcvb2JqLWNvZmYuYzoyMTc0Ci1tc2dpZCAiLmRlZiBwc2V1ZG8tb3AgdXNlZCBpbnNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjU1OSBjb25maWcvb2JqLWNvZmYuYzoyMjI3Ci1tc2dpZCAiLmVuZGVmIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjU5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJgJXMnIHN5bWJvbCB3aXRob3V0IHByZWNlZGluZyBmdW5jdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo2MzUgY29uZmlnL29iai1jb2ZmLmM6MjMwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHN0b3JhZ2UgY2xhc3MgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NzM3IGNvbmZpZy9vYmotY29mZi5jOjI0MDkKLW1zZ2lkICIuZGltIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjc1NyBjb25maWcvb2JqLWNvZmYuYzoyNDI5Ci1tc2dpZCAiYmFkbHkgZm9ybWVkIC5kaW0gZGlyZWN0aXZlIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODA4IGNvbmZpZy9vYmotY29mZi5jOjI0OTIKLW1zZ2lkICIuc2l6ZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjgyNCBjb25maWcvb2JqLWNvZmYuYzoyNTA4Ci1tc2dpZCAiLnNjbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjg0MiBjb25maWcvb2JqLWNvZmYuYzoyNTI2Ci1tc2dpZCAiLnRhZyBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjg2MSBjb25maWcvb2JqLWNvZmYuYzoyNTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRhZyBub3QgZm91bmQgZm9yIC50YWcgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6ODc2IGNvbmZpZy9vYmotY29mZi5jOjI1NTkKLW1zZ2lkICIudHlwZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjg5OCBjb25maWcvb2JqLWNvZmYuYzoyNTgxCi1tc2dpZCAiLnZhbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjEwMjkgY29uZmlnL29iai1jb2ZmLmM6Mjc3NwotbXNnaWQgIm1pc21hdGNoZWQgLmViIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjEwNDggY29uZmlnL29iai1jb2ZmLmM6MjgxNwotbXNnaWQgIkNfRUZDTiBzeW1ib2wgb3V0IG9mIHNjb3BlIgotbXNnc3RyICIiCi0KLSMuIFNUWVBfSU5GTwotIy4gU1RZUF9MSUIKLSMuIFNUWVBfT1ZFUgotIzogY29uZmlnL29iai1jb2ZmLmM6MTI1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBzZWN0aW9uIGF0dHJpYnV0ZSAnJWMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjEyNjIgY29uZmlnL29iai1jb2ZmLmM6MzUyMCBjb25maWcvdGMtcHBjLmM6Mzc4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIHNlY3Rpb24gYXR0cmlidXRlICclYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTI4NCBjb25maWcvdGMtcHBjLmM6MzgwMiByZWFkLmM6MjQ5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciBzZXR0aW5nIGZsYWdzIGZvciBcIiVzXCI6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjE0MDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiMHglbHg6IFwiJXNcIiB0eXBlID0gJWxkLCBjbGFzcyA9ICVkLCBzZWdtZW50ID0gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoxNTk3IGNvbmZpZy9vYmotaWVlZS5jOjY5Ci1tc2dpZCAiT3V0IG9mIHN0ZXBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoyMDMyCi1tc2dpZCAiYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0IGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoyMjU5Ci1tc2dpZCAiYC5iZicgc3ltYm9sIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MzIyMCBjb25maWcvb2JqLWllZWUuYzo1MjIgb3V0cHV0LWZpbGUuYzo1MgotIzogb3V0cHV0LWZpbGUuYzoxMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRkFUQUw6IENhbid0IGNyZWF0ZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozMzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGNsb3NlICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozNDI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlRvbyBtYW55IG5ldyBzZWN0aW9uczsgY2FuJ3QgYWRkIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozODM4IGNvbmZpZy90Yy1tODhrLmM6MTI2MCBjb25maWcvdGMtc3BhcmMuYzozMDE2Ci1tc2dpZCAiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozODQ0IHJlYWQuYzoxOTU1Ci1tc2dpZCAiTWlzc2luZyBzaXplIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6Mzg1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJsY29tbSBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM4NzggcmVhZC5jOjIxODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sICVzIGFscmVhZHkgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozOTcyIGNvbmZpZy90Yy1pOTYwLmM6MzI3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJObyAnYmFsJyBlbnRyeSBwb2ludCBmb3IgbGVhZnByb2MgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDA1MSB3cml0ZS5jOjI0OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTmVnYXRpdmUgb2Ygbm9uLWFic29sdXRlIHN5bWJvbCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0MDcyIHdyaXRlLmM6MjUwOQotbXNnaWQgImNhbGxqIHRvIGRpZmZlcmVuY2Ugb2YgMiBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQxMTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgZW1pdCByZWxvYyB7LSAlcy1zZWcgc3ltYm9sIFwiJXNcIn0gQCBmaWxlIGFkZHJlc3MgJWxkLiIKLW1zZ3N0ciAiIgotCi0jLiBUaGlzIGlzIGEgQ09CUiBpbnN0cnVjdGlvbi4gIFRoZXkgaGF2ZSBvbmx5IGEgMTMtYml0Ci0jLiBkaXNwbGFjZW1lbnQgYW5kIGFyZSBvbmx5IHRvIGJlIHVzZWQgZm9yIGxvY2FsIGJyYW5jaGVzOgotIy4gZmxhZyBhcyBlcnJvciwgZG9uJ3QgZ2VuZXJhdGUgcmVsb2NhdGlvbi4KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQyMDggY29uZmlnL3RjLWk5NjAuYzozMjk0IHdyaXRlLmM6MjY1MwotbXNnaWQgImNhbid0IHVzZSBDT0JSIGZvcm1hdCB3aXRoIGV4dGVybmFsIGxhYmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQyODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVmFsdWUgb2YgJWxkIHRvbyBsYXJnZSBmb3IgZmllbGQgb2YgJWQgYnl0ZXMgYXQgMHglbHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDMwMiB3cml0ZS5jOjI3NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2lnbmVkIC53b3JkIG92ZXJmbG93OyBzd2l0Y2ggbWF5IGJlIHRvbyBsYXJnZTsgJWxkIGF0IDB4JWx4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWNvZmYuYzoyMzkKLW1zZ2lkICJDYW4ndCBzZXQgR1AgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lY29mZi5jOjI0NgotbXNnaWQgIkNhbid0IHNldCByZWdpc3RlciBtYXNrcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjI3NiBjb25maWcvdGMtc3BhcmMuYzozMTU3IGNvbmZpZy90Yy12ODUwLmM6MjYzCi1tc2dpZCAiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoyODMgY29uZmlnL3RjLWFyYy5jOjc3OCBjb25maWcvdGMtc3BhcmMuYzozMTY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5DT01Nb24gbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjI5MyBjb25maWcvdGMtYWxwaGEuYzozNDMwIGNvbmZpZy90Yy1zcGFyYy5jOjMxNzQKLSM6IGNvbmZpZy90Yy12ODUwLmM6Mjg1Ci1tc2dpZCAiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MzAxIGNvbmZpZy90Yy1hcmMuYzo3OTYgY29uZmlnL3RjLXNwYXJjLmM6MzE4MgotIzogY29uZmlnL3RjLXY4NTAuYzoyOTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MzI0IGNvbmZpZy90Yy1hcmMuYzo4MTUgY29uZmlnL3RjLXY4NTAuYzozMjIKLW1zZ2lkICJDb21tb24gYWxpZ25tZW50IG5lZ2F0aXZlOyAwIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzozNDMgY29uZmlnL3RjLW0zMnIuYzo2NjQgY29uZmlnL3RjLXBwYy5jOjEzOTUKLSM6IGNvbmZpZy90Yy12ODUwLmM6Mzg1Ci1tc2dpZCAiQ29tbW9uIGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NDA2IGNvbmZpZy90Yy1hcmMuYzo4NzUgY29uZmlnL3RjLXNwYXJjLmM6MzMwNgotIzogY29uZmlnL3RjLXY4NTAuYzo1NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIC5jb21tb24gc2VnbWVudCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjU5MQotbXNnaWQgIk1pc3Npbmcgc2VjdGlvbiBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NjU2Ci1tc2dpZCAiQmFkIC5zZWN0aW9uIGRpcmVjdGl2ZTogd2FudCBhLHcseCBpbiBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo3MDUKLW1zZ2lkICJVbnJlY29nbml6ZWQgc2VjdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NzE5Ci1tc2dpZCAiQmFkIC5zZWN0aW9uIGRpcmVjdGl2ZSAtIGNoYXJhY3RlciBmb2xsb3dpbmcgbmFtZSBpcyBub3QgJyMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NzUxCi1tc2dpZCAiVW5yZWNvZ25pemVkIHNlY3Rpb24gYXR0cmlidXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NzcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlNldHRpbmcgaW5jb3JyZWN0IHNlY3Rpb24gdHlwZSBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo3ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2V0dGluZyBpbmNvcnJlY3Qgc2VjdGlvbiBhdHRyaWJ1dGVzIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjkwNwotbXNnaWQgIi5wcmV2aW91cyB3aXRob3V0IGNvcnJlc3BvbmRpbmcgLnNlY3Rpb247IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo5NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibXVsdGlwbGUgLnN5bXZlciBkaXJlY3RpdmVzIGZvciBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjk2NQotbXNnaWQgImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgaW4gLnN5bXZlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjk4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJtaXNzaW5nIHZlcnNpb24gbmFtZSBpbiBgJXMnIGZvciBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjExOTMgY29uZmlnL29iai1zb20uYzoxNDggY29uZmlnL29iai1zb20uYzoxOTMKLW1zZ2lkICJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTIxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIGAlcycgaW4gLnNpemUgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTIyMwotbXNnaWQgIm1pc3NpbmcgZXhwcmVzc2lvbiBpbiAuc2l6ZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxMjkwCi0jLCBjLWZvcm1hdAotbXNnaWQgImlnbm9yaW5nIHVucmVjb2duaXplZCBzeW1ib2wgdHlwZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxNDY0Ci1tc2dpZCAiLnNpemUgZXhwcmVzc2lvbiB0b28gY29tcGxpY2F0ZWQgdG8gZml4IHVwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTQ5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iaW52YWxpZCBhdHRlbXB0IHRvIGRlY2xhcmUgZXh0ZXJuYWwgdmVyc2lvbiBuYW1lIGFzIGRlZmF1bHQgaW4gc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxNjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkZhaWxlZCB0byBzZXQgdXAgZGVidWdnaW5nIGluZm9ybWF0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjE2NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgc3RhcnQgd3JpdGluZyAubWRlYnVnIHNlY3Rpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTY0OQotIywgYy1mb3JtYXQKLW1zZ2lkICJDb3VsZCBub3Qgd3JpdGUgLm1kZWJ1ZyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWllZWUuYzo0NjAKLW1zZ2lkICJ0b28gbWFueSBzZWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXNvbS5jOjEzMQotbXNnaWQgIk9ubHkgb25lIC52ZXJzaW9uIHBzZXVkby1vcCBwZXIgZmlsZSEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1zb20uYzoxNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRkFUQUw6IEF0dGFjaGluZyB2ZXJzaW9uIGhlYWRlciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXNvbS5jOjE3NgotbXNnaWQgIk9ubHkgb25lIC5jb3B5cmlnaHQgcHNldWRvLW9wIHBlciBmaWxlISIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXNvbS5jOjIwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJGQVRBTDogQXR0YWNoaW5nIGNvcHlyaWdodCBoZWFkZXIgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY29tcGlsZXIgZW1pdHRlZCB6ZXJvLXNpemUgY29tbW9uIHN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJjb21waWxlciByZWRlZmluZWQgemVyby1zaXplIGNvbW1vbiBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjU5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJDb3VsZG4ndCBjcmVhdGUgVk1TIG9iamVjdCBmaWxlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjYyMwotbXNnaWQgIkkvTyBlcnJvciB3cml0aW5nIFZNUyBvYmplY3QgZmlsZSAobGVuZ3RoIHByZWZpeCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo2MzcKLW1zZ2lkICJJL08gZXJyb3Igd3JpdGluZyBWTVMgb2JqZWN0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoxMjQwCi1tc2dpZCAiQ291bGRuJ3QgZmluZCBzb3VyY2UgZmlsZSBcIiVzXCIsIHN0YXR1cz0lJVgleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjE3NDkgY29uZmlnL29iai12bXMuYzoyOTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnZ2VyIGZvcndhcmQgcmVmZXJlbmNlIGVycm9yLCBkYnggdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjE4MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVmFyaWFibGUgZGVzY3JpcHRvciAlZCB0b28gY29tcGxpY2F0ZWQuICBEZWZpbmVkIGFzIGB2b2lkIConLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjIxNDQKLW1zZ2lkICIiCi0iKioqV2FybmluZyAtIHRoZSBhc3NlbWJseSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIgaGFzIHBsYWNlZCBcbiIKLSIgZ2xvYmFsIGNvbnN0YW50KHMpIGluIHRoZSB0ZXh0IHBzZWN0LiAgVGhlc2Ugd2lsbCBub3QgYmUgYXZhaWxhYmxlIHRvIFxuIgotIiBvdGhlciBtb2R1bGVzLCBzaW5jZSB0aGlzIGlzIG5vdCB0aGUgY29ycmVjdCB3YXkgdG8gaGFuZGxlIHRoaXMuIFlvdSBcbiIKLSIgaGF2ZSB0d28gb3B0aW9uczogMSkgZ2V0IGEgcGF0Y2hlZCBjb21waWxlciB0aGF0IGRvZXMgbm90IHB1dCBnbG9iYWwgXG4iCi0iIGNvbnN0YW50cyBpbiB0aGUgdGV4dCBwc2VjdCwgb3IgMikgcmVtb3ZlIHRoZSAnY29uc3QnIGtleXdvcmQgZnJvbSBcbiIKLSIgZGVmaW5pdGlvbnMgb2YgZ2xvYmFsIHZhcmlhYmxlcyBpbiB5b3VyIHNvdXJjZSBtb2R1bGUocykuICBEb24ndCBzYXkgXG4iCi0iIEkgZGlkbid0IHdhcm4geW91ISBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjI0NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdnaW5lciBvdXRwdXQ6ICVkIGlzIGFuIHVua25vd24gdW50eXBlZCB2YXJpYWJsZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoyNjgxCi0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnZ2VyIG91dHB1dDogc3RydWN0dXJlIGVsZW1lbnQgYCVzJyBoYXMgdW5kZWZpbmVkIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoyNzkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnZ2VyIG91dHB1dDogJWQgaXMgYW4gdW5rbm93biB0eXBlIG9mIHZhcmlhYmxlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjI5MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGVidWdnZXIgb3V0cHV0OiBVbmFibGUgdG8gcmVzb2x2ZSAlZCBjaXJjdWxhciByZWZlcmVuY2VzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjMxMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTW9kdWxlIG5hbWUgdHJ1bmNhdGVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MzQxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgJXMgcmVwbGFjZWQgYnkgJXNcbiIKLW1zZ3N0ciAiIgotCi0jLiBpbXBvc3NpYmxlCi0jOiBjb25maWcvb2JqLXZtcy5jOjM2OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBWTVMgcHNlY3QgdHlwZSAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjM3MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR2xvYmFsc3ltYm9sIGF0dHJpYnV0ZSBmb3Igc3ltYm9sICVzIHdhcyB1bmV4cGVjdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjM4ODUKLW1zZ2lkICJJbnZhbGlkIGRhdGEgdHlwZSBmb3IgZ2xvYmFsdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzozODk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgZ2xvYmFsdmFsdWUgb2YgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0MjQ3Ci1tc2dpZCAiQ291bGRuJ3QgZmluZCBmaXh1cCBmcmFnbWVudCB3aGVuIGNoZWNraW5nIGZvciBpbmRpcmVjdCByZWZlcmVuY2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NTkxIGNvbmZpZy9vYmotdm1zLmM6NDczMwotbXNnaWQgIkZpeHVwIGRhdGEgYWRkc3kgYW5kIHN1YnN5IGRvbid0IGhhdmUgdGhlIHNhbWUgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ1OTUgY29uZmlnL29iai12bXMuYzo0NzM3Ci1tc2dpZCAiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDU5OCBjb25maWcvb2JqLXZtcy5jOjQ3NDAKLW1zZ2lkICJGaXh1cCBkYXRhIGlzIGVycm9uZW91c2x5IFwicGNyZWxcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ2MTQgY29uZmlnL29iai12bXMuYzo0NzU5Ci1tc2dpZCAiRml4dXAgZGF0dW0gaXMgbm90IGEgbG9uZ3dvcmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NjE4IGNvbmZpZy9vYmotdm1zLmM6NDc2MwotbXNnaWQgIkZpeHVwIGRhdHVtIGlzIG5vdCBcImZpeFAtPmZ4X2FkZHN5XCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0ODM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJnKysgd3JvdGUgYW4gZXh0ZXJuIHJlZmVyZW5jZSB0byBgJXMnIGFzIGEgcm91dGluZS5cbiIKLSJJIHdpbGwgZml4IGl0LCBidXQgSSBob3BlIHRoYXQgaXQgd2FzIG5vdGUgcmVhbGx5IGEgcm91dGluZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0OTY2Ci1tc2dpZCAiQ2FuJ3QgaGFuZGxlIGdsb2JhbCB4dG9ycyBzeW1ib2xzIHlldC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0OTY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gJXMiCi1tc2dzdHIgIiIKLQotIy4KLSMuICoJRXJyb3Igb3RoZXJ3aXNlLgotIy4KLSM6IGNvbmZpZy9vYmotdm1zLmM6NTA1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmhhbmRsZWQgc3RhYiB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6MTYwIGNvbmZpZy90Yy1zcGFyYy5jOjMzNTgKLW1zZ2lkICJVbmtub3duIHNlZ21lbnQgdHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBQcm9iYWJseSBhIG1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0/ICBHaXZlIHVwIG5vdy4KLSM6IGNvbmZpZy90Yy1hMjlrLmM6MzMwIGNvbmZpZy90Yy1ocHBhLmM6MTMzNiBjb25maWcvdGMtaTg2MC5jOjIwMgotIzogY29uZmlnL3RjLW1pcHMuYzoxMDE2IGNvbmZpZy90Yy1taXBzLmM6MTA1OCBjb25maWcvdGMtc3BhcmMuYzo3MTUKLW1zZ2lkICJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjM3NSBjb25maWcvdGMtYXJjLmM6NTM0IGNvbmZpZy90Yy1kMTB2LmM6NDgxCi0jOiBjb25maWcvdGMtZDMwdi5jOjU0MCBjb25maWcvdGMtaDgzMDAuYzozMDUgY29uZmlnL3RjLWg4NTAwLmM6Mjk3Ci0jOiBjb25maWcvdGMtbWNvcmUuYzo1MDkgY29uZmlnL3RjLW1uMTAyMDAuYzo5MzYgY29uZmlnL3RjLW1uMTAzMDAuYzo5OTIKLSM6IGNvbmZpZy90Yy1wcGMuYzoxODUwIGNvbmZpZy90Yy1zaC5jOjQ3OCBjb25maWcvdGMtdGljODAuYzoyOTEKLSM6IGNvbmZpZy90Yy12ODUwLmM6MjAzMyBjb25maWcvdGMtdzY1LmM6MjU3IGNvbmZpZy90Yy16OGsuYzozNDEKLW1zZ2lkICJtaXNzaW5nIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo0MTUgY29uZmlnL3RjLWhwcGEuYzoxNDUwIGNvbmZpZy90Yy1pODYwLmM6NDA3Ci0jOiBjb25maWcvdGMtaTg2MC5jOjQyMyBjb25maWcvdGMtc3BhcmMuYzoxMTkxIGNvbmZpZy90Yy1zcGFyYy5jOjExOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBvcGNvZGU6IGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo0MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBvcGNvZGUgYCVzJy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo0NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVG9vIG1hbnkgb3BlcmFuZHM6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6NDc0IGNvbmZpZy90Yy1hMjlrLmM6NTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkltbWVkaWF0ZSB2YWx1ZSBvZiAlbGQgaXMgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6ODkyIGNvbmZpZy90Yy1pODYwLmM6OTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCByZWxvY2F0aW9uIHR5cGU6IDB4JTAyeCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjkxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJuZWVkICVvM1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6OTMyCi1tc2dpZCAiYTI5a19jb252ZXJ0X2ZyYWdcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjk0MQotbXNnaWQgImEyOWtfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjEwOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGFiZWwgXCIkJWRcIiByZWRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzoxMTY1Ci1tc2dpZCAiSW52YWxpZCBleHByZXNzaW9uIGFmdGVyICUlJSVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjExNzYKLW1zZ2lkICJJbnZhbGlkIHJlZ2lzdGVyIGluICYgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo3MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggb3Bjb2RlIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjc1NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBtYWNybyBgJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo4MzIgY29uZmlnL3RjLWk5NjAuYzoyNzM2Ci1tc2dpZCAic3ludGF4IGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjkwNSBjb25maWcvdGMtYXJtLmM6NDk4MiBjb25maWcvdGMtaDgzMDAuYzoxNDEzCi0jOiBjb25maWcvdGMtaDg1MDAuYzoxMjIyIGNvbmZpZy90Yy1ocHBhLmM6MjY4NCBjb25maWcvdGMtaTg2MC5jOjgxMwotIzogY29uZmlnL3RjLW02OGsuYzo0MTI1IGNvbmZpZy90Yy1tODhrLmM6MTEwNiBjb25maWcvdGMtbnMzMmsuYzoxNTg4Ci0jOiBjb25maWcvdGMtc3BhcmMuYzoyNDMzIGNvbmZpZy90Yy16OGsuYzoxMzU1Ci1tc2dpZCAiQmFkIGNhbGwgdG8gTURfQVRPRigpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjk1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIENQVSBpZGVudGlmaWVyIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6OTk5Ci1tc2dpZCAiIgotIkFscGhhIG9wdGlvbnM6XG4iCi0iLTMyYWRkclx0XHRcdHRyZWF0IGFkZHJlc3NlcyBhcyAzMi1iaXQgdmFsdWVzXG4iCi0iLUZcdFx0XHRsYWNrIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyBzdXBwb3J0XG4iCi0iLW1ldjQgfCAtbWV2NDUgfCAtbWV2NSB8IC1tZXY1NiB8IC1tcGNhNTYgfCAtbWV2NiB8IC1tYWxsXG4iCi0iXHRcdFx0c3BlY2lmeSB2YXJpYW50IG9mIEFscGhhIGFyY2hpdGVjdHVyZVxuIgotIi1tMjEwNjQgfCAtbTIxMDY2IHwgLW0yMTE2NCB8IC1tMjExNjRhIHwgLW0yMTE2NHBjIHwgLW0yMTI2NFxuIgotIlx0XHRcdHRoZXNlIHZhcmlhbnRzIGluY2x1ZGUgUEFMY29kZSBvcGNvZGVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTAwOQotbXNnaWQgIiIKLSJWTVMgb3B0aW9uczpcbiIKLSItK1x0XHRcdGhhc2ggZW5jb2RlIChkb24ndCB0cnVuY2F0ZSkgbmFtZXMgbG9uZ2VyIHRoYW4gNjQgY2hhcmFjdGVyc1xuIgotIi1IXHRcdFx0c2hvdyBuZXcgc3ltYm9sIGFmdGVyIGhhc2ggdHJ1bmNhdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjExNjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5oYW5kbGVkIHJlbG9jYXRpb24gdHlwZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxMTc4Ci1tc2dpZCAibm9uLWFic29sdXRlIGV4cHJlc3Npb24gaW4gY29uc3RhbnQgZmllbGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTE5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJ0eXBlICVkIHJlbG9jIGRvbmU/XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTI0MyBjb25maWcvdGMtYWxwaGEuYzoxMjUwIGNvbmZpZy90Yy1taXBzLmM6NzMyOQotbXNnaWQgIlVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxNDA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCByZXByZXNlbnQgYCVzJyByZWxvY2F0aW9uIGluIG9iamVjdCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjE0MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I/IGNhbm5vdCBnZW5lcmF0ZSBgJXMnIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTQ2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJmcmFtZSByZWcgZXhwZWN0ZWQsIHVzaW5nICQlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTc5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWQgYW5kICVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxODkxIGNvbmZpZy90Yy1hcmMuYzo1NDcgY29uZmlnL3RjLWQxMHYuYzo1NzAKLSM6IGNvbmZpZy90Yy1kMzB2LmM6NjIzIGNvbmZpZy90Yy1tbjEwMjAwLmM6OTkxIGNvbmZpZy90Yy1tbjEwMzAwLmM6MTA1OAotIzogY29uZmlnL3RjLXBwYy5jOjE4MTYgY29uZmlnL3RjLXBwYy5jOjE5MjMgY29uZmlnL3RjLXBwYy5jOjE5MzUKLSM6IGNvbmZpZy90Yy12ODUwLmM6MTgxOSBjb25maWcvdGMtdjg1MC5jOjE4NDIgY29uZmlnL3RjLXY4NTAuYzoyMDU1Ci1tc2dpZCAidG9vIG1hbnkgZml4dXBzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjIwMTYgY29uZmlnL3RjLWFscGhhLmM6MjA3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbmFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3Igb3Bjb2RlIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjAxOCBjb25maWcvdGMtYWxwaGEuYzoyMDc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wY29kZSBgJXMnIG5vdCBzdXBwb3J0ZWQgZm9yIHRhcmdldCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyMDIyIGNvbmZpZy90Yy1hbHBoYS5jOjIwNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvcGNvZGUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyMTMxCi1tc2dpZCAiY2FuIG5vdCByZXNvbHZlIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjI2OSBjb25maWcvdGMtYWxwaGEuYzoyNDQ2Ci1tc2dpZCAib3ZlcmZsb3cgaW4gbGl0ZXJhbCAoLmxpdGEpIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjIyNzYgY29uZmlnL3RjLWFscGhhLmM6MjI5OCBjb25maWcvdGMtYWxwaGEuYzoyNDU5Ci0jOiBjb25maWcvdGMtYWxwaGEuYzoyNjgxIGNvbmZpZy90Yy1hbHBoYS5jOjI3MjggY29uZmlnL3RjLWFscGhhLmM6Mjc3NgotIzogY29uZmlnL3RjLWFscGhhLmM6Mjg2NSBjb25maWcvdGMtYWxwaGEuYzozMDY2IGNvbmZpZy90Yy1hbHBoYS5jOjMxNjcKLW1zZ2lkICJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjI3OCBjb25maWcvdGMtYWxwaGEuYzoyMzAwIGNvbmZpZy90Yy1hbHBoYS5jOjI0NjEKLW1zZ2lkICJtYWNybyByZXF1aXJlcyAkYXQgd2hpbGUgJGF0IGluIHVzZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyNDA4IGV4cHIuYzo4NiByZWFkLmM6MzEyNQotbXNnaWQgImJpZ251bSBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjQxMCBleHByLmM6ODggcmVhZC5jOjMxMjcgcmVhZC5jOjM0NTcgcmVhZC5jOjQzNTMKLW1zZ2lkICJmbG9hdGluZyBwb2ludCBudW1iZXIgaW52YWxpZDsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjI0MTUKLW1zZ2lkICJjYW4ndCBoYW5kbGUgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyNDUyCi1tc2dpZCAib3ZlcmZsb3cgaW4gbGl0ZXJhbCAoLmxpdDgpIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM0MDEgY29uZmlnL3RjLXBwYy5jOjEzNDQgY29uZmlnL3RjLXBwYy5jOjM1NDgKLSM6IHJlYWQuYzoxMzc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5DT01Nb24gbGVuZ3RoICglbGQuKSA8MCEgSWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzQzOSBjb25maWcvdGMtYWxwaGEuYzozNDQ4IGNvbmZpZy90Yy1wcGMuYzozNTg1Ci0jOiByZWFkLmM6MTM5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM1NTAgZWNvZmYuYzozMTA4Ci1tc2dpZCAiLmVudCBkaXJlY3RpdmUgaGFzIG5vIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzU1OAotbXNnaWQgIm5lc3RlZCAuZW50IGRpcmVjdGl2ZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzU5NCBlY29mZi5jOjMwNTYKLW1zZ2lkICIuZW5kIGRpcmVjdGl2ZSBoYXMgbm8gbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNjAzCi1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgbmFtZXMgZGlmZmVyZW50IHN5bWJvbCB0aGFuIC5lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzY3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGFyZ3VtZW50ICVkIHRvIC5wcm9sb2d1ZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzcwNgotbXNnaWQgIkVDT0ZGIGRlYnVnZ2luZyBpcyBkaXNhYmxlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzcyNwotbXNnaWQgIlVua25vd24gc2VjdGlvbiBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6Mzc2NAotbXNnaWQgIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6Mzc5MgotbXNnaWQgIkJhZCAuZnJhbWUgZGlyZWN0aXZlIDEuLzIuIHBhcmFtIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM4MDQKLW1zZ2lkICJCYWQgLmZyYW1lIGRpcmVjdGl2ZSAzLi80LiBwYXJhbSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozODI5Ci1tc2dpZCAiLnBkZXNjIGRpcmVjdGl2ZSBub3QgaW4gbGluayAoLmxpbmspIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzgzNwotbXNnaWQgIi5wZGVzYyBoYXMgbm8gbWF0Y2hpbmcgLmVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozODQ3Ci1tc2dpZCAiLnBkZXNjIGRpcmVjdGl2ZSBoYXMgbm8gZW50cnkgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM4NTkKLW1zZ2lkICJObyBjb21tYSBhZnRlciAucGRlc2MgPGVudHJ5bmFtZT4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6Mzg4MgotbXNnaWQgInVua25vd24gcHJvY2VkdXJlIGtpbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6Mzk3NwotbXNnaWQgIi5uYW1lIGRpcmVjdGl2ZSBub3QgaW4gbGluayAoLmxpbmspIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6Mzk4NQotbXNnaWQgIi5uYW1lIGRpcmVjdGl2ZSBoYXMgbm8gc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQwMjAKLW1zZ2lkICJObyBzeW1ib2wgYWZ0ZXIgLmxpbmthZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDA0OQotbXNnaWQgIk5vIHN5bWJvbCBhZnRlciAuY29kZV9hZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQwODQgZWNvZmYuYzozMjczCi1tc2dpZCAiQmFkIC5tYXNrIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MTA2IGVjb2ZmLmM6MzIwNAotbXNnaWQgIkJhZCAuZm1hc2sgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQyNzcgcmVhZC5jOjIxNDQgcmVhZC5jOjI2OTYgc3RhYnMuYzo0NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIy4gc3ltYm9sUC0+c3lfb3RoZXIgPSAoc2lnbmVkIGNoYXIpIHRlbXA7Ci0jOiBjb25maWcvdGMtYWxwaGEuYzo0Mjg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuaGFuZGxlZDogLnByb2MgJXMsJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDMyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJUcmllZCB0byAuc2V0IHVucmVjb2duaXplZCBtb2RlIGAlcyciCi1tc2dzdHIgIiIKLQotIy4gbm90IGZhdGFsLCBidXQgaXQgbWlnaHQgbm90IHdvcmsgaW4gdGhlIGVuZAotIzogY29uZmlnL3RjLWFscGhhLmM6NDM0MAotbXNnaWQgIkZpbGUgb3ZlcnJpZGVzIG5vLWJhc2UtcmVnaXN0ZXIgb3B0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJhZCBiYXNlIHJlZ2lzdGVyLCB1c2luZyAkJWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQzNzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQuIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDM4MyBjb25maWcvdGMtZDMwdi5jOjIxNjMKLW1zZ2lkICJBbGlnbm1lbnQgbmVnYXRpdmU6IDAgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0Njk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNob3NlIEdQIHZhbHVlIG9mICVseFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxMzYKLW1zZ2lkICIiCi0iQVJDIG9wdGlvbnM6XG4iCi0iLUVCXHRcdFx0Z2VuZXJhdGUgYmlnIGVuZGlhbiBvdXRwdXRcbiIKLSItRUxcdFx0XHRnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIG91dHB1dFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxNTQgY29uZmlnL3RjLWFyYy5jOjE3NyBjb25maWcvdGMtYXJjLmM6OTIxCi0jOiBjb25maWcvdGMtaHBwYS5jOjEyOTggY29uZmlnL3RjLWhwcGEuYzo1MDU0IGNvbmZpZy90Yy1ocHBhLmM6NTA2MAotIzogY29uZmlnL3RjLWhwcGEuYzo1MDY2IGNvbmZpZy90Yy1tbjEwMzAwLmM6NzIxIGNvbmZpZy90Yy1tbjEwMzAwLmM6MTY0NgotbXNnaWQgImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxNzQKLW1zZ2lkICJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjI1MyBjb25maWcvdGMtbW4xMDIwMC5jOjEzNTQgY29uZmlnL3RjLW1uMTAzMDAuYzoxNTY1Ci0jOiBjb25maWcvdGMtcHBjLmM6MTEwMSBjb25maWcvdGMtdjg1MC5jOjE2MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6Mzg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gc3ludGF4IGZvcm1hdCBjaGFyYWN0ZXIgYCVjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NDg3Ci1tc2dpZCAidG9vIG1hbnkgc3VmZml4ZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjUzMiBjb25maWcvdGMtZDEwdi5jOjQ3OSBjb25maWcvdGMtZDMwdi5jOjUzOAotIzogY29uZmlnL3RjLW1uMTAyMDAuYzo5MzMgY29uZmlnL3RjLW1uMTAzMDAuYzo5ODkgY29uZmlnL3RjLXBwYy5jOjE4NDgKLSM6IGNvbmZpZy90Yy10aWM4MC5jOjI4NyBjb25maWcvdGMtdjg1MC5jOjIwMzAKLW1zZ2lkICJpbGxlZ2FsIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjYxOSBjb25maWcvdGMtbW4xMDIwMC5jOjEwMzIgY29uZmlnL3RjLW1uMTAzMDAuYzoxMTI4Ci0jOiBjb25maWcvdGMtcHBjLmM6MTk3MiBjb25maWcvdGMtdjg1MC5jOjIxMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAianVuayBhdCBlbmQgb2YgbGluZTogYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NjU5Ci1tc2dpZCAiOCBieXRlIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjY2MQotbXNnaWQgIjggYnl0ZSBqdW1wIGluc3RydWN0aW9uIHdpdGggZGVsYXkgc2xvdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NjY5Ci1tc2dpZCAiY29uZGl0aW9uYWwgYnJhbmNoIGZvbGxvd3Mgc2V0IG9mIGZsYWdzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo3NDggY29uZmlnL3RjLWFybS5jOjYwMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGluc3RydWN0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjc3MQotbXNnaWQgImV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo3ODgKLW1zZ2lkICJpZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjgwMwotbXNnaWQgImV4cGVjdGVkIGNvbW1hIGFmdGVyIGNvbW1vbiBsZW5ndGgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjg5NgotbXNnaWQgIi5jcHUgY29tbWFuZCBtdXN0IGFwcGVhciBiZWZvcmUgYW55IGluc3RydWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6OTE1Ci1tc2dpZCAiLmNwdSBjb25mbGljdHMgd2l0aCBwcmV2aW91cyB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6OTI2Ci1tc2dpZCAiYmFkIC5jcHUgb3AiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjk1MCBjb25maWcvdGMtcHBjLmM6MjYyMQotbXNnaWQgIm1pc3NpbmcgcmVuYW1lIHN0cmluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6OTYyCi1tc2dpZCAiaW52YWxpZCBzeW1ib2wgdG8gcmVuYW1lIHRvIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxMDA5IGNvbmZpZy90Yy1kMTB2LmM6Mjc0IGNvbmZpZy90Yy1kMzB2LmM6MzUzCi0jOiBjb25maWcvdGMtbWlwcy5jOjg3MzYgY29uZmlnL3RjLW1uMTAyMDAuYzozNTYgY29uZmlnL3RjLXBwYy5jOjQzNjkKLSM6IGNvbmZpZy90Yy1zaC5jOjExODcgY29uZmlnL3RjLXY4NTAuYzoxMjc2Ci1tc2dpZCAiYmFkIGNhbGwgdG8gbWRfYXRvZiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTA5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJtaXNzaW5nICcpJyBpbiAlLW9wIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxMTMwCi1tc2dpZCAiZXhwcmVzc2lvbiB0b28gY29tcGxleCBmb3IgJSVzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTMyNCBjb25maWcvdGMtYXJtLmM6MjkzNyBjb25maWcvdGMtZDEwdi5jOjE0NDgKLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTgxMCBjb25maWcvdGMtbWlwcy5jOjMxOTYgY29uZmlnL3RjLW1pcHMuYzo0MTI4Ci0jOiBjb25maWcvdGMtbWlwcy5jOjQ5MTMgY29uZmlnL3RjLW1pcHMuYzo1NDU5IGNvbmZpZy90Yy1wcGMuYzo0NzA0Ci0jOiBjb25maWcvdGMtdjg1MC5jOjIzMzkKLW1zZ2lkICJleHByZXNzaW9uIHRvbyBjb21wbGV4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxMzkwIGNvbmZpZy90Yy1wcGMuYzo0ODA3IGNvbmZpZy90Yy12ODUwLmM6MjM4MwotbXNnaWQgInVucmVzb2x2ZWQgZXhwcmVzc2lvbiB0aGF0IG11c3QgYmUgcmVzb2x2ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjE0NTQgY29uZmlnL3RjLXNwYXJjLmM6Mjg4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgZXhwb3J0IHJlbG9jIHR5cGUgJWQgKGAlcycpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo5ODMKLW1zZ2lkICJMaXRlcmFsIFBvb2wgT3ZlcmZsb3ciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjExMDMKLW1zZ2lkICJJbnZhbGlkIHN5bnRheCBmb3IgLnJlcSBkaXJlY3RpdmUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMTM5Ci1tc2dpZCAiTm90aGluZyB0byBwdXQgaW4gdGhlIHBvb2xcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTE1MQotbXNnaWQgIkluc2VydGluZyBpbXBsaWNpdCBwb29sIGF0IGNoYW5nZSBvZiBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMTgzIGNvbmZpZy90Yy1taXBzLmM6OTg1MSByZWFkLmM6MjAzOAotIywgYy1mb3JtYXQKLW1zZ2lkICJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjExODYgcmVhZC5jOjIwNDMKLW1zZ2lkICJBbGlnbm1lbnQgbmVnYXRpdmUuIDAgYXNzdW1lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjEyNTEKLW1zZ2lkICJzZWxlY3RlZCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBUSFVNQiBvcGNvZGVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMjYzCi1tc2dpZCAic2VsZWN0ZWQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgQVJNIG9wY29kZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjEyNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBpbnN0cnVjdGlvbiBzaXplIHNlbGVjdGVkICglZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjEzMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kIHRvIC5jb2RlIGRpcmVjdGl2ZSAoJWQpIChleHBlY3RpbmcgMTYgb3IgMzIpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMzE5Ci1tc2dpZCAiR2FyYmFnZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIy4gSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQotIy4gdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbgotIzogY29uZmlnL3RjLWFybS5jOjEzNjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVnaXN0ZXIgZXhwZWN0ZWQsIG5vdCAnJS4xMDBzJyIKLW1zZ3N0ciAiIgotCi0jLiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0jLiB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuCi0jOiBjb25maWcvdGMtYXJtLmM6MTM5MwotbXNnaWQgIjxwc3IoZik+IGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNDI0Ci1tc2dpZCAiSWxsZWdhbCBjby1wcm9jZXNzb3IgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNDMxCi1tc2dpZCAiQmFkIG9yIG1pc3NpbmcgY28tcHJvY2Vzc29yIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTQ1NgotbXNnaWQgImJhZCBvciBtaXNzaW5nIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE0NjIKLW1zZ2lkICJpbW1lZGlhdGUgY28tcHJvY2Vzc29yIGV4cHJlc3Npb24gdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSMuIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSMuIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNDg3Ci1tc2dpZCAiQ28tcHJvY2Vzc29yIHJlZ2lzdGVyIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSMuIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSMuIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNTExCi1tc2dpZCAiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE1MjkKLW1zZ2lkICJpbW1lZGlhdGUgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTU0NAotbXNnaWQgImNvLXByb2Nlc3NvciBhZGRyZXNzIG11c3QgYmUgd29yZCBhbGlnbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNTUwCi1tc2dpZCAib2Zmc2V0IHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTYwMAotbXNnaWQgInBjIG1heSBub3QgYmUgdXNlZCBpbiBwb3N0LWluY3JlbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTYxNiBjb25maWcvdGMtYXJtLmM6MjcyNwotbXNnaWQgInByZS1pbmRleGVkIGV4cHJlc3Npb24gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE2MzAgY29uZmlnL3RjLWFybS5jOjI3NDAgY29uZmlnL3RjLWFybS5jOjMwODkKLW1zZ2lkICJtaXNzaW5nIF0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE2NDEKLW1zZ2lkICJwYyBtYXkgbm90IGJlIHVzZWQgd2l0aCB3cml0ZS1iYWNrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNjk2Ci1tc2dpZCAiPHBzcj4gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE3NTggY29uZmlnL3RjLWFybS5jOjIzNzgKLW1zZ2lkICJSZWdpc3RlciBvciBzaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNzcyIGNvbmZpZy90Yy1hcm0uYzoyMDkwIGNvbmZpZy90Yy1hcm0uYzoyMzQ1Ci0jOiBjb25maWcvdGMtYXJtLmM6MjM2NQotbXNnaWQgIkludmFsaWQgY29uc3RhbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE3ODMKLW1zZ2lkICJFcnJvcjogdW5yZWNvZ25pc2VkIHN5bnRheCBmb3Igc2Vjb25kIGFyZ3VtZW50IHRvIG1zciBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTgzMwotbXNnaWQgInJkaGksIHJkbG8gYW5kIHJtIG11c3QgYWxsIGJlIGRpZmZlcmVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTg5MAotbXNnaWQgInJkIGFuZCBybSBzaG91bGQgYmUgZGlmZmVyZW50IGluIG11bCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTk0NwotbXNnaWQgInJkIGFuZCBybSBzaG91bGQgYmUgZGlmZmVyZW50IGluIG1sYSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjA3NAotbXNnaWQgImJhZF9zZWdtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMTIxIGNvbmZpZy90Yy1hcm0uYzoyMTk5Ci1tc2dpZCAiU2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjE2MwotbXNnaWQgIkludmFsaWQgaW1tZWRpYXRlIHNoaWZ0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMTkyCi1tc2dpZCAic2hpZnQgcmVxdWlyZXMgcmVnaXN0ZXIgb3IgI2V4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjIxOTMKLW1zZ2lkICJzaGlmdCByZXF1aXJlcyAjZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjMzNiBjb25maWcvdGMtYXJtLmM6Mjc3MAotbXNnaWQgIkNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI0MzIKLW1zZ2lkICJJbnZhbGlkIGZsb2F0aW5nIHBvaW50IGltbWVkaWF0ZSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyNDM1Ci1tc2dpZCAiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgb3IgaW1tZWRpYXRlIGV4cHJlc3Npb24gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI1NzQKLW1zZ2lkICJhZGRyZXNzIG9mZnNldCB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI2NDUKLW1zZ2lkICJQcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBoYWxmd29yZHMgb3Igc2lnbmVkIGJ5dGVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyNjY3Ci1tc2dpZCAiQWRkcmVzcyBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjY5OCBjb25maWcvdGMtYXJtLmM6MjcxMiBjb25maWcvdGMtYXJtLmM6Mjc1MAotbXNnaWQgImRlc3RpbmF0aW9uIHJlZ2lzdGVyIHNhbWUgYXMgd3JpdGUtYmFjayBiYXNlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI3OTAKLW1zZ2lkICJsaXRlcmFsIHBvb2wgaW5zZXJ0aW9uIGZhaWxlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjgyNgotbXNnaWQgIlByZS1pbmNyZW1lbnQgaW5zdHJ1Y3Rpb24gd2l0aCB0cmFuc2xhdGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI4NjgKLW1zZ2lkICJCYWQgcmFuZ2UgaW4gcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mjg3NiBjb25maWcvdGMtYXJtLmM6Mjg4NSBjb25maWcvdGMtYXJtLmM6MjkyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBEdXBsaWNhdGVkIHJlZ2lzdGVyIChyJWQpIGluIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI4ODgKLW1zZ2lkICJXYXJuaW5nOiBSZWdpc3RlciByYW5nZSBub3QgaW4gYXNjZW5kaW5nIG9yZGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyOTAwCi1tc2dpZCAiTWlzc2luZyBgfSciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI5MTYKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIG1hc2siCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI5NzcKLW1zZ2lkICJyMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzA0NyBjb25maWcvdGMtYXJtLmM6MzA2MQotbXNnaWQgInIxNSBub3QgYWxsb3dlZCBpbiBzd2FwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozMTU4Ci1tc2dpZCAiVXNlIG9mIHIxNSBpbiBieCBoYXMgdW5kZWZpbmVkIGJlaGF2aW91ciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzQxNyBjb25maWcvdGMtdjg1MC5jOjE5MjEgY29uZmlnL3RjLXY4NTAuYzoxOTQyCi1tc2dpZCAiY29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzQyMwotbXNnaWQgIkNvbnN0YW50IHZhbHVlIHJlcXVpcmVkIGZvciBudW1iZXIgb2YgcmVnaXN0ZXJzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNDMxCi1tc2dpZCAibnVtYmVyIG9mIHJlZ2lzdGVycyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMTo0XSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzQ5MwotbXNnaWQgIlIxNSBub3QgYWxsb3dlZCBhcyBiYXNlIHJlZ2lzdGVyIHdpdGggd3JpdGUtYmFjayIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mzc0NQotbXNnaWQgImxvIHJlZ2lzdGVyIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozNzUzCi1tc2dpZCAiaGkgcmVnaXN0ZXIgcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM4MjMKLW1zZ2lkICJkZXN0IGFuZCBzb3VyY2UxIG11c3QgYmUgdGhlIHNhbWUgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM4MzAKLW1zZ2lkICJzdWJ0cmFjdCB2YWxpZCBvbmx5IG9uIGxvIHJlZ3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM4NTQKLW1zZ2lkICJpbnZhbGlkIEhpIHJlZ2lzdGVyIHdpdGggaW1tZWRpYXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozODgxIGNvbmZpZy90Yy1hcm0uYzozOTE0IGNvbmZpZy90Yy1hcm0uYzozOTI0Ci1tc2dpZCAiaW1tZWRpYXRlIHZhbHVlIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mzg5MgotbXNnaWQgImludmFsaWQgaW1tZWRpYXRlIHZhbHVlIGZvciBzdGFjayBhZGp1c3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM5MDMKLW1zZ2lkICJpbnZhbGlkIGltbWVkaWF0ZSBmb3IgYWRkcmVzcyBjYWxjdWxhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mzk5MAotbXNnaWQgInNvdXJjZTEgYW5kIGRlc3QgbXVzdCBiZSBzYW1lIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MDI1Ci1tc2dpZCAiSW52YWxpZCBpbW1lZGlhdGUgZm9yIHNoaWZ0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MTA0Ci1tc2dpZCAib25seSBsbyByZWdzIGFsbG93ZWQgd2l0aCBpbW1lZGlhdGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQxMjMKLW1zZ2lkICJpbnZhbGlkIGltbWVkaWF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDE3OAotbXNnaWQgImV4cGVjdGVkICddJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDI0NQotbXNnaWQgImJ5dGUgb3IgaGFsZndvcmQgbm90IHZhbGlkIGZvciBiYXNlIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MjUwCi1tc2dpZCAiUjE1IGJhc2VkIHN0b3JlIG5vdCBhbGxvd2VkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MjU1Ci1tc2dpZCAiSW52YWxpZCBiYXNlIHJlZ2lzdGVyIGZvciByZWdpc3RlciBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQyNzMKLW1zZ2lkICJpbnZhbGlkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDI4NAotbXNnaWQgImludmFsaWQgYmFzZSByZWdpc3RlciBpbiBsb2FkL3N0b3JlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MzA4IGNvbmZpZy90Yy1hcm0uYzo1NDY5IGNvbmZpZy90Yy1hcm0uYzo1NDc4Ci0jOiBjb25maWcvdGMtYXJtLmM6NTQ4NSBjb25maWcvdGMtYXJtLmM6NTQ5MiBjb25maWcvdGMtYXJtLmM6NTQ5OQotbXNnaWQgIkludmFsaWQgb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0Mzg2Ci1tc2dpZCAiZGVzdCBhbmQgc291cmNlMSBvbmUgbXVzdCBiZSB0aGUgc2FtZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDM5NAotbXNnaWQgIlJzIGFuZCBSZCBtdXN0IGJlIGRpZmZlcmVudCBpbiBNVUwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ1MzkKLW1zZ2lkICIiCi0iSW5zZXJ0ZWQgbWlzc2luZyAnISc6IGxvYWQvc3RvcmUgbXVsdGlwbGUgYWx3YXlzIHdyaXRlcyBiYWNrIGJhc2UgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ1NTUgY29uZmlnL3RjLWFybS5jOjQ2NTcKLW1zZ2lkICJFeHByZXNzaW9uIHRvbyBjb21wbGV4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0NTYxCi1tc2dpZCAib25seSBsby1yZWdzIHZhbGlkIGluIGxvYWQvc3RvcmUgbXVsdGlwbGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQ2MDgKLW1zZ2lkICJTeW50YXg6IGxkcnNbYl0gUmQsIFtSYiwgUm9dIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0NjczCi1tc2dpZCAiaW52YWxpZCByZWdpc3RlciBsaXN0IHRvIHB1c2gvcG9wIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0ODExCi1tc2dpZCAiVmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1MjAzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY29uc3RhbnQgKCV4KSBhZnRlciBmaXh1cFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1MjE1IGNvbmZpZy90Yy1hcm0uYzo1MjM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBpbW1lZGlhdGUgdmFsdWUgZm9yIG9mZnNldCAoJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1MjM0IGNvbmZpZy90Yy1hcm0uYzo1MjU3Ci1tc2dpZCAiaW52YWxpZCBsaXRlcmFsIGNvbnN0YW50OiBwb29sIG5lZWRzIHRvIGJlIGNsb3NlclxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1Mjc0Ci1tc2dpZCAic2hpZnQgZXhwcmVzc2lvbiBpcyB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUyOTIgY29uZmlnL3RjLWFybS5jOjUzMDEKLW1zZ2lkICJJbnZhbGlkIHN3aSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1MzExCi1tc2dpZCAiSW52YWxpZCBleHByZXNzaW9uIGluIGxvYWQvc3RvcmUgbXVsdGlwbGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUzMzkgY29uZmlnL3RjLWFybS5jOjUzNTUgY29uZmlnL3RjLW1pcHMuYzo5Njc4Ci1tc2dpZCAiQnJhbmNoIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTM3NAotbXNnaWQgIkJyYW5jaCB3aXRoIGxpbmsgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NDQxCi1tc2dpZCAiSWxsZWdhbCB2YWx1ZSBmb3IgY28tcHJvY2Vzc29yIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTQ2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIG9mZnNldCwgdGFyZ2V0IG5vdCB3b3JkIGFsaWduZWQgKDB4JTA4WCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU1MzUKLW1zZ2lkICJJbnZhbGlkIGltbWVkaWF0ZSBmb3Igc3RhY2sgYWRkcmVzcyBjYWxjdWxhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTU0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGltbWVkaWF0ZSBmb3IgYWRkcmVzcyBjYWxjdWxhdGlvbiAodmFsdWUgPSAweCUwOFgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NTUzCi1tc2dpZCAiSW52YWxpZCA4Yml0IGltbWVkaWF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTU2MQotbXNnaWQgIkludmFsaWQgM2JpdCBpbW1lZGlhdGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU1NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBpbW1lZGlhdGU6ICVkIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTU5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbGxlZ2FsIFRodW1iIHNoaWZ0IHZhbHVlOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTYwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJCYWQgcmVsb2NhdGlvbiBmaXh1cCB0eXBlICglZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTY3NAotbXNnaWQgIkxpdGVyYWwgcmVmZXJlbmNlZCBhY3Jvc3Mgc2VjdGlvbiBib3VuZHJ5IChJbXBsaWNpdCBkdW1wPykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU2OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWxfcmVsb2NhdGlvbiAodHlwZSAlZCkgbm90IGZpeGVkIHVwIChJTU1FRElBVEUpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1Njk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsX3JlbG9jYXRpb24gKHR5cGUgJWQpIG5vdCBmaXhlZCB1cCAoT0ZGU0VUX0lNTSkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU3MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCAoJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NzQwIGNvbmZpZy90Yy1taXBzLmM6MTExNjYgY29uZmlnL3RjLXNoLmM6MjI4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NzUzCi1tc2dpZCAibWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTgyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJObyBvcGVyYXRvciAtLSBzdGF0ZW1lbnQgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1ODczIGNvbmZpZy90Yy1hcm0uYzo1OTI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk9wY29kZSBgJXMnIG11c3QgaGF2ZSBzdWZmaXggZnJvbSA8JXM+XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU4OTgKLW1zZ2lkICJXYXJuaW5nOiBVc2Ugb2YgdGhlICdudicgY29uZGl0aW9uYWwgaXMgZGVwcmVjYXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MDE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyICclcycgZG9lcyBub3QgZXhpc3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjAyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJpZ25vcmluZyByZWRlZmluaXRpb24gb2YgcmVnaXN0ZXIgYWxpYXMgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjAyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iaWdub3JpbmcgcmVkZWZpbml0aW9uIG9mIHJlZ2lzdGVyIGFsaWFzICclcycgdG8gbm9uLWV4aXN0YW50IHJlZ2lzdGVyICclcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYwMzIKLW1zZ2lkICJpZ25vcmluZyBpbmNvbXBsZXRlIC5yZXEgcHNldXNvIG9wIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MjA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBBUENTIHN3aXRjaCAtbSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MzM0IGNvbmZpZy90Yy1hcm0uYzo2MzQ1IGNvbmZpZy90Yy1hcm0uYzo2MzU2Ci0jOiBjb25maWcvdGMtYXJtLmM6NjM2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGFyY2hpdGVjdHVyZSB2YXJpYW50IC1tJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYzNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBwcm9jZXNzb3IgdmFyaWFudCAtbSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MzkwCi1tc2dpZCAiIgotIiBBUk0gU3BlY2lmaWMgQXNzZW1ibGVyIE9wdGlvbnM6XG4iCi0iICAtbVthcm1dWzxwcm9jZXNzb3IgbmFtZT5dIHNlbGVjdCBwcm9jZXNzb3IgdmFyaWFudFxuIgotIiAgLW1bYXJtXXZbMnwyYXwzfDNtfDR8NHRdICBzZWxlY3QgYXJjaGl0ZWN0dXJlIHZhcmlhbnRcbiIKLSIgIC1tdGh1bWIgICAgICAgICAgICAgICAgICAgb25seSBhbGxvdyBUaHVtYiBpbnN0cnVjdGlvbnNcbiIKLSIgIC1tdGh1bWItaW50ZXJ3b3JrICAgICAgICAgbWFyayB0aGUgYXNzZW1ibGVkIGNvZGUgYXMgc3VwcG9ydGluZyAiCi0iaW50ZXJ3b3JraW5nXG4iCi0iICAtbWFsbCAgICAgICAgICAgICAgICAgICAgIGFsbG93IGFueSBpbnN0cnVjdGlvblxuIgotIiAgLW1mcGExMCwgLW1mcGExMSAgICAgICAgICBzZWxlY3QgZmxvYXRpbmcgcG9pbnQgYXJjaGl0ZWN0dXJlXG4iCi0iICAtbWZwZS1vbGQgICAgICAgICAgICAgICAgIGRvbid0IGFsbG93IGZsb2F0aW5nLXBvaW50IG11bHRpcGxlICIKLSJpbnN0cnVjdGlvbnNcbiIKLSIgIC1tbm8tZnB1ICAgICAgICAgICAgICAgICAgZG9uJ3QgYWxsb3cgYW55IGZsb2F0aW5nLXBvaW50IGluc3RydWN0aW9ucy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjQwMQotbXNnaWQgIiAgLWsgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBQSUMgY29kZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjQwNQotbXNnaWQgIiIKLSIgIC1tYXBjcy0zMiwgLW1hcGNzLTI2ICAgICAgc3BlY2lmeSB3aGljaCBBUk0gUHJvY2VkdXJlIENhbGxpbmcgU3RhbmRhcmQgdG8gIgotInVzZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NDA4Ci1tc2dpZCAiICAtbWFwY3MtZmxvYXQgICAgICAgICAgICAgIGZsb2F0aW5nIHBvaW50IGFyZ3MgYXJlIHBhc3NlZCBpbiBGUCByZWdzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY0MTEKLW1zZ2lkICIiCi0iICAtbWFwY3MtcmVlbnRyYW50ICAgICAgICAgIHRoZSBjb2RlIGlzIHBvc2l0aW9uIGluZGVwZW5kZW50L3JlZW50cmFudFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NDE2Ci1tc2dpZCAiICAtbW9hYmkgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgdGhlIG9sZCBFTEYgQUJJXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY0MjEKLW1zZ2lkICIiCi0iICAtRUIgICAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlIGNvZGUgZm9yIGEgYmlnIGVuZGlhbiBjcHVcbiIKLSIgIC1FTCAgICAgICAgICAgICAgICAgICAgICAgYXNzZW1ibGUgY29kZSBmb3IgYSBsaXR0bGUgZW5kaWFuIGNwdVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmV4cGVjdGVkIGZ1bmN0aW9uIHR5cGU6ICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MjE4Ci1tc2dpZCAiIgotIkQxMFYgb3B0aW9uczpcbiIKLSItTyAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZS4gIFdpbGwgZG8gc29tZSBvcGVyYXRpb25zIGluIHBhcmFsbGVsLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NTIxIGNvbmZpZy90Yy1kMTB2LmM6NjAzIGNvbmZpZy90Yy1kMzB2LmM6NjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjY2NAotbXNnaWQgIkluc3RydWN0aW9uIG11c3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwgd2l0aCBhbm90aGVyIGluc3RydWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjcxNgotbXNnaWQgIkluc3RydWN0aW9uIG11c3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo3MTkKLW1zZ2lkICJMb25nIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGNvbWJpbmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjc1OQotbXNnaWQgIk9uZSBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo3NjQgY29uZmlnL3RjLWQzMHYuYzo4NDMKLW1zZ2lkICJUd28gSVUgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo3NjYgY29uZmlnL3RjLWQxMHYuYzo3NzQgY29uZmlnL3RjLWQxMHYuYzo3ODkKLSM6IGNvbmZpZy90Yy1kMTB2LmM6ODAyIGNvbmZpZy90Yy1kMzB2LmM6ODQ0IGNvbmZpZy90Yy1kMzB2LmM6ODUzCi1tc2dpZCAiU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo3NzIgY29uZmlnL3RjLWQzMHYuYzo4NTAKLW1zZ2lkICJUd28gTVUgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo3OTMgY29uZmlnL3RjLWQzMHYuYzo4NjkKLW1zZ2lkICJJVSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGluIHRoZSBsZWZ0IGNvbnRhaW5lciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjgwNiBjb25maWcvdGMtZDMwdi5jOjg4MgotbXNnaWQgIk1VIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIHJpZ2h0IGNvbnRhaW5lciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjgxMCBjb25maWcvdGMtZDMwdi5jOjg5MAotbXNnaWQgInVua25vd24gZXhlY3V0aW9uIHR5cGUgcGFzc2VkIHRvIHdyaXRlXzJfc2hvcnQoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjEwMjMgY29uZmlnL3RjLWQxMHYuYzoxMDM3IGNvbmZpZy90Yy1oODMwMC5jOjEyNzkKLSM6IGNvbmZpZy90Yy1oODUwMC5jOjExMjIgY29uZmlnL3RjLW1jb3JlLmM6ODQyIGNvbmZpZy90Yy1zaC5jOjEwNDAKLSM6IGNvbmZpZy90Yy16OGsuYzoxMjIzCi1tc2dpZCAiY2FuJ3QgZmluZCBvcGNvZGUgIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTA1MCBjb25maWcvdGMtZDEwdi5jOjEwNjggY29uZmlnL3RjLWQzMHYuYzoxMzY4Ci1tc2dpZCAiVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTExNiBjb25maWcvdGMtZDMwdi5jOjE1MDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvcGNvZGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTE5NyBjb25maWcvdGMtZDEwdi5jOjEzNDMgY29uZmlnL3RjLXRpYzgwLmM6NTM3Ci1tc2dpZCAiYmFkIG9wY29kZSBvciBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjEyNDYgY29uZmlnL3RjLW02OGsuYzo0MjMyCi1tc2dpZCAidmFsdWUgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTMxOAotbXNnaWQgImlsbGVnYWwgb3BlcmFuZCAtIHJlZ2lzdGVyIG5hbWUgZm91bmQgd2hlcmUgbm9uZSBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjEzNTQgY29uZmlnL3RjLXRpYzgwLmM6NTQ4Ci1tc2dpZCAiUmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgRVZFTiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjEzODUgY29uZmlnL3RjLWQzMHYuYzoxNzU0IGNvbmZpZy90Yy1tbjEwMjAwLmM6MTIzNAotIzogY29uZmlnL3RjLW1uMTAzMDAuYzoxNDI1IGNvbmZpZy90Yy1wcGMuYzo1MDA0IGNvbmZpZy90Yy12ODUwLmM6MjI1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjE0OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGluZSAlZDogcmVwIG9yIHJlcGkgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IDQgaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6MTUxNyBjb25maWcvdGMtZDMwdi5jOjE5MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGluZSAlZDogdW5rbm93biByZWxvY2F0aW9uIHR5cGU6IDB4JXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVnaXN0ZXIgbmFtZSAlcyBjb25mbGljdHMgd2l0aCBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjI3NgotbXNnaWQgIiIKLSJcbiIKLSJEMzBWIG9wdGlvbnM6XG4iCi0iLU8gICAgICAgICAgICAgICAgICAgICAgTWFrZSBhZGphY2VudCBzaG9ydCBpbnN0cnVjdGlvbnMgcGFyYWxsZWwgaWYgIgotInBvc3NpYmxlLlxuIgotIi1uICAgICAgICAgICAgICAgICAgICAgIFdhcm4gYWJvdXQgYWxsIE5PUHMgaW5zZXJ0ZWQgYnkgdGhlIGFzc2VtYmxlci5cbiIKLSItTlx0XHRcdFdhcm4gYWJvdXQgTk9QcyBpbnNlcnRlZCBhZnRlciB3b3JkIG11bHRpcGxpZXMuXG4iCi0iLWMgICAgICAgICAgICAgICAgICAgICAgV2FybiBhYm91dCBzeW1ib2xzIHdob2VzIG5hbWVzIG1hdGNoIHJlZ2lzdGVyICIKLSJuYW1lcy5cbiIKLSItQyAgICAgICAgICAgICAgICAgICAgICBPcHBvc2l0ZSBvZiAtQy4gIC1jIGlzIHRoZSBkZWZhdWx0LlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6NDUwCi1tc2dpZCAidW5leHBlY3RlZCAxMi1iaXQgcmVsb2MgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjQ1NwotbXNnaWQgInVuZXhwZWN0ZWQgMTgtYml0IHJlbG9jIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo3MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgTk9QIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6NzAyCi1tc2dpZCAic2VxdWVudGlhbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjcwMgotbXNnaWQgInBhcmFsbGVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6ODM5Ci1tc2dpZCAiSW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo4NTIgY29uZmlnL3RjLWQzMHYuYzo4NTkgY29uZmlnL3RjLWQzMHYuYzo4NzUKLSM6IGNvbmZpZy90Yy1kMzB2LmM6ODg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkV4ZWN1dGluZyAlcyBpbiBJVSBtYXkgbm90IHdvcmsiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo4NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3BlY2lhbCBsZWZ0IGluc3RydWN0aW9uIGAlcycga2lsbHMgaW5zdHJ1Y3Rpb24gYCVzJyBpbiByaWdodCBjb250YWluZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxMjUwIGNvbmZpZy90Yy1kMzB2LmM6MTI2NwotbXNnaWQgIkNhbm5vdCBhc3NlbWJsZSBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjEyNTIKLW1zZ2lkICJGaXJzdCBvcGNvZGUgaXMgbG9uZy4gIFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxMzIwCi1tc2dpZCAid29yZCBvZiBOT1BzIGFkZGVkIGJldHdlZW4gd29yZCBtdWx0aXBseSBhbmQgbG9hZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjEzMjIKLW1zZ2lkICJ3b3JkIG9mIE5PUHMgYWRkZWQgYmV0d2VlbiB3b3JkIG11bHRpcGx5IGFuZCAxNi1iaXQgbXVsdGlwbHkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxMzUyCi1tc2dpZCAiSW5zdHJ1Y3Rpb24gdXNlcyBsb25nIHZlcnNpb24sIHNvIGl0IGNhbm5vdCBiZSBtaXhlZCBhcyBzcGVjaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxNDM2IGNvbmZpZy90Yy1kMzB2LmM6MTQ3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIGNvbmRpdGlvbiBjb2RlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE0NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY21wdSBkb2Vzbid0IHN1cHBvcnQgY29uZGl0aW9uIGNvZGUgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxNTE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmRzIGZvciBvcGNvZGUgYCVzJyBkbyBub3QgbWF0Y2ggYW55IHZhbGlkIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE3MjcKLW1zZ2lkICJPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxODI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSBhZGRyZXNzIG9mIHN5bWJvbCAnJXMnIGludG8gYSBieXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTgyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgdmFsdWUgJXggaW50byBhIGJ5dGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxODM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSBhZGRyZXNzIG9mIHN5bWJvbCAnJXMnIGludG8gYSBzaG9ydCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE4MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIHZhbHVlICV4IGludG8gYSBzaG9ydCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE4NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIGFkZHJlc3Mgb2Ygc3ltYm9sICclcycgaW50byBhIHF1YWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoyMDE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInZhbHVlIHRvbyBsYXJnZSB0byBmaXQgaW4gJWQgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjIxNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoyNTQgY29uZmlnL3RjLWg4MzAwLmM6MjYyCi1tc2dpZCAiUmVnIG5vdCB2YWxpZCBmb3IgSDgvMzAwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjQyMyBjb25maWcvdGMtaDgzMDAuYzo0MjYgY29uZmlnL3RjLWg4MzAwLmM6NDI5Ci0jOiBjb25maWcvdGMtaDgzMDAuYzo0MzMKLW1zZ2lkICJJbnZhbGlkIHJlZ2lzdGVyIGxpc3QgZm9yIGxkbS9zdG1cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzo0OTAgY29uZmlnL3RjLWg4MzAwLmM6NTUzIGNvbmZpZy90Yy1oODMwMC5jOjU2MAotbXNnaWQgIldyb25nIHNpemUgcG9pbnRlciByZWdpc3RlciBmb3IgYXJjaGl0ZWN0dXJlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzo1MTggY29uZmlnL3RjLWg4MzAwLmM6NTI3IGNvbmZpZy90Yy1oODMwMC5jOjUzNwotbXNnaWQgImV4cGVjdGVkIEAoZXhwLCByZWcxNikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6NjE3Ci1tc2dpZCAiZXhwZWN0IDo4IG9yIDoxNiBoZXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjgyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kICVzMHglbHggb3V0IG9mIHJhbmdlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzo5MTAKLW1zZ2lkICJDYW4ndCB3b3JrIG91dCBzaXplIG9mIG9wZXJhbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6OTY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk9wY29kZSBgJXMnIHdpdGggdGhlc2Ugb3BlcmFuZCB0eXBlcyBub3QgYXZhaWxhYmxlIGluIEg4LzMwMCBtb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEwMTYgY29uZmlnL3RjLWg4MzAwLmM6MTAzNgotbXNnaWQgIk5lZWQgIzEgb3IgIzIgaGVyZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMDMxCi1tc2dpZCAiIzQgbm90IHZhbGlkIG9uIEg4LzMwMC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTExMiBjb25maWcvdGMtaDgzMDAuYzoxMTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImJyYW5jaCBvcGVyYW5kIGhhcyBvZGQgb2Zmc2V0ICglbHgpXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTE5MQotbXNnaWQgImRlc3RpbmF0aW9uIG9wZXJhbmQgbXVzdCBiZSAxNiBiaXQgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTIwMQotbXNnaWQgInNvdXJjZSBvcGVyYW5kIG11c3QgYmUgOCBiaXQgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTIwOQotbXNnaWQgImRlc3RpbmF0aW9uIG9wZXJhbmQgbXVzdCBiZSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEyMTYKLW1zZ2lkICJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgOCBiaXQgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTIyNQotbXNnaWQgInNvdXJjZSBvcGVyYW5kIG11c3QgYmUgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMjMzCi1tc2dpZCAiaW52YWxpZCBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMjkwIGNvbmZpZy90Yy1oODUwMC5jOjExMjkgY29uZmlnL3RjLW1pcHMuYzo3OTMyCi0jOiBjb25maWcvdGMtc2guYzoxMDQ3IGNvbmZpZy90Yy13NjUuYzo3NTkgY29uZmlnL3RjLXo4ay5jOjEyMzUKLW1zZ2lkICJ1bmtub3duIG9wY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMzM2Ci1tc2dpZCAibWlzbWF0Y2ggYmV0d2VlbiBvcGNvZGUgc2l6ZSBhbmQgb3BlcmFuZCBzaXplIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEzNDggY29uZmlnL3RjLWg4NTAwLmM6MTE1NyBjb25maWcvdGMtc2guYzoxMTQ0Ci0jOiBjb25maWcvdGMtdzY1LmM6NzkxIGNvbmZpZy90Yy16OGsuYzoxMjkwCi1tc2dpZCAiY2FsbCB0byB0Y19jcmF3bF9zeW1ib2xfY2hhaW4gXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTM2MiBjb25maWcvdGMtaDg1MDAuYzoxMTcxIGNvbmZpZy90Yy1zaC5jOjExNTEKLSM6IGNvbmZpZy90Yy13NjUuYzo4MDUgY29uZmlnL3RjLXo4ay5jOjEzMDQKLW1zZ2lkICJjYWxsIHRvIHRjX2hlYWRlcnNfaG9vayBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxNDUxIGNvbmZpZy90Yy1oODUwMC5jOjEyNjAgY29uZmlnL3RjLXo4ay5jOjE0MTUKLW1zZ2lkICJjYWxsIHRvIHRjX2FvdXRfZml4X3RvX2NoYXJzIFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjE0NjEgY29uZmlnL3RjLXo4ay5jOjE0MjUKLW1zZ2lkICJjYWxsIHRvIG1kX2NvbnZlcnRfZnJhZyBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxNTA2IGNvbmZpZy90Yy16OGsuYzoxNTAwCi1tc2dpZCAiY2FsbCB0b21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjMzNwotbXNnaWQgIjoyNCBub3QgdmFsaWQgZm9yIHRoaXMgb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjM0NAotbXNnaWQgImV4cGVjdCA6OCw6MTYgb3IgOjI0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjQwMQotbXNnaWQgInN5bnRheCBlcnJvciBpbiByZWcgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo0MTkKLW1zZ2lkICJtaXNzaW5nIGZpbmFsIHJlZ2lzdGVyIGluIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjUwNiBjb25maWcvdGMtaDg1MDAuYzo1MTMgY29uZmlnL3RjLWg4NTAwLmM6NTE5Ci1tc2dpZCAiZXhwZWN0ZWQgQChleHAsIFJuKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo1MzUKLW1zZ2lkICJAUm4rIG5lZWRzIHdvcmQgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6NTQ1Ci1tc2dpZCAiQFJuIG5lZWRzIHdvcmQgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6ODQ1IGNvbmZpZy90Yy1zaC5jOjg0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmhhbmRsZWQgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo4NzMgY29uZmlnL3RjLXNoLmM6ODY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgbXVzdCBiZSBhYnNvbHV0ZSBpbiByYW5nZSAlZC4uJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6OTYzIGNvbmZpZy90Yy1zaC5jOjk4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgZm9yICVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6MTE0NSBjb25maWcvdGMtc2guYzoxMDgyIGNvbmZpZy90Yy13NjUuYzo3NzkKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmRzIGZvciBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMDk2Ci1tc2dpZCAiTWlzc2luZyAuZXhpdFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTA5OQotbXNnaWQgIk1pc3NpbmcgLnByb2NlbmRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjExMDgKLW1zZ2lkICJOb3QgaW4gYSBzcGFjZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjExMTEKLW1zZ2lkICJOb3QgaW4gYSBzdWJzcGFjZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjEyNzMKLW1zZ2lkICJJbnZhbGlkIGZpZWxkIHNlbGVjdG9yLiAgQXNzdW1pbmcgRiUlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjEzMDQKLW1zZ2lkICItUiBvcHRpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHRhcmdldC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMzE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMzI2IGNvbmZpZy90Yy1pODYwLmM6MTkxIGNvbmZpZy90Yy1zcGFyYy5jOjcwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogbG9zaW5nIG9wY29kZTogYCVzJyBcIiVzXCJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjEzODggY29uZmlnL3RjLWhwcGEuYzo1MTgzIGNvbmZpZy90Yy1ocHBhLmM6NTIzNQotbXNnaWQgIk1pc3NpbmcgZnVuY3Rpb24gbmFtZSBmb3IgLlBST0MgKGNvcnJ1cHRlZCBsYWJlbCBjaGFpbikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMzkxIGNvbmZpZy90Yy1ocHBhLmM6NTIzOAotbXNnaWQgIk1pc3NpbmcgZnVuY3Rpb24gbmFtZSBmb3IgLlBST0MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNDk0IGNvbmZpZy90Yy1ocHBhLmM6MzQ2MwotbXNnaWQgImNvdWxkIG5vdCB1cGRhdGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTYyNQotbXNnaWQgIkludmFsaWQgSW5kZXhlZCBMb2FkIENvbXBsZXRlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNjMwCi1tc2dpZCAiSW52YWxpZCBJbmRleGVkIExvYWQgQ29tcGxldGVyIFN5bnRheC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNjU0Ci1tc2dpZCAiSW52YWxpZCBTaG9ydCBMb2FkL1N0b3JlIENvbXBsZXRlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNjgxIGNvbmZpZy90Yy1ocHBhLmM6MTY4NgotbXNnaWQgIkludmFsaWQgU3RvcmUgQnl0ZXMgU2hvcnQgQ29tcGxldGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTY5NiBjb25maWcvdGMtaHBwYS5jOjE3MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbjogJWMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNzExCi1tc2dpZCAiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxNzQzCi1tc2dpZCAiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE4MjEgY29uZmlnL3RjLWhwcGEuYzoxODk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgQWRkIENvbmRpdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxOTQ4IGNvbmZpZy90Yy1ocHBhLmM6MjAyNQotbXNnaWQgIkludmFsaWQgTG9naWNhbCBJbnN0cnVjdGlvbiBDb25kaXRpb24uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjA2NwotbXNnaWQgIkludmFsaWQgU2hpZnQvRXh0cmFjdC9EZXBvc2l0IENvbmRpdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyMDg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgQml0IEJyYW5jaCBDb25kaXRpb246ICVjIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjIwMiBjb25maWcvdGMtaHBwYS5jOjIyMzUgY29uZmlnL3RjLWhwcGEuYzoyMjcyCi1tc2dpZCAiQnJhbmNoIHRvIHVuYWxpZ25lZCBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjMzNQotbXNnaWQgIkludmFsaWQgU0ZVIGlkZW50aWZpZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyMzc1Ci1tc2dpZCAiSW52YWxpZCBDT1BSIGlkZW50aWZpZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyNTAwIGNvbmZpZy90Yy1ocHBhLmM6MjUyMSBjb25maWcvdGMtaHBwYS5jOjI1NDEKLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjU2MSBjb25maWcvdGMtaHBwYS5jOjI1ODEKLW1zZ2lkICJJbnZhbGlkIHJlZ2lzdGVyIGZvciBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQgb3IgZm1weXN1YiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjI2MDUKLW1zZ2lkICJJbnZhbGlkIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0LiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjI2MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBvcGVyYW5kcyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjMxNjMKLW1zZ2lkICJVbmtub3duIHJlbG9jYXRpb24gZW5jb3VudGVyZWQgaW4gbWRfYXBwbHlfZml4LiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjMxNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gaHBwYV9maXh1cCBlbnRyeSBmb3IgdGhpcyBmaXh1cCAoZml4UCA9IDB4JXgsIHR5cGUgPSAweCV4KVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzMxNSBjb25maWcvdGMtaHBwYS5jOjMzNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5kZWZpbmVkIHJlZ2lzdGVyOiAnJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjMzNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm9uLWFic29sdXRlIHN5bWJvbDogJyVzJy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozMzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuZGVmaW5lZCBhYnNvbHV0ZSBjb25zdGFudDogJyVzJy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozNTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgRlAgQ29tcGFyZSBDb25kaXRpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzU0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIEZQIE9wZXJhbmQgRm9ybWF0OiAlM3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozNjI0Ci1tc2dpZCAiQmFkIHNlZ21lbnQgaW4gZXhwcmVzc2lvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozNjc1Ci1tc2dpZCAiQmFkIHNlZ21lbnQgKHNob3VsZCBiZSBhYnNvbHV0ZSkuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6Mzc3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IGxvY2F0aW9uOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzgwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGFyZ3VtZW50IGRlc2NyaXB0aW9uOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjM4MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBOdWxsaWZpY2F0aW9uOiAoJWMpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDMwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIC5DQUxMIGFyZ3VtZW50OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ0MjAKLW1zZ2lkICIuY2FsbGluZm8gaXMgbm90IHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDQ0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJGUkFNRSBwYXJhbWV0ZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDg6ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NDU5Ci1tc2dpZCAiVmFsdWUgZm9yIEVOVFJZX0dSIG11c3QgYmUgaW4gdGhlIHJhbmdlIDMuLjE4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NDcxCi1tc2dpZCAiVmFsdWUgZm9yIEVOVFJZX0ZSIG11c3QgYmUgaW4gdGhlIHJhbmdlIDEyLi4yMVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDQ4MQotbXNnaWQgIlZhbHVlIGZvciBFTlRSWV9TUiBtdXN0IGJlIDNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ1MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCAuQ0FMTElORk8gYXJndW1lbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDYyNwotbXNnaWQgIlRoZSAuRU5URVIgcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NjQxCi1tc2dpZCAiTWlzcGxhY2VkIC5lbnRyeS4gSWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NjQ1Ci1tc2dpZCAiTWlzc2luZyAuY2FsbGluZm8uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDY5MwotbXNnaWQgIi5SRUcgbXVzdCB1c2UgYSBsYWJlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ2OTUKLW1zZ2lkICIuRVFVIG11c3QgdXNlIGEgbGFiZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NzQ2Ci1tc2dpZCAiLkVYSVQgbXVzdCBhcHBlYXIgd2l0aGluIGEgcHJvY2VkdXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDc1MAotbXNnaWQgIk1pc3NpbmcgLmNhbGxpbmZvIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDc1NAotbXNnaWQgIk5vIC5FTlRSWSBmb3IgdGhpcyAuRVhJVCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ3ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IGRlZmluZSBleHBvcnQgc3ltYm9sOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDgzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2luZyBFTlRSWSByYXRoZXIgdGhhbiBDT0RFIGluIGV4cG9ydCBkaXJlY3RpdmUgZm9yICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDkzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmRlZmluZWQgLkVYUE9SVC8uSU1QT1JUIGFyZ3VtZW50IChpZ25vcmVkKTogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MDE3Ci1tc2dpZCAiTWlzc2luZyBsYWJlbCBuYW1lIG9uIC5MQUJFTCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUwMjIKLW1zZ2lkICJleHRyYSAuTEFCRUwgYXJndW1lbnRzIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTAzNwotbXNnaWQgIlRoZSAuTEVBVkUgcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MDcwCi1tc2dpZCAiVW5yZWNvZ25pemVkIC5MRVZFTCBhcmd1bWVudFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTEwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgZGVmaW5lIHN0YXRpYyBzeW1ib2w6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MTM3Ci1tc2dpZCAiTmVzdGVkIHByb2NlZHVyZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MTQ3Ci1tc2dpZCAiQ2Fubm90IGFsbG9jYXRlIHVud2luZCBkZXNjcmlwdG9yXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MjQyCi1tc2dpZCAibWlzcGxhY2VkIC5wcm9jZW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTI0NQotbXNnaWQgIk1pc3NpbmcgLmNhbGxpbmZvIGZvciB0aGlzIHByb2NlZHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUyNDgKLW1zZ2lkICJNaXNzaW5nIC5FWElUIGZvciBhIC5FTlRSWSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUzNDgKLW1zZ2lkICJJbnZhbGlkIC5TUEFDRSBhcmd1bWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUzOTYKLW1zZ2lkICJDYW4ndCBjaGFuZ2Ugc3BhY2VzIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLiBJZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTUyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmRlZmluZWQgc3BhY2U6ICclcycgQXNzdW1pbmcgc3BhY2UgbnVtYmVyID0gMC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1NTY1Ci1tc2dpZCAiTXVzdCBiZSBpbiBhIHNwYWNlIGJlZm9yZSBjaGFuZ2luZyBvciBkZWNsYXJpbmcgc3Vic3BhY2VzLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTU2OQotbXNnaWQgIkNhbid0IGNoYW5nZSBzdWJzcGFjZXMgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uIElnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1NjA1Ci1tc2dpZCAiUGFyYW1ldGVycyBvZiBhbiBleGlzdGluZyBzdWJzcGFjZSBjYW4ndCBiZSBtb2RpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU2NTgKLW1zZ2lkICJBbGlnbm1lbnQgbXVzdCBiZSBhIHBvd2VyIG9mIDIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1NzAwCi1tc2dpZCAiRklSU1Qgbm90IHN1cHBvcnRlZCBhcyBhIC5TVUJTUEFDRSBhcmd1bWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU3MDIKLW1zZ2lkICJJbnZhbGlkIC5TVUJTUEFDRSBhcmd1bWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU3NDIKLW1zZ2lkICJJZ25vcmluZyBzdWJzcGFjZSBkZWNsIGR1ZSB0byBFTEYgQkZEIGJ1Z3MuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTkwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogVW5hYmxlIHRvIGZpbmQgY29udGFpbmluZyBzcGFjZSBmb3IgJXMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTk0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJPdXQgb2YgbWVtb3J5OiBjb3VsZCBub3QgYWxsb2NhdGUgbmV3IHNwYWNlIGNoYWluIGVudHJ5OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjAzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJPdXQgb2YgbWVtb3J5OiBjb3VsZCBub3QgYWxsb2NhdGUgbmV3IHN1YnNwYWNlIGNoYWluIGVudHJ5OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjY4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgJyVzJyBjb3VsZCBub3QgYmUgY3JlYXRlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo2NjkyCi1tc2dpZCAiTm8gbWVtb3J5IGZvciBzeW1ib2wgbmFtZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo1MDIKLW1zZ2lkICJzYW1lIHR5cGUgb2YgcHJlZml4IHVzZWQgdHdpY2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo1MzYKLW1zZ2lkICJCYWQgYXJndW1lbnQgdG8gc3ludGF4IGRpcmVjdGl2ZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo2MTkgY29uZmlnL3RjLW02OGsuYzozNzUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIEVycm9yOiAgQ2FuJ3QgaGFzaCAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo4NTEKLW1zZ2lkICJVbmtub3duIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6ODk5IGNvbmZpZy90Yy1pMzg2LmM6NDM2MCBjb25maWcvdGMtbTY4ay5jOjc3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjkwOSBjb25maWcvdGMtaTM4Ni5jOjQzNzQgY29uZmlnL3RjLW02OGsuYzo3NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCBkbyAlZCBieXRlIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMDEwIGNvbmZpZy90Yy1pMzg2LmM6MTA5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJubyBzdWNoIDM4NiBpbnN0cnVjdGlvbjogYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEwMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gbW5lbW9uaWMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMDI2Ci1tc2dpZCAiZXhwZWN0aW5nIHByZWZpeDsgZ290IG5vdGhpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMDI4Ci1tc2dpZCAiZXhwZWN0aW5nIG1uZW1vbmljOyBnb3Qgbm90aGluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEwNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVkdW5kYW50ICVzIHByZWZpeCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjExMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIHN0cmluZyBpbnN0cnVjdGlvbiBhZnRlciBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTEyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNoYXJhY3RlciAlcyBiZWZvcmUgb3BlcmFuZCAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjExNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5iYWxhbmNlZCBwYXJlbnRoZXNpcyBpbiBvcGVyYW5kICVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjExNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5iYWxhbmNlZCBicmFja2V0cyBpbiBvcGVyYW5kICVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjExNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gb3BlcmFuZCAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjExODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3B1cmlvdXMgb3BlcmFuZHM7ICglZCBvcGVyYW5kcy9pbnN0cnVjdGlvbiBtYXgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTIwMgotbXNnaWQgImV4cGVjdGluZyBvcGVyYW5kIGFmdGVyICcsJzsgZ290IG5vdGhpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMjA3Ci1tc2dpZCAiZXhwZWN0aW5nIG9wZXJhbmQgYmVmb3JlICcsJzsgZ290IG5vdGhpbmciCi1tc2dzdHIgIiIKLQotIy4gd2UgZm91bmQgbm8gbWF0Y2gKLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTQzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzdWZmaXggb3Igb3BlcmFuZHMgaW52YWxpZCBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jLiBXYXJuIHRoZW0gdGhhdCBhIGRhdGEgb3IgYWRkcmVzcyBzaXplIHByZWZpeCBkb2Vzbid0IGFmZmVjdAotIy4gYXNzZW1ibHkgb2YgdGhlIG5leHQgbGluZSBvZiBjb2RlLgotIzogY29uZmlnL3RjLWkzODYuYzoxNDQzCi0jLCBjLWZvcm1hdAotbXNnaWQgInN0YW5kLWFsb25lIGAlcycgcHJlZml4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTQ2NyBjb25maWcvdGMtaTM4Ni5jOjE0ODIKLW1zZ2lkICJgJXMnIG9wZXJhbmQgJWQgbXVzdCB1c2UgYCUlZXMnIHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNTQ4IGNvbmZpZy90Yy1pMzg2LmM6MTU4OSBjb25maWcvdGMtaTM4Ni5jOjE2MTYKLW1zZ2lkICJ1c2luZyBgJSUlcycgaW5zdGVhZCBvZiBgJSUlcycgZHVlIHRvIGAlYycgc3VmZml4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTU2MSBjb25maWcvdGMtaTM4Ni5jOjE1NzggY29uZmlnL3RjLWkzODYuYzoxNjA1Ci1tc2dpZCAiYCUlJXMnIG5vdCBhbGxvd2VkIHdpdGggYCVzJWMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTY0NSBjb25maWcvdGMtaTM4Ni5jOjE2NjUKLW1zZ2lkICJubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggZ2l2ZW47IGNhbid0IGRldGVybWluZSBpbW1lZGlhdGUgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE2OTAKLW1zZ2lkICIiCi0ibm8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGdpdmVuIGFuZCBubyByZWdpc3RlciBvcGVyYW5kczsgY2FuJ3Qgc2l6ZSAiCi0iaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIy4gcmV2ZXJzZWQgYXJndW1lbnRzIG9uIGZhZGRwLCBmc3VicCwgZXRjLgotIzogY29uZmlnL3RjLWkzODYuYzoxODAzCi1tc2dpZCAidHJhbnNsYXRpbmcgdG8gYCVzICUlJXMsJSUlcyciCi1tc2dzdHIgIiIKLQotIy4gZXh0cmFuZW91cyBgbCcgc3VmZml4IG9uIGZwIGluc24KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTgxMAotbXNnaWQgInRyYW5zbGF0aW5nIHRvIGAlcyAlJSVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjIwMjIKLW1zZ2lkICJ5b3UgY2FuJ3QgYHBvcCAlJWNzJyIKLW1zZ3N0ciAiIgotCi0jLiBVbml4V2FyZSBmc3ViIG5vIGFyZ3MgaXMgYWxpYXMgZm9yIGZzdWJwLCBmYWRkIC0+IGZhZGRwLCBldGMKLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjA1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ0cmFuc2xhdGluZyB0byBgJXNwJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjIwODQgY29uZmlnL3RjLWkzODYuYzoyMTg3IGNvbmZpZy90Yy1pMzg2LmM6MjI0NwotbXNnaWQgInNraXBwaW5nIHByZWZpeGVzIG9uIHRoaXMgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyMTA0IGNvbmZpZy90Yy1pMzg2LmM6MjIxMSBjb25maWcvdGMtaTM4Ni5jOjIyNjAKLW1zZ2lkICIxNi1iaXQganVtcCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyMjA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImAlcycgb25seSB0YWtlcyBieXRlIGRpc3BsYWNlbWVudDsgJWxkIHNob3J0ZW5lZCB0byAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjIyNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3QgaGFuZGxlIG5vbiBhYnNvbHV0ZSBzZWdtZW50IGluIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNTI3Ci1tc2dpZCAiT25seSAxIG9yIDIgaW1tZWRpYXRlIG9wZXJhbmRzIGFyZSBhbGxvd2VkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjU1OCBjb25maWcvdGMtaTM4Ni5jOjI3ODgKLW1zZ2lkICJHT1QgcmVsb2NhdGlvbnMgbm90IHN1cHBvcnRlZCBpbiAxNiBiaXQgbW9kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI1NzkgY29uZmlnL3RjLWkzODYuYzoyODA5Ci1tc2dpZCAiQmFkIHJlbG9jIHNwZWNpZmllciBpbiBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjU5NyBjb25maWcvdGMtaTM4Ni5jOjI4NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWdub3JpbmcganVuayBgJXMnIGFmdGVyIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIy4gbWlzc2luZyBvciBiYWQgZXhwciBiZWNvbWVzIGFic29sdXRlIDAKLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjYwNAotIywgYy1mb3JtYXQKLW1zZ2lkICJNaXNzaW5nIG9yIGludmFsaWQgaW1tZWRpYXRlIGV4cHJlc3Npb24gYCVzJyB0YWtlbiBhcyAwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjYzOSBjb25maWcvdGMtaTM4Ni5jOjI4NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5pbXBsZW1lbnRlZCBzZWdtZW50IHR5cGUgJWQgaW4gb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI2ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIHNjYWxlIGZhY3RvciBvZiAxLCAyLCA0LCBvciA4OiBnb3QgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI2ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2NhbGUgZmFjdG9yIG9mICVkIHdpdGhvdXQgYW4gaW5kZXggcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozMDM3IGNvbmZpZy90Yy1pMzg2LmM6MzA0MyBjb25maWcvdGMtaTM4Ni5jOjMwNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIHNlZ21lbnQgbmFtZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzIxOCBjb25maWcvdGMtaTM4Ni5jOjM0NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidG9vIG1hbnkgbWVtb3J5IHJlZmVyZW5jZXMgZm9yIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozMzI5IGNvbmZpZy90Yy1pMzg2LmM6MzM0MiBjb25maWcvdGMtaTM4Ni5jOjM2NTQKLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzY2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJgJXMnIGlzIG5vdCBhIHZhbGlkICVzIGJpdCBiYXNlL2luZGV4IGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozNDI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBtZW1vcnkgb3BlcmFuZCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzQ0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJKdW5rIGAlcycgYWZ0ZXIgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozNTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGluZyBgLCcgb3IgYCknIGFmdGVyIGluZGV4IHJlZ2lzdGVyIGluIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozNTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGluZyBgKScgYWZ0ZXIgc2NhbGUgZmFjdG9yIGluIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozNjA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGluZyBpbmRleCByZWdpc3RlciBvciBzY2FsZSBmYWN0b3IgYWZ0ZXIgYCwnOyBnb3QgJyVjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM2MTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0aW5nIGAsJyBvciBgKScgYWZ0ZXIgYmFzZSByZWdpc3RlciBpbiBgJXMnIgotbXNnc3RyICIiCi0KLSMuIGl0J3Mgbm90IGEgbWVtb3J5IG9wZXJhbmQ7IGFyZ2ghCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM2NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBjaGFyICVzIGJlZ2lubmluZyBvcGVyYW5kICVkIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo0MDk1Ci1tc2dpZCAiQmFkIGNhbGwgdG8gbWRfYXRvZiAoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQxNTYgY29uZmlnL3RjLWkzODYuYzo0MTY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCByZWdpc3RlciBuYW1lIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo0MjIzCi1tc2dpZCAiLW1cdFx0XHRkbyBsb25nIGp1bXBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjQyNjMKLW1zZ2lkICJHT1QgYWxyZWFkeSBpbiBzeW1ib2wgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo0NDA5IGNvbmZpZy90Yy1tY29yZS5jOjIxMzAgY29uZmlnL3RjLXNoLmM6MjQyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgcmVwcmVzZW50IHJlbG9jYXRpb24gdHlwZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjE1NyBjb25maWcvdGMtaTg2MC5jOjE2MQotbXNnaWQgIlVua25vd24gdGVtcG9yYXJ5IHBzZXVkbyByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjE4MyBjb25maWcvdGMtbWlwcy5jOjEwMTMgY29uZmlnL3RjLXNwYXJjLmM6Njk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzozNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXhwYW5kZWQgb3Bjb2RlIGFmdGVyIGRlbGF5ZWQgYnJhbmNoOiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MzQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkV4cGFuZGVkIG9wY29kZSBpbiBkdWFsIG1vZGU6IGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo1ODAKLW1zZ2lkICJGc3IxIGVxdWFscyBmZGVzdCB3aXRoIFBpcGVsaW5pbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo2MzEKLW1zZ2lkICI1LWJpdCBpbW1lZGlhdGUgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6NzI1Ci1tc2dpZCAiSWxsZWdhbCBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjc0OSBjb25maWcvdGMtc3BhcmMuYzoyMzM4Ci1tc2dpZCAiYmFkIHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo4NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiMjYtYml0IGJyYW5jaCB3L28gcGMgcmVsYXRpdmUgc2V0OiAweCUwOHgiCi1tc2dzdHIgIiIKLQotIy4gYWxpZ24gcGNyZWwgb2Zmc2V0LCBzZWUgbWFudWFsCi0jLiBjaGVjayBmb3Igb3ZlcmZsb3cKLSM6IGNvbmZpZy90Yy1pODYwLmM6ODgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIjI2LWJpdCBicmFuY2ggb2Zmc2V0IG92ZXJmbG93OiAweCUwOHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo4OTEgY29uZmlnL3RjLWk4NjAuYzo5MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiMTYtYml0IGltbWVkaWF0ZSA0LWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo4OTYgY29uZmlnL3RjLWk4NjAuYzo5MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiMTYtYml0IGltbWVkaWF0ZSAyLWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo5MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiMTYtYml0IGJyYW5jaCBvZmZzZXQgb3ZlcmZsb3c6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjkxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIDE2LWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo5MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiMTYtYml0IGltbWVkaWF0ZSA4LWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo5MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiMTYtYml0IGltbWVkaWF0ZSBvdmVyZmxvdzogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6OTUxCi1tc2dpZCAibWRfbnVtYmVyX3RvX2Rpc3BcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjk2MQotbXNnaWQgImk4NjBfbnVtYmVyX3RvX2ZpZWxkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzoxMDAxCi1tc2dpZCAiaTg2MF9jb252ZXJ0X2ZyYWdcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjEwMTAKLW1zZ2lkICJpODYwX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzo1NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSGFzaGluZyByZXR1cm5lZCBcIiVzXCIuIgotbXNnc3RyICIiCi0KLSMuIE9mZnNldCBvZiBsYXN0IGNoYXJhY3RlciBpbiBvcGNvZGUgbW5lbW9uaWMKLSM6IGNvbmZpZy90Yy1pOTYwLmM6NTkzCi1tc2dpZCAiYnJhbmNoIHByZWRpY3Rpb24gaW52YWxpZCBvbiB0aGlzIG9wY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjYzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIG9wY29kZSwgXCIlc1wiLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjY0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbXByb3BlciBudW1iZXIgb2Ygb3BlcmFuZHMuICBleHBlY3RpbmcgJWQsIGdvdCAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjc4NiBjb25maWcvdGMtbTMyci5jOjEyMzkKLW1zZ2lkICJCYWQgY2FsbCB0byBtZF9hdG9mKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzo4NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRml4dXAgb2YgJWxkIHRvbyBsYXJnZSBmb3IgZmllbGQgd2lkdGggb2YgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzo5OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhcmNoaXRlY3R1cmUgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxMDE0Ci1tc2dpZCAiSTk2MCBvcHRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTAxNwotbXNnaWQgIiIKLSJcbiIKLSJcdFx0XHRzcGVjaWZ5IHZhcmlhbnQgb2YgOTYwIGFyY2hpdGVjdHVyZVxuIgotIi1iXHRcdFx0YWRkIGNvZGUgdG8gY29sbGVjdCBzdGF0aXN0aWNzIGFib3V0IGJyYW5jaGVzIHRha2VuXG4iCi0iLWxpbmstcmVsYXhcdFx0cHJlc2VydmUgaW5kaXZpZHVhbCBhbGlnbm1lbnQgZGlyZWN0aXZlcyBzbyBsaW5rZXJcbiIKLSJcdFx0XHRjYW4gZG8gcmVsYXhpbmcgKGIub3V0IGZvcm1hdCBvbmx5KVxuIgotIi1uby1yZWxheFx0XHRkb24ndCBhbHRlciBjb21wYXJlLWFuZC1icmFuY2ggaW5zdHJ1Y3Rpb25zIGZvclxuIgotIlx0XHRcdGxvbmcgZGlzcGxhY2VtZW50c1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTQyNQotbXNnaWQgInRvbyBtYW55IG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTQ4NSBjb25maWcvdGMtaTk2MC5jOjE3MTUKLW1zZ2lkICJleHByZXNzaW9uIHN5bnRheCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE1MjMKLW1zZ2lkICJhdHRlbXB0IHRvIGJyYW5jaCBpbnRvIGRpZmZlcmVudCBzZWdtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTUyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJ0YXJnZXQgb2YgJXMgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBhIGxhYmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTU2NwotbXNnaWQgInVubWF0Y2hlZCAnWyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxNTc4Ci1tc2dpZCAiZ2FyYmFnZSBhZnRlciBpbmRleCBzcGVjIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIy4gV2UgbmV2ZXIgbW92ZWQ6IHRoZXJlIHdhcyBubyBvcGNvZGUgZWl0aGVyIQotIzogY29uZmlnL3RjLWk5NjAuYzoxNjQ1Ci1tc2dpZCAibWlzc2luZyBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxOTUzCi1tc2dpZCAiaW52YWxpZCBjb25zdGFudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjIwNjYKLW1zZ2lkICJpbnZhbGlkIGluZGV4IHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjA4OQotbXNnaWQgImludmFsaWQgc2NhbGUgZmFjdG9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjI3MgotbXNnaWQgInVuYWxpZ25lZCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjIyOTUKLW1zZ2lkICJubyBzdWNoIHNmciBpbiB0aGlzIGFyY2hpdGVjdHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjIzMzMKLW1zZ2lkICJpbGxlZ2FsIGxpdGVyYWwiCi1tc2dzdHIgIiIKLQotIy4gU2hvdWxkIG5vdCBoYXBwZW46IHNlZSBibG9jayBjb21tZW50IGFib3ZlCi0jOiBjb25maWcvdGMtaTk2MC5jOjI1NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVHJ5aW5nIHRvICdiYWwnIHRvICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjU3NwotbXNnaWQgIkxvb2tzIGxpa2UgYSBwcm9jLCBidXQgY2FuJ3QgdGVsbCB3aGF0IGtpbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNjA5Ci1tc2dpZCAic2hvdWxkIGhhdmUgMSBvciAyIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjYxOCBjb25maWcvdGMtaTk2MC5jOjI2MzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVkZWZpbmluZyBsZWFmcHJvYyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI2NjcKLW1zZ2lkICJzaG91bGQgaGF2ZSB0d28gb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNjc3Ci1tc2dpZCAiJ2VudHJ5X251bScgbXVzdCBiZSBhYnNvbHV0ZSBudW1iZXIgaW4gWzAsMzFdIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjY4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJSZWRlZmluaW5nIGVudHJ5bnVtIGZvciBzeXNwcm9jICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6Mjc5NwotbXNnaWQgImFyY2hpdGVjdHVyZSBvZiBvcGNvZGUgY29uZmxpY3RzIHdpdGggdGhhdCBvZiBlYXJsaWVyIGluc3RydWN0aW9uKHMpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjgxOAotbXNnaWQgImJpZyBlbmRpYW4gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjgyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJpZ25vcmluZyB1bnJlY29nbml6ZWQgLmVuZGlhbiB0eXBlIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzozMTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgImxlYWZwcm9jIHN5bWJvbCAnJXMnIHVuZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjMxMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogbWFraW5nIGxlYWZwcm9jIGVudHJpZXMgJXMgYW5kICVzIGJvdGggZ2xvYmFsXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzozMjQyCi1tc2dpZCAib3B0aW9uIC0tbGluay1yZWxheCBpcyBvbmx5IHN1cHBvcnRlZCBpbiBiLm91dCBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzozMjg1Ci1tc2dpZCAiY2FsbGogdG8gZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjE5MQotbXNnaWQgIiBNMzJSIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTk0Ci1tc2dpZCAiIgotIiAgLXdhcm4tdW5tYXRjaGVkLWhpZ2ggICAgd2FybiB3aGVuIGFuIChzKWhpZ2ggcmVsb2MgaGFzIG5vIG1hdGNoaW5nIGxvdyAiCi0icmVsb2NcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjE5NgotbXNnaWQgIiAgLW5vLXdhcm4tdW5tYXRjaGVkLWhpZ2ggZG8gbm90IHdhcm4gYWJvdXQgbWlzc2luZyBsb3cgcmVsb2NzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoxOTgKLW1zZ2lkICIgIC1XdWggICAgICAgICAgICAgICAgICAgIHN5bm9ueW0gZm9yIC13YXJuLXVubWF0Y2hlZC1oaWdoXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoyMDAKLW1zZ2lkICIgIC1XbnVoICAgICAgICAgICAgICAgICAgIHN5bm9ueW0gZm9yIC1uby13YXJuLXVubWF0Y2hlZC1oaWdoXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoyMDQKLW1zZ2lkICIgIC1yZWxheCAgICAgICAgICAgICAgICAgY3JlYXRlIGxpbmtlciByZWxheGFibGUgY29kZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MjA2Ci1tc2dpZCAiICAtY3B1LWRlc2MgICAgICAgICAgICAgIHByb3ZpZGUgcnVudGltZSBjcHUgZGVzY3JpcHRpb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MzMxIHJlYWQuYzoyNzU1IHJlYWQuYzo0ODI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjYzMCBjb25maWcvdGMtcHBjLmM6MTMzNiBjb25maWcvdGMtcHBjLmM6MzU0MCByZWFkLmM6MTM2OAotbXNnaWQgIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lOiByZXN0IG9mIGxpbmUgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo2MzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLlNDT01Nb24gbGVuZ3RoICglbGQuKSA8MCEgSWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo2NTMgY29uZmlnL3RjLXBwYy5jOjEzNTggY29uZmlnL3RjLXBwYy5jOjIyNjcKLSM6IGNvbmZpZy90Yy1wcGMuYzozNTY0Ci1tc2dpZCAiaWdub3JpbmcgYmFkIGFsaWdubWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjY3OSBjb25maWcvdGMtcHBjLmM6MTM2OSBjb25maWcvdGMtcHBjLmM6MzU3NiByZWFkLmM6MTM4OAotIzogcmVhZC5jOjIxMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcycuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6Njg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxlbmd0aCBvZiAuc2NvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6OTMyCi1tc2dpZCAiQWRkZW5kIHRvIHVucmVzb2x2ZWQgc3ltYm9sIG5vdCBvbiB3b3JkIGJvdW5kYXJ5LiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjExNjEKLW1zZ2lkICJVbm1hdGNoZWQgaGlnaC9zaGlnaCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY0NgotbXNnaWQgIlVua25vd24gUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo3NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHBpYyByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSBwaWMgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjg4NSBjb25maWcvdGMtbWlwcy5jOjExMTQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBtYWtlICVzIHJlbG9jYXRpb24gUEMgcmVsYXRpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo5OTggY29uZmlnL3RjLXRhaG9lLmM6MTUwNSBjb25maWcvdGMtdmF4LmM6MTc3NAotbXNnaWQgIk5vIG9wZXJhdG9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTAyOCBjb25maWcvdGMtdGFob2UuYzoxNTIyIGNvbmZpZy90Yy12YXguYzoxNzkxCi1tc2dpZCAiVW5rbm93biBvcGVyYXRvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE4MDMKLW1zZ2lkICJpbnZhbGlkIGluc3RydWN0aW9uIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTgwOAotbXNnaWQgImZwdSAoNjgwNDAsIDY4MDYwIG9yIDY4ODgxLzY4ODgyKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE4MTEKLW1zZ2lkICJtbXUgKDY4MDMwIG9yIDY4ODUxKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE4MTQKLW1zZ2lkICI2ODAyMCBvciBoaWdoZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxODE3Ci1tc2dpZCAiNjgwMDAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTgyMAotbXNnaWQgIjY4MDEwIG9yIGhpZ2hlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE4NDgKLW1zZ2lkICJvcGVyYW5kcyBtaXNtYXRjaCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE5MDUgY29uZmlnL3RjLW02OGsuYzoxOTExIGNvbmZpZy90Yy1tNjhrLmM6MTkxNwotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTk3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJCaWdudW0gdG9vIGJpZyBmb3IgJWMgZm9ybWF0OyB0cnVuY2F0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMDQyCi1tc2dpZCAiZGlzcGxhY2VtZW50IHRvbyBsYXJnZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzIDY4MDIwIG9yIGhpZ2hlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIxNTIKLW1zZ2lkICIiCi0ic2NhbGUgZmFjdG9yIGludmFsaWQgb24gdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzIGNwdTMyIG9yIDY4MDIwIG9yIGhpZ2hlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIxNTcKLW1zZ2lkICJpbnZhbGlkIGluZGV4IHNpemUgZm9yIGNvbGRmaXJlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjIxMAotbXNnaWQgIkZvcmNpbmcgYnl0ZSBkaXNwbGFjZW1lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMjEyCi1tc2dpZCAiYnl0ZSBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjI1OSBjb25maWcvdGMtbTY4ay5jOjIyOTcKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQgbW9kZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzIDY4MDIwIG9yIGhpZ2hlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIyODMgY29uZmlnL3RjLW02OGsuYzoyMzE3Ci1tc2dpZCAiOmIgbm90IHBlcm1pdHRlZDsgZGVmYXVsdGluZyB0byA6dyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIzOTkKLW1zZ2lkICJ1bnN1cHBvcnRlZCBieXRlIHZhbHVlOyB1c2UgYSBkaWZmZXJlbnQgc3VmZml4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjQxMwotbXNnaWQgInVua25vd24vaW5jb3JyZWN0IG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNDQ2IGNvbmZpZy90Yy1tNjhrLmM6MjQ1NCBjb25maWcvdGMtbTY4ay5jOjI0NjEKLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjQ2OAotbXNnaWQgIm91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI1MTgKLW1zZ2lkICJDYW4ndCB1c2UgbG9uZyBicmFuY2hlcyBvbiA2ODAwMC82ODAxMC81MjAwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjYwNgotbXNnaWQgIkV4cHJlc3Npb24gb3V0IG9mIHJhbmdlLCB1c2luZyAwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjcxOCBjb25maWcvdGMtbTY4ay5jOjI3MzQKLW1zZ2lkICJGbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiByZWdpc3RlciBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjcyNAotbXNnaWQgIldyb25nIHJlZ2lzdGVyIGluIGZsb2F0aW5nLXBvaW50IHJlZ2xpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNzQwCi1tc2dpZCAiaW5jb3JyZWN0IHJlZ2lzdGVyIGluIHJlZ2xpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNzQ2Ci1tc2dpZCAid3JvbmcgcmVnaXN0ZXIgaW4gZmxvYXRpbmctcG9pbnQgcmVnbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI4MjIKLW1zZ2lkICJmYWlsZWQgc2FuaXR5IGNoZWNrIgotbXNnc3RyICIiCi0KLSMuIEVSUk9SCi0jOiBjb25maWcvdGMtbTY4ay5jOjMxODcKLW1zZ2lkICJFeHRyYSApIgotbXNnc3RyICIiCi0KLSMuIEVSUk9SCi0jOiBjb25maWcvdGMtbTY4ay5jOjMxOTgKLW1zZ2lkICJNaXNzaW5nICkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozMjE1Ci1tc2dpZCAiTWlzc2luZyBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzU0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyAtLSBzdGF0ZW1lbnQgYCVzJyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzU5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJEb24ndCBrbm93IGhvdyB0byBmaWd1cmUgd2lkdGggb2YgJWMgaW4gbWRfYXNzZW1ibGUoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM3NTkgY29uZmlnL3RjLW02OGsuYzozNzk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIEVycm9yOiBDYW4ndCBmaW5kICVzIGluIGhhc2ggdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozNzYyIGNvbmZpZy90Yy1tNjhrLmM6Mzc5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgaGFzaCAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozOTI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBkZWZhdWx0IGNwdSBgJXMnID8/PyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM5MzgKLW1zZ2lkICI2ODA0MCBhbmQgNjg4NTEgc3BlY2lmaWVkOyBtbXUgaW5zdHJ1Y3Rpb25zIG1heSBhc3NlbWJsZSBpbmNvcnJlY3RseSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM5NTgKLW1zZ2lkICJvcHRpb25zIGZvciA2ODg4MSBhbmQgbm8tNjg4ODEgYm90aCBnaXZlbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM5NjAKLW1zZ2lkICJvcHRpb25zIGZvciA2ODg1MSBhbmQgbm8tNjg4NTEgYm90aCBnaXZlbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQwMzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGV4dCBsYWJlbCBgJXMnIGFsaWduZWQgdG8gb2RkIGJvdW5kYXJ5IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDI0OAotbXNnaWQgImludmFsaWQgYnl0ZSBicmFuY2ggb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDMwNQotbXNnaWQgInNob3J0IGJyYW5jaCB3aXRoIHplcm8gb2Zmc2V0OiB1c2UgOnciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0MzUxCi1tc2dpZCAiTG9uZyBicmFuY2ggb2Zmc2V0IG5vdCBzdXBwb3J0ZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDQxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvciAobG9uZyBQQy1yZWxhdGl2ZSBvcGVyYW5kKSBmb3IgaW5zbiAweCUwNHggYXQgMHglbHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0NDQzCi1tc2dpZCAiZGlzcGxhY2VtZW50IGRvZXNuJ3QgZml0IGluIG9uZSBieXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDU1NgotbXNnaWQgIkxvbmcgYnJhbmNoIG9mZnNldCB0byBleHRlcm4gc3ltYm9sIG5vdCBzdXBwb3J0ZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDkwNSBjb25maWcvdGMtbTY4ay5jOjQ5MTYKLW1zZ2lkICJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAxIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDk0OAotbXNnaWQgImV4cHJlc3Npb24gb3V0IG9mIHJhbmdlOiBkZWZhdWx0aW5nIHRvIDAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0OTgxIGNvbmZpZy90Yy1tNjhrLmM6NDk5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBkZWFsIHdpdGggZXhwcmVzc2lvbjsgZGVmYXVsdGluZyB0byAlbGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MDA3Ci1tc2dpZCAiZXhwcmVzc2lvbiBkb2Vzbid0IGZpdCBpbiBCWVRFIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTAxMQotbXNnaWQgImV4cHJlc3Npb24gZG9lc24ndCBmaXQgaW4gV09SRCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUxMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVucmVjb2duaXplZCBwcm9jZXNzb3IgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUxNjkKLW1zZ2lkICJiYWQgY29wcm9jZXNzb3IgaWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MTc1Ci1tc2dpZCAidW5yZWNvZ25pemVkIGZvcHQgb3B0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTMwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJvcHRpb24gYCVzJyBtYXkgbm90IGJlIG5lZ2F0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MzIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wdGlvbiBgJXMnIG5vdCByZWNvZ25pemVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTM1MwotbXNnaWQgImJhZCBmb3JtYXQgb2YgT1BUIE5FU1Q9ZGVwdGgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1NDE2Ci1tc2dpZCAibWlzc2luZyBsYWJlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjU0NDAgY29uZmlnL3RjLW02OGsuYzo1NDY5Ci1tc2dpZCAiYmFkIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1NDQyCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCByZWdpc3RlciBsaXN0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjU1NDAKLW1zZ2lkICJyZXN0b3JlIHdpdGhvdXQgc2F2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjU3MTcgY29uZmlnL3RjLW02OGsuYzo2MDY2Ci1tc2dpZCAic3ludGF4IGVycm9yIGluIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1NzY4Ci1tc2dpZCAibWlzc2luZyBjb25kaXRpb24gY29kZSBpbiBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjEwMAotbXNnaWQgIm1pc3NpbmcgdGhlbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYxODIKLW1zZ2lkICJlbHNlIHdpdGhvdXQgbWF0Y2hpbmcgaWYiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2MjE2Ci1tc2dpZCAiZW5kaSB3aXRob3V0IG1hdGNoaW5nIGlmIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjI1NwotbXNnaWQgImJyZWFrIG91dHNpZGUgb2Ygc3RydWN0dXJlZCBsb29wIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjI5NgotbXNnaWQgIm5leHQgb3V0c2lkZSBvZiBzdHJ1Y3R1cmVkIGxvb3AiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2MzQ4Ci1tc2dpZCAibWlzc2luZyA9IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjM4NgotbXNnaWQgIm1pc3NpbmcgdG8gb3IgZG93bnRvIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjQyMiBjb25maWcvdGMtbTY4ay5jOjY0NTYgY29uZmlnL3RjLW02OGsuYzo2NjY2Ci1tc2dpZCAibWlzc2luZyBkbyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY1NTkKLW1zZ2lkICJlbmRmIHdpdGhvdXQgZm9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjYxNQotbXNnaWQgInVudGlsIHdpdGhvdXQgcmVwZWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjcwMgotbXNnaWQgImVuZHcgd2l0aG91dCB3aGlsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY4MTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pemVkIG9wdGlvbiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Njg2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY5MzMKLW1zZ2lkICIiCi0iNjgwWDAgb3B0aW9uczpcbiIKLSItbFx0XHRcdHVzZSAxIHdvcmQgZm9yIHJlZnMgdG8gdW5kZWZpbmVkIHN5bWJvbHMgW2RlZmF1bHQgMl1cbiIKLSItbTY4MDAwIHwgLW02ODAwOCB8IC1tNjgwMTAgfCAtbTY4MDIwIHwgLW02ODAzMCB8IC1tNjgwNDAgfCAtbTY4MDYwXG4iCi0iIHwgLW02ODMwMiB8IC1tNjgzMzEgfCAtbTY4MzMyIHwgLW02ODMzMyB8IC1tNjgzNDAgfCAtbTY4MzYwXG4iCi0iIHwgLW1jcHUzMiB8IC1tNTIwMFxuIgotIlx0XHRcdHNwZWNpZnkgdmFyaWFudCBvZiA2ODBYMCBhcmNoaXRlY3R1cmUgW2RlZmF1bHQgNjgwMjBdXG4iCi0iLW02ODg4MSB8IC1tNjg4ODIgfCAtbW5vLTY4ODgxIHwgLW1uby02ODg4MlxuIgotIlx0XHRcdHRhcmdldCBoYXMvbGFja3MgZmxvYXRpbmctcG9pbnQgY29wcm9jZXNzb3JcbiIKLSJcdFx0XHRbZGVmYXVsdCB5ZXMgZm9yIDY4MDIwLCA2ODAzMCwgYW5kIGNwdTMyXVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Njk0MwotbXNnaWQgIiIKLSItbTY4ODUxIHwgLW1uby02ODg1MVxuIgotIlx0XHRcdHRhcmdldCBoYXMvbGFja3MgbWVtb3J5LW1hbmFnZW1lbnQgdW5pdCBjb3Byb2Nlc3NvclxuIgotIlx0XHRcdFtkZWZhdWx0IHllcyBmb3IgNjgwMjAgYW5kIHVwXVxuIgotIi1waWMsIC1rXHRcdGdlbmVyYXRlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcbiIKLSItU1x0XHRcdHR1cm4gamJzciBpbnRvIGpzclxuIgotIi0tcmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsXG4iCi0iXHRcdFx0cmVjb2duaXplIHJlZ2lzdGVyIG5hbWVzIHdpdGhvdXQgcHJlZml4IGNoYXJhY3RlclxuIgotIi0tYml0d2lzZS1vclx0XHRkbyBub3QgdHJlYXQgYHwnIGFzIGEgY29tbWVudCBjaGFyYWN0ZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY5NTIKLW1zZ2lkICIiCi0iLS1iYXNlLXNpemUtZGVmYXVsdC0xNlx0YmFzZSByZWcgd2l0aG91dCBzaXplIGlzIDE2IGJpdHNcbiIKLSItLWJhc2Utc2l6ZS1kZWZhdWx0LTMyXHRiYXNlIHJlZyB3aXRob3V0IHNpemUgaXMgMzIgYml0cyAoZGVmYXVsdClcbiIKLSItLWRpc3Atc2l6ZS1kZWZhdWx0LTE2XHRkaXNwbGFjZW1lbnQgd2l0aCB1bmtub3duIHNpemUgaXMgMTYgYml0c1xuIgotIi0tZGlzcC1zaXplLWRlZmF1bHQtMzJcdGRpc3BsYWNlbWVudCB3aXRoIHVua25vd24gc2l6ZSBpcyAzMiBiaXRzIChkZWZhdWx0KVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Njk4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvciAlcyBpbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Njk5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJPcGNvZGUoJWQuJXMpOiAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoyMDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgaGFzaCBpbnN0cnVjdGlvbiAnJXMnOiVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MjU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgbW5lbW9uaWMgJyVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjI3OAotbXNnaWQgIlBhcmFtZXRlciBzeW50YXggZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzozMzMKLW1zZ2lkICJVbmtub3duIHJlbG9jYXRpb24gdHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBIYXZpbmcgdGhpcyBoZXJlIHJlcGVhdHMgdGhlIHdhcm5pbmcgc29tdGltZXMuCi0jLiBCdXQgY2FuJ3Qgd2Ugc3RhbmQgdGhhdD8KLSM6IGNvbmZpZy90Yy1tODhrLmM6NDQ2Ci1tc2dpZCAiVXNlIG9mIG9ic29sZXRlIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6NTYzCi1tc2dpZCAiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gMTYgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjYyOSBjb25maWcvdGMtbTg4ay5jOjY1MQotbXNnaWQgIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDUgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjg3MwotbXNnaWQgIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDkgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjg5NQotbXNnaWQgIlJlbW92ZWQgbG93ZXIgMiBiaXRzIG9mIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoxMDM0Ci1tc2dpZCAiQmFkIHJlbG9jYXRpb24gdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjEwNDcKLW1zZ2lkICJtZF9udW1iZXJfdG9fZGlzcCBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjEwNTcKLW1zZ2lkICJtZF9udW1iZXJfdG9fZmllbGQgbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoxMTcwCi1tc2dpZCAiUmVsYXhhdGlvbiBzaG91bGQgbmV2ZXIgb2NjdXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoxMjY3IGNvbmZpZy90Yy1zcGFyYy5jOjMwMjUgcmVhZC5jOjE5NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQlNTIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoxMzExCi0jLCBjLWZvcm1hdAotbXNnaWQgIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCAlcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6NDAyCi0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIGV4cGVjdGVkLCBidXQgc2F3ICclLjZzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo0ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY29udHJvbCByZWdpc3RlciBleHBlY3RlZCwgYnV0IHNhdyAnJS42cyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6NjQ1Ci1tc2dpZCAibW9yZSB0aGFuIDY1SyBsaXRlcmFsIHBvb2xzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjY5OQotbXNnaWQgIm1pc3NpbmcgJ10nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjczOQotbXNnaWQgIm9wZXJhbmQgbXVzdCBiZSBhIGNvbnN0YW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjc0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkLCBub3QgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6Nzc5Ci1tc2dpZCAib3BlcmFuZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo3ODYKLW1zZ2lkICJvcGVyYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjgwMCBjb25maWcvdGMtbWNvcmUuYzoxMzAxIGNvbmZpZy90Yy1tY29yZS5jOjEzNTUKLW1zZ2lkICJiYXNlIHJlZ2lzdGVyIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjg0OQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9wY29kZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6ODkyCi1tc2dpZCAiaW52YWxpZCByZWdpc3RlcjogcjE1IGlsbGVnYWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6OTUxIGNvbmZpZy90Yy1tY29yZS5jOjk5MCBjb25maWcvdGMtbWNvcmUuYzoxMDA5Ci0jOiBjb25maWcvdGMtbWNvcmUuYzoxMDI4IGNvbmZpZy90Yy1tY29yZS5jOjEwNTUgY29uZmlnL3RjLW1jb3JlLmM6MTA4NAotIzogY29uZmlnL3RjLW1jb3JlLmM6MTEyMSBjb25maWcvdGMtbWNvcmUuYzoxMTU2IGNvbmZpZy90Yy1tY29yZS5jOjExNzUKLSM6IGNvbmZpZy90Yy1tY29yZS5jOjExOTQgY29uZmlnL3RjLW1jb3JlLmM6MTIyNiBjb25maWcvdGMtbWNvcmUuYzoxMjQ4Ci0jOiBjb25maWcvdGMtbWNvcmUuYzoxMzA0IGNvbmZpZy90Yy1tY29yZS5jOjEzNTggY29uZmlnL3RjLW1jb3JlLmM6MTM5MwotIzogY29uZmlnL3RjLW1jb3JlLmM6MTQ0NyBjb25maWcvdGMtbWNvcmUuYzoxNDY5IGNvbmZpZy90Yy1tY29yZS5jOjE0OTIKLW1zZ2lkICJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjk2NgotbXNnaWQgImRlc3RpbmF0aW9uIHJlZ2lzdGVyIG11c3QgYmUgcjEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6OTg3Ci1tc2dpZCAic291cmNlIHJlZ2lzdGVyIG11c3QgYmUgcjEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTA1MCBjb25maWcvdGMtbWNvcmUuYzoxMTA3Ci1tc2dpZCAiaW1tZWRpYXRlIGlzIG5vdCBhIHBvd2VyIG9mIHR3byIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMDc4Ci1tc2dpZCAidHJhbnNsYXRpbmcgYmdlbmkgdG8gbW92aSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMTE1Ci1tc2dpZCAidHJhbnNsYXRpbmcgbWdlbmkgdG8gbW92aSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMTQ3Ci1tc2dpZCAidHJhbnNsYXRpbmcgYm1hc2tpIHRvIG1vdmkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTIyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJkaXNwbGFjZW1lbnQgdG9vIGxhcmdlICglZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTIzNQotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXI6IHIwIGFuZCByMTUgaWxsZWdhbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMjYyCi1tc2dpZCAiYmFkIHN0YXJ0aW5nIHJlZ2lzdGVyOiByMCBhbmQgcjE1IGludmFsaWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTI3NQotbXNnaWQgImVuZGluZyByZWdpc3RlciBtdXN0IGJlIHIxNSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMjk1Ci1tc2dpZCAiYmFkIGJhc2UgcmVnaXN0ZXI6IG11c3QgYmUgcjAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTMxMwotbXNnaWQgImZpcnN0IHJlZ2lzdGVyIG11c3QgYmUgcjQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTMyNAotbXNnaWQgImxhc3QgcmVnaXN0ZXIgbXVzdCBiZSByNyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxMzYxCi1tc2dpZCAicmVnLXJlZyBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNDY2Ci1tc2dpZCAic2Vjb25kIG9wZXJhbmQgbXVzdCBiZSAxIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE0ODcKLW1zZ2lkICJ6ZXJvIHVzZWQgYXMgaW1tZWRpYXRlIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE0OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5pbXBsZW1lbnRlZCBvcGNvZGUgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE1NjggY29uZmlnL3RjLXc2NS5jOjg1NgotbXNnaWQgIkJhZCBjYWxsIHRvIE1EX05UT0YoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNjMxCi1tc2dpZCAiIgotIk1DT1JFIHNwZWNpZmljIG9wdGlvbnM6XG4iCi0iICAte25vLX1qc3JpMmJzclx0ICB7ZGlzfWFibGUganNyaSB0byBic3IgdHJhbnNmb3JtYXRpb24gKGRlZjogZGlzKVxuIgotIiAgLXtuby19c2lmaWx0ZXJcdCAge2Rpc31hYmxlIHNpbGljb24gZmlsdGVyIGJlaGF2aW9yIChkZWY6IGRpcykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTY0NwotbXNnaWQgImZhaWxlZCBzYW5pdHkgY2hlY2s6IHNob3J0X2p1bXAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTY1OAotbXNnaWQgImZhaWxlZCBzYW5pdHkgY2hlY2s6IGxvbmdfanVtcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNjg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9kZCBkaXNwbGFjZW1lbnQgYXQgJXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTgzOQotbXNnaWQgInVua25vd24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTg0NCBjb25maWcvdGMtbnMzMmsuYzoyMjgxCi1tc2dpZCAiPHVua25vd24+IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE4NzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib2RkIGRpc3RhbmNlIGJyYW5jaCAoMHgleCBieXRlcykiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTg3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJwY3JlbCBmb3IgYnJhbmNoIHRvICVzIHRvbyBmYXIgKDB4JXgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE4ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGNyZWwgZm9yIGxydy9qbXBpL2pzcmkgdG8gJXMgdG9vIGZhciAoMHgleCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTg5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJwY3JlbCBmb3IgbG9vcHQgdG9vIGZhciAoMHgleCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MjExMgotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgJXNyZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjIxMTQKLW1zZ2lkICJwYy1yZWxhdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk2MAotbXNnaWQgInRyYXAgZXhjZXB0aW9uIG5vdCBzdXBwb3J0ZWQgYXQgSVNBIDEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDAwCi1tc2dpZCAiQ291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsOiBjYW4ndCBoYXNoIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTA0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogYmFkIG1pcHMxNiBvcGNvZGU6ICVzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJldHVybmVkIGZyb20gbWlwc19pcCglcykgaW5zbl9vcGNvZGUgPSAweCV4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxNzM5IGNvbmZpZy90Yy1taXBzLmM6MTEyNzkKLW1zZ2lkICJleHRlbmRlZCBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTc2MSBjb25maWcvdGMtbWlwcy5jOjE3NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAianVtcCB0byBtaXNhbGlnbmVkIGFkZHJlc3MgKDB4JWx4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjI0MTkgY29uZmlnL3RjLW1pcHMuYzoyNzgyCi1tc2dpZCAiTWFjcm8gaW5zdHJ1Y3Rpb24gZXhwYW5kZWQgaW50byBtdWx0aXBsZSBpbnN0cnVjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoyODM1Ci1tc2dpZCAidW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoyODM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkluc3RydWN0aW9uICVzIHJlcXVpcmVzIGFic29sdXRlIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoyOTgzCi1tc2dpZCAiTnVtYmVyIGxhcmdlciB0aGFuIDMyIGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzozMDA0Ci1tc2dpZCAiTnVtYmVyIGxhcmdlciB0aGFuIDY0IGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzozMjcwIGNvbmZpZy90Yy1taXBzLmM6MzM0MiBjb25maWcvdGMtbWlwcy5jOjUwMjEKLSM6IGNvbmZpZy90Yy1taXBzLmM6NTA3MiBjb25maWcvdGMtbWlwcy5jOjU2MDggY29uZmlnL3RjLW1pcHMuYzo1NjcxCi1tc2dpZCAiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MzU4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJCcmFuY2ggJXMgaXMgYWx3YXlzIGZhbHNlIChub3ApIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MzU4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJCcmFuY2ggbGlrZWx5ICVzIGlzIGFsd2F5cyBmYWxzZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjM1OTMgY29uZmlnL3RjLW1pcHMuYzozNjY3IGNvbmZpZy90Yy1taXBzLmM6Mzc3MAotIzogY29uZmlnL3RjLW1pcHMuYzozODI1IGNvbmZpZy90Yy1taXBzLmM6NjcwNyBjb25maWcvdGMtbWlwcy5jOjY3MTYKLSM6IGNvbmZpZy90Yy1taXBzLmM6NjcyNCBjb25maWcvdGMtbWlwcy5jOjY4MzMKLW1zZ2lkICJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIKLW1zZ3N0ciAiIgotCi0jLiByZXN1bHQgaXMgYWx3YXlzIHRydWUKLSM6IGNvbmZpZy90Yy1taXBzLmM6MzYyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJCcmFuY2ggJXMgaXMgYWx3YXlzIHRydWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzozOTAxIGNvbmZpZy90Yy1taXBzLmM6NDAwOAotbXNnaWQgIkRpdmlkZSBieSB6ZXJvLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjQ1OTIKLW1zZ2lkICJNSVBTIFBJQyBjYWxsIHRvIHJlZ2lzdGVyIG90aGVyIHRoYW4gJDI1IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NDU5NyBjb25maWcvdGMtbWlwcy5jOjQ3MDkKLW1zZ2lkICJObyAuY3ByZXN0b3JlIHBzZXVkby1vcCB1c2VkIGluIFBJQyBjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NDc4MiBjb25maWcvdGMtbWlwcy5jOjQ4NzEgY29uZmlnL3RjLW1pcHMuYzo1MzU5Ci0jOiBjb25maWcvdGMtbWlwcy5jOjU0MDAgY29uZmlnL3RjLW1pcHMuYzo1NDE4IGNvbmZpZy90Yy1taXBzLmM6NjA0NgotIzogY29uZmlnL3RjLW1pcHMuYzo3MDU0Ci1tc2dpZCAib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo1ODc3IGNvbmZpZy90Yy1taXBzLmM6NjYwMQotbXNnaWQgIk1hY3JvIHVzZWQgJGF0IGFmdGVyIFwiLnNldCBub2F0XCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo2MDE3IGNvbmZpZy90Yy1taXBzLmM6NjAzNQotbXNnaWQgInJvdGF0ZSBjb3VudCB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo2MDg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkluc3RydWN0aW9uICVzOiByZXN1bHQgaXMgYWx3YXlzIGZhbHNlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NjI1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnN0cnVjdGlvbiAlczogcmVzdWx0IGlzIGFsd2F5cyB0cnVlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NjM5NCBjb25maWcvdGMtbWlwcy5jOjY0MjEgY29uZmlnL3RjLW1pcHMuYzo2NDkzCi0jOiBjb25maWcvdGMtbWlwcy5jOjY1MTgKLW1zZ2lkICJvcGVyYW5kIG92ZXJmbG93IgotbXNnc3RyICIiCi0KLSMuIEZJWE1FOiBDaGVjayBpZiB0aGlzIGlzIG9uZSBvZiB0aGUgaXRibCBtYWNyb3MsIHNpbmNlIHRoZXkKLSMuIGFyZSBhZGRlZCBkeW5hbWljYWxseS4KLSM6IGNvbmZpZy90Yy1taXBzLmM6NjU5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJNYWNybyAlcyBub3QgaW1wbGVtZW50ZWQgeWV0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6Njg2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbDogYmFkIG1pcHMgb3Bjb2RlIChtYXNrIGVycm9yKTogJXMgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo2OTE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsOiBiYWQgbWlwcyBvcGNvZGUgKHVua25vd24gb3BlcmFuZCB0eXBlIGAlYycpOiAlcyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjY5MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAoYml0cyAweCVseCB1bmRlZmluZWQpOiAlcyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcwNTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3Bjb2RlIHJlcXVpcmVzIC1taXBzJWQgb3IgZ3JlYXRlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcxMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW1wcm9wZXIgc2hpZnQgYW1vdW50ICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzE1NCBjb25maWcvdGMtbWlwcy5jOjgyNzIgY29uZmlnL3RjLW1pcHMuYzo4Mzg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgdmFsdWUgZm9yIGAlcycgKCVsdSkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MTcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgYnJlYWsgY29kZSAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcxODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWxsZWdhbCBsb3dlciBicmVhayBjb2RlICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzE5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbGxlZ2FsIHN5c2NhbGwgY29kZSAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcyMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ29wcm9jY2Vzb3IgY29kZSA+IDI1IGJpdHMgKCVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWRhdGUgcGVyZm9ybWFuY2UgcmVnc3RlciAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcyNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCByZWdpc3RlciBudW1iZXIgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc0MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBmbG9hdCByZWdpc3RlciBudW1iZXIgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc0MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRmxvYXQgcmVnaXN0ZXIgc2hvdWxkIGJlIGV2ZW4sIHdhcyAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc0ODQgY29uZmlnL3RjLW1pcHMuYzo3NzE2IGNvbmZpZy90Yy1taXBzLmM6Nzc1NQotbXNnaWQgImFic29sdXRlIGV4cHJlc3Npb24gcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3NTQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJhZCBmbG9hdGluZyBwb2ludCBjb25zdGFudDogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3NjYyCi1tc2dpZCAiQ2FuJ3QgdXNlIGZsb2F0aW5nIHBvaW50IGluc24gaW4gdGhpcyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzcxOAotbXNnaWQgIjE2IGJpdCBleHByZXNzaW9uIG5vdCBpbiByYW5nZSAwLi42NTUzNSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc3NTcKLW1zZ2lkICIxNiBiaXQgZXhwcmVzc2lvbiBub3QgaW4gcmFuZ2UgLTMyNzY4Li4zMjc2NyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc4MjkKLW1zZ2lkICJsdWkgZXhwcmVzc2lvbiBub3QgaW4gcmFuZ2UgMC4uNjU1MzUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3ODUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY29uZGl0aW9uIGNvZGUgcmVnaXN0ZXIgJGZjYyVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6Nzg2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgY2hhciA9ICclYydcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc4NzQgY29uZmlnL3RjLW1pcHMuYzo4NDEyCi1tc2dpZCAiaWxsZWdhbCBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc5NDEKLW1zZ2lkICJ1bnJlY29nbml6ZWQgb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODA1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciAoJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODEzMQotbXNnaWQgInVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjgzMDYKLW1zZ2lkICJjYW4ndCBwYXJzZSByZWdpc3RlciBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODM0MCBjb25maWcvdGMtbWlwcy5jOjgzNzAKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo4NTM3Ci1tc2dpZCAiZXh0ZW5kZWQgb3BlcmFuZCByZXF1ZXN0ZWQgYnV0IG5vdCByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjg1MzkKLW1zZ2lkICJpbnZhbGlkIHVuZXh0ZW5kZWQgb3BlcmFuZCB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjg1NjcKLW1zZ2lkICJvcGVyYW5kIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MDA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImlnbm9yaW5nIGludmFsaWQgbGVhZGluZyAndicgaW4gLW1jcHU9JXMgc3dpdGNoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTAxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdGVjdHVyZSAtbWNwdT0lcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkwNjQKLW1zZ2lkICItRyBtYXkgbm90IGJlIHVzZWQgd2l0aCBlbWJlZGRlZCBQSUMgY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkwNzYKLW1zZ2lkICItY2FsbF9zaGFyZWQgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIEVMRiBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MDgyIGNvbmZpZy90Yy1taXBzLmM6MTAwOTMgY29uZmlnL3RjLW1pcHMuYzoxMDI2MQotbXNnaWQgIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgUElDIGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MDkxCi1tc2dpZCAiLW5vbl9zaGFyZWQgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIEVMRiBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MTA3Ci1tc2dpZCAiLUcgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBjb25maWd1cmF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTExMgotbXNnaWQgIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgb3IgZW1iZWRkZWQgUElDIGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MTM2Ci1tc2dpZCAiTm8gY29tcGlsZWQgaW4gc3VwcG9ydCBmb3IgNjQgYml0IG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkxOTcKLW1zZ2lkICIiCi0iTUlQUyBvcHRpb25zOlxuIgotIi1tZW1iZWRkZWQtcGljXHRcdGdlbmVyYXRlIGVtYmVkZGVkIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcbiIKLSItRUJcdFx0XHRnZW5lcmF0ZSBiaWcgZW5kaWFuIG91dHB1dFxuIgotIi1FTFx0XHRcdGdlbmVyYXRlIGxpdHRsZSBlbmRpYW4gb3V0cHV0XG4iCi0iLWcsIC1nMlx0XHRcdGRvIG5vdCByZW1vdmUgdW5lZWRlZCBOT1BzIG9yIHN3YXAgYnJhbmNoZXNcbiIKLSItRyBOVU1cdFx0XHRhbGxvdyByZWZlcmVuY2luZyBvYmplY3RzIHVwIHRvIE5VTSBieXRlc1xuIgotIlx0XHRcdGltcGxpY2l0bHkgd2l0aCB0aGUgZ3AgcmVnaXN0ZXIgW2RlZmF1bHQgOF1cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkyMDUKLW1zZ2lkICIiCi0iLW1pcHMxXHRcdFx0Z2VuZXJhdGUgTUlQUyBJU0EgSSBpbnN0cnVjdGlvbnNcbiIKLSItbWlwczJcdFx0XHRnZW5lcmF0ZSBNSVBTIElTQSBJSSBpbnN0cnVjdGlvbnNcbiIKLSItbWlwczNcdFx0XHRnZW5lcmF0ZSBNSVBTIElTQSBJSUkgaW5zdHJ1Y3Rpb25zXG4iCi0iLW1pcHM0XHRcdFx0Z2VuZXJhdGUgTUlQUyBJU0EgSVYgaW5zdHJ1Y3Rpb25zXG4iCi0iLW1jcHU9Q1BVXHRcdGdlbmVyYXRlIGNvZGUgZm9yIENQVSwgd2hlcmUgQ1BVIGlzIG9uZSBvZjpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkyMzEKLW1zZ2lkICIiCi0iLW1DUFVcdFx0XHRlcXVpdmFsZW50IHRvIC1tY3B1PUNQVS5cbiIKLSItbm8tbUNQVVx0XHRkb24ndCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIENQVS5cbiIKLSJcdFx0XHRGb3IgLW1DUFUgYW5kIC1uby1tQ1BVLCBDUFUgbXVzdCBiZSBvbmUgb2Y6XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MjQ0Ci1tc2dpZCAiIgotIi1taXBzMTZcdFx0XHRnZW5lcmF0ZSBtaXBzMTYgaW5zdHJ1Y3Rpb25zXG4iCi0iLW5vLW1pcHMxNlx0XHRkbyBub3QgZ2VuZXJhdGUgbWlwczE2IGluc3RydWN0aW9uc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTI0NwotbXNnaWQgIiIKLSItTzBcdFx0XHRyZW1vdmUgdW5uZWVkZWQgTk9QcywgZG8gbm90IHN3YXAgYnJhbmNoZXNcbiIKLSItT1x0XHRcdHJlbW92ZSB1bm5lZWRlZCBOT1BzIGFuZCBzd2FwIGJyYW5jaGVzXG4iCi0iLS10cmFwLCAtLW5vLWJyZWFrXHR0cmFwIGV4Y2VwdGlvbiBvbiBkaXYgYnkgMCBhbmQgbXVsdCBvdmVyZmxvd1xuIgotIi0tYnJlYWssIC0tbm8tdHJhcFx0YnJlYWsgZXhjZXB0aW9uIG9uIGRpdiBieSAwIGFuZCBtdWx0IG92ZXJmbG93XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MjUzCi1tc2dpZCAiIgotIi1LUElDLCAtY2FsbF9zaGFyZWRcdGdlbmVyYXRlIFNWUjQgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuIgotIi1ub25fc2hhcmVkXHRcdGRvIG5vdCBnZW5lcmF0ZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG4iCi0iLXhnb3RcdFx0XHRhc3N1bWUgYSAzMiBiaXQgR09UXG4iCi0iLTMyXHRcdFx0Y3JlYXRlIDMyIGJpdCBvYmplY3QgZmlsZSAoZGVmYXVsdClcbiIKLSItNjRcdFx0XHRjcmVhdGUgNjQgYml0IG9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MzEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuc3VwcG9ydGVkIHJlbG9jIHNpemUgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5NDEzCi1tc2dpZCAiVW5tYXRjaGVkICUlaGkgcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5NTE4Ci1tc2dpZCAiSW52YWxpZCBQQyByZWxhdGl2ZSByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk2MTcgY29uZmlnL3RjLXNwYXJjLmM6MjYxNyBjb25maWcvdGMtc3BhcmMuYzoyNjI0Ci0jOiBjb25maWcvdGMtc3BhcmMuYzoyNjMxIGNvbmZpZy90Yy1zcGFyYy5jOjI2MzggY29uZmlnL3RjLXNwYXJjLmM6MjY0NQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjY1NCBjb25maWcvdGMtc3BhcmMuYzoyNjY1IGNvbmZpZy90Yy1zcGFyYy5jOjI2OTEKLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI3MTQgd3JpdGUuYzo5NzIgd3JpdGUuYzoxMDM2Ci1tc2dpZCAicmVsb2NhdGlvbiBvdmVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk2MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQnJhbmNoIHRvIG9kZCBhZGRyZXNzICglbHgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTc4OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlMDhseCAgVU5ERUZJTkVEXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5ODU0Ci1tc2dpZCAiQWxpZ25tZW50IG5lZ2F0aXZlOiAwIGFzc3VtZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTk0MgotbXNnaWQgIk5vIHJlYWQgb25seSBkYXRhIHNlY3Rpb24gaW4gdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5OTY1Ci1tc2dpZCAiR2xvYmFsIHBvaW50ZXJzIG5vdCBzdXBwb3J0ZWQ7IHJlY29tcGlsZSAtRyAwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAwNTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIHN1Y2ggc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMDg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5vcHRpb24gcGljJWQgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMDk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBvcHRpb24gXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAxNjIKLW1zZ2lkICJgbm9yZW9yZGVyJyBtdXN0IGJlIHNldCBiZWZvcmUgYG5vbWFjcm8nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAxOTcKLW1zZ2lkICJ1bmtub3duIElTQSBsZXZlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMjIwCi1tc2dpZCAiLnNldCBwb3Agd2l0aCBubyAuc2V0IHB1c2giCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDI0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJUcmllZCB0byBzZXQgdW5yZWNvZ25pemVkIHN5bWJvbDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMjk0Ci1tc2dpZCAiLmNwbG9hZCBub3QgaW4gbm9yZW9yZGVyIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDM3NgotbXNnaWQgIlVuc3VwcG9ydGVkIHVzZSBvZiAuZ3B3b3JkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTA1MTMKLW1zZ2lkICJleHBlY3RlZCBgJCciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDUyMQotbXNnaWQgIkJhZCByZWdpc3RlciBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDUzNwotbXNnaWQgIlVucmVjb2duaXplZCByZWdpc3RlciBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTA3MzQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBQQyByZWxhdGl2ZSByZWZlcmVuY2UgdG8gZGlmZmVyZW50IHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDg0MwotbXNnaWQgInVuc3VwcG9ydGVkIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDkyNgotbXNnaWQgIkFUIHVzZWQgYWZ0ZXIgXCIuc2V0IG5vYXRcIiBvciBtYWNybyB1c2VkIGFmdGVyIFwiLnNldCBub21hY3JvXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDk4OQotbXNnaWQgIkRvdWJsZSBjaGVjayBmeF9yX3R5cGUgaW4gdGMtbWlwcy5jOnRjX2dlbl9yZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNDcwCi1tc2dpZCAibWlzc2luZyBgLmVuZCcgYXQgZW5kIG9mIGFzc2VtYmx5IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE0ODUKLW1zZ2lkICJFeHBlY3RlZCBzaW1wbGUgbnVtYmVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNTExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAqaW5wdXRfbGluZV9wb2ludGVyID09ICclYycgMHglMDJ4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTUxMwotbXNnaWQgIkludmFsaWQgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE1NjgKLW1zZ2lkICIuZW5kIG5vdCBpbiB0ZXh0IHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTU3MgotbXNnaWQgIi5lbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE1ODEKLW1zZ2lkICIuZW5kIHN5bWJvbCBkb2VzIG5vdCBtYXRjaCAuZW50IHN5bWJvbC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTU4NAotbXNnaWQgIi5lbmQgZGlyZWN0aXZlIG1pc3Npbmcgb3IgdW5rbm93biBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTY1OQotbXNnaWQgIi5lbnQgb3IgLmFlbnQgbm90IGluIHRleHQgc2VjdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTY2MgotbXNnaWQgIm1pc3NpbmcgYC5lbmQnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE2OTUgZWNvZmYuYzozMjI2Ci1tc2dpZCAiLmZyYW1lIG91dHNpZGUgb2YgLmVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNzA2IGVjb2ZmLmM6MzIzNwotbXNnaWQgIkJhZCAuZnJhbWUgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE3MzYKLW1zZ2lkICIubWFzay8uZm1hc2sgb3V0c2lkZSBvZiAuZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE3NDMKLW1zZ2lkICJCYWQgLm1hc2svLmZtYXNrIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbW4xMDIwMC5jOjMxNAotbXNnaWQgIiIKLSJNTjEwMjAwIG9wdGlvbnM6XG4iCi0ibm9uZSB5ZXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbW4xMDIwMC5jOjc4OSBjb25maWcvdGMtbW4xMDMwMC5jOjc1MCBjb25maWcvdGMtcHBjLmM6MTYxMwotIzogY29uZmlnL3RjLXY4NTAuYzoxNjkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBvcGNvZGU6IGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1uMTAzMDAuYzozMzMKLW1zZ2lkICIiCi0iTU4xMDMwMCBvcHRpb25zOlxuIgotIm5vbmUgeWV0XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1uMTAzMDAuYzo3NjgKLW1zZ2lkICJJbnZhbGlkIG9wY29kZS9vcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbW4xMDMwMC5jOjEwOTkKLW1zZ2lkICJJbnZhbGlkIHJlZ2lzdGVyIHNwZWNpZmljYXRpb24uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjQ0MwotbXNnaWQgIkludmFsaWQgc3ludGF4IGluIFBDLXJlbGF0aXZlIGFkZHJlc3NpbmcgbW9kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo0NjcKLW1zZ2lkICJJbnZhbGlkIHN5bnRheCBpbiBFeHRlcm5hbCBhZGRyZXNzaW5nIG1vZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NTM2Ci1tc2dpZCAiSW52YWxpZCBzeW50YXggaW4gTWVtb3J5IFJlbGF0aXZlIGFkZHJlc3NpbmcgbW9kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo2MDMKLW1zZ2lkICJJbnZhbGlkIHNjYWxlZC1pbmRleGVkIG1vZGUsIHVzZSAoYix3LGQscSkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NjA4Ci1tc2dpZCAiU3ludGF4IGluIHNjYWxlZC1pbmRleGVkIG1vZGUsIHVzZSBbUm46bV0gd2hlcmUgbj1bMC4uN10gbT17Yix3LGQscX0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NjE0Ci1tc2dpZCAiU2NhbGVkLWluZGV4ZWQgYWRkcmVzc2luZyBtb2RlIGNvbWJpbmVkIHdpdGggc2NhbGVkLWluZGV4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjYyMwotbXNnaWQgIkludmFsaWQgb3IgaWxsZWdhbCBhZGRyZXNzaW5nIG1vZGUgY29tYmluZWQgd2l0aCBzY2FsZWQtaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NzMwCi1tc2dpZCAiUHJlbWF0dXJlIGVuZCBvZiBzdWZmaXggLS0gRGVmYXVsdGluZyB0byBkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjc0MwotbXNnaWQgIkJhZCBzdWZmaXggYWZ0ZXIgJzonIHVzZSB7Ynx3fGR9IERlZmF1bHRpbmcgdG8gZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo3ODQKLW1zZ2lkICJWZXJ5IHNob3J0IGluc3RyIHRvIG9wdGlvbiwgaWUgeW91IGNhbid0IGRvIGl0IG9uIGEgTlVMTHN0ciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo4MjgKLW1zZ2lkICJObyBzdWNoIGVudHJ5IGluIGxpc3QuIChjcHUvbW11IHJlZ2lzdGVyKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo4NjkKLW1zZ2lkICJJbnRlcm5hbCBjb25zaXN0ZW5jeSBlcnJvci4gIGNoZWNrIG5zMzJrLW9wY29kZS5oIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjg5MAotbXNnaWQgIkFkZHJlc3Mgb2YgaW1tZWRpYXRlIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6ODkxCi1tc2dpZCAiSW52YWxpZCBpbW1lZGlhdGUgd3JpdGUgb3BlcmFuZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTAxOAotbXNnaWQgIkJhZCBvcGNvZGUtdGFibGUtb3B0aW9uLCBjaGVjayBpbiBmaWxlIG5zMzJrLW9wY29kZS5oIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjEwNDcKLW1zZ2lkICJObyBzdWNoIG9wY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMTE1Ci1tc2dpZCAiQmFkIHN1ZmZpeCwgZGVmYXVsdGluZyB0byBkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjExMzcKLW1zZ2lkICJUb28gbWFueSBvcGVyYW5kcyBwYXNzZWQgdG8gaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIy4gY2hlY2sgZXJyb3IgaW4gZGVmYXVsdAotIzogY29uZmlnL3RjLW5zMzJrLmM6MTE0OAotbXNnaWQgIldyb25nIG51bWJlcnMgb2Ygb3BlcmFuZHMgaW4gZGVmYXVsdCwgY2hlY2sgbnMzMmstb3Bjb2Rlcy5oIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjExNTMKLW1zZ2lkICJXcm9uZyBudW1iZXIgb2Ygb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTI3MgotbXNnaWQgImlpZiBjb252ZXJ0IGludGVybmFsIHBjcmVsL2JpbmFyeSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMjg4Ci1tc2dpZCAiQmlnbnVtIHRvbyBiaWcgZm9yIGxvbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTM2MwotbXNnaWQgImlpZiBjb252ZXJ0IGludGVybmFsIHBjcmVsL3BvaW50ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTM2OAotbXNnaWQgIkludGVybmFsIGxvZ2ljIGVycm9yIGluIGlpZi5paWZQW25dLnR5cGUiCi1tc2dzdHIgIiIKLQotIy4gV2UgY2FudCByZWxheCB0aGlzIGNhc2UKLSM6IGNvbmZpZy90Yy1uczMyay5jOjE0MDIKLW1zZ2lkICJDYW4ndCByZWxheCBkaWZmZXJlbmNlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE0NTEKLW1zZ2lkICJEaXNwbGFjZW1lbnQgdG8gbGFyZ2UgZm9yIDpkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE0NjIKLW1zZ2lkICJJbnRlcm5hbCBsb2dpYyBlcnJvciBpbiBpaWYuaWlmUFtdLnR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTUxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbiBmb3Igc3RvcmFnZSB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE1MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCBkbyAlZCBieXRlIHJlbG9jYXRpb24gZm9yIHN0b3JhZ2UgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNTUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGhhc2ggJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE2MzYKLW1zZ2lkICJCeXRlIGRpc3BsYWNlbWVudCBvdXQgb2YgcmFuZ2UuICBsaW5lIG51bWJlciBub3QgdmFsaWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTY0NQotbXNnaWQgIldvcmQgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZS4gIGxpbmUgbnVtYmVyIG5vdCB2YWxpZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNjU5Ci1tc2dpZCAiRG91YmxlIHdvcmQgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNjc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGxvZ2ljIGVycm9yLiAgbGluZSAlcywgZmlsZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTcyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBsb2dpYyBlcnJvci4gbGluZSAlcywgZmlsZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTgzOAotbXNnaWQgIkJpdCBmaWVsZCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MjA4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdGVjdHVyZSBvcHRpb24gLW0lcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoyMTAzCi1tc2dpZCAiIgotIk5TMzJLIG9wdGlvbnM6XG4iCi0iLW0zMjAzMiB8IC1tMzI1MzJcdHNlbGVjdCB2YXJpYW50IG9mIE5TMzJLIGFyY2hpdGVjdHVyZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjIyODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IGZpbmQgcmVsb2NhdGlvbiB0eXBlIGZvciBzeW1ib2wgJXMsIGNvZGUgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjgzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHN3aXRjaCAtbSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo4NzEKLW1zZ2lkICIiCi0iUG93ZXJQQyBvcHRpb25zOlxuIgotIi11XHRcdFx0aWdub3JlZFxuIgotIi1tcHdyeCwgLW1wd3IyXHRcdGdlbmVyYXRlIGNvZGUgZm9yIElCTSBQT1dFUi8yIChSSU9TMilcbiIKLSItbXB3clx0XHRcdGdlbmVyYXRlIGNvZGUgZm9yIElCTSBQT1dFUiAoUklPUzEpXG4iCi0iLW02MDFcdFx0XHRnZW5lcmF0ZSBjb2RlIGZvciBNb3Rvcm9sYSBQb3dlclBDIDYwMVxuIgotIi1tcHBjLCAtbXBwYzMyLCAtbTQwMywgLW02MDMsIC1tNjA0XG4iCi0iXHRcdFx0Z2VuZXJhdGUgY29kZSBmb3IgTW90b3JvbGEgUG93ZXJQQyA2MDMvNjA0XG4iCi0iLW1wcGM2NCwgLW02MjBcdFx0Z2VuZXJhdGUgY29kZSBmb3IgTW90b3JvbGEgUG93ZXJQQyA2MjBcbiIKLSItbXBwYzY0YnJpZGdlXHRcdGdlbmVyYXRlIGNvZGUgZm9yIFBvd2VyUEMgNjQsIGluY2x1ZGluZyBicmlkZ2UgaW5zbnNcbiIKLSItbWNvbVx0XHRcdGdlbmVyYXRlIGNvZGUgUG93ZXIvUG93ZXJQQyBjb21tb24gaW5zdHJ1Y3Rpb25zXG4iCi0iLW1hbnlcdFx0XHRnZW5lcmF0ZSBjb2RlIGZvciBhbnkgYXJjaGl0ZWN0dXJlIChQV1IvUFdSWC9QUEMpXG4iCi0iLW1yZWduYW1lc1x0XHRBbGxvdyBzeW1ib2xpYyBuYW1lcyBmb3IgcmVnaXN0ZXJzXG4iCi0iLW1uby1yZWduYW1lc1x0XHREbyBub3QgYWxsb3cgc3ltYm9saWMgbmFtZXMgZm9yIHJlZ2lzdGVyc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo4ODYKLW1zZ2lkICIiCi0iLW1yZWxvY2F0YWJsZVx0XHRzdXBwb3J0IGZvciBHQ0MncyAtbXJlbG9jYXRibGUgb3B0aW9uXG4iCi0iLW1yZWxvY2F0YWJsZS1saWJcdHN1cHBvcnQgZm9yIEdDQydzIC1tcmVsb2NhdGJsZS1saWIgb3B0aW9uXG4iCi0iLW1lbWJcdFx0XHRzZXQgUFBDX0VNQiBiaXQgaW4gRUxGIGZsYWdzXG4iCi0iLW1saXR0bGUsIC1tbGl0dGxlLWVuZGlhblxuIgotIlx0XHRcdGdlbmVyYXRlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBtYWNoaW5lXG4iCi0iLW1iaWcsIC1tYmlnLWVuZGlhblx0Z2VuZXJhdGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIG1hY2hpbmVcbiIKLSItbXNvbGFyaXNcdFx0Z2VuZXJhdGUgY29kZSBmb3IgU29sYXJpc1xuIgotIi1tbm8tc29sYXJpc1x0XHRkbyBub3QgZ2VuZXJhdGUgY29kZSBmb3IgU29sYXJpc1xuIgotIi1WXHRcdFx0cHJpbnQgYXNzZW1ibGVyIHZlcnNpb24gbnVtYmVyXG4iCi0iLVF5LCAtUW5cdFx0aWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo5MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBkZWZhdWx0IGNwdSA9ICVzLCBvcyA9ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo5NDYKLW1zZ2lkICJOZWl0aGVyIFBvd2VyIG5vciBQb3dlclBDIG9wY29kZXMgd2VyZSBzZWxlY3RlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjk5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBhc3NlbWJsZXIgZXJyb3IgZm9yIGluc3RydWN0aW9uICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxMDEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGFzc2VtYmxlciBlcnJvciBmb3IgbWFjcm8gJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjEyMjMKLW1zZ2lkICJpZGVudGlmaWVyK2NvbnN0YW50QGdvdCBtZWFucyBpZGVudGlmaWVyQGdvdCtjb25zdGFudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTI3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyByZWxvY2F0aW9ucyBkbyBub3QgZml0IGluICVkIGJ5dGVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjEzNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGVuZ3RoIG9mIC5sY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjE0NTkKLW1zZ2lkICJSZWxvY2F0aW9uIGNhbm5vdCBiZSBkb25lIHdoZW4gdXNpbmcgLW1yZWxvY2F0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTU0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW50YXggZXJyb3I6IGludmFsaWQgdG9jIHNwZWNpZmllciBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxNTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN5bnRheCBlcnJvcjogZXhwZWN0ZWQgYF0nLCBmb3VuZCAgYCVjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTc4OAotbXNnaWQgIlt0b2N2XSBzeW1ib2wgaXMgbm90IGEgdG9jIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTc5OQotbXNnaWQgIlVuaW1wbGVtZW50ZWQgdG9jMzIgZXhwcmVzc2lvbiBtb2RpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTgwNAotbXNnaWQgIlVuaW1wbGVtZW50ZWQgdG9jNjQgZXhwcmVzc2lvbiBtb2RpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTgwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBbJWRdIGZyb20gcGFyc2VfdG9jX2VudHJ5IVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxOTYwCi0jLCBjLWZvcm1hdAotbXNnaWQgInN5bnRheCBlcnJvcjsgZm91bmQgYCVjJyBidXQgZXhwZWN0ZWQgYCVjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjA2OAotbXNnaWQgIndyb25nIG51bWJlciBvZiBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjEyNAotbXNnaWQgIkJhZCAuc2VjdGlvbiBkaXJlY3RpdmU6IHdhbnQgYSx3LHgsZSBpbiBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjIyNDIKLW1zZ2lkICJtaXNzaW5nIHNpemUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjIyNTEKLW1zZ2lkICJuZWdhdGl2ZSBzaXplIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyMjkyCi1tc2dpZCAibWlzc2luZyByZWFsIHN5bWJvbCBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyMzEzCi1tc2dpZCAiYXR0ZW1wdCB0byByZWRlZmluZSBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjI1NDQKLW1zZ2lkICJUaGUgWENPRkYgZmlsZSBmb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjI2NTIgY29uZmlnL3RjLXBwYy5jOjMxNjQgcmVhZC5jOjI5NTAKLW1zZ2lkICJtaXNzaW5nIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyNjcwCi1tc2dpZCAiaWxsZWdhbCAuc3RhYnggZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyNzAyCi1tc2dpZCAibWlzc2luZyBjbGFzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjcxMQotbXNnaWQgIm1pc3NpbmcgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6Mjc3MgotbXNnaWQgIm1pc3Npbmcgc3ltYm9sIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjI5NDQKLW1zZ2lkICJuZXN0ZWQgLmJzIGJsb2NrcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6Mjk3NwotbXNnaWQgIi5lcyB3aXRob3V0IHByZWNlZGluZyAuYnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjMxNTYKLW1zZ2lkICJub24tY29uc3RhbnQgYnl0ZSBjb3VudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MzIwMQotbXNnaWQgIi50YyBub3QgaW4gLnRvYyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzozMjIwCi1tc2dpZCAiLnRjIHdpdGggbm8gbGFiZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjMyOTUKLW1zZ2lkICJObyBwcmV2aW91cyBzZWN0aW9uIHRvIHJldHVybiB0by4gRGlyZWN0aXZlIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSMuIFNlY3Rpb24gQ29udGVudHMKLSMuIHVua25vd24KLSM6IGNvbmZpZy90Yy1wcGMuYzozNzE0Ci1tc2dpZCAiVW5zdXBwb3J0ZWQgc2VjdGlvbiBhdHRyaWJ1dGUgLS0gJ2EnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzozOTA0Ci1tc2dpZCAiYmFkIHN5bWJvbCBzdWZmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjM5OTUKLW1zZ2lkICJVbnJlY29nbml6ZWQgc3ltYm9sIHN1ZmZpeCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDA3NwotbXNnaWQgInR3byAuZnVuY3Rpb24gcHNldWRvLW9wcyB3aXRoIG5vIGludGVydmVuaW5nIC5lZiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDA4OQotbXNnaWQgIi5lZiB3aXRoIG5vIHByZWNlZGluZyAuZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQyMTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAid2FybmluZzogc3ltYm9sICVzIGhhcyBubyBjc2VjdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDUxMwotbXNnaWQgInN5bWJvbCBpbiAudG9jIGRvZXMgbm90IG1hdGNoIGFueSAudGMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQ4MTAKLW1zZ2lkICJ1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQ4NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGVtaXQgUEMgcmVsYXRpdmUgJXMgcmVsb2NhdGlvbiBhZ2FpbnN0ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0ODY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBlbWl0IFBDIHJlbGF0aXZlICVzIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQ5MzEKLW1zZ2lkICJtdXN0IGJyYW5jaCB0byBhbiBhZGRyZXNzIGEgbXVsdGlwbGUgb2YgNCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDkzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJAbG9jYWwgb3IgQHBsdCBicmFuY2ggZGVzdGluYXRpb24gaXMgdG9vIGZhciBhd2F5LCAlbGQgYnl0ZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQ5NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR2FzIGZhaWx1cmUsIHJlbG9jIHZhbHVlICVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6NTIxCi1tc2dpZCAiaWxsZWdhbCByZWdpc3RlciBhZnRlciBALSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzo1MzcKLW1zZ2lkICJtdXN0IGJlIEAocjAsLi4uKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzo1NTMKLW1zZ2lkICJzeW50YXggZXJyb3IgaW4gQChyMCwuLi4pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjU4NSBjb25maWcvdGMtc2guYzo1OTAKLW1zZ2lkICJzeW50YXggZXJyb3IgaW4gQChkaXNwLFtSbiwgZ2JyLCBwY10pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjU5NQotbXNnaWQgImV4cGVjdGluZyApIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjYwNAotbXNnaWQgImlsbGVnYWwgcmVnaXN0ZXIgYWZ0ZXIgQCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxMjI4Ci1tc2dpZCAiLnVzZXMgcHNldWRvLW9wIHNlZW4gd2hlbiBub3QgcmVsYXhpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTIzNAotbXNnaWQgImJhZCAudXNlcyBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTI4OQotbXNnaWQgIiIKLSJTSCBvcHRpb25zOlxuIgotIi1saXR0bGVcdFx0XHRnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIGNvZGVcbiIKLSItcmVsYXhcdFx0XHRhbHRlciBqdW1wIGluc3RydWN0aW9ucyBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzXG4iCi0iLXNtYWxsXHRcdFx0YWxpZ24gc2VjdGlvbnMgdG8gNCBieXRlIGJvdW5kYXJpZXMsIG5vdCAxNlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjEyOTkgY29uZmlnL3RjLXc2NS5jOjg4MwotbXNnaWQgImNhbGwgdG8gdGNfTm91dF9maXhfdG9fY2hhcnMgXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTM4NQotbXNnaWQgIi51c2VzIGRvZXMgbm90IHJlZmVyIHRvIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTQwNAotbXNnaWQgImNhbid0IGZpbmQgZml4dXAgcG9pbnRlZCB0byBieSAudXNlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNDI3Ci1tc2dpZCAiLnVzZXMgdGFyZ2V0IGRvZXMgbm90IHJlZmVyIHRvIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTUyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJhdCAweCVseCwgZGlzcGxhY2VtZW50IG92ZXJmbG93cyAxMi1iaXQgZmllbGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTUyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIGRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyAxMi1iaXQgZmllbGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTUzMQotIywgYy1mb3JtYXQKLW1zZ2lkICJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIHVuZGVmaW5lZCBzeW1ib2wgJXMgb3ZlcmZsb3dzIDEyLWJpdCBmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNjQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgb3ZlcmZsb3dzIDgtYml0IGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE2NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXQgMHglbHgsIGRpc3BsYWNlbWVudCB0byBkZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgOC1iaXQgZmllbGQgIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE2NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXQgMHglbHgsIGRpc3BsYWNlbWVudCB0byB1bmRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyA4LWJpdCBmaWVsZCAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTcwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJvdmVyZmxvdyBpbiBicmFuY2ggdG8gJXM7IGNvbnZlcnRlZCBpbnRvIGxvbmdlciBpbnN0cnVjdGlvbiBzZXF1ZW5jZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNzgyIGNvbmZpZy90Yy1zaC5jOjE4MTAgY29uZmlnL3RjLXNwYXJjLmM6MzQzNgotIzogY29uZmlnL3RjLXNwYXJjLmM6MzQ1NQotbXNnaWQgIm1pc2FsaWduZWQgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxOTg4IGNvbmZpZy90Yy1zaC5jOjE5OTUgY29uZmlnL3RjLXNoLmM6MjAwMgotIzogY29uZmlnL3RjLXNoLmM6MjAwOQotbXNnaWQgInBjcmVsIHRvbyBmYXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MjA3MwotbXNnaWQgIm1pc2FsaWduZWQgb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjIwODEKLW1zZ2lkICJvZmZzZXQgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI1NwotbXNnaWQgIkludmFsaWQgZGVmYXVsdCBhcmNoaXRlY3R1cmUsIGJyb2tlbiBhc3NlbWJsZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI2MSBjb25maWcvdGMtc3BhcmMuYzo0NDgKLW1zZ2lkICJCYWQgb3Bjb2RlIHRhYmxlLCBicm9rZW4gYXNzZW1ibGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo0MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhcmNoaXRlY3R1cmUgLXhhcmNoPSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjQ0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdGVjdHVyZSAtQSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjUwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJObyBjb21waWxlZCBpbiBzdXBwb3J0IGZvciAlZCBiaXQgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjU0NgotbXNnaWQgIlVucmVjb2duaXplZCBvcHRpb24gZm9sbG93aW5nIC1LIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjU3MAotbXNnaWQgIlNQQVJDIG9wdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTc4Ci1tc2dpZCAiIgotIlxuIgotIi14YXJjaD12OHBsdXMgfCAteGFyY2g9djhwbHVzYVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjU3OQotbXNnaWQgIiIKLSJcdFx0XHRzcGVjaWZ5IHZhcmlhbnQgb2YgU1BBUkMgYXJjaGl0ZWN0dXJlXG4iCi0iLWJ1bXBcdFx0XHR3YXJuIHdoZW4gYXNzZW1ibGVyIHN3aXRjaGVzIGFyY2hpdGVjdHVyZXNcbiIKLSItc3BhcmNcdFx0XHRpZ25vcmVkXG4iCi0iLS1lbmZvcmNlLWFsaWduZWQtZGF0YVx0Zm9yY2UgLmxvbmcsIGV0Yy4sIHRvIGJlIGFsaWduZWQgY29ycmVjdGx5XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTg1Ci1tc2dpZCAiLWtcdFx0XHRnZW5lcmF0ZSBQSUNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1ODkKLW1zZ2lkICIiCi0iLTMyXHRcdFx0Y3JlYXRlIDMyIGJpdCBvYmplY3QgZmlsZVxuIgotIi02NFx0XHRcdGNyZWF0ZSA2NCBiaXQgb2JqZWN0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHRcdFx0W2RlZmF1bHQgaXMgJWRdXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTk0Ci1tc2dpZCAiIgotIi1UU09cdFx0XHR1c2UgVG90YWwgU3RvcmUgT3JkZXJpbmdcbiIKLSItUFNPXHRcdFx0dXNlIFBhcnRpYWwgU3RvcmUgT3JkZXJpbmdcbiIKLSItUk1PXHRcdFx0dXNlIFJlbGF4ZWQgTWVtb3J5IE9yZGVyaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlx0XHRcdFtkZWZhdWx0IGlzICVzXVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjYwMAotbXNnaWQgIiIKLSItS1BJQ1x0XHRcdGdlbmVyYXRlIFBJQ1xuIgotIi1WXHRcdFx0cHJpbnQgYXNzZW1ibGVyIHZlcnNpb24gbnVtYmVyXG4iCi0iLXFcdFx0XHRpZ25vcmVkXG4iCi0iLVF5LCAtUW5cdFx0aWdub3JlZFxuIgotIi1zXHRcdFx0aWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjYwOAotbXNnaWQgIiIKLSItRUxcdFx0XHRnZW5lcmF0ZSBjb2RlIGZvciBhIGxpdHRsZSBlbmRpYW4gbWFjaGluZVxuIgotIi1FQlx0XHRcdGdlbmVyYXRlIGNvZGUgZm9yIGEgYmlnIGVuZGlhbiBtYWNoaW5lXG4iCi0iLS1saXR0bGUtZW5kaWFuLWRhdGFcdGdlbmVyYXRlIGNvZGUgZm9yIGEgbWFjaGluZSBoYXZpbmcgYmlnIGVuZGlhblxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9ucyBhbmQgbGl0dGxlIGVuZGlhbiBkYXRhLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo4NTYKLW1zZ2lkICJTdXBwb3J0IGZvciA2NC1iaXQgYXJpdGhtZXRpYyBub3QgY29tcGlsZWQgaW4uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjkxMQotbXNnaWQgIkZQIGJyYW5jaCBpbiBkZWxheSBzbG90IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjkyNwotbXNnaWQgIkZQIGJyYW5jaCBwcmVjZWRlZCBieSBGUCBpbnN0cnVjdGlvbjsgTk9QIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjk0NwotbXNnaWQgInNldDogdXNlZCB3aXRoIG5lZ2F0aXZlIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo5NDkKLW1zZ2lkICJzZXQ6IG51bWJlciBsYXJnZXIgdGhhbiA0Mjk0OTY3Mjk1IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEwMDAKLW1zZ2lkICJzZXR4OiB0ZW1wb3JhcnkgcmVnaXN0ZXIgc2FtZSBhcyBkZXN0aW5hdGlvbiByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMTQ1Ci1tc2dpZCAiZmFpbGVkIHNwZWNpYWwgY2FzZSBpbnNuIHNhbml0eSBjaGVjayIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMjM1Ci1tc2dpZCAiOiBpbnZhbGlkIG1lbWJhciBtYXNrIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTI0OQotbXNnaWQgIjogaW52YWxpZCBtZW1iYXIgbWFzayBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEyNTQKLW1zZ2lkICI6IGludmFsaWQgbWVtYmFyIG1hc2sgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEyNzIKLW1zZ2lkICI6IGludmFsaWQgcHJlZmV0Y2ggZnVuY3Rpb24gbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMjgwCi1tc2dpZCAiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTI4NQotbXNnaWQgIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTMxMyBjb25maWcvdGMtc3BhcmMuYzoxMzI1Ci1tc2dpZCAiOiB1bnJlY29nbml6YWJsZSBwcml2aWxlZ2VkIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEzNDkgY29uZmlnL3RjLXNwYXJjLmM6MTM2NgotbXNnaWQgIjogdW5yZWNvZ25pemFibGUgdjlhIGFuY2lsbGFyeSBzdGF0ZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMzU0Ci1tc2dpZCAiOiByZCBvbiB3cml0ZSBvbmx5IGFuY2lsbGFyeSBzdGF0ZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMzkwCi1tc2dpZCAiOiBhc3IgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAxNiBhbmQgMzEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTM5OAotbXNnaWQgIjogYXNyIG51bWJlciBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMzEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTQwOAotbXNnaWQgIjogZXhwZWN0aW5nICVhc3JOIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjE3OTkKLW1zZ2lkICI6IFRoZXJlIGFyZSBvbmx5IDY0IGYgcmVnaXN0ZXJzOyBbMC02M10iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTgwMSBjb25maWcvdGMtc3BhcmMuYzoxODEzCi1tc2dpZCAiOiBUaGVyZSBhcmUgb25seSAzMiBmIHJlZ2lzdGVyczsgWzAtMzFdIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjE5ODIKLW1zZ2lkICI6IFBDLXJlbGF0aXZlIG9wZXJhbmQgY2FuJ3QgYmUgYSBjb25zdGFudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMDE1Ci1tc2dpZCAiOiBpbnZhbGlkIEFTSSBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIwMjMKLW1zZ2lkICI6IGludmFsaWQgQVNJIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjAyOAotbXNnaWQgIjogaW52YWxpZCBBU0kgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIxMjUKLW1zZ2lkICJPUEYgaW1tZWRpYXRlIG9wZXJhbmQgb3V0IG9mIHJhbmdlICgwLTB4MWZmKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMTMwCi1tc2dpZCAibm9uLWltbWVkaWF0ZSBPUEYgb3BlcmFuZCwgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMTQ5Ci1tc2dpZCAiOiBpbnZhbGlkIGNwcmVnIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjE3OAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbGxlZ2FsIG9wZXJhbmRzJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjIwNwotIywgYy1mb3JtYXQKLW1zZ2lkICJhcmNoaXRlY3R1cmUgYnVtcGVkIGZyb20gXCIlc1wiIHRvIFwiJXNcIiBvbiBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjI0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJBcmNoaXRlY3R1cmUgbWlzbWF0Y2ggb24gXCIlc1wiLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMjQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAoUmVxdWlyZXMgJXM7IHJlcXVlc3RlZCBhcmNoaXRlY3R1cmUgaXMgJXMuKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyNzYwCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBvciB1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlOiAweCUwMngiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MzAzNwotbXNnaWQgImJhZCAucmVzZXJ2ZSBzZWdtZW50IC0tIGV4cGVjdGVkIEJTUyBzZWdtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjMwNTQKLW1zZ2lkICJtaXNzaW5nIGFsaWdubWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzozMDY1IGNvbmZpZy90Yy1zcGFyYy5jOjMyMTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYWxpZ25tZW50IHRvbyBsYXJnZTsgYXNzdW1pbmcgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MzA3MSBjb25maWcvdGMtc3BhcmMuYzozMjE2Ci1tc2dpZCAibmVnYXRpdmUgYWxpZ25tZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjMwODEgY29uZmlnL3RjLXNwYXJjLmM6MzIzOQotbXNnaWQgImFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjMxOTYKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBjb21tb24gbGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjM4NwotbXNnaWQgIlRoZSAtYSBvcHRpb24gZG9lc24ndCBleGlzdC4gKERlc3BpdGUgd2hhdCB0aGUgbWFuIHBhZ2Ugc2F5cyEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MzkxIGNvbmZpZy90Yy12YXguYzozMTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkRpc3BsYWNlbWVudCBsZW5ndGggJXMgaWdub3JlZCEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6Mzk1IGNvbmZpZy90Yy12YXguYzozMTMzCi1tc2dpZCAiU1lNQk9MIFRBQkxFIG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzozOTkgY29uZmlnL3RjLXZheC5jOjMxMzcKLW1zZ2lkICJUT0tFTiBUUkFDRSBub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6NDAzIGNvbmZpZy90Yy12YXguYzozMTQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkkgZG9uJ3QgbmVlZCBvciB1c2UgdGVtcC4gZmlsZSBcIiVzXCIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjQwNyBjb25maWcvdGMtdmF4LmM6MzE0OQotbXNnaWQgIkkgZG9uJ3QgdXNlIGFuIGludGVycGFzcyBmaWxlISAtViBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjQyMQotbXNnaWQgIiIKLSJUYWhvZSBvcHRpb25zOlxuIgotIi1hXHRcdFx0aWdub3JlZFxuIgotIi1kIExFTkdUSFx0XHRpZ25vcmVkXG4iCi0iLUpcdFx0XHRpZ25vcmVkXG4iCi0iLVNcdFx0XHRpZ25vcmVkXG4iCi0iLXQgRklMRVx0XHRcdGlnbm9yZWRcbiIKLSItVFx0XHRcdGlnbm9yZWRcbiIKLSItVlx0XHRcdGlnbm9yZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMDc1Ci1tc2dpZCAiQ2FzdGluZyBhIGJyYW5jaCBkaXNwbGFjZW1lbnQgaXMgYmFkIGZvcm0sIGFuZCBpcyBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMTMxCi1tc2dpZCAiQ291bGRuJ3QgcGFyc2UgdGhlIFtpbmRleF0gaW4gdGhpcyBvcGVyYW5kLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMTM3Ci1tc2dpZCAiQ291bGRuJ3QgZmluZCB0aGUgb3BlbmluZyAnWycgZm9yIHRoZSBpbmRleCBvZiB0aGlzIG9wZXJhbmQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjExNzcKLW1zZ2lkICJDb3VsZG4ndCBmaW5kIHRoZSBvcGVuaW5nICcoJyBmb3IgdGhlIGRlcmVmIG9mIHRoaXMgb3BlcmFuZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTE4NwotbXNnaWQgIk9wZXJhbmQgY2FuJ3QgYmUgYm90aCBwcmUtaW5jIGFuZCBwb3N0LWRlYy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTIxNwotbXNnaWQgIkkgcGFyc2VkIDIgcmVnaXN0ZXJzIGluIHRoaXMgb3BlcmFuZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTI2NwotbXNnaWQgIkNhbid0IHJlbG9jYXRlIGV4cHJlc3Npb24gZXJyb3IuIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgaXMgYW4gZXJyb3IuIFRhaG9lIGRvZXNuJ3QgYWxsb3cgYW55IGV4cHJlc3Npb25zCi0jLiBiaWdnZXIgdGhhdCBhIDMyIGJpdCBsb25nIHdvcmQuIEFueSBiaWdnZXIgaGFzIHRvIGJlIHJlZmVyZW5jZWQKLSMuIGJ5IGFkZHJlc3MuCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMjc0Ci1tc2dpZCAiRXhwcmVzc2lvbiBpcyB0b28gbGFyZ2UgZm9yIGEgMzIgYml0cy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTI3OQotbXNnaWQgIkp1bmsgYXQgZW5kIG9mIGV4cHJlc3Npb24uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzMTkKLW1zZ2lkICJTeW50YXggZXJyb3IgaW4gZGlyZWN0IHJlZ2lzdGVyIG1vZGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzMjEKLW1zZ2lkICJZb3UgY2FuJ3QgaW5kZXggYSByZWdpc3RlciBpbiBkaXJlY3QgcmVnaXN0ZXIgbW9kZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMyNAotbXNnaWQgIlNQIGNhbid0IGJlIHRoZSBzb3VyY2Ugb3BlcmFuZCB3aXRoIGRpcmVjdCByZWdpc3RlciBhZGRyZXNzaW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzI2Ci1tc2dpZCAiQ2FuJ3QgdGFrZSB0aGUgYWRkcmVzcyBvZiBhIHJlZ2lzdGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzI4Ci1tc2dpZCAiRGlyZWN0IFJlZ2lzdGVyIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzMzAKLW1zZ2lkICJGb3IgcXVhZCBhY2Nlc3MsIHRoZSByZWdpc3RlciBtdXN0IGJlIGV2ZW4gYW5kIDwgMTQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzMzIKLW1zZ2lkICJZb3UgY2FuJ3QgY2FzdCBhIGRpcmVjdCByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMzOAotbXNnaWQgIlVzaW5nIHJlZyAxNCBmb3IgcXVhZHdvcmRzIGNhbiB0cm9tcCB0aGUgRlAgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNTAKLW1zZ2lkICJTeW50YXggZXJyb3IgaW4gYXV0by1kZWMgbW9kZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM1MgotbXNnaWQgIllvdSBjYW4ndCBoYXZlIGFuIGluZGV4IGF1dG8gZGVjIG1vZGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNTQKLW1zZ2lkICJBdXRvIGRlYyBtb2RlIGNhbnQgYmUgdXNlZCBmb3IgcmVhZGluZy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM1NgotbXNnaWQgIkF1dG8gZGVjIG9ubHkgd29ya3Mgb2YgdGhlIFNQIHJlZ2lzdGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzU4Ci1tc2dpZCAiQXV0byBkZWMgY2FuJ3QgYmUgdXNlZCBpbiBhIGJyYW5jaC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM2MAotbXNnaWQgIkF1dG8gZGVjIHdvbid0IHdvcmsgd2l0aCBxdWFkd29yZHMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNjcKLW1zZ2lkICJTeW50YXggZXJyb3IgaW4gb25lIG9mIHRoZSBhdXRvLWluYyBtb2Rlcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM3MwotbXNnaWQgIkF1dG8gaW5jIGRlZmVycmVkIG9ubHkgd29ya3Mgb2YgdGhlIFNQIHJlZ2lzdGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzc1Ci1tc2dpZCAiWW91IGNhbid0IGhhdmUgYW4gaW5kZXggYXV0byBpbmMgZGVmZXJyZWQgbW9kZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM3NyBjb25maWcvdGMtdGFob2UuYzoxMzg4Ci1tc2dpZCAiQXV0byBpbmMgY2FuJ3QgYmUgdXNlZCBpbiBhIGJyYW5jaC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM4NAotbXNnaWQgIllvdSBjYW4ndCB3cml0ZSB0byBhbiBhdXRvIGluYyByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM4NgotbXNnaWQgIkF1dG8gaW5jIG9ubHkgd29ya3Mgb2YgdGhlIFNQIHJlZ2lzdGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzkwCi1tc2dpZCAiQXV0byBpbmMgd29uJ3Qgd29yayB3aXRoIHF1YWR3b3Jkcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM5MgotbXNnaWQgIllvdSBjYW4ndCBoYXZlIGFuIGluZGV4IGluIGF1dG8gaW5jIG1vZGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE0MDAKLW1zZ2lkICJZb3UgY2FuJ3QgaW5kZXggdGhlIHNwIHJlZ2lzdGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNDA2Ci1tc2dpZCAiU3ludGF4IGVycm9yIGluIHJlZ2lzdGVyIGRpc3BsYWNlZCBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNDI1Ci1tc2dpZCAiQW4gb2ZmZXN0IGlzIG5lZWRlZCBmb3IgdGhpcyBvcGVyYW5kLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNDM3Ci1tc2dpZCAiWW91IGNhbid0IGluZGV4IGEgcmVnaXN0ZXIgaW4gaW1tZWRpYXRlIG1vZGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE0MzkKLW1zZ2lkICJJbW1lZGlhdGUgYWNjZXNzIGNhbid0IGJlIHVzZWQgYXMgYW4gYWRkcmVzcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTU1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJDb21waWxlciBidWc6IE9ERCBudW1iZXIgb2YgYnl0ZXMgaW4gYXJnIHN0cnVjdHVyZSAlcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTU3NyBjb25maWcvdGMtdmF4LmM6MTg0NwotbXNnaWQgIk5vdCBlbm91Z2ggb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTU4NyBjb25maWcvdGMtdmF4LmM6MTg1NAotbXNnaWQgIlRvbyBtYW55IG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE2MzggY29uZmlnL3RjLXZheC5jOjM2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJJZ25vcmluZyBzdGF0ZW1lbnQgZHVlIHRvIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNzMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNvbXBsaWxlciBidWc6IEdvdCBhIGNhc2UgKCVkKSBJIHdhc24ndCBleHBlY3RpbmcuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE4MjcKLW1zZ2lkICJSZWFsIGJyYW5jaCBkaXNwbGFjZW1lbnRzIG11c3QgYmUgZXhwcmVzc2lvbnMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE4MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ29tcGxpZXIgZXJyb3I6IEkgZ290IGFuIHVua25vd24gc3ludGhldGljIGJyYW5jaCA6JWMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTk3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJCYXJmLCBiYWQgbW9kZSAleFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjkwCi1tc2dpZCAiUmVsYXhhdGlvbiBpcyBhIGx1eHVyeSB3ZSBjYW4ndCBhZmZvcmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6MTQxCi1tc2dpZCAiYmFkIGNhbGwgdG8gbWRfYXRvZiAoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzoyNDUKLW1zZ2lkICInOicgbm90IGZvbGxvd2VkIGJ5ICdtJyBvciAncyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6MjU5Ci1tc2dpZCAicGFyZW4gbmVzdGluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzoyNzQKLW1zZ2lkICJtaXNtYXRjaGVkIHBhcmVudGhlc2lzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjQ2NwotbXNnaWQgInVuaGFuZGxlZCBleHByZXNzaW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6NjgyCi1tc2dpZCAic3ltYm9sIHJlbG9jIHRoYXQgaXMgbm90IFBDIHJlbGF0aXZlIG9yIDMyIGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6NzA1Ci1tc2dpZCAidW5oYW5kbGVkIG9wZXJhbmQgbW9kaWZpZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6NzQ2Ci1tc2dpZCAidW5oYW5kbGVkIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6Nzk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgbW5lbW9uaWM6ICclcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6ODEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgb3BlcmFuZHM6ICclcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6ODkwCi1tc2dpZCAidW5oYW5kbGVkIHByZWRlZmluZWQgc3ltYm9sIGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6OTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlBDIG9mZnNldCAweCVseCBvdXRzaWRlIHJhbmdlIDB4JWx4LTB4JWx4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjEwMDEKLW1zZ2lkICJ1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlIGluIGZpeHVwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjEwMzgKLW1zZ2lkICJtZF9jb252ZXJ0X2ZyYWcoKSBub3QgaW1wbGVtZW50ZWQgeWV0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MjczCi0jLCBjLWZvcm1hdAotbXNnaWQgIi5DT01Nb24gbGVuZ3RoICglZC4pIDwgMCEgSWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMDAwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb3BlcmFuZCBzaGlmdDogJXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjEwMDEKLW1zZ2lkICJpbnRlcm5hbCBmYWlsdXJlIGluIHBhcnNlX3JlZ2lzdGVyX2xpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMDE5Ci1tc2dpZCAiY29uc3RhbnQgZXhwcmVzc2lvbiBvciByZWdpc3RlciBsaXN0IGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTAyNCBjb25maWcvdGMtdjg1MC5jOjEwMzcgY29uZmlnL3RjLXY4NTAuYzoxMDU2Ci1tc2dpZCAiaGlnaCBiaXRzIHNldCBpbiByZWdpc3RlciBsaXN0IGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMDk2IGNvbmZpZy90Yy12ODUwLmM6MTE2MAotbXNnaWQgImlsbGVnYWwgcmVnaXN0ZXIgaW5jbHVkZWQgaW4gbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExMDMKLW1zZ2lkICJzeXN0ZW0gcmVnaXN0ZXJzIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTEwOAotbXNnaWQgIlBTVyBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExMTUKLW1zZ2lkICJIaWdoIHZhbHVlIHN5c3RlbSByZWdpc3RlcnMgY2Fubm90IGJlIGluY2x1ZGVkIGluIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTM5Ci1tc2dpZCAic2Vjb25kIHJlZ2lzdGVyIHNob3VsZCBmb2xsb3cgZGFzaCBpbiByZWdpc3RlciBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTE4NwotbXNnaWQgIiBWODUwIG9wdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTg4Ci1tc2dpZCAiICAtbXdhcm4tc2lnbmVkLW92ZXJmbG93ICAgIFdhcm4gaWYgc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgb3ZlcmZsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExODkKLW1zZ2lkICIiCi0iICAtbXdhcm4tdW5zaWduZWQtb3ZlcmZsb3cgIFdhcm4gaWYgdW5zaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvd1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTE5MAotbXNnaWQgIiAgLW12ODUwICAgICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyB0YXJnZXRlZCBhdCB0aGUgdjg1MFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTE5MQotbXNnaWQgIiAgLW12ODUwZSAgICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyB0YXJnZXRlZCBhdCB0aGUgdjg1MGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExOTIKLW1zZ2lkICIgIC1tdjg1MGVhICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgdGFyZ2V0ZWQgYXQgdGhlIHY4NTBlYVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTE5MwotbXNnaWQgIiIKLSIgIC1tdjg1MGFueSAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgZ2VuZXJpYywgZGVzcGl0ZSBhbnkgcHJvY2Vzc29yICIKLSJzcGVjaWZpYyBpbnN0cnVjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjEyMDQgY29uZmlnL3RjLXY4NTAuYzoxMjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gY29tbWFuZCBsaW5lIG9wdGlvbjogLSVjJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjEzOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5hYmxlIHRvIGRldGVybWluZSBkZWZhdWx0IHRhcmdldCBwcm9jZXNzb3IgZnJvbSBzdHJpbmc6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTQ0MgotbXNnaWQgImN0b2ZmKCkgcmVsb2NhdGlvbiB1c2VkIG9uIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxNDU5Ci1tc2dpZCAic2Rhb2ZmKCkgcmVsb2NhdGlvbiB1c2VkIG9uIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxNDc2Ci1tc2dpZCAiemRhb2ZmKCkgcmVsb2NhdGlvbiB1c2VkIG9uIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxNDk0Ci1tc2dpZCAidGRhb2ZmKCkgcmVsb2NhdGlvbiB1c2VkIG9uIGFuIGluc3RydWN0aW9uIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxNzEyCi1tc2dpZCAiVGFyZ2V0IHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgaW5zdHJ1Y3Rpb24uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTgwMiBjb25maWcvdGMtdjg1MC5jOjE4MzIgY29uZmlnL3RjLXY4NTAuYzoyMDE4Ci1tc2dpZCAiaW1tZWRpYXRlIG9wZXJhbmQgaXMgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTgxNAotbXNnaWQgIkFBQVJHIC0+IHVuaGFuZGxlZCBjb25zdGFudCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE4NTgKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxODYzCi1tc2dpZCAicmVnaXN0ZXIgcjAgY2Fubm90IGJlIHVzZWQgaGVyZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE4NzUKLW1zZ2lkICJpbnZhbGlkIHN5c3RlbSByZWdpc3RlciBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTg4OAotbXNnaWQgImV4cGVjdGVkIEVQIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTkwNAotbXNnaWQgImludmFsaWQgY29uZGl0aW9uIGNvZGUgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE5MjUgY29uZmlnL3RjLXY4NTAuYzoxOTI5Ci1tc2dpZCAiY29uc3RhbnQgdG9vIGJpZyB0byBmaXQgaW50byBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE5ODEKLW1zZ2lkICJzeW50YXggZXJyb3I6IHZhbHVlIGlzIG1pc3NpbmcgYmVmb3JlIHRoZSByZWdpc3RlciBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTk4MwotbXNnaWQgInN5bnRheCBlcnJvcjogcmVnaXN0ZXIgbm90IGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTk5NwotbXNnaWQgInN5bnRheCBlcnJvcjogc3lzdGVtIHJlZ2lzdGVyIG5vdCBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjIwMDIKLW1zZ2lkICJzeW50YXggZXJyb3I6IGNvbmRpdGlvbiBjb2RlIG5vdCBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjIwMzgKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJWSVBfQkVHSU4gZXJyb3I6JXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjM4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJJZ25vcmluZyBzdGF0ZW1lbnQgYmVjYXVzZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjQzNAotbXNnaWQgIkNhbid0IHJlbG9jYXRlIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjUzNwotbXNnaWQgIkJpZ251bSBub3QgcGVybWl0dGVkIGluIHNob3J0IGxpdGVyYWwuIEltbWVkaWF0ZSBtb2RlIGFzc3VtZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzo1NDYKLW1zZ2lkICJDYW4ndCBkbyBmbG9udW0gc2hvcnQgbGl0ZXJhbDogaW1tZWRpYXRlIG1vZGUgdXNlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjU5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJBIGJpZ251bS9mbG9udW0gbWF5IG5vdCBiZSBhIGRpc3BsYWNlbWVudDogMHglbHggdXNlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6OTEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlNob3J0IGxpdGVyYWwgb3ZlcmZsb3coJWxkLiksIGltbWVkaWF0ZSBtb2RlIGFzc3VtZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzo5MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRm9yY2VkIHNob3J0IGxpdGVyYWwgdG8gaW1tZWRpYXRlIG1vZGUuIG5vd19zZWc9JXMgdG9fc2VnPSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzo5ODEKLW1zZ2lkICJMZW5ndGggc3BlY2lmaWNhdGlvbiBpZ25vcmVkLiBBZGRyZXNzIG1vZGUgOUYgdXNlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MTAzMAotbXNnaWQgIkludmFsaWQgb3BlcmFuZDogIGltbWVkaWF0ZSB2YWx1ZSB1c2VkIGFzIGJhc2UgYWRkcmVzcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjEwMzIKLW1zZ2lkICJJbnZhbGlkIG9wZXJhbmQ6ICBpbW1lZGlhdGUgdmFsdWUgdXNlZCBhcyBhZGRyZXNzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MTgyNgotbXNnaWQgIm9kZCBudW1iZXIgb2YgYnl0ZXMgaW4gb3BlcmFuZCBkZXNjcmlwdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MTg0MgotbXNnaWQgIkJhZCBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyMzk5Ci1tc2dpZCAibm8gJ1snIHRvIG1hdGNoICddJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjQxNwotbXNnaWQgImJhZCByZWdpc3RlciBpbiBbXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjQxOQotbXNnaWQgIltQQ10gaW5kZXggYmFubmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNDU0Ci1tc2dpZCAibm8gJygnIHRvIG1hdGNoICcpJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjU4OQotbXNnaWQgImludmFsaWQgYnJhbmNoIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MTgKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyBAIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjIwCi1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgIyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYyNAotbXNnaWQgImFkZHJlc3MgcHJvaGliaXRzIC0oKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYyNgotbXNnaWQgImFkZHJlc3MgcHJvaGliaXRzICgpKyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYyOQotbXNnaWQgImFkZHJlc3MgcHJvaGliaXRzICgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjMxCi1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgW10iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MzMKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYzNQotbXNnaWQgImFkZHJlc3MgcHJvaGliaXRzIGRpc3BsYWNlbWVudCBsZW5ndGggc3BlY2lmaWVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjY1Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kIG9mIFNeIyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjY4MgotbXNnaWQgIlNeIyBuZWVkcyBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjg5Ci1tc2dpZCAiU14jIG1heSBvbmx5IHJlYWQtYWNjZXNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzE0Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kIG9mIC0oKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjcyMAotbXNnaWQgIi0oUEMpIHVucHJlZGljdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3MjIKLW1zZ2lkICJbXWluZGV4IHNhbWUgYXMgLSgpcmVnaXN0ZXI6IHVucHJlZGljdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3NTgKLW1zZ2lkICJpbnZhbGlkIG9wZXJhbmQgb2YgKCkrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzY0Ci1tc2dpZCAiKFBDKSsgdW5wcmVkaWN0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mjc2NgotbXNnaWQgIltdaW5kZXggc2FtZSBhcyAoKStyZWdpc3RlcjogdW5wcmVkaWN0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mjc5MQotbXNnaWQgIiMgY29uZmxpY3RzIGxlbmd0aCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mjc5MwotbXNnaWQgIiMgYmFycyByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjgxNQotbXNnaWQgIndyaXRpbmcgb3IgbW9kaWZ5aW5nICMgaXMgdW5wcmVkaWN0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mjg0NQotbXNnaWQgImxlbmd0aCBub3QgbmVlZGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyODUyCi1tc2dpZCAiY2FuJ3QgW11pbmRleCBhIHJlZ2lzdGVyLCBiZWNhdXNlIGl0IGhhcyBubyBhZGRyZXNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyODU0Ci1tc2dpZCAiYSByZWdpc3RlciBoYXMgbm8gYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mjg2NQotbXNnaWQgIlBDIHBhcnQgb2Ygb3BlcmFuZCB1bnByZWRpY3RhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzozMTk0Ci1tc2dpZCAiIgotIlZBWCBvcHRpb25zOlxuIgotIi1kIExFTkdUSFx0XHRpZ25vcmVkXG4iCi0iLUpcdFx0XHRpZ25vcmVkXG4iCi0iLVNcdFx0XHRpZ25vcmVkXG4iCi0iLXQgRklMRVx0XHRcdGlnbm9yZWRcbiIKLSItVFx0XHRcdGlnbm9yZWRcbiIKLSItVlx0XHRcdGlnbm9yZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MzIwMwotbXNnaWQgIiIKLSJWTVMgb3B0aW9uczpcbiIKLSItK1x0XHRcdGhhc2ggZW5jb2RlIG5hbWVzIGxvbmdlciB0aGFuIDMxIGNoYXJhY3RlcnNcbiIKLSItMVx0XHRcdGBjb25zdCcgaGFuZGxpbmcgY29tcGF0aWJsZSB3aXRoIGdjYyAxLnhcbiIKLSItSFx0XHRcdHNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb25cbiIKLSItaCBOVU1cdFx0XHRkb24ndCBoYXNoIG1peGVkLWNhc2UgbmFtZXMsIGFuZCBhZGp1c3QgY2FzZTpcbiIKLSJcdFx0XHQwID0gdXBwZXIsIDIgPSBsb3dlciwgMyA9IHByZXNlcnZlIGNhc2VcbiIKLSItdlwiVkVSU0lPTlwiXHRcdGNvZGUgYmVpbmcgYXNzZW1ibGVkIHdhcyBwcm9kdWNlZCBieSBjb21waWxlciBcIlZFUlNJT05cIlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy13NjUuYzoxMzYKLW1zZ2lkICJuZWVkIG9uIG9yIG9mZi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXc2NS5jOjMyMSBjb25maWcvdGMtdzY1LmM6MzY0Ci1tc2dpZCAic3ludGF4IGVycm9yIGFmdGVyIDxleHAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjI5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciByciVkLCBvdXQgb2YgcmFuZ2UuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoyOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgcmglZCwgb3V0IG9mIHJhbmdlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MzA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIHJsJWQsIG91dCBvZiByYW5nZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjMxNQotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciBycSVkLCBvdXQgb2YgcmFuZ2UuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzozMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgciVkLCBvdXQgb2YgcmFuZ2UuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzozNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0ZWQgJWMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjM5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciBpcyB3cm9uZyBzaXplIGZvciBhIHdvcmQgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjQwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciBpcyB3cm9uZyBzaXplIGZvciBhZGRyZXNzICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzo2ODAKLW1zZ2lkICJNaXNzaW5nICkgaW4gcmEocmIpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzo5NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCAlczB4JXggb3V0IG9mIHJhbmdlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MTA4NgotbXNnaWQgImltbWVkaWF0ZSBtdXN0IGJlIDEgb3IgMiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MTA5MQotbXNnaWQgImltbWVkaWF0ZSAxIG9yIDIgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjExMTkKLW1zZ2lkICJjYW4ndCB1c2UgUjAgaGVyZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MTI3OAotbXNnaWQgIkNhbid0IGZpbmQgb3Bjb2RlIHRvIG1hdGNoIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoxMzkwCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXJjaGl0ZWN0dXJlIC16JXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjE0MDYKLW1zZ2lkICIiCi0iWjhLIG9wdGlvbnM6XG4iCi0iLXo4MDAxXHRcdFx0Z2VuZXJhdGUgc2VnbWVudGVkIGNvZGVcbiIKLSItejgwMDJcdFx0XHRnZW5lcmF0ZSB1bnNlZ21lbnRlZCBjb2RlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjE1NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgc3VidHJhY3Qgc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VjdGlvbnMgJXMgJXMiCi1tc2dzdHIgIiIKLQotIzogZGVwZW5kLmM6MTk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IG9wZW4gYCVzJyBmb3Igd3JpdGluZyIKLW1zZ3N0ciAiIgotCi0jOiBkZXBlbmQuYzoyMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgY2xvc2UgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE1NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3RyaW5nIHRvbyBiaWcgKCVsdSBieXRlcykiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNjAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkluc2VydGluZyBcIiVzXCIgaW50byBzdHJpbmcgaGFzaCB0YWJsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNjM0IGVjb2ZmLmM6MTgyNyBlY29mZi5jOjE4NTMgZWNvZmYuYzoxODg1IGVjb2ZmLmM6MjA0MQotIzogZWNvZmYuYzoyMTU1Ci1tc2dpZCAibm8gY3VycmVudCBmaWxlIHBvaW50ZXIiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNzIxCi1tc2dpZCAidG9vIG1hbnkgc3RfRW5kJ3MiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyMDY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkluc2VydGluZyBcIiVzXCIgaW50byB0YWcgaGFzaCB0YWJsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyMjMzCi1tc2dpZCAiZmFrZSAuZmlsZSBhZnRlciByZWFsIG9uZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjIzMjEKLW1zZ2lkICJGaWxlbmFtZSBnb2VzIG92ZXIgb25lIHBhZ2UgYm91bmRhcnkuIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjQ1NgotbXNnaWQgIi5iZWdpbiBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZmlsZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNDYzCi1tc2dpZCAiLmJlZ2luIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjQ5NQotbXNnaWQgIi5iZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5maWxlIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI1MDIKLW1zZ2lkICIuYmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI1MTUKLW1zZ2lkICIuYmVuZCBkaXJlY3RpdmUgbmFtZXMgdW5rbm93biBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNTU5Ci1tc2dpZCAiLmRlZiBwc2V1ZG8tb3AgdXNlZCBpbnNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNTYxCi1tc2dpZCAiRW1wdHkgc3ltYm9sIG5hbWUgaW4gLmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI1OTkKLW1zZ2lkICIuZGltIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNjE0Ci1tc2dpZCAiQmFkbHkgZm9ybWVkIC5kaW0gZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjYyNwotbXNnaWQgIlRvbyBtYW55IC5kaW0gZW50cmllcyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI2NDgKLW1zZ2lkICIuc2NsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNjc0Ci1tc2dpZCAiLnNpemUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI2ODkKLW1zZ2lkICJCYWRseSBmb3JtZWQgLnNpemUgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjcwMgotbXNnaWQgIlRvbyBtYW55IC5zaXplIGVudHJpZXMiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNzI1Ci1tc2dpZCAiLnR5cGUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRTogV2UgY291bGQgaGFuZGxlIHRoaXMgYnkgc2V0dGluZyB0aGUgY29udGludWVkIGJpdC4KLSMuIFRoZXJlIHdvdWxkIHN0aWxsIGJlIGEgbGltaXQ6IHRoZSAudHlwZSBhcmd1bWVudCBjYW4gbm90Ci0jLiBiZSBpbmZpbml0ZS4KLSM6IGVjb2ZmLmM6Mjc0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJUaGUgdHlwZSBvZiAlcyBpcyB0b28gY29tcGxleDsgaXQgd2lsbCBiZSBzaW1wbGlmaWVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6Mjc1NAotbXNnaWQgIlVucmVjb2duaXplZCAudHlwZSBhcmd1bWVudCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI3OTMKLW1zZ2lkICIudGFnIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyODIwCi1tc2dpZCAiLnZhbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjgyOAotbXNnaWQgIi52YWwgZXhwcmVzc2lvbiBpcyB0b28gY29wbWxleCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI4NTkKLW1zZ2lkICIuZW5kZWYgcHNldWRvLW9wIHVzZWQgYmVmb3JlIC5kZWY7IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyODg1Ci1tc2dpZCAiQmFkIENPRkYgZGVidWdnaW5nIGluZm8iCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyOTM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIHRhZyBzcGVjaWZpZWQgZm9yICVzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6Mjk2NgotbXNnaWQgIkJhZCBDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMwMzgKLW1zZ2lkICIuZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5maWxlIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMwNDUKLW1zZ2lkICIuZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzA2OAotbXNnaWQgIi5lbmQgZGlyZWN0aXZlIG5hbWVzIHVua25vd24gc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzA5NwotbXNnaWQgInNlY29uZCAuZW50IGRpcmVjdGl2ZSBmb3VuZCBiZWZvcmUgLmVuZCBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMTcyCi1tc2dpZCAiTm8gd2F5IHRvIGhhbmRsZSAuZmlsZSB3aXRoaW4gLmVudC8uZW5kIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMTk3Ci1tc2dpZCAiLmZtYXNrIG91dHNpZGUgb2YgLmVudCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMyNjYKLW1zZ2lkICIubWFzayBvdXRzaWRlIG9mIC5lbnQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMjk2Ci1tc2dpZCAiLmxvYyBiZWZvcmUgLmZpbGUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMzAzCi1tc2dpZCAiLmxvYyBvdXRzaWRlIG9mIC50ZXh0IgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzQyMgotIywgYy1mb3JtYXQKLW1zZ2lkICJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZGVmaW5lIHN5bWJvbCBgJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjM0MzUKLW1zZ2lkICJiYWQgLndlYWtleHQgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzUwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIuc3RhYiVjIGlzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozNTE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5zdGFiJWM6IGlnbm9yaW5nIG5vbi16ZXJvIG90aGVyIGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzU0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iTGluZSBudW1iZXIgKCVkKSBmb3IgLnN0YWIlYyBkaXJlY3RpdmUgY2Fubm90IGZpdCBpbiBpbmRleCBmaWVsZCAoMjAgYml0cykiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozNTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgLnN0YWIlYyBkaXJlY3RpdmUsIGJhZCBjaGFyYWN0ZXIiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzo0MDQ2IGVjb2ZmLmM6NDIzNSBlY29mZi5jOjQyNjAKLW1zZ2lkICIuYmVnaW4vLmJlbmQgaW4gZGlmZmVyZW50IHNlZ21lbnRzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6NDc2MQotbXNnaWQgIk1pc3NpbmcgLmVuZCBvciAuYmVuZCBhdCBlbmQgb2YgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjUyNTIKLW1zZ2lkICJHUCBwcm9sb2d1ZSBzaXplIGV4Y2VlZHMgZmllbGQgc2l6ZSwgdXNpbmcgMCBpbnN0ZWFkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoyNTAKLW1zZ2lkICIiCi0iYmFkIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50OiBleHBvbmVudCBvdmVyZmxvdywgcHJvYmFibHkgYXNzZW1ibGluZyBqdW5rIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoyNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50OiB1bmtub3duIGVycm9yIGNvZGU9JWQuIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzo0MzQKLW1zZ2lkICIiCi0iQSBiaWdudW0gd2l0aCB1bmRlcnNjb3JlcyBtYXkgbm90IGhhdmUgbW9yZSB0aGFuIDggaGV4IGRpZ2l0cyBpbiBhbnkgd29yZC4iCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjQ1NAotbXNnaWQgIkEgYmlnbnVtIHdpdGggdW5kZXJzY29yZXMgbXVzdCBoYXZlIGV4YWN0bHkgNCB3b3Jkcy4iCi1tc2dzdHIgIiIKLQotIy4gZWl0aGVyIG5vdCBzZWVuIG9yIG5vdCBkZWZpbmVkLgotIy4gQEAgU2hvdWxkIHByaW50IG91dCB0aGUgb3JpZ2luYWwgc3RyaW5nIGluc3RlYWQgb2YKLSMuIHRoZSBwYXJzZWQgbnVtYmVyLgotIzogZXhwci5jOjU4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWNrdy4gcmVmIHRvIHVua25vd24gbGFiZWwgXCIlZDpcIiwgMCBhc3N1bWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6NzA1Ci1tc2dpZCAiQ2hhcmFjdGVyIGNvbnN0YW50IHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6OTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4cHIuYyhvcGVyYW5kKTogYmFkIGF0b2ZfZ2VuZXJpYyByZXR1cm4gdmFsICVkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxMDAxCi1tc2dpZCAiTWlzc2luZyAnKScgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTAxMSByZWFkLmM6MzgyNAotbXNnaWQgIkVCQ0RJQyBjb25zdGFudHMgYXJlIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjEwNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5hcnkgb3BlcmF0b3IgJWMgaWdub3JlZCBiZWNhdXNlIGJhZCBvcGVyYW5kIGZvbGxvd3MiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjExMjIgZXhwci5jOjExNDcKLW1zZ2lkICJzeW50YXggZXJyb3IgaW4gLnN0YXJ0b2YuIG9yIC5zaXplb2YuIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxMjk2Ci1tc2dpZCAiQmFkIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjE2NDQKLW1zZ2lkICJtaXNzaW5nIG9wZXJhbmQ7IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTY3NwotbXNnaWQgIm9wZXJhdGlvbiBjb21iaW5lcyBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWdtZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTY5MwotbXNnaWQgImxlZnQgb3BlcmFuZCBpcyBhIGJpZ251bTsgaW50ZWdlciAwIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjE2OTUKLW1zZ2lkICJsZWZ0IG9wZXJhbmQgaXMgYSBmbG9hdDsgaW50ZWdlciAwIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjE3MDQKLW1zZ2lkICJyaWdodCBvcGVyYW5kIGlzIGEgYmlnbnVtOyBpbnRlZ2VyIDAgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTcwNgotbXNnaWQgInJpZ2h0IG9wZXJhbmQgaXMgYSBmbG9hdDsgaW50ZWdlciAwIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjE3NTQgc3ltYm9scy5jOjEwOTIKLW1zZ2lkICJkaXZpc2lvbiBieSB6ZXJvIgotbXNnc3RyICIiCi0KLSM6IGZyYWdzLmM6ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgZXh0ZW5kIGZyYWcgJWQuIGNoYXJzIgotbXNnc3RyICIiCi0KLSM6IGZyYWdzLmM6MTcwCi1tc2dpZCAiYXR0ZW1wdCB0byBhbGxvY2F0ZSBkYXRhIGluIGFic29sdXRlIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZnJhZ3MuYzoxNzYKLW1zZ2lkICJhdHRlbXB0IHRvIGFsbG9jYXRlIGRhdGEgaW4gY29tbW9uIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjQ4NAotbXNnaWQgInJlZGVmaW5pdGlvbiBub3QgYWxsb3dlZFxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzo1NTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGhlICVjIG9wZXJhdG9yIGNhbm5vdCB0YWtlIG5vbi1hYnNvbHV0ZSBhcmd1bWVudHMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjYzNQotbXNnaWQgInN0cmluZyB3aGVyZSBleHByZXNzaW9uIGV4cGVjdGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzo2NDEKLW1zZ2lkICJjYW4ndCBmaW5kIHByaW1hcnkgaW4gZXhwcmVzc2lvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6NjgxCi1tc2dpZCAibWlzcGxhY2VkIGNsb3NpbmcgcGFyZW5zLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzo3MTgKLW1zZ2lkICJhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzo3NTAKLW1zZ2lkICJjYW4ndCBhZGQgdHdvIHJlbG9jYXRhYmxlIGV4cHJlc3Npb25zXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjk1NQotbXNnaWQgInVucmVhc29uYWJsZSBuZXN0aW5nLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxMDMzCi1tc2dpZCAiRW5kIG9mIGZpbGUgbm90IGF0IHN0YXJ0IG9mIGxpbmUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjExNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWxsZWdhbCBiYXNlIGNoYXJhY3RlciAlYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTI2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJyYWRpeCBpcyAlYyBtdXN0IGJlIG9uZSBvZiBiLCBxLCBkIG9yIGgiCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjEzMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic2l6ZSBtdXN0IGJlIG9uZSBvZiBiLCB3IG9yIGwsIGlzICVjLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNDEzCi1tc2dpZCAiZGF0YWIgcmVwZWF0IG11c3QgYmUgY29uc3RhbnQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE0MTUKLW1zZ2lkICJkYXRhYiBkYXRhIG11c3QgYmUgYWJzb2x1dGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE0MjkKLW1zZ2lkICJhbGlnbiBuZWVkcyBhYnNvbHV0ZSBleHByZXNzaW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNDM2Ci1tc2dpZCAiLmFsaWduIG5lZWRzIGFic29sdXRlIGZpbGwgdmFsdWUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE0NDQKLW1zZ2lkICJhbGlnbm1lbnQgbXVzdCBiZSBvbmUgb2YgMSwgMiBvciA0LlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNDY5Ci1tc2dpZCAicmVzIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24gZm9yIGZpbGwgY291bnQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE1NDkKLW1zZ2lkICJmb3JtIExJTj0gbmVlZHMgYWJzb2x1dGUgZXhwcmVzc3Npb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE1NTIKLW1zZ2lkICJDT0w9IgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNTU1Ci1tc2dpZCAiZm9ybSBDT0w9IG5lZWRzIGFic29sdXRlIGV4cHJlc3NzaW9uLlxuIgotbXNnc3RyICIiCi0KLSMuIFR1cm5zIHRoZSBuZXh0IGV4cHJlc3Npb24gaW50byBhIHN0cmluZwotIzogZ2FzcC5jOjE1OTcgbWFjcm8uYzo0MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJSBvcGVyYXRvciBuZWVkcyBhYnNvbHV0ZSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNjU5Ci1tc2dpZCAibWlzcGxhY2VkICggLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNjc0Ci1tc2dpZCAibWlzcGxhY2VkICkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE3MjgKLW1zZ2lkICIuaW5zdHIgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc29uLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNzY2Ci1tc2dpZCAibmVlZCBhYnNvbHV0ZSBwb3NpdGlvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTc2OAotbXNnaWQgIm5lZWQgYWJzb2x1dGUgbGVuZ3RoLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMDE3Ci1tc2dpZCAiRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjA0NwotbXNnaWQgIi5BU1NJR05BIG5lZWRzIGNvbnN0YW50IGV4cHJlc3Npb24gYXJndW1lbnQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIwNTEKLW1zZ2lkICIuQVNTSUdOQSB3aXRob3V0IGxhYmVsLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMDc2Ci1tc2dpZCAiLkFTU0lHTlMgd2l0aG91dCBsYWJlbC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjE0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBmaW5kIHByZXByb2Nlc3NvciB2YXJpYWJsZSAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjIwOAotbXNnaWQgIkNvbXBhcmlzb24gb3BlcmF0b3IgbXVzdCBiZSBvbmUgb2YgRVEsIE5FLCBMVCwgTEUsIEdUIG9yIEdFLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMjQyCi1tc2dpZCAiQ29tcGFyaXNvbiBvcGVyYXRvciBmb3Igc3RyaW5ncyBtdXN0IGJlIEVRIG9yIE5FXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIyNTQgZ2FzcC5jOjIyNjQgZ2FzcC5jOjIzNjYKLW1zZ2lkICJDb25kaXRpb25hbCBvcGVyYXRvciBtdXN0IGhhdmUgYWJzb2x1dGUgb3BlcmFuZHMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIyNTkKLW1zZ2lkICJTdHJpbmcgY29tcGFyZWQgYWdhaW5zdCBleHByZXNzaW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMzA5Ci1tc2dpZCAiQUlGIG5lc3RpbmcgdW5yZWFzb25hYmxlLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMzI0Ci1tc2dpZCAiTXVsdGlwbGUgQUVMU0VzIGluIEFJRi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjM0MAotbXNnaWQgIkFFTkRJIHdpdGhvdXQgQUlGLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMzYzIGdhc3AuYzoyNDQ1Ci1tc2dpZCAiSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI0NTUKLW1zZ2lkICJCYWQgZm9ybWF0IGZvciBJRiBvciBJRk5DLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNDc1Ci1tc2dpZCAiQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI0NzcKLW1zZ2lkICJFTkRSIHdpdGhvdXQgYSBSRVBULlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkFXSElMRSB3aXRob3V0IGEgQUVORFcgYXQgJWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI1MzgKLW1zZ2lkICJBRU5EVyB3aXRob3V0IGEgQUVORFcuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI1ODMKLW1zZ2lkICJBUkVQRUFUIG11c3QgaGF2ZSBhYnNvbHV0ZSBvcGVyYW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNTg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFSRVBFQVQgd2l0aG91dCBhIEFFTkRSIGF0ICVkLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNjMxCi1tc2dpZCAiLkVORE0gd2l0aG91dCBhIG1hdGNoaW5nIC5NQUNSTy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjY2NQotbXNnaWQgIkxPQ0FMIG91dHNpZGUgb2YgTUFDUk8iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI2NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibWFjcm8gYXQgbGluZSAlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjcwMQotbXNnaWQgIm1hY3JvIGV4cGFuc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mjc1MwotbXNnaWQgIkNoYXJhY3RlciBjb2RlIGluIHN0cmluZyBtdXN0IGJlIGFic29sdXRlIGV4cHJlc3Npb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI3NTgKLW1zZ2lkICJNaXNzaW5nID4gZm9yIGNoYXJhY3RlciBjb2RlLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyODE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0cmluZyBmb3IgU0RBVEFDIGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzICglZCkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI4NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWxsZWdhbCBjaGFyYWN0ZXIgaW4gU0RBVEEgbGluZSAoMHgleCkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI4NjYKLW1zZ2lkICJNdXN0IGhhdmUgYWJzb2x1dGUgU0RBVEFCIHJlcGVhdCBjb3VudC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mjg2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJNdXN0IGhhdmUgcG9zaXRpdmUgU0RBVEFCIHJlcGVhdCBjb3VudCAoJWQpLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyODk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVhc29uYWJsZSBpbmNsdWRlIGRlcHRoICglbGQpLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyOTUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IG9wZW4gaW5jbHVkZSBmaWxlIGAlcycuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjMwMjUKLW1zZ2lkICJVbnJlYXNvbmFibGUgZXhwYW5zaW9uICgtdSB0dXJucyBvZmYgY2hlY2spLlxuIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgb25lIGNhdXNlcyBsb3RzIG9mIHBhaW4gd2hlbiB0cnlpbmcgdG8gcHJlcHJvY2VzcwotIy4gb3JkaW5hcnkgY29kZQotIzogZ2FzcC5jOjMyNDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pc2VkIHBzZXVkbyBvcCBgJXMnLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozMzEzCi1tc2dpZCAiT1JHIGNvbW1hbmQgbm90IGFsbG93ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM1MzAKLW1zZ2lkICJJbnZhbGlkIGV4cHJlc3Npb24gb24gY29tbWFuZCBsaW5lLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgXG4iCi0iICBbLWFdICAgICAgWy0tYWx0ZXJuYXRlXSAgICAgICAgIGVudGVyIGFsdGVybmF0ZSBtYWNybyBtb2RlXG4iCi0iICBbLWMgY2hhcl0gWy0tY29tbWVudGNoYXIgY2hhcl0gIGNoYW5nZSB0aGUgY29tbWVudCBjaGFyYWN0ZXIgZnJvbSAhXG4iCi0iICBbLWRdICAgICAgWy0tZGVidWddICAgICAgICAgICAgIHByaW50IHNvbWUgZGVidWdnaW5nIGluZm9cbiIKLSIgIFstaF0gICAgICBbLS1oZWxwXSAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlXG4iCi0iICBbLU1dICAgICAgWy0tbXJpXSAgICAgICAgICAgICAgIGVudGVyIE1SSSBjb21wYXRpYmlsaXR5IG1vZGVcbiIKLSIgIFstbyBvdXRdICBbLS1vdXRwdXQgb3V0XSAgICAgICAgc2V0IHRoZSBvdXRwdXQgZmlsZVxuIgotIiAgWy1wXSAgICAgIFstLXByaW50XSAgICAgICAgICAgICBwcmludCBsaW5lIG51bWJlcnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzU4MAotbXNnaWQgIiIKLSIgIFstc10gICAgICBbLS1jb3B5c291cmNlXSAgICAgICAgY29weSBzb3VyY2UgdGhyb3VnaCBhcyBjb21tZW50cyBcbiIKLSIgIFstdV0gICAgICBbLS11bnJlYXNvbmFibGVdICAgICAgYWxsb3cgdW5yZWFzb25hYmxlIG5lc3RpbmdcbiIKLSIgIFstdl0gICAgICBbLS12ZXJzaW9uXSAgICAgICAgICAgcHJpbnQgdGhlIHByb2dyYW0gdmVyc2lvblxuIgotIiAgWy1EbmFtZT12YWx1ZV0gICAgICAgICAgICAgICAgICBjcmVhdGUgcHJlcHJvY2Vzc29yIHZhcmlhYmxlIGNhbGxlZCBuYW1lLCAiCi0id2l0aCB2YWx1ZVxuIgotIiAgWy1JcGF0aF0gICAgICAgICAgICAgICAgICAgICAgICBhZGQgdG8gaW5jbHVkZSBwYXRoIGxpc3RcbiIKLSIgIFtpbi1maWxlXVxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNTk2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBHbnUgQXNzZW1ibGVyIE1hY3JvIFByZXByb2Nlc3NvclxuIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4KLSM6IGdhc3AuYzozNjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkdOVSBhc3NlbWJsZXIgcHJlLXByb2Nlc3NvciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNjgxCi1tc2dpZCAiQ29weXJpZ2h0IDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM3MDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IG9wZW4gb3V0cHV0IGZpbGUgYCVzJy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzcyNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3Qgb3BlbiBpbnB1dCBmaWxlIGAlcycuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM3NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWQiCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM3NDgKLW1zZ2lkICIiCi0iXG4iCi0iUGxlYXNlIHJlcG9ydCB0aGlzIGJ1Zy5cbiIKLW1zZ3N0ciAiIgotCi0jLiBEZXRlY3QgaWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiBieSBleGFtaW5pbmcgdGhlIGZpbGUKLSMuIG5hbWUgcmV0dXJuZWQgYnkgYXNfd2hlcmUoKS4KLSMuCi0jLiBbRklYTUU6IFdlIHJlbHkgdXBvbiB0aGUgbmFtZSBpbiB0aGUgc3RyY21wIGJlbG93IGJlaW5nIHRoZQotIy4gc2FtZSBhcyB0aGUgb25lIHVzZWQgYnkgaW5wdXRfc2NydWJfbmV3X2ZpbGUoKSwgaWYgdGhhdCBpcwotIy4gbm90IHRydWUsIHRoZW4gdGhpcyBjb2RlIHdpbGwgZmFpbF0uCi0jLgotIy4gSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiwgdGhlbiB3ZSBuZWVkIHRvIHNhdmUgZWFjaCBpbnB1dCBsaW5lCi0jLiBoZXJlIChhc3N1bWluZyBvZiBjb3Vyc2UgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIGEgbGluZSBvZiBpbnB1dCB0byByZWFkKSwKLSMuIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdGluZyB0aGF0IGlzIHByb2R1Y2VkIGF0IHRoZSBlbmQKLSMuIG9mIHRoZSBhc3NlbWJseS4KLSM6IGlucHV0LWZpbGUuYzoxNTAgaW5wdXQtc2NydWIuYzoyMzMgbGlzdGluZy5jOjM1MwotbXNnaWQgIntzdGFuZGFyZCBpbnB1dH0iCi1tc2dzdHIgIiIKLQotIzogaW5wdXQtZmlsZS5jOjE1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuICVzIGZvciByZWFkaW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBpbnB1dC1maWxlLmM6MjA1IGlucHV0LWZpbGUuYzoyMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgcmVhZCBmcm9tICVzIgotbXNnc3RyICIiCi0KLSM6IGlucHV0LWZpbGUuYzoyNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgY2xvc2UgJXMiCi1tc2dzdHIgIiIKLQotIzogaW5wdXQtc2NydWIuYzoyNjMKLW1zZ2lkICJtYWNyb3MgbmVzdGVkIHRvbyBkZWVwbHkiCi1tc2dzdHIgIiIKLQotIzogaW5wdXQtc2NydWIuYzozNDkKLW1zZ2lkICJwYXJ0aWFsIGxpbmUgYXQgZW5kIG9mIGZpbGUgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBpbnB1dC1zY3J1Yi5jOjM3MQotbXNnaWQgIlBhcnRpYWwgbGluZSBhdCBlbmQgb2YgZmlsZSBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGl0Ymwtb3BzLmM6MzU5Ci1tc2dpZCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IGluc3RydWN0aW9uc1xuIgotbXNnc3RyICIiCi0KLSM6IGxpc3RpbmcuYzoyNTIKLW1zZ2lkICJXYXJuaW5nOiIKLW1zZ3N0ciAiIgotCi0jOiBsaXN0aW5nLmM6MjU5Ci1tc2dpZCAiRXJyb3I6IgotbXNnc3RyICIiCi0KLSM6IGxpc3RpbmcuYzoxMTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IG9wZW4gbGlzdCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBsaXN0aW5nLmM6MTE2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciBjbG9zaW5nIGxpc3QgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogbGlzdGluZy5jOjEyNDUKLW1zZ2lkICJzdHJhbmdlIHBhcGVyIGhlaWdodCwgc2V0IHRvIG5vIGZvcm0iCi1tc2dzdHIgIiIKLQotIzogbGlzdGluZy5jOjEzMTEKLW1zZ2lkICJOZXcgbGluZSBpbiB0aXRsZSIKLW1zZ3N0ciAiIgotCi0jOiBtYWNyby5jOjU2MwotbXNnaWQgInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gbWFjcm8gZGVmaW5pdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBtYWNyby5jOjU3MgotbXNnaWQgIm1pc3NpbmcgKSBhZnRlciBmb3JtYWxzIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6NzI5Ci1tc2dpZCAibWlzc3BsYWNlZCApIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6OTkxCi1tc2dpZCAiY29uZnVzaW9uIGluIGZvcm1hbCBwYXJhbWV0ZXJzIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6OTk2Ci1tc2dpZCAibWFjcm8gZm9ybWFsIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0IgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6MTAxMQotbXNnaWQgImNhbid0IG1peCBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBtYWNyby5jOjEwMTkKLW1zZ2lkICJ0b28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBtYWNyby5jOjExOTQKLW1zZ2lkICJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGlycCBvciBpcnBjIgotbXNnc3RyICIiCi0KLSM6IG1hY3JvLmM6MTIwMgotbXNnaWQgIm1pc3NpbmcgbW9kZWwgcGFyYW1ldGVyIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6MTA1Ci1tc2dpZCAiQXNzZW1ibGVyIG1lc3NhZ2VzOlxuIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6MjIyCi1tc2dpZCAiV2FybmluZzogIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6MzMxCi1tc2dpZCAiRXJyb3I6ICIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjQzNSBtZXNzYWdlcy5jOjQ1MgotbXNnaWQgIkZhdGFsIGVycm9yOiAiCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzo0NzEKLW1zZ2lkICJJbnRlcm5hbCBlcnJvciFcbiIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjQ3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJBc3NlcnRpb24gZmFpbHVyZSBpbiAlcyBhdCAlcyBsaW5lICVkLlxuIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6NDc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFzc2VydGlvbiBmYWlsdXJlIGF0ICVzIGxpbmUgJWQuXG4iCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzo0NzcgbWVzc2FnZXMuYzo0OTUKLW1zZ2lkICJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6NDkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkIGluICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzo0OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBvdXRwdXQtZmlsZS5jOjQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IG9wZW4gYSBiZmQgb24gc3Rkb3V0ICVzICIKLW1zZ3N0ciAiIgotCi0jOiBvdXRwdXQtZmlsZS5jOjcyIG91dHB1dC1maWxlLmM6NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRkFUQUw6IENhbid0IGNsb3NlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogb3V0cHV0LWZpbGUuYzoxMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRkFUQUw6IENhbid0IGNsb3NlICVzIgotbXNnc3RyICIiCi0KLSM6IG91dHB1dC1maWxlLmM6MTQ4Ci1tc2dpZCAiRmFpbGVkIHRvIGVtaXQgYW4gb2JqZWN0IGJ5dGUiCi1tc2dzdHIgIiIKLQotIzogb3V0cHV0LWZpbGUuYzoxNDkKLW1zZ2lkICJDYW4ndCBjb250aW51ZSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIGNvbnN0cnVjdGluZyAlcyBwc2V1ZG8tb3AgdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo4MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBwc2V1ZG8tb3A6ICBgJXMnIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo5MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGFiZWwgXCIlZCRcIiByZWRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjExNDUKLW1zZ2lkICIuYWJvcnQgZGV0ZWN0ZWQuICBBYmFuZG9uaW5nIHNoaXAuIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxMjUwIHJlYWQuYzoyMDMxCi1tc2dpZCAiQWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjEyNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQWxpZ25tZW50IHRvbyBsYXJnZTogJXUgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTI5MAotbXNnaWQgImV4cGVjdGVkIGZpbGwgcGF0dGVybiBtaXNzaW5nIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxNDg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnIgotbXNnc3RyICIiCi0KLSMuIFNvbWUgb2YgdGhlIGJhY2sgZW5kcyBjYW4ndCBkZWFsIHdpdGggbm9uLXBvc2l0aXZlIGxpbmUgbnVtYmVycy4KLSMuIEJlc2lkZXMsIGl0J3Mgc2lsbHkuCi0jOiByZWFkLmM6MTYxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJMaW5lIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZTsgbGluZSBudW1iZXIgJWQgcmVqZWN0ZWQuIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxNjM4Ci1tc2dpZCAic3RhcnQgYWRkcmVzcyBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxNjQ4Ci1tc2dpZCAiLmVyciBlbmNvdW50ZXJlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTY2NyByZWFkLmM6MTY2OQotIywgYy1mb3JtYXQKLW1zZ2lkICIuZmFpbCAlbGQgZW5jb3VudGVyZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE3MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLmZpbGwgc2l6ZSBjbGFtcGVkIHRvICVkLiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTcxMQotbXNnaWQgIlNpemUgbmVnYXRpdmU6IC5maWxsIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxNzE3Ci1tc2dpZCAiUmVwZWF0IDwgMCwgLmZpbGwgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTg3MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgLmxpbmtvbmNlIHR5cGUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTg4NiByZWFkLmM6MTkxMgotbXNnaWQgIi5saW5rb25jZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTkwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJiZmRfc2V0X3NlY3Rpb25fZmxhZ3M6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxOTc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiLnNic3NcIjogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjIwMDkKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBzaXplIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyMDE3Ci1tc2dpZCAiTWlzc2luZyBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjIxNTQKLW1zZ2lkICJiYWQgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjI4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJhdHRlbXB0IHRvIHJlZGVmaW5lIHBzZXVkby1vcCBgJXMnIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjIzNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzZWdtZW50IFwiJXNcIjsgc2VnbWVudCBcIiVzXCIgYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjM1OQotbXNnaWQgImlnbm9yaW5nIGZpbGwgdmFsdWUgaW4gYWJzb2x1dGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjM2MgotbXNnaWQgIm9ubHkgY29uc3RhbnQgb2Zmc2V0cyBzdXBwb3J0ZWQgaW4gYWJzb2x1dGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjM5NAotbXNnaWQgIk1SSSBzdHlsZSBPUkcgcHNldWRvLW9wIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI0ODIKLW1zZ2lkICJ1bnJlY29nbml6ZWQgc2VjdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyNTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjU2NAotbXNnaWQgImFic29sdXRlIHNlY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyNTc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBzZWN0aW9uIGNvbW1hbmQgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjY1NAotbXNnaWQgInJlcHQgd2l0aG91dCBlbmRyIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyODQxCi1tc2dpZCAiVW5zdXBwb3J0ZWQgdmFyaWFibGUgc2l6ZSBvciBmaWxsIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyODY2Ci1tc2dpZCAiLnNwYWNlIHJlcGVhdCBjb3VudCBpcyB6ZXJvLCBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyODY4Ci1tc2dpZCAiLnNwYWNlIHJlcGVhdCBjb3VudCBpcyBuZWdhdGl2ZSwgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mjg5NwotbXNnaWQgInNwYWNlIGFsbG9jYXRpb24gdG9vIGNvbXBsZXggaW4gYWJzb2x1dGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjkwMgotbXNnaWQgInNwYWNlIGFsbG9jYXRpb24gdG9vIGNvbXBsZXggaW4gY29tbW9uIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI5ODkgcmVhZC5jOjQwNzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmFkIGZsb2F0aW5nIGxpdGVyYWw6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozMDY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc3Qgb2YgbGluZSBpZ25vcmVkLiBGaXJzdCBpZ25vcmVkIGNoYXJhY3RlciBpcyBgJWMnLiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzA2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJSZXN0IG9mIGxpbmUgaWdub3JlZC4gRmlyc3QgaWdub3JlZCBjaGFyYWN0ZXIgdmFsdWVkIDB4JXguIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozMTE5Ci1tc2dpZCAiaWxsZWdhbCBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjMxMjEKLW1zZ2lkICJtaXNzaW5nIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzI4OAotbXNnaWQgInJ2YSB3aXRob3V0IHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzQxMwotbXNnaWQgImF0dGVtcHQgdG8gc3RvcmUgdmFsdWUgaW4gYWJzb2x1dGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzQ1MSByZWFkLmM6NDM0NwotbXNnaWQgInplcm8gYXNzdW1lZCBmb3IgbWlzc2luZyBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNDYzIHJlYWQuYzo0MzU5Ci1tc2dpZCAicmVnaXN0ZXIgdmFsdWUgdXNlZCBhcyBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSMuIExlYWRpbmcgYml0cyBjb250YWluIGJvdGggMHMgJiAxcy4KLSM6IHJlYWQuYzozNTUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlZhbHVlIDB4JWx4IHRydW5jYXRlZCB0byAweCVseC4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM1NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmlnbnVtIHRydW5jYXRlZCB0byAlZCBieXRlcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzY0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBCRkQgcmVsb2NhdGlvbiBzaXplICV1IgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNzM1Ci1tc2dpZCAidXNpbmcgYSBiaXQgZmllbGQgd2lkdGggb2YgemVybyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mzc0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJmaWVsZCB3aWR0aCBcIiVzXCIgdG9vIGNvbXBsZXggZm9yIGEgYml0ZmllbGQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM3NTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmllbGQgd2lkdGggJWx1IHRvbyBiaWcgdG8gZml0IGluICVkIGJ5dGVzOiB0cnVuY2F0ZWQgdG8gJWQgYml0cyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mzc3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJmaWVsZCB2YWx1ZSBcIiVzXCIgdG9vIGNvbXBsZXggZm9yIGEgYml0ZmllbGQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM4OTQKLW1zZ2lkICJVbnJlc29sdmFibGUgb3Igbm9ucG9zaXRpdmUgcmVwZWF0IGNvdW50OyB1c2luZyAxIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozOTQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gZmxvYXRpbmcgdHlwZSB0eXBlICclYyciCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM5NjcKLW1zZ2lkICJGbG9hdGluZyBwb2ludCBjb25zdGFudCB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQwOTIKLW1zZ2lkICJ1bnJlc29sdmFibGUgb3Igbm9ucG9zaXRpdmUgcmVwZWF0IGNvdW50OyB1c2luZyAxIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0NDk2Ci1tc2dpZCAiRXhwZWN0ZWQgPG5uPiIKLW1zZ3N0ciAiIgotCi0jLiBUbyBiZSBjb21wYXRpYmxlIHdpdGggQlNEIDQuMiBhczogZ2l2ZSB0aGUgbHVzZXIgYSBsaW5lZmVlZCEhCi0jOiByZWFkLmM6NDUyOSByZWFkLmM6NDYxMgotbXNnaWQgIlVudGVybWluYXRlZCBzdHJpbmc6IE5ld2xpbmUgaW5zZXJ0ZWQuIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0NjIwCi1tc2dpZCAiQmFkIGVzY2FwZWQgY2hhcmFjdGVyIGluIHN0cmluZywgJz8nIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ2NDYKLW1zZ2lkICJleHBlY3RlZCBhZGRyZXNzIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDY2NgotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgXCIlc1wiIHVuZGVmaW5lZDsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0NjY5Ci1tc2dpZCAic29tZSBzeW1ib2wgdW5kZWZpbmVkOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ2ODcKLW1zZ2lkICJiYWQgb3IgaXJyZWR1Y2libGUgYWJzb2x1dGUgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0NzI1Ci1tc2dpZCAiVGhpcyBzdHJpbmcgbWF5IG5vdCBjb250YWluICdcXDAnIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0NzY0Ci1tc2dpZCAiTWlzc2luZyBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ5OTUKLW1zZ2lkICJtaXNzaW5nIC5mdW5jIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo1MDEyCi1tc2dpZCAiLmVuZGZ1bmMgbWlzc2luZyBmb3IgcHJldmlvdXMgLmZ1bmMiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyMDkKLW1zZ2lkICIuc3RhYnM6IE1pc3NpbmcgY29tbWEiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyMTcgc3RhYnMuYzoyMjUgc3RhYnMuYzoyMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLnN0YWIlYzogTWlzc2luZyBjb21tYSIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjQxNQotbXNnaWQgImNvbW1hIG1pc3NpbmcgaW4gLnhzdGFicyIKLW1zZ3N0ciAiIgotCi0jOiBzdWJzZWdzLmM6Mzc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkF0dGVtcHQgdG8gc3dpdGNoIHRvIG5vbmV4aXN0ZW50IHNlZ21lbnQgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzozNjQgc3ltYm9scy5jOjQ1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6NDM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIFwiJXNcIi8lZC4lZC4lbGQuIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzo0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sIFwiJXNcIiBpcyBhbHJlYWR5IGRlZmluZWQgYXMgXCIlc1wiLyVsZC4iCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjUyOCBzeW1ib2xzLmM6NTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkluc2VydGluZyBcIiVzXCIgaW50byBzeW1ib2wgdGFibGUgZmFpbGVkOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6ODgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCBkZWZpbml0aW9uIGxvb3AgZW5jb3VudGVyZWQgYXQgJXMiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjEwNTQgc3ltYm9scy5jOjEwNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5kZWZpbmVkIHN5bWJvbCAlcyBpbiBvcGVyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjEwNjIKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gZm9yIG9wZXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTA2NyBzeW1ib2xzLmM6MTA3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmRlZmluZWQgc3ltYm9sICVzIGluIG9wZXJhdGlvbiBzZXR0aW5nICVzIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzoxMDc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VjdGlvbiBmb3Igb3BlcmF0aW9uIHNldHRpbmcgJXMiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjEwOTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGl2aXNpb24gYnkgemVybyB3aGVuIHNldHRpbmcgJXMiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjExNjYgd3JpdGUuYzoxODc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IHJlc29sdmUgdmFsdWUgZm9yIHN5bWJvbCBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjE1MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXCIlZFwiIChpbnN0YW5jZSBudW1iZXIgJWQgb2YgYSAlcyBsYWJlbCkiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjE1ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXR0ZW1wdCB0byBnZXQgdmFsdWUgb2YgdW5yZXNvbHZlZCBzeW1ib2wgJXMiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoxNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmllbGQgZnhfc2l6ZSB0b28gc21hbGwgdG8gaG9sZCAlZCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjMwNgotbXNnaWQgInJ2YSBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6NTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgImF0dGVtcHQgdG8gLm9yZy8uc3BhY2UgYmFja3dhcmRzPyAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjk3NQotbXNnaWQgInJlbG9jYXRpb24gb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6OTc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiV1OiBiYWQgcmV0dXJuIGZyb20gYmZkX2luc3RhbGxfcmVsb2NhdGlvbjogJXgiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoxMDIzCi1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGZpeHVwIG5vdCBjb250YWluZWQgd2l0aGluIGZyYWciCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoxMDM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiV1OiBiYWQgcmV0dXJuIGZyb20gYmZkX2luc3RhbGxfcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjExMjIgd3JpdGUuYzoxMTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkZBVEFMOiBDYW4ndCB3cml0ZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjExNzcKLW1zZ2lkICJDYW5ub3Qgd3JpdGUgdG8gb3V0cHV0IGZpbGUuIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MTQwOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlZCBlcnJvciVzLCAlZCB3YXJuaW5nJXMsIGdlbmVyYXRpbmcgYmFkIG9iamVjdCBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MTQxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlZCBlcnJvciVzLCAlZCB3YXJuaW5nJXMsIG5vIG9iamVjdCBmaWxlIGdlbmVyYXRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjE4MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibG9jYWwgbGFiZWwgJXMgaXMgbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoyMTE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImFsaWdubWVudCBwYWRkaW5nICglbHUgYnl0ZXMpIG5vdCBhIG11bHRpcGxlIG9mICVsZCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjIyMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLndvcmQgJXMtJXMrJXMgZGlkbid0IGZpdCIKLW1zZ3N0ciAiIgotCi0jLiBHcm93dGggbWF5IGJlIG5lZ2F0aXZlLCBidXQgdmFyaWFibGUgcGFydCBvZiBmcmFnCi0jLiBjYW5ub3QgaGF2ZSBmZXdlciB0aGFuIDAgY2hhcnMuICBUaGF0IGlzLCB3ZSBjYW4ndAotIy4gLm9yZyBiYWNrd2FyZHMuCi0jOiB3cml0ZS5jOjIzMDQKLW1zZ2lkICJhdHRlbXB0IHRvIC5vcmcgYmFja3dhcmRzIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoyMzIwCi1tc2dpZCAiLnNwYWNlIHNwZWNpZmllcyBub24tYWJzb2x1dGUgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoyMzI0Ci1tc2dpZCAiLnNwYWNlIG9yIC5maWxsIHdpdGggbmVnYXRpdmUgdmFsdWUsIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoyNTc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJTdWJ0cmFjdGlvbiBvZiB0d28gc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VjdGlvbnMgXCIlc1wiIHslcyBzZWN0aW9ufSAtICIKLSJcIiVzXCIgeyVzIHNlY3Rpb259IGF0IGZpbGUgYWRkcmVzcyAlcy4iCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoyNzUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlZhbHVlIG9mICVzIHRvbyBsYXJnZSBmb3IgZmllbGQgb2YgJWQgYnl0ZXMgYXQgJXMiCi1tc2dzdHIgIiIKZGlmZiAtLWdpdCBhL2dhcy9yZWFkLmMgYi9nYXMvcmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQyMDNiLi4wMDAwMDAwCi0tLSBhL2dhcy9yZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDc2ICswLDAgQEAKLS8qIHJlYWQuYyAtIHJlYWQgYSBzb3VyY2UgZmlsZSAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODYsIDg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWYgMAotI2RlZmluZSBNQVNLX0NIQVIgKDB4RkYpCS8qIElmIHlvdXIgY2hhcnMgYXJlbid0IDggYml0cywgeW91IHdpbGwKLQkJCQkgICBjaGFuZ2UgdGhpcyBhIGJpdC4gIEJ1dCB0aGVuLCBHTlUgaXNuJ3QKLQkJCQkgICBzcG96ZWQgdG8gcnVuIG9uIHlvdXIgbWFjaGluZSBhbnl3YXkuCi0JCQkJICAgKFJNUyBpcyBzbyBzaG9ydHNpZ2h0ZWQgc29tZXRpbWVzLikKLQkJCQkgICAqLwotI2Vsc2UKLSNkZWZpbmUgTUFTS19DSEFSICgoaW50KSh1bnNpZ25lZCBjaGFyKS0xKQotI2VuZGlmCi0KLQotLyogVGhpcyBpcyB0aGUgbGFyZ2VzdCBrbm93biBmbG9hdGluZyBwb2ludCBmb3JtYXQgKGZvciBub3cpLiBJdCB3aWxsCi0gICBncm93IHdoZW4gd2UgZG8gNDM2MSBzdHlsZSBmbG9udW1zLiAqLwotCi0jZGVmaW5lIE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCAoMTYpCi0KLS8qIFJvdXRpbmVzIHRoYXQgcmVhZCBhc3NlbWJsZXIgc291cmNlIHRleHQgdG8gYnVpbGQgc3BhZ2V0dGkgaW4gbWVtb3J5LgotICAgQW5vdGhlciBncm91cCBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgaW4gdGhlIGV4cHIuYyBtb2R1bGUuICAqLwotCi0vKiBmb3IgaXNkaWdpdCgpICovCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgInNiLmgiCi0jaW5jbHVkZSAibWFjcm8uaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAibGlzdGluZy5oIgotI2luY2x1ZGUgImVjb2ZmLmgiCi0KLSNpZm5kZWYgVENfU1RBUlRfTEFCRUwKLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoeCx5KSAoeD09JzonKQotI2VuZGlmCi0KLS8qIFRoZSBOT1BfT1BDT0RFIGlzIGZvciB0aGUgYWxpZ25tZW50IGZpbGwgdmFsdWUuCi0gKiBmaWxsIGl0IGEgbm9wIGluc3RydWN0aW9uIHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciBkb2VzIG5vdCBjaG9rZQotICogb24gaXQKLSAqLwotI2lmbmRlZiBOT1BfT1BDT0RFCi0jZGVmaW5lIE5PUF9PUENPREUgMHgwMAotI2VuZGlmCi0KLWNoYXIgKmlucHV0X2xpbmVfcG9pbnRlcjsJLyotPm5leHQgY2hhciBvZiBzb3VyY2UgZmlsZSB0byBwYXJzZS4gKi8KLQotI2lmIEJJVFNfUEVSX0NIQVIgIT0gOAotLyogIFRoZSBmb2xsb3dpbmcgdGFibGUgaXMgaW5kZXhlZCBieVsoY2hhcildIGFuZCB3aWxsIGJyZWFrIGlmCi0gICAgYSBjaGFyIGRvZXMgbm90IGhhdmUgZXhhY3RseSAyNTYgc3RhdGVzIChob3BlZnVsbHkgMDoyNTUhKSEgICovCi1kaWUgaG9ycmlibHk7Ci0jZW5kaWYKLQotI2lmbmRlZiBMRVhfQVQKLS8qIFRoZSBtODhrIHVuZm9ydHVuYXRlbHkgdXNlcyBAIGFzIGEgbGFiZWwgYmVnaW5uZXIuICAqLwotI2RlZmluZSBMRVhfQVQgMAotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX0JSCi0vKiBUaGUgUlMvNjAwMCBhc3NlbWJsZXIgdXNlcyB7LH0sWyxdIGFzIHBhcnRzIG9mIHN5bWJvbCBuYW1lcy4gICovCi0jZGVmaW5lIExFWF9CUiAwCi0jZW5kaWYKLQotI2lmbmRlZiBMRVhfUENUCi0vKiBUaGUgRGVsdGEgNjhrIGFzc2VtYmxlciBwZXJtaXRzICUgaW5zaWRlIGxhYmVsIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX1BDVCAwCi0jZW5kaWYKLQotI2lmbmRlZiBMRVhfUU0KLS8qIFRoZSBQb3dlclBDIFdpbmRvd3MgTlQgYXNzZW1ibGVycyBwZXJtaXRzID8gaW5zaWRlIGxhYmVsIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX1FNIDAKLSNlbmRpZgotCi0jaWZuZGVmIExFWF9IQVNICi0jZGVmaW5lIExFWF9IQVNIIDAKLSNlbmRpZgotCi0jaWZuZGVmIExFWF9ET0xMQVIKLS8qIFRoZSBhMjlrIGFzc2VtYmxlciBkb2VzIG5vdCBwZXJtaXRzIGxhYmVscyB0byBzdGFydCB3aXRoICQuICAqLwotI2RlZmluZSBMRVhfRE9MTEFSIDMKLSNlbmRpZgotCi0jaWZuZGVmIExFWF9USUxERQotLyogVGhlIERlbHRhIDY4ayBhc3NlbWJsZXIgcGVybWl0cyB+IGF0IHN0YXJ0IG9mIGxhYmVsIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX1RJTERFIDAKLSNlbmRpZgotCi0vKiB1c2VkIGJ5IGlzXy4uLiBtYWNyb3MuIG91ciBjdHlwZVtdICovCi1jaGFyIGxleF90eXBlWzI1Nl0gPQotewotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiBAQUJDREVGR0hJSktMTU5PICovCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIFBRUlNUVVZXWFlaW1xdXl8gKi8KLSAgMCwgMCwgMCwgTEVYX0hBU0gsIExFWF9ET0xMQVIsIExFWF9QQ1QsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIC8qIF8hIiMkJSYnKCkqKywtLi8gKi8KLSAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgTEVYX1FNLAkvKiAwMTIzNDU2Nzg5Ojs8PT4/ICovCi0gIExFWF9BVCwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywJLyogQEFCQ0RFRkdISUpLTE1OTyAqLwotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCBMRVhfQlIsIDAsIExFWF9CUiwgMCwgMywgLyogUFFSU1RVVldYWVpbXF1eXyAqLwotICAwLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAkvKiBgYWJjZGVmZ2hpamtsbW5vICovCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIExFWF9CUiwgMCwgTEVYX0JSLCBMRVhfVElMREUsIDAsIC8qIHBxcnN0dXZ3eHl6e3x9fi4gKi8KLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMwotfTsKLQotCi0vKgotICogSW46IGEgY2hhcmFjdGVyLgotICogT3V0OiAxIGlmIHRoaXMgY2hhcmFjdGVyIGVuZHMgYSBsaW5lLgotICovCi0jZGVmaW5lIFpfICgwKQotY2hhciBpc19lbmRfb2ZfbGluZVsyNTZdID0KLXsKLSNpZmRlZiBDUl9FT0wKLSAgOTksIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIDk5LCBaXywgWl8sIDk5LCBaXywgWl8sCS8qIEBhYmNkZWZnaGlqa2xtbm8gKi8KLSNlbHNlCi0gIDk5LCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCA5OSwgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiBAYWJjZGVmZ2hpamtsbW5vICovCi0jZW5kaWYKLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0jaWZkZWYgVENfSFBQQQotICBaXyw5OSwgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiBfISIjJCUmJygpKissLS4vICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAwMTIzNDU2Nzg5Ojs8PT4/ICovCi0jZWxzZQotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCA5OSwgWl8sIFpfLCBaXywgWl8sCS8qIDAxMjM0NTY3ODk6Ozw9Pj8gKi8KLSNlbmRpZgotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotfTsKLSN1bmRlZiBaXwotCi0vKiBGdW5jdGlvbnMgcHJpdmF0ZSB0byB0aGlzIGZpbGUuICovCi0KLXN0YXRpYyBjaGFyICpidWZmZXI7CS8qIDFzdCBjaGFyIG9mIGVhY2ggYnVmZmVyIG9mIGxpbmVzIGlzIGhlcmUuICovCi1zdGF0aWMgY2hhciAqYnVmZmVyX2xpbWl0OwkvKi0+MSArIGxhc3QgY2hhciBpbiBidWZmZXIuICovCi0KLS8qIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGlzIHJlcXVpcmVkIHRvIGJlIGRlZmluZWQgdG8gZWl0aGVyIDAgb3IgMSBpbiB0aGUKLSAgIHRjLTxDUFU+LmggZmlsZS4gIFNlZSB0aGUgIlBvcnRpbmcgR0FTIiBzZWN0aW9uIG9mIHRoZSBpbnRlcm5hbHMgbWFudWFsLiAqLwotaW50IHRhcmdldF9iaWdfZW5kaWFuID0gVEFSR0VUX0JZVEVTX0JJR19FTkRJQU47Ci0KLXN0YXRpYyBjaGFyICpvbGRfYnVmZmVyOwkvKiBKRiBhIGhhY2sgKi8KLXN0YXRpYyBjaGFyICpvbGRfaW5wdXQ7Ci1zdGF0aWMgY2hhciAqb2xkX2xpbWl0OwotCi0vKiBWYXJpYWJsZXMgZm9yIGhhbmRsaW5nIGluY2x1ZGUgZmlsZSBkaXJlY3RvcnkgdGFibGUuICovCi0KLWNoYXIgKippbmNsdWRlX2RpcnM7CS8qIFRhYmxlIG9mIHBvaW50ZXJzIHRvIGRpcmVjdG9yaWVzIHRvCi0JCQkgICBzZWFyY2ggZm9yIC5pbmNsdWRlJ3MgKi8KLWludCBpbmNsdWRlX2Rpcl9jb3VudDsJLyogSG93IG1hbnkgYXJlIGluIHRoZSB0YWJsZSAqLwotaW50IGluY2x1ZGVfZGlyX21heGxlbiA9IDE7LyogTGVuZ3RoIG9mIGxvbmdlc3QgaW4gdGFibGUgKi8KLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi1zdHJ1Y3QgYnJva2VuX3dvcmQgKmJyb2tlbl93b3JkczsKLWludCBuZXdfYnJva2VuX3dvcmRzOwotI2VuZGlmCi0KLS8qIFRoZSBjdXJyZW50IG9mZnNldCBpbnRvIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgV2UgZG9uJ3QgdHJ5IHRvCi0gICBidWlsZCBmcmFncyBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiwgc2luY2Ugbm8gZGF0YSBjYW4gYmUgc3RvcmVkCi0gICB0aGVyZS4gIFdlIGp1c3Qga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBvZmZzZXQuICAqLwotYWRkcmVzc1QgYWJzX3NlY3Rpb25fb2Zmc2V0OwotCi0vKiBJZiB0aGlzIGxpbmUgaGFkIGFuIE1SSSBzdHlsZSBsYWJlbCwgaXQgaXMgc3RvcmVkIGluIHRoaXMgdmFyaWFibGUuCi0gICBUaGlzIGlzIHVzZWQgYnkgc29tZSBvZiB0aGUgTVJJIHBzZXVkby1vcHMuICAqLwotc3ltYm9sUyAqbGluZV9sYWJlbDsKLQotLyogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgdXNlZCB0byBzdXBwb3J0IE1SSSBjb21tb24gc2VjdGlvbnMuICBXZQotICAgdHJhbnNsYXRlIHN1Y2ggc2VjdGlvbnMgaW50byBhIGNvbW1vbiBzeW1ib2wuICBUaGlzIHZhcmlhYmxlIGlzCi0gICBub24tTlVMTCB3aGVuIHdlIGFyZSBpbiBhbiBNUkkgY29tbW9uIHNlY3Rpb24uICAqLwotc3ltYm9sUyAqbXJpX2NvbW1vbl9zeW1ib2w7Ci0KLS8qIEluIE1SSSBtb2RlLCBhZnRlciBhIGRjLmIgcHNldWRvLW9wIHdpdGggYW4gb2RkIG51bWJlciBvZiBieXRlcywgd2UKLSAgIG5lZWQgdG8gYWxpZ24gdG8gYW4gZXZlbiBieXRlIGJvdW5kYXJ5IHVubGVzcyB0aGUgbmV4dCBwc2V1ZG8tb3AgaXMKLSAgIGRjLmIsIGRzLmIsIG9yIGRjYi5iLiAgVGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gMSBpZiBhbiBhbGlnbm1lbnQKLSAgIG1heSBiZSBuZWVkZWQuICAqLwotc3RhdGljIGludCBtcmlfcGVuZGluZ19hbGlnbjsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0jaWZkZWYgT0JKX0VMRgotLyogVGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gYmUgbm9uLXplcm8gaWYgdGhlIG5leHQgc3RyaW5nIHdlIHNlZSBtaWdodAotICAgYmUgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGluIERXQVJGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFNlZQotICAgdGhlIGNvbW1lbnQgaW4gZW1pdF9leHByIGZvciB0aGUgZm9ybWF0IHdlIGxvb2sgZm9yLiAgKi8KLXN0YXRpYyBpbnQgZHdhcmZfZmlsZV9zdHJpbmc7Ci0jZW5kaWYKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBjb25zX3dvcmtlciBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIGludCBzY3J1Yl9mcm9tX3N0cmluZyBQQVJBTVMgKChjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZG9fYWxpZ24gUEFSQU1TICgoaW50LCBjaGFyICosIGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FsaWduIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2xjb21tX2ludGVybmFsIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgaW50IGhleF9mbG9hdCBQQVJBTVMgKChpbnQsIGNoYXIgKikpOwotc3RhdGljIGlubGluZSBpbnQgc2l6ZW9mX3NsZWIxMjggUEFSQU1TICgob2Zmc2V0VCkpOwotc3RhdGljIGlubGluZSBpbnQgc2l6ZW9mX3VsZWIxMjggUEFSQU1TICgodmFsdWVUKSk7Ci1zdGF0aWMgaW5saW5lIGludCBvdXRwdXRfc2xlYjEyOCBQQVJBTVMgKChjaGFyICosIG9mZnNldFQpKTsKLXN0YXRpYyBpbmxpbmUgaW50IG91dHB1dF91bGViMTI4IFBBUkFNUyAoKGNoYXIgKiwgdmFsdWVUKSk7Ci1zdGF0aWMgaW5saW5lIGludCBvdXRwdXRfYmlnX3NsZWIxMjggUEFSQU1TICgoY2hhciAqLCBMSVRUTEVOVU1fVFlQRSAqLCBpbnQpKTsKLXN0YXRpYyBpbmxpbmUgaW50IG91dHB1dF9iaWdfdWxlYjEyOCBQQVJBTVMgKChjaGFyICosIExJVFRMRU5VTV9UWVBFICosIGludCkpOwotc3RhdGljIGludCBvdXRwdXRfYmlnX2xlYjEyOCBQQVJBTVMgKChjaGFyICosIExJVFRMRU5VTV9UWVBFICosIGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkb19vcmcgUEFSQU1TICgoc2VnVCwgZXhwcmVzc2lvblMgKiwgaW50KSk7Ci1jaGFyICpkZW1hbmRfY29weV9zdHJpbmcgUEFSQU1TICgoaW50ICpsZW5QKSk7Ci1zdGF0aWMgc2VnVCBnZXRfc2VnbWVudGVkX2V4cHJlc3Npb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cFApKTsKLXN0YXRpYyBzZWdUIGdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqIGV4cFApKTsKLXN0YXRpYyB2b2lkIHBvYmVnaW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBnZXRfbGluZV9zYiBQQVJBTVMgKChzYiAqKSk7Ci1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9maWxlX2RlYnVnIFBBUkFNUyAoKHZvaWQpKTsKLQwKLQotdm9pZAotcmVhZF9iZWdpbiAoKQotewotICBjb25zdCBjaGFyICpwOwotCi0gIHBvYmVnaW4gKCk7Ci0gIG9ial9yZWFkX2JlZ2luX2hvb2sgKCk7Ci0KLSAgLyogU29tZXRoaW5nIGNsb3NlIC0tIGJ1dCBub3QgdG9vIGNsb3NlIC0tIHRvIGEgbXVsdGlwbGUgb2YgMTAyNC4KLSAgICAgVGhlIGRlYnVnZ2luZyBtYWxsb2MgSSdtIHVzaW5nIGhhcyAyNCBieXRlcyBvZiBvdmVyaGVhZC4gICovCi0gIG9ic3RhY2tfYmVnaW4gKCZub3RlcywgY2h1bmtzaXplKTsKLSAgb2JzdGFja19iZWdpbiAoJmNvbmRfb2JzdGFjaywgY2h1bmtzaXplKTsKLQotICAvKiBVc2UgbWFjaGluZSBkZXBlbmRlbnQgc3ludGF4ICovCi0gIGZvciAocCA9IGxpbmVfc2VwYXJhdG9yX2NoYXJzOyAqcDsgcCsrKQotICAgIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqcF0gPSAxOwotICAvKiBVc2UgbW9yZS4gIEZJWE1FLVNPTUVEQVkuICovCi0KLSAgaWYgKGZsYWdfbXJpKQotICAgIGxleF90eXBlWyc/J10gPSAzOwotfQotDAotLyogc2V0IHVwIHBzZXVkby1vcCB0YWJsZXMgKi8KLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnBvX2hhc2g7Ci0KLXN0YXRpYyBjb25zdCBwc2V1ZG9fdHlwZVMgcG90YWJsZVtdID0KLXsKLSAgeyJhYm9ydCIsIHNfYWJvcnQsIDB9LAotICB7ImFsaWduIiwgc19hbGlnbl9wdHdvLCAwfSwKLSAgeyJhc2NpaSIsIHN0cmluZ2VyLCAwfSwKLSAgeyJhc2NpeiIsIHN0cmluZ2VyLCAxfSwKLSAgeyJiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCAwfSwKLSAgeyJiYWxpZ253Iiwgc19hbGlnbl9ieXRlcywgLTJ9LAotICB7ImJhbGlnbmwiLCBzX2FsaWduX2J5dGVzLCAtNH0sCi0vKiBibG9jayAqLwotICB7ImJ5dGUiLCBjb25zLCAxfSwKLSAgeyJjb21tIiwgc19jb21tLCAwfSwKLSAgeyJjb21tb24iLCBzX21yaV9jb21tb24sIDB9LAotICB7ImNvbW1vbi5zIiwgc19tcmlfY29tbW9uLCAxfSwKLSAgeyJkYXRhIiwgc19kYXRhLCAwfSwKLSAgeyJkYyIsIGNvbnMsIDJ9LAotICB7ImRjLmIiLCBjb25zLCAxfSwKLSAgeyJkYy5kIiwgZmxvYXRfY29ucywgJ2QnfSwKLSAgeyJkYy5sIiwgY29ucywgNH0sCi0gIHsiZGMucyIsIGZsb2F0X2NvbnMsICdmJ30sCi0gIHsiZGMudyIsIGNvbnMsIDJ9LAotICB7ImRjLngiLCBmbG9hdF9jb25zLCAneCd9LAotICB7ImRjYiIsIHNfc3BhY2UsIDJ9LAotICB7ImRjYi5iIiwgc19zcGFjZSwgMX0sCi0gIHsiZGNiLmQiLCBzX2Zsb2F0X3NwYWNlLCAnZCd9LAotICB7ImRjYi5sIiwgc19zcGFjZSwgNH0sCi0gIHsiZGNiLnMiLCBzX2Zsb2F0X3NwYWNlLCAnZid9LAotICB7ImRjYi53Iiwgc19zcGFjZSwgMn0sCi0gIHsiZGNiLngiLCBzX2Zsb2F0X3NwYWNlLCAneCd9LAotICB7ImRzIiwgc19zcGFjZSwgMn0sCi0gIHsiZHMuYiIsIHNfc3BhY2UsIDF9LAotICB7ImRzLmQiLCBzX3NwYWNlLCA4fSwKLSAgeyJkcy5sIiwgc19zcGFjZSwgNH0sCi0gIHsiZHMucCIsIHNfc3BhY2UsIDEyfSwKLSAgeyJkcy5zIiwgc19zcGFjZSwgNH0sCi0gIHsiZHMudyIsIHNfc3BhY2UsIDJ9LAotICB7ImRzLngiLCBzX3NwYWNlLCAxMn0sCi0gIHsiZGVidWciLCBzX2lnbm9yZSwgMH0sCi0jaWZkZWYgU19TRVRfREVTQwotICB7ImRlc2MiLCBzX2Rlc2MsIDB9LAotI2VuZGlmCi0vKiBkaW0gKi8KLSAgeyJkb3VibGUiLCBmbG9hdF9jb25zLCAnZCd9LAotLyogZHNlY3QgKi8KLSAgeyJlamVjdCIsIGxpc3RpbmdfZWplY3QsIDB9LAkvKiBGb3JtZmVlZCBsaXN0aW5nICovCi0gIHsiZWxzZSIsIHNfZWxzZSwgMH0sCi0gIHsiZWxzZWMiLCBzX2Vsc2UsIDB9LAotICB7ImVuZCIsIHNfZW5kLCAwfSwKLSAgeyJlbmRjIiwgc19lbmRpZiwgMH0sCi0gIHsiZW5kZnVuYyIsIHNfZnVuYywgMX0sCi0gIHsiZW5kaWYiLCBzX2VuZGlmLCAwfSwKLS8qIGVuZGVmICovCi0gIHsiZXF1Iiwgc19zZXQsIDB9LAotICB7ImVxdWl2Iiwgc19zZXQsIDF9LAotICB7ImVyciIsIHNfZXJyLCAwfSwKLSAgeyJleGl0bSIsIHNfbWV4aXQsIDB9LAotLyogZXh0ZW5kICovCi0gIHsiZXh0ZXJuIiwgc19pZ25vcmUsIDB9LAkvKiBXZSB0cmVhdCBhbGwgdW5kZWYgYXMgZXh0ICovCi0gIHsiYXBwZmlsZSIsIHNfYXBwX2ZpbGUsIDF9LAotICB7ImFwcGxpbmUiLCBzX2FwcF9saW5lLCAwfSwKLSAgeyJmYWlsIiwgc19mYWlsLCAwfSwKLSAgeyJmaWxlIiwgc19hcHBfZmlsZSwgMH0sCi0gIHsiZmlsbCIsIHNfZmlsbCwgMH0sCi0gIHsiZmxvYXQiLCBmbG9hdF9jb25zLCAnZid9LAotICB7ImZvcm1hdCIsIHNfaWdub3JlLCAwfSwKLSAgeyJmdW5jIiwgc19mdW5jLCAwfSwKLSAgeyJnbG9iYWwiLCBzX2dsb2JsLCAwfSwKLSAgeyJnbG9ibCIsIHNfZ2xvYmwsIDB9LAotICB7Imh3b3JkIiwgY29ucywgMn0sCi0gIHsiaWYiLCBzX2lmLCAoaW50KSBPX25lfSwKLSAgeyJpZmMiLCBzX2lmYywgMH0sCi0gIHsiaWZkZWYiLCBzX2lmZGVmLCAwfSwKLSAgeyJpZmVxIiwgc19pZiwgKGludCkgT19lcX0sCi0gIHsiaWZlcXMiLCBzX2lmZXFzLCAwfSwKLSAgeyJpZmdlIiwgc19pZiwgKGludCkgT19nZX0sCi0gIHsiaWZndCIsIHNfaWYsIChpbnQpIE9fZ3R9LAotICB7ImlmbGUiLCBzX2lmLCAoaW50KSBPX2xlfSwKLSAgeyJpZmx0Iiwgc19pZiwgKGludCkgT19sdH0sCi0gIHsiaWZuYyIsIHNfaWZjLCAxfSwKLSAgeyJpZm5kZWYiLCBzX2lmZGVmLCAxfSwKLSAgeyJpZm5lIiwgc19pZiwgKGludCkgT19uZX0sCi0gIHsiaWZuZXMiLCBzX2lmZXFzLCAxfSwKLSAgeyJpZm5vdGRlZiIsIHNfaWZkZWYsIDF9LAotICB7ImluY2x1ZGUiLCBzX2luY2x1ZGUsIDB9LAotICB7ImludCIsIGNvbnMsIDR9LAotICB7ImlycCIsIHNfaXJwLCAwfSwKLSAgeyJpcmVwIiwgc19pcnAsIDB9LAotICB7ImlycGMiLCBzX2lycCwgMX0sCi0gIHsiaXJlcGMiLCBzX2lycCwgMX0sCi0gIHsibGNvbW0iLCBzX2xjb21tLCAwfSwKLSAgeyJsZmxhZ3MiLCBsaXN0aW5nX2ZsYWdzLCAwfSwJLyogTGlzdGluZyBmbGFncyAqLwotICB7ImxpbmtvbmNlIiwgc19saW5rb25jZSwgMH0sCi0gIHsibGlzdCIsIGxpc3RpbmdfbGlzdCwgMX0sCS8qIFR1cm4gbGlzdGluZyBvbiAqLwotICB7ImxsZW4iLCBsaXN0aW5nX3BzaXplLCAxfSwKLSAgeyJsb25nIiwgY29ucywgNH0sCi0gIHsibHN5bSIsIHNfbHN5bSwgMH0sCi0gIHsibWFjcm8iLCBzX21hY3JvLCAwfSwKLSAgeyJtZXhpdCIsIHNfbWV4aXQsIDB9LAotICB7Im1yaSIsIHNfbXJpLCAwfSwKLSAgeyIubXJpIiwgc19tcmksIDB9LAkvKiBTcGVjaWFsIGNhc2Ugc28gLm1yaSB3b3JrcyBpbiBNUkkgbW9kZS4gICovCi0gIHsibmFtZSIsIHNfaWdub3JlLCAwfSwKLSAgeyJub2Zvcm1hdCIsIHNfaWdub3JlLCAwfSwKLSAgeyJub2xpc3QiLCBsaXN0aW5nX2xpc3QsIDB9LAkvKiBUdXJuIGxpc3Rpbmcgb2ZmICovCi0gIHsibm9wYWdlIiwgbGlzdGluZ19ub3BhZ2UsIDB9LAotICB7Im9jdGEiLCBjb25zLCAxNn0sCi0gIHsib2Zmc2V0Iiwgc19zdHJ1Y3QsIDB9LAotICB7Im9yZyIsIHNfb3JnLCAwfSwKLSAgeyJwMmFsaWduIiwgc19hbGlnbl9wdHdvLCAwfSwKLSAgeyJwMmFsaWdudyIsIHNfYWxpZ25fcHR3bywgLTJ9LAotICB7InAyYWxpZ25sIiwgc19hbGlnbl9wdHdvLCAtNH0sCi0gIHsicGFnZSIsIGxpc3RpbmdfZWplY3QsIDB9LAotICB7InBsZW4iLCBsaXN0aW5nX3BzaXplLCAwfSwKLSAgeyJwcmludCIsIHNfcHJpbnQsIDB9LAotICB7InBzaXplIiwgbGlzdGluZ19wc2l6ZSwgMH0sCS8qIHNldCBwYXBlciBzaXplICovCi0gIHsicHVyZ2VtIiwgc19wdXJnZW0sIDB9LAotICB7InF1YWQiLCBjb25zLCA4fSwKLSAgeyJyZXAiLCBzX3JlcHQsIDB9LAotICB7InJlcHQiLCBzX3JlcHQsIDB9LAotICB7InJ2YSIsIHNfcnZhLCA0fSwKLSAgeyJzYnR0bCIsIGxpc3RpbmdfdGl0bGUsIDF9LAkvKiBTdWJ0aXRsZSBvZiBsaXN0aW5nICovCi0vKiBzY2wgKi8KLS8qIHNlY3QgKi8KLSAgeyJzZXQiLCBzX3NldCwgMH0sCi0gIHsic2hvcnQiLCBjb25zLCAyfSwKLSAgeyJzaW5nbGUiLCBmbG9hdF9jb25zLCAnZid9LAotLyogc2l6ZSAqLwotICB7InNwYWNlIiwgc19zcGFjZSwgMH0sCi0gIHsic2tpcCIsIHNfc3BhY2UsIDB9LAotICB7InNsZWIxMjgiLCBzX2xlYjEyOCwgMX0sCi0gIHsic3BjIiwgc19pZ25vcmUsIDB9LAotICB7InN0YWJkIiwgc19zdGFiLCAnZCd9LAotICB7InN0YWJuIiwgc19zdGFiLCAnbid9LAotICB7InN0YWJzIiwgc19zdGFiLCAncyd9LAotICB7InN0cmluZyIsIHN0cmluZ2VyLCAxfSwKLSAgeyJzdHJ1Y3QiLCBzX3N0cnVjdCwgMH0sCi0vKiB0YWcgKi8KLSAgeyJ0ZXh0Iiwgc190ZXh0LCAwfSwKLQotICAvKiBUaGlzIGlzIGZvciBnY2MgdG8gdXNlLiAgSXQncyBvbmx5IGp1c3QgYmVlbiBhZGRlZCAoMi85NCksIHNvIGdjYwotICAgICB3b24ndCBiZSBhYmxlIHRvIHVzZSBpdCBmb3IgYSB3aGlsZSAtLSBwcm9iYWJseSBhIHllYXIgb3IgbW9yZS4KLSAgICAgQnV0IG9uY2UgdGhpcyBoYXMgYmVlbiByZWxlYXNlZCwgY2hlY2sgd2l0aCBnY2MgbWFpbnRhaW5lcnMKLSAgICAgYmVmb3JlIGRlbGV0aW5nIGl0IG9yIGV2ZW4gY2hhbmdpbmcgdGhlIHNwZWxsaW5nLiAgKi8KLSAgeyJ0aGlzX0dDQ19yZXF1aXJlc190aGVfR05VX2Fzc2VtYmxlciIsIHNfaWdub3JlLCAwfSwKLSAgLyogSWYgd2UncmUgZm9sZGluZyBjYXNlIC0tIGRvbmUgZm9yIHNvbWUgdGFyZ2V0cywgbm90IG5lY2Vzc2FyaWx5Ci0gICAgIGFsbCAtLSB0aGUgYWJvdmUgc3RyaW5nIGluIGFuIGlucHV0IGZpbGUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8KLSAgICAgdGhpcyBvbmUuICBNYXRjaCBpdCBlaXRoZXIgd2F5Li4uICAqLwotICB7InRoaXNfZ2NjX3JlcXVpcmVzX3RoZV9nbnVfYXNzZW1ibGVyIiwgc19pZ25vcmUsIDB9LAotCi0gIHsidGl0bGUiLCBsaXN0aW5nX3RpdGxlLCAwfSwJLyogTGlzdGluZyB0aXRsZSAqLwotICB7InR0bCIsIGxpc3RpbmdfdGl0bGUsIDB9LAotLyogdHlwZSAqLwotICB7InVsZWIxMjgiLCBzX2xlYjEyOCwgMH0sCi0vKiB1c2UgKi8KLS8qIHZhbCAqLwotICB7Inhjb20iLCBzX2NvbW0sIDB9LAotICB7InhkZWYiLCBzX2dsb2JsLCAwfSwKLSAgeyJ4cmVmIiwgc19pZ25vcmUsIDB9LAotICB7InhzdGFicyIsIHNfeHN0YWIsICdzJ30sCi0gIHsid29yZCIsIGNvbnMsIDJ9LAotICB7Inplcm8iLCBzX3NwYWNlLCAwfSwKLSAge05VTEwsIE5VTEwsIDB9CQkJLyogZW5kIHNlbnRpbmVsICovCi19OwotCi1zdGF0aWMgaW50IHBvcF9vdmVycmlkZV9vayA9IDA7Ci1zdGF0aWMgY29uc3QgY2hhciAqcG9wX3RhYmxlX25hbWU7Ci0KLXZvaWQKLXBvcF9pbnNlcnQgKHRhYmxlKQotICAgICBjb25zdCBwc2V1ZG9fdHlwZVMgKnRhYmxlOwotewotICBjb25zdCBjaGFyICplcnJ0eHQ7Ci0gIGNvbnN0IHBzZXVkb190eXBlUyAqcG9wOwotICBmb3IgKHBvcCA9IHRhYmxlOyBwb3AtPnBvY19uYW1lOyBwb3ArKykKLSAgICB7Ci0gICAgICBlcnJ0eHQgPSBoYXNoX2luc2VydCAocG9faGFzaCwgcG9wLT5wb2NfbmFtZSwgKGNoYXIgKikgcG9wKTsKLSAgICAgIGlmIChlcnJ0eHQgJiYgKCFwb3Bfb3ZlcnJpZGVfb2sgfHwgc3RyY21wIChlcnJ0eHQsICJleGlzdHMiKSkpCi0JYXNfZmF0YWwgKF8oImVycm9yIGNvbnN0cnVjdGluZyAlcyBwc2V1ZG8tb3AgdGFibGU6ICVzIiksIHBvcF90YWJsZV9uYW1lLAotCQkgIGVycnR4dCk7Ci0gICAgfQotfQotCi0jaWZuZGVmIG1kX3BvcF9pbnNlcnQKLSNkZWZpbmUgbWRfcG9wX2luc2VydCgpCQlwb3BfaW5zZXJ0KG1kX3BzZXVkb190YWJsZSkKLSNlbmRpZgotCi0jaWZuZGVmIG9ial9wb3BfaW5zZXJ0Ci0jZGVmaW5lIG9ial9wb3BfaW5zZXJ0KCkJcG9wX2luc2VydChvYmpfcHNldWRvX3RhYmxlKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIAotcG9iZWdpbiAoKQotewotICBwb19oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogRG8gdGhlIHRhcmdldC1zcGVjaWZpYyBwc2V1ZG8gb3BzLiAqLwotICBwb3BfdGFibGVfbmFtZSA9ICJtZCI7Ci0gIG1kX3BvcF9pbnNlcnQgKCk7Ci0KLSAgLyogTm93IG9iamVjdCBzcGVjaWZpYy4gIFNraXAgYW55IHRoYXQgd2VyZSBpbiB0aGUgdGFyZ2V0IHRhYmxlLiAqLwotICBwb3BfdGFibGVfbmFtZSA9ICJvYmoiOwotICBwb3Bfb3ZlcnJpZGVfb2sgPSAxOwotICBvYmpfcG9wX2luc2VydCAoKTsKLQotICAvKiBOb3cgcG9ydGFibGUgb25lcy4gIFNraXAgYW55IHRoYXQgd2UndmUgc2VlbiBhbHJlYWR5LiAqLwotICBwb3BfdGFibGVfbmFtZSA9ICJzdGFuZGFyZCI7Ci0gIHBvcF9pbnNlcnQgKHBvdGFibGUpOwotfQotDAotI2RlZmluZSBIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFkoKQkJCQkJXAotICBpZiAoaWdub3JlX2lucHV0ICgpKQkJCQkJCQlcCi0gICAgewkJCQkJCQkJCVwKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKytdKQlcCi0JaWYgKGlucHV0X2xpbmVfcG9pbnRlciA9PSBidWZmZXJfbGltaXQpCQkJCVwKLQkgIGJyZWFrOwkJCQkJCQlcCi0gICAgICBjb250aW51ZTsJCQkJCQkJCVwKLSAgICB9Ci0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gc2NydWJiaW5nIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gI0FQUAotICAgYW5kICNOT19BUFAuICAqLwotCi1zdGF0aWMgY2hhciAqc2NydWJfc3RyaW5nOwotc3RhdGljIGNoYXIgKnNjcnViX3N0cmluZ19lbmQ7Ci0KLXN0YXRpYyBpbnQKLXNjcnViX2Zyb21fc3RyaW5nIChidWYsIGJ1ZmxlbikKLSAgICAgY2hhciAqYnVmOwotICAgICBpbnQgYnVmbGVuOwotewotICBpbnQgY29weTsKLQotICBjb3B5ID0gc2NydWJfc3RyaW5nX2VuZCAtIHNjcnViX3N0cmluZzsKLSAgaWYgKGNvcHkgPiBidWZsZW4pCi0gICAgY29weSA9IGJ1ZmxlbjsKLSAgbWVtY3B5IChidWYsIHNjcnViX3N0cmluZywgY29weSk7Ci0gIHNjcnViX3N0cmluZyArPSBjb3B5OwotICByZXR1cm4gY29weTsKLX0KLQotLyoJcmVhZF9hX3NvdXJjZV9maWxlKCkKLSAqCi0gKiBXZSByZWFkIHRoZSBmaWxlLCBwdXR0aW5nIHRoaW5ncyBpbnRvIGEgd2ViIHRoYXQKLSAqIHJlcHJlc2VudHMgd2hhdCB3ZSBoYXZlIGJlZW4gcmVhZGluZy4KLSAqLwotdm9pZCAKLXJlYWRfYV9zb3VyY2VfZmlsZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciBjOwotICByZWdpc3RlciBjaGFyICpzOwkJLyogc3RyaW5nIG9mIHN5bWJvbCwgJ1wwJyBhcHBlbmRlZCAqLwotICByZWdpc3RlciBpbnQgdGVtcDsKLSAgcHNldWRvX3R5cGVTICpwb3A7Ci0KLSAgYnVmZmVyID0gaW5wdXRfc2NydWJfbmV3X2ZpbGUgKG5hbWUpOwotCi0gIGxpc3RpbmdfZmlsZSAobmFtZSk7Ci0gIGxpc3RpbmdfbmV3bGluZSAoTlVMTCk7Ci0gIHJlZ2lzdGVyX2RlcGVuZGVuY3kgKG5hbWUpOwotCi0gIC8qIEdlbmVyYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBiZWZvcmUgd2UndmUgcmVhZCBhbnl0aGluZyBpbiB0byBkZW5vdGUKLSAgICAgdGhpcyBmaWxlIGFzIHRoZSAibWFpbiIgc291cmNlIGZpbGUgYW5kIG5vdCBhIHN1Ym9yZGluYXRlIG9uZQotICAgICAoZS5nLiBOX1NPIHZzIE5fU09MIGluIHN0YWJzKS4gICovCi0gIGdlbmVyYXRlX2ZpbGVfZGVidWcgKCk7Ci0KLSAgd2hpbGUgKChidWZmZXJfbGltaXQgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcikpICE9IDApCi0gICAgewkJCQkvKiBXZSBoYXZlIGFub3RoZXIgbGluZSB0byBwYXJzZS4gKi8KLSAgICAgIGtub3cgKGJ1ZmZlcl9saW1pdFstMV0gPT0gJ1xuJyk7CS8qIE11c3QgaGF2ZSBhIHNlbnRpbmVsLiAqLwotICAgIGNvbnRpbjoJCQkvKiBKRiB0aGlzIGdvdG8gaXMgbXkgZmF1bHQgSSBhZG1pdCBpdC4KLQkJCQkgICBTb21lb25lIGJyYXZlIHBsZWFzZSByZS13cml0ZSB0aGUgd2hvbGUKLQkJCQkgICBpbnB1dCBzZWN0aW9uIGhlcmU/ICBQbGVlemU/Pz8gICovCi0gICAgICB3aGlsZSAoaW5wdXRfbGluZV9wb2ludGVyIDwgYnVmZmVyX2xpbWl0KQotCXsKLQkgIC8qIFdlIGhhdmUgbW9yZSBvZiB0aGlzIGJ1ZmZlciB0byBwYXJzZS4gKi8KLQotCSAgLyoKLQkgICAqIFdlIG5vdyBoYXZlIGlucHV0X2xpbmVfcG9pbnRlci0+MXN0IGNoYXIgb2YgbmV4dCBsaW5lLgotCSAgICogSWYgaW5wdXRfbGluZV9wb2ludGVyIFstMV0gPT0gJ1xuJyB0aGVuIHdlIGp1c3QKLQkgICAqIHNjYW5uZWQgYW5vdGhlciBsaW5lOiBzbyBidW1wIGxpbmUgY291bnRlcnMuCi0JICAgKi8KLQkgIGlmIChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWy0xXV0pCi0JICAgIHsKLSNpZmRlZiBtZF9zdGFydF9saW5lX2hvb2sKLQkgICAgICBtZF9zdGFydF9saW5lX2hvb2sgKCk7Ci0jZW5kaWYKLQotCSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbLTFdID09ICdcbicpCi0JCWJ1bXBfbGluZV9jb3VudGVycyAoKTsKLQotCSAgICAgIGxpbmVfbGFiZWwgPSBOVUxMOwotCi0JICAgICAgaWYgKGZsYWdfbTY4a19tcmkKLSNpZmRlZiBMQUJFTFNfV0lUSE9VVF9DT0xPTlMKLQkJICB8fCAxCi0jZW5kaWYKLQkJICApCi0JCXsKLQkJICAvKiBUZXh0IGF0IHRoZSBzdGFydCBvZiBhIGxpbmUgbXVzdCBiZSBhIGxhYmVsLCB3ZQotCQkgICAgIHJ1biBkb3duIGFuZCBzdGljayBhIGNvbG9uIGluLiAgKi8KLQkJICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKmxpbmVfc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgICAgIGNoYXIgYzsKLQkJICAgICAgaW50IG1yaV9saW5lX21hY3JvOwotCi0JCSAgICAgIExJU1RJTkdfTkVXTElORSAoKTsKLQkJICAgICAgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZICgpOwotCi0JCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCQkgICAgICAvKiBJbiBNUkkgbW9kZSwgdGhlIEVRVSBhbmQgTUFDUk8gcHNldWRvb3BzIG11c3QKLQkJCSBiZSBoYW5kbGVkIHNwZWNpYWxseS4gICovCi0JCSAgICAgIG1yaV9saW5lX21hY3JvID0gMDsKLQkJICAgICAgaWYgKGZsYWdfbTY4a19tcmkpCi0JCQl7Ci0JCQkgIGNoYXIgKnJlc3QgPSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxOwotCi0JCQkgIGlmICgqcmVzdCA9PSAnOicpCi0JCQkgICAgKytyZXN0OwotCQkJICBpZiAoKnJlc3QgPT0gJyAnIHx8ICpyZXN0ID09ICdcdCcpCi0JCQkgICAgKytyZXN0OwotCQkJICBpZiAoKHN0cm5jYXNlY21wIChyZXN0LCAiRVFVIiwgMykgPT0gMAotCQkJICAgICAgIHx8IHN0cm5jYXNlY21wIChyZXN0LCAiU0VUIiwgMykgPT0gMCkKLQkJCSAgICAgICYmIChyZXN0WzNdID09ICcgJyB8fCByZXN0WzNdID09ICdcdCcpKQotCQkJICAgIHsKLQkJCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHJlc3QgKyAzOwotCQkJICAgICAgZXF1YWxzIChsaW5lX3N0YXJ0LAotCQkJCSAgICAgIHN0cm5jYXNlY21wIChyZXN0LCAiU0VUIiwgMykgPT0gMCk7Ci0JCQkgICAgICBjb250aW51ZTsKLQkJCSAgICB9Ci0JCQkgIGlmIChzdHJuY2FzZWNtcCAocmVzdCwgIk1BQ1JPIiwgNSkgPT0gMAotCQkJICAgICAgJiYgKHJlc3RbNV0gPT0gJyAnCi0JCQkJICB8fCByZXN0WzVdID09ICdcdCcKLQkJCQkgIHx8IGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSByZXN0WzVdXSkpCi0JCQkgICAgbXJpX2xpbmVfbWFjcm8gPSAxOwotCQkJfQotCi0JCSAgICAgIC8qIEluIE1SSSBtb2RlLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgTUFDUk8KLSAgICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZG8tb3Agc3BlY2lhbGx5OiB3ZSBkb24ndCB3YW50IHRvIHB1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0JCSAgICAgIGlmICghIG1yaV9saW5lX21hY3JvKQotCQkJbGluZV9sYWJlbCA9IGNvbG9uIChsaW5lX3N0YXJ0KTsKLQkJICAgICAgZWxzZQotCQkJbGluZV9sYWJlbCA9IHN5bWJvbF9jcmVhdGUgKGxpbmVfc3RhcnQsCi0JCQkJCQkgICAgYWJzb2x1dGVfc2VjdGlvbiwKLQkJCQkJCSAgICAodmFsdWVUKSAwLAotCQkJCQkJICAgICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICAgIGlmIChjID09ICc6JykKLQkJCWlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgLyoKLQkgICAqIFdlIGFyZSBhdCB0aGUgYmVnaW5pbmcgb2YgYSBsaW5lLCBvciBzaW1pbGFyIHBsYWNlLgotCSAgICogV2UgZXhwZWN0IGEgd2VsbC1mb3JtZWQgYXNzZW1ibGVyIHN0YXRlbWVudC4KLQkgICAqIEEgInN5bWJvbC1uYW1lOiIgaXMgYSBzdGF0ZW1lbnQuCi0JICAgKgotCSAgICogRGVwZW5kaW5nIG9uIHdoYXQgY29tcGlsZXIgaXMgdXNlZCwgdGhlIG9yZGVyIG9mIHRoZXNlIHRlc3RzCi0JICAgKiBtYXkgdmFyeSB0byBjYXRjaCBtb3N0IGNvbW1vbiBjYXNlIDFzdC4KLQkgICAqIEVhY2ggdGVzdCBpcyBpbmRlcGVuZGVudCBvZiBhbGwgb3RoZXIgdGVzdHMgYXQgdGhlICh0b3ApIGxldmVsLgotCSAgICogUExFQVNFIG1ha2UgYSBjb21waWxlciB0aGF0IGRvZXNuJ3QgdXNlIHRoaXMgYXNzZW1ibGVyLgotCSAgICogSXQgaXMgY3J1ZnR5IHRvIHdhc3RlIGEgY29tcGlsZXIncyB0aW1lIGVuY29kaW5nIHRoaW5ncyBmb3IgdGhpcwotCSAgICogYXNzZW1ibGVyLCB3aGljaCB0aGVuIHdhc3RlcyBtb3JlIHRpbWUgZGVjb2RpbmcgaXQuCi0JICAgKiAoQW5kIGNvbW11bmljYXRpbmcgdmlhIChsaW5lYXIpIGZpbGVzIGlzIHNpbGx5IQotCSAgICogSWYgeW91IG11c3QgcGFzcyBzdHVmZiwgcGxlYXNlIHBhc3MgYSB0cmVlISkKLQkgICAqLwotCSAgaWYgKChjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrKSA9PSAnXHQnCi0JICAgICAgfHwgYyA9PSAnICcKLQkgICAgICB8fCBjID09ICdcZicKLQkgICAgICB8fCBjID09IDApCi0JICAgIHsKLQkgICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICB9Ci0JICBrbm93IChjICE9ICcgJyk7CS8qIE5vIGZ1cnRoZXIgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLQkgIC8qIElmIGxpc3RpbmcgaXMgb24sIGFuZCB3ZSBhcmUgZXhwYW5kaW5nIGEgbWFjcm8sIHRoZW4gZ2l2ZQotCSAgICAgdGhlIGxpc3RpbmcgY29kZSB0aGUgY29udGVudHMgb2YgdGhlIGV4cGFuZGVkIGxpbmUuICAqLwotCSAgaWYgKGxpc3RpbmcpCi0JICAgIHsKLQkgICAgICBpZiAoKGxpc3RpbmcgJiBMSVNUSU5HX01BQ0VYUCkgJiYgbWFjcm9fbmVzdCA+IDApCi0JCXsKLQkJICBjaGFyICpjb3B5OwotCQkgIGludCBsZW47Ci0KLQkJICAvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZXhwYW5kZWQgbWFjcm8gbGluZS4gICovCi0JCSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyLTE7ICpzIDsgKytzKQotCQkgICAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc10pCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgLyogQ29weSBpdCBmb3Igc2FmZSBrZWVwaW5nLiAgQWxzbyBnaXZlIGFuIGluZGljYXRpb24gb2YKLQkJICAgICBob3cgbXVjaCBtYWNybyBuZXN0aW5nIGlzIGludm9sdmVkIGF0IHRoaXMgcG9pbnQuICAqLwotCQkgIGxlbiA9IHMgLSAoaW5wdXRfbGluZV9wb2ludGVyLTEpOwotCQkgIGNvcHkgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyBtYWNyb19uZXN0ICsgMik7Ci0JCSAgbWVtc2V0IChjb3B5LCAnPicsIG1hY3JvX25lc3QpOwotCQkgIGNvcHlbbWFjcm9fbmVzdF0gPSAnICc7Ci0JCSAgbWVtY3B5IChjb3B5ICsgbWFjcm9fbmVzdCArIDEsIGlucHV0X2xpbmVfcG9pbnRlci0xLCBsZW4pOwotCQkgIGNvcHlbbWFjcm9fbmVzdCsxK2xlbl0gPSAnXDAnOwotCi0JCSAgLyogSW5zdGFsbCB0aGUgbGluZSB3aXRoIHRoZSBsaXN0aW5nIGZhY2lsaXR5LiAgKi8KLQkJICBsaXN0aW5nX25ld2xpbmUgKGNvcHkpOwotCQl9Ci0JICAgICAgZWxzZQotCQlsaXN0aW5nX25ld2xpbmUgKE5VTEwpOwotCSAgICB9Ci0jZW5kaWYKLQotCSAgLyoKLQkgICAqIEMgaXMgdGhlIDFzdCBzaWduaWZpY2FudCBjaGFyYWN0ZXIuCi0JICAgKiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIGFmdGVyIHRoYXQgY2hhcmFjdGVyLgotCSAgICovCi0JICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoYykpCi0JICAgIHsKLQkgICAgICAvKiB3YW50IHVzZXItZGVmaW5lZCBsYWJlbCBvciBwc2V1ZG8vb3Bjb2RlICovCi0JICAgICAgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZICgpOwotCi0JICAgICAgcyA9IC0taW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsJLyogbmFtZSdzIGRlbGltaXRlciAqLwotCSAgICAgIC8qCi0JICAgICAgICogQyBpcyBjaGFyYWN0ZXIgYWZ0ZXIgc3ltYm9sLgotCSAgICAgICAqIFRoYXQgY2hhcmFjdGVyJ3MgcGxhY2UgaW4gdGhlIGlucHV0IGxpbmUgaXMgbm93ICdcMCcuCi0JICAgICAgICogUyBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3ltYm9sLgotCSAgICAgICAqICAgW0luIGNhc2Ugb2YgcHNldWRvLW9wLCBzLT4nLicuXQotCSAgICAgICAqIElucHV0X2xpbmVfcG9pbnRlci0+J1wwJyB3aGVyZSBjIHdhcy4KLQkgICAgICAgKi8KLQkgICAgICBpZiAoVENfU1RBUlRfTEFCRUwoYywgaW5wdXRfbGluZV9wb2ludGVyKSkKLQkJewotCQkgIGlmIChmbGFnX202OGtfbXJpKQotCQkgICAgewotCQkgICAgICBjaGFyICpyZXN0ID0gaW5wdXRfbGluZV9wb2ludGVyICsgMTsKLQotCQkgICAgICAvKiBJbiBNUkkgbW9kZSwgXHRzeW06IHNldCAwIGlzIHBlcm1pdHRlZC4gICovCi0KLQkJICAgICAgaWYgKCpyZXN0ID09ICc6JykKLQkJCSsrcmVzdDsKLQkJICAgICAgaWYgKCpyZXN0ID09ICcgJyB8fCAqcmVzdCA9PSAnXHQnKQotCQkJKytyZXN0OwotCQkgICAgICBpZiAoKHN0cm5jYXNlY21wIChyZXN0LCAiRVFVIiwgMykgPT0gMAotCQkJICAgfHwgc3RybmNhc2VjbXAgKHJlc3QsICJTRVQiLCAzKSA9PSAwKQotCQkJICAmJiAocmVzdFszXSA9PSAnICcgfHwgcmVzdFszXSA9PSAnXHQnKSkKLQkJCXsKLQkJCSAgaW5wdXRfbGluZV9wb2ludGVyID0gcmVzdCArIDM7Ci0JCQkgIGVxdWFscyAocywgMSk7Ci0JCQkgIGNvbnRpbnVlOwotCQkJfQotCQkgICAgfQotCi0JCSAgbGluZV9sYWJlbCA9IGNvbG9uIChzKTsJLyogdXNlci1kZWZpbmVkIGxhYmVsICovCi0JCSAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gJzonOwkvKiBQdXQgJzonIGJhY2sgZm9yIGVycm9yIG1lc3NhZ2VzJyBzYWtlLiAqLwotCQkgIC8qIElucHV0X2xpbmVfcG9pbnRlci0+YWZ0ZXIgJzonLiAqLwotCQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotCi0JCX0KLQkgICAgICBlbHNlIGlmIChjID09ICc9JwotCQkgICAgICAgfHwgKChjID09ICcgJyB8fCBjID09ICdcdCcpCi0JCQkgICAmJiBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJz0nCi0jaWZkZWYgVENfRVFVQUxfSU5fSU5TTgotCQkJICAgJiYgISBUQ19FUVVBTF9JTl9JTlNOIChjLCBpbnB1dF9saW5lX3BvaW50ZXIpCi0jZW5kaWYKLQkJCSAgICkpCi0JCXsKLQkJICBlcXVhbHMgKHMsIDEpOwotCQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsJCS8qIGV4cGVjdCBwc2V1ZG8tb3Agb3IgbWFjaGluZSBpbnN0cnVjdGlvbiAqLwotCQkgIHBvcCA9IE5VTEw7Ci0KLSNkZWZpbmUgSUdOT1JFX09QQ09ERV9DQVNFCi0jaWZkZWYgSUdOT1JFX09QQ09ERV9DQVNFCi0JCSAgewotCQkgICAgY2hhciAqczIgPSBzOwotCQkgICAgd2hpbGUgKCpzMikKLQkJICAgICAgewotCQkJaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSAqczIpKQotCQkJICAqczIgPSB0b2xvd2VyICgqczIpOwotCQkJczIrKzsKLQkJICAgICAgfQotCQkgIH0KLSNlbmRpZgotCi0JCSAgaWYgKGZsYWdfbTY4a19tcmkKLSNpZmRlZiBOT19QU0VVRE9fRE9UCi0JCSAgICAgIHx8IDEKLSNlbmRpZgotCQkgICAgICApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBNUkkgYXNzZW1ibGVyIGFuZCB0aGUgbTg4ayB1c2UgcHNldWRvLW9wcwotICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgYSBwZXJpb2QuICAqLwotCQkgICAgICBwb3AgPSAocHNldWRvX3R5cGVTICopIGhhc2hfZmluZCAocG9faGFzaCwgcyk7Ci0JCSAgICAgIGlmIChwb3AgIT0gTlVMTCAmJiBwb3AtPnBvY19oYW5kbGVyID09IE5VTEwpCi0JCQlwb3AgPSBOVUxMOwotCQkgICAgfQotCi0JCSAgaWYgKHBvcCAhPSBOVUxMCi0JCSAgICAgIHx8ICghIGZsYWdfbTY4a19tcmkgJiYgKnMgPT0gJy4nKSkKLQkJICAgIHsKLQkJICAgICAgLyoKLQkJICAgICAgICogUFNFVURPIC0gT1AuCi0JCSAgICAgICAqCi0JCSAgICAgICAqIFdBUk5JTkc6IGMgaGFzIG5leHQgY2hhciwgd2hpY2ggbWF5IGJlIGVuZC1vZi1saW5lLgotCQkgICAgICAgKiBXZSBsb29rdXAgdGhlIHBzZXVkby1vcCB0YWJsZSB3aXRoIHMrMSBiZWNhdXNlIHdlCi0JCSAgICAgICAqIGFscmVhZHkga25vdyB0aGF0IHRoZSBwc2V1ZG8tb3AgYmVnaW5zIHdpdGggYSAnLicuCi0JCSAgICAgICAqLwotCi0JCSAgICAgIGlmIChwb3AgPT0gTlVMTCkKLQkJCXBvcCA9IChwc2V1ZG9fdHlwZVMgKikgaGFzaF9maW5kIChwb19oYXNoLCBzICsgMSk7Ci0KLQkJICAgICAgLyogSW4gTVJJIG1vZGUsIHdlIG1heSBuZWVkIHRvIGluc2VydCBhbgotICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpYyBhbGlnbm1lbnQgZGlyZWN0aXZlLiAgV2hhdCBhIGhhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzLiAgKi8KLQkJICAgICAgaWYgKG1yaV9wZW5kaW5nX2FsaWduCi0JCQkgICYmIChwb3AgPT0gTlVMTAotCQkJICAgICAgfHwgISAoKHBvcC0+cG9jX2hhbmRsZXIgPT0gY29ucwotCQkJCSAgICAgJiYgcG9wLT5wb2NfdmFsID09IDEpCi0JCQkJICAgIHx8IChwb3AtPnBvY19oYW5kbGVyID09IHNfc3BhY2UKLQkJCQkJJiYgcG9wLT5wb2NfdmFsID09IDEpCi0jaWZkZWYgdGNfY29uZGl0aW9uYWxfcHNldWRvb3AKLQkJCQkgICAgfHwgdGNfY29uZGl0aW9uYWxfcHNldWRvb3AgKHBvcCkKLSNlbmRpZgotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfaWYKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2lmZGVmCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19pZmMKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2lmZXFzCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19lbHNlCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19lbmRpZgotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfZ2xvYmwKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2lnbm9yZSkpKQotCQkJewotCQkJICBkb19hbGlnbiAoMSwgKGNoYXIgKikgTlVMTCwgMCwgMCk7Ci0JCQkgIG1yaV9wZW5kaW5nX2FsaWduID0gMDsKLQkJCSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLQkJCSAgICB7Ci0JCQkgICAgICBzeW1ib2xfc2V0X2ZyYWcgKGxpbmVfbGFiZWwsIGZyYWdfbm93KTsKLQkJCSAgICAgIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCBmcmFnX25vd19maXggKCkpOwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICAvKiBQcmludCB0aGUgZXJyb3IgbXNnIG5vdywgd2hpbGUgd2Ugc3RpbGwgY2FuICovCi0JCSAgICAgIGlmIChwb3AgPT0gTlVMTCkKLQkJCXsKLQkJCSAgYXNfYmFkIChfKCJVbmtub3duIHBzZXVkby1vcDogIGAlcyciKSwgcyk7Ci0JCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkJICBzX2lnbm9yZSAoMCk7Ci0JCQkgIGNvbnRpbnVlOwotCQkJfQotCi0JCSAgICAgIC8qIFB1dCBpdCBiYWNrIGZvciBlcnJvciBtZXNzYWdlcyBldGMuICovCi0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgICAvKiBUaGUgZm9sbG93aW5nIHNraXAgb2Ygd2hpdGVzcGFjZSBpcyBjb21wdWxzb3J5LgotCQkJIEEgd2VsbCBzaGFwZWQgc3BhY2UgaXMgc29tZXRpbWVzIGFsbCB0aGF0IHNlcGFyYXRlcwotCQkJIGtleXdvcmQgZnJvbSBvcGVyYW5kcy4gKi8KLQkJICAgICAgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykKLQkJCWlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgICAgICAvKgotCQkgICAgICAgKiBJbnB1dF9saW5lIGlzIHJlc3RvcmVkLgotCQkgICAgICAgKiBJbnB1dF9saW5lX3BvaW50ZXItPjFzdCBub24tYmxhbmsgY2hhcgotCQkgICAgICAgKiBhZnRlciBwc2V1ZG8tb3BlcmF0aW9uLgotCQkgICAgICAgKi8KLQkJICAgICAgKCpwb3AtPnBvY19oYW5kbGVyKSAocG9wLT5wb2NfdmFsKTsKLQotCQkgICAgICAvKiBJZiB0aGF0IHdhcyAuZW5kLCBqdXN0IGdldCBvdXQgbm93LiAgKi8KLQkJICAgICAgaWYgKHBvcC0+cG9jX2hhbmRsZXIgPT0gc19lbmQpCi0JCQlnb3RvIHF1aXQ7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpbnQgaW5xdW90ZSA9IDA7Ci0jaWZkZWYgUVVPVEVTX0lOX0lOU04KLQkJICAgICAgaW50IGluZXNjYXBlID0gMDsKLSNlbmRpZgotCi0JCSAgICAgIC8qIFdBUk5JTkc6IGMgaGFzIGNoYXIsIHdoaWNoIG1heSBiZSBlbmQtb2YtbGluZS4gKi8KLQkJICAgICAgLyogQWxzbzogaW5wdXRfbGluZV9wb2ludGVyLT5gXDBgIHdoZXJlIGMgd2FzLiAqLwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgICAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0KLQkJCSAgICAgfHwgaW5xdW90ZQotI2lmZGVmIFRDX0VPTF9JTl9JTlNOCi0JCQkgICAgIHx8IFRDX0VPTF9JTl9JTlNOIChpbnB1dF9saW5lX3BvaW50ZXIpCi0jZW5kaWYKLQkJCSAgICAgKQotCQkJewotCQkJICBpZiAoZmxhZ19tNjhrX21yaSAmJiAqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycpCi0JCQkgICAgaW5xdW90ZSA9ICEgaW5xdW90ZTsKLSNpZmRlZiBRVU9URVNfSU5fSU5TTgotCQkJICBpZiAoaW5lc2NhcGUpCi0JCQkgICAgaW5lc2NhcGUgPSAwOwotCQkJICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICciJykKLQkJCSAgICBpbnF1b3RlID0gISBpbnF1b3RlOwotCQkJICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcXCcpCi0JCQkgICAgaW5lc2NhcGUgPSAxOwotI2VuZGlmCi0JCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkJfQotCi0JCSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQotCQkgICAgICBnZW5lcmF0ZV9saW5lbm9fZGVidWcgKCk7Ci0KLQkJICAgICAgaWYgKG1hY3JvX2RlZmluZWQpCi0JCQl7Ci0JCQkgIHNiIG91dDsKLQkJCSAgY29uc3QgY2hhciAqZXJyOwotCi0JCQkgIGlmIChjaGVja19tYWNybyAocywgJm91dCwgJ1wwJywgJmVycikpCi0JCQkgICAgewotCQkJICAgICAgaWYgKGVyciAhPSBOVUxMKQotCQkJCWFzX2JhZCAoZXJyKTsKLQkJCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIrKyA9IGM7Ci0JCQkgICAgICBpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiICgmb3V0LAotCQkJCQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyKTsKLQkJCSAgICAgIHNiX2tpbGwgKCZvdXQpOwotCQkJICAgICAgYnVmZmVyX2xpbWl0ID0KLQkJCQlpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci0JCQkgICAgICBjb250aW51ZTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgaWYgKG1yaV9wZW5kaW5nX2FsaWduKQotCQkJewotCQkJICBkb19hbGlnbiAoMSwgKGNoYXIgKikgTlVMTCwgMCwgMCk7Ci0JCQkgIG1yaV9wZW5kaW5nX2FsaWduID0gMDsKLQkJCSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLQkJCSAgICB7Ci0JCQkgICAgICBzeW1ib2xfc2V0X2ZyYWcgKGxpbmVfbGFiZWwsIGZyYWdfbm93KTsKLQkJCSAgICAgIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCBmcmFnX25vd19maXggKCkpOwotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBtZF9hc3NlbWJsZSAocyk7CS8qIEFzc2VtYmxlIDEgaW5zdHJ1Y3Rpb24uICovCi0KLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gYzsKLQotCQkgICAgICAvKiBXZSByZXN1bWUgbG9vcCBBRlRFUiB0aGUgZW5kLW9mLWxpbmUgZnJvbQotCQkJIHRoaXMgaW5zdHJ1Y3Rpb24uICovCi0JCSAgICB9CQkvKiBpZiAoKnM9PScuJykgKi8KLQkJfQkJLyogaWYgYz09JzonICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0JCQkvKiBpZiAoaXNfbmFtZV9iZWdpbm5lcihjKSAqLwotCi0KLQkgIC8qIEVtcHR5IHN0YXRlbWVudD8gICovCi0JICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGNdKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKChMT0NBTF9MQUJFTFNfRE9MTEFSIHx8IExPQ0FMX0xBQkVMU19GQikKLQkgICAgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYykpCi0JICAgIHsKLQkgICAgICAvKiBsb2NhbCBsYWJlbCAgKCI0OiIpICovCi0JICAgICAgY2hhciAqYmFja3VwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0JICAgICAgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZICgpOwotCi0JICAgICAgdGVtcCA9IGMgLSAnMCc7Ci0KLQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotCQl7Ci0JCSAgdGVtcCA9ICh0ZW1wICogMTApICsgKmlucHV0X2xpbmVfcG9pbnRlciAtICcwJzsKLQkJICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkJfQkJLyogcmVhZCB0aGUgd2hvbGUgbnVtYmVyICovCi0KLQkgICAgICBpZiAoTE9DQUxfTEFCRUxTX0RPTExBUgotCQkgICYmICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyQnCi0JCSAgJiYgKihpbnB1dF9saW5lX3BvaW50ZXIgKyAxKSA9PSAnOicpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQotCQkgIGlmIChkb2xsYXJfbGFiZWxfZGVmaW5lZCAodGVtcCkpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2ZhdGFsIChfKCJsYWJlbCBcIiVkJFwiIHJlZGVmaW5lZCIpLCB0ZW1wKTsKLQkJICAgIH0KLQotCQkgIGRlZmluZV9kb2xsYXJfbGFiZWwgKHRlbXApOwotCQkgIGNvbG9uIChkb2xsYXJfbGFiZWxfbmFtZSAodGVtcCwgMCkpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpZiAoTE9DQUxfTEFCRUxTX0ZCCi0JCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICc6JykKLQkJewotCQkgIGZiX2xhYmVsX2luc3RhbmNlX2luYyAodGVtcCk7Ci0JCSAgY29sb24gKGZiX2xhYmVsX25hbWUgKHRlbXAsIDApKTsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gYmFja3VwOwotCSAgICB9CQkJLyogbG9jYWwgbGFiZWwgICgiNDoiKSAqLwotCi0JICBpZiAoYyAmJiBzdHJjaHIgKGxpbmVfY29tbWVudF9jaGFycywgYykpCi0JICAgIHsJCQkvKiBJdHMgYSBjb21tZW50LiAgQmV0dGVyIHNheSBBUFAgb3IgTk9fQVBQICovCi0JICAgICAgY2hhciAqZW5kczsKLQkgICAgICBjaGFyICpuZXdfYnVmOwotCSAgICAgIGNoYXIgKm5ld190bXA7Ci0JICAgICAgdW5zaWduZWQgaW50IG5ld19sZW5ndGg7Ci0JICAgICAgY2hhciAqdG1wX2J1ZiA9IDA7Ci0KLQkgICAgICBidW1wX2xpbmVfY291bnRlcnMgKCk7Ci0JICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpZiAoc3RybmNtcCAocywgIkFQUFxuIiwgNCkpCi0JCWNvbnRpbnVlOwkvKiBXZSBpZ25vcmUgaXQgKi8KLQkgICAgICBzICs9IDQ7Ci0KLQkgICAgICBlbmRzID0gc3Ryc3RyIChzLCAiI05PX0FQUFxuIik7Ci0KLQkgICAgICBpZiAoIWVuZHMpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgdG1wX2xlbjsKLQkJICB1bnNpZ25lZCBpbnQgbnVtOwotCi0JCSAgLyogVGhlIGVuZCBvZiB0aGUgI0FQUCB3YXNuJ3QgaW4gdGhpcyBidWZmZXIuICBXZQotCQkgICAgIGtlZXAgcmVhZGluZyBpbiBidWZmZXJzIHVudGlsIHdlIGZpbmQgdGhlICNOT19BUFAKLQkJICAgICB0aGF0IGdvZXMgd2l0aCB0aGlzICNBUFAgIFRoZXJlIGlzIG9uZS4gIFRoZSBzcGVjcwotCQkgICAgIGd1YXJlbnRlZSBpdC4gLiAuICovCi0JCSAgdG1wX2xlbiA9IGJ1ZmZlcl9saW1pdCAtIHM7Ci0JCSAgdG1wX2J1ZiA9IHhtYWxsb2MgKHRtcF9sZW4gKyAxKTsKLQkJICBtZW1jcHkgKHRtcF9idWYsIHMsIHRtcF9sZW4pOwotCQkgIGRvCi0JCSAgICB7Ci0JCSAgICAgIG5ld190bXAgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmJ1ZmZlcik7Ci0JCSAgICAgIGlmICghbmV3X3RtcCkKLQkJCWJyZWFrOwotCQkgICAgICBlbHNlCi0JCQlidWZmZXJfbGltaXQgPSBuZXdfdG1wOwotCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWZmZXI7Ci0JCSAgICAgIGVuZHMgPSBzdHJzdHIgKGJ1ZmZlciwgIiNOT19BUFBcbiIpOwotCQkgICAgICBpZiAoZW5kcykKLQkJCW51bSA9IGVuZHMgLSBidWZmZXI7Ci0JCSAgICAgIGVsc2UKLQkJCW51bSA9IGJ1ZmZlcl9saW1pdCAtIGJ1ZmZlcjsKLQotCQkgICAgICB0bXBfYnVmID0geHJlYWxsb2MgKHRtcF9idWYsIHRtcF9sZW4gKyBudW0pOwotCQkgICAgICBtZW1jcHkgKHRtcF9idWYgKyB0bXBfbGVuLCBidWZmZXIsIG51bSk7Ci0JCSAgICAgIHRtcF9sZW4gKz0gbnVtOwotCQkgICAgfQotCQkgIHdoaWxlICghZW5kcyk7Ci0KLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRzID8gZW5kcyArIDggOiBOVUxMOwotCi0JCSAgcyA9IHRtcF9idWY7Ci0JCSAgZW5kcyA9IHMgKyB0bXBfbGVuOwotCi0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRzICsgODsKLQkJfQotCi0JICAgICAgc2NydWJfc3RyaW5nID0gczsKLQkgICAgICBzY3J1Yl9zdHJpbmdfZW5kID0gZW5kczsKLQotCSAgICAgIG5ld19sZW5ndGggPSBlbmRzIC0gczsKLQkgICAgICBuZXdfYnVmID0gKGNoYXIgKikgeG1hbGxvYyAobmV3X2xlbmd0aCk7Ci0JICAgICAgbmV3X3RtcCA9IG5ld19idWY7Ci0JICAgICAgZm9yICg7OykKLQkJewotCQkgIGludCBzcGFjZTsKLQkJICBpbnQgc2l6ZTsKLQotCQkgIHNwYWNlID0gKG5ld19idWYgKyBuZXdfbGVuZ3RoKSAtIG5ld190bXA7Ci0JCSAgc2l6ZSA9IGRvX3NjcnViX2NoYXJzIChzY3J1Yl9mcm9tX3N0cmluZywgbmV3X3RtcCwgc3BhY2UpOwotCi0JCSAgaWYgKHNpemUgPCBzcGFjZSkKLQkJICAgIHsKLQkJICAgICAgbmV3X3RtcCArPSBzaXplOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQotCQkgIG5ld19idWYgPSB4cmVhbGxvYyAobmV3X2J1ZiwgbmV3X2xlbmd0aCArIDEwMCk7Ci0JCSAgbmV3X3RtcCA9IG5ld19idWYgKyBuZXdfbGVuZ3RoOwotCQkgIG5ld19sZW5ndGggKz0gMTAwOwotCQl9Ci0KLQkgICAgICBpZiAodG1wX2J1ZikKLQkJZnJlZSAodG1wX2J1Zik7Ci0JICAgICAgb2xkX2J1ZmZlciA9IGJ1ZmZlcjsKLQkgICAgICBvbGRfaW5wdXQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgb2xkX2xpbWl0ID0gYnVmZmVyX2xpbWl0OwotCSAgICAgIGJ1ZmZlciA9IG5ld19idWY7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gbmV3X2J1ZjsKLQkgICAgICBidWZmZXJfbGltaXQgPSBuZXdfdG1wOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSAoKTsKLQotI2lmZGVmIHRjX3VucmVjb2duaXplZF9saW5lCi0JICBpZiAodGNfdW5yZWNvZ25pemVkX2xpbmUgKGMpKQotCSAgICBjb250aW51ZTsKLSNlbmRpZgotCi0JICAvKiBhc193YXJuKCJKdW5rIGNoYXJhY3RlciAlZC4iLGMpOyAgTm93IGRvbmUgYnkgaWdub3JlX3Jlc3QgKi8KLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwkvKiBSZXBvcnQgdW5rbm93biBjaGFyIGFzIGlnbm9yZWQuICovCi0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCX0JCQkvKiB3aGlsZSAoaW5wdXRfbGluZV9wb2ludGVyPGJ1ZmZlcl9saW1pdCkgKi8KLQotI2lmZGVmIG1kX2FmdGVyX3Bhc3NfaG9vawotICAgICAgbWRfYWZ0ZXJfcGFzc19ob29rICgpOwotI2VuZGlmCi0KLSAgICAgIGlmIChvbGRfYnVmZmVyKQotCXsKLQkgIGZyZWUgKGJ1ZmZlcik7Ci0JICBidW1wX2xpbmVfY291bnRlcnMgKCk7Ci0JICBpZiAob2xkX2lucHV0ICE9IDApCi0JICAgIHsKLQkgICAgICBidWZmZXIgPSBvbGRfYnVmZmVyOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZF9pbnB1dDsKLQkgICAgICBidWZmZXJfbGltaXQgPSBvbGRfbGltaXQ7Ci0JICAgICAgb2xkX2J1ZmZlciA9IDA7Ci0JICAgICAgZ290byBjb250aW47Ci0JICAgIH0KLQl9Ci0gICAgfQkJCQkvKiB3aGlsZSAobW9yZSBidWZmZXJzIHRvIHNjYW4pICovCi0KLSBxdWl0OgotCi0jaWZkZWYgbWRfY2xlYW51cAotICBtZF9jbGVhbnVwKCk7Ci0jZW5kaWYKLSAgaW5wdXRfc2NydWJfY2xvc2UgKCk7CQkvKiBDbG9zZSB0aGUgaW5wdXQgZmlsZSAqLwotfQotCi0vKiBGb3IgbW9zdCBNUkkgcHNldWRvLW9wcywgdGhlIGxpbmUgYWN0dWFsbHkgZW5kcyBhdCB0aGUgZmlyc3QKLSAgIG5vbnF1b3RlZCBzcGFjZS4gIFRoaXMgZnVuY3Rpb24gbG9va3MgZm9yIHRoYXQgcG9pbnQsIHN0dWZmcyBhIG51bGwKLSAgIGluLCBhbmQgc2V0cyAqU1RPUENQIHRvIHRoZSBjaGFyYWN0ZXIgdGhhdCB1c2VkIHRvIGJlIHRoZXJlLCBhbmQKLSAgIHJldHVybnMgdGhlIGxvY2F0aW9uLgotCi0gICBVbnRpbCBJIGhlYXIgb3RoZXJ3aXNlLCBJIGFtIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoaXMgaXMgb25seSB0cnVlCi0gICBmb3IgdGhlIG02OGsgTVJJIGFzc2VtYmxlci4gICovCi0KLWNoYXIgKgotbXJpX2NvbW1lbnRfZmllbGQgKHN0b3BjcCkKLSAgICAgY2hhciAqc3RvcGNwOwotewotI2lmZGVmIFRDX002OEsKLQotICBjaGFyICpzOwotICBpbnQgaW5xdW90ZSA9IDA7Ci0KLSAga25vdyAoZmxhZ19tNjhrX21yaSk7Ci0KLSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgICgoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotCXx8IGlucXVvdGUpOwotICAgICAgIHMrKykKLSAgICB7Ci0gICAgICBpZiAoKnMgPT0gJ1wnJykKLQlpbnF1b3RlID0gISBpbnF1b3RlOwotICAgIH0KLSAgKnN0b3BjcCA9ICpzOwotICAqcyA9ICdcMCc7Ci0gIHJldHVybiBzOwotCi0jZWxzZQotCi0gIGNoYXIgKnM7Ci0KLSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc107IHMrKykKLSAgICA7Ci0gICpzdG9wY3AgPSAqczsKLSAgKnMgPSAnXDAnOwotICByZXR1cm4gczsKLQotI2VuZGlmCi0KLX0KLQotLyogU2tpcCB0byB0aGUgZW5kIG9mIGFuIE1SSSBjb21tZW50IGZpZWxkLiAgKi8KLQotdm9pZAotbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYykKLSAgICAgY2hhciAqc3RvcDsKLSAgICAgaW50IHN0b3BjOwotewotICBrbm93IChmbGFnX21yaSk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RvcDsKLSAgKnN0b3AgPSBzdG9wYzsKLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotfQotCi12b2lkIAotc19hYm9ydCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGFzX2ZhdGFsIChfKCIuYWJvcnQgZGV0ZWN0ZWQuICBBYmFuZG9uaW5nIHNoaXAuIikpOwotfQotCi0vKiBHdXRzIG9mIC5hbGlnbiBkaXJlY3RpdmUuICBOIGlzIHRoZSBwb3dlciBvZiB0d28gdG8gd2hpY2ggdG8gYWxpZ24uCi0gICBGSUxMIG1heSBiZSBOVUxMLCBvciBpdCBtYXkgcG9pbnQgdG8gdGhlIGJ5dGVzIG9mIHRoZSBmaWxsIHBhdHRlcm4uCi0gICBMRU4gaXMgdGhlIGxlbmd0aCBvZiB3aGF0ZXZlciBGSUxMIHBvaW50cyB0bywgaWYgYW55dGhpbmcuICBNQVggaXMKLSAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAgd2hlbiBkb2luZyB0aGUgYWxpZ25tZW50LAotICAgb3IgMCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLiAgKi8KLQotc3RhdGljIHZvaWQgCi1kb19hbGlnbiAobiwgZmlsbCwgbGVuLCBtYXgpCi0gICAgIGludCBuOwotICAgICBjaGFyICpmaWxsOwotICAgICBpbnQgbGVuOwotICAgICBpbnQgbWF4OwotewotICBjaGFyIGRlZmF1bHRfZmlsbDsKLQotI2lmZGVmIG1kX2RvX2FsaWduCi0gIG1kX2RvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCwganVzdF9yZWNvcmRfYWxpZ25tZW50KTsKLSNlbmRpZgotCi0gIGlmIChmaWxsID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKHN1YnNlZ190ZXh0X3AgKG5vd19zZWcpKQotCWRlZmF1bHRfZmlsbCA9IE5PUF9PUENPREU7Ci0gICAgICBlbHNlCi0JZGVmYXVsdF9maWxsID0gMDsKLSAgICAgIGZpbGwgPSAmZGVmYXVsdF9maWxsOwotICAgICAgbGVuID0gMTsKLSAgICB9Ci0KLSAgLyogT25seSBtYWtlIGEgZnJhZyBpZiB3ZSBIQVZFIHRvLiAuIC4gKi8KLSAgaWYgKG4gIT0gMCAmJiAhbmVlZF9wYXNzXzIpCi0gICAgewotICAgICAgaWYgKGxlbiA8PSAxKQotCWZyYWdfYWxpZ24gKG4sICpmaWxsLCBtYXgpOwotICAgICAgZWxzZQotCWZyYWdfYWxpZ25fcGF0dGVybiAobiwgZmlsbCwgbGVuLCBtYXgpOwotICAgIH0KLQotI2lmZGVmIG1kX2RvX2FsaWduCi0ganVzdF9yZWNvcmRfYWxpZ25tZW50OgotI2VuZGlmCi0KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgbik7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmFsaWduIHBzZXVkby1vcC4gIEEgcG9zaXRpdmUgQVJHIGlzIGEgZGVmYXVsdCBhbGlnbm1lbnQKLSAgIChpbiBieXRlcykuICBBIG5lZ2F0aXZlIEFSRyBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIGxlbmd0aCBvZiB0aGUKLSAgIGZpbGwgcGF0dGVybi4gIEJZVEVTX1AgaXMgbm9uLXplcm8gaWYgdGhlIGFsaWdubWVudCB2YWx1ZSBzaG91bGQgYmUKLSAgIGludGVycHJldGVkIGFzIHRoZSBieXRlIGJvdW5kYXJ5LCByYXRoZXIgdGhhbiB0aGUgcG93ZXIgb2YgMi4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FsaWduIChhcmcsIGJ5dGVzX3ApCi0gICAgIGludCBhcmc7Ci0gICAgIGludCBieXRlc19wOwotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYWxpZ247Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotICBvZmZzZXRUIGZpbGwgPSAwOwotICBpbnQgbWF4OwotICBpbnQgZmlsbF9wOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpZiAoYXJnIDwgMCkKLQlhbGlnbiA9IDA7Ci0gICAgICBlbHNlCi0JYWxpZ24gPSBhcmc7CS8qIERlZmF1bHQgdmFsdWUgZnJvbSBwc2V1ZG8tb3AgdGFibGUgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLQotICBpZiAoYnl0ZXNfcCkKLSAgICB7Ci0gICAgICAvKiBDb252ZXJ0IHRvIGEgcG93ZXIgb2YgMi4gICovCi0gICAgICBpZiAoYWxpZ24gIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQotCSAgZm9yIChpID0gMDsgKGFsaWduICYgMSkgPT0gMDsgYWxpZ24gPj49IDEsICsraSkKLQkgICAgOwotCSAgaWYgKGFsaWduICE9IDEpCi0JICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JICBhbGlnbiA9IGk7Ci0JfQotICAgIH0KLQotICBpZiAoYWxpZ24gPiAxNSkKLSAgICB7Ci0gICAgICBhbGlnbiA9IDE1OwotICAgICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAldSBhc3N1bWVkIiksIGFsaWduKTsKLSAgICB9Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGZpbGxfcCA9IDA7Ci0gICAgICBtYXggPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCWZpbGxfcCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgZmlsbF9wID0gMTsKLQl9Ci0KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQltYXggPSAwOwotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgbWF4ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JfQotICAgIH0KLQotICBpZiAoISBmaWxsX3ApCi0gICAgewotICAgICAgaWYgKGFyZyA8IDApCi0JYXNfd2FybiAoXygiZXhwZWN0ZWQgZmlsbCBwYXR0ZXJuIG1pc3NpbmciKSk7Ci0gICAgICBkb19hbGlnbiAoYWxpZ24sIChjaGFyICopIE5VTEwsIDAsIG1heCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IGZpbGxfbGVuOwotCi0gICAgICBpZiAoYXJnID49IDApCi0JZmlsbF9sZW4gPSAxOwotICAgICAgZWxzZQotCWZpbGxfbGVuID0gLSBhcmc7Ci0gICAgICBpZiAoZmlsbF9sZW4gPD0gMSkKLQl7Ci0JICBjaGFyIGZpbGxfY2hhcjsKLQotCSAgZmlsbF9jaGFyID0gZmlsbDsKLQkgIGRvX2FsaWduIChhbGlnbiwgJmZpbGxfY2hhciwgZmlsbF9sZW4sIG1heCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgYWJbMTZdOwotCi0JICBpZiAoKHNpemVfdCkgZmlsbF9sZW4gPiBzaXplb2YgYWIpCi0JICAgIGFib3J0ICgpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChhYiwgZmlsbCwgZmlsbF9sZW4pOwotCSAgZG9fYWxpZ24gKGFsaWduLCBhYiwgZmlsbF9sZW4sIG1heCk7Ci0JfQotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wIG9uIG1hY2hpbmVzIHdoZXJlICIuYWxpZ24gNCIgbWVhbnMKLSAgIGFsaWduIHRvIGEgNCBieXRlIGJvdW5kYXJ5LiAgKi8KLQotdm9pZCAKLXNfYWxpZ25fYnl0ZXMgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgc19hbGlnbiAoYXJnLCAxKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wIG9uIG1hY2hpbmVzIHdoZXJlICIuYWxpZ24gNCIgbWVhbnMgYWxpZ24KLSAgIHRvIGEgMioqNCBib3VuZGFyeS4gICovCi0KLXZvaWQgCi1zX2FsaWduX3B0d28gKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgc19hbGlnbiAoYXJnLCAwKTsKLX0KLQotdm9pZCAKLXNfY29tbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgYzsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgb2Zmc2V0VCB0ZW1wOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZTogcmVzdCBvZiBsaW5lIGlnbm9yZWQuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGlmIChmbGFnX21yaSkKLQltcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgdGVtcCkKLQlhc19iYWQgKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkJU19HRVRfTkFNRSAoc3ltYm9sUCksCi0JCShsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCi0JCShsb25nKSB0ZW1wKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgdGVtcCk7Ci0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgfQotI2lmZGVmIE9CSl9WTVMKLSAgewotICAgIGV4dGVybiBpbnQgZmxhZ19vbmU7Ci0gICAgaWYgKCAoIXRlbXApIHx8ICFmbGFnX29uZSkKLSAgICAgIFNfR0VUX09USEVSKHN5bWJvbFApID0gY29uc3RfZmxhZzsKLSAgfQotI2VuZGlmIC8qIG5vdCBPQkpfVk1TICovCi0gIGtub3cgKHN5bWJvbFAtPnN5X2ZyYWcgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0JCQkJLyogc19jb21tKCkgKi8KLQotLyogVGhlIE1SSSBDT01NT04gcHNldWRvLW9wLiAgV2UgaGFuZGxlIHRoaXMgYnkgY3JlYXRpbmcgYSBjb21tb24KLSAgIHN5bWJvbCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBuYW1lLiAgV2UgbWFrZSBzX3NwYWNlIGRvIHRoZSByaWdodAotICAgdGhpbmcgYnkgaW5jcmVhc2luZyB0aGUgc2l6ZS4gICovCi0KLXZvaWQKLXNfbXJpX2NvbW1vbiAoc21hbGwpCi0gICAgIGludCBzbWFsbCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKmFsYyA9IE5VTEw7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgb2Zmc2V0VCBhbGlnbjsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKCEgZmxhZ19tcmkpCi0gICAgewotICAgICAgc19jb21tICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKm5hbWUpKQotICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGRvCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotCi0gICAgICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCXsKLQkgIGFsYyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoU19HRVRfTkFNRSAobGluZV9sYWJlbCkpCi0JCQkJICArIChpbnB1dF9saW5lX3BvaW50ZXIgLSBuYW1lKQotCQkJCSAgKyAxKTsKLQkgIHNwcmludGYgKGFsYywgIiVzJXMiLCBuYW1lLCBTX0dFVF9OQU1FIChsaW5lX2xhYmVsKSk7Ci0JICBuYW1lID0gYWxjOwotCX0KLSAgICB9Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBpZiAoYWxjICE9IE5VTEwpCi0gICAgZnJlZSAoYWxjKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgYWxpZ24gPSAwOwotICBlbHNlCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLQotICBpZiAoU19JU19ERUZJTkVEIChzeW0pICYmICEgU19JU19DT01NT04gKHN5bSkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgYCVzJyIpLCBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgU19TRVRfRVhURVJOQUwgKHN5bSk7Ci0gIG1yaV9jb21tb25fc3ltYm9sID0gc3ltOwotCi0jaWZkZWYgU19TRVRfQUxJR04KLSAgaWYgKGFsaWduICE9IDApCi0gICAgU19TRVRfQUxJR04gKHN5bSwgYWxpZ24pOwotI2VuZGlmCi0KLSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBleHA7Ci0gICAgICBleHAuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgZXhwLlhfYWRkX3N5bWJvbCA9IHN5bTsKLSAgICAgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChsaW5lX2xhYmVsLCAmZXhwKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKGxpbmVfbGFiZWwsIGV4cHJfc2VjdGlvbik7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBXZSBqdXN0IGlnbm9yZSB0aGUgc21hbGwgYXJndW1lbnQsIHdoaWNoIGRpc3Rpbmd1aXNoZXMKLSAgICAgQ09NTU9OIGFuZCBDT01NT04uUy4gIEkgZG9uJ3Qga25vdyB3aGF0IHdlIGNhbiBkbyBhYm91dCBpdC4gICovCi0KLSAgLyogSWdub3JlIHRoZSB0eXBlIGFuZCBocHR5cGUuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi12b2lkCi1zX2RhdGEgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzZWdUIHNlY3Rpb247Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIHNlY3Rpb24gPSB0ZXh0X3NlY3Rpb247Ci0gICAgICB0ZW1wICs9IDEwMDA7Ci0gICAgfQotICBlbHNlCi0gICAgc2VjdGlvbiA9IGRhdGFfc2VjdGlvbjsKLQotICBzdWJzZWdfc2V0IChzZWN0aW9uLCAoc3Vic2VnVCkgdGVtcCk7Ci0KLSNpZmRlZiBPQkpfVk1TCi0gIGNvbnN0X2ZsYWcgPSAwOwotI2VuZGlmCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmFwcGZpbGUgcHNldWRvLW9wLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieQotICAgZG9fc2NydWJfY2hhcnMgd2hlbiBhIHByZXByb2Nlc3NvciAjIGxpbmUgY29tbWVudCBpcyBzZWVuIHdpdGggYQotICAgZmlsZSBuYW1lLiAgVGhpcyBkZWZhdWx0IGRlZmluaXRpb24gbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIG9iamVjdAotICAgb3IgQ1BVIHNwZWNpZmljIHBzZXVkby1vcHMuICBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdGhlIGRlZmF1bHQKLSAgIGRlZmluaXRpb24gZm9yIC5maWxlOyB0aGUgQVBQRklMRSBhcmd1bWVudCBpcyAxIGZvciAuYXBwZmlsZSwgMCBmb3IKLSAgIC5maWxlLiAgKi8KLQotdm9pZCAKLXNfYXBwX2ZpbGUgKGFwcGZpbGUpCi0gICAgIGludCBhcHBmaWxlOwotewotICByZWdpc3RlciBjaGFyICpzOwotICBpbnQgbGVuZ3RoOwotCi0gIC8qIFNvbWUgYXNzZW1ibGVycyB0b2xlcmF0ZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgJyInICovCi0gIGlmICgocyA9IGRlbWFuZF9jb3B5X3N0cmluZyAoJmxlbmd0aCkpICE9IDApCi0gICAgewotICAgICAgLyogSWYgdGhpcyBpcyBhIGZha2UgLmFwcGZpbGUsIGEgZmFrZSBuZXdsaW5lIHdhcyBpbnNlcnRlZCBpbnRvCi0JIHRoZSBidWZmZXIuICBQYXNzaW5nIC0yIHRvIG5ld19sb2dpY2FsX2xpbmUgdGVsbHMgaXQgdG8KLQkgYWNjb3VudCBmb3IgaXQuICAqLwotICAgICAgaW50IG1heV9vbWl0Ci0JPSAoISBuZXdfbG9naWNhbF9saW5lIChzLCBhcHBmaWxlID8gLTIgOiAtMSkgJiYgYXBwZmlsZSk7Ci0KLSAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGUgcHJlcHJvY2Vzc29yIG1heSBoYXZlIGluc2VydGVkIGFuIGV4dHJhbmVvdXMKLSAgICAgICAgIGJhY2txdW90ZS4gICovCi0gICAgICBpZiAoZmxhZ19tNjhrX21yaQotCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnCi0JICAmJiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGlmICghIG1heV9vbWl0KQotCXsKLSNpZmRlZiBMSVNUSU5HCi0JICBpZiAobGlzdGluZykKLQkgICAgbGlzdGluZ19zb3VyY2VfZmlsZSAocyk7Ci0jZW5kaWYKLQkgIHJlZ2lzdGVyX2RlcGVuZGVuY3kgKHMpOwotI2lmZGVmIG9ial9hcHBfZmlsZQotCSAgb2JqX2FwcF9maWxlIChzKTsKLSNlbmRpZgotCX0KLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmFwcGxpbmUgcHNldWRvLW9wLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieQotICAgZG9fc2NydWJfY2hhcnMgd2hlbiBhIHByZXByb2Nlc3NvciAjIGxpbmUgY29tbWVudCBpcyBzZWVuLiAgVGhpcwotICAgZGVmYXVsdCBkZWZpbml0aW9uIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBvYmplY3Qgb3IgQ1BVIHNwZWNpZmljCi0gICBwc2V1ZG8tb3BzLiAgKi8KLQotdm9pZAotc19hcHBfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBsOwotCi0gIC8qIFRoZSBnaXZlbiBudW1iZXIgaXMgdGhhdCBvZiB0aGUgbmV4dCBsaW5lLiAgKi8KLSAgbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpIC0gMTsKLSAgaWYgKGwgPCAwKQotICAgIC8qIFNvbWUgb2YgdGhlIGJhY2sgZW5kcyBjYW4ndCBkZWFsIHdpdGggbm9uLXBvc2l0aXZlIGxpbmUgbnVtYmVycy4KLSAgICAgICBCZXNpZGVzLCBpdCdzIHNpbGx5LiAgKi8KLSAgICBhc193YXJuIChfKCJMaW5lIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZTsgbGluZSBudW1iZXIgJWQgcmVqZWN0ZWQuIiksIGwrMSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXdfbG9naWNhbF9saW5lICgoY2hhciAqKSBOVUxMLCBsKTsKLSNpZmRlZiBMSVNUSU5HCi0gICAgICBpZiAobGlzdGluZykKLQlsaXN0aW5nX3NvdXJjZV9saW5lIChsKTsKLSNlbmRpZgotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuZW5kIHBzZXVkby1vcC4gIEFjdHVhbGx5LCB0aGUgcmVhbCB3b3JrIGlzIGRvbmUgaW4KLSAgIHJlYWRfYV9zb3VyY2VfZmlsZS4gICovCi0KLXZvaWQKLXNfZW5kIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIC8qIFRoZSBNUkkgYXNzZW1ibGVyIHBlcm1pdHMgdGhlIHN0YXJ0IHN5bWJvbCB0byBmb2xsb3cgLmVuZCwKLSAgICAgICAgIGJ1dCB3ZSBkb24ndCBzdXBwb3J0IHRoYXQuICAqLwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCi0JICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcqJwotCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIScpCi0JYXNfd2FybiAoXygic3RhcnQgYWRkcmVzcyBub3Qgc3VwcG9ydGVkIikpOwotICAgIH0KLX0KLQotLyogSGFuZGxlIHRoZSAuZXJyIHBzZXVkby1vcC4gICovCi0KLXZvaWQKLXNfZXJyIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYXNfYmFkIChfKCIuZXJyIGVuY291bnRlcmVkIikpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBmYWlsIHBzZXVkby1vcC4gICovCi0KLXZvaWQKLXNfZmFpbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIG9mZnNldFQgdGVtcDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICh0ZW1wID49IDUwMCkKLSAgICBhc193YXJuIChfKCIuZmFpbCAlbGQgZW5jb3VudGVyZWQiKSwgKGxvbmcpIHRlbXApOwotICBlbHNlCi0gICAgYXNfYmFkIChfKCIuZmFpbCAlbGQgZW5jb3VudGVyZWQiKSwgKGxvbmcpIHRlbXApOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi12b2lkIAotc19maWxsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZXhwcmVzc2lvblMgcmVwX2V4cDsKLSAgbG9uZyBzaXplID0gMTsKLSAgcmVnaXN0ZXIgbG9uZyBmaWxsID0gMDsKLSAgY2hhciAqcDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uICgmcmVwX2V4cCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIEJTRCA0LjIgQVMsIG5vdCBmb3IgYW55IHJhdGlvbmFsIHJlYXNvbi4gICovCi0jZGVmaW5lIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfOCAoOCkKLSAgaWYgKHNpemUgPiBCU0RfRklMTF9TSVpFX0NST0NLXzgpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmZpbGwgc2l6ZSBjbGFtcGVkIHRvICVkLiIpLCBCU0RfRklMTF9TSVpFX0NST0NLXzgpOwotICAgICAgc2l6ZSA9IEJTRF9GSUxMX1NJWkVfQ1JPQ0tfODsKLSAgICB9Ci0gIGlmIChzaXplIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJTaXplIG5lZ2F0aXZlOiAuZmlsbCBpZ25vcmVkLiIpKTsKLSAgICAgIHNpemUgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAocmVwX2V4cC5YX29wID09IE9fY29uc3RhbnQgJiYgcmVwX2V4cC5YX2FkZF9udW1iZXIgPD0gMCkKLSAgICB7Ci0gICAgICBpZiAocmVwX2V4cC5YX2FkZF9udW1iZXIgPCAwKQotCWFzX3dhcm4gKF8oIlJlcGVhdCA8IDAsIC5maWxsIGlnbm9yZWQiKSk7Ci0gICAgICBzaXplID0gMDsKLSAgICB9Ci0KLSAgaWYgKHNpemUgJiYgIW5lZWRfcGFzc18yKQotICAgIHsKLSAgICAgIGlmIChyZXBfZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICBwID0gZnJhZ192YXIgKHJzX2ZpbGwsIChpbnQpIHNpemUsIChpbnQpIHNpemUsCi0JCQkocmVsYXhfc3Vic3RhdGVUKSAwLCAoc3ltYm9sUyAqKSAwLAotCQkJKG9mZnNldFQpIHJlcF9leHAuWF9hZGRfbnVtYmVyLAotCQkJKGNoYXIgKikgMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGRvbid0IGhhdmUgYSBjb25zdGFudCByZXBlYXQgY291bnQsIHNvIHdlIGNhbid0IHVzZQotCSAgICAgcnNfZmlsbC4gIFdlIGNhbiBnZXQgdGhlIHNhbWUgcmVzdWx0cyBvdXQgb2YgcnNfc3BhY2UsCi0JICAgICBidXQgaXRzIGFyZ3VtZW50IGlzIGluIGJ5dGVzLCBzbyB3ZSBtdXN0IG11bHRpcGx5IHRoZQotCSAgICAgcmVwZWF0IGNvdW50IGJ5IHNpemUuICAqLwotCi0JICBzeW1ib2xTICpyZXBfc3ltOwotCSAgcmVwX3N5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZyZXBfZXhwKTsKLQkgIGlmIChzaXplICE9IDEpCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uUyBzaXplX2V4cDsKLQkgICAgICBzaXplX2V4cC5YX29wID0gT19jb25zdGFudDsKLQkgICAgICBzaXplX2V4cC5YX2FkZF9udW1iZXIgPSBzaXplOwotCi0JICAgICAgcmVwX2V4cC5YX29wID0gT19tdWx0aXBseTsKLQkgICAgICByZXBfZXhwLlhfYWRkX3N5bWJvbCA9IHJlcF9zeW07Ci0JICAgICAgcmVwX2V4cC5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZzaXplX2V4cCk7Ci0JICAgICAgcmVwX2V4cC5YX2FkZF9udW1iZXIgPSAwOwotCSAgICAgIHJlcF9zeW0gPSBtYWtlX2V4cHJfc3ltYm9sICgmcmVwX2V4cCk7Ci0JICAgIH0KLQotCSAgcCA9IGZyYWdfdmFyIChyc19zcGFjZSwgKGludCkgc2l6ZSwgKGludCkgc2l6ZSwKLQkJCShyZWxheF9zdWJzdGF0ZVQpIDAsIHJlcF9zeW0sIChvZmZzZXRUKSAwLCAoY2hhciAqKSAwKTsKLQl9Ci0gICAgICBtZW1zZXQgKHAsIDAsICh1bnNpZ25lZCBpbnQpIHNpemUpOwotICAgICAgLyogVGhlIG1hZ2ljIG51bWJlciBCU0RfRklMTF9TSVpFX0NST0NLXzQgaXMgZnJvbSBCU0QgNC4yIFZBWAotICAgICAgICogZmxhdm91cmVkIEFTLiAgVGhlIGZvbGxvd2luZyBiaXp6YXJlIGJlaGF2aW91ciBpcyB0byBiZQotICAgICAgICogY29tcGF0aWJsZSB3aXRoIGFib3ZlLiAgSSBndWVzcyB0aGV5IHRyaWVkIHRvIHRha2UgdXAgdG8gOAotICAgICAgICogYnl0ZXMgZnJvbSBhIDQtYnl0ZSBleHByZXNzaW9uIGFuZCB0aGV5IGZvcmdvdCB0byBzaWduCi0gICAgICAgKiBleHRlbmQuIFVuKnggU3V4LiAqLwotI2RlZmluZSBCU0RfRklMTF9TSVpFX0NST0NLXzQgKDQpCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGZpbGwsCi0JCQkgIChzaXplID4gQlNEX0ZJTExfU0laRV9DUk9DS180Ci0JCQkgICA/IEJTRF9GSUxMX1NJWkVfQ1JPQ0tfNAotCQkJICAgOiAoaW50KSBzaXplKSk7Ci0gICAgICAvKiBOb3RlOiAuZmlsbCAoKSwwIGVtaXRzIG5vIGZyYWcgKHNpbmNlIHdlIGFyZSBhc2tlZCB0byAuZmlsbCAwIGJ5dGVzKQotICAgICAgICogYnV0IGVtaXRzIG5vIGVycm9yIG1lc3NhZ2UgYmVjYXVzZSBpdCBzZWVtcyBhIGxlZ2FsIHRoaW5nIHRvIGRvLgotICAgICAgICogSXQgaXMgYSBkZWdlbmVyYXRlIGNhc2Ugb2YgLmZpbGwgYnV0IGNvdWxkIGJlIGVtaXR0ZWQgYnkgYSBjb21waWxlci4KLSAgICAgICAqLwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZCAKLXNfZ2xvYmwgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpZiAoYyA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCSAgICBjID0gJ1xuJzsKLQl9Ci0gICAgfQotICB3aGlsZSAoYyA9PSAnLCcpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBJUlAgYW5kIElSUEMgcHNldWRvLW9wcy4gICovCi0KLXZvaWQKLXNfaXJwIChpcnBjKQotICAgICBpbnQgaXJwYzsKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIHNiIHM7Ci0gIGNvbnN0IGNoYXIgKmVycjsKLSAgc2Igb3V0OwotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotCi0gIHNiX25ldyAoJnMpOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgc2JfYWRkX2NoYXIgKCZzLCAqaW5wdXRfbGluZV9wb2ludGVyKyspOwotCi0gIHNiX25ldyAoJm91dCk7Ci0KLSAgZXJyID0gZXhwYW5kX2lycCAoaXJwYywgMCwgJnMsICZvdXQsIGdldF9saW5lX3NiLCAnXDAnKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgIiVzIiwgZXJyKTsKLQotICBzYl9raWxsICgmcyk7Ci0KLSAgaW5wdXRfc2NydWJfaW5jbHVkZV9zYiAoJm91dCwgaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgc2Jfa2lsbCAoJm91dCk7Ci0gIGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLX0KLQotLyogSGFuZGxlIHRoZSAubGlua29uY2UgcHNldWRvLW9wLiAgVGhpcyB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvIG1hcmsKLSAgIHRoZSBzZWN0aW9uIHRvIG9ubHkgYmUgbGlua2VkIG9uY2UuICBIb3dldmVyLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQKLSAgIGJ5IG1vc3Qgb2JqZWN0IGZpbGUgZm9ybWF0cy4gIFRoaXMgdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQsCi0gICB3aGljaCBpcyB3aGF0IHRvIGRvIGFib3V0IGR1cGxpY2F0ZXMuICAqLwotCi12b2lkCi1zX2xpbmtvbmNlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZW51bSBsaW5rb25jZV90eXBlIHR5cGU7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIHR5cGUgPSBMSU5LT05DRV9ESVNDQVJEOwotCi0gIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBjaGFyICpzOwotICAgICAgY2hhciBjOwotCi0gICAgICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgaWYgKHN0cmNhc2VjbXAgKHMsICJkaXNjYXJkIikgPT0gMCkKLQl0eXBlID0gTElOS09OQ0VfRElTQ0FSRDsKLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJvbmVfb25seSIpID09IDApCi0JdHlwZSA9IExJTktPTkNFX09ORV9PTkxZOwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAocywgInNhbWVfc2l6ZSIpID09IDApCi0JdHlwZSA9IExJTktPTkNFX1NBTUVfU0laRTsKLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJzYW1lX2NvbnRlbnRzIikgPT0gMCkKLQl0eXBlID0gTElOS09OQ0VfU0FNRV9DT05URU5UUzsKLSAgICAgIGVsc2UKLQlhc193YXJuIChfKCJ1bnJlY29nbml6ZWQgLmxpbmtvbmNlIHR5cGUgYCVzJyIpLCBzKTsKLQotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgfQotCi0jaWZkZWYgb2JqX2hhbmRsZV9saW5rX29uY2UKLSAgb2JqX2hhbmRsZV9saW5rX29uY2UgKHR5cGUpOwotI2Vsc2UgLyogISBkZWZpbmVkIChvYmpfaGFuZGxlX2xpbmtfb25jZSkgKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHsKLSAgICBmbGFnd29yZCBmbGFnczsKLQotICAgIGlmICgoYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KSAmIFNFQ19MSU5LX09OQ0UpID09IDApCi0gICAgICBhc193YXJuIChfKCIubGlua29uY2UgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiKSk7Ci0KLSAgICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnKTsKLSAgICBmbGFncyB8PSBTRUNfTElOS19PTkNFOwotICAgIHN3aXRjaCAodHlwZSkKLSAgICAgIHsKLSAgICAgIGRlZmF1bHQ6Ci0JYWJvcnQgKCk7Ci0gICAgICBjYXNlIExJTktPTkNFX0RJU0NBUkQ6Ci0JZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOwotCWJyZWFrOwotICAgICAgY2FzZSBMSU5LT05DRV9PTkVfT05MWToKLQlmbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZOwotCWJyZWFrOwotICAgICAgY2FzZSBMSU5LT05DRV9TQU1FX1NJWkU6Ci0JZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIExJTktPTkNFX1NBTUVfQ09OVEVOVFM6Ci0JZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOwotCWJyZWFrOwotICAgICAgfQotICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnLCBmbGFncykpCi0gICAgICBhc19iYWQgKF8oImJmZF9zZXRfc2VjdGlvbl9mbGFnczogJXMiKSwKLQkgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gIH0KLSNlbHNlIC8qICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgKi8KLSAgYXNfd2FybiAoXygiLmxpbmtvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IikpOwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKG9ial9oYW5kbGVfbGlua19vbmNlKSAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIAotc19sY29tbV9pbnRlcm5hbCAobmVlZHNfYWxpZ24sIGJ5dGVzX3ApCi0gICAgIC8qIDEgaWYgdGhpcyB3YXMgYSAiLmJzcyIgZGlyZWN0aXZlLCB3aGljaCBtYXkgcmVxdWlyZSBhIDNyZCBhcmd1bWVudAotCShhbGlnbm1lbnQpOyAwIGlmIGl0IHdhcyBhbiAiLmxjb21tIiAoMiBhcmdzIG9ubHkpICAqLwotICAgICBpbnQgbmVlZHNfYWxpZ247Ci0gICAgIC8qIDEgaWYgdGhlIGFsaWdubWVudCB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIGJ5dGUgYm91bmRhcnksCi0JcmF0aGVyIHRoYW4gdGhlIHBvd2VyIG9mIDIuICovCi0gICAgIGludCBieXRlc19wOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKLSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIGNvbnN0IGludCBtYXhfYWxpZ25tZW50ID0gMTU7Ci0gIGludCBhbGlnbiA9IDA7Ci0gIHNlZ1QgYnNzX3NlZyA9IGJzc19zZWN0aW9uOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgLyogQWNjZXB0IGFuIG9wdGlvbmFsIGNvbW1hIGFmdGVyIHRoZSBuYW1lLiAgVGhlIGNvbW1hIHVzZWQgdG8gYmUKLSAgICAgcmVxdWlyZWQsIGJ1dCBJcml4IDUgY2MgZG9lcyBub3QgZ2VuZXJhdGUgaXQuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJNaXNzaW5nIHNpemUgZXhwcmVzc2lvbiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCU1MgbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWYgZGVmaW5lZCAoVENfTUlQUykgfHwgZGVmaW5lZCAoVENfQUxQSEEpCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIC8qIEZvciBNSVBTIGFuZCBBbHBoYSBFQ09GRiBvciBFTEYsIHNtYWxsIG9iamVjdHMgYXJlIHB1dCBpbiAuc2Jzcy4gICovCi0gICAgICBpZiAodGVtcCA8PSBiZmRfZ2V0X2dwX3NpemUgKHN0ZG91dHB1dCkpCi0JewotCSAgYnNzX3NlZyA9IHN1YnNlZ19uZXcgKCIuc2JzcyIsIDEpOwotCSAgc2VnX2luZm8gKGJzc19zZWcpLT5ic3MgPSAxOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBic3Nfc2VnLCBTRUNfQUxMT0MpKQotCSAgICBhc193YXJuIChfKCJlcnJvciBzZXR0aW5nIGZsYWdzIGZvciBcIi5zYnNzXCI6ICVzIiksCi0JCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotI2VuZGlmCi0JfQotICAgIH0KLSNlbmRpZgotICAgaWYgKCFuZWVkc19hbGlnbikKLSAgICAgewotICAgICAgIC8qIEZJWE1FLiBUaGlzIG5lZWRzIHRvIGJlIG1hY2hpbmUgaW5kZXBlbmRlbnQuICovCi0gICAgICAgaWYgKHRlbXAgPj0gOCkKLQkgYWxpZ24gPSAzOwotICAgICAgIGVsc2UgaWYgKHRlbXAgPj0gNCkKLQkgYWxpZ24gPSAyOwotICAgICAgIGVsc2UgaWYgKHRlbXAgPj0gMikKLQkgYWxpZ24gPSAxOwotICAgICAgIGVsc2UKLQkgYWxpZ24gPSAwOwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgICAgICAvKiBGSVhNRTogVGhpcyBuZWVkcyB0byBiZSBkb25lIGluIGEgbW9yZSBnZW5lcmFsIGZhc2hpb24uICAqLwotICAgICAgIGFsaWduID0gMzsKLSNlbmRpZgotCi0gICAgICAgcmVjb3JkX2FsaWdubWVudChic3Nfc2VnLCBhbGlnbik7Ci0gICAgIH0KLQotICBpZiAobmVlZHNfYWxpZ24pCi0gICAgewotICAgICAgYWxpZ24gPSAwOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCXsKLQkgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc2l6ZSIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCXsKLQkgIGFzX2JhZCAoXygiTWlzc2luZyBhbGlnbm1lbnQiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmIChieXRlc19wKQotCXsKLQkgIC8qIENvbnZlcnQgdG8gYSBwb3dlciBvZiAyLiAgKi8KLQkgIGlmIChhbGlnbiAhPSAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLQkgICAgICBmb3IgKGkgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKytpKQotCQk7Ci0JICAgICAgaWYgKGFsaWduICE9IDEpCi0JCWFzX2JhZCAoXygiQWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JICAgICAgYWxpZ24gPSBpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGFsaWduID4gbWF4X2FsaWdubWVudCkKLQl7Ci0JICBhbGlnbiA9IG1heF9hbGlnbm1lbnQ7Ci0JICBhc193YXJuIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZC4iKSwgYWxpZ24pOwotCX0KLSAgICAgIGVsc2UgaWYgKGFsaWduIDwgMCkKLQl7Ci0JICBhbGlnbiA9IDA7Ci0JICBhc193YXJuIChfKCJBbGlnbm1lbnQgbmVnYXRpdmUuIDAgYXNzdW1lZC4iKSk7Ci0JfQotICAgICAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlZywgYWxpZ24pOwotICAgIH0JCQkJLyogaWYgbmVlZHMgYWxpZ24gKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFzc3VtZSBzb21lIG9iamVjdHMgbWF5IHJlcXVpcmUgYWxpZ25tZW50IG9uIHNvbWUgc3lzdGVtcy4gICovCi0jaWYgZGVmaW5lZCAoVENfQUxQSEEpICYmICEgZGVmaW5lZCAoVk1TKQotICAgICAgaWYgKHRlbXAgPiAxKQotCXsKLQkgIGFsaWduID0gZmZzICh0ZW1wKSAtIDE7Ci0JICBpZiAodGVtcCAlICgxIDw8IGFsaWduKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0KLSAgaWYgKAotI2lmIGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkKLSAgICAgICBTX0dFVF9PVEhFUiAoc3ltYm9sUCkgPT0gMCAmJgotICAgICAgIFNfR0VUX0RFU0MgKHN5bWJvbFApID09IDAgJiYKLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotICAgICAgIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VnCi0JfHwgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApICYmIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSA9PSAwKSkpCi0gICAgewotICAgICAgY2hhciAqcGZyYWc7Ci0KLSAgICAgIHN1YnNlZ19zZXQgKGJzc19zZWcsIDEpOwotCi0gICAgICBpZiAoYWxpZ24pCi0JZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOwotCQkJCQkvKiBkZXRhY2ggZnJvbSBvbGQgZnJhZwkqLwotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWcpCi0Jc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gTlVMTDsKLQotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0gICAgICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpMCwgc3ltYm9sUCwKLQkJCShvZmZzZXRUKSB0ZW1wLCAoY2hhciAqKSAwKTsKLSAgICAgICpwZnJhZyA9IDA7Ci0KLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWcpOwotCi0jaWZkZWYgT0JKX0NPRkYKLSAgICAgIC8qIFRoZSBzeW1ib2wgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHByZWNlZGluZwotICAgICAgICAgIi5nbG9ibCIgZGlyZWN0aXZlIC0tIGJlIGNhcmVmdWwgbm90IHRvIHN0ZXAgb24gc3RvcmFnZSBjbGFzcwotICAgICAgICAgaW4gdGhhdCBjYXNlLiAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gc3RhdGljLiAqLwotICAgICAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApICE9IENfRVhUKQotCXsKLQkgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfU1RBVCk7Ci0JfQotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLSNpZmRlZiBTX1NFVF9TSVpFCi0gICAgICBTX1NFVF9TSVpFIChzeW1ib2xQLCB0ZW1wKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcycuIiksCi0JICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfbGNvbW1faW50ZXJuYWwoKSAqLwotCi12b2lkCi1zX2xjb21tIChuZWVkc19hbGlnbikKLSAgICAgaW50IG5lZWRzX2FsaWduOwotewotICBzX2xjb21tX2ludGVybmFsIChuZWVkc19hbGlnbiwgMCk7Ci19Ci0KLXZvaWQgc19sY29tbV9ieXRlcyAobmVlZHNfYWxpZ24pCi0gICAgIGludCBuZWVkc19hbGlnbjsKLXsKLSAgc19sY29tbV9pbnRlcm5hbCAobmVlZHNfYWxpZ24sIDEpOwotfQotCi12b2lkIAotc19sc3ltIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBjOwotICByZWdpc3RlciBjaGFyICpwOwotICBleHByZXNzaW9uUyBleHA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyogd2UgcGVybWl0IEFOWSBkZWZpbmVkIGV4cHJlc3Npb246IEJTRDQuMiBkZW1hbmRzIGNvbnN0YW50cyAqLwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgKnAgPSAwOwotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgICpwID0gYzsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICAmJiBleHAuWF9vcCAhPSBPX3JlZ2lzdGVyKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIGV4cHJlc3Npb24iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgLyogRklYTUUtU09PTiBJIHB1bGxlZCBhICgmJiBzeW1ib2xQLT5zeV9vdGhlciA9PSAwICYmCi0gICAgIHN5bWJvbFAtPnN5X2Rlc2MgPT0gMCkgb3V0IG9mIHRoaXMgdGVzdCBiZWNhdXNlIGNvZmYgZG9lc24ndCBoYXZlCi0gICAgIHRob3NlIGZpZWxkcywgYW5kIEkgY2FuJ3Qgc2VlIHdoZW4gdGhleSdkIGV2ZXIgYmUgdHJpcHBlZC4gIEkKLSAgICAgZG9uJ3QgdGhpbmsgSSB1bmRlcnN0YW5kIHdoeSB0aGV5IHdlcmUgaGVyZSBzbyBJIG1heSBoYXZlCi0gICAgIGludHJvZHVjZWQgYSBidWcuIEFzIHJlY2VudGx5IGFzIDEuMzcgZGlkbid0IGhhdmUgdGhpcyB0ZXN0Ci0gICAgIGFueXdheS4gIHhveG9yaWNoLiAqLwotCi0gIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSB1bmRlZmluZWRfc2VjdGlvbgotICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApID09IDApCi0gICAgewotICAgICAgLyogVGhlIG5hbWUgbWlnaHQgYmUgYW4gdW5kZWZpbmVkIC5nbG9iYWwgc3ltYm9sOyBiZSBzdXJlIHRvCi0JIGtlZXAgdGhlICJleHRlcm5hbCIgYml0LiAqLwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwKLQkJICAgICAoZXhwLlhfb3AgPT0gT19jb25zdGFudAotCQkgICAgICA/IGFic29sdXRlX3NlY3Rpb24KLQkJICAgICAgOiByZWdfc2VjdGlvbikpOwotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGV4cC5YX2FkZF9udW1iZXIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiU3ltYm9sICVzIGFscmVhZHkgZGVmaW5lZCIpLCBuYW1lKTsKLSAgICB9Ci0gICpwID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19sc3ltKCkgKi8KLQotLyogUmVhZCBhIGxpbmUgaW50byBhbiBzYi4gICovCi0KLXN0YXRpYyBpbnQKLWdldF9saW5lX3NiIChsaW5lKQotICAgICBzYiAqbGluZTsKLXsKLSAgY2hhciBxdW90ZTEsIHF1b3RlMiwgaW5xdW90ZTsKLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWy0xXSA9PSAnXG4nKQotICAgIGJ1bXBfbGluZV9jb3VudGVycyAoKTsKLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyID49IGJ1ZmZlcl9saW1pdCkKLSAgICB7Ci0gICAgICBidWZmZXJfbGltaXQgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Ci0gICAgICBpZiAoYnVmZmVyX2xpbWl0ID09IDApCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIElmIGFwcC5jIHNldHMgYW55IG90aGVyIGNoYXJhY3RlcnMgdG8gTEVYX0lTX1NUUklOR1FVT1RFLCB0aGlzCi0gICAgIGNvZGUgbmVlZHMgdG8gYmUgY2hhbmdlZC4gICovCi0gIGlmICghIGZsYWdfbTY4a19tcmkpCi0gICAgcXVvdGUxID0gJyInOwotICBlbHNlCi0gICAgcXVvdGUxID0gJ1wwJzsKLQotICBxdW90ZTIgPSAnXDAnOwotICBpZiAoZmxhZ19tNjhrX21yaSkKLSAgICBxdW90ZTIgPSAnXCcnOwotI2lmZGVmIExFWF9JU19TVFJJTkdRVU9URQotICBxdW90ZTIgPSAnXCcnOwotI2VuZGlmCi0KLSAgaW5xdW90ZSA9ICdcMCc7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXQotCSB8fCAoaW5xdW90ZSAhPSAnXDAnICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1xuJykpCi0gICAgewotICAgICAgaWYgKGlucXVvdGUgPT0gKmlucHV0X2xpbmVfcG9pbnRlcikKLQlpbnF1b3RlID0gJ1wwJzsKLSAgICAgIGVsc2UgaWYgKGlucXVvdGUgPT0gJ1wwJykKLQl7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSBxdW90ZTEpCi0JICAgIGlucXVvdGUgPSBxdW90ZTE7Ci0JICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09IHF1b3RlMikKLQkgICAgaW5xdW90ZSA9IHF1b3RlMjsKLQl9Ci0gICAgICBzYl9hZGRfY2hhciAobGluZSwgKmlucHV0X2xpbmVfcG9pbnRlcisrKTsKLSAgICB9Ci0gIHdoaWxlIChpbnB1dF9saW5lX3BvaW50ZXIgPCBidWZmZXJfbGltaXQKLQkgJiYgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbLTFdID09ICdcbicpCi0JYnVtcF9saW5lX2NvdW50ZXJzICgpOwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotLyogRGVmaW5lIGEgbWFjcm8uICBUaGlzIGlzIGFuIGludGVyZmFjZSB0byBtYWNyby5jLCB3aGljaCBpcyBzaGFyZWQKLSAgIGJldHdlZW4gZ2FzIGFuZCBnYXNwLiAgKi8KLQotdm9pZAotc19tYWNybyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICBzYiBzOwotICBzYiBsYWJlbDsKLSAgY29uc3QgY2hhciAqZXJyOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotCi0gIHNiX25ldyAoJnMpOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgc2JfYWRkX2NoYXIgKCZzLCAqaW5wdXRfbGluZV9wb2ludGVyKyspOwotCi0gIHNiX25ldyAoJmxhYmVsKTsKLSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLSAgICBzYl9hZGRfc3RyaW5nICgmbGFiZWwsIFNfR0VUX05BTUUgKGxpbmVfbGFiZWwpKTsKLQotICBlcnIgPSBkZWZpbmVfbWFjcm8gKDAsICZzLCAmbGFiZWwsIGdldF9saW5lX3NiLCAmbmFtZSk7Ci0gIGlmIChlcnIgIT0gTlVMTCkKLSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsICIlcyIsIGVycik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCXsKLQkgIFNfU0VUX1NFR01FTlQgKGxpbmVfbGFiZWwsIHVuZGVmaW5lZF9zZWN0aW9uKTsKLQkgIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCAwKTsKLQkgIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQl9Ci0KLSAgICAgIGlmICgoKGZsYWdfbTY4a19tcmkKLSNpZmRlZiBOT19QU0VVRE9fRE9UCi0JICAgIHx8IDEKLSNlbmRpZgotCSAgICApCi0JICAgJiYgaGFzaF9maW5kIChwb19oYXNoLCBuYW1lKSAhPSBOVUxMKQotCSAgfHwgKCEgZmxhZ19tNjhrX21yaQotCSAgICAgICYmICpuYW1lID09ICcuJwotCSAgICAgICYmIGhhc2hfZmluZCAocG9faGFzaCwgbmFtZSArIDEpICE9IE5VTEwpKQotCWFzX3dhcm4gKF8oImF0dGVtcHQgdG8gcmVkZWZpbmUgcHNldWRvLW9wIGAlcycgaWdub3JlZCIpLAotCQkgbmFtZSk7Ci0gICAgfQotCi0gIHNiX2tpbGwgKCZzKTsKLX0KLQotLyogSGFuZGxlIHRoZSAubWV4aXQgcHNldWRvLW9wLCB3aGljaCBpbW1lZGlhdGVseSBleGl0cyBhIG1hY3JvCi0gICBleHBhbnNpb24uICAqLwotCi12b2lkCi1zX21leGl0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY29uZF9leGl0X21hY3JvIChtYWNyb19uZXN0KTsKLSAgYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotfQotCi0vKiBTd2l0Y2ggaW4gYW5kIG91dCBvZiBNUkkgbW9kZS4gICovCi0KLXZvaWQKLXNfbXJpIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaW50IG9uLCBvbGRfZmxhZzsKLQotICBvbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBvbGRfZmxhZyA9IGZsYWdfbXJpOwotICBpZiAob24gIT0gMCkKLSAgICB7Ci0gICAgICBmbGFnX21yaSA9IDE7Ci0jaWZkZWYgVENfTTY4SwotICAgICAgZmxhZ19tNjhrX21yaSA9IDE7Ci0jZW5kaWYKLSAgICAgIG1hY3JvX21yaV9tb2RlICgxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmbGFnX21yaSA9IDA7Ci0gICAgICBmbGFnX202OGtfbXJpID0gMDsKLSAgICAgIG1hY3JvX21yaV9tb2RlICgwKTsKLSAgICB9Ci0KLSAgLyogT3BlcmF0b3IgcHJlY2VkZW5jZSBjaGFuZ2VzIGluIG02OGsgTVJJIG1vZGUsIHNvIHdlIG5lZWQgdG8KLSAgICAgdXBkYXRlIHRoZSBvcGVyYXRvciByYW5raW5ncy4gICovCi0gIGV4cHJfc2V0X3ByZWNlZGVuY2UgKCk7Ci0KLSNpZmRlZiBNUklfTU9ERV9DSEFOR0UKLSAgaWYgKG9uICE9IG9sZF9mbGFnKQotICAgIE1SSV9NT0RFX0NIQU5HRSAob24pOwotI2VuZGlmCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGNoYW5naW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWRvX29yZyAoc2VnbWVudCwgZXhwLCBmaWxsKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGludCBmaWxsOwotewotICBpZiAoc2VnbWVudCAhPSBub3dfc2VnICYmIHNlZ21lbnQgIT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICBhc19iYWQgKF8oImludmFsaWQgc2VnbWVudCBcIiVzXCI7IHNlZ21lbnQgXCIlc1wiIGFzc3VtZWQiKSwKLQkgICAgc2VnbWVudF9uYW1lIChzZWdtZW50KSwgc2VnbWVudF9uYW1lIChub3dfc2VnKSk7Ci0KLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpZiAoZmlsbCAhPSAwKQotCWFzX3dhcm4gKF8oImlnbm9yaW5nIGZpbGwgdmFsdWUgaW4gYWJzb2x1dGUgc2VjdGlvbiIpKTsKLSAgICAgIGlmIChleHAtPlhfb3AgIT0gT19jb25zdGFudCkKLQl7Ci0JICBhc19iYWQgKF8oIm9ubHkgY29uc3RhbnQgb2Zmc2V0cyBzdXBwb3J0ZWQgaW4gYWJzb2x1dGUgc2VjdGlvbiIpKTsKLQkgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLQl9Ci0gICAgICBhYnNfc2VjdGlvbl9vZmZzZXQgPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICBwID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgZXhwLT5YX2FkZF9zeW1ib2wsCi0JCSAgICBleHAtPlhfYWRkX251bWJlciwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICAqcCA9IGZpbGw7Ci0gICAgfQotfQotCi12b2lkIAotc19vcmcgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZWdpc3RlciBzZWdUIHNlZ21lbnQ7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgcmVnaXN0ZXIgbG9uZyB0ZW1wX2ZpbGw7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIC8qIFRoZSBtNjhrIE1SSSBhc3NlbWJsZXIgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgZm9yIC5vcmcuICBJdAotICAgICBtZWFucyB0byBjcmVhdGUgYW4gYWJzb2x1dGUgc2VjdGlvbiBhdCBhIGdpdmVuIGFkZHJlc3MuICBXZSBjYW4ndAotICAgICBzdXBwb3J0IHRoYXQtLXVzZSBhIGxpbmtlciBzY3JpcHQgaW5zdGVhZC4gICovCi0gIGlmIChmbGFnX202OGtfbXJpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTVJJIHN0eWxlIE9SRyBwc2V1ZG8tb3Agbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIERvbid0IGJlbGlldmUgdGhlIGRvY3VtZW50YXRpb24gb2YgQlNEIDQuMiBBUy4gIFRoZXJlIGlzIG5vIHN1Y2gKLSAgICAgdGhpbmcgYXMgYSBzdWItc2VnbWVudC1yZWxhdGl2ZSBvcmlnaW4uICBBbnkgYWJzb2x1dGUgb3JpZ2luIGlzCi0gICAgIGdpdmVuIGEgd2FybmluZywgdGhlbiBhc3N1bWVkIHRvIGJlIHNlZ21lbnQtcmVsYXRpdmUuICBBbnkKLSAgICAgc2VnbWVudGVkIG9yaWdpbiBleHByZXNzaW9uICgiZm9vKzQyIikgaGFkIGJldHRlciBiZSBpbiB0aGUgcmlnaHQKLSAgICAgc2VnbWVudCBvciB0aGUgLm9yZyBpcyBpZ25vcmVkLgotCi0gICAgIEJTRCA0LjIgQVMgd2FybnMgaWYgeW91IHRyeSB0byAub3JnIGJhY2t3YXJkcy4gV2UgY2Fubm90IGJlY2F1c2UKLSAgICAgd2UgbmV2ZXIga25vdyBzdWItc2VnbWVudCBzaXplcyB3aGVuIHdlIGFyZSByZWFkaW5nIGNvZGUuICBCU0QKLSAgICAgd2lsbCBjcmFzaCB0cnlpbmcgdG8gZW1pdCBuZWdhdGl2ZSBudW1iZXJzIG9mIGZpbGxlciBieXRlcyBpbgotICAgICBjZXJ0YWluIC5vcmdzLiBXZSBkb24ndCBjcmFzaCwgYnV0IHNlZSBhcy13cml0ZSBmb3IgdGhhdCBjb2RlLgotCi0gICAgIERvbid0IG1ha2UgZnJhZyBpZiBuZWVkX3Bhc3NfMj09MS4gICovCi0gIHNlZ21lbnQgPSBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gKCZleHApOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICB0ZW1wX2ZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB0ZW1wX2ZpbGwgPSAwOwotCi0gIGlmICghbmVlZF9wYXNzXzIpCi0gICAgZG9fb3JnIChzZWdtZW50LCAmZXhwLCB0ZW1wX2ZpbGwpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfb3JnKCkgKi8KLQotLyogSGFuZGxlIHBhcnNpbmcgZm9yIHRoZSBNUkkgU0VDVC9TRUNUSU9OIHBzZXVkby1vcC4gIFRoaXMgc2hvdWxkIGJlCi0gICBjYWxsZWQgYnkgdGhlIG9iai1mb3JtYXQgcm91dGluZSB3aGljaCBoYW5kbGVzIHNlY3Rpb24gY2hhbmdpbmcKLSAgIHdoZW4gaW4gTVJJIG1vZGUuICBJdCB3aWxsIGNyZWF0ZSBhIG5ldyBzZWN0aW9uLCBhbmQgcmV0dXJuIGl0LiAgSXQKLSAgIHdpbGwgc2V0ICpUWVBFIHRvIHRoZSBzZWN0aW9uIHR5cGU6IG9uZSBvZiAnQycgKGNvZGUpLCAnRCcgKGRhdGEpLAotICAgJ00nIChtaXhlZCksIG9yICdSJyAocm9tYWJsZSkuICBJZiBCRkRfQVNTRU1CTEVSIGlzIGRlZmluZWQsIHRoZQotICAgZmxhZ3Mgd2lsbCBiZSBzZXQgaW4gdGhlIHNlY3Rpb24uICAqLwotCi12b2lkCi1zX21yaV9zZWN0ICh0eXBlKQotICAgICBjaGFyICp0eXBlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0jaWZkZWYgVENfTTY4SwotCi0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgc2VnVCBzZWc7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICAKLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpuYW1lKSkKLSAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkbwotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLSAgICB9Ci0KLSAgbmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIHNlZyA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnQgYWxpZ247Ci0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHNlZywgYWxpZ24pOwotICAgIH0KLQotICAqdHlwZSA9ICdDJzsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGMgPSAqKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGMpOwotICAgICAgaWYgKGMgPT0gJ0MnIHx8IGMgPT0gJ0QnIHx8IGMgPT0gJ00nIHx8IGMgPT0gJ1InKQotCSp0eXBlID0gYzsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUiKSk7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIHsKLQlmbGFnd29yZCBmbGFnczsKLQotCWZsYWdzID0gU0VDX05PX0ZMQUdTOwotCWlmICgqdHlwZSA9PSAnQycpCi0JICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZIHwgU0VDX0NPREU7Ci0JZWxzZSBpZiAoKnR5cGUgPT0gJ0QnIHx8ICp0eXBlID09ICdNJykKLQkgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQTsKLQllbHNlIGlmICgqdHlwZSA9PSAnUicpCi0JICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfUkVBRE9OTFkgfCBTRUNfUk9NOwotCWlmIChmbGFncyAhPSBTRUNfTk9fRkxBR1MpCi0JICB7Ci0JICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWcsIGZsYWdzKSkKLQkgICAgICBhc193YXJuIChfKCJlcnJvciBzZXR0aW5nIGZsYWdzIGZvciBcIiVzXCI6ICVzIiksCi0JCSAgICAgICBiZmRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsIHNlZyksCi0JCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICB9Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyogSWdub3JlIHRoZSBIUCB0eXBlLiAgKi8KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSNlbHNlIC8qICEgVENfTTY4SyAqLwotI2lmZGVmIFRDX0k5NjAKLQotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIHNlZ1Qgc2VnOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgbmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIHNlZyA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICAqdHlwZSA9ICdDJzsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKnNlY3R5cGU7Ci0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgc2VjdHlwZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIGlmICgqc2VjdHlwZSA9PSAnXDAnKQotCSp0eXBlID0gJ0MnOwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc2VjdHlwZSwgInRleHQiKSA9PSAwKQotCSp0eXBlID0gJ0MnOwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc2VjdHlwZSwgImRhdGEiKSA9PSAwKQotCSp0eXBlID0gJ0QnOwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc2VjdHlwZSwgInJvbWRhdGEiKSA9PSAwKQotCSp0eXBlID0gJ1InOwotICAgICAgZWxzZQotCWFzX3dhcm4gKF8oInVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUgYCVzJyIpLCBzZWN0eXBlKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgY2hhciAqc2VjY21kOwotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIHNlY2NtZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIGlmIChzdHJjYXNlY21wIChzZWNjbWQsICJhYnNvbHV0ZSIpID09IDApCi0JewotCSAgYXNfYmFkIChfKCJhYnNvbHV0ZSBzZWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWNjbWQsICJhbGlnbiIpID09IDApCi0JewotCSAgaW50IGFsaWduOwotCi0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICByZWNvcmRfYWxpZ25tZW50IChzZWcsIGFsaWduKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfd2FybiAoXygidW5yZWNvZ25pemVkIHNlY3Rpb24gY29tbWFuZCBgJXMnIiksIHNlY2NtZCk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CSAgCi0KLSNlbHNlIC8qICEgVENfSTk2MCAqLwotICAvKiBUaGUgTVJJIGFzc2VtYmxlciBzZWVtcyB0byB1c2UgZGlmZmVyZW50IGZvcm1zIG9mIC5zZWN0IGZvcgotICAgICBkaWZmZXJlbnQgdGFyZ2V0cy4gICovCi0gIGFzX2JhZCAoIk1SSSBtb2RlIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgdGFyZ2V0Iik7Ci0gIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0jZW5kaWYgLyogISBUQ19JOTYwICovCi0jZW5kaWYgLyogISBUQ19NNjhLICovCi19Ci0KLS8qIEhhbmRsZSB0aGUgLnByaW50IHBzZXVkby1vcC4gICovCi0KLXZvaWQKLXNfcHJpbnQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpzOwotICBpbnQgbGVuOwotCi0gIHMgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7Ci0gIHByaW50ZiAoIiVzXG4iLCBzKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAucHVyZ2VtIHBzZXVkby1vcC4gICovCi0KLXZvaWQKLXNfcHVyZ2VtIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgY2hhciBjOwotCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgZGVsZXRlX21hY3JvIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIC0taW5wdXRfbGluZV9wb2ludGVyOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5yZXB0IHBzZXVkby1vcC4gICovCi0KLXZvaWQKLXNfcmVwdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGludCBjb3VudDsKLSAgc2Igb25lOwotICBzYiBtYW55OwotCi0gIGNvdW50ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgc2JfbmV3ICgmb25lKTsKLSAgaWYgKCEgYnVmZmVyX2FuZF9uZXN0ICgiUkVQVCIsICJFTkRSIiwgJm9uZSwgZ2V0X2xpbmVfc2IpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygicmVwdCB3aXRob3V0IGVuZHIiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNiX25ldyAoJm1hbnkpOwotICB3aGlsZSAoY291bnQtLSA+IDApCi0gICAgc2JfYWRkX3NiICgmbWFueSwgJm9uZSk7Ci0KLSAgc2Jfa2lsbCAoJm9uZSk7Ci0KLSAgaW5wdXRfc2NydWJfaW5jbHVkZV9zYiAoJm1hbnksIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0gIHNiX2tpbGwgKCZtYW55KTsKLSAgYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5lcXUsIC5lcXVpdiBhbmQgLnNldCBkaXJlY3RpdmVzLiAgSWYgRVFVSVYgaXMgMSwgdGhlbgotICAgdGhpcyBpcyAuZXF1aXYsIGFuZCBpdCBpcyBhbiBlcnJvciBpZiB0aGUgc3ltYm9sIGlzIGFscmVhZHkKLSAgIGRlZmluZWQuICAqLwotCi12b2lkIAotc19zZXQgKGVxdWl2KQotICAgICBpbnQgZXF1aXY7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgZGVsaW07Ci0gIHJlZ2lzdGVyIGNoYXIgKmVuZF9uYW1lOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotCi0gIC8qCi0gICAqIEVzcGVjaWFsIGFwb2xvZ2llcyBmb3IgdGhlIHJhbmRvbSBsb2dpYzoKLSAgICogdGhpcyBqdXN0IGdyZXcsIGFuZCBjb3VsZCBiZSBwYXJzZWQgbXVjaCBtb3JlIHNpbXBseSEKLSAgICogRGVhbiBpbiBoYXN0ZS4KLSAgICovCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGRlbGltID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGVuZF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqZW5kX25hbWUgPSBkZWxpbTsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqZW5kX25hbWUgPSAwOwotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgICplbmRfbmFtZSA9IGRlbGltOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICplbmRfbmFtZSA9IDA7Ci0KLSAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBUdXJuICcuID0gbXVtYmxlJyBpbnRvIGEgLm9yZyBtdW1ibGUgKi8KLSAgICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudDsKLSAgICAgIGV4cHJlc3Npb25TIGV4cDsKLQotICAgICAgc2VnbWVudCA9IGdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoJmV4cCk7Ci0KLSAgICAgIGlmICghbmVlZF9wYXNzXzIpCi0JZG9fb3JnIChzZWdtZW50LCAmZXhwLCAwKTsKLQotICAgICAgKmVuZF9uYW1lID0gZGVsaW07Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgoc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKSkgPT0gTlVMTAotICAgICAgJiYgKHN5bWJvbFAgPSBtZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKSkgPT0gTlVMTCkKLSAgICB7Ci0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgICAgIC8qIFdoZW4gZG9pbmcgc3ltYm9sIGxpc3RpbmdzLCBwbGF5IGdhbWVzIHdpdGggZHVtbXkgZnJhZ21lbnRzIGxpdmluZwotCSBvdXRzaWRlIHRoZSBub3JtYWwgZnJhZ21lbnQgY2hhaW4gdG8gcmVjb3JkIHRoZSBmaWxlIGFuZCBsaW5lIGluZm8KLSAgICAgICAgIGZvciB0aGlzIHN5bWJvbC4gICovCi0gICAgICBpZiAobGlzdGluZyAmIExJU1RJTkdfU1lNQk9MUykKLQl7Ci0JICBleHRlcm4gc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgKmxpc3RpbmdfdGFpbDsKLQkgIGZyYWdTICpkdW1teV9mcmFnID0gKGZyYWdTICopIHhtYWxsb2MgKHNpemVvZihmcmFnUykpOwotCSAgbWVtc2V0IChkdW1teV9mcmFnLCAwLCBzaXplb2YoZnJhZ1MpKTsKLQkgIGR1bW15X2ZyYWctPmZyX3R5cGUgPSByc19maWxsOwotCSAgZHVtbXlfZnJhZy0+bGluZSA9IGxpc3RpbmdfdGFpbDsKLQkgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwgZHVtbXlfZnJhZyk7Ci0JICBkdW1teV9mcmFnLT5mcl9zeW1ib2wgPSBzeW1ib2xQOwotCX0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JCQkgICAgCi0jaWZkZWYgT0JKX0NPRkYKLSAgICAgIC8qICJzZXQiIHN5bWJvbHMgYXJlIGxvY2FsIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiAqLwotICAgICAgU0ZfU0VUX0xPQ0FMIChzeW1ib2xQKTsKLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0gICAgfQkJCQkvKiBtYWtlIGEgbmV3IHN5bWJvbCAqLwotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotCi0gICplbmRfbmFtZSA9IGRlbGltOwotCi0gIGlmIChlcXVpdgotICAgICAgJiYgU19JU19ERUZJTkVEIChzeW1ib2xQKQotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgIT0gcmVnX3NlY3Rpb24pCi0gICAgYXNfYmFkIChfKCJzeW1ib2wgYCVzJyBhbHJlYWR5IGRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCi0gIHBzZXVkb19zZXQgKHN5bWJvbFApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX3NldCgpICovCi0KLXZvaWQgCi1zX3NwYWNlIChtdWx0KQotICAgICBpbnQgbXVsdDsKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBleHByZXNzaW9uUyB2YWw7Ci0gIGNoYXIgKnAgPSAwOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLSAgaW50IGJ5dGVzOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIC8qIEluIG02OGsgTVJJIG1vZGUsIHdlIG5lZWQgdG8gYWxpZ24gdG8gYSB3b3JkIGJvdW5kYXJ5LCB1bmxlc3MKLSAgICAgdGhpcyBpcyBkcy5iLiAgKi8KLSAgaWYgKGZsYWdfbTY4a19tcmkgJiYgbXVsdCA+IDEpCi0gICAgewotICAgICAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQl7Ci0JICBhYnNfc2VjdGlvbl9vZmZzZXQgKz0gYWJzX3NlY3Rpb25fb2Zmc2V0ICYgMTsKLQkgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0JICAgIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCBhYnNfc2VjdGlvbl9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UgaWYgKG1yaV9jb21tb25fc3ltYm9sICE9IE5VTEwpCi0JewotCSAgdmFsdWVUIHZhbDsKLQotCSAgdmFsID0gU19HRVRfVkFMVUUgKG1yaV9jb21tb25fc3ltYm9sKTsKLQkgIGlmICgodmFsICYgMSkgIT0gMCkKLQkgICAgewotCSAgICAgIFNfU0VUX1ZBTFVFIChtcmlfY29tbW9uX3N5bWJvbCwgdmFsICsgMSk7Ci0JICAgICAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLQkJewotCQkgIGV4cHJlc3Npb25TICpzeW1leHA7Ci0KLQkJICBzeW1leHAgPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGxpbmVfbGFiZWwpOwotCQkgIGtub3cgKHN5bWV4cC0+WF9vcCA9PSBPX3N5bWJvbCk7Ci0JCSAga25vdyAoc3ltZXhwLT5YX2FkZF9zeW1ib2wgPT0gbXJpX2NvbW1vbl9zeW1ib2wpOwotCQkgIHN5bWV4cC0+WF9hZGRfbnVtYmVyICs9IDE7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkb19hbGlnbiAoMSwgKGNoYXIgKikgTlVMTCwgMCwgMCk7Ci0JICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3ltYm9sX3NldF9mcmFnIChsaW5lX2xhYmVsLCBmcmFnX25vdyk7Ci0JICAgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGJ5dGVzID0gbXVsdDsKLQotICBleHByZXNzaW9uICgmZXhwKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGV4cHJlc3Npb24gKCZ2YWwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbC5YX29wID0gT19jb25zdGFudDsKLSAgICAgIHZhbC5YX2FkZF9udW1iZXIgPSAwOwotICAgIH0KLQotICBpZiAodmFsLlhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgdmFsLlhfYWRkX251bWJlciA8IC0gMHg4MAotICAgICAgfHwgdmFsLlhfYWRkX251bWJlciA+IDB4ZmYKLSAgICAgIHx8IChtdWx0ICE9IDAgJiYgbXVsdCAhPSAxICYmIHZhbC5YX2FkZF9udW1iZXIgIT0gMCkpCi0gICAgewotICAgICAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCB2YXJpYWJsZSBzaXplIG9yIGZpbGwgdmFsdWUiKSk7Ci0gICAgICBlbHNlCi0JewotCSAgb2Zmc2V0VCBpOwotCi0JICBpZiAobXVsdCA9PSAwKQotCSAgICBtdWx0ID0gMTsKLQkgIGJ5dGVzID0gbXVsdCAqIGV4cC5YX2FkZF9udW1iZXI7Ci0JICBmb3IgKGkgPSAwOyBpIDwgZXhwLlhfYWRkX251bWJlcjsgaSsrKQotCSAgICBlbWl0X2V4cHIgKCZ2YWwsIG11bHQpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICBsb25nIHJlcGVhdDsKLQotCSAgcmVwZWF0ID0gZXhwLlhfYWRkX251bWJlcjsKLQkgIGlmIChtdWx0KQotCSAgICByZXBlYXQgKj0gbXVsdDsKLQkgIGJ5dGVzID0gcmVwZWF0OwotCSAgaWYgKHJlcGVhdCA8PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZmxhZ19tcmkpCi0JCWFzX3dhcm4gKF8oIi5zcGFjZSByZXBlYXQgY291bnQgaXMgemVybywgaWdub3JlZCIpKTsKLQkgICAgICBlbHNlIGlmIChyZXBlYXQgPCAwKQotCQlhc193YXJuIChfKCIuc3BhY2UgcmVwZWF0IGNvdW50IGlzIG5lZ2F0aXZlLCBpZ25vcmVkIikpOwotCSAgICAgIGdvdG8gZ2V0b3V0OwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGFyZSBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiwganVzdCBidW1wIHRoZSBvZmZzZXQuICAqLwotCSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGFic19zZWN0aW9uX29mZnNldCArPSByZXBlYXQ7Ci0JICAgICAgZ290byBnZXRvdXQ7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgYXJlIHNlY3JldGx5IGluIGFuIE1SSSBjb21tb24gc2VjdGlvbiwgdGhlbgotCSAgICAgY3JlYXRpbmcgc3BhY2UganVzdCBpbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlIGNvbW1vbgotCSAgICAgc3ltYm9sLiAgKi8KLQkgIGlmIChtcmlfY29tbW9uX3N5bWJvbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgU19TRVRfVkFMVUUgKG1yaV9jb21tb25fc3ltYm9sLAotCQkJICAgU19HRVRfVkFMVUUgKG1yaV9jb21tb25fc3ltYm9sKSArIHJlcGVhdCk7Ci0JICAgICAgZ290byBnZXRvdXQ7Ci0JICAgIH0KLQotCSAgaWYgKCFuZWVkX3Bhc3NfMikKLQkgICAgcCA9IGZyYWdfdmFyIChyc19maWxsLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCAoc3ltYm9sUyAqKSAwLAotCQkJICAob2Zmc2V0VCkgcmVwZWF0LCAoY2hhciAqKSAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygic3BhY2UgYWxsb2NhdGlvbiB0b28gY29tcGxleCBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotCSAgICAgIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7Ci0JICAgIH0KLQkgIGlmIChtcmlfY29tbW9uX3N5bWJvbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJzcGFjZSBhbGxvY2F0aW9uIHRvbyBjb21wbGV4IGluIGNvbW1vbiBzZWN0aW9uIikpOwotCSAgICAgIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLQkgICAgfQotCSAgaWYgKCFuZWVkX3Bhc3NfMikKLQkgICAgcCA9IGZyYWdfdmFyIChyc19zcGFjZSwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwKLQkJCSAgbWFrZV9leHByX3N5bWJvbCAoJmV4cCksIChvZmZzZXRUKSAwLCAoY2hhciAqKSAwKTsKLQl9Ci0KLSAgICAgIGlmIChwKQotCSpwID0gdmFsLlhfYWRkX251bWJlcjsKLSAgICB9Ci0KLSBnZXRvdXQ6Ci0KLSAgLyogSW4gTVJJIG1vZGUsIGFmdGVyIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMsIHdlIG11c3QgYWxpZ24gdG8gYW4KLSAgICAgZXZlbiB3b3JkIGJvdW5kYXJ5LCB1bmxlc3MgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYSBkYy5iLCBkcy5iCi0gICAgIG9yIGRjYi5iLiAgKi8KLSAgaWYgKGZsYWdfbXJpICYmIChieXRlcyAmIDEpICE9IDApCi0gICAgbXJpX3BlbmRpbmdfYWxpZ24gPSAxOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi0vKiBUaGlzIGlzIGxpa2Ugc19zcGFjZSwgYnV0IHRoZSB2YWx1ZSBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB3aXRoCi0gICB0aGUgZ2l2ZW4gcHJlY2lzaW9uLiAgVGhpcyBpcyBmb3IgdGhlIE1SSSBkY2IucyBwc2V1ZG8tb3AgYW5kCi0gICBmcmllbmRzLiAgKi8KLQotdm9pZAotc19mbG9hdF9zcGFjZSAoZmxvYXRfdHlwZSkKLSAgICAgaW50IGZsb2F0X3R5cGU7Ci17Ci0gIG9mZnNldFQgY291bnQ7Ci0gIGludCBmbGVuOwotICBjaGFyIHRlbXBbTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUXTsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBjb3VudCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyB2YWx1ZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAvKiBTa2lwIGFueSAwe2xldHRlcn0gdGhhdCBtYXkgYmUgcHJlc2VudC4gIERvbid0IGV2ZW4gY2hlY2sgaWYgdGhlCi0gICAqIGxldHRlciBpcyBsZWdhbC4gICovCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzAnCi0gICAgICAmJiBpc2FscGhhICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdKSkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQotICAvKiBBY2NlcHQgOnh4eHgsIHdoZXJlIHRoZSB4J3MgYXJlIGhleCBkaWdpdHMsIGZvciBhIGZsb2F0aW5nIHBvaW50Ci0gICAgIHdpdGggdGhlIGV4YWN0IGRpZ2l0cyBzcGVjaWZpZWQuICAqLwotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICc6JykKLSAgICB7Ci0gICAgICBmbGVuID0gaGV4X2Zsb2F0IChmbG9hdF90eXBlLCB0ZW1wKTsKLSAgICAgIGlmIChmbGVuIDwgMCkKLQl7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgaWYgKGZsYWdfbXJpKQotCSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqZXJyOwotCi0gICAgICBlcnIgPSBtZF9hdG9mIChmbG9hdF90eXBlLCB0ZW1wLCAmZmxlbik7Ci0gICAgICBrbm93IChmbGVuIDw9IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCk7Ci0gICAgICBrbm93IChmbGVuID4gMCk7Ci0gICAgICBpZiAoZXJyKQotCXsKLQkgIGFzX2JhZCAoXygiQmFkIGZsb2F0aW5nIGxpdGVyYWw6ICVzIiksIGVycik7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgaWYgKGZsYWdfbXJpKQotCSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIHdoaWxlICgtLWNvdW50ID49IDApCi0gICAgewotICAgICAgY2hhciAqcDsKLQotICAgICAgcCA9IGZyYWdfbW9yZSAoZmxlbik7Ci0gICAgICBtZW1jcHkgKHAsIHRlbXAsICh1bnNpZ25lZCBpbnQpIGZsZW4pOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuc3RydWN0IHBzZXVkby1vcCwgYXMgZm91bmQgaW4gTUlQUyBhc3NlbWJsZXJzLiAgKi8KLQotdm9pZAotc19zdHJ1Y3QgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotICBhYnNfc2VjdGlvbl9vZmZzZXQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX3NldCAoYWJzb2x1dGVfc2VjdGlvbiwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotdm9pZAotc190ZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIChzdWJzZWdUKSB0ZW1wKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSNpZmRlZiBPQkpfVk1TCi0gIGNvbnN0X2ZsYWcgJj0gfklOX0RFRkFVTFRfU0VDVElPTjsKLSNlbmRpZgotfQkJCQkvKiBzX3RleHQoKSAqLwotDAotCi12b2lkIAotZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKQotewotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmIChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIC8qIFJldHVybiBoYXZpbmcgYWxyZWFkeSBzd2FsbG93ZWQgZW5kLW9mLWxpbmUuICovCi19CQkJCS8qIFJldHVybiBwb2ludGluZyBqdXN0IGFmdGVyIGVuZC1vZi1saW5lLiAqLwotCi12b2lkCi1pZ25vcmVfcmVzdF9vZl9saW5lICgpCQkvKiBGb3Igc3VzcGVjdCBsaW5lczogZ2l2ZXMgd2FybmluZy4gKi8KLXsKLSAgaWYgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaWYgKGlzcHJpbnQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLQlhc19iYWQgKF8oIlJlc3Qgb2YgbGluZSBpZ25vcmVkLiBGaXJzdCBpZ25vcmVkIGNoYXJhY3RlciBpcyBgJWMnLiIpLAotCQkqaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIlJlc3Qgb2YgbGluZSBpZ25vcmVkLiBGaXJzdCBpZ25vcmVkIGNoYXJhY3RlciB2YWx1ZWQgMHgleC4iKSwKLQkJKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0gICAgICB3aGlsZSAoaW5wdXRfbGluZV9wb2ludGVyIDwgYnVmZmVyX2xpbWl0Ci0JICAgICAmJiAhaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCX0KLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogUmV0dXJuIHBvaW50aW5nIGp1c3QgYWZ0ZXIgZW5kLW9mLWxpbmUuICovCi0gIGtub3cgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbLTFdXSk7Ci19Ci0KLXZvaWQKLWRpc2NhcmRfcmVzdF9vZl9saW5lICgpCi17Ci0gIHdoaWxlIChpbnB1dF9saW5lX3BvaW50ZXIgPCBidWZmZXJfbGltaXQKLSAgICAgICAgICYmICFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsgICAgICAgICAvKiBSZXR1cm4gcG9pbnRpbmcganVzdCBhZnRlciBlbmQtb2YtbGluZS4gKi8KLSAga25vdyAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclstMV1dKTsKLX0KLQotLyoKLSAqCQkJcHNldWRvX3NldCgpCi0gKgotICogSW46CVBvaW50ZXIgdG8gYSBzeW1ib2wuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPmV4cHJlc3Npb24uCi0gKgotICogT3V0OglJbnB1dF9saW5lX3BvaW50ZXItPmp1c3QgYWZ0ZXIgYW55IHdoaXRlc3BhY2UgYWZ0ZXIgZXhwcmVzc2lvbi4KLSAqCVRyaWVkIHRvIHNldCBzeW1ib2wgdG8gdmFsdWUgb2YgZXhwcmVzc2lvbi4KLSAqCVdpbGwgY2hhbmdlIHN5bWJvbHMgdHlwZSwgdmFsdWUsIGFuZCBmcmFnOwotICovCi12b2lkCi1wc2V1ZG9fc2V0IChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBleHByZXNzaW9uUyBleHA7Ci0jaWYgKGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfQk9VVCkpICYmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgaW50IGV4dDsKLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotCi0gIGtub3cgKHN5bWJvbFApOwkJLyogTlVMTCBwb2ludGVyIGlzIGxvZ2ljIGVycm9yLiAqLwotI2lmIChkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX0JPVVQpKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gIGV4dCA9IFNfSVNfRVhURVJOQUwgKHN5bWJvbFApOwotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0KLSAgKHZvaWQpIGV4cHJlc3Npb24gKCZleHApOwotCi0gIGlmIChleHAuWF9vcCA9PSBPX2lsbGVnYWwpCi0gICAgYXNfYmFkIChfKCJpbGxlZ2FsIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIpKTsKLSAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19hYnNlbnQpCi0gICAgYXNfYmFkIChfKCJtaXNzaW5nIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIpKTsKLSAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19iaWcpCi0gICAgewotICAgICAgaWYgKGV4cC5YX2FkZF9udW1iZXIgPiAwKQotCWFzX2JhZCAoXygiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgfQotICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX3N1YnRyYWN0Ci0JICAgJiYgKFNfR0VUX1NFR01FTlQgKGV4cC5YX2FkZF9zeW1ib2wpCi0JICAgICAgID09IFNfR0VUX1NFR01FTlQgKGV4cC5YX29wX3N5bWJvbCkpCi0JICAgJiYgU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAoZXhwLlhfYWRkX3N5bWJvbCkpCi0JICAgJiYgKHN5bWJvbF9nZXRfZnJhZyAoZXhwLlhfYWRkX3N5bWJvbCkKLQkgICAgICAgPT0gc3ltYm9sX2dldF9mcmFnIChleHAuWF9vcF9zeW1ib2wpKSkKLSAgICB7Ci0gICAgICBleHAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gKFNfR0VUX1ZBTFVFIChleHAuWF9hZGRfc3ltYm9sKQotCQkJICAtIFNfR0VUX1ZBTFVFIChleHAuWF9vcF9zeW1ib2wpKTsKLSAgICB9Ci0KLSAgc3dpdGNoIChleHAuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2lsbGVnYWw6Ci0gICAgY2FzZSBPX2Fic2VudDoKLSAgICBjYXNlIE9fYmlnOgotICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGFic29sdXRlX3NlY3Rpb24pOwotI2lmIChkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX0JPVVQpKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gICAgICBpZiAoZXh0KQotCVNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICAgIGVsc2UKLQlTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGV4cC5YX2FkZF9udW1iZXIpOwotICAgICAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX3JlZ2lzdGVyOgotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgcmVnX3NlY3Rpb24pOwotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGV4cC5YX2FkZF9udW1iZXIpOwotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGV4cC5YX2FkZF9zeW1ib2wpID09IHVuZGVmaW5lZF9zZWN0aW9uCi0JICB8fCBleHAuWF9hZGRfbnVtYmVyICE9IDApCi0Jc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChzeW1ib2xQLCAmZXhwKTsKLSAgICAgIGVsc2UgaWYgKHN5bWJvbF9zZWN0aW9uX3AgKHN5bWJvbFApKQotCWFzX2JhZCAoImludmFsaWQgYXR0ZW1wdCB0byBzZXQgdmFsdWUgb2Ygc2VjdGlvbiBzeW1ib2wiKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpzID0gZXhwLlhfYWRkX3N5bWJvbDsKLQotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU19HRVRfU0VHTUVOVCAocykpOwotI2lmIChkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX0JPVVQpKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0JICBpZiAoZXh0KQotCSAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBlbHNlCi0JICAgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0JICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwKLQkJICAgICAgIGV4cC5YX2FkZF9udW1iZXIgKyBTX0dFVF9WQUxVRSAocykpOwotCSAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBzeW1ib2xfZ2V0X2ZyYWcgKHMpKTsKLQkgIGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMgKHN5bWJvbFAsIHMpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFRoZSB2YWx1ZSBpcyBzb21lIGNvbXBsZXggZXhwcmVzc2lvbi4KLQkgRklYTUU6IFNob3VsZCB3ZSBzZXQgdGhlIHNlZ21lbnQgdG8gYW55dGhpbmc/ICAqLwotICAgICAgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChzeW1ib2xQLCAmZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLS8qCi0gKgkJCWNvbnMoKQotICoKLSAqIENPTlN0cnVjdCBtb3JlIGZyYWcgb2YgLmJ5dGVzLCBvciAud29yZHMgZXRjLgotICogU2hvdWxkIG5lZWRfcGFzc18yIGJlIDEgdGhlbiBlbWl0IG5vIGZyYWcocykuCi0gKiBUaGlzIHVuZGVyc3RhbmRzIEVYUFJFU1NJT05TLgotICoKLSAqIEJ1ZyAoPykKLSAqCi0gKiBUaGlzIGhhcyBhIHNwbGl0IHBlcnNvbmFsaXR5LiBXZSB1c2UgZXhwcmVzc2lvbigpIHRvIHJlYWQgdGhlCi0gKiB2YWx1ZS4gV2UgY2FuIGRldGVjdCBpZiB0aGUgdmFsdWUgd29uJ3QgZml0IGluIGEgYnl0ZSBvciB3b3JkLgotICogQnV0IHdlIGNhbid0IGRldGVjdCBpZiBleHByZXNzaW9uKCkgZGlzY2FyZGVkIHNpZ25pZmljYW50IGRpZ2l0cwotICogaW4gdGhlIGNhc2Ugb2YgYSBsb25nLiBOb3Qgd29ydGggdGhlIGNyb2NrcyByZXF1aXJlZCB0byBmaXggaXQuCi0gKi8KLQotLyogU2VsZWN0IGEgcGFyc2VyIGZvciBjb25zIGV4cHJlc3Npb25zLiAgKi8KLQotLyogU29tZSB0YXJnZXRzIG5lZWQgdG8gcGFyc2UgdGhlIGV4cHJlc3Npb24gaW4gdmFyaW91cyBmYW5jeSB3YXlzLgotICAgWW91IGNhbiBkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OIHRvIGRvIHdoYXRldmVyIHlvdSBsaWtlCi0gICAoZm9yIGV4YW1wbGUsIHRoZSBIUFBBIGRvZXMgdGhpcykuICBPdGhlcndpc2UsIHlvdSBjYW4gZGVmaW5lCi0gICBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TIHRvIHBlcm1pdCBiaXRmaWVsZHMgdG8gYmUgc3BlY2lmaWVkLCBvcgotICAgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMgdG8gcGVybWl0IHJlcGVhdCBjb3VudHMuICBJZiBub25lIG9mIHRoZXNlCi0gICBhcmUgZGVmaW5lZCwgd2hpY2ggaXMgdGhlIG5vcm1hbCBjYXNlLCB0aGVuIG9ubHkgc2ltcGxlIGV4cHJlc3Npb25zCi0gICBhcmUgcGVybWl0dGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX21yaV9jb25zIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHAsIHVuc2lnbmVkIGludCBuYnl0ZXMpKTsKLQotI2lmbmRlZiBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04KLSNpZmRlZiBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TCi0jZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgcGFyc2VfYml0ZmllbGRfY29ucyAoRVhQLCBOQllURVMpCi1zdGF0aWMgdm9pZCAKLXBhcnNlX2JpdGZpZWxkX2NvbnMgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cCwgdW5zaWduZWQgaW50IG5ieXRlcykpOwotI2VuZGlmCi0jaWZkZWYgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBwYXJzZV9yZXBlYXRfY29ucyAoRVhQLCBOQllURVMpCi1zdGF0aWMgdm9pZAotcGFyc2VfcmVwZWF0X2NvbnMgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cCwgdW5zaWduZWQgaW50IG5ieXRlcykpOwotI2VuZGlmCi0KLS8qIElmIHdlIGhhdmVuJ3QgZ290dGVuIG9uZSB5ZXQsIGp1c3QgY2FsbCBleHByZXNzaW9uLiAgKi8KLSNpZm5kZWYgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OCi0jZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgZXhwcmVzc2lvbiAoRVhQKQotI2VuZGlmCi0jZW5kaWYKLQotLyogd29ya2VyIHRvIGRvIC5ieXRlIGV0YyBzdGF0ZW1lbnRzICovCi0vKiBjbG9iYmVycyBpbnB1dF9saW5lX3BvaW50ZXIsIGNoZWNrcyAqLwotLyogZW5kLW9mLWxpbmUuICovCi1zdGF0aWMgdm9pZCAKLWNvbnNfd29ya2VyIChuYnl0ZXMsIHJ2YSkKLSAgICAgcmVnaXN0ZXIgaW50IG5ieXRlczsJLyogMT0uYnl0ZSwgMj0ud29yZCwgND0ubG9uZyAqLwotICAgICBpbnQgcnZhOwotewotICBpbnQgYzsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgaWYgKGZsYWdfbXJpKQotCW1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIG1kX2NvbnNfYWxpZ24KLSAgbWRfY29uc19hbGlnbiAobmJ5dGVzKTsKLSNlbmRpZgotCi0gIGMgPSAwOwotICBkbwotICAgIHsKLSAgICAgIGlmIChmbGFnX202OGtfbXJpKQotCXBhcnNlX21yaV9jb25zICgmZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOwotICAgICAgZWxzZQotCVRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiAoJmV4cCwgKHVuc2lnbmVkIGludCkgbmJ5dGVzKTsKLQotICAgICAgaWYgKHJ2YSkKLQl7Ci0JICBpZiAoZXhwLlhfb3AgPT0gT19zeW1ib2wpCi0JICAgIGV4cC5YX29wID0gT19zeW1ib2xfcnZhOwotCSAgZWxzZQotCSAgICBhc19mYXRhbCAoXygicnZhIHdpdGhvdXQgc3ltYm9sIikpOwotCX0KLSAgICAgIGVtaXRfZXhwciAoJmV4cCwgKHVuc2lnbmVkIGludCkgbmJ5dGVzKTsKLSAgICAgICsrYzsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICAvKiBJbiBNUkkgbW9kZSwgYWZ0ZXIgYW4gb2RkIG51bWJlciBvZiBieXRlcywgd2UgbXVzdCBhbGlnbiB0byBhbgotICAgICBldmVuIHdvcmQgYm91bmRhcnksIHVubGVzcyB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpcyBhIGRjLmIsIGRzLmIKLSAgICAgb3IgZGNiLmIuICAqLwotICBpZiAoZmxhZ19tcmkgJiYgbmJ5dGVzID09IDEgJiYgKGMgJiAxKSAhPSAwKQotICAgIG1yaV9wZW5kaW5nX2FsaWduID0gMTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXItLTsJCS8qIFB1dCB0ZXJtaW5hdG9yIGJhY2sgaW50byBzdHJlYW0uICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLQotdm9pZAotY29ucyAoc2l6ZSkKLSAgICAgaW50IHNpemU7Ci17Ci0gIGNvbnNfd29ya2VyIChzaXplLCAwKTsKLX0KLQotdm9pZCAKLXNfcnZhIChzaXplKQotICAgICBpbnQgc2l6ZTsKLXsKLSAgY29uc193b3JrZXIgKHNpemUsIDEpOwotfQotCi0vKiBQdXQgdGhlIGNvbnRlbnRzIG9mIGV4cHJlc3Npb24gRVhQIGludG8gdGhlIG9iamVjdCBmaWxlIHVzaW5nCi0gICBOQllURVMgYnl0ZXMuICBJZiBuZWVkX3Bhc3NfMiBpcyAxLCB0aGlzIGRvZXMgbm90aGluZy4gICovCi0KLXZvaWQKLWVtaXRfZXhwciAoZXhwLCBuYnl0ZXMpCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Ci17Ci0gIG9wZXJhdG9yVCBvcDsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgdmFsdWVUIGV4dHJhX2RpZ2l0ID0gMDsKLQotICAvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSBhcmUgZ29pbmcgdG8gbWFrZSBhbm90aGVyIHBhc3MuICAqLwotICBpZiAobmVlZF9wYXNzXzIpCi0gICAgcmV0dXJuOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFdoZW4gZ2NjIGVtaXRzIERXQVJGIDEgZGVidWdnaW5nIHBzZXVkby1vcHMsIGEgbGluZSBudW1iZXIgd2lsbAotICAgICBhcHBlYXIgYXMgYSBmb3VyIGJ5dGUgcG9zaXRpdmUgY29uc3RhbnQgaW4gdGhlIC5saW5lIHNlY3Rpb24sCi0gICAgIGZvbGxvd2VkIGJ5IGEgMiBieXRlIDB4ZmZmZi4gIExvb2sgZm9yIHRoYXQgY2FzZSBoZXJlLiAgKi8KLSAgewotICAgIHN0YXRpYyBpbnQgZHdhcmZfbGluZSA9IC0xOwotCi0gICAgaWYgKHN0cmNtcCAoc2VnbWVudF9uYW1lIChub3dfc2VnKSwgIi5saW5lIikgIT0gMCkKLSAgICAgIGR3YXJmX2xpbmUgPSAtMTsKLSAgICBlbHNlIGlmIChkd2FyZl9saW5lID49IDAKLQkgICAgICYmIG5ieXRlcyA9PSAyCi0JICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgJiYgKGV4cC0+WF9hZGRfbnVtYmVyID09IC0xIHx8IGV4cC0+WF9hZGRfbnVtYmVyID09IDB4ZmZmZikpCi0gICAgICBsaXN0aW5nX3NvdXJjZV9saW5lICgodW5zaWduZWQgaW50KSBkd2FyZl9saW5lKTsKLSAgICBlbHNlIGlmIChuYnl0ZXMgPT0gNAotCSAgICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID49IDApCi0gICAgICBkd2FyZl9saW5lID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgZWxzZQotICAgICAgZHdhcmZfbGluZSA9IC0xOwotICB9Ci0KLSAgLyogV2hlbiBnY2MgZW1pdHMgRFdBUkYgMSBkZWJ1Z2dpbmcgcHNldWRvLW9wcywgYSBmaWxlIG5hbWUgd2lsbAotICAgICBhcHBlYXIgYXMgYSAyIGJ5dGUgVEFHX2NvbXBpbGVfdW5pdCAoMHgxMSkgZm9sbG93ZWQgYnkgYSAyIGJ5dGUKLSAgICAgQVRfc2libGluZyAoMHgxMikgZm9sbG93ZWQgYnkgYSBmb3VyIGJ5dGUgYWRkcmVzcyBvZiB0aGUgc2libGluZwotICAgICBmb2xsb3dlZCBieSBhIDIgYnl0ZSBBVF9uYW1lICgweDM4KSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUKLSAgICAgZmlsZS4gIFdlIGxvb2sgZm9yIHRoYXQgY2FzZSBoZXJlLiAgKi8KLSAgewotICAgIHN0YXRpYyBpbnQgZHdhcmZfZmlsZSA9IDA7Ci0KLSAgICBpZiAoc3RyY21wIChzZWdtZW50X25hbWUgKG5vd19zZWcpLCAiLmRlYnVnIikgIT0gMCkKLSAgICAgIGR3YXJmX2ZpbGUgPSAwOwotICAgIGVsc2UgaWYgKGR3YXJmX2ZpbGUgPT0gMAotCSAgICAgJiYgbmJ5dGVzID09IDIKLQkgICAgICYmIGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAmJiBleHAtPlhfYWRkX251bWJlciA9PSAweDExKQotICAgICAgZHdhcmZfZmlsZSA9IDE7Ci0gICAgZWxzZSBpZiAoZHdhcmZfZmlsZSA9PSAxCi0JICAgICAmJiBuYnl0ZXMgPT0gMgotCSAgICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID09IDB4MTIpCi0gICAgICBkd2FyZl9maWxlID0gMjsKLSAgICBlbHNlIGlmIChkd2FyZl9maWxlID09IDIKLQkgICAgICYmIG5ieXRlcyA9PSA0KQotICAgICAgZHdhcmZfZmlsZSA9IDM7Ci0gICAgZWxzZSBpZiAoZHdhcmZfZmlsZSA9PSAzCi0JICAgICAmJiBuYnl0ZXMgPT0gMgotCSAgICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID09IDB4MzgpCi0gICAgICBkd2FyZl9maWxlID0gNDsKLSAgICBlbHNlCi0gICAgICBkd2FyZl9maWxlID0gMDsKLQotICAgIC8qIFRoZSB2YXJpYWJsZSBkd2FyZl9maWxlX3N0cmluZyB0ZWxscyBzdHJpbmdlciB0aGF0IHRoZSBzdHJpbmcKLSAgICAgICBtYXkgYmUgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlLiAgKi8KLSAgICBpZiAoZHdhcmZfZmlsZSA9PSA0KQotICAgICAgZHdhcmZfZmlsZV9zdHJpbmcgPSAxOwotICAgIGVsc2UKLSAgICAgIGR3YXJmX2ZpbGVfc3RyaW5nID0gMDsKLSAgfQotI2VuZGlmCi0jZW5kaWYKLQotICBpZiAoY2hlY2tfZWhfZnJhbWUgKGV4cCwgJm5ieXRlcykpCi0gICAgcmV0dXJuOwotCi0gIG9wID0gZXhwLT5YX29wOwotCi0gIC8qIEFsbG93IGAud29yZCAwJyBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gICovCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgewotICAgICAgaWYgKG9wICE9IE9fY29uc3RhbnQgfHwgZXhwLT5YX2FkZF9udW1iZXIgIT0gMCkKLQlhc19iYWQgKF8oImF0dGVtcHQgdG8gc3RvcmUgdmFsdWUgaW4gYWJzb2x1dGUgc2VjdGlvbiIpKTsKLSAgICAgIGFic19zZWN0aW9uX29mZnNldCArPSBuYnl0ZXM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEhhbmRsZSBhIG5lZ2F0aXZlIGJpZ251bS4gICovCi0gIGlmIChvcCA9PSBPX3VtaW51cwotICAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMAotICAgICAgJiYgc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChleHAtPlhfYWRkX3N5bWJvbCktPlhfb3AgPT0gT19iaWcKLSAgICAgICYmIHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoZXhwLT5YX2FkZF9zeW1ib2wpLT5YX2FkZF9udW1iZXIgPiAwKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgdW5zaWduZWQgbG9uZyBjYXJyeTsKLQotICAgICAgZXhwID0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChleHAtPlhfYWRkX3N5bWJvbCk7Ci0KLSAgICAgIC8qIE5lZ2F0ZSB0aGUgYmlnbnVtOiBvbmUncyBjb21wbGVtZW50IGVhY2ggZGlnaXQgYW5kIGFkZCAxLiAgKi8KLSAgICAgIGNhcnJ5ID0gMTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBleHAtPlhfYWRkX251bWJlcjsgaSsrKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgbmV4dDsKLQotCSAgbmV4dCA9ICgoKH4gKGdlbmVyaWNfYmlnbnVtW2ldICYgTElUVExFTlVNX01BU0spKQotCQkgICAmIExJVFRMRU5VTV9NQVNLKQotCQkgICsgY2FycnkpOwotCSAgZ2VuZXJpY19iaWdudW1baV0gPSBuZXh0ICYgTElUVExFTlVNX01BU0s7Ci0JICBjYXJyeSA9IG5leHQgPj4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCX0KLQotICAgICAgLyogV2UgY2FuIGlnbm9yZSBhbnkgY2Fycnkgb3V0LCBiZWNhdXNlIGl0IHdpbGwgYmUgaGFuZGxlZCBieQotCSBleHRyYV9kaWdpdCBpZiBpdCBpcyBuZWVkZWQuICAqLwotCi0gICAgICBleHRyYV9kaWdpdCA9ICh2YWx1ZVQpIC0xOwotICAgICAgb3AgPSBPX2JpZzsKLSAgICB9Ci0KLSAgaWYgKG9wID09IE9fYWJzZW50IHx8IG9wID09IE9faWxsZWdhbCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJ6ZXJvIGFzc3VtZWQgZm9yIG1pc3NpbmcgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG9wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fYmlnICYmIGV4cC0+WF9hZGRfbnVtYmVyIDw9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJmbG9hdGluZyBwb2ludCBudW1iZXIgaW52YWxpZDsgemVybyBhc3N1bWVkIikpOwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLSAgZWxzZSBpZiAob3AgPT0gT19yZWdpc3RlcikKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJyZWdpc3RlciB2YWx1ZSB1c2VkIGFzIGV4cHJlc3Npb24iKSk7Ci0gICAgICBvcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotCi0gIHAgPSBmcmFnX21vcmUgKChpbnQpIG5ieXRlcyk7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotICAvKiBJZiB3ZSBoYXZlIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIGEgd29yZCwgc2F2ZSBpdCBvbgotICAgICB0aGUgYnJva2VuX3dvcmRzIGxpc3QuICBTZWUgdGhlIGNvZGUgaW4gd3JpdGUuYy4gICovCi0gIGlmIChvcCA9PSBPX3N1YnRyYWN0ICYmIG5ieXRlcyA9PSAyKQotICAgIHsKLSAgICAgIHN0cnVjdCBicm9rZW5fd29yZCAqeDsKLQotICAgICAgeCA9IChzdHJ1Y3QgYnJva2VuX3dvcmQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYnJva2VuX3dvcmQpKTsKLSAgICAgIHgtPm5leHRfYnJva2VuX3dvcmQgPSBicm9rZW5fd29yZHM7Ci0gICAgICBicm9rZW5fd29yZHMgPSB4OwotICAgICAgeC0+c2VnID0gbm93X3NlZzsKLSAgICAgIHgtPnN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgICB4LT5mcmFnID0gZnJhZ19ub3c7Ci0gICAgICB4LT53b3JkX2dvZXNfaGVyZSA9IHA7Ci0gICAgICB4LT5kaXNwZnJhZyA9IDA7Ci0gICAgICB4LT5hZGQgPSBleHAtPlhfYWRkX3N5bWJvbDsKLSAgICAgIHgtPnN1YiA9IGV4cC0+WF9vcF9zeW1ib2w7Ci0gICAgICB4LT5hZGRudW0gPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICAgIHgtPmFkZGVkID0gMDsKLSAgICAgIG5ld19icm9rZW5fd29yZHMrKzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBJZiB3ZSBoYXZlIGFuIGludGVnZXIsIGJ1dCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGlzIHRvbyBsYXJnZSB0bwotICAgICBwYXNzIHRvIG1kX251bWJlcl90b19jaGFycywgaGFuZGxlIGl0IGFzIGEgYmlnbnVtLiAgKi8KLSAgaWYgKG9wID09IE9fY29uc3RhbnQgJiYgbmJ5dGVzID4gc2l6ZW9mICh2YWx1ZVQpKQotICAgIHsKLSAgICAgIHZhbHVlVCB2YWw7Ci0gICAgICBpbnQgZ2VuY250OwotCi0gICAgICBpZiAoISBleHAtPlhfdW5zaWduZWQgJiYgZXhwLT5YX2FkZF9udW1iZXIgPCAwKQotCWV4dHJhX2RpZ2l0ID0gKHZhbHVlVCkgLTE7Ci0gICAgICB2YWwgPSAodmFsdWVUKSBleHAtPlhfYWRkX251bWJlcjsKLSAgICAgIGdlbmNudCA9IDA7Ci0gICAgICBkbwotCXsKLQkgIGdlbmVyaWNfYmlnbnVtW2dlbmNudF0gPSB2YWwgJiBMSVRUTEVOVU1fTUFTSzsKLQkgIHZhbCA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCSAgKytnZW5jbnQ7Ci0JfQotICAgICAgd2hpbGUgKHZhbCAhPSAwKTsKLSAgICAgIG9wID0gZXhwLT5YX29wID0gT19iaWc7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IGdlbmNudDsKLSAgICB9Ci0KLSAgaWYgKG9wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgcmVnaXN0ZXIgdmFsdWVUIGdldDsKLSAgICAgIHJlZ2lzdGVyIHZhbHVlVCB1c2U7Ci0gICAgICByZWdpc3RlciB2YWx1ZVQgbWFzazsKLSAgICAgIHZhbHVlVCBoaWJpdDsKLSAgICAgIHJlZ2lzdGVyIHZhbHVlVCB1bm1hc2s7Ci0KLSAgICAgIC8qIEpGIDw8IG9mID49IG51bWJlciBvZiBiaXRzIGluIHRoZSBvYmplY3QgaXMgdW5kZWZpbmVkLiAgSW4KLQkgcGFydGljdWxhciBTUEFSQyAoU3VuIDQpIGhhcyBwcm9ibGVtcyAqLwotICAgICAgaWYgKG5ieXRlcyA+PSBzaXplb2YgKHZhbHVlVCkpCi0JewotCSAgbWFzayA9IDA7Ci0JICBpZiAobmJ5dGVzID4gc2l6ZW9mICh2YWx1ZVQpKQotCSAgICBoaWJpdCA9IDA7Ci0JICBlbHNlCi0JICAgIGhpYml0ID0gKHZhbHVlVCkgMSA8PCAobmJ5dGVzICogQklUU19QRVJfQ0hBUiAtIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEb24ndCBzdG9yZSB0aGVzZSBiaXRzLiAqLwotCSAgbWFzayA9IH4odmFsdWVUKSAwIDw8IChCSVRTX1BFUl9DSEFSICogbmJ5dGVzKTsKLQkgIGhpYml0ID0gKHZhbHVlVCkgMSA8PCAobmJ5dGVzICogQklUU19QRVJfQ0hBUiAtIDEpOwotCX0KLQotICAgICAgdW5tYXNrID0gfm1hc2s7CQkvKiBEbyBzdG9yZSB0aGVzZSBiaXRzLiAqLwotCi0jaWZkZWYgTkVWRVIKLSAgICAgICJEbyB0aGlzIG1vZCBpZiB5b3Ugd2FudCBldmVyeSBvdmVyZmxvdyBjaGVjayB0byBhc3N1bWUgU0lHTkVEIDIncyBjb21wbGVtZW50IGRhdGEuIjsKLSAgICAgIG1hc2sgPSB+KHVubWFzayA+PiAxKTsJLyogSW5jbHVkZXMgc2lnbiBiaXQgbm93LiAqLwotI2VuZGlmCi0KLSAgICAgIGdldCA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICAgICAgdXNlID0gZ2V0ICYgdW5tYXNrOwotICAgICAgaWYgKChnZXQgJiBtYXNrKSAhPSAwCi0JICAmJiAoKGdldCAmIG1hc2spICE9IG1hc2sKLQkgICAgICB8fCAoZ2V0ICYgaGliaXQpID09IDApKQotCXsJCS8qIExlYWRpbmcgYml0cyBjb250YWluIGJvdGggMHMgJiAxcy4gKi8KLQkgIGFzX3dhcm4gKF8oIlZhbHVlIDB4JWx4IHRydW5jYXRlZCB0byAweCVseC4iKSwKLQkJICAgKHVuc2lnbmVkIGxvbmcpIGdldCwgKHVuc2lnbmVkIGxvbmcpIHVzZSk7Ci0JfQotICAgICAgLyogcHV0IGJ5dGVzIGluIHJpZ2h0IG9yZGVyLiAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCB1c2UsIChpbnQpIG5ieXRlcyk7Ci0gICAgfQotICBlbHNlIGlmIChvcCA9PSBPX2JpZykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgIExJVFRMRU5VTV9UWVBFICpudW1zOwotCi0gICAgICBrbm93IChuYnl0ZXMgJSBDSEFSU19QRVJfTElUVExFTlVNID09IDApOwotCi0gICAgICBzaXplID0gZXhwLT5YX2FkZF9udW1iZXIgKiBDSEFSU19QRVJfTElUVExFTlVNOwotICAgICAgaWYgKG5ieXRlcyA8IHNpemUpCi0JewotCSAgYXNfd2FybiAoXygiQmlnbnVtIHRydW5jYXRlZCB0byAlZCBieXRlcyIpLCBuYnl0ZXMpOwotCSAgc2l6ZSA9IG5ieXRlczsKLQl9Ci0KLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQl7Ci0JICB3aGlsZSAobmJ5dGVzID4gc2l6ZSkKLQkgICAgewotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgZXh0cmFfZGlnaXQsIENIQVJTX1BFUl9MSVRUTEVOVU0pOwotCSAgICAgIG5ieXRlcyAtPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICAgIHAgKz0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgfQotCi0JICBudW1zID0gZ2VuZXJpY19iaWdudW0gKyBzaXplIC8gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgIHdoaWxlIChzaXplID4gMCkKLQkgICAgewotCSAgICAgIC0tbnVtczsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpICpudW1zLCBDSEFSU19QRVJfTElUVExFTlVNKTsKLQkgICAgICBzaXplIC09IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgICAgcCArPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG51bXMgPSBnZW5lcmljX2JpZ251bTsKLQkgIHdoaWxlIChzaXplID4gMCkKLQkgICAgewotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgKm51bXMsIENIQVJTX1BFUl9MSVRUTEVOVU0pOwotCSAgICAgICsrbnVtczsKLQkgICAgICBzaXplIC09IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgICAgcCArPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICAgIG5ieXRlcyAtPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICB9Ci0KLQkgIHdoaWxlIChuYnl0ZXMgPiAwKQotCSAgICB7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBleHRyYV9kaWdpdCwgQ0hBUlNfUEVSX0xJVFRMRU5VTSk7Ci0JICAgICAgbmJ5dGVzIC09IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgICAgcCArPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1lbXNldCAocCwgMCwgbmJ5dGVzKTsKLQotICAgICAgLyogTm93IHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXhTIHRvIHJlY29yZCB0aGUgc3ltYm9sIHZhbHVlLgotCSBUaGlzIGlzIGVhc3kgZm9yIEJGRC4gIEZvciBvdGhlciB0YXJnZXRzIGl0IGNhbiBiZSBtb3JlCi0JIGNvbXBsZXguICBGb3IgdmVyeSBjb21wbGV4IGNhc2VzIChjdXJyZW50bHksIHRoZSBIUFBBIGFuZAotCSBOUzMySyksIHlvdSBjYW4gZGVmaW5lIFRDX0NPTlNfRklYX05FVyB0byBkbyB3aGF0ZXZlciB5b3UKLQkgd2FudC4gIEZvciBzaW1wbGVyIGNhc2VzLCB5b3UgY2FuIGRlZmluZSBUQ19DT05TX1JFTE9DIHRvIGJlCi0JIHRoZSBuYW1lIG9mIHRoZSByZWxvYyBjb2RlIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgZml4Uy4KLQkgSWYgbmVpdGhlciBpcyBkZWZpbmVkLCB0aGUgY29kZSB1c2VzIE5PX1JFTE9DIGlmIGl0IGlzCi0JIGRlZmluZWQsIGFuZCBvdGhlcndpc2UgdXNlcyAwLiAgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBUQ19DT05TX0ZJWF9ORVcKLSAgICAgIFRDX0NPTlNfRklYX05FVyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgbmJ5dGVzLCBleHApOwotI2Vsc2UKLSAgICAgIHsKLQliZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcjsKLQotCXN3aXRjaCAobmJ5dGVzKQotCSAgewotCSAgY2FzZSAxOgotCSAgICByID0gQkZEX1JFTE9DXzg7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICByID0gQkZEX1JFTE9DXzE2OwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgciA9IEJGRF9SRUxPQ18zMjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDg6Ci0JICAgIHIgPSBCRkRfUkVMT0NfNjQ7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgYXNfYmFkIChfKCJ1bnN1cHBvcnRlZCBCRkQgcmVsb2NhdGlvbiBzaXplICV1IiksIG5ieXRlcyk7Ci0JICAgIHIgPSBCRkRfUkVMT0NfMzI7Ci0JICAgIGJyZWFrOwotCSAgfQotCWZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAoaW50KSBuYnl0ZXMsIGV4cCwKLQkJICAgICAwLCByKTsKLSAgICAgIH0KLSNlbmRpZgotI2Vsc2UKLSNpZmRlZiBUQ19DT05TX0ZJWF9ORVcKLSAgICAgIFRDX0NPTlNfRklYX05FVyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgbmJ5dGVzLCBleHApOwotI2Vsc2UKLSAgICAgIC8qIEZpZ3VyZSBvdXQgd2hpY2ggcmVsb2MgbnVtYmVyIHRvIHVzZS4gIFVzZSBUQ19DT05TX1JFTE9DIGlmCi0JIGl0IGlzIGRlZmluZWQsIG90aGVyd2lzZSB1c2UgTk9fUkVMT0MgaWYgaXQgaXMgZGVmaW5lZCwKLQkgb3RoZXJ3aXNlIHVzZSAwLiAgKi8KLSNpZm5kZWYgVENfQ09OU19SRUxPQwotI2lmZGVmIE5PX1JFTE9DCi0jZGVmaW5lIFRDX0NPTlNfUkVMT0MgTk9fUkVMT0MKLSNlbHNlCi0jZGVmaW5lIFRDX0NPTlNfUkVMT0MgMAotI2VuZGlmCi0jZW5kaWYKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAoaW50KSBuYnl0ZXMsIGV4cCwgMCwKLQkJICAgVENfQ09OU19SRUxPQyk7Ci0jZW5kaWYgLyogVENfQ09OU19GSVhfTkVXICovCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotICAgIH0KLX0KLQwKLSNpZmRlZiBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TCi0KLS8qIGk5NjAgYXNzZW1ibGVycywgKGVnLCBhc205NjApLCBhbGxvdyBiaXRmaWVsZHMgYWZ0ZXIgIi5ieXRlIiBhcwotICAgdzp4LHk6eiwgd2hlcmUgdyBhbmQgeSBhcmUgYml0d2lkdGhzIGFuZCB4IGFuZCB5IGFyZSB2YWx1ZXMuICBUaGV5Ci0gICB0aGVuIHBhY2sgdGhlbSBhbGwgdG9nZXRoZXIuIFdlIGRvIGEgbGl0dGxlIGJldHRlciBpbiB0aGF0IHdlIGFsbG93Ci0gICB0aGVtIGluIHdvcmRzLCBsb25ncywgZXRjLiBhbmQgd2UnbGwgcGFjayB0aGVtIGluIHRhcmdldCBieXRlIG9yZGVyCi0gICBmb3IgeW91LgotCi0gICBUaGUgcnVsZXMgYXJlOiBwYWNrIGxlYXN0IHNpZ25pZmljYXQgYml0IGZpcnN0LCBpZiBhIGZpZWxkIGRvZXNuJ3QKLSAgIGVudGlyZWx5IGZpdCwgcHV0IGl0IGluIHRoZSBuZXh0IHVuaXQuICBPdmVyZmxvd2luZyB0aGUgYml0ZmllbGQgaXMKLSAgIGV4cGxpY2l0bHkgKm5vdCogZXZlbiBhIHdhcm5pbmcuICBUaGUgYml0d2lkdGggc2hvdWxkIGJlIGNvbnNpZGVyZWQKLSAgIGEgIm1hc2siLgotCi0gICBUbyB1c2UgdGhpcyBmdW5jdGlvbiB0aGUgdGMtWFhYLmggZmlsZSBzaG91bGQgZGVmaW5lCi0gICBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TLiAgKi8KLQotc3RhdGljIHZvaWQgCi1wYXJzZV9iaXRmaWVsZF9jb25zIChleHAsIG5ieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKLXsKLSAgdW5zaWduZWQgaW50IGJpdHNfYXZhaWxhYmxlID0gQklUU19QRVJfQ0hBUiAqIG5ieXRlczsKLSAgY2hhciAqaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAodm9pZCkgZXhwcmVzc2lvbiAoZXhwKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnOicpCi0gICAgewkJCS8qIGJpdGZpZWxkcyAqLwotICAgICAgbG9uZyB2YWx1ZSA9IDA7Ci0KLSAgICAgIGZvciAoOzspCi0JewotCSAgdW5zaWduZWQgbG9uZyB3aWR0aDsKLQotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJzonKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBicmVhazsKLQkgICAgfQkJCS8qIG5leHQgcGllY2UgaXMgbm90IGEgYml0ZmllbGQgKi8KLQotCSAgLyogSW4gdGhlIGdlbmVyYWwgY2FzZSwgd2UgY2FuJ3QgYWxsb3cKLQkgICAgIGZ1bGwgZXhwcmVzc2lvbnMgd2l0aCBzeW1ib2wKLQkgICAgIGRpZmZlcmVuY2VzIGFuZCBzdWNoLiAgVGhlIHJlbG9jYXRpb24KLQkgICAgIGVudHJpZXMgZm9yIHN5bWJvbHMgbm90IGRlZmluZWQgaW4gdGhpcwotCSAgICAgYXNzZW1ibHkgd291bGQgcmVxdWlyZSBhcmJpdHJhcnkgZmllbGQKLQkgICAgIHdpZHRocywgcG9zaXRpb25zLCBhbmQgbWFza3Mgd2hpY2ggbW9zdAotCSAgICAgb2Ygb3VyIGN1cnJlbnQgb2JqZWN0IGZvcm1hdHMgZG9uJ3QKLQkgICAgIHN1cHBvcnQuCi0KLQkgICAgIEluIHRoZSBzcGVjaWZpYyBjYXNlIHdoZXJlIGEgc3ltYm9sCi0JICAgICAqaXMqIGRlZmluZWQgaW4gdGhpcyBhc3NlbWJseSwgd2UKLQkgICAgICpjb3VsZCogYnVpbGQgZml4dXBzIGFuZCB0cmFjayBpdCwgYnV0Ci0JICAgICB0aGlzIGNvdWxkIGxlYWQgdG8gY29uZnVzaW9uIGZvciB0aGUKLQkgICAgIGJhY2tlbmRzLiAgSSdtIGxhenkuIEknbGwgdGFrZSBhbnkKLQkgICAgIFNFR19BQlNPTFVURS4gSSB0aGluayB0aGF0IG1lYW5zIHRoYXQKLQkgICAgIHlvdSBjYW4gdXNlIGEgcHJldmlvdXMgLnNldCBvcgotCSAgICAgLmVxdSB0eXBlIHN5bWJvbC4gIHhveG9yaWNoLiAqLwotCi0JICBpZiAoZXhwLT5YX29wID09IE9fYWJzZW50KQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygidXNpbmcgYSBiaXQgZmllbGQgd2lkdGggb2YgemVybyIpKTsKLQkgICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7Ci0JICAgICAgZXhwLT5YX29wID0gT19jb25zdGFudDsKLQkgICAgfQkJCS8qIGltcGxpZWQgemVybyB3aWR0aCBiaXRmaWVsZCAqLwotCi0JICBpZiAoZXhwLT5YX29wICE9IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQkgICAgICBhc19iYWQgKF8oImZpZWxkIHdpZHRoIFwiJXNcIiB0b28gY29tcGxleCBmb3IgYSBiaXRmaWVsZCIpLCBob2xkKTsKLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJzonOwotCSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9CQkJLyogdG9vIGNvbXBsZXggKi8KLQotCSAgaWYgKCh3aWR0aCA9IGV4cC0+WF9hZGRfbnVtYmVyKSA+IChCSVRTX1BFUl9DSEFSICogbmJ5dGVzKSkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImZpZWxkIHdpZHRoICVsdSB0b28gYmlnIHRvIGZpdCBpbiAlZCBieXRlczogdHJ1bmNhdGVkIHRvICVkIGJpdHMiKSwKLQkJICAgICAgIHdpZHRoLCBuYnl0ZXMsIChCSVRTX1BFUl9DSEFSICogbmJ5dGVzKSk7Ci0JICAgICAgd2lkdGggPSBCSVRTX1BFUl9DSEFSICogbmJ5dGVzOwotCSAgICB9CQkJLyogdG9vIGJpZyAqLwotCi0JICBpZiAod2lkdGggPiBiaXRzX2F2YWlsYWJsZSkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FLVNPTUVEQVk6IGJhY2tpbmcgdXAgYW5kIHJlcGFyc2luZyBpcyB3YXN0ZWZ1bC4gICovCi0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBleHAtPlhfYWRkX251bWJlciA9IHZhbHVlOwotCSAgICAgIGJyZWFrOwotCSAgICB9CQkJLyogd29uJ3QgZml0ICovCi0KLQkgIGhvbGQgPSArK2lucHV0X2xpbmVfcG9pbnRlcjsgLyogc2tpcCAnOicgKi8KLQotCSAgKHZvaWQpIGV4cHJlc3Npb24gKGV4cCk7Ci0JICBpZiAoZXhwLT5YX29wICE9IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBjaGFyIGNhY2hlID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotCSAgICAgIGFzX2JhZCAoXygiZmllbGQgdmFsdWUgXCIlc1wiIHRvbyBjb21wbGV4IGZvciBhIGJpdGZpZWxkIiksIGhvbGQpOwotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjYWNoZTsKLQkgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQkJCS8qIHRvbyBjb21wbGV4ICovCi0KLQkgIHZhbHVlIHw9ICgofigtMSA8PCB3aWR0aCkgJiBleHAtPlhfYWRkX251bWJlcikKLQkJICAgIDw8ICgoQklUU19QRVJfQ0hBUiAqIG5ieXRlcykgLSBiaXRzX2F2YWlsYWJsZSkpOwotCi0JICBpZiAoKGJpdHNfYXZhaWxhYmxlIC09IHdpZHRoKSA9PSAwCi0JICAgICAgfHwgaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKQotCSAgICAgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0JCQkvKiBhbGwgdGhlIGJpdGZpZWxkcyB3ZSdyZSBnb25uYSBnZXQgKi8KLQotCSAgaG9sZCA9ICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgKHZvaWQpIGV4cHJlc3Npb24gKGV4cCk7Ci0JfQkJCS8qIGZvcmV2ZXIgbG9vcCAqLwotCi0gICAgICBleHAtPlhfYWRkX251bWJlciA9IHZhbHVlOwotICAgICAgZXhwLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cC0+WF91bnNpZ25lZCA9IDE7Ci0gICAgfQkJCQkvKiBpZiBsb29rcyBsaWtlIGEgYml0ZmllbGQgKi8KLX0JCQkJLyogcGFyc2VfYml0ZmllbGRfY29ucygpICovCi0KLSNlbmRpZiAvKiBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TICovCi0MCi0vKiBIYW5kbGUgYW4gTVJJIHN0eWxlIHN0cmluZyBleHByZXNzaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX21yaV9jb25zIChleHAsIG5ieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wnJwotICAgICAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnXCcnCi0JICB8fCAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnQScKLQkgICAgICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICdFJykpKQotICAgIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiAoZXhwLCBuYnl0ZXMpOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNjYW47Ci0gICAgICB1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKLQotICAgICAgLyogQW4gTVJJIHN0eWxlIHN0cmluZy4gIEN1dCBpbnRvIGFzIG1hbnkgYnl0ZXMgYXMgd2lsbCBmaXQgaW50bwotCSBhIG5ieXRlIGNodW5rLCBsZWZ0IGp1c3RpZnkgaWYgbmVjZXNzYXJ5LCBhbmQgc2VwYXJhdGUgd2l0aAotCSBjb21tYXMgc28gd2UgY2FuIHRyeSBhZ2FpbiBsYXRlci4gICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQScpCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdFJykKLQl7Ci0JICBhc19iYWQgKF8oIkVCQ0RJQyBjb25zdGFudHMgYXJlIG5vdCBzdXBwb3J0ZWQiKSk7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgZm9yIChzY2FuID0gMDsgc2NhbiA8IG5ieXRlczsgc2NhbisrKQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycpCi0JICAgIHsKLQkgICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdcJycpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJfQotCSAgICAgIGVsc2UKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgfCAoKmlucHV0X2xpbmVfcG9pbnRlcisrKTsKLQl9Ci0KLSAgICAgIC8qIExlZnQganVzdGlmeSAqLwotICAgICAgd2hpbGUgKHNjYW4gPCBuYnl0ZXMpCi0JewotCSAgcmVzdWx0IDw8PSA4OwotCSAgc2NhbisrOwotCX0KLSAgICAgIC8qIENyZWF0ZSBjb3JyZWN0IGV4cHJlc3Npb24gKi8KLSAgICAgIGV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IHJlc3VsdDsKLSAgICAgIC8qIEZha2UgaXQgc28gdGhhdCB3ZSBjYW4gcmVhZCB0aGUgbmV4dCBjaGFyIHRvbyAqLwotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSAhPSAnXCcnIHx8Ci0JICAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICdcJycgJiYgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdcJycpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciAtPSAyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyWzBdID0gJywnOwotCSAgaW5wdXRfbGluZV9wb2ludGVyWzFdID0gJ1wnJzsKLQl9Ci0gICAgICBlbHNlCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotfQotDAotI2lmZGVmIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCi0KLS8qIFBhcnNlIGEgcmVwZWF0IGV4cHJlc3Npb24gZm9yIGNvbnMuICBUaGlzIGlzIHVzZWQgYnkgdGhlIE1JUFMKLSAgIGFzc2VtYmxlci4gIFRoZSBmb3JtYXQgaXMgTlVNQkVSOkNPVU5UOyBOVU1CRVIgYXBwZWFycyBpbiB0aGUKLSAgIG9iamVjdCBmaWxlIENPVU5UIHRpbWVzLgotCi0gICBUbyB1c2UgdGhpcyBmb3IgYSB0YXJnZXQsIGRlZmluZSBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYXJzZV9yZXBlYXRfY29ucyAoZXhwLCBuYnl0ZXMpCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Ci17Ci0gIGV4cHJlc3Npb25TIGNvdW50OwotICByZWdpc3RlciBpbnQgaTsKLQotICBleHByZXNzaW9uIChleHApOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc6JykKLSAgICB7Ci0gICAgICAvKiBObyByZXBlYXQgY291bnQuICAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgZXhwcmVzc2lvbiAoJmNvdW50KTsKLSAgaWYgKGNvdW50Llhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgY291bnQuWF9hZGRfbnVtYmVyIDw9IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiVW5yZXNvbHZhYmxlIG9yIG5vbnBvc2l0aXZlIHJlcGVhdCBjb3VudDsgdXNpbmcgMSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogVGhlIGNvbnMgZnVuY3Rpb24gaXMgZ29pbmcgdG8gb3V0cHV0IHRoaXMgZXhwcmVzc2lvbiBvbmNlLiAgU28gd2UKLSAgICAgb3V0cHV0IGl0IGNvdW50IC0gMSB0aW1lcy4gICovCi0gIGZvciAoaSA9IGNvdW50LlhfYWRkX251bWJlciAtIDE7IGkgPiAwOyBpLS0pCi0gICAgZW1pdF9leHByIChleHAsIG5ieXRlcyk7Ci19Ci0KLSNlbmRpZiAvKiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyAqLwotDAotLyogUGFyc2UgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50ZWQgYXMgYSBoZXggY29uc3RhbnQuICBUaGlzCi0gICBwZXJtaXRzIHVzZXJzIHRvIHNwZWNpZnkgdGhlIGV4YWN0IGJpdHMgdGhleSB3YW50IGluIHRoZSBmbG9hdGluZwotICAgcG9pbnQgbnVtYmVyLiAgKi8KLQotc3RhdGljIGludAotaGV4X2Zsb2F0IChmbG9hdF90eXBlLCBieXRlcykKLSAgICAgaW50IGZsb2F0X3R5cGU7Ci0gICAgIGNoYXIgKmJ5dGVzOwotewotICBpbnQgbGVuZ3RoOwotICBpbnQgaTsKLQotICBzd2l0Y2ggKGZsb2F0X3R5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgbGVuZ3RoID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBsZW5ndGggPSA4OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIGxlbmd0aCA9IDEyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIGxlbmd0aCA9IDEyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJVbmtub3duIGZsb2F0aW5nIHR5cGUgdHlwZSAnJWMnIiksIGZsb2F0X3R5cGUpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGdvIHRocm91Z2ggZXhwcmVzc2lvbiB0byBwYXJzZSB0aGUKLSAgICAgaGV4IGNvbnN0YW50LCBidXQgaWYgd2UgZ2V0IGEgYmlnbnVtIGl0J3MgYSBwYWluIHRvIHNvcnQgaXQgaW50bwotICAgICB0aGUgYnVmZmVyIGNvcnJlY3RseS4gICovCi0gIGkgPSAwOwotICB3aGlsZSAoaGV4X3AgKCppbnB1dF9saW5lX3BvaW50ZXIpIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ18nKQotICAgIHsKLSAgICAgIGludCBkOwotCi0gICAgICAvKiBUaGUgTVJJIGFzc2VtYmxlciBhY2NlcHRzIGFyYml0cmFyeSB1bmRlcnNjb3JlcyBzdHJld24gYWJvdXQKLQkgdGhyb3VnaCB0aGUgaGV4IGNvbnN0YW50LCBzbyB3ZSBpZ25vcmUgdGhlbSBhcyB3ZWxsLiAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ18nKQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoaSA+PSBsZW5ndGgpCi0JewotCSAgYXNfd2FybiAoXygiRmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgdG9vIGxhcmdlIikpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGQgPSBoZXhfdmFsdWUgKCppbnB1dF9saW5lX3BvaW50ZXIpIDw8IDQ7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdfJykKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlmIChoZXhfcCAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JewotCSAgZCArPSBoZXhfdmFsdWUgKCppbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWJ5dGVzW2ldID0gZDsKLSAgICAgIGVsc2UKLQlieXRlc1tsZW5ndGggLSBpIC0gMV0gPSBkOwotICAgICAgKytpOwotICAgIH0KLQotICBpZiAoaSA8IGxlbmd0aCkKLSAgICB7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JbWVtc2V0IChieXRlcyArIGksIDAsIGxlbmd0aCAtIGkpOwotICAgICAgZWxzZQotCW1lbXNldCAoYnl0ZXMsIDAsIGxlbmd0aCAtIGkpOwotICAgIH0KLQotICByZXR1cm4gbGVuZ3RoOwotfQotCi0vKgotICoJCQlmbG9hdF9jb25zKCkKLSAqCi0gKiBDT05TdHJ1Y3Qgc29tZSBtb3JlIGZyYWcgY2hhcnMgb2YgLmZsb2F0cyAuZmZsb2F0cyBldGMuCi0gKiBNYWtlcyAwIG9yIG1vcmUgbmV3IGZyYWdzLgotICogSWYgbmVlZF9wYXNzXzIgPT0gMSwgbm8gZnJhZ3MgYXJlIGVtaXR0ZWQuCi0gKiBUaGlzIHVuZGVyc3RhbmRzIG9ubHkgZmxvYXRpbmcgbGl0ZXJhbHMsIG5vdCBleHByZXNzaW9ucy4gU29ycnkuCi0gKgotICogQSBmbG9hdGluZyBjb25zdGFudCBpcyBkZWZpbmVkIGJ5IGF0b2ZfZ2VuZXJpYygpLCBleGNlcHQgaXQgaXMgcHJlY2VkZWQKLSAqIGJ5IDBkIDBmIDBnIG9yIDBoLiBBZnRlciBvYnNlcnZpbmcgdGhlIFNUUkFOR0Ugd2F5IG15IEJTRCBBUyBkb2VzIGl0cwotICogcmVhZGluZywgSSBkZWNpZGVkIHRvIGJlIGluY29tcGF0aWJsZS4gVGhpcyBhbHdheXMgdHJpZXMgdG8gZ2l2ZSB5b3UKLSAqIHJvdW5kZWQgYml0cyB0byB0aGUgcHJlY2lzaW9uIG9mIHRoZSBwc2V1ZG8tb3AuIEZvcm1lciBBUyBkaWQgcHJlbWF0dXJlCi0gKiB0cnVuY2F0YXRpb24sIHJlc3RvcmVkIG5vaXN5IGJpdHMgaW5zdGVhZCBvZiB0cmFpbGluZyAwcyBBTkQgZ2F2ZSB5b3UKLSAqIGEgY2hvaWNlIG9mIDIgZmxhdm91cnMgb2Ygbm9pc2UgYWNjb3JkaW5nIHRvIHdoaWNoIG9mIDIgZmxvYXRpbmctcG9pbnQKLSAqIHNjYW5uZXJzIHlvdSBkaXJlY3RlZCBBUyB0byB1c2UuCi0gKgotICogSW46CWlucHV0X2xpbmVfcG9pbnRlci0+d2hpdGVzcGFjZSBiZWZvcmUsIG9yICcwJyBvZiBmbG9udW0uCi0gKgotICovCi0KLXZvaWQKLWZsb2F0X2NvbnMgKGZsb2F0X3R5cGUpCi0gICAgIC8qIENsb2JiZXJzIGlucHV0X2xpbmUtcG9pbnRlciwgY2hlY2tzIGVuZC1vZi1saW5lLiAqLwotICAgICByZWdpc3RlciBpbnQgZmxvYXRfdHlwZTsJLyogJ2YnOi5mZmxvYXQgLi4uICdGJzouZmxvYXQgLi4uICovCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIGludCBsZW5ndGg7CQkJLyogTnVtYmVyIG9mIGNoYXJzIGluIGFuIG9iamVjdC4gKi8KLSAgcmVnaXN0ZXIgY2hhciAqZXJyOwkJLyogRXJyb3IgZnJvbSBzY2FubmluZyBmbG9hdGluZyBsaXRlcmFsLiAqLwotICBjaGFyIHRlbXBbTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUXTsKLQotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgZG8KLSAgICB7Ci0gICAgICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPjFzdCBjaGFyIG9mIGEgZmxvbnVtICh3ZSBob3BlISkuICovCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgICAgIC8qIFNraXAgYW55IDB7bGV0dGVyfSB0aGF0IG1heSBiZSBwcmVzZW50LiBEb24ndCBldmVuIGNoZWNrIGlmIHRoZQotICAgICAgICogbGV0dGVyIGlzIGxlZ2FsLiBTb21lb25lIG1heSBpbnZlbnQgYSAieiIgZm9ybWF0IGFuZCB0aGlzIHJvdXRpbmUKLSAgICAgICAqIGhhcyBubyB1c2UgZm9yIHN1Y2ggaW5mb3JtYXRpb24uIEx1c2VycyBiZXdhcmU6IHlvdSBnZXQKLSAgICAgICAqIGRpYWdub3N0aWNzIGlmIHlvdXIgaW5wdXQgaXMgaWxsLWNvbmRpdGlvbmVkLgotICAgICAgICovCi0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICcwJwotCSAgJiYgaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclsxXSkpCi0JaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0KLSAgICAgIC8qIEFjY2VwdCA6eHh4eCwgd2hlcmUgdGhlIHgncyBhcmUgaGV4IGRpZ2l0cywgZm9yIGEgZmxvYXRpbmcKLSAgICAgICAgIHBvaW50IHdpdGggdGhlIGV4YWN0IGRpZ2l0cyBzcGVjaWZpZWQuICAqLwotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnOicpCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBsZW5ndGggPSBoZXhfZmxvYXQgKGZsb2F0X3R5cGUsIHRlbXApOwotCSAgaWYgKGxlbmd0aCA8IDApCi0JICAgIHsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBlcnIgPSBtZF9hdG9mIChmbG9hdF90eXBlLCB0ZW1wLCAmbGVuZ3RoKTsKLQkgIGtub3cgKGxlbmd0aCA8PSBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQpOwotCSAga25vdyAobGVuZ3RoID4gMCk7Ci0JICBpZiAoZXJyKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJCYWQgZmxvYXRpbmcgbGl0ZXJhbDogJXMiKSwgZXJyKTsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCFuZWVkX3Bhc3NfMikKLQl7Ci0JICBpbnQgY291bnQ7Ci0KLQkgIGNvdW50ID0gMTsKLQotI2lmZGVmIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCi0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnOicpCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uUyBjb3VudF9leHA7Ci0KLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBleHByZXNzaW9uICgmY291bnRfZXhwKTsKLQkgICAgICBpZiAoY291bnRfZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkgIHx8IGNvdW50X2V4cC5YX2FkZF9udW1iZXIgPD0gMCkKLQkJewotCQkgIGFzX3dhcm4gKF8oInVucmVzb2x2YWJsZSBvciBub25wb3NpdGl2ZSByZXBlYXQgY291bnQ7IHVzaW5nIDEiKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWNvdW50ID0gY291bnRfZXhwLlhfYWRkX251bWJlcjsKLQkgICAgfQotI2VuZGlmCi0KLQkgIHdoaWxlICgtLWNvdW50ID49IDApCi0JICAgIHsKLQkgICAgICBwID0gZnJhZ19tb3JlIChsZW5ndGgpOwotCSAgICAgIG1lbWNweSAocCwgdGVtcCwgKHVuc2lnbmVkIGludCkgbGVuZ3RoKTsKLQkgICAgfQotCX0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICAtLWlucHV0X2xpbmVfcG9pbnRlcjsJCS8qIFB1dCB0ZXJtaW5hdG9yIGJhY2sgaW50byBzdHJlYW0uICAqLwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBmbG9hdF9jb25zKCkgKi8KLQwKLS8qIFJldHVybiB0aGUgc2l6ZSBvZiBhIExFQjEyOCB2YWx1ZSAqLwotCi1zdGF0aWMgaW5saW5lIGludAotc2l6ZW9mX3NsZWIxMjggKHZhbHVlKQotICAgICBvZmZzZXRUIHZhbHVlOwotewotICByZWdpc3RlciBpbnQgc2l6ZSA9IDA7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGJ5dGU7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBieXRlID0gKHZhbHVlICYgMHg3Zik7Ci0gICAgICAvKiBTYWRseSwgd2UgY2Fubm90IHJlbHkgb24gdHlwaWNhbCBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IGJlaGF2aW91ci4KLQkgRm9ydHVuYXRlbHksIHdlIGNhbiBzdHJ1Y3R1cmUgdGhpbmdzIHNvIHRoYXQgdGhlIGV4dHJhIHdvcmsgcmVkdWNlcwotCSB0byBhIG5vb3Agb24gc3lzdGVtcyB0aGF0IGRvIHRoaW5ncyAicHJvcGVybHkiLiAgKi8KLSAgICAgIHZhbHVlID0gKHZhbHVlID4+IDcpIHwgfigtKG9mZnNldFQpMSA+PiA3KTsKLSAgICAgIHNpemUgKz0gMTsKLSAgICB9Ci0gIHdoaWxlICghKCgodmFsdWUgPT0gMCkgJiYgKChieXRlICYgMHg0MCkgPT0gMCkpCi0JICAgfHwgKCh2YWx1ZSA9PSAtMSkgJiYgKChieXRlICYgMHg0MCkgIT0gMCkpKSk7Ci0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1zaXplb2ZfdWxlYjEyOCAodmFsdWUpCi0gICAgIHZhbHVlVCB2YWx1ZTsKLXsKLSAgcmVnaXN0ZXIgaW50IHNpemUgPSAwOwotICByZWdpc3RlciB1bnNpZ25lZCBieXRlOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9ICh2YWx1ZSAmIDB4N2YpOwotICAgICAgdmFsdWUgPj49IDc7Ci0gICAgICBzaXplICs9IDE7Ci0gICAgfQotICB3aGlsZSAodmFsdWUgIT0gMCk7Ci0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLWludAotc2l6ZW9mX2xlYjEyOCAodmFsdWUsIHNpZ24pCi0gICAgIHZhbHVlVCB2YWx1ZTsKLSAgICAgaW50IHNpZ247Ci17Ci0gIGlmIChzaWduKQotICAgIHJldHVybiBzaXplb2Zfc2xlYjEyOCAoKG9mZnNldFQpIHZhbHVlKTsKLSAgZWxzZQotICAgIHJldHVybiBzaXplb2ZfdWxlYjEyOCAodmFsdWUpOwotfQotCi0vKiBPdXRwdXQgYSBMRUIxMjggdmFsdWUuICAqLwotCi1zdGF0aWMgaW5saW5lIGludAotb3V0cHV0X3NsZWIxMjggKHAsIHZhbHVlKQotICAgICBjaGFyICpwOwotICAgICBvZmZzZXRUIHZhbHVlOwotewotICByZWdpc3RlciBjaGFyICpvcmlnID0gcDsKLSAgcmVnaXN0ZXIgaW50IG1vcmU7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBieXRlID0gKHZhbHVlICYgMHg3Zik7Ci0KLSAgICAgIC8qIFNhZGx5LCB3ZSBjYW5ub3QgcmVseSBvbiB0eXBpY2FsIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgYmVoYXZpb3VyLgotCSBGb3J0dW5hdGVseSwgd2UgY2FuIHN0cnVjdHVyZSB0aGluZ3Mgc28gdGhhdCB0aGUgZXh0cmEgd29yayByZWR1Y2VzCi0JIHRvIGEgbm9vcCBvbiBzeXN0ZW1zIHRoYXQgZG8gdGhpbmdzICJwcm9wZXJseSIuICAqLwotICAgICAgdmFsdWUgPSAodmFsdWUgPj4gNykgfCB+KC0ob2Zmc2V0VCkxID4+IDcpOwotCi0gICAgICBtb3JlID0gISgoKCh2YWx1ZSA9PSAwKSAmJiAoKGJ5dGUgJiAweDQwKSA9PSAwKSkKLQkJfHwgKCh2YWx1ZSA9PSAtMSkgJiYgKChieXRlICYgMHg0MCkgIT0gMCkpKSk7Ci0gICAgICBpZiAobW9yZSkKLQlieXRlIHw9IDB4ODA7Ci0KLSAgICAgICpwKysgPSBieXRlOwotICAgIH0KLSAgd2hpbGUgKG1vcmUpOwotCi0gIHJldHVybiBwIC0gb3JpZzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLW91dHB1dF91bGViMTI4IChwLCB2YWx1ZSkKLSAgICAgY2hhciAqcDsKLSAgICAgdmFsdWVUIHZhbHVlOwotewotICBjaGFyICpvcmlnID0gcDsKLQotICBkbwotICAgIHsKLSAgICAgIHVuc2lnbmVkIGJ5dGUgPSAodmFsdWUgJiAweDdmKTsKLSAgICAgIHZhbHVlID4+PSA3OwotICAgICAgaWYgKHZhbHVlICE9IDApCi0JLyogTW9yZSBieXRlcyB0byBmb2xsb3cuICAqLwotCWJ5dGUgfD0gMHg4MDsKLQotICAgICAgKnArKyA9IGJ5dGU7Ci0gICAgfQotICB3aGlsZSAodmFsdWUgIT0gMCk7Ci0KLSAgcmV0dXJuIHAgLSBvcmlnOwotfQotCi1pbnQKLW91dHB1dF9sZWIxMjggKHAsIHZhbHVlLCBzaWduKQotICAgICBjaGFyICpwOwotICAgICB2YWx1ZVQgdmFsdWU7Ci0gICAgIGludCBzaWduOwotewotICBpZiAoc2lnbikKLSAgICByZXR1cm4gb3V0cHV0X3NsZWIxMjggKHAsIChvZmZzZXRUKSB2YWx1ZSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gb3V0cHV0X3VsZWIxMjggKHAsIHZhbHVlKTsKLX0KLQotLyogRG8gdGhlIHNhbWUgZm9yIGJpZ251bXMuICBXZSBjb21iaW5lIHNpemVvZiB3aXRoIG91dHB1dCBoZXJlIGluIHRoYXQKLSAgIHdlIGRvbid0IG91dHB1dCBmb3IgTlVMTCB2YWx1ZXMgb2YgUC4gIEl0IGlzbid0IHJlYWxseSBhcyBjcml0aWNhbCBhcwotICAgZm9yICJub3JtYWwiIHZhbHVlcyB0aGF0IHRoaXMgYmUgc3RyZWFtbGluZWQuICAqLwotCi1zdGF0aWMgaW5saW5lIGludAotb3V0cHV0X2JpZ19zbGViMTI4IChwLCBiaWdudW0sIHNpemUpCi0gICAgIGNoYXIgKnA7Ci0gICAgIExJVFRMRU5VTV9UWVBFICpiaWdudW07Ci0gICAgIGludCBzaXplOwotewotICBjaGFyICpvcmlnID0gcDsKLSAgdmFsdWVUIHZhbCA9IDA7Ci0gIGludCBsb2FkZWQgPSAwOwotICB1bnNpZ25lZCBieXRlOwotCi0gIC8qIFN0cmlwIGxlYWRpbmcgc2lnbiBleHRlbnNpb25zIG9mZiB0aGUgYmlnbnVtLiAgKi8KLSAgd2hpbGUgKHNpemUgPiAwICYmIGJpZ251bVtzaXplLTFdID09IChMSVRUTEVOVU1fVFlQRSktMSkKLSAgICBzaXplLS07Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBpZiAobG9hZGVkIDwgNyAmJiBzaXplID4gMCkKLQl7Ci0JICB2YWwgfD0gKCpiaWdudW0gPDwgbG9hZGVkKTsKLQkgIGxvYWRlZCArPSA4ICogQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgIHNpemUtLTsKLQkgIGJpZ251bSsrOwotCX0KLQotICAgICAgYnl0ZSA9IHZhbCAmIDB4N2Y7Ci0gICAgICBsb2FkZWQgLT0gNzsKLSAgICAgIHZhbCA+Pj0gNzsKLQotICAgICAgaWYgKHNpemUgPT0gMCkKLQl7Ci0JICBpZiAoKHZhbCA9PSAwICYmIChieXRlICYgMHg0MCkgPT0gMCkKLQkgICAgICB8fCAofih2YWwgfCB+KCgodmFsdWVUKTEgPDwgbG9hZGVkKSAtIDEpKSA9PSAwCi0JCSAgJiYgKGJ5dGUgJiAweDQwKSAhPSAwKSkKLQkgICAgYnl0ZSB8PSAweDgwOwotCX0KLQotICAgICAgaWYgKG9yaWcpCi0JKnAgPSBieXRlOwotICAgICAgcCsrOwotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLQotICByZXR1cm4gcCAtIG9yaWc7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1vdXRwdXRfYmlnX3VsZWIxMjggKHAsIGJpZ251bSwgc2l6ZSkKLSAgICAgY2hhciAqcDsKLSAgICAgTElUVExFTlVNX1RZUEUgKmJpZ251bTsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGNoYXIgKm9yaWcgPSBwOwotICB2YWx1ZVQgdmFsID0gMDsKLSAgaW50IGxvYWRlZCA9IDA7Ci0gIHVuc2lnbmVkIGJ5dGU7Ci0KLSAgLyogU3RyaXAgbGVhZGluZyB6ZXJvcyBvZmYgdGhlIGJpZ251bS4gICovCi0gIC8qIFhYWDogSXMgdGhpcyBuZWVkZWQ/ICAqLwotICB3aGlsZSAoc2l6ZSA+IDAgJiYgYmlnbnVtW3NpemUtMV0gPT0gMCkKLSAgICBzaXplLS07Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBpZiAobG9hZGVkIDwgNyAmJiBzaXplID4gMCkKLQl7Ci0JICB2YWwgfD0gKCpiaWdudW0gPDwgbG9hZGVkKTsKLQkgIGxvYWRlZCArPSA4ICogQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgIHNpemUtLTsKLQkgIGJpZ251bSsrOwotCX0KLQotICAgICAgYnl0ZSA9IHZhbCAmIDB4N2Y7Ci0gICAgICBsb2FkZWQgLT0gNzsKLSAgICAgIHZhbCA+Pj0gNzsKLQotICAgICAgaWYgKHNpemUgPiAwIHx8IHZhbCkKLQlieXRlIHw9IDB4ODA7Ci0KLSAgICAgIGlmIChvcmlnKQotCSpwID0gYnl0ZTsKLSAgICAgIHArKzsKLSAgICB9Ci0gIHdoaWxlIChieXRlICYgMHg4MCk7Ci0KLSAgcmV0dXJuIHAgLSBvcmlnOwotfQotCi1zdGF0aWMgaW50Ci1vdXRwdXRfYmlnX2xlYjEyOCAocCwgYmlnbnVtLCBzaXplLCBzaWduKQotICAgICBjaGFyICpwOwotICAgICBMSVRUTEVOVU1fVFlQRSAqYmlnbnVtOwotICAgICBpbnQgc2l6ZSwgc2lnbjsKLXsKLSAgaWYgKHNpZ24pCi0gICAgcmV0dXJuIG91dHB1dF9iaWdfc2xlYjEyOCAocCwgYmlnbnVtLCBzaXplKTsKLSAgZWxzZQotICAgIHJldHVybiBvdXRwdXRfYmlnX3VsZWIxMjggKHAsIGJpZ251bSwgc2l6ZSk7Ci19Ci0KLS8qIEdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBmcmFnbWVudHMgZm9yIGEgZ2l2ZW4gZXhwcmVzc2lvbiB0byBlbWl0IGEKLSAgIGxlYjEyOCB2YWx1ZS4gICovCi0KLXZvaWQKLWVtaXRfbGViMTI4X2V4cHIoZXhwLCBzaWduKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICBpbnQgc2lnbjsKLXsKLSAgb3BlcmF0b3JUIG9wID0gZXhwLT5YX29wOwotCi0gIGlmIChvcCA9PSBPX2Fic2VudCB8fCBvcCA9PSBPX2lsbGVnYWwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiemVybyBhc3N1bWVkIGZvciBtaXNzaW5nIGV4cHJlc3Npb24iKSk7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBvcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotICBlbHNlIGlmIChvcCA9PSBPX2JpZyAmJiBleHAtPlhfYWRkX251bWJlciA8PSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG9wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fcmVnaXN0ZXIpCi0gICAgewotICAgICAgYXNfd2FybiAoXygicmVnaXN0ZXIgdmFsdWUgdXNlZCBhcyBleHByZXNzaW9uIikpOwotICAgICAgb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLQotICBpZiAob3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSd2ZSBnb3QgYSBjb25zdGFudCwgZW1pdCB0aGUgdGhpbmcgZGlyZWN0bHkgcmlnaHQgbm93LiAgKi8KLQotICAgICAgdmFsdWVUIHZhbHVlID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICBpbnQgc2l6ZTsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHNpemUgPSBzaXplb2ZfbGViMTI4ICh2YWx1ZSwgc2lnbik7Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplKTsKLSAgICAgIG91dHB1dF9sZWIxMjggKHAsIHZhbHVlLCBzaWduKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fYmlnKQotICAgIHsKLSAgICAgIC8qIE9fYmlnIGlzIGEgZGlmZmVyZW50IHNvcnQgb2YgY29uc3RhbnQuICAqLwotCi0gICAgICBpbnQgc2l6ZTsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHNpemUgPSBvdXRwdXRfYmlnX2xlYjEyOCAoTlVMTCwgZ2VuZXJpY19iaWdudW0sIGV4cC0+WF9hZGRfbnVtYmVyLCBzaWduKTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKHNpemUpOwotICAgICAgb3V0cHV0X2JpZ19sZWIxMjggKHAsIGdlbmVyaWNfYmlnbnVtLCBleHAtPlhfYWRkX251bWJlciwgc2lnbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGNyZWF0ZSBhIHZhcmlhYmxlIHNpemVkIGZyYWdtZW50IGFuZCAKLQkgcmVzb2x2ZSB0aGluZ3MgbGF0ZXIuICAqLwotCi0gICAgICBmcmFnX3ZhciAocnNfbGViMTI4LCBzaXplb2ZfdWxlYjEyOCAofih2YWx1ZVQpMCksIDAsIHNpZ24sCi0JCW1ha2VfZXhwcl9zeW1ib2wgKGV4cCksIDAsIChjaGFyICopIE5VTEwpOwotICAgIH0KLX0KLQotLyogUGFyc2UgdGhlIC5zbGViMTI4IGFuZCAudWxlYjEyOCBwc2V1ZG9zLiAgKi8KLQotdm9pZAotc19sZWIxMjggKHNpZ24pCi0gICAgIGludCBzaWduOwotewotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgZG8gewotICAgIGV4cHJlc3Npb24gKCZleHApOwotICAgIGVtaXRfbGViMTI4X2V4cHIgKCZleHAsIHNpZ24pOwotICB9IHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qCi0gKgkJCXN0cmluZ2VyKCkKLSAqCi0gKiBXZSByZWFkIDAgb3IgbW9yZSAnLCcgc2VwYXJhdGVkLCBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi0gKgotICogQ2FsbGVyIHNob3VsZCBoYXZlIGNoZWNrZWQgbmVlZF9wYXNzXzIgaXMgRkFMU0UgYmVjYXVzZSB3ZSBkb24ndCBjaGVjayBpdC4KLSAqLwotCi0KLXZvaWQgCi1zdHJpbmdlciAoYXBwZW5kX3plcm8pCQkvKiBXb3JrZXIgdG8gZG8gLmFzY2lpIGV0YyBzdGF0ZW1lbnRzLiAqLwotICAgICAvKiBDaGVja3MgZW5kLW9mLWxpbmUuICovCi0gICAgIHJlZ2lzdGVyIGludCBhcHBlbmRfemVybzsJLyogMDogZG9uJ3QgYXBwZW5kICdcMCcsIGVsc2UgMSAqLwotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYzsKLSAgY2hhciAqc3RhcnQ7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIC8qCi0gICAqIFRoZSBmb2xsb3dpbmcgYXdrd2FyZCBsb2dpYyBpcyB0byBwYXJzZSBaRVJPIG9yIG1vcmUgc3RyaW5ncywKLSAgICogY29tbWEgc2VwYXJhdGVkLiBSZWNhbGwgYSBzdHJpbmcgZXhwcmVzc2lvbiBpbmNsdWRlcyBzcGFjZXMKLSAgICogYmVmb3JlIHRoZSBvcGVuaW5nICdcIicgYW5kIHNwYWNlcyBhZnRlciB0aGUgY2xvc2luZyAnXCInLgotICAgKiBXZSBmYWtlIGEgbGVhZGluZyAnLCcgaWYgdGhlcmUgaXMgKHN1cHBvc2VkIHRvIGJlKQotICAgKiBhIDFzdCwgZXhwcmVzc2lvbi4gV2Uga2VlcCBkZW1hbmRpbmcgZXhwcmVzc2lvbnMgZm9yIGVhY2gKLSAgICogJywnLgotICAgKi8KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgYyA9IDA7CQkJLyogU2tpcCBsb29wLiAqLwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CS8qIENvbXBlbnNhdGUgZm9yIGVuZCBvZiBsb29wLiAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGMgPSAnLCc7CQkJLyogRG8gbG9vcC4gKi8KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyB8fCBjID09ICc8JyB8fCBjID09ICciJykKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCWNhc2UgJ1wiJzoKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwkvKi0+MXN0IGNoYXIgb2Ygc3RyaW5nLiAqLwotCSAgc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoaXNfYV9jaGFyIChjID0gbmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JICAgIHsKLQkgICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKGMpOwotCSAgICB9Ci0JICBpZiAoYXBwZW5kX3plcm8pCi0JICAgIHsKLQkgICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKDApOwotCSAgICB9Ci0JICBrbm93IChpbnB1dF9saW5lX3BvaW50ZXJbLTFdID09ICdcIicpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSNpZmRlZiBPQkpfRUxGCi0JICAvKiBJbiBFTEYsIHdoZW4gZ2NjIGlzIGVtaXR0aW5nIERXQVJGIDEgZGVidWdnaW5nIG91dHB1dCwgaXQKLSAgICAgICAgICAgICB3aWxsIGVtaXQgLnN0cmluZyB3aXRoIGEgZmlsZW5hbWUgaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uCi0gICAgICAgICAgICAgYWZ0ZXIgYSBzZXF1ZW5jZSBvZiBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnQgaW4KLSAgICAgICAgICAgICBlbWl0X2V4cHIgZm9yIHRoZSBzZXF1ZW5jZS4gIGVtaXRfZXhwciB3aWxsIHNldAotICAgICAgICAgICAgIGR3YXJmX2ZpbGVfc3RyaW5nIHRvIG5vbi16ZXJvIGlmIHRoaXMgc3RyaW5nIG1pZ2h0IGJlIGEKLSAgICAgICAgICAgICBzb3VyY2UgZmlsZSBuYW1lLiAgKi8KLQkgIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAobm93X3NlZyksICIuZGVidWciKSAhPSAwKQotCSAgICBkd2FyZl9maWxlX3N0cmluZyA9IDA7Ci0JICBlbHNlIGlmIChkd2FyZl9maWxlX3N0cmluZykKLQkgICAgewotCSAgICAgIGMgPSBpbnB1dF9saW5lX3BvaW50ZXJbLTFdOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlclstMV0gPSAnXDAnOwotCSAgICAgIGxpc3Rpbmdfc291cmNlX2ZpbGUgKHN0YXJ0KTsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXJbLTFdID0gYzsKLQkgICAgfQotI2VuZGlmCi0jZW5kaWYKLQotCSAgYnJlYWs7Ci0JY2FzZSAnPCc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGMgPSBnZXRfc2luZ2xlX251bWJlciAoKTsKLQkgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoYyk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnPicpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIDxubj4iKSk7Ci0JICAgIH0KLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgYnJlYWs7Ci0JY2FzZSAnLCc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzdHJpbmdlcigpICovCi0MCi0vKiBGSVhNRS1TT01FREFZOiBJIGhhZCB0cm91YmxlIGhlcmUgb24gY2hhcmFjdGVycyB3aXRoIHRoZQotICAgIGhpZ2ggYml0cyBzZXQuICBXZSdsbCBwcm9iYWJseSBhbHNvIGhhdmUgdHJvdWJsZSB3aXRoCi0gICAgbXVsdGlieXRlIGNoYXJzLCB3aWRlIGNoYXJzLCBldGMuICBBbHNvIGJlIGNhcmVmdWwgYWJvdXQKLSAgICByZXR1cm5pbmcgdmFsdWVzIGJpZ2dlciB0aGFuIDEgYnl0ZS4gIHhveG9yaWNoLiAqLwotCi11bnNpZ25lZCBpbnQgCi1uZXh0X2NoYXJfb2Zfc3RyaW5nICgpCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBjOwotCi0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKysgJiBDSEFSX01BU0s7Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnXCInOgotICAgICAgYyA9IE5PVF9BX0NIQVI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1xuJzoKLSAgICAgIGFzX3dhcm4gKF8oIlVudGVybWluYXRlZCBzdHJpbmc6IE5ld2xpbmUgaW5zZXJ0ZWQuIikpOwotICAgICAgYnVtcF9saW5lX2NvdW50ZXJzICgpOwotICAgICAgYnJlYWs7Ci0KLSNpZm5kZWYgTk9fU1RSSU5HX0VTQ0FQRVMKLSAgICBjYXNlICdcXCc6Ci0gICAgICBzd2l0Y2ggKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspCi0JewotCWNhc2UgJ2InOgotCSAgYyA9ICdcYic7Ci0JICBicmVhazsKLQotCWNhc2UgJ2YnOgotCSAgYyA9ICdcZic7Ci0JICBicmVhazsKLQotCWNhc2UgJ24nOgotCSAgYyA9ICdcbic7Ci0JICBicmVhazsKLQotCWNhc2UgJ3InOgotCSAgYyA9ICdccic7Ci0JICBicmVhazsKLQotCWNhc2UgJ3QnOgotCSAgYyA9ICdcdCc7Ci0JICBicmVhazsKLQotCWNhc2UgJ3YnOgotCSAgYyA9ICdcMDEzJzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnXFwnOgotCWNhc2UgJyInOgotCSAgYnJlYWs7CQkvKiBBcyBpdHNlbGYuICovCi0KLQljYXNlICcwJzoKLQljYXNlICcxJzoKLQljYXNlICcyJzoKLQljYXNlICczJzoKLQljYXNlICc0JzoKLQljYXNlICc1JzoKLQljYXNlICc2JzoKLQljYXNlICc3JzoKLQljYXNlICc4JzoKLQljYXNlICc5JzoKLQkgIHsKLQkgICAgbG9uZyBudW1iZXI7Ci0JICAgIGludCBpOwotCi0JICAgIGZvciAoaSA9IDAsIG51bWJlciA9IDA7IGlzZGlnaXQgKGMpICYmIGkgPCAzOyBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrLCBpKyspCi0JICAgICAgewotCQludW1iZXIgPSBudW1iZXIgKiA4ICsgYyAtICcwJzsKLQkgICAgICB9Ci0JICAgIGMgPSBudW1iZXIgJiAweGZmOwotCSAgfQotCSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBicmVhazsKLQotCWNhc2UgJ3gnOgotCWNhc2UgJ1gnOgotCSAgewotCSAgICBsb25nIG51bWJlcjsKLQotCSAgICBudW1iZXIgPSAwOwotCSAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICB3aGlsZSAoaXN4ZGlnaXQgKGMpKQotCSAgICAgIHsKLQkJaWYgKGlzZGlnaXQgKGMpKQotCQkgIG51bWJlciA9IG51bWJlciAqIDE2ICsgYyAtICcwJzsKLQkJZWxzZSBpZiAoaXN1cHBlciAoYykpCi0JCSAgbnVtYmVyID0gbnVtYmVyICogMTYgKyBjIC0gJ0EnICsgMTA7Ci0JCWVsc2UKLQkJICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGMgLSAnYScgKyAxMDsKLQkJYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgICB9Ci0JICAgIGMgPSBudW1iZXIgJiAweGZmOwotCSAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnXG4nOgotCSAgLyogVG8gYmUgY29tcGF0aWJsZSB3aXRoIEJTRCA0LjIgYXM6IGdpdmUgdGhlIGx1c2VyIGEgbGluZWZlZWQhISAqLwotCSAgYXNfd2FybiAoXygiVW50ZXJtaW5hdGVkIHN0cmluZzogTmV3bGluZSBpbnNlcnRlZC4iKSk7Ci0JICBjID0gJ1xuJzsKLQkgIGJ1bXBfbGluZV9jb3VudGVycyAoKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQotI2lmZGVmIE9OTFlfU1RBTkRBUkRfRVNDQVBFUwotCSAgYXNfYmFkIChfKCJCYWQgZXNjYXBlZCBjaGFyYWN0ZXIgaW4gc3RyaW5nLCAnPycgYXNzdW1lZCIpKTsKLQkgIGMgPSAnPyc7Ci0jZW5kaWYgLyogT05MWV9TVEFOREFSRF9FU0NBUEVTICovCi0KLQkgIGJyZWFrOwotCX0JCQkvKiBzd2l0Y2ggb24gZXNjYXBlZCBjaGFyICovCi0gICAgICBicmVhazsKLSNlbmRpZiAvKiAhIGRlZmluZWQgKE5PX1NUUklOR19FU0NBUEVTKSAqLwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0JCQkJLyogc3dpdGNoIG9uIGNoYXIgKi8KLSAgcmV0dXJuIChjKTsKLX0JCQkJLyogbmV4dF9jaGFyX29mX3N0cmluZygpICovCi0MCi1zdGF0aWMgc2VnVAotZ2V0X3NlZ21lbnRlZF9leHByZXNzaW9uIChleHBQKQotICAgICByZWdpc3RlciBleHByZXNzaW9uUyAqZXhwUDsKLXsKLSAgcmVnaXN0ZXIgc2VnVCByZXR2YWw7Ci0KLSAgcmV0dmFsID0gZXhwcmVzc2lvbiAoZXhwUCk7Ci0gIGlmIChleHBQLT5YX29wID09IE9faWxsZWdhbAotICAgICAgfHwgZXhwUC0+WF9vcCA9PSBPX2Fic2VudAotICAgICAgfHwgZXhwUC0+WF9vcCA9PSBPX2JpZykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGVkIGFkZHJlc3MgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOwotICAgICAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHBQLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgcmV0dmFsID0gYWJzb2x1dGVfc2VjdGlvbjsKLSAgICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBzZWdUIAotZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uIChleHBQKQotICAgICByZWdpc3RlciBleHByZXNzaW9uUyAqZXhwUDsKLXsKLSAgcmVnaXN0ZXIgc2VnVCByZXR2YWw7Ci0KLSAgaWYgKChyZXR2YWwgPSBnZXRfc2VnbWVudGVkX2V4cHJlc3Npb24gKGV4cFApKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBpcyBubyBlYXN5IHdheSB0byBleHRyYWN0IHRoZSB1bmRlZmluZWQgc3ltYm9sIGZyb20gdGhlCi0JIGV4cHJlc3Npb24uICAqLwotICAgICAgaWYgKGV4cFAtPlhfYWRkX3N5bWJvbCAhPSBOVUxMCi0JICAmJiBTX0dFVF9TRUdNRU5UIChleHBQLT5YX2FkZF9zeW1ib2wpICE9IGV4cHJfc2VjdGlvbikKLQlhc193YXJuIChfKCJzeW1ib2wgXCIlc1wiIHVuZGVmaW5lZDsgemVybyBhc3N1bWVkIiksCi0JCSBTX0dFVF9OQU1FIChleHBQLT5YX2FkZF9zeW1ib2wpKTsKLSAgICAgIGVsc2UKLQlhc193YXJuIChfKCJzb21lIHN5bWJvbCB1bmRlZmluZWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIHJldHZhbCA9IGFic29sdXRlX3NlY3Rpb247Ci0gICAgICBleHBQLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cFAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgfQotICBrbm93IChyZXR2YWwgPT0gYWJzb2x1dGVfc2VjdGlvbiB8fCBTRUdfTk9STUFMIChyZXR2YWwpKTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQkJCQkvKiBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24oKSAqLwotCi1vZmZzZXRUCi1nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKQotewotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGlmIChleHAuWF9vcCAhPSBPX2Fic2VudCkKLQlhc19iYWQgKF8oImJhZCBvciBpcnJlZHVjaWJsZSBhYnNvbHV0ZSBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0gIHJldHVybiBleHAuWF9hZGRfbnVtYmVyOwotfQotCi1jaGFyCQkJCS8qIHJldHVybiB0ZXJtaW5hdG9yICovCi1nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAodmFsX3BvaW50ZXIpCi0gICAgIGxvbmcgKnZhbF9wb2ludGVyOwkJLyogcmV0dXJuIHZhbHVlIG9mIGV4cHJlc3Npb24gKi8KLXsKLSAgLyogRklYTUU6IHZhbF9wb2ludGVyIHNob3VsZCBwcm9iYWJseSBiZSBvZmZzZXRUICouICAqLwotICAqdmFsX3BvaW50ZXIgPSAobG9uZykgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHJldHVybiAoKmlucHV0X2xpbmVfcG9pbnRlcisrKTsKLX0KLQwKLS8qCi0gKgkJCWRlbWFuZF9jb3B5X0Nfc3RyaW5nKCkKLSAqCi0gKiBMaWtlIGRlbWFuZF9jb3B5X3N0cmluZywgYnV0IHJldHVybiBOVUxMIGlmIHRoZSBzdHJpbmcgY29udGFpbnMgYW55ICdcMCdzLgotICogR2l2ZSBhIHdhcm5pbmcgaWYgdGhhdCBoYXBwZW5zLgotICovCi1jaGFyICoKLWRlbWFuZF9jb3B5X0Nfc3RyaW5nIChsZW5fcG9pbnRlcikKLSAgICAgaW50ICpsZW5fcG9pbnRlcjsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqczsKLQotICBpZiAoKHMgPSBkZW1hbmRfY29weV9zdHJpbmcgKGxlbl9wb2ludGVyKSkgIT0gMCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgbGVuOwotCi0gICAgICBmb3IgKGxlbiA9ICpsZW5fcG9pbnRlcjsgbGVuID4gMDsgbGVuLS0pCi0JewotCSAgaWYgKCpzID09IDApCi0JICAgIHsKLQkgICAgICBzID0gMDsKLQkgICAgICBsZW4gPSAxOwotCSAgICAgICpsZW5fcG9pbnRlciA9IDA7Ci0JICAgICAgYXNfYmFkIChfKCJUaGlzIHN0cmluZyBtYXkgbm90IGNvbnRhaW4gXCdcXDBcJyIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiBzOwotfQotDAotLyoKLSAqCQkJZGVtYW5kX2NvcHlfc3RyaW5nKCkKLSAqCi0gKiBEZW1hbmQgc3RyaW5nLCBidXQgcmV0dXJuIGEgc2FmZSAoPXByaXZhdGUpIGNvcHkgb2YgdGhlIHN0cmluZy4KLSAqIFJldHVybiBOVUxMIGlmIHdlIGNhbid0IHJlYWQgYSBzdHJpbmcgaGVyZS4KLSAqLwotY2hhciAqCi1kZW1hbmRfY29weV9zdHJpbmcgKGxlblApCi0gICAgIGludCAqbGVuUDsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0gIHJlZ2lzdGVyIGludCBsZW47Ci0gIGNoYXIgKnJldHZhbDsKLQotICBsZW4gPSAwOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CS8qIFNraXAgb3BlbmluZyBxdW90ZS4gKi8KLQotICAgICAgd2hpbGUgKGlzX2FfY2hhciAoYyA9IG5leHRfY2hhcl9vZl9zdHJpbmcgKCkpKQotCXsKLQkgIG9ic3RhY2tfMWdyb3cgKCZub3RlcywgYyk7Ci0JICBsZW4rKzsKLQl9Ci0gICAgICAvKiBKRiB0aGlzIG5leHQgbGluZSBpcyBzbyBkZW1hbmRfY29weV9DX3N0cmluZyB3aWxsIHJldHVybiBhCi0JIG51bGwgdGVybWluYXRlZCBzdHJpbmcuICovCi0gICAgICBvYnN0YWNrXzFncm93ICgmbm90ZXMsICdcMCcpOwotICAgICAgcmV0dmFsID0gb2JzdGFja19maW5pc2ggKCZub3Rlcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfd2FybiAoXygiTWlzc2luZyBzdHJpbmciKSk7Ci0gICAgICByZXR2YWwgPSBOVUxMOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gICpsZW5QID0gbGVuOwotICByZXR1cm4gKHJldHZhbCk7Ci19CQkJCS8qIGRlbWFuZF9jb3B5X3N0cmluZygpICovCi0MCi0vKgotICoJCWlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQoKQotICoKLSAqIEluOglJbnB1dF9saW5lX3BvaW50ZXItPm5leHQgY2hhcmFjdGVyLgotICoKLSAqIERvOglTa2lwIGlucHV0X2xpbmVfcG9pbnRlciBvdmVyIGFsbCB3aGl0ZXNwYWNlLgotICoKLSAqIE91dDoJMSBpZiBpbnB1dF9saW5lX3BvaW50ZXItPmVuZC1vZi1saW5lLgotKi8KLWludCAKLWlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkKLXsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICByZXR1cm4gKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSk7Ci19CQkJCS8qIGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQoKSAqLwotCi12b2lkIAotZXF1YWxzIChzeW1fbmFtZSwgcmVhc3NpZ24pCi0gICAgIGNoYXIgKnN5bV9uYW1lOwotICAgICBpbnQgcmVhc3NpZ247Ci17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7CS8qIHN5bWJvbCB3ZSBhcmUgd29ya2luZyB3aXRoICovCi0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPScpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIGlmIChzeW1fbmFtZVswXSA9PSAnLicgJiYgc3ltX25hbWVbMV0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBUdXJuICcuID0gbXVtYmxlJyBpbnRvIGEgLm9yZyBtdW1ibGUgKi8KLSAgICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudDsKLSAgICAgIGV4cHJlc3Npb25TIGV4cDsKLQotICAgICAgc2VnbWVudCA9IGdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICAgICBpZiAoIW5lZWRfcGFzc18yKQotCWRvX29yZyAoc2VnbWVudCwgJmV4cCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKHN5bV9uYW1lKTsKLSAgICAgIC8qIFBlcm1pdCByZWdpc3RlciBuYW1lcyB0byBiZSByZWRlZmluZWQuICAqLwotICAgICAgaWYgKCEgcmVhc3NpZ24KLQkgICYmIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkKLQkgICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbFApICE9IHJlZ19zZWN0aW9uKQotCWFzX2JhZCAoXygic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIiksIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIHBzZXVkb19zZXQgKHN5bWJvbFApOwotICAgIH0KLQotICBpZiAoZmxhZ19tcmkpCi0gICAgIHsKLSAgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOyAvKiBjaGVjayBnYXJiYWdlIGFmdGVyIHRoZSBleHByZXNzaW9uICovCi0gICAgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgIH0KLX0JCQkJLyogZXF1YWxzKCkgKi8KLQotLyogLmluY2x1ZGUgLS0gaW5jbHVkZSBhIGZpbGUgYXQgdGhpcyBwb2ludC4gKi8KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQgCi1zX2luY2x1ZGUgKGFyZykKLSAgICAgaW50IGFyZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBjaGFyICpuZXdidWY7Ci0gIGNoYXIgKmZpbGVuYW1lOwotICBpbnQgaTsKLSAgRklMRSAqdHJ5OwotICBjaGFyICpwYXRoOwotCi0gIGlmICghIGZsYWdfbTY4a19tcmkpCi0gICAgewotICAgICAgZmlsZW5hbWUgPSBkZW1hbmRfY29weV9zdHJpbmcgKCZpKTsKLSAgICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIGRlbWFuZF9jb3B5X3N0cmluZyBoYXMgYWxyZWFkeSBwcmludGVkIGFuIGVycm9yIGFuZAotICAgICAgICAgICAgIGNhbGxlZCBpZ25vcmVfcmVzdF9vZl9saW5lLiAgKi8KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaSA9IDA7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0KLQkgICAgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyAnCi0JICAgICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcdCcpCi0JewotCSAgb2JzdGFja18xZ3JvdyAoJm5vdGVzLCAqaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgKytpOwotCX0KLSAgICAgIG9ic3RhY2tfMWdyb3cgKCZub3RlcywgJ1wwJyk7Ci0gICAgICBmaWxlbmFtZSA9IG9ic3RhY2tfZmluaXNoICgmbm90ZXMpOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcGF0aCA9IHhtYWxsb2MgKCh1bnNpZ25lZCBsb25nKSBpICsgaW5jbHVkZV9kaXJfbWF4bGVuICsgNSAvKiBzbG9wICovICk7Ci0gIGZvciAoaSA9IDA7IGkgPCBpbmNsdWRlX2Rpcl9jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHN0cmNweSAocGF0aCwgaW5jbHVkZV9kaXJzW2ldKTsKLSAgICAgIHN0cmNhdCAocGF0aCwgIi8iKTsKLSAgICAgIHN0cmNhdCAocGF0aCwgZmlsZW5hbWUpOwotICAgICAgaWYgKDAgIT0gKHRyeSA9IGZvcGVuIChwYXRoLCAiciIpKSkKLQl7Ci0JICBmY2xvc2UgKHRyeSk7Ci0JICBnb3RvIGdvdGl0OwotCX0KLSAgICB9Ci0gIGZyZWUgKHBhdGgpOwotICBwYXRoID0gZmlsZW5hbWU7Ci1nb3RpdDoKLSAgLyogbWFsbG9jIFN0b3JhZ2UgbGVhayB3aGVuIGZpbGUgaXMgZm91bmQgb24gcGF0aC4gIEZJWE1FLVNPTUVEQVkuICovCi0gIHJlZ2lzdGVyX2RlcGVuZGVuY3kgKHBhdGgpOwotICBuZXdidWYgPSBpbnB1dF9zY3J1Yl9pbmNsdWRlX2ZpbGUgKHBhdGgsIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0gIGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLX0JCQkJLyogc19pbmNsdWRlKCkgKi8KLQotdm9pZCAKLWFkZF9pbmNsdWRlX2RpciAocGF0aCkKLSAgICAgY2hhciAqcGF0aDsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKGluY2x1ZGVfZGlyX2NvdW50ID09IDApCi0gICAgewotICAgICAgaW5jbHVkZV9kaXJzID0gKGNoYXIgKiopIHhtYWxsb2MgKDIgKiBzaXplb2YgKCppbmNsdWRlX2RpcnMpKTsKLSAgICAgIGluY2x1ZGVfZGlyc1swXSA9ICIuIjsJLyogQ3VycmVudCBkaXIgKi8KLSAgICAgIGluY2x1ZGVfZGlyX2NvdW50ID0gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbmNsdWRlX2Rpcl9jb3VudCsrOwotICAgICAgaW5jbHVkZV9kaXJzID0gKGNoYXIgKiopIHJlYWxsb2MgKGluY2x1ZGVfZGlycywKLQkJCQlpbmNsdWRlX2Rpcl9jb3VudCAqIHNpemVvZiAoKmluY2x1ZGVfZGlycykpOwotICAgIH0KLQotICBpbmNsdWRlX2RpcnNbaW5jbHVkZV9kaXJfY291bnQgLSAxXSA9IHBhdGg7CS8qIE5ldyBvbmUgKi8KLQotICBpID0gc3RybGVuIChwYXRoKTsKLSAgaWYgKGkgPiBpbmNsdWRlX2Rpcl9tYXhsZW4pCi0gICAgaW5jbHVkZV9kaXJfbWF4bGVuID0gaTsKLX0JCQkJLyogYWRkX2luY2x1ZGVfZGlyKCkgKi8KLQwKLS8qIE91dHB1dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gZGVub3RlIHRoZSBzb3VyY2UgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nZW5lcmF0ZV9maWxlX2RlYnVnICgpCi17Ci0gIGlmIChkZWJ1Z190eXBlID09IERFQlVHX1NUQUJTKQotICAgIHN0YWJzX2dlbmVyYXRlX2FzbV9maWxlICgpOwotfQotCi0vKiBPdXRwdXQgbGluZSBudW1iZXIgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBzb3VyY2UgbGluZS4gICovCi0KLXZvaWQKLWdlbmVyYXRlX2xpbmVub19kZWJ1ZyAoKQotewotI2lmZGVmIEVDT0ZGX0RFQlVHR0lORwotICAvKiBFQ09GRiBhc3NlbWJsZXJzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAKLSAgICAgRklYTUU6IFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGhhbmRsZWQgZWxzZXdoZXJlLiAgKi8KLSAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfVU5TUEVDSUZJRUQpCi0gICAgewotICAgICAgaWYgKEVDT0ZGX0RFQlVHR0lORyAmJiBlY29mZl9ub19jdXJyZW50X2ZpbGUgKCkpCi0gICAgICAgIGRlYnVnX3R5cGUgPSBERUJVR19FQ09GRjsKLSAgICAgIGVsc2UKLQlkZWJ1Z190eXBlID0gREVCVUdfTk9ORTsKLSAgICB9Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGRlYnVnX3R5cGUpCi0gICAgewotICAgIGNhc2UgREVCVUdfVU5TUEVDSUZJRUQ6Ci0gICAgY2FzZSBERUJVR19OT05FOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19TVEFCUzoKLSAgICAgIHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8gKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0VDT0ZGOgotICAgICAgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfRFdBUkY6Ci0gICAgY2FzZSBERUJVR19EV0FSRjI6Ci0gICAgICAvKiBGSVhNRS4gICovCi0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIE91dHB1dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gbWFyayBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50IG9yIGVuZCBwb2ludC4KLSAgIEVORF9QIGlzIHplcm8gZm9yIC5mdW5jLCBhbmQgbm9uLXplcm8gZm9yIC5lbmRmdW5jLiAgKi8KLQotdm9pZAotc19mdW5jIChlbmRfcCkKLSAgICAgaW50IGVuZF9wOwotewotICBkb19zX2Z1bmMgKGVuZF9wLCBOVUxMKTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBzX2Z1bmMgc28gdGFyZ2V0cyBjYW4gY2hvb3NlIGEgZGlmZmVyZW50IGRlZmF1bHQgcHJlZml4LgotICAgSWYgREVGQVVMVF9QUkVGSVggaXMgTlVMTCwgdXNlIHRoZSB0YXJnZXQncyAibGVhZGluZyBjaGFyIi4gICovCi0KLXZvaWQKLWRvX3NfZnVuYyAoZW5kX3AsIGRlZmF1bHRfcHJlZml4KQotICAgICBpbnQgZW5kX3A7Ci0gICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfcHJlZml4OwotewotICAvKiBSZWNvcmQgdGhlIGN1cnJlbnQgZnVuY3Rpb24gc28gdGhhdCB3ZSBjYW4gaXNzdWUgYW4gZXJyb3IgbWVzc2FnZSBmb3IKLSAgICAgbWlzcGxhY2VkIC5mdW5jLC5lbmRmdW5jLCBhbmQgYWxzbyBzbyB0aGF0IC5lbmRmdW5jIG5lZWRzIG5vCi0gICAgIGFyZ3VtZW50cy4gICovCi0gIHN0YXRpYyBjaGFyICpjdXJyZW50X25hbWU7Ci0gIHN0YXRpYyBjaGFyICpjdXJyZW50X2xhYmVsOwotCi0gIGlmIChlbmRfcCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudF9uYW1lID09IE5VTEwpCi0JewotCSAgYXNfYmFkIChfKCJtaXNzaW5nIC5mdW5jIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChkZWJ1Z190eXBlID09IERFQlVHX1NUQUJTKQotCXN0YWJzX2dlbmVyYXRlX2FzbV9lbmRmdW5jIChjdXJyZW50X25hbWUsIGN1cnJlbnRfbGFiZWwpOwotCi0gICAgICBjdXJyZW50X25hbWUgPSBjdXJyZW50X2xhYmVsID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgLyogISBlbmRfcCAqLwotICAgIHsKLSAgICAgIGNoYXIgKm5hbWUsKmxhYmVsOwotICAgICAgY2hhciBkZWxpbTEsZGVsaW0yOwotCi0gICAgICBpZiAoY3VycmVudF9uYW1lICE9IE5VTEwpCi0JewotCSAgYXNfYmFkIChfKCIuZW5kZnVuYyBtaXNzaW5nIGZvciBwcmV2aW91cyAuZnVuYyIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVsaW0xID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBuYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gZGVsaW0xOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCXsKLQkgIGlmIChkZWZhdWx0X3ByZWZpeCkKLQkgICAgYXNwcmludGYgKCZsYWJlbCwgIiVzJXMiLCBkZWZhdWx0X3ByZWZpeCwgbmFtZSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyIGxlYWRpbmdfY2hhciA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgICAgIGxlYWRpbmdfY2hhciA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoc3Rkb3V0cHV0KTsKLSNlbmRpZgotCSAgICAgIC8qIE1pc3NpbmcgZW50cnkgcG9pbnQsIHVzZSBmdW5jdGlvbidzIG5hbWUgd2l0aCB0aGUgbGVhZGluZwotCQkgY2hhciBwcmVwZW5kZWQuICAqLwotCSAgICAgIGlmIChsZWFkaW5nX2NoYXIpCi0JCWFzcHJpbnRmICgmbGFiZWwsICIlYyVzIiwgbGVhZGluZ19jaGFyLCBuYW1lKTsKLQkgICAgICBlbHNlCi0JCWxhYmVsID0gbmFtZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGxhYmVsID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgZGVsaW0yID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICBsYWJlbCA9IHhzdHJkdXAgKGxhYmVsKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBkZWxpbTI7Ci0JfQotCi0gICAgICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19TVEFCUykKLQlzdGFic19nZW5lcmF0ZV9hc21fZnVuYyAobmFtZSwgbGFiZWwpOwotCi0gICAgICBjdXJyZW50X25hbWUgPSBuYW1lOwotICAgICAgY3VycmVudF9sYWJlbCA9IGxhYmVsOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotdm9pZCAKLXNfaWdub3JlIChhcmcpCi0gICAgIGludCBhcmcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotCi12b2lkCi1yZWFkX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGhhc2hfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSwgInBzZXVkby1vcCB0YWJsZSIsIHBvX2hhc2gpOwotfQotCi0vKiBlbmQgb2YgcmVhZC5jICovCmRpZmYgLS1naXQgYS9nYXMvcmVhZC5oIGIvZ2FzL3JlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzYjEwMy4uMDAwMDAwMAotLS0gYS9nYXMvcmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qIHJlYWQuaCAtIG9mIHJlYWQuYwotICAgQ29weXJpZ2h0IChDKSAxOTg2LCA5MCwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1leHRlcm4gY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOy8qIC0+IGNoYXIgd2UgYXJlIHBhcnNpbmcgbm93LiAqLwotCi0jZGVmaW5lIFBFUk1JVF9XSElURVNQQUNFCS8qIERlZmluZSB0byBtYWtlIHdoaXRlc3BhY2UgYmUgYWxsb3dlZCBpbiAqLwotLyogbWFueSBzeW50YWN0aWNhbGx5IHVubmVjZXNzYXJ5IHBsYWNlcy4gKi8KLS8qIE5vcm1hbGx5IHVuZGVmaW5lZC4gRm9yIGNvbXBhdGliaWxpdHkgKi8KLS8qIHdpdGggYW5jaWVudCBHTlUgY2MuICovCi0vKiAjdW5kZWYgUEVSTUlUX1dISVRFU1BBQ0UgKi8KLQotI2lmZGVmIFBFUk1JVF9XSElURVNQQUNFCi0jZGVmaW5lIFNLSVBfV0hJVEVTUEFDRSgpIHtpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnKSArKyBpbnB1dF9saW5lX3BvaW50ZXI7fQotI2Vsc2UKLSNkZWZpbmUgU0tJUF9XSElURVNQQUNFKCkga25vdygqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJyApCi0jZW5kaWYKLQotCi0jZGVmaW5lCUxFWF9OQU1FCSgxKQkvKiBtYXkgY29udGludWUgYSBuYW1lICovCi0jZGVmaW5lIExFWF9CRUdJTl9OQU1FCSgyKQkvKiBtYXkgYmVnaW4gYSBuYW1lICovCi0jZGVmaW5lIExFWF9FTkRfTkFNRQkoNCkJLyogZW5kcyBhIG5hbWUgKi8KLQotI2RlZmluZSBpc19uYW1lX2JlZ2lubmVyKGMpIFwKLSAgKCBsZXhfdHlwZVsodW5zaWduZWQgY2hhcikgKGMpXSAmIExFWF9CRUdJTl9OQU1FICkKLSNkZWZpbmUgaXNfcGFydF9vZl9uYW1lKGMpIFwKLSAgKCBsZXhfdHlwZVsodW5zaWduZWQgY2hhcikgKGMpXSAmIExFWF9OQU1FICAgICAgICkKLSNkZWZpbmUgaXNfbmFtZV9lbmRlcihjKSBcCi0gICggbGV4X3R5cGVbKHVuc2lnbmVkIGNoYXIpIChjKV0gJiBMRVhfRU5EX05BTUUgICApCi0KLSNpZm5kZWYgaXNfYV9jaGFyCi0jZGVmaW5lIENIQVJfTUFTSwkoMHhmZikKLSNkZWZpbmUgTk9UX0FfQ0hBUgkoQ0hBUl9NQVNLKzEpCi0jZGVmaW5lIGlzX2FfY2hhcihjKQkoKCh1bnNpZ25lZCkoYykpIDw9IENIQVJfTUFTSykKLSNlbmRpZiAvKiBpc19hX2NoYXIoKSAqLwotCi1leHRlcm4gY2hhciBsZXhfdHlwZVtdOwotZXh0ZXJuIGNoYXIgaXNfZW5kX29mX2xpbmVbXTsKLQotZXh0ZXJuIGludCBpc19pdF9lbmRfb2Zfc3RhdGVtZW50IFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKLQotLyogVGhlc2UgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSBDUFUgc3BlY2lmaWMgdGFyZ2V0IGZpbGVzICh0Yy0qLmMpLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXTsKLWV4dGVybiBjb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdOwotZXh0ZXJuIGNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXTsKLQotLyogVGFibGUgb2YgLUkgZGlyZWN0b3JpZXMuICAqLwotZXh0ZXJuIGNoYXIgKippbmNsdWRlX2RpcnM7Ci1leHRlcm4gaW50IGluY2x1ZGVfZGlyX2NvdW50OwotZXh0ZXJuIGludCBpbmNsdWRlX2Rpcl9tYXhsZW47Ci0KLS8qIFRoZSBvZmZzZXQgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24uICAqLwotZXh0ZXJuIGFkZHJlc3NUIGFic19zZWN0aW9uX29mZnNldDsKLQotLyogVGhlIGxhYmVsIG9uIGEgbGluZSwgdXNlZCBieSBzb21lIG9mIHRoZSBwc2V1ZG8tb3BzLiAgKi8KLWV4dGVybiBzeW1ib2xTICpsaW5lX2xhYmVsOwotCi0vKiBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydCBNUkkgY29tbW9uIHNlY3Rpb25zLiAgKi8KLWV4dGVybiBzeW1ib2xTICptcmlfY29tbW9uX3N5bWJvbDsKLQotLyogUG9zc2libGUgYXJndW1lbnRzIHRvIC5saW5rb25jZS4gICovCi1lbnVtIGxpbmtvbmNlX3R5cGUKLXsKLSAgTElOS09OQ0VfVU5TRVQgPSAwLAotICBMSU5LT05DRV9ESVNDQVJELAotICBMSU5LT05DRV9PTkVfT05MWSwKLSAgTElOS09OQ0VfU0FNRV9TSVpFLAotICBMSU5LT05DRV9TQU1FX0NPTlRFTlRTCi19OwotCi1leHRlcm4gdm9pZCBwb3BfaW5zZXJ0IFBBUkFNUyAoKGNvbnN0IHBzZXVkb190eXBlUyAqKSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGdldF9zdGFiX3N0cmluZ19vZmZzZXQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpzdGFic3RyX3NlY25hbWUpKTsKLWV4dGVybiBjaGFyICpkZW1hbmRfY29weV9DX3N0cmluZyBQQVJBTVMgKChpbnQgKmxlbl9wb2ludGVyKSk7Ci1leHRlcm4gY2hhciBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvcgotICBQQVJBTVMgKChsb25nICp2YWxfcG9pbnRlcikpOwotZXh0ZXJuIG9mZnNldFQgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZXh0X2NoYXJfb2Zfc3RyaW5nIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHNfbXJpX3NlY3QgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gY2hhciAqbXJpX2NvbW1lbnRfZmllbGQgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBtcmlfY29tbWVudF9lbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGFkZF9pbmNsdWRlX2RpciBQQVJBTVMgKChjaGFyICpwYXRoKSk7Ci1leHRlcm4gdm9pZCBjb25zIFBBUkFNUyAoKGludCBuYnl0ZXMpKTsKLWV4dGVybiB2b2lkIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgZW1pdF9leHByIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHAsIHVuc2lnbmVkIGludCBuYnl0ZXMpKTsKLWV4dGVybiB2b2lkIGVtaXRfbGViMTI4X2V4cHIgUEFSQU1TICgoZXhwcmVzc2lvblMgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBlcXVhbHMgUEFSQU1TICgoY2hhciAqc3ltX25hbWUsIGludCByZWFzc2lnbikpOwotZXh0ZXJuIHZvaWQgZmxvYXRfY29ucyBQQVJBTVMgKChpbnQgZmxvYXRfdHlwZSkpOwotZXh0ZXJuIHZvaWQgaWdub3JlX3Jlc3Rfb2ZfbGluZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBkaXNjYXJkX3Jlc3Rfb2ZfbGluZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gaW50IG91dHB1dF9sZWIxMjggUEFSQU1TICgoY2hhciAqLCB2YWx1ZVQsIGludCBzaWduKSk7Ci1leHRlcm4gdm9pZCBwc2V1ZG9fc2V0IFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2xQKSk7Ci1leHRlcm4gdm9pZCByZWFkX2Ffc291cmNlX2ZpbGUgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgcmVhZF9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCByZWFkX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gaW50IHNpemVvZl9sZWIxMjggUEFSQU1TICgodmFsdWVULCBpbnQgc2lnbikpOwotZXh0ZXJuIHZvaWQgc3RhYnNfZ2VuZXJhdGVfYXNtX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBzdGFic19nZW5lcmF0ZV9hc21fZnVuYyBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQotZXh0ZXJuIHZvaWQgZ2VuZXJhdGVfbGluZW5vX2RlYnVnIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgc19hYm9ydCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfYWxpZ25fYnl0ZXMgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19hbGlnbl9wdHdvIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19hcHBfZmlsZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfYXBwX2xpbmUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2NvbW0gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2RhdGEgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2Rlc2MgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2Vsc2UgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19lbmQgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19lbmRpZiBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2VyciBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfZmFpbCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfZmlsbCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfZmxvYXRfc3BhY2UgUEFSQU1TICgoaW50IG11bHQpKTsKLWV4dGVybiB2b2lkIHNfZnVuYyBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGRvX3NfZnVuYyBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgc19nbG9ibCBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2lmIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaWZjIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaWZkZWYgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pZmVxcyBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2lnbm9yZSBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2luY2x1ZGUgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pcnAgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19sY29tbSBQQVJBTVMgKChpbnQgbmVlZHNfYWxpZ24pKTsKLWV4dGVybiB2b2lkIHNfbGNvbW1fYnl0ZXMgUEFSQU1TICgoaW50IG5lZWRzX2FsaWduKSk7Ci1leHRlcm4gdm9pZCBzX2xlYjEyOCBQQVJBTVMgKChpbnQgc2lnbikpOwotZXh0ZXJuIHZvaWQgc19saW5rb25jZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfbHN5bSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfbWFjcm8gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX21leGl0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19tcmkgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX21yaV9jb21tb24gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX29yZyBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfcHJpbnQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX3B1cmdlbSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfcmVwdCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfc2V0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19zcGFjZSBQQVJBTVMgKChpbnQgbXVsdCkpOwotZXh0ZXJuIHZvaWQgc19zdGFiIFBBUkFNUyAoKGludCB3aGF0KSk7Ci1leHRlcm4gdm9pZCBzX3N0cnVjdCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfdGV4dCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHN0cmluZ2VyIFBBUkFNUyAoKGludCBhcHBlbmRfemVybykpOwotZXh0ZXJuIHZvaWQgc194c3RhYiBQQVJBTVMgKChpbnQgd2hhdCkpOwotZXh0ZXJuIHZvaWQgc19ydmEgUEFSQU1TICgoaW50KSk7Ci0KLS8qIGVuZCBvZiByZWFkLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9zYi5jIGIvZ2FzL3NiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYzIzZmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3NiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyogc2IuYyAtIHN0cmluZyBidWZmZXIgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgYW5kIEp1ZHkgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsCi0gICAgICBzYWNAY3lnbnVzLmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic2IuaCIKLQotLyogVGhlc2Ugcm91dGluZXMgYXJlIGFib3V0IG1hbmlwdWxhdGluZyBzdHJpbmdzLgotCi0gICBUaGV5IGFyZSBtYW5hZ2VkIGluIHRoaW5ncyBjYWxsZWQgYHNiJ3Mgd2hpY2ggaXMgYW4gYWJicmV2aWF0aW9uCi0gICBmb3Igc3RyaW5nIGJ1ZmZlcnMuICBBbiBzYiBoYXMgdG8gYmUgY3JlYXRlZCwgdGhpbmdzIGNhbiBiZSBnbHVlZAotICAgb24gdG8gaXQsIGFuZCBhdCB0aGUgZW5kIG9mIGl0J3MgbGlmZSBpdCBzaG91bGQgYmUgZnJlZWQuICBUaGUKLSAgIGNvbnRlbnRzIHNob3VsZCBuZXZlciBiZSBwb2ludGVkIGF0IHdoaWxzdCBpdCBpcyBzdGlsbCBncm93aW5nLAotICAgc2luY2UgaXQgY291bGQgYmUgbW92ZWQgYXQgYW55IHRpbWUKLQotICAgZWc6Ci0gICBzYl9uZXcgKCZmb28pOwotICAgc2JfZ3Jvdy4uLiAoJmZvbywuLi4pOwotICAgdXNlIGZvby0+cHRyWypdOwotICAgc2Jfa2lsbCAoJmZvbyk7Ci0KLSovCi0KLSNkZWZpbmUgZHNpemUgNQotCi1zdGF0aWMgdm9pZCBzYl9jaGVjayBQQVJBTVMgKChzYiAqLCBpbnQpKTsKLQotLyogU3RhdGlzdGljcyBvZiBzYiBzdHJ1Y3R1cmVzLiAgKi8KLQotaW50IHN0cmluZ19jb3VudFtzYl9tYXhfcG93ZXJfdHdvXTsKLQotLyogRnJlZSBsaXN0IG9mIHNiIHN0cnVjdHVyZXMuICAqLwotCi1zdGF0aWMgc2JfbGlzdF92ZWN0b3IgZnJlZV9saXN0OwotCi0vKiBpbml0aWFsaXplcyBhbiBzYi4gKi8KLQotdm9pZAotc2JfYnVpbGQgKHB0ciwgc2l6ZSkKLSAgICAgc2IgKnB0cjsKLSAgICAgaW50IHNpemU7Ci17Ci0gIC8qIHNlZSBpZiB3ZSBjYW4gZmluZCBvbmUgdG8gYWxsb2NhdGUgKi8KLSAgc2JfZWxlbWVudCAqZTsKLQotICBpZiAoc2l6ZSA+IHNiX21heF9wb3dlcl90d28pCi0gICAgYWJvcnQgKCk7Ci0KLSAgZSA9IGZyZWVfbGlzdC5zaXplW3NpemVdOwotICBpZiAoIWUpCi0gICAgewotICAgICAgLyogbm90aGluZyB0aGVyZSwgYWxsb2NhdGUgb25lIGFuZCBzdGljayBpbnRvIHRoZSBmcmVlIGxpc3QgKi8KLSAgICAgIGUgPSAoc2JfZWxlbWVudCAqKSB4bWFsbG9jIChzaXplb2YgKHNiX2VsZW1lbnQpICsgKDEgPDwgc2l6ZSkpOwotICAgICAgZS0+bmV4dCA9IGZyZWVfbGlzdC5zaXplW3NpemVdOwotICAgICAgZS0+c2l6ZSA9IDEgPDwgc2l6ZTsKLSAgICAgIGZyZWVfbGlzdC5zaXplW3NpemVdID0gZTsKLSAgICAgIHN0cmluZ19jb3VudFtzaXplXSsrOwotICAgIH0KLQotICAvKiByZW1vdmUgZnJvbSBmcmVlIGxpc3QgKi8KLQotICBmcmVlX2xpc3Quc2l6ZVtzaXplXSA9IGUtPm5leHQ7Ci0KLSAgLyogY29weSBpbnRvIGNhbGxlcnMgd29ybGQgKi8KLSAgcHRyLT5wdHIgPSBlLT5kYXRhOwotICBwdHItPnBvdCA9IHNpemU7Ci0gIHB0ci0+bGVuID0gMDsKLSAgcHRyLT5pdGVtID0gZTsKLX0KLQotCi12b2lkCi1zYl9uZXcgKHB0cikKLSAgICAgc2IgKnB0cjsKLXsKLSAgc2JfYnVpbGQgKHB0ciwgZHNpemUpOwotfQotCi0vKiBkZWFsbG9jYXRlIHRoZSBzYiBhdCBwdHIgKi8KLQotdm9pZAotc2Jfa2lsbCAocHRyKQotICAgICBzYiAqcHRyOwotewotICAvKiByZXR1cm4gaXRlbSB0byBmcmVlIGxpc3QgKi8KLSAgcHRyLT5pdGVtLT5uZXh0ID0gZnJlZV9saXN0LnNpemVbcHRyLT5wb3RdOwotICBmcmVlX2xpc3Quc2l6ZVtwdHItPnBvdF0gPSBwdHItPml0ZW07Ci19Ci0KLS8qIGFkZCB0aGUgc2IgYXQgcyB0byB0aGUgZW5kIG9mIHRoZSBzYiBhdCBwdHIgKi8KLQotdm9pZAotc2JfYWRkX3NiIChwdHIsIHMpCi0gICAgIHNiICpwdHI7Ci0gICAgIHNiICpzOwotewotICBzYl9jaGVjayAocHRyLCBzLT5sZW4pOwotICBtZW1jcHkgKHB0ci0+cHRyICsgcHRyLT5sZW4sIHMtPnB0ciwgcy0+bGVuKTsKLSAgcHRyLT5sZW4gKz0gcy0+bGVuOwotfQotCi0vKiBtYWtlIHN1cmUgdGhhdCB0aGUgc2IgYXQgcHRyIGhhcyByb29tIGZvciBhbm90aGVyIGxlbiBjaGFyYWN0ZXJzLAotICAgYW5kIGdyb3cgaXQgaWYgaXQgZG9lc24ndC4gKi8KLQotc3RhdGljIHZvaWQKLXNiX2NoZWNrIChwdHIsIGxlbikKLSAgICAgc2IgKnB0cjsKLSAgICAgaW50IGxlbjsKLXsKLSAgaWYgKHB0ci0+bGVuICsgbGVuID49IDEgPDwgcHRyLT5wb3QpCi0gICAgewotICAgICAgc2IgdG1wOwotICAgICAgaW50IHBvdCA9IHB0ci0+cG90OwotICAgICAgd2hpbGUgKHB0ci0+bGVuICsgbGVuID49IDEgPDwgcG90KQotCXBvdCsrOwotICAgICAgc2JfYnVpbGQgKCZ0bXAsIHBvdCk7Ci0gICAgICBzYl9hZGRfc2IgKCZ0bXAsIHB0cik7Ci0gICAgICBzYl9raWxsIChwdHIpOwotICAgICAgKnB0ciA9IHRtcDsKLSAgICB9Ci19Ci0KLS8qIG1ha2UgdGhlIHNiIGF0IHB0ciBwb2ludCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuICAqLwotCi12b2lkCi1zYl9yZXNldCAocHRyKQotICAgICBzYiAqcHRyOwotewotICBwdHItPmxlbiA9IDA7Ci19Ci0KLS8qIGFkZCBjaGFyYWN0ZXIgYyB0byB0aGUgZW5kIG9mIHRoZSBzYiBhdCBwdHIuICovCi0KLXZvaWQKLXNiX2FkZF9jaGFyIChwdHIsIGMpCi0gICAgIHNiICpwdHI7Ci0gICAgIGludCBjOwotewotICBzYl9jaGVjayAocHRyLCAxKTsKLSAgcHRyLT5wdHJbcHRyLT5sZW4rK10gPSBjOwotfQotCi0vKiBhZGQgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBzIHRvIHRoZSBlbmQgb2Ygc2IgYXQgcHRyLiAqLwotCi12b2lkCi1zYl9hZGRfc3RyaW5nIChwdHIsIHMpCi0gICAgIHNiICpwdHI7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGludCBsZW4gPSBzdHJsZW4gKHMpOwotICBzYl9jaGVjayAocHRyLCBsZW4pOwotICBtZW1jcHkgKHB0ci0+cHRyICsgcHRyLT5sZW4sIHMsIGxlbik7Ci0gIHB0ci0+bGVuICs9IGxlbjsKLX0KLQotLyogYWRkIHN0cmluZyBhdCBzIG9mIGxlbmd0aCBsZW4gdG8gc2IgYXQgcHRyICovCi0KLXZvaWQKLXNiX2FkZF9idWZmZXIgKHB0ciwgcywgbGVuKQotICAgICBzYiAqcHRyOwotICAgICBjb25zdCBjaGFyICpzOwotICAgICBpbnQgbGVuOwotewotICBzYl9jaGVjayAocHRyLCBsZW4pOwotICBtZW1jcHkgKHB0ci0+cHRyICsgcHRyLT5sZW4sIHMsIGxlbik7Ci0gIHB0ci0+bGVuICs9IGxlbjsKLX0KLQotLyogcHJpbnQgdGhlIHNiIGF0IHB0ciB0byB0aGUgb3V0cHV0IGZpbGUgKi8KLQotdm9pZAotc2JfcHJpbnQgKG91dGZpbGUsIHB0cikKLSAgICAgRklMRSAqb3V0ZmlsZTsKLSAgICAgc2IgKnB0cjsKLXsKLSAgaW50IGk7Ci0gIGludCBuYyA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHB0ci0+bGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKG5jKQotCXsKLQkgIGZwcmludGYgKG91dGZpbGUsICIsIik7Ci0JfQotICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiVkIiwgcHRyLT5wdHJbaV0pOwotICAgICAgbmMgPSAxOwotICAgIH0KLX0KLQotdm9pZCAKLXNiX3ByaW50X2F0IChvdXRmaWxlLCBpZHgsIHB0cikKLSAgICAgRklMRSAqb3V0ZmlsZTsKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnB0cjsKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IGlkeDsgaSA8IHB0ci0+bGVuOyBpKyspCi0gICAgcHV0YyAocHRyLT5wdHJbaV0sIG91dGZpbGUpOwotfQotCi0vKiBwdXQgYSBudWxsIGF0IHRoZSBlbmQgb2YgdGhlIHNiIGF0IGluIGFuZCByZXR1cm4gdGhlIHN0YXJ0IG9mIHRoZQotICAgc3RyaW5nLCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFzIGFuIGFyZyB0byBwcmludGYgJXMuICovCi0KLWNoYXIgKgotc2JfbmFtZSAoaW4pCi0gICAgIHNiICppbjsKLXsKLSAgLyogc3RpY2sgYSBudWxsIG9uIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAqLwotICBzYl9hZGRfY2hhciAoaW4sIDApOwotICByZXR1cm4gaW4tPnB0cjsKLX0KLQotLyogbGlrZSBzYl9uYW1lLCBidXQgZG9uJ3QgaW5jbHVkZSB0aGUgbnVsbCBieXRlIGluIHRoZSBzdHJpbmcuICAqLwotCi1jaGFyICoKLXNiX3Rlcm1pbmF0ZSAoaW4pCi0gICAgIHNiICppbjsKLXsKLSAgc2JfYWRkX2NoYXIgKGluLCAwKTsKLSAgLS1pbi0+bGVuOwotICByZXR1cm4gaW4tPnB0cjsKLX0KLQotLyogc3RhcnQgYXQgdGhlIGluZGV4IGlkeCBpbnRvIHRoZSBzdHJpbmcgaW4gc2IgYXQgcHRyIGFuZCBza2lwCi0gICB3aGl0ZXNwYWNlLiByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24gd2hpdGVzcGFjZSBjaGFyYWN0ZXIgKi8KLQotaW50Ci1zYl9za2lwX3doaXRlIChpZHgsIHB0cikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnB0cjsKLXsKLSAgd2hpbGUgKGlkeCA8IHB0ci0+bGVuCi0JICYmIChwdHItPnB0cltpZHhdID09ICcgJwotCSAgICAgfHwgcHRyLT5wdHJbaWR4XSA9PSAnXHQnKSkKLSAgICBpZHgrKzsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogc3RhcnQgYXQgdGhlIGluZGV4IGlkeCBpbnRvIHRoZSBzYiBhdCBwdHIuIHNraXBzIHdoaXRlc3BhY2UsCi0gICBhIGNvbW1hIGFuZCBhbnkgZm9sbG93aW5nIHdoaXRlc3BhY2UuIHJldHVybmVzIHRoZSBpbmRleCBvZiB0aGUKLSAgIG5leHQgY2hhcmFjdGVyLiAqLwotCi1pbnQKLXNiX3NraXBfY29tbWEgKGlkeCwgcHRyKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqcHRyOwotewotICB3aGlsZSAoaWR4IDwgcHRyLT5sZW4KLQkgJiYgKHB0ci0+cHRyW2lkeF0gPT0gJyAnCi0JICAgICB8fCBwdHItPnB0cltpZHhdID09ICdcdCcpKQotICAgIGlkeCsrOwotCi0gIGlmIChpZHggPCBwdHItPmxlbgotICAgICAgJiYgcHRyLT5wdHJbaWR4XSA9PSAnLCcpCi0gICAgaWR4Kys7Ci0KLSAgd2hpbGUgKGlkeCA8IHB0ci0+bGVuCi0JICYmIChwdHItPnB0cltpZHhdID09ICcgJwotCSAgICAgfHwgcHRyLT5wdHJbaWR4XSA9PSAnXHQnKSkKLSAgICBpZHgrKzsKLQotICByZXR1cm4gaWR4OwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3NiLmggYi9nYXMvc2IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U2ZGFmMS4uMDAwMDAwMAotLS0gYS9nYXMvc2IuaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qIHNiLmggLSBoZWFkZXIgZmlsZSBmb3Igc3RyaW5nIGJ1ZmZlciBtYW5pcHVsYXRpb24gcm91dGluZXMKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBTdGV2ZSBhbmQgSnVkeSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCwKLSAgICAgIHNhY0BjeWdudXMuY29tCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2lmbmRlZiBTQl9ICi0KLSNkZWZpbmUgU0JfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBzdHJpbmcgYmxvY2tzCi0KLSAgIEkgaGFkIGEgY291cGxlIG9mIGNob2ljZXMgd2hlbiBkZWNpZGluZyB1cG9uIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuCi0gICBnYXMgdXNlcyBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncyBmb3IgYWxsIGl0cyBpbnRlcm5hbCB3b3JrLiAgVGhpcwotICAgb2Z0ZW4gbWVhbnMgdGhhdCBwYXJ0cyBvZiB0aGUgcHJvZ3JhbSB0aGF0IHdhbnQgdG8gZXhhbWluZQotICAgc3Vic3RyaW5ncyBoYXZlIHRvIG1hbmlwdWxhdGUgdGhlIGRhdGEgaW4gdGhlIHN0cmluZyB0byBkbyB0aGUKLSAgIHJpZ2h0IHRoaW5nIChhIGNvbW1vbiBvcGVyYXRpb24gaXMgdG8gc2luZ2xlIG91dCBhIGJpdCBvZiB0ZXh0IGJ5Ci0gICBzYXZpbmcgYXdheSB0aGUgY2hhcmFjdGVyIGFmdGVyIGl0LCBudWxsaW5nIGl0IG91dCwgb3BlcmF0aW5nIG9uCi0gICB0aGUgc3Vic3RyaW5nIGFuZCB0aGVuIHJlcGxhY2luZyB0aGUgY2hhcmFjdGVyIHdoaWNoIHdhcyB1bmRlciB0aGUKLSAgIG51bGwpLiAgVGhpcyBpcyBhIHBhaW4gYW5kIEkgcmVtZW1iZXIgYSBsb2FkIG9mIHByb2JsZW1zIHRoYXQgSSBoYWQgd2l0aAotICAgY29kZSBpbiBnYXMgd2hpY2ggYWxtb3N0IGdvdCB0aGlzIHJpZ2h0LiAgQWxzbywgaXQncyBoYXJkZXIgdG8gZ3JvdyBhbmQKLSAgIGFsbG9jYXRlIG51bGwgdGVybWluYXRlZCBzdHJpbmdzIGVmZmljaWVudGx5LgotCi0gICBPYnN0YWNrcyBwcm92aWRlIGFsbCB0aGUgZnVuY3Rpb25hbGl0eSBuZWVkZWQsIGJ1dCBhcmUgdG9vCi0gICBjb21wbGljYXRlZCwgaGVuY2UgdGhlIHNiLgotCi0gICBBbiBzYiBpcyBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciwgYW5kIGlzIGluaXRpYWx6ZWQgdG8gcG9pbnQgdG8gYW4KLSAgIHNiX2VsZW1lbnQuICBzYl9lbGVtZW50cyBhcmUga2VwdCBvbiBhIGZyZWUgbGlzdHMsIGFuZCB1c2VkIHdoZW4KLSAgIG5lZWRlZCwgcmVwbGFjZWQgb250byB0aGUgZnJlZSBsaXN0IHdoZW4gdW51c2VkLgotICovCi0KLSNkZWZpbmUgc2JfbWF4X3Bvd2VyX3R3byAgICAzMAkvKiBkb24ndCBhbGxvdyBzdHJpbmdzIG1vcmUgdGhhbgotCQkJICAgICAgICAgICAyXnNiX21heF9wb3dlcl90d28gbG9uZyAqLwotLyogc3RydWN0dXJlIG9mIGFuIHNiICovCi10eXBlZGVmIHN0cnVjdCBzYgotICB7Ci0gICAgY2hhciAqcHRyOwkJCS8qIHBvaW50cyB0byB0aGUgY3VycmVudCBibG9jay4gKi8KLSAgICBpbnQgbGVuOwkJCS8qIGhvdyBtdWNoIGlzIHVzZWQuICovCi0gICAgaW50IHBvdDsJCQkvKiB0aGUgbWF4aW11bSBsZW5ndGggaXMgMTw8cG90ICovCi0gICAgc3RydWN0IGxlICppdGVtOwotICB9Ci1zYjsKLQotLyogU3RydWN0dXJlIG9mIHRoZSBmcmVlIGxpc3Qgb2JqZWN0IG9mIGFuIHNiICovCi10eXBlZGVmIHN0cnVjdCBsZQotICB7Ci0gICAgc3RydWN0IGxlICpuZXh0OwotICAgIGludCBzaXplOwotICAgIGNoYXIgZGF0YVsxXTsKLSAgfQotc2JfZWxlbWVudDsKLQotLyogVGhlIGZyZWUgbGlzdCAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHNiX2VsZW1lbnQgKnNpemVbc2JfbWF4X3Bvd2VyX3R3b107Ci0gIH0gc2JfbGlzdF92ZWN0b3I7Ci0KLWV4dGVybiBpbnQgc3RyaW5nX2NvdW50W3NiX21heF9wb3dlcl90d29dOwotCi1leHRlcm4gdm9pZCBzYl9idWlsZCBQQVJBTVMgKChzYiAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIHNiX25ldyBQQVJBTVMgKChzYiAqKSk7Ci1leHRlcm4gdm9pZCBzYl9raWxsIFBBUkFNUyAoKHNiICopKTsKLWV4dGVybiB2b2lkIHNiX2FkZF9zYiBQQVJBTVMgKChzYiAqLCBzYiAqKSk7Ci1leHRlcm4gdm9pZCBzYl9yZXNldCBQQVJBTVMgKChzYiAqKSk7Ci1leHRlcm4gdm9pZCBzYl9hZGRfY2hhciBQQVJBTVMgKChzYiAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIHNiX2FkZF9zdHJpbmcgUEFSQU1TICgoc2IgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBzYl9hZGRfYnVmZmVyIFBBUkFNUyAoKHNiICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBzYl9wcmludCBQQVJBTVMgKChGSUxFICosIHNiICopKTsKLWV4dGVybiB2b2lkIHNiX3ByaW50X2F0IFBBUkFNUyAoKEZJTEUgKiwgaW50LCBzYiAqKSk7Ci1leHRlcm4gY2hhciAqc2JfbmFtZSBQQVJBTVMgKChzYiAqKSk7Ci1leHRlcm4gY2hhciAqc2JfdGVybWluYXRlIFBBUkFNUyAoKHNiICopKTsKLWV4dGVybiBpbnQgc2Jfc2tpcF93aGl0ZSBQQVJBTVMgKChpbnQsIHNiICopKTsKLWV4dGVybiBpbnQgc2Jfc2tpcF9jb21tYSBQQVJBTVMgKChpbnQsIHNiICopKTsKLQotLyogQWN0dWFsbHkgaW4gaW5wdXQtc2NydWIuYy4gICovCi1leHRlcm4gdm9pZCBpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiIFBBUkFNUyAoKHNiICosIGNoYXIgKikpOwotCi0jZW5kaWYgLyogU0JfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3N0YWJzLmMgYi9nYXMvc3RhYnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkOWEwYi4uMDAwMDAwMAotLS0gYS9nYXMvc3RhYnMuYworKysgL2Rldi9udWxsCkBAIC0xLDYzMiArMCwwIEBACi0vKiBHZW5lcmljIHN0YWJzIHBhcnNpbmcgZm9yIGdhcy4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgImVjb2ZmLmgiCi0KLS8qIFdlIG5lZWQgdGhpcywgZGVzcGl0ZSB0aGUgYXBwYXJlbnQgb2JqZWN0IGZvcm1hdCBkZXBlbmRlbmN5LCBzaW5jZQotICAgaXQgZGVmaW5lcyBzdGFiIHR5cGVzLCB3aGljaCBhbGwgb2JqZWN0IGZvcm1hdHMgY2FuIHVzZSBub3cuICovCi0KLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLXN0YXRpYyB2b2lkIHNfc3RhYl9nZW5lcmljIFBBUkFNUyAoKGludCwgY2hhciAqLCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGdlbmVyYXRlX2FzbV9maWxlIFBBUkFNUyAoKGludCwgY2hhciAqKSk7Ci0KLS8qIEFsbG93IGJhY2tlbmRzIHRvIG92ZXJyaWRlIHRoZSBuYW1lcyB1c2VkIGZvciB0aGUgc3RhYiBzZWN0aW9ucy4gICovCi0jaWZuZGVmIFNUQUJfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFNUQUJfU0VDVElPTl9OQU1FICIuc3RhYiIKLSNlbmRpZgotCi0jaWZuZGVmIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRQotI2RlZmluZSBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUgIi5zdGFic3RyIgotI2VuZGlmCi0KLS8qIE5vbi16ZXJvIGlmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSAuZnVuYyBmdW5jdGlvbiwgaW4gd2hpY2ggY2FzZQotICAgc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyBlbWl0cyBmdW5jdGlvbiByZWxhdGl2ZSBsaW5lIG51bWJlciBzdGFicy4KLSAgIE90aGVyd2lzZSBpdCBlbWl0cyBsaW5lIG51bWJlciBzdGFicyB3aXRoIGFic29sdXRlIGFkZHJlc3Nlcy4gIE5vdGUgdGhhdAotICAgYm90aCBjYXNlcyBvbmx5IGFwcGx5IHRvIGFzc2VtYmxlciBjb2RlIGFzc2VtYmxlZCB3aXRoIC1nc3RhYnMuICAqLwotc3RhdGljIGludCBpbl9kb3RfZnVuY19wOwotCi0vKiBMYWJlbCBhdCBzdGFydCBvZiBjdXJyZW50IGZ1bmN0aW9uIGlmIGluX2RvdF9mdW5jX3AgIT0gMC4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqY3VycmVudF9mdW5jdGlvbl9sYWJlbDsKLQotLyoKLSAqIEhhbmRsZSAuc3RhYlggZGlyZWN0aXZlcywgd2hpY2ggdXNlZCB0byBiZSBvcGVuLWNvZGVkLgotICogU28gbXVjaCBjcmVlcGluZyBmZWF0dXJpc20gb3ZlcmxvYWRlZCB0aGUgc2VtYW50aWNzIHRoYXQgd2UgZGVjaWRlZAotICogdG8gcHV0IGFsbCAuc3RhYlggdGhpbmtpbmcgaW4gb25lIHBsYWNlLiBIZXJlLgotICoKLSAqIFdlIHRyeSB0byBtYWtlIGFueSAuc3RhYlggZGlyZWN0aXZlIGxlZ2FsLiBPdGhlciBwZW9wbGUncyBBUyB3aWxsIG9mdGVuCi0gKiBkbyBhc3NlbWJseS10aW1lIGNvbnNpc3RlbmN5IGNoZWNrczogZWcgYXNzaWduaW5nIG1lYW5pbmcgdG8gbl90eXBlIGJpdHMKLSAqIGFuZCAicHJvdGVjdGluZyIgeW91IGZyb20gc2V0dGluZyB0aGVtIHRvIGNlcnRhaW4gdmFsdWVzLiAoVGhleSBhbHNvIHplcm8KLSAqIGNlcnRhaW4gYml0cyBiZWZvcmUgZW1pdHRpbmcgc3ltYm9scy4gVHV0IHR1dC4pCi0gKgotICogSWYgYW4gZXhwcmVzc2lvbiBpcyBub3QgYWJzb2x1dGUgd2UgZWl0aGVyIGdyaXBlIG9yIHVzZSB0aGUgcmVsb2NhdGlvbgotICogaW5mb3JtYXRpb24uIE90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMgc2lsZW50bHkgZm9yZ2V0IGluZm9ybWF0aW9uIHRoZXkKLSAqIGRvbid0IG5lZWQgYW5kIGludmVudCBpbmZvcm1hdGlvbiB0aGV5IG5lZWQgdGhhdCB5b3UgZGlkbid0IHN1cHBseS4KLSAqLwotCi0vKgotICogQnVpbGQgYSBzdHJpbmcgZGljdGlvbmFyeSBlbnRyeSBmb3IgYSAuc3RhYlggc3ltYm9sLgotICogVGhlIHN5bWJvbCBpcyBhZGRlZCB0byB0aGUgLjxzZWNuYW1lPnN0ciBzZWN0aW9uLgotICovCi0KLSNpZm5kZWYgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUwotI2RlZmluZSBTRVBBUkFURV9TVEFCX1NFQ1RJT05TIDAKLSNlbmRpZgotCi11bnNpZ25lZCBpbnQKLWdldF9zdGFiX3N0cmluZ19vZmZzZXQgKHN0cmluZywgc3RhYnN0cl9zZWNuYW1lKQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YWJzdHJfc2VjbmFtZTsKLXsKLSAgdW5zaWduZWQgaW50IGxlbmd0aDsKLSAgdW5zaWduZWQgaW50IHJldHZhbDsKLSAgc2VnVCBzYXZlX3NlZzsKLSAgc3Vic2VnVCBzYXZlX3N1YnNlZzsKLSAgc2VnVCBzZWc7Ci0gIGNoYXIgKnA7Ci0KLSAgaWYgKCEgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUykKLSAgICBhYm9ydCAoKTsKLQotICBsZW5ndGggPSBzdHJsZW4gKHN0cmluZyk7Ci0KLSAgc2F2ZV9zZWcgPSBub3dfc2VnOwotICBzYXZlX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLSAgLyogQ3JlYXRlIHRoZSBzdGFiIHN0cmluZyBzZWN0aW9uLiAgKi8KLSAgc2VnID0gc3Vic2VnX25ldyAoc3RhYnN0cl9zZWNuYW1lLCAwKTsKLQotICByZXR2YWwgPSBzZWdfaW5mbyAoc2VnKS0+c3RhYnUuc3RhYl9zdHJpbmdfc2l6ZTsKLSAgaWYgKHJldHZhbCA8PSAwKQotICAgIHsKLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZmlyc3Qgc3RyaW5nIGlzIGVtcHR5LiAgKi8KLSAgICAgIHAgPSBmcmFnX21vcmUgKDEpOwotICAgICAgKnAgPSAwOwotICAgICAgcmV0dmFsID0gc2VnX2luZm8gKHNlZyktPnN0YWJ1LnN0YWJfc3RyaW5nX3NpemUgPSAxOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWcsIFNFQ19SRUFET05MWSB8IFNFQ19ERUJVR0dJTkcpOwotICAgICAgaWYgKHNlZy0+bmFtZSA9PSBzdGFic3RyX3NlY25hbWUpCi0Jc2VnLT5uYW1lID0geHN0cmR1cCAoc3RhYnN0cl9zZWNuYW1lKTsKLSNlbmRpZgotICAgIH0KLQotICBpZiAobGVuZ3RoID4gMCkKLSAgICB7CQkJCS8qIE9yZGluYXJ5IGNhc2UuICovCi0gICAgICBwID0gZnJhZ19tb3JlIChsZW5ndGggKyAxKTsKLSAgICAgIHN0cmNweSAocCwgc3RyaW5nKTsKLQotICAgICAgc2VnX2luZm8gKHNlZyktPnN0YWJ1LnN0YWJfc3RyaW5nX3NpemUgKz0gbGVuZ3RoICsgMTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR2YWwgPSAwOwotCi0gIHN1YnNlZ19zZXQgKHNhdmVfc2VnLCBzYXZlX3N1YnNlZyk7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotI2lmZGVmIEFPVVRfU1RBQlMKLSNpZm5kZWYgT0JKX1BST0NFU1NfU1RBQgotI2RlZmluZSBPQkpfUFJPQ0VTU19TVEFCKFNFRyxXLFMsVCxPLEQpCWFvdXRfcHJvY2Vzc19zdGFiKFcsUyxULE8sRCkKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBhb3V0X3Byb2Nlc3Nfc3RhYiBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCkpOwotCi1zdGF0aWMgdm9pZAotYW91dF9wcm9jZXNzX3N0YWIgKHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpCi0gICAgIGludCB3aGF0OwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGludCB0eXBlLCBvdGhlciwgZGVzYzsKLXsKLSAgLyogUHV0IHRoZSBzdGFiIGluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBzeW1ib2xTICpzeW1ib2w7Ci0KLSAgLyogQ3JlYXRlIHRoZSBzeW1ib2wgbm93LCBidXQgb25seSBpbnNlcnQgaXQgaW50byB0aGUgc3ltYm9sIGNoYWluCi0gICAgIGFmdGVyIGFueSBzeW1ib2xzIG1lbnRpb25lZCBpbiB0aGUgdmFsdWUgZXhwcmVzc2lvbiBnZXQgaW50byB0aGUKLSAgICAgc3ltYm9sIGNoYWluLiAgVGhpcyBpcyB0byBhdm9pZCAiY29udGludWF0aW9uIHN5bWJvbHMiICh3aGVyZSBvbmUKLSAgICAgZW5kcyBpbiAiXCIgYW5kIHRoZSBkZWJ1ZyBpbmZvIGlzIGNvbnRpbnVlZCBpbiB0aGUgbmV4dCAuc3RhYnMKLSAgICAgZGlyZWN0aXZlKSBmcm9tIGJlaW5nIHNlcGFyYXRlZCBieSBvdGhlciByYW5kb20gc3ltYm9scy4gICovCi0gIHN5bWJvbCA9IHN5bWJvbF9jcmVhdGUgKHN0cmluZywgdW5kZWZpbmVkX3NlY3Rpb24sIDAsCi0JCQkgIChzdHJ1Y3QgZnJhZyAqKSBOVUxMKTsKLSAgaWYgKHdoYXQgPT0gJ3MnIHx8IHdoYXQgPT0gJ24nKQotICAgIHsKLSAgICAgIC8qIFBpY2sgdXAgdGhlIHZhbHVlIGZyb20gdGhlIGlucHV0IGxpbmUuICAqLwotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2wsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBwc2V1ZG9fc2V0IChzeW1ib2wpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIC5zdGFiZCBzZXRzIHRoZSBuYW1lIHRvIE5VTEwuICBXaHk/ICAqLwotICAgICAgU19TRVRfTkFNRSAoc3ltYm9sLCBOVUxMKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sLCBmcmFnX25vdyk7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotICAgIH0KLQotICBzeW1ib2xfYXBwZW5kIChzeW1ib2wsIHN5bWJvbF9sYXN0UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0KLSAgU19TRVRfVFlQRSAoc3ltYm9sLCB0eXBlKTsKLSAgU19TRVRfT1RIRVIgKHN5bWJvbCwgb3RoZXIpOwotICBTX1NFVF9ERVNDIChzeW1ib2wsIGRlc2MpOwotfQotI2VuZGlmCi0KLS8qIFRoaXMgY2FuIGhhbmRsZSBkaWZmZXJlbnQga2luZHMgb2Ygc3RhYnMgKHMsbixkKSBhbmQgZGlmZmVyZW50Ci0gICBraW5kcyBvZiBzdGFiIHNlY3Rpb25zLiAqLwotCi1zdGF0aWMgdm9pZCAKLXNfc3RhYl9nZW5lcmljICh3aGF0LCBzdGFiX3NlY25hbWUsIHN0YWJzdHJfc2VjbmFtZSkKLSAgICAgaW50IHdoYXQ7Ci0gICAgIGNoYXIgKnN0YWJfc2VjbmFtZTsKLSAgICAgY2hhciAqc3RhYnN0cl9zZWNuYW1lOwotewotICBsb25nIGxvbmdpbnQ7Ci0gIGNoYXIgKnN0cmluZzsKLSAgaW50IHR5cGU7Ci0gIGludCBvdGhlcjsKLSAgaW50IGRlc2M7Ci0KLSAgLyogVGhlIGdlbmVyYWwgZm9ybWF0IGlzOgotICAgICAuc3RhYnMgIlNUUklORyIsVFlQRSxPVEhFUixERVNDLFZBTFVFCi0gICAgIC5zdGFibiBUWVBFLE9USEVSLERFU0MsVkFMVUUKLSAgICAgLnN0YWJkIFRZUEUsT1RIRVIsREVTQwotICAgICBBdCB0aGlzIHBvaW50IGlucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgYWZ0ZXIgdGhlIHBzZXVkby1vcCBhbmQKLSAgICAgYW55IHRyYWlsaW5nIHdoaXRlc3BhY2UuICBUaGUgYXJndW1lbnQgd2hhdCBpcyBvbmUgb2YgJ3MnLCAnbicgb3IKLSAgICAgJ2QnIGluZGljYXRpbmcgd2hpY2ggdHlwZSBvZiAuc3RhYiB0aGlzIGlzLiAgKi8KLQotICBpZiAod2hhdCAhPSAncycpCi0gICAgc3RyaW5nID0gIiI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0gICAgICBzdHJpbmcgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbmd0aCk7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBlbHNlCi0JewotCSAgYXNfd2FybiAoXygiLnN0YWJzOiBNaXNzaW5nIGNvbW1hIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJmxvbmdpbnQpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuc3RhYiVjOiBNaXNzaW5nIGNvbW1hIiksIHdoYXQpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHR5cGUgPSBsb25naW50OwotCi0gIGlmIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJmxvbmdpbnQpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuc3RhYiVjOiBNaXNzaW5nIGNvbW1hIiksIHdoYXQpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIG90aGVyID0gbG9uZ2ludDsKLQotICBkZXNjID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICh3aGF0ID09ICdzJyB8fCB3aGF0ID09ICduJykKLSAgICB7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0JewotCSAgYXNfd2FybiAoXygiLnN0YWIlYzogTWlzc2luZyBjb21tYSIpLCB3aGF0KTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotCi0jaWZkZWYgVENfUFBDCi0jaWZkZWYgT0JKX0VMRgotICAvKiBTb2xhcmlzIG9uIFBvd2VyUEMgaGFzIGRlY2lkZWQgdGhhdCAuc3RhYmQgY2FuIHRha2UgNCBhcmd1bWVudHMsIHNvIGlmIHdlIHdlcmUKLSAgICAgZ2l2ZW4gNCBhcmd1bWVudHMsIG1ha2UgaXQgYSAuc3RhYm4gKi8KLSAgZWxzZSBpZiAod2hhdCA9PSAnZCcpCi0gICAgewotICAgICAgY2hhciAqc2F2ZV9sb2NhdGlvbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgd2hhdCA9ICduJzsKLQl9Ci0gICAgICBlbHNlCi0JaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9sb2NhdGlvbjsKLSAgICB9Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotI2VuZGlmIC8qIFRDX1BQQyAqLwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgaWYgKGxpc3RpbmcpCi0gICAgewotICAgICAgc3dpdGNoICh0eXBlKQotCXsKLQljYXNlIE5fU0xJTkU6Ci0JICBsaXN0aW5nX3NvdXJjZV9saW5lICgodW5zaWduZWQgaW50KSBkZXNjKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9TTzoKLQljYXNlIE5fU09MOgotCSAgbGlzdGluZ19zb3VyY2VfZmlsZSAoc3RyaW5nKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYgLyogISBOT19MSVNUSU5HICovCi0KLSAgLyogV2UgaGF2ZSBub3cgZ2F0aGVyZWQgdGhlIHR5cGUsIG90aGVyLCBhbmQgZGVzYyBpbmZvcm1hdGlvbi4gIEZvcgotICAgICAuc3RhYnMgb3IgLnN0YWJuLCBpbnB1dF9saW5lX3BvaW50ZXIgaXMgbm93IHBvaW50aW5nIGF0IHRoZQotICAgICB2YWx1ZS4gICovCi0KLSAgaWYgKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpCi0gICAgLyogT3V0cHV0IHRoZSBzdGFiIGluZm9ybWF0aW9uIGluIGEgc2VwYXJhdGUgc2VjdGlvbi4gIFRoaXMgaXMgdXNlZAotICAgICAgIGF0IGxlYXN0IGZvciBDT0ZGIGFuZCBFTEYuICAqLwotICAgIHsKLSAgICAgIHNlZ1Qgc2F2ZWRfc2VnID0gbm93X3NlZzsKLSAgICAgIHN1YnNlZ1Qgc2F2ZWRfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIGZyYWdTICpzYXZlZF9mcmFnID0gZnJhZ19ub3c7Ci0gICAgICB2YWx1ZVQgZG90OwotICAgICAgc2VnVCBzZWc7Ci0gICAgICB1bnNpZ25lZCBpbnQgc3Ryb2ZmOwotICAgICAgY2hhciAqcDsKLQotICAgICAgc3RhdGljIHNlZ1QgY2FjaGVkX3NlYzsKLSAgICAgIHN0YXRpYyBjaGFyICpjYWNoZWRfc2VjbmFtZTsKLQotICAgICAgZG90ID0gZnJhZ19ub3dfZml4ICgpOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgICAgIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgICAgIGlmIChjYWNoZWRfc2VjbmFtZSAmJiAhc3RyY21wIChjYWNoZWRfc2VjbmFtZSwgc3RhYl9zZWNuYW1lKSkKLQl7Ci0JICBzZWcgPSBjYWNoZWRfc2VjOwotCSAgc3Vic2VnX3NldCAoc2VnLCAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2VnID0gc3Vic2VnX25ldyAoc3RhYl9zZWNuYW1lLCAwKTsKLQkgIGlmIChjYWNoZWRfc2VjbmFtZSkKLQkgICAgZnJlZSAoY2FjaGVkX3NlY25hbWUpOwotCSAgY2FjaGVkX3NlY25hbWUgPSB4c3RyZHVwIChzdGFiX3NlY25hbWUpOwotCSAgY2FjaGVkX3NlYyA9IHNlZzsKLQl9Ci0KLSAgICAgIGlmICghIHNlZ19pbmZvIChzZWcpLT5oYWRvbmUpCi0JewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWcsCi0JCQkJIFNFQ19SRUFET05MWSB8IFNFQ19SRUxPQyB8IFNFQ19ERUJVR0dJTkcpOwotI2VuZGlmCi0jaWZkZWYgSU5JVF9TVEFCX1NFQ1RJT04KLQkgIElOSVRfU1RBQl9TRUNUSU9OIChzZWcpOwotI2VuZGlmCi0JICBzZWdfaW5mbyAoc2VnKS0+aGFkb25lID0gMTsKLQl9Ci0KLSAgICAgIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKHN0cmluZywgc3RhYnN0cl9zZWNuYW1lKTsKLSAgICAgIGlmICh3aGF0ID09ICdzJykKLQl7Ci0JICAvKiByZWxlYXNlIHRoZSBzdHJpbmcgKi8KLQkgIG9ic3RhY2tfZnJlZSAoJm5vdGVzLCBzdHJpbmcpOwotCX0KLQotICAgICAgLyogQXQgbGVhc3QgZm9yIG5vdywgc3RhYnMgaW4gYSBzcGVjaWFsIHN0YWIgc2VjdGlvbiBhcmUgYWx3YXlzCi0JIG91dHB1dCBhcyAxMiBieXRlIGJsb2NrcyBvZiBpbmZvcm1hdGlvbi4gICovCi0gICAgICBwID0gZnJhZ19tb3JlICg4KTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgc3Ryb2ZmLCA0KTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIDQsICh2YWx1ZVQpIHR5cGUsIDEpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgNSwgKHZhbHVlVCkgb3RoZXIsIDEpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgNiwgKHZhbHVlVCkgZGVzYywgMik7Ci0KLSAgICAgIGlmICh3aGF0ID09ICdzJyB8fCB3aGF0ID09ICduJykKLQl7Ci0JICAvKiBQaWNrIHVwIHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnB1dCBsaW5lLiAgKi8KLQkgIGNvbnMgKDQpOwotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKmZha2U7Ci0JICBzeW1ib2xTICpzeW1ib2w7Ci0JICBleHByZXNzaW9uUyBleHA7Ci0KLQkgIC8qIEFycmFuZ2UgZm9yIGEgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGxvY2F0aW9uLiAgKi8KLQkgIGZha2UgPSBGQUtFX0xBQkVMX05BTUU7Ci0JICBzeW1ib2wgPSBzeW1ib2xfbmV3IChmYWtlLCBzYXZlZF9zZWcsIGRvdCwgc2F2ZWRfZnJhZyk7Ci0KLQkgIGV4cC5YX29wID0gT19zeW1ib2w7Ci0JICBleHAuWF9hZGRfc3ltYm9sID0gc3ltYm9sOwotCSAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0KLQkgIGVtaXRfZXhwciAoJmV4cCwgNCk7Ci0JfQotCi0jaWZkZWYgT0JKX1BST0NFU1NfU1RBQgotICAgICAgT0JKX1BST0NFU1NfU1RBQiAoc2VnLCB3aGF0LCBzdHJpbmcsIHR5cGUsIG90aGVyLCBkZXNjKTsKLSNlbmRpZgotCi0gICAgICBzdWJzZWdfc2V0IChzYXZlZF9zZWcsIHNhdmVkX3N1YnNlZyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmZGVmIE9CSl9QUk9DRVNTX1NUQUIKLSAgICAgIE9CSl9QUk9DRVNTX1NUQUIgKDAsIHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpOwotI2Vsc2UKLSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFJlZ3VsYXIgc3RhYiBkaXJlY3RpdmUuICovCi0KLXZvaWQKLXNfc3RhYiAod2hhdCkKLSAgICAgaW50IHdoYXQ7Ci17Ci0gIHNfc3RhYl9nZW5lcmljICh3aGF0LCBTVEFCX1NFQ1RJT05fTkFNRSwgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FKTsKLX0KLQotLyogIkV4dGVuZGVkIHN0YWJzIiwgdXNlZCBpbiBTb2xhcmlzIG9ubHkgbm93LiAqLwotCi12b2lkCi1zX3hzdGFiICh3aGF0KQotICAgICBpbnQgd2hhdDsKLXsKLSAgaW50IGxlbmd0aDsKLSAgY2hhciAqc3RhYl9zZWNuYW1lLCAqc3RhYnN0cl9zZWNuYW1lOwotICBzdGF0aWMgY2hhciAqc2F2ZWRfc2VjbmFtZSwgKnNhdmVkX3N0cnNlY25hbWU7Ci0KLSAgLyogQEAgTUVNT1JZIExFQUs6IFRoaXMgYWxsb2NhdGVzIGEgY29weSBvZiB0aGUgc3RyaW5nLCBidXQgaW4gbW9zdAotICAgICBjYXNlcyBpdCB3aWxsIGJlIHRoZSBzYW1lIHN0cmluZywgc28gd2UgY291bGQgcmVsZWFzZSB0aGUgc3RvcmFnZQotICAgICBiYWNrIHRvIHRoZSBvYnN0YWNrIGl0IGNhbWUgZnJvbS4gICovCi0gIHN0YWJfc2VjbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuZ3RoKTsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImNvbW1hIG1pc3NpbmcgaW4gLnhzdGFicyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFRvIGdldCB0aGUgbmFtZSBvZiB0aGUgc3RhYiBzdHJpbmcgc2VjdGlvbiwgc2ltcGx5IGFkZCAic3RyIiB0bwotICAgICB0aGUgc3RhYiBzZWN0aW9uIG5hbWUuICAqLwotICBpZiAoc2F2ZWRfc2VjbmFtZSA9PSAwIHx8IHN0cmNtcCAoc2F2ZWRfc2VjbmFtZSwgc3RhYl9zZWNuYW1lKSkKLSAgICB7Ci0gICAgICBzdGFic3RyX3NlY25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHN0YWJfc2VjbmFtZSkgKyA0KTsKLSAgICAgIHN0cmNweSAoc3RhYnN0cl9zZWNuYW1lLCBzdGFiX3NlY25hbWUpOwotICAgICAgc3RyY2F0IChzdGFic3RyX3NlY25hbWUsICJzdHIiKTsKLSAgICAgIGlmIChzYXZlZF9zZWNuYW1lKQotCXsKLQkgIGZyZWUgKHNhdmVkX3NlY25hbWUpOwotCSAgZnJlZSAoc2F2ZWRfc3Ryc2VjbmFtZSk7Ci0JfQotICAgICAgc2F2ZWRfc2VjbmFtZSA9IHN0YWJfc2VjbmFtZTsKLSAgICAgIHNhdmVkX3N0cnNlY25hbWUgPSBzdGFic3RyX3NlY25hbWU7Ci0gICAgfQotICBzX3N0YWJfZ2VuZXJpYyAod2hhdCwgc2F2ZWRfc2VjbmFtZSwgc2F2ZWRfc3Ryc2VjbmFtZSk7Ci19Ci0KLSNpZmRlZiBTX1NFVF9ERVNDCi0KLS8qIEZyb2IgaW52ZW50ZWQgYXQgUk1TJyByZXF1ZXN0LiBTZXQgdGhlIG5fZGVzYyBvZiBhIHN5bWJvbC4gICovCi0KLXZvaWQgCi1zX2Rlc2MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgdGVtcDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgKnAgPSAwOwotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgICpwID0gYzsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBTX1NFVF9ERVNDIChzeW1ib2xQLCB0ZW1wKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfZGVzYygpICovCi0KLSNlbmRpZiAvKiBkZWZpbmVkIChTX1NFVF9ERVNDKSAqLwotCi0vKiBHZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gZGVub3RlIHRoZSBtYWluIHNvdXJjZSBmaWxlLiAgKi8KLQotdm9pZAotc3RhYnNfZ2VuZXJhdGVfYXNtX2ZpbGUgKCkKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmVubzsKLQotICBhc193aGVyZSAoJmZpbGUsICZsaW5lbm8pOwotICBnZW5lcmF0ZV9hc21fZmlsZSAoTl9TTywgZmlsZSk7Ci19Ci0KLS8qIEdlbmVyYXRlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBkZW5vdGUgdGhlIHNvdXJjZSBmaWxlLgotICAgVFlQRSBpcyBvbmUgb2YgTl9TTywgTl9TT0wuICAqLwotCi1zdGF0aWMgdm9pZAotZ2VuZXJhdGVfYXNtX2ZpbGUgKHR5cGUsIGZpbGUpCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpmaWxlOwotewotICBzdGF0aWMgY2hhciAqbGFzdF9maWxlOwotICBzdGF0aWMgaW50IGxhYmVsX2NvdW50OwotICBjaGFyICpob2xkOwotICBjaGFyIGJ1ZlsxMDBdOwotICBjaGFyIHN5bVszMF07Ci0KLSAgLyogUmF0aGVyIHRoYW4gdHJ5IHRvIGRvIHRoaXMgaW4gc29tZSBlZmZpY2llbnQgZmFzaGlvbiwgd2UganVzdAotICAgICBnZW5lcmF0ZSBhIHN0cmluZyBhbmQgdGhlbiBwYXJzZSBpdCBhZ2Fpbi4gIFRoYXQgbGV0cyB1cyB1c2UgdGhlCi0gICAgIGV4aXN0aW5nIHN0YWJzIGhvb2ssIHdoaWNoIGV4cGVjdCB0byBzZWUgYSBzdHJpbmcsIHJhdGhlciB0aGFuCi0gICAgIGludmVudGluZyBuZXcgb25lcy4gICovCi0KLSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAobGFzdF9maWxlID09IE5VTEwKLSAgICAgIHx8IHN0cmNtcCAobGFzdF9maWxlLCBmaWxlKSAhPSAwKQotICAgIHsKLSAgICAgIHNwcmludGYgKHN5bSwgIiVzRiVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCk7Ci0gICAgICArK2xhYmVsX2NvdW50OwotCi0gICAgICBzcHJpbnRmIChidWYsICJcIiVzXCIsJWQsMCwwLCVzXG4iLCBmaWxlLCB0eXBlLCBzeW0pOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gYnVmOwotICAgICAgc19zdGFiICgncycpOwotICAgICAgY29sb24gKHN5bSk7Ci0KLSAgICAgIGlmIChsYXN0X2ZpbGUgIT0gTlVMTCkKLQlmcmVlIChsYXN0X2ZpbGUpOwotICAgICAgbGFzdF9maWxlID0geHN0cmR1cCAoZmlsZSk7Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci19Ci0KLS8qIEdlbmVyYXRlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgbGluZS4gIFRoaXMgaXMKLSAgIHVzZWQgdG8gcHJvZHVjZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmxlciBmaWxlLiAgKi8KLQotdm9pZAotc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyAoKQotewotICBzdGF0aWMgaW50IGxhYmVsX2NvdW50OwotICBjaGFyICpob2xkOwotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZW5vOwotICBjaGFyICpidWY7Ci0gIGNoYXIgc3ltWzMwXTsKLQotICAvKiBSYXRoZXIgdGhhbiB0cnkgdG8gZG8gdGhpcyBpbiBzb21lIGVmZmljaWVudCBmYXNoaW9uLCB3ZSBqdXN0Ci0gICAgIGdlbmVyYXRlIGEgc3RyaW5nIGFuZCB0aGVuIHBhcnNlIGl0IGFnYWluLiAgVGhhdCBsZXRzIHVzIHVzZSB0aGUKLSAgICAgZXhpc3Rpbmcgc3RhYnMgaG9vaywgd2hpY2ggZXhwZWN0IHRvIHNlZSBhIHN0cmluZywgcmF0aGVyIHRoYW4KLSAgICAgaW52ZW50aW5nIG5ldyBvbmVzLiAgKi8KLQotICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmVubyk7Ci0KLSAgZ2VuZXJhdGVfYXNtX2ZpbGUgKE5fU09MLCBmaWxlKTsKLQotICBzcHJpbnRmIChzeW0sICIlc0wlZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQpOwotICArK2xhYmVsX2NvdW50OwotCi0gIGlmIChpbl9kb3RfZnVuY19wKQotICAgIHsKLSAgICAgIGJ1ZiA9IChjaGFyICopIGFsbG9jYSAoMTAwICsgc3RybGVuIChjdXJyZW50X2Z1bmN0aW9uX2xhYmVsKSk7Ci0gICAgICBzcHJpbnRmIChidWYsICIlZCwwLCVkLCVzLSVzXG4iLCBOX1NMSU5FLCBsaW5lbm8sCi0JICAgICAgIHN5bSwgY3VycmVudF9mdW5jdGlvbl9sYWJlbCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYnVmID0gKGNoYXIgKikgYWxsb2NhICgxMDApOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJWQsMCwlZCwlc1xuIiwgTl9TTElORSwgbGluZW5vLCBzeW0pOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gYnVmOwotICBzX3N0YWIgKCduJyk7Ci0gIGNvbG9uIChzeW0pOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci19Ci0KLS8qIEVtaXQgYSBmdW5jdGlvbiBzdGFiLgotICAgQWxsIGFzc2VtYmxlciBmdW5jdGlvbnMgYXJlIGFzc3VtZWQgdG8gaGF2ZSByZXR1cm4gdHlwZSBgdm9pZCcuICAqLwotCi12b2lkCi1zdGFic19nZW5lcmF0ZV9hc21fZnVuYyAoZnVuY25hbWUsIHN0YXJ0bGFibmFtZSkKLSAgICAgY29uc3QgY2hhciAqZnVuY25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0bGFibmFtZTsKLXsKLSAgc3RhdGljIGludCB2b2lkX2VtaXR0ZWRfcDsKLSAgY2hhciAqaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqYnVmOwotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZW5vOwotCi0gIGlmICghIHZvaWRfZW1pdHRlZF9wKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9ICJcInZvaWQ6dDE9MVwiLDEyOCwwLDAsMCI7Ci0gICAgICBzX3N0YWIgKCdzJyk7Ci0gICAgICB2b2lkX2VtaXR0ZWRfcCA9IDE7Ci0gICAgfQotCi0gIGFzX3doZXJlICgmZmlsZSwgJmxpbmVubyk7Ci0gIGFzcHJpbnRmICgmYnVmLCAiXCIlczpGMVwiLCVkLDAsJWQsJXMiLAotCSAgICBmdW5jbmFtZSwgTl9GVU4sIGxpbmVubyArIDEsIHN0YXJ0bGFibmFtZSk7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGJ1ZjsKLSAgc19zdGFiICgncycpOwotICBmcmVlIChidWYpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0gIGN1cnJlbnRfZnVuY3Rpb25fbGFiZWwgPSB4c3RyZHVwIChzdGFydGxhYm5hbWUpOwotICBpbl9kb3RfZnVuY19wID0gMTsKLX0KLQotLyogRW1pdCBhIHN0YWIgdG8gcmVjb3JkIHRoZSBlbmQgb2YgYSBmdW5jdGlvbi4gICovCi0KLXZvaWQKLXN0YWJzX2dlbmVyYXRlX2FzbV9lbmRmdW5jIChmdW5jbmFtZSwgc3RhcnRsYWJuYW1lKQotICAgICBjb25zdCBjaGFyICpmdW5jbmFtZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpzdGFydGxhYm5hbWU7Ci17Ci0gIHN0YXRpYyBpbnQgbGFiZWxfY291bnQ7Ci0gIGNoYXIgKmhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciBzeW1bMzBdOwotCi0gIHNwcmludGYgKHN5bSwgIiVzZW5kZnVuYyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCk7Ci0gICsrbGFiZWxfY291bnQ7Ci0gIGNvbG9uIChzeW0pOwotCi0gIGFzcHJpbnRmICgmYnVmLCAiXCJcIiwlZCwwLDAsJXMtJXMiLCBOX0ZVTiwgc3ltLCBzdGFydGxhYm5hbWUpOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWY7Ci0gIHNfc3RhYiAoJ3MnKTsKLSAgZnJlZSAoYnVmKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotICBpbl9kb3RfZnVuY19wID0gMDsKLSAgY3VycmVudF9mdW5jdGlvbl9sYWJlbCA9IE5VTEw7Ci19CmRpZmYgLS1naXQgYS9nYXMvc3RhbXAtaC5pbiBiL2dhcy9zdGFtcC1oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg4ZjcwLi4wMDAwMDAwCi0tLSBhL2dhcy9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9nYXMvc3RydWMtc3ltYm9sLmggYi9nYXMvc3RydWMtc3ltYm9sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NzM1NjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3N0cnVjLXN5bWJvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qIHN0cnVjdF9zeW1ib2wuaCAtIEludGVybmFsIHN5bWJvbCBzdHJ1Y3R1cmUKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9fc3RydWNfc3ltYm9sX2hfXwotI2RlZmluZSBfX3N0cnVjX3N5bWJvbF9oX18KLQotLyogVGhlIGluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgc3ltYm9sLiAgTm90ZSB0aGF0IHRoZSBzeW1ib2wgdGFibGUKLSAgIGhvbGRzIHBvaW50ZXJzIGJvdGggdG8gdGhpcyBhbmQgdG8gbG9jYWxfc3ltYm9sIHN0cnVjdHVyZXMuICBTZWUKLSAgIGJlbG93LiAgKi8KLQotc3RydWN0IHN5bWJvbAotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogQkZEIHN5bWJvbCAqLwotICBhc3ltYm9sICpic3ltOwotI2Vsc2UKLSAgLyogVGhlICg0LW9yaWdpbikgcG9zaXRpb24gb2Ygc3lfbmFtZSBpbiB0aGUgc3ltYm9sIHRhYmxlIG9mIHRoZSBvYmplY3QKLSAgICAgZmlsZS4gIFRoaXMgd2lsbCBiZSAwIGZvciAobmFtZWxlc3MpIC5zdGFiZCBzeW1ib2xzLgotCi0gICAgIE5vdCB1c2VkIHVudGlsIHdyaXRlX29iamVjdF9maWxlKCkgdGltZS4gKi8KLSAgdW5zaWduZWQgbG9uZyBzeV9uYW1lX29mZnNldDsKLQotICAvKiBXaGF0IHdlIHdyaXRlIGluIC5vIGZpbGUgKGlmIHBlcm1pdHRlZCkuICAqLwotICBvYmpfc3ltYm9sX3R5cGUgc3lfc3ltYm9sOwotCi0gIC8qIFRoZSAyNCBiaXQgc3ltYm9sIG51bWJlci4gIFN5bWJvbCBudW1iZXJzIHN0YXJ0IGF0IDAgYW5kIGFyZSB1bnNpZ25lZC4gKi8KLSAgbG9uZyBzeV9udW1iZXI7Ci0jZW5kaWYKLQotICAvKiBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gICovCi0gIGV4cHJlc3Npb25TIHN5X3ZhbHVlOwotCi0gIC8qIEZvcndhcmRzIGFuZCAob3B0aW9uYWxseSkgYmFja3dhcmRzIGNoYWluIHBvaW50ZXJzLiAgKi8KLSAgc3RydWN0IHN5bWJvbCAqc3lfbmV4dDsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gIHN0cnVjdCBzeW1ib2wgKnN5X3ByZXZpb3VzOwotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLQotICAvKiBQb2ludGVyIHRvIHRoZSBmcmFnIHRoaXMgc3ltYm9sIGlzIGF0dGFjaGVkIHRvLCBpZiBhbnkuCi0gICAgIE90aGVyd2lzZSwgTlVMTC4gICovCi0gIHN0cnVjdCBmcmFnICpzeV9mcmFnOwotCi0gIHVuc2lnbmVkIGludCB3cml0dGVuIDogMTsKLSAgLyogV2hldGhlciBzeW1ib2wgdmFsdWUgaGFzIGJlZW4gY29tcGxldGVseSByZXNvbHZlZCAodXNlZCBkdXJpbmcKLSAgICAgZmluYWwgcGFzcyBvdmVyIHN5bWJvbCB0YWJsZSkuICAqLwotICB1bnNpZ25lZCBpbnQgc3lfcmVzb2x2ZWQgOiAxOwotICAvKiBXaGV0aGVyIHRoZSBzeW1ib2wgdmFsdWUgaXMgY3VycmVudGx5IGJlaW5nIHJlc29sdmVkICh1c2VkIHRvCi0gICAgIGRldGVjdCBsb29wcyBpbiBzeW1ib2wgZGVwZW5kZW5jaWVzKS4gICovCi0gIHVuc2lnbmVkIGludCBzeV9yZXNvbHZpbmcgOiAxOwotICAvKiBXaGV0aGVyIHRoZSBzeW1ib2wgdmFsdWUgaXMgdXNlZCBpbiBhIHJlbG9jLiAgVGhpcyBpcyB1c2VkIHRvCi0gICAgIGVuc3VyZSB0aGF0IHN5bWJvbHMgdXNlZCBpbiByZWxvY3MgYXJlIHdyaXR0ZW4gb3V0LCBldmVuIGlmIHRoZXkKLSAgICAgYXJlIGxvY2FsIGFuZCB3b3VsZCBvdGhlcndpc2Ugbm90IGJlLiAgKi8KLSAgdW5zaWduZWQgaW50IHN5X3VzZWRfaW5fcmVsb2MgOiAxOwotCi0gIC8qIFdoZXRoZXIgdGhlIHN5bWJvbCBpcyB1c2VkIGFzIGFuIG9wZXJhbmQgb3IgaW4gYW4gZXhwcmVzc2lvbi4gIAotICAgICBOT1RFOiAgTm90IGFsbCB0aGUgYmFja2VuZHMga2VlcCB0aGlzIGluZm9ybWF0aW9uIGFjY3VyYXRlOwotICAgICBiYWNrZW5kcyB3aGljaCB1c2UgdGhpcyBiaXQgYXJlIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIGl0IHdoZW4KLSAgICAgYSBzeW1ib2wgaXMgdXNlZCBpbiBiYWNrZW5kIHJvdXRpbmVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHN5X3VzZWQgOiAxOwotCi0gIC8qIFRoaXMgaXMgc2V0IGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhbiBNUkkgY29tbW9uIHNlY3Rpb24uCi0gICAgIFdlIGhhbmRsZSBzdWNoIHNlY3Rpb25zIGFzIHNpbmdsZSBjb21tb24gc3ltYm9scywgc28gc3ltYm9scwotICAgICBkZWZpbmVkIHdpdGhpbiB0aGVtIG11c3QgYmUgdHJlYXRlZCBzcGVjaWFsbHkgYnkgdGhlIHJlbG9jYXRpb24KLSAgICAgcm91dGluZXMuICAqLwotICB1bnNpZ25lZCBpbnQgc3lfbXJpX2NvbW1vbiA6IDE7Ci0KLSNpZmRlZiBPQkpfU1lNRklFTERfVFlQRQotICBPQkpfU1lNRklFTERfVFlQRSBzeV9vYmo7Ci0jZW5kaWYKLQotI2lmZGVmIFRDX1NZTUZJRUxEX1RZUEUKLSAgVENfU1lNRklFTERfVFlQRSBzeV90YzsKLSNlbmRpZgotfTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogQSBwb2ludGVyIGluIHRoZSBzeW1ib2wgbWF5IHBvaW50IHRvIGVpdGhlciBhIGNvbXBsZXRlIHN5bWJvbAotICAgKHN0cnVjdCBzeW1ib2wgYWJvdmUpIG9yIHRvIGEgbG9jYWwgc3ltYm9sIChzdHJ1Y3QgbG9jYWxfc3ltYm9sCi0gICBkZWZpbmVkIGhlcmUpLiAgVGhlIHN5bWJvbCBjb2RlIGNhbiBkZXRlY3QgdGhlIGNhc2UgYnkgZXhhbWluaW5nCi0gICB0aGUgZmlyc3QgZmllbGQuICBJdCBpcyBhbHdheXMgTlVMTCBmb3IgYSBsb2NhbCBzeW1ib2wuCi0KLSAgIFdlIGRvIHRoaXMgYmVjYXVzZSB3ZSBvcmRpbmFyaWx5IG9ubHkgbmVlZCBhIHNtYWxsIGFtb3VudCBvZgotICAgaW5mb3JtYXRpb24gZm9yIGEgbG9jYWwgc3ltYm9sLiAgVGhlIHN5bWJvbCB0YWJsZSB0YWtlcyB1cCBhIGxvdCBvZgotICAgc3BhY2UsIGFuZCBzdG9yaW5nIGxlc3MgaW5mb3JtYXRpb24gZm9yIGEgbG9jYWwgc3ltYm9sIGNhbiBtYWtlIGEKLSAgIGJpZyBkaWZmZXJlbmNlIGluIGFzc2VtYmxlciBtZW1vcnkgdXNhZ2Ugd2hlbiBhc3NlbWJsaW5nIGEgbGFyZ2UKLSAgIGZpbGUuICAqLwotCi1zdHJ1Y3QgbG9jYWxfc3ltYm9sCi17Ci0gIC8qIFRoaXMgcG9pbnRlciBpcyBhbHdheXMgTlVMTCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSBsb2NhbAotICAgICBzeW1ib2wuICAqLwotICBhc3ltYm9sICpsc3lfbWFya2VyOwotCi0gIC8qIFRoZSBzeW1ib2wgc2VjdGlvbi4gIFRoaXMgYWxzbyBzZXJ2ZXMgYXMgYSBmbGFnLiAgSWYgdGhpcyBpcwotICAgICByZWdfc2VjdGlvbiwgdGhlbiB0aGlzIHN5bWJvbCBoYXMgYmVlbiBjb252ZXJ0ZWQgaW50byBhIHJlZ3VsYXIKLSAgICAgc3ltYm9sLCBhbmQgc3lfc3ltIHBvaW50cyB0byBpdC4gICovCi0gIHNlZ1QgbHN5X3NlY3Rpb247Ci0KLSAgLyogVGhlIHN5bWJvbCBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbHN5X25hbWU7Ci0KLSAgLyogVGhlIHN5bWJvbCBmcmFnIG9yIHRoZSByZWFsIHN5bWJvbCwgZGVwZW5kaW5nIHVwb24gdGhlIHZhbHVlIGluCi0gICAgIHN5X3NlY3Rpb24uICBJZiB0aGUgc3ltYm9sIGhhcyBiZWVuIGZ1bGx5IHJlc29sdmVkLCBsc3lfZnJhZyBpcwotICAgICBzZXQgdG8gTlVMTC4gICovCi0gIHVuaW9uCi0gIHsKLSAgICBmcmFnUyAqbHN5X2ZyYWc7Ci0gICAgc3ltYm9sUyAqbHN5X3N5bTsKLSAgfSB1OwotCi0gIC8qIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBmcmFnLiAgKi8KLSAgdmFsdWVUIGxzeV9vZmZzZXQ7Ci19OwotCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9jb252ZXJ0ZWRfcChsKSAoKGwpLT5sc3lfc2VjdGlvbiA9PSByZWdfc2VjdGlvbikKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX21hcmtfY29udmVydGVkKGwpICgobCktPmxzeV9zZWN0aW9uID0gcmVnX3NlY3Rpb24pCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9yZXNvbHZlZF9wKGwpICgobCktPnUubHN5X2ZyYWcgPT0gTlVMTCkKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX21hcmtfcmVzb2x2ZWQobCkgKChsKS0+dS5sc3lfZnJhZyA9IE5VTEwpCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9nZXRfZnJhZyhsKSAoKGwpLT51LmxzeV9mcmFnKQotI2RlZmluZSBsb2NhbF9zeW1ib2xfc2V0X2ZyYWcobCwgZikgKChsKS0+dS5sc3lfZnJhZyA9IChmKSkKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX2dldF9yZWFsX3N5bWJvbChsKSAoKGwpLT51LmxzeV9zeW0pCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9zZXRfcmVhbF9zeW1ib2wobCwgcykgKChsKS0+dS5sc3lfc3ltID0gKHMpKQotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0jZW5kaWYgLyogX19zdHJ1Y19zeW1ib2xfaF9fICovCi0KLS8qIGVuZCBvZiBzdHJ1Yy1zeW1ib2wuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3N1YnNlZ3MuYyBiL2dhcy9zdWJzZWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYmY3MGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3N1YnNlZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDY2MyArMCwwIEBACi0vKiBzdWJzZWdzLmMgLSBzdWJzZWdtZW50cyAtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogU2VnbWVudHMgJiBzdWItc2VnbWVudHMuCi0gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi1mcmNoYWluUyAqZnJjaGFpbl9yb290LCAqZnJjaGFpbl9ub3c7Ci0KLXN0YXRpYyBzdHJ1Y3Qgb2JzdGFjayBmcmNoYWluczsKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotc2VnbWVudF9pbmZvX3R5cGUgc2VnbWVudF9pbmZvW1NFR19NQVhJTVVNX09SRElOQUxdOwotCi0jZWxzZQotLyogQ29tbWVudGVkIGluICJzdWJzZWdzLmgiLiAqLwotZnJjaGFpblMgKmRhdGEwX2ZyY2hhaW5QLCAqYnNzMF9mcmNoYWluUDsKLQotI2VuZGlmIC8qIE1BTllfU0VHTUVOVFMgKi8KLWNoYXIgY29uc3QgKmNvbnN0IHNlZ19uYW1lW10gPQotewotICAiYWJzb2x1dGUiLAotI2lmZGVmIE1BTllfU0VHTUVOVFMKLSAgImUwIiwgImUxIiwgImUyIiwgImUzIiwgImU0IiwgImU1IiwgImU2IiwgImU3IiwgImU4IiwgImU5IiwKLSAgImUxMCIsICJlMTEiLCAiZTEyIiwgImUxMyIsICJlMTQiLCAiZTE1IiwgImUxNiIsICJlMTciLCAiZTE4IiwgImUxOSIsCi0gICJlMjAiLCAiZTIxIiwgImUyMiIsICJlMjMiLCAiZTI0IiwgImUyNSIsICJlMjYiLCAiZTI3IiwgImUyOCIsICJlMjkiLAotICAiZTMwIiwgImUzMSIsICJlMzIiLCAiZTMzIiwgImUzNCIsICJlMzUiLCAiZTM2IiwgImUzNyIsICJlMzgiLCAiZTM5IiwKLSNlbHNlCi0gICJ0ZXh0IiwKLSAgImRhdGEiLAotICAiYnNzIiwKLSNlbmRpZiAvKiBNQU5ZX1NFR01FTlRTICovCi0gICJ1bmtub3duIiwKLSAgIkFTU0VNQkxFUi1JTlRFUk5BTC1MT0dJQy1FUlJPUiEiLAotICAiZXhwciIsCi0gICJkZWJ1ZyIsCi0gICJ0cmFuc2ZlcnQgdmVjdG9yIHByZWxvYWQiLAotICAidHJhbnNmZXJ0IHZlY3RvciBwb3N0bG9hZCIsCi0gICJyZWdpc3RlciIsCi0gICIiLAotfTsJCQkJLyogVXNlZCBieSBlcnJvciByZXBvcnRlcnMsIGR1bXBlcnMgZXRjLiAqLwotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBHYXMgc2VnbWVudCBpbmZvcm1hdGlvbiBmb3IgYmZkX2Fic19zZWN0aW9uX3B0ciBhbmQKLSAgIGJmZF91bmRfc2VjdGlvbl9wdHIuICAqLwotc3RhdGljIHNlZ21lbnRfaW5mb190eXBlICphYnNfc2VnX2luZm87Ci1zdGF0aWMgc2VnbWVudF9pbmZvX3R5cGUgKnVuZF9zZWdfaW5mbzsKLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotc3RhdGljIHZvaWQgc3Vic2VnX3NldF9yZXN0IFBBUkFNUyAoKHNlZ1QsIHN1YnNlZ1QpKTsKLQotc3RhdGljIGZyYWdTIGR1bW15X2ZyYWc7Ci0KLXN0YXRpYyBmcmNoYWluUyBhYnNvbHV0ZV9mcmNoYWluOwotDAotdm9pZAotc3Vic2Vnc19iZWdpbiAoKQotewotICAvKiBDaGVjayB0YWJsZShzKSBzZWdfbmFtZVtdLCBzZWdfTl9UWVBFW10gaXMgaW4gY29ycmVjdCBvcmRlciAqLwotI2lmICFkZWZpbmVkIChNQU5ZX1NFR01FTlRTKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAga25vdyAoU0VHX0FCU09MVVRFID09IDApOwotICBrbm93IChTRUdfVEVYVCA9PSAxKTsKLSAga25vdyAoU0VHX0RBVEEgPT0gMik7Ci0gIGtub3cgKFNFR19CU1MgPT0gMyk7Ci0gIGtub3cgKFNFR19VTktOT1dOID09IDQpOwotICBrbm93IChTRUdfR09PRiA9PSA1KTsKLSAga25vdyAoU0VHX0VYUFIgPT0gNik7Ci0gIGtub3cgKFNFR19ERUJVRyA9PSA3KTsKLSAga25vdyAoU0VHX05UViA9PSA4KTsKLSAga25vdyAoU0VHX1BUViA9PSA5KTsKLSAga25vdyAoU0VHX1JFR0lTVEVSID09IDEwKTsKLSAga25vdyAoU0VHX01BWElNVU1fT1JESU5BTCA9PSBTRUdfUkVHSVNURVIpOwotI2VuZGlmCi0KLSAgb2JzdGFja19iZWdpbiAoJmZyY2hhaW5zLCBjaHVua3NpemUpOwotI2lmIF9fR05VQ19fID49IDIKLSAgb2JzdGFja19hbGlnbm1lbnRfbWFzayAoJmZyY2hhaW5zKSA9IF9fYWxpZ25vZl9fIChmcmNoYWluUykgLSAxOwotI2VuZGlmCi0KLSAgZnJjaGFpbl9yb290ID0gTlVMTDsKLSAgZnJjaGFpbl9ub3cgPSBOVUxMOwkJLyogV2FybiBuZXdfc3Vic2VnKCkgdGhhdCB3ZSBhcmUgYm9vdGluZy4gKi8KLQotICBmcmFnX25vdyA9ICZkdW1teV9mcmFnOwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgbm93X3N1YnNlZyA9IDQyOwkJLyogTGllIGZvciAxc3QgY2FsbCB0byBzdWJzZWdfbmV3LiAqLwotI2lmZGVmIE1BTllfU0VHTUVOVFMKLSAgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgICB7Ci0Jc3Vic2VnX3NldCAoaSwgMCk7Ci0Jc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0gICAgICB9Ci0gIH0KLSNlbHNlCi0gIHN1YnNlZ19zZXQgKFNFR19EQVRBLCAwKTsJLyogLmRhdGEgMCAqLwotICBkYXRhMF9mcmNoYWluUCA9IGZyY2hhaW5fbm93OwotCi0gIHN1YnNlZ19zZXQgKFNFR19CU1MsIDApOwotICBic3MwX2ZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0KLSNlbmRpZiAvKiAhIE1BTllfU0VHTUVOVFMgKi8KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfc2VnID0gYWJzb2x1dGVfc2VjdGlvbjsKLSAgYWJzb2x1dGVfZnJjaGFpbi5mcmNoX3N1YnNlZyA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBhYnNvbHV0ZV9mcmNoYWluLmZpeF9yb290ID0gYWJzb2x1dGVfZnJjaGFpbi5maXhfdGFpbCA9IDA7Ci0jZW5kaWYKLSAgYWJzb2x1dGVfZnJjaGFpbi5mcmNoX2ZyYWdfbm93ID0gJnplcm9fYWRkcmVzc19mcmFnOwotICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfcm9vdCA9IGFic29sdXRlX2ZyY2hhaW4uZnJjaF9sYXN0ID0gJnplcm9fYWRkcmVzc19mcmFnOwotfQotDAotLyoKLSAqCQkJc3Vic2VnX2NoYW5nZSgpCi0gKgotICogQ2hhbmdlIHRoZSBzdWJzZWdtZW50IHdlIGFyZSBpbiwgQlVUIERPIE5PVCBNQUtFIEEgTkVXIEZSQUcgZm9yIHRoZQotICogc3Vic2VnbWVudC4gSWYgd2UgYXJlIGFscmVhZHkgaW4gdGhlIGNvcnJlY3Qgc3Vic2VnbWVudCwgY2hhbmdlIG5vdGhpbmcuCi0gKiBUaGlzIGlzIHVzZWQgZWcgYXMgYSB3b3JrZXIgZm9yIHN1YnNlZ19zZXQgW3doaWNoIGRvZXMgbWFrZSBhIG5ldyBmcmFnX25vd10KLSAqIGFuZCBmb3IgY2hhbmdpbmcgc2VnbWVudHMgYWZ0ZXIgd2UgaGF2ZSByZWFkIHRoZSBzb3VyY2UuIFdlIGNvbnN0cnVjdCBlZwotICogZml4U3MgZXZlbiBhZnRlciB0aGUgc291cmNlIGZpbGUgaXMgcmVhZCwgc28gd2UgZG8gaGF2ZSB0byBrZWVwIHRoZQotICogc2VnbWVudCBjb250ZXh0IGNvcnJlY3QuCi0gKi8KLXZvaWQKLXN1YnNlZ19jaGFuZ2UgKHNlZywgc3Vic2VnKQotICAgICByZWdpc3RlciBzZWdUIHNlZzsKLSAgICAgcmVnaXN0ZXIgaW50IHN1YnNlZzsKLXsKLSAgbm93X3NlZyA9IHNlZzsKLSAgbm93X3N1YnNlZyA9IHN1YnNlZzsKLQotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHJldHVybjsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgewotICAgIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotICAgIHNlZ2luZm8gPSAoc2VnbWVudF9pbmZvX3R5cGUgKikgYmZkX2dldF9zZWN0aW9uX3VzZXJkYXRhIChzdGRvdXRwdXQsIHNlZyk7Ci0gICAgaWYgKCEgc2VnaW5mbykKLSAgICAgIHsKLQlzZWdpbmZvID0gKHNlZ21lbnRfaW5mb190eXBlICopIHhtYWxsb2MgKHNpemVvZiAoKnNlZ2luZm8pKTsKLQltZW1zZXQgKChQVFIpIHNlZ2luZm8sIDAsIHNpemVvZiAoKnNlZ2luZm8pKTsKLQlzZWdpbmZvLT5maXhfcm9vdCA9IE5VTEw7Ci0Jc2VnaW5mby0+Zml4X3RhaWwgPSBOVUxMOwotCXNlZ2luZm8tPmJmZF9zZWN0aW9uID0gc2VnOwotCXNlZ2luZm8tPnN5bSA9IDA7Ci0JaWYgKHNlZyA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotCSAgYWJzX3NlZ19pbmZvID0gc2VnaW5mbzsKLQllbHNlIGlmIChzZWcgPT0gYmZkX3VuZF9zZWN0aW9uX3B0cikKLQkgIHVuZF9zZWdfaW5mbyA9IHNlZ2luZm87Ci0JZWxzZQotCSAgYmZkX3NldF9zZWN0aW9uX3VzZXJkYXRhIChzdGRvdXRwdXQsIHNlZywgKFBUUikgc2VnaW5mbyk7Ci0gICAgICB9Ci0gIH0KLSNlbHNlCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotICBzZWdfZml4X3Jvb3RQID0gJnNlZ21lbnRfaW5mb1tzZWddLmZpeF9yb290OwotICBzZWdfZml4X3RhaWxQID0gJnNlZ21lbnRfaW5mb1tzZWddLmZpeF90YWlsOwotI2Vsc2UKLSAgaWYgKHNlZyA9PSBTRUdfREFUQSkKLSAgICB7Ci0gICAgICBzZWdfZml4X3Jvb3RQID0gJmRhdGFfZml4X3Jvb3Q7Ci0gICAgICBzZWdfZml4X3RhaWxQID0gJmRhdGFfZml4X3RhaWw7Ci0gICAgfQotICBlbHNlIGlmIChzZWcgPT0gU0VHX1RFWFQpCi0gICAgewotICAgICAgc2VnX2ZpeF9yb290UCA9ICZ0ZXh0X2ZpeF9yb290OwotICAgICAgc2VnX2ZpeF90YWlsUCA9ICZ0ZXh0X2ZpeF90YWlsOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGtub3cgKHNlZyA9PSBTRUdfQlNTKTsKLSAgICAgIHNlZ19maXhfcm9vdFAgPSAmYnNzX2ZpeF9yb290OwotICAgICAgc2VnX2ZpeF90YWlsUCA9ICZic3NfZml4X3RhaWw7Ci0gICAgfQotCi0jZW5kaWYKLSNlbmRpZgotfQotDAotc3RhdGljIHZvaWQKLXN1YnNlZ19zZXRfcmVzdCAoc2VnLCBzdWJzZWcpCi0gICAgIHNlZ1Qgc2VnOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgcmVnaXN0ZXIgZnJjaGFpblMgKmZyY1A7CS8qIGNyYXdsIGZyY2hhaW4gY2hhaW4gKi8KLSAgcmVnaXN0ZXIgZnJjaGFpblMgKipsYXN0UFA7CS8qIGFkZHJlc3Mgb2YgbGFzdCBwb2ludGVyICovCi0gIGZyY2hhaW5TICpuZXdQOwkJLyogYWRkcmVzcyBvZiBuZXcgZnJjaGFpbiAqLwotCi0gIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLQotICBpZiAoZnJhZ19ub3cgJiYgZnJjaGFpbl9ub3cpCi0gICAgZnJjaGFpbl9ub3ctPmZyY2hfZnJhZ19ub3cgPSBmcmFnX25vdzsKLQotICBhc3NlcnQgKGZyY2hhaW5fbm93ID09IDAKLQkgIHx8IG5vd19zZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkgIHx8IG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbgotCSAgfHwgZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7Ci0KLSAgc3Vic2VnX2NoYW5nZSAoc2VnLCAoaW50KSBzdWJzZWcpOwotCi0gIGlmIChzZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBmcmNoYWluX25vdyA9ICZhYnNvbHV0ZV9mcmNoYWluOwotICAgICAgZnJhZ19ub3cgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFzc2VydCAoZnJjaGFpbl9ub3cgPT0gMAotCSAgfHwgbm93X3NlZyA9PSB1bmRlZmluZWRfc2VjdGlvbgotCSAgfHwgZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7Ci0KLSAgLyoKLSAgICogQXR0ZW1wdCB0byBmaW5kIG9yIG1ha2UgYSBmcmNoYWluIGZvciB0aGF0IHN1YiBzZWcuCi0gICAqIENyYXdsIGFsb25nIGNoYWluIG9mIGZyY2hhaW5TcywgYmVnaW5zIEAgZnJjaGFpbl9yb290LgotICAgKiBJZiB3ZSBuZWVkIHRvIG1ha2UgYSBmcmNoYWluUywgbGluayBpdCBpbnRvIGNvcnJlY3QKLSAgICogcG9zaXRpb24gb2YgY2hhaW4gcm9vdGVkIGluIGZyY2hhaW5fcm9vdC4KLSAgICovCi0gIGZvciAoZnJjUCA9ICoobGFzdFBQID0gJmZyY2hhaW5fcm9vdCk7Ci0gICAgICAgZnJjUCAmJiBmcmNQLT5mcmNoX3NlZyA8PSBzZWc7Ci0gICAgICAgZnJjUCA9ICoobGFzdFBQID0gJmZyY1AtPmZyY2hfbmV4dCkpCi0gICAgewotICAgICAgaWYgKGZyY1AtPmZyY2hfc2VnID09IHNlZwotCSAgJiYgZnJjUC0+ZnJjaF9zdWJzZWcgPj0gc3Vic2VnKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIC8qCi0gICAqIGZyY1A6CQlBZGRyZXNzIG9mIHRoZSAxc3QgZnJjaGFpblMgaW4gY29ycmVjdCBzZWdtZW50IHdpdGgKLSAgICoJCWZyY2hfc3Vic2VnID49IHN1YnNlZy4KLSAgICoJCVdlIHdhbnQgdG8gZWl0aGVyIHVzZSB0aGlzIGZyY2hhaW5TLCBvciB3ZSB3YW50Ci0gICAqCQl0byBpbnNlcnQgYSBuZXcgZnJjaGFpblMganVzdCBiZWZvcmUgaXQuCi0gICAqCi0gICAqCQlJZiBmcmNQPT1OVUxMLCB0aGVuIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbgotICAgKgkJb2YgZnJjaGFpblMtcy4gQSBOVUxMIGZyY1AgbWVhbnMgd2UgZmVsbCBvZmYgdGhlIGVuZAotICAgKgkJb2YgdGhlIGNoYWluIGxvb2tpbmcgZm9yIGEKLSAgICoJCWZyY2hfc3Vic2VnID49IHN1YnNlZywgc28gd2UKLSAgICoJCW11c3QgbWFrZSBhIG5ldyBmcmNoYWluUy4KLSAgICoKLSAgICoJCUlmIHdlIGV2ZXIgbWFpbnRhaW4gYSBwb2ludGVyIHRvCi0gICAqCQl0aGUgbGFzdCBmcmNoYWluUyBpbiB0aGUgY2hhaW4sIHdlIGNoYW5nZSB0aGF0IHBvaW50ZXIKLSAgICoJCU9OTFkgd2hlbiBmcmNQPT1OVUxMLgotICAgKgotICAgKiBsYXN0UFA6CUFkZHJlc3Mgb2YgdGhlIHBvaW50ZXIgd2l0aCB2YWx1ZSBmcmNQOwotICAgKgkJTmV2ZXIgTlVMTC4KLSAgICoJCU1heSBwb2ludCB0byBmcmNoYWluX3Jvb3QuCi0gICAqCi0gICAqLwotICBpZiAoIWZyY1AKLSAgICAgIHx8IChmcmNQLT5mcmNoX3NlZyA+IHNlZwotCSAgfHwgZnJjUC0+ZnJjaF9zdWJzZWcgPiBzdWJzZWcpKQkvKiBLaW5reSBsb2dpYyBvbmx5IHdvcmtzIHdpdGggMiBzZWdtZW50cy4gKi8KLSAgICB7Ci0gICAgICAvKgotICAgICAgICogVGhpcyBzaG91bGQgYmUgdGhlIG9ubHkgY29kZSB0aGF0IGNyZWF0ZXMgYSBmcmNoYWluUy4KLSAgICAgICAqLwotICAgICAgbmV3UCA9IChmcmNoYWluUyAqKSBvYnN0YWNrX2FsbG9jICgmZnJjaGFpbnMsIHNpemVvZiAoZnJjaGFpblMpKTsKLSAgICAgIG5ld1AtPmZyY2hfc3Vic2VnID0gc3Vic2VnOwotICAgICAgbmV3UC0+ZnJjaF9zZWcgPSBzZWc7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgbmV3UC0+Zml4X3Jvb3QgPSBOVUxMOwotICAgICAgbmV3UC0+Zml4X3RhaWwgPSBOVUxMOwotI2VuZGlmCi0gICAgICBvYnN0YWNrX2JlZ2luICgmbmV3UC0+ZnJjaF9vYnN0YWNrLCBjaHVua3NpemUpOwotI2lmIF9fR05VQ19fID49IDIKLSAgICAgIG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKCZuZXdQLT5mcmNoX29ic3RhY2spID0gX19hbGlnbm9mX18gKGZyYWdTKSAtIDE7Ci0jZW5kaWYKLSAgICAgIG5ld1AtPmZyY2hfZnJhZ19ub3cgPSBmcmFnX2FsbG9jICgmbmV3UC0+ZnJjaF9vYnN0YWNrKTsKLSAgICAgIG5ld1AtPmZyY2hfZnJhZ19ub3ctPmZyX3R5cGUgPSByc19maWxsOwotCi0gICAgICBuZXdQLT5mcmNoX3Jvb3QgPSBuZXdQLT5mcmNoX2xhc3QgPSBuZXdQLT5mcmNoX2ZyYWdfbm93OwotCi0gICAgICAqbGFzdFBQID0gbmV3UDsKLSAgICAgIG5ld1AtPmZyY2hfbmV4dCA9IGZyY1A7CS8qIHBlcmhhcHMgTlVMTCAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgewotCXNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotCXNlZ2luZm8gPSBzZWdfaW5mbyAoc2VnKTsKLQlpZiAoc2VnaW5mbyAmJiBzZWdpbmZvLT5mcmNoYWluUCA9PSBmcmNQKQotCSAgc2VnaW5mby0+ZnJjaGFpblAgPSBuZXdQOwotICAgICAgfQotI2VuZGlmCi0gICAgICAKLSAgICAgIGZyY1AgPSBuZXdQOwotICAgIH0KLSAgLyoKLSAgICogSGVyZSB3aXRoIGZyY1AgcG9pbnRpbmcgdG8gdGhlIGZyY2hhaW5TIGZvciBzdWJzZWcuCi0gICAqLwotICBmcmNoYWluX25vdyA9IGZyY1A7Ci0gIGZyYWdfbm93ID0gZnJjUC0+ZnJjaF9mcmFnX25vdzsKLQotICBhc3NlcnQgKGZyY2hhaW5fbm93LT5mcmNoX2xhc3QgPT0gZnJhZ19ub3cpOwotfQotCi0vKgotICoJCQlzdWJzZWdfc2V0KHNlZ1QsIHN1YnNlZ1QpCi0gKgotICogSWYgeW91IGF0dGVtcHQgdG8gY2hhbmdlIHRvIHRoZSBjdXJyZW50IHN1YnNlZ21lbnQsIG5vdGhpbmcgaGFwcGVucy4KLSAqCi0gKiBJbjoJc2VnVCwgc3Vic2VnVCBjb2RlIGZvciBuZXcgc3Vic2VnbWVudC4KLSAqCWZyYWdfbm93IC0+IGluY29tcGxldGUgZnJhZyBmb3IgY3VycmVudCBzdWJzZWdtZW50LgotICoJSWYgZnJhZ19ub3c9PU5VTEwsIHRoZW4gdGhlcmUgaXMgbm8gb2xkLCBpbmNvbXBsZXRlIGZyYWcsIHNvCi0gKgl0aGUgb2xkIGZyYWcgaXMgbm90IGNsb3NlZCBvZmYuCi0gKgotICogT3V0Oglub3dfc3Vic2VnLCBub3dfc2VnIHVwZGF0ZWQuCi0gKglGcmNoYWluX25vdyBwb2ludHMgdG8gdGhlIChwb3NzaWJseSBuZXcpIHN0cnVjdCBmcmNoYWluIGZvciB0aGlzCi0gKglzdWItc2VnbWVudC4KLSAqCUZyY2hhaW5fcm9vdCB1cGRhdGVkIGlmIG5lZWRlZC4KLSAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotc2VnVAotc3Vic2VnX25ldyAoc2VnbmFtZSwgc3Vic2VnKQotICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IChpbnQpIFNFR19NQVhJTVVNX09SRElOQUw7IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzOwotCi0gICAgICBzID0gc2VnbWVudF9uYW1lICgoc2VnVCkgaSk7Ci0gICAgICBpZiAoc3RyY21wIChzZWduYW1lLCBzKSA9PSAwCi0JICB8fCAoc2VnbmFtZVswXSA9PSAnLicKLQkgICAgICAmJiBzdHJjbXAgKHNlZ25hbWUgKyAxLCBzKSA9PSAwKSkKLQl7Ci0JICBzdWJzZWdfc2V0ICgoc2VnVCkgaSwgc3Vic2VnKTsKLQkgIHJldHVybiAoc2VnVCkgaTsKLQl9Ci0jaWZkZWYgb2JqX3NlZ21lbnRfbmFtZQotICAgICAgcyA9IG9ial9zZWdtZW50X25hbWUgKChzZWdUKSBpKTsKLSAgICAgIGlmIChzdHJjbXAgKHNlZ25hbWUsIHMpID09IDAKLQkgIHx8IChzZWduYW1lWzBdID09ICcuJwotCSAgICAgICYmIHN0cmNtcCAoc2VnbmFtZSArIDEsIHMpID09IDApKQotCXsKLQkgIHN1YnNlZ19zZXQgKChzZWdUKSBpLCBzdWJzZWcpOwotCSAgcmV0dXJuIChzZWdUKSBpOwotCX0KLSNlbmRpZgotICAgIH0KLQotI2lmZGVmIG9ial9hZGRfc2VnbWVudAotICB7Ci0gICAgc2VnVCBuZXdfc2VnOwotICAgIG5ld19zZWcgPSBvYmpfYWRkX3NlZ21lbnQgKHNlZ25hbWUpOwotICAgIHN1YnNlZ19zZXQgKG5ld19zZWcsIHN1YnNlZyk7Ci0gICAgcmV0dXJuIG5ld19zZWc7Ci0gIH0KLSNlbHNlCi0gIGFzX2JhZCAoXygiQXR0ZW1wdCB0byBzd2l0Y2ggdG8gbm9uZXhpc3RlbnQgc2VnbWVudCBcIiVzXCIiKSwgc2VnbmFtZSk7Ci0gIHJldHVybiBub3dfc2VnOwotI2VuZGlmCi19Ci0KLXZvaWQKLXN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKQkvKiBiZWdpbiBhc3NlbWJseSBmb3IgYSBuZXcgc3ViLXNlZ21lbnQgKi8KLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWc7CQkvKiBTRUdfREFUQSBvciBTRUdfVEVYVCAqLwotICAgICByZWdpc3RlciBzdWJzZWdUIHN1YnNlZzsKLXsKLSNpZm5kZWYgTUFOWV9TRUdNRU5UUwotICBrbm93IChzZWcgPT0gU0VHX0RBVEEKLQl8fCBzZWcgPT0gU0VHX1RFWFQKLQl8fCBzZWcgPT0gU0VHX0JTUwotCXx8IHNlZyA9PSBTRUdfQUJTT0xVVEUpOwotI2VuZGlmCi0KLSAgaWYgKHNlZyAhPSBub3dfc2VnIHx8IHN1YnNlZyAhPSBub3dfc3Vic2VnKQotICAgIHsJCQkJLyogd2UganVzdCBjaGFuZ2VkIHN1Yi1zZWdtZW50cyAqLwotICAgICAgc3Vic2VnX3NldF9yZXN0IChzZWcsIHN1YnNlZyk7Ci0gICAgfQotICBtcmlfY29tbW9uX3N5bWJvbCA9IE5VTEw7Ci19Ci0KLSNlbHNlIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotc2VnVAotc3Vic2VnX2dldCAoc2VnbmFtZSwgZm9yY2VfbmV3KQotICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotICAgICBpbnQgZm9yY2VfbmV3OwotewotICBzZWdUIHNlY3B0cjsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0gIGNvbnN0IGNoYXIgKm5vd19zZWdfbmFtZSA9IChub3dfc2VnCi0JCQkgICAgICA/IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsIG5vd19zZWcpCi0JCQkgICAgICA6IDApOwotCi0gIGlmICghZm9yY2VfbmV3Ci0gICAgICAmJiBub3dfc2VnX25hbWUKLSAgICAgICYmIChub3dfc2VnX25hbWUgPT0gc2VnbmFtZQotCSAgfHwgIXN0cmNtcCAobm93X3NlZ19uYW1lLCBzZWduYW1lKSkpCi0gICAgcmV0dXJuIG5vd19zZWc7Ci0KLSAgaWYgKCFmb3JjZV9uZXcpCi0gICAgc2VjcHRyID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsIHNlZ25hbWUpOwotICBlbHNlCi0gICAgc2VjcHRyID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKHN0ZG91dHB1dCwgc2VnbmFtZSk7Ci0KLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWNwdHIpOwotICBpZiAoISBzZWdpbmZvKQotICAgIHsKLSAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3V0cHV0X3NlY3Rpb24gaXMgc2V0IGZpcnN0IGJlY2F1c2Ugc2VjcHRyIG1heQotICAgICAgICAgYmUgYmZkX2Fic19zZWN0aW9uX3B0ci4gICovCi0gICAgICBpZiAoc2VjcHRyLT5vdXRwdXRfc2VjdGlvbiAhPSBzZWNwdHIpCi0Jc2VjcHRyLT5vdXRwdXRfc2VjdGlvbiA9IHNlY3B0cjsKLSAgICAgIHNlZ2luZm8gPSAoc2VnbWVudF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICgqc2VnaW5mbykpOwotICAgICAgbWVtc2V0ICgoUFRSKSBzZWdpbmZvLCAwLCBzaXplb2YgKCpzZWdpbmZvKSk7Ci0gICAgICBzZWdpbmZvLT5maXhfcm9vdCA9IE5VTEw7Ci0gICAgICBzZWdpbmZvLT5maXhfdGFpbCA9IE5VTEw7Ci0gICAgICBzZWdpbmZvLT5iZmRfc2VjdGlvbiA9IHNlY3B0cjsKLSAgICAgIGlmIChzZWNwdHIgPT0gYmZkX2Fic19zZWN0aW9uX3B0cikKLQlhYnNfc2VnX2luZm8gPSBzZWdpbmZvOwotICAgICAgZWxzZSBpZiAoc2VjcHRyID09IGJmZF91bmRfc2VjdGlvbl9wdHIpCi0JdW5kX3NlZ19pbmZvID0gc2VnaW5mbzsKLSAgICAgIGVsc2UKLQliZmRfc2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VjcHRyLCAoUFRSKSBzZWdpbmZvKTsKLSAgICAgIHNlZ2luZm8tPmZyY2hhaW5QID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPmxpbmVub19saXN0X2hlYWQgPSBzZWdpbmZvLT5saW5lbm9fbGlzdF90YWlsID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPnN5bSA9IE5VTEw7Ci0gICAgICBzZWdpbmZvLT5kb3QgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIHNlY3B0cjsKLX0KLQotc2VnVAotc3Vic2VnX25ldyAoc2VnbmFtZSwgc3Vic2VnKQotICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgc2VnVCBzZWNwdHI7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotCi0gIHNlY3B0ciA9IHN1YnNlZ19nZXQgKHNlZ25hbWUsIDApOwotICBzdWJzZWdfc2V0X3Jlc3QgKHNlY3B0ciwgc3Vic2VnKTsKLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWNwdHIpOwotICBpZiAoISBzZWdpbmZvLT5mcmNoYWluUCkKLSAgICBzZWdpbmZvLT5mcmNoYWluUCA9IGZyY2hhaW5fbm93OwotICByZXR1cm4gc2VjcHRyOwotfQotCi0vKiBMaWtlIHN1YnNlZ19uZXcsIGV4Y2VwdCBhIG5ldyBzZWN0aW9uIGlzIGFsd2F5cyBjcmVhdGVkLCBldmVuIGlmCi0gICBhIHNlY3Rpb24gd2l0aCB0aGF0IG5hbWUgYWxyZWFkeSBleGlzdHMuICAqLwotc2VnVAotc3Vic2VnX2ZvcmNlX25ldyAoc2VnbmFtZSwgc3Vic2VnKQotICAgICBjb25zdCBjaGFyICpzZWduYW1lOwotICAgICBzdWJzZWdUIHN1YnNlZzsKLXsKLSAgc2VnVCBzZWNwdHI7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotCi0gIHNlY3B0ciA9IHN1YnNlZ19nZXQgKHNlZ25hbWUsIDEpOwotICBzdWJzZWdfc2V0X3Jlc3QgKHNlY3B0ciwgc3Vic2VnKTsKLSAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWNwdHIpOwotICBpZiAoISBzZWdpbmZvLT5mcmNoYWluUCkKLSAgICBzZWdpbmZvLT5mcmNoYWluUCA9IGZyY2hhaW5fbm93OwotICByZXR1cm4gc2VjcHRyOwotfQotCi12b2lkCi1zdWJzZWdfc2V0IChzZWNwdHIsIHN1YnNlZykKLSAgICAgc2VnVCBzZWNwdHI7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBpZiAoISAoc2VjcHRyID09IG5vd19zZWcgJiYgc3Vic2VnID09IG5vd19zdWJzZWcpKQotICAgIHN1YnNlZ19zZXRfcmVzdCAoc2VjcHRyLCBzdWJzZWcpOwotICBtcmlfY29tbW9uX3N5bWJvbCA9IE5VTEw7Ci19Ci0KLSNpZm5kZWYgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jCi0jZGVmaW5lIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyhTRUMpCTAKLSNlbmRpZgotCi0vKiBHZXQgdGhlIGdhcyBpbmZvcm1hdGlvbiB3ZSBhcmUgc3RvcmluZyBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc2VnbWVudF9pbmZvX3R5cGUgKgotc2VnX2luZm8gKHNlYykKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIGlmIChzZWMgPT0gYmZkX2Fic19zZWN0aW9uX3B0cikKLSAgICByZXR1cm4gYWJzX3NlZ19pbmZvOwotICBlbHNlIGlmIChzZWMgPT0gYmZkX3VuZF9zZWN0aW9uX3B0cikKLSAgICByZXR1cm4gdW5kX3NlZ19pbmZvOwotICBlbHNlCi0gICAgcmV0dXJuIChzZWdtZW50X2luZm9fdHlwZSAqKSBiZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VjKTsKLX0KLQotc3ltYm9sUyAqCi1zZWN0aW9uX3N5bWJvbCAoc2VjKQotICAgICBzZWdUIHNlYzsKLXsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgc3ltYm9sUyAqczsKLQotICBpZiAoc2VnaW5mbyA9PSAwKQotICAgIGFib3J0ICgpOwotICBpZiAoc2VnaW5mby0+c3ltKQotICAgIHJldHVybiBzZWdpbmZvLT5zeW07Ci0KLSNpZm5kZWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMKLSNkZWZpbmUgRU1JVF9TRUNUSU9OX1NZTUJPTFMgMQotI2VuZGlmCi0KLSAgaWYgKCEgRU1JVF9TRUNUSU9OX1NZTUJPTFMKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICB8fCBzeW1ib2xfdGFibGVfZnJvemVuCi0jZW5kaWYKLSAgICAgICkKLSAgICB7Ci0gICAgICAvKiBIZXJlIHdlIGtub3cgaXQgd29uJ3QgYmUgZ29pbmcgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgICAgIHMgPSBzeW1ib2xfY3JlYXRlIChzZWMtPm5hbWUsIHNlYywgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzID0gc3ltYm9sX2ZpbmRfYmFzZSAoc2VjLT5uYW1lLCAwKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JcyA9IHN5bWJvbF9uZXcgKHNlYy0+bmFtZSwgc2VjLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkgICAgewotCSAgICAgIFNfU0VUX1NFR01FTlQgKHMsIHNlYyk7Ci0JICAgICAgc3ltYm9sX3NldF9mcmFnIChzLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBTX0NMRUFSX0VYVEVSTkFMIChzKTsKLQotICAvKiBVc2UgdGhlIEJGRCBzZWN0aW9uIHN5bWJvbCwgaWYgcG9zc2libGUuICAqLwotICBpZiAob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpKQotICAgIHN5bWJvbF9zZXRfYmZkc3ltIChzLCBzZWMtPnN5bWJvbCk7Ci0KLSAgc2VnaW5mby0+c3ltID0gczsKLSAgcmV0dXJuIHM7Ci19Ci0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLS8qIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc2VnbWVudCBpcyB0aG91Z2h0IHRvIGhvbGQgdGV4dC4gICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotY29uc3QgY2hhciAqIGNvbnN0IG5vbnRleHRfc2VjdGlvbl9uYW1lc1tdID0KLXsKLSAgIi5laF9mcmFtZSIsCi0gICIuZ2NjX2V4Y2VwdF90YWJsZSIsCi0jaWZkZWYgT0JKX0NPRkYKLSNpZm5kZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgIi5laF9mcmFtIiwKLSAgIi5nY2NfZXhjIiwKLSNlbmRpZgotI2VuZGlmCi0gIE5VTEwKLX07Ci0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLWludAotc3Vic2VnX3RleHRfcCAoc2VjKQotICAgICBzZWdUIHNlYzsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHJldHVybiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYykgJiBTRUNfQ09ERSkgIT0gMDsKLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotICBjb25zdCBjaGFyICogY29uc3QgKnA7Ci0KLSAgaWYgKHNlYyA9PSBkYXRhX3NlY3Rpb24gfHwgc2VjID09IGJzc19zZWN0aW9uKQotICAgIHJldHVybiAwOwotCi0gIGZvciAocCA9IG5vbnRleHRfc2VjdGlvbl9uYW1lczsgKnAgIT0gTlVMTDsgKytwKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VjKSwgKnApID09IDApCi0JcmV0dXJuIDA7Ci0KLSNpZmRlZiBvYmpfc2VnbWVudF9uYW1lCi0gICAgICBpZiAoc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChzZWMpLCAqcCkgPT0gMCkKLQlyZXR1cm4gMDsKLSNlbmRpZgotICAgIH0KLQotICByZXR1cm4gMTsKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotfQotCi12b2lkCi1zdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGZyY2hhaW5TICpmcmNocDsKLSAgZnByaW50ZiAoZmlsZSwgImZyYWcgY2hhaW5zOlxuIik7Ci0gIGZvciAoZnJjaHAgPSBmcmNoYWluX3Jvb3Q7IGZyY2hwOyBmcmNocCA9IGZyY2hwLT5mcmNoX25leHQpCi0gICAgewotICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgIGZyYWdTICpmcmFncDsKLQotICAgICAgLyogSWYgZnJjaF9zdWJzZWcgaXMgbm9uLXplcm8sIGl0J3MgcHJvYmFibHkgYmVlbiBjaGFpbmVkIG9udG8KLQkgdGhlIGVuZCBvZiBhIHByZXZpb3VzIHN1YnNlY3Rpb24uICBEb24ndCBjb3VudCBpdCBhZ2Fpbi4gICovCi0gICAgICBpZiAoZnJjaHAtPmZyY2hfc3Vic2VnICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNraXAgZ2FzLWludGVybmFsIHNlY3Rpb25zLiAgKi8KLSAgICAgIGlmIChzZWdtZW50X25hbWUgKGZyY2hwLT5mcmNoX3NlZylbMF0gPT0gJyonKQotCWNvbnRpbnVlOwotCi0gICAgICBmb3IgKGZyYWdwID0gZnJjaHAtPmZyY2hfcm9vdDsgZnJhZ3A7IGZyYWdwID0gZnJhZ3AtPmZyX25leHQpCi0JewotI2lmIDAKLQkgIHN3aXRjaCAoZnJhZ3AtPmZyX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSByc19maWxsOgotCSAgICAgIGZwcmludGYgKGZpbGUsICJmIik7IGJyZWFrOwotCSAgICBjYXNlIHJzX2FsaWduOgotCSAgICAgIGZwcmludGYgKGZpbGUsICJhIik7IGJyZWFrOwotCSAgICBjYXNlIHJzX2FsaWduX2NvZGU6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgImMiKTsgYnJlYWs7Ci0JICAgIGNhc2UgcnNfb3JnOgotCSAgICAgIGZwcmludGYgKGZpbGUsICJvIik7IGJyZWFrOwotCSAgICBjYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotCSAgICAgIGZwcmludGYgKGZpbGUsICJtIik7IGJyZWFrOwotCSAgICBjYXNlIHJzX3NwYWNlOgotCSAgICAgIGZwcmludGYgKGZpbGUsICJzIik7IGJyZWFrOwotCSAgICBjYXNlIDA6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgIjAiKTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgIj8iKTsgYnJlYWs7Ci0JICAgIH0KLSNlbmRpZgotCSAgY291bnQrKzsKLQl9Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICJcdCVwICUtMTBzXHQlMTBkIGZyYWdzXG4iLCBmcmNocCwKLQkgICAgICAgc2VnbWVudF9uYW1lIChmcmNocC0+ZnJjaF9zZWcpLCBjb3VudCk7Ci0gICAgfQotfQotCi0vKiBlbmQgb2Ygc3Vic2Vncy5jICovCmRpZmYgLS1naXQgYS9nYXMvc3Vic2Vncy5oIGIvZ2FzL3N1YnNlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0MGQ1Yi4uMDAwMDAwMAotLS0gYS9nYXMvc3Vic2Vncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qIHN1YnNlZ3MuaCAtPiBzdWJzZWdzLmMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogRm9yIGV2ZXJ5IHN1Yi1zZWdtZW50IHRoZSB1c2VyIG1lbnRpb25zIGluIHRoZSBBU3NlbWJsZXIgcHJvZ3JhbSwKLSAqIHdlIG1ha2Ugb25lIHN0cnVjdCBmcmNoYWluLiBFYWNoIHN1Yi1zZWdtZW50IGhhcyBleGFjdGx5IG9uZSBzdHJ1Y3QgZnJjaGFpbgotICogYW5kIHZpY2UgdmVyc2EuCi0gKgotICogU3RydWN0IGZyY2hhaW4ncyBhcmUgZm9yd2FyZCBjaGFpbmVkIChpbiBhc2NlbmRpbmcgb3JkZXIgb2Ygc3ViLXNlZ21lbnQKLSAqIGNvZGUgbnVtYmVyKS4gVGhlIGNoYWluIHJ1bnMgdGhyb3VnaCBmcmNoX25leHQgb2YgZWFjaCBzdWJzZWdtZW50LgotICogVGhpcyBtYWtlcyBpdCBoYXJkIHRvIGZpbmQgYSBzdWJzZWdtZW50J3MgZnJhZ3MKLSAqIGlmIHByb2dyYW1tZXIgdXNlcyBhIGxvdCBvZiB0aGVtLiBNb3N0IHByb2dyYW1zIG9ubHkgdXNlIHRleHQwIGFuZAotICogZGF0YTAsIHNvIHRoZXkgZG9uJ3Qgc3VmZmVyLiBBdCBsZWFzdCB0aGlzIHdheToKLSAqICgxKQlUaGVyZSBhcmUgbm8gImFyYml0cmFyeSIgcmVzdHJpY3Rpb25zIG9uIGhvdyBtYW55IHN1YnNlZ21lbnRzCi0gKgljYW4gYmUgcHJvZ3JhbW1lZDsKLSAqICgyKQlTdWJzZWdtZW50cycgZnJjaGFpbi1zIGFyZSAobGF0ZXIpIGNoYWluZWQgdG9nZXRoZXIgaW4gdGhlIG9yZGVyIGluCi0gKgl3aGljaCB0aGV5IGFyZSBlbWl0dGVkIGZvciBvYmplY3QgZmlsZSB2aXogdGV4dCB0aGVuIGRhdGEuCi0gKgotICogRnJvbSBlYWNoIHN0cnVjdCBmcmNoYWluIGRhbmdsZXMgYSBjaGFpbiBvZiBzdHJ1Y3QgZnJhZ3MuIFRoZSBmcmFncwotICogcmVwcmVzZW50IGNvZGUgZnJhZ21lbnRzLCBmb3IgdGhhdCBzdWItc2VnbWVudCwgZm9yd2FyZCBjaGFpbmVkLgotICovCi0KLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLXN0cnVjdCBmcmNoYWluCQkJLyogY29udHJvbCBidWlsZGluZyBvZiBhIGZyYWcgY2hhaW4gKi8KLXsJCQkJLyogRlJDSCA9IEZSYWdtZW50IENIYWluIGNvbnRyb2wgKi8KLSAgc3RydWN0IGZyYWcgKmZyY2hfcm9vdDsJLyogMXN0IHN0cnVjdCBmcmFnIGluIGNoYWluLCBvciBOVUxMICovCi0gIHN0cnVjdCBmcmFnICpmcmNoX2xhc3Q7CS8qIGxhc3Qgc3RydWN0IGZyYWcgaW4gY2hhaW4sIG9yIE5VTEwgKi8KLSAgc3RydWN0IGZyY2hhaW4gKmZyY2hfbmV4dDsJLyogbmV4dCBpbiBjaGFpbiBvZiBzdHJ1Y3QgZnJjaGFpbi1zICovCi0gIHNlZ1QgZnJjaF9zZWc7CQkvKiBTRUdfVEVYVCBvciBTRUdfREFUQS4gKi8KLSAgc3Vic2VnVCBmcmNoX3N1YnNlZzsJCS8qIHN1YnNlZ21lbnQgbnVtYmVyIG9mIHRoaXMgY2hhaW4gKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGZpeFMgKmZpeF9yb290OwkJLyogUm9vdCBvZiBmaXh1cHMgZm9yIHRoaXMgc3Vic2VnbWVudC4gICovCi0gIGZpeFMgKmZpeF90YWlsOwkJLyogTGFzdCBmaXh1cCBmb3IgdGhpcyBzdWJzZWdtZW50LiAgKi8KLSNlbmRpZgotICBzdHJ1Y3Qgb2JzdGFjayBmcmNoX29ic3RhY2s7CS8qIGZvciBvYmplY3RzIGluIHRoaXMgZnJhZyBjaGFpbiAqLwotICBmcmFnUyAqZnJjaF9mcmFnX25vdzsJCS8qIGZyYWdfbm93IGZvciB0aGlzIHN1YnNlZ21lbnQgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGZyY2hhaW4gZnJjaGFpblM7Ci0KLS8qIEFsbCBzdWJzZWdtZW50cycgY2hhaW5zIGhhbmcgb2ZmIGhlcmUuICBOVUxMIG1lYW5zIG5vIGZyY2hhaW5zIHlldC4gICovCi1leHRlcm4gZnJjaGFpblMgKmZyY2hhaW5fcm9vdDsKLQotLyogRnJjaGFpbiB3ZSBhcmUgYXNzZW1ibGluZyBpbnRvIG5vdy4gIFRoYXQgaXMsIHRoZSBjdXJyZW50IHNlZ21lbnQncwotICAgZnJhZyBjaGFpbiwgZXZlbiBpZiBpdCBjb250YWlucyBubyAoY29tcGxldGUpIGZyYWdzLiAqLwotZXh0ZXJuIGZyY2hhaW5TICpmcmNoYWluX25vdzsKLQotCi10eXBlZGVmIHN0cnVjdCBzZWdtZW50X2luZm9fc3RydWN0Ci17Ci0gIGZyY2hhaW5TICpmcmNoYWluUDsKLSAgdW5zaWduZWQgaW50IGhhZG9uZSA6IDE7Ci0KLSAgLyogVGhpcyBmaWVsZCBpcyBzZXQgaWYgdGhpcyBpcyBhIC5ic3Mgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCByZWFsbHkKLSAgICAgaGF2ZSBhbnkgY29udGVudHMuICBPbmNlIHVwb24gYSB0aW1lIGEgLmJzcyBzZWN0aW9uIGRpZCBub3QgaGF2ZQotICAgICBhbnkgZnJhZ3MsIGJ1dCB0aGF0IGlzIG5vIGxvbmdlciB0cnVlLiAgVGhpcyBmaWVsZCBwcmV2ZW50IHRoZQotICAgICBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgZnJvbSBiZWluZyBzZXQgZm9yIHRoZSBzZWN0aW9uIGV2ZW4gaWYKLSAgICAgdGhlcmUgYXJlIGZyYWdzLiAgKi8KLSAgdW5zaWduZWQgaW50IGJzcyA6IDE7Ci0KLSAgaW50IHVzZXJfc3R1ZmY7Ci0KLSAgLyogRml4dXBzIGZvciB0aGlzIHNlZ21lbnQuICBJZiBCRkRfQVNTRU1CTEVSLCB0aGlzIGlzIG9ubHkgdmFsaWQKLSAgICAgYWZ0ZXIgdGhlIGZyY2hhaW5zIGFyZSBydW4gdG9nZXRoZXIuICAqLwotICBmaXhTICpmaXhfcm9vdDsKLSAgZml4UyAqZml4X3RhaWw7Ci0KLSNpZiBkZWZpbmVkIChNQU5ZX1NFR01FTlRTKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciBzY25oZHI7Ci0gIGVudW0gbGlua29uY2VfdHlwZSBsaW5rb25jZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSNlbmRpZgotCi0gIHN5bWJvbFMgKmRvdDsKLQotICBzdHJ1Y3QgbGluZW5vX2xpc3QgKmxpbmVub19saXN0X2hlYWQ7Ci0gIHN0cnVjdCBsaW5lbm9fbGlzdCAqbGluZW5vX2xpc3RfdGFpbDsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogV2hpY2ggQkZEIHNlY3Rpb24gZG9lcyB0aGlzIGdhcyBzZWdtZW50IGNvcnJlc3BvbmQgdG8/ICAqLwotICBhc2VjdGlvbiAqYmZkX3NlY3Rpb247Ci0KLSAgLyogTlVMTCwgb3IgcG9pbnRlciB0byB0aGUgZ2FzIHN5bWJvbCB0aGF0IGlzIHRoZSBzZWN0aW9uIHN5bWJvbCBmb3IKLSAgICAgdGhpcyBzZWN0aW9uLiAgc3ltLT5ic3ltIGFuZCBiZmRfc2VjdGlvbi0+c3ltYm9sIHNob3VsZCBiZSB0aGUgc2FtZS4gICovCi0gIHN5bWJvbFMgKnN5bTsKLSNlbmRpZgotCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogQ3VycmVudCBzaXplIG9mIHNlY3Rpb24gaG9sZGluZyBzdGFicyBzdHJpbmdzLiAgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhYl9zdHJpbmdfc2l6ZTsKLSAgICAgIC8qIEluaXRpYWwgZnJhZyBmb3IgRUxGLiAgKi8KLSAgICAgIGNoYXIgKnA7Ci0gICAgfQotICBzdGFidTsKLQotI2lmZGVmIE5FRURfTElURVJBTF9QT09MCi0gIHVuc2lnbmVkIGxvbmcgbGl0ZXJhbF9wb29sX3NpemU7Ci0jZW5kaWYKLQotI2lmZGVmIFRDX1NFR01FTlRfSU5GT19UWVBFCi0gIFRDX1NFR01FTlRfSU5GT19UWVBFIHRjX3NlZ21lbnRfaW5mb19kYXRhOwotI2VuZGlmCi19IHNlZ21lbnRfaW5mb190eXBlOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1leHRlcm4gc2VnbWVudF9pbmZvX3R5cGUgKnNlZ19pbmZvIFBBUkFNUyAoKHNlZ1QpKTsKLWV4dGVybiBzeW1ib2xTICpzZWN0aW9uX3N5bWJvbCBQQVJBTVMgKChzZWdUKSk7Ci0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotCi1leHRlcm4gc2VnbWVudF9pbmZvX3R5cGUgc2VnbWVudF9pbmZvW107Ci0KLSNkZWZpbmUgc2VnX2luZm8oU0VDKQkoJnNlZ21lbnRfaW5mb1tTRUNdKQotCi0jZWxzZQotCi0vKiBTZW50aW5lbCBmb3IgZnJjaGFpbiBjcmF3bGluZy4gIFBvaW50cyB0byB0aGUgMXN0IGRhdGEtc2VnbWVudAotICAgZnJjaGFpbi4gIChXaGljaCBpcyBwb2ludGVkIHRvIGJ5IHRoZSBsYXN0IHRleHQtc2VnbWVudCBmcmNoYWluLikgKi8KLWV4dGVybiBmcmNoYWluUyAqZGF0YTBfZnJjaGFpblA7Ci1leHRlcm4gZnJjaGFpblMgKmJzczBfZnJjaGFpblA7Ci0KLS8qIER1bW15IHNvIHN0dWZmIGNhbiBjb21waWxlLiAgU2hvdWxkIG5ldmVyIGJlIHVzZWQuICAqLwotc3RydWN0IHNlZ19pbmZvX3RyYXNoIHsKLSAgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBzdGFiX3N0cmluZ19zaXplIDogMTsKLSAgfSBzdGFidTsKLSAgdW5zaWduZWQgaGFkb25lIDogMTsKLX07Ci0jZGVmaW5lIHNlZ19pbmZvKFMpCShhYm9ydCAoKSwgKHN0cnVjdCBzZWdfaW5mb190cmFzaCAqKSAwKQotCi0jZW5kaWYKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi1leHRlcm4gdm9pZCBzdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqKSk7Ci0KLS8qIGVuZCBvZiBzdWJzZWdzLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9zeW1ib2xzLmMgYi9nYXMvc3ltYm9scy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGRlY2Q4Li4wMDAwMDAwCi0tLSBhL2dhcy9zeW1ib2xzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTA0ICswLDAgQEAKLS8qIHN5bWJvbHMuYyAtc3ltYm9sIHRhYmxlLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogI2RlZmluZSBERUJVR19TWU1TIC8gKiB0byBkZWJ1ZyBzeW1ib2wgbGlzdCBtYWludGVuYW5jZSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvYnN0YWNrLmgiCQkvKiBGb3IgInN5bWJvbHMuaCIgKi8KLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpbmNsdWRlICJzdHJ1Yy1zeW1ib2wuaCIKLQotLyogVGhpcyBpcyBub24temVybyBpZiBzeW1ib2xzIGFyZSBjYXNlIHNlbnNpdGl2ZSwgd2hpY2ggaXMgdGhlCi0gICBkZWZhdWx0LiAgKi8KLWludCBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlID0gMTsKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi1leHRlcm4gaW50IG5ld19icm9rZW5fd29yZHM7Ci0jZW5kaWYKLQotLyogc3ltYm9sLW5hbWUgPT4gc3RydWN0IHN5bWJvbCBwb2ludGVyICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqc3lfaGFzaDsKLQotLyogVGFibGUgb2YgbG9jYWwgc3ltYm9scy4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqbG9jYWxfaGFzaDsKLQotLyogQmVsb3cgYXJlIGNvbW1lbnRlZCBpbiAic3ltYm9scy5oIi4gKi8KLXN5bWJvbFMgKnN5bWJvbF9yb290UDsKLXN5bWJvbFMgKnN5bWJvbF9sYXN0UDsKLXN5bWJvbFMgYWJzX3N5bWJvbDsKLQotI2lmZGVmIERFQlVHX1NZTVMKLSNkZWZpbmUgZGVidWdfdmVyaWZ5X3N5bWNoYWluIHZlcmlmeV9zeW1ib2xfY2hhaW4KLSNlbHNlCi0jZGVmaW5lIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbihyb290LCBsYXN0KSAoKHZvaWQpIDApCi0jZW5kaWYKLQotc3RydWN0IG9ic3RhY2sgbm90ZXM7Ci0KLXN0YXRpYyB2b2lkIGZiX2xhYmVsX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGxvbmcgZG9sbGFyX2xhYmVsX2luc3RhbmNlIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBsb25nIGZiX2xhYmVsX2luc3RhbmNlIFBBUkFNUyAoKGxvbmcpKTsKLQotc3RhdGljIHZvaWQgcHJpbnRfYmluYXJ5IFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqLCBleHByZXNzaW9uUyAqKSk7Ci0KLS8qIHN5bWJvbF9uZXcoKQotICAKLSAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBuZXcgc3ltYm9sLiAgRGllIGlmIHdlIGNhbid0IG1ha2UgYSBuZXcKLSAgIHN5bWJvbC4gIEZpbGwgaW4gdGhlIHN5bWJvbCdzIHZhbHVlcy4gIEFkZCBzeW1ib2wgdG8gZW5kIG9mIHN5bWJvbAotICAgY2hhaW4uCi0gCi0gICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIGdlbmVyYWwgY2FzZSBvZiBjcmVhdGluZyBhCi0gICBzeW1ib2wuICBIb3dldmVyLCBpZiB0aGUgb3V0cHV0IGZpbGUgc3ltYm9sIHRhYmxlIGhhcyBhbHJlYWR5IGJlZW4KLSAgIHNldCwgYW5kIHlvdSBhcmUgY2VydGFpbiB0aGF0IHRoaXMgc3ltYm9sIHdvbid0IGJlIHdhbnRlZCBpbiB0aGUKLSAgIG91dHB1dCBmaWxlLCB5b3UgY2FuIGNhbGwgc3ltYm9sX2NyZWF0ZS4gICovCi0KLXN5bWJvbFMgKgotc3ltYm9sX25ldyAobmFtZSwgc2VnbWVudCwgdmFsdSwgZnJhZykKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgdmFsdTsKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFAgPSBzeW1ib2xfY3JlYXRlIChuYW1lLCBzZWdtZW50LCB2YWx1LCBmcmFnKTsKLQotICAvKgotICAgKiBMaW5rIHRvIGVuZCBvZiBzeW1ib2wgY2hhaW4uCi0gICAqLwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgewotICAgIGV4dGVybiBpbnQgc3ltYm9sX3RhYmxlX2Zyb3plbjsKLSAgICBpZiAoc3ltYm9sX3RhYmxlX2Zyb3plbikKLSAgICAgIGFib3J0ICgpOwotICB9Ci0jZW5kaWYKLSAgc3ltYm9sX2FwcGVuZCAoc3ltYm9sUCwgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQotICByZXR1cm4gc3ltYm9sUDsKLX0KLQotLyogU2F2ZSBhIHN5bWJvbCBuYW1lIG9uIGEgcGVybWFuZW50IG9ic3RhY2ssIGFuZCBjb252ZXJ0IGl0IGFjY29yZGluZwotICAgdG8gdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gICovCi0KLXN0YXRpYyBjaGFyICoKLXNhdmVfc3ltYm9sX25hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHVuc2lnbmVkIGludCBuYW1lX2xlbmd0aDsKLSAgY2hhciAqcmV0OwotCi0gIG5hbWVfbGVuZ3RoID0gc3RybGVuIChuYW1lKSArIDE7CS8qICsxIGZvciBcMCAqLwotICBvYnN0YWNrX2dyb3cgKCZub3RlcywgbmFtZSwgbmFtZV9sZW5ndGgpOwotICByZXQgPSBvYnN0YWNrX2ZpbmlzaCAoJm5vdGVzKTsKLQotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgaWYgKHJldFswXSA9PSAnXycpCi0gICAgKytyZXQ7Ci0jZW5kaWYKLQotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICByZXQgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHJldCk7Ci0jZW5kaWYKLQotICBpZiAoISBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnM7Ci0KLSAgICAgIGZvciAocyA9ICh1bnNpZ25lZCBjaGFyICopIHJldDsgKnMgIT0gJ1wwJzsgcysrKQotCWlmIChpc2xvd2VyICgqcykpCi0JICAqcyA9IHRvdXBwZXIgKCpzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3ltYm9sUyAqCi1zeW1ib2xfY3JlYXRlIChuYW1lLCBzZWdtZW50LCB2YWx1LCBmcmFnKQotICAgICBjb25zdCBjaGFyICpuYW1lOwkJLyogSXQgaXMgY29waWVkLCB0aGUgY2FsbGVyIGNhbiBkZXN0cm95L21vZGlmeSAqLwotICAgICBzZWdUIHNlZ21lbnQ7CQkvKiBTZWdtZW50IGlkZW50aWZpZXIgKFNFR188c29tZXRoaW5nPikgKi8KLSAgICAgdmFsdWVUIHZhbHU7CQkvKiBTeW1ib2wgdmFsdWUgKi8KLSAgICAgZnJhZ1MgKmZyYWc7CQkvKiBBc3NvY2lhdGVkIGZyYWdtZW50ICovCi17Ci0gIGNoYXIgKnByZXNlcnZlZF9jb3B5X29mX25hbWU7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSA9IHNhdmVfc3ltYm9sX25hbWUgKG5hbWUpOwotCi0gIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAoc3ltYm9sUykpOwotCi0gIC8qIHN5bWJvbCBtdXN0IGJlIGJvcm4gaW4gc29tZSBmaXhlZCBzdGF0ZS4gIFRoaXMgc2VlbXMgYXMgZ29vZCBhcyBhbnkuICovCi0gIG1lbXNldCAoc3ltYm9sUCwgMCwgc2l6ZW9mIChzeW1ib2xTKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHN5bWJvbFAtPmJzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKHN0ZG91dHB1dCk7Ci0gIGlmIChzeW1ib2xQLT5ic3ltID09IE5VTEwpCi0gICAgYXNfcGVycm9yICgiJXMiLCAiYmZkX21ha2VfZW1wdHlfc3ltYm9sIik7Ci0gIHN5bWJvbFAtPmJzeW0tPnVkYXRhLnAgPSAoUFRSKSBzeW1ib2xQOwotI2VuZGlmCi0gIFNfU0VUX05BTUUgKHN5bWJvbFAsIHByZXNlcnZlZF9jb3B5X29mX25hbWUpOwotCi0gIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHNlZ21lbnQpOwotICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgdmFsdSk7Ci0gIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIChzeW1ib2xQKTsKLQotICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZzsKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICBzeW1ib2xQLT5zeV9udW1iZXIgPSB+MDsKLSAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSAodW5zaWduZWQgaW50KSB+MDsKLSNlbmRpZgotCi0gIG9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOwotCi0jaWZkZWYgdGNfc3ltYm9sX25ld19ob29rCi0gIHRjX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCk7Ci0jZW5kaWYKLQotICByZXR1cm4gc3ltYm9sUDsKLX0KLQwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLS8qIExvY2FsIHN5bWJvbCBzdXBwb3J0LiAgSWYgd2UgY2FuIGdldCBhd2F5IHdpdGggaXQsIHdlIGtlZXAgb25seSBhCi0gICBzbWFsbCBhbW91bnQgb2YgaW5mb3JtYXRpb24gZm9yIGxvY2FsIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgc3RydWN0IGxvY2FsX3N5bWJvbCAqbG9jYWxfc3ltYm9sX21ha2UgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWdULAotCQkJCQkJICAgICAgIHZhbHVlVCwgZnJhZ1MgKikpOwotc3RhdGljIHN5bWJvbFMgKmxvY2FsX3N5bWJvbF9jb252ZXJ0IFBBUkFNUyAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikpOwotCi0vKiBVc2VkIGZvciBzdGF0aXN0aWNzLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9jYWxfc3ltYm9sX2NvdW50Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9jYWxfc3ltYm9sX2NvbnZlcnNpb25fY291bnQ7Ci0KLS8qIFRoaXMgbWFjcm8gaXMgY2FsbGVkIHdpdGggYSBzeW1ib2wgYXJndW1lbnQgcGFzc2VkIGJ5IHJlZmVyZW5jZS4KLSAgIEl0IHJldHVybnMgd2hldGhlciB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLiAgSWYgbmVjZXNzYXJ5LCBpdAotICAgY2hhbmdlcyBpdHMgYXJndW1lbnQgdG8gdGhlIHJlYWwgc3ltYm9sLiAgKi8KLQotI2RlZmluZSBMT0NBTF9TWU1CT0xfQ0hFQ0socykJCQkJCQlcCi0gIChzLT5ic3ltID09IE5VTEwJCQkJCQkJXAotICAgPyAobG9jYWxfc3ltYm9sX2NvbnZlcnRlZF9wICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKQkJXAotICAgICAgPyAocyA9IGxvY2FsX3N5bWJvbF9nZXRfcmVhbF9zeW1ib2wgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpLAlcCi0JIDApCQkJCQkJCQlcCi0gICAgICA6IDEpCQkJCQkJCQlcCi0gICA6IDApCi0KLS8qIENyZWF0ZSBhIGxvY2FsIHN5bWJvbCBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIGxvY2FsIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGxvY2FsX3N5bWJvbCAqCi1sb2NhbF9zeW1ib2xfbWFrZSAobmFtZSwgc2VjdGlvbiwgb2Zmc2V0LCBmcmFnKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBzZWdUIHNlY3Rpb247Ci0gICAgIHZhbHVlVCBvZmZzZXQ7Ci0gICAgIGZyYWdTICpmcmFnOwotewotICBjaGFyICpuYW1lX2NvcHk7Ci0gIHN0cnVjdCBsb2NhbF9zeW1ib2wgKnJldDsKLQotICArK2xvY2FsX3N5bWJvbF9jb3VudDsKLQotICBuYW1lX2NvcHkgPSBzYXZlX3N5bWJvbF9uYW1lIChuYW1lKTsKLQotICByZXQgPSAoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAqcmV0KTsKLSAgcmV0LT5sc3lfbWFya2VyID0gTlVMTDsKLSAgcmV0LT5sc3lfbmFtZSA9IG5hbWVfY29weTsKLSAgcmV0LT5sc3lfc2VjdGlvbiA9IHNlY3Rpb247Ci0gIGxvY2FsX3N5bWJvbF9zZXRfZnJhZyAocmV0LCBmcmFnKTsKLSAgcmV0LT5sc3lfb2Zmc2V0ID0gb2Zmc2V0OwotCi0gIGhhc2hfamFtIChsb2NhbF9oYXNoLCBuYW1lX2NvcHksIChQVFIpIHJldCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQ29udmVydCBhIGxvY2FsIHN5bWJvbCBpbnRvIGEgcmVhbCBzeW1ib2wuICBOb3RlIHRoYXQgd2UgZG8gbm90Ci0gICByZWNsYWltIHRoZSBzcGFjZSB1c2VkIGJ5IHRoZSBsb2NhbCBzeW1ib2wuICAqLwotCi1zdGF0aWMgc3ltYm9sUyAqCi1sb2NhbF9zeW1ib2xfY29udmVydCAobG9jc3ltKQotICAgICBzdHJ1Y3QgbG9jYWxfc3ltYm9sICpsb2NzeW07Ci17Ci0gIHN5bWJvbFMgKnJldDsKLQotICBhc3NlcnQgKGxvY3N5bS0+bHN5X21hcmtlciA9PSBOVUxMKTsKLSAgaWYgKGxvY2FsX3N5bWJvbF9jb252ZXJ0ZWRfcCAobG9jc3ltKSkKLSAgICByZXR1cm4gbG9jYWxfc3ltYm9sX2dldF9yZWFsX3N5bWJvbCAobG9jc3ltKTsKLQotICArK2xvY2FsX3N5bWJvbF9jb252ZXJzaW9uX2NvdW50OwotCi0gIHJldCA9IHN5bWJvbF9uZXcgKGxvY3N5bS0+bHN5X25hbWUsIGxvY3N5bS0+bHN5X3NlY3Rpb24sIGxvY3N5bS0+bHN5X29mZnNldCwKLQkJICAgIGxvY2FsX3N5bWJvbF9nZXRfZnJhZyAobG9jc3ltKSk7Ci0KLSAgaWYgKGxvY2FsX3N5bWJvbF9yZXNvbHZlZF9wIChsb2NzeW0pKQotICAgIHJldC0+c3lfcmVzb2x2ZWQgPSAxOwotCi0gIC8qIExvY2FsIHN5bWJvbHMgYXJlIGFsd2F5cyBlaXRoZXIgZGVmaW5lZCBvciB1c2VkLiAgKi8KLSAgcmV0LT5zeV91c2VkID0gMTsKLQotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChyZXQpOwotCi0gIGxvY2FsX3N5bWJvbF9tYXJrX2NvbnZlcnRlZCAobG9jc3ltKTsKLSAgbG9jYWxfc3ltYm9sX3NldF9yZWFsX3N5bWJvbCAobG9jc3ltLCByZXQpOwotCi0gIGhhc2hfamFtIChsb2NhbF9oYXNoLCBsb2NzeW0tPmxzeV9uYW1lLCBOVUxMKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0jZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2RlZmluZSBMT0NBTF9TWU1CT0xfQ0hFQ0socykgMAotI2RlZmluZSBsb2NhbF9zeW1ib2xfY29udmVydChzKSAoKHN5bWJvbFMgKikgcykKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotDAotCi0vKgotICoJCQljb2xvbigpCi0gKgotICogV2UgaGF2ZSBqdXN0IHNlZW4gIjxuYW1lPjoiLgotICogQ3JlYXRlcyBhIHN0cnVjdCBzeW1ib2wgdW5sZXNzIGl0IGFscmVhZHkgZXhpc3RzLgotICoKLSAqIEdyaXBlcyBpZiB3ZSBhcmUgcmVkZWZpbmluZyBhIHN5bWJvbCBpbmNvbXBhdGlibHkgKGFuZCBpZ25vcmVzIGl0KS4KLSAqCi0gKi8KLXN5bWJvbFMgKgotY29sb24gKHN5bV9uYW1lKQkJLyoganVzdCBzZWVuICJ4OiIgLSByYXR0bGUgc3ltYm9scyAmIGZyYWdzICovCi0gICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwkvKiBzeW1ib2wgbmFtZSwgYXMgYSBjYW5ub25pY2FsIHN0cmluZyAqLwotICAgICAvKiBXZSBjb3B5IHRoaXMgc3RyaW5nOiBPSyB0byBhbHRlciBsYXRlci4gKi8KLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsJLyogc3ltYm9sIHdlIGFyZSB3b3JraW5nIHdpdGggKi8KLQotICAvKiBTdW4gbG9jYWwgbGFiZWxzIGdvIG91dCBvZiBzY29wZSB3aGVuZXZlciBhIG5vbi1sb2NhbCBzeW1ib2wgaXMKLSAgICAgZGVmaW5lZC4gICovCi0gIGlmIChMT0NBTF9MQUJFTFNfRE9MTEFSKQotICAgIHsKLSAgICAgIGludCBsb2NhbDsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGxvY2FsID0gYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKHN0ZG91dHB1dCwgc3ltX25hbWUpOwotI2Vsc2UKLSAgICAgIGxvY2FsID0gTE9DQUxfTEFCRUwgKHN5bV9uYW1lKTsKLSNlbmRpZgotCi0gICAgICBpZiAoISBsb2NhbCkKLQlkb2xsYXJfbGFiZWxfY2xlYXIgKCk7Ci0gICAgfQotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgaWYgKG5ld19icm9rZW5fd29yZHMpCi0gICAgewotICAgICAgc3RydWN0IGJyb2tlbl93b3JkICphOwotICAgICAgaW50IHBvc3NpYmxlX2J5dGVzOwotICAgICAgZnJhZ1MgKmZyYWdfdG1wOwotICAgICAgY2hhciAqZnJhZ19vcGNvZGU7Ci0KLSAgICAgIGV4dGVybiBjb25zdCBpbnQgbWRfc2hvcnRfanVtcF9zaXplOwotICAgICAgZXh0ZXJuIGNvbnN0IGludCBtZF9sb25nX2p1bXBfc2l6ZTsKLSAgICAgIHBvc3NpYmxlX2J5dGVzID0gKG1kX3Nob3J0X2p1bXBfc2l6ZQotCQkJKyBuZXdfYnJva2VuX3dvcmRzICogbWRfbG9uZ19qdW1wX3NpemUpOwotCi0gICAgICBmcmFnX3RtcCA9IGZyYWdfbm93OwotICAgICAgZnJhZ19vcGNvZGUgPSBmcmFnX3ZhciAocnNfYnJva2VuX3dvcmQsCi0JCQkgICAgICBwb3NzaWJsZV9ieXRlcywKLQkJCSAgICAgIHBvc3NpYmxlX2J5dGVzLAotCQkJICAgICAgKHJlbGF4X3N1YnN0YXRlVCkgMCwKLQkJCSAgICAgIChzeW1ib2xTICopIGJyb2tlbl93b3JkcywKLQkJCSAgICAgIChvZmZzZXRUKSAwLAotCQkJICAgICAgTlVMTCk7Ci0KLSAgICAgIC8qIFdlIHdhbnQgdG8gc3RvcmUgdGhlIHBvaW50ZXIgdG8gd2hlcmUgdG8gaW5zZXJ0IHRoZSBqdW1wIHRhYmxlIGluIHRoZQotCSBmcl9vcGNvZGUgb2YgdGhlIHJzX2Jyb2tlbl93b3JkIGZyYWcuICBUaGlzIHJlcXVpcmVzIGEgbGl0dGxlCi0JIGhhY2tlcnkuICAqLwotICAgICAgd2hpbGUgKGZyYWdfdG1wCi0JICAgICAmJiAoZnJhZ190bXAtPmZyX3R5cGUgIT0gcnNfYnJva2VuX3dvcmQKLQkJIHx8IGZyYWdfdG1wLT5mcl9vcGNvZGUpKQotCWZyYWdfdG1wID0gZnJhZ190bXAtPmZyX25leHQ7Ci0gICAgICBrbm93IChmcmFnX3RtcCk7Ci0gICAgICBmcmFnX3RtcC0+ZnJfb3Bjb2RlID0gZnJhZ19vcGNvZGU7Ci0gICAgICBuZXdfYnJva2VuX3dvcmRzID0gMDsKLQotICAgICAgZm9yIChhID0gYnJva2VuX3dvcmRzOyBhICYmIGEtPmRpc3BmcmFnID09IDA7IGEgPSBhLT5uZXh0X2Jyb2tlbl93b3JkKQotCWEtPmRpc3BmcmFnID0gZnJhZ190bXA7Ci0gICAgfQotI2VuZGlmIC8qIFdPUktJTkdfRE9UX1dPUkQgKi8KLQotICBpZiAoKHN5bWJvbFAgPSBzeW1ib2xfZmluZCAoc3ltX25hbWUpKSAhPSAwKQotICAgIHsKLSNpZmRlZiBSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04KLSAgICAgIGlmIChSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04gKHN5bWJvbFApKQotCXJldHVybiBzeW1ib2xQOwotI2VuZGlmCi0gICAgICAvKgotICAgICAgICoJTm93IGNoZWNrIGZvciB1bmRlZmluZWQgc3ltYm9scwotICAgICAgICovCi0gICAgICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW1ib2xQKSkKLQl7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgc3RydWN0IGxvY2FsX3N5bWJvbCAqbG9jc3ltID0gKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgc3ltYm9sUDsKLQotCSAgaWYgKGxvY3N5bS0+bHN5X3NlY3Rpb24gIT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkgICAgICAmJiAobG9jYWxfc3ltYm9sX2dldF9mcmFnIChsb2NzeW0pICE9IGZyYWdfbm93Ci0JCSAgfHwgbG9jc3ltLT5sc3lfc2VjdGlvbiAhPSBub3dfc2VnCi0JCSAgfHwgbG9jc3ltLT5sc3lfb2Zmc2V0ICE9IGZyYWdfbm93X2ZpeCAoKSkpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIlN5bWJvbCAlcyBhbHJlYWR5IGRlZmluZWQuIiksIHN5bV9uYW1lKTsKLQkgICAgICByZXR1cm4gc3ltYm9sUDsKLQkgICAgfQotCi0JICBsb2NzeW0tPmxzeV9zZWN0aW9uID0gbm93X3NlZzsKLQkgIGxvY2FsX3N5bWJvbF9zZXRfZnJhZyAobG9jc3ltLCBmcmFnX25vdyk7Ci0JICBsb2NzeW0tPmxzeV9vZmZzZXQgPSBmcmFnX25vd19maXggKCk7Ci0jZW5kaWYKLQl9Ci0gICAgICBlbHNlIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKSB8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCi0JewotCSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSA9PSAwKQotCSAgICB7Ci0JICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OwotI2lmZGVmIE9CSl9WTVMKLQkgICAgICBTX1NFVF9PVEhFUihzeW1ib2xQLCBjb25zdF9mbGFnKTsKLSNlbmRpZgotCSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIG5vd19zZWcpOwotI2lmZGVmIE5fVU5ERgotCSAgICAgIGtub3cgKE5fVU5ERiA9PSAwKTsKLSNlbmRpZiAvKiBpZiB3ZSBoYXZlIG9uZSwgaXQgYmV0dGVyIGJlIHplcm8uICovCi0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKglUaGVyZSBhcmUgc3RpbGwgc2V2ZXJhbCBjYXNlcyB0byBjaGVjazoKLQkgICAgICAgKgkJQSAuY29tbS8ubGNvbW0gc3ltYm9sIGJlaW5nIHJlZGVmaW5lZCBhcwotCSAgICAgICAqCQkJaW5pdGlhbGl6ZWQgZGF0YSBpcyBPSwotCSAgICAgICAqCQlBIC5jb21tLy5sY29tbSBzeW1ib2wgYmVpbmcgcmVkZWZpbmVkIHdpdGgKLQkgICAgICAgKgkJCWEgbGFyZ2VyIHNpemUgaXMgYWxzbyBPSwotCSAgICAgICAqCi0JICAgICAgICogVGhpcyBvbmx5IHVzZWQgdG8gYmUgYWxsb3dlZCBvbiBWTVMgZ2FzLCBidXQgU3VuIGNjCi0JICAgICAgICogb24gdGhlIHNwYXJjIGFsc28gZGVwZW5kcyBvbiBpdC4KLQkgICAgICAgKi8KLQotCSAgICAgIGlmICgoKCFTX0lTX0RFQlVHIChzeW1ib2xQKQotCQkgICAgJiYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLQkJICAgICYmIFNfSVNfRVhURVJOQUwgKHN5bWJvbFApKQotCQkgICB8fCBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VjdGlvbikKLQkJICAmJiAobm93X3NlZyA9PSBkYXRhX3NlY3Rpb24KLQkJICAgICAgfHwgbm93X3NlZyA9PSBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSkpCi0JCXsKLQkJICAvKgotCQkgICAqCVNlbGVjdCB3aGljaCBvZiB0aGUgMiBjYXNlcyB0aGlzIGlzCi0JCSAgICovCi0JCSAgaWYgKG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKiAgIE5ldyAuY29tbSBmb3IgcHJldiAuY29tbSBzeW1ib2wuCi0JCSAgICAgICAqCUlmIHRoZSBuZXcgc2l6ZSBpcyBsYXJnZXIgd2UganVzdAotCQkgICAgICAgKgljaGFuZ2UgaXRzIHZhbHVlLiAgSWYgdGhlIG5ldyBzaXplCi0JCSAgICAgICAqCWlzIHNtYWxsZXIsIHdlIGlnbm9yZSB0aGlzIHN5bWJvbAotCQkgICAgICAgKi8KLQkJICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKQotCQkJICA8ICgodW5zaWduZWQpIGZyYWdfbm93X2ZpeCAoKSkpCi0JCQl7Ci0JCQkgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogSXQgaXMgYSAuY29tbS8ubGNvbW0gYmVpbmcgY29udmVydGVkIHRvIGluaXRpYWxpemVkCi0JCQkgZGF0YS4gICovCi0JCSAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSBmcmFnX25vdzsKLSNpZmRlZiBPQkpfVk1TCi0JCSAgICAgIFNfU0VUX09USEVSKHN5bWJvbFAsIGNvbnN0X2ZsYWcpOwotI2VuZGlmCi0JCSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBub3dfc2VnKTsJLyoga2VlcCBOX0VYVCBiaXQgKi8KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotI2lmIGRlZmluZWQgKFNfR0VUX09USEVSKSAmJiBkZWZpbmVkIChTX0dFVF9ERVNDKQotCQkgIGFzX2ZhdGFsIChfKCJTeW1ib2wgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBcIiVzXCIvJWQuJWQuJWxkLiIpLAotCQkJICAgIHN5bV9uYW1lLAotCQkJICAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkpLAotCQkJICAgIFNfR0VUX09USEVSIChzeW1ib2xQKSwgU19HRVRfREVTQyAoc3ltYm9sUCksCi0JCQkgICAgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSk7Ci0jZWxzZQotCQkgIGFzX2ZhdGFsIChfKCJTeW1ib2wgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBcIiVzXCIvJWxkLiIpLAotCQkJICAgIHN5bV9uYW1lLAotCQkJICAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkpLAotCQkJICAgIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCkpOwotI2VuZGlmCi0JCX0KLQkgICAgfQkJCS8qIGlmIHRoZSB1bmRlZmluZWQgc3ltYm9sIGhhcyBubyB2YWx1ZSAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEb24ndCBibG93IHVwIGlmIHRoZSBkZWZpbml0aW9uIGlzIHRoZSBzYW1lICovCi0JICBpZiAoIShmcmFnX25vdyA9PSBzeW1ib2xQLT5zeV9mcmFnCi0JCSYmIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSA9PSBmcmFnX25vd19maXggKCkKLQkJJiYgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gbm93X3NlZykpCi0JICAgIGFzX2ZhdGFsIChfKCJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkLiIpLCBzeW1fbmFtZSk7Ci0JfQkJCS8qIGlmIHRoaXMgc3ltYm9sIGlzIG5vdCB5ZXQgZGVmaW5lZCAqLwotCi0gICAgfQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZWxzZSBpZiAoISBmbGFnX2tlZXBfbG9jYWxzICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChzdGRvdXRwdXQsIHN5bV9uYW1lKSkKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gKHN5bWJvbFMgKikgbG9jYWxfc3ltYm9sX21ha2UgKHN5bV9uYW1lLCBub3dfc2VnLAotCQkJCQkgICAgICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJCQkgICAgICAgZnJhZ19ub3cpOwotICAgIH0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAoc3ltX25hbWUsIG5vd19zZWcsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwKLQkJCSAgICBmcmFnX25vdyk7Ci0jaWZkZWYgT0JKX1ZNUwotICAgICAgU19TRVRfT1RIRVIgKHN5bWJvbFAsIGNvbnN0X2ZsYWcpOwotI2VuZGlmIC8qIE9CSl9WTVMgKi8KLQotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0gICAgfQkJCQkvKiBpZiB3ZSBoYXZlIHNlZW4gdGhpcyBzeW1ib2wgYmVmb3JlICovCi0KLSAgaWYgKG1yaV9jb21tb25fc3ltYm9sICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBzeW1ib2wgaXMgYWN0dWFsbHkgYmVpbmcgZGVmaW5lZCB3aXRoaW4gYW4gTVJJIGNvbW1vbgotICAgICAgICAgc2VjdGlvbi4gIFRoaXMgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZy4gICovCi0gICAgICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW1ib2xQKSkKLQlzeW1ib2xQID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHN5bWJvbFApOwotICAgICAgc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgc3ltYm9sUC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sID0gbXJpX2NvbW1vbl9zeW1ib2w7Ci0gICAgICBzeW1ib2xQLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPSBTX0dFVF9WQUxVRSAobXJpX2NvbW1vbl9zeW1ib2wpOwotICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGV4cHJfc2VjdGlvbik7Ci0gICAgICBzeW1ib2xQLT5zeV9tcmlfY29tbW9uID0gMTsKLSAgICB9Ci0KLSNpZmRlZiB0Y19mcm9iX2xhYmVsCi0gIHRjX2Zyb2JfbGFiZWwgKHN5bWJvbFApOwotI2VuZGlmCi0jaWZkZWYgb2JqX2Zyb2JfbGFiZWwKLSAgb2JqX2Zyb2JfbGFiZWwgKHN5bWJvbFApOwotI2VuZGlmCi0KLSAgcmV0dXJuIHN5bWJvbFA7Ci19Ci0MCi0KLS8qCi0gKgkJCXN5bWJvbF90YWJsZV9pbnNlcnQoKQotICoKLSAqIERpZSBpZiB3ZSBjYW4ndCBpbnNlcnQgdGhlIHN5bWJvbC4KLSAqCi0gKi8KLQotdm9pZCAKLXN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmVycm9yX3N0cmluZzsKLQotICBrbm93IChzeW1ib2xQKTsKLSAga25vdyAoU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGVycm9yX3N0cmluZyA9IGhhc2hfamFtIChsb2NhbF9oYXNoLCBTX0dFVF9OQU1FIChzeW1ib2xQKSwKLQkJCSAgICAgICAoUFRSKSBzeW1ib2xQKTsKLSAgICAgIGlmIChlcnJvcl9zdHJpbmcgIT0gTlVMTCkKLQlhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN5bWJvbCB0YWJsZSBmYWlsZWQ6ICVzIiksCi0JCSAgU19HRVRfTkFNRSAoc3ltYm9sUCksIGVycm9yX3N0cmluZyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgoZXJyb3Jfc3RyaW5nID0gaGFzaF9qYW0gKHN5X2hhc2gsIFNfR0VUX05BTUUgKHN5bWJvbFApLCAoUFRSKSBzeW1ib2xQKSkpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIkluc2VydGluZyBcIiVzXCIgaW50byBzeW1ib2wgdGFibGUgZmFpbGVkOiAlcyIpLAotCQlTX0dFVF9OQU1FIChzeW1ib2xQKSwgZXJyb3Jfc3RyaW5nKTsKLSAgICB9CQkJCS8qIG9uIGVycm9yICovCi19CQkJCS8qIHN5bWJvbF90YWJsZV9pbnNlcnQoKSAqLwotDAotLyoKLSAqCQkJc3ltYm9sX2ZpbmRfb3JfbWFrZSgpCi0gKgotICogSWYgYSBzeW1ib2wgbmFtZSBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIGl0IGFzIHVuZGVmaW5lZCwgYW5kIGluc2VydAotICogaXQgaW50byB0aGUgc3ltYm9sIHRhYmxlLiBSZXR1cm4gYSBwb2ludGVyIHRvIGl0LgotICovCi1zeW1ib2xTICoKLXN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLQotICBpZiAoc3ltYm9sUCA9PSBOVUxMKQotICAgIHsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBpZiAoISBmbGFnX2tlZXBfbG9jYWxzICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChzdGRvdXRwdXQsIG5hbWUpKQotCXsKLQkgIHN5bWJvbFAgPSBtZF91bmRlZmluZWRfc3ltYm9sICgoY2hhciAqKSBuYW1lKTsKLQkgIGlmIChzeW1ib2xQICE9IE5VTEwpCi0JICAgIHJldHVybiBzeW1ib2xQOwotCi0JICBzeW1ib2xQID0gKHN5bWJvbFMgKikgbG9jYWxfc3ltYm9sX21ha2UgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLAotCQkJCQkJICAgKHZhbHVlVCkgMCwKLQkJCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JICByZXR1cm4gc3ltYm9sUDsKLQl9Ci0jZW5kaWYKLQotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9tYWtlIChuYW1lKTsKLQotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0gICAgfQkJCQkvKiBpZiBzeW1ib2wgd2Fzbid0IGZvdW5kICovCi0KLSAgcmV0dXJuIChzeW1ib2xQKTsKLX0JCQkJLyogc3ltYm9sX2ZpbmRfb3JfbWFrZSgpICovCi0KLXN5bWJvbFMgKgotc3ltYm9sX21ha2UgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyogTGV0IHRoZSBtYWNoaW5lIGRlc2NyaXB0aW9uIGRlZmF1bHQgaXQsIGUuZy4gZm9yIHJlZ2lzdGVyIG5hbWVzLiAqLwotICBzeW1ib2xQID0gbWRfdW5kZWZpbmVkX3N5bWJvbCAoKGNoYXIgKikgbmFtZSk7Ci0KLSAgaWYgKCFzeW1ib2xQKQotICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgKHZhbHVlVCkgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICByZXR1cm4gKHN5bWJvbFApOwotfQkJCQkvKiBzeW1ib2xfbWFrZSgpICovCi0KLS8qCi0gKgkJCXN5bWJvbF9maW5kKCkKLSAqCi0gKiBJbXBsZW1lbnQgc3ltYm9sIHRhYmxlIGxvb2t1cC4KLSAqIEluOglBIHN5bWJvbCdzIG5hbWUgYXMgYSBzdHJpbmc6ICdcMCcgY2FuJ3QgYmUgcGFydCBvZiBhIHN5bWJvbCBuYW1lLgotICogT3V0OglOVUxMIGlmIHRoZSBuYW1lIHdhcyBub3QgaW4gdGhlIHN5bWJvbCB0YWJsZSwgZWxzZSB0aGUgYWRkcmVzcwotICoJb2YgYSBzdHJ1Y3Qgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGF0IG5hbWUuCi0gKi8KLQotc3ltYm9sUyAqCi1zeW1ib2xfZmluZCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIHJldHVybiAoc3ltYm9sX2ZpbmRfYmFzZSAobmFtZSwgMSkpOwotI2Vsc2UgLyogU1RSSVBfVU5ERVJTQ09SRSAqLwotICByZXR1cm4gKHN5bWJvbF9maW5kX2Jhc2UgKG5hbWUsIDApKTsKLSNlbmRpZiAvKiBTVFJJUF9VTkRFUlNDT1JFICovCi19CQkJCS8qIHN5bWJvbF9maW5kKCkgKi8KLQotc3ltYm9sUyAqCi1zeW1ib2xfZmluZF9iYXNlIChuYW1lLCBzdHJpcF91bmRlcnNjb3JlKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBpbnQgc3RyaXBfdW5kZXJzY29yZTsKLXsKLSAgaWYgKHN0cmlwX3VuZGVyc2NvcmUgJiYgKm5hbWUgPT0gJ18nKQotICAgIG5hbWUrKzsKLQotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICB7Ci0gICAgY2hhciAqY29weTsKLSAgICBzaXplX3QgbGVuID0gc3RybGVuIChuYW1lKSArIDE7Ci0KLSAgICBjb3B5ID0gKGNoYXIgKikgYWxsb2NhIChsZW4pOwotICAgIG1lbWNweSAoY29weSwgbmFtZSwgbGVuKTsKLSAgICBuYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChjb3B5KTsKLSAgfQotI2VuZGlmCi0KLSAgaWYgKCEgc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSkKLSAgICB7Ci0gICAgICBjaGFyICpjb3B5OwotICAgICAgY29uc3QgY2hhciAqb3JpZzsKLSAgICAgIHVuc2lnbmVkIGNoYXIgYzsKLQotICAgICAgb3JpZyA9IG5hbWU7Ci0gICAgICBuYW1lID0gY29weSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChuYW1lKSArIDEpOwotCi0gICAgICB3aGlsZSAoKGMgPSAqb3JpZysrKSAhPSAnXDAnKQotCXsKLQkgIGlmIChpc2xvd2VyIChjKSkKLQkgICAgYyA9IHRvdXBwZXIgKGMpOwotCSAgKmNvcHkrKyA9IGM7Ci0JfQotICAgICAgKmNvcHkgPSAnXDAnOwotICAgIH0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgewotICAgIHN0cnVjdCBsb2NhbF9zeW1ib2wgKmxvY3N5bTsKLQotICAgIGxvY3N5bSA9IChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIGhhc2hfZmluZCAobG9jYWxfaGFzaCwgbmFtZSk7Ci0gICAgaWYgKGxvY3N5bSAhPSBOVUxMKQotICAgICAgcmV0dXJuIChzeW1ib2xTICopIGxvY3N5bTsKLSAgfQotI2VuZGlmCi0KLSAgcmV0dXJuICgoc3ltYm9sUyAqKSBoYXNoX2ZpbmQgKHN5X2hhc2gsIG5hbWUpKTsKLX0KLQotLyoKLSAqIE9uY2UgdXBvbiBhIHRpbWUsIHN5bWJvbHMgd2VyZSBrZXB0IGluIGEgc2luZ2x5IGxpbmtlZCBsaXN0LiAgQXQKLSAqIGxlYXN0IGNvZmYgbmVlZHMgdG8gYmUgYWJsZSB0byByZWFycmFuZ2UgdGhlbSBmcm9tIHRpbWUgdG8gdGltZSwgZm9yCi0gKiB3aGljaCBhIGRvdWJseSBsaW5rZWQgbGlzdCBpcyBtdWNoIG1vcmUgY29udmVuaWVudC4gIExvaWMgZGlkIHRoZXNlCi0gKiBhcyBtYWNyb3Mgd2hpY2ggc2VlbWVkIGRhbmdlcm91cyB0byBtZSBzbyB0aGV5J3JlIG5vdyBmdW5jdGlvbnMuCi0gKiB4b3hvcmljaC4KLSAqLwotCi0vKiBMaW5rIHN5bWJvbCBBRERNRSBhZnRlciBzeW1ib2wgVEFSR0VUIGluIHRoZSBjaGFpbi4gKi8KLXZvaWQgCi1zeW1ib2xfYXBwZW5kIChhZGRtZSwgdGFyZ2V0LCByb290UFAsIGxhc3RQUCkKLSAgICAgc3ltYm9sUyAqYWRkbWU7Ci0gICAgIHN5bWJvbFMgKnRhcmdldDsKLSAgICAgc3ltYm9sUyAqKnJvb3RQUDsKLSAgICAgc3ltYm9sUyAqKmxhc3RQUDsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoYWRkbWUpKQotICAgIGFib3J0ICgpOwotICBpZiAodGFyZ2V0ICE9IE5VTEwgJiYgTE9DQUxfU1lNQk9MX0NIRUNLICh0YXJnZXQpKQotICAgIGFib3J0ICgpOwotCi0gIGlmICh0YXJnZXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBrbm93ICgqcm9vdFBQID09IE5VTEwpOwotICAgICAga25vdyAoKmxhc3RQUCA9PSBOVUxMKTsKLSAgICAgIGFkZG1lLT5zeV9uZXh0ID0gTlVMTDsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gICAgICBhZGRtZS0+c3lfcHJldmlvdXMgPSBOVUxMOwotI2VuZGlmCi0gICAgICAqcm9vdFBQID0gYWRkbWU7Ci0gICAgICAqbGFzdFBQID0gYWRkbWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiB0aGUgbGlzdCBpcyBlbXB0eSAqLwotCi0gIGlmICh0YXJnZXQtPnN5X25leHQgIT0gTlVMTCkKLSAgICB7Ci0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotICAgICAgdGFyZ2V0LT5zeV9uZXh0LT5zeV9wcmV2aW91cyA9IGFkZG1lOwotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBrbm93ICgqbGFzdFBQID09IHRhcmdldCk7Ci0gICAgICAqbGFzdFBQID0gYWRkbWU7Ci0gICAgfQkJCQkvKiBpZiB3ZSBoYXZlIGEgbmV4dCAqLwotCi0gIGFkZG1lLT5zeV9uZXh0ID0gdGFyZ2V0LT5zeV9uZXh0OwotICB0YXJnZXQtPnN5X25leHQgPSBhZGRtZTsKLQotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgYWRkbWUtPnN5X3ByZXZpb3VzID0gdGFyZ2V0OwotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLQotICBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4gKHN5bWJvbF9yb290UCwgc3ltYm9sX2xhc3RQKTsKLX0KLQotLyogU2V0IHRoZSBjaGFpbiBwb2ludGVycyBvZiBTWU1CT0wgdG8gbnVsbC4gKi8KLXZvaWQgCi1zeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoc3ltYm9sUCkpCi0gICAgYWJvcnQgKCk7Ci0gIHN5bWJvbFAtPnN5X25leHQgPSBOVUxMOwotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgc3ltYm9sUC0+c3lfcHJldmlvdXMgPSBOVUxMOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0vKiBSZW1vdmUgU1lNQk9MUCBmcm9tIHRoZSBsaXN0LiAqLwotdm9pZCAKLXN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsIHJvb3RQUCwgbGFzdFBQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotICAgICBzeW1ib2xTICoqcm9vdFBQOwotICAgICBzeW1ib2xTICoqbGFzdFBQOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW1ib2xQKSkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoc3ltYm9sUCA9PSAqcm9vdFBQKQotICAgIHsKLSAgICAgICpyb290UFAgPSBzeW1ib2xQLT5zeV9uZXh0OwotICAgIH0JCQkJLyogaWYgaXQgd2FzIHRoZSByb290ICovCi0KLSAgaWYgKHN5bWJvbFAgPT0gKmxhc3RQUCkKLSAgICB7Ci0gICAgICAqbGFzdFBQID0gc3ltYm9sUC0+c3lfcHJldmlvdXM7Ci0gICAgfQkJCQkvKiBpZiBpdCB3YXMgdGhlIHRhaWwgKi8KLQotICBpZiAoc3ltYm9sUC0+c3lfbmV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbFAtPnN5X25leHQtPnN5X3ByZXZpb3VzID0gc3ltYm9sUC0+c3lfcHJldmlvdXM7Ci0gICAgfQkJCQkvKiBpZiBub3QgbGFzdCAqLwotCi0gIGlmIChzeW1ib2xQLT5zeV9wcmV2aW91cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbFAtPnN5X3ByZXZpb3VzLT5zeV9uZXh0ID0gc3ltYm9sUC0+c3lfbmV4dDsKLSAgICB9CQkJCS8qIGlmIG5vdCBmaXJzdCAqLwotCi0gIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiAoKnJvb3RQUCwgKmxhc3RQUCk7Ci19Ci0KLS8qIExpbmsgc3ltYm9sIEFERE1FIGJlZm9yZSBzeW1ib2wgVEFSR0VUIGluIHRoZSBjaGFpbi4gKi8KLXZvaWQgCi1zeW1ib2xfaW5zZXJ0IChhZGRtZSwgdGFyZ2V0LCByb290UFAsIGxhc3RQUCkKLSAgICAgc3ltYm9sUyAqYWRkbWU7Ci0gICAgIHN5bWJvbFMgKnRhcmdldDsKLSAgICAgc3ltYm9sUyAqKnJvb3RQUDsKLSAgICAgc3ltYm9sUyAqKmxhc3RQUCBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChhZGRtZSkpCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHRhcmdldCkpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHRhcmdldC0+c3lfcHJldmlvdXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB0YXJnZXQtPnN5X3ByZXZpb3VzLT5zeV9uZXh0ID0gYWRkbWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAga25vdyAoKnJvb3RQUCA9PSB0YXJnZXQpOwotICAgICAgKnJvb3RQUCA9IGFkZG1lOwotICAgIH0JCQkJLyogaWYgbm90IGZpcnN0ICovCi0KLSAgYWRkbWUtPnN5X3ByZXZpb3VzID0gdGFyZ2V0LT5zeV9wcmV2aW91czsKLSAgdGFyZ2V0LT5zeV9wcmV2aW91cyA9IGFkZG1lOwotICBhZGRtZS0+c3lfbmV4dCA9IHRhcmdldDsKLQotICBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4gKCpyb290UFAsICpsYXN0UFApOwotfQotCi0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotCi12b2lkIAotdmVyaWZ5X3N5bWJvbF9jaGFpbiAocm9vdFAsIGxhc3RQKQotICAgICBzeW1ib2xTICpyb290UDsKLSAgICAgc3ltYm9sUyAqbGFzdFA7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFAgPSByb290UDsKLQotICBpZiAoc3ltYm9sUCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmb3IgKDsgc3ltYm9sX25leHQgKHN5bWJvbFApICE9IE5VTEw7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGFzc2VydCAoc3ltYm9sUC0+YnN5bSAhPSBOVUxMKTsKLSNlbmRpZgotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgICAgIGFzc2VydCAoc3ltYm9sUC0+c3lfbmV4dC0+c3lfcHJldmlvdXMgPT0gc3ltYm9sUCk7Ci0jZWxzZQotICAgICAgLyogV2FsayB0aGUgbGlzdCBhbnl3YXlzLCB0byBtYWtlIHN1cmUgcG9pbnRlcnMgYXJlIHN0aWxsIGdvb2QuICAqLwotICAgICAgOwotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLSAgICB9Ci0KLSAgYXNzZXJ0IChsYXN0UCA9PSBzeW1ib2xQKTsKLX0KLQotdm9pZAotdmVyaWZ5X3N5bWJvbF9jaGFpbl8yIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgc3ltYm9sUyAqcCA9IHN5bSwgKm4gPSBzeW07Ci0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotICB3aGlsZSAoc3ltYm9sX3ByZXZpb3VzIChwKSkKLSAgICBwID0gc3ltYm9sX3ByZXZpb3VzIChwKTsKLSNlbmRpZgotICB3aGlsZSAoc3ltYm9sX25leHQgKG4pKQotICAgIG4gPSBzeW1ib2xfbmV4dCAobik7Ci0gIHZlcmlmeV9zeW1ib2xfY2hhaW4gKHAsIG4pOwotfQotCi0vKiBSZXNvbHZlIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gIFRoaXMgaXMgY2FsbGVkIGR1cmluZyB0aGUgZmluYWwKLSAgIHBhc3Mgb3ZlciB0aGUgc3ltYm9sIHRhYmxlIHRvIHJlc29sdmUgYW55IHN5bWJvbHMgd2l0aCBjb21wbGV4Ci0gICB2YWx1ZXMuICAqLwotCi12YWx1ZVQKLXJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1wLCBmaW5hbGl6ZSkKLSAgICAgc3ltYm9sUyAqc3ltcDsKLSAgICAgaW50IGZpbmFsaXplOwotewotICBpbnQgcmVzb2x2ZWQ7Ci0gIHZhbHVlVCBmaW5hbF92YWw7Ci0gIHNlZ1QgZmluYWxfc2VnOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW1wKSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbG9jYWxfc3ltYm9sICpsb2NzeW0gPSAoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzeW1wOwotCi0gICAgICBpZiAobG9jYWxfc3ltYm9sX3Jlc29sdmVkX3AgKGxvY3N5bSkpCi0JcmV0dXJuIGxvY3N5bS0+bHN5X29mZnNldDsKLQotICAgICAgZmluYWxfdmFsID0gKGxvY2FsX3N5bWJvbF9nZXRfZnJhZyAobG9jc3ltKS0+ZnJfYWRkcmVzcwotCQkgICArIGxvY3N5bS0+bHN5X29mZnNldCk7Ci0KLSAgICAgIGlmIChmaW5hbGl6ZSkKLQl7Ci0JICBsb2NzeW0tPmxzeV9vZmZzZXQgPSBmaW5hbF92YWw7Ci0JICBsb2NhbF9zeW1ib2xfbWFya19yZXNvbHZlZCAobG9jc3ltKTsKLQl9Ci0KLSAgICAgIHJldHVybiBmaW5hbF92YWw7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKHN5bXAtPnN5X3Jlc29sdmVkKQotICAgIHsKLSAgICAgIGlmIChzeW1wLT5zeV92YWx1ZS5YX29wID09IE9fY29uc3RhbnQpCi0JcmV0dXJuICh2YWx1ZVQpIHN5bXAtPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmVzb2x2ZWQgPSAwOwotICBmaW5hbF9zZWcgPSBTX0dFVF9TRUdNRU5UIChzeW1wKTsKLQotICBpZiAoc3ltcC0+c3lfcmVzb2x2aW5nKQotICAgIHsKLSAgICAgIGlmIChmaW5hbGl6ZSkKLQlhc19iYWQgKF8oIlN5bWJvbCBkZWZpbml0aW9uIGxvb3AgZW5jb3VudGVyZWQgYXQgJXMiKSwgU19HRVRfTkFNRSAoc3ltcCkpOwotICAgICAgZmluYWxfdmFsID0gMDsKLSAgICAgIHJlc29sdmVkID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xTICphZGRfc3ltYm9sLCAqb3Bfc3ltYm9sOwotICAgICAgb2Zmc2V0VCBsZWZ0LCByaWdodDsKLSAgICAgIHNlZ1Qgc2VnX2xlZnQsIHNlZ19yaWdodDsKLSAgICAgIG9wZXJhdG9yVCBvcDsKLQotICAgICAgc3ltcC0+c3lfcmVzb2x2aW5nID0gMTsKLQotICAgICAgLyogSGVscCBvdXQgd2l0aCBDU0UuICAqLwotICAgICAgYWRkX3N5bWJvbCA9IHN5bXAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLSAgICAgIG9wX3N5bWJvbCA9IHN5bXAtPnN5X3ZhbHVlLlhfb3Bfc3ltYm9sOwotICAgICAgZmluYWxfdmFsID0gc3ltcC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOwotICAgICAgb3AgPSBzeW1wLT5zeV92YWx1ZS5YX29wOwotCi0gICAgICBzd2l0Y2ggKG9wKQotCXsKLQlkZWZhdWx0OgotCSAgQkFEX0NBU0UgKG9wKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX2Fic2VudDoKLQkgIGZpbmFsX3ZhbCA9IDA7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCi0JY2FzZSBPX2NvbnN0YW50OgotCSAgZmluYWxfdmFsICs9IHN5bXAtPnN5X2ZyYWctPmZyX2FkZHJlc3M7Ci0JICBpZiAoZmluYWxfc2VnID09IGV4cHJfc2VjdGlvbikKLQkgICAgZmluYWxfc2VnID0gYWJzb2x1dGVfc2VjdGlvbjsKLQkgIHJlc29sdmVkID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX3N5bWJvbDoKLQljYXNlIE9fc3ltYm9sX3J2YToKLQkgIGxlZnQgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAoYWRkX3N5bWJvbCwgZmluYWxpemUpOwotCWRvX3N5bWJvbDoKLQotCSAgaWYgKHN5bXAtPnN5X21yaV9jb21tb24pCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgc3ltYm9sIGluc2lkZSBhbiBNUkkgY29tbW9uIHNlY3Rpb24uICBUaGUKLSAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiByb3V0aW5lcyBhcmUgZ29pbmcgdG8gaGFuZGxlIGl0IHNwZWNpYWxseS4KLSAgICAgICAgICAgICAgICAgRG9uJ3QgY2hhbmdlIHRoZSB2YWx1ZS4gICovCi0JICAgICAgcmVzb2x2ZWQgPSBzeW1ib2xfcmVzb2x2ZWRfcCAoYWRkX3N5bWJvbCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKGZpbmFsaXplICYmIGZpbmFsX3ZhbCA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoYWRkX3N5bWJvbCkpCi0JCWFkZF9zeW1ib2wgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikKLQkJCQkJCSAgIGFkZF9zeW1ib2wpOwotCSAgICAgIGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMgKHN5bXAsIGFkZF9zeW1ib2wpOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGhhdmUgZXF1YXRlZCB0aGlzIHN5bWJvbCB0byBhbiB1bmRlZmluZWQgc3ltYm9sLCB3ZQotICAgICAgICAgICAgIGtlZXAgWF9vcCBzZXQgdG8gT19zeW1ib2wsIGFuZCB3ZSBkb24ndCBjaGFuZ2UKLSAgICAgICAgICAgICBYX2FkZF9udW1iZXIuICBUaGlzIHBlcm1pdHMgdGhlIHJvdXRpbmUgd2hpY2ggd3JpdGVzIG91dAotICAgICAgICAgICAgIHJlbG9jYXRpb24gdG8gZGV0ZWN0IHRoaXMgY2FzZSwgYW5kIGNvbnZlcnQgdGhlCi0gICAgICAgICAgICAgcmVsb2NhdGlvbiB0byBiZSBhZ2FpbnN0IHRoZSBzeW1ib2wgdG8gd2hpY2ggdGhpcyBzeW1ib2wKLSAgICAgICAgICAgICBpcyBlcXVhdGVkLiAgKi8KLQkgIGlmICghIFNfSVNfREVGSU5FRCAoYWRkX3N5bWJvbCkgfHwgU19JU19DT01NT04gKGFkZF9zeW1ib2wpKQotCSAgICB7Ci0JICAgICAgaWYgKGZpbmFsaXplKQotCQl7Ci0JCSAgU19TRVRfU0VHTUVOVCAoc3ltcCwgU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbCkpOwotCQkgIHN5bXAtPnN5X3ZhbHVlLlhfb3AgPSBPX3N5bWJvbDsKLQkJICBzeW1wLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wgPSBhZGRfc3ltYm9sOwotCQkgIHN5bXAtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IGZpbmFsX3ZhbDsKLQkJfQotCSAgICAgIGZpbmFsX3ZhbCA9IDA7Ci0JICAgICAgcmVzb2x2ZWQgPSBzeW1ib2xfcmVzb2x2ZWRfcCAoYWRkX3N5bWJvbCk7Ci0JICAgICAgZ290byBleGl0X2RvbnRfc2V0X3ZhbHVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmaW5hbF92YWwgKz0gc3ltcC0+c3lfZnJhZy0+ZnJfYWRkcmVzcyArIGxlZnQ7Ci0JICAgICAgaWYgKGZpbmFsX3NlZyA9PSBleHByX3NlY3Rpb24gfHwgZmluYWxfc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCQlmaW5hbF9zZWcgPSBTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sKTsKLQkgICAgfQotCi0JICByZXNvbHZlZCA9IHN5bWJvbF9yZXNvbHZlZF9wIChhZGRfc3ltYm9sKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX3VtaW51czoKLQljYXNlIE9fYml0X25vdDoKLQljYXNlIE9fbG9naWNhbF9ub3Q6Ci0JICBsZWZ0ID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGFkZF9zeW1ib2wsIGZpbmFsaXplKTsKLQotCSAgaWYgKG9wID09IE9fdW1pbnVzKQotCSAgICBsZWZ0ID0gLWxlZnQ7Ci0JICBlbHNlIGlmIChvcCA9PSBPX2xvZ2ljYWxfbm90KQotCSAgICBsZWZ0ID0gIWxlZnQ7Ci0JICBlbHNlCi0JICAgIGxlZnQgPSB+bGVmdDsKLQotCSAgZmluYWxfdmFsICs9IGxlZnQgKyBzeW1wLT5zeV9mcmFnLT5mcl9hZGRyZXNzOwotCSAgaWYgKGZpbmFsX3NlZyA9PSBleHByX3NlY3Rpb24gfHwgZmluYWxfc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCSAgICBmaW5hbF9zZWcgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCi0JICByZXNvbHZlZCA9IHN5bWJvbF9yZXNvbHZlZF9wIChhZGRfc3ltYm9sKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX211bHRpcGx5OgotCWNhc2UgT19kaXZpZGU6Ci0JY2FzZSBPX21vZHVsdXM6Ci0JY2FzZSBPX2xlZnRfc2hpZnQ6Ci0JY2FzZSBPX3JpZ2h0X3NoaWZ0OgotCWNhc2UgT19iaXRfaW5jbHVzaXZlX29yOgotCWNhc2UgT19iaXRfb3Jfbm90OgotCWNhc2UgT19iaXRfZXhjbHVzaXZlX29yOgotCWNhc2UgT19iaXRfYW5kOgotCWNhc2UgT19hZGQ6Ci0JY2FzZSBPX3N1YnRyYWN0OgotCWNhc2UgT19lcToKLQljYXNlIE9fbmU6Ci0JY2FzZSBPX2x0OgotCWNhc2UgT19sZToKLQljYXNlIE9fZ2U6Ci0JY2FzZSBPX2d0OgotCWNhc2UgT19sb2dpY2FsX2FuZDoKLQljYXNlIE9fbG9naWNhbF9vcjoKLQkgIGxlZnQgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAoYWRkX3N5bWJvbCwgZmluYWxpemUpOwotCSAgcmlnaHQgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAob3Bfc3ltYm9sLCBmaW5hbGl6ZSk7Ci0JICBzZWdfbGVmdCA9IFNfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2wpOwotCSAgc2VnX3JpZ2h0ID0gU19HRVRfU0VHTUVOVCAob3Bfc3ltYm9sKTsKLQotCSAgLyogU2ltcGxpZnkgYWRkaXRpb24gb3Igc3VidHJhY3Rpb24gb2YgYSBjb25zdGFudCBieSBmb2xkaW5nIHRoZQotCSAgICAgY29uc3RhbnQgaW50byBYX2FkZF9udW1iZXIuICAqLwotCSAgaWYgKG9wID09IE9fYWRkIHx8IG9wID09IE9fc3VidHJhY3QpCi0JICAgIHsKLQkgICAgICBpZiAoc2VnX3JpZ2h0ID09IGFic29sdXRlX3NlY3Rpb24pCi0JCXsKLQkJICBpZiAob3AgPT0gT19hZGQpCi0JCSAgICBmaW5hbF92YWwgKz0gcmlnaHQ7Ci0JCSAgZWxzZQotCQkgICAgZmluYWxfdmFsIC09IHJpZ2h0OwotCQkgIG9wID0gT19zeW1ib2w7Ci0JCSAgb3Bfc3ltYm9sID0gTlVMTDsKLQkJICBnb3RvIGRvX3N5bWJvbDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHNlZ19sZWZ0ID09IGFic29sdXRlX3NlY3Rpb24gJiYgb3AgPT0gT19hZGQpCi0JCXsKLQkJICBvcCA9IE9fc3ltYm9sOwotCQkgIGZpbmFsX3ZhbCArPSBsZWZ0OwotCQkgIGFkZF9zeW1ib2wgPSBvcF9zeW1ib2w7Ci0JCSAgbGVmdCA9IHJpZ2h0OwotCQkgIG9wX3N5bWJvbCA9IE5VTEw7Ci0JCSAgZ290byBkb19zeW1ib2w7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBTdWJ0cmFjdGlvbiBpcyBwZXJtaXR0ZWQgaWYgYm90aCBvcGVyYW5kcyBhcmUgaW4gdGhlIHNhbWUKLQkgICAgIHNlY3Rpb24uICBPdGhlcndpc2UsIGJvdGggb3BlcmFuZHMgbXVzdCBiZSBhYnNvbHV0ZS4gIFdlCi0JICAgICBhbHJlYWR5IGhhbmRsZWQgdGhlIGNhc2Ugb2YgYWRkaXRpb24gb3Igc3VidHJhY3Rpb24gb2YgYQotCSAgICAgY29uc3RhbnQgYWJvdmUuICBUaGlzIHdpbGwgcHJvYmFibHkgbmVlZCB0byBiZSBjaGFuZ2VkCi0JICAgICBmb3IgYW4gb2JqZWN0IGZpbGUgZm9ybWF0IHdoaWNoIHN1cHBvcnRzIGFyYml0cmFyeQotCSAgICAgZXhwcmVzc2lvbnMsIHN1Y2ggYXMgSUVFRS02OTUuICAqLwotCSAgLyogRG9uJ3QgZW1pdCBtZXNzYWdlcyB1bmxlc3Mgd2UncmUgZmluYWxpemluZyB0aGUgc3ltYm9sIHZhbHVlLAotCSAgICAgb3RoZXJ3aXNlIHdlIG1heSBnZXQgdGhlIHNhbWUgbWVzc2FnZSBtdWx0aXBsZSB0aW1lcy4gICovCi0JICBpZiAoKHNlZ19sZWZ0ICE9IGFic29sdXRlX3NlY3Rpb24KLQkgICAgICAgfHwgc2VnX3JpZ2h0ICE9IGFic29sdXRlX3NlY3Rpb24pCi0JICAgICAgJiYgKG9wICE9IE9fc3VidHJhY3QKLQkJICB8fCBzZWdfbGVmdCAhPSBzZWdfcmlnaHQKLQkJICB8fCBzZWdfbGVmdCA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkgICAgICAmJiBmaW5hbGl6ZSkKLQkgICAgewotCSAgICAgIGNoYXIgKmZpbGU7Ci0JICAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0KLQkgICAgICBpZiAoZXhwcl9zeW1ib2xfd2hlcmUgKHN5bXAsICZmaWxlLCAmbGluZSkpCi0JCXsKLQkJICBpZiAoc2VnX2xlZnQgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsCi0JCQkJICBfKCJ1bmRlZmluZWQgc3ltYm9sICVzIGluIG9wZXJhdGlvbiIpLAotCQkJCSAgU19HRVRfTkFNRSAoc3ltcC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sKSk7Ci0JCSAgaWYgKHNlZ19yaWdodCA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwKLQkJCQkgIF8oInVuZGVmaW5lZCBzeW1ib2wgJXMgaW4gb3BlcmF0aW9uIiksCi0JCQkJICBTX0dFVF9OQU1FIChzeW1wLT5zeV92YWx1ZS5YX29wX3N5bWJvbCkpOwotCQkgIGlmIChzZWdfbGVmdCAhPSB1bmRlZmluZWRfc2VjdGlvbgotCQkgICAgICAmJiBzZWdfcmlnaHQgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsIF8oImludmFsaWQgc2VjdGlvbiBmb3Igb3BlcmF0aW9uIikpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHNlZ19sZWZ0ID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICAgYXNfYmFkIChfKCJ1bmRlZmluZWQgc3ltYm9sICVzIGluIG9wZXJhdGlvbiBzZXR0aW5nICVzIiksCi0JCQkgICAgU19HRVRfTkFNRSAoc3ltcC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sKSwKLQkJCSAgICBTX0dFVF9OQU1FIChzeW1wKSk7Ci0JCSAgaWYgKHNlZ19yaWdodCA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgIGFzX2JhZCAoXygidW5kZWZpbmVkIHN5bWJvbCAlcyBpbiBvcGVyYXRpb24gc2V0dGluZyAlcyIpLAotCQkJICAgIFNfR0VUX05BTUUgKHN5bXAtPnN5X3ZhbHVlLlhfb3Bfc3ltYm9sKSwKLQkJCSAgICBTX0dFVF9OQU1FIChzeW1wKSk7Ci0JCSAgaWYgKHNlZ19sZWZ0ICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0JCSAgICAgICYmIHNlZ19yaWdodCAhPSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgIGFzX2JhZCAoXygiaW52YWxpZCBzZWN0aW9uIGZvciBvcGVyYXRpb24gc2V0dGluZyAlcyIpLAotCQkJICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIENoZWNrIGZvciBkaXZpc2lvbiBieSB6ZXJvLiAgKi8KLQkgIGlmICgob3AgPT0gT19kaXZpZGUgfHwgb3AgPT0gT19tb2R1bHVzKSAmJiByaWdodCA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgc2VnX3JpZ2h0IGlzIG5vdCBhYnNvbHV0ZV9zZWN0aW9uLCB0aGVuIHdlJ3ZlCi0gICAgICAgICAgICAgICAgIGFscmVhZHkgaXNzdWVkIGEgd2FybmluZyBhYm91dCB1c2luZyBhIGJhZCBzeW1ib2wuICAqLwotCSAgICAgIGlmIChzZWdfcmlnaHQgPT0gYWJzb2x1dGVfc2VjdGlvbiAmJiBmaW5hbGl6ZSkKLQkJewotCQkgIGNoYXIgKmZpbGU7Ci0JCSAgdW5zaWduZWQgaW50IGxpbmU7Ci0KLQkJICBpZiAoZXhwcl9zeW1ib2xfd2hlcmUgKHN5bXAsICZmaWxlLCAmbGluZSkpCi0JCSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsIF8oImRpdmlzaW9uIGJ5IHplcm8iKSk7Ci0JCSAgZWxzZQotCQkgICAgYXNfYmFkIChfKCJkaXZpc2lvbiBieSB6ZXJvIHdoZW4gc2V0dGluZyAlcyIpLAotCQkJICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQkJfQotCi0JICAgICAgcmlnaHQgPSAxOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoc3ltcC0+c3lfdmFsdWUuWF9vcCkKLQkgICAgewotCSAgICBjYXNlIE9fbXVsdGlwbHk6CQlsZWZ0ICo9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2RpdmlkZToJCWxlZnQgLz0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fbW9kdWx1czoJCWxlZnQgJT0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fbGVmdF9zaGlmdDoJCWxlZnQgPDw9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX3JpZ2h0X3NoaWZ0OgkJbGVmdCA+Pj0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoJbGVmdCB8PSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfb3Jfbm90OgkJbGVmdCB8PSB+cmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X2V4Y2x1c2l2ZV9vcjoJbGVmdCBePSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfYW5kOgkJbGVmdCAmPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19hZGQ6CQkJbGVmdCArPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19zdWJ0cmFjdDoJCWxlZnQgLT0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fZXE6CWxlZnQgPSBsZWZ0ID09IHJpZ2h0ID8gfiAob2Zmc2V0VCkgMCA6IDA7IGJyZWFrOwotCSAgICBjYXNlIE9fbmU6CWxlZnQgPSBsZWZ0ICE9IHJpZ2h0ID8gfiAob2Zmc2V0VCkgMCA6IDA7IGJyZWFrOwotCSAgICBjYXNlIE9fbHQ6CWxlZnQgPSBsZWZ0IDwgIHJpZ2h0ID8gfiAob2Zmc2V0VCkgMCA6IDA7IGJyZWFrOwotCSAgICBjYXNlIE9fbGU6CWxlZnQgPSBsZWZ0IDw9IHJpZ2h0ID8gfiAob2Zmc2V0VCkgMCA6IDA7IGJyZWFrOwotCSAgICBjYXNlIE9fZ2U6CWxlZnQgPSBsZWZ0ID49IHJpZ2h0ID8gfiAob2Zmc2V0VCkgMCA6IDA7IGJyZWFrOwotCSAgICBjYXNlIE9fZ3Q6CWxlZnQgPSBsZWZ0ID4gIHJpZ2h0ID8gfiAob2Zmc2V0VCkgMCA6IDA7IGJyZWFrOwotCSAgICBjYXNlIE9fbG9naWNhbF9hbmQ6CWxlZnQgPSBsZWZ0ICYmIHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2xvZ2ljYWxfb3I6CWxlZnQgPSBsZWZ0IHx8IHJpZ2h0OyBicmVhazsKLQkgICAgZGVmYXVsdDoJCWFib3J0ICgpOwotCSAgICB9Ci0KLQkgIGZpbmFsX3ZhbCArPSBzeW1wLT5zeV9mcmFnLT5mcl9hZGRyZXNzICsgbGVmdDsKLQkgIGlmIChmaW5hbF9zZWcgPT0gZXhwcl9zZWN0aW9uIHx8IGZpbmFsX3NlZyA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkgICAgZmluYWxfc2VnID0gYWJzb2x1dGVfc2VjdGlvbjsKLQkgIHJlc29sdmVkID0gKHN5bWJvbF9yZXNvbHZlZF9wIChhZGRfc3ltYm9sKQotCQkgICAgICAmJiBzeW1ib2xfcmVzb2x2ZWRfcCAob3Bfc3ltYm9sKSk7Ci0gICAJICBicmVhazsKLQotCWNhc2UgT19yZWdpc3RlcjoKLQljYXNlIE9fYmlnOgotCWNhc2UgT19pbGxlZ2FsOgotCSAgLyogR2l2ZSBhbiBlcnJvciAoYmVsb3cpIGlmIG5vdCBpbiBleHByX3NlY3Rpb24uICBXZSBkb24ndAotCSAgICAgd2FudCB0byB3b3JyeSBhYm91dCBleHByX3NlY3Rpb24gc3ltYm9scywgYmVjYXVzZSB0aGV5Ci0JICAgICBhcmUgZmljdGlvbmFsICh0aGV5IGFyZSBjcmVhdGVkIGFzIHBhcnQgb2YgZXhwcmVzc2lvbgotCSAgICAgcmVzb2x1dGlvbiksIGFuZCBhbnkgcHJvYmxlbXMgbWF5IG5vdCBhY3R1YWxseSBtZWFuCi0JICAgICBhbnl0aGluZy4gICovCi0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN5bXAtPnN5X3Jlc29sdmluZyA9IDA7Ci0gICAgfQotCi0gIGlmIChmaW5hbGl6ZSkKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltcCwgZmluYWxfdmFsKTsKLQotI2lmIGRlZmluZWQgKE9CSl9BT1VUKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gICAgICAvKiBUaGUgb2xkIGEub3V0IGJhY2tlbmQgZG9lcyBub3QgaGFuZGxlIFNfU0VUX1NFR01FTlQgY29ycmVjdGx5Ci0gICAgICAgICBmb3IgYSBzdGFiIHN5bWJvbCwgc28gd2UgdXNlIHRoaXMgYmFkIGhhY2suICAqLwotICAgICAgaWYgKGZpbmFsX3NlZyAhPSBTX0dFVF9TRUdNRU5UIChzeW1wKSkKLSNlbmRpZgotCVNfU0VUX1NFR01FTlQgKHN5bXAsIGZpbmFsX3NlZyk7Ci0gICAgfQotCi1leGl0X2RvbnRfc2V0X3ZhbHVlOgotICAvKiBEb24ndCB3b3JyeSBpZiB3ZSBjYW4ndCByZXNvbHZlIGFuIGV4cHJfc2VjdGlvbiBzeW1ib2wuICAqLwotICBpZiAoZmluYWxpemUpCi0gICAgewotICAgICAgaWYgKHJlc29sdmVkKQotCXN5bXAtPnN5X3Jlc29sdmVkID0gMTsKLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bXApICE9IGV4cHJfc2VjdGlvbikKLQl7Ci0JICBhc19iYWQgKF8oImNhbid0IHJlc29sdmUgdmFsdWUgZm9yIHN5bWJvbCBcIiVzXCIiKSwgU19HRVRfTkFNRSAoc3ltcCkpOwotCSAgc3ltcC0+c3lfcmVzb2x2ZWQgPSAxOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZpbmFsX3ZhbDsKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotc3RhdGljIHZvaWQgcmVzb2x2ZV9sb2NhbF9zeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqLCBQVFIpKTsKLQotLyogQSBzdGF0aWMgZnVuY3Rpb24gcGFzc2VkIHRvIGhhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgdm9pZAotcmVzb2x2ZV9sb2NhbF9zeW1ib2wgKGtleSwgdmFsdWUpCi0gICAgIGNvbnN0IGNoYXIgKmtleSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBQVFIgdmFsdWU7Ci17Ci0gIGlmICh2YWx1ZSAhPSBOVUxMKQotICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlICh2YWx1ZSwgMSk7Ci19Ci0KLSNlbmRpZgotCi0vKiBSZXNvbHZlIGFsbCBsb2NhbCBzeW1ib2xzLiAgKi8KLQotdm9pZAotcmVzb2x2ZV9sb2NhbF9zeW1ib2xfdmFsdWVzICgpCi17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBoYXNoX3RyYXZlcnNlIChsb2NhbF9oYXNoLCByZXNvbHZlX2xvY2FsX3N5bWJvbCk7Ci0jZW5kaWYKLX0KLQotLyogRG9sbGFyIGxhYmVscyBsb29rIGxpa2UgYSBudW1iZXIgZm9sbG93ZWQgYnkgYSBkb2xsYXIgc2lnbi4gIEVnLCAiNDIkIi4KLSAgIFRoZXkgYXJlICpyZWFsbHkqIGxvY2FsLiAgVGhhdCBpcywgdGhleSBnbyBvdXQgb2Ygc2NvcGUgd2hlbmV2ZXIgd2Ugc2VlIGEKLSAgIGxhYmVsIHRoYXQgaXNuJ3QgbG9jYWwuICBBbHNvLCBsaWtlIGZiIGxhYmVscywgdGhlcmUgY2FuIGJlIG11bHRpcGxlCi0gICBpbnN0YW5jZXMgb2YgYSBkb2xsYXIgbGFiZWwuICBUaGVyZWZvciwgd2UgbmFtZSBlbmNvZGUgZWFjaCBpbnN0YW5jZSB3aXRoCi0gICB0aGUgaW5zdGFuY2UgbnVtYmVyLCBrZWVwIGEgbGlzdCBvZiBkZWZpbmVkIHN5bWJvbHMgc2VwYXJhdGUgZnJvbSB0aGUgcmVhbAotICAgc3ltYm9sIHRhYmxlLCBhbmQgd2UgdHJlYXQgdGhlc2UgYnVnZ2VycyBhcyBhIHNwYXJzZSBhcnJheS4gICovCi0KLXN0YXRpYyBsb25nICpkb2xsYXJfbGFiZWxzOwotc3RhdGljIGxvbmcgKmRvbGxhcl9sYWJlbF9pbnN0YW5jZXM7Ci1zdGF0aWMgY2hhciAqZG9sbGFyX2xhYmVsX2RlZmluZXM7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBkb2xsYXJfbGFiZWxfY291bnQ7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBkb2xsYXJfbGFiZWxfbWF4OwotCi1pbnQgCi1kb2xsYXJfbGFiZWxfZGVmaW5lZCAobGFiZWwpCi0gICAgIGxvbmcgbGFiZWw7Ci17Ci0gIGxvbmcgKmk7Ci0KLSAga25vdyAoKGRvbGxhcl9sYWJlbHMgIT0gTlVMTCkgfHwgKGRvbGxhcl9sYWJlbF9jb3VudCA9PSAwKSk7Ci0KLSAgZm9yIChpID0gZG9sbGFyX2xhYmVsczsgaSA8IGRvbGxhcl9sYWJlbHMgKyBkb2xsYXJfbGFiZWxfY291bnQ7ICsraSkKLSAgICBpZiAoKmkgPT0gbGFiZWwpCi0gICAgICByZXR1cm4gZG9sbGFyX2xhYmVsX2RlZmluZXNbaSAtIGRvbGxhcl9sYWJlbHNdOwotCi0gIC8qIGlmIHdlIGdldCBoZXJlLCBsYWJlbCBpc24ndCBkZWZpbmVkICovCi0gIHJldHVybiAwOwotfQkJCQkvKiBkb2xsYXJfbGFiZWxfZGVmaW5lZCgpICovCi0KLXN0YXRpYyBsb25nCi1kb2xsYXJfbGFiZWxfaW5zdGFuY2UgKGxhYmVsKQotICAgICBsb25nIGxhYmVsOwotewotICBsb25nICppOwotCi0gIGtub3cgKChkb2xsYXJfbGFiZWxzICE9IE5VTEwpIHx8IChkb2xsYXJfbGFiZWxfY291bnQgPT0gMCkpOwotCi0gIGZvciAoaSA9IGRvbGxhcl9sYWJlbHM7IGkgPCBkb2xsYXJfbGFiZWxzICsgZG9sbGFyX2xhYmVsX2NvdW50OyArK2kpCi0gICAgaWYgKCppID09IGxhYmVsKQotICAgICAgcmV0dXJuIChkb2xsYXJfbGFiZWxfaW5zdGFuY2VzW2kgLSBkb2xsYXJfbGFiZWxzXSk7Ci0KLSAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGhhdmVuJ3Qgc2VlbiB0aGUgbGFiZWwgYmVmb3JlLCB0aGVyZWZvcmUgaXRzIGluc3RhbmNlCi0gICAgIGNvdW50IGlzIHplcm8uICAqLwotICByZXR1cm4gMDsKLX0KLQotdm9pZCAKLWRvbGxhcl9sYWJlbF9jbGVhciAoKQotewotICBtZW1zZXQgKGRvbGxhcl9sYWJlbF9kZWZpbmVzLCAnXDAnLCAodW5zaWduZWQgaW50KSBkb2xsYXJfbGFiZWxfY291bnQpOwotfQotCi0jZGVmaW5lIERPTExBUl9MQUJFTF9CVU1QX0JZIDEwCi0KLXZvaWQgCi1kZWZpbmVfZG9sbGFyX2xhYmVsIChsYWJlbCkKLSAgICAgbG9uZyBsYWJlbDsKLXsKLSAgbG9uZyAqaTsKLQotICBmb3IgKGkgPSBkb2xsYXJfbGFiZWxzOyBpIDwgZG9sbGFyX2xhYmVscyArIGRvbGxhcl9sYWJlbF9jb3VudDsgKytpKQotICAgIGlmICgqaSA9PSBsYWJlbCkKLSAgICAgIHsKLQkrK2RvbGxhcl9sYWJlbF9pbnN0YW5jZXNbaSAtIGRvbGxhcl9sYWJlbHNdOwotCWRvbGxhcl9sYWJlbF9kZWZpbmVzW2kgLSBkb2xsYXJfbGFiZWxzXSA9IDE7Ci0JcmV0dXJuOwotICAgICAgfQotCi0gIC8qIGlmIHdlIGdldCB0byBoZXJlLCB3ZSBkb24ndCBoYXZlIGxhYmVsIGxpc3RlZCB5ZXQuICovCi0KLSAgaWYgKGRvbGxhcl9sYWJlbHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkb2xsYXJfbGFiZWxzID0gKGxvbmcgKikgeG1hbGxvYyAoRE9MTEFSX0xBQkVMX0JVTVBfQlkgKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGRvbGxhcl9sYWJlbF9pbnN0YW5jZXMgPSAobG9uZyAqKSB4bWFsbG9jIChET0xMQVJfTEFCRUxfQlVNUF9CWSAqIHNpemVvZiAobG9uZykpOwotICAgICAgZG9sbGFyX2xhYmVsX2RlZmluZXMgPSB4bWFsbG9jIChET0xMQVJfTEFCRUxfQlVNUF9CWSk7Ci0gICAgICBkb2xsYXJfbGFiZWxfbWF4ID0gRE9MTEFSX0xBQkVMX0JVTVBfQlk7Ci0gICAgICBkb2xsYXJfbGFiZWxfY291bnQgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoZG9sbGFyX2xhYmVsX2NvdW50ID09IGRvbGxhcl9sYWJlbF9tYXgpCi0gICAgewotICAgICAgZG9sbGFyX2xhYmVsX21heCArPSBET0xMQVJfTEFCRUxfQlVNUF9CWTsKLSAgICAgIGRvbGxhcl9sYWJlbHMgPSAobG9uZyAqKSB4cmVhbGxvYyAoKGNoYXIgKikgZG9sbGFyX2xhYmVscywKLQkJCQkJIGRvbGxhcl9sYWJlbF9tYXggKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGRvbGxhcl9sYWJlbF9pbnN0YW5jZXMgPSAobG9uZyAqKSB4cmVhbGxvYyAoKGNoYXIgKikgZG9sbGFyX2xhYmVsX2luc3RhbmNlcywKLQkJCQkJICBkb2xsYXJfbGFiZWxfbWF4ICogc2l6ZW9mIChsb25nKSk7Ci0gICAgICBkb2xsYXJfbGFiZWxfZGVmaW5lcyA9IHhyZWFsbG9jIChkb2xsYXJfbGFiZWxfZGVmaW5lcywgZG9sbGFyX2xhYmVsX21heCk7Ci0gICAgfQkJCQkvKiBpZiB3ZSBuZWVkZWQgdG8gZ3JvdyAqLwotCi0gIGRvbGxhcl9sYWJlbHNbZG9sbGFyX2xhYmVsX2NvdW50XSA9IGxhYmVsOwotICBkb2xsYXJfbGFiZWxfaW5zdGFuY2VzW2RvbGxhcl9sYWJlbF9jb3VudF0gPSAxOwotICBkb2xsYXJfbGFiZWxfZGVmaW5lc1tkb2xsYXJfbGFiZWxfY291bnRdID0gMTsKLSAgKytkb2xsYXJfbGFiZWxfY291bnQ7Ci19Ci0KLS8qCi0gKgkJCWRvbGxhcl9sYWJlbF9uYW1lKCkKLSAqCi0gKiBDYWxsZXIgbXVzdCBjb3B5IHJldHVybmVkIG5hbWU6IHdlIHJlLXVzZSB0aGUgYXJlYSBmb3IgdGhlIG5leHQgbmFtZS4KLSAqCi0gKiBUaGUgbXRoIG9jY3VyZW5jZSBvZiBsYWJlbCBuOiBpcyB0dXJuZWQgaW50byB0aGUgc3ltYm9sICJMbl5BbSIKLSAqIHdoZXJlIG4gaXMgdGhlIGxhYmVsIG51bWJlciBhbmQgbSBpcyB0aGUgaW5zdGFuY2UgbnVtYmVyLiAiTCIgbWFrZXMKLSAqIGl0IGEgbGFiZWwgZGlzY2FyZGVkIHVubGVzcyBkZWJ1Z2dpbmcgYW5kICJeQSIoJ1wxJykgZW5zdXJlcyBubwotICogb3JkaW5hcnkgc3ltYm9sIFNIT1VMRCBnZXQgdGhlIHNhbWUgbmFtZSBhcyBhIGxvY2FsIGxhYmVsCi0gKiBzeW1ib2wuIFRoZSBmaXJzdCAiNDoiIGlzICJMNF5BMSIgLSB0aGUgbSBudW1iZXJzIGJlZ2luIGF0IDEuCi0gKgotICogZmIgbGFiZWxzIGdldCB0aGUgc2FtZSB0cmVhdG1lbnQsIGV4Y2VwdCB0aGF0IF5CIGlzIHVzZWQgaW4gcGxhY2Ugb2YgXkEuCi0gKi8KLQotY2hhciAqCQkJCS8qIFJldHVybiBsb2NhbCBsYWJlbCBuYW1lLiAqLwotZG9sbGFyX2xhYmVsX25hbWUgKG4sIGF1Z2VuZCkKLSAgICAgcmVnaXN0ZXIgbG9uZyBuOwkJLyogd2UganVzdCBzYXcgIm4kOiIgOiBuIGEgbnVtYmVyICovCi0gICAgIHJlZ2lzdGVyIGludCBhdWdlbmQ7CS8qIDAgZm9yIGN1cnJlbnQgaW5zdGFuY2UsIDEgZm9yIG5ldyBpbnN0YW5jZSAqLwotewotICBsb25nIGk7Ci0gIC8qIFJldHVybmVkIHRvIGNhbGxlciwgdGhlbiBjb3BpZWQuICB1c2VkIGZvciBjcmVhdGVkIG5hbWVzICgiNGYiKSAqLwotICBzdGF0aWMgY2hhciBzeW1ib2xfbmFtZV9idWlsZFsyNF07Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIGNoYXIgKnE7Ci0gIGNoYXIgc3ltYm9sX25hbWVfdGVtcG9yYXJ5WzIwXTsJLyogYnVpbGQgdXAgYSBudW1iZXIsIEJBQ0tXQVJEUyAqLwotCi0gIGtub3cgKG4gPj0gMCk7Ci0gIGtub3cgKGF1Z2VuZCA9PSAwIHx8IGF1Z2VuZCA9PSAxKTsKLSAgcCA9IHN5bWJvbF9uYW1lX2J1aWxkOwotI2lmZGVmIExPQ0FMX0xBQkVMX1BSRUZJWAotICAqcCsrID0gTE9DQUxfTEFCRUxfUFJFRklYOwotI2VuZGlmCi0gICpwKysgPSAnTCc7Ci0KLSAgLyogTmV4dCBjb2RlIGp1c3QgZG9lcyBzcHJpbnRmKCB7fSwgIiVkIiwgbik7ICovCi0gIC8qIGxhYmVsIG51bWJlciAqLwotICBxID0gc3ltYm9sX25hbWVfdGVtcG9yYXJ5OwotICBmb3IgKCpxKysgPSAwLCBpID0gbjsgaTsgKytxKQotICAgIHsKLSAgICAgICpxID0gaSAlIDEwICsgJzAnOwotICAgICAgaSAvPSAxMDsKLSAgICB9Ci0gIHdoaWxlICgoKnAgPSAqLS1xKSAhPSAnXDAnKQotICAgICsrcDsKLQotICAqcCsrID0gMTsJCQkvKiBeQSAqLwotCi0gIC8qIGluc3RhbmNlIG51bWJlciAqLwotICBxID0gc3ltYm9sX25hbWVfdGVtcG9yYXJ5OwotICBmb3IgKCpxKysgPSAwLCBpID0gZG9sbGFyX2xhYmVsX2luc3RhbmNlIChuKSArIGF1Z2VuZDsgaTsgKytxKQotICAgIHsKLSAgICAgICpxID0gaSAlIDEwICsgJzAnOwotICAgICAgaSAvPSAxMDsKLSAgICB9Ci0gIHdoaWxlICgoKnArKyA9ICotLXEpICE9ICdcMCcpOzsKLQotICAvKiBUaGUgbGFiZWwsIGFzIGEgJ1wwJyBlbmRlZCBzdHJpbmcsIHN0YXJ0cyBhdCBzeW1ib2xfbmFtZV9idWlsZC4gKi8KLSAgcmV0dXJuIHN5bWJvbF9uYW1lX2J1aWxkOwotfQotCi0vKgotICogU29tYm9keSBlbHNlJ3MgaWRlYSBvZiBsb2NhbCBsYWJlbHMuIFRoZXkgYXJlIG1hZGUgYnkgIm46IiB3aGVyZSBuCi0gKiBpcyBhbnkgZGVjaW1hbCBkaWdpdC4gUmVmZXIgdG8gdGhlbSB3aXRoCi0gKiAgIm5iIiBmb3IgcHJldmlvdXMgKGJhY2t3YXJkKSBuOgotICogIG9yICJuZiIgZm9yIG5leHQgKGZvcndhcmQpIG46LgotICoKLSAqIFdlIGRvIGEgbGl0dGxlIGJldHRlciBhbmQgbGV0IG4gYmUgYW55IG51bWJlciwgbm90IGp1c3QgYSBzaW5nbGUgZGlnaXQsIGJ1dAotICogc2luY2UgdGhlIG90aGVyIGd1eSdzIGFzc2VtYmxlciBvbmx5IGRvZXMgdGVuLCB3ZSB0cmVhdCB0aGUgZmlyc3QgdGVuCi0gKiBzcGVjaWFsbHkuCi0gKgotICogTGlrZSBzb21lb25lIGVsc2UncyBhc3NlbWJsZXIsIHdlIGhhdmUgb25lIHNldCBvZiBsb2NhbCBsYWJlbCBjb3VudGVycyBmb3IKLSAqIGVudGlyZSBhc3NlbWJseSwgbm90IG9uZSBzZXQgcGVyIChzdWIpc2VnbWVudCBsaWtlIGluIG1vc3QgYXNzZW1ibGVycy4gVGhpcwotICogaW1wbGllcyB0aGF0IG9uZSBjYW4gcmVmZXIgdG8gYSBsYWJlbCBpbiBhbm90aGVyIHNlZ21lbnQsIGFuZCBpbmRlZWQgc29tZQotICogY3J1ZnR5IGNvbXBpbGVycyBoYXZlIGRvbmUganVzdCB0aGF0LgotICoKLSAqIFNpbmNlIHRoZXJlIGNvdWxkIGJlIGEgTE9UIG9mIHRoZXNlIHRoaW5ncywgdHJlYXQgdGhlbSBhcyBhIHNwYXJzZSBhcnJheS4KLSAqLwotCi0jZGVmaW5lIEZCX0xBQkVMX1NQRUNJQUwgKDEwKQotCi1zdGF0aWMgbG9uZyBmYl9sb3dfY291bnRlcltGQl9MQUJFTF9TUEVDSUFMXTsKLXN0YXRpYyBsb25nICpmYl9sYWJlbHM7Ci1zdGF0aWMgbG9uZyAqZmJfbGFiZWxfaW5zdGFuY2VzOwotc3RhdGljIGxvbmcgZmJfbGFiZWxfY291bnQ7Ci1zdGF0aWMgbG9uZyBmYl9sYWJlbF9tYXg7Ci0KLS8qIHRoaXMgbXVzdCBiZSBtb3JlIHRoYW4gRkJfTEFCRUxfU1BFQ0lBTCAqLwotI2RlZmluZSBGQl9MQUJFTF9CVU1QX0JZIChGQl9MQUJFTF9TUEVDSUFMICsgNikKLQotc3RhdGljIHZvaWQgCi1mYl9sYWJlbF9pbml0ICgpCi17Ci0gIG1lbXNldCAoKHZvaWQgKikgZmJfbG93X2NvdW50ZXIsICdcMCcsIHNpemVvZiAoZmJfbG93X2NvdW50ZXIpKTsKLX0JCQkJLyogZmJfbGFiZWxfaW5pdCgpICovCi0KLS8qIGFkZCBvbmUgdG8gdGhlIGluc3RhbmNlIG51bWJlciBvZiB0aGlzIGZiIGxhYmVsICovCi12b2lkIAotZmJfbGFiZWxfaW5zdGFuY2VfaW5jIChsYWJlbCkKLSAgICAgbG9uZyBsYWJlbDsKLXsKLSAgbG9uZyAqaTsKLQotICBpZiAobGFiZWwgPCBGQl9MQUJFTF9TUEVDSUFMKQotICAgIHsKLSAgICAgICsrZmJfbG93X2NvdW50ZXJbbGFiZWxdOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZmJfbGFiZWxzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gZmJfbGFiZWxzICsgRkJfTEFCRUxfU1BFQ0lBTDsKLQkgICBpIDwgZmJfbGFiZWxzICsgZmJfbGFiZWxfY291bnQ7ICsraSkKLQl7Ci0JICBpZiAoKmkgPT0gbGFiZWwpCi0JICAgIHsKLQkgICAgICArK2ZiX2xhYmVsX2luc3RhbmNlc1tpIC0gZmJfbGFiZWxzXTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0JCQkvKiBpZiB3ZSBmaW5kIGl0ICovCi0JfQkJCS8qIGZvciBlYWNoIGV4aXN0aW5nIGxhYmVsICovCi0gICAgfQotCi0gIC8qIGlmIHdlIGdldCB0byBoZXJlLCB3ZSBkb24ndCBoYXZlIGxhYmVsIGxpc3RlZCB5ZXQuICovCi0KLSAgaWYgKGZiX2xhYmVscyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZiX2xhYmVscyA9IChsb25nICopIHhtYWxsb2MgKEZCX0xBQkVMX0JVTVBfQlkgKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGZiX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhtYWxsb2MgKEZCX0xBQkVMX0JVTVBfQlkgKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGZiX2xhYmVsX21heCA9IEZCX0xBQkVMX0JVTVBfQlk7Ci0gICAgICBmYl9sYWJlbF9jb3VudCA9IEZCX0xBQkVMX1NQRUNJQUw7Ci0KLSAgICB9Ci0gIGVsc2UgaWYgKGZiX2xhYmVsX2NvdW50ID09IGZiX2xhYmVsX21heCkKLSAgICB7Ci0gICAgICBmYl9sYWJlbF9tYXggKz0gRkJfTEFCRUxfQlVNUF9CWTsKLSAgICAgIGZiX2xhYmVscyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBmYl9sYWJlbHMsCi0JCQkJICAgICBmYl9sYWJlbF9tYXggKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGZiX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBmYl9sYWJlbF9pbnN0YW5jZXMsCi0JCQkJCSAgICAgIGZiX2xhYmVsX21heCAqIHNpemVvZiAobG9uZykpOwotICAgIH0JCQkJLyogaWYgd2UgbmVlZGVkIHRvIGdyb3cgKi8KLQotICBmYl9sYWJlbHNbZmJfbGFiZWxfY291bnRdID0gbGFiZWw7Ci0gIGZiX2xhYmVsX2luc3RhbmNlc1tmYl9sYWJlbF9jb3VudF0gPSAxOwotICArK2ZiX2xhYmVsX2NvdW50OwotfQotCi1zdGF0aWMgbG9uZyAKLWZiX2xhYmVsX2luc3RhbmNlIChsYWJlbCkKLSAgICAgbG9uZyBsYWJlbDsKLXsKLSAgbG9uZyAqaTsKLQotICBpZiAobGFiZWwgPCBGQl9MQUJFTF9TUEVDSUFMKQotICAgIHsKLSAgICAgIHJldHVybiAoZmJfbG93X2NvdW50ZXJbbGFiZWxdKTsKLSAgICB9Ci0KLSAgaWYgKGZiX2xhYmVscyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IGZiX2xhYmVscyArIEZCX0xBQkVMX1NQRUNJQUw7Ci0JICAgaSA8IGZiX2xhYmVscyArIGZiX2xhYmVsX2NvdW50OyArK2kpCi0JewotCSAgaWYgKCppID09IGxhYmVsKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIChmYl9sYWJlbF9pbnN0YW5jZXNbaSAtIGZiX2xhYmVsc10pOwotCSAgICB9CQkJLyogaWYgd2UgZmluZCBpdCAqLwotCX0JCQkvKiBmb3IgZWFjaCBleGlzdGluZyBsYWJlbCAqLwotICAgIH0KLQotICAvKiBXZSBkaWRuJ3QgZmluZCB0aGUgbGFiZWwsIHNvIHRoaXMgbXVzdCBiZSBhIHJlZmVyZW5jZSB0byB0aGUKLSAgICAgZmlyc3QgaW5zdGFuY2UuICAqLwotICByZXR1cm4gMDsKLX0KLQotLyoKLSAqCQkJZmJfbGFiZWxfbmFtZSgpCi0gKgotICogQ2FsbGVyIG11c3QgY29weSByZXR1cm5lZCBuYW1lOiB3ZSByZS11c2UgdGhlIGFyZWEgZm9yIHRoZSBuZXh0IG5hbWUuCi0gKgotICogVGhlIG10aCBvY2N1cmVuY2Ugb2YgbGFiZWwgbjogaXMgdHVybmVkIGludG8gdGhlIHN5bWJvbCAiTG5eQm0iCi0gKiB3aGVyZSBuIGlzIHRoZSBsYWJlbCBudW1iZXIgYW5kIG0gaXMgdGhlIGluc3RhbmNlIG51bWJlci4gIkwiIG1ha2VzCi0gKiBpdCBhIGxhYmVsIGRpc2NhcmRlZCB1bmxlc3MgZGVidWdnaW5nIGFuZCAiXkIiKCdcMicpIGVuc3VyZXMgbm8KLSAqIG9yZGluYXJ5IHN5bWJvbCBTSE9VTEQgZ2V0IHRoZSBzYW1lIG5hbWUgYXMgYSBsb2NhbCBsYWJlbAotICogc3ltYm9sLiBUaGUgZmlyc3QgIjQ6IiBpcyAiTDReQjEiIC0gdGhlIG0gbnVtYmVycyBiZWdpbiBhdCAxLgotICoKLSAqIGRvbGxhciBsYWJlbHMgZ2V0IHRoZSBzYW1lIHRyZWF0bWVudCwgZXhjZXB0IHRoYXQgXkEgaXMgdXNlZCBpbiBwbGFjZSBvZiBeQi4gKi8KLQotY2hhciAqCQkJCS8qIFJldHVybiBsb2NhbCBsYWJlbCBuYW1lLiAqLwotZmJfbGFiZWxfbmFtZSAobiwgYXVnZW5kKQotICAgICBsb25nIG47CQkJLyogd2UganVzdCBzYXcgIm46IiwgIm5mIiBvciAibmIiIDogbiBhIG51bWJlciAqLwotICAgICBsb25nIGF1Z2VuZDsJCS8qIDAgZm9yIG5iLCAxIGZvciBuOiwgbmYgKi8KLXsKLSAgbG9uZyBpOwotICAvKiBSZXR1cm5lZCB0byBjYWxsZXIsIHRoZW4gY29waWVkLiAgdXNlZCBmb3IgY3JlYXRlZCBuYW1lcyAoIjRmIikgKi8KLSAgc3RhdGljIGNoYXIgc3ltYm9sX25hbWVfYnVpbGRbMjRdOwotICByZWdpc3RlciBjaGFyICpwOwotICByZWdpc3RlciBjaGFyICpxOwotICBjaGFyIHN5bWJvbF9uYW1lX3RlbXBvcmFyeVsyMF07CS8qIGJ1aWxkIHVwIGEgbnVtYmVyLCBCQUNLV0FSRFMgKi8KLQotICBrbm93IChuID49IDApOwotICBrbm93IChhdWdlbmQgPT0gMCB8fCBhdWdlbmQgPT0gMSk7Ci0gIHAgPSBzeW1ib2xfbmFtZV9idWlsZDsKLSAgKnArKyA9ICdMJzsKLQotICAvKiBOZXh0IGNvZGUganVzdCBkb2VzIHNwcmludGYoIHt9LCAiJWQiLCBuKTsgKi8KLSAgLyogbGFiZWwgbnVtYmVyICovCi0gIHEgPSBzeW1ib2xfbmFtZV90ZW1wb3Jhcnk7Ci0gIGZvciAoKnErKyA9IDAsIGkgPSBuOyBpOyArK3EpCi0gICAgewotICAgICAgKnEgPSBpICUgMTAgKyAnMCc7Ci0gICAgICBpIC89IDEwOwotICAgIH0KLSAgd2hpbGUgKCgqcCA9ICotLXEpICE9ICdcMCcpCi0gICAgKytwOwotCi0gICpwKysgPSAyOwkJCS8qIF5CICovCi0KLSAgLyogaW5zdGFuY2UgbnVtYmVyICovCi0gIHEgPSBzeW1ib2xfbmFtZV90ZW1wb3Jhcnk7Ci0gIGZvciAoKnErKyA9IDAsIGkgPSBmYl9sYWJlbF9pbnN0YW5jZSAobikgKyBhdWdlbmQ7IGk7ICsrcSkKLSAgICB7Ci0gICAgICAqcSA9IGkgJSAxMCArICcwJzsKLSAgICAgIGkgLz0gMTA7Ci0gICAgfQotICB3aGlsZSAoKCpwKysgPSAqLS1xKSAhPSAnXDAnKTs7Ci0KLSAgLyogVGhlIGxhYmVsLCBhcyBhICdcMCcgZW5kZWQgc3RyaW5nLCBzdGFydHMgYXQgc3ltYm9sX25hbWVfYnVpbGQuICovCi0gIHJldHVybiAoc3ltYm9sX25hbWVfYnVpbGQpOwotfQkJCQkvKiBmYl9sYWJlbF9uYW1lKCkgKi8KLQotLyoKLSAqIGRlY29kZSBuYW1lIHRoYXQgbWF5IGhhdmUgYmVlbiBnZW5lcmF0ZWQgYnkgZm9vX2xhYmVsX25hbWUoKSBhYm92ZS4gIElmCi0gKiB0aGUgbmFtZSB3YXNuJ3QgZ2VuZXJhdGVkIGJ5IGZvb19sYWJlbF9uYW1lKCksIHRoZW4gcmV0dXJuIGl0IHVuYWx0ZXJlZC4KLSAqIFRoaXMgaXMgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuCi0gKi8KLQotY2hhciAqCi1kZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSAocykKLSAgICAgY2hhciAqczsKLXsKLSAgY2hhciAqcDsKLSAgY2hhciAqc3ltYm9sX2RlY29kZTsKLSAgaW50IGxhYmVsX251bWJlcjsKLSAgaW50IGluc3RhbmNlX251bWJlcjsKLSAgY2hhciAqdHlwZTsKLSAgY29uc3QgY2hhciAqbWVzc2FnZV9mb3JtYXQgPSBfKCJcIiVkXCIgKGluc3RhbmNlIG51bWJlciAlZCBvZiBhICVzIGxhYmVsKSIpOwotCi0gIGlmIChzWzBdICE9ICdMJykKLSAgICByZXR1cm4gczsKLQotICBmb3IgKGxhYmVsX251bWJlciA9IDAsIHAgPSBzICsgMTsgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKTsgKytwKQotICAgIGxhYmVsX251bWJlciA9ICgxMCAqIGxhYmVsX251bWJlcikgKyAqcCAtICcwJzsKLQotICBpZiAoKnAgPT0gMSkKLSAgICB0eXBlID0gImRvbGxhciI7Ci0gIGVsc2UgaWYgKCpwID09IDIpCi0gICAgdHlwZSA9ICJmYiI7Ci0gIGVsc2UKLSAgICByZXR1cm4gczsKLQotICBmb3IgKGluc3RhbmNlX251bWJlciA9IDAsIHArKzsgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKTsgKytwKQotICAgIGluc3RhbmNlX251bWJlciA9ICgxMCAqIGluc3RhbmNlX251bWJlcikgKyAqcCAtICcwJzsKLQotICBzeW1ib2xfZGVjb2RlID0gb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzdHJsZW4gKG1lc3NhZ2VfZm9ybWF0KSArIDMwKTsKLSAgc3ByaW50ZiAoc3ltYm9sX2RlY29kZSwgbWVzc2FnZV9mb3JtYXQsIGxhYmVsX251bWJlciwgaW5zdGFuY2VfbnVtYmVyLCB0eXBlKTsKLQotICByZXR1cm4gc3ltYm9sX2RlY29kZTsKLX0KLQotLyogR2V0IHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gICovCi0KLXZhbHVlVAotU19HRVRfVkFMVUUgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpLT5sc3lfb2Zmc2V0OwotI2VuZGlmCi0KLSAgaWYgKCFzLT5zeV9yZXNvbHZlZCAmJiBzLT5zeV92YWx1ZS5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHMsIDEpOwotICBpZiAocy0+c3lfdmFsdWUuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIHN0YXRpYyBzeW1ib2xTICpyZWN1cjsKLQotICAgICAgLyogRklYTUU6IEluIG5vbiBCRkQgYXNzZW1ibGVycywgU19JU19ERUZJTkVEIGFuZCBTX0lTX0NPTU1PTgotICAgICAgICAgbWF5IGNhbGwgU19HRVRfVkFMVUUuICBXZSB1c2UgYSBzdGF0aWMgc3ltYm9sIHRvIGF2b2lkIHRoZQotICAgICAgICAgaW1tZWRpYXRlIHJlY3Vyc2lvbi4gICovCi0gICAgICBpZiAocmVjdXIgPT0gcykKLQlyZXR1cm4gKHZhbHVlVCkgcy0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOwotICAgICAgcmVjdXIgPSBzOwotICAgICAgaWYgKCEgcy0+c3lfcmVzb2x2ZWQKLQkgIHx8IHMtPnN5X3ZhbHVlLlhfb3AgIT0gT19zeW1ib2wKLQkgIHx8IChTX0lTX0RFRklORUQgKHMpICYmICEgU19JU19DT01NT04gKHMpKSkKLQlhc19iYWQgKF8oIkF0dGVtcHQgdG8gZ2V0IHZhbHVlIG9mIHVucmVzb2x2ZWQgc3ltYm9sICVzIiksCi0JCVNfR0VUX05BTUUgKHMpKTsKLSAgICAgIHJlY3VyID0gTlVMTDsKLSAgICB9Ci0gIHJldHVybiAodmFsdWVUKSBzLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci19Ci0KLS8qIFNldCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wuICAqLwotCi12b2lkCi1TX1NFVF9WQUxVRSAocywgdmFsKQotICAgICBzeW1ib2xTICpzOwotICAgICB2YWx1ZVQgdmFsOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgewotICAgICAgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpLT5sc3lfb2Zmc2V0ID0gdmFsOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gIHMtPnN5X3ZhbHVlLlhfb3AgPSBPX2NvbnN0YW50OwotICBzLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPSAob2Zmc2V0VCkgdmFsOwotICBzLT5zeV92YWx1ZS5YX3Vuc2lnbmVkID0gMDsKLX0KLQotdm9pZAotY29weV9zeW1ib2xfYXR0cmlidXRlcyAoZGVzdCwgc3JjKQotICAgICBzeW1ib2xTICpkZXN0LCAqc3JjOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChkZXN0KSkKLSAgICBkZXN0ID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIGRlc3QpOwotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzcmMpKQotICAgIHNyYyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzcmMpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBJbiBhbiBleHByZXNzaW9uLCB0cmFuc2ZlciB0aGUgc2V0dGluZ3Mgb2YgdGhlc2UgZmxhZ3MuCi0gICAgIFRoZSB1c2VyIGNhbiBvdmVycmlkZSBsYXRlciwgb2YgY291cnNlLiAgKi8KLSNkZWZpbmUgQ09QSUVEX1NZTUZMQUdTCShCU0ZfRlVOQ1RJT04gfCBCU0ZfT0JKRUNUKQotICBkZXN0LT5ic3ltLT5mbGFncyB8PSBzcmMtPmJzeW0tPmZsYWdzICYgQ09QSUVEX1NZTUZMQUdTOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUwotICBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyAoZGVzdCwgc3JjKTsKLSNlbmRpZgotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1pbnQKLVNfSVNfRlVOQ1RJT04gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotCi0gIGZsYWdzID0gcy0+YnN5bS0+ZmxhZ3M7Ci0KLSAgcmV0dXJuIChmbGFncyAmIEJTRl9GVU5DVElPTikgIT0gMDsKLX0KLQotaW50Ci1TX0lTX0VYVEVSTkFMIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBmbGFnd29yZCBmbGFnczsKLQotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLQotICBmbGFncyA9IHMtPmJzeW0tPmZsYWdzOwotCi0gIC8qIHNhbml0eSBjaGVjayAqLwotICBpZiAoKGZsYWdzICYgQlNGX0xPQ0FMKSAmJiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKSkKLSAgICBhYm9ydCAoKTsKLQotICByZXR1cm4gKGZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMDsKLX0KLQotaW50Ci1TX0lTX1dFQUsgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gKHMtPmJzeW0tPmZsYWdzICYgQlNGX1dFQUspICE9IDA7Ci19Ci0KLWludAotU19JU19DT01NT04gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gYmZkX2lzX2NvbV9zZWN0aW9uIChzLT5ic3ltLT5zZWN0aW9uKTsKLX0KLQotaW50Ci1TX0lTX0RFRklORUQgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9zZWN0aW9uICE9IHVuZGVmaW5lZF9zZWN0aW9uOwotICByZXR1cm4gcy0+YnN5bS0+c2VjdGlvbiAhPSB1bmRlZmluZWRfc2VjdGlvbjsKLX0KLQotaW50Ci1TX0lTX0RFQlVHIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKHMtPmJzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotU19JU19MT0NBTCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDE7Ci0KLSAgZmxhZ3MgPSBzLT5ic3ltLT5mbGFnczsKLQotICAvKiBzYW5pdHkgY2hlY2sgKi8KLSAgaWYgKChmbGFncyAmIEJTRl9MT0NBTCkgJiYgKGZsYWdzICYgQlNGX0dMT0JBTCkpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbiAocy0+YnN5bSkgPT0gcmVnX3NlY3Rpb24pCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUKLSAgICAgICYmIChmbGFncyAmIEJTRl9HTE9CQUwpID09IDAKLSAgICAgICYmIGJmZF9nZXRfc2VjdGlvbiAocy0+YnN5bSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICByZXR1cm4gMTsKLQotICBuYW1lID0gU19HRVRfTkFNRSAocyk7Ci0gIHJldHVybiAobmFtZSAhPSBOVUxMCi0JICAmJiAhIFNfSVNfREVCVUcgKHMpCi0JICAmJiAoc3RyY2hyIChuYW1lLCAnXDAwMScpCi0JICAgICAgfHwgc3RyY2hyIChuYW1lLCAnXDAwMicpCi0JICAgICAgfHwgKCEgZmxhZ19rZWVwX2xvY2FscwotCQkgICYmIChiZmRfaXNfbG9jYWxfbGFiZWwgKHN0ZG91dHB1dCwgcy0+YnN5bSkKLQkJICAgICAgfHwgKGZsYWdfbXJpCi0JCQkgICYmIG5hbWVbMF0gPT0gJz8nCi0JCQkgICYmIG5hbWVbMV0gPT0gJz8nKSkpKSk7Ci19Ci0KLWludAotU19JU19FWFRFUk4gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIHJldHVybiBTX0lTX0VYVEVSTkFMIChzKTsKLX0KLQotaW50Ci1TX0lTX1NUQUJEIChzKQotICAgICBzeW1ib2xTICpzOwotewotICByZXR1cm4gU19HRVRfTkFNRSAocykgPT0gMDsKLX0KLQotQ09OU1QgY2hhciAqCi1TX0dFVF9OQU1FIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpLT5sc3lfbmFtZTsKLSAgcmV0dXJuIHMtPmJzeW0tPm5hbWU7Ci19Ci0KLXNlZ1QKLVNfR0VUX1NFR01FTlQgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9zZWN0aW9uOwotICByZXR1cm4gcy0+YnN5bS0+c2VjdGlvbjsKLX0KLQotdm9pZAotU19TRVRfU0VHTUVOVCAocywgc2VnKQotICAgICBzeW1ib2xTICpzOwotICAgICBzZWdUIHNlZzsKLXsKLSAgLyogRG9uJ3QgcmVhc3NpZ24gc2VjdGlvbiBzeW1ib2xzLiAgVGhlIGRpcmVjdCByZWFzb24gaXMgdG8gcHJldmVudCBzZWcKLSAgICAgZmF1bHRzIGFzc2lnbmluZyBiYWNrIHRvIGNvbnN0IGdsb2JhbCBzeW1ib2xzIHN1Y2ggYXMgKkFCUyosIGJ1dCBpdAotICAgICBzaG91bGRuJ3QgaGFwcGVuIGFueXdheS4gICovCi0KLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgewotICAgICAgaWYgKHNlZyA9PSByZWdfc2VjdGlvbikKLQlzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICAgICAgZWxzZQotCXsKLQkgICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKS0+bHN5X3NlY3Rpb24gPSBzZWc7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0gICAgewotICAgICAgaWYgKHMtPmJzeW0tPnNlY3Rpb24gIT0gc2VnKQotCWFib3J0KCk7Ci0gICAgfQotICBlbHNlCi0gICAgcy0+YnN5bS0+c2VjdGlvbiA9IHNlZzsKLX0KLQotdm9pZAotU19TRVRfRVhURVJOQUwgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIGlmICgocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBMZXQgLndlYWsgb3ZlcnJpZGUgLmdsb2JhbC4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotICBzLT5ic3ltLT5mbGFncyB8PSBCU0ZfR0xPQkFMOwotICBzLT5ic3ltLT5mbGFncyAmPSB+KEJTRl9MT0NBTHxCU0ZfV0VBSyk7Ci19Ci0KLXZvaWQKLVNfQ0xFQVJfRVhURVJOQUwgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybjsKLSAgaWYgKChzLT5ic3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIExldCAud2VhayBvdmVycmlkZS4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotICBzLT5ic3ltLT5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0gIHMtPmJzeW0tPmZsYWdzICY9IH4oQlNGX0dMT0JBTHxCU0ZfV0VBSyk7Ci19Ci0KLXZvaWQKLVNfU0VUX1dFQUsgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHMtPmJzeW0tPmZsYWdzIHw9IEJTRl9XRUFLOwotICBzLT5ic3ltLT5mbGFncyAmPSB+KEJTRl9HTE9CQUx8QlNGX0xPQ0FMKTsKLX0KLQotdm9pZAotU19TRVRfTkFNRSAocywgbmFtZSkKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgewotICAgICAgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpLT5sc3lfbmFtZSA9IG5hbWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBzLT5ic3ltLT5uYW1lID0gbmFtZTsKLX0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0KLS8qIFJldHVybiB0aGUgcHJldmlvdXMgc3ltYm9sIGluIGEgY2hhaW4uICAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9wcmV2aW91cyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgYWJvcnQgKCk7Ci0gIHJldHVybiBzLT5zeV9wcmV2aW91czsKLX0KLQotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLQotLyogUmV0dXJuIHRoZSBuZXh0IHN5bWJvbCBpbiBhIGNoYWluLiAgKi8KLQotc3ltYm9sUyAqCi1zeW1ib2xfbmV4dCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgYWJvcnQgKCk7Ci0gIHJldHVybiBzLT5zeV9uZXh0OwotfQotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBhcyBhbiBleHByZXNzaW9uLiAgKi8KLQotZXhwcmVzc2lvblMgKgotc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICByZXR1cm4gJnMtPnN5X3ZhbHVlOwotfQotCi0vKiBTZXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIHRvIGFuIGV4cHJlc3Npb24uICAqLwotCi12b2lkCi1zeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHMsIGV4cCkKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcy0+c3lfdmFsdWUgPSAqZXhwOwotfQotCi0vKiBTZXQgdGhlIGZyYWcgb2YgYSBzeW1ib2wuICAqLwotCi12b2lkCi1zeW1ib2xfc2V0X2ZyYWcgKHMsIGYpCi0gICAgIHN5bWJvbFMgKnM7Ci0gICAgIGZyYWdTICpmOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgewotICAgICAgbG9jYWxfc3ltYm9sX3NldF9mcmFnICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzLCBmKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgcy0+c3lfZnJhZyA9IGY7Ci19Ci0KLS8qIFJldHVybiB0aGUgZnJhZyBvZiBhIHN5bWJvbC4gICovCi0KLWZyYWdTICoKLXN5bWJvbF9nZXRfZnJhZyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiBsb2NhbF9zeW1ib2xfZ2V0X2ZyYWcgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotI2VuZGlmCi0gIHJldHVybiBzLT5zeV9mcmFnOwotfQotCi0vKiBNYXJrIGEgc3ltYm9sIGFzIGhhdmluZyBiZWVuIHVzZWQuICAqLwotCi12b2lkCi1zeW1ib2xfbWFya191c2VkIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm47Ci0gIHMtPnN5X3VzZWQgPSAxOwotfQotCi0vKiBDbGVhciB0aGUgbWFyayBvZiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBiZWVuIHVzZWQuICAqLwotCi12b2lkCi1zeW1ib2xfY2xlYXJfdXNlZCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcy0+c3lfdXNlZCA9IDA7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBiZWVuIHVzZWQuICAqLwotCi1pbnQKLXN5bWJvbF91c2VkX3AgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAxOwotICByZXR1cm4gcy0+c3lfdXNlZDsKLX0KLQotLyogTWFyayBhIHN5bWJvbCBhcyBoYXZpbmcgYmVlbiB1c2VkIGluIGEgcmVsb2MuICAqLwotCi12b2lkCi1zeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5zeV91c2VkX2luX3JlbG9jID0gMTsKLX0KLQotLyogQ2xlYXIgdGhlIG1hcmsgb2Ygd2hldGhlciBhIHN5bWJvbCBoYXMgYmVlbiB1c2VkIGluIGEgcmVsb2MuICAqLwotCi12b2lkCi1zeW1ib2xfY2xlYXJfdXNlZF9pbl9yZWxvYyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuOwotICBzLT5zeV91c2VkX2luX3JlbG9jID0gMDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gdXNlZCBpbiBhIHJlbG9jLiAgKi8KLQotaW50Ci1zeW1ib2xfdXNlZF9pbl9yZWxvY19wIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIHMtPnN5X3VzZWRfaW5fcmVsb2M7Ci19Ci0KLS8qIE1hcmsgYSBzeW1ib2wgYXMgYW4gTVJJIGNvbW1vbiBzeW1ib2wuICAqLwotCi12b2lkCi1zeW1ib2xfbWFya19tcmlfY29tbW9uIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5zeV9tcmlfY29tbW9uID0gMTsKLX0KLQotLyogQ2xlYXIgdGhlIG1hcmsgb2Ygd2hldGhlciBhIHN5bWJvbCBpcyBhbiBNUkkgY29tbW9uIHN5bWJvbC4gICovCi0KLXZvaWQKLXN5bWJvbF9jbGVhcl9tcmlfY29tbW9uIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm47Ci0gIHMtPnN5X21yaV9jb21tb24gPSAwOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBpcyBhbiBNUkkgY29tbW9uIHN5bWJvbC4gICovCi0KLWludAotc3ltYm9sX21yaV9jb21tb25fcCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBzLT5zeV9tcmlfY29tbW9uOwotfQotCi0vKiBNYXJrIGEgc3ltYm9sIGFzIGhhdmluZyBiZWVuIHdyaXR0ZW4uICAqLwotCi12b2lkCi1zeW1ib2xfbWFya193cml0dGVuIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm47Ci0gIHMtPndyaXR0ZW4gPSAxOwotfQotCi0vKiBDbGVhciB0aGUgbWFyayBvZiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBiZWVuIHdyaXR0ZW4uICAqLwotCi12b2lkCi1zeW1ib2xfY2xlYXJfd3JpdHRlbiAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuOwotICBzLT53cml0dGVuID0gMDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gd3JpdHRlbi4gICovCi0KLWludAotc3ltYm9sX3dyaXR0ZW5fcCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBzLT53cml0dGVuOwotfQotCi0vKiBNYXJrIGEgc3ltYm9sIGhhcyBoYXZpbmcgYmVlbiByZXNvbHZlZC4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX3Jlc29sdmVkIChzKQotICAgICBzeW1ib2xTICpzOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgewotICAgICAgbG9jYWxfc3ltYm9sX21hcmtfcmVzb2x2ZWQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICBzLT5zeV9yZXNvbHZlZCA9IDE7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBiZWVuIHJlc29sdmVkLiAgKi8KLQotaW50Ci1zeW1ib2xfcmVzb2x2ZWRfcCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiBsb2NhbF9zeW1ib2xfcmVzb2x2ZWRfcCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHMtPnN5X3Jlc29sdmVkOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBpcyBhIHNlY3Rpb24gc3ltYm9sLiAgKi8KLQotaW50Ci1zeW1ib2xfc2VjdGlvbl9wIChzKQotICAgICBzeW1ib2xTICpzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgcmV0dXJuIChzLT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMDsKLSNlbHNlCi0gIC8qIEZJWE1FICovCi0gIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGVxdWF0ZWQgdG8gYW5vdGhlciBzeW1ib2wuICAqLwotCi1pbnQKLXN5bWJvbF9lcXVhdGVkX3AgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gcy0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGEgY29uc3RhbnQgdmFsdWUuICAqLwotCi1pbnQKLXN5bWJvbF9jb25zdGFudF9wIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIHMtPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudDsKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogUmV0dXJuIHRoZSBCRkQgc3ltYm9sIGZvciBhIHN5bWJvbC4gICovCi0KLWFzeW1ib2wgKgotc3ltYm9sX2dldF9iZmRzeW0gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHJldHVybiBzLT5ic3ltOwotfQotCi0vKiBTZXQgdGhlIEJGRCBzeW1ib2wgZm9yIGEgc3ltYm9sLiAgKi8KLQotdm9pZAotc3ltYm9sX3NldF9iZmRzeW0gKHMsIGJzeW0pCi0gICAgIHN5bWJvbFMgKnM7Ci0gICAgIGFzeW1ib2wgKmJzeW07Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHMtPmJzeW0gPSBic3ltOwotfQotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZkZWYgT0JKX1NZTUZJRUxEX1RZUEUKLQotLyogR2V0IGEgcG9pbnRlciB0byB0aGUgb2JqZWN0IGZvcm1hdCBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotCi1PQkpfU1lNRklFTERfVFlQRSAqCi1zeW1ib2xfZ2V0X29iaiAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcmV0dXJuICZzLT5zeV9vYmo7Ci19Ci0KLS8qIFNldCB0aGUgb2JqZWN0IGZvcm1hdCBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotCi12b2lkCi1zeW1ib2xfc2V0X29iaiAocywgbykKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgT0JKX1NZTUZJRUxEX1RZUEUgKm87Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHMtPnN5X29iaiA9ICpvOwotfQotCi0jZW5kaWYgLyogT0JKX1NZTUZJRUxEX1RZUEUgKi8KLQotI2lmZGVmIFRDX1NZTUZJRUxEX1RZUEUKLQotLyogR2V0IGEgcG9pbnRlciB0byB0aGUgcHJvY2Vzc29yIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCi0KLVRDX1NZTUZJRUxEX1RZUEUgKgotc3ltYm9sX2dldF90YyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcmV0dXJuICZzLT5zeV90YzsKLX0KLQotLyogU2V0IHRoZSBwcm9jZXNzb3IgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLQotdm9pZAotc3ltYm9sX3NldF90YyAocywgbykKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgVENfU1lNRklFTERfVFlQRSAqbzsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcy0+c3lfdGMgPSAqbzsKLX0KLQotI2VuZGlmIC8qIFRDX1NZTUZJRUxEX1RZUEUgKi8KLQotdm9pZAotc3ltYm9sX2JlZ2luICgpCi17Ci0gIHN5bWJvbF9sYXN0UCA9IE5VTEw7Ci0gIHN5bWJvbF9yb290UCA9IE5VTEw7CQkvKiBJbiBjYXNlIHdlIGhhdmUgMCBzeW1ib2xzICghISkgKi8KLSAgc3lfaGFzaCA9IGhhc2hfbmV3ICgpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgbG9jYWxfaGFzaCA9IGhhc2hfbmV3ICgpOwotI2VuZGlmCi0KLSAgbWVtc2V0ICgoY2hhciAqKSAoJmFic19zeW1ib2wpLCAnXDAnLCBzaXplb2YgKGFic19zeW1ib2wpKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jaWYgZGVmaW5lZCAoRU1JVF9TRUNUSU9OX1NZTUJPTFMpIHx8ICFkZWZpbmVkIChSRUxPQ19SRVFVSVJFU19TWU1CT0wpCi0gIGFic19zeW1ib2wuYnN5bSA9IGJmZF9hYnNfc2VjdGlvbi5zeW1ib2w7Ci0jZW5kaWYKLSNlbHNlCi0gIC8qIENhbid0IGluaXRpYWxpc2UgYSB1bmlvbi4gU2lnaC4gKi8KLSAgU19TRVRfU0VHTUVOVCAoJmFic19zeW1ib2wsIGFic29sdXRlX3NlY3Rpb24pOwotI2VuZGlmCi0gIGFic19zeW1ib2wuc3lfdmFsdWUuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGFic19zeW1ib2wuc3lfZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLQotICBpZiAoTE9DQUxfTEFCRUxTX0ZCKQotICAgIGZiX2xhYmVsX2luaXQgKCk7Ci19Ci0KLQotDAotaW50IGluZGVudF9sZXZlbDsKLQotLyogTWF4aW11bSBpbmRlbnQgbGV2ZWwuCi0gICBBdmFpbGFibGUgZm9yIG1vZGlmaWNhdGlvbiBpbnNpZGUgYSBnZGIgc2Vzc2lvbi4gICovCi1pbnQgbWF4X2luZGVudF9sZXZlbCA9IDg7Ci0KLSNpZiAwCi0KLXN0YXRpYyB2b2lkCi1pbmRlbnQgKCkKLXsKLSAgcHJpbnRmICgiJSpzIiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotfQotCi0jZW5kaWYKLQotdm9pZAotcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIHN5bSkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBjb25zdCBjaGFyICpuYW1lID0gU19HRVRfTkFNRSAoc3ltKTsKLSAgaWYgKCFuYW1lIHx8ICFuYW1lWzBdKQotICAgIG5hbWUgPSAiKHVubmFtZWQpIjsKLSAgZnByaW50ZiAoZmlsZSwgInN5bSAlbHggJXMiLCAodW5zaWduZWQgbG9uZykgc3ltLCBuYW1lKTsKLQotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW0pKQotICAgIHsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBzdHJ1Y3QgbG9jYWxfc3ltYm9sICpsb2NzeW0gPSAoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzeW07Ci0gICAgICBpZiAobG9jYWxfc3ltYm9sX2dldF9mcmFnIChsb2NzeW0pICE9ICZ6ZXJvX2FkZHJlc3NfZnJhZwotCSAgJiYgbG9jYWxfc3ltYm9sX2dldF9mcmFnIChsb2NzeW0pICE9IE5VTEwpCi0JZnByaW50ZiAoZmlsZSwgIiBmcmFnICVseCIsIChsb25nKSBsb2NhbF9zeW1ib2xfZ2V0X2ZyYWcgKGxvY3N5bSkpOwotICAgICAgaWYgKGxvY2FsX3N5bWJvbF9yZXNvbHZlZF9wIChsb2NzeW0pKQotCWZwcmludGYgKGZpbGUsICIgcmVzb2x2ZWQiKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgbG9jYWwiKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzeW0tPnN5X2ZyYWcgIT0gJnplcm9fYWRkcmVzc19mcmFnKQotCWZwcmludGYgKGZpbGUsICIgZnJhZyAlbHgiLCAobG9uZykgc3ltLT5zeV9mcmFnKTsKLSAgICAgIGlmIChzeW0tPndyaXR0ZW4pCi0JZnByaW50ZiAoZmlsZSwgIiB3cml0dGVuIik7Ci0gICAgICBpZiAoc3ltLT5zeV9yZXNvbHZlZCkKLQlmcHJpbnRmIChmaWxlLCAiIHJlc29sdmVkIik7Ci0gICAgICBlbHNlIGlmIChzeW0tPnN5X3Jlc29sdmluZykKLQlmcHJpbnRmIChmaWxlLCAiIHJlc29sdmluZyIpOwotICAgICAgaWYgKHN5bS0+c3lfdXNlZF9pbl9yZWxvYykKLQlmcHJpbnRmIChmaWxlLCAiIHVzZWQtaW4tcmVsb2MiKTsKLSAgICAgIGlmIChzeW0tPnN5X3VzZWQpCi0JZnByaW50ZiAoZmlsZSwgIiB1c2VkIik7Ci0gICAgICBpZiAoU19JU19MT0NBTCAoc3ltKSkKLQlmcHJpbnRmIChmaWxlLCAiIGxvY2FsIik7Ci0gICAgICBpZiAoU19JU19FWFRFUk4gKHN5bSkpCi0JZnByaW50ZiAoZmlsZSwgIiBleHRlcm4iKTsKLSAgICAgIGlmIChTX0lTX0RFQlVHIChzeW0pKQotCWZwcmludGYgKGZpbGUsICIgZGVidWciKTsKLSAgICAgIGlmIChTX0lTX0RFRklORUQgKHN5bSkpCi0JZnByaW50ZiAoZmlsZSwgIiBkZWZpbmVkIik7Ci0gICAgfQotICBmcHJpbnRmIChmaWxlLCAiICVzIiwgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW0pKSk7Ci0gIGlmIChzeW1ib2xfcmVzb2x2ZWRfcCAoc3ltKSkKLSAgICB7Ci0gICAgICBzZWdUIHMgPSBTX0dFVF9TRUdNRU5UIChzeW0pOwotCi0gICAgICBpZiAocyAhPSB1bmRlZmluZWRfc2VjdGlvbgotICAgICAgICAgICYmIHMgIT0gZXhwcl9zZWN0aW9uKQotCWZwcmludGYgKGZpbGUsICIgJWx4IiwgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW0pKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGluZGVudF9sZXZlbCA8IG1heF9pbmRlbnRfbGV2ZWwKLQkgICAmJiBTX0dFVF9TRUdNRU5UIChzeW0pICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGluZGVudF9sZXZlbCsrOwotICAgICAgZnByaW50ZiAoZmlsZSwgIlxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW0pKQotCWZwcmludGYgKGZpbGUsICJjb25zdGFudCAlbHgiLAotCQkgKGxvbmcpICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzeW0pLT5sc3lfb2Zmc2V0KTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCXByaW50X2V4cHJfMSAoZmlsZSwgJnN5bS0+c3lfdmFsdWUpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj4iKTsKLSAgICAgIGluZGVudF9sZXZlbC0tOwotICAgIH0KLSAgZmZsdXNoIChmaWxlKTsKLX0KLQotdm9pZAotcHJpbnRfc3ltYm9sX3ZhbHVlIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgaW5kZW50X2xldmVsID0gMDsKLSAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKHN0ZGVyciwgc3ltKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2JpbmFyeSAoZmlsZSwgbmFtZSwgZXhwKQotICAgICBGSUxFICpmaWxlOwotICAgICBjb25zdCBjaGFyICogbmFtZTsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgaW5kZW50X2xldmVsKys7Ci0gIGZwcmludGYgKGZpbGUsICIlc1xuJSpzPCIsIG5hbWUsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9hZGRfc3ltYm9sKTsKLSAgZnByaW50ZiAoZmlsZSwgIj5cbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfb3Bfc3ltYm9sKTsKLSAgZnByaW50ZiAoZmlsZSwgIj4iKTsKLSAgaW5kZW50X2xldmVsLS07Ci19Ci0KLXZvaWQKLXByaW50X2V4cHJfMSAoZmlsZSwgZXhwKQotICAgICBGSUxFICpmaWxlOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICBmcHJpbnRmIChmaWxlLCAiZXhwciAlbHggIiwgKGxvbmcpIGV4cCk7Ci0gIHN3aXRjaCAoZXhwLT5YX29wKQotICAgIHsKLSAgICBjYXNlIE9faWxsZWdhbDoKLSAgICAgIGZwcmludGYgKGZpbGUsICJpbGxlZ2FsIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fYWJzZW50OgotICAgICAgZnByaW50ZiAoZmlsZSwgImFic2VudCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgZnByaW50ZiAoZmlsZSwgImNvbnN0YW50ICVseCIsIChsb25nKSBleHAtPlhfYWRkX251bWJlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgaW5kZW50X2xldmVsKys7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAic3ltYm9sXG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9hZGRfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+Iik7Ci0gICAgbWF5YmVfcHJpbnRfYWRkbnVtOgotICAgICAgaWYgKGV4cC0+WF9hZGRfbnVtYmVyKQotCWZwcmludGYgKGZpbGUsICJcbiUqcyVseCIsIGluZGVudF9sZXZlbCAqIDQsICIiLAotCQkgKGxvbmcpIGV4cC0+WF9hZGRfbnVtYmVyKTsKLSAgICAgIGluZGVudF9sZXZlbC0tOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3JlZ2lzdGVyOgotICAgICAgZnByaW50ZiAoZmlsZSwgInJlZ2lzdGVyICMlZCIsIChpbnQpIGV4cC0+WF9hZGRfbnVtYmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19iaWc6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiYmlnIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fdW1pbnVzOgotICAgICAgZnByaW50ZiAoZmlsZSwgInVtaW51cyAtPCIpOwotICAgICAgaW5kZW50X2xldmVsKys7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX2FkZF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj4iKTsKLSAgICAgIGdvdG8gbWF5YmVfcHJpbnRfYWRkbnVtOwotICAgIGNhc2UgT19iaXRfbm90OgotICAgICAgZnByaW50ZiAoZmlsZSwgImJpdF9ub3QiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19tdWx0aXBseToKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgIm11bHRpcGx5IiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19kaXZpZGU6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJkaXZpZGUiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX21vZHVsdXM6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJtb2R1bHVzIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19sZWZ0X3NoaWZ0OgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibHNoaWZ0IiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19yaWdodF9zaGlmdDoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgInJzaGlmdCIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImJpdF9pb3IiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJiaXRfeG9yIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19iaXRfYW5kOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiYml0X2FuZCIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fZXE6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJlcSIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbmU6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJuZSIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbHQ6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJsdCIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbGU6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJsZSIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fZ2U6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJnZSIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fZ3Q6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJndCIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbG9naWNhbF9hbmQ6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJsb2dpY2FsX2FuZCIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbG9naWNhbF9vcjoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImxvZ2ljYWxfb3IiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2FkZDoKLSAgICAgIGluZGVudF9sZXZlbCsrOwotICAgICAgZnByaW50ZiAoZmlsZSwgImFkZFxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfYWRkX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPlxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfb3Bfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+Iik7Ci0gICAgICBnb3RvIG1heWJlX3ByaW50X2FkZG51bTsKLSAgICBjYXNlIE9fc3VidHJhY3Q6Ci0gICAgICBpbmRlbnRfbGV2ZWwrKzsKLSAgICAgIGZwcmludGYgKGZpbGUsICJzdWJ0cmFjdFxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfYWRkX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPlxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfb3Bfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+Iik7Ci0gICAgICBnb3RvIG1heWJlX3ByaW50X2FkZG51bTsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoZmlsZSwgInt1bmtub3duIG9wY29kZSAlZH0iLCAoaW50KSBleHAtPlhfb3ApOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBmZmx1c2ggKHN0ZG91dCk7Ci19Ci0KLXZvaWQKLXByaW50X2V4cHIgKGV4cCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgcHJpbnRfZXhwcl8xIChzdGRlcnIsIGV4cCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLXZvaWQKLXN5bWJvbF9wcmludF9zdGF0aXN0aWNzIChmaWxlKQotICAgICBGSUxFICpmaWxlOwotewotICBoYXNoX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUsICJzeW1ib2wgdGFibGUiLCBzeV9oYXNoKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGhhc2hfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSwgIm1pbmkgbG9jYWwgc3ltYm9sIHRhYmxlIiwgbG9jYWxfaGFzaCk7Ci0gIGZwcmludGYgKGZpbGUsICIlbHUgbWluaSBsb2NhbCBzeW1ib2xzIGNyZWF0ZWQsICVsdSBjb252ZXJ0ZWRcbiIsCi0JICAgbG9jYWxfc3ltYm9sX2NvdW50LCBsb2NhbF9zeW1ib2xfY29udmVyc2lvbl9jb3VudCk7Ci0jZW5kaWYKLX0KLQotLyogZW5kIG9mIHN5bWJvbHMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3N5bWJvbHMuaCBiL2dhcy9zeW1ib2xzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjczYWYuLjAwMDAwMDAKLS0tIGEvZ2FzL3N5bWJvbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKiBzeW1ib2xzLmggLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLS8qIFRoZSBCRkQgY29kZSB3YW50cyB0byB3YWxrIHRoZSBsaXN0IGluIGJvdGggZGlyZWN0aW9ucy4gICovCi0jdW5kZWYgIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSNkZWZpbmUgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotI2VuZGlmCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotLyogVGhlIG5vbi1CRkQgY29kZSBleHBlY3RzIHRvIGJlIGFibGUgdG8gbWFuaXB1bGF0ZSB0aGUgc3ltYm9sIGZpZWxkcwotICAgZGlyZWN0bHkuICAqLwotI2luY2x1ZGUgInN0cnVjLXN5bWJvbC5oIgotI2VuZGlmCi0KLWV4dGVybiBzdHJ1Y3Qgb2JzdGFjayBub3RlczsJLyogZWcgRml4UyBsaXZlIGhlcmUuICovCi0KLWV4dGVybiBzdHJ1Y3Qgb2JzdGFjayBjb25kX29ic3RhY2s7CS8qIHRoaXMgaXMgd2hlcmUgd2UgdHJhY2sgLmlmZGVmLy5lbmRpZgotCQkJCSAgICAgICAoaWYgd2UgZG8gdGhhdCBhdCBhbGwpLiAgKi8KLQotZXh0ZXJuIHN5bWJvbFMgKnN5bWJvbF9yb290UDsJLyogYWxsIHRoZSBzeW1ib2wgbm9kZXMgKi8KLWV4dGVybiBzeW1ib2xTICpzeW1ib2xfbGFzdFA7CS8qIGxhc3Qgc3RydWN0IHN5bWJvbCB3ZSBtYWRlLCBvciBOVUxMICovCi0KLWV4dGVybiBzeW1ib2xTIGFic19zeW1ib2w7Ci0KLWV4dGVybiBpbnQgc3ltYm9sX3RhYmxlX2Zyb3plbjsKLQotLyogVGhpcyBpcyBub24temVybyBpZiBzeW1ib2xzIGFyZSBjYXNlIHNlbnNpdGl2ZSwgd2hpY2ggaXMgdGhlCi0gICBkZWZhdWx0LiAgKi8KLWV4dGVybiBpbnQgc3ltYm9sc19jYXNlX3NlbnNpdGl2ZTsKLQotY2hhciAqZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoY2hhciAqcykpOwotc3ltYm9sUyAqc3ltYm9sX2ZpbmQgUEFSQU1TICgoQ09OU1QgY2hhciAqbmFtZSkpOwotc3ltYm9sUyAqc3ltYm9sX2ZpbmRfYmFzZSBQQVJBTVMgKChDT05TVCBjaGFyICpuYW1lLCBpbnQgc3RyaXBfdW5kZXJzY29yZSkpOwotc3ltYm9sUyAqc3ltYm9sX2ZpbmRfb3JfbWFrZSBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1zeW1ib2xTICpzeW1ib2xfbWFrZSBQQVJBTVMgKChDT05TVCBjaGFyICpuYW1lKSk7Ci1zeW1ib2xTICpzeW1ib2xfbmV3IFBBUkFNUyAoKENPTlNUIGNoYXIgKm5hbWUsIHNlZ1Qgc2VnbWVudCwgdmFsdWVUIHZhbHVlLAotCQkJICAgICBmcmFnUyAqIGZyYWcpKTsKLXN5bWJvbFMgKnN5bWJvbF9jcmVhdGUgUEFSQU1TICgoQ09OU1QgY2hhciAqbmFtZSwgc2VnVCBzZWdtZW50LCB2YWx1ZVQgdmFsdWUsCi0JCQkJZnJhZ1MgKiBmcmFnKSk7Ci1zeW1ib2xTICpjb2xvbiBQQVJBTVMgKChjb25zdCBjaGFyICpzeW1fbmFtZSkpOwotdm9pZCBsb2NhbF9jb2xvbiBQQVJBTVMgKChpbnQgbikpOwotdm9pZCBzeW1ib2xfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotdm9pZCBzeW1ib2xfcHJpbnRfc3RhdGlzdGljcyBQQVJBTVMgKChGSUxFICopKTsKLXZvaWQgc3ltYm9sX3RhYmxlX2luc2VydCBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sUCkpOwotdmFsdWVUIHJlc29sdmVfc3ltYm9sX3ZhbHVlIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50KSk7Ci12b2lkIHJlc29sdmVfbG9jYWxfc3ltYm9sX3ZhbHVlcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQgcHJpbnRfc3ltYm9sX3ZhbHVlIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotdm9pZCBwcmludF9leHByIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLXZvaWQgcHJpbnRfZXhwcl8xIFBBUkFNUyAoKEZJTEUgKiwgZXhwcmVzc2lvblMgKikpOwotdm9pZCBwcmludF9zeW1ib2xfdmFsdWVfMSBQQVJBTVMgKChGSUxFICosIHN5bWJvbFMgKikpOwotCi1pbnQgZG9sbGFyX2xhYmVsX2RlZmluZWQgUEFSQU1TICgobG9uZyBsKSk7Ci12b2lkIGRvbGxhcl9sYWJlbF9jbGVhciBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGRlZmluZV9kb2xsYXJfbGFiZWwgUEFSQU1TICgobG9uZyBsKSk7Ci1jaGFyICpkb2xsYXJfbGFiZWxfbmFtZSBQQVJBTVMgKChsb25nIGwsIGludCBhdWdlbmQpKTsKLQotdm9pZCBmYl9sYWJlbF9pbnN0YW5jZV9pbmMgUEFSQU1TICgobG9uZyBsYWJlbCkpOwotY2hhciAqZmJfbGFiZWxfbmFtZSBQQVJBTVMgKChsb25nIG4sIGxvbmcgYXVnZW5kKSk7Ci0KLWV4dGVybiB2b2lkIGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMgUEFSQU1TICgoc3ltYm9sUyAqLCBzeW1ib2xTICopKTsKLQotLyogR2V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiBzeW1ib2xzLiAgVGhlc2UgdXNlZCB0byBiZSBtYWNyb3MuICAqLwotZXh0ZXJuIHZhbHVlVCBTX0dFVF9WQUxVRSBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIFNfU0VUX1ZBTFVFIFBBUkFNUyAoKHN5bWJvbFMgKiwgdmFsdWVUKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gaW50IFNfSVNfRlVOQ1RJT04gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfRVhURVJOQUwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfV0VBSyBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19DT01NT04gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfREVGSU5FRCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19ERUJVRyBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19MT0NBTCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19FWFRFUk4gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfU1RBQkQgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gQ09OU1QgY2hhciAqU19HRVRfTkFNRSBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBzZWdUIFNfR0VUX1NFR01FTlQgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBTX1NFVF9TRUdNRU5UIFBBUkFNUyAoKHN5bWJvbFMgKiwgc2VnVCkpOwotZXh0ZXJuIHZvaWQgU19TRVRfRVhURVJOQUwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBTX1NFVF9OQU1FIFBBUkFNUyAoKHN5bWJvbFMgKiwgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBTX0NMRUFSX0VYVEVSTkFMIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgU19TRVRfV0VBSyBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNlbmRpZgotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLXN0cnVjdCBicm9rZW5fd29yZAotICB7Ci0gICAgLyogTGlua2VkIGxpc3QgLS0gb25lIG9mIHRoZXNlIHN0cnVjdHVyZXMgcGVyICIud29yZCB4LXkrQyIKLSAgICAgICBleHByZXNzaW9uLiAgKi8KLSAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKm5leHRfYnJva2VuX3dvcmQ7Ci0gICAgLyogU2VnbWVudCBhbmQgc3Vic2VnbWVudCBmb3IgYnJva2VuIHdvcmQuICAqLwotICAgIHNlZ1Qgc2VnOwotICAgIHN1YnNlZ1Qgc3Vic2VnOwotICAgIC8qIFdoaWNoIGZyYWcgaXMgdGhpcyBicm9rZW4gd29yZCBpbj8gICovCi0gICAgZnJhZ1MgKmZyYWc7Ci0gICAgLyogV2hlcmUgaW4gdGhlIGZyYWcgaXMgaXQ/ICAqLwotICAgIGNoYXIgKndvcmRfZ29lc19oZXJlOwotICAgIC8qIFdoZXJlIHRvIGFkZCB0aGUgYnJlYWsuICAqLwotICAgIGZyYWdTICpkaXNwZnJhZzsJCS8qIHdoZXJlIHRvIGFkZCB0aGUgYnJlYWsgKi8KLSAgICAvKiBPcGVyYW5kcyBvZiBleHByZXNzaW9uLiAgKi8KLSAgICBzeW1ib2xTICphZGQ7Ci0gICAgc3ltYm9sUyAqc3ViOwotICAgIG9mZnNldFQgYWRkbnVtOwotCi0gICAgaW50IGFkZGVkOwkJCS8qIG5hc3R5IHRoaW5nIGhhcHBlbmQgeWV0PyAqLwotICAgIC8qIDE6IGFkZGVkIGFuZCBoYXMgYSBsb25nLWp1bXAgKi8KLSAgICAvKiAyOiBhZGRlZCBidXQgdXNlcyBzb21lb25lIGVsc2VzIGxvbmctanVtcCAqLwotCi0gICAgLyogUG9pbnRlciB0byBicm9rZW5fd29yZCB3aXRoIGEgc2ltaWxhciBsb25nLWp1bXAuICAqLwotICAgIHN0cnVjdCBicm9rZW5fd29yZCAqdXNlX2p1bXA7Ci0gIH07Ci1leHRlcm4gc3RydWN0IGJyb2tlbl93b3JkICpicm9rZW5fd29yZHM7Ci0jZW5kaWYgLyogbmRlZiBXT1JLSU5HX0RPVF9XT1JEICovCi0KLS8qCi0gKiBDdXJyZW50IG1lYW5zIGZvciBnZXR0aW5nIGZyb20gc3ltYm9scyB0byBzZWdtZW50cyBhbmQgdmljZSB2ZXJzZS4KLSAqIFRoaXMgd2lsbCBjaGFuZ2UgZm9yIGluZmluaXRlLXNlZ21lbnRzIHN1cHBvcnQgKGUuZy4gQ09GRikuCi0gKi8KLWV4dGVybiBjb25zdCBzZWdUIE5fVFlQRV9zZWdbXTsJLyogc3Vic2VnLmMgKi8KLQotI2RlZmluZQlTRUdNRU5UX1RPX1NZTUJPTF9UWVBFKHNlZykgICggc2VnX05fVFlQRSBbKGludCkgKHNlZyldICkKLWV4dGVybiBjb25zdCBzaG9ydCBzZWdfTl9UWVBFW107Lyogc3Vic2VnLmMgKi8KLQotI2RlZmluZQlOX1JFR0lTVEVSCTMwCS8qIEZha2UgTl9UWVBFIHZhbHVlIGZvciBTRUdfUkVHSVNURVIgKi8KLQotdm9pZCBzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sUCkpOwotCi0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotCi12b2lkIHN5bWJvbF9pbnNlcnQgUEFSQU1TICgoc3ltYm9sUyAqIGFkZG1lLCBzeW1ib2xTICogdGFyZ2V0LAotCQkJICAgIHN5bWJvbFMgKiogcm9vdFAsIHN5bWJvbFMgKiogbGFzdFApKTsKLXZvaWQgc3ltYm9sX3JlbW92ZSBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sUCwgc3ltYm9sUyAqKiByb290UCwKLQkJCSAgICBzeW1ib2xTICoqIGxhc3RQKSk7Ci0KLWV4dGVybiBzeW1ib2xTICpzeW1ib2xfcHJldmlvdXMgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLSNlbmRpZiAvKiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTICovCi0KLXZvaWQgdmVyaWZ5X3N5bWJvbF9jaGFpbiBQQVJBTVMgKChzeW1ib2xTICogcm9vdFAsIHN5bWJvbFMgKiBsYXN0UCkpOwotdm9pZCB2ZXJpZnlfc3ltYm9sX2NoYWluXzIgUEFSQU1TICgoc3ltYm9sUyAqIHN5bVApKTsKLQotdm9pZCBzeW1ib2xfYXBwZW5kIFBBUkFNUyAoKHN5bWJvbFMgKiBhZGRtZSwgc3ltYm9sUyAqIHRhcmdldCwKLQkJCSAgICBzeW1ib2xTICoqIHJvb3RQLCBzeW1ib2xTICoqIGxhc3RQKSk7Ci0KLWV4dGVybiBzeW1ib2xTICpzeW1ib2xfbmV4dCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotZXh0ZXJuIGV4cHJlc3Npb25TICpzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gUEFSQU1TICgoc3ltYm9sUyAqLAotCQkJCQkJIGNvbnN0IGV4cHJlc3Npb25TICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9zZXRfZnJhZyBQQVJBTVMgKChzeW1ib2xTICosIGZyYWdTICopKTsKLWV4dGVybiBmcmFnUyAqc3ltYm9sX2dldF9mcmFnIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX21hcmtfdXNlZCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9jbGVhcl91c2VkIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfdXNlZF9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9jbGVhcl91c2VkX2luX3JlbG9jIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfdXNlZF9pbl9yZWxvY19wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX21hcmtfbXJpX2NvbW1vbiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9jbGVhcl9tcmlfY29tbW9uIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfbXJpX2NvbW1vbl9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX21hcmtfd3JpdHRlbiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9jbGVhcl93cml0dGVuIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfd3JpdHRlbl9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX21hcmtfcmVzb2x2ZWQgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF9yZXNvbHZlZF9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfc2VjdGlvbl9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfZXF1YXRlZF9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfY29uc3RhbnRfcCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWV4dGVybiBhc3ltYm9sICpzeW1ib2xfZ2V0X2JmZHN5bSBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9zZXRfYmZkc3ltIFBBUkFNUyAoKHN5bWJvbFMgKiwgYXN5bWJvbCAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9TWU1GSUVMRF9UWVBFCi1PQkpfU1lNRklFTERfVFlQRSAqc3ltYm9sX2dldF9vYmogUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci12b2lkIHN5bWJvbF9zZXRfb2JqIFBBUkFNUyAoKHN5bWJvbFMgKiwgT0JKX1NZTUZJRUxEX1RZUEUgKikpOwotI2VuZGlmCi0KLSNpZmRlZiBUQ19TWU1GSUVMRF9UWVBFCi1UQ19TWU1GSUVMRF9UWVBFICpzeW1ib2xfZ2V0X3RjIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotdm9pZCBzeW1ib2xfc2V0X3RjIFBBUkFNUyAoKHN5bWJvbFMgKiwgVENfU1lNRklFTERfVFlQRSAqKSk7Ci0jZW5kaWYKLQotLyogZW5kIG9mIHN5bWJvbHMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3RjLmggYi9nYXMvdGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0MDQ2Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKiB0Yy5oIC0gdGFyZ2V0IGNwdSBkZXBlbmRlbnQKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEluIHRoZW9yeSAobWluZSwgYXQgbGVhc3QhKSB0aGUgbWFjaGluZSBkZXBlbmRlbnQgcGFydCBvZiB0aGUgYXNzZW1ibGVyCi0gICBzaG91bGQgb25seSBoYXZlIHRvIGluY2x1ZGUgb25lIGZpbGUuICBUaGlzIG9uZS4gIC0tIEpGICovCi0KLWV4dGVybiBjb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW107Ci0KLS8qIEpGIG1vdmVkIHRoaXMgaGVyZSBmcm9tIGFzLmggdW5kZXIgdGhlIHRoZW9yeSB0aGF0IG5vYm9keSBleGNlcHQgTUFDSElORS5jCi0gICBhbmQgd3JpdGUuYyBjYXJlIGFib3V0IGl0IGFueXdheS4gKi8KLQotc3RydWN0IHJlbGF4X3R5cGUKLXsKLSAgLyogRm9yd2FyZCByZWFjaC4gU2lnbmVkIG51bWJlci4gPiAwLiAqLwotICBsb25nIHJseF9mb3J3YXJkOwotICAvKiBCYWNrd2FyZCByZWFjaC4gU2lnbmVkIG51bWJlci4gPCAwLiAqLwotICBsb25nIHJseF9iYWNrd2FyZDsKLQotICAvKiBCeXRlcyBsZW5ndGggb2YgdGhpcyBhZGRyZXNzLiAqLwotICB1bnNpZ25lZCBjaGFyIHJseF9sZW5ndGg7Ci0KLSAgLyogTmV4dCBsb25nZXIgcmVsYXgtc3RhdGUuICAwIG1lYW5zIHRoZXJlIGlzIG5vICduZXh0JyByZWxheC1zdGF0ZS4gKi8KLSAgcmVsYXhfc3Vic3RhdGVUIHJseF9tb3JlOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgcmVsYXhfdHlwZSByZWxheF90eXBlUzsKLQotZXh0ZXJuIGNvbnN0IGludCBtZF9yZWxvY19zaXplOwkvKiBTaXplIG9mIGEgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotY2hhciAqbWRfYXRvZiBQQVJBTVMgKChpbnQgd2hhdF9zdGF0ZW1lbnRfdHlwZSwgY2hhciAqbGl0ZXJhbFAsIGludCAqc2l6ZVApKTsKLSNpZm5kZWYgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgKLWludCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBQQVJBTVMgKChmcmFnUyAqIGZyYWdQLCBzZWdUIHNlZ21lbnQpKTsKLSNlbmRpZgotaW50IG1kX3BhcnNlX29wdGlvbiBQQVJBTVMgKChpbnQgYywgY2hhciAqYXJnKSk7Ci12b2lkIG1kX3Nob3dfdXNhZ2UgUEFSQU1TICgoRklMRSAqKSk7Ci1sb25nIG1kX3BjcmVsX2Zyb20gUEFSQU1TICgoZml4UyAqIGZpeFApKTsKLXNob3J0IHRjX2NvZmZfZml4MnJ0eXBlIFBBUkFNUyAoKGZpeFMgKiBmaXhQKSk7Ci12b2lkIG1kX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKnN0cikpOwotdm9pZCBtZF9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci0jaWZuZGVmIG1kX2NyZWF0ZV9sb25nX2p1bXAKLXZvaWQgbWRfY3JlYXRlX2xvbmdfanVtcCBQQVJBTVMgKChjaGFyICpwdHIsIGFkZHJlc3NUIGZyb21fYWRkciwKLQkJCQkgIGFkZHJlc3NUIHRvX2FkZHIsIGZyYWdTICogZnJhZywKLQkJCQkgIHN5bWJvbFMgKiB0b19zeW1ib2wpKTsKLSNlbmRpZgotI2lmbmRlZiBtZF9jcmVhdGVfc2hvcnRfanVtcAotdm9pZCBtZF9jcmVhdGVfc2hvcnRfanVtcCBQQVJBTVMgKChjaGFyICpwdHIsIGFkZHJlc3NUIGZyb21fYWRkciwKLQkJCQkgICBhZGRyZXNzVCB0b19hZGRyLCBmcmFnUyAqIGZyYWcsCi0JCQkJICAgc3ltYm9sUyAqIHRvX3N5bWJvbCkpOwotI2VuZGlmCi12b2lkIG1kX251bWJlcl90b19jaGFycyBQQVJBTVMgKChjaGFyICpidWYsIHZhbHVlVCB2YWwsIGludCBuKSk7Ci0KLSNpZm5kZWYgbWRfb3BlcmFuZAotdm9pZCBtZF9vcGVyYW5kIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXhwcmVzc2lvblApKTsKLSNlbmRpZgotCi0jaWZkZWYgTURfQVBQTFlfRklYMwotaW50IG1kX2FwcGx5X2ZpeDMgUEFSQU1TICgoZml4UyAqIGZpeFAsIHZhbHVlVCAqdmFsLCBzZWdUIHNlZykpOwotI2VuZGlmCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotaW50IG1kX2FwcGx5X2ZpeCBQQVJBTVMgKChmaXhTICogZml4UCwgdmFsdWVUICp2YWwpKTsKLSNpZm5kZWYgbWRfY29udmVydF9mcmFnCi12b2lkIG1kX2NvbnZlcnRfZnJhZyBQQVJBTVMgKChiZmQgKiBoZWFkZXJzLCBzZWdUIHNlYywgZnJhZ1MgKiBmcmFnUCkpOwotI2VuZGlmCi0jaWZuZGVmIHRjX2hlYWRlcnNfaG9vawotdm9pZCB0Y19oZWFkZXJzX2hvb2sgUEFSQU1TICgoc2VnVCAqLCBmaXhTICopKTsKLSNlbmRpZgotI2lmbmRlZiBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUKLWV4dGVybiBhcmVsZW50ICp0Y19nZW5fcmVsb2MgUEFSQU1TICgoYXNlY3Rpb24gKiwgZml4UyAqKSk7Ci0jZWxzZQotZXh0ZXJuIGFyZWxlbnQgKip0Y19nZW5fcmVsb2MgUEFSQU1TICgoYXNlY3Rpb24gKiwgZml4UyAqKSk7Ci0jZW5kaWYKLSNlbHNlIC8qIG5vdCBCRkRfQVNTRU1CTEVSICovCi12b2lkIG1kX2FwcGx5X2ZpeCBQQVJBTVMgKChmaXhTICogZml4UCwgbG9uZyB2YWwpKTsKLSNpZm5kZWYgbWRfY29udmVydF9mcmFnCi12b2lkIG1kX2NvbnZlcnRfZnJhZyBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMsIHNlZ1QsIGZyYWdTICogZnJhZ1ApKTsKLSNlbmRpZgotCi0jaWZuZGVmIHRjX2NyYXdsX3N5bWJvbF9jaGFpbgotdm9pZCB0Y19jcmF3bF9zeW1ib2xfY2hhaW4gUEFSQU1TICgob2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKSk7Ci0jZW5kaWYgLyogdGNfY3Jhd2xfc3ltYm9sX2NoYWluICovCi0KLSNpZm5kZWYgdGNfaGVhZGVyc19ob29rCi12b2lkIHRjX2hlYWRlcnNfaG9vayBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKLSNlbmRpZiAvKiB0Y19oZWFkZXJzX2hvb2sgKi8KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSNpZm5kZWYgbWRfc2VjdGlvbl9hbGlnbgotdmFsdWVUIG1kX3NlY3Rpb25fYWxpZ24gUEFSQU1TICgoc2VnVCBzZWcsIHZhbHVlVCBzaXplKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBtZF91bmRlZmluZWRfc3ltYm9sCi1zeW1ib2xTICptZF91bmRlZmluZWRfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKLSNlbmRpZgotCi0vKiBlbmQgb2YgdGMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cgYi9nYXMvdGVzdHN1aXRlL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4ODdkOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDI2MDAgKzAsMCBAQAotVHVlIE5vdiAzMCAyMzowMjowMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL3thbTMzLnMsIGFtMzNfMi5zLCBhbTMzXzMuc306IE5ldyB0ZXN0IGZpbGVzLgotCSogZ2FzL21uMTAzMDAve2FtMzNfNC5zLCBhbTMzXzUucywgYW0zM182LnN9OiBMaWtld2lzZS4KLQkqIGdhcy9tbjEwMzAwL3thbTMzXzcucywgYW0zM184LnN9OiBMaWtld2lzZS4KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogUnVuIHRoZSBhbTMzIHRlc3RzLgotCi0xOTk5LTExLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbGEuZDogQWRqdXN0IGZvciBuZXcgbGEgbWFjcm8gZXhwYW5zaW9uLgotCUNoYW5nZSBtYXRjaGVzIGZvciBleHBsaWNpdCBhZGRyZXNzZXMgdG8gbWF0Y2hlcyBmb3IKLQlhbnkgYWRkcmVzcy4KLQkqIGdhcy9taXBzL2xhLXhnb3QuZDogU2FtZS4KLQkqIGdhcy9taXBzL2xhLXN2cjRwaWMuZDogU2FtZS4KLQotMTk5OS0xMS0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVJlbW92ZSByZWxvYyBnZW5lcmF0aW5nIHJlZmVyZW5jZXMgdG8gbG9jYWwgbGFiZWxzIGluIHRlc3QgY29kZS4KLQlTb21lIEFSTSB0YXJnZXRzIChlZyBQRSkgZ2VuZXJhdGUgYSByZWxvYyBiYXNlZCBvbiB0aGUgbGFiZWwsCi0Jd2hpbHN0IG90aGVycyAoZWcgRUxGKSBnZW5lcmF0ZSBhIHJlbG9jIGJhc2VkIG9uIHRoZSBzZWN0aW9uCi0Jc3ltYm9sLiAgVGhpcyBtZWFudCB0aGF0IHRoZSBkaXNhc3NlbWJsZWQgb3V0cHV0cyB3b3VsZCBkaWZmZXIuCi0JCi0JKiBnYXMvYXJtL2luc3QuczogQ2hhbmdlIHRlc3Qgb2YgQkxQTCBpbnN0cnVjdGlvbi4KLQkqIGdhcy9hcm0vaW5zdC5kOiBDaGFuZ2UgZXhwZWN0ZWQgZGVjb2RlIG9mIEJMUEwgaW5zdHJ1Y3Rpb24uCi0JKiBnYXMvYXJtL2FybTd0LnM6IFJlbW92ZSB1c2Ugb2YgLkxDMCBsYWJlbCBpbiAud29yZCBkaXJlY3RpdmUuCi0JUmVtb3ZlIC5yZGF0YSBzZWN0aW9uLCBzaW5jZSB0aGlzIGNhbm5vdCBleGlzdCBpbiBhbiBhcm0tYW91dAotCXRhcmdldC4KLQkqIGdhcy9hcm0vYXJtN3QuZDogQ2hhbmdlIGV4cGVjdGVkIHJlbG9jIGdlbmVyYXRlZCBmb3IgLndvcmQKLQlkaXJlY3RpdmUuCi0KLTE5OTktMTAtMjEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vYXJtN3QuZDogVXBkYXRlIHRvIG1hdGNoIGxhdGVzdCBvYmpkdW1wIG91dHB1dC4KLQkqIGdhcy9hcm0vaW5zdC5zOiBGaXggZXJyb25lb3VzIHRlc3QgY2FzZS4KLQkqIGdhcy9hcm0vaW5zdC5kOiBVcGRhdGUgdG8gbWF0Y2ggbGF0ZXN0IG9iamR1bXAgb3V0cHV0LgotCi1Nb24gT2N0IDExIDEzOjM3OjUxIDE5OTkgIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocmVnZXhwX2RpZmYpOiBBbGxvdyAnIy4uLicgdG8gbWVhbiAic29tZQotIAlpbmRldGVybWluYXRlIG51bWJlciBvZiBleHRyYSBsaW5lcyBoZXJlIi4KLQotCSogZ2FzL2VsZi9lbGYuZXhwOiBSZW1vdmUgWEZBSUxzLgotCSogZ2FzL2VsZi9zZWN0aW9uMC5kOiBNYWtlIHBhc3Mgb24gTUlQUyAoYW5kIGhvcGVmdWxseSBhbHBoYSkuCi0JKiBnYXMvZWxmL3NlY3Rpb24xLmQ6IExpa2V3aXNlLgotCi1UaHUgT2N0ICA3IDAwOjEyOjA0IE1EVCAxOTk5CURpZWdvIE5vdmlsbG8gPGRub3ZpbGxvQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMTB2OiBOZXcgZGlyZWN0b3J5LgotCSogZ2FzL2QxMHYvZDEwLmV4cDogTmV3IGZpbGUuCi0JKiBnYXMvZDEwdi9pbnN0LnM6IE5ldyBmaWxlLgotCSogZ2FzL2QxMHYvaW5zdC5kOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAgNyAxMjo1MjoyNSAxOTk5ICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2VsZi1yZWwuczogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy9lbGYtcmVsLmQ6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvZWxmLXJlbDIuZDogTmV3IGZpbGUuCi0JKiBnYXMvbWlwcy9lMzItcmVsMi5kOiBOZXcgZmlsZS4KLQkqIGdhcy9taXBzL2VsZi1yZWwyLnM6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvbWlwcy5leHA6IEFkZCBlbGYtcmVsLCBlbGYtcmVsMi4KLQotCSogZ2FzL21pcHMvZWxmX2VfZmxhZ3MxLmQ6IFR3ZWFrIGEgbGl0dGxlIHNvIGl0IHBhc3NlcwotCWV2ZW4gaWYgdGhlIENQVSBpcyBzZXQgdG8gc29tZXRoaW5nIGJ5IGRlZmF1bHQuCi0KLU1vbiBPY3QgIDQgMTg6MjU6NDkgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvZXJyb3IuZXhwOiBOZXcgdGVzdGNhc2UgZHJpdmVyLgotCSogZ2FzL20zMnIvbTMycnguZXhwOiBOZXcgdGVzdGNhc2UgZHJpdmVyLgotCSogZ2FzL20zMnIvZnNsb3R4LltzZF06IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9tMzJyL20zMnJ4LltzZF06IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9tMzJyL3JlbGF4LXMuW3NkXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL20zMnIvaW50ZXJmZXJlLnM6IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9tMzJyL3dyb25nc2l6ZS5zOiBOZXcgdGVzdGNhc2UuCi0KLTE5OTktMDktMTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvaTM4Ni5leHA6IEVuYWJsZSByZWxvYyBhbmQgd2hpdGUgdGVzdHMgZm9yIENPRkYuCi0JKiBnYXMvaTM4Ni9yZWxvYy5kOiBBY2NlcHQgZGlyMzIgcmVsb2NzLgotCi0xOTk5LTA5LTEyICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBSdW4gY29mZnRhZyB0ZXN0IGZvciBpKjg2LSotaW50ZXJpeCouCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBBZGQgcGVycm9yIGlmIGNhbiBub3QgcmVhZCAuZCBmaWxlLgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIGdhcy9wai97cGouZXhwLCBvcHMuYywgb3BzLmR9OiBOZXcgdGVzdHMgZm9yIHBpY29KYXZhLgotCi0xOTk5LTA5LTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvdnRhYmxlL3Z0YWJsZS5leHA6IEFkZCBbaXN0YXJnZXQgInN0cm9uZ2FybSotKi0qIl0gdG8gcnVuCi0JZHVtcCAgdGVzdCAiZW50cnkwIiBpbnN0ZWFkIG9mICJlbnRyeTEiLgotCQotMTk5OS0wOS0wMSAgU2NvdHQgQmFtYnJvdWdoICA8c2NvdHRiQG5ldHdpbmRlci5vcmc+Ci0gCi0gICAgICAgICogZ2FzL3Z0YWJsZS92dGFibGUuZXhwOiBBZGRlZCBbaXN0YXJnZXQgImFybSotKi0qIl0gdG8gcnVuIGR1bXAgCi0gICAgICAgIHRlc3QgImVudHJ5MCIgaW5zdGVhZCBvZiAiZW50cnkxIi4gIEFSTSB0YXJnZXRzIHVzZSBSRUwgcmVsb2NzLAotICAgICAgICBhbmQgc2hvdWxkIHVzZSB0aGUgdGVzdCBlbnRyeTAuCi0KLTE5OTktMDktMDEgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogZ2FzL2kzODYvbmFrZWQuZDogRml4IGZvciBjb2ZmIHRhcmdldHMuCi0KLU1vbiBBdWcgMzAgMTI6MTg6NDAgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC8qLnM6IFVzZSAuY29kZSBpbnN0ZWFkIG9mIC5TUEFDRS8uU1VCU1BBIGZvcgotCXNlY3Rpb25pbmcuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IERpc2FibGUgdGVzdHMgbm90IGFwcHJvcHJpYXRlIGZvcgotCVBBNjQuCi0KLQkqIGdhcy9ocHBhL3JlbG9jLyouczogVXNlIC5jb2RlIGluc3RlYWQgb2YgLlNQQUNFLy5TVUJTUEEgZm9yCi0Jc2VjdGlvbmluZy4KLQkqIGdhcy9ocHBhL3BhcnNlL3BhcnNlLmV4cDogRGlzYWJsZSB0ZXN0cyBub3QgYXBwcm9wcmlhdGUgZm9yIFBBNjQuCi0JUmV2YW1wIGFkZHJlc3MgZXhwcmVzc2lvbnMgc2xpZ2h0bHkgdG8gaGFuZGxlIGFuIGFyYml0cmFyeSBzaXplZAotCWFkZHJlc3MuCi0KLQkqIGdhcy9ocHBhL3BhcnNlLyouczogVXNlIC5jb2RlIGluc3RlYWQgb2YgLlNQQUNFLy5TVUJTUEEgZm9yCi0Jc2VjdGlvbmluZy4KLQkqIGdhcy9ocHBhL3BhcnNlL3BhcnNlLmV4cDogRGlzYWJsZSB0ZXN0cyBub3QgYXBwcm9wcmlhdGUgZm9yIFBBNjQuCi0KLQkqIGdhcy9ocHBhL2Jhc2ljLyouczogVXNlIC5jb2RlIGluc3RlYWQgb2YgLlNQQUNFLy5TVUJTUEEgZm9yCi0Jc2VjdGlvbmluZy4KLQotMTk5OS0wOC0zMCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni9uYWtlZC5zLCBnYXMvaTM4Ni9uYWtlZC5kOiBUZXN0LXN1aXRlIGFkZGl0aW9uIGZvcgotCWFsbG93X25ha2VkX3JlZyBwYXJzaW5nLgotCSogZ2FzL2kzODYvaTM4Ni5leHA6IENhbGwgaXQuCi0KLTE5OTktMDgtMjkgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvd2hpdGUucywgZ2FzL2kzODYvd2hpdGUubDogQWRkIHNwYWNlIGluIEZQIHJlZyB0ZXN0cy4KLQotU2F0IEF1ZyAyOCAwMDoxNjoxMiAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiAgQWRkIG5ldyB0ZXN0cyBzaGlmdDIucywKLQlzaGlmdDMucywgZXh0cmFjdDIucywgZXh0cmFjdDMucywgZGVwb3NpdDIucywgYW5kIGRlcG9zaXQzLnMuCi0JKiBnYXMvaHBwYS9iYXNpYy9zaGlmdDIucywgc2hpZnQzLnMsIGV4dHJhY3QyLnMsCi0JZXh0cmFjdDMucywgZGVwb3NpdDIucywgZGVwb3NpdDMuczogIE5ldy4KLQotCSogZ2FzL2hwcGEvYmFzaWMvYWRkLnMsYWRkaS5zLGRjb3IucyxzaGxhZGQucyxzdWIucyxzdWJpLnMsdW5pdC5zOgotCUFkZCBuZXcgc3ludGF4IHZlcnNpb25zIG9mIGluc3RydWN0aW9ucyB0byB0ZXN0cy4gCi0JKiBnYXMvaHBwYS9iYXNpYy9hZGQyLnMsZGNvcjIucyxwZXJmLnMscHVyZ2UyLnMsc2hsYWRkMi5zLHN1YjIucywKLQlzeXN0ZW0yLnMsIHVuaXQyLnM6ICBOZXcgdGVzdHMuCi0JKiBocHBhL2Jhc2ljL2Jhc2ljLmV4cDogQWRkIG5ldyB0ZXN0cy4KLQotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOgotCSogZ2FzL2hwcGEvYmFzaWMvbWVkaWEuczogIEFkZCB0ZXN0IGNhc2VzIGZvciBuZXcgaW5zdHJ1Y3Rpb25zLgotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgKGRvX2JyYW5jaDIsZG9fbWVkaWEpOiBOZXcuCi0JKiBnYXMvaHBwYS9iYXNpYy9icmFuY2gyLnM6ICBOZXcuCi0JKiBnYXMvaHBwYS9iYXNpYy9tZWRpYS5zOiAgTmV3LgotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgKGRvX2ZwX2NvbXAyKTogIE5ldy4KLQkqIGdhcy9ocHBhL2Jhc2ljL2ZwX2NvbXAyLnM6ICBOZXcuCi0KLTE5OTktMDgtMjAgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvZ2VuZXJhbC5zLCBnYXMvaTM4Ni9nZW5lcmFsLmw6IEFkZCAuY29kZTE2Z2NjCi0JZGlzcGxhY2VtZW50IGNoZWNrcyB3aXRoIGF1dG8gYWRkcmVzcyBwcmVmaXguCi0KLTE5OTktMDgtMTcgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogZ2FzL2VsZi9lbGYuZXhwOiBFeHBlY3RlZCB0byBmYWlsIG9uIGFscGhhKi0qLSouCi0KLTE5OTktMDgtMDkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBnYXMvaTM4Ni9mbG9hdC5zLCBnYXMvaTM4Ni9mbG9hdC5sOiBNb2RpZnkgdG8gd29yayBjb3JyZWN0bHkKLQl3aGVuIGdhcyB1c2VzIDIqKjQgYWxpZ25tZW50IGZvciAudGV4dC4KLQkqIGdhcy9pMzg2L2dlbmVyYWwucywgZ2FzL2kzODYvZ2VuZXJhbC5sOiBMaWtld2lzZS4KLQkqIGdhcy9pMzg2L2thdG1haS5zLCBnYXMvaTM4Ni9rYXRtYWkuZDogTGlrZXdpc2UuCi0JKiBnYXMvaTM4Ni9tb2RybS5zLCBnYXMvaTM4Ni9tb2RybS5sOiBMaWtld2lzZS4KLQkqIGdhcy9pMzg2L3ByZWZpeC5zLCBnYXMvaTM4Ni9wcmVmaXguZDogTGlrZXdpc2UuCi0KLTE5OTktMDctMjcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvcmVsb2MuZDogRml4IHNvIHRoYXQgdGVzdCBwYXNzZXMgd2hlbiBlbmFibGUtdGFyZ2V0cwotCWluY2x1ZGVzIDY0LWJpdCBiZmQgdGFyZ2V0LgotCi0xOTk5LTA2LTEzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZ2FzL2kzODYva2F0bWFpLmQ6IFR3ZWFrIGZvciByZWNlbnQgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0KLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBnYXMvZWxmL2VsZi5leHA6IERvbid0IHJ1biB0ZXN0cyBvbiAiKi0qLWxpbnV4KmFvdXQqIiBvcgotCSIqLSotbGludXgqb2xkbGQqIi4KLQkqIGdhcy92dGFibGUvdnRhYmxlLmV4cDogTGlrZXdpc2UuCi0JKiBnYXMvaTM4Ni9yZWxvYy5kOiBNb2RpZnkgZXhwZWN0ZWQgcmVsb2MgbmFtZXMgdG8gYWNjZXB0IGEub3V0Ci0JbmFtZXMuCi0KLQkqIGdhcy9pMzg2L2FtZC5zOiBBZGQgYSBzeW1ib2wgc28gYS5vdXQgdGVzdHMgd2lsbCB3b3JrLgotCSogZ2FzL2kzODYva2F0bWFpLnM6IExpa2V3aXNlLgotCSogZ2FzL2kzODYvYW1kLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCSogZ2FzL2kzODYva2F0bWFpLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi0xOTk5LTA2LTEwICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZ2FzL21pcHMvc3luYy5kOiBQYXNzIC1taXBzMiB0byB0aGUgYXNzZW1ibGVyLgotCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFncy5zOiBUd2VhayBjb2RlIHNvIHRoYXQgdGhlIHRlc3RzIHBhc3MgZm9yCi0JbWlwcy1lbGYgdGFyZ2V0IGFzIHdlbGwgYXMgbWlwczY0LWVsZiB0YXJnZXQuCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFnczEuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogZ2FzL21pcHMvZWxmX2VfZmxhZ3MyLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvZWxmX2VfZmxhZ3MzLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvZWxmX2VfZmxhZ3M0LmQ6IExpa2V3aXNlLgotCi0JKiBnYXMvZWxmL2VsZi5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgbWlwcyotKi0qLgotCi0JKiBnYXMvYWxsL2l0YmwtdGVzdC5jIChtYWluKTogVXBkYXRlIGl0YmxfZ2V0X3JlZ192YWwgY2FsbCBmb3IgbmV3Ci0JcGFyYW1ldGVyLgotCi0xOTk5LTA2LTEwICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGdhcy9zcGFyYy9zeW50aDY0LnM6IEFkZCBjaGVja3MgZm9yIHNpbmdsZSByZWdpc3RlciBzaWdueC9jbHJ1dy4KLQkqIGdhcy9zcGFyYy9zZXQ2NC5zOiBBZGQgdGVzdHMgZm9yIHNldHV3IGFuZCBzZXRzdyBzeW50aGV0aWMgaW5zbnMuCi0JKiBnYXMvc3BhcmMvcHJlZmV0Y2guZDogQWRkIC02NCBhcyBzd2l0Y2guCi0JKiBnYXMvc3BhcmMvcmRwci5kOiBEaXR0by4KLQkqIGdhcy9zcGFyYy93cnByLmQ6IERpdHRvLgotCSogZ2FzL3NwYXJjL3N5bnRoNjQuZDogRGl0dG8sIHJlZmxlY3Qgc3ludGg2NC5zIGNoYW5nZXMuCi0JKiBnYXMvc3BhcmMvcmVsb2M2NC5kOiBBZGQgLTY0IGFzIHN3aXRjaCwgYmUgbW9yZSB0b2xlcmFudCwgYXMKLQljdXJyZW50IGdhcyBvdXRwdXRzICVoaSgwKSBhbmQgbm90ICVoaSgweDApLgotCSogZ2FzL3NwYXJjL3NldDY0LmQ6IEFkZCAtNjQgYXMgc3dpdGNoLCByZWZsZWN0IHNldDY0LnMgY2hhbmdlcyBhbmQKLQlvcHRpbWl6YXRpb25zIGZvciBzZXR4IGluc3RydWN0aW9uLgotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogRG8gc3BhcmM2NCotKi0qIGNoZWNrcyBpZiBpdCBpcyBhbnkgb2YgdGhlCi0JY29tcGlsZWQtaW4gdGFyZ2V0cy4KLQotMTk5OS0wNi0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21hY3Jvcy9pcnAuczogVXNlIGBmb28nIGFuZCBgYmFyJyBpbnN0ZWFkIG9mIGByJyBhbmQgYHMnLgotCSogZ2FzL21hY3Jvcy9yZXB0LnMsIGdhcy9tYWNyb3MvdGVzdDIucywgZ2FzL21hY3Jvcy90ZXN0My5zOiBMaWtld2lzZS4KLQkqIGdhcy9tYWNyb3Mve2lycCxyZXB0LHRlc3QyLHRlc3QzfS5kOiBVcGRhdGUuCi0KLTE5OTktMDYtMDUgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9lbGYvZWxmLmV4cDogTmV3IGRpcmVjdG9yeS4KLQkqIGdhcy9lbGYvc2VjdGlvbjAuW3NkXTogTmV3IHRlc3QuCi0JKiBnYXMvZWxmL3NlY3Rpb24xLltzZF06IE5ldyB0ZXN0LgotCi0xOTk5LTA2LTAzICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBnYXMvYXJtL2FybTd0LmQsIGdhcy9hcm0vaW5zdC5kOiBVcGRhdGUgdG8gbWF0Y2ggY3VycmVudCBnYXMsCi0gCWJmZCBhbmQgb3Bjb2Rlcy4KLQotMTk5OS0wNS0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGdhcy92dGFibGUvdnRhYmxlLmV4cDogRG9uJ3QgcnVuIHRlc3QgZm9yIGk5NjAgeWV0LgotCi0xOTk5LTA1LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvbWNvcmUvYWxsaW5zbi5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBvYmpkdW1wIG91dHB1dC4KLQotMTk5OS0wNS0xMiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni9vcGNvZGUuZDogTW9kaWZ5IGNhbGx3IHRvIHN1aXQgZGlzYXNtIGZpeC4KLQotCSogZ2FzL2kzODYvYW1kLmQ6IE1vZGlmeSBhICcoYmFkKScgdG8gU0lNRCBpbnN0cnVjdGlvbi4KLQotCSogZ2FzL2kzODYvYW1kLnM6IFBhZCB0byBtdWx0aXBsZSBvZiA4Ci0JKiBnYXMvaTM4Ni9hbWQuZDogSGVyZSB0b28uCi0KLQkqIGdhcy9pMzg2L3ByZWZpeC5bc2RdOiBBbGlnbiB3aXRoIG5vcHMKLQkqIGdhcy9pMzg2L3JlbG9jLltzZF06IEhlcmUgdG9vLgotCi0JKiBnYXMvaTM4Ni9rYXRtYWkuW3NkXTogTmV3IGZvciBQSUlJIFNJTUQKLQkqIGdhcy9pMzg2L2kzODYuZXhwOiBDYWxsIGl0LgotCi0xOTk5LTA1LTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvbWNvcmUvYWxsaW5zbi5kOiBVcGRhdGUgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlcgotCW9wZXJhdGlvbnMuIAotCi0xOTk5LTA0LTE2ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2kzODYvYW1kLnM6IEFkZCBOT1BzIHRvIGFsaWduIGZvciBjb2ZmIHRhcmdldHMKLQkqIGdhcy9pMzg2L2FtZC5kOiBhbmQgY2hlY2sgZm9yIHRoZW0uCi0KLVRodSBBcHIgMTUgMTU6MDM6NDMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgKGRvX2NvcHJtZW0pOiBObyBsb25nZXIgZXhwZWN0ZWQgdG8gZmlsZS4KLQotV2VkIEFwciAxNCAxMzo0MzowNiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2JyYW5jaC5zOiBEbyBub3QgdXNlIGltbWVkaWF0ZSB2YWx1ZSB3aGVyZSB3ZQotCXJlYWxseSB3YW50IGEgcmVnaXN0ZXIuCi0JKiBnYXMvaHBwYS9iYXNpYy9jb3BybWVtLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvYmFzaWMvY29wcm1lbS5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL2Jhc2ljL3Nwb3AuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9iYXNpYy9pbWVtLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvYmFkZm1weWFkZC5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3BhcnNlL2NhbGxkYXRhYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvZW50cnlidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9wYXJzZS9leHByYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvZml4dXA3YnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvbGFiZWxidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9hcHBseWJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL2xhYmVsb3BidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3BsYWJlbGJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZS5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZTIuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWR1Y2UzLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvYnJsZW5idWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9pbXBvcnRidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9sYXNiZWxkaWZmcy5zOiBMaWtld2lzZS4KLQotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwIChkb19pbWVtKTogSGFuZGxlIG11bHRpcGxlIGVuY29kaW5ncwotCWZvciBsb2FkcyBhbmQgc3RvcmVzIHVzaW5nIHJlZyArIHNtYWxsIGQgYWRkcmVzc2VzLgotCU5vIGxvbmdlciBleHBlY3QgZmFpbHVyZSBmb3IgbWlzLXBhcnNlIG9mIGltbSAlcmVnLgotCi0xOTk5LTA0LTEzICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL20zMnJ4LmQgKGNtcHVfX3JhY2gpOiBGaXggZXhwZWN0ZWQgb3V0cHV0LgotCSogZ2FzL20zMnIvbTMycngucyAoYmNfX2FkZCxhZGRfX2JjKTogRXhwbGljaXRseSBzcGVjaWZ5IHNob3J0IGJyYW5jaAotCXNvIGJyYW5jaCByZWxheGF0aW9uIHJlc3RyaWN0aW9ucyB3b24ndCBpbnRlcmZlcmUgd2l0aCBwYXJhbGxlbGl6YXRpb24KLQlhdHRlbXB0cy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21jb3JlOiBOZXcgRGlyZWN0b3J5LgotCSogZ2FzL21jb3JlL2FsbGluc24uZXhwOiBOZXcgRmlsZTogRXhwZWN0IGZpbGUgZm9yIE1Db3JlIGFzc2VtYmx5Ci0JdGVzdHMuCi0JKiBnYXMvbWNvcmUvYWxsaW5zbi5zOiBOZXcgRmlsZTogU291cmNlIGZpbGUgZm9yIE1Db3JlIGFzc2VtYmx5Ci0JdGVzdHMuCi0JKiBnYXMvbWNvcmUvYWxsaW5zbi5kOiBOZXcgRmlsZTogRXhwZWN0ZWQgb3V0cHV0IGZpbGUgZm9yIE1Db3JlCi0JYXNzZW1ibHkgdGVzdHMuCi0KLTE5OTktMDMtMjAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvbTMycnguW3NkXTogRml4IGEgZmV3IG1vcmUgdGVzdGNhc2VzLgotCi0xOTk5LTAzLTE2ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYvZDMwLmV4cCAocnVuX2xpc3RfdGVzdCk6IEFkZCBuZXcgdGVzdHMsCi0gICAgICAgIGxhYmVsLCBndWFyZC1kZWJ1Zywgc2VyaWFsLCB3YXJuX29kZHJlZywgYml0dGVzdCwgYW5kIG11bC4KLQotCSogZ2FzL2QzMHYvb3B0LnM6IEZpeCBzb21lIHdhcm5pbmdzIGFuZCBhZGQgYSBmZXcgbGFiZWxzCi0gICAgICAgIHRvIGtlZXAgdGhpbmdzIGZyb20gcGFyYWxsZWxpemluZyB3aGVyZSB3ZSBkb24ndCB3YW50IHRoZW0gdG8uCi0KLQkqIGdhcy9kMzB2L3JlbG9jLnM6IEZpeCB3YXJuaW5nLgotICAgICAgICAKLQkqIGdhcy9kMzB2L29wdC5kLCByZWxvYy5kLCBpbnN0LmQ6IFJlYnVpbGQuCi0KLQkqIGdhcy9kMzB2L2xhYmVsLnM6IE5ldyB0ZXN0LiBDaGVjayB0aGF0IGxhYmVscyBhcmUgYWxpZ25lZCAKLSAgICAgICAgb24gOC1ieXRlIGJvdW5kYXJpZXMuCi0KLQkqIGdhcy9kMzB2L2d1YXJkLWRlYnVnLnM6IE5ldyB0ZXN0LiBUZXN0IG91dHB1dCB3aXRoICItZyIuCi0KLQkqIGdhcy9kMzB2L3NlcmlhbC5zOiBOZXcgdGVzdC4gQ2hlY2sgZm9yIHdhcm5pbmdzIHdpdGggCi0gICAgICAgIGlsbGVnYWwgc2VyaWFsIGluc3RydWN0aW9ucy4KLQotCSogZ2FzL2QzMHYvd2Fybl9vZGRyZWcuczogTmV3IHRlc3QuIENIZWNrIGZvciB3YXJuaW5ncyB3aGVuCi0gICAgICAgIG9kZC1udW1iZXJlZCByZWdpc3RlcnMgYXJlIHVzZWQgZm9yIHNvbWUgaW5zdHJ1Y3Rpb25zLgotCi0JKiBnYXMvZDMwdi9iaXR0ZXN0LnM6IE5ldyB0ZXN0LiBDaGVjayBmb3IgYml0IG9wZXJhdGlvbiAKLSAgICAgICAgaW5zdHJ1Y3Rpb25zIChCQ0xSLCBCTk9ULCBCU0VULCBCVFNUKSBpbiB0aGUgSVUuCi0KLQkqIGdhcy9kMzB2L211bC5zOiBOZXcgdGVzdC4gQ2hlY2sgZm9yIHJlc3RyaWN0ZWQgc2VxdWVuY2VzCi0gICAgICAgIGluIGEgYnVuY2ggb2YgZGlmZmVyZW50IG11bHRpcGx5IGluc3RydWN0aW9ucy4KLQkKLQkqIGdhcy92dGFibGUvdnRhYmxlLmV4cCAocnVuX2xpc3RfdGVzdCk6IERvbid0Ci0JcnVuIHRlc3Qgb24gRDMwVi4KLQotMTk5OS0wMy0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBFeHBlY3Qgc3Ryb25nYXJtLWNvZmYgdGFyZ2V0IHRvIGZhaWwgY29mZnRhZwotCXRlc3QuIAotCi0xOTk5LTAyLTEzICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gdGhlIG5ldyB0ZXN0cywgYmVsb3cuCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFnczEuZCwgZ2FzL21pcHMvZWxmX2VfZmxhZ3MyLmQsCi0JZ2FzL21pcHMvZWxmX2VfZmxhZ3MzLmQsIGdhcy9taXBzL2VsZl9lX2ZsYWdzNC5kOiBOZXcgZmlsZXMuCi0JKiBnYXMvbWlwcy9lbGZfZV9mbGFncy5jLCBnYXMvbWlwcy9lbGZfZV9mbGFncy5zOiBOZXcgZmlsZXMuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBEb2N1bWVudC4gIEl0J3Mgbm90Ci0gCXJlYWxseSB0cml2aWFsLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogQ2xlYW4gdXAgbG9naWMgZm9yIGd1ZXNzaW5nCi0JJHByb2dyYW0gKHRoZSBkdW1wIHRvb2wpLgotCi0xOTk5LTAyLTEwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL2FsbGluc24uZDogUHJlZml4IGFsbCB8IHdpdGggXC4KLQkocHVzaCxwb3ApOiBGaXggZXhwZWN0ZWQgb3V0cHV0LgotCSogZ2FzL20zMnIvcmVsYXgtMS5kOiBFbWl0dGVkIG5vcHMgYXJlIHNlcmlhbCwgbm90IHBhcmFsbGVsLgotCSogZ2FzL20zMnIvZnNsb3QuZDogUHJlZml4IGFsbCB8IHdpdGggXC4KLQotMTk5OS0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3Z0YWJsZS9pbmhlcml0MC5zOiBEbyBub3QgdXNlICdAJyBwcmVmaXggdG8gLnR5cGUgb3BlcmF0b3IuCi0JU29tZSBwb3J0cyB1c2UgaXQgYXMgYSBjb21tZW50IGluaXRpYXRvci4KLQotCSogZ2FzL3Z0YWJsZS9lbnRyeTEuZDogRG8gbm90IGxvb2sgZm9yIGFuIGFkZGVuZC4gIFNvbWUgcG9ydHMgdXNlCi0JUkVMIHJlbG9jYXRpb25zIGFuZCBzbyBkbyBub3QgaGF2ZSBvbmUuCi0KLTE5OTgtMTItMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogRml4IHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgc3ludGF4LgotCSogZ2FzL2ZyMzAvYWxsaW5zbi5kOiBGaXggdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQKLQotMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgotCi0xOTk4LTEyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLnM6IFJlcGxhY2UgaWxsZWdhbCBpbnNucyB3aXRoIGxlZ2FsIHZlcnNpb25zLgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLmQ6IFVwZGF0ZSB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KLQotVGh1IE5vdiAxOSAxNTo1OTo1MSAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogUmVvcmRlciBpbnNucyBmb3IgYmV0dGVyIHNpbXVsYXRpb24uCi0KLVRodSBOb3YgMTkgMDc6NTA6NDQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL3N5bmMuW3NkXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biBpdC4KLQotV2VkIE5vdiAxOCAxMToyNzo1NiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24ucyAoZG1vdik6IENvcnJlY3QgaGV4IGxpdGVyYWxzLgotCi1UdWUgTm92IDE3IDE1OjI0OjIwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogTW92ZWQgY3VycmVudGx5IHVuLWFzc2VtYmxpYWJsZSBpbnN0cnVjdGlvbnMKLQl0byBlbmQgb2YgZmlsZS4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5kOiBBZGRlZCBkaXNhc3NlbWJseSBvZiBjdXJyZW50bHkgYXNzZW1ibGlhYmxlCi0Jb3Bjb2Rlcy4KLQotTW9uIE5vdiAxNiAxNjo1MDoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLnM6IEZpeCBzeW50YXggZXJyb3JzLgotCi1Nb24gTm92IDE2IDE5OjI3OjUyIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBGaXhlZCBtb3JlIHR5cG9zLgotCi1GcmkgTm92IDEzIDEzOjE1OjAxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogRml4ZWQgdHlwb3MgYW5kIGFkZGVkIHNvbWUgdGVzdHMgb2YgdXBwZXIKLQljYXNlIHZzIGxvd2VyIGNhc2UuCi0KLVR1ZSBOb3YgMTAgMTQ6NTQ6NDcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBOZXcgZmlsZS4KLQkqIGdhcy9mcjMwL2FsbGluc24uZDogTmV3IGZpbGUuCi0JKiBnYXMvZnIzMC9hbGxpbnNuLmV4cDogTmV3IGZpbGUuCi0JKiBnYXMvZnIzMC9mcjMwLmV4cDogTmV3IGZpbGUuCi0KLU1vbiBOb3YgIDIgMjA6MTY6NTAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvZnNsb3QuW3NkXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL20zMnIvbTMyci5leHA6IFJ1biBpdC4KLQotVHVlIE9jdCAyMCAxMTozNTowNiAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGdhcy9pMzg2L2kzODYuZXhwOiBSdW4gQU1EIGluc24gdGVzdC4KLQkqIGdhcy9pMzg2L2FtZC5zOiBOZXcgdGVzdC4KLQkqIGdhcy9pMzg2L2FtZC5kOiBOZXcgdGVzdCByZXN1bHRzLgotCi1TdW4gU2VwIDIwIDAxOjAwOjAxIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBnYXMvdnRhYmxlL2luaGVyaXQxLmw6IFJlcXVpcmUgb25seSB0aGUgd29yZCBHQVMgc29tZXdlcmUgaW4gdGhlCi0JZmlyc3QgbGluZSBvZiB0aGUgbGlzdGluZy4KLQotVHVlIFNlcCAgMSAxMDoyMDowMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBnYXMvcHBjL2FzdGVzdC5kOiBBZGp1c3QgcmVnZXhwcyB0byBtYXRjaCBhIDY0LWJpdCBob3N0LgotCSogZ2FzL3BwYy9hc3Rlc3QyLmQ6IExpa2V3aXNlLgotCi1Nb24gQXVnIDMxIDEzOjI1OjA3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGdhcy92dGFibGUve2VudHJ5MC5kLGVudHJ5MS5kLGluaGVyaXQwLmR9OiBGaXggcGF0dGVybiBtYXRjaGluZwotCW9mIHdoaXRlc3BhY2UgZm9yIDY0LWJpdCBob3N0cy4KLQotTW9uIEF1ZyAzMSAxMjo0NTo0OSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBnYXMvdnRhYmxlL3Z0YWJsZS5leHA6IE5ldy4KLQkqIGdhcy92dGFibGUve2VudHJ5MC5zLGVudHJ5MC5kfTogTmV3LgotCSogZ2FzL3Z0YWJsZS97ZW50cnkxLnMsZW50cnkxLmR9OiBOZXcuCi0JKiBnYXMvdnRhYmxlL3tpbmhlcml0MC5zLGluaGVyaXQwLmR9OiBOZXcuCi0JKiBnYXMvdnRhYmxlL3tpbmhlcml0MS5zLGluaGVyaXQxLmx9OiBOZXcuCi0KLVRodSBBdWcgMjAgMjM6MTg6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvaTM4Ni93aGl0ZS5sOiBSZXZlcnQgcGF0Y2ggb2YgQXVndXN0IDEyLgotCi1XZWQgQXVnIDEyIDExOjU0OjM3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvdWRmLnM6IE5ldyB0ZXN0LgotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBSdW4gaXQuCi0KLVdlZCBBdWcgMTIgMTM6MjU6MzggMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni9nZW5lcmFsLmw6IFRlc3QgYW5kYiAkfjB4ODAsZm9vLgotCSogZ2FzL2kzODYvZ2VuZXJhbC5zOiBVcGRhdGUuCi0KLQkqIGdhcy9pMzg2L3doaXRlLmw6IEV4cGVjdCB3YXJuaW5nIGZvciBzdGFuZC1hbG9uZSBzcyBwcmVmaXguCi0KLVR1ZSBKdWwgMjEgMTI6NDY6NTkgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni93aGl0ZS5zOiBBZGQgc29tZSBtb3JlIHdoaXRlc3BhY2UgdGVzdHMuCi0JKiBnYXMvaTM4Ni93aGl0ZS5sOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLU1vbiBKdWwgMTMgMTg6MTU6MTEgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni8qOiBBbGwgbmV3IGkzODYgdGVzdHN1aXRlLgotCi0xOTk4LTA3LTAyICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAoZ2FzX2luaXQpOiBDb21wbGFpbiBpZiB0YXJnZXQgbmFtZSBpc24ndCBpbgotCWNhbm9uaWNhbCBmb3JtLgotCi1XZWQgSnVsICAxIDE1OjM1OjA5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogRXhwZWN0IEFSTSBhbmQgVGh1bWIgY29mZnRhZyB0ZXN0IHRvIGZhaWwuCi0KLVdlZCBKdWwgIDEgMTc6MzE6MzkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvcHBjL3NpbXBzaGZ0LnM6IEFkZCBhbGlnbm1lbnQgc28gdGhhdCBpdCB3b3JrcyBvbiBBSVguCi0JKiBnYXMvcHBjL3NpbXBzaGZ0LmQ6IENoYW5nZSBhY2NvcmRpbmdseS4gIE9ubHkgZHVtcCB0aGUgLnRleHQKLQlzZWN0aW9uLgotCi1UdWUgSnVuIDIzIDE1OjE0OjQzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy92ODUwL2hpbG8yLnM6IFVzZSByMSBhcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIG1vdmVhCi0JaW5zdHJ1Y3Rpb24sIHNpbmNlIHIwIGlzIHJlYWQgb25seS4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwOiBGaXggbmFtZXMgb2Ygc3BlY2lhbCBhcmVhIHJlbG9jYXRpb25zLgotCVNldCAtbXdhcm4tc2lnbmVkLW92ZXJmbG93IGZsYWcgd2hlbiBydW5uaW5nIHJhbmdlLnMgdGVzdC4KLQotU3VuIEp1biAyMSAxMjo0NDo0MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi9yZWxvYy5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgotCi1XZWQgSnVuIDE3IDE0OjAyOjEwIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2RlbGF5LmQ6IEFkZCAtbWNwdT1OTk5OIHRvIGdhcyBmbGFncyB0byBsZXQgdGVzdCBjYXNlCi0gCXJ1biBvbiBkaWZmZXJlbnRseSB0YXJnZXRlZCBhc3NlbWJsZXIuCi0JKiBnYXMvbWlwcy97bGQtaWxvY2tzLWFkZHIzMixsZC1zdnI0cGljLmR9OiBEaXR0by4KLQkqIGdhcy9taXBzL3tsZC14Z290LmQsbGlmLXN2cjRwaWMuZCxsaWYteGdvdC5kfTogU2FtZS4KLQkqIGdhcy9taXBzL3ttaXBzMTYuZCxtaXBzNC5kLG5vZGVsYXkuZH06IEFnYWluLgotCSogZ2FzL21pcHMve3RydW5jLmQsdWxkLmQsdWxoLXhnb3QuZCx1c2QuZH06IEFuZCB0aGVuIHNvbWUuCi0JCi0JKiBnYXMvbWlwcy9sZC1pbG9ja3MuZDogUmVtb3ZlZCBkaXNhc3NlbWJsZXIgZmxhZ3MgdG8gbGV0IHRhcmdldAotIAlkZWZhdWx0cyBnbyB1bm1vZGlmaWVkLiAgUmVwbGFjZWQgJGY0LyRmNSB3aXRoICRmcFs0NV0sIGFzIHRoZQotCW9yaWdpbmFsIGBsZC5kJyBoYWQuICBGaW5kIGBsZC5zJy4KLQkqIGdhcy9taXBzL211bC1pbG9ja3MuZDogTmVhcmx5IGRpdHRvLgotCQotVGh1IEp1biAxMSAxNjo1MDo0NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi9pbnN0LmQ6IEV4cGVjdCByZXBlYXRpIGluc3RydWNpdG9ucyB0byBiZSBjb21iaW5lZC4KLQotCSogZ2FzL2QzMHYvaW5zdC5zOiBBZGQgbm9wIHRvIGtlZXAgYXNzZW1ibGVkIGluc3RydWN0aW9ucyBhdAotCWV4cGVjdGVkIGFkZHJlc3Nlcy4KLQotTW9uIEp1biAgOCAxODo0NzoxMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi9hcnJheS5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgcmVzdWx0cy4KLQkqIGdhcy9kMzB2L3JlbG9jLmQ6IFBhcnRpYWxseSB1cGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIKLQlyZXN1bHRzLiAKLQotRnJpIEp1biAgNSAxOToxNTo1OSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZ2FzL202OGsvb3BlcmFuZHMuczogRm9yIGFsbCBwYyByZWxhdGl2ZSBhZGRyZXNzZXMgY2hhbmdlIHRzdGwKLQl0byBwZWEgc2luY2UgdGhlIGZvcm1lciBkb2VzIG5vdCBhbGxvdyBwY3JlbCBvbiBtNjgwMDAuICBEbyBub3QKLQltYWtlIGxhYmVsIGZvbyBnbG9iYWwsIHNvIHRoYXQgcmVmZXJlbmNlcyB0byBpdCBjYW4gYmUgcmVsYXhlZCBvbgotCUVMRiB0YXJnZXRzLgotCSogZ2FzL202OGsvb3BlcmFuZHMuZCwgZ2FzL202OGsvb3A2ODAwMC5kOiBVcGRhdGVkLgotCi1UdWUgSnVuICAyIDE1OjA4OjM2IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGdhcy9wcGMvcHBjLmV4cDogUnVuIHNpbXBzaGZ0IHRlc3QuCi0JKiBnYXMvcHBjL3NpbXBzaGZ0LmQ6IE5ldyBmaWxlLgotCSogZ2FzL3BwYy9zaW1wc2hmdC5zOiBOZXcgZmlsZS4KLQotTW9uIEp1biAgMSAxNzowMDoyMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzL2Rpdi1pbG9ja3MuZDogSGFuZGxlIGJvdGggImJyZWFrIiBpbnN0cnVjdGlvbiB2YXJpYW50cy4KLQkqIGdhcy9taXBzL3tkaXYuZCwgbXVsLWlsb2Nrcy5kLCBtdWwuZH06IExpa2V3aXNlLgotCQotRnJpIE1heSAyOSAxMjowNzozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBBZGp1c3QgaWxvY2tzIGluaXRpYWxpemF0aW9uIHRvIG1hdGNoIGN1cnJlbnQKLQlhc3NlbWJsZXIgZGVmYXVsdHMgbW9yZSBjbG9zZWx5LgotCi0JKiBnYXMvc2gvZnAuczogUmVtb3ZlIGZ0c3QvbmFuLiAgVGhlIGFzc2VtYmxlciBubyBsb25nZXIgc3VwcG9ydHMKLQl0aGUgaW5zdHJ1Y3Rpb24uCi0JKiBnYXMvc2gvYmFzaWMuZXhwOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0KLVdlZCBNYXkgMjcgMTU6MjY6NTEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYvYWxpZ24uZDogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KLQkqIGdhcy9kMzB2L2luc3QuZDogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KLQkqIGdhcy9kMzB2L2luc3QuczogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIHJ1bGVzLgotCSogZ2FzL2QzMHYvb3B0LmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQuCi0KLUZyaSBNYXkgMjIgMTU6NTY6NTEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvYWxsaW5zbi5kOiBIYW5kbGUgNjQgYml0IGJmZF92bWEuCi0JKiBnYXMvbTMyci91cHBlcmNhc2UuZDogTGlrZXdpc2UuCi0KLVRodSBNYXkgMjEgMTU6MDM6MDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS90aHVtYi5zOiBBZGQgcGVyaW9kIHRvIHN0YXJ0IG9mIGxhYmVscyB0byBwcmV2ZW50Ci0JYXNzZW1ibGVyIHRoaW5raW5nIHRoYXQgdGhleSBhcmUgZnVuY3Rpb24gZW50cnkgcG9pbnRzLgotCi1UdWUgTWF5IDE5IDE4OjE3OjEwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczE2LmQ6IENvcnJlY3QgdG8gcmVmbGVjdCBidWcgZml4IHRvIGRpc2Fzc2VtYmxlci4KLQotTW9uIE1heSAxOCAxMzoxMTo0NSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy97ZGl2LGxkLG11bH0uZDogQWRkIGFzc2VtYmxlciAtbWNwdT0gZmxhZyB0byBtYXRjaAotIAlkaXNhc3NlbWJsZXIuCi0JCi1GcmkgTWF5IDE1IDE0OjUxOjAxIDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogRGlzdGluZ3Vpc2ggY2hhaW5zIHdpdGggMzItYml0IGFkZHJlc3Nlcy4KLQkqIGdhcy9taXBzL2xkLWlsb2Nrcy1hZGRyMzIuZCA6IE5ldy4KLQotV2VkIE1heSAxMyAxNTowNjozMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci91cHBlcmNhc2UuW3NkXTogVGVzdCBmb3IgSElHSCxTSElHSCxMT1csU0RBLgotCi1UaHUgTWF5ICA3IDEzOjA1OjI1IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2JyZWFrMjAuW3NkXTogTmV3IHRlc3RzIGZvciAyMC1iaXQgb3BlcmFuZCBicmVhayBhbmQKLSAJc2RkYnAgaW5zdHJ1Y3Rpb25zLiAKLQkqIGdhcy9taXBzL3RyYXAyMC5bc2RdOiBOZXcgdGVzdHMgZm9yIDIwLWJpdCBvcGVyYW5kIHRyYXAKLSAJaW5zdHJ1Y3Rpb25zLiAKLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gdGhlbS4KLQotVGh1IEFwciAzMCAxMTo1NTowMSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi97aW5zdCxhcnJheSxvcHQscmVsb2N9LmQ6IEFjY2VwdCA8c3ltYm9sK29mZnNldD4gbGFiZWxzCi0gCWluIGRpc2Fzc2VtYmx5LCB3aGVyZSB0aGUgb2Zmc2V0IGlzIGluIGhleCBhbmQgaGFzIGEgIjB4IiBwcmVmaXguCi0JCi1UdWUgQXByIDI4IDE2OjM4OjM0IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2xpbmVuby5bc2RdOiBBc3NlbWJseSBzb3VyY2UgbGluZSBudW1iZXIgdGVzdC4KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBBZGRlZCBsaW5lbm8gdGVzdC4KLQotV2VkIEFwciAgOCAxODo0NToxNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy90ZXN0c3VpdGUvYWxsL2dhcy5leHA6IE5vIGxvbmdlciBleHBlY3QgZmFpbHVyZXMgZm9yCi0JZGlmZmVyZW5jZSBvZiB1bmRlZmluZWQgc3ltYm9scyBvbiBtbjEweDAwIHRhcmdldHMuCi0KLU1vbiBNYXIgMjMgMTA6NDc6MzMgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9hbGlnbi5zOiBCYWNrIG91dCAiLnNlY3Rpb24gdGV4dCIgY2hhbmdlIGJlbG93OwotCXVzZSAiLnRleHQiIGFnYWluLgotCSogZ2FzL21hY3Jvcy9zZW1pLnM6IERpdHRvLgotCQotRnJpIE1hciAyMCAxODo1MTo0OSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2FsaWduLnM6IElkZW50aWZ5ICIudGV4dCIgc2VjdGlvbiBleHBsaWNpdGx5LgotCSogZ2FzL21hY3Jvcy9zZW1pLnM6IERpdHRvLgotCQotCQotCQotTW9uIE1hciAgMiAxMzozMDo0MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvYWxsaW5zbi5bc2RdIChsZGk4YSxsZGkxNmEpOiBEZWxldGUuCi0JKGxkaTE2KTogSW1wcm92ZSB0ZXN0LgotCShub3ApOiBGaXggdGVzdC4KLQotVGh1IEZlYiAxMiAyMDoxMjozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AvbWFjcm8ub3V0OiBBZGp1c3QgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IGtleXdvcmQKLQlhcmd1bWVudHMgYXJlIG5vdyBwZXJtaXR0ZWQgYWZ0ZXIgcG9zaXRpb25hbCBhcmd1bWVudHMuCi0KLVdlZCBGZWIgIDQgMTU6Mjc6NDQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9hcm03dC5kOiBVcGRhdGUgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQuCi0KLVdlZCBGZWIgIDQgMTU6NDA6MDAgMTk5OCAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZ2FzL3BwYy9wcGMuZXhwOiBOZXcgZmlsZS4KLQkqIGdhcy9wcGMvYXN0ZXN0LnMsIGdhcy9wcGMvYXN0ZXN0LmQ6IE5ldyB0ZXN0LgotCSogZ2FzL3BwYy9hc3Rlc3QyLnMsIGdhcy9wcGMvYXN0ZXN0Mi5kOiBOZXcgdGVzdC4KLQotU3VuIEZlYiAgMSAyMTo0Mzo1NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzLzQwMTAuczogUGFkIHRlc3QgY29kZSBvdXQgdG8gYSAxNmJ5dGUgYm91bmRhcnkuCi0JKiBnYXMvbWlwcy80MDEwLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIGdhcy9taXBzLzQxMDAuczogUGFkIHRlc3QgY29kZSBvdXQgdG8gYSAxNmJ5dGUgYm91bmRhcnkuCi0JKiBnYXMvbWlwcy80MTAwLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIGdhcy9taXBzLzQ2NTAuczogUGFkIHRlc3QgY29kZSBvdXQgdG8gYSAxNmJ5dGUgYm91bmRhcnkuCi0JKiBnYXMvbWlwcy80NjUwLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotRnJpIEphbiAzMCAxNDowOToxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvbW92ZW1sLmQ6IEFkZCB0ZXN0IGNvbW1lbnRzLCBmaXggcmVnZXhwcy4KLQotVGh1IEphbiAyOSAxMzozNDo0OSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci97YWxsaW5zbixoaWdoLTF9LmQ6IEFsbG93ICMgY29uc3RhbnQgcHJlZml4IHRvIGJlIG1pc3NpbmcuCi0KLVRodSBKYW4gMjkgMDk6NDM6NTAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvbXJpX21vdmVtbC5bc2RdOiBNb3ZlZCB0byAuLi4KLQkqIGdhcy9tcmkvbW92ZW1sLltzZF06IC4uLiBoZXJlLgotCSogZ2FzL21yaS9tcmkuZXhwOiBSdW4gaXQuCi0KLVR1ZSBKYW4gMjcgMjE6NTU6NDQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbWlwcy80MDEwLnM6IEFkZCA0MDEwIHRlc3RzLgotCSogZ2FzL21pcHMvNDAxMC5kOiBFeHBlY3RlZCBvdXRwdXQuCi0JKiBnYXMvbWlwcy80MTAwLnM6IEFkZCA0MDEwIHRlc3RzLgotCSogZ2FzL21pcHMvNDEwMC5kOiBFeHBlY3RlZCBvdXRwdXQuCi0JKiBnYXMvbWlwcy80NjUwLnM6IEFkZCA0MDEwIHRlc3RzLgotCSogZ2FzL21pcHMvNDY1MC5kOiBFeHBlY3RlZCBvdXRwdXQuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIHRoZSBuZXcgdGVzdHMuCi0JKiBnYXMvbWlwcy8qLmQ6IFBhc3MgdGhlIHJpZ2h0IHByb2Nlc3NvciBtb2RlbCB0byBvYmpkdW1wLgotCUZpeCBtaW5vciBjYXNlcyB3aGVyZSBleHBlY3RlZCBvdXRwdXQgd2FzIHdyb25nIGR1ZSB0byBvcGNvZGUKLQljb25mbGljdHMuCi0KLVR1ZSBKYW4gMjcgMDU6MzU6MDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvbXJpX21vdmVtbC5bc2RdOiBOZXcgdGVzdGNhc2UuCi0KLVRodSBKYW4gMjIgMTc6Mjk6MDcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvaGlnaC0xLmQ6IEFkZCBoYXNoIHByZWZpeCB0byBjb25zdGFudHMuCi0KLQkqIGdhcy9tMzJyL2FsbGluc24uczogQWRkIGhhc2ggcHJlZml4IHRvIHNvbWUgY29uc3RhbnRzLgotCSogZ2FzL20zMnIvYWxsaW5zbi5kOiBBZGQgaGFzaCBwcmVmaXggdG8gY29uc3RhbnRzLgotCi1XZWQgSmFuIDIxIDIxOjI0OjA4IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogZ2FzL204OGsvaW5pdC5kOiBGaXggaGV4YWRlY2ltYWwgb2Zmc2V0cy4KLQotV2VkIEphbiAxNCAxNzo0OToyMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci91cHBlcmNhc2UuZDogRml4IHdoaXRlIHNwYWNlIG1hdGNoaW5nLgotCSogZ2FzL20zMnIvcmVsYXgtMS5kOiBGaXggd2hpdGUgc3BhY2UgbWF0Y2hpbmcuCi0KLVdlZCBKYW4gMTQgMTU6NDQ6MzIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbWlwcy9kaXYuZDogVXBkYXRlIGZvciByZWNlbnQgYXNzZW1ibGVyIGNoYW5nZXMuCi0JKiBnYXMvbWlwcy9kaXYtaWxvY2tzLmQ6IExpa2V3aXNlLgotCi1XZWQgSmFuIDE0IDExOjEzOjA2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9hbGxpbnNuLmQgKGNtcHVpKTogVXBkYXRlIG91dHB1dCB0byBuZXcgZm9ybWF0LgotCi1UaHUgRGVjIDE4IDExOjEwOjQyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vaW5zdC5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQotCSogZ2FzL2FybS9hcm03dC5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQotVHVlIERlYyAxNiAyMjoxOToyNSAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbGIteGdvdC5kLCBnYXMvbWlwcy9yb2wuZCwgZ2FzL21pcHMvamFsLXN2cjRwaWMuZCwKLQlnYXMvbWlwcy9qYWwteGdvdC5kOiBBZGQgYXNzZW1ibGVyIG9wdGlvbiB0byBzZWxlY3QgYSBzcGVjaWZpYwotCXRhcmdldCBjaGlwLCB0aGUgUjMwMDAuCi0JKiBnYXMvbWlwcy9sYi14Z290LWlsb2Nrcy5kOiBOZXcgdGVzdCwgc3BlY2lmaWNhbGx5IHNlbGVjdGluZwotCVIzOTAwLgotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2llZWUtZnAveDkzMDUwOWEuZXhwOiBEb24ndCBydW4gSUVFRSBGUCB0ZXN0cyBmb3IgVmF4Ci0JdGFyZ2V0cy4KLQotV2VkIE9jdCAxNSAxMDo0MDoxNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9pZWVlLWZwL3g5MzA1MDlhLnM6IFR3ZWFrIHNsaWdodGx5IHRvIHdvcmsgb24gdGhlIFBBLgotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFVwZGF0ZSBmb3IgcmVjZW50IGRpc2Fzc2VtYmxlcgotCWNoYW5nZXMuCi0KLVRodSBPY3QgIDkgMTg6MTA6NDQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3NldDY0LltzZF06IGBzZXQnIGRvZXNuJ3QgdGFrZSBuZWdhdGl2ZSBhcmd1bWVudHMuCi0KLVRodSBPY3QgIDkgMTI6NTk6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL2FybTd0LmQ6IFVwZGF0ZSBmb3IgcmVjZW50IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCSogZ2FzL2g4MzAwL2ZmeHgxLmQ6IExpa2V3aXNlLgotCi1XZWQgT2N0ICA4IDE2OjIyOjUwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9yZWxvYzY0LltzZF06IEFkZCB0ZXN0Y2FzZXMgZm9yICVoaXgsJWxveC4KLQotV2VkIE9jdCAgOCAxNToxMjozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zeW50aC5kOiBVcGRhdGUgZm9yIHJlY2VudCBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQkqIGdhcy9zcGFyYy9zeW50aDY0LmQ6IExpa2V3aXNlLgotCi0JKiBnYXMvbWlwcy9iZXEuczogQWRkIC50ZXh0IHRvIC5nbG9ibCB0byBtYXJrIHRoZSBzeW1ib2wgdG8gYXMgYQotCWZ1bmN0aW9uIHN5bWJvbC4KLQkqIGdhcy9taXBzL2phbC5zOiBMaWtld2lzZS4KLQotVHVlIE9jdCAgNyAxMzozMDozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvcmVsb2M2NC5bc2RdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBSdW4gaXQuCi0KLVNhdCBPY3QgIDQgMTk6MTQ6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvaWVlZS1mcC94OTMwNTA5YS5leHA6IEFjY2VwdCBtNjhrIGxpc3RpbmcgZm9ybWF0LgotCi1GcmkgT2N0ICAzIDE1OjQ2OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2llZWUtZnAveDkzMDUwOWEuZXhwOiBSZW1vdmUgc2V0dXBfeGZhaWw7IGl0IHNob3VsZCBub3cKLQl3b3JrLiAgQ29ycmVjdCBmb3IgYmlnIGVuZGlhbiBhbmQgZm9yIHRhYnMgaW4gaW5wdXQgZmlsZS4KLQotCSogZ2FzL2FscGhhL2ZwLmV4cDogQ2hlY2sgZm9yIGFscGhhLSotb3NmKiwgbm90IGFscGhhLSotb3NmMSouCi0JKiBnYXMvYWxwaGEvZnAuczogQ2hhbmdlIGNvbW1lbnQgY2hhcmFjdGVycyBmcm9tICEgdG8gIy4KLQotVGh1IFNlcCAxOCAxMToxNzo1MyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3BsZXQuZDogVXBkYXRlIHRvIG5ldyBvYmpkdW1wIG91dHB1dCBmb3JtYXQuCi0JKiBnYXMvc3BhcmMve2FzaS5kLG1lbWJhci5kLHByZWZldGNoLmQscmRwci5kLHdycHIuZH06IExpa2V3aXNlLgotCSogZ2FzL3NwYXJjL3NldDY0Lltkc106IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9zcGFyYy9zcGxldC0yLltkc106IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IFJ1biB0aGVtLgotCi1UdWUgU2VwIDE2IDE1OjI3OjA4IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTWVyZ2UgY2hhbmdlcyBmcm9tIE1hcnRpbiBIdW50OgotCi0JKiBnYXMvZDMwdi9pbnN0LnM6IEFkZCBzb21lIG5ldyB0ZXN0cy4gCi0KLSAJKiBnYXMvZDMwdi97aW5zdCwgb3B0LCByZWxvY30uZDogVXBkYXRlIHJlc3VsdHMgd2l0aAotIAluZXcgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0KLQkqIGdhcy9kMzB2L2luc3QuW3NkXTogVXBkYXRlIGV4YW1wbGVzIGZvciBkKmkgaW5zdHJ1Y3Rpb25zLiAKLQotCSogZ2FzL2QzMHYvKi5kOiBVcGRhdGUgYWxsIHRlc3QgcmVzdWx0cyBiZWNhdXNlCi0gCW9mIG5ldyAiLnMiIGFuZCAiLmwiIGV4dGVuc2lvbnMuCi0KLQkqIGdhcy9kMzB2L2luc3QuW3NkXTogQ29ycmVjdCBlbnRyeSBmb3IgbXVseDJoLgotCSogZ2FzL2QzMHYvb3B0LltzZF06IENvcnJlY3Qgc3QydyBpbnN0cnVjdGlvbi4gCi0KLQkqIGdhcy9kMzB2L2FsaWduLmQ6IENoYW5nZSBleHBlY3RlZCBvdXRwdXQuCi0KLQkqIGdhcy9kMzB2L3JlbG9jLltzZF06IEFkZCB0ZXN0IGNhc2UuIAotCi0JKiBnYXMvZDMwdi9hcnJheS5bc2RdOiBOZXcgdGVzdCBjYXNlLgotCi0JKiBnYXMvZDMwdi9vcHQuW3NkXTogQWRkZWQgbW9yZSB0ZXN0IGNhc2VzLiAKLQotCSogZ2FzL2QzMHYvb3B0LnM6IEFkZCB0ZXN0IGNhc2VzLgotCSogZ2FzL2QzMHYvcmVsb2MuczogRml4IGEgdGVzdCBjYXNlLgkKLQkqIGdhcy9kMzB2L3tvcHQscmVsb2N9LmQ6IFJlZ2VuZXJhdGUuCi0KLU1vbiBTZXAgIDggMTQ6MjE6MjMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvaGlnaC0xLltkc106IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9tMzJyL20zMnIuZXhwOiBSdW4gaXQuCi0KLU1vbiBBdWcgMjUgMTE6MDQ6MjQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvcmVsYXgtMS5bZHNdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvbTMyci9tMzJyLmV4cDogUnVuIGl0LgotCi1UaHUgQXVnIDE0IDIzOjQ5OjQ5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcmM6IE5ldyBkaXJlY3RvcnkKLQkqIGdhcy9hcmMve2FyYy5leHAsYWxpYXMuW3NkXSxicmFuY2guW3NkXSxmbGFnLltzZF0saW5zbjMuW3NkXSxqLltzZF0sCi0JbGQuW3NkXSxtYXRoLltzZF0sc3NoaWZ0LltzZF0sc3QuW3NkXSx3YXJuLntleHAsc319OiBOZXcgZmlsZXMuCi0KLVdlZCBBdWcgIDYgMDA6MzM6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFNldCBBUyBhbmQgR0FTUCB0byBhcy1uZXcsIG5vdCBhcy5uZXcuCi0KLVR1ZSBBdWcgIDUgMTI6MzM6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFNldCBOTSB0byBubS1uZXcsIG5vdCBubS5uZXcsIHRvIG1hdGNoCi0JcmVjZW50IGNoYW5nZSBpbiBiaW51dGlscyBidWlsZCBkaXJlY3RvcnkuCi0KLVRodSBKdWwgMzEgMTU6MjE6NTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvdjg1MC9yYW5nZS5zOiBOZXcgdGVzdC4KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cDogUnVuIGl0LgotCi1UdWUgSnVsIDI5IDE0OjM1OjAyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL3Y4NTAvaGlsbzIuczogTmV3IHRlc3QuCi0JKiBnYXMvdjg1MC9mZXBzdy5zOiBOZXcgdGVzdC4KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cDogUnVuIHRoZW0uCi0KLVR1ZSBKdWwgMTUgMTM6MDM6MTcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvdXBwZXJjYXNlLltzZF06IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9tMzJyL20zMnIuZXhwOiBOZXcgZmlsZS4KLQotTW9uIEp1biAxNiAxNDozMjoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL3BjcmVsLmQ6IFVwZGF0ZSBmb3IgbTY4ayBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQkqIGdhcy9tNjhrL29wZXJhbmRzLmQ6IExpa2V3aXNlLgotCi1Nb24gSnVuICAyIDE2OjUwOjAzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vYXJtLmV4cDogQWRkZWQgY2hhbmdlcyBmcm9tIGFybVQtOTcwMzI4LWJyYW5jaC4KLQotTW9uIEp1biAgMiAxMjowOTowMiAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IFRoZSByMzkwMCBoYXMgaW50ZXJsb2NrcyBmb3IgbXVsLCBidXQKLQlub3QgZGl2LgotCi1Nb24gSnVuICAyIDEyOjAzOjMyIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkAuY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbXVsLntkLHN9OiBFbmQgdGhlIHRlc3RzIHdpdGggbm8tb3BzLiAKLQotTW9uIEp1biAgMiAxMTo0ODo1OCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocmVnZXhwX2RpZmYpOiBJbXByb3ZlIG1lc3NhZ2VzIHdoZW4gb25lCi0JZmlsZSBpcyBzaG9ydGVyIHRoYW4gdGhlIG90aGVyLgotCi1XZWQgTWF5ICA3IDE2OjE4OjMwIDE5OTcgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogZ2FzL204OGsvaW5pdC57cyxkfTogTmV3IGNoZWNrcyBmb3IgcHJvcGVyIHBhZGRpbmcgb2YKLQkuaW5pdCBzZWN0aW9ucy4KLQkqIGdhcy9tODhrL204OC5leHA6IFJ1biB0aGVtLgotCi0JKiBnYXMvbTY4ay90Mi5kOiBOZXcgZmlsZSBmb3IgY2hlY2sgb2YgcHJlc2VuY2Ugb2Ygc2VjdGlvbgotCXN5bWJvbHMgb24gdGhlIG02OGstbW90b3JvbGEtc3lzdi4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biB0MiBpZiBbaXN0YXJnZXQgbTY4Ki1tb3Rvcm9sYS1zeXN2XS4KLQotV2VkIE1heSAgNyAxNjoxMjoyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogRG9uJ3QgcnVuIGNvZmZ0YWcgdGVzdCBmb3IgbTg4ay1jb2ZmLgotCi0JKiBnYXMvbWlwcy9saWZsb2F0LnM6IFVwZGF0ZSBmb3IgcmVjZW50IGNoYW5nZXMgdG8gZmxvYXRpbmcgcG9pbnQKLQloYW5kbGluZy4KLQkqIGdhcy9taXBzL2xpZi1lbXBpYy5kLCBnYXMvbWlwcy9saWYtc3ZyNHBpYy5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL2xpZi14Z290LmQsIGdhcy9taXBzL2xpZmxvYXQuZDogTGlrZXdpc2UuCi0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBIYW5kbGUgSXJpeCA2IGxpa2UgSXJpeCA1LgotCi1TYXQgQXByIDE5IDIzOjE2OjM1IDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAcGV0cmEuYXBwbGkuc2U+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBIYW5kbGUgT3BlbkJTRCBsaWtlIE5ldEJTRC4KLQotV2VkIEFwciAxNiAxMjoyMDoyNCAxOTk3ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYvZDMwLmV4cDogQWRkIG9wdGltaXplciB0ZXN0IGNhc2UuCi0JKiBnYXMvZDMwdi9vcHQuczogQWRkIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRlc3RzLgotCSogZ2FzL2QzMHYvb3B0LmQ6IFJlYnVpbGQuCi0KLVR1ZSBBcHIgMTUgMTg6MTA6MDEgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL3tkZWxheS5kLG5vZGVsYXkuZH06IGFkZGVkLgotCi1Nb24gQXByICA3IDEyOjU3OjQ1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL2FsbGluc24uZDogVXBkYXRlIHRvIG5ldyBvYmpkdW1wIG91dHB1dCBzdHlsZS4KLQotRnJpIEFwciAgNCAxMzoxOTozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvZmxvYXQuczogUHV0IGEgdGFiIGJlZm9yZSAudGV4dCwgdG8ga2VlcCB0aGUgUEEgaGFwcHkuCi0KLQkqIGdhcy9hcm0vYXJtLmV4cDogT25seSBydW4gaW5zdCBhbmQgYXJtN3Qgb24gdGFyZ2V0cyB3aGljaCBjYW4KLQloYW5kbGUgLUVMLiAgQWRkIHNldHVwX3hmYWlsIGZvciB0aHVtYi4KLQotCSogZ2FzL2g4MzAwL2ZmeHgxLmQ6IERvbid0IGZhaWwgaWYgQkZEIGlzIDY0IGJpdHMuCi0KLVRodSBBcHIgIDMgMTg6MjY6NTYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvYWxsaW5zbi57ZXhwLHMuZH06IE5ldyB0ZXN0Y2FzZXMuCi0KLVRodSBNYXIgMjcgMDA6NDI6MjggMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L2QzMC5leHA6IEFkZCB0ZXN0IGNhc2UgcmVsb2MuCi0JKiBnYXMvZDMwdi9yZWxvYy5bc2RdOiBOZXcgZmlsZXMgdG8gdGVzdCByZWxvY2F0aW9ucy4KLQotU2F0IE1hciAxNSAxNzoyMTo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vaW5zdC5kOiBVcGRhdGUgZm9yIGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCSogZ2FzL2FybS9hcm03dC5kOiBMaWtld2lzZS4KLQotVHVlIE1hciAxMSAxMzozMTo1NiAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZ2FzL202OGsvb3A2ODAwMC5kOiBVcGRhdGUgZm9yIHJlY2VudCBhc3NlbWJsZXIgYnVnIGZpeC4KLQotV2VkIE1hciAgNSAxMzowMToyNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogeGZhaWwgYSBjb3VwbGUgdGVzdHMgZm9yIHRoZSBtbjEwMzAwLgotCi1Nb24gTWFyICAzIDExOjQxOjAwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBnYXMvdGljODAve2FkZC5kLCBmbG9hdC5kLCByZWdvcHMyLmQsIHJlbG9jczEuZCwgcmVsb2NzMWIuZCwKLQlyZWxvY3MyLmQsIHJlbG9jczJiLmR9OiBBZGp1c3QgdG8gb2JqZHVtcCBmb3JtYXQgdHdlYWtzLgotCi1UaHUgRmViIDI3IDE1OjIxOjQ2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBnYXMvdGljODAve2FsaWduLmQsIGFsaWduLmxzdCwgYWxpZ24uc30gTmV3IHRlc3QgZm9yIHRoZQotCSIuYWxpZ24iIHBzZXVkb3AuCi0JKiBnYXMvdGljODAvdGljODAuZXhwOiBSdW4gdGhlIGFsaWduIHRlc3QuCi0JCi1XZWQgRmViIDI2IDIwOjM2OjQ2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBnYXMvdGljODAve2Zsb2F0LmQsIGZsb2F0LmxzdCwgZmxvYXQuc306IE5ldyB0ZXN0cyBmb3IKLQlzaW1wbGUgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZHMuCi0JKiBnYXMvdGljODAvdGljODAuZXhwOiBSdW4gdGhlIGZsb2F0IHRlc3QuCi0KLVdlZCBGZWIgMjYgMTU6MTY6MDQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGdhcy90aWM4MC97cmVnb3BzMi5kLCByZWdvcHMyLmxzdCwgcmVnb3BzMi5zLCByZWdvcHMzLmQsCi0gCXJlZ29wczMubHN0LCByZWdvcHMzLnMsIHJlZ29wczQuZCwgcmVnb3BzNC5sc3QsIHJlZ29wczQuc306Ci0JTmV3IHRlc3RzIGZvciA6bSBhbmQgOnMgb3BlcmFuZCBtb2RpZmllcnMuCi0JKiBnYXMvdGljODAvdGljODAuZXhwOiBSdW4gdGhlIHJlZ29wczIsIHJlZ29wczMsIGFuZCByZWdvcHM0IHRlc3RzLgotCi1UdWUgRmViIDI1IDEzOjQ1OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21hY3Jvcy9zZW1pLnM6IEZvcmNlIHRoZSBmaW5hbCBhbGlnbm1lbnQgdG8gdXNlIGEgZmlsbCB2YWx1ZQotCW9mIDAuCi0KLQkqIGdhcy9hbGwvY29uZC5zLCBnYXMvYWxsL2NvbmQuZDogTmV3IHRlc3QuCi0JKiBnYXMvYWxsL2dhcy5leHA6IFJ1biBpdC4KLQotTW9uIEZlYiAyNCAxMDo1MjoxMiAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cChnYXNfaW5pdCk6IEFkZGVkIG5ldyBwYXJhbWV0ZXIgZm9yIHNjcmlwdAotCW5hbWUuCi0KLU1vbiBGZWIgMjQgMTA6NDA6MjggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGdhcy90aWM4MC97YWRkLmQsIGJpdG51bS5kLCBjY29kZS5kLCBjcmVnb3BzLmQsIGVuZG1hc2suZCwKLQlyZWdvcHMuZCwgcmVsb2NzMS5kLCAKLQkocmVsb2NzMS5jKTogQWRkIGZpbGUgZm9yIHJlZmVyZW5jZS4KLQkocmVsb2NzMWIuZCk6IFNwbGl0IHJlbG9jIHRhYmxlIGNvbnRlbnRzIHRlc3QgdG8gZGlmZmVyZW50IHRlc3QgZmlsZS4KLQkocmVsb2NzMi5jKTogQWRkIHRlc3QgdGhhdCB1c2VzIHZhcmlvdXMgdHlwZXMgKGNoYXIsIHNob3J0LCBpbnQsIC4uLikgb2YKLQlzdGF0aWMgYW5kIGdsb2JhbCB2YXJpYWJsZXMgd2l0aCBkYXRhIHNodWZmbGluZyB0byBnZW5lcmF0ZSBsb3RzIG9mIGxkL3N0Ci0JaW5zdHJ1Y3Rpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzLgotCShyZWxvY3MyLmQpOiBOZXcgZmlsZSwgZXhwZWN0ZWQgY29kZSBmb3IgcmVsb2NzMiB0ZXN0LgotCShyZWxvY3MyLmxzdCk6IE5ldyBmaWxlLCBUSSBhc3NlbWJsZXIgbGlzdGluZyBmb3IgcmVmZXJlbmNlLgotCShyZWxvY3MyLnMpOiBOZXcgZmlsZSwgYXNzZW1ibHkgc291cmNlIGZvciByZWxvY3MyIHRlc3QuCi0JKHJlbG9jczJiLmQpOiBOZXcgZmlsZSwgZXhwZWN0ZWQgcmVsb2MgdGFibGUgY29udGVudHMgZm9yIHJlbG9jczIgdGVzdC4KLQkodGljODAuZXhwKTogUnVuIHRoZSByZWxvY3MxYiwgcmVsb2NzMiwgYW5kIHJlbG9jczJiIHRlc3RzLgotCi1TdW4gRmViIDIzIDE3OjU0OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9pdGJsLXRlc3QuYyhtYWluKTogVXBkYXRlIGZ1bmN0aW9uIGNhbGxzLgotCVJlbW92ZSBwYXJhbWV0ZXJzIGZyb20gaXRibF9nZXRfcmVnX3ZhbCBhbmQKLQljaGFuZ2UgaXRibF9nZXRfaW5zbl9uYW1lIHRvIGl0YmxfZ2V0X2ZpZWxkLgotCi1TdW4gRmViIDIzIDE3OjIyOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvaXRibDogQWRkIGNvbW1lbnRzLgotCSogZ2FzL21pcHMvaXRibC5zOiBBZGQgY29tbWVudHMuICBQcmVmaXggcmVnaXN0ZXIgbmFtZXMgd2l0aCAkLgotCSogZ2FzL2FsbC9pdGJsOiBHZW5lcmljIHRhYmxlIGZvciB0ZXN0aW5nIGZvciBpdGJsIHN1cHBvcnQuCi0JKiBnYXMvYWxsL2l0YmwuczogR2VuZXJpYyBhc3NlbWJseSBmb3IgdGVzdGluZyBmb3IgaXRibCBzdXBwb3J0LgotCSogZ2FzL21pcHMvaXRibC10ZXN0LmM6IE1vdmVkIHRvIGdhcy9hbGwuCi0JKiBnYXMvYWxsL2l0YmwtdGVzdC5jOiBNb3ZlZCBmcm9tIGdhcy9taXBzLgotCi1TYXQgRmViIDIyIDIwOjI0OjIzIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBnYXMvdGljODAve2FkZC5sc3QsIGJpdG51bS5sc3QsIGNjb2RlLmxzdCwgY3JlZ29wcy5sc3QsCi0gCWVuZG1hc2subHN0LCByZWdvcHMubHN0fTogUmVtb3ZlIF5NJ3MgZnJvbSBlbmQgb2YgbGluZXMuCi0JKiBnYXMvdGljODAvYml0bnVtLnM6IEFkZCBjb21tZW50IHRvIGVhY2ggbGluZSBzaG93aW5nIHZhbHVlCi0JdGhhdCBzeW1ib2xpYyBCSVROVU0gYXNzZW1ibGVzIHRvLiAgQWRkIGNvdmVyYWdlIGZvciByYXcKLQludW1lcmljIHZhbHVlcyBmb3IgdGhlIEJJVE5VTSBvcGVyYW5kLgotCSogZ2FzL3RpYzgwL2JpdG51bS5kOiBVcGRhdGUgZHVlIHRvIGJpdG51bS5zIGNoYW5nZXMuCi0JKiBnYXMvdGljODAvcmVnb3BzLmQ6IFVwZGF0ZSBkdWUgdG8gb3Bjb2RlIGxpYnJhcnkgYWRkaXRpb25zCi0Jb2YgZmxvYXRpbmcgcG9pbnQgdGVzdCBCSVROVU0gdmFsdWVzIHRoYXQgYXJlIGFtYmlndW91cyB3aXRoCi0JdGhlIGludGVncmFsIG9uZXMuCi0JKiBnYXMvdGljODAvcmVsb2NzMS5zOiBOZXcgdGVzdCBjYXNlIHRoYXQgdGVzdHMgc2ltcGxlIHJlbG9jcy4KLQkqIGdhcy90aWM4MC9yZWxvY3MxLmQ6IEV4cGVjdGVkIG91dHB1dCBmb3IgYWJvdmUuCi0JKiBnYXMvdGljODAvcmVsb2NzMS5sc3Q6IFRJIGFzc2VtYmxlciBsaXN0aW5nIGZvciBhYm92ZS4KLQkqIGdhcy90aWM4MC90aWM4MC5leHA6IEFkZCByZWxvY3MxIHRlc3QuCi0KLUZyaSBGZWIgMjEgMTQ6MjM6MTQgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L3thbGlnbi5kLCBhbGlnbi5zLCBkMzAuZXhwLCBndWFyZC5kLCBndWFyZC5zLAotCWluc3QuZCwgaW5zdC5zLCBvcHQuZCwgb3B0LnN9OiBUZXN0IGZpbGVzIGZvciBEMzBWLgotCi1XZWQgRmViIDE5IDAwOjU1OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21hY3Jvcy9zZW1pLnMsIGdhcy9tYWNyb3Mvc2VtaS5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tYWNyb3MvbWFjcm9zLmV4cDogUnVuIGl0LgotCSogZ2FzL21yaS9zZW1pLnMsIGdhcy9tcmkvc2VtaS5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tcmkvbXJpLmV4cDogUnVuIGl0LgotCi1UdWUgRmViIDE4IDEzOjM3OjA2IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwIChhbGlnbjQgdGVzdHMpOiBUd2VhayBleHBlY3RlZAotCW91dHB1dC4KLQkKLUZyaSBGZWIgMTQgMTc6NTY6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2FsaWduLmQsIGdhcy9hbGwvYWxpZ24uczogTmV3IHRlc3QuCi0JKiBnYXMvYWxsL2dhcy5leHA6IFJ1biBpdC4KLQotVGh1IEZlYiAxMyAxNDo0NDowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMxNi5kOiBDb3JyZWN0IFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIGJ5dGVzLgotCi1XZWQgRmViIDEyIDEyOjMzOjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbGlmLXN2cjRwaWMuZDogUGFzcyAtRUIgd2hlbiBydW5uaW5nIHRoZSBhc3NlbWJsZXIuCi0JKiBnYXMvbWlwcy9saWYteGdvdC5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL3VsaC1zdnI0cGljLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvdWxoLXhnb3QuZDogTGlrZXdpc2UuCi0KLQkqIGdhcy9taXBzL21pcHMxNi5kOiBVcGRhdGUgZm9yIHlldCBhbm90aGVyIGNoYW5nZSBpbiBkaXNhc3NlbWJseQotCW91dHB1dCAodGhpcyBvbmUgaXMgc3BhY2luZyBvbmx5KS4KLQotVHVlIEZlYiAxMSAxNDo0NTozOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3RpYzgwL3thZGQuZCwgYWRkLmxzdCwgYWRkLnMsIGJpdG51bS5kLCBiaXRudW0ubHN0LCBiaXRudW0ucywKLSAJY2NvZGUuZCwgY2NvZGUubHN0LCBjY29kZS5zLCBjcmVnb3BzLmQsIGNyZWdvcHMubHN0LCBjcmVnb3BzLnMsCi0JZW5kbWFzay5kLCBlbmRtYXNrLmxzdCwgZW5kbWFzay5zLCByZWdvcHMuZCwgcmVnb3BzLmxzdCwgcmVnb3BzLnMsCi0JdGljODAuZXhwfTogTmV3IGZpbGVzIGZvciBUSWM4MCB0ZXN0IGNhc2VzLgotCi1UdWUgRmViIDExIDE1OjQ2OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczE2LmQ6IFVwZGF0ZSBmb3IgY2hhbmdlIGluIGRpc2Fzc2VtYmx5IG91dHB1dC4KLQotTW9uIEZlYiAxMCAyMjoyNDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBnYXMvbWlwcy9pdGJsLXRlc3QuYzogQWRkIGNvcHlyaWdodCBtZXNzYWdlIGFuZCBmaXggaW5kZW50YXRpb24uICAgCi0KLU1vbiBGZWIgMTAgMTc6NTQ6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9pdGJsLXRlc3QuYzogTmV3IGZpbGUuICBTdGFuZC1hbG9uZSBhc3NlbWJsZXIgYW5kIAotCWRpc3Nhc3NlbWJsZXIgZm9yIGl0Ymwgc3VwcG9ydC4KLQotTW9uIEZlYiAxMCAxNzoyMDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2l0Ymw6IE5ldyBmaWxlLiAgSW5zdHJ1Y3Rpb24gU3BlYyBmb3IgdGVzdGluZyAtLWl0YmwKLQlvcHRpb24uCi0JKiBnYXMvbWlwcy9pdGJsLnM6IE5ldyBmaWxlLiAgQXNzZW1ibHkgd2l0aCBuZTJ3IGluc3RydWN0aW9ucwotCXNwZWNpZmllZCBpbiBpdGJsLgotCi1GcmkgRmViICA3IDE2OjQyOjUzIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBnYXNwL2dhc3AuZXhwOiBVc2UgcHJ1bmVfd2FybmluZ3MgaW5zdGVhZCBvZiBwcnVuZV9zeXN0ZW1fY3J1ZC4KLQkqIGxpYi9nYXMtZGVmcy5leHA6IERpdHRvLgotCi1Nb24gRmViICAzIDE1OjQ2OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9pbnN0LmQsIGdhcy9hcm0vYXJtN3QuZDogUGFzcyAtLXByZWZpeC1hZGRyZXNzZXMgdG8KLQlvYmpkdW1wLiAgVXBkYXRlIGZvciBjdXJyZW50IHJlbG9jYXRpb24gcHJpbnRpbmcgc3R5bGUuCi0KLVRodSBKYW4gMzAgMTE6NTc6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzMTYuZDogVXBkYXRlIGZvciBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQotVGh1IEphbiAyMyAwMzoxNTowNiAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IHNldCBpbG9ja3MgZm9yIGFsbCA0MTAwLzQzMDAKLQotVGh1IEphbiAgMiAxNjo0OToxNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMxNi5zLCBnYXMvbWlwcy9taXBzMTYuZDogTmV3IHRlc3QuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIG1pcHMxNiB0ZXN0LgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIGRsaSB0ZXN0IHVuY29uZGl0aW9uYWxseS4KLQkqIGdhcy9taXBzL2RsaS5zOiBBZGQgdGV4dCBzeW1ib2wuICBBZGQgbm9wcyB0byByb3VuZCB0byAxNiBieXRlCi0JYm91bmRhcnkuCi0JKiBnYXMvbWlwcy9kbGkuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1UdWUgRGVjIDMxIDEzOjAzOjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3N5bnRoLmQ6IFVzZSAtLXByZWZpeC1hZGRyZXNzZXMgZm9yIG9iamR1bXAuCi0JKiBnYXMvc3BhcmMvc3ludGg2NC5kOiBMaWtld2lzZS4KLQotVHVlIERlYyAyNCAxNjozMDo1OCAxOTk2ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHMvKi1pbG9ja3MuZDogRml4IHJlZ2V4cHMgdG8gcmVzZW1ibGUgZGlzYXNzZW1ibGVkIG91dHB1dC4KLQotRnJpIERlYyAxMyAxMzowNTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzLyouW3NkXTogQWRkIGV4cGxpY2l0IG5vcHMsIHNvbWV0aW1lcyBjb250cm9sbGVkIGJ5Ci0JLmlmZGVmLCB0byBhY2NvbW9kYXRlIGNoYW5nZSB0byBhdm9pZCBkZWZhdWx0IGFsaWdubWVudCBvbgotCWVtYmVkZGVkIHN5c3RlbXMuCi0KLVdlZCBEZWMgMTEgMDk6MjY6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDIwMC9iYXNpYy5leHAgKGRvX21vdmIpOiBGaXggYml0IHBhdHRlcm4gZm9yCi0JIm1vdmIgZG0sKGFuKSIuCi0KLVR1ZSBEZWMgMTAgMTM6MDE6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFVwZGF0ZSBhZnRlciBlbmRpYW5uZXNzIGNoYW5nZXMgdG8KLQl0aGUgYXNzZW1ibGVyLgotCi0JKiBnYXMvbW4xMDIwMC97bW92MS5zLG1vdjIucyxtb3YzLnMsbW92NC5zLG1vdnguc306IE5ldyB0ZXN0cy4KLQkqIGdhcy9tbjEwMjAwL3ttb3ZiLnMsIG1vdmJ1LnN9OiBMaWtld2lzZS4KLQkqIGdhcy9tbjEwMjAwL2Jhc2ljLmV4cDogUnVuIHRoZW0uCi0KLU1vbiBEZWMgIDkgMTc6MDg6MzggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDIwMC8qLnM6IE5ldyB0ZXN0cyBmb3IgdGhlIG1uMTAyMDAgYXNzZW1ibGVyLgotCSogZ2FzL21uMTAyMDAvYmFzaWMuZXhwOiBSdW4gdGhlbS4KLQotRnJpIERlYyAgNiAxNTozNTowNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwLyouczogUmVtb3ZlICckJyByZWdpc3RlciBwcmVmaXhpbmcuCi0KLU1vbiBOb3YgMjUgMTY6MzU6MzMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cDogRml4IHBhdHRlcm5zLCB5b3UgY2FuJ3QgYXNzdW1lCi0JXHIgd2lsbCBiZSBwcmVzZW50LgotCi1Nb24gTm92IDI1IDEzOjQ1OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvKi5kOiBVcGRhdGUgZm9yIGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCSogZ2FzL21yaS8qLmQ6IExpa2V3aXNlLgotCi1Nb24gTm92IDI1IDExOjM4OjM3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvKi5zOiBVc2UgJyQnIGFzIHJlZ2lzdGVyIHByZWZpeCBmb3IKLQlhbGwgcmVnaXN0ZXIgb3BlcmFuZHMuCi0KLVRodSBOb3YgMjEgMTE6NTI6NTQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvYWxsL2dhcy5leHA6IHhmYWlsIGEgY291cGxlIHRlc3RzIGZvciB0aGUgbW4xMDMwMC4KLQotV2VkIE5vdiAyMCAxMTozMTo0MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL290aGVyLnM6IFVwZGF0ZSBmb3IgY29ycmVjdCBzeW50YXggb24gYQotCWZldyBpbnN0cnVjdGlvbnMgKHRob3NlIHdpdGggcmVnaXN0ZXIgbGlzdHMpLgotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVR1ZSBOb3YgMTkgMTM6MzY6NTcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9tb3ZtLnM6IFVwZGF0ZSBmb3IgY29ycmVjdCBzeW50YXguCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFVwZGF0ZSBleHBlY3RlZCBtb3ZtIGJpdCBwYXR0ZXJucy4KLQotRnJpIE5vdiAxNSAxMzo1Nzo0MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL290aGVyLnM6IFB1dCBwYXJlbnMgYXJvdW5kIHJlZ2lzdGVyCi0JYXJndW1lbnQgaW4gY2FsbHMgYW5kIGptcCBpbnN0cnVjdGlvbnMuCi0KLVdlZCBOb3YgMTMgMTM6MTY6MDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaDgzMDAvZmZ4eDEuZDogVXBkYXRlIGZvciByZWNlbnQgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0KLU1vbiBOb3YgMTEgMTY6MDM6MjQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFBhc3MgIi0tcHJlZml4LWFkZHJlc3NlcyIgdG8gb2JqZHVtcAotCWFzIG5lZWRlZC4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogTGlrZXdpc2UuCi0KLVRodSBOb3YgIDcgMDA6Mjc6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IENoZWNrIG9wY29kZSBpbnNlcnRpb24gZm9yCi0JZXh0ZW5kZWQgaW5zdHJ1Y3Rpb25zLgotCSogZ2FzL21uMTAzMDAvZXh0ZW5kLnM6IFR3ZWFrIGNvbnN0YW50cyBmb3IgYmV0dGVyCi0JdGVzdHN1aXRlIGNvdmVyYWdlLgotCi1XZWQgTm92ICA2IDEzOjUwOjA3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBUZXN0IGluc2VydGlvbiBvZiBvcGVyYW5kcwotCWludG8gY2FsbCBhbmQgam1wIGluc3RydWN0aW9ucyB3aXRoIDMyYml0IG9mZnNldHMuCi0JRml4IHR5cG8gaW4gYml0IHRlc3QgcGF0dGVybnMuCi0JKiBnYXMvbW4xMDMwMC9vdGhlci5zOiBUd2VhayBjb25zdGFudHMgdG8gaW1wcm92ZQotCXRlc3RzdWl0ZSBjb3ZlcmFnZS4KLQotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBUZXN0IGluc2VydGlvbiBvZiAzMmJpdCBvcGVyYW5kCi0JaW4gY2FsbHMsIGJ0c3QsIGJjbHIgJiBic2V0IGluc3RydWN0aW9ucy4KLQotCSogZ2FzL21uMTAzMDAvKi5zOiBUd2VhayBjb25zdGFudHMgaW4gMzJiaXQgaW5zbnMgZm9yCi0JYmV0dGVyIHRlc3RpbmcgY292ZXJhZ2UuCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFRlc3QgaW5zZXJ0aW9uIG9mIG1vc3QgMzJiaXQKLQlvcGVyYW5kcy4KLQotVHVlIE5vdiAgNSAxMzozMzoxMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBpbmRleGVkIG1vdiwKLQltb3ZidSwgbW92aHUgaW5zdHJ1Y3Rpb25zLiAgQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBtb3JlIGJpdAotCW9wZXJhdGlvbnMuICBDaGVjayBiaXQgcGF0dGVybnMgZm9yIHZhcmlvdXMgMTZiaXQgY2FsbCwgcmV0ZgotCWFuZCByZXQgaW5zdHJ1Y3Rpb25zLgotCSogZ2FzL21uMTAzMDAvb3RoZXIuczogVXBkYXRlIG9wZXJhbmRzIGZvciBiZXR0ZXIgdGVzdCBjb3ZlcmFnZS4KLQotTW9uIE5vdiAgNCAxMjo1NToxMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBhIGNvdXBsZSBtb3JlCi0JbW92IGFuZCBjbXAgaW5zdHJ1Y3Rpb25zLgotCi1UdWUgT2N0IDI5IDE3OjA1OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvKi5kOiBVcGRhdGUgZm9yIGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCi1XZWQgT2N0IDE2IDIyOjM5OjUwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL3Y4NTAvcmVsb2MuczogTmV3IHRlc3RzLgotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwOiBSdW4gdGhlbS4KLQotTW9uIE9jdCAxNCAxMzo1Mjo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzOiBBZGQgc3ltYm9scyB0byBzZXZlcmFsIHRlc3RzdWl0ZXMsIHNpbmNlIHRoZSBFTEYKLQlhc3NlbWJsZXIgbm93IGFsd2F5cyBidWlsZHMgYSBzeW1ib2wgdGFibGUsIHdoaWNoIG1lYW5zIHRoYXQKLQlvYmpkdW1wIHdpbGwgbm8gbG9uZ2VyIHJlcG9ydCBgTm8gc3ltYm9scyBpbiBGSUxFJy4gIENoYW5nZSB0aGUKLQlleHBlY3RlZCBvdXRwdXQgYWNjb3JkaW5nbHkuCi0KLVRodSBPY3QgMTAgMTM6MTE6NDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IENoZWNrIGJpdCBwYXR0ZXJucyBmb3IgaW5zdHJ1Y3Rpb25zCi0Jd2l0aCBhIHNpbmdsZSA4Yml0IG9yIDE2Yml0IGltbWVkaWF0ZSBvcGVyYW5kLgotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IENoZWNrIGJpdCBwYXR0ZXJucyBmb3IgbWFueQotCWluc3RydWN0aW9ucy4gIEFkZCBtaXNzaW5nIHRlc3QgaW4gZG9fbW92MS4KLQkqIGdhcy9tbjEwMzAwL21vdjEuczogQWRkIG1pc3NpbmcgdGVzdC4KLQotV2VkIE9jdCAgOSAxNDoxNToxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL3thZGQucywgYmNjLnMsIGJpdC5zLCBjbXAucywgZXh0LnN9OiBOZXcgdGVzdHMuCi0JKiBnYXMvbW4xMDMwMC97ZXh0ZW5kLnMgbG9naWNhbC5zLCBsb29wLnMsIG1vdjEuc306IExpa2V3aXNlLgotCSogZ2FzL21uMTAzMDAve21vdjIucywgbW92My5zLCBtb3Y0LnMsIG1vdmJ1LnN9OiBMaWtld2lzZS4KLQkqIGdhcy9tbjEwMzAwL3ttb3ZodS5zLCBtb3ZtLnMsIG11bGRpdi5zLCBvdGhlci5zfTogTGlrZXdpc2UuCi0JKiBnYXMvbW4xMDMwMC97c2hpZnQucywgc3ViLnN9OiBMaWtld2lzZS4KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogUnVuIHRoZW0uCi0KLVRodSBPY3QgIDMgMDk6NTc6MDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDIwMCwgZ2FzL21uMTAzMDA6IE5ldyBkaXJlY3RvcmllcyBmb3IgTWF0c3VzaGl0YQotCW1uMTAyMDAgYW5kIG1uMTAzMDAgdGVzdHMuCi0KLVR1ZSBPY3QgIDEgMTU6Mzg6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChnYXNfdmVyc2lvbik6IEZpeCBmb3IgY3VycmVudCB2ZXJzaW9uCi0JcHJpbnRpbmcuCi0KLVN1biBTZXAgMjkgMDc6NTU6NTggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3NwbGV0LmQ6IEZpeCB0eXBvIGluIGNwdXNoYSByZXN1bHQuCi0KLU1vbiBTZXAgMjMgMTI6MzM6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9mbW92ZW1sLnMsIGdhcy9tNjhrL2Ztb3ZlbWwuZDogQWRkIHRlc3RzIGZvciBmbW92ZW14LgotCi1XZWQgU2VwIDE4IDEyOjE0OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9jb2ZmdGFnLnM6IFVzZSAucDJhbGlnbiByYXRoZXIgdGhhbiAuYWxpZ24uCi0KLUZyaSBTZXAgMTMgMTU6Mjg6MDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaDgzMDAvbWFjcy5zOiBBZGQgInN0bWFjIiBpbnN0cnVjdGlvbnMuCi0JKiBnYXMvaDgzMDAvYmFzaWMuZXhwOiBUZXN0IHRoZW0uCi0KLVRodSBTZXAgMTIgMTA6Mjg6NDQgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvYXJtL3RodW1iLnMgKGJhY2spOiBDaGVjayBhc3NlbWJseSBvZiBUaHVtYiBCTC4KLQotTW9uIFNlcCAgOSAxNDozNzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHM0LnMsIGdhcy9taXBzL21pcHM0LmQ6IFVzZSAkZmNjTiBmb3IgY29uZGl0aW9uIGNvZGUKLQlyZWdpc3RlcnMuCi0KLUZyaSBTZXAgIDYgMTg6MjM6NTQgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvbWlwcy9kbGkue3MsZH06IE1vcmUgdGVzdCBjYXNlcyBhZGRlZC4KLQotV2VkIFNlcCAgNCAxMTo0NzoyOSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBBZGQgY2hlY2sgZm9yIGRsaSBtYWNybyBpbnN0cnVjdGlvbi4KLQkqIGdhcy9taXBzL2RsaS57cyxkfTogQWRkZWQuCi0KLVNhdCBBdWcgMzEgMDE6MjU6MDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX21lbSk6IENoZWNrIGJpdCBwYXR0ZXJucyBmb3Igc2hvcnQKLQlsb2FkL3N0b3JlIGluc3RydWN0aW9ucy4gIFJlbW92ZSB4ZmFpbHMgZm9yIHNob3J0IGxvYWQvc3RvcmUKLQlpbnN0cnVjdGlvbnMuCi0JKiBnYXMvdjg1MC9tZW0uczogT2Zmc2V0cyBmb3Igc2hvcnQgbG9hZC9zdG9yZSBvcGVyYW5kcwotCWFyZSB1bnNpZ25lZC4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19icmFuY2gpOiBDaGVjayBvZmZzZXRzIGluIGJyYW5jaCBpbnNucy4KLQkoZG9fanVtcHMpOiBMaWtld2lzZS4KLQkKLUZyaSBBdWcgMzAgMDA6Mzc6NTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvdjg1MC9taXNjLnM6IFR3ZWFrIHJlZ2lzdGVyIG51bWJlcnMgZm9yIGJldHRlciB0ZXN0aW5nLgotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19taXNjKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi0JKiBnYXMvdjg1MC9oaWxvLnM6IE5ldyB0ZXN0ZmlsZS4KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cDogUnVuIGhpbG8gdGVzdHMuCi0KLVRodSBBdWcgMjkgMTE6MzI6MjMgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvYXJtL2FybTd0LmQ6IEV4cGxpY2l0bHkgZm9yY2UgbGl0dGxlLWVuZGlhbiBhc3NlbWJseS4KLQotRnJpIEF1ZyAyMyAxMTowMjo1NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbW92ZSk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLgotCSogZ2FzL3Y4NTAvbW92ZS5zOiBUd2VhayBjb25zdGFudHMgZm9yIGJldHRlciB0ZXN0aW5nLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX21lbSk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLgotCXhmYWlsIHNzdCBhbmQgc2xkIHRlc3RzLgotCShkb19tb3YpOiBSZW1vdmUgYm9ndXMgeGZhaWwuCi0JKiBnYXMvdjg1MC9tZW0uczogc3N0IGFuZCBzbGQgaW5zdHJ1Y3Rpb25zIGNhbiBvbmx5IGluZGV4IGZyb20KLQkiZXAiIHJlZ2lzdGVyLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX2xvZ2ljYWwpOiBUZXN0IGluc3RydWN0aW9uIGJpdCBwYXR0ZXJucy4KLQlVcGRhdGUgYWRkcmVzc2VzLgotCSogZ2FzL3Y4NTAvbG9naWNhbC5zOiBUd2VhayBjb25zdGFudHMgZm9yIGJldHRlciB0ZXN0aW5nLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX2p1bXApOiBUZXN0IGluc3RydWN0aW9uIGJpdCBwYXR0ZXJucywKLQlidXQgbm90IGRpc3BsYWNlbWVudHMgKHlldCkuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fY29tcGFyZSk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX2JyYW5jaCk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLAotCWJ1dCBub3QgZGlzcGxhY2VtZW50cyAoeWV0KS4KLQkKLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fYml0KTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fYXJpdGgpOiBUZXN0IGluc3RydWN0aW9uIGJpdCBwYXR0ZXJucy4JCi0JKiBnYXMvdjg1MC9hcml0aC5zOiBUd2VhayBjb25zdGFudHMgZm9yIGJldHRlciB0ZXN0aW5nLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX21pc2MpOiBObyBsb25nZXIgZXhwZWN0IGZhaWx1cmVzCi0JYXNzZW1ibGluZyAibGRzciIgYW5kICJzdHNyIiBvcGNvZGVzLgotCSogZ2FzL3Y4NTAvbWlzYy5zOiBSZS1lbmFibGUgYXNzZW1ibGluZyBvZiAibGRzciIgYW5kICJzdHNyIgotCW9wY29kZXMuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbWlzYyk6IE5vIGxvbmdlciBleHBlY3QgZmFpbHVyZXMKLQlhc3NlbWJsaW5nICJ0cmFwIiBvcGNvZGVzLgotCSogZ2FzL3Y4NTAvbWlzYy5zOiBSZS1lbmFibGUgYXNzZW1ibGluZyBvZiAidHJhcCIgb3Bjb2Rlcy4KLQotCSogZ2FzL3Y4NTA6IE5ldyBkaXJlY3Rvcnkgd2l0aCB2ODUwIHRlc3RzLgotCi1GcmkgQXVnIDE2IDAwOjE5OjEwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2hwcGEvYmFzaWMvcHVyZ2UuczogVXNlICIlc3I0IiBvbiBwaXRsYiwgcGl0bGJlCi0JZmljIGFuZCBmaWNlIGluc3RydWN0aW9ucyB0byB0ZXN0IDNiaXQgc3BhY2UgaWRlbnRpZmllcnMuCi0JKiBnYXMvaHBwYS9iYXNpYy9zeXN0ZW0uczogU2ltaWxhcmx5IGZvciBpaXRsYmEgYW5kCi0JaWl0bGJwLgotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVRodSBBdWcgMTUgMTY6MjU6MDUgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvYXJtL2FybS5leHA6IENoYW5nZSBpbnN0LnMgdGVzdCB0byBjaGVjayBvYmpkdW1wLgotCSogZ2FzL2FybS9pbnN0LmQ6IEFkZGVkLgotCQotVGh1IEF1ZyAxNSAxNjowNjowMiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGdhcy9hcm0vdGh1bWIuczogQWRkZWQuCi0JKiBnYXMvYXJtL2ltbWVkLnM6IEFkZGVkLgotCSogZ2FzL2FybS9hcmNoNHQuczogQWRkZWQuCi0JKiBnYXMvYXJtL2FybS5leHA6IFVwZGF0ZWQgdG8gcnVuIHRoZSBuZXcgdGVzdHMuCi0KLVR1ZSBBdWcgIDYgMTE6MDY6MjkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaDgzMDAvbWlzY2guczogUmVlbmFibGUgImVlcG1vdi53IiB0ZXN0LgotCSogZ2FzL2g4MzAwL21pc2NzLnM6IExpa2V3aXNlLgotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogQ2hlY2sgZm9yIGNvcnJlY3QgYXNzZW1ibHkgb2YgImVlcG1vdi53IgotCW9uIHRoZSBIOC8zMDBIIGFuZCBIOC9TLiAgRG9uJ3QgZXhwZWN0IGl0IHRvIGZhaWwuCi0KLVdlZCBKdWwgMzEgMTA6NTc6NDQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL2FzaS5zOiBVcGRhdGUgQVNJX0FTX0lGX1VTRVJfe1BSSU1BUlksU0VDT05EQVJZfV9MSVRUTEUuCi0KLVdlZCBKdWwgMzEgMTU6NTU6MTIgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvYXJtL2FybTd0LnM6IEFkZGVkLgotCSogZ2FzL2FybS9hcm03dC5kOiBBZGRlZC4KLQkqIGdhcy9hcm0vYXJtLmV4cDogVXBkYXRlZCB0byBydW4gdGhlIG5ldyB0ZXN0LgotCi1Nb24gSnVsICA4IDE0OjI3OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvcGNyZWwuZDogUmVuYW1lIGZyb20gc2Nod2FiLmQuCi0JKiBnYXMvbTY4ay9wY3JlbC5zOiBSZW5hbWUgZnJvbSBzY2h3YWIucy4KLQotTW9uIEp1bCAgOCAxNDoyMzoyNiAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZ2FzL202OGsvc2Nod2FiLmQ6IENvcnJlY3QgZm9yIEVMRiBmb3JtYXQuCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gInNjaHdhYiIgdGVzdCBmb3IgYWxsIHRhcmdldHMuCi0KLVRodSBKdWwgIDQgMTQ6MjM6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQXZvaWQgRE9TIGZpbGUgbmFtaW5nIHByb2JsZW1zOgotCSogZ2FzL2g4MzAwL2JyYW5jaC5zOiBSZW5hbWUgZnJvbSBicmFuY2hlcy5zLgotCSogZ2FzL2g4MzAwL2JyYW5jaGguczogUmVuYW1lIGZyb20gYnJhbmNoZXNoLnMuCi0JKiBnYXMvaDgzMDAvYnJhbmNocy5zOiBSZW5hbWUgZnJvbSBicmFuY2hlc3Mucy4KLQkqIGdhcy9oODMwMC9yb3RzaC5zOiBSZW5hbWUgZnJvbSByb3RzaGlmdC5zLgotCSogZ2FzL2g4MzAwL3JvdHNoaC5zOiBSZW5hbWUgZnJvbSByb3RzaGlmdGgucy4KLQkqIGdhcy9oODMwMC9yb3RzaHMuczogUmVuYW1lIGZyb20gcm90c2hpZnRzLnMuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVRodSBKdWwgIDQgMTQ6MDE6NDYgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogQWRkIG5ldyB0ZXN0cyBmb3IgcHJvY2Vzc29ycyB3aXRoIGludGVybG9ja3MKLSAJb24gZGl2IGFuZCBtdWwuCi0JKiBnYXMvbWlwcy9kaXYtaWxvY2tzLmQ6IEFkZGVkLgotCSogZ2FzL21pcHMvbXVsLWlsb2Nrcy5kOiBBZGRlZC4KLQkKLVdlZCBKdWwgIDMgMTQ6MjA6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IFJlbW92ZSBzZXR1cF94ZmFpbCBmb3IgaDgzMDAqLSotKiBmb3IgdHdvIHRlc3RzCi0Jd2hpY2ggbm93IHBhc3MuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBGaXggcmVnZXhwIG9mIG1vdjMyYnVnIHRlc3QgdG8gd29yayBvbiBhIDY0Ci0JYml0IGhvc3QuCi0KLVNhdCBKdW4gMjkgMTg6MjE6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgdmF4Ki0qLXZtcyogZm9yIDkzMDUwOWEKLQl0ZXN0LgotCSogZ2FzL3ZheC9xdWFkLmV4cDogRXhwZWN0IGEgbm9wIGFmdGVyIHRoZSBtb3ZxLgotCi1UdWUgSnVuIDE4IDEyOjM5OjQ5IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBnYXMvaDgzMDAvY2JyYW5jaGguczogU3dpdGNoIGludG8gaDgzMDBoIG1vZGUuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwIChIOC8zMDBIIG1pc2MgdGVzdHMpOiBGaXggdGVzdCBuYW1lcy4KLQotCSogZ2FzL2g4MzAwL3thZGRzdWJzLnMsYml0b3BzMXMucyxiaXRvcHMycy5zfTogTmV3IHRlc3RzIGZvciB0aGUKLQlIOC9TLgotCSogZ2FzL2g4MzAwL3tiaXRvcHMzLnMsYml0b3BzNC5zLGNicmFuY2hzLnMsbG9naWNhbHMuc306IExpa2V3aXNlLgotCSogZ2FzL2g4MzAwL3ticmFuY2hlc3Mucyxjb21wYXJlcy5zLG1hY3MucyxkZWNpbWFscy5zfTogTGlrZXdpc2UuCi0JKiBnYXMvaDgzMDAve2luY2RlY3MucyxkaXZtdWxzLnMsbWlzY3MucyxtdWx0aXBsZXMuc306IExpa2V3aXNlLgotCSogZ2FzL2g4MzAwL3ttb3Zicy5zLG1vdndzLnMsbW92bHMucyxwdXNocG9wcy5zfTogTGlrZXdpc2UuCi0JKiBnYXMvaDgzMDAve3JvdHNoaWZ0cy5zLGV4dGVuZHMuc306IExpa2V3aXNlLgotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogUnVuIHRoZW0uCi0KLU1vbiBKdW4gMTAgMTQ6MTQ6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2NvZmZ0YWcucywgZ2FzL2FsbC9jb2ZmdGFnLmQ6IE5ldyB0ZXN0IGZvciBDT0ZGIGVudW0gdGFnCi0Jd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgZ2xvYmFsIHZhcmlhYmxlLgotCSogZ2FzL2FsbC9nYXMuZXhwOiBSdW4gY29mZnRhZyB0ZXN0IGZvciBhbnkgQ09GRiB0YXJnZXQuCi0KLVRodSBKdW4gIDYgMTI6MzA6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBQYXNzIC1tNjgwMjAgd2hlbiBhc3NlbWJsaW5nIHRoZSBkaXNwZXJyLnMKLQl0ZXN0LgotCi1GcmkgTWF5IDMxIDEwOjExOjEzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogRml4IGFkZC5sIHRlc3QgZm9yIEg4LzMwMEguCi0KLVdlZCBNYXkgMjkgMTY6MzU6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9qYWwteGdvdC5kOiBDb3JyZWN0IGZvciA2NCBiaXQgb3V0cHV0LgotCi1UaHUgQXByIDI1IDE5OjMxOjU5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IE9ubHkgcnVuIHNwYXJjbGV0IHRlc3RzIGlmIHNwYXJjbGV0LgotCi1XZWQgQXByIDI0IDE3OjA2OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvb3A2ODAwMC5kOiBBZGQgc3RhdGVtZW50cyBub3cgY2F1Z2h0IGJ5IGdhcy4KLQotTW9uIEFwciAyMiAxNjo0NToxMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3BsZXQuW2RzXTogTmV3IHRlc3RzIGZvciBzcGFyY2xldCBleHRlbnNpb25zLgotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogUnVuIHRoZW0uCi0KLU1vbiBBcHIgMTUgMTc6MjU6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9sYS5kOiBVcGRhdGVkIGZvciBBcHJpbCA1IE1JUFMgYXNzZW1ibGVyIGNoYW5nZXMuCi0JKiBnYXMvbWlwcy9sYi5kLCBnYXMvbWlwcy9sZC5kLCBnYXMvbWlwcy9zYi5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL3VsZC5kLCBnYXMvbWlwcy91bGguZCwgZ2FzL21pcHMvdWx3LmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvdXNkLmQsIGdhcy9taXBzL3VzaC5kLCBnYXMvbWlwcy91c3cuZDogTGlrZXdpc2UuCi0KLVdlZCBBcHIgMTAgMTQ6Mjc6NTEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaDgzMDAvbW92MzJidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBSdW4gaXQuCi0KLUZyaSBBcHIgIDUgMTA6MTM6MjggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaDgzMDAve2FkZHN1YmgucyxiaXRvcHMxaC5zLGJpdG9wczJoLnN9OiBOZXcgaDgzMDBoIHRlc3RzLgotCSogZ2FzL2g4MzAwL3tiaXRvcHMzaC5zLGJpdG9wczRoLnMsYnJhbmNoZXNoLnN9OiBOZXcgaDgzMDBoIHRlc3RzLgotCSogZ2FzL2g4MzAwL3tjYnJhbmNoaC5zLGNvbXBhcmVoLnMsZGVjaW1hbGguc306IE5ldyBoODMwMGggdGVzdHMuCi0JKiBnYXMvaDgzMDAve2Rpdm11bGgucyxpbmNkZWNoLnMsbG9naWNhbGguc306IE5ldyBoODMwMGggdGVzdHMuCi0JKiBnYXMvaDgzMDAve21pc2NoLnMsbW92Ymgucyxtb3Z3aC5zfTogTmV3IGg4MzAwaCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97cHVzaHBvcGgucyxyb3RzaGlmdGguc306IE5ldyBoODMwMGggdGVzdHMuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBSdW4gdGhlbS4KLQotCSogZ2FzL2g4MzAwL3ttb3ZiLnMsbW92dy5zfTogQ29ycmVjdCBwcmVkZWNyZW1lbnQgc3ludGF4LgotCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBGaXggdHlwb3MgaW4gYml0b3BzNCBhbmQgbW92YiB0ZXN0cy4KLQotCSogZ2FzL2g4MzAwL3thZGRzdWIucyxiaXRvcHMxLnMsYml0b3BzMi5zfTogTmV3IGg4MzAwIHRlc3RzLgotCSogZ2FzL2g4MzAwL3tiaXRvcHMzLnMsYml0b3BzNC5zLGJyYW5jaGVzLnN9OiBOZXcgaDgzMDAgdGVzdHMuCi0JKiBnYXMvaDgzMDAve2NicmFuY2gucyxjb21wYXJlLnMsZGVjaW1hbC5zfTogTmV3IGg4MzAwIHRlc3RzLgotCSogZ2FzL2g4MzAwL3tkaXZtdWwucyxpbmNkZWMucyxsb2dpY2FsLnN9OiBOZXcgaDgzMDAgdGVzdHMuCi0JKiBnYXMvaDgzMDAve21pc2Mucyxtb3ZiLnMsbW92dy5zfTogTmV3IGg4MzAwIHRlc3RzLgotCSogZ2FzL2g4MzAwL3twdXNocG9wLnMscm90c2hpZnQuc306IE5ldyBoODMwMCB0ZXN0cy4KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IFJ1biB0aGVtLgotCi1GcmkgTWFyIDE1IDE3OjE2OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3N5bnRoLmQ6IERvbid0IHJlcXVpcmUgc3BhcmMgaW4gdGhlIGZpbGUgZm9ybWF0LCBzaW5jZQotCWl0IHdvbid0IGJlIHRoZXJlIG9uIFN1bk9TLgotCi1UaHUgTWFyICA3IDE0OjUxOjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3ludGguW2RzXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogUnVuIGl0LgotCi1GcmkgTWFyICAxIDEyOjAxOjQ4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2FsbC9nYXMuZXhwOiB4ZmFpbCBkaWZmZXJlbmNlIG9mIHR3byB1bmRlZmluZWQgc3ltYm9scwotCWFuZCBkaWZmZXJlbmNlIG9mIGZvcndhcmQgcmVmZXJlbmNlcyBmb3IgdGhlIGg4MzAwLgotCi1UaHUgRmViIDIyIDE2OjQwOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbGIteGdvdC5kOiBDb3JyZWN0LgotCi1Nb24gRmViIDE5IDAyOjQzOjM2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMve2FzaSxtZW1iYXIscHJlZmV0Y2gscmRwcixzeW50aDY0LHdycHJ9LmQ6IFBhc3MgLUF2OQotCXRvIGdhcy4KLQkqIGdhcy9zcGFyYy9hZGRlbmQuZXhwOiBFeGVjdXRlIGZvciBhbnkgc3BhcmMgY3B1LgotCSogZ2FzL3NwYXJjL3ttaXNtYXRjaC5leHAsbWlzbS0xLnN9OiBOZXcgdGVzdC4KLQotV2VkIEZlYiAxNCAxMzo0OTo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2phbC14Z290LmQsIGdhcy9taXBzL2xhLXhnb3QuZDogTmV3IHRlc3RzLgotCSogZ2FzL21pcHMvbGIteGdvdC5kLCBnYXMvbWlwcy9sZC14Z290LmQ6IE5ldyB0ZXN0cy4KLQkqIGdhcy9taXBzL2xpZi14Z290LmQsIGdhcy9taXBzL3VsaC14Z290LmQ6IE5ldyB0ZXN0cy4KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gbmV3IHRlc3RzIGlmIHN2cjRwaWMuCi0KLVNhdCBKYW4gMjcgMTM6Mjc6NDUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGcuZXhwIChnYXMtZGctdGVzdCk6IERlbGV0ZSBkZWZhdWx0X2ZsYWdzIGFuZCBsaWJzIGFyZ3MuCi0KLUZyaSBKYW4gMjYgMTQ6MjQ6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFVwZGF0ZSBmb3Igb2JqZHVtcCBjaGFuZ2VzLgotCi1XZWQgSmFuIDEwIDEyOjQwOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvKi5kOiBVcGRhdGUgZm9yIGNoYW5nZXMgdG8gZGlzYXNzZW1ibGVyLgotCi1XZWQgSmFuICAzIDIyOjU5OjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvdWxoLXN2cjRwaWMuZDogVXBkYXRlIGZvciB0Yy1taXBzLmMgbG9hZF9hZGRyZXNzCi0gCWNoYW5nZS4KLQotRnJpIE5vdiAxNyAxMDozMjoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvaW1tY29uc3QuZDogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL21yaS5leHA6IFJ1biBpdC4KLQkqIGdhcy9tcmkvY29uc3RhbnRzLnM6IFRlc3QgaW1tZWRpYXRlIGNvbnN0YW50cy4KLQkqIGdhcy9tcmkvY29uc3RhbnRzLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi0JKiBnYXMvbTY4ay9saW5rLnM6IEFkZCBub3AgdG8gcGFkIHRvIGVpZ2h0IGJ5dGUgYm91bmRhcnkuCi0JKiBnYXMvbTY4ay9saW5rLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi1TdW4gTm92IDEyIDIxOjI4OjExIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvYnJsZW5idWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KLQotU3VuIE5vdiAgNSAxMjo0OToyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2JlcS5zOiBEZWNsYXJlIHRleHRfbGFiZWwgZ2xvYmFsLgotCSogZ2FzL21pcHMvamFsLnM6IExpa2V3aXNlLgotCi1GcmkgTm92ICAzIDEyOjM1OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvbGluay5zOiBVc2UgIiYiIGluc3RlYWQgb2YgIiMiIGZvciBpbW1lZGlhdGUgdmFsdWVzLgotCi0JKiBnYXMvbTY4ay9mbW92ZW1sLnMsIGdhcy9tNjhrL2Ztb3ZlbWwuZDogTmV3IHRlc3QuCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gaXQuCi0KLVRodSBOb3YgIDIgMjM6MTE6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9saW5rLnMsIGdhcy9tNjhrL2xpbmsuZDogTmV3IHRlc3QuCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gaXQuCi0KLVR1ZSBPY3QgMjQgMTA6NTc6MjAgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IFRlc3QgbGNpIGFuZCBzeW5jZG1hIGluc3RydWN0aW9ucy4KLQkqIGdhcy9ocHBhL2Jhc2ljL3N5c3RlbS5zOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLUZyaSBPY3QgIDYgMTc6MTM6MzUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL29wZXJhbmRzLmQ6IERvbid0IHJlcXVpcmUgYSBmaXhlZCBudW1iZXIgb2YgbGVhZGluZwotCXplcm9zIGluIGFueSBudW1iZXIuCi0KLQkqIGdhcy9tNjhrL29wZXJhbmRzLnMsIGdhcy9tNjhrL2JpdGZpZWxkLnM6IFVzZSAiJiIgaW5zdGVhZCBvZiAiIyIKLQlmb3IgaW1tZWRpYXRlIHZhbHVlcy4KLQotRnJpIE9jdCAgNiAxMDo1NDoxMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL2FybS5leHA6IFJlbmFtZWQgZnJvbSBnYXMuZXhwLgotCSogZ2FzL2FybS9sZS1mcGNvbnN0LltzZF06IE5ldyB0ZXN0Y2FzZS4KLQotRnJpIFNlcCAyOSAxNToxMjoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvbXJpLmV4cDogT25seSBydW4gdGVzdHMgZm9yIG02OGsgdGFyZ2V0LgotCi1Nb24gU2VwIDI1IDEyOjMxOjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9tcmkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIGFybSotKi0qIGZvciBjb25zdGFudHMKLQl0ZXN0LgotCi1UaHUgU2VwIDIxIDAxOjI2OjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvc2gvZnAucyAoZm1hYyk6IFVwZGF0ZSBmb3IgbmV3IGFzc2VtYmx5IHN5bnRheC4KLQotTW9uIFNlcCAxOCAxNDowNDozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGdhc19ydW4pOiBDYWxsIHBydW5lX3N5c3RlbV9jcnVkLgotCShydW5fZHVtcF90ZXN0LCBvYmpkdW1wKTogTGlrZXdpc2UuCi0KLVRodSBTZXAgMTQgMTM6MTA6MTAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3t3cmRyLltkc10scmRwci5bZHNdfTogTmV3IHRlc3RzLgotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogUnVuIHRoZW0uCi0KLVdlZCBTZXAgMTMgMTY6MzU6NTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBSZW1vdmU7IHRoZSB0ZXN0c3VpdGUgaXMgbm93IHJ1bgotCWRpcmVjdGx5IGZyb20gdGhlIGdhcyBNYWtlZmlsZS4KLQotTW9uIFNlcCAxMSAxMTo0NDoyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvZW1wdHkuczogTmV3IGZpbGUuCi0JKiBnYXMvbXJpL21yaS5leHA6IFRlc3QgYXNzZW1ibGluZyBlbXB0eS5zLgotCSogZ2FzL21yaS9jb21tZW50LnM6IEFkZCBhIGNvdXBsZSBtb3JlIGNvbW1lbnQgdmFyaWFudHMuCi0KLQkqIGdhcy9tcmkvbXJpLmV4cDogQWRkIHhmYWlsIGZvciB0aGUgZXhwciB0ZXN0IGZvciBhbGwgaHBwYQotCXRhcmdldHMuCi0KLVdlZCBTZXAgIDYgMjE6Mzk6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL2NvbW1lbnQucywgZ2FzL21yaS9jb21tZW50LmQ6IE5ldyB0ZXN0LgotCSogZ2FzL21yaS9tcmkuZXhwOiBSdW4gaXQuCi0JKiBnYXMvbXJpL2V4cHIuczogUmVtb3ZlIHdoaXRlc3BhY2UgaW4gb3BlcmFuZCBmaWVsZC4KLQkqIGdhcy9tcmkvZm9yLnM6IEFkZCBjb21tZW50cyBmb3IgZnVydGhlciB0ZXN0aW5nLgotCSogZ2FzL21hY3Jvcy90ZXN0Mi5zOiBQdXQgaW4gYW4gdXBwZXIgY2FzZSBFTFNFIHRvIHRlc3QgY2FzZQotCWluc2Vuc2l0aXZpdHkuCi0KLVdlZCBBdWcgMzAgMTY6MTI6MDMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3twcmVmZXRjaC5bZHNdLHN5bnRoNjQuW2RzXX06IE5ldyB0ZXN0cy4KLQotVHVlIEF1ZyAyOSAxODo1OTozMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBOZXcgZmlsZS4KLQkqIGdhcy9zcGFyYy97YXNpLltkc10sbWVtYmFyLltkc119OiBOZXcgdGVzdHMuCi0KLU1vbiBBdWcgMjEgMTQ6Mzk6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWFjcm9zLyo6IE5ldyB0ZXN0cyBmb3IgbWFjcm9zLgotCi0JKiBnYXMvbXJpL2NvbW1vbi5zOiBVc2UgZGF0YSwgbm90IC5kYXRhLgotCi0JKiBnYXNwL3BsMy5vdXQ6IFVwZGF0ZSBmb3IgY2hhbmdlcyBpbiBjb21tZW50ZWQgc291cmNlIG91dHB1dCB3aGVuCi0JTE9DQUwgaXMgdXNlZC4KLQotU2F0IEF1ZyAxOSAxNzozNjoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AvZ2FzcC5leHAgKGdhc3BfdGVzdCk6IENhbGwgcHJ1bmVfc3lzdGVtX2NydWQgb24gdGhlIG91dHB1dAotCW9mIGRpZmYuCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBEZWZpbmUgcHJ1bmVfc3lzdGVtX2NydWQgaWYgaXQgaXMgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCi1GcmkgQXVnIDE4IDExOjA5OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzcC9tcmkvKi5vdXQ6IFVzZSA7LCBub3QgISwgZm9yIHRoZSBjb21tZW50IGNoYXJhY3Rlci4KLQotV2VkIEF1ZyAxNiAxMjoyNDoxMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvbXJpLmV4cDogQ2hhbmdlIGhwcGEqLSotKiBleHBlY3RlZCBmYWlsdXJlcyB0byBvbmx5Ci0JZXhwZWN0IGZhaWx1cmUgZm9yIHRhcmdldHMgd2hpY2ggdXNlIFNPTS4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IElmIHRoZSBwcm9ncmFtIHRvIHJ1biBkb2VzIG5vdAotICAgICAgICBleGlzdCwgbWFyayB0aGUgdGVzdCBhcyB1bnRlc3RlZC4KLQotCSogZ2FzL21yaS9tcmkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIGk5NjAgYi5vdXQgdGFyZ2V0cyBmb3IKLQljb21tb24gdGVzdC4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IE5hbWUgdGhlIG91dHB1dCBmaWxlIGR1bXAubywKLQlyYXRoZXIgdGhhbiB1c2luZyBhbiBpbXBsaWNpdCBhLm91dC4KLQotCSogZ2FzL21yaS9mb3IuczogQWRkIG5vcCB0byByb3VuZCBvdXQgdG8gZm91ciBieXRlIGJvdW5kYXJ5LgotCSogZ2FzL21yaS9yZXBlYXQuczogTGlrZXdpc2UuCi0JKiBnYXMvbXJpL3doaWxlLnM6IExpa2V3aXNlLgotCSogZ2FzL21yaS9mb3IuZDogRXhwZWN0ZWQgYWRkZWQgbm9wLgotCSogZ2FzL21yaS9yZXBlYXQuZDogTGlrZXdpc2UuCi0JKiBnYXMvbXJpL3doaWxlLmQ6IExpa2V3aXNlLgotCi0JKiBnYXMvbWlwcy8qLmQ6IENoYW5nZSBhbGwgdGVzdCBuYW1lcyB0byBzYXkgTUlQUy4KLQotVHVlIEF1ZyAxNSAxNTo0MjozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvZm9yLmQsIGdhcy9tcmkvZm9yLnM6IE5ldyB0ZXN0LgotCSogZ2FzL21yaS9pZi5kLCBnYXMvbXJpL2lmLnM6IE5ldyB0ZXN0LgotCSogZ2FzL21yaS9yZXBlYXQuZCwgZ2FzL21yaS9yZXBlYXQuczogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL3doaWxlLmQsIGdhcy9tcmkvd2hpbGUuczogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL21yaS5leHA6IFJ1biB0aGUgbmV3IHRlc3RzLgotCi1Nb24gQXVnIDE0IDE2OjAzOjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9leHByLmQ6IFBlcm1pdCBsZWFkaW5nIHplcm9lcywgaW4gY2FzZSB3ZSdyZSB1c2luZyBhCi0gICAgICAgIDY0LWJpdCBCRkQuCi0KLQkqIGdhc3AvbXJpLyo6IE5ldyB0ZXN0cy4KLQkqIGdhc3AvZ2FzcC5leHA6IFJ1biB0aGVtLiAgQWxzbywgY2xlYW4gdXAgdGhlIHRlc3QgbmFtZXMgdXNlZCBpbgotCXBhc3MgYW5kIGZhaWwuCi0KLVN1biBBdWcgMTMgMDA6Mzk6MjQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9zaC9iYXNpYy5leHA6IFVwZGF0ZSBub3cgdGhhdCB3ZSBrbm93IHRoZSByaWdodAotCWJpdCBwYXR0ZXJzIGZvciB0aGUgbmV3IHN0cyBpbnN0cnVjdGlvbnMuCi0KLVRodSBBdWcgMTAgMDA6NDY6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL2NoYXIuZDogRml4IGZvciBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzLgotCSogZ2FzL21yaS9mbG9hdC5kOiBMaWtld2lzZS4KLQotV2VkIEF1ZyAgOSAxNTozNDozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvc3RydWN0LnMsIGdhcy9hbGwvc3RydWN0LmQ6IE5ldyB0ZXN0LgotCSogZ2FzL2FsbC9nYXMuZXhwOiBSdW4gaXQuCi0KLVR1ZSBBdWcgIDggMTc6MTE6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL2NvbW1vbi5zLCBnYXMvbXJpL2NvbW1vbi5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tcmkvbXJpLmV4cDogUnVuIGl0LgotCi1Nb24gQXVnICA3IDIyOjM5OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9tcmkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIGEyOWsqLSotKiBmb3IgY29uc3RhbnRzCi0JdGVzdC4KLQotCSogZ2FzcC9jcmFzaDEub3V0LCBnYXNwL21hY3JvLm91dCwgZ2FzcC9zZnVuYy5vdXQ6IENvbXBsZXRlCi0JdHJ1bmNhdGVkIGZpbGVzLCBzbyB0aGF0IHRoZSB0ZXN0cyBwYXNzLgotCi0JKiBnYXMvbXJpL21yaS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgaHBwYSotKi0qIGZvciBlcXUsCi0JY29uc3RhbnRzLCBhbmQgZXhwci4KLQotCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIHNjaHdhYiB0ZXN0IG9uIGhwdXgqLCBub3QganVzdCBocHV4LiAgUnVuCi0Jb24gdnh3b3JrcyosIG5vdCBqdXN0IHZ4d29ya3M1LjEuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGZhaWxfcGhhc2UsIHBhc3NfcGhhc2UpOiBSZW1vdmUuCi0JKHJ1bl9kdW1wX3Rlc3QpOiBKdXN0IGNhbGwgcGFzcyBvciBmYWlsLgotCi0JKiBnYXMvbTY4ay9vcGVyYW5kcy5zLCBnYXMvbTY4ay9vcGVyYW5kcy5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tNjhrL29wNjgwMDAuZDogTmV3IHRlc3QuCi0JKiBnYXMvbTY4ay9jYXMucywgZ2FzL202OGsvY2FzLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL202OGsvYml0ZmllbGQucywgZ2FzL202OGsvYml0ZmllbGQuZDogTmV3IHRlc3QuCi0JKiBnYXMvbTY4ay9zY2h3YWIuZDogUnVuIG9iamR1bXAgd2l0aCAtaiAudGV4dC4gIEFkanVzdCBmb3IKLQljaGFuZ2VzIHRvIGRpc2Fzc2VtYmxlci4KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBuZXcgdGVzdHMuICBSdW4gc2Nod2FiIHRlc3QgZm9yCi0JbTY4ay0qLWNvZmYqLgotCi1Nb24gQXVnICA3IDAzOjAxOjMyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvc2gvKjogTmV3IHRlc3RzIGZvciB0aGUgaGl0YWNoaS1zaC4KLQotVHVlIEF1ZyAgMSAxODowMjo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvKjogTmV3IHRlc3RzIGZvciBNUkkgbW9kZS4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IFN1cHBvcnQgdXNpbmcgb2JqY29weS4gIER1bXAKLQlwcm9ncmFtIGV4ZWN1dGlvbnMgdG8gdGhlIGxvZyBmaWxlIGJlZm9yZSBydW5uaW5nIHRoZW0uICBVc2UgdGhlCi0Jc2ltcGxlIHByb2dyYW0gbmFtZSwgcmF0aGVyIHRoYW4gdGhlIHBhdGggdG8gdGhlIGJpbmFyeSBiZWluZyBydW4sCi0JaW4gcGFzcy9mYWlsIG1lc3NhZ2VzLgotCShyZWdleHBfZGlmZik6IElmIHRoZSByZWdleHAgZmlsZSBoYXMgdGhlIHNwZWNpYWwgY29tbWVudCAjcGFzcywKLQlzdG9wIGNoZWNraW5nIGF0IHRoYXQgcG9pbnQuCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFNldCBOTSwgTk1GTEFHUywgT0JKQ09QWSwgYW5kIE9CSkNPUFlGTEFHUywKLQlpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBzZXQuCi0KLVR1ZSBBdWcgIDEgMTE6NDE6MzAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBzdXBlcmZsdW91cyBydW50ZXN0IGdhc3AuCi0KLU1vbiBKdWwgMzEgMTg6MTk6MjYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotIAkqIGdhc3AvKjogTmV3LgotCSogTWFrZWZpbGUuaW46IFVzZSBnYXNwIHRlc3RzLgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBBZGQgZ2FzcCBzdHVmZi4KLQotVGh1IEp1bCAyMCAxODo1Njo0OCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBEaXNhYmxlIHRlc3RzIHRoYXQgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IKLQl0aGUgUEEuCi0KLVRodSBKdWwgMTMgMTg6MjI6NDkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBzY2h3YWIgdGVzdCBmb3IgbTY4ayB2eHdvcmtzNS4xLgotCi1XZWQgSnVuIDIxIDIxOjI4OjU3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL3NjaHdhYi4qOiBOZXcgdGVzdCBiYXNlZCBvbiBhIHRlc3QgY2FzZSBmcm9tIEFuZHJlYXMKLQlTY2h3YWIuCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gaXQgZm9yIHNvbWUgYW91dCBjb25maWd1cmF0aW9ucy4KLQotTW9uIEp1biAxMiAyMjoyNzoxOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcGFyc2UvYmFkZm1weWFkZC5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3BhcnNlL3BhcnNlLmV4cDogUnVuIGl0LgotCi1TdW4gTWF5IDIxIDIwOjI2OjE4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IERpc2FibGUgYWxpZ240IHRlc3RzIGZvcgotCUVMRiB0YXJnZXRzLgotCi1XZWQgTWF5IDEwIDE0OjI4OjE2IDE5OTUgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQkKLQotCSogYXJtL2FybTdkbS5zOiBOZXcgZmlsZSAtLSB0ZXN0cyBmb3IgQVJNN0RNIGluc3RydWN0aW9ucy4KLQkqIGFybS9hcm02LnM6IENvcnJlY3QgYm9ndXMgdGVzdHMuCi0JKiBhcm0vZ2FzLmV4cCAoYXJtNi5zKTogSXMgbm93IGEgdmFsaWQgdGVzdC4KLQkoYXJtN2RtLnMpOiBOZXcgdGVzdC4KLQkqIGFybS9mbG9hdC5zOiBBZGQgbG9hZC9zdG9yZSBtdWx0aXBsZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbiAKLQl0ZXN0cy4KLQotV2VkIE1heSAgMyAxMzoxNDo0NCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvbG9uZ2NhbGwuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotVHVlIE1heSAgMiAxNjozNzo0OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9sZC5kOiBNb2RpZmllZCBmb3IgZ2FzIGRlbGF5LXNsb3QgZml4ZXMuCi0KLVNhdCBBcHIgMjkgMjM6MzU6MTggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRnLmV4cDogTmV3IGZpbGUuCi0KLVR1ZSBBcHIgMTEgMTM6NTc6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczQuZDogQWxsb3cgbW9yZSB0aGFuIGV4YWN0bHkgOCB6ZXJvcyBpbiBiYzEqCi0JdGFyZ2V0cy4KLQotTW9uIEFwciAxMCAxNTozNjozOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChwYXNzX3BoYXNlKTogTmV3IHByb2MuCi0JKHJ1bl9kdW1wX3Rlc3QpOiBOb3RlIHBhc3Npbmcgb3IgZmFpbGluZyBvZiBlYWNoIHBoYXNlIG9mIHRoaXMKLQl0ZXN0LCBpbnN0ZWFkIG9mIGZhaWx1cmUgb2YgcGhhc2VzIG9yIHBhc3Npbmcgb2YgY29tcGxldGUgdGVzdC4KLQlFbnN1cmUgdGVzdCBmaWxlIG5hbWUgaXMgaW4gcmVwb3J0ZWQgbWVzc2FnZS4KLQotU2F0IEFwciAgOCAxMjo0NjozMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBIYW5kbGUgYXJndW1lbnRzIHdpdGggcGF0aHMuCi0JQWx3YXlzIHJlc29sdmUgdGVzdGNhc2Ugc3RhdHVzIGJlZm9yZSByZXR1cm5pbmcuCi0JSWYgYHNsdXJwX29wdGlvbnMnIGZhaWxzLCByZXR1cm4gYW5kIGRvbid0IGRvIHRlc3QuCi0JKHNsdXJwX29wdGlvbnMpOiBGaXggImNhbid0IG9wZW4iIGVycm9yIG1lc3NhZ2UuCi0JUmV0dXJuIC0xIHRvIGluZGljYXRlIGVycm9yLgotCi1Nb24gTWFyIDIwIDIyOjQ1OjMwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9jb21tb24uczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KLQotRnJpIE1hciAxMCAxOTowNzowOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvaDgzMDAvZmZ4eDEuczogQWRkIC53b3JkIDAgYXQgdGhlIGVuZCB0byBlbGltaW5hdGUKLQl1bmNlcnRhaW50eSBhcyB0byB3aGV0aGVyIHRoZXJlIHNob3VsZCBiZSB0cmFpbGluZyBieXRlcyBpbiB0aGUKLQlvdXRwdXQgZmlsZS4KLQkqIGdhcy9oODMwMC9mZnh4MS5kOiBBZGp1c3QgcmVsb2MgdmFsdWVzIHRvIHBlcm1pdCBhbiBhZGRlbmQgdmFsdWUKLQlvZiAweDAwMDAwMDAwZmZmZmZmZmYgb24gNjQtYml0IGhvc3RzLiAgKEknbSBub3Qgc3VyZSBpZiB0aGlzIGlzCi0JY29ycmVjdC4pICBFbmQgd2l0aCAiLi4uIiB0byBtYXRjaCB0cmFpbGluZyB6ZXJvIGJ5dGVzLgotCi1XZWQgTWFyICA4IDE1OjUwOjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczQuZCwgZ2FzL21pcHMvbWlwczQuczogTmV3IGZpbGVzLgotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biBuZXcgdGVzdC4KLQotVGh1IEZlYiAyMyAxNzo1ODo1MCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnM6IEFkZCBpbmRleGluZyB2YXJpYW50cy4KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cDogVGVzdCB0aGVtLgotCi1XZWQgRmViIDE1IDE1OjQzOjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvdWxkLmQ6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvdWxkLnM6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvdXNkLmQ6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvdXNkLnM6IE5ldyBmaWxlLgotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biBuZXcgdGVzdHMuCi0KLVRodSBGZWIgIDkgMTA6NTc6MzkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL2FwcGx5YnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChkb19hcHBseWJ1Z190ZXN0KTogUnVuIGl0LgotCi1UaHUgRmViICAyIDAwOjM0OjU1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0gICAgICAgICogZ2FzL2hwcGEvcmVsb2MvcGljcmVsb2MuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKGRvX3BpY19yZWxvY2F0aW9uX3Rlc3QpOiBSdW4gaXQuCi0KLUZyaSBKYW4gMjcgMTQ6MDI6MDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL2g4MzAwL2ZmeHgxLmQsIGdhcy9oODMwMC9mZnh4MS5zLCBnYXMvaDgzMDAvY21wc2kyLnMsCi0JZ2FzL2g4MzAwL2g4MzAwLmV4cDogTmV3IHRlc3RzLgotCi1Nb24gSmFuIDIzIDIxOjQ0OjI2IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgKGRvX3N5c3RlbSk6IFVwZGF0ZS4KLQotV2VkIEphbiAxMSAxNzoyMDoyNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogRG9uJ3QgcnVuIHRoZSBtZW1vcnktYWNjZXNzIHRlc3RzIGlmIHRoZQotCWZvcm1hdCBpcyBhLm91dCwgYmVjYXVzZSB0aGUgZ2VuZXJhdGVkIGNvZGUgaXMgZGlmZmVyZW50IGZyb20gd2hhdAotCWlzIHVzZWQgd2l0aCBvdGhlciBmb3JtYXRzLgotCi1UdWUgSmFuIDEwIDExOjQyOjEzIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAgKGFsaWduNC5zKTogRml4IGdsaXRjaCBpbgotCXJlZ2V4cCB0byBhdm9pZCBsb3Npbmcgd2l0aG91dCBhIGNvbnRyb2xsaW5nIHR0eS4KLQotRnJpIERlYyAzMCAxODowODoyMCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvaTM4Ni9wdXNody5sOiBGaXhlZCB3aGl0ZXNwYWNlIHRvIG1hdGNoIGN1cnJlbnQgbGlzdGluZwotCXN0eWxlLgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IE1hcmsgdGVzdCBwMTQ4MC5zIGV4cGVjdGVkIHRvIHBhc3MsIGV2ZW4gd2l0aAotCWxpc3RpbmdzIGVuYWJsZWQuCi0KLVRodSBEZWMgMTUgMTg6MTQ6MjcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFTX0ZPUl9UQVJHRVQsIE9CSkRVTVBfRk9SX1RBUkdFVCk6IERvbid0IHNldC4KLQkodW5pbnN0YWxsKTogRG9uJ3Qgc2V0IE9CSkRVTVAgYW5kIE9CSkRVTVBGTEFHUyBpbiBzaXRlLmV4cC4KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogRGVmYXVsdCBPQkpEVU1QIGFuZCBPQkpEVU1QRkxBR1MuICBVc2UKLQlmaW5kZmlsZSBhbmQgdHJhbnNmb3JtIHByb2NlZHVyZXMgdG8gZGV0ZXJtaW5lIG9iamR1bXAgcHJvZ3JhbQotCW5hbWUuCi0KLQkqIGdhcy9taXBzL2Ficy5zLCBnYXMvbWlwcy9kaXYuczogRm9yY2Ugc29tZSBwYWRkaW5nIGF0IHRoZSBlbmQsCi0JaW4gY2FzZSB0aGUgZm9ybWF0IGRvZXNuJ3QgYXV0b21hdGljYWxseSByZXF1aXJlIGl0LgotCSogZ2FzL21pcHMvYmVxLmQsIGdhcy9taXBzL2phbC5kOiBIYW5kbGUgTUlQU19KTVAgYXMgYW4gYWx0ZXJuYXRlCi0JbmFtZSBmb3IgdGhlIHJlbG9jIHR5cGUuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGZpbGVfY29udGVudHMsIHZlcmJvc2VfZXZhbCk6IE5ldyBwcm9jcy4KLQkocnVuX2R1bXBfdGVzdCk6IElmIHZlcmJvc2l0eSBsZXZlbCBpcyBvdmVyIDMsIHByaW50IG91dCBkdW1wCi0JY29tbWFuZCBhbmQgaXRzIG91dHB1dC4KLQotVHVlIERlYyAxMyAxODoyMTowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2phbC1zdnI0cGljLmQ6IEZpeCAwLXN0cmluZ3MgdG8gd29yayB3aXRoIDY0LWJpdCBob3N0ZWQKLQlkaXNhc3NlbWJseS4KLQotRnJpIERlYyAgOSAxOTo1NDowNCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2dhcy5leHAgKGNvbW1lbnQucyB0ZXN0KTogTWFrZSB0aGUgIlxyIiBvcHRpb25hbCwgc2luY2UKLQlpdCBkZXBlbmRzIG9uIHR0eSBtb2Rlcy4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAoZ2FzX3N0YXJ0KTogVHJ5IHVzaW5nIC1ub3R0eWNvcHkgaW5zdGVhZCBvZgotCS1ub3R0eWluaXQuCi0KLQkqIGdhcy9hcm0vZ2FzLmV4cDogVGhlIGFybTYgdGVzdCBzaG91bGQgcmVwb3J0IGVycm9ycywgZm9yIG5vdy4KLQotVGh1IERlYyAgOCAyMDoxOTowOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBVc2UgLWkgaW4gZXhwZWN0X2FmdGVyIGNvbW1hbmQuCi0KLVdlZCBEZWMgIDcgMTY6NDk6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbXVsLmQsamFsLmQ6IEZpeCAwLXN0cmluZ3MgdG8gd29yayB3aXRoIDY0LWJpdCBob3N0ZWQKLQlkaXNhc3NlbWJseS4KLQotCSogZ2FzL2llZWUtZnA6IFJlbmFtZWQgZnJvbSBpZWVlLmZwLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBNYWtlIHN1cmUgdGltZW91dCBpcyBhdCBsZWFzdCAyIG1pbnV0ZXMuCi0KLVdlZCBOb3YgMzAgMTA6NDg6MDAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3BhcnNlOiBSZW5hbWVkIGZyb20gZ2FzL2hwcGEvbW9yZS5wYXJzZS4KLQotTW9uIE5vdiAyOCAwMDo0MDoyNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHAgKG5vc3Vic3BhY2Uucyk6IE5vIGxvbmdlciBleHBlY3RlZAotCXRvIGZhaWwuICBGaXggY29tbWVudHMgZm9yIHRoZSB0ZXN0LiAgVHdlYWsgdGVzdCBuYW1lLgotCi1UdWUgTm92IDIyIDIzOjM4OjIwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IE1pbm9yIHR3ZWFrcyB0byBtYXRjaCBjdXJyZW50IFBBIEVMRgotCW91dHB1dC4gCi0KLUZyaSBOb3YgMTggMTc6NTY6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9sZC5kOiBBZGp1c3QgdG8gd29yayBmb3IgYm90aCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4KLQljb2RlLgotCSogZ2FzL21pcHMvbGQucywgZ2FzL21pcHMvbGlmLWVtcGljLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvbGlmbG9hdC5kLCBnYXMvbWlwcy91bGgtZW1waWMuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy91bGguZCwgZ2FzL21pcHMvdWx3LmQsIGdhcy9taXBzL3VzaC5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL3Vzdy5kOiBMaWtld2lzZS4KLQotVHVlIE5vdiAxNSAxMTowOTo1NyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ240LnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBSdW4gaXQuCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cCAoaW1wb3J0YnVnKTogVHdlYWsgdG8gbWF0Y2gKLQljdXJyZW50IGV4cGVjdGVkIFBBIEVMRiBvdXRwdXQuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKGRvX3Jfbm9fcmVsb2MpOiBMaWtld2lzZS4KLQkoZG9fcGxhYmVsX3JlbG9jYXRpb25fdGVzdCk6IExpa2V3aXNlLgotCi1UaHUgTm92ICAzIDE4OjE0OjA5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvcDE0ODAuczogVXNlIGxhcmdlciBjb25zdGFudCwgc28gZXhwcmVzc2lvbiBjYW4gaGF2ZSBhCi0JcG9zaXRpdmUgdmFsdWUuCi0JKiBnYXMvYWxsL2dhcy5leHA6IEV4cGVjdCBwMTQ4MC5zIHdpdGhvdXQgbGlzdGluZ3MgdG8gcGFzcy4KLQotVGh1IE5vdiAgMyAxNTo0Mzo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL3VsaC5kLCBnYXMvbWlwcy91bHcuZCwgZ2FzL21pcHMvdXNoLmQsIGdhcy9taXBzL3Vzdy5kOgotCUNvcnJlY3QgdGVzdCBjYXNlcy4KLQotVGh1IE9jdCAyMCAwMDo1NToxMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgotCi1Nb24gT2N0IDE3IDAyOjMzOjUzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWR1Y2UzLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCi0KLVN1biBPY3QgMTYgMjI6MjU6NTYgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCAocl9ub19yZWxvYyk6IFR3ZWFrIG91dHB1dCB0byBtYXRjaAotCWN1cnJlbnQgcmVhbGl0eS4KLQotV2VkIFNlcCAyOCAyMToyMTozNCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnM6IFJlbmFtZWQgZnJvbSByZWxvY3JlZHVjZS5zCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWR1Y2UyLnM6IFJlbmFtZWQgZnJvbSByZWxvY3JlZHVjZTIucwotCSogZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvYy5zOiBSZW5hbWVkIGZyb20gcl9ub19yZWxvY2J1Zy5zCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0KLVdlZCBTZXAgMjggMTM6MjU6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBnYXMvbWlwcy9iZXEuZCwgZ2FzL21pcHMvYmVxLnM6IFRlc3QgdGhhdCB1bmNvbmRpdGlvbmFsIGJyYW5jaAotCW92ZXJmbG93cyBhcmUgY29ycmVjdGx5IGNvbnZlcnRlZCB0byBqdW1wcy4KLQotTW9uIFNlcCAyNiAxNzo0MTo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzOiBBZGQgdGVzdCBjYXNlcyBmb3IgUElDIGNvZGUsIGJvdGggU1ZSNCBzdHlsZSBhbmQKLQktbWVtYmVkZGVkLXBpYyBzdHlsZS4KLQotRnJpIFNlcCAyMyAxNDo0NTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzOiBOZXcgZGlyZWN0b3J5IHdpdGggTUlQUyBzcGVjaWZpYyB0ZXN0IGNhc2VzLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogUGVybWl0IHRoZSAuZCBmaWxlIHRvIHNwZWNpZnkKLQl0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdG8gYXNzZW1ibGUuCi0JKHJlZ2V4cF9kaWZmKTogUHV0IHRoZSByZWFzb24gZm9yIGZhaWx1cmUgaW4gdGhlIGxvZyBmaWxlLgotCi1XZWQgU2VwIDIxIDEzOjQ0OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGliL2dhcy1kZWZzLmV4cDogRG9uJ3QgdHJ5IHRvIHVzZSBzaGVsbCByZWRpcmVjdGlvbiwgc2luY2UgVENMCi0JZG9lc24ndCBzdXBwb3J0IGl0LiAgUmVkaXJlY3Qgc3Rkb3V0IHVzaW5nID4gaW5zdGVhZCBvZiAxPiwgYW5kCi0JZG9uJ3QgYm90aGVyIHRvIHJlZGlyZWN0IHN0ZGVyciBzaW5jZSBUQ0wgcmVkaXJlY3RzIGl0IGFueWhvdy4KLQkocnVuX2R1bXBfdGVzdCk6IFBhc3MgYXBwcm9wcmlhdGUgYXJndW1lbnRzIHRvIHByb2dyYW0sIGRlZmF1bHRpbmcKLQl0byAtci4KLQotU2F0IFNlcCAxNyAwMTowNDo1NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnYXMvdmF4OiBOZXcgZGlyZWN0b3J5LgotCSogZ2FzL3ZheC97cXVhZC5zLHF1YWQuZXhwfTogTmV3IHRlc3QsIGZvciBpbW1lZGlhdGUgcXVhZHdvcmQKLQl2YWx1ZXMuCi0KLU1vbiBTZXAgMTIgMjI6MTk6MTEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3Jfbm9fcmVsb2NidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChkb19mdW5jdGlvbl9yZWxvY19idWcpOiBVcGRhdGUKLQlleHBlY3RlZCBvdXRwdXQuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogZ2FzL2FybS8qOiBOZXcgc3VidHJlZS4gIEFkZCBBUk0gdGVzdHMuCi0KLU1vbiBBdWcgIDggMTI6MTM6MzEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogQWNjZXB0IGFueSBjaGFyYWN0ZXIKLQliZXR3ZWVuIGZvbydzIHR5cGUgYW5kIGZvbyBpdHNlbGYuCi0KLUZyaSBKdWwgMTUgMTk6MDk6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IE5ldyByb3V0aW5lIGZvciBydW5uaW5nIHRoZQotCWFzc2VtYmxlciwgcnVubmluZyBvYmpkdW1wIG9yIG5tIChub3QgZnVsbHkgc3VwcG9ydGVkKSBvbiB0aGUKLQlyZXN1bHRpbmcgb2JqZWN0IGZpbGUsIGFuZCBjb21wYXJpbmcgdGhlIHJlc3VsdHMgYWdhaW5zdCBhIGZpbGUgb2YKLQlyZWd1bGFyIGV4cHJlc3Npb25zIGluIHRoZSB0ZXN0IHN1aXRlLCBhbGwgaW4gb25lIGNvbW1hbmQuCi0JT3B0aW9ucyBmb3IgdGhlIGFzc2VtYmxlciBhbmQgb2JqZHVtcCBhcmUgcmVhZCBmcm9tIGNvbW1lbnRzIGF0Ci0JdGhlIHN0YXJ0IG9mIHRoZSAuZCBmaWxlLgotCShmYWlsX3BoYXNlLCBzbHVycF9vcHRpb25zKTogTmV3IGF1eGlsaWFyeSByb3V0aW5lcy4KLQkocmVnZXhwX2RpZmYpOiBBbHdheXMgcmV0dXJuIGEgdmFsdWUuICBGaXggYnVncyBpbiBhY3R1YWxseSBkb2luZwotCXRoZSByZWdleHAgdGVzdC4KLQotCSogZ2FzL3N1bjQvYWRkZW5kLmV4cDogVXNlIHJ1bl9kdW1wX3Rlc3QuCi0JKiBnYXMvc3VuNC9hZGRlbmQuZDogRml4IHJlZ3VsYXIgZXhwcmVzc2lvbnMgc28gdGhhdCB0aGV5IHdvcmsuCi0KLVRodSBKdWwgIDcgMTE6NTU6MzMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jcmVkdWNlMi5zOiBNb3JlIHJlbG9jYXRpb24gcmVkdWN0aW9uIHRlc3RzLgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gdGhlbS4KLQotVGh1IEp1biAzMCAxODo0OToyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IExvb2sgZm9yICJhcy5uZXciIGluICIkYmFzZV9kaXIvLi4iLCB3aGVyZQotCWl0IGdvdCBjb21waWxlZCwgbm90IGluICIkYmFzZV9kaXIiLgotCSogY29uZmlnL3Vua25vd24uZXhwOiBEZWxldGVkLgotCi1TdW4gSnVuIDI2IDEzOjIzOjU0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvbGliL2dhcy1kZWZzLmV4cCAoZ2FzX2ZpbmlzaCk6IENhbGwgImNsb3NlIiBhbmQgIndhaXQiCi0JYmVmb3JlIGV4aXRpbmcuICBFbmNsb3NlIGJvdGggY2FsbHMgaW5zaWRlIGEgImNhdGNoIi4KLQkob2JqZHVtcF9maW5pc2gpOiBMaWtld2lzZS4KLQotRnJpIEp1biAxMCAxMDoyMzozNSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChyb3VuZG1vZGUgdGVzdCk6IFR3ZWFrIGV4cGVjdGVkIG91dHB1dAotCWZvciBTT00gdG8gbWF0Y2ggY3VycmVudCB0ZXN0Y2FzZS4KLQotVGh1IEp1biAgMiAxOTo0Njo1OCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnYXMvaTM4Ni97cHVzaHcucyxwdXNody5sfTogTmV3IHRlc3QuCi0JKiBnYXMvaTM4Ni9hbGwuZXhwOiBSdW4gaXQuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgc2l0ZSBjb25maWcgZmlsZXMgYW5kIGdhcy5zdW0uCi0KLUZyaSBNYXkgMjcgMTI6MjQ6MTggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2FzL202OGsvZGlzcGVyci5zOiBVc2UgJSBmb3IgcmVnaXN0ZXJzLgotCi0JKiBnYXMvbTY4ay1jb2ZmL2dhcy5leHA6IEV4cGVjdCBmYWlsdXJlIGZvciBwMjM4OWEucy4KLQotVHVlIE1heSAxNyAxNDo1MzowOCAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxpYi9nYXMtZGVmcy5leHA6IFJlcGxhY2UgZXJyb3IgcHJvYyBjYWxscyB3aXRoIHBlcnJvciBjYWxscy4KLQotTW9uIE1heSAxNiAxMzoxOToxNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBUd2VhayBleHBlY3RlZCBvdXRwdXQgdG8gbWF0Y2ggbmV3Ci0JRUxGIGNvZGUuCi0JKiBnYXMvaHBwYS9yZWxvYy9yb3VuZG1vZGUuczogQXZvaWQgIlMiIGFuZCAiRCIgbW9kZXMsIEVMRiBkb2VzCi0Jbm90IHN1cHBvcnQgdGhlbS4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogVHdlYWsgZXhwZWN0ZWQgb3V0cHV0IHRvIG1hdGNoCi0JbmV3IEVMRiBjb2RlLgotCi1UaHUgTWF5ICA1IDE3OjI3OjU0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogUmVuYW1lZCBmcm9tIHVuaXgtZ2FzLmV4cC4KLQotTW9uIEFwciAxMSAxMDozMTowMCAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IFNldCBUQ0xfTElCUkFSWSBmb3IgcnVudGVzdC4KLQotTW9uIEFwciAxMSAwNzo1NDoxMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9jYWxsaW5mb2J1Zy5zOiBBZGQgbWlzc2luZyBuYW1lIGZvcgotCXByb2NlZHVyZS4KLQotCSogZ2FzL2hwcGEvcmVsb2MvZnVuY3JlbG9jYnVnLnM6IFBsYWNlIHRoZSB0cmFtcG9saW5lIGluIHRoZQotCSREQVRBJCByYXRoZXIgdGhhbiAkTElUJCBzdWJzcGFjZS4KLQotU3VuIE1hciAyNyAxNDowNTozMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvZnVuY3JlbG9jYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCi0KLVRodSBNYXIgMTcgMTM6Mzg6MDQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2ltcG9ydGJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgotCi1XZWQgTWFyIDE2IDExOjU3OjA3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3JlZ3BvcGJ1Zy5zOiBBZGQgdHJpdmlhbCAuZXF1IHRlc3QuCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2dsb2JhbGJ1Zy5zOiBOZXcgdGVzdCAoZXhwZWN0ZWQgdG8gZmFpbCkuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9jYWxsaW5mb2J1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL29tcmUucGFyc2UvcGFyc2UuZXhwOiBSdW4gaXQuCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcmVncG9wYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IFJ1biBpdC4KLQotTW9uIEZlYiAyOCAxNDoxMDowNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChvYmpkdW1wKTogTmV3IHByb2MuCi0JKG9iamR1bXBfc3RhcnQpOiBEZWxldGVkIHVudXNlZCBwcm9jLgotCShvYmpkdW1wX3N0YXJ0X2NvbW1vbik6IE1lcmdlZCBpbnRvIG9iamR1bXBfc3RhcnRfbm9fc3ViZGlyLgotCi0JKiBnYXMvYWxwaGEvZnAuZXhwOiBVc2Ugb2JqZHVtcCBpbnN0ZWFkIG9mCi0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIsIHNpbmNlIHRoZSBmb3JtZXIgYWN0dWFsbHkgd2FpdHMgZm9yCi0Jb2JqZHVtcCB0byBmaW5pc2guICBTcGVjaWZ5IC5yZGF0YSBzZWN0aW9uIG9ubHkuICBNYWtlIGNvbW1lbnQKLQlpbmRpY2F0ZSBBbHBoYSBhcmNoaXRlY3R1cmUgcmF0aGVyIHRoYW4gU1BBUkMuCi0JKiBnYXMvYWxwaGEvZnAuZDogT21pdCAucmVnaW5mbyBwYXR0ZXJucy4gIEp1c3QgdXNlICIuIiB0byBtYXRjaAotCWFnYWluc3QgQVNDSUkgY29kZSAweDJhICgiKiIsIHNwZWNpYWwgaW4gcmVnZXhwKS4KLQkqIGdhcy9zdW40L2FkZGVuZC5leHA6IFVzZSBvYmpkdW1wIGluc3RlYWQgb2YKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpci4KLQotVGh1IEZlYiAyNCAwNzoxMTo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotICAgICAgICAqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwIChubyBzdWJzcGFjZSB0ZXN0KTogT25seSBleHBlY3QKLQlhIGZhaWx1cmUgaWYgZ2FzIGlzIG5vdCBwcm9kdWNpbmcgYW4gRUxGIG9iamVjdC4KLQotTW9uIEZlYiAxNCAwOToyNDowMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBSdW4gaXQuCi0KLVRodSBGZWIgMTAgMDA6MzQ6MjYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2FzL2FscGhhL2ZwLio6IE5ldyBmaWxlcy4KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJlZ2V4cF9kaWZmKTogUmVwb3J0IG5vdGVkIG1pc21hdGNoIGF0Ci0JdmVyYm9zaXR5IGxldmVsIDMgb3IgYWJvdmUgb25seS4KLQotTW9uIEZlYiAgNyAxNTo1MzoxMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvKi8qLmV4cDogQ2hhbmdlIHhmYWlscyB0byBjaGVjayBmb3IgUEEgRUxGIHJhdGhlciB0aGFuCi0JUEEgT1NGMS4KLQotRnJpIEZlYiAgNCAyMzo0MjoxNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS94bXB5dWJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBSdW4gaXQuCi0KLUZyaSBGZWIgIDQgMTc6MTM6MjAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGliL2dhcy1kZWZzLmV4cCAocmVnZXhwX2RpZmYpOiBOZXcgcHJvY2VkdXJlLCB2YWd1ZWx5IGJhc2VkIG9uCi0JInNpbXBsZV9kaWZmIiBmcm9tIGxpbmtlciB0ZXN0IHN1aXRlLgotCSogZ2FzL3N1bjQvYWRkZW5kLmV4cDogVXNlIGl0LgotCSogZ2FzL3N1bjQvYWRkZW5kLmQ6IE5ldyBmaWxlLgotCi1TdW4gSmFuIDMwIDIzOjM0OjU4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogQWRqdXN0IHJlZ2V4cCBmb3IgeDkzMDUwOS5zIGZvciBjdXJyZW50IGxpc3RpbmcKLQlmb3JtYXQuCi0KLVRodSBKYW4gMjAgMTY6NDQ6NTEgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBnYXMvYWxsL2dhcy5leHAsIGxpYi9nYXMtZGVmcy5leHAsIHN1bjQvYWRkZW5kLmV4cCwKLQlzcGFyYy1zb2xhcmlzL2FkZGVuZC5leHA6IFR3ZWFrZWQgdG8gZml4IGEgZmV3IGJ1Z3MgYW5kIHRvIHJ1bgotCXdlbGwgdW5kZXIgZWl0aGVyIHZlcnNpb24gb2YgZXhwZWN0LgotCi1Nb24gSmFuIDE3IDAwOjI1OjAzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9iYXNpYy9mcF9taXNjLnM6IERlbGV0ZSBjb3ByIGluc3RydWN0aW9uLiAgSXQncyB0ZXN0ZWQKLQllbHNld2hlcmUgbm93LgotCSogZ2FzL2hwcGEvYmFzaWMve2NvcHIsIGNvcHJtZW0sIHNwb3B9LnM6IE5ldyB0ZXN0cy4KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cDogUnVuIHRoZW0uCi0KLVRodSBKYW4gMTMgMTE6NTk6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogTm8gbG9uZ2VyIGV4cGVjdCBkaWZmZXJlbmNlIG9mIGZvcndhcmQKLQlyZWZlcmVuY2VzIHRvIGZhaWwuCi0JKiBnYXMvYWxsL3g5MzA1MDkuczogRml4IHRlc3RjYXNlIHRvIG1hdGNoIGhvdyB0aGUgZXhwZWN0IGNvZGUgd2FzCi0Jd3JpdHRlbi4KLQotV2VkIEphbiAxMiAxMzo0MToxMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBGaXggdHlwbyBpbiBsYXN0IGNoYW5nZS4gIExhdGVzdCB0ZXN0Ci0JZm9yIGNyb3NzLXN1YnNwYWNlIGNhbGwgYnVncyBpcyBubyBsb25nZXIgZXhwZWN0ZWQgdG8gZmFpbC4KLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wcm9jYnVnLnM6IEFkZCB0ZXN0IGZvciBhbm90aGVyIGJ1ZyByZWxhdGluZwotCXRvIGhhdmluZyBhIGZ1bmN0aW9uJ3MgbGFiZWwgZm9sbG93IHRoZSAuUFJPQyBkaXJlY3RpdmUuCi0KLVR1ZSBKYW4gMTEgMjE6NDc6NDggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogQWRkIHRlc3QgZm9yIGNyb3NzLXN1YnNwYWNlIGNhbGwgYnVnCi0JZm91bmQgd2hpbGUgd29ya2luZyBvbiBtdWx0aXBsZSAkQ09ERSQgc3Vic3BhY2Ugc3VwcG9ydC4KLQotTW9uIEphbiAxMCAwOTo1NDoxNSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IHByb2NidWcucyBpcyBubyBsb25nZXIgZXhwZWN0ZWQKLQl0byBmYWlsLgotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wcm9jYnVnLnM6IEFkZCBtaXNzaW5nIC5wcm9jZW5kLgotCi1Nb24gSmFuICAzIDEwOjA3OjQ3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2xhYmVsYnVnLnM6IEFkZCB0ZXN0Y2FzZSBmb3IgYnVnIGluIGxhc3QKLQlhcHAuYyBjaGFuZ2UuCi0KLVdlZCBEZWMgMjkgMTE6MzI6MzkgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvbGFiZWxidWcuczogQWRkIG1vcmUgY29sb25sZXNzIGxhYmVsIHRlc3RzLgotCi1XZWQgRGVjIDE1IDA4OjI0OjMxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHNpdGUuZXhwKTogRG9uJ3Qgc2V0IEFTRkxBR1MuICBRdW90ZSB2YWx1ZSBvZgotCU9CSkRVTVBGTEFHUyBpbiBjYXNlIGl0J3MgZW1wdHkuICBVc2UgdGVtcG9yYXJ5IG5hbWVzIHVudGlsIHRoZQotCWVuZDsgbWFrZSBjcmVhdGluZyBzaXRlLmV4cCB0aGUgZmluYWwgc3RlcC4KLQkoY2hlY2spOiBQYXNzIGluIEFTRkxBR1MuCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogVXNlIGFsbF9vbmVzIHByb2MuICBDaGFuZ2UgcmVnZXhwIGZvciBtYXRjaGluZwotCUMgY29tbWVudHMgdG8gYXZvaWQgYnVncyBpbiBsYXRlc3QgZXhwZWN0IGNvZGUuCi0KLVdlZCBEZWMgIDggMTQ6MzA6MTQgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9tNjhrL2Rpc3BlcnIuczogTmV3IHRlc3QuCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gaXQuCi0KLVN1biBEZWMgIDUgMTk6MjQ6NTcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JvdW5kbW9kZS5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LiAgRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuCi0KLVdlZCBEZWMgIDEgMTA6NDQ6MTggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIHRoZSBmaXJzdCBoYWxmIG9mIGJvZ3VzIFJfRVhJVAotCXRlc3QgZm9yIEVMRi4gIAotCi1UdWUgTm92IDMwIDEzOjQzOjIxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogVGVzdCBmb3IgZXJyb3Igb24gZm9yIHN1YnNwYWNlCi0JZGlyZWN0aXZlIGlzIGFuIFhGQUlMIGZvciBTT00gYXNzbWVibGVycy4KLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSZW1vdmUgWEZBSUwgZm9yIHJlbG9jYXRpb24gb24KLQljcm9zcy1zdWJzcGFjZSBjYWxsIHRlc3QuCi0KLVN1biBOb3YgMjggMTI6MTI6NTAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvYXBwYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ24zLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBSdW4gaXQuCi0KLVNhdCBOb3YgMjcgMjI6NTA6MDEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9hbGwvcDI0MjUuczogSW5zZXJ0IGEgdGFiIGJlZm9yZSBhc3NlbWJsZXIgZGlyZWN0aXZlcyBzbwotCXRoYXQgdGhlIGRpcmVjdGl2ZXMgYXJlIG5vdCBpbnRlcnByZXRlZCBhcyBsYWJlbHMuCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL3dlaXJkLnM6IFN5bmMgd2l0aCBHREIgdmVyc2lvbi4KLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9sYWJlbGJ1Zy5zOiBOZXcgdGVzdC4KLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IFJ1biBpdC4KLQotV2VkIE5vdiAyNCAwMToyNTowMyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvZml4dXBidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotCSogZ2FzL2hwcGEvcmVsb2MvZXhpdGJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgotCi1TdW4gTm92IDIxIDIyOjExOjEwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IE1pbm9yIGZpeGVzIHNvIHRoYXQgU09NICYgRUxGIGNhbgotCXNoYXJlIHRoZSBzYW1lIHRlc3QgY29kZS4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jcmVkdWNlLnM6IExpa2V3aXNlLgotCi0JKiBnYXMvaHBwYS9iYXNpYy9mbWVtLnM6IEFkZCBxdWFkd29yZCBGUCBzdG9yZSBpbnN0cnVjdGlvbnMuCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IFRlc3QgcXVhZHdvcmQgRlAgc3RvcmUgaW5zdHJ1Y3Rpb25zLgotCi1TdW4gTm92ICA3IDAwOjMxOjQxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IE5vIGxvbmdlciBleHBlY3QgZmFpbHVyZSBmb3IKLQlmaWVsZCBzZWxlY3RvciBvbiBibGUgaW5zdHJ1Y3Rpb24gdGVzdC4KLQotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBObyBsb25nZXIgZXhwZWN0IGZhaWx1cmVzIGZvcgotCXN5c3RlbSBpbnN0cnVjdGlvbiB0ZXN0cyBub3cgdGhhdCBwcm9iZWkgaXMgZml4ZWQuCi0KLVNhdCBOb3YgIDYgMjI6NDU6MDggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3NlbGVjdG9yYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCi0KLVRodSBOb3YgIDQgMTc6MDE6MzAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2ZyYWdidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KLQotVGh1IE5vdiAwNCAwOTowOTo0OSAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBSVU5URVNURkxBR1MgdG8gUlVOVEVTVF9GTEFHUwotCi1UdWUgTm92ICAyIDIyOjEyOjMwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3tkZWZidWcucywgc3RkcmVnLnN9OiBOZXcgdGVzdHMuCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogUnVuIHRoZW0uCi0KLU1vbiBOb3YgIDEgMjM6Mzc6NTggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCAocmVsb2NfcmVkdWNlKTogQ29ycmVjdCBvZmZzZXRzIGF0Ci0Jd2hpY2ggc3BlY2lmaWMgcmVsb2NhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGJlIGZvdW5kLgotCQotU2F0IE9jdCAzMCAxNDoxMjozMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwIChzc19hbGlnbik6IFJlbW92ZSBPU0YgeGZhaWwuCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBBZGQgbmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3NzYnVnLnM6IE5ldyB0ZXN0IHRvIG1ha2Ugc3VyZSBub24tZGVmYXVsdAotCXNlY3Rpb25zIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBEaXNhYmxlIChhbmQgZmFpbCkgcDE0ODAucyBmb3IgYWxsIFBBIHRhcmdldHMuCi0KLUZyaSBPY3QgMjkgMTY6Mjk6MDYgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvY2FsbGRhdGFidWcuczogQ29sb25pemUuCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogRml4IHR5cG9zLgotCi1UaHUgT2N0IDI4IDIxOjQwOjA2IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS97YmFzaWMsIG1vcmUucGFyc2UsIHJlbG9jLCB1bnNvcnRlZH06IE5ldyBkaXJlY3Rvcmllcy4KLQkqIGdhcy9ocHBhLyovKi5leHA6IE5ldyB0ZXN0IGRyaXZlcnMuCi0JKiBnYXMvaHBwYS8qLyouczogTmV3IHRlc3QgZmlsZXMuCi0KLU1vbiBPY3QgMjUgMDk6NDA6NTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGdhcy9zdW40OiBOZXcgZGlyZWN0b3J5LgotCSogZ2FzL3N1bjQvYWRkZW5kLnMsYWRkZW5kLmV4cDogTmV3IHRlc3QgY2FzZS4KLQkqIGdhcy9zcGFyYy1zb2xhcmlzL2FkZGVuZC5zLGFkZGVuZC5leHA6IFNvbGFyaXMgdmVyc2lvbiBvZiBzYW1lCi0JdGVzdCBjYXNlLgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IENoZWNrIGAqJyBpbiBDIGNvbW1lbnRzLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChhbGxfb25lcyk6IE5ldyBwcm9jZWR1cmUsIGZvciBhIHByZWRpY2F0ZSB0bwotCXNpbXBsaWZ5IHNvbWUgdGVzdHMuCi0JKHdhbnRfbm9fb3V0cHV0KTogUmV0dXJuIHplcm8gb3Igbm9uemVybywgZGVwZW5kaW5nIG9uIHN1Y2Nlc3Mgb3IKLQlmYWlsdXJlLgotCShnYXNfdGVzdF9vbGQpOiBSZXR1cm4gdmFsdWUgZnJvbSB3YW50X25vX291dHB1dC4KLQkob2JqZHVtcF9zdGFydF9jb21tb24pOiBTcGxpdCBvZmYgZnJvbSBvYmpkdW1wX3N0YXJ0LgotCShvYmpkdW1wX3N0YXJ0X25vX3N1YmRpcik6IE5ldyBwcm9jZWR1cmUuCi0KLVdlZCBPY3QgMjAgMDc6MjU6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGdhcy9hbGwvZGlmZjEucywgZ2FzL202OGsvcGljMS5zOiBOZXcgdGVzdHMuCi0JKiBnYXMvYWxsL2dhcy5leHAsIGdhcy9tNjhrL2FsbC5leHA6IFJ1biB0aGVtLgotCi0JKiBNYWtlZmlsZS5pbiAoT0JKRFVNUF9GT1JfVEFSR0VUKTogRGVmaW5lIHNpbWlsYXIgdG8KLQlBU19GT1JfVEFSR0VULgotCShjaGVjayk6IERvbid0IHBhc3MgQVNGTEFHUyB2YXJpYWJsZS4KLQkoc2l0ZS5leHApOiBQdXQgQVNGTEFHUywgT0JKRFVNUCwgT0JKRFVNUEZMQUdTIGludG8gc2l0ZS5leHAuCi0KLQlGcm9tIEplZmYgTGF3OgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChvYmpkdW1wX3N0YXJ0LCBvYmpkdW1wX2ZpbmlzaCk6IE5ldyBmdW5jdGlvbnMKLQlzbyB0aGF0IHRlc3RzIGNhbiBwYXJzZSB0aGUgb3V0cHV0IG9mIG9iamR1bXAgbG9va2luZyBmb3IgZXJyb3JzCi0JaW4gcmVsb2NhdGlvbiBlbnRpcmVzLCBmaWxlIGhlYWRlcnMgYW5kIHRoZSBsaWtlLgotCi1UaHUgU2VwIDIzIDE2OjIwOjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZ2FzL2llZWUuZnAveDkzMDUwOWEuZXhwOiBDdXJyZW50bHkgZXhwZWN0ZWQgdG8gZmFpbCBhbHdheXMuCi0JKiBnYXMvYWxsL2dhcy5leHAgKHAxNDgwLnMsIHg5MzA1MDkucyk6IERpdHRvLiAgQnJlYWsgdXAgZ2FzX3Rlc3QKLQljYWxsIHNvIGl0IG5vIGxvbmdlciBwZXJmb3JtcyBtdWx0aXBsZSB0ZXN0cy4KLQkqIGdhcy9tNjhrL2FsbC5leHAgKHQyLnMpOiBEb24ndCBib3RoZXIgd2l0aCBsaXN0aW5ncy4KLQkocDI0MTAucyk6IERvbid0IHBhc3MgdW53YW50ZWQgYXJndW1lbnRzIHRvIGdhc190ZXN0X2Vycm9yLgotCi1XZWQgQXVnIDI1IDE2OjUwOjA4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbGliL2RvKjogUmVtb3ZlIFJDUyBpZCBzdHJpbmdzLgotCi1Nb24gTWF5IDE3IDE1OjA5OjQ1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBnYXMvYWxsL2Zsb2F0LnMsIGdhcy9hbGwvcDE0ODAucywgZ2FzL202OGsvcDI0MTAuczogTmV3IHRlc3RzLgotCSogZ2FzL2FsbC9nYXMuZXhwLCBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gdGhlbS4KLQkqIGdhcy9pMzg2OiBOZXcgZGlyZWN0b3J5LgotCi1Nb24gTWF5IDEwIDE0OjUwOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBBZGRlZCBkaXJlY3Rvcnkgc3RydWN0dXJlLCB0byBjYXRlZ29yaXplIHRlc3RzIGJ5IHRhcmdldHMuCi0JKiBBZGRlZCBuZXcgdGVzdHMgYWxsL3g5MzA1MDkucywgaWVlZS5mcC94OTMwNTA5YS5zLCBtNjhrL3AyNjYzLnMsCi0JYW5kIHJlZmluZWQgc29tZSB0byBleGFtaW5lIHRoZSBhc3NlbWJsZXIgbGlzdGluZyBvdXRwdXQuCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBSZW5hbWVkIGdhc19zdGFydCB0byBnYXNfcnVuLiAgQWRkZWQgc29tZQotCWV4cGVjdF9hZnRlciBwYXR0ZXJucy4KLQkoZ2FzX3N0YXJ0LCBnYXNfZmluaXNoKTogTmV3IHByb2NzLCBmb3IgdGVzdHMgdGhhdCBleGFtaW5lIHByb2Nlc3MKLQlvdXRwdXQuCi0JKiBjb25maWcvdW5peC1nYXMuZXhwOiBJbnZva2UgZ2FzX2luaXQgZGlyZWN0bHksIGluc3RlYWQgb2YKLQlyZXF1aXJpbmcgdGVzdCAuZXhwIGZpbGVzIGRvIGl0LgotCi1XZWQgQXByIDIxIDAxOjI0OjE2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZ2FzL2dhcy5leHA6IEhhbmRsZSBuZXcgdGVzdHMsIGFuZCBjaGFuZ2VzIHRvIHRlc3RpbmcgcHJvY3MuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHdhbnRfbm9fb3V0cHV0KTogTmV3IHByb2M7IHN1Y2Nlc3MgaWZmIG91dHB1dAotCWlzIGVtcHR5LgotCShnYXNfdGVzdF9vbGQpOiBGdW5jdGlvbmFsbHkgc2FtZSBhcyBvbGQgZ2FzX3Rlc3QuCi0JKGdhc190ZXN0X2lnbm9yZV9zdGRvdXQpOiBSZXdyaXR0ZW4gdG8gdXNlIHdhbnRfbm9fb3V0cHV0LgotCShnYXNfdGVzdCk6IE5ldyBhcmd1bWVudCBsaXN0cyBzZXQgb2Ygb3B0aW9ucyB0byBiZSB0cmllZCBpbgotCWNvbWJpbmF0aW9ucy4gIE9wdGlvbiB3aXRoIHRyYWlsaW5nICI+IiBpbmRpY2F0ZXMgc3RhbmRhcmQgb3V0cHV0Ci0Jc2hvdWxkIGJlIGlnbm9yZWQuCi0KLQkqIGdhcy9wMjQyNWEuczogVXNlICUtZm9ybSBmb3IgcmVnaXN0ZXJzLCBzbyB0aGlzIHRlc3QgY2FuIGJlIHJ1bgotCW9uIG02OGstY29mZiB0YXJnZXRzIHRvby4KLQotCSogZ2FzL3AyNDMwYS5zOiBOZXcgdGVzdCBjYXNlLCB3aGl0ZXNwYWNlICZjIG1hdGNoZXMgY3VzdG9tZXIKLQlyZXBvcnQgbW9yZSBjbG9zZWx5LiAgR2V0cyBkaWZmZXJlbnQgcmVzdWx0cyBmcm9tIHAyNDMwLnM7IHRoaXMgaXMKLQliYWQsIGFuZCBub3QgeWV0IHRlc3RlZCBmb3IuCi0KLU1vbiBBcHIgIDUgMTI6Mjc6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGdhcy9wMjM4OWEucywgZ2FzL3AyNDExLnMsIGdhcy90Mi5zOiBOZXcgdGVzdCBjYXNlcy4KLQkqIGxpYi9ydW46IE5ldyBzY3JpcHQuCi0JKiBnYXMvZ2FzLWRlZnMuZXhwIChnYXNfc3RhcnQpOiBUYWtlcyBuZXcgYXJncywgYXNzZW1ibGVyIG9wdGlvbnMKLQlhbmQgcmVkaXJlY3Rpb24gb3B0aW9ucy4gIFVzZSAicnVuIiBzY3JpcHQgc28gcmVkaXJlY3Rpb24gd29ya3MuCi0JKGdhc190ZXN0KTogTm93IHRha2VzIGFzc2VtYmxlciBvcHRpb25zIGFzIHNlcGFyYXRlIGFyZyBmcm9tIGlucHV0Ci0JZmlsZSBuYW1lLgotCShnYXNfdGVzdF9pZ25vcmVfc3Rkb3V0KTogTmV3IHByb2MuICBEaXNjYXJkcyBvdXRwdXQuCi0JKGdhc190ZXN0X2Vycm9yKTogTmV3IHByb2MuICBFeHBlY3RzIGFzc2VtYmxlciB0byBnZW5lcmF0ZSBvdXRwdXQuCi0JKHRhcmdldF9jcHVfZmFtaWx5IHNldHRpbmcpOiBIYW5kbGUgaTQ4Ni0+aTM4NiBhbHNvLgotCi0JKiBsaWIvZG8qOiBTY3JpcHRzIG1vdmVkIGhlcmUgZnJvbSBnYXMvdGVzdHNjcmlwdHMuICBNYXkgYmUgdXNlZnVsCi0Jc29tZWRheSBmb3Igd3JpdGluZyBtb3JlIHRlc3QgY2FzZXM7IG5vdCBjdXJyZW50bHkgdXNlZC4KLQotVHVlIE1hciAzMCAxMTo0NToyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGdhcy9zb2wtZ2NjLnMsIGdhcy9zb2wtY2MucywgZ2FzL3AyNDI1YS5zLCBnYXMvcDIzODkuczogTmV3IHRlc3QKLQljYXNlcy4KLQkqIGdhcy9nYXMuZXhwOiBFbmFibGUgdGhlbSBmb3IgYXBwcm9wcmlhdGUgdGFyZ2V0cy4gIFJlbW92ZWQgc29tZQotCXVzZWxlc3MgY29tbWVudHMgJmMuICBDaGFuZ2VkIG02OGsgdGFyZ2V0IHRlc3QgdG8gYmUgbW9yZSBnZW5lcmFsLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChnYXNfZXhpdCwgZ2FzX2luaXQpOiBOZXcgcHJvY3MuCi0JKiBnYXMvZ2FzLmV4cDogQ2FsbCBnYXNfaW5pdC4KLQotTW9uIE1hciAyOSAwMDowMDowMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogVGVzdCBzdWl0ZSBjcmVhdGVkLgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cCBiL2dhcy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTM0YTAzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotbG9hZF9saWIgZ2FzLWRlZnMuZXhwCi0KLWdsb2JhbCBBUwotaWYgIVtpbmZvIGV4aXN0cyBBU10gdGhlbiB7Ci0gICAgc2V0IEFTIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYXMtbmV3ICIuLi9hcy1uZXciIFt0cmFuc2Zvcm0gYXNdXQotfQotCi1nbG9iYWwgR0FTUAotaWYgIVtpbmZvIGV4aXN0cyBHQVNQXSB0aGVuIHsKLSAgICBzZXQgR0FTUCBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2dhc3AtbmV3ICIuLi9nYXNwLW5ldyIgW3RyYW5zZm9ybSBnYXNwXV0KLX0KLQotZ2xvYmFsIEFTRkxBR1MKLWlmICFbaW5mbyBleGlzdHMgQVNGTEFHU10gdGhlbiB7Ci0gICAgc2V0IEFTRkxBR1MgIiIKLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBPQkpEVU1QXSB0aGVuIHsKLSAgICBzZXQgT0JKRFVNUCBbZmluZGZpbGUgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL29iamR1bXAgXAotCQkJICAkYmFzZV9kaXIvLi4vLi4vYmludXRpbHMvb2JqZHVtcCBcCi0JCQkgIFt0cmFuc2Zvcm0gb2JqZHVtcF1dCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgT0JKRFVNUEZMQUdTXSB0aGVuIHsKLSAgICBzZXQgT0JKRFVNUEZMQUdTIHt9Ci19Ci0KLWlmICFbaW5mbyBleGlzdHMgTk1dIHRoZW4gewotICAgIHNldCBOTSBbZmluZGZpbGUgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL25tLW5ldyBcCi0JCSAgICAgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL25tLW5ldyBcCi0JCSAgICAgW3RyYW5zZm9ybSBubV1dCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgTk1GTEFHU10gdGhlbiB7Ci0gICAgc2V0IE5NRkxBR1Mge30KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBPQkpDT1BZXSB0aGVuIHsKLSAgICBzZXQgT0JKQ09QWSBbZmluZGZpbGUgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL29iamNvcHldCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgT0JKQ09QWUZMQUdTXSB0aGVuIHsKLSAgICBzZXQgT0JKQ09QWUZMQUdTIHt9Ci19Ci0KLWdhc19pbml0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvYWxpZ24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVkZTYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI29iamR1bXA6IC1zIC1qIC50ZXh0Ci0jbmFtZTogYWxpZ24KLQotIyBUZXN0IHRoZSBhbGlnbm1lbnQgcHNldWRvLW9wLgotCi0uKjogLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLSAwMDAwIGZmMDBmZjAxIGZmMDIwMjAyIGZmZmYwMzAzIDA0MDQwNDA0ICAuLi4uLi4uLi4uLi4uLi4uCi0gMDAxMCBmZmZmZmZmZiAwNTA1MDUwNSBmZjA5MGEwYSAwYTBhMGEwYSAgLi4uLi4uLi4uLi4uLi4uLgotIDAwMjAgZmYwMGZmMDEgZmYwMjAyMDIgZmZmZjAzMDMgMDQwNDA0MDQgIC4uLi4uLi4uLi4uLi4uLi4KLSAwMDMwIGZmZmZmZmZmIDA1MDUwNTA1IGZmMDkwYTBhIDBhMGEwYTBhICAuLi4uLi4uLi4uLi4uLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvYWxpZ24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2NjYTEzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5zCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyogVGVzdCB0aGUgYWxpZ25tZW50IHBzZXVkby1vcHMuICAqLwotCS50ZXh0Ci0KLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ24gMSwwCi0KLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ24gMSwxCi0KLQkuYnl0ZQkweGZmCi0JLnAyYWxpZ24gMiwyCi0KLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5wMmFsaWdudyAyLDB4MDMwMwotCi0JLnAyYWxpZ24gMyw0Ci0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5wMmFsaWdubCAzLDB4MDUwNTA1MDUKLQotCS5wMmFsaWduIDEsNgotCS5wMmFsaWduIDEsNwotCi0JLmJ5dGUJMHhmZgotCS5wMmFsaWduIDMsOCw1Ci0JLmJ5dGUJOQotCS5wMmFsaWduIDMsMHhhCi0KLQkuYnl0ZQkweGZmCi0JLmJhbGlnbgkyLDAKLQotCS5ieXRlCTB4ZmYKLQkuYmFsaWduCTIsMQotCi0JLmJ5dGUJMHhmZgotCS5iYWxpZ24JNCwyCi0KLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5iYWxpZ253IDQsMHgwMzAzCi0KLQkuYmFsaWduCTgsNAotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkuYmFsaWdubCA4LDB4MDUwNTA1MDUKLQotCS5iYWxpZ24gMiw2Ci0JLmJhbGlnbiAyLDcKLQotCS5ieXRlCTB4ZmYKLQkuYmFsaWduCTgsOCw1Ci0JLmJ5dGUJOQotCS5iYWxpZ24JOCwweGEKLQotCS5wMmFsaWduIDUKLQkuYmFsaWduIDMyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvZmZ0YWcuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4OThiNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI29iamR1bXA6IC10Ci0jbmFtZTogY29mZnRhZwotCi0uKjogICAgIGZpbGUgZm9ybWF0IC4qCi0KLVNZTUJPTCBUQUJMRToKLVxbICAwXF1cKHNlYyAtMlwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgMTAzXCkgXChueCAxXCkgMHgwKzAwMDAgZm9vLmMKLUZpbGUgCi1cWyAgMlxdXChzZWMgIDFcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsICAgNlwpIFwobnggMFwpIDB4MCswMDAwIGdjYzJfY29tcGlsZWQuCi1cWyAgM1xdXChzZWMgIDFcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsICAgNlwpIFwobnggMFwpIDB4MCswMDAwIF9fX2dudV9jb21waWxlZF9jCi1cWyAgNFxdXChzZWMgLTJcKVwoZmwgMHgwMFwpXCh0eSAgIGFcKVwoc2NsICAxNVwpIFwobnggMVwpIDB4MCswMDAwIF90b2tlbgotQVVYIGxubm8gMCBzaXplIDB4NCB0YWduZHggMCBlbmRuZHggMTAKLVxbICA2XF1cKHNlYyAtMVwpXChmbCAweDAwXClcKHR5ICAgYlwpXChzY2wgIDE2XCkgXChueCAwXCkgMHgwKzAwMDAgX29wZXJhdG9yCi1cWyAgN1xdXChzZWMgLTFcKVwoZmwgMHgwMFwpXCh0eSAgIGJcKVwoc2NsICAxNlwpIFwobnggMFwpIDB4MCswMDAxIF9mbGFncwotXFsgIDhcXVwoc2VjIC0xXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAxMDJcKSBcKG54IDFcKSAweDArMDAwNCAuZW9zCi1BVVggbG5ubyAwIHNpemUgMHg0IHRhZ25keCA0Ci1cWyAxMFxdXChzZWMgIDFcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsICAgM1wpIFwobnggMVwpIDB4WzAtOWEtZl0rIC50ZXh0Ci1BVVggc2NubGVuIDB4WzAtOWEtZl0rIG5yZWxvYyAwIG5sbm5vIDAKLVxbIDEyXF1cKHNlYyAgMlwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgICAzXCkgXChueCAxXCkgMHhbMC05YS1mXSsgLmRhdGEKLUFVWCBzY25sZW4gMHhbMC05YS1mXSsgbnJlbG9jIDAgbmxubm8gMAotXFsgMTRcXVwoc2VjICAzXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAgIDNcKSBcKG54IDFcKSAweFswLTlhLWZdKyAuYnNzCi1BVVggc2NubGVuIDB4WzAtOWEtZl0rIG5yZWxvYyAwIG5sbm5vIDAKLVxbIDE2XF1cKHNlYyAgMlwpXChmbCAweDAwXClcKHR5ICAgMlwpXChzY2wgICAyXCkgXChueCAwXCkgMHgwKzAwMDAgX3Rva2VuCi1cWyAxN1xdXChzZWMgIDJcKVwoZmwgMHgwMFwpXCh0eSAgIGFcKVwoc2NsICAgMlwpIFwobnggMVwpIDB4WzAtOWEtZl0rIF93aGF0Ci1BVVggbG5ubyAwIHNpemUgMHg0IHRhZ25keCA0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvZmZ0YWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1NjU5OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogVGhpcyBmaWxlIHdhcyBjb21waWxlZCBmcm9tIHRoaXMgQyBzb3VyY2U6Ci0JY2hhciB0b2tlbiA9MDsKLQllbnVtIHRva2VuIHsKLQkgICAgICAgIG9wZXJhdG9yLAotCSAgICAgICAgZmxhZ3MKLQl9OwotCSAKLQllbnVtIHRva2VuIHdoYXQ9IG9wZXJhdG9yOwotICovCi0KLQkuZmlsZQkiZm9vLmMiCi1nY2MyX2NvbXBpbGVkLjoKLV9fX2dudV9jb21waWxlZF9jOgotLmdsb2JsIF90b2tlbgotLmRhdGEKLV90b2tlbjoKLQkuYnl0ZSAwCi0udGV4dAotCS5kZWYJX3Rva2VuCi0JLnNjbAkxNQotCS50eXBlCTAxMgotCS5zaXplCTQKLQkuZW5kZWYKLQkuZGVmCV9vcGVyYXRvcgotCS52YWwJMAotCS5zY2wJMTYKLQkudHlwZQkwMTMKLQkuZW5kZWYKLQkuZGVmCV9mbGFncwotCS52YWwJMQotCS5zY2wJMTYKLQkudHlwZQkwMTMKLQkuZW5kZWYKLQkuZGVmCS5lb3MKLQkudmFsCTQKLQkuc2NsCTEwMgotCS50YWcJX3Rva2VuCi0JLnNpemUJNAotCS5lbmRlZgotLmdsb2JsIF93aGF0Ci0uZGF0YQotCS5wMmFsaWduIDIKLV93aGF0OgotCS5sb25nIDAKLS50ZXh0Ci0JLmRlZglfdG9rZW4KLQkudmFsCV90b2tlbgotCS5zY2wJMgotCS50eXBlCTAyCi0JLmVuZGVmCi0JLmRlZglfd2hhdAotCS52YWwJX3doYXQKLQkuc2NsCTIKLQkudGFnCV90b2tlbgotCS5zaXplCTQKLQkudHlwZQkwMTIKLQkuZW5kZWYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb21tZW50LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29tbWVudC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmJjNjQxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb21tZW50LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgVGhpcyB0ZXN0IGZpbGUgaXMgdG8gc2VlIHdoZXRoZXIgY29tbWVudHMgZ2V0IHdyaXR0ZW4gaW50byBsaXN0aW5ncwotIyBjb3JyZWN0bHkuICBUaGUgZmlsZSBoYXMgbm8gcmVhbCBjb250ZW50cy4KLS8qIEMgY29tbWVudHMgdG9vISAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb25kLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZTM5NDIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgVGhpcyBzaG91bGQgbWF0Y2ggdGhlIG91dHB1dCBvZiBnYXMgLWFsYyBjb25kLnMuCi0KLS4qY29uZC5zLioKLQotCi0gICAxWyAJXSsuaWYJMAotICAgOFsgCV0rLmVsc2UKLSAgIDlbIAldKy5pZgkxCi0gIDEwWyAJXSsuZW5kYwotICAxMSAwMDAwIDBbMDJdMDAgPzAwMFswMl1bIAldKy5sb25nWyAJXSsyCi0gIDEyWyAJXSsuaWYJMAotICAxNFsgCV0rLmVsc2UKLSAgMTUgMDAwNCAwWzA0XTAwID8wMDBbMDRdWyAJXSsubG9uZ1sgCV0rNAotICAxNlsgCV0rLmVuZGMKLSAgMTdbIAldKy5lbmRjCi0gIDE4IDAwMDggMDAwMCA/MDAwMFsgCV0rLnAyYWxpZ24gNSwwCi0gIDE4WyAJXSswMDAwID8wMDAwIAotICAxOFsgCV0rMDAwMCA/MDAwMCAKLSAgMThbIAldKzAwMDAgPzAwMDAgCi0gIDE4WyAJXSswMDAwID8wMDAwIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb25kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NTgzMjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuaWYJMAotCS5pZgkxCi0JLmVuZGMKLQkubG9uZwkwCi0JLmlmCTAKLQkubG9uZwkxCi0JLmVuZGMKLQkuZWxzZQotCS5pZgkxCi0JLmVuZGMKLQkubG9uZwkyCi0JLmlmCTAKLQkubG9uZwkzCi0JLmVsc2UKLQkubG9uZwk0Ci0JLmVuZGMKLQkuZW5kYwotCS5wMmFsaWduIDUsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2RpZmYxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZGlmZjEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhODlmZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZGlmZjEucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBEaWZmZXJlbmNlIG9mIHR3byB1bmRlZmluZWQgc3ltYm9scy4KLSMgVGhlIGFzc2VtYmxlciBzaG91bGQgcmVqZWN0IHRoaXMuCi0JLnRleHQKLQkuZ2xvYmwgX2ZvbwotX2ZvbzoJLmxvbmcgX2EgLSBfYgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2Zsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZmxvYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA5OGNhZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZmxvYXQucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS50ZXh0Ci1mb286CS5zaW5nbGUJMHIxLjIzNDVlKzA2Ci0JLnNpbmdsZSAwZjMuMTQxNTkKLQkuZG91YmxlIDByMi43MTgyODIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9nYXMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2dhcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzk3MDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2dhcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotIwotIyBUaGVzZSB0ZXN0cyBzaG91bGQgYmUgdmFsaWQgb24gYWxsIHRhcmdldHMuCi0jCi0KLSMgSSB0aGluayBjdXJyZW50bHkgYWxsIHRhcmdldHMgZmFpbCB0aGlzIG9uZSB3aGVuIGxpc3RpbmdzIGFyZSBlbmFibGVkLgotZ2FzX3Rlc3QgInAyNDI1LnMiICIiICAgIiIgInBjcmVsIHZhbHVlcyBpbiBhc3NpZ25tZW50IgotCi0jIHAxNDgwLnMgdXNlcyBhICIuc3BhY2UiIGRpcmVjdGl2ZSB3aGljaCBmb3IgbW9zdCBhc3NlbWJsZXJzIG1lYW5zCi0jICJhbGxvY2F0ZSBzb21lIHNwYWNlIi4gIE9uIHRoZSBQQSBpdCBtZWFucyAic3dpdGNoIGludG8gdGhpcyBzcGFjZSIuCi0jCi0jIFRoZXJlZm9yZSB0aGlzIHRlc3QgKGFzIGl0IGlzIGN1cnJlbnRseSB3cml0dGVuKSBpcyBjb21wbGV0ZWx5IGJvZ3VzCi0jIGZvciBhbnkgUEEgdGFyZ2V0LiAgRG8gbm90IGJvdGhlciB0cnlpbmcgdG8gcnVuIGl0IGFuZCBqdXN0IGNsYWltCi0jIGl0IGZhaWxzLgotaWYgW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgc2V0dXBfeGZhaWwgKi0qLSoKLSAgICBmYWlsICJzaW1wbGlmaWFibGUgZG91YmxlIHN1YnRyYWN0aW9uIgotfSBlbHNlIHsKLSAgICBnYXNfdGVzdCAicDE0ODAucyIgIiIgIi1hPiIgInNpbXBsaWZpYWJsZSBkb3VibGUgc3VidHJhY3Rpb24iCi19Ci0KLWdhc190ZXN0ICJmbG9hdC5zIiAiIiAgICIiICJzaW1wbGUgRlAgY29uc3RhbnRzIgotCi0jIFRoaXMgdGVzdCBpcyBtZWFuaW5nbGVzcyBmb3IgdGhlIFBBOyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gdW5kZWZpbmVkCi0jIHN5bWJvbHMgaXMgc29tZXRoaW5nIHRoYXQgaXMgKGFuZCBtdXN0IGJlKSBzdXBwb3J0ZWQgb24gdGhlIFBBLgotaWYgIVtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICAgIGdhc190ZXN0X2Vycm9yICJkaWZmMS5zIiAiIiAiZGlmZmVyZW5jZSBvZiB0d28gdW5kZWZpbmVkIHN5bWJvbHMiCi19Ci0KLXByb2MgZG9fY29tbWVudCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21tZW50LnM6IGNvbW1lbnRzIGluIGxpc3RpbmdzIgotICAgIHNldCB4MSAwCi0gICAgc2V0IHgyIDAKLSAgICBzZXQgeDMgMAotICAgIHNldCB3aGl0ZSB7WyBcdF0qfQotICAgIGdhc19zdGFydCAiY29tbWVudC5zIiAiLWFsIgotICAgIHdoaWxlIDEgewotIyBBcHBhcmVudGx5IENSTEYgaXMgcmVjZWl2ZWQgd2hlbiB1c2luZyBwdHlzIGZvciBzdWJwcm9jZXNzZXM7IGhlbmNlIHRoZQotIyBcclxuIGZvciBsaW5lIDMuCi0JZXhwZWN0IHsKLQkgICAgLXJlICJeICsxXFsgXHRcXSsjIFRoaXNcW15cblxdKlxuIgkJeyBzZXQgeDEgMSB9Ci0JICAgIC1yZSAiXiArMlxbIFx0XF0rIyBjb3JyZWN0bHlcW15cblxdKlxuIgl7IHNldCB4MiAxIH0KLQkgICAgLXJlICJeICszXFsgXHRcXSsvLiBDIGNvbW1lbnRzIHRvby4gLi9ccj9cbiIgeyBzZXQgeDMgMSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotICAgIGdhc19maW5pc2gKLSAgICBpZiBbYWxsX29uZXMgJHgxICR4MiAkeDNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLWRvX2NvbW1lbnQKLQotIwotIyBUZXN0IHg5MzA1MDlhIC0tIGNvcnJlY3QgYXNzZW1ibHkgb2YgZGlmZmVyZW5jZXMgaW52b2x2aW5nIGZvcndhcmQKLSMgcmVmZXJlbmNlcy4KLSMKLQotcHJvYyBkb185MzA1MDlhIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRpZmZlcmVuY2UgYmV0d2VlbiBmb3J3YXJkIHJlZmVyZW5jZXMiCi0gICAgc2V0IHggMAotICAgIGdhc19zdGFydCAieDkzMDUwOS5zIiAiLWFsIgotICAgIHdoaWxlIDEgewotIyBXZSBuZWVkIHRvIGFjY29tb2RhdGUgYm90aCBieXRlIG9yZGVycyBoZXJlLgotIyBJZiAiLmxvbmciIG1lYW5zIGFuIDgtYnl0ZSB2YWx1ZSBvbiBzb21lIHRhcmdldCBzb21lZGF5LCB0aGlzIHRlc3Qgd2lsbCBoYXZlCi0jIHRvIGJlIGZpeGVkLgotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArMSAuLi4uIDAwMDAgKjAwMDAiIHsgZmFpbCAkdGVzdG5hbWU7IHNldCB4IDEgfQotCSAgICAtcmUgIl4gKzEgLi4uLiAwNDAwICowMDAwIiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICJeICsxIC4uLi4gMDAwMCAqMDAwNCIgeyBwYXNzICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIgeyB9Ci0JICAgIHRpbWVvdXQgeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mIHsgYnJlYWsgfQotCX0KLSAgICB9Ci0gICAgZ2FzX2ZpbmlzaAotICAgIGlmICEkeCB0aGVuIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi0jIFRoaXMgdGVzdCBpcyBtZWFuaW5nbGVzcyBmb3IgdGhlIFBBOyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scwotIyBtdXN0IG5vdCBiZSByZXNvbHZlZCBieSB0aGUgYXNzZW1ibGVyLgotaWYgIVtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICAgICMgdGhlIHZheCBmYWlscyBiZWNhdXNlIFZNUyBjYW4gYXBwYXJlbnRseSBhY3R1YWxseSBoYW5kbGUgdGhpcwotICAgICMgY2FzZSBpbiByZWxvY3MsIHNvIGdhcyBkb2Vzbid0IGhhbmRsZSBpdCBpdHNlbGYuCi0gICAgc2V0dXBfeGZhaWwgInZheCotKi12bXMqIgotICAgIHNldHVwX3hmYWlsICJtbjEwMzAwKi0qLSoiCi0gICAgc2V0dXBfeGZhaWwgIm1uMTAyMDAqLSotKiIKLSAgICBkb185MzA1MDlhCi19Ci0KLWNhc2UgJHRhcmdldF90cmlwbGV0IGluIHsKLSAgICB7IGhwcGEqLSotKiB9IHsgfQotICAgIGRlZmF1bHQgewotCXJ1bl9kdW1wX3Rlc3Qgc3RydWN0Ci0JcnVuX2R1bXBfdGVzdCBhbGlnbgotICAgIH0KLX0KLQotIyBUaGlzIHRlc3QgaXMgZm9yIGFueSBDT0ZGIHRhcmdldC4KLSMgV2Ugb21pdCBtODhrIENPRkYgYmVjYXVzZSBpdCB1c2VzIHdlaXJkIHBzZXVkby1vcCBuYW1lcy4KLSMgV2Ugb21pdCB0aGUgQVJNIHRvb2xjaGFpbnMgYmVjYXVzZSB0aGV5IGRlZmluZSBsb2NhbHMgdG8KLSMgIHN0YXJ0IHdpdGggJy4nLCB3aGljaCBlbGltaW5hdGVzIC5lb3MsIC50ZXh0IGV0YyBmcm9tIHRoZSBvdXRwdXQuCi1pZiB7ICAgKFtpc3RhcmdldCAqLSotY29mZipdICYmICFbaXN0YXJnZXQgbTg4Ki0qLSpdICYmICFbaXN0YXJnZXQgKmFybSotKi1jb2ZmXSAmJiAhW2lzdGFyZ2V0IHRodW1iKi0qLWNvZmZdKSBcCi0gICAgIHx8KFtpc3RhcmdldCAqLSotcGUqXSAmJiAhW2lzdGFyZ2V0IGFybSotKi1wZSpdICYmICFbaXN0YXJnZXQgdGh1bWIqLSotcGUqXSkgXAotICAgICB8fCBbaXN0YXJnZXQgYTI5ay0qLXVkaSpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGEyOWstKi1lYm1vbipdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGEyOWstKi1zeW0qXSBcCi0gICAgIHx8IFtpc3RhcmdldCBhMjlrLSotdnh3b3JrcypdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi1haXgqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpKjg2LSotc2NvKl0gXAotICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLWlzYypdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi1nbzMyKl0gXAotICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLWN5Z3dpbipdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi0qbnRdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi1pbnRlcml4Kl0gXAotICAgICB8fCAoW2lzdGFyZ2V0IGk5NjAtKi12eHdvcmtzNS4qXSAmJiAhW2lzdGFyZ2V0IGk5NjAtKi12eHdvcmtzNS4wKl0pIH0gewotICAgIHJ1bl9kdW1wX3Rlc3QgY29mZnRhZwotfQotCi0jIFRlc3Qgb21pdHRpbmcgY29uZGl0aW9uYWxzIGZyb20gbGlzdGluZ3MuCi1wcm9jIHRlc3RfY29uZCB7fSB7Ci0gICAgZ2xvYmFsIGNvbXBfb3V0cHV0Ci0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLQotICAgIHNldCB0ZXN0bmFtZSAiY29uZGl0aW9uYWwgbGlzdGluZ3MiCi0gICAgZ2FzX3J1biBjb25kLnMgLWFsYyAiPmR1bXAub3V0IgotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gewotCXNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKLQlmYWlsICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0JaWYgeyBbcmVnZXhwX2RpZmYgZHVtcC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NvbmQuZF0gfSB7Ci0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgcGFzcyAkdGVzdG5hbWUKLQl9Ci0gICAgfQotfQotCi10ZXN0X2NvbmQKLQotIyBGSVhNRTogdGhpcyBpcyBoZXJlIGNhdXNlIG9mIGEgYnVnIGluIERlamFHbnUgMS4xLjEuIFdoZW4gaXQgaXMgbm8gbG9uZ2VyCi0jICAgICAgICBpbiB1c2UsIHRoZW4gdGhpcyBjYW4gYmUgcmVtb3ZlZC4KLWlmIFtpbmZvIGV4aXN0cyBlcnJvckluZm9dIHRoZW4gewotICAgIHVuc2V0IGVycm9ySW5mbwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2NmRmYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQotICAgIDsgVGVzdCBjYXNlIGZvciBhc3NlbWJsZXIgb3B0aW9uICJpdGJsIi4KLSAgICA7IFJ1biBhcyAiYXMgLS1pdGJsIGl0YmwgaXRibC5zIgotICAgIDsgb3Igd2l0aCBzdGFuZC1hbG9uZSB0ZXN0IGNhc2UgIml0YmwtdGVzdCBpdGJsIGl0YmwucyIuCi0gICAgOyBUaGUgInA8bj4iIHJlcHJlc2VudCBwcm9jZXNzb3JzIG9mIGEgbXVsdGktcHJvY2Vzc29yIHN5c3RlbS4KLQotICAgIHAxIGRyZWcgZDEgMSAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMSIgZm9yIENPUDEgaGFzIHZhbHVlIDEKLSAgICBwMSBjcmVnIGMzIDMgICAgICAgIDsgY3RybCByZWdpc3RlciAiYzMiIGZvciBDT1AxIGhhcyB2YWx1ZSAzCi0gICAgcDMgaW5zbiBmaWUgMHgxZToyNC0yMCAgICAgIDsgZnVuY3Rpb24gImZpbGwiIGZvciBDT1AzIGhhcyB2YWx1ZSAzMQotICAgIHAzIGRyZWcgZDMgMyAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKLSAgICBwMyBjcmVnIGMyIDIyICAgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgotICAgIHAzIGluc24gZmVlIDB4MWU6MjQtMjAsZHJlZzoxNy0xMyxjcmVnOjEyLTgsaW1tZWQ6Ny0wCi0KLSAgICBwMyBkcmVnIGQzIDMgICAgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCi0gICAgcDMgY3JlZyBjMiAyMiAgICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKLSAgICBwMyBpbnNuIGZ1bSAweDAxZTAwMDAxIGRyZWc6MTctMTMgY3JlZzoxMi04Ci0gICAgcDMgaW5zbiBmb2ggMHhmOjI0LTIxIGRyZWc6MjAtMTYgaW1tZWQ6MTUtMAotCi0gICAgcDMgaW5zbiBwaWcgMHgxOjI0LTIxKlsweDEwMHwweDJdLCBkcmVnOjIwLTE2LCBpbW1lZDoxNS0wKjB4MTAwMDAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTc0NTRlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0KLQotLyogaXRibC10ZXN0LmMKLQotICAgQ29weXJpZ2h0IChDKSAxOTk3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFN0YW5kLWFsb25lIHRlc3QgZm9yIGluc3RydWN0aW9uIHNwZWNpZmljYXRpb24gdGFibGUgc3VwcG9ydC4KLSAgIFJ1biB1c2luZyAiaXRibC10ZXN0IDxpdGJsPiA8YXNtLnM+IgotICAgd2hlcmUgPGl0Ymw+IGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbiB0YWJsZSwKLSAgIGFuZCA8YXNtLnM+IGlzIHRoZSBuYW1lIG9mIHRoZSBhc3NlbWJsZXIgZmllLiAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgIml0Ymwtb3BzLmgiCi0KLXN0YXRpYyBpbnQgdGVzdF9yZWcgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUsCi0JCSAgICAgdW5zaWduZWQgbG9uZyB2YWwpOwotCi1pbnQgCi1tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIHVuc2lnbmVkIGludCBpbnNuOwotICBGSUxFICpmYXM7Ci0gIGludCBhbGluZSA9IDA7Ci0gIGNoYXIgc1s4MV0sICpuYW1lOwotCi0gIGlmIChhcmdjIDwgMykKLSAgICB7Ci0gICAgICBwcmludGYgKCJ1c2FnZTogJXMgaXRibCBhc20uc1xuIiwgYXJndlswXSk7Ci0gICAgICBleGl0ICgwKTsKLSAgICB9Ci0gIGlmIChpdGJsX3BhcnNlIChhcmd2WzFdKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWxlZCB0byBwYXJzZSBpdGJsXG4iKTsKLSAgICAgIGV4aXQgKDApOwotICAgIH0KLQotICBmYXMgPSBmb3BlbiAoYXJndlsyXSwgInIiKTsKLSAgaWYgKGZhcyA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoImZhaWxlZCB0byBvcGVuIGFzbSBmaWxlICVzXG4iLCBhcmd2WzJdKTsKLSAgICAgIGV4aXQgKDApOwotICAgIH0KLSAgd2hpbGUgKGZnZXRzIChzLCA4MCwgZmFzKSkKLSAgICB7Ci0gICAgICBjaGFyICpwOwotICAgICAgYWxpbmUrKzsKLQotICAgICAgaWYgKHAgPSBzdHJjaHIgKHMsICc7JyksIHApCS8qIHN0cmlwIGNvbW1lbnRzICovCi0JKnAgPSAwOwotICAgICAgaWYgKHAgPSBzdHJjaHIgKHMsICcjJyksIHApCS8qIHN0cmlwIGNvbW1lbnRzICovCi0JKnAgPSAwOwotICAgICAgcCA9IHMgKyBzdHJsZW4gKHMpIC0gMTsKLSAgICAgIHdoaWxlIChwID49IHMgJiYgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICdcbicpKQkvKiBzdHJpcCB0cmFpbGluZyBzcGFjZXMgKi8KLQlwLS07Ci0gICAgICAqKHAgKyAxKSA9IDA7Ci0gICAgICBwID0gczsKLSAgICAgIHdoaWxlICgqcCAmJiAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJ1xuJykpCS8qIHN0cmlwIGxlYWRpbmcgc3BhY2VzICovCi0JcCsrOwotICAgICAgaWYgKCEqcCkKLQljb250aW51ZTsKLQotICAgICAgbmFtZSA9IGl0YmxfZ2V0X2ZpZWxkICgmcCk7Ci0gICAgICBpbnNuID0gaXRibF9hc3NlbWJsZSAobmFtZSwgcCk7Ci0gICAgICBpZiAoaW5zbiA9PSAwKQotCXByaW50ZiAoImxpbmUgJWQ6IEludmFsaWQgaW5zdHJ1Y3Rpb24gKCVzKVxuIiwgYWxpbmUsIHMpOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgYnVmWzEyOF07Ci0JICBwcmludGYgKCJsaW5lICVkOiBpbnNuKCVzKSA9IDB4JXgpXG4iLCBhbGluZSwgcywgaW5zbik7Ci0JICBpZiAoIWl0YmxfZGlzYXNzZW1ibGUgKGJ1ZiwgaW5zbikpCi0JICAgIHByaW50ZiAoImxpbmUgJWQ6IENhbid0IGRpc2Fzc2VtYmxlIGluc3RydWN0aW9uICIKLQkJICAgICIoMHgleClcbiIsIGFsaW5lLCBpbnNuKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgibGluZSAlZDogZGlzYXNtKDB4JXgpID0gJXMpXG4iLCBhbGluZSwgaW5zbiwgYnVmKTsKLQl9Ci0gICAgfQotCi0gIHRlc3RfcmVnICgxLCBlX2RyZWcsICJkMSIsIDEpOwotICB0ZXN0X3JlZyAoMywgZV9jcmVnLCAiYzIiLCAyMik7Ci0gIHRlc3RfcmVnICgzLCBlX2RyZWcsICJkMyIsIDMpOwotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IAotdGVzdF9yZWcgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUsCi0JICB1bnNpZ25lZCBsb25nIHZhbCkKLXsKLSAgY2hhciAqbjsKLSAgdW5zaWduZWQgbG9uZyB2OwotCi0gIG4gPSBpdGJsX2dldF9uYW1lIChwcm9jZXNzb3IsIHR5cGUsIHZhbCk7Ci0gIGlmICghbiB8fCBzdHJjbXAgKG4sIG5hbWUpKQotICAgIHByaW50ZiAoIkVycm9yIC0gcmVnIG5hbWUgbm90IGZvdW5kIGZvciBwcm9lc3Nvcj0lZCwgdHlwZT0lZCwgdmFsPSVkXG4iLAotCSAgICBwcm9jZXNzb3IsIHR5cGUsIHZhbCk7Ci0gIGVsc2UKLSAgICBwcmludGYgKCJuYW1lPSVzIGZvdW5kIGZvciBwcm9jZXNzb3I9JWQsIHR5cGU9JWQsIHZhbD0lZFxuIiwKLQkgICAgbiwgcHJvY2Vzc29yLCB0eXBlLCB2YWwpOwotCi0gIC8qIFdlIHJlcXVpcmUgdGhhdCBuYW1lcyBiZSB1bmlxdWUgYW1vdW5nIHByb2Nlc3NvcnMgYW5kIHR5cGVzLiAqLwotICBpZiAoISBpdGJsX2dldF9yZWdfdmFsIChuYW1lLCAmdikKLSAgICAgIHx8IHYgIT0gdmFsKQotICAgIHByaW50ZiAoIkVycm9yIC0gcmVnIHZhbCBub3QgZm91bmQgZm9yIHByb2Nlc3Nvcj0lZCwgdHlwZT0lZCwgbmFtZT0lc1xuIiwKLQkgICAgcHJvY2Vzc29yLCB0eXBlLCBuYW1lKTsKLSAgZWxzZQotICAgIHByaW50ZiAoInZhbD0weCV4IGZvdW5kIGZvciBwcm9jZXNzb3I9JWQsIHR5cGU9JWQsIG5hbWU9JXNcbiIsCi0JICAgIHYsIHByb2Nlc3NvciwgdHlwZSwgbmFtZSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNTFhYTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotICAgIDsgVGVzdCBjYXNlIGZvciBhc3NlbWJsZXIgb3B0aW9uICJpdGJsIi4KLSAgICA7IFJ1biBhcyAiYXMgLS1pdGJsIGl0YmwgaXRibC5zIgotICAgIDsgb3Igd2l0aCBzdGFuZC1hbG9uZSB0ZXN0IGNhc2UgIml0YmwtdGVzdCBpdGJsIGl0YmwucyIuCi0KLSAgICA7IEFzc2VtYmxlIHByb2Nlc3NvciBpbnN0cnVjdGlvbnMgYXMgZGVmaW5lZCBpbiAiaXRibCIuCi0KLSAgICBmZWUgJGQzLCRjMiwweDEgCTsgIDB4NGZmMDc2MDEKLSAgICBmaWUgCSAgCTsgIDB4NGZmMDAwMDAKLSAgICBmb2ggJDIsMHgxMDAKLSAgICBmdW0gJGQzLCRjMiAgICAgCTsgIDB4NGZmMDc2MDEKLSAgICBwaWcgJDIsMHgxMDAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3AxNDgwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDE0ODAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwYmE4MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDE0ODAucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotc3RhcnQ6CS5sb25nIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcKLQkuc3BhY2UgMHg4MCAtICguIC0gc3RhcnQpCi1mb286CS5sb25nIDQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDI0MjUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMjQyNS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzlkYzk1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMjQyNS5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLnRleHQKLQkuZ2xvYmwgX2Zyb2JuaXR6Ci1fZnJvYm5pdHo6Ci0JLmxvbmcgMSwgMiwgMywgNCwgNSwgNiwgNywgR1JVTVAsIDQyCi0JR1JVTVA9Li1fZnJvYm5pdHoKLQlIQUxGR1JVTVA9R1JVTVAvMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM1ZGQ0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9zdHJ1Y3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogc3RydWN0Ci0KLSMgVGVzdCB0aGUgLnN0cnVjdCBwc2V1ZG8tb3AuCi0KLTArMDAgQSB3MQotMCswMiBBIHcyCi0wKzA0IEEgdzMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9zdHJ1Y3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9zdHJ1Y3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjZmQwYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvc3RydWN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLmdsb2JsCXcxCi0JLmdsb2JsCXcyCi0JLmdsb2JsCXczCi0JLmxvbmcJMAotCS5zdHJ1Y3QJMAotdzE6CS5zaG9ydAkwCi13MjoJLnNob3J0CTAKLXczOgkuc2hvcnQJMAotCS50ZXh0Ci0JLmxvbmcJMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3g5MzA1MDkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC94OTMwNTA5LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOTk5OTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3g5MzA1MDkucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCS5sb25nIEwyLUwxCi1MMToJLmxvbmcgMHgxMjM0Ci1MMjoJLmxvbmcgMHg1Njc4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxwaGEvZnAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2ZjdlOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5kCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgZWNvZmYtbGl0dGxlYWxwaGEKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAucmRhdGE6Ci0gMDAwMCA3MWEzNzkwOSA0ZjkzMGE0MCA1NDQxNzg5YSBjZDRiODgxYiAgcS55Lk8uLkBUQXguLksuLgotIDAwMTAgMmE0MDRmOTMgNzkwOTcxYTMgNzg5YTU0NDAgNTQ0MTc4OWEgIC5ATy55LnEueC5UQFRBeC4KLSAwMDIwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWM4ODEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxwaGEvZnAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIwotIyBBbHBoYSBPU0YvMSB0ZXN0cwotIwotCi1pZiBbaXN0YXJnZXQgYWxwaGEtKi1vc2YqXSB0aGVuIHsKLSAgICBzZXQgdGVzdG5hbWUgImZwIGNvbnN0YW50cyAocGFydCAyKSIKLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmcC5zIiAiIiAiZnAgY29uc3RhbnRzIChwYXJ0IDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcCAiLXMgLWogLnJkYXRhID4gYS5kdW1wIgotCWlmIHsgW3JlZ2V4cF9kaWZmICJhLmR1bXAiICIkc3JjZGlyLyRzdWJkaXIvZnAuZCJdID09IDAgfSB0aGVuIHsKLQkgICAgcGFzcyAkdGVzdG5hbWUKLQl9IGVsc2UgewotCSAgICBmYWlsICR0ZXN0bmFtZQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxwaGEvZnAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlYmJiZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS5yZGF0YQotIyBUaGVzZSB0aHJlZSBmb3JtYXRzIGFyZSA4IGJ5dGVzIGVhY2guCi0JLnRfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCi0jCS5ieXRlIDB4NzEsIDB4YTMsIDB4NzksIDB4MDksIDB4NGYsIDB4OTMsIDB4MGEsIDB4NDAKLQkuZF9mbG9hdGluZyAzLjMyMTkyODA5NDg4NzM2MjE4MTcxZTAKLSMJLmJ5dGUgMHg1NCwgMHg0MSwgMHg3OCwgMHg5YSwgMHhjZCwgMHg0YiwgMHg4OCwgMHgxYgotCS5nX2Zsb2F0aW5nIDMuMzIxOTI4MDk0ODg3MzYyMTgxNzFlMAotIwkuYnl0ZSAweDJhLCAweDQwLCAweDRmLCAweDkzLCAweDc5LCAweDA5LCAweDcxLCAweGEzCi0jIFRoZSBuZXh0IHR3byBhcmUgZm91ciBieXRlcyBlYWNoLgotCS5zX2Zsb2F0aW5nIDMuMzIxOTI4MDk0ODg3MzYyMTgxNzFlMAotIwkuYnl0ZSAweDc4LCAweDlhLCAweDU0LCAweDQwLCAwLCAwLCAwLCAwCi0JLmZfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCi0jCS5ieXRlIDB4NTQsIDB4NDEsIDB4NzgsIDB4OWEsIDAsIDAsIDAsIDAKLQkubG9uZyAwLCAwLCAwLCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFhY2Y2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5kCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIEBJQyswQDAwODIwMAlAT0NAIHIwLHIxCi0wMDAwMDAwNCBASUMrM0A2ZTM4MDAJQE9DQCBmcCxzcAotMDAwMDAwMDggQElDKzBAMWZmZTAwCUBPQ0AgcjAsMAotMDAwMDAwMGMgQElDKzBAM2ZmZmZmCUBPQ0AgcjEsLTEKLTAwMDAwMDEwIEBJQys3QGUxMDQwMAlAT0NAIDAscjIKLTAwMDAwMDE0IEBJQys3QGUxODdmZglAT0NAIC0xLHIzCi0wMDAwMDAxOCBASUMrMEA5ZmZlZmYJQE9DQCByNCwyNTUKLTAwMDAwMDFjIEBJQys3QGUyOGFmZglAT0NAIDI1NSxyNQotMDAwMDAwMjAgQElDKzBAZGZmZjAwCUBPQ0AgcjYsLTI1NgotMDAwMDAwMjQgQElDKzdAZTM4ZjAwCUBPQ0AgLTI1NixyNwotMDAwMDAwMjggQElDKzFAMWY3YzAwCUBPQ0AgcjgsMjU2Ci0wMDAwMDAzMCBASUMrMUAzZjdjMDAJQE9DQCByOSwtMjU3Ci0wMDAwMDAzOCBASUMrN0BjNTE0MDAJQE9DQCA1MTEscjEwCi0wMDAwMDA0MCBASUMrMUA3ZjdjMDAJQE9DQCByMTEsMTExMTYzODU5NAotMDAwMDAwNDggQElDKzdAYzYxODAwCUBPQ0AgMzA1NDE5ODk2LHIxMgotMDAwMDAwNTAgQElDKzdAZmY3Y2ZmCUBPQ0AgMjU1LDI1NgotMDAwMDAwNTggQElDKzdAZGZmZWZmCUBPQ0AgMjU2LDI1NQotMDAwMDAwNjAgQElDKzBAMWY3YzAwCUBPQ0AgcjAsMAotCQlSRUxPQzogMDAwMDAwNjQgUl9BUkNfMzIgZm9vCi0wMDAwMDA2OCBASUMrMEAwMDgyMDAJQE9DQCByMCxyMQotMDAwMDAwNmMgQElDKzBANjIwODAwCUBPQ0AgcjMscjQKLTAwMDAwMDcwIEBJQyswQGMzOGUwMQlAT0NALmVxIHI2LHI3Ci0wMDAwMDA3NCBASUMrMUAyNTE0MDEJQE9DQC5lcSByOSxyMTAKLTAwMDAwMDc4IEBJQysxQDg2OWEwMglAT0NALm5lIHIxMixyMTMKLTAwMDAwMDdjIEBJQysxQGU4MjAwMglAT0NALm5lIHIxNSxyMTYKLTAwMDAwMDgwIEBJQysyQDQ5YTYwMwlAT0NALnAgcjE4LHIxOQotMDAwMDAwODQgQElDKzJAYWIyYzAzCUBPQ0AucCByMjEscjIyCi0wMDAwMDA4OCBASUMrM0AwY2IyMDQJQE9DQC5uIHIyNCxyMjUKLTAwMDAwMDhjIEBJQyszQDZlMzgwNAlAT0NALm4gZnAsc3AKLTAwMDAwMDkwIEBJQyszQGNmYmUwNQlAT0NALmMgaWxpbmsyLGJsaW5rCi0wMDAwMDA5NCBASUMrNEAzMTQ0MDUJQE9DQC5jIHIzMyxyMzQKLTAwMDAwMDk4IEBJQys0QDkyY2EwNQlAT0NALmMgcjM2LHIzNwotMDAwMDAwOWMgQElDKzRAZjQ1MDA2CUBPQ0AubmMgcjM5LHI0MAotMDAwMDAwYTAgQElDKzVANTVkNjA2CUBPQ0AubmMgcjQyLHI0MwotMDAwMDAwYTQgQElDKzVAYjc1YzA2CUBPQ0AubmMgcjQ1LHI0NgotMDAwMDAwYTggQElDKzZAMThlMjA3CUBPQ0AudiByNDgscjQ5Ci0wMDAwMDBhYyBASUMrNkA3YTY4MDcJQE9DQC52IHI1MSxyNTIKLTAwMDAwMGIwIEBJQys2QGRiZWUwOAlAT0NALm52IHI1NCxyNTUKLTAwMDAwMGI0IEBJQys3QDNkNzQwOAlAT0NALm52IHI1NyxyNTgKLTAwMDAwMGI4IEBJQys3QDllNzgwOQlAT0NALmd0IGxwX2NvdW50LGxwX2NvdW50Ci0wMDAwMDBiYyBASUMrMEAxZjdjMGEJQE9DQC5nZSByMCwwCi0wMDAwMDBjNCBASUMrN0BjMDgyMGIJQE9DQC5sdCAxLHIxCi0wMDAwMDBjYyBASUMrN0BkZjdjMGMJQE9DQC5sZSAyLDIKLTAwMDAwMGQ0IEBJQyswQDYxODYwZAlAT0NALmhpIHIzLHIzCi0wMDAwMDBkOCBASUMrMEA4MjA4MGUJQE9DQC5scyByNCxyNAotMDAwMDAwZGMgQElDKzBAYTI4YTBmCUBPQ0AucG56IHI1LHI1Ci0wMDAwMDBlMCBASUMrMEAwMDgzMDAJQE9DQC5mIHIwLHIxCi0wMDAwMDBlNCBASUMrMEA1ZWZhMDEJQE9DQC5mIHIyLDEKLTAwMDAwMGU4IEBJQys3QGExODYwMQlAT0NALmYgMSxyMwotMDAwMDAwZWMgQElDKzdAYTIwODAwCUBPQ0AuZiAwLHI0Ci0wMDAwMDBmMCBASUMrMEBiZjdkMDAJQE9DQC5mIHI1LDUxMgotMDAwMDAwZjggQElDKzdAYzMwZDAwCUBPQ0AuZiA1MTIscjYKLTAwMDAwMTAwIEBJQys3QGRmN2QwMAlAT0NALmYgNTEyLDUxMgotMDAwMDAxMDggQElDKzBAMDA4MzAxCUBPQ0AuZXEuZiByMCxyMQotMDAwMDAxMGMgQElDKzBAM2Y3ZDAyCUBPQ0AubmUuZiByMSwwCi0wMDAwMDExNCBASUMrN0BjMTA1MGIJQE9DQC5sdC5mIDAscjIKLTAwMDAwMTFjIEBJQys3QGMxMDUwOQlAT0NALmd0LmYgMSxyMgotMDAwMDAxMjQgQElDKzBAMWY3ZDBjCUBPQ0AubGUuZiByMCw1MTIKLTAwMDAwMTJjIEBJQys3QGMxMDUwYQlAT0NALmdlLmYgNTEyLHIyCi0wMDAwMDEzNCBASUMrN0BkZjdkMDQJQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FsaWFzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyNDQ0MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMucworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSMgQE9DQCB0ZXN0Ci0KLSMgcmVnLHJlZwotCUBPQ0AgcjAscjEKLQlAT0NAIGZwLHNwCi0KLSMgc2hpbW0gdmFsdWVzCi0JQE9DQCByMCwwCi0JQE9DQCByMSwtMQotCUBPQ0AgMCxyMgotCUBPQ0AgLTEscjMKLQlAT0NAIHI0LDI1NQotCUBPQ0AgMjU1LHI1Ci0JQE9DQCByNiwtMjU2Ci0JQE9DQCAtMjU2LHI3Ci0KLSMgbGltbSB2YWx1ZXMKLQlAT0NAIHI4LDI1NgotCUBPQ0AgcjksLTI1NwotCUBPQ0AgNTExLHIxMAotCUBPQ0AgcjExLDB4NDI0MjQyNDIKLQlAT0NAIDB4MTIzNDU2NzgscjEyCi0KLSMgc2hpbW0gYW5kIGxpbW0KLQlAT0NAIDI1NSwyNTYKLQlAT0NAIDI1NiwyNTUKLQotIyBzeW1ib2xzCi0JQE9DQCByMCxmb28KLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24KLQlAT0NALmFsIHIwLHIxCi0JQE9DQC5yYSByMyxyNAotCUBPQ0AuZXEgcjYscjcKLQlAT0NALnogcjkscjEwCi0JQE9DQC5uZSByMTIscjEzCi0JQE9DQC5ueiByMTUscjE2Ci0JQE9DQC5wbCByMTgscjE5Ci0JQE9DQC5wIHIyMSxyMjIKLQlAT0NALm1pIHIyNCxyMjUKLQlAT0NALm4gcjI3LHIyOAotCUBPQ0AuY3MgcjMwLHIzMQotCUBPQ0AuYyByMzMscjM0Ci0JQE9DQC5sbyByMzYscjM3Ci0JQE9DQC5jYyByMzkscjQwCi0JQE9DQC5uYyByNDIscjQzCi0JQE9DQC5ocyByNDUscjQ2Ci0JQE9DQC52cyByNDgscjQ5Ci0JQE9DQC52IHI1MSxyNTIKLQlAT0NALnZjIHI1NCxyNTUKLQlAT0NALm52IHI1NyxyNTgKLQlAT0NALmd0IHI2MCxyNjAKLQlAT0NALmdlIHIwLDAKLQlAT0NALmx0IDEscjEKLQlAT0NALmxlIDIsMgotCUBPQ0AuaGkgcjMscjMKLQlAT0NALmxzIHI0LHI0Ci0JQE9DQC5wbnogcjUscjUKLQotIyBmbGFnIHNldHRpbmcKLQlAT0NALmYgcjAscjEKLQlAT0NALmYgcjIsMQotCUBPQ0AuZiAxLHIzCi0JQE9DQC5mIDAscjQKLQlAT0NALmYgcjUsNTEyCi0JQE9DQC5mIDUxMixyNgotCUBPQ0AuZiA1MTIsNTEyCi0KLSMgY29uZGl0aW9uYWwgZXhlY3V0aW9uICsgZmxhZyBzZXR0aW5nCi0JQE9DQC5lcS5mIHIwLHIxCi0JQE9DQC5uZS5mIHIxLDAKLQlAT0NALmx0LmYgMCxyMgotCUBPQ0AuZ3QuZiAxLHIyCi0JQE9DQC5sZS5mIHIwLDUxMgotCUBPQ0AuZ2UuZiA1MTIscjIKLQlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYXJjLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hcmMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk4NDUzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hcmMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLSMgQVJDIGdhcyB0ZXN0c3VpdGUKLQotIyBUZXN0IGFuIGluc24gZnJvbSBhIHRlbXBsYXRlIC5zLy5kLgotIyBUaGUgYmVzdCB3YXkgdG8gY3JlYXRlIHRoZSAuZCBmaWxlIGlzIHRvIHJ1biB0aGUgdGVzdHMgd2l0aG91dCBpdCwgbGV0Ci0jIGRlamFnbnUgY3Jhc2gsIHJ1biBhcy5uZXcgb24gdGhlIGp1c3QgYnVpbHQgLnMgZmlsZSwgcnVuIG9iamR1bXAgLWRyIG9uCi0jIHRoZSByZXN1bHQgb2YgdGhhdCwgY29weSB0aGUgcmVzdWx0IGludG8gdGhlIC5kIGZpbGUsIGFuZCBlZGl0IGluIHRoZQotIyBuZWNlc3NhcnkgcGF0dGVybnMgKEBPQ0AsIGV0Yy4pLiAgU291bmRzIGNvbXBsaWNhdGVkIGJ1dCBpdCdzIGVhc3kuICBUaGUKLSMgY2F0Y2ggaXMgdGhhdCB3ZSBhc3N1bWUgYSB3b3JraW5nIGFzc2VtYmxlciBpcyB1c2VkIHRvIGJ1aWxkIGl0LiAgVGhhdCdzCi0jIG9idmlvdXNseSBub3QgZW50aXJlbHkga29zaGVyLCBidXQgb25jZSB0aGUgLmQgZmlsZSBpcyBjcmVhdGVkIG9uZSBjYW4KLSMgdmVyaWZ5IGl0J3MgY29udGVudHMgb3ZlciB0aW1lLgotIwotIyBUZW1wbGF0ZSBwYXR0ZXJuczoKLSMgQE9DQCAtIHBsYWNlaG9sZGVyIGZvciB0aGUgb3Bjb2RlCi0jIEBJQys/QCAtIHBsYWNlIGhvbGRlciBmb3IgdGhlIGluc24gY29kZQotIyBASTMrPz9AIC0gcGxhY2UgaG9sZGVyIGZvciB0aGUgb3BlcmF0aW9uIGNvZGUgb2YgY29kZSAzIGluc25zLgotCi1wcm9jIHRlc3RfdGVtcGxhdGVfaW5zbiB7IGNwdSB0bXBsIG9wY29kZSBpY29kZSB9IHsKLSAgICBnbG9iYWwgc3JjZGlyIHN1YmRpciBvYmpkaXIKLQotICAgICMgQ2hhbmdlIEBPQ0AgaW4gdGhlIHRlbXBsYXRlIGZpbGUgdG8gJG9wY29kZQotCi0gICAgc2V0IGluX2ZkIFtvcGVuICRzcmNkaXIvJHN1YmRpci8kdG1wbC5zIHJdCi0gICAgc2V0IG91dF9mZCBbb3BlbiAkb2JqZGlyLyRvcGNvZGUucyB3XQotICAgICMgRklYTUU6IGNoZWNrIHJldHVybiBjb2RlcwotCi0gICAgcHV0cyAkb3V0X2ZkICJcdC5jcHUgJGNwdVxuIgotICAgIHdoaWxlIHsgW2dldHMgJGluX2ZkIGxpbmVdID49IDAgfSB7Ci0JcmVnc3ViICJAT0NAIiAkbGluZSAkb3Bjb2RlIGxpbmUKLQlwdXRzICRvdXRfZmQgJGxpbmUKLSAgICB9Ci0KLSAgICBjbG9zZSAkaW5fZmQKLSAgICBjbG9zZSAkb3V0X2ZkCi0KLSAgICAjIENyZWF0ZSBvdXRwdXQgdGVtcGxhdGUuCi0KLSAgICBzZXQgaW5fZmQgW29wZW4gJHNyY2Rpci8kc3ViZGlyLyR0bXBsLmQgcl0KLSAgICBzZXQgb3V0X2ZkIFtvcGVuICRvYmpkaXIvJG9wY29kZS5kIHddCi0gICAgIyBGSVhNRTogY2hlY2sgcmV0dXJuIGNvZGVzCi0KLSAgICB3aGlsZSB7IFtnZXRzICRpbl9mZCBsaW5lXSA+PSAwIH0gewotCXJlZ3N1YiAiQE9DQCIgJGxpbmUgJG9wY29kZSBsaW5lCi0JI3NlbmRfdXNlciAiJGxpbmVcbiIKLQlpZiBbc3RyaW5nIG1hdGNoICIqQElDKz9AKiIgJGxpbmVdIHsKLQkgICAgIyBJbnNlcnQgdGhlIG9wY29kZS4gIEl0IG9jY3VwaWVzIHRoZSB0b3AgNSBiaXRzLgotCSAgICByZWdleHAgIl4oLiopQElDXFwrKC4pQCguKikkIiAkbGluZSBqdW5rIGxlZnRwYXJ0IG4gcmlnaHRwYXJ0Ci0JICAgIHNldCBuIFtleHByICgkaWNvZGUgPDwgMykgKyAkbl0KLQkgICAgc2V0IG4gW2Zvcm1hdCAiJTAyeCIgJG5dCi0JICAgIHB1dHMgJG91dF9mZCAiJGxlZnRwYXJ0JG4kcmlnaHRwYXJ0IgotCX0gZWxzZWlmIFtzdHJpbmcgbWF0Y2ggIipASTMrPz9AKiIgJGxpbmVdIHsKLQkgICAgIyBJbnNlcnQgaW5zbiAzIGNvZGUgKHJlZ2lzdGVyIEMgZmllbGQpCi0JICAgICMgYjE1PTgvMCwgYjg9MS8wICh0aGVpciByZXNwZWN0aXZlIGhleCB2YWx1ZXMgaW4gdGhlIG9iamR1bXApCi0JICAgIHJlZ2V4cCAiXiguKilASTNcXCsoLikoLilAKC4qKSQiICRsaW5lIGp1bmsgbGVmdHBhcnQgYjE1IGI4IHJpZ2h0cGFydAotCSAgICBzZXQgbiBbZXhwciAoJGljb2RlIDw8IDEpICsgKCRiMTUgPDwgNCkgKyAoJGI4IDw8IDApXQotCSAgICBzZXQgbiBbZm9ybWF0ICIlMDJ4IiAkbl0KLQkgICAgcHV0cyAkb3V0X2ZkICIkbGVmdHBhcnQkbiRyaWdodHBhcnQiCi0JfSBlbHNlIHsKLQkgICAgcHV0cyAkb3V0X2ZkICRsaW5lCi0JfQotICAgIH0KLQotICAgIGNsb3NlICRpbl9mZAotICAgIGNsb3NlICRvdXRfZmQKLQotICAgICMgRmluYWxseSwgcnVuIHRoZSB0ZXN0LgotCi0gICAgcnVuX2R1bXBfdGVzdCAkb2JqZGlyLyRvcGNvZGUKLQotICAgICMgIm1ha2UgY2xlYW4iIHdvbid0IGRlbGV0ZSB0aGVzZSwgc28gZm9yIG5vdyB3ZSBtdXN0LgotICAgIGNhdGNoICJleGVjIHJtIC1mICRvYmpkaXIvJG9wY29kZS5zICRvYmpkaXIvJG9wY29kZS5kIgotfQotCi0jIFJ1biB0aGUgdGVzdHMuCi0KLWlmIFtpc3RhcmdldCBhcmMqLSotKl0gdGhlbiB7Ci0KLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIGFkYyA5Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBhZGQgOAotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggYW5kIDEyCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBiaWMgMTQKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIG9yIDEzCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBzYmMgMTEKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIHN1YiAxMAotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggeG9yIDE1Ci0KLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBhbGlhcyBtb3YgMTIKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBhbGlhcyBybGMgOQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIGFzbCA4Ci0jIGBsc2wnIGdldHMgZHVtcGVkIGFzIGBhc2wnIHNvIHRoaXMgbXVzdCBiZSB0ZXN0ZWQgZWxzZXdoZXJlLgotIyAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIGxzbCA4Ci0KLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgYXNyIDEKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgbHNyIDIKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgcm9yIDMKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgcnJjIDQKLQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGJyYW5jaCBiIDQKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBicmFuY2ggYmwgNQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGJyYW5jaCBscCA2Ci0KLSAgICBydW5fZHVtcF90ZXN0ICJqIgotCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgc2V4YiA1Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgc2V4dyA2Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgZXh0YiA3Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgZXh0dyA4Ci0KLSAgICBydW5fZHVtcF90ZXN0ICJmbGFnIgotIyAgICBydW5fZHVtcF90ZXN0ICJub3AiCi0KLSAgICBydW5fZHVtcF90ZXN0ICJsZCIKLSAgICBydW5fZHVtcF90ZXN0ICJzdCIKLQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzliMDE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9icmFuY2guZAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBAT0NACi0KLSMgVGVzdCB0aGUgQE9DQCBpbnNuLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCA8dGV4dF9sYWJlbD4gQElDKzdAZmZmZjgwCUBPQ0AgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAwNCA8dGV4dF9sYWJlbFwrND4gQElDKzdAZmZmZjAwCUBPQ0AgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAwOCA8dGV4dF9sYWJlbFwrOD4gQElDKzdAZmZmZTgwCUBPQ0AgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAwYyA8dGV4dF9sYWJlbFwrYz4gQElDKzdAZmZmZTAxCUBPQ0BlcSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDEwIDx0ZXh0X2xhYmVsXCsxMD4gQElDKzdAZmZmZDgxCUBPQ0BlcSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDE0IDx0ZXh0X2xhYmVsXCsxND4gQElDKzdAZmZmZDAyCUBPQ0BuZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDE4IDx0ZXh0X2xhYmVsXCsxOD4gQElDKzdAZmZmYzgyCUBPQ0BuZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDFjIDx0ZXh0X2xhYmVsXCsxYz4gQElDKzdAZmZmYzAzCUBPQ0BwIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMjAgPHRleHRfbGFiZWxcKzIwPiBASUMrN0BmZmZiODMJQE9DQHAgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAyNCA8dGV4dF9sYWJlbFwrMjQ+IEBJQys3QGZmZmIwNAlAT0NAbiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDI4IDx0ZXh0X2xhYmVsXCsyOD4gQElDKzdAZmZmYTg0CUBPQ0BuIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMmMgPHRleHRfbGFiZWxcKzJjPiBASUMrN0BmZmZhMDUJQE9DQGMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAzMCA8dGV4dF9sYWJlbFwrMzA+IEBJQys3QGZmZjk4NQlAT0NAYyAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDM0IDx0ZXh0X2xhYmVsXCszND4gQElDKzdAZmZmOTA1CUBPQ0BjIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMzggPHRleHRfbGFiZWxcKzM4PiBASUMrN0BmZmY4ODYJQE9DQG5jIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwM2MgPHRleHRfbGFiZWxcKzNjPiBASUMrN0BmZmY4MDYJQE9DQG5jIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNDAgPHRleHRfbGFiZWxcKzQwPiBASUMrN0BmZmY3ODYJQE9DQG5jIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNDQgPHRleHRfbGFiZWxcKzQ0PiBASUMrN0BmZmY3MDcJQE9DQHYgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA0OCA8dGV4dF9sYWJlbFwrNDg+IEBJQys3QGZmZjY4NwlAT0NAdiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDRjIDx0ZXh0X2xhYmVsXCs0Yz4gQElDKzdAZmZmNjA4CUBPQ0BudiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDUwIDx0ZXh0X2xhYmVsXCs1MD4gQElDKzdAZmZmNTg4CUBPQ0BudiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDU0IDx0ZXh0X2xhYmVsXCs1ND4gQElDKzdAZmZmNTA5CUBPQ0BndCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDU4IDx0ZXh0X2xhYmVsXCs1OD4gQElDKzdAZmZmNDhhCUBPQ0BnZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDVjIDx0ZXh0X2xhYmVsXCs1Yz4gQElDKzdAZmZmNDBiCUBPQ0BsdCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDYwIDx0ZXh0X2xhYmVsXCs2MD4gQElDKzdAZmZmMzhjCUBPQ0BsZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDY0IDx0ZXh0X2xhYmVsXCs2ND4gQElDKzdAZmZmMzBkCUBPQ0BoaSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDY4IDx0ZXh0X2xhYmVsXCs2OD4gQElDKzdAZmZmMjhlCUBPQ0BscyAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDZjIDx0ZXh0X2xhYmVsXCs2Yz4gQElDKzdAZmZmMjBmCUBPQ0BwbnogMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA3MCA8dGV4dF9sYWJlbFwrNzA+IEBJQys3QGZmZmY4MAlAT0NAIDAwMDAwMDcwIDx0ZXh0X2xhYmVsXCs3MD4KLQkJUkVMT0M6IDAwMDAwMDcwIFJfQVJDX0IyMl9QQ1JFTCBleHRlcm5hbF90ZXh0X2xhYmVsCi0wMDAwMDA3NCA8dGV4dF9sYWJlbFwrNzQ+IEBJQyswQDAwMDAwMAlAT0NAIDAwMDAwMDc4IDx0ZXh0X2xhYmVsXCs3OD4KLTAwMDAwMDc4IDx0ZXh0X2xhYmVsXCs3OD4gQElDKzdAZmZmMGEwCUBPQ0AuZCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDdjIDx0ZXh0X2xhYmVsXCs3Yz4gQElDKzdAZmZmMDAwCUBPQ0AgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA4MCA8dGV4dF9sYWJlbFwrODA+IEBJQys3QGZmZWZjMAlAT0NALmpkIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwODQgPHRleHRfbGFiZWxcKzg0PiBASUMrN0BmZmVmMjEJQE9DQGVxLmQgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA4OCA8dGV4dF9sYWJlbFwrODg+IEBJQys3QGZmZWU4MglAT0NAbmUgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA4YyA8dGV4dF9sYWJlbFwrOGM+IEBJQys3QGZmZWU0NglAT0NAbmMuamQgMDAwMDAwMDAgPHRleHRfbGFiZWw+CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZjE2MTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyBAT0NAIHRlc3QKLQkKLXRleHRfbGFiZWw6Ci0KLSMgQ29uZGl0aW9uIHRlc3RzCi0JQE9DQAl0ZXh0X2xhYmVsCi0JQE9DQGFsCXRleHRfbGFiZWwKLQlAT0NAcmEJdGV4dF9sYWJlbAotCUBPQ0BlcQl0ZXh0X2xhYmVsCi0JQE9DQHoJdGV4dF9sYWJlbAotCUBPQ0BuZQl0ZXh0X2xhYmVsCi0JQE9DQG56CXRleHRfbGFiZWwKLQlAT0NAcGwJdGV4dF9sYWJlbAotCUBPQ0BwCXRleHRfbGFiZWwKLQlAT0NAbWkJdGV4dF9sYWJlbAotCUBPQ0BuCXRleHRfbGFiZWwKLQlAT0NAY3MJdGV4dF9sYWJlbAotCUBPQ0BjCXRleHRfbGFiZWwKLQlAT0NAbG8JdGV4dF9sYWJlbAotCUBPQ0BjYwl0ZXh0X2xhYmVsCi0JQE9DQG5jCXRleHRfbGFiZWwKLQlAT0NAaHMJdGV4dF9sYWJlbAotCUBPQ0B2cwl0ZXh0X2xhYmVsCi0JQE9DQHYJdGV4dF9sYWJlbAotCUBPQ0B2Ywl0ZXh0X2xhYmVsCi0JQE9DQG52CXRleHRfbGFiZWwKLQlAT0NAZ3QJdGV4dF9sYWJlbAotCUBPQ0BnZQl0ZXh0X2xhYmVsCi0JQE9DQGx0CXRleHRfbGFiZWwKLQlAT0NAbGUJdGV4dF9sYWJlbAotCUBPQ0BoaQl0ZXh0X2xhYmVsCi0JQE9DQGxzCXRleHRfbGFiZWwKLQlAT0NAcG56CXRleHRfbGFiZWwKLQotCUBPQ0AJZXh0ZXJuYWxfdGV4dF9sYWJlbAotCi0JQE9DQAkwCi0KLSMgRGVsYXkgc2xvdHMKLQlAT0NALmQJdGV4dF9sYWJlbAotCUBPQ0AubmQJdGV4dF9sYWJlbAotCUBPQ0AuamQJdGV4dF9sYWJlbAotCi0jIENvbmRpdGlvbiB0ZXN0cyBhbmQgZGVsYXkgc2xvdHMKLQlAT0NAZXEuZAl0ZXh0X2xhYmVsCi0JQE9DQG5lLm5kCXRleHRfbGFiZWwKLQlAT0NAY2MuamQJdGV4dF9sYWJlbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9mbGFnLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZjM2ZDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcuZAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBmbGFnCi0KLSMgVGVzdCB0aGUgZmxhZyBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1ObyBzeW1ib2xzIGluICJhLm91dCIuCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgMWZhMDAwMDAJZmxhZyByMAotMDAwMDAwMDQgMWZiZjgwMDEJZmxhZyAxCi0wMDAwMDAwOCAxZmJmODAwMglmbGFnIDIKLTAwMDAwMDBjIDFmYmY4MDA0CWZsYWcgNAotMDAwMDAwMTAgMWZiZjgwMDgJZmxhZyA4Ci0wMDAwMDAxNCAxZmJmODAxMAlmbGFnIDE2Ci0wMDAwMDAxOCAxZmJmODAyMAlmbGFnIDMyCi0wMDAwMDAxYyAxZmJmODA0MAlmbGFnIDY0Ci0wMDAwMDAyMCAxZmJmODA4MAlmbGFnIDEyOAotMDAwMDAwMjQgMWZiZjAwMDAJZmxhZyAtMjE0NzQ4MzY0NwotMDAwMDAwMmMgMWZhMDAwMGIJZmxhZy5sdCByMAotMDAwMDAwMzAgMWZiZjAwMDkJZmxhZy5ndCAxCi0wMDAwMDAzOCAxZmJmMDAwOQlmbGFnLmd0IDIKLTAwMDAwMDQwIDFmYmYwMDA5CWZsYWcuZ3QgNAotMDAwMDAwNDggMWZiZjAwMDkJZmxhZy5ndCA4Ci0wMDAwMDA1MCAxZmJmMDAwOQlmbGFnLmd0IDE2Ci0wMDAwMDA1OCAxZmJmMDAwOQlmbGFnLmd0IDMyCi0wMDAwMDA2MCAxZmJmMDAwOQlmbGFnLmd0IDY0Ci0wMDAwMDA2OCAxZmJmMDAwOQlmbGFnLmd0IDEyOAotMDAwMDAwNzAgMWZiZjAwMGEJZmxhZy5nZSAtMjE0NzQ4MzY0NwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9mbGFnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNjdhYTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgZmxhZyB0ZXN0Ci0KLQlmbGFnCXIwCi0KLQlmbGFnCTEKLQlmbGFnCTIKLQlmbGFnCTQKLQlmbGFnCTgKLQlmbGFnCTE2Ci0JZmxhZwkzMgotCWZsYWcJNjQKLQlmbGFnCTEyOAotCi0JZmxhZwkweDgwMDAwMDAxCi0KLQlmbGFnLmx0CXIwCi0KLQlmbGFnLmd0CTEKLQlmbGFnLmd0CTIKLQlmbGFnLmd0CTQKLQlmbGFnLmd0CTgKLQlmbGFnLmd0CTE2Ci0JZmxhZy5ndAkzMgotCWZsYWcuZ3QJNjQKLQlmbGFnLmd0CTEyOAotCi0JZmxhZy5nZQkweDgwMDAwMDAxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvaW5zbjMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDIwN2E3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5kCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDE4MDBASTMrODBAMDAJQE9DQCByMCxyMQotMDAwMDAwMDQgMWI2ZUBJMyswMEAwMAlAT0NAIGZwLHNwCi0wMDAwMDAwOCAxODFmQEkzKzgwQDAwCUBPQ0AgcjAsMAotMDAwMDAwMGMgMTgzZkBJMys4MUBmZglAT0NAIHIxLC0xCi0wMDAwMDAxMCAxZmUxQEkzKzAwQDAwCUBPQ0AgMCxyMgotMDAwMDAwMTQgMWZlMUBJMys4MUBmZglAT0NAIC0xLHIzCi0wMDAwMDAxOCAxODlmQEkzKzgwQGZmCUBPQ0AgcjQsMjU1Ci0wMDAwMDAxYyAxZmUyQEkzKzgwQGZmCUBPQ0AgMjU1LHI1Ci0wMDAwMDAyMCAxOGRmQEkzKzgxQDAwCUBPQ0AgcjYsLTI1NgotMDAwMDAwMjQgMWZlM0BJMys4MUAwMAlAT0NAIC0yNTYscjcKLTAwMDAwMDI4IDE5MWZASTMrMDBAMDAJQE9DQCByOCwyNTYKLTAwMDAwMDMwIDE5M2ZASTMrMDBAMDAJQE9DQCByOSwtMjU3Ci0wMDAwMDAzOCAxZmM1QEkzKzAwQDAwCUBPQ0AgNTExLHIxMAotMDAwMDAwNDAgMTk3ZkBJMyswMEAwMAlAT0NAIHIxMSwxMTExNjM4NTk0Ci0wMDAwMDA0OCAxZmM2QEkzKzAwQDAwCUBPQ0AgMzA1NDE5ODk2LHIxMgotMDAwMDAwNTAgMWZmZkBJMyswMEBmZglAT0NAIDI1NSwyNTYKLTAwMDAwMDU4IDFmZGZASTMrODBAZmYJQE9DQCAyNTYsMjU1Ci0wMDAwMDA2MCAxODFmQEkzKzAwQDAwCUBPQ0AgcjAsMAotCQlSRUxPQzogMDAwMDAwNjQgUl9BUkNfMzIgZm9vCi0wMDAwMDA2OCAxOTQ1QEkzKzgwQDAxCUBPQ0AuZXEgcjEwLHIxMQotMDAwMDAwNmMgMTk4NkBJMys4MEAwMglAT0NALm5lIHIxMixyMTMKLTAwMDAwMDcwIDE5ZGZASTMrMDBAMGIJQE9DQC5sdCByMTQsMAotMDAwMDAwNzggMTlmZkBJMyswMEAwOQlAT0NALmd0IHIxNSw1MTIKLTAwMDAwMDgwIDE4MDBASTMrODFAMDAJQE9DQC5mIHIwLHIxCi0wMDAwMDA4NCAxODVlQEkzKzgwQDAxCUBPQ0AuZiByMiwxCi0wMDAwMDA4OCAxZmEyQEkzKzAwQDAwCUBPQ0AuZiAwLHI0Ci0wMDAwMDA4YyAxOGJmQEkzKzAxQDAwCUBPQ0AuZiByNSw1MTIKLTAwMDAwMDk0IDFmYzNASTMrMDFAMDAJQE9DQC5mIDUxMixyNgotMDAwMDAwOWMgMWZkZkBJMyswMUAwMAlAT0NALmYgNTEyLDUxMgotMDAwMDAwYTQgMTgwMEBJMys4MUAwMQlAT0NALmVxLmYgcjAscjEKLTAwMDAwMGE4IDE4M2ZASTMrMDFAMDIJQE9DQC5uZS5mIHIxLDAKLTAwMDAwMGIwIDFmYzFASTMrMDFAMGIJQE9DQC5sdC5mIDAscjIKLTAwMDAwMGI4IDFmYzFASTMrMDFAMDkJQE9DQC5ndC5mIDEscjIKLTAwMDAwMGMwIDE4MWZASTMrMDFAMGMJQE9DQC5sZS5mIHIwLDUxMgotMDAwMDAwYzggMWZjMUBJMyswMUAwYQlAT0NALmdlLmYgNTEyLHIyCi0wMDAwMDBkMCAxZmRmQEkzKzAxQDA0CUBPQ0Aubi5mIDUxMiw1MTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMmZiODguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIEluc24gMyBAT0NAIHRlc3QKLQotIyByZWcscmVnCi0JQE9DQCByMCxyMQotCUBPQ0AgZnAsc3AKLQotIyBzaGltbSB2YWx1ZXMKLQlAT0NAIHIwLDAKLQlAT0NAIHIxLC0xCi0JQE9DQCAwLHIyCi0JQE9DQCAtMSxyMwotCUBPQ0AgcjQsMjU1Ci0JQE9DQCAyNTUscjUKLQlAT0NAIHI2LC0yNTYKLQlAT0NAIC0yNTYscjcKLQotIyBsaW1tIHZhbHVlcwotCUBPQ0AgcjgsMjU2Ci0JQE9DQCByOSwtMjU3Ci0JQE9DQCA1MTEscjEwCi0JQE9DQCByMTEsMHg0MjQyNDI0MgotCUBPQ0AgMHgxMjM0NTY3OCxyMTIKLQotIyBzaGltbSBhbmQgbGltbQotCUBPQ0AgMjU1LDI1NgotCUBPQ0AgMjU2LDI1NQotCi0jIHN5bWJvbHMKLQlAT0NAIHIwLGZvbwotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotCUBPQ0AuZXEgcjEwLHIxMQotCUBPQ0AubmUgcjEyLHIxMwotCUBPQ0AubHQgcjE0LDAKLQlAT0NALmd0IHIxNSw1MTIKLQotIyBmbGFnIHNldHRpbmcKLQlAT0NALmYgcjAscjEKLQlAT0NALmYgcjIsMQotCUBPQ0AuZiAwLHI0Ci0JQE9DQC5mIHI1LDUxMgotCUBPQ0AuZiA1MTIscjYKLQlAT0NALmYgNTEyLDUxMgotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiArIGZsYWcgc2V0dGluZwotCUBPQ0AuZXEuZiByMCxyMQotCUBPQ0AubmUuZiByMSwwCi0JQE9DQC5sdC5mIDAscjIKLQlAT0NALmd0LmYgMSxyMgotCUBPQ0AubGUuZiByMCw1MTIKLQlAT0NALmdlLmYgNTEyLHIyCi0JQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ouZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9qLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMTAzZjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ouZAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBqCi0KLSMgVGVzdCB0aGUgaiBpbnNuLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCA8dGV4dF9sYWJlbD4gMzgwMDAwMDAJaiByMAotMDAwMDAwMDQgPHRleHRfbGFiZWxcKzQ+IDM4MDAwMDIwCWouZCByMAotMDAwMDAwMDggPHRleHRfbGFiZWxcKzg+IDM4MDAwMDQwCWouamQgcjAKLTAwMDAwMDBjIDx0ZXh0X2xhYmVsXCtjPiAzODAwMDAwMAlqIHIwCi0wMDAwMDAxMCA8dGV4dF9sYWJlbFwrMTA+IDM4MDA4MDAwCWogcjEKLTAwMDAwMDE0IDx0ZXh0X2xhYmVsXCsxND4gMzgwMDgwMjAJai5kIHIxCi0wMDAwMDAxOCA8dGV4dF9sYWJlbFwrMTg+IDM4MDA4MDQwCWouamQgcjEKLTAwMDAwMDFjIDx0ZXh0X2xhYmVsXCsxYz4gMzgwMDgwMDAJaiByMQotMDAwMDAwMjAgPHRleHRfbGFiZWxcKzIwPiAzODFmMDAwMAlqIDAKLQkJUkVMT0M6IDAwMDAwMDI0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDAyOCA8dGV4dF9sYWJlbFwrMjg+IDM4MWYwMDAwCWogMAotCQlSRUxPQzogMDAwMDAwMmMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDMwIDx0ZXh0X2xhYmVsXCszMD4gMzgxZjAwMDAJaiAwCi0JCVJFTE9DOiAwMDAwMDAzNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwMzggPHRleHRfbGFiZWxcKzM4PiAzODFmMDAwMQlqZXEgMAotCQlSRUxPQzogMDAwMDAwM2MgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDQwIDx0ZXh0X2xhYmVsXCs0MD4gMzgxZjAwMDEJamVxIDAKLQkJUkVMT0M6IDAwMDAwMDQ0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDA0OCA8dGV4dF9sYWJlbFwrNDg+IDM4MWYwMDAyCWpuZSAwCi0JCVJFTE9DOiAwMDAwMDA0YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwNTAgPHRleHRfbGFiZWxcKzUwPiAzODFmMDAwMglqbmUgMAotCQlSRUxPQzogMDAwMDAwNTQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDU4IDx0ZXh0X2xhYmVsXCs1OD4gMzgxZjAwMDMJanAgMAotCQlSRUxPQzogMDAwMDAwNWMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDYwIDx0ZXh0X2xhYmVsXCs2MD4gMzgxZjAwMDMJanAgMAotCQlSRUxPQzogMDAwMDAwNjQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDY4IDx0ZXh0X2xhYmVsXCs2OD4gMzgxZjAwMDQJam4gMAotCQlSRUxPQzogMDAwMDAwNmMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDcwIDx0ZXh0X2xhYmVsXCs3MD4gMzgxZjAwMDQJam4gMAotCQlSRUxPQzogMDAwMDAwNzQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDc4IDx0ZXh0X2xhYmVsXCs3OD4gMzgxZjAwMDUJamMgMAotCQlSRUxPQzogMDAwMDAwN2MgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDgwIDx0ZXh0X2xhYmVsXCs4MD4gMzgxZjAwMDUJamMgMAotCQlSRUxPQzogMDAwMDAwODQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDg4IDx0ZXh0X2xhYmVsXCs4OD4gMzgxZjAwMDUJamMgMAotCQlSRUxPQzogMDAwMDAwOGMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDkwIDx0ZXh0X2xhYmVsXCs5MD4gMzgxZjAwMDYJam5jIDAKLQkJUkVMT0M6IDAwMDAwMDk0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDA5OCA8dGV4dF9sYWJlbFwrOTg+IDM4MWYwMDA2CWpuYyAwCi0JCVJFTE9DOiAwMDAwMDA5YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwYTAgPHRleHRfbGFiZWxcK2EwPiAzODFmMDAwNglqbmMgMAotCQlSRUxPQzogMDAwMDAwYTQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGE4IDx0ZXh0X2xhYmVsXCthOD4gMzgxZjAwMDcJanYgMAotCQlSRUxPQzogMDAwMDAwYWMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGIwIDx0ZXh0X2xhYmVsXCtiMD4gMzgxZjAwMDcJanYgMAotCQlSRUxPQzogMDAwMDAwYjQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGI4IDx0ZXh0X2xhYmVsXCtiOD4gMzgxZjAwMDgJam52IDAKLQkJUkVMT0M6IDAwMDAwMGJjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBjMCA8dGV4dF9sYWJlbFwrYzA+IDM4MWYwMDA4CWpudiAwCi0JCVJFTE9DOiAwMDAwMDBjNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwYzggPHRleHRfbGFiZWxcK2M4PiAzODFmMDAwOQlqZ3QgMAotCQlSRUxPQzogMDAwMDAwY2MgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGQwIDx0ZXh0X2xhYmVsXCtkMD4gMzgxZjAwMGEJamdlIDAKLQkJUkVMT0M6IDAwMDAwMGQ0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBkOCA8dGV4dF9sYWJlbFwrZDg+IDM4MWYwMDBiCWpsdCAwCi0JCVJFTE9DOiAwMDAwMDBkYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwZTAgPHRleHRfbGFiZWxcK2UwPiAzODFmMDAwYwlqbGUgMAotCQlSRUxPQzogMDAwMDAwZTQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGU4IDx0ZXh0X2xhYmVsXCtlOD4gMzgxZjAwMGQJamhpIDAKLQkJUkVMT0M6IDAwMDAwMGVjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBmMCA8dGV4dF9sYWJlbFwrZjA+IDM4MWYwMDBlCWpscyAwCi0JCVJFTE9DOiAwMDAwMDBmNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwZjggPHRleHRfbGFiZWxcK2Y4PiAzODFmMDAwZglqcG56IDAKLQkJUkVMT0M6IDAwMDAwMGZjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDEwMCA8dGV4dF9sYWJlbFwrMTAwPiAzODFmMDAwMAlqIDAKLQkJUkVMT0M6IDAwMDAwMTA0IFJfQVJDXzMyIGV4dGVybmFsX3RleHRfbGFiZWwKLTAwMDAwMTA4IDx0ZXh0X2xhYmVsXCsxMDg+IDM4MWYwMDAwCWogMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2oucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9qLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjFhZjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2oucworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMgaiB0ZXN0Ci0JCi10ZXh0X2xhYmVsOgkKLQlqCXIwCi0Jai5kCXIwCi0Jai5qZAlyMAotCWoubmQJcjAKLQotCWouZglbcjFdCi0Jai5kLmYJW3IxXQotCWouamQuZglbcjFdCi0Jai5uZC5mCVtyMV0KLQotCWoJdGV4dF9sYWJlbAotCWphbAl0ZXh0X2xhYmVsCi0JanJhCXRleHRfbGFiZWwKLQlqZXEJdGV4dF9sYWJlbAotCWp6CXRleHRfbGFiZWwKLQlqbmUJdGV4dF9sYWJlbAotCWpuegl0ZXh0X2xhYmVsCi0JanBsCXRleHRfbGFiZWwKLQlqcAl0ZXh0X2xhYmVsCi0Jam1pCXRleHRfbGFiZWwKLQlqbgl0ZXh0X2xhYmVsCi0JamNzCXRleHRfbGFiZWwKLQlqYwl0ZXh0X2xhYmVsCi0JamxvCXRleHRfbGFiZWwKLQlqY2MJdGV4dF9sYWJlbAotCWpuYwl0ZXh0X2xhYmVsCi0JamhzCXRleHRfbGFiZWwKLQlqdnMJdGV4dF9sYWJlbAotCWp2CXRleHRfbGFiZWwKLQlqdmMJdGV4dF9sYWJlbAotCWpudgl0ZXh0X2xhYmVsCi0Jamd0CXRleHRfbGFiZWwKLQlqZ2UJdGV4dF9sYWJlbAotCWpsdAl0ZXh0X2xhYmVsCi0JamxlCXRleHRfbGFiZWwKLQlqaGkJdGV4dF9sYWJlbAotCWpscwl0ZXh0X2xhYmVsCi0JanBuegl0ZXh0X2xhYmVsCi0KLQlqCWV4dGVybmFsX3RleHRfbGFiZWwKLQotCWoJMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkZDBhMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQuZAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBsZC9scgotCi0jIFRlc3QgdGhlIGxkL2xyIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDA4MDA4MDAwCWxkIHIwLFxbcjFcXQotMDAwMDAwMDQgMDA0MTg4MDAJbGQgcjIsXFtyMyxyNFxdCi0wMDAwMDAwOCAwOGEzMDAwMQlsZCByNSxcW3I2LDFcXQotMDAwMDAwMGMgMDhlNDAxZmYJbGQgcjcsXFtyOCwtMVxdCi0wMDAwMDAxMCAwOTI1MDBmZglsZCByOSxcW3IxMCwyNTVcXQotMDAwMDAwMTQgMDk2NjAxMDAJbGQgcjExLFxbcjEyLC0yNTZcXQotMDAwMDAwMTggMDFhNzdjMDAJbGQgcjEzLFxbcjE0LDI1NlxdCi0wMDAwMDAyMCAwMWU4N2MwMAlsZCByMTUsXFtyMTYsLTI1N1xdCi0wMDAwMDAyOCAwMjNmMzgwMAlsZCByMTcsXFszMDU0MTk4OTYsc3BcXQotMDAwMDAwMzAgMGE3ZjAwMDAJbGQgcjE5LFxbMFxdCi0JCVJFTE9DOiAwMDAwMDAzNCBSX0FSQ18zMiBmb28KLTAwMDAwMDM4IDBhOWYwMDAwCWxkIHIyMCxcWzRcXQotCQlSRUxPQzogMDAwMDAwM2MgUl9BUkNfMzIgZm9vCi0wMDAwMDA0MCAwODFmODQwMAlsZGIgcjAsXFswXF0KLTAwMDAwMDQ0IDA4MWY4ODAwCWxkdyByMCxcWzBcXQotMDAwMDAwNDggMDgxZjgyMDAJbGQueCByMCxcWzBcXQotMDAwMDAwNGMgMDgxZjkwMDAJbGQuYSByMCxcWzBcXQotMDAwMDAwNTAgMDgxZmMwMDAJbGQuZGkgcjAsXFswXF0KLTAwMDAwMDU0IDA4MDA1NjAwCWxkYi54LmEuZGkgcjAsXFtyMFxdCi0wMDAwMDA1OCAwODAwYTAwMAlsciByMCxcW3IxXF0KLTAwMDAwMDVjIDA4NWZhMDAwCWxyIHIyLFxbc3RhdHVzXF0KLTAwMDAwMDYwIDA4N2YyMDAwCWxyIHIzLFxbMzA1NDE5ODk2XF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9sZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjY3MTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIGxkL2xyIHRlc3QKLQkKLQlsZAlyMCxbcjFdCi0JbGQJcjIsW3IzLHI0XQotCWxkCXI1LFtyNiwxXQotCWxkCXI3LFtyOCwtMV0KLQlsZAlyOSxbcjEwLDI1NV0KLQlsZAlyMTEsW3IxMiwtMjU2XQotCWxkCXIxMyxbcjE0LDI1Nl0KLQlsZAlyMTUsW3IxNiwtMjU3XQotCWxkCXIxNyxbMHgxMjM0NTY3OCxyMjhdCi0JbGQJcjE5LFtmb29dCi0JbGQJcjIwLFtmb28rNF0KLQotCWxkYglyMCxbMF0KLQlsZHcJcjAsWzBdCi0JbGQueAlyMCxbMF0KLQlsZC5hCXIwLFswXQotCWxkLmRpCXIwLFswXQotCWxkYi54LmEuZGkgcjAsW3IwXQotCi0JbHIJcjAsW3IxXQotCWxyCXIyLFtzdGF0dXNdCi0JbHIJcjMsWzB4MTIzNDU2NzhdCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL21hdGguZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiNzljNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5kCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIEBJQyswQDAwODQwMAlAT0NAIHIwLHIxLHIyCi0wMDAwMDAwNCBASUMrM0A0ZGI4MDAJQE9DQCByMjYsZnAsc3AKLTAwMDAwMDA4IEBJQyszQGFmM2UwMAlAT0NAIGlsaW5rMSxpbGluazIsYmxpbmsKLTAwMDAwMDBjIEBJQys3QDVkZjgwMAlAT0NAIHI1OCxyNTksbHBfY291bnQKLTAwMDAwMDEwIEBJQyswQDAwZmUwMAlAT0NAIHIwLHIxLDAKLTAwMDAwMDE0IEBJQyswQDFmODQwMAlAT0NAIHIwLDAscjIKLTAwMDAwMDE4IEBJQys3QGUwODQwMAlAT0NAIDAscjEscjIKLTAwMDAwMDFjIEBJQyswQDAwZmZmZglAT0NAIHIwLHIxLC0xCi0wMDAwMDAyMCBASUMrMEAxZjg1ZmYJQE9DQCByMCwtMSxyMgotMDAwMDAwMjQgQElDKzdAZTA4NWZmCUBPQ0AgLTEscjEscjIKLTAwMDAwMDI4IEBJQyswQDAwZmVmZglAT0NAIHIwLHIxLDI1NQotMDAwMDAwMmMgQElDKzBAMWY4NGZmCUBPQ0AgcjAsMjU1LHIyCi0wMDAwMDAzMCBASUMrN0BlMDg0ZmYJQE9DQCAyNTUscjEscjIKLTAwMDAwMDM0IEBJQyswQDAwZmYwMAlAT0NAIHIwLHIxLC0yNTYKLTAwMDAwMDM4IEBJQyswQDFmODUwMAlAT0NAIHIwLC0yNTYscjIKLTAwMDAwMDNjIEBJQys3QGUwODUwMAlAT0NAIC0yNTYscjEscjIKLTAwMDAwMDQwIEBJQyswQDAwZmMwMAlAT0NAIHIwLHIxLDI1NgotMDAwMDAwNDggQElDKzBAMWYwNDAwCUBPQ0AgcjAsLTI1NyxyMgotMDAwMDAwNTAgQElDKzdAYzA4NDAwCUBPQ0AgNTExLHIxLHIyCi0wMDAwMDA1OCBASUMrMEAxZjA0MDAJQE9DQCByMCwxMTExNjM4NTk0LHIyCi0wMDAwMDA2MCBASUMrN0BjMGZjMDAJQE9DQCAzMDU0MTk4OTYscjEsMzA1NDE5ODk2Ci0wMDAwMDA2OCBASUMrMEAxZmZjZmYJQE9DQCByMCwyNTUsMjU2Ci0wMDAwMDA3MCBASUMrMEAxZjdlZmYJQE9DQCByMCwyNTYsMjU1Ci0wMDAwMDA3OCBASUMrN0BlMGZjZmYJQE9DQCAyNTUscjEsMjU2Ci0wMDAwMDA4MCBASUMrN0BmZjA0ZmYJQE9DQCAyNTUsMjU2LHIyCi0wMDAwMDA4OCBASUMrN0BjMGZlZmYJQE9DQCAyNTYscjEsMjU1Ci0wMDAwMDA5MCBASUMrN0BkZjg0ZmYJQE9DQCAyNTYsMjU1LHIyCi0wMDAwMDA5OCBASUMrMEAwMGZjMDAJQE9DQCByMCxyMSwwCi0JCVJFTE9DOiAwMDAwMDA5YyBSX0FSQ18zMiBmb28KLTAwMDAwMGEwIEBJQyswQDAwODQwMAlAT0NAIHIwLHIxLHIyCi0wMDAwMDBhNCBASUMrMEA2MjBhMDAJQE9DQCByMyxyNCxyNQotMDAwMDAwYTggQElDKzBAYzM5MDAxCUBPQ0AuZXEgcjYscjcscjgKLTAwMDAwMGFjIEBJQysxQDI1MTYwMQlAT0NALmVxIHI5LHIxMCxyMTEKLTAwMDAwMGIwIEBJQysxQDg2OWMwMglAT0NALm5lIHIxMixyMTMscjE0Ci0wMDAwMDBiNCBASUMrMUBlODIyMDIJQE9DQC5uZSByMTUscjE2LHIxNwotMDAwMDAwYjggQElDKzJANDlhODAzCUBPQ0AucCByMTgscjE5LHIyMAotMDAwMDAwYmMgQElDKzJAYWIyZTAzCUBPQ0AucCByMjEscjIyLHIyMwotMDAwMDAwYzAgQElDKzNAMGNiNDA0CUBPQ0AubiByMjQscjI1LHIyNgotMDAwMDAwYzQgQElDKzNANmUzYTA0CUBPQ0AubiBmcCxzcCxpbGluazEKLTAwMDAwMGM4IEBJQyszQGNmYzAwNQlAT0NALmMgaWxpbmsyLGJsaW5rLHIzMgotMDAwMDAwY2MgQElDKzRAMzE0NjA1CUBPQ0AuYyByMzMscjM0LHIzNQotMDAwMDAwZDAgQElDKzRAOTJjYzA1CUBPQ0AuYyByMzYscjM3LHIzOAotMDAwMDAwZDQgQElDKzRAZjQ1MjA2CUBPQ0AubmMgcjM5LHI0MCxyNDEKLTAwMDAwMGQ4IEBJQys1QDU1ZDgwNglAT0NALm5jIHI0MixyNDMscjQ0Ci0wMDAwMDBkYyBASUMrNUBiNzVlMDYJQE9DQC5uYyByNDUscjQ2LHI0NwotMDAwMDAwZTAgQElDKzZAMThlNDA3CUBPQ0AudiByNDgscjQ5LHI1MAotMDAwMDAwZTQgQElDKzZAN2E2YTA3CUBPQ0AudiByNTEscjUyLHI1MwotMDAwMDAwZTggQElDKzZAZGJmMDA4CUBPQ0AubnYgcjU0LHI1NSxyNTYKLTAwMDAwMGVjIEBJQys3QDNkNzYwOAlAT0NALm52IHI1NyxyNTgscjU5Ci0wMDAwMDBmMCBASUMrN0A5ZTAwMDkJQE9DQC5ndCBscF9jb3VudCxscF9jb3VudCxyMAotMDAwMDAwZjQgQElDKzBAMDA3YzBhCUBPQ0AuZ2UgcjAscjAsMAotMDAwMDAwZmMgQElDKzBAM2YwMjBiCUBPQ0AubHQgcjEsMSxyMQotMDAwMDAxMDQgQElDKzdAYzA4NDBjCUBPQ0AubGUgMixyMSxyMgotMDAwMDAxMGMgQElDKzBAN2YwNjBkCUBPQ0AuaGkgcjMsMyxyMwotMDAwMDAxMTQgQElDKzdAZGYwODBlCUBPQ0AubHMgNCw0LHI0Ci0wMDAwMDExYyBASUMrN0BjMmZjMGYJQE9DQC5wbnogNSxyNSw1Ci0wMDAwMDEyNCBASUMrMEAwMDg1MDAJQE9DQC5mIHIwLHIxLHIyCi0wMDAwMDEyOCBASUMrMEAwMGZhMDEJQE9DQC5mIHIwLHIxLDEKLTAwMDAwMTJjIEBJQyswQDFlODQwMQlAT0NALmYgcjAsMSxyMgotMDAwMDAxMzAgQElDKzdAYTA4NDAwCUBPQ0AuZiAwLHIxLHIyCi0wMDAwMDEzNCBASUMrMEAwMGZkMDAJQE9DQC5mIHIwLHIxLDUxMgotMDAwMDAxM2MgQElDKzBAMWYwNTAwCUBPQ0AuZiByMCw1MTIscjIKLTAwMDAwMTQ0IEBJQys3QGMwODUwMAlAT0NALmYgNTEyLHIxLHIyCi0wMDAwMDE0YyBASUMrMEAwMDg1MDEJQE9DQC5lcS5mIHIwLHIxLHIyCi0wMDAwMDE1MCBASUMrMEAwMGZkMDIJQE9DQC5uZS5mIHIwLHIxLDAKLTAwMDAwMTU4IEBJQyswQDFmMDUwYglAT0NALmx0LmYgcjAsMCxyMgotMDAwMDAxNjAgQElDKzdAYzA4NTA5CUBPQ0AuZ3QuZiAwLHIxLHIyCi0wMDAwMDE2OCBASUMrMEAwMGZkMGMJQE9DQC5sZS5mIHIwLHIxLDUxMgotMDAwMDAxNzAgQElDKzBAMWYwNTBhCUBPQ0AuZ2UuZiByMCw1MTIscjIKLTAwMDAwMTc4IEBJQys3QGMwODUwNAlAT0NALm4uZiA1MTIscjEscjIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzUxNjlhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jIEBPQ0AgdGVzdAotCi0jIFN0YXkgYXdheSBmcm9tIG9wZXJhbmRzIHdpdGggZHVwbGljYXRlIGFyZ3VtZW50cyAoZWc6CWFkZCByMCxyMSxyMSkuCi0jIFRoZXkgd2lsbCBiZSBkaXNhc3NlbWJsZWQgYXMgdGhleSdyZSBtYWNybyBjb3VudGVycGFydHMgKGVnOiBhc2wgcjAscjEpLgotCi0jIHJlZyxyZWcscmVnCi0JQE9DQCByMCxyMSxyMgotCUBPQ0AgcjI2LGZwLHNwCi0JQE9DQCBpbGluazEsaWxpbmsyLGJsaW5rCi0JQE9DQCByNTgscjU5LGxwX2NvdW50Ci0KLSMgc2hpbW0gdmFsdWVzCi0JQE9DQCByMCxyMSwwCi0JQE9DQCByMCwwLHIyCi0JQE9DQCAwLHIxLHIyCi0JQE9DQCByMCxyMSwtMQotCUBPQ0AgcjAsLTEscjIKLQlAT0NAIC0xLHIxLHIyCi0JQE9DQCByMCxyMSwyNTUKLQlAT0NAIHIwLDI1NSxyMgotCUBPQ0AgMjU1LHIxLHIyCi0JQE9DQCByMCxyMSwtMjU2Ci0JQE9DQCByMCwtMjU2LHIyCi0JQE9DQCAtMjU2LHIxLHIyCi0KLSMgbGltbSB2YWx1ZXMKLQlAT0NAIHIwLHIxLDI1NgotCUBPQ0AgcjAsLTI1NyxyMgotCUBPQ0AgNTExLHIxLHIyCi0JQE9DQCByMCwweDQyNDI0MjQyLHIyCi0JQE9DQCAweDEyMzQ1Njc4LHIxLDB4MTIzNDU2NzgKLQotIyBzaGltbSBhbmQgbGltbQotCUBPQ0AgcjAsMjU1LDI1NgotCUBPQ0AgcjAsMjU2LDI1NQotCUBPQ0AgMjU1LHIxLDI1NgotCUBPQ0AgMjU1LDI1NixyMgotCUBPQ0AgMjU2LHIxLDI1NQotCUBPQ0AgMjU2LDI1NSxyMgotCi0jIHN5bWJvbHMKLQlAT0NAIHIwLHIxLGZvbwotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotCUBPQ0AuYWwgcjAscjEscjIKLQlAT0NALnJhIHIzLHI0LHI1Ci0JQE9DQC5lcSByNixyNyxyOAotCUBPQ0AueiByOSxyMTAscjExCi0JQE9DQC5uZSByMTIscjEzLHIxNAotCUBPQ0AubnogcjE1LHIxNixyMTcKLQlAT0NALnBsIHIxOCxyMTkscjIwCi0JQE9DQC5wIHIyMSxyMjIscjIzCi0JQE9DQC5taSByMjQscjI1LHIyNgotCUBPQ0AubiByMjcscjI4LHIyOQotCUBPQ0AuY3MgcjMwLHIzMSxyMzIKLQlAT0NALmMgcjMzLHIzNCxyMzUKLQlAT0NALmxvIHIzNixyMzcscjM4Ci0JQE9DQC5jYyByMzkscjQwLHI0MQotCUBPQ0AubmMgcjQyLHI0MyxyNDQKLQlAT0NALmhzIHI0NSxyNDYscjQ3Ci0JQE9DQC52cyByNDgscjQ5LHI1MAotCUBPQ0AudiByNTEscjUyLHI1MwotCUBPQ0AudmMgcjU0LHI1NSxyNTYKLQlAT0NALm52IHI1NyxyNTgscjU5Ci0JQE9DQC5ndCByNjAscjYwLHIwCi0JQE9DQC5nZSByMCxyMCwwCi0JQE9DQC5sdCByMSwxLHIxCi0JQE9DQC5sZSAyLHIxLHIyCi0JQE9DQC5oaSByMywzLHIzCi0JQE9DQC5scyA0LDQscjQKLQlAT0NALnBueiA1LHI1LDUKLQotIyBmbGFnIHNldHRpbmcKLQlAT0NALmYgcjAscjEscjIKLQlAT0NALmYgcjAscjEsMQotCUBPQ0AuZiByMCwxLHIyCi0JQE9DQC5mIDAscjEscjIKLQlAT0NALmYgcjAscjEsNTEyCi0JQE9DQC5mIHIwLDUxMixyMgotCUBPQ0AuZiA1MTIscjEscjIKLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24gKyBmbGFnIHNldHRpbmcKLQlAT0NALmVxLmYgcjAscjEscjIKLQlAT0NALm5lLmYgcjAscjEsMAotCUBPQ0AubHQuZiByMCwwLHIyCi0JQE9DQC5ndC5mIDAscjEscjIKLQlAT0NALmxlLmYgcjAscjEsNTEyCi0JQE9DQC5nZS5mIHIwLDUxMixyMgotCUBPQ0Aubi5mIDUxMixyMSxyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDIwN2E3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zc2hpZnQuZAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBAT0NACi0KLSMgVGVzdCB0aGUgQE9DQCBpbnNuLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCAxODAwQEkzKzgwQDAwCUBPQ0AgcjAscjEKLTAwMDAwMDA0IDFiNmVASTMrMDBAMDAJQE9DQCBmcCxzcAotMDAwMDAwMDggMTgxZkBJMys4MEAwMAlAT0NAIHIwLDAKLTAwMDAwMDBjIDE4M2ZASTMrODFAZmYJQE9DQCByMSwtMQotMDAwMDAwMTAgMWZlMUBJMyswMEAwMAlAT0NAIDAscjIKLTAwMDAwMDE0IDFmZTFASTMrODFAZmYJQE9DQCAtMSxyMwotMDAwMDAwMTggMTg5ZkBJMys4MEBmZglAT0NAIHI0LDI1NQotMDAwMDAwMWMgMWZlMkBJMys4MEBmZglAT0NAIDI1NSxyNQotMDAwMDAwMjAgMThkZkBJMys4MUAwMAlAT0NAIHI2LC0yNTYKLTAwMDAwMDI0IDFmZTNASTMrODFAMDAJQE9DQCAtMjU2LHI3Ci0wMDAwMDAyOCAxOTFmQEkzKzAwQDAwCUBPQ0AgcjgsMjU2Ci0wMDAwMDAzMCAxOTNmQEkzKzAwQDAwCUBPQ0AgcjksLTI1NwotMDAwMDAwMzggMWZjNUBJMyswMEAwMAlAT0NAIDUxMSxyMTAKLTAwMDAwMDQwIDE5N2ZASTMrMDBAMDAJQE9DQCByMTEsMTExMTYzODU5NAotMDAwMDAwNDggMWZjNkBJMyswMEAwMAlAT0NAIDMwNTQxOTg5NixyMTIKLTAwMDAwMDUwIDFmZmZASTMrMDBAZmYJQE9DQCAyNTUsMjU2Ci0wMDAwMDA1OCAxZmRmQEkzKzgwQGZmCUBPQ0AgMjU2LDI1NQotMDAwMDAwNjAgMTgxZkBJMyswMEAwMAlAT0NAIHIwLDAKLQkJUkVMT0M6IDAwMDAwMDY0IFJfQVJDXzMyIGZvbwotMDAwMDAwNjggMTk0NUBJMys4MEAwMQlAT0NALmVxIHIxMCxyMTEKLTAwMDAwMDZjIDE5ODZASTMrODBAMDIJQE9DQC5uZSByMTIscjEzCi0wMDAwMDA3MCAxOWRmQEkzKzAwQDBiCUBPQ0AubHQgcjE0LDAKLTAwMDAwMDc4IDE5ZmZASTMrMDBAMDkJQE9DQC5ndCByMTUsNTEyCi0wMDAwMDA4MCAxODAwQEkzKzgxQDAwCUBPQ0AuZiByMCxyMQotMDAwMDAwODQgMTg1ZUBJMys4MEAwMQlAT0NALmYgcjIsMQotMDAwMDAwODggMWZhMkBJMyswMEAwMAlAT0NALmYgMCxyNAotMDAwMDAwOGMgMThiZkBJMyswMUAwMAlAT0NALmYgcjUsNTEyCi0wMDAwMDA5NCAxZmMzQEkzKzAxQDAwCUBPQ0AuZiA1MTIscjYKLTAwMDAwMDljIDFmZGZASTMrMDFAMDAJQE9DQC5mIDUxMiw1MTIKLTAwMDAwMGE0IDE4MDBASTMrODFAMDEJQE9DQC5lcS5mIHIwLHIxCi0wMDAwMDBhOCAxODNmQEkzKzAxQDAyCUBPQ0AubmUuZiByMSwwCi0wMDAwMDBiMCAxZmMxQEkzKzAxQDBiCUBPQ0AubHQuZiAwLHIyCi0wMDAwMDBiOCAxZmMxQEkzKzAxQDA5CUBPQ0AuZ3QuZiAxLHIyCi0wMDAwMDBjMCAxODFmQEkzKzAxQDBjCUBPQ0AubGUuZiByMCw1MTIKLTAwMDAwMGM4IDFmYzFASTMrMDFAMGEJQE9DQC5nZS5mIDUxMixyMgotMDAwMDAwZDAgMWZkZkBJMyswMUAwNAlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZmE2NjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyBTaW5nbGUgc2hpZnQgQE9DQCB0ZXN0Ci0KLSMgcmVnLHJlZwotCUBPQ0AgcjAscjEKLQlAT0NAIGZwLHNwCi0KLSMgc2hpbW0gdmFsdWVzCi0JQE9DQCByMCwwCi0JQE9DQCByMSwtMQotCUBPQ0AgMCxyMgotCUBPQ0AgLTEscjMKLQlAT0NAIHI0LDI1NQotCUBPQ0AgMjU1LHI1Ci0JQE9DQCByNiwtMjU2Ci0JQE9DQCAtMjU2LHI3Ci0KLSMgbGltbSB2YWx1ZXMKLQlAT0NAIHI4LDI1NgotCUBPQ0AgcjksLTI1NwotCUBPQ0AgNTExLHIxMAotCUBPQ0AgcjExLDB4NDI0MjQyNDIKLQlAT0NAIDB4MTIzNDU2NzgscjEyCi0KLSMgc2hpbW0gYW5kIGxpbW0KLQlAT0NAIDI1NSwyNTYKLQlAT0NAIDI1NiwyNTUKLQotIyBzeW1ib2xzCi0JQE9DQCByMCxmb28KLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24KLQlAT0NALmVxIHIxMCxyMTEKLQlAT0NALm5lIHIxMixyMTMKLQlAT0NALmx0IHIxNCwwCi0JQE9DQC5ndCByMTUsNTEyCi0KLSMgZmxhZyBzZXR0aW5nCi0JQE9DQC5mIHIwLHIxCi0JQE9DQC5mIHIyLDEKLQlAT0NALmYgMCxyNAotCUBPQ0AuZiByNSw1MTIKLQlAT0NALmYgNTEyLHI2Ci0JQE9DQC5mIDUxMiw1MTIKLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24gKyBmbGFnIHNldHRpbmcKLQlAT0NALmVxLmYgcjAscjEKLQlAT0NALm5lLmYgcjEsMAotCUBPQ0AubHQuZiAwLHIyCi0JQE9DQC5ndC5mIDEscjIKLQlAT0NALmxlLmYgcjAsNTEyCi0JQE9DQC5nZS5mIDUxMixyMgotCUBPQ0Aubi5mIDUxMiw1MTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYTk5YTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3Qvc3IKLQotIyBUZXN0IHRoZSBzdC9zciBpbnNuLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCAxMDAwODAwMAlzdCByMCxcW3IxXF0KLTAwMDAwMDA0IDEwMDMwYTAxCXN0IHI1LFxbcjYsMVxdCi0wMDAwMDAwOCAxMDA0MGZmZglzdCByNyxcW3I4LC0xXF0KLTAwMDAwMDBjIDEwMDUxMmZmCXN0IHI5LFxbcjEwLDI1NVxdCi0wMDAwMDAxMCAxMDA2MTcwMAlzdCByMTEsXFtyMTIsLTI1NlxdCi0wMDAwMDAxNCAxMDFmMjYwMAlzdCByMTksXFswXF0KLQkJUkVMT0M6IDAwMDAwMDE4IFJfQVJDXzMyIGZvbwotMDAwMDAwMWMgMTAxZjI4MDAJc3QgcjIwLFxbNFxdCi0JCVJFTE9DOiAwMDAwMDAyMCBSX0FSQ18zMiBmb28KLTAwMDAwMDI0IDEwNWYwMDAwCXN0YiByMCxcWzBcXQotMDAwMDAwMmMgMTA5ZjAwMDAJc3R3IHIwLFxbMFxdCi0wMDAwMDAzNCAxMTFmMDAwMAlzdC5hIHIwLFxbMFxdCi0wMDAwMDAzYyAxNDFmMDAwMAlzdC5kaSByMCxcWzBcXQotMDAwMDAwNDQgMTU0MDAwMDAJc3RiLmEuZGkgcjAsXFtyMFxdCi0wMDAwMDA0OCAxMjAwODAwMAlzciByMCxcW3IxXF0KLTAwMDAwMDRjIDEyMWY4NDAwCXNyIHIyLFxbc3RhdHVzXF0KLTAwMDAwMDUwIDEyMWYwNjAwCXNyIHIzLFxbMzA1NDE5ODk2XF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYWYxOTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIHN0L3NyIHRlc3QKLQkKLQlzdAlyMCxbcjFdCi0Jc3QJcjUsW3I2LDFdCi0Jc3QJcjcsW3I4LC0xXQotCXN0CXI5LFtyMTAsMjU1XQotCXN0CXIxMSxbcjEyLC0yNTZdCi0Jc3QJcjE5LFtmb29dCi0Jc3QJcjIwLFtmb28rNF0KLQotCXN0YglyMCxbMF0KLQlzdHcJcjAsWzBdCi0Jc3QuYQlyMCxbMF0KLQlzdC5kaQlyMCxbMF0KLQlzdGIuYS5kaSByMCxbcjBdCi0KLQlzcglyMCxbcjFdCi0Jc3IJcjIsW3N0YXR1c10KLQlzcglyMyxbMHgxMjM0NTY3OF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmZjEyNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvd2Fybi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIFRlc3QgYXNzZW1ibGVyIHdhcm5pbmdzLgotCi1pZiBbaXN0YXJnZXQgYXJjKi0qLSpdIHsKLQotICAgIGxvYWRfbGliIGdhcy1kZy5leHAKLQotICAgIGRnLWluaXQKLQotICAgIGRnLXJ1bnRlc3QgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci93YXJuKi5zXV0gIiIgIiIKLQotICAgIGRnLWZpbmlzaAotCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvd2Fybi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3dhcm4ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjYjQzNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvd2Fybi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotOyBUZXN0IEFSQyBzcGVjaWZpYyBhc3NlbWJsZXIgd2FybmluZ3MKLTsKLTsgeyBkZy1kbyBhc3NlbWJsZSB7IHRhcmdldCBhcmMtKi0qIH0gfQotCi0JYi5kIGZvbwotCW1vdiByMCwyNTYJOyB7IGRnLXdhcm5pbmcgIjggYnl0ZSBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IiAiOCBieXRlIGluc24gaW4gZGVsYXkgc2xvdCIgfQotCi0Jai5kIGZvbwkJOyB7IGRnLXdhcm5pbmcgIjggYnl0ZSBqdW1wIGluc3RydWN0aW9uIHdpdGggZGVsYXkgc2xvdCIgIjggYnl0ZSBqdW1wIHdpdGggZGVsYXkgc2xvdCIgfQotCW1vdiByMCxyMQotCi0Jc3ViLmYgMCxyMCxyMgotCWJlcSBmb28JCTsgeyBkZy13YXJuaW5nICJjb25kaXRpb25hbCBicmFuY2ggZm9sbG93cyBzZXQgb2YgZmxhZ3MiICJjYyBzZXQvYnJhbmNoIG5vcCB0ZXN0IiB9Ci0KLWZvbzoKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcmNoNHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcmNoNHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyOGY3Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJjaDR0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0udGV4dAotLmFsaWduIDAKLQkKLQlieAlyMAotCWJ4ZXEJcjEKLQotZm9vOgkKLQlsZHJoCXIzLCBmb28KLQlsZHJzaAlyNCwgW3I1XQotCWxkcnNiCXI0LCBbcjEsIHIzXQotCWxkcnNoCXIxLCBbcjQsIHI0XSEKLQlsZHJlcXNiCXIxLCBbcjUsIC1yM10KLQlsZHJuZWgJcjIsIFtyNl0sIHI3Ci0JbGRyY2NzaCByMiwgW3I3XSwgK3I4Ci0JbGRyc2IJcjIsIFtyMywgIzI1NV0KLQlsZHJzaAlyMSwgW3I0LCAjLTI1MF0KLQlsZHJzYglyMSwgW3I1LCAjKzI0MF0KLQotCXN0cmgJcjIsIGJhcgotCXN0cm5laAlyMywgW3IzXQotYmFyOgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxYzU0ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMKLSMgU29tZSBBUk0gdGVzdHMKLSMKLWlmIFtpc3RhcmdldCBhcm0tKi0qXSB0aGVuIHsKLSAgICBydW5fZHVtcF90ZXN0ICJpbnN0IgotCi0gICAgZ2FzX3Rlc3QgImFybTMucyIgIiIgJHN0ZG9wdGxpc3QgIkFybSAzIGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJhcm02LnMiICIiICRzdGRvcHRsaXN0ICJBcm0gNiBpbnN0cnVjdGlvbnMiCi0KLSAgICBnYXNfdGVzdCAiYXJtN2RtLnMiICIiICRzdGRvcHRsaXN0ICJBcm0gN0RNIGluc3RydWN0aW9ucyIKLQotICAgIHJ1bl9kdW1wX3Rlc3QgImFybTd0IgotCi0gICAgZ2FzX3Rlc3QgInRodW1iLnMiICIiICRzdGRvcHRsaXN0ICJUaHVtYiBpbnN0cnVjdGlvbnMiCi0KLSAgICBnYXNfdGVzdCAiYXJjaDR0LnMiICIiICRzdGRvcHRsaXN0ICJBcm0gYXJjaGl0ZWN0dXJlIDR0IGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJjb3Byby5zIiAiIiAkc3Rkb3B0bGlzdCAiQ28gcHJvY2Vzc29yIGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJpbW1lZC5zIiAiIiAkc3Rkb3B0bGlzdCAiaW1tZWRpYXRlIGV4cHJlc3Npb25zIgotCi0gICAgZ2FzX3Rlc3QgImZsb2F0LnMiICIiICRzdGRvcHRsaXN0ICJDb3JlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyIKLX0KLQotIyBOb3QgYWxsIGFybSB0YXJnZXRzIGFyZSBiaS1lbmRpYW4sIHNvIG9ubHkgcnVuIHRoaXMgdGVzdCBvbiBvbmVzCi0jIHdlIGtub3cgdGhhdCBhcmUuICBGSVhNRTogV2Ugc2hvdWxkIHByb2JhYmx5IGFsc28ga2V5IG9mZiBhcm1lYi9hcm1lbC4KLQotaWYgW2lzdGFyZ2V0IGFybS0qLXBlXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCAibGUtZnBjb25zdCIKLQotICAgICMgU2luY2UgYmlnLWVuZGlhbiBudW1iZXJzIGhhdmUgdGhlIG5vcm1hbCBmb3JtYXQsIHRoaXMgZG9lc24ndCBleGlzdC4KLSAgICAjcnVuX2R1bXBfdGVzdCAiYmUtZnBjb25zdCIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0zLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmNmOTE1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCXN3cAlyMCwgcjEsIFtyOF0KLQlzd3BiCXIyLCByMywgW3IzXQotCXN3cGdlYglyNCwgcjEsIFtyNF0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm02LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNTE3MTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTYucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCQotCW1ycwlyOCwgY3BzcgotCW1yc2VxCXI5LCBjcHNyX2FsbAotCW1ycwlyMiwgc3BzcgotCi0JbXNyCWNwc3IsIHIxCi0JbXNybmUJY3Bzcl9mbGcsICMweGYwMDAwMDAwCi0JbXNyCXNwc3JfZmxnLCByOAotCW1zcglzcHNyX2FsbCwgcjkKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTdkbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTdkbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDk2YzcwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03ZG0ucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCQotCXNtdWxsCXIwLCByMSwgcjIsIHIzCi0JdW11bGwJcjAsIHIxLCByMiwgcjMKLQlzbWxhbAlyMCwgcjEsIHIyLCByMwotCXVtbGFsCXIwLCByMSwgcjQsIHIzCi0KLQlzbXVsbG5lCXIwLCByMSwgcjMsIHI0Ci0Jc211bGxzCXIxLCByMCwgcjksIHIxMQotCXVtbGFsZXFzIHIyLCByOSwgcjQsIHI5Ci0Jc21sYWxnZSByMTQsIHIxMCwgcjgsIHIxNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTd0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyMTRlZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC0tc2hvdy1yYXctaW5zbgotI25hbWU6IEFSTSBhcm03dAotI2FzOiAtbWFybTd0IC1FTAotCi0jIFRlc3QgdGhlIGhhbGZ3b3JkIGFuZCBzaWduZXh0ZW5kIG1lbW9yeSB0cmFuc2ZlcnM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgLiphcm0uKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgPFtePl0qPiBlMWQxMDBiMCA/CWxkcmgJcjAsIFxbcjFcXQotMDAwMDAwMDQgPFtePl0qPiBlMWYxMDBiMCA/CWxkcmgJcjAsIFxbcjFcXSEKLTAwMDAwMDA4IDxbXj5dKj4gZTE5MTAwYjIgPwlsZHJoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDAwYyA8W14+XSo+IGUxYjEwMGIyID8JbGRyaAlyMCwgXFtyMSwgcjJcXSEKLTAwMDAwMDEwIDxbXj5dKj4gZTFkMTAwYmMgPwlsZHJoCXIwLCBcW3IxLCAjMTJcXQotMDAwMDAwMTQgPFtePl0qPiBlMWYxMDBiYyA/CWxkcmgJcjAsIFxbcjEsICMxMlxdIQotMDAwMDAwMTggPFtePl0qPiBlMTUxMDBiYyA/CWxkcmgJcjAsIFxbcjEsIC0jMTJcXQotMDAwMDAwMWMgPFtePl0qPiBlMDkxMDBiMiA/CWxkcmgJcjAsIFxbcjFcXSwgcjIKLTAwMDAwMDIwIDxbXj5dKj4gZTNhMDBjZmYgPwltb3YJcjAsICM2NTI4MAk7IDB4ZmYwMAotMDAwMDAwMjQgPFtePl0qPiBlMWRmMGJiNCA/CWxkcmgJcjAsIFxbcGMsICNiNFxdCTsgMDAwMDAwZTAgPFtePl0qPgotMDAwMDAwMjggPFtePl0qPiBlMWRmMGFiYyA/CWxkcmgJcjAsIFxbcGMsICNhY1xdCTsgMDAwMDAwZGMgPFtePl0qPgotMDAwMDAwMmMgPFtePl0qPiBlMWMxMDBiMCA/CXN0cmgJcjAsIFxbcjFcXQotMDAwMDAwMzAgPFtePl0qPiBlMWUxMDBiMCA/CXN0cmgJcjAsIFxbcjFcXSEKLTAwMDAwMDM0IDxbXj5dKj4gZTE4MTAwYjIgPwlzdHJoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDAzOCA8W14+XSo+IGUxYTEwMGIyID8Jc3RyaAlyMCwgXFtyMSwgcjJcXSEKLTAwMDAwMDNjIDxbXj5dKj4gZTFjMTAwYmMgPwlzdHJoCXIwLCBcW3IxLCAjMTJcXQotMDAwMDAwNDAgPFtePl0qPiBlMWUxMDBiYyA/CXN0cmgJcjAsIFxbcjEsICMxMlxdIQotMDAwMDAwNDQgPFtePl0qPiBlMTQxMDBiYyA/CXN0cmgJcjAsIFxbcjEsIC0jMTJcXQotMDAwMDAwNDggPFtePl0qPiBlMDgxMDBiMiA/CXN0cmgJcjAsIFxbcjFcXSwgcjIKLTAwMDAwMDRjIDxbXj5dKj4gZTFjZjA4YjggPwlzdHJoCXIwLCBcW3BjLCAjODhcXQk7IDAwMDAwMGRjIDxbXj5dKj4KLTAwMDAwMDUwIDxbXj5dKj4gZTFkMTAwZDAgPwlsZHJzYglyMCwgXFtyMVxdCi0wMDAwMDA1NCA8W14+XSo+IGUxZjEwMGQwID8JbGRyc2IJcjAsIFxbcjFcXSEKLTAwMDAwMDU4IDxbXj5dKj4gZTE5MTAwZDIgPwlsZHJzYglyMCwgXFtyMSwgcjJcXQotMDAwMDAwNWMgPFtePl0qPiBlMWIxMDBkMiA/CWxkcnNiCXIwLCBcW3IxLCByMlxdIQotMDAwMDAwNjAgPFtePl0qPiBlMWQxMDBkYyA/CWxkcnNiCXIwLCBcW3IxLCAjMTJcXQotMDAwMDAwNjQgPFtePl0qPiBlMWYxMDBkYyA/CWxkcnNiCXIwLCBcW3IxLCAjMTJcXSEKLTAwMDAwMDY4IDxbXj5dKj4gZTE1MTAwZGMgPwlsZHJzYglyMCwgXFtyMSwgLSMxMlxdCi0wMDAwMDA2YyA8W14+XSo+IGUwOTEwMGQyID8JbGRyc2IJcjAsIFxbcjFcXSwgcjIKLTAwMDAwMDcwIDxbXj5dKj4gZTNhMDAwZGUgPwltb3YJcjAsICMyMjIJOyAweGRlCi0wMDAwMDA3NCA8W14+XSo+IGUxZGYwNmQwID8JbGRyc2IJcjAsIFxbcGMsICM2MFxdCTsgMDAwMDAwZGMgPFtePl0qPgotMDAwMDAwNzggPFtePl0qPiBlMWQxMDBmMCA/CWxkcnNoCXIwLCBcW3IxXF0KLTAwMDAwMDdjIDxbXj5dKj4gZTFmMTAwZjAgPwlsZHJzaAlyMCwgXFtyMVxdIQotMDAwMDAwODAgPFtePl0qPiBlMTkxMDBmMiA/CWxkcnNoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDA4NCA8W14+XSo+IGUxYjEwMGYyID8JbGRyc2gJcjAsIFxbcjEsIHIyXF0hCi0wMDAwMDA4OCA8W14+XSo+IGUxZDEwMGZjID8JbGRyc2gJcjAsIFxbcjEsICMxMlxdCi0wMDAwMDA4YyA8W14+XSo+IGUxZjEwMGZjID8JbGRyc2gJcjAsIFxbcjEsICMxMlxdIQotMDAwMDAwOTAgPFtePl0qPiBlMTUxMDBmYyA/CWxkcnNoCXIwLCBcW3IxLCAtIzEyXF0KLTAwMDAwMDk0IDxbXj5dKj4gZTA5MTAwZjIgPwlsZHJzaAlyMCwgXFtyMVxdLCByMgotMDAwMDAwOTggPFtePl0qPiBlM2EwMGNmZiA/CW1vdglyMCwgIzY1MjgwCTsgMHhmZjAwCi0wMDAwMDA5YyA8W14+XSo+IGUxZGYwM2ZjID8JbGRyc2gJcjAsIFxbcGMsICMzY1xdCTsgMDAwMDAwZTAgPFtePl0qPgotMDAwMDAwYTAgPFtePl0qPiBlMWRmMDNmNCA/CWxkcnNoCXIwLCBcW3BjLCAjMzRcXQk7IDAwMDAwMGRjIDxbXj5dKj4KLTAwMDAwMGE0IDxbXj5dKj4gZTE5MTAwYjIgPwlsZHJoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBhOCA8W14+XSo+IDExOTEwMGIyID8JbGRybmVoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBhYyA8W14+XSo+IDgxOTEwMGIyID8JbGRyaGloCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBiMCA8W14+XSo+IGIxOTEwMGIyID8JbGRybHRoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBiNCA8W14+XSo+IGUxOTEwMGYyID8JbGRyc2gJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGI4IDxbXj5dKj4gMTE5MTAwZjIgPwlsZHJuZXNoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBiYyA8W14+XSo+IDgxOTEwMGYyID8JbGRyaGlzaAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwYzAgPFtePl0qPiBiMTkxMDBmMiA/CWxkcmx0c2gJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGM0IDxbXj5dKj4gZTE5MTAwZDIgPwlsZHJzYglyMCwgXFtyMSwgcjJcXQotMDAwMDAwYzggPFtePl0qPiAxMTkxMDBkMiA/CWxkcm5lc2IJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGNjIDxbXj5dKj4gODE5MTAwZDIgPwlsZHJoaXNiCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBkMCA8W14+XSo+IGIxOTEwMGQyID8JbGRybHRzYglyMCwgXFtyMSwgcjJcXQotMDAwMDAwZDQgPFtePl0qPiBlMWRmMDBmNCA/CWxkcnNoCXIwLCBcW3BjLCAjNFxdCTsgMDAwMDAwZTAgPFtePl0qPgotMDAwMDAwZDggPFtePl0qPiBlMWRmMDBmNCA/CWxkcnNoCXIwLCBcW3BjLCAjNFxdCTsgMDAwMDAwZTQgPFtePl0qPgotMDAwMDAwZGMgPFtePl0qPiAwMDAwMDAwMCA/CWFuZGVxCXIwLCByMCwgcjAKLVsJCV0qZGM6LipmcmVkCi0wMDAwMDBlMCA8W14+XSo+IDAwMDBjMGRlID8JLioKLTAwMDAwMGU0IDxbXj5dKj4gMDAwMGRlYWQgPwkuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTd0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1NTc1Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QucworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLQkudGV4dAotCS5hbGlnbgkwCi0KLWxvYWRoYWxmd29yZHM6Ci0JbGRyaAlyMCwgW3IxXQotCWxkcmgJcjAsIFtyMV0hCi0JbGRyaAlyMCwgW3IxLCByMl0KLQlsZHJoCXIwLCBbcjEsIHIyXSEKLQlsZHJoCXIwLCBbcjEsIzB4MENdCi0JbGRyaAlyMCwgW3IxLCMweDBDXSEKLQlsZHJoCXIwLCBbcjEsIy0weDBDXQotCWxkcmgJcjAsIFtyMV0sIHIyCi0JbGRyaAlyMCwgPTB4RkYwMAotCWxkcmgJcjAsID0weEMwREUKLQlsZHJoCXIwLCAuTDIKLQotc3RvcmVoYWxmd29yZHM6Ci0Jc3RyaAlyMCwgW3IxXQotCXN0cmgJcjAsIFtyMV0hCi0Jc3RyaAlyMCwgW3IxLCByMl0KLQlzdHJoCXIwLCBbcjEsIHIyXSEKLQlzdHJoCXIwLCBbcjEsIzB4MENdCi0Jc3RyaAlyMCwgW3IxLCMweDBDXSEKLQlzdHJoCXIwLCBbcjEsIy0weDBDXQotCXN0cmgJcjAsIFtyMV0sIHIyCi0Jc3RyaAlyMCwgLkwyCi0KLWxvYWRzaWduZWRieXRlczoKLQlsZHJzYglyMCwgW3IxXQotCWxkcnNiCXIwLCBbcjFdIQotCWxkcnNiCXIwLCBbcjEsIHIyXQotCWxkcnNiCXIwLCBbcjEsIHIyXSEKLQlsZHJzYglyMCwgW3IxLCMweDBDXQotCWxkcnNiCXIwLCBbcjEsIzB4MENdIQotCWxkcnNiCXIwLCBbcjEsIy0weDBDXQotCWxkcnNiCXIwLCBbcjFdLCByMgotCWxkcnNiCXIwLCA9MHhERQotCWxkcnNiCXIwLCAuTDIKLQotbG9hZHNpZ25lZGhhbGZ3b3JkczoKLQlsZHJzaAlyMCwgW3IxXQotCWxkcnNoCXIwLCBbcjFdIQotCWxkcnNoCXIwLCBbcjEsIHIyXQotCWxkcnNoCXIwLCBbcjEsIHIyXSEKLQlsZHJzaAlyMCwgW3IxLCAjMHgwQ10KLQlsZHJzaAlyMCwgW3IxLCAjMHgwQ10hCi0JbGRyc2gJcjAsIFtyMSwgIy0weDBDXQotCWxkcnNoCXIwLCBbcjFdLCByMgotCWxkcnNoCXIwLCA9MHhGRjAwCi0JbGRyc2gJcjAsID0weEMwREUKLQlsZHJzaAlyMCwgLkwyCi0JCi1taXNjOgotCWxkcmFsaAlyMCwgW3IxLCByMl0KLQlsZHJuZWgJcjAsIFtyMSwgcjJdCi0JbGRyaGloCXIwLCBbcjEsIHIyXQotCWxkcmx0aAlyMCwgW3IxLCByMl0KLQotCWxkcmFsc2gJcjAsIFtyMSwgcjJdCi0JbGRybmVzaAlyMCwgW3IxLCByMl0KLQlsZHJoaXNoCXIwLCBbcjEsIHIyXQotCWxkcmx0c2gJcjAsIFtyMSwgcjJdCi0KLQlsZHJhbHNiCXIwLCBbcjEsIHIyXQotCWxkcm5lc2IJcjAsIFtyMSwgcjJdCi0JbGRyaGlzYglyMCwgW3IxLCByMl0KLQlsZHJsdHNiCXIwLCBbcjEsIHIyXQotCi0JbGRyc2gJcjAsID0weEMwREUKLQlsZHJzaAlyMCwgPTB4REVBRAotCi0JLmFsaWduCi0uTDI6Ci0JLndvcmQJZnJlZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2NvcHJvLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vY29wcm8ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjOWI5Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vY29wcm8ucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCWNkcAlwMSwgNCwgY3IxLCBjcjIsIGNyMwotCWNkcGVxCTQsIDMsIGMxLCBjNCwgY3I1LCA1Ci0KLQlsZGMJNSwgY3I5LCBbcjNdCi0JbGRjbAkxLCBjcjE0LCBbcjEsICMzMl0KLQlsZGNtaQkwLCBjcjAsIFtyMiwgIzEwMjBdIQotCWxkY3BsbAlwNywgYzEsIFtyM10sICM2NAotCWxkYwlwMCwgYzgsIGZvbwotZm9vOgotCi0Jc3RjCTUsIGNyMCwgW3IzXQotCXN0Y2wJMywgY3IxNSwgW3IwLCAjOF0KLQlzdGNlcQlwNCwgY3IxMiwgW3IyLCAjMTAwXSEKLQlzdGNjYwlwNiwgYzgsIFtyNF0sICM0OAotCXN0YwlwMSwgYzcsIGJhcgotYmFyOgotCi0JbXJjCTIsIDMsIHI1LCBjMSwgYzIKLQltcmNnZQlwNCwgNSwgcjE1LCBjcjEsIGNyMiwgNwotCi0JbWNyCXA3LCAxLCByMTUsIGNyMSwgY3IxCi0JbWNybHQJNSwgMSwgcjgsIGNyMiwgY3I5LCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9mbG9hdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFlZTk2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9mbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCW12ZmUJZjAsIGYxCi0JbXZmZXFlCWYzLCBmNQotCW12ZmVxZAlmNCwgIzEuMAotCW12ZnMJZjQsIGY3Ci0JbXZmc3AJZjAsIGYxCi0JbXZmZG0JZjMsIGY0Ci0JbXZmZXoJZjcsIGY3Ci0KLQlhZGZlCWYwLCBmMSwgIzIuMAotCWFkZmVxZQlmMSwgZjIsICMwLjUKLQlhZGZzbQlmMywgZjQsIGY1Ci0JCi0Jc3VmZAlmMCwgZjAsICMyLjAKLQlzdWZzCWYxLCBmMiwgIzEwLjAKLQlzdWZuZWV6IGYzLCBmNCwgZjUKLQotCXJzZnMJZjEsIGYxLCAjMC4wCi0JcnNmZHAJZjMsIGYwLCAjNS4wCi0JcnNmbGVkCWY3LCBmNiwgZjAKLQotCW11ZmQJZjAsIGYwLCBmMAotCW11ZmV6CWYxLCBmMiwgIzMuMAotCW11ZmFscwlmMCwgZjAsICM0LjAKLQotCWR2ZmQJZjAsIGYwLCAjMS4wMDAwCi0JZHZmZXoJZjAsIGYxLCAjMTBlMAotCWR2Zm1pc20gZjMsIGY0LCBmNQotCi0JcmRmZQlmMCwgZjEsICMxLjBlMQotCXJkZnMJZjMsIGY3LCAjMGYxCi0JcmRmY2NkcAlmNCwgZjQsIGYzCi0KLQlwb3dkCWYwLCBmMiwgZjMKLQlwb3dzCWYxLCBmMywgIzBlMWUxCi0JcG93Y3NleglmNCwgZjcsICMxCi0KLQlycHdzCWY3LCBmNiwgZjcKLQlycHdlcWQJZjAsIGYxLCBmMgotCXJwd2VtCWYyLCBmMiwgZjMKLQotCXJtZmQJZjEsIGYyLCAjMwotCXJtZnZzcwlmMywgZjQsIGY0Ci0Jcm1mZXAJZjQsIGY3LCBmMAotCi0JZm1scwlmMCwgZjEsIGYyCi0JZm1sZXFzCWYxLCBmMywgZjUKLQlmbWxwbHN6CWY0LCBmNiwgZjAKLQotCWZkdnMJZjEsIGYzLCAjMTAKLQlmZHZzcAlmMCwgZjEsIGYyCi0JZmR2aHNzbQlmNCwgZjQsIGY0Ci0KLQlmcmRzCWYxLCBmMSwgIzEuMAotCWZyZGd0cwlmMiwgZjEsIGYwCi0JZnJkZ3RzeglmNCwgZjQsIGY1Ci0KLQlwb2xkCWYwLCBmMSwgZjIKLQlwb2xzeglmNCwgZjYsICMzLjAKLQlwb2xlcWUJZjUsIGY2LCBmNwotCi0JbW5mcwlmMCwgZjEKLQltbmZkCWYwLCAjMy4wCi0JbW5mZXoJZjAsICM0LjAKLQltbmZlcWV6IGYwLCBmNQotCW1uZnNwCWYwLCBmNAotCW1uZmRtCWYxLCBmNwotCi0JYWJzZAlmMCwgZjEKLQlhYnNzcAlmMSwgIzMuMAotCWFic2VxZQlmNCwgZjUKLQotCXJuZHMJZjEsIGYyCi0Jcm5kZAlmMywgZjQKLQlybmRlcWV6CWY2LCAjNC4wCi0KLQlzcXRzCWY1LCBmNQotCXNxdGRwCWY2LCBmNgotCXNxdHBsZXogZjcsIGY2Ci0KLQlsb2dzCWYwLCAjMTAKLQlsb2dlCWYwLCAjMGYxMAotCWxvZ25lZHoJZjAsIGYxCi0KLQlsZ25lCWYxLCBmMgotCWxnbmR6CWYxLCBmMwotCWxnbnZjcwlmMywgZjQKLQotCWV4cHMJZjEsIGYzCi0JZXhwZW0JZjMsICMxMC4wCi0JZXhwcGxkCWY2LCBmNwotCi0Jc2luZAlmMCwgZjEKLQlzaW5zbQlmMSwgZjIKLQlzaW5ndGUJZjQsICM1Ci0KLQljb3NkCWYxLCBmMwotCWNvc2VtCWY0LCBmNQotCWNvc25lZHAJZjYsIGYxCi0KLQl0YW5lCWYxLCBmNQotCXRhbnN6CWY0LCBmNwotCXRhbmdlZHoJZjEsICM0LjAKLQotCWFzbmUJZjQsIGY1Ci0JYXNuc3AJZjYsICM1ZS0xCi0JYXNubWlkeglmNSwgZjUKLQotCWFjc3MJZjUsIGY2Ci0JYWNzZAlmNiwgZjAKLQlhY3Noc2VtCWYxLCAjMC4wNWUxCi0KLQlhdG5lCWYwLCBmNQotCWF0bnN6CWYxLCAjNQotCWF0bmx0ZAlmMywgZjIKLQotCXVyZGUJZjUsIGY0Ci0JbnJtZQlmNiwgZjUKLQlucm1wbGR6CWY3LCBmNQotCi0JZmx0c3AJZjAsIHI4Ci0JZmx0ZQlmMSwgcjAKLQlmbHRlcWR6CWY1LCByNwotCi0JZml4CXIwLCBmMQotCWZpeHoJcjEsIGY3Ci0JZml4Y3NtCXI1LCBmNQotCi0Jd2ZjCXIwCi0Jd2ZzCXIxCi0JcmZzZXEJcjIKLQlyZmMJcjQKLQotCWNtZglmMCwgIzEKLQljbWYJZjEsIGYyCi0JY21mZXEJZjAsIGYxCi0KLQljbmYJZjAsICMzCi0JY25mCWYxLCAjMC41Ci0JY25mdnMJZjMsIGY0Ci0KLQljbWZlCWYwLCBmMQotCWNtZmVlcQlmMSwgZjIKLQljbWZlcWUJZjMsICM1LjAKLQotCWNuZmUJZjEsIGYzCi0JY25mZWVxCWYzLCBmNAotCWNuZmVxZQlmNCwgZjcKLQljbmZhbGUJZjQsICM1LjAKLQotCWxmbQlmMCwgNCwgW3IwXQotCWxmbQlmMCwgNCwgW3IwLCAjMF0KLQlsZm0JZjEsIDQsIFtyMSwgIzY0XQotCXNmbQlmMiwgNCwgW3IxNCwgIzEwMjBdIQotCXNmbWVxCWY3LCAzLCBbcjhdLCAjLTEwMjAKLQotCWxmbWZkCWY2LCAyLCBbcjE1XQotCXNmbWVhCWY3LCAxLCBbcjhdIQotCWxmbWVxZWEJZjUsIDQsIFtyNl0KLQlzZm1uZWZkCWY0LCAzLCBbcjJdCi0Jc2ZtbmVmZAlmNCwgMywgW3IyXSEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbW1lZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2ltbWVkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMjA5MmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2ltbWVkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1ACVRlc3RzIGZvciBjb21wbGV4IGltbWVkaWF0ZSBleHByZXNzaW9ucyAtIG5vbmUgb2YgdGhlc2UgbmVlZCAKLUAJcmVsb2NhdGlvbnMKLQkudGV4dAotYmFyOgotCW1vdglyMCwgIzAKLQltb3YJcjAsICMoLiAtIGJhciAtIDgpCi0JbGRyCXIwLCBiYXIKLQlsZHIJcjAsIFtwYywgIyAoYmFyIC0gLiAtOCldCi0JLnNwYWNlIDQwOTYKLQltb3YJcjAsICMoLiAtIGJhciAtIDgpICYgMHhmZgotCWxkcglyMCwgW3BjLCAjIChiYXIgLSAuIC04KSAmIDB4ZmZdCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW5zdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2NmFkYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW5zdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC0tc2hvdy1yYXctaW5zbgotI25hbWU6IEFSTSBiYXNpYyBpbnN0cnVjdGlvbnMKLSNhczogLW1hcm0yIC1FTAotCi0jIFRlc3QgdGhlIHN0YW5kYXJkIEFSTSBpbnN0cnVjdGlvbnM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgLiphcm0uKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgPFtePl0qPiBlM2EwMDAwMCA/CW1vdglyMCwgIzAJOyAweDAKLTAwMDAwMDA0IDxbXj5dKj4gZTFhMDEwMDIgPwltb3YJcjEsIHIyCi0wMDAwMDAwOCA8W14+XSo+IGUxYTAzMTg0ID8JbW92CXIzLCByNCwgbHNsICMzCi0wMDAwMDAwYyA8W14+XSo+IGUxYTA1NzM2ID8JbW92CXI1LCByNiwgbHNyIHI3Ci0wMDAwMDAxMCA8W14+XSo+IGUxYTA4YTU5ID8JbW92CXI4LCByOSwgYXNyIHIxMAotMDAwMDAwMTQgPFtePl0qPiBlMWEwYmQxYyA/CW1vdglyMTEsIHIxMiwgbHNsIHNwCi0wMDAwMDAxOCA8W14+XSo+IGUxYTBlMDZmID8JbW92CWxyLCBwYywgcnJ4Ci0wMDAwMDAxYyA8W14+XSo+IGUxYTAxMDAyID8JbW92CXIxLCByMgotMDAwMDAwMjAgPFtePl0qPiAwMWEwMjAwMyA/CW1vdmVxCXIyLCByMwotMDAwMDAwMjQgPFtePl0qPiAxMWEwNDAwNSA/CW1vdm5lCXI0LCByNQotMDAwMDAwMjggPFtePl0qPiBiMWEwNjAwNyA/CW1vdmx0CXI2LCByNwotMDAwMDAwMmMgPFtePl0qPiBhMWEwODAwOSA/CW1vdmdlCXI4LCByOQotMDAwMDAwMzAgPFtePl0qPiBkMWEwYTAwYiA/CW1vdmxlCXIxMCwgcjExCi0wMDAwMDAzNCA8W14+XSo+IGMxYTBjMDBkID8JbW92Z3QJcjEyLCBzcAotMDAwMDAwMzggPFtePl0qPiAzMWEwMTAwMiA/CW1vdmNjCXIxLCByMgotMDAwMDAwM2MgPFtePl0qPiAyMWEwMTAwMyA/CW1vdmNzCXIxLCByMwotMDAwMDAwNDAgPFtePl0qPiA0MWEwMzAwNiA/CW1vdm1pCXIzLCByNgotMDAwMDAwNDQgPFtePl0qPiA1MWEwNzAwOSA/CW1vdnBsCXI3LCByOQotMDAwMDAwNDggPFtePl0qPiA2MWEwMTAwOCA/CW1vdnZzCXIxLCByOAotMDAwMDAwNGMgPFtePl0qPiA3MWEwOWZhMSA/CW1vdnZjCXI5LCByMSwgbHNyICMzMQotMDAwMDAwNTAgPFtePl0qPiA4MWEwODAwZiA/CW1vdmhpCXI4LCBwYwotMDAwMDAwNTQgPFtePl0qPiA5MWEwZjAwZSA/CW1vdmxzCXBjLCBscgotMDAwMDAwNTggPFtePl0qPiAyMWEwOTAwOCA/CW1vdmNzCXI5LCByOAotMDAwMDAwNWMgPFtePl0qPiAzMWEwMTAwMyA/CW1vdmNjCXIxLCByMwotMDAwMDAwNjAgPFtePl0qPiBlMWIwMDAwOCA/CW1vdnMJcjAsIHI4Ci0wMDAwMDA2NCA8W14+XSo+IDMxYjAwMDA3ID8JbW92Y2NzCXIwLCByNwotMDAwMDAwNjggPFtePl0qPiBlMjgxMDAwYSA/CWFkZAlyMCwgcjEsICMxMAk7IDB4YQotMDAwMDAwNmMgPFtePl0qPiBlMDgzMjAwNCA/CWFkZAlyMiwgcjMsIHI0Ci0wMDAwMDA3MCA8W14+XSo+IGUwODY1Mjg3ID8JYWRkCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwNzQgPFtePl0qPiBlMDgyMTExMyA/CWFkZAlyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMDc4IDxbXj5dKj4gZTIwMTAwMGEgPwlhbmQJcjAsIHIxLCAjMTAJOyAweGEKLTAwMDAwMDdjIDxbXj5dKj4gZTAwMzIwMDQgPwlhbmQJcjIsIHIzLCByNAotMDAwMDAwODAgPFtePl0qPiBlMDA2NTI4NyA/CWFuZAlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMDg0IDxbXj5dKj4gZTAwMjExMTMgPwlhbmQJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDA4OCA8W14+XSo+IGUyMjEwMDBhID8JZW9yCXIwLCByMSwgIzEwCTsgMHhhCi0wMDAwMDA4YyA8W14+XSo+IGUwMjMyMDA0ID8JZW9yCXIyLCByMywgcjQKLTAwMDAwMDkwIDxbXj5dKj4gZTAyNjUyODcgPwllb3IJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDA5NCA8W14+XSo+IGUwMjIxMTEzID8JZW9yCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwOTggPFtePl0qPiBlMjQxMDAwYSA/CXN1YglyMCwgcjEsICMxMAk7IDB4YQotMDAwMDAwOWMgPFtePl0qPiBlMDQzMjAwNCA/CXN1YglyMiwgcjMsIHI0Ci0wMDAwMDBhMCA8W14+XSo+IGUwNDY1Mjg3ID8Jc3ViCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwYTQgPFtePl0qPiBlMDQyMTExMyA/CXN1YglyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMGE4IDxbXj5dKj4gZTJhMTAwMGEgPwlhZGMJcjAsIHIxLCAjMTAJOyAweGEKLTAwMDAwMGFjIDxbXj5dKj4gZTBhMzIwMDQgPwlhZGMJcjIsIHIzLCByNAotMDAwMDAwYjAgPFtePl0qPiBlMGE2NTI4NyA/CWFkYwlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMGI0IDxbXj5dKj4gZTBhMjExMTMgPwlhZGMJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDBiOCA8W14+XSo+IGUyYzEwMDBhID8Jc2JjCXIwLCByMSwgIzEwCTsgMHhhCi0wMDAwMDBiYyA8W14+XSo+IGUwYzMyMDA0ID8Jc2JjCXIyLCByMywgcjQKLTAwMDAwMGMwIDxbXj5dKj4gZTBjNjUyODcgPwlzYmMJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDBjNCA8W14+XSo+IGUwYzIxMTEzID8Jc2JjCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwYzggPFtePl0qPiBlMjYxMDAwYSA/CXJzYglyMCwgcjEsICMxMAk7IDB4YQotMDAwMDAwY2MgPFtePl0qPiBlMDYzMjAwNCA/CXJzYglyMiwgcjMsIHI0Ci0wMDAwMDBkMCA8W14+XSo+IGUwNjY1Mjg3ID8JcnNiCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwZDQgPFtePl0qPiBlMDYyMTExMyA/CXJzYglyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMGQ4IDxbXj5dKj4gZTJlMTAwMGEgPwlyc2MJcjAsIHIxLCAjMTAJOyAweGEKLTAwMDAwMGRjIDxbXj5dKj4gZTBlMzIwMDQgPwlyc2MJcjIsIHIzLCByNAotMDAwMDAwZTAgPFtePl0qPiBlMGU2NTI4NyA/CXJzYwlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMGU0IDxbXj5dKj4gZTBlMjExMTMgPwlyc2MJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDBlOCA8W14+XSo+IGUzODEwMDBhID8Jb3JyCXIwLCByMSwgIzEwCTsgMHhhCi0wMDAwMDBlYyA8W14+XSo+IGUxODMyMDA0ID8Jb3JyCXIyLCByMywgcjQKLTAwMDAwMGYwIDxbXj5dKj4gZTE4NjUyODcgPwlvcnIJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDBmNCA8W14+XSo+IGUxODIxMTEzID8Jb3JyCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwZjggPFtePl0qPiBlM2MxMDAwYSA/CWJpYwlyMCwgcjEsICMxMAk7IDB4YQotMDAwMDAwZmMgPFtePl0qPiBlMWMzMjAwNCA/CWJpYwlyMiwgcjMsIHI0Ci0wMDAwMDEwMCA8W14+XSo+IGUxYzY1Mjg3ID8JYmljCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAxMDQgPFtePl0qPiBlMWMyMTExMyA/CWJpYwlyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMTA4IDxbXj5dKj4gZTNlMDAwMGEgPwltdm4JcjAsICMxMAk7IDB4YQotMDAwMDAxMGMgPFtePl0qPiBlMWUwMjAwNCA/CW12bglyMiwgcjQKLTAwMDAwMTEwIDxbXj5dKj4gZTFlMDUyODcgPwltdm4JcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTE0IDxbXj5dKj4gZTFlMDExMTMgPwltdm4JcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTE4IDxbXj5dKj4gZTMxMDAwMGEgPwl0c3QJcjAsICMxMAk7IDB4YQotMDAwMDAxMWMgPFtePl0qPiBlMTEyMDAwNCA/CXRzdAlyMiwgcjQKLTAwMDAwMTIwIDxbXj5dKj4gZTExNTAyODcgPwl0c3QJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTI0IDxbXj5dKj4gZTExMTAxMTMgPwl0c3QJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTI4IDxbXj5dKj4gZTMzMDAwMGEgPwl0ZXEJcjAsICMxMAk7IDB4YQotMDAwMDAxMmMgPFtePl0qPiBlMTMyMDAwNCA/CXRlcQlyMiwgcjQKLTAwMDAwMTMwIDxbXj5dKj4gZTEzNTAyODcgPwl0ZXEJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTM0IDxbXj5dKj4gZTEzMTAxMTMgPwl0ZXEJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTM4IDxbXj5dKj4gZTM1MDAwMGEgPwljbXAJcjAsICMxMAk7IDB4YQotMDAwMDAxM2MgPFtePl0qPiBlMTUyMDAwNCA/CWNtcAlyMiwgcjQKLTAwMDAwMTQwIDxbXj5dKj4gZTE1NTAyODcgPwljbXAJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTQ0IDxbXj5dKj4gZTE1MTAxMTMgPwljbXAJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTQ4IDxbXj5dKj4gZTM3MDAwMGEgPwljbW4JcjAsICMxMAk7IDB4YQotMDAwMDAxNGMgPFtePl0qPiBlMTcyMDAwNCA/CWNtbglyMiwgcjQKLTAwMDAwMTUwIDxbXj5dKj4gZTE3NTAyODcgPwljbW4JcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTU0IDxbXj5dKj4gZTE3MTAxMTMgPwljbW4JcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTU4IDxbXj5dKj4gZTMzMGYwMGEgPwl0ZXFwCXIwLCAjMTAJOyAweGEKLTAwMDAwMTVjIDxbXj5dKj4gZTEzMmYwMDQgPwl0ZXFwCXIyLCByNAotMDAwMDAxNjAgPFtePl0qPiBlMTM1ZjI4NyA/CXRlcXAJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTY0IDxbXj5dKj4gZTEzMWYxMTMgPwl0ZXFwCXIxLCByMywgbHNsIHIxCi0wMDAwMDE2OCA8W14+XSo+IGUzNzBmMDBhID8JY21ucAlyMCwgIzEwCTsgMHhhCi0wMDAwMDE2YyA8W14+XSo+IGUxNzJmMDA0ID8JY21ucAlyMiwgcjQKLTAwMDAwMTcwIDxbXj5dKj4gZTE3NWYyODcgPwljbW5wCXI1LCByNywgbHNsICM1Ci0wMDAwMDE3NCA8W14+XSo+IGUxNzFmMTEzID8JY21ucAlyMSwgcjMsIGxzbCByMQotMDAwMDAxNzggPFtePl0qPiBlMzUwZjAwYSA/CWNtcHAJcjAsICMxMAk7IDB4YQotMDAwMDAxN2MgPFtePl0qPiBlMTUyZjAwNCA/CWNtcHAJcjIsIHI0Ci0wMDAwMDE4MCA8W14+XSo+IGUxNTVmMjg3ID8JY21wcAlyNSwgcjcsIGxzbCAjNQotMDAwMDAxODQgPFtePl0qPiBlMTUxZjExMyA/CWNtcHAJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTg4IDxbXj5dKj4gZTMxMGYwMGEgPwl0c3RwCXIwLCAjMTAJOyAweGEKLTAwMDAwMThjIDxbXj5dKj4gZTExMmYwMDQgPwl0c3RwCXIyLCByNAotMDAwMDAxOTAgPFtePl0qPiBlMTE1ZjI4NyA/CXRzdHAJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTk0IDxbXj5dKj4gZTExMWYxMTMgPwl0c3RwCXIxLCByMywgbHNsIHIxCi0wMDAwMDE5OCA8W14+XSo+IGUwMDAwMjkxID8JbXVsCXIwLCByMSwgcjIKLTAwMDAwMTljIDxbXj5dKj4gZTAxMTAzOTIgPwltdWxzCXIxLCByMiwgcjMKLTAwMDAwMWEwIDxbXj5dKj4gMTAwMDAwOTEgPwltdWxuZQlyMCwgcjEsIHIwCi0wMDAwMDFhNCA8W14+XSo+IDkwMTkwNzk4ID8JbXVsbHNzCXI5LCByOCwgcjcKLTAwMDAwMWE4IDxbXj5dKj4gZTAyMWJhOTkgPwltbGEJcjEsIHI5LCByMTAsIHIxMQotMDAwMDAxYWMgPFtePl0qPiBlMDMzYzk5NCA/CW1sYXMJcjMsIHI0LCByOSwgcjEyCi0wMDAwMDFiMCA8W14+XSo+IGIwMjlkNzk4ID8JbWxhbHQJcjksIHI4LCByNywgc3AKLTAwMDAwMWI0IDxbXj5dKj4gYTAzNGUzOTEgPwltbGFnZXMJcjQsIHIxLCByMywgbHIKLTAwMDAwMWI4IDxbXj5dKj4gZTU5MTAwMDAgPwlsZHIJcjAsIFxbcjFcXQotMDAwMDAxYmMgPFtePl0qPiBlNzkxMTAwMiA/CWxkcglyMSwgXFtyMSwgcjJcXQotMDAwMDAxYzAgPFtePl0qPiBlN2IzMjAwNCA/CWxkcglyMiwgXFtyMywgcjRcXSEKLTAwMDAwMWM0IDxbXj5dKj4gZTU5MjIwMjAgPwlsZHIJcjIsIFxbcjIsICMzMlxdCi0wMDAwMDFjOCA8W14+XSo+IGU3OTMyNDI0ID8JbGRyCXIyLCBcW3IzLCByNCwgbHNyICM4XF0KLTAwMDAwMWNjIDxbXj5dKj4gMDdiNTQ0ODQgPwlsZHJlcQlyNCwgXFtyNSwgcjQsIGxzbCAjOVxdIQotMDAwMDAxZDAgPFtePl0qPiAxNDk1NDAwNiA/CWxkcm5lCXI0LCBcW3I1XF0sICM2Ci0wMDAwMDFkNCA8W14+XSo+IGU2YjIxMDAzID8JbGRydAlyMSwgXFtyMlxdLCByMwotMDAwMDAxZDggPFtePl0qPiBlNjk0MjQyNSA/CWxkcglyMiwgXFtyNFxdLCByNSwgbHNyICM4Ci0wMDAwMDFkYyA8W14+XSo+IGU1MWYwMDA4ID8JbGRyCXIwLCBcW3BjLCAjZmZmZmZmZjhcXQk7IDAwMDAwMWRjIDxbXj5dKj4KLTAwMDAwMWUwIDxbXj5dKj4gZTVkNDMwMDAgPwlsZHJiCXIzLCBcW3I0XF0KLTAwMDAwMWU0IDxbXj5dKj4gMTRmODUwMDAgPwlsZHJuZWJ0CXI1LCBcW3I4XF0KLTAwMDAwMWU4IDxbXj5dKj4gZTU4MTAwMDAgPwlzdHIJcjAsIFxbcjFcXQotMDAwMDAxZWMgPFtePl0qPiBlNzgxMTAwMiA/CXN0cglyMSwgXFtyMSwgcjJcXQotMDAwMDAxZjAgPFtePl0qPiBlN2E0MzAwMyA/CXN0cglyMywgXFtyNCwgcjNcXSEKLTAwMDAwMWY0IDxbXj5dKj4gZTU4MjIwMjAgPwlzdHIJcjIsIFxbcjIsICMzMlxdCi0wMDAwMDFmOCA8W14+XSo+IGU3ODMyNDI0ID8Jc3RyCXIyLCBcW3IzLCByNCwgbHNyICM4XF0KLTAwMDAwMWZjIDxbXj5dKj4gMDdhNTQ0ODQgPwlzdHJlcQlyNCwgXFtyNSwgcjQsIGxzbCAjOVxdIQotMDAwMDAyMDAgPFtePl0qPiAxNDg1NDAwNiA/CXN0cm5lCXI0LCBcW3I1XF0sICM2Ci0wMDAwMDIwNCA8W14+XSo+IGU2ODIxMDAzID8Jc3RyCXIxLCBcW3IyXF0sIHIzCi0wMDAwMDIwOCA8W14+XSo+IGU2YTQyNDI1ID8Jc3RydAlyMiwgXFtyNFxdLCByNSwgbHNyICM4Ci0wMDAwMDIwYyA8W14+XSo+IGU1MGYxMDA0ID8Jc3RyCXIxLCBcW3BjLCAjZmZmZmZmZmNcXQk7IDAwMDAwMjEwIDxbXj5dKj4KLTAwMDAwMjEwIDxbXj5dKj4gZTVjNzEwMDAgPwlzdHJiCXIxLCBcW3I3XF0KLTAwMDAwMjE0IDxbXj5dKj4gZTRlMDIwMDAgPwlzdHJidAlyMiwgXFtyMFxdCi0wMDAwMDIxOCA8W14+XSo+IGU4OTAwMDAyID8JbGRtaWEJcjAsIHtyMX0KLTAwMDAwMjFjIDxbXj5dKj4gMDk5MjAwMzggPwlsZG1lcWliCXIyLCB7cjMsIHI0LCByNX0KLTAwMDAwMjIwIDxbXj5dKj4gZTg1M2ZmZmYgPwlsZG1kYQlyMywge3IwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIHIxMSwgcjEyLCBzcCwgbHIsIHBjfVxeCi0wMDAwMDIyNCA8W14+XSo+IGU5M2IwNWZmID8JbGRtZGIJcjExISwge3IwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcjgsIHIxMH0KLTAwMDAwMjI4IDxbXj5dKj4gZTk5MTAwZjcgPwlsZG1pYglyMSwge3IwLCByMSwgcjIsIHI0LCByNSwgcjYsIHI3fQotMDAwMDAyMmMgPFtePl0qPiBlODkyMDFmOCA/CWxkbWlhCXIyLCB7cjMsIHI0LCByNSwgcjYsIHI3LCByOH0KLTAwMDAwMjMwIDxbXj5dKj4gZTkxMzAwMDMgPwlsZG1kYglyMywge3IwLCByMX0KLTAwMDAwMjM0IDxbXj5dKj4gZTg3NDAzMDAgPwlsZG1kYQlyNCEsIHtyOCwgcjl9XF4KLTAwMDAwMjM4IDxbXj5dKj4gZTg4MDAwMDIgPwlzdG1pYQlyMCwge3IxfQotMDAwMDAyM2MgPFtePl0qPiAwOTgyMDAzOCA/CXN0bWVxaWIJcjIsIHtyMywgcjQsIHI1fQotMDAwMDAyNDAgPFtePl0qPiBlODQzZmZmZiA/CXN0bWRhCXIzLCB7cjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgcjExLCByMTIsIHNwLCBsciwgcGN9XF4KLTAwMDAwMjQ0IDxbXj5dKj4gZTkyYTA1ZmYgPwlzdG1kYglyMTAhLCB7cjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgcjEwfQotMDAwMDAyNDggPFtePl0qPiBlODAxMDAwNyA/CXN0bWRhCXIxLCB7cjAsIHIxLCByMn0KLTAwMDAwMjRjIDxbXj5dKj4gZTkwMjAwMTggPwlzdG1kYglyMiwge3IzLCByNH0KLTAwMDAwMjUwIDxbXj5dKj4gZTg4MzAwMDMgPwlzdG1pYQlyMywge3IwLCByMX0KLTAwMDAwMjU0IDxbXj5dKj4gZTllNDAzMDAgPwlzdG1pYglyNCEsIHtyOCwgcjl9XF4KLTAwMDAwMjU4IDxbXj5dKj4gZWYxMjM0NTYgPwlzd2kJMHgwMDEyMzQ1NgotMDAwMDAyNWMgPFtePl0qPiAyZjAwMDAzMyA/CXN3aWNzCTB4MDAwMDAwMzMKLTAwMDAwMjYwIDxbXj5dKj4gZWJmZmZmZmUgPwlibAkwMDAwMDI2MCA8W14+XSo+Ci1bCQldKjI2MDouKl93b21iYXQuKgotMDAwMDAyNjQgPFtePl0qPiA1YmZmZmZmZSA/CWJscGwJMDAwMDAyNjQgPFtePl0qPgotWwkJXSoyNjQ6LipBUk0uKmhvaHVtCi0wMDAwMDI2OCA8W14+XSo+IGVhZmZmZmZlID8JYgkwMDAwMDI2OCA8W14+XSo+Ci1bCQldKjI2ODouKl93aWJibGUuKgotMDAwMDAyNmMgPFtePl0qPiBkYWZmZmZmZSA/CWJsZQkwMDAwMDI2YyA8W14+XSo+Ci1bCQldKjI2YzouKnRlc3RlcmZ1bmMuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDM3NTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QucworKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi1ACVRlc3QgZmlsZSBmb3IgQVJNL0dBUyAtLSBiYXNpYyBpbnN0cnVjdGlvbnMKLQotLnRleHQKLS5hbGlnbgotCW1vdglyMCwgIzAKLQltb3YJcjEsIHIyCi0JbW92CXIzLCByNCwgbHNsICMzCi0JbW92CXI1LCByNiwgbHNyIHI3Ci0JbW92CXI4LCByOSwgYXNyIHIxMAotCW1vdglyMTEsIHIxMiwgYXNsIHIxMwotCW1vdglyMTQsIHIxNSwgcnJ4Ci0JbW92YWwJcjEsIHIyCi0JbW92ZXEJcjIsIHIzCi0JbW92bmUJcjQsIHI1Ci0JbW92bHQJcjYsIHI3Ci0JbW92Z2UJcjgsIHI5Ci0JbW92bGUJcjEwLCByMTEKLQltb3ZndAlyMTIsIHIxMwotCW1vdmNjCXIxLCByMgotCW1vdmNzCXIxLCByMwotCW1vdm1pCXIzLCByNgotCW1vdnBsCXI3LCByOQotCW1vdnZzCXIxLCByOAotCW1vdnZjCXI5LCByMSwgbHNyICMzMQotCW1vdmhpCXI4LCByMTUKLQltb3ZscwlyMTUsIHIxNAotCW1vdmhzCXI5LCByOAotCW1vdnVsCXIxLCByMwotCW1vdnMJcjAsIHI4Ci0JbW92dWxzCXIwLCByNwotCQotCWFkZAlyMCwgcjEsICMxMAotCWFkZAlyMiwgcjMsIHI0Ci0JYWRkCXI1LCByNiwgcjcsIGFzbCAjNQotCWFkZAlyMSwgcjIsIHIzLCBsc2wgcjEKLQotCWFuZAlyMCwgcjEsICMxMAotCWFuZAlyMiwgcjMsIHI0Ci0JYW5kCXI1LCByNiwgcjcsIGFzbCAjNQotCWFuZAlyMSwgcjIsIHIzLCBsc2wgcjEKLQotCWVvcglyMCwgcjEsICMxMAotCWVvcglyMiwgcjMsIHI0Ci0JZW9yCXI1LCByNiwgcjcsIGFzbCAjNQotCWVvcglyMSwgcjIsIHIzLCBsc2wgcjEKLQotCXN1YglyMCwgcjEsICMxMAotCXN1YglyMiwgcjMsIHI0Ci0Jc3ViCXI1LCByNiwgcjcsIGFzbCAjNQotCXN1YglyMSwgcjIsIHIzLCBsc2wgcjEKLQotCWFkYwlyMCwgcjEsICMxMAotCWFkYwlyMiwgcjMsIHI0Ci0JYWRjCXI1LCByNiwgcjcsIGFzbCAjNQotCWFkYwlyMSwgcjIsIHIzLCBsc2wgcjEKLQotCXNiYwlyMCwgcjEsICMxMAotCXNiYwlyMiwgcjMsIHI0Ci0Jc2JjCXI1LCByNiwgcjcsIGFzbCAjNQotCXNiYwlyMSwgcjIsIHIzLCBsc2wgcjEKLQotCXJzYglyMCwgcjEsICMxMAotCXJzYglyMiwgcjMsIHI0Ci0JcnNiCXI1LCByNiwgcjcsIGFzbCAjNQotCXJzYglyMSwgcjIsIHIzLCBsc2wgcjEKLQotCXJzYwlyMCwgcjEsICMxMAotCXJzYwlyMiwgcjMsIHI0Ci0JcnNjCXI1LCByNiwgcjcsIGFzbCAjNQotCXJzYwlyMSwgcjIsIHIzLCBsc2wgcjEKLQotCW9ycglyMCwgcjEsICMxMAotCW9ycglyMiwgcjMsIHI0Ci0Jb3JyCXI1LCByNiwgcjcsIGFzbCAjNQotCW9ycglyMSwgcjIsIHIzLCBsc2wgcjEKLQotCWJpYwlyMCwgcjEsICMxMAotCWJpYwlyMiwgcjMsIHI0Ci0JYmljCXI1LCByNiwgcjcsIGFzbCAjNQotCWJpYwlyMSwgcjIsIHIzLCBsc2wgcjEKLQotCW12bglyMCwgIzEwCi0JbXZuCXIyLCByNAotCW12bglyNSwgcjcsIGFzbCAjNQotCW12bglyMSwgcjMsIGxzbCByMQotCi0JdHN0CXIwLCAjMTAKLQl0c3QJcjIsIHI0Ci0JdHN0CXI1LCByNywgYXNsICM1Ci0JdHN0CXIxLCByMywgbHNsIHIxCi0KLQl0ZXEJcjAsICMxMAotCXRlcQlyMiwgcjQKLQl0ZXEJcjUsIHI3LCBhc2wgIzUKLQl0ZXEJcjEsIHIzLCBsc2wgcjEKLQotCWNtcAlyMCwgIzEwCi0JY21wCXIyLCByNAotCWNtcAlyNSwgcjcsIGFzbCAjNQotCWNtcAlyMSwgcjMsIGxzbCByMQotCi0JY21uCXIwLCAjMTAKLQljbW4JcjIsIHI0Ci0JY21uCXI1LCByNywgYXNsICM1Ci0JY21uCXIxLCByMywgbHNsIHIxCi0KLQl0ZXFwCXIwLCAjMTAKLQl0ZXFwCXIyLCByNAotCXRlcXAJcjUsIHI3LCBhc2wgIzUKLQl0ZXFwCXIxLCByMywgbHNsIHIxCi0KLQljbW5wCXIwLCAjMTAKLQljbW5wCXIyLCByNAotCWNtbnAJcjUsIHI3LCBhc2wgIzUKLQljbW5wCXIxLCByMywgbHNsIHIxCi0KLQljbXBwCXIwLCAjMTAKLQljbXBwCXIyLCByNAotCWNtcHAJcjUsIHI3LCBhc2wgIzUKLQljbXBwCXIxLCByMywgbHNsIHIxCi0KLQl0c3RwCXIwLCAjMTAKLQl0c3RwCXIyLCByNAotCXRzdHAJcjUsIHI3LCBhc2wgIzUKLQl0c3RwCXIxLCByMywgbHNsIHIxCi0KLQltdWwJcjAsIHIxLCByMgotCW11bHMJcjEsIHIyLCByMwotCW11bG5lCXIwLCByMSwgcjAKLQltdWxsc3MJcjksIHI4LCByNwotCi0JbWxhCXIxLCByOSwgcjEwLCByMTEKLQltbGFzCXIzLCByNCwgcjksIHIxMgotCW1sYWx0CXI5LCByOCwgcjcsIHIxMwotCW1sYWdlcwlyNCwgcjEsIHIzLCByMTQKLQotCWxkcglyMCwgW3IxXQotCWxkcglyMSwgW3IxLCByMl0KLQlsZHIJcjIsIFtyMywgcjRdIQotCWxkcglyMiwgW3IyLCAjMzJdCi0JbGRyCXIyLCBbcjMsIHI0LCBsc3IgIzhdCi0JbGRyZXEJcjQsIFtyNSwgcjQsIGFzbCAjOV0hCi0JbGRybmUJcjQsIFtyNV0sICM2Ci0JbGRydAlyMSwgW3IyXSwgcjMKLQlsZHIJcjIsIFtyNF0sIHI1LCBsc3IgIzgKLWZvbzoKLQlsZHIJcjAsIGZvbwotCWxkcmIJcjMsIFtyNF0KLQlsZHJuZWJ0CXI1LCBbcjhdCi0JCi0Jc3RyCXIwLCBbcjFdCi0Jc3RyCXIxLCBbcjEsIHIyXQotCXN0cglyMywgW3I0LCByM10hCi0Jc3RyCXIyLCBbcjIsICMzMl0KLQlzdHIJcjIsIFtyMywgcjQsIGxzciAjOF0KLQlzdHJlcQlyNCwgW3I1LCByNCwgYXNsICM5XSEKLQlzdHJuZQlyNCwgW3I1XSwgIzYKLQlzdHIJcjEsIFtyMl0sIHIzCi0Jc3RydAlyMiwgW3I0XSwgcjUsIGxzciAjOAotCXN0cglyMSwgYmFyCi1iYXI6Ci0Jc3RyYWxiCXIxLCBbcjddCi0Jc3RyYnQJcjIsIFtyMF0KLQotCWxkbWlhCXIwLCB7cjF9Ci0JbGRtZXFpYglyMiwge3IzLCByNCwgcjV9Ci0JbGRtYWxkYQlyMywge3IwLXIxNX1eCi0JbGRtZGIJcjExISwge3IwLXI4LCByMTB9Ci0JbGRtZWQJcjEsIHtyMCwgcjEsIHIyfXwweGYwCi0JbGRtZmQJcjIsIHtyMywgcjR9K3tyNSwgcjYsIHI3LCByOH0KLQlsZG1lYQlyMywgMwotCWxkbWZhCXI0ISwge3I4LCByOX1eCi0JCi0Jc3RtaWEJcjAsIHtyMX0KLQlzdG1lcWliCXIyLCB7cjMsIHI0LCByNX0KLQlzdG1hbGRhCXIzLCB7cjAtcjE1fV4KLQlzdG1kYglyMTAhLCB7cjAtcjgsIHIxMH0KLQlzdG1lZAlyMSwge3IwLCByMSwgcjJ9Ci0Jc3RtZmQJcjIsIHtyMywgcjR9Ci0Jc3RtZWEJcjMsIDMKLQlzdG1mYQlyNCEsIHtyOCwgcjl9XgotCi0Jc3dpCTB4MTIzNDU2Ci0Jc3dpaHMJMHgzMwotCi0JYmwJX3dvbWJhdAotCWJscGwJaG9odW0KLQliCV93aWJibGUKLQlibGUJdGVzdGVyZnVuYwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2xlLWZwY29uc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9sZS1mcGNvbnN0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NGUwZTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2xlLWZwY29uc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI29iamR1bXA6IC1zCi0jYXM6IC1FTAotI25hbWU6IGFybSBsaXR0bGUtZW5kaWFuIGZwY29uc3QKLQotLio6ICtmaWxlIGZvcm1hdCAuKmFybS4qCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6Ci0gMDAwMCBjZGNjOGMzZiAwMDAwMDAwMCA5OTk5ZjEzZiA5YTk5OTk5OSAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2xlLWZwY29uc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9sZS1mcGNvbnN0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhM2MzZDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2xlLWZwY29uc3QucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBUZXN0IGZwIGNvbnN0YW50cy4KLSMgVGhlc2UgbmVlZCBBUk0gc3BlY2lmaWMgc3VwcG9ydCBiZWNhdXNlIDggYnl0ZSBmcCBjb25zdGFudHMgaW4gbGl0dGxlCi0jIGVuZGlhbiBtb2RlIGFyZSByZXByZXNlbnRlZCBhYm5vcm1hbGx5LgotCQotCS50ZXh0Ci0JLmZsb2F0IDEuMQotCS5mbG9hdCAwCi0JLmRvdWJsZSAxLjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS90aHVtYi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL3RodW1iLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNGI4MmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL3RodW1iLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotCS50ZXh0Ci0JLmNvZGUgMTYKLS5mb286CQotCWxzbAlyMiwgcjEsICMzCi0JbHNyCXIzLCByNCwgIzMxCi13aWJibGUvZGF0YToJCi0JYXNyCXI3LCByMCwgIzUKLQotCWxzbAlyMSwgcjIsICMwCi0JbHNyCXIzLCByNCwgIzAKLQlhc3IJcjQsIHI1LCAjMAotCi0JbHNyCXI2LCByNywgIzMyCi0JYXNyCXIwLCByMSwgIzMyCi0KLQlhZGQJcjEsIHIyLCByMwotCWFkZAlyMiwgcjQsICMyCi0Jc3ViCXIzLCByNSwgcjcKLQlzdWIJcjIsIHI0LCAjNwotCi0JbW92CXI0LCAjMjU1Ci0JY21wCXIzLCAjMjUwCi0JYWRkCXI2LCAjMTIzCi0Jc3ViCXI1LCAjMTI4Ci0KLQlhbmQJcjMsIHI1Ci0JZW9yCXI0LCByNgotCWxzbAlyMSwgcjAKLQlsc3IJcjIsIHIzCi0JYXNyCXI0LCByNgotCWFkYwlyNSwgcjcKLQlzYmMJcjAsIHI0Ci0Jcm9yCXIxLCByNAotCXRzdAlyMiwgcjUKLQluZWcJcjEsIHIxCi0JY21wCXIyLCByMwotCWNtbglyMSwgcjQKLQlvcnIJcjAsIHIzCi0JbXVsCXI0LCByNQotCWJpYwlyNSwgcjcKLQltdm4JcjUsIHI1Ci0KLQlhZGQJcjEsIHIxMwotCWFkZAlyMTIsIHIyCi0JYWRkCXI5LCByOQotCWNtcAlyMSwgcjE0Ci0JY21wCXI4LCByMAotCWNtcAlyMTIsIHIxNAotCW1vdglyMCwgcjkKLQltb3YJcjksIHI0Ci0JbW92CXI4LCByOAotCWJ4CXI3Ci0JYngJcjgKLQkuYWxpZ24gMAotCWJ4CXBjCi0KLQlsZHIJcjMsIFtwYywgIzEyOF0KLQlsZHIJcjQsIGJhcgotCi0Jc3RyCXIwLCBbcjEsIHIyXQotCXN0cmIJcjEsIFtyMiwgcjRdCi0JbGRyCXI1LCBbcjYsIHI3XQotCWxkcmIJcjIsIFtyNCwgcjVdCi0JCi0JLmFsaWduIDAKLWJhcjoJCi0Jc3RyaAlyMSwgW3IyLCByM10KLQlsZHJoCXIzLCBbcjQsIHIwXQotCWxkc2IJcjEsIFtyNiwgcjddCi0JbGRzaAlyMiwgW3IwLCByNV0KLQotCXN0cglyMywgW3IzLCAjMTI0XQotCWxkcglyMSwgW3I0LCAjMTI0XQotCWxkcglyNSwgW3I1XQotCXN0cmIJcjEsIFtyNSwgIzMxXQotCXN0cmIJcjEsIFtyNCwgIzVdCi0Jc3RyYglyMiwgW3I2XQotCi0Jc3RyaAlyNCwgW3I1LCAjNjJdCi0JbGRyaAlyNSwgW3IwLCAjNF0KLQlsZHJoCXIzLCBbcjJdCi0KLQlzdHIJcjMsIFtyMTMsICMxMDIwXQotCWxkcglyMSwgW3IxMywgIzQ0XQotCWxkcglyMiwgW3IxM10KLQotCWFkZAlyNywgcjE1LCAjMTAyMAotCWFkZAlyNCwgcjEzLCAjNTEyCi0KLQlhZGQJcjEzLCAjMjY4Ci0JYWRkCXIxMywgIy0xMDQKLQlzdWIJcjEzLCAjMjY4Ci0Jc3ViCXIxMywgIy0xMDgKLQotCXB1c2gJe3IwLCByMSwgcjIsIHI0fQotCXB1c2gJe3IwLCByMy1yNywgbHJ9Ci0JcG9wCXtyMywgcjQsIHI3fQotCXBvcAl7cjAtcjcsIHIxNX0KLQotCXN0bWlhCXIzISwge3IwLCByMSwgcjQtcjd9Ci0JbGRtaWEJcjAhLCB7cjEtcjd9Ci0KLQliZXEJYmFyCi0JYm5lCWJhcgotCWJjcwliYXIKLQliY2MJYmFyCi0JYm1pCWJhcgotCWJwbAliYXIKLQlidnMJYmFyCi0JYnZjCWJhcgotCWJoaQliYXIKLQlibHMJYmFyCi0JYmdlCWJhcgotCWJndAliYXIKLQlibHQJYmFyCi0JYmd0CWJhcgotCWJsZQliYXIKLQliaGkJYmFyCi0JYmxvCWJhcgotCWJ1bAliYXIKLQotY2xvc2U6Ci0JbHNsCXI0LCByNSwgI25lYXIgLSBjbG9zZQotbmVhcjoKLQlhZGQJcjIsIHIzLCAjbmVhciAtIGNsb3NlCi0KLQlhZGQJc3AsIHNwLCAjMTI3IDw8IDIKLQlzdWIJc3AsIHNwLCAjMTI3IDw8IDIKLQlhZGQJcjAsIHNwLCAjMjU1IDw8IDIKLQlhZGQJcjAsIHBjLCAjMjU1IDw8IDIKLQotCWFkZAlzcCwgc3AsICNiYXIgLSAuZm9vCi0Jc3ViCXNwLCBzcCwgI2JhciAtIC5mb28KLQlhZGQJcjAsIHNwLCAjYmFyIC0gLmZvbwotCWFkZAlyMCwgcGMsICNiYXIgLSAuZm9vCi0KLQlhZGQJcjEsICNiYXIgLSAuZm9vCi0JbW92CXI2LCAjYmFyIC0gLmZvbwotCWNtcAlyNywgI2JhciAtIC5mb28KLQotCW5vcAotCW5vcAotCi0JLmFybQotLmxvY2FsYmFyOgotCWIJLmxvY2FsYmFyCi0JYgkud29tYmF0Ci0JYmwJLmxvY2FsYmFyCi0JYmwJLndvbWJhdAotCi0JYngJcjAKLQlzd2kJMHgxMjM0NTYKLQotCS50aHVtYgotCUAgVGhlIGZvbGxvd2luZyB3aWxsIGJlIGRpc2Fzc2VtYmxlZCBpbmNvcnJlY3RseSBpZiB3ZSBkbyBub3QKLQlAIGhhdmUgYSBUaHVtYiBzeW1ib2wgZGVmaW5lZCBiZWZvcmUgdGhlIGZpcnN0IFRodW1iIGluc3RydWN0aW9uOgotbW9yZXRodW1iOgotCWFkcglyMCwgZm9yd2FyZG9ubHkKLQotCWIJLmZvbwotCWIJLndvbWJhdAotCWJsCS5mb28KLQlibAkud29tYmF0Ci0KLQlieAlyMAotCi0Jc3dpCTB4ZmYKLQkuYWxpZ24JMAotZm9yd2FyZG9ubHk6Ci0JYmVxCS53b21iYXQKLQlibmUJLndvbWJhdAotCWJjcwkud29tYmF0Ci0JYmNjCS53b21iYXQKLQlibWkJLndvbWJhdAotCWJwbAkud29tYmF0Ci0JYnZzCS53b21iYXQKLQlidmMJLndvbWJhdAotCWJoaQkud29tYmF0Ci0JYmxzCS53b21iYXQKLQliZ2UJLndvbWJhdAotCWJndAkud29tYmF0Ci0JYmx0CS53b21iYXQKLQliZ3QJLndvbWJhdAotCWJsZQkud29tYmF0Ci0JYmhpCS53b21iYXQKLQlibG8JLndvbWJhdAotCWJ1bAkud29tYmF0Ci0KLS5iYWNrOgotCWJsCS5sb2NhbAotCS5zcGFjZQkoMSA8PCAxMSkJQCBsZWF2ZSBzcGFjZSB0byBmb3JjZSBsb25nIG9mZnNldHMKLS5sb2NhbDoKLQlibAkuYmFjawpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDEwdi9kMTAuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDEwdi9kMTAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDQzNzI4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QxMHYvZDEwLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMKLSMgRHJpdmVyIGZvciBEMTBWIGFzc2VtYmxlciB0ZXN0c3VpdGUKLSMKLXByb2MgcnVuX2xpc3RfdGVzdCB7IG5hbWUgb3B0cyB9IHsKLSAgZ2xvYmFsIHNyY2RpciBzdWJkaXIKLSAgc2V0IHRlc3RuYW1lICJEMTBWICRuYW1lIgotICBzZXQgZmlsZSAkc3JjZGlyLyRzdWJkaXIvJG5hbWUKLSAgZ2FzX3J1biAke25hbWV9LnMgJG9wdHMgIj4mZHVtcC5vdXQiCi0gIGlmIHtbcmVnZXhwX2RpZmYgImR1bXAub3V0IiAiJHtmaWxlfS5sIl0gfSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLSAgICB2ZXJib3NlICJvdXRwdXQgaXMgW2ZpbGVfY29udGVudHMgImR1bXAub3V0Il0iIDIKLSAgICByZXR1cm4KLSAgfQotICBwYXNzICR0ZXN0bmFtZQotfQotCi1pZiB7W2lzdGFyZ2V0IGQxMHYtKi0qXX0gewotICBydW5fZHVtcF90ZXN0ICJpbnN0IgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDEwdi9pbnN0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMTB2L2luc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzZGFmYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMTB2L2luc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBEMTBWIGJhc2ljIGluc3RydWN0aW9uIHRlc3Qgb3V0cHV0Ci0jYXM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDEwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8c3RhcnQ+OgotICAgMDoJYTkgMDQgYzIgMjkgCXNhYwlyMCwgYTAJPC0Jc2FjaGkJcjEsIGEwCi0gICA0OglhOSAwNiBjMiAyZCAJcmFjCXIwLCBhMCwgLTB4Mgk8LQlyYWNoaQlyMSwgYTAsIC0weDIKLSAgIDg6CTJmIDAwIDMyIDI2IAlub3AJCXx8CXNsYWUJYTAsIHIzCi0gICBjOglmMiAxMSAwOCAwMCAJbGQJcjEsIEAweDgwMAotICAxMDoJZjMgMDEgMDggMDAgCWxkMncJcjAsIEAweDgwMAotICAxNDoJZjcgMDEgMDggMDAgCXN0MncJcjAsIEAweDgwMAotICAxODoJZjYgMTEgMDggMDAgCXN0CXIxLCBAMHg4MDAKLSAgMWM6CTZmIDAwIDVlIDAwIAlub3AJCS0+CW5vcAkKLSAgMjA6CTZmIDAwIDVlIDAwIAlub3AJCS0+CW5vcAkKLSAgMjQ6CTJmIDAwIDVlIDAwIAlub3AJCXx8CW5vcAkKLSAgMjg6CWFmIDAwIDVlIDAwIAlub3AJCTwtCW5vcAkKLSAgMmM6CTIzIDExIGRlIDAwIAlub3QJcjEJfHwJbm9wCQotICAzMDoJNjMgMjEgZGUgMDAgCW5vdAlyMgktPglub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMTB2L2luc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QxMHYvaW5zdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTBmYTc0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QxMHYvaW5zdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyB0ZXN0IGFsbCBpbnN0cnVjdGlvbnMuIEZJWE1FOiBtYW55IGluc3RydWN0aW9ucyBtaXNzaW5nLgotCi1zdGFydDoKLQlzYWNoaQlyMSwgYTAKLQlzYWMJcjAsIGEwCi0JIwotCSMgZGlzYXNzZW1ibGVyIHRlc3QuIHNhY2hpJnNhYyBzaG91bGQgbm90IAotCSMgYmUgY29uZnVzZWQgd2l0aCByYWNoaSZyYWMKLQkjCi0JcmFjaGkJcjEsIGEwLCAtMHgyCi0JcmFjCXIwLCBhMCwgLTB4MgotCXNsYWUJYTAsIHIzCi0JbGQJcjEsIEAweDA4MDAKLQlsZDJ3CXIwLCBAMHgwODAwCi0Jc3QydwlyMCwgQDB4MDgwMAotCXN0CXIxLCBAMHgwODAwCi0KLSMgVkxJVyBzeW50YXggdGVzdAotCW5vcAotCW5vcAotCW5vcAktPglub3AKLQlub3AJfHwJbm9wCi0Jbm9wCTwtCW5vcAotCi0jIHRyeSBjaGFuZ2luZyBzZWN0aW9ucwotCW5vdAlyMQotCS5zZWN0aW9uIC5mb28KLQlhZGQzCXIxMCxyMTIsNgotCS50ZXh0Ci0Jbm90CXIyCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Njc2OGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hbGlnbi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgYWxpZ25tZW50IHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8c3RhcnQ+OgotICAgMDoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0gICA4OgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLSAgMTA6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQotICAxODoJMDBmMDAwMDAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0gIDIwOgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLSAgMjg6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQotICAzMDoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDAzOWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hbGlnbi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyB0ZXN0cyBwcm9wZXIgaGFuZGxpbmcgb2YgYWxpZ25zIG9uIEQzMFYKLQotCS50ZXh0Ci0JLmFsaWduIDMKLXN0YXJ0OgotCWFicwlyMjEscjQyCi0JLmFsaWduIDMKLQlhYnMJcjIxLHI0MgotCS5hbGlnbiA0Ci0JYWJzCXIyMSxyNDIKLQkuYWxpZ24gNAotCWFicwlyMjEscjQyCi0JCi0JLmRhdGEKLQkubG9uZwkweGRlYWRiZWVmCi0JCi0JLnRleHQKLQlhYnMJcjIxLHI0MgotCi0JLmRhdGEKLQkuYWxpZ24gNAotCS5sb25nCTB4ZGVhZGJlZWYKLQkKLQkudGV4dAotCS5hbGlnbiAzCi0JYWJzCXIyMSxyNDIKLQkuZW5kCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxYmMzMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBhcnJheSB0ZXN0Ci0jYXM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAgPF9fZm9vLTB4NDg+OgotICAgMDoJODgwODIwYzAgODAwMDAwNDggCWFkZC5sCXIyLCByMywgMHg0OAotCQkJMDogUl9EMzBWXzMyCS50ZXh0Ci0gICA4Ogk4ODA4MjBjMCA4MDAwMDA0OSAJYWRkLmwJcjIsIHIzLCAweDQ5Ci0JCQk4OiBSX0QzMFZfMzIJLnRleHQKLSAgMTA6CTg4MDgyMGMwIDgwMDAwMDRhIAlhZGQubAlyMiwgcjMsIDB4NGEKLQkJCTEwOiBSX0QzMFZfMzIJLnRleHQKLSAgMTg6CTg4MDgyMGMwIDgwMDAwMDRiIAlhZGQubAlyMiwgcjMsIDB4NGIKLQkJCTE4OiBSX0QzMFZfMzIJLnRleHQKLSAgMjA6CTg4MDgyMGMwIDgwMDAwMDRjIAlhZGQubAlyMiwgcjMsIDB4NGMKLQkJCTIwOiBSX0QzMFZfMzIJLnRleHQKLSAgMjg6CTg4MDgyMGMwIDgwMDAwMDRkIAlhZGQubAlyMiwgcjMsIDB4NGQKLQkJCTI4OiBSX0QzMFZfMzIJLnRleHQKLSAgMzA6CTg4MDgyMGMwIDgwMDAwMDRlIAlhZGQubAlyMiwgcjMsIDB4NGUKLQkJCTMwOiBSX0QzMFZfMzIJLnRleHQKLSAgMzg6CTg4MDgyMGMwIDgwMDAwMDRmIAlhZGQubAlyMiwgcjMsIDB4NGYKLQkJCTM4OiBSX0QzMFZfMzIJLnRleHQKLSAgNDA6CTg4MDgyMGMwIDgwMDAwMDUwIAlhZGQubAlyMiwgcjMsIDB4NTAKLQkJCTQwOiBSX0QzMFZfMzIJLnRleHQKLQotMCswMDQ4IDxfX2Zvbz46Ci0gIDQ4OgkxMjM0NTY3OCAxMjM0NTY3OCAJLmxvbmcJMHgxMjM0NTY3OAl8fAkubG9uZwkweDEyMzQ1Njc4Ci0gIDUwOgkxMjM0NTY3OCAwMDAwMDAwMCAgICAgIAkubG9uZwkweDEyMzQ1Njc4CXx8CWJyYS5zCXIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMTg3ZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hcnJheS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyBEMzBWIGFycmF5IHRlc3QKLQkudGV4dAotCWFkZCByMiwgcjMgLCBfX2ZvbwotCWFkZCByMiwgcjMgLCBfX2ZvbysxCi0JYWRkIHIyLCByMyAsIF9fZm9vKzIKLQlhZGQgcjIsIHIzICwgX19mb28rMwotCWFkZCByMiwgcjMgLCBfX2Zvbys0Ci0JYWRkIHIyLCByMyAsIF9fZm9vKzUKLQlhZGQgcjIsIHIzICwgX19mb28rNgotCWFkZCByMiwgcjMgLCBfX2Zvbys3Ci0JYWRkIHIyLCByMyAsIF9fZm9vKzgKLV9fZm9vOgotCS5pbnQgMHgxMjM0NTY3OAotICAgICAgICAuaW50IDB4MTIzNDU2NzgKLSAgICAgICAgLmludCAweDEyMzQ1Njc4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTZhYjQ2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgYml0dGVzdCBvcHQKLSNhczogLVdPCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMDBmMDAwMDAgODQ0MDEwODMgCW5vcAkJLT4JbGR3LnMJcjEsIEBcKHIyLCByM1wpCi0gICA4OgkwNDQwNjE0NCAwMGYwMDAwMCAJbGR3LnMJcjYsIEBcKHI1LCByNFwpCXx8CW5vcAkKLSAgMTA6CTAwZjAwMDAwIDgyMjAxMDgzIAlub3AJCS0+CWJzZXQJcjEsIHIyLCByMwotICAxODoJODBmMDAwMDAgMDIwMDEwODMgCW5vcAkJPC0JYnRzdAlmMSwgcjIsIHIzCi0gIDIwOgkwMGYwMDAwMCAwMjMwMTA4MyAJbm9wCQl8fAliY2xyCXIxLCByMiwgcjMKLSAgMjg6CTAwZjAwMDAwIDgyMTAxMDgzIAlub3AJCS0+CWJub3QJcjEsIHIyLCByMwotICAzMDoJMDIxMDEwODMgODBmMDAwMDAgCWJub3QJcjEsIHIyLCByMwktPglub3AJCi0gIDM4OgkwNDdjMDEwNSAwMjIwMTA4MyAJbW9kZGVjCXI0LCAweDUJfHwJYnNldAlyMSwgcjIsIHIzCi0gIDQwOgkwMjIwMTA4MyA4NDdjMDEwNSAJYnNldAlyMSwgcjIsIHIzCS0+CW1vZGRlYwlyNCwgMHg1Ci0gIDQ4OgkwMjIwMTA4MyAwOGMwNDE0NiAJYnNldAlyMSwgcjIsIHIzCXx8CWpvaW5sbC5zCXI0LCByNSwgcjYKLSAgNTA6CTAyMjAxMDgzIDA4YzA0MTQ2IAlic2V0CXIxLCByMiwgcjMJfHwJam9pbmxsLnMJcjQsIHI1LCByNgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZDFiN2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6IFdhcm5pbmc6IFN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJzZXQgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJ0c3QgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJjbHIgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJub3QgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogRXhlY3V0aW5nIGJzZXQgaW4gSVUgbWF5IG5vdCB3b3JrCi0uKjogV2FybmluZzogU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIKLUdBUyBMSVNUSU5HIC4qCi0KLQotICAgMSAgICAgICAgICAgICAgCSMgYml0dGVzdC5zCi0gICAyICAgICAgICAgICAgICAJIwotICAgMyAgICAgICAgICAgICAgCSMgQml0IG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgXChCQ0xSLCBCTk9ULCBCU0VULCBCVFNUXCkgc2hvdWxkIG5vdCBiZSBwbGFjZWQgaW4gSVUuCi0gICA0ICAgICAgICAgICAgICAJIyBJZiB0aGUgdXNlciBzcGVjaWZpY2FsbHkgaW5kaWNhdGVzIHRoZXkgc2hvdWxkIGJlIGluIHRoZSBJVSwgR0FTIHdpbGwKLSAgIDUgICAgICAgICAgICAgIAkjIGdlbmVyYXRlIHdhcm5pbmdzLiBUaGUgcmVhc29uIHdoeSB0aGlzIGlzIG5vdCBhbiBlcnJvciBpcyB0aGF0IHRob3NlIGluc3RydWN0aW9ucyAKLSAgIDYgICAgICAgICAgICAgIAkjIHdpbGwgZmFpbCBpbiBJVSBvbmx5IG9jY2FzaW9uYWxseS4gVGh1cyBHQVMgc2hvdWxkIHBhY2sgdGhlbSBpbiBNVSBmb3IKLSAgIDcgICAgICAgICAgICAgIAkjIHNhZmV0eSwgYW5kIGl0IGp1c3QgbmVlZHMgdG8gZHJhdyBhdHRlbnRpb24gd2hlbiBhIHZpb2xhdGlvbiBpcyBnaXZlbi4gCi0gICA4ICAgICAgICAgICAgICAJCi0gICA5ICAgICAgICAgICAgICAJCQotICAxMCAwMDAwIDAwRjAwMDAwIAkJbm9wIC0+IGxkdyBSMSwgQFwoUjIsUjNcKQotICAxMCAgICAgIDg0NDAxMDgzIAotICAxMSAwMDA4IDA0NDA2MTQ0IAkgICAgICAgIG5vcCB8fCBsZHcgUjYsIEBcKFI1LFI0XCkKLS4qICBXYXJuaW5nOlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyCi0gIDExICAgICAgMDBGMDAwMDAgCi0gIDEyICAgICAgICAgICAgICAJICAgICAgICAKLSAgMTMgMDAxMCAwMEYwMDAwMCAJICAgICAgICBub3AgLT4gQlNFVCBSMSwgUjIsIFIzIAotLiogIFdhcm5pbmc6RXhlY3V0aW5nIGJzZXQgaW4gSVUgbWF5IG5vdCB3b3JrCi0gIDEzICAgICAgODIyMDEwODMgCi0gIDE0IDAwMTggODBGMDAwMDAgCSAgICAgICAgbm9wIDwtIEJUU1QgRjEsIFIyLCBSMyAKLS4qICBXYXJuaW5nOkV4ZWN1dGluZyBidHN0IGluIElVIG1heSBub3Qgd29yawotICAxNCAgICAgIDAyMDAxMDgzIAotICAxNSAwMDIwIDAwRjAwMDAwIAkgICAgICAgIG5vcCB8fCBCQ0xSIFIxLCBSMiwgUjMKLS4qICBXYXJuaW5nOkV4ZWN1dGluZyBiY2xyIGluIElVIG1heSBub3Qgd29yawotICAxNSAgICAgIDAyMzAxMDgzIAotICAxNiAwMDI4IDAwRjAwMDAwIAkgICAgICAgIG5vcCAtPiBCTk9UIFIxLCBSMiwgUjMKLS4qICBXYXJuaW5nOkV4ZWN1dGluZyBibm90IGluIElVIG1heSBub3Qgd29yawotICAxNiAgICAgIDgyMTAxMDgzIAotICAxNyAwMDMwIDAyMTAxMDgzIAkgICAgICAgIEJOT1QgcjEsIHIyLCByMyAtPiBub3AKLSAgMTcgICAgICA4MEYwMDAwMCAKLSAgMTggICAgICAgICAgICAgIAkgICAgICAgIAotICAxOSAwMDM4IDA0N0MwMTA1IAkgICAgICAgIGJzZXQgcjEsIHIyLCByMyB8fCBtb2RkZWMgcjQsIDUKLS4qICBXYXJuaW5nOlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyCi0gIDE5ICAgICAgMDIyMDEwODMgCi0gIDIwICAgICAgICAgICAgICAJCi0gIDIxICAgICAgICAgICAgICAJICAgICAgICBic2V0IHIxLCByMiwgcjMKLSAgMjIgMDA0MCAwMjIwMTA4MyAJICAgICAgICBtb2RkZWMgcjQsIDUKLSAgMjIgICAgICA4NDdDMDEwNSAKLSAgMjMgICAgICAgICAgICAgIAkKLSAgMjQgICAgICAgICAgICAgIAkgICAgICAgIGJzZXQgcjEsIHIyLCByMwotICAyNSAwMDQ4IDAyMjAxMDgzIAkgICAgICAgIGpvaW5sbCByNCwgcjUsIHI2Ci0gIDI1ICAgICAgODhDMDQxNDYgCi0gIDI2ICAgICAgICAgICAgICAJCi0gIDI3ICAgICAgICAgICAgICAJICAgICAgICBqb2lubGwgcjQsIHI1LCByNgotICAyOCAwMDUwIDgyMjAxMDgzIAkgICAgICAgIGJzZXQgcjEsIHIyLCByMwotICAyOCAgICAgIDA4QzA0MTQ2IApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5YTU2Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QucworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMgYml0dGVzdC5zCi0jCi0jIEJpdCBvcGVyYXRpb24gaW5zdHJ1Y3Rpb25zIChCQ0xSLCBCTk9ULCBCU0VULCBCVFNUKSBzaG91bGQgbm90IGJlIHBsYWNlZCBpbiBJVS4KLSMgSWYgdGhlIHVzZXIgc3BlY2lmaWNhbGx5IGluZGljYXRlcyB0aGV5IHNob3VsZCBiZSBpbiB0aGUgSVUsIEdBUyB3aWxsCi0jIGdlbmVyYXRlIHdhcm5pbmdzLiBUaGUgcmVhc29uIHdoeSB0aGlzIGlzIG5vdCBhbiBlcnJvciBpcyB0aGF0IHRob3NlIGluc3RydWN0aW9ucyAKLSMgd2lsbCBmYWlsIGluIElVIG9ubHkgb2NjYXNpb25hbGx5LiBUaHVzIEdBUyBzaG91bGQgcGFjayB0aGVtIGluIE1VIGZvcgotIyBzYWZldHksIGFuZCBpdCBqdXN0IG5lZWRzIHRvIGRyYXcgYXR0ZW50aW9uIHdoZW4gYSB2aW9sYXRpb24gaXMgZ2l2ZW4uIAotCi0JCi0Jbm9wIC0+IGxkdyBSMSwgQChSMixSMykKLSAgICAgICAgbm9wIHx8IGxkdyBSNiwgQChSNSxSNCkKLSAgICAgICAgCi0gICAgICAgIG5vcCAtPiBCU0VUIFIxLCBSMiwgUjMgCi0gICAgICAgIG5vcCA8LSBCVFNUIEYxLCBSMiwgUjMgCi0gICAgICAgIG5vcCB8fCBCQ0xSIFIxLCBSMiwgUjMKLSAgICAgICAgbm9wIC0+IEJOT1QgUjEsIFIyLCBSMwotICAgICAgICBCTk9UIHIxLCByMiwgcjMgLT4gbm9wCi0gICAgICAgIAotICAgICAgICBic2V0IHIxLCByMiwgcjMgfHwgbW9kZGVjIHI0LCA1Ci0KLSAgICAgICAgYnNldCByMSwgcjIsIHIzCi0gICAgICAgIG1vZGRlYyByNCwgNQotCi0gICAgICAgIGJzZXQgcjEsIHIyLCByMwotICAgICAgICBqb2lubGwgcjQsIHI1LCByNgotCi0gICAgICAgIGpvaW5sbCByNCwgcjUsIHI2Ci0gICAgICAgIGJzZXQgcjEsIHIyLCByMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9kMzAuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9kMzAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzViMGUwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZDMwLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMKLSMgRDMwViBhc3NlbWJsZXIgdGVzdHMKLSMKLQotcHJvYyBydW5fbGlzdF90ZXN0IHsgbmFtZSBvcHRzIH0gewotICBnbG9iYWwgc3JjZGlyIHN1YmRpcgotICBzZXQgdGVzdG5hbWUgIkQzMFYgJG5hbWUiCi0gIHNldCBmaWxlICRzcmNkaXIvJHN1YmRpci8kbmFtZQotICBnYXNfcnVuICR7bmFtZX0ucyAkb3B0cyAiPiZkdW1wLm91dCIKLSAgaWYge1tyZWdleHBfZGlmZiAiZHVtcC5vdXQiICIke2ZpbGV9LmwiXSB9IHsKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotICAgIHJldHVybgotICB9Ci0gIHBhc3MgJHRlc3RuYW1lCi19Ci0KLWlmIHtbaXN0YXJnZXQgZDMwdi0qLSpdfSB7Ci0gIHJ1bl9kdW1wX3Rlc3QgImluc3QiCi0gIHJ1bl9kdW1wX3Rlc3QgImFsaWduIgotICBydW5fZHVtcF90ZXN0ICJndWFyZCIKLSAgcnVuX2R1bXBfdGVzdCAiZ3VhcmQtZGVidWciCi0gIHJ1bl9kdW1wX3Rlc3QgInJlbG9jIgotICBydW5fZHVtcF90ZXN0ICJvcHQiCi0gIHJ1bl9kdW1wX3Rlc3QgImFycmF5IgotICBydW5fZHVtcF90ZXN0ICJsYWJlbCIKLSAgcnVuX2xpc3RfdGVzdCAid2Fybl9vZGRyZWciICItYWwiCi0gIHJ1bl9saXN0X3Rlc3QgImJpdHRlc3QiICItYWwiCi0gIHJ1bl9kdW1wX3Rlc3QgImJpdHRlc3QiCi0gIHJ1bl9saXN0X3Rlc3QgInNlcmlhbCIgIi1hbCIKLSAgcnVuX2xpc3RfdGVzdCAic2VyaWFsMiIgIi1hbCIKLSAgcnVuX2xpc3RfdGVzdCAic2VyaWFsMk8iICItYWwgLU8iCi0gIHJ1bl9kdW1wX3Rlc3QgIm11bCIKLX0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWExNTRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQtZGVidWcuZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNvYmpkdW1wOiAtbGRyCi0jbmFtZTogRDMwViBkZWJ1ZyAoLWcpIHRlc3QKLSNhczogLWcKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0uKjpbMC05XSsKLSAgIDA6CTA4MDAxMDgzIDAwZjAwMDAwIAlhZGQucwlyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAgODoJMDgwMDEwODMgMDBmMDAwMDAgCWFkZC5zCXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gIDEwOgkxODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMvdHgJcjEsIHIyLCByMwl8fAlub3AJCi0uKjpbMC05XSsKLSAgMTg6CTI4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy9meAlyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAyMDoJMzgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL3h0CXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gIDI4Ogk0ODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMveGYJcjEsIHIyLCByMwl8fAlub3AJCi0uKjpbMC05XSsKLSAgMzA6CTU4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy90dAlyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAzODoJNjgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL3RmCXIxLCByMiwgcjMJfHwJbm9wCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjIwZjdiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQtZGVidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgU2FtZSBhcyBndWFyZC5zIGJ1dCBoZXJlIHdlIGFyZSB0ZXN0aW5nIGRlYnVnICgtZykgYXNzZW1ibHkKLSMgT24gdGhlIEQzMFYsIGFzc2VtYmxpbmcgd2l0aCAtZyBzaG91bGQgZGlzYWJsZSB0aGUgVkxJVyBwYWNraW5nCi0jIGFuZCBwdXQgb25seSBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGxpbmUuCQotCi0JLnRleHQKLQotCWFkZAlyMSxyMixyMwotCWFkZC9hbAlyMSxyMixyMwotCWFkZC90eAlyMSxyMixyMwotCWFkZC9meAlyMSxyMixyMwotCWFkZC94dAlyMSxyMixyMwotCWFkZC94ZglyMSxyMixyMwotCWFkZC90dAlyMSxyMixyMwotCWFkZC90ZglyMSxyMixyMwotCi0JCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmYTJkYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBndWFyZGVkIGV4ZWN1dGlvbiB0ZXN0Ci0jYXM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAgPC50ZXh0PjoKLSAgIDA6CTA4MDAxMDgzIDg4MDAxMDgzIAlhZGQucwlyMSwgcjIsIHIzCS0+CWFkZC5zCXIxLCByMiwgcjMKLSAgIDg6CTE4MDAxMDgzIGE4MDAxMDgzIAlhZGQucy90eAlyMSwgcjIsIHIzCS0+CWFkZC5zL2Z4CXIxLCByMiwgcjMKLSAgMTA6CTM4MDAxMDgzIGM4MDAxMDgzIAlhZGQucy94dAlyMSwgcjIsIHIzCS0+CWFkZC5zL3hmCXIxLCByMiwgcjMKLSAgMTg6CTU4MDAxMDgzIGU4MDAxMDgzIAlhZGQucy90dAlyMSwgcjIsIHIzCS0+CWFkZC5zL3RmCXIxLCByMiwgcjMKLSAgMjA6CTA4MDAxMDgzIDg4MDAxMDgzIAlhZGQucwlyMSwgcjIsIHIzCS0+CWFkZC5zCXIxLCByMiwgcjMKLSAgMjg6CTE4MDAxMDgzIGE4MDAxMDgzIAlhZGQucy90eAlyMSwgcjIsIHIzCS0+CWFkZC5zL2Z4CXIxLCByMiwgcjMKLSAgMzA6CTM4MDAxMDgzIGM4MDAxMDgzIAlhZGQucy94dAlyMSwgcjIsIHIzCS0+CWFkZC5zL3hmCXIxLCByMiwgcjMKLSAgMzg6CTU4MDAxMDgzIGU4MDAxMDgzIAlhZGQucy90dAlyMSwgcjIsIHIzCS0+CWFkZC5zL3RmCXIxLCByMiwgcjMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5Y2QzMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIEQzMFYgZ3VhcmRlZCBleGVjdXRpb24gYXNzZW1ibHkgdGVzdAotCi0JLnRleHQKLQotCWFkZAlyMSxyMixyMwotCWFkZC9hbAlyMSxyMixyMwotCWFkZC90eAlyMSxyMixyMwotCWFkZC9meAlyMSxyMixyMwotCWFkZC94dAlyMSxyMixyMwotCWFkZC94ZglyMSxyMixyMwotCWFkZC90dAlyMSxyMixyMwotCWFkZC90ZglyMSxyMixyMwotCi0jIGNoZWNrIGNhc2Ugc2Vuc2l0aXZpdHkgdG9vCi0JQURECXIxLHIyLHIzCi0JQUREL0FMCXIxLHIyLHIzCi0JQUREL3R4CXIxLHIyLHIzCi0JYWRkL0ZYCXIxLHIyLHIzCi0JQUREL1hUCXIxLHIyLHIzCi0JQUREL1hGCXIxLHIyLHIzCi0JYWRkL1RUCXIxLHIyLHIzCi0JQUREL3RmCXIxLHIyLHIzCi0JCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NjFjYmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgYmFzaWMgaW5zdHJ1Y3Rpb24gdGVzdAotI2FzOgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPHN0YXJ0PjoKLSAgIDA6CTA4ODE1YTgwIDg4MDAxMDgzIAlhYnMJcjIxLCByNDIJLT4JYWRkLnMJcjEsIHIyLCByMwotICAgODoJMDgwYjJjZGEgMDBmMDAwMDAgCWFkZC5zCXI1MCwgcjUxLCAweDFhCXx8CW5vcAkKLSAgMTA6CTg4MGIyY2Y3IDhhYjFiZWVmIAlhZGQubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICAxODoJMDgxMDEwODMgODgxYjJjZGEgCWFkZDJoLnMJcjEsIHIyLCByMwktPglhZGQyaC5zCXI1MCwgcjUxLCAweDFhCi0gIDIwOgk4ODFiMmNmNyA4YWIxYmVlZiAJYWRkMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICAyODoJMDg0MDEwODMgODg0YjJjZGEgCWFkZGMucwlyMSwgcjIsIHIzCS0+CWFkZGMucwlyNTAsIHI1MSwgMHgxYQotICAzMDoJODg0YjJjZjcgOGFiMWJlZWYgCWFkZGMubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICAzODoJMDkwMDEwODMgODkwYjJjZGEgCWFkZGhsbGwucwlyMSwgcjIsIHIzCS0+CWFkZGhsbGwucwlyNTAsIHI1MSwgMHgxYQotICA0MDoJODkwYjJjZjcgOGFiMWJlZWYgCWFkZGhsbGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA0ODoJMDkxMDEwODMgODkxYjJjZGEgCWFkZGhsbGgucwlyMSwgcjIsIHIzCS0+CWFkZGhsbGgucwlyNTAsIHI1MSwgMHgxYQotICA1MDoJODkxYjJjZjcgOGFiMWJlZWYgCWFkZGhsbGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA1ODoJMDkyMDEwODMgODkyYjJjZGEgCWFkZGhsaGwucwlyMSwgcjIsIHIzCS0+CWFkZGhsaGwucwlyNTAsIHI1MSwgMHgxYQotICA2MDoJODkyYjJjZjcgOGFiMWJlZWYgCWFkZGhsaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA2ODoJMDkzMDEwODMgODkzYjJjZGEgCWFkZGhsaGgucwlyMSwgcjIsIHIzCS0+CWFkZGhsaGgucwlyNTAsIHI1MSwgMHgxYQotICA3MDoJODkzYjJjZjcgOGFiMWJlZWYgCWFkZGhsaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA3ODoJMDk0MDEwODMgODk0YjJjZGEgCWFkZGhobGwucwlyMSwgcjIsIHIzCS0+CWFkZGhobGwucwlyNTAsIHI1MSwgMHgxYQotICA4MDoJODk0YjJjZjcgOGFiMWJlZWYgCWFkZGhobGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA4ODoJMDk1MDEwODMgODk1YjJjZGEgCWFkZGhobGgucwlyMSwgcjIsIHIzCS0+CWFkZGhobGgucwlyNTAsIHI1MSwgMHgxYQotICA5MDoJODk1YjJjZjcgOGFiMWJlZWYgCWFkZGhobGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICA5ODoJMDk2MDEwODMgODk2YjJjZGEgCWFkZGhoaGwucwlyMSwgcjIsIHIzCS0+CWFkZGhoaGwucwlyNTAsIHI1MSwgMHgxYQotICBhMDoJODk2YjJjZjcgOGFiMWJlZWYgCWFkZGhoaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBhODoJMDk3MDEwODMgODk3YjJjZGEgCWFkZGhoaGgucwlyMSwgcjIsIHIzCS0+CWFkZGhoaGgucwlyNTAsIHI1MSwgMHgxYQotICBiMDoJODk3YjJjZjcgOGFiMWJlZWYgCWFkZGhoaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBiODoJMDg2MDEwODMgODg2YjJjZGEgCWFkZHMucwlyMSwgcjIsIHIzCS0+CWFkZHMucwlyNTAsIHI1MSwgMHgxYQotICBjMDoJODg2YjJjZjcgOGFiMWJlZWYgCWFkZHMubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBjODoJMDg3MDEwODMgODg3YjJjZGEgCWFkZHMyaC5zCXIxLCByMiwgcjMJLT4JYWRkczJoLnMJcjUwLCByNTEsIDB4MWEKLSAgZDA6CTg4N2IyY2Y3IDhhYjFiZWVmIAlhZGRzMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBkODoJMDM4MDEwODMgODM4YjJjZGEgCWFuZC5zCXIxLCByMiwgcjMJLT4JYW5kLnMJcjUwLCByNTEsIDB4MWEKLSAgZTA6CTgzOGIyY2Y3IDhhYjFiZWVmIAlhbmQubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotICBlODoJMDI4MDAwNDIgODI4ODMxMDUgCWFuZGZnCWYwLCBmMSwgZjIJLT4JYW5kZmcJZjMsIHMsIDB4NQotICBmMDoJMDhhMDEwODMgODhhODQxNDYgCWF2Zy5zCXIxLCByMiwgcjMJLT4JYXZnLnMJcjQsIHI1LCAweDYKLSAgZjg6CTg4YWIyY2Y3IDhhYjFiZWVmIAlhdmcubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDEwMDoJMDhiMDEwODMgODhiODQxNDYgCWF2ZzJoLnMJcjEsIHIyLCByMwktPglhdmcyaC5zCXI0LCByNSwgMHg2Ci0gMTA4Ogk4OGJiMmNmNyA4YWIxYmVlZiAJYXZnMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDExMDoJMDIzMDEwODMgODIzODQxNDYgCWJjbHIJcjEsIHIyLCByMwktPgliY2xyCXI0LCByNSwgMHg2Ci0gMTE4OgkwMjEwMTA4MyA4MjE4NWNjNiAJYm5vdAlyMSwgcjIsIHIzCS0+CWJub3QJcjUsIHI1MSwgMHg2Ci0gMTIwOgkwMDAwMDAyOSAwMGYwMDAwMCAJYnJhLnMJcjQxCXx8CW5vcAkKLSAxMjg6CTAwMDgwMDA4IDAwZjAwMDAwIAlicmEucwk0MAlcKDE2OCA8c3RhcnRcKzB4MTY4PlwpCXx8CW5vcAkKLSAxMzA6CTAwMDgxZTAxIDAwZjAwMDAwIAlicmEucwlmMDA4CVwoZjEzOCA8c3RhcnRcKzB4ZjEzOD5cKQl8fAlub3AJCi0gMTM4OgkwMDQ2OTAyYSAwMGYwMDAwMCAJYnJhdG56LnMJcjQxLCByNDIJfHwJbm9wCQotIDE0MDoJODA0YzEwMDAgODAwMGYwMGQgCWJyYXRuei5sCXIxLCBmMDBkCVwoZjE0ZCA8c3RhcnRcKzB4ZjE0ZD5cKQotIDE0ODoJODA0YzEwMzcgOGFiMWYwMGQgCWJyYXRuei5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjE1NSA8c3RhcnRcKzB4ZGVhZGYxNTU+XCkKLSAxNTA6CTAwNDI5MDJhIDAwZjAwMDAwIAlicmF0enIucwlyNDEsIHI0Mgl8fAlub3AJCi0gMTU4Ogk4MDQ4MTAwMCA4MDAwZjAwZCAJYnJhdHpyLmwJcjEsIGYwMGQJXChmMTY1IDxzdGFydFwrMHhmMTY1PlwpCi0gMTYwOgk4MDQ4MTAzNyA4YWIxZjAwZCAJYnJhdHpyLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMTZkIDxzdGFydFwrMHhkZWFkZjE2ZD5cKQotIDE2ODoJMDIyMDEwODMgODIyODVjYzYgCWJzZXQJcjEsIHIyLCByMwktPglic2V0CXI1LCByNTEsIDB4NgotIDE3MDoJMDAyMDAwMjkgMDBmMDAwMDAgCWJzci5zCXI0MQl8fAlub3AJCi0gMTc4OgkwMDI4MWUwMSAwMGYwMDAwMCAJYnNyLnMJZjAwOAlcKGYxODAgPHN0YXJ0XCsweGYxODA+XCkJfHwJbm9wCQotIDE4MDoJODAyODAwMzcgOGFiMWYwMGQgCWJzci5sCS0yMTUyMGZmMwlcKGRlYWRmMThkIDxzdGFydFwrMHhkZWFkZjE4ZD5cKQotIDE4ODoJMDA2NjkwMmEgMDBmMDAwMDAgCWJzcnRuei5zCXI0MSwgcjQyCXx8CW5vcAkKLSAxOTA6CTgwNmMxMDAwIDgwMDBmMDBkIAlic3J0bnoubAlyMSwgZjAwZAlcKGYxOWQgPHN0YXJ0XCsweGYxOWQ+XCkKLSAxOTg6CTgwNmMxMDM3IDhhYjFmMDBkIAlic3J0bnoubAlyMSwgLTIxNTIwZmYzCVwoZGVhZGYxYTUgPHN0YXJ0XCsweGRlYWRmMWE1PlwpCi0gMWEwOgkwMDYyOTAyYSAwMGYwMDAwMCAJYnNydHpyLnMJcjQxLCByNDIJfHwJbm9wCQotIDFhODoJODA2ODEwMDAgODAwMGYwMGQgCWJzcnR6ci5sCXIxLCBmMDBkCVwoZjFiNSA8c3RhcnRcKzB4ZjFiNT5cKQotIDFiMDoJODA2ODEwMzcgOGFiMWYwMGQgCWJzcnR6ci5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjFiZCA8c3RhcnRcKzB4ZGVhZGYxYmQ+XCkKLSAxYjg6CTAyMDAxMDgzIDgyMDg1Y2M2IAlidHN0CWYxLCByMiwgcjMJLT4JYnRzdAl2LCByNTEsIDB4NgotIDFjMDoJMDJjMDAwYzEgODJjMDk1MTUgCWNtcGVxLnMJZjAsIHIzLCByMQktPgljbXBuZS5zCWYxLCByMjAsIHIyMQotIDFjODoJMDJjMTI3ZTAgODJjMWIwYzQgCWNtcGd0LnMJZjIsIHIzMSwgcjMyCS0+CWNtcGdlLnMJZjMsIHIzLCByNAotIDFkMDoJMDJjMjQwYzQgODJjMmQwYzQgCWNtcGx0LnMJcywgcjMsIHI0CS0+CWNtcGxlLnMJdiwgcjMsIHI0Ci0gMWQ4OgkwMmMzNjBjNCA4MmMzZjBjNCAJY21wcHMucwl2YSwgcjMsIHI0CS0+CWNtcG5nLnMJYywgcjMsIHI0Ci0gMWUwOgkwMmQxMjdlMCA4MmQxYjBjNCAJY21wdWd0LnMJZjIsIHIzMSwgcjMyCS0+CWNtcHVnZS5zCWYzLCByMywgcjQKLSAxZTg6CTAyZDI0MGM0IDgyZDJkMGM0IAljbXB1bHQucwlzLCByMywgcjQJLT4JY21wdWxlLnMJdiwgcjMsIHI0Ci0gMWYwOgkwMTAwMTAwOCA4MTA4MTAyMCAJZGJyYS5zCXIxLCByOAktPglkYnJhLnMJcjEsIDEwMAlcKDJmMCA8c3RhcnRcKzB4MmYwPlwpCi0gMWY4Ogk4MTA4MTAzNyA4YWIxZjAwZCAJZGJyYS5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjIwNSA8c3RhcnRcKzB4ZGVhZGYyMDU+XCkKLSAyMDA6CTAxNDAyMDFmIDgxNDgyMDIwIAlkYnJhaS5zCTEwLCByMzEJLT4JZGJyYWkucwkxMCwgMTAwCVwoMzAwIDxzdGFydFwrMHgzMDA+XCkKLSAyMDg6CTgxNDgyMDM3IDhhYjFmMDBkIAlkYnJhaS5sCTEwLCAtMjE1MjBmZjMJXChkZWFkZjIxNSA8c3RhcnRcKzB4ZGVhZGYyMTU+XCkKLSAyMTA6CTAxMjAxMDA4IDAwZjAwMDAwIAlkYnNyLnMJcjEsIHI4CXx8CW5vcAkKLSAyMTg6CTAxMjgxMDIwIDAwZjAwMDAwIAlkYnNyLnMJcjEsIDEwMAlcKDMxOCA8c3RhcnRcKzB4MzE4PlwpCXx8CW5vcAkKLSAyMjA6CTgxMjgxMDM3IDhhYjFmMDBkIAlkYnNyLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMjJkIDxzdGFydFwrMHhkZWFkZjIyZD5cKQotIDIyODoJMDE2MDQwMWYgMDBmMDAwMDAgCWRic3JpLnMJMjAsIHIzMQl8fAlub3AJCi0gMjMwOgkwMTY4NDAyMCAwMGYwMDAwMCAJZGJzcmkucwkyMCwgMTAwCVwoMzMwIDxzdGFydFwrMHgzMzA+XCkJfHwJbm9wCQotIDIzODoJODE2ODQwMzcgOGFiMWYwMGQgCWRic3JpLmwJMjAsIC0yMTUyMGZmMwlcKGRlYWRmMjQ1IDxzdGFydFwrMHhkZWFkZjI0NT5cKQotIDI0MDoJMDExMDEwMjAgMDBmMDAwMDAgCWRqbXAucwlyMSwgcjMyCXx8CW5vcAkKLSAyNDg6CTgxMTgxMDAwIDgwMDBmMDBkIAlkam1wLmwJcjEsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMjUwOgk4MTE4MTAzNyA4YWIxZjAwZCAJZGptcC5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMjU4OgkwMTUwNjAyMCAwMGYwMDAwMCAJZGptcGkucwkzMCwgcjMyCXx8CW5vcAkKLSAyNjA6CTgxNTg2MDAwIDgwMDBmMDBkIAlkam1waS5sCTMwLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDI2ODoJODE1ODYwMzcgOGFiMWYwMGQgCWRqbXBpLmwJMzAsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAyNzA6CTAxMzAxMDIwIDAwZjAwMDAwIAlkanNyLnMJcjEsIHIzMgl8fAlub3AJCi0gMjc4Ogk4MTM4MTAwMCA4MDAwZjAwZCAJZGpzci5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDI4MDoJODEzODEwMzcgOGFiMWYwMGQgCWRqc3IubAlyMSwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDI4ODoJMDE3MDIwMjAgMDBmMDAwMDAgCWRqc3JpLnMJMTAsIHIzMgl8fAlub3AJCi0gMjkwOgk4MTc4NDAwMCA4MDAwZjAwZCAJZGpzcmkubAkyMCwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KLSAyOTg6CTgxNzg4MDM3IDhhYjFmMDBkIAlkanNyaS5sCTQwLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMmEwOgkwMDEwMDAyOSAwMGYwMDAwMCAJam1wLnMJcjQxCXx8CW5vcAkKLSAyYTg6CTAwMTgxZTAxIDAwZjAwMDAwIAlqbXAucwlmMDA4IDxzdGFydFwrMHhmMDA4Pgl8fAlub3AJCi0gMmIwOgk4MDE4MDAzNyA4YWIxZjAwZCAJam1wLmwJZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDJiODoJMDA1NjkwMmEgMDBmMDAwMDAgCWptcHRuei5zCXI0MSwgcjQyCXx8CW5vcAkKLSAyYzA6CTgwNWMxMDAwIDgwMDBmMDBkIAlqbXB0bnoubAlyMSwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KLSAyYzg6CTgwNWMxMDM3IDhhYjFmMDBkIAlqbXB0bnoubAlyMSwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDJkMDoJMDA1MjkwMmEgMDBmMDAwMDAgCWptcHR6ci5zCXI0MSwgcjQyCXx8CW5vcAkKLSAyZDg6CTgwNTgxMDAwIDgwMDBmMDBkIAlqbXB0enIubAlyMSwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KLSAyZTA6CTgwNTgxMDM3IDhhYjFmMDBkIAlqbXB0enIubAlyMSwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDJlODoJMDhjMDEwODQgODhjODEwOGYgCWpvaW5sbC5zCXIxLCByMiwgcjQJLT4Jam9pbmxsLnMJcjEsIHIyLCAweGYKLSAyZjA6CTg4YzgxMGI3IDhhYjFmMDBkIAlqb2lubGwubAlyMSwgcjIsIDB4ZGVhZGYwMGQKLSAyZjg6CTA4ZDAxMDg0IDg4ZDgxMDhmIAlqb2lubGgucwlyMSwgcjIsIHI0CS0+CWpvaW5saC5zCXIxLCByMiwgMHhmCi0gMzAwOgk4OGQ4MTBiNyA4YWIxZjAwZCAJam9pbmxoLmwJcjEsIHIyLCAweGRlYWRmMDBkCi0gMzA4OgkwOGUwMTA4NCA4OGU4MTA4ZiAJam9pbmhsLnMJcjEsIHIyLCByNAktPglqb2luaGwucwlyMSwgcjIsIDB4ZgotIDMxMDoJODhlODEwYjcgOGFiMWYwMGQgCWpvaW5obC5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDMxODoJMDhmMDEwODQgODhmODEwOGYgCWpvaW5oaC5zCXIxLCByMiwgcjQJLT4Jam9pbmhoLnMJcjEsIHIyLCAweGYKLSAzMjA6CTg4ZjgxMGI3IDhhYjFmMDBkIAlqb2luaGgubAlyMSwgcjIsIDB4ZGVhZGYwMGQKLSAzMjg6CTAwMzAwMDI5IDAwZjAwMDAwIAlqc3IucwlyNDEJfHwJbm9wCQotIDMzMDoJMDAzODFlMDEgMDBmMDAwMDAgCWpzci5zCWYwMDggPHN0YXJ0XCsweGYwMDg+CXx8CW5vcAkKLSAzMzg6CTgwMzgwMDM3IDhhYjFmMDBkIAlqc3IubAlkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMzQwOgkwMDc2OTAyYSAwMGYwMDAwMCAJanNydG56LnMJcjQxLCByNDIJfHwJbm9wCQotIDM0ODoJODA3YzEwMDAgODAwMGYwMGQgCWpzcnRuei5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDM1MDoJODA3YzEwMzcgOGFiMWYwMGQgCWpzcnRuei5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMzU4OgkwMDcyOTAyYSAwMGYwMDAwMCAJanNydHpyLnMJcjQxLCByNDIJfHwJbm9wCQotIDM2MDoJODA3ODEwMDAgODAwMGYwMGQgCWpzcnR6ci5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDM2ODoJODA3ODEwMzcgOGFiMWYwMGQgCWpzcnR6ci5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMzcwOgkwNDMwNjFjOCA4NDM0NjFjOCAJbGQyaC5zCXI2LCBAXChyNywgcjhcKQktPglsZDJoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzNzg6CTA0M2M2MWM4IDg0Mzg2MWRhIAlsZDJoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZDJoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzODA6CTg0Mzg2MWMwIDgwMDAxMjM0IAlsZDJoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDM4ODoJMDQ2MDYxYzggODQ2NDYxYzggCWxkMncucwlyNiwgQFwocjcsIHI4XCkJLT4JbGQydy5zCXI2LCBAXChyN1wrLCByOFwpCi0gMzkwOgkwNDZjNjFjOCA4NDY4NjFkYSAJbGQydy5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGQydy5zCXI2LCBAXChyNywgMHgxYVwpCi0gMzk4Ogk4NDY4NjFjMCA4MDAwMTIzNCAJbGQydy5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSAzYTA6CTA0NTA2MWM4IDg0NTQ2MWM4IAlsZDRiaC5zCXI2LCBAXChyNywgcjhcKQktPglsZDRiaC5zCXI2LCBAXChyN1wrLCByOFwpCi0gM2E4OgkwNDVjNjFjOCA4NDU4NjFkYSAJbGQ0YmgucwlyNiwgQFwocjctLCByOFwpCS0+CWxkNGJoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzYjA6CTg0NTg2MWMwIDgwMDAxMjM0IAlsZDRiaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSAzYjg6CTA0ZDA2MWM4IDg0ZDQ2MWM4IAlsZDRiaHUucwlyNiwgQFwocjcsIHI4XCkJLT4JbGQ0Ymh1LnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzYzA6CTA0ZGM2MWM4IDg0ZDg2MWRhIAlsZDRiaHUucwlyNiwgQFwocjctLCByOFwpCS0+CWxkNGJodS5zCXI2LCBAXChyNywgMHgxYVwpCi0gM2M4Ogk4NGQ4NjFjMCA4MDAwMTIzNCAJbGQ0Ymh1LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDNkMDoJMDQwMDYxYzggODQwNDYxYzggCWxkYi5zCXI2LCBAXChyNywgcjhcKQktPglsZGIucwlyNiwgQFwocjdcKywgcjhcKQotIDNkODoJMDQwYzYxYzggODQwODYxZGEgCWxkYi5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGRiLnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzZTA6CTg0MDg2MWMwIDgwMDAxMjM0IAlsZGIubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gM2U4OgkwNDkwNjFjOCA4NDk0NjFjOCAJbGRidS5zCXI2LCBAXChyNywgcjhcKQktPglsZGJ1LnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzZjA6CTA0OWM2MWM4IDg0OTg2MWRhIAlsZGJ1LnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGJ1LnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzZjg6CTg0OTg2MWMwIDgwMDAxMjM0IAlsZGJ1LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDQwMDoJMDQyMDYxYzggODQyNDYxYzggCWxkaC5zCXI2LCBAXChyNywgcjhcKQktPglsZGgucwlyNiwgQFwocjdcKywgcjhcKQotIDQwODoJMDQyYzYxYzggODQyODYxZGEgCWxkaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGRoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA0MTA6CTg0Mjg2MWMwIDgwMDAxMjM0IAlsZGgubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNDE4OgkwNDEwNjFjOCA4NDE0NjFjOCAJbGRoaC5zCXI2LCBAXChyNywgcjhcKQktPglsZGhoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA0MjA6CTA0MWM2MWM4IDg0MTg2MWRhIAlsZGhoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGhoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA0Mjg6CTg0MTg2MWMwIDgwMDAxMjM0IAlsZGhoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDQzMDoJMDRhMDYxYzggODRhNDYxYzggCWxkaHUucwlyNiwgQFwocjcsIHI4XCkJLT4JbGRodS5zCXI2LCBAXChyN1wrLCByOFwpCi0gNDM4OgkwNGFjNjFjOCA4NGE4NjFkYSAJbGRodS5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGRodS5zCXI2LCBAXChyNywgMHgxYVwpCi0gNDQwOgk4NGE4NjFjMCA4MDAwMTIzNCAJbGRodS5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA0NDg6CTA0NDA2MWM4IDg0NDQ2MWM4IAlsZHcucwlyNiwgQFwocjcsIHI4XCkJLT4JbGR3LnMJcjYsIEBcKHI3XCssIHI4XCkKLSA0NTA6CTA0NGM2MWM4IDg0NDg2MWRhIAlsZHcucwlyNiwgQFwocjctLCByOFwpCS0+CWxkdy5zCXI2LCBAXChyNywgMHgxYVwpCi0gNDU4Ogk4NDQ4NjFjMCA4MDAwMTIzNCAJbGR3LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDQ2MDoJOGI0ODEwOWYgMGI0MDEwODQgCW1hYzAJcjEsIHIyLCAweDFmCTwtCW1hYzAJcjEsIHIyLCByNAotIDQ2ODoJOGI0YzEwOWYgMGI0NDEwODQgCW1hYzEJcjEsIHIyLCAweDFmCTwtCW1hYzEJcjEsIHIyLCByNAotIDQ3MDoJOGI1ODEwOWYgMGI1MDEwODQgCW1hY3MwCXIxLCByMiwgMHgxZgk8LQltYWNzMAlyMSwgcjIsIHI0Ci0gNDc4Ogk4YjVjMTA5ZiAwYjU0MTA4NCAJbWFjczEJcjEsIHIyLCAweDFmCTwtCW1hY3MxCXIxLCByMiwgcjQKLSA0ODA6CTA0N2MwMDRhIDg0NzQwMDRhIAltb2RkZWMJcjEsIDB4YQktPgltb2RpbmMJcjEsIDB4YQotIDQ4ODoJOGI2ODEwOWYgMGI2MDEwODQgCW1zdWIwCXIxLCByMiwgMHgxZgk8LQltc3ViMAlyMSwgcjIsIHI0Ci0gNDkwOgk4YjZjMTA5ZiAwYjY0MTA4NCAJbXN1YjEJcjEsIHIyLCAweDFmCTwtCW1zdWIxCXIxLCByMiwgcjQKLSA0OTg6CThiMDgxMDhhIDBiMDAxMDg0IAltdWwJcjEsIHIyLCAweGEJPC0JbXVsCXIxLCByMiwgcjQKLSA0YTA6CThiNzgxMDlmIDBiNzAxMDg0IAltc3ViczAJcjEsIHIyLCAweDFmCTwtCW1zdWJzMAlyMSwgcjIsIHI0Ci0gNGE4Ogk4YjdjMTA5ZiAwYjc0MTA4NCAJbXN1YnMxCXIxLCByMiwgMHgxZgk8LQltc3ViczEJcjEsIHIyLCByNAotIDRiMDoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotIDRiODoJOGEwODEwOGEgMGEwMDEwODQgCW11bDJoCXIxLCByMiwgMHhhCTwtCW11bDJoCXIxLCByMiwgcjQKLSA0YzA6CThhNDgxMDhhIDBhNDAxMDg0IAltdWxoeGxsCXIxLCByMiwgMHhhCTwtCW11bGh4bGwJcjEsIHIyLCByNAotIDRjODoJOGE1ODEwOGEgMGE1MDEwODQgCW11bGh4bGgJcjEsIHIyLCAweGEJPC0JbXVsaHhsaAlyMSwgcjIsIHI0Ci0gNGQwOgk4YTY4MTA4YSAwYTYwMTA4NCAJbXVsaHhobAlyMSwgcjIsIDB4YQk8LQltdWxoeGhsCXIxLCByMiwgcjQKLSA0ZDg6CThhNzgxMDhhIDBhNzAxMDg0IAltdWxoeGhoCXIxLCByMiwgMHhhCTwtCW11bGh4aGgJcjEsIHIyLCByNAotIDRlMDoJOGI5MDAwNDQgMGExMDgwODQgCW11bHhzCWEwLCByMSwgcjQJPC0JbXVseDJoCXI4LCByMiwgcjQKLSA0ZTg6CThiODgxMDhhIDBiODAwMDQ0IAltdWx4CWExLCByMiwgMHhhCTwtCW11bHgJYTAsIHIxLCByNAotIDRmMDoJOGJmODIwNGEgMGJmMDEwMDQgCW12ZmFjYwlyMiwgYTEsIDB4YQk8LQltdmZhY2MJcjEsIGEwLCByNAotIDRmODoJOGI5ODEwOGEgMGExODgwOGEgCW11bHhzCWExLCByMiwgMHhhCTwtCW11bHgyaAlyOCwgcjIsIDB4YQotIDUwMDoJMDFlMGEwODAgODFlMGExYzAgCW12ZnN5cwlyMTAsIHBjCS0+CW12ZnN5cwlyMTAsIHJwdF9jCi0gNTA4OgkwMWUwYTAwMCA4MWUwYTAwMiAJbXZmc3lzCXIxMCwgcHN3CS0+CW12ZnN5cwlyMTAsIHBzd2gKLSA1MTA6CTAxZTBhMDAxIDgxZTBhMDAzIAltdmZzeXMJcjEwLCBwc3dsCS0+CW12ZnN5cwlyMTAsIGYwCi0gNTE4OgkwMWUwYTEwMyA4YWYwMTA4NCAJbXZmc3lzCXIxMCwgcwktPgltdnRhY2MJYTEsIHIyLCByNAotIDUyMDoJMDBlMDcyODAgODBlMDAyODAgCW12dHN5cwlycHRfYywgcjEwCS0+CW12dHN5cwlwc3csIHIxMAotIDUyODoJMDBlMDAyODIgODBlMDAyODEgCW12dHN5cwlwc3doLCByMTAJLT4JbXZ0c3lzCXBzd2wsIHIxMAotIDUzMDoJMDBlMDAyODMgODBlMDMyODMgCW12dHN5cwlmMCwgcjEwCS0+CW12dHN5cwlmMywgcjEwCi0gNTM4OgkwMGUwNDI4MyA4MGUwNTI4MyAJbXZ0c3lzCXMsIHIxMAktPgltdnRzeXMJdiwgcjEwCi0gNTQwOgkwMGUwNjI4MyA4MGUwNzI4MyAJbXZ0c3lzCXZhLCByMTAJLT4JbXZ0c3lzCWMsIHIxMAotIDU0ODoJMDBmMDAwMDAgODM5MDEwODAgCW5vcAkJLT4Jbm90CXIxLCByMgotIDU1MDoJMDI5MDEwODAgODNhMDEwODQgCW5vdGZnCWYxLCBmMgktPglvci5zCXIxLCByMiwgcjQKLSA1NTg6CTAzYTgxMDlhIDAwZjAwMDAwIAlvci5zCXIxLCByMiwgMHgxYQl8fAlub3AJCi0gNTYwOgk4M2E4MTBiNyA4YWIxZjAwZCAJb3IubAlyMSwgcjIsIDB4ZGVhZGYwMGQKLSA1Njg6CTAyYTAxMDg0IDgyYTg0MDgxIAlvcmZnCWYxLCBmMiwgcwktPglvcmZnCXMsIGYyLCAweDEKLSA1NzA6CTAwODAwMDAwIDAwZjAwMDAwIAlyZWl0CQl8fAlub3AJCi0gNTc4OgkwMTgwMTAwMiAwMGYwMDAwMCAJcmVwZWF0LnMJcjEsIHIyCXx8CW5vcAkKLSA1ODA6CTgxODg0MDAwIDgwMDBkZWFkIAlyZXBlYXQubAlyNCwgZGVhZAlcKGU0MmQgPHN0YXJ0XCsweGU0MmQ+XCkKLSA1ODg6CTgxODg0MDM3IDhhYjFmMDBkIAlyZXBlYXQubAlyNCwgLTIxNTIwZmYzCVwoZGVhZGY1OTUgPHN0YXJ0XCsweGRlYWRmNTk1PlwpCi0gNTkwOgkwMWEwYTAwMSA4MWE4YTIwMCAJcmVwZWF0aS5zCWEJXCg1OWEgPHN0YXJ0XCsweDU5YT5cKSwgcjEJLT4JcmVwZWF0aS5zCWEJXCg1OWEgPHN0YXJ0XCsweDU5YT5cKSwgMTAwMAlcKDE1OTAgPHN0YXJ0XCsweDE1OTA+XCkKLSA1OTg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLSA1YTA6CTAzNDAxMDg0IDgzNDgxMDhhIAlyb3QJcjEsIHIyLCByNAktPglyb3QJcjEsIHIyLCAweGEKLSA1YTg6CTAzNTAxMDg0IDgzNTgxMDhhIAlyb3QyaAlyMSwgcjIsIHI0CS0+CXJvdDJoCXIxLCByMiwgMHhhCi0gNWIwOgk4YTg4MTA4YSAwYTgwMTA4NCAJc2F0CXIxLCByMiwgMHhhCTwtCXNhdAlyMSwgcjIsIHI0Ci0gNWI4Ogk4YTk4MTA4YSAwYTkwMTA4NCAJc2F0MmgJcjEsIHIyLCAweGEJPC0Jc2F0MmgJcjEsIHIyLCByNAotIDVjMDoJOGJjODEwOGEgMGJjMDEwODQgCXNhdGhsCXIxLCByMiwgMHhhCTwtCXNhdGhsCXIxLCByMiwgcjQKLSA1Yzg6CThiZDgxMDhhIDBiZDAxMDg0IAlzYXRoaAlyMSwgcjIsIDB4YQk8LQlzYXRoaAlyMSwgcjIsIHI0Ci0gNWQwOgk4YWE4MTA4YSAwYWEwMTA4NCAJc2F0eglyMSwgcjIsIDB4YQk8LQlzYXR6CXIxLCByMiwgcjQKLSA1ZDg6CThhYjgxMDhhIDBhYjAxMDg0IAlzYXR6MmgJcjEsIHIyLCAweGEJPC0Jc2F0ejJoCXIxLCByMiwgcjQKLSA1ZTA6CTAzMDAxMDg0IDgzMDgxMDhhIAlzcmEJcjEsIHIyLCByNAktPglzcmEJcjEsIHIyLCAweGEKLSA1ZTg6CTAzMTAxMDg0IDgzMTgxMDhhIAlzcmEyaAlyMSwgcjIsIHI0CS0+CXNyYTJoCXIxLCByMiwgMHhhCi0gNWYwOgkwMzYwMTA4NCA4MzY4MTA4YSAJc3JjCXIxLCByMiwgcjQJLT4Jc3JjCXIxLCByMiwgMHhhCi0gNWY4OgkwMzIwMTA4NCA4MzI4MTA4YSAJc3JsCXIxLCByMiwgcjQJLT4Jc3JsCXIxLCByMiwgMHhhCi0gNjAwOgkwMzMwMTA4NCA4MzM4MTA4YSAJc3JsMmgJcjEsIHIyLCByNAktPglzcmwyaAlyMSwgcjIsIDB4YQotIDYwODoJMDUzMDYxYzggODUzNDYxYzggCXN0MmgucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3QyaC5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjEwOgkwNTNjNjFjOCA4NTM4NjFkYSAJc3QyaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3QyaC5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjE4Ogk4NTM4NjFjMCA4MDAwMTIzNCAJc3QyaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2MjA6CTA1NjA2MWM4IDg1NjQ2MWM4IAlzdDJ3LnMJcjYsIEBcKHI3LCByOFwpCS0+CXN0MncucwlyNiwgQFwocjdcKywgcjhcKQotIDYyODoJMDU2YzYxYzggODU2ODYxZGEgCXN0MncucwlyNiwgQFwocjctLCByOFwpCS0+CXN0MncucwlyNiwgQFwocjcsIDB4MWFcKQotIDYzMDoJODU2ODYxYzAgODAwMDEyMzQgCXN0MncubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNjM4OgkwNTUwNjFjOCA4NTU0NjFjOCAJc3Q0aGIucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3Q0aGIucwlyNiwgQFwocjdcKywgcjhcKQotIDY0MDoJMDU1YzYxYzggODU1ODYxZGEgCXN0NGhiLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdDRoYi5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjQ4Ogk4NTU4NjFjMCA4MDAwMTIzNCAJc3Q0aGIubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNjUwOgkwNTAwNjFjOCA4NTA0NjFjOCAJc3RiLnMJcjYsIEBcKHI3LCByOFwpCS0+CXN0Yi5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjU4OgkwNTBjNjFjOCA4NTA4NjFkYSAJc3RiLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdGIucwlyNiwgQFwocjcsIDB4MWFcKQotIDY2MDoJODUwODYxYzAgODAwMDEyMzQgCXN0Yi5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2Njg6CTA1MjA2MWM4IDg1MjQ2MWM4IAlzdGgucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3RoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2NzA6CTA1MmM2MWM4IDg1Mjg2MWRhIAlzdGgucwlyNiwgQFwocjctLCByOFwpCS0+CXN0aC5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjc4Ogk4NTI4NjFjMCA4MDAwMTIzNCAJc3RoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDY4MDoJMDUxMDYxYzggODUxNDYxYzggCXN0aGgucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3RoaC5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjg4OgkwNTFjNjFjOCA4NTE4NjFkYSAJc3RoaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3RoaC5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjkwOgk4NTE4NjFjMCA4MDAwMTIzNCAJc3RoaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2OTg6CTA1NDA2MWM4IDg1NDQ2MWM4IAlzdHcucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3R3LnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2YTA6CTA1NGM2MWM4IDg1NDg2MWRhIAlzdHcucwlyNiwgQFwocjctLCByOFwpCS0+CXN0dy5zCXI2LCBAXChyNywgMHgxYVwpCi0gNmE4Ogk4NTQ4NjFjMCA4MDAwMTIzNCAJc3R3LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDZiMDoJMDgyMDEwODMgODgyYjJjZGEgCXN1Yi5zCXIxLCByMiwgcjMJLT4Jc3ViLnMJcjUwLCByNTEsIDB4MWEKLSA2Yjg6CTg4MmIyY2Y3IDhhYjFiZWVmIAlzdWIubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDZjMDoJMDgzMDEwODMgODgzYjJjZGEgCXN1YjJoLnMJcjEsIHIyLCByMwktPglzdWIyaC5zCXI1MCwgcjUxLCAweDFhCi0gNmM4Ogk4ODNiMmNmNyA4YWIxYmVlZiAJc3ViMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDZkMDoJMDg1MDEwODMgODg1YjJjZGEgCXN1YmIucwlyMSwgcjIsIHIzCS0+CXN1YmIucwlyNTAsIHI1MSwgMHgxYQotIDZkODoJODg1YjJjZjcgOGFiMWJlZWYgCXN1YmIubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDZlMDoJMDk4MDEwODMgODk4YjJjZGEgCXN1YmhsbGwucwlyMSwgcjIsIHIzCS0+CXN1YmhsbGwucwlyNTAsIHI1MSwgMHgxYQotIDZlODoJODk4YjJjZjcgOGFiMWJlZWYgCXN1YmhsbGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDZmMDoJMDk5MDEwODMgODk5YjJjZGEgCXN1YmhsbGgucwlyMSwgcjIsIHIzCS0+CXN1YmhsbGgucwlyNTAsIHI1MSwgMHgxYQotIDZmODoJODk5YjJjZjcgOGFiMWJlZWYgCXN1YmhsbGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDcwMDoJMDlhMDEwODMgODlhYjJjZGEgCXN1YmhsaGwucwlyMSwgcjIsIHIzCS0+CXN1YmhsaGwucwlyNTAsIHI1MSwgMHgxYQotIDcwODoJODlhYjJjZjcgOGFiMWJlZWYgCXN1YmhsaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDcxMDoJMDliMDEwODMgODliYjJjZGEgCXN1YmhsaGgucwlyMSwgcjIsIHIzCS0+CXN1YmhsaGgucwlyNTAsIHI1MSwgMHgxYQotIDcxODoJODliYjJjZjcgOGFiMWJlZWYgCXN1YmhsaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDcyMDoJMDljMDEwODMgODljYjJjZGEgCXN1YmhobGwucwlyMSwgcjIsIHIzCS0+CXN1YmhobGwucwlyNTAsIHI1MSwgMHgxYQotIDcyODoJODljYjJjZjcgOGFiMWJlZWYgCXN1YmhobGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDczMDoJMDlkMDEwODMgODlkYjJjZGEgCXN1YmhobGgucwlyMSwgcjIsIHIzCS0+CXN1YmhobGgucwlyNTAsIHI1MSwgMHgxYQotIDczODoJODlkYjJjZjcgOGFiMWJlZWYgCXN1YmhobGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDc0MDoJMDllMDEwODMgODllYjJjZGEgCXN1YmhoaGwucwlyMSwgcjIsIHIzCS0+CXN1YmhoaGwucwlyNTAsIHI1MSwgMHgxYQotIDc0ODoJODllYjJjZjcgOGFiMWJlZWYgCXN1YmhoaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDc1MDoJMDlmMDEwODMgODlmYjJjZGEgCXN1YmhoaGgucwlyMSwgcjIsIHIzCS0+CXN1YmhoaGgucwlyNTAsIHI1MSwgMHgxYQotIDc1ODoJODlmYjJjZjcgOGFiMWJlZWYgCXN1YmhoaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgotIDc2MDoJMDA5MDAwMDEgMDBmMDAwMDAgCXRyYXAucwlyMQl8fAlub3AJCi0gNzY4OgkwMDk4MDAwYSAwMGYwMDAwMCAJdHJhcC5zCTB4YQl8fAlub3AJCi0gNzcwOgkwM2IwMTA4NCA4M2I4MTA4YSAJeG9yLnMJcjEsIHIyLCByNAktPgl4b3IucwlyMSwgcjIsIDB4YQotIDc3ODoJODNiODEwYjcgOGFiMWYwMGQgCXhvci5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDc4MDoJMDJiMDEwODQgODJiODExMGEgCXhvcmZnCWYxLCBmMiwgcwktPgl4b3JmZwlmMSwgcywgMHhhCi0gNzg4OgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCi0gNzkwOgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCi0gNzk4OgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0gN2EwOgk4MGYwMDAwMCAwMGYwMDAwMCAJbm9wCQk8LQlub3AJCi0gN2E4OgkwMzkwMTA4MCAwMGYwMDAwMCAJbm90CXIxLCByMgl8fAlub3AJCi0gN2IwOgkwMzkwMjBjMCA4MGYwMDAwMCAJbm90CXIyLCByMwktPglub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2luc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTY2MTFlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLSMgdGVzdCBhbGwgaW5zdHJ1Y3Rpb25zCi0KLXN0YXJ0OgotCWFicwlyMjEscjQyCi0KLQlhZGQJcjEscjIscjMKLQlhZGQJcjUwLHI1MSwweDFhCi0JYWRkCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkMmgJcjEscjIscjMKLQlhZGQyaAlyNTAscjUxLDB4MWEKLQlhZGQyaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGMJcjEscjIscjMKLQlhZGRjCXI1MCxyNTEsMHgxYQotCWFkZGMJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRobGxsCXIxLHIyLHIzCi0JYWRkaGxsbAlyNTAscjUxLDB4MWEKLQlhZGRobGxsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkaGxsaAlyMSxyMixyMwotCWFkZGhsbGgJcjUwLHI1MSwweDFhCi0JYWRkaGxsaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhsaGwJcjEscjIscjMKLQlhZGRobGhsCXI1MCxyNTEsMHgxYQotCWFkZGhsaGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRobGhoCXIxLHIyLHIzCi0JYWRkaGxoaAlyNTAscjUxLDB4MWEKLQlhZGRobGhoCXI1MCxyNTEsMHhkZWFkYmVlZgotCQkKLQlhZGRoaGxsCXIxLHIyLHIzCi0JYWRkaGhsbAlyNTAscjUxLDB4MWEKLQlhZGRoaGxsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkaGhsaAlyMSxyMixyMwotCWFkZGhobGgJcjUwLHI1MSwweDFhCi0JYWRkaGhsaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhoaGwJcjEscjIscjMKLQlhZGRoaGhsCXI1MCxyNTEsMHgxYQotCWFkZGhoaGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRoaGhoCXIxLHIyLHIzCi0JYWRkaGhoaAlyNTAscjUxLDB4MWEKLQlhZGRoaGhoCXI1MCxyNTEsMHhkZWFkYmVlZgotCQotCWFkZHMJcjEscjIscjMKLQlhZGRzCXI1MCxyNTEsMHgxYQotCWFkZHMJcjUwLHI1MSwweGRlYWRiZWVmCi0JCQotCWFkZHMyaAlyMSxyMixyMwotCWFkZHMyaAlyNTAscjUxLDB4MWEKLQlhZGRzMmgJcjUwLHI1MSwweGRlYWRiZWVmCi0JCQotCWFuZAlyMSxyMixyMwotCWFuZAlyNTAscjUxLDB4MWEKLQlhbmQJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhbmRmZwlmMCxmMSxmMgotCWFuZGZnCWYzLGY0LDUKLQkKLQlhdmcJcjEscjIscjMKLQlhdmcJcjQscjUsNgotCWF2ZwlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWF2ZzJoCXIxLHIyLHIzCi0JYXZnMmgJcjQscjUsNgotCWF2ZzJoCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYmNscglyMSxyMixyMwotCWJjbHIJcjQscjUsNgotCQotCWJub3QJcjEscjIscjMKLQlibm90CXI1LHI1MSw2Ci0JCQkKLQlicmEJcjQxCi0JYnJhCTB4NDAKLQlicmEJMHhmMDBkCi0KLQlicmF0bnoJcjQxLHI0MgotCWJyYXRueglyMSwweGYwMGQKLQlicmF0bnoJcjEsMHhkZWFkZjAwZAotCi0JYnJhdHpyCXI0MSxyNDIKLQlicmF0enIJcjEsMHhmMDBkCi0JYnJhdHpyCXIxLDB4ZGVhZGYwMGQKLQotCWJzZXQJcjEscjIscjMKLQlic2V0CXI1LHI1MSw2Ci0KLQlic3IJcjQxCi0JYnNyCTB4ZjAwZAotCWJzcgkweGRlYWRmMDBkCi0KLQlic3J0bnoJcjQxLHI0MgotCWJzcnRueglyMSwweGYwMGQKLQlic3J0bnoJcjEsMHhkZWFkZjAwZAotCi0JYnNydHpyCXI0MSxyNDIKLQlic3J0enIJcjEsMHhmMDBkCi0JYnNydHpyCXIxLDB4ZGVhZGYwMGQKLQotCWJ0c3QJZjEscjIscjMKLQlidHN0CWY1LHI1MSw2Ci0JCQkJCQkKLQljbXBlcQlmMCxyMyxyMQotCWNtcG5lCWYxLHIyMCxyMjEKLQljbXBndAlmMixyMzEscjMyCi0JY21wZ2UJZjMscjMscjQKLQljbXBsdAlmNCxyMyxyNAotCWNtcGxlCWY1LHIzLHI0Ci0JY21wcHMJZjYscjMscjQKLQljbXBuZwlmNyxyMyxyNAkJCQkKLQotCWNtcHVndAlmMixyMzEscjMyCi0JY21wdWdlCWYzLHIzLHI0Ci0JY21wdWx0CWY0LHIzLHI0Ci0JY21wdWxlCWY1LHIzLHI0Ci0JCQotCWRicmEJcjEscjggCi0JZGJyYQlyMSwweDEwMAotCWRicmEJcjEsMHhkZWFkZjAwZAotCi0JZGJyYWkJMHgxMCxyMzEKLQlkYnJhaQkweDEwLDB4MTAwCi0JZGJyYWkJMHgxMCwweGRlYWRmMDBkCi0KLQlkYnNyCXIxLHI4IHx8IG5vcAotCWRic3IJcjEsMHgxMDAgfHwgbm9wCi0JZGJzcglyMSwweGRlYWRmMDBkCi0KLQlkYnNyaQkweDIwLHIzMSB8fCBub3AKLQlkYnNyaQkweDIwLDB4MTAwIHx8IG5vcAotCWRic3JpCTB4MjAsMHhkZWFkZjAwZAotCi0JZGptcAlyMSxyMzIKLQlkam1wCXIxLDB4ZjAwZAotCWRqbXAJcjEsMHhkZWFkZjAwZAotCi0JZGptcGkJMHgzMCxyMzIKLQlkam1waQkweDMwLDB4ZjAwZAotCWRqbXBpCTB4MzAsMHhkZWFkZjAwZAotCi0JZGpzcglyMSxyMzIKLQlkanNyCXIxLDB4ZjAwZAotCWRqc3IJcjEsMHhkZWFkZjAwZAotCi0JZGpzcmkJMHgxMCxyMzIKLQlkanNyaQkweDIwLDB4ZjAwZAotCWRqc3JpCTB4NDAsMHhkZWFkZjAwZAotCQotCWptcAlyNDEKLQlqbXAJMHhmMDBkCi0Jam1wCTB4ZGVhZGYwMGQKLQotCWptcHRueglyNDEscjQyCi0Jam1wdG56CXIxLDB4ZjAwZAotCWptcHRueglyMSwweGRlYWRmMDBkCi0KLQlqbXB0enIJcjQxLHI0MgotCWptcHR6cglyMSwweGYwMGQKLQlqbXB0enIJcjEsMHhkZWFkZjAwZAotCi0Jam9pbmxsCXIxLHIyLHI0Ci0Jam9pbmxsCXIxLHIyLDB4ZgotCWpvaW5sbAlyMSxyMiwweGRlYWRmMDBkCQotCi0Jam9pbmxoCXIxLHIyLHI0Ci0Jam9pbmxoCXIxLHIyLDB4ZgotCWpvaW5saAlyMSxyMiwweGRlYWRmMDBkCQotCi0Jam9pbmhsCXIxLHIyLHI0Ci0Jam9pbmhsCXIxLHIyLDB4ZgotCWpvaW5obAlyMSxyMiwweGRlYWRmMDBkCQotCi0Jam9pbmhoCXIxLHIyLHI0Ci0Jam9pbmhoCXIxLHIyLDB4ZgotCWpvaW5oaAlyMSxyMiwweGRlYWRmMDBkCQotCi0JanNyCXI0MQotCWpzcgkweGYwMGQKLQlqc3IJMHhkZWFkZjAwZAotCi0JanNydG56CXI0MSxyNDIKLQlqc3J0bnoJcjEsMHhmMDBkCi0JanNydG56CXIxLDB4ZGVhZGYwMGQKLQotCWpzcnR6cglyNDEscjQyCi0JanNydHpyCXIxLDB4ZjAwZAotCWpzcnR6cglyMSwweGRlYWRmMDBkCi0JCQkJCQotCWxkMmgJcjYsQChyNyxyOCkKLQlsZDJoCXI2LEAocjcrLHI4KQotCWxkMmgJcjYsQChyNy0scjgpCi0JbGQyaAlyNixAKHI3LDB4MWEpCi0JbGQyaAlyNixAKHI3LDB4MTIzNCkKLQkKLQlsZDJ3CXI2LEAocjcscjgpCi0JbGQydwlyNixAKHI3KyxyOCkKLQlsZDJ3CXI2LEAocjctLHI4KQotCWxkMncJcjYsQChyNywweDFhKQotCWxkMncJcjYsQChyNywweDEyMzQpCi0JCi0JbGQ0YmgJcjYsQChyNyxyOCkKLQlsZDRiaAlyNixAKHI3KyxyOCkKLQlsZDRiaAlyNixAKHI3LSxyOCkKLQlsZDRiaAlyNixAKHI3LDB4MWEpCi0JbGQ0YmgJcjYsQChyNywweDEyMzQpCi0KLQlsZDRiaHUJcjYsQChyNyxyOCkKLQlsZDRiaHUJcjYsQChyNysscjgpCi0JbGQ0Ymh1CXI2LEAocjctLHI4KQotCWxkNGJodQlyNixAKHI3LDB4MWEpCi0JbGQ0Ymh1CXI2LEAocjcsMHgxMjM0KQotCi0JbGRiCXI2LEAocjcscjgpCi0JbGRiCXI2LEAocjcrLHI4KQotCWxkYglyNixAKHI3LSxyOCkKLQlsZGIJcjYsQChyNywweDFhKQotCWxkYglyNixAKHI3LDB4MTIzNCkKLQotCWxkYnUJcjYsQChyNyxyOCkKLQlsZGJ1CXI2LEAocjcrLHI4KQotCWxkYnUJcjYsQChyNy0scjgpCi0JbGRidQlyNixAKHI3LDB4MWEpCi0JbGRidQlyNixAKHI3LDB4MTIzNCkKLQotCWxkaAlyNixAKHI3LHI4KQotCWxkaAlyNixAKHI3KyxyOCkKLQlsZGgJcjYsQChyNy0scjgpCi0JbGRoCXI2LEAocjcsMHgxYSkKLQlsZGgJcjYsQChyNywweDEyMzQpCi0KLQlsZGhoCXI2LEAocjcscjgpCi0JbGRoaAlyNixAKHI3KyxyOCkKLQlsZGhoCXI2LEAocjctLHI4KQotCWxkaGgJcjYsQChyNywweDFhKQotCWxkaGgJcjYsQChyNywweDEyMzQpCi0KLQlsZGh1CXI2LEAocjcscjgpCi0JbGRodQlyNixAKHI3KyxyOCkKLQlsZGh1CXI2LEAocjctLHI4KQotCWxkaHUJcjYsQChyNywweDFhKQotCWxkaHUJcjYsQChyNywweDEyMzQpCi0KLQlsZHcJcjYsQChyNyxyOCkKLQlsZHcJcjYsQChyNysscjgpCi0JbGR3CXI2LEAocjctLHI4KQotCWxkdwlyNixAKHI3LDB4MWEpCi0JbGR3CXI2LEAocjcsMHgxMjM0KQotCQkJCQkJCQotCW1hYzAJcjEscjIscjQKLQltYWMwCXIxLHIyLDB4MWYKLQltYWMxCXIxLHIyLHI0Ci0JbWFjMQlyMSxyMiwweDFmCi0KLQltYWNzMAlyMSxyMixyNAotCW1hY3MwCXIxLHIyLDB4MWYKLQltYWNzMQlyMSxyMixyNAotCW1hY3MxCXIxLHIyLDB4MWYKLQotCW1vZGRlYwlyMSwweGEKLQotCW1vZGluYwlyMSwweGEKLQotCW1zdWIwCXIxLHIyLHI0Ci0JbXN1YjAJcjEscjIsMHgxZgotCW1zdWIxCXIxLHIyLHI0Ci0JbXN1YjEJcjEscjIsMHgxZgotCi0JbXVsCXIxLHIyLHI0Ci0JbXVsCXIxLHIyLDB4YQotCi0JbXN1YnMwCXIxLHIyLHI0Ci0JbXN1YnMwCXIxLHIyLDB4MWYKLQltc3ViczEJcjEscjIscjQKLQltc3ViczEJcjEscjIsMHgxZgotCi0JbXVsMmgJcjEscjIscjQKLQltdWwyaAlyMSxyMiwweGEKLQkKLQltdWxoeGxsCXIxLHIyLHI0Ci0JbXVsaHhsbAlyMSxyMiwweGEKLQotCW11bGh4bGgJcjEscjIscjQKLQltdWxoeGxoCXIxLHIyLDB4YQotCi0JbXVsaHhobAlyMSxyMixyNAotCW11bGh4aGwJcjEscjIsMHhhCi0KLQltdWxoeGhoCXIxLHIyLHI0Ci0JbXVsaHhoaAlyMSxyMiwweGEKLQotCW11bHgyaAlyOCxyMixyNAotCW11bHhzCWEwLHIxLHI0Ci0JCi0JbXVseAlhMCxyMSxyNAotCW11bHgJYTEscjIsMHhhCi0KLQltdmZhY2MJcjEsYTAscjQKLQltdmZhY2MJcjIsYTEsMHhhCi0KLQltdWx4MmgJcjgscjIsMHhhCi0JbXVseHMJYTEscjIsMHhhCi0JCQotCW12ZnN5cwlyMTAscGMKLQltdmZzeXMJcjEwLHJwdF9jCi0JbXZmc3lzCXIxMCxwc3cKLQltdmZzeXMJcjEwLHBzd2gKLQltdmZzeXMJcjEwLHBzd2wKLQltdmZzeXMJcjEwLGYwCi0JbXZmc3lzCXIxMCxTCi0KLQltdnRhY2MJYTEscjIscjQKLQotCW12dHN5cwlycHRfYywgcjEwCi0JbXZ0c3lzCXBzdywgcjEwCi0JbXZ0c3lzCXBzd2gsIHIxMAotCW12dHN5cwlwc3dsLCByMTAKLQltdnRzeXMJZjAsIHIxMAotCW12dHN5cwlmMywgcjEwCi0JbXZ0c3lzCVMsIHIxMAotCW12dHN5cwlWLCByMTAKLQltdnRzeXMJVkEsIHIxMAotCW12dHN5cwlDLCByMTAKLQotCW5vcAotCi0Jbm90CXIxLHIyCi0KLQlub3RmZwlmMSxmMgotCi0Jb3IJcjEscjIscjQKLQlvcglyMSxyMiwweDFhCi0Jb3IJcjEscjIsMHhkZWFkZjAwZAotCi0Jb3JmZwlmMSxmMixmNAotCW9yZmcJZjQsZjIsMHgxCi0JCi0JcmVpdAotCi0JcmVwZWF0CXIxLHIyCi0JcmVwZWF0CXI0LDB4ZGVhZAotCXJlcGVhdAlyNCwweGRlYWRmMDBkCi0KLQlyZXBlYXRpCTB4YSxyMQotCXJlcGVhdGkJMHhhLDB4MTAwMQotCi0Jbm9wIHx8IG5vcAotCQotCXJvdAlyMSxyMixyNAotCXJvdAlyMSxyMiwweGEKLQotCXJvdDJoCXIxLHIyLHI0Ci0Jcm90MmgJcjEscjIsMHhhCi0KLQlzYXQJcjEscjIscjQKLQlzYXQJcjEscjIsMHhhCi0KLQlzYXQyaAlyMSxyMixyNAotCXNhdDJoCXIxLHIyLDB4YQotCi0Jc2F0aGwJcjEscjIscjQKLQlzYXRobAlyMSxyMiwweGEKLQotCXNhdGhoCXIxLHIyLHI0Ci0Jc2F0aGgJcjEscjIsMHhhCi0JCQotCXNhdHoJcjEscjIscjQKLQlzYXR6CXIxLHIyLDB4YQotCi0Jc2F0ejJoCXIxLHIyLHI0Ci0Jc2F0ejJoCXIxLHIyLDB4YQotCQkJCi0Jc3JhCXIxLHIyLHI0Ci0Jc3JhCXIxLHIyLDB4YQotCi0Jc3JhMmgJcjEscjIscjQKLQlzcmEyaAlyMSxyMiwweGEKLQotCXNyYwlyMSxyMixyNAotCXNyYwlyMSxyMiwweGEKLQkKLQlzcmwJcjEscjIscjQKLQlzcmwJcjEscjIsMHhhCi0KLQlzcmwyaAlyMSxyMixyNAotCXNybDJoCXIxLHIyLDB4YQotCi0JCi0Jc3QyaAlyNixAKHI3LHI4KQotCXN0MmgJcjYsQChyNysscjgpCi0Jc3QyaAlyNixAKHI3LSxyOCkKLQlzdDJoCXI2LEAocjcsMHgxYSkKLQlzdDJoCXI2LEAocjcsMHgxMjM0KQotCQkKLQlzdDJ3CXI2LEAocjcscjgpCi0Jc3QydwlyNixAKHI3KyxyOCkKLQlzdDJ3CXI2LEAocjctLHI4KQotCXN0MncJcjYsQChyNywweDFhKQotCXN0MncJcjYsQChyNywweDEyMzQpCi0KLQlzdDRoYglyNixAKHI3LHI4KQotCXN0NGhiCXI2LEAocjcrLHI4KQotCXN0NGhiCXI2LEAocjctLHI4KQotCXN0NGhiCXI2LEAocjcsMHgxYSkKLQlzdDRoYglyNixAKHI3LDB4MTIzNCkKLQotCXN0YglyNixAKHI3LHI4KQotCXN0YglyNixAKHI3KyxyOCkKLQlzdGIJcjYsQChyNy0scjgpCi0Jc3RiCXI2LEAocjcsMHgxYSkKLQlzdGIJcjYsQChyNywweDEyMzQpCi0KLQlzdGgJcjYsQChyNyxyOCkKLQlzdGgJcjYsQChyNysscjgpCi0Jc3RoCXI2LEAocjctLHI4KQotCXN0aAlyNixAKHI3LDB4MWEpCi0Jc3RoCXI2LEAocjcsMHgxMjM0KQotCi0Jc3RoaAlyNixAKHI3LHI4KQotCXN0aGgJcjYsQChyNysscjgpCi0Jc3RoaAlyNixAKHI3LSxyOCkKLQlzdGhoCXI2LEAocjcsMHgxYSkKLQlzdGhoCXI2LEAocjcsMHgxMjM0KQotCi0Jc3R3CXI2LEAocjcscjgpCi0Jc3R3CXI2LEAocjcrLHI4KQotCXN0dwlyNixAKHI3LSxyOCkKLQlzdHcJcjYsQChyNywweDFhKQotCXN0dwlyNixAKHI3LDB4MTIzNCkKLQkJCQkJCQkJCi0Jc3ViCXIxLHIyLHIzCi0Jc3ViCXI1MCxyNTEsMHgxYQotCXN1YglyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YjJoCXIxLHIyLHIzCi0Jc3ViMmgJcjUwLHI1MSwweDFhCi0Jc3ViMmgJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJiCXIxLHIyLHIzCi0Jc3ViYglyNTAscjUxLDB4MWEKLQlzdWJiCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGxsbAlyMSxyMixyMwotCXN1YmhsbGwJcjUwLHI1MSwweDFhCi0Jc3ViaGxsbAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmhsbGgJcjEscjIscjMKLQlzdWJobGxoCXI1MCxyNTEsMHgxYQotCXN1YmhsbGgJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJobGhsCXIxLHIyLHIzCi0Jc3ViaGxobAlyNTAscjUxLDB4MWEKLQlzdWJobGhsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGxoaAlyMSxyMixyMwotCXN1YmhsaGgJcjUwLHI1MSwweDFhCi0Jc3ViaGxoaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQkJCi0Jc3ViaGhsbAlyMSxyMixyMwotCXN1YmhobGwJcjUwLHI1MSwweDFhCi0Jc3ViaGhsbAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmhobGgJcjEscjIscjMKLQlzdWJoaGxoCXI1MCxyNTEsMHgxYQotCXN1YmhobGgJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJoaGhsCXIxLHIyLHIzCi0Jc3ViaGhobAlyNTAscjUxLDB4MWEKLQlzdWJoaGhsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGhoaAlyMSxyMixyMwotCXN1YmhoaGgJcjUwLHI1MSwweDFhCi0Jc3ViaGhoaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQkKLQl0cmFwCXIxCi0JdHJhcAkweGEKLQotCXhvcglyMSxyMixyNAotCXhvcglyMSxyMiwweGEKLQl4b3IJcjEscjIsMHhkZWFkZjAwZAotCi0JeG9yZmcJZjEsZjIsZjQKLQl4b3JmZwlmMSxmNCwweGEKLQotIyBWTElXIHN5bnRheCB0ZXN0Ci0Jbm9wCi0Jbm9wCi0Jbm9wCS0+CW5vcAotCW5vcAl8fAlub3AKLQlub3AJPC0Jbm9wCi0KLSMgdHJ5IGNoYW5naW5nIHNlY3Rpb25zCi0Jbm90CXIxLHIyCi0JLnNlY3Rpb24gLmZvbwotCWFkZAlyMTAscjEyLDYKLQkudGV4dAotCW5vdAlyMixyMwotCW5vcAotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyOWY4MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLWRlYnVnLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jb2JqZHVtcDogLWxkcgotI25hbWU6IEQzMFYgZGVidWcgKC1nKSB0ZXN0Ci0jYXM6IC1nCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8X2FiYy0weDE4PjoKLS4qbGFiZWwtZGVidWcuczo0Ci0gICAwOgkxMDA4MDAwMyAwMGYwMDAwMCAJYnJhLnNcL3R4CTE4CVwoMTggPF9hYmM+XCkJXHxcfAlub3AJCi0uKmxhYmVsLWRlYnVnLnM6NQotICAgODoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotICAxMDoJMGUwMDAwMDQgMDBmMDAwMDAgCS5sb25nCTB4ZTAwMDAwNAl8fAlub3AJCi0KLTAwMDAwMDE4IDxfYWJjPjoKLS4qbGFiZWwtZGVidWcuczo4Ci0gIDE4OgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0uKmxhYmVsLWRlYnVnLnM6OQotICAyMDoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotLipsYWJlbC1kZWJ1Zy5zOjEwCi0gIDI4OgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0uKmxhYmVsLWRlYnVnLnM6MTEKLSAgMzA6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0MGFhNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLWRlYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIGxhYmVscyBzaG91bGQgYmUgYWxpZ25lZCBvbiA4LWJ5dGUgYm91bmRyaWVzCi0JCi0JLnRleHQKLQlicmEucy90eCBfYWJjICAgfHwgbm9wIAotCW5vcCAgICAgfHwgbm9wIAotCS53b3JkIDB4MGUwMDAwMDQKLV9hYmM6Ci0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Y2ZjZGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgbGFiZWwgYWxpZ25tZW50IHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxfYWJjLTB4MTg+OgotICAgMDoJMTAwODAwMDMgMDBmMDAwMDAgCWJyYS5zL3R4CTE4CSgxOCA8X2FiYz4pCXx8CW5vcAkKLSAgIDg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLSAgMTA6CTBlMDAwMDA0IDAwZjAwMDAwIAkubG9uZwkweGUwMDAwMDQJfHwJbm9wCQotCi0wMDAwMDAxOCA8X2FiYz46Ci0gIDE4OgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCi0gIDIwOgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NDBhYTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyBsYWJlbHMgc2hvdWxkIGJlIGFsaWduZWQgb24gOC1ieXRlIGJvdW5kcmllcwotCQotCS50ZXh0Ci0JYnJhLnMvdHggX2FiYyAgIHx8IG5vcCAKLQlub3AgICAgIHx8IG5vcCAKLQkud29yZCAweDBlMDAwMDA0Ci1fYWJjOgotCW5vcAotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbXVsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTBhNTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBEMzBWIGFsaWdubWVudCB0ZXN0Ci0jYXM6IC1XTwotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CThhMTA1MTg3IDBhMTAyMGM0IAltdWx4MmgJcjUsIHI2LCByNwk8LQltdWx4MmgJcjIsIHIzLCByNAotICAgODoJMDBmMDAwMDAgMGExMDgyNGEgCW5vcAkJfHwJbXVseDJoCXI4LCByOSwgcjEwCi0gIDEwOgkwMGYwMDAwMCAwYTEwYjMwZCAJbm9wCQl8fAltdWx4MmgJcjExLCByMTIsIHIxMwotICAxODoJOGExMTE0OTMgMGExMGUzZDAgCW11bHgyaAlyMTcsIHIxOCwgcjE5CTwtCW11bHgyaAlyMTQsIHIxNSwgcjE2Ci0gIDIwOgk4YTExNzYxOSAwYTExNDU1NiAJbXVseDJoCXIyMywgcjI0LCByMjUJPC0JbXVseDJoCXIyMCwgcjIxLCByMjIKLSAgMjg6CThiMDFkNzlmIDBhMTFhNmRjIAltdWwJcjI5LCByMzAsIHIzMQk8LQltdWx4MmgJcjI2LCByMjcsIHIyOAotICAzMDoJOGIwMDUxODcgMGIwMDIwYzQgCW11bAlyNSwgcjYsIHI3CTwtCW11bAlyMiwgcjMsIHI0Ci0gIDM4Ogk4YTEwYjMwZCAwYTEwODI0YSAJbXVseDJoCXIxMSwgcjEyLCByMTMJPC0JbXVseDJoCXI4LCByOSwgcjEwCi0gIDQwOgk4MGYwMDAwMCAwYjAwZTNkMCAJbm9wCQk8LQltdWwJcjE0LCByMTUsIHIxNgotICA0ODoJMDBmMDAwMDAgMGExMTE0OTMgCW5vcAkJfHwJbXVseDJoCXIxNywgcjE4LCByMTkKLSAgNTA6CThiMDE3NjE5IDBhMTE0NTU2IAltdWwJcjIzLCByMjQsIHIyNQk8LQltdWx4MmgJcjIwLCByMjEsIHIyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbXVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNjc4NTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgIE9uZSBvZiB0aGUgcnVsZSBvbiByZXN0cmljdGVkIHNlcXVlbmNlIGlzIGNvbnNlY3V0aXZlIElVIGluc3RydWN0aW9uIAotIyAgICAgICBJVTogTVVMLCBNQUMsIE1BQ1MsIE1TVUIsIE1TVUJTICAoYSkgICAgCi0jICAgICAgIElVOiBNVUxIWHBwLCBNVUxYMkgsIE1VTDJIICAgICAgKGIpCi0jIFRoaXMgbWVhbnMgdGhhdCBpbnN0cnVjdGlvbnMgaW4gZ3JvdXAgKGEpIGFuZCBpbiAoYikgc2hvdWxkIG5vdCBiZSBleGVjdXRlZAotIyBpbiBJVSBpbiBjb25zZWN1dGl2ZSBjeWNsZXMgaW4gdGhlIG9yZGVyIChhKS0+KGIpLiBJdCBkb2VzIG5laXRoZXIgcHJvaGliaXQKLSMgZXhlY3V0aW9ucyBpbiB0aGUgcmV2ZXJzZSBvcmRlciAoYiktPiAoYSkgbm9yIGNvbnNlY3V0aXZlIGV4ZWN1dGlvbiBvZgotIyBncm91cCAoYSktPihhKSBvciAoYiktPihiKQotCi0JbXVseDJoIHI1LHI2LHI3CQk8LQltdWx4MmggcjIscjMscjQKLQlub3AJfHwJbXVseDJoIHI4LHI5LHIxMAotCW5vcAl8fAltdWx4MmggcjExLHIxMixyMTMgICAgICAgCi0JbXVseDJoIHIxNCxyMTUscjE2Ci0JbXVseDJoIHIxNyxyMTgscjE5ICAgICAgCi0JbXVseDJoIHIyMyxyMjQscjI1ICAgICA8LQltdWx4MmggcjIwLHIyMSxyMjIKLQltdWwgICAgcjI5LHIzMCxyMzEgICAgIDwtCW11bHgyaCByMjYscjI3LHIyOAotCW11bCAgICByNSwgcjYsIHI3ICAgICAgPC0JbXVsIHIyLCByMywgcjQKLQltdWx4MmggcjExLCByMTIsIHIxMyAgIDwtCW11bHgyaCByOCwgcjksIHIxMAotCW11bHgyaCByMTcsIHIxOCwgcjE5ICAgPC0JbXVsIHIxNCwgcjE1LCByMTYKLQltdWwgICAgcjIzLCByMjQsIHIyNSAgIDwtCW11bHgyaCByMjAsIHIyMSwgcjIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9vcHQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiZmE5Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5kCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgb3B0aW1pemF0aW9uIHRlc3QKLSNhczogLU8KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxzdGFydD46Ci0gICAwOgkwODgwMTA4MCAwODgwMzEwMCAJYWJzCXIxLCByMgl8fAlhYnMJcjMsIHI0Ci0gICA4OgkwMjkwMDEwMCAwMjkwMTA4MCAJbm90ZmcJZjAsIHMJfHwJbm90ZmcJZjEsIGYyCi0gIDEwOgkwODgwMTA4MCAwMjkwMTA4MCAJYWJzCXIxLCByMgl8fAlub3RmZwlmMSwgZjIKLSAgMTg6CTA4MDAxMDgzIDgyOTA3MDAwIAlhZGQucwlyMSwgcjIsIHIzCS0+CW5vdGZnCWMsIGYwCi0gIDIwOgkwODAwMTA4MyA4MjkwMDFjMCAJYWRkLnMJcjEsIHIyLCByMwktPglub3RmZwlmMCwgYwotICAyODoJMDAwODAwMDAgMDBmMDAwMDAgCWJyYS5zCTAJXCgyOCA8c3RhcnRcKzB4Mjg+XCkJfHwJbm9wCQotICAzMDoJMDg4MDEwODAgODg4MDEwODAgCWFicwlyMSwgcjIJLT4JYWJzCXIxLCByMgotICAzODoJMDAwODAwMDAgMDBmMDAwMDAgCWJyYS5zCTAJXCgzOCA8c3RhcnRcKzB4Mzg+XCkJfHwJbm9wCQotICA0MDoJMDAyYmZmZmYgMDBmMDAwMDAgCWJzci5zCS04CVwoMzggPHN0YXJ0XCsweDM4PlwpCXx8CW5vcAkKLSAgNDg6CTA4ODAxMDgwIDg4ODAxMDgwIAlhYnMJcjEsIHIyCS0+CWFicwlyMSwgcjIKLSAgNTA6CTAwMjgwMDAwIDA4ODAxMDgwIAlic3IucwkwCVwoNTAgPHN0YXJ0XCsweDUwPlwpCXx8CWFicwlyMSwgcjIKLSAgNTg6CTA0MDAxMDgzIDg1MDA3MjA5IAlsZGIucwlyMSwgQFwocjIsIHIzXCkJLT4Jc3RiLnMJcjcsIEBcKHI4LCByOVwpCi0gIDYwOgkwNTAwNzIwOSA4NDAwMTA4MyAJc3RiLnMJcjcsIEBcKHI4LCByOVwpCS0+CWxkYi5zCXIxLCBAXChyMiwgcjNcKQotICA2ODoJMDQwMDcyMDkgODQwMDEwODMgCWxkYi5zCXI3LCBAXChyOCwgcjlcKQktPglsZGIucwlyMSwgQFwocjIsIHIzXCkKLSAgNzA6CTA1MDA3MjA5IDg1MDAxMDgzIAlzdGIucwlyNywgQFwocjgsIHI5XCkJLT4Jc3RiLnMJcjEsIEBcKHIyLCByM1wpCi0gIDc4OgkwODAwMzBjNiA4NTQ4MjBjMCAJYWRkLnMJcjMsIHIzLCByNgktPglzdHcucwlyMiwgQFwocjMsIDB4MFwpCi0gIDgwOgkwMmMyODEwNSA5MDE4MDAwMCAJY21wbGUucwlmMCwgcjQsIHI1CS0+CWptcC5zL3R4CTAgPHN0YXJ0PgotICA4ODoJMDJjMjgxMDUgYTAxODAwMDAgCWNtcGxlLnMJZjAsIHI0LCByNQktPglqbXAucy9meAkwIDxzdGFydD4KLSAgOTA6CTMwMTgwMDAwIDAyYzI4MTA1IAlqbXAucy94dAkwIDxzdGFydD4JfHwJY21wbGUucwlmMCwgcjQsIHI1Ci0gIDk4Ogk0MDE4MDAwMCAwMmMyODEwNSAJam1wLnMveGYJMCA8c3RhcnQ+CXx8CWNtcGxlLnMJZjAsIHI0LCByNQotICBhMDoJMDJjMjgxMDUgZDAxODAwMDAgCWNtcGxlLnMJZjAsIHI0LCByNQktPglqbXAucy90dAkwIDxzdGFydD4KLSAgYTg6CTAyYzI4MTA1IGUwMTgwMDAwIAljbXBsZS5zCWYwLCByNCwgcjUJLT4Jam1wLnMvdGYJMCA8c3RhcnQ+Ci0gIGIwOgkxMDE4MDAwMCAwMmMyOTEwNSAJam1wLnMvdHgJMCA8c3RhcnQ+CXx8CWNtcGxlLnMJZjEsIHI0LCByNQotICBiODoJMDJjMjkxMDUgYjAxODAwMDAgCWNtcGxlLnMJZjEsIHI0LCByNQktPglqbXAucy94dAkwIDxzdGFydD4KLSAgYzA6CTA4MDg0MDAxIDgyYzI4MTA1IAlhZGQucwlyNCwgcjAsIDB4MQktPgljbXBsZS5zCWYwLCByNCwgcjUKLSAgYzg6CTA4MDg0MDAxIDAyYzI4MGM1IAlhZGQucwlyNCwgcjAsIDB4MQl8fAljbXBsZS5zCWYwLCByMywgcjUKLSAgZDA6CTA0NjA0MDA2IDg4NjA1NGQ0IAlsZDJ3LnMJcjQsIEBcKHIwLCByNlwpCS0+CWFkZHMucwlyNSwgcjE5LCByMjAKLSAgZDg6CTA0NjA0MDA2IDg4NjAzMTU0IAlsZDJ3LnMJcjQsIEBcKHIwLCByNlwpCS0+CWFkZHMucwlyMywgcjUsIHIyMAotICBlMDoJMDQ2MDQwMDYgMDg2MDY0ZDQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI2LCByMTksIHIyMAotICBlODoJMDQ2MDQwMDYgMDg2MDc0ZDQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI3LCByMTksIHIyMAotICBmMDoJMDQ2MDQwMDYgMDg2MDcwMTQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI3LCByMCwgcjIwCi0gIGY4OgkwNTYwNDAwNiAwODYwNTRkNCAJc3Qydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjUsIHIxOSwgcjIwCi0gMTAwOgkwNTYwNDAwNiAwODYwMzE1NCAJc3Qydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjMsIHI1LCByMjAKLSAxMDg6CTA1NjA0MDA2IDA4NjA2NGQ0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNiwgcjE5LCByMjAKLSAxMTA6CTA1NjA0MDA2IDA4NjA3NGQ0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNywgcjE5LCByMjAKLSAxMTg6CTA1NjA0MDA2IDA4NjA3MDE0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNywgcjAsIHIyMAotIDEyMDoJMDU2MGEwYzQgODU2MjhhZWMgCXN0MncucwlyMTAsIEBcKHIzLCByNFwpCS0+CXN0MncucwlyNDAsIEBcKHI0MywgcjQ0XCkKLSAxMjg6CTA1NDAxMDgzIDg0NDI5YWFiIAlzdHcucwlyMSwgQFwocjIsIHIzXCkJLT4JbGR3LnMJcjQxLCBAXChyNDIsIHI0M1wpCi0gMTMwOgkwNDQwMTA4MyA4NDAyOWFhYiAJbGR3LnMJcjEsIEBcKHIyLCByM1wpCS0+CWxkYi5zCXI0MSwgQFwocjQyLCByNDNcKQotIDEzODoJMDQ0NDQxOGIgODg2ODkxODIgCWxkdy5zCXI0LCBAXChyNlwrLCByMTFcKQktPglhZGRzLnMJcjksIHI2LCAweDIKLSAxNDA6CTA0NGM0MThiIDA4Njg5MTgyIAlsZHcucwlyNCwgQFwocjYtLCByMTFcKQl8fAlhZGRzLnMJcjksIHI2LCAweDIKLSAxNDg6CTA1NGM0MThiIDg4Njg5MTgyIAlzdHcucwlyNCwgQFwocjYtLCByMTFcKQktPglhZGRzLnMJcjksIHI2LCAweDIKLSAxNTA6CTA0NDA0MThiIDA4Njg5MTgyIAlsZHcucwlyNCwgQFwocjYsIHIxMVwpCXx8CWFkZHMucwlyOSwgcjYsIDB4MgotIDE1ODoJMDQ0MDQxOGIgMDg2ODkxODIgCWxkdy5zCXI0LCBAXChyNiwgcjExXCkJfHwJYWRkcy5zCXI5LCByNiwgMHgyCi0gMTYwOgkwMDE4MDAwMCAwMGYwMDAwMCAJam1wLnMJMCA8c3RhcnQ+CXx8CW5vcAkKLSAxNjg6CTAwMzgwMDAwIDA4ODAxMDgwIAlqc3IucwkwIDxzdGFydD4JfHwJYWJzCXIxLCByMgotIDE3MDoJMDg4MDEwODAgMDBmMDAwMDAgCWFicwlyMSwgcjIJfHwJbm9wCQotIDE3ODoJMDAwODAwMDAgMDBmMDAwMDAgCWJyYS5zCTAJXCgxNzggPHN0YXJ0XCsweDE3OD5cKQl8fAlub3AJCi0gMTgwOgkwMDI4MDAwMCAwODgwMTA4MCAJYnNyLnMJMAlcKDE4MCA8c3RhcnRcKzB4MTgwPlwpCXx8CWFicwlyMSwgcjIKLSAxODg6CTA4ODAxMDgwIDAwZjAwMDAwIAlhYnMJcjEsIHIyCXx8CW5vcAkKLQotMDAwMDAxOTAgPGxhYmVsMT46Ci0gMTkwOgkwNTYwMjA4MyA4OTAwNDE0NiAJc3Qydy5zCXIyLCBAXChyMiwgcjNcKQktPglhZGRobGxsLnMJcjQsIHI1LCByNgotCi0wMDAwMDE5OCA8bGFiZWwyPjoKLSAxOTg6CTA1NTA4MjA5IDg5OTBhMmNjIAlzdDRoYi5zCXI4LCBAXChyOCwgcjlcKQktPglzdWJobGxoLnMJcjEwLCByMTEsIHIxMgotCi0wMDAwMDFhMCA8bGFiZWwzPjoKLSAxYTA6CTA0NjBlMzhmIDhhNjEwNDUyIAlsZDJ3LnMJcjE0LCBAXChyMTQsIHIxNVwpCS0+CW11bGh4aGwJcjE2LCByMTcsIHIxOAotCi0wMDAwMDFhOCA8bGFiZWw0PjoKLSAxYTg6CTA0NDEzNTE1IDhhMTE2NWQ4IAlsZHcucwlyMTksIEBcKHIyMCwgcjIxXCkJLT4JbXVseDJoCXIyMiwgcjIzLCByMjQKLQotMDAwMDAxYjAgPGxhYmVsNT46Ci0gMWIwOgkwNDIxOTY5YiA4YTAxYzc1ZSAJbGRoLnMJcjI1LCBAXChyMjYsIHIyN1wpCS0+CW11bDJoCXIyOCwgcjI5LCByMzAKLQotMDAwMDAxYjggPGxhYmVsNj46Ci0gMWI4Ogk4MGYwMDAwMCAwYjAwMTA4MyAJbm9wCQk8LQltdWwJcjEsIHIyLCByMwotIDFjMDoJMDgwMDcyMDkgMGE0MDQxNDYgCWFkZC5zCXI3LCByOCwgcjkJfHwJbXVsaHhsbAlyNCwgcjUsIHI2Ci0KLTAwMDAwMWM4IDxsYWJlbDc+OgotIDFjODoJMDQ0MDUxODAgMGIwMDIwYzQgCWxkdy5zCXI1LCBAXChyNiwgcjBcKQl8fAltdWwJcjIsIHIzLCByNAotIDFkMDoJODBmMDAwMDAgMGIwMDcyMDkgCW5vcAkJPC0JbXVsCXI3LCByOCwgcjkKLSAxZDg6CTA0NDBhMmMwIDAwZjAwMDAwIAlsZHcucwlyMTAsIEBcKHIxMSwgcjBcKQl8fAlub3AJCi0gMWUwOgk4MGYwMDAwMCAwYjAwYzM0ZSAJbm9wCQk8LQltdWwJcjEyLCByMTMsIHIxNAotIDFlODoJMDQ0MGY0MDAgMGI0NDIwYzQgCWxkdy5zCXIxNSwgQFwocjE2LCByMFwpCXx8CW1hYzEJcjIsIHIzLCByNAotIDFmMDoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotIDFmODoJMDQ0MDUxODAgMDBmMDAwMDAgCWxkdy5zCXI1LCBAXChyNiwgcjBcKQl8fAlub3AJCi0gMjAwOgk4MGYwMDAwMCAwYjQwNzIwOSAJbm9wCQk8LQltYWMwCXI3LCByOCwgcjkKLSAyMDg6CTA0NDBhMmMwIDg0NDBhMmMwIAlsZHcucwlyMTAsIEBcKHIxMSwgcjBcKQktPglsZHcucwlyMTAsIEBcKHIxMSwgcjBcKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9vcHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvb3B0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzMzMDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9vcHQucworKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0jIEQzMFYgcGFyYWxsZWwgb3B0aW1pemF0aW9uIHRlc3QKLSMgYXNzZW1ibGUgd2l0aCAiLU8iCi0JCi0JLnRleHQKLXN0YXJ0OgkKLQlhYnMJcjEscjIKLQlhYnMJcjMscjQKLQotCW5vdGZnCWYwLGY0Ci0Jbm90ZmcJZjEsZjIKLQkJCi0JYWJzCXIxLHIyCi0Jbm90ZmcJZjEsZjIKLQotIyBib3RoIGNoYW5nZSBDIGZsYWcKLQlhZGQJcjEscjIscjMKLQlub3RmZwlDLGYwCi0KLSMgb25lIHVzZXMgYW5kIG9uZSBjaGFuZ2VzIEMgZmxhZwkKLQlhZGQJcjEscjIscjMKLQlub3RmZwlmMCxDCi0KLQlicmEJLgotCWFicwlyMSxyMgotCi0JYWJzCXIxLHIyCQotCWJyYQkuCi0KLQlic3IJLgotCWFicwlyMSxyMgotCQotCWFicwlyMSxyMgkKLQlhYnMJcjEscjIJCi0JYnNyCS4KLQkKLQlsZGIJcjEsQChyMixyMykKLQlzdGIJcjcsQChyOCxyOSkKLQotCXN0YglyNyxAKHI4LHI5KQkKLQlsZGIJcjEsQChyMixyMykKLQotCWxkYglyNyxAKHI4LHI5KQkKLQlsZGIJcjEsQChyMixyMykKLQotCXN0YglyNyxAKHI4LHI5KQkKLQlzdGIJcjEsQChyMixyMykKLQotCWFkZCAgICAgcjMsIHIzLCByNgotCXN0dyAgICAgcjIsIEAocjMsIDApCi0JCQkKLSMgc2hvdWxkIGJlIHNlcmlhbCBiZWNhdXNlIG9mIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotICAgICAgICBjbXBsZSAgIGYwLHI0LHI1Ci0gICAgICAgIGptcC90eCAgMHgwCi0KLSAgICAgICAgY21wbGUgICBmMCxyNCxyNQotICAgICAgICBqbXAvZnggIDB4MAotCi0gICAgICAgIGNtcGxlICAgZjAscjQscjUKLSAgICAgICAgam1wL3h0ICAweDAKLQotICAgICAgICBjbXBsZSAgIGYwLHI0LHI1Ci0gICAgICAgIGptcC94ZiAgMHgwCi0KLSAgICAgICAgY21wbGUgICBmMCxyNCxyNQotICAgICAgICBqbXAvdHQgIDB4MAotCi0gICAgICAgIGNtcGxlICAgZjAscjQscjUKLSAgICAgICAgam1wL3RmICAweDAKLQkJCQkJCi0gICAgICAgIGNtcGxlICAgZjEscjQscjUKLSAgICAgICAgam1wL3R4ICAweDAKLQotICAgICAgICBjbXBsZSAgIGYxLHI0LHI1Ci0gICAgICAgIGptcC94dCAgMHgwCi0KLQkjIHNlcmlhbCBiZWNhdXNlIG9mIHRoZSByNCBkZXBlbmRlbmN5Ci0JYWRkCXI0LCByMCwgMQotCWNtcGxlCWYwLCByNCwgcjUKLQotCSMgcGFyYWxsZWwKLQlhZGQJcjQsIHIwLCAxCi0JY21wbGUJZjAsIHIzLCByNQotCi0JIyBzZXJpYWwgYmVjYXVzZSBsZDJ3IGxvYWRzIHI1Ci0JbGQydwlyNCxAKHIwLHI2KQotCWFkZHMJcjUscjE5LHIyMAotCi0JIyBzZXJpYWwgYmVjYXVzZSBsZDJ3IGxvYWRzIHI1Ci0JbGQydwlyNCxAKHIwLHI2KQotCWFkZHMJcjMscjUscjIwCi0KLQkjIHBhcmFsbGVsIGV2ZW4gdGhvdWdoIGxkMncgdXNlcyByNiBhbmQgYWRkcyBjaGFuZ2VzIGl0Ci0JbGQydwlyNCxAKHIwLHI2KQotCWFkZHMJcjYscjE5LHIyMAotCi0JIyBwYXJhbGxlbAotCWxkMncJcjQsQChyMCxyNikKLQlhZGRzCXI3LHIxOSxyMjAKLQotCSMgcGFyYWxsZWwKLQlsZDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNyxyMCxyMjAKLQotCSMgcGFyYWxsZWwgZXZlbiB0aG91Z2ggc3QydyB1c2VzIHI1IGFuZCBhZGRzIG1vZGlmaWVzIGl0Ci0Jc3QydwlyNCxAKHIwLHI2KQotCWFkZHMJcjUscjE5LHIyMAotCi0JIyBwYXJhbGxlbCwgYm90aCB1c2UgYnV0IGRvbid0IG1vZGlmeSByNQotCXN0MncJcjQsQChyMCxyNikKLQlhZGRzCXIzLHI1LHIyMAotCi0JIyBwYXJhbGxlbCBldmVuIHRob3VnaCBzdDJ3IHVzZXMgcjYgYW5kIGFkZHMgY2hhbmdlcyBpdAotCXN0MncJcjQsQChyMCxyNikKLQlhZGRzCXI2LHIxOSxyMjAKLQotCSMgcGFyYWxsZWwKLQlzdDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNyxyMTkscjIwCi0KLQkjIHBhcmFsbGVsCi0Jc3QydwlyNCxAKHIwLHI2KQotCWFkZHMJcjcscjAscjIwCi0JCQkJCQkKLSMgdGVzdCBtZW1vcnkgZGVwZW5kZW5jaWVzCi0KLQkjIGFsd2F5cyBzZXJpYWwgYmVjYXVzZSBvbmUgY291bGQgb3ZlcndyaXRlIHRoZSBvdGhlcgotCXN0MncJcjEwLEAocjMscjQpCi0Jc3QydwlyNDAsQChyNDMscjQ0KQotCi0JIyBhbHdheXMgc2VyaWFsCi0Jc3R3CXIxLEAocjIscjMpCi0JbGR3CXI0MSxAKHI0MixyNDMpCQkJCi0KLQkjIHJlYWRzIGNhbiBoYXBwZW4gaW4gcGFyYWxsZWwgYnV0IHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSAKLQkjIGRvZXNuJ3Qgc3VwcG9ydCBpdAotCWxkdwlyMSxAKHIyLHIzKQotCWxkYglyNDEsQChyNDIscjQzKQkJCQotCi0jIHRlc3QgcG9zdCBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBkZXBlbmRlbmNpZXMKLQotCSMgc2VyaWFsCi0JbGR3CXI0LEAocjYrLHIxMSkKLQlhZGRzCXI5LHI2LDIKLQotCSMgcGFyYWxsZWwsIG1vZGlmaWNhdGlvbiB0byByNiBoYXBwZW5zIGxhc3QKLQlhZGRzCXI5LHI2LDIJCi0JbGR3CXI0LEAocjYtLHIxMSkKLQotCSMgc2VyaWFsCi0Jc3R3CXI0LEAocjYtLHIxMSkKLQlhZGRzCXI5LHI2LDIKLQkKLQkjIHBhcmFsbGVsCi0JbGR3CXI0LEAocjYscjExKQotCWFkZHMJcjkscjYsMgotCi0JIyBwYXJhbGxlbAotCWFkZHMJcjkscjYsMgkKLQlsZHcJcjQsQChyNixyMTEpCi0JCi0jIGlmIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpcyBhIGptcCwgZG9uJ3QgcGFyYWxsZWxpemUKLQlqbXAJMAotCWFicwlyMSxyMgkKLQotCWpzcgkwCi0JYWJzCXIxLHIyCQotCi0JLmFsaWduCTMKLQkKLQlicmEJMAotCWFicwlyMSxyMgkKLQkKLQlic3IJMAotCWFicwlyMSxyMgkKLQotIyBFeHBsaWNpdGx5IHByb2hpYml0ZWQgZnJvbSBwYXJhbGxlbCBleGVjdXRpb24uCi0jIFRoZSBsYWJlbHMgYXJlIGhlcmUgdG8gcHJldmVudCBpbnN0cnVjdGlvbiBwYWlycwotIyAgZnJvbSBiZWluZyBtZXJnZWQgd2l0aCBmb2xsb3dpbmcgcGFpcnMuCi0JCi1sYWJlbDE6CQotCXN0MncgICAgIHIyLCBAKHIyLCByMykKLQlhZGRobGxsICByNCwgcjUsIHI2Ci1sYWJlbDI6Ci0Jc3Q0aGIgICAgcjgsIEAocjgsIHI5KQotCXN1YmhsbGggIHIxMCwgcjExLCByMTIKLWxhYmVsMzoKLQlsZDJ3ICAgICByMTQsIEAocjE0LCByMTUpCi0JbXVsaHhobCAgcjE2LCByMTcsIHIxOAotbGFiZWw0OgotCWxkdyAgICAgIHIxOSwgQChyMjAsIHIyMSkKLQltdWx4MmggICByMjIsIHIyMywgcjI0Ci1sYWJlbDU6Ci0JbGRoICAgICAgcjI1LCBAKHIyNiwgcjI3KQotCW11bDJoICAgIHIyOCwgcjI5LCByMzAKLQotIyBJbnNlcnRpb24gb2YgTk9QcyByZXF1aXJlZCB0byBwcmV2ZW50IHBpcGVsaW5lIGNsYXNoZXMuCi0KLWxhYmVsNjoKLQltdWwgcjEscjIscjMKLQltdWxoeGxsIHI0LHI1LHI2Ci0gICAgICAgIGFkZCByNywgcjgsIHI5Ci1sYWJlbDc6Ci0JCi0gICAgICAgIG11bCAgcjIscjMscjQKLSAgICAgICAgbGR3ICByNSwgQChyNixyMCkKLSAKLSAgICAgICAgbGR3ICByMTAsIEAocjExLCByMCkgPC0gbXVsIHI3LHI4LHI5Ci0JCi0gICAgICAgIG11bCAgcjEyLHIxMyxyMTQgLT4gbGR3IHIxNSwgQChyMTYsIHIwKQotCi0gICAgICAgIG1hYzEgcjIscjMscjQKLSAgICAgICAgbGR3ICByNSwgQChyNixyMCkKLSAKLSAgICAgICAgbGR3ICByMTAsIEAocjExLCByMCkgPC0gbWFjMCByNyxyOCxyOQotICAgICAgICBsZHcgIHIxMCwgQChyMTEsIHIwKSAKLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlMjc4MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLmQKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViByZWxvY2F0aW9uIHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxzdGFydD46Ci0gICAgICAgMDoJODgwODIwMDAgODAwMDAwMjggCWFkZC5sCXIyLCByMCwgMHgyOAotCQkJMDogUl9EMzBWXzMyCS50ZXh0Ci0gICAgICAgODoJODgwODQwMDAgODAwMDAwMDAgCWFkZC5sCXI0LCByMCwgMHgwCi0JCQk4OiBSX0QzMFZfMzIJLmRhdGEKLSAgICAgIDEwOgk4ODA4NDAwMCA4MDAwMDAwNiAJYWRkLmwJcjQsIHIwLCAweDYKLQkJCTEwOiBSX0QzMFZfMzIJLmRhdGEKLSAgICAgIDE4Ogk4ODA4NDAwMCA4MDAwMDAwMCAJYWRkLmwJcjQsIHIwLCAweDAKLQkJCTE4OiBSX0QzMFZfMzIJdW5rCi0gICAgICAyMDoJODAwODAwMDAgODAwMDAwMTggCWJyYS5sCTE4CVwoMzggPGNvbnQ+XCkKLQotMDAwMDAwMjggPGhlbGxvPjoKLSAgICAgIDI4Ogk0ODY1NmM2YyA2ZjIwNTc2ZiAJLmxvbmcJMHg0ODY1NmM2Ywl8fAkubG9uZwkweDZmMjA1NzZmCi0gICAgICAzMDoJNzI2YzY0MGEgMDBmMDAwMDAgCS5sb25nCTB4NzI2YzY0MGEJfHwJbm9wCQotCi0wMDAwMDAzOCA8Y29udD46Ci0gICAgICAzODoJODAxODAwMDAgODAwMDAwNDggCWptcC5sCTQ4IDxjb250Mj4KLQkJCTM4OiBSX0QzMFZfMzIJLnRleHQKLSAgICAgIDQwOgkwODgwMjBjMCAwMGYwMDAwMCAJYWJzCXIyLCByMwl8fAlub3AJCi0KLTAwMDAwMDQ4IDxjb250Mj46Ci0gICAgICA0ODoJMDAwYmZmZjcgMDBmMDAwMDAgCWJyYS5zCS00OAlcKDAgPHN0YXJ0PlwpCXx8CW5vcAkKLSAgICAgIDUwOgkwMDA4MDIwNSAwMGYwMDAwMCAJYnJhLnMJMTAyOAlcKDEwNzggPGV4aXQ+XCkJfHwJbm9wCQotICAgICAgNTg6CTAwMTgwMDAwIDAwZjAwMDAwIAlqbXAucwkwIDxzdGFydD4JfHwJbm9wCQotICAgICAgNjA6CTAwNmMxZmZiIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgLTI4CVwoMzggPGNvbnQ+XCkJfHwJbm9wCQotICAgICAgNjg6CTAwNmMxZmZhIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgLTMwCVwoMzggPGNvbnQ+XCkJfHwJbm9wCQotICAgICAgNzA6CTAwNGMxZmY5IDAwZjAwMDAwIAlicmF0bnoucwlyMSwgLTM4CVwoMzggPGNvbnQ+XCkJfHwJbm9wCQotICAgICAgNzg6CTAwNGMxZmY4IDAwZjAwMDAwIAlicmF0bnoucwlyMSwgLTQwCVwoMzggPGNvbnQ+XCkJfHwJbm9wCQotICAgICAgODA6CTAwNWMxMDA3IDAwZjAwMDAwIAlqbXB0bnoucwlyMSwgMzggPGNvbnQ+CXx8CW5vcAkKLQkJCTgwOiBSX0QzMFZfMTUJLnRleHQKLSAgICAgIDg4OgkwMDZjMTFmMSAwMGYwMDAwMCAJYnNydG56LnMJcjEsIGY4OAlcKDEwMTAgPGZvbz5cKQl8fAlub3AJCi0gICAgICA5MDoJMDA1YzEwMDAgMDBmMDAwMDAgCWptcHRuei5zCXIxLCAwIDxzdGFydD4JfHwJbm9wCQotCQkJOTA6IFJfRDMwVl8xNQl1bmsKLSAgICAgIDk4OgkwMDZjMTAwMCAwMGYwMDAwMCAJYnNydG56LnMJcjEsIDAJXCg5OCA8Y29udDJcKzB4NTA+XCkJfHwJbm9wCQotCQkJOTg6IFJfRDMwVl8xNV9QQ1JFTAl1bmsKLSAgICAgIGEwOgk4MDVjMTAwMCA4MDAwMDAwMCAJam1wdG56LmwJcjEsIDAgPHN0YXJ0PgotCQkJYTA6IFJfRDMwVl8zMgl1bmsKLSAgICAgIGE4Ogk4MDZjMTAwMCA4MDAwMDAwMCAJYnNydG56LmwJcjEsIDAJXChhOCA8Y29udDJcKzB4NjA+XCkKLQkJCWE4OiBSX0QzMFZfMzJfUENSRUwJdW5rCi0gICAgICBiMDoJMDAwODAxZWMgMDBmMDAwMDAgCWJyYS5zCWY2MAlcKDEwMTAgPGZvbz5cKQl8fAlub3AJCi0gICAgICBiODoJODAwODAwMDAgODAwMDBmNTggCWJyYS5sCWY1OAlcKDEwMTAgPGZvbz5cKQotICAgICAgYzA6CTAwMGJmZmU4IDAwZjAwMDAwIAlicmEucwktYzAJXCgwIDxzdGFydD5cKQl8fAlub3AJCi0gICAgICBjODoJODAxODAwMDAgODAwMDAwMDAgCWptcC5sCTAgPHN0YXJ0PgotCQkJYzg6IFJfRDMwVl8zMgkudGV4dAotICAgICAgZDA6CTgwMTgwMDAwIDgwMDAwMDAwIAlqbXAubAkwIDxzdGFydD4KLQkJCWQwOiBSX0QzMFZfMzIJLnRleHQKLSAgICAgIGQ4OgkwMDE4MDAwMCAwMGYwMDAwMCAJam1wLnMJMCA8c3RhcnQ+CXx8CW5vcAkKLQkJCWQ4OiBSX0QzMFZfMjEJLnRleHQKLSAgICAgIGUwOgkwMDE4MDIwMiAwMGYwMDAwMCAJam1wLnMJMTAxMCA8Zm9vPgl8fAlub3AJCi0JCQllMDogUl9EMzBWXzIxCS50ZXh0Ci0gICAgICBlODoJMDAwYmZmZTMgMDBmMDAwMDAgCWJyYS5zCS1lOAlcKDAgPHN0YXJ0PlwpCXx8CW5vcAkKLSAgICAgIGYwOgk4MDA4MDAwMCA4MDAwMDAwMCAJYnJhLmwJMAlcKGYwIDxjb250MlwrMHhhOD5cKQotCQkJZjA6IFJfRDMwVl8zMl9QQ1JFTAl1bmtub3duCi0gICAgICBmODoJODAxODAwMDAgODAwMDAwMDAgCWptcC5sCTAgPHN0YXJ0PgotCQkJZjg6IFJfRDMwVl8zMgl1bmtub3duCi0gICAgIDEwMDoJMDAxODAwMDAgMDBmMDAwMDAgCWptcC5zCTAgPHN0YXJ0Pgl8fAlub3AJCi0JCQkxMDA6IFJfRDMwVl8yMQl1bmtub3duCi0gICAgIDEwODoJMDAwODAwMDAgMDBmMDAwMDAgCWJyYS5zCTAJXCgxMDggPGNvbnQyXCsweGMwPlwpCXx8CW5vcAkKLQkJCTEwODogUl9EMzBWXzIxX1BDUkVMCXVua25vd24KLQkuLi4KLQotMDAwMDEwMTAgPGZvbz46Ci0gICAgMTAxMDoJMDgwMDEwMDAgMDBmMDAwMDAgCWFkZC5zCXIxLCByMCwgcjAJfHwJbm9wCQotICAgIDEwMTg6CTg0NmJjMDAwIDgwMDAxMDcwIAlsZDJ3LmwJcjYwLCBAXChyMCwgMHgxMDcwXCkKLQkJCTEwMTg6IFJfRDMwVl8zMgkudGV4dAotICAgIDEwMjA6CTA4MDNlMDAwIDgwMjgwMDBiIAlhZGQucwlyNjIsIHIwLCByMAktPglic3Iucwk1OAlcKDEwNzggPGV4aXQ+XCkKLSAgICAxMDI4OgkwMDJiZmZmZCAwMGYwMDAwMCAJYnNyLnMJLTE4CVwoMTAxMCA8Zm9vPlwpCXx8CW5vcAkKLSAgICAxMDMwOgkwMDBiZmUwMyAwMGYwMDAwMCAJYnJhLnMJLWZlOAlcKDQ4IDxjb250Mj5cKQl8fAlub3AJCi0gICAgMTAzODoJMDAwYmZlMDIgMDBmMDAwMDAgCWJyYS5zCS1mZjAJXCg0OCA8Y29udDI+XCkJfHwJbm9wCQotICAgIDEwNDA6CTAwMjgwMDA3IDAwZjAwMDAwIAlic3IucwkzOAlcKDEwNzggPGV4aXQ+XCkJfHwJbm9wCQotICAgIDEwNDg6CTAwMTgwMjBmIDAwZjAwMDAwIAlqbXAucwkxMDc4IDxleGl0Pgl8fAlub3AJCi0JCQkxMDQ4OiBSX0QzMFZfMjEJLnRleHQKLSAgICAxMDUwOgkwMDE4MDIwZiAwMGYwMDAwMCAJam1wLnMJMTA3OCA8ZXhpdD4JfHwJbm9wCQotCQkJMTA1MDogUl9EMzBWXzIxCS50ZXh0Ci0gICAgMTA1ODoJMDAxODAyMGYgMDBmMDAwMDAgCWptcC5zCTEwNzggPGV4aXQ+CXx8CW5vcAkKLQkJCTEwNTg6IFJfRDMwVl8yMQkudGV4dAotICAgIDEwNjA6CTgwMjgwMDAwIDgwMDAwMDE4IAlic3IubAkxOAlcKDEwNzggPGV4aXQ+XCkKLSAgICAxMDY4Ogk4MDE4MDAwMCA4MDAwMTA3OCAJam1wLmwJMTA3OCA8ZXhpdD4KLQkJCTEwNjg6IFJfRDMwVl8zMgkudGV4dAotCi0wMDAwMTA3MCA8bG9uZ3plcm8+OgotCS4uLgotCi0wMDAwMTA3OCA8ZXhpdD46Ci0gICAgMTA3ODoJMDAxMDAwM2UgMDBmMDAwMDAgCWptcC5zCXI2Mgl8fAlub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOTliZjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9yZWxvYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIyBEMzBWIHJlbG9jYXRpb24gdGVzdAotCQotCS50ZXh0Ci1zdGFydDoKLQlhZGQJcjIsIHIwLCBoZWxsbwotCWFkZAlyNCwgcjAsIGJhcgotCWFkZAlyNCwgcjAsIGJhcjIKLQlhZGQJcjQsIHIwLCB1bmsJCi0JYnJhCWNvbnQKLWhlbGxvOgkuYXNjaWkgIkhlbGxvIFdvcmxkXG4iCi0JLmFsaWduIDMKLWNvbnQ6CWptcAljb250MgotCWFicwlyMixyMwotY29udDI6Ci0JYnJhCXN0YXJ0CXx8CW5vcAotCWJyYS5zCWV4aXQKLQlqbXAJMAl8fAlub3AKLQlic3J0bnoucwlyMSxjb250Ci0JYnNydG56CXIxLGNvbnQJCi0JYnJhdG56LnMJcjEsY29udAotCWJyYXRueglyMSxjb250Ci0Jam1wdG56LnMJcjEsY29udAkJCi0JYnNydG56LnMJcjEsIGZvbwotCWptcHRuei5zCXIxLCB1bmsJCi0JYnNydG56LnMJcjEsIHVuawotCWptcHRueglyMSwgdW5rCQotCWJzcnRueglyMSwgdW5rCi0JYnJhLnMJZm9vCi0JYnJhCWZvbwkKLQlicmEJc3RhcnQKLQlqbXAJc3RhcnQKLQlqbXAJc3RhcnQKLQlqbXAucwlzdGFydAotCWptcC5zCWZvbwotCWJyYQlzdGFydAotCWJyYQl1bmtub3duCi0Jam1wCXVua25vd24KLQlqbXAucwl1bmtub3duCQotCWJyYS5zCXVua25vd24KLQkKLQkuZGF0YQotYmFyOgkuYXNjaXoJIlhZWlpZIgotYmFyMjoJLmxvbmcJMHhkZWFkYmVlZgotCQotCS50ZXh0Ci0JLnNwYWNlIDB4RjAwLDAKLQotZm9vOgotCWFkZAlyMSxyMCxyMAotCWxkMncJcjYwLCBAKHIwLGxvbmd6ZXJvKQotCWFkZAlyNjIscjAscjAKLQlic3IucwlleGl0Ci0JYnNyLnMJZm9vCi0JYnJhLnMJY29udDIKLQlicmEucwljb250MgkJCQkKLQlic3IucwlleGl0CQotCWptcC5zCWV4aXQKLQlqbXAucwlleGl0Ci0Jam1wLnMJZXhpdAkJCi0JYnNyCWV4aXQKLQlqbXAJZXhpdAotCi1sb25nemVybzoKLQkucXVhZAkwCi0KLQkudGV4dAotZXhpdDoJCi0Jam1wCXI2MgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YTVhNjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwubAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjo2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo3OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo4OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo5OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgICAgICAgICAgICAgIAkjIHNlcmlhbC5zCi0gICAyICAgICAgICAgICAgICAJIwotICAgMyAgICAgICAgICAgICAgCSMgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlcywgdGhlIHJpZ2h0LXN1Ymluc3RydWN0aW9ucwotICAgNCAgICAgICAgICAgICAgCSMgd2lsbCBuZXZlciBiZSBleGVjdXRlZC4gIEdBUyBzaG91bGQgZGV0ZWN0IHRoaXMuCi0gICA1ICAgICAgICAgICAgICAJCQotICAgNiBcP1w/XD9cPyAwMDAwMDBGMCAJCXRyYXAgcjIxIC0+IGFkZCByMiwgcjAsIHIwIDsgcmlnaHQgaW5zdHJ1Y3Rpb24gd2lsbCBuZXZlciBiZSBleGVjdXRlZC4KLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDYgICAgICAwMDAwMDBGMCAKLSAgIDYgICAgICAwMDAwMDBGMCAKLSAgIDYgICAgICAwMDAwMDA5MCAKLSAgIDYgICAgICAwMDE1MDBGMCAKLSAgIDcgXD9cP1w/XD8gMDgwMDIwMDAgCQlkYnQgICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bwotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNyAgICAgIDAwRjAwMDAwIAotICAgNyAgICAgIDAwQjAwMDAwIAotICAgNyAgICAgIDAwRjAwMDAwIAotICAgOCBcP1w/XD9cPyAwODAwMjAwMCAJCXJ0ZCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA4ICAgICAgMDBBMDAwMDAgCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA5IFw/XD9cP1w/IDA4MDAyMDAwIAkJcmVpdCAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgIDkgICAgICAwMDgwMDAwMCAKLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgMTAgXD9cP1w/XD8gMDgwMDIwMDAgCQltdnRzeXMgcHN3LCAgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSwotICAxMCAgICAgIDAwRjAwMDAwIAotICAxMCAgICAgIDAwRTAwMDQwIAotICAxMCAgICAgIDg4MDAyMDAwIAotICAxMSBcP1w/XD9cPyAwMEUwMDA0MiAJCW12dHN5cyBwc3doLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCi0gIDExICAgICAgODgwMDIwMDAgCi0gIDEyIFw/XD9cP1w/IDAwRTAwMDQxIAkJbXZ0c3lzIHBzd2wsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKLSAgMTIgICAgICA4ODAwMjAwMCAKLSAgMTMgXD9cP1w/XD8gMDBFMDAwNDMgCQltdnRzeXMgZjAsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgOyBPSwotICAxMyAgICAgIDg4MDAyMDAwIAotICAxNCBcP1w/XD9cPyAwMEUwQTA0MCAJCW12dHN5cyBtb2RfcywgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICA7IE9LCi0gIDE0ICAgICAgODgwMDIwMDAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5NWQ2My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBzZXJpYWwucwotIwotIyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLCB0aGUgcmlnaHQtc3ViaW5zdHJ1Y3Rpb25zCi0jIHdpbGwgbmV2ZXIgYmUgZXhlY3V0ZWQuICBHQVMgc2hvdWxkIGRldGVjdCB0aGlzLgotCQotCXRyYXAgcjIxIC0+IGFkZCByMiwgcjAsIHIwIDsgcmlnaHQgaW5zdHJ1Y3Rpb24gd2lsbCBuZXZlciBiZSBleGVjdXRlZC4KLQlkYnQgICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bwotCXJ0ZCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCi0JcmVpdCAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KLQltdnRzeXMgcHN3LCAgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSwotCW12dHN5cyBwc3doLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCi0JbXZ0c3lzIHBzd2wsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKLQltdnRzeXMgZjAsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgOyBPSwotCW12dHN5cyBtb2RfcywgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICA7IE9LCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDIubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGUwNGRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5sCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjo1OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo4OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo5OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxMTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTI6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjEzOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxNDogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTY6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjE3OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxODogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTk6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjIxOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyMjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjM6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI0OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyNjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6Mjc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI4OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyOTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotR0FTIExJU1RJTkcgLioKLQotCi0gICAxICAgICAgICAgICAgICAJIyBEMzBWIHNlcmlhbCBleGVjdXRpb24gdGVzdAotICAgMiAgICAgICAgICAgICAgCQkKLSAgIDMgICAgICAgICAgICAgIAkJLnRleHQKLSAgIDQgICAgICAgICAgICAgIAkJCi0gICA1IFw/XD9cP1w/IDAwMDAwMEYwIAkJYnJhIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNSAgICAgIDAwMDAwMEYwIAotICAgNSAgICAgIDAwMDAwMEYwIAotICAgNSAgICAgIDAwMDAwMDBCIAotICAgNSAgICAgIEZGRkYwMEYwIAotICAgNiBcP1w/XD9cPyAwODA4MzAwMCAJCWJzciAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDYgICAgICAwMEYwMDAwMCAKLSAgIDYgICAgICAwMDJCRkZGRiAKLSAgIDYgICAgICAwMEYwMDAwMCAKLSAgIDcgICAgICAgICAgICAgIAkKLSAgIDggXD9cP1w/XD8gMDgwODMwMDAgCQlicmEvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgOCAgICAgIDAwRjAwMDAwIAotICAgOCAgICAgIDEwMEJGRkZGIAotICAgOCAgICAgIDAwRjAwMDAwIAotICAgOSBcP1w/XD9cPyAwODA4MzAwMCAJCWJzci90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA5ICAgICAgMDBGMDAwMDAgCi0gICA5ICAgICAgMTAyQkZGRkYgCi0gICA5ICAgICAgMDBGMDAwMDAgCi0gIDEwICAgICAgICAgICAgICAJCi0gIDExIFw/XD9cP1w/IDA4MDgzMDAwIAkJYnNyIC0zIC0+IGJzciAtMTAJOyAgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDExICAgICAgMDBGMDAwMDAgCi0gIDExICAgICAgMDAyQkZGRkYgCi0gIDExICAgICAgMDBGMDAwMDAgCi0gIDEyIFw/XD9cP1w/IDAwMkJGRkZFIAkJYnNyIC0zIC0+IGJzci94dCAtMTAgICAgOyAgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDEyICAgICAgMDBGMDAwMDAgCi0gIDEyICAgICAgMDAyQkZGRkYgCi0gIDEyICAgICAgMDBGMDAwMDAgCi0gIDEzIFw/XD9cP1w/IDMwMkJGRkZFIAkJYnNyL3R4IC0zIC0+IGJzciAtMTAgICAgOyAgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxMyAgICAgIDAwRjAwMDAwIAotICAxMyAgICAgIDEwMkJGRkZGIAotICAxMyAgICAgIDAwRjAwMDAwIAotICAxNCBcP1w/XD9cPyAwMDJCRkZGRSAJCWJzci90eCAtMyAtPiBic3IvZnggLTEwIDsgICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTQgICAgICAwMEYwMDAwMCAKLSAgMTQgICAgICAxMDJCRkZGRiAKLSAgMTQgICAgICAwMEYwMDAwMCAKLSAgMTUgICAgICAgICAgICAgIAkKLSAgMTYgXD9cP1w/XD8gMjAyQkZGRkUgCQlicmEgLTMgLT4gYnJhICAxMCAgICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxNiAgICAgIDAwRjAwMDAwIAotICAxNiAgICAgIDAwMEJGRkZGIAotICAxNiAgICAgIDAwRjAwMDAwIAotICAxNyBcP1w/XD9cPyAwMDA4MDAwMSAJCWJyYSAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE3ICAgICAgMDBGMDAwMDAgCi0gIDE3ICAgICAgMDAwQkZGRkYgCi0MR0FTIExJU1RJTkcgLioKLQotCi0gIDE3ICAgICAgMDBGMDAwMDAgCi0gIDE4IFw/XD9cP1w/IDEwMDgwMDAxIAkJYnJhL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE4ICAgICAgMDBGMDAwMDAgCi0gIDE4ICAgICAgMTAwQkZGRkYgCi0gIDE4ICAgICAgMDBGMDAwMDAgCi0gIDE5IFw/XD9cP1w/IDAwMDgwMDAxIAkJYnJhL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE5ICAgICAgMDBGMDAwMDAgCi0gIDE5ICAgICAgMTAwQkZGRkYgCi0gIDE5ICAgICAgMDBGMDAwMDAgCi0gIDIwICAgICAgICAgICAgICAJCi0gIDIxIFw/XD9cP1w/IDIwMDgwMDAxIAkJYnNyIC0zIC0+IGJyYSAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjEgICAgICAwMEYwMDAwMCAKLSAgMjEgICAgICAwMDJCRkZGRiAKLSAgMjEgICAgICAwMEYwMDAwMCAKLSAgMjIgXD9cP1w/XD8gMDAwODAwMDEgCQlic3IgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyMiAgICAgIDAwRjAwMDAwIAotICAyMiAgICAgIDAwMkJGRkZGIAotICAyMiAgICAgIDAwRjAwMDAwIAotICAyMyBcP1w/XD9cPyAxMDA4MDAwMSAJCWJzci90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyMyAgICAgIDAwRjAwMDAwIAotICAyMyAgICAgIDEwMkJGRkZGIAotICAyMyAgICAgIDAwRjAwMDAwIAotICAyNCBcP1w/XD9cPyAwMDA4MDAwMSAJCWJzci90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyNCAgICAgIDAwRjAwMDAwIAotICAyNCAgICAgIDEwMkJGRkZGIAotICAyNCAgICAgIDAwRjAwMDAwIAotICAyNSAgICAgICAgICAgICAgCQotICAyNiBcP1w/XD9cPyAyMDA4MDAwMSAJCWJyYSAtMyAtPiBic3IgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDI2ICAgICAgMDBGMDAwMDAgCi0gIDI2ICAgICAgMDAwQkZGRkYgCi0gIDI2ICAgICAgMDBGMDAwMDAgCi0gIDI3IFw/XD9cP1w/IDAwMjgwMDAxIAkJYnJhIC0zIC0+IGJzci90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjcgICAgICAwMEYwMDAwMCAKLSAgMjcgICAgICAwMDBCRkZGRiAKLSAgMjcgICAgICAwMEYwMDAwMCAKLSAgMjggXD9cP1w/XD8gMTAyODAwMDEgCQlicmEvdHggLTMgLT4gYnNyIDEwICAgICA7ICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjggICAgICAwMEYwMDAwMCAKLSAgMjggICAgICAxMDBCRkZGRiAKLSAgMjggICAgICAwMEYwMDAwMCAKLSAgMjkgXD9cP1w/XD8gMDAyODAwMDEgCQlicmEvdHggLTMgLT4gYnNyL2Z4IDEwICA7ICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjkgICAgICAwMEYwMDAwMCAKLSAgMjkgICAgICAxMDBCRkZGRiAKLSAgMjkgICAgICAwMEYwMDAwMCAKLSAgMjkgICAgICAyMDI4MDAwMSAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTMxNTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIEQzMFYgc2VyaWFsIGV4ZWN1dGlvbiB0ZXN0Ci0JCi0JLnRleHQKLQkKLQlicmEgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi0JYnNyIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotCi0JYnJhL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLQlic3IvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotCi0JYnNyIC0zIC0+IGJzciAtMTAJOyAgICAgICBJbnZhbGlkCi0JYnNyIC0zIC0+IGJzci94dCAtMTAgICAgOyAgICAgICBJbnZhbGlkCi0JYnNyL3R4IC0zIC0+IGJzciAtMTAgICAgOyAgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBic3IvZnggLTEwIDsgICAgICAgVmFsaWQKLQotCWJyYSAtMyAtPiBicmEgIDEwICAgICAgIDsgICAgICBJbnZhbGlkCi0JYnJhIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLQlicmEvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLQlicmEvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLQotCWJzciAtMyAtPiBicmEgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCi0JYnNyIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLQlic3IvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLQlic3IvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLQotCWJyYSAtMyAtPiBic3IgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCi0JYnJhIC0zIC0+IGJzci90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLQlicmEvdHggLTMgLT4gYnNyIDEwICAgICA7ICAgICAgVmFsaWQKLQlicmEvdHggLTMgLT4gYnNyL2Z4IDEwICA7ICAgICAgVmFsaWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllYjA1Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDJPLmwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6NTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6NjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTE6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjEyOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxNjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjIxOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyMjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjY6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI3OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgICAgICAgICAgICAgIAkjIEQzMFYgc2VyaWFsIGV4ZWN1dGlvbiB0ZXN0Ci0gICAyICAgICAgICAgICAgICAJCQotICAgMyAgICAgICAgICAgICAgCQkudGV4dAotICAgNCAgICAgICAgICAgICAgCQkKLSAgIDUgXD9cP1w/XD8gMDAwMDAwRjAgCQlicmEgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA1ICAgICAgMDAwMDAwRjAgCi0gICA1ICAgICAgMDAwMDAwRjAgCi0gICA1ICAgICAgMDAwMDAwMEIgCi0gICA1ICAgICAgRkZGRjAwRjAgCi0gICA2IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnNyIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNiAgICAgIDAwMkJGRkZGIAotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNyAgICAgICAgICAgICAgCQotICAgOCBcP1w/XD9cPyAwODA4MzAwMCAJCWJyYS90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA4ICAgICAgMTAwQkZGRkYgCi0gICA4ICAgICAgODgwODMwMDAgCi0gICA5IFw/XD9cP1w/IDEwMkJGRkZGIAkJYnNyL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLSAgIDkgICAgICA4ODA4MzAwMCAKLSAgMTAgICAgICAgICAgICAgIAkKLSAgMTEgXD9cP1w/XD8gMDAyQkZGRkYgCQlic3IgLTMgLT4gYnNyIC0xMAk7ICAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTIgXD9cP1w/XD8gMDAyQkZGRkUgCQlic3IgLTMgLT4gYnNyL3h0IC0xMCAgICA7ICAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTIgICAgICAwMEYwMDAwMCAKLSAgMTIgICAgICAwMDJCRkZGRiAKLSAgMTIgICAgICAwMEYwMDAwMCAKLSAgMTMgXD9cP1w/XD8gMzAyQkZGRkUgCQlic3IvdHggLTMgLT4gYnNyIC0xMCAgICA7ICAgICAgIFZhbGlkCi0gIDEzICAgICAgMDBGMDAwMDAgCi0gIDEzICAgICAgMTAyQkZGRkYgCi0gIDEzICAgICAgODAyQkZGRkUgCi0gIDE0IFw/XD9cP1w/IDEwMkJGRkZGIAkJYnNyL3R4IC0zIC0+IGJzci9meCAtMTAgOyAgICAgICBWYWxpZAotICAxNCAgICAgIEEwMkJGRkZFIAotICAxNSAgICAgICAgICAgICAgCQotICAxNiBcP1w/XD9cPyAwMDBCRkZGRiAJCWJyYSAtMyAtPiBicmEgIDEwICAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE2ICAgICAgMDBGMDAwMDAgCi0gIDE3IFw/XD9cP1w/IDAwMDgwMDAxIAkJYnJhIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTcgICAgICAwMEYwMDAwMCAKLSAgMTcgICAgICAwMDBCRkZGRiAKLSAgMTcgICAgICAwMEYwMDAwMCAKLSAgMTggXD9cP1w/XD8gMTAwODAwMDEgCQlicmEvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLSAgMTggICAgICAwMEYwMDAwMCAKLSAgMTggICAgICAxMDBCRkZGRiAKLSAgMTggICAgICA4MDA4MDAwMSAKLSAgMTkgXD9cP1w/XD8gMTAwQkZGRkYgCQlicmEvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLSAgMTkgICAgICBBMDA4MDAwMSAKLSAgMjAgICAgICAgICAgICAgIAkKLSAgMjEgXD9cP1w/XD8gMDAyQkZGRkYgCQlic3IgLTMgLT4gYnJhIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyMSAgICAgIDAwRjAwMDAwIAotICAyMiBcP1w/XD9cPyAwMDA4MDAwMSAJCWJzciAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi0MR0FTIExJU1RJTkcgLioKLQotCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDIyICAgICAgMDBGMDAwMDAgCi0gIDIyICAgICAgMDAyQkZGRkYgCi0gIDIyICAgICAgMDBGMDAwMDAgCi0gIDIzIFw/XD9cP1w/IDEwMDgwMDAxIAkJYnNyL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi0gIDIzICAgICAgMDBGMDAwMDAgCi0gIDIzICAgICAgMTAyQkZGRkYgCi0gIDIzICAgICAgODAwODAwMDEgCi0gIDI0IFw/XD9cP1w/IDEwMkJGRkZGIAkJYnNyL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi0gIDI0ICAgICAgQTAwODAwMDEgCi0gIDI1ICAgICAgICAgICAgICAJCi0gIDI2IFw/XD9cP1w/IDAwMEJGRkZGIAkJYnJhIC0zIC0+IGJzciAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjYgICAgICAwMEYwMDAwMCAKLSAgMjcgXD9cP1w/XD8gMDAyODAwMDEgCQlicmEgLTMgLT4gYnNyL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyNyAgICAgIDAwRjAwMDAwIAotICAyNyAgICAgIDAwMEJGRkZGIAotICAyNyAgICAgIDAwRjAwMDAwIAotICAyOCBcP1w/XD9cPyAxMDI4MDAwMSAJCWJyYS90eCAtMyAtPiBic3IgMTAgICAgIDsgICAgICBWYWxpZAotICAyOCAgICAgIDAwRjAwMDAwIAotICAyOCAgICAgIDEwMEJGRkZGIAotICAyOCAgICAgIDgwMjgwMDAxIAotICAyOSBcP1w/XD9cPyAxMDBCRkZGRiAJCWJyYS90eCAtMyAtPiBic3IvZnggMTAgIDsgICAgICBWYWxpZAotICAyOSAgICAgIEEwMjgwMDAxIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDUzMTU5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ucworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgRDMwViBzZXJpYWwgZXhlY3V0aW9uIHRlc3QKLQkKLQkudGV4dAotCQotCWJyYSAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLQlic3IgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi0KLQlicmEvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi0KLQlic3IgLTMgLT4gYnNyIC0xMAk7ICAgICAgIEludmFsaWQKLQlic3IgLTMgLT4gYnNyL3h0IC0xMCAgICA7ICAgICAgIEludmFsaWQKLQlic3IvdHggLTMgLT4gYnNyIC0xMCAgICA7ICAgICAgIFZhbGlkCi0JYnNyL3R4IC0zIC0+IGJzci9meCAtMTAgOyAgICAgICBWYWxpZAotCi0JYnJhIC0zIC0+IGJyYSAgMTAgICAgICAgOyAgICAgIEludmFsaWQKLQlicmEgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJyYS90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotCWJyYS90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotCi0JYnNyIC0zIC0+IGJyYSAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLQlic3IgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJzci90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotCi0JYnJhIC0zIC0+IGJzciAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLQlicmEgLTMgLT4gYnNyL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJyYS90eCAtMyAtPiBic3IgMTAgICAgIDsgICAgICBWYWxpZAotCWJyYS90eCAtMyAtPiBic3IvZnggMTAgIDsgICAgICBWYWxpZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZiNDNjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcubAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjo1OiBXYXJuaW5nOiBPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLS4qOjY6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6NzogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjo4OiBXYXJuaW5nOiBPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLS4qOjk6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6MTA6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6MTE6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6MTI6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotR0FTIExJU1RJTkcgLioKLQotCi0gICAxICAgICAgICAgICAgICAJIyBHQVMgc2hvdWxkIHByaW50IGEgd2FybmluZyAgd2hlbiBhbiBvZGQgcmVnaXN0ZXIgaXMgdXNlZCBhcyBhIHRhcmdldCAKLSAgIDIgICAgICAgICAgICAgIAkjIG9mIG11bHRpLXdvcmQgaW5zdHJ1Y3Rpb25zOiBsZDJ3LCBsZDRiaCwgbGQ0Ymh1LCBsZDJoLCBzdDJ3LCBzdDRoYiwgc3QyaCwgCi0gICAzICAgICAgICAgICAgICAJIyBhbmQgbXVseDJoCi0gICA0ICAgICAgICAgICAgICAJCi0gICA1IDAwMDAgMDU2ODEwMDAgCXN0MncgcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgNSAgICAgIDAwRjAwMDAwIAotICAgNiAwMDA4IDA0NjgxMDAwIAlsZDJ3IHIxLCBAKHIwLCAwKQl8fAlub3AgCi0uKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLSAgIDYgICAgICAwMEYwMDAwMCAKLSAgIDcgMDAxMCAwNDU4MTAwMCAJbGQ0YmggcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgNyAgICAgIDAwRjAwMDAwIAotICAgOCAwMDE4IDA0RDgxMDAwIAlsZDRiaHUgcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgOCAgICAgIDAwRjAwMDAwIAotICAgOSAwMDIwIDA0MzgxMDAwIAlsZDJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCi0uKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgMTAgMDAyOCAwNTU4MTAwMCAJc3Q0aGIgcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAxMCAgICAgIDAwRjAwMDAwIAotICAxMSAwMDMwIDA1MzgxMDAwIAlzdDJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCi0uKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTIgMDAzOCAwMEYwMDAwMCAJbm9wCXx8CW11bHgyaCByMSwgcjUsIHI2ICAgCi0uKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLSAgMTIgICAgICAwQTEwMTE0NiAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5Zjc1MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3dhcm5fb2RkcmVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIEdBUyBzaG91bGQgcHJpbnQgYSB3YXJuaW5nICB3aGVuIGFuIG9kZCByZWdpc3RlciBpcyB1c2VkIGFzIGEgdGFyZ2V0IAotIyBvZiBtdWx0aS13b3JkIGluc3RydWN0aW9uczogbGQydywgbGQ0YmgsIGxkNGJodSwgbGQyaCwgc3Qydywgc3Q0aGIsIHN0MmgsIAotIyBhbmQgbXVseDJoCi0KLXN0MncgcjEsIEAocjAsIDApCXx8CW5vcCAKLWxkMncgcjEsIEAocjAsIDApCXx8CW5vcCAKLWxkNGJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCi1sZDRiaHUgcjEsIEAocjAsIDApCXx8CW5vcCAKLWxkMmggcjEsIEAocjAsIDApCXx8CW5vcCAKLXN0NGhiIHIxLCBAKHIwLCAwKQl8fAlub3AgCi1zdDJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCi1ub3AJfHwJbXVseDJoIHIxLCByNSwgcjYgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9lbGYuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL2VsZi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNmYyYWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL2VsZi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jCi0jIGVsZiB0ZXN0cwotIwotCi0jIFdlJ3JlIHRlc3RpbmcgYml0cyBpbiBvYmotZWxmIC0tIGRvbid0IHJ1biBvbiBhbnl0aGluZyBlbHNlLgotaWYgeyAoW2lzdGFyZ2V0ICIqLSotZWxmKiJdCQkKLSAgICAgIHx8IFtpc3RhcmdldCAiKi0qLWxpbnV4KiJdCi0gICAgICB8fCBbaXN0YXJnZXQgInNwYXJjKi0qLXNvbGFyaXMqIl0KLSAgICAgIHx8IFtpc3RhcmdldCAibWlwcyotKi1pcml4NioiXSkKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotbGludXgqYW91dCpdCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWxpbnV4Km9sZGxkKl0KLX0gdGhlbiB7Ci0gICAgcnVuX2R1bXBfdGVzdCAic2VjdGlvbjAiIAotICAgIHJ1bl9kdW1wX3Rlc3QgInNlY3Rpb24xIiAKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24wLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NzRhNjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24wLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jb2JqZHVtcDogLXMKLSNuYW1lOiBlbGYgc2VjdGlvbjAKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotQ29udGVudHMgb2Ygc2VjdGlvbiAuZGF0YToKLSAwMDAwIDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLiAgICAgICAgICAgICAgCi0jIFRoZSBNSVBTIGluY2x1ZGVzIGEgJ3NlY3Rpb24gLnJlZ2luZm8nIGFuZCBzdWNoIGhlcmUuCi0jLi4uCi1Db250ZW50cyBvZiBzZWN0aW9uIEE6Ci0gMDAwMCAwMTAxMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgIAotQ29udGVudHMgb2Ygc2VjdGlvbiBCOgotIDAwMDAgMDIwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uICAgICAgICAgICAgICAKLUNvbnRlbnRzIG9mIHNlY3Rpb24gQzoKLSAwMDAwIDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGM4ZjBjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLmRhdGEKLQkuYnl0ZSAwCi0uc2VjdGlvbiBBCi0JLmJ5dGUgMQotLnB1c2hzZWN0aW9uIEIKLQkuYnl0ZSAyCi0ucHVzaHNlY3Rpb24gQwotCS5ieXRlIDMKLS5wb3BzZWN0aW9uCi0JLmJ5dGUgMgotLnBvcHNlY3Rpb24KLQkuYnl0ZSAxCi0ucHJldmlvdXMKLQkuYnl0ZSAwCi0ucHJldmlvdXMKLQkuYnl0ZSAxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTA1MmY1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI29iamR1bXA6IC1zCi0jbmFtZTogZWxmIHNlY3Rpb24xCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLUNvbnRlbnRzIG9mIHNlY3Rpb24gLmRhdGE6Ci0gMDAwMCAwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgIAotIyBUaGUgTUlQUyBpbmNsdWRlcyBhICdzZWN0aW9uIC5yZWdpbmZvJyBhbmQgc3VjaCBoZXJlLgotIy4uLgotQ29udGVudHMgb2Ygc2VjdGlvbiBBOgotIDAwMDAgMDEwMTAxMDEgMDEwMSAgICAgICAgICAgICAgICAgICAgICAgIC4uLi4uLiAgICAgICAgICAKLUNvbnRlbnRzIG9mIHNlY3Rpb24gQjoKLSAwMDAwIDAyMDIwMjAyIDAyICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4uLiAgICAgICAgICAgCi1Db250ZW50cyBvZiBzZWN0aW9uIEM6Ci0gMDAwMCAwMzAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4gICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24xLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU5MmFkZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjEucworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS5kYXRhCi0JLmJ5dGUgMAotLnNlY3Rpb24gQQotCS5ieXRlIDEKLS5wcmV2aW91cwotCS5ieXRlIDAKLS5wcmV2aW91cwotCS5ieXRlIDEKLS5wdXNoc2VjdGlvbiBCCi0JLmJ5dGUgMgotLnByZXZpb3VzCi0JLmJ5dGUgMQotLnByZXZpb3VzCi0JLmJ5dGUgMgotLnB1c2hzZWN0aW9uIEMKLQkuYnl0ZSAzCi0ucHJldmlvdXMKLQkuYnl0ZSAyCi0ucHJldmlvdXMKLQkuYnl0ZSAzCi0ucG9wc2VjdGlvbgotCS5ieXRlIDIKLS5wcmV2aW91cwotCS5ieXRlIDEKLS5wcmV2aW91cwotCS5ieXRlIDIKLS5wb3BzZWN0aW9uCi0JLmJ5dGUgMQotLnByZXZpb3VzCi0JLmJ5dGUgMAotLnByZXZpb3VzCi0JLmJ5dGUgMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhYzc2My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24uZAorKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogYWxsaW5zbgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8YWRkPjoKLSAgIDA6CWE2IDAxICAgICAgIAlhZGQgcjAscjEKLSAgIDI6CWE0IDAyICAgICAgIAlhZGQgMHgwLHIyCi0KLTArMDAwNCA8YWRkMj46Ci0gICA0OglhNSBmMyAgICAgICAJYWRkMiAtMSxyMwotCi0wKzAwMDYgPGFkZGM+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/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDQ4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19leHRlbmQge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0ZW5kcy5zOiBoODMwMHMgZXh0ZW5kIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0ZW5kcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMTdEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDE3RjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAxNzUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMTc3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19tYWMge30gewotICAgIHNldCB0ZXN0bmFtZSAibWFjcy5zOiBoODMwMHMgbWFjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibWFjcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMDFBMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDAzMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAwMzMxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMDE2MDZEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAwMjIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMDIzMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19tdWx0aXBsZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtdWx0aXBsZXMuczogaDgzMDBzIG11bHRpcGxlIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibXVsdGlwbGVzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwMTEwNkQ3MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDAxMjA2RDcyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDEzMDZENzNcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTEwNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxMjA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMDEzMDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfbW92MzJidWcge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92MzJidWcuczogaDgzMDBoIG1vdjMyYnVnIHRlc3QiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAibW92MzJidWcucyIgIiIgIlByb3BlciByZWxvY2F0aW9uIGZvciBtb3YubCAocGFydCAxKSJdIHRoZW4gewotICAgICAgICBvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIjAwMDAwMDAyXFteXG5cXSozMlxbXlxuXF0qX2EuMHgwKjg4Y2E2YzAwXFteXG5cXSpcbiIKLQkJCQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQl0aW1lb3V0IAkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIG9iamR1bXBfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotaWYgW2lzdGFyZ2V0IGg4MzAwKi0qLSpdIHRoZW4gewotICAgICMgVGVzdCB0aGUgYmFzaWMgaDgzMDAgaW5zdHJ1Y3Rpb24gcGFyc2VyCi0gICAgZG9faDgzMDBfYWRkX3N1YgotICAgIGRvX2g4MzAwX2xvZ2ljYWwKLSAgICBkb19oODMwMF9jYnJhbmNoCi0gICAgZG9faDgzMDBfYml0b3BzMQotICAgIGRvX2g4MzAwX2JpdG9wczIKLSAgICBkb19oODMwMF9iaXRvcHMzCi0gICAgZG9faDgzMDBfYml0b3BzNAotICAgIGRvX2g4MzAwX2JyYW5jaAotICAgIGRvX2g4MzAwX2NvbXBhcmUKLSAgICBkb19oODMwMF9kZWNpbWFsCi0gICAgZG9faDgzMDBfaW5jZGVjCi0gICAgZG9faDgzMDBfZGl2bXVsCi0gICAgZG9faDgzMDBfbWlzYwotICAgIGRvX2g4MzAwX21vdmIKLSAgICBkb19oODMwMF9tb3Z3Ci0gICAgZG9faDgzMDBfcHVzaHBvcAotICAgIGRvX2g4MzAwX3JvdGF0ZV9zaGlmdAotCi0gICAgIyBOb3cgdGVzdCB0aGUgaDgzMDBoIGluc3RydWN0aW9uIHBhcnNlcgotICAgIGRvX2g4MzAwaF9hZGRfc3ViCi0gICAgZG9faDgzMDBoX2xvZ2ljYWwKLSAgICBkb19oODMwMGhfY2JyYW5jaAotICAgIGRvX2g4MzAwaF9iaXRvcHMxCi0gICAgZG9faDgzMDBoX2JpdG9wczIKLSAgICBkb19oODMwMGhfYml0b3BzMwotICAgIGRvX2g4MzAwaF9iaXRvcHM0Ci0gICAgZG9faDgzMDBoX2JyYW5jaAotICAgIGRvX2g4MzAwaF9jb21wYXJlCi0gICAgZG9faDgzMDBoX2RlY2ltYWwKLSAgICBkb19oODMwMGhfaW5jZGVjCi0gICAgZG9faDgzMDBoX2Rpdm11bAotICAgIGRvX2g4MzAwaF9taXNjCi0gICAgZG9faDgzMDBoX21vdmIKLSAgICBkb19oODMwMGhfbW92dwotICAgIGRvX2g4MzAwaF9tb3ZsCi0gICAgZG9faDgzMDBfcHVzaHBvcAotICAgIGRvX2g4MzAwaF9yb3RhdGVfc2hpZnQKLSAgICBkb19oODMwMGhfZXh0ZW5kCi0KLSAgICAjIE5vdyB0ZXN0IHRoZSBoODMwMHMgaW5zdHJ1Y3Rpb24gcGFyc2VyCi0gICAgZG9faDgzMDBzX2FkZF9zdWIKLSAgICBkb19oODMwMHNfbG9naWNhbAotICAgIGRvX2g4MzAwc19jYnJhbmNoCi0gICAgZG9faDgzMDBzX2JpdG9wczEKLSAgICBkb19oODMwMHNfYml0b3BzMgotICAgIGRvX2g4MzAwc19iaXRvcHMzCi0gICAgZG9faDgzMDBzX2JpdG9wczQKLSAgICBkb19oODMwMHNfYnJhbmNoCi0gICAgZG9faDgzMDBzX2NvbXBhcmUKLSAgICBkb19oODMwMHNfZGVjaW1hbAotICAgIGRvX2g4MzAwc19pbmNkZWMKLSAgICBkb19oODMwMHNfZGl2bXVsCi0gICAgZG9faDgzMDBzX21pc2MKLSAgICBkb19oODMwMHNfbW92YgotICAgIGRvX2g4MzAwc19tb3Z3Ci0gICAgZG9faDgzMDBzX21vdmwKLSAgICBkb19oODMwMF9wdXNocG9wCi0gICAgZG9faDgzMDBzX3JvdGF0ZV9zaGlmdAotICAgIGRvX2g4MzAwc19leHRlbmQKLSAgICBkb19oODMwMHNfbWFjCi0gICAgZG9faDgzMDBzX211bHRpcGxlCi0KLSAgICBkb19oODMwMGhfbW92MzJidWcKLQotICAgICMgTm93IHNvbWUgcmFuZG9tIHRlc3RzCi0gICAgc2V0IHN2cjRwaWMgW2V4cHIgW2lzdGFyZ2V0ICotKi1lbGYqXSB8fCBbaXN0YXJnZXQgKi0qLWlyaXg1Kl0gXQotICAgIHNldCBlbXBpYyBbZXhwciBbaXN0YXJnZXQgKi0qLWVjb2ZmKl0gfHwgW2lzdGFyZ2V0ICotKi11bHRyaXgqXSB8fCBbaXN0YXJnZXQgKi0qLWlyaXhcWzEtNFxdKl0gXQotICAgIHNldCBhb3V0IFtleHByIFtpc3RhcmdldCAqLSotYnNkKl0gfHwgW2lzdGFyZ2V0ICotKi1uZXRic2QqXV0KLQotICAgIHJ1bl9kdW1wX3Rlc3QgImZmeHgxIgotICAgIGdhc190ZXN0ICJjbXBzaTIucyIgIiIgIiIgImNtcHNpMi5zIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxODgyNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWMucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9pbmNkZWM6Ci0JZGVjIHIwbAotCWluYyByMGwKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjkzZmM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY2gucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9pbmNkZWM6Ci0JZGVjLmIgcjBsCi0JZGVjLncgIzEscjAKLQlkZWMudyAjMixyMAotCWRlYy5sICMxLGVyMAotCWRlYy5sICMyLGVyMAotCWluYy5iIHIwbAotCWluYy53ICMxLHIwCi0JaW5jLncgIzIscjAKLQlpbmMubCAjMSxlcjAKLQlpbmMubCAjMixlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ1NzA4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY3MucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19pbmNkZWM6Ci0JZGVjLmIgcjBsCi0JZGVjLncgIzEscjAKLQlkZWMudyAjMixyMAotCWRlYy5sICMxLGVyMAotCWRlYy5sICMyLGVyMAotCWluYy5iIHIwbAotCWluYy53ICMxLHIwCi0JaW5jLncgIzIscjAKLQlpbmMubCAjMSxlcjAKLQlpbmMubCAjMixlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjdlM2I3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWwucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQkudGV4dAotaDgzMDBfbG9naWNhbDoKLQlhbmQgIzE2LHIxbAotCWFuZCByMWwscjFoCi0JYW5kYyAjMTYsY2NyCi0Jb3IgIzE2LHIwbAotCW9yIHIxbCxyMGwKLQlvcmMgIzE2LGNjcgotCXhvciAjMTYscjBsCi0JeG9yIHIwbCxyMWwKLQl4b3JjICMxNixjY3IKLQluZWcgcjBsCi0Jbm90IHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5NWYxMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2xvZ2ljYWw6Ci0JYW5kLmIgIzE2LHIxbAotCWFuZC5iIHIxbCxyMWgKLQlhbmQudyAjMzIscjEKLQlhbmQudyByMSxyMQotCWFuZC5sICM2NCxlcjEKLQlhbmQubCBlcjEsZXIxCi0JYW5kYyAjMTYsY2NyCi0Jb3IuYiAjMTYscjBsCi0Jb3IuYiByMWwscjBsCi0Jb3IudyAjMzIscjEKLQlvci53IHIxLHIxCi0Jb3IubCAjNjQsZXIxCi0Jb3IubCBlcjEsZXIxCi0Jb3JjICMxNixjY3IKLQl4b3IuYiAjMTYscjBsCi0JeG9yLmIgcjBsLHIxbAotCXhvci53ICMzMixyMQotCXhvci53IHIxLHIxCi0JeG9yLmwgIzY0LGVyMQotCXhvci5sIGVyMSxlcjEKLQl4b3JjICMxNixjY3IKLQluZWcuYiByMGwKLQluZWcudyByMAotCW5lZy5sIGVyMAotCW5vdC5iIHIwbAotCW5vdC53IHIwCi0Jbm90LmwgZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2Fscy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2M0Y2JhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbG9naWNhbDoKLQlhbmQuYiAjMTYscjFsCi0JYW5kLmIgcjFsLHIxaAotCWFuZC53ICMzMixyMQotCWFuZC53IHIxLHIxCi0JYW5kLmwgIzY0LGVyMQotCWFuZC5sIGVyMSxlcjEKLQlhbmRjICMxNixjY3IKLQlhbmRjICMxNixleHIKLQlvci5iICMxNixyMGwKLQlvci5iIHIxbCxyMGwKLQlvci53ICMzMixyMQotCW9yLncgcjEscjEKLQlvci5sICM2NCxlcjEKLQlvci5sIGVyMSxlcjEKLQlvcmMgIzE2LGNjcgotCW9yYyAjMTYsZXhyCi0JeG9yLmIgIzE2LHIwbAotCXhvci5iIHIwbCxyMWwKLQl4b3IudyAjMzIscjEKLQl4b3IudyByMSxyMQotCXhvci5sICM2NCxlcjEKLQl4b3IubCBlcjEsZXIxCi0JeG9yYyAjMTYsY2NyCi0JeG9yYyAjMTYsZXhyCi0JbmVnLmIgcjBsCi0JbmVnLncgcjAKLQluZWcubCBlcjAKLQlub3QuYiByMGwKLQlub3QudyByMAotCW5vdC5sIGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tYWNzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tYWNzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZGY2ZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWFjcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX21hYzoKLQljbHJtYWMKLQlsZG1hYyBlcjAsbWFjaAotCWxkbWFjIGVyMSxtYWNsCi0JbWFjIEBlcjArLEBlcjErCi0Jc3RtYWMgbWFjaCxlcjAKLQlzdG1hYyBtYWNsLGVyMQotCQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNmY4MDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzYy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9taXNjOgotCWVlcG1vdgotCWxkYyAjMCxjY3IKLQlsZGMgcjBsLGNjcgotOwltb3ZmcGUgMTY6MTYscjBsCi07CW1vdnRwZSByMGwsMTY6MTYKLQlub3AKLQlydGUKLQlydHMKLQlzbGVlcAotCXN0YyBjY3IscjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2VjYjNkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfbWlzYzoKLQllZXBtb3YuYgotIAllZXBtb3YudwotCWxkYy5iICMwLGNjcgotCWxkYy5iIHIwbCxjY3IKLQlsZGMudyBAZXIwLGNjcgotCWxkYy53IEAoMTY6MTYsZXIwKSxjY3IKLQlsZGMudyBAKDMyOjI0LGVyMCksY2NyCi0JbGRjLncgQGVyMCssY2NyCi0JbGRjLncgQGg4MzAwaF9taXNjOjE2LGNjcgotCWxkYy53IEBoODMwMGhfbWlzYzoyNCxjY3IKLTsJbW92ZnBlIDE2OjE2LHIwbAotOwltb3Z0cGUgcjBsLDE2OjE2Ci0Jbm9wCi0JcnRlCi0JcnRzCi0Jc2xlZXAKLQlzdGMuYiBjY3IscjBsCi0Jc3RjLncgY2NyLEBlcjAKLQlzdGMudyBjY3IsQCgxNjoxNixlcjApCi0Jc3RjLncgY2NyLEAoMzI6MjQsZXIwKQotCXN0Yy53IGNjcixALWVyMAotCXN0Yy53IGNjcixAaDgzMDBoX21pc2M6MTYKLQlzdGMudyBjY3IsQGg4MzAwaF9taXNjOjI0Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzdhMTc3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbWlzYzoKLQllZXBtb3YuYgotIAllZXBtb3YudwotCWxkYy5iICMwLGNjcgotCWxkYy5iIHIwbCxjY3IKLQlsZGMuYiAjMCxleHIKLQlsZGMuYiByMGwsZXhyCi0JbGRjLncgQGVyMCxjY3IKLQlsZGMudyBAKDE2OjE2LGVyMCksY2NyCi0JbGRjLncgQCgzMjozMixlcjApLGNjcgotCWxkYy53IEBlcjArLGNjcgotCWxkYy53IEBoODMwMHNfbWlzYzoxNixjY3IKLQlsZGMudyBAaDgzMDBzX21pc2M6MzIsY2NyCi0JbGRjLncgQGVyMCxleHIKLQlsZGMudyBAKDE2OjE2LGVyMCksZXhyCi0JbGRjLncgQCgzMjozMixlcjApLGV4cgotCWxkYy53IEBlcjArLGV4cgotCWxkYy53IEBoODMwMHNfbWlzYzoxNixleHIKLQlsZGMudyBAaDgzMDBzX21pc2M6MzIsZXhyCi07CW1vdmZwZSAxNjoxNixyMGwKLTsJbW92dHBlIHIwbCwxNjoxNgotCW5vcAotCXJ0ZQotCXJ0cwotCXNsZWVwCi0Jc3RjLmIgY2NyLHIwbAotCXN0Yy5iIGV4cixyMGwKLQlzdGMudyBjY3IsQGVyMAotCXN0Yy53IGNjcixAKDE2OjE2LGVyMCkKLQlzdGMudyBjY3IsQCgzMjozMixlcjApCi0Jc3RjLncgY2NyLEAtZXIwCi0Jc3RjLncgY2NyLEBoODMwMHNfbWlzYzoxNgotCXN0Yy53IGNjcixAaDgzMDBzX21pc2M6MzIKLQlzdGMudyBleHIsQGVyMAotCXN0Yy53IGV4cixAKDE2OjE2LGVyMCkKLQlzdGMudyBleHIsQCgzMjozMixlcjApCi0Jc3RjLncgZXhyLEAtZXIwCi0Jc3RjLncgZXhyLEBoODMwMHNfbWlzYzoxNgotCXN0Yy53IGV4cixAaDgzMDBzX21pc2M6MzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdjMyYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3YzMmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODM5M2UzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdjMyYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQkuaDgzMDBoCi0JLmdsb2JhbCBfYQotYmxhaDoKLQltb3YubCAgICNfYS0yMDAwMDAwMDAwLGVyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92Yi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTA0MGMwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmIucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfbW92YjoKLQltb3YuYiByMGwscjFsCi0JbW92LmIgIzE2LHIwbAotCW1vdi5iIEByMSxyMGwKLQltb3YuYiBAKDE2OjE2LHIxKSxyMGwKLQltb3YuYiBAcjErLHIwbAotCW1vdi5iIEAxNjo4LHIwbAotCW1vdi5iIEBoODMwMF9tb3ZiOjE2LHIwbAotCW1vdi5iIHIwbCxAcjEKLQltb3YuYiByMGwsQCgxNjoxNixyMSkKLQltb3YuYiByMGwsQC1yMQotCW1vdi5iIHIwbCxAMTY6OAotCW1vdi5iIHIwbCxAaDgzMDBfbW92YjoxNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92YmgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3MTFmOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX21vdmI6Ci0JbW92LmIgcjBsLHIxbAotCW1vdi5iICMxNixyMGwKLQltb3YuYiBAZXIxLHIwbAotCW1vdi5iIEAoMTY6MTYsZXIxKSxyMGwKLQltb3YuYiBAKDMyOjI0LGVyMSkscjBsCi0JbW92LmIgQGVyMSsscjBsCi0JbW92LmIgQDE2OjgscjBsCi0JbW92LmIgQGg4MzAwaF9tb3ZiOjE2LHIwbAotCW1vdi5iIEBoODMwMGhfbW92YjoyNCxyMGwKLQltb3YuYiByMGwsQGVyMQotCW1vdi5iIHIwbCxAKDE2OjE2LGVyMSkKLQltb3YuYiByMGwsQCgzMjoyNCxlcjEpCi0JbW92LmIgcjBsLEAtZXIxCi0JbW92LmIgcjBsLEAxNjo4Ci0JbW92LmIgcjBsLEBoODMwMGhfbW92YjoxNgotCW1vdi5iIHIwbCxAaDgzMDBoX21vdmI6MjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92YnMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNTAwMmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92YnMucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19tb3ZiOgotCW1vdi5iIHIwbCxyMWwKLQltb3YuYiAjMTYscjBsCi0JbW92LmIgQGVyMSxyMGwKLQltb3YuYiBAKDE2OjE2LGVyMSkscjBsCi0JbW92LmIgQCgzMjozMixlcjEpLHIwbAotCW1vdi5iIEBlcjErLHIwbAotCW1vdi5iIEAxNjo4LHIwbAotCW1vdi5iIEBoODMwMHNfbW92YjoxNixyMGwKLQltb3YuYiBAaDgzMDBzX21vdmI6MzIscjBsCi0JbW92LmIgcjBsLEBlcjEKLQltb3YuYiByMGwsQCgxNjoxNixlcjEpCi0JbW92LmIgcjBsLEAoMzI6MzIsZXIxKQotCW1vdi5iIHIwbCxALWVyMQotCW1vdi5iIHIwbCxAMTY6OAotCW1vdi5iIHIwbCxAaDgzMDBzX21vdmI6MTYKLQltb3YuYiByMGwsQGg4MzAwc19tb3ZiOjMyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZsaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2M3OGU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfbW92bDoKLQltb3YubCBlcjAsZXIxCi0JbW92LmwgIzY0LGVyMAotCW1vdi5sIEBlcjEsZXIwCi0JbW92LmwgQCgxNjoxNixlcjEpLGVyMAotCW1vdi5sIEAoMzI6MjQsZXIxKSxlcjAKLQltb3YubCBAZXIxKyxlcjAKLQltb3YubCBAaDgzMDBoX21vdmw6MTYsZXIwCi0JbW92LmwgQGg4MzAwaF9tb3ZsOjI0LGVyMAotCW1vdi5sIGVyMCxAZXIxCi0JbW92LmwgZXIwLEAoMTY6MTYsZXIxKQotCW1vdi5sIGVyMCxAKDMyOjI0LGVyMSkKLQltb3YubCBlcjAsQC1lcjEKLQltb3YubCBlcjAsQGg4MzAwaF9tb3ZsOjE2Ci0JbW92LmwgZXIwLEBoODMwMGhfbW92bDoyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zscy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92bHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0Mzc2Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zscy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX21vdmw6Ci0JbW92LmwgZXIwLGVyMQotCW1vdi5sICM2NCxlcjAKLQltb3YubCBAZXIxLGVyMAotCW1vdi5sIEAoMTY6MTYsZXIxKSxlcjAKLQltb3YubCBAKDMyOjMyLGVyMSksZXIwCi0JbW92LmwgQGVyMSssZXIwCi0JbW92LmwgQGg4MzAwc19tb3ZsOjE2LGVyMAotCW1vdi5sIEBoODMwMHNfbW92bDozMixlcjAKLQltb3YubCBlcjAsQGVyMQotCW1vdi5sIGVyMCxAKDE2OjE2LGVyMSkKLQltb3YubCBlcjAsQCgzMjozMixlcjEpCi0JbW92LmwgZXIwLEAtZXIxCi0JbW92LmwgZXIwLEBoODMwMHNfbW92bDoxNgotCW1vdi5sIGVyMCxAaDgzMDBzX21vdmw6MzIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92dy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92dy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2M2NGY4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdncucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotaDgzMDBfbW92dzoKLQltb3YudyByMCxyMQotCW1vdi53ICMxNixyMAotCW1vdi53IEByMSxyMAotCW1vdi53IEAoMTY6MTYscjEpLHIwCi0JbW92LncgQHIxKyxyMAotCW1vdi53IEBoODMwMF9tb3Z3OjE2LHIwCi0JbW92LncgcjAsQHIxCi0JbW92LncgcjAsQCgxNjoxNixyMSkKLQltb3YudyByMCxALXIxCi0JbW92LncgcjAsQGg4MzAwX21vdnc6MTYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NTA1N2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d2gucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9tb3Z3OgotCW1vdi53IHIwLHIxCi0JbW92LncgIzE2LHIwCi0JbW92LncgQGVyMSxyMAotCW1vdi53IEAoMTY6MTYsZXIxKSxyMAotCW1vdi53IEAoMzI6MjQsZXIxKSxyMAotCW1vdi53IEBlcjErLHIwCi0JbW92LncgQGg4MzAwaF9tb3Z3OjE2LHIwCi0JbW92LncgQGg4MzAwaF9tb3Z3OjI0LHIwCi0JbW92LncgcjAsQGVyMQotCW1vdi53IHIwLEAoMTY6MTYsZXIxKQotCW1vdi53IHIwLEAoMzI6MjQsZXIxKQotCW1vdi53IHIwLEAtZXIxCi0JbW92LncgcjAsQGg4MzAwaF9tb3Z3OjE2Ci0JbW92LncgcjAsQGg4MzAwaF9tb3Z3OjI0Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3cy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGYyMWRmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbW92dzoKLQltb3YudyByMCxyMQotCW1vdi53ICMxNixyMAotCW1vdi53IEBlcjEscjAKLQltb3YudyBAKDE2OjE2LGVyMSkscjAKLQltb3YudyBAKDMyOjMyLGVyMSkscjAKLQltb3YudyBAZXIxKyxyMAotCW1vdi53IEBoODMwMHNfbW92dzoxNixyMAotCW1vdi53IEBoODMwMHNfbW92dzozMixyMAotCW1vdi53IHIwLEBlcjEKLQltb3YudyByMCxAKDE2OjE2LGVyMSkKLQltb3YudyByMCxAKDMyOjMyLGVyMSkKLQltb3YudyByMCxALWVyMQotCW1vdi53IHIwLEBoODMwMHNfbW92dzoxNgotCW1vdi53IHIwLEBoODMwMHNfbW92dzozMgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tdWx0aXBsZXMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL211bHRpcGxlcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjA3OWI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL211bHRpcGxlcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX211bHRpcGxlOgotCWxkbS5sIEBzcCssZXIwLWVyMQotCWxkbS5sIEBzcCssZXIwLWVyMgotCWxkbS5sIEBzcCssZXIwLWVyMwotCXN0bS5sIGVyMC1lcjEsQC1zcAotCXN0bS5sIGVyMC1lcjIsQC1zcAotCXN0bS5sIGVyMC1lcjMsQC1zcAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MWI3MzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLWg4MzAwX3B1c2hfcG9wOgotCXBvcCByMAotCXB1c2ggcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDk2MzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcGgucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX3B1c2hfcG9wOgotCXBvcC53IHIwCi0JcG9wLmwgZXIwCi0JcHVzaC53IHIwCi0JcHVzaC5sIGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxZGYwNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wcy5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfcHVzaF9wb3A6Ci0JcG9wLncgcjAKLQlwb3AubCBlcjAKLQlwdXNoLncgcjAKLQlwdXNoLmwgZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWFhODdkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JLnRleHQKLWg4MzAwX3JvdGF0ZV9zaGlmdDoKLQlyb3RsIHIwbAotCXJvdHIgcjBsCi0Jcm90eGwgcjBsCi0Jcm90eHIgcjBsCi0Jc2hhbCByMGwKLQlzaGFyIHIwbAotCXNobGwgcjBsCi0Jc2hsciByMGwKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2hoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhYmU0MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaGgucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9yb3RhdGVfc2hpZnQ6Ci0Jcm90bC5iIHIwbAotCXJvdGwudyByMAotCXJvdGwubCBlcjAKLQlyb3RyLmIgcjBsCi0Jcm90ci53IHIwCi0Jcm90ci5sIGVyMAotCXJvdHhsLmIgcjBsCi0Jcm90eGwudyByMAotCXJvdHhsLmwgZXIwCi0Jcm90eHIuYiByMGwKLQlyb3R4ci53IHIwCi0Jcm90eHIubCBlcjAKLQlzaGFsLmIgcjBsCi0Jc2hhbC53IHIwCi0Jc2hhbC5sIGVyMAotCXNoYXIuYiByMGwKLQlzaGFyLncgcjAKLQlzaGFyLmwgZXIwCi0Jc2hsbC5iIHIwbAotCXNobGwudyByMAotCXNobGwubCBlcjAKLQlzaGxyLmIgcjBsCi0Jc2hsci53IHIwCi0Jc2hsci5sIGVyMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2hzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjNDFjYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaHMucworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19yb3RhdGVfc2hpZnQ6Ci0Jcm90bC5iIHIwbAotCXJvdGwuYiAjMixyMGwKLQlyb3RsLncgcjAKLQlyb3RsLncgIzIscjAKLQlyb3RsLmwgZXIwCi0Jcm90bC5sICMyLGVyMAotCXJvdHIuYiByMGwKLQlyb3RyLmIgIzIscjBsCi0Jcm90ci53IHIwCi0Jcm90ci53ICMyLHIwCi0Jcm90ci5sIGVyMAotCXJvdHIubCAjMixlcjAKLQlyb3R4bC5iIHIwbAotCXJvdHhsLmIgIzIscjBsCi0Jcm90eGwudyByMAotCXJvdHhsLncgIzIscjAKLQlyb3R4bC5sIGVyMAotCXJvdHhsLmwgIzIsZXIwCi0Jcm90eHIuYiByMGwKLQlyb3R4ci5iICMyLHIwbAotCXJvdHhyLncgcjAKLQlyb3R4ci53ICMyLHIwCi0Jcm90eHIubCBlcjAKLQlyb3R4ci5sICMyLGVyMAotCXNoYWwuYiByMGwKLQlzaGFsLmIgIzIscjBsCi0Jc2hhbC53IHIwCi0Jc2hhbC53ICMyLHIwCi0Jc2hhbC5sIGVyMAotCXNoYWwubCAjMixlcjAKLQlzaGFyLmIgcjBsCi0Jc2hhci5iICMyLHIwbAotCXNoYXIudyByMAotCXNoYXIudyAjMixyMAotCXNoYXIubCBlcjAKLQlzaGFyLmwgIzIsZXIwCi0Jc2hsbC5iIHIwbAotCXNobGwuYiAjMixyMGwKLQlzaGxsLncgcjAKLQlzaGxsLncgIzIscjAKLQlzaGxsLmwgZXIwCi0Jc2hsbC5sICMyLGVyMAotCXNobHIuYiByMGwKLQlzaGxyLmIgIzIscjBsCi0Jc2hsci53IHIwCi0Jc2hsci53ICMyLHIwCi0Jc2hsci5sIGVyMAotCXNobHIubCAjMixlcjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvUkVBRE1FIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjE3NGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1Ob3RlcyBvbiBob3cgdGhlIEhQUEEgdGVzdHN1aXRlIGlzIG9yZ2FuaXplZDoKLQotYmFzaWMucGFyc2UgLS0gdGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNpbmcKLXRlc3RzIGFuZCBhIHNpbXBsZSAuc3RhYiBwYXJzaW5nIHRlc3QuICBUaGlzIHdvdWxkIGJlIHdoZXJlIHlvdSdkCi1hZGQgY29kZSB0byBtYWtlIHN1cmUgbmV3IGluc3RydWN0aW9ucyBhcmUgcGFyc2VkIGNvcnJlY3RseSwgbmV3Ci1jb21wbGV0ZXJzIChzdWNoIGFzIGNhY2hlIGhpdHMpIGFyZSBwYXJzZWQgY29ycmVjdGx5LCBldGMuCi0KLUl0J3MgYWxzbyBhIHJlYXNvbmFibGUgcGxhY2UgdG8gbWFrZSBzdXJlIHBhcnNpbmcgb2YgdGhlIHZhcmlvdXMKLWFzc2VtYmxlciBkaXJlY3RpdmVzIGlzIGhhbmRsZWQgY29ycmVjdGx5LiAgSWYgeW91J3JlIGdvaW5nIHRvIGFkZAotc3VjaCBjb2RlLCB0cnkgdG8gYmUgcmVhc29uYWJseSBjb21wbGV0ZS4gIEFkZCB0ZXN0IGNvZGUgZm9yIGVhY2gKLWJhc2ljIGRpcmVjdGl2ZSBhbmQgdGVzdCBhbGwgKG9yIGEgbm90ZXdvcnRoeSkgc3Vic2V0IG9mIGFyZ3VtZW50cy4KLQotSXQgc2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IHRvIGhhdmUgYW4gYXNzZW1ibGVyIHRvIHJ1biB0aGVzZSB0ZXN0czsKLWNhbGxpbmcgb2JqZHVtcF9zdGFydCBvciBzb21ldGhpbmcgc2ltaWxhciBzaG91bGQgbm90IGJlIGRvbmUgZnJvbQotdGhpcyBkaXJlY3RvcnkuCi0KLQotbW9yZS5wYXJzZSAtLSB0aGlzIGlzIHdoZXJlIHlvdSBzaG91bGQgcHV0IGFkZGl0aW9uYWwgcGFyc2luZyB0ZXN0cywgc3VjaAotYXMgdGVzdHMgdG8gY2hlY2sgbW9kZSBzZWxlY3RvciBwYXJzaW5nLCBzdHJpbmcgcGFyc2luZywgZXhwcmVzc2lvbiBwYXJzaW5nLAotZXRjLiAgSXQncyBhbHNvIGEgcmVhc29uYWJsZSBwbGFjZSB0byBwdXQgcGFyc2luZyB0ZXN0cyB3aGljaCBhcmUgbm90IGNvbXBsZXRlCi1lbm91Z2ggKHdoYXRldmVyIHRoYXQgbWVhbnMpIGZvciBiYXNpYy5wYXJzZS4gIAotCi1JdCBzaG91bGQgb25seSBiZSBuZWNlc3NhcnkgdG8gaGF2ZSBhbiBhc3NlbWJsZXIgdG8gcnVuIHRoZXNlIHRlc3RzOwotY2FsbGluZyBvYmpkdW1wX3N0YXJ0IG9yIHNvbWV0aGluZyBzaW1pbGFyIHNob3VsZCBub3QgYmUgZG9uZSBmcm9tCi10aGlzIGRpcmVjdG9yeS4KLQotCi1yZWxvYyAtLSB0aGlzIGlzIHdoZXJlIHlvdSB0ZXN0cyB3aGljaCBleGFtaW5lIHJlbG9jYXRpb25zIHByb2R1Y2VkCi1ieSBHQVMgYmVsb25nLiAgVG8gcnVuIHRoZXNlIHRlc3RzIHlvdSBtdXN0IGhhdmUgYSBmdW5jdGlvbmluZyBvYmpkdW1wLgotCi0KLXVuc29ydGVkIC0tIHRoaXMgaXMgd2hlcmUgZXZlcnl0aGluZyBlbHNlIGdvZXMuICBBcyBncm91cHMgb2YgcmVsYXRlZCB0ZXN0cwotZW5kIHVwIGluIHRoaXMgZGlyZWN0b3J5LCB0aGV5IHNob3VsZCBiZSBicm9rZW4gb3V0IGludG8gYSBuZXcgY2xhc3Mgb2YKLXRlc3RzLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9hZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4N2YyM2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9hZGQucworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBhZGQvc2g/YWRkIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlhZGQgICVyNCwlcjUsJXI2Ci0JYWRkLD0gICVyNCwlcjUsJXI2Ci0JYWRkLDwgICVyNCwlcjUsJXI2Ci0JYWRkLDw9ICAlcjQsJXI1LCVyNgotCWFkZCxudXYgICVyNCwlcjUsJXI2Ci0JYWRkLHpudiAgJXI0LCVyNSwlcjYKLQlhZGQsc3YgICVyNCwlcjUsJXI2Ci0JYWRkLG9kICAlcjQsJXI1LCVyNgotCWFkZCx0ciAgJXI0LCVyNSwlcjYKLQlhZGQsPD4gICVyNCwlcjUsJXI2Ci0JYWRkLD49ICAlcjQsJXI1LCVyNgotCWFkZCw+ICAlcjQsJXI1LCVyNgotCWFkZCx1diAgJXI0LCVyNSwlcjYKLQlhZGQsdm56ICAlcjQsJXI1LCVyNgotCWFkZCxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLGV2ICAlcjQsJXI1LCVyNgotCi0JYWRkbCAgJXI0LCVyNSwlcjYKLQlhZGRsLD0gICVyNCwlcjUsJXI2Ci0JYWRkbCw8ICAlcjQsJXI1LCVyNgotCWFkZGwsPD0gICVyNCwlcjUsJXI2Ci0JYWRkbCxudXYgICVyNCwlcjUsJXI2Ci0JYWRkbCx6bnYgICVyNCwlcjUsJXI2Ci0JYWRkbCxzdiAgJXI0LCVyNSwlcjYKLQlhZGRsLG9kICAlcjQsJXI1LCVyNgotCWFkZGwsdHIgICVyNCwlcjUsJXI2Ci0JYWRkbCw8PiAgJXI0LCVyNSwlcjYKLQlhZGRsLD49ICAlcjQsJXI1LCVyNgotCWFkZGwsPiAgJXI0LCVyNSwlcjYKLQlhZGRsLHV2ICAlcjQsJXI1LCVyNgotCWFkZGwsdm56ICAlcjQsJXI1LCVyNgotCWFkZGwsbnN2ICAlcjQsJXI1LCVyNgotCWFkZGwsZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGRvICAlcjQsJXI1LCVyNgotCWFkZG8sPSAgJXI0LCVyNSwlcjYKLQlhZGRvLDwgICVyNCwlcjUsJXI2Ci0JYWRkbyw8PSAgJXI0LCVyNSwlcjYKLQlhZGRvLG51diAgJXI0LCVyNSwlcjYKLQlhZGRvLHpudiAgJXI0LCVyNSwlcjYKLQlhZGRvLHN2ICAlcjQsJXI1LCVyNgotCWFkZG8sb2QgICVyNCwlcjUsJXI2Ci0JYWRkbyx0ciAgJXI0LCVyNSwlcjYKLQlhZGRvLDw+ICAlcjQsJXI1LCVyNgotCWFkZG8sPj0gICVyNCwlcjUsJXI2Ci0JYWRkbyw+ICAlcjQsJXI1LCVyNgotCWFkZG8sdXYgICVyNCwlcjUsJXI2Ci0JYWRkbyx2bnogICVyNCwlcjUsJXI2Ci0JYWRkbyxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkbyxldiAgJXI0LCVyNSwlcjYKLQotCWFkZGMgICVyNCwlcjUsJXI2Ci0JYWRkYyw9ICAlcjQsJXI1LCVyNgotCWFkZGMsPCAgJXI0LCVyNSwlcjYKLQlhZGRjLDw9ICAlcjQsJXI1LCVyNgotCWFkZGMsbnV2ICAlcjQsJXI1LCVyNgotCWFkZGMsem52ICAlcjQsJXI1LCVyNgotCWFkZGMsc3YgICVyNCwlcjUsJXI2Ci0JYWRkYyxvZCAgJXI0LCVyNSwlcjYKLQlhZGRjLHRyICAlcjQsJXI1LCVyNgotCWFkZGMsPD4gICVyNCwlcjUsJXI2Ci0JYWRkYyw+PSAgJXI0LCVyNSwlcjYKLQlhZGRjLD4gICVyNCwlcjUsJXI2Ci0JYWRkYyx1diAgJXI0LCVyNSwlcjYKLQlhZGRjLHZueiAgJXI0LCVyNSwlcjYKLQlhZGRjLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGRjLGV2ICAlcjQsJXI1LCVyNgotCi0JYWRkY28gICVyNCwlcjUsJXI2Ci0JYWRkY28sPSAgJXI0LCVyNSwlcjYKLQlhZGRjbyw8ICAlcjQsJXI1LCVyNgotCWFkZGNvLDw9ICAlcjQsJXI1LCVyNgotCWFkZGNvLG51diAgJXI0LCVyNSwlcjYKLQlhZGRjbyx6bnYgICVyNCwlcjUsJXI2Ci0JYWRkY28sc3YgICVyNCwlcjUsJXI2Ci0JYWRkY28sb2QgICVyNCwlcjUsJXI2Ci0JYWRkY28sdHIgICVyNCwlcjUsJXI2Ci0JYWRkY28sPD4gICVyNCwlcjUsJXI2Ci0JYWRkY28sPj0gICVyNCwlcjUsJXI2Ci0JYWRkY28sPiAgJXI0LCVyNSwlcjYKLQlhZGRjbyx1diAgJXI0LCVyNSwlcjYKLQlhZGRjbyx2bnogICVyNCwlcjUsJXI2Ci0JYWRkY28sbnN2ICAlcjQsJXI1LCVyNgotCWFkZGNvLGV2ICAlcjQsJXI1LCVyNgotCi0JYWRkLGwgICVyNCwlcjUsJXI2Ci0JYWRkLGwsPSAgJXI0LCVyNSwlcjYKLQlhZGQsbCw8ICAlcjQsJXI1LCVyNgotCWFkZCxsLDw9ICAlcjQsJXI1LCVyNgotCWFkZCxsLG51diAgJXI0LCVyNSwlcjYKLQlhZGQsbCx6bnYgICVyNCwlcjUsJXI2Ci0JYWRkLGwsc3YgICVyNCwlcjUsJXI2Ci0JYWRkLGwsb2QgICVyNCwlcjUsJXI2Ci0JYWRkLGwsdHIgICVyNCwlcjUsJXI2Ci0JYWRkLGwsPD4gICVyNCwlcjUsJXI2Ci0JYWRkLGwsPj0gICVyNCwlcjUsJXI2Ci0JYWRkLGwsPiAgJXI0LCVyNSwlcjYKLQlhZGQsbCx1diAgJXI0LCVyNSwlcjYKLQlhZGQsbCx2bnogICVyNCwlcjUsJXI2Ci0JYWRkLGwsbnN2ICAlcjQsJXI1LCVyNgotCWFkZCxsLGV2ICAlcjQsJXI1LCVyNgotCi0JYWRkLHRzdiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LD0gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiw8ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsPD0gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixudXYgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdix6bnYgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixzdiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LG9kICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsdHIgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiw8PiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LD49ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsPiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LHV2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3Ysdm56ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsbnN2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGQsYyAgJXI0LCVyNSwlcjYKLQlhZGQsYyw9ICAlcjQsJXI1LCVyNgotCWFkZCxjLDwgICVyNCwlcjUsJXI2Ci0JYWRkLGMsPD0gICVyNCwlcjUsJXI2Ci0JYWRkLGMsbnV2ICAlcjQsJXI1LCVyNgotCWFkZCxjLHpudiAgJXI0LCVyNSwlcjYKLQlhZGQsYyxzdiAgJXI0LCVyNSwlcjYKLQlhZGQsYyxvZCAgJXI0LCVyNSwlcjYKLQlhZGQsYyx0ciAgJXI0LCVyNSwlcjYKLQlhZGQsYyw8PiAgJXI0LCVyNSwlcjYKLQlhZGQsYyw+PSAgJXI0LCVyNSwlcjYKLQlhZGQsYyw+ICAlcjQsJXI1LCVyNgotCWFkZCxjLHV2ICAlcjQsJXI1LCVyNgotCWFkZCxjLHZueiAgJXI0LCVyNSwlcjYKLQlhZGQsYyxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLGMsZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGQsYyx0c3YgICVyNCwlcjUsJXI2Ci0JYWRkLGMsdHN2LD0gICVyNCwlcjUsJXI2Ci0JYWRkLGMsdHN2LDwgICVyNCwlcjUsJXI2Ci0JYWRkLGMsdHN2LDw9ICAlcjQsJXI1LCVyNgotCWFkZCxjLHRzdixudXYgICVyNCwlcjUsJXI2Ci0JYWRkLGMsdHN2LHpudiAgJXI0LCVyNSwlcjYKLQlhZGQsYyx0c3Ysc3YgICVyNCwlcjUsJXI2Ci0JYWRkLGMsdHN2LG9kICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsYyx0ciAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGMsPD4gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixjLD49ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsYyw+ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsYyx1diAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGMsdm56ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsYyxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixjLGV2ICAlcjQsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9hZGQyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwZjUxNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZDIucworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBhZGQvc2g/YWRkIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlhZGQsKiAgJXI0LCVyNSwlcjYKLQlhZGQsKj0gICVyNCwlcjUsJXI2Ci0JYWRkLCo8ICAlcjQsJXI1LCVyNgotCWFkZCwqPD0gICVyNCwlcjUsJXI2Ci0JYWRkLCpudXYgICVyNCwlcjUsJXI2Ci0JYWRkLCp6bnYgICVyNCwlcjUsJXI2Ci0JYWRkLCpzdiAgJXI0LCVyNSwlcjYKLQlhZGQsKm9kICAlcjQsJXI1LCVyNgotCWFkZCwqdHIgICVyNCwlcjUsJXI2Ci0JYWRkLCo8PiAgJXI0LCVyNSwlcjYKLQlhZGQsKj49ICAlcjQsJXI1LCVyNgotCWFkZCwqPiAgJXI0LCVyNSwlcjYKLQlhZGQsKnV2ICAlcjQsJXI1LCVyNgotCWFkZCwqdm56ICAlcjQsJXI1LCVyNgotCWFkZCwqbnN2ICAlcjQsJXI1LCVyNgotCWFkZCwqZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGQsbCwqICAlcjQsJXI1LCVyNgotCWFkZCxsLCo9ICAlcjQsJXI1LCVyNgotCWFkZCxsLCo8ICAlcjQsJXI1LCVyNgotCWFkZCxsLCo8PSAgJXI0LCVyNSwlcjYKLQlhZGQsbCwqbnV2ICAlcjQsJXI1LCVyNgotCWFkZCxsLCp6bnYgICVyNCwlcjUsJXI2Ci0JYWRkLGwsKnN2ICAlcjQsJXI1LCVyNgotCWFkZCxsLCpvZCAgJXI0LCVyNSwlcjYKLQlhZGQsbCwqdHIgICVyNCwlcjUsJXI2Ci0JYWRkLGwsKjw+ICAlcjQsJXI1LCVyNgotCWFkZCxsLCo+PSAgJXI0LCVyNSwlcjYKLQlhZGQsbCwqPiAgJXI0LCVyNSwlcjYKLQlhZGQsbCwqdXYgICVyNCwlcjUsJXI2Ci0JYWRkLGwsKnZueiAgJXI0LCVyNSwlcjYKLQlhZGQsbCwqbnN2ICAlcjQsJXI1LCVyNgotCWFkZCxsLCpldiAgJXI0LCVyNSwlcjYKLQotCWFkZCx0c3YsKiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCo9ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKjwgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiwqPD0gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiwqbnV2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKnpudiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCpzdiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCpvZCAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCp0ciAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCo8PiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCo+PSAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCo+ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKnV2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsKnZueiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LCpuc3YgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdiwqZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGQsZGMsKiAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKj0gICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCo8ICAlcjQsJXI1LCVyNgotCWFkZCxkYywqPD0gICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCpudXYgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCp6bnYgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCpzdiAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKm9kICAlcjQsJXI1LCVyNgotCWFkZCxkYywqdHIgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLCo8PiAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKj49ICAlcjQsJXI1LCVyNgotCWFkZCxkYywqPiAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsKnV2ICAlcjQsJXI1LCVyNgotCWFkZCxkYywqdm56ICAlcjQsJXI1LCVyNgotCWFkZCxkYywqbnN2ICAlcjQsJXI1LCVyNgotCWFkZCxkYywqZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGQsZGMsdHN2LCogICVyNCwlcjUsJXI2Ci0JYWRkLGRjLHRzdiwqPSAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsdHN2LCo8ICAlcjQsJXI1LCVyNgotCWFkZCxkYyx0c3YsKjw9ICAlcjQsJXI1LCVyNgotCWFkZCxkYyx0c3YsKm51diAgJXI0LCVyNSwlcjYKLQlhZGQsZGMsdHN2LCp6bnYgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLHRzdiwqc3YgICVyNCwlcjUsJXI2Ci0JYWRkLGRjLHRzdiwqb2QgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixkYywqdHIgICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixkYywqPD4gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixkYywqPj0gICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixkYywqPiAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGRjLCp1diAgJXI0LCVyNSwlcjYKLQlhZGQsdHN2LGRjLCp2bnogICVyNCwlcjUsJXI2Ci0JYWRkLHRzdixkYywqbnN2ICAlcjQsJXI1LCVyNgotCWFkZCx0c3YsZGMsKmV2ICAlcjQsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9hZGRpLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZGkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1MTcxYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZGkucworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBhZGQgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlhZGRpICAxMjMsJXI1LCVyNgotCWFkZGksPSAgMTIzLCVyNSwlcjYKLQlhZGRpLDwgIDEyMywlcjUsJXI2Ci0JYWRkaSw8PSAgMTIzLCVyNSwlcjYKLQlhZGRpLG51diAgMTIzLCVyNSwlcjYKLQlhZGRpLHpudiAgMTIzLCVyNSwlcjYKLQlhZGRpLHN2ICAxMjMsJXI1LCVyNgotCWFkZGksb2QgIDEyMywlcjUsJXI2Ci0JYWRkaSx0ciAgMTIzLCVyNSwlcjYKLQlhZGRpLDw+ICAxMjMsJXI1LCVyNgotCWFkZGksPj0gIDEyMywlcjUsJXI2Ci0JYWRkaSw+ICAxMjMsJXI1LCVyNgotCWFkZGksdXYgIDEyMywlcjUsJXI2Ci0JYWRkaSx2bnogIDEyMywlcjUsJXI2Ci0JYWRkaSxuc3YgIDEyMywlcjUsJXI2Ci0JYWRkaSxldiAgMTIzLCVyNSwlcjYKLQotCWFkZGlvICAxMjMsJXI1LCVyNgotCWFkZGlvLD0gIDEyMywlcjUsJXI2Ci0JYWRkaW8sPCAgMTIzLCVyNSwlcjYKLQlhZGRpbyw8PSAgMTIzLCVyNSwlcjYKLQlhZGRpbyxudXYgIDEyMywlcjUsJXI2Ci0JYWRkaW8sem52ICAxMjMsJXI1LCVyNgotCWFkZGlvLHN2ICAxMjMsJXI1LCVyNgotCWFkZGlvLG9kICAxMjMsJXI1LCVyNgotCWFkZGlvLHRyICAxMjMsJXI1LCVyNgotCWFkZGlvLDw+ICAxMjMsJXI1LCVyNgotCWFkZGlvLD49ICAxMjMsJXI1LCVyNgotCWFkZGlvLD4gIDEyMywlcjUsJXI2Ci0JYWRkaW8sdXYgIDEyMywlcjUsJXI2Ci0JYWRkaW8sdm56ICAxMjMsJXI1LCVyNgotCWFkZGlvLG5zdiAgMTIzLCVyNSwlcjYKLQlhZGRpbyxldiAgMTIzLCVyNSwlcjYKLQotCWFkZGl0ICAxMjMsJXI1LCVyNgotCWFkZGl0LD0gIDEyMywlcjUsJXI2Ci0JYWRkaXQsPCAgMTIzLCVyNSwlcjYKLQlhZGRpdCw8PSAgMTIzLCVyNSwlcjYKLQlhZGRpdCxudXYgIDEyMywlcjUsJXI2Ci0JYWRkaXQsem52ICAxMjMsJXI1LCVyNgotCWFkZGl0LHN2ICAxMjMsJXI1LCVyNgotCWFkZGl0LG9kICAxMjMsJXI1LCVyNgotCWFkZGl0LHRyICAxMjMsJXI1LCVyNgotCWFkZGl0LDw+ICAxMjMsJXI1LCVyNgotCWFkZGl0LD49ICAxMjMsJXI1LCVyNgotCWFkZGl0LD4gIDEyMywlcjUsJXI2Ci0JYWRkaXQsdXYgIDEyMywlcjUsJXI2Ci0JYWRkaXQsdm56ICAxMjMsJXI1LCVyNgotCWFkZGl0LG5zdiAgMTIzLCVyNSwlcjYKLQlhZGRpdCxldiAgMTIzLCVyNSwlcjYKLQotCWFkZGl0byAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sPSAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sPCAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sPD0gIDEyMywlcjUsJXI2Ci0JYWRkaXRvLG51diAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sem52ICAxMjMsJXI1LCVyNgotCWFkZGl0byxzdiAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sb2QgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLHRyICAxMjMsJXI1LCVyNgotCWFkZGl0byw8PiAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sPj0gIDEyMywlcjUsJXI2Ci0JYWRkaXRvLD4gIDEyMywlcjUsJXI2Ci0JYWRkaXRvLHV2ICAxMjMsJXI1LCVyNgotCWFkZGl0byx2bnogIDEyMywlcjUsJXI2Ci0JYWRkaXRvLG5zdiAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sZXYgIDEyMywlcjUsJXI2Ci0KLQlhZGRpLHRzdiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdiw9ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LDwgIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsPD0gIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsbnV2ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHpudiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdixzdiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdixvZCAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdix0ciAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdiw8PiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdiw+PSAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdiw+ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHV2ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHZueiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdixuc3YgIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsZXYgIDEyMywlcjUsJXI2Ci0KLQlhZGRpLHRjICAxMjMsJXI1LCVyNgotCWFkZGksdGMsPSAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLDwgIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyw8PSAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLG51diAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLHpudiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLHN2ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsb2QgIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyx0ciAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLDw+ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsPj0gIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyw+ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsdXYgIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyx2bnogIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyxuc3YgIDEyMywlcjUsJXI2Ci0JYWRkaSx0YyxldiAgMTIzLCVyNSwlcjYKLQotCWFkZGksdGMsdHN2ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsdHN2LD0gIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyx0c3YsPCAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLHRzdiw8PSAgMTIzLCVyNSwlcjYKLQlhZGRpLHRjLHRzdixudXYgIDEyMywlcjUsJXI2Ci0JYWRkaSx0Yyx0c3Ysem52ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsdHN2LHN2ICAxMjMsJXI1LCVyNgotCWFkZGksdGMsdHN2LG9kICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHRjLHRyICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHRjLDw+ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHRjLD49ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHRjLD4gIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdGMsdXYgIDEyMywlcjUsJXI2Ci0JYWRkaSx0c3YsdGMsdm56ICAxMjMsJXI1LCVyNgotCWFkZGksdHN2LHRjLG5zdiAgMTIzLCVyNSwlcjYKLQlhZGRpLHRzdix0YyxldiAgMTIzLCVyNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjA2ODQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODY0ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBEZWphR251QGN5Z251cy5jb20KLQotIyBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcmlzdHkgb2YgVXRhaAotIyBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLXByb2MgZG9faW1lbSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJpbWVtLnM6IGludGVnZXIgbWVtb3J5IGxvYWRzIGFuZCBzdG9yZXMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJpbWVtLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgNDg5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDBDODAxMDlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA0NDlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMEM4MDEwNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDQwOUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwQzgwMTAxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgNjg5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDBDOUExMjgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCA2NDlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMEM5QTEyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDYwOUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwQzlBMTIwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggNEM5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDZDOUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwQzg1MDA5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMEM4NTIwOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDBDODUwMEJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwQzg1MjBCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMEM4NTAwNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDBDODUyMDVBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwQzg1MDA3QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMEM4NTIwN0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDBDODUwMDFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwQzg1MjAxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMEM4NTAwM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDBDODUyMDNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwQzg1MDE5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMEM4NTIxOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDBDODUwMUJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwQzg1MjFCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMEM4NTAxREFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDBDODUyMURBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwQzg1MDFGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMEM4NTIxRkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDBDODAxMDlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwQzgwMzBCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMEM4MDEwQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDBDODAxMDVBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwQzgwMzA3QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMEM4MDEwN0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDBDODAxMDFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwQzgwMzAzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMEM4MDEwM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDBDODAxMTlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwQzgwMzFCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMEM4MDExQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDBDODAxMURBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwQzgwMzFGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMEM4MDExRkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDBDOUExMjgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwQzlBMzJBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMEM5QTEyQTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDBDOUExMjQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwQzlBMzI2MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMEM5QTEyNjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDBDOUExMjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAwQzlBMzIyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMEM5QTEyMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDBDOUExMzgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAwQzlBMzNBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMEM5QTEzQTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDBDOUExMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAwQzlBMTMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgMEM5QTMzMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDBDOUExMzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAwQzlBMzMyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faW1tZWQge30gewotICAgIHNldCB0ZXN0bmFtZSAiaW1tZWQuczogaW1tZWRpYXRlIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiaW1tZWQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzNzVBMDAwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjM0REZCRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDI4QURGQkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0IAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19icmFuY2gge30gewotICAgIHNldCB0ZXN0bmFtZSAiYnJhbmNoLnM6IGJyYW5jaCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJyYW5jaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEU4NUYxRkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBFODVGMUZFRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRTgxRjFGRTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEU4MUYxRkRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBFODVGM0ZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRTg1RjNGQ0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEU4NDQ0MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBFODQ0NDAwMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRTgwNDQwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEU4MDQ0MDAyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBFODQwQzAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRTg0MEMwMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEUwNDA0NDZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBFMDQwNDQ2RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRTQ0MDQ0NkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEU0NDA0NDZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBDQjQ0MUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgQ0I0NDNGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IENCNDQ1RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBDQjQ0N0ZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgQ0I0NDlGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IENCNDRCRkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBDQjQ0REZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgQ0I0NEZGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIENCNDQxRkI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBDQjQ0M0ZBRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggQ0I0NDVGQTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIENCNDQ3RjlGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBDQjQ0OUY5N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgQ0I0NEJGOEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IENCNDRERjg3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBDQjQ0RkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgQ0Y0QTFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IENGNEEzRkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBDRjRBNUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgQ0Y0QTdGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIENGNEE5RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBDRjRBQkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggQ0Y0QURGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIENGNEFGRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBDRjRBMUZCN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgQ0Y0QTNGQUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IENGNEE1RkE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBDRjRBN0Y5RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgQ0Y0QTlGOTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IENGNEFCRjhGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCBDRjRBREY4N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgQ0Y0QUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDgwODAxRkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCA4MDgwM0ZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggODA4MDVGRTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDgwODA3RkREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCA4MDgwOUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgODA4MEJGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDgwODBERkM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyA4MDgwRkZCRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgODg4MDFGQjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDg4ODAzRkFEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCA4ODgwNUZBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgODg4MDdGOURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDg4ODA5Rjk1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCA4ODgwQkY4RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggODg4MERGODVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDg4ODBGRjdEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCA4MDgwMUY3N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgODA4MDNGNkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDgwODA1RjY3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyA4MDgwN0Y1RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgODA4MDlGNTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDgwODBCRjRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCA4MDgwREY0N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgODA4MEZGM0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDg4ODAxRjM3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCA4ODgwM0YyRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggODg4MDVGMjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDg4ODA3RjFGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCA4ODgwOUYxN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgODg4MEJGMEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDg4ODBERjA3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyA4ODgwRkVGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgODQ4MDFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDg0ODA1RkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCA4NDgwN0ZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgODQ4MDlGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDg0ODBCRkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCA4NDgwREZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggODQ4MEZGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDhDODAxRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCA4QzgwM0ZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgOEM4MDVGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDhDODA3RkE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyA4QzgwOUY5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgOEM4MEJGOTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDhDODBERjhEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCA4QzgwRkU4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgODQ4MDFGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTgwIDg0ODAzRjc3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4NCA4NDgwNUY2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODggODQ4MDdGNjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMThjIDg0ODA5RjVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MCA4NDgwQkY1N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTQgODQ4MERGNEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IDg0ODBGRjQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5YyA4QzgwMUYzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTAgOEM4MDNGMzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE0IDhDODA1RjJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhOCA4QzgwN0YyN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYWMgOEM4MDlGMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWIwIDhDODBCRjE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNCA4QzgwREYwRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjggOEM4MEZGMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIEEwODExRkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjMCBBMDgxM0ZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzQgQTA4MTVGRTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM4IEEwODE3RkREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjYyBBMDgxOUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDAgQTA4MUJGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ0IEEwODFERkM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkOCBBMDgxRkZCRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZGMgQTg4MTFGQjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWUwIEE4ODEzRkFEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlNCBBODgxNUZBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTggQTg4MTdGOURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWVjIEE4ODE5Rjk1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmMCBBODgxQkY4RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjQgQTg4MURGODVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWY4IEE4ODFGRjdEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmYyBBMDgxMUY3N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDAgQTA4MTNGNkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA0IEEwODE1RjY3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwOCBBMDgxN0Y1RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMGMgQTA4MTlGNTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjEwIEEwODFCRjRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxNCBBMDgxREY0N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTggQTA4MUZGM0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjFjIEE4ODExRjM3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyMCBBODgxM0YyRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjQgQTg4MTVGMjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjI4IEE4ODE3RjFGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyYyBBODgxOUYxN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzAgQTg4MUJGMEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM0IEE4ODFERjA3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzOCBBODgxRkVGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyM2MgQTQ5RjFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjQwIEE0OUYzRkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI0NCBBNDlGNUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNDggQTQ5RjdGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjRjIEE0OUY5RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI1MCBBNDlGQkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNTQgQTQ5RkRGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjU4IEE0OUZGRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI1YyBBQzlGMUZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNjAgQUM5RjNGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjY0IEFDOUY1RkE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI2OCBBQzlGN0Y5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNmMgQUM5RjlGOTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjcwIEFDOUZCRjhEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI3NCBBQzlGREY4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNzggQUM5RkZDODVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjdjIEE0OUYxRjc3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI4MCBBNDlGM0Y2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyODQgQTQ5RjVGNjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjg4IEE0OUY3RjVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI4YyBBNDlGOUY1N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOTAgQTQ5RkJGNEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjk0IEE0OUZERjQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI5OCBBNDlGRkYzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOWMgQUM5RjFGMzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmEwIEFDOUYzRjJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJhNCBBQzlGNUYyN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYTggQUM5RjdGMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmFjIEFDOUY5RjE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJiMCBBQzlGQkYwRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYjQgQUM5RkRGMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmI4IEFDOUZGRUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJiYyBDMDA0NUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYzAgQzAwNERGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmM0IEMwMDQ1RkU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJjOCBDMDA0REZERlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyY2MgQzRBNDVGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmQwIEM0QTRERkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJkNCBDNEE0NUZDN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyZDggQzRBNERGQkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE4M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19icmFuY2gyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJyYW5jaDIuczogYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYnJhbmNoMi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEMwMDQ1RkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBDMDA0REZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggQzAwNDVGRTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEMwMDRERkRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBDMDA0N0ZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgQzAwNEZGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEMwMDQ3RkM3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBDMDA0RkZCRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgQzRBNDdGQjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEM0QTRGRkFEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBDNEE0N0ZBN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgQzRBNEZGOUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEU4MDA0MDA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBFODAwNDAwRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRTgwMDRGOURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEU4MDA0MDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBFODA0NDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYWRkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZC5zOiBhZGQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhZGQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0EwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDRFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0OEUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEFFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDFFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDdFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNERFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAwOEE0MDcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMDhBNDI3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDA4QTQ0NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAwOEE0NjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMDhBNDg3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDA4QTRBNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAwOEE0QzcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMDhBNEU3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDA4QTQxNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAwOEE0MzcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMDhBNDU3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDA4QTQ3NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAwOEE0OTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMDhBNEI3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDA4QTRENzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAwOEE0RjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMDhBNDBGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDA4QTQyRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAwOEE0NEYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMDhBNDZGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDA4QTQ4RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAwOEE0QUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMDhBNENGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDA4QTRFRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCAwOEE0MUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjQgMDhBNDNGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI4IDA4QTQ1RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyAwOEE0N0YwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzAgMDhBNDlGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM0IDA4QTRCRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCAwOEE0REYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2MgMDhBNEZGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQwIDA4QTQwQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCAwOEE0MkEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDggMDhBNDRBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTRjIDA4QTQ2QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCAwOEE0OEEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTQgMDhBNEFBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU4IDA4QTRDQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyAwOEE0RUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjAgMDhBNDFBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY0IDA4QTQzQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCAwOEE0NUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNmMgMDhBNDdBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTcwIDA4QTQ5QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCAwOEE0QkEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzggMDhBNERBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTdjIDA4QTRGQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4MCAwOEE0MEUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODQgMDhBNDJFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg4IDA4QTQ0RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4YyAwOEE0NkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTAgMDhBNDhFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk0IDA4QTRBRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5OCAwOEE0Q0UwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOWMgMDhBNEVFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWEwIDA4QTQxRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhNCAwOEE0M0UwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTggMDhBNDVFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWFjIDA4QTQ3RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiMCAwOEE0OUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjQgMDhBNEJFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWI4IDA4QTRERTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiYyAwOEE0RkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzAgMDhBNDA3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM0IDA4QTQyNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjOCAwOEE0NDcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxY2MgMDhBNDY3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQwIDA4QTQ4NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkNCAwOEE0QTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDggMDhBNEM3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWRjIDA4QTRFNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlMCAwOEE0MTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTQgMDhBNDM3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWU4IDA4QTQ1NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlYyAwOEE0NzcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjAgMDhBNDk3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWY0IDA4QTRCNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmOCAwOEE0RDcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZmMgMDhBNEY3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjAwIDA4QTQwRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwNCAwOEE0MkYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDggMDhBNDRGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjBjIDA4QTQ2RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxMCAwOEE0OEYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTQgMDhBNEFGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjE4IDA4QTRDRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxYyAwOEE0RUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjAgMDhBNDFGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjI0IDA4QTQzRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyOCAwOEE0NUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMmMgMDhBNDdGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjMwIDA4QTQ5RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzNCAwOEE0QkYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzggMDhBNERGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjNjIDA4QTRGRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNDRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYWRkMiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhZGQyLnM6IGFkZDIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhZGQyLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4NjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1NjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY2MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQwQTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0MkEyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDRBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ2QTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0OEEyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNEFBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTRDQTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0RUEyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDFBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQzQTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NUEyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDdBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ5QTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0QkEyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNERBMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTRGQTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0MEUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDJFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTQ0RTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0NkUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDhFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTRBRTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0Q0UyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEVFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDA4QTQxRTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0M0UyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDVFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDA4QTQ3RTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0OUUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNEJFMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDA4QTRERTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RkUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMDhBNDA3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDA4QTQyNzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAwOEE0NDcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMDhBNDY3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDA4QTQ4NzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAwOEE0QTcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMDhBNEM3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDA4QTRFNzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAwOEE0MTcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgMDhBNDM3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDA4QTQ1NzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAwOEE0NzcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgMDhBNDk3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IDA4QTRCNzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCAwOEE0RDcyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgMDhBNEY3MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIDA4QTQwRjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCAwOEE0MkYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggMDhBNDRGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIDA4QTQ2RjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCAwOEE0OEYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgMDhBNEFGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE4IDA4QTRDRjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyAwOEE0RUYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjAgMDhBNDFGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI0IDA4QTQzRjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCAwOEE0NUYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmMgMDhBNDdGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTMwIDA4QTQ5RjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCAwOEE0QkYyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzggMDhBNERGMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNjIDA4QTRGRjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT04MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaDFhZGQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2gxYWRkLnM6IHNoMWFkZCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNoMWFkZC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0E0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0E0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDBFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NEU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDZFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNENFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDNFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0N0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDlFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0REU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEZFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTQ4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoMmFkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaDJhZGQuczogc2gyYWRkIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2gyYWRkLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQwQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0MkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDRBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ2QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0OEE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNEFBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTRDQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0RUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDFBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQzQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDdBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ5QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0QkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNERBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTRGQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0MEU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDJFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTQ0RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0NkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDhFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTRBRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0Q0U4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEVFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDA4QTQxRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0M0U4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDVFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDA4QTQ3RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0OUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNEJFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDA4QTRERTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2gzYWRkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNoM2FkZC5zOiBzaDNhZGQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaDNhZGQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0FDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MkVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDRFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0OEVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEFFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDFFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDdFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QkVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNERFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaGxhZGQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2hsYWRkLnM6IHNobGFkZCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNobGFkZC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0E0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0E0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDBFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NEU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDZFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNENFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDNFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0N0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDlFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0REU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEZFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDA4QTQwNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwOEE0MjY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMDhBNDQ2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDA4QTQ2Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAwOEE0ODY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMDhBNEE2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDA4QTRDNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAwOEE0RTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMDhBNDE2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDA4QTQzNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAwOEE0NTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMDhBNDc2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDA4QTQ5Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAwOEE0QjY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMDhBNEQ2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDA4QTRGNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAwOEE0MEE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMDhBNDJBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDA4QTQ0QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAwOEE0NkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMDhBNDhBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDA4QTRBQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAwOEE0Q0E4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMDhBNEVBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDA4QTQxQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAwOEE0M0E4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMDhBNDVBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDA4QTQ3QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAwOEE0OUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMDhBNEJBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDA4QTREQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAwOEE0RkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgMDhBNDBFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDA4QTQyRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCAwOEE0NEU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgMDhBNDZFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDA4QTQ4RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCAwOEE0QUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggMDhBNENFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDA4QTRFRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCAwOEE0MUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgMDhBNDNFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDA4QTQ1RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyAwOEE0N0U4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgMDhBNDlFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDA4QTRCRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCAwOEE0REU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgMDhBNEZFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTgwIDA4QTQwNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4NCAwOEE0MjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODggMDhBNDQ2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMThjIDA4QTQ2NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MCAwOEE0ODZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTQgMDhBNEE2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IDA4QTRDNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5YyAwOEE0RTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTAgMDhBNDE2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE0IDA4QTQzNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhOCAwOEE0NTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYWMgMDhBNDc2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWIwIDA4QTQ5NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNCAwOEE0QjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjggMDhBNEQ2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIDA4QTRGNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjMCAwOEE0MEFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzQgMDhBNDJBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM4IDA4QTQ0QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjYyAwOEE0NkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDAgMDhBNDhBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ0IDA4QTRBQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkOCAwOEE0Q0FDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZGMgMDhBNEVBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWUwIDA4QTQxQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlNCAwOEE0M0FDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTggMDhBNDVBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWVjIDA4QTQ3QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmMCAwOEE0OUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjQgMDhBNEJBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWY4IDA4QTREQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmYyAwOEE0RkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDAgMDhBNDBFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA0IDA4QTQyRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwOCAwOEE0NEVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMGMgMDhBNDZFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjEwIDA4QTQ4RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxNCAwOEE0QUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTggMDhBNENFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjFjIDA4QTRFRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyMCAwOEE0MUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjQgMDhBNDNFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjI4IDA4QTQ1RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyYyAwOEE0N0VDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzAgMDhBNDlFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM0IDA4QTRCRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzOCAwOEE0REVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyM2MgMDhBNEZFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE0NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaGxhZGQyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNobGFkZDIuczogc2hsYWRkMiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNobGFkZDIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI2NjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENjY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjY2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEE2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUE2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUE2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0E2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REE2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZBNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwRTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MkU2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDRFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2RTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0OEU2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEFFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDRTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RUU2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDFFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzRTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NUU2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDdFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5RTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QkU2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNERFNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGRTY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAwOEE0MDZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMDhBNDI2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDA4QTQ0NkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAwOEE0NjZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMDhBNDg2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDA4QTRBNkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAwOEE0QzZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMDhBNEU2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDA4QTQxNkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAwOEE0MzZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMDhBNDU2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDA4QTQ3NkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAwOEE0OTZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMDhBNEI2QTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDA4QTRENkE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAwOEE0RjZBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMDhBNDBBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDA4QTQyQUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAwOEE0NEFBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMDhBNDZBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDA4QTQ4QUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAwOEE0QUFBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMDhBNENBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDA4QTRFQUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCAwOEE0MUFBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjQgMDhBNDNBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI4IDA4QTQ1QUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyAwOEE0N0FBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzAgMDhBNDlBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM0IDA4QTRCQUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCAwOEE0REFBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2MgMDhBNEZBQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQwIDA4QTQwRUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCAwOEE0MkVBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDggMDhBNDRFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTRjIDA4QTQ2RUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCAwOEE0OEVBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTQgMDhBNEFFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU4IDA4QTRDRUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyAwOEE0RUVBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjAgMDhBNDFFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY0IDA4QTQzRUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCAwOEE0NUVBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNmMgMDhBNDdFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTcwIDA4QTQ5RUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCAwOEE0QkVBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzggMDhBNERFQTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTdjIDA4QTRGRUE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4MCAwOEE0MDZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODQgMDhBNDI2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg4IDA4QTQ0NkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4YyAwOEE0NjZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTAgMDhBNDg2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk0IDA4QTRBNkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5OCAwOEE0QzZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOWMgMDhBNEU2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWEwIDA4QTQxNkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhNCAwOEE0MzZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTggMDhBNDU2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWFjIDA4QTQ3NkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiMCAwOEE0OTZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjQgMDhBNEI2RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWI4IDA4QTRENkU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiYyAwOEE0RjZFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzAgMDhBNDBBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM0IDA4QTQyQUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjOCAwOEE0NEFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxY2MgMDhBNDZBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQwIDA4QTQ4QUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkNCAwOEE0QUFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDggMDhBNENBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWRjIDA4QTRFQUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlMCAwOEE0MUFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTQgMDhBNDNBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWU4IDA4QTQ1QUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlYyAwOEE0N0FFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjAgMDhBNDlBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWY0IDA4QTRCQUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmOCAwOEE0REFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZmMgMDhBNEZBRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjAwIDA4QTQwRUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwNCAwOEE0MkVFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDggMDhBNDRFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjBjIDA4QTQ2RUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxMCAwOEE0OEVFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTQgMDhBNEFFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjE4IDA4QTRDRUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxYyAwOEE0RUVFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjAgMDhBNDFFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjI0IDA4QTQzRUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyOCAwOEE0NUVFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMmMgMDhBNDdFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjMwIDA4QTQ5RUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzNCAwOEE0QkVFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzggMDhBNERFRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjNjIDA4QTRGRUU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNDRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3ViIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInN1Yi5zOiBzdWIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzdWIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0MwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MjUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDQ1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0ODUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEE1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDE1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDc1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QjUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNEQ1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAwOEE0MEQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMDhBNDJEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDA4QTQ0RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAwOEE0NkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMDhBNDhEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDA4QTRBRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAwOEE0Q0QwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMDhBNEVEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDA4QTQxRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAwOEE0M0QwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMDhBNDVEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDA4QTQ3RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAwOEE0OUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMDhBNEJEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDA4QTRERDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAwOEE0RkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMDhBNDA0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDA4QTQyNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAwOEE0NDRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMDhBNDY0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDA4QTQ4NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAwOEE0QTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMDhBNEM0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDA4QTRFNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCAwOEE0MTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjQgMDhBNDM0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI4IDA4QTQ1NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyAwOEE0NzRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzAgMDhBNDk0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM0IDA4QTRCNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCAwOEE0RDRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2MgMDhBNEY0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQwIDA4QTQwQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCAwOEE0MkNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDggMDhBNDRDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTRjIDA4QTQ2Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCAwOEE0OENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTQgMDhBNEFDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU4IDA4QTRDQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyAwOEE0RUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjAgMDhBNDFDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY0IDA4QTQzQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCAwOEE0NUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNmMgMDhBNDdDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTcwIDA4QTQ5Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCAwOEE0QkNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzggMDhBNERDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTdjIDA4QTRGQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4MCAwOEE0MEMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODQgMDhBNDJDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg4IDA4QTQ0QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4YyAwOEE0NkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTAgMDhBNDhDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk0IDA4QTRBQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5OCAwOEE0Q0MwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOWMgMDhBNEVDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWEwIDA4QTQxQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhNCAwOEE0M0MwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTggMDhBNDVDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWFjIDA4QTQ3QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiMCAwOEE0OUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjQgMDhBNEJDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWI4IDA4QTREQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiYyAwOEE0RkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzAgMDhBNDA1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM0IDA4QTQyNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjOCAwOEE0NDUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxY2MgMDhBNDY1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQwIDA4QTQ4NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkNCAwOEE0QTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDggMDhBNEM1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWRjIDA4QTRFNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlMCAwOEE0MTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTQgMDhBNDM1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWU4IDA4QTQ1NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlYyAwOEE0NzUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjAgMDhBNDk1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWY0IDA4QTRCNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmOCAwOEE0RDUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZmMgMDhBNEY1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjAwIDA4QTQwRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwNCAwOEE0MkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDggMDhBNDREMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjBjIDA4QTQ2RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxMCAwOEE0OEQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTQgMDhBNEFEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjE4IDA4QTRDRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxYyAwOEE0RUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjAgMDhBNDFEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjI0IDA4QTQzRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyOCAwOEE0NUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMmMgMDhBNDdEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjMwIDA4QTQ5RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzNCAwOEE0QkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzggMDhBNEREMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjNjIDA4QTRGRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI0MCAwOEE0MDRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNDQgMDhBNDI0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjQ4IDA4QTQ0NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI0YyAwOEE0NjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNTAgMDhBNDg0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjU0IDA4QTRBNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI1OCAwOEE0QzRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNWMgMDhBNEU0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjYwIDA4QTQxNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI2NCAwOEE0MzRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNjggMDhBNDU0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjZjIDA4QTQ3NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI3MCAwOEE0OTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNzQgMDhBNEI0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjc4IDA4QTRENEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI3YyAwOEE0RjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyODAgMDhBNDBDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjg0IDA4QTQyQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI4OCAwOEE0NENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOGMgMDhBNDZDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjkwIDA4QTQ4Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI5NCAwOEE0QUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOTggMDhBNENDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjljIDA4QTRFQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJhMCAwOEE0MUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYTQgMDhBNDNDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmE4IDA4QTQ1Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJhYyAwOEE0N0NDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYjAgMDhBNDlDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmI0IDA4QTRCQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJiOCAwOEE0RENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYmMgMDhBNEZDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE3Nl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zdWIyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInN1YjIuczogc3ViMiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN1YjIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI0MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0MyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQzI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REMyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZDMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwNTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MjUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDQ1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2NTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0ODUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEE1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDNTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RTUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDE1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzNTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NTUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDc1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5NTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QjUyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNEQ1MjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGNTI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAwOEE0MEQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMDhBNDJEMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDA4QTQ0RDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAwOEE0NkQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMDhBNDhEMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDA4QTRBRDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAwOEE0Q0QyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMDhBNEVEMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDA4QTQxRDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAwOEE0M0QyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMDhBNDVEMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDA4QTQ3RDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAwOEE0OUQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMDhBNEJEMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDA4QTRERDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAwOEE0RkQyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMDhBNDA0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDA4QTQyNEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAwOEE0NDRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMDhBNDY0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDA4QTQ4NEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAwOEE0QTRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMDhBNEM0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDA4QTRFNEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCAwOEE0MTRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjQgMDhBNDM0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI4IDA4QTQ1NEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyAwOEE0NzRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzAgMDhBNDk0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM0IDA4QTRCNEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCAwOEE0RDRFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2MgMDhBNEY0RTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQwIDA4QTQwQ0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCAwOEE0MkNFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDggMDhBNDRDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTRjIDA4QTQ2Q0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCAwOEE0OENFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTQgMDhBNEFDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU4IDA4QTRDQ0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyAwOEE0RUNFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjAgMDhBNDFDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY0IDA4QTQzQ0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCAwOEE0NUNFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNmMgMDhBNDdDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTcwIDA4QTQ5Q0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCAwOEE0QkNFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzggMDhBNERDRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTdjIDA4QTRGQ0U2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05Nl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19kcyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkcy5zOiBkcyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2NvbWNsciB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21jbHIuczogY29tY2xyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY29tY2xyLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0Nzg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDkwQTYwMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCA5MEE2MjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggOTBBNjQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDkwQTY2MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCA5MEE2ODBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgOTBBNkEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDkwQTZDMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyA5MEE2RTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgOTBBNjEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDkwQTYzMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCA5MEE2NTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgOTBBNjcwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDkwQTY5MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCA5MEE2QjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggOTBBNkQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDkwQTZGMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19sb2dpY2FsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogbG9naWNhbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvZ2ljYWwucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDIyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0MjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNEUyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTQxMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0MzI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNDUyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQ3MjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0RjI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDAyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQyMjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0NDI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNDYyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRFMjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0MTI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDMyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQ1Mjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NzI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNEYyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0MjIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNDQyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTQ2MjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0RTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQzMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0NTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDcyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRGMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNDIwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQ0MDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0NjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNEUwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0MzAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNDUwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTQ3MDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NDBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fdW5pdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJ1bml0LnM6IHVuaXQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJ1bml0LnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDAzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDQzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDYzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDgzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNEMzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEUzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNDEzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNDUzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDczODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDkzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNEQzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNEYzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDA5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNDQ5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNDY5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNDg5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNEM5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNEU5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDE5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDU5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDc5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNDk5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNEQ5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEY5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDA5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDQ5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDY5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDg5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNEM5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEU5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNDE5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNDU5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDc5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDk5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNEQ5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNEY5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDA5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNDQ5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNDY5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNDg5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNEM5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNEU5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDE5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDU5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDc5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNDk5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNEQ5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEY5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fdW5pdDIge30gewotICAgIHNldCB0ZXN0bmFtZSAidW5pdDIuczogdW5pdDIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJ1bml0Mi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwM0E2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQ0M0E2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ2M0E2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ4M0E2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTRDM0E2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRFM0E2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTQxM0E2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTQ1M0E2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQ3M0E2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQ5M0E2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTREM0E2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTRGM0E2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQwOUE2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTQ0OUE2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTQ2OUE2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTQ4OUE2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTRDOUE2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTRFOUE2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQxOUE2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ1OUE2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ3OUE2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTQ5OUE2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTREOUE2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRGOUE2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQwOUU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQ0OUU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ2OUU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ4OUU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTRDOUU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRFOUU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTQxOUU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTQ1OUU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQ3OUU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQ5OUU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTREOUU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTRGOUU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTM2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2Rjb3Ige30gewotICAgIHNldCB0ZXN0bmFtZSAiZGNvci5zOiBkY29yIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGNvci5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4ODAwQjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4ODA0Qjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4ODA2Qjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4ODA4Qjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4ODBDQjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4ODBFQjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4ODAxQjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4ODA1Qjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4ODA3Qjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4ODA5Qjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4ODBEQjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4ODBGQjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4ODAwQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4ODA0QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4ODA2QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4ODA4QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4ODBDQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4ODBFQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4ODAxQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4ODA1QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4ODA3QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4ODA5QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4ODBEQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4ODBGQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4ODAwQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4ODA0QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4ODA2QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4ODA4QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4ODBDQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4ODBFQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4ODAxQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4ODA1QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4ODA3QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4ODA5QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4ODBEQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4ODBGQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTM2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2Rjb3IyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRjb3IyLnM6IGRjb3IyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGNvcjIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwODgwMEJBNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwODgwNEJBNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwODgwNkJBNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwODgwOEJBNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwODgwQ0JBNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwODgwRUJBNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwODgwMUJBNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwODgwNUJBNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwODgwN0JBNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwODgwOUJBNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwODgwREJBNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwODgwRkJBNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwODgwMEJFNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwODgwNEJFNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwODgwNkJFNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwODgwOEJFNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwODgwQ0JFNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwODgwRUJFNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwODgwMUJFNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwODgwNUJFNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwODgwN0JFNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwODgwOUJFNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwODgwREJFNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwODgwRkJFNVxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hZGRpIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZGkuczogYWRkaSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZGkucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBCNEE2MDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQjRBNjIwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEI0QTY0MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBCNEE2NjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgQjRBNjgwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEI0QTZBMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBCNEE2QzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgQjRBNkUwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEI0QTYxMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBCNEE2MzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggQjRBNjUwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEI0QTY3MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBCNEE2OTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgQjRBNkIwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEI0QTZEMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBCNEE2RjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgQjRBNjA4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEI0QTYyOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBCNEE2NDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgQjRBNjY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEI0QTY4OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBCNEE2QThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggQjRBNkM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEI0QTZFOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBCNEE2MThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgQjRBNjM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEI0QTY1OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBCNEE2NzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgQjRBNjk4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEI0QTZCOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBCNEE2RDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgQjRBNkY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIEIwQTYwMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCBCMEE2MjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggQjBBNjQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIEIwQTY2MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCBCMEE2ODBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgQjBBNkEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IEIwQTZDMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyBCMEE2RTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgQjBBNjEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IEIwQTYzMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCBCMEE2NTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgQjBBNjcwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIEIwQTY5MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCBCMEE2QjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggQjBBNkQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIEIwQTZGMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCBCMEE2MDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgQjBBNjI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IEIwQTY0OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyBCMEE2NjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgQjBBNjg4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IEIwQTZBOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCBCMEE2QzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgQjBBNkU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIEIwQTYxOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCBCMEE2MzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggQjBBNjU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIEIwQTY3OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCBCMEE2OThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgQjBBNkI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IEIwQTZEOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyBCMEE2RjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgQjRBNjA4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IEI0QTYyOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCBCNEE2NDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgQjRBNjY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIEI0QTY4OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCBCNEE2QThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggQjRBNkM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIEI0QTZFOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCBCNEE2MThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjQgQjRBNjM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI4IEI0QTY1OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyBCNEE2NzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzAgQjRBNjk4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM0IEI0QTZCOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCBCNEE2RDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2MgQjRBNkY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQwIEIwQTYwMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCBCMEE2MjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDggQjBBNjQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTRjIEIwQTY2MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCBCMEE2ODBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTQgQjBBNkEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU4IEIwQTZDMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyBCMEE2RTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjAgQjBBNjEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY0IEIwQTYzMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCBCMEE2NTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNmMgQjBBNjcwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTcwIEIwQTY5MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCBCMEE2QjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzggQjBBNkQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTdjIEIwQTZGMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4MCBCMEE2MDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODQgQjBBNjI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg4IEIwQTY0OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4YyBCMEE2NjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTAgQjBBNjg4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk0IEIwQTZBOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5OCBCMEE2QzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOWMgQjBBNkU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWEwIEIwQTYxOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhNCBCMEE2MzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTggQjBBNjU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWFjIEIwQTY3OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiMCBCMEE2OThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjQgQjBBNkI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWI4IEIwQTZEOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiYyBCMEE2RjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3N1Ymkge30gewotICAgIHNldCB0ZXN0bmFtZSAic3ViaS5zOiBzdWJpIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic3ViaS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDk0QTYwMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA5NEE2MjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggOTRBNjQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDk0QTY2MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCA5NEE2ODBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgOTRBNkEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDk0QTZDMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyA5NEE2RTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgOTRBNjEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDk0QTYzMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCA5NEE2NTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgOTRBNjcwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDk0QTY5MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCA5NEE2QjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggOTRBNkQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDk0QTZGMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCA5NEE2MDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgOTRBNjI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDk0QTY0OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyA5NEE2NjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgOTRBNjg4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDk0QTZBOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCA5NEE2QzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgOTRBNkU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDk0QTYxOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCA5NEE2MzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggOTRBNjU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDk0QTY3OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCA5NEE2OThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgOTRBNkI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDk0QTZEOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyA5NEE2RjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgOTRBNjA4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDk0QTYyOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCA5NEE2NDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgOTRBNjY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDk0QTY4OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCA5NEE2QThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggOTRBNkM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDk0QTZFOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCA5NEE2MThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgOTRBNjM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDk0QTY1OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyA5NEE2NzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgOTRBNjk4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDk0QTZCOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCA5NEE2RDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgOTRBNkY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTQ4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoaWZ0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNoaWZ0LnM6IHNoaWZ0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2hpZnQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEMEE0MDAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBEMEE0MjAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEMEE0NDAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBEMEE0NjAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBEMEE0ODAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBEMEE0QTAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBEMEE0QzAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBEMEE0RTAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBEMEE0MEI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBEMEE0MkI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBEMEE0NEI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBEMEE0NkI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBEMEE0OEI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBEMEE0QUI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBEMEE0Q0I0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBEMEE0RUI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaGlmdDIge30gewotICAgIHNldCB0ZXN0bmFtZSAic2hpZnQyLnM6IHNoaWZ0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2hpZnQyLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDBBNDAwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDBBNDIwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDBBNDQwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRDBBNDYwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRDBBNDgwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRDBBNEEwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRDBBNEMwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRDBBNEUwMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRDBBNDBCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRDBBNDJCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRDBBNDRCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRDBBNDZCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRDBBNDhCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRDBBNEFCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRDBBNENCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRDBBNEVCNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2hpZnQzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNoaWZ0My5zOiBzaGlmdDMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaGlmdDMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEMEE0MDIwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBEMEE0MjIwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEMEE0NDIwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBEMEE0NjIwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBEMEE0ODIwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBEMEE0QTIwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBEMEE0QzIwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBEMEE0RTIwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBEMEE0MEY0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBEMEE0MkY0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBEMEE0NEY0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBEMEE0NkY0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBEMEE0OEY0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBEMEE0QUY0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBEMEE0Q0Y0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBEMEE0RUY0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19leHRyYWN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dHJhY3QuczogZXh0cmFjdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dHJhY3QucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEMDg2MThCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBEMDg2MzhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEMDg2NThCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBEMDg2NzhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBEMDg2OThCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBEMDg2QjhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBEMDg2RDhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBEMDg2RjhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBEMDg2MUNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBEMDg2M0NCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBEMDg2NUNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBEMDg2N0NCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBEMDg2OUNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBEMDg2QkNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBEMDg2RENCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBEMDg2RkNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBEMDg2MTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBEMDg2MzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBEMDg2NTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBEMDg2NzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBEMDg2OTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBEMDg2QjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBEMDg2RDAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBEMDg2RjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBEMDg2MTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBEMDg2MzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBEMDg2NTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBEMDg2NzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBEMDg2OTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBEMDg2QjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBEMDg2RDQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBEMDg2RjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19leHRyYWN0MiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHRyYWN0Mi5zOiBleHRyYWN0MiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dHJhY3QyLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDA4NjE4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDA4NjM4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDA4NjU4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRDA4Njc4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRDA4Njk4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRDA4NkI4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRDA4NkQ4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRDA4NkY4QjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRDA4NjFDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRDA4NjNDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRDA4NjVDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRDA4NjdDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRDA4NjlDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRDA4NkJDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRDA4NkRDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRDA4NkZDQjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRDA4NjEwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRDA4NjMwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRDA4NjUwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRDA4NjcwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRDA4NjkwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRDA4NkIwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRDA4NkQwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRDA4NkYwMUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRDA4NjE0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRDA4NjM0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRDA4NjU0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRDA4Njc0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRDA4Njk0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRDA4NkI0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRDA4NkQ0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgRDA4NkY0MUJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZXh0cmFjdDMge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0cmFjdDMuczogZXh0cmFjdDMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHRyYWN0My5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQ4ODYwMTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQ4ODYyMTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQ4ODY0MTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEQ4ODY2MTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEQ4ODY4MTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEQ4ODZBMTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEQ4ODZDMTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEQ4ODZFMTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEQ4ODYwNTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEQ4ODYyNTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEQ4ODY0NTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEQ4ODY2NTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEQ4ODY4NTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEQ4ODZBNTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEQ4ODZDNTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEQ4ODZFNTVCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEQwODYxMjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEQwODYzMjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEQwODY1MjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEQwODY3MjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEQwODY5MjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEQwODZCMjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEQwODZEMjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEQwODZGMjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEQwODYxNjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEQwODYzNjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEQwODY1NjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEQwODY3NjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEQwODY5NjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEQwODZCNjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEQwODZENjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEQwODZGNjFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTMyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2RlcG9zaXQge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGVwb3NpdC5zOiBkZXBvc2l0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGVwb3NpdC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQ0QzQwQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQ0QzQyQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQ0QzQ0QjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEQ0QzQ2QjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEQ0QzQ4QjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEQ0QzRBQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEQ0QzRDQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEQ0QzRFQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEQ0QzQwRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEQ0QzQyRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEQ0QzQ0RjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEQ0QzQ2RjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEQ0QzQ4RjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEQ0QzRBRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEQ0QzRDRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEQ0QzRFRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEQ0QzQwMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEQ0QzQyMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEQ0QzQ0MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEQ0QzQ2MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEQ0QzQ4MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEQ0QzRBMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEQ0QzRDMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEQ0QzRFMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEQ0QzQwNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEQ0QzQyNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEQ0QzQ0NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEQ0QzQ2NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEQ0QzQ4NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEQ0QzRBNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEQ0QzRDNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEQ0QzRFNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIEQ0REYxNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEQ0REYzNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IEQ0REY1NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIEQ0REY3NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEQ0REY5NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IEQ0REZCNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IEQ0REZENDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEQ0REZGNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIEQ0REYxMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IEQ0REYzMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEQ0REY1MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIEQ0REY3MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIEQ0REY5MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEQ0REZCMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IEQ0REZEMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIEQ0REZGMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEQ0REYxRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IEQ0REYzRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IEQ0REY1Rjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEQ0REY3Rjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIEQ0REY5Rjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IEQ0REZCRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IEQ0REZERjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIEQ0REZGRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIEQ0REYxQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEQ0REYzQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IEQ0REY1Qjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIEQ0REY3Qjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEQ0REY5Qjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IEQ0REZCQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IEQ0REZEQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIEQ0REZGQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTY0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2RlcG9zaXQyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRlcG9zaXQyLnM6IGRlcG9zaXQyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGVwb3NpdDIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBENEM0MEI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBENEM0MkI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBENEM0NEI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBENEM0NkI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBENEM0OEI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBENEM0QUI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBENEM0Q0I1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBENEM0RUI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBENEM0MEY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBENEM0MkY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBENEM0NEY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBENEM0NkY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBENEM0OEY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBENEM0QUY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBENEM0Q0Y1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBENEM0RUY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBENEM0MDAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBENEM0MjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBENEM0NDAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBENEM0NjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBENEM0ODAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBENEM0QTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBENEM0QzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBENEM0RTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBENEM0MDQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBENEM0MjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBENEM0NDQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBENEM0NjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBENEM0ODQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBENEM0QTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBENEM0QzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBENEM0RTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBENERGMTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCBENERGMzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBENERGNTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBENERGNzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCBENERGOTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBENERGQjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBENERGRDQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyBENERGRjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBENERGMTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCBENERGMzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCBENERGNTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBENERGNzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCBENERGOTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCBENERGQjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCBENERGRDAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyBENERGRjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCBENERGMUY3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCBENERGM0Y3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCBENERGNUY3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyBENERGN0Y3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCBENERGOUY3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCBENERGQkY3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCBENERGREY3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyBENERGRkY3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCBENERGMUI3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCBENERGM0I3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCBENERGNUI3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyBENERGN0I3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCBENERGOUI3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCBENERGQkI3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCBENERGREI3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyBENERGRkI3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19kZXBvc2l0MyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkZXBvc2l0My5zOiBkZXBvc2l0MyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRlcG9zaXQzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjBDNDBBQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYwQzQyQUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGMEM0NEFCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjBDNDZBQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEYwQzQ4QUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGMEM0QUFCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjBDNENBQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEYwQzRFQUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBGMEM0MEVCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjBDNDJFQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEYwQzQ0RUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGMEM0NkVCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRjBDNDhFQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEYwQzRBRUJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBGMEM0Q0VCQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRjBDNEVFQkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEQ0QzQwMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBENEM0MjIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRDRDNDQyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEQ0QzQ2MjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBENEM0ODIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRDRDNEEyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEQ0QzRDMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBENEM0RTIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRDRDNDA2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEQ0QzQyNjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBENEM0NDYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRDRDNDY2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEQ0QzQ4NjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBENEM0QTYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRDRDNEM2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEQ0QzRFNjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBENERGMTYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRDRERjM2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IEQ0REY1NjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBENERGNzYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgRDRERjk2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IEQ0REZCNjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBENERGRDYxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgRDRERkY2MUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIEQ0REYxMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCBENERGMzIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRDRERjUyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIEQ0REY3MjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCBENERGOTIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgRDRERkIyMUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IEQ0REZEMjFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyBENERGRjIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgRjRERjBFQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IEY0REYyRUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCBGNERGNEVCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgRjRERjZFQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIEY0REY4RUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCBGNERGQUVCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggRjRERkNFQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIEY0REZFRUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCBGNERGMEFCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgRjRERjJBQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IEY0REY0QUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyBGNERGNkFCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgRjRERjhBQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IEY0REZBQUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCBGNERGQ0FCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgRjRERkVBQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTY0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3N5c3RlbSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzeXN0ZW0uczogc3lzdGVtIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic3lzdGVtLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDAwMTgwMDVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDAwMDBDMDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDAwMDBDQTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDAwNTBENjRcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDAwNTBFNjRcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDAwNDE4NjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDBBMDEwQTRcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDAwNDE4MjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDE0NDE4NDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDAwMDA0QTRcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDE0MDA4QTRcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDAwMDA0MDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDAxMDA0MDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMTQwMDA0RDJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDRBNjExODdcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDRBMTMxODdcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDRBNjExQzdcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDRBMTMxQzdcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDRBNDEzNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDRBNDEzNjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDRBNDEzMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDRBNDEzMjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDRBNDEzMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDRBNDEwNDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDRBNDIwNDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDRBNDEwMDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDRBNDIwMDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3lzdGVtMiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzeXN0ZW0yLnM6IHN5c3RlbTIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzeXN0ZW0yLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDAwMDBDMDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDAwMDBDQTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDM5QjBENjRcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDM5QjBFNjRcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDE2MDQ4QTRcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDRBNjExODdcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDRBMTMxODdcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDRBNjExQzdcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDRBMTMxQzdcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09OV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19wdXJnZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwdXJnZS5zOiBwdXJnZSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInB1cmdlLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDRBNDEyMDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDRBNDEyMjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDRBNDIyMDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDRBNDIyMjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDRBNDEyNDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDRBNDEyNjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDRBNDIyNDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDRBNDIyNjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDRBNDEzODBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDRBNDEzQTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDRBNDEyODBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDRBNDEyQTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDRBNDIyODBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDRBNDIyQTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDRBNDEyQzBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDRBNDEyRTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDRBNDIyQzBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDRBNDIyRTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCi0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19wdXJnZTIge30gewotICAgIHNldCB0ZXN0bmFtZSAicHVyZ2UyLnM6IHB1cmdlMiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInB1cmdlMi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA0QTQxNjAwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA0QTQxNjIwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA0QTQyNjAwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA0QTQyNjIwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mcF9taXNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwX21pc2MuczogZnBfbWlzYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwX21pc2MucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMDAwMjQyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mbWVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZtZW0uczogZm1lbSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZtZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyNEE0MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjRBNDIwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDI0QTQwMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAyNEE0MjAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMkNBNDAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDJDQTQyMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAyQ0E0MDAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMkNBNDIwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDI0QTQwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAyNEE0MjIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMjRBNDAyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDI0QTQyMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAyQ0E0MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMkNBNDIyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDJDQTQwMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAyQ0E0MjIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgM0NBNDAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDNDQTQyMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAzQ0E0MDIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgM0NBNDIyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDI0QTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAyNEEwMzAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMjRBMDEwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDJDQTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAyQ0EwMzAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMkNBMDEwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDI0QTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAyNEEwMzIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMjRBMDEyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDJDQTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAyQ0EwMzIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMkNBMDEyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDNDQTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAzQ0EwMzIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggM0NBMDEyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTM1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ZwX2NvbXAge30gewotICAgIHNldCB0ZXN0bmFtZSAiZnBfY29tcC5zOiBmcF9jb21wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZnBfY29tcC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDMwQTA0MDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzMEEwNDgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMzBBMDU4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDMyODA0MDE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAzMjgwNDgxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMzBBMDYwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDMwQTA2ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAzMEEwNzgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMzI4MDYwMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDMyODA2ODE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAzMEEwODAwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMzBBMDg4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDMwQTA5ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAzMjgwODAxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMzI4MDg4MThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDMwQTBBMDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAzMEEwQTgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMzBBMEI4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDMyODBBMDE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAzMjgwQTgxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMzA4ODA2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDMwODgwRTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAzMDg4MUUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMzI5ODA2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDMyOTgwRTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAzMjk4MUUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMzA4ODI2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDMwODgyRTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAzMDg4M0UwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMzI5ODI2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDMyOTgyRTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAzMjk4M0UxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMzA4ODQ2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDMwODg0RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAzMDg4NUUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMzI5ODQ2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDMyOTg0RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAzMjk4NUUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMzA4ODY2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDMwODg2RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAzMDg4N0UwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMzI5ODY2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDMyOTg2RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAzMjk4N0UxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMzA4ODg2MENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDMwODg4RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAzMDg4OUUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMzI5ODg2MUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDMyOTg4RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAzMjk4OUUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMTgwMTIwRTJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDFBMTFBNEQyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCA5ODAxMjBFMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgOUExMUE0RDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDM4ODU0NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT01NV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mcF9jb21wMiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmcF9jb21wMi5zOiBmcF9jb21wMiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwX2NvbXAyLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQjhBQTYzOEVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEI4QUE2QTBFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBCQTVCMjU5NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgQkE1QjJDMTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEI4QUE2M0FFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBCOEFBNkEyRVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggQkE1QjI1QjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEJBNUIyQzM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAzOEEwQzA0QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMzBBMEM4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDMwQTBEODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAzQTgwQzA5OFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMzI4MEM4MThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDM4QTBFMDRBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAzMEEwRTgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMzBBMEY4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDNBODBFMDk4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAzMjgwRTgxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MThdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZnBfY29udiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmcF9jb252LnM6IGZwX2NvbnYgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJmcF9jb252LnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzBBMDAyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDMwQTAyMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMEEwNjIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMzBBMDBBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDMwQTAyQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAzMEEwNkEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMzBBMDFBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDMwQTAzQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAzMEEwN0EwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMzI4MDAyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDMyODAyMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAzMjgwNjIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMzI4MDBBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDMyODAyQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAzMjgwNkExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMzI4MDFBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDMyODAzQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAzMjgwN0ExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMzBBMDgyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDMwQTBBMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAzMEEwRTIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMzBBMDhBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDMwQTBBQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAzMEEwRUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMzBBMDlBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDMwQTBCQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAzMEEwRkEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMzI4MDgyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDMyODBBMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAzMjgwRTIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMzI4MDhBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDMyODBBQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAzMjgwRUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMzI4MDlBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDMyODBCQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAzMjgwRkExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMzBBMTAyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDMwQTEyMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAzMEExNjIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMzBBMTBBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDMwQTEyQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAzMEExNkEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMzBBMTFBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDMwQTEzQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAzMEExN0EwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMzI4MTAyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDMyODEyMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAzMjgxNjIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMzI4MTBBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDMyODEyQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAzMjgxNkExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMzI4MTFBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDMyODEzQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAzMjgxN0ExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMzBBMTgyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDMwQTFBMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAzMEExRTIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgMzBBMThBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDMwQTFBQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAzMEExRUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgMzBBMTlBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IDMwQTFCQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCAzMEExRkEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgMzI4MTgyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIDMyODFBMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCAzMjgxRTIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggMzI4MThBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIDMyODFBQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCAzMjgxRUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgMzI4MTlBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE4IDMyODFCQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyAzMjgxRkExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NzJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZnBfZmNtcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmcF9mY21wLnM6IGZwX2ZjbXAgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJmcF9mY21wLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzA4NTA0MDBcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMzA4NTA0MDFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMzA4NTA0MDJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMzA4NTA0MDNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMzA4NTA0MDRcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMzA4NTA0MDVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMzA4NTA0MDZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMzA4NTA0MDdcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMzA4NTA0MDhcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMzA4NTA0MDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMzA4NTA0MEFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMzA4NTA0MEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMzA4NTA0MENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMzA4NTA0MERcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMzA4NTA0MEVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMzA4NTA0MEZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMzA4NTA0MTBcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMzA4NTA0MTFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMzA4NTA0MTJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMzA4NTA0MTNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMzA4NTA0MTRcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMzA4NTA0MTVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMzA4NTA0MTZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMzA4NTA0MTdcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMzA4NTA0MThcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMzA4NTA0MTlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMzA4NTA0MUFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMzA4NTA0MUJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMzA4NTA0MUNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMzA4NTA0MURcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMzA4NTA0MUVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMzA4NTA0MUZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMzA4NTBDMDBcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMzA4NTBDMDFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMzA4NTBDMDJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMzA4NTBDMDNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMzA4NTBDMDRcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMzA4NTBDMDVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMzA4NTBDMDZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMzA4NTBDMDdcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMzA4NTBDMDhcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMzA4NTBDMDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMzA4NTBDMEFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMzA4NTBDMEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMzA4NTBDMENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMzA4NTBDMERcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMzA4NTBDMEVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMzA4NTBDMEZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMzA4NTBDMTBcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMzA4NTBDMTFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMzA4NTBDMTJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMzA4NTBDMTNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMzA4NTBDMTRcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMzA4NTBDMTVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMzA4NTBDMTZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMzA4NTBDMTdcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMzA4NTBDMThcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgMzA4NTBDMTlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMzA4NTBDMUFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMzA4NTBDMUJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgMzA4NTBDMUNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMzA4NTBDMURcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMzA4NTBDMUVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgMzA4NTBDMUZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMzA4NTFDMDBcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMzA4NTFDMDFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggMzA4NTFDMDJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMzA4NTFDMDNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMzA4NTFDMDRcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgMzA4NTFDMDVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMzA4NTFDMDZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMzA4NTFDMDdcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjAgMzA4NTFDMDhcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjQgMzA4NTFDMDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMzA4NTFDMEFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmMgMzA4NTFDMEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzAgMzA4NTFDMENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMzA4NTFDMERcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzggMzA4NTFDMEVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2MgMzA4NTFDMEZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgMzA4NTFDMTBcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDQgMzA4NTFDMTFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDggMzA4NTFDMTJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgMzA4NTFDMTNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTAgMzA4NTFDMTRcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTQgMzA4NTFDMTVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggMzA4NTFDMTZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNWMgMzA4NTFDMTdcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjAgMzA4NTFDMThcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgMzA4NTFDMTlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjggMzA4NTFDMUFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNmMgMzA4NTFDMUJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgMzA4NTFDMUNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzQgMzA4NTFDMURcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzggMzA4NTFDMUVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgMzA4NTFDMUZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09OTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbWVkaWEge30gewotICAgIHNldCB0ZXN0bmFtZSAibWVkaWEuczogbWVkaWEgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtZWRpYS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA5NjcwM0NDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA5NjcwMzRDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA5NjcwMzBDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA5NjcwMkNDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY4MDc4QjRCXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA5NjcwNzRDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA5NjcwNzhDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA5NjcwN0NDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEY4RTBDRjRCXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY4RTBDRjRCXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEY4RTBDQjRCXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA5NjcwNTRDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA5NjcwNThDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA5NjcwNUNDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDBBQ0UwMUM5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDBBQ0UwMTQ5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDBBQ0UwMTA5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEZBQ0U4NDA5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEZBQ0VDNDA5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEZBQ0U4MDA5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEZBQ0VDMDA5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEZBRDYwRTQ5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEZBRDY0QTg5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEZBRDY2MzA5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTI0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NwZWNpYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAic3BlY2lhbC5zOiBzcGVjaWFsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic3BlY2lhbC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA0QTQxNjgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwNEE0MTZBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDRBNDFBODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA0QTQxQUEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3BlcmYge30gewotICAgIHNldCB0ZXN0bmFtZSAicGVyZi5zOiBwZXJmIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicGVyZi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0KLSAgICAjIFRoZSB0aGlyZCBvbmUgaXMgcXVlc3Rpb25hYmxlLiAgSFAgYXMgZG9lc24ndCBnZW5lcmF0ZSB3aGF0IHRoZSBib29rCi0gICAgIyBzYXlzLiAgSXQgb3V0cHV0cyB0aGUgbnVsbGlmeSBmbGFnIGF0IDMwIGluc3RlYWQuCi0KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzAwMDA2ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDMwMDAwMjgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMDAwMDJBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zcG9wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNwb3Auczogc3BvcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICAjIFRoaXMgdGlja2xlcyBhIGJ1ZyBpbiB0aGUgZXhwcmVzc2lvbiBwYXJzZXIuCi0gICAgZ2FzX3N0YXJ0ICJzcG9wLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMTAwMDAxMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDEwMDAxOTEzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAxMDAwMDEyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMTAwMDE5MzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDEwMDAyQjA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAxMDAzOUIwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMTAwMDJCMjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDEwMDM5QjI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAxMEEwMDUwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMTBBMDFEMTNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDEwQTAwNTI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAxMEEwMUQzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMTBDNTA3MDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDEwQzUxRjEzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAxMEM1MDcyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMTBDNTFGMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2NvcHIge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29wci5zOiBjb3ByIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY29wci5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDMwMDAwMTA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzMDAwMDcxM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMzAwMDAxMjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDMwMDAwNzMzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2NvcHJtZW0ge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29wcm1lbS5zOiBjb3ByIG1lbW9yeSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNvcHJtZW0ucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyNDg1MDExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjQ4NTIxMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDI0ODUwMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAyNDg1MjEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMkM4NTAxMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDJDODUyMTFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAyQzg1MDEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMkM4NTIxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDI0ODUwMzFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAyNDg1MjMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMjQ4NTAzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDI0ODUyMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAyQzg1MDMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMkM4NTIzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDJDODUwMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAyQzg1MjMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMjQ4MDExMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDI0ODAzMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAyNDgwMTEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMkM4MDExMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDJDODAzMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAyQzgwMTEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMjQ4MDEzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDI0ODAzMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAyNDgwMTMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMkM4MDEzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDJDODAzMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAyQzgwMTMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZm1lbV9MUl90ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmbWVtTFJidWcuczogTFIgcmVnaXN0ZXIgc2VsZWN0aW9uIG9uIGZwIG1lbSBpbnN0cnVjdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJmbWVtTFJidWcucyIgIi1hbCIKLQotICAgICMgTWFrZSBzdXJlIHdlIGNvcnJlY3RseSBoYW5kbGUgZmllbGQgc2VsZWN0b3JzLiAKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMjc0MDEyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDI3NDgxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAyNzUwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMkY0MDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDJGNDgxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAyRjUwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMjc0MDEwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDI3NDgxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAyNzUwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMkY0MDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDJGNDgxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAyRjUwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMjc0MDEyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDI3NDgxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAyNzUwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMkY0MDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDJGNDgxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAyRjUwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMjc0MDEwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDI3NDgxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAyNzUwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMkY0MDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDJGNDgxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAyRjUwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMjc1OTAyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDI3NTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAyNzU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMjc1OTAwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDI3NTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAyNzU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMjc1OTAyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDI3NTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAyNzU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMjc1OTAwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDI3NTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAyNzU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgRTg0MEMwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDA4MDAwMjQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT01MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotaWYgW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgIyBUZXN0IHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBwYXJzZXIuCi0gICAgZG9faW1lbQotICAgIGRvX2ltbWVkCi0gICAgZG9fYnJhbmNoCi0gICAgZG9fYWRkCi0gICAgZG9fYWRkMgotICAgIGRvX3NoMWFkZAotICAgIGRvX3NoMmFkZAotICAgIGRvX3NoM2FkZAotICAgIGRvX3NobGFkZAotICAgIGRvX3NobGFkZDIKLSAgICBkb19zdWIKLSAgICBkb19zdWIyCi0gICAgZG9fZHMKLSAgICBkb19jb21jbHIKLSAgICBkb19sb2dpY2FsCi0gICAgZG9fdW5pdAotICAgIGRvX3VuaXQyCi0gICAgZG9fZGNvcgotICAgIGRvX2Rjb3IyCi0gICAgZG9fYWRkaQotICAgIGRvX3N1YmkKLSAgICBkb19zaGlmdAotICAgIGRvX3NoaWZ0MgotICAgIGRvX3NoaWZ0MwotICAgIGRvX2V4dHJhY3QKLSAgICBkb19leHRyYWN0MgotICAgIGRvX2V4dHJhY3QzCi0gICAgZG9fZGVwb3NpdAotICAgIGRvX2RlcG9zaXQyCi0gICAgZG9fZGVwb3NpdDMKLSAgICBkb19zeXN0ZW0KLSAgICBkb19zeXN0ZW0yCi0gICAgZG9fcHVyZ2UKLSAgICBkb19wdXJnZTIKLSAgICBkb19mcF9taXNjCi0gICAgZG9fZm1lbQotICAgIGRvX2ZwX2NvbXAKLSAgICBkb19mcF9jb252Ci0gICAgZG9fZnBfZmNtcAotICAgIGRvX3NwZWNpYWwKLSAgICBkb19wZXJmCi0gICAgZG9fc3BvcAotICAgIGRvX2NvcHIKLSAgICBkb19jb3BybWVtCi0KLSAgICAjIFRoZSAid2VpcmQucyIgZmlsZSBmcm9tIHRoZSBnZGIgdGVzdHN1aXRlLiAgU2ltcGx5IHZlcmlmeSBpdAotICAgICMgYXNzZW1ibGVzLgotICAgIGdhc190ZXN0ICJ3ZWlyZC5zIiAiIiAiIiAic3RhYnMgcGFyc2luZyIKLQotICAgICMgVGVzdCB0aGF0IHdlIGNvcnJlY3RseSBhc3NlbWJsZSBzb21lIEZQIG1lbW9yeSB0ZXN0cyB3aGljaAotICAgICMgTC9SIHJlZ2lzdGVyIHNlbGVjdHMuICAoUmVncmVzc2lvbiB0ZXN0IGZvciBhIGJ1ZyBUZWdlIGZvdW5kKS4KLSAgICBkb19mbWVtX0xSX3Rlc3RzCi0KLSAgICAjIFBBMi4wIHRlc3RzCi0gICAgZG9fZnBfY29tcDIKLSAgICBkb19icmFuY2gyCi0gICAgZG9fbWVkaWEKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYnJhbmNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2JyYW5jaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDQ5NjExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYnJhbmNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgTW9yZSBicmFuY2hpbmcgaW5zdHJ1Y3Rpb25zIHRoYW4geW91IGV2ZXIga25ldyB3aGF0IHRvIGRvIHdpdGguCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLWJyYW5jaF90ZXN0czogCi0JYmwgYnJhbmNoX3Rlc3RzLCVyMgotCWJsLG4gYnJhbmNoX3Rlc3RzLCVyMgotCWIgYnJhbmNoX3Rlc3RzCi0JYixuIGJyYW5jaF90ZXN0cwotCWdhdGUgYnJhbmNoX3Rlc3RzLCVyMgotCWdhdGUsbiBicmFuY2hfdGVzdHMsJXIyCi0JYmxyICVyNCwlcjIKLQlibHIsbiAlcjQsJXIyCi0JYmxyICVyNCwlcjAKLQlibHIsbiAlcjQsJXIwCi0JYnYgJXIwKCVyMikKLQlidixuICVyMCglcjIpCi0JYmUgMHgxMjM0KCVzcjEsJXIyKQotCWJlLG4gMHgxMjM0KCVzcjEsJXIyKQotCWJsZSAweDEyMzQoJXNyMSwlcjIpCi0JYmxlLG4gMHgxMjM0KCVzcjEsJXIyKQotCi1tb3ZiX3Rlc3RzOiAKLQltb3ZiICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLD0gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPCAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92YixvZCAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yix0ciAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw8PiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw+PSAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92YixldiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi1tb3ZiX251bGxpZmllZF90ZXN0czogCi0JbW92YixuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLD0sbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw8LG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsb2QsbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yix0cixuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLDw+LG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPj0sbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92YixldixuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQotbW92aWJfdGVzdHM6IAotCW1vdmliIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLD0gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsPCA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYixvZCA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYix0ciA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw8PiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw+PSA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYixldiA1LCVyMjYsbW92aWJfdGVzdHMKLW1vdmliX251bGxpZmllZF90ZXN0czogCi0JbW92aWIsbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw9LG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsPCxuIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLG9kLG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsdHIsbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw8PixuIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLD49LG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsZXYsbiA1LCVyMjYsbW92aWJfdGVzdHMKLQotY29tYl90ZXN0czogCi0JY29tYiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD0gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPD0gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PCAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw8PSAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLHN2ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsb2QgJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYix0ciAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw+ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj0gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj49ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixuc3YgJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixldiAlcjAsJXI0LGNvbWJfdGVzdHMKLWNvbWJfbnVsbGlmaWVkX3Rlc3RzOiAKLQljb21iLG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw9LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PSxuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPDwsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw8PSxuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsc3YsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLG9kLG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYix0cixuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPD4sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD49LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+Pj0sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD4+LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixuc3YsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLGV2LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0KLWNvbWliX3Rlc3RzOiAKLQljb21pYiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDwgMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PSAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw8IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPDw9IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsc3YgMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixvZCAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLHRyIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPD4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+PSAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+Pj0gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+PiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLG5zdiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLGV2IDAsJXI0LGNvbWJfdGVzdHMKLQotY29taWJfbnVsbGlmaWVkX3Rlc3RzOiAKLQljb21pYixuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPSxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPCxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPD0sbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw8LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PD0sbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLHN2LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixvZCxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsdHIsbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw+LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+PSxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPixuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPj49LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+PixuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsbnN2LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixldixuIDAsJXI0LGNvbWliX3Rlc3RzCi0KLQotCi1hZGRiX3Rlc3RzOiAKLQlhZGRiICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPSAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDwgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw8PSAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLG51diAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHpudiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHN2ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsb2QgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix0ciAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDw+ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPj0gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw+ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsdXYgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix2bnogJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixuc3YgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixldiAlcjEsJXI0LGFkZGJfdGVzdHMKLWFkZGJfbnVsbGlmaWVkX3Rlc3RzOiAKLQlhZGRiLG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw9LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw8LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw8PSxuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsbnV2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix6bnYsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHN2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixvZCxuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsdHIsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDw+LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw+PSxuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsdXYsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHZueixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsbnN2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixldixuICVyMSwlcjQsYWRkYl90ZXN0cwotCi1hZGRpYl90ZXN0czogCi0JYWRkaWIgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPSAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw8IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLDw9IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLG51diAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix6bnYgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsc3YgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsb2QgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsdHIgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPD4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPj0gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix1diAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix2bnogLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsbnN2IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLGV2IC0xLCVyNCxjb21iX3Rlc3RzCi0KLWFkZGliX251bGxpZmllZF90ZXN0czogCi0JYWRkaWIsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw9LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPCxuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLDw9LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsbnV2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsem52LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsc3YsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixvZCxuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHRyLG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPD4sbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw+PSxuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLD4sbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix1dixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHZueixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLG5zdixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLGV2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0KLQotOyBOZWVkcyB0byBjaGVjayBsb3RzIG9mIHN0dWZmIChsaWtlIGNvcm5lciBiaXQgY2FzZXMpCi1iYl90ZXN0czogCi0JYnZiLDwgJXI0LGJiX3Rlc3RzCi0JYnZiLD49ICVyNCxiYl90ZXN0cwotCWJ2Yiw8LG4gJXI0LGJiX3Rlc3RzCi0JYnZiLD49LG4gJXI0LGJiX3Rlc3RzCi0JYmIsPCAlcjQsNSxiYl90ZXN0cwotCWJiLD49ICVyNCw1LGJiX3Rlc3RzCi0JYmIsPCxuICVyNCw1LGJiX3Rlc3RzCi0JYmIsPj0sbiAlcjQsNSxiYl90ZXN0cwotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9icmFuY2gyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2JyYW5jaDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1MGJkNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2JyYW5jaDIucworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBNb3JlIGJyYW5jaGluZyBpbnN0cnVjdGlvbnMgdGhhbiB5b3UgZXZlciBrbmV3IHdoYXQgdG8gZG8gd2l0aC4KLTsgUEEgMi4wIHZlcnNpb25zIGFuZCBuZXcgc3ludGF4LgotCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQotYmJfdGVzdHM6CQotCWJiLDwgJXI0LCVzYXIsYmJfdGVzdHMKLQliYiw+PSAlcjQsJXNhcixiYl90ZXN0cwotCWJiLDwsbiAlcjQsJWNyMTEsYmJfdGVzdHMKLQliYiw+PSxuICVyNCwlY3IxMSxiYl90ZXN0cwotCWJiLCo8ICVyNCwlc2FyLGJiX3Rlc3RzCi0JYmIsKj49ICVyNCwlc2FyLGJiX3Rlc3RzCi0JYmIsKjwsbiAlcjQsJWNyMTEsYmJfdGVzdHMKLQliYiwqPj0sbiAlcjQsJWNyMTEsYmJfdGVzdHMKLQliYiwqPCAlcjQsNSxiYl90ZXN0cwotCWJiLCo+PSAlcjQsNSxiYl90ZXN0cwotCWJiLCo8LG4gJXI0LDUsYmJfdGVzdHMKLQliYiwqPj0sbiAlcjQsNSxiYl90ZXN0cwotCQotYnJhbmNoX3N0YWNrOgkKLQljbHJidHMKLQlwb3BidHMgMQotCXBvcGJ0cyA0OTkKLQlwdXNobm9tCi0JcHVzaGJ0cyAlcjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb21jbHIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29tY2xyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYmZiYWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb21jbHIucworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JY29tY2xyICVyNCwlcjUsJXI2Ci0JY29tY2xyLD0gJXI0LCVyNSwlcjYKLQljb21jbHIsPCAlcjQsJXI1LCVyNgotCWNvbWNsciw8PSAlcjQsJXI1LCVyNgotCWNvbWNsciw8PCAlcjQsJXI1LCVyNgotCWNvbWNsciw8PD0gJXI0LCVyNSwlcjYKLQljb21jbHIsc3YgJXI0LCVyNSwlcjYKLQljb21jbHIsb2QgJXI0LCVyNSwlcjYKLQljb21jbHIsdHIgJXI0LCVyNSwlcjYKLQljb21jbHIsPD4gJXI0LCVyNSwlcjYKLQljb21jbHIsPj0gJXI0LCVyNSwlcjYKLQljb21jbHIsPiAlcjQsJXI1LCVyNgotCWNvbWNsciw+Pj0gJXI0LCVyNSwlcjYKLQljb21jbHIsPj4gJXI0LCVyNSwlcjYKLQljb21jbHIsbnN2ICVyNCwlcjUsJXI2Ci0JY29tY2xyLGV2ICVyNCwlcjUsJXI2Ci0KLQljb21pY2xyIDEyMywlcjUsJXI2Ci0JY29taWNsciw9IDEyMywlcjUsJXI2Ci0JY29taWNsciw8IDEyMywlcjUsJXI2Ci0JY29taWNsciw8PSAxMjMsJXI1LCVyNgotCWNvbWljbHIsPDwgMTIzLCVyNSwlcjYKLQljb21pY2xyLDw8PSAxMjMsJXI1LCVyNgotCWNvbWljbHIsc3YgMTIzLCVyNSwlcjYKLQljb21pY2xyLG9kIDEyMywlcjUsJXI2Ci0JY29taWNscix0ciAxMjMsJXI1LCVyNgotCWNvbWljbHIsPD4gMTIzLCVyNSwlcjYKLQljb21pY2xyLD49IDEyMywlcjUsJXI2Ci0JY29taWNsciw+IDEyMywlcjUsJXI2Ci0JY29taWNsciw+Pj0gMTIzLCVyNSwlcjYKLQljb21pY2xyLD4+IDEyMywlcjUsJXI2Ci0JY29taWNscixuc3YgMTIzLCVyNSwlcjYKLQljb21pY2xyLGV2IDEyMywlcjUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3ByLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMTQ2YTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3ByLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi1jb3ByX3Rlc3RzOiAKLQljb3ByLDQsNQotCWNvcHIsNCwxMTUKLQljb3ByLDQsNSxuCi0JY29wciw0LDExNSxuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvcHJtZW0ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wcm1lbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ1NmNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wcm1lbS5zCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgY29wciBtZW1vcnkgdGVzdHMgd2hpY2ggYWxzbyB0ZXN0IHRoZSB2YXJpb3VzIAotOyBhZGRyZXNzaW5nIG1vZGVzIGFuZCBjb21wbGV0ZXJzLgotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi07IAotY29wcl9pbmRleGluZ19sb2FkIAotCi0JY2xkd3gsNCAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGR3eCw0LHMgJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkd3gsNCxtICVyNSglc3IwLCVyNCksJXIyNgotCWNsZHd4LDQsc20gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHgsNCAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGRkeCw0LHMgJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHgsNCxtICVyNSglc3IwLCVyNCksJXIyNgotCWNsZGR4LDQsc20gJXI1KCVzcjAsJXI0KSwlcjI2Ci0KLWNvcHJfaW5kZXhpbmdfc3RvcmUgCi0JY3N0d3gsNCAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3R3eCw0LHMgJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0d3gsNCxtICVyMjYsJXI1KCVzcjAsJXI0KQotCWNzdHd4LDQsc20gJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0ZHgsNCAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3RkeCw0LHMgJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0ZHgsNCxtICVyMjYsJXI1KCVzcjAsJXI0KQotCWNzdGR4LDQsc20gJXIyNiwlcjUoJXNyMCwlcjQpCi0KLWNvcHJfc2hvcnRfbWVtb3J5IAotCWNsZHdzLDQgMCglc3IwLCVyNCksJXIyNgotCWNsZHdzLDQsbWIgMCglc3IwLCVyNCksJXIyNgotCWNsZHdzLDQsbWEgMCglc3IwLCVyNCksJXIyNgotCWNsZGRzLDQgMCglc3IwLCVyNCksJXIyNgotCWNsZGRzLDQsbWIgMCglc3IwLCVyNCksJXIyNgotCWNsZGRzLDQsbWEgMCglc3IwLCVyNCksJXIyNgotCWNzdHdzLDQgJXIyNiwwKCVzcjAsJXI0KQotCWNzdHdzLDQsbWIgJXIyNiwwKCVzcjAsJXI0KQotCWNzdHdzLDQsbWEgJXIyNiwwKCVzcjAsJXI0KQotCWNzdGRzLDQgJXIyNiwwKCVzcjAsJXI0KQotCWNzdGRzLDQsbWIgJXIyNiwwKCVzcjAsJXI0KQotCWNzdGRzLDQsbWEgJXIyNiwwKCVzcjAsJXI0KQotCi07IGdhcyBmdWNrcyB0aGlzIHVwIHRoaW5rcyBpdCBnZXRzIHRoZSBleHByZXNzaW9uIDQgbW9kdWxvIDUKLTsJY2xkd3gsNCAlcjUoMCwlcjQpLCVyJXIyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kY29yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliZmMzZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IucworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IGRlY2ltYWwgY29ycmVjdGlvbiBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZGNvciAlcjQsJXI1Ci0JZGNvcixzYnogJXI0LCVyNQotCWRjb3Isc2h6ICVyNCwlcjUKLQlkY29yLHNkYyAlcjQsJXI1Ci0JZGNvcixzYmMgJXI0LCVyNQotCWRjb3Isc2hjICVyNCwlcjUKLQlkY29yLHRyICVyNCwlcjUKLQlkY29yLG5ieiAlcjQsJXI1Ci0JZGNvcixuaHogJXI0LCVyNQotCWRjb3IsbmRjICVyNCwlcjUKLQlkY29yLG5iYyAlcjQsJXI1Ci0JZGNvcixuaGMgJXI0LCVyNQotCi0JaWRjb3IgJXI0LCVyNQotCWlkY29yLHNieiAlcjQsJXI1Ci0JaWRjb3Isc2h6ICVyNCwlcjUKLQlpZGNvcixzZGMgJXI0LCVyNQotCWlkY29yLHNiYyAlcjQsJXI1Ci0JaWRjb3Isc2hjICVyNCwlcjUKLQlpZGNvcix0ciAlcjQsJXI1Ci0JaWRjb3IsbmJ6ICVyNCwlcjUKLQlpZGNvcixuaHogJXI0LCVyNQotCWlkY29yLG5kYyAlcjQsJXI1Ci0JaWRjb3IsbmJjICVyNCwlcjUKLQlpZGNvcixuaGMgJXI0LCVyNQotCi0JZGNvcixpICVyNCwlcjUKLQlkY29yLGksc2J6ICVyNCwlcjUKLQlkY29yLGksc2h6ICVyNCwlcjUKLQlkY29yLGksc2RjICVyNCwlcjUKLQlkY29yLGksc2JjICVyNCwlcjUKLQlkY29yLGksc2hjICVyNCwlcjUKLQlkY29yLGksdHIgJXI0LCVyNQotCWRjb3IsaSxuYnogJXI0LCVyNQotCWRjb3IsaSxuaHogJXI0LCVyNQotCWRjb3IsaSxuZGMgJXI0LCVyNQotCWRjb3IsaSxuYmMgJXI0LCVyNQotCWRjb3IsaSxuaGMgJXI0LCVyNQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZGRjMWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kY29yMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IFBBMi4wIGRlY2ltYWwgY29ycmVjdGlvbiBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZGNvciwqICVyNCwlcjUKLQlkY29yLCpzYnogJXI0LCVyNQotCWRjb3IsKnNoeiAlcjQsJXI1Ci0JZGNvciwqc2RjICVyNCwlcjUKLQlkY29yLCpzYmMgJXI0LCVyNQotCWRjb3IsKnNoYyAlcjQsJXI1Ci0JZGNvciwqdHIgJXI0LCVyNQotCWRjb3IsKm5ieiAlcjQsJXI1Ci0JZGNvciwqbmh6ICVyNCwlcjUKLQlkY29yLCpuZGMgJXI0LCVyNQotCWRjb3IsKm5iYyAlcjQsJXI1Ci0JZGNvciwqbmhjICVyNCwlcjUKLQotCWRjb3IsaSwqICVyNCwlcjUKLQlkY29yLGksKnNieiAlcjQsJXI1Ci0JZGNvcixpLCpzaHogJXI0LCVyNQotCWRjb3IsaSwqc2RjICVyNCwlcjUKLQlkY29yLGksKnNiYyAlcjQsJXI1Ci0JZGNvcixpLCpzaGMgJXI0LCVyNQotCWRjb3IsaSwqdHIgJXI0LCVyNQotCWRjb3IsaSwqbmJ6ICVyNCwlcjUKLQlkY29yLGksKm5oeiAlcjQsJXI1Ci0JZGNvcixpLCpuZGMgJXI0LCVyNQotCWRjb3IsaSwqbmJjICVyNCwlcjUKLQlkY29yLGksKm5oYyAlcjQsJXI1Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGVwb3NpdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YTdkY2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXpkZXAgJXI0LDUsMTAsJXI2Ci0JemRlcCw9ICVyNCw1LDEwLCVyNgotCXpkZXAsPCAlcjQsNSwxMCwlcjYKLQl6ZGVwLG9kICVyNCw1LDEwLCVyNgotCXpkZXAsdHIgJXI0LDUsMTAsJXI2Ci0JemRlcCw8PiAlcjQsNSwxMCwlcjYKLQl6ZGVwLD49ICVyNCw1LDEwLCVyNgotCXpkZXAsZXYgJXI0LDUsMTAsJXI2Ci0KLQlkZXAgJXI0LDUsMTAsJXI2Ci0JZGVwLD0gJXI0LDUsMTAsJXI2Ci0JZGVwLDwgJXI0LDUsMTAsJXI2Ci0JZGVwLG9kICVyNCw1LDEwLCVyNgotCWRlcCx0ciAlcjQsNSwxMCwlcjYKLQlkZXAsPD4gJXI0LDUsMTAsJXI2Ci0JZGVwLD49ICVyNCw1LDEwLCVyNgotCWRlcCxldiAlcjQsNSwxMCwlcjYKLQotCXp2ZGVwICVyNCw1LCVyNgotCXp2ZGVwLD0gJXI0LDUsJXI2Ci0JenZkZXAsPCAlcjQsNSwlcjYKLQl6dmRlcCxvZCAlcjQsNSwlcjYKLQl6dmRlcCx0ciAlcjQsNSwlcjYKLQl6dmRlcCw8PiAlcjQsNSwlcjYKLQl6dmRlcCw+PSAlcjQsNSwlcjYKLQl6dmRlcCxldiAlcjQsNSwlcjYKLQotCXZkZXAgJXI0LDUsJXI2Ci0JdmRlcCw9ICVyNCw1LCVyNgotCXZkZXAsPCAlcjQsNSwlcjYKLQl2ZGVwLG9kICVyNCw1LCVyNgotCXZkZXAsdHIgJXI0LDUsJXI2Ci0JdmRlcCw8PiAlcjQsNSwlcjYKLQl2ZGVwLD49ICVyNCw1LCVyNgotCXZkZXAsZXYgJXI0LDUsJXI2Ci0KLQl2ZGVwaSAtMSw1LCVyNgotCXZkZXBpLD0gLTEsNSwlcjYKLQl2ZGVwaSw8IC0xLDUsJXI2Ci0JdmRlcGksb2QgLTEsNSwlcjYKLQl2ZGVwaSx0ciAtMSw1LCVyNgotCXZkZXBpLDw+IC0xLDUsJXI2Ci0JdmRlcGksPj0gLTEsNSwlcjYKLQl2ZGVwaSxldiAtMSw1LCVyNgotCi0JenZkZXBpIC0xLDUsJXI2Ci0JenZkZXBpLD0gLTEsNSwlcjYKLQl6dmRlcGksPCAtMSw1LCVyNgotCXp2ZGVwaSxvZCAtMSw1LCVyNgotCXp2ZGVwaSx0ciAtMSw1LCVyNgotCXp2ZGVwaSw8PiAtMSw1LCVyNgotCXp2ZGVwaSw+PSAtMSw1LCVyNgotCXp2ZGVwaSxldiAtMSw1LCVyNgotCi0JZGVwaSAtMSw0LDEwLCVyNgotCWRlcGksPSAtMSw0LDEwLCVyNgotCWRlcGksPCAtMSw0LDEwLCVyNgotCWRlcGksb2QgLTEsNCwxMCwlcjYKLQlkZXBpLHRyIC0xLDQsMTAsJXI2Ci0JZGVwaSw8PiAtMSw0LDEwLCVyNgotCWRlcGksPj0gLTEsNCwxMCwlcjYKLQlkZXBpLGV2IC0xLDQsMTAsJXI2Ci0KLQl6ZGVwaSAtMSw0LDEwLCVyNgotCXpkZXBpLD0gLTEsNCwxMCwlcjYKLQl6ZGVwaSw8IC0xLDQsMTAsJXI2Ci0JemRlcGksb2QgLTEsNCwxMCwlcjYKLQl6ZGVwaSx0ciAtMSw0LDEwLCVyNgotCXpkZXBpLDw+IC0xLDQsMTAsJXI2Ci0JemRlcGksPj0gLTEsNCwxMCwlcjYKLQl6ZGVwaSxldiAtMSw0LDEwLCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RlcG9zaXQyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RlcG9zaXQyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2Yjc1OTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0Mi5zCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgRGVwb3NpdCBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZGVwdyx6ICVyNCw1LDEwLCVyNgotCWRlcHcseiw9ICVyNCw1LDEwLCVyNgotCWRlcHcseiw8ICVyNCw1LDEwLCVyNgotCWRlcHcseixvZCAlcjQsNSwxMCwlcjYKLQlkZXB3LHosdHIgJXI0LDUsMTAsJXI2Ci0JZGVwdyx6LDw+ICVyNCw1LDEwLCVyNgotCWRlcHcseiw+PSAlcjQsNSwxMCwlcjYKLQlkZXB3LHosZXYgJXI0LDUsMTAsJXI2Ci0KLQlkZXB3ICVyNCw1LDEwLCVyNgotCWRlcHcsPSAlcjQsNSwxMCwlcjYKLQlkZXB3LDwgJXI0LDUsMTAsJXI2Ci0JZGVwdyxvZCAlcjQsNSwxMCwlcjYKLQlkZXB3LHRyICVyNCw1LDEwLCVyNgotCWRlcHcsPD4gJXI0LDUsMTAsJXI2Ci0JZGVwdyw+PSAlcjQsNSwxMCwlcjYKLQlkZXB3LGV2ICVyNCw1LDEwLCVyNgotCi0JZGVwdyx6CSVyNCwlc2FyLDUsJXI2Ci0JZGVwdyx6LD0gJXI0LCVzYXIsNSwlcjYKLQlkZXB3LHosPCAlcjQsJXNhciw1LCVyNgotCWRlcHcseixvZCAlcjQsJXNhciw1LCVyNgotCWRlcHcseix0ciAlcjQsJXNhciw1LCVyNgotCWRlcHcseiw8PiAlcjQsJXNhciw1LCVyNgotCWRlcHcseiw+PSAlcjQsJXNhciw1LCVyNgotCWRlcHcseixldiAlcjQsJXNhciw1LCVyNgotCi0JZGVwdyAlcjQsJXNhciw1LCVyNgotCWRlcHcsPSAlcjQsJXNhciw1LCVyNgotCWRlcHcsPCAlcjQsJXNhciw1LCVyNgotCWRlcHcsb2QgJXI0LCVzYXIsNSwlcjYKLQlkZXB3LHRyICVyNCwlc2FyLDUsJXI2Ci0JZGVwdyw8PiAlcjQsJXNhciw1LCVyNgotCWRlcHcsPj0gJXI0LCVzYXIsNSwlcjYKLQlkZXB3LGV2ICVyNCwlc2FyLDUsJXI2Ci0KLQlkZXB3aSAtMSwlc2FyLDUsJXI2Ci0JZGVwd2ksPSAtMSwlc2FyLDUsJXI2Ci0JZGVwd2ksPCAtMSwlc2FyLDUsJXI2Ci0JZGVwd2ksb2QgLTEsJXNhciw1LCVyNgotCWRlcHdpLHRyIC0xLCVzYXIsNSwlcjYKLQlkZXB3aSw8PiAtMSwlc2FyLDUsJXI2Ci0JZGVwd2ksPj0gLTEsJXNhciw1LCVyNgotCWRlcHdpLGV2IC0xLCVzYXIsNSwlcjYKLQotCWRlcHdpLHogLTEsJXNhciw1LCVyNgotCWRlcHdpLHosPSAtMSwlc2FyLDUsJXI2Ci0JZGVwd2kseiw8IC0xLCVzYXIsNSwlcjYKLQlkZXB3aSx6LG9kIC0xLCVzYXIsNSwlcjYKLQlkZXB3aSx6LHRyIC0xLCVzYXIsNSwlcjYKLQlkZXB3aSx6LDw+IC0xLCVzYXIsNSwlcjYKLQlkZXB3aSx6LD49IC0xLCVzYXIsNSwlcjYKLQlkZXB3aSx6LGV2IC0xLCVzYXIsNSwlcjYKLQotCWRlcHdpIC0xLDQsMTAsJXI2Ci0JZGVwd2ksPSAtMSw0LDEwLCVyNgotCWRlcHdpLDwgLTEsNCwxMCwlcjYKLQlkZXB3aSxvZCAtMSw0LDEwLCVyNgotCWRlcHdpLHRyIC0xLDQsMTAsJXI2Ci0JZGVwd2ksPD4gLTEsNCwxMCwlcjYKLQlkZXB3aSw+PSAtMSw0LDEwLCVyNgotCWRlcHdpLGV2IC0xLDQsMTAsJXI2Ci0KLQlkZXB3aSx6CS0xLDQsMTAsJXI2Ci0JZGVwd2kseiw9IC0xLDQsMTAsJXI2Ci0JZGVwd2kseiw8IC0xLDQsMTAsJXI2Ci0JZGVwd2kseixvZCAtMSw0LDEwLCVyNgotCWRlcHdpLHosdHIgLTEsNCwxMCwlcjYKLQlkZXB3aSx6LDw+IC0xLDQsMTAsJXI2Ci0JZGVwd2kseiw+PSAtMSw0LDEwLCVyNgotCWRlcHdpLHosZXYgLTEsNCwxMCwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGVwb3NpdDMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGVwb3NpdDMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiNzExNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RlcG9zaXQzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0JLkxFVkVMIDIuMAotCS5jb2RlCi0JLmFsaWduIDQKLTsgUEEgMi4wIERlcG9zaXQgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWRlcGQseiwqICVyNCwxMCw1LCVyNgotCWRlcGQseiwqPSAlcjQsMTAsNSwlcjYKLQlkZXBkLHosKjwgJXI0LDEwLDUsJXI2Ci0JZGVwZCx6LCpvZCAlcjQsMTAsNSwlcjYKLQlkZXBkLHosKnRyICVyNCwxMCw1LCVyNgotCWRlcGQseiwqPD4gJXI0LDEwLDUsJXI2Ci0JZGVwZCx6LCo+PSAlcjQsMTAsNSwlcjYKLQlkZXBkLHosKmV2ICVyNCwxMCw1LCVyNgotCi0JZGVwZCwqICVyNCwxMCw1LCVyNgotCWRlcGQsKj0gJXI0LDEwLDUsJXI2Ci0JZGVwZCwqPCAlcjQsMTAsNSwlcjYKLQlkZXBkLCpvZCAlcjQsMTAsNSwlcjYKLQlkZXBkLCp0ciAlcjQsMTAsNSwlcjYKLQlkZXBkLCo8PiAlcjQsMTAsNSwlcjYKLQlkZXBkLCo+PSAlcjQsMTAsNSwlcjYKLQlkZXBkLCpldiAlcjQsMTAsNSwlcjYKLQotCWRlcGQseiwqICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCx6LCo9ICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCx6LCo8ICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCx6LCpvZCAlcjQsJXNhciw1LCVyNgotCWRlcGQseiwqdHIgJXI0LCVzYXIsNSwlcjYKLQlkZXBkLHosKjw+ICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCx6LCo+PSAlcjQsJXNhciw1LCVyNgotCWRlcGQseiwqZXYgJXI0LCVzYXIsNSwlcjYKLQotCWRlcGQsKiAlcjQsJXNhciw1LCVyNgotCWRlcGQsKj0gJXI0LCVzYXIsNSwlcjYKLQlkZXBkLCo8ICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCwqb2QgJXI0LCVzYXIsNSwlcjYKLQlkZXBkLCp0ciAlcjQsJXNhciw1LCVyNgotCWRlcGQsKjw+ICVyNCwlc2FyLDUsJXI2Ci0JZGVwZCwqPj0gJXI0LCVzYXIsNSwlcjYKLQlkZXBkLCpldiAlcjQsJXNhciw1LCVyNgotCi0JZGVwZGksKiAtMSwlc2FyLDUsJXI2Ci0JZGVwZGksKj0gLTEsJXNhciw1LCVyNgotCWRlcGRpLCo8IC0xLCVzYXIsNSwlcjYKLQlkZXBkaSwqb2QgLTEsJXNhciw1LCVyNgotCWRlcGRpLCp0ciAtMSwlc2FyLDUsJXI2Ci0JZGVwZGksKjw+IC0xLCVzYXIsNSwlcjYKLQlkZXBkaSwqPj0gLTEsJXNhciw1LCVyNgotCWRlcGRpLCpldiAtMSwlc2FyLDUsJXI2Ci0KLQlkZXBkaSx6LCogLTEsJXNhciw1LCVyNgotCWRlcGRpLHosKj0gLTEsJXNhciw1LCVyNgotCWRlcGRpLHosKjwgLTEsJXNhciw1LCVyNgotCWRlcGRpLHosKm9kIC0xLCVzYXIsNSwlcjYKLQlkZXBkaSx6LCp0ciAtMSwlc2FyLDUsJXI2Ci0JZGVwZGkseiwqPD4gLTEsJXNhciw1LCVyNgotCWRlcGRpLHosKj49IC0xLCVzYXIsNSwlcjYKLQlkZXBkaSx6LCpldiAtMSwlc2FyLDUsJXI2Ci0KLQlkZXBkaSwqIC0xLDEwLDQsJXI2Ci0JZGVwZGksKj0gLTEsMTAsNCwlcjYKLQlkZXBkaSwqPCAtMSwxMCw0LCVyNgotCWRlcGRpLCpvZCAtMSwxMCw0LCVyNgotCWRlcGRpLCp0ciAtMSwxMCw0LCVyNgotCWRlcGRpLCo8PiAtMSwxMCw0LCVyNgotCWRlcGRpLCo+PSAtMSwxMCw0LCVyNgotCWRlcGRpLCpldiAtMSwxMCw0LCVyNgotCi0JZGVwZGkseiwqIC0xLDEwLDQsJXI2Ci0JZGVwZGkseiwqPSAtMSwxMCw0LCVyNgotCWRlcGRpLHosKjwgLTEsMTAsNCwlcjYKLQlkZXBkaSx6LCpvZCAtMSwxMCw0LCVyNgotCWRlcGRpLHosKnRyIC0xLDEwLDQsJXI2Ci0JZGVwZGkseiwqPD4gLTEsMTAsNCwlcjYKLQlkZXBkaSx6LCo+PSAtMSwxMCw0LCVyNgotCWRlcGRpLHosKmV2IC0xLDEwLDQsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOWQ0NDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlkcyAlcjQsJXI1LCVyNgotCWRzLD0gJXI0LCVyNSwlcjYKLQlkcyw8ICVyNCwlcjUsJXI2Ci0JZHMsPD0gJXI0LCVyNSwlcjYKLQlkcyw8PCAlcjQsJXI1LCVyNgotCWRzLDw8PSAlcjQsJXI1LCVyNgotCWRzLHN2ICVyNCwlcjUsJXI2Ci0JZHMsb2QgJXI0LCVyNSwlcjYKLQlkcyx0ciAlcjQsJXI1LCVyNgotCWRzLDw+ICVyNCwlcjUsJXI2Ci0JZHMsPj0gJXI0LCVyNSwlcjYKLQlkcyw+ICVyNCwlcjUsJXI2Ci0JZHMsPj49ICVyNCwlcjUsJXI2Ci0JZHMsPj4gJXI0LCVyNSwlcjYKLQlkcyxuc3YgJXI0LCVyNSwlcjYKLQlkcyxldiAlcjQsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9leHRyYWN0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2V4dHJhY3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiNWE4ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2V4dHJhY3QucworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZXh0cnUgJXI0LDUsMTAsJXI2Ci0JZXh0cnUsPSAlcjQsNSwxMCwlcjYKLQlleHRydSw8ICVyNCw1LDEwLCVyNgotCWV4dHJ1LG9kICVyNCw1LDEwLCVyNgotCWV4dHJ1LHRyICVyNCw1LDEwLCVyNgotCWV4dHJ1LDw+ICVyNCw1LDEwLCVyNgotCWV4dHJ1LD49ICVyNCw1LDEwLCVyNgotCWV4dHJ1LGV2ICVyNCw1LDEwLCVyNgotCi0JZXh0cnMgJXI0LDUsMTAsJXI2Ci0JZXh0cnMsPSAlcjQsNSwxMCwlcjYKLQlleHRycyw8ICVyNCw1LDEwLCVyNgotCWV4dHJzLG9kICVyNCw1LDEwLCVyNgotCWV4dHJzLHRyICVyNCw1LDEwLCVyNgotCWV4dHJzLDw+ICVyNCw1LDEwLCVyNgotCWV4dHJzLD49ICVyNCw1LDEwLCVyNgotCWV4dHJzLGV2ICVyNCw1LDEwLCVyNgotCi0JdmV4dHJ1ICVyNCw1LCVyNgotCXZleHRydSw9ICVyNCw1LCVyNgotCXZleHRydSw8ICVyNCw1LCVyNgotCXZleHRydSxvZCAlcjQsNSwlcjYKLQl2ZXh0cnUsdHIgJXI0LDUsJXI2Ci0JdmV4dHJ1LDw+ICVyNCw1LCVyNgotCXZleHRydSw+PSAlcjQsNSwlcjYKLQl2ZXh0cnUsZXYgJXI0LDUsJXI2Ci0KLQl2ZXh0cnMgJXI0LDUsJXI2Ci0JdmV4dHJzLD0gJXI0LDUsJXI2Ci0JdmV4dHJzLDwgJXI0LDUsJXI2Ci0JdmV4dHJzLG9kICVyNCw1LCVyNgotCXZleHRycyx0ciAlcjQsNSwlcjYKLQl2ZXh0cnMsPD4gJXI0LDUsJXI2Ci0JdmV4dHJzLD49ICVyNCw1LCVyNgotCXZleHRycyxldiAlcjQsNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA3NWJhNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2V4dHJhY3QyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWV4dHJ3LHUgJXI0LDUsMTAsJXI2Ci0JZXh0cncsdSw9ICVyNCw1LDEwLCVyNgotCWV4dHJ3LHUsPCAlcjQsNSwxMCwlcjYKLQlleHRydyx1LG9kICVyNCw1LDEwLCVyNgotCWV4dHJ3LHUsdHIgJXI0LDUsMTAsJXI2Ci0JZXh0cncsdSw8PiAlcjQsNSwxMCwlcjYKLQlleHRydyx1LD49ICVyNCw1LDEwLCVyNgotCWV4dHJ3LHUsZXYgJXI0LDUsMTAsJXI2Ci0KLQlleHRydyxzICVyNCw1LDEwLCVyNgotCWV4dHJ3LHMsPSAlcjQsNSwxMCwlcjYKLQlleHRydyxzLDwgJXI0LDUsMTAsJXI2Ci0JZXh0cncscyxvZCAlcjQsNSwxMCwlcjYKLQlleHRydyx0ciAlcjQsNSwxMCwlcjYKLQlleHRydyw8PiAlcjQsNSwxMCwlcjYKLQlleHRydyw+PSAlcjQsNSwxMCwlcjYKLQlleHRydyxldiAlcjQsNSwxMCwlcjYKLQotCWV4dHJ3LHUgJXI0LCVzYXIsNSwlcjYKLQlleHRydyx1LD0gJXI0LCVzYXIsNSwlcjYKLQlleHRydyx1LDwgJXI0LCVzYXIsNSwlcjYKLQlleHRydyx1LG9kICVyNCwlc2FyLDUsJXI2Ci0JZXh0cncsdSx0ciAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LHUsPD4gJXI0LCVzYXIsNSwlcjYKLQlleHRydyx1LD49ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cncsdSxldiAlcjQsJXNhciw1LCVyNgotCQotCWV4dHJ3LHMgJXI0LCVzYXIsNSwlcjYKLQlleHRydyxzLD0gJXI0LCVzYXIsNSwlcjYKLQlleHRydyxzLDwgJXI0LCVzYXIsNSwlcjYKLQlleHRydyxzLG9kICVyNCwlc2FyLDUsJXI2Ci0JZXh0cncsdHIgJXI0LCVzYXIsNSwlcjYKLQlleHRydyw8PiAlcjQsJXNhciw1LCVyNgotCWV4dHJ3LD49ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cncsZXYgJXI0LCVzYXIsNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdDMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdDMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwMWNlYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2V4dHJhY3QzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0JLkxFVkVMIDIuMAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlleHRyZCx1LCogJXI0LDEwLDUsJXI2Ci0JZXh0cmQsdSwqPSAlcjQsMTAsNSwlcjYKLQlleHRyZCx1LCo8ICVyNCwxMCw1LCVyNgotCWV4dHJkLHUsKm9kICVyNCwxMCw1LCVyNgotCWV4dHJkLHUsKnRyICVyNCwxMCw1LCVyNgotCWV4dHJkLHUsKjw+ICVyNCwxMCw1LCVyNgotCWV4dHJkLHUsKj49ICVyNCwxMCw1LCVyNgotCWV4dHJkLHUsKmV2ICVyNCwxMCw1LCVyNgotCi0JZXh0cmQscywqICVyNCwxMCw1LCVyNgotCWV4dHJkLHMsKj0gJXI0LDEwLDUsJXI2Ci0JZXh0cmQscywqPCAlcjQsMTAsNSwlcjYKLQlleHRyZCxzLCpvZCAlcjQsMTAsNSwlcjYKLQlleHRyZCwqdHIgJXI0LDEwLDUsJXI2Ci0JZXh0cmQsKjw+ICVyNCwxMCw1LCVyNgotCWV4dHJkLCo+PSAlcjQsMTAsNSwlcjYKLQlleHRyZCwqZXYgJXI0LDEwLDUsJXI2Ci0KLQlleHRyZCx1LCogJXI0LCVzYXIsNSwlcjYKLQlleHRyZCx1LCo9ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQsdSwqPCAlcjQsJXNhciw1LCVyNgotCWV4dHJkLHUsKm9kICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQsdSwqdHIgJXI0LCVzYXIsNSwlcjYKLQlleHRyZCx1LCo8PiAlcjQsJXNhciw1LCVyNgotCWV4dHJkLHUsKj49ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQsdSwqZXYgJXI0LCVzYXIsNSwlcjYKLQkKLQlleHRyZCxzLCogJXI0LCVzYXIsNSwlcjYKLQlleHRyZCxzLCo9ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQscywqPCAlcjQsJXNhciw1LCVyNgotCWV4dHJkLHMsKm9kICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQsKnRyICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQsKjw+ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQsKj49ICVyNCwlc2FyLDUsJXI2Ci0JZXh0cmQsKmV2ICVyNCwlc2FyLDUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZtZW0ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTAyYmU3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbS5zCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlmbGR3eCAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGR3eCxzICVyNCglc3IwLCVyNSksJWZyNgotCWZsZHd4LG0gJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkd3gsc20gJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHggJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHgscyAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGRkeCxtICVyNCglc3IwLCVyNSksJWZyNgotCWZsZGR4LHNtICVyNCglc3IwLCVyNSksJWZyNgotCWZzdHd4ICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdHd4LHMgJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0d3gsbSAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3R3eCxzbSAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RkeCAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RkeCxzICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdGR4LG0gJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0ZHgsc20gJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0cXggJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0cXgscyAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RxeCxtICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdHF4LHNtICVmcjYsJXI0KCVzcjAsJXI1KQotCi0JZmxkd3MgMCglc3IwLCVyNSksJWZyNgotCWZsZHdzLG1iIDAoJXNyMCwlcjUpLCVmcjYKLQlmbGR3cyxtYSAwKCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHMgMCglc3IwLCVyNSksJWZyNgotCWZsZGRzLG1iIDAoJXNyMCwlcjUpLCVmcjYKLQlmbGRkcyxtYSAwKCVzcjAsJXI1KSwlZnI2Ci0JZnN0d3MgJWZyNiwwKCVzcjAsJXI1KQotCWZzdHdzLG1iICVmcjYsMCglc3IwLCVyNSkKLQlmc3R3cyxtYSAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0ZHMgJWZyNiwwKCVzcjAsJXI1KQotCWZzdGRzLG1iICVmcjYsMCglc3IwLCVyNSkKLQlmc3RkcyxtYSAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0cXMgJWZyNiwwKCVzcjAsJXI1KQotCWZzdHFzLG1iICVmcjYsMCglc3IwLCVyNSkKLQlmc3RxcyxtYSAlZnI2LDAoJXNyMCwlcjUpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZtZW1MUmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtTFJidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzMzBiYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZtZW1MUmJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotCS5jb2RlCi0JLmV4cG9ydAkJZgotZgotCS5wcm9jCi0JLmNhbGxpbmZvCWZyYW1lPTAsbm9fY2FsbHMKLQkuZW50cnkKLQotCWZzdHdzCQklZnI2UiwwKCVyMjYpCi0JZnN0d3MJCSVmcjZMLDQoJXIyNikKLQlmc3R3cwkJJWZyNiw4KCVyMjYpCi0KLQlmc3RkcwkJJWZyNlIsMCglcjI2KQotCWZzdGRzCQklZnI2TCw0KCVyMjYpCi0JZnN0ZHMJCSVmcjYsOCglcjI2KQotCi0JZmxkd3MJCTAoJXIyNiksJWZyNlIKLQlmbGR3cwkJNCglcjI2KSwlZnI2TAotCWZsZHdzCQk4KCVyMjYpLCVmcjYKLQotCWZsZGRzCQkwKCVyMjYpLCVmcjZSCi0JZmxkZHMJCTQoJXIyNiksJWZyNkwKLQlmbGRkcwkJOCglcjI2KSwlZnI2Ci0KLQlmc3R3cwkJJWZyNlIsMCglc3IwLCVyMjYpCi0JZnN0d3MJCSVmcjZMLDQoJXNyMCwlcjI2KQotCWZzdHdzCQklZnI2LDgoJXNyMCwlcjI2KQotCi0JZnN0ZHMJCSVmcjZSLDAoJXNyMCwlcjI2KQotCWZzdGRzCQklZnI2TCw0KCVzcjAsJXIyNikKLQlmc3RkcwkJJWZyNiw4KCVzcjAsJXIyNikKLQotCWZsZHdzCQkwKCVzcjAsJXIyNiksJWZyNlIKLQlmbGR3cwkJNCglc3IwLCVyMjYpLCVmcjZMCi0JZmxkd3MJCTgoJXNyMCwlcjI2KSwlZnI2Ci0KLQlmbGRkcwkJMCglc3IwLCVyMjYpLCVmcjZSCi0JZmxkZHMJCTQoJXNyMCwlcjI2KSwlZnI2TAotCWZsZGRzCQk4KCVzcjAsJXIyNiksJWZyNgotCi0JZnN0d3gJCSVmcjZSLCVyMjUoJXIyNikKLQlmc3R3eAkJJWZyNkwsJXIyNSglcjI2KQotCWZzdHd4CQklZnI2LCVyMjUoJXIyNikKLQotCWZzdGR4CQklZnI2UiwlcjI1KCVyMjYpCi0JZnN0ZHgJCSVmcjZMLCVyMjUoJXIyNikKLQlmc3RkeAkJJWZyNiwlcjI1KCVyMjYpCi0KLQlmbGR3eAkJJXIyNSglcjI2KSwlZnI2UgotCWZsZHd4CQklcjI1KCVyMjYpLCVmcjZMCi0JZmxkd3gJCSVyMjUoJXIyNiksJWZyNgotCi0JZmxkZHgJCSVyMjUoJXIyNiksJWZyNlIKLQlmbGRkeAkJJXIyNSglcjI2KSwlZnI2TAotCWZsZGR4CQklcjI1KCVyMjYpLCVmcjYKLQotCWZzdHd4CQklZnI2UiwlcjI1KCVzcjAsJXIyNikKLQlmc3R3eAkJJWZyNkwsJXIyNSglc3IwLCVyMjYpCi0JZnN0d3gJCSVmcjYsJXIyNSglc3IwLCVyMjYpCi0KLQlmc3RkeAkJJWZyNlIsJXIyNSglc3IwLCVyMjYpCi0JZnN0ZHgJCSVmcjZMLCVyMjUoJXNyMCwlcjI2KQotCWZzdGR4CQklZnI2LCVyMjUoJXNyMCwlcjI2KQotCi0JZmxkd3gJCSVyMjUoJXNyMCwlcjI2KSwlZnI2UgotCWZsZHd4CQklcjI1KCVzcjAsJXIyNiksJWZyNkwKLQlmbGR3eAkJJXIyNSglc3IwLCVyMjYpLCVmcjYKLQotCWZsZGR4CQklcjI1KCVzcjAsJXIyNiksJWZyNlIKLQlmbGRkeAkJJXIyNSglc3IwLCVyMjYpLCVmcjZMCi0JZmxkZHgJCSVyMjUoJXNyMCwlcjI2KSwlZnI2Ci0KLQlidgkJJXIwKCVyMikKLQlub3AKLQotCS5leGl0Ci0JLnByb2NlbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfY29tcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OGUyZDYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWZjcHksc2dsICVmcjUsJWZyMTAKLQlmY3B5LGRibCAlZnI1LCVmcjEwCi0JZmNweSxxdWFkICVmcjUsJWZyMTAKLQlmY3B5LHNnbCAlZnIyMCwlZnIyNAotCWZjcHksZGJsICVmcjIwLCVmcjI0Ci0KLQlmYWJzLHNnbCAlZnI1LCVmcjEwCi0JZmFicyxkYmwgJWZyNSwlZnIxMAotCWZhYnMscXVhZCAlZnI1LCVmcjEwCi0JZmFicyxzZ2wgJWZyMjAsJWZyMjQKLQlmYWJzLGRibCAlZnIyMCwlZnIyNAotCi0JZnNxcnQsc2dsICVmcjUsJWZyMTAKLQlmc3FydCxkYmwgJWZyNSwlZnIxMAotCWZzcXJ0LHF1YWQgJWZyNSwlZnIxMAotCWZzcXJ0LHNnbCAlZnIyMCwlZnIyNAotCWZzcXJ0LGRibCAlZnIyMCwlZnIyNAotCi0JZnJuZCxzZ2wgJWZyNSwlZnIxMAotCWZybmQsZGJsICVmcjUsJWZyMTAKLQlmcm5kLHF1YWQgJWZyNSwlZnIxMAotCWZybmQsc2dsICVmcjIwLCVmcjI0Ci0JZnJuZCxkYmwgJWZyMjAsJWZyMjQKLQkKLQlmYWRkLHNnbCAlZnI0LCVmcjgsJWZyMTIKLQlmYWRkLGRibCAlZnI0LCVmcjgsJWZyMTIKLQlmYWRkLHF1YWQgJWZyNCwlZnI4LCVmcjEyCi0JZmFkZCxzZ2wgJWZyMjAsJWZyMjQsJWZyMjgKLQlmYWRkLGRibCAlZnIyMCwlZnIyNCwlZnIyOAotCWZhZGQscXVhZCAlZnIyMCwlZnIyNCwlZnIyOAotCi0JZnN1YixzZ2wgJWZyNCwlZnI4LCVmcjEyCi0JZnN1YixkYmwgJWZyNCwlZnI4LCVmcjEyCi0JZnN1YixxdWFkICVmcjQsJWZyOCwlZnIxMgotCWZzdWIsc2dsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZnN1YixkYmwgJWZyMjAsJWZyMjQsJWZyMjgKLQlmc3ViLHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKLQotCWZtcHksc2dsICVmcjQsJWZyOCwlZnIxMgotCWZtcHksZGJsICVmcjQsJWZyOCwlZnIxMgotCWZtcHkscXVhZCAlZnI0LCVmcjgsJWZyMTIKLQlmbXB5LHNnbCAlZnIyMCwlZnIyNCwlZnIyOAotCWZtcHksZGJsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZm1weSxxdWFkICVmcjIwLCVmcjI0LCVmcjI4Ci0KLQlmZGl2LHNnbCAlZnI0LCVmcjgsJWZyMTIKLQlmZGl2LGRibCAlZnI0LCVmcjgsJWZyMTIKLQlmZGl2LHF1YWQgJWZyNCwlZnI4LCVmcjEyCi0JZmRpdixzZ2wgJWZyMjAsJWZyMjQsJWZyMjgKLQlmZGl2LGRibCAlZnIyMCwlZnIyNCwlZnIyOAotCWZkaXYscXVhZCAlZnIyMCwlZnIyNCwlZnIyOAotCi0JZnJlbSxzZ2wgJWZyNCwlZnI4LCVmcjEyCi0JZnJlbSxkYmwgJWZyNCwlZnI4LCVmcjEyCi0JZnJlbSxxdWFkICVmcjQsJWZyOCwlZnIxMgotCWZyZW0sc2dsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZnJlbSxkYmwgJWZyMjAsJWZyMjQsJWZyMjgKLQlmcmVtLHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKLQotCWZtcHlhZGQsc2dsICVmcjE2LCVmcjE3LCVmcjE4LCVmcjE5LCVmcjIwCi0JZm1weWFkZCxkYmwgJWZyMTYsJWZyMTcsJWZyMTgsJWZyMTksJWZyMjAKLQlmbXB5c3ViLHNnbCAlZnIxNiwlZnIxNywlZnIxOCwlZnIxOSwlZnIyMAotCWZtcHlzdWIsZGJsICVmcjE2LCVmcjE3LCVmcjE4LCVmcjE5LCVmcjIwCi0KLQl4bXB5dSAlZnI0LCVmcjUsJWZyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTUwMmI4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfY29tcDIucworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWZtcHlmYWRkLHNnbCAlZnI1UiwlZnIxMEwsJWZyMTNSLCVmcjE0TAotCWZtcHlmYWRkLGRibCAlZnI1LCVmcjEwLCVmcjEzLCVmcjE0Ci0JZm1weWZhZGQsc2dsICVmcjE4UiwlZnIyN0wsJWZyNlIsJWZyMjFMCi0JZm1weWZhZGQsZGJsICVmcjE4LCVmcjI3LCVmcjYsJWZyMjEKLQotCWZtcHluZmFkZCxzZ2wgJWZyNVIsJWZyMTBMLCVmcjEzUiwlZnIxNEwKLQlmbXB5bmZhZGQsZGJsICVmcjUsJWZyMTAsJWZyMTMsJWZyMTQKLQlmbXB5bmZhZGQsc2dsICVmcjE4UiwlZnIyN0wsJWZyNlIsJWZyMjFMCi0JZm1weW5mYWRkLGRibCAlZnIxOCwlZnIyNywlZnI2LCVmcjIxCi0KLQlmbmVnLHNnbCAlZnI1LCVmcjEwUgotCWZuZWcsZGJsICVmcjUsJWZyMTAKLQlmbmVnLHF1YWQgJWZyNSwlZnIxMAotCWZuZWcsc2dsICVmcjIwUiwlZnIyNEwKLQlmbmVnLGRibCAlZnIyMCwlZnIyNAotCi0JZm5lZ2FicyxzZ2wgJWZyNSwlZnIxMFIKLQlmbmVnYWJzLGRibCAlZnI1LCVmcjEwCi0JZm5lZ2FicyxxdWFkICVmcjUsJWZyMTAKLQlmbmVnYWJzLHNnbCAlZnIyMFIsJWZyMjRMCi0JZm5lZ2FicyxkYmwgJWZyMjAsJWZyMjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb252LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbnYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlOGExZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbnYucworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZmNudmZmLHNnbCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmZixzZ2wsZGJsICVmcjUsJWZyMTAKLQlmY252ZmYsc2dsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmZixkYmwsc2dsICVmcjUsJWZyMTAKLQlmY252ZmYsZGJsLGRibCAlZnI1LCVmcjEwCi0JZmNudmZmLGRibCxxdWFkICVmcjUsJWZyMTAKLQlmY252ZmYscXVhZCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmZixxdWFkLGRibCAlZnI1LCVmcjEwCi0JZmNudmZmLHF1YWQscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZmLHNnbCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252ZmYsc2dsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmZixzZ2wscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmZixkYmwsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZmLGRibCxkYmwgJWZyMjAsJWZyMjQKLQlmY252ZmYsZGJsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252ZmYscXVhZCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252ZmYscXVhZCxkYmwgJWZyMjAsJWZyMjQKLQlmY252ZmYscXVhZCxxdWFkICVmcjIwLCVmcjI0Ci0KLQlmY252eGYsc2dsLHNnbCAlZnI1LCVmcjEwCi0JZmNudnhmLHNnbCxkYmwgJWZyNSwlZnIxMAotCWZjbnZ4ZixzZ2wscXVhZCAlZnI1LCVmcjEwCi0JZmNudnhmLGRibCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZ4ZixkYmwsZGJsICVmcjUsJWZyMTAKLQlmY252eGYsZGJsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZ4ZixxdWFkLHNnbCAlZnI1LCVmcjEwCi0JZmNudnhmLHF1YWQsZGJsICVmcjUsJWZyMTAKLQlmY252eGYscXVhZCxxdWFkICVmcjUsJWZyMTAKLQlmY252eGYsc2dsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZ4ZixzZ2wsZGJsICVmcjIwLCVmcjI0Ci0JZmNudnhmLHNnbCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudnhmLGRibCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252eGYsZGJsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZ4ZixkYmwscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZ4ZixxdWFkLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZ4ZixxdWFkLGRibCAlZnIyMCwlZnIyNAotCWZjbnZ4ZixxdWFkLHF1YWQgJWZyMjAsJWZyMjQKLQotCWZjbnZmeCxzZ2wsc2dsICVmcjUsJWZyMTAKLQlmY252Zngsc2dsLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4LHNnbCxxdWFkICVmcjUsJWZyMTAKLQlmY252ZngsZGJsLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZ4LGRibCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmeCxkYmwscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZ4LHF1YWQsc2dsICVmcjUsJWZyMTAKLQlmY252ZngscXVhZCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmeCxxdWFkLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmeCxzZ2wsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZ4LHNnbCxkYmwgJWZyMjAsJWZyMjQKLQlmY252Zngsc2dsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252ZngsZGJsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmeCxkYmwsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZ4LGRibCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudmZ4LHF1YWQsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZ4LHF1YWQsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZ4LHF1YWQscXVhZCAlZnIyMCwlZnIyNAotCi0JZmNudmZ4dCxzZ2wsc2dsICVmcjUsJWZyMTAKLQlmY252Znh0LHNnbCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmeHQsc2dsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmeHQsZGJsLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxkYmwsZGJsICVmcjUsJWZyMTAKLQlmY252Znh0LGRibCxxdWFkICVmcjUsJWZyMTAKLQlmY252Znh0LHF1YWQsc2dsICVmcjUsJWZyMTAKLQlmY252Znh0LHF1YWQsZGJsICVmcjUsJWZyMTAKLQlmY252Znh0LHF1YWQscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxzZ2wsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxzZ2wsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxzZ2wscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmeHQsZGJsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmeHQsZGJsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmeHQsZGJsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252Znh0LHF1YWQsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxxdWFkLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmeHQscXVhZCxxdWFkICVmcjIwLCVmcjI0Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfZmNtcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9mY21wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MzE0OWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9mY21wLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlmY21wLHNnbCxmYWxzZT8gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsZmFsc2UgJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPyAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPD0+ICVmcjQsJWZyNQotCWZjbXAsc2dsLD0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPVQgJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPz0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsITw+ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE/Pj0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPCAlZnI0LCVmcjUKLQlmY21wLHNnbCw/PCAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPj0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT8+ICVmcjQsJWZyNQotCWZjbXAsc2dsLDw9ICVmcjQsJWZyNQotCWZjbXAsc2dsLD88PSAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPiAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPzw9ICVmcjQsJWZyNQotCWZjbXAsc2dsLD4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPz4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsITw9ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE/PCAlZnI0LCVmcjUKLQlmY21wLHNnbCw+PSAlZnI0LCVmcjUKLQlmY21wLHNnbCw/Pj0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsITwgJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT89ICVmcjQsJWZyNQotCWZjbXAsc2dsLDw+ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE9ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE9VCAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPyAlZnI0LCVmcjUKLQlmY21wLHNnbCw8PT4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsdHJ1ZT8gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsdHJ1ZSAlZnI0LCVmcjUKLQotCWZjbXAsZGJsLGZhbHNlPyAlZnI0LCVmcjUKLQlmY21wLGRibCxmYWxzZSAlZnI0LCVmcjUKLQlmY21wLGRibCw/ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE8PT4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPSAlZnI0LCVmcjUKLQlmY21wLGRibCw9VCAlZnI0LCVmcjUKLQlmY21wLGRibCw/PSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPD4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT8+PSAlZnI0LCVmcjUKLQlmY21wLGRibCw8ICVmcjQsJWZyNQotCWZjbXAsZGJsLD88ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE+PSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPz4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPD0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPzw9ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE+ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE/PD0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPiAlZnI0LCVmcjUKLQlmY21wLGRibCw/PiAlZnI0LCVmcjUKLQlmY21wLGRibCwhPD0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT88ICVmcjQsJWZyNQotCWZjbXAsZGJsLD49ICVmcjQsJWZyNQotCWZjbXAsZGJsLD8+PSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPCAlZnI0LCVmcjUKLQlmY21wLGRibCwhPz0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPD4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT1UICVmcjQsJWZyNQotCWZjbXAsZGJsLCE/ICVmcjQsJWZyNQotCWZjbXAsZGJsLDw9PiAlZnI0LCVmcjUKLQlmY21wLGRibCx0cnVlPyAlZnI0LCVmcjUKLQlmY21wLGRibCx0cnVlICVmcjQsJWZyNQotCi0JZmNtcCxxdWFkLGZhbHNlPyAlZnI0LCVmcjUKLQlmY21wLHF1YWQsZmFsc2UgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD8gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE8PT4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD1UICVmcjQsJWZyNQotCWZjbXAscXVhZCw/PSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsITw+ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPz49ICVmcjQsJWZyNQotCWZjbXAscXVhZCw8ICVmcjQsJWZyNQotCWZjbXAscXVhZCw/PCAlZnI0LCVmcjUKLQlmY21wLHF1YWQsIT49ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPz4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLDw9ICVmcjQsJWZyNQotCWZjbXAscXVhZCw/PD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE+ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPzw9ICVmcjQsJWZyNQotCWZjbXAscXVhZCw+ICVmcjQsJWZyNQotCWZjbXAscXVhZCw/PiAlZnI0LCVmcjUKLQlmY21wLHF1YWQsITw9ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPzwgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD49ICVmcjQsJWZyNQotCWZjbXAscXVhZCw/Pj0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE8ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPz0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLDw+ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsIT1UICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPyAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPD0+ICVmcjQsJWZyNQotCWZjbXAscXVhZCx0cnVlPyAlZnI0LCVmcjUKLQlmY21wLHF1YWQsdHJ1ZSAlZnI0LCVmcjUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfbWlzYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9taXNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMjQ5MzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9taXNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi1mcHVfbWlzY190ZXN0czogCi0JZnRlc3QKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvaW1lbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbWVtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OGIwODAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbWVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotCS5FWFBPUlQgaW50ZWdlcl9tZW1vcnlfdGVzdHMsQ09ERQotCS5FWFBPUlQgaW50ZWdlcl9pbmRleGluZ19sb2FkLENPREUKLQkuRVhQT1JUIGludGVnZXJfbG9hZF9zaG9ydF9tZW1vcnksQ09ERQotCS5FWFBPUlQgaW50ZWdlcl9zdG9yZV9zaG9ydF9tZW1vcnksQ09ERQotCS5FWFBPUlQgbWFpbixDT0RFCi0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi07IEJhc2ljIGludGVnZXIgbWVtb3J5IHRlc3RzIHdoaWNoIGFsc28gdGVzdCB0aGUgdmFyaW91cyAKLTsgYWRkcmVzc2luZyBtb2RlcyBhbmQgY29tcGxldGVycy4KLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotOyAKLWludGVnZXJfbWVtb3J5X3Rlc3RzOiAKLQlsZHcgMCglc3IwLCVyNCksJXIyNgotCWxkaCAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRiIDAoJXNyMCwlcjQpLCVyMjYKLQlzdHcgJXIyNiwwKCVzcjAsJXI0KQotCXN0aCAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RiICVyMjYsMCglc3IwLCVyNCkKLQotOyBTaG91bGQgbWFrZSBzdXJlIHByZS9wb3N0IG1vZGVzIGFyZSByZWNvZ25pemVkIGNvcnJlY3RseS4KLQlsZHdtIDAoJXNyMCwlcjQpLCVyMjYKLQlzdHdtICVyMjYsMCglc3IwLCVyNCkKLQotaW50ZWdlcl9pbmRleGluZ19sb2FkOiAKLQlsZHd4ICVyNSglc3IwLCVyNCksJXIyNgotCWxkd3gscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZHd4LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGR3eCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGh4ICVyNSglc3IwLCVyNCksJXIyNgotCWxkaHgscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGh4LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRoeCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGJ4ICVyNSglc3IwLCVyNCksJXIyNgotCWxkYngscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGJ4LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRieCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZHdheCAlcjUoJXI0KSwlcjI2Ci0JbGR3YXgscyAlcjUoJXI0KSwlcjI2Ci0JbGR3YXgsbSAlcjUoJXI0KSwlcjI2Ci0JbGR3YXgsc20gJXI1KCVyNCksJXIyNgotCWxkY3d4ICVyNSglc3IwLCVyNCksJXIyNgotCWxkY3d4LHMgJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRjd3gsbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGN3eCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQotaW50ZWdlcl9sb2FkX3Nob3J0X21lbW9yeTogCi0JbGR3cyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGR3cyxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JbGR3cyxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRocyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRocyxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRocyxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRicyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRicyxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRicyxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JbGR3YXMgMCglcjQpLCVyMjYKLQlsZHdhcyxtYiAwKCVyNCksJXIyNgotCWxkd2FzLG1hIDAoJXI0KSwlcjI2Ci0JbGRjd3MgMCglc3IwLCVyNCksJXIyNgotCWxkY3dzLG1iIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGN3cyxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0KLWludGVnZXJfc3RvcmVfc2hvcnRfbWVtb3J5OiAKLQlzdHdzICVyMjYsMCglc3IwLCVyNCkKLQlzdHdzLG1iICVyMjYsMCglc3IwLCVyNCkKLQlzdHdzLG1hICVyMjYsMCglc3IwLCVyNCkKLQlzdGhzICVyMjYsMCglc3IwLCVyNCkKLQlzdGhzLG1iICVyMjYsMCglc3IwLCVyNCkKLQlzdGhzLG1hICVyMjYsMCglc3IwLCVyNCkKLQlzdGJzICVyMjYsMCglc3IwLCVyNCkKLQlzdGJzLG1iICVyMjYsMCglc3IwLCVyNCkKLQlzdGJzLG1hICVyMjYsMCglc3IwLCVyNCkKLQlzdHdhcyAlcjI2LDAoJXI0KQotCXN0d2FzLG1iICVyMjYsMCglcjQpCi0Jc3R3YXMsbWEgJXIyNiwwKCVyNCkKLQlzdGJ5cyAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RieXMsYiAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RieXMsZSAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RieXMsYixtICVyMjYsMCglc3IwLCVyNCkKLQlzdGJ5cyxlLG0gJXIyNiwwKCVzcjAsJXI0KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbW1lZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbW1lZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzQwMDEwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvaW1tZWQucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi1pbW1lZGlhdGVfdGVzdHM6IAotCWxkbyA1KCVyMjYpLCVyMjYKLQlsZGlsIEwlMHhkZWFkYmVlZiwlcjI2Ci0JYWRkaWwgTCUweGRlYWRiZWVmLCVyNQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2xvZ2ljYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvbG9naWNhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzYyYzUyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvbG9naWNhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlvciAlcjQsJXI1LCVyNgotCW9yLD0gJXI0LCVyNSwlcjYKLQlvciw8ICVyNCwlcjUsJXI2Ci0Jb3IsPD0gJXI0LCVyNSwlcjYKLQlvcixvZCAlcjQsJXI1LCVyNgotCW9yLHRyICVyNCwlcjUsJXI2Ci0Jb3IsPD4gJXI0LCVyNSwlcjYKLQlvciw+PSAlcjQsJXI1LCVyNgotCW9yLD4gJXI0LCVyNSwlcjYKLQlvcixldiAlcjQsJXI1LCVyNgotCi0JeG9yICVyNCwlcjUsJXI2Ci0JeG9yLD0gJXI0LCVyNSwlcjYKLQl4b3IsPCAlcjQsJXI1LCVyNgotCXhvciw8PSAlcjQsJXI1LCVyNgotCXhvcixvZCAlcjQsJXI1LCVyNgotCXhvcix0ciAlcjQsJXI1LCVyNgotCXhvciw8PiAlcjQsJXI1LCVyNgotCXhvciw+PSAlcjQsJXI1LCVyNgotCXhvciw+ICVyNCwlcjUsJXI2Ci0JeG9yLGV2ICVyNCwlcjUsJXI2Ci0KLQlhbmQgJXI0LCVyNSwlcjYKLQlhbmQsPSAlcjQsJXI1LCVyNgotCWFuZCw8ICVyNCwlcjUsJXI2Ci0JYW5kLDw9ICVyNCwlcjUsJXI2Ci0JYW5kLG9kICVyNCwlcjUsJXI2Ci0JYW5kLHRyICVyNCwlcjUsJXI2Ci0JYW5kLDw+ICVyNCwlcjUsJXI2Ci0JYW5kLD49ICVyNCwlcjUsJXI2Ci0JYW5kLD4gJXI0LCVyNSwlcjYKLQlhbmQsZXYgJXI0LCVyNSwlcjYKLQotCWFuZGNtICVyNCwlcjUsJXI2Ci0JYW5kY20sPSAlcjQsJXI1LCVyNgotCWFuZGNtLDwgJXI0LCVyNSwlcjYKLQlhbmRjbSw8PSAlcjQsJXI1LCVyNgotCWFuZGNtLG9kICVyNCwlcjUsJXI2Ci0JYW5kY20sdHIgJXI0LCVyNSwlcjYKLQlhbmRjbSw8PiAlcjQsJXI1LCVyNgotCWFuZGNtLD49ICVyNCwlcjUsJXI2Ci0JYW5kY20sPiAlcjQsJXI1LCVyNgotCWFuZGNtLGV2ICVyNCwlcjUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvbWVkaWEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvbWVkaWEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwOTc3ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL21lZGlhLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0JLkxFVkVMIDIuMAotCS5jb2RlCi0JLmFsaWduIDQKLTsgUEEyLjAgbXVsdGltZWRpYSAoaGFsZndvcmQpIGluc3RydWN0aW9uIHRlc3RzCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQotCWhhZGQgJXI3LCVyMTEsJXIxMgotCWhhZGQsc3MgJXI3LCVyMTEsJXIxMgotCWhhZGQsdXMgJXI3LCVyMTEsJXIxMgotCi0JaGF2ZyAlcjcsJXIxMSwlcjEyCi0JaHNobCAlcjcsMTMsJXIxMQotCWhzaGxhZGQgJXI3LDEsJXIxMSwlcjEyCi0JaHNobGFkZCAlcjcsMiwlcjExLCVyMTIKLQloc2hsYWRkICVyNywzLCVyMTEsJXIxMgotCWhzaHIgJXI3LDEzLCVyMTEKLQloc2hyLHMgJXI3LDEzLCVyMTEKLQloc2hyLHUgJXI3LDEzLCVyMTEKLQloc2hyYWRkICVyNywxLCVyMTEsJXIxMgotCWhzaHJhZGQgJXI3LDIsJXIxMSwlcjEyCi0JaHNocmFkZCAlcjcsMywlcjExLCVyMTIKLQotCWhzdWIgJXIxNCwlcjIyLCVyOQotCWhzdWIsc3MgJXIxNCwlcjIyLCVyOQotCWhzdWIsdXMgJXIxNCwlcjIyLCVyOQotCi0JbWl4aCxsICVyMTQsJXIyMiwlcjkKLQltaXhoLHIgJXIxNCwlcjIyLCVyOQotCW1peHcsbCAlcjE0LCVyMjIsJXI5Ci0JbWl4dyxyICVyMTQsJXIyMiwlcjkKLQotCXBlcm1oLDAzMjEgJXIyMiwlcjkKLQlwZXJtaCwyMjIyICVyMjIsJXI5Ci0JcGVybWgsMzAzMCAlcjIyLCVyOQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3BlcmYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvcGVyZi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmQwMmUyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvcGVyZi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IFBBMi4wIHBlcmZvcm1hbmNlIG1vbml0b3IgaW5zdHJ1Y3Rpb24gdGVzdHMKLQotCi0JcG1lbmIKLQlwbWRpcwotCXBtZGlzLG4KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wdXJnZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wdXJnZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2MyZWQ3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvcHVyZ2UucworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JcGR0bGIgJXI0KCVzcjAsJXI1KQotCXBkdGxiLG0gJXI0KCVzcjAsJXI1KQotCXBpdGxiICVyNCglc3I0LCVyNSkKLQlwaXRsYixtICVyNCglc3I0LCVyNSkKLQlwZHRsYmUgJXI0KCVzcjAsJXI1KQotCXBkdGxiZSxtICVyNCglc3IwLCVyNSkKLQlwaXRsYmUgJXI0KCVzcjQsJXI1KQotCXBpdGxiZSxtICVyNCglc3I0LCVyNSkKLQlwZGMgJXI0KCVzcjAsJXI1KQotCXBkYyxtICVyNCglc3IwLCVyNSkKLQlmZGMgJXI0KCVzcjAsJXI1KQotCWZkYyxtICVyNCglc3IwLCVyNSkKLQlmaWMgJXI0KCVzcjQsJXI1KQotCWZpYyxtICVyNCglc3I0LCVyNSkKLQlmZGNlICVyNCglc3IwLCVyNSkKLQlmZGNlLG0gJXI0KCVzcjAsJXI1KQotCWZpY2UgJXI0KCVzcjQsJXI1KQotCWZpY2UsbSAlcjQoJXNyNCwlcjUpCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvcHVyZ2UyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3B1cmdlMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2UyODg1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvcHVyZ2UyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLmxldmVsIDIuMAotCS5jb2RlCi0JLmFsaWduIDQKLTsgUEEyLjAgcHVyZ2UgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXBkdGxiLGwgJXI0KCVzcjAsJXI1KQotCXBkdGxiLGwsbSAlcjQoJXNyMCwlcjUpCi0JcGl0bGIsbCAlcjQoJXNyNCwlcjUpCi0JcGl0bGIsbCxtICVyNCglc3I0LCVyNSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gxYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMWFkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzU5ZDFjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gxYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXNoMWFkZCAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsPSAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsPCAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsPD0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLG51diAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsem52ICAlcjQsJXI1LCVyNgotCXNoMWFkZCxzdiAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsb2QgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLHRyICAlcjQsJXI1LCVyNgotCXNoMWFkZCw8PiAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsPj0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLD4gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLHV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZCx2bnogICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsZXYgICVyNCwlcjUsJXI2Ci0KLQlzaDFhZGRsICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsPSAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLDwgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCw8PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLG51diAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLHpudiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLHN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsb2QgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCx0ciAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLDw+ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsPj0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCw+ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsdXYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCx2bnogICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCxldiAgJXI0LCVyNSwlcjYKLQotCXNoMWFkZG8gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sPCAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLDw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sbnV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sem52ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sc3YgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyxvZCAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLHRyICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sPD4gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyw+PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLD4gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyx1diAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLHZueiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLGV2ICAlcjQsJXI1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMmFkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDJhZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwYzhkOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMmFkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlzaDJhZGQgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLD0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLDwgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLDw9ICAlcjQsJXI1LCVyNgotCXNoMmFkZCxudXYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLHpudiAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLG9kICAlcjQsJXI1LCVyNgotCXNoMmFkZCx0ciAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPD4gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLD49ICAlcjQsJXI1LCVyNgotCXNoMmFkZCw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZCx1diAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsdm56ICAlcjQsJXI1LCVyNgotCXNoMmFkZCxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLGV2ICAlcjQsJXI1LCVyNgotCi0Jc2gyYWRkbCAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLD0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCw8ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsPD0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCxudXYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCxzdiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLG9kICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsdHIgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCw8PiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLD49ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsPiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLHV2ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsdm56ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsbnN2ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsZXYgICVyNCwlcjUsJXI2Ci0KLQlzaDJhZGRvICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sPSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLDwgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyw8PSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLG51diAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLHpudiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLHN2ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sb2QgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyx0ciAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLDw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sPj0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sdXYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyx2bnogICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyxldiAgJXI0LCVyNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDNhZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gzYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMGM5NzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDNhZGQucworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc2gzYWRkICAlcjQsJXI1LCVyNgotCXNoM2FkZCw9ICAlcjQsJXI1LCVyNgotCXNoM2FkZCw8ICAlcjQsJXI1LCVyNgotCXNoM2FkZCw8PSAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsbnV2ICAlcjQsJXI1LCVyNgotCXNoM2FkZCx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLHN2ICAlcjQsJXI1LCVyNgotCXNoM2FkZCxvZCAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsdHIgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLDw+ICAlcjQsJXI1LCVyNgotCXNoM2FkZCw+PSAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsPiAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsdXYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLHZueiAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsbnN2ICAlcjQsJXI1LCVyNgotCXNoM2FkZCxldiAgJXI0LCVyNSwlcjYKLQotCXNoM2FkZGwgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCw9ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsPCAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLDw9ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsbnV2ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsem52ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsc3YgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCxvZCAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLHRyICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsPD4gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCw+PSAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLD4gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCx1diAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLHZueiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLGV2ICAlcjQsJXI1LCVyNgotCi0Jc2gzYWRkbyAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLD0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyw8ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sPD0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyxudXYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyxzdiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLG9kICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sdHIgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyw8PiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLD49ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sPiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLHV2ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sdm56ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sbnN2ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sZXYgICVyNCwlcjUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hpZnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hpZnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzOGMxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXZzaGQgJXI0LCVyNSwlcjYKLQl2c2hkLD0gJXI0LCVyNSwlcjYKLQl2c2hkLDwgJXI0LCVyNSwlcjYKLQl2c2hkLG9kICVyNCwlcjUsJXI2Ci0JdnNoZCx0ciAlcjQsJXI1LCVyNgotCXZzaGQsPD4gJXI0LCVyNSwlcjYKLQl2c2hkLD49ICVyNCwlcjUsJXI2Ci0JdnNoZCxldiAlcjQsJXI1LCVyNgotCi0Jc2hkICVyNCwlcjUsNSwlcjYKLQlzaGQsPSAlcjQsJXI1LDUsJXI2Ci0Jc2hkLDwgJXI0LCVyNSw1LCVyNgotCXNoZCxvZCAlcjQsJXI1LDUsJXI2Ci0Jc2hkLHRyICVyNCwlcjUsNSwlcjYKLQlzaGQsPD4gJXI0LCVyNSw1LCVyNgotCXNoZCw+PSAlcjQsJXI1LDUsJXI2Ci0Jc2hkLGV2ICVyNCwlcjUsNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hpZnQyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYmVlM2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdDIucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IFBBIDIuMCBmb3JtYXQgc2hpZnQgcmlnaHQgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXNocnB3ICVyNCwlcjUsJXNhciwlcjYKLQlzaHJwdyw9ICVyNCwlcjUsJXNhciwlcjYKLQlzaHJwdyw8ICVyNCwlcjUsJXNhciwlcjYKLQlzaHJwdyxvZCAlcjQsJXI1LCVzYXIsJXI2Ci0Jc2hycHcsdHIgJXI0LCVyNSwlY3IxMSwlcjYKLQlzaHJwdyw8PiAlcjQsJXI1LCVjcjExLCVyNgotCXNocnB3LD49ICVyNCwlcjUsJWNyMTEsJXI2Ci0Jc2hycHcsZXYgJXI0LCVyNSwlY3IxMSwlcjYKLQotCXNocnB3ICVyNCwlcjUsNSwlcjYKLQlzaHJwdyw9ICVyNCwlcjUsNSwlcjYKLQlzaHJwdyw8ICVyNCwlcjUsNSwlcjYKLQlzaHJwdyxvZCAlcjQsJXI1LDUsJXI2Ci0Jc2hycHcsdHIgJXI0LCVyNSw1LCVyNgotCXNocnB3LDw+ICVyNCwlcjUsNSwlcjYKLQlzaHJwdyw+PSAlcjQsJXI1LDUsJXI2Ci0Jc2hycHcsZXYgJXI0LCVyNSw1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdDMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hpZnQzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMDAwMzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdDMucworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBQQSAyLjAgc2hpZnQgcmlnaHQgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXNocnBkLCogJXI0LCVyNSwlc2FyLCVyNgotCXNocnBkLCo9ICVyNCwlcjUsJXNhciwlcjYKLQlzaHJwZCwqPCAlcjQsJXI1LCVzYXIsJXI2Ci0Jc2hycGQsKm9kICVyNCwlcjUsJXNhciwlcjYKLQlzaHJwZCwqdHIgJXI0LCVyNSwlY3IxMSwlcjYKLQlzaHJwZCwqPD4gJXI0LCVyNSwlY3IxMSwlcjYKLQlzaHJwZCwqPj0gJXI0LCVyNSwlY3IxMSwlcjYKLQlzaHJwZCwqZXYgJXI0LCVyNSwlY3IxMSwlcjYKLQotCXNocnBkLCogJXI0LCVyNSw1LCVyNgotCXNocnBkLCo9ICVyNCwlcjUsNSwlcjYKLQlzaHJwZCwqPCAlcjQsJXI1LDUsJXI2Ci0Jc2hycGQsKm9kICVyNCwlcjUsNSwlcjYKLQlzaHJwZCwqdHIgJXI0LCVyNSw1LCVyNgotCXNocnBkLCo8PiAlcjQsJXI1LDUsJXI2Ci0Jc2hycGQsKj49ICVyNCwlcjUsNSwlcjYKLQlzaHJwZCwqZXYgJXI0LCVyNSw1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NobGFkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGxhZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYwODQ3OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NobGFkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIHNobGFkZCBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc2hsYWRkICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLD0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsPCAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCw8PSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxudXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsem52ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLG9kICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRyICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLDw+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLD49ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLD4gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdm56ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLG5zdiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxldiAgJXI0LDEsJXI1LCVyNgotCi0Jc2hsYWRkLGwgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCw9ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsPCAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLDw9ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsbnV2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsem52ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCxvZCAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLHRyICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsPD4gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCw+PSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLD4gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCx1diAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLHZueiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLG5zdiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLGV2ICAlcjQsMSwlcjUsJXI2Ci0KLQlzaGxhZGQsdHN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw9ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw8ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw8PSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsbnV2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdix6bnYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LHN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdixvZCAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsdHIgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDw+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw+PSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsPiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsdXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LHZueiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsbnN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdixldiAgJXI0LDEsJXI1LCVyNgotCi0Jc2hsYWRkICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLD0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsPCAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCw8PSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxudXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsem52ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLG9kICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRyICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLDw+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLD49ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLD4gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdm56ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLG5zdiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxldiAgJXI0LDIsJXI1LCVyNgotCi0Jc2hsYWRkLGwgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCw9ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsPCAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLDw9ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsbnV2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsem52ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCxvZCAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLHRyICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsPD4gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCw+PSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLD4gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCx1diAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLHZueiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLG5zdiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLGV2ICAlcjQsMiwlcjUsJXI2Ci0KLQlzaGxhZGQsdHN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw9ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw8ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw8PSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsbnV2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdix6bnYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LHN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdixvZCAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsdHIgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDw+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw+PSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsPiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsdXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LHZueiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsbnN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdixldiAgJXI0LDIsJXI1LCVyNgotCi0Jc2hsYWRkICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLD0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsPCAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCw8PSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxudXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsem52ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLG9kICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRyICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLDw+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLD49ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLD4gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdm56ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLG5zdiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxldiAgJXI0LDMsJXI1LCVyNgotCi0Jc2hsYWRkLGwgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCw9ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsPCAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLDw9ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsbnV2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsem52ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCxvZCAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLHRyICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsPD4gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCw+PSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLD4gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCx1diAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLHZueiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLG5zdiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLGV2ICAlcjQsMywlcjUsJXI2Ci0KLQlzaGxhZGQsdHN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw9ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw8ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw8PSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsbnV2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdix6bnYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LHN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdixvZCAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsdHIgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LDw+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiw+PSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsPiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsdXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LHZueiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsbnN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdixldiAgJXI0LDMsJXI1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NobGFkZDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hsYWRkMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGJiNjdiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hsYWRkMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBQQTIuMCBzaGxhZGQgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXNobGFkZCwqICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCo9ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCo8ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCo8PSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCwqbnV2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCp6bnYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKnN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCpvZCAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCwqdHIgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKjw+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCo+PSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCwqPiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCwqdXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsKnZueiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCwqbnN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLCpldiAgJXI0LDEsJXI1LCVyNgotCi0Jc2hsYWRkLGwsKiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCo9ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKjwgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCwqPD0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCwqbnV2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnpudiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCpzdiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCpvZCAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCp0ciAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCo8PiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCo+PSAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCo+ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnV2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnZueiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCxsLCpuc3YgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsbCwqZXYgICVyNCwxLCVyNSwlcjYKLQotCXNobGFkZCx0c3YsKiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKj0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo8ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPD0gICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpudXYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp6bnYgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpzdiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKm9kICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqdHIgICVyNCwxLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo8PiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKj49ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPiAgJXI0LDEsJXI1LCVyNgotCXNobGFkZCx0c3YsKnV2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqdm56ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqbnN2ICAlcjQsMSwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqZXYgICVyNCwxLCVyNSwlcjYKLQotCXNobGFkZCwqICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCo9ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCo8ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCo8PSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCwqbnV2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCp6bnYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKnN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCpvZCAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCwqdHIgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKjw+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCo+PSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCwqPiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCwqdXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsKnZueiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCwqbnN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLCpldiAgJXI0LDIsJXI1LCVyNgotCi0Jc2hsYWRkLGwsKiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCo9ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKjwgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCwqPD0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCwqbnV2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnpudiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCpzdiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCpvZCAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCp0ciAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCo8PiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCo+PSAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCo+ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnV2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLGwsKnZueiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCxsLCpuc3YgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsbCwqZXYgICVyNCwyLCVyNSwlcjYKLQotCXNobGFkZCx0c3YsKiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKj0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo8ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPD0gICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpudXYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp6bnYgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpzdiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKm9kICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqdHIgICVyNCwyLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo8PiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKj49ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPiAgJXI0LDIsJXI1LCVyNgotCXNobGFkZCx0c3YsKnV2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqdm56ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqbnN2ICAlcjQsMiwlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqZXYgICVyNCwyLCVyNSwlcjYKLQotCXNobGFkZCwqICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCo9ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCo8ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCo8PSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCwqbnV2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCp6bnYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKnN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCpvZCAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCwqdHIgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKjw+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCo+PSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCwqPiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCwqdXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsKnZueiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCwqbnN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLCpldiAgJXI0LDMsJXI1LCVyNgotCi0Jc2hsYWRkLGwsKiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCo9ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKjwgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCwqPD0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCwqbnV2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKnpudiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCpzdiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCpvZCAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCp0ciAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCo8PiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCo+PSAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCo+ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKnV2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLGwsKnZueiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCxsLCpuc3YgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsbCwqZXYgICVyNCwzLCVyNSwlcjYKLQotCXNobGFkZCx0c3YsKiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKj0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo8ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPD0gICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpudXYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCp6bnYgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCpzdiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKm9kICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqdHIgICVyNCwzLCVyNSwlcjYKLQlzaGxhZGQsdHN2LCo8PiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKj49ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqPiAgJXI0LDMsJXI1LCVyNgotCXNobGFkZCx0c3YsKnV2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqdm56ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqbnN2ICAlcjQsMywlcjUsJXI2Ci0Jc2hsYWRkLHRzdiwqZXYgICVyNCwzLCVyNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zcGVjaWFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NwZWNpYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYxY2U5YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NwZWNpYWwucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLQlnZncgJXI0KCVzcjAsJXI1KQotCWdmdyxtICVyNCglc3IwLCVyNSkKLQlnZnIgJXI0KCVzcjAsJXI1KQotCWdmcixtICVyNCglc3IwLCVyNSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BvcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zcG9wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjY0ZDYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zcG9wLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi1zcG9wX3Rlc3RzOiAKLQlzcG9wMCw0LDUKLQlzcG9wMCw0LDExNQotCXNwb3AwLDQsNSxuCi0Jc3BvcDAsNCwxMTUsbgotCXNwb3AxLDQsNSAlcjUKLQlzcG9wMSw0LDExNSAlcjUKLQlzcG9wMSw0LDUsbiAlcjUKLQlzcG9wMSw0LDExNSxuICVyNQotCXNwb3AyLDQsNSAlcjUKLQlzcG9wMiw0LDExNSAlcjUKLQlzcG9wMiw0LDUsbiAlcjUKLQlzcG9wMiw0LDExNSxuICVyNQotCXNwb3AzLDQsNSAlcjUsJXI2Ci0Jc3BvcDMsNCwxMTUgJXI1LCVyNgotCXNwb3AzLDQsNSxuICVyNSwlcjYKLQlzcG9wMyw0LDExNSxuICVyNSwlcjYKLQotOyBHYXMgZnVja3MgdGhpcyB1cC4uLiAgVGhpbmtzIGl0IGhhcyB0aGUgZXhwcmVzc2lvbiA1IG1vZCByNS4KLTsJc3BvcDEsNCw1ICVyNQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YzJjYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWIucworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXN1YiAlcjQsJXI1LCVyNgotCXN1Yiw9ICVyNCwlcjUsJXI2Ci0Jc3ViLDwgJXI0LCVyNSwlcjYKLQlzdWIsPD0gJXI0LCVyNSwlcjYKLQlzdWIsPDwgJXI0LCVyNSwlcjYKLQlzdWIsPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHN2ICVyNCwlcjUsJXI2Ci0Jc3ViLG9kICVyNCwlcjUsJXI2Ci0Jc3ViLHRyICVyNCwlcjUsJXI2Ci0Jc3ViLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViLD49ICVyNCwlcjUsJXI2Ci0Jc3ViLD4gJXI0LCVyNSwlcjYKLQlzdWIsPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLD4+ICVyNCwlcjUsJXI2Ci0Jc3ViLG5zdiAlcjQsJXI1LCVyNgotCXN1YixldiAlcjQsJXI1LCVyNgotCi0Jc3VibyAlcjQsJXI1LCVyNgotCXN1Ym8sPSAlcjQsJXI1LCVyNgotCXN1Ym8sPCAlcjQsJXI1LCVyNgotCXN1Ym8sPD0gJXI0LCVyNSwlcjYKLQlzdWJvLDw8ICVyNCwlcjUsJXI2Ci0Jc3Vibyw8PD0gJXI0LCVyNSwlcjYKLQlzdWJvLHN2ICVyNCwlcjUsJXI2Ci0Jc3VibyxvZCAlcjQsJXI1LCVyNgotCXN1Ym8sdHIgJXI0LCVyNSwlcjYKLQlzdWJvLDw+ICVyNCwlcjUsJXI2Ci0Jc3Vibyw+PSAlcjQsJXI1LCVyNgotCXN1Ym8sPiAlcjQsJXI1LCVyNgotCXN1Ym8sPj49ICVyNCwlcjUsJXI2Ci0Jc3Vibyw+PiAlcjQsJXI1LCVyNgotCXN1Ym8sbnN2ICVyNCwlcjUsJXI2Ci0Jc3VibyxldiAlcjQsJXI1LCVyNgotCi0Jc3ViYiAlcjQsJXI1LCVyNgotCXN1YmIsPSAlcjQsJXI1LCVyNgotCXN1YmIsPCAlcjQsJXI1LCVyNgotCXN1YmIsPD0gJXI0LCVyNSwlcjYKLQlzdWJiLDw8ICVyNCwlcjUsJXI2Ci0Jc3ViYiw8PD0gJXI0LCVyNSwlcjYKLQlzdWJiLHN2ICVyNCwlcjUsJXI2Ci0Jc3ViYixvZCAlcjQsJXI1LCVyNgotCXN1YmIsdHIgJXI0LCVyNSwlcjYKLQlzdWJiLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViYiw+PSAlcjQsJXI1LCVyNgotCXN1YmIsPiAlcjQsJXI1LCVyNgotCXN1YmIsPj49ICVyNCwlcjUsJXI2Ci0Jc3ViYiw+PiAlcjQsJXI1LCVyNgotCXN1YmIsbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViYixldiAlcjQsJXI1LCVyNgotCi0Jc3ViYm8gJXI0LCVyNSwlcjYKLQlzdWJibyw9ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPCAlcjQsJXI1LCVyNgotCXN1YmJvLDw9ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPDwgJXI0LCVyNSwlcjYKLQlzdWJibyw8PD0gJXI0LCVyNSwlcjYKLQlzdWJibyxzdiAlcjQsJXI1LCVyNgotCXN1YmJvLG9kICVyNCwlcjUsJXI2Ci0Jc3ViYm8sdHIgJXI0LCVyNSwlcjYKLQlzdWJibyw8PiAlcjQsJXI1LCVyNgotCXN1YmJvLD49ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPiAlcjQsJXI1LCVyNgotCXN1YmJvLD4+PSAlcjQsJXI1LCVyNgotCXN1YmJvLD4+ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sZXYgJXI0LCVyNSwlcjYKLQotCXN1YnQgJXI0LCVyNSwlcjYKLQlzdWJ0LD0gJXI0LCVyNSwlcjYKLQlzdWJ0LDwgJXI0LCVyNSwlcjYKLQlzdWJ0LDw9ICVyNCwlcjUsJXI2Ci0Jc3VidCw8PCAlcjQsJXI1LCVyNgotCXN1YnQsPDw9ICVyNCwlcjUsJXI2Ci0Jc3VidCxzdiAlcjQsJXI1LCVyNgotCXN1YnQsb2QgJXI0LCVyNSwlcjYKLQlzdWJ0LHRyICVyNCwlcjUsJXI2Ci0Jc3VidCw8PiAlcjQsJXI1LCVyNgotCXN1YnQsPj0gJXI0LCVyNSwlcjYKLQlzdWJ0LD4gJXI0LCVyNSwlcjYKLQlzdWJ0LD4+PSAlcjQsJXI1LCVyNgotCXN1YnQsPj4gJXI0LCVyNSwlcjYKLQlzdWJ0LG5zdiAlcjQsJXI1LCVyNgotCXN1YnQsZXYgJXI0LCVyNSwlcjYKLQotCXN1YnRvICVyNCwlcjUsJXI2Ci0Jc3VidG8sPSAlcjQsJXI1LCVyNgotCXN1YnRvLDwgJXI0LCVyNSwlcjYKLQlzdWJ0byw8PSAlcjQsJXI1LCVyNgotCXN1YnRvLDw8ICVyNCwlcjUsJXI2Ci0Jc3VidG8sPDw9ICVyNCwlcjUsJXI2Ci0Jc3VidG8sc3YgJXI0LCVyNSwlcjYKLQlzdWJ0byxvZCAlcjQsJXI1LCVyNgotCXN1YnRvLHRyICVyNCwlcjUsJXI2Ci0Jc3VidG8sPD4gJXI0LCVyNSwlcjYKLQlzdWJ0byw+PSAlcjQsJXI1LCVyNgotCXN1YnRvLD4gJXI0LCVyNSwlcjYKLQlzdWJ0byw+Pj0gJXI0LCVyNSwlcjYKLQlzdWJ0byw+PiAlcjQsJXI1LCVyNgotCXN1YnRvLG5zdiAlcjQsJXI1LCVyNgotCXN1YnRvLGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWIsdHN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiw8ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiw8PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsPDwgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LDw8PSAlcjQsJXI1LCVyNgotCXN1Yix0c3Ysc3YgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LG9kICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdix0ciAlcjQsJXI1LCVyNgotCXN1Yix0c3YsPD4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LD49ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiw+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiw+Pj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LD4+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdixuc3YgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWIsYiAlcjQsJXI1LCVyNgotCXN1YixiLD0gJXI0LCVyNSwlcjYKLQlzdWIsYiw8ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsPD0gJXI0LCVyNSwlcjYKLQlzdWIsYiw8PCAlcjQsJXI1LCVyNgotCXN1YixiLDw8PSAlcjQsJXI1LCVyNgotCXN1YixiLHN2ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsb2QgJXI0LCVyNSwlcjYKLQlzdWIsYix0ciAlcjQsJXI1LCVyNgotCXN1YixiLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsPj0gJXI0LCVyNSwlcjYKLQlzdWIsYiw+ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsPj4gJXI0LCVyNSwlcjYKLQlzdWIsYixuc3YgJXI0LCVyNSwlcjYKLQlzdWIsYixldiAlcjQsJXI1LCVyNgotCi0Jc3ViLGIsdHN2ICVyNCwlcjUsJXI2Ci0Jc3ViLGIsdHN2LD0gJXI0LCVyNSwlcjYKLQlzdWIsYix0c3YsPCAlcjQsJXI1LCVyNgotCXN1YixiLHRzdiw8PSAlcjQsJXI1LCVyNgotCXN1YixiLHRzdiw8PCAlcjQsJXI1LCVyNgotCXN1YixiLHRzdiw8PD0gJXI0LCVyNSwlcjYKLQlzdWIsYix0c3Ysc3YgJXI0LCVyNSwlcjYKLQlzdWIsYix0c3Ysb2QgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGIsdHIgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGIsPD4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGIsPj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGIsPiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsYiw+Pj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGIsPj4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGIsbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdixiLGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWIsdGMgJXI0LCVyNSwlcjYKLQlzdWIsdGMsPSAlcjQsJXI1LCVyNgotCXN1Yix0Yyw8ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLDw8ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLDw8PSAlcjQsJXI1LCVyNgotCXN1Yix0YyxzdiAlcjQsJXI1LCVyNgotCXN1Yix0YyxvZCAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0ciAlcjQsJXI1LCVyNgotCXN1Yix0Yyw8PiAlcjQsJXI1LCVyNgotCXN1Yix0Yyw+PSAlcjQsJXI1LCVyNgotCXN1Yix0Yyw+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLD4+PSAlcjQsJXI1LCVyNgotCXN1Yix0Yyw+PiAlcjQsJXI1LCVyNgotCXN1Yix0Yyxuc3YgJXI0LCVyNSwlcjYKLQlzdWIsdGMsZXYgJXI0LCVyNSwlcjYKLQotCXN1Yix0Yyx0c3YgJXI0LCVyNSwlcjYKLQlzdWIsdGMsdHN2LD0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsdHN2LDwgJXI0LCVyNSwlcjYKLQlzdWIsdGMsdHN2LDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdiw8PCAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdixzdiAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3Ysb2QgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLHRyICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdix0Yyw8PiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsPj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLD4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLD4+PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsPj4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLG5zdiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsZXYgJXI0LCVyNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWIyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDQzNWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWIyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotCS5MRVZFTCAyLjAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc3ViLCogJXI0LCVyNSwlcjYKLQlzdWIsKj0gJXI0LCVyNSwlcjYKLQlzdWIsKjwgJXI0LCVyNSwlcjYKLQlzdWIsKjw9ICVyNCwlcjUsJXI2Ci0Jc3ViLCo8PCAlcjQsJXI1LCVyNgotCXN1YiwqPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLCpzdiAlcjQsJXI1LCVyNgotCXN1Yiwqb2QgJXI0LCVyNSwlcjYKLQlzdWIsKnRyICVyNCwlcjUsJXI2Ci0Jc3ViLCo8PiAlcjQsJXI1LCVyNgotCXN1YiwqPj0gJXI0LCVyNSwlcjYKLQlzdWIsKj4gJXI0LCVyNSwlcjYKLQlzdWIsKj4+PSAlcjQsJXI1LCVyNgotCXN1YiwqPj4gJXI0LCVyNSwlcjYKLQlzdWIsKm5zdiAlcjQsJXI1LCVyNgotCXN1YiwqZXYgJXI0LCVyNSwlcjYKLQotCXN1Yix0c3YsKiAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCo8ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiwqPD0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCo8PCAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKjw8PSAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiwqb2QgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCp0ciAlcjQsJXI1LCVyNgotCXN1Yix0c3YsKjw+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiwqPj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCo+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiwqPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdiwqPj4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCpuc3YgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LCpldiAlcjQsJXI1LCVyNgotCi0Jc3ViLGRiLCogJXI0LCVyNSwlcjYKLQlzdWIsZGIsKj0gJXI0LCVyNSwlcjYKLQlzdWIsZGIsKjwgJXI0LCVyNSwlcjYKLQlzdWIsZGIsKjw9ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLCo8PCAlcjQsJXI1LCVyNgotCXN1YixkYiwqPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLCpzdiAlcjQsJXI1LCVyNgotCXN1YixkYiwqb2QgJXI0LCVyNSwlcjYKLQlzdWIsZGIsKnRyICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLCo8PiAlcjQsJXI1LCVyNgotCXN1YixkYiwqPj0gJXI0LCVyNSwlcjYKLQlzdWIsZGIsKj4gJXI0LCVyNSwlcjYKLQlzdWIsZGIsKj4+PSAlcjQsJXI1LCVyNgotCXN1YixkYiwqPj4gJXI0LCVyNSwlcjYKLQlzdWIsZGIsKm5zdiAlcjQsJXI1LCVyNgotCXN1YixkYiwqZXYgJXI0LCVyNSwlcjYKLQotCXN1YixkYix0c3YsKiAlcjQsJXI1LCVyNgotCXN1YixkYix0c3YsKj0gJXI0LCVyNSwlcjYKLQlzdWIsZGIsdHN2LCo8ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLHRzdiwqPD0gJXI0LCVyNSwlcjYKLQlzdWIsZGIsdHN2LCo8PCAlcjQsJXI1LCVyNgotCXN1YixkYix0c3YsKjw8PSAlcjQsJXI1LCVyNgotCXN1YixkYix0c3YsKnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLGRiLHRzdiwqb2QgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGRiLCp0ciAlcjQsJXI1LCVyNgotCXN1Yix0c3YsZGIsKjw+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdixkYiwqPj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGRiLCo+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdixkYiwqPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdixkYiwqPj4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGRiLCpuc3YgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LGRiLCpldiAlcjQsJXI1LCVyNgotCi0Jc3ViLHRjLCogJXI0LCVyNSwlcjYKLQlzdWIsdGMsKj0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsKjwgJXI0LCVyNSwlcjYKLQlzdWIsdGMsKjw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLCo8PCAlcjQsJXI1LCVyNgotCXN1Yix0YywqPDw9ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLCpzdiAlcjQsJXI1LCVyNgotCXN1Yix0Yywqb2QgJXI0LCVyNSwlcjYKLQlzdWIsdGMsKnRyICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLCo8PiAlcjQsJXI1LCVyNgotCXN1Yix0YywqPj0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsKj4gJXI0LCVyNSwlcjYKLQlzdWIsdGMsKj4+PSAlcjQsJXI1LCVyNgotCXN1Yix0YywqPj4gJXI0LCVyNSwlcjYKLQlzdWIsdGMsKm5zdiAlcjQsJXI1LCVyNgotCXN1Yix0YywqZXYgJXI0LCVyNSwlcjYKLQotCXN1Yix0Yyx0c3YsKiAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsKj0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsdHN2LCo8ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdiwqPD0gJXI0LCVyNSwlcjYKLQlzdWIsdGMsdHN2LCo8PCAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsKjw8PSAlcjQsJXI1LCVyNgotCXN1Yix0Yyx0c3YsKnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLHRjLHRzdiwqb2QgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLCp0ciAlcjQsJXI1LCVyNgotCXN1Yix0c3YsdGMsKjw+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdix0YywqPj0gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLCo+ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdix0YywqPj49ICVyNCwlcjUsJXI2Ci0Jc3ViLHRzdix0YywqPj4gJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLCpuc3YgJXI0LCVyNSwlcjYKLQlzdWIsdHN2LHRjLCpldiAlcjQsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWJpLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1YmkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNDNkYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1YmkucworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc3ViaSAxMjMsJXI1LCVyNgotCXN1YmksPSAxMjMsJXI1LCVyNgotCXN1YmksPCAxMjMsJXI1LCVyNgotCXN1YmksPD0gMTIzLCVyNSwlcjYKLQlzdWJpLDw8IDEyMywlcjUsJXI2Ci0Jc3ViaSw8PD0gMTIzLCVyNSwlcjYKLQlzdWJpLHN2IDEyMywlcjUsJXI2Ci0Jc3ViaSxvZCAxMjMsJXI1LCVyNgotCXN1YmksdHIgMTIzLCVyNSwlcjYKLQlzdWJpLDw+IDEyMywlcjUsJXI2Ci0Jc3ViaSw+PSAxMjMsJXI1LCVyNgotCXN1YmksPiAxMjMsJXI1LCVyNgotCXN1YmksPj49IDEyMywlcjUsJXI2Ci0Jc3ViaSw+PiAxMjMsJXI1LCVyNgotCXN1YmksbnN2IDEyMywlcjUsJXI2Ci0Jc3ViaSxldiAxMjMsJXI1LCVyNgotCi0Jc3ViaW8gMTIzLCVyNSwlcjYKLQlzdWJpbyw9IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPCAxMjMsJXI1LCVyNgotCXN1YmlvLDw9IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPDwgMTIzLCVyNSwlcjYKLQlzdWJpbyw8PD0gMTIzLCVyNSwlcjYKLQlzdWJpbyxzdiAxMjMsJXI1LCVyNgotCXN1YmlvLG9kIDEyMywlcjUsJXI2Ci0Jc3ViaW8sdHIgMTIzLCVyNSwlcjYKLQlzdWJpbyw8PiAxMjMsJXI1LCVyNgotCXN1YmlvLD49IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPiAxMjMsJXI1LCVyNgotCXN1YmlvLD4+PSAxMjMsJXI1LCVyNgotCXN1YmlvLD4+IDEyMywlcjUsJXI2Ci0Jc3ViaW8sbnN2IDEyMywlcjUsJXI2Ci0Jc3ViaW8sZXYgMTIzLCVyNSwlcjYKLQotCXN1YmksdHN2IDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsPSAxMjMsJXI1LCVyNgotCXN1YmksdHN2LDwgMTIzLCVyNSwlcjYKLQlzdWJpLHRzdiw8PSAxMjMsJXI1LCVyNgotCXN1YmksdHN2LDw8IDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsPDw9IDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3Ysc3YgMTIzLCVyNSwlcjYKLQlzdWJpLHRzdixvZCAxMjMsJXI1LCVyNgotCXN1YmksdHN2LHRyIDEyMywlcjUsJXI2Ci0Jc3ViaSx0c3YsPD4gMTIzLCVyNSwlcjYKLQlzdWJpLHRzdiw+PSAxMjMsJXI1LCVyNgotCXN1YmksdHN2LD4gMTIzLCVyNSwlcjYKLQlzdWJpLHRzdiw+Pj0gMTIzLCVyNSwlcjYKLQlzdWJpLHRzdiw+PiAxMjMsJXI1LCVyNgotCXN1YmksdHN2LG5zdiAxMjMsJXI1LCVyNgotCXN1YmksdHN2LGV2IDEyMywlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N5c3RlbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zeXN0ZW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4NDZiOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N5c3RlbS5zCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlicmVhayA1LDEyCi0JcmZpCi0JcmZpcgotCXNzbSA1LCVyNAotCXJzbSA1LCVyNAotCW10c20gJXI0Ci0JbGRzaWQgKCVzcjAsJXI1KSwlcjQKLQltdHNwICVyNCwlc3IwCi0JbXRjdGwgJXI0LCVjcjEwCi0JbWZzcCAlc3IwLCVyNAotCW1mY3RsICVjcjEwLCVyNAotCXN5bmMKLQlzeW5jZG1hCi0JZGlhZyAxMjM0Ci0KLQlwcm9iZXIgKCVzcjAsJXI1KSwlcjYsJXI3Ci0JcHJvYmVyaSAoJXNyMCwlcjUpLDEsJXI3Ci0JcHJvYmV3ICglc3IwLCVyNSksJXI2LCVyNwotCXByb2Jld2kgKCVzcjAsJXI1KSwxLCVyNwotCQotCWxwYSAlcjQoJXNyMCwlcjUpLCVyNgotCWxwYSxtICVyNCglc3IwLCVyNSksJXI2Ci0JbGhhICVyNCglc3IwLCVyNSksJXI2Ci0JbGhhLG0gJXI0KCVzcjAsJXI1KSwlcjYKLQlsY2kgJXI0KCVzcjAsJXI1KSwlcjYKLQotCWlkdGxiYSAlcjQsKCVzcjAsJXI1KQotCWlpdGxiYSAlcjQsKCVzcjQsJXI1KQotCWlkdGxicCAlcjQsKCVzcjAsJXI1KQotCWlpdGxicCAlcjQsKCVzcjQsJXI1KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zeXN0ZW0yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N5c3RlbTIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3MzNhOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N5c3RlbTIucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLQkuTEVWRUwgMi4wCi0JLmNvZGUKLQkuYWxpZ24gNAotOyBQQTIuMCBzeXN0ZW0gaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXJmaQotCXJmaSxyCi0Jc3NtIDkyMywlcjQKLQlyc20gOTIzLCVyNAotCW1mY3RsLHcgJWNyMTEsJXI0Ci0KLQlwcm9iZSxyICglc3IwLCVyNSksJXI2LCVyNwotCXByb2JlaSxyICglc3IwLCVyNSksMSwlcjcKLQlwcm9iZSx3ICglc3IwLCVyNSksJXI2LCVyNwotCXByb2JlaSx3ICglc3IwLCVyNSksMSwlcjcKLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvdW5pdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy91bml0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMmZlZmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy91bml0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotOyBCYXNpYyB1bml0IGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQotCXV4b3IgJXI0LCVyNSwlcjYKLQl1eG9yLHNieiAlcjQsJXI1LCVyNgotCXV4b3Isc2h6ICVyNCwlcjUsJXI2Ci0JdXhvcixzZGMgJXI0LCVyNSwlcjYKLQl1eG9yLHNiYyAlcjQsJXI1LCVyNgotCXV4b3Isc2hjICVyNCwlcjUsJXI2Ci0JdXhvcix0ciAlcjQsJXI1LCVyNgotCXV4b3IsbmJ6ICVyNCwlcjUsJXI2Ci0JdXhvcixuaHogJXI0LCVyNSwlcjYKLQl1eG9yLG5kYyAlcjQsJXI1LCVyNgotCXV4b3IsbmJjICVyNCwlcjUsJXI2Ci0JdXhvcixuaGMgJXI0LCVyNSwlcjYKLQotCXVhZGRjbSAlcjQsJXI1LCVyNgotCXVhZGRjbSxzYnogJXI0LCVyNSwlcjYKLQl1YWRkY20sc2h6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHNkYyAlcjQsJXI1LCVyNgotCXVhZGRjbSxzYmMgJXI0LCVyNSwlcjYKLQl1YWRkY20sc2hjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRyICVyNCwlcjUsJXI2Ci0JdWFkZGNtLG5ieiAlcjQsJXI1LCVyNgotCXVhZGRjbSxuaHogJXI0LCVyNSwlcjYKLQl1YWRkY20sbmRjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLG5iYyAlcjQsJXI1LCVyNgotCXVhZGRjbSxuaGMgJXI0LCVyNSwlcjYKLQotCXVhZGRjbXQgJXI0LCVyNSwlcjYKLQl1YWRkY210LHNieiAlcjQsJXI1LCVyNgotCXVhZGRjbXQsc2h6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxzZGMgJXI0LCVyNSwlcjYKLQl1YWRkY210LHNiYyAlcjQsJXI1LCVyNgotCXVhZGRjbXQsc2hjICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCx0ciAlcjQsJXI1LCVyNgotCXVhZGRjbXQsbmJ6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxuaHogJXI0LCVyNSwlcjYKLQl1YWRkY210LG5kYyAlcjQsJXI1LCVyNgotCXVhZGRjbXQsbmJjICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxuaGMgJXI0LCVyNSwlcjYKLQotCXVhZGRjbSx0YyAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YyxzYnogJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsc2h6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLHNkYyAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YyxzYmMgJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsc2hjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLHRyICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLG5ieiAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YyxuaHogJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsbmRjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLG5iYyAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YyxuaGMgJXI0LCVyNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvdW5pdDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvdW5pdDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwN2RhZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3VuaXQyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0JLkxFVkVMIDIuMAotCS5jb2RlCi0JLmFsaWduIDQKLTsgUEEyLjAgdW5pdCBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0KLQl1eG9yLCogJXI0LCVyNSwlcjYKLQl1eG9yLCpzYnogJXI0LCVyNSwlcjYKLQl1eG9yLCpzaHogJXI0LCVyNSwlcjYKLQl1eG9yLCpzZGMgJXI0LCVyNSwlcjYKLQl1eG9yLCpzYmMgJXI0LCVyNSwlcjYKLQl1eG9yLCpzaGMgJXI0LCVyNSwlcjYKLQl1eG9yLCp0ciAlcjQsJXI1LCVyNgotCXV4b3IsKm5ieiAlcjQsJXI1LCVyNgotCXV4b3IsKm5oeiAlcjQsJXI1LCVyNgotCXV4b3IsKm5kYyAlcjQsJXI1LCVyNgotCXV4b3IsKm5iYyAlcjQsJXI1LCVyNgotCXV4b3IsKm5oYyAlcjQsJXI1LCVyNgotCi0JdWFkZGNtLCogJXI0LCVyNSwlcjYKLQl1YWRkY20sKnNieiAlcjQsJXI1LCVyNgotCXVhZGRjbSwqc2h6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLCpzZGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sKnNiYyAlcjQsJXI1LCVyNgotCXVhZGRjbSwqc2hjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLCp0ciAlcjQsJXI1LCVyNgotCXVhZGRjbSwqbmJ6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLCpuaHogJXI0LCVyNSwlcjYKLQl1YWRkY20sKm5kYyAlcjQsJXI1LCVyNgotCXVhZGRjbSwqbmJjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLCpuaGMgJXI0LCVyNSwlcjYKLQotCXVhZGRjbSx0YywqICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLCpzYnogJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsKnNoeiAlcjQsJXI1LCVyNgotCXVhZGRjbSx0Yywqc2RjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLCpzYmMgJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsKnNoYyAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YywqdHIgJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsKm5ieiAlcjQsJXI1LCVyNgotCXVhZGRjbSx0Yywqbmh6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHRjLCpuZGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sdGMsKm5iYyAlcjQsJXI1LCVyNgotCXVhZGRjbSx0YywqbmhjICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3dlaXJkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3dlaXJkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjRlYTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy93ZWlyZC5zCisrKyAvZGV2L251bGwKQEAgLTEsODcwICswLDAgQEAKLQkuc3RhYnMgIndlaXJkLmMiLDB4NjQsMCwwLExhYmVsMAotTGFiZWwwOgotCS5zdGFicyAiaW50dHlwZTp0MT1idTQ7MDszMjsiLDB4ODAsMCwwLDAKLQotCi0JLnN0YWJzICJzeW0zMjogICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+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/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24xLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDk0YWYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24xLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gMQotCS5hbGlnbiA4Ci0Jbm9wCi07ICI4IiBhc3N1bWVkIGlmIG5vIGFsaWdubWVudCBnaXZlbi4KLQkuYWxpZ24KLQlub3AKLQkuYWxpZ24gNDA5NgotCW5vcAotCi0KLQkuZGF0YQotCi0gICAgICAgIC5BTElHTiAgOAotJEwwMEJTUzoKLWhvbWVfYnVmZjoKLSAgICAgICAgLkJMT0NLICAxMDI0Ci0gICAgICAgIC5BTElHTiAgOAotY3VycmVudF9idWZmOgotICAgICAgICAuQkxPQ0sgIDEwMjQKLSAgICAgICAgLkFMSUdOICA0Ci1sb2NrX2ZpbGU6Ci0gICAgICAgIC5CTE9DSyAgNAotICAgICAgICAuQUxJR04gIDgKLUwzMzIubmFtZToKLSAgICAgICAgLkJMT0NLICAzMAotICAgICAgICAuQUxJR04gIDQKLUwzNTIubGFzdF9jYXNlX3dhOgotICAgICAgICAuQkxPQ0sgIDQKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hbGlnbjIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhMzU4ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMi5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gMwotCi0JCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hcHBidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYXBwYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMzdmOWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hcHBidWcucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgMSAiY3J0MC5zIgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2JhZGZtcHlhZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzZjQyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2JhZGZtcHlhZGQucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmb29iYXIsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1GUixBUkdXMT1GVSxBUkdXMj1GUixBUkdXMz1GVSxSVE5WQUw9RlIKLWZvb2JhcgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlsZG8gLTY0KCVyMzApLCVyMjAKLQlhZGRpbCBMUid4LSRnbG9iYWwkLCVyMjcKLQlmbGRkcyA4KCVyMjApLCVmcjQKLQlmbGRkcyAwKCVyMjApLCVmcjIyCi0JbGRvIFJSJ3gtJGdsb2JhbCQoJXIxKSwlcjE5Ci0JZm1weXN1YixzZ2wgJWZyNUwsJWZyN0wsJWZyNUwsJWZyMjJMLCVmcjRMCi0JYnYgJXIwKCVyMikKLQlmc3RkcyAlZnI1LDAoJXIxOSkKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmJzcwotCi14CS5jb21tIDgKLXkJLmNvbW0gOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmxvY2sxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMTJhYjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazEucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkuZGF0YQotCi0KLWZvbzoKLQkuYmxvY2sKLWJhcjoKLQkuYmxvY2sgMHg3ZmZmZmZmZgotY29tOgotCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmxvY2syLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZmQxOTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazIucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCS5kYXRhCi1mb286Ci0JLmJsb2NrIC0xCi0KLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxkYXRhYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxkYXRhYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MDZhMGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9jYWxsZGF0YWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci1MQyQwMDAwOgotCS5TVFJJTkcgIiVkICVsZiAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBlcnJvcl9fM0FBQWlpZGkKLQkuRVhQT1JUIGVycm9yX18zQUFBaWlkaSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUZSLEFSR1c0PUZVLFJUTlZBTD1HUgotZXJyb3JfXzNBQUFpaWRpOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOSw4KCVyNCkKLQlzdHcgJXI4LDEyKCVyNCkKLQlzdHcgJXI3LDE2KCVyNCkKLQlzdHcgJXI2LDIwKCVyNCkKLQlzdHcgJXI1LDI0KCVyNCkKLQljb3B5ICVyMjYsJXI1Ci0JbGRvIC04KCVyMCksJXI2Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjYsJXI3Ci0Jc3R3ICVyMjUsMCglcjcpCi0JbGRvIC0xMiglcjApLCVyOAotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI4LCVyOQotCXN0dyAlcjI0LDAoJXI5KQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtMjQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZG8gLTI4KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01MiglcjMwKQotCWxkaWwgTCdMQyQwMDAwLCVyMjYKLQlsZG8gUidMQyQwMDAwKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JZmxkZHMgMCglcjIwKSwlZnI3Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9RlIsQVJHVzM9RlUKLQlibCBwcmludGYsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwMDIsJXIwCi0JYmwsbiBMJDAwMDEsJXIwCi1MJDAwMDI6Ci1MJDAwMDE6Ci0JbGR3IDgoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjgKLQlsZHcgMTYoJXI0KSwlcjcKLQlsZHcgMjAoJXI0KSwlcjYKLQlsZHcgMjQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIG9rX18zQUFBaWRpCi0JLkVYUE9SVCBva19fM0FBQWlkaSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUZSLEFSR1czPUZVLFJUTlZBTD1HUgotb2tfXzNBQUFpZGk6Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI5LDgoJXI0KQotCXN0dyAlcjgsMTIoJXI0KQotCXN0dyAlcjcsMTYoJXI0KQotCXN0dyAlcjYsMjAoJXI0KQotCXN0dyAlcjUsMjQoJXI0KQotCWNvcHkgJXIyNiwlcjUKLQlsZG8gLTgoJXIwKSwlcjYKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNiwlcjcKLQlzdHcgJXIyNSwwKCVyNykKLQlsZG8gLTE2KCVyMCksJXI4Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjgsJXI5Ci0JZnN0ZHMgJWZyNywwKCVyOSkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTE2KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGRvIC0yMCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNTIoJXIzMCkKLQlsZGlsIEwnTEMkMDAwMCwlcjI2Ci0JbGRvIFInTEMkMDAwMCglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCWZsZGRzIDAoJXIyMCksJWZyNwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUZSLEFSR1czPUZVCi0JYmwgcHJpbnRmLCVyMgotCW5vcAotCWJsLG4gTCQwMDA0LCVyMAotCWJsLG4gTCQwMDAzLCVyMAotTCQwMDA0OgotTCQwMDAzOgotCWxkdyA4KCVyNCksJXI5Ci0JbGR3IDEyKCVyNCksJXI4Ci0JbGR3IDE2KCVyNCksJXI3Ci0JbGR3IDIwKCVyNCksJXI2Ci0JbGR3IDI0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgX19tYWluLENPREUKLQkuYWxpZ24gOAotTEMkMDAwMToKLQk7IC5kb3VibGUgNS41MDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAKLQkud29yZCAxMDc1MTgzNjE2IDsgPSAweDQwMTYwMDAwCi0JLndvcmQgMCA7ID0gMHgwCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1haW4KLQkuRVhQT1JUIG1haW4sUFJJVl9MRVY9MyxSVE5WQUw9R1IKLW1haW46Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQkuQ0FMTCAKLQlibCBfX21haW4sJXIyCi0Jbm9wCi0JbGRvIC0yNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyMzApLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwMSwlcjIwCi0JbGRvIFInTEMkMDAwMSglcjIwKSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0KCVyMjEpLCVyMjMKLQlzdHcgJXIyMiwwKCVyMTkpCi0Jc3R3ICVyMjMsNCglcjE5KQotCWxkbyAzKCVyMCksJXIxOQotCXN0dyAlcjE5LC02MCglcjMwKQotCWxkbyA4KCVyNCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWxkbyA0KCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgZXJyb3JfXzNBQUFpaWRpLCVyMgotCW5vcAotCWxkbyAzKCVyMCksJXIxOQotCXN0dyAlcjE5LC01MiglcjMwKQotCWxkbyA4KCVyNCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWxkaWwgTCdMQyQwMDAxLCVyMTkKLQlsZG8gUidMQyQwMDAxKCVyMTkpLCVyMjAKLQlmbGRkcyAwKCVyMjApLCVmcjcKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1GUixBUkdXMz1GVQotCWJsIG9rX18zQUFBaWRpLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMjgKLQlibCxuIEwkMDAwNSwlcjAKLQlibCxuIEwkMDAwNSwlcjAKLUwkMDAwNToKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGluZm9idWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGluZm9idWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2OGU4Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxpbmZvYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLmV4cG9ydCBkaXZ1LG1pbGxpY29kZQotCS5wcm9jCi0JLmNhbGxpbmZvIG1pbGxpY29kZQotZGl2dQotCS5wcm9jZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2RlZmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9kZWZidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4MjY1Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2RlZmJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotCS5pbXBvcnQJX3NldGVycm5vCi0gCS5leHBvcnQgICB2Zm9yayAgIQkubGFiZWwgICB2Zm9yayAgIQkucHJvYyEJLmNhbGxpbmZvIG5vX2NhbGxzIQkuZW50cnkgIQkgCS5sYWJlbAlfX3Zmb3JrICAhCW10c3AJJXIwLCVzcjAhCWxkaWwJTCUweGMwMDAwMDA0LCVyMSEJYmxlCVIlMHhjMDAwMDAwNCglc3IwLCVyMSkhCWxkaQk2NiAgICwlcjIyICEJYixuCXl5eSEJYixuCV9fdmZvcmsgIQliCV9zZXRlcnJubyEJY29weQklcjI4LCVyMjYhCS5sYWJlbAl5eXkgCi0JYWRkLD0JJXIwLCVyMjksJXIwCQkgCi0JY29weQklcjAsJXIyOAkJIAotCWJ2LG4JKCVyMikKLQkuZXhpdAotIAkucHJvY2VuZCAJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2VudHJ5YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2VudHJ5YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNGY3MzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9lbnRyeWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5jb2RlCi0KLQkuYWxpZ24gNAotCS5QQVJBTSBmb28sUlROVkFMPUdSCi1mb286Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LE5PX0NBTExTLEVOVFJZX0dSPTEsRU5UUllfRlI9MTEKLQkuRU5UUlkKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cG9ydGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9leHBvcnRidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5MDQxZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cG9ydGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotICAgICAgICAuRVhQT1JUIG1haW4sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cHJidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwcmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQ0ZDJjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwcmJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotCS5jb2RlCi0KLQkuYWxpZ24JOAotCS5leHBvcnQJaWNvZGUsZGF0YQotaWNvZGU6Ci0JLnByb2MKLQkuY2FsbGluZm8JZnJhbWU9MCxub19jYWxscwotCS5lbnRyeQotCWJ2LG4JJXIwKCVyMikKLQkuZXhpdAotCW5vcAotCS5wcm9jZW5kCi0KLQk7Ci0JOyBGSVJTVCwgYXJndiBhcnJheSBvZiBwb2ludGVycyB0byBhcmdzLCAxc3QgaXMgc2FtZSBhcyBwYXRoLgotCTsKLQkuYWxpZ24JOAotaWNfYXJndjoKLQkud29yZAlpY19hcmd2MS1pY29kZQk7IHNlY29uZCwgcG9pbnRlciB0byAxc3QgYXJndW1lbnQKLQkud29yZAlpY19wYXRoLWljb2RlCQk7IGZpcnN0LCAgcG9pbnRlciB0byBpbml0IHBhdGgKLQkud29yZAkwCQkJOyBmb3VydGgsIE5VTEwgYXJndiB0ZXJtaW5hdG9yIChwYWQpCi0JLndvcmQJMAkJCTsgdGhpcmQsICBOVUxMIGFyZ3YgdGVybWluYXRvcgotCi1pY19wYXRoOgotCS5ibG9ja3oJNDA5NgkJCTsgbXVzdCBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzCi0JLndvcmQJMAkJCTsgaW4gY2FzZSBmdWxsIHN0cmluZyBpcyB1c2VkCi0JLndvcmQJMAkJCTsgdGhpcyB3aWxsIGJlIHRoZSBzdHJpbmcgdGVybWluYXRvcgotCi1pY19hcmd2MToKLQkuYmxvY2t6CTQwOTYJCQk7IG11c3QgYmUgbXVsdGlwbGUgb2YgNCBieXRlcwotCS53b3JkCTAJCQk7IGluIGNhc2UgZnVsbCBzdHJpbmcgaXMgdXNlZAotCS53b3JkCTAJCQk7IHRoaXMgd2lsbCBiZSB0aGUgc3RyaW5nIHRlcm1pbmF0b3IKLQotCS5leHBvcnQJc3ppY29kZSxkYXRhCi1zemljb2RlOgotCS53b3JkCXN6aWNvZGUtaWNvZGUKLQkud29yZAkwCQkJOyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGZpbGxlciBhdCBlbmQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9maXh1cDdidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZml4dXA3YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODQyYmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9maXh1cDdidWcucworKysgL2Rldi9udWxsCkBAIC0xLDYxNjcgKzAsMCBAQAotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotCS5jb2RlCi0JLmFsaWduIDQKLQkuRVhQT1JUIGFsbG9jX3R5cGUsQ09ERQotCS5FWFBPUlQgYWxsb2NfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotYWxsb2NfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI3LDMyKCVyNCkKLQlzdHcgJXI2LDM2KCVyNCkKLQlzdHcgJXI1LDQwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMDIsJXIwCi0Jbm9wCi0JbGRvIDUyKCVyMCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI3Ci0JYmwsbiBMJDAwMDMsJXIwCi1MJDAwMDI6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gMTIwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwxMiglcjQpCi0JbGRvIDUyKCVyMCksJXIxOQotCXN0dyAlcjE5LDE2KCVyNCkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMTYoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDAwNCwlcjAKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDE2KCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMDA1LCVyMAotTCQwMDA0OiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAwMDU6IAotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgMTYoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDIwKCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI0KCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JY29tY2xyLD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDAwNiwlcjAKLQlub3AKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWRlcGkgLTEsMSwxLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotTCQwMDA2OiAKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMTIoJXIyMCksJXIyMAotCWxkdyAyNCglcjIxKSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAyNCglcjIxKSwlcjIyCi0JdWFkZGNtICVyMCwlcjIyLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIxOSksJXIxOQotCWxkdyA0KCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAxNiglcjIwKSwlcjIwCi0JbGR3IDQoJXIyMSksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIyMAotCWNvbWNsciw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAwMDcsJXIwCi0Jbm9wCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JY29weSAlcjIxLCVyMTkKLQlibCxuIEwkMDAwOCwlcjAKLUwkMDAwNzogCi0JY29weSAlcjAsJXIxOQotTCQwMDA4OiAKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsOCglcjE5KQotCWxkdyAyNCglcjQpLCVyNwotTCQwMDAzOiAKLQljb3B5ICVyNywlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyA1MiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIKLQlub3AKLQlzdHcgJXIwLDAoJXI3KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjcpCi0JbGRvIC0xKCVyMCksJXIxOQotCXN0dyAlcjE5LDQ0KCVyNykKLQljb3B5ICVyNywlcjI4Ci0JYmwsbiBMJDAwMDEsJXIwCi1MJDAwMDE6IAotCWxkdyAzMiglcjQpLCVyNwotCWxkdyAzNiglcjQpLCVyNgotCWxkdyA0MCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFrZV9wb2ludGVyX3R5cGUsQ09ERQotCS5FWFBPUlQgbWFrZV9wb2ludGVyX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLW1ha2VfcG9pbnRlcl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjksMTYoJXI0KQotCXN0dyAlcjgsMjAoJXI0KQotCXN0dyAlcjcsMjQoJXI0KQotCXN0dyAlcjYsMjgoJXI0KQotCXN0dyAlcjUsMzIoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMjAoJXIxOSksJXI5Ci0JY29taWNsciw8PiAwLCVyOSwlcjAKLQlibCBMJDAwMTAsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDExLCVyMAotCW5vcAotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAwOSwlcjAKLQlibCxuIEwkMDAxMiwlcjAKLUwkMDAxMTogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAxMywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwwKCVyMTkpCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDA5LCVyMAotTCQwMDEzOiAKLUwkMDAxMjogCi1MJDAwMTA6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwMTUsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAxNCwlcjAKLQlub3AKLQlibCxuIEwkMDAxNSwlcjAKLUwkMDAxNTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDE2LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDAoJXIxOSkKLUwkMDAxNjogCi0JYmwsbiBMJDAwMTcsJXIwCi1MJDAwMTQ6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjkKLQlsZHcgMTIoJXI5KSwlcjE5Ci0Jc3R3ICVyMTksOCglcjQpCi0JY29weSAlcjksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gNTIoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTIoJXI5KQotTCQwMDE3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMTYoJXI5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDIwKCVyMTkpCi0JbGRvIDQoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksOCglcjkpCi0JbGRvIDEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMCglcjkpCi0JbGRoIDMyKCVyOSksJXIxOQotCWNvcHkgJXIxOSwlcjIwCi0JZGVwaSAtMSwzMSwxLCVyMjAKLQlzdGggJXIyMCwzMiglcjkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAyMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMTgsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMjAoJXIxOSkKLUwkMDAxODogCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDA5LCVyMAotTCQwMDA5OiAKLQlsZHcgMTYoJXI0KSwlcjkKLQlsZHcgMjAoJXI0KSwlcjgKLQlsZHcgMjQoJXI0KSwlcjcKLQlsZHcgMjgoJXI0KSwlcjYKLQlsZHcgMzIoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9wb2ludGVyX3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3BvaW50ZXJfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX3BvaW50ZXJfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDgoJXI0KQotCXN0dyAlcjUsMTIoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBtYWtlX3BvaW50ZXJfdHlwZSwlcjIKLQlub3AKLQlibCxuIEwkMDAxOSwlcjAKLUwkMDAxOTogCi0JbGR3IDgoJXI0KSwlcjYKLQlsZHcgMTIoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIG1ha2VfcmVmZXJlbmNlX3R5cGUsQ09ERQotCS5FWFBPUlQgbWFrZV9yZWZlcmVuY2VfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbWFrZV9yZWZlcmVuY2VfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI5LDE2KCVyNCkKLQlzdHcgJXI4LDIwKCVyNCkKLQlzdHcgJXI3LDI0KCVyNCkKLQlzdHcgJXI2LDI4KCVyNCkKLQlzdHcgJXI1LDMyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDI0KCVyMTkpLCVyOQotCWNvbWljbHIsPD4gMCwlcjksJXIwCi0JYmwgTCQwMDIxLCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAyMiwlcjAKLQlub3AKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMjAsJXIwCi0JYmwsbiBMJDAwMjMsJXIwCi1MJDAwMjI6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMjQsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMCglcjE5KQotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAyMCwlcjAKLUwkMDAyNDogCi1MJDAwMjM6IAotTCQwMDIxOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDI2LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMjUsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwMjYsJXIwCi1MJDAwMjY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDAyNywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwwKCVyMTkpCi1MJDAwMjc6IAotCWJsLG4gTCQwMDI4LCVyMAotTCQwMDI1OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXI5Ci0JbGR3IDEyKCVyOSksJXIxOQotCXN0dyAlcjE5LDgoJXI0KQotCWNvcHkgJXI5LCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyOSkKLUwkMDAyODogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDE2KCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyNCglcjE5KQotCWxkbyA0KCVyMCksJXIxOQotCXN0dyAlcjE5LDgoJXI5KQotCWxkbyAxNiglcjApLCVyMTkKLQlzdHcgJXIxOSwwKCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDI0KCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAyOSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyNCglcjE5KQotTCQwMDI5OiAKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMjAsJXIwCi1MJDAwMjA6IAotCWxkdyAxNiglcjQpLCVyOQotCWxkdyAyMCglcjQpLCVyOAotCWxkdyAyNCglcjQpLCVyNwotCWxkdyAyOCglcjQpLCVyNgotCWxkdyAzMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3JlZmVyZW5jZV90eXBlLENPREUKLQkuRVhQT1JUIGxvb2t1cF9yZWZlcmVuY2VfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX3JlZmVyZW5jZV90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsOCglcjQpCi0Jc3R3ICVyNSwxMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIG1ha2VfcmVmZXJlbmNlX3R5cGUsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwMzAsJXIwCi1MJDAwMzA6IAotCWxkdyA4KCVyNCksJXI2Ci0JbGR3IDEyKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWtlX2Z1bmN0aW9uX3R5cGUsQ09ERQotCS5FWFBPUlQgbWFrZV9mdW5jdGlvbl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1tYWtlX2Z1bmN0aW9uX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyOSwxNiglcjQpCi0Jc3R3ICVyOCwyMCglcjQpCi0Jc3R3ICVyNywyNCglcjQpCi0Jc3R3ICVyNiwyOCglcjQpCi0Jc3R3ICVyNSwzMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAyOCglcjE5KSwlcjkKLQljb21pY2xyLDw+IDAsJXI5LCVyMAotCWJsIEwkMDAzMiwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMzMsJXIwCi0Jbm9wCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDMxLCVyMAotCWJsLG4gTCQwMDM0LCVyMAotTCQwMDMzOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDM1LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDAoJXIxOSkKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMzEsJXIwCi1MJDAwMzU6IAotTCQwMDM0OiAKLUwkMDAzMjogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDAzNywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDM2LCVyMAotCW5vcAotCWJsLG4gTCQwMDM3LCVyMAotTCQwMDM3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGFsbG9jX3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwMzgsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMCglcjE5KQotTCQwMDM4OiAKLQlibCxuIEwkMDAzOSwlcjAKLUwkMDAzNjogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyOQotCWxkdyAxMiglcjkpLCVyMTkKLQlzdHcgJXIxOSw4KCVyNCkKLQljb3B5ICVyOSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyA1MiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIKLQlub3AKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwxMiglcjkpCi1MJDAwMzk6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxNiglcjkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMjgoJXIxOSkKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSw4KCVyOSkKLQlsZG8gNiglcjApLCVyMTkKLQlzdHcgJXIxOSwwKCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDI4KCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDA0MCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyOCglcjE5KQotTCQwMDQwOiAKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMzEsJXIwCi1MJDAwMzE6IAotCWxkdyAxNiglcjQpLCVyOQotCWxkdyAyMCglcjQpLCVyOAotCWxkdyAyNCglcjQpLCVyNwotCWxkdyAyOCglcjQpLCVyNgotCWxkdyAzMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX2Z1bmN0aW9uX3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX2Z1bmN0aW9uX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKLWxvb2t1cF9mdW5jdGlvbl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsOCglcjQpCi0Jc3R3ICVyNSwxMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIG1ha2VfZnVuY3Rpb25fdHlwZSwlcjIKLQlub3AKLQlibCxuIEwkMDA0MSwlcjAKLUwkMDA0MTogCi0JbGR3IDgoJXI0KSwlcjYKLQlsZHcgMTIoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBzbWFzaF90b19tZW1iZXJfdHlwZSxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9tZW1iZXJfdHlwZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfbWVtYmVyX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLWxvb2t1cF9tZW1iZXJfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI4LDgoJXI0KQotCXN0dyAlcjcsMTIoJXI0KQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAyNCglcjQpLCVyMQotCWZzdGRzLG1hICVmcjEyLDgoJXIxKQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQlzdHcgJXIyOCwtMTYoJXIzMCkKLQlmbGR3cyAtMTYoJXIzMCksJWZyMTIKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlmc3R3cyAlZnIxMiwtMTYoJXIzMCkKLQlsZHcgLTE2KCVyMzApLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JbGR3IDAoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgc21hc2hfdG9fbWVtYmVyX3R5cGUsJXIyCi0Jbm9wCi0JZnN0d3MgJWZyMTIsLTE2KCVyMzApCi0JbGR3IC0xNiglcjMwKSwlcjI4Ci0JYmwsbiBMJDAwNDIsJXIwCi1MJDAwNDI6IAotCWxkdyA4KCVyNCksJXI4Ci0JbGR3IDEyKCVyNCksJXI3Ci0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDI0KCVyNCksJXIxCi0JZmxkZHMsbWEgOCglcjEpLCVmcjEyCi0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBhbGxvY2F0ZV9zdHViX21ldGhvZCxDT0RFCi0JLkVYUE9SVCBhbGxvY2F0ZV9zdHViX21ldGhvZCxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotYWxsb2NhdGVfc3R1Yl9tZXRob2Q6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxNiglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCWxkbyA0KCVyMCksJXIyMAotCXN0aCAlcjIwLDMyKCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDE1KCVyMCksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjApLCVyMjAKLQlzdHcgJXIyMCw4KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjI4Ci0JYmwsbiBMJDAwNDMsJXIwCi1MJDAwNDM6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGJ1aWx0aW5fdHlwZV9pbnQsREFUQQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBjcmVhdGVfYXJyYXlfdHlwZSxDT0RFCi0JLkVYUE9SVCBjcmVhdGVfYXJyYXlfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotY3JlYXRlX2FycmF5X3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTAsNTYoJXI0KQotCXN0dyAlcjksNjAoJXI0KQotCXN0dyAlcjgsNjQoJXI0KQotCXN0dyAlcjcsNjgoJXI0KQotCXN0dyAlcjYsNzIoJXI0KQotCXN0dyAlcjUsNzYoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQlzdHcgJXIyOCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMiglcjApLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDE2KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIzCi0JYWRkICVyMjMsJXIyMSwlcjIyCi0JbGR3IDAoJXIyMiksJXIyMQotCWxkdyAwKCVyMjApLCVyMjAKLQlsZHcgOCglcjIxKSwlcjIxCi0Jc3R3ICVyMjAsLTE2KCVyMzApCi0JZmxkd3MgLTE2KCVyMzApLCVmcjUKLQlzdHcgJXIyMSwtMTYoJXIzMCkKLQlmbGR3cyAtMTYoJXIzMCksJWZyNVIKLQl4bXB5dSAlZnI1LCVmcjVSLCVmcjQKLQlmc3R3cyAlZnI0UiwtMTYoJXIzMCkKLQlsZHcgLTE2KCVyMzApLCVyMjQKLQlzdHcgJXIyNCw4KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDEoJXIwKSwlcjIwCi0Jc3RoICVyMjAsMzQoJXIxOSkKLQlsZHcgOCglcjQpLCVyOQotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDUwLCVyMAotCW5vcAotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksMTYoJXI0KQotCWxkdyAxNiglcjQpLCVyMTkKLQlzdHcgJXIxOSwyMCglcjQpCi0JbGRvIDE2KCVyMCksJXIxOQotCXN0dyAlcjE5LDI0KCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjQoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDA0NSwlcjAKLQlub3AKLQlsZHcgMjAoJXI0KSwlcjI2Ci0JbGR3IDI0KCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMDQ2LCVyMAotTCQwMDQ1OiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAwNDY6IAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgMjQoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAxNiglcjQpLCVyMTkKLQlzdHcgJXIxOSwyOCglcjQpCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwzMiglcjQpCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDMyKCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAwNDcsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDA0NzogCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAyOCglcjQpLCVyMjAKLQlsZHcgMjgoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAyOCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAyOCglcjQpLCVyMTkKLQlsZHcgMjgoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDI4KCVyNCksJXIyMAotCWxkdyAyOCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDQ4LCVyMAotCW5vcAotCWxkdyAyOCglcjQpLCVyMTkKLQlsZHcgMjgoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAwNDksJXIwCi1MJDAwNDg6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDA0OTogCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAyOCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgMzIoJXI0KSwlcjEwCi0JYmwsbiBMJDAwNTEsJXIwCi1MJDAwNTA6IAotCWxkbyAxNiglcjApLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHhtYWxsb2MsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTAKLUwkMDA1MTogCi0Jc3R3ICVyMTAsMzYoJXI5KQotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGRvIDExKCVyMCksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JYWRkaWwgTCdidWlsdGluX3R5cGVfaW50LSRnbG9iYWwkLCVyMjcKLQlsZHcgUididWlsdGluX3R5cGVfaW50LSRnbG9iYWwkKCVyMSksJXIyMAotCXN0dyAlcjIwLDE2KCVyMTkpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkbyA0KCVyMCksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGRvIDIoJXIwKSwlcjIwCi0Jc3RoICVyMjAsMzQoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwNTcsJXIwCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGRvIDEyMCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksMzYoJXI0KQotCWxkdyAzNiglcjQpLCVyMTkKLQlzdHcgJXIxOSw0MCglcjQpCi0JbGRvIDMyKCVyMCksJXIxOQotCXN0dyAlcjE5LDQ0KCVyNCkKLQlsZHcgNDAoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgNDQoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDA1MiwlcjAKLQlub3AKLQlsZHcgNDAoJXI0KSwlcjI2Ci0JbGR3IDQ0KCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMDUzLCVyMAotTCQwMDUyOiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAwNTM6IAotCWxkdyA0MCglcjQpLCVyMTkKLQlsZHcgNDAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgNDQoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyAzNiglcjQpLCVyMTkKLQlzdHcgJXIxOSw0OCglcjQpCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw1MiglcjQpCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JbGR3IDUyKCVyNCksJXIxOQotCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAwNTQsJXIwCi0Jbm9wCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0MCglcjE5KSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlkZXBpIC0xLDEsMSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLUwkMDA1NDogCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgNDgoJXI0KSwlcjIxCi0JbGR3IDEyKCVyMjApLCVyMjAKLQlsZHcgMjQoJXIyMSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyA0OCglcjQpLCVyMjEKLQlsZHcgMjQoJXIyMSksJXIyMgotCXVhZGRjbSAlcjAsJXIyMiwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA0OCglcjQpLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMTkKLQlsZHcgNCglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyA0OCglcjQpLCVyMjEKLQlsZHcgMTYoJXIyMCksJXIyMAotCWxkdyA0KCVyMjEpLCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMjAKLQljb21jbHIsPiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDU1LCVyMAotCW5vcAotCWxkdyA0OCglcjQpLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWNvcHkgJXIyMSwlcjE5Ci0JYmwsbiBMJDAwNTYsJXIwCi1MJDAwNTU6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDA1NjogCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCXN0dyAlcjIxLDgoJXIxOSkKLQlsZHcgNTIoJXI0KSwlcjEwCi0JYmwsbiBMJDAwNTgsJXIwCi1MJDAwNTc6IAotCWxkbyAzMiglcjApLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHhtYWxsb2MsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTAKLUwkMDA1ODogCi0Jc3R3ICVyMTAsMzYoJXI5KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMzYoJXIxOSksJXIyMAotCXN0dyAlcjAsMCglcjIwKQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZG8gMTYoJXIwKSwlcjIwCi0JbGR3IDM2KCVyMTkpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRvIC0xKCVyMjApLCVyMjEKLQlzdHcgJXIyMSwwKCVyMTkpCi0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAzNiglcjIwKSwlcjE5Ci0JYWRkaWwgTCdidWlsdGluX3R5cGVfaW50LSRnbG9iYWwkLCVyMjcKLQlsZHcgUididWlsdGluX3R5cGVfaW50LSRnbG9iYWwkKCVyMSksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGRvIDE2KCVyMCksJXIyMAotCWxkdyAzNiglcjE5KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjE5Ci0JYWRkaWwgTCdidWlsdGluX3R5cGVfaW50LSRnbG9iYWwkLCVyMjcKLQlsZHcgUididWlsdGluX3R5cGVfaW50LSRnbG9iYWwkKCVyMSksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMzYoJXIxOSksJXIyMAotCWxkdyAxMiglcjQpLCVyMTkKLQlzdHcgJXIxOSw4KCVyMjApCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC0xKCVyMCksJXIyMAotCXN0dyAlcjIwLDQ0KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjI4Ci0JYmwsbiBMJDAwNDQsJXIwCi1MJDAwNDQ6IAotCWxkdyA1NiglcjQpLCVyMTAKLQlsZHcgNjAoJXI0KSwlcjkKLQlsZHcgNjQoJXI0KSwlcjgKLQlsZHcgNjgoJXI0KSwlcjcKLQlsZHcgNzIoJXI0KSwlcjYKLQlsZHcgNzYoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIHNtYXNoX3RvX21lbWJlcl90eXBlLENPREUKLQkuRVhQT1JUIHNtYXNoX3RvX21lbWJlcl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLXNtYXNoX3RvX21lbWJlcl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjEwLDE2KCVyNCkKLQlzdHcgJXI5LDIwKCVyNCkKLQlzdHcgJXI4LDI0KCVyNCkKLQlzdHcgJXI3LDI4KCVyNCkKLQlzdHcgJXI2LDMyKCVyNCkKLQlzdHcgJXI1LDM2KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyA1MiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0Jc3R3ICVyMjAsMTIoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC0xMiglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlzdHcgJXIyMSwxNiglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIDEoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gMTQoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotTCQwMDU5OiAKLQlsZHcgMTYoJXI0KSwlcjEwCi0JbGR3IDIwKCVyNCksJXI5Ci0JbGR3IDI0KCVyNCksJXI4Ci0JbGR3IDI4KCVyNCksJXI3Ci0JbGR3IDMyKCVyNCksJXI2Ci0JbGR3IDM2KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBzbWFzaF90b19tZXRob2RfdHlwZSxDT0RFCi0JLkVYUE9SVCBzbWFzaF90b19tZXRob2RfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi1zbWFzaF90b19tZXRob2RfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMiwxNiglcjQpCi0Jc3R3ICVyMTEsMjAoJXI0KQotCXN0dyAlcjEwLDI0KCVyNCkKLQlzdHcgJXI5LDI4KCVyNCkKLQlzdHcgJXI4LDMyKCVyNCkKLQlzdHcgJXI3LDM2KCVyNCkKLQlzdHcgJXI2LDQwKCVyNCkKLQlzdHcgJXI1LDQ0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTE2KCVyMCksJXIxMQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXIxMSwlcjEyCi0Jc3R3ICVyMjMsMCglcjEyKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTEyKCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDE2KCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTE2KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDQ4KCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAxKCVyMCksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIDE1KCVyMCksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLUwkMDA2MDogCi0JbGR3IDE2KCVyNCksJXIxMgotCWxkdyAyMCglcjQpLCVyMTEKLQlsZHcgMjQoJXI0KSwlcjEwCi0JbGR3IDI4KCVyNCksJXI5Ci0JbGR3IDMyKCVyNCksJXI4Ci0JbGR3IDM2KCVyNCksJXI3Ci0JbGR3IDQwKCVyNCksJXI2Ci0JbGR3IDQ0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgc3RybmNtcCxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMDA6IAotCS5TVFJJTkcgInN0cnVjdCBceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDAxOiAKLQkuU1RSSU5HICJ1bmlvbiBceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDAyOiAKLQkuU1RSSU5HICJlbnVtIFx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIHR5cGVfbmFtZV9ub190YWcsQ09ERQotCS5FWFBPUlQgdHlwZV9uYW1lX25vX3RhZyxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotdHlwZV9uYW1lX25vX3RhZzogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDgoJXI0KQotCXN0dyAlcjUsMTIoJXI0KQotCWNvcHkgJXIyNiwlcjUKLQlsZHcgNCglcjUpLCVyNgotCWNvbWljbHIsPD4gMCwlcjYsJXIwCi0JYmwgTCQwMDYyLCVyMAotCW5vcAotCWxkdyAwKCVyNSksJXIxOQotCWNvbWljbHIsPD4gNCwlcjE5LCVyMAotCWJsIEwkMDA2NiwlcjAKLQlub3AKLQljb21pY2xyLD49IDQsJXIxOSwlcjAKLQlibCBMJDAwNzIsJXIwCi0Jbm9wCi0JY29taWNsciw8PiAzLCVyMTksJXIwCi0JYmwgTCQwMDY0LCVyMAotCW5vcAotCWJsLG4gTCQwMDcwLCVyMAotTCQwMDcyOiAKLQljb21pY2xyLDw+IDUsJXIxOSwlcjAKLQlibCBMJDAwNjgsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwNzAsJXIwCi1MJDAwNjQ6IAotCWNvcHkgJXI2LCVyMjYKLQlsZGlsIEwnTEMkMDAwMCwlcjI1Ci0JbGRvIFInTEMkMDAwMCglcjI1KSwlcjI1Ci0JbGRvIDcoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdHJuY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwNjUsJXIwCi0Jbm9wCi0JbGRvIDcoJXI2KSwlcjYKLUwkMDA2NTogCi0JYmwsbiBMJDAwNjMsJXIwCi1MJDAwNjY6IAotCWNvcHkgJXI2LCVyMjYKLQlsZGlsIEwnTEMkMDAwMSwlcjI1Ci0JbGRvIFInTEMkMDAwMSglcjI1KSwlcjI1Ci0JbGRvIDYoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdHJuY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwNjcsJXIwCi0Jbm9wCi0JbGRvIDYoJXI2KSwlcjYKLUwkMDA2NzogCi0JYmwsbiBMJDAwNjMsJXIwCi1MJDAwNjg6IAotCWNvcHkgJXI2LCVyMjYKLQlsZGlsIEwnTEMkMDAwMiwlcjI1Ci0JbGRvIFInTEMkMDAwMiglcjI1KSwlcjI1Ci0JbGRvIDUoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdHJuY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwNjksJXIwCi0Jbm9wCi0JbGRvIDUoJXI2KSwlcjYKLUwkMDA2OTogCi0JYmwsbiBMJDAwNjMsJXIwCi1MJDAwNzA6IAotCWJsLG4gTCQwMDYzLCVyMAotTCQwMDYzOiAKLUwkMDA2MjogCi0JY29weSAlcjYsJXIyOAotCWJsLG4gTCQwMDYxLCVyMAotTCQwMDYxOiAKLQlsZHcgOCglcjQpLCVyNgotCWxkdyAxMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGN1cnJlbnRfbGFuZ3VhZ2UsREFUQQotCS5JTVBPUlQgc3RyY21wLENPREUKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1sb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWFkZGlsIEwnY3VycmVudF9sYW5ndWFnZS0kZ2xvYmFsJCwlcjI3Ci0JbGR3IFInY3VycmVudF9sYW5ndWFnZS0kZ2xvYmFsJCglcjEpLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi1MJDAwNzQ6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwNzUsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgNCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwNzcsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyAwKCVyMjApLCVyMjgKLQlibCxuIEwkMDA3MywlcjAKLUwkMDA3NzogCi1MJDAwNzY6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyA0KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDA3NCwlcjAKLUwkMDA3NTogCi0JY29weSAlcjAsJXIyOAotCWJsLG4gTCQwMDczLCVyMAotTCQwMDczOiAKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBsb29rdXBfc3ltYm9sLENPREUKLQkuSU1QT1JUIGVycm9yLENPREUKLQkuYWxpZ24gNAotTEMkMDAwMzogCi0JLlNUUklORyAiTm8gdHlwZSBuYW1lZCAlcy5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfdHlwZW5hbWUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3R5cGVuYW1lLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsUlROVkFMPUdSCi1sb29rdXBfdHlwZW5hbWU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTIsOCglcjQpCi0Jc3R3ICVyMTEsMTIoJXI0KQotCXN0dyAlcjEwLDE2KCVyNCkKLQlzdHcgJXI5LDIwKCVyNCkKLQlzdHcgJXI4LDI0KCVyNCkKLQlzdHcgJXI3LDI4KCVyNCkKLQlzdHcgJXI2LDMyKCVyNCkKLQlzdHcgJXI1LDM2KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlzdHcgJXIwLC01MiglcjMwKQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JbGRvIDEoJXIwKSwlcjI0Ci0JY29weSAlcjAsJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgbG9va3VwX3N5bWJvbCwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMQotCWNvbWljbHIsPD4gMCwlcjExLCVyMAotCWJsIEwkMDA4MCwlcjAKLQlub3AKLQlsZHcgOCglcjExKSwlcjE5Ci0JY29taWNsciw9IDgsJXIxOSwlcjAKLQlibCBMJDAwODAsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwNzksJXIwCi1MJDAwODA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTIKLQljb21pY2xyLDw+IDAsJXIxMiwlcjAKLQlibCBMJDAwODEsJXIwCi0Jbm9wCi0JY29weSAlcjEyLCVyMjgKLQlibCxuIEwkMDA3OCwlcjAKLQlibCxuIEwkMDA4MiwlcjAKLUwkMDA4MTogCi0JY29taWNsciw9IDAsJXIxMiwlcjAKLQlibCBMJDAwODMsJXIwCi0Jbm9wCi0JbGRvIC0xMiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwODMsJXIwCi0Jbm9wCi0JY29weSAlcjAsJXIyOAotCWJsLG4gTCQwMDc4LCVyMAotCWJsLG4gTCQwMDg0LCVyMAotTCQwMDgzOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwMywlcjI2Ci0JbGRvIFInTEMkMDAwMyglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwODQ6IAotTCQwMDgyOiAKLUwkMDA3OTogCi0JbGR3IDEyKCVyMTEpLCVyMjgKLQlibCxuIEwkMDA3OCwlcjAKLUwkMDA3ODogCi0JbGR3IDgoJXI0KSwlcjEyCi0JbGR3IDEyKCVyNCksJXIxMQotCWxkdyAxNiglcjQpLCVyMTAKLQlsZHcgMjAoJXI0KSwlcjkKLQlsZHcgMjQoJXI0KSwlcjgKLQlsZHcgMjgoJXI0KSwlcjcKLQlsZHcgMzIoJXI0KSwlcjYKLQlsZHcgMzYoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBhbGxvY2EsQ09ERQotCS5JTVBPUlQgc3RybGVuLENPREUKLQkuSU1QT1JUIHN0cmNweSxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMDQ6IAotCS5TVFJJTkcgInVuc2lnbmVkIFx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF91bnNpZ25lZF90eXBlbmFtZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfdW5zaWduZWRfdHlwZW5hbWUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKLWxvb2t1cF91bnNpZ25lZF90eXBlbmFtZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBzdHJsZW4sJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZG8gMTAoJXIxOSksJXIyMAotCWxkbyA3KCVyMjApLCVyMjEKLQljb3B5ICVyMjEsJXIxOQotCWxkbyA2MyglcjE5KSwlcjIwCi0JZXh0cnUgJXIyMCwyNSwyNiwlcjE5Ci0JemRlcCAlcjE5LDI1LDI2LCVyMjAKLQlsZG8gLTk2KCVyMzApLCVyMTkKLQlhZGQgJXIzMCwlcjIwLCVyMzAKLQlsZG8gNyglcjE5KSwlcjIwCi0JZXh0cnUgJXIyMCwyOCwyOSwlcjE5Ci0JemRlcCAlcjE5LDI4LDI5LCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMjYKLQlsZGlsIEwnTEMkMDAwNCwlcjI1Ci0JbGRvIFInTEMkMDAwNCglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjcHksJXIyCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjIwCi0JbGRvIDkoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY3B5LCVyMgotCW5vcAotCWxkdyA4KCVyNCksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBsb29rdXBfdHlwZW5hbWUsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwODUsJXIwCi1MJDAwODU6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDAwNTogCi0JLlNUUklORyAic2lnbmVkIFx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9zaWduZWRfdHlwZW5hbWUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3NpZ25lZF90eXBlbmFtZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX3NpZ25lZF90eXBlbmFtZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBzdHJsZW4sJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZG8gOCglcjE5KSwlcjIwCi0JbGRvIDcoJXIyMCksJXIyMQotCWNvcHkgJXIyMSwlcjE5Ci0JbGRvIDYzKCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI1LDI2LCVyMTkKLQl6ZGVwICVyMTksMjUsMjYsJXIyMAotCWxkbyAtOTYoJXIzMCksJXIxOQotCWFkZCAlcjMwLCVyMjAsJXIzMAotCWxkbyA3KCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI4LDI5LCVyMTkKLQl6ZGVwICVyMTksMjgsMjksJXIyMAotCXN0dyAlcjIwLDEyKCVyNCkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMDUsJXIyNQotCWxkbyBSJ0xDJDAwMDUoJXIyNSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY3B5LCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjAKLQlsZG8gNyglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjcHksJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIGxvb2t1cF90eXBlbmFtZSwlcjIKLQlub3AKLQlzdHcgJXIyOCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAwODcsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjI4Ci0JYmwsbiBMJDAwODYsJXIwCi1MJDAwODc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JY29weSAlcjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbG9va3VwX3R5cGVuYW1lLCVyMgotCW5vcAotCWJsLG4gTCQwMDg2LCVyMAotTCQwMDg2OiAKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLUxDJDAwMDY6IAotCS5TVFJJTkcgIk5vIHN0cnVjdCB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMDc6IAotCS5TVFJJTkcgIlRoaXMgY29udGV4dCBoYXMgY2xhc3MsIHVuaW9uIG9yIGVudW0gJXMsIG5vdCBhIHN0cnVjdC5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfc3RydWN0LENPREUKLQkuRVhQT1JUIGxvb2t1cF9zdHJ1Y3QsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLWxvb2t1cF9zdHJ1Y3Q6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOSw4KCVyNCkKLQlzdHcgJXI4LDEyKCVyNCkKLQlzdHcgJXI3LDE2KCVyNCkKLQlzdHcgJXI2LDIwKCVyNCkKLQlzdHcgJXI1LDI0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlzdHcgJXIwLC01MiglcjMwKQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JY29weSAlcjAsJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgbG9va3VwX3N5bWJvbCwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JY29taWNsciw9IDAsJXI5LCVyMAotCWJsIEwkMDA4OSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwNiwlcjI2Ci0JbGRvIFInTEMkMDAwNiglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwODk6IAotCWxkdyAxMiglcjkpLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAzLCVyMjAsJXIwCi0JYmwgTCQwMDkwLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDA3LCVyMjYKLQlsZG8gUidMQyQwMDA3KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5MDogCi0JbGR3IDEyKCVyOSksJXIyOAotCWJsLG4gTCQwMDg4LCVyMAotTCQwMDg4OiAKLQlsZHcgOCglcjQpLCVyOQotCWxkdyAxMiglcjQpLCVyOAotCWxkdyAxNiglcjQpLCVyNwotCWxkdyAyMCglcjQpLCVyNgotCWxkdyAyNCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDAwODogCi0JLlNUUklORyAiTm8gdW5pb24gdHlwZSBuYW1lZCAlcy5ceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDA5OiAKLQkuU1RSSU5HICJUaGlzIGNvbnRleHQgaGFzIGNsYXNzLCBzdHJ1Y3Qgb3IgZW51bSAlcywgbm90IGEgdW5pb24uXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3VuaW9uLENPREUKLQkuRVhQT1JUIGxvb2t1cF91bmlvbixFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbG9va3VwX3VuaW9uOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjksOCglcjQpCi0Jc3R3ICVyOCwxMiglcjQpCi0Jc3R3ICVyNywxNiglcjQpCi0Jc3R3ICVyNiwyMCglcjQpCi0Jc3R3ICVyNSwyNCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0Jc3R3ICVyMCwtNTIoJXIzMCkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWNvcHkgJXIwLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGxvb2t1cF9zeW1ib2wsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWNvbWljbHIsPSAwLCVyOSwlcjAKLQlibCBMJDAwOTIsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMDgsJXIyNgotCWxkbyBSJ0xDJDAwMDgoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDkyOiAKLQlsZHcgMTIoJXI5KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gNCwlcjIwLCVyMAotCWJsIEwkMDA5MywlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwOSwlcjI2Ci0JbGRvIFInTEMkMDAwOSglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwOTM6IAotCWxkdyAxMiglcjkpLCVyMjgKLQlibCxuIEwkMDA5MSwlcjAKLUwkMDA5MTogCi0JbGR3IDgoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjgKLQlsZHcgMTYoJXI0KSwlcjcKLQlsZHcgMjAoJXI0KSwlcjYKLQlsZHcgMjQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLUxDJDAwMTA6IAotCS5TVFJJTkcgIk5vIGVudW0gdHlwZSBuYW1lZCAlcy5ceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDExOiAKLQkuU1RSSU5HICJUaGlzIGNvbnRleHQgaGFzIGNsYXNzLCBzdHJ1Y3Qgb3IgdW5pb24gJXMsIG5vdCBhbiBlbnVtLlx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9lbnVtLENPREUKLQkuRVhQT1JUIGxvb2t1cF9lbnVtLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1sb29rdXBfZW51bTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI5LDgoJXI0KQotCXN0dyAlcjgsMTIoJXI0KQotCXN0dyAlcjcsMTYoJXI0KQotCXN0dyAlcjYsMjAoJXI0KQotCXN0dyAlcjUsMjQoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCXN0dyAlcjAsLTUyKCVyMzApCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQljb21pY2xyLD0gMCwlcjksJXIwCi0JYmwgTCQwMDk1LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDEwLCVyMjYKLQlsZG8gUidMQyQwMDEwKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5NTogCi0JbGR3IDEyKCVyOSksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDUsJXIyMCwlcjAKLQlibCBMJDAwOTYsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMTEsJXIyNgotCWxkbyBSJ0xDJDAwMTEoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDk2OiAKLQlsZHcgMTIoJXI5KSwlcjI4Ci0JYmwsbiBMJDAwOTQsJXIwCi1MJDAwOTQ6IAotCWxkdyA4KCVyNCksJXI5Ci0JbGR3IDEyKCVyNCksJXI4Ci0JbGR3IDE2KCVyNCksJXI3Ci0JbGR3IDIwKCVyNCksJXI2Ci0JbGR3IDI0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgc3RyY2F0LENPREUKLQkuYWxpZ24gNAotTEMkMDAxMjogCi0JLlNUUklORyAiPFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMTM6IAotCS5TVFJJTkcgIiA+XHgwMCIKLQkuYWxpZ24gNAotTEMkMDAxNDogCi0JLlNUUklORyAiTm8gdGVtcGxhdGUgdHlwZSBuYW1lZCAlcy5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfdGVtcGxhdGVfdHlwZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfdGVtcGxhdGVfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLFJUTlZBTD1HUgotbG9va3VwX3RlbXBsYXRlX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTEsMTYoJXI0KQotCXN0dyAlcjEwLDIwKCVyNCkKLQlzdHcgJXI5LDI0KCVyNCkKLQlzdHcgJXI4LDI4KCVyNCkKLQlzdHcgJXI3LDMyKCVyNCkKLQlzdHcgJXI2LDM2KCVyNCkKLQlzdHcgJXI1LDQwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBzdHJsZW4sJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTEKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgc3RybGVuLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JYWRkICVyMTEsJXIxOSwlcjIwCi0JbGRvIDQoJXIyMCksJXIxOQotCWxkbyA3KCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIxOQotCWxkbyA2MyglcjE5KSwlcjIwCi0JZXh0cnUgJXIyMCwyNSwyNiwlcjE5Ci0JemRlcCAlcjE5LDI1LDI2LCVyMjAKLQlsZG8gLTk2KCVyMzApLCVyMTkKLQlhZGQgJXIzMCwlcjIwLCVyMzAKLQlsZG8gNyglcjE5KSwlcjIwCi0JZXh0cnUgJXIyMCwyOCwyOSwlcjE5Ci0JemRlcCAlcjE5LDI4LDI5LCVyMjAKLQlzdHcgJXIyMCwxMiglcjQpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNweSwlcjIKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMTIsJXIyNQotCWxkbyBSJ0xDJDAwMTIoJXIyNSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY2F0LCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDQoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY2F0LCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjYKLQlsZGlsIEwnTEMkMDAxMywlcjI1Ci0JbGRvIFInTEMkMDAxMyglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjYXQsJXIyCi0Jbm9wCi0JbGRvIC0xMiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCXN0dyAlcjAsLTUyKCVyMzApCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCXN0dyAlcjI4LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMDk4LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDE0LCVyMjYKLQlsZG8gUidMQyQwMDE0KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5ODogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JY29taWNsciw8PiAzLCVyMTksJXIwCi0JYmwgTCQwMDk5LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDA3LCVyMjYKLQlsZG8gUidMQyQwMDA3KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5OTogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjgKLQlibCxuIEwkMDA5NywlcjAKLUwkMDA5NzogCi0JbGR3IDE2KCVyNCksJXIxMQotCWxkdyAyMCglcjQpLCVyMTAKLQlsZHcgMjQoJXI0KSwlcjkKLQlsZHcgMjgoJXI0KSwlcjgKLQlsZHcgMzIoJXI0KSwlcjcKLQlsZHcgMzYoJXI0KSwlcjYKLQlsZHcgNDAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBjdXJyZW50X3RhcmdldCxEQVRBCi0JLklNUE9SVCBmZmx1c2gsQ09ERQotCS5JTVBPUlQgX19pb2IsREFUQQotCS5JTVBPUlQgZnByaW50ZixDT0RFCi0JLmFsaWduIDQKLUxDJDAwMTU6IAotCS5TVFJJTkcgIlR5cGUgXHgwMCIKLQkuSU1QT1JUIHR5cGVfcHJpbnQsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDE2OiAKLQkuU1RSSU5HICJceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDE3OiAKLQkuU1RSSU5HICIgaXMgbm90IGEgc3RydWN0dXJlIG9yIHVuaW9uIHR5cGUuXHgwMCIKLQkuSU1QT1JUIGNoZWNrX3N0dWJfdHlwZSxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMTg6IAotCS5TVFJJTkcgIiBoYXMgbm8gY29tcG9uZW50IG5hbWVkIFx4MDAiCi0JLklNUE9SVCBmcHV0c19maWx0ZXJlZCxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMTk6IAotCS5TVFJJTkcgIi5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfc3RydWN0X2VsdF90eXBlLENPREUKLQkuRVhQT1JUIGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixSVE5WQUw9R1IKLWxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTEsMjQoJXI0KQotCXN0dyAlcjEwLDI4KCVyNCkKLQlzdHcgJXI5LDMyKCVyNCkKLQlzdHcgJXI4LDM2KCVyNCkKLQlzdHcgJXI3LDQwKCVyNCkKLQlzdHcgJXI2LDQ0KCVyNCkKLQlzdHcgJXI1LDQ4KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMSwlcjIwLCVyMAotCWJsIEwkMDEwMiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyAxNiglcjApLCVyMTkKLQljb21jbHIsPD4gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDEwMiwlcjAKLQlub3AKLQlibCxuIEwkMDEwMSwlcjAKLUwkMDEwMjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMCglcjE5KQotTCQwMTAxOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMywlcjIwLCVyMAotCWJsIEwkMDEwMywlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gNCwlcjIwLCVyMAotCWJsIEwkMDEwMywlcjAKLQlub3AKLQlhZGRpbCBMJ2N1cnJlbnRfdGFyZ2V0LSRnbG9iYWwkLCVyMjcKLQlsZHcgUidjdXJyZW50X3RhcmdldC0kZ2xvYmFsJCglcjEpLCVyMTkKLQlsZHcgNzYoJXIxOSksJXIxMQotCWNvcHkgJXIxMSwlcjIyCi0JLkNBTEwJQVJHVzA9R1IKLQlibCAkJGR5bmNhbGwsJXIzMQotCWNvcHkgJXIzMSwlcjIKLQlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzE2LCVyMjcKLQlsZG8gUidfX2lvYi0kZ2xvYmFsJCsxNiglcjEpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZmbHVzaCwlcjIKLQlub3AKLQlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzMyLCVyMjcKLQlsZG8gUidfX2lvYi0kZ2xvYmFsJCszMiglcjEpLCVyMjYKLQlsZGlsIEwnTEMkMDAxNSwlcjI1Ci0JbGRvIFInTEMkMDAxNSglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBmcHJpbnRmLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDAxNiwlcjI1Ci0JbGRvIFInTEMkMDAxNiglcjI1KSwlcjI1Ci0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI0Ci0JbGRvIC0xKCVyMCksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgdHlwZV9wcmludCwlcjIKLQlub3AKLQlsZGlsIEwnTEMkMDAxNywlcjI2Ci0JbGRvIFInTEMkMDAxNyglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDEwMzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgY2hlY2tfc3R1Yl90eXBlLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzQoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsMTYsJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi1MJDAxMDQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAwKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQljb21jbHIsPj0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDEwNSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMTIoJXI0KQotCWxkdyAxMiglcjQpLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAxMDcsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMTA3LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyOAotCWJsLG4gTCQwMTAwLCVyMAotTCQwMTA3OiAKLUwkMDEwNjogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDEwNCwlcjAKLUwkMDEwNTogCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGRoIDAoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi1MJDAxMDg6IAotCWxkdyA4KCVyNCksJXIxOQotCWNvbWljbHIsPD0gMCwlcjE5LCVyMAotCWJsIEwkMDEwOSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyA4KCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbG9va3VwX3N0cnVjdF9lbHRfdHlwZSwlcjIKLQlub3AKLQlzdHcgJXIyOCwxNiglcjQpCi0JbGR3IDE2KCVyNCksJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDExMSwlcjAKLQlub3AKLQlsZHcgMTYoJXI0KSwlcjI4Ci0JYmwsbiBMJDAxMDAsJXIwCi1MJDAxMTE6IAotTCQwMTEwOiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMTA4LCVyMAotTCQwMTA5OiAKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDExMiwlcjAKLQlub3AKLQljb3B5ICVyMCwlcjI4Ci0JYmwsbiBMJDAxMDAsJXIwCi1MJDAxMTI6IAotCWFkZGlsIEwnY3VycmVudF90YXJnZXQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2N1cnJlbnRfdGFyZ2V0LSRnbG9iYWwkKCVyMSksJXIxOQotCWxkdyA3NiglcjE5KSwlcjExCi0JY29weSAlcjExLCVyMjIKLQkuQ0FMTAlBUkdXMD1HUgotCWJsICQkZHluY2FsbCwlcjMxCi0JY29weSAlcjMxLCVyMgotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMTYsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzE2KCVyMSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZmZsdXNoLCVyMgotCW5vcAotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNgotCWxkaWwgTCdMQyQwMDE1LCVyMjUKLQlsZG8gUidMQyQwMDE1KCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGZwcmludGYsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDE2LCVyMjUKLQlsZG8gUidMQyQwMDE2KCVyMjUpLCVyMjUKLQlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzMyLCVyMjcKLQlsZG8gUidfX2lvYi0kZ2xvYmFsJCszMiglcjEpLCVyMjQKLQlsZG8gLTEoJXIwKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCB0eXBlX3ByaW50LCVyMgotCW5vcAotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNgotCWxkaWwgTCdMQyQwMDE4LCVyMjUKLQlsZG8gUidMQyQwMDE4KCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGZwcmludGYsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZnB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwMTksJXIyNgotCWxkbyBSJ0xDJDAwMTkoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi0JbGRvIC0xKCVyMCksJXIyOAotCWJsLG4gTCQwMTAwLCVyMAotTCQwMTAwOiAKLQlsZHcgMjQoJXI0KSwlcjExCi0JbGR3IDI4KCVyNCksJXIxMAotCWxkdyAzMiglcjQpLCVyOQotCWxkdyAzNiglcjQpLCVyOAotCWxkdyA0MCglcjQpLCVyNwotCWxkdyA0NCglcjQpLCVyNgotCWxkdyA0OCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgZmlsbF9pbl92cHRyX2ZpZWxkbm8sQ09ERQotCS5FWFBPUlQgZmlsbF9pbl92cHRyX2ZpZWxkbm8sRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUgotZmlsbF9pbl92cHRyX2ZpZWxkbm86IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0NCglcjE5KSwlcjIwCi0JY29taWNsciw+IDAsJXIyMCwlcjAKLQlibCBMJDAxMTQsJXIwCi0Jbm9wCi0JbGRvIDEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksOCglcjQpCi1MJDAxMTU6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAwKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMTE2LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZmlsbF9pbl92cHRyX2ZpZWxkbm8sJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0JbGR3IDQ0KCVyMjApLCVyMTkKLQljb21pY2xyLDw9IDAsJXIxOSwlcjAKLQlibCBMJDAxMTgsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgOCglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjcsMjgsJXIyMgotCWxkdyAzNiglcjIwKSwlcjIxCi0JYWRkICVyMjIsJXIyMSwlcjIwCi0JbGR3IDgoJXIyMCksJXIyMQotCWxkdyA0NCglcjIxKSwlcjIwCi0Jc3R3ICVyMjAsNDQoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwyNywyOCwlcjIyCi0JbGR3IDM2KCVyMjApLCVyMjEKLQlhZGQgJXIyMiwlcjIxLCVyMjAKLQlsZHcgOCglcjIwKSwlcjIxCi0JbGR3IDQwKCVyMjEpLCVyMjAKLQlzdHcgJXIyMCw0MCglcjE5KQotCWJsLG4gTCQwMTE2LCVyMAotTCQwMTE4OiAKLUwkMDExNzogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMTE1LCVyMAotTCQwMTE2OiAKLUwkMDExNDogCi1MJDAxMTM6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuRVhQT1JUIHN0dWJfbm9uYW1lX2NvbXBsYWludCxEQVRBCi0JLmFsaWduIDQKLUxDJDAwMjA6IAotCS5TVFJJTkcgInN0dWIgdHlwZSBoYXMgTlVMTCBuYW1lXHgwMCIKLQkuZGF0YQotCi0JLmFsaWduIDQKLXN0dWJfbm9uYW1lX2NvbXBsYWludDogCi0JLndvcmQgTEMkMDAyMAotCS53b3JkIDAKLQkud29yZCAwCi0JLklNUE9SVCBjb21wbGFpbixDT0RFCi0JLklNUE9SVCBtZW1jcHksQ09ERQotCS5jb2RlCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgY2hlY2tfc3R1Yl90eXBlLENPREUKLQkuRVhQT1JUIGNoZWNrX3N0dWJfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSCi1jaGVja19zdHViX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkaCAzMiglcjE5KSwlcjIwCi0JbGRvIDQoJXIwKSwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjE5Ci0JZXh0cnMgJXIxOSwzMSwxNiwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTIwLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHR5cGVfbmFtZV9ub190YWcsJXIyCi0Jbm9wCi0Jc3R3ICVyMjgsOCglcjQpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAxMjEsJXIwCi0Jbm9wCi0JYWRkaWwgTCdzdHViX25vbmFtZV9jb21wbGFpbnQtJGdsb2JhbCQsJXIyNwotCWxkbyBSJ3N0dWJfbm9uYW1lX2NvbXBsYWludC0kZ2xvYmFsJCglcjEpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBjb21wbGFpbiwlcjIKLQlub3AKLQlibCxuIEwkMDExOSwlcjAKLUwkMDEyMTogCi0Jc3R3ICVyMCwtNTIoJXIzMCkKLQlsZHcgOCglcjQpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JY29weSAlcjAsJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgbG9va3VwX3N5bWJvbCwlcjIKLQlub3AKLQlzdHcgJXIyOCwxMiglcjQpCi0JbGR3IDEyKCVyNCksJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDEyMiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkdyAxMiglcjIwKSwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtY3B5LCVyMgotCW5vcAotTCQwMTIyOiAKLUwkMDEyMDogCi1MJDAxMTk6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGdkYl9tYW5nbGVfbmFtZSxDT0RFCi0JLklNUE9SVCBjcGx1c19kZW1hbmdsZSxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMjE6IAotCS5TVFJJTkcgIkludGVybmFsOiBDYW5ub3QgZGVtYW5nbGUgbWFuZ2xlZCBuYW1lIGAlcycuXHgwMCIKLQkuSU1QT1JUIHN0cmNocixDT0RFCi0JLklNUE9SVCBwYXJzZV9hbmRfZXZhbF90eXBlLENPREUKLQkuSU1QT1JUIGJ1aWx0aW5fdHlwZV92b2lkLERBVEEKLQkuSU1QT1JUIGZyZWUsQ09ERQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBjaGVja19zdHViX21ldGhvZCxDT0RFCi0JLkVYUE9SVCBjaGVja19zdHViX21ldGhvZCxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi1jaGVja19zdHViX21ldGhvZDogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMSw2NCglcjQpCi0Jc3R3ICVyMTAsNjgoJXI0KQotCXN0dyAlcjksNzIoJXI0KQotCXN0dyAlcjgsNzYoJXI0KQotCXN0dyAlcjcsODAoJXI0KQotCXN0dyAlcjYsODQoJXI0KQotCXN0dyAlcjUsODgoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkbyAtMTIoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIxLCVyMjEKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCWxkdyAwKCVyMjEpLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIGdkYl9tYW5nbGVfbmFtZSwlcjIKLQlub3AKLQlzdHcgJXIyOCwxMiglcjQpCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkbyAzKCVyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgY3BsdXNfZGVtYW5nbGUsJXIyCi0Jbm9wCi0Jc3R3ICVyMjgsMTYoJXI0KQotCXN0dyAlcjAsMjgoJXI0KQotCWxkbyAxKCVyMCksJXIxOQotCXN0dyAlcjE5LDMyKCVyNCkKLQlsZHcgMTYoJXI0KSwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAxMjQsJXIwCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwMjEsJXIyNgotCWxkbyBSJ0xDJDAwMjEoJXIyNiksJXIyNgotCWxkdyAxMiglcjQpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMTI0OiAKLQlsZHcgMTYoJXI0KSwlcjI2Ci0JbGRvIDQwKCVyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY2hyLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDIwKCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMjQoJXI0KQotTCQwMTI1OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JY29taWNsciw8PiAwLCVyMTksJXIwCi0JYmwgTCQwMTI2LCVyMAotCW5vcAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDAoJXIwKSwlcjIwCi0JY29tY2xyLD0gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDEyNywlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI4KCVyNCkKLQlibCxuIEwkMDEyOCwlcjAKLUwkMDEyNzogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MSglcjApLCVyMjAKLQljb21jbHIsPSAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTI5LCVyMAotCW5vcAotCWxkdyAyOCglcjQpLCVyMTkKLQlsZG8gLTEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI4KCVyNCkKLQlibCxuIEwkMDEzMCwlcjAKLUwkMDEyOTogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0NCglcjApLCVyMjAKLQljb21jbHIsPSAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTMxLCVyMAotCW5vcAotCWxkdyAyOCglcjQpLCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDEzMSwlcjAKLQlub3AKLQlsZHcgMzIoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDMyKCVyNCkKLUwkMDEzMTogCi1MJDAxMzA6IAotTCQwMTI4OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI0KCVyNCkKLQlibCxuIEwkMDEyNSwlcjAKLUwkMDEyNjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTM3LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWxkbyAxMjAoJXIyMCksJXIxOQotCXN0dyAlcjE5LDQ0KCVyNCkKLQlsZHcgNDQoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksNDgoJXI0KQotCWxkdyAzMiglcjQpLCVyMjAKLQlsZG8gMiglcjIwKSwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMjAKLQlzdHcgJXIyMCw1MiglcjQpCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgMTYoJXIxOSksJXIxOQotCWxkdyAxMiglcjIwKSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDUyKCVyNCksJXIyMAotCWNvbWNsciw8ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxMzIsJXIwCi0Jbm9wCi0JbGR3IDQ4KCVyNCksJXIyNgotCWxkdyA1MiglcjQpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIF9vYnN0YWNrX25ld2NodW5rLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMTkKLQlibCxuIEwkMDEzMywlcjAKLUwkMDEzMjogCi0JY29weSAlcjAsJXIxOQotTCQwMTMzOiAKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0JbGR3IDUyKCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgNDQoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksNTYoJXI0KQotCWxkdyA1NiglcjQpLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsNjAoJXI0KQotCWxkdyA1NiglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWxkdyA2MCglcjQpLCVyMTkKLQljb21jbHIsPSAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMTM0LCVyMAotCW5vcAotCWxkdyA1NiglcjQpLCVyMTkKLQlsZHcgNDAoJXIxOSksJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0JZGVwaSAtMSwxLDEsJXIyMQotCXN0dyAlcjIxLDQwKCVyMTkpCi1MJDAxMzQ6IAotCWxkdyA1NiglcjQpLCVyMTkKLQlsZHcgNTYoJXI0KSwlcjIwCi0JbGR3IDU2KCVyNCksJXIyMQotCWxkdyAxMiglcjIwKSwlcjIwCi0JbGR3IDI0KCVyMjEpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQlsZHcgNTYoJXI0KSwlcjIxCi0JbGR3IDI0KCVyMjEpLCVyMjIKLQl1YWRkY20gJXIwLCVyMjIsJXIyMQotCWFuZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgNTYoJXI0KSwlcjE5Ci0JbGR3IDU2KCVyNCksJXIyMAotCWxkdyAxMiglcjE5KSwlcjE5Ci0JbGR3IDQoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyA1NiglcjQpLCVyMjAKLQlsZHcgNTYoJXI0KSwlcjIxCi0JbGR3IDE2KCVyMjApLCVyMjAKLQlsZHcgNCglcjIxKSwlcjIxCi0Jc3ViICVyMjAsJXIyMSwlcjIwCi0JY29tY2xyLD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDEzNSwlcjAKLQlub3AKLQlsZHcgNTYoJXI0KSwlcjE5Ci0JbGR3IDU2KCVyNCksJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQljb3B5ICVyMjEsJXIxOQotCWJsLG4gTCQwMTM2LCVyMAotTCQwMTM1OiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAxMzY6IAotCWxkdyA1NiglcjQpLCVyMTkKLQlsZHcgNTYoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlzdHcgJXIyMSw4KCVyMTkpCi0JbGR3IDYwKCVyNCksJXIxMQotCWJsLG4gTCQwMTM4LCVyMAotTCQwMTM3OiAKLQlsZHcgMzIoJXI0KSwlcjIwCi0JbGRvIDIoJXIyMCksJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjIwCi0JY29weSAlcjIwLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHhtYWxsb2MsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTEKLUwkMDEzODogCi0Jc3R3ICVyMTEsMzYoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlzdHcgJXIxOSwyNCglcjQpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgbG9va3VwX3BvaW50ZXJfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWxkdyAzNiglcjQpLCVyMjAKLQlzdHcgJXIxOSwwKCVyMjApCi0JbGRvIDEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMzIoJXI0KQotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDEoJXIwKSwlcjIwCi0JY29tY2xyLDw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxMzksJXIwCi0Jbm9wCi0Jc3R3ICVyMCwyOCglcjQpCi1MJDAxNDA6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAxNDEsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWNvbWljbHIsPj0gMCwlcjE5LCVyMAotCWJsIEwkMDE0MiwlcjAKLQlub3AKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQ0KCVyMCksJXIyMAotCWNvbWNsciw8PiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTQzLCVyMAotCW5vcAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDEoJXIwKSwlcjIwCi0JY29tY2xyLDw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNDMsJXIwCi0Jbm9wCi0JYmwsbiBMJDAxNDIsJXIwCi1MJDAxNDM6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0Jc3ViICVyMTksJXIyMCwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyNgotCWNvcHkgJXIxOSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBwYXJzZV9hbmRfZXZhbF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JbGR3IDMyKCVyNCksJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIxCi0JbGR3IDM2KCVyNCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMAotCXN0dyAlcjE5LDAoJXIyMCkKLQlsZHcgMzIoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDMyKCVyNCkKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDIwKCVyNCkKLUwkMDE0MjogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MCglcjApLCVyMjAKLQljb21jbHIsPSAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTQ0LCVyMAotCW5vcAotCWxkdyAyOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjgoJXI0KQotCWJsLG4gTCQwMTQ1LCVyMAotTCQwMTQ0OiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQxKCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNDYsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjgoJXI0KQotTCQwMTQ2OiAKLUwkMDE0NTogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyNCglcjQpCi0JYmwsbiBMJDAxNDAsJXIwCi1MJDAxNDE6IAotTCQwMTM5OiAKLQlsZG8gLTIoJXIwKSwlcjE5Ci0JbGR3IDI0KCVyNCksJXIyMAotCWFkZCAlcjE5LCVyMjAsJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0NiglcjApLCVyMjAKLQljb21jbHIsPD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE0NywlcjAKLQlub3AKLQlsZHcgMzIoJXI0KSwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMjAKLQlsZHcgMzYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjE5Ci0JYWRkaWwgTCdidWlsdGluX3R5cGVfdm9pZC0kZ2xvYmFsJCwlcjI3Ci0JbGR3IFInYnVpbHRpbl90eXBlX3ZvaWQtJGdsb2JhbCQoJXIxKSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotCWJsLG4gTCQwMTQ4LCVyMAotTCQwMTQ3OiAKLQlsZHcgMzIoJXI0KSwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMjAKLQlsZHcgMzYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjE5Ci0Jc3R3ICVyMCwwKCVyMTkpCi1MJDAxNDg6IAotCWxkdyAxNiglcjQpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXpkZXAgJXIyMSwzMCwzMSwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMjAoJXIxOSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjE5Ci0JYWRkICVyMTksJXIyMCwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotCWxkbyAtMTIoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMTkKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWFkZCAlcjE5LCVyMjAsJXIxOQotCWxkdyA0KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw0MCglcjQpCi0JbGR3IDQwKCVyNCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotCWxkdyA0MCglcjQpLCVyMTkKLQlsZHcgMzYoJXI0KSwlcjIwCi0Jc3R3ICVyMjAsNDgoJXIxOSkKLQlsZHcgNDAoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyNCksJXIyMAotCWxkaCAzMiglcjIwKSwlcjIxCi0JY29weSAlcjIxLCVyMjAKLQlkZXBpIDAsMjksMSwlcjIwCi0Jc3RoICVyMjAsMzIoJXIxOSkKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjE5Ci0JYWRkICVyMTksJXIyMCwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMTYoJXIxOSksJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0JZGVwaSAwLDQsMSwlcjIxCi0Jc3R3ICVyMjEsMTYoJXIxOSkKLUwkMDEyMzogCi0JbGR3IDY0KCVyNCksJXIxMQotCWxkdyA2OCglcjQpLCVyMTAKLQlsZHcgNzIoJXI0KSwlcjkKLQlsZHcgNzYoJXI0KSwlcjgKLQlsZHcgODAoJXI0KSwlcjcKLQlsZHcgODQoJXI0KSwlcjYKLQlsZHcgODgoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIGFsbG9jYXRlX2NwbHVzX3N0cnVjdF90eXBlLENPREUKLQkuRVhQT1JUIGFsbG9jYXRlX2NwbHVzX3N0cnVjdF90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IKLWFsbG9jYXRlX2NwbHVzX3N0cnVjdF90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjgsMzIoJXI0KQotCXN0dyAlcjcsMzYoJXI0KQotCXN0dyAlcjYsNDAoJXI0KQotCXN0dyAlcjUsNDQoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNTAsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXI3Ci0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTU2LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWxkbyAxMjAoJXIyMCksJXIxOQotCXN0dyAlcjE5LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyNCkKLQlsZG8gMjQoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMTYoJXI0KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMTkKLQlsZHcgMTIoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAxNiglcjQpLCVyMjAKLQljb21jbHIsPCAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTUxLCVyMAotCW5vcAotCWxkdyAxMiglcjQpLCVyMjYKLQlsZHcgMTYoJXI0KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKLQlub3AKLQljb3B5ICVyMCwlcjE5Ci0JYmwsbiBMJDAxNTIsJXIwCi1MJDAxNTE6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDE1MjogCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCWxkdyAxNiglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMjAoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjQoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWxkdyAyNCglcjQpLCVyMTkKLQljb21jbHIsPSAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMTUzLCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgNDAoJXIxOSksJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0JZGVwaSAtMSwxLDEsJXIyMQotCXN0dyAlcjIxLDQwKCVyMTkpCi1MJDAxNTM6IAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAxMiglcjIwKSwlcjIwCi0JbGR3IDI0KCVyMjEpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDI0KCVyMjEpLCVyMjIKLQl1YWRkY20gJXIwLCVyMjIsJXIyMQotCWFuZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxMiglcjE5KSwlcjE5Ci0JbGR3IDQoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDE2KCVyMjApLCVyMjAKLQlsZHcgNCglcjIxKSwlcjIxCi0Jc3ViICVyMjAsJXIyMSwlcjIwCi0JY29tY2xyLD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE1NCwlcjAKLQlub3AKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQljb3B5ICVyMjEsJXIxOQotCWJsLG4gTCQwMTU1LCVyMAotTCQwMTU0OiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAxNTU6IAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlzdHcgJXIyMSw4KCVyMTkpCi0JbGR3IDI0KCVyNCksJXI4Ci0JYmwsbiBMJDAxNTcsJXIwCi1MJDAxNTY6IAotCWxkbyAyNCglcjApLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHhtYWxsb2MsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOAotTCQwMTU3OiAKLQlzdHcgJXI4LDQ4KCVyNykKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ4KCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWxkd3MsbWEgNCglcjIyKSwlcjE5Ci0JbGR3cyxtYSA0KCVyMjIpLCVyMjAKLQlzdHdzLG1hICVyMTksNCglcjIxKQotCWxkd3MsbWEgNCglcjIyKSwlcjE5Ci0Jc3R3cyxtYSAlcjIwLDQoJXIyMSkKLQlsZHdzLG1hIDQoJXIyMiksJXIyMAotCXN0d3MsbWEgJXIxOSw0KCVyMjEpCi0JbGR3cyxtYSA0KCVyMjIpLCVyMTkKLQlzdHdzLG1hICVyMjAsNCglcjIxKQotCWxkd3MsbWEgNCglcjIyKSwlcjIwCi0Jc3R3cyxtYSAlcjE5LDQoJXIyMSkKLQlzdHcgJXIyMCwwKCVyMjEpCi1MJDAxNTA6IAotTCQwMTQ5OiAKLQlsZHcgMzIoJXI0KSwlcjgKLQlsZHcgMzYoJXI0KSwlcjcKLQlsZHcgNDAoJXI0KSwlcjYKLQlsZHcgNDQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBvYnNhdmVzdHJpbmcsQ09ERQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBpbml0X3R5cGUsQ09ERQotCS5FWFBPUlQgaW5pdF90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IsUlROVkFMPUdSCi1pbml0X3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTQsOCglcjQpCi0Jc3R3ICVyMTMsMTIoJXI0KQotCXN0dyAlcjEyLDE2KCVyNCkKLQlzdHcgJXIxMSwyMCglcjQpCi0Jc3R3ICVyMTAsMjQoJXI0KQotCXN0dyAlcjksMjgoJXI0KQotCXN0dyAlcjgsMzIoJXI0KQotCXN0dyAlcjcsMzYoJXI0KQotCXN0dyAlcjYsNDAoJXI0KQotCXN0dyAlcjUsNDQoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtMTYoJXIwKSwlcjExCi0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjExLCVyMTIKLQlzdHcgJXIyMywwKCVyMTIpCi0JbGRvIC0yMCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGFsbG9jX3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTMKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMCglcjEzKQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyMTMpCi0JbGRvIC0xMiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaCAzMiglcjEzKSwlcjIwCi0JbGRoIDIoJXIxOSksJXIxOQotCW9yICVyMjAsJXIxOSwlcjIwCi0Jc3RoICVyMjAsMzIoJXIxMykKLQlsZG8gLTE2KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDE1OSwlcjAKLQlub3AKLQlsZG8gLTIwKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDE1OSwlcjAKLQlub3AKLQlsZG8gLTE2KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE0Ci0JbGRvIC0xNiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHN0cmxlbiwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWxkbyAtMjAoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGRvIDEyMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxNCksJXIyNgotCWNvcHkgJXIxOSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG9ic2F2ZXN0cmluZywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCXN0dyAlcjE5LDQoJXIxMykKLQlibCxuIEwkMDE2MCwlcjAKLUwkMDE1OTogCi0JbGRvIC0xNiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw0KCVyMTMpCi1MJDAxNjA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDMsJXIyMCwlcjAKLQlibCBMJDAxNjIsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gNCwlcjIwLCVyMAotCWJsIEwkMDE2MiwlcjAKLQlub3AKLQlibCxuIEwkMDE2MSwlcjAKLUwkMDE2MjogCi0Jc3R3ICVyMTksNDgoJXIxMykKLUwkMDE2MTogCi0JY29weSAlcjEzLCVyMjgKLQlibCxuIEwkMDE1OCwlcjAKLUwkMDE1ODogCi0JbGR3IDgoJXI0KSwlcjE0Ci0JbGR3IDEyKCVyNCksJXIxMwotCWxkdyAxNiglcjQpLCVyMTIKLQlsZHcgMjAoJXI0KSwlcjExCi0JbGR3IDI0KCVyNCksJXIxMAotCWxkdyAyOCglcjQpLCVyOQotCWxkdyAzMiglcjQpLCVyOAotCWxkdyAzNiglcjQpLCVyNwotCWxkdyA0MCglcjQpLCVyNgotCWxkdyA0NCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDAyMjogCi0JLlNUUklORyAiaW50ZXJuYWwgZXJyb3IgLSBpbnZhbGlkIGZ1bmRhbWVudGFsIHR5cGUgaWQgJWRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDIzOiAKLQkuU1RSSU5HICJpbnRlcm5hbCBlcnJvcjogdW5oYW5kbGVkIHR5cGUgaWQgJWRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDI0OiAKLQkuU1RSSU5HICJ2b2lkXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyNTogCi0JLlNUUklORyAiYm9vbGVhblx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjY6IAotCS5TVFJJTkcgInN0cmluZ1x4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjc6IAotCS5TVFJJTkcgImNoYXJceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDI4OiAKLQkuU1RSSU5HICJzaWduZWQgY2hhclx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjk6IAotCS5TVFJJTkcgInVuc2lnbmVkIGNoYXJceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDMwOiAKLQkuU1RSSU5HICJzaG9ydFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzE6IAotCS5TVFJJTkcgInVuc2lnbmVkIHNob3J0XHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzMjogCi0JLlNUUklORyAiaW50XHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzMzogCi0JLlNUUklORyAidW5zaWduZWQgaW50XHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzNDogCi0JLlNUUklORyAiZml4ZWQgZGVjaW1hbFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzU6IAotCS5TVFJJTkcgImxvbmdceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM2OiAKLQkuU1RSSU5HICJ1bnNpZ25lZCBsb25nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzNzogCi0JLlNUUklORyAibG9uZyBsb25nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzODogCi0JLlNUUklORyAic2lnbmVkIGxvbmcgbG9uZ1x4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzk6IAotCS5TVFJJTkcgInVuc2lnbmVkIGxvbmcgbG9uZ1x4MDAiCi0JLmFsaWduIDQKLUxDJDAwNDA6IAotCS5TVFJJTkcgImZsb2F0XHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0MTogCi0JLlNUUklORyAiZG91YmxlXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0MjogCi0JLlNUUklORyAiZmxvYXRpbmcgZGVjaW1hbFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNDM6IAotCS5TVFJJTkcgImxvbmcgZG91YmxlXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0NDogCi0JLlNUUklORyAiY29tcGxleFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNDU6IAotCS5TVFJJTkcgImRvdWJsZSBjb21wbGV4XHgwMCIKLQkuYWxpZ24gNAotTEMkMDA0NjogCi0JLlNUUklORyAibG9uZyBkb3VibGUgY29tcGxleFx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlLENPREUKLQkuRVhQT1JUIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1sb29rdXBfZnVuZGFtZW50YWxfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMiwzMiglcjQpCi0Jc3R3ICVyMTEsMzYoJXI0KQotCXN0dyAlcjEwLDQwKCVyNCkKLQlzdHcgJXI5LDQ0KCVyNCkKLQlzdHcgJXI4LDQ4KCVyNCkKLQlzdHcgJXI3LDUyKCVyNCkKLQlzdHcgJXI2LDU2KCVyNCkKLQlzdHcgJXI1LDYwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQljb3B5ICVyMCwlcjkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PSAwLCVyMjAsJXIwCi0JYmwgTCQwMTY1LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gMjUoJXIwKSwlcjE5Ci0JY29tY2xyLDw9ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxNjUsJXIwCi0Jbm9wCi0JYmwsbiBMJDAxNjQsJXIwCi1MJDAxNjU6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDIyLCVyMjYKLQlsZG8gUidMQyQwMDIyKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLQlibCxuIEwkMDE2NiwlcjAKLUwkMDE2NDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxOTYoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMTY3LCVyMAotCW5vcAotCWxkbyAxMDQoJXIwKSwlcjExCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIxMgotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gMTIwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwxMiglcjQpCi0Jc3R3ICVyMTEsMTYoJXI0KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMTkKLQlsZHcgMTIoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAxNiglcjQpLCVyMjAKLQljb21jbHIsPCAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTY4LCVyMAotCW5vcAotCWxkdyAxMiglcjQpLCVyMjYKLQlsZHcgMTYoJXI0KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKLQlub3AKLQljb3B5ICVyMCwlcjE5Ci0JYmwsbiBMJDAxNjksJXIwCi1MJDAxNjg6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDE2OTogCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCWxkdyAxNiglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMjAoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjQoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWxkdyAyNCglcjQpLCVyMTkKLQljb21jbHIsPSAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMTcwLCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgNDAoJXIxOSksJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0JZGVwaSAtMSwxLDEsJXIyMQotCXN0dyAlcjIxLDQwKCVyMTkpCi1MJDAxNzA6IAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAxMiglcjIwKSwlcjIwCi0JbGR3IDI0KCVyMjEpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDI0KCVyMjEpLCVyMjIKLQl1YWRkY20gJXIwLCVyMjIsJXIyMQotCWFuZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxMiglcjE5KSwlcjE5Ci0JbGR3IDQoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDE2KCVyMjApLCVyMjAKLQlsZHcgNCglcjIxKSwlcjIxCi0Jc3ViICVyMjAsJXIyMSwlcjIwCi0JY29tY2xyLD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE3MSwlcjAKLQlub3AKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQljb3B5ICVyMjEsJXIxOQotCWJsLG4gTCQwMTcyLCVyMAotTCQwMTcxOiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAxNzI6IAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlzdHcgJXIyMSw4KCVyMTkpCi0JbGR3IDI0KCVyNCksJXIxOQotCXN0dyAlcjE5LDE5NiglcjEyKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTk2KCVyMTkpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JY29weSAlcjExLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIKLQlub3AKLUwkMDE2NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWxkdyAxOTYoJXIxOSksJXIxOQotCWFkZCAlcjIwLCVyMTksJXIxMAotCWxkdyAwKCVyMTApLCVyOQotCWNvbWljbHIsPSAwLCVyOSwlcjAKLQlibCBMJDAxNzMsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWFkZGksdXYgLTI2LCVyMjAsJXIwCi0JYmxyLG4gJXIyMCwlcjAKLQliLG4gTCQwMTc1Ci1MJDAyMDI6IAotCWIgTCQwMTc2Ci0Jbm9wCi0JYiBMJDAxNzcKLQlub3AKLQliIEwkMDE3OQotCW5vcAotCWIgTCQwMTgwCi0Jbm9wCi0JYiBMJDAxODEKLQlub3AKLQliIEwkMDE4MgotCW5vcAotCWIgTCQwMTgzCi0Jbm9wCi0JYiBMJDAxODQKLQlub3AKLQliIEwkMDE4NQotCW5vcAotCWIgTCQwMTg2Ci0Jbm9wCi0JYiBMJDAxODcKLQlub3AKLQliIEwkMDE4OQotCW5vcAotCWIgTCQwMTkwCi0Jbm9wCi0JYiBMJDAxOTEKLQlub3AKLQliIEwkMDE5MgotCW5vcAotCWIgTCQwMTkzCi0Jbm9wCi0JYiBMJDAxOTQKLQlub3AKLQliIEwkMDE5NQotCW5vcAotCWIgTCQwMTk2Ci0Jbm9wCi0JYiBMJDAxOTgKLQlub3AKLQliIEwkMDE5OQotCW5vcAotCWIgTCQwMjAwCi0Jbm9wCi0JYiBMJDAyMDEKLQlub3AKLQliIEwkMDE3OAotCW5vcAotCWIgTCQwMTg4Ci0Jbm9wCi0JYiBMJDAxOTcKLQlub3AKLUwkMDE3NTogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMjMsJXIyNgotCWxkbyBSJ0xDJDAwMjMoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTc2OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDkoJXIwKSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDI0LCVyMjMKLQlsZG8gUidMQyQwMDI0KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxNzc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gNCglcjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAyNSwlcjIzCi0JbGRvIFInTEMkMDAyNSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTc4OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDEyKCVyMCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAyNiwlcjIzCi0JbGRvIFInTEMkMDAyNiglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTc5OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDI3LCVyMjMKLQlsZG8gUidMQyQwMDI3KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAyOCwlcjIzCi0JbGRvIFInTEMkMDAyOCglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTgxOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JbGRvIDEoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMjksJXIyMwotCWxkbyBSJ0xDJDAwMjkoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4MjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyAyKCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAzMCwlcjIzCi0JbGRvIFInTEMkMDAzMCglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTgzOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDIoJXIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzAsJXIyMwotCWxkbyBSJ0xDJDAwMzAoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4NDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyAyKCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDMxLCVyMjMKLQlsZG8gUidMQyQwMDMxKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODU6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gNCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzIsJXIyMwotCWxkbyBSJ0xDJDAwMzIoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4NjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDMyLCVyMjMKLQlsZG8gUidMQyQwMDMyKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gNCglcjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzMywlcjIzCi0JbGRvIFInTEMkMDAzMyglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTg4OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDM0LCVyMjMKLQlsZG8gUidMQyQwMDM0KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODk6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gNCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzUsJXIyMwotCWxkbyBSJ0xDJDAwMzUoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5MDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDM1LCVyMjMKLQlsZG8gUidMQyQwMDM1KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTE6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gNCglcjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzNiwlcjIzCi0JbGRvIFInTEMkMDAzNiglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTkyOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDgoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDM3LCVyMjMKLQlsZG8gUidMQyQwMDM3KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTM6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzOCwlcjIzCi0JbGRvIFInTEMkMDAzOCglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk0OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDgoJXIwKSwlcjI1Ci0JbGRvIDEoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzksJXIyMwotCWxkbyBSJ0xDJDAwMzkoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5NTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA4KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDA0MCwlcjIzCi0JbGRvIFInTEMkMDA0MCglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk2OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDgoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQxLCVyMjMKLQlsZG8gUidMQyQwMDQxKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwNDIsJXIyMwotCWxkbyBSJ0xDJDAwNDIoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5ODogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA4KCVyMCksJXIyNgotCWxkbyAxNiglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwNDMsJXIyMwotCWxkbyBSJ0xDJDAwNDMoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5OTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA4KCVyMCksJXIyNgotCWxkbyA4KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDA0NCwlcjIzCi0JbGRvIFInTEMkMDA0NCglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMjAwOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDE2KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDA0NSwlcjIzCi0JbGRvIFInTEMkMDA0NSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMjAxOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDE2KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDA0NiwlcjIzCi0JbGRvIFInTEMkMDA0NiglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTc0OiAKLQlzdHcgJXI5LDAoJXIxMCkKLUwkMDE3MzogCi1MJDAxNjY6IAotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDE2MywlcjAKLUwkMDE2MzogCi0JbGR3IDMyKCVyNCksJXIxMgotCWxkdyAzNiglcjQpLCVyMTEKLQlsZHcgNDAoJXI0KSwlcjEwCi0JbGR3IDQ0KCVyNCksJXI5Ci0JbGR3IDQ4KCVyNCksJXI4Ci0JbGR3IDUyKCVyNCksJXI3Ci0JbGR3IDU2KCVyNCksJXI2Ci0JbGR3IDYwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgcHV0c19maWx0ZXJlZCxDT0RFCi0JLmFsaWduIDQKLUxDJDAwNDc6IAotCS5TVFJJTkcgIiBceDAwIgotCS5JTVBPUlQgcHJpbnRmX2ZpbHRlcmVkLENPREUKLQkuYWxpZ24gNAotTEMkMDA0ODogCi0JLlNUUklORyAiMVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNDk6IAotCS5TVFJJTkcgIjBceDAwIgotCS5hbGlnbiA0Ci1wcmludF9iaXRfdmVjdG9yOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjgsMTYoJXI0KQotCXN0dyAlcjcsMjAoJXI0KQotCXN0dyAlcjYsMjQoJXI0KQotCXN0dyAlcjUsMjgoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCXN0dyAlcjAsOCglcjQpCi1MJDAyMDQ6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWxkdyAwKCVyMTkpLCVyMTkKLQljb21jbHIsPCAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMjA1LCVyMAotCW5vcAotCWxkdyA4KCVyNCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWNvbWljbHIsPiAwLCVyMTksJXIwCi0JYmwgTCQwMjA4LCVyMAotCW5vcAotCWxkbyA3KCVyMTkpLCVyMTkKLUwkMDIwODogCi0JZXh0cnMgJXIxOSwyOCwyOSwlcjE5Ci0JemRlcCAlcjE5LDI4LDI5LCVyMjEKLQlzdWIgJXIyMCwlcjIxLCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDIwNywlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDA0NywlcjI2Ci0JbGRvIFInTEMkMDA0NyglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwdXRzX2ZpbHRlcmVkLCVyMgotCW5vcAotTCQwMjA3OiAKLQlsZHcgOCglcjQpLCVyMjAKLQlleHRycyAlcjIwLDI4LDI5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JYWRkICVyMTksJXIyMSwlcjIwCi0JbGRiIDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWV4dHJ1ICVyMjAsMzEsMywlcjIxCi0Jc3ViaSw+Pj0gMzEsJXIyMSwlcjIwCi0JY29weSAlcjAsJXIyMAotCW10c2FyICVyMjAKLQl2ZXh0cnMgJXIxOSwzMiwlcjE5Ci0JZXh0cnUgJXIxOSwzMSwxLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyMDksJXIwCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNDgsJXIyNgotCWxkbyBSJ0xDJDAwNDgoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjEwLCVyMAotTCQwMjA5OiAKLQlsZGlsIEwnTEMkMDA0OSwlcjI2Ci0JbGRvIFInTEMkMDA0OSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyMTA6IAotTCQwMjA2OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JYmwsbiBMJDAyMDQsJXIwCi1MJDAyMDU6IAotTCQwMjAzOiAKLQlsZHcgMTYoJXI0KSwlcjgKLQlsZHcgMjAoJXI0KSwlcjcKLQlsZHcgMjQoJXI0KSwlcjYKLQlsZHcgMjgoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCByZWN1cnNpdmVfZHVtcF90eXBlLENPREUKLQkuYWxpZ24gNAotcHJpbnRfYXJnX3R5cGVzOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjgsOCglcjQpCi0Jc3R3ICVyNywxMiglcjQpCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDIxMiwlcjAKLQlub3AKLUwkMDIxMzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyMTQsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZG8gMiglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWN1cnNpdmVfZHVtcF90eXBlLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gNCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMCglcjE5KQotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDksJXIyMCwlcjAKLQlibCBMJDAyMTUsJXIwCi0Jbm9wCi0JYmwsbiBMJDAyMTQsJXIwCi1MJDAyMTU6IAotCWJsLG4gTCQwMjEzLCVyMAotTCQwMjE0OiAKLUwkMDIxMjogCi1MJDAyMTE6IAotCWxkdyA4KCVyNCksJXI4Ci0JbGR3IDEyKCVyNCksJXI3Ci0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgcHJpbnRmaV9maWx0ZXJlZCxDT0RFCi0JLmFsaWduIDQKLUxDJDAwNTA6IAotCS5TVFJJTkcgImZuX2ZpZWxkbGlzdHMgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDUxOiAKLQkuU1RSSU5HICJbJWRdIG5hbWUgJyVzJyAoMHgleCkgbGVuZ3RoICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTI6IAotCS5TVFJJTkcgIlslZF0gcGh5c25hbWUgJyVzJyAoMHgleClceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1MzogCi0JLlNUUklORyAidHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTQ6IAotCS5TVFJJTkcgImFyZ3MgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDU1OiAKLQkuU1RSSU5HICJmY29udGV4dCAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTY6IAotCS5TVFJJTkcgImlzX2NvbnN0ICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTc6IAotCS5TVFJJTkcgImlzX3ZvbGF0aWxlICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTg6IAotCS5TVFJJTkcgImlzX3ByaXZhdGUgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1OTogCi0JLlNUUklORyAiaXNfcHJvdGVjdGVkICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjA6IAotCS5TVFJJTkcgImlzX3N0dWIgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2MTogCi0JLlNUUklORyAidm9mZnNldCAldVx4MGFceDAwIgotCS5hbGlnbiA0Ci1kdW1wX2ZuX2ZpZWxkbGlzdHM6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyOCwyNCglcjQpCi0Jc3R3ICVyNywyOCglcjQpCi0Jc3R3ICVyNiwzMiglcjQpCi0Jc3R3ICVyNSwzNiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkdyA0OCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDUwLCVyMjUKLQlsZG8gUidMQyQwMDUwKCVyMjUpLCVyMjUKLQlsZHcgMjAoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlzdHcgJXIwLDgoJXI0KQotTCQwMjE3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ4KCVyMTkpLCVyMjAKLQlsZGggMiglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIyMCwlcjE5LCVyMAotCWJsIEwkMDIxOCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMzAsMzEsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDIwKCVyMTkpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMTYoJXI0KQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gMiglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkdyA0OCglcjIxKSwlcjIwCi0JbGR3IDgoJXI0KSwlcjIyCi0JemRlcCAlcjIyLDMwLDMxLCVyMjEKLQlhZGQgJXIyMSwlcjIyLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMQotCWxkdyAyMCglcjIwKSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDgoJXI0KSwlcjIzCi0JemRlcCAlcjIzLDMwLDMxLCVyMjIKLQlhZGQgJXIyMiwlcjIzLCVyMjIKLQl6ZGVwICVyMjIsMjksMzAsJXIyMgotCWxkdyAyMCglcjIxKSwlcjIzCi0JYWRkICVyMjIsJXIyMywlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01MiglcjMwKQotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlsZHcgNDgoJXIyMiksJXIyMQotCWxkdyA4KCVyNCksJXIyMwotCXpkZXAgJXIyMywzMCwzMSwlcjIyCi0JYWRkICVyMjIsJXIyMywlcjIyCi0JemRlcCAlcjIyLDI5LDMwLCVyMjIKLQlsZHcgMjAoJXIyMSksJXIyMwotCWFkZCAlcjIyLCVyMjMsJXIyMQotCWxkdyA0KCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNTYoJXIzMCkKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDUxLCVyMjUKLQlsZG8gUidMQyQwMDUxKCVyMjUpLCVyMjUKLQlsZHcgOCglcjQpLCVyMjQKLQlsZHcgMCglcjIwKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCXN0dyAlcjAsMTIoJXI0KQotTCQwMjIwOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMzAsMzEsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDIwKCVyMTkpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDQoJXIxOSksJXIxOQotCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAyMjEsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA0KCVyMjApLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI5LDMwLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAxNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQlsZHcgMTIoJXI0KSwlcjIyCi0JemRlcCAlcjIyLDI5LDMwLCVyMjEKLQlhZGQgJXIyMSwlcjIyLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMQotCWxkdyAxNiglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTUyKCVyMzApCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDA1MiwlcjI1Ci0JbGRvIFInTEMkMDA1MiglcjI1KSwlcjI1Ci0JbGR3IDEyKCVyNCksJXIyNAotCWxkdyAwKCVyMjApLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA4KCVyMjApLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI5LDMwLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAxNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDUzLCVyMjUKLQlsZG8gUidMQyQwMDUzKCVyMjUpLCVyMjUKLQlsZHcgNCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIxOQotCWFkZCAlcjE5LCVyMjAsJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjE5Ci0JbGR3IDE2KCVyNCksJXIyMAotCWFkZCAlcjE5LCVyMjAsJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZG8gMTAoJXIyMSksJXIyMAotCWxkdyA0KCVyMTkpLCVyMjYKLQljb3B5ICVyMjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVjdXJzaXZlX2R1bXBfdHlwZSwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMgotCWFkZCAlcjIwLCVyMjIsJXIyMQotCWxkdyA0KCVyMjEpLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDU0LCVyMjUKLQlsZG8gUidMQyQwMDU0KCVyMjUpLCVyMjUKLQlsZHcgNDgoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMTkKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIxOQotCWxkdyAxNiglcjQpLCVyMjEKLQlhZGQgJXIxOSwlcjIxLCVyMjAKLQlsZHcgNCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDQ4KCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBwcmludF9hcmdfdHlwZXMsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA4KCVyMjApLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI5LDMwLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAxNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDU1LCVyMjUKLQlsZG8gUidMQyQwMDU1KCVyMjUpLCVyMjUKLQlsZHcgMTIoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0JZXh0cnUgJXIyMSwwKzEtMSwxLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDU2LCVyMjUKLQlsZG8gUidMQyQwMDU2KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0JZXh0cnUgJXIyMSwxKzEtMSwxLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDU3LCVyMjUKLQlsZG8gUidMQyQwMDU3KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0JZXh0cnUgJXIyMSwyKzEtMSwxLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDU4LCVyMjUKLQlsZG8gUidMQyQwMDU4KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0JZXh0cnUgJXIyMSwzKzEtMSwxLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDU5LCVyMjUKLQlsZG8gUidMQyQwMDU5KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0JZXh0cnUgJXIyMSw0KzEtMSwxLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMDYwLCVyMjUKLQlsZG8gUidMQyQwMDYwKCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDgoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjksMzAsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDE2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0JZXh0cnUgJXIyMSw4KzI0LTEsMjQsJXIyMgotCWxkbyAtMiglcjIyKSwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDA2MSwlcjI1Ci0JbGRvIFInTEMkMDA2MSglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyMjI6IAotCWxkdyAxMiglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMTIoJXI0KQotCWJsLG4gTCQwMjIwLCVyMAotTCQwMjIxOiAKLUwkMDIxOTogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMjE3LCVyMAotTCQwMjE4OiAKLUwkMDIxNjogCi0JbGR3IDI0KCVyNCksJXI4Ci0JbGR3IDI4KCVyNCksJXI3Ci0JbGR3IDMyKCVyNCksJXI2Ci0JbGR3IDM2KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDYyOiAKLQkuU1RSSU5HICJuX2Jhc2VjbGFzc2VzICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjM6IAotCS5TVFJJTkcgIm5mbl9maWVsZHMgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2NDogCi0JLlNUUklORyAibmZuX2ZpZWxkc190b3RhbCAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDY1OiAKLQkuU1RSSU5HICJ2aXJ0dWFsX2ZpZWxkX2JpdHMgKCVkIGJpdHMgYXQgKjB4JXgpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2NjogCi0JLlNUUklORyAiXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjc6IAotCS5TVFJJTkcgInByaXZhdGVfZmllbGRfYml0cyAoJWQgYml0cyBhdCAqMHgleClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDY4OiAKLQkuU1RSSU5HICJwcm90ZWN0ZWRfZmllbGRfYml0cyAoJWQgYml0cyBhdCAqMHgleClceDAwIgotCS5hbGlnbiA0Ci1wcmludF9jcGx1c19zdHVmZjogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI4LDE2KCVyNCkKLQlzdHcgJXI3LDIwKCVyNCkKLQlzdHcgJXI2LDI0KCVyNCkKLQlzdHcgJXI1LDI4KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMjEKLQlsZGggMCglcjIxKSwlcjIyCi0JZXh0cnMgJXIyMiwzMSwxNiwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDYyLCVyMjUKLQlsZG8gUidMQyQwMDYyKCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMjEKLQlsZGggMiglcjIxKSwlcjIyCi0JZXh0cnMgJXIyMiwzMSwxNiwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDYzLCVyMjUKLQlsZG8gUidMQyQwMDYzKCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGR3IDQ4KCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjQsJXIyNQotCWxkbyBSJ0xDJDAwNjQoJXIyNSksJXIyNQotCWxkdyA0KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGRoIDAoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIxOQotCWNvbWljbHIsPCAwLCVyMTksJXIwCi0JYmwgTCQwMjI0LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIyMQotCWxkaCAwKCVyMjEpLCVyMjIKLQlleHRycyAlcjIyLDMxLDE2LCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIxLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0JbGR3IDQ4KCVyMjIpLCVyMjEKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjUsJXIyNQotCWxkbyBSJ0xDJDAwNjUoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JbGR3IDgoJXIyMSksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMjEKLQlsZGggMCglcjIxKSwlcjIyCi0JZXh0cnMgJXIyMiwzMSwxNiwlcjIwCi0JbGR3IDgoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBwcmludF9iaXRfdmVjdG9yLCVyMgotCW5vcAotCWxkaWwgTCdMQyQwMDY2LCVyMjYKLQlsZG8gUidMQyQwMDY2KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyMjQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzQoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsMTYsJXIxOQotCWNvbWljbHIsPCAwLCVyMTksJXIwCi0JYmwgTCQwMjI1LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkdyAxMiglcjIwKSwlcjE5Ci0JY29taWNsciw8PiAwLCVyMTksJXIwCi0JYmwgTCQwMjI2LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZGggMzQoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlsZHcgNDgoJXIyMiksJXIyMQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA2NywlcjI1Ci0JbGRvIFInTEMkMDA2NyglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQlsZHcgMTIoJXIyMSksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRoIDM0KCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMjAKLQlsZHcgMTIoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBwcmludF9iaXRfdmVjdG9yLCVyMgotCW5vcAotCWxkaWwgTCdMQyQwMDY2LCVyMjYKLQlsZG8gUidMQyQwMDY2KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyMjY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkdyAxNiglcjIwKSwlcjE5Ci0JY29taWNsciw8PiAwLCVyMTksJXIwCi0JYmwgTCQwMjI3LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZGggMzQoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlsZHcgNDgoJXIyMiksJXIyMQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA2OCwlcjI1Ci0JbGRvIFInTEMkMDA2OCglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQlsZHcgMTYoJXIyMSksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRoIDM0KCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMjAKLQlsZHcgMTYoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBwcmludF9iaXRfdmVjdG9yLCVyMgotCW5vcAotCWxkaWwgTCdMQyQwMDY2LCVyMjYKLQlsZG8gUidMQyQwMDY2KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyMjc6IAotTCQwMjI1OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ4KCVyMTkpLCVyMjAKLQlsZGggMiglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjE5Ci0JY29taWNsciw8IDAsJXIxOSwlcjAKLQlibCBMJDAyMjgsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGR1bXBfZm5fZmllbGRsaXN0cywlcjIKLQlub3AKLUwkMDIyODogCi1MJDAyMjM6IAotCWxkdyAxNiglcjQpLCVyOAotCWxkdyAyMCglcjQpLCVyNwotCWxkdyAyNCglcjQpLCVyNgotCWxkdyAyOCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDA2OTogCi0JLlNUUklORyAidHlwZSBub2RlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3MDogCi0JLlNUUklORyAibmFtZSAnJXMnICgweCV4KVx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDcxOiAKLQkuU1RSSU5HICI8TlVMTD5ceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDcyOiAKLQkuU1RSSU5HICJjb2RlIDB4JXggXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3MzogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9VTkRFRilceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDc0OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1BUUilceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDc1OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX0FSUkFZKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzY6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfU1RSVUNUKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzc6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfVU5JT04pXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3ODogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9FTlVNKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzk6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfRlVOQylceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDgwOiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX0lOVClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDgxOiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX0ZMVClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDgyOiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1ZPSUQpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4MzogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9TRVQpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4NDogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9SQU5HRSlceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDg1OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1BBU0NBTF9BUlJBWSlceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDg2OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX0VSUk9SKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODc6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfTUVNQkVSKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODg6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfTUVUSE9EKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODk6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfUkVGKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTA6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfQ0hBUilceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDkxOiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX0JPT0wpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5MjogCi0JLlNUUklORyAiKFVOS05PV04gVFlQRSBDT0RFKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTM6IAotCS5TVFJJTkcgImxlbmd0aCAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDk0OiAKLQkuU1RSSU5HICJvYmpmaWxlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5NTogCi0JLlNUUklORyAidGFyZ2V0X3R5cGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDk2OiAKLQkuU1RSSU5HICJwb2ludGVyX3R5cGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDk3OiAKLQkuU1RSSU5HICJyZWZlcmVuY2VfdHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTg6IAotCS5TVFJJTkcgImZ1bmN0aW9uX3R5cGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDk5OiAKLQkuU1RSSU5HICJmbGFncyAweCV4XHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwMDogCi0JLlNUUklORyAiIFRZUEVfRkxBR19VTlNJR05FRFx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDE6IAotCS5TVFJJTkcgIiBUWVBFX0ZMQUdfU0lHTkVEXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwMjogCi0JLlNUUklORyAiIFRZUEVfRkxBR19TVFVCXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwMzogCi0JLlNUUklORyAibmZpZWxkcyAlZCAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDQ6IAotCS5TVFJJTkcgIlslZF0gYml0cG9zICVkIGJpdHNpemUgJWQgdHlwZSAweCV4IG5hbWUgJyVzJyAoMHgleClceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwNTogCi0JLlNUUklORyAidnB0cl9iYXNldHlwZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDY6IAotCS5TVFJJTkcgInZwdHJfZmllbGRubyAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTA3OiAKLQkuU1RSSU5HICJhcmdfdHlwZXMgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTA4OiAKLQkuU1RSSU5HICJjcGx1c19zdHVmZiAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDk6IAotCS5TVFJJTkcgInR5cGVfc3BlY2lmaWMgMHgleFx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMTA6IAotCS5TVFJJTkcgIiAodW5rbm93biBkYXRhIGZvcm0pXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgcmVjdXJzaXZlX2R1bXBfdHlwZSxDT0RFCi0JLkVYUE9SVCByZWN1cnNpdmVfZHVtcF90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IKLXJlY3Vyc2l2ZV9kdW1wX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOCwxNiglcjQpCi0Jc3R3ICVyNywyMCglcjQpCi0Jc3R3ICVyNiwyNCglcjQpCi0Jc3R3ICVyNSwyOCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDY5LCVyMjUKLQlsZG8gUidMQyQwMDY5KCVyMjUpLCVyMjUKLQlsZHcgMCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIxLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0JbGR3IDQoJXIyMiksJXIyMQotCWxkbyAtNCglcjApLCVyMjIKLQlsZG8gLTMyKCVyNCksJXIyNAotCWFkZCAlcjI0LCVyMjIsJXIyMwotCWxkdyAwKCVyMjMpLCVyMjIKLQlsZHcgNCglcjIyKSwlcjIzCi0JY29taWNsciw9IDAsJXIyMywlcjAKLQlibCBMJDAyMzAsJXIwCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNzEsJXIyMQotCWxkbyBSJ0xDJDAwNzEoJXIyMSksJXIyMQotTCQwMjMwOiAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNzAsJXIyNQotCWxkbyBSJ0xDJDAwNzAoJXIyNSksJXIyNQotCWxkdyA0KCVyMjApLCVyMjQKLQljb3B5ICVyMjEsJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDcyLCVyMjUKLQlsZG8gUidMQyQwMDcyKCVyMjUpLCVyMjUKLQlsZHcgMCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JYWRkaSx1diAtMTksJXIyMCwlcjAKLQlibHIsbiAlcjIwLCVyMAotCWIsbiBMJDAyNTEKLUwkMDI1MjogCi0JYiBMJDAyMzIKLQlub3AKLQliIEwkMDIzMwotCW5vcAotCWIgTCQwMjM0Ci0Jbm9wCi0JYiBMJDAyMzUKLQlub3AKLQliIEwkMDIzNgotCW5vcAotCWIgTCQwMjM3Ci0Jbm9wCi0JYiBMJDAyMzgKLQlub3AKLQliIEwkMDIzOQotCW5vcAotCWIgTCQwMjQwCi0Jbm9wCi0JYiBMJDAyNDEKLQlub3AKLQliIEwkMDI0MgotCW5vcAotCWIgTCQwMjQzCi0Jbm9wCi0JYiBMJDAyNDQKLQlub3AKLQliIEwkMDI0NQotCW5vcAotCWIgTCQwMjQ2Ci0Jbm9wCi0JYiBMJDAyNDcKLQlub3AKLQliIEwkMDI0OAotCW5vcAotCWIgTCQwMjQ5Ci0Jbm9wCi0JYiBMJDAyNTAKLQlub3AKLUwkMDIzMjogCi0JbGRpbCBMJ0xDJDAwNzMsJXIyNgotCWxkbyBSJ0xDJDAwNzMoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjMzOiAKLQlsZGlsIEwnTEMkMDA3NCwlcjI2Ci0JbGRvIFInTEMkMDA3NCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzQ6IAotCWxkaWwgTCdMQyQwMDc1LCVyMjYKLQlsZG8gUidMQyQwMDc1KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzNTogCi0JbGRpbCBMJ0xDJDAwNzYsJXIyNgotCWxkbyBSJ0xDJDAwNzYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjM2OiAKLQlsZGlsIEwnTEMkMDA3NywlcjI2Ci0JbGRvIFInTEMkMDA3NyglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzc6IAotCWxkaWwgTCdMQyQwMDc4LCVyMjYKLQlsZG8gUidMQyQwMDc4KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzODogCi0JbGRpbCBMJ0xDJDAwNzksJXIyNgotCWxkbyBSJ0xDJDAwNzkoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjM5OiAKLQlsZGlsIEwnTEMkMDA4MCwlcjI2Ci0JbGRvIFInTEMkMDA4MCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDA6IAotCWxkaWwgTCdMQyQwMDgxLCVyMjYKLQlsZG8gUidMQyQwMDgxKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0MTogCi0JbGRpbCBMJ0xDJDAwODIsJXIyNgotCWxkbyBSJ0xDJDAwODIoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQyOiAKLQlsZGlsIEwnTEMkMDA4MywlcjI2Ci0JbGRvIFInTEMkMDA4MyglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDM6IAotCWxkaWwgTCdMQyQwMDg0LCVyMjYKLQlsZG8gUidMQyQwMDg0KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0NDogCi0JbGRpbCBMJ0xDJDAwODUsJXIyNgotCWxkbyBSJ0xDJDAwODUoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQ1OiAKLQlsZGlsIEwnTEMkMDA4NiwlcjI2Ci0JbGRvIFInTEMkMDA4NiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDY6IAotCWxkaWwgTCdMQyQwMDg3LCVyMjYKLQlsZG8gUidMQyQwMDg3KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0NzogCi0JbGRpbCBMJ0xDJDAwODgsJXIyNgotCWxkbyBSJ0xDJDAwODgoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQ4OiAKLQlsZGlsIEwnTEMkMDA4OSwlcjI2Ci0JbGRvIFInTEMkMDA4OSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDk6IAotCWxkaWwgTCdMQyQwMDkwLCVyMjYKLQlsZG8gUidMQyQwMDkwKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI1MDogCi0JbGRpbCBMJ0xDJDAwOTEsJXIyNgotCWxkbyBSJ0xDJDAwOTEoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjUxOiAKLQlsZGlsIEwnTEMkMDA5MiwlcjI2Ci0JbGRvIFInTEMkMDA5MiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzE6IAotCWxkaWwgTCdMQyQwMDY2LCVyMjYKLQlsZG8gUidMQyQwMDY2KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA5MywlcjI1Ci0JbGRvIFInTEMkMDA5MyglcjI1KSwlcjI1Ci0JbGR3IDgoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk0LCVyMjUKLQlsZG8gUidMQyQwMDk0KCVyMjUpLCVyMjUKLQlsZHcgMTIoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk1LCVyMjUKLQlsZG8gUidMQyQwMDk1KCVyMjUpLCVyMjUKLQlsZHcgMTYoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDE2KCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyNTMsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZG8gMiglcjIxKSwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMjYKLQljb3B5ICVyMjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVjdXJzaXZlX2R1bXBfdHlwZSwlcjIKLQlub3AKLUwkMDI1MzogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA5NiwlcjI1Ci0JbGRvIFInTEMkMDA5NiglcjI1KSwlcjI1Ci0JbGR3IDIwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA5NywlcjI1Ci0JbGRvIFInTEMkMDA5NyglcjI1KSwlcjI1Ci0JbGR3IDI0KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA5OCwlcjI1Ci0JbGRvIFInTEMkMDA5OCglcjI1KSwlcjI1Ci0JbGR3IDI4KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkaCAzMiglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDk5LCVyMjUKLQlsZG8gUidMQyQwMDk5KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRoIDMyKCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDMxLDEsJXIxOQotCWV4dHJzICVyMTksMzEsMTYsJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDI1NCwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDEwMCwlcjI2Ci0JbGRvIFInTEMkMDEwMCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwdXRzX2ZpbHRlcmVkLCVyMgotCW5vcAotTCQwMjU0OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRoIDMyKCVyMTkpLCVyMjAKLQlsZG8gMiglcjApLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMTkKLQlleHRycyAlcjE5LDMxLDE2LCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyNTUsJXIwCi0Jbm9wCi0JbGRpbCBMJ0xDJDAxMDEsJXIyNgotCWxkbyBSJ0xDJDAxMDEoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDI1NTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkaCAzMiglcjE5KSwlcjIwCi0JbGRvIDQoJXIwKSwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjE5Ci0JZXh0cnMgJXIxOSwzMSwxNiwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjU2LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMTAyLCVyMjYKLQlsZG8gUidMQyQwMTAyKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyNTY6IAotCWxkaWwgTCdMQyQwMDY2LCVyMjYKLQlsZG8gUidMQyQwMDY2KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkaCAzNCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIzCi0JYWRkICVyMjMsJXIyMSwlcjIyCi0JbGR3IDAoJXIyMiksJXIyMQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDEwMywlcjI1Ci0JbGRvIFInTEMkMDEwMyglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQlsZHcgMzYoJXIyMSksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlzdHcgJXIwLDgoJXI0KQotTCQwMjU3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRoIDM0KCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDE2LCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMjU4LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gMiglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwyNywyOCwlcjIyCi0JbGR3IDM2KCVyMjApLCVyMjEKLQlhZGQgJXIyMiwlcjIxLCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDgoJXI0KSwlcjIyCi0JemRlcCAlcjIyLDI3LDI4LCVyMjMKLQlsZHcgMzYoJXIyMSksJXIyMgotCWFkZCAlcjIzLCVyMjIsJXIyMQotCWxkdyA0KCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNTIoJXIzMCkKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDgoJXI0KSwlcjIyCi0JemRlcCAlcjIyLDI3LDI4LCVyMjMKLQlsZHcgMzYoJXIyMSksJXIyMgotCWFkZCAlcjIzLCVyMjIsJXIyMQotCWxkdyA4KCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNTYoJXIzMCkKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDgoJXI0KSwlcjIyCi0JemRlcCAlcjIyLDI3LDI4LCVyMjMKLQlsZHcgMzYoJXIyMSksJXIyMgotCWFkZCAlcjIzLCVyMjIsJXIyMQotCWxkdyAxMiglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTYwKCVyMzApCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIzCi0JYWRkICVyMjMsJXIyMSwlcjIyCi0JbGR3IDAoJXIyMiksJXIyMQotCWxkdyA4KCVyNCksJXIyMgotCXpkZXAgJXIyMiwyNywyOCwlcjIzCi0JbGR3IDM2KCVyMjEpLCVyMjIKLQlhZGQgJXIyMywlcjIyLCVyMjEKLQlsZHcgMTIoJXIyMSksJXIyMgotCXN0dyAlcjIyLC02NCglcjMwKQotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDEyKCVyMjEpLCVyMjIKLQljb21pY2xyLD0gMCwlcjIyLCVyMAotCWJsIEwkMDI2MCwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDA3MSwlcjIxCi0JbGRvIFInTEMkMDA3MSglcjIxKSwlcjIxCi0Jc3R3ICVyMjEsLTY0KCVyMzApCi1MJDAyNjA6IAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAxMDQsJXIyNQotCWxkbyBSJ0xDJDAxMDQoJXIyNSksJXIyNQotCWxkdyA4KCVyNCksJXIyNAotCWxkdyAwKCVyMjApLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjYxLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyA0KCVyMjEpLCVyMjAKLQlsZHcgOCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsJXIyCi0Jbm9wCi1MJDAyNjE6IAotTCQwMjU5OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JYmwsbiBMJDAyNTcsJXIwCi1MJDAyNTg6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAxMDUsJXIyNQotCWxkbyBSJ0xDJDAxMDUoJXIyNSksJXIyNQotCWxkdyA0MCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDI2MiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAyKCVyMjEpLCVyMjAKLQlsZHcgNDAoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWN1cnNpdmVfZHVtcF90eXBlLCVyMgotCW5vcAotTCQwMjYyOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMTA2LCVyMjUKLQlsZG8gUidMQyQwMTA2KCVyMjUpLCVyMjUKLQlsZHcgNDQoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWNvbWljbHIsPD4gNiwlcjE5LCVyMAotCWJsIEwkMDI2NSwlcjAKLQlub3AKLQljb21pY2xyLD49IDYsJXIxOSwlcjAKLQlibCBMJDAyNzAsJXIwCi0Jbm9wCi0JY29taWNsciw8PiAzLCVyMTksJXIwCi0JYmwgTCQwMjY2LCVyMAotCW5vcAotCWJsLG4gTCQwMjY3LCVyMAotTCQwMjcwOiAKLQljb21pY2xyLDw+IDE1LCVyMTksJXIwCi0JYmwgTCQwMjY0LCVyMAotCW5vcAotCWJsLG4gTCQwMjY3LCVyMAotTCQwMjY0OiAKLUwkMDI2NTogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDEwNywlcjI1Ci0JbGRvIFInTEMkMDEwNyglcjI1KSwlcjI1Ci0JbGR3IDQ4KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyA0OCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcHJpbnRfYXJnX3R5cGVzLCVyMgotCW5vcAotCWJsLG4gTCQwMjYzLCVyMAotTCQwMjY2OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMTA4LCVyMjUKLQlsZG8gUidMQyQwMTA4KCVyMjUpLCVyMjUKLQlsZHcgNDgoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcHJpbnRfY3BsdXNfc3R1ZmYsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyNjMsJXIwCi1MJDAyNjc6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAxMDksJXIyNQotCWxkbyBSJ0xDJDAxMDkoJXIyNSksJXIyNQotCWxkdyA0OCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDI2OCwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDExMCwlcjI2Ci0JbGRvIFInTEMkMDExMCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyNjg6IAotCWxkaWwgTCdMQyQwMDY2LCVyMjYKLQlsZG8gUidMQyQwMDY2KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDI2MywlcjAKLUwkMDI2MzogCi1MJDAyMjk6IAotCWxkdyAxNiglcjQpLCVyOAotCWxkdyAyMCglcjQpLCVyNwotCWxkdyAyNCglcjQpLCVyNgotCWxkdyAyOCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZ2xvYmFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2dsb2JhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTgyZjQ1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZ2xvYmFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkuY29kZQotCS5JTVBPUlQgZm9vLGRhdGEKLQotCS5hbGlnbiA0Ci07IE9mZmljaWFsIGdhcyBjb2RlIHdpbGwgbm90IGFjY2VwdCBzeW0tJGdsb2JhbCQuCi0JYWRkaWwgTCVmb28tJGdsb2JhbCQsJXIyNwotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xhYmVsYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xhYmVsYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YWY5ZDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sYWJlbGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCS5jb2RlCi0KLQkuYWxpZ24gNAotOyBBIGNvbW1lbnQuICBUaGlzIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSBsYWJlbCwgYnV0IGJvdGggb2YgdGhlCi07IGZvbGxvd2luZyBzdGF0ZW1lbnRzIHNob3VsZC4KLWxhYmVsX3dpdGhvdXRfY29sb24KLWxhYmVsX3dpdGhfY29sb246Ci0KLTsgQSBwcm9ibGVtIHRlZ2UgZm91bmQuLi4KLTsgSW5wdXQgc2NydWJiaW5nIGluIGdhcyBtYWtlcyBsaWZlIGEgcmVhbCBuaWdodG1hcmUgZm9yIGFzc2VtYmxlcnMKLTsgaW4gd2hpY2ggdGhlICpwb3NpdGlvbiogd2l0aGluIGEgbGluZSBkZXRlcm1pbmVzIGhvdyB0byBpbnRlcnByZXQKLTsgYSBzdHJlYW0gYSBjaGFyYWN0ZXJzLiAgVGhlc2UgdGVzdCBvbmUgcGFydGljdWxhciBjYXNlIHdoZXJlIGdhcwotOyBoYWQgdGhlIHRlbmRlbmN5IHRvIGRlbGV0ZSB0aGUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBvcGNvZGUgYW5kCi07IG9wZXJhbmRzIGlmIGEgbGFiZWwgd2l0aG91dCBhIGNvbG9uIGJlZ2FuIGEgbGluZSwgYW5kIHRoZSBvcGVyYW5kcwotOyBzdGFydGVkIHdpdGggYSBub24tbnVtZXJpYyBjaGFyYWN0ZXIuCi1MJDEJYWRkICVyMiwlcjIsJXIyCi1MJDI6CWFkZCAlcjIsJXIyLCVyMgotTCQzCi0JYWRkICVyMiwlcjIsJXIyCi0KLUwkNAlhZGQgJXIyLCVyMiwlcjIKLUwkNToJYWRkICVyMiwlcjIsJXIyCi1MJDYKLQlhZGQgJXIyLCVyMiwlcjIKLQotOyBBbiBpbnN0cnVjdGlvbiBvciBwc2V1ZG8tb3AgbWF5IGJlZ2luIGFueXdoZXJlIGFmdGVyIGNvbHVtbiAwLgotIGIsbiBsYWJlbF93aXRob3V0X2NvbG9uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xpbmVzZXBidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbGluZXNlcGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2Y4NGI3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbGluZXNlcGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5jb2RlCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCi1mb286Ci0JLldPUkQgMCAhLklNUE9SVCAkYmFyJCxEQVRBCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbHNlbGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sc2VsYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MzdlODYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sc2VsYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLmNvZGUKLQotCS5hbGlnbiA0Ci07IEluIGdhcy0xLjM2IHRoZSBsZGlsIGluc3RydWN0aW9uIHVzaW5nIHBhcmVudGhlc2lzIGdlbmVyYXRlZAotOyBnYXJiYWdlIGJpdHMgd2hpbGUgdGhlIG9uZSB3aXRob3V0IHBhcmVucyB3b3JrZWQgZmluZS4KLQlsZGlsIEwlKDB4MDAwNDAwMDAgfCAweDAwMDAwMDA4IHwgMHgwMDAwMDAwMiksJXIyMQotCWxkbyBMJSgweDAwMDQwMDAwIHwgMHgwMDAwMDAwOCB8IDB4MDAwMDAwMDIpICglcjIxKSwlcjIxCi0JbGRpbCBMJTB4MDAwNDAwMDAgfCAweDAwMDAwMDA4IHwgMHgwMDAwMDAwMiwlcjIxCi0JbGRvIEwlMHgwMDA0MDAwMCB8IDB4MDAwMDAwMDggfCAweDAwMDAwMDAyICglcjIxKSwlcjIxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvbm9zdWJzcGFjZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ub3N1YnNwYWNlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MDQ2MDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ub3N1YnNwYWNlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0JLlNQQUNFICRURVhUJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1wbl9hZGRfbgotCS5FWFBPUlQgbXBuX2FkZF9uLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IsUlROVkFMPUdSCi1tcG5fYWRkX246Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MCxOT19DQUxMUwotCS5FTlRSWQotCi0JYWRkCSVyMCwlcjAsJXIwCQk7IHJlc2V0IGN5Ci1Mb29wOgotCWxkd3MsbWEJIDQoMCwlcjI1KSwlcjIwCi0JbGR3cyxtYQkgNCgwLCVyMjQpLCVyMTkKLQotCWFkZGMJICVyMTksJXIyMCwlcjE5Ci0JYWRkaWIsPD4gLTEsJXIyMyxMb29wCi0Jc3R3cyxtYQkgJXIxOSw0KDAsJXIyNikKLQotCWJ2CTAoMikKLQkgYWRkYwklcjAsJXIwLCVyMjgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcGFyc2UuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wYXJzZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDY3NGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wYXJzZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0jIGFuZCBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19zdHJpbmdfdGVzdHMge30gewotICAgIHNldCB0ZXN0bmFtZSAic3RyaW5nZXIuczogVGVzdCBlbWJlZGRlZCBxdW90ZXMgYW5kIG9jdGFsIGVzY2FwZXMgaW4gc3RyaW5ncyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN0cmluZ2VyLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMjM2OTZFNjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAgICAgIDZDNzU2NDY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgICAgICA2QjJFNjQ2NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rICAgICAgNjYyMjBBMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA5MzA3ODMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgICAgICAzMjMzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xzZWxfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsc2VsYnVncy5zOiBsc2VsYnVnIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibHNlbGJ1Zy5zIiAiLWFsIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgY29ycmVjdGx5IGhhbmRsZSBmaWVsZCBzZWxlY3RvcnMuIAotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyMkEwNDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMzZCNTAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDIyQTA0MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAzNkI1MDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb192YWxpZF9hbGlnbl90ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhbGlnbjEuczogdmFsaWQgYWxpZ25tZW50IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWxpZ24xLnMiICItYWwiCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBjb3JyZWN0bHkgaGFuZGxlIGZpZWxkIHNlbGVjdG9ycy4gCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4MDAwMjQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwODAwMDI0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDEwMDAgMDgwMDAyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwXFteXG5cXSpCTE9DS1xbXlxuXF0qMTAyNFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDA0MDBcW15cblxdKkJMT0NLXFteXG5cXSoxMDI0XFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDgwMFxbXlxuXF0qQkxPQ0tcW15cblxdKjRcW15cblxdKlxuIgotCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwODA0XFteXG5cXSpBTElHTlxbXlxuXF0qOFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDA4MDhcW15cblxdKkJMT0NLXFteXG5cXSozMFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDA4MjZcW15cblxdKkFMSUdOXFteXG5cXSo0XFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDgyOFxbXlxuXF0qQkxPQ0tcW15cblxdKjRcW15cblxdKlxuIgotCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICAjIEdBUy0yLjAgZG9lcyBub3QgYWx3YXlzIHBhcnNlICEgYXMgYSBsaW5lIHNlcGFyYXRvciB3aGVuIGl0IHNob3VsZC4KLSAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSoKLSAgICBnYXNfdGVzdCAibGluZXNlcGJ1Zy5zIiAiIiAiIiAibGluZSBzZXBhcmF0b3IgYnVnIgotCi0gICAgIyBNYWtlIHN1cmUgR0FTIGFjY2VwdHMgc3ludGF4IGZvciBhY2Nlc3Npbmcgc3RhdGljIGRhdGEuCi0gICAgZ2FzX3Rlc3QgImdsb2JhbC5zIiAiIiAiIiAiY2hlY2sgZm9yIHN5bS1cJGdsb2JhbFwkIGFjY2VwdGFuY2UiCi0KLSAgICAjIEdBUy0yLjAgKGFuZCAxLjM2IGZvciB0aGF0IG1hdHRlcikgY2FuIG5vdCBoYW5kbGUgYSAucHJvYyB3aGljaAotICAgICMgaGFzIG5vIGxhYmVsIGJlZm9yZSBpdC4KLSAgICBnYXNfdGVzdCAicHJvY2J1Zy5zIiAiIiAiIiAiTGFiZWwgZm9sbG93aW5nIC5wcm9jIgotCi0gICAgIyBPbmUgaXMgcmVxdWlyZWQgdG8gZXhwbGljaXRseSBJTVBPUlQgYW55IG5vbi1sb2NhbCBzeW1ib2wgdXNlZAotICAgICMgaW4gYW4gYXNzZW1ibHkgZmlsZS4gIE1ha2Ugc3VyZSB3ZSBnaXZlIGFuIGVycm9yIGlmIHdlIHVzZQotICAgICMgYW4gdW5kZWZpbmVkIHN5bWJvbC4KLSAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSoKLSAgICBnYXNfdGVzdF9lcnJvciAidW5kZWZidWcucyIgIiIgIkNoZWNrIGZvciBlcnJvciB3aGVuIHVzaW5nIHVuZGVmaW5lZCBzeW1ib2wiCi0KLSAgICAjIFRoaXMgZmlsZSBoYXMgY29kZSBhbmQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgYmVmb3JlIHN3aXRjaGluZyBpbnRvIGFueQotICAgICMgc3BhY2Uvc3Vic3BhY2UgcGFpci4gIFRoaXMgc2hvdWxkIHJlcG9ydCBhbiBlcnJvciBmb3IgU09NIChpdCBpcyBub3QKLSAgICAjIGFuIGVycm9yIGZvciBFTEYuICBUaGUgZmlsZSBhbHNvIGhhcyBtaXNtYXRjaGVkIGVudHJ5L2V4aXQgYW5kCi0gICAgIyBwcm9jL3Byb2NlbmQgcGFpcnMgd2hpY2ggYXJlIGVycm9ycyBmb3IgYm90aCBTT00gYW5kIEVMRi4KLSAgICBnYXNfdGVzdF9lcnJvciAibm9zdWJzcGFjZS5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yKHMpIGluIGlucHV0IGZpbGUgIgotCi0gICAgIyBUaGlzIGZpbGUgc2hvdWxkIHJldHVybiBlcnJvcnMgZm9yIGJvdGggdGhlIEVOVFJZX0dSIGFuZCBFTlRSWV9GUgotICAgICMgZGlyZWN0aXZlcyAodGhleSBhcmUgb3V0LW9mLXJhbmdlKQotICAgIGdhc190ZXN0X2Vycm9yICJlbnRyeWJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGVudHJ5X2dyIGFuZCBlbnRyeV9mciIKLQotICAgICMgTWFrZSBzdXJlIGVtYmVkZGVkIHF1b3RlcyBhbmQgb2N0YWwgZXNjYXBlcyBpbiBzdHJpbmdzIHdvcmsKLSAgICBkb19zdHJpbmdfdGVzdHMKLQotICAgICMgTWFrZSBzdXJlIHdlIGRvIG5vdCBkaWUgb24gYSAudmVyc2lvbiBkaXJlY3RpdmUKLSAgICBnYXNfdGVzdCAidmVyc2lvbmJ1Zy5zIiAiIiAiIiAiLnZlcnNpb24gZGlyZWN0aXZlIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgZ2l2ZSBhbiBlcnJvciBvbiBhIGJvZ3VzIC5zcGFjZSBkaXJlY3RpdmUuCi0gICAgIyByZWNlbnQgdmVyc2lvbiBvZiBnYXMyIHdlbnQgaW50byBpbmZpbml0ZSBsb29wcyBwcmludGluZwotICAgICMgZXJyb3JzIG9uIHRoaXMgdGVzdC4KLSAgICBnYXNfdGVzdF9lcnJvciAic3BhY2VidWcucyIgIiIgIkNoZWNrIGZvciBlcnJvciBvbiBib2d1cyAuc3BhY2UgZGlyZWN0aXZlIgotCi0gICAgIyBHQVMgc2hvdWxkIGdpdmUgYW4gZXJyb3IgZm9yIHRoaXMgdGVzdC4KLSAgICBnYXNfdGVzdF9lcnJvciAiY2FsbGRhdGFidWcucyIgIiIgIkNoZWNrIGZvciBpbnZhbGlkIGFndW1lbnRzIG9uIC5jYWxsIgotCi0gICAgIyBPbGQgdmVyc2lvbnMgb2YgZ2FzIGluY29ycmVjdGx5IGdhdmUgZXJyb3JzIG9uIHNvbWUgdmFsaWQgLkVYUE9SVCBsaW5lcwotICAgIGdhc190ZXN0ICJleHBvcnRidWcucyIgIiIgIiIgInN5bnRheCBjaGVjayBmb3IgYW4gb2xkIC5FWFBPUlQgYnVnIgotCi0gICAgIyBPbGQgdmVyc2lvbnMgb2YgZ2FzIGNob2tlZCBvbiB0aGlzIGZpbGUgZm9yIHNvbWUgcmVhc29uCi0gICAgZ2FzX3Rlc3QgImZpeHVwN2J1Zy5zIiAiIiAiIiAiY2hlY2sgZm9yIG9sZCBcImZpeHVwN1wiIGdhcyBidWciCi0KLSAgICAjIFRlc3QgYW4gTCUgc2VsZWN0b3IgcGFyc2luZyBidWcgd2hpY2ggZXhpc3RlZCBpbiBnYXMtMS4zNiAgIAotICAgIGRvX2xzZWxfdGVzdAotCi0gICAgIyBGaXJzdCBjaGVjayBob3cgc29tZSB2YWxpZCBhbGlnbm1lbnRzIGFyZSBoYW5kbGVkLgotICAgIGRvX3ZhbGlkX2FsaWduX3Rlc3RzCi0KLSAgICAjIE5vdyBjaGVjayB0byBtYWtlIHN1cmUgYW4gaW52YWxpZCBhcmd1bWVudCBpcyBmbGFnZ2VkIGFzIGFuIGVycm9yLgotICAgIGdhc190ZXN0X2Vycm9yICJhbGlnbjIucyIgIiIgIkNoZWNrIGZvciBlcnJvciBvbiBib2d1cyBhcmd1bWVudCB0byAuYWxpZ24iCi0KLSAgICAjIEdBUyBjYW4ndCBoYW5kbGUgdXBwZXIgYm91bmQgZm9yIGEgUEEgLmJsb2NrW3pdIGRpcmVjdGl2ZQotICAgIHNldHVwX3hmYWlsIGhwcGEqLSotKgotICAgIGdhc190ZXN0ICJibG9jazEucyIgIiIgIiIgIkNoZWNrIG1pbi9tYXggdmFsdWVzIGZvciAuYmxvY2siCi0KLSAgICAjIE5vdyBjaGVjayBmb3IgYW4gaW52YWxpZCBhcmd1bWVudAotICAgIGdhc190ZXN0X2Vycm9yICJibG9jazIucyIgIiIgIkNoZWNrIGZvciBlcnJvciBvbiBib2d1cyBhcmd1bWVudCB0byAuYmxvY2siCi0KLSAgICAjIEdBUy0xLjM2IGNob2tlZCBvbiB0aGlzIGZpbGUuCi0gICAgIyBGSVhNRS4gIFNob3VsZCBjaGVjayByZWxvY2F0aW9ucyBtYWRlIGZvciB0aGlzIHRlc3QhCi0gICAgZ2FzX3Rlc3QgImV4cHJidWcucyIgIiIgIiIgIkNoZWNrIGZvciBzeW0xLXN5bTIgYWNjZXB0YW5jZSIKLQotICAgICMgQmFkIHRoaW5ncyBoYXBwZW4gaW4gdGhlIFBBIEVMRiBiYWNrZW5kIChvdGhlcnMgdG9vPykgaWYgYSBub24tZGVmYXVsdAotICAgICMgc2VjdGlvbiBpcyBjcmVhdGVkLi4uCi0gICAgc2V0dXBfeGZhaWwgaHBwYSotKi0qZWxmKgotICAgIHNldHVwX3hmYWlsIGhwcGEqdy0qLSoKLSAgICBnYXNfdGVzdCAic3NidWcucyIgIiIgIiIgIkNoZWNrIGZvciBhY2NlcHRhbmNlIG9mIG5vbi1kZWZhdWx0IHN1YnNwYWNlcyIKLQotICAgICMgVG8gYmUgY29tcGF0YWJsZSB3aXRoIGNlcnRhaW4gImZlYXR1cmVzIiBvZiB0aGUgSFAgY29tcGlsZXIKLSAgICAjIG5vbi1leGlzdGFudCByZWdpc3RlcnMgc2hvdWxkIGRlZmF1bHQgdG8gJXIwLgotICAgIGdhc190ZXN0ICJkZWZidWcucyIgIiIgIiIgIk1pc3NpbmcgcmVnaXN0ZXIgc2hvdWxkIGRlZmF1bHQgdG8gJSVyMCIKLQotICAgICMgTWFrZSBzdXJlIEdBUyB1bmRlcnN0YW5kcyBhIHJlYXNvbmFibGUgc2V0IG9mIHN0YW5kYXJkIHByZWRlZmluZWQKLSAgICAjIHJlZ2lzdGVycy4gIGVnICVycCwgJWRwLCAlc3AsIGV0Yy4KLSAgICBnYXNfdGVzdCAic3RkcmVnLnMiICIiICIiICJUZXN0IHN0YW5kYXJkIHByZWRlZmluZWQgcmVnaXN0ZXJzIgotCi0gICAgIyBNYWtlIHN1cmUgR0FTIHdpbGwgYWNjZXB0IGEgbGFiZWwgd2l0aG91dCBhIGNvbG9uLgotICAgIGdhc190ZXN0ICJsYWJlbGJ1Zy5zIiAiIiAiIiAiVGVzdCBsYWJlbCB3aXRob3V0IGNvbG9uIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgZ3JvayAjIGxpbmUgZGlyZWN0aXZlcy4KLSAgICBnYXNfdGVzdCAiYXBwYnVnLnMiICIiICIiICJUZXN0IGFjY2VwdGFuY2Ugb2YgI2xpbmUgZGlyZWN0aXZlcyIKLQotICAgICMgTWFrZSBzdXJlIHdlIGdpdmUgZXJyb3JzIGlmIGEgZmxvYXRpbmcgcG9pbnQgZm9ybWF0IGlzIHNwZWNpZmllZAotICAgICMgZm9yIGFuIHhtcHl1IGluc3RydWN0aW9uIChpbnRlZ2VyIG11bHRpcGxlKQotICAgIGdhc190ZXN0X2Vycm9yICJ4bXB5dWJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJvZ3VzIGFyZ3VtZW50IHRvIHhtcHl1IgotCi0gICAgIyBNYWtlIHN1cmUgZ2FzIGhhbmRsZXMgdmFyaW91cyBraW5kcyBvZiAucmVnIHBzZXVkby1vcHMKLSAgICBnYXNfdGVzdCAicmVncG9wYnVnLnMiICIiICIiICJUZXN0IGZvciBidWdzIGluIC5yZWcgcHNldWRvLW9wIgotCi0gICAgIyBDaGVjayBzb21lIGJ1Z3MgdGhhdCBoYXZlIGFwcGVhcmVkIGluIHBhcnNpbmcgLmNhbGxpbmZvIGRpcmVjdGl2ZXMKLSAgICBnYXNfdGVzdCAiY2FsbGluZm9idWcucyIgIiIgIiIgIlRlc3QgZm9yIGJ1Z3MgaW4gLmNhbGxpbmZvIGRpcmVjdGl2ZSIKLQotICAgICMgQ2hlY2sgZm9yIGJvZ3VzIHJlZ2lzdGVycyBpbiBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQvZm1weXN1YgotICAgICMgaW5zdHJ1Y3Rpb25zCi0gICAgZ2FzX3Rlc3RfZXJyb3IgImJhZGZtcHlhZGQucyIgIiIgIkNoZWNrIGZvciBlcnJvciBvbiBiYWQgZm1weWFkZCBpbnNuIgotfQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3Byb2NidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcHJvY2J1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTUzNThhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcHJvY2J1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLQkuZXhwb3J0IGRpdnUsZW50cnkKLQkucHJvYwotCS5jYWxsaW5mbwotZGl2dToJc3R3cyxtYQkJJXI0LDQoJXI1KQkJOyBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjawotCS5wcm9jZW5kCi0KLQkuZXhwb3J0IGRpdnUyLGVudHJ5Ci0JLnByb2MKLQkuY2FsbGluZm8KLQkuZW50cnkKLWRpdnUyOglzdHdzLG1hCQklcjQsNCglcjUpCQk7IHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCi0JLmV4aXQKLQkucHJvY2VuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9yZWdwb3BidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcmVncG9wYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNTdkOWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9yZWdwb3BidWcucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCS5jb2RlCi0KLXIwCS5yZWcJJXIwCi1zaGlmdAkucmVnCSVzYXIKLWZwcmVnMTAJLnJlZwklZnIxMAotc2hpZnQyCS5yZWcJc2hpZnQKLQotOyBNYWtlIHN1cmUgd2UgZGlkbid0IGJvdGNoIC5lcXUuLi4KLXlhYmJhCS5lcXUJcjAgKyBzaGlmdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zcGFjZWJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zcGFjZWJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODNiNDAxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3BhY2VidWcucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotc3RhcnQ6CS5sb25nIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcKLQkuc3BhY2UgMHgyMCAtICguIC0gc3RhcnQpCi1mb286CS5sb25nIDQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NzYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NzYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NjBlMGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zc2J1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1VCU1BBICRTSE9SVEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MAotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RkcmVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0ZHJlZy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWY2NjhjNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0ZHJlZy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLQkuZXhwb3J0IGZvbwotZm9vOgotCS5wcm9jCi0JLmNhbGxpbmZvIG5vX2NhbGxzCi0JLmVudHJ5Ci0JbGRpIDE1LCVzcAotCWxkaSAxNSwlcnAKLQlsZGkgMTUsJWRwCi0JbGRpIDE1LCVyZXQwCi0JbGRpIDE1LCVyZXQxCi0JbGRpIDE1LCVhcmcwCi0JbGRpIDE1LCVhcmcxCi0JbGRpIDE1LCVhcmcyCi0JbGRpIDE1LCVhcmczCi0JLmV4aXQKLSAJLnByb2NlbmQgCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zdHJpbmdlci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zdHJpbmdlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjAwYjExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RyaW5nZXIucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkuZGF0YQotCi0KLTsgR0FTIHVzZWQgdG8gbWlzLXBhcnNlIHRoZSBlbWJlZGRlZCBxdW90ZXMKLQkuU1RSSU5HICIjaW5jbHVkZSBcImF3ay5kZWZcIlx4MGFceDAwIgotCi07IE9jdGFsIGVzY2FwZXMgdXNlZCB0byBjb25zdW1lID4gMyBjaGFycyB3aGljaCBsZWQgdG8gdGhpcwotOyBzdHJpbmcgYmVpbmcgc2NyZXdlZCBpbiBhIGJpZyB3YXkuCi0JLlNUUklORyAiXDAxMTB4MTIzIgotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvdW5kZWZidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvdW5kZWZidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZjYTUzYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3VuZGVmYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQkuY29kZQotCi0JLmFsaWduIDQKLQlibCBzb21ld2hlcmUsJXIyCi0Jbm9wCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvdmVyc2lvbmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS92ZXJzaW9uYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YjIyMTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS92ZXJzaW9uYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQkuY29kZQotCi0JLlZFUlNJT04gImFiYzEyMyIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS94bXB5dWJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS94bXB5dWJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzkwODQ0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UveG1weXVidWcucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5jb2RlCi0JLmFsaWduIDQKLTsgTm8gZm9ybWF0IHNlbGVjdG9yIGZvciB4bXB5dSEKLQl4bXB5dSxzZ2wgJWZyNCwlZnI1LCVmcjYKLQl4bXB5dSxkYmwgJWZyNCwlZnI1LCVmcjYKLQl4bXB5dSxxdWFkICVmcjQsJWZyNSwlZnI2Ci0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9hcHBseWJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9hcHBseWJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGNiN2NhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYXBwbHlidWcucworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLmRhdGEKLQotCS5hbGlnbiA0Ci10YWJfX18yCi0JLndvcmQgTCQwMDAyCi0JLndvcmQgTCQwMDAzCi0JLndvcmQgTCQwMDA0Ci0JLmNvZGUKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBleGVjdXRlLENPREUKLQkuRVhQT1JUIGV4ZWN1dGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKLWV4ZWN1dGUKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCi0JLkVOVFJZCi0JYWRkaWwgTCdidWYtJGdsb2JhbCQsJXIyNwotCWxkbyBSJ2J1Zi0kZ2xvYmFsJCglcjEpLCVyMjAKLQlsZGlsIEwnTCQwMDAyLCVyMTkKLQltb3ZiLDw+ICVyMjYsJXIyNixMJDAwMDIKLQlsZG8gUidMJDAwMDIoJXIxOSksJXIyMgotCWNvcHkgJXIwLCVyMjEKLQlhZGRpbCBMJ3RhYl9fXzItJGdsb2JhbCQsJXIyNwotCWxkbyBSJ3RhYl9fXzItJGdsb2JhbCQoJXIxKSwlcjIzCi0JYWRkaWwgTCdvcHRhYi0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFInb3B0YWItJGdsb2JhbCQoJXIxKSwlcjIwCi1MJDAwMDkKLQlzaDJhZGQgJXIyMSwlcjIzLCVyMTkKLQlsZGggMiglcjE5KSwlcjE5Ci0JbGRvIDEoJXIyMSksJXIyMQotCXN1YiAlcjE5LCVyMjIsJXIxOQotCWNvbWliLD49IDIsJXIyMSxMJDAwMDkKLQlzdGhzLG1hICVyMTksMiglcjIwKQotCWJ2LG4gJXIwKCVyMikKLUwkMDAwMgotCWxkaSAxMjAsJXIxOQotCXN0YnMsbWEgJXIxOSwxKCVyMjApCi0JbGRocyxtYSAyKCVyMjYpLCVyMTkKLQlhZGQgJXIyMiwlcjE5LCVyMTkKLQlidixuICVyMCglcjE5KQotTCQwMDAzCi0JbGRpIDEyMSwlcjE5Ci0Jc3RicyxtYSAlcjE5LDEoJXIyMCkKLQlsZGhzLG1hIDIoJXIyNiksJXIxOQotCWFkZCAlcjIyLCVyMTksJXIxOQotCWJ2LG4gJXIwKCVyMTkpCi1MJDAwMDQKLQlsZGkgMTIyLCVyMTkKLQlzdGIgJXIxOSwwKCVyMjApCi0JYnYgJXIwKCVyMikKLQlzdGJzLG1iICVyMCwxKCVyMjApCi0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgX19tYWluLENPREUKLQkuSU1QT1JUIHN0cmNtcCxDT0RFCi0KLQkuYWxpZ24gNAotTCRDMDAwMAotCS5TVFJJTkcgInh5eHl6XHgwMCIKLQkuSU1QT1JUIGFib3J0LENPREUKLQkuSU1QT1JUIGV4aXQsQ09ERQotCS5jb2RlCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbixDT0RFCi0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1tYWluCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCS5DQUxMIAotCWJsIF9fbWFpbiwlcjIKLQlsZG8gMTI4KCVyMzApLCVyMzAKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGV4ZWN1dGUsJXIyCi0JY29weSAlcjAsJXIyNgotCWFkZGlsIEwnb3B0YWItJGdsb2JhbCQsJXIyNwotCWNvcHkgJXIxLCVyMTkKLQlsZG8gUidvcHRhYi0kZ2xvYmFsJCglcjE5KSwlcjIxCi0JbGRoIDIoJXIyMSksJXIyMAotCWxkaCBSJ29wdGFiLSRnbG9iYWwkKCVyMTkpLCVyMTkKLQlhZGRpbCBMJ3AtJGdsb2JhbCQsJXIyNwotCWNvcHkgJXIxLCVyMjIKLQlzdGggJXIyMCxSJ3AtJGdsb2JhbCQoJXIyMikKLQlsZG8gUidwLSRnbG9iYWwkKCVyMjIpLCVyMjYKLQlzdGggJXIyMCw0KCVyMjYpCi0Jc3RoICVyMTksMiglcjI2KQotCWxkaCA0KCVyMjEpLCVyMTkKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGV4ZWN1dGUsJXIyCi0Jc3RoICVyMTksNiglcjI2KQotCWFkZGlsIEwnYnVmLSRnbG9iYWwkLCVyMjcKLQljb3B5ICVyMSwlcjE5Ci0JbGRvIFInYnVmLSRnbG9iYWwkKCVyMTkpLCVyMjYKLQlsZGlsIEwnTCRDMDAwMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyCi0JbGRvIFInTCRDMDAwMCglcjI1KSwlcjI1Ci0JY29taWIsPSxuIDAsJXIyOCxMJDAwMTEKLQkuQ0FMTCAKLQlibCBhYm9ydCwlcjIKLQlub3AKLUwkMDAxMQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZXhpdCwlcjIKLQljb3B5ICVyMCwlcjI2Ci0Jbm9wCi0JLkVYSVQKLQkuUFJPQ0VORAotCS5kYXRhCi0KLW9wdGFiCS5jb21tIDEwCi1idWYJLmNvbW0gMTAKLXAJLmNvbW0gMTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmJkZTdhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLklNUE9SVAkkJGR5bmNhbGwsTUlMTElDT0RFIDsgQ29kZSBmb3IgZHluYW1pYyBmdW5jdGlvbiBjYWxscy4KLQotX3NpZ3RyYW1wOgotCWxkaWwJTCUkJGR5bmNhbGwsJXIyCTsgICB3aG9zZSBhZGRyZXNzIGlzIGluIHIyMi4KLQlibGUJUiUkJGR5bmNhbGwoJXNyNCwlcjIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1ZzIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Q0NDMwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMi5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotCi0gIAlsZGlsCUwlMHhjMDAwMTAwNCwlcjEKLSAgCWJsZQlSJTB4YzAwMDEwMDQoJXNyNywlcjEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1ZzMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDU4MWNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMy5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotCS5pbXBvcnQgeWFiYmEsY29kZQotCi0gIAlibGUJUiV5YWJiYSglc3I0LCVyMCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZXhpdGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9leGl0YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNGY3OGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9leGl0YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmb28sQ09ERQotCS5FWFBPUlQgZm9vLEVOVFJZLFBSSVZfTEVWPTMKLWZvbzoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZml4dXBidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZml4dXBidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0NmU0My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2ZpeHVwYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQkuY29kZQotCWIsbgkkJGZvbwotCW5vcAotCW5vcAotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJE1JTExJQ09ERSQKLSQkZm9vOgotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9mdW5jcmVsb2NidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZnVuY3JlbG9jYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZmU5M2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9mdW5jcmVsb2NidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotCS5FWFBPUlQgZyxDT0RFCi0JLkVYUE9SVCBnLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsUlROVkFMPUdSCi1nCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyMywlcjEKLQljb3B5ICVyMzAsJXIzCi0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyMjYsLTM2KCVyMykKLQlzdHcgJXIyNSwtNDAoJXIzKQotCXN0dyAlcjI0LC00NCglcjMpCi0JbGR3IC0zNiglcjMpLCVyMjYKLQlsZHcgLTQwKCVyMyksJXIyNQotCWxkdyAtNDQoJXIzKSwlcjE5Ci0JY29weSAlcjE5LCVyMjIKLQkuQ0FMTAlBUkdXMD1HUgotCWJsICQkZHluY2FsbCwlcjMxCi0JY29weSAlcjMxLCVyMgotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw8PiAwLCVyMTksJXIwCi0JYmwsbiBMJDAwMDIsJXIwCi0JbGR3IC0zNiglcjMpLCVyMjgKLQlibCxuIEwkMDAwMSwlcjAKLQlibCxuIEwkMDAwMywlcjAKLUwkMDAwMgotCWxkdyAtNDAoJXIzKSwlcjI4Ci0JYmwsbiBMJDAwMDEsJXIwCi1MJDAwMDMKLUwkMDAwMQotCWxkdyAtMjAoJXIzKSwlcjIKLQlsZG8gNjQoJXIzKSwlcjMwCi0JbGR3bSAtNjQoJXIzMCksJXIzCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotZjJfX180Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9NjQsTk9fQ0FMTFMsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDY0KCVyMzApCi0Jc3R3ICVyMjksOCglcjMpCi0Jc3R3ICVyMjYsLTM2KCVyMykKLQlzdHcgJXIyNSwtNDAoJXIzKQotCWxkdyAtMzYoJXIzKSwlcjE5Ci0JbGR3IC00MCglcjMpLCVyMjAKLQljb21jbHIsPj0gJXIyMCwlcjE5LCVyMTkKLQlsZGkgMSwlcjE5Ci0JY29weSAlcjE5LCVyMjgKLQlibCxuIEwkMDAwNSwlcjAKLUwkMDAwNQotCWxkbyA2NCglcjMpLCVyMzAKLQlsZHdtIC02NCglcjMwKSwlcjMKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgYWJvcnQsQ09ERQotCS5kYXRhCi0KLQkuYWxpZ24gNAotTCRUUkFNUDAwMDAKLQlsZHcJMzYoJXIyMiksJXIyMQotCWJiLD49LG4JJXIyMSwzMCwuKzE2Ci0JZGVwaQkwLDMxLDIsJXIyMQotCWxkdwk0KCVyMjEpLCVyMTkKLQlsZHcJMCglcjIxKSwlcjIxCi0JbGRzaWQJKCVyMjEpLCVyMQotCW10c3AJJXIxLCVzcjAKLQliZQkwKCVzcjAsJXIyMSkKLQlsZHcJNDAoJXIyMiksJXIyOQotCS53b3JkCTAKLQkud29yZAkwCi0JLmNvZGUKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmLENPREUKLQkuRVhQT1JUIGYsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLWYKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUCxTQVZFX1NQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXIzLCVyMQotCWNvcHkgJXIzMCwlcjMKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlsZG8gMTYoJXIzKSwlcjE5Ci0JYWRkaWwgTCdMJFRSQU1QMDAwMC0kZ2xvYmFsJCwlcjI3Ci0JbGRvIFInTCRUUkFNUDAwMDAtJGdsb2JhbCQoJXIxKSwlcjIyCi0JbGRvIDQwKCVyMCksJXIyMAotCWxkd3MsbWEgNCglcjIyKSwlcjIxCi0JYWRkaWIsPj0gLTQsJXIyMCwuLTQKLQlzdHdzLG1hICVyMjEsNCglcjE5KQotCWxkaWwgTCdmMl9fXzQsJXIyMAotCWxkbyBSJ2YyX19fNCglcjIwKSwlcjE5Ci0Jc3R3ICVyMTksNTIoJXIzKQotCWxkbyA4KCVyMyksJXIxOQotCXN0dyAlcjE5LDU2KCVyMykKLQlsZG8gMTYoJXIzKSwlcjE5Ci0JbGRvIDQ4KCVyMyksJXIyMAotCWZkYyAlcjAoJXIxOSkKLQlmZGMgJXIwKCVyMjApCi0Jc3luYwotCWxkbyAzMiglcjE5KSwlcjIyCi0JbWZzcCAlc3IwLCVyMjEKLQlsZHNpZCAoJXIxOSksJXIyMAotCW10c3AgJXIyMCwlc3IwCi0JZmljICVyMCglc3IwLCVyMTkpCi0JZmljICVyMCglc3IwLCVyMjIpCi0Jc3luYwotCW10c3AgJXIyMSwlc3IwCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0JbGRvIDE2KCVyMyksJXIxOQotCWxkaSAxLCVyMjYKLQlsZGkgMiwlcjI1Ci0JY29weSAlcjE5LCVyMjQKLQkuQ0FMTCBBUkdXMD1OTyxBUkdXMT1OTyxBUkdXMj1OTyxBUkdXMz1OTwotCWJsIGcsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLDw+IDIsJXIxOSwlcjAKLQlibCxuIEwkMDAwNiwlcjAKLQkuQ0FMTCBBUkdXMD1OTyxBUkdXMT1OTyxBUkdXMj1OTyxBUkdXMz1OTwotCWJsIGFib3J0LCVyMgotCW5vcAotTCQwMDA2Ci1MJDAwMDQKLQlsZHcgLTIwKCVyMyksJXIyCi0JbGRvIDY0KCVyMyksJXIzMAotCWxkd20gLTY0KCVyMzApLCVyMwotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBfX21haW4sQ09ERQotCS5JTVBPUlQgZXhpdCxDT0RFCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1haW4sQ09ERQotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDEyOCglcjMwKQotCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCi0JYmwgX19tYWluLCVyMgotCW5vcAotCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCi0JYmwgZiwlcjIKLQlub3AKLQljb3B5ICVyMCwlcjI2Ci0JLkNBTEwgQVJHVzA9Tk8sQVJHVzE9Tk8sQVJHVzI9Tk8sQVJHVzM9Tk8KLQlibCBleGl0LCVyMgotCW5vcAotTCQwMDA3Ci0JbGR3IC0yMCglcjMpLCVyMgotCWxkbyA2NCglcjMpLCVyMzAKLQlsZHdtIC02NCglcjMwKSwlcjMKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sYWJlbG9wYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xhYmVsb3BidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExNmI4Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xhYmVsb3BidWcucworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLQkuY29kZQotCS5hbGlnbiA0Ci1zOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyMzAsMTIoJXI0KQotCWxkaWwgTCdMJDAwMDcsJXIxOQotCWxkbyBSJ0wkMDAwNyglcjE5KSwlcjE5Ci0JY29taWIsPj0gMCwlcjI2LEwkMDAwMgotCXN0dyAlcjE5LDgoJXI0KQotTCQwMDAzOgotTCQwMDAyOgotCWIgTCQwMDAxCi0JbGRvIDEoJXIwKSwlcjI4Ci1MJDAwMDc6Ci0JbGRpbCBMJ0wkMDAwMiwlcjE5Ci0JbGRvIFInTCQwMDAyKCVyMTkpLCVyMTkKLQljb21iLD0gJXIyOSwlcjE5LEwkMDAwMgotCWxkbyAtOCglcjQpLCVyNAotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvbG9uZ2NhbGwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvbG9uZ2NhbGwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5MTM4Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xvbmdjYWxsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0JLmNvZGUKLQkuYWxpZ24gNAotCS5FWFBPUlQgZm9vLENPREUKLQkuRVhQT1JUIGZvbyxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotZm9vCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9NjQsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JLkNBTEwgCi0JYmwgYmFyLCVyMgotCWxkbyA2NCglcjMwKSwlcjMwCi0JLmJsb2NreiAyNjIxNDQKLQlsZHcgLTg0KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGRvIC02NCglcjMwKSwlcjMwCi0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBiYXIsQ09ERQotCS5FWFBPUlQgYmFyLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1iYXIKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCi0JLkVOVFJZCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGljcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGljcmVsb2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmM2FiYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3BpY3JlbG9jLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotCS5kYXRhCi1ib2dvCi0JLkFMSUdOCTgKLQkuV09SRCAgYm9nbys0CTsgPSAweDQKLQkuU1RSSU5HCSJceDAwXHgwMFx4MDB7XHgwMFx4MDBceDAxXHhDOFx4MDBceDAwXHgwM1x4MTUiCi0JLmRhdGEKLQkuRVhQT1JUCWJvZ28KLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3BsYWJlbGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9wbGFiZWxidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0YTQ2NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3BsYWJlbGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5JTVBPUlQgYWJvcnQsQ09ERQotCS5FWFBPUlQgZixEQVRBCi0JLmRhdGEKLQkuYWxpZ24gNAotZjoKLQkud29yZCBQJWFib3J0Ci0JLndvcmQgUCVhYm9ydAotCS5JTVBPUlQgX19tYWluLENPREUKLQkuSU1QT1JUIHByaW50ZixDT0RFCi0JLmNvZGUKLQkuYWxpZ24gNAotTEMkMDAwMDoKLQkuU1RSSU5HICJmcm9iXHgwYVx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1haW4sQ09ERQotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbjoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JbGRvIDEyOCglcjMwKSwlcjMwCi0JLkNBTEwgCi0JYmwgX19tYWluLCVyMgotCW5vcAotCWxkaWwgTCdMQyQwMDAwLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50ZiwlcjIKLQlsZG8gUidMQyQwMDAwKCVyMjYpLCVyMjYKLQlsZHcgLTE0OCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkbyAtMTI4KCVyMzApLCVyMzAKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3Jfbm9fcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTVkZWJkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvYy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotCS5DT1BZUklHSFQgIk1ldGFXYXJlIEluY29ycG9yYXRlZCwgMTk5MiIKLQkuVkVSU0lPTgkiaGMyLjZhIC1PMSB0My5jXG4iCi0KLQkuZGF0YQotCS5BTElHTgk4Ci0kTDAwREFUQQotCS5BTElHTgk4Ci0JLkVYUE9SVAlzCi1zCi0JLldPUkQJMHgwCi0JLkJMT0NLWgk3ODY0MjUKLQkuQkxPQ0taCTcKLQotCS5jb2RlCi1MJDAwMS4zCi1nCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQk7bGRvCTEyMCglcjApLCVyMjggLS0+IHRvIGRlbGF5IHNsb3QKLQlidgklcjAoJXIyKQotCS5FWElUCi0JbGRvCTEyMCglcjApLCVyMjgKLQkuUFJPQ0VORAotCi0KLQkuZGF0YQotCS5BTElHTgk0Ci0JLkVYUE9SVAlsCi1sCi0JLldPUkQJUCdnCi0JLklNUE9SVAljb21tb24sREFUQQk7IGNvbW1vbiBzZWN0aW9uLCBzaXplPTAKLQkuSU1QT1JUCSRnbG9iYWwkLERBVEEKLQkuRVhQT1JUCWcsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLQkuRU5ECi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDIyNmY4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0KLQkuY29kZQotCS5hbGlnbiA0Ci0JLlBBUkFNIGZvbyxSVE5WQUw9R1IKLWZvbzoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCi0JLkVOVFJZCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKLQotCS5hbGlnbiA0Ci1MQyQwMDAwOgotCS53b3JkIFAlZm9vCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgYmFyLENPREUKLQkuRVhQT1JUIGJhcixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotYmFyOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0JbGRpbCBMJ0xDJDAwMDAsJXIxOQotCWxkdyBSJ0xDJDAwMDAoJXIxOSksJXIyNgotCXN0dyAlcjIsLTIwKCVyMzApCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmb28sJXIyCi0JbGRvIDEyOCglcjMwKSwlcjMwCi0JbGR3IC0xNDgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZG8gLTEyOCglcjMwKSwlcjMwCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZTIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzZmEzNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZTIucworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkCi0KLQkuYWxpZ24gOAotTCRQMDAwMAotCS53b3JkIDB4MTIzNDU2NzgKLQkud29yZCAweDAKLQotCS5hbGlnbiA4Ci1MJEMwMDAwCi0JLndvcmQgMHgzZmYwMDAwMAotCS53b3JkIDB4MAotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGcsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9RlIKLWcKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCi0JLkVOVFJZCi0Jc3R3ICVyMTksLTMyKCVyMzApCi0JbGR3IFQnTCRDMDAwMCglcjE5KSwlcjIwCi0JYnYgJXIwKCVyMikKLQlmbGRkcyAwKCVyMjApLCVmcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBhYm9ydCxDT0RFCi0JLklNUE9SVCBleGl0LENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJAotCi0JLmFsaWduIDgKLUwkQzAwMDEKLQkud29yZCAweDNmZjAwMDAwCi0JLndvcmQgMHgwCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWxkbyAxMjgoJXIzMCksJXIzMAotCXN0dyAlcjE5LC0zMiglcjMwKQotCXN0dyAlcjQsLTEyOCglcjMwKQotCi0JY29weSAlcjE5LCVyNAotCS5DQUxMIAotCWJsIGcsJXIyCi0JY29weSAlcjQsJXIxOQotCWNvcHkgJXI0LCVyMTkKLQlsZHcgVCdMJEMwMDAxKCVyMTkpLCVyMjAKLQlmbGRkcyAwKCVyMjApLCVmcjgKLQlmY21wLGRibCw9ICVmcjQsJWZyOAotCWZ0ZXN0Ci0JYWRkLHRyICVyMCwlcjAsJXIwCi0JYixuIEwkMDAwMwotCS5DQUxMIAotCWJsIGFib3J0LCVyMgotCW5vcAotTCQwMDAzCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBleGl0LCVyMgotCWxkaSAwLCVyMjYKLQlub3AKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZTMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjZhNzk2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotCS5kYXRhCi0JLmFsaWduIDgKLWJsYWgKLQk7IC5kb3VibGUgMGUrMDAKLQkud29yZCAwIDsgPSAweDAKLQkud29yZCAwIDsgPSAweDAKLQkuRVhQT1JUIGZvbyxEQVRBCi0JLmFsaWduIDgKLWZvbwotCTsgLmRvdWJsZSAwZSswMAotCS53b3JkIDAgOyA9IDB4MAotCS53b3JkIDAgOyA9IDB4MAotCS5FWFBPUlQgeWFiYmEsREFUQQotCS5hbGlnbiA0Ci15YWJiYQotCS53b3JkIDEKLQkuY29kZQotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGJhcixDT0RFCi0JLkVYUE9SVCBiYXIsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLWJhcgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTY0LE5PX0NBTExTLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCWNvcHkgJXIzLCVyMQotCWNvcHkgJXIzMCwlcjMKLQlzdHdtICVyMSw2NCglcjMwKQotCWFkZGlsIEwneWFiYmEtJGdsb2JhbCQsJXIyNwotCWxkbyBSJ3lhYmJhLSRnbG9iYWwkKCVyMSksJXIxOQotCWxkaSAyLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi1MJDAwMDEKLQlsZG8gNjQoJXIzKSwlcjMwCi0JbGR3bSAtNjQoJXIzMCksJXIzCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODFiZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0jIGFuZCBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19ibGVfcmVsb2NhdGlvbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJsZWJ1Zy5zOiBUZXN0IGZvciBwcm9wZXIgcmVsb2NhdGlvbiBmb3IgQkxFIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImJsZWJ1Zy5zIiAiIiAiUHJvcGVyIHJlbG9jYXRpb24gZm9yIEJMRSAocGFydCAxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0gICAgICAgIGlmICFbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JICAgICMgQXQgb25lIHRpbWUgYm90aCB2ZXJzaW9ucyBvZiB0aGUgYXNzZW1ibGVyIHdvdWxkIGluY29ycmVjdGx5IHVzZSAKLQkgICAgIyBhIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24gZm9yIGEgQkxFIGluc3RydWN0aW9uLgotCSAgICB3aGlsZSAxIHsKLQkJZXhwZWN0IHsKLQkJICAgIC1yZSAiXjArNFxbXlxuXF0qQUJTX0NBTExcW15cblxdKlxuIgl7IHNldCB4IDEgfQotCQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQkgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICAjIEF0IG9uZSB0aW1lIGJvdGggdmVyc2lvbnMgb2YgdGhlIGFzc2VtYmxlciB3b3VsZCBpbmNvcnJlY3RseSB1c2UgCi0JICAgICMgYSBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uIGZvciBhIEJMRSBpbnN0cnVjdGlvbi4KLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JCSAgICAtcmUgIl4wK1xbXlxuXF0qRElSMjFMXFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXjArNFxbXlxuXF0qRElSMTdSXFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIG9iamR1bXBfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fcmVsb2NhdGlvbl9yZWR1Y3Rpb25fdGVzdHMge30gewotICAgIHNldCB0ZXN0bmFtZSAicmVkdWNlLnM6IFRlc3QgcmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtpc3RhcmdldCBocHBhKnctKi0qXSB0aGVuIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJyZWR1Y2UucyIgIiIgIlJlbG9jYXRpb24gcmVkdWN0aW9ucyAocGFydDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIENoZWNrIHRvIG1ha2Ugc3VyZSByZWxvY2F0aW9ucyBpbnZvbHZpbmcgcHJvY2VkdXJlIGxhYmVscyAKLQkjIGFyZSBub3QgcmVkdWNlZCB0byBhIHJlbG9jYXRpb24gaW52b2x2aW5nIHNvbWUgb3RoZXIgc3ltYm9sLgotCSMgRG9pbmcgc28gbWFrZXMgZ2VuZXJhdGluZyBwYXJhbWV0ZXIgcmVsb2NhdGlvbiBzdHVicyBpbXBvc3NpYmxlLgotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIl4wKzRcW15cblxdKlBMQUJFTFxbXlxuXF0qZm9vXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wKzE0XFteXG5cXSpQQ1JFTFxbXlxuXF0qZm9vXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIG9iamR1bXBfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0KLSAgICBzZXQgdGVzdG5hbWUgInJlZHVjZTIuczogTW9yZSByZWxvY2F0aW9uIHJlZHVjdGlvbiB0ZXN0cyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJyZWR1Y2UyLnMiICIiICJNb3JlIHJlbG9jYXRpb24gIHJlZHVjdGlvbnMgKHBhcnQxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBDaGVjayB0byBtYWtlIHN1cmUgRExUIHJlbGF0aXZlIHJlbG9jcyBhcmUgbm90IHJlZHVjZWQgdG8gc3ltK2FkZGVuZAotCSMgRG9pbmcgc28gZG9lc24ndCB3b3JrIGFzIG9uZSBtaWdodCBleHBlY3QKLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJeMCs0XFteXG5cXSpETFRcW15cblxdKkwuQzAwMDBcW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjArMWNcW15cblxdKkRMVFxbXlxuXF0qTC5DMDAwMFxbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMCszMFxbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAxXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wKzQ4XFteXG5cXSpETFRcW15cblxdKkwuQzAwMDFcW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgb2JqZHVtcF9maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIHNldCB0ZXN0bmFtZSAicmVkdWNlMy5zOiBUZXN0IGV2ZW4gbW9yZSByZWxvY2F0aW9uIHJlZHVjdGlvbnMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAicmVkdWNlMy5zIiAiIiAiRXZlbiBtb3JlIHJlbG9jYXRpb24gcmVkdWN0aW9ucyAocGFydDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIENoZWNrIHRvIG1ha2Ugc3VyZSByZWxvY2F0aW9ucyBpbnZvbHZpbmcgcHJvY2VkdXJlIGxhYmVscyAKLQkjIGFyZSBub3QgcmVkdWNlZCB0byBhIHJlbG9jYXRpb24gaW52b2x2aW5nIHNvbWUgb3RoZXIgc3ltYm9sLgotCSMgRG9pbmcgc28gbWFrZXMgZ2VuZXJhdGluZyBwYXJhbWV0ZXIgcmVsb2NhdGlvbiBzdHVicyBpbXBvc3NpYmxlLgotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIl4wK2NcW15cblxdKnlhYmJhXFteXG5cK1xdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjArY1xbXlxuXF0qeWFiYmFcK1xbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IDA7IGJyZWFrIH0KLQkJLXJlICJeMCsxMFxbXlxuXF0qeWFiYmFcW15cblwrXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMCsxMFxbXlxuXF0qeWFiYmFcK1xbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IDA7IGJyZWFrIH0KLQkJLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBvYmpkdW1wX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JsZV9tb2RlX3NlbGVjdG9yX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYmxlYnVnMi5zOiBibGVidWcyIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYmxlYnVnMi5zIiAiLWFsIgotCi0gICAgIyBHQVMgdXNlcyB0b28gbWFueSBiaXRzIG9uIHRoZSBCTEUgaW5zdHJ1Y3Rpb24uCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDIwMjAyODAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBFNDIwRTAwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19ibGVfcmVsb2NhdGlvbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJsZWJ1ZzMuczogYmxlYnVnMyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJsZWJ1ZzMucyIgIi1hbCIKLQotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFNDAwMjAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19wbGFiZWxfcmVsb2NhdGlvbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInBsYWJlbGJ1Zy5zOiBPbGQgZ2FzLTEuMzYgcGxhYmVsIGJ1ZyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJwbGFiZWxidWcucyIgIiIgIk9sZCBnYXMtMS4zNiBwbGFiZWwgYnVnIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBDaGVjayB0aGF0IHdlIG1ha2UgUExBQkVMIHJlbG9jYXRpb24gZW50cmllcyB3aGVuIHRoZXkncmUgbmVlZGVkLgotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIl4wK1xbXlxuXF0qUExBQkVMXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wKzRcW15cblxdKlBMQUJFTFxbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLSAgICAJICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19zZWxlY3Rvcl9zY29wZV90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNlbGVjdG9yYnVnLnM6IFRlc3Qgc2NvcGUgb2YgZmllbGQgc2VsZWN0b3IiIAotICAgIHNldCB4IDAKLQotICAgIGlmIFtpc3RhcmdldCBocHBhKnctKi0qXSB0aGVuIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJzZWxlY3RvcmJ1Zy5zIiAiIiAiVGVzdCBzY29wZSBvZiBmaWVsZCBzZWxlY3RvciAocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSByZWxvY2F0aW9uIGVudHJ5IGFmdGVyIHRoZSBwbGFiZWwgaXMgY29ycmVjdC4KLQkjIElmIGFuIG9sZCBmaWVsZCBzZWxlY3RvciB3YXMgaW5jb3JyZWN0bHkgImNhcnJpZWQiIG92ZXIsIHRoZW4gCi0JIyB0aGlzIHRlc3Qgd2lsbCBmYWlsLgotICAgICAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCSAgICAgICAgICAgIC1yZSAiXjArMTRcW15cblxdKkRJUjMyXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggMSB9Ci0JCSAgICAtcmUgIl4wKzE0XFteXG5cXSpQTEFCRUxcW15cblxdKmZvb1xbXlxuXF0qXG4iCi0JCQl7IHNldCB4IDAgfQotCSAgICAgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotICAgICAgICAgICAgfQotCX0gZWxzZSB7Ci0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCSAgICAgICAgICAgIC1yZSAiXjArMTRcW15cblxdKkRBVEFfT05FXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggMSB9Ci0JCSAgICAtcmUgIl4wKzE0XFteXG5cXSpQTEFCRUxcW15cblxdKmZvb1xbXlxuXF0qXG4iCi0JCQl7IHNldCB4IDAgfQotCSAgICAgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2xvY2FsX2xhYmVsX2FzX29wZXJhbmRfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsYWJlbG9wYnVnLnM6IFRlc3QgbG9jYWwgbGFiZWwgYXMgb3BlcmFuZCAobm9uLWJyYW5jaGluZykiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAibGFiZWxvcGJ1Zy5zIiAiIiAiTG9jYWwgbGFiZWwgYXMgb3BlcmFuZCAocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhbmRsZSBkaWZmZXJlbmNlIG9mIGxvY2FsIGxhYmxlcyBhcyBhbiBvcGVyYW5kCi0JIyB0byBhIG5vbi1icmFuY2hpbmcgaW5zdHJ1Y3Rpb24gY29ycmVjdGx5LgotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMCsyY1xbXlxuXF0qMHgwKzI0XFteXG5cXSpcbiIgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXjArMzBcW15cblxdKjB4MCsyNFxbXlxuXF0qXG4iIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19leGl0X3JlbG9jYXRpb25fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleGl0YnVnLnM6IFRlc3QgZm9yIGJvZ3VzIFJfRVhJVCByZWxvY2F0aW9uIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgICMgRWxmIChvc2YpIGRvZXMgbm90IHVzZSBFTlRSWS9FWElUIHJlbG9jYXRpb25zLgotICAgICMgSSBndWVzcyB3ZSBjb3VsZCBsb29rIGF0IHRoZSB1bndpbmQgc3Vic3BhY2VzIGl0IGJ1aWxkcy4uLgotICAgICMgVW50aWwgdGhlbiwgbWFrZSBzdXJlIGl0IHN0aWxsIGFzc2VtYmxlcy4KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JZ2FzX3Rlc3Rfb2xkICJleGl0YnVnLnMiICIiICJUZXN0IGZvciBib2d1cyBSX0VYSVQgcmVsb2NhdGlvbiAocGFydCAxKSIKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiZXhpdGJ1Zy5zIiAiIiAiVGVzdCBmb3IgYm9ndXMgUl9FWElUIHJlbG9jYXRpb24gKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIE5vdGUgdGhhdCBhIG1hdGNoIGhlcmUgaXMgcmVhbGx5IGEgRkFJTFVSRSEKLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkgICAgICAgIC1yZSAiXjArXFteXG5cXSpSX0VYSVRcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fY3Jvc3Nfc3BhY2VfZml4dXBfdGVzdF8xIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZpeHVwYnVnLnM6IFRlc3QgY3Jvc3Mgc3BhY2UganVtcC9jYWxsIGZpeHVwIGJ1ZyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSp3LSotKl0gdGhlbiB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgIyBFTEYgKG9zZikgZG9lc24ndCByZWFsbHkgaGFuZGxlIGV4dHJhIHNlY3Rpb25zIHRvbyB3ZWxsLi4uCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmaXh1cGJ1Zy5zIiAiIiAiVGVzdCBjcm9zcyBzcGFjZSBqdW1wL2NhbGwgZml4dXAgYnVnIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBNYWtlIHN1cmUgR0FTIGdlbmVyYXRlZCBhIGZpeHVwL3JlbG9jYXRpb24gZm9yIHRoZSBjcm9zcy1zcGFjZQotCSMgYnJhbmNoL2NhbGwKLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkgICAgICAgIC1yZSAiXjArXFteXG5cXSpQQ1JFTF9DQUxMXFteXG5cXSpcbiIgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2Nyb3NzX3NwYWNlX2ZpeHVwX3Rlc3RfMiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmaXh1cGJ1Zy5zOiBUZXN0IGNyb3NzIHNwYWNlIGp1bXAvY2FsbCBmaXh1cCBidWcgKHBhcnQgMykiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqdy0qLSpdIHRoZW4gewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgICMgRUxGIChvc2YpIGRvZXNuJ3QgcmVhbGx5IGhhbmRsZSBleHRyYSBzZWN0aW9ucyB0b28gd2VsbC4uLgotICAgIGlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgZ2FzX3N0YXJ0ICJmaXh1cGJ1Zy5zIiAiLWFsIgotCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEU4MDAwMDAyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3JvdW5kX21vZGVfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyb3VuZG1vZGUuczogVGVzdCBzd2l0Y2hpbmcgb2Ygcm91bmRpbmcgbW9kZXMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAicm91bmRtb2RlLnMiICIiICJUZXN0IHN3aXRjaCBvZiByb3VuZGluZyBtb2RlcyhwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBNYWtlIHN1cmUgR0FTIGdlbmVyYXRlZCBjb3JyZWN0IHJlbG9jYXRpb25zIHRvIHN3aXRjaCByb3VuZGluZyBtb2Rlcy4KLQkjIEFsc28gbWFrZSBzdXJlIChmb3IgU09NKSB0aGF0IHJlZHVuZGFudCByb3VuZGluZyBtb2RlIHJlbG9jYXRpb25zCi0JIyB3ZXJlIGVsaW1pbmF0ZWQuCi0JaWYgeyBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gfHwgW2lzdGFyZ2V0IGhwcGEqdy0qLSpdIH0gdGhlbiB7Ci0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCSAgICAgICAgICAgIC1yZSAiXjArXFteXG5cXSpESVIyMUxcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMCs0XFteXG5cXSpESVIxNFJcW15cblxdKlxuIiAKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjArOFxbXlxuXF0qRElSMjFMXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjArY1xbXlxuXF0qRElSMTRSXFteXG5cXSpcbiIgCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wKzEwXFteXG5cXSpESVIyMUxcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMCsxNFxbXlxuXF0qRElSMTRSXFteXG5cXSpcbiIgCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wKzE4XFteXG5cXSpESVIyMUxcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMCsxY1xbXlxuXF0qRElSMTRSXFteXG5cXSpcbiIgCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotICAgICAgICAgICAgfQotCX0gZWxzZSB7Ci0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCSAgICAgICAgICAgIC1yZSAiXjArXFteXG5cXSpSX1JfTU9ERVxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wKzRcW15cblxdKlJfUl9NT0RFXFteXG5cXSpcbiIgCi0JCQl7IGZhaWwgJHRlc3RuYW1lIH0KLQkgICAgICAgICAgICAtcmUgIl4wKzhcW15cblxdKlJfTl9NT0RFXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjArY1xbXlxuXF0qUl9OX01PREVcW15cblxdKlxuIiAKLQkJCXsgZmFpbCAkdGVzdG5hbWUgfQotCSAgICAgICAgICAgIC1yZSAiXjArMTBcW15cblxdKlJfUl9NT0RFXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjArMTRcW15cblxdKlJfUl9NT0RFXFteXG5cXSpcbiIgCi0JCQl7IGZhaWwgJHRlc3RuYW1lIH0KLQkgICAgICAgICAgICAtcmUgIl4wKzFjXFteXG5cXSpSX1JfTU9ERVxbXlxuXF0qXG4iIAotCQkJeyBmYWlsICR0ZXN0bmFtZSB9Ci0JICAgICAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0JCX0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYge1tpc3RhcmdldCBocHBhKi0qLSplbGYqXSB8fCBbaXN0YXJnZXQgaHBwYSp3LSotKl0gfSB0aGVuIHsKLQkgICAgaWYgW2V4cHIgJHg9PThdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0JfSBlbHNlIHsKLQkgICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0JfQotICAgIH0KLX0KLQotcHJvYyBkb19mdW5jdGlvbl9yZWxvY19idWcge30gewotICAgIHNldCB0ZXN0bmFtZSAiZnVuY3JlbG9jYnVnLnM6IFRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiBub24tcGxhYmVsIGZ1bmN0aW9uIHJlZmVyZW5jZSAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmdW5jcmVsb2NidWcucyIgIiIgIlRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiBub24tcGxhYmVsIGZ1bmN0aW9uIHJlZmVyZW5jZSAocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgTWFrZSBzdXJlIEdBUyBnZW5lcmF0ZWQgYSBjb3JyZWN0IHJlbG9jYXRpb24gZm9yIHRoZSByZWZlcmVuY2UuCi0JIyBicmFuY2gvY2FsbAotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMCtjY1xbXlxuXF0qZjJfX180XFteXG4rXF0qXG4iIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIl4wK2QwXFteXG5cXSpmMl9fXzRcW15cbitcXSpcbiIgIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotCi0Jc2V0IHRlc3RuYW1lICJmdW5jcmVsb2NidWcuczogVGVzdCBmb3IgcmVsb2MgYnVnIGluIG5vbi1wbGFiZWwgZnVuY3Rpb24gcmVmZXJlbmNlIChwYXJ0MykiCi0Jc2V0IHggMAotCi0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1wcmVmaXgtYWRkcmVzc2VzIC1kIgotCSMgTWFrZSBzdXJlIHdlIGRpZG4ndCBwdXQgYW55dGhpbmcgaW4gdGhlIGluc3RydWN0aW9uIGl0c2VsZiEKLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkgICAgICAgIC1yZSAiXjArY2NcW15cblxdKmxkaWwgMCxyMjBcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJeMCtkMFxbXlxuXF0qbGRvIDBcW1woXF0rcjIwXFtcKVxdKyxyMTlcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLQotfQotCi1wcm9jIGRvX3Jfbm9fcmVsb2Mge30gewotICAgIHNldCB0ZXN0bmFtZSAicl9ub19yZWxvYy5zOiBUZXN0IGZvciByZWxvYyBidWcgaW4gNC1ieXRlIFJfTk9fUkVMQ09BVElPTiBmaXh1cHMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAicl9ub19yZWxvYy5zIiAiIiAiVGVzdCBmb3IgcmVsb2MgYnVnIGluIDQtYnl0ZSBSX05PX1JFTE9DQVRJT04gZml4dXBzIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBNYWtlIHN1cmUgR0FTIGdlbmVyYXRlZCBhIGNvcnJlY3QgcmVsb2NhdGlvbiBmb3IgdGhlIHJlZmVyZW5jZS4KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkgICAgICAgIC1yZSAiXjArYzAwMDRcW15cblxdKlBMQUJFTFxbXlxuXSpnXFteXG5cXSpcbiIgCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0KLSAgICB9Ci19Ci0KLXByb2MgZG9fcGljX3JlbG9jYXRpb25fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwaWNyZWxvYy5zOiBUZXN0IGZvciBwcm9wZXIgUElDIHJlbG9jYXRpb24gKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqdy0qLSpdIHRoZW4gewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgICMgRUxGIChvc2YpIGRvZXNuJ3QgcmVhbGx5IGhhbmRsZSBleHRyYSBzZWN0aW9ucyB0b28gd2VsbC4uLgotICAgIGlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgZ2FzX3N0YXJ0ICJwaWNyZWxvYy5zIiAiLWFsIgotCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDAwMDAwMDA0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2FwcGx5X3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYXBwbHlidWcuczogVGVzdCBmb3IgcHJvcGVyIGZpeHVwIGFwcGxpYXRpb24gKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgIyBFTEYgKG9zZikgZG9lc24ndCByZWFsbHkgaGFuZGxlIGV4dHJhIHNlY3Rpb25zIHRvbyB3ZWxsLi4uCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCXJldHVybjsKLSAgICB9Ci0KLSAgICBnYXNfc3RhcnQgImFwcGx5YnVnLnMiICItYWwiCi0KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDAwMDAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDAwMDAwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwMDAwMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLWlmIFtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICAgICMgTWFrZSBzdXJlIHdlIHB1dCB0aGUgcmlnaHQgcmVsb2NhdGlvbiBlbnRyeSBvbiBhIEJMRSBpbnN0cnVjdGlvbi4KLSAgICBkb19ibGVfcmVsb2NhdGlvbl90ZXN0Ci0KLSAgICAjIE1ha2Ugc3VyZSByZWxvY2F0aW9uIHJlZHVjdGlvbnMgYXJlIG5vdCB0b28gYWdyZXNzaXZlIGFib3V0Ci0gICAgIyBhZGp1c3RpbmcgcmVsb2NhdGlvbnMgYWdhaW5zdCBzb21lIHN5bWJvbHMuCi0gICAgZG9fcmVsb2NhdGlvbl9yZWR1Y3Rpb25fdGVzdHMKLQotICAgICMgQ2hlY2sgdGhhdCBtb2RlIHNlbGVjdG9ycyBvbiBhIGJsZSBpbnN0cnVjdGlvbiBhY3R1YWxseSB3b3JrLgotICAgIGRvX2JsZV9tb2RlX3NlbGVjdG9yX3Rlc3QKLQotICAgICMgQ2hlY2sgdGhhdCB3ZSB0YWtlIHRoZSAtOCBhZGp1c3RtZW50IGludG8gYWNjb3VudCB3aGVuIHplcm9pbmcKLSAgICAjIG91dCB0aGUgZGlzcGxhY2VtZW50IGZpZWxkIGluIGEgYmxlIGluc3RydWN0aW9uIHdpdGggYSByZWxvYwotICAgIGRvX2JsZV9yZWxvY2F0aW9uX3Rlc3QKLQotICAgICMgMS4zNiBzaW1wbHkgZGlkbid0IGdlbmVyYXRlIGFsbCB0aGUgcGxhYmVscyBpdCBzaG91bGQgaGF2ZS4gIE1ha2UKLSAgICAjIHN1cmUgZ2FzLTIgZG9lcy4KLSAgICBkb19wbGFiZWxfcmVsb2NhdGlvbl90ZXN0Ci0KLSAgICAjIE1ha2Ugc3VyZSBhIGZpZWxkIHNlbGVjdG9yIG9ubHkgZWZmZWN0cyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbgotICAgICMgb3IgYXNzZW1ibGVyIGRpcmVjdGl2ZS4KLSAgICBkb19zZWxlY3Rvcl9zY29wZV90ZXN0Ci0KLSAgICAjIFRoaXMgc2hvdWxkIHJlYWxseSBnZW5lcmF0ZSBhIHJlbG9jYXRpb24uICBJdCB3b3VsZCBtYWtlIGxpZmUgbXVjaAotICAgICMgZWFzaWVyIG9uIHRoZSBvcHRpbWl6aW5nIGxpbmtlci4gIFVudGlsIHRoZW4ganVzdCBtYWtlIHN1cmUgdGhlIAotICAgICMgZGlmZmVyZW5jZSBpcyBjb21wdXRlZCBjb3JyZWN0bHkuCi0gICAgZG9fbG9jYWxfbGFiZWxfYXNfb3BlcmFuZF90ZXN0Ci0KLSAgICAjIEdBUzIgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIFJfRVhJVCByZWxvY2F0aW9ucyB3aGVuIC5leGl0IGRpcmVjdGl2ZXMKLSAgICAjIHdlcmUgbm90IGluIHRoZSBzb3VyY2UgY29kZS4KLSAgICBkb19leGl0X3JlbG9jYXRpb25fdGVzdAotCi0gICAgIyBHQVMyIGluY29ycmVjdGx5IHRob3VnaHQgaXQgY291bGQgYXBwbHkgYSBmaXh1cCBmb3IgYSBwYy1yZWxhdGl2ZQotICAgICMgYnJhbmNoL2NhbGwgd2hpY2ggY3Jvc3NlZCBkaWZmZXJlbnQgc3Vic3BhY2VzLgotICAgICMgQWxzbyBjaGVjayB0aGF0IHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gaXMgY29ycmVjdAotICAgIGRvX2Nyb3NzX3NwYWNlX2ZpeHVwX3Rlc3RfMQotICAgIGRvX2Nyb3NzX3NwYWNlX2ZpeHVwX3Rlc3RfMgotCi0gICAgIyBNYWtlIHN1cmUgd2Ugc3dpdGNoIHJvdW5kaW5nIG1vZGVzIGNvcnJlY3RseQotICAgIGRvX3JvdW5kX21vZGVfdGVzdAotCi0gICAgIyBUZXN0IGZvciBhIGJ1ZyBmb3VuZCB3aGVuIGEgZnVuY3Rpb24gd2FzIHVzZWQgaW4gYSBub24tYnJhbmNoaW5nCi0gICAgIyBpbnN0cnVjdGlvbiAqd2l0aG91dCogYSBwbGFiZWwgKGZvciBwb3J0YWJsZSBydW50aW1lIG1vZGVsKQotICAgIGRvX2Z1bmN0aW9uX3JlbG9jX2J1ZwotCi0gICAgIyBUZXN0IGZvciBhbiBvZmYtYnktb25lIGJ1ZyBpbiB0aGUgaGFuZGxpbmcgb2YgNC1ieXRlIFJfTk9fUkVMT0NBVElPTgotICAgICMgZml4dXBzLgotICAgIGRvX3Jfbm9fcmVsb2MKLQotICAgICMgVGVzdCBhIHJlbG9jYXRpb24gcHJvYmxlbSB3aGljaCBzaG93cyB1cCB3aGVuIGJ1aWxkaW5nIHNoYXJlZAotICAgICMgbGlicmFyaWVzIGluIFNPTQotICAgIGRvX3BpY19yZWxvY2F0aW9uX3Rlc3QKLQotICAgICMgVGVzdCBhIHByb2JsZW0gd2l0aCBtZF9hcHBseV9maXggdGhhdCB3YXMgaW50cm9kdWNlZCB3aGVuIGZpeGluZwotICAgICMgdGhlIHBpYyByZWxvY2F0aW9uIHRlc3QuCi0gICAgZG9fYXBwbHlfdGVzdAotCi0gICAgIyBNYWtlIHN1cmUgZ2FzIGRvZXNuJ3QgcmVzb2x2ZSBsb25nLWNhbGxzIHdoaWNoIGFyZSB0byBiZSBmaXhlZAotICAgICMgYnkgdGhlIGxpbmtlcgotICAgIGdhc190ZXN0ICJsb25nY2FsbC5zIiAiIiAiIiAiQXZvaWQgcmVzb2x2aW5nIGxvbmctY2FsbHMiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JvdW5kbW9kZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yb3VuZG1vZGUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2NTM3My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JvdW5kbW9kZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS5jb2RlCi0KLQkuYWxpZ24gNAotCS5JTVBPUlQgZm9vLGRhdGEKLQotOyBTd2l0Y2ggaW4vb3V0IG9mIGRpZmZlcmVudCByb3VuZGluZyBtb2Rlcy4KLTsgQWxzbyBtYWtlIHN1cmUgd2UgIm9wdGltaXplIiBhd2F5IHVzZWxlc3Mgcm91bmRpbmcgbW9kZSByZWxvY2F0aW9ucwotCWFkZGlsICAgTFInZm9vLTB4MTIzNDUsJXIyNwotCWxkbwlSUidmb28tMHgxMjM0NSglcjEpLCVyMQotCWFkZGlsICAgTCdmb28tMHgxMjM0NSwlcjI3Ci0JbGRvCVInZm9vLTB4MTIzNDUoJXIxKSwlcjEKLQlhZGRpbCAgIExSJ2Zvby0weDEyMzQ1LCVyMjcKLQlsZG8JUlInZm9vLTB4MTIzNDUoJXIxKSwlcjEKLQlhZGRpbCAgIExSJ2Zvby0weDEyMzQ1LCVyMjcKLQlsZG8JUlInZm9vLTB4MTIzNDUoJXIxKSwlcjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvc2VsZWN0b3JidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvc2VsZWN0b3JidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk2Mjc4MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3NlbGVjdG9yYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi07IGdjY19jb21waWxlZC46Ci0JLkVYUE9SVCBpbnRWZWNfZXJyb3JfaGFuZGxlcixEQVRBCi0JLmRhdGEKLQotaW50VmVjX2Vycm9yX2hhbmRsZXI6Ci0JLndvcmQgUCVkZWZhdWx0X2ludFZlY19lcnJvcl9oYW5kbGVyX19GUENjCi0KLQkuY29kZQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmb28sQ09ERQotCS5FWFBPUlQgZm9vLEVOVFJZLFBSSVZfTEVWPTMKLWZvbzoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wCi0JLkVOVFJZCi0JLnN0YWJkIDY4LDAsNDEKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9hbGlnbjMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkMjQwOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduMy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLmJsb2NreiA0Ci0KLW1haW46Ci0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAKLQkuRU5UUlkKLQlub3AKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduNC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9hbGlnbjQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyZjk5Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduNC5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0JLnNwYWNlICRURVhUJAotCS5zdWJzcGEgJFlBQkJBJAotCS5zdWJzcGEgJE1JTExJQ09ERSQKLQkuYWxpZ24gNjQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYnJsZW5idWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYnJsZW5idWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyMGNjMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2JybGVuYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDg4ICswLDAgQEAKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuZGF0YQotCi0JLmFsaWduIDQKLWRvbmVfX18yCi0JLndvcmQgMAotCS5JTVBPUlQgbWVtc2V0LENPREUKLQkuRVhQT1JUIHJlX3N5bnRheF9vcHRpb25zLERBVEEKLQkuYWxpZ24gNAotcmVfc3ludGF4X29wdGlvbnMKLQkud29yZCAwCi0KLQkuYWxpZ24gNAotcmVfZXJyb3JfbXNnCi0JLndvcmQgMAotCS53b3JkIEwkQzAwMDAKLQkud29yZCBMJEMwMDAxCi0JLndvcmQgTCRDMDAwMgotCS53b3JkIEwkQzAwMDMKLQkud29yZCBMJEMwMDA0Ci0JLndvcmQgTCRDMDAwNQotCS53b3JkIEwkQzAwMDYKLQkud29yZCBMJEMwMDA3Ci0JLndvcmQgTCRDMDAwOAotCS53b3JkIEwkQzAwMDkKLQkud29yZCBMJEMwMDEwCi0JLndvcmQgTCRDMDAxMQotCS53b3JkIEwkQzAwMTIKLQkud29yZCBMJEMwMDEzCi0JLndvcmQgTCRDMDAxNAotCS53b3JkIEwkQzAwMTUKLQkuY29kZQotCi0JLmFsaWduIDQKLUwkQzAwMTUKLQkuU1RSSU5HICJVbm1hdGNoZWQgKSBvciBcXClceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE0Ci0JLlNUUklORyAiUmVndWxhciBleHByZXNzaW9uIHRvbyBiaWdceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDEzCi0JLlNUUklORyAiUHJlbWF0dXJlIGVuZCBvZiByZWd1bGFyIGV4cHJlc3Npb25ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDEyCi0JLlNUUklORyAiSW52YWxpZCBwcmVjZWRpbmcgcmVndWxhciBleHByZXNzaW9uXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAxMQotCS5TVFJJTkcgIk1lbW9yeSBleGhhdXN0ZWRceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDEwCi0JLlNUUklORyAiSW52YWxpZCByYW5nZSBlbmRceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDA5Ci0JLlNUUklORyAiSW52YWxpZCBjb250ZW50IG9mIFxce1xcfVx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDgKLQkuU1RSSU5HICJVbm1hdGNoZWQgXFx7XHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwNwotCS5TVFJJTkcgIlVubWF0Y2hlZCAoIG9yIFxcKFx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDYKLQkuU1RSSU5HICJVbm1hdGNoZWQgWyBvciBbXlx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDUKLQkuU1RSSU5HICJJbnZhbGlkIGJhY2sgcmVmZXJlbmNlXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwNAotCS5TVFJJTkcgIlRyYWlsaW5nIGJhY2tzbGFzaFx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDMKLQkuU1RSSU5HICJJbnZhbGlkIGNoYXJhY3RlciBjbGFzcyBuYW1lXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwMgotCS5TVFJJTkcgIkludmFsaWQgY29sbGF0aW9uIGNoYXJhY3Rlclx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDEKLQkuU1RSSU5HICJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvblx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDAKLQkuU1RSSU5HICJObyBtYXRjaFx4MDAiCi0JLkVYUE9SVCByZV9tYXhfZmFpbHVyZXMsREFUQQotCS5kYXRhCi0KLQkuYWxpZ24gNAotcmVfbWF4X2ZhaWx1cmVzCi0JLndvcmQgMjAwMAotCS5JTVBPUlQgbWFsbG9jLENPREUKLQkuSU1QT1JUIHJlYWxsb2MsQ09ERQotCS5JTVBPUlQgZnJlZSxDT0RFCi0JLklNUE9SVCBzdHJjbXAsQ09ERQotCS5jb2RlCi0KLQkuYWxpZ24gNAotTCRDMDAxNgotCS5TVFJJTkcgImFsbnVtXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAxNwotCS5TVFJJTkcgImFscGhhXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAxOAotCS5TVFJJTkcgImJsYW5rXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAxOQotCS5TVFJJTkcgImNudHJsXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAyMAotCS5TVFJJTkcgImRpZ2l0XHgwMCIKLQkuYWxpZ24gNAotTCRDMDAyMQotCS5TVFJJTkcgImdyYXBoXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAyMgotCS5TVFJJTkcgImxvd2VyXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAyMwotCS5TVFJJTkcgInByaW50XHgwMCIKLQkuYWxpZ24gNAotTCRDMDAyNAotCS5TVFJJTkcgInB1bmN0XHgwMCIKLQkuYWxpZ24gNAotTCRDMDAyNQotCS5TVFJJTkcgInNwYWNlXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAyNgotCS5TVFJJTkcgInVwcGVyXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAyNwotCS5TVFJJTkcgInhkaWdpdFx4MDAiCi0JLklNUE9SVCBfX2FsbnVtLERBVEEKLQkuSU1QT1JUIF9fY3R5cGUyLERBVEEKLQkuSU1QT1JUIF9fY3R5cGUsREFUQQotCS5JTVBPUlQgYXRfYmVnbGluZV9sb2NfcCxDT0RFCi0JLklNUE9SVCBhdF9lbmRsaW5lX2xvY19wLENPREUKLQkuSU1QT1JUIHN0b3JlX29wMSxDT0RFCi0JLklNUE9SVCBpbnNlcnRfb3AxLENPREUKLQkuSU1QT1JUIHN0b3JlX29wMixDT0RFCi0JLklNUE9SVCBpbnNlcnRfb3AyLENPREUKLQkuSU1QT1JUIGNvbXBpbGVfcmFuZ2UsQ09ERQotCS5JTVBPUlQgZ3JvdXBfaW5fY29tcGlsZV9zdGFjayxDT0RFCi0JLmNvZGUKLQotCS5hbGlnbiA0Ci1yZWdleF9jb21waWxlCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MzIwLENBTExTLFNBVkVfUlAsRU5UUllfR1I9MTgKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKSA7IyA4OTg5IHJlbG9hZF9vdXRzaSsyLzYKLQlsZG8gMzIwKCVyMzApLCVyMzAgOyMgODk5MSBhZGRzaTMvMgotCXN0dyAlcjE4LC0xNjgoJXIzMCkgOyMgODk5MyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTcsLTE2NCglcjMwKSA7IyA4OTk1IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxNiwtMTYwKCVyMzApIDsjIDg5OTcgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjE1LC0xNTYoJXIzMCkgOyMgODk5OSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTQsLTE1MiglcjMwKSA7IyA5MDAxIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxMywtMTQ4KCVyMzApIDsjIDkwMDMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjEyLC0xNDQoJXIzMCkgOyMgOTAwNSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTEsLTE0MCglcjMwKSA7IyA5MDA3IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxMCwtMTM2KCVyMzApIDsjIDkwMDkgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjksLTEzMiglcjMwKSA7IyA5MDExIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI4LC0xMjgoJXIzMCkgOyMgOTAxMyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNywtMTI0KCVyMzApIDsjIDkwMTUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjYsLTEyMCglcjMwKSA7IyA5MDE3IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI1LC0xMTYoJXIzMCkgOyMgOTAxOSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCwtMTEyKCVyMzApIDsjIDkwMjEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsLTEwOCglcjMwKSA7IyA5MDIzIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIyNiwtMjc2KCVyMzApIDsjIDQgcmVsb2FkX291dHNpKzIvNgotCWxkaSAwLCVyOSA7IyAyNSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDAsJXI4IDsjIDI4IHJlbG9hZF9vdXRzaSsyLzIKLQlzdHcgJXIwLC0yNjAoJXIzMCkgOyMgMzQgcmVsb2FkX291dHNpKzIvNgotCWxkaSAwLCVyMTAgOyMgMzEgcmVsb2FkX291dHNpKzIvMgotCWxkaSA2NDAsJXIyNiA7IyAzNyByZWxvYWRfb3V0c2krMi8yCi0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg3NzQgcmVsb2FkX291dHNpKzIvNQotCWNvcHkgJXIyNCwlcjE1IDsjIDggcmVsb2FkX291dHNpKzIvMQotCXN0dyAlcjEsLTI5NiglcjMwKSA7IyAyMzI1IHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMjMsJXI1IDsjIDEwIHJlbG9hZF9vdXRzaSsyLzEKLQlhZGRsICVyMSwlcjI1LCVyMTYgOyMgMTkgYWRkc2kzLzEKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIG1hbGxvYywlcjIgOyMgMzkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgMjAoJXI1KSwlcjE0IDsjIDIyIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw8PiAwLCVyMjgsTCQwMDIxIDsjIDQ4IGJsZXUrMQotCXN0dyAlcjI4LC0zMTIoJXIzMCkgOyMgNDMgcmVsb2FkX291dHNpKzIvNgotTCQwOTUzCi0JYmwgTCQwODY3LCVyMCA7IyA1MyBqdW1wCi0JbGRpIDEyLCVyMjggOyMgNTEgcmVsb2FkX291dHNpKzIvMgotTCQwMDIxCi0JbGRpIDMyLCVyMTkgOyMgNTggcmVsb2FkX291dHNpKzIvMgotCXN0dyAlcjE5LC0zMDgoJXIzMCkgOyMgNTkgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjAsLTMwNCglcjMwKSA7IyA2MiByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTUsMTIoJXI1KSA7IyA2NSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMCw4KCVyNSkgOyMgODUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjAsMjQoJXI1KSA7IyA4OCByZWxvYWRfb3V0c2krMi82Ci0JYWRkaWwgTFInZG9uZV9fXzItJGdsb2JhbCQsJXIyNyA7IyA5MiBwaWMyX2xvX3N1bSsxCi0JbGR3IDI4KCVyNSksJXIxOSA7IyA2OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IFJSJ2RvbmVfX18yLSRnbG9iYWwkKCVyMSksJXIyMCA7IyA5NCByZWxvYWRfb3V0c2krMi81Ci0JZGVwaSAwLDMsMSwlcjE5IDsjIDY5IGFuZHNpMy8yCi0JZGVwaSAwLDYsMiwlcjE5IDsjIDgwIGFuZHNpMy8yCi0JY29taWIsPD4gMCwlcjIwLEwkMDAyMiA7IyA5NSBibGV1KzEKLQlzdHcgJXIxOSwyOCglcjUpIDsjIDgyIHJlbG9hZF9vdXRzaSsyLzYKLQlhZGRpbCBMUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQsJXIyNyA7IyA5OSBwaWMyX2xvX3N1bSsxCi0JbGRvIFJSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCglcjEpLCVyNCA7IyAxMDAgbW92aGktMgotCWNvcHkgJXI0LCVyMjYgOyMgMTAxIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMCwlcjI1IDsjIDEwMiByZWxvYWRfb3V0c2krMi8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyIDsjIDEwNCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkaSAyNTYsJXIyNCA7IyAxMDMgcmVsb2FkX291dHNpKzIvMgotCWxkaSAxLCVyMjAgOyMgODczMiBtb3ZxaSsxLzIKLQlsZG8gOTcoJXI0KSwlcjE5IDsjIDg3MzYgYWRkc2kzLzIKLQlsZG8gMTIyKCVyNCksJXI0IDsjIDg3MzggYWRkc2kzLzIKLQlzdGJzLG1hICVyMjAsMSglcjE5KSA7IyAxMTUgbW92cWkrMS82Ci1MJDExNTUKLQljb21iLD49LG4gJXI0LCVyMTksTCQxMTU1IDsjIDEyMSBibGV1KzEKLQlzdGJzLG1hICVyMjAsMSglcjE5KSA7IyAxMTUgbW92cWkrMS82Ci0JbGRpIDEsJXIyMSA7IyA4NzE3IG1vdnFpKzEvMgotCWFkZGlsIExSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCwlcjI3IDsjIDg3MTIgcGljMl9sb19zdW0rMQotCWxkbyBSUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQoJXIxKSwlcjE5IDsjIDg3MTUgbW92aGktMgotCWxkbyA2NSglcjE5KSwlcjIwIDsjIDg3MjEgYWRkc2kzLzIKLQlsZG8gOTAoJXIxOSksJXIxOSA7IyA4NzIzIGFkZHNpMy8yCi0Jc3RicyxtYSAlcjIxLDEoJXIyMCkgOyMgMTM4IG1vdnFpKzEvNgotTCQxMTU2Ci0JY29tYiw+PSxuICVyMTksJXIyMCxMJDExNTYgOyMgMTQ0IGJsZXUrMQotCXN0YnMsbWEgJXIyMSwxKCVyMjApIDsjIDEzOCBtb3ZxaSsxLzYKLQlsZGkgNDgsJXIyMCA7IyAxNTEgcmVsb2FkX291dHNpKzIvMgotCWxkaSA1NywlcjIyIDsjIDc5NzYgcmVsb2FkX291dHNpKzIvMgotCWxkaSAxLCVyMjEgOyMgODcwNyBtb3ZxaSsxLzIKLQlhZGRpbCBMUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQrNDgsJXIyNyA7IyA4NzA1IHBpYzJfbG9fc3VtKzEKLQlsZG8gUlIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkKzQ4KCVyMSksJXIxOSA7IyA4NzExIG1vdmhpLTIKLUwkMDAzNwotCWxkbyAxKCVyMjApLCVyMjAgOyMgMTY0IGFkZHNpMy8yCi0JY29tYiw+PSAlcjIyLCVyMjAsTCQwMDM3IDsjIDE2NyBibGV1KzEKLQlzdGJzLG1hICVyMjEsMSglcjE5KSA7IyAxNjEgbW92cWkrMS82Ci0JYWRkaWwgTFIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkLCVyMjcgOyMgMTc0IHBpYzJfbG9fc3VtKzEKLQlsZG8gUlIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkKCVyMSksJXIxOSA7IyAxNzUgbW92aGktMgotCWxkaSAxLCVyMjAgOyMgMTc2IG1vdnFpKzEvMgotCXN0YiAlcjIwLDk1KCVyMTkpIDsjIDE3NyBtb3ZxaSsxLzYKLQlhZGRpbCBMUidkb25lX19fMi0kZ2xvYmFsJCwlcjI3IDsjIDE3OCBwaWMyX2xvX3N1bSsxCi0JbGRpIDEsJXIxOSA7IyAxODAgcmVsb2FkX291dHNpKzIvMgotCXN0dyAlcjE5LFJSJ2RvbmVfX18yLSRnbG9iYWwkKCVyMSkgOyMgMTgxIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDAyMgotCWxkdyA0KCVyNSksJXIxOSA7IyAxODcgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDAzOSA7IyAxODkgYmxldSsxCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDE5MyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSxuIDAsJXIyNixMJDAwNDAgOyMgMTk1IGJsZXUrMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgMjA1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGRpIDMyLCVyMjUgOyMgMjAzIHJlbG9hZF9vdXRzaSsyLzIKLQlibCBMJDExNTcsJXIwIDsjIDIxMSBqdW1wCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDIyMyByZWxvYWRfb3V0c2krMi82Ci1MJDAwNDAKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIG1hbGxvYywlcjIgOyMgMjE5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGRpIDMyLCVyMjYgOyMgMjE3IHJlbG9hZF9vdXRzaSsyLzIKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMjIzIHJlbG9hZF9vdXRzaSsyLzYKLUwkMTE1NwotCWxkdyAwKCVyNSksJXIxOSA7IyAyMjggcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+IDAsJXIxOSxMJDAwNDIgOyMgMjMwIGJsZXUrMQotCWxkaSAzMiwlcjE5IDsjIDI0MyByZWxvYWRfb3V0c2krMi8yCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyAyMzQgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDIzMiByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyAyMzgganVtcAotCWxkaSAxMiwlcjI4IDsjIDUxIHJlbG9hZF9vdXRzaSsyLzIKLUwkMDA0MgotCXN0dyAlcjE5LDQoJXI1KSA7IyAyNDQgcmVsb2FkX291dHNpKzIvNgotTCQwMDM5Ci0JbGR3IDAoJXI1KSwlcjYgOyMgMjQ5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDc5ODEgcmVsb2FkX291dHNpKzIvNQotCWNvbWNsciw8PiAlcjE2LCVyMTksJXIwIDsjIDc5ODIgYmxldSsxCi0JYmwgTCQwMDQ0LCVyMAotCWNvcHkgJXI2LCVyMTIgOyMgMjUzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDIzMzQgcmVsb2FkX291dHNpKzIvNQotTCQxMTc4Ci0JbGRicyxtYSAxKCVyMTkpLCVyNyA7IyAyNzcgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMDQ3IDsjIDI4MiBibGV1KzEKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDIzMzcgcmVsb2FkX291dHNpKzIvNgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyAyODMgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgMjg2IHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMDQ3Ci0JbGRvIC0xMCglcjcpLCVyMTkgOyMgNzg5NSBhZGRzaTMvMgotCWFkZGksdXYgLTExNSwlcjE5LCVyMCA7IyA3ODk2IGNhc2VzaTAKLQlibHIsbiAlcjE5LCVyMAotCWIsbiBMJDAwNzYKLUwkMDg2MwotCWJsIEwkMDM3NiwlcjAKLQlub3AgOyMgOTA5MiBzd2l0Y2hfanVtcAotTCQwOTU0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MDk1IHN3aXRjaF9qdW1wCi1MJDA5NTUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkwOTggc3dpdGNoX2p1bXAKLUwkMDk1NgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEwMSBzd2l0Y2hfanVtcAotTCQwOTU3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTA0IHN3aXRjaF9qdW1wCi1MJDA5NTgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMDcgc3dpdGNoX2p1bXAKLUwkMDk1OQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTExMCBzd2l0Y2hfanVtcAotTCQwOTYwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTEzIHN3aXRjaF9qdW1wCi1MJDA5NjEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMTYgc3dpdGNoX2p1bXAKLUwkMDk2MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTExOSBzd2l0Y2hfanVtcAotTCQwOTYzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTIyIHN3aXRjaF9qdW1wCi1MJDA5NjQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMjUgc3dpdGNoX2p1bXAKLUwkMDk2NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEyOCBzd2l0Y2hfanVtcAotTCQwOTY2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTMxIHN3aXRjaF9qdW1wCi1MJDA5NjcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMzQgc3dpdGNoX2p1bXAKLUwkMDk2OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEzNyBzd2l0Y2hfanVtcAotTCQwOTY5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTQwIHN3aXRjaF9qdW1wCi1MJDA5NzAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNDMgc3dpdGNoX2p1bXAKLUwkMDk3MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE0NiBzd2l0Y2hfanVtcAotTCQwOTcyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTQ5IHN3aXRjaF9qdW1wCi1MJDA5NzMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNTIgc3dpdGNoX2p1bXAKLUwkMDk3NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE1NSBzd2l0Y2hfanVtcAotTCQwOTc1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTU4IHN3aXRjaF9qdW1wCi1MJDA5NzYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNjEgc3dpdGNoX2p1bXAKLUwkMDk3NwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE2NCBzd2l0Y2hfanVtcAotTCQwOTc4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTY3IHN3aXRjaF9qdW1wCi1MJDA5NzkKLQlibCBMJDAwNzcsJXIwIDsjIDkxNzAgc3dpdGNoX2p1bXAKLQlsZHcgLTI5NiglcjMwKSwlcjI2IDsjIDIzNDkgcmVsb2FkX291dHNpKzIvNQotTCQwOTgwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTczIHN3aXRjaF9qdW1wCi1MJDA5ODEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNzYgc3dpdGNoX2p1bXAKLUwkMDk4MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE3OSBzd2l0Y2hfanVtcAotTCQwOTgzCi0JYmwgTCQwMzY4LCVyMAotCW5vcCA7IyA5MTgyIHN3aXRjaF9qdW1wCi1MJDA5ODQKLQlibCBMJDAzNzIsJXIwCi0Jbm9wIDsjIDkxODUgc3dpdGNoX2p1bXAKLUwkMDk4NQotCWJsIEwkMDEwNCwlcjAKLQlub3AgOyMgOTE4OCBzd2l0Y2hfanVtcAotTCQwOTg2Ci0JYmwgTCQxMTU4LCVyMCA7IyA5MTkxIHN3aXRjaF9qdW1wCi0JbGRpIDEwMjYsJXIxOSA7IyA2NjIgcmVsb2FkX291dHNpKzIvMgotTCQwOTg3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTk0IHN3aXRjaF9qdW1wCi1MJDA5ODgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxOTcgc3dpdGNoX2p1bXAKLUwkMDk4OQotCWJsIEwkMDE5NiwlcjAgOyMgOTIwMCBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgwMjcgcmVsb2FkX291dHNpKzIvNQotTCQwOTkwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjAzIHN3aXRjaF9qdW1wCi1MJDA5OTEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMDYgc3dpdGNoX2p1bXAKLUwkMDk5MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIwOSBzd2l0Y2hfanVtcAotTCQwOTkzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjEyIHN3aXRjaF9qdW1wCi1MJDA5OTQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMTUgc3dpdGNoX2p1bXAKLUwkMDk5NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIxOCBzd2l0Y2hfanVtcAotTCQwOTk2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjIxIHN3aXRjaF9qdW1wCi1MJDA5OTcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMjQgc3dpdGNoX2p1bXAKLUwkMDk5OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIyNyBzd2l0Y2hfanVtcAotTCQwOTk5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjMwIHN3aXRjaF9qdW1wCi1MJDEwMDAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMzMgc3dpdGNoX2p1bXAKLUwkMTAwMQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIzNiBzd2l0Y2hfanVtcAotTCQxMDAyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjM5IHN3aXRjaF9qdW1wCi1MJDEwMDMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNDIgc3dpdGNoX2p1bXAKLUwkMTAwNAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI0NSBzd2l0Y2hfanVtcAotTCQxMDA1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjQ4IHN3aXRjaF9qdW1wCi1MJDEwMDYKLQlibCBMJDAxMDEsJXIwIDsjIDkyNTEgc3dpdGNoX2p1bXAKLQlsZGkgMTAyNiwlcjE5IDsjIDY2MiByZWxvYWRfb3V0c2krMi8yCi1MJDEwMDcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNTQgc3dpdGNoX2p1bXAKLUwkMTAwOAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI1NyBzd2l0Y2hfanVtcAotTCQxMDA5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjYwIHN3aXRjaF9qdW1wCi1MJDEwMTAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNjMgc3dpdGNoX2p1bXAKLUwkMTAxMQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI2NiBzd2l0Y2hfanVtcAotTCQxMDEyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjY5IHN3aXRjaF9qdW1wCi1MJDEwMTMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNzIgc3dpdGNoX2p1bXAKLUwkMTAxNAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI3NSBzd2l0Y2hfanVtcAotTCQxMDE1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjc4IHN3aXRjaF9qdW1wCi1MJDEwMTYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyODEgc3dpdGNoX2p1bXAKLUwkMTAxNwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI4NCBzd2l0Y2hfanVtcAotTCQxMDE4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjg3IHN3aXRjaF9qdW1wCi1MJDEwMTkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyOTAgc3dpdGNoX2p1bXAKLUwkMTAyMAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI5MyBzd2l0Y2hfanVtcAotTCQxMDIxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjk2IHN3aXRjaF9qdW1wCi1MJDEwMjIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyOTkgc3dpdGNoX2p1bXAKLUwkMTAyMwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMwMiBzd2l0Y2hfanVtcAotTCQxMDI0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzA1IHN3aXRjaF9qdW1wCi1MJDEwMjUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMDggc3dpdGNoX2p1bXAKLUwkMTAyNgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMxMSBzd2l0Y2hfanVtcAotTCQxMDI3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzE0IHN3aXRjaF9qdW1wCi1MJDEwMjgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMTcgc3dpdGNoX2p1bXAKLUwkMTAyOQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMyMCBzd2l0Y2hfanVtcAotTCQxMDMwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzIzIHN3aXRjaF9qdW1wCi1MJDEwMzEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMjYgc3dpdGNoX2p1bXAKLUwkMTAzMgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMyOSBzd2l0Y2hfanVtcAotTCQxMDMzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzMyIHN3aXRjaF9qdW1wCi1MJDEwMzQKLQlibCBMJDAyMTYsJXIwIDsjIDkzMzUgc3dpdGNoX2p1bXAKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0MTggcmVsb2FkX291dHNpKzIvNQotTCQxMDM1Ci0JYmwgTCQwMzg3LCVyMCA7IyA5MzM4IHN3aXRjaF9qdW1wCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAzNzk3IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTAzNgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM0MSBzd2l0Y2hfanVtcAotTCQxMDM3Ci0JYmwgTCQwMDUzLCVyMCA7IyA5MzQ0IHN3aXRjaF9qdW1wCi0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg3NzcgcmVsb2FkX291dHNpKzIvNQotTCQxMDM4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzQ3IHN3aXRjaF9qdW1wCi1MJDEwMzkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNTAgc3dpdGNoX2p1bXAKLUwkMTA0MAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM1MyBzd2l0Y2hfanVtcAotTCQxMDQxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzU2IHN3aXRjaF9qdW1wCi1MJDEwNDIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNTkgc3dpdGNoX2p1bXAKLUwkMTA0MwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM2MiBzd2l0Y2hfanVtcAotTCQxMDQ0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzY1IHN3aXRjaF9qdW1wCi1MJDEwNDUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNjggc3dpdGNoX2p1bXAKLUwkMTA0NgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM3MSBzd2l0Y2hfanVtcAotTCQxMDQ3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mzc0IHN3aXRjaF9qdW1wCi1MJDEwNDgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNzcgc3dpdGNoX2p1bXAKLUwkMTA0OQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM4MCBzd2l0Y2hfanVtcAotTCQxMDUwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzgzIHN3aXRjaF9qdW1wCi1MJDEwNTEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzODYgc3dpdGNoX2p1bXAKLUwkMTA1MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM4OSBzd2l0Y2hfanVtcAotTCQxMDUzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzkyIHN3aXRjaF9qdW1wCi1MJDEwNTQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzOTUgc3dpdGNoX2p1bXAKLUwkMTA1NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM5OCBzd2l0Y2hfanVtcAotTCQxMDU2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDAxIHN3aXRjaF9qdW1wCi1MJDEwNTcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MDQgc3dpdGNoX2p1bXAKLUwkMTA1OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQwNyBzd2l0Y2hfanVtcAotTCQxMDU5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDEwIHN3aXRjaF9qdW1wCi1MJDEwNjAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MTMgc3dpdGNoX2p1bXAKLUwkMTA2MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQxNiBzd2l0Y2hfanVtcAotTCQxMDYyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDE5IHN3aXRjaF9qdW1wCi1MJDEwNjMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MjIgc3dpdGNoX2p1bXAKLUwkMTA2NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQyNSBzd2l0Y2hfanVtcAotTCQxMDY1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDI4IHN3aXRjaF9qdW1wCi1MJDEwNjYKLQlibCBMJDAzODMsJXIwIDsjIDk0MzEgc3dpdGNoX2p1bXAKLQlsZGkgNDYwOCwlcjIwIDsjIDM3NzggcmVsb2FkX291dHNpKzIvMgotTCQxMDY3Ci0JYmwgTCQwMzgwLCVyMAotCW5vcCA7IyA5NDM0IHN3aXRjaF9qdW1wCi1MJDEwNjgKLQlibCxuIEwkMDA3NiwlcjAgOyMgNzg5OSBqdW1wCi1MJDAwNTMKLQlsZHcgLTI5NiglcjMwKSwlcjI1IDsjIDIzNDMgcmVsb2FkX291dHNpKzIvNQotCWxkbyAxKCVyMSksJXIxOSA7IyAzMDYgYWRkc2kzLzIKLQljb21iLD0sbiAlcjE5LCVyMjUsTCQwMDU1IDsjIDMwOCBibGV1KzEKLQliYiw8ICVyMTUsMjgsTCQwMDU1IDsjIDMxMyBibGV1KzMKLQlsZHcgLTI3NiglcjMwKSwlcjI2IDsjIDMxNSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBhdF9iZWdsaW5lX2xvY19wLCVyMiA7IyAzMjEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMTUsJXIyNCA7IyAzMTkgcmVsb2FkX291dHNpKzIvMQotCWV4dHJzICVyMjgsMzEsOCwlcjI4IDsjIDMyNCBleHRlbmRxaXNpMgotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyAzMjYgYmxldSsxCi0JYmwsbiBMJDAwNzYsJXIwCi1MJDAwNTUKLQlsZHcgMCglcjUpLCVyNCA7IyA3OTg2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNzk4OSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3OTg3IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA3OTg4IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMDYwIDsjIDc5OTAgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NzAxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDA2MQotCWNvbWNsciw8PiAlcjMsJXIyMCwlcjAgOyMgMzU3IGJsZXUrMQotCWJsIEwkMDk0NCwlcjAKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAzNjcgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwMDY2IDsjIDM3NSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMzY5IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyAzNzggcmVsb2FkX291dHNpKzIvNgotTCQwMDY2Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDM4NSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAzODkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgMzg3IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMzk3IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAzOTMgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDAwNTkgOyMgNDA3IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDA5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDQxMiBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDQxMyBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDA2OSA7IyA0MTggYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA0MTYgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA0MTkgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQyMiBhZGRzaTMvMQotTCQwMDY5Ci0JY29taWIsPSAwLCVyOCxMJDAwNzAgOyMgNDI1IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNDI2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDQyOSBhZGRzaTMvMQotTCQwMDcwCi0JY29taWIsPSAwLCVyOSxMJDAwNTkgOyMgNDMyIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNDMzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDQzNiBhZGRzaTMvMQotTCQwMDU5Ci0JbGR3IDAoJXI1KSwlcjQgOyMgMzM3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgMzQxIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDMzOCBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMzM5IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMDYxCi0Jbm9wIDsjIDM0MyBibGV1KzEKLUwkMDA2MAotCWxkaSA4LCVyMTkgOyMgNDU4IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNDc5IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDQ1OSBtb3ZxaSsxLzYKLUwkMDA3NwotCWNvbWIsPSxuICVyMTYsJXIyNixMJDAwNzkgOyMgNDg1IGJsZXUrMQotCWJiLDwgJXIxNSwyOCxMJDAwNzkgOyMgNDkwIGJsZXUrMwotCWNvcHkgJXIxNiwlcjI1IDsjIDQ5NCByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBhdF9lbmRsaW5lX2xvY19wLCVyMiA7IyA0OTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMTUsJXIyNCA7IyA0OTYgcmVsb2FkX291dHNpKzIvMQotCWV4dHJzICVyMjgsMzEsOCwlcjI4IDsjIDUwMSBleHRlbmRxaXNpMgotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA1MDMgYmxldSsxCi0JYmwsbiBMJDAwNzYsJXIwCi1MJDAwNzkKLQlsZHcgMCglcjUpLCVyNCA7IyA3OTk0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNzk5NyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3OTk1IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA3OTk2IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMDg0IDsjIDc5OTggYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4Njk5IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDA4NQotCWNvbWNsciw8PiAlcjMsJXIyMCwlcjAgOyMgNTM0IGJsZXUrMQotCWJsIEwkMDk0NCwlcjAKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA1NDQgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwMDkwIDsjIDU1MiBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNTQ2IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA1NTUgcmVsb2FkX291dHNpKzIvNgotTCQwMDkwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDU2MiByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA1NjYgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNTY0IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNTc0IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA1NzAgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDAwODMgOyMgNTg0IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNTg2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDU4OSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDU5MCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDA5MyA7IyA1OTUgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA1OTMgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA1OTYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDU5OSBhZGRzaTMvMQotTCQwMDkzCi0JY29taWIsPSAwLCVyOCxMJDAwOTQgOyMgNjAyIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjAzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDYwNiBhZGRzaTMvMQotTCQwMDk0Ci0JY29taWIsPSAwLCVyOSxMJDAwODMgOyMgNjA5IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjEwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDYxMyBhZGRzaTMvMQotTCQwMDgzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNTE0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNTE4IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDUxNSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNTE2IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMDg1Ci0Jbm9wIDsjIDUyMCBibGV1KzEKLUwkMDA4NAotCWxkaSA5LCVyMTkgOyMgNjM1IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjU2IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDYzNiBtb3ZxaSsxLzYKLUwkMDg3NwotCWJsIEwkMDExMCwlcjAgOyMgODk3IGp1bXAKLQlzdHcgJXIyMSwtMjk2KCVyMzApIDsjIDIzOTEgcmVsb2FkX291dHNpKzIvNgotTCQwMTAxCi1MJDExNTgKLQlhbmQgJXIxNSwlcjE5LCVyMTkgOyMgNjYzIGFuZHNpMy8xCi0JY29taWNsciw9IDAsJXIxOSwlcjAgOyMgNjY1IGJsZXUrMQotCWJsLG4gTCQwMDc2LCVyMAotTCQwMTA0Ci0JY29taWIsPD4gMCwlcjgsTCQwMTA1IDsjIDY3NCBibGV1KzEKLQlsZGkgMCwlcjEzIDsjIDcxMSByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMsPj0gJXIxNSwyNiwxLCVyMCA7IyA2ODEgYmxldSszCi0JZXh0cnMsPCAlcjE1LDI3LDEsJXIwIDsjIDcwMCBtb3ZzaS00Ci0Jbm9wCi0JYmwsbiBMJDAwNzYsJXIwCi1MJDAxMDUKLQlsZGkgMCwlcjExIDsjIDcxNCByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDAsJXIyMiA7IyA3MTYgcmVsb2FkX291dHNpKzIvMgotCWxkaSA0MywlcjI0IDsjIDg2ODggcmVsb2FkX291dHNpKzIvMgotCWxkaSA2MywlcjIzIDsjIDg2OTAgcmVsb2FkX291dHNpKzIvMgotCWxkaSA0MiwlcjI4IDsjIDg2OTIgcmVsb2FkX291dHNpKzIvMgotCWxkaSAyLCVyMTkgOyMgODY5NCByZWxvYWRfb3V0c2krMi8yCi0JYW5kICVyMTUsJXIxOSwlcjI1IDsjIDg2OTUgYW5kc2kzLzEKLQlsZGkgOTIsJXIyNiA7IyA4Njk3IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDEwOQotCWNvbWIsPSAlcjI0LCVyNyxMJDAxMTIgOyMgNzI3IGJsZXUrMQotCWNvcHkgJXIxMSwlcjE5IDsjIDg3ODAgcmVsb2FkX291dHNpKzIvMQotCWRlcGkgLTEsMzEsMSwlcjE5IDsjIDcyOSBpb3JzaTMrMS8yCi0JYmwgTCQwMTEzLCVyMCA7IyA3MzEganVtcAotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDczMCBleHRlbmRxaXNpMgotTCQwMTEyCi0JZXh0cnMgJXIxMSwzMSw4LCVyMTkgOyMgNzM0IGV4dGVuZHFpc2kyCi1MJDAxMTMKLUwkMTE1OQotCWNvbWIsPSAlcjIzLCVyNyxMJDAxMTQgOyMgNzQ0IGJsZXUrMQotCWNvcHkgJXIxOSwlcjExIDsjIDczNyByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjIyLCVyMTkgOyMgODc4MyByZWxvYWRfb3V0c2krMi8xCi0JZGVwaSAtMSwzMSwxLCVyMTkgOyMgNzQ2IGlvcnNpMysxLzIKLQlibCBMJDAxMTUsJXIwIDsjIDc0OCBqdW1wCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgNzQ3IGV4dGVuZHFpc2kyCi1MJDAxMTQKLQlleHRycyAlcjIyLDMxLDgsJXIxOSA7IyA3NTEgZXh0ZW5kcWlzaTIKLUwkMDExNQotCWxkdyAtMjk2KCVyMzApLCVyMjEgOyMgMjM1NSByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMSxMJDAxMTAgOyMgNzU3IGJsZXUrMQotCWNvcHkgJXIxOSwlcjIyIDsjIDc1NCByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjIxLCVyMjAgOyMgODc0MyByZWxvYWRfb3V0c2krMi8xCi0JbGRicyxtYSAxKCVyMjApLCVyNyA7IyA3NzYgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMTE4IDsjIDc4MSBibGV1KzEKLQlzdHcgJXIyMCwtMjk2KCVyMzApIDsjIDIzNjQgcmVsb2FkX291dHNpKzIvNgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA3ODIgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNzg1IHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMTE4Ci0JY29tYiw9ICVyMjgsJXI3LEwkMDEwOQotCW5vcCA7IyA4MDIgYmxldSsxCi0JY29taWIsPD4sbiAwLCVyMjUsTCQwODY5IDsjIDgwNyBibGV1KzEKLQljb21iLD0gJXIyNCwlcjcsTCQxMTU5IDsjIDgxMSBibGV1KzEKLQlleHRycyAlcjExLDMxLDgsJXIxOSA7IyA3MzQgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIyMywlcjcsTCQwMTA5IDsjIDgxNSBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0MDAgcmVsb2FkX291dHNpKzIvNQotCWJsLG4gTCQxMTYwLCVyMCA7IyA4MjcganVtcAotTCQwODY5Ci0JY29tYiw8PiAlcjI2LCVyNyxMJDAxMjYgOyMgODMxIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQwMCByZWxvYWRfb3V0c2krMi81Ci0JY29tY2xyLDw+ICVyMTYsJXIyMCwlcjAgOyMgODM1IGJsZXUrMQotCWJsIEwkMDkwMywlcjAKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDg2MyBhZGRzaTMvMgotCWxkYiAxKCVyMjEpLCVyMyA7IyA4NjAgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMTI5IDsjIDg2NSBibGV1KzEKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDIzNzkgcmVsb2FkX291dHNpKzIvNgotCWFkZGwgJXIxNCwlcjMsJXIxOSA7IyA4NjYgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjMgOyMgODY5IHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMTI5Ci0JY29tYiw9ICVyMjQsJXIzLEwkMDEwOSA7IyA4ODYgYmxldSsxCi0JY29weSAlcjMsJXI3IDsjIDkwMyByZWxvYWRfb3V0c2krMi8xCi0JY29tYiw8PiAlcjIzLCVyMyxMJDA4NzcKLQlub3AgOyMgODkwIGJsZXUrMQotCWJsLG4gTCQwMTA5LCVyMCA7IyA5MDUganVtcAotTCQwMTI2Ci1MJDExNjAKLQlsZG8gLTEoJXIxOSksJXIxOSA7IyA5MTAgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDIzOTcgcmVsb2FkX291dHNpKzIvNgotTCQwMTEwCi0JY29taWNsciw8PiAwLCVyOCwlcjAgOyMgOTI3IGJsZXUrMQotCWJsIEwkMTE2MSwlcjAKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDIzMjggcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0sbiAwLCVyMjIsTCQwMTM3IDsjIDkzNCBibGV1KzEKLQlsZHcgMCglcjUpLCVyMyA7IyA4MDAyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAwNSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MDAzIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MDA0IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMTM5IDsjIDgwMDYgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4Njg2IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDE0MAotCWNvbWNsciw8PiAlcjQsJXIyMCwlcjAgOyMgOTYxIGJsZXUrMQotCWJsIEwkMDk0NCwlcjAKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA5NzEgYXNobHNpMysxCi0JY29tYiw+Pj0gJXI0LCVyMTksTCQwMTQ1IDsjIDk3OSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgOTczIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyA5ODIgcmVsb2FkX291dHNpKzIvNgotTCQwMTQ1Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDk4OSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA5OTMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgOTkxIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTAwMSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgOTk3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwMTM4IDsjIDEwMTEgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxMDEzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDEwMTYgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyAxMDE3IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMTQ4IDsjIDEwMjIgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxMDIwIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgMTAyMyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTAyNiBhZGRzaTMvMQotTCQwMTQ4Ci0JY29taWIsPSAwLCVyOCxMJDAxNDkgOyMgMTAyOSBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDEwMzAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTAzMyBhZGRzaTMvMQotTCQwMTQ5Ci0JY29taWIsPSAwLCVyOSxMJDAxMzggOyMgMTAzNiBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDEwMzcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTA0MCBhZGRzaTMvMQotTCQwMTM4Ci0JbGR3IDAoJXI1KSwlcjMgOyMgOTQxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgOTQ1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDk0MiBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgOTQzIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMTQwCi0Jbm9wIDsjIDk0NyBibGV1KzEKLUwkMDEzOQotCWNvbWliLD0gMCwlcjE0LEwkMDE1NCA7IyAxMDYzIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQwMyByZWxvYWRfb3V0c2krMi81Ci0JbGRiIC0yKCVyMTkpLCVyMTkgOyMgMTA2NiB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlhZGRsICVyMTQsJXIxOSwlcjE5IDsjIDEwNjcgYWRkc2kzLzEKLQlibCBMJDA5NDcsJXIwIDsjIDEwNzEganVtcAotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMTA2OSBtb3ZxaSsxLzUKLUwkMDE1NAotCWxkYiAtMiglcjE5KSwlcjE5IDsjIDEwNzUgbW92cWkrMS81Ci1MJDA5NDcKLQljb21pYiw9IDAsJXIxNCxMJDAxNTYgOyMgMTA3OSBibGV1KzEKLQlleHRycyAlcjE5LDMxLDgsJXIyMCA7IyAxMDc2IGV4dGVuZHFpc2kyCi0JbGRiIDQ2KCVyMTQpLCVyMTkgOyMgMTA4MSBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAxMDgyIGV4dGVuZHFpc2kyCi0JY29tYiw9ICVyMTksJXIyMCxMJDAxNTcgOyMgMTA4NCBibGV1KzEKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLQlibCxuIEwkMTE2MiwlcjAgOyMgMTA4NSBqdW1wCi1MJDAxNTYKLQlsZGkgNDYsJXIxOSA7IyAxMDg5IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMTksJXIyMCxMJDExNjIgOyMgMTA5MSBibGV1KzEKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDE1NwotCWNvbWliLD0gMCwlcjExLEwkMDE1MyA7IyAxMDk2IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQwOSByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw8PD0gJXIxNiwlcjE5LEwkMTE2MiA7IyAxMDk4IGJsZXUrMQotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotCWNvbWliLD0sbiAwLCVyMTQsTCQwMTU4IDsjIDExMDAgYmxldSsxCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAxMTAzIHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjE5LCVyMTkgOyMgMTEwNCBhZGRzaTMvMQotTCQwMTU4Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyAxMTEyIG1vdnFpKzEvNQotCWNvbWliLD0gMCwlcjE0LEwkMDE2MCA7IyAxMTE2IGJsZXUrMQotCWV4dHJzICVyMTksMzEsOCwlcjIwIDsjIDExMTMgZXh0ZW5kcWlzaTIKLQlsZGIgMTAoJXIxNCksJXIxOSA7IyAxMTE4IG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDExMTkgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIxOSwlcjIwLEwkMDE2MSA7IyAxMTIxIGJsZXUrMQotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotCWJsLG4gTCQxMTYyLCVyMCA7IyAxMTIyIGp1bXAKLUwkMDE2MAotCWNvbWliLDw+IDEwLCVyMjAsTCQxMTYyIDsjIDExMjYgYmxldSsxCi0JbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCi1MJDAxNjEKLQliYiw8ICVyMTUsMjUsTCQxMTYyIDsjIDExMzQgYmxldSszCi0JbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDEyLCVyMjYgOyMgMTE0MCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjYsJXIyNSA7IyAxMTQyIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI4LCVyNiwlcjI0IDsjIDExMzcgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgMTE0NiBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtMyglcjI0KSwlcjI0IDsjIDExNDQgYWRkc2kzLzIKLQlibCBMJDAxNjIsJXIwIDsjIDExNTEganVtcAotCWxkaSAxLCVyMTMgOyMgMTE0OSByZWxvYWRfb3V0c2krMi8yCi1MJDAxNTMKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMTE2MgotCWNvcHkgJXI2LCVyMjUgOyMgMTE2MSByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyOCwlcjYsJXIyNCA7IyAxMTU2IHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdG9yZV9vcDEsJXIyIDsjIDExNjUgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZG8gLTYoJXIyNCksJXIyNCA7IyAxMTYzIGFkZHNpMy8yCi1MJDAxNjIKLQlsZG8gMyglcjYpLCVyNiA7IyAxMTY4IGFkZHNpMy8yCi1MJDAxMzcKLQlsZHcgMCglcjUpLCVyMyA7IyA4MDEwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAxMyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MDExIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MDEyIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMTY0IDsjIDgwMTQgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4Njg0IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDE2NQotCWNvbWNsciw8PiAlcjQsJXIyMCwlcjAgOyMgMTE5NSBibGV1KzEKLQlibCBMJDA5NDQsJXIwCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTIwNSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDAxNzAgOyMgMTIxMyBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTIwNyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCw0KCVyNSkgOyMgMTIxNiByZWxvYWRfb3V0c2krMi82Ci1MJDAxNzAKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTIyMyByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxMjI3IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDEyMjUgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxMjM1IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxMjMxIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwMTYzIDsjIDEyNDUgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxMjQ3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDEyNTAgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyAxMjUxIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMTczIDsjIDEyNTYgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxMjU0IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgMTI1NyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTI2MCBhZGRzaTMvMQotTCQwMTczCi0JY29taWIsPSAwLCVyOCxMJDAxNzQgOyMgMTI2MyBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDEyNjQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTI2NyBhZGRzaTMvMQotTCQwMTc0Ci0JY29taWIsPSAwLCVyOSxMJDAxNjMgOyMgMTI3MCBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDEyNzEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTI3NCBhZGRzaTMvMQotTCQwMTYzCi0JbGR3IDAoJXI1KSwlcjMgOyMgMTE3NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDExNzkgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTE3NiBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgMTE3NyBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDE2NQotCW5vcCA7IyAxMTgxIGJsZXUrMQotTCQwMTY0Ci0JbGRpIDE0LCVyMjYgOyMgODc4NiByZWxvYWRfb3V0c2krMi8yCi0JY29taWNsciw9IDAsJXIxMywlcjAgOyMgMTMxMCBiZXEtMS8yCi0JbGRpIDE1LCVyMjYKLQljb3B5ICVyOCwlcjI1IDsjIDEzMTIgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjYsJXI4LCVyMjQgOyMgMTMxNCBzdWJzaTMvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMSwlcjIgOyMgMTMxOCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI2LCVyMjMgOyMgMTMxNiByZWxvYWRfb3V0c2krMi8xCi0JbGRpIDAsJXI5IDsjIDEzMjEgcmVsb2FkX291dHNpKzIvMgotCWNvbWliLDw+IDAsJXIxMSxMJDAwNDMgOyMgMTMyNiBibGV1KzEKLQlsZG8gMyglcjYpLCVyNiA7IyAxMzIzIGFkZHNpMy8yCi0JbGR3IDAoJXI1KSwlcjMgOyMgODAxOSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgwMjIgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgODAyMCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgODAyMSBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDE4MiA7IyA4MDIzIGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjQgOyMgODY4MiByZWxvYWRfb3V0c2krMi8zCi1MJDAxODMKLQljb21iLD0gJXI0LCVyMjAsTCQwOTQ0IDsjIDEzNTIgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTM2MiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDAxODggOyMgMTM3MCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTM2NCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCw0KCVyNSkgOyMgMTM3MyByZWxvYWRfb3V0c2krMi82Ci1MJDAxODgKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTM4MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxMzg0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDEzODIgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxMzkyIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxMzg4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwMTgxIDsjIDE0MDIgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxNDA0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDE0MDcgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyAxNDA4IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMTkxIDsjIDE0MTMgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxNDExIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgMTQxNCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTQxNyBhZGRzaTMvMQotTCQwMTkxCi0JY29taWIsPSAwLCVyOCxMJDAxOTIgOyMgMTQyMCBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDE0MjEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTQyNCBhZGRzaTMvMQotTCQwMTkyCi0JY29taWIsPSAwLCVyOSxMJDAxODEgOyMgMTQyNyBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDE0Mjggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTQzMSBhZGRzaTMvMQotTCQwMTgxCi0JbGR3IDAoJXI1KSwlcjMgOyMgMTMzMiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDEzMzYgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTMzMyBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgMTMzNCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDE4MwotCW5vcCA7IyAxMzM4IGJsZXUrMQotTCQwMTgyCi0JbGRpIDE4LCVyMjYgOyMgMTQ1NCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjgsJXIyNSA7IyAxNDU2IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMywlcjI0IDsjIDE0NTggcmVsb2FkX291dHNpKzIvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMSwlcjIgOyMgMTQ2MiBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI2LCVyMjMgOyMgMTQ2MCByZWxvYWRfb3V0c2krMi8xCi0JYmwgTCQwMDQzLCVyMCA7IyAxNDcwIGp1bXAKLQlsZG8gMyglcjYpLCVyNiA7IyAxNDY0IGFkZHNpMy8yCi1MJDAxOTYKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAzMCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MDI4IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MDI5IGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDIwMSA7IyA4MDMxIGJsZXUrMQotCWNvcHkgJXI2LCVyOCA7IyAxNDc1IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg2ODAgcmVsb2FkX291dHNpKzIvMwotTCQwMjAyCi0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyAxNTAzIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDE1MTMgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwMjA3IDsjIDE1MjEgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDE1MTUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDE1MjQgcmVsb2FkX291dHNpKzIvNgotTCQwMjA3Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDE1MzEgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgMTUzNSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyAxNTMzIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTU0MyBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMTUzOSByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDIwMCA7IyAxNTUzIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTU1NSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyAxNTU4IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgMTU1OSBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDIxMCA7IyAxNTY0IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgMTU2MiBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDE1NjUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDE1NjggYWRkc2kzLzEKLUwkMDIxMAotCWNvbWliLD0gMCwlcjgsTCQwMjExIDsjIDE1NzEgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyAxNTcyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDE1NzUgYWRkc2kzLzEKLUwkMDIxMQotCWNvbWliLD0gMCwlcjksTCQwMjAwIDsjIDE1NzggYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyAxNTc5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDE1ODIgYWRkc2kzLzEKLUwkMDIwMAotCWxkdyAwKCVyNSksJXI0IDsjIDE0ODMgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyAxNDg3IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDE0ODQgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDE0ODUgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAyMDIKLQlub3AgOyMgMTQ4OSBibGV1KzEKLUwkMDIwMQotCWxkaSAyLCVyMTkgOyMgMTYwNCBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDE2MTcganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgMTYwNSBtb3ZxaSsxLzYKLUwkMDIxNgotCWNvbWIsPSAlcjE2LCVyMTksTCQwOTAyIDsjIDE2MjYgYmxldSsxCi0JbGRpIDAsJXIxMyA7IyAxNjIzIHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgMCglcjUpLCVyMyA7IyA4MDM1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAzOCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MDM2IHN1YnNpMy8xCi0JbGRvIDM0KCVyMTkpLCVyMTkgOyMgODAzNyBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDAyMTkgOyMgODAzOSBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg2NzggcmVsb2FkX291dHNpKzIvMwotTCQwMjIwCi0JY29tYiw9ICVyNCwlcjIwLEwkMDk0NCA7IyAxNjYxIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDE2NzEgYXNobHNpMysxCi0JY29tYiw+Pj0gJXI0LCVyMTksTCQwMjI1IDsjIDE2NzkgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDE2NzMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjQsNCglcjUpIDsjIDE2ODIgcmVsb2FkX291dHNpKzIvNgotTCQwMjI1Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDE2ODkgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgMTY5MyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyAxNjkxIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTcwMSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMTY5NyByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXIzLEwkMDIxOCA7IyAxNzExIGJsZXUrMQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTcxMyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyAxNzE2IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXIzLCVyMTkgOyMgMTcxNyBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDIyOCA7IyAxNzIyIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgMTcyMCBhZGRzaTMvMQotCXN1YiAlcjEwLCVyMywlcjE5IDsjIDE3MjMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDE3MjYgYWRkc2kzLzEKLUwkMDIyOAotCWNvbWliLD0gMCwlcjgsTCQwMjI5IDsjIDE3MjkgYmxldSsxCi0Jc3ViICVyOCwlcjMsJXIxOSA7IyAxNzMwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDE3MzMgYWRkc2kzLzEKLUwkMDIyOQotCWNvbWliLD0gMCwlcjksTCQwMjE4IDsjIDE3MzYgYmxldSsxCi0Jc3ViICVyOSwlcjMsJXIxOSA7IyAxNzM3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDE3NDAgYWRkc2kzLzEKLUwkMDIxOAotCWxkdyAwKCVyNSksJXIzIDsjIDE2NDEgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyAxNjQ1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDE2NDIgc3Vic2kzLzEKLQlsZG8gMzQoJXIxOSksJXIxOSA7IyAxNjQzIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMjIwCi0Jbm9wIDsjIDE2NDcgYmxldSsxCi1MJDAyMTkKLQlsZHcgMCglcjUpLCVyNCA7IyA4MDQzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODA0NiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MDQ0IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MDQ1IGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDIzNyA7IyA4MDQ3IGJsZXUrMQotCWNvcHkgJXI2LCVyOCA7IyAxNzYzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg2NzYgcmVsb2FkX291dHNpKzIvMwotTCQwMjM4Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyAxNzkxIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDE4MDEgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwMjQzIDsjIDE4MDkgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDE4MDMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDE4MTIgcmVsb2FkX291dHNpKzIvNgotTCQwMjQzCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDE4MTkgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgMTgyMyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyAxODIxIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTgzMSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMTgyNyByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDIzNiA7IyAxODQxIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTg0MyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyAxODQ2IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgMTg0NyBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDI0NiA7IyAxODUyIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgMTg1MCBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDE4NTMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDE4NTYgYWRkc2kzLzEKLUwkMDI0NgotCWNvbWliLD0gMCwlcjgsTCQwMjQ3IDsjIDE4NTkgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyAxODYwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDE4NjMgYWRkc2kzLzEKLUwkMDI0NwotCWNvbWliLD0gMCwlcjksTCQwMjM2IDsjIDE4NjYgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyAxODY3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDE4NzAgYWRkc2kzLzEKLUwkMDIzNgotCWxkdyAwKCVyNSksJXI0IDsjIDE3NzEgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyAxNzc1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDE3NzIgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDE3NzMgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAyMzgKLQlub3AgOyMgMTc3NyBibGV1KzEKLUwkMDIzNwotCWNvcHkgJXI2LCVyMjIgOyMgMTkwOSByZWxvYWRfb3V0c2krMi8xCi0JbGRvIDEoJXI2KSwlcjYgOyMgMTg5MSBhZGRzaTMvMgotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQyMSByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyAxODkzIG1vdnFpKzEvNQotCWxkaSA5NCwlcjIxIDsjIDE4OTYgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDE4OTQgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMjEsJXIxOSxMJDAyNTEgOyMgMTg5OCBibGV1KzEKLQlsZGkgMywlcjIwIDsjIDgwNTEgbW92cWkrMS8yCi0JbGRpIDQsJXIyMCA7IyAxOTAwIG1vdnFpKzEvMgotTCQwMjUxCi0Jc3RiICVyMjAsMCglcjIyKSA7IyAxOTExIG1vdnFpKzEvNgotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjQyNCByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIyMCksJXIxOSA7IyAxOTIzIG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDE5MjQgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMjEsJXIxOSxMJDAyNTQgOyMgMTkyOCBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDE5MzAgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDI0MjcgcmVsb2FkX291dHNpKzIvNgotTCQwMjU0Ci0JbGR3IDAoJXI1KSwlcjQgOyMgODA1MiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgwNTUgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjk2KCVyMzApLCVyMSA7IyAyNDMzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwNTMgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgwNTQgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwMjU5IDsjIDgwNTYgYmxldSsxCi0Jc3R3ICVyMSwtMjY4KCVyMzApIDsjIDg3ODkgcmVsb2FkX291dHNpKzIvNgotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODY3NCByZWxvYWRfb3V0c2krMi8zCi1MJDAyNjAKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDE5NjIgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTk3MiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAyNjUgOyMgMTk4MCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTk3NCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgMTk4MyByZWxvYWRfb3V0c2krMi82Ci1MJDAyNjUKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTk5MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxOTk0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDE5OTIgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAyMDAyIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxOTk4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwMjU4IDsjIDIwMTIgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyAyMDE0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDIwMTcgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyAyMDE4IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMjY4IDsjIDIwMjMgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAyMDIxIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgMjAyNCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMjAyNyBhZGRzaTMvMQotTCQwMjY4Ci0JY29taWIsPSAwLCVyOCxMJDAyNjkgOyMgMjAzMCBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDIwMzEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMjAzNCBhZGRzaTMvMQotTCQwMjY5Ci0JY29taWIsPSAwLCVyOSxMJDAyNTggOyMgMjAzNyBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDIwMzggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMjA0MSBhZGRzaTMvMQotTCQwMjU4Ci0JbGR3IDAoJXI1KSwlcjQgOyMgMTk0MiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDE5NDYgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTk0MyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMTk0NCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDI2MAotCW5vcCA7IyAxOTQ4IGJsZXUrMQotTCQwMjU5Ci0JbGRpIDMyLCVyMTkgOyMgMjA2MyBtb3ZxaSsxLzIKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDIwNjQgbW92cWkrMS82Ci0JY29weSAlcjYsJXIyNiA7IyAyMDc3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMCwlcjI1IDsjIDIwNzkgcmVsb2FkX291dHNpKzIvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMiA7IyAyMDgzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGRpIDMyLCVyMjQgOyMgMjA4MSByZWxvYWRfb3V0c2krMi8yCi0JbGRiIC0yKCVyNiksJXIxOSA7IyAyMDg3IHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLDw+IDQsJXIxOSxMJDAyNzQgOyMgMjA4OSBibGV1KzEKLQlsZGkgOTMsJXIxNyA7IyA4NjIyIHJlbG9hZF9vdXRzaSsyLzIKLQliYiw+PSxuICVyMTUsMjMsTCQwMjc0IDsjIDIwOTQgbW92c2ktNAotCWxkYiAxKCVyNiksJXIxOSA7IyAyMDk3IG1vdnFpKzEvNQotCWRlcGkgLTEsMjksMSwlcjE5IDsjIDIwOTkgaW9yc2kzKzEvMgotCXN0YiAlcjE5LDEoJXI2KSA7IyAyMTAxIG1vdnFpKzEvNgotTCQwMjc0Ci0JbGRpIDQsJXIxOCA7IyA4NjI4IHJlbG9hZF9vdXRzaSsyLzIKLQlhbmQgJXIxNSwlcjE4LCVyMSA7IyA4NjI5IGFuZHNpMy8xCi0Jc3R3ICVyMSwtMjUyKCVyMzApIDsjIDg3OTIgcmVsb2FkX291dHNpKzIvNgotCWxkbyAtMjg4KCVyMzApLCVyMTEgOyMgODYzMiBhZGRzaTMvMgotTCQwMjc1Ci0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNDM2IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE2NQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwOTAyIDsjIDIxMDkgYmxldSsxCi0JY29weSAlcjIwLCVyMjEgOyMgODc0NSByZWxvYWRfb3V0c2krMi8xCi0JbGRicyxtYSAxKCVyMjEpLCVyNyA7IyAyMTM0IHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLD0gMCwlcjE0LEwkMDI4MCA7IyAyMTM5IGJsZXUrMQotCXN0dyAlcjIxLC0yOTYoJXIzMCkgOyMgMjQ0NSByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDIxNDAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgMjE0MyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDI4MAotCWJiLD49ICVyMTUsMzEsTCQwMjg1IDsjIDIxNTkgbW92c2ktNAotCWxkaSA5MiwlcjE5IDsjIDIxNjEgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4sbiAlcjE5LCVyNyxMJDAyODUgOyMgMjE2MyBibGV1KzEKLQljb21iLD0gJXIxNiwlcjIxLEwkMDkwMyA7IyAyMTY3IGJsZXUrMQotCWxkbyAxKCVyMjEpLCVyMTkgOyMgMjE5NSBhZGRzaTMvMgotCWxkYiAxKCVyMjApLCVyMyA7IyAyMTkyIHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLD0gMCwlcjE0LEwkMDI4OCA7IyAyMTk3IGJsZXUrMQotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjQ2MCByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyMywlcjE5IDsjIDIxOTggYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjMgOyMgMjIwMSB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDI4OAotCWV4dHJ1ICVyMywyOCwyOSwlcjE5IDsjIDIyMTYgbHNocnNpMy8yCi0JYWRkbCAlcjYsJXIxOSwlcjE5IDsjIDIyMTkgYWRkc2kzLzEKLQlibCBMJDA5NDgsJXIwIDsjIDIyMzUganVtcAotCWV4dHJ1ICVyMywzMSwzLCVyMjAgOyMgMjIyMiBhbmRzaTMvMQotTCQwMjg1Ci0JY29tYiw8PixuICVyMTcsJXI3LEwkMDI5MyA7IyAyMjQzIGJsZXUrMQotCWxkdyAtMjY4KCVyMzApLCVyMSA7IyA4Nzk4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI0NjYgcmVsb2FkX291dHNpKzIvNQotCWxkbyAxKCVyMSksJXIxOSA7IyAyMjQ0IGFkZHNpMy8yCi0JY29tYiw8PixuICVyMTksJXIyMCxMJDAyNzYgOyMgMjI0NiBibGV1KzEKLUwkMDI5MwotCWNvbWliLD0gMCwlcjEzLEwkMDI5NCA7IyAyMjUzIGJsZXUrMQotCWxkaSA0NSwlcjEgOyMgODgwMSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PiAlcjEsJXI3LEwkMTE2MyA7IyAyMjU3IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjUyNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDY5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDIyNTkgbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjI2MCBleHRlbmRxaXNpMgotCWNvbWIsPD4sbiAlcjE3LCVyMTksTCQwODk1IDsjIDIyNjQgYmxldSsxCi1MJDAyOTQKLQlsZGkgNDUsJXIxIDsjIDg4MDQgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4gJXIxLCVyNyxMJDExNjMgOyMgMjI4MCBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI1MjQgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjc2KCVyMzApLCVyMSA7IyA4ODA3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZG8gLTIoJXIyMCksJXIxOSA7IyAyMjgxIGFkZHNpMy8yCi0JY29tYiw+PixuICVyMSwlcjE5LEwkMTE3OSA7IyAyMjgzIGJsZXUrMQotCWxkYiAtMiglcjIwKSwlcjE5IDsjIDIyODUgbW92cWkrMS81Ci0JbGRpIDkxLCVyMSA7IyA4ODEwIHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyMjg2IGV4dGVuZHFpc2kyCi0JY29tYiw9ICVyMSwlcjE5LEwkMTE2MyA7IyAyMjkwIGJsZXUrMQotCWxkdyAtMjc2KCVyMzApLCVyMSA7IyA4ODEzIHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE3OQotCWxkbyAtMyglcjIwKSwlcjE5IDsjIDIyOTQgYWRkc2kzLzIKLQljb21iLD4+LG4gJXIxLCVyMTksTCQwMjk3IDsjIDIyOTYgYmxldSsxCi0JbGRiIC0zKCVyMjApLCVyMTkgOyMgMjI5OCBtb3ZxaSsxLzUKLQlsZGkgOTEsJXIxIDsjIDg4MTYgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDIyOTkgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMSwlcjE5LEwkMTE2NCA7IyAyMzAzIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQ4NyByZWxvYWRfb3V0c2krMi81Ci0JbGRiIC0yKCVyMjApLCVyMTkgOyMgMjMwNSBtb3ZxaSsxLzUKLQlsZGkgOTQsJXIyMCA7IyAyMzA4IHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyMzA2IGV4dGVuZHFpc2kyCi0JY29tYiw9ICVyMjAsJXIxOSxMJDExNjMgOyMgMjMxMCBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI1MjQgcmVsb2FkX291dHNpKzIvNQotTCQwMjk3Ci0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDg3IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE2NAotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMjMxNSBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyMzE2IGV4dGVuZHFpc2kyCi0JY29tYiw8PiAlcjE3LCVyMTksTCQwMzAyIDsjIDIzMjAgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNTI0IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE2MwotCWxkYiAwKCVyMjApLCVyMTkgOyMgMjUyNiBtb3ZxaSsxLzUKLQlsZGkgNDUsJXIxIDsjIDg4MTkgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDI1MjcgZXh0ZW5kcWlzaTIKLQljb21iLDw+LG4gJXIxLCVyMTksTCQwMzAwIDsjIDI1MzEgYmxldSsxCi0JbGRiIDEoJXIyMCksJXIxOSA7IyAyNTM1IG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDI1MzYgZXh0ZW5kcWlzaTIKLQljb21iLD0sbiAlcjE3LCVyMTksTCQwMzAwIDsjIDI1NDAgYmxldSsxCi0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MjIgOyMgMjU1MCBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDI1NTkgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDI1NjEgcmVsb2FkX291dHNpKzIvNgotTCQwMzAyCi0Jc3R3ICVyNiwtNTIoJXIzMCkgOyMgMjU4OCByZWxvYWRfb3V0c2krMi82Ci0JbGRvIC0yOTYoJXIzMCksJXIyNiA7IyAyNTkwIGFkZHNpMy8yCi0JY29weSAlcjE2LCVyMjUgOyMgMjU5MiByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjE0LCVyMjQgOyMgMjU5NCByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBjb21waWxlX3JhbmdlLCVyMiA7IyAyNTk4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjE1LCVyMjMgOyMgMjU5NiByZWxvYWRfb3V0c2krMi8xCi0JbW92Yiw9ICVyMjgsJXI0LEwkMTE2NSA7IyAyNjAzIGRlY3JlbWVudF9hbmRfYnJhbmNoX3VudGlsX3plcm8rMi8xCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNDM2IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDI2MDcgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDI2MDUgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgMjYxMSBqdW1wCi0JY29weSAlcjQsJXIyOCA7IyAyNjA5IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDMwMAotCWxkdyAtMjUyKCVyMzApLCVyMSA7IyA4ODIyIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDMwOSA7IyAyNjI0IGJsZXUrMQotCWxkaSA5MSwlcjEgOyMgODgyNSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PiAlcjEsJXI3LEwkMTE2NiA7IyAyNjI4IGJsZXUrMQotCWxkaSAwLCVyMTMgOyMgMzYyNCByZWxvYWRfb3V0c2krMi8yCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNjMwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjIwKSwlcjE5IDsjIDI2MzIgbW92cWkrMS81Ci0JbGRpIDU4LCVyMSA7IyA4ODI4IHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyNjMzIGV4dGVuZHFpc2kyCi0JY29tYiw8PixuICVyMSwlcjE5LEwkMTE2NiA7IyAyNjM3IGJsZXUrMQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwOTIyIDsjIDI2NDcgYmxldSsxCi0JbGRvIDEoJXIyMCksJXIxOSA7IyAyNjU2IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAyNjU4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIxNiwlcjE5LEwkMDkwMiA7IyAyNjg5IGJsZXUrMQotCWxkaSAwLCVyMyA7IyAyNjg0IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDMxNwotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjcwOSByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIxOSxMJDA5MjIgOyMgMjcxMSBibGV1KzEKLQlsZG8gMSglcjE5KSwlcjIwIDsjIDI3MjAgYWRkc2kzLzIKLQlzdHcgJXIyMCwtMjk2KCVyMzApIDsjIDI3MjIgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDMyMSA7IyAyNzI5IGJsZXUrMQotCWxkYiAwKCVyMTkpLCVyNyA7IyAyNzI1IHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyAyNzMwIGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDI3MzMgemVyb19leHRlbmRxaXNpMi8yCi1MJDAzMjEKLQlsZGkgNTgsJXIxIDsjIDg4MzEgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSAlcjEsJXI3LEwkMTE2NyA7IyAyNzUwIGJsZXUrMQotCWFkZGwgJXIxMSwlcjMsJXIxOSA7IyAyNzg5IGFkZHNpMy8xCi0JY29tYiw9LG4gJXIxNywlcjcsTCQxMTY3IDsjIDI3NTQgYmxldSsxCi0JY29tYiw9LG4gJXIxNiwlcjIwLEwkMTE2NyA7IyAyNzU4IGJsZXUrMQotCWNvbWliLD0gNiwlcjMsTCQxMTY3IDsjIDI3NjAgYmxldSsxCi0JY29weSAlcjMsJXIyMCA7IyAyNzcwIHJlbG9hZF9vdXRzaSsyLzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDI3NzEgYWRkc2kzLzIKLQlleHRydSAlcjE5LDMxLDgsJXIzIDsjIDI3NzIgemVyb19leHRlbmRxaXNpMi8xCi0JYWRkbCAlcjExLCVyMjAsJXIyMCA7IyAyNzc2IGFkZHNpMy8xCi0JYmwgTCQwMzE3LCVyMCA7IyAyNzgzIGp1bXAKLQlzdGIgJXI3LDAoJXIyMCkgOyMgMjc3OCBtb3ZxaSsxLzYKLUwkMTE2NwotCWNvbWIsPD4gJXIxLCVyNyxMJDAzMjggOyMgMjc5NiBibGV1KzEKLQlzdGIgJXIwLDAoJXIxOSkgOyMgMjc5MSBtb3ZxaSsxLzYKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI3OTggcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMjgwMCBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyODAxIGV4dGVuZHFpc2kyCi0JY29tYiw8PiAlcjE3LCVyMTksTCQxMTY4IDsjIDI4MDUgYmxldSsxCi0JbGRpIDI1NSwlcjE5IDsjIDgwNjkgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXIxMSwlcjI2IDsjIDI4MTMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxNiwlcjEgOyMgODgzNSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTYoJXIxKSwlcjEgOyMgODgzNiBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI4MTcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDI4MTUgcmVsb2FkX291dHNpKzIvMQotCWNvcHkgJXIxMSwlcjI2IDsjIDI4MjkgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxNywlcjEgOyMgODgzNyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTcoJXIxKSwlcjEgOyMgODgzOCBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyODMxIHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI4MjEgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyODMzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTI0NCglcjMwKSA7IyA4ODQxIHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyODQ1IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMTgsJXIxIDsjIDg4NDIgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDE4KCVyMSksJXIxIDsjIDg4NDMgbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjg0NyByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyODM3IHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjg0OSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0yMzYoJXIzMCkgOyMgODg0NiByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjg2MSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE5LCVyMSA7IyA4ODQ3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxOSglcjEpLCVyMSA7IyA4ODQ4IG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI4NjMgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjg1MyBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI4NjUgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMjI4KCVyMzApIDsjIDg4NTEgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI4NzcgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMCwlcjEgOyMgODg1MiBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjAoJXIxKSwlcjEgOyMgODg1MyBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyODc5IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI4Njkgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyODgxIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTIyMCglcjMwKSA7IyA4ODU2IHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyODkzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjEsJXIxIDsjIDg4NTcgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDIxKCVyMSksJXIxIDsjIDg4NTggbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjg5NSByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyODg1IHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjg5NyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0yMTIoJXIzMCkgOyMgODg2MSByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjkwOSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIyLCVyMSA7IyA4ODYyIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMiglcjEpLCVyMSA7IyA4ODYzIG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI5MTEgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjkwMSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5MTMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMjA0KCVyMzApIDsjIDg4NjYgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI5MjUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMywlcjEgOyMgODg2NyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjMoJXIxKSwlcjEgOyMgODg2OCBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyOTI3IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI5MTcgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyOTI5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTE5NiglcjMwKSA7IyA4ODcxIHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyOTQxIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjQsJXIxIDsjIDg4NzIgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDI0KCVyMSksJXIxIDsjIDg4NzMgbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjk0MyByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyOTMzIHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjk0NSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0xODgoJXIzMCkgOyMgODg3NiByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjk1NyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI1LCVyMSA7IyA4ODc3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyNSglcjEpLCVyMSA7IyA4ODc4IG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI5NTkgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjk0OSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5NjEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMTgwKCVyMzApIDsjIDg4ODEgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI5NzMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNiwlcjE5IDsjIDI5NzAgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDI2KCVyMTkpLCVyMyA7IyAyOTcxIG1vdmhpLTIKLQljb3B5ICVyMywlcjI1IDsjIDI5NzUgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjk2NSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5NzcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMTcyKCVyMzApIDsjIDg4ODQgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI5ODkgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNywlcjE5IDsjIDI5ODYgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDI3KCVyMTkpLCVyNCA7IyAyOTg3IG1vdmhpLTIKLQljb21pY2xyLDw+IDAsJXIyOCwlcjEzIDsjIDI5ODEgc2NjCi0JbGRpIDEsJXIxMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyOTkzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjQsJXIyNSA7IyAyOTkxIHJlbG9hZF9vdXRzaSsyLzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDA1IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMTcsJXIxIDsjIDg4ODUgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDE3KCVyMSksJXIxIDsjIDg4ODYgbW92aGktMgotCWNvbWljbHIsPD4gMCwlcjI4LCVyNyA7IyAyOTk3IHNjYwotCWxkaSAxLCVyNwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDA5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjEsJXIyNSA7IyAzMDA3IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzAxMyBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDE4IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzAyMiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIzLCVyMjUgOyMgMzAyMCByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwMjYgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzAzMSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIyLCVyMSA7IyA4ODg3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMiglcjEpLCVyMSA7IyA4ODg4IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzAzNSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzAzMyByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwMzkgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA0NCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIwLCVyMSA7IyA4ODg5IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMCglcjEpLCVyMSA7IyA4ODkwIG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzA0OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzA0NiByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwNTIgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA1NyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE2LCVyMSA7IyA4ODkxIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxNiglcjEpLCVyMSA7IyA4ODkyIG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzA2MSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzA1OSByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwNjUgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA3MCByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMwNzQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyNCwlcjI1IDsjIDMwNzIgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMDc4IGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMwODMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNSwlcjEgOyMgODg5MyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjUoJXIxKSwlcjEgOyMgODg5NCBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMwODcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMwODUgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMDkxIGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMwOTYgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMywlcjEgOyMgODg5NSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjMoJXIxKSwlcjEgOyMgODg5NiBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxMDAgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMwOTggcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMTA0IGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMxMDkgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNCwlcjEgOyMgODg5NyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjQoJXIxKSwlcjEgOyMgODg5OCBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxMTMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMxMTEgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMTE3IGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMxMjIgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMSwlcjEgOyMgODg5OSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjEoJXIxKSwlcjEgOyMgODkwMCBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxMjYgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMxMjQgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMTMwIGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMxMzUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxOSwlcjEgOyMgODkwMSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTkoJXIxKSwlcjEgOyMgODkwMiBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxMzkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMxMzcgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMTQzIGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMxNDggcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxOCwlcjEgOyMgODkwMyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTgoJXIxKSwlcjEgOyMgODkwNCBtb3ZoaS0yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMxNTIgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMxNTAgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLDw+LG4gMCwlcjI4LEwkMDkwMCA7IyAzMTU2IGJsZXUrMQotTCQwMzI5Ci0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAzMTczIHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjE5LEwkMDkyMiA7IyAzMTc1IGJsZXUrMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMzE4NCBhZGRzaTMvMgotCWNvbWIsPSAlcjE2LCVyMTksTCQwOTAyIDsjIDMyMTQgYmxldSsxCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAzMTg2IHJlbG9hZF9vdXRzaSsyLzYKLQlsZGkgMCwlcjIyIDsjIDMyMjcgcmVsb2FkX291dHNpKzIvMgotCWFkZGlsIExSJ19fYWxudW0tJGdsb2JhbCQsJXIyNyA7IyA4NTk2IHBpYzJfbG9fc3VtKzEKLQljb3B5ICVyMSwlcjIgOyMgODkwNyByZWxvYWRfb3V0c2krMi8xCi0JYWRkaWwgTFInX19jdHlwZTItJGdsb2JhbCQsJXIyNyA7IyA4NTk4IHBpYzJfbG9fc3VtKzEKLQljb3B5ICVyMSwlcjIzIDsjIDg5MTAgcmVsb2FkX291dHNpKzIvMQotCWFkZGlsIExSJ19fY3R5cGUtJGdsb2JhbCQsJXIyNyA7IyA4NjAwIHBpYzJfbG9fc3VtKzEKLQljb3B5ICVyMSwlcjQgOyMgODkxMyByZWxvYWRfb3V0c2krMi8xCi0JbGRpIDMyLCVyMjUgOyMgODYwNSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDIsJXIyNCA7IyA4NjA3IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMTYsJXIzMSA7IyA4NjA5IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgOCwlcjI5IDsjIDg2MTEgcmVsb2FkX291dHNpKzIvMgotCWxkaSAxMjgsJXIyOCA7IyA4NjEzIHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMjU1LCVyMjYgOyMgODYxNSByZWxvYWRfb3V0c2krMi8yCi0JbGR3IC0yNDQoJXIzMCksJXIxIDsjIDg5MTYgcmVsb2FkX291dHNpKzIvNQotTCQxMTczCi0JY29taWIsPSxuIDAsJXIxLEwkMDM0MyA7IyAzMjQwIGJsZXUrMQotCXN0dyAlcjIyLFJSJ19fYWxudW0tJGdsb2JhbCQoJXIyKSA7IyAzMjQ0IHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgUlInX19jdHlwZTItJGdsb2JhbCQoJXIyMyksJXIxOSA7IyAzMjQ4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMjEgOyMgMzI2MCByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMjUzIGFkZHNpMy8xCi0JYWRkbCAlcjIxLCVyMjIsJXIyMSA7IyAzMjY1IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIyMCA7IyAzMjU1IG1vdnFpKzEvNQotCWxkYiAwKCVyMjEpLCVyMTkgOyMgMzI2NyBtb3ZxaSsxLzUKLQlleHRydSAlcjIwLDMxLDEsJXIyMCA7IyAzMjU2IGFuZHNpMy8xCi0JYW5kICVyMTksJXIxOCwlcjE5IDsjIDMyNzAgYW5kc2kzLzEKLQlvciAlcjIwLCVyMTksJXIyMCA7IyAzMjc4IHhvcmRpMy0xCi0JY29taWIsPD4gMCwlcjIwLEwkMTE2OSA7IyAzMjgwIGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDMzMzAgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNDMKLQlsZHcgLTIzNiglcjMwKSwlcjEgOyMgODkxOSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNDQgOyMgMzI4NSBibGV1KzEKLQlsZHcgUlInX19jdHlwZTItJGdsb2JhbCQoJXIyMyksJXIxOSA7IyAzMjg5IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMyOTAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDMyOTIgbW92cWkrMS81Ci0JYmIsPCAlcjE5LDMxLEwkMTE2OSA7IyAzMjk2IGJsZXUrMwotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDMzMzAgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNDQKLQlsZHcgLTIyOCglcjMwKSwlcjEgOyMgODkyMiByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSxuIDAsJXIxLEwkMDM0NSA7IyAzMzAxIGJsZXUrMQotCWNvbWIsPSAlcjI1LCVyMjIsTCQxMTY5IDsjIDMzMDUgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzMzMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLQljb21pYiw9IDksJXIyMixMJDExNzAgOyMgMzMwNyBibGV1KzEKLQlleHRydSAlcjE5LDI4LDI5LCVyMjEgOyMgMzMzMiBsc2hyc2kzLzIKLUwkMDM0NQotCWxkdyAtMjIwKCVyMzApLCVyMSA7IyA4OTI1IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM0MSA7IyAzMzEyIGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzMzE2IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMzMTcgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDMzMTkgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyNSwlcjE5IDsjIDMzMjIgYW5kc2kzLzEKLQljb21pYiw9IDAsJXIxOSxMJDAzNDEgOyMgMzMyNSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzMzMwIHplcm9fZXh0ZW5kcWlzaTIvMQotTCQxMTY5Ci0JZXh0cnUgJXIxOSwyOCwyOSwlcjIxIDsjIDMzMzIgbHNocnNpMy8yCi1MJDExNzAKLQlhZGRsICVyNiwlcjIxLCVyMjEgOyMgMzMzNSBhZGRzaTMvMQotCWV4dHJ1ICVyMTksMzEsMywlcjE5IDsjIDMzMzkgYW5kc2kzLzEKLQlzdWJpIDMxLCVyMTksJXIxOSA7IyAzMzQwIHN1YnNpMy8yCi0JbGRiIDAoJXIyMSksJXIyMCA7IyAzMzQzIG1vdnFpKzEvNQotCW10c2FyICVyMTkgOyMgODkyOCByZWxvYWRfb3V0c2krMi83Ci0JdmRlcGkgLTEsMSwlcjIwIDsjIDMzNDggdmRlcGlfaW9yCi0Jc3RiICVyMjAsMCglcjIxKSA7IyAzMzUwIG1vdnFpKzEvNgotTCQwMzQxCi0JbGR3IC0yMTIoJXIzMCksJXIxIDsjIDg5MzEgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzQ4IDsjIDMzNTQgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDMzNTggcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzM1OSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzM2MSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjE4LCVyMTkgOyMgMzM2NCBhbmRzaTMvMQotCWNvbWliLDw+IDAsJXIxOSxMJDExNzEgOyMgMzM2NyBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNDI2IHplcm9fZXh0ZW5kcWlzaTIvMQotTCQwMzQ4Ci0JbGR3IC0yMDQoJXIzMCksJXIxIDsjIDg5MzQgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzQ5IDsjIDMzNzIgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUyLSRnbG9iYWwkKCVyMjMpLCVyMTkgOyMgMzM3NiByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMzc3IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAzMzc5IG1vdnFpKzEvNQotCWFuZCAlcjE5LCVyMjQsJXIxOSA7IyAzMzgyIGFuZHNpMy8xCi0JY29taWIsPD4gMCwlcjE5LEwkMTE3MSA7IyAzMzg1IGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM0MjYgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNDkKLQlsZHcgLTE5NiglcjMwKSwlcjEgOyMgODkzNyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNTAgOyMgMzM5MCBibGV1KzEKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMTkgOyMgMzM5NCByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMzk1IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAzMzk3IG1vdnFpKzEvNQotCWFuZCAlcjE5LCVyMjQsJXIxOSA7IyAzNDAwIGFuZHNpMy8xCi0JY29taWIsPD4gMCwlcjE5LEwkMTE3MSA7IyAzNDAzIGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM0MjYgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNTAKLQlsZHcgLTE4OCglcjMwKSwlcjEgOyMgODk0MCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNDYgOyMgMzQwOCBibGV1KzEKLQlsZHcgUlInX19jdHlwZTItJGdsb2JhbCQoJXIyMyksJXIxOSA7IyAzNDEyIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM0MTMgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM0MTUgbW92cWkrMS81Ci0JYW5kICVyMTksJXIxOCwlcjE5IDsjIDM0MTggYW5kc2kzLzEKLQljb21pYiw9IDAsJXIxOSxMJDAzNDYgOyMgMzQyMSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNDI2IHplcm9fZXh0ZW5kcWlzaTIvMQotTCQxMTcxCi0JZXh0cnUgJXIxOSwyOCwyOSwlcjIxIDsjIDM0MjggbHNocnNpMy8yCi0JYWRkbCAlcjYsJXIyMSwlcjIxIDsjIDM0MzEgYWRkc2kzLzEKLQlleHRydSAlcjE5LDMxLDMsJXIxOSA7IyAzNDM1IGFuZHNpMy8xCi0Jc3ViaSAzMSwlcjE5LCVyMTkgOyMgMzQzNiBzdWJzaTMvMgotCWxkYiAwKCVyMjEpLCVyMjAgOyMgMzQzOSBtb3ZxaSsxLzUKLQltdHNhciAlcjE5IDsjIDg5NDMgcmVsb2FkX291dHNpKzIvNwotCXZkZXBpIC0xLDEsJXIyMCA7IyAzNDQ0IHZkZXBpX2lvcgotCXN0YiAlcjIwLDAoJXIyMSkgOyMgMzQ0NiBtb3ZxaSsxLzYKLUwkMDM0NgotCWxkdyAtMTgwKCVyMzApLCVyMSA7IyA4OTQ2IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM1MyA7IyAzNDUwIGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzNDU0IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM0NTUgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM0NTcgbW92cWkrMS81Ci0JYW5kICVyMTksJXIzMSwlcjE5IDsjIDM0NjAgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQxMTcyIDsjIDM0NjMgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzUyMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM1MwotCWxkdyAtMTcyKCVyMzApLCVyMSA7IyA4OTQ5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM1NCA7IyAzNDY4IGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzNDcyIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM0NzMgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM0NzUgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyOSwlcjE5IDsjIDM0NzggYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQxMTcyIDsjIDM0ODEgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzUyMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM1NAotCWNvbWliLD0gMCwlcjEzLEwkMDM1NSA7IyAzNDg2IGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzNDkwIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM0OTEgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM0OTMgbW92cWkrMS81Ci0JYmIsPCAlcjE5LDMxLEwkMTE3MiA7IyAzNDk3IGJsZXUrMwotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM1MjAgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNTUKLQljb21pYiw9IDAsJXI3LEwkMDMzOSA7IyAzNTAyIGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzNTA2IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDM1MDcgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDM1MDkgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyOCwlcjE5IDsjIDM1MTIgYW5kc2kzLzEKLQljb21pYiw9IDAsJXIxOSxMJDAzMzkgOyMgMzUxNSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNTIwIHplcm9fZXh0ZW5kcWlzaTIvMQotTCQxMTcyCi0JZXh0cnUgJXIxOSwyOCwyOSwlcjIxIDsjIDM1MjIgbHNocnNpMy8yCi0JYWRkbCAlcjYsJXIyMSwlcjIxIDsjIDM1MjUgYWRkc2kzLzEKLQlleHRydSAlcjE5LDMxLDMsJXIxOSA7IyAzNTI5IGFuZHNpMy8xCi0Jc3ViaSAzMSwlcjE5LCVyMTkgOyMgMzUzMCBzdWJzaTMvMgotCWxkYiAwKCVyMjEpLCVyMjAgOyMgMzUzMyBtb3ZxaSsxLzUKLQltdHNhciAlcjE5IDsjIDg5NTIgcmVsb2FkX291dHNpKzIvNwotCXZkZXBpIC0xLDEsJXIyMCA7IyAzNTM4IHZkZXBpX2lvcgotCXN0YiAlcjIwLDAoJXIyMSkgOyMgMzU0MCBtb3ZxaSsxLzYKLUwkMDMzOQotCWxkbyAxKCVyMjIpLCVyMjIgOyMgMzU0NiBhZGRzaTMvMgotCWNvbWIsPj0sbiAlcjI2LCVyMjIsTCQxMTczIDsjIDMyMzMgYmxldSsxCi0JbGR3IC0yNDQoJXIzMCksJXIxIDsjIDg5MTYgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDI3NSwlcjAgOyMgMzU1OSBqdW1wCi0JbGRpIDEsJXIxMyA7IyAzNTU2IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDMyOAotCWxkaSAyNTUsJXIxOSA7IyA4MDY5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMTE2OAotCWNvbWIsPSAlcjE5LCVyMyxMJDAzNTkgOyMgODA3MCBibGV1KzEKLQljb3B5ICVyMTksJXIyMSA7IyA4NTk1IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDM2MAotCWxkbyAtMSglcjMpLCVyMjAgOyMgMzU3MSBhZGRzaTMvMgotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMzU4MyByZWxvYWRfb3V0c2krMi81Ci0JZXh0cnUgJXIyMCwzMSw4LCVyMyA7IyAzNTcyIHplcm9fZXh0ZW5kcWlzaTIvMQotCWxkbyAtMSglcjE5KSwlcjE5IDsjIDM1ODQgYWRkc2kzLzIKLQljb21iLDw+ICVyMjEsJXIzLEwkMDM2MCA7IyAzNTc3IGJsZXUrMQotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMzU4OCByZWxvYWRfb3V0c2krMi82Ci1MJDAzNTkKLQlsZGIgMTEoJXI2KSwlcjE5IDsjIDM1OTkgbW92cWkrMS81Ci0JZGVwaSAtMSwyOCwxLCVyMTkgOyMgMzYwMSBpb3JzaTMrMS8yCi0Jc3RiICVyMTksMTEoJXI2KSA7IyAzNjAzIG1vdnFpKzEvNgotCWxkYiA3KCVyNiksJXIxOSA7IyAzNjA2IG1vdnFpKzEvNQotCWxkaSAwLCVyMTMgOyMgMzYxMyByZWxvYWRfb3V0c2krMi8yCi0JZGVwaSAtMSwyOSwxLCVyMTkgOyMgMzYwOCBpb3JzaTMrMS8yCi0JYmwgTCQwMjc1LCVyMCA7IyAzNjE4IGp1bXAKLQlzdGIgJXIxOSw3KCVyNikgOyMgMzYxMCBtb3ZxaSsxLzYKLUwkMDMwOQotCWxkaSAwLCVyMTMgOyMgMzYyNCByZWxvYWRfb3V0c2krMi8yCi1MJDExNjYKLQlleHRydSAlcjcsMjErOC0xLDgsJXIxOSA7IyAzNjI3IGV4dHp2Ci0JYWRkbCAlcjYsJXIxOSwlcjE5IDsjIDM2MzAgYWRkc2kzLzEKLQlleHRydSAlcjcsMzEsMywlcjIwIDsjIDM2MzMgYW5kc2kzLzEKLUwkMDk0OAotCXN1YmkgMzEsJXIyMCwlcjIwIDsjIDM2MzQgc3Vic2kzLzIKLQlsZGIgMCglcjE5KSwlcjIxIDsjIDM2MzcgbW92cWkrMS81Ci0JbXRzYXIgJXIyMCA7IyA4OTU1IHJlbG9hZF9vdXRzaSsyLzcKLQl2ZGVwaSAtMSwxLCVyMjEgOyMgMzY0MiB2ZGVwaV9pb3IKLQlibCBMJDAyNzUsJXIwIDsjIDM2NTMganVtcAotCXN0YiAlcjIxLDAoJXIxOSkgOyMgMzY0NCBtb3ZxaSsxLzYKLUwkMDI3NgotCWxkYiAtMSglcjYpLCVyMjAgOyMgODA3NCBtb3ZxaSsxLzUKLQlleHRydSAlcjIwLDMxLDgsJXIxOSA7IyA4MDc1IHplcm9fZXh0ZW5kcWlzaTIvMQotCWNvbWliLD0gMCwlcjE5LEwkMDM2NCA7IyA4MDc2IGJsZXUrMQotCWFkZGwgJXIxOSwlcjYsJXIxOSA7IyA4MDc5IGFkZHNpMy8xCi0JbGRiIC0xKCVyMTkpLCVyMTkgOyMgODA4MiB6ZXJvX2V4dGVuZHFpc2kyLzIKLQljb21pYiw8PiAwLCVyMTksTCQwMzY0IDsjIDgwODMgYmxldSsxCi0JbGRvIC0xKCVyMjApLCVyMTkgOyMgODI0MiBhZGRzaTMvMgotCWJsIEwkMTE4MywlcjAgOyMgODI1MyBqdW1wCi0Jc3RiICVyMTksLTEoJXI2KSA7IyAzNjg4IG1vdnFpKzEvNgotTCQwMzY1Ci0JbGRvIC0xKCVyMTkpLCVyMTkgOyMgMzY4NiBhZGRzaTMvMgotCXN0YiAlcjE5LC0xKCVyNikgOyMgMzY4OCBtb3ZxaSsxLzYKLUwkMTE4MwotCWV4dHJ1ICVyMTksMzEsOCwlcjE5IDsjIDM2NjIgemVyb19leHRlbmRxaXNpMi8xCi0JY29taWIsPSAwLCVyMTksTCQwMzY0IDsjIDM2NjQgYmxldSsxCi0JYWRkbCAlcjE5LCVyNiwlcjE5IDsjIDM2NjggYWRkc2kzLzEKLQlsZGIgLTEoJXIxOSksJXIxOSA7IyAzNjcyIHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLD0sbiAwLCVyMTksTCQwMzY1IDsjIDM2NzQgYmxldSsxCi0JbGRiIC0xKCVyNiksJXIxOSA7IyAzNjgzIG1vdnFpKzEvNQotTCQwMzY0Ci0JbGRiIC0xKCVyNiksJXIxOSA7IyAzNzAwIHplcm9fZXh0ZW5kcWlzaTIvMgotCWJsIEwkMDA0MywlcjAgOyMgMzcwNSBqdW1wCi0JYWRkbCAlcjYsJXIxOSwlcjYgOyMgMzcwMSBhZGRzaTMvMQotTCQwMzY4Ci0JYmIsPj0sbiAlcjE1LDE4LEwkMDA3NiA7IyAzNzEzIG1vdnNpLTQKLQlibCBMJDExODEsJXIwIDsjIDM3MjEganVtcAotCWxkdyAyNCglcjUpLCVyMTkgOyMgMzg2MSByZWxvYWRfb3V0c2krMi81Ci1MJDAzNzIKLQliYiw+PSxuICVyMTUsMTgsTCQwMDc2IDsjIDM3MzAgbW92c2ktNAotCWJsLG4gTCQwMzc0LCVyMCA7IyAzNzM4IGp1bXAKLUwkMDM3NgotCWJiLD49LG4gJXIxNSwyMCxMJDAwNzYgOyMgMzc0NyBtb3ZzaS00Ci0JYmwsbiBMJDAzNzgsJXIwIDsjIDM3NTUganVtcAotTCQwMzgwCi0JYmIsPj0sbiAlcjE1LDE2LEwkMDA3NiA7IyAzNzY0IG1vdnNpLTQKLQlibCxuIEwkMDM3OCwlcjAgOyMgMzc3MiBqdW1wCi1MJDAzODMKLQlhbmQgJXIxNSwlcjIwLCVyMTkgOyMgMzc3OSBhbmRzaTMvMQotCWNvbWIsPSAlcjIwLCVyMTksTCQxMTc0IDsjIDM3ODMgYmxldSsxCi0JbGRpIC0xLCVyNCA7IyA1MDc0IHJlbG9hZF9vdXRzaSsyLzIKLQlibCxuIEwkMDA3NiwlcjAgOyMgMzc5MSBqdW1wCi1MJDAzODcKLQljb21iLD0sbiAlcjE2LCVyMTksTCQwOTAzIDsjIDM3OTkgYmxldSsxCi0JbGRiIDAoJXIxOSksJXI3IDsjIDM4MzEgemVyb19leHRlbmRxaXNpMi8yCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAzODI2IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAzODI4IHJlbG9hZF9vdXRzaSsyLzYKLQlsZG8gLTM5KCVyNyksJXIxOSA7IyA3NDQ2IGFkZHNpMy8yCi0JYWRkaSx1diAtODYsJXIxOSwlcjAgOyMgNzQ0NyBjYXNlc2kwCi0JYmxyLG4gJXIxOSwlcjAKLQliLG4gTCQwMzk3Ci1MJDA4MTcKLQlibCBMJDA3NTksJXIwIDsjIDk0Mzcgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MjA0IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTA2OQotCWJsIEwkMDM5NSwlcjAKLQlub3AgOyMgOTQ0MCBzd2l0Y2hfanVtcAotTCQxMDcwCi0JYmwgTCQwNDIyLCVyMAotCW5vcCA7IyA5NDQzIHN3aXRjaF9qdW1wCi1MJDEwNzEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NDYgc3dpdGNoX2p1bXAKLUwkMTA3MgotCWJsIEwkMDgxMSwlcjAKLQlub3AgOyMgOTQ0OSBzd2l0Y2hfanVtcAotTCQxMDczCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDUyIHN3aXRjaF9qdW1wCi1MJDEwNzQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NTUgc3dpdGNoX2p1bXAKLUwkMTA3NQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ1OCBzd2l0Y2hfanVtcAotTCQxMDc2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDYxIHN3aXRjaF9qdW1wCi1MJDEwNzcKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NjQgc3dpdGNoX2p1bXAKLUwkMTA3OAotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ2NyBzd2l0Y2hfanVtcAotTCQxMDc5Ci0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDcwIHN3aXRjaF9qdW1wCi1MJDEwODAKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0NzMgc3dpdGNoX2p1bXAKLUwkMTA4MQotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ3NiBzd2l0Y2hfanVtcAotTCQxMDgyCi0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDc5IHN3aXRjaF9qdW1wCi1MJDEwODMKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0ODIgc3dpdGNoX2p1bXAKLUwkMTA4NAotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ4NSBzd2l0Y2hfanVtcAotTCQxMDg1Ci0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDg4IHN3aXRjaF9qdW1wCi1MJDEwODYKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0OTEgc3dpdGNoX2p1bXAKLUwkMTA4NwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ5NCBzd2l0Y2hfanVtcAotTCQxMDg4Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDk3IHN3aXRjaF9qdW1wCi1MJDEwODkKLQlibCBMJDA2NTksJXIwIDsjIDk1MDAgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTY0IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTA5MAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUwMyBzd2l0Y2hfanVtcAotTCQxMDkxCi0JYmwgTCQwNjc5LCVyMCA7IyA5NTA2IHN3aXRjaF9qdW1wCi0JbGR3IDAoJXI1KSwlcjQgOyMgODE3MiByZWxvYWRfb3V0c2krMi81Ci1MJDEwOTIKLQlibCBMJDA4MTEsJXIwCi0Jbm9wIDsjIDk1MDkgc3dpdGNoX2p1bXAKLUwkMTA5MwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUxMiBzd2l0Y2hfanVtcAotTCQxMDk0Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTE1IHN3aXRjaF9qdW1wCi1MJDEwOTUKLQlibCBMJDA3MTksJXIwIDsjIDk1MTggc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTg4IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTA5NgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUyMSBzd2l0Y2hfanVtcAotTCQxMDk3Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTI0IHN3aXRjaF9qdW1wCi1MJDEwOTgKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1Mjcgc3dpdGNoX2p1bXAKLUwkMTA5OQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUzMCBzd2l0Y2hfanVtcAotTCQxMTAwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTMzIHN3aXRjaF9qdW1wCi1MJDExMDEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1MzYgc3dpdGNoX2p1bXAKLUwkMTEwMgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUzOSBzd2l0Y2hfanVtcAotTCQxMTAzCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTQyIHN3aXRjaF9qdW1wCi1MJDExMDQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NDUgc3dpdGNoX2p1bXAKLUwkMTEwNQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU0OCBzd2l0Y2hfanVtcAotTCQxMTA2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTUxIHN3aXRjaF9qdW1wCi1MJDExMDcKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NTQgc3dpdGNoX2p1bXAKLUwkMTEwOAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU1NyBzd2l0Y2hfanVtcAotTCQxMTA5Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTYwIHN3aXRjaF9qdW1wCi1MJDExMTAKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NjMgc3dpdGNoX2p1bXAKLUwkMTExMQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU2NiBzd2l0Y2hfanVtcAotTCQxMTEyCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTY5IHN3aXRjaF9qdW1wCi1MJDExMTMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NzIgc3dpdGNoX2p1bXAKLUwkMTExNAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU3NSBzd2l0Y2hfanVtcAotTCQxMTE1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTc4IHN3aXRjaF9qdW1wCi1MJDExMTYKLQlibCBMJDA2MzksJXIwIDsjIDk1ODEgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTU2IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTExNwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU4NCBzd2l0Y2hfanVtcAotTCQxMTE4Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTg3IHN3aXRjaF9qdW1wCi1MJDExMTkKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1OTAgc3dpdGNoX2p1bXAKLUwkMTEyMAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU5MyBzd2l0Y2hfanVtcAotTCQxMTIxCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTk2IHN3aXRjaF9qdW1wCi1MJDExMjIKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1OTkgc3dpdGNoX2p1bXAKLUwkMTEyMwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYwMiBzd2l0Y2hfanVtcAotTCQxMTI0Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjA1IHN3aXRjaF9qdW1wCi1MJDExMjUKLQlibCBMJDA3MzksJXIwIDsjIDk2MDggc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTk2IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTEyNgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYxMSBzd2l0Y2hfanVtcAotTCQxMTI3Ci0JYmwgTCQwNjk5LCVyMCA7IyA5NjE0IHN3aXRjaF9qdW1wCi0JbGR3IDAoJXI1KSwlcjQgOyMgODE4MCByZWxvYWRfb3V0c2krMi81Ci1MJDExMjgKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MTcgc3dpdGNoX2p1bXAKLUwkMTEyOQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYyMCBzd2l0Y2hfanVtcAotTCQxMTMwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjIzIHN3aXRjaF9qdW1wCi1MJDExMzEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MjYgc3dpdGNoX2p1bXAKLUwkMTEzMgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYyOSBzd2l0Y2hfanVtcAotTCQxMTMzCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjMyIHN3aXRjaF9qdW1wCi1MJDExMzQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MzUgc3dpdGNoX2p1bXAKLUwkMTEzNQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYzOCBzd2l0Y2hfanVtcAotTCQxMTM2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjQxIHN3aXRjaF9qdW1wCi1MJDExMzcKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NDQgc3dpdGNoX2p1bXAKLUwkMTEzOAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY0NyBzd2l0Y2hfanVtcAotTCQxMTM5Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjUwIHN3aXRjaF9qdW1wCi1MJDExNDAKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NTMgc3dpdGNoX2p1bXAKLUwkMTE0MQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY1NiBzd2l0Y2hfanVtcAotTCQxMTQyCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjU5IHN3aXRjaF9qdW1wCi1MJDExNDMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NjIgc3dpdGNoX2p1bXAKLUwkMTE0NAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY2NSBzd2l0Y2hfanVtcAotTCQxMTQ1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjY4IHN3aXRjaF9qdW1wCi1MJDExNDYKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NzEgc3dpdGNoX2p1bXAKLUwkMTE0NwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY3NCBzd2l0Y2hfanVtcAotTCQxMTQ4Ci0JYmwgTCQwNjE5LCVyMCA7IyA5Njc3IHN3aXRjaF9qdW1wCi0JbGR3IDAoJXI1KSwlcjQgOyMgODE0OCByZWxvYWRfb3V0c2krMi81Ci1MJDExNDkKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2ODAgc3dpdGNoX2p1bXAKLUwkMTE1MAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY4MyBzd2l0Y2hfanVtcAotTCQxMTUxCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5Njg2IHN3aXRjaF9qdW1wCi1MJDExNTIKLQlibCBMJDA1MDYsJXIwCi0Jbm9wIDsjIDk2ODkgc3dpdGNoX2p1bXAKLUwkMTE1MwotCWJsIEwkMDQ3MiwlcjAgOyMgOTY5MiBzd2l0Y2hfanVtcAotCWxkaWwgTCczMzc5MiwlcjE5IDsjIDQ3MjQgYWRkX2hpZ2hfY29uc3QrMwotTCQxMTU0Ci0JYmwsbiBMJDAzOTcsJXIwIDsjIDc0NTAganVtcAotTCQwMzk1Ci0JYmIsPCxuICVyMTUsMTgsTCQwMzk3IDsjIDM4NTMgYmxldSszCi0JbGR3IDI0KCVyNSksJXIxOSA7IyAzODYxIHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE4MQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMzg2MiBhZGRzaTMvMgotCXN0dyAlcjE5LDI0KCVyNSkgOyMgMzg2NiByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMDQoJXIzMCksJXIyMCA7IyAzODcxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI2MCglcjMwKSwlcjEgOyMgODk1OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMDgoJXIzMCksJXIxOSA7IyAzODczIHJlbG9hZF9vdXRzaSsyLzUKLQlsZG8gMSglcjEpLCVyMSA7IyAzODY4IGFkZHNpMy8yCi0JY29tYiw8PiAlcjE5LCVyMjAsTCQwMzk4IDsjIDM4NzUgYmxldSsxCi0Jc3R3ICVyMSwtMjYwKCVyMzApIDsjIDg5NjEgcmVsb2FkX291dHNpKzIvNgotCXpkZXAgJXIyMCwyOCwyOSwlcjI1IDsjIDM4ODUgYXNobHNpMysxCi0Jc2gxYWRkbCAlcjIwLCVyMjUsJXIyNSA7IyAzODg2IGFzaGxzaTMtMgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMzg5MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAzODk0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JemRlcCAlcjI1LDI5LDMwLCVyMjUgOyMgMzg5MiBhc2hsc2kzKzEKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMzkwMyBibGV1KzEKLQlzdHcgJXIyOCwtMzEyKCVyMzApIDsjIDM4OTggcmVsb2FkX291dHNpKzIvNgotCWxkdyAtMzA4KCVyMzApLCVyMTkgOyMgMzkxMiByZWxvYWRfb3V0c2krMi81Ci0JemRlcCAlcjE5LDMwLDMxLCVyMTkgOyMgMzkxNCBhc2hsc2kzKzEKLQlzdHcgJXIxOSwtMzA4KCVyMzApIDsjIDM5MTYgcmVsb2FkX291dHNpKzIvNgotTCQwMzk4Ci0JbGR3IC0zMDQoJXIzMCksJXIyMCA7IyAzOTIxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMxMiglcjMwKSwlcjIxIDsjIDM5MjMgcmVsb2FkX291dHNpKzIvNQotCWxkdyAwKCVyNSksJXIxOSA7IyAzOTMzIHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMjAsJXIyMCwlcjIwIDsjIDM5MjggYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjIwLCVyMjEsJXIyMSA7IyAzOTMxIGFzaGxzaTMtMgotCXN1YiAlcjEyLCVyMTksJXIxOSA7IyAzOTM0IHN1YnNpMy8xCi0Jc3R3ICVyMTksMCglcjIxKSA7IyAzOTM2IHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDM5MzkgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMzEyKCVyMzApLCVyMjAgOyMgMzk0MSByZWxvYWRfb3V0c2krMi81Ci0Jc2gyYWRkbCAlcjE5LCVyMTksJXIxOSA7IyAzOTQ2IGFzaGxzaTMtMgotCWNvbWliLD0gMCwlcjEwLEwkMDQwMCA7IyAzOTUxIGJsZXUrMQotCXNoMmFkZGwgJXIxOSwlcjIwLCVyMjAgOyMgMzk0OSBhc2hsc2kzLTIKLQlsZHcgMCglcjUpLCVyMTkgOyMgMzk1MyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyMTAsJXIxOSwlcjE5IDsjIDM5NTQgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDM5NTUgYWRkc2kzLzIKLQlibCBMJDA0MDEsJXIwIDsjIDM5NTgganVtcAotCXN0dyAlcjE5LDQoJXIyMCkgOyMgMzk1NyByZWxvYWRfb3V0c2krMi82Ci1MJDA0MDAKLQlzdHcgJXIwLDQoJXIyMCkgOyMgMzk2MiByZWxvYWRfb3V0c2krMi82Ci1MJDA0MDEKLQlsZHcgLTMwNCglcjMwKSwlcjIwIDsjIDM5NjYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMzEyKCVyMzApLCVyMjEgOyMgMzk2OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDAoJXI1KSwlcjE5IDsjIDM5NzggcmVsb2FkX291dHNpKzIvNQotCXNoMmFkZGwgJXIyMCwlcjIwLCVyMjAgOyMgMzk3MyBhc2hsc2kzLTIKLQlzaDJhZGRsICVyMjAsJXIyMSwlcjIxIDsjIDM5NzYgYXNobHNpMy0yCi0Jc3ViICVyNiwlcjE5LCVyMTkgOyMgMzk3OSBzdWJzaTMvMQotCXN0dyAlcjE5LDEyKCVyMjEpIDsjIDM5ODEgcmVsb2FkX291dHNpKzIvNgotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgMzk4NCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMTIoJXIzMCksJXIyMCA7IyAzOTg2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI2MCglcjMwKSwlcjEgOyMgODk2NCByZWxvYWRfb3V0c2krMi81Ci0Jc2gyYWRkbCAlcjE5LCVyMTksJXIxOSA7IyAzOTkxIGFzaGxzaTMtMgotCXNoMmFkZGwgJXIxOSwlcjIwLCVyMjAgOyMgMzk5NCBhc2hsc2kzLTIKLQlsZGkgMjU1LCVyMTkgOyMgMzk5OSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PCAlcjE5LCVyMSxMJDA0MDIgOyMgNDAwMSBibGV1KzEKLQlzdHcgJXIxLDE2KCVyMjApIDsjIDM5OTYgcmVsb2FkX291dHNpKzIvNgotCWxkdyAtMzA0KCVyMzApLCVyMjAgOyMgNDAwNSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMTIoJXIzMCksJXIyMSA7IyA0MDA3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgMCglcjUpLCVyMTkgOyMgNDAxNyByZWxvYWRfb3V0c2krMi81Ci0Jc2gyYWRkbCAlcjIwLCVyMjAsJXIyMCA7IyA0MDEyIGFzaGxzaTMtMgotCXNoMmFkZGwgJXIyMCwlcjIxLCVyMjEgOyMgNDAxNSBhc2hsc2kzLTIKLQlzdWIgJXI2LCVyMTksJXIxOSA7IyA0MDE4IHN1YnNpMy8xCi0JbGRvIDIoJXIxOSksJXIxOSA7IyA0MDE5IGFkZHNpMy8yCi0Jc3R3ICVyMTksOCglcjIxKSA7IyA0MDIxIHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgMCglcjUpLCVyNCA7IyA4MDg3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODA5MCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MDg4IHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MDg5IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNDA3IDsjIDgwOTEgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTkzIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDQwOAotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNDA0OSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA0MDU5IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDQxMyA7IyA0MDY3IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA0MDYxIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA0MDcwIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQxMwotCWxkdyAwKCVyNSksJXIyNiA7IyA0MDc3IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDQwODEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNDA3OSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDQwODkgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDQwODUgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA0MDYgOyMgNDA5OSBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQxMDEgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA0MTYgOyMgNDExMCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDEwNCBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDQxMTEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQxMTQgYWRkc2kzLzEKLUwkMDQxNgotCWNvbWliLD0gMCwlcjgsTCQwNDE3IDsjIDQxMTcgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA0MTE4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDQxMjEgYWRkc2kzLzEKLUwkMDQxNwotCWNvbWliLD0gMCwlcjksTCQwNDA2IDsjIDQxMjQgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA0MTI1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDQxMjggYWRkc2kzLzEKLUwkMDQwNgotCWxkdyAwKCVyNSksJXI0IDsjIDQwMjkgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA0MDMzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQwMzAgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDQwMzEgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA0MDgKLQlub3AgOyMgNDAzNSBibGV1KzEKLUwkMDQwNwotCWxkaSA1LCVyMTkgOyMgNDE1MCBtb3ZxaSsxLzIKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDQxNTEgbW92cWkrMS82Ci0JbGRiIC0yNTcoJXIzMCksJXIxIDsjIDQxNTYgbW92cWkrMS81Ci0Jc3RicyxtYSAlcjEsMSglcjYpIDsjIDg5NjggbW92cWkrMS82Ci0Jc3RicyxtYSAlcjAsMSglcjYpIDsjIDQxNTkgbW92cWkrMS82Ci1MJDA0MDIKLQlsZGkgMCwlcjEwIDsjIDQxODIgcmVsb2FkX291dHNpKzIvMgotCWxkaSAwLCVyOCA7IyA0MTg1IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyNiwlcjEyIDsjIDQxODggcmVsb2FkX291dHNpKzIvMQotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgNDE3NCByZWxvYWRfb3V0c2krMi81Ci0JbGRpIDAsJXI5IDsjIDQxOTEgcmVsb2FkX291dHNpKzIvMgotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNDE3NSBhZGRzaTMvMgotCWJsIEwkMDA0MywlcjAgOyMgNDE5MyBqdW1wCi0Jc3R3ICVyMTksLTMwNCglcjMwKSA7IyA0MTc5IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQyMgotCWJiLDwgJXIxNSwxOCxMJDAzOTcgOyMgNDIwMSBibGV1KzMKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDQyMDcgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDM3NCA7IyA0MjA5IGJsZXUrMQotCWJiLD49LG4gJXIxNSwxNCxMJDA5NTAgOyMgNDIxNSBtb3ZzaS00Ci0JYmwsbiBMJDAzOTcsJXIwIDsjIDQyMzAganVtcAotTCQwMzc0Ci0JY29taWIsPSxuIDAsJXIxMCxMJDA0MjcgOyMgNDIzNyBibGV1KzEKLQlsZHcgMCglcjUpLCVyNCA7IyA4MDk1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODA5OCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MDk2IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MDk3IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNDMyIDsjIDgwOTkgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTkxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDQzMwotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNDI2NiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA0Mjc2IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDQzOCA7IyA0Mjg0IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA0Mjc4IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA0Mjg3IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQzOAotCWxkdyAwKCVyNSksJXIyNiA7IyA0Mjk0IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDQyOTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNDI5NiByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDQzMDYgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDQzMDIgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA0MzEgOyMgNDMxNiBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQzMTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDMyMSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDQzMjIgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA0NDEgOyMgNDMyNyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDQzMjUgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA0MzI4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA0MzMxIGFkZHNpMy8xCi1MJDA0NDEKLQljb21pYiw9IDAsJXI4LEwkMDQ0MiA7IyA0MzM0IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNDMzNSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA0MzM4IGFkZHNpMy8xCi1MJDA0NDIKLQljb21pYiw9IDAsJXI5LEwkMDQzMSA7IyA0MzQxIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNDM0MiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA0MzQ1IGFkZHNpMy8xCi1MJDA0MzEKLQlsZHcgMCglcjUpLCVyNCA7IyA0MjQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNDI1MCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA0MjQ3IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA0MjQ4IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNDMzCi0Jbm9wIDsjIDQyNTIgYmxldSsxCi1MJDA0MzIKLQlsZGkgMTksJXIxOSA7IyA0MzY3IG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNDM2OCBtb3ZxaSsxLzYKLQl1YWRkY20gJXI2LCVyMTAsJXIyNCA7IyA0MzgxIGFkZGRpMysxCi0JbGRpIDEzLCVyMjYgOyMgNDM4NCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjEwLCVyMjUgOyMgNDM4NiByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdG9yZV9vcDEsJXIyIDsjIDQzOTAgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZG8gLTMoJXIyNCksJXIyNCA7IyA0Mzg4IGFkZHNpMy8yCi1MJDA0MjcKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDQzOTUgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDQ0NyA7IyA0Mzk3IGJsZXUrMQotCWJiLDwsbiAlcjE1LDE0LEwkMDA3NiA7IyA0NDAzIGJsZXUrMwotTCQwOTUwCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA0NDE0IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA0NDEyIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDQ0MTgganVtcAotCWxkaSAxNiwlcjI4IDsjIDQ0MTYgcmVsb2FkX291dHNpKzIvMgotTCQwNDQ3Ci0JbGRvIC0xKCVyMTkpLCVyMTkgOyMgNDQyNyBhZGRzaTMvMgotCXN0dyAlcjE5LC0zMDQoJXIzMCkgOyMgNDQzMSByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMTIoJXIzMCksJXIyMCA7IyA0NDM2IHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMTksJXIxOSwlcjE5IDsjIDQ0NDEgYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjE5LCVyMjAsJXIyMCA7IyA0NDQ0IGFzaGxzaTMtMgotCWxkdyAwKCVyNSksJXIyMSA7IyA0NDQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgMCglcjIwKSwlcjE5IDsjIDQ0NDggcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyMjApLCVyMjAgOyMgNDQ2NCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjAsTCQwNDUwIDsjIDQ0NjYgYmxldSsxCi0JYWRkbCAlcjIxLCVyMTksJXIxMiA7IyA0NDQ5IGFkZHNpMy8xCi0JYWRkbCAlcjIxLCVyMjAsJXIxOSA7IyA0NDgzIGFkZHNpMy8xCi0JYmwgTCQwNDUxLCVyMCA7IyA0NDg1IGp1bXAKLQlsZG8gLTEoJXIxOSksJXIxMCA7IyA0NDg0IGFkZHNpMy8yCi1MJDA0NTAKLQlsZGkgMCwlcjEwIDsjIDQ0ODkgcmVsb2FkX291dHNpKzIvMgotTCQwNDUxCi0JbGR3IC0zMDQoJXIzMCksJXIxOSA7IyA0NDkzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMxMiglcjMwKSwlcjIwIDsjIDQ0OTUgcmVsb2FkX291dHNpKzIvNQotCWxkdyAwKCVyNSksJXIyMSA7IyA0NTA1IHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMTksJXIxOSwlcjE5IDsjIDQ1MDAgYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjE5LCVyMjAsJXIyMCA7IyA0NTAzIGFzaGxzaTMtMgotCWxkdyAxMiglcjIwKSwlcjE5IDsjIDQ1MDcgcmVsb2FkX291dHNpKzIvNQotCWxkdyAxNiglcjIwKSwlcjcgOyMgNDUyMyByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjIxLCVyMTksJXI4IDsjIDQ1MDggYWRkc2kzLzEKLQlsZGkgMjU1LCVyMTkgOyMgNDUyOSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PCAlcjE5LCVyNyxMJDAwNDMgOyMgNDUzMSBibGV1KzEKLQlsZGkgMCwlcjkgOyMgNDUyNiByZWxvYWRfb3V0c2krMi8yCi0JbGR3IDgoJXIyMCksJXIxOSA7IyA0NTUwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI2MCglcjMwKSwlcjEgOyMgODk3MSByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjIxLCVyMTksJXIxOSA7IyA0NTUxIGFkZHNpMy8xCi0Jc3ViICVyMSwlcjcsJXIyMCA7IyA0NTU3IHN1YnNpMy8xCi0Jc3RiICVyMjAsMCglcjE5KSA7IyA0NTU5IG1vdnFpKzEvNgotCWxkdyAwKCVyNSksJXI0IDsjIDgxMDMgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTA2IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxMDQgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgxMDUgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA0NTcgOyMgODEwNyBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1ODkgcmVsb2FkX291dHNpKzIvMwotTCQwNDU4Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA0NTg3IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDQ1OTcgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNDYzIDsjIDQ2MDUgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDQ1OTkgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDQ2MDggcmVsb2FkX291dHNpKzIvNgotTCQwNDYzCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDQ2MTUgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNDYxOSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA0NjE3IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNDYyNyBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNDYyMyByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDQ1NiA7IyA0NjM3IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDYzOSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0NjQyIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNDY0MyBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDQ2NiA7IyA0NjQ4IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNDY0NiBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDQ2NDkgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQ2NTIgYWRkc2kzLzEKLUwkMDQ2NgotCWNvbWliLD0gMCwlcjgsTCQwNDY3IDsjIDQ2NTUgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA0NjU2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDQ2NTkgYWRkc2kzLzEKLUwkMDQ2NwotCWNvbWliLD0gMCwlcjksTCQwNDU2IDsjIDQ2NjIgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA0NjYzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDQ2NjYgYWRkc2kzLzEKLUwkMDQ1NgotCWxkdyAwKCVyNSksJXI0IDsjIDQ1NjcgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA0NTcxIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQ1Njggc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDQ1NjkgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA0NTgKLQlub3AgOyMgNDU3MyBibGV1KzEKLUwkMDQ1NwotCWxkaSA2LCVyMTkgOyMgNDY4OCBtb3ZxaSsxLzIKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDQ2ODkgbW92cWkrMS82Ci0Jc3RicyxtYSAlcjcsMSglcjYpIDsjIDQ2OTQgbW92cWkrMS82Ci0JbGR3IC0yNjAoJXIzMCksJXIxIDsjIDg5NzQgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjEsJXI3LCVyMTkgOyMgNDcwMCBzdWJzaTMvMQotCWJsIEwkMDA0MywlcjAgOyMgNDcyMCBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA0NzAyIG1vdnFpKzEvNgotTCQwNDcyCi0JbGRvIFInMzM3OTIoJXIxOSksJXIxOSA7IyA0NzI1IG1vdmhpLTIKLQlhbmQgJXIxNSwlcjE5LCVyMTkgOyMgNDcyNiBhbmRzaTMvMQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDM5NyA7IyA0NzI4IGJsZXUrMQotTCQwMzc4Ci0JYmIsPCxuICVyMTUsMjEsTCQwMDc2IDsjIDQ3MzkgYmxldSszCi0JbGR3IDAoJXI1KSwlcjMgOyMgODExMSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxMTQgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgODExMiBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgODExMyBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDQ3NiA7IyA4MTE1IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjQgOyMgODU4NyByZWxvYWRfb3V0c2krMi8zCi1MJDA0NzcKLQljb21iLD0gJXI0LCVyMjAsTCQwOTQ0IDsjIDQ3NjggYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNDc3OCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDA0ODIgOyMgNDc4NiBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNDc4MCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCw0KCVyNSkgOyMgNDc4OSByZWxvYWRfb3V0c2krMi82Ci1MJDA0ODIKLQlsZHcgMCglcjUpLCVyMjYgOyMgNDc5NiByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA0ODAwIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDQ3OTggcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA0ODA4IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA0ODA0IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwNDc1IDsjIDQ4MTggYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyA0ODIwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDQ4MjMgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyA0ODI0IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNDg1IDsjIDQ4MjkgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA0ODI3IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgNDgzMCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDgzMyBhZGRzaTMvMQotTCQwNDg1Ci0JY29taWIsPSAwLCVyOCxMJDA0ODYgOyMgNDgzNiBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDQ4Mzcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNDg0MCBhZGRzaTMvMQotTCQwNDg2Ci0JY29taWIsPSAwLCVyOSxMJDA0NzUgOyMgNDg0MyBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDQ4NDQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNDg0NyBhZGRzaTMvMQotTCQwNDc1Ci0JbGR3IDAoJXI1KSwlcjMgOyMgNDc0OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDQ3NTIgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNDc0OSBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgNDc1MCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDQ3NwotCW5vcCA7IyA0NzU0IGJsZXUrMQotTCQwNDc2Ci0JbGRpIDE0LCVyMjYgOyMgNDg3MyByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjEyLCVyMjUgOyMgNDg3NSByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyNiwlcjI1LCVyMjQgOyMgNDg3MCBzdWJzaTMvMQotCWxkbyAzKCVyMjQpLCVyMjQgOyMgNDg3NyBhZGRzaTMvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMSwlcjIgOyMgNDg4MSBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI2LCVyMjMgOyMgNDg3OSByZWxvYWRfb3V0c2krMi8xCi0JbGRpIDAsJXI5IDsjIDQ4ODQgcmVsb2FkX291dHNpKzIvMgotCWNvbWliLD0gMCwlcjEwLEwkMDQ5MCA7IyA0ODg5IGJsZXUrMQotCWxkbyAzKCVyNiksJXI2IDsjIDQ4ODYgYWRkc2kzLzIKLQlsZGkgMTMsJXIyNiA7IyA0ODk0IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTAsJXIyNSA7IyA0ODk2IHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI2LCVyMjUsJXIyNCA7IyA0ODkxIHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdG9yZV9vcDEsJXIyIDsjIDQ5MDAgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZG8gLTMoJXIyNCksJXIyNCA7IyA0ODk4IGFkZHNpMy8yCi1MJDA0OTAKLQlsZHcgMCglcjUpLCVyMyA7IyA4MTE5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODEyMiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MTIwIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MTIxIGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDQ5MiA7IyA4MTIzIGJsZXUrMQotCWNvcHkgJXI2LCVyMTAgOyMgNDkwNCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4NTg1IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDQ5MwotCWNvbWIsPSAlcjQsJXIyMCxMJDA5NDQgOyMgNDkyOSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA0OTM5IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDQ5OCA7IyA0OTQ3IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA0OTQxIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyA0OTUwIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQ5OAotCWxkdyAwKCVyNSksJXIyNiA7IyA0OTU3IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDQ5NjEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNDk1OSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDQ5NjkgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDQ5NjUgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDA0OTEgOyMgNDk3OSBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDQ5ODEgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA1MDEgOyMgNDk5MCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDk4NCBhZGRzaTMvMQotCXN1YiAlcjEwLCVyMywlcjE5IDsjIDQ5OTEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQ5OTQgYWRkc2kzLzEKLUwkMDUwMQotCWNvbWliLD0gMCwlcjgsTCQwNTAyIDsjIDQ5OTcgYmxldSsxCi0Jc3ViICVyOCwlcjMsJXIxOSA7IyA0OTk4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDUwMDEgYWRkc2kzLzEKLUwkMDUwMgotCWNvbWliLD0gMCwlcjksTCQwNDkxIDsjIDUwMDQgYmxldSsxCi0Jc3ViICVyOSwlcjMsJXIxOSA7IyA1MDA1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDUwMDggYWRkc2kzLzEKLUwkMDQ5MQotCWxkdyAwKCVyNSksJXIzIDsjIDQ5MDkgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA0OTEzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDQ5MTAgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDQ5MTEgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA0OTMKLQlub3AgOyMgNDkxNSBibGV1KzEKLUwkMDQ5MgotCWxkbyAzKCVyNiksJXI2IDsjIDUwMzAgYWRkc2kzLzIKLQlsZGkgMCwlcjggOyMgNTAzMyByZWxvYWRfb3V0c2krMi8yCi0JYmwgTCQwMDQzLCVyMCA7IyA1MDM4IGp1bXAKLQljb3B5ICVyNiwlcjEyIDsjIDUwMzYgcmVsb2FkX291dHNpKzIvMQotTCQwNTA2Ci0JYmIsPj0gJXIxNSwyMixMJDAzOTcgOyMgNTA0NiBtb3ZzaS00Ci0JbGRpIDQ2MDgsJXIyMCA7IyA1MDQ4IHJlbG9hZF9vdXRzaSsyLzIKLQlhbmQgJXIxNSwlcjIwLCVyMTkgOyMgNTA0OSBhbmRzaTMvMQotCWNvbWIsPSAlcjIwLCVyMTksTCQwMzk3IDsjIDUwNTMgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1MDU1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODk3NyByZWxvYWRfb3V0c2krMi81Ci0JbGRvIC0yKCVyMjApLCVyMTkgOyMgNTA1NiBhZGRzaTMvMgotCWNvbWIsPD4gJXIxLCVyMTksTCQxMTc1IDsjIDUwNTggYmxldSsxCi0JbGRpIC0xLCVyNCA7IyA1MDc0IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLD0sbiAlcjE2LCVyMjAsTCQwMzk3IDsjIDUwNjIgYmxldSsxCi1MJDExNzQKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDUwNzkgcmVsb2FkX291dHNpKzIvNQotTCQxMTc1Ci0JY29weSAlcjQsJXIxMSA7IyA1MDc2IHJlbG9hZF9vdXRzaSsyLzEKLQljb21iLDw+ICVyMTYsJXIyMCxMJDA1MTcgOyMgNTA4NSBibGV1KzEKLQlsZG8gLTEoJXIyMCksJXIyMyA7IyA1MDgwIGFkZHNpMy8yCi0JYmIsPj0sbiAlcjE1LDE5LEwkMDkxNSA7IyA1MDkyIG1vdnNpLTQKLQlibCBMJDExODIsJXIwIDsjIDUxMDcganVtcAotCXN0dyAlcjIzLC0yOTYoJXIzMCkgOyMgNTk2OCByZWxvYWRfb3V0c2krMi82Ci1MJDA1MTcKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDUxMzQgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDUxMzYgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDUxNSA7IyA1MTQzIGJsZXUrMQotCWxkYiAwKCVyMjApLCVyNyA7IyA1MTM5IHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1MTQ0IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDUxNDcgemVyb19leHRlbmRxaXNpMi8yCi1MJDA1MTUKLQlhZGRpbCBMUidfX2N0eXBlLSRnbG9iYWwkLCVyMjcgOyMgODI1NyBwaWMyX2xvX3N1bSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXIxKSwlcjIxIDsjIDgyNTkgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIyMSwlcjcsJXIxOSA7IyA4MjYwIGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyA4MjYxIG1vdnFpKzEvNQotCWJiLD49ICVyMTksMjksTCQwNTEzIDsjIDgyNjUgbW92c2ktNAotCWxkaSA0LCVyMjAgOyMgODI2MyByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjIwLCVyMjIgOyMgODU4MyByZWxvYWRfb3V0c2krMi8xCi1MJDA1MjIKLQljb21pY2xyLDwgLTEsJXIxMSwlcjAgOyMgODEyOCBtb3ZzaWNjKzEvMQotCWxkaSAwLCVyMTEKLQlzaDJhZGRsICVyMTEsJXIxMSwlcjE5IDsjIDUxODggYXNobHNpMy0yCi0Jc2gxYWRkbCAlcjE5LCVyNywlcjE5IDsjIDUxOTEgYXNobHNpMy0yCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1MTk0IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjIwLEwkMDUxMyA7IyA1MTk2IGJsZXUrMQotCWxkbyAtNDgoJXIxOSksJXIxMSA7IyA1MTkyIGFkZHNpMy8yCi0JbGRvIDEoJXIyMCksJXIxOSA7IyA1MjE1IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyA1MjE3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21pYiw9IDAsJXIxNCxMJDA1MjAgOyMgNTIyNCBibGV1KzEKLQlsZGIgMCglcjIwKSwlcjcgOyMgNTIyMCB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlhZGRsICVyMTQsJXI3LCVyMTkgOyMgNTIyNSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyA1MjI4IHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwNTIwCi0JYWRkbCAlcjIxLCVyNywlcjE5IDsjIDUxNjYgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDUxNjggbW92cWkrMS81Ci0JYW5kICVyMTksJXIyMiwlcjE5IDsjIDUxNzIgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQwNTIyCi0Jbm9wIDsjIDUxNzQgYmxldSsxCi1MJDA1MTMKLQlsZGkgNDQsJXIxOSA7IyA1MjUyIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMTksJXI3LEwkMDUzMiA7IyA1MjU0IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTI1OSByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA1MzMgOyMgNTI2MSBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDUyNzggYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDUyODAgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDUzNSA7IyA1Mjg3IGJsZXUrMQotCWxkYiAwKCVyMjApLCVyNyA7IyA1MjgzIHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1Mjg4IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDUyOTEgemVyb19leHRlbmRxaXNpMi8yCi1MJDA1MzUKLQlhZGRpbCBMUidfX2N0eXBlLSRnbG9iYWwkLCVyMjcgOyMgODI2OSBwaWMyX2xvX3N1bSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXIxKSwlcjIxIDsjIDgyNzEgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIyMSwlcjcsJXIxOSA7IyA4MjcyIGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyA4MjczIG1vdnFpKzEvNQotCWJiLD49ICVyMTksMjksTCQwNTMzIDsjIDgyNzcgbW92c2ktNAotCWxkaSA0LCVyMjAgOyMgODI3NSByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjIwLCVyMjIgOyMgODU3OCByZWxvYWRfb3V0c2krMi8xCi1MJDA1NDIKLQljb21pY2xyLDwgLTEsJXI0LCVyMCA7IyA4MTMyIG1vdnNpY2MrMS8xCi0JbGRpIDAsJXI0Ci0Jc2gyYWRkbCAlcjQsJXI0LCVyMTkgOyMgNTMzMiBhc2hsc2kzLTIKLQlzaDFhZGRsICVyMTksJXI3LCVyMTkgOyMgNTMzNSBhc2hsc2kzLTIKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDUzMzggcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwNTMzIDsjIDUzNDAgYmxldSsxCi0JbGRvIC00OCglcjE5KSwlcjQgOyMgNTMzNiBhZGRzaTMvMgotCWxkbyAxKCVyMjApLCVyMTkgOyMgNTM1OSBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgNTM2MSByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNTQwIDsjIDUzNjggYmxldSsxCi0JbGRiIDAoJXIyMCksJXI3IDsjIDUzNjQgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDUzNjkgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNTM3MiB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDU0MAotCWFkZGwgJXIyMSwlcjcsJXIxOSA7IyA1MzEwIGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyA1MzEyIG1vdnFpKzEvNQotCWFuZCAlcjE5LCVyMjIsJXIxOSA7IyA1MzE2IGFuZHNpMy8xCi0JY29taWIsPD4gMCwlcjE5LEwkMDU0MgotCW5vcCA7IyA1MzE4IGJsZXUrMQotTCQwNTMzCi0JY29taWNsciw8IC0xLCVyNCwlcjAgOyMgODEzNiBiZXEtMS80Ci0JemRlcGkgLTEsMzEsMTUsJXI0Ci0JYmwsbiBMJDA1NTMsJXIwIDsjIDU0MDEganVtcAotTCQwNTMyCi0JY29weSAlcjExLCVyNCA7IyA1NDA2IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDU1MwotCWNvbWliLD4gMCwlcjExLEwkMDk1MSA7IyA1NDEwIGJsZXUrMQotCXpkZXBpIC0xLDMxLDE1LCVyMTkgOyMgNTQxMiByZWxvYWRfb3V0c2krMi80Ci0JY29tYiw8LG4gJXIxOSwlcjQsTCQwOTUxIDsjIDU0MTQgYmxldSsxCi0JY29tYiw8LG4gJXI0LCVyMTEsTCQwOTUxIDsjIDU0MTYgYmxldSsxCi0JYmIsPCAlcjE1LDE5LEwkMTE3NiA7IyA1NDUxIGJsZXUrMwotCWxkaSAxMjUsJXIxOSA7IyA1NTE0IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgOTIsJXIxOSA7IyA1NDU1IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMTksJXI3LEwkMDkxNSA7IyA1NDU3IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTQ3MyByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MjIgOyMgNTQ3NSBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDU0ODQgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDU0ODYgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDU1OCA7IyA1NDkzIGJsZXUrMQotCWxkYiAwKCVyMjApLCVyNyA7IyA1NDg5IHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1NDk0IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDU0OTcgemVyb19leHRlbmRxaXNpMi8yCi1MJDA1NTgKLQlsZGkgMTI1LCVyMTkgOyMgNTUxNCByZWxvYWRfb3V0c2krMi8yCi1MJDExNzYKLQljb21iLD0sbiAlcjE5LCVyNyxMJDA1NjYgOyMgNTUxNiBibGV1KzEKLUwkMDk1MQotCWJiLDwsbiAlcjE1LDE5LEwkMDUxMSA7IyA1NTIzIGJsZXUrMwotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgNTUzNCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgNTUzMiByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyA1NTM4IGp1bXAKLQlsZGkgMTAsJXIyOCA7IyA1NTM2IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDU2NgotCWNvbWliLDw+LG4gMCwlcjgsTCQwNTY5IDsjIDU1NDUgYmxldSsxCi0JYmIsPCxuICVyMTUsMjYsTCQwOTE3IDsjIDU1NTIgYmxldSszCi0JYmIsPj0sbiAlcjE1LDI3LEwkMDUxMSA7IyA1NTcxIG1vdnNpLTQKLQljb3B5ICVyNiwlcjggOyMgNTU3NCByZWxvYWRfb3V0c2krMi8xCi1MJDA1NjkKLQljb21pYiw8PiAwLCVyNCxMJDA1NzQgOyMgNTU4NyBibGV1KzEKLQlsZGkgMTAsJXIxMyA7IyA4OTgwIHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgMCglcjUpLCVyMyA7IyA4MTM5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE0MiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MTQwIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MTQxIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNTc2IDsjIDgxNDMgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4NTczIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDU3NwotCWNvbWIsPSAlcjQsJXIyMCxMJDA5NDQgOyMgNTYxMyBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA1NjIzIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDU4MiA7IyA1NjMxIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA1NjI1IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyA1NjM0IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDU4MgotCWxkdyAwKCVyNSksJXIyNiA7IyA1NjQxIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDU2NDUgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNTY0MyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDU2NTMgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDU2NDkgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDA1NzUgOyMgNTY2MyBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDU2NjUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNTY2OCBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDU2Njkgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA1ODUgOyMgNTY3NCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDU2NzIgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyA1Njc1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA1Njc4IGFkZHNpMy8xCi1MJDA1ODUKLQljb21pYiw9IDAsJXI4LEwkMDU4NiA7IyA1NjgxIGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgNTY4MiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA1Njg1IGFkZHNpMy8xCi1MJDA1ODYKLQljb21pYiw9IDAsJXI5LEwkMDU3NSA7IyA1Njg4IGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgNTY4OSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA1NjkyIGFkZHNpMy8xCi1MJDA1NzUKLQlsZHcgMCglcjUpLCVyMyA7IyA1NTkzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNTU5NyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA1NTk0IHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA1NTk1IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNTc3Ci0Jbm9wIDsjIDU1OTkgYmxldSsxCi1MJDA1NzYKLQlsZGkgMTIsJXIyNiA7IyA1NzE4IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyOCwlcjI1IDsjIDU3MjAgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjYsJXI4LCVyMjQgOyMgNTcyMiBzdWJzaTMvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMSwlcjIgOyMgNTcyNiBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI2LCVyMjMgOyMgNTcyNCByZWxvYWRfb3V0c2krMi8xCi0JYmwgTCQwNTkwLCVyMCA7IyA1NzMwIGp1bXAKLQlsZG8gMyglcjYpLCVyNiA7IyA1NzI4IGFkZHNpMy8yCi1MJDA1NzQKLQljb21pY2xyLD4gMiwlcjQsJXIwIDsjIDgyODIgYmVxLTEvMgotCWxkaSAyMCwlcjEzCi0JbGR3IDAoJXI1KSwlcjMgOyMgODI4NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgyODggcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgODI4NiBzdWJzaTMvMQotCWFkZGwgJXIxOSwlcjEzLCVyMTkgOyMgODI4NyBhZGRzaTMvMQotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDg2OCA7IyA4Mjg5IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjcgOyMgODU3MSByZWxvYWRfb3V0c2krMi8zCi1MJDA1OTUKLQljb21iLD0gJXI3LCVyMjAsTCQwOTQ0IDsjIDU3NjkgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNTc3OSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjcsJXIxOSxMJDA2MDAgOyMgNTc4NyBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNTc4MSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNyw0KCVyNSkgOyMgNTc5MCByZWxvYWRfb3V0c2krMi82Ci1MJDA2MDAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNTc5NyByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA1ODAxIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDU3OTkgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA1ODA5IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA1ODA1IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwNTkzIDsjIDU4MTkgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyA1ODIxIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDU4MjQgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyA1ODI1IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNjAzIDsjIDU4MzAgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA1ODI4IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgNTgzMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNTgzNCBhZGRzaTMvMQotTCQwNjAzCi0JY29taWIsPSAwLCVyOCxMJDA2MDQgOyMgNTgzNyBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDU4Mzggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNTg0MSBhZGRzaTMvMQotTCQwNjA0Ci0JY29taWIsPSAwLCVyOSxMJDA1OTMgOyMgNTg0NCBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDU4NDUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNTg0OCBhZGRzaTMvMQotTCQwNTkzCi0JbGR3IDAoJXI1KSwlcjMgOyMgNTc0OSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDU3NTMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNTc1MCBzdWJzaTMvMQotCWFkZGwgJXIxOSwlcjEzLCVyMTkgOyMgNTc1MSBhZGRzaTMvMQotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDU5NQotCW5vcCA7IyA1NzU1IGJsZXUrMQotTCQwODY4Ci0JY29taWIsPj0gMSwlcjQsTCQwNjA4IDsjIDU4NzIgYmxldSsxCi0JbGRvIDUoJXI2KSwlcjE5IDsjIDU4NzAgYWRkc2kzLzIKLQlzdWIgJXIxOSwlcjgsJXIxOSA7IyA1ODc0IHN1YnNpMy8xCi0JYmwgTCQwNjA5LCVyMCA7IyA1ODc2IGp1bXAKLQlsZG8gMiglcjE5KSwlcjI0IDsjIDU4NzUgYWRkc2kzLzIKLUwkMDYwOAotCXN1YiAlcjE5LCVyOCwlcjE5IDsjIDU4Nzkgc3Vic2kzLzEKLQlsZG8gLTMoJXIxOSksJXIyNCA7IyA1ODgwIGFkZHNpMy8yCi1MJDA2MDkKLQlsZGkgMjAsJXIyNiA7IyA1ODg1IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyOCwlcjI1IDsjIDU4ODcgcmVsb2FkX291dHNpKzIvMQotCWNvcHkgJXIxMSwlcjIzIDsjIDU4OTEgcmVsb2FkX291dHNpKzIvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5zZXJ0X29wMiwlcjIgOyMgNTg5MyBjYWxsX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjYsLTUyKCVyMzApIDsjIDU4ODMgcmVsb2FkX291dHNpKzIvNgotCWxkbyA1KCVyNiksJXI2IDsjIDU4OTUgYWRkc2kzLzIKLQlsZGkgMjIsJXIyNiA7IyA1OTAwIHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyOCwlcjI1IDsjIDU5MDIgcmVsb2FkX291dHNpKzIvMQotCWxkaSA1LCVyMjQgOyMgNTkwNCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjExLCVyMjMgOyMgNTkwNiByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AyLCVyMiA7IyA1OTA4IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyNiwtNTIoJXIzMCkgOyMgNTg5OCByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPj0gMSwlcjQsTCQwNTkwIDsjIDU5MTMgYmxldSsxCi0JbGRvIDUoJXI2KSwlcjYgOyMgNTkxMCBhZGRzaTMvMgotCWxkaSAyMSwlcjI2IDsjIDU5MjEgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI2LCVyMjUgOyMgNTkyMyByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyOCwlcjYsJXIyNCA7IyA1OTE3IHN1YnNpMy8xCi0JbGRvIDIoJXIyNCksJXIyNCA7IyA1OTI1IGFkZHNpMy8yCi0JbGRvIC0xKCVyNCksJXI0IDsjIDU5MTkgYWRkc2kzLzIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHN0b3JlX29wMiwlcjIgOyMgNTkyOSBjYWxsX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI0LCVyMjMgOyMgNTkyNyByZWxvYWRfb3V0c2krMi8xCi0JbGRvIDUoJXI2KSwlcjYgOyMgNTkzMSBhZGRzaTMvMgotCXN0dyAlcjYsLTUyKCVyMzApIDsjIDU5MzYgcmVsb2FkX291dHNpKzIvNgotCWxkaSAyMiwlcjI2IDsjIDU5MzggcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI4LCVyMjUgOyMgNTk0MCByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyNiwlcjgsJXIyNCA7IyA1OTQyIHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AyLCVyMiA7IyA1OTQ2IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjQsJXIyMyA7IyA1OTQ0IHJlbG9hZF9vdXRzaSsyLzEKLQlsZG8gNSglcjYpLCVyNiA7IyA1OTQ4IGFkZHNpMy8yCi1MJDA1OTAKLQlibCBMJDAwNDMsJXIwIDsjIDU5NjMganVtcAotCWxkaSAwLCVyOSA7IyA1OTU2IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDUxMQotCXN0dyAlcjIzLC0yOTYoJXIzMCkgOyMgNTk2OCByZWxvYWRfb3V0c2krMi82Ci1MJDExODIKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDU5NzcgcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwOTIyIDsjIDU5NzkgYmxldSsxCi0JbGRvIDEoJXIyMCksJXIyMSA7IyA1OTg4IGFkZHNpMy8yCi0JbGRiIDAoJXIyMCksJXIyMCA7IyA1OTkyIG1vdnFpKzEvNQotCXN0dyAlcjIxLC0yOTYoJXIzMCkgOyMgNTk5MCByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNjEyIDsjIDU5OTcgYmxldSsxCi0JZXh0cnUgJXIyMCwzMSw4LCVyNyA7IyA1OTkzIHplcm9fZXh0ZW5kcWlzaTIvMQotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1OTk4IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDYwMDEgemVyb19leHRlbmRxaXNpMi8yCi1MJDA2MTIKLQliYiw8ICVyMTUsMTksTCQwMDc2IDsjIDYwMTkgYmxldSszCi0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg5ODMgcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPj49ICVyMSwlcjIxLEwkMDA3NiA7IyA2MDI1IGJsZXUrMQotCWV4dHJzICVyMjAsMzEsOCwlcjIwIDsjIDYwMzAgZXh0ZW5kcWlzaTIKLQlsZGkgOTIsJXIxOSA7IyA2MDMyIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLD0sbiAlcjE5LCVyMjAsTCQwMzk3IDsjIDYwMzQgYmxldSsxCi0JYmwsbiBMJDAwNzYsJXIwIDsjIDYwNDIganVtcAotTCQwNjE5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxNTEgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE0OSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE1MCBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDA2MjQgOyMgODE1MiBibGV1KzEKLQljb3B5ICVyNiwlcjggOyMgNjA0NyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTY5IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDYyNQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjA3NSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2MDg1IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDYzMCA7IyA2MDkzIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2MDg3IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2MDk2IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDYzMAotCWxkdyAwKCVyNSksJXIyNiA7IyA2MTAzIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDYxMDcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjEwNSByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDYxMTUgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2MTExIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNjIzIDsjIDYxMjUgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2MTI3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDYxMzAgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2MTMxIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNjMzIDsjIDYxMzYgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2MTM0IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjEzNyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjE0MCBhZGRzaTMvMQotTCQwNjMzCi0JY29taWIsPSAwLCVyOCxMJDA2MzQgOyMgNjE0MyBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDYxNDQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjE0NyBhZGRzaTMvMQotTCQwNjM0Ci0JY29taWIsPSAwLCVyOSxMJDA2MjMgOyMgNjE1MCBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDYxNTEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjE1NCBhZGRzaTMvMQotTCQwNjIzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjA1NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDYwNTkgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjA1NiBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjA1NyBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDYyNQotCW5vcCA7IyA2MDYxIGJsZXUrMQotTCQwNjI0Ci0JbGRpIDIzLCVyMTkgOyMgNjE3NiBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDYxODkganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjE3NyBtb3ZxaSsxLzYKLUwkMDYzOQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTU5IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxNTcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxNTggYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwNjQ0IDsjIDgxNjAgYmxldSsxCi0JY29weSAlcjYsJXI4IDsjIDYxOTQgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU2NyByZWxvYWRfb3V0c2krMi8zCi1MJDA2NDUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDYyMjIgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjIzMiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA2NTAgOyMgNjI0MCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNjIzNCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNjI0MyByZWxvYWRfb3V0c2krMi82Ci1MJDA2NTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNjI1MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA2MjU0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDYyNTIgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2MjYyIGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNjI1OCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDY0MyA7IyA2MjcyIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjI3NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2Mjc3IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNjI3OCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDY1MyA7IyA2MjgzIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNjI4MSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDYyODQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDYyODcgYWRkc2kzLzEKLUwkMDY1MwotCWNvbWliLD0gMCwlcjgsTCQwNjU0IDsjIDYyOTAgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA2MjkxIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDYyOTQgYWRkc2kzLzEKLUwkMDY1NAotCWNvbWliLD0gMCwlcjksTCQwNjQzIDsjIDYyOTcgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA2Mjk4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDYzMDEgYWRkc2kzLzEKLUwkMDY0MwotCWxkdyAwKCVyNSksJXI0IDsjIDYyMDIgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA2MjA2IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDYyMDMgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDYyMDQgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA2NDUKLQlub3AgOyMgNjIwOCBibGV1KzEKLUwkMDY0NAotCWxkaSAyNCwlcjE5IDsjIDYzMjMgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA2MzM2IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDYzMjQgbW92cWkrMS82Ci1MJDA2NTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE2NyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MTY1IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MTY2IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNjY0IDsjIDgxNjggYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTY1IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDY2NQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjM2NiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2Mzc2IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDY3MCA7IyA2Mzg0IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2Mzc4IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2Mzg3IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDY3MAotCWxkdyAwKCVyNSksJXIyNiA7IyA2Mzk0IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDYzOTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjM5NiByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDY0MDYgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2NDAyIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNjYzIDsjIDY0MTYgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2NDE4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDY0MjEgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2NDIyIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNjczIDsjIDY0MjcgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2NDI1IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjQyOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjQzMSBhZGRzaTMvMQotTCQwNjczCi0JY29taWIsPSAwLCVyOCxMJDA2NzQgOyMgNjQzNCBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDY0MzUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjQzOCBhZGRzaTMvMQotTCQwNjc0Ci0JY29taWIsPSAwLCVyOSxMJDA2NjMgOyMgNjQ0MSBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDY0NDIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjQ0NSBhZGRzaTMvMQotTCQwNjYzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjM0NiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDYzNTAgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjM0NyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjM0OCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDY2NQotCW5vcCA7IyA2MzUyIGJsZXUrMQotTCQwNjY0Ci0JbGRpIDI1LCVyMTkgOyMgNjQ2NyBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDY0ODAganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjQ2OCBtb3ZxaSsxLzYKLUwkMDY3OQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTc1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxNzMgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxNzQgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA2ODQgOyMgODE3NiBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NjMgcmVsb2FkX291dHNpKzIvMwotTCQwNjg1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2NTEwIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDY1MjAgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNjkwIDsjIDY1MjggYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDY1MjIgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDY1MzEgcmVsb2FkX291dHNpKzIvNgotTCQwNjkwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDY1MzggcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjU0MiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2NTQwIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjU1MCBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDY1NDYgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA2ODMgOyMgNjU2MCBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY1NjIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjU2NSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDY1NjYgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA2OTMgOyMgNjU3MSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDY1NjkgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2NTcyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2NTc1IGFkZHNpMy8xCi1MJDA2OTMKLQljb21pYiw9IDAsJXI4LEwkMDY5NCA7IyA2NTc4IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjU3OSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2NTgyIGFkZHNpMy8xCi1MJDA2OTQKLQljb21pYiw9IDAsJXI5LEwkMDY4MyA7IyA2NTg1IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjU4NiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2NTg5IGFkZHNpMy8xCi1MJDA2ODMKLQlsZHcgMCglcjUpLCVyNCA7IyA2NDkwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjQ5NCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2NDkxIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2NDkyIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNjg1Ci0Jbm9wIDsjIDY0OTYgYmxldSsxCi1MJDA2ODQKLQlsZGkgMjYsJXIxOSA7IyA2NjExIG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjYyNCBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2NjEyIG1vdnFpKzEvNgotTCQwNjk5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxODMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE4MSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE4MiBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDcwNCA7IyA4MTg0IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU2MSByZWxvYWRfb3V0c2krMi8zCi1MJDA3MDUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDY2NTQgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjY2NCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA3MTAgOyMgNjY3MiBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNjY2NiByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNjY3NSByZWxvYWRfb3V0c2krMi82Ci1MJDA3MTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNjY4MiByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA2Njg2IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDY2ODQgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2Njk0IGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNjY5MCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDcwMyA7IyA2NzA0IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjcwNiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2NzA5IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNjcxMCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDcxMyA7IyA2NzE1IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNjcxMyBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDY3MTYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDY3MTkgYWRkc2kzLzEKLUwkMDcxMwotCWNvbWliLD0gMCwlcjgsTCQwNzE0IDsjIDY3MjIgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA2NzIzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDY3MjYgYWRkc2kzLzEKLUwkMDcxNAotCWNvbWliLD0gMCwlcjksTCQwNzAzIDsjIDY3MjkgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA2NzMwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDY3MzMgYWRkc2kzLzEKLUwkMDcwMwotCWxkdyAwKCVyNSksJXI0IDsjIDY2MzQgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA2NjM4IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY2MzUgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDY2MzYgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA3MDUKLQlub3AgOyMgNjY0MCBibGV1KzEKLUwkMDcwNAotCWxkaSAyNywlcjE5IDsjIDY3NTUgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA2NzY4IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDY3NTYgbW92cWkrMS82Ci1MJDA3MTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE5MSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MTg5IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MTkwIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNzI0IDsjIDgxOTIgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTU5IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDcyNQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjc5OCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2ODA4IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDczMCA7IyA2ODE2IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2ODEwIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2ODE5IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDczMAotCWxkdyAwKCVyNSksJXIyNiA7IyA2ODI2IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDY4MzAgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjgyOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDY4MzggYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2ODM0IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNzIzIDsjIDY4NDggYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2ODUwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDY4NTMgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2ODU0IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNzMzIDsjIDY4NTkgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2ODU3IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjg2MCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjg2MyBhZGRzaTMvMQotTCQwNzMzCi0JY29taWIsPSAwLCVyOCxMJDA3MzQgOyMgNjg2NiBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDY4Njcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjg3MCBhZGRzaTMvMQotTCQwNzM0Ci0JY29taWIsPSAwLCVyOSxMJDA3MjMgOyMgNjg3MyBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDY4NzQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjg3NyBhZGRzaTMvMQotTCQwNzIzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjc3OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDY3ODIgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjc3OSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjc4MCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDcyNQotCW5vcCA7IyA2Nzg0IGJsZXUrMQotTCQwNzI0Ci0JbGRpIDI4LCVyMTkgOyMgNjg5OSBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDY5MTIganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjkwMCBtb3ZxaSsxLzYKLUwkMDczOQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTk5IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxOTcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxOTggYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA3NDQgOyMgODIwMCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NTcgcmVsb2FkX291dHNpKzIvMwotTCQwNzQ1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2OTQyIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDY5NTIgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNzUwIDsjIDY5NjAgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDY5NTQgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDY5NjMgcmVsb2FkX291dHNpKzIvNgotTCQwNzUwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDY5NzAgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjk3NCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2OTcyIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjk4MiBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDY5NzggcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA3NDMgOyMgNjk5MiBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY5OTQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjk5NyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDY5OTggc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA3NTMgOyMgNzAwMyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDcwMDEgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA3MDA0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA3MDA3IGFkZHNpMy8xCi1MJDA3NTMKLQljb21pYiw9IDAsJXI4LEwkMDc1NCA7IyA3MDEwIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNzAxMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA3MDE0IGFkZHNpMy8xCi1MJDA3NTQKLQljb21pYiw9IDAsJXI5LEwkMDc0MyA7IyA3MDE3IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNzAxOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA3MDIxIGFkZHNpMy8xCi1MJDA3NDMKLQlsZHcgMCglcjUpLCVyNCA7IyA2OTIyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjkyNiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2OTIzIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2OTI0IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNzQ1Ci0Jbm9wIDsjIDY5MjggYmxldSsxCi1MJDA3NDQKLQlsZGkgMTAsJXIxOSA7IyA3MDQzIG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNzA1NiBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA3MDQ0IG1vdnFpKzEvNgotTCQwNzU5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgyMDcgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODIwNSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODIwNiBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDc2NCA7IyA4MjA4IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU1NSByZWxvYWRfb3V0c2krMi8zCi1MJDA3NjUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDcwODYgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNzA5NiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA3NzAgOyMgNzEwNCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNzA5OCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNzEwNyByZWxvYWRfb3V0c2krMi82Ci1MJDA3NzAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNzExNCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA3MTE4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDcxMTYgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA3MTI2IGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNzEyMiByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDc2MyA7IyA3MTM2IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzEzOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA3MTQxIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNzE0MiBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDc3MyA7IyA3MTQ3IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNzE0NSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDcxNDggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDcxNTEgYWRkc2kzLzEKLUwkMDc3MwotCWNvbWliLD0gMCwlcjgsTCQwNzc0IDsjIDcxNTQgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA3MTU1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDcxNTggYWRkc2kzLzEKLUwkMDc3NAotCWNvbWliLD0gMCwlcjksTCQwNzYzIDsjIDcxNjEgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA3MTYyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDcxNjUgYWRkc2kzLzEKLUwkMDc2MwotCWxkdyAwKCVyNSksJXI0IDsjIDcwNjYgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA3MDcwIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDcwNjcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDcwNjggYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA3NjUKLQlub3AgOyMgNzA3MiBibGV1KzEKLUwkMDc2NAotCWxkaSAxMSwlcjE5IDsjIDcxODcgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA3MjAwIGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDcxODggbW92cWkrMS82Ci1MJDA3ODcKLQliYiw8ICVyMTUsMTcsTCQwMDc2IDsjIDcyMTYgYmxldSszCi0JbGRvIC00OCglcjcpLCVyMTkgOyMgNzIyNCBhZGRzaTMvMgotCWxkdyAtMjYwKCVyMzApLCVyMSA7IyA4OTg2IHJlbG9hZF9vdXRzaSsyLzUKLQlleHRydSAlcjE5LDMxLDgsJXIzIDsjIDcyMjUgemVyb19leHRlbmRxaXNpMi8xCi0JY29tYiw8PCAlcjEsJXIzLEwkMDkzOSA7IyA3MjMwIGJsZXUrMQotCWxkbyAtMzEyKCVyMzApLCVyMjYgOyMgNzI0NCBhZGRzaTMvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZ3JvdXBfaW5fY29tcGlsZV9zdGFjaywlcjIgOyMgNzI0OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIzLCVyMjUgOyMgNzI0NiByZWxvYWRfb3V0c2krMi8xCi0JZXh0cnMgJXIyOCwzMSw4LCVyMjggOyMgNzI1MSBleHRlbmRxaXNpMgotCWNvbWliLDw+LG4gMCwlcjI4LEwkMDA3NiA7IyA3MjUzIGJsZXUrMQotCWxkdyAwKCVyNSksJXI0IDsjIDgyMTIgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MjE1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgyMTMgc3Vic2kzLzEKLQlsZG8gMiglcjE5KSwlcjE5IDsjIDgyMTQgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwNzk1IDsjIDgyMTYgYmxldSsxCi0JY29weSAlcjYsJXI4IDsjIDcyNjAgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTCc2NTUzNiwlcjcgOyMgODU1MyByZWxvYWRfb3V0c2krMi8zCi1MJDA3OTYKLQljb21iLD0gJXI3LCVyMjAsTCQwOTQ0IDsjIDcyODggYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNzI5OCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjcsJXIxOSxMJDA4MDEgOyMgNzMwNiBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNzMwMCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNyw0KCVyNSkgOyMgNzMwOSByZWxvYWRfb3V0c2krMi82Ci1MJDA4MDEKLQlsZHcgMCglcjUpLCVyMjYgOyMgNzMxNiByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA3MzIwIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDczMTggcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA3MzI4IGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNzMyNCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDc5NCA7IyA3MzM4IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzM0MCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA3MzQzIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNzM0NCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDgwNCA7IyA3MzQ5IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNzM0NyBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDczNTAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDczNTMgYWRkc2kzLzEKLUwkMDgwNAotCWNvbWliLD0gMCwlcjgsTCQwODA1IDsjIDczNTYgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA3MzU3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDczNjAgYWRkc2kzLzEKLUwkMDgwNQotCWNvbWliLD0gMCwlcjksTCQwNzk0IDsjIDczNjMgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA3MzY0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDczNjcgYWRkc2kzLzEKLUwkMDc5NAotCWxkdyAwKCVyNSksJXI0IDsjIDcyNjggcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA3MjcyIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDcyNjkgc3Vic2kzLzEKLQlsZG8gMiglcjE5KSwlcjE5IDsjIDcyNzAgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA3OTYKLQlub3AgOyMgNzI3NCBibGV1KzEKLUwkMDc5NQotCWxkaSA3LCVyMTkgOyMgNzM4OSBtb3ZxaSsxLzIKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDczOTAgbW92cWkrMS82Ci0JYmwgTCQwMDQzLCVyMCA7IyA3NDA1IGp1bXAKLQlzdGJzLG1hICVyMywxKCVyNikgOyMgNzM5MyBtb3ZxaSsxLzYKLUwkMDgxMQotCWJiLDwgJXIxNSwzMCxMJDAxMDQKLQlub3AgOyMgNzQxNCBibGV1KzMKLUwkMDM5NwotCWNvbWliLD0gMCwlcjE0LEwkMDgxNSA7IyA3NDI5IGJsZXUrMQotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA3NDMwIGFkZHNpMy8xCi0JYmwgTCQwODE2LCVyMCA7IyA3NDM0IGp1bXAKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDc0MzMgemVyb19leHRlbmRxaXNpMi8yCi1MJDA4MTUKLQljb3B5ICVyNywlcjE5IDsjIDc0MzggcmVsb2FkX291dHNpKzIvMQotTCQwODE2Ci0JY29weSAlcjE5LCVyNyA7IyA3NDQxIHJlbG9hZF9vdXRzaSsyLzEKLUwkMDA3NgotCWNvbWliLD0sbiAwLCVyOSxMJDA4MjAgOyMgNzQ2MCBibGV1KzEKLQlsZGIgMCglcjkpLCVyMjAgOyMgNzQ2MyB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlhZGRsICVyOSwlcjIwLCVyMTkgOyMgNzQ2NCBhZGRzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNzQ2NSBhZGRzaTMvMgotCWNvbWIsPD4gJXI2LCVyMTksTCQwODIwIDsjIDc0NjcgYmxldSsxCi0JbGRpIDI1NSwlcjE5IDsjIDc0NzIgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSAlcjE5LCVyMjAsTCQwODIwIDsjIDc0NzQgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMSA7IyA3NDc2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjIxKSwlcjE5IDsjIDc0NzggbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMjAgOyMgNzQ3OSBleHRlbmRxaXNpMgotCWxkaSA0MiwlcjE5IDsjIDc0ODEgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSAlcjE5LCVyMjAsTCQwODIwIDsjIDc0ODMgYmxldSsxCi0JbGRpIDk0LCVyMTkgOyMgNzQ5MCByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9LG4gJXIxOSwlcjIwLEwkMDgyMCA7IyA3NDkyIGJsZXUrMQotCWJiLD49ICVyMTUsMzAsTCQwODIxIDsjIDc0OTcgbW92c2ktNAotCWxkaSA5MiwlcjE5IDsjIDc1MDQgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4sbiAlcjE5LCVyMjAsTCQwODIyIDsjIDc1MDYgYmxldSsxCi0JbGRiIDEoJXIyMSksJXIxOSA7IyA3NTEwIG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjIwIDsjIDc1MTEgZXh0ZW5kcWlzaTIKLUwkMDgyMQotCWxkaSA0MywlcjE5IDsjIDc1MzQgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSAlcjE5LCVyMjAsTCQwODIwIDsjIDc1MzYgYmxldSsxCi0JbGRpIDYzLCVyMTkgOyMgNzU0MyByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9LG4gJXIxOSwlcjIwLEwkMDgyMCA7IyA3NTQ1IGJsZXUrMQotTCQwODIyCi0JYmIsPj0sbiAlcjE1LDIyLEwkMDgxOSA7IyA3NTUzIG1vdnNpLTQKLQliYiw+PSAlcjE1LDE5LEwkMDgyMyA7IyA3NTU4IG1vdnNpLTQKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDc1NjAgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgNzU2MiBtb3ZxaSsxLzUKLQlsZGkgMTIzLCVyMjAgOyMgNzU2NSByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgNzU2MyBleHRlbmRxaXNpMgotCWNvbWIsPSxuICVyMjAsJXIxOSxMJDA4MjAgOyMgNzU2NyBibGV1KzEKLQlsZHcgMCglcjUpLCVyNCA7IyA4MjI4IHJlbG9hZF9vdXRzaSsyLzUKLQlibCxuIEwkMTE3NywlcjAgOyMgNzU2OCBqdW1wCi1MJDA4MjMKLQlsZHcgLTI5NiglcjMwKSwlcjIxIDsjIDc1NzIgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMjEpLCVyMTkgOyMgNzU3NCBtb3ZxaSsxLzUKLQlsZGkgOTIsJXIyMCA7IyA3NTc3IHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyA3NTc1IGV4dGVuZHFpc2kyCi0JY29tYiw8PixuICVyMjAsJXIxOSxMJDA4MTkgOyMgNzU3OSBibGV1KzEKLQlsZGIgMSglcjIxKSwlcjE5IDsjIDc1ODMgbW92cWkrMS81Ci0JbGRpIDEyMywlcjIwIDsjIDc1ODYgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDc1ODQgZXh0ZW5kcWlzaTIKLQljb21iLDw+LG4gJXIyMCwlcjE5LEwkMDgxOSA7IyA3NTg4IGJsZXUrMQotTCQwODIwCi0JbGR3IDAoJXI1KSwlcjQgOyMgODIyMCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgyMjMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODIyMSBzdWJzaTMvMQotCWxkbyAyKCVyMTkpLCVyMTkgOyMgODIyMiBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDA4MjkgOyMgODIyNCBibGV1KzEKLQljb3B5ICVyNiwlcjggOyMgNzU5NiByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTUxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDgzMAotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNzYyNCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA3NjM0IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDgzNSA7IyA3NjQyIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA3NjM2IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA3NjQ1IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDgzNQotCWxkdyAwKCVyNSksJXIyNiA7IyA3NjUyIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDc2NTYgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNzY1NCByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDc2NjQgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA3NjYwIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwODI4IDsjIDc2NzQgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3Njc2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDc2NzkgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA3NjgwIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwODM4IDsjIDc2ODUgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA3NjgzIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNzY4NiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNzY4OSBhZGRzaTMvMQotTCQwODM4Ci0JY29taWIsPSAwLCVyOCxMJDA4MzkgOyMgNzY5MiBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDc2OTMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNzY5NiBhZGRzaTMvMQotTCQwODM5Ci0JY29taWIsPSAwLCVyOSxMJDA4MjggOyMgNzY5OSBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDc3MDAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNzcwMyBhZGRzaTMvMQotTCQwODI4Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNzYwNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDc2MDggcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzYwNSBzdWJzaTMvMQotCWxkbyAyKCVyMTkpLCVyMTkgOyMgNzYwNiBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDgzMAotCW5vcCA7IyA3NjEwIGJsZXUrMQotTCQwODI5Ci0JbGRpIDEsJXIxOSA7IyA3NzI1IG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNzcyNiBtb3ZxaSsxLzYKLQlzdGJzLG1hICVyMCwxKCVyNikgOyMgNzcyOSBtb3ZxaSsxLzYKLQlsZG8gLTEoJXI2KSwlcjkgOyMgNzc0MSBhZGRzaTMvMgotTCQwODE5Ci0JbGR3IDAoJXI1KSwlcjQgOyMgODIyOCByZWxvYWRfb3V0c2krMi81Ci1MJDExNzcKLQlsZHcgNCglcjUpLCVyMjAgOyMgODIzMSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MjI5IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MjMwIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwODQ4IDsjIDgyMzIgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTQ5IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDg0OQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNzc3MSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA3NzgxIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDg1NCA7IyA3Nzg5IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA3NzgzIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA3NzkyIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDg1NAotCWxkdyAwKCVyNSksJXIyNiA7IyA3Nzk5IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDc4MDMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNzgwMSByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDc4MTEgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA3ODA3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwODQ3IDsjIDc4MjEgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3ODIzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDc4MjYgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA3ODI3IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwODU3IDsjIDc4MzIgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA3ODMwIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNzgzMyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNzgzNiBhZGRzaTMvMQotTCQwODU3Ci0JY29taWIsPSAwLCVyOCxMJDA4NTggOyMgNzgzOSBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDc4NDAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNzg0MyBhZGRzaTMvMQotTCQwODU4Ci0JY29taWIsPSAwLCVyOSxMJDA4NDcgOyMgNzg0NiBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDc4NDcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNzg1MCBhZGRzaTMvMQotTCQwODQ3Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNzc1MSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDc3NTUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzc1MiBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNzc1MyBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDg0OQotCW5vcCA7IyA3NzU3IGJsZXUrMQotTCQwODQ4Ci0Jc3RicyxtYSAlcjcsMSglcjYpIDsjIDc4NzIgbW92cWkrMS82Ci0JbGRiIDAoJXI5KSwlcjE5IDsjIDc4ODUgbW92cWkrMS81Ci0JbGRvIDEoJXIxOSksJXIxOSA7IyA3ODg4IGFkZHNpMy8yCi0Jc3RiICVyMTksMCglcjkpIDsjIDc4OTAgbW92cWkrMS82Ci1MJDAwNDMKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDIzMjggcmVsb2FkX291dHNpKzIvNQotTCQxMTYxCi0JY29tY2xyLD0gJXIxNiwlcjE5LCVyMCA7IyAyNTggYmxldSsxCi0JYmwgTCQxMTc4LCVyMAotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjMzNCByZWxvYWRfb3V0c2krMi81Ci1MJDAwNDQKLQljb21pYiw9IDAsJXIxMCxMJDA4NjUgOyMgNzkxMyBibGV1KzEKLQlsZGkgMTMsJXIyNiA7IyA3OTE4IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTAsJXIyNSA7IyA3OTIwIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI2LCVyMjUsJXIyNCA7IyA3OTE1IHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzdG9yZV9vcDEsJXIyIDsjIDc5MjQgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZG8gLTMoJXIyNCksJXIyNCA7IyA3OTIyIGFkZHNpMy8yCi1MJDA4NjUKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDc5MjggcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+LG4gMCwlcjE5LEwkMDg2NiA7IyA3OTMwIGJsZXUrMQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgNzk0NiBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgNzk0NCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDAoJXI1KSwlcjE5IDsjIDc5NDkgcmVsb2FkX291dHNpKzIvNQotCWxkaSAwLCVyMjggOyMgNzk1NSByZWxvYWRfb3V0c2krMi8yCi0Jc3ViICVyNiwlcjE5LCVyMTkgOyMgNzk1MCBzdWJzaTMvMQotCWJsIEwkMDg2NywlcjAgOyMgNzk1NyBqdW1wCi0Jc3R3ICVyMTksOCglcjUpIDsjIDc5NTIgcmVsb2FkX291dHNpKzIvNgotTCQwODk1Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyAyMjY5IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAyMjY3IHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDIyNzMganVtcAotCWxkaSAxMSwlcjI4IDsjIDIyNzEgcmVsb2FkX291dHNpKzIvMgotTCQwOTAwCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyAzMTYxIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAzMTU5IHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDMxNjUganVtcAotCWxkaSA0LCVyMjggOyMgMzE2MyByZWxvYWRfb3V0c2krMi8yCi1MJDA5MDIKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDMyMTggY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDMyMTYgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgMzIyMiBqdW1wCi0JbGRpIDcsJXIyOCA7IyAzMjIwIHJlbG9hZF9vdXRzaSsyLzIKLUwkMDkwMwotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgMzgwMyBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMzgwMSByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyAzODA3IGp1bXAKLQlsZGkgNSwlcjI4IDsjIDM4MDUgcmVsb2FkX291dHNpKzIvMgotTCQwOTE1Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA1NDYxIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA1NDU5IHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDU0NjUganVtcAotCWxkaSA5LCVyMjggOyMgNTQ2MyByZWxvYWRfb3V0c2krMi8yCi1MJDA5MTcKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDU1NTcgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDU1NTUgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgNTU2MSBqdW1wCi0JbGRpIDEzLCVyMjggOyMgNTU1OSByZWxvYWRfb3V0c2krMi8yCi1MJDA5MjIKLQlibCBMJDA4NjcsJXIwIDsjIDU5ODMganVtcAotCWxkaSAxNCwlcjI4IDsjIDU5ODEgcmVsb2FkX291dHNpKzIvMgotTCQwOTM5Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA3MjM1IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA3MjMzIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDcyMzkganVtcAotCWxkaSA2LCVyMjggOyMgNzIzNyByZWxvYWRfb3V0c2krMi8yCi1MJDA5NDQKLQlibCBMJDA4NjcsJXIwIDsjIDc3NzUganVtcAotCWxkaSAxNSwlcjI4IDsjIDc3NzMgcmVsb2FkX291dHNpKzIvMgotTCQwODY2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA3OTM1IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA3OTMzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZGkgOCwlcjI4IDsjIDc5MzcgcmVsb2FkX291dHNpKzIvMgotTCQwODY3Ci0JbGR3IC0zNDAoJXIzMCksJXIyIDsjIDkwMjYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTY4KCVyMzApLCVyMTggOyMgOTAyOCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNjQoJXIzMCksJXIxNyA7IyA5MDMwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE2MCglcjMwKSwlcjE2IDsjIDkwMzIgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTU2KCVyMzApLCVyMTUgOyMgOTAzNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNTIoJXIzMCksJXIxNCA7IyA5MDM2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE0OCglcjMwKSwlcjEzIDsjIDkwMzggcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTQ0KCVyMzApLCVyMTIgOyMgOTA0MCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNDAoJXIzMCksJXIxMSA7IyA5MDQyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTEzNiglcjMwKSwlcjEwIDsjIDkwNDQgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTMyKCVyMzApLCVyOSA7IyA5MDQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTEyOCglcjMwKSwlcjggOyMgOTA0OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMjQoJXIzMCksJXI3IDsjIDkwNTAgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTIwKCVyMzApLCVyNiA7IyA5MDUyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTExNiglcjMwKSwlcjUgOyMgOTA1NCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMTIoJXIzMCksJXI0IDsjIDkwNTYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTA4KCVyMzApLCVyMyA7IyA5MDU4IHJlbG9hZF9vdXRzaSsyLzUKLQlidiAlcjAoJXIyKSA7IyA5MDYxIHJldHVybl9pbnRlcm5hbAotCWxkbyAtMzIwKCVyMzApLCVyMzAgOyMgOTA2MCBhZGRzaTMvMgotCS5FWElUCi0JLlBST0NFTkQKLQkuZGF0YQotCi0JLmFsaWduIDEKLXJlX3N5bnRheF90YWJsZQotCS5ibG9jayAyNTYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvY29tbW9uLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2NvbW1vbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDdmZDA1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvY29tbW9uLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkuY29kZQotdGV4dF9zeW1ib2w6CQotCS5sb25nCTEKLQkubG9uZwlleHRlcm5hbF9zeW1ib2wKLQkuZGF0YQotZGF0YV9zeW1ib2w6Ci0JLmxvbmcJMgotY29tbW9uX3N5bWJvbAkuY29tbQk0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2ZyYWdidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZnJhZ2J1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmY5YTg2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZnJhZ2J1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0JLmNvZGUKLQlub3AJCQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2dsb2JhbGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGYwNWY2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0KLQkuc3BhY2UgJFBSSVZBVEUkCi0JLnN1YnNwYSAkR0xPQkFMJAotCS5leHBvcnQgJGdsb2JhbCQKLSRnbG9iYWwkCi0JLnNwYWNlICRURVhUJAotCS5zdWJzcGEgJENPREUkCi0KLQkucHJvYwotCS5jYWxsaW5mbwotaXZhYWRkcgotCW5vcAotCW5vcAotCWFkZGlsIEwlaXZhYWRkci0kZ2xvYmFsJCwlZHAKLQlsZG8gICBSJWl2YWFkZHItJGdsb2JhbCQoJXIxKSwlcjE5Ci0JLnByb2NlbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvaW1wb3J0YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2ltcG9ydGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTdlMDRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvaW1wb3J0YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLkVYUE9SVCBmb28sREFUQQotCS5kYXRhCi0KLQkuYWxpZ24gNAotZm9vOgotCS53b3JkIDAKLQkuSU1QT1JUIF9fbWFpbixDT0RFCi0KLQkuY29kZQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWluLENPREUKLQkuRVhQT1JUIG1haW4sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLW1haW46Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9NjQsQ0FMTFMsU0FWRV9SUCxTQVZFX1NQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQkuaW1wb3J0IGZvbwotCXN0dyAlcjIsLTIwKDAsJXIzMCkKLQljb3B5ICVyMywlcjEKLQljb3B5ICVyMzAsJXIzCi0Jc3R3bSAlcjEsNjQoJXIzMCkKLQkuQ0FMTCAKLQlibCBfX21haW4sJXIyCi0Jbm9wCi1MJDAwMDE6Ci0JbGR3IC0yMCglcjMpLCVyMgotCWxkbyA2NCglcjMpLCVyMzAKLQlsZHdtIC02NCglcjMwKSwlcjMKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sYWJlbGRpZmZzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2xhYmVsZGlmZnMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0N2VjMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2xhYmVsZGlmZnMucworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTsgU2hvdWxkIGNoZWNrIHRvIG1ha2Ugc3VyZSBzb21ldGhpbmcgdXNlZnVsIGdldHMgcHV0IG9uIHRob3NlIC53b3JkCi07IHN0YXRlbWVudHMuCi0JLmNvZGUKLQotCS5hbGlnbgk4Ci0JLmV4cG9ydAlpY29kZSxkYXRhCi1pY29kZToKLQkucHJvYwotCS5jYWxsaW5mbwlmcmFtZT0wLG5vX2NhbGxzCi0JLmVudHJ5Ci0JYnYsbgklcjAoJXIyKQotCS5leGl0Ci0Jbm9wCi0JLnByb2NlbmQKLQotCTsKLQk7IEZJUlNULCBhcmd2IGFycmF5IG9mIHBvaW50ZXJzIHRvIGFyZ3MsIDFzdCBpcyBzYW1lIGFzIHBhdGguCi0JOwotCS5hbGlnbgk4Ci1pY19hcmd2OgotCS53b3JkCWljX2FyZ3YxLWljb2RlCTsgc2Vjb25kLCBwb2ludGVyIHRvIDFzdCBhcmd1bWVudAotCS53b3JkCWljX3BhdGgtaWNvZGUJCTsgZmlyc3QsICBwb2ludGVyIHRvIGluaXQgcGF0aAotCS53b3JkCTAJCQk7IGZvdXJ0aCwgTlVMTCBhcmd2IHRlcm1pbmF0b3IgKHBhZCkKLQkud29yZAkwCQkJOyB0aGlyZCwgIE5VTEwgYXJndiB0ZXJtaW5hdG9yCi0KLWljX3BhdGg6Ci0JLmJsb2Nregk0MDk2CQkJOyBtdXN0IGJlIG11bHRpcGxlIG9mIDQgYnl0ZXMKLQkud29yZAkwCQkJOyBpbiBjYXNlIGZ1bGwgc3RyaW5nIGlzIHVzZWQKLQkud29yZAkwCQkJOyB0aGlzIHdpbGwgYmUgdGhlIHN0cmluZyB0ZXJtaW5hdG9yCi0KLWljX2FyZ3YxOgotCS5ibG9ja3oJNDA5NgkJCTsgbXVzdCBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzCi0JLndvcmQJMAkJCTsgaW4gY2FzZSBmdWxsIHN0cmluZyBpcyB1c2VkCi0JLndvcmQJMAkJCTsgdGhpcyB3aWxsIGJlIHRoZSBzdHJpbmcgdGVybWluYXRvcgotCi0JLmV4cG9ydAlzemljb2RlLGRhdGEKLXN6aWNvZGU6Ci0JLndvcmQJc3ppY29kZS1pY29kZQotCS53b3JkCTAJCQk7IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZmlsbGVyIGF0IGVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sb2NhbGxhYmVsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2xvY2FsbGFiZWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzNTdiOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2xvY2FsbGFiZWwucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS5jb2RlCi0KLQkuYWxpZ24gNAotCi1MYWJlbDoKLUwkMDEyMzQ6Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvc3NfYWxpZ24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvc3NfYWxpZ24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5OGViMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3NzX2FsaWduLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj02NCxBQ0NFU1M9MzEKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkCi1zeW0xOgkuV09SRCAyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODdmZDkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0jIGFuZCBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19zdWJzcGFjZV9hbGlnbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNzX2FsaWduLnM6IFRlc3Qgc3Vic3BhY2UgYWxpZ25tZW50IChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIHsgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHx8IFtpc3RhcmdldCBocHBhKnctKi0qXSB9IHRoZW4gewotICAgICAgcmV0dXJuIAotICAgIH0KLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInNzX2FsaWduLnMiICIiICJzdWJzcGFjZSBhbGlnbm1lbnQgKHBhcnQgMSkiXSB0aGVuIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItaCIKLQotICAgICMgQ2hlY2sgdGhlIGhlYWRlcnMgZm9yIHRoZSBjb3JyZWN0IGFsaWdubWVudCB2YWx1ZSBmb3IgdGhlCi0gICAgIyB0aGUgJERBVEEkIHN1YnNwYWNlIChzb20pLgotCXdoaWxlIDEgewotCSAgICBleHBlY3QgIHsKLQkJLXJlICJEQVRBXFteXG5cXSogMi4uNlxbXlxuXF0qXG4iCXsgc2V0IHggMSB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCXRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19sb2NhbF9sYWJlbF90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvY2FsbGFiZWwuczogRWxpbWluYXRpb24gb2YgbG9jYWwgbGFiZWxzIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImxvY2FsbGFiZWwucyIgIiIgIkVsaW1pbmF0aW9uIG9mIGxvY2FsIGxhYmVscyAocGFydDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi10IgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjAwMDAwMDAwXFteXG5cXSpMYWJlbFxbXlxuXF0qXG4iCQl7IHNldCB4IDEgfQotCQktcmUgIl4wMDAwMDAwMFxbXlxuXF0qTFwkMDEyMzRcW15cblxdKlxuIgl7IHNldCB4IDAgfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2ZyY2hhaW5fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmcmFnYnVnLnM6IFRlc3QgYnVnIGluIGZyYWcgY2hhaW5pbmcgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiZnJhZ2J1Zy5zIiAiIiAiVGVzdCBidWcgaW4gZnJhZyBjaGFpbmluZyAocGFydDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi0tcHJlZml4LWFkZHJlc3NlcyAtZCIKLQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIl4weDAwMDAwMDAwXFteXG5cXSpub3BcW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkJLXJlICJeMHgwMDAwMDAwNFxbXlxuXF0qbm9wXFteXG5cXSpcbiIJCXsgc2V0IHggMCB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fYWxpZ24zX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWxpZ24zLnM6IFRlc3QgZm9yIGFsaWdubWVudCBidWcgd2hlbiBzd2l0Y2hpbmcgc3Vic3BhY2VzIChwYXJ0MikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgeyBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gfHwgW2lzdGFyZ2V0IGhwcGEqdy0qLSpdIH0gdGhlbiB7Ci0gICAgICByZXR1cm4gCi0gICAgfQotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiYWxpZ24zLnMiICIiICJUZXN0IGZvciBhbGlnbm1lbnQgYnVnIHdoZW4gc3dpdGNoaW5nIHN1YnNwYWNlcyAocGFydDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi0tcHJlZml4LWFkZHJlc3NlcyAtZCIKLQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIlxbXlxuXF0qIDxtYWluPiBub3BcW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKiA8LiplbmRfbWFpbj4gbm9wXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9Ci0JCS1yZSAiXFteXG5cXSogPG1haW4rLio+IG5vcFxbXlxuXF0qXG4iCQl7IHNldCB4IDAgfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2FsaWduNF90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFsaWduNC5zOiBNb3JlIHN1YnNwYWNlIGFsaWdubWVudCB0ZXN0cyAocGFydDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIHsgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHx8IFtpc3RhcmdldCBocHBhKnctKi0qXSB9IHRoZW4gewotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImFsaWduNC5zIiAiIiAiTW9yZSBzdWJzcGFjZSBhbGlnbm1lbnQgdGVzdHMgKHBhcnQxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItaCIKLQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIlxbXlxuXF0qTUlMTElDT0RFXFteXG5cXSoyLi42XFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIlxbXlxuXF0qWUFCQkFcW15cblxdKjIuLjNcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9faW1wb3J0X3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiaW1wb3J0YnVnLnM6IFRlc3QgZm9yIGJ1ZyBpbiAuaW1wb3J0IGRpcmVjdGl2ZSAocGFydDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImltcG9ydGJ1Zy5zIiAiIiAiVGVzdCBmb3IgYnVnIGluIC5pbXBvcnQgZGlyZWN0aXZlIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1zeW1zIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXFteXG5cXSouREFUQS4uZm9vXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9Ci0JCS1yZSAiXFteXG5cXSouZGF0YS4qZm9vXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fY29tbW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29tbW9uLnM6IFRlc3QgZm9yIGJ1ZyBpbiAuY29tbSBoYW5kbGluZyAocGFydDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImNvbW1vbi5zIiAiIiAiVGVzdCBmb3IgYnVnIGluIC5jb21tIGhhbmRsaW5nIChwYXJ0MSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLS1zeW1zIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXFteXG5cXSouQ09NLipjb21tb25fc3ltYm9sXFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotaWYgW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7Ci0gICAgIyBNYWtlIHN1cmUgc3Vic3BhY2UgYWxpZ25tZW50IHJlcXVlc3RzIGZyb20gdGhlIHN1YnNwYWNlIGRpcmVjdGl2ZXMKLSAgICAjIGFyZSBob25vcmVkCi0gICAgZG9fc3Vic3BhY2VfYWxpZ25fdGVzdAotCi0gICAgIyBNYWtlIHN1cmUgdGhlIGNvcnJlY3QgbGFiZWxzIGVuZCB1cCBpbiB0aGUgc3ltYm9sIHRhYmxlCi0gICAgZG9fbG9jYWxfbGFiZWxfdGVzdAotCi0gICAgIyBHQVMtMS4zNiBjaG9rZWQgb24gdGhpcyBmaWxlLgotICAgIGdhc190ZXN0ICJsYWJlbGRpZmZzLnMiICIiICIiICJEaWZmZXJlbmNlIG9mIGxhYmVscyIKLQotICAgICMgVGVzdCBhIHJlY2VudCBidWcgd2hlcmUgZnJhZyBjaGFpbmluZyB3YXNuJ3Qgd29ya2luZyBjb3JyZWN0bHkuCi0gICAgZG9fZnJjaGFpbl90ZXN0Ci0KLSAgICAjIFRlc3QgYnVnIHdoZXJlIHN3aXRjaGluZyBiZXR3ZWVuIHN1YnNwYWNlcyBjcmVhdGVzIGJvZ3VzIGFsaWdubWVudHMKLSAgICBkb19hbGlnbjNfdGVzdAotCi0gICAgIyBUZXN0IGJ1ZyB3aGVyZSBzd2l0Y2hpbmcgYmV0d2VlbiBzdWJzcGFjZXMgY3JlYXRlcyBib2d1cyBhbGlnbm1lbnRzCi0gICAgZG9fYWxpZ240X3Rlc3QKLQotICAgICMgVGVzdCBhIHByb2JsZW0gd2hlcmUgJGdsb2JhbCQgaXMgZGVmaW5lZCwgdGhlbiB1c2VkIHdpdGhpbiB0aGUKLSAgICAjIHNhbWUgc291cmNlIGZpbGUuCi0gICAgc2V0dXBfeGZhaWwgaHBwYSotKi0qCi0gICAgZ2FzX3Rlc3QgImdsb2JhbGJ1Zy5zIiAiIiAiIiAiVXNlIFwkZ2xvYmFsXCQgaW4gZmlsZSB3aGljaCBkZWZpbmVzIGl0IgotCi0gICAgIyBUZXN0IHRoYXQgaW1wb3J0aW5nIGEgZGVmaW5lZCBzeW1ib2wgZG9lc24ndCBzY3JldyB1cCB0aGUgc3ltYm9sJ3MKLSAgICAjIHNwYWNlL3N1YnNwYWNlLgotICAgIGRvX2ltcG9ydF90ZXN0Ci0KLSAgICAjIFRlc3QgZm9yIGEgYnVnbGV0IGluIHRoZSBoYW5kbGluZyBvZiBjb21tb24gc3ltYm9scwotICAgIGRvX2NvbW1vbl90ZXN0Ci0KLSAgICAjIFRlc3QgZm9yIGFuIG9mZi1ieS0yIGJ1ZyBpbiByYW5nZSBjaGVjayBmb3IgY29uZGl0aW9uYWwgYnJhbmNoZXMKLSAgICBnYXNfdGVzdF9lcnJvciAiYnJsZW5idWcucyIgIiIgIkNoZWNrIGZvciBlcnJvcihzKSBpbiBicmFuY2ggbGVuZ3RoIgotCi19Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2FtZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmYxNjc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jb2JqZHVtcDogLWR3Ci0jbmFtZTogaTM4NiBhbWQKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8Zm9vPjoKLSAgIDA6CTBmIDBkIDAzIFsgCV0qcHJlZmV0Y2ggXCglZWJ4XCkKLSAgIDM6CTBmIDBkIDBjIDc1IDAwIDEwIDAwIDAwIFsgCV0qcHJlZmV0Y2h3IDB4MTAwMFwoLCVlc2ksMlwpCi0gICBiOgkwZiAwZSBbIAldKmZlbW1zICAKLSAgIGQ6CTBmIDBmIDAwIGJmIFsgCV0qcGF2Z3VzYiBcKCVlYXhcKSwlbW0wCi0gIDExOgkwZiAwZiA0OCAwMiAxZCBbIAldKnBmMmlkICAweDJcKCVlYXhcKSwlbW0xCi0gIDE2OgkwZiAwZiA5MCAwMCAwMSAwMCAwMCBhZSBbIAldKnBmYWNjICAweDEwMFwoJWVheFwpLCVtbTIKLSAgMWU6CTBmIDBmIDFlIDllIFsgCV0qcGZhZGQgIFwoJWVzaVwpLCVtbTMKLSAgMjI6CTBmIDBmIDY2IDAyIGIwIFsgCV0qcGZjbXBlcSAweDJcKCVlc2lcKSwlbW00Ci0gIDI3OgkwZiAwZiBhZSA5MCA5MCAwMCAwMCA5MCBbIAldKnBmY21wZ2UgMHg5MDkwXCglZXNpXCksJW1tNQotICAyZjoJMGYgMGYgNzQgNzUgMDAgYTAgWyAJXSpwZmNtcGd0IDB4MFwoJWVicCwlZXNpLDJcKSwlbW02Ci0gIDM1OgkwZiAwZiA3YyA3NSAwMiBhNCBbIAldKnBmbWF4ICAweDJcKCVlYnAsJWVzaSwyXCksJW1tNwotICAzYjoJMGYgMGYgODQgNzUgOTAgOTAgOTAgOTAgOTQgWyAJXSpwZm1pbiAgMHg5MDkwOTA5MFwoJWVicCwlZXNpLDJcKSwlbW0wCi0gIDQ0OgkwZiAwZiAwZCAwNCAwMCAwMCAwMCBiNCBbIAldKnBmbXVsICAweDQsJW1tMQotICA0YzoJMmUgMGYgMGYgNTQgYzMgMDcgOTYgWyAJXSpwZnJjcCAgJWNzOjB4N1woJWVieCwlZWF4LDhcKSwlbW0yCi0gIDUzOgkwZiAwZiBkOCBhNiBbIAldKnBmcmNwaXQxICVtbTAsJW1tMwotICA1NzoJMGYgMGYgZTEgYjYgWyAJXSpwZnJjcGl0MiAlbW0xLCVtbTQKLSAgNWI6CTBmIDBmIGVhIGE3IFsgCV0qcGZyc3FpdDEgJW1tMiwlbW01Ci0gIDVmOgkwZiAwZiBmMyA5NyBbIAldKnBmcnNxcnQgJW1tMywlbW02Ci0gIDYzOgkwZiAwZiBmYyA5YSBbIAldKnBmc3ViICAlbW00LCVtbTcKLSAgNjc6CTBmIDBmIGM1IGFhIFsgCV0qcGZzdWJyICVtbTUsJW1tMAotICA2YjoJMGYgMGYgY2UgMGQgWyAJXSpwaTJmZCAgJW1tNiwlbW0xCi0gIDZmOgkwZiAwZiBkNyBiNyBbIAldKnBmbXVsaHJ3ICVtbTcsJW1tMgotICA3MzoJMmUgMGYgWyAJXSpcKGJhZFwpICAKLSAgNzU6CTBmIDU0IGMzIFsgCV0qYW5kcHMgICV4bW0zLCV4bW0wCi0gIDc4OgkwNyBbIAldKnBvcCAgICAlZXMKLSAgNzk6CWMzIFsgCV0qcmV0ICAgIAotICA3YToJOTAgWyAJXSpub3AgICAgCi0gIDdiOgk5MCBbIAldKm5vcCAgICAKLSAgN2M6CTkwIFsgCV0qbm9wICAgIAotICA3ZDoJOTAgWyAJXSpub3AgICAgCi0gIDdlOgk5MCBbIAldKm5vcCAgICAKLSAgN2Y6CTkwIFsgCV0qbm9wICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MDljNjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQucworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSNBTUQgM0ROb3chIGluc3RydWN0aW9ucwotCi0udGV4dAotZm9vOgotIHByZWZldGNoCSglZWJ4KQotIHByZWZldGNodwkweDEwMDAoLCVlc2ksMikKLSBmZW1tcwotIHBhdmd1c2IJKCVlYXgpLCVtbTAKLSBwZjJpZAkJMiglZWF4KSwlbW0xCi0gcGZhY2MJCTB4MTAwKCVlYXgpLCVtbTIKLSBwZmFkZAkJKCVlc2kpLCVtbTMKLSBwZmNtcGVxCTIoJWVzaSksJW1tNAotIHBmY21wZ2UJMHg5MDkwKCVlc2kpLCVtbTUKLSBwZmNtcGd0CSglZWJwLCVlc2ksMiksJW1tNgotIHBmbWF4CQkyKCVlYnAsJWVzaSwyKSwlbW03Ci0gcGZtaW4JCTB4OTA5MDkwOTAoJWVicCwlZXNpLDIpLCVtbTAKLSBwZm11bAkJNCwlbW0xCi0gcGZyY3AJCSVjczo3KCVlYngsJWVheCw4KSwlbW0yCi0gcGZyY3BpdDEJJW1tMCwlbW0zCi0gcGZyY3BpdDIJJW1tMSwlbW00Ci0gcGZyc3FpdDEJJW1tMiwlbW01Ci0gcGZyc3FydAklbW0zLCVtbTYKLSBwZnN1YgkJJW1tNCwlbW03Ci0gcGZzdWJyCQklbW01LCVtbTAKLSBwaTJmZAkJJW1tNiwlbW0xCi0gcG11bGhydwklbW03LCVtbTIKLQotIyBUaGlzIGlzIGEgM0ROb3chIGluc3RydWN0aW9uLCB3aXRoIGEgcHJlZml4LCB0aGF0IGlzbid0IHF1aXRlIHJpZ2h0Ci0jIEV2ZXJ5dGhpbmcncyBnb29kIGJhciB0aGUgb3Bjb2RlIHN1ZmZpeAotLmJ5dGUgMHgyZSwgMHgwZiwgMHgwZiwgMHg1NCwgMHhjMywgMHgwNywgMHhjMwotCi0jIFBhZCBvdXQgdG8gYSBnb29kIGFsaWdubWVudAotIC5ieXRlIDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNTZmNTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9mbG9hdC5sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjM6IFdhcm5pbmc6LipmYWRkcC4qCi0uKjoxNDogV2FybmluZzouKmZzdWJwLioKLS4qOjI1OiBXYXJuaW5nOi4qZnN1YnJwLioKLS4qOjM2OiBXYXJuaW5nOi4qZm11bHAuKgotLio6NDc6IFdhcm5pbmc6LipmZGl2cC4qCi0uKjo1ODogV2FybmluZzouKmZkaXZycC4qCi0gICAxIFsgCV0qLnBzaXplIDAKLSAgIDIgWyAJXSoudGV4dAotICAgMyAwMDAwIERFQzEgWyAJXSpmYWRkCi0uKldhcm5pbmc6LipmYWRkcC4qCi0gICA0IDAwMDIgRDhDMyBbIAldKmZhZGQJJXN0XCgzXCkKLSAgIDUgMDAwNCBEOEMzIFsgCV0qZmFkZAklc3RcKDNcKSwlc3QKLSAgIDYgMDAwNiBEQ0MzIFsgCV0qZmFkZAklc3QsJXN0XCgzXCkKLSAgIDcgMDAwOCBEODAzIFsgCV0qZmFkZHMJXCglZWJ4XCkKLSAgIDggMDAwYSBEQzAzIFsgCV0qZmFkZGwJXCglZWJ4XCkKLSAgIDkgMDAwYyBERTAzIFsgCV0qZmlhZGRzCVwoJWVieFwpCi0gIDEwIDAwMGUgREEwMyBbIAldKmZpYWRkbAlcKCVlYnhcKQotICAxMSAwMDEwIERFQzEgWyAJXSpmYWRkcAotICAxMiAwMDEyIERFQzMgWyAJXSpmYWRkcAklc3RcKDNcKQotICAxMyAwMDE0IERFQzMgWyAJXSpmYWRkcAklc3QsJXN0XCgzXCkKLSAgMTQgMDAxNiBERUUxIFsgCV0qZnN1YgotLipXYXJuaW5nOi4qZnN1YnAuKgotICAxNSAwMDE4IEQ4RTMgWyAJXSpmc3ViCSVzdFwoM1wpCi0gIDE2IDAwMWEgRDhFMyBbIAldKmZzdWIJJXN0XCgzXCksJXN0Ci0gIDE3IDAwMWMgRENFMyBbIAldKmZzdWIJJXN0LCVzdFwoM1wpCi0gIDE4IDAwMWUgRDgyMyBbIAldKmZzdWJzCVwoJWVieFwpCi0gIDE5IDAwMjAgREMyMyBbIAldKmZzdWJsCVwoJWVieFwpCi0gIDIwIDAwMjIgREUyMyBbIAldKmZpc3VicwlcKCVlYnhcKQotICAyMSAwMDI0IERBMjMgWyAJXSpmaXN1YmwJXCglZWJ4XCkKLSAgMjIgMDAyNiBERUUxIFsgCV0qZnN1YnAKLSAgMjMgMDAyOCBERUUzIFsgCV0qZnN1YnAJJXN0XCgzXCkKLSAgMjQgMDAyYSBERUUzIFsgCV0qZnN1YnAJJXN0LCVzdFwoM1wpCi0gIDI1IDAwMmMgREVFOSBbIAldKmZzdWJyCi0uKldhcm5pbmc6Lipmc3VicnAuKgotICAyNiAwMDJlIEQ4RUIgWyAJXSpmc3Vicgklc3RcKDNcKQotICAyNyAwMDMwIEQ4RUIgWyAJXSpmc3Vicgklc3RcKDNcKSwlc3QKLSAgMjggMDAzMiBEQ0VCIFsgCV0qZnN1YnIJJXN0LCVzdFwoM1wpCi0gIDI5IDAwMzQgRDgyQiBbIAldKmZzdWJycwlcKCVlYnhcKQotICAzMCAwMDM2IERDMkIgWyAJXSpmc3VicmwJXCglZWJ4XCkKLSAgMzEgMDAzOCBERTJCIFsgCV0qZmlzdWJycwlcKCVlYnhcKQotICAzMiAwMDNhIERBMkIgWyAJXSpmaXN1YnJsCVwoJWVieFwpCi0gIDMzIDAwM2MgREVFOSBbIAldKmZzdWJycAotICAzNCAwMDNlIERFRUIgWyAJXSpmc3VicnAJJXN0XCgzXCkKLSAgMzUgMDA0MCBERUVCIFsgCV0qZnN1YnJwCSVzdCwlc3RcKDNcKQotICAzNiAwMDQyIERFQzkgWyAJXSpmbXVsCi0uKldhcm5pbmc6LipmbXVscC4qCi0gIDM3IDAwNDQgRDhDQiBbIAldKmZtdWwJJXN0XCgzXCkKLSAgMzggMDA0NiBEOENCIFsgCV0qZm11bAklc3RcKDNcKSwlc3QKLSAgMzkgMDA0OCBEQ0NCIFsgCV0qZm11bAklc3QsJXN0XCgzXCkKLSAgNDAgMDA0YSBEODBCIFsgCV0qZm11bHMJXCglZWJ4XCkKLSAgNDEgMDA0YyBEQzBCIFsgCV0qZm11bGwJXCglZWJ4XCkKLSAgNDIgMDA0ZSBERTBCIFsgCV0qZmltdWxzCVwoJWVieFwpCi0gIDQzIDAwNTAgREEwQiBbIAldKmZpbXVsbAlcKCVlYnhcKQotICA0NCAwMDUyIERFQzkgWyAJXSpmbXVscAotICA0NSAwMDU0IERFQ0IgWyAJXSpmbXVscAklc3RcKDNcKQotICA0NiAwMDU2IERFQ0IgWyAJXSpmbXVscAklc3QsJXN0XCgzXCkKLSAgNDcgMDA1OCBERUYxIFsgCV0qZmRpdgotLipXYXJuaW5nOi4qZmRpdnAuKgotICA0OCAwMDVhIEQ4RjMgWyAJXSpmZGl2CSVzdFwoM1wpCi0gIDQ5IDAwNWMgRDhGMyBbIAldKmZkaXYJJXN0XCgzXCksJXN0Ci0gIDUwIDAwNWUgRENGMyBbIAldKmZkaXYJJXN0LCVzdFwoM1wpCi0gIDUxIDAwNjAgRDgzMyBbIAldKmZkaXZzCVwoJWVieFwpCi0gIDUyIDAwNjIgREMzMyBbIAldKmZkaXZsCVwoJWVieFwpCi0gIDUzIDAwNjQgREUzMyBbIAldKmZpZGl2cwlcKCVlYnhcKQotICA1NCAwMDY2IERBMzMgWyAJXSpmaWRpdmwJXCglZWJ4XCkKLSAgNTUgMDA2OCBERUYxIFsgCV0qZmRpdnAKLSAgNTYgMDA2YSBERUYzIFsgCV0qZmRpdnAJJXN0XCgzXCkKLSAgNTcgMDA2YyBERUYzIFsgCV0qZmRpdnAJJXN0LCVzdFwoM1wpCi0gIDU4IDAwNmUgREVGOSBbIAldKmZkaXZyCi0uKldhcm5pbmc6LipmZGl2cnAuKgotICA1OSAwMDcwIEQ4RkIgWyAJXSpmZGl2cgklc3RcKDNcKQotICA2MCAwMDcyIEQ4RkIgWyAJXSpmZGl2cgklc3RcKDNcKSwlc3QKLSAgNjEgMDA3NCBEQ0ZCIFsgCV0qZmRpdnIJJXN0LCVzdFwoM1wpCi0gIDYyIDAwNzYgRDgzQiBbIAldKmZkaXZycwlcKCVlYnhcKQotICA2MyAwMDc4IERDM0IgWyAJXSpmZGl2cmwJXCglZWJ4XCkKLSAgNjQgMDA3YSBERTNCIFsgCV0qZmlkaXZycwlcKCVlYnhcKQotICA2NSAwMDdjIERBM0IgWyAJXSpmaWRpdnJsCVwoJWVieFwpCi0gIDY2IDAwN2UgREVGOSBbIAldKmZkaXZycAotICA2NyAwMDgwIERFRkIgWyAJXSpmZGl2cnAJJXN0XCgzXCkKLSAgNjggMDA4MiBERUZCIFsgCV0qZmRpdnJwCSVzdCwlc3RcKDNcKQotICA2OSBbIAldKgotICA3MCAwMDg0IDAwMDAwMDAwIFsgCV0qLnAyYWxpZ24JNCwwCi0gIDcwICAgICAgMDAwMDAwMDAgCi0gIDcwICAgICAgMDAwMDAwMDAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZDMwYjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9mbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLnBzaXplIDAKLS50ZXh0Ci0JZmFkZAotCWZhZGQJJXN0KDMpCi0JZmFkZAklc3QoMyksJXN0Ci0JZmFkZAklc3QsJXN0KDMpCi0JZmFkZHMJKCVlYngpCi0JZmFkZGwJKCVlYngpCi0JZmlhZGRzCSglZWJ4KQotCWZpYWRkbAkoJWVieCkKLQlmYWRkcAotCWZhZGRwCSVzdCgzKQotCWZhZGRwCSVzdCwlc3QoMykKLQlmc3ViCi0JZnN1Ygklc3QoMykKLQlmc3ViCSVzdCgzKSwlc3QKLQlmc3ViCSVzdCwlc3QoMykKLQlmc3VicwkoJWVieCkKLQlmc3VibAkoJWVieCkKLQlmaXN1YnMJKCVlYngpCi0JZmlzdWJsCSglZWJ4KQotCWZzdWJwCi0JZnN1YnAJJXN0KDMpCi0JZnN1YnAJJXN0LCVzdCgzKQotCWZzdWJyCi0JZnN1YnIJJXN0KDMpCi0JZnN1YnIJJXN0KDMpLCVzdAotCWZzdWJyCSVzdCwlc3QoMykKLQlmc3VicnMJKCVlYngpCi0JZnN1YnJsCSglZWJ4KQotCWZpc3VicnMJKCVlYngpCi0JZmlzdWJybAkoJWVieCkKLQlmc3VicnAKLQlmc3VicnAJJXN0KDMpCi0JZnN1YnJwCSVzdCwlc3QoMykKLQlmbXVsCi0JZm11bAklc3QoMykKLQlmbXVsCSVzdCgzKSwlc3QKLQlmbXVsCSVzdCwlc3QoMykKLQlmbXVscwkoJWVieCkKLQlmbXVsbAkoJWVieCkKLQlmaW11bHMJKCVlYngpCi0JZmltdWxsCSglZWJ4KQotCWZtdWxwCi0JZm11bHAJJXN0KDMpCi0JZm11bHAJJXN0LCVzdCgzKQotCWZkaXYKLQlmZGl2CSVzdCgzKQotCWZkaXYJJXN0KDMpLCVzdAotCWZkaXYJJXN0LCVzdCgzKQotCWZkaXZzCSglZWJ4KQotCWZkaXZsCSglZWJ4KQotCWZpZGl2cwkoJWVieCkKLQlmaWRpdmwJKCVlYngpCi0JZmRpdnAKLQlmZGl2cAklc3QoMykKLQlmZGl2cAklc3QsJXN0KDMpCi0JZmRpdnIKLQlmZGl2cgklc3QoMykKLQlmZGl2cgklc3QoMyksJXN0Ci0JZmRpdnIJJXN0LCVzdCgzKQotCWZkaXZycwkoJWVieCkKLQlmZGl2cmwJKCVlYngpCi0JZmlkaXZycwkoJWVieCkKLQlmaWRpdnJsCSglZWJ4KQotCWZkaXZycAotCWZkaXZycAklc3QoMykKLQlmZGl2cnAJJXN0LCVzdCgzKQotCi0JLnAyYWxpZ24JNCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2dlbmVyYWwubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDdlNzY2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5sCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjoxMDogV2FybmluZzouKgotLio6MTI6IFdhcm5pbmc6LioKLS4qOjE5OiBXYXJuaW5nOi4qCi0uKjoyMjogV2FybmluZzouKgotLio6ODE6IFdhcm5pbmc6LioKLS4qOjgyOiBXYXJuaW5nOi4qCi0uKjo4MzogV2FybmluZzouKgotLio6ODQ6IFdhcm5pbmc6LioKLS4qOjg1OiBXYXJuaW5nOi4qCi0uKjo4NjogV2FybmluZzouKgotLio6ODc6IFdhcm5pbmc6LioKLS4qOjg4OiBXYXJuaW5nOi4qCi0uKjo4OTogV2FybmluZzouKgotLio6OTA6IFdhcm5pbmc6LioKLS4qOjkxOiBXYXJuaW5nOi4qCi0uKjo5MjogV2FybmluZzouKgotLio6OTM6IFdhcm5pbmc6LioKLS4qOjk0OiBXYXJuaW5nOi4qCi0uKjo5NTogV2FybmluZzouKgotLio6OTY6IFdhcm5pbmc6LioKLS4qOjk3OiBXYXJuaW5nOi4qCi0uKjo5ODogV2FybmluZzouKgotLio6OTk6IFdhcm5pbmc6LioKLS4qOjEwMDogV2FybmluZzouKgotLio6MTAxOiBXYXJuaW5nOi4qCi0uKjoxMzU6IFdhcm5pbmc6LioKLSAgIDEgICAgICAgICAgICAgICAgICAgICAgIAkucHNpemUgMAotICAgMiAgICAgICAgICAgICAgICAgICAgICAgCS50ZXh0Ci0gICAzICAgICAgICAgICAgICAgICAgICAgICAJIyB0ZXN0IHZhcmlvdXMgc2VnbWVudCByZWcgaW5zbnMKLSAgIDQgMDAwMCAxRSAgICAgICAgICAgICAgICAJCXB1c2gJJWRzCi0gICA1IDAwMDEgMUUgICAgICAgICAgICAgICAgCQlwdXNobAklZHMKLSAgIDYgMDAwMiAxRiAgICAgICAgICAgICAgICAJCXBvcAklZHMKLSAgIDcgMDAwMyAxRiAgICAgICAgICAgICAgICAJCXBvcGwJJWRzCi0gICA4IDAwMDQgOENEOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYXgKLSAgIDkgMDAwNiA4Q0Q4ICAgICAgICAgICAgICAJCW1vdmwJJWRzLCVlYXgKLSAgMTAgMDAwOCA4Q0Q4ICAgICAgICAgICAgICAJCW1vdmwJJWRzLCVheAotLipXYXJuaW5nOi4qCi0gIDExIDAwMGEgOEVEOCAgICAgICAgICAgICAgCQltb3YJJWVheCwlZHMKLSAgMTIgMDAwYyA4RUQ4ICAgICAgICAgICAgICAJCW1vdmwJJWF4LCVkcwotLipXYXJuaW5nOi4qCi0gIDEzIDAwMGUgOEVEOCAgICAgICAgICAgICAgCQltb3ZsCSVlYXgsJWRzCi0gIDE0ICAgICAgICAgICAgICAgICAgICAgICAJCi0gIDE1IDAwMTAgNjYxRSAgICAgICAgICAgICAgCQlwdXNodwklZHMKLSAgMTYgMDAxMiA2NjFGICAgICAgICAgICAgICAJCXBvcHcJJWRzCi0gIDE3IDAwMTQgNjY4Q0Q4ICAgICAgICAgICAgCQltb3YJJWRzLCVheAotICAxOCAwMDE3IDY2OENEOCAgICAgICAgICAgIAkJbW92dwklZHMsJWF4Ci0gIDE5IDAwMWEgNjY4Q0Q4ICAgICAgICAgICAgCQltb3Z3CSVkcywlZWF4Ci0uKldhcm5pbmc6LioKLSAgMjAgMDAxZCA4RUQ4ICAgICAgICAgICAgICAJCW1vdgklYXgsJWRzCi0gIDIxIDAwMWYgOEVEOCAgICAgICAgICAgICAgCQltb3Z3CSVheCwlZHMKLSAgMjIgMDAyMSA4RUQ4ICAgICAgICAgICAgICAJCW1vdncJJWVheCwlZHMKLS4qV2FybmluZzouKgotICAyMyAgICAgICAgICAgICAgICAgICAgICAgCQotICAyNCAgICAgICAgICAgICAgICAgICAgICAgCSMgdGVzdCB2YXJpb3VzIHB1c2hlcwotICAyNSAwMDIzIDZBMEEgICAgICAgICAgICAgIAkJcHVzaGwJXCQxMAotICAyNiAwMDI1IDY2NkEwQSAgICAgICAgICAgIAkJcHVzaHcJXCQxMAotICAyNyAwMDI4IDZBMEEgICAgICAgICAgICAgIAkJcHVzaAlcJDEwCi0gIDI4IDAwMmEgNjhFODAzMDAgMDAgICAgICAgCQlwdXNobAlcJDEwMDAKLSAgMjkgMDAyZiA2NjY4RTgwMyAgICAgICAgICAJCXB1c2h3CVwkMTAwMAotICAzMCAwMDMzIDY4RTgwMzAwIDAwICAgICAgIAkJcHVzaAlcJDEwMDAKLSAgMzEgMDAzOCBGRjM1NTcwMCAwMDAwICAgICAJCXB1c2hsCTFmCi0gIDMyIDAwM2UgNjZGRjM1NTcgMDAwMDAwICAgCQlwdXNodwkxZgotICAzMyAwMDQ1IEZGMzU1NzAwIDAwMDAgICAgIAkJcHVzaAkxZgotICAzNCAwMDRiIEZGQjMwQzAwIDAwMDAgICAgIAkJcHVzaAlcKDFmLS5cKVwoJWVieFwpCi0gIDM1IDAwNTEgRkYzNTA2MDAgMDAwMCAgICAgCQlwdXNoCTFmLS4KLSAgMzYgICAgICAgICAgICAgICAgICAgICAgIAkjIHRoZXNlLCBhbmQgb3RoZXJzIGxpa2UgdGhlbSBzaG91bGQgaGF2ZSBubyBvcGVyYW5kIHNpemUgcHJlZml4Ci0gIDM3IDAwNTcgMEYwMEQxICAgICAgICAgICAgCTE6CWxsZHQJJWN4Ci0gIDM4IDAwNWEgMEYwMUYwICAgICAgICAgICAgCQlsbXN3CSVheAotICAzOSAgICAgICAgICAgICAgICAgICAgICAgCQotICA0MCAgICAgICAgICAgICAgICAgICAgICAgCSMgSnVzdCB0byBtYWtlIHN1cmUgdGhlc2UgZG9uJ3QgYmVjb21lIGlsbGVnYWwgZHVlIHRvIG92ZXItZW50aHVzaWFzdGljCi0gIDQxICAgICAgICAgICAgICAgICAgICAgICAJIyByZWdpc3RlciBjaGVja2luZwotICA0MiAwMDVkIDY2MEZCRUY4ICAgICAgICAgIAkJbW92c2J3CSVhbCwlZGkKLSAgNDMgMDA2MSAwRkJFQzggICAgICAgICAgICAJCW1vdnNibAklYWwsJWVjeAotICA0NCAwMDY0IDBGQkZDOCAgICAgICAgICAgIAkJbW92c3dsCSVheCwlZWN4Ci0gIDQ1IDAwNjcgNjYwRkI2RjggICAgICAgICAgCQltb3Z6YncJJWFsLCVkaQotICA0NiAwMDZiIDBGQjZDOCAgICAgICAgICAgIAkJbW92emJsCSVhbCwlZWN4Ci0gIDQ3IDAwNmUgMEZCN0M4ICAgICAgICAgICAgCQltb3Z6d2wJJWF4LCVlY3gKLSAgNDggICAgICAgICAgICAgICAgICAgICAgIAkKLSAgNDkgMDA3MSBFQyAgICAgICAgICAgICAgICAJCWluCSVkeCwlYWwKLSAgNTAgMDA3MiA2NkVEICAgICAgICAgICAgICAJCWluCSVkeCwlYXgKLSAgNTEgMDA3NCBFRCAgICAgICAgICAgICAgICAJCWluCSVkeCwlZWF4Ci0gIDUyIDAwNzUgRUMgICAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVhbAotICA1MyAwMDc2IDY2RUQgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlYXgKLSAgNTQgMDA3OCBFRCAgICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWVheAotICA1NSAwMDc5IEVDICAgICAgICAgICAgICAgIAkJaW5iCSVkeCwlYWwKLSAgNTYgMDA3YSA2NkVEICAgICAgICAgICAgICAJCWludwklZHgsJWF4Ci0gIDU3IDAwN2MgRUQgICAgICAgICAgICAgICAgCQlpbmwJJWR4LCVlYXgKLSAgNTggMDA3ZCBFQyAgICAgICAgICAgICAgICAJCWluYgklZHgKLSAgNTkgMDA3ZSA2NkVEICAgICAgICAgICAgICAJCWludwklZHgKLSAgNjAgMDA4MCBFRCAgICAgICAgICAgICAgICAJCWlubAklZHgKLSAgNjEgMDA4MSBFNEZGICAgICAgICAgICAgICAJCWluYglcJDI1NQotICA2MiAwMDgzIDY2RTUwMiAgICAgICAgICAgIAkJaW53CVwkMgotICA2MyAwMDg2IEU1MDQgICAgICAgICAgICAgIAkJaW5sCVwkNAotICA2NCAwMDg4IEVGICAgICAgICAgICAgICAgIAkJb3V0bAklZWF4LCVkeAotICA2NSAwMDg5IEU2MkEgICAgICAgICAgICAgIAkJb3V0CSVhbCwgXCQ0MgotICA2NiAwMDhiIDY2RTUwRCAgICAgICAgICAgIAkJaW4JXCQxMywgJWF4Ci0gIDY3ICAgICAgICAgICAgICAgICAgICAgICAJIyBUaGVzZSBhcmUgdXNlZCBpbiBBSVguCi0gIDY4IDAwOGUgNjZFRCAgICAgICAgICAgICAgCQlpbncJXCglZHhcKQotICA2OSAwMDkwIDY2RUYgICAgICAgICAgICAgIAkJb3V0dwlcKCVkeFwpCi0gIDcwICAgICAgICAgICAgICAgICAgICAgICAJCi0gIDcxIDAwOTIgQTQgICAgICAgICAgICAgICAgCQltb3ZzYgotICA3MiAwMDkzIDY2QTcgICAgICAgICAgICAgIAkJY21wc3cKLSAgNzMgMDA5NSBBRiAgICAgICAgICAgICAgICAJCXNjYXNsCi0gIDc0IDAwOTYgRDcgICAgICAgICAgICAgICAgCQl4bGF0YgotICA3NSAwMDk3IDJFQTUgICAgICAgICAgICAgIAkJbW92c2wJJWNzOlwoJWVzaVwpLCVlczpcKCVlZGlcKQotICA3NiAwMDk5IDBGOTMwMyAgICAgICAgICAgIAkJc2V0YWUJXCglZWJ4XCkKLSAgNzcgMDA5YyAwRjkzMDMgICAgICAgICAgICAJCXNldGFlYglcKCVlYnhcKQotICA3OCAwMDlmIDBGOTNDMCAgICAgICAgICAgIAkJc2V0YWUJJWFsCi0gIDc5ICAgICAgICAgICAgICAgICAgICAgICAJCi0gIDgwICAgICAgICAgICAgICAgICAgICAgICAJI3RoZXNlIHNob3VsZCBnaXZlIHdhcm5pbmdzCi0gIDgxIDAwYTIgMEMwMSAgICAgICAgICAgICAgCQlvcmIJXCQxLCVheAotLipXYXJuaW5nOi4qCi0gIDgyIDAwYTQgMEMwMSAgICAgICAgICAgICAgCQlvcmIJXCQxLCVlYXgKLS4qV2FybmluZzouKgotICA4MyAwMGE2IDgwQ0IwMSAgICAgICAgICAgIAkJb3JiCVwkMSwlYngKLS4qV2FybmluZzouKgotICA4NCAwMGE5IDgwQ0IwMSAgICAgICAgICAgIAkJb3JiCVwkMSwlZWJ4Ci0uKldhcm5pbmc6LioKLSAgODUgMDBhYyBEOUMxICAgICAgICAgICAgICAJCWZsZGwJJXN0XCgxXCkKLS4qV2FybmluZzouKgotICA4NiAwMGFlIERERDIgICAgICAgICAgICAgIAkJZnN0bAklc3RcKDJcKQotLipXYXJuaW5nOi4qCi0gIDg3IDAwYjAgREREQiAgICAgICAgICAgICAgCQlmc3RwbAklc3RcKDNcKQotLipXYXJuaW5nOi4qCi0gIDg4IDAwYjIgRDhENCAgICAgICAgICAgICAgCQlmY29tbAklc3RcKDRcKQotLipXYXJuaW5nOi4qCi0gIDg5IDAwYjQgRDhERCAgICAgICAgICAgICAgCQlmY29tcGwJJXN0XCg1XCkKLS4qV2FybmluZzouKgotICA5MCAwMGI2IERFQzEgICAgICAgICAgICAgIAkJZmFkZHAJJXN0XCgxXCksJXN0Ci0uKldhcm5pbmc6LioKLSAgOTEgMDBiOCBERUNBICAgICAgICAgICAgICAJCWZtdWxwCSVzdFwoMlwpLCVzdAotLipXYXJuaW5nOi4qCi0gIDkyIDAwYmEgREVFMyAgICAgICAgICAgICAgCQlmc3VicAklc3RcKDNcKSwlc3QKLS4qV2FybmluZzouKgotICA5MyAwMGJjIERFRUMgICAgICAgICAgICAgIAkJZnN1YnJwCSVzdFwoNFwpLCVzdAotLipXYXJuaW5nOi4qCi0gIDk0IDAwYmUgREVGNSAgICAgICAgICAgICAgCQlmZGl2cAklc3RcKDVcKSwlc3QKLS4qV2FybmluZzouKgotICA5NSAwMGMwIERFRkUgICAgICAgICAgICAgIAkJZmRpdnJwCSVzdFwoNlwpLCVzdAotLipXYXJuaW5nOi4qCi0gIDk2IDAwYzIgREVDMSAgICAgICAgICAgICAgCQlmYWRkCi0uKldhcm5pbmc6LioKLSAgOTcgMDBjNCBERUUxICAgICAgICAgICAgICAJCWZzdWIKLS4qV2FybmluZzouKgotICA5OCAwMGM2IERFQzkgICAgICAgICAgICAgIAkJZm11bAotLipXYXJuaW5nOi4qCi0gIDk5IDAwYzggREVGMSAgICAgICAgICAgICAgCQlmZGl2Ci0uKldhcm5pbmc6LioKLSAxMDAgMDBjYSBERUU5ICAgICAgICAgICAgICAJCWZzdWJyCi0uKldhcm5pbmc6LioKLSAxMDEgMDBjYyBERUY5ICAgICAgICAgICAgICAJCWZkaXZyCi0uKldhcm5pbmc6LioKLSAxMDIgICAgICAgICAgICAgICAgICAgICAgIAkjdGhlc2Ugc2hvdWxkIGFsbCBiZSBsZWdhbAotIDEwMyAwMGNlIDBGQTMxNTU2IDM0MTIwMCAgIAkJYnRsCSVlZHgsIDB4MTIzNDU2Ci0gMTA0IDAwZDUgMEZBM0QwICAgICAgICAgICAgCQlidGwJJWVkeCwgJWVheAotIDEwNSAwMGQ4IDBDMDEgICAgICAgICAgICAgIAkJb3JiCVwkMSwlYWwKLSAxMDYgMDBkYSA4MENCMDEgICAgICAgICAgICAJCW9yYglcJDEsJWJsCi0gMTA3IDAwZGQgQTExMTAwMDAgMDAgICAgICAgCQltb3ZsCTE3LCVlYXgKLSAxMDggMDBlMiBBMTExMDAwMCAwMCAgICAgICAJCW1vdgkxNywlZWF4Ci0gMTA5IDAwZTcgNjZFRCAgICAgICAgICAgICAgCQlpbncJJWR4LCVheAotIDExMCAwMGU5IEVEICAgICAgICAgICAgICAgIAkJaW5sCSVkeCwlZWF4Ci0gMTExIDAwZWEgNjZFRCAgICAgICAgICAgICAgCQlpbncJXCglZHhcKSwlYXgKLSAxMTIgMDBlYyBFRCAgICAgICAgICAgICAgICAJCWlubAlcKCVkeFwpLCVlYXgKLSAxMTMgMDBlZCBFQyAgICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWFsCi0gMTE0IDAwZWUgNjZFRCAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVheAotIDExNSAwMGYwIEVEICAgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlZWF4Ci0gMTE2IDAwZjEgMEZCNjE0MzcgICAgICAgICAgCQltb3Z6YmwJXCglZWRpLCVlc2lcKSwlZWR4Ci0gMTE3IDAwZjUgMEZCNjQ1MUMgICAgICAgICAgCQltb3Z6YmwJMjhcKCVlYnBcKSwlZWF4Ci0gMTE4IDAwZjkgMEZCNkMwICAgICAgICAgICAgCQltb3Z6YmwJJWFsLCVlYXgKLSAxMTkgMDBmYyAwRkI2RjEgICAgICAgICAgICAJCW1vdnpibAklY2wsJWVzaQotIDEyMCAwMGZmIDI2RDcgICAgICAgICAgICAgIAkJeGxhdAklZXM6XCglZWJ4XCkKLSAxMjEgMDEwMSBENyAgICAgICAgICAgICAgICAJCXhsYXQKLSAxMjIgMDEwMiBENyAgICAgICAgICAgICAgICAJCXhsYXRiCi0gMTIzIDAxMDMgREREOCAgICAgICAgICAgICAgCTE6CWZzdHAJJXN0XCgwXCkKLSAxMjQgMDEwNSBFMkZDICAgICAgICAgICAgICAJCWxvb3AJMWIKLSAxMjUgMDEwNyBGNkYxICAgICAgICAgICAgICAJCWRpdmIgICAgJWNsIAotIDEyNiAwMTA5IDY2RjdGMSAgICAgICAgICAgIAkJZGl2dyAgICAlY3ggCi0gMTI3IDAxMGMgRjdGMSAgICAgICAgICAgICAgCQlkaXZsICAgICVlY3gKLSAxMjggMDEwZSBGNkYxICAgICAgICAgICAgICAJCWRpdgklY2wKLSAxMjkgMDExMCA2NkY3RjEgICAgICAgICAgICAJCWRpdgklY3gKLSAxMzAgMDExMyBGN0YxICAgICAgICAgICAgICAJCWRpdgklZWN4Ci0gMTMxIDAxMTUgRjZGMSAgICAgICAgICAgICAgCQlkaXYJJWNsLCVhbAotIDEzMiAwMTE3IDY2RjdGMSAgICAgICAgICAgIAkJZGl2CSVjeCwlYXgKLSAxMzMgMDExYSBGN0YxICAgICAgICAgICAgICAJCWRpdgklZWN4LCVlYXgKLSAxMzQgMDExYyA4RURFICAgICAgICAgICAgICAJCW1vdgklc2ksJWRzCi0gMTM1IDAxMWUgOEVERSAgICAgICAgICAgICAgCQltb3ZsCSVzaSwlZHMJCSMgd2FybmluZyBoZXJlCi0uKldhcm5pbmc6LioKLSAxMzYgMDEyMCAxRSAgICAgICAgICAgICAgICAJCXB1c2hsCSVkcwotIDEzNyAwMTIxIDFFICAgICAgICAgICAgICAgIAkJcHVzaAklZHMKLSAxMzggMDEyMiBBMDAwMDAwMCAwMCAgICAgICAJCW1vdgkwLCVhbAotIDEzOSAwMTI3IDY2QTEwMDAwIDAxMDAgICAgIAkJbW92CTB4MTAwMDAsJWF4Ci0gMTQwIDAxMmQgODlDMyAgICAgICAgICAgICAgCQltb3YJJWVheCwlZWJ4Ci0gMTQxIDAxMmYgOUMgICAgICAgICAgICAgICAgCQlwdXNoZgotIDE0MiAwMTMwIDlDICAgICAgICAgICAgICAgIAkJcHVzaGZsCi0gMTQzIDAxMzEgNjY5QyAgICAgICAgICAgICAgCQlwdXNoZncKLSAxNDQgMDEzMyA5RCAgICAgICAgICAgICAgICAJCXBvcGYKLSAxNDUgMDEzNCA5RCAgICAgICAgICAgICAgICAJCXBvcGZsCi0gMTQ2IDAxMzUgNjY5RCAgICAgICAgICAgICAgCQlwb3BmdwotIDE0NyAwMTM3IDg5MzQxRDAwIDAwMDAwMCAgIAkJbW92CSVlc2ksXCgsJWVieCwxXCkKLSAxNDggMDEzZSA4MDI1MDAwMCAwMDAwN0YgICAJCWFuZGIJXCR+MHg4MCxmb28KLSAxNDkgICAgICAgICAgICAgICAgICAgICAgIAkKLSAxNTAgICAgICAgICAgICAgICAgICAgICAgIAkjY2hlY2sgMTYtYml0IGNvZGUgYXV0byBhZGRyZXNzIHByZWZpeAotIDE1MSAgICAgICAgICAgICAgICAgICAgICAgCS5jb2RlMTZnY2MKLSAxNTIgMDE0NSA2NzY2OEQ5NSAwMEZGRkZGRiAJCWxlYWwJLTI1NlwoJWVicFwpLCVlZHgKLSAxNTMgMDE0ZCA2Nzg4ODU3RiBGRkZGRkYgICAJCW1vdgklYWwsLTEyOVwoJWVicFwpCi0gMTU0IDAxNTQgNjc4ODY1ODAgICAgICAgICAgCQltb3YJJWFoLC0xMjhcKCVlYnBcKQotIDE1NSAwMTU4IDY3NjY4RDlEIDIwRjlGRkZGIAkJbGVhbAktMTc2MFwoJWVicFwpLCVlYngKLSAxNTYgMDE2MCA2NzY2ODk4NCAyNDhDMDAwMCAJCW1vdmwJJWVheCwxNDBcKCVlc3BcKQotIDE1NiAgICAgIDAwCi0gMTU3ICAgICAgICAgICAgICAgICAgICAgICAJCi0gMTU4ICAgICAgICAgICAgICAgICAgICAgICAJCSMgRm9yY2UgYSBnb29kIGFsaWdubWVudC4KLSAxNTkgMDE2OSAwMDAwMDAwMCAwMDAwMDBbIAldKi5wMmFsaWduCTQsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2dlbmVyYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2YjY4ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2dlbmVyYWwucworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0ucHNpemUgMAotLnRleHQKLSMgdGVzdCB2YXJpb3VzIHNlZ21lbnQgcmVnIGluc25zCi0JcHVzaAklZHMKLQlwdXNobAklZHMKLQlwb3AJJWRzCi0JcG9wbAklZHMKLQltb3YJJWRzLCVlYXgKLQltb3ZsCSVkcywlZWF4Ci0JbW92bAklZHMsJWF4Ci0JbW92CSVlYXgsJWRzCi0JbW92bAklYXgsJWRzCi0JbW92bAklZWF4LCVkcwotCi0JcHVzaHcJJWRzCi0JcG9wdwklZHMKLQltb3YJJWRzLCVheAotCW1vdncJJWRzLCVheAotCW1vdncJJWRzLCVlYXgKLQltb3YJJWF4LCVkcwotCW1vdncJJWF4LCVkcwotCW1vdncJJWVheCwlZHMKLQotIyB0ZXN0IHZhcmlvdXMgcHVzaGVzCi0JcHVzaGwJJDEwCi0JcHVzaHcJJDEwCi0JcHVzaAkkMTAKLQlwdXNobAkkMTAwMAotCXB1c2h3CSQxMDAwCi0JcHVzaAkkMTAwMAotCXB1c2hsCTFmCi0JcHVzaHcJMWYKLQlwdXNoCTFmCi0JcHVzaAkoMWYtLikoJWVieCkKLQlwdXNoCTFmLS4KLSMgdGhlc2UsIGFuZCBvdGhlcnMgbGlrZSB0aGVtIHNob3VsZCBoYXZlIG5vIG9wZXJhbmQgc2l6ZSBwcmVmaXgKLTE6CWxsZHQJJWN4Ci0JbG1zdwklYXgKLQotIyBKdXN0IHRvIG1ha2Ugc3VyZSB0aGVzZSBkb24ndCBiZWNvbWUgaWxsZWdhbCBkdWUgdG8gb3Zlci1lbnRodXNpYXN0aWMKLSMgcmVnaXN0ZXIgY2hlY2tpbmcKLQltb3ZzYncJJWFsLCVkaQotCW1vdnNibAklYWwsJWVjeAotCW1vdnN3bAklYXgsJWVjeAotCW1vdnpidwklYWwsJWRpCi0JbW92emJsCSVhbCwlZWN4Ci0JbW92endsCSVheCwlZWN4Ci0KLQlpbgklZHgsJWFsCi0JaW4JJWR4LCVheAotCWluCSVkeCwlZWF4Ci0JaW4JKCVkeCksJWFsCi0JaW4JKCVkeCksJWF4Ci0JaW4JKCVkeCksJWVheAotCWluYgklZHgsJWFsCi0JaW53CSVkeCwlYXgKLQlpbmwJJWR4LCVlYXgKLQlpbmIJJWR4Ci0JaW53CSVkeAotCWlubAklZHgKLQlpbmIJJDI1NQotCWludwkkMgotCWlubAkkNAotCW91dGwJJWVheCwlZHgKLQlvdXQJJWFsLCAkNDIKLQlpbgkkMTMsICVheAotIyBUaGVzZSBhcmUgdXNlZCBpbiBBSVguCi0JaW53CSglZHgpCi0Jb3V0dwkoJWR4KQotCi0JbW92c2IKLQljbXBzdwotCXNjYXNsCi0JeGxhdGIKLQltb3ZzbAklY3M6KCVlc2kpLCVlczooJWVkaSkKLQlzZXRhZQkoJWVieCkKLQlzZXRhZWIJKCVlYngpCi0Jc2V0YWUJJWFsCi0KLSN0aGVzZSBzaG91bGQgZ2l2ZSB3YXJuaW5ncwotCW9yYgkkMSwlYXgKLQlvcmIJJDEsJWVheAotCW9yYgkkMSwlYngKLQlvcmIJJDEsJWVieAotCWZsZGwJJXN0KDEpCi0JZnN0bAklc3QoMikKLQlmc3RwbAklc3QoMykKLQlmY29tbAklc3QoNCkKLQlmY29tcGwJJXN0KDUpCi0JZmFkZHAJJXN0KDEpLCVzdAotCWZtdWxwCSVzdCgyKSwlc3QKLQlmc3VicAklc3QoMyksJXN0Ci0JZnN1YnJwCSVzdCg0KSwlc3QKLQlmZGl2cAklc3QoNSksJXN0Ci0JZmRpdnJwCSVzdCg2KSwlc3QKLQlmYWRkCi0JZnN1YgotCWZtdWwKLQlmZGl2Ci0JZnN1YnIKLQlmZGl2cgotI3RoZXNlIHNob3VsZCBhbGwgYmUgbGVnYWwKLQlidGwJJWVkeCwgMHgxMjM0NTYKLQlidGwJJWVkeCwgJWVheAotCW9yYgkkMSwlYWwKLQlvcmIJJDEsJWJsCi0JbW92bAkxNywlZWF4Ci0JbW92CTE3LCVlYXgKLQlpbncJJWR4LCVheAotCWlubAklZHgsJWVheAotCWludwkoJWR4KSwlYXgKLQlpbmwJKCVkeCksJWVheAotCWluCSglZHgpLCVhbAotCWluCSglZHgpLCVheAotCWluCSglZHgpLCVlYXgKLQltb3Z6YmwJKCVlZGksJWVzaSksJWVkeAotCW1vdnpibAkyOCglZWJwKSwlZWF4Ci0JbW92emJsCSVhbCwlZWF4Ci0JbW92emJsCSVjbCwlZXNpCi0JeGxhdAklZXM6KCVlYngpCi0JeGxhdAotCXhsYXRiCi0xOglmc3RwCSVzdCgwKQotCWxvb3AJMWIKLQlkaXZiICAgICVjbCAKLQlkaXZ3ICAgICVjeCAKLQlkaXZsICAgICVlY3gKLQlkaXYJJWNsCi0JZGl2CSVjeAotCWRpdgklZWN4Ci0JZGl2CSVjbCwlYWwKLQlkaXYJJWN4LCVheAotCWRpdgklZWN4LCVlYXgKLQltb3YJJXNpLCVkcwotCW1vdmwJJXNpLCVkcwkJIyB3YXJuaW5nIGhlcmUKLQlwdXNobAklZHMKLQlwdXNoCSVkcwotCW1vdgkwLCVhbAotCW1vdgkweDEwMDAwLCVheAotCW1vdgklZWF4LCVlYngKLQlwdXNoZgotCXB1c2hmbAotCXB1c2hmdwotCXBvcGYKLQlwb3BmbAotCXBvcGZ3Ci0JbW92CSVlc2ksKCwlZWJ4LDEpCi0JYW5kYgkkfjB4ODAsZm9vCi0KLSNjaGVjayAxNi1iaXQgY29kZSBhdXRvIGFkZHJlc3MgcHJlZml4Ci0uY29kZTE2Z2NjCi0JbGVhbAktMjU2KCVlYnApLCVlZHgKLQltb3YJJWFsLC0xMjkoJWVicCkKLQltb3YJJWFoLC0xMjgoJWVicCkKLQlsZWFsCS0xNzYwKCVlYnApLCVlYngKLQltb3ZsCSVlYXgsMTQwKCVlc3ApCi0KLQkjIEZvcmNlIGEgZ29vZCBhbGlnbm1lbnQuCi0JLnAyYWxpZ24JNCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2kzODYuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pMzg2LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwMTEzNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2kzODYuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIwotIyBpMzg2IHRlc3RzCi0jCi1wcm9jIHJ1bl9saXN0X3Rlc3QgeyBuYW1lIG9wdHMgfSB7Ci0gICAgZ2xvYmFsIHNyY2RpciBzdWJkaXIKLSAgICBzZXQgdGVzdG5hbWUgImkzODYgJG5hbWUiCi0gICAgc2V0IGZpbGUgJHNyY2Rpci8kc3ViZGlyLyRuYW1lCi0gICAgZ2FzX3J1biAke25hbWV9LnMgJG9wdHMgIj4mZHVtcC5vdXQiCi0gICAgaWYgeyBbcmVnZXhwX2RpZmYgImR1bXAub3V0IiAiJHtmaWxlfS5sIl0gfSB0aGVuIHsKLQlmYWlsICR0ZXN0bmFtZQotCXZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotCXJldHVybgotICAgIH0KLSAgICBwYXNzICR0ZXN0bmFtZQotfQotCi0KLWlmIFtpc3RhcmdldCAiaSo4Ni0qLSoiXSB0aGVuIHsKLQotICAgIHJ1bl9saXN0X3Rlc3QgImZsb2F0IiAiLWFsIgotICAgIHJ1bl9saXN0X3Rlc3QgImdlbmVyYWwiICItYWwgLS1saXN0aW5nLWxocy13aWR0aD0yIgotICAgIHJ1bl9saXN0X3Rlc3QgImludmFsIiAiLWFsIgotICAgIHJ1bl9saXN0X3Rlc3QgIm1vZHJtIiAiLWFsIC0tbGlzdGluZy1saHMtd2lkdGg9MiIKLSAgICBydW5fZHVtcF90ZXN0ICJuYWtlZCIKLSAgICBydW5fZHVtcF90ZXN0ICJvcGNvZGUiCi0gICAgcnVuX2R1bXBfdGVzdCAicHJlZml4IgotICAgIHJ1bl9kdW1wX3Rlc3QgImFtZCIKLSAgICBydW5fZHVtcF90ZXN0ICJrYXRtYWkiCi0KLSAgICAjIFRoZSByZWxvYyBhbmQgd2hpdGUgdGVzdHMgcmVxdWlyZSBzdXBwb3J0IGZvciA4IGFuZCAxNiBiaXQKLSAgICAjIHJlbG9jcywgc28gd2Ugb25seSBydW4gdGhlbSBmb3IgRUxGIGFuZCBDT0ZGIHRhcmdldHMuCi0gICAgaWYge1tpc3RhcmdldCAiKi0qLWVsZioiXSB8fCBbaXN0YXJnZXQgIiotKi1saW51eCoiXSB8fCBbaXN0YXJnZXQgIiotKi1jb2ZmKiJdfSB0aGVuIHsKLQlydW5fZHVtcF90ZXN0ICJyZWxvYyIKLQlydW5fbGlzdF90ZXN0ICJ3aGl0ZSIgIi1hbCAtLWxpc3RpbmctbGhzLXdpZHRoPTMiCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnZhbC5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnZhbC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg5NDk5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaW52YWwubAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjozOiBFcnJvcjogLioKLS4qOjQ6IEVycm9yOiAuKgotLio6NTogRXJyb3I6IC4qCi0uKjo2OiBFcnJvcjogLioKLS4qOjc6IEVycm9yOiAuKgotLio6ODogRXJyb3I6IC4qCi0uKjo5OiBFcnJvcjogLioKLS4qOjEwOiBFcnJvcjogLioKLS4qOjExOiBFcnJvcjogLioKLS4qOjEyOiBFcnJvcjogLioKLS4qOjEzOiBFcnJvcjogLioKLS4qOjE0OiBFcnJvcjogLioKLS4qOjE1OiBFcnJvcjogLioKLS4qOjE2OiBFcnJvcjogLioKLS4qOjE3OiBFcnJvcjogLioKLS4qOjE4OiBFcnJvcjogLioKLS4qOjE5OiBFcnJvcjogLioKLS4qOjIwOiBFcnJvcjogLioKLS4qOjIxOiBFcnJvcjogLioKLS4qOjIyOiBFcnJvcjogLioKLS4qOjIzOiBFcnJvcjogLioKLS4qOjI0OiBFcnJvcjogLioKLS4qOjI1OiBFcnJvcjogLioKLS4qOjI2OiBFcnJvcjogLioKLS4qOjI3OiBFcnJvcjogLioKLS4qOjI4OiBFcnJvcjogLioKLS4qOjI5OiBFcnJvcjogLioKLS4qOjMwOiBFcnJvcjogLioKLS4qOjMxOiBFcnJvcjogLioKLS4qOjMyOiBFcnJvcjogLioKLS4qOjMzOiBFcnJvcjogLioKLS4qOjM0OiBFcnJvcjogLioKLS4qOjM1OiBFcnJvcjogLioKLS4qOjM2OiBFcnJvcjogLioKLS4qOjM3OiBFcnJvcjogLioKLS4qOjM4OiBFcnJvcjogLioKLS4qOjM5OiBFcnJvcjogLioKLS4qOjQwOiBFcnJvcjogLioKLS4qOjQxOiBFcnJvcjogLioKLS4qOjQyOiBFcnJvcjogLioKLS4qOjQzOiBFcnJvcjogLioKLS4qOjQ0OiBFcnJvcjogLioKLS4qOjQ1OiBFcnJvcjogLioKLS4qOjQ2OiBFcnJvcjogLioKLS4qOjQ3OiBFcnJvcjogLioKLS4qOjQ4OiBFcnJvcjogLioKLUdBUyBMSVNUSU5HIC4qCi0KLQotICAgMSBbIAldKgkudGV4dAotICAgMiBbIAldKiMgQWxsIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGlsbGVnYWwKLSAgIDMgWyAJXSoJbW92CVwoJWR4XCksJWFsCi0gICA0IFsgCV0qCW1vdglcKCVlYXgsJWVzcCwyXCksJWFsCi0gICA1IFsgCV0qCXNldGFlCSVlYXgKLSAgIDYgWyAJXSoJcHVzaGIJJWRzCi0gICA3IFsgCV0qCXBvcGIJJWRzCi0gICA4IFsgCV0qCXB1c2hiCSVhbAotICAgOSBbIAldKglwb3BiCSVhbAotICAxMCBbIAldKglwdXNoYgklYWgKLSAgMTEgWyAJXSoJcG9wYgklYWgKLSAgMTIgWyAJXSoJcHVzaGIJJWF4Ci0gIDEzIFsgCV0qCXBvcGIJJWF4Ci0gIDE0IFsgCV0qCXB1c2hiCSVlYXgKLSAgMTUgWyAJXSoJcG9wYgklZWF4Ci0gIDE2IFsgCV0qCW1vdmIJJWRzLCVheAotICAxNyBbIAldKgltb3ZiCSVkcywlZWF4Ci0gIDE4IFsgCV0qCW1vdmIJJWF4LCVkcwotICAxOSBbIAldKgltb3ZiCSVlYXgsJWRzCi0gIDIwIFsgCV0qCW1vdmRiCSVlYXgsJW1tMAotICAyMSBbIAldKgltb3ZxYgkwLCVtbTAKLSAgMjIgWyAJXSoJbGRzYgkwLCVlYXgKLSAgMjMgWyAJXSoJc2V0bmV3CTAKLSAgMjQgWyAJXSoJbW92ZHcJJWVheCwlbW0wCi0gIDI1IFsgCV0qCW1vdnF3CTAsJW1tMAotICAyNiBbIAldKglkaXYJJWN4LCVhbAotICAyNyBbIAldKglkaXYJJWNsLCVheAotICAyOCBbIAldKglkaXYJJWVjeCwlYWwKLSAgMjkgWyAJXSoJaW11bAkxMCwlYngsJWVjeAotICAzMCBbIAldKglpbXVsCTEwLCVieCwlYWwKLSAgMzEgWyAJXSoJcG9wYWIKLSAgMzIgWyAJXSoJc3RpbAotICAzMyBbIAldKglhYWFiCi0gIDM0IFsgCV0qCWN3ZGVsCi0gIDM1IFsgCV0qCWN3ZHcKLSAgMzYgWyAJXSoJY2FsbHd3CTAKLSAgMzcgWyAJXSpmb286CWphdwlmb28KLSAgMzggWyAJXSoJamN4encJZm9vCi0gIDM5IFsgCV0qCWplY3h6bAlmb28KLSAgNDAgWyAJXSoJbG9vcGIJZm9vCi0gIDQxIFsgCV0qCXhsYXR3CSVlczolYngKLSAgNDIgWyAJXSoJeGxhdGwJJWVzOiVieAotICA0MyBbIAldKglpbnRsCTIKLSAgNDQgWyAJXSoJaW50M2IKLSAgNDUgWyAJXSoJaGx0YgotICA0NiBbIAldKglmc3RiCSVzdFwoMFwpCi0gIDQ3IFsgCV0qCWZjb21wbGwJMjhcKCVlYnBcKQotICA0OCBbIAldKglmbGRsdwlcKCVlYXhcKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnZhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnZhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzdhMThlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaW52YWwucworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLQkudGV4dAotIyBBbGwgdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgaWxsZWdhbAotCW1vdgkoJWR4KSwlYWwKLQltb3YJKCVlYXgsJWVzcCwyKSwlYWwKLQlzZXRhZQklZWF4Ci0JcHVzaGIJJWRzCi0JcG9wYgklZHMKLQlwdXNoYgklYWwKLQlwb3BiCSVhbAotCXB1c2hiCSVhaAotCXBvcGIJJWFoCi0JcHVzaGIJJWF4Ci0JcG9wYgklYXgKLQlwdXNoYgklZWF4Ci0JcG9wYgklZWF4Ci0JbW92YgklZHMsJWF4Ci0JbW92YgklZHMsJWVheAotCW1vdmIJJWF4LCVkcwotCW1vdmIJJWVheCwlZHMKLQltb3ZkYgklZWF4LCVtbTAKLQltb3ZxYgkwLCVtbTAKLQlsZHNiCTAsJWVheAotCXNldG5ldwkwCi0JbW92ZHcJJWVheCwlbW0wCi0JbW92cXcJMCwlbW0wCi0JZGl2CSVjeCwlYWwKLQlkaXYJJWNsLCVheAotCWRpdgklZWN4LCVhbAotCWltdWwJMTAsJWJ4LCVlY3gKLQlpbXVsCTEwLCVieCwlYWwKLQlwb3BhYgotCXN0aWwKLQlhYWFiCi0JY3dkZWwKLQljd2R3Ci0JY2FsbHd3CTAKLWZvbzoJamF3CWZvbwotCWpjeHp3CWZvbwotCWplY3h6bAlmb28KLQlsb29wYglmb28KLQl4bGF0dwklZXM6JWJ4Ci0JeGxhdGwJJWVzOiVieAotCWludGwJMgotCWludDNiCi0JaGx0YgotCWZzdGIJJXN0KDApCi0JZmNvbXBsbAkyOCglZWJwKQotCWZsZGx3CSglZWF4KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9rYXRtYWkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYva2F0bWFpLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMDg1ODEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9rYXRtYWkuZAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0jb2JqZHVtcDogLWR3Ci0jbmFtZTogaTM4NiBrYXRtYWkKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8Zm9vPjoKLSAgIDA6CTBmIDU4IDAxIFsgCV0qYWRkcHMgIFwoJWVjeFwpLCV4bW0wCi0gICAzOgkwZiA1OCBjYSBbIAldKmFkZHBzICAleG1tMiwleG1tMQotICAgNjoJZjMgMGYgNTggMTMgWyAJXSphZGRzcyAgXCglZWJ4XCksJXhtbTIKLSAgIGE6CWYzIDBmIDU4IGRjIFsgCV0qYWRkc3MgICV4bW00LCV4bW0zCi0gICBlOgkwZiA1NSA2NSAwMCBbIAldKmFuZG5wcyAweDBcKCVlYnBcKSwleG1tNAotICAxMjoJMGYgNTUgZWUgWyAJXSphbmRucHMgJXhtbTYsJXhtbTUKLSAgMTU6CTBmIDU0IDM3IFsgCV0qYW5kcHMgIFwoJWVkaVwpLCV4bW02Ci0gIDE4OgkwZiA1NCBmOCBbIAldKmFuZHBzICAleG1tMCwleG1tNwotICAxYjoJMGYgYzIgYzEgMDIgWyAJXSpjbXBsZXBzICV4bW0xLCV4bW0wCi0gIDFmOgkwZiBjMiAwYSAwMyBbIAldKmNtcHVub3JkcHMgXCglZWR4XCksJXhtbTEKLSAgMjM6CWYzIDBmIGMyIGQyIDA0IFsgCV0qY21wbmVxc3MgJXhtbTIsJXhtbTIKLSAgMjg6CWYzIDBmIGMyIDFjIDI0IDA1IFsgCV0qY21wbmx0c3MgXCglZXNwLDFcKSwleG1tMwotICAyZToJMGYgYzIgZTUgMDYgWyAJXSpjbXBubGVwcyAleG1tNSwleG1tNAotICAzMjoJMGYgYzIgMmUgMDcgWyAJXSpjbXBvcmRwcyBcKCVlc2lcKSwleG1tNQotICAzNjoJZjMgMGYgYzIgZjcgMDAgWyAJXSpjbXBlcXNzICV4bW03LCV4bW02Ci0gIDNiOglmMyAwZiBjMiAzOCAwMSBbIAldKmNtcGx0c3MgXCglZWF4XCksJXhtbTcKLSAgNDA6CTBmIGMyIGMxIDAwIFsgCV0qY21wZXFwcyAleG1tMSwleG1tMAotICA0NDoJMGYgYzIgMGEgMDAgWyAJXSpjbXBlcXBzIFwoJWVkeFwpLCV4bW0xCi0gIDQ4OglmMyAwZiBjMiBkMiAwMCBbIAldKmNtcGVxc3MgJXhtbTIsJXhtbTIKLSAgNGQ6CWYzIDBmIGMyIDFjIDI0IDAwIFsgCV0qY21wZXFzcyBcKCVlc3AsMVwpLCV4bW0zCi0gIDUzOgkwZiBjMiBlNSAwMSBbIAldKmNtcGx0cHMgJXhtbTUsJXhtbTQKLSAgNTc6CTBmIGMyIDJlIDAxIFsgCV0qY21wbHRwcyBcKCVlc2lcKSwleG1tNQotICA1YjoJZjMgMGYgYzIgZjcgMDEgWyAJXSpjbXBsdHNzICV4bW03LCV4bW02Ci0gIDYwOglmMyAwZiBjMiAzOCAwMSBbIAldKmNtcGx0c3MgXCglZWF4XCksJXhtbTcKLSAgNjU6CTBmIGMyIDAxIDAyIFsgCV0qY21wbGVwcyBcKCVlY3hcKSwleG1tMAotICA2OToJMGYgYzIgY2EgMDIgWyAJXSpjbXBsZXBzICV4bW0yLCV4bW0xCi0gIDZkOglmMyAwZiBjMiAxMyAwMiBbIAldKmNtcGxlc3MgXCglZWJ4XCksJXhtbTIKLSAgNzI6CWYzIDBmIGMyIGRjIDAyIFsgCV0qY21wbGVzcyAleG1tNCwleG1tMwotICA3NzoJMGYgYzIgNjUgMDAgMDMgWyAJXSpjbXB1bm9yZHBzIDB4MFwoJWVicFwpLCV4bW00Ci0gIDdjOgkwZiBjMiBlZSAwMyBbIAldKmNtcHVub3JkcHMgJXhtbTYsJXhtbTUKLSAgODA6CWYzIDBmIGMyIDM3IDAzIFsgCV0qY21wdW5vcmRzcyBcKCVlZGlcKSwleG1tNgotICA4NToJZjMgMGYgYzIgZjggMDMgWyAJXSpjbXB1bm9yZHNzICV4bW0wLCV4bW03Ci0gIDhhOgkwZiBjMiBjMSAwNCBbIAldKmNtcG5lcXBzICV4bW0xLCV4bW0wCi0gIDhlOgkwZiBjMiAwYSAwNCBbIAldKmNtcG5lcXBzIFwoJWVkeFwpLCV4bW0xCi0gIDkyOglmMyAwZiBjMiBkMiAwNCBbIAldKmNtcG5lcXNzICV4bW0yLCV4bW0yCi0gIDk3OglmMyAwZiBjMiAxYyAyNCAwNCBbIAldKmNtcG5lcXNzIFwoJWVzcCwxXCksJXhtbTMKLSAgOWQ6CTBmIGMyIGU1IDA1IFsgCV0qY21wbmx0cHMgJXhtbTUsJXhtbTQKLSAgYTE6CTBmIGMyIDJlIDA1IFsgCV0qY21wbmx0cHMgXCglZXNpXCksJXhtbTUKLSAgYTU6CWYzIDBmIGMyIGY3IDA1IFsgCV0qY21wbmx0c3MgJXhtbTcsJXhtbTYKLSAgYWE6CWYzIDBmIGMyIDM4IDA1IFsgCV0qY21wbmx0c3MgXCglZWF4XCksJXhtbTcKLSAgYWY6CTBmIGMyIDAxIDA2IFsgCV0qY21wbmxlcHMgXCglZWN4XCksJXhtbTAKLSAgYjM6CTBmIGMyIGNhIDA2IFsgCV0qY21wbmxlcHMgJXhtbTIsJXhtbTEKLSAgYjc6CWYzIDBmIGMyIDEzIDA2IFsgCV0qY21wbmxlc3MgXCglZWJ4XCksJXhtbTIKLSAgYmM6CWYzIDBmIGMyIGRjIDA2IFsgCV0qY21wbmxlc3MgJXhtbTQsJXhtbTMKLSAgYzE6CTBmIGMyIDY1IDAwIDA3IFsgCV0qY21wb3JkcHMgMHgwXCglZWJwXCksJXhtbTQKLSAgYzY6CTBmIGMyIGVlIDA3IFsgCV0qY21wb3JkcHMgJXhtbTYsJXhtbTUKLSAgY2E6CWYzIDBmIGMyIDM3IDA3IFsgCV0qY21wb3Jkc3MgXCglZWRpXCksJXhtbTYKLSAgY2Y6CWYzIDBmIGMyIGY4IDA3IFsgCV0qY21wb3Jkc3MgJXhtbTAsJXhtbTcKLSAgZDQ6CTBmIDJmIGMxIFsgCV0qY29taXNzICV4bW0xLCV4bW0wCi0gIGQ3OgkwZiAyZiAwYSBbIAldKmNvbWlzcyBcKCVlZHhcKSwleG1tMQotICBkYToJMGYgMmEgZDMgWyAJXSpjdnRwaTJwcyAlbW0zLCV4bW0yCi0gIGRkOgkwZiAyYSAxYyAyNCBbIAldKmN2dHBpMnBzIFwoJWVzcCwxXCksJXhtbTMKLSAgZTE6CWYzIDBmIDJhIGU1IFsgCV0qY3Z0c2kyc3MgJWVicCwleG1tNAotICBlNToJZjMgMGYgMmEgMmUgWyAJXSpjdnRzaTJzcyBcKCVlc2lcKSwleG1tNQotICBlOToJMGYgMmQgZjcgWyAJXSpjdnRwczJwaSAleG1tNywlbW02Ci0gIGVjOgkwZiAyZCAzOCBbIAldKmN2dHBzMnBpIFwoJWVheFwpLCVtbTcKLSAgZWY6CWYzIDBmIDJkIDAxIFsgCV0qY3Z0c3Myc2kgXCglZWN4XCksJWVheAotICBmMzoJZjMgMGYgMmQgY2EgWyAJXSpjdnRzczJzaSAleG1tMiwlZWN4Ci0gIGY3OgkwZiAyYyAxMyBbIAldKmN2dHRwczJwaSBcKCVlYnhcKSwlbW0yCi0gIGZhOgkwZiAyYyBkYyBbIAldKmN2dHRwczJwaSAleG1tNCwlbW0zCi0gIGZkOglmMyAwZiAyYyA2NSAwMCBbIAldKmN2dHRzczJzaSAweDBcKCVlYnBcKSwlZXNwCi0gMTAyOglmMyAwZiAyYyBlZSBbIAldKmN2dHRzczJzaSAleG1tNiwlZWJwCi0gMTA2OgkwZiA1ZSBjMSBbIAldKmRpdnBzICAleG1tMSwleG1tMAotIDEwOToJMGYgNWUgMGEgWyAJXSpkaXZwcyAgXCglZWR4XCksJXhtbTEKLSAxMGM6CWYzIDBmIDVlIGQzIFsgCV0qZGl2c3MgICV4bW0zLCV4bW0yCi0gMTEwOglmMyAwZiA1ZSAxYyAyNCBbIAldKmRpdnNzICBcKCVlc3AsMVwpLCV4bW0zCi0gMTE1OgkwZiBhZSA1NSAwMCBbIAldKmxkbXhjc3IgMHgwXCglZWJwXCkKLSAxMTk6CTBmIGFlIDFlIFsgCV0qc3RteGNzciBcKCVlc2lcKQotIDExYzoJMGYgYWUgZjggWyAJXSpzZmVuY2UgCi0gMTFmOgkwZiA1ZiBjMSBbIAldKm1heHBzICAleG1tMSwleG1tMAotIDEyMjoJMGYgNWYgMGEgWyAJXSptYXhwcyAgXCglZWR4XCksJXhtbTEKLSAxMjU6CWYzIDBmIDVmIGQzIFsgCV0qbWF4c3MgICV4bW0zLCV4bW0yCi0gMTI5OglmMyAwZiA1ZiAxYyAyNCBbIAldKm1heHNzICBcKCVlc3AsMVwpLCV4bW0zCi0gMTJlOgkwZiA1ZCBlNSBbIAldKm1pbnBzICAleG1tNSwleG1tNAotIDEzMToJMGYgNWQgMmUgWyAJXSptaW5wcyAgXCglZXNpXCksJXhtbTUKLSAxMzQ6CWYzIDBmIDVkIGY3IFsgCV0qbWluc3MgICV4bW03LCV4bW02Ci0gMTM4OglmMyAwZiA1ZCAzOCBbIAldKm1pbnNzICBcKCVlYXhcKSwleG1tNwotIDEzYzoJMGYgMjggYzEgWyAJXSptb3ZhcHMgJXhtbTEsJXhtbTAKLSAxM2Y6CTBmIDI5IDExIFsgCV0qbW92YXBzICV4bW0yLFwoJWVjeFwpCi0gMTQyOgkwZiAyOCAxMiBbIAldKm1vdmFwcyBcKCVlZHhcKSwleG1tMgotIDE0NToJMGYgMTYgZGMgWyAJXSptb3ZsaHBzICV4bW00LCV4bW0zCi0gMTQ4OgkwZiAxNyAyYyAyNCBbIAldKm1vdmhwcyAleG1tNSxcKCVlc3AsMVwpCi0gMTRjOgkwZiAxNiAyZSBbIAldKm1vdmhwcyBcKCVlc2lcKSwleG1tNQotIDE0ZjoJMGYgMTIgZjcgWyAJXSptb3ZobHBzICV4bW03LCV4bW02Ci0gMTUyOgkwZiAxMyAwNyBbIAldKm1vdmxwcyAleG1tMCxcKCVlZGlcKQotIDE1NToJMGYgMTIgMDAgWyAJXSptb3ZscHMgXCglZWF4XCksJXhtbTAKLSAxNTg6CTBmIDUwIGNhIFsgCV0qbW92bXNrcHMgJXhtbTIsJWVjeAotIDE1YjoJMGYgMTAgZDMgWyAJXSptb3Z1cHMgJXhtbTMsJXhtbTIKLSAxNWU6CTBmIDExIDIyIFsgCV0qbW92dXBzICV4bW00LFwoJWVkeFwpCi0gMTYxOgkwZiAxMCA2NSAwMCBbIAldKm1vdnVwcyAweDBcKCVlYnBcKSwleG1tNAotIDE2NToJZjMgMGYgMTAgZWUgWyAJXSptb3ZzcyAgJXhtbTYsJXhtbTUKLSAxNjk6CWYzIDBmIDExIDNlIFsgCV0qbW92c3MgICV4bW03LFwoJWVzaVwpCi0gMTZkOglmMyAwZiAxMCAzOCBbIAldKm1vdnNzICBcKCVlYXhcKSwleG1tNwotIDE3MToJMGYgNTkgYzEgWyAJXSptdWxwcyAgJXhtbTEsJXhtbTAKLSAxNzQ6CTBmIDU5IDBhIFsgCV0qbXVscHMgIFwoJWVkeFwpLCV4bW0xCi0gMTc3OglmMyAwZiA1OSBkMiBbIAldKm11bHNzICAleG1tMiwleG1tMgotIDE3YjoJZjMgMGYgNTkgMWMgMjQgWyAJXSptdWxzcyAgXCglZXNwLDFcKSwleG1tMwotIDE4MDoJMGYgNTYgZTUgWyAJXSpvcnBzICAgJXhtbTUsJXhtbTQKLSAxODM6CTBmIDU2IDJlIFsgCV0qb3JwcyAgIFwoJWVzaVwpLCV4bW01Ci0gMTg2OgkwZiA1MyBmNyBbIAldKnJjcHBzICAleG1tNywleG1tNgotIDE4OToJMGYgNTMgMzggWyAJXSpyY3BwcyAgXCglZWF4XCksJXhtbTcKLSAxOGM6CWYzIDBmIDUzIDAxIFsgCV0qcmNwc3MgIFwoJWVjeFwpLCV4bW0wCi0gMTkwOglmMyAwZiA1MyBjYSBbIAldKnJjcHNzICAleG1tMiwleG1tMQotIDE5NDoJMGYgNTIgMTMgWyAJXSpyc3FydHBzIFwoJWVieFwpLCV4bW0yCi0gMTk3OgkwZiA1MiBkYyBbIAldKnJzcXJ0cHMgJXhtbTQsJXhtbTMKLSAxOWE6CWYzIDBmIDUyIDY1IDAwIFsgCV0qcnNxcnRzcyAweDBcKCVlYnBcKSwleG1tNAotIDE5ZjoJZjMgMGYgNTIgZWUgWyAJXSpyc3FydHNzICV4bW02LCV4bW01Ci0gMWEzOgkwZiBjNiAzNyAwMiBbIAldKnNodWZwcyBcJDB4MixcKCVlZGlcKSwleG1tNgotIDFhNzoJMGYgYzYgZjggMDMgWyAJXSpzaHVmcHMgXCQweDMsJXhtbTAsJXhtbTcKLSAxYWI6CTBmIDUxIGMxIFsgCV0qc3FydHBzICV4bW0xLCV4bW0wCi0gMWFlOgkwZiA1MSAwYSBbIAldKnNxcnRwcyBcKCVlZHhcKSwleG1tMQotIDFiMToJZjMgMGYgNTEgZDIgWyAJXSpzcXJ0c3MgJXhtbTIsJXhtbTIKLSAxYjU6CWYzIDBmIDUxIDFjIDI0IFsgCV0qc3FydHNzIFwoJWVzcCwxXCksJXhtbTMKLSAxYmE6CTBmIDVjIGU1IFsgCV0qc3VicHMgICV4bW01LCV4bW00Ci0gMWJkOgkwZiA1YyAyZSBbIAldKnN1YnBzICBcKCVlc2lcKSwleG1tNQotIDFjMDoJZjMgMGYgNWMgZjcgWyAJXSpzdWJzcyAgJXhtbTcsJXhtbTYKLSAxYzQ6CWYzIDBmIDVjIDM4IFsgCV0qc3Vic3MgIFwoJWVheFwpLCV4bW03Ci0gMWM4OgkwZiAyZSAwMSBbIAldKnVjb21pc3MgXCglZWN4XCksJXhtbTAKLSAxY2I6CTBmIDJlIGNhIFsgCV0qdWNvbWlzcyAleG1tMiwleG1tMQotIDFjZToJMGYgMTUgMTMgWyAJXSp1bnBja2hwcyBcKCVlYnhcKSwleG1tMgotIDFkMToJMGYgMTUgZGMgWyAJXSp1bnBja2hwcyAleG1tNCwleG1tMwotIDFkNDoJMGYgMTQgNjUgMDAgWyAJXSp1bnBja2xwcyAweDBcKCVlYnBcKSwleG1tNAotIDFkODoJMGYgMTQgZWUgWyAJXSp1bnBja2xwcyAleG1tNiwleG1tNQotIDFkYjoJMGYgNTcgMzcgWyAJXSp4b3JwcyAgXCglZWRpXCksJXhtbTYKLSAxZGU6CTBmIDU3IGY4IFsgCV0qeG9ycHMgICV4bW0wLCV4bW03Ci0gMWUxOgkwZiBlMCBjMSBbIAldKnBhdmdiICAlbW0xLCVtbTAKLSAxZTQ6CTBmIGUwIDBhIFsgCV0qcGF2Z2IgIFwoJWVkeFwpLCVtbTEKLSAxZTc6CTBmIGUzIGQzIFsgCV0qcGF2Z3cgICVtbTMsJW1tMgotIDFlYToJMGYgZTMgMWMgMjQgWyAJXSpwYXZndyAgXCglZXNwLDFcKSwlbW0zCi0gMWVlOgkwZiBjNSBjOCAwMCBbIAldKnBleHRydyBcJDB4MCwlbW0xLCVlYXgKLSAxZjI6CTBmIGM0IDA5IDAxIFsgCV0qcGluc3J3IFwkMHgxLFwoJWVjeFwpLCVtbTEKLSAxZjY6CTBmIGM0IGQyIDAyIFsgCV0qcGluc3J3IFwkMHgyLCVlZHgsJW1tMgotIDFmYToJMGYgZWUgYzEgWyAJXSpwbWF4c3cgJW1tMSwlbW0wCi0gMWZkOgkwZiBlZSAwYSBbIAldKnBtYXhzdyBcKCVlZHhcKSwlbW0xCi0gMjAwOgkwZiBkZSBkMiBbIAldKnBtYXh1YiAlbW0yLCVtbTIKLSAyMDM6CTBmIGRlIDFjIDI0IFsgCV0qcG1heHViIFwoJWVzcCwxXCksJW1tMwotIDIwNzoJMGYgZWEgZTUgWyAJXSpwbWluc3cgJW1tNSwlbW00Ci0gMjBhOgkwZiBlYSAyZSBbIAldKnBtaW5zdyBcKCVlc2lcKSwlbW01Ci0gMjBkOgkwZiBkYSBmNyBbIAldKnBtaW51YiAlbW03LCVtbTYKLSAyMTA6CTBmIGRhIDM4IFsgCV0qcG1pbnViIFwoJWVheFwpLCVtbTcKLSAyMTM6CTBmIGQ3IGU4IFsgCV0qcG1vdm1za2IgJW1tNSwlZWF4Ci0gMjE2OgkwZiBlNCBlNSBbIAldKnBtdWxodXcgJW1tNSwlbW00Ci0gMjE5OgkwZiBlNCAyZSBbIAldKnBtdWxodXcgXCglZXNpXCksJW1tNQotIDIxYzoJMGYgZjYgZjcgWyAJXSpwc2FkYncgJW1tNywlbW02Ci0gMjFmOgkwZiBmNiAzOCBbIAldKnBzYWRidyBcKCVlYXhcKSwlbW03Ci0gMjIyOgkwZiA3MCBkYSAwMSBbIAldKnBzaHVmdyBcJDB4MSwlbW0yLCVtbTMKLSAyMjY6CTBmIDcwIDc1IDAwIDA0IFsgCV0qcHNodWZ3IFwkMHg0LDB4MFwoJWVicFwpLCVtbTYKLSAyMmI6CTBmIGY3IGM3IFsgCV0qbWFza21vdnEgJW1tNywlbW0wCi0gMjJlOgkwZiAyYiAzMyBbIAldKm1vdm50cHMgJXhtbTYsXCglZWJ4XCkKLSAyMzE6CTBmIGU3IDEwIFsgCV0qbW92bnRxICVtbTIsXCglZWF4XCkKLSAyMzQ6CTBmIDE4IDA2IFsgCV0qcHJlZmV0Y2hudGEgXCglZXNpXCkKLSAyMzc6CTBmIDE4IDBjIDk4IFsgCV0qcHJlZmV0Y2h0MCBcKCVlYXgsJWVieCw0XCkKLSAyM2I6CTBmIDE4IDEyIFsgCV0qcHJlZmV0Y2h0MSBcKCVlZHhcKQotIDIzZToJMGYgMTggMTkgWyAJXSpwcmVmZXRjaHQyIFwoJWVjeFwpCi0gMjQxOgkyZSAwZiBbIAldKlwoYmFkXCkgIAotIDI0MzoJYzIgMGEgMDggWyAJXSpyZXQgICAgXCQweDgwYQotIDI0NjoJOTAgWyAJXSpub3AgICAgCi0gMjQ3Ogk5MCBbIAldKm5vcCAgICAKLSAyNDg6CTY1IFsgCV0qZ3MKLSAyNDk6CTBmIFsgCV0qc2ZlbmNlLipcKGJhZFwpLioKLSAyNGE6CWFlIFsgCV0qc2NhcyAgICVlczpcKCVlZGlcKSwlYWwKLSAyNGI6CWZmIDAwIFsgCV0qaW5jbCAgIFwoJWVheFwpCi0gMjRkOgkwMCAwMCBbIAldKmFkZCAgICAlYWwsXCglZWF4XCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYva2F0bWFpLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2thdG1haS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzRkMTVkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYva2F0bWFpLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotI1BJSUkgU0lNRCBpbnN0cnVjdGlvbnMKLQotLnRleHQKLWZvbzoKLSBhZGRwcwkJKCVlY3gpLCV4bW0wCi0gYWRkcHMJCSV4bW0yLCV4bW0xCi0gYWRkc3MJCSglZWJ4KSwleG1tMgotIGFkZHNzCQkleG1tNCwleG1tMwotIGFuZG5wcwkJMHgwKCVlYnApLCV4bW00Ci0gYW5kbnBzCQkleG1tNiwleG1tNQotIGFuZHBzCQkoJWVkaSksJXhtbTYKLSBhbmRwcwkJJXhtbTAsJXhtbTcKLSBjbXBwcwkJJDB4MiwleG1tMSwleG1tMAotIGNtcHBzCQkkMHgzLCglZWR4KSwleG1tMQotIGNtcHNzCQkkMHg0LCV4bW0yLCV4bW0yCi0gY21wc3MJCSQweDUsKCVlc3AsMSksJXhtbTMKLSBjbXBwcwkJJDB4NiwleG1tNSwleG1tNAotIGNtcHBzCQkkMHg3LCglZXNpKSwleG1tNQotIGNtcHNzCQkkMHgwLCV4bW03LCV4bW02Ci0gY21wc3MJCSQweDEsKCVlYXgpLCV4bW03Ci0gY21wZXFwcwkleG1tMSwleG1tMAotIGNtcGVxcHMJKCVlZHgpLCV4bW0xCi0gY21wZXFzcwkleG1tMiwleG1tMgotIGNtcGVxc3MJKCVlc3AsMSksJXhtbTMKLSBjbXBsdHBzCSV4bW01LCV4bW00Ci0gY21wbHRwcwkoJWVzaSksJXhtbTUKLSBjbXBsdHNzCSV4bW03LCV4bW02Ci0gY21wbHRzcwkoJWVheCksJXhtbTcKLSBjbXBsZXBzCSglZWN4KSwleG1tMAotIGNtcGxlcHMJJXhtbTIsJXhtbTEKLSBjbXBsZXNzCSglZWJ4KSwleG1tMgotIGNtcGxlc3MJJXhtbTQsJXhtbTMKLSBjbXB1bm9yZHBzCTB4MCglZWJwKSwleG1tNAotIGNtcHVub3JkcHMJJXhtbTYsJXhtbTUKLSBjbXB1bm9yZHNzCSglZWRpKSwleG1tNgotIGNtcHVub3Jkc3MJJXhtbTAsJXhtbTcKLSBjbXBuZXFwcwkleG1tMSwleG1tMAotIGNtcG5lcXBzCSglZWR4KSwleG1tMQotIGNtcG5lcXNzCSV4bW0yLCV4bW0yCi0gY21wbmVxc3MJKCVlc3AsMSksJXhtbTMKLSBjbXBubHRwcwkleG1tNSwleG1tNAotIGNtcG5sdHBzCSglZXNpKSwleG1tNQotIGNtcG5sdHNzCSV4bW03LCV4bW02Ci0gY21wbmx0c3MJKCVlYXgpLCV4bW03Ci0gY21wbmxlcHMJKCVlY3gpLCV4bW0wCi0gY21wbmxlcHMJJXhtbTIsJXhtbTEKLSBjbXBubGVzcwkoJWVieCksJXhtbTIKLSBjbXBubGVzcwkleG1tNCwleG1tMwotIGNtcG9yZHBzCTB4MCglZWJwKSwleG1tNAotIGNtcG9yZHBzCSV4bW02LCV4bW01Ci0gY21wb3Jkc3MJKCVlZGkpLCV4bW02Ci0gY21wb3Jkc3MJJXhtbTAsJXhtbTcKLSBjb21pc3MJCSV4bW0xLCV4bW0wCi0gY29taXNzCQkoJWVkeCksJXhtbTEKLSBjdnRwaTJwcwklbW0zLCV4bW0yCi0gY3Z0cGkycHMJKCVlc3AsMSksJXhtbTMKLSBjdnRzaTJzcwklZWJwLCV4bW00Ci0gY3Z0c2kyc3MJKCVlc2kpLCV4bW01Ci0gY3Z0cHMycGkJJXhtbTcsJW1tNgotIGN2dHBzMnBpCSglZWF4KSwlbW03Ci0gY3Z0c3Myc2kJKCVlY3gpLCVlYXgKLSBjdnRzczJzaQkleG1tMiwlZWN4Ci0gY3Z0dHBzMnBpCSglZWJ4KSwlbW0yCi0gY3Z0dHBzMnBpCSV4bW00LCVtbTMKLSBjdnR0c3Myc2kJMHgwKCVlYnApLCVlc3AKLSBjdnR0c3Myc2kJJXhtbTYsJWVicAotIGRpdnBzCQkleG1tMSwleG1tMAotIGRpdnBzCQkoJWVkeCksJXhtbTEKLSBkaXZzcwkJJXhtbTMsJXhtbTIKLSBkaXZzcwkJKCVlc3AsMSksJXhtbTMKLSBsZG14Y3NyCTB4MCglZWJwKQotIHN0bXhjc3IJKCVlc2kpCi0gc2ZlbmNlCi0gbWF4cHMJCSV4bW0xLCV4bW0wCi0gbWF4cHMJCSglZWR4KSwleG1tMQotIG1heHNzCQkleG1tMywleG1tMgotIG1heHNzCQkoJWVzcCwxKSwleG1tMwotIG1pbnBzCQkleG1tNSwleG1tNAotIG1pbnBzCQkoJWVzaSksJXhtbTUKLSBtaW5zcwkJJXhtbTcsJXhtbTYKLSBtaW5zcwkJKCVlYXgpLCV4bW03Ci0gbW92YXBzCQkleG1tMSwleG1tMAotIG1vdmFwcwkJJXhtbTIsKCVlY3gpCi0gbW92YXBzCQkoJWVkeCksJXhtbTIKLSBtb3ZsaHBzCSV4bW00LCV4bW0zCi0gbW92aHBzCQkleG1tNSwoJWVzcCwxKQotIG1vdmhwcwkJKCVlc2kpLCV4bW01Ci0gbW92aGxwcwkleG1tNywleG1tNgotIG1vdmxwcwkJJXhtbTAsKCVlZGkpCi0gbW92bHBzCQkoJWVheCksJXhtbTAKLSBtb3Ztc2twcwkleG1tMiwlZWN4Ci0gbW92dXBzCQkleG1tMywleG1tMgotIG1vdnVwcwkJJXhtbTQsKCVlZHgpCi0gbW92dXBzCQkweDAoJWVicCksJXhtbTQKLSBtb3ZzcwkJJXhtbTYsJXhtbTUKLSBtb3ZzcwkJJXhtbTcsKCVlc2kpCi0gbW92c3MJCSglZWF4KSwleG1tNwotIG11bHBzCQkleG1tMSwleG1tMAotIG11bHBzCQkoJWVkeCksJXhtbTEKLSBtdWxzcwkJJXhtbTIsJXhtbTIKLSBtdWxzcwkJKCVlc3AsMSksJXhtbTMKLSBvcnBzCQkleG1tNSwleG1tNAotIG9ycHMJCSglZXNpKSwleG1tNQotIHJjcHBzCQkleG1tNywleG1tNgotIHJjcHBzCQkoJWVheCksJXhtbTcKLSByY3BzcwkJKCVlY3gpLCV4bW0wCi0gcmNwc3MJCSV4bW0yLCV4bW0xCi0gcnNxcnRwcwkoJWVieCksJXhtbTIKLSByc3FydHBzCSV4bW00LCV4bW0zCi0gcnNxcnRzcwkweDAoJWVicCksJXhtbTQKLSByc3FydHNzCSV4bW02LCV4bW01Ci0gc2h1ZnBzCQkkMHgyLCglZWRpKSwleG1tNgotIHNodWZwcwkJJDB4MywleG1tMCwleG1tNwotIHNxcnRwcwkJJXhtbTEsJXhtbTAKLSBzcXJ0cHMJCSglZWR4KSwleG1tMQotIHNxcnRzcwkJJXhtbTIsJXhtbTIKLSBzcXJ0c3MJCSglZXNwLDEpLCV4bW0zCi0gc3VicHMJCSV4bW01LCV4bW00Ci0gc3VicHMJCSglZXNpKSwleG1tNQotIHN1YnNzCQkleG1tNywleG1tNgotIHN1YnNzCQkoJWVheCksJXhtbTcKLSB1Y29taXNzCSglZWN4KSwleG1tMAotIHVjb21pc3MJJXhtbTIsJXhtbTEKLSB1bnBja2hwcwkoJWVieCksJXhtbTIKLSB1bnBja2hwcwkleG1tNCwleG1tMwotIHVucGNrbHBzCTB4MCglZWJwKSwleG1tNAotIHVucGNrbHBzCSV4bW02LCV4bW01Ci0geG9ycHMJCSglZWRpKSwleG1tNgotIHhvcnBzCQkleG1tMCwleG1tNwotIHBhdmdiCQklbW0xLCVtbTAKLSBwYXZnYgkJKCVlZHgpLCVtbTEKLSBwYXZndwkJJW1tMywlbW0yCi0gcGF2Z3cJCSglZXNwLDEpLCVtbTMKLSBwZXh0cncJCSQweDAsJW1tMSwlZWF4Ci0gcGluc3J3CQkkMHgxLCglZWN4KSwlbW0xCi0gcGluc3J3CQkkMHgyLCVlZHgsJW1tMgotIHBtYXhzdwkJJW1tMSwlbW0wCi0gcG1heHN3CQkoJWVkeCksJW1tMQotIHBtYXh1YgkJJW1tMiwlbW0yCi0gcG1heHViCQkoJWVzcCwxKSwlbW0zCi0gcG1pbnN3CQklbW01LCVtbTQKLSBwbWluc3cJCSglZXNpKSwlbW01Ci0gcG1pbnViCQklbW03LCVtbTYKLSBwbWludWIJCSglZWF4KSwlbW03Ci0gcG1vdm1za2IJJW1tNSwlZWF4Ci0gcG11bGh1dwklbW01LCVtbTQKLSBwbXVsaHV3CSglZXNpKSwlbW01Ci0gcHNhZGJ3CQklbW03LCVtbTYKLSBwc2FkYncJCSglZWF4KSwlbW03Ci0gcHNodWZ3CQkkMHgxLCVtbTIsJW1tMwotIHBzaHVmdwkJJDB4NCwweDAoJWVicCksJW1tNgotIG1hc2ttb3ZxCSVtbTcsJW1tMAotIG1vdm50cHMJJXhtbTYsKCVlYngpCi0gbW92bnRxCQklbW0yLCglZWF4KQotIHByZWZldGNobnRhCSglZXNpKQotIHByZWZldGNodDAJKCVlYXgsJWVieCw0KQotIHByZWZldGNodDEJKCVlZHgpCi0gcHJlZmV0Y2h0MgkoJWVjeCkKLQotIyBBIFNJTUQgaW5zdHJ1Y3Rpb24gd2l0aCBhIGJhZCBleHRlbnNpb24gYnl0ZQotLmJ5dGUgMHgyRSwweDBGLDB4QzIsMHgwQSwweDA4Ci0gbm9wCi0gbm9wCi0jIEEgYmFkIHNmZW5jZSBtb2RybSBieXRlCi0uYnl0ZSAweDY1LDB4MEYsMHhBRSwweGZmCi0jIFBhZCBvdXQgdG8gZ29vZCBhbGlnbm1lbnQKLSAucDJhbGlnbiA0LDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbW9kcm0ubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbW9kcm0ubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzYjA5Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLmwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTg0ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjoxMjg6IFdhcm5pbmc6LioKLS4qOjEyOTogV2FybmluZzouKgotLio6MTMwOiBXYXJuaW5nOi4qCi0uKjoxMzE6IFdhcm5pbmc6LioKLS4qOjEzMjogV2FybmluZzouKgotLio6MTMzOiBXYXJuaW5nOi4qCi0uKjoxMzQ6IFdhcm5pbmc6LioKLS4qOjEzNTogV2FybmluZzouKgotLio6MTkyOiBXYXJuaW5nOi4qCi0uKjoxOTM6IFdhcm5pbmc6LioKLS4qOjE5NDogV2FybmluZzouKgotLio6MTk1OiBXYXJuaW5nOi4qCi0uKjoxOTY6IFdhcm5pbmc6LioKLS4qOjE5NzogV2FybmluZzouKgotLio6MTk4OiBXYXJuaW5nOi4qCi0uKjoxOTk6IFdhcm5pbmc6LioKLS4qOjI1NjogV2FybmluZzouKgotLio6MjU3OiBXYXJuaW5nOi4qCi0uKjoyNTg6IFdhcm5pbmc6LioKLS4qOjI1OTogV2FybmluZzouKgotLio6MjYwOiBXYXJuaW5nOi4qCi0uKjoyNjE6IFdhcm5pbmc6LioKLS4qOjI2MjogV2FybmluZzouKgotLio6MjYzOiBXYXJuaW5nOi4qCi0uKjozODQ6IFdhcm5pbmc6LioKLS4qOjM4NTogV2FybmluZzouKgotLio6Mzg2OiBXYXJuaW5nOi4qCi0uKjozODc6IFdhcm5pbmc6LioKLS4qOjM4ODogV2FybmluZzouKgotLio6Mzg5OiBXYXJuaW5nOi4qCi0uKjozOTA6IFdhcm5pbmc6LioKLS4qOjM5MTogV2FybmluZzouKgotLio6NDQ4OiBXYXJuaW5nOi4qCi0uKjo0NDk6IFdhcm5pbmc6LioKLS4qOjQ1MDogV2FybmluZzouKgotLio6NDUxOiBXYXJuaW5nOi4qCi0uKjo0NTI6IFdhcm5pbmc6LioKLS4qOjQ1MzogV2FybmluZzouKgotLio6NDU0OiBXYXJuaW5nOi4qCi0uKjo0NTU6IFdhcm5pbmc6LioKLS4qOjUxMjogV2FybmluZzouKgotLio6NTEzOiBXYXJuaW5nOi4qCi0uKjo1MTQ6IFdhcm5pbmc6LioKLS4qOjUxNTogV2FybmluZzouKgotLio6NTE2OiBXYXJuaW5nOi4qCi0uKjo1MTc6IFdhcm5pbmc6LioKLS4qOjUxODogV2FybmluZzouKgotLio6NTE5OiBXYXJuaW5nOi4qCi0uKjo2NDA6IFdhcm5pbmc6LioKLS4qOjY0MTogV2FybmluZzouKgotLio6NjQyOiBXYXJuaW5nOi4qCi0uKjo2NDM6IFdhcm5pbmc6LioKLS4qOjY0NDogV2FybmluZzouKgotLio6NjQ1OiBXYXJuaW5nOi4qCi0uKjo2NDY6IFdhcm5pbmc6LioKLS4qOjY0NzogV2FybmluZzouKgotLio6NzA0OiBXYXJuaW5nOi4qCi0uKjo3MDU6IFdhcm5pbmc6LioKLS4qOjcwNjogV2FybmluZzouKgotLio6NzA3OiBXYXJuaW5nOi4qCi0uKjo3MDg6IFdhcm5pbmc6LioKLS4qOjcwOTogV2FybmluZzouKgotLio6NzEwOiBXYXJuaW5nOi4qCi0uKjo3MTE6IFdhcm5pbmc6LioKLS4qOjc2ODogV2FybmluZzouKgotLio6NzY5OiBXYXJuaW5nOi4qCi0uKjo3NzA6IFdhcm5pbmc6LioKLS4qOjc3MTogV2FybmluZzouKgotLio6NzcyOiBXYXJuaW5nOi4qCi0uKjo3NzM6IFdhcm5pbmc6LioKLS4qOjc3NDogV2FybmluZzouKgotLio6Nzc1OiBXYXJuaW5nOi4qCi0uKjo4MTI6IFdhcm5pbmc6LioKLS4qOjgyMDogV2FybmluZzouKgotLio6ODI4OiBXYXJuaW5nOi4qCi0uKjo4MzM6IFdhcm5pbmc6LioKLS4qOjgzNDogV2FybmluZzouKgotLio6ODM1OiBXYXJuaW5nOi4qCi0uKjo5NjE6IFdhcm5pbmc6LioKLS4qOjk2MjogV2FybmluZzouKgotLio6OTYzOiBXYXJuaW5nOi4qCi0uKjo5NjQ6IFdhcm5pbmc6LioKLS4qOjk2NTogV2FybmluZzouKgotLio6OTY2OiBXYXJuaW5nOi4qCi0uKjo5Njc6IFdhcm5pbmc6LioKLS4qOjk2ODogV2FybmluZzouKgotLio6MTAyNTogV2FybmluZzouKgotLio6MTAyNjogV2FybmluZzouKgotLio6MTAyNzogV2FybmluZzouKgotLio6MTAyODogV2FybmluZzouKgotLio6MTAyOTogV2FybmluZzouKgotLio6MTAzMDogV2FybmluZzouKgotLio6MTAzMTogV2FybmluZzouKgotLio6MTAzMjogV2FybmluZzouKgotLio6MTA4OTogV2FybmluZzouKgotLio6MTA5MDogV2FybmluZzouKgotLio6MTA5MTogV2FybmluZzouKgotLio6MTA5MjogV2FybmluZzouKgotLio6MTA5MzogV2FybmluZzouKgotLio6MTA5NDogV2FybmluZzouKgotLio6MTA5NTogV2FybmluZzouKgotLio6MTA5NjogV2FybmluZzouKgotLio6MTIxNzogV2FybmluZzouKgotLio6MTIxODogV2FybmluZzouKgotLio6MTIxOTogV2FybmluZzouKgotLio6MTIyMDogV2FybmluZzouKgotLio6MTIyMTogV2FybmluZzouKgotLio6MTIyMjogV2FybmluZzouKgotLio6MTIyMzogV2FybmluZzouKgotLio6MTIyNDogV2FybmluZzouKgotLio6MTI4MTogV2FybmluZzouKgotLio6MTI4MjogV2FybmluZzouKgotLio6MTI4MzogV2FybmluZzouKgotLio6MTI4NDogV2FybmluZzouKgotLio6MTI4NTogV2FybmluZzouKgotLio6MTI4NjogV2FybmluZzouKgotLio6MTI4NzogV2FybmluZzouKgotLio6MTI4ODogV2FybmluZzouKgotLio6MTM0NTogV2FybmluZzouKgotLio6MTM0NjogV2FybmluZzouKgotLio6MTM0NzogV2FybmluZzouKgotLio6MTM0ODogV2FybmluZzouKgotLio6MTM0OTogV2FybmluZzouKgotLio6MTM1MDogV2FybmluZzouKgotLio6MTM1MTogV2FybmluZzouKgotLio6MTM1MjogV2FybmluZzouKgotLio6MTQ3MzogV2FybmluZzouKgotLio6MTQ3NDogV2FybmluZzouKgotLio6MTQ3NTogV2FybmluZzouKgotLio6MTQ3NjogV2FybmluZzouKgotLio6MTQ3NzogV2FybmluZzouKgotLio6MTQ3ODogV2FybmluZzouKgotLio6MTQ3OTogV2FybmluZzouKgotLio6MTQ4MDogV2FybmluZzouKgotLio6MTUzNzogV2FybmluZzouKgotLio6MTUzODogV2FybmluZzouKgotLio6MTUzOTogV2FybmluZzouKgotLio6MTU0MDogV2FybmluZzouKgotLio6MTU0MTogV2FybmluZzouKgotLio6MTU0MjogV2FybmluZzouKgotLio6MTU0MzogV2FybmluZzouKgotLio6MTU0NDogV2FybmluZzouKgotLio6MTYwMTogV2FybmluZzouKgotLio6MTYwMjogV2FybmluZzouKgotLio6MTYwMzogV2FybmluZzouKgotLio6MTYwNDogV2FybmluZzouKgotLio6MTYwNTogV2FybmluZzouKgotLio6MTYwNjogV2FybmluZzouKgotLio6MTYwNzogV2FybmluZzouKgotLio6MTYwODogV2FybmluZzouKgotLio6MTY0NTogV2FybmluZzouKgotLio6MTY1MzogV2FybmluZzouKgotLio6MTY2MTogV2FybmluZzouKgotLio6MTY2NjogV2FybmluZzouKgotLio6MTY2NzogV2FybmluZzouKgotLio6MTY2ODogV2FybmluZzouKgotICAgMSAgICAgICAgICAgICAgICAgICAgICAgCS5wc2l6ZSAwCi0gICAyICAgICAgICAgICAgICAgICAgICAgICAJLnRleHQKLSAgIDMgMDAwMCAzNjhDMTggICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheFwpCi0gICA0IDAwMDMgMzY4QzE5ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3hcKQotICAgNSAwMDA2IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4XCkKLSAgIDYgMDAwOSAzNjhDMUIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieFwpCi0gICA3IDAwMGMgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczowCi0gICA4IDAwMTMgMzY4QzFFICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2lcKQotICAgOSAwMDE2IDM2OEMxRiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpXCkKLSAgMTAgMDAxOSAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXhcKQotICAxMSAwMDFkIDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeFwpCi0gIDEyIDAwMjEgMzY4QzVBMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4XCkKLSAgMTMgMDAyNSAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnhcKQotICAxNCAwMDI5IDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicFwpCi0gIDE1IDAwMmMgMzY4QzVFMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpXCkKLSAgMTYgMDAzMCAzNjhDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGlcKQotICAxNyAwMDM0IDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheFwpCi0gIDE4IDAwM2IgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4XCkKLSAgMTkgMDA0MiAzNjhDOUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHhcKQotICAyMCAwMDQ5IDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieFwpCi0gIDIxIDAwNTAgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwXCkKLSAgMjIgMDA1NiAzNjhDOUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2lcKQotICAyMyAwMDVkIDM2OEM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaVwpCi0gIDI0IDAwNjQgOENEOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYXgKLSAgMjUgMDA2NiA4Q0Q5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWVjeAotICAyNiAwMDY4IDhDREEgICAgICAgICAgICAgIAkJbW92CSVkcywlZWR4Ci0gIDI3IDAwNmEgOENEQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYngKLSAgMjggMDA2YyA4Q0RDICAgICAgICAgICAgICAJCW1vdgklZHMsJWVzcAotICAyOSAwMDZlIDhDREQgICAgICAgICAgICAgIAkJbW92CSVkcywlZWJwCi0gIDMwIDAwNzAgOENERSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlc2kKLSAgMzEgMDA3MiA4Q0RGICAgICAgICAgICAgICAJCW1vdgklZHMsJWVkaQotICAzMiAwMDc0IDM2OEMxQzAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYXgsMVwpCi0gIDMzIDAwNzggMzY4QzFDMDEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVheCwxXCkKLSAgMzQgMDA3YyAzNjhDMUMwMiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWF4LDFcKQotICAzNSAwMDgwIDM2OEMxQzAzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYXgsMVwpCi0gIDM2IDAwODQgOEMxQzA0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVheCwxXCkKLSAgMzcgMDA4NyAzNjhDMUMwNSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYXgsMVwpCi0gIDM4IDAwOGYgMzY4QzFDMDYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVheCwxXCkKLSAgMzkgMDA5MyAzNjhDMUMwNyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWF4LDFcKQotICA0MCAwMDk3IDM2OEMxQzA4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlY3gsMVwpCi0gIDQxIDAwOWIgMzY4QzFDMDkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVjeCwxXCkKLSAgNDIgMDA5ZiAzNjhDMUMwQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWN4LDFcKQotICA0MyAwMGEzIDM2OEMxQzBCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlY3gsMVwpCi0gIDQ0IDAwYTcgOEMxQzBDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVjeCwxXCkKLSAgNDUgMDBhYSAzNjhDMUMwRCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlY3gsMVwpCi0gIDQ2IDAwYjIgMzY4QzFDMEUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVjeCwxXCkKLSAgNDcgMDBiNiAzNjhDMUMwRiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWN4LDFcKQotICA0OCAwMGJhIDM2OEMxQzEwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlZHgsMVwpCi0gIDQ5IDAwYmUgMzY4QzFDMTEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVkeCwxXCkKLSAgNTAgMDBjMiAzNjhDMUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWR4LDFcKQotICA1MSAwMGM2IDM2OEMxQzEzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlZHgsMVwpCi0gIDUyIDAwY2EgOEMxQzE0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVkeCwxXCkKLSAgNTMgMDBjZCAzNjhDMUMxNSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlZHgsMVwpCi0gIDU0IDAwZDUgMzY4QzFDMTYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVkeCwxXCkKLSAgNTUgMDBkOSAzNjhDMUMxNyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWR4LDFcKQotICA1NiAwMGRkIDM2OEMxQzE4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYngsMVwpCi0gIDU3IDAwZTEgMzY4QzFDMTkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVieCwxXCkKLSAgNTggMDBlNSAzNjhDMUMxQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWJ4LDFcKQotICA1OSAwMGU5IDM2OEMxQzFCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYngsMVwpCi0gIDYwIDAwZWQgOEMxQzFDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVieCwxXCkKLSAgNjEgMDBmMCAzNjhDMUMxRCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYngsMVwpCi0gIDYyIDAwZjggMzY4QzFDMUUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVieCwxXCkKLSAgNjMgMDBmYyAzNjhDMUMxRiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWJ4LDFcKQotICA2NCAwMTAwIDM2OEMxOCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LDFcKQotICA2NSAwMTAzIDM2OEMxOSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LDFcKQotICA2NiAwMTA2IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LDFcKQotICA2NyAwMTA5IDM2OEMxQiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LDFcKQotICA2OCAwMTBjIDhDMUMyNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLDFcKQotICA2OSAwMTBmIDM2OEMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6XCgsMVwpCi0gIDcwIDAxMTYgMzY4QzFFICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksMVwpCi0gIDcxIDAxMTkgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksMVwpCi0gIDcyIDAxMWMgMzY4QzFDMjggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVicCwxXCkKLSAgNzMgMDEyMCAzNjhDMUMyOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJwLDFcKQotICA3NCAwMTI0IDM2OEMxQzJBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYnAsMVwpCi0gIDc1IDAxMjggMzY4QzFDMkIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVicCwxXCkKLSAgNzYgMDEyYyA4QzFDMkMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJwLDFcKQotICA3NyAwMTJmIDM2OEMxQzJEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVicCwxXCkKLSAgNzggMDEzNyAzNjhDMUMyRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJwLDFcKQotICA3OSAwMTNiIDM2OEMxQzJGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYnAsMVwpCi0gIDgwIDAxM2YgMzY4QzFDMzAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVzaSwxXCkKLSAgODEgMDE0MyAzNjhDMUMzMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZXNpLDFcKQotICA4MiAwMTQ3IDM2OEMxQzMyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlc2ksMVwpCi0gIDgzIDAxNGIgMzY4QzFDMzMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVzaSwxXCkKLSAgODQgMDE0ZiA4QzFDMzQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZXNpLDFcKQotICA4NSAwMTUyIDM2OEMxQzM1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVzaSwxXCkKLSAgODYgMDE1YSAzNjhDMUMzNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZXNpLDFcKQotICA4NyAwMTVlIDM2OEMxQzM3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlc2ksMVwpCi0gIDg4IDAxNjIgMzY4QzFDMzggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkaSwxXCkKLSAgODkgMDE2NiAzNjhDMUMzOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWRpLDFcKQotICA5MCAwMTZhIDM2OEMxQzNBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZGksMVwpCi0gIDkxIDAxNmUgMzY4QzFDM0IgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkaSwxXCkKLSAgOTIgMDE3MiA4QzFDM0MgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWRpLDFcKQotICA5MyAwMTc1IDM2OEMxQzNEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkaSwxXCkKLSAgOTQgMDE3ZCAzNjhDMUMzRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWRpLDFcKQotICA5NSAwMTgxIDM2OEMxQzNGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZGksMVwpCi0gIDk2IDAxODUgMzY4QzFDNDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVheCwyXCkKLSAgOTcgMDE4OSAzNjhDMUM0MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWF4LDJcKQotICA5OCAwMThkIDM2OEMxQzQyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYXgsMlwpCi0gIDk5IDAxOTEgMzY4QzFDNDMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVheCwyXCkKLSAxMDAgMDE5NSA4QzFDNDQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWF4LDJcKQotIDEwMSAwMTk4IDM2OEMxQzQ1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVheCwyXCkKLSAxMDIgMDFhMCAzNjhDMUM0NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWF4LDJcKQotIDEwMyAwMWE0IDM2OEMxQzQ3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYXgsMlwpCi0gMTA0IDAxYTggMzY4QzFDNDggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVjeCwyXCkKLSAxMDUgMDFhYyAzNjhDMUM0OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWN4LDJcKQotIDEwNiAwMWIwIDM2OEMxQzRBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlY3gsMlwpCi0gMTA3IDAxYjQgMzY4QzFDNEIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVjeCwyXCkKLSAxMDggMDFiOCA4QzFDNEMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWN4LDJcKQotIDEwOSAwMWJiIDM2OEMxQzREIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVjeCwyXCkKLSAxMTAgMDFjMyAzNjhDMUM0RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWN4LDJcKQotIDExMSAwMWM3IDM2OEMxQzRGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlY3gsMlwpCi0gMTEyIDAxY2IgMzY4QzFDNTAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkeCwyXCkKLSAxMTMgMDFjZiAzNjhDMUM1MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWR4LDJcKQotIDExNCAwMWQzIDM2OEMxQzUyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZHgsMlwpCi0gMTE1IDAxZDcgMzY4QzFDNTMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkeCwyXCkKLSAxMTYgMDFkYiA4QzFDNTQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWR4LDJcKQotIDExNyAwMWRlIDM2OEMxQzU1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkeCwyXCkKLSAxMTggMDFlNiAzNjhDMUM1NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWR4LDJcKQotIDExOSAwMWVhIDM2OEMxQzU3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZHgsMlwpCi0gMTIwIDAxZWUgMzY4QzFDNTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVieCwyXCkKLSAxMjEgMDFmMiAzNjhDMUM1OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJ4LDJcKQotIDEyMiAwMWY2IDM2OEMxQzVBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYngsMlwpCi0gMTIzIDAxZmEgMzY4QzFDNUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVieCwyXCkKLSAxMjQgMDFmZSA4QzFDNUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJ4LDJcKQotIDEyNSAwMjAxIDM2OEMxQzVEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVieCwyXCkKLSAxMjYgMDIwOSAzNjhDMUM1RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJ4LDJcKQotIDEyNyAwMjBkIDM2OEMxQzVGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYngsMlwpCi0gMTI4IDAyMTEgMzY4QzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsMlwpCi0uKldhcm5pbmc6LioKLSAxMjkgMDIxNCAzNjhDMTkgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwyXCkKLS4qV2FybmluZzouKgotIDEzMCAwMjE3IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gMTMxIDAyMWEgMzY4QzFCICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsMlwpCi0uKldhcm5pbmc6LioKLSAxMzIgMDIxZCA4QzFDMjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwyXCkKLS4qV2FybmluZzouKgotIDEzMyAwMjIwIDM2OEMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6XCgsMlwpCi0uKldhcm5pbmc6LioKLSAxMzQgMDIyNyAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDEzNSAwMjJhIDM2OEMxRiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLDJcKQotLipXYXJuaW5nOi4qCi0gMTM2IDAyMmQgMzY4QzFDNjggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVicCwyXCkKLSAxMzcgMDIzMSAzNjhDMUM2OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJwLDJcKQotIDEzOCAwMjM1IDM2OEMxQzZBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYnAsMlwpCi0gMTM5IDAyMzkgMzY4QzFDNkIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVicCwyXCkKLSAxNDAgMDIzZCA4QzFDNkMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJwLDJcKQotIDE0MSAwMjQwIDM2OEMxQzZEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVicCwyXCkKLSAxNDIgMDI0OCAzNjhDMUM2RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJwLDJcKQotIDE0MyAwMjRjIDM2OEMxQzZGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYnAsMlwpCi0gMTQ0IDAyNTAgMzY4QzFDNzAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVzaSwyXCkKLSAxNDUgMDI1NCAzNjhDMUM3MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZXNpLDJcKQotIDE0NiAwMjU4IDM2OEMxQzcyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlc2ksMlwpCi0gMTQ3IDAyNWMgMzY4QzFDNzMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVzaSwyXCkKLSAxNDggMDI2MCA4QzFDNzQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZXNpLDJcKQotIDE0OSAwMjYzIDM2OEMxQzc1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVzaSwyXCkKLSAxNTAgMDI2YiAzNjhDMUM3NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZXNpLDJcKQotIDE1MSAwMjZmIDM2OEMxQzc3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlc2ksMlwpCi0gMTUyIDAyNzMgMzY4QzFDNzggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkaSwyXCkKLSAxNTMgMDI3NyAzNjhDMUM3OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWRpLDJcKQotIDE1NCAwMjdiIDM2OEMxQzdBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZGksMlwpCi0gMTU1IDAyN2YgMzY4QzFDN0IgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkaSwyXCkKLSAxNTYgMDI4MyA4QzFDN0MgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWRpLDJcKQotIDE1NyAwMjg2IDM2OEMxQzdEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkaSwyXCkKLSAxNTggMDI4ZSAzNjhDMUM3RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWRpLDJcKQotIDE1OSAwMjkyIDM2OEMxQzdGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZGksMlwpCi0gMTYwIDAyOTYgMzY4QzFDODAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVheCw0XCkKLSAxNjEgMDI5YSAzNjhDMUM4MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWF4LDRcKQotIDE2MiAwMjllIDM2OEMxQzgyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYXgsNFwpCi0gMTYzIDAyYTIgMzY4QzFDODMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVheCw0XCkKLSAxNjQgMDJhNiA4QzFDODQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWF4LDRcKQotIDE2NSAwMmE5IDM2OEMxQzg1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVheCw0XCkKLSAxNjYgMDJiMSAzNjhDMUM4NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWF4LDRcKQotIDE2NyAwMmI1IDM2OEMxQzg3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYXgsNFwpCi0gMTY4IDAyYjkgMzY4QzFDODggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVjeCw0XCkKLSAxNjkgMDJiZCAzNjhDMUM4OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWN4LDRcKQotIDE3MCAwMmMxIDM2OEMxQzhBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlY3gsNFwpCi0gMTcxIDAyYzUgMzY4QzFDOEIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVjeCw0XCkKLSAxNzIgMDJjOSA4QzFDOEMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWN4LDRcKQotIDE3MyAwMmNjIDM2OEMxQzhEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVjeCw0XCkKLSAxNzQgMDJkNCAzNjhDMUM4RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWN4LDRcKQotIDE3NSAwMmQ4IDM2OEMxQzhGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlY3gsNFwpCi0gMTc2IDAyZGMgMzY4QzFDOTAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkeCw0XCkKLSAxNzcgMDJlMCAzNjhDMUM5MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWR4LDRcKQotIDE3OCAwMmU0IDM2OEMxQzkyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZHgsNFwpCi0gMTc5IDAyZTggMzY4QzFDOTMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkeCw0XCkKLSAxODAgMDJlYyA4QzFDOTQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWR4LDRcKQotIDE4MSAwMmVmIDM2OEMxQzk1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkeCw0XCkKLSAxODIgMDJmNyAzNjhDMUM5NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWR4LDRcKQotIDE4MyAwMmZiIDM2OEMxQzk3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZHgsNFwpCi0gMTg0IDAyZmYgMzY4QzFDOTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVieCw0XCkKLSAxODUgMDMwMyAzNjhDMUM5OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJ4LDRcKQotIDE4NiAwMzA3IDM2OEMxQzlBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYngsNFwpCi0gMTg3IDAzMGIgMzY4QzFDOUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVieCw0XCkKLSAxODggMDMwZiA4QzFDOUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJ4LDRcKQotIDE4OSAwMzEyIDM2OEMxQzlEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVieCw0XCkKLSAxOTAgMDMxYSAzNjhDMUM5RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJ4LDRcKQotIDE5MSAwMzFlIDM2OEMxQzlGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYngsNFwpCi0gMTkyIDAzMjIgMzY4QzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsNFwpCi0uKldhcm5pbmc6LioKLSAxOTMgMDMyNSAzNjhDMTkgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDE5NCAwMzI4IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LDRcKQotLipXYXJuaW5nOi4qCi0gMTk1IDAzMmIgMzY4QzFCICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsNFwpCi0uKldhcm5pbmc6LioKLSAxOTYgMDMyZSA4QzFDMjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDE5NyAwMzMxIDM2OEMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6XCgsNFwpCi0uKldhcm5pbmc6LioKLSAxOTggMDMzOCAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSw0XCkKLS4qV2FybmluZzouKgotIDE5OSAwMzNiIDM2OEMxRiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gMjAwIDAzM2UgMzY4QzFDQTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVicCw0XCkKLSAyMDEgMDM0MiAzNjhDMUNBOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJwLDRcKQotIDIwMiAwMzQ2IDM2OEMxQ0FBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYnAsNFwpCi0gMjAzIDAzNGEgMzY4QzFDQUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVicCw0XCkKLSAyMDQgMDM0ZSA4QzFDQUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJwLDRcKQotIDIwNSAwMzUxIDM2OEMxQ0FEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVicCw0XCkKLSAyMDYgMDM1OSAzNjhDMUNBRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJwLDRcKQotIDIwNyAwMzVkIDM2OEMxQ0FGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYnAsNFwpCi0gMjA4IDAzNjEgMzY4QzFDQjAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVzaSw0XCkKLSAyMDkgMDM2NSAzNjhDMUNCMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZXNpLDRcKQotIDIxMCAwMzY5IDM2OEMxQ0IyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlc2ksNFwpCi0gMjExIDAzNmQgMzY4QzFDQjMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVzaSw0XCkKLSAyMTIgMDM3MSA4QzFDQjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZXNpLDRcKQotIDIxMyAwMzc0IDM2OEMxQ0I1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVzaSw0XCkKLSAyMTQgMDM3YyAzNjhDMUNCNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZXNpLDRcKQotIDIxNSAwMzgwIDM2OEMxQ0I3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlc2ksNFwpCi0gMjE2IDAzODQgMzY4QzFDQjggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkaSw0XCkKLSAyMTcgMDM4OCAzNjhDMUNCOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWRpLDRcKQotIDIxOCAwMzhjIDM2OEMxQ0JBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZGksNFwpCi0gMjE5IDAzOTAgMzY4QzFDQkIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkaSw0XCkKLSAyMjAgMDM5NCA4QzFDQkMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWRpLDRcKQotIDIyMSAwMzk3IDM2OEMxQ0JEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkaSw0XCkKLSAyMjIgMDM5ZiAzNjhDMUNCRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWRpLDRcKQotIDIyMyAwM2EzIDM2OEMxQ0JGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZGksNFwpCi0gMjI0IDAzYTcgMzY4QzFDQzAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVheCw4XCkKLSAyMjUgMDNhYiAzNjhDMUNDMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWF4LDhcKQotIDIyNiAwM2FmIDM2OEMxQ0MyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYXgsOFwpCi0gMjI3IDAzYjMgMzY4QzFDQzMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVheCw4XCkKLSAyMjggMDNiNyA4QzFDQzQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWF4LDhcKQotIDIyOSAwM2JhIDM2OEMxQ0M1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVheCw4XCkKLSAyMzAgMDNjMiAzNjhDMUNDNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWF4LDhcKQotIDIzMSAwM2M2IDM2OEMxQ0M3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYXgsOFwpCi0gMjMyIDAzY2EgMzY4QzFDQzggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVjeCw4XCkKLSAyMzMgMDNjZSAzNjhDMUNDOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWN4LDhcKQotIDIzNCAwM2QyIDM2OEMxQ0NBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlY3gsOFwpCi0gMjM1IDAzZDYgMzY4QzFDQ0IgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVjeCw4XCkKLSAyMzYgMDNkYSA4QzFDQ0MgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWN4LDhcKQotIDIzNyAwM2RkIDM2OEMxQ0NEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVjeCw4XCkKLSAyMzggMDNlNSAzNjhDMUNDRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWN4LDhcKQotIDIzOSAwM2U5IDM2OEMxQ0NGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlY3gsOFwpCi0gMjQwIDAzZWQgMzY4QzFDRDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkeCw4XCkKLSAyNDEgMDNmMSAzNjhDMUNEMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWR4LDhcKQotIDI0MiAwM2Y1IDM2OEMxQ0QyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZHgsOFwpCi0gMjQzIDAzZjkgMzY4QzFDRDMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkeCw4XCkKLSAyNDQgMDNmZCA4QzFDRDQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWR4LDhcKQotIDI0NSAwNDAwIDM2OEMxQ0Q1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkeCw4XCkKLSAyNDYgMDQwOCAzNjhDMUNENiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWR4LDhcKQotIDI0NyAwNDBjIDM2OEMxQ0Q3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZHgsOFwpCi0gMjQ4IDA0MTAgMzY4QzFDRDggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVieCw4XCkKLSAyNDkgMDQxNCAzNjhDMUNEOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJ4LDhcKQotIDI1MCAwNDE4IDM2OEMxQ0RBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYngsOFwpCi0gMjUxIDA0MWMgMzY4QzFDREIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVieCw4XCkKLSAyNTIgMDQyMCA4QzFDREMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJ4LDhcKQotIDI1MyAwNDIzIDM2OEMxQ0REIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVieCw4XCkKLSAyNTQgMDQyYiAzNjhDMUNERSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJ4LDhcKQotIDI1NSAwNDJmIDM2OEMxQ0RGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYngsOFwpCi0gMjU2IDA0MzMgMzY4QzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsOFwpCi0uKldhcm5pbmc6LioKLSAyNTcgMDQzNiAzNjhDMTkgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDI1OCAwNDM5IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LDhcKQotLipXYXJuaW5nOi4qCi0gMjU5IDA0M2MgMzY4QzFCICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsOFwpCi0uKldhcm5pbmc6LioKLSAyNjAgMDQzZiA4QzFDMjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDI2MSAwNDQyIDM2OEMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6XCgsOFwpCi0uKldhcm5pbmc6LioKLSAyNjIgMDQ0OSAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDI2MyAwNDRjIDM2OEMxRiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLDhcKQotLipXYXJuaW5nOi4qCi0gMjY0IDA0NGYgMzY4QzFDRTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVicCw4XCkKLSAyNjUgMDQ1MyAzNjhDMUNFOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJwLDhcKQotIDI2NiAwNDU3IDM2OEMxQ0VBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYnAsOFwpCi0gMjY3IDA0NWIgMzY4QzFDRUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVicCw4XCkKLSAyNjggMDQ1ZiA4QzFDRUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJwLDhcKQotIDI2OSAwNDYyIDM2OEMxQ0VEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVicCw4XCkKLSAyNzAgMDQ2YSAzNjhDMUNFRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJwLDhcKQotIDI3MSAwNDZlIDM2OEMxQ0VGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYnAsOFwpCi0gMjcyIDA0NzIgMzY4QzFDRjAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVzaSw4XCkKLSAyNzMgMDQ3NiAzNjhDMUNGMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZXNpLDhcKQotIDI3NCAwNDdhIDM2OEMxQ0YyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlc2ksOFwpCi0gMjc1IDA0N2UgMzY4QzFDRjMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVzaSw4XCkKLSAyNzYgMDQ4MiA4QzFDRjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZXNpLDhcKQotIDI3NyAwNDg1IDM2OEMxQ0Y1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVzaSw4XCkKLSAyNzggMDQ4ZCAzNjhDMUNGNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZXNpLDhcKQotIDI3OSAwNDkxIDM2OEMxQ0Y3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlc2ksOFwpCi0gMjgwIDA0OTUgMzY4QzFDRjggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkaSw4XCkKLSAyODEgMDQ5OSAzNjhDMUNGQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWRpLDhcKQotIDI4MiAwNDlkIDM2OEMxQ0Y5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZGksOFwpCi0gMjgzIDA0YTEgMzY4QzFDRkIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkaSw4XCkKLSAyODQgMDRhNSA4QzFDRkMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWRpLDhcKQotIDI4NSAwNGE4IDM2OEMxQ0ZEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkaSw4XCkKLSAyODYgMDRiMCAzNjhDMUNGRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWRpLDhcKQotIDI4NyAwNGI0IDM2OEMxQ0ZGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZGksOFwpCi0gMjg4IDA0YjggMzY4QzVDMDAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYXgsMVwpCi0gMjg5IDA0YmQgMzY4QzVDMDEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYXgsMVwpCi0gMjkwIDA0YzIgMzY4QzVDMDIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYXgsMVwpCi0gMjkxIDA0YzcgMzY4QzVDMDMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYXgsMVwpCi0gMjkyIDA0Y2MgOEM1QzA0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYXgsMVwpCi0gMjkzIDA0ZDAgOEM1QzA1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYXgsMVwpCi0gMjk0IDA0ZDQgMzY4QzVDMDYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYXgsMVwpCi0gMjk1IDA0ZDkgMzY4QzVDMDcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYXgsMVwpCi0gMjk2IDA0ZGUgMzY4QzVDMDggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlY3gsMVwpCi0gMjk3IDA0ZTMgMzY4QzVDMDkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlY3gsMVwpCi0gMjk4IDA0ZTggMzY4QzVDMEEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlY3gsMVwpCi0gMjk5IDA0ZWQgMzY4QzVDMEIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlY3gsMVwpCi0gMzAwIDA0ZjIgOEM1QzBDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlY3gsMVwpCi0gMzAxIDA0ZjYgOEM1QzBEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlY3gsMVwpCi0gMzAyIDA0ZmEgMzY4QzVDMEUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlY3gsMVwpCi0gMzAzIDA0ZmYgMzY4QzVDMEYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlY3gsMVwpCi0gMzA0IDA1MDQgMzY4QzVDMTAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlZHgsMVwpCi0gMzA1IDA1MDkgMzY4QzVDMTEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlZHgsMVwpCi0gMzA2IDA1MGUgMzY4QzVDMTIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlZHgsMVwpCi0gMzA3IDA1MTMgMzY4QzVDMTMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlZHgsMVwpCi0gMzA4IDA1MTggOEM1QzE0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlZHgsMVwpCi0gMzA5IDA1MWMgOEM1QzE1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlZHgsMVwpCi0gMzEwIDA1MjAgMzY4QzVDMTYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlZHgsMVwpCi0gMzExIDA1MjUgMzY4QzVDMTcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlZHgsMVwpCi0gMzEyIDA1MmEgMzY4QzVDMTggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYngsMVwpCi0gMzEzIDA1MmYgMzY4QzVDMTkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYngsMVwpCi0gMzE0IDA1MzQgMzY4QzVDMUEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYngsMVwpCi0gMzE1IDA1MzkgMzY4QzVDMUIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYngsMVwpCi0gMzE2IDA1M2UgOEM1QzFDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYngsMVwpCi0gMzE3IDA1NDIgOEM1QzFEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYngsMVwpCi0gMzE4IDA1NDYgMzY4QzVDMUUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYngsMVwpCi0gMzE5IDA1NGIgMzY4QzVDMUYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYngsMVwpCi0gMzIwIDA1NTAgMzY4QzU4MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LDFcKQotIDMyMSAwNTU0IDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwxXCkKLSAzMjIgMDU1OCAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsMVwpCi0gMzIzIDA1NWMgMzY4QzVCMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LDFcKQotIDMyNCAwNTYwIDhDNUMyNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwxXCkKLSAzMjUgMDU2NCA4QzVEMTIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsMVwpCi0gMzI2IDA1NjcgMzY4QzVFMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLDFcKQotIDMyNyAwNTZiIDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwxXCkKLSAzMjggMDU2ZiAzNjhDNUMyOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVicCwxXCkKLSAzMjkgMDU3NCAzNjhDNUMyOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVicCwxXCkKLSAzMzAgMDU3OSAzNjhDNUMyQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVicCwxXCkKLSAzMzEgMDU3ZSAzNjhDNUMyQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVicCwxXCkKLSAzMzIgMDU4MyA4QzVDMkMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVicCwxXCkKLSAzMzMgMDU4NyA4QzVDMkQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVicCwxXCkKLSAzMzQgMDU4YiAzNjhDNUMyRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVicCwxXCkKLSAzMzUgMDU5MCAzNjhDNUMyRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVicCwxXCkKLSAzMzYgMDU5NSAzNjhDNUMzMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVzaSwxXCkKLSAzMzcgMDU5YSAzNjhDNUMzMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVzaSwxXCkKLSAzMzggMDU5ZiAzNjhDNUMzMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVzaSwxXCkKLSAzMzkgMDVhNCAzNjhDNUMzMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVzaSwxXCkKLSAzNDAgMDVhOSA4QzVDMzQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVzaSwxXCkKLSAzNDEgMDVhZCA4QzVDMzUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVzaSwxXCkKLSAzNDIgMDViMSAzNjhDNUMzNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVzaSwxXCkKLSAzNDMgMDViNiAzNjhDNUMzNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVzaSwxXCkKLSAzNDQgMDViYiAzNjhDNUMzOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkaSwxXCkKLSAzNDUgMDVjMCAzNjhDNUMzOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkaSwxXCkKLSAzNDYgMDVjNSAzNjhDNUMzQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkaSwxXCkKLSAzNDcgMDVjYSAzNjhDNUMzQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkaSwxXCkKLSAzNDggMDVjZiA4QzVDM0MxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkaSwxXCkKLSAzNDkgMDVkMyA4QzVDM0QxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkaSwxXCkKLSAzNTAgMDVkNyAzNjhDNUMzRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkaSwxXCkKLSAzNTEgMDVkYyAzNjhDNUMzRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkaSwxXCkKLSAzNTIgMDVlMSAzNjhDNUM0MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVheCwyXCkKLSAzNTMgMDVlNiAzNjhDNUM0MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVheCwyXCkKLSAzNTQgMDVlYiAzNjhDNUM0MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVheCwyXCkKLSAzNTUgMDVmMCAzNjhDNUM0MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVheCwyXCkKLSAzNTYgMDVmNSA4QzVDNDQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVheCwyXCkKLSAzNTcgMDVmOSA4QzVDNDUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVheCwyXCkKLSAzNTggMDVmZCAzNjhDNUM0NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVheCwyXCkKLSAzNTkgMDYwMiAzNjhDNUM0NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVheCwyXCkKLSAzNjAgMDYwNyAzNjhDNUM0OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVjeCwyXCkKLSAzNjEgMDYwYyAzNjhDNUM0OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVjeCwyXCkKLSAzNjIgMDYxMSAzNjhDNUM0QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVjeCwyXCkKLSAzNjMgMDYxNiAzNjhDNUM0QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVjeCwyXCkKLSAzNjQgMDYxYiA4QzVDNEMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVjeCwyXCkKLSAzNjUgMDYxZiA4QzVDNEQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVjeCwyXCkKLSAzNjYgMDYyMyAzNjhDNUM0RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVjeCwyXCkKLSAzNjcgMDYyOCAzNjhDNUM0RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVjeCwyXCkKLSAzNjggMDYyZCAzNjhDNUM1MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkeCwyXCkKLSAzNjkgMDYzMiAzNjhDNUM1MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkeCwyXCkKLSAzNzAgMDYzNyAzNjhDNUM1MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkeCwyXCkKLSAzNzEgMDYzYyAzNjhDNUM1MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkeCwyXCkKLSAzNzIgMDY0MSA4QzVDNTQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkeCwyXCkKLSAzNzMgMDY0NSA4QzVDNTUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkeCwyXCkKLSAzNzQgMDY0OSAzNjhDNUM1NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkeCwyXCkKLSAzNzUgMDY0ZSAzNjhDNUM1NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkeCwyXCkKLSAzNzYgMDY1MyAzNjhDNUM1OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVieCwyXCkKLSAzNzcgMDY1OCAzNjhDNUM1OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVieCwyXCkKLSAzNzggMDY1ZCAzNjhDNUM1QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVieCwyXCkKLSAzNzkgMDY2MiAzNjhDNUM1QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVieCwyXCkKLSAzODAgMDY2NyA4QzVDNUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVieCwyXCkKLSAzODEgMDY2YiA4QzVDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVieCwyXCkKLSAzODIgMDY2ZiAzNjhDNUM1RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVieCwyXCkKLSAzODMgMDY3NCAzNjhDNUM1RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVieCwyXCkKLSAzODQgMDY3OSAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsMlwpCi0uKldhcm5pbmc6LioKLSAzODUgMDY3ZCAzNjhDNTkxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsMlwpCi0uKldhcm5pbmc6LioKLSAzODYgMDY4MSAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsMlwpCi0uKldhcm5pbmc6LioKLSAzODcgMDY4NSAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsMlwpCi0uKldhcm5pbmc6LioKLSAzODggMDY4OSA4QzVDMjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsMlwpCi0uKldhcm5pbmc6LioKLSAzODkgMDY4ZCA4QzVEMTIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsMlwpCi0uKldhcm5pbmc6LioKLSAzOTAgMDY5MCAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksMlwpCi0uKldhcm5pbmc6LioKLSAzOTEgMDY5NCAzNjhDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksMlwpCi0uKldhcm5pbmc6LioKLSAzOTIgMDY5OCAzNjhDNUM2OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVicCwyXCkKLSAzOTMgMDY5ZCAzNjhDNUM2OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVicCwyXCkKLSAzOTQgMDZhMiAzNjhDNUM2QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVicCwyXCkKLSAzOTUgMDZhNyAzNjhDNUM2QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVicCwyXCkKLSAzOTYgMDZhYyA4QzVDNkMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVicCwyXCkKLSAzOTcgMDZiMCA4QzVDNkQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVicCwyXCkKLSAzOTggMDZiNCAzNjhDNUM2RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVicCwyXCkKLSAzOTkgMDZiOSAzNjhDNUM2RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVicCwyXCkKLSA0MDAgMDZiZSAzNjhDNUM3MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVzaSwyXCkKLSA0MDEgMDZjMyAzNjhDNUM3MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVzaSwyXCkKLSA0MDIgMDZjOCAzNjhDNUM3MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVzaSwyXCkKLSA0MDMgMDZjZCAzNjhDNUM3MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVzaSwyXCkKLSA0MDQgMDZkMiA4QzVDNzQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVzaSwyXCkKLSA0MDUgMDZkNiA4QzVDNzUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVzaSwyXCkKLSA0MDYgMDZkYSAzNjhDNUM3NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVzaSwyXCkKLSA0MDcgMDZkZiAzNjhDNUM3NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVzaSwyXCkKLSA0MDggMDZlNCAzNjhDNUM3OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkaSwyXCkKLSA0MDkgMDZlOSAzNjhDNUM3OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkaSwyXCkKLSA0MTAgMDZlZSAzNjhDNUM3QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkaSwyXCkKLSA0MTEgMDZmMyAzNjhDNUM3QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkaSwyXCkKLSA0MTIgMDZmOCA4QzVDN0MxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkaSwyXCkKLSA0MTMgMDZmYyA4QzVDN0QxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkaSwyXCkKLSA0MTQgMDcwMCAzNjhDNUM3RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkaSwyXCkKLSA0MTUgMDcwNSAzNjhDNUM3RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkaSwyXCkKLSA0MTYgMDcwYSAzNjhDNUM4MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVheCw0XCkKLSA0MTcgMDcwZiAzNjhDNUM4MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVheCw0XCkKLSA0MTggMDcxNCAzNjhDNUM4MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVheCw0XCkKLSA0MTkgMDcxOSAzNjhDNUM4MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVheCw0XCkKLSA0MjAgMDcxZSA4QzVDODQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVheCw0XCkKLSA0MjEgMDcyMiA4QzVDODUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVheCw0XCkKLSA0MjIgMDcyNiAzNjhDNUM4NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVheCw0XCkKLSA0MjMgMDcyYiAzNjhDNUM4NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVheCw0XCkKLSA0MjQgMDczMCAzNjhDNUM4OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVjeCw0XCkKLSA0MjUgMDczNSAzNjhDNUM4OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVjeCw0XCkKLSA0MjYgMDczYSAzNjhDNUM4QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVjeCw0XCkKLSA0MjcgMDczZiAzNjhDNUM4QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVjeCw0XCkKLSA0MjggMDc0NCA4QzVDOEMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVjeCw0XCkKLSA0MjkgMDc0OCA4QzVDOEQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVjeCw0XCkKLSA0MzAgMDc0YyAzNjhDNUM4RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVjeCw0XCkKLSA0MzEgMDc1MSAzNjhDNUM4RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVjeCw0XCkKLSA0MzIgMDc1NiAzNjhDNUM5MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkeCw0XCkKLSA0MzMgMDc1YiAzNjhDNUM5MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkeCw0XCkKLSA0MzQgMDc2MCAzNjhDNUM5MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkeCw0XCkKLSA0MzUgMDc2NSAzNjhDNUM5MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkeCw0XCkKLSA0MzYgMDc2YSA4QzVDOTQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkeCw0XCkKLSA0MzcgMDc2ZSA4QzVDOTUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkeCw0XCkKLSA0MzggMDc3MiAzNjhDNUM5NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkeCw0XCkKLSA0MzkgMDc3NyAzNjhDNUM5NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkeCw0XCkKLSA0NDAgMDc3YyAzNjhDNUM5OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVieCw0XCkKLSA0NDEgMDc4MSAzNjhDNUM5OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVieCw0XCkKLSA0NDIgMDc4NiAzNjhDNUM5QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVieCw0XCkKLSA0NDMgMDc4YiAzNjhDNUM5QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVieCw0XCkKLSA0NDQgMDc5MCA4QzVDOUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVieCw0XCkKLSA0NDUgMDc5NCA4QzVDOUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVieCw0XCkKLSA0NDYgMDc5OCAzNjhDNUM5RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVieCw0XCkKLSA0NDcgMDc5ZCAzNjhDNUM5RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVieCw0XCkKLSA0NDggMDdhMiAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsNFwpCi0uKldhcm5pbmc6LioKLSA0NDkgMDdhNiAzNjhDNTkxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsNFwpCi0uKldhcm5pbmc6LioKLSA0NTAgMDdhYSAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsNFwpCi0uKldhcm5pbmc6LioKLSA0NTEgMDdhZSAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsNFwpCi0uKldhcm5pbmc6LioKLSA0NTIgMDdiMiA4QzVDMjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsNFwpCi0uKldhcm5pbmc6LioKLSA0NTMgMDdiNiA4QzVEMTIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsNFwpCi0uKldhcm5pbmc6LioKLSA0NTQgMDdiOSAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksNFwpCi0uKldhcm5pbmc6LioKLSA0NTUgMDdiZCAzNjhDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksNFwpCi0uKldhcm5pbmc6LioKLSA0NTYgMDdjMSAzNjhDNUNBOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVicCw0XCkKLSA0NTcgMDdjNiAzNjhDNUNBOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVicCw0XCkKLSA0NTggMDdjYiAzNjhDNUNBQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVicCw0XCkKLSA0NTkgMDdkMCAzNjhDNUNBQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVicCw0XCkKLSA0NjAgMDdkNSA4QzVDQUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVicCw0XCkKLSA0NjEgMDdkOSA4QzVDQUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVicCw0XCkKLSA0NjIgMDdkZCAzNjhDNUNBRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVicCw0XCkKLSA0NjMgMDdlMiAzNjhDNUNBRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVicCw0XCkKLSA0NjQgMDdlNyAzNjhDNUNCMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVzaSw0XCkKLSA0NjUgMDdlYyAzNjhDNUNCMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVzaSw0XCkKLSA0NjYgMDdmMSAzNjhDNUNCMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVzaSw0XCkKLSA0NjcgMDdmNiAzNjhDNUNCMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVzaSw0XCkKLSA0NjggMDdmYiA4QzVDQjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVzaSw0XCkKLSA0NjkgMDdmZiA4QzVDQjUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVzaSw0XCkKLSA0NzAgMDgwMyAzNjhDNUNCNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVzaSw0XCkKLSA0NzEgMDgwOCAzNjhDNUNCNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVzaSw0XCkKLSA0NzIgMDgwZCAzNjhDNUNCOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkaSw0XCkKLSA0NzMgMDgxMiAzNjhDNUNCOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkaSw0XCkKLSA0NzQgMDgxNyAzNjhDNUNCQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkaSw0XCkKLSA0NzUgMDgxYyAzNjhDNUNCQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkaSw0XCkKLSA0NzYgMDgyMSA4QzVDQkMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkaSw0XCkKLSA0NzcgMDgyNSA4QzVDQkQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkaSw0XCkKLSA0NzggMDgyOSAzNjhDNUNCRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkaSw0XCkKLSA0NzkgMDgyZSAzNjhDNUNCRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkaSw0XCkKLSA0ODAgMDgzMyAzNjhDNUNDMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVheCw4XCkKLSA0ODEgMDgzOCAzNjhDNUNDMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVheCw4XCkKLSA0ODIgMDgzZCAzNjhDNUNDMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVheCw4XCkKLSA0ODMgMDg0MiAzNjhDNUNDMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVheCw4XCkKLSA0ODQgMDg0NyA4QzVDQzQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVheCw4XCkKLSA0ODUgMDg0YiA4QzVDQzUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVheCw4XCkKLSA0ODYgMDg0ZiAzNjhDNUNDNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVheCw4XCkKLSA0ODcgMDg1NCAzNjhDNUNDNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVheCw4XCkKLSA0ODggMDg1OSAzNjhDNUNDOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVjeCw4XCkKLSA0ODkgMDg1ZSAzNjhDNUNDOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVjeCw4XCkKLSA0OTAgMDg2MyAzNjhDNUNDQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVjeCw4XCkKLSA0OTEgMDg2OCAzNjhDNUNDQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVjeCw4XCkKLSA0OTIgMDg2ZCA4QzVDQ0MxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVjeCw4XCkKLSA0OTMgMDg3MSA4QzVDQ0QxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVjeCw4XCkKLSA0OTQgMDg3NSAzNjhDNUNDRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVjeCw4XCkKLSA0OTUgMDg3YSAzNjhDNUNDRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVjeCw4XCkKLSA0OTYgMDg3ZiAzNjhDNUNEMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkeCw4XCkKLSA0OTcgMDg4NCAzNjhDNUNEMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkeCw4XCkKLSA0OTggMDg4OSAzNjhDNUNEMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkeCw4XCkKLSA0OTkgMDg4ZSAzNjhDNUNEMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkeCw4XCkKLSA1MDAgMDg5MyA4QzVDRDQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkeCw4XCkKLSA1MDEgMDg5NyA4QzVDRDUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkeCw4XCkKLSA1MDIgMDg5YiAzNjhDNUNENiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkeCw4XCkKLSA1MDMgMDhhMCAzNjhDNUNENyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkeCw4XCkKLSA1MDQgMDhhNSAzNjhDNUNEOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVieCw4XCkKLSA1MDUgMDhhYSAzNjhDNUNEOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVieCw4XCkKLSA1MDYgMDhhZiAzNjhDNUNEQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVieCw4XCkKLSA1MDcgMDhiNCAzNjhDNUNEQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVieCw4XCkKLSA1MDggMDhiOSA4QzVDREMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVieCw4XCkKLSA1MDkgMDhiZCA4QzVDREQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVieCw4XCkKLSA1MTAgMDhjMSAzNjhDNUNERSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVieCw4XCkKLSA1MTEgMDhjNiAzNjhDNUNERiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVieCw4XCkKLSA1MTIgMDhjYiAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsOFwpCi0uKldhcm5pbmc6LioKLSA1MTMgMDhjZiAzNjhDNTkxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsOFwpCi0uKldhcm5pbmc6LioKLSA1MTQgMDhkMyAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSA1MTUgMDhkNyAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsOFwpCi0uKldhcm5pbmc6LioKLSA1MTYgMDhkYiA4QzVDMjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsOFwpCi0uKldhcm5pbmc6LioKLSA1MTcgMDhkZiA4QzVEMTIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSA1MTggMDhlMiAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksOFwpCi0uKldhcm5pbmc6LioKLSA1MTkgMDhlNiAzNjhDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksOFwpCi0uKldhcm5pbmc6LioKLSA1MjAgMDhlYSAzNjhDNUNFOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVicCw4XCkKLSA1MjEgMDhlZiAzNjhDNUNFOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVicCw4XCkKLSA1MjIgMDhmNCAzNjhDNUNFQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVicCw4XCkKLSA1MjMgMDhmOSAzNjhDNUNFQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVicCw4XCkKLSA1MjQgMDhmZSA4QzVDRUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVicCw4XCkKLSA1MjUgMDkwMiA4QzVDRUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVicCw4XCkKLSA1MjYgMDkwNiAzNjhDNUNFRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVicCw4XCkKLSA1MjcgMDkwYiAzNjhDNUNFRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVicCw4XCkKLSA1MjggMDkxMCAzNjhDNUNGMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVzaSw4XCkKLSA1MjkgMDkxNSAzNjhDNUNGMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVzaSw4XCkKLSA1MzAgMDkxYSAzNjhDNUNGMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVzaSw4XCkKLSA1MzEgMDkxZiAzNjhDNUNGMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVzaSw4XCkKLSA1MzIgMDkyNCA4QzVDRjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVzaSw4XCkKLSA1MzMgMDkyOCA4QzVDRjUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVzaSw4XCkKLSA1MzQgMDkyYyAzNjhDNUNGNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVzaSw4XCkKLSA1MzUgMDkzMSAzNjhDNUNGNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVzaSw4XCkKLSA1MzYgMDkzNiAzNjhDNUNGOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkaSw4XCkKLSA1MzcgMDkzYiAzNjhDNUNGQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkaSw4XCkKLSA1MzggMDk0MCAzNjhDNUNGOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkaSw4XCkKLSA1MzkgMDk0NSAzNjhDNUNGQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkaSw4XCkKLSA1NDAgMDk0YSA4QzVDRkMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkaSw4XCkKLSA1NDEgMDk0ZSA4QzVDRkQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkaSw4XCkKLSA1NDIgMDk1MiAzNjhDNUNGRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkaSw4XCkKLSA1NDMgMDk1NyAzNjhDNUNGRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkaSw4XCkKLSA1NDQgMDk1YyAzNjhDOUMwMCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCwxXCkKLSA1NDUgMDk2NCAzNjhDOUMwMSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCwxXCkKLSA1NDYgMDk2YyAzNjhDOUMwMiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCwxXCkKLSA1NDcgMDk3NCAzNjhDOUMwMyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVheCwxXCkKLSA1NDggMDk3YyA4QzlDMDQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCwxXCkKLSA1NDkgMDk4MyA4QzlDMDU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCwxXCkKLSA1NTAgMDk4YSAzNjhDOUMwNiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCwxXCkKLSA1NTEgMDk5MiAzNjhDOUMwNyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVheCwxXCkKLSA1NTIgMDk5YSAzNjhDOUMwOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCwxXCkKLSA1NTMgMDlhMiAzNjhDOUMwOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCwxXCkKLSA1NTQgMDlhYSAzNjhDOUMwQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCwxXCkKLSA1NTUgMDliMiAzNjhDOUMwQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCwxXCkKLSA1NTYgMDliYSA4QzlDMEM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCwxXCkKLSA1NTcgMDljMSA4QzlDMEQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCwxXCkKLSA1NTggMDljOCAzNjhDOUMwRSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCwxXCkKLSA1NTkgMDlkMCAzNjhDOUMwRiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCwxXCkKLSA1NjAgMDlkOCAzNjhDOUMxMCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCwxXCkKLSA1NjEgMDllMCAzNjhDOUMxMSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCwxXCkKLSA1NjIgMDllOCAzNjhDOUMxMiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCwxXCkKLSA1NjMgMDlmMCAzNjhDOUMxMyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCwxXCkKLSA1NjQgMDlmOCA4QzlDMTQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCwxXCkKLSA1NjUgMDlmZiA4QzlDMTU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCwxXCkKLSA1NjYgMGEwNiAzNjhDOUMxNiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCwxXCkKLSA1NjcgMGEwZSAzNjhDOUMxNyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCwxXCkKLSA1NjggMGExNiAzNjhDOUMxOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCwxXCkKLSA1NjkgMGExZSAzNjhDOUMxOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCwxXCkKLSA1NzAgMGEyNiAzNjhDOUMxQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCwxXCkKLSA1NzEgMGEyZSAzNjhDOUMxQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVieCwxXCkKLSA1NzIgMGEzNiA4QzlDMUM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCwxXCkKLSA1NzMgMGEzZCA4QzlDMUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCwxXCkKLSA1NzQgMGE0NCAzNjhDOUMxRSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCwxXCkKLSA1NzUgMGE0YyAzNjhDOUMxRiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVieCwxXCkKLSA1NzYgMGE1NCAzNjhDOTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsMVwpCi0gNTc3IDBhNWIgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LDFcKQotIDU3OCAwYTYyIDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwxXCkKLSA1NzkgMGE2OSAzNjhDOUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsMVwpCi0gNTgwIDBhNzAgOEM5QzI0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLDFcKQotIDU4MSAwYTc3IDhDOUQ3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwxXCkKLSA1ODIgMGE3ZCAzNjhDOUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksMVwpCi0gNTgzIDBhODQgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLDFcKQotIDU4NCAwYThiIDM2OEM5QzI4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDFcKQotIDU4NSAwYTkzIDM2OEM5QzI5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDFcKQotIDU4NiAwYTliIDM2OEM5QzJBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDFcKQotIDU4NyAwYWEzIDM2OEM5QzJCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDFcKQotIDU4OCAwYWFiIDhDOUMyQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDFcKQotIDU4OSAwYWIyIDhDOUMyRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDFcKQotIDU5MCAwYWI5IDM2OEM5QzJFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDFcKQotIDU5MSAwYWMxIDM2OEM5QzJGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDFcKQotIDU5MiAwYWM5IDM2OEM5QzMwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDFcKQotIDU5MyAwYWQxIDM2OEM5QzMxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDFcKQotIDU5NCAwYWQ5IDM2OEM5QzMyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDFcKQotIDU5NSAwYWUxIDM2OEM5QzMzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDFcKQotIDU5NiAwYWU5IDhDOUMzNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDFcKQotIDU5NyAwYWYwIDhDOUMzNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDFcKQotIDU5OCAwYWY3IDM2OEM5QzM2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDFcKQotIDU5OSAwYWZmIDM2OEM5QzM3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDFcKQotIDYwMCAwYjA3IDM2OEM5QzM4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDFcKQotIDYwMSAwYjBmIDM2OEM5QzM5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDFcKQotIDYwMiAwYjE3IDM2OEM5QzNBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDFcKQotIDYwMyAwYjFmIDM2OEM5QzNCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDFcKQotIDYwNCAwYjI3IDhDOUMzQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDFcKQotIDYwNSAwYjJlIDhDOUMzRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDFcKQotIDYwNiAwYjM1IDM2OEM5QzNFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDFcKQotIDYwNyAwYjNkIDM2OEM5QzNGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDFcKQotIDYwOCAwYjQ1IDM2OEM5QzQwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDJcKQotIDYwOSAwYjRkIDM2OEM5QzQxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDJcKQotIDYxMCAwYjU1IDM2OEM5QzQyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDJcKQotIDYxMSAwYjVkIDM2OEM5QzQzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDJcKQotIDYxMiAwYjY1IDhDOUM0NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDJcKQotIDYxMyAwYjZjIDhDOUM0NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDJcKQotIDYxNCAwYjczIDM2OEM5QzQ2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDJcKQotIDYxNSAwYjdiIDM2OEM5QzQ3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDJcKQotIDYxNiAwYjgzIDM2OEM5QzQ4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDJcKQotIDYxNyAwYjhiIDM2OEM5QzQ5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDJcKQotIDYxOCAwYjkzIDM2OEM5QzRBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDJcKQotIDYxOSAwYjliIDM2OEM5QzRCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDJcKQotIDYyMCAwYmEzIDhDOUM0Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDJcKQotIDYyMSAwYmFhIDhDOUM0RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDJcKQotIDYyMiAwYmIxIDM2OEM5QzRFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDJcKQotIDYyMyAwYmI5IDM2OEM5QzRGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDJcKQotIDYyNCAwYmMxIDM2OEM5QzUwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDJcKQotIDYyNSAwYmM5IDM2OEM5QzUxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDJcKQotIDYyNiAwYmQxIDM2OEM5QzUyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDJcKQotIDYyNyAwYmQ5IDM2OEM5QzUzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDJcKQotIDYyOCAwYmUxIDhDOUM1NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDJcKQotIDYyOSAwYmU4IDhDOUM1NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDJcKQotIDYzMCAwYmVmIDM2OEM5QzU2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDJcKQotIDYzMSAwYmY3IDM2OEM5QzU3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDJcKQotIDYzMiAwYmZmIDM2OEM5QzU4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDJcKQotIDYzMyAwYzA3IDM2OEM5QzU5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDJcKQotIDYzNCAwYzBmIDM2OEM5QzVBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDJcKQotIDYzNSAwYzE3IDM2OEM5QzVCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDJcKQotIDYzNiAwYzFmIDhDOUM1Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDJcKQotIDYzNyAwYzI2IDhDOUM1RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDJcKQotIDYzOCAwYzJkIDM2OEM5QzVFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDJcKQotIDYzOSAwYzM1IDM2OEM5QzVGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDJcKQotIDY0MCAwYzNkIDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDY0MSAwYzQ0IDM2OEM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwyXCkKLS4qV2FybmluZzouKgotIDY0MiAwYzRiIDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwyXCkKLS4qV2FybmluZzouKgotIDY0MyAwYzUyIDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDY0NCAwYzU5IDhDOUMyNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwyXCkKLS4qV2FybmluZzouKgotIDY0NSAwYzYwIDhDOUQ3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwyXCkKLS4qV2FybmluZzouKgotIDY0NiAwYzY2IDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDY0NyAwYzZkIDM2OEM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwyXCkKLS4qV2FybmluZzouKgotIDY0OCAwYzc0IDM2OEM5QzY4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDJcKQotIDY0OSAwYzdjIDM2OEM5QzY5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDJcKQotIDY1MCAwYzg0IDM2OEM5QzZBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDJcKQotIDY1MSAwYzhjIDM2OEM5QzZCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDJcKQotIDY1MiAwYzk0IDhDOUM2Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDJcKQotIDY1MyAwYzliIDhDOUM2RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDJcKQotIDY1NCAwY2EyIDM2OEM5QzZFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDJcKQotIDY1NSAwY2FhIDM2OEM5QzZGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDJcKQotIDY1NiAwY2IyIDM2OEM5QzcwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDJcKQotIDY1NyAwY2JhIDM2OEM5QzcxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDJcKQotIDY1OCAwY2MyIDM2OEM5QzcyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDJcKQotIDY1OSAwY2NhIDM2OEM5QzczIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDJcKQotIDY2MCAwY2QyIDhDOUM3NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDJcKQotIDY2MSAwY2Q5IDhDOUM3NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDJcKQotIDY2MiAwY2UwIDM2OEM5Qzc2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDJcKQotIDY2MyAwY2U4IDM2OEM5Qzc3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDJcKQotIDY2NCAwY2YwIDM2OEM5Qzc4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDJcKQotIDY2NSAwY2Y4IDM2OEM5Qzc5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDJcKQotIDY2NiAwZDAwIDM2OEM5QzdBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDJcKQotIDY2NyAwZDA4IDM2OEM5QzdCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDJcKQotIDY2OCAwZDEwIDhDOUM3Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDJcKQotIDY2OSAwZDE3IDhDOUM3RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDJcKQotIDY3MCAwZDFlIDM2OEM5QzdFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDJcKQotIDY3MSAwZDI2IDM2OEM5QzdGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDJcKQotIDY3MiAwZDJlIDM2OEM5QzgwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDRcKQotIDY3MyAwZDM2IDM2OEM5QzgxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDRcKQotIDY3NCAwZDNlIDM2OEM5QzgyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDRcKQotIDY3NSAwZDQ2IDM2OEM5QzgzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDRcKQotIDY3NiAwZDRlIDhDOUM4NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDRcKQotIDY3NyAwZDU1IDhDOUM4NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDRcKQotIDY3OCAwZDVjIDM2OEM5Qzg2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDRcKQotIDY3OSAwZDY0IDM2OEM5Qzg3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDRcKQotIDY4MCAwZDZjIDM2OEM5Qzg4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDRcKQotIDY4MSAwZDc0IDM2OEM5Qzg5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDRcKQotIDY4MiAwZDdjIDM2OEM5QzhBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDRcKQotIDY4MyAwZDg0IDM2OEM5QzhCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDRcKQotIDY4NCAwZDhjIDhDOUM4Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDRcKQotIDY4NSAwZDkzIDhDOUM4RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDRcKQotIDY4NiAwZDlhIDM2OEM5QzhFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDRcKQotIDY4NyAwZGEyIDM2OEM5QzhGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDRcKQotIDY4OCAwZGFhIDM2OEM5QzkwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDRcKQotIDY4OSAwZGIyIDM2OEM5QzkxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDRcKQotIDY5MCAwZGJhIDM2OEM5QzkyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDRcKQotIDY5MSAwZGMyIDM2OEM5QzkzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDRcKQotIDY5MiAwZGNhIDhDOUM5NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDRcKQotIDY5MyAwZGQxIDhDOUM5NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDRcKQotIDY5NCAwZGQ4IDM2OEM5Qzk2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDRcKQotIDY5NSAwZGUwIDM2OEM5Qzk3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDRcKQotIDY5NiAwZGU4IDM2OEM5Qzk4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDRcKQotIDY5NyAwZGYwIDM2OEM5Qzk5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDRcKQotIDY5OCAwZGY4IDM2OEM5QzlBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDRcKQotIDY5OSAwZTAwIDM2OEM5QzlCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDRcKQotIDcwMCAwZTA4IDhDOUM5Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDRcKQotIDcwMSAwZTBmIDhDOUM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDRcKQotIDcwMiAwZTE2IDM2OEM5QzlFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDRcKQotIDcwMyAwZTFlIDM2OEM5QzlGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDRcKQotIDcwNCAwZTI2IDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCw0XCkKLS4qV2FybmluZzouKgotIDcwNSAwZTJkIDM2OEM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDcwNiAwZTM0IDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDcwNyAwZTNiIDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCw0XCkKLS4qV2FybmluZzouKgotIDcwOCAwZTQyIDhDOUMyNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDcwOSAwZTQ5IDhDOUQ3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDcxMCAwZTRmIDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSw0XCkKLS4qV2FybmluZzouKgotIDcxMSAwZTU2IDM2OEM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSw0XCkKLS4qV2FybmluZzouKgotIDcxMiAwZTVkIDM2OEM5Q0E4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDRcKQotIDcxMyAwZTY1IDM2OEM5Q0E5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDRcKQotIDcxNCAwZTZkIDM2OEM5Q0FBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDRcKQotIDcxNSAwZTc1IDM2OEM5Q0FCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDRcKQotIDcxNiAwZTdkIDhDOUNBQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDRcKQotIDcxNyAwZTg0IDhDOUNBRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDRcKQotIDcxOCAwZThiIDM2OEM5Q0FFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDRcKQotIDcxOSAwZTkzIDM2OEM5Q0FGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDRcKQotIDcyMCAwZTliIDM2OEM5Q0IwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDRcKQotIDcyMSAwZWEzIDM2OEM5Q0IxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDRcKQotIDcyMiAwZWFiIDM2OEM5Q0IyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDRcKQotIDcyMyAwZWIzIDM2OEM5Q0IzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDRcKQotIDcyNCAwZWJiIDhDOUNCNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDRcKQotIDcyNSAwZWMyIDhDOUNCNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDRcKQotIDcyNiAwZWM5IDM2OEM5Q0I2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDRcKQotIDcyNyAwZWQxIDM2OEM5Q0I3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDRcKQotIDcyOCAwZWQ5IDM2OEM5Q0I4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDRcKQotIDcyOSAwZWUxIDM2OEM5Q0I5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDRcKQotIDczMCAwZWU5IDM2OEM5Q0JBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDRcKQotIDczMSAwZWYxIDM2OEM5Q0JCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDRcKQotIDczMiAwZWY5IDhDOUNCQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDRcKQotIDczMyAwZjAwIDhDOUNCRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDRcKQotIDczNCAwZjA3IDM2OEM5Q0JFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDRcKQotIDczNSAwZjBmIDM2OEM5Q0JGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDRcKQotIDczNiAwZjE3IDM2OEM5Q0MwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDhcKQotIDczNyAwZjFmIDM2OEM5Q0MxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDhcKQotIDczOCAwZjI3IDM2OEM5Q0MyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDhcKQotIDczOSAwZjJmIDM2OEM5Q0MzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDhcKQotIDc0MCAwZjM3IDhDOUNDNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDhcKQotIDc0MSAwZjNlIDhDOUNDNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDhcKQotIDc0MiAwZjQ1IDM2OEM5Q0M2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDhcKQotIDc0MyAwZjRkIDM2OEM5Q0M3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDhcKQotIDc0NCAwZjU1IDM2OEM5Q0M4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDhcKQotIDc0NSAwZjVkIDM2OEM5Q0M5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDhcKQotIDc0NiAwZjY1IDM2OEM5Q0NBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDhcKQotIDc0NyAwZjZkIDM2OEM5Q0NCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDhcKQotIDc0OCAwZjc1IDhDOUNDQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDhcKQotIDc0OSAwZjdjIDhDOUNDRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDhcKQotIDc1MCAwZjgzIDM2OEM5Q0NFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDhcKQotIDc1MSAwZjhiIDM2OEM5Q0NGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDhcKQotIDc1MiAwZjkzIDM2OEM5Q0QwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDhcKQotIDc1MyAwZjliIDM2OEM5Q0QxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDhcKQotIDc1NCAwZmEzIDM2OEM5Q0QyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDhcKQotIDc1NSAwZmFiIDM2OEM5Q0QzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDhcKQotIDc1NiAwZmIzIDhDOUNENDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDhcKQotIDc1NyAwZmJhIDhDOUNENTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDhcKQotIDc1OCAwZmMxIDM2OEM5Q0Q2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDhcKQotIDc1OSAwZmM5IDM2OEM5Q0Q3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDhcKQotIDc2MCAwZmQxIDM2OEM5Q0Q4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDhcKQotIDc2MSAwZmQ5IDM2OEM5Q0Q5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDhcKQotIDc2MiAwZmUxIDM2OEM5Q0RBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDhcKQotIDc2MyAwZmU5IDM2OEM5Q0RCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDhcKQotIDc2NCAwZmYxIDhDOUNEQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDhcKQotIDc2NSAwZmY4IDhDOUNERDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDhcKQotIDc2NiAwZmZmIDM2OEM5Q0RFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDhcKQotIDc2NyAxMDA3IDM2OEM5Q0RGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDhcKQotIDc2OCAxMDBmIDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCw4XCkKLS4qV2FybmluZzouKgotIDc2OSAxMDE2IDM2OEM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDc3MCAxMDFkIDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCw4XCkKLS4qV2FybmluZzouKgotIDc3MSAxMDI0IDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCw4XCkKLS4qV2FybmluZzouKgotIDc3MiAxMDJiIDhDOUMyNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDc3MyAxMDMyIDhDOUQ3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCw4XCkKLS4qV2FybmluZzouKgotIDc3NCAxMDM4IDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDc3NSAxMDNmIDM2OEM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDc3NiAxMDQ2IDM2OEM5Q0U4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDhcKQotIDc3NyAxMDRlIDM2OEM5Q0U5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDhcKQotIDc3OCAxMDU2IDM2OEM5Q0VBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDhcKQotIDc3OSAxMDVlIDM2OEM5Q0VCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDhcKQotIDc4MCAxMDY2IDhDOUNFQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDhcKQotIDc4MSAxMDZkIDhDOUNFRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDhcKQotIDc4MiAxMDc0IDM2OEM5Q0VFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDhcKQotIDc4MyAxMDdjIDM2OEM5Q0VGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDhcKQotIDc4NCAxMDg0IDM2OEM5Q0YwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDhcKQotIDc4NSAxMDhjIDM2OEM5Q0YxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDhcKQotIDc4NiAxMDk0IDM2OEM5Q0YyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDhcKQotIDc4NyAxMDljIDM2OEM5Q0YzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDhcKQotIDc4OCAxMGE0IDhDOUNGNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDhcKQotIDc4OSAxMGFiIDhDOUNGNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDhcKQotIDc5MCAxMGIyIDM2OEM5Q0Y2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDhcKQotIDc5MSAxMGJhIDM2OEM5Q0Y3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDhcKQotIDc5MiAxMGMyIDM2OEM5Q0Y4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDhcKQotIDc5MyAxMGNhIDM2OEM5Q0ZBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDhcKQotIDc5NCAxMGQyIDM2OEM5Q0Y5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDhcKQotIDc5NSAxMGRhIDM2OEM5Q0ZCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDhcKQotIDc5NiAxMGUyIDhDOUNGQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDhcKQotIDc5NyAxMGU5IDhDOUNGRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDhcKQotIDc5OCAxMGYwIDM2OEM5Q0ZFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDhcKQotIDc5OSAxMGY4IDM2OEM5Q0ZGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDhcKQotIDgwMCAxMTAwIDhDNUMwNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYXgsMVwpCi0gODAxIDExMDQgOEM1QzBEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVjeCwxXCkKLSA4MDIgMTEwOCA4QzVDMTUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWR4LDFcKQotIDgwMyAxMTBjIDhDNUMxRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYngsMVwpCi0gODA0IDExMTAgOEM1RDAwICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsMVwpCi0gODA1IDExMTMgOEM1QzJEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVicCwxXCkKLSA4MDYgMTExNyA4QzVDMzUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZXNpLDFcKQotIDgwNyAxMTFiIDhDNUMzRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZGksMVwpCi0gODA4IDExMWYgOEM1QzQ1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVheCwyXCkKLSA4MDkgMTEyMyA4QzVDNEQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWN4LDJcKQotIDgxMCAxMTI3IDhDNUM1NTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZHgsMlwpCi0gODExIDExMmIgOEM1QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVieCwyXCkKLSA4MTIgMTEyZiA4QzVEMDAgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwyXCkKLS4qV2FybmluZzouKgotIDgxMyAxMTMyIDhDNUM2RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYnAsMlwpCi0gODE0IDExMzYgOEM1Qzc1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVzaSwyXCkKLSA4MTUgMTEzYSA4QzVDN0QwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWRpLDJcKQotIDgxNiAxMTNlIDhDNUM4NTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYXgsNFwpCi0gODE3IDExNDIgOEM1QzhEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVjeCw0XCkKLSA4MTggMTE0NiA4QzVDOTUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWR4LDRcKQotIDgxOSAxMTRhIDhDNUM5RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYngsNFwpCi0gODIwIDExNGUgOEM1RDAwICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsNFwpCi0uKldhcm5pbmc6LioKLSA4MjEgMTE1MSA4QzVDQUQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJwLDRcKQotIDgyMiAxMTU1IDhDNUNCNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlc2ksNFwpCi0gODIzIDExNTkgOEM1Q0JEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkaSw0XCkKLSA4MjQgMTE1ZCA4QzVDQzUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWF4LDhcKQotIDgyNSAxMTYxIDhDNUNDRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlY3gsOFwpCi0gODI2IDExNjUgOEM1Q0Q1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkeCw4XCkKLSA4MjcgMTE2OSA4QzVDREQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJ4LDhcKQotIDgyOCAxMTZkIDhDNUQwMCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLDhcKQotLipXYXJuaW5nOi4qCi0gODI5IDExNzAgOEM1Q0VEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVicCw4XCkKLSA4MzAgMTE3NCA4QzVDRjUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZXNpLDhcKQotIDgzMSAxMTc4IDhDNUNGRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZGksOFwpCi0gODMyIDExN2MgMzY4QzFEMTIgMDAwMDAwICAgCQltb3YJJWRzLCVzczoweDEyXCgsMVwpCi0gODMzIDExODMgMzY4QzFEMTIgMDAwMDAwICAgCQltb3YJJWRzLCVzczoweDEyXCgsMlwpCi0uKldhcm5pbmc6LioKLSA4MzQgMTE4YSAzNjhDMUQxMiAwMDAwMDAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCw0XCkKLS4qV2FybmluZzouKgotIDgzNSAxMTkxIDM2OEMxRDEyIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6MHgxMlwoLDhcKQotLipXYXJuaW5nOi4qCi0gODM2IDExOTggOEMxOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXhcKQotIDgzNyAxMTlhIDhDMTkgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4XCkKLSA4MzggMTE5YyA4QzFBICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeFwpCi0gODM5IDExOWUgOEMxQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnhcKQotIDg0MCAxMWEwIDhDMUQwMDAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MAotIDg0MSAxMWE2IDhDMUUgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpXCkKLSA4NDIgMTFhOCA4QzFGICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaVwpCi0gODQzIDExYWEgOEM1ODEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4XCkKLSA4NDQgMTFhZCA4QzU5MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3hcKQotIDg0NSAxMWIwIDhDNUExMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeFwpCi0gODQ2IDExYjMgOEM1QjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4XCkKLSA4NDcgMTFiNiAzRThDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnBcKQotIDg0OCAxMWJhIDhDNUUxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaVwpCi0gODQ5IDExYmQgOEM1RjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpXCkKLSA4NTAgMTFjMCA4Qzk4Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXhcKQotIDg1MSAxMWM2IDhDOTk3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeFwpCi0gODUyIDExY2MgOEM5QTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4XCkKLSA4NTMgMTFkMiA4QzlCNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnhcKQotIDg1NCAxMWQ4IDNFOEM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicFwpCi0gODU1IDExZGYgOEM5RTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpXCkKLSA4NTYgMTFlNSA4QzlGNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGlcKQotIDg1NyAxMWViIDhDRDggICAgICAgICAgICAgIAkJbW92CSVkcywlZWF4Ci0gODU4IDExZWQgOENEOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlY3gKLSA4NTkgMTFlZiA4Q0RBICAgICAgICAgICAgICAJCW1vdgklZHMsJWVkeAotIDg2MCAxMWYxIDhDREIgICAgICAgICAgICAgIAkJbW92CSVkcywlZWJ4Ci0gODYxIDExZjMgOENEQyAgICAgICAgICAgICAgCQltb3YJJWRzLCVlc3AKLSA4NjIgMTFmNSA4Q0REICAgICAgICAgICAgICAJCW1vdgklZHMsJWVicAotIDg2MyAxMWY3IDhDREUgICAgICAgICAgICAgIAkJbW92CSVkcywlZXNpCi0gODY0IDExZjkgOENERiAgICAgICAgICAgICAgCQltb3YJJWRzLCVlZGkKLSA4NjUgMTFmYiA4QzFDMDAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWF4LDFcKQotIDg2NiAxMWZlIDhDMUMwMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYXgsMVwpCi0gODY3IDEyMDEgOEMxQzAyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVheCwxXCkKLSA4NjggMTIwNCA4QzFDMDMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWF4LDFcKQotIDg2OSAxMjA3IDNFOEMxQzA0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYXgsMVwpCi0gODcwIDEyMGIgOEMxQzA1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWF4LDFcKQotIDg3MSAxMjEyIDhDMUMwNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYXgsMVwpCi0gODcyIDEyMTUgOEMxQzA3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVheCwxXCkKLSA4NzMgMTIxOCA4QzFDMDggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWN4LDFcKQotIDg3NCAxMjFiIDhDMUMwOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlY3gsMVwpCi0gODc1IDEyMWUgOEMxQzBBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVjeCwxXCkKLSA4NzYgMTIyMSA4QzFDMEIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWN4LDFcKQotIDg3NyAxMjI0IDNFOEMxQzBDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlY3gsMVwpCi0gODc4IDEyMjggOEMxQzBEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWN4LDFcKQotIDg3OSAxMjJmIDhDMUMwRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlY3gsMVwpCi0gODgwIDEyMzIgOEMxQzBGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVjeCwxXCkKLSA4ODEgMTIzNSA4QzFDMTAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWR4LDFcKQotIDg4MiAxMjM4IDhDMUMxMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZHgsMVwpCi0gODgzIDEyM2IgOEMxQzEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkeCwxXCkKLSA4ODQgMTIzZSA4QzFDMTMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWR4LDFcKQotIDg4NSAxMjQxIDNFOEMxQzE0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZHgsMVwpCi0gODg2IDEyNDUgOEMxQzE1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWR4LDFcKQotIDg4NyAxMjRjIDhDMUMxNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZHgsMVwpCi0gODg4IDEyNGYgOEMxQzE3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkeCwxXCkKLSA4ODkgMTI1MiA4QzFDMTggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJ4LDFcKQotIDg5MCAxMjU1IDhDMUMxOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYngsMVwpCi0gODkxIDEyNTggOEMxQzFBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVieCwxXCkKLSA4OTIgMTI1YiA4QzFDMUIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJ4LDFcKQotIDg5MyAxMjVlIDNFOEMxQzFDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYngsMVwpCi0gODk0IDEyNjIgOEMxQzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJ4LDFcKQotIDg5NSAxMjY5IDhDMUMxRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYngsMVwpCi0gODk2IDEyNmMgOEMxQzFGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVieCwxXCkKLSA4OTcgMTI2ZiA4QzE4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwxXCkKLSA4OTggMTI3MSA4QzE5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwxXCkKLSA4OTkgMTI3MyA4QzFBICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwxXCkKLSA5MDAgMTI3NSA4QzFCICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwxXCkKLSA5MDEgMTI3NyAzRThDMUMyNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwxXCkKLSA5MDIgMTI3YiA4QzFEMDAwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOlwoLDFcKQotIDkwMyAxMjgxIDhDMUUgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLDFcKQotIDkwNCAxMjgzIDhDMUYgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLDFcKQotIDkwNSAxMjg1IDhDMUMyOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYnAsMVwpCi0gOTA2IDEyODggOEMxQzI5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVicCwxXCkKLSA5MDcgMTI4YiA4QzFDMkEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJwLDFcKQotIDkwOCAxMjhlIDhDMUMyQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYnAsMVwpCi0gOTA5IDEyOTEgM0U4QzFDMkMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVicCwxXCkKLSA5MTAgMTI5NSA4QzFDMkQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYnAsMVwpCi0gOTExIDEyOWMgOEMxQzJFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVicCwxXCkKLSA5MTIgMTI5ZiA4QzFDMkYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJwLDFcKQotIDkxMyAxMmEyIDhDMUMzMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlc2ksMVwpCi0gOTE0IDEyYTUgOEMxQzMxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVzaSwxXCkKLSA5MTUgMTJhOCA4QzFDMzIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZXNpLDFcKQotIDkxNiAxMmFiIDhDMUMzMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlc2ksMVwpCi0gOTE3IDEyYWUgM0U4QzFDMzQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVzaSwxXCkKLSA5MTggMTJiMiA4QzFDMzUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlc2ksMVwpCi0gOTE5IDEyYjkgOEMxQzM2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVzaSwxXCkKLSA5MjAgMTJiYyA4QzFDMzcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZXNpLDFcKQotIDkyMSAxMmJmIDhDMUMzOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZGksMVwpCi0gOTIyIDEyYzIgOEMxQzM5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkaSwxXCkKLSA5MjMgMTJjNSA4QzFDM0EgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWRpLDFcKQotIDkyNCAxMmM4IDhDMUMzQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZGksMVwpCi0gOTI1IDEyY2IgM0U4QzFDM0MgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkaSwxXCkKLSA5MjYgMTJjZiA4QzFDM0QwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZGksMVwpCi0gOTI3IDEyZDYgOEMxQzNFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkaSwxXCkKLSA5MjggMTJkOSA4QzFDM0YgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWRpLDFcKQotIDkyOSAxMmRjIDhDMUM0MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYXgsMlwpCi0gOTMwIDEyZGYgOEMxQzQxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVheCwyXCkKLSA5MzEgMTJlMiA4QzFDNDIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWF4LDJcKQotIDkzMiAxMmU1IDhDMUM0MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYXgsMlwpCi0gOTMzIDEyZTggM0U4QzFDNDQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVheCwyXCkKLSA5MzQgMTJlYyA4QzFDNDUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYXgsMlwpCi0gOTM1IDEyZjMgOEMxQzQ2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVheCwyXCkKLSA5MzYgMTJmNiA4QzFDNDcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWF4LDJcKQotIDkzNyAxMmY5IDhDMUM0OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlY3gsMlwpCi0gOTM4IDEyZmMgOEMxQzQ5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVjeCwyXCkKLSA5MzkgMTJmZiA4QzFDNEEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWN4LDJcKQotIDk0MCAxMzAyIDhDMUM0QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlY3gsMlwpCi0gOTQxIDEzMDUgM0U4QzFDNEMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVjeCwyXCkKLSA5NDIgMTMwOSA4QzFDNEQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlY3gsMlwpCi0gOTQzIDEzMTAgOEMxQzRFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVjeCwyXCkKLSA5NDQgMTMxMyA4QzFDNEYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWN4LDJcKQotIDk0NSAxMzE2IDhDMUM1MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZHgsMlwpCi0gOTQ2IDEzMTkgOEMxQzUxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkeCwyXCkKLSA5NDcgMTMxYyA4QzFDNTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWR4LDJcKQotIDk0OCAxMzFmIDhDMUM1MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZHgsMlwpCi0gOTQ5IDEzMjIgM0U4QzFDNTQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkeCwyXCkKLSA5NTAgMTMyNiA4QzFDNTUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZHgsMlwpCi0gOTUxIDEzMmQgOEMxQzU2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkeCwyXCkKLSA5NTIgMTMzMCA4QzFDNTcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWR4LDJcKQotIDk1MyAxMzMzIDhDMUM1OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYngsMlwpCi0gOTU0IDEzMzYgOEMxQzU5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVieCwyXCkKLSA5NTUgMTMzOSA4QzFDNUEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJ4LDJcKQotIDk1NiAxMzNjIDhDMUM1QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYngsMlwpCi0gOTU3IDEzM2YgM0U4QzFDNUMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVieCwyXCkKLSA5NTggMTM0MyA4QzFDNUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYngsMlwpCi0gOTU5IDEzNGEgOEMxQzVFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVieCwyXCkKLSA5NjAgMTM0ZCA4QzFDNUYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJ4LDJcKQotIDk2MSAxMzUwIDhDMTggICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LDJcKQotLipXYXJuaW5nOi4qCi0gOTYyIDEzNTIgOEMxOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsMlwpCi0uKldhcm5pbmc6LioKLSA5NjMgMTM1NCA4QzFBICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwyXCkKLS4qV2FybmluZzouKgotIDk2NCAxMzU2IDhDMUIgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LDJcKQotLipXYXJuaW5nOi4qCi0gOTY1IDEzNTggM0U4QzFDMjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsMlwpCi0uKldhcm5pbmc6LioKLSA5NjYgMTM1YyA4QzFEMDAwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOlwoLDJcKQotLipXYXJuaW5nOi4qCi0gOTY3IDEzNjIgOEMxRSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksMlwpCi0uKldhcm5pbmc6LioKLSA5NjggMTM2NCA4QzFGICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwyXCkKLS4qV2FybmluZzouKgotIDk2OSAxMzY2IDhDMUM2OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYnAsMlwpCi0gOTcwIDEzNjkgOEMxQzY5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVicCwyXCkKLSA5NzEgMTM2YyA4QzFDNkEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJwLDJcKQotIDk3MiAxMzZmIDhDMUM2QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYnAsMlwpCi0gOTczIDEzNzIgM0U4QzFDNkMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVicCwyXCkKLSA5NzQgMTM3NiA4QzFDNkQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYnAsMlwpCi0gOTc1IDEzN2QgOEMxQzZFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVicCwyXCkKLSA5NzYgMTM4MCA4QzFDNkYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJwLDJcKQotIDk3NyAxMzgzIDhDMUM3MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlc2ksMlwpCi0gOTc4IDEzODYgOEMxQzcxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVzaSwyXCkKLSA5NzkgMTM4OSA4QzFDNzIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZXNpLDJcKQotIDk4MCAxMzhjIDhDMUM3MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlc2ksMlwpCi0gOTgxIDEzOGYgM0U4QzFDNzQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVzaSwyXCkKLSA5ODIgMTM5MyA4QzFDNzUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlc2ksMlwpCi0gOTgzIDEzOWEgOEMxQzc2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVzaSwyXCkKLSA5ODQgMTM5ZCA4QzFDNzcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZXNpLDJcKQotIDk4NSAxM2EwIDhDMUM3OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZGksMlwpCi0gOTg2IDEzYTMgOEMxQzc5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkaSwyXCkKLSA5ODcgMTNhNiA4QzFDN0EgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWRpLDJcKQotIDk4OCAxM2E5IDhDMUM3QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZGksMlwpCi0gOTg5IDEzYWMgM0U4QzFDN0MgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkaSwyXCkKLSA5OTAgMTNiMCA4QzFDN0QwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZGksMlwpCi0gOTkxIDEzYjcgOEMxQzdFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkaSwyXCkKLSA5OTIgMTNiYSA4QzFDN0YgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWRpLDJcKQotIDk5MyAxM2JkIDhDMUM4MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYXgsNFwpCi0gOTk0IDEzYzAgOEMxQzgxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVheCw0XCkKLSA5OTUgMTNjMyA4QzFDODIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWF4LDRcKQotIDk5NiAxM2M2IDhDMUM4MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYXgsNFwpCi0gOTk3IDEzYzkgM0U4QzFDODQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVheCw0XCkKLSA5OTggMTNjZCA4QzFDODUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYXgsNFwpCi0gOTk5IDEzZDQgOEMxQzg2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVheCw0XCkKLSAxMDAwIDEzZDcgOEMxQzg3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVheCw0XCkKLSAxMDAxIDEzZGEgOEMxQzg4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVjeCw0XCkKLSAxMDAyIDEzZGQgOEMxQzg5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVjeCw0XCkKLSAxMDAzIDEzZTAgOEMxQzhBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVjeCw0XCkKLSAxMDA0IDEzZTMgOEMxQzhCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVjeCw0XCkKLSAxMDA1IDEzZTYgM0U4QzFDOEMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVjeCw0XCkKLSAxMDA2IDEzZWEgOEMxQzhEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWN4LDRcKQotIDEwMDcgMTNmMSA4QzFDOEUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWN4LDRcKQotIDEwMDggMTNmNCA4QzFDOEYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWN4LDRcKQotIDEwMDkgMTNmNyA4QzFDOTAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWR4LDRcKQotIDEwMTAgMTNmYSA4QzFDOTEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWR4LDRcKQotIDEwMTEgMTNmZCA4QzFDOTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWR4LDRcKQotIDEwMTIgMTQwMCA4QzFDOTMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWR4LDRcKQotIDEwMTMgMTQwMyAzRThDMUM5NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWR4LDRcKQotIDEwMTQgMTQwNyA4QzFDOTUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZHgsNFwpCi0gMTAxNSAxNDBlIDhDMUM5NiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZHgsNFwpCi0gMTAxNiAxNDExIDhDMUM5NyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZHgsNFwpCi0gMTAxNyAxNDE0IDhDMUM5OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYngsNFwpCi0gMTAxOCAxNDE3IDhDMUM5OSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYngsNFwpCi0gMTAxOSAxNDFhIDhDMUM5QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYngsNFwpCi0gMTAyMCAxNDFkIDhDMUM5QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYngsNFwpCi0gMTAyMSAxNDIwIDNFOEMxQzlDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYngsNFwpCi0gMTAyMiAxNDI0IDhDMUM5RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVieCw0XCkKLSAxMDIzIDE0MmIgOEMxQzlFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVieCw0XCkKLSAxMDI0IDE0MmUgOEMxQzlGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVieCw0XCkKLSAxMDI1IDE0MzEgOEMxOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsNFwpCi0uKldhcm5pbmc6LioKLSAxMDI2IDE0MzMgOEMxOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsNFwpCi0uKldhcm5pbmc6LioKLSAxMDI3IDE0MzUgOEMxQSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsNFwpCi0uKldhcm5pbmc6LioKLSAxMDI4IDE0MzcgOEMxQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsNFwpCi0uKldhcm5pbmc6LioKLSAxMDI5IDE0MzkgM0U4QzFDMjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsNFwpCi0uKldhcm5pbmc6LioKLSAxMDMwIDE0M2QgOEMxRDAwMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczpcKCw0XCkKLS4qV2FybmluZzouKgotIDEwMzEgMTQ0MyA4QzFFICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSw0XCkKLS4qV2FybmluZzouKgotIDEwMzIgMTQ0NSA4QzFGICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSw0XCkKLS4qV2FybmluZzouKgotIDEwMzMgMTQ0NyA4QzFDQTggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJwLDRcKQotIDEwMzQgMTQ0YSA4QzFDQTkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJwLDRcKQotIDEwMzUgMTQ0ZCA4QzFDQUEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJwLDRcKQotIDEwMzYgMTQ1MCA4QzFDQUIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJwLDRcKQotIDEwMzcgMTQ1MyAzRThDMUNBQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJwLDRcKQotIDEwMzggMTQ1NyA4QzFDQUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYnAsNFwpCi0gMTAzOSAxNDVlIDhDMUNBRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYnAsNFwpCi0gMTA0MCAxNDYxIDhDMUNBRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYnAsNFwpCi0gMTA0MSAxNDY0IDhDMUNCMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlc2ksNFwpCi0gMTA0MiAxNDY3IDhDMUNCMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlc2ksNFwpCi0gMTA0MyAxNDZhIDhDMUNCMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlc2ksNFwpCi0gMTA0NCAxNDZkIDhDMUNCMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlc2ksNFwpCi0gMTA0NSAxNDcwIDNFOEMxQ0I0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlc2ksNFwpCi0gMTA0NiAxNDc0IDhDMUNCNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVzaSw0XCkKLSAxMDQ3IDE0N2IgOEMxQ0I2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVzaSw0XCkKLSAxMDQ4IDE0N2UgOEMxQ0I3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVzaSw0XCkKLSAxMDQ5IDE0ODEgOEMxQ0I4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkaSw0XCkKLSAxMDUwIDE0ODQgOEMxQ0I5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkaSw0XCkKLSAxMDUxIDE0ODcgOEMxQ0JBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkaSw0XCkKLSAxMDUyIDE0OGEgOEMxQ0JCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkaSw0XCkKLSAxMDUzIDE0OGQgM0U4QzFDQkMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkaSw0XCkKLSAxMDU0IDE0OTEgOEMxQ0JEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWRpLDRcKQotIDEwNTUgMTQ5OCA4QzFDQkUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWRpLDRcKQotIDEwNTYgMTQ5YiA4QzFDQkYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWRpLDRcKQotIDEwNTcgMTQ5ZSA4QzFDQzAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWF4LDhcKQotIDEwNTggMTRhMSA4QzFDQzEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWF4LDhcKQotIDEwNTkgMTRhNCA4QzFDQzIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWF4LDhcKQotIDEwNjAgMTRhNyA4QzFDQzMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWF4LDhcKQotIDEwNjEgMTRhYSAzRThDMUNDNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWF4LDhcKQotIDEwNjIgMTRhZSA4QzFDQzUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYXgsOFwpCi0gMTA2MyAxNGI1IDhDMUNDNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYXgsOFwpCi0gMTA2NCAxNGI4IDhDMUNDNyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYXgsOFwpCi0gMTA2NSAxNGJiIDhDMUNDOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlY3gsOFwpCi0gMTA2NiAxNGJlIDhDMUNDOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlY3gsOFwpCi0gMTA2NyAxNGMxIDhDMUNDQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlY3gsOFwpCi0gMTA2OCAxNGM0IDhDMUNDQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlY3gsOFwpCi0gMTA2OSAxNGM3IDNFOEMxQ0NDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlY3gsOFwpCi0gMTA3MCAxNGNiIDhDMUNDRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVjeCw4XCkKLSAxMDcxIDE0ZDIgOEMxQ0NFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVjeCw4XCkKLSAxMDcyIDE0ZDUgOEMxQ0NGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVjeCw4XCkKLSAxMDczIDE0ZDggOEMxQ0QwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkeCw4XCkKLSAxMDc0IDE0ZGIgOEMxQ0QxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkeCw4XCkKLSAxMDc1IDE0ZGUgOEMxQ0QyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkeCw4XCkKLSAxMDc2IDE0ZTEgOEMxQ0QzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkeCw4XCkKLSAxMDc3IDE0ZTQgM0U4QzFDRDQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkeCw4XCkKLSAxMDc4IDE0ZTggOEMxQ0Q1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWR4LDhcKQotIDEwNzkgMTRlZiA4QzFDRDYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWR4LDhcKQotIDEwODAgMTRmMiA4QzFDRDcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWR4LDhcKQotIDEwODEgMTRmNSA4QzFDRDggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJ4LDhcKQotIDEwODIgMTRmOCA4QzFDRDkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJ4LDhcKQotIDEwODMgMTRmYiA4QzFDREEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJ4LDhcKQotIDEwODQgMTRmZSA4QzFDREIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJ4LDhcKQotIDEwODUgMTUwMSAzRThDMUNEQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJ4LDhcKQotIDEwODYgMTUwNSA4QzFDREQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYngsOFwpCi0gMTA4NyAxNTBjIDhDMUNERSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYngsOFwpCi0gMTA4OCAxNTBmIDhDMUNERiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYngsOFwpCi0gMTA4OSAxNTEyIDhDMTggICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LDhcKQotLipXYXJuaW5nOi4qCi0gMTA5MCAxNTE0IDhDMTkgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LDhcKQotLipXYXJuaW5nOi4qCi0gMTA5MSAxNTE2IDhDMUEgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LDhcKQotLipXYXJuaW5nOi4qCi0gMTA5MiAxNTE4IDhDMUIgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LDhcKQotLipXYXJuaW5nOi4qCi0gMTA5MyAxNTFhIDNFOEMxQzI0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLDhcKQotLipXYXJuaW5nOi4qCi0gMTA5NCAxNTFlIDhDMUQwMDAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6XCgsOFwpCi0uKldhcm5pbmc6LioKLSAxMDk1IDE1MjQgOEMxRSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksOFwpCi0uKldhcm5pbmc6LioKLSAxMDk2IDE1MjYgOEMxRiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksOFwpCi0uKldhcm5pbmc6LioKLSAxMDk3IDE1MjggOEMxQ0U4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVicCw4XCkKLSAxMDk4IDE1MmIgOEMxQ0U5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVicCw4XCkKLSAxMDk5IDE1MmUgOEMxQ0VBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVicCw4XCkKLSAxMTAwIDE1MzEgOEMxQ0VCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVicCw4XCkKLSAxMTAxIDE1MzQgM0U4QzFDRUMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVicCw4XCkKLSAxMTAyIDE1MzggOEMxQ0VEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJwLDhcKQotIDExMDMgMTUzZiA4QzFDRUUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJwLDhcKQotIDExMDQgMTU0MiA4QzFDRUYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJwLDhcKQotIDExMDUgMTU0NSA4QzFDRjAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZXNpLDhcKQotIDExMDYgMTU0OCA4QzFDRjEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZXNpLDhcKQotIDExMDcgMTU0YiA4QzFDRjIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZXNpLDhcKQotIDExMDggMTU0ZSA4QzFDRjMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZXNpLDhcKQotIDExMDkgMTU1MSAzRThDMUNGNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZXNpLDhcKQotIDExMTAgMTU1NSA4QzFDRjUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlc2ksOFwpCi0gMTExMSAxNTVjIDhDMUNGNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlc2ksOFwpCi0gMTExMiAxNTVmIDhDMUNGNyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlc2ksOFwpCi0gMTExMyAxNTYyIDhDMUNGOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZGksOFwpCi0gMTExNCAxNTY1IDhDMUNGQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZGksOFwpCi0gMTExNSAxNTY4IDhDMUNGOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZGksOFwpCi0gMTExNiAxNTZiIDhDMUNGQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZGksOFwpCi0gMTExNyAxNTZlIDNFOEMxQ0ZDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZGksOFwpCi0gMTExOCAxNTcyIDhDMUNGRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkaSw4XCkKLSAxMTE5IDE1NzkgOEMxQ0ZFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkaSw4XCkKLSAxMTIwIDE1N2MgOEMxQ0ZGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkaSw4XCkKLSAxMTIxIDE1N2YgOEM1QzAwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYXgsMVwpCi0gMTEyMiAxNTgzIDhDNUMwMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWF4LDFcKQotIDExMjMgMTU4NyA4QzVDMDIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVheCwxXCkKLSAxMTI0IDE1OGIgOEM1QzAzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYXgsMVwpCi0gMTEyNSAxNThmIDNFOEM1QzA0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWF4LDFcKQotIDExMjYgMTU5NCAzRThDNUMwNSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVheCwxXCkKLSAxMTI3IDE1OTkgOEM1QzA2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYXgsMVwpCi0gMTEyOCAxNTlkIDhDNUMwNzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWF4LDFcKQotIDExMjkgMTVhMSA4QzVDMDgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVjeCwxXCkKLSAxMTMwIDE1YTUgOEM1QzA5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlY3gsMVwpCi0gMTEzMSAxNWE5IDhDNUMwQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWN4LDFcKQotIDExMzIgMTVhZCA4QzVDMEIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVjeCwxXCkKLSAxMTMzIDE1YjEgM0U4QzVDMEMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlY3gsMVwpCi0gMTEzNCAxNWI2IDNFOEM1QzBEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWN4LDFcKQotIDExMzUgMTViYiA4QzVDMEUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVjeCwxXCkKLSAxMTM2IDE1YmYgOEM1QzBGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlY3gsMVwpCi0gMTEzNyAxNWMzIDhDNUMxMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWR4LDFcKQotIDExMzggMTVjNyA4QzVDMTExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkeCwxXCkKLSAxMTM5IDE1Y2IgOEM1QzEyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZHgsMVwpCi0gMTE0MCAxNWNmIDhDNUMxMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWR4LDFcKQotIDExNDEgMTVkMyAzRThDNUMxNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkeCwxXCkKLSAxMTQyIDE1ZDggM0U4QzVDMTUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZHgsMVwpCi0gMTE0MyAxNWRkIDhDNUMxNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWR4LDFcKQotIDExNDQgMTVlMSA4QzVDMTcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkeCwxXCkKLSAxMTQ1IDE1ZTUgOEM1QzE4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYngsMVwpCi0gMTE0NiAxNWU5IDhDNUMxOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJ4LDFcKQotIDExNDcgMTVlZCA4QzVDMUExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVieCwxXCkKLSAxMTQ4IDE1ZjEgOEM1QzFCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYngsMVwpCi0gMTE0OSAxNWY1IDNFOEM1QzFDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJ4LDFcKQotIDExNTAgMTVmYSAzRThDNUMxRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVieCwxXCkKLSAxMTUxIDE1ZmYgOEM1QzFFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYngsMVwpCi0gMTE1MiAxNjAzIDhDNUMxRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJ4LDFcKQotIDExNTMgMTYwNyA4QzU4MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsMVwpCi0gMTE1NCAxNjBhIDhDNTkxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwxXCkKLSAxMTU1IDE2MGQgOEM1QTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LDFcKQotIDExNTYgMTYxMCA4QzVCMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsMVwpCi0gMTE1NyAxNjEzIDNFOEM1QzI0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwxXCkKLSAxMTU4IDE2MTggM0U4QzVEMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLDFcKQotIDExNTkgMTYxYyA4QzVFMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksMVwpCi0gMTE2MCAxNjFmIDhDNUYxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwxXCkKLSAxMTYxIDE2MjIgOEM1QzI4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYnAsMVwpCi0gMTE2MiAxNjI2IDhDNUMyOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJwLDFcKQotIDExNjMgMTYyYSA4QzVDMkExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVicCwxXCkKLSAxMTY0IDE2MmUgOEM1QzJCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYnAsMVwpCi0gMTE2NSAxNjMyIDNFOEM1QzJDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJwLDFcKQotIDExNjYgMTYzNyAzRThDNUMyRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVicCwxXCkKLSAxMTY3IDE2M2MgOEM1QzJFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYnAsMVwpCi0gMTE2OCAxNjQwIDhDNUMyRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJwLDFcKQotIDExNjkgMTY0NCA4QzVDMzAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVzaSwxXCkKLSAxMTcwIDE2NDggOEM1QzMxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlc2ksMVwpCi0gMTE3MSAxNjRjIDhDNUMzMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZXNpLDFcKQotIDExNzIgMTY1MCA4QzVDMzMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVzaSwxXCkKLSAxMTczIDE2NTQgM0U4QzVDMzQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlc2ksMVwpCi0gMTE3NCAxNjU5IDNFOEM1QzM1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZXNpLDFcKQotIDExNzUgMTY1ZSA4QzVDMzYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVzaSwxXCkKLSAxMTc2IDE2NjIgOEM1QzM3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlc2ksMVwpCi0gMTE3NyAxNjY2IDhDNUMzODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWRpLDFcKQotIDExNzggMTY2YSA4QzVDMzkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkaSwxXCkKLSAxMTc5IDE2NmUgOEM1QzNBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZGksMVwpCi0gMTE4MCAxNjcyIDhDNUMzQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWRpLDFcKQotIDExODEgMTY3NiAzRThDNUMzQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkaSwxXCkKLSAxMTgyIDE2N2IgM0U4QzVDM0QgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZGksMVwpCi0gMTE4MyAxNjgwIDhDNUMzRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWRpLDFcKQotIDExODQgMTY4NCA4QzVDM0YxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkaSwxXCkKLSAxMTg1IDE2ODggOEM1QzQwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYXgsMlwpCi0gMTE4NiAxNjhjIDhDNUM0MTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWF4LDJcKQotIDExODcgMTY5MCA4QzVDNDIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVheCwyXCkKLSAxMTg4IDE2OTQgOEM1QzQzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYXgsMlwpCi0gMTE4OSAxNjk4IDNFOEM1QzQ0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWF4LDJcKQotIDExOTAgMTY5ZCAzRThDNUM0NSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVheCwyXCkKLSAxMTkxIDE2YTIgOEM1QzQ2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYXgsMlwpCi0gMTE5MiAxNmE2IDhDNUM0NzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWF4LDJcKQotIDExOTMgMTZhYSA4QzVDNDgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVjeCwyXCkKLSAxMTk0IDE2YWUgOEM1QzQ5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlY3gsMlwpCi0gMTE5NSAxNmIyIDhDNUM0QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWN4LDJcKQotIDExOTYgMTZiNiA4QzVDNEIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVjeCwyXCkKLSAxMTk3IDE2YmEgM0U4QzVDNEMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlY3gsMlwpCi0gMTE5OCAxNmJmIDNFOEM1QzREIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWN4LDJcKQotIDExOTkgMTZjNCA4QzVDNEUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVjeCwyXCkKLSAxMjAwIDE2YzggOEM1QzRGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlY3gsMlwpCi0gMTIwMSAxNmNjIDhDNUM1MDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWR4LDJcKQotIDEyMDIgMTZkMCA4QzVDNTExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkeCwyXCkKLSAxMjAzIDE2ZDQgOEM1QzUyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZHgsMlwpCi0gMTIwNCAxNmQ4IDhDNUM1MzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWR4LDJcKQotIDEyMDUgMTZkYyAzRThDNUM1NCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkeCwyXCkKLSAxMjA2IDE2ZTEgM0U4QzVDNTUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZHgsMlwpCi0gMTIwNyAxNmU2IDhDNUM1NjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWR4LDJcKQotIDEyMDggMTZlYSA4QzVDNTcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkeCwyXCkKLSAxMjA5IDE2ZWUgOEM1QzU4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYngsMlwpCi0gMTIxMCAxNmYyIDhDNUM1OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJ4LDJcKQotIDEyMTEgMTZmNiA4QzVDNUExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVieCwyXCkKLSAxMjEyIDE2ZmEgOEM1QzVCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYngsMlwpCi0gMTIxMyAxNmZlIDNFOEM1QzVDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJ4LDJcKQotIDEyMTQgMTcwMyAzRThDNUM1RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVieCwyXCkKLSAxMjE1IDE3MDggOEM1QzVFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYngsMlwpCi0gMTIxNiAxNzBjIDhDNUM1RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJ4LDJcKQotIDEyMTcgMTcxMCA4QzU4MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsMlwpCi0uKldhcm5pbmc6LioKLSAxMjE4IDE3MTMgOEM1OTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LDJcKQotLipXYXJuaW5nOi4qCi0gMTIxOSAxNzE2IDhDNUExMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwyXCkKLS4qV2FybmluZzouKgotIDEyMjAgMTcxOSA4QzVCMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsMlwpCi0uKldhcm5pbmc6LioKLSAxMjIxIDE3MWMgM0U4QzVDMjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLDJcKQotLipXYXJuaW5nOi4qCi0gMTIyMiAxNzIxIDNFOEM1RDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwyXCkKLS4qV2FybmluZzouKgotIDEyMjMgMTcyNSA4QzVFMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksMlwpCi0uKldhcm5pbmc6LioKLSAxMjI0IDE3MjggOEM1RjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLDJcKQotLipXYXJuaW5nOi4qCi0gMTIyNSAxNzJiIDhDNUM2ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJwLDJcKQotIDEyMjYgMTcyZiA4QzVDNjkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVicCwyXCkKLSAxMjI3IDE3MzMgOEM1QzZBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYnAsMlwpCi0gMTIyOCAxNzM3IDhDNUM2QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJwLDJcKQotIDEyMjkgMTczYiAzRThDNUM2QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVicCwyXCkKLSAxMjMwIDE3NDAgM0U4QzVDNkQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYnAsMlwpCi0gMTIzMSAxNzQ1IDhDNUM2RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJwLDJcKQotIDEyMzIgMTc0OSA4QzVDNkYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVicCwyXCkKLSAxMjMzIDE3NGQgOEM1QzcwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlc2ksMlwpCi0gMTIzNCAxNzUxIDhDNUM3MTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZXNpLDJcKQotIDEyMzUgMTc1NSA4QzVDNzIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVzaSwyXCkKLSAxMjM2IDE3NTkgOEM1QzczMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlc2ksMlwpCi0gMTIzNyAxNzVkIDNFOEM1Qzc0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZXNpLDJcKQotIDEyMzggMTc2MiAzRThDNUM3NSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVzaSwyXCkKLSAxMjM5IDE3NjcgOEM1Qzc2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlc2ksMlwpCi0gMTI0MCAxNzZiIDhDNUM3NzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZXNpLDJcKQotIDEyNDEgMTc2ZiA4QzVDNzgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkaSwyXCkKLSAxMjQyIDE3NzMgOEM1Qzc5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZGksMlwpCi0gMTI0MyAxNzc3IDhDNUM3QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWRpLDJcKQotIDEyNDQgMTc3YiA4QzVDN0IxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkaSwyXCkKLSAxMjQ1IDE3N2YgM0U4QzVDN0MgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZGksMlwpCi0gMTI0NiAxNzg0IDNFOEM1QzdEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWRpLDJcKQotIDEyNDcgMTc4OSA4QzVDN0UxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkaSwyXCkKLSAxMjQ4IDE3OGQgOEM1QzdGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZGksMlwpCi0gMTI0OSAxNzkxIDhDNUM4MDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWF4LDRcKQotIDEyNTAgMTc5NSA4QzVDODExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVheCw0XCkKLSAxMjUxIDE3OTkgOEM1QzgyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYXgsNFwpCi0gMTI1MiAxNzlkIDhDNUM4MzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWF4LDRcKQotIDEyNTMgMTdhMSAzRThDNUM4NCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVheCw0XCkKLSAxMjU0IDE3YTYgM0U4QzVDODUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYXgsNFwpCi0gMTI1NSAxN2FiIDhDNUM4NjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWF4LDRcKQotIDEyNTYgMTdhZiA4QzVDODcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVheCw0XCkKLSAxMjU3IDE3YjMgOEM1Qzg4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlY3gsNFwpCi0gMTI1OCAxN2I3IDhDNUM4OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWN4LDRcKQotIDEyNTkgMTdiYiA4QzVDOEExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVjeCw0XCkKLSAxMjYwIDE3YmYgOEM1QzhCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlY3gsNFwpCi0gMTI2MSAxN2MzIDNFOEM1QzhDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWN4LDRcKQotIDEyNjIgMTdjOCAzRThDNUM4RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVjeCw0XCkKLSAxMjYzIDE3Y2QgOEM1QzhFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlY3gsNFwpCi0gMTI2NCAxN2QxIDhDNUM4RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWN4LDRcKQotIDEyNjUgMTdkNSA4QzVDOTAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkeCw0XCkKLSAxMjY2IDE3ZDkgOEM1QzkxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZHgsNFwpCi0gMTI2NyAxN2RkIDhDNUM5MjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWR4LDRcKQotIDEyNjggMTdlMSA4QzVDOTMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkeCw0XCkKLSAxMjY5IDE3ZTUgM0U4QzVDOTQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZHgsNFwpCi0gMTI3MCAxN2VhIDNFOEM1Qzk1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWR4LDRcKQotIDEyNzEgMTdlZiA4QzVDOTYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkeCw0XCkKLSAxMjcyIDE3ZjMgOEM1Qzk3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZHgsNFwpCi0gMTI3MyAxN2Y3IDhDNUM5ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJ4LDRcKQotIDEyNzQgMTdmYiA4QzVDOTkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVieCw0XCkKLSAxMjc1IDE3ZmYgOEM1QzlBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYngsNFwpCi0gMTI3NiAxODAzIDhDNUM5QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJ4LDRcKQotIDEyNzcgMTgwNyAzRThDNUM5QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVieCw0XCkKLSAxMjc4IDE4MGMgM0U4QzVDOUQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYngsNFwpCi0gMTI3OSAxODExIDhDNUM5RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJ4LDRcKQotIDEyODAgMTgxNSA4QzVDOUYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVieCw0XCkKLSAxMjgxIDE4MTkgOEM1ODEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LDRcKQotLipXYXJuaW5nOi4qCi0gMTI4MiAxODFjIDhDNTkxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDEyODMgMTgxZiA4QzVBMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsNFwpCi0uKldhcm5pbmc6LioKLSAxMjg0IDE4MjIgOEM1QjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LDRcKQotLipXYXJuaW5nOi4qCi0gMTI4NSAxODI1IDNFOEM1QzI0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDEyODYgMTgyYSAzRThDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsNFwpCi0uKldhcm5pbmc6LioKLSAxMjg3IDE4MmUgOEM1RTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gMTI4OCAxODMxIDhDNUYxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSw0XCkKLS4qV2FybmluZzouKgotIDEyODkgMTgzNCA4QzVDQTgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVicCw0XCkKLSAxMjkwIDE4MzggOEM1Q0E5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYnAsNFwpCi0gMTI5MSAxODNjIDhDNUNBQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJwLDRcKQotIDEyOTIgMTg0MCA4QzVDQUIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVicCw0XCkKLSAxMjkzIDE4NDQgM0U4QzVDQUMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYnAsNFwpCi0gMTI5NCAxODQ5IDNFOEM1Q0FEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJwLDRcKQotIDEyOTUgMTg0ZSA4QzVDQUUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVicCw0XCkKLSAxMjk2IDE4NTIgOEM1Q0FGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYnAsNFwpCi0gMTI5NyAxODU2IDhDNUNCMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZXNpLDRcKQotIDEyOTggMTg1YSA4QzVDQjExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVzaSw0XCkKLSAxMjk5IDE4NWUgOEM1Q0IyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlc2ksNFwpCi0gMTMwMCAxODYyIDhDNUNCMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZXNpLDRcKQotIDEzMDEgMTg2NiAzRThDNUNCNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVzaSw0XCkKLSAxMzAyIDE4NmIgM0U4QzVDQjUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlc2ksNFwpCi0gMTMwMyAxODcwIDhDNUNCNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZXNpLDRcKQotIDEzMDQgMTg3NCA4QzVDQjcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVzaSw0XCkKLSAxMzA1IDE4NzggOEM1Q0I4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZGksNFwpCi0gMTMwNiAxODdjIDhDNUNCOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWRpLDRcKQotIDEzMDcgMTg4MCA4QzVDQkExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkaSw0XCkKLSAxMzA4IDE4ODQgOEM1Q0JCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZGksNFwpCi0gMTMwOSAxODg4IDNFOEM1Q0JDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWRpLDRcKQotIDEzMTAgMTg4ZCAzRThDNUNCRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkaSw0XCkKLSAxMzExIDE4OTIgOEM1Q0JFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZGksNFwpCi0gMTMxMiAxODk2IDhDNUNCRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWRpLDRcKQotIDEzMTMgMTg5YSA4QzVDQzAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVheCw4XCkKLSAxMzE0IDE4OWUgOEM1Q0MxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYXgsOFwpCi0gMTMxNSAxOGEyIDhDNUNDMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWF4LDhcKQotIDEzMTYgMThhNiA4QzVDQzMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVheCw4XCkKLSAxMzE3IDE4YWEgM0U4QzVDQzQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYXgsOFwpCi0gMTMxOCAxOGFmIDNFOEM1Q0M1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWF4LDhcKQotIDEzMTkgMThiNCA4QzVDQzYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVheCw4XCkKLSAxMzIwIDE4YjggOEM1Q0M3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYXgsOFwpCi0gMTMyMSAxOGJjIDhDNUNDODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWN4LDhcKQotIDEzMjIgMThjMCA4QzVDQzkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVjeCw4XCkKLSAxMzIzIDE4YzQgOEM1Q0NBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlY3gsOFwpCi0gMTMyNCAxOGM4IDhDNUNDQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWN4LDhcKQotIDEzMjUgMThjYyAzRThDNUNDQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVjeCw4XCkKLSAxMzI2IDE4ZDEgM0U4QzVDQ0QgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlY3gsOFwpCi0gMTMyNyAxOGQ2IDhDNUNDRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWN4LDhcKQotIDEzMjggMThkYSA4QzVDQ0YxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVjeCw4XCkKLSAxMzI5IDE4ZGUgOEM1Q0QwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZHgsOFwpCi0gMTMzMCAxOGUyIDhDNUNEMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWR4LDhcKQotIDEzMzEgMThlNiA4QzVDRDIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkeCw4XCkKLSAxMzMyIDE4ZWEgOEM1Q0QzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZHgsOFwpCi0gMTMzMyAxOGVlIDNFOEM1Q0Q0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWR4LDhcKQotIDEzMzQgMThmMyAzRThDNUNENSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkeCw4XCkKLSAxMzM1IDE4ZjggOEM1Q0Q2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZHgsOFwpCi0gMTMzNiAxOGZjIDhDNUNENzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWR4LDhcKQotIDEzMzcgMTkwMCA4QzVDRDgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVieCw4XCkKLSAxMzM4IDE5MDQgOEM1Q0Q5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYngsOFwpCi0gMTMzOSAxOTA4IDhDNUNEQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJ4LDhcKQotIDEzNDAgMTkwYyA4QzVDREIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVieCw4XCkKLSAxMzQxIDE5MTAgM0U4QzVDREMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYngsOFwpCi0gMTM0MiAxOTE1IDNFOEM1Q0REIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJ4LDhcKQotIDEzNDMgMTkxYSA4QzVDREUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVieCw4XCkKLSAxMzQ0IDE5MWUgOEM1Q0RGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYngsOFwpCi0gMTM0NSAxOTIyIDhDNTgxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCw4XCkKLS4qV2FybmluZzouKgotIDEzNDYgMTkyNSA4QzU5MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsOFwpCi0uKldhcm5pbmc6LioKLSAxMzQ3IDE5MjggOEM1QTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LDhcKQotLipXYXJuaW5nOi4qCi0gMTM0OCAxOTJiIDhDNUIxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCw4XCkKLS4qV2FybmluZzouKgotIDEzNDkgMTkyZSAzRThDNUMyNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsOFwpCi0uKldhcm5pbmc6LioKLSAxMzUwIDE5MzMgM0U4QzVEMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLDhcKQotLipXYXJuaW5nOi4qCi0gMTM1MSAxOTM3IDhDNUUxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDEzNTIgMTkzYSA4QzVGMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksOFwpCi0uKldhcm5pbmc6LioKLSAxMzUzIDE5M2QgOEM1Q0U4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYnAsOFwpCi0gMTM1NCAxOTQxIDhDNUNFOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJwLDhcKQotIDEzNTUgMTk0NSA4QzVDRUExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVicCw4XCkKLSAxMzU2IDE5NDkgOEM1Q0VCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYnAsOFwpCi0gMTM1NyAxOTRkIDNFOEM1Q0VDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJwLDhcKQotIDEzNTggMTk1MiAzRThDNUNFRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVicCw4XCkKLSAxMzU5IDE5NTcgOEM1Q0VFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYnAsOFwpCi0gMTM2MCAxOTViIDhDNUNFRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJwLDhcKQotIDEzNjEgMTk1ZiA4QzVDRjAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVzaSw4XCkKLSAxMzYyIDE5NjMgOEM1Q0YxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlc2ksOFwpCi0gMTM2MyAxOTY3IDhDNUNGMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZXNpLDhcKQotIDEzNjQgMTk2YiA4QzVDRjMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVzaSw4XCkKLSAxMzY1IDE5NmYgM0U4QzVDRjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlc2ksOFwpCi0gMTM2NiAxOTc0IDNFOEM1Q0Y1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZXNpLDhcKQotIDEzNjcgMTk3OSA4QzVDRjYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVzaSw4XCkKLSAxMzY4IDE5N2QgOEM1Q0Y3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlc2ksOFwpCi0gMTM2OSAxOTgxIDhDNUNGODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWRpLDhcKQotIDEzNzAgMTk4NSA4QzVDRkExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkaSw4XCkKLSAxMzcxIDE5ODkgOEM1Q0Y5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZGksOFwpCi0gMTM3MiAxOThkIDhDNUNGQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWRpLDhcKQotIDEzNzMgMTk5MSAzRThDNUNGQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkaSw4XCkKLSAxMzc0IDE5OTYgM0U4QzVDRkQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZGksOFwpCi0gMTM3NSAxOTliIDhDNUNGRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWRpLDhcKQotIDEzNzYgMTk5ZiA4QzVDRkYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkaSw4XCkKLSAxMzc3IDE5YTMgOEM5QzAwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsMVwpCi0gMTM3OCAxOWFhIDhDOUMwMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDFcKQotIDEzNzkgMTliMSA4QzlDMDI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCwxXCkKLSAxMzgwIDE5YjggOEM5QzAzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsMVwpCi0gMTM4MSAxOWJmIDNFOEM5QzA0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDFcKQotIDEzODIgMTljNyAzRThDOUMwNSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCwxXCkKLSAxMzgzIDE5Y2YgOEM5QzA2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsMVwpCi0gMTM4NCAxOWQ2IDhDOUMwNzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDFcKQotIDEzODUgMTlkZCA4QzlDMDg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCwxXCkKLSAxMzg2IDE5ZTQgOEM5QzA5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsMVwpCi0gMTM4NyAxOWViIDhDOUMwQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDFcKQotIDEzODggMTlmMiA4QzlDMEI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCwxXCkKLSAxMzg5IDE5ZjkgM0U4QzlDMEMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsMVwpCi0gMTM5MCAxYTAxIDNFOEM5QzBEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDFcKQotIDEzOTEgMWEwOSA4QzlDMEU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCwxXCkKLSAxMzkyIDFhMTAgOEM5QzBGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsMVwpCi0gMTM5MyAxYTE3IDhDOUMxMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDFcKQotIDEzOTQgMWExZSA4QzlDMTE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCwxXCkKLSAxMzk1IDFhMjUgOEM5QzEyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsMVwpCi0gMTM5NiAxYTJjIDhDOUMxMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDFcKQotIDEzOTcgMWEzMyAzRThDOUMxNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCwxXCkKLSAxMzk4IDFhM2IgM0U4QzlDMTUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsMVwpCi0gMTM5OSAxYTQzIDhDOUMxNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDFcKQotIDE0MDAgMWE0YSA4QzlDMTc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCwxXCkKLSAxNDAxIDFhNTEgOEM5QzE4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYngsMVwpCi0gMTQwMiAxYTU4IDhDOUMxOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDFcKQotIDE0MDMgMWE1ZiA4QzlDMUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCwxXCkKLSAxNDA0IDFhNjYgOEM5QzFCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsMVwpCi0gMTQwNSAxYTZkIDNFOEM5QzFDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDFcKQotIDE0MDYgMWE3NSAzRThDOUMxRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCwxXCkKLSAxNDA3IDFhN2QgOEM5QzFFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYngsMVwpCi0gMTQwOCAxYTg0IDhDOUMxRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDFcKQotIDE0MDkgMWE4YiA4Qzk4Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsMVwpCi0gMTQxMCAxYTkxIDhDOTk3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwxXCkKLSAxNDExIDFhOTcgOEM5QTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LDFcKQotIDE0MTIgMWE5ZCA4QzlCNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsMVwpCi0gMTQxMyAxYWEzIDNFOEM5QzI0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwxXCkKLSAxNDE0IDFhYWIgM0U4QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLDFcKQotIDE0MTUgMWFiMiA4QzlFNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksMVwpCi0gMTQxNiAxYWI4IDhDOUY3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwxXCkKLSAxNDE3IDFhYmUgOEM5QzI4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsMVwpCi0gMTQxOCAxYWM1IDhDOUMyOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDFcKQotIDE0MTkgMWFjYyA4QzlDMkE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCwxXCkKLSAxNDIwIDFhZDMgOEM5QzJCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsMVwpCi0gMTQyMSAxYWRhIDNFOEM5QzJDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDFcKQotIDE0MjIgMWFlMiAzRThDOUMyRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCwxXCkKLSAxNDIzIDFhZWEgOEM5QzJFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsMVwpCi0gMTQyNCAxYWYxIDhDOUMyRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDFcKQotIDE0MjUgMWFmOCA4QzlDMzA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSwxXCkKLSAxNDI2IDFhZmYgOEM5QzMxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksMVwpCi0gMTQyNyAxYjA2IDhDOUMzMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDFcKQotIDE0MjggMWIwZCA4QzlDMzM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSwxXCkKLSAxNDI5IDFiMTQgM0U4QzlDMzQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksMVwpCi0gMTQzMCAxYjFjIDNFOEM5QzM1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDFcKQotIDE0MzEgMWIyNCA4QzlDMzY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSwxXCkKLSAxNDMyIDFiMmIgOEM5QzM3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksMVwpCi0gMTQzMyAxYjMyIDhDOUMzODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDFcKQotIDE0MzQgMWIzOSA4QzlDMzk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSwxXCkKLSAxNDM1IDFiNDAgOEM5QzNBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZGksMVwpCi0gMTQzNiAxYjQ3IDhDOUMzQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDFcKQotIDE0MzcgMWI0ZSAzRThDOUMzQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSwxXCkKLSAxNDM4IDFiNTYgM0U4QzlDM0QgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZGksMVwpCi0gMTQzOSAxYjVlIDhDOUMzRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDFcKQotIDE0NDAgMWI2NSA4QzlDM0Y3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSwxXCkKLSAxNDQxIDFiNmMgOEM5QzQwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsMlwpCi0gMTQ0MiAxYjczIDhDOUM0MTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDJcKQotIDE0NDMgMWI3YSA4QzlDNDI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCwyXCkKLSAxNDQ0IDFiODEgOEM5QzQzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsMlwpCi0gMTQ0NSAxYjg4IDNFOEM5QzQ0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDJcKQotIDE0NDYgMWI5MCAzRThDOUM0NSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCwyXCkKLSAxNDQ3IDFiOTggOEM5QzQ2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsMlwpCi0gMTQ0OCAxYjlmIDhDOUM0Nzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDJcKQotIDE0NDkgMWJhNiA4QzlDNDg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCwyXCkKLSAxNDUwIDFiYWQgOEM5QzQ5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsMlwpCi0gMTQ1MSAxYmI0IDhDOUM0QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDJcKQotIDE0NTIgMWJiYiA4QzlDNEI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCwyXCkKLSAxNDUzIDFiYzIgM0U4QzlDNEMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsMlwpCi0gMTQ1NCAxYmNhIDNFOEM5QzREIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDJcKQotIDE0NTUgMWJkMiA4QzlDNEU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCwyXCkKLSAxNDU2IDFiZDkgOEM5QzRGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsMlwpCi0gMTQ1NyAxYmUwIDhDOUM1MDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDJcKQotIDE0NTggMWJlNyA4QzlDNTE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCwyXCkKLSAxNDU5IDFiZWUgOEM5QzUyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsMlwpCi0gMTQ2MCAxYmY1IDhDOUM1Mzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDJcKQotIDE0NjEgMWJmYyAzRThDOUM1NCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCwyXCkKLSAxNDYyIDFjMDQgM0U4QzlDNTUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsMlwpCi0gMTQ2MyAxYzBjIDhDOUM1Njc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDJcKQotIDE0NjQgMWMxMyA4QzlDNTc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCwyXCkKLSAxNDY1IDFjMWEgOEM5QzU4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYngsMlwpCi0gMTQ2NiAxYzIxIDhDOUM1OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDJcKQotIDE0NjcgMWMyOCA4QzlDNUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCwyXCkKLSAxNDY4IDFjMmYgOEM5QzVCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsMlwpCi0gMTQ2OSAxYzM2IDNFOEM5QzVDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDJcKQotIDE0NzAgMWMzZSAzRThDOUM1RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCwyXCkKLSAxNDcxIDFjNDYgOEM5QzVFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYngsMlwpCi0gMTQ3MiAxYzRkIDhDOUM1Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDJcKQotIDE0NzMgMWM1NCA4Qzk4Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsMlwpCi0uKldhcm5pbmc6LioKLSAxNDc0IDFjNWEgOEM5OTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LDJcKQotLipXYXJuaW5nOi4qCi0gMTQ3NSAxYzYwIDhDOUE3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwyXCkKLS4qV2FybmluZzouKgotIDE0NzYgMWM2NiA4QzlCNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsMlwpCi0uKldhcm5pbmc6LioKLSAxNDc3IDFjNmMgM0U4QzlDMjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLDJcKQotLipXYXJuaW5nOi4qCi0gMTQ3OCAxYzc0IDNFOEM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwyXCkKLS4qV2FybmluZzouKgotIDE0NzkgMWM3YiA4QzlFNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksMlwpCi0uKldhcm5pbmc6LioKLSAxNDgwIDFjODEgOEM5Rjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLDJcKQotLipXYXJuaW5nOi4qCi0gMTQ4MSAxYzg3IDhDOUM2ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDJcKQotIDE0ODIgMWM4ZSA4QzlDNjk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVicCwyXCkKLSAxNDgzIDFjOTUgOEM5QzZBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsMlwpCi0gMTQ4NCAxYzljIDhDOUM2Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDJcKQotIDE0ODUgMWNhMyAzRThDOUM2QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVicCwyXCkKLSAxNDg2IDFjYWIgM0U4QzlDNkQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsMlwpCi0gMTQ4NyAxY2IzIDhDOUM2RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDJcKQotIDE0ODggMWNiYSA4QzlDNkY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVicCwyXCkKLSAxNDg5IDFjYzEgOEM5QzcwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksMlwpCi0gMTQ5MCAxY2M4IDhDOUM3MTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDJcKQotIDE0OTEgMWNjZiA4QzlDNzI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVzaSwyXCkKLSAxNDkyIDFjZDYgOEM5QzczNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksMlwpCi0gMTQ5MyAxY2RkIDNFOEM5Qzc0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDJcKQotIDE0OTQgMWNlNSAzRThDOUM3NSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVzaSwyXCkKLSAxNDk1IDFjZWQgOEM5Qzc2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksMlwpCi0gMTQ5NiAxY2Y0IDhDOUM3Nzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDJcKQotIDE0OTcgMWNmYiA4QzlDNzg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkaSwyXCkKLSAxNDk4IDFkMDIgOEM5Qzc5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZGksMlwpCi0gMTQ5OSAxZDA5IDhDOUM3QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDJcKQotIDE1MDAgMWQxMCA4QzlDN0I3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkaSwyXCkKLSAxNTAxIDFkMTcgM0U4QzlDN0MgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZGksMlwpCi0gMTUwMiAxZDFmIDNFOEM5QzdEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDJcKQotIDE1MDMgMWQyNyA4QzlDN0U3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkaSwyXCkKLSAxNTA0IDFkMmUgOEM5QzdGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZGksMlwpCi0gMTUwNSAxZDM1IDhDOUM4MDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDRcKQotIDE1MDYgMWQzYyA4QzlDODE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCw0XCkKLSAxNTA3IDFkNDMgOEM5QzgyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsNFwpCi0gMTUwOCAxZDRhIDhDOUM4Mzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDRcKQotIDE1MDkgMWQ1MSAzRThDOUM4NCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCw0XCkKLSAxNTEwIDFkNTkgM0U4QzlDODUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsNFwpCi0gMTUxMSAxZDYxIDhDOUM4Njc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDRcKQotIDE1MTIgMWQ2OCA4QzlDODc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVheCw0XCkKLSAxNTEzIDFkNmYgOEM5Qzg4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsNFwpCi0gMTUxNCAxZDc2IDhDOUM4OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDRcKQotIDE1MTUgMWQ3ZCA4QzlDOEE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCw0XCkKLSAxNTE2IDFkODQgOEM5QzhCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsNFwpCi0gMTUxNyAxZDhiIDNFOEM5QzhDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDRcKQotIDE1MTggMWQ5MyAzRThDOUM4RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCw0XCkKLSAxNTE5IDFkOWIgOEM5QzhFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsNFwpCi0gMTUyMCAxZGEyIDhDOUM4Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDRcKQotIDE1MjEgMWRhOSA4QzlDOTA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCw0XCkKLSAxNTIyIDFkYjAgOEM5QzkxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsNFwpCi0gMTUyMyAxZGI3IDhDOUM5Mjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDRcKQotIDE1MjQgMWRiZSA4QzlDOTM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCw0XCkKLSAxNTI1IDFkYzUgM0U4QzlDOTQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsNFwpCi0gMTUyNiAxZGNkIDNFOEM5Qzk1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDRcKQotIDE1MjcgMWRkNSA4QzlDOTY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCw0XCkKLSAxNTI4IDFkZGMgOEM5Qzk3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsNFwpCi0gMTUyOSAxZGUzIDhDOUM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDRcKQotIDE1MzAgMWRlYSA4QzlDOTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCw0XCkKLSAxNTMxIDFkZjEgOEM5QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYngsNFwpCi0gMTUzMiAxZGY4IDhDOUM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDRcKQotIDE1MzMgMWRmZiAzRThDOUM5QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCw0XCkKLSAxNTM0IDFlMDcgM0U4QzlDOUQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYngsNFwpCi0gMTUzNSAxZTBmIDhDOUM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDRcKQotIDE1MzYgMWUxNiA4QzlDOUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVieCw0XCkKLSAxNTM3IDFlMWQgOEM5ODc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LDRcKQotLipXYXJuaW5nOi4qCi0gMTUzOCAxZTIzIDhDOTk3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDE1MzkgMWUyOSA4QzlBNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsNFwpCi0uKldhcm5pbmc6LioKLSAxNTQwIDFlMmYgOEM5Qjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LDRcKQotLipXYXJuaW5nOi4qCi0gMTU0MSAxZTM1IDNFOEM5QzI0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDE1NDIgMWUzZCAzRThDOUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsNFwpCi0uKldhcm5pbmc6LioKLSAxNTQzIDFlNDQgOEM5RTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gMTU0NCAxZTRhIDhDOUY3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSw0XCkKLS4qV2FybmluZzouKgotIDE1NDUgMWU1MCA4QzlDQTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCw0XCkKLSAxNTQ2IDFlNTcgOEM5Q0E5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsNFwpCi0gMTU0NyAxZTVlIDhDOUNBQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDRcKQotIDE1NDggMWU2NSA4QzlDQUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVicCw0XCkKLSAxNTQ5IDFlNmMgM0U4QzlDQUMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsNFwpCi0gMTU1MCAxZTc0IDNFOEM5Q0FEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDRcKQotIDE1NTEgMWU3YyA4QzlDQUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCw0XCkKLSAxNTUyIDFlODMgOEM5Q0FGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsNFwpCi0gMTU1MyAxZThhIDhDOUNCMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDRcKQotIDE1NTQgMWU5MSA4QzlDQjE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSw0XCkKLSAxNTU1IDFlOTggOEM5Q0IyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksNFwpCi0gMTU1NiAxZTlmIDhDOUNCMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDRcKQotIDE1NTcgMWVhNiAzRThDOUNCNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSw0XCkKLSAxNTU4IDFlYWUgM0U4QzlDQjUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksNFwpCi0gMTU1OSAxZWI2IDhDOUNCNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDRcKQotIDE1NjAgMWViZCA4QzlDQjc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSw0XCkKLSAxNTYxIDFlYzQgOEM5Q0I4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZGksNFwpCi0gMTU2MiAxZWNiIDhDOUNCOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDRcKQotIDE1NjMgMWVkMiA4QzlDQkE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSw0XCkKLSAxNTY0IDFlZDkgOEM5Q0JCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksNFwpCi0gMTU2NSAxZWUwIDNFOEM5Q0JDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDRcKQotIDE1NjYgMWVlOCAzRThDOUNCRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSw0XCkKLSAxNTY3IDFlZjAgOEM5Q0JFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZGksNFwpCi0gMTU2OCAxZWY3IDhDOUNCRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDRcKQotIDE1NjkgMWVmZSA4QzlDQzA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCw4XCkKLSAxNTcwIDFmMDUgOEM5Q0MxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsOFwpCi0gMTU3MSAxZjBjIDhDOUNDMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDhcKQotIDE1NzIgMWYxMyA4QzlDQzM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVheCw4XCkKLSAxNTczIDFmMWEgM0U4QzlDQzQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsOFwpCi0gMTU3NCAxZjIyIDNFOEM5Q0M1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDhcKQotIDE1NzUgMWYyYSA4QzlDQzY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCw4XCkKLSAxNTc2IDFmMzEgOEM5Q0M3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsOFwpCi0gMTU3NyAxZjM4IDhDOUNDODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDhcKQotIDE1NzggMWYzZiA4QzlDQzk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCw4XCkKLSAxNTc5IDFmNDYgOEM5Q0NBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsOFwpCi0gMTU4MCAxZjRkIDhDOUNDQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDhcKQotIDE1ODEgMWY1NCAzRThDOUNDQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCw4XCkKLSAxNTgyIDFmNWMgM0U4QzlDQ0QgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsOFwpCi0gMTU4MyAxZjY0IDhDOUNDRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDhcKQotIDE1ODQgMWY2YiA4QzlDQ0Y3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCw4XCkKLSAxNTg1IDFmNzIgOEM5Q0QwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsOFwpCi0gMTU4NiAxZjc5IDhDOUNEMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDhcKQotIDE1ODcgMWY4MCA4QzlDRDI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCw4XCkKLSAxNTg4IDFmODcgOEM5Q0QzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsOFwpCi0gMTU4OSAxZjhlIDNFOEM5Q0Q0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDhcKQotIDE1OTAgMWY5NiAzRThDOUNENSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCw4XCkKLSAxNTkxIDFmOWUgOEM5Q0Q2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsOFwpCi0gMTU5MiAxZmE1IDhDOUNENzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDhcKQotIDE1OTMgMWZhYyA4QzlDRDg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCw4XCkKLSAxNTk0IDFmYjMgOEM5Q0Q5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYngsOFwpCi0gMTU5NSAxZmJhIDhDOUNEQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDhcKQotIDE1OTYgMWZjMSA4QzlDREI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVieCw4XCkKLSAxNTk3IDFmYzggM0U4QzlDREMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYngsOFwpCi0gMTU5OCAxZmQwIDNFOEM5Q0REIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDhcKQotIDE1OTkgMWZkOCA4QzlDREU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCw4XCkKLSAxNjAwIDFmZGYgOEM5Q0RGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYngsOFwpCi0gMTYwMSAxZmU2IDhDOTg3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCw4XCkKLS4qV2FybmluZzouKgotIDE2MDIgMWZlYyA4Qzk5Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsOFwpCi0uKldhcm5pbmc6LioKLSAxNjAzIDFmZjIgOEM5QTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LDhcKQotLipXYXJuaW5nOi4qCi0gMTYwNCAxZmY4IDhDOUI3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCw4XCkKLS4qV2FybmluZzouKgotIDE2MDUgMWZmZSAzRThDOUMyNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsOFwpCi0uKldhcm5pbmc6LioKLSAxNjA2IDIwMDYgM0U4QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLDhcKQotLipXYXJuaW5nOi4qCi0gMTYwNyAyMDBkIDhDOUU3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDE2MDggMjAxMyA4QzlGNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksOFwpCi0uKldhcm5pbmc6LioKLSAxNjA5IDIwMTkgOEM5Q0U4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsOFwpCi0gMTYxMCAyMDIwIDhDOUNFOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDhcKQotIDE2MTEgMjAyNyA4QzlDRUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCw4XCkKLSAxNjEyIDIwMmUgOEM5Q0VCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsOFwpCi0gMTYxMyAyMDM1IDNFOEM5Q0VDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDhcKQotIDE2MTQgMjAzZCAzRThDOUNFRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCw4XCkKLSAxNjE1IDIwNDUgOEM5Q0VFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsOFwpCi0gMTYxNiAyMDRjIDhDOUNFRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDhcKQotIDE2MTcgMjA1MyA4QzlDRjA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSw4XCkKLSAxNjE4IDIwNWEgOEM5Q0YxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksOFwpCi0gMTYxOSAyMDYxIDhDOUNGMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDhcKQotIDE2MjAgMjA2OCA4QzlDRjM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSw4XCkKLSAxNjIxIDIwNmYgM0U4QzlDRjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksOFwpCi0gMTYyMiAyMDc3IDNFOEM5Q0Y1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDhcKQotIDE2MjMgMjA3ZiA4QzlDRjY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSw4XCkKLSAxNjI0IDIwODYgOEM5Q0Y3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksOFwpCi0gMTYyNSAyMDhkIDhDOUNGODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDhcKQotIDE2MjYgMjA5NCA4QzlDRkE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSw4XCkKLSAxNjI3IDIwOWIgOEM5Q0Y5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZGksOFwpCi0gMTYyOCAyMGEyIDhDOUNGQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDhcKQotIDE2MjkgMjBhOSAzRThDOUNGQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSw4XCkKLSAxNjMwIDIwYjEgM0U4QzlDRkQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZGksOFwpCi0gMTYzMSAyMGI5IDhDOUNGRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDhcKQotIDE2MzIgMjBjMCA4QzlDRkY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSw4XCkKLSAxNjMzIDIwYzcgM0U4QzVDMDUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVheCwxXCkKLSAxNjM0IDIwY2MgM0U4QzVDMEQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVjeCwxXCkKLSAxNjM1IDIwZDEgM0U4QzVDMTUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkeCwxXCkKLSAxNjM2IDIwZDYgM0U4QzVDMUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVieCwxXCkKLSAxNjM3IDIwZGIgM0U4QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsMVwpCi0gMTYzOCAyMGRmIDNFOEM1QzJEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYnAsMVwpCi0gMTYzOSAyMGU0IDNFOEM1QzM1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlc2ksMVwpCi0gMTY0MCAyMGU5IDNFOEM1QzNEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZGksMVwpCi0gMTY0MSAyMGVlIDNFOEM1QzQ1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYXgsMlwpCi0gMTY0MiAyMGYzIDNFOEM1QzREIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlY3gsMlwpCi0gMTY0MyAyMGY4IDNFOEM1QzU1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZHgsMlwpCi0gMTY0NCAyMGZkIDNFOEM1QzVEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYngsMlwpCi0gMTY0NSAyMTAyIDNFOEM1RDAwICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gMTY0NiAyMTA2IDNFOEM1QzZEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYnAsMlwpCi0gMTY0NyAyMTBiIDNFOEM1Qzc1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlc2ksMlwpCi0gMTY0OCAyMTEwIDNFOEM1QzdEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZGksMlwpCi0gMTY0OSAyMTE1IDNFOEM1Qzg1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYXgsNFwpCi0gMTY1MCAyMTFhIDNFOEM1QzhEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlY3gsNFwpCi0gMTY1MSAyMTFmIDNFOEM1Qzk1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZHgsNFwpCi0gMTY1MiAyMTI0IDNFOEM1QzlEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYngsNFwpCi0gMTY1MyAyMTI5IDNFOEM1RDAwICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLDRcKQotLipXYXJuaW5nOi4qCi0gMTY1NCAyMTJkIDNFOEM1Q0FEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYnAsNFwpCi0gMTY1NSAyMTMyIDNFOEM1Q0I1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlc2ksNFwpCi0gMTY1NiAyMTM3IDNFOEM1Q0JEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZGksNFwpCi0gMTY1NyAyMTNjIDNFOEM1Q0M1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYXgsOFwpCi0gMTY1OCAyMTQxIDNFOEM1Q0NEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlY3gsOFwpCi0gMTY1OSAyMTQ2IDNFOEM1Q0Q1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZHgsOFwpCi0gMTY2MCAyMTRiIDNFOEM1Q0REIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYngsOFwpCi0gMTY2MSAyMTUwIDNFOEM1RDAwICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLDhcKQotLipXYXJuaW5nOi4qCi0gMTY2MiAyMTU0IDNFOEM1Q0VEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYnAsOFwpCi0gMTY2MyAyMTU5IDNFOEM1Q0Y1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlc2ksOFwpCi0gMTY2NCAyMTVlIDNFOEM1Q0ZEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZGksOFwpCi0gMTY2NSAyMTYzIDhDMUQxMjAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoLDFcKQotIDE2NjYgMjE2OSA4QzFEMTIwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCwyXCkKLS4qV2FybmluZzouKgotIDE2NjcgMjE2ZiA4QzFEMTIwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCw0XCkKLS4qV2FybmluZzouKgotIDE2NjggMjE3NSA4QzFEMTIwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCw4XCkKLS4qV2FybmluZzouKgotIDE2NjkgWyAJXSoKLSAxNjcwIFsgCV0qICAgICAJCSMgRm9yY2UgYSBnb29kIGFsaWdubWVudC4KLSAxNjcxIDIxN2IgMDAwMDAwMDAgMDBbIAldKi5wMmFsaWduCTQsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmQ0NDZjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbW9kcm0ucworKysgL2Rldi9udWxsCkBAIC0xLDE2NzEgKzAsMCBAQAotLnBzaXplIDAKLS50ZXh0Ci0JbW92CSVkcywlc3M6KCVlYXgpCi0JbW92CSVkcywlc3M6KCVlY3gpCi0JbW92CSVkcywlc3M6KCVlZHgpCi0JbW92CSVkcywlc3M6KCVlYngpCi0JbW92CSVkcywlc3M6MAotCW1vdgklZHMsJXNzOiglZXNpKQotCW1vdgklZHMsJXNzOiglZWRpKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnApCi0JbW92CSVkcywlc3M6MHgxMiglZXNpKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGkpCi0JbW92CSVkcywlZWF4Ci0JbW92CSVkcywlZWN4Ci0JbW92CSVkcywlZWR4Ci0JbW92CSVkcywlZWJ4Ci0JbW92CSVkcywlZXNwCi0JbW92CSVkcywlZWJwCi0JbW92CSVkcywlZXNpCi0JbW92CSVkcywlZWRpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVheCwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVheCwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYXgsMSkKLQltb3YJJWRzLCVzczooLCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVheCwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVjeCwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVzcCwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWRpLCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVheCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVieCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkeCwxKQotCW1vdgklZHMsJXNzOigsJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVieCwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVieCwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYngsMSkKLQltb3YJJWRzLCVzczooLCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVieCwxKQotCW1vdgklZHMsJXNzOiglZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlc3AsMSkKLQltb3YJJWRzLCVzczooLDEpCi0JbW92CSVkcywlc3M6KCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVjeCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVzcCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWRpLCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVheCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVieCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVzaSwxKQotCW1vdgklZHMsJXNzOigsJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlZGksMSkKLQltb3YJJWRzLCVzczooLCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVjeCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVzcCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVheCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWR4LCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVieCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVjeCwyKQotCW1vdgklZHMsJXNzOigsJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZXNpLCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVkaSwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVkeCwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlZHgsMikKLQltb3YJJWRzLCVzczooLCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVzaSwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlYngsMikKLQltb3YJJWRzLCVzczooJWVjeCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVieCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYngsMikKLQltb3YJJWRzLCVzczooJWVzcCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVieCwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlYngsMikKLQltb3YJJWRzLCVzczooJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVieCwyKQotCW1vdgklZHMsJXNzOiglZXNwLDIpCi0JbW92CSVkcywlc3M6KCwyKQotCW1vdgklZHMsJXNzOiglZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlZGksMikKLQltb3YJJWRzLCVzczooJWVheCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVicCwyKQotCW1vdgklZHMsJXNzOiglZWR4LCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVieCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVicCwyKQotCW1vdgklZHMsJXNzOigsJWVicCwyKQotCW1vdgklZHMsJXNzOiglZXNpLCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVkaSwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVkeCwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlc2ksMikKLQltb3YJJWRzLCVzczooLCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVzaSwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlZGksMikKLQltb3YJJWRzLCVzczooJWVjeCwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZGksMikKLQltb3YJJWRzLCVzczooJWVzcCwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlZGksMikKLQltb3YJJWRzLCVzczooJWVheCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVieCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVheCw0KQotCW1vdgklZHMsJXNzOigsJWVheCw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWN4LCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlYngsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZXNwLCVlY3gsNCkKLQltb3YJJWRzLCVzczooLCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlZGksJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWF4LCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVieCw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVieCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVieCw0KQotCW1vdgklZHMsJXNzOigsJWVieCw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVzcCw0KQotCW1vdgklZHMsJXNzOigsNCkKLQltb3YJJWRzLCVzczooJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVicCw0KQotCW1vdgklZHMsJXNzOiglZWN4LCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlYngsJWVicCw0KQotCW1vdgklZHMsJXNzOiglZXNwLCVlYnAsNCkKLQltb3YJJWRzLCVzczooLCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlZGksJWVicCw0KQotCW1vdgklZHMsJXNzOiglZWF4LCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVieCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkaSw0KQotCW1vdgklZHMsJXNzOigsJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVheCw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVheCw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlYXgsOCkKLQltb3YJJWRzLCVzczooLCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVheCw4KQotCW1vdgklZHMsJXNzOiglZWF4LCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWRpLCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVheCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVieCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkeCw4KQotCW1vdgklZHMsJXNzOigsJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVieCw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVieCw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlYngsOCkKLQltb3YJJWRzLCVzczooLCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVieCw4KQotCW1vdgklZHMsJXNzOiglZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlc3AsOCkKLQltb3YJJWRzLCVzczooLDgpCi0JbW92CSVkcywlc3M6KCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZWF4LCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWRpLCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVheCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVieCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVzaSw4KQotCW1vdgklZHMsJXNzOigsJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlZGksOCkKLQltb3YJJWRzLCVzczooLCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVheCwxKQotCW1vdgklZHMsJXNzOiglZWJwLCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVieCwxKQotCW1vdgklZHMsJXNzOiglZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWJwLCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWJwLCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVicCwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVieCwyKQotCW1vdgklZHMsJXNzOiglZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVicCwyKQotCW1vdgklZHMsJXNzOiglZWJwLCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVicCwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWJwLCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVieCw0KQotCW1vdgklZHMsJXNzOiglZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVicCw0KQotCW1vdgklZHMsJXNzOiglZWJwLCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVheCw4KQotCW1vdgklZHMsJXNzOiglZWJwLCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVieCw4KQotCW1vdgklZHMsJXNzOiglZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWJwLCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMigsMSkKLQltb3YJJWRzLCVzczoweDEyKCwyKQotCW1vdgklZHMsJXNzOjB4MTIoLDQpCi0JbW92CSVkcywlc3M6MHgxMigsOCkKLQltb3YJJWRzLCVkczooJWVheCkKLQltb3YJJWRzLCVkczooJWVjeCkKLQltb3YJJWRzLCVkczooJWVkeCkKLQltb3YJJWRzLCVkczooJWVieCkKLQltb3YJJWRzLCVkczowCi0JbW92CSVkcywlZHM6KCVlc2kpCi0JbW92CSVkcywlZHM6KCVlZGkpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2kpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnApCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSkKLQltb3YJJWRzLCVlYXgKLQltb3YJJWRzLCVlY3gKLQltb3YJJWRzLCVlZHgKLQltb3YJJWRzLCVlYngKLQltb3YJJWRzLCVlc3AKLQltb3YJJWRzLCVlYnAKLQltb3YJJWRzLCVlc2kKLQltb3YJJWRzLCVlZGkKLQltb3YJJWRzLCVkczooJWVheCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVieCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVheCwxKQotCW1vdgklZHMsJWRzOigsJWVheCwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVkeCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlYngsJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVkczooLCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlZGksJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZWF4LCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVieCwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVieCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVieCwxKQotCW1vdgklZHMsJWRzOigsJWVieCwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVzcCwxKQotCW1vdgklZHMsJWRzOigsMSkKLQltb3YJJWRzLCVkczooJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVicCwxKQotCW1vdgklZHMsJWRzOiglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVkeCwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlYngsJWVicCwxKQotCW1vdgklZHMsJWRzOiglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVkczooLCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlZGksJWVicCwxKQotCW1vdgklZHMsJWRzOiglZWF4LCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVieCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJWRzOigsJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVheCwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVkeCwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVheCwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVkczooLCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVheCwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWRpLCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVheCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVieCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJWRzOigsJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVkaSwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVieCwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlYngsMikKLQltb3YJJWRzLCVkczooJWVkeCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVieCwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlYngsMikKLQltb3YJJWRzLCVkczooLCVlYngsMikKLQltb3YJJWRzLCVkczooJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVieCwyKQotCW1vdgklZHMsJWRzOiglZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlc3AsMikKLQltb3YJJWRzLCVkczooLDIpCi0JbW92CSVkcywlZHM6KCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWRpLCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVheCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVieCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJWRzOigsJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVkaSwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlZGksMikKLQltb3YJJWRzLCVkczooJWVkeCwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlZGksMikKLQltb3YJJWRzLCVkczooLCVlZGksMikKLQltb3YJJWRzLCVkczooJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVheCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZWR4LCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVieCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJWRzOigsJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVkczooLCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVieCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVieCw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVieCw0KQotCW1vdgklZHMsJWRzOiglZXNwLDQpCi0JbW92CSVkcywlZHM6KCw0KQotCW1vdgklZHMsJWRzOiglZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVheCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWR4LCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVieCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVicCw0KQotCW1vdgklZHMsJWRzOigsJWVicCw0KQotCW1vdgklZHMsJWRzOiglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVkczooLCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVheCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWR4LCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVieCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVheCw4KQotCW1vdgklZHMsJWRzOigsJWVheCw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlYngsJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVkczooLCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlZGksJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZWF4LCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVheCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVieCw4KQotCW1vdgklZHMsJWRzOiglZWR4LCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVieCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVieCw4KQotCW1vdgklZHMsJWRzOigsJWVieCw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVzcCw4KQotCW1vdgklZHMsJWRzOigsOCkKLQltb3YJJWRzLCVkczooJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVicCw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlYngsJWVicCw4KQotCW1vdgklZHMsJWRzOiglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVkczooLCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlZGksJWVicCw4KQotCW1vdgklZHMsJWRzOiglZWF4LCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVheCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVieCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJWRzOigsJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVicCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVicCwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVicCwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVicCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVicCwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlZGksMikKLQltb3YJJWRzLCVkczooJWVicCwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVicCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVicCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVicCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVicCwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCwxKQotCW1vdgklZHMsJWRzOjB4MTIoLDIpCi0JbW92CSVkcywlZHM6MHgxMigsNCkKLQltb3YJJWRzLCVkczoweDEyKCw4KQotCi0JIyBGb3JjZSBhIGdvb2QgYWxpZ25tZW50LgotCS5wMmFsaWduCTQsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9uYWtlZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9uYWtlZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDZlMzAwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbmFrZWQuZAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSNvYmpkdW1wOiAtZHJ3Ci0jbmFtZTogaTM4NiBuYWtlZCByZWcKLQotLio6ICtmaWxlIGZvcm1hdCAuKmkzODYuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8Zm9vPjoKLSAgIDA6CTY2IDI2IGZmIDIzIFsgCV0qam1wdyAgIFwqJWVzOlwoJWVieFwpCi0gICA0Ogk4YSAyNSA1MCAwMCAwMCAwMCBbIAldKm1vdiAgICAweDUwLCVhaAotICAgYToJYjIgMjAgWyAJXSptb3YgICAgXCQweDIwLCVkbAotICAgYzoJYmIgMDAgMDAgMDAgMDAgWyAJXSptb3YgICAgXCQweDAsJWVieAlkOiAoUl8zODZfKT8oZGlyKT8zMgkudGV4dAotICAxMToJZDkgYzkgWyAJXSpmeGNoICAgJXN0XCgxXCkKLSAgMTM6CTM2IDhjIGE0IDgxIGQyIDA0IDAwIDAwIFsgCV0qbW92bCAgICVmcywlc3M6MHg0ZDJcKCVlY3gsJWVheCw0XCkKLSAgMWI6CThjIDJjIGVkIDAwIDAwIDAwIDAwIFsgCV0qbW92bCAgICVncywweDBcKCwlZWJwLDhcKQotICAyMjoJMjYgODggMjUgMDAgMDAgMDAgMDAgWyAJXSptb3YgICAgJWFoLCVlczoweDAKLSAgMjk6CTJlIDhiIDc0IDE0IDgwIFsgCV0qbW92ICAgICVjczoweGZmZmZmZjgwXCglZXNwLCVlZHgsMVwpLCVlc2kKLSAgMmU6CWYzIDY1IGE1IFsgCV0qcmVweiBtb3ZzbCAlZ3M6XCglZXNpXCksJWVzOlwoJWVkaVwpCi0gIDMxOgllYyBbIAldKmluICAgICBcKCVkeFwpLCVhbAotICAzMjoJNjYgZWYgWyAJXSpvdXQgICAgJWF4LFwoJWR4XCkKLSAgMzQ6CTY3IGQyIDE0IFsgCV0qYWRkcjE2IHJjbGIgJWNsLFwoJXNpXCkKLSAgMzc6CTBmIDIwIGQwIFsgCV0qbW92ICAgICVjcjIsJWVheAotICAzYToJMGYgNzIgZDAgMDQgWyAJXSpwc3JsZCAgXCQweDQsJW1tMAotICAzZToJNjYgNDcgWyAJXSppbmMgICAgJWRpCi0gIDQwOgk2NiA1MSBbIAldKnB1c2ggICAlY3gKLSAgNDI6CTY2IDU4IFsgCV0qcG9wICAgICVheAotICA0NDoJNjYgODcgZGQgWyAJXSp4Y2hnICAgJWJ4LCVicAotICA0NzoJNmEgMDIgWyAJXSpwdXNoICAgXCQweDIKLSAgNDk6CTAwIDAwIFsgCV0qYWRkICAgICVhbCxcKCVlYXhcKQotICA0YjoJMDAgMDAgWyAJXSphZGQgICAgJWFsLFwoJWVheFwpCi0gIDRkOgkwMCAwMCBbIAldKmFkZCAgICAlYWwsXCglZWF4XCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbmFrZWQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbmFrZWQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyY2M0Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L25ha2VkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0uYXR0X3N5bnRheCBub3ByZWZpeAotCi1mb286CWptcHcgZXM6KihlYngpCi0JbW92ICgweDgqMHhhKSxhaAotCW1vdiAkKDgqNCksZGwKLQltb3YgJGZvbyxlYngKLQlmeGNoIHN0KDEpCi0JbW92IGZzLHNzOjEyMzQoZWN4LGVheCw0KQotCW1vdiBncyxkczooLGVicCw4KQotCW1vdiBhaCxlczowCi0JbW92IGNzOi0xMjgoZXNwLGVkeCksZXNpCi0JcmVwIG1vdnNsIGdzOihlc2kpLGVzOihlZGkpCi0JaW4gZHgsYWwKLQlvdXR3IChkeCkKLSBhZGRyMTYgcmNsYiBjbCwoc2kpCi0JbW92IGNyMixlYXgKLQlwc3JsZCAkNCxtbTAKLQlpbmMgZGkKLQlwdXNoIGN4Ci0JcG9wIGF4Ci0JeGNoZyBieCxicAotCXB1c2hsICQyCi0KLSMgRm9yY2UgYSBnb29kIGFsaWdubWVudC4KLS5wMmFsaWduCTQsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvb3Bjb2RlLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjQ5ZDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUuZAorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0jYXM6IC1KCi0jb2JqZHVtcDogLWR3Ci0jbmFtZTogaTM4NiBvcGNvZGUKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8Zm9vPjoKLSAgIDA6CTAwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgIDY6CTAxIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gICBjOgkwMiA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIDEyOgkwMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICAxODoJMDQgOTAgWyAJXSphZGQgICAgXCQweDkwLCVhbAotICAxYToJMDUgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgMWY6CTA2IFsgCV0qcHVzaCAgICVlcwotICAyMDoJMDcgWyAJXSpwb3AgICAgJWVzCi0gIDIxOgkwOCA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDI3OgkwOSA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICAyZDoJMGEgOTAgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICAzMzoJMGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgMzk6CTBjIDkwIFsgCV0qb3IgICAgIFwkMHg5MCwlYWwKLSAgM2I6CTBkIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIDQwOgkwZSBbIAldKnB1c2ggICAlY3MKLSAgNDE6CTEwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgNDc6CTExIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDRkOgkxMiA5MCA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIDUzOgkxMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICA1OToJMTQgOTAgWyAJXSphZGMgICAgXCQweDkwLCVhbAotICA1YjoJMTUgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgNjA6CTE2IFsgCV0qcHVzaCAgICVzcwotICA2MToJMTcgWyAJXSpwb3AgICAgJXNzCi0gIDYyOgkxOCA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDY4OgkxOSA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICA2ZToJMWEgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICA3NDoJMWIgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgN2E6CTFjIDkwIFsgCV0qc2JiICAgIFwkMHg5MCwlYWwKLSAgN2M6CTFkIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIDgxOgkxZSBbIAldKnB1c2ggICAlZHMKLSAgODI6CTFmIFsgCV0qcG9wICAgICVkcwotICA4MzoJMjAgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICA4OToJMjEgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgOGY6CTIyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgOTU6CTIzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIDliOgkyNCA5MCBbIAldKmFuZCAgICBcJDB4OTAsJWFsCi0gIDlkOgkyNSA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICBcJDB4OTA5MDkwOTAsJWVheAotICBhMjoJMjcgWyAJXSpkYWEgICAgCi0gIGEzOgkyOCA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGE5OgkyOSA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICBhZjoJMmEgOTAgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICBiNToJMmIgOTAgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgYmI6CTJjIDkwIFsgCV0qc3ViICAgIFwkMHg5MCwlYWwKLSAgYmQ6CTJkIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIGMyOgkyZiBbIAldKmRhcyAgICAKLSAgYzM6CTMwIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgYzk6CTMxIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGNmOgkzMiA5MCA5MCA5MCA5MCA5MCBbIAldKnhvciAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIGQ1OgkzMyA5MCA5MCA5MCA5MCA5MCBbIAldKnhvciAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICBkYjoJMzQgOTAgWyAJXSp4b3IgICAgXCQweDkwLCVhbAotICBkZDoJMzUgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgZTI6CTM3IFsgCV0qYWFhICAgIAotICBlMzoJMzggOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICBlOToJMzkgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgZWY6CTNhIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgZjU6CTNiIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIGZiOgkzYyA5MCBbIAldKmNtcCAgICBcJDB4OTAsJWFsCi0gIGZkOgkzZCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICBcJDB4OTA5MDkwOTAsJWVheAotIDEwMjoJM2YgWyAJXSphYXMgICAgCi0gMTAzOgk0MCBbIAldKmluYyAgICAlZWF4Ci0gMTA0Ogk0MSBbIAldKmluYyAgICAlZWN4Ci0gMTA1Ogk0MiBbIAldKmluYyAgICAlZWR4Ci0gMTA2Ogk0MyBbIAldKmluYyAgICAlZWJ4Ci0gMTA3Ogk0NCBbIAldKmluYyAgICAlZXNwCi0gMTA4Ogk0NSBbIAldKmluYyAgICAlZWJwCi0gMTA5Ogk0NiBbIAldKmluYyAgICAlZXNpCi0gMTBhOgk0NyBbIAldKmluYyAgICAlZWRpCi0gMTBiOgk0OCBbIAldKmRlYyAgICAlZWF4Ci0gMTBjOgk0OSBbIAldKmRlYyAgICAlZWN4Ci0gMTBkOgk0YSBbIAldKmRlYyAgICAlZWR4Ci0gMTBlOgk0YiBbIAldKmRlYyAgICAlZWJ4Ci0gMTBmOgk0YyBbIAldKmRlYyAgICAlZXNwCi0gMTEwOgk0ZCBbIAldKmRlYyAgICAlZWJwCi0gMTExOgk0ZSBbIAldKmRlYyAgICAlZXNpCi0gMTEyOgk0ZiBbIAldKmRlYyAgICAlZWRpCi0gMTEzOgk1MCBbIAldKnB1c2ggICAlZWF4Ci0gMTE0Ogk1MSBbIAldKnB1c2ggICAlZWN4Ci0gMTE1Ogk1MiBbIAldKnB1c2ggICAlZWR4Ci0gMTE2Ogk1MyBbIAldKnB1c2ggICAlZWJ4Ci0gMTE3Ogk1NCBbIAldKnB1c2ggICAlZXNwCi0gMTE4Ogk1NSBbIAldKnB1c2ggICAlZWJwCi0gMTE5Ogk1NiBbIAldKnB1c2ggICAlZXNpCi0gMTFhOgk1NyBbIAldKnB1c2ggICAlZWRpCi0gMTFiOgk1OCBbIAldKnBvcCAgICAlZWF4Ci0gMTFjOgk1OSBbIAldKnBvcCAgICAlZWN4Ci0gMTFkOgk1YSBbIAldKnBvcCAgICAlZWR4Ci0gMTFlOgk1YiBbIAldKnBvcCAgICAlZWJ4Ci0gMTFmOgk1YyBbIAldKnBvcCAgICAlZXNwCi0gMTIwOgk1ZCBbIAldKnBvcCAgICAlZWJwCi0gMTIxOgk1ZSBbIAldKnBvcCAgICAlZXNpCi0gMTIyOgk1ZiBbIAldKnBvcCAgICAlZWRpCi0gMTIzOgk2MCBbIAldKnB1c2hhICAKLSAxMjQ6CTYxIFsgCV0qcG9wYSAgIAotIDEyNToJNjIgOTAgOTAgOTAgOTAgOTAgWyAJXSpib3VuZCAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAxMmI6CTYzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYXJwbCAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAxMzE6CTY4IDkwIDkwIDkwIDkwIFsgCV0qcHVzaCAgIFwkMHg5MDkwOTA5MAotIDEzNjoJNjkgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgXCQweDkwOTA5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMTQwOgk2YSA5MCBbIAldKnB1c2ggICBcJDB4ZmZmZmZmOTAKLSAxNDI6CTZiIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIFwkMHhmZmZmZmY5MCwweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDE0OToJNmMgWyAJXSppbnNiICAgXCglZHhcKSwlZXM6XCglZWRpXCkKLSAxNGE6CTZkIFsgCV0qaW5zbCAgIFwoJWR4XCksJWVzOlwoJWVkaVwpCi0gMTRiOgk2ZSBbIAldKm91dHNiICAlZHM6XCglZXNpXCksXCglZHhcKQotIDE0YzoJNmYgWyAJXSpvdXRzbCAgJWRzOlwoJWVzaVwpLFwoJWR4XCkKLSAxNGQ6CTcwIDkwIFsgCV0qam8gICAgICgweCk/ZGYuKgotIDE0ZjoJNzEgOTAgWyAJXSpqbm8gICAgKDB4KT9lMS4qCi0gMTUxOgk3MiA5MCBbIAldKmpiICAgICAoMHgpP2UzLioKLSAxNTM6CTczIDkwIFsgCV0qamFlICAgICgweCk/ZTUuKgotIDE1NToJNzQgOTAgWyAJXSpqZSAgICAgKDB4KT9lNy4qCi0gMTU3Ogk3NSA5MCBbIAldKmpuZSAgICAoMHgpP2U5LioKLSAxNTk6CTc2IDkwIFsgCV0qamJlICAgICgweCk/ZWIuKgotIDE1YjoJNzcgOTAgWyAJXSpqYSAgICAgKDB4KT9lZC4qCi0gMTVkOgk3OCA5MCBbIAldKmpzICAgICAoMHgpP2VmLioKLSAxNWY6CTc5IDkwIFsgCV0qam5zICAgICgweCk/ZjEuKgotIDE2MToJN2EgOTAgWyAJXSpqcCAgICAgKDB4KT9mMy4qCi0gMTYzOgk3YiA5MCBbIAldKmpucCAgICAoMHgpP2Y1LioKLSAxNjU6CTdjIDkwIFsgCV0qamwgICAgICgweCk/ZjcuKgotIDE2NzoJN2QgOTAgWyAJXSpqZ2UgICAgKDB4KT9mOS4qCi0gMTY5Ogk3ZSA5MCBbIAldKmpsZSAgICAoMHgpP2ZiLioKLSAxNmI6CTdmIDkwIFsgCV0qamcgICAgICgweCk/ZmQuKgotIDE2ZDoJODAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGNiICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDE3NDoJODEgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGNsICAgXCQweDkwOTA5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDE3ZToJODMgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGNsICAgXCQweGZmZmZmZjkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDE4NToJODQgOTAgOTAgOTAgOTAgOTAgWyAJXSp0ZXN0ICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDE4YjoJODUgOTAgOTAgOTAgOTAgOTAgWyAJXSp0ZXN0ICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAxOTE6CTg2IDkwIDkwIDkwIDkwIDkwIFsgCV0qeGNoZyAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAxOTc6CTg3IDkwIDkwIDkwIDkwIDkwIFsgCV0qeGNoZyAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTlkOgk4OCA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gMWEzOgk4OSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDFhOToJOGEgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotIDFhZjoJOGIgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAxYjU6CThjIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92bCAgICVzcywweDkwOTA5MDkwXCglZWF4XCkKLSAxYmI6CThkIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGVhICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMWMxOgk4ZSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmwgICAweDkwOTA5MDkwXCglZWF4XCksJXNzCi0gMWM3Ogk4ZiA4MCA5MCA5MCA5MCA5MCBbIAldKnBvcGwgICAweDkwOTA5MDkwXCglZWF4XCkKLSAxY2Q6CTkwIFsgCV0qbm9wICAgIAotIDFjZToJOTEgWyAJXSp4Y2hnICAgJWVheCwlZWN4Ci0gMWNmOgk5MiBbIAldKnhjaGcgICAlZWF4LCVlZHgKLSAxZDA6CTkzIFsgCV0qeGNoZyAgICVlYXgsJWVieAotIDFkMToJOTQgWyAJXSp4Y2hnICAgJWVheCwlZXNwCi0gMWQyOgk5NSBbIAldKnhjaGcgICAlZWF4LCVlYnAKLSAxZDM6CTk2IFsgCV0qeGNoZyAgICVlYXgsJWVzaQotIDFkNDoJOTcgWyAJXSp4Y2hnICAgJWVheCwlZWRpCi0gMWQ1Ogk5OCBbIAldKmN3dGwgICAKLSAxZDY6CTk5IFsgCV0qY2x0ZCAgIAotIDFkNzoJOWEgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpsY2FsbCAgXCQweDkwOTAsXCQweDkwOTA5MDkwCi0gMWRlOgk5YiBbIAldKmZ3YWl0Ci0gMWRmOgk5YyBbIAldKnB1c2hmICAKLSAxZTA6CTlkIFsgCV0qcG9wZiAgIAotIDFlMToJOWUgWyAJXSpzYWhmICAgCi0gMWUyOgk5ZiBbIAldKmxhaGYgICAKLSAxZTM6CWEwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTAsJWFsCi0gMWU4OglhMSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwLCVlYXgKLSAxZWQ6CWEyIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVhbCwweDkwOTA5MDkwCi0gMWYyOglhMyA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAlZWF4LDB4OTA5MDkwOTAKLSAxZjc6CWE0IFsgCV0qbW92c2IgICVkczpcKCVlc2lcKSwlZXM6XCglZWRpXCkKLSAxZjg6CWE1IFsgCV0qbW92c2wgICVkczpcKCVlc2lcKSwlZXM6XCglZWRpXCkKLSAxZjk6CWE2IFsgCV0qY21wc2IgICVlczpcKCVlZGlcKSwlZHM6XCglZXNpXCkKLSAxZmE6CWE3IFsgCV0qY21wc2wgICVlczpcKCVlZGlcKSwlZHM6XCglZXNpXCkKLSAxZmI6CWE4IDkwIFsgCV0qdGVzdCAgIFwkMHg5MCwlYWwKLSAxZmQ6CWE5IDkwIDkwIDkwIDkwIFsgCV0qdGVzdCAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gMjAyOglhYSBbIAldKnN0b3MgICAlYWwsJWVzOlwoJWVkaVwpCi0gMjAzOglhYiBbIAldKnN0b3MgICAlZWF4LCVlczpcKCVlZGlcKQotIDIwNDoJYWMgWyAJXSpsb2RzICAgJWRzOlwoJWVzaVwpLCVhbAotIDIwNToJYWQgWyAJXSpsb2RzICAgJWRzOlwoJWVzaVwpLCVlYXgKLSAyMDY6CWFlIFsgCV0qc2NhcyAgICVlczpcKCVlZGlcKSwlYWwKLSAyMDc6CWFmIFsgCV0qc2NhcyAgICVlczpcKCVlZGlcKSwlZWF4Ci0gMjA4OgliMCA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWFsCi0gMjBhOgliMSA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWNsCi0gMjBjOgliMiA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWRsCi0gMjBlOgliMyA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWJsCi0gMjEwOgliNCA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWFoCi0gMjEyOgliNSA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWNoCi0gMjE0OgliNiA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWRoCi0gMjE2OgliNyA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWJoCi0gMjE4OgliOCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVheAotIDIxZDoJYjkgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlY3gKLSAyMjI6CWJhIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWR4Ci0gMjI3OgliYiA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVieAotIDIyYzoJYmMgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlc3AKLSAyMzE6CWJkIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWJwCi0gMjM2OgliZSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVzaQotIDIzYjoJYmYgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlZGkKLSAyNDA6CWMwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsYiAgIFwkMHg5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAyNDc6CWMxIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsbCAgIFwkMHg5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAyNGU6CWMyIDkwIDkwIFsgCV0qcmV0ICAgIFwkMHg5MDkwCi0gMjUxOgljMyBbIAldKnJldCAgICAKLSAyNTI6CWM0IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGVzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMjU4OgljNSA5MCA5MCA5MCA5MCA5MCBbIAldKmxkcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDI1ZToJYzYgODAgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZiICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI2NToJYzcgODAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZsICAgXCQweDkwOTA5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI2ZjoJYzggOTAgOTAgOTAgWyAJXSplbnRlciAgXCQweDkwOTAsXCQweDkwCi0gMjczOgljOSBbIAldKmxlYXZlICAKLSAyNzQ6CWNhIDkwIDkwIFsgCV0qbHJldCAgIFwkMHg5MDkwCi0gMjc3OgljYiBbIAldKmxyZXQgICAKLSAyNzg6CWNjIFsgCV0qaW50MyAgIAotIDI3OToJY2QgOTAgWyAJXSppbnQgICAgXCQweDkwCi0gMjdiOgljZSBbIAldKmludG8gICAKLSAyN2M6CWNmIFsgCV0qaXJldCAgIAotIDI3ZDoJZDAgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xiICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMjgzOglkMSA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGwgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyODk6CWQyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsYiAgICVjbCwweDkwOTA5MDkwXCglZWF4XCkKLSAyOGY6CWQzIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsbCAgICVjbCwweDkwOTA5MDkwXCglZWF4XCkKLSAyOTU6CWQ0IDkwIFsgCV0qYWFtICAgIFwkMHhmZmZmZmY5MAotIDI5NzoJZDUgOTAgWyAJXSphYWQgICAgXCQweGZmZmZmZjkwCi0gMjk5OglkNyBbIAldKnhsYXQgICAlZHM6XCglZWJ4XCkKLSAyOWE6CWQ4IDkwIDkwIDkwIDkwIDkwIFsgCV0qZmNvbXMgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJhMDoJZDkgOTAgOTAgOTAgOTAgOTAgWyAJXSpmc3RzICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmE2OglkYSA5MCA5MCA5MCA5MCA5MCBbIAldKmZpY29tbCAweDkwOTA5MDkwXCglZWF4XCkKLSAyYWM6CWRiIDkwIDkwIDkwIDkwIDkwIFsgCV0qZmlzdGwgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJiMjoJZGMgOTAgOTAgOTAgOTAgOTAgWyAJXSpmY29tbCAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmI4OglkZCA5MCA5MCA5MCA5MCA5MCBbIAldKmZzdGwgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYmU6CWRlIDkwIDkwIDkwIDkwIDkwIFsgCV0qZmljb20gIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJjNDoJZGYgOTAgOTAgOTAgOTAgOTAgWyAJXSpmaXN0ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmNhOgllMCA5MCBbIAldKmxvb3BuZSAoMHgpPzI1Yy4qCi0gMmNjOgllMSA5MCBbIAldKmxvb3BlICAoMHgpPzI1ZS4qCi0gMmNlOgllMiA5MCBbIAldKmxvb3AgICAoMHgpPzI2MC4qCi0gMmQwOgllMyA5MCBbIAldKmplY3h6ICAoMHgpPzI2Mi4qCi0gMmQyOgllNCA5MCBbIAldKmluICAgICBcJDB4OTAsJWFsCi0gMmQ0OgllNSA5MCBbIAldKmluICAgICBcJDB4OTAsJWVheAotIDJkNjoJZTYgOTAgWyAJXSpvdXQgICAgJWFsLFwkMHg5MAotIDJkODoJZTcgOTAgWyAJXSpvdXQgICAgJWVheCxcJDB4OTAKLSAyZGE6CWU4IDkwIDkwIDkwIDkwIFsgCV0qY2FsbCAgICgweCk/OTA5MDkzNmYuKgotIDJkZjoJZTkgOTAgOTAgOTAgOTAgWyAJXSpqbXAgICAgKDB4KT85MDkwOTM3NC4qCi0gMmU0OgllYSA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmxqbXAgICBcJDB4OTA5MCxcJDB4OTA5MDkwOTAKLSAyZWI6CWViIDkwIFsgCV0qam1wICAgICgweCk/MjdkLioKLSAyZWQ6CWVjIFsgCV0qaW4gICAgIFwoJWR4XCksJWFsCi0gMmVlOgllZCBbIAldKmluICAgICBcKCVkeFwpLCVlYXgKLSAyZWY6CWVlIFsgCV0qb3V0ICAgICVhbCxcKCVkeFwpCi0gMmYwOgllZiBbIAldKm91dCAgICAlZWF4LFwoJWR4XCkKLSAyZjE6CWY0IFsgCV0qaGx0ICAgIAotIDJmMjoJZjUgWyAJXSpjbWMgICAgCi0gMmYzOglmNiA5MCA5MCA5MCA5MCA5MCBbIAldKm5vdGIgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyZjk6CWY3IDkwIDkwIDkwIDkwIDkwIFsgCV0qbm90bCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJmZjoJZjggWyAJXSpjbGMgICAgCi0gMzAwOglmOSBbIAldKnN0YyAgICAKLSAzMDE6CWZhIFsgCV0qY2xpICAgIAotIDMwMjoJZmIgWyAJXSpzdGkgICAgCi0gMzAzOglmYyBbIAldKmNsZCAgICAKLSAzMDQ6CWZkIFsgCV0qc3RkICAgIAotIDMwNToJZmYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjYWxsICAgXCoweDkwOTA5MDkwXCglZWF4XCkKLSAzMGI6CTBmIDAwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGxkdCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDMxMjoJMGYgMDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZ2R0ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMzE5OgkwZiAwMiA5MCA5MCA5MCA5MCA5MCBbIAldKmxhciAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDMyMDoJMGYgMDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpsc2wgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzMjc6CTBmIDA2IFsgCV0qY2x0cyAgIAotIDMyOToJMGYgMDggWyAJXSppbnZkICAgCi0gMzJiOgkwZiAwOSBbIAldKndiaW52ZCAKLSAzMmQ6CTBmIDBiIFsgCV0qdWQyYSAgIAotIDMyZjoJMGYgMjAgZDAgWyAJXSptb3YgICAgJWNyMiwlZWF4Ci0gMzMyOgkwZiAyMSBkMCBbIAldKm1vdiAgICAlZGIyLCVlYXgKLSAzMzU6CTBmIDIyIGQwIFsgCV0qbW92ICAgICVlYXgsJWNyMgotIDMzODoJMGYgMjMgZDAgWyAJXSptb3YgICAgJWVheCwlZGIyCi0gMzNiOgkwZiAyNCBkMCBbIAldKm1vdiAgICAldHIyLCVlYXgKLSAzM2U6CTBmIDI2IGQwIFsgCV0qbW92ICAgICVlYXgsJXRyMgotIDM0MToJMGYgMzAgWyAJXSp3cm1zciAgCi0gMzQzOgkwZiAzMSBbIAldKnJkdHNjICAKLSAzNDU6CTBmIDMyIFsgCV0qcmRtc3IgIAotIDM0NzoJMGYgMzMgWyAJXSpyZHBtYyAgCi0gMzQ5OgkwZiA0MCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZvICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM1MDoJMGYgNDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bm8gMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNTc6CTBmIDQyIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmIgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzVlOgkwZiA0MyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZhZSAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM2NToJMGYgNDQgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92ZSAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNmM6CTBmIDQ1IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5lIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzczOgkwZiA0NiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZiZSAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM3YToJMGYgNDcgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YSAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzODE6CTBmIDQ4IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdnMgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzg4OgkwZiA0OSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZucyAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM4ZjoJMGYgNGEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92cCAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzOTY6CTBmIDRiIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5wIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzlkOgkwZiA0YyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZsICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDNhNDoJMGYgNGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92Z2UgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzYWI6CTBmIDRlIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmxlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gM2IyOgkwZiA0ZiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZnICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDNiOToJMGYgNjAgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2tsYncgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzYzA6CTBmIDYxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNrbHdkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2M3OgkwZiA2MiA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2xkcSAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNjZToJMGYgNjMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWNrc3N3YiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNkNToJMGYgNjQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZ3RiIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2RjOgkwZiA2NSA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBndHcgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZTM6CTBmIDY2IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGd0ZCAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNlYToJMGYgNjcgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWNrdXN3YiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNmMToJMGYgNjggOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2toYncgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZjg6CTBmIDY5IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNraHdkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2ZmOgkwZiA2YSA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2hkcSAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQwNjoJMGYgNmIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWNrc3NkdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQwZDoJMGYgNmUgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZkICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0MTQ6CTBmIDZmIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92cSAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDFiOgkwZiA3MSBkMCA5MCBbIAldKnBzcmx3ICBcJDB4OTAsJW1tMAotIDQxZjoJMGYgNzIgZDAgOTAgWyAJXSpwc3JsZCAgXCQweDkwLCVtbTAKLSA0MjM6CTBmIDczIGQwIDkwIFsgCV0qcHNybHEgIFwkMHg5MCwlbW0wCi0gNDI3OgkwZiA3NCA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBlcWIgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0MmU6CTBmIDc1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGVxdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQzNToJMGYgNzYgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZXFkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDNjOgkwZiA3NyBbIAldKmVtbXMgICAKLSA0M2U6CTBmIDdlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ZCAgICVtbTIsMHg5MDkwOTA5MFwoJWVheFwpCi0gNDQ1OgkwZiA3ZiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnEgICAlbW0yLDB4OTA5MDkwOTBcKCVlYXhcKQotIDQ0YzoJMGYgODAgOTAgOTAgOTAgOTAgWyAJXSpqbyAgICAgKDB4KT85MDkwOTRlMi4qCi0gNDUyOgkwZiA4MSA5MCA5MCA5MCA5MCBbIAldKmpubyAgICAoMHgpPzkwOTA5NGU4LioKLSA0NTg6CTBmIDgyIDkwIDkwIDkwIDkwIFsgCV0qamIgICAgICgweCk/OTA5MDk0ZWUuKgotIDQ1ZToJMGYgODMgOTAgOTAgOTAgOTAgWyAJXSpqYWUgICAgKDB4KT85MDkwOTRmNC4qCi0gNDY0OgkwZiA4NCA5MCA5MCA5MCA5MCBbIAldKmplICAgICAoMHgpPzkwOTA5NGZhLioKLSA0NmE6CTBmIDg1IDkwIDkwIDkwIDkwIFsgCV0qam5lICAgICgweCk/OTA5MDk1MDAuKgotIDQ3MDoJMGYgODYgOTAgOTAgOTAgOTAgWyAJXSpqYmUgICAgKDB4KT85MDkwOTUwNi4qCi0gNDc2OgkwZiA4NyA5MCA5MCA5MCA5MCBbIAldKmphICAgICAoMHgpPzkwOTA5NTBjLioKLSA0N2M6CTBmIDg4IDkwIDkwIDkwIDkwIFsgCV0qanMgICAgICgweCk/OTA5MDk1MTIuKgotIDQ4MjoJMGYgODkgOTAgOTAgOTAgOTAgWyAJXSpqbnMgICAgKDB4KT85MDkwOTUxOC4qCi0gNDg4OgkwZiA4YSA5MCA5MCA5MCA5MCBbIAldKmpwICAgICAoMHgpPzkwOTA5NTFlLioKLSA0OGU6CTBmIDhiIDkwIDkwIDkwIDkwIFsgCV0qam5wICAgICgweCk/OTA5MDk1MjQuKgotIDQ5NDoJMGYgOGMgOTAgOTAgOTAgOTAgWyAJXSpqbCAgICAgKDB4KT85MDkwOTUyYS4qCi0gNDlhOgkwZiA4ZCA5MCA5MCA5MCA5MCBbIAldKmpnZSAgICAoMHgpPzkwOTA5NTMwLioKLSA0YTA6CTBmIDhlIDkwIDkwIDkwIDkwIFsgCV0qamxlICAgICgweCk/OTA5MDk1MzYuKgotIDRhNjoJMGYgOGYgOTAgOTAgOTAgOTAgWyAJXSpqZyAgICAgKDB4KT85MDkwOTUzYy4qCi0gNGFjOgkwZiA5MCA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG8gICAweDkwOTA5MDkwXCglZWF4XCkKLSA0YjM6CTBmIDkxIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bm8gIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRiYToJMGYgOTIgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRiICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGMxOgkwZiA5MyA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGFlICAweDkwOTA5MDkwXCglZWF4XCkKLSA0Yzg6CTBmIDk0IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0ZSAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRjZjoJMGYgOTUgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRuZSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGQ2OgkwZiA5NiA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGJlICAweDkwOTA5MDkwXCglZWF4XCkKLSA0ZGQ6CTBmIDk3IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0YSAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRlNDoJMGYgOTggODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRzICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGViOgkwZiA5OSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG5zICAweDkwOTA5MDkwXCglZWF4XCkKLSA0ZjI6CTBmIDlhIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0cCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRmOToJMGYgOWIgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRucCAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNTAwOgkwZiA5YyA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGwgICAweDkwOTA5MDkwXCglZWF4XCkKLSA1MDc6CTBmIDlkIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0Z2UgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDUwZToJMGYgOWUgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRsZSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNTE1OgkwZiA5ZiA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGcgICAweDkwOTA5MDkwXCglZWF4XCkKLSA1MWM6CTBmIGEwIFsgCV0qcHVzaCAgICVmcwotIDUxZToJMGYgYTEgWyAJXSpwb3AgICAgJWZzCi0gNTIwOgkwZiBhMiBbIAldKmNwdWlkICAKLSA1MjI6CTBmIGEzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnQgICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTI5OgkwZiBhNCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnNobGQgICBcJDB4OTAsJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1MzE6CTBmIGE1IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hsZCAgICVjbCwlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDUzODoJMGYgYTggWyAJXSpwdXNoICAgJWdzCi0gNTNhOgkwZiBhOSBbIAldKnBvcCAgICAlZ3MKLSA1M2M6CTBmIGFhIFsgCV0qcnNtICAgIAotIDUzZToJMGYgYWIgOTAgOTAgOTAgOTAgOTAgWyAJXSpidHMgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1NDU6CTBmIGFjIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hyZCAgIFwkMHg5MCwlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDU0ZDoJMGYgYWQgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaHJkICAgJWNsLCVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTU0OgkwZiBhZiA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU1YjoJMGYgYjAgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXB4Y2hnICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSA1NjI6CTBmIGIxIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21weGNoZyAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDU2OToJMGYgYjIgOTAgOTAgOTAgOTAgOTAgWyAJXSpsc3MgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1NzA6CTBmIGIzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRyICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTc3OgkwZiBiNCA5MCA5MCA5MCA5MCA5MCBbIAldKmxmcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU3ZToJMGYgYjUgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZ3MgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1ODU6CTBmIGI2IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92emJsIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNThjOgkwZiBiNyA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnp3bCAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU5MzoJMGYgYjkgWyAJXSp1ZDJiICAgCi0gNTk1OgkwZiBiYiA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0YyAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDU5YzoJMGYgYmMgOTAgOTAgOTAgOTAgOTAgWyAJXSpic2YgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1YTM6CTBmIGJkIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnNyICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNWFhOgkwZiBiZSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnNibCAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDViMToJMGYgYmYgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Zzd2wgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1Yjg6CTBmIGMwIDkwIDkwIDkwIDkwIDkwIFsgCV0qeGFkZCAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSA1YmY6CTBmIGMxIDkwIDkwIDkwIDkwIDkwIFsgCV0qeGFkZCAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNWM2OgkwZiBjOCBbIAldKmJzd2FwICAlZWF4Ci0gNWM4OgkwZiBjOSBbIAldKmJzd2FwICAlZWN4Ci0gNWNhOgkwZiBjYSBbIAldKmJzd2FwICAlZWR4Ci0gNWNjOgkwZiBjYiBbIAldKmJzd2FwICAlZWJ4Ci0gNWNlOgkwZiBjYyBbIAldKmJzd2FwICAlZXNwCi0gNWQwOgkwZiBjZCBbIAldKmJzd2FwICAlZWJwCi0gNWQyOgkwZiBjZSBbIAldKmJzd2FwICAlZXNpCi0gNWQ0OgkwZiBjZiBbIAldKmJzd2FwICAlZWRpCi0gNWQ2OgkwZiBkMSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzcmx3ICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDVkZDoJMGYgZDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JsZCAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA1ZTQ6CTBmIGQzIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNybHEgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNWViOgkwZiBkNSA5MCA5MCA5MCA5MCA5MCBbIAldKnBtdWxsdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDVmMjoJMGYgZDggOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3VidXNiIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNWY5OgkwZiBkOSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJ1c3cgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MDA6CTBmIGRiIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFuZCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjA3OgkwZiBkYyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGR1c2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MGU6CTBmIGRkIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHVzdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYxNToJMGYgZGYgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYW5kbiAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MWM6CTBmIGUxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNyYXcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjIzOgkwZiBlMiA5MCA5MCA5MCA5MCA5MCBbIAldKnBzcmFkICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYyYToJMGYgZTUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwbXVsaHcgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MzE6CTBmIGU4IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YnNiIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjM4OgkwZiBlOSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJzdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYzZjoJMGYgZWIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwb3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NDY6CTBmIGVjIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHNiIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjRkOgkwZiBlZCA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGRzdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY1NDoJMGYgZWYgOTAgOTAgOTAgOTAgOTAgWyAJXSpweG9yICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NWI6CTBmIGYxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNsbHcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjYyOgkwZiBmMiA5MCA5MCA5MCA5MCA5MCBbIAldKnBzbGxkICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY2OToJMGYgZjMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc2xscSAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NzA6CTBmIGY1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcG1hZGR3ZCAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY3NzoJMGYgZjggOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3ViYiAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2N2U6CTBmIGY5IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YncgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjg1OgkwZiBmYSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJkICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY4YzoJMGYgZmMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkYiAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2OTM6CTBmIGZkIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjlhOgkwZiBmZSA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGRkICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDZhMToJNjYgMDEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDZhODoJNjYgMDMgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDZhZjoJNjYgMDUgOTAgOTAgWyAJXSphZGQgICAgXCQweDkwOTAsJWF4Ci0gNmIzOgk2NiAwNiBbIAldKnB1c2h3ICAlZXMKLSA2YjU6CTY2IDA3IFsgCV0qcG9wdyAgICVlcwotIDZiNzoJNjYgMDkgOTAgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDZiZToJNjYgMGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDZjNToJNjYgMGQgOTAgOTAgWyAJXSpvciAgICAgXCQweDkwOTAsJWF4Ci0gNmM5Ogk2NiAwZSBbIAldKnB1c2h3ICAlY3MKLSA2Y2I6CTY2IDExIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA2ZDI6CTY2IDEzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA2ZDk6CTY2IDE1IDkwIDkwIFsgCV0qYWRjICAgIFwkMHg5MDkwLCVheAotIDZkZDoJNjYgMTYgWyAJXSpwdXNodyAgJXNzCi0gNmRmOgk2NiAxNyBbIAldKnBvcHcgICAlc3MKLSA2ZTE6CTY2IDE5IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA2ZTg6CTY2IDFiIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA2ZWY6CTY2IDFkIDkwIDkwIFsgCV0qc2JiICAgIFwkMHg5MDkwLCVheAotIDZmMzoJNjYgMWUgWyAJXSpwdXNodyAgJWRzCi0gNmY1Ogk2NiAxZiBbIAldKnBvcHcgICAlZHMKLSA2Zjc6CTY2IDIxIDkwIDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA2ZmU6CTY2IDIzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3MDU6CTY2IDI1IDkwIDkwIFsgCV0qYW5kICAgIFwkMHg5MDkwLCVheAotIDcwOToJNjYgMjkgOTAgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDcxMDoJNjYgMmIgOTAgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDcxNzoJNjYgMmQgOTAgOTAgWyAJXSpzdWIgICAgXCQweDkwOTAsJWF4Ci0gNzFiOgk2NiAzMSA5MCA5MCA5MCA5MCA5MCBbIAldKnhvciAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNzIyOgk2NiAzMyA5MCA5MCA5MCA5MCA5MCBbIAldKnhvciAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNzI5Ogk2NiAzNSA5MCA5MCBbIAldKnhvciAgICBcJDB4OTA5MCwlYXgKLSA3MmQ6CTY2IDM5IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3MzQ6CTY2IDNiIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3M2I6CTY2IDNkIDkwIDkwIFsgCV0qY21wICAgIFwkMHg5MDkwLCVheAotIDczZjoJNjYgNDAgWyAJXSppbmMgICAgJWF4Ci0gNzQxOgk2NiA0MSBbIAldKmluYyAgICAlY3gKLSA3NDM6CTY2IDQyIFsgCV0qaW5jICAgICVkeAotIDc0NToJNjYgNDMgWyAJXSppbmMgICAgJWJ4Ci0gNzQ3Ogk2NiA0NCBbIAldKmluYyAgICAlc3AKLSA3NDk6CTY2IDQ1IFsgCV0qaW5jICAgICVicAotIDc0YjoJNjYgNDYgWyAJXSppbmMgICAgJXNpCi0gNzRkOgk2NiA0NyBbIAldKmluYyAgICAlZGkKLSA3NGY6CTY2IDQ4IFsgCV0qZGVjICAgICVheAotIDc1MToJNjYgNDkgWyAJXSpkZWMgICAgJWN4Ci0gNzUzOgk2NiA0YSBbIAldKmRlYyAgICAlZHgKLSA3NTU6CTY2IDRiIFsgCV0qZGVjICAgICVieAotIDc1NzoJNjYgNGMgWyAJXSpkZWMgICAgJXNwCi0gNzU5Ogk2NiA0ZCBbIAldKmRlYyAgICAlYnAKLSA3NWI6CTY2IDRlIFsgCV0qZGVjICAgICVzaQotIDc1ZDoJNjYgNGYgWyAJXSpkZWMgICAgJWRpCi0gNzVmOgk2NiA1MCBbIAldKnB1c2ggICAlYXgKLSA3NjE6CTY2IDUxIFsgCV0qcHVzaCAgICVjeAotIDc2MzoJNjYgNTIgWyAJXSpwdXNoICAgJWR4Ci0gNzY1Ogk2NiA1MyBbIAldKnB1c2ggICAlYngKLSA3Njc6CTY2IDU0IFsgCV0qcHVzaCAgICVzcAotIDc2OToJNjYgNTUgWyAJXSpwdXNoICAgJWJwCi0gNzZiOgk2NiA1NiBbIAldKnB1c2ggICAlc2kKLSA3NmQ6CTY2IDU3IFsgCV0qcHVzaCAgICVkaQotIDc2ZjoJNjYgNTggWyAJXSpwb3AgICAgJWF4Ci0gNzcxOgk2NiA1OSBbIAldKnBvcCAgICAlY3gKLSA3NzM6CTY2IDVhIFsgCV0qcG9wICAgICVkeAotIDc3NToJNjYgNWIgWyAJXSpwb3AgICAgJWJ4Ci0gNzc3Ogk2NiA1YyBbIAldKnBvcCAgICAlc3AKLSA3Nzk6CTY2IDVkIFsgCV0qcG9wICAgICVicAotIDc3YjoJNjYgNWUgWyAJXSpwb3AgICAgJXNpCi0gNzdkOgk2NiA1ZiBbIAldKnBvcCAgICAlZGkKLSA3N2Y6CTY2IDYwIFsgCV0qcHVzaGF3IAotIDc4MToJNjYgNjEgWyAJXSpwb3BhdyAgCi0gNzgzOgk2NiA2MiA5MCA5MCA5MCA5MCA5MCBbIAldKmJvdW5kICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNzhhOgk2NiA2OCA5MCA5MCBbIAldKnB1c2h3ICBcJDB4OTA5MAotIDc4ZToJNjYgNjkgOTAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgXCQweDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDc5NzoJNjYgNmEgOTAgWyAJXSpwdXNodyAgXCQweGZmZmZmZjkwCi0gNzlhOgk2NiA2YiA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICBcJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDdhMjoJNjYgNmQgWyAJXSppbnN3ICAgXCglZHhcKSwlZXM6XCglZWRpXCkKLSA3YTQ6CTY2IDZmIFsgCV0qb3V0c3cgICVkczpcKCVlc2lcKSxcKCVkeFwpCi0gN2E2Ogk2NiA4MSA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY3cgICBcJDB4OTA5MCwweDkwOTA5MDkwXCglZWF4XCkKLSA3YWY6CTY2IDgzIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjdyAgIFwkMHhmZmZmZmY5MCwweDkwOTA5MDkwXCglZWF4XCkKLSA3Yjc6CTY2IDg1IDkwIDkwIDkwIDkwIDkwIFsgCV0qdGVzdCAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3YmU6CTY2IDg3IDkwIDkwIDkwIDkwIDkwIFsgCV0qeGNoZyAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3YzU6CTY2IDg5IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3Y2M6CTY2IDhiIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3ZDM6CTY2IDhjIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92dyAgICVzcywweDkwOTA5MDkwXCglZWF4XCkKLSA3ZGE6CTY2IDhkIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGVhICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3ZTE6CTY2IDhmIDgwIDkwIDkwIDkwIDkwIFsgCV0qcG9wdyAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDdlODoJNjYgOTEgWyAJXSp4Y2hnICAgJWF4LCVjeAotIDdlYToJNjYgOTIgWyAJXSp4Y2hnICAgJWF4LCVkeAotIDdlYzoJNjYgOTMgWyAJXSp4Y2hnICAgJWF4LCVieAotIDdlZToJNjYgOTQgWyAJXSp4Y2hnICAgJWF4LCVzcAotIDdmMDoJNjYgOTUgWyAJXSp4Y2hnICAgJWF4LCVicAotIDdmMjoJNjYgOTYgWyAJXSp4Y2hnICAgJWF4LCVzaQotIDdmNDoJNjYgOTcgWyAJXSp4Y2hnICAgJWF4LCVkaQotIDdmNjoJNjYgOTggWyAJXSpjYnR3ICAgCi0gN2Y4Ogk2NiA5OSBbIAldKmN3dGQgICAKLSA3ZmE6CTY2IDlhIDkwIDkwIDkwIDkwIFsgCV0qbGNhbGx3IFwkMHg5MDkwLFwkMHg5MDkwCi0gODAwOgk2NiA5YyBbIAldKnB1c2hmdyAKLSA4MDI6CTY2IDlkIFsgCV0qcG9wZncgIAotIDgwNDoJNjYgYTEgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MCwlYXgKLSA4MGE6CTY2IGEzIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVheCwweDkwOTA5MDkwCi0gODEwOgk2NiBhNSBbIAldKm1vdnN3ICAlZHM6XCglZXNpXCksJWVzOlwoJWVkaVwpCi0gODEyOgk2NiBhNyBbIAldKmNtcHN3ICAlZXM6XCglZWRpXCksJWRzOlwoJWVzaVwpCi0gODE0Ogk2NiBhOSA5MCA5MCBbIAldKnRlc3QgICBcJDB4OTA5MCwlYXgKLSA4MTg6CTY2IGFiIFsgCV0qc3RvcyAgICVheCwlZXM6XCglZWRpXCkKLSA4MWE6CTY2IGFkIFsgCV0qbG9kcyAgICVkczpcKCVlc2lcKSwlYXgKLSA4MWM6CTY2IGFmIFsgCV0qc2NhcyAgICVlczpcKCVlZGlcKSwlYXgKLSA4MWU6CTY2IGI4IDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVheAotIDgyMjoJNjYgYjkgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWN4Ci0gODI2Ogk2NiBiYSA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlZHgKLSA4MmE6CTY2IGJiIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVieAotIDgyZToJNjYgYmMgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJXNwCi0gODMyOgk2NiBiZCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlYnAKLSA4MzY6CTY2IGJlIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVzaQotIDgzYToJNjYgYmYgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWRpCi0gODNlOgk2NiBjMSA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbHcgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gODQ2Ogk2NiBjMiA5MCA5MCBbIAldKnJldHcgICBcJDB4OTA5MAotIDg0YToJNjYgYzMgWyAJXSpyZXR3ICAgCi0gODRjOgk2NiBjNCA5MCA5MCA5MCA5MCA5MCBbIAldKmxlcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gODUzOgk2NiBjNSA5MCA5MCA5MCA5MCA5MCBbIAldKmxkcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gODVhOgk2NiBjNyA4MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdncgICBcJDB4OTA5MCwweDkwOTA5MDkwXCglZWF4XCkKLSA4NjM6CTY2IGM4IDkwIDkwIDkwIFsgCV0qZW50ZXJ3IFwkMHg5MDkwLFwkMHg5MAotIDg2ODoJNjYgYzkgWyAJXSpsZWF2ZXcgCi0gODZhOgk2NiBjYSA5MCA5MCBbIAldKmxyZXR3ICBcJDB4OTA5MAotIDg2ZToJNjYgY2IgWyAJXSpscmV0dyAgCi0gODcwOgk2NiBjZiBbIAldKmlyZXR3ICAKLSA4NzI6CTY2IGQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsdyAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDg3OToJNjYgZDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2x3ICAgJWNsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDg4MDoJNjYgZTUgOTAgWyAJXSppbiAgICAgXCQweDkwLCVheAotIDg4MzoJNjYgZTcgOTAgWyAJXSpvdXQgICAgJWF4LFwkMHg5MAotIDg4NjoJNjYgZTggOGYgOTAgWyAJXSpjYWxsdyAgKDB4KT85OTE5LioKLSA4OGE6CTY2IGVhIDkwIDkwIDkwIDkwIFsgCV0qbGptcHcgIFwkMHg5MDkwLFwkMHg5MDkwCi0gODkwOgk2NiBlZCBbIAldKmluICAgICBcKCVkeFwpLCVheAotIDg5MjoJNjYgZWYgWyAJXSpvdXQgICAgJWF4LFwoJWR4XCkKLSA4OTQ6CTY2IGY3IDkwIDkwIDkwIDkwIDkwIFsgCV0qbm90dyAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDg5YjoJNjYgZmYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjYWxsdyAgXCoweDkwOTA5MDkwXCglZWF4XCkKLSA4YTI6CTY2IDBmIDAyIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGFyICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4YWE6CTY2IDBmIDAzIDkwIDkwIDkwIDkwIDkwIFsgCV0qbHNsICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4YjI6CTY2IDBmIDQwIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm8gIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4YmE6CTY2IDBmIDQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5vIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4YzI6CTY2IDBmIDQyIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmIgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4Y2E6CTY2IDBmIDQzIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmFlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4ZDI6CTY2IDBmIDQ0IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmUgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4ZGE6CTY2IDBmIDQ1IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5lIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4ZTI6CTY2IDBmIDQ2IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmJlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4ZWE6CTY2IDBmIDQ3IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmEgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4ZjI6CTY2IDBmIDQ4IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdnMgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4ZmE6CTY2IDBmIDQ5IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5zIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MDI6CTY2IDBmIDRhIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdnAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MGE6CTY2IDBmIDRiIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5wIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MTI6CTY2IDBmIDRjIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmwgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MWE6CTY2IDBmIDRkIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmdlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MjI6CTY2IDBmIDRlIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmxlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MmE6CTY2IDBmIDRmIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MzI6CTY2IDBmIGEwIFsgCV0qcHVzaHcgICVmcwotIDkzNToJNjYgMGYgYTEgWyAJXSpwb3B3ICAgJWZzCi0gOTM4Ogk2NiAwZiBhMyA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0ICAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTQwOgk2NiAwZiBhNCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnNobGQgICBcJDB4OTAsJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk0OToJNjYgMGYgYTUgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaGxkICAgJWNsLCVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5NTE6CTY2IDBmIGE4IFsgCV0qcHVzaHcgICVncwotIDk1NDoJNjYgMGYgYTkgWyAJXSpwb3B3ICAgJWdzCi0gOTU3Ogk2NiAwZiBhYiA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0cyAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTVmOgk2NiAwZiBhYyA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnNocmQgICBcJDB4OTAsJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk2ODoJNjYgMGYgYWQgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaHJkICAgJWNsLCVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5NzA6CTY2IDBmIGFmIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5Nzg6CTY2IDBmIGIxIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21weGNoZyAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTgwOgk2NiAwZiBiMiA5MCA5MCA5MCA5MCA5MCBbIAldKmxzcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTg4Ogk2NiAwZiBiMyA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0ciAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTkwOgk2NiAwZiBiNCA5MCA5MCA5MCA5MCA5MCBbIAldKmxmcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTk4Ogk2NiAwZiBiNSA5MCA5MCA5MCA5MCA5MCBbIAldKmxncyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOWEwOgk2NiAwZiBiNiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnpidyAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOWE4Ogk2NiAwZiBiYiA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0YyAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOWIwOgk2NiAwZiBiYyA5MCA5MCA5MCA5MCA5MCBbIAldKmJzZiAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOWI4Ogk2NiAwZiBiZCA5MCA5MCA5MCA5MCA5MCBbIAldKmJzciAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOWMwOgk2NiAwZiBiZSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnNidyAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOWM4Ogk2NiAwZiBjMSA5MCA5MCA5MCA5MCA5MCBbIAldKnhhZGQgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzljNTk2Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5zCisrKyAvZGV2L251bGwKQEAgLTEsNTY3ICswLDAgQEAKLS50ZXh0Ci1mb286Ci0gYWRkICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gYWRkICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFkZCAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIGFkZCAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBhZGQgICAgJDB4OTAsJWFsCi0gYWRkICAgICQweDkwOTA5MDkwLCVlYXgKLSBwdXNoICAgJWVzCi0gcG9wICAgICVlcwotIG9yICAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIG9yICAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBvciAgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBvciAgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gb3IgICAgICQweDkwLCVhbAotIG9yICAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gcHVzaCAgICVjcwotIGFkYyAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIGFkYyAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBhZGMgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBhZGMgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gYWRjICAgICQweDkwLCVhbAotIGFkYyAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gcHVzaCAgICVzcwotIHBvcCAgICAlc3MKLSBzYmIgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBzYmIgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2JiICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gc2JiICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIHNiYiAgICAkMHg5MCwlYWwKLSBzYmIgICAgJDB4OTA5MDkwOTAsJWVheAotIHB1c2ggICAlZHMKLSBwb3AgICAgJWRzCi0gYW5kICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gYW5kICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFuZCAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIGFuZCAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBhbmQgICAgJDB4OTAsJWFsCi0gYW5kICAgICQweDkwOTA5MDkwLCVlYXgKLSBkYWEKLSBzdWIgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBzdWIgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc3ViICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gc3ViICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIHN1YiAgICAkMHg5MCwlYWwKLSBzdWIgICAgJDB4OTA5MDkwOTAsJWVheAotIGRhcwotIHhvciAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHhvciAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSB4b3IgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSB4b3IgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0geG9yICAgICQweDkwLCVhbAotIHhvciAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gYWFhCi0gY21wICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gY21wICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGNtcCAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIGNtcCAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbXAgICAgJDB4OTAsJWFsCi0gY21wICAgICQweDkwOTA5MDkwLCVlYXgKLSBhYXMKLSBpbmMgICAgJWVheAotIGluYyAgICAlZWN4Ci0gaW5jICAgICVlZHgKLSBpbmMgICAgJWVieAotIGluYyAgICAlZXNwCi0gaW5jICAgICVlYnAKLSBpbmMgICAgJWVzaQotIGluYyAgICAlZWRpCi0gZGVjICAgICVlYXgKLSBkZWMgICAgJWVjeAotIGRlYyAgICAlZWR4Ci0gZGVjICAgICVlYngKLSBkZWMgICAgJWVzcAotIGRlYyAgICAlZWJwCi0gZGVjICAgICVlc2kKLSBkZWMgICAgJWVkaQotIHB1c2ggICAlZWF4Ci0gcHVzaCAgICVlY3gKLSBwdXNoICAgJWVkeAotIHB1c2ggICAlZWJ4Ci0gcHVzaCAgICVlc3AKLSBwdXNoICAgJWVicAotIHB1c2ggICAlZXNpCi0gcHVzaCAgICVlZGkKLSBwb3AgICAgJWVheAotIHBvcCAgICAlZWN4Ci0gcG9wICAgICVlZHgKLSBwb3AgICAgJWVieAotIHBvcCAgICAlZXNwCi0gcG9wICAgICVlYnAKLSBwb3AgICAgJWVzaQotIHBvcCAgICAlZWRpCi0gcHVzaGEKLSBwb3BhCi0gYm91bmQgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFycGwgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHB1c2ggICAkMHg5MDkwOTA5MAotIGltdWwgICAkMHg5MDkwOTA5MCwweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBwdXNoICAgJDB4ZmZmZmZmOTAKLSBpbXVsICAgJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gaW5zYiAgICglZHgpLCVlczooJWVkaSkKLSBpbnNsICAgKCVkeCksJWVzOiglZWRpKQotIG91dHNiICAlZHM6KCVlc2kpLCglZHgpCi0gb3V0c2wgICVkczooJWVzaSksKCVkeCkKLSBqbyAgICAgLisyLTB4NzAKLSBqbm8gICAgLisyLTB4NzAKLSBqYiAgICAgLisyLTB4NzAKLSBqYWUgICAgLisyLTB4NzAKLSBqZSAgICAgLisyLTB4NzAKLSBqbmUgICAgLisyLTB4NzAKLSBqYmUgICAgLisyLTB4NzAKLSBqYSAgICAgLisyLTB4NzAKLSBqcyAgICAgLisyLTB4NzAKLSBqbnMgICAgLisyLTB4NzAKLSBqcCAgICAgLisyLTB4NzAKLSBqbnAgICAgLisyLTB4NzAKLSBqbCAgICAgLisyLTB4NzAKLSBqZ2UgICAgLisyLTB4NzAKLSBqbGUgICAgLisyLTB4NzAKLSBqZyAgICAgLisyLTB4NzAKLSBhZGNiICAgJDB4OTAsMHg5MDkwOTA5MCglZWF4KQotIGFkY2wgICAkMHg5MDkwOTA5MCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjbCAgICQweGZmZmZmZjkwLDB4OTA5MDkwOTAoJWVheCkKLSB0ZXN0ICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSB0ZXN0ICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0geGNoZyAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0geGNoZyAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIG1vdiAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIG1vdiAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBtb3YgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBtb3YgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbW92bCAgICVzcywweDkwOTA5MDkwKCVlYXgpCi0gbGVhICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIG1vdmwgICAweDkwOTA5MDkwKCVlYXgpLCVzcwotIHBvcGwgICAweDkwOTA5MDkwKCVlYXgpCi0geGNoZyAgICVlYXgsJWVheAotIHhjaGcgICAlZWF4LCVlY3gKLSB4Y2hnICAgJWVheCwlZWR4Ci0geGNoZyAgICVlYXgsJWVieAotIHhjaGcgICAlZWF4LCVlc3AKLSB4Y2hnICAgJWVheCwlZWJwCi0geGNoZyAgICVlYXgsJWVzaQotIHhjaGcgICAlZWF4LCVlZGkKLSBjd3RsCi0gY2x0ZAotIGxjYWxsICAkMHg5MDkwLCQweDkwOTA5MDkwCi0gZndhaXQKLSBwdXNoZgotIHBvcGYKLSBzYWhmCi0gbGFoZgotIG1vdiAgICAweDkwOTA5MDkwLCVhbAotIG1vdiAgICAweDkwOTA5MDkwLCVlYXgKLSBtb3YgICAgJWFsLDB4OTA5MDkwOTAKLSBtb3YgICAgJWVheCwweDkwOTA5MDkwCi0gbW92c2IgICVkczooJWVzaSksJWVzOiglZWRpKQotIG1vdnNsICAlZHM6KCVlc2kpLCVlczooJWVkaSkKLSBjbXBzYiAgJWVzOiglZWRpKSwlZHM6KCVlc2kpCi0gY21wc2wgICVlczooJWVkaSksJWRzOiglZXNpKQotIHRlc3QgICAkMHg5MCwlYWwKLSB0ZXN0ICAgJDB4OTA5MDkwOTAsJWVheAotIHN0b3MgICAlYWwsJWVzOiglZWRpKQotIHN0b3MgICAlZWF4LCVlczooJWVkaSkKLSBsb2RzICAgJWRzOiglZXNpKSwlYWwKLSBsb2RzICAgJWRzOiglZXNpKSwlZWF4Ci0gc2NhcyAgICVlczooJWVkaSksJWFsCi0gc2NhcyAgICVlczooJWVkaSksJWVheAotIG1vdiAgICAkMHg5MCwlYWwKLSBtb3YgICAgJDB4OTAsJWNsCi0gbW92ICAgICQweDkwLCVkbAotIG1vdiAgICAkMHg5MCwlYmwKLSBtb3YgICAgJDB4OTAsJWFoCi0gbW92ICAgICQweDkwLCVjaAotIG1vdiAgICAkMHg5MCwlZGgKLSBtb3YgICAgJDB4OTAsJWJoCi0gbW92ICAgICQweDkwOTA5MDkwLCVlYXgKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVjeAotIG1vdiAgICAkMHg5MDkwOTA5MCwlZWR4Ci0gbW92ICAgICQweDkwOTA5MDkwLCVlYngKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVzcAotIG1vdiAgICAkMHg5MDkwOTA5MCwlZWJwCi0gbW92ICAgICQweDkwOTA5MDkwLCVlc2kKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVkaQotIHJjbGIgICAkMHg5MCwweDkwOTA5MDkwKCVlYXgpCi0gcmNsbCAgICQweDkwLDB4OTA5MDkwOTAoJWVheCkKLSByZXQgICAgJDB4OTA5MAotIHJldAotIGxlcyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBsZHMgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbW92YiAgICQweDkwLDB4OTA5MDkwOTAoJWVheCkKLSBtb3ZsICAgJDB4OTA5MDkwOTAsMHg5MDkwOTA5MCglZWF4KQotIGVudGVyICAkMHg5MDkwLCQweDkwCi0gbGVhdmUKLSBscmV0ICAgJDB4OTA5MAotIGxyZXQKLSBpbnQzCi0gaW50ICAgICQweDkwCi0gaW50bwotIGlyZXQKLSByY2xiICAgMHg5MDkwOTA5MCglZWF4KQotIHJjbGwgICAweDkwOTA5MDkwKCVlYXgpCi0gcmNsYiAgICVjbCwweDkwOTA5MDkwKCVlYXgpCi0gcmNsbCAgICVjbCwweDkwOTA5MDkwKCVlYXgpCi0gYWFtICAgICQweGZmZmZmZjkwCi0gYWFkICAgICQweGZmZmZmZjkwCi0geGxhdCAgICVkczooJWVieCkKLSBmY29tcyAgMHg5MDkwOTA5MCglZWF4KQotIGZzdHMgICAweDkwOTA5MDkwKCVlYXgpCi0gZmljb21sIDB4OTA5MDkwOTAoJWVheCkKLSBmaXN0bCAgMHg5MDkwOTA5MCglZWF4KQotIGZjb21sICAweDkwOTA5MDkwKCVlYXgpCi0gZnN0bCAgIDB4OTA5MDkwOTAoJWVheCkKLSBmaWNvbSAgMHg5MDkwOTA5MCglZWF4KQotIGZpc3QgICAweDkwOTA5MDkwKCVlYXgpCi0gbG9vcG5lIC4rMi0weDcwCi0gbG9vcGUgIC4rMi0weDcwCi0gbG9vcCAgIC4rMi0weDcwCi0gamVjeHogIC4rMi0weDcwCi0gaW4gICAgICQweDkwLCVhbAotIGluICAgICAkMHg5MCwlZWF4Ci0gb3V0ICAgICVhbCwkMHg5MAotIG91dCAgICAlZWF4LCQweDkwCi0gY2FsbCAgIC4rNSsweDkwOTA5MDkwCi0gam1wICAgIC4rNSsweDkwOTA5MDkwCi0gbGptcCAgICQweDkwOTAsJDB4OTA5MDkwOTAKLSBqbXAgICAgLisyLTB4NzAKLSBpbiAgICAgKCVkeCksJWFsCi0gaW4gICAgICglZHgpLCVlYXgKLSBvdXQgICAgJWFsLCglZHgpCi0gb3V0ICAgICVlYXgsKCVkeCkKLSBobHQKLSBjbWMKLSBub3RiICAgMHg5MDkwOTA5MCglZWF4KQotIG5vdGwgICAweDkwOTA5MDkwKCVlYXgpCi0gY2xjCi0gc3RjCi0gY2xpCi0gc3RpCi0gY2xkCi0gc3RkCi0gY2FsbCAgICoweDkwOTA5MDkwKCVlYXgpCi0gbGxkdCAgIDB4OTA5MDkwOTAoJWVheCkKLSBsZ2R0ICAgMHg5MDkwOTA5MCglZWF4KQotIGxhciAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBsc2wgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY2x0cwotIGludmQKLSB3YmludmQKLSB1ZDJhCi0gbW92ICAgICVjcjIsJWVheAotIG1vdiAgICAlZGIyLCVlYXgKLSBtb3YgICAgJWVheCwlY3IyCi0gbW92ICAgICVlYXgsJWRiMgotIG1vdiAgICAldHIyLCVlYXgKLSBtb3YgICAgJWVheCwldHIyCi0gd3Jtc3IKLSByZHRzYwotIHJkbXNyCi0gcmRwbWMKLSBjbW92byAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdm5vIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZiICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92YWUgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmUgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZuZSAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92YmUgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmEgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZzICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92bnMgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdnAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZucCAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92bCAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmdlIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZsZSAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92ZyAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gcHVucGNrbGJ3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHB1bnBja2x3ZCAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwdW5wY2tsZHEgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFja3Nzd2IgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGNtcGd0YiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwY21wZ3R3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBjbXBndGQgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFja3Vzd2IgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHVucGNraGJ3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHB1bnBja2h3ZCAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwdW5wY2toZHEgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFja3NzZHcgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gbW92ZCAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIG1vdnEgICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3JsdyAgJDB4OTAsJW1tMAotIHBzcmxkICAkMHg5MCwlbW0wCi0gcHNybHEgICQweDkwLCVtbTAKLSBwY21wZXFiIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBjbXBlcXcgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGNtcGVxZCAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBlbW1zCi0gbW92ZCAgICVtbTIsMHg5MDkwOTA5MCglZWF4KQotIG1vdnEgICAlbW0yLDB4OTA5MDkwOTAoJWVheCkKLSBqbyAgICAgLis2KzB4OTA5MDkwOTAKLSBqbm8gICAgLis2KzB4OTA5MDkwOTAKLSBqYiAgICAgLis2KzB4OTA5MDkwOTAKLSBqYWUgICAgLis2KzB4OTA5MDkwOTAKLSBqZSAgICAgLis2KzB4OTA5MDkwOTAKLSBqbmUgICAgLis2KzB4OTA5MDkwOTAKLSBqYmUgICAgLis2KzB4OTA5MDkwOTAKLSBqYSAgICAgLis2KzB4OTA5MDkwOTAKLSBqcyAgICAgLis2KzB4OTA5MDkwOTAKLSBqbnMgICAgLis2KzB4OTA5MDkwOTAKLSBqcCAgICAgLis2KzB4OTA5MDkwOTAKLSBqbnAgICAgLis2KzB4OTA5MDkwOTAKLSBqbCAgICAgLis2KzB4OTA5MDkwOTAKLSBqZ2UgICAgLis2KzB4OTA5MDkwOTAKLSBqbGUgICAgLis2KzB4OTA5MDkwOTAKLSBqZyAgICAgLis2KzB4OTA5MDkwOTAKLSBzZXRvICAgMHg5MDkwOTA5MCglZWF4KQotIHNldG5vICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0YiAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRhZSAgMHg5MDkwOTA5MCglZWF4KQotIHNldGUgICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0bmUgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRiZSAgMHg5MDkwOTA5MCglZWF4KQotIHNldGEgICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0cyAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRucyAgMHg5MDkwOTA5MCglZWF4KQotIHNldHAgICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0bnAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRsICAgMHg5MDkwOTA5MCglZWF4KQotIHNldGdlICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0bGUgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRnICAgMHg5MDkwOTA5MCglZWF4KQotIHB1c2ggICAlZnMKLSBwb3AgICAgJWZzCi0gY3B1aWQKLSBidCAgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hsZCAgICQweDkwLCVlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNobGQgICAlY2wsJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gcHVzaCAgICVncwotIHBvcCAgICAlZ3MKLSByc20KLSBidHMgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hyZCAgICQweDkwLCVlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNocmQgICAlY2wsJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gaW11bCAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtcHhjaGcgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBjbXB4Y2hnICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGxzcyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBidHIgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbGZzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGxncyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3Z6YmwgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbW92endsIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIHVkMmIKLSBidGMgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYnNmICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGJzciAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3ZzYmwgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbW92c3dsIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIHhhZGQgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHhhZGQgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBic3dhcCAgJWVheAotIGJzd2FwICAlZWN4Ci0gYnN3YXAgICVlZHgKLSBic3dhcCAgJWVieAotIGJzd2FwICAlZXNwCi0gYnN3YXAgICVlYnAKLSBic3dhcCAgJWVzaQotIGJzd2FwICAlZWRpCi0gcHNybHcgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzcmxkICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3JscSAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcG11bGx3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzdWJ1c2IgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YnVzdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYW5kICAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFkZHVzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkdXN3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhbmRuICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3JhdyAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNyYWQgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBtdWxodyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3Vic2IgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YnN3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBvciAgICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkc2IgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFkZHN3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHB4b3IgICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc2xsdyAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNsbGQgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzbGxxICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwbWFkZHdkIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzdWJiICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3VidyAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YmQgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGRiICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkdyAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFkZGQgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIGFkZCAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFkZCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGFkZCAgICAkMHg5MDkwLCVheAotIHB1c2h3ICAlZXMKLSBwb3B3ICAgJWVzCi0gb3IgICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gb3IgICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gb3IgICAgICQweDkwOTAsJWF4Ci0gcHVzaHcgICVjcwotIGFkYyAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFkYyAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGFkYyAgICAkMHg5MDkwLCVheAotIHB1c2h3ICAlc3MKLSBwb3B3ICAgJXNzCi0gc2JiICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2JiICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gc2JiICAgICQweDkwOTAsJWF4Ci0gcHVzaHcgICVkcwotIHBvcHcgICAlZHMKLSBhbmQgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBhbmQgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBhbmQgICAgJDB4OTA5MCwlYXgKLSBzdWIgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzdWIgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBzdWIgICAgJDB4OTA5MCwlYXgKLSB4b3IgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSB4b3IgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSB4b3IgICAgJDB4OTA5MCwlYXgKLSBjbXAgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBjbXAgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbXAgICAgJDB4OTA5MCwlYXgKLSBpbmMgICAgJWF4Ci0gaW5jICAgICVjeAotIGluYyAgICAlZHgKLSBpbmMgICAgJWJ4Ci0gaW5jICAgICVzcAotIGluYyAgICAlYnAKLSBpbmMgICAgJXNpCi0gaW5jICAgICVkaQotIGRlYyAgICAlYXgKLSBkZWMgICAgJWN4Ci0gZGVjICAgICVkeAotIGRlYyAgICAlYngKLSBkZWMgICAgJXNwCi0gZGVjICAgICVicAotIGRlYyAgICAlc2kKLSBkZWMgICAgJWRpCi0gcHVzaCAgICVheAotIHB1c2ggICAlY3gKLSBwdXNoICAgJWR4Ci0gcHVzaCAgICVieAotIHB1c2ggICAlc3AKLSBwdXNoICAgJWJwCi0gcHVzaCAgICVzaQotIHB1c2ggICAlZGkKLSBwb3AgICAgJWF4Ci0gcG9wICAgICVjeAotIHBvcCAgICAlZHgKLSBwb3AgICAgJWJ4Ci0gcG9wICAgICVzcAotIHBvcCAgICAlYnAKLSBwb3AgICAgJXNpCi0gcG9wICAgICVkaQotIHB1c2hhdwotIHBvcGF3Ci0gYm91bmQgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gcHVzaHcgICQweDkwOTAKLSBpbXVsICAgJDB4OTA5MCwweDkwOTA5MDkwKCVlYXgpLCVkeAotIHB1c2h3ICAkMHhmZmZmZmY5MAotIGltdWwgICAkMHhmZmZmZmY5MCwweDkwOTA5MDkwKCVlYXgpLCVkeAotIGluc3cgICAoJWR4KSwlZXM6KCVlZGkpCi0gb3V0c3cgICVkczooJWVzaSksKCVkeCkKLSBhZGN3ICAgJDB4OTA5MCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjdyAgICQweGZmZmZmZjkwLDB4OTA5MDkwOTAoJWVheCkKLSB0ZXN0ICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSB4Y2hnICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBtb3YgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBtb3YgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBtb3Z3ICAgJXNzLDB4OTA5MDkwOTAoJWVheCkKLSBsZWEgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBwb3B3ICAgMHg5MDkwOTA5MCglZWF4KQotIHhjaGcgICAlYXgsJWN4Ci0geGNoZyAgICVheCwlZHgKLSB4Y2hnICAgJWF4LCVieAotIHhjaGcgICAlYXgsJXNwCi0geGNoZyAgICVheCwlYnAKLSB4Y2hnICAgJWF4LCVzaQotIHhjaGcgICAlYXgsJWRpCi0gY2J0dwotIGN3dGQKLSBsY2FsbHcgJDB4OTA5MCwkMHg5MDkwCi0gcHVzaGZ3Ci0gcG9wZncKLSBtb3YgICAgMHg5MDkwOTA5MCwlYXgKLSBtb3YgICAgJWF4LDB4OTA5MDkwOTAKLSBtb3ZzdyAgJWRzOiglZXNpKSwlZXM6KCVlZGkpCi0gY21wc3cgICVlczooJWVkaSksJWRzOiglZXNpKQotIHRlc3QgICAkMHg5MDkwLCVheAotIHN0b3MgICAlYXgsJWVzOiglZWRpKQotIGxvZHMgICAlZHM6KCVlc2kpLCVheAotIHNjYXMgICAlZXM6KCVlZGkpLCVheAotIG1vdiAgICAkMHg5MDkwLCVheAotIG1vdiAgICAkMHg5MDkwLCVjeAotIG1vdiAgICAkMHg5MDkwLCVkeAotIG1vdiAgICAkMHg5MDkwLCVieAotIG1vdiAgICAkMHg5MDkwLCVzcAotIG1vdiAgICAkMHg5MDkwLCVicAotIG1vdiAgICAkMHg5MDkwLCVzaQotIG1vdiAgICAkMHg5MDkwLCVkaQotIHJjbHcgICAkMHg5MCwweDkwOTA5MDkwKCVlYXgpCi0gcmV0dyAgICQweDkwOTAKLSByZXR3Ci0gbGVzICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gbGRzICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gbW92dyAgICQweDkwOTAsMHg5MDkwOTA5MCglZWF4KQotIGVudGVydyAkMHg5MDkwLCQweDkwCi0gbGVhdmV3Ci0gbHJldHcgICQweDkwOTAKLSBscmV0dwotIGlyZXR3Ci0gcmNsdyAgIDB4OTA5MDkwOTAoJWVheCkKLSByY2x3ICAgJWNsLDB4OTA5MDkwOTAoJWVheCkKLSBpbiAgICAgJDB4OTAsJWF4Ci0gb3V0ICAgICVheCwkMHg5MAotIGNhbGx3ICAuKzMrMHg5MDkwCi0gbGptcHcgICQweDkwOTAsJDB4OTA5MAotIGluICAgICAoJWR4KSwlYXgKLSBvdXQgICAgJWF4LCglZHgpCi0gbm90dyAgIDB4OTA5MDkwOTAoJWVheCkKLSBjYWxsdyAgKjB4OTA5MDkwOTAoJWVheCkKLSBsYXIgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBsc2wgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92byAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92bm8gMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92YiAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92YWUgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92ZSAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92bmUgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92YmUgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92YSAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92cyAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92bnMgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92cCAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92bnAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92bCAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92Z2UgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92bGUgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92ZyAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBwdXNodyAgJWZzCi0gcG9wdyAgICVmcwotIGJ0ICAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNobGQgICAkMHg5MCwlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNobGQgICAlY2wsJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBwdXNodyAgJWdzCi0gcG9wdyAgICVncwotIGJ0cyAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNocmQgICAkMHg5MCwlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNocmQgICAlY2wsJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBpbXVsICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbXB4Y2hnICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbHNzICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gYnRyICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbGZzICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gbGdzICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gbW92emJ3IDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gYnRjICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYnNmICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gYnNyICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gbW92c2J3IDB4OTA5MDkwOTAoJWVheCksJWR4Ci0geGFkZCAgICVkeCwweDkwOTA5MDkwKCVlYXgpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9wcmVmaXguZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0YjY1OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI29iamR1bXA6IC1kdwotI25hbWU6IGkzODYgcHJlZml4Ci0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAgPGZvbz46Ci0gICAwOgk5YiA2NyAyNiBkOSAzYyBbIAldKmFkZHIxNiBmc3RjdyAlZXM6XCglc2lcKQotICAgNToJOWIgZGYgZTAgWyAJXSpmc3RzdyAgJWF4Ci0gICA4Ogk5YiBkZiBlMCBbIAldKmZzdHN3ICAlYXgKLSAgIGI6CTliIGRmIGUwIFsgCV0qZnN0c3cgICVheAotICAgZToJOWIgNjcgZGYgZTAgWyAJXSphZGRyMTYgZnN0c3cgJWF4Ci0gIDEyOglmMyA2NyA2NiAzNiBhNyBbIAldKnJlcHogYWRkcjE2IGNtcHN3ICVlczpcKCVkaVwpLCVzczpcKCVzaVwpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9wcmVmaXgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1ZGZmZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLnRleHQKLWZvbzoKLSBhZGRyMTYgZnN0Y3cgJWVzOiglc2kpCi0gZnN0c3cKLSBmc3RzdyAlYXgKLSBmc3RzdyAlZWF4Ci0gYWRkcjE2IGZzdHN3ICVheAotIGFkZHIxNiByZXAgY21wc3cgJWVzOiglZGkpLCVzczooJXNpKQotCi0jIEdldCBhIGdvb2QgYWxpZ25tZW50LgotIC5wMmFsaWduCTQsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTk1ZWVkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNvYmpkdW1wOiAtZHJ3Ci0jbmFtZTogaTM4NiByZWxvYwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qaTM4Ni4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxmb28+OgotICAgMDoJYjMgMDAgWyAJXSptb3YgICAgXCQweDAsJWJsCTE6IChSXzM4Nl8pPzgJLnRleHQKLSAgIDI6CTY4IDAwIDAwIDAwIDAwIFsgCV0qcHVzaCAgIFwkMHgwCTM6IChSXzM4Nl8pPyhkaXIpPzMyCS50ZXh0Ci0gICA3OgkwNSAwMCAwMCAwMCAwMCBbIAldKmFkZCAgICBcJDB4MCwlZWF4CTg6IChSXzM4Nl8pPyhkaXIpPzMyCS50ZXh0Ci0gICBjOgk4MSBjMyAwMCAwMCAwMCAwMCBbIAldKmFkZCAgICBcJDB4MCwlZWJ4CWU6IChSXzM4Nl8pPyhkaXIpPzMyCS50ZXh0Ci0gIDEyOgk2OSBkMiAwMCAwMCAwMCAwMCBbIAldKmltdWwgICBcJDB4MCwlZWR4LCVlZHgJMTQ6IChSXzM4Nl8pPyhkaXIpPzMyCS50ZXh0Ci0gIDE4Ogk5YSAwMCAwMCAwMCAwMCAwMCAwMCBbIAldKmxjYWxsICBcJDB4MCxcJDB4MAkxOTogKFJfMzg2Xyk/KGRpcik/MzIJLnRleHQKLSAgMWY6CTY2IDY4IDAwIDAwIFsgCV0qcHVzaHcgIFwkMHgwCTIxOiAoUl8zODZfKT8xNgkudGV4dAotICAyMzoJOTAgWyAJXSpub3AgICAgCi0gIDI0Ogk5MCBbIAldKm5vcCAgICAKLSAgMjU6CTkwIFsgCV0qbm9wICAgIAotICAyNjoJOTAgWyAJXSpub3AgICAgCi0gIDI3Ogk5MCBbIAldKm5vcCAgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmOTViNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3JlbG9jLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0udGV4dAotZm9vOgltb3YJJGZvbywgJWJsCi0JcHVzaAkkZm9vCi0JYWRkCSRmb28sICVlYXgKLQlhZGQJJGZvbywgJWVieAotCWltdWwJJGZvbywgJWVkeAotCWxjYWxsCSQwLCAkZm9vCi0JcHVzaHcJJGZvbwotCi0jIFBhZCBvdXQgdG8gYSBnb29kIGFsaWdubWVudAotIC5ieXRlIDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmQ5MTU3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvd2hpdGUubAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLUdBUyBMSVNUSU5HIC4qCi0KLQotICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSMgdGVzdCBoYW5kbGluZyBvZiB3aGl0ZXNwYWNlLCBhbmQgdXBwZXItY2FzZQotICAgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS5UZVh0IAotICAgMyAwMDAwIDM2ICAgICAgICAgICAgICAgICAgICAgICAgIAkJc3MgCi0gICA0IDAwMDEgODgwMyAgICAgICAgICAgICAgICAgICAgICAgCQltb3YgJSBhbCAsIFwoICUgZWJ4IFwpIAotICAgNSAwMDAzIEM3MDVENzExIDAwMDA3QjAwIDAwMDAgICAgIAkgICAgICAgIG1PdmwgXCQgMTIzICwgNDU2NyAKLSAgIDYgMDAwZCA2NzhBNzg3QiAgICAgICAgICAgICAgICAgICAJIEFERHIxNgltb3YgMTIzIFwoICUgYnggLCAlIHNpICwgMSBcKSAsICUgYmggCi0gICA3IDAwMTEgRkZFMCAgICAgICAgICAgICAgICAgICAgICAgCQlqbXAgXCogJSBlYXggCi0gICA4IDAwMTMgNjYyNkZGMjMgICAgICAgICAgICAgICAgICAgCWZvbzoJam1wdyAlIGVzIDogXCogXCggJSBlYnggXCkJCi0gICA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJIAotICAxMCAwMDE3IEEwNTAwMDAwIDAwICAgICAgICAgICAgICAgIAkJbW92IFwoIDB4OCBcKiAwWGEgXCkgLCAlIGFsIAotICAxMSAwMDFjIEIwMjAgICAgICAgICAgICAgICAgICAgICAgIAkJbW92IFwkIFwoIDggXCogNCBcKSAsICUgYWwgCi0gIDEyIDAwMWUgQjcxMyAgICAgICAgICAgICAgICAgICAgICAgCQltb3YgXCQgZm9vICwgJSBiSCAKLSAgMTMgMDAyMCBCNzEzICAgICAgICAgICAgICAgICAgICAgICAJCW1vdmIgXCQgZm9vICwgJSBCSCAKLSAgMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCi0gIDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLkNPREUxNgkKLSAgMTYgMDAyMiA2NkI4MTMwMCAwMDAwICAgICAgICAgICAgICAJCU1vdiBcJCBmb28gLCAlZUF4CQotICAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS5Db2RlMzIgCi0gIDE4IDAwMjggNjZCODEzMDAgICAgICAgICAgICAgICAgICAgCQltb3YgXCQgZm9vICwgJWF4CQotICAxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQotICAyMCAwMDJjIEQ5QzkgICAgICAgICAgICAgICAgICAgICAgIAkJZnhjaCAgICVzdCAgXCggIDEgIFwpIAotICAyMSAwMDJlIEQ5QzkgICAgICAgICAgICAgICAgICAgICAgIAkJZnhjaCAgICUgICAgICAgICAgIHN0XCgxXCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvd2hpdGUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvd2hpdGUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlY2NmYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3doaXRlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIHRlc3QgaGFuZGxpbmcgb2Ygd2hpdGVzcGFjZSwgYW5kIHVwcGVyLWNhc2UKLS5UZVh0IAotCXNzIAotCW1vdiAlIGFsICwgKCAlIGVieCApIAotICAgICAgICBtT3ZsICQgMTIzICwgNDU2NyAKLSBBRERyMTYJbW92IDEyMyAoICUgYnggLCAlIHNpICwgMSApICwgJSBiaCAKLQlqbXAgKiAlIGVheCAKLWZvbzoJam1wdyAlIGVzIDogKiAoICUgZWJ4ICkJCi0gCi0JbW92ICggMHg4ICogMFhhICkgLCAlIGFsIAotCW1vdiAkICggOCAqIDQgKSAsICUgYWwgCi0JbW92ICQgZm9vICwgJSBiSCAKLQltb3ZiICQgZm9vICwgJSBCSCAKLQkKLS5DT0RFMTYJCi0JTW92ICQgZm9vICwgJWVBeAkKLS5Db2RlMzIgCi0JbW92ICQgZm9vICwgJWF4CQotCi0JZnhjaCAgICVzdCAgKCAgMSAgKSAKLQlmeGNoICAgJSAgICAgICAgICAgc3QoMSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2llZWUtZnAveDkzMDUwOWEuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ODhkMmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIFJlcG9ydGVkIDkzLzA1LzA5IGJ5IEppbSBXaWxzb246IElFRUUgc2luZ2xlLXByZWNpc2lvbiBGTFRfTUlOIHZhbHVlIGdldHMKLSMgYXNzZW1ibGVkIGluY29ycmVjdGx5LiAgKE9mZiBieSBvbmUgdWxwLikKLQotcHJvYyBkb3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiSUVFRSBGTFRfTUlOLCBzaW5nbGUtcHJlY2lzaW9uIgotICAgIHNldCB4IDAKLSAgICBnYXNfc3RhcnQgIng5MzA1MDlhLnMiICItYWwiCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgMDAwMDgwMDBcWyAJXF0rLnNpbmdsZSIgeyBwYXNzICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiIDAwODAwMDAwXFsgCVxdKy5zaW5nbGUiIHsgcGFzcyAkdGVzdG5hbWU7IHNldCB4IDEgfQotCSAgICAtcmUgIiAwMDgwIDAwMDBcWyAJXF0rLnNpbmdsZSIgeyBwYXNzICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiIC4uLi4uLi4uICsuc2luZ2xlIiB7IGZhaWwgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICJcW15cblxdKlxuIiB7IH0KLQkgICAgdGltZW91dCB7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YgeyBicmVhayB9Ci0JfQotICAgIH0KLSAgICBnYXNfZmluaXNoCi0gICAgaWYgISR4IHRoZW4geyBmYWlsICIkdGVzdG5hbWUgKGxpc3RpbmcgZGlkbid0IG1hdGNoKSIgfQotfQotCi1pZiAhW2lzdGFyZ2V0IHZheCotKi0qXSB0aGVuIHsKLSAgICBkb3Rlc3QKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2llZWUtZnAveDkzMDUwOWEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2llZWUtZnAveDkzMDUwOWEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxYjMzOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSAgICAgICAgLmdsb2JhbCBfZmx0X21pbgotCS5kYXRhCi0gICAgICAgIC5hbGlnbiA0Ci1fZmx0X21pbjoKLSAgICAgICAgLnNpbmdsZSAwcjEuMTc1NDk0MzVlLTM4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTk2NWU2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5kCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBhbGxpbnNuCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwIDxhZGQ+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+OgotIDFkYzoJMmQgNWQgZjAgMDAgCXVubG9jayBmcCxAZnAgXHxcfCBub3AKLQotMCswMWUwIDxwdXNoPjoKLSAxZTA6CTJkIDdmIGYwIDAwIAlwdXNoIGZwIFx8XHwgbm9wCi0KLTArMDFlNCA8cG9wPjoKLSAxZTQ6CTJkIGVmIGYwIDAwIAlwb3AgZnAgXHxcfCBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWRkZDBlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgTTMyUiBhc3NlbWJsZXIgdGVzdHN1aXRlLgotCi1pZiBbaXN0YXJnZXQgbTMyciotKi0qXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCAiYWxsaW5zbiIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YjQ1NjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotIC5kYXRhCi1mb29kYXRhOiAud29yZCA0MgotIC50ZXh0Ci1mb290ZXh0OgotCS50ZXh0Ci0JLmdsb2JhbCBhZGQKLWFkZDoKLQlhZGQgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgYWRkMwotYWRkMzoKLQlhZGQzIGZwLGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIGFuZAotYW5kOgotCWFuZCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBhbmQzCi1hbmQzOgotCWFuZDMgZnAsZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgb3IKLW9yOgotCW9yIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG9yMwotb3IzOgotCW9yMyBmcCxmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCB4b3IKLXhvcjoKLQl4b3IgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgeG9yMwoteG9yMzoKLQl4b3IzIGZwLGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIGFkZGkKLWFkZGk6Ci0JYWRkaSBmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBhZGR2Ci1hZGR2OgotCWFkZHYgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgYWRkdjMKLWFkZHYzOgotCWFkZHYzIGZwLGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIGFkZHgKLWFkZHg6Ci0JYWRkeCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBiYzgKLWJjODoKLQliYyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJjOF9zCi1iYzhfczoKLQliYy5zIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmMyNAotYmMyNDoKLQliYyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJjMjRfbAotYmMyNF9sOgotCWJjLmwgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiZXEKLWJlcToKLQliZXEgZnAsZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiZXF6Ci1iZXF6OgotCWJlcXogZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiZ2V6Ci1iZ2V6OgotCWJnZXogZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiZ3R6Ci1iZ3R6OgotCWJndHogZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibGV6Ci1ibGV6OgotCWJsZXogZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibHR6Ci1ibHR6OgotCWJsdHogZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibmV6Ci1ibmV6OgotCWJuZXogZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibDgKLWJsODoKLQlibCBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJsOF9zCi1ibDhfczoKLQlibC5zIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmwyNAotYmwyNDoKLQlibCBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJsMjRfbAotYmwyNF9sOgotCWJsLmwgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibmM4Ci1ibmM4OgotCWJuYyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJuYzhfcwotYm5jOF9zOgotCWJuYy5zIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYm5jMjQKLWJuYzI0OgotCWJuYyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJuYzI0X2wKLWJuYzI0X2w6Ci0JYm5jLmwgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibmUKLWJuZToKLQlibmUgZnAsZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBicmE4Ci1icmE4OgotCWJyYSBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJyYThfcwotYnJhOF9zOgotCWJyYS5zIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYnJhMjQKLWJyYTI0OgotCWJyYSBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJyYTI0X2wKLWJyYTI0X2w6Ci0JYnJhLmwgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBjbXAKLWNtcDoKLQljbXAgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgY21waQotY21waToKLQljbXBpIGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIGNtcHUKLWNtcHU6Ci0JY21wdSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBjbXB1aQotY21wdWk6Ci0JY21wdWkgZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgZGl2Ci1kaXY6Ci0JZGl2IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGRpdnUKLWRpdnU6Ci0JZGl2dSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCByZW0KLXJlbToKLQlyZW0gZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgcmVtdQotcmVtdToKLQlyZW11IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGpsCi1qbDoKLQlqbCBmcAotCS50ZXh0Ci0JLmdsb2JhbCBqbXAKLWptcDoKLQlqbXAgZnAKLQkudGV4dAotCS5nbG9iYWwgbGQKLWxkOgotCWxkIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBsZF8yCi1sZF8yOgotCWxkIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkX2QKLWxkX2Q6Ci0JbGQgZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZF9kMgotbGRfZDI6Ci0JbGQgZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZGIKLWxkYjoKLQlsZGIgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIGxkYl8yCi1sZGJfMjoKLQlsZGIgZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgbGRiX2QKLWxkYl9kOgotCWxkYiBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkYl9kMgotbGRiX2QyOgotCWxkYiBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIGxkaAotbGRoOgotCWxkaCBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgbGRoXzIKLWxkaF8yOgotCWxkaCBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZGhfZAotbGRoX2Q6Ci0JbGRoIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgbGRoX2QyCi1sZGhfZDI6Ci0JbGRoIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgbGR1YgotbGR1YjoKLQlsZHViIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBsZHViXzIKLWxkdWJfMjoKLQlsZHViIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWJfZAotbGR1Yl9kOgotCWxkdWIgZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZHViX2QyCi1sZHViX2QyOgotCWxkdWIgZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZHVoCi1sZHVoOgotCWxkdWggZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWhfMgotbGR1aF8yOgotCWxkdWggZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgbGR1aF9kCi1sZHVoX2Q6Ci0JbGR1aCBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWhfZDIKLWxkdWhfZDI6Ci0JbGR1aCBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIGxkX3BsdXMKLWxkX3BsdXM6Ci0JbGQgZnAsQGZwKwotCS50ZXh0Ci0JLmdsb2JhbCBsZDI0Ci1sZDI0OgotCWxkMjQgZnAsZm9vZGF0YQotCS50ZXh0Ci0JLmdsb2JhbCBsZGk4Ci1sZGk4OgotCWxkaSBmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIGxkaTE2Ci1sZGkxNjoKLQlsZGkgZnAsMjU2Ci0JLnRleHQKLQkuZ2xvYmFsIGxvY2sKLWxvY2s6Ci0JbG9jayBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgbWFjaGkKLW1hY2hpOgotCW1hY2hpIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG1hY2xvCi1tYWNsbzoKLQltYWNsbyBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtYWN3aGkKLW1hY3doaToKLQltYWN3aGkgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbWFjd2xvCi1tYWN3bG86Ci0JbWFjd2xvIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG11bAotbXVsOgotCW11bCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdWxoaQotbXVsaGk6Ci0JbXVsaGkgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXVsbG8KLW11bGxvOgotCW11bGxvIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG11bHdoaQotbXVsd2hpOgotCW11bHdoaSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdWx3bG8KLW11bHdsbzoKLQltdWx3bG8gZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXYKLW12OgotCW12IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12ZmFjaGkKLW12ZmFjaGk6Ci0JbXZmYWNoaSBmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdmZhY2xvCi1tdmZhY2xvOgotCW12ZmFjbG8gZnAKLQkudGV4dAotCS5nbG9iYWwgbXZmYWNtaQotbXZmYWNtaToKLQltdmZhY21pIGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12ZmMKLW12ZmM6Ci0JbXZmYyBmcCxwc3cKLQkudGV4dAotCS5nbG9iYWwgbXZ0YWNoaQotbXZ0YWNoaToKLQltdnRhY2hpIGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12dGFjbG8KLW12dGFjbG86Ci0JbXZ0YWNsbyBmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdnRjCi1tdnRjOgotCW12dGMgZnAscHN3Ci0JLnRleHQKLQkuZ2xvYmFsIG5lZwotbmVnOgotCW5lZyBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBub3AKLW5vcDoKLQlub3AKLQkudGV4dAotCS5nbG9iYWwgbm90Ci1ub3Q6Ci0Jbm90IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHJhYwotcmFjOgotCS50ZXh0Ci0JLmdsb2JhbCByYWNoCi1yYWNoOgotCS50ZXh0Ci0JLmdsb2JhbCBydGUKLXJ0ZToKLQkudGV4dAotCS5nbG9iYWwgc2V0aAotc2V0aDoKLQlzZXRoIGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc2xsCi1zbGw6Ci0Jc2xsIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHNsbDMKLXNsbDM6Ci0Jc2xsMyBmcCxmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHNsbGkKLXNsbGk6Ci0Jc2xsaSBmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHNyYQotc3JhOgotCXNyYSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBzcmEzCi1zcmEzOgotCXNyYTMgZnAsZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzcmFpCi1zcmFpOgotCXNyYWkgZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzcmwKLXNybDoKLQlzcmwgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgc3JsMwotc3JsMzoKLQlzcmwzIGZwLGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc3JsaQotc3JsaToKLQlzcmxpIGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc3QKLXN0OgotCXN0IGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBzdF8yCi1zdF8yOgotCXN0IGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIHN0X2QKLXN0X2Q6Ci0Jc3QgZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdF9kMgotc3RfZDI6Ci0Jc3QgZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdGIKLXN0YjoKLQlzdGIgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIHN0Yl8yCi1zdGJfMjoKLQlzdGIgZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgc3RiX2QKLXN0Yl9kOgotCXN0YiBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIHN0Yl9kMgotc3RiX2QyOgotCXN0YiBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIHN0aAotc3RoOgotCXN0aCBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgc3RoXzIKLXN0aF8yOgotCXN0aCBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdGhfZAotc3RoX2Q6Ci0Jc3RoIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgc3RoX2QyCi1zdGhfZDI6Ci0Jc3RoIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgc3RfcGx1cwotc3RfcGx1czoKLQlzdCBmcCxAK2ZwCi0JLnRleHQKLQkuZ2xvYmFsIHN0X21pbnVzCi1zdF9taW51czoKLQlzdCBmcCxALWZwCi0JLnRleHQKLQkuZ2xvYmFsIHN1Ygotc3ViOgotCXN1YiBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBzdWJ2Ci1zdWJ2OgotCXN1YnYgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgc3VieAotc3VieDoKLQlzdWJ4IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHRyYXAKLXRyYXA6Ci0JdHJhcCAwCi0JLnRleHQKLQkuZ2xvYmFsIHVubG9jawotdW5sb2NrOgotCXVubG9jayBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgcHVzaAotcHVzaDoKLQlwdXNoIGZwCi0JLnRleHQKLQkuZ2xvYmFsIHBvcAotcG9wOgotCXBvcCBmcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9lcnJvci5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2Vycm9yLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE4ODcxOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2Vycm9yLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMgVGVzdCBhc3NlbWJsZXIgd2FybmluZ3MgYW5kIGVycm9ycy4KLQotaWYgW2lzdGFyZ2V0IG0zMnItKi0qXSB7Ci0KLSAgICBsb2FkX2xpYiBnYXMtZGcuZXhwCi0KLSAgICBkZy1pbml0Ci0KLSAgICBkZy1ydW50ZXN0ICIkc3JjZGlyLyRzdWJkaXIvd3JvbmdzaXplLnMiICIiICIiCi0gICAgZGctcnVudGVzdCAiJHNyY2Rpci8kc3ViZGlyL2ludGVyZmVyZS5zIiAiIiAiIgotICAgIGRnLXJ1bnRlc3QgIiRzcmNkaXIvJHN1YmRpci9vdXRvZnJhbmdlLnMiICIiICIiCi0KLSAgICBkZy1maW5pc2gKLQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWNmMDJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBmc2xvdAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMCA8Ymw+OgotICowOgk3ZSAwMCBmMCAwMCAJYmwgMCA8Ymw+IFx8XHwgbm9wCi0gKjQ6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKLQotMCs4IDxibF9zPjoKLSAqODoJN2UgMDAgZjAgMDAgCWJsIDggPGJsX3M+IFx8XHwgbm9wCi0gKmM6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKLQotMCsxMCA8YnJhPjoKLSAqMTA6CTdmIDAwIGYwIDAwIAlicmEgMTAgPGJyYT4gXHxcfCBub3AKLSAqMTQ6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKLQotMCsxOCA8YnJhX3M+OgotICoxODoJN2YgMDAgZjAgMDAgCWJyYSAxOCA8YnJhX3M+IFx8XHwgbm9wCi0gKjFjOgk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCi0KLTArMjAgPGpsPjoKLSAqMjA6CTFlIGMwIGYwIDAwIAlqbCByMCBcfFx8IG5vcAotICoyNDoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAotCi0wKzI4IDx0cmFwPjoKLSAqMjg6CTEwIGY0IGYwIDAwIAl0cmFwIFsjXSoweDQgXHxcfCBub3AKLSAqMmM6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2YjY2NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIFRlc3QgdGhlIEZJTEwtU0xPVCBhdHRyaWJ1dGUuCi0jIFRoZSBGSUxMLVNMT1QgYXR0cmlidXRlIGVuc3VyZXMgdGhlIG5leHQgaW5zbiBiZWdpbnMgb24gYSAzMiBieXRlIGJvdW5kYXJ5LgotIyBUaGlzIGlzIG5lZWRlZCBmb3IgZXhhbXBsZSB3aXRoIGJsIGJlY2F1c2UgdGhlIHN1YnJvdXRpbmUgd2lsbCByZXR1cm4KLSMgdG8gYSAzMiBiaXQgYm91bmRhcnkuCi0KLQkudGV4dAotYmw6Ci0JYmwgYmwKLQlsZGkgcjAsIzgKLWJsX3M6Ci0JYmwucyBibF9zCi0JbGRpIHIwLCM4Ci0KLWJyYToKLQlicmEgYnJhCi0JbGRpIHIwLCM4Ci1icmFfczoKLQlicmEucyBicmFfcwotCWxkaSByMCwjOAotCi1qbDoKLQlqbCByMAotCWxkaSByMCwjOAotCi10cmFwOgotCXRyYXAgIzQKLQlsZGkgcjAsIzgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3R4LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90eC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2UyZDFhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3R4LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jYXM6IC1tMzJyeAotI29iamR1bXA6IC1kcgotI25hbWU6IGZzbG90eAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMCA8YmNsPjoKLSAqMDoJNzggMDAgZjAgMDAgCWJjbCAwIDxiY2w+IFx8XHwgbm9wCi0gKjQ6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKLQotMCs4IDxiY2xfcz46Ci0gKjg6CTc4IDAwIGYwIDAwIAliY2wgOCA8YmNsX3M+IFx8XHwgbm9wCi0gKmM6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKLQotMCsxMCA8Ym5jbD46Ci0gIDEwOgk3OSAwMCBmMCAwMCAJYm5jbCAxMCA8Ym5jbD4gXHxcfCBub3AKLSAgMTQ6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKLQotMCsxOCA8Ym5jbF9zPjoKLSAgMTg6CTc5IDAwIGYwIDAwIAlibmNsIDE4IDxibmNsX3M+IFx8XHwgbm9wCi0gIDFjOgk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90eC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdHgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmYjIzMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90eC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBUZXN0IHRoZSBGSUxMLVNMT1QgYXR0cmlidXRlLgotIyBUaGUgRklMTC1TTE9UIGF0dHJpYnV0ZSBlbnN1cmVzIHRoZSBuZXh0IGluc24gYmVnaW5zIG9uIGEgMzIgYnl0ZSBib3VuZGFyeS4KLSMgVGhpcyBpcyBuZWVkZWQgZm9yIGV4YW1wbGUgd2l0aCBibCBiZWNhdXNlIHRoZSBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuCi0jIHRvIGEgMzIgYml0IGJvdW5kYXJ5LgotCi0JLnRleHQKLWJjbDoKLQliY2wgYmNsCi0JbGRpIHIwLCM4Ci1iY2xfczoKLQliY2wucyBiY2xfcwotCWxkaSByMCwjOAotCi1ibmNsOgotCWJuY2wgYm5jbAotCWxkaSByMCwjOAotYm5jbF9zOgotCWJuY2wucyBibmNsX3MKLQlsZGkgcjAsIzgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2hpZ2gtMS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNjYjhjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogaGlnaC0xCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCogPGZvbz46Ci0gKjA6CWQ0IGMwIDAwIDAxIAlzZXRoIHI0LFsjXSoweDEKLVsgCV0qMDogUl9NMzJSX0hJMTZfVUxPCS50ZXh0Ci0gKjQ6CTg0IGU0IDAwIDAwIAlvcjMgcjQscjQsWyNdKjB4MAotWyAJXSo0OiBSX00zMlJfTE8xNgkudGV4dAotICo4OglkNCBjMCAxMiAzNCAJc2V0aCByNCxbI10qMHgxMjM0Ci0gKmM6CTg0IGU0IDg3IDY1IAlvcjMgcjQscjQsWyNdKjB4ODc2NQotICoxMDoJZDQgYzAgMTIgMzUgCXNldGggcjQsWyNdKjB4MTIzNQotICoxNDoJODQgZTQgODcgNjUgCW9yMyByNCxyNCxbI10qMHg4NzY1Ci0gKjE4OglkNCBjMCA4NyA2NSAJc2V0aCByNCxbI10qMHg4NzY1Ci0gKjFjOgk4NCBlNCA0MyAyMSAJb3IzIHI0LHI0LFsjXSoweDQzMjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2hpZ2gtMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTVkMWQxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi07IFRlc3QgaGlnaC9zaGlnaCBoYW5kbGluZy4KLQotZm9vOgotCXNldGggcjQsI2hpZ2goZm9vKzB4MTAwMDApCi0Jb3IzICByNCxyNCwjbG93KGZvbysweDEwMDAwKQotCi0Jc2V0aCByNCwjaGlnaCgweDEyMzQ4NzY1KQotCW9yMyAgcjQscjQsI2xvdygweDEyMzQ4NzY1KQotCi0Jc2V0aCByNCwjc2hpZ2goMHgxMjM0ODc2NSkKLQlvcjMgIHI0LHI0LCNsb3coMHgxMjM0ODc2NSkKLQotCXNldGggcjQsI3NoaWdoKDB4ODc2NTQzMjEpCi0Jb3IzICByNCxyNCwjbG93KDB4ODc2NTQzMjEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ludGVyZmVyZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9pbnRlcmZlcmUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1ZWNkZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ludGVyZmVyZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotOyBUZXN0IGVycm9yIG1lc3NhZ2VzIGluIGluc3RhbmNlcyB3aGVyZSBvdXRwdXQgb3BlcmFuZHMgaW50ZXJmZXJlLgotCi07IHsgZGctZG8gYXNzZW1ibGUgeyB0YXJnZXQgbTMyci0qLSogfSB9Ci07IHsgZGctb3B0aW9ucyAtbTMycnggfQotCi1pbnRlcmZlcmU6Ci0JdHJhcCAjMSAgICAgIHx8IGNtcCAgcjMsIHI0CTsgeyBkZy1lcnJvciAid3JpdGUgdG8gdGhlIHNhbWUiIH0KLQkJOyB7IGRnLXdhcm5pbmcgInNhbWUiICJvdXQtPmluIiB7IHRhcmdldCAqLSotKiB9IHsgNyB9IH0KLQlydGUgICAgICAgICAgfHwgYWRkeCByMywgcjQJOyB7IGRnLWVycm9yICJ3cml0ZSB0byB0aGUgc2FtZSIgfQotCQk7IHsgZGctd2FybmluZyAic2FtZSIgIm91dC0+aW4iIHsgdGFyZ2V0ICotKi0qIH0geyA5IH0gfQotCWNtcCAgcjEsIHIyICB8fCBhZGR4IHIzLCByNAk7IHsgZGctZXJyb3IgIndyaXRlIHRvIHRoZSBzYW1lIiB9Ci0JCTsgeyBkZy13YXJuaW5nICJzYW1lIiAib3V0LT5pbiIgeyB0YXJnZXQgKi0qLSogfSB7IDExIH0gfQotCW12dGMgcjAsIHBzdyB8fCBhZGR4IHIxLCByNAk7IHsgZGctZXJyb3IgIndyaXRlIHRvIHRoZSBzYW1lIiB9Ci0JCTsgeyBkZy13YXJuaW5nICJzYW1lIiAib3V0LT5pbiIgeyB0YXJnZXQgKi0qLSogfSB7IDEzIH0gfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMyci5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YzIzNjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBNMzJSIHRlc3RjYXNlcwotCi1pZiBbaXN0YXJnZXQgbTMyciotKi0qXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCAiaGlnaC0xIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlbGF4LTEiCi0gICAgcnVuX2R1bXBfdGVzdCAidXBwZXJjYXNlIgotICAgIHJ1bl9kdW1wX3Rlc3QgImZzbG90IgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyeC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyeC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzEzZGQyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvbTMycnguZAorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0jYXM6IC1tMzJyeCAtLW5vLXdhcm4tZXhwbGljaXQtcGFyYWxsZWwtY29uZmxpY3RzIC0taGlkZGVuIC1PCi0jb2JqZHVtcDogLWRyCi0jbmFtZTogbTMycngKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAgPGJjbD46Ci0gICAwOgk3OCAwMCBmMCAwMCAJYmNsIDAgPGJjbD4gXHxcfCBub3AKLQotMCswMDA0IDxibmNsPjoKLSAgIDQ6CTc5IGZmIGYwIDAwIAlibmNsIDAgPGJjbD4gXHxcfCBub3AKLQotMCswMDA4IDxjbXB6PjoKLSAgIDg6CTAwIDdkIGYwIDAwIAljbXB6IGZwIFx8XHwgbm9wCi0KLTArMDAwYyA8Y21wZXE+OgotICAgYzoJMGQgNmQgZjAgMDAgCWNtcGVxIGZwLGZwIFx8XHwgbm9wCi0KLTArMDAxMCA8bWFjbGgxPjoKLSAgMTA6CTVkIGNkIGYwIDAwIAltYWNsaDEgZnAsZnAgXHxcfCBub3AKLQotMCswMDE0IDxtc2Jsbz46Ci0gIDE0Ogk1ZCBkZCBmMCAwMCAJbXNibG8gZnAsZnAgXHxcfCBub3AKLQotMCswMDE4IDxtdWx3dTE+OgotICAxODoJNWQgYWQgZjAgMDAgCW11bHd1MSBmcCxmcCBcfFx8IG5vcAotCi0wKzAwMWMgPG1hY3d1MT46Ci0gIDFjOgk1ZCBiZCBmMCAwMCAJbWFjd3UxIGZwLGZwIFx8XHwgbm9wCi0KLTArMDAyMCA8c2FkZD46Ci0gIDIwOgk1MCBlNCBmMCAwMCAJc2FkZCBcfFx8IG5vcAotCi0wKzAwMjQgPHNhdGI+OgotICAyNDoJOGQgNmQgMDMgMDAgCXNhdGIgZnAsZnAKLQotMCswMDI4IDxtdWxoaT46Ci0gIDI4OgkzZCA4ZCBmMCAwMCAJbXVsaGkgZnAsZnAsYTEgXHxcfCBub3AKLQotMCswMDJjIDxtdWxsbz46Ci0gIDJjOgkzZCAxZCBmMCAwMCAJbXVsbG8gZnAsZnAgXHxcfCBub3AKLQotMCswMDMwIDxkaXZoPjoKLSAgMzA6CTlkIDBkIDAwIDEwIAlkaXZoIGZwLGZwCi0KLTArMDAzNCA8bWFjaGk+OgotICAzNDoJM2QgY2QgZjAgMDAgCW1hY2hpIGZwLGZwLGExIFx8XHwgbm9wCi0KLTArMDAzOCA8bWFjbG8+OgotICAzODoJM2QgNWQgZjAgMDAgCW1hY2xvIGZwLGZwIFx8XHwgbm9wCi0KLTArMDAzYyA8bXZmYWNoaT46Ci0gIDNjOgk1ZCBmNCBmMCAwMCAJbXZmYWNoaSBmcCxhMSBcfFx8IG5vcAotCi0wKzAwNDAgPG12ZmFjbWk+OgotICA0MDoJNWQgZjYgZjAgMDAgCW12ZmFjbWkgZnAsYTEgXHxcfCBub3AKLQotMCswMDQ0IDxtdmZhY2xvPjoKLSAgNDQ6CTVkIGY1IGYwIDAwIAltdmZhY2xvIGZwLGExIFx8XHwgbm9wCi0KLTArMDA0OCA8bXZ0YWNoaT46Ci0gIDQ4Ogk1ZCA3NCBmMCAwMCAJbXZ0YWNoaSBmcCxhMSBcfFx8IG5vcAotCi0wKzAwNGMgPG12dGFjbG8+OgotICA0YzoJNWQgNzEgZjAgMDAgCW12dGFjbG8gZnAgXHxcfCBub3AKLQotMCswMDUwIDxyYWM+OgotICA1MDoJNTQgOTAgZjAgMDAgCXJhYyBhMSBcfFx8IG5vcAotCi0wKzAwNTQgPHJhY19kcz46Ci0gIDU0Ogk1NCA5MCBmMCAwMCAJcmFjIGExIFx8XHwgbm9wCi0KLTArMDA1OCA8cmFjX2RzaT46Ci0gIDU4Ogk1MCA5NCBmMCAwMCAJcmFjIGEwLGExIFx8XHwgbm9wCi0KLTArMDA1YyA8cmFjaD46Ci0gIDVjOgk1NCA4MCBmMCAwMCAJcmFjaCBhMSBcfFx8IG5vcAotCi0wKzAwNjAgPHJhY2hfZHM+OgotICA2MDoJNTAgODQgZjAgMDAgCXJhY2ggYTAsYTEgXHxcfCBub3AKLQotMCswMDY0IDxyYWNoX2RzaT46Ci0gIDY0Ogk1NCA4MSBmMCAwMCAJcmFjaCBhMSxhMCwjMHgyIFx8XHwgbm9wCi0KLTArMDA2OCA8YmNfX2FkZD46Ci0gIDY4Ogk3YyBlNiA4ZCBhZCAJYmMgMCA8YmNsPiBcfFx8IGFkZCBmcCxmcAotICA2YzoJN2MgZTUgMGQgYWQgCWJjIDAgPGJjbD4gLT4gYWRkIGZwLGZwCi0KLTArMDA3MCA8YmNsX19hZGRpPjoKLSAgNzA6CTc4IGU0IGNkIDRkIAliY2wgMCA8YmNsPiBcfFx8IGFkZGkgZnAsIzc3Ci0gIDc0Ogk3OCBlMyBjZCA0ZCAJYmNsIDAgPGJjbD4gXHxcfCBhZGRpIGZwLCM3NwotCi0wKzAwNzggPGJsX19hZGR2PjoKLSAgNzg6CTdlIGUyIDhkIDhkIAlibCAwIDxiY2w+IFx8XHwgYWRkdiBmcCxmcAotICA3YzoJN2UgZTEgOGQgOGQgCWJsIDAgPGJjbD4gXHxcfCBhZGR2IGZwLGZwCi0KLTArMDA4MCA8Ym5jX19hZGR4PjoKLSAgODA6CTdkIGUwIDhkIDlkIAlibmMgMCA8YmNsPiBcfFx8IGFkZHggZnAsZnAKLSAgODQ6CTdkIGRmIDBkIDlkIAlibmMgMCA8YmNsPiAtPiBhZGR4IGZwLGZwCi0KLTArMDA4OCA8Ym5jbF9fYW5kPjoKLSAgODg6CTc5IGRlIDhkIGNkIAlibmNsIDAgPGJjbD4gXHxcfCBhbmQgZnAsZnAKLSAgOGM6CTBkIGNkIDc5IGRkIAlhbmQgZnAsZnAgLT4gYm5jbCAwIDxiY2w+Ci0KLTArMDA5MCA8YnJhX19jbXA+OgotICA5MDoJN2YgZGMgOGQgNGQgCWJyYSAwIDxiY2w+IFx8XHwgY21wIGZwLGZwCi0gIDk0Ogk3ZiBkYiA4ZCA0ZCAJYnJhIDAgPGJjbD4gXHxcfCBjbXAgZnAsZnAKLQotMCswMDk4IDxqbF9fY21wZXE+OgotICA5ODoJMWUgY2QgOGQgNmQgCWpsIGZwIFx8XHwgY21wZXEgZnAsZnAKLSAgOWM6CTFlIGNkIDhkIDZkIAlqbCBmcCBcfFx8IGNtcGVxIGZwLGZwCi0KLTArMDBhMCA8am1wX19jbXB1PjoKLSAgYTA6CTFmIGNkIDhkIDVkIAlqbXAgZnAgXHxcfCBjbXB1IGZwLGZwCi0gIGE0OgkxZiBjZCA4ZCA1ZCAJam1wIGZwIFx8XHwgY21wdSBmcCxmcAotCi0wKzAwYTggPGxkX19jbXB6PjoKLSAgYTg6CTJkIGNkIDgwIDcxIAlsZCBmcCxAZnAgXHxcfCBjbXB6IHIxCi0gIGFjOgkyZCBjZCA4MCA3MSAJbGQgZnAsQGZwIFx8XHwgY21weiByMQotCi0wKzAwYjAgPGxkX19sZGk+OgotICBiMDoJMmQgZTEgZTIgNGQgCWxkIGZwLEByMVwrIFx8XHwgbGRpIHIyLCM3NwotICBiNDoJMmQgZTEgZTIgNGQgCWxkIGZwLEByMVwrIFx8XHwgbGRpIHIyLCM3NwotCi0wKzAwYjggPGxkYl9fbXY+OgotICBiODoJMmQgOGQgOTIgOGQgCWxkYiBmcCxAZnAgXHxcfCBtdiByMixmcAotICBiYzoJMmQgOGQgMTIgOGQgCWxkYiBmcCxAZnAgLT4gbXYgcjIsZnAKLQotMCswMGMwIDxsZGhfX25lZz46Ci0gIGMwOgkyZCBhZCA4MiAzZCAJbGRoIGZwLEBmcCBcfFx8IG5lZyByMixmcAotICBjNDoJMmQgYWQgMDIgM2QgCWxkaCBmcCxAZnAgLT4gbmVnIHIyLGZwCi0KLTArMDBjOCA8bGR1Yl9fbm9wPjoKLSAgYzg6CTJkIDlkIGYwIDAwIAlsZHViIGZwLEBmcCBcfFx8IG5vcAotICBjYzoJMmQgOWQgZjAgMDAgCWxkdWIgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBkMCA8bGR1aF9fbm90PjoKLSAgZDA6CTJkIGJkIDgyIGJkIAlsZHVoIGZwLEBmcCBcfFx8IG5vdCByMixmcAotICBkNDoJMmQgYmQgMDIgYmQgCWxkdWggZnAsQGZwIC0+IG5vdCByMixmcAotCi0wKzAwZDggPGxvY2tfX29yPjoKLSAgZDg6CTJkIGRkIDgyIGVkIAlsb2NrIGZwLEBmcCBcfFx8IG9yIHIyLGZwCi0gIGRjOgkyZCBkZCAwMiBlZCAJbG9jayBmcCxAZnAgLT4gb3IgcjIsZnAKLQotMCswMGUwIDxtdmZjX19zdWI+OgotICBlMDoJMWQgOTEgODIgMmQgCW12ZmMgZnAsY2JyIFx8XHwgc3ViIHIyLGZwCi0gIGU0OgkxZCA5MSAwMiAyZCAJbXZmYyBmcCxjYnIgLT4gc3ViIHIyLGZwCi0KLTArMDBlOCA8bXZ0Y19fc3Vidj46Ci0gIGU4OgkxMiBhZCA4MiAwZCAJbXZ0YyBmcCxzcGkgXHxcfCBzdWJ2IHIyLGZwCi0gIGVjOgkxMiBhZCA4MiAwZCAJbXZ0YyBmcCxzcGkgXHxcfCBzdWJ2IHIyLGZwCi0KLTArMDBmMCA8cnRlX19zdWJ4PjoKLSAgZjA6CTEwIGQ2IDgyIDJkIAlydGUgXHxcfCBzdWIgcjIsZnAKLSAgZjQ6CTEwIGQ2IDAyIDFkIAlydGUgLT4gc3VieCByMixmcAotCi0wKzAwZjggPHNsbF9feG9yPjoKLSAgZjg6CTFkIDQxIDgyIGRkIAlzbGwgZnAscjEgXHxcfCB4b3IgcjIsZnAKLSAgZmM6CTFkIDQxIDAyIGRkIAlzbGwgZnAscjEgLT4geG9yIHIyLGZwCi0KLTArMDEwMCA8c2xsaV9fbWFjaGk+OgotIDEwMDoJNWQgNTYgYjIgNGQgCXNsbGkgZnAsIzB4MTYgXHxcfCBtYWNoaSByMixmcAotIDEwNDoJNWQgNTYgMzIgNGQgCXNsbGkgZnAsIzB4MTYgLT4gbWFjaGkgcjIsZnAKLQotMCswMTA4IDxzcmFfX21hY2xoMT46Ci0gMTA4OgkxZCAyZCBkMiBjZCAJc3JhIGZwLGZwIFx8XHwgbWFjbGgxIHIyLGZwCi0gMTBjOgkxZCAyZCA1MiBjZCAJc3JhIGZwLGZwIC0+IG1hY2xoMSByMixmcAotCi0wKzAxMTAgPHNyYWlfX21hY2xvPjoKLSAxMTA6CTVkIDM2IGIyIDVkIAlzcmFpIGZwLCMweDE2IFx8XHwgbWFjbG8gcjIsZnAKLSAxMTQ6CTVkIDM2IDMyIDVkIAlzcmFpIGZwLCMweDE2IC0+IG1hY2xvIHIyLGZwCi0KLTArMDExOCA8c3JsX19tYWN3aGk+OgotIDExODoJMWQgMGQgYjIgNmQgCXNybCBmcCxmcCBcfFx8IG1hY3doaSByMixmcAotIDExYzoJMWQgMGQgMzIgNmQgCXNybCBmcCxmcCAtPiBtYWN3aGkgcjIsZnAKLQotMCswMTIwIDxzcmxpX19tYWN3bG8+OgotIDEyMDoJNWQgMTYgYjIgN2QgCXNybGkgZnAsIzB4MTYgXHxcfCBtYWN3bG8gcjIsZnAKLSAxMjQ6CTVkIDE2IDMyIDdkIAlzcmxpIGZwLCMweDE2IC0+IG1hY3dsbyByMixmcAotCi0wKzAxMjggPHN0X19tYWN3dTE+OgotIDEyODoJMmQgNGQgZDIgYmQgCXN0IGZwLEBmcCBcfFx8IG1hY3d1MSByMixmcAotIDEyYzoJMmQgNGQgZDIgYmQgCXN0IGZwLEBmcCBcfFx8IG1hY3d1MSByMixmcAotCi0wKzAxMzAgPHN0X19tc2Jsbz46Ci0gMTMwOgkyZCA2ZCBkMiBkZCAJc3QgZnAsQFwrZnAgXHxcfCBtc2JsbyByMixmcAotIDEzNDoJMmQgNmQgNTIgZGQgCXN0IGZwLEBcK2ZwIC0+IG1zYmxvIHIyLGZwCi0KLTArMDEzOCA8c3RfX211bD46Ci0gMTM4OgkyZCA3ZCA5MiA2ZCAJc3QgZnAsQC1mcCBcfFx8IG11bCByMixmcAotIDEzYzoJMmQgN2QgMTIgNmQgCXN0IGZwLEAtZnAgLT4gbXVsIHIyLGZwCi0KLTArMDE0MCA8c3RiX19tdWxoaT46Ci0gMTQwOgkyZCAwZCBiMiAwZCAJc3RiIGZwLEBmcCBcfFx8IG11bGhpIHIyLGZwCi0gMTQ0OgkyZCAwZCBiMiAwZCAJc3RiIGZwLEBmcCBcfFx8IG11bGhpIHIyLGZwCi0KLTArMDE0OCA8c3RoX19tdWxsbz46Ci0gMTQ4OgkyZCAyZCBiMiAxZCAJc3RoIGZwLEBmcCBcfFx8IG11bGxvIHIyLGZwCi0gMTRjOgkyZCAyZCBiMiAxZCAJc3RoIGZwLEBmcCBcfFx8IG11bGxvIHIyLGZwCi0KLTArMDE1MCA8dHJhcF9fbXVsd2hpPjoKLSAxNTA6CTEwIGYyIGIyIDJkIAl0cmFwICMweDIgXHxcfCBtdWx3aGkgcjIsZnAKLSAxNTQ6CTEwIGYyIGYwIDAwIAl0cmFwICMweDIgXHxcfCBub3AKLSAxNTg6CTMyIDJkIGYwIDAwIAltdWx3aGkgcjIsZnAgXHxcfCBub3AKLQotMCswMTVjIDx1bmxvY2tfX211bHdsbz46Ci0gMTVjOgkyZCA1ZCBiMiAzZCAJdW5sb2NrIGZwLEBmcCBcfFx8IG11bHdsbyByMixmcAotIDE2MDoJMmQgNWQgYjIgM2QgCXVubG9jayBmcCxAZnAgXHxcfCBtdWx3bG8gcjIsZnAKLQotMCswMTY0IDxhZGRfX211bHd1MT46Ci0gMTY0OgkwZCBhZCBkMiBhZCAJYWRkIGZwLGZwIFx8XHwgbXVsd3UxIHIyLGZwCi0gMTY4OgkwZCBhZCA1MiBhZCAJYWRkIGZwLGZwIC0+IG11bHd1MSByMixmcAotCi0wKzAxNmMgPGFkZGlfX212ZmFjaGk+OgotIDE2YzoJNGQgNGQgZDIgZjAgCWFkZGkgZnAsIzc3IFx8XHwgbXZmYWNoaSByMgotIDE3MDoJNGQgNGQgZDIgZjAgCWFkZGkgZnAsIzc3IFx8XHwgbXZmYWNoaSByMgotCi0wKzAxNzQgPGFkZHZfX212ZmFjbG8+OgotIDE3NDoJMGQgOGQgZDIgZjUgCWFkZHYgZnAsZnAgXHxcfCBtdmZhY2xvIHIyLGExCi0gMTc4OgkwZCA4ZCBkMiBmNSAJYWRkdiBmcCxmcCBcfFx8IG12ZmFjbG8gcjIsYTEKLQotMCswMTdjIDxhZGR4X19tdmZhY21pPjoKLSAxN2M6CTBkIDlkIGQyIGYyIAlhZGR4IGZwLGZwIFx8XHwgbXZmYWNtaSByMgotIDE4MDoJMGQgOWQgZDIgZjIgCWFkZHggZnAsZnAgXHxcfCBtdmZhY21pIHIyCi0KLTArMDE4NCA8YW5kX19tdnRhY2hpPjoKLSAxODQ6CTBkIGNkIGQyIDcwIAlhbmQgZnAsZnAgXHxcfCBtdnRhY2hpIHIyCi0gMTg4OgkwZCBjZCBkMiA3MCAJYW5kIGZwLGZwIFx8XHwgbXZ0YWNoaSByMgotCi0wKzAxOGMgPGNtcF9fbXZ0YWNsbz46Ci0gMThjOgkwZCA0ZCBkMiA3MSAJY21wIGZwLGZwIFx8XHwgbXZ0YWNsbyByMgotIDE5MDoJMGQgNGQgZDIgNzEgCWNtcCBmcCxmcCBcfFx8IG12dGFjbG8gcjIKLQotMCswMTk0IDxjbXBlcV9fcmFjPjoKLSAxOTQ6CTBkIDZkIGQ0IDkwIAljbXBlcSBmcCxmcCBcfFx8IHJhYyBhMQotIDE5ODoJMGQgNmQgZDQgOTAgCWNtcGVxIGZwLGZwIFx8XHwgcmFjIGExCi0KLTArMDE5YyA8Y21wdV9fcmFjaD46Ci0gMTljOgkwZCA1ZCBkMCA4NCAJY21wdSBmcCxmcCBcfFx8IHJhY2ggYTAsYTEKLSAxYTA6CTBkIDVkIGQ0IDg0IAljbXB1IGZwLGZwIFx8XHwgcmFjaCBhMSxhMQotCi0wKzAxYTQgPGNtcHpfX3NhZGQ+OgotIDFhNDoJMDAgN2QgZDAgZTQgCWNtcHogZnAgXHxcfCBzYWRkCi0gMWE4OgkwMCA3ZCBkMCBlNCAJY21weiBmcCBcfFx8IHNhZGQKLQotMCswMWFjIDxzYz46Ci0gMWFjOgk3NCAwMSBkMCBlNCAJc2MgXHxcfCBzYWRkCi0KLTArMDFiMCA8c25jPjoKLSAxYjA6CTc1IDAxIGQwIGU0IAlzbmMgXHxcfCBzYWRkCi0KLTArMDFiNCA8amM+OgotIDFiNDoJMWMgY2QgZjAgMDAgCWpjIGZwIFx8XHwgbm9wCi0KLTArMDFiOCA8am5jPjoKLSAxYjg6CTFkIGNkIGYwIDAwIAlqbmMgZnAgXHxcfCBub3AKLQotMCswMWJjIDxwY21wYno+OgotIDFiYzoJMDMgN2QgZjAgMDAgCXBjbXBieiBmcCBcfFx8IG5vcAotCi0wKzAxYzAgPHNhdD46Ci0gMWMwOgk4ZCA2ZCAwMCAwMCAJc2F0IGZwLGZwCi0KLTArMDFjNCA8c2F0aD46Ci0gMWM0Ogk4ZCA2ZCAwMiAwMCAJc2F0aCBmcCxmcAotCi0wKzAxYzggPGpjX19wY21wYno+OgotIDFjODoJMWMgY2QgODMgN2QgCWpjIGZwIFx8XHwgcGNtcGJ6IGZwCi0gMWNjOgkxYyBjZCAwMyA3ZCAJamMgZnAgLT4gcGNtcGJ6IGZwCi0KLTArMDFkMCA8am5jX19sZGk+OgotIDFkMDoJMWQgY2QgZWQgNGQgCWpuYyBmcCBcfFx8IGxkaSBmcCwjNzcKLSAxZDQ6CTFkIGNkIDZkIDRkIAlqbmMgZnAgLT4gbGRpIGZwLCM3NwotCi0wKzAxZDggPHNjX19tdj46Ci0gMWQ4Ogk3NCAwMSA5ZCA4MiAJc2MgXHxcfCBtdiBmcCxyMgotIDFkYzoJNzQgMDEgOWQgODIgCXNjIFx8XHwgbXYgZnAscjIKLQotMCswMWUwIDxzbmNfX25lZz46Ci0gMWUwOgk3NSAwMSA4ZCAzMiAJc25jIFx8XHwgbmVnIGZwLHIyCi0gMWU0Ogk3NSAwMSA4ZCAzMiAJc25jIFx8XHwgbmVnIGZwLHIyCi0KLTArMDFlOCA8bm9wX19zYWRkPjoKLSAxZTg6CTcwIDAwIGQwIGU0IAlub3AgXHxcfCBzYWRkCi0KLTArMDFlYyA8c2FkZF9fbm9wPjoKLSAxZWM6CTcwIDAwIGQwIGU0IAlub3AgXHxcfCBzYWRkCi0KLTArMDFmMCA8c2FkZF9fbm9wX3JldmVyc2U+OgotIDFmMDoJNzAgMDAgZDAgZTQgCW5vcCBcfFx8IHNhZGQKLQotMCswMWY0IDxhZGRfX25vdD46Ci0gMWY0OgkwMCBhMSA4MyBiNSAJYWRkIHIwLHIxIFx8XHwgbm90IHIzLHI1Ci0KLTArMDFmOCA8YWRkX19ub3RfZGVzdF9jbGFzaD46Ci0gMWY4OgkwMyBhNCAwMyBiNSAJYWRkIHIzLHI0IC0+IG5vdCByMyxyNQotCi0wKzAxZmMgPGFkZF9fbm90X19zcmNfY2xhc2g+OgotIDFmYzoJMDMgYTQgMDUgYjMgCWFkZCByMyxyNCAtPiBub3QgcjUscjMKLQotMCswMjAwIDxhZGRfX25vdF9fbm9fY2xhc2g+OgotIDIwMDoJMDMgYTQgODQgYjUgCWFkZCByMyxyNCBcfFx8IG5vdCByNCxyNQotCi0wKzAyMDQgPG11bF9fc3JhPjoKLSAyMDQ6CTEzIDI0IDkxIDYyIAlzcmEgcjMscjQgXHxcfCBtdWwgcjEscjIKLQotMCswMjA4IDxtdWxfX3NyYV9fcmV2ZXJzZV9zcmNfY2xhc2g+OgotIDIwODoJMTMgMjQgOTEgNjMgCXNyYSByMyxyNCBcfFx8IG11bCByMSxyMwotCi0wKzAyMGMgPGJjX19hZGRfPjoKLSAyMGM6CTdjIDA0IDAxIGEyIAliYyAyMWMgPGxhYmVsPiAtPiBhZGQgcjEscjIKLQotMCswMjEwIDxhZGRfX2JjPjoKLSAyMTA6CTdjIDAzIDgzIGE0IAliYyAyMWMgPGxhYmVsPiBcfFx8IGFkZCByMyxyNAotCi0wKzAyMTQgPGJjX19hZGRfX2ZvcmNlZF9wYXJhbGxlbD46Ci0gMjE0Ogk3YyAwMiA4NSBhNiAJYmMgMjFjIDxsYWJlbD4gXHxcfCBhZGQgcjUscjYKLQotMCswMjE4IDxhZGRfX2JjX19mb3JjZWRfcGFyYWxsZWw+OgotIDIxODoJN2MgMDEgODcgYTggCWJjIDIxYyA8bGFiZWw+IFx8XHwgYWRkIHI3LHI4Ci0KLTArMDIxYyA8bGFiZWw+OgotIDIxYzoJNzAgMDAgZjAgMDAgCW5vcCBcfFx8IG5vcAotCi0wKzAyMjAgPG11bHdoaT46Ci0gMjIwOgkzZCAyZCAzZCBhZCAJbXVsd2hpIGZwLGZwIC0+IG11bHdoaSBmcCxmcCxhMQotCi0wKzAyMjQgPG11bHdsbz46Ci0gMjI0OgkzZCAzZCAzZCBiZCAJbXVsd2xvIGZwLGZwIC0+IG11bHdsbyBmcCxmcCxhMQotCi0wKzAyMjggPG1hY3doaT46Ci0gMjI4OgkzZCA2ZCAzZCBlZCAJbWFjd2hpIGZwLGZwIC0+IG1hY3doaSBmcCxmcCxhMQotCi0wKzAyMmMgPG1hY3dsbz46Ci0gMjJjOgkzZCA3ZCAzZCBmZCAJbWFjd2xvIGZwLGZwIC0+IG1hY3dsbyBmcCxmcCxhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyeC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnJ4LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRkMzNkZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnJ4LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBNMzJSeCBhc3NlbWJsZXIgdGVzdHN1aXRlLgotCi1pZiBbaXN0YXJnZXQgbTMyciotKi0qXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCAibTMycngiCi0gICAgcnVuX2R1bXBfdGVzdCAiZnNsb3R4IgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlbGF4LTIiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnJ4LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnJ4LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NmRhYjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyeC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTkwICswLDAgQEAKLSMgVGVzdCBuZXcgaW5zdHJ1Y3Rpb25zCi1icmFuY2hwb2ludDoKLQkKLQkudGV4dAotCS5nbG9iYWwgYmNsCi1iY2w6Ci0JYmNsIGJyYW5jaHBvaW50Ci0KLQkudGV4dAotCS5nbG9iYWwgYm5jbAotYm5jbDoKLQlibmNsIGJyYW5jaHBvaW50Ci0KLQkudGV4dAotCS5nbG9iYWwgY21wegotY21wejoKLQljbXB6IGZwCi0KLQkudGV4dAotCS5nbG9iYWwgY21wZXEKLWNtcGVxOgotCWNtcGVxIGZwLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIG1hY2xoMQotbWFjbGgxOgotCW1hY2xoMSBmcCwgZnAKLQkKLQkudGV4dAotCS5nbG9iYWwgbWFjc2wwCi1tc2JsbzoKLQltc2JsbyBmcCwgZnAKLQkKLQkudGV4dAotCS5nbG9iYWwgbXVsd3UxCi1tdWx3dTE6Ci0JbXVsd3UxIGZwLCBmcAotCQotCS50ZXh0Ci0JLmdsb2JhbCBtYWN3dTEKLW1hY3d1MToKLQltYWN3dTEgZnAsIGZwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIHNhZGQKLXNhZGQ6Ci0Jc2FkZAotCQotCS50ZXh0Ci0JLmdsb2JhbCBzYXRiCi1zYXRiOgotCXNhdGIgZnAsIGZwCi0KLQkKLQkudGV4dAotCS5nbG9iYWwgbXVsaGkKLW11bGhpOgotCW11bGhpIGZwLCBmcCwgYTEKLQkKLQkudGV4dAotCS5nbG9iYWwgbXVsbG8KLW11bGxvOgotCW11bGxvIGZwLCBmcCwgYTAKLQkKLQkudGV4dAotCS5nbG9iYWwgZGl2aAotZGl2aDoKLQlkaXZoIGZwLCBmcAotCQotCS50ZXh0Ci0JLmdsb2JhbCBtYWNoaQotbWFjaGk6Ci0JbWFjaGkgZnAsIGZwLCBhMQotCQotCS50ZXh0Ci0JLmdsb2JhbCBtYWNsbwotbWFjbG86Ci0JbWFjbG8gZnAsIGZwLCBhMAotCQotCS50ZXh0Ci0JLmdsb2JhbCBtdmZhY2hpCi1tdmZhY2hpOgotCW12ZmFjaGkgZnAsIGExCi0JCi0JLnRleHQKLQkuZ2xvYmFsIG12ZmFjbWkKLW12ZmFjbWk6Ci0JbXZmYWNtaSBmcCwgYTEKLQkKLQkudGV4dAotCS5nbG9iYWwgbXZmYWNsbwotbXZmYWNsbzoKLQltdmZhY2xvIGZwLCBhMQotCQotCS50ZXh0Ci0JLmdsb2JhbCBtdnRhY2hpCi1tdnRhY2hpOgotCW12dGFjaGkgZnAsIGExCi0JCi0JLnRleHQKLQkuZ2xvYmFsIG12dGFjbG8KLW12dGFjbG86Ci0JbXZ0YWNsbyBmcCwgYTAKLQkKLQkudGV4dAotCS5nbG9iYWwgcmFjCi1yYWM6Ci0JcmFjIGExCi0JCi0JLnRleHQKLQkuZ2xvYmFsIHJhY19kcwotcmFjX2RzOgotCXJhYyBhMSwgYTAKLQkKLQkudGV4dAotCS5nbG9iYWwgcmFjX2RzaQotcmFjX2RzaToKLQlyYWMgYTAsIGExLCAjMQotCQotCS50ZXh0Ci0JLmdsb2JhbCByYWNoCi1yYWNoOgotCXJhY2ggYTEKLQkKLQkudGV4dAotCS5nbG9iYWwgcmFjaF9kcwotcmFjaF9kczoKLQlyYWNoIGEwLCBhMQotCQotCS50ZXh0Ci0JLmdsb2JhbCByYWNoX2RzaQotcmFjaF9kc2k6Ci0JcmFjaCBhMSwgYTAsICMyCi0JCi0jIFRlc3QgZXhwbGljaXRseSBwYXJhbGxlbCBhbmQgaW1wbGljaXRseSBwYXJhbGxlbCBpbnN0cnVjdGlvbnMKLSMgSW5jbHVkaW5nIGFwcGFyZW50IGluc3RydWN0aW9uIHNlcXVlbmNlIHJlb3JkZXJpbmcuCi0JLnRleHQKLQkuZ2xvYmFsIGJjX19hZGQKLWJjX19hZGQ6Ci0JYmMgYmNsIHx8IGFkZCBmcCwgZnAKLSMgVXNlIGJjLnMgaGVyZSBhcyBiYyBpcyByZWxheGFibGUgYW5kIHRodXMgYSBub3Agd2lsbCBiZSBlbWl0dGVkLgotCWJjLnMgYmNsCi0JYWRkIGZwLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIGJjbF9fYWRkaQotYmNsX19hZGRpOgkKLQliY2wgYmNsIHx8IGFkZGkgZnAsICM3NwotCWFkZGkgZnAsICM3NwotIyBVc2UgYmNsLnMgaGVyZSBhcyBiY2wgaXMgcmVsYXhhYmxlIGFuZCB0aHVzIHRoZSBwYXJhbGxlbGl6YXRpb24gd29uJ3QgaGFwcGVuLgotCWJjbC5zIGJjbAotCi0JLnRleHQKLQkuZ2xvYmFsIGJsX19hZGR2Ci1ibF9fYWRkdjoKLQlibCBiY2wgfHwgYWRkdiBmcCwgZnAKLQlhZGR2IGZwLCBmcAotIyBVc2UgYmwucyBoZXJlIGFzIGJsIGlzIHJlbGF4YWJsZSBhbmQgdGh1cyB0aGUgcGFyYWxsZWxpemF0aW9uIHdvbid0IGhhcHBlbi4KLQlibC5zIGJjbAotCQotCS50ZXh0Ci0JLmdsb2JhbCBibmNfX2FkZHgKLWJuY19fYWRkeDoKLQlibmMgYmNsIHx8IGFkZHggZnAsIGZwCi0jIFVzZSBibmMucyBoZXJlIGFzIGJuYyBpcyByZWxheGFibGUgYW5kIHRodXMgdGhlIHBhcmFsbGVsaXphdGlvbiBhdHRlbXB0IHdvbid0Ci0jIGhhcHBlbi4gIFRoaW5ncyBzdGlsbCB3b24ndCBiZSBwYXJhbGxlbGl6ZWQsIGJ1dCB3ZSB3YW50IHRoaXMgdGVzdCB0byB0cnkuCi0JYm5jLnMgYmNsCi0JYWRkeCBmcCwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBibmNsX19hbmQKLWJuY2xfX2FuZDoKLQlibmNsIGJjbCB8fCBhbmQgZnAsIGZwCi0JYW5kIGZwLCBmcAotCWJuY2wgYmNsCi0KLQkudGV4dAotCS5nbG9iYWwgYnJhX19jbXAKLWJyYV9fY21wOgotCWJyYSBiY2wgfHwgY21wIGZwLCBmcAotCWNtcCBmcCwgZnAKLSMgVXNlIGJyYS5zIGhlcmUgYXMgYnJhIGlzIHJlbGF4YWJsZSBhbmQgdGh1cyB0aGUgcGFyYWxsZWxpemF0aW9uIHdvbid0IGhhcHBlbi4KLQlicmEucyBiY2wKLQkKLQkudGV4dAotCS5nbG9iYWwgamxfX2NtcGVxCi1qbF9fY21wZXE6Ci0JamwgZnAgfHwgY21wZXEgZnAsIGZwCi0JY21wZXEgZnAsIGZwCi0JamwgZnAKLQkKLQkudGV4dAotCS5nbG9iYWwgam1wX19jbXB1Ci1qbXBfX2NtcHU6Ci0Jam1wIGZwIHx8IGNtcHUgZnAsIGZwCi0JY21wdSBmcCwgZnAKLQlqbXAgZnAKLQkKLQkudGV4dAotCS5nbG9iYWwgbGRfX2NtcHoKLWxkX19jbXB6OgotCWxkIGZwLCBAZnAgfHwgY21weiByMQotCWNtcHogcjEKLQlsZCBmcCwgQGZwIAotCQotCS50ZXh0Ci0JLmdsb2JhbCBsZF9fbGRpCi1sZF9fbGRpOgotCWxkIGZwLCBAcjErIHx8IGxkaSByMiwgIzc3Ci0JbGQgZnAsIEByMSsgCi0JbGRpIHIyLCAjNzcKLQkKLQkudGV4dAotCS5nbG9iYWwgbGRiX19tdgotbGRiX19tdjoKLQlsZGIgZnAsIEBmcCB8fCBtdiByMiwgZnAKLQlsZGIgZnAsIEBmcCAKLQltdiByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBsZGhfX25lZwotbGRoX19uZWc6Ci0JbGRoIGZwLCBAZnAgfHwgbmVnIHIyLCBmcAotCWxkaCBmcCwgQGZwCi0JbmVnIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWJfX25vcAotbGR1Yl9fbm9wOgotCWxkdWIgZnAsIEBmcCB8fCBub3AKLQlsZHViIGZwLCBAZnAgCi0Jbm9wCi0KLQkudGV4dAotCS5nbG9iYWwgbGR1aF9fbm90Ci1sZHVoX19ub3Q6Ci0JbGR1aCBmcCwgQGZwIHx8IG5vdCByMiwgZnAKLQlsZHVoIGZwLCBAZnAKLQlub3QgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgbG9ja19fb3IKLWxvY2tfX29yOgotCWxvY2sgZnAsIEBmcCB8fCBvciByMiwgZnAKLQlsb2NrIGZwLCBAZnAKLQlvciByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBtdmZjX19zdWIKLW12ZmNfX3N1YjoKLQltdmZjIGZwLCBjcjEgfHwgc3ViIHIyLCBmcAotCW12ZmMgZnAsIGNyMQotCXN1YiByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBtdnRjX19zdWJ2Ci1tdnRjX19zdWJ2OgotCW12dGMgZnAsIGNyMiB8fCBzdWJ2IHIyLCBmcAotCW12dGMgZnAsIGNyMgotCXN1YnYgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgcnRlX19zdWJ4Ci1ydGVfX3N1Yng6Ci0JcnRlIHx8IHN1YiByMiwgZnAKLQlydGUKLQlzdWJ4IHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIHNsbF9feG9yCi1zbGxfX3hvcjoKLQlzbGwgZnAsIHIxIHx8IHhvciByMiwgZnAKLQlzbGwgZnAsIHIxCi0JeG9yIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIHNsbGlfX21hY2hpCi1zbGxpX19tYWNoaToKLQlzbGxpIGZwLCAjMjIgfHwgbWFjaGkgcjIsIGZwCi0Jc2xsaSBmcCwgIzIyCi0JbWFjaGkgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgc3JhX19tYWNsaDEKLXNyYV9fbWFjbGgxOgotCXNyYSBmcCwgZnAgfHwgbWFjbGgxIHIyLCBmcAotCXNyYSBmcCwgZnAKLQltYWNsaDEgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgc3JhaV9fbWFjbG8KLXNyYWlfX21hY2xvOgotCXNyYWkgZnAsICMyMiB8fCBtYWNsbyByMiwgZnAKLQlzcmFpIGZwLCAjMjIKLQltYWNsbyByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBzcmxfX21hY3doaQotc3JsX19tYWN3aGk6Ci0Jc3JsIGZwLCBmcCB8fCBtYWN3aGkgcjIsIGZwCi0Jc3JsIGZwLCBmcAotCW1hY3doaSByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCBzcmxpX19tYWN3bG8KLXNybGlfX21hY3dsbzoKLQlzcmxpIGZwLCAjMjIgfHwgbWFjd2xvIHIyLCBmcAotCXNybGkgZnAsICMyMgotCW1hY3dsbyByMiwgZnAKLQkKLQkudGV4dAotCS5nbG9iYWwgc3RfX21hY3d1MQotc3RfX21hY3d1MToKLQlzdCBmcCwgQGZwIHx8IG1hY3d1MSByMiwgZnAKLQlzdCBmcCwgQGZwCi0JbWFjd3UxIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIHN0X19tc2Jsbwotc3RfX21zYmxvOgotCXN0IGZwLCBAK2ZwIHx8IG1zYmxvIHIyLCBmcAotCXN0IGZwLCBAK2ZwIAotCW1zYmxvIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIHN0X19tdWwKLXN0X19tdWw6Ci0Jc3QgZnAsIEAtZnAgfHwgbXVsIHIyLCBmcAotCXN0IGZwLCBALWZwCi0JbXVsIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIHN0Yl9fbXVsaGkKLXN0Yl9fbXVsaGk6Ci0Jc3RiIGZwLCBAZnAgfHwgbXVsaGkgcjIsIGZwCi0Jc3RiIGZwLCBAZnAKLQltdWxoaSByMiwgZnAKLQkKLQkudGV4dAotCS5nbG9iYWwgc3RoX19tdWxsbwotc3RoX19tdWxsbzoKLQlzdGggZnAsIEBmcCB8fCBtdWxsbyByMiwgZnAKLQlzdGggZnAsIEBmcCAKLQltdWxsbyByMiwgZnAKLQotCS50ZXh0Ci0JLmdsb2JhbCB0cmFwX19tdWx3aGkKLXRyYXBfX211bHdoaToKLQl0cmFwICMyIHx8IG11bHdoaSByMiwgZnAKLQl0cmFwICMyCi0JbXVsd2hpIHIyLCBmcAotCi0JLnRleHQKLQkuZ2xvYmFsIHVubG9ja19fbXVsd2xvCi11bmxvY2tfX211bHdsbzoKLQl1bmxvY2sgZnAsIEBmcCB8fCBtdWx3bG8gcjIsIGZwCi0JdW5sb2NrIGZwLCBAZnAKLQltdWx3bG8gcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgYWRkX19tdWx3dTEKLWFkZF9fbXVsd3UxOgotCWFkZCBmcCwgZnAgfHwgbXVsd3UxIHIyLCBmcAotCWFkZCBmcCwgZnAKLQltdWx3dTEgcjIsIGZwCi0KLQkudGV4dAotCS5nbG9iYWwgYWRkaV9fbXZmYWNoaQotYWRkaV9fbXZmYWNoaToKLQlhZGRpIGZwLCAjNzcgfHwgbXZmYWNoaSByMiwgYTAKLQlhZGRpIGZwLCAjNzcKLQltdmZhY2hpIHIyLCBhMAotCi0JLnRleHQKLQkuZ2xvYmFsIGFkZHZfX212ZmFjbG8KLWFkZHZfX212ZmFjbG86Ci0JYWRkdiBmcCwgZnAgfHwgbXZmYWNsbyByMiwgYTEKLQlhZGR2IGZwLCBmcAotCW12ZmFjbG8gcjIsIGExCi0KLQkudGV4dAotCS5nbG9iYWwgYWRkeF9fbXZmYWNtaQotYWRkeF9fbXZmYWNtaToKLQlhZGR4IGZwLCBmcCB8fCBtdmZhY21pIHIyLCBhMAotCWFkZHggZnAsIGZwCi0JbXZmYWNtaSByMiwgYTAKLQotCS50ZXh0Ci0JLmdsb2JhbCBhbmRfX212dGFjaGkKLWFuZF9fbXZ0YWNoaToKLQlhbmQgZnAsIGZwIHx8IG12dGFjaGkgcjIsIGEwCi0JYW5kIGZwLCBmcAotCW12dGFjaGkgcjIsIGEwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIGNtcF9fbXZ0YWNsbwotY21wX19tdnRhY2xvOgotCWNtcCBmcCwgZnAgfHwgbXZ0YWNsbyByMiwgYTAKLQljbXAgZnAsIGZwCi0JbXZ0YWNsbyByMiwgYTAKLQotCS50ZXh0Ci0JLmdsb2JhbCBjbXBlcV9fcmFjCi1jbXBlcV9fcmFjOgotCWNtcGVxIGZwLCBmcCB8fCByYWMgYTEKLQljbXBlcSBmcCwgZnAKLQlyYWMgYTEKLQotCS50ZXh0Ci0JLmdsb2JhbCBjbXB1X19yYWNoCi1jbXB1X19yYWNoOgotCWNtcHUgZnAsIGZwIHx8IHJhY2ggYTAsIGExCi0JY21wdSBmcCwgZnAKLQlyYWNoIGExLCBhMSwgIzEKLQotCS50ZXh0Ci0JLmdsb2JhbCBjbXB6X19zYWRkCi1jbXB6X19zYWRkOgotCWNtcHogZnAgfHwgc2FkZAotCWNtcHogZnAKLQlzYWRkCi0KLQotCQotIyBUZXN0IHByaXZhdGUgaW5zdHJ1Y3Rpb25zCQotCS50ZXh0Ci0JLmdsb2JhbCBzYwotc2M6Ci0Jc2MKLQlzYWRkCi0JCi0JLnRleHQKLQkuZ2xvYmFsIHNuYwotc25jOgotCXNuYwotCXNhZGQgCi0JCi0JLnRleHQKLQkuZ2xvYmFsIGpjCi1qYzoKLQlqYyBmcAotCQotCS50ZXh0Ci0JLmdsb2JhbCBqbmMKLWpuYzoKLQlqbmMgZnAKLQkJCi0JLnRleHQKLQkuZ2xvYmFsIHBjbXBiegotcGNtcGJ6OgotCXBjbXBieiBmcAotCQotCS50ZXh0Ci0JLmdsb2JhbCBzYXQKLXNhdDoKLQlzYXQgZnAsIGZwCi0JCi0JLnRleHQKLQkuZ2xvYmFsIHNhdGgKLXNhdGg6Ci0Jc2F0aCBmcCwgZnAgCi0KLQotIyBUZXN0IHBhcmFsbGVsIHZlcnNpb25zIG9mIHRoZSBwcml2YXRlIGluc3RydWN0aW9ucwotCQotCS50ZXh0Ci0JLmdsb2JhbCBqY19fcGNtcGJ6Ci1qY19fcGNtcGJ6OgotCWpjIGZwIHx8IHBjbXBieiBmcAotCWpjIGZwIAotCXBjbXBieiBmcAotCQotCS50ZXh0Ci0JLmdsb2JhbCBqbmNfX2xkaQotam5jX19sZGk6Ci0Jam5jIGZwIHx8IGxkaSBmcCwgIzc3Ci0Jam5jIGZwCi0JbGRpIGZwLCAjNzcKLQkKLQkudGV4dAotCS5nbG9iYWwgc2NfX212Ci1zY19fbXY6Ci0Jc2MgfHwgbXYgZnAsIHIyCi0Jc2MgCi0JbXYgZnAsIHIyCi0KLQkudGV4dAotCS5nbG9iYWwgc25jX19uZWcKLXNuY19fbmVnOgotCXNuYyB8fCBuZWcgZnAsIHIyCi0Jc25jIAotCW5lZyBmcCwgcjIKLQkKLSMgVGVzdCBhdXRvbWF0aWMgYW5kIGV4cGxpY2l0IHBhcmFsbGVsaXNhdGlvbiBvZiBpbnN0cnVjdGlvbnMKLQkudGV4dAotCS5nbG9iYWwgbm9wX19zYWRkCi1ub3BfX3NhZGQ6Ci0Jbm9wCi0Jc2FkZAotCi0JLnRleHQKLQkuZ2xvYmFsIHNhZGRfX25vcAotc2FkZF9fbm9wOgotCXNhZGQKLQlub3AKLQotCS50ZXh0Ci0JLmdsb2JhbCBzYWRkX19ub3BfcmV2ZXJzZQotc2FkZF9fbm9wX3JldmVyc2U6Ci0Jc2FkZCB8fCBub3AKLQotCS50ZXh0Ci0JLmdsb2JhbCBhZGRfX25vdAotYWRkX19ub3Q6Ci0JYWRkICByMCwgcjEKLQlub3QgIHIzLCByNQotCi0JLnRleHQKLQkuZ2xvYmFsIGFkZF9fbm90X19kZXN0X2NsYXNoCi1hZGRfX25vdF9kZXN0X2NsYXNoOgotCWFkZCAgcjMsIHI0Ci0Jbm90ICByMywgcjUKLQotCS50ZXh0Ci0JLmdsb2JhbCBhZGRfX25vdF9fc3JjX2NsYXNoCi1hZGRfX25vdF9fc3JjX2NsYXNoOgotCWFkZCAgcjMsIHI0Ci0Jbm90ICByNSwgcjMKLQotCS50ZXh0Ci0JLmdsb2JhbCBhZGRfX25vdF9fbm9fY2xhc2gKLWFkZF9fbm90X19ub19jbGFzaDoKLQlhZGQgIHIzLCByNAotCW5vdCAgcjQsIHI1Ci0KLQkudGV4dAotCS5nbG9iYWwgbXVsX19zcmEKLW11bF9fc3JhOgotCW11bCAgcjEsIHIyCi0Jc3JhICByMywgcjQKLQkKLQkudGV4dAotCS5nbG9iYWwgbXVsX19zcmFfX3JldmVyc2Vfc3JjX2NsYXNoCi1tdWxfX3NyYV9fcmV2ZXJzZV9zcmNfY2xhc2g6Ci0JbXVsICByMSwgcjMKLQlzcmEgIHIzLCByNAotCQotCS50ZXh0Ci0JLmdsb2JhbCBiY19fYWRkXwotYmNfX2FkZF86Ci0JYmMucyBsYWJlbAotCWFkZCByMSwgcjIKLQotCS50ZXh0Ci0JLmdsb2JhbCBhZGRfX2JjCi1hZGRfX2JjOgotCWFkZCByMywgcjQKLQliYy5zICBsYWJlbAotCi0JLnRleHQKLQkuZ2xvYmFsIGJjX19hZGRfX2ZvcmNlZF9wYXJhbGxlbAotYmNfX2FkZF9fZm9yY2VkX3BhcmFsbGVsOgotCWJjIGxhYmVsIHx8IGFkZCByNSwgcjYKLQotCS50ZXh0Ci0JLmdsb2JhbCBhZGRfX2JjX19mb3JjZWRfcGFyYWxsZWwKLWFkZF9fYmNfX2ZvcmNlZF9wYXJhbGxlbDoKLQlhZGQgcjcsIHI4IHx8IGJjIGxhYmVsCi1sYWJlbDoKLQlub3AKLQotOyBBZGRpdGlvbmFsIHRlc3RjYXNlcy4KLTsgVGhlc2UgaW5zbnMgd2VyZSBhZGRlZCB0byB0aGUgY2hpcCBsYXRlci4KLQotCS50ZXh0Ci1tdWx3aGk6Ci0JbXVsd2hpIGZwLCBmcCwgYTAKLQltdWx3aGkgZnAsIGZwLCBhMQotCQotbXVsd2xvOgotCW11bHdsbyBmcCwgZnAsIGEwCi0JbXVsd2xvIGZwLCBmcCwgYTEKLQotbWFjd2hpOgotCW1hY3doaSBmcCwgZnAsIGEwCi0JbWFjd2hpIGZwLCBmcCwgYTEKLQotbWFjd2xvOgotCW1hY3dsbyBmcCwgZnAsIGEwCi0JbWFjd2xvIGZwLCBmcCwgYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvb3V0b2ZyYW5nZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9vdXRvZnJhbmdlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MGQzMTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9vdXRvZnJhbmdlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotOyBUZXN0IGVycm9yIG1lc3NhZ2VzIHdoZXJlIGJyYW5jaGVzIGFyZSBvdXQgb2YgcmFuZ2UuCi0KLTsgeyBkZy1kbyBhc3NlbWJsZSB7IHRhcmdldCBtMzJyLSotKiB9IH0KLQotCS50ZXh0Ci0JLmdsb2JhbCBmb28KLWZvbzoKLQlibC5zIGxhYmVsCi0JCTsgeyBkZy1lcnJvciAib3V0IG9mIHJhbmdlIiAib3V0IG9mIHJhbmdlIGJsLnMiIHsgdGFyZ2V0ICotKi0qIH0geyA4IH0gfQotCWJuYy5zIGxhYmVsCi0JCTsgeyBkZy1lcnJvciAib3V0IG9mIHJhbmdlIiAib3V0IG9mIHJhbmdlIGJuYy5zIiB7IHRhcmdldCAqLSotKiB9IHsgMTAgfSB9Ci0JYnJhLnMgbGFiZWwKLQkJOyB7IGRnLWVycm9yICJvdXQgb2YgcmFuZ2UiICJvdXQgb2YgcmFuZ2UgYnJhLnMiIHsgdGFyZ2V0ICotKi0qIH0geyAxMiB9IH0KLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi1sYWJlbDoKLQlqbXAgcjE0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTRmY2I4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI2FzOgotI29iamR1bXA6IC1kcgotI25hbWU6IHJlbGF4LTEKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKiA8RG9lc05vdFdvcms+OgotICowOgk3MCAwMCA3MCAwMCAqCW5vcCAtPiBub3AKLQotMCo0IDxXb3JrPjoKLSAqNDoJNzAgMDAgNzAgMDAgKglub3AgLT4gbm9wCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC5icmFuY2g6Ci0KLTAqIDxicmFuY2g+OgotICowOglmZiAwMCAwMCAwMSAJYnJhIDQgPFdvcms+Ci1bIAldKjA6IFJfTTMyUl8yNl9QQ1JFTAkudGV4dApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlMTJjMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTEucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTsgVGVzdCByZWxheGF0aW9uIGludG8gbm9uLXplcm8gb2Zmc2V0IHRvIGRpZmZlcmVudCBzZWdtZW50LgotCi0JLnNlY3Rpb24gLmJyYW5jaCwgImF4IixAcHJvZ2JpdHMKLQkuYmFsaWduIDQKLWJyYW5jaDoKLSAgICAgICAgYnJhIFdvcmsKLQotCi0JLnNlY3Rpb24gLnRleHQKLSAgICAgICAgLmJhbGlnbiA0Ci1Eb2VzTm90V29yazoKLQlub3AKLQlub3AKLQotV29yazoKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0yLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmODNlOGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0yLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jYXM6IC0tbTMycngKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiByZWxheC0yCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswIDxsYWJlbDE+OgotICAgMDoJZmQgMDAgMDAgODMgCWJuYyAyMGMgPGxhYmVsMz4KLSAgIDQ6CTcwIDAwIGYwIDAwIAlub3AgXHxcfCBub3AKLSAgIDg6CTQzIDAzIGMyIDAyIAlhZGRpIHIzLFsjXTMgXHxcfCBhZGRpIHIyLFsjXTIKLQotMCswYyA8bGFiZWwyPjoKLQkuLi4KLQotMCswMjBjIDxsYWJlbDM+OgotIDIwYzoJNzAgMDAgZjAgMDAgCW5vcCBcfFx8IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc5ZGVjNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTIucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTsgVGVzdCB3aGV0aGVyIHBhcmFsbGVsIGluc25zIGdldCBpbmFwcHJvcHJpYXRlbHkgbW92ZWQgZHVyaW5nIHJlbGF4YXRpb24uCi0KLSAgICAgICAgLnRleHQKLWxhYmVsMToKLSAgICAgICAgYm5jICAgICBsYWJlbDMKLSAgICAgICAgbm9wCi0gICAgICAgIGFkZGkgICAgcjMsICMzIHx8IGFkZGkgIHIyLCAjMgotbGFiZWwyOgotICAgICAgICAuc3BhY2UgNTEyCi1sYWJlbDM6Ci0gICAgICAgIG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci91cHBlcmNhc2UuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYjEzNDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci91cHBlcmNhc2UuZAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiB1cHBlcmNhc2UKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAgPGZvbz46Ci0gICAwOgkxMCA4MSAxMCA5MSAqCW12IHIwLHIxIC0+IG12ZmMgcjAsY2JyCi0KLTArMDAwNCA8aGlnaD46Ci0gICA0OglkMCBjMCAwMCAwMCAJc2V0aCByMCwjMHgwCi1bIAldKjQ6IFJfTTMyUl9ISTE2X1VMTwlbLl10ZXh0Ci0KLTArMDAwOCA8c2hpZ2g+OgotICAgODoJZDAgYzAgMDAgMDAgCXNldGggcjAsIzB4MAotWyAJXSo4OiBSX00zMlJfSEkxNl9TTE8JWy5ddGV4dAotCi0wKzAwMGMgPGxvdz46Ci0gICBjOgk4MCBlMCAwMCAwYyAJb3IzIHIwLHIwLCMweGMKLVsgCV0qYzogUl9NMzJSX0xPMTYJWy5ddGV4dAotCi0wKzAwMTAgPHNkYT46Ci0gIDEwOgk4MCBhMCAwMCAwMCAJYWRkMyByMCxyMCwjMAotWyAJXSoxMDogUl9NMzJSX1NEQTE2CXNkYXZhcgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci91cHBlcmNhc2UucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYWVhZmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci91cHBlcmNhc2UucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQkudGV4dAotCS5nbG9iYWwgZm9vCi1mb286Ci0JbXYgUjAsUjEKLQltdmZjIFIwLENCUgotCi1oaWdoOgotCXNldGggcjAsI0hJR0goaGlnaCkKLXNoaWdoOgotCXNldGggcjAsI1NISUdIKHNoaWdoKQotbG93OgotCW9yMyByMCxyMCwjTE9XKGxvdykKLXNkYToKLQlhZGQzIHIwLHIwLCNTREEoc2RhdmFyKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci93cm9uZ3NpemUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvd3JvbmdzaXplLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4OGY0NzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci93cm9uZ3NpemUucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTsgVGVzdCBlcnJvciBtZXNzYWdlcyBpbiBpbnN0YW5jZXMgd2hlcmUgYW4gaW5zbiBvZiBhIHBhcnRpY3VsYXIgc2l6ZQotOyBpcyByZXF1aXJlZC4KLQotOyB7IGRnLWRvIGFzc2VtYmxlIHsgdGFyZ2V0IG0zMnItKi0qIH0gfQotCi13cm9uZ3NpemU6Ci0JY21waSByOCwjMTAgLT4gbGRpIHIwLCM4ICA7IHsgZGctZXJyb3IgIm5vdCBhIDE2IGJpdCBpbnN0cnVjdGlvbiIgfQotCWxkaSByMCwjOCAtPiBjbXBpIHI4LCMxMCAgOyB7IGRnLWVycm9yICJub3QgYSAxNiBiaXQgaW5zdHJ1Y3Rpb24iIH0KLQljbXBpIHI4LCMxMCB8fCBsZGkgcjAsIzggIDsgeyBkZy1lcnJvciAibm90IGEgMTYgYml0IGluc3RydWN0aW9uIiB9Ci0JbGRpIHIwLCM4IHx8IGNtcGkgcjgsIzEwICA7IHsgZGctZXJyb3IgIm5vdCBhIDE2IGJpdCBpbnN0cnVjdGlvbiIgfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL2dhcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvZ2FzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI3ZWVmYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvZ2FzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMKLSMgU29tZSBtNjhrLWNvZmYgdGVzdHMKLSMKLWlmIFtpc3RhcmdldCBtNjgqLSotY29mZl0gdGhlbiB7Ci0gICAgZ2FzX3Rlc3QgInAyNDMwLnMiICIiICRzdGRvcHRsaXN0ICJsb2NhbCBicmFuY2ggbm90IGluIHRleHQgc2VjdGlvbiIKLQotICAgIGdhc190ZXN0ICJwMjQzMGEucyIgIiIgJHN0ZG9wdGxpc3QgImxvY2FsIGJyYW5jaCBub3QgaW4gdGV4dCBzZWN0aW9uIgotCi0gICAgZ2FzX3Rlc3QgInQxLnMiICIiICRzdGRvcHRsaXN0ICJtdWx0aXBsZSAuZmlsZSBkaXJlY3RpdmVzIgotCi0gICAgZ2FzX3Rlc3QgInAyMzg5LnMiICIiICRzdGRvcHRsaXN0ICJic3MgZmlsbCIKLQotICAgIHNldHVwX3hmYWlsIG02OCotKi1jb2ZmCi0gICAgZ2FzX3Rlc3RfZXJyb3IgInAyMzg5YS5zIiAiIiAiZGV0ZWN0IGJzcyBmaWxsIHdpdGggbm9uLXplcm8gZGF0YSIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyMzg5LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYTkzZTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyMzg5LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jICBJIHJlYWNoZWQgYSBwb2ludCB3aGVyZSB0aGUgZmlsZSBsb29rcwotIyBjbGVhbiBhbmQgY29tcGxpZXMgd2l0aCBnYXMgc3ludGF4LCBidXQgaXQgY29yZSBkdW1wcyBnYXMuIEhlcmUncyBhCi0jIGxpdHRsZSBnZGIgaW5mbzoKLSMKLSMgUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggc2lnbmFsIDExLCBTZWdtZW50YXRpb24gZmF1bHQuCi0jICMwICAweDYzMjNjIGluIG1lbWNweSAoKQotIyAoZ2RiKSBidAotIyAjMCAgMHg2MzIzYyBpbiBtZW1jcHkgKCkKLSMgIzEgIDB4ZjJiMCBpbiBmaWxsX3NlY3Rpb24gKGFiZmQ9MHhlYWVlOCwgZmlsZWhkcj0weDhhN2Y0LCAKLSMgICAgIGZpbGVfY3Vyc29yPTB4ZjdmZmY2NTQpIGF0IG9iai1mb3JtYXQuYzo1MzQKLSMgIzIgIDB4MTEyYTggaW4gd3JpdGVfb2JqZWN0X2ZpbGUgKCkgYXQgb2JqLWZvcm1hdC5jOjE3ODYKLSMgIzMgIDB4MTNlZjggaW4gbWFpbiAoYXJnYz01LCBhcmd2PTB4ZjdmZmY3YmMpIGF0IC4uLy4uL3AzL2dhcy9hcy5jOjMxMAotIyAoZ2RiKSAKLSMKLSMgZ2FzIGRpZCBtYW5hZ2UgdG8gY3JlYXRlIHRoZSAubyBmaWxlIGF0IHRoaXMgcG9pbnQuCi0KLQkuYnNzCi0KLV9BU0lDX0lOVF9UQkw6ICAgLnNwYWNlIDMyLDAJfCBrZWVwIGludGVycnVwdCByb3V0aW5lcyBoZXJlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODlhLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODlhLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YjI3NjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyMzg5YS5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0JLmJzcwotCi1fQVNJQ19JTlRfVEJMOiAgIC5zcGFjZSAzMiwxCXwga2VlcCBpbnRlcnJ1cHQgcm91dGluZXMgaGVyZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyNDMwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3MjNkOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzAucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBUaGlzIGRpZmZlcnMgZnJvbSBwMjQzMGEucyAodGhlIGN1c3RvbWVyJ3MgYWN0dWFsIHNvdXJjZSBmaWxlKSBvbmx5Ci0jIGluIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzLiAgU3RyYW5nZWx5LCB0aGlzIGZpbGUgZ2F2ZSBubyBwcm9ibGVtcy4uLgotCi0JLnNlY3QgZm9vCi10YWc6Ci0JYnJhIHRhZwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyNDMwYS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyNDMwYS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDFmYjExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMGEucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotICAgIC5zZWN0IGZvbwotCi10YWc6Ci0JYnJhIHRhZwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3QxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvdDEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwMTVmMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvdDEucworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgMSAibGliZ2NjMS5TIgotIyA0MiAibGlieHl6MS5TIgotIyAyNTkgImxpYmdjYzEuUyIKLQkudGV4dAotCS5wcm9jCi18I1BST0MjIDA0Ci0JLmdsb2JsCSBfX211bHNpMyAgICAgIAotIF9fbXVsc2kzICAgICAgOgotfCNQUk9MT0dVRSMgMAotCWxpbmsJICAlYTYgICAgICAgLCMwCi0JYWRkbAkjLUxGMTQsICAlc3AgICAgICAgCi0JbW92ZW1sCSNMUzE0LCAgJXNwICAgICAgIEAKLXwjUFJPTE9HVUUjIDEKLQltb3ZldwkgICVhNiAgICAgICBAKDB4OCksICAgJWQwICAgICAgIAkgCi0JbXVsdXcJICAlYTYgICAgICAgQCgweGUpLCAgICVkMCAgICAgICAJIAotCW1vdmV3CSAgJWE2ICAgICAgIEAoMHhhKSwgICAlZDEgICAgICAgCSAKLQltdWx1dwkgICVhNiAgICAgICBAKDB4YyksICAgJWQxICAgICAgIAkgCi0JYWRkdwkgICVkMSAgICAgICAsICAgJWQwICAgICAgIAotCWxzbGwJIzgsICAgJWQwICAgICAgIAotCWxzbGwJIzgsICAgJWQwICAgICAgIAotCW1vdmV3CSAgJWE2ICAgICAgIEAoMHhhKSwgICAlZDEgICAgICAgCSAKLQltdWx1dwkgICVhNiAgICAgICBAKDB4ZSksICAgJWQxICAgICAgIAkgCi0JYWRkbAkgICVkMSAgICAgICAsICAgJWQwICAgICAgIAotCWpyYQlMRTE0Ci1MRTE0OgotfCNQUk9MT0dVRSMgMgotCW1vdmVtbAkgICVzcCAgICAgICBALCAjTFMxNAotCXVubGsJICAlYTYgICAgICAgCi18I1BST0xPR1VFIyAzCi0JcnRzCi0JTEYxNCA9IDQKLQlMUzE0ID0gMHgwMDAyCQkgCi0JTEZGMTQgPSAwCi0jIDM1NCAibGliZ2NjMS5TIgotCUxTUzE0ID0gMHgwCi0JTFYxNCA9IDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYWxsLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYWxsLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhYjJhMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2FsbC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jCi0jIFNvbWUgZ2VuZXJpYyBtNjhrIHRlc3RzCi0jCi1pZiBbaXN0YXJnZXQgbTY4Ki0qLSpdIHRoZW4gewotICAgIGdhc190ZXN0ICJ0Mi5zIiAiIiAiIiAiY3Jvc3Mtc2VjdGlvbiBicmFuY2giCi0gICAgaWYgW2lzdGFyZ2V0IG02OCotbW90b3JvbGEtc3lzdl0gdGhlbiB7Ci0JcnVuX2R1bXBfdGVzdCB0MgotICAgIH0KLQotICAgIGdhc190ZXN0ICJwaWMxLnMiICIiICIiICJQSUMgZ2VuZXJhdGlvbiIKLQotICAgIGdhc190ZXN0ICJkaXNwZXJyLnMiICItbTY4MDIwIiAiIiAiSW5jb3JyZWN0IERpc3BsYWNlbWVudCB0b28gbG9uZyBlcnJvciIKLQotICAgIGdhc190ZXN0X2Vycm9yICJwMjQxMC5zIiAiIiAib3V0LW9mLXJhbmdlICdicmFzJyIKLQotICAgIHJ1bl9kdW1wX3Rlc3QgcGNyZWwKLSAgICBydW5fZHVtcF90ZXN0IG9wZXJhbmRzCi0gICAgcnVuX2R1bXBfdGVzdCBjYXMKLSAgICBydW5fZHVtcF90ZXN0IGJpdGZpZWxkCi0gICAgcnVuX2R1bXBfdGVzdCBsaW5rCi0gICAgcnVuX2R1bXBfdGVzdCBmbW92ZW1sCi0KLSAgICBzZXQgdGVzdG5hbWUgIjY4MDAwIG9wZXJhbmRzIgotICAgIGdhc19ydW4gIm9wZXJhbmRzLnMiICItbTY4MDAwIiAiMj5lcnIub3V0IgotICAgIGlmICFbc3RyaW5nIG1hdGNoICJjaGlsZCBwcm9jZXNzIGV4aXRlZCBhYm5vcm1hbGx5IiAkY29tcF9vdXRwdXRdIHRoZW4gewotCXNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKLQl2ZXJib3NlICIkY29tcF9vdXRwdXQiIDMKLQlmYWlsICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0JaWYgW3JlZ2V4cF9kaWZmICJlcnIub3V0IiAiJHNyY2Rpci8kc3ViZGlyL29wNjgwMDAuZCJdIHRoZW4gewotCSAgICBmYWlsICR0ZXN0bmFtZQotCX0gZWxzZSB7Ci0JICAgIHBhc3MgJHRlc3RuYW1lCi0JfQotICAgIH0KLX0KLWlmIFtpbmZvIGV4aXN0cyBlcnJvckluZm9dIHRoZW4gewotICAgIHVuc2V0IGVycm9ySW5mbwotICAgIH0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiMWJkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2JpdGZpZWxkLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogYml0ZmllbGQKLQotIyBUZXN0IGhhbmRsaW5nIG9mIGJpdGZpZWxkIGluc3RydWN0aW9uIG9wZXJhbmRzLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBiZmV4dHMgJWEwQCwxLDIsJWQwCi0wKzAwNCA8Zm9vXCsoMHh8KTQ+IGJmZXh0cyAlYTBALDEsNiwlZDAKLTArMDA4IDxmb29cKygweHwpOD4gYmZleHRzICVhMEAsMywyLCVkMAotMCswMGMgPGZvb1wrKDB4fCljPiBiZmV4dHMgJWEwQCwzLDYsJWQwCi0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBiZmV4dHMgJWEwQCwxLDIsJWQwCi0wKzAxNCA8Zm9vXCsoMHh8KTE0PiBiZmV4dHMgJWEwQCwxLDYsJWQwCi0wKzAxOCA8Zm9vXCsoMHh8KTE4PiBiZmV4dHMgJWEwQCwzLDIsJWQwCi0wKzAxYyA8Zm9vXCsoMHh8KTFjPiBiZmV4dHMgJWEwQCwzLDYsJWQwCi0wKzAyMCA8Zm9vXCsoMHh8KTIwPiBiZnNldCAlYTBALDEsMgotMCswMjQgPGZvb1wrKDB4fCkyND4gYmZzZXQgJWEwQCwxLDYKLTArMDI4IDxmb29cKygweHwpMjg+IGJmc2V0ICVhMEAsMywyCi0wKzAyYyA8Zm9vXCsoMHh8KTJjPiBiZnNldCAlYTBALDMsNgotMCswMzAgPGZvb1wrKDB4fCkzMD4gYmZzZXQgJWEwQCwxLDIKLTArMDM0IDxmb29cKygweHwpMzQ+IGJmc2V0ICVhMEAsMSw2Ci0wKzAzOCA8Zm9vXCsoMHh8KTM4PiBiZnNldCAlYTBALDMsMgotMCswM2MgPGZvb1wrKDB4fCkzYz4gYmZzZXQgJWEwQCwzLDYKLTArMDQwIDxmb29cKygweHwpNDA+IGJmZXh0cyAlYTBALCVkMSwlZDIsJWQwCi0wKzA0NCA8Zm9vXCsoMHh8KTQ0PiBiZmV4dHMgJWEwQCwlZDEsJWQyLCVkMAotMCswNDggPGZvb1wrKDB4fCk0OD4gYmZzZXQgJWEwQCwlZDEsJWQyCi0wKzA0YyA8Zm9vXCsoMHh8KTRjPiBiZnNldCAlYTBALCVkMSwlZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyZjc1OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2JpdGZpZWxkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIFRlc3QgaGFuZGxpbmcgb2YgYml0ZmllbGQgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMuCi0JLnRleHQKLQkuZ2xvYmwJZm9vCi1mb286CQotCWJmZXh0cwkoJWEwKXsmMTomMn0sJWQwCi0JYmZleHRzCSglYTApeyYxOiYoMis0KX0sJWQwCi0JYmZleHRzCSglYTApeyYoMSsyKTomMn0sJWQwCi0JYmZleHRzCSglYTApeyYoMSsyKTomKDIrNCl9LCVkMAotCWJmZXh0cwklYTBALCYxLCYyLCVkMAotCWJmZXh0cwklYTBALCYxLCYoMis0KSwlZDAKLQliZmV4dHMJJWEwQCwmMSsyLCYyLCVkMAotCWJmZXh0cwklYTBALCYoMSsyKSwmKDIrNCksJWQwCi0JYmZzZXQJKCVhMCl7JjE6JjJ9Ci0JYmZzZXQJKCVhMCl7JjE6JigyKzQpfQotCWJmc2V0CSglYTApeyYoMSsyKTomMn0KLQliZnNldAkoJWEwKXsmKDErMik6JigyKzQpfQotCWJmc2V0CSVhMEAsJjEsJjIKLQliZnNldAklYTBALCYxLCYoMis0KQotCWJmc2V0CSVhMEAsJjErMiwmMgotCWJmc2V0CSVhMEAsJigxKzIpLCYoMis0KQotCWJmZXh0cwkoJWEwKXslZDE6JWQyfSwlZDAKLQliZmV4dHMJJWEwQCwlZDEsJWQyLCVkMAotCWJmc2V0CSglYTApeyVkMTolZDJ9Ci0JYmZzZXQJJWEwQCwlZDEsJWQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9jYXMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwOTczMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IGNhcwotCi0jIFRlc3QgcGFyc2luZyBvZiB0aGUgb3BlcmFuZHMgb2YgdGhlIGNhcyBpbnN0cnVjdGlvbgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBjYXN3ICVkMCwlZDEsJWEwQAotMCswMDQgPGZvb1wrKDB4fCk0PiBjYXN3ICVkMCwlZDEsJWEwQAotMCswMDggPGZvb1wrKDB4fCk4PiBjYXMydyAlZDAsJWQyLCVkMywlZDQsJWEwQCwlYTFACi0wKzAwZSA8Zm9vXCsoMHh8KWU+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCxAXCglZDBcKSxAXCglZDFcKQotMCswMTQgPGZvb1wrKDB4fCkxND4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAotMCswMWEgPGZvb1wrKDB4fCkxYT4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAotMCswMjAgPGZvb1wrKDB4fCkyMD4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LEBcKCVkMFwpLEBcKCVkMVwpCi0wKzAyNiA8Zm9vXCsoMHh8KTI2PiBjYXMydyAlZDAsJWQyLCVkMywlZDQsJWEwQCwlYTFACi0wKzAyYyA8Zm9vXCsoMHh8KTJjPiBjYXMydyAlZDAsJWQyLCVkMywlZDQsQFwoJWQwXCksQFwoJWQxXCkKLTArMDMyIDxmb29cKygweHwpMzI+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKLTArMDM4IDxmb29cKygweHwpMzg+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKLTArMDNlIDxmb29cKygweHwpM2U+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCxAXCglZDBcKSxAXCglZDFcKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9jYXMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvY2FzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NGU3ZjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9jYXMucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgVGVzdCBwYXJzaW5nIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUgY2FzIGluc3RydWN0aW9uCi0JLnRleHQKLQkuZ2xvYmwJZm9vCi1mb286CQotCWNhcwklZDAsJWQxLCglYTApCi0JY2FzCSVkMCwlZDEsJWEwQAotCWNhczIJJWQwOiVkMiwlZDM6JWQ0LCglYTApOiglYTEpCi0JY2FzMgklZDA6JWQyLCVkMzolZDQsKCVkMCk6KCVkMSkKLQljYXMyCSVkMDolZDIsJWQzOiVkNCwlYTBAOiVhMUAKLQljYXMyCSVkMDolZDIsJWQzOiVkNCxAKCVhMCk6QCglYTEpCi0JY2FzMgklZDA6JWQyLCVkMzolZDQsQCglZDApOkAoJWQxKQotCWNhczIJJWQwLCVkMiwlZDMsJWQ0LCglYTApLCglYTEpCi0JY2FzMgklZDAsJWQyLCVkMywlZDQsKCVkMCksKCVkMSkKLQljYXMyCSVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKLQljYXMyCSVkMCwlZDIsJWQzLCVkNCxAKCVhMCksQCglYTEpCi0JY2FzMgklZDAsJWQyLCVkMywlZDQsQCglZDApLEAoJWQxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9kaXNwZXJyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Rpc3BlcnIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkM2I3Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Rpc3BlcnIucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNOT19BUFAKLWdjYzJfY29tcGlsZWQuOgotX19fZ251X2NvbXBpbGVkX2M6Ci0udGV4dAotCS5ldmVuCi0uZ2xvYmwgX2ZvbwotX2ZvbzoKLQlsaW5rICVhNiwjLTEyCi0JZm1vdmV4ICVhNkAoLTEyKSwlZnAwCi0JZm1vdmV4ICVmcDAsJXNwQC0KLQlqYnNyIF9iYXIKLQlhZGRxdyAjOCwlc3AKLQlhZGRxdyAjNCwlc3AKLUwxOgotCXVubGsgJWE2Ci0JcnRzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Ztb3ZlbWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZm1vdmVtbC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGUyNzkzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZm1vdmVtbC5kCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IGZtb3ZlbWwKLQotIyBUZXN0IGhhbmRsaW5nIG9mIGZtb3ZlbWwgYW5kIGZtb3ZlbXggaW5zdHJ1Y3Rpb25zLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBmbW92ZWwgJWZwY3IsJWEwQAotMCswMDQgPGZvb1wrKDB4fCk0PiBmbW92ZWwgJWZwc3IsJWEwQAotMCswMDggPGZvb1wrKDB4fCk4PiBmbW92ZWwgJWZwaWFyLCVhMEAKLTArMDBjIDxmb29cKygweHwpYz4gZm1vdmVtbCAlZnBzci8lZnBjciwlYTBACi0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBmbW92ZW1sICVmcGlhci8lZnBjciwlYTBACi0wKzAxNCA8Zm9vXCsoMHh8KTE0PiBmbW92ZW1sICVmcGlhci8lZnBzciwlYTBACi0wKzAxOCA8Zm9vXCsoMHh8KTE4PiBmbW92ZW1sICVmcGlhci8lZnBzci8lZnBjciwlYTBACi0wKzAxYyA8Zm9vXCsoMHh8KTFjPiBmbW92ZWwgJWZwY3IsJWQwCi0wKzAyMCA8Zm9vXCsoMHh8KTIwPiBmbW92ZWwgJWZwc3IsJWQwCi0wKzAyNCA8Zm9vXCsoMHh8KTI0PiBmbW92ZWwgJWZwaWFyLCVkMAotMCswMjggPGZvb1wrKDB4fCkyOD4gZm1vdmVsICVmcGlhciwlYTAKLTArMDJjIDxmb29cKygweHwpMmM+IGZtb3ZlbCAlYTBALCVmcGNyCi0wKzAzMCA8Zm9vXCsoMHh8KTMwPiBmbW92ZWwgJWEwQCwlZnBzcgotMCswMzQgPGZvb1wrKDB4fCkzND4gZm1vdmVsICVhMEAsJWZwaWFyCi0wKzAzOCA8Zm9vXCsoMHh8KTM4PiBmbW92ZW1sICVhMEAsJWZwc3IvJWZwY3IKLTArMDNjIDxmb29cKygweHwpM2M+IGZtb3ZlbWwgJWEwQCwlZnBpYXIvJWZwY3IKLTArMDQwIDxmb29cKygweHwpNDA+IGZtb3ZlbWwgJWEwQCwlZnBpYXIvJWZwc3IKLTArMDQ0IDxmb29cKygweHwpNDQ+IGZtb3ZlbWwgJWEwQCwlZnBpYXIvJWZwc3IvJWZwY3IKLTArMDQ4IDxmb29cKygweHwpNDg+IGZtb3ZlbCAlZDAsJWZwY3IKLTArMDRjIDxmb29cKygweHwpNGM+IGZtb3ZlbCAlZDAsJWZwc3IKLTArMDUwIDxmb29cKygweHwpNTA+IGZtb3ZlbCAlZDAsJWZwaWFyCi0wKzA1NCA8Zm9vXCsoMHh8KTU0PiBmbW92ZWwgJWEwLCVmcGlhcgotMCswNTggPGZvb1wrKDB4fCk1OD4gZm1vdmVsICMxLCVmcGNyCi0wKzA2MCA8Zm9vXCsoMHh8KTYwPiBmbW92ZWwgIzEsJWZwc3IKLTArMDY4IDxmb29cKygweHwpNjg+IGZtb3ZlbCAjMSwlZnBpYXIKLTArMDcwIDxmb29cKygweHwpNzA+IGZtb3ZlbWwgIzEsJWZwc3IvJWZwY3IKLTArMDc4IDxmb29cKygweHwpNzg+IGZtb3ZlbWwgIzEsJWZwaWFyLyVmcGNyCi0wKzA4MCA8Zm9vXCsoMHh8KTgwPiBmbW92ZW1sICMxLCVmcGlhci8lZnBzcgotMCswODggPGZvb1wrKDB4fCk4OD4gZm1vdmVtbCAjMSwlZnBpYXIvJWZwc3IvJWZwY3IKLTArMDkwIDxmb29cKygweHwpOTA+IGZtb3ZlbXggJWZwMSwlYTBACi0wKzA5NCA8Zm9vXCsoMHh8KTk0PiBmbW92ZW14ICVmcDQsJWEwQAotMCswOTggPGZvb1wrKDB4fCk5OD4gZm1vdmVteCAlZnA3LCVhMEAKLTArMDljIDxmb29cKygweHwpOWM+IGZtb3ZlbXggJWZwMS8lZnAzLCVhMEAKLTArMGEwIDxmb29cKygweHwpYTA+IGZtb3ZlbXggJWZwMS0lZnA0LCVhMEAKLTArMGE0IDxmb29cKygweHwpYTQ+IGZtb3ZlbXggJWZwMC8lZnA3LCVhMEAKLTArMGE4IDxmb29cKygweHwpYTg+IGZtb3ZlbXggJWZwMC0lZnA3LCVhMEAKLTArMGFjIDxmb29cKygweHwpYWM+IGZtb3ZlbXggJWEwQCwlZnAwCi0wKzBiMCA8Zm9vXCsoMHh8KWIwPiBmbW92ZW14ICVhMEAsJWZwMQotMCswYjQgPGZvb1wrKDB4fCliND4gZm1vdmVteCAlYTBALCVmcDcKLTArMGI4IDxmb29cKygweHwpYjg+IGZtb3ZlbXggJWEwQCwlZnAwLyVmcDMKLTArMGJjIDxmb29cKygweHwpYmM+IGZtb3ZlbXggJWEwQCwlZnAwLyVmcDQKLTArMGMwIDxmb29cKygweHwpYzA+IGZtb3ZlbXggJWEwQCwlZnAyLSVmcDQKLTArMGM0IDxmb29cKygweHwpYzQ+IGZtb3ZlbXggJWEwQCwlZnAxLSVmcDcKLTArMGM4IDxmb29cKygweHwpYzg+IGZtb3ZlbXggJWZwMCwlYTBALQotMCswY2MgPGZvb1wrKDB4fCljYz4gZm1vdmVteCAlZnAwLSVmcDcsJWEwQC0KLTArMGQwIDxmb29cKygweHwpZDA+IGZtb3ZlbXggJWZwMC8lZnA0LCVhMEAtCi0wKzBkNCA8Zm9vXCsoMHh8KWQ0PiBmbW92ZW14ICVhMEBcKywlZnA3Ci0wKzBkOCA8Zm9vXCsoMHh8KWQ4PiBmbW92ZW14ICVhMEBcKywlZnAwLSVmcDcKLTArMGRjIDxmb29cKygweHwpZGM+IGZtb3ZlbXggJWEwQFwrLCVmcDMvJWZwNwotMCswZTAgPGZvb1wrKDB4fCllMD4gZm1vdmVteCAlZDAsJWEwQC0KLTArMGU0IDxmb29cKygweHwpZTQ+IGZtb3ZlbXggJWEwQFwrLCVkMAotMCswZTggPGZvb1wrKDB4fCllOD4gZm1vdmVteCAlZnAxLyVmcDUsJWEwQC0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZm1vdmVtbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9mbW92ZW1sLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDIyNGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9mbW92ZW1sLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jIFRlc3QgaGFuZGxpbmcgb2YgdGhlIGZtb3ZlbWwgYW5kIGZtb3ZlbXggaW5zdHJ1Y3Rpb25zLgotCS50ZXh0Ci0JLmdsb2JsCWZvbwotZm9vOgotCWZtb3ZlbWwgJWZwY3IsJWEwQAotCWZtb3ZlbWwgJWZwc3IsJWEwQAotCWZtb3ZlbWwgJWZwaWFyLCVhMEAKLQlmbW92ZW1sICVmcGNyLyVmcHNyLCVhMEAKLQlmbW92ZW1sCSVmcGNyLyVmcGlhciwlYTBACi0JZm1vdmVtbAklZnBzci8lZnBpYXIsJWEwQAotCWZtb3ZlbWwJJWZwY3IvJWZwc3IvJWZwaWFyLCVhMEAKLQlmbW92ZW1sCSVmcGNyLCVkMAotCWZtb3ZlbWwJJWZwc3IsJWQwCi0JZm1vdmVtbAklZnBpYXIsJWQwCi0JZm1vdmVtbAklZnBpYXIsJWEwCi0JZm1vdmVtbCAlYTBALCVmcGNyCi0JZm1vdmVtbCAlYTBALCVmcHNyCi0JZm1vdmVtbCAlYTBALCVmcGlhcgotCWZtb3ZlbWwgJWEwQCwlZnBzci8lZnBjcgotCWZtb3ZlbWwJJWEwQCwlZnBpYXIvJWZwY3IKLQlmbW92ZW1sCSVhMEAsJWZwaWFyLyVmcHNyCi0JZm1vdmVtbAklYTBALCVmcHNyLyVmcGlhci8lZnBjcgotCWZtb3ZlbWwJJWQwLCVmcGNyCi0JZm1vdmVtbAklZDAsJWZwc3IKLQlmbW92ZW1sCSVkMCwlZnBpYXIKLQlmbW92ZW1sCSVhMCwlZnBpYXIKLQlmbW92ZW1sCSYxLCVmcGNyCi0JZm1vdmVtbAkmMSwlZnBzcgotCWZtb3ZlbWwJJjEsJWZwaWFyCi0JZm1vdmVtbAkmMSwlZnBjci8lZnBzcgotCWZtb3ZlbWwJJjEsJWZwY3IvJWZwaWFyCi0JZm1vdmVtbAkmMSwlZnBzci8lZnBpYXIKLQlmbW92ZW1sCSYxLCVmcGlhci8lZnBzci8lZnBjcgotCi0JZm1vdmVteCAlZnAxLCVhMEAKLQlmbW92ZW14ICVmcDQsJWEwQAotCWZtb3ZlbXggJWZwNywlYTBACi0JZm1vdmVteCAlZnAxLyVmcDMsJWEwQAotCWZtb3ZlbXgJJWZwMS0lZnA0LCVhMEAKLQlmbW92ZW14CSVmcDAvJWZwNywlYTBACi0JZm1vdmVteAklZnAwLSVmcDcsJWEwQAotCWZtb3ZlbXggJWEwQCwlZnAwCi0JZm1vdmVteCAlYTBALCVmcDEKLQlmbW92ZW14ICVhMEAsJWZwNwotCWZtb3ZlbXggJWEwQCwlZnAwLyVmcDMKLQlmbW92ZW14CSVhMEAsJWZwMC8lZnA0Ci0JZm1vdmVteAklYTBALCVmcDItJWZwNAotCWZtb3ZlbXgJJWEwQCwlZnAxLSVmcDcKLQlmbW92ZW14CSYxLCVhMEAtCi0JZm1vdmVteAkmMHhmZiwlYTBALQotCWZtb3ZlbXgJJjB4MTEsJWEwQC0KLQlmbW92ZW14CSVhMEArLCYxCi0JZm1vdmVteAklYTBAKywmMHhmZgotCWZtb3ZlbXgJJWEwQCssJjB4MTEKLQlmbW92ZW14CSVkMCwlYTBALQotCWZtb3ZlbXgJJWEwQCssJWQwCi0JZm1vdmVteAkmc3ltLCVhMEAtCi0Jc3ltCT0JMHgyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9saW5rLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1MjYzZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsuZAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBsaW5rCi0KLSMgVGVzdCBoYW5kbGluZyBvZiBsaW5rIGluc3RydWN0aW9uLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBsaW5rdyAlZnAsIzAKLTArMDA0IDxmb29cKygweHwpND4gbGlua3cgJWZwLCMtNAotMCswMDggPGZvb1wrKDB4fCk4PiBsaW5rdyAlZnAsIy0zMjc2NwotMCswMGMgPGZvb1wrKDB4fCljPiBsaW5rdyAlZnAsIy0zMjc2OAotMCswMTAgPGZvb1wrKDB4fCkxMD4gbGlua2wgJWZwLCMtMzI3NjkKLTArMDE2IDxmb29cKygweHwpMTY+IGxpbmt3ICVmcCwjMzI3NjcKLTArMDFhIDxmb29cKygweHwpMWE+IGxpbmtsICVmcCwjMzI3NjgKLTArMDIwIDxmb29cKygweHwpMjA+IGxpbmtsICVmcCwjMzI3NjkKLTArMDI2IDxmb29cKygweHwpMjY+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9saW5rLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzMjFkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgVGVzdCBoYW5kbGluZyBvZiBsaW5rIGluc3RydWN0aW9uLgotCS50ZXh0Ci0JLmdsb2JsCWZvbwotZm9vOgotCWxpbmsJJWE2LCYwCi0JbGluawklYTYsJi00Ci0JbGluawklYTYsJi0weDdmZmYKLQlsaW5rCSVhNiwmLTB4ODAwMAotCWxpbmsJJWE2LCYtMHg4MDAxCi0JbGluawklYTYsJjB4N2ZmZgotCWxpbmsJJWE2LCYweDgwMDAKLQlsaW5rCSVhNiwmMHg4MDAxCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wNjgwMDAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3A2ODAwMC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhkNWEzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3A2ODAwMC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSMgVGhpcyBzaG91bGQgbWF0Y2ggdGhlIHN0ZGVyciBvdXRwdXQgb2YgZ2FzIC1tNjgwMDAgb24gb3BlcmFuZHMucy4KLSMgV2UgZG9uJ3QgYm90aGVyIHRvIG1hdGNoIHRoZSBleGFjdCBlcnJvciBtZXNzYWdlLCBidXQgaW5zdGVhZCBqdXN0Ci0jIGxvb2sgZm9yIHRoZSBzdGF0ZW1lbnRzIHdoaWNoIHNob3VsZCBmYWlsLgotCi0uKm9wZXJhbmRzLnM6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qc3RhdGVtZW50IGB0c3RsICVhMCcgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoOCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDgsJWQwOnc6NFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCg4LCVkMDp3OjhcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoOCwlZDA6bDoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDgsJWQwOmw6NFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCg4LCVkMDpsOjhcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMFwqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMFwqNFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMFwqOFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwLndcKjRcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDAud1wqOFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMC5sXCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwLmxcKjRcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDAubFwqOFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWExLndcKjIsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDhcKCVhMCwlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCA4XCglZDAud1wqMiwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgOFwoJWExLndcKjIsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoJWQwLndcKjIsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlZDAsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlYTEud1wqMiwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCVkMCwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwMDAsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDAwMFwoJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICV6YTFAXCgxMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJXphMUBcKDEwMDAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJXphMSwlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWQwLCV6YTFcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVhMS53XCoyLCV6YTFcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJXphMSwlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglZDAsJXphMVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAwMCwlemExXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDAwMFwoJXphMVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwLCV6ZDE6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDAsJXpkMTp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoJXpkMTp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVhMCwlemQxLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCV6ZDEsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlemExLndcKjIsJWEwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCVhMCwlemQxLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJXpkMSwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCV6ZDEud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglemQxLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCglemQxLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMFwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDBcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMFwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTBcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWEwXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWyVhMFxdLCVkMDp3OjIsMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMFxdLCVkMDp3OjIsMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMFxdLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDAsJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwLCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMCwlZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDAsJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCglZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCglZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVhMCwlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlZDA6dzoyLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWQwLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWExLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWExOnc6MiwlYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVhMCwlZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWQwLCVhMFxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVkMDp3OjJcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslZDAsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwLCVkMDp3OjJcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWQwLCVhMFxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoOCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoOCwlcGMsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSA4XCglcGMsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKCVwYywlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDEwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDEwMDAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlcGMsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWQwLCVwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlYTEud1wqMiwlcGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWExLCVwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDBcKCVwYywlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDBcKCVkMCwlcGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwXCglYTEsJXBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwMDAsJXBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgMTAwMDAwXCglcGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDEwMDAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlenBjLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCVkMCwlenBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCVhMS53XCoyLCV6cGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWExLCV6cGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwXCglenBjLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgMTAwMFwoJWQwLCV6cGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwXCglYTEsJXpwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMDAwLCV6cGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwMDBcKCV6cGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMFwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXBjXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXBjXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXBjXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyVwY1xdLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDBcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlenBjXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXpwY1xdLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlenBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslenBjXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyV6cGNcXSwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyV6cGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMCwlZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMCwlZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlcGMsJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDA6dzoyLCVwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDAsJXBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVhMSwlcGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXBjLCVhMVxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlYTE6dzoyLCVwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlcGMsJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWQwLCVwY1xdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExLCVwY1xdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyVwYywlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslcGMsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslcGMsJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyVkMCwlcGNcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwLCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMCwlZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCV6cGMsJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDA6dzoyLCV6cGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWQwLCV6cGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExLCV6cGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXpwYywlYTFcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExOnc6MiwlenBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCV6cGMsJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWQwLCV6cGNcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVhMSwlenBjXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXpwYywlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslenBjLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXpwYywlZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJWQwLCV6cGNcXVwpJyBpZ25vcmVkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzgzYzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcGVyYW5kcy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBvcGVyYW5kcwotCi0jIFRlc3QgaGFuZGxpbmcgb2YgTUlUIGFuZCBNb3Rvcm9sYSBzeW50YXggb3BlcmFuZHMKLSMgSWYgeW91IGNoYW5nZSB0aGlzIGZpbGUsIHNlZSBhbHNvIG9wNjgwMDAuZC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gdHN0bCAlZDAKLTArMDAyIDxmb29cKygweHwpMj4gdHN0bCAlYTAKLTArMDA0IDxmb29cKygweHwpND4gdHN0bCAlYTBACi0wKzAwNiA8Zm9vXCsoMHh8KTY+IHRzdGwgJWEwQAotMCswMDggPGZvb1wrKDB4fCk4PiB0c3RsICVhMEBcKwotMCswMGEgPGZvb1wrKDB4fClhPiB0c3RsICVhMEBcKwotMCswMGMgPGZvb1wrKDB4fCljPiB0c3RsICVhMEAtCi0wKzAwZSA8Zm9vXCsoMHh8KWU+IHRzdGwgJWEwQC0KLTArMDEwIDxmb29cKygweHwpMTA+IHRzdGwgJWEwQFwoOFwpCi0wKzAxNCA8Zm9vXCsoMHh8KTE0PiB0c3RsICVhMEBcKDhcKQotMCswMTggPGZvb1wrKDB4fCkxOD4gdHN0bCAlYTBAXCg4XCkKLTArMDFjIDxmb29cKygweHwpMWM+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQotMCswMjAgPGZvb1wrKDB4fCkyMD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6d1wpCi0wKzAyNCA8Zm9vXCsoMHh8KTI0PiB0c3RsICVhMEBcKDArMDA4LCVkMDp3XCkKLTArMDI4IDxmb29cKygweHwpMjg+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6MlwpCi0wKzAyYyA8Zm9vXCsoMHh8KTJjPiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjRcKQotMCswMzAgPGZvb1wrKDB4fCkzMD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzo4XCkKLTArMDM0IDxmb29cKygweHwpMzQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQotMCswMzggPGZvb1wrKDB4fCkzOD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzAzYyA8Zm9vXCsoMHh8KTNjPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjJcKQotMCswNDAgPGZvb1wrKDB4fCk0MD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDo0XCkKLTArMDQ0IDxmb29cKygweHwpNDQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6OFwpCi0wKzA0OCA8Zm9vXCsoMHh8KTQ4PiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKQotMCswNGMgPGZvb1wrKDB4fCk0Yz4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzA1MCA8Zm9vXCsoMHh8KTUwPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKLTArMDU0IDxmb29cKygweHwpNTQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6MlwpCi0wKzA1OCA8Zm9vXCsoMHh8KTU4PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjRcKQotMCswNWMgPGZvb1wrKDB4fCk1Yz4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDo4XCkKLTArMDYwIDxmb29cKygweHwpNjA+IHRzdGwgJWEwQFwoMCswMDgsJWQwOndcKQotMCswNjQgPGZvb1wrKDB4fCk2ND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6d1wpCi0wKzA2OCA8Zm9vXCsoMHh8KTY4PiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjJcKQotMCswNmMgPGZvb1wrKDB4fCk2Yz4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzo0XCkKLTArMDcwIDxmb29cKygweHwpNzA+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6OFwpCi0wKzA3NCA8Zm9vXCsoMHh8KTc0PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKLTArMDc4IDxmb29cKygweHwpNzg+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQotMCswN2MgPGZvb1wrKDB4fCk3Yz4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDoyXCkKLTArMDgwIDxmb29cKygweHwpODA+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6NFwpCi0wKzA4NCA8Zm9vXCsoMHh8KTg0PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjhcKQotMCswODggPGZvb1wrKDB4fCk4OD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzA4YyA8Zm9vXCsoMHh8KThjPiB0c3RsICVhMEBcKDArMDA4LCVhMTp3OjJcKQotMCswOTAgPGZvb1wrKDB4fCk5MD4gdHN0bCAlYTFAXCgwKzAwOCwlYTA6bFwpCi0wKzA5NCA8Zm9vXCsoMHh8KTk0PiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjJcKQotMCswOTggPGZvb1wrKDB4fCk5OD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzoyXCkKLTArMDljIDxmb29cKygweHwpOWM+IHRzdGwgJWEwQFwoMCswMDgsJWExOnc6MlwpCi0wKzBhMCA8Zm9vXCsoMHh8KWEwPiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKQotMCswYTQgPGZvb1wrKDB4fClhND4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6dzoyXCkKLTArMGE4IDxmb29cKygweHwpYTg+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpCi0wKzBhZSA8Zm9vXCsoMHh8KWFlPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKQotMCswYjQgPGZvb1wrKDB4fCliND4gdHN0bCBAXCgwKzAwMCwlZDA6dzoyXCkKLTArMGI4IDxmb29cKygweHwpYjg+IHRzdGwgQFwoMCszZThcKQotMCswYmUgPGZvb1wrKDB4fCliZT4gdHN0bCAlYTBAXCgwKzE4NmEwXCkKLTArMGM2IDxmb29cKygweHwpYzY+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpCi0wKzBjYyA8Zm9vXCsoMHh8KWNjPiB0c3RsICVhMEBcKDArM2U4LCVkMDpsXCkKLTArMGQyIDxmb29cKygweHwpZDI+IHRzdGwgJWEwQFwoMCszZTgsJWExOnc6MlwpCi0wKzBkOCA8Zm9vXCsoMHh8KWQ4PiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKQotMCswZGUgPGZvb1wrKDB4fClkZT4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6bFwpCi0wKzBlNCA8Zm9vXCsoMHh8KWU0PiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKQotMCswZWEgPGZvb1wrKDB4fCllYT4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMGYwIDxmb29cKygweHwpZjA+IHRzdGwgQFwoMCswMDAsJWQwOnc6MlwpCi0wKzBmNCA8Zm9vXCsoMHh8KWY0PiB0c3RsICVhMEBcKDArMTg2YTBcKQotMCswZmMgPGZvb1wrKDB4fClmYz4gdHN0bCAlYTBAXCgwKzE4NmEwXCkKLTArMTA0IDxmb29cKygweHwpMTA0PiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKQotMCsxMGEgPGZvb1wrKDB4fCkxMGE+IHRzdGwgQFwoMCsxODZhMFwpCi0wKzExMiA8Zm9vXCsoMHh8KTExMj4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMTE4IDxmb29cKygweHwpMTE4PiB0c3RsIEBcKDArM2U4LCVkMDpsXCkKLTArMTFlIDxmb29cKygweHwpMTFlPiB0c3RsIEBcKDArM2U4LCVhMTp3OjJcKQotMCsxMjQgPGZvb1wrKDB4fCkxMjQ+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpCi0wKzEyYSA8Zm9vXCsoMHh8KTEyYT4gdHN0bCBAXCgwKzNlOCwlZDA6bFwpCi0wKzEzMCA8Zm9vXCsoMHh8KTEzMD4gdHN0bCBAXCgwKzE4NmEwXCkKLTArMTM4IDxmb29cKygweHwpMTM4PiB0c3RsIEBcKDArMTg2YTBcKQotMCsxNDAgPGZvb1wrKDB4fCkxNDA+IHRzdGwgJWEwQFwoMCszZThcKQotMCsxNDYgPGZvb1wrKDB4fCkxNDY+IHRzdGwgQFwoMCszZThcKQotMCsxNGMgPGZvb1wrKDB4fCkxNGM+IHRzdGwgQFwoMCswMDBcKQotMCsxNTAgPGZvb1wrKDB4fCkxNTA+IHRzdGwgJWEwQFwoMCszZThcKQotMCsxNTYgPGZvb1wrKDB4fCkxNTY+IHRzdGwgJWEwQFwoMCszZThcKQotMCsxNWMgPGZvb1wrKDB4fCkxNWM+IHRzdGwgJWEwQFwoMCszZThcKQotMCsxNjIgPGZvb1wrKDB4fCkxNjI+IHRzdGwgJWEwQFwoMCszZThcKQotMCsxNjggPGZvb1wrKDB4fCkxNjg+IHRzdGwgJWEwQFwoMCszZThcKQotMCsxNmUgPGZvb1wrKDB4fCkxNmU+IHRzdGwgQFwoMCszZThcKQotMCsxNzQgPGZvb1wrKDB4fCkxNzQ+IHRzdGwgQFwoMCszZThcKQotMCsxN2EgPGZvb1wrKDB4fCkxN2E+IHRzdGwgQFwoMCswMDBcKQotMCsxN2UgPGZvb1wrKDB4fCkxN2U+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsxODYgPGZvb1wrKDB4fCkxODY+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsxOGMgPGZvb1wrKDB4fCkxOGM+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArN2QwXCkKLTArMTk0IDxmb29cKygweHwpMTk0PiB0c3RsIEBcKDArM2U4XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMTljIDxmb29cKygweHwpMTljPiB0c3RsIEBcKDArM2U4XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMWEyIDxmb29cKygweHwpMWEyPiB0c3RsIEBcKDArM2U4XClAXCgwKzdkMFwpCi0wKzFhYSA8Zm9vXCsoMHh8KTFhYT4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzFiMCA8Zm9vXCsoMHh8KTFiMD4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzFiNCA8Zm9vXCsoMHh8KTFiND4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCs3ZDBcKQotMCsxYmEgPGZvb1wrKDB4fCkxYmE+IHRzdGwgQFwoMCswMDBcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsxYzAgPGZvb1wrKDB4fCkxYzA+IHRzdGwgQFwoMCswMDBcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsxYzQgPGZvb1wrKDB4fCkxYzQ+IHRzdGwgQFwoMCswMDBcKUBcKDArN2QwXCkKLTArMWNhIDxmb29cKygweHwpMWNhPiB0c3RsICVhMEBcKDArM2U4XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMWQyIDxmb29cKygweHwpMWQyPiB0c3RsICVhMEBcKDArM2U4XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMWQ4IDxmb29cKygweHwpMWQ4PiB0c3RsICVhMEBcKDArM2U4XClAXCgwKzdkMFwpCi0wKzFlMCA8Zm9vXCsoMHh8KTFlMD4gdHN0bCBAXCgwKzNlOFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzFlOCA8Zm9vXCsoMHh8KTFlOD4gdHN0bCBAXCgwKzNlOFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzFlZSA8Zm9vXCsoMHh8KTFlZT4gdHN0bCBAXCgwKzNlOFwpQFwoMCs3ZDBcKQotMCsxZjYgPGZvb1wrKDB4fCkxZjY+IHRzdGwgJWEwQFwoMCswMDBcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsxZmMgPGZvb1wrKDB4fCkxZmM+IHRzdGwgJWEwQFwoMCswMDBcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsyMDAgPGZvb1wrKDB4fCkyMDA+IHRzdGwgJWEwQFwoMCswMDBcKUBcKDArN2QwXCkKLTArMjA2IDxmb29cKygweHwpMjA2PiB0c3RsIEBcKDArMDAwXClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMjBjIDxmb29cKygweHwpMjBjPiB0c3RsIEBcKDArMDAwXClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMjEwIDxmb29cKygweHwpMjEwPiB0c3RsIEBcKDArMDAwXClAXCgwKzdkMFwpCi0wKzIxNiA8Zm9vXCsoMHh8KTIxNj4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzIxZSA8Zm9vXCsoMHh8KTIxZT4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzIyNCA8Zm9vXCsoMHh8KTIyND4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzIyYyA8Zm9vXCsoMHh8KTIyYz4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzIzMiA8Zm9vXCsoMHh8KTIzMj4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzIzOCA8Zm9vXCsoMHh8KTIzOD4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzIzYyA8Zm9vXCsoMHh8KTIzYz4gdHN0bCBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzI0MiA8Zm9vXCsoMHh8KTI0Mj4gdHN0bCBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzI0NiA8Zm9vXCsoMHh8KTI0Nj4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzI0ZSA8Zm9vXCsoMHh8KTI0ZT4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzI1NiA8Zm9vXCsoMHh8KTI1Nj4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6bFwpQFwoMCs3ZDBcKQotMCsyNWUgPGZvb1wrKDB4fCkyNWU+IHRzdGwgJWExQFwoMCszZTgsJWEwOmxcKUBcKDArN2QwXCkKLTArMjY2IDxmb29cKygweHwpMjY2PiB0c3RsICVhMEBcKDArM2U4LCVhMTp3OjJcKUBcKDArN2QwXCkKLTArMjZlIDxmb29cKygweHwpMjZlPiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMjc0IDxmb29cKygweHwpMjc0PiB0c3RsICVhMEBcKDArM2U4LCVkMDpsXClAXCgwKzAwMFwpCi0wKzI3YSA8Zm9vXCsoMHh8KTI3YT4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzI4MiA8Zm9vXCsoMHh8KTI4Mj4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzI4OCA8Zm9vXCsoMHh8KTI4OD4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzI4ZSA8Zm9vXCsoMHh8KTI4ZT4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6bFwpQFwoMCs3ZDBcKQotMCsyOTQgPGZvb1wrKDB4fCkyOTQ+IHRzdGwgJWEwQFwoMCswMDAsJWQwOnc6MlwpQFwoMCswMDBcKQotMCsyOTggPGZvb1wrKDB4fCkyOTg+IHRzdGwgJWEwQFwoMCswMDAsJWQwOmxcKUBcKDArMDAwXCkKLTArMjljIDxmb29cKygweHwpMjljPiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMmEyIDxmb29cKygweHwpMmEyPiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMmE2IDxmb29cKygweHwpMmE2PiBwZWEgJXBjQFwoMCsyYjAgPGZvb1wrKDB4fCkyYjA+XCkKLTArMmFhIDxmb29cKygweHwpMmFhPiBwZWEgJXBjQFwoMCsyYjQgPGZvb1wrKDB4fCkyYjQ+XCkKLTArMmFlIDxmb29cKygweHwpMmFlPiBwZWEgJXBjQFwoMCsyYjggPGZvb1wrKDB4fCkyYjg+XCkKLTArMmIyIDxmb29cKygweHwpMmIyPiBwZWEgJXBjQFwoMCswMDAgPGZvbz5cKQotMCsyYjYgPGZvb1wrKDB4fCkyYjY+IHBlYSAlcGNAXCgwKzJjMCA8Zm9vXCsoMHh8KTJjMD4sJWQwOnc6MlwpCi0wKzJiYSA8Zm9vXCsoMHh8KTJiYT4gcGVhICVwY0BcKDArMmJjIDxmb29cKygweHwpMmJjPiwlZDA6dzoyXCkKLTArMmJlIDxmb29cKygweHwpMmJlPiBwZWEgJXBjQFwoMCsyYzggPGZvb1wrKDB4fCkyYzg+LCVkMDp3OjJcKQotMCsyYzIgPGZvb1wrKDB4fCkyYzI+IHBlYSAlcGNAXCgwKzJjYyA8Zm9vXCsoMHh8KTJjYz4sJWQwOmxcKQotMCsyYzYgPGZvb1wrKDB4fCkyYzY+IHBlYSAlcGNAXCgwKzJkMCA8Zm9vXCsoMHh8KTJkMD4sJWEwOmxcKQotMCsyY2EgPGZvb1wrKDB4fCkyY2E+IHBlYSAlcGNAXCgwKzJkNCA8Zm9vXCsoMHh8KTJkND4sJWQwOnc6MlwpCi0wKzJjZSA8Zm9vXCsoMHh8KTJjZT4gcGVhICVwY0BcKDArMmQ4IDxmb29cKygweHwpMmQ4PiwlZDA6bFwpCi0wKzJkMiA8Zm9vXCsoMHh8KTJkMj4gcGVhICVwY0BcKDArMmRjIDxmb29cKygweHwpMmRjPiwlYTA6bFwpCi0wKzJkNiA8Zm9vXCsoMHh8KTJkNj4gcGVhICVwY0BcKDArMmQ4IDxmb29cKygweHwpMmQ4PiwlZDA6dzoyXCkKLTArMmRhIDxmb29cKygweHwpMmRhPiBwZWEgJXBjQFwoMCsyZGMgPGZvb1wrKDB4fCkyZGM+LCVkMDpsXCkKLTArMmRlIDxmb29cKygweHwpMmRlPiBwZWEgJXBjQFwoMCsyZTAgPGZvb1wrKDB4fCkyZTA+LCVhMDpsXCkKLTArMmUyIDxmb29cKygweHwpMmUyPiBwZWEgJXBjQFwoMCs2Y2MgPC4qPiwlZDA6dzoyXCkKLTArMmU4IDxmb29cKygweHwpMmU4PiBwZWEgJXBjQFwoMCsxODk4YSA8Lio+XCkKLTArMmYwIDxmb29cKygweHwpMmYwPiBwZWEgJXBjQFwoMCs2ZGEgPC4qPiwlZDA6dzoyXCkKLTArMmY2IDxmb29cKygweHwpMmY2PiBwZWEgJXBjQFwoMCs2ZTAgPC4qPiwlZDA6bFwpCi0wKzJmYyA8Zm9vXCsoMHh8KTJmYz4gcGVhICVwY0BcKDArNmU2IDwuKj4sJWExOnc6MlwpCi0wKzMwMiA8Zm9vXCsoMHh8KTMwMj4gcGVhICVwY0BcKDArNmVjIDwuKj4sJWExOmxcKQotMCszMDggPGZvb1wrKDB4fCkzMDg+IHBlYSAlcGNAXCgwKzZmMiA8Lio+LCVkMDp3OjJcKQotMCszMGUgPGZvb1wrKDB4fCkzMGU+IHBlYSAlcGNAXCgwKzZmOCA8Lio+LCVkMDpsXCkKLTArMzE0IDxmb29cKygweHwpMzE0PiBwZWEgJXBjQFwoMCs2ZmUgPC4qPiwlYTE6bFwpCi0wKzMxYSA8Zm9vXCsoMHh8KTMxYT4gcGVhICVwY0BcKDArMTg5YmMgPC4qPlwpCi0wKzMyMiA8Zm9vXCsoMHh8KTMyMj4gcGVhICVwY0BcKDArMTg5YzQgPC4qPlwpCi0wKzMyYSA8Zm9vXCsoMHh8KTMyYT4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXCkKLTArMzMwIDxmb29cKygweHwpMzMwPiBwZWEgJXpwY0BcKDArMTg2YTBcKQotMCszMzggPGZvb1wrKDB4fCkzMzg+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpCi0wKzMzZSA8Zm9vXCsoMHh8KTMzZT4gcGVhICV6cGNAXCgwKzNlOCwlZDA6bFwpCi0wKzM0NCA8Zm9vXCsoMHh8KTM0ND4gcGVhICV6cGNAXCgwKzNlOCwlYTE6dzoyXCkKLTArMzRhIDxmb29cKygweHwpMzRhPiBwZWEgJXpwY0BcKDArM2U4LCVhMTpsXCkKLTArMzUwIDxmb29cKygweHwpMzUwPiBwZWEgJXpwY0BcKDArM2U4LCVkMDp3OjJcKQotMCszNTYgPGZvb1wrKDB4fCkzNTY+IHBlYSAlenBjQFwoMCszZTgsJWQwOmxcKQotMCszNWMgPGZvb1wrKDB4fCkzNWM+IHBlYSAlenBjQFwoMCszZTgsJWExOmxcKQotMCszNjIgPGZvb1wrKDB4fCkzNjI+IHBlYSAlenBjQFwoMCsxODZhMFwpCi0wKzM2YSA8Zm9vXCsoMHh8KTM2YT4gcGVhICV6cGNAXCgwKzE4NmEwXCkKLTArMzcyIDxmb29cKygweHwpMzcyPiBwZWEgJXBjQFwoMCs3NWMgPC4qPlwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzM3YSA8Zm9vXCsoMHh8KTM3YT4gcGVhICVwY0BcKDArNzY0IDwuKj5cKUBcKDArMDAwLCVkMDp3OjJcKQotMCszODAgPGZvb1wrKDB4fCkzODA+IHBlYSAlcGNAXCgwKzc2YSA8Lio+XClAXCgwKzdkMFwpCi0wKzM4OCA8Zm9vXCsoMHh8KTM4OD4gcGVhICVwY0BcKDArMzhhIDxmb29cKygweHwpMzhhPlwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzM4ZSA8Zm9vXCsoMHh8KTM4ZT4gcGVhICVwY0BcKDArMzkwIDxmb29cKygweHwpMzkwPlwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzM5MiA8Zm9vXCsoMHh8KTM5Mj4gcGVhICVwY0BcKDArMzk0IDxmb29cKygweHwpMzk0PlwpQFwoMCs3ZDBcKQotMCszOTggPGZvb1wrKDB4fCkzOTg+IHBlYSAlcGNAXCgwKzc4MiA8Lio+XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArM2EwIDxmb29cKygweHwpM2EwPiBwZWEgJXBjQFwoMCs3OGEgPC4qPlwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzNhNiA8Zm9vXCsoMHh8KTNhNj4gcGVhICVwY0BcKDArNzkwIDwuKj5cKUBcKDArN2QwXCkKLTArM2FlIDxmb29cKygweHwpM2FlPiBwZWEgJXBjQFwoMCszYjAgPGZvb1wrKDB4fCkzYjA+XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArM2I0IDxmb29cKygweHwpM2I0PiBwZWEgJXBjQFwoMCszYjYgPGZvb1wrKDB4fCkzYjY+XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArM2I4IDxmb29cKygweHwpM2I4PiBwZWEgJXBjQFwoMCszYmEgPGZvb1wrKDB4fCkzYmE+XClAXCgwKzdkMFwpCi0wKzNiZSA8Zm9vXCsoMHh8KTNiZT4gcGVhICV6cGNAXCgwKzNlOFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzNjNiA8Zm9vXCsoMHh8KTNjNj4gcGVhICV6cGNAXCgwKzNlOFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzNjYyA8Zm9vXCsoMHh8KTNjYz4gcGVhICV6cGNAXCgwKzNlOFwpQFwoMCs3ZDBcKQotMCszZDQgPGZvb1wrKDB4fCkzZDQ+IHBlYSAlenBjQFwoMCswMDBcKUBcKDArN2QwLCVkMDp3OjJcKQotMCszZGEgPGZvb1wrKDB4fCkzZGE+IHBlYSAlenBjQFwoMCswMDBcKUBcKDArMDAwLCVkMDp3OjJcKQotMCszZGUgPGZvb1wrKDB4fCkzZGU+IHBlYSAlenBjQFwoMCswMDBcKUBcKDArN2QwXCkKLTArM2U0IDxmb29cKygweHwpM2U0PiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArM2VjIDxmb29cKygweHwpM2VjPiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArM2YyIDxmb29cKygweHwpM2YyPiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzdkMFwpCi0wKzNmYSA8Zm9vXCsoMHh8KTNmYT4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzQwMCA8Zm9vXCsoMHh8KTQwMD4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzQwNCA8Zm9vXCsoMHh8KTQwND4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCs3ZDBcKQotMCs0MGEgPGZvb1wrKDB4fCk0MGE+IHBlYSAlcGNAXCgwKzdmNCA8Lio+LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNDEyIDxmb29cKygweHwpNDEyPiBwZWEgJXBjQFwoMCs3ZmMgPC4qPiwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzQxOCA8Zm9vXCsoMHh8KTQxOD4gcGVhICVwY0BcKDArNDFhIDxmb29cKygweHwpNDFhPiwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzQxZSA8Zm9vXCsoMHh8KTQxZT4gcGVhICVwY0BcKDArNDIwIDxmb29cKygweHwpNDIwPiwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzQyMiA8Zm9vXCsoMHh8KTQyMj4gcGVhICVwY0BcKDArODBjIDwuKj4sJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0MmEgPGZvb1wrKDB4fCk0MmE+IHBlYSAlcGNAXCgwKzgxNCA8Lio+LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNDMyIDxmb29cKygweHwpNDMyPiBwZWEgJXBjQFwoMCs4MWMgPC4qPiwlZDA6bFwpQFwoMCs3ZDBcKQotMCs0M2EgPGZvb1wrKDB4fCk0M2E+IHBlYSAlcGNAXCgwKzgyNCA8Lio+LCVhMTpsXClAXCgwKzdkMFwpCi0wKzQ0MiA8Zm9vXCsoMHh8KTQ0Mj4gcGVhICVwY0BcKDArODJjIDwuKj4sJWExOmxcKUBcKDArN2QwXCkKLTArNDRhIDxmb29cKygweHwpNDRhPiBwZWEgJXBjQFwoMCs4MzQgPC4qPiwlYTE6dzoyXClAXCgwKzdkMFwpCi0wKzQ1MiA8Zm9vXCsoMHh8KTQ1Mj4gcGVhICVwY0BcKDArODNjIDwuKj4sJWQwOnc6MlwpQFwoMCswMDBcKQotMCs0NTggPGZvb1wrKDB4fCk0NTg+IHBlYSAlcGNAXCgwKzg0MiA8Lio+LCVkMDpsXClAXCgwKzAwMFwpCi0wKzQ1ZSA8Zm9vXCsoMHh8KTQ1ZT4gcGVhICVwY0BcKDArODQ4IDwuKj4sJWExOmxcKUBcKDArMDAwXCkKLTArNDY0IDxmb29cKygweHwpNDY0PiBwZWEgJXBjQFwoMCs0NjYgPGZvb1wrKDB4fCk0NjY+LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNDZhIDxmb29cKygweHwpNDZhPiBwZWEgJXBjQFwoMCs0NmMgPGZvb1wrKDB4fCk0NmM+LCVhMDpsXClAXCgwKzdkMFwpCi0wKzQ3MCA8Zm9vXCsoMHh8KTQ3MD4gcGVhICVwY0BcKDArNDcyIDxmb29cKygweHwpNDcyPiwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzQ3NCA8Zm9vXCsoMHh8KTQ3ND4gcGVhICVwY0BcKDArNDc2IDxmb29cKygweHwpNDc2PiwlZDA6bFwpQFwoMCswMDBcKQotMCs0NzggPGZvb1wrKDB4fCk0Nzg+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0ODAgPGZvb1wrKDB4fCk0ODA+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpQFwoMCswMDBcKQotMCs0ODYgPGZvb1wrKDB4fCk0ODY+IHBlYSAlenBjQFwoMCswMDAsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0OGMgPGZvb1wrKDB4fCk0OGM+IHBlYSAlenBjQFwoMCswMDAsJWQwOnc6MlwpQFwoMCswMDBcKQotMCs0OTAgPGZvb1wrKDB4fCk0OTA+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0OTggPGZvb1wrKDB4fCk0OTg+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0YTAgPGZvb1wrKDB4fCk0YTA+IHBlYSAlenBjQFwoMCszZTgsJWQwOmxcKUBcKDArN2QwXCkKLTArNGE4IDxmb29cKygweHwpNGE4PiBwZWEgJXpwY0BcKDArM2U4LCVhMTpsXClAXCgwKzdkMFwpCi0wKzRiMCA8Zm9vXCsoMHh8KTRiMD4gcGVhICV6cGNAXCgwKzNlOCwlYTE6bFwpQFwoMCs3ZDBcKQotMCs0YjggPGZvb1wrKDB4fCk0Yjg+IHBlYSAlenBjQFwoMCszZTgsJWExOnc6MlwpQFwoMCs3ZDBcKQotMCs0YzAgPGZvb1wrKDB4fCk0YzA+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpQFwoMCswMDBcKQotMCs0YzYgPGZvb1wrKDB4fCk0YzY+IHBlYSAlenBjQFwoMCszZTgsJWQwOmxcKUBcKDArMDAwXCkKLTArNGNjIDxmb29cKygweHwpNGNjPiBwZWEgJXpwY0BcKDArM2U4LCVhMTpsXClAXCgwKzAwMFwpCi0wKzRkMiA8Zm9vXCsoMHh8KTRkMj4gcGVhICV6cGNAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzRkOCA8Zm9vXCsoMHh8KTRkOD4gcGVhICV6cGNAXCgwKzAwMCwlYTA6bFwpQFwoMCs3ZDBcKQotMCs0ZGUgPGZvb1wrKDB4fCk0ZGU+IHBlYSAlenBjQFwoMCswMDAsJWQwOnc6MlwpQFwoMCswMDBcKQotMCs0ZTIgPGZvb1wrKDB4fCk0ZTI+IHBlYSAlenBjQFwoMCswMDAsJWQwOmxcKUBcKDArMDAwXCkKLTArNGU2IDxmb29cKygweHwpNGU2PiB0c3RsIDArMDA0IDxmb29cKygweHwpND4KLTArNGVhIDxmb29cKygweHwpNGVhPiB0c3RsIDArMDA0IDxmb29cKygweHwpND4KLTArNGVlIDxmb29cKygweHwpNGVlPiB0c3RsIDArMDA0IDxmb29cKygweHwpND4KLTArNGYyIDxmb29cKygweHwpNGYyPiB0c3RsIDArMTg2YTAgPC4qPgotMCs0ZjggPGZvb1wrKDB4fCk0Zjg+IHRzdGwgMCswMDggPGZvb1wrKDB4fCk4PgotMCs0ZmUgPGZvb1wrKDB4fCk0ZmU+IHRzdGwgMCswMDggPGZvb1wrKDB4fCk4PgotMCs1MDQgPGZvb1wrKDB4fCk1MDQ+IGFkZGliICMxLCVkMAotMCs1MDggPGZvb1wrKDB4fCk1MDg+IGFkZGl3ICMxLCVkMAotMCs1MGMgPGZvb1wrKDB4fCk1MGM+IGFkZGlsICMxLCVkMAotMCs1MTIgPGZvb1wrKDB4fCk1MTI+IGFkZHFiICMxLCVkMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcGVyYW5kcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcGVyYW5kcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDlmNTZmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3BlcmFuZHMucworKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0jIFRlc3QgaGFuZGxpbmcgb2YgTUlUIGFuZCBNb3Rvcm9sYSBzeW50YXggb3BlcmFuZHMKLSMgSWYgeW91IGNoYW5nZSB0aGlzIGZpbGUsIHNlZSBhbHNvIG9wNjgwMDAuZC4KLQkudGV4dAotZm9vOgkKLQl8IERhdGEgcmVnaXN0ZXIgZGlyZWN0Ci0JdHN0bAklZDAKLQotCXwgQWRkcmVzcyByZWdpc3RlciBkaXJlY3QKLQl0c3RsCSVhMAotCi0JfCBBZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0Ci0JdHN0bAklYTBACi0JdHN0bAkoJWEwKQotCi0JfCBBZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdGluY3JlbWVudAotCXRzdGwJJWEwQCsKLQl0c3RsCSglYTApKwotCi0JfCBBZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlZGVjcmVtZW50Ci0JdHN0bAklYTBALQotCXRzdGwJLSglYTApCi0KLQl8IEFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKLQl0c3RsCSVhMEAoOCkKLQl0c3RsCSg4LCVhMCkKLQl0c3RsCTgoJWEwKQotCi0JfCBBZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0IHdpdGggaW5kZXggKDgtYml0IGRpc3BsYWNlbWVudCkKLQl0c3RsCSVhMEAoOCwlZDApCi0JdHN0bAklYTBAKDgsJWQwOncpCi0JdHN0bAklYTBAKDgsJWQwOnc6MSkKLQl0c3RsCSVhMEAoOCwlZDA6dzoyKQotCXRzdGwJJWEwQCg4LCVkMDp3OjQpCi0JdHN0bAklYTBAKDgsJWQwOnc6OCkKLQl0c3RsCSVhMEAoOCwlZDA6bCkKLQl0c3RsCSVhMEAoOCwlZDA6bDoxKQotCXRzdGwJJWEwQCg4LCVkMDpsOjIpCi0JdHN0bAklYTBAKDgsJWQwOmw6NCkKLQl0c3RsCSVhMEAoOCwlZDA6bDo4KQotCXRzdGwJJWEwQCglZDA6dzoyKQotCXRzdGwJKDgsJWEwLCVkMCkKLQl0c3RsCSg4LCVhMCwlZDAqMSkKLQl0c3RsCSg4LCVhMCwlZDAqMikKLQl0c3RsCSg4LCVhMCwlZDAqNCkKLQl0c3RsCSg4LCVhMCwlZDAqOCkKLQl0c3RsCSg4LCVhMCwlZDAudykKLQl0c3RsCSg4LCVhMCwlZDAudyoxKQotCXRzdGwJKDgsJWEwLCVkMC53KjIpCi0JdHN0bAkoOCwlYTAsJWQwLncqNCkKLQl0c3RsCSg4LCVhMCwlZDAudyo4KQotCXRzdGwJKDgsJWEwLCVkMC5sKQotCXRzdGwJKDgsJWEwLCVkMC5sKjEpCi0JdHN0bAkoOCwlYTAsJWQwLmwqMikKLQl0c3RsCSg4LCVhMCwlZDAubCo0KQotCXRzdGwJKDgsJWEwLCVkMC5sKjgpCi0JdHN0bAkoOCwlZDAsJWEwKQotCXRzdGwJKDgsJWExLncqMiwlYTApCi0JdHN0bAkoOCwlYTEsJWEwKQotCXRzdGwJOCglYTAsJWQwLncqMikKLQl0c3RsCTgoJWQwLncqMiwlYTApCi0JdHN0bAk4KCVhMS53KjIsJWEwKQotCXRzdGwJKCVhMCwlZDAudyoyKQotCXRzdGwJKCVkMC53KjIsJWEwKQotCi0JfCBBZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0IHdpdGggaW5kZXggKGJhc2UgZGlzcGxhY2VtZW50KQotCXRzdGwJJWEwQCgxMDAwLCVkMDp3OjIpCi0JdHN0bAlAKDEwMDAsJWQwOnc6MikKLQl0c3RsCUAoJWQwOnc6MikKLQl0c3RsCUAoMTAwMCkKLQl0c3RsCSVhMEAoMTAwMDAwKQotCXRzdGwJKDEwMDAsJWEwLCVkMC53KjIpCi0JdHN0bAkoMTAwMCwlZDAsJWEwKQotCXRzdGwJKDEwMDAsJWExLncqMiwlYTApCi0JdHN0bAkxMDAwKCVhMCwlZDAudyoyKQotCXRzdGwJMTAwMCglZDAsJWEwKQotCXRzdGwJKDEwMDAsJWQwLncqMikKLQl0c3RsCTEwMDAoJWQwLncqMikKLQl0c3RsCSglZDAudyoyKQotCXRzdGwJKDEwMDAwMCwlYTApCi0JdHN0bAkxMDAwMDAoJWEwKQotCXRzdGwJJXphMUAoMTAwMCwlZDA6dzoyKQotCXRzdGwJJXphMUAoMTAwMDAwKQotCXRzdGwJKDEwMDAsJXphMSwlZDAudyoyKQotCXRzdGwJKDEwMDAsJWQwLCV6YTEpCi0JdHN0bAkoMTAwMCwlYTEudyoyLCV6YTEpCi0JdHN0bAkxMDAwKCV6YTEsJWQwLncqMikKLQl0c3RsCTEwMDAoJWQwLCV6YTEpCi0JdHN0bAkoMTAwMDAwLCV6YTEpCi0JdHN0bAkxMDAwMDAoJXphMSkKLQl0c3RsCSVhMEAoMTAwMCwlemQxOnc6MikKLQl0c3RsCUAoMTAwMCwlemQxOnc6MikKLQl0c3RsCUAoJXpkMTp3OjIpCi0JdHN0bAkoMTAwMCwlYTAsJXpkMS53KjIpCi0JdHN0bAkoMTAwMCwlemQxLCVhMCkKLQl0c3RsCSgxMDAwLCV6YTEudyoyLCVhMCkKLQl0c3RsCTEwMDAoJWEwLCV6ZDEudyoyKQotCXRzdGwJMTAwMCglemQxLCVhMCkKLQl0c3RsCSgxMDAwLCV6ZDEudyoyKQotCXRzdGwJMTAwMCglemQxLncqMikKLQl0c3RsCSglemQxLncqMikKLQotCXwgTWVtb3J5IGluZGlyZWN0IHBvc3RpbmRleGVkCi0JdHN0bAklYTBAKDEwMDApQCgyMDAwLCVkMDp3OjIpCi0JdHN0bAklYTBAKDEwMDApQCglZDA6dzoyKQotCXRzdGwJJWEwQCgxMDAwKUAoMjAwMCkKLQl0c3RsCUAoMTAwMClAKDIwMDAsJWQwOnc6MikKLQl0c3RsCUAoMTAwMClAKCVkMDp3OjIpCi0JdHN0bAlAKDEwMDApQCgyMDAwKQotCXRzdGwJJWEwQCgwKUAoMjAwMCwlZDA6dzoyKQotCXRzdGwJJWEwQCgwKUAoJWQwOnc6MikKLQl0c3RsCSVhMEAoMClAKDIwMDApCi0JdHN0bAlAKDApQCgyMDAwLCVkMDp3OjIpCi0JdHN0bAlAKDApQCglZDA6dzoyKQotCXRzdGwJQCgwKUAoMjAwMCkKLQl0c3RsCShbMTAwMCwlYTBdLCVkMDp3OjIsMjAwMCkKLQl0c3RsCShbMTAwMCwlYTBdLCVkMDp3OjIpCi0JdHN0bAkoWzEwMDAsJWEwXSwyMDAwKQotCXRzdGwJKFsxMDAwXSwlZDA6dzoyLDIwMDApCi0JdHN0bAkoWzEwMDBdLCVkMDp3OjIpCi0JdHN0bAkoWzEwMDBdLDIwMDApCi0JdHN0bAkoWyVhMF0sJWQwOnc6MiwyMDAwKQotCXRzdGwJKFslYTBdLCVkMDp3OjIpCi0JdHN0bAkoWyVhMF0sMjAwMCkKLQl0c3RsCShbMF0sJWQwOnc6MiwyMDAwKQotCXRzdGwJKFswXSwlZDA6dzoyKQotCXRzdGwJKFswXSwyMDAwKQotCi0JfCBNZW1vcnkgaW5kaXJlY3QgcHJlaW5kZXhlZAotCXRzdGwJJWEwQCgxMDAwLCVkMDp3OjIpQCgyMDAwKQotCXRzdGwJJWEwQCgxMDAwLCVkMDp3OjIpQCgwKQotCXRzdGwJQCgxMDAwLCVkMDp3OjIpQCgyMDAwKQotCXRzdGwJQCgxMDAwLCVkMDp3OjIpQCgwKQotCXRzdGwJJWEwQCglZDA6dzoyKUAoMjAwMCkKLQl0c3RsCSVhMEAoJWQwOnc6MilAKDApCi0JdHN0bAlAKCVkMDp3OjIpQCgyMDAwKQotCXRzdGwJQCglZDA6dzoyKUAoMCkKLQl0c3RsCShbMTAwMCwlYTAsJWQwOnc6Ml0sMjAwMCkKLQl0c3RsCShbMTAwMCwlZDA6dzoyLCVhMF0sMjAwMCkKLQl0c3RsCShbMTAwMCwlZDAsJWEwXSwyMDAwKQotCXRzdGwJKFsxMDAwLCVhMSwlYTBdLDIwMDApCi0JdHN0bAkoWzEwMDAsJWExOnc6MiwlYTBdLDIwMDApCi0JdHN0bAkoWzEwMDAsJWEwLCVkMDp3OjJdKQotCXRzdGwJKFsxMDAwLCVkMCwlYTBdKQotCXRzdGwJKFsxMDAwLCVkMDp3OjJdLDIwMDApCi0JdHN0bAkoWzEwMDAsJWQwOnc6Ml0pCi0JdHN0bAkoWyVhMCwlZDA6dzoyXSwyMDAwKQotCXRzdGwJKFslZDAsJWEwXSwyMDAwKQotCXRzdGwJKFslYTAsJWQwOnc6Ml0pCi0JdHN0bAkoWyVkMCwlYTBdKQotCXRzdGwJKFslZDA6dzoyXSwyMDAwKQotCXRzdGwJKFslZDA6dzoyXSkKLQotCXwgUHJvZ3JhbSBjb3VudGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci0JcGVhCSVwY0AoOCkKLQlwZWEJKDgsJXBjKQotCXBlYQk4KCVwYykKLQlwZWEJZm9vCi0KLQl8IFByb2dyYW0gY291bnRlciBpbmRpcmVjdCB3aXRoIGluZGV4ICg4LWJpdCBkaXNwbGFjZW1lbnQpCi0JcGVhCSVwY0AoOCwlZDA6dzoyKQotCXBlYQklcGNAKCVkMDp3OjIpCi0JcGVhCSg4LCVwYywlZDAudyoyKQotCXBlYQkoOCwlZDAsJXBjKQotCXBlYQkoOCwlYTAsJXBjKQotCXBlYQk4KCVwYywlZDAudyoyKQotCXBlYQk4KCVkMCwlcGMpCi0JcGVhCTgoJWEwLCVwYykKLQlwZWEJKCVwYywlZDAudyoyKQotCXBlYQkoJWQwLCVwYykKLQlwZWEJKCVhMCwlcGMpCi0KLQl8IFByb2dyYW0gY291bnRlciBpbmRpcmVjdCB3aXRoIGluZGV4IChiYXNlIGRpc3BsYWNlbWVudCkKLQlwZWEJJXBjQCgxMDAwLCVkMDp3OjIpCi0JcGVhCSVwY0AoMTAwMDAwKQotCXBlYQkoMTAwMCwlcGMsJWQwLncqMikKLQlwZWEJKDEwMDAsJWQwLCVwYykKLQlwZWEJKDEwMDAsJWExLncqMiwlcGMpCi0JcGVhCSgxMDAwLCVhMSwlcGMpCi0JcGVhCTEwMDAoJXBjLCVkMC53KjIpCi0JcGVhCTEwMDAoJWQwLCVwYykKLQlwZWEJMTAwMCglYTEsJXBjKQotCXBlYQkoMTAwMDAwLCVwYykKLQlwZWEJMTAwMDAwKCVwYykKLQlwZWEJJXpwY0AoMTAwMCwlZDA6dzoyKQotCXBlYQklenBjQCgxMDAwMDApCi0JcGVhCSgxMDAwLCV6cGMsJWQwLncqMikKLQlwZWEJKDEwMDAsJWQwLCV6cGMpCi0JcGVhCSgxMDAwLCVhMS53KjIsJXpwYykKLQlwZWEJKDEwMDAsJWExLCV6cGMpCi0JcGVhCTEwMDAoJXpwYywlZDAudyoyKQotCXBlYQkxMDAwKCVkMCwlenBjKQotCXBlYQkxMDAwKCVhMSwlenBjKQotCXBlYQkoMTAwMDAwLCV6cGMpCi0JcGVhCTEwMDAwMCglenBjKQotCi0JfCBQcm9ncmFtIGNvdW50ZXIgbWVtb3J5IGluZGlyZWN0IHBvc3RpbmRleGVkCi0JcGVhCSVwY0AoMTAwMClAKDIwMDAsJWQwOnc6MikKLQlwZWEJJXBjQCgxMDAwKUAoJWQwOnc6MikKLQlwZWEJJXBjQCgxMDAwKUAoMjAwMCkKLQlwZWEJJXBjQCgwKUAoMjAwMCwlZDA6dzoyKQotCXBlYQklcGNAKDApQCglZDA6dzoyKQotCXBlYQklcGNAKDApQCgyMDAwKQotCXBlYQkoWzEwMDAsJXBjXSwlZDA6dzoyLDIwMDApCi0JcGVhCShbMTAwMCwlcGNdLCVkMDp3OjIpCi0JcGVhCShbMTAwMCwlcGNdLDIwMDApCi0JcGVhCShbJXBjXSwlZDA6dzoyLDIwMDApCi0JcGVhCShbJXBjXSwlZDA6dzoyKQotCXBlYQkoWyVwY10sMjAwMCkKLQlwZWEJJXpwY0AoMTAwMClAKDIwMDAsJWQwOnc6MikKLQlwZWEJJXpwY0AoMTAwMClAKCVkMDp3OjIpCi0JcGVhCSV6cGNAKDEwMDApQCgyMDAwKQotCXBlYQklenBjQCgwKUAoMjAwMCwlZDA6dzoyKQotCXBlYQklenBjQCgwKUAoJWQwOnc6MikKLQlwZWEJJXpwY0AoMClAKDIwMDApCi0JcGVhCShbMTAwMCwlenBjXSwlZDA6dzoyLDIwMDApCi0JcGVhCShbMTAwMCwlenBjXSwlZDA6dzoyKQotCXBlYQkoWzEwMDAsJXpwY10sMjAwMCkKLQlwZWEJKFslenBjXSwlZDA6dzoyLDIwMDApCi0JcGVhCShbJXpwY10sJWQwOnc6MikKLQlwZWEJKFslenBjXSwyMDAwKQotCi0JfCBQcm9ncmFtIGNvdW50ZXIgbWVtb3J5IGluZGlyZWN0IHByZWluZGV4ZWQKLQlwZWEJJXBjQCgxMDAwLCVkMDp3OjIpQCgyMDAwKQotCXBlYQklcGNAKDEwMDAsJWQwOnc6MilAKDApCi0JcGVhCSVwY0AoJWQwOnc6MilAKDIwMDApCi0JcGVhCSVwY0AoJWQwOnc6MilAKDApCi0JcGVhCShbMTAwMCwlcGMsJWQwOnc6Ml0sMjAwMCkKLQlwZWEJKFsxMDAwLCVkMDp3OjIsJXBjXSwyMDAwKQotCXBlYQkoWzEwMDAsJWQwLCVwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCVhMSwlcGNdLDIwMDApCi0JcGVhCShbMTAwMCwlcGMsJWExXSwyMDAwKQotCXBlYQkoWzEwMDAsJWExOnc6MiwlcGNdLDIwMDApCi0JcGVhCShbMTAwMCwlcGMsJWQwOnc6Ml0pCi0JcGVhCShbMTAwMCwlZDAsJXBjXSkKLQlwZWEJKFsxMDAwLCVhMSwlcGNdKQotCXBlYQkoWyVwYywlZDA6dzoyXSwyMDAwKQotCXBlYQkoWyVwYywlYTBdLDIwMDApCi0JcGVhCShbJXBjLCVkMDp3OjJdKQotCXBlYQkoWyVkMCwlcGNdKQotCXBlYQklenBjQCgxMDAwLCVkMDp3OjIpQCgyMDAwKQotCXBlYQklenBjQCgxMDAwLCVkMDp3OjIpQCgwKQotCXBlYQklenBjQCglZDA6dzoyKUAoMjAwMCkKLQlwZWEJJXpwY0AoJWQwOnc6MilAKDApCi0JcGVhCShbMTAwMCwlenBjLCVkMDp3OjJdLDIwMDApCi0JcGVhCShbMTAwMCwlZDA6dzoyLCV6cGNdLDIwMDApCi0JcGVhCShbMTAwMCwlZDAsJXpwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCVhMSwlenBjXSwyMDAwKQotCXBlYQkoWzEwMDAsJXpwYywlYTFdLDIwMDApCi0JcGVhCShbMTAwMCwlYTE6dzoyLCV6cGNdLDIwMDApCi0JcGVhCShbMTAwMCwlenBjLCVkMDp3OjJdKQotCXBlYQkoWzEwMDAsJWQwLCV6cGNdKQotCXBlYQkoWzEwMDAsJWExLCV6cGNdKQotCXBlYQkoWyV6cGMsJWQwOnc6Ml0sMjAwMCkKLQlwZWEJKFslenBjLCVhMF0sMjAwMCkKLQlwZWEJKFslenBjLCVkMDp3OjJdKQotCXBlYQkoWyVkMCwlenBjXSkKLQotCXwgQWJzb2x1dGUgc2hvcnQKLQl0c3RsCTQKLQl0c3RsCTQudwotCXRzdGwJKDQpLncKLQotCXwgQWJzb2x1dGUgbG9uZwotCXRzdGwJMTAwMDAwCi0JdHN0bAk4LmwKLQl0c3RsCSg4KS5sCi0KLQl8IEltbWVkaWF0ZQotCWFkZGliCSYxLCVkMAotCWFkZGl3CSYxLCVkMAotCWFkZGlsCSYxLCVkMAotCWFkZHFiCSYxLCVkMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wMjQxMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wMjQxMC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjAzMzdhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcDI0MTAucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS50ZXh0Ci1zdGFydDoJbm9wCi0Jbm9wCi0Jbm9wCi0JYnJhcyBsYWJlbDEKLQlicmFzIGxhYmVsMgotLmdsb2JsIGxhYmVsMQotbGFiZWwxOglub3AKLQkuc3BhY2UgMHhhMAotCW5vcAotCW5vcAotLmdsb2JsIGxhYmVsMgotbGFiZWwyOglicmFzIGxhYmVsMQotCWJyYXMgbGFiZWwyCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3AyNjYzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3AyNjYzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMzY1MGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wMjY2My5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotfAotfCBUaGlzIGNvZGUgZ2VuZXJhdGVzIGFuIGluY29ycmVjdCBwYyByZWxhdGl2ZSBvZmZzZXQgCi18Ci1idWc6ICAgICAgIG1vdmVsICAjNCwlZDcKLSAgICAgICAgICAganNyICAgIHRhYmxlKCVwYywlZDcudykgICAgICAgICAgICB8IHdyb25nCi0gICAgICAgICAgIGpzciAgICAlcGNAKHRhYmxlLS4tMjpiLCVkNzp3KSAgICAgfCBjb3JyZWN0IGJ1dCBjcnlwdGljCi0gICAgICAgICAgIG5vcAotICAgICAgICAgICBub3AKLXRhYmxlOgotICAgICAgICAgICBicmEgICAganVuawotICAgICAgICAgICBicmEgICAganVuawotICAgICAgICAgICBicmEgICAganVuawotCi1qdW5rOgotICAgIG5vcAotICAgIHJ0cwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wY3JlbC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wY3JlbC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDk4MzU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGNyZWwuZAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSNuYW1lOiBwY3JlbAotI29iamR1bXA6IC1kcnMgLWogLnRleHQgLS1wcmVmaXgtYWRkcmVzc2VzCi0KLS4qOiAgICAgZmlsZSBmb3JtYXQgLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLSAwMDAwIDRlNzE0ZTcxIDRjZmEwMzAwIGZmZmE0Y2ZhIDAzMDBmZmY0ICBOcU5xTC4uLi4uTC4uLi4uCi0gMDAxMCA0Y2ZiMDMwMCAwOGVlNDFmYSBmZmVhNDFmYSBmZmU2NDFmYSAgTC4uLi4uQS4uLkEuLi5BLgotIDAwMjAgZmY2MjQxZmIgMDhkZTQxZmIgMDhkYTQxZmIgMDhkNjQxZmIgIC5iQS4uLkEuLi5BLi4uQS4KLSAwMDMwIDA5MjBmZmQyIDQxZmIwOTIwIGZmY2M0MWZiIDA5MzBmZmZmICAuIC4uQS4uIC4uQS4uMC4uCi0gMDA0MCBmZmM2NDFmYiAwOTMwZmZmZiBmZmJlNGU3MSA2MWZmMDAwMCAgLi5BLi4wLi4uLk5xYS4uLgotIDAwNTAgMDA1ODYxMDAgMDA1MjYxNGUgNjE0YzRlNzEgNDFmOTAwMDAgIC5YYS4uUmFOYUxOcUEuLi4KLSAwMDYwIDAwKGE2fDAwKTQxZmEgMDA0MjQxZmEgMDBiZTQxZmIgMDgzYTQxZmIgIC4uQS4uQkEuLi5BLi46QS4KLSAwMDcwIDA4MzY0MWZiIDA4MzI0MWZiIDA5MjAwMDJlIDQxZmIwOTIwICAuNkEuLjJBLi4gLi5BLi4gCi0gMDA4MCAwMDI4NDFmYiAwOTMwMDAwMCAwMDIyNDFmYiAwOTMwMDAwMCAgLlwoQS4uMC4uLiJBLi4wLi4KLSAwMDkwIDAwMWE0MWZiIDA5MzAwMDAwIDAwMTI0MWZiIDA5MjAwMDBhICAuLkEuLjAuLi4uQS4uIC4uCi0gMDBhMCA0MWZiMDgwNCA0ZTcxNGU3MSA0ZTcxNDFmYiAwODgwNDFmYiAgQS4uLk5xTnFOcUEuLi5BLgotIDAwYjAgMDkyMGZmN2YgNDFmYjA5MjAgODAwMDQxZmIgMDkzMGZmZmYgIC4gLi5BLi4gLi5BLi4wLi4KLSAwMGMwIDdmZmY0ZTcxIDQxZmIwODdmIDQxZmIwOTIwIDAwODA0MWZiICAuLk5xQS4uLkEuLiAuLkEuCi0gMDBkMCAwOTIwN2ZmZiA0MWZiMDkzMCAwMDAwODAwMCA0ZTcxNDFmYSAgLiAuLkEuLjAuLi4uTnFBLgotIDAwZTAgODAwMDQxZmIgMDE3MGZmZmYgN2ZmZjRlNzEgNDFmYTdmZmYgIC4uQS4ucC4uLi5OcUEuLi4KLSAwMGYwIDQxZmIwMTcwIDAwMDA4MDAwIDRlNzE0MWZiIDAxNzAoZmZmZnwwMDAwKSAgQS4ucC4uLi5OcUEuLnAuLgotIDAxMDAgKGZmMDR8MDAwMCk0MWZiIDA5MzAoZmZmZnwwMDAwKSAoZmVmY3wwMDAwKTRlNzEgNDFmOTAwMDAgIC4uQS4uMC4uLi5OcUEuLi4KLSAwMTEwIDAwMDAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICAuLi4uLi4uLi4uLi4uLi4uCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKLTArMDAwMCA8Lio+IG5vcAotMCswMDAyIDxsYmxfYj4gbm9wCi0wKzAwMDQgPGxibF9iXCsoMHh8KTI+IG1vdmVtbCAlcGNAXCgwKzAwMDIgPGxibF9iPlwpLCVhMC0lYTEKLTArMDAwYSA8bGJsX2JcKygweHwpOD4gbW92ZW1sICVwY0BcKDArMDAwMiA8bGJsX2I+XCksJWEwLSVhMQotMCswMDEwIDxsYmxfYlwrKDB4fCllPiBtb3ZlbWwgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwLSVhMQotMCswMDE2IDxsYmxfYlwrKDB4fCkxND4gbGVhICVwY0BcKDArMDAwMiA8bGJsX2I+XCksJWEwCi0wKzAwMWEgPGxibF9iXCsoMHh8KTE4PiBsZWEgJXBjQFwoMCswMDAyIDxsYmxfYj5cKSwlYTAKLTArMDAxZSA8bGJsX2JcKygweHwpMWM+IGxlYSAlcGNAXChmK2ZmODIgPC4qPlwpLCVhMAotMCswMDIyIDxsYmxfYlwrKDB4fCkyMD4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDI2IDxsYmxfYlwrKDB4fCkyND4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDJhIDxsYmxfYlwrKDB4fCkyOD4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDJlIDxsYmxfYlwrKDB4fCkyYz4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDM0IDxsYmxfYlwrKDB4fCkzMj4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDNhIDxsYmxfYlwrKDB4fCkzOD4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDQyIDxsYmxfYlwrKDB4fCk0MD4gbGVhICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMAotMCswMDRhIDxsYmxfYlwrKDB4fCk0OD4gbm9wCi0wKzAwNGMgPGxibF9iXCsoMHh8KTRhPiBic3JsIDArMDBhNiA8bGJsX2E+Ci0wKzAwNTIgPGxibF9iXCsoMHh8KTUwPiBic3J3IDArMDBhNiA8bGJsX2E+Ci0wKzAwNTYgPGxibF9iXCsoMHh8KTU0PiBic3JzIDArMDBhNiA8bGJsX2E+Ci0wKzAwNTggPGxibF9iXCsoMHh8KTU2PiBic3JzIDArMDBhNiA8bGJsX2E+Ci0wKzAwNWEgPGxibF9iXCsoMHh8KTU4PiBub3AKLTArMDA1YyA8bGJsX2JcKygweHwpNWE+IGxlYSAoMCswMGE2IDxsYmxfYT58MCswIDwuKj4pLCVhMAotCQkJNWU6ICgzMglcLnRleHR8Ul82OEtfMzIJXC50ZXh0XCsweGE2KQotMCswMDYyIDxsYmxfYlwrKDB4fCk2MD4gbGVhICVwY0BcKDArMDBhNiA8bGJsX2E+XCksJWEwCi0wKzAwNjYgPGxibF9iXCsoMHh8KTY0PiBsZWEgJXBjQFwoMCswMTI2IDwuKj5cKSwlYTAKLTArMDA2YSA8bGJsX2JcKygweHwpNjg+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA2ZSA8bGJsX2JcKygweHwpNmM+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA3MiA8bGJsX2JcKygweHwpNzA+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA3NiA8bGJsX2JcKygweHwpNzQ+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA3YyA8bGJsX2JcKygweHwpN2E+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA4MiA8bGJsX2JcKygweHwpODA+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA4YSA8bGJsX2JcKygweHwpODg+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA5MiA8bGJsX2JcKygweHwpOTA+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDA5YSA8bGJsX2JcKygweHwpOTg+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDBhMCA8bGJsX2JcKygweHwpOWU+IGxlYSAlcGNAXCgwK2E2IDxsYmxfYT4sJWQwOmxcKSwlYTAKLTArMDBhNCA8bGJsX2JcKygweHwpYTI+IG5vcAotMCswMGE2IDxsYmxfYT4gbm9wCi0wKzAwYTggPGxibF9hXCsoMHh8KTI+IG5vcAotMCswMGFhIDxsYmxfYVwrKDB4fCk0PiBsZWEgJXBjQFwoMCsyYyA8bGJsX2JcKygweHwpMmE+LCVkMDpsXCksJWEwCi0wKzAwYWUgPGxibF9hXCsoMHh8KTg+IGxlYSAlcGNAXCgwKzJmIDxsYmxfYlwrKDB4fCkyZD4sJWQwOmxcKSwlYTAKLTArMDBiNCA8bGJsX2FcKygweHwpZT4gbGVhICVwY0BcKGYrODBiNiA8Lio+LCVkMDpsXCksJWEwCi0wKzAwYmEgPGxibF9hXCsoMHh8KTE0PiBsZWEgJXBjQFwoZis4MGJiIDwuKj4sJWQwOmxcKSwlYTAKLTArMDBjMiA8bGJsX2FcKygweHwpMWM+IG5vcAotMCswMGM0IDxsYmxfYVwrKDB4fCkxZT4gbGVhICVwY0BcKDArMTQ1IDwuKj4sJWQwOmxcKSwlYTAKLTArMDBjOCA8bGJsX2FcKygweHwpMjI+IGxlYSAlcGNAXCgwKzE0YSA8Lio+LCVkMDpsXCksJWEwCi0wKzAwY2UgPGxibF9hXCsoMHh8KTI4PiBsZWEgJXBjQFwoMCs4MGNmIDwuKj4sJWQwOmxcKSwlYTAKLTArMDBkNCA8bGJsX2FcKygweHwpMmU+IGxlYSAlcGNAXCgwKzgwZDYgPC4qPiwlZDA6bFwpLCVhMAotMCswMGRjIDxsYmxfYVwrKDB4fCkzNj4gbm9wCi0wKzAwZGUgPGxibF9hXCsoMHh8KTM4PiBsZWEgJXBjQFwoZis4MGUwIDwuKj5cKSwlYTAKLTArMDBlMiA8bGJsX2FcKygweHwpM2M+IGxlYSAlcGNAXChmKzgwZTMgPC4qPlwpLCVhMAotMCswMGVhIDxsYmxfYVwrKDB4fCk0ND4gbm9wCi0wKzAwZWMgPGxibF9hXCsoMHh8KTQ2PiBsZWEgJXBjQFwoMCs4MGVkIDwuKj5cKSwlYTAKLTArMDBmMCA8bGJsX2FcKygweHwpNGE+IGxlYSAlcGNAXCgwKzgwZjIgPC4qPlwpLCVhMAotMCswMGY4IDxsYmxfYVwrKDB4fCk1Mj4gbm9wCi0wKzAwZmEgPGxibF9hXCsoMHh8KTU0PiBsZWEgJXBjQFwoKDArMCA8Lio+fDArMGZjIDxsYmxfYVwrKDB4fCk1Nj4pXCksJWEwCi0JCQlmZTogKERJU1AzMgl1bmRlZnxSXzY4S19QQzMyCXVuZGVmXCsweDIpCi0wKzAxMDIgPGxibF9hXCsoMHh8KTVjPiBsZWEgJXBjQFwoKDArMCA8Lio+fDArMDEwNCA8bGJsX2FcKygweHwpNWU+KSwlZDA6bFwpLCVhMAotCQkJMTA2OiAoRElTUDMyCXVuZGVmfFJfNjhLX1BDMzIJdW5kZWZcKzB4MikKLTArMDEwYSA8bGJsX2FcKygweHwpNjQ+IG5vcAotMCswMTBjIDxsYmxfYVwrKDB4fCk2Nj4gbGVhIDArMCA8Lio+LCVhMAotCQkJMTBlOiAoUl82OEtfKT8zMgl1bmRlZgotMCswMTEyIDxsYmxfYVwrKDB4fCk2Yz4gbm9wCi0wKzAxMTQgPGxibF9hXCsoMHh8KTZlPiBvcmliICMwLCVkMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wY3JlbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wY3JlbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzVjMjJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGNyZWwucworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLQlub3AKLWxibF9iOglub3AKLQltb3ZlbWwJbGJsX2IsJWEwLSVhMQotCW1vdmVtbAklcGNAKGxibF9iKSwlYTAtJWExCi0JbW92ZW1sCSVwY0AobGJsX2IsJWQwKSwlYTAtJWExCi0JbGVhCWxibF9iLCVhMAotCWxlYQklcGNAKGxibF9iKSwlYTAKLQlsZWEJJXBjQChsYmxfYi0xMjgpLCVhMAotCWxlYQklcGNAKGxibF9iLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2I6YiwlZDApLCVhMAotCWxlYQklcGNAKGxibF9iLS4tMjpiLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2I6dywlZDApLCVhMAotCWxlYQklcGNAKGxibF9iLS4tMjp3LCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2I6bCwlZDApLCVhMAotCWxlYQklcGNAKGxibF9iLS4tMjpsLCVkMCksJWEwCi0Jbm9wCi0JYnNybAlsYmxfYQotCWJzcglsYmxfYQotCWJzcnMJbGJsX2EKLQlqYnNyCWxibF9hCi0Jbm9wCi0JbGVhCWxibF9hLCVhMAotCWxlYQklcGNAKGxibF9hKSwlYTAKLQlsZWEJJXBjQChsYmxfYSsxMjgpLCVhMAotCWxlYQklcGNAKGxibF9hLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2E6YiwlZDApLCVhMAotCWxlYQklcGNAKGxibF9hLS4tMjpiLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2E6dywlZDApLCVhMAotCWxlYQklcGNAKGxibF9hLS4tMjp3LCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2E6bCwlZDApLCVhMAotCWxlYQklcGNAKGxibF9hLS4tMjpsLCVkMCksJWEwCi0JbGVhCSVwY0AoMTg6bCwlZDApLCVhMAotCWxlYQklcGNAKDEwOncsJWQwKSwlYTAKLQlsZWEJJXBjQCg0OmIsJWQwKSwlYTAKLQlub3AKLWxibF9hOglub3AKLQlub3AKLQlsZWEJJXBjQCguLTEyNiwlZDApLCVhMAotCWxlYQklcGNAKC4tMTI3LCVkMCksJWEwCi0JbGVhCSVwY0AoLi0zMjc2NiwlZDApLCVhMAotCWxlYQklcGNAKC4tMzI3NjcsJWQwKSwlYTAKLQlub3AKLQlsZWEJJXBjQCguKzEyOSwlZDApLCVhMAotCWxlYQklcGNAKC4rMTMwLCVkMCksJWEwCi0JbGVhCSVwY0AoLiszMjc2OSwlZDApLCVhMAotCWxlYQklcGNAKC4rMzI3NzAsJWQwKSwlYTAKLQlub3AKLQlsZWEJJXBjQCguLTMyNzY2KSwlYTAKLQlsZWEJJXBjQCguLTMyNzY3KSwlYTAKLQlub3AKLQlsZWEJJXBjQCguKzMyNzY5KSwlYTAKLQlsZWEJJXBjQCguKzMyNzcwKSwlYTAKLQlub3AKLQlsZWEJJXBjQCh1bmRlZiksJWEwCi0JbGVhCSVwY0AodW5kZWYsJWQwKSwlYTAKLQlub3AKLQlsZWEJdW5kZWYsJWEwCi0Jbm9wCi0JLmxvbmcgMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9waWMxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BpYzEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3ODc3NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BpYzEucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci0JLmdsb2JsIF9mb28KLV9mb286Ci0JbGVhbCAlcGNAKF9pKSwgJWEwCi0JbGVhbCAlcGNAKF9pLS4pLCAlYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvdDIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvdDIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxMDljOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3QyLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNQUk9HOiBubQotI25hbWU6IHByZXNlbmNlIG9mIHNlY3Rpb24gc3ltYm9scwotCi0wMDAwMDAxMiBiIC5ic3MKLTAwMDAwMDBlIGQgLmRhdGEKLTAwMDAwMDAwIHQgLnRleHQKLTAwMDAwMDBlIGQgbG9vcDEKLTAwMDAwMDAwIHQgbG9vcDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvdDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvdDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I3MWU4Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3QyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQkudGV4dAotbG9vcDI6CQotCW1vdmUubAklZDEsJWEwQCsKLQlkYmYJJWQwLGxvb3AxCi0JLmRhdGEKLWxvb3AxOglicmEJbG9vcDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvaW5pdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZDkyNTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogcGFkZGluZyBvZiAuaW5pdCBzZWN0aW9uCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLmluaXQ6Ci0wMDAwMDAwMCA8LmluaXQ+IHN1YnUgICAgICAgIHIzMSxyMzEsMHgxMAotMDAwMDAwMDQgPC5pbml0XCsweDQ+IHN0ICAgICAgICAgIHIxMyxyMzEsMHgyMAotMDAwMDAwMDggPC5pbml0XCsweDg+IG9yICAgICAgICAgIHIwLHIwLHIwCi0wMDAwMDAwYyA8LmluaXRcKzB4Yz4gb3IgICAgICAgICAgcjAscjAscjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvaW5pdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NjgxY2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTsgVGVzdCBwcm9wZXIgcGFkZGluZyBvZiB0aGUgLmluaXQgc2VjdGlvbgotCXNlY3Rpb24JIC5pbml0LCJ4IgotCWFsaWduCSA0Ci0Jc3VidQkgcjMxLHIzMSwxNgotCXN0CSByMTMscjMxLDMyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL204OGsuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9tODhrLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwN2MxMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL204OGsuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIwotIyBUZXN0cyBmb3IgbTg4ayBzdnIzIHRhcmdldHMKLSMKLWlmIHsgW2lzdGFyZ2V0IG04OCotKi1zeXN2M10gfHwgW2lzdGFyZ2V0IG04OCotKi1jb2ZmKiBdIH0gdGhlbiB7Ci0gICAgc2V0IHRlc3RuYW1lICJQcm9wZXIgcGFkZGluZyBvZiAuaW5pdCBzZWN0aW9uIgotICAgIHJ1bl9kdW1wX3Rlc3QgaW5pdAotfQotaWYgW2luZm8gZXhpc3RzIGVycm9ySW5mb10gdGhlbiB7Ci0gICAgdW5zZXQgZXJyb3JJbmZvCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvZXJyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvZXJyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTc2MzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2Vyci5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLm1hY3JvCW0KLQltCi0JLmVuZG0KLQotCW0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9pcnAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9pcnAuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkN2JjZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNuYW1lOiBtYWNybyBpcnAKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIC4qCi1PRkZTRVRbIAldK1RZUEVbIAldK1ZBTFVFLioKLTArMDBbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzEKLTArMDRbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzIKLTArMDhbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzMKLTArMGNbIAldK1thLXpBLVowLTlfXStbIAldK2JhcjEKLTArMTBbIAldK1thLXpBLVowLTlfXStbIAldK2JhcjIKLTArMTRbIAldK1thLXpBLVowLTlfXStbIAldK2JhcjMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9pcnAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9pcnAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM3ZGQ1NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkuaXJwCXBhcmFtLDEsMiwzCi0JLmxvbmcJZm9vXHBhcmFtCi0JLmVuZHIKLQotCS5pcnBjCXBhcmFtLDEyMwotCS5sb25nCWJhclxwYXJhbQotCS5lbmRyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9tYWNyb3MuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL21hY3Jvcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWU0ODUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL21hY3Jvcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIFJ1biBzb21lIHRlc3RzIG9mIGdhcyBtYWNyb3MuCi0KLWlmICFbaXN0YXJnZXQgaHBwYSotKi0qXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCB0ZXN0MQotfQotCi1ydW5fZHVtcF90ZXN0IHRlc3QyCi0KLXJ1bl9kdW1wX3Rlc3QgdGVzdDMKLQotcnVuX2R1bXBfdGVzdCBpcnAKLQotcnVuX2R1bXBfdGVzdCByZXB0Ci0KLWdhc190ZXN0X2Vycm9yICJlcnIucyIgIiIgIm1hY3JvIGluZmluaXRlIHJlY3Vyc2lvbiIKLQotY2FzZSAkdGFyZ2V0X3RyaXBsZXQgaW4gewotICAgIHsgaHBwYSotKi0qIH0geyB9Ci0gICAgZGVmYXVsdCB7Ci0JcnVuX2R1bXBfdGVzdCBzZW1pCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3JlcHQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjJkNWYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3JlcHQuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IG1hY3JvIHJlcHQKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIC4qCi1PRkZTRVRbIAldK1RZUEVbIAldK1ZBTFVFLioKLTArMDBbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzEKLTArMDRbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzEKLTArMDhbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzFiNmY4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQkucmVwdAkzCi0JLmxvbmcJZm9vMQotCS5lbmRyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU4OWU3My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jb2JqZHVtcDogLXMgLWogLnRleHQKLSNuYW1lOiBzZW1pCi0KLS4qOiAuKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotIDAwMDAgM2IyMDNiMjAgM2EyMDNhMjAgMDAwMDAwMDAgMDAwMDAwMDAgIDsgOyA6IDogLi4uLi4uLi4KLSAwMDEwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlMDk2My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotICAgICAgICAubWFjcm8gc2VtaWNvbG9uCi0gICAgICAgIC5hc2NpaSAiOyAiCi0gICAgICAgIC5lbmRtCi0KLSAgICAgICAgLm1hY3JvIGNvbG9uCi0gICAgICAgIC5hc2NpaSAiOiAiCi0gICAgICAgIC5lbmRtCi0KLSAgICAgICAgc2VtaWNvbG9uCi0gICAgICAgIC5hc2NpaSAiOyAiCi0gICAgICAgIGNvbG9uCi0gICAgICAgIC5hc2NpaSAiOiAiCi0KLQkucDJhbGlnbiA1LDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0MS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NGIzZmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLmQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IG1hY3JvIHRlc3QgMQotCi0wKzAxIEEgczEKLTArMDIgQSBzMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4YjdjZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS5tYWNybwltIGFyZzEgYXJnMgotCS5nbG9ibAlcYXJnMQotCVxhcmcxID0gXGFyZzIKLQkuZW5kbQotCi0JbSBzMSwxCi0JbSBzMiwyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTdkNDE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogbWFjcm8gdGVzdCAyCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiAuKgotT0ZGU0VUWyAJXStUWVBFWyAJXStWQUxVRS4qCi0wKzAwWyAJXStbYS16QS1aMC05X10rWyAJXStmb28xCi0wKzA0WyAJXStbYS16QS1aMC05X10rWyAJXStmb28yCi0wKzA4WyAJXStbYS16QS1aMC05X10rWyAJXStmb28zCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFiMDExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5zCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0JLm1hY3JvCW0gYXJnMSBhcmcyIGFyZzMKLQkubG9uZwlcYXJnMQotCS5pZmMJLFxhcmcyXGFyZzMKLQkuRUxTRQotCW0JXGFyZzIsXGFyZzMKLQkuZW5kaWYKLQkuZW5kbQotCi0JbQlmb28xLGZvbzIsZm9vMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4MGFkNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDMuZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogbWFjcm8gdGVzdCAzCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiAuKgotT0ZGU0VUWyAJXStUWVBFWyAJXStWQUxVRS4qCi0wKzAwWyAJXStbYS16QS1aMC05X10rWyAJXStmb28xCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODBhYTIwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLm1hY3JvCW0gYXJnMSBhcmcyCi0JXGFyZzEKLQkuZXhpdG0KLQlcYXJnMgotCS5lbmRtCi0KLQltCSIubG9uZyBmb28xIiwuZ2FyYmFnZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRjZWRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24uZAorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogYWxsaW5zbgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxhYnM+OgotICAgMDoJMDFlMCAgICAgIAlhYnMJcjAKLQotMCswMDIgPGFkZGM+OgotICAgMjoJMDYyMSAgICAgIAlhZGRjCXIxLCByMgotCi0wKzAwNCA8YWRkaT46Ci0gICA0OgkyMDAzICAgICAgCWFkZGkJcjMsIDEKLQotMCswMDYgPGFkZHU+OgotICAgNjoJMWM1NCAgICAgIAlhZGR1CXI0LCByNQotCi0wKzAwOCA8YW5kPjoKLSAgIDg6CTE2NzYgICAgICAJYW5kCXI2LCByNwotCi0wKzAwYSA8YW5kaT46Ci0gICBhOgkyZTI4ICAgICAgCWFuZGkJcjgsIDIKLQotMCswMGMgPGFuZG4+OgotICAgYzoJMWZhOSAgICAgIAlhbmRuCXI5LCByMTAKLQotMCswMGUgPGFzcj46Ci0gICBlOgkxYWNiICAgICAgCWFzcglyMTEsIHIxMgotCi0wKzAxMCA8YXNyYz46Ci0gIDEwOgkzYTBkICAgICAgCWFzcmMJcjEzCi0KLTArMDEyIDxhc3JpPjoKLSAgMTI6CTNiZmUgICAgICAJYXNyaQlyMTQsIDMxCi0KLTArMDE0IDxiY2xyaT46Ci0gIDE0OgkzMDBmICAgICAgCWJjbHJpCXIxNSwgMAotCi0wKzAxNiA8YmY+OgotICAxNjoJZWZmNCAgICAgIAliZgkweDAKLQotMCswMTggPGJnZW5pPjoKLSAgMTg6CTMyNzAgICAgICAJYmdlbmkJcjAsIDcKLQotMCswMWEgPEJHRU5JPjoKLSAgMWE6CTMyODAgICAgICAJYmdlbmkJcjAsIDgKLQotMCswMWMgPEJHRU5pPjoKLSAgMWM6CTMzZjAgICAgICAJYmdlbmkJcjAsIDMxCi0KLTArMDFlIDxiZ2Vucj46Ci0gIDFlOgkxMzIxICAgICAgCWJnZW5yCXIxLCByMgotCi0wKzAyMCA8YmtwdD46Ci0JLi4uCi0KLTArMDIyIDxibWFza2k+OgotICAyMjoJMmM4MyAgICAgIAlibWFza2kJcjMsIDgKLQotMCswMjQgPEJNQVNLST46Ci0gIDI0OgkyZGYzICAgICAgCWJtYXNraQlyMywgMzEKLQotMCswMjYgPGJyPjoKLSAgMjY6CWY3ZmYgICAgICAJYnIJMHgyNgotCi0wKzAyOCA8YnJldj46Ci0gIDI4OgkwMGY0ICAgICAgCWJyZXYJcjQKLQotMCswMmEgPGJzZXRpPjoKLSAgMmE6CTM1ZTUgICAgICAJYnNldGkJcjUsIDMwCi0KLTArMDJjIDxic3I+OgotICAyYzoJZmZlOSAgICAgIAlic3IJMHgwCi0KLTArMDJlIDxidD46Ci0gIDJlOgllN2U4ICAgICAgCWJ0CTB4MAotCi0wKzAzMCA8YnRzdGk+OgotICAzMDoJMzdiNiAgICAgIAlidHN0aQlyNiwgMjcKLQotMCswMzIgPGNscmM+OgotICAzMjoJMGYwMCAgICAgIAljbXBuZQlyMCwgcjAKLQotMCswMzQgPGNscmY+OgotICAzNDoJMDFkNyAgICAgIAljbHJmCXI3Ci0KLTArMDM2IDxjbHJ0PjoKLSAgMzY6CTAxYzggICAgICAJY2xydAlyOAotCi0wKzAzOCA8Y21waHM+OgotICAzODoJMGNhOSAgICAgIAljbXBocwlyOSwgcjEwCi0KLTArMDNhIDxjbXBsdD46Ci0gIDNhOgkwZGNiICAgICAgCWNtcGx0CXIxMSwgcjEyCi0KLTArMDNjIDxjbXBsZWk+OgotICAzYzoJMjJlYiAgICAgIAljbXBsdGkJcjExLCAxNQotCi0wKzAzZSA8Y21wbHRpPjoKLSAgM2U6CTIzZmQgICAgICAJY21wbHRpCXIxMywgMzIKLQotMCswNDAgPGNtcG5lPjoKLSAgNDA6CTBmZmUgICAgICAJY21wbmUJcjE0LCByMTUKLQotMCswNDIgPGNtcG5laT46Ci0gIDQyOgkyYTAwICAgICAgCWNtcG5laQlyMCwgMAotCi0wKzA0NCA8ZGVjZj46Ci0gIDQ0OgkwMDkxICAgICAgCWRlY2YJcjEKLQotMCswNDYgPGRlY2d0PjoKLSAgNDY6CTAxYTIgICAgICAJZGVjZ3QJcjIKLQotMCswNDggPGRlY2x0PjoKLSAgNDg6CTAxODMgICAgICAJZGVjbHQJcjMKLQotMCswNGEgPGRlY25lPjoKLSAgNGE6CTAxYjQgICAgICAJZGVjbmUJcjQKLQotMCswNGMgPGRlY3Q+OgotICA0YzoJMDA4NSAgICAgIAlkZWN0CXI1Ci0KLTArMDRlIDxkaXZzPjoKLSAgNGU6CTMyMTYgICAgICAJZGl2cwlyNiwgcjEKLQotMCswNTAgPGRpdnU+OgotICA1MDoJMmMxOCAgICAgIAlkaXZ1CXI4LCByMQotCi0wKzA1MiA8ZG96ZT46Ci0gIDUyOgkwMDA2ICAgICAgCWRvemUKLQotMCswNTQgPGZmMT46Ci0gIDU0OgkwMGVhICAgICAgCWZmMQlyMTAKLQotMCswNTYgPGluY2Y+OgotICA1NjoJMDBiYiAgICAgIAlpbmNmCXIxMQotCi0wKzA1OCA8aW5jdD46Ci0gIDU4OgkwMGFjICAgICAgCWluY3QJcjEyCi0KLTArMDVhIDxpeGg+OgotICA1YToJMWRlZCAgICAgIAlpeGgJcjEzLCByMTQKLQotMCswNWMgPGl4dz46Ci0gIDVjOgkxNTBmICAgICAgCWl4dwlyMTUsIHIwCi0KLTArMDVlIDxqYmY+OgotICA1ZToJZWZkMCAgICAgIAliZgkweDAKLQotMCswNjAgPGpicj46Ci0gIDYwOglmMDBlICAgICAgCWJyCTB4N2UKLQotMCswNjIgPGpic3I+OgotICA2MjoJN2YwYSAgICAgIAlqc3JpCTB4LioKLQotMCswNjQgPGpidD46Ci0gIDY0OgllMDBjICAgICAgCWJ0CTB4N2UKLQotMCswNjYgPGptcD46Ci0gIDY2OgkwMGMxICAgICAgCWptcAlyMQotCi0wKzA2OCA8am1waT46Ci0gIDY4Ogk3MDA5ICAgICAgCWptcGkJMHguKgotCi0wKzA2YSA8anNyPjoKLSAgNmE6CTAwZDIgICAgICAJanNyCXIyCi0KLTArMDZjIDxqc3JpPjoKLSAgNmM6CTdmMDggICAgICAJanNyaQkweC4qCi0KLTArMDZlIDxsZC5iPjoKLSAgNmU6CWEzMDQgICAgICAJbGRiCXIzLCBcKHI0LCAwXCkKLQotMCswNzAgPGxkLmg+OgotICA3MDoJYzUxNiAgICAgIAlsZGgJcjUsIFwocjYsIDJcKQotCi0wKzA3MiA8bGQudz46Ci0gIDcyOgk4NzE4ICAgICAgCWxkCXI3LCBcKHI4LCA0XCkKLQotMCswNzQgPGxkYj46Ci0gIDc0OglhOWZhICAgICAgCWxkYglyOSwgXChyMTAsIDE1XCkKLQotMCswNzYgPGxkaD46Ci0gIDc2OgljYmZjICAgICAgCWxkaAlyMTEsIFwocjEyLCAzMFwpCi0KLTArMDc4IDxsZD46Ci0gIDc4Ogk4ZDVlICAgICAgCWxkCXIxMywgXChyMTQsIDIwXCkKLQotMCswN2EgPGxkdz46Ci0gIDdhOgk4ZGZlICAgICAgCWxkCXIxMywgXChyMTQsIDYwXCkKLQotMCswN2MgPGxkbT46Ci0gIDdjOgkwMDYyICAgICAgCWxkbQlyMi1yMTUsIFwocjBcKQotCi0wKzA3ZSA8Zm9vbG9vcD46Ci0gIDdlOgkwMDQxICAgICAgCWxkcQlyNC1yNywgXChyMVwpCi0KLTArMDgwIDxsb29wdD46Ci0gIDgwOgkwNDhlICAgICAgCWxvb3B0CXI4LCAweDY0Ci0KLTArMDgyIDxMUlc+OgotICA4MjoJNzkwMyAgICAgIAlscncJcjksIDB4LioKLQotMCswODQgPGxydz46Ci0gIDg0Ogk3OTA0ICAgICAgCWxydwlyOSwgMHg0MzIxCi0KLTArMDg2IDxmb29saXQ+OgotICA4NjoJMTIzNCAgICAgIAltb3YJcjQsIHIzCi0KLTArMDg4IDxsc2w+OgotICA4ODoJMWJiYSAgICAgIAlsc2wJcjEwLCByMTEKLQotMCswOGEgPGxzbGM+OgotICA4YToJM2MwYyAgICAgIAlsc2xjCXIxMgotCi0JLi4uCi0JCQk4YzogQUREUjMyCS50ZXh0Ci0JCQk5MDogQUREUjMyCS50ZXh0LioKLSAgOTQ6CTAwMDAgICAgICAJYmtwdAotICA5NjoJNDMyMSAgICAgIAkuc2hvcnQgMHg0MzIxCi0KLTArMDk4IDxsc2xpPjoKLSAgOTg6CTNkZmQgICAgICAJbHNsaQlyMTMsIDMxCi0KLTArMDlhIDxsc3I+OgotICA5YToJMGJmZSAgICAgIAlsc3IJcjE0LCByMTUKLQotMCswOWMgPGxzcmM+OgotICA5YzoJM2UwMCAgICAgIAlsc3JjCXIwCi0KLTArMDllIDxsc3JpPjoKLSAgOWU6CTNlMTEgICAgICAJbHNyaQlyMSwgMQotCi0wKzBhMCA8bWNscmk+OgotICBhMDoJMzA2NCAgICAgIAliY2xyaQlyNCwgNgotCi0wKzBhMiA8bWZjcj46Ci0gIGEyOgkxMDAyICAgICAgCW1mY3IJcjIsIHBzcgotCi0wKzBhNCA8bW92PjoKLSAgYTQ6CTEyNDMgICAgICAJbW92CXIzLCByNAotCi0wKzBhNiA8bW92Zj46Ci0gIGE2OgkwYTY1ICAgICAgCW1vdmYJcjUsIHI2Ci0KLTArMGE4IDxtb3ZpPjoKLSAgYTg6CTY3ZjcgICAgICAJbW92aQlyNywgMTI3Ci0KLTArMGFhIDxtb3Z0PjoKLSAgYWE6CTAyOTggICAgICAJbW92dAlyOCwgcjkKLQotMCswYWMgPG10Y3I+OgotICBhYzoJMTgwYSAgICAgIAltdGNyCXIxMCwgcHNyCi0KLTArMGFlIDxtdWx0PjoKLSAgYWU6CTAzY2IgICAgICAJbXVsdAlyMTEsIHIxMgotCi0wKzBiMCA8bXZjPjoKLSAgYjA6CTAwMmQgICAgICAJbXZjCXIxMwotCi0wKzBiMiA8bXZjdj46Ci0gIGIyOgkwMDNlICAgICAgCW12Y3YJcjE0Ci0KLTArMGI0IDxuZWc+OgotICBiNDoJMjgwMiAgICAgIAlyc3ViaQlyMiwgMAotCi0wKzBiNiA8bm90PjoKLSAgYjY6CTAxZmYgICAgICAJbm90CXIxNQotCi0wKzBiOCA8b3I+OgotICBiODoJMWUxMCAgICAgIAlvcglyMCwgcjEKLQotMCswYmEgPHJmaT46Ci0gIGJhOgkwMDAzICAgICAgCXJmaQotCi0wKzBiYyA8cm9sYz46Ci0gIGJjOgkwNjY2ICAgICAgCWFkZGMJcjYsIHI2Ci0KLTArMGJlIDxyb3JpPjoKLSAgYmU6CTM5YTkgICAgICAJcm90bGkJcjksIDI2Ci0KLTArMGMwIDxyb3RsYz46Ci0gIGMwOgkwNjY2ICAgICAgCWFkZGMJcjYsIHI2Ci0KLTArMGMyIDxyb3RsaT46Ci0gIGMyOgkzOGEyICAgICAgCXJvdGxpCXIyLCAxMAotCi0wKzBjNCA8cm90cmk+OgotICBjNDoJMzlhOSAgICAgIAlyb3RsaQlyOSwgMjYKLQotMCswYzYgPHJzdWI+OgotICBjNjoJMTQ0MyAgICAgIAlyc3ViCXIzLCByNAotCi0wKzBjOCA8cnN1Ymk+OgotICBjODoJMjgwNSAgICAgIAlyc3ViaQlyNSwgMAotCi0wKzBjYSA8cnRlPjoKLSAgY2E6CTAwMDIgICAgICAJcnRlCi0KLTArMGNjIDxydHM+OgotICBjYzoJMDBjZiAgICAgIAlqbXAJcjE1Ci0KLTArMGNlIDxzZXRjPjoKLSAgY2U6CTBjMDAgICAgICAJY21waHMJcjAsIHIwCi0KLTArMGQwIDxzZXh0Yj46Ci0gIGQwOgkwMTU2ICAgICAgCXNleHRiCXI2Ci0KLTArMGQyIDxzZXh0aD46Ci0gIGQyOgkwMTc3ICAgICAgCXNleHRoCXI3Ci0KLTArMGQ0IDxzdC5iPjoKLSAgZDQ6CWI4MDkgICAgICAJc3RiCXI4LCBcKHI5LCAwXCkKLQotMCswZDYgPHN0Lmg+OgotICBkNjoJZGExYiAgICAgIAlzdGgJcjEwLCBcKHIxMSwgMlwpCi0KLTArMGQ4IDxzdC53PjoKLSAgZDg6CTljMWQgICAgICAJc3QJcjEyLCBcKHIxMywgNFwpCi0KLTArMGRhIDxzdGI+OgotICBkYToJYmVmZiAgICAgIAlzdGIJcjE0LCBcKHIxNSwgMTVcKQotCi0wKzBkYyA8c3RoPjoKLSAgZGM6CWQwZjEgICAgICAJc3RoCXIwLCBcKHIxLCAzMFwpCi0KLTArMGRlIDxzdHc+OgotICBkZToJOTJmMyAgICAgIAlzdAlyMiwgXChyMywgNjBcKQotCi0wKzBlMCA8c3Q+OgotICBlMDoJOTQwNSAgICAgIAlzdAlyNCwgXChyNSwgMFwpCi0KLTArMGUyIDxzdG0+OgotICBlMjoJMDA3ZSAgICAgIAlzdG0JcjE0LXIxNSwgXChyMFwpCi0KLTArMGU0IDxzdG9wPjoKLSAgZTQ6CTAwMDQgICAgICAJc3RvcAotCi0wKzBlNiA8c3RxPjoKLSAgZTY6CTAwNTEgICAgICAJc3RxCXI0LXI3LCBcKHIxXCkKLQotMCswZTggPHN1YmM+OgotICBlODoJMDdkNyAgICAgIAlzdWJjCXI3LCByMTMKLQotMCswZWEgPHN1Ymk+OgotICBlYToJMjVmZSAgICAgIAlzdWJpCXIxNCwgMzIKLQotMCswZWMgPHN1YnU+OgotICBlYzoJMDUzOSAgICAgIAlzdWJ1CXI5LCByMwotCi0wKzBlZSA8c3luYz46Ci0gIGVlOgkwMDAxICAgICAgCXN5bmMKLQotMCswZjAgPHRzdGx0PjoKLSAgZjA6CTM3ZjUgICAgICAJYnRzdGkJcjUsIDMxCi0KLTArMGYyIDx0c3RuZT46Ci0gIGYyOgkyYTA3ICAgICAgCWNtcG5laQlyNywgMAotCi0wKzBmNCA8dHJhcD46Ci0gIGY0OgkwMDBhICAgICAgCXRyYXAJMgotCi0wKzBmNiA8dHN0PjoKLSAgZjY6CTBlZWUgICAgICAJdHN0CXIxNCwgcjE0Ci0KLTArMGY4IDx0c3RuYno+OgotICBmODoJMDE5MiAgICAgIAl0c3RuYnoJcjIKLQotMCswZmEgPHdhaXQ+OgotICBmYToJMDAwNSAgICAgIAl3YWl0Ci0KLTArMGZjIDx4b3I+OgotICBmYzoJMTcwZiAgICAgIAl4b3IJcjE1LCByMAotCi0wKzBmZSA8eHNyPjoKLSAgZmU6CTM4MGIgICAgICAJeHNyCXIxMQotCi0wKzAxMDAgPHh0cmIwPjoKLSAxMDA6CTAxMzEgICAgICAJeHRyYjAJcjEsIHIxCi0KLTArMDEwMiA8eHRyYjE+OgotIDEwMjoJMDEyMiAgICAgIAl4dHJiMQlyMSwgcjIKLQotMCswMTA0IDx4dHJiMj46Ci0gMTA0OgkwMTEwICAgICAgCXh0cmIyCXIxLCByMAotCi0wKzAxMDYgPHh0cmIzPjoKLSAxMDY6CTAxMGQgICAgICAJeHRyYjMJcjEsIHIxMwotCi0wKzAxMDggPHpleHRiPjoKLSAxMDg6CTAxNDggICAgICAJemV4dGIJcjgKLQotMCswMTBhIDx6ZXh0aD46Ci0gMTBhOgkwMTY0ICAgICAgCXpleHRoCXI0Ci0gMTBjOgkwZjAwICAgICAgCWNtcG5lCXIwLCByMAotIDEwZToJMGYwMCAgICAgIAljbXBuZQlyMCwgcjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24uZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNTc4NjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgTSpDb3JlIGFzc2VtYmxlciB0ZXN0c3VpdGUuCi0KLWlmIFtpc3RhcmdldCBtY29yZS0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJhbGxpbnNuIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDA2ODQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24ucworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0gLmRhdGEKLWZvb2RhdGE6IC53b3JkIDQyCi0JIC50ZXh0Ci1mb290ZXh0OgotCi0ubWFjcm8gdGVzdCBpbnNuIHRleHQ9IiIKLQkuZXhwb3J0IFxpbnNuCi1caW5zbjoKLQlcaW5zbiBcdGV4dAotLmVuZG0KLQotCXRlc3QgYWJzICAgcjAJCQotCXRlc3QgYWRkYyAgInIxLHIyIgkvLyBBIGRvdWJsZSBmb3J3YXJkIHNsYXNoIHN0YXJ0cyBhIGxpbmUgY29tbWVudAotCXRlc3QgYWRkaSAgInIzLCAxIgkjIFNvIGRvZXMgYSBoYXNoCi0JdGVzdCBhZGR1ICAicjQsIHI1IgkvLyBXaGl0ZSBzcGFjZSBiZXR3ZWVuIG9wZXJhbmRzIHNob3VsZCBiZSBpZ25vcmVkCi0JdGVzdCBhbmQgICAicjYscjciICAgOwl0ZXN0IGFuZGkgICJyOCwjMiIgLy8gQSBzZW1pY29sb24gc2VwZXJhdGVzIHN0YXRlbWVudHMKLQl0ZXN0IGFuZG4gICJyOSwgcjEwIgotCXRlc3QgYXNyICAgInIxMSwgUjEyIgkvLyBVcHBlcmNhc2UgUiBpcyBhbGxvd2VkIGFzIGEgcmVnaXN0ZXIgcHJlZml4Ci0JdGVzdCBhc3JjICAicjEzIgotCXRlc3QgYXNyaSAgInIxNCwjMHgxZiIKLQl0ZXN0IGJjbHJpICJyMTUsMCIKLQl0ZXN0IGJmICAgIGZvb3RleHQKLQl0ZXN0IGJnZW5pICJzcCwgNyIJLy8gcjAgY2FuIGFsc28gYmUgcmVmZXJlZCB0byBhcyAnc3AnCi0JdGVzdCBCR0VOSSAicjAsIDgiCS8vIE9mZmljaWFsbHkgdXBwZXIgY2FzZSBvciBtaXhlZCBjYXNlCi0JdGVzdCBCR0VOaSAicjAsIDMxIgkvLyBtbmVtb25pY3Mgc2hvdWxkIG5vdCBiZSBhbGxvd2VkLCBidXQgd2UgcmVsYXggdGhpcy4uLgotCXRlc3QgYmdlbnIgInIxLCByMiIKLQl0ZXN0IGJrcHQKLQl0ZXN0IGJtYXNraSAicjMsIzgiCi0JdGVzdCBCTUFTS0kgInIzLDB4MWYiCi0JdGVzdCBiciAgICAgLiAgLy8gRG90IG1lYW5zIHRoZSBjdXJyZW50IGFkZHJlc3MKLQl0ZXN0IGJyZXYgICByNAotCXRlc3QgYnNldGkgICJyNSwzMCIKLQl0ZXN0IGJzciAgICBmb290ZXh0Ci0JdGVzdCBidCAgICAgZm9vdGV4dAotCXRlc3QgYnRzdGkgICJyNiwgMjciCi0JdGVzdCBjbHJjICAgCi0JdGVzdCBjbHJmICAgcjcKLQl0ZXN0IGNscnQgICByOAotCXRlc3QgY21waHMgICJyOSxyMTAiCi0JdGVzdCBjbXBsdCAgInIxMSxyMTIiIAotCXRlc3QgY21wbGVpICJyMTEsIDE0IiAKLQl0ZXN0IGNtcGx0aSAicjEzLDMyIgotCXRlc3QgY21wbmUgICJyMTQsIHIxNSIKLQl0ZXN0IGNtcG5laSAicjAsMCIKLQl0ZXN0IGRlY2YgICByMQotCXRlc3QgZGVjZ3QgIHIyCi0JdGVzdCBkZWNsdCAgcjMKLQl0ZXN0IGRlY25lICByNAotCXRlc3QgZGVjdCAgIHI1Ci0JdGVzdCBkaXZzICAgInI2LHIxIgotCXRlc3QgZGl2dSAgICJyOCwgcjEiCi0JdGVzdCBkb3plCi0JdGVzdCBmZjEgICAgcjEwCi0JdGVzdCBpbmNmICAgcjExCi0JdGVzdCBpbmN0ICAgcjEyCi0JdGVzdCBpeGggICAgInIxMyxyMTQiCi0JdGVzdCBpeHcgICAgInIxNSxyMCIKLQl0ZXN0IGpiZiAgICBmb290ZXh0Ci0JdGVzdCBqYnIgICAgZm9vbG9vcAotCXRlc3QgamJzciAgIGZvb3RleHQKLQl0ZXN0IGpidCAgICBmb29sb29wCi0JdGVzdCBqbXAgICAgcjEKLQl0ZXN0IGptcGkgICBmb290ZXh0IAotCXRlc3QganNyICAgIHIyCi0JdGVzdCBqc3JpICAgZm9vdGV4dAotCXRlc3QgbGQuYiAgICJyMywocjQsMCkiCi0JdGVzdCBsZC5oICAgInI1ICwgKCByNiwgIzIpIgotCXRlc3QgbGQudyAgICJyNywgKHI4LCAweDQpIgotCXRlc3QgbGRiICAgICJyOSwocjEwLCMweGYpIgotCXRlc3QgbGRoICAgICJyMTEsIChyMTIsIDMwKSIKLQl0ZXN0IGxkICAgICAicjEzLCAocjE0LCAyMCkiCi0JdGVzdCBsZHcgICAgInIxMywgKHIxNCwgNjApIgotCXRlc3QgbGRtICAgICJyMi1yMTUsKHIwKSIKLQkuZXhwb3J0IGZvb2xvb3AKLWZvb2xvb3A6CQkKLQl0ZXN0IGxkcSAgICAicjQtcjcsKHIxKSIKLQl0ZXN0IGxvb3B0ICAicjgsIGZvb2xvb3AiCi0JdGVzdCBMUlcgICAgInI5LCBbZm9vbGl0XSIKLQl0ZXN0IGxydyAgICAicjksIDB4NDMyMSIgICAJLy8gUEMgcmVsIGluZGlyZWN0Ci0JLmdsb2JhbCBmb29saXQKLWZvb2xpdDoKLQkud29yZCAweDEyMzQKLQl0ZXN0IGxzbCAgICAicjEwLHIxMSIKLQl0ZXN0IGxzbGMgICByMTIKLQkubGl0ZXJhbHMJCQkvLyBEdW1wIGxpdGVyYWxzIHRhYmxlCQotCXRlc3QgbHNsaSAgICJyMTMsMzEiCi0JdGVzdCBsc3IgICAgInIxNCxyMTUiCi0JdGVzdCBsc3JjICAgcjAKLQl0ZXN0IGxzcmkgICAicjEsMSIKLQl0ZXN0IG1jbHJpICAicjQsIDY0IgotCXRlc3QgbWZjciAgICJyMiwgY3IwIgotCXRlc3QgbW92ICAgICJyMyxyNCIKLQl0ZXN0IG1vdmYgICAicjUsIHI2IgotCXRlc3QgbW92aSAgICJyNywgMTI3IgotCXRlc3QgbW92dCAgICJyOCwgcjkiCi0JdGVzdCBtdGNyICAgInIxMCwgcHNyIgotCXRlc3QgbXVsdCAgICJyMTEsIHIxMiIKLQl0ZXN0IG12YyAgICByMTMKLQl0ZXN0IG12Y3YgICByMTQKLQl0ZXN0IG5lZyAgICByMgotCXRlc3Qgbm90ICAgIHIxNQotCXRlc3Qgb3IgICAgICJyMCxyMSIKLQl0ZXN0IHJmaQotCXRlc3Qgcm9sYyAgICJyNiwgMSIKLQl0ZXN0IHJvcmkgICAicjksIDYiCi0JdGVzdCByb3RsYyAgInI2LCAxIgotCXRlc3Qgcm90bGkgICJyMiwgIzEwIgotCXRlc3Qgcm90cmkgICJyOSwgNiIKLQl0ZXN0IHJzdWIgICAicjMsIHI0IgotCXRlc3QgcnN1YmkgICJyNSwgMHgwIgotCXRlc3QgcnRlCi0JdGVzdCBydHMKLQl0ZXN0IHNldGMKLQl0ZXN0IHNleHRiICByNgotCXRlc3Qgc2V4dGggIHI3Ci0JdGVzdCBzdC5iICAgInI4LCAocjksIDApIgotCXRlc3Qgc3QuaCAgICJyMTAsIChyMTEsIDIpIgotCXRlc3Qgc3QudyAgICJyMTIsIChyMTMsIDQpIgotCXRlc3Qgc3RiICAgICJyMTQsIChyMTUsIDE1KSIJCi0JdGVzdCBzdGggICAgInIwLCAocjEsIDMwKSIKLQl0ZXN0IHN0dyAgICAicjIsIChyMywgMHgzYykiCi0JdGVzdCBzdCAgICAgInI0LCAocjUsIDApIgotCXRlc3Qgc3RtICAgICJyMTQgLSByMTUgLCAocjApIgotCXRlc3Qgc3RvcAotCXRlc3Qgc3RxICAgICJyNCAtIHI3ICwgKHIxKSIKLQl0ZXN0IHN1YmMgICAicjcsIHIxMyIKLQl0ZXN0IHN1YmkgICAicjE0LCAzMiIKLQl0ZXN0IHN1YnUgICAicjksIHIzIgotCXRlc3Qgc3luYwotCXRlc3QgdHN0bHQgIHI1Ci0JdGVzdCB0c3RuZSAgcjcKLQl0ZXN0IHRyYXAgICAyCi0JdGVzdCB0c3QgICAgInIxNCwgcjE0IgotCXRlc3QgdHN0bmJ6IHIyCi0JdGVzdCB3YWl0Ci0JdGVzdCB4b3IgICAgInIxNSxyMCIKLQl0ZXN0IHhzciAgICByMTEKLQl0ZXN0IHh0cmIwICAicjEsIHIxIgotCXRlc3QgeHRyYjEgICJyMSwgcjIiCi0JdGVzdCB4dHJiMiAgInIxLCByMCIKLQl0ZXN0IHh0cmIzICAicjEsIHIxMyIKLQl0ZXN0IHpleHRiICByOAotCXRlc3QgemV4dGggIHI0Ci0JY2xyYwkJCS8vIFRoZXNlIHR3byBpbnN0cnVjdGlvbnMgcGFkIHRoZSBvYmplY3QgZmlsZQotCWNscmMJCQkvLyBvdXQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LgotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Ficy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODZkNWMyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYWJzCi0KLSMgVGVzdCB0aGUgYWJzIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBiZ2V6CVwkYTAsMCswMDBjIDxmb29cKygweHwpYz4KLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gbmVnCVwkYTAsXCRhMAotMCswMDBjIDxbXj5dKj4gYmdleglcJGExLDArMDAxOCA8Zm9vXCsoMHh8KTE4PgotMCswMDEwIDxbXj5dKj4gbW92ZQlcJGEwLFwkYTEKLTArMDAxNCA8W14+XSo+IG5lZwlcJGEwLFwkYTEKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Ficy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjIxNzJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBhYnMgbWFjcm8uCi1mb286Ci0JYWJzCSQ0Ci0JYWJzCSQ0LCQ1Ci0JLnNwYWNlCTgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FkZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzIxZDFkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYWRkCi0KLSMgVGVzdCB0aGUgYWRkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBhZGRpCVwkYTAsXCRhMCwwCi0wKzAwMDQgPFtePl0qPiBhZGRpCVwkYTAsXCRhMCwxCi0wKzAwMDggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDBjIDxbXj5dKj4gYWRkCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMTAgPFtePl0qPiBhZGRpCVwkYTAsXCRhMCwtMzI3NjgKLTArMDAxNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE4IDxbXj5dKj4gYWRkCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyMCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwMjQgPFtePl0qPiBhZGQJXCRhMCxcJGEwLFwkYXQKLTArMDAyOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAwMmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGU5NjRiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYWRkIG1hY3JvLgotCQotZm9vOgotCWFkZAkkNCwkNCwwCi0JYWRkCSQ0LCQ0LDEKLQlhZGQJJDQsJDQsMHg4MDAwCi0JYWRkCSQ0LCQ0LC0weDgwMDAKLQlhZGQJJDQsJDQsMHgxMDAwMAotCWFkZAkkNCwkNCwweDFhNWE1Ci0JCi0jIGFkZHUgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYWRkIGlzOyBqdXN0IGNvbmZpcm0gdGhhdCBpdCBpc24ndAotIyB0b3RhbGx5IGJyb2tlbi4KLQlhZGR1CSQ0LCQ0LDEKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FuZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDYxNzE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYW5kCi0KLSMgVGVzdCB0aGUgYW5kIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBhbmRpCVwkYTAsXCRhMCwweDAKLTArMDAwNCA8W14+XSo+IGFuZGkJXCRhMCxcJGEwLDB4MQotMCswMDA4IDxbXj5dKj4gYW5kaQlcJGEwLFwkYTAsMHg4MDAwCi0wKzAwMGMgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMDEwIDxbXj5dKj4gYW5kCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxOCA8W14+XSo+IGFuZAlcJGEwLFwkYTAsXCRhdAotMCswMDFjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjAgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDI0IDxbXj5dKj4gYW5kCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMjggPFtePl0qPiBvcmkJXCRhMCxcJGExLDB4MAotMCswMDJjIDxbXj5dKj4gbm9yCVwkYTAsXCRhMCxcJHplcm8KLTArMDAzMCA8W14+XSo+IG9yaQlcJGEwLFwkYTEsMHgxCi0wKzAwMzQgPFtePl0qPiBub3IJXCRhMCxcJGEwLFwkemVybwotMCswMDM4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMSwweDgwMDAKLTArMDAzYyA8W14+XSo+IG5vcglcJGEwLFwkYTAsXCR6ZXJvCi0wKzAwNDAgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMDQ0IDxbXj5dKj4gbm9yCVwkYTAsXCRhMSxcJGF0Ci0wKzAwNDggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0YyA8W14+XSo+IG5vcglcJGEwLFwkYTEsXCRhdAotMCswMDUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTQgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDU4IDxbXj5dKj4gbm9yCVwkYTAsXCRhMSxcJGF0Ci0wKzAwNWMgPFtePl0qPiBvcmkJXCRhMCxcJGExLDB4MAotMCswMDYwIDxbXj5dKj4geG9yaQlcJGEwLFwkYTEsMHgwCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FuZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hbmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmYzU3ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FuZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGFuZCBtYWNyby4KLQkKLWZvbzoKLQlhbmQJJDQsJDQsMAotCWFuZAkkNCwkNCwxCi0JYW5kCSQ0LCQ0LDB4ODAwMAotCWFuZAkkNCwkNCwtMHg4MDAwCi0JYW5kCSQ0LCQ0LDB4MTAwMDAKLQlhbmQJJDQsJDQsMHgxYTVhNQotCi0jIG5vciwgb3IsIGFuZCB4b3IgYXJlIGhhbmRsZWQgYnkgdGhlIHNhbWUgY29kZS4gIFRoZXJlIGlzIGEgc3BlY2lhbAotIyBjYXNlIGZvciBub3IsIHNvIHdlIHRlc3QgYWxsIHZhcmlhbnRzLgotCQotCW5vcgkkNCwkNSwwCi0Jbm9yCSQ0LCQ1LDEKLQlub3IJJDQsJDUsMHg4MDAwCi0Jbm9yCSQ0LCQ1LC0weDgwMDAKLQlub3IJJDQsJDUsMHgxMDAwMAotCW5vcgkkNCwkNSwweDFhNWE1Ci0JCi0Jb3IJJDQsJDUsMAotCi0JeG9yCSQ0LCQ1LDAKLQotCSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZXEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzMjkzNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5kCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGJlcQotCi0jIFRlc3QgdGhlIGJlcSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gYmVxCVwkYTAsXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGJlcXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMGMgPFtePl0qPiBub3AKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsMQotMCswMDE0IDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTggPFtePl0qPiBub3AKLTArMDAxYyA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMjAgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyNCA8W14+XSo+IG5vcAotMCswMDI4IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDAyYyA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDMwIDxbXj5dKj4gbm9wCi0wKzAwMzQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAzOCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDNjIDxbXj5dKj4gbm9wCi0wKzAwNDAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0NCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNDggPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA0YyA8W14+XSo+IG5vcAotMCswMDUwIDxbXj5dKj4gYm5leglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA1NCA8W14+XSo+IG5vcAotMCswMDU4IDxbXj5dKj4gYmVxemwJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNWMgPFtePl0qPiBub3AKLTArMDA2MCA8W14+XSo+IGJuZXpsCVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgotMCsyMDA2OCA8W14+XSo+IGoJMCswMDAwIDx0ZXh0X2xhYmVsPgotWyAJXSoyMDA2ODogKE1JUFNfSk1QfEpNUEFERFJ8Ul9NSVBTXzI2KQkudGV4dAotMCsyMDA2YyA8W14+XSo+IG5vcAotMCsyMDA3MCA8W14+XSo+IGphbAkwKzAwMDAgPHRleHRfbGFiZWw+Ci1bIAldKjIwMDcwOiAoTUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCS50ZXh0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZXEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyMmVlYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJlcSBtYWNyby4KLQkuZ2xvYmwJdGV4dF9sYWJlbAkudGV4dAotdGV4dF9sYWJlbDoJCi0JYmVxCSQ0LCQ1LHRleHRfbGFiZWwKLQliZXEJJDQsMCx0ZXh0X2xhYmVsCi0JYmVxCSQ0LDEsdGV4dF9sYWJlbAotCWJlcQkkNCwweDgwMDAsdGV4dF9sYWJlbAotCWJlcQkkNCwtMHg4MDAwLHRleHRfbGFiZWwKLQliZXEJJDQsMHgxMDAwMCx0ZXh0X2xhYmVsCi0JYmVxCSQ0LDB4MWE1YTUsdGV4dF9sYWJlbAotCi0jIGJuZSBpcyBoYW5kbGVkIGJ5IHRoZSBzYW1lIGNvZGUgYXMgYmVxLiAgSnVzdCBzYW5pdHkgY2hlY2suCi0JYm5lCSQ0LDAsdGV4dF9sYWJlbAotCi0jIFNhbml0eSBjaGVjayBiZXFsIGFuZCBibmVsCi0JLnNldAltaXBzMgotCWJlcWwJJDQsMCx0ZXh0X2xhYmVsCi0JYm5lbAkkNCwwLHRleHRfbGFiZWwKLQotIyBUZXN0IHRoYXQgYnJhbmNoZXMgd2hpY2ggb3ZlcmZsb3cgYXJlIGNvbnZlcnRlZCB0byBqdW1wcy4KLQkuc3BhY2UJMHgyMDAwMAotCWIJdGV4dF9sYWJlbAotCWJhbAl0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2UuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzZTI3Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5kCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGJnZQotCi0jIFRlc3QgdGhlIGJnZSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDA4IDxbXj5dKj4gbm9wCi0wKzAwMGMgPFtePl0qPiBiZ2V6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDEwIDxbXj5dKj4gbm9wCi0wKzAwMTQgPFtePl0qPiBibGV6CVwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDE4IDxbXj5dKj4gbm9wCi0wKzAwMWMgPFtePl0qPiBiZ2V6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBiZ3R6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDI4IDxbXj5dKj4gbm9wCi0wKzAwMmMgPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwyCi0wKzAwMzAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDM0IDxbXj5dKj4gbm9wCi0wKzAwMzggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDNjIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNDAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDQ0IDxbXj5dKj4gbm9wCi0wKzAwNDggPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwtMzI3NjgKLTArMDA0YyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNTAgPFtePl0qPiBub3AKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNWMgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDYwIDxbXj5dKj4gbm9wCi0wKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2OCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNmMgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYXQKLTArMDA3MCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNzQgPFtePl0qPiBub3AKLTArMDA3OCA8W14+XSo+IHNsdAlcJGF0LFwkYTEsXCRhMAotMCswMDdjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4MCA8W14+XSo+IG5vcAotMCswMDg0IDxbXj5dKj4gYmd0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4OCA8W14+XSo+IG5vcAotMCswMDhjIDxbXj5dKj4gYmx0eglcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA5MCA8W14+XSo+IG5vcAotMCswMDk0IDxbXj5dKj4gYmd0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA5OCA8W14+XSo+IG5vcAotMCswMDljIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCi0wKzAwYTAgPFtePl0qPiBiZXF6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDBhNCA8W14+XSo+IG5vcAotMCswMGE4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMSxcJGEwCi0wKzAwYWMgPFtePl0qPiBibmV6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDVmZDgyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYmdlIG1hY3JvLgotCQotdGV4dF9sYWJlbDoJCi0JYmdlCSQ0LCQ1LHRleHRfbGFiZWwKLQliZ2UJJDQsJDAsdGV4dF9sYWJlbAotCWJnZQkkMCwkNSx0ZXh0X2xhYmVsCi0JYmdlCSQ0LDAsdGV4dF9sYWJlbAotCWJnZQkkNCwxLHRleHRfbGFiZWwKLQliZ2UJJDQsMix0ZXh0X2xhYmVsCi0JYmdlCSQ0LDB4ODAwMCx0ZXh0X2xhYmVsCi0JYmdlCSQ0LC0weDgwMDAsdGV4dF9sYWJlbAotCWJnZQkkNCwweDEwMDAwLHRleHRfbGFiZWwKLQliZ2UJJDQsMHgxYTVhNSx0ZXh0X2xhYmVsCi0KLSMgYmd0IGlzIGhhbmRsZWQgbGlrZSBiZ2UsIGV4Y2VwdCB3aGVuIGJvdGggYXJndW1lbnRzIGFyZSByZWdpc3RlcnMuCi0jIEp1c3Qgc2FuaXR5IGNoZWNrIGl0IG90aGVyd2lzZS4KLQliZ3QJJDQsJDUsdGV4dF9sYWJlbAotCWJndAkkNCwkMCx0ZXh0X2xhYmVsCi0JYmd0CSQwLCQ1LHRleHRfbGFiZWwKLQliZ3QJJDQsMCx0ZXh0X2xhYmVsCi0KLSMgU2FuaXR5IHRlc3QgYmdlbCBhbmQgYmd0bAotCS5zZXQJbWlwczIKLQliZ2VsCSQ0LCQ1LHRleHRfbGFiZWwKLQliZ3RsCSQ0LCQ1LHRleHRfbGFiZWwKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdldS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTYwNDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LmQKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYmdldQotCi0jIFRlc3QgdGhlIGJnZXUgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMDggPFtePl0qPiBub3AKLTArMDAwYyA8W14+XSo+IGJlcQlcJHplcm8sXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTAgPFtePl0qPiBub3AKLTArMDAxNCA8W14+XSo+IGJuZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTggPFtePl0qPiBub3AKLTArMDAxYyA8W14+XSo+IHNsdGl1CVwkYXQsXCRhMCwyCi0wKzAwMjAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDI0IDxbXj5dKj4gbm9wCi0wKzAwMjggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDJjIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAotMCswMDMwIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAzNCA8W14+XSo+IG5vcAotMCswMDM4IDxbXj5dKj4gc2x0aXUJXCRhdCxcJGEwLC0zMjc2OAotMCswMDNjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA0MCA8W14+XSo+IG5vcAotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNDggPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNGMgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDUwIDxbXj5dKj4gbm9wCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1OCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNWMgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNjAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBzbHR1CVwkYXQsXCRhMSxcJGEwCi0wKzAwNmMgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDcwIDxbXj5dKj4gbm9wCi0wKzAwNzQgPFtePl0qPiBibmV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDc4IDxbXj5dKj4gbm9wCi0wKzAwN2MgPFtePl0qPiBibmV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDgwIDxbXj5dKj4gbm9wCi0wKzAwODQgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGExCi0wKzAwODggPFtePl0qPiBiZXF6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4YyA8W14+XSo+IG5vcAotMCswMDkwIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTEsXCRhMAotMCswMDk0IDxbXj5dKj4gYm5lemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZXUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdldS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM3Zjk2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdldS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJnZXUgbWFjcm8uCi0JCi10ZXh0X2xhYmVsOgkKLQliZ2V1CSQ0LCQ1LHRleHRfbGFiZWwKLQliZ2V1CSQwLCQ1LHRleHRfbGFiZWwKLQkjIEEgc2Vjb25kIGFyZ3VtZW50IG9mIDAgb3IgJDAgaXMgYWx3YXlzIHRydWUKLQliZ2V1CSQ0LDEsdGV4dF9sYWJlbAotCWJnZXUJJDQsMix0ZXh0X2xhYmVsCi0JYmdldQkkNCwweDgwMDAsdGV4dF9sYWJlbAotCWJnZXUJJDQsLTB4ODAwMCx0ZXh0X2xhYmVsCi0JYmdldQkkNCwweDEwMDAwLHRleHRfbGFiZWwKLQliZ2V1CSQ0LDB4MWE1YTUsdGV4dF9sYWJlbAotCi0jIGJndHUgaXMgaGFuZGxlZCBsaWtlIGJnZXUsIGV4Y2VwdCB3aGVuIGJvdGggYXJndW1lbnRzIGFyZSByZWdpc3RlcnMuCi0jIEp1c3Qgc2FuaXR5IGNoZWNrIGl0IG90aGVyd2lzZS4KLQliZ3R1CSQ0LCQ1LHRleHRfbGFiZWwKLQliZ3R1CSQ0LCQwLHRleHRfbGFiZWwKLQliZ3R1CSQ0LDAsdGV4dF9sYWJlbAotCi0jIFNhbml0eSB0ZXN0IGJnZXVsIGFuZCBiZ3R1bAotCS5zZXQJbWlwczIKLQliZ2V1bAkkNCwkNSx0ZXh0X2xhYmVsCi0JYmd0dWwJJDQsJDUsdGV4dF9sYWJlbAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMTBlMjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQuZAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBibHQKLQotIyBUZXN0IHRoZSBibHQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAwOCA8W14+XSo+IG5vcAotMCswMDBjIDxbXj5dKj4gYmx0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxMCA8W14+XSo+IG5vcAotMCswMDE0IDxbXj5dKj4gYmd0eglcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxOCA8W14+XSo+IG5vcAotMCswMDFjIDxbXj5dKj4gYmx0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyMCA8W14+XSo+IG5vcAotMCswMDI0IDxbXj5dKj4gYmxleglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyOCA8W14+XSo+IG5vcAotMCswMDJjIDxbXj5dKj4gc2x0aQlcJGF0LFwkYTAsMgotMCswMDMwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAzNCA8W14+XSo+IG5vcAotMCswMDM4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAzYyA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhdAotMCswMDQwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA0NCA8W14+XSo+IG5vcAotMCswMDQ4IDxbXj5dKj4gc2x0aQlcJGF0LFwkYTAsLTMyNzY4Ci0wKzAwNGMgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDUwIDxbXj5dKj4gbm9wCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1OCA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhdAotMCswMDVjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA2MCA8W14+XSo+IG5vcAotMCswMDY0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNjggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDZjIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNzAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDc0IDxbXj5dKj4gbm9wCi0wKzAwNzggPFtePl0qPiBzbHQJXCRhdCxcJGExLFwkYTAKLTArMDA3YyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwODAgPFtePl0qPiBub3AKLTArMDA4NCA8W14+XSo+IGJsZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwODggPFtePl0qPiBub3AKLTArMDA4YyA8W14+XSo+IGJnZXoJXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwOTAgPFtePl0qPiBub3AKLTArMDA5NCA8W14+XSo+IGJsZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwOTggPFtePl0qPiBub3AKLTArMDA5YyA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhMQotMCswMGEwIDxbXj5dKj4gYm5lemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwYTQgPFtePl0qPiBub3AKLTArMDBhOCA8W14+XSo+IHNsdAlcJGF0LFwkYTEsXCRhMAotMCswMGFjIDxbXj5dKj4gYmVxemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMzA1Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJsdCBtYWNyby4KLQkKLXRleHRfbGFiZWw6CQotCWJsdAkkNCwkNSx0ZXh0X2xhYmVsCi0JYmx0CSQ0LCQwLHRleHRfbGFiZWwKLQlibHQJJDAsJDUsdGV4dF9sYWJlbAotCWJsdAkkNCwwLHRleHRfbGFiZWwKLQlibHQJJDQsMSx0ZXh0X2xhYmVsCi0JYmx0CSQ0LDIsdGV4dF9sYWJlbAotCWJsdAkkNCwweDgwMDAsdGV4dF9sYWJlbAotCWJsdAkkNCwtMHg4MDAwLHRleHRfbGFiZWwKLQlibHQJJDQsMHgxMDAwMCx0ZXh0X2xhYmVsCi0JYmx0CSQ0LDB4MWE1YTUsdGV4dF9sYWJlbAotCi0jIGJsZSBpcyBoYW5kbGVkIGxpa2UgYmx0LCBleGNlcHQgd2hlbiBib3RoIGFyZ3VtZW50cyBhcmUgcmVnaXN0ZXJzLgotIyBKdXN0IHNhbml0eSBjaGVjayBpdCBvdGhlcndpc2UuCi0JYmxlCSQ0LCQ1LHRleHRfbGFiZWwKLQlibGUJJDQsJDAsdGV4dF9sYWJlbAotCWJsZQkkMCwkNSx0ZXh0X2xhYmVsCi0JYmxlCSQ0LDAsdGV4dF9sYWJlbAotCi0jIFNhbml0eSB0ZXN0IGJsdGwgYW5kIGJsZWwKLQkuc2V0CW1pcHMyCi0JYmx0bAkkNCwkNSx0ZXh0X2xhYmVsCi0JYmxlbAkkNCwkNSx0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0dS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzI2MWM2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0dS5kCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGJsdHUKLQotIyBUZXN0IHRoZSBibHR1IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDA4IDxbXj5dKj4gbm9wCi0wKzAwMGMgPFtePl0qPiBibmUJXCR6ZXJvLFwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDEwIDxbXj5dKj4gbm9wCi0wKzAwMTQgPFtePl0qPiBiZXF6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDE4IDxbXj5dKj4gbm9wCi0wKzAwMWMgPFtePl0qPiBzbHRpdQlcJGF0LFwkYTAsMgotMCswMDIwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAyNCA8W14+XSo+IG5vcAotMCswMDI4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAyYyA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYXQKLTArMDAzMCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMzQgPFtePl0qPiBub3AKLTArMDAzOCA8W14+XSo+IHNsdGl1CVwkYXQsXCRhMCwtMzI3NjgKLTArMDAzYyA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNDAgPFtePl0qPiBub3AKLTArMDA0NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDQ4IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAotMCswMDRjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA1MCA8W14+XSo+IG5vcAotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDVjIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAotMCswMDYwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA2NCA8W14+XSo+IG5vcAotMCswMDY4IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTEsXCRhMAotMCswMDZjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA3MCA8W14+XSo+IG5vcAotMCswMDc0IDxbXj5dKj4gYmVxeglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA3OCA8W14+XSo+IG5vcAotMCswMDdjIDxbXj5dKj4gYmVxeglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4MCA8W14+XSo+IG5vcAotMCswMDg0IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhMQotMCswMDg4IDxbXj5dKj4gYm5lemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwOGMgPFtePl0qPiBub3AKLTArMDA5MCA8W14+XSo+IHNsdHUJXCRhdCxcJGExLFwkYTAKLTArMDA5NCA8W14+XSo+IGJlcXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiMWFlNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBibHR1IG1hY3JvLgotCQotdGV4dF9sYWJlbDoJCi0JYmx0dQkkNCwkNSx0ZXh0X2xhYmVsCi0JYmx0dQkkMCwkNSx0ZXh0X2xhYmVsCi0JIyBBIHNlY29uZCBhcmd1bWVudCBvZiAwIG9yICQwIGlzIGFsd2F5cyBmYWxzZQotCWJsdHUJJDQsMSx0ZXh0X2xhYmVsCi0JYmx0dQkkNCwyLHRleHRfbGFiZWwKLQlibHR1CSQ0LDB4ODAwMCx0ZXh0X2xhYmVsCi0JYmx0dQkkNCwtMHg4MDAwLHRleHRfbGFiZWwKLQlibHR1CSQ0LDB4MTAwMDAsdGV4dF9sYWJlbAotCWJsdHUJJDQsMHgxYTVhNSx0ZXh0X2xhYmVsCi0KLSMgYmxldSBpcyBoYW5kbGVkIGxpa2UgYmx0dSwgZXhjZXB0IHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIHJlZ2lzdGVycy4KLSMgSnVzdCBzYW5pdHkgY2hlY2sgaXQgb3RoZXJ3aXNlLgotCWJsZXUJJDQsJDUsdGV4dF9sYWJlbAotCWJsZXUJJDQsJDAsdGV4dF9sYWJlbAotCWJsZXUJJDQsMCx0ZXh0X2xhYmVsCi0KLSMgU2FuaXR5IHRlc3QgYmx0dWwgYW5kIGJsZXVsCi0JLnNldAltaXBzMgotCWJsdHVsCSQ0LCQ1LHRleHRfbGFiZWwKLQlibGV1bAkkNCwkNSx0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JyZWFrMjAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDk4YTRjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI2FzOiAtbWNwdT1yMzkwMAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjM5MDAKLSNuYW1lOiBNSVBTIDIwLWJpdCBicmVhawotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBicmVhawotMCswMDA0IDxbXj5dKj4gYnJlYWsKLTArMDAwOCA8W14+XSo+IGJyZWFrCTB4MTQKLTArMDAwYyA8W14+XSo+IGJyZWFrCTB4MTQsMHgyOAotMCswMDEwIDxbXj5dKj4gYnJlYWsJMHgzZmYsMHgzZmYKLTArMDAxNCA8W14+XSo+IHNkYmJwCi0wKzAwMTggPFtePl0qPiBzZGJicAotMCswMDFjIDxbXj5dKj4gc2RiYnAJMHgxNAotMCswMDIwIDxbXj5dKj4gc2RiYnAJMHgxNCwweDI4Ci0wKzAwMjQgPFtePl0qPiBzZGJicAkweDNmZiwweDNmZgotCS4uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMzViMGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgMjAtYml0IGJyZWFrIGluc3RydWN0aW9ucwotZm9vOgkKLQlicmVhawotCWJyZWFrCTAKLQlicmVhawkyMAotCWJyZWFrCTIwLDQwCi0JYnJlYWsJMTAyMywxMDIzCi0JCi0Jc2RiYnAKLQlzZGJicAkwCi0Jc2RiYnAJMjAKLQlzZGJicAkyMCw0MAotCXNkYmJwCTEwMjMsMTAyMwotCQotIyBmb3JjZSBzb21lIHBhZGRpbmcsIHRvIG1ha2Ugb2JqZHVtcCBjb25zaXN0ZW50bHkgcmVwb3J0IHRoYXQgdGhlcmUncyBzb21lCi0jIGhlcmUuLi4KLQkuc3BhY2UJOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2RjMGVjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGVsYXkuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBkZWxheQotI2FzOiAtbWlwczMgLW1jcHU9cjQwMDAKLQotIyAKLSMgR2FzIHNob3VsZCBwcm9kdWNlIG5vcCdzIGFmdGVyIG10YzEgYW5kIHJlbGF0ZWQgCi0jIGluc24ncyBpZiB0aGUgdGFyZ2V0IGZwciBpcyB1c2VkIGluIHRoZSAKLSMgaW1tZWRpYXRseSBmb2xsb3dpbmcgaW5zbi4gIFNlZSBhbHNvIG5vZGVsYXkuZC4KLSMKLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbXRjMQlcJHplcm8sXCRmMAotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBjdnQuZC53CVwkZjAsXCRmMAotMCswMDBjIDxbXj5dKj4gbXRjMQlcJHplcm8sXCRmMQotMCswMDEwIDxbXj5dKj4gbm9wCi0wKzAwMTQgPFtePl0qPiBjdnQuZC53CVwkZjEsXCRmMQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWUyZjAwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGVsYXkucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGFicyBtYWNyby4KLWZvbzoKLQltdGMxCSQwLCRmMAotCWN2dC5kLncJJGYwLCRmMAotICAgICAgICBtdGMxICAgICQwLCRmMQotICAgICAgICBjdnQuZC53ICRmMSwkZjEKLSAgICAgICAgLnNwYWNlCTgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYtaWxvY2tzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi1pbG9ja3MuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NTZkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi1pbG9ja3MuZAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgZGl2Ci0jc291cmNlOiBkaXYucwotCi0jIFRlc3QgdGhlIGRpdiBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IGJuZXoJXCRhMSwwKzAwMTAgPGZvb1wrMHgxMD4KLTArMDAwOCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGExCi0wKzAwMGMgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAwMTAgPFtePl0qPiBsaQlcJGF0LC0xCi0wKzAwMTQgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDAyOCA8Zm9vXCsweDI4PgotMCswMDE4IDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAwMWMgPFtePl0qPiBibmUJXCRhMCxcJGF0LDArMDAyOCA8Zm9vXCsweDI4PgotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwMjggPFtePl0qPiBtZmxvCVwkYTAKLTArMDAyYyA8W14+XSo+IGJuZXoJXCRhMiwwKzAwMzggPGZvb1wrMHgzOD4KLTArMDAzMCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGEyCi0wKzAwMzQgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAwMzggPFtePl0qPiBsaQlcJGF0LC0xCi0wKzAwM2MgPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDA1MCA8Zm9vXCsweDUwPgotMCswMDQwIDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAwNDQgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDA1MCA8Zm9vXCsweDUwPgotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwNTAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA1NCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCi0wKzAwNTggPFtePl0qPiBtb3ZlCVwkYTAsXCRhMQotMCswMDVjIDxbXj5dKj4gbmVnCVwkYTAsXCRhMAotMCswMDYwIDxbXj5dKj4gbmVnCVwkYTAsXCRhMQotMCswMDY0IDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAwNjggPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMDZjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNzAgPFtePl0qPiBsaQlcJGF0LDIKLTArMDA3NCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwNzggPFtePl0qPiBtZmxvCVwkYTAKLTArMDA3YyA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwODAgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMDg0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwODggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDhjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDA5MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDk0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDA5OCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwOWMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBhMCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwYTQgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMGE4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwYWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBiMCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwYjQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBiOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGJjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBjMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwYzggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMGNjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDBkMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwZDggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMGRjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBlMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGU0IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMCxcJGExCi0wKzAwZTggPFtePl0qPiBibmV6CVwkYTEsMCswZjQgPGZvb1wrMHhmND4KLTArMDBlYyA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTAsXCRhMQotMCswMGYwIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMGY0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZjggPFtePl0qPiBibmV6CVwkYTIsMCswMTA0IDxmb29cKzB4MTA0PgotMCswMGZjIDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMSxcJGEyCi0wKzAxMDAgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxMDQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDEwOCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCi0wKzAxMGMgPFtePl0qPiBibmV6CVwkYTIsMCswMTE4IDxmb29cKzB4MTE4PgotMCswMTEwIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYTIKLTArMDExNCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDExOCA8W14+XSo+IGxpCVwkYXQsLTEKLTArMDExYyA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMTMwIDxmb29cKzB4MTMwPgotMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAxMjQgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDEzMCA8Zm9vXCsweDEzMD4KLTArMDEyOCA8W14+XSo+IG5vcAotMCswMTJjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTMwIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxMzQgPFtePl0qPiBsaQlcJGF0LDIKLTArMDEzOCA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMTNjIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxNDAgPFtePl0qPiBibmV6CVwkYTIsMCswMTRjIDxmb29cKzB4MTRjPgotMCswMTQ0IDxbXj5dKj4gZGRpdglcJHplcm8sXCRhMSxcJGEyCi0wKzAxNDggPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxNGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJHplcm8sLTEKLTArMDE1MCA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMTY4IDxmb29cKzB4MTY4PgotMCswMTU0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCR6ZXJvLDEKLTArMDE1OCA8W14+XSo+IGRzbGwzMglcJGF0LFwkYXQsMHgxZgotMCswMTVjIDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAxNjggPGZvb1wrMHgxNjg+Ci0wKzAxNjAgPFtePl0qPiBub3AKLTArMDE2NCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDE2OCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTZjIDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAxNzAgPFtePl0qPiBkZGl2dQlcJHplcm8sXCRhMSxcJGF0Ci0wKzAxNzQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDE3OCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAxN2MgPFtePl0qPiBkZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDE4MCA8W14+XSo+IG1maGkJXCRhMAotMCswMTg0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDE4OCA8W14+XSo+IGRkaXZ1CVwkemVybyxcJGExLFwkYXQKLTArMDE4YyA8W14+XSo+IG1maGkJXCRhMAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzViYjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYuZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI2FzOiAtbWNwdT1yNDAwMAotI25hbWU6IE1JUFMgZGl2Ci0KLSMgVGVzdCB0aGUgZGl2IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gYm5leglcJGExLDArMDAxMCA8Zm9vXCsweDEwPgotMCswMDA4IDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYTEKLTArMDAwYyA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsLTEKLTArMDAxNCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMDI4IDxmb29cKzB4Mjg+Ci0wKzAwMTggPFtePl0qPiBsdWkJXCRhdCwweDgwMDAKLTArMDAxYyA8W14+XSo+IGJuZQlcJGEwLFwkYXQsMCswMDI4IDxmb29cKzB4Mjg+Ci0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDAyOCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDJjIDxbXj5dKj4gbm9wCi0wKzAwMzAgPFtePl0qPiBibmV6CVwkYTIsMCswMDNjIDxmb29cKzB4M2M+Ci0wKzAwMzQgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhMgotMCswMDM4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMDNjIDxbXj5dKj4gbGkJXCRhdCwtMQotMCswMDQwIDxbXj5dKj4gYm5lCVwkYTIsXCRhdCwwKzAwNTQgPGZvb1wrMHg1ND4KLTArMDA0NCA8W14+XSo+IGx1aQlcJGF0LDB4ODAwMAotMCswMDQ4IDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAwNTQgPGZvb1wrMHg1ND4KLTArMDA0YyA8W14+XSo+IG5vcAotMCswMDUwIDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMDU0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNTggPFtePl0qPiBtb3ZlCVwkYTAsXCRhMAotMCswMDVjIDxbXj5dKj4gbW92ZQlcJGEwLFwkYTEKLTArMDA2MCA8W14+XSo+IG5lZwlcJGEwLFwkYTAKLTArMDA2NCA8W14+XSo+IG5lZwlcJGEwLFwkYTEKLTArMDA2OCA8W14+XSo+IGxpCVwkYXQsMgotMCswMDZjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDA3MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDc0IDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAwNzggPFtePl0qPiBub3AKLTArMDA3YyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwODAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA4NCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwODggPFtePl0qPiBub3AKLTArMDA4YyA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwOTAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA5NCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwOTggPFtePl0qPiBub3AKLTArMDA5YyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwYTAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBhNCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwYTggPFtePl0qPiBub3AKLTArMDBhYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwYjAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBiNCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwYjggPFtePl0qPiBub3AKLTArMDBiYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwYzAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBjNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGM4IDxbXj5dKj4gbm9wCi0wKzAwY2MgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMGQwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBkOCA8W14+XSo+IG5vcAotMCswMGRjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBlMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwZTggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMGVjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDBmMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGY0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwZjggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMGZjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDEwMCA8W14+XSo+IG1mbG8JXCRhMAotCS4uLgotMCswMTBjIDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMCxcJGExCi0wKzAxMTAgPFtePl0qPiBibmV6CVwkYTEsMCswMTFjIDxmb29cKzB4MTFjPgotMCswMTE0IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMCxcJGExCi0wKzAxMTggPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxMWMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDEyMCA8W14+XSo+IG5vcAotMCswMTI0IDxbXj5dKj4gYm5leglcJGEyLDArMDEzMCA8Zm9vXCsweDEzMD4KLTArMDEyOCA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTEsXCRhMgotMCswMTJjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMTMwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxMzQgPFtePl0qPiBtb3ZlCVwkYTAsXCRhMAotMCswMTM4IDxbXj5dKj4gYm5leglcJGEyLDArMDE0NCA8Zm9vXCsweDE0ND4KLTArMDEzYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGEyCi0wKzAxNDAgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxNDQgPFtePl0qPiBsaQlcJGF0LC0xCi0wKzAxNDggPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDE1YyA8Zm9vXCsweDE1Yz4KLTArMDE0YyA8W14+XSo+IGx1aQlcJGF0LDB4ODAwMAotMCswMTUwIDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAxNWMgPGZvb1wrMHgxNWM+Ci0wKzAxNTQgPFtePl0qPiBub3AKLTArMDE1OCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDE1YyA8W14+XSo+IG1maGkJXCRhMAotMCswMTYwIDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAxNjQgPFtePl0qPiBub3AKLTArMDE2OCA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMTZjIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxNzAgPFtePl0qPiBub3AKLTArMDE3NCA8W14+XSo+IGJuZXoJXCRhMiwwKzAxODAgPGZvb1wrMHgxODA+Ci0wKzAxNzggPFtePl0qPiBkZGl2CVwkemVybyxcJGExLFwkYTIKLTArMDE3YyA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDE4MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkemVybywtMQotMCswMTg0IDxbXj5dKj4gYm5lCVwkYTIsXCRhdCwwKzAxOWMgPGZvb1wrMHgxOWM+Ci0wKzAxODggPFtePl0qPiBkYWRkaXUJXCRhdCxcJHplcm8sMQotMCswMThjIDxbXj5dKj4gZHNsbDMyCVwkYXQsXCRhdCwweDFmCi0wKzAxOTAgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDE5YyA8Zm9vXCsweDE5Yz4KLTArMDE5NCA8W14+XSo+IG5vcAotMCswMTk4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTljIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxYTAgPFtePl0qPiBsaQlcJGF0LDIKLTArMDFhNCA8W14+XSo+IG5vcAotMCswMWE4IDxbXj5dKj4gZGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMWFjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxYjAgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMWI0IDxbXj5dKj4gbm9wCi0wKzAxYjggPFtePl0qPiBkZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDFiYyA8W14+XSo+IG1maGkJXCRhMAotMCswMWMwIDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDFjNCA8W14+XSo+IG5vcAotMCswMWM4IDxbXj5dKj4gZGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMWNjIDxbXj5dKj4gbWZoaQlcJGEwCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5OTkwNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGRpdiBtYWNyby4KLWZvbzoKLQlkaXYJJDAsJDQsJDUKLQlkaXYJJDQsJDUKLQlkaXYJJDQsJDUsJDYKLQlkaXYJJDQsMQotCWRpdgkkNCwkNSwxCi0JZGl2CSQ0LC0xCi0JZGl2CSQ0LCQ1LC0xCi0JZGl2CSQ0LDIKLQlkaXYJJDQsJDUsMgotCWRpdgkkNCwweDgwMDAKLQlkaXYJJDQsJDUsMHg4MDAwCi0JZGl2CSQ0LC0weDgwMDAKLQlkaXYJJDQsJDUsLTB4ODAwMAotCWRpdgkkNCwweDEwMDAwCi0JZGl2CSQ0LCQ1LDB4MTAwMDAKLQlkaXYJJDQsMHgxYTVhNQotCWRpdgkkNCwkNSwweDFhNWE1Ci0KLSMgZGl2dSBpcyBsaWtlIGRpdiwgZXhjZXB0IHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIHJlZ2lzdGVycy4KLSMgSnVzdCBzYW5pdHkgY2hlY2sgaXQgb3RoZXJ3aXNlLgotCWRpdnUJJDAsJDQsJDUKLQlkaXZ1CSQ0LCQ1Ci0JZGl2dQkkNCwkNSwkNgotCWRpdnUJJDQsMQotCi0jIHJlbSBpcyBsaWtlIGRpdiwgcmVtdSBpcyBsaWtlIGRpdnUKLQlyZW0JJDQsJDUsJDYKLQlyZW11CSQ0LCQ1LDIKLQotIyBTYW5pdHkgY2hlY2sgdGhlIDY0IGJpdCB2ZXJzaW9ucy4KLQkuc2V0CW1pcHMzCi0JZGRpdgkkNCwkNSwkNgotCWRkaXZ1CSQ0LCQ1LDIKLQlkcmVtCSQ0LCQ1LDB4ODAwMAotCWRyZW11CSQ0LCQ1LC0weDgwMDAKLQotIyBmb3JjZSBzb21lIHBhZGRpbmcsIHRvIG1ha2Ugb2JqZHVtcCBjb25zaXN0ZW50bHkgcmVwb3J0IHRoYXQgdGhlcmUncyBzb21lCi0jIGhlcmUuLi4KLQkuc3BhY2UJOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGxpLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYjQ0NWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkuZAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgZGxpCi0jYXM6IC1taXBzMwotCi0jIFRlc3QgdGhlIGRsaSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMDQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAwOCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDAwYyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMTAgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxYyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwMjAgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDI0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMDI4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDEyMzQKLTArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgotMCswMDMwIDxbXj5dKj4gZHNybDMyCVwkYTAsXCRhMCwweDAKLTArMDAzNCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgotMCswMDM4IDxbXj5dKj4gZHNybDMyCVwkYTAsXCRhMCwweDAKLTArMDAzYyA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDA0MCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDA0NCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4YwotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHg4MDAwCi0wKzAwNGMgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4MTIzNAotMCswMDUwIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDA1NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDA1OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHgxMjM0Ci0wKzAwNWMgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCi0wKzAwNjAgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4NTY3OAotMCswMDY0IDxbXj5dKj4gbHVpCVwkYTAsMHg4MDAwCi0wKzAwNjggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4MTIzNAotMCswMDZjIDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMDcwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDU2NzgKLTArMDA3NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDA3OCA8W14+XSo+IGxpCVwkYTAsLTMwODc1Ci0wKzAwN2MgPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKLTArMDA4MCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHg0MzIxCi0wKzAwODQgPFtePl0qPiBsaQlcJGEwLC0xNgotMCswMDg4IDxbXj5dKj4gbGkJXCRhMCwtMjU2Ci0wKzAwOGMgPFtePl0qPiBsaQlcJGEwLC00MDk2Ci0wKzAwOTAgPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKLTArMDA5NCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmMAotMCswMDk4IDxbXj5dKj4gbHVpCVwkYTAsMHhmZjAwCi0wKzAwOWMgPFtePl0qPiBsdWkJXCRhMCwweGYwMDAKLTArMDBhMCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDBhNCA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgwCi0wKzAwYTggPFtePl0qPiBsaQlcJGEwLC0xNgotMCswMGFjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDAKLTArMDBiMCA8W14+XSo+IGxpCVwkYTAsLTI1NgotMCswMGI0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDAKLTArMDBiOCA8W14+XSo+IGxpCVwkYTAsLTQwOTYKLTArMDBiYyA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgwCi0wKzAwYzAgPFtePl0qPiBsaQlcJGEwLDB4ZmZmZgotMCswMGM0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCi0wKzAwYzggPFtePl0qPiBsaQlcJGEwLDB4ZmZmMAotMCswMGNjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCi0wKzAwZDAgPFtePl0qPiBsaQlcJGEwLDB4ZmYwMAotMCswMGQ0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCi0wKzAwZDggPFtePl0qPiBsaQlcJGEwLDB4ZjAwMAotMCswMGRjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCi0wKzAwZTAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAwZTQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDQKLTArMDBlOCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDBlYyA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4OAotMCswMGYwIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMGY0IDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHhjCi0wKzAwZjggPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAwZmMgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDEwCi0wKzAxMDAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxMDQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDE0Ci0wKzAxMDggPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxMGMgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDE4Ci0wKzAxMTAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxMTQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDFjCi0wKzAxMTggPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKLTArMDExYyA8W14+XSo+IGRzcmwzMglcJGEwLFwkYTAsMHgwCi0wKzAxMjAgPFtePl0qPiBsdWkJXCRhMCwweGZmZgotMCswMTI0IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZmZmYKLTArMDEyOCA8W14+XSo+IGx1aQlcJGEwLDB4ZmYKLTArMDEyYyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZmCi0wKzAxMzAgPFtePl0qPiBsdWkJXCRhMCwweGYKLTArMDEzNCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZmCi0wKzAxMzggPFtePl0qPiBsaQlcJGEwLDB4ZmZmZgotMCswMTNjIDxbXj5dKj4gbGkJXCRhMCw0MDk1Ci0wKzAxNDAgPFtePl0qPiBsaQlcJGEwLDI1NQotMCswMTQ0IDxbXj5dKj4gbGkJXCRhMCwxNQotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgzCi0wKzAxNGMgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4ZmZmYwotMCswMTUwIDxbXj5dKj4gbGkJXCRhMCwweGZmZmYKLTArMDE1NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MWUKLTArMDE1OCA8W14+XSo+IGxpCVwkYTAsMHhmZmZmCi0wKzAxNWMgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MgotMCswMTYwIDxbXj5dKj4gbGkJXCRhMCwweGZmZmYKLTArMDE2NCA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHg2Ci0wKzAxNjggPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxNmMgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MAotMCswMTcwIDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHhhCi0wKzAxNzQgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAxNzggPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDFjCi0wKzAxN2MgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweGEKLTArMDE4MCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDE4NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTgKLTArMDE4OCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4YQotMCswMThjIDxbXj5dKj4gbHVpCVwkYTAsMHgzZgotMCswMTkwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZjMDMKLTArMDE5NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDE5OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZmCi0wKzAxOWMgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCi0wKzAxYTAgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YzAwMAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGxpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Nzk1MjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkucworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBkbGkgbWFjcm8uCi0JCi1mb286CQotCWRsaQkkNCwwCi0JZGxpCSQ0LDEKLQlkbGkJJDQsLTEKLQlkbGkJJDQsMHg4MDAwCi0JZGxpCSQ0LC0weDgwMDAKLQlkbGkJJDQsMHgxMDAwMAotCWRsaQkkNCwweDFhNWE1Ci0JZGxpCSQ0LDB4ODAwMDEyMzQKLQlkbGkJJDQsMHhmZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwZmZmZmZmZmYKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwZmZmZmZmZmZmZmZmZgotCWRsaQkkNCwweGZmZmZmZmZmODAwMDEyMzQKLQlkbGkJJDQsMHhmZmZmODAwMDEyMzQ1Njc4Ci0JZGxpCSQ0LDB4ODAwMDEyMzQ1Njc4MDAwMAotCWRsaQkkNCwweGZmZmZmZmZmZmZmZjg3NjUKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmY0MzIxCi0KLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmZmZmYwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmZmZmYwMAotCWRsaQkkNCwweGZmZmZmZmZmZmZmZmYwMDAKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmYwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmYwMDAwMAotCWRsaQkkNCwweGZmZmZmZmZmZmYwMDAwMDAKLQlkbGkJJDQsMHhmZmZmZmZmZmYwMDAwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmYwMDAwMDAwMAotCWRsaQkkNCwweGZmZmZmZmYwMDAwMDAwMDAKLQlkbGkJJDQsMHhmZmZmZmYwMDAwMDAwMDAwCi0JZGxpCSQ0LDB4ZmZmZmYwMDAwMDAwMDAwMAotCWRsaQkkNCwweGZmZmYwMDAwMDAwMDAwMDAKLQlkbGkJJDQsMHhmZmYwMDAwMDAwMDAwMDAwCi0JZGxpCSQ0LDB4ZmYwMDAwMDAwMDAwMDAwMAotCWRsaQkkNCwweGYwMDAwMDAwMDAwMDAwMDAKLQotCWRsaQkkNCwweDBmZmZmZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMGZmZmZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwZmZmZmZmZmZmZmZmZgotCWRsaQkkNCwweDAwMDBmZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMGZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwZmZmZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDBmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMGZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwMDBmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDAwMGZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMDAwZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwMDAwMDBmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDAwMDAwMGZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMDAwMDAwZgotCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMDAzZmZmYwotCWRsaQkkNCwweDAwMDAzZmZmYzAwMDAwMDAKLQlkbGkJJDQsMHgwMDAzZmZmYzAwMDAwMDAwCi0JZGxpCSQ0LDB4MDAzZmZmYzAwMDAwMDAwMAotCWRsaQkkNCwweDAwM2ZmZmZmZmZjMDAwMDAKLQlkbGkJJDQsMHgwMDNmZmZmZmZmZmMwMDAwCi0JZGxpCSQ0LDB4MDAzZmZmZmZmZmZmYzAwMAotCi0JZGxpCSQ0LDB4MDAzZmZjMDNmZmZmYzAwMAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lMzItcmVsMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lMzItcmVsMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzQ5NDE2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZTMyLXJlbDIuZAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNvYmpkdW1wOiAtc3IgLWogLnRleHQKLSNuYW1lOiBNSVBTIEVMRiByZWxvYyAyICgzMi1iaXQpCi0jc291cmNlOiBlbGYtcmVsMi5zCi0KLSMgVGVzdCB0aGUgR1BSRUwgYW5kIExJVEVSQUwgZ2VuZXJhdGlvbi4KLSMgRklYTUU6IHJlYWxseSB0aGlzIHNob3VsZCBjaGVjayB0aGF0IHRoZSBjb250ZW50cyBvZiAuc2RhdGEsIC5saXQ0LAotIyBhbmQgLmxpdDggYXJlIGNvcnJlY3QgdG9vLgotCi0uKjogICAgIGZpbGUgZm9ybWF0IGVsZi4qbWlwcwotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbXC50ZXh0XF06Ci1PRkZTRVQgICAgICAgICAgIFRZUEUgICAgICAgICAgICAgIFZBTFVFIAotMCswMDAwMDAwIFJfTUlQU19MSVRFUkFMICAgIFwubGl0OFwrMHgwKzAwMDQwMDAKLTArMDAwMDAwNCBSX01JUFNfTElURVJBTCAgICBcLmxpdDhcKzB4MCswMDA0MDAwCi0wKzAwMDAwMDggUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ4XCsweDArMDAwNDAwMAotMCswMDAwMDBjIFJfTUlQU19MSVRFUkFMICAgIFwubGl0OFwrMHgwKzAwMDQwMDAKLTArMDAwMDAxMCBSX01JUFNfTElURVJBTCAgICBcLmxpdDhcKzB4MCswMDA0MDAwCi0wKzAwMDAwMTQgUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ4XCsweDArMDAwNDAwMAotMCswMDAwMDE4IFJfTUlQU19MSVRFUkFMICAgIFwubGl0NFwrMHgwKzAwMDQwMDAKLTArMDAwMDAxYyBSX01JUFNfTElURVJBTCAgICBcLmxpdDRcKzB4MCswMDA0MDAwCi0wKzAwMDAwMjAgUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ0XCsweDArMDAwNDAwMAotMCswMDAwMDI0IFJfTUlQU19HUFJFTDE2ICAgIFwuc2RhdGFcKzB4MCswMDA0MDAwCi0wKzAwMDAwMjggUl9NSVBTX0dQUkVMMTYgICAgXC5zZGF0YVwrMHgwKzAwMDQwMDAKLTArMDAwMDAyYyBSX01JUFNfR1BSRUwxNiAgICBcLnNkYXRhXCsweDArMDAwNDAwMAotCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gXC50ZXh0OgotIDAwMDAgYzc4M2MwMDAgYzc4MmMwMDQgYzc4M2MwMDggYzc4MmMwMGMgIC4qCi0gMDAxMCBjNzgzYzAxMCBjNzgyYzAxNCBjNzgyYzAwMCBjNzgyYzAwNCAgLioKLSAwMDIwIGM3ODJjMDA4IDhmODJjMDAwIDhmODJjMDA0IDhmODJjMDA4ICAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGYtcmVsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZi1yZWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgwYmRkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZi1yZWwuZAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSNvYmpkdW1wOiAtc3IgLWogLnRleHQKLSNuYW1lOiBNSVBTIEVMRiByZWxvYwotCi0jIFRlc3QgdGhlIEhJMTYvTE8xNiBnZW5lcmF0aW9uLgotCi0uKjogICAgIGZpbGUgZm9ybWF0IGVsZi4qbWlwcwotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbXC50ZXh0XF06Ci1PRkZTRVQgICAgICAgICAgIFRZUEUgICAgICAgICAgICAgIFZBTFVFIAotMCswMDAwMDAwIFJfTUlQU19ISTE2ICAgICAgIFwudGV4dAotMCswMDAwMDE4IFJfTUlQU19MTzE2ICAgICAgIFwudGV4dAotMCswMDAwMDBjIFJfTUlQU19ISTE2ICAgICAgIFwudGV4dAotMCswMDAwMDFjIFJfTUlQU19MTzE2ICAgICAgIFwudGV4dAotMCswMDAwMDA4IFJfTUlQU19ISTE2ICAgICAgIFwudGV4dAotMCswMDAwMDIwIFJfTUlQU19MTzE2ICAgICAgIFwudGV4dAotMCswMDAwMDA0IFJfTUlQU19ISTE2ICAgICAgIFwudGV4dAotMCswMDAwMDI0IFJfTUlQU19MTzE2ICAgICAgIFwudGV4dAotMCswMDAwMDE0IFJfTUlQU19ISTE2ICAgICAgIFwudGV4dAotMCswMDAwMDI4IFJfTUlQU19MTzE2ICAgICAgIFwudGV4dAotMCswMDAwMDEwIFJfTUlQU19ISTE2ICAgICAgIFwudGV4dAotMCswMDAwMDJjIFJfTUlQU19MTzE2ICAgICAgIFwudGV4dAotMCswMDAwMDMwIFJfTUlQU19ISTE2ICAgICAgIFwudGV4dAotMCswMDAwMDQ4IFJfTUlQU19MTzE2ICAgICAgIFwudGV4dAotMCswMDAwMDM0IFJfTUlQU19ISTE2ICAgICAgIFwudGV4dAotMCswMDAwMDRjIFJfTUlQU19MTzE2ICAgICAgIFwudGV4dAotMCswMDAwMDM4IFJfTUlQU19ISTE2ICAgICAgIFwudGV4dAotMCswMDAwMDUwIFJfTUlQU19MTzE2ICAgICAgIFwudGV4dAotMCswMDAwMDNjIFJfTUlQU19ISTE2ICAgICAgIFwudGV4dAotMCswMDAwMDU0IFJfTUlQU19MTzE2ICAgICAgIFwudGV4dAotMCswMDAwMDQ0IFJfTUlQU19ISTE2ICAgICAgIFwudGV4dAotMCswMDAwMDU4IFJfTUlQU19MTzE2ICAgICAgIFwudGV4dAotMCswMDAwMDQwIFJfTUlQU19ISTE2ICAgICAgIFwudGV4dAotMCswMDAwMDVjIFJfTUlQU19MTzE2ICAgICAgIFwudGV4dAotCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gXC50ZXh0OgotIDAwMDAgM2MwMTAwMDAgM2MwMTAwMDAgM2MwMTAwMDEgM2MwMTAwMDEgIC4qCi0gMDAxMCAzYzAxMDAwMCAzYzAxMDAwMSAyMDIxMDAxOCAyMDIxMDAxYyAgLioKLSAwMDIwIDIwMjEwMDE4IDIwMjEwMDFjIDIwMjE4MDE4IDIwMjFmZmZjICAuKgotIDAwMzAgM2MwMTAwMDEgM2MwMTAwMDEgM2MwMTAwMDIgM2MwMTAwMDIgIC4qCi0gMDA0MCAzYzAxMDAwMSAzYzAxMDAwMSAyMDIxYmZmZSAyMDIxYzAwMiAgLioKLSAwMDUwIDIwMjFiZmZlIDIwMjFjMDAyIDIwMjEzZmZlIDIwMjFiZmZhICAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGYtcmVsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZi1yZWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4NTM0Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZi1yZWwucworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLQkudGV4dAotCS5hbGlnbiAxNQotbDA6Ci1sMgk9IGwwKzQ5MTUwCi0KLQkuc2V0CW5vYXQKLQkuc2V0CW5vcmVvcmRlcgotCWx1aQkkYXQsJWhpKGwxKQotCWx1aQkkYXQsJWhpKGwxKzQpCi0JbHVpCSRhdCwlaGkobDErMHgxMDAwMCkKLQlsdWkJJGF0LCVoaShsMSsweDEwMDA0KQotCWx1aQkkYXQsJWhpKGwwLTQpCi0JbHVpCSRhdCwlaGkobDErMHg4MDAwKQotbDE6CQkKLQlhZGRpCSRhdCwkYXQsJWxvKGwxKQotCWFkZGkJJGF0LCRhdCwlbG8obDErMHgxMDAwNCkKLQlhZGRpCSRhdCwkYXQsJWxvKGwxKzB4MTAwMDApCi0JYWRkaQkkYXQsJGF0LCVsbyhsMSs0KQotCWFkZGkJJGF0LCRhdCwlbG8obDErMHg4MDAwKQotCWFkZGkJJGF0LCRhdCwlbG8obDAtNCkKLQotCWx1aQkkYXQsJWhpKGwyKQotCWx1aQkkYXQsJWhpKGwyKzQpCi0JbHVpCSRhdCwlaGkobDIrMHgxMDAwMCkKLQlsdWkJJGF0LCVoaShsMisweDEwMDA0KQotCWx1aQkkYXQsJWhpKGwyLTQpCi0JbHVpCSRhdCwlaGkobDIrMHg4MDAwKQotCWFkZGkJJGF0LCRhdCwlbG8obDIpCi0JYWRkaQkkYXQsJGF0LCVsbyhsMis0KQotCWFkZGkJJGF0LCRhdCwlbG8obDIrMHgxMDAwMCkKLQlhZGRpCSRhdCwkYXQsJWxvKGwyKzB4MTAwMDQpCi0JYWRkaQkkYXQsJGF0LCVsbyhsMisweDgwMDApCi0JYWRkaQkkYXQsJGF0LCVsbyhsMi00KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGYtcmVsMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGYtcmVsMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjBmYWNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmLXJlbDIuZAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSNvYmpkdW1wOiAtc3IgLWogLnRleHQKLSNuYW1lOiBNSVBTIEVMRiByZWxvYyAyCi0KLSMgVGVzdCB0aGUgR1BSRUwgYW5kIExJVEVSQUwgZ2VuZXJhdGlvbi4KLSMgRklYTUU6IHJlYWxseSB0aGlzIHNob3VsZCBjaGVjayB0aGF0IHRoZSBjb250ZW50cyBvZiAuc2RhdGEsIC5saXQ0LAotIyBhbmQgLmxpdDggYXJlIGNvcnJlY3QgdG9vLgotCi0uKjogICAgIGZpbGUgZm9ybWF0IGVsZi4qbWlwcwotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbXC50ZXh0XF06Ci1PRkZTRVQgICAgICAgICAgIFRZUEUgICAgICAgICAgICAgIFZBTFVFIAotMCswMDAwMDAwIFJfTUlQU19MSVRFUkFMICAgIFwubGl0OFwrMHgwKzAwMDQwMDAKLTArMDAwMDAwNCBSX01JUFNfTElURVJBTCAgICBcLmxpdDhcKzB4MCswMDA0MDAwCi0wKzAwMDAwMDggUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ4XCsweDArMDAwNDAwMAotMCswMDAwMDBjIFJfTUlQU19MSVRFUkFMICAgIFwubGl0NFwrMHgwKzAwMDQwMDAKLTArMDAwMDAxMCBSX01JUFNfTElURVJBTCAgICBcLmxpdDRcKzB4MCswMDA0MDAwCi0wKzAwMDAwMTQgUl9NSVBTX0xJVEVSQUwgICAgXC5saXQ0XCsweDArMDAwNDAwMAotMCswMDAwMDE4IFJfTUlQU19HUFJFTDE2ICAgIFwuc2RhdGFcKzB4MCswMDA0MDAwCi0wKzAwMDAwMWMgUl9NSVBTX0dQUkVMMTYgICAgXC5zZGF0YVwrMHgwKzAwMDQwMDAKLTArMDAwMDAyMCBSX01JUFNfR1BSRUwxNiAgICBcLnNkYXRhXCsweDArMDAwNDAwMAotCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gXC50ZXh0OgotIDAwMDAgZDc4MmMwMDAgZDc4MmMwMDggZDc4MmMwMTAgYzc4MmMwMDAgIC4qCi0gMDAxMCBjNzgyYzAwNCBjNzgyYzAwOCA4ZjgyYzAwMCA4ZjgyYzAwNCAgLioKLSAwMDIwIDhmODJjMDA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGYtcmVsMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGYtcmVsMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzgxMmNhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmLXJlbDIucworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLQkuc2RhdGEKLQkuYWxpZ24gMgotCS50eXBlIHcxLEBvYmplY3QKLQkuc2l6ZSB3MSw0Ci13MToJLndvcmQJMQotCS50eXBlIHcyLEBvYmplY3QKLQkuc2l6ZSB3Miw0Ci13MjoJLndvcmQJMgotCS50eXBlIHczLEBvYmplY3QKLQkuc2l6ZSB3Myw0Ci13MzoJLndvcmQJMwotCQotCS50ZXh0Ci0JLmFsaWduIDIKLWwwOgotCS5zZXQJbm9yZW9yZGVyCi0KLSAgICAgICAgbGkuZCAgICAkZjIsMS4xMDAwMDAwMDAwMDAwMDAwMDAwMGUwCi0gICAgICAgIGxpLmQgICAgJGYyLDIuMTAwMDAwMDAwMDAwMDAwMDAwMDBlMAotICAgICAgICBsaS5kICAgICRmMiwzLjEwMDAwMDAwMDAwMDAwMDAwMDAwZTAKLSAgICAgICAgbGkucyAgICAkZjIsMS4xMDAwMDAwMDAwMDAwMDAwMDAwMGUwCi0gICAgICAgIGxpLnMgICAgJGYyLDIuMTAwMDAwMDAwMDAwMDAwMDAwMDBlMAotICAgICAgICBsaS5zICAgICRmMiwzLjEwMDAwMDAwMDAwMDAwMDAwMDAwZTAKLQotCS5zZXQJbm9tYWNybwotCQotCWx3CSQyLHcxCi0JbHcJJDIsdzIKLQlsdwkkMix3MwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5jIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE1ZjljLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpc24ndCBkaXJlY3RseSB1c2VkIGJ5IHRoZSB0ZXN0IHN1aXRlOyBpdCB1c2VzCi0gICBlbGZfZV9mbGFncy5zLiAgSG93ZXZlciwgSSBmaWd1cmVkIGl0IHdvdWxkIGJlIG5pY2UgdG8gcHJvdmlkZSB0aGUKLSAgIHNvdXJjZSBjb2RlIGZyb20gd2hpY2ggdGhlIC5zIGZpbGUgd2FzIGdlbmVyYXRlZC4KLQotICAgSXQgd2FzIGNvbXBpbGVkIGFzIGZvbGxvd3M6Ci0KLSAgIG1pcHM2NC1lbGYtZ2NjIC1tNDY1MCAtUyAtTyBlbGZfZV9mbGFncy5jCi0KLSAgIFdlIHVzZSB0aGUgLW00NjUwIGZsYWcgdG8gZ2V0IHRoZSA0NjUwLXNwZWNpZmljICdtdWwnIGluc3RydWN0aW9uCi0gICBpbiB0aGVyZTsgdGhlIHRlc3Qgc3VpdGUgd2FudHMgdG8gYmUgc3VyZSB0aGF0IEdBUydzIC1tNDY1MCBmbGFnCi0gICB3aWxsIGluZGVlZCBjYXVzZSBpdCB0byBnZW5lcmF0ZSB0aGUgNDY1MCBtdWwgaW5zdHJ1Y3Rpb24sIGFuZCBub3QKLSAgIGV4cGFuZCBpdCBhcyBhIG1hY3JvLgotCi0gICBJYW4gMTAgSnVuZSAxOTk5OiBJIHR3ZWFrZWQgdGhlIHJlc3VsdGluZyBhc3NlbWJsZXIgZmlsZSBzbyB0aGF0IGl0Ci0gICB3b3VsZCBnZW5lcmF0ZSB0aGUgc2FtZSBjb2RlIHdoZW4gZ2FzIHdhcyBjb25maWd1cmVkIGZvciBtaXBzLWVsZgotICAgYW5kIGZvciBtaXBzNjQtZWxmLiAgKi8KLQotaW50Ci1mb28gKGludCBhLCBpbnQgYikKLXsKLSAgcmV0dXJuIChhICogYikgKyAxOwotfQotCi1pbnQKLW1haW4gKCkKLXsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlY2E4YzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotCS5maWxlCTEgImVsZl9lX2ZsYWdzLmMiCi1nY2MyX2NvbXBpbGVkLjoKLV9fZ251X2NvbXBpbGVkX2M6Ci0JLnRleHQKLQkuYWxpZ24JMgotCS5nbG9ibAlmb28KLQkudGV4dAotCS5lbnQJZm9vCi1mb286Ci0JLmZyYW1lCSRzcCwwLCQzMQkJIyB2YXJzPSAwLCByZWdzPSAwLzAsIGFyZ3M9IDAsIGV4dHJhPSAwCi0JLm1hc2sJMHgwMDAwMDAwMCwwCi0JLmZtYXNrCTB4MDAwMDAwMDAsMAotCW11bAkkMiwkNCwkNQotCS5zZXQJbm9yZW9yZGVyCi0JLnNldAlub21hY3JvCi0JagkkMzEKLQlhZGR1CSQyLCQyLDEKLQkuc2V0CW1hY3JvCi0JLnNldAlyZW9yZGVyCi0KLQkuZW5kCWZvbwotCS5hbGlnbgkyCi0JLmdsb2JsCW1haW4KLQkudGV4dAotCS5lbnQJbWFpbgotbWFpbjoKLQkuZnJhbWUJJHNwLDQwLCQzMQkJIyB2YXJzPSAwLCByZWdzPSAxLzAsIGFyZ3M9IDMyLCBleHRyYT0gMAotCS5tYXNrCTB4ODAwMDAwMDAsLTgKLQkuZm1hc2sJMHgwMDAwMDAwMCwwCi0Jc3VidQkkc3AsJHNwLDQwCi0Jc3cJJDMxLDMyKCRzcCkKLQlqYWwJX19nY2NtYWluCi0JbW92ZQkkMiwkMAotCWx3CSQzMSwzMigkc3ApCi0Jbm9wCi0JLnNldAlub3Jlb3JkZXIKLQkuc2V0CW5vbWFjcm8KLQlqCSQzMQotCWFkZHUJJHNwLCRzcCw0MAotCS5zZXQJbWFjcm8KLQkuc2V0CXJlb3JkZXIKLQotCS5lbmQJbWFpbgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MxLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYWEyZjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczEuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgbmFtZTogRUxGIGVfZmxhZ3M6IG5vdGhpbmcgc3BlY2lhbAotIyBzb3VyY2U6IGVsZl9lX2ZsYWdzLnMKLSMgb2JqZHVtcDogLWZkCi0KLS4qOi4qZmlsZSBmb3JtYXQuKm1pcHMuKgotYXJjaGl0ZWN0dXJlOiBtaXBzOlszNF1bMC05XTAwLCBmbGFncyAweDAwMDAwMDExOgotSEFTX1JFTE9DLCBIQVNfU1lNUwotc3RhcnQgYWRkcmVzcyAweDAwMDAwMDAwMDAwMDAwMDAKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAwMDAwMDAwMCA8Zm9vPjoKLSAgIDA6CTAwODUwMDE5IAltdWx0dQlcJGEwLFwkYTEKLSAgIDQ6CTAwMDAxMDEyIAltZmxvCVwkdjAKLSAgIDg6CTAzZTAwMDA4IAlqcglcJHJhCi0gICBjOgkyNDQyMDAwMSAJYWRkaXUJXCR2MCxcJHYwLDEKLQotMDAwMDAwMDAwMDAwMDAxMCA8bWFpbj46Ci0gIDEwOgkyN2JkZmZkOCAJYWRkaXUJXCRzcCxcJHNwLC00MAotICAxNDoJYWZiZjAwMjAgCXN3CVwkcmEsMzJcKFwkc3BcKQotICAxODoJMGMwMDAwMDAgCWphbAkwIDxmb28+Ci0gIDFjOgkwMDAwMDAwMCAJbm9wCi0gIDIwOgkwMDAwMTAyWzFkXSAJbW92ZQlcJHYwLFwkemVybwotICAyNDoJOGZiZjAwMjAgCWx3CVwkcmEsMzJcKFwkc3BcKQotICAyODoJMDAwMDAwMDAgCW5vcAotICAyYzoJMDNlMDAwMDggCWpyCVwkcmEKLSAgMzA6CTI3YmQwMDI4IAlhZGRpdQlcJHNwLFwkc3AsNDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzEzYmQzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MyLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIG5hbWU6IEVMRiBlX2ZsYWdzOiAtbTQ2NTAKLSMgc291cmNlOiBlbGZfZV9mbGFncy5zCi0jIGFzOiAtbTQ2NTAKLSMgb2JqZHVtcDogLWZkCi0KLS4qOi4qZmlsZSBmb3JtYXQuKm1pcHMuKgotYXJjaGl0ZWN0dXJlOiBtaXBzOjQ2NTAsIGZsYWdzIDB4MDAwMDAwMTE6Ci1IQVNfUkVMT0MsIEhBU19TWU1TCi1zdGFydCBhZGRyZXNzIDB4MDAwMDAwMDAwMDAwMDAwMAotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMDAwMDAwMDAwIDxmb28+OgotICAgMDoJNzA4NTEwMDIgCW11bAlcJHYwLFwkYTAsXCRhMQotICAgNDoJMDNlMDAwMDggCWpyCVwkcmEKLSAgIDg6CTI0NDIwMDAxIAlhZGRpdQlcJHYwLFwkdjAsMQotCi0wMDAwMDAwMDAwMDAwMDBjIDxtYWluPjoKLSAgIGM6CTI3YmRmZmQ4IAlhZGRpdQlcJHNwLFwkc3AsLTQwCi0gIDEwOglhZmJmMDAyMCAJc3cJXCRyYSwzMlwoXCRzcFwpCi0gIDE0OgkwYzAwMDAwMCAJamFsCTAgPGZvbz4KLSAgMTg6CTAwMDAwMDAwIAlub3AKLSAgMWM6CTAwMDAxMDJkIAltb3ZlCVwkdjAsXCR6ZXJvCi0gIDIwOgk4ZmJmMDAyMCAJbHcJXCRyYSwzMlwoXCRzcFwpCi0gIDI0OgkwMDAwMDAwMCAJbm9wCi0gIDI4OgkwM2UwMDAwOCAJanIJXCRyYQotICAyYzoJMjdiZDAwMjggCWFkZGl1CVwkc3AsXCRzcCw0MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MTM0OTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczMuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgbmFtZTogRUxGIGVfZmxhZ3M6IC1tY3B1PTQ2NTAKLSMgc291cmNlOiBlbGZfZV9mbGFncy5zCi0jIGFzOiAtbWNwdT00NjUwCi0jIG9iamR1bXA6IC1mZAotCi0uKjouKmZpbGUgZm9ybWF0LiptaXBzLioKLWFyY2hpdGVjdHVyZTogbWlwczo0NjUwLCBmbGFncyAweDAwMDAwMDExOgotSEFTX1JFTE9DLCBIQVNfU1lNUwotc3RhcnQgYWRkcmVzcyAweDAwMDAwMDAwMDAwMDAwMDAKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAwMDAwMDAwMCA8Zm9vPjoKLSAgIDA6CTcwODUxMDAyIAltdWwJXCR2MCxcJGEwLFwkYTEKLSAgIDQ6CTAzZTAwMDA4IAlqcglcJHJhCi0gICA4OgkyNDQyMDAwMSAJYWRkaXUJXCR2MCxcJHYwLDEKLQotMDAwMDAwMDAwMDAwMDAwYyA8bWFpbj46Ci0gICBjOgkyN2JkZmZkOCAJYWRkaXUJXCRzcCxcJHNwLC00MAotICAxMDoJYWZiZjAwMjAgCXN3CVwkcmEsMzJcKFwkc3BcKQotICAxNDoJMGMwMDAwMDAgCWphbAkwIDxmb28+Ci0gIDE4OgkwMDAwMDAwMCAJbm9wCi0gIDFjOgkwMDAwMTAyZCAJbW92ZQlcJHYwLFwkemVybwotICAyMDoJOGZiZjAwMjAgCWx3CVwkcmEsMzJcKFwkc3BcKQotICAyNDoJMDAwMDAwMDAgCW5vcAotICAyODoJMDNlMDAwMDggCWpyCVwkcmEKLSAgMmM6CTI3YmQwMDI4IAlhZGRpdQlcJHNwLFwkc3AsNDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3M0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzNC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzNlYmEwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3M0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIG5hbWU6IEVMRiBlX2ZsYWdzOiAtbTQ2NTAgLW1jcHU9NDY1MAotIyBzb3VyY2U6IGVsZl9lX2ZsYWdzLnMKLSMgYXM6IC1tNDY1MCAtbWNwdT00NjUwCi0jIG9iamR1bXA6IC1mZAotCi0uKjouKmZpbGUgZm9ybWF0LiptaXBzLioKLWFyY2hpdGVjdHVyZTogbWlwczo0NjUwLCBmbGFncyAweDAwMDAwMDExOgotSEFTX1JFTE9DLCBIQVNfU1lNUwotc3RhcnQgYWRkcmVzcyAweDAwMDAwMDAwMDAwMDAwMDAKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAwMDAwMDAwMCA8Zm9vPjoKLSAgIDA6CTcwODUxMDAyIAltdWwJXCR2MCxcJGEwLFwkYTEKLSAgIDQ6CTAzZTAwMDA4IAlqcglcJHJhCi0gICA4OgkyNDQyMDAwMSAJYWRkaXUJXCR2MCxcJHYwLDEKLQotMDAwMDAwMDAwMDAwMDAwYyA8bWFpbj46Ci0gICBjOgkyN2JkZmZkOCAJYWRkaXUJXCRzcCxcJHNwLC00MAotICAxMDoJYWZiZjAwMjAgCXN3CVwkcmEsMzJcKFwkc3BcKQotICAxNDoJMGMwMDAwMDAgCWphbAkwIDxmb28+Ci0gIDE4OgkwMDAwMDAwMCAJbm9wCi0gIDFjOgkwMDAwMTAyZCAJbW92ZQlcJHYwLFwkemVybwotICAyMDoJOGZiZjAwMjAgCWx3CVwkcmEsMzJcKFwkc3BcKQotICAyNDoJMDAwMDAwMDAgCW5vcAotICAyODoJMDNlMDAwMDggCWpyCVwkcmEKLSAgMmM6CTI3YmQwMDI4IAlhZGRpdQlcJHNwLFwkc3AsNDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmOGE3OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0KLSAgICA7IFRlc3QgY2FzZSBmb3IgYXNzZW1ibGVyIG9wdGlvbiAiaXRibCIuCi0gICAgOyBSdW4gYXMgImFzIC0taXRibCBpdGJsIGl0YmwucyIKLSAgICA7IG9yIHdpdGggc3RhbmQtYWxvbmUgdGVzdCBjYXNlICJpdGJsLXRlc3QgaXRibCBpdGJsLnMiLgotICAgIDsgSGVyZSwgdGhlIHByb2Nlc3NvcnMgcmVwcmVzZW50IG1pcHMgY29wcm9jZXNzb3JzLgotCi0gICAgcDEgZHJlZyBkMSAxICAgICAgICA7IGRhdGEgcmVnaXN0ZXIgImQxIiBmb3IgQ09QMSBoYXMgdmFsdWUgMQotICAgIHAxIGNyZWcgYzMgMyAgICAgICAgOyBjdHJsIHJlZ2lzdGVyICJjMyIgZm9yIENPUDEgaGFzIHZhbHVlIDMKLSAgICBwMyBpbnNuIGZpZSAweDFlOjI0LTIwICAgICAgOyBmdW5jdGlvbiAiZmlsbCIgZm9yIENPUDMgaGFzIHZhbHVlIDMxCi0gICAgcDMgZHJlZyBkMyAzICAgICAgICA7IGRhdGEgcmVnaXN0ZXIgImQzIiBmb3IgQ09QMyBoYXMgdmFsdWUgMwotICAgIHAzIGNyZWcgYzIgMjIgICAgICAgOyBjb250cm9sIHJlZ2lzdGVyICJjMiIgZm9yIENPUDMgaGFzIHZhbHVlIDIyCi0gICAgcDMgaW5zbiBmZWUgMHgxZToyNC0yMCxkcmVnOjE3LTEzLGNyZWc6MTItOCxpbW1lZDo3LTAKLQotICAgIHAzIGRyZWcgZDMgMyAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKLSAgICBwMyBjcmVnIGMyIDIyICAgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgotICAgIHAzIGluc24gZnVtIDB4MDFlMDAwMDEgZHJlZzoxNy0xMyBjcmVnOjEyLTgKLSAgICBwMyBpbnNuIGZvaCAweGY6MjQtMjEgZHJlZzoyMC0xNiBpbW1lZDoxNS0wCi0KLSAgICBwMyBpbnNuIHBpZyAweDE6MjQtMjEqWzB4MTAwfDB4Ml0sIGRyZWc6MjAtMTYsIGltbWVkOjE1LTAqMHgxMDAwMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9pdGJsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1NTQ1Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQotICAgIDsgVGVzdCBjYXNlIGZvciBhc3NlbWJsZXIgb3B0aW9uICJpdGJsIi4KLSAgICA7IFJ1biBhcyAiYXMgLS1pdGJsIGl0YmwgaXRibC5zIgotICAgIDsgb3Igd2l0aCBzdGFuZC1hbG9uZSB0ZXN0IGNhc2UgIml0YmwtdGVzdCBpdGJsIGl0YmwucyIuCi0KLSAgICA7IENhbGwgbWlwcyBjb3Byb2Nlc3NvciAiY29mdW4icyBhcyBkZWZpbmVkIGluICJpdGJsIi4KLQotICAgIGZlZSAkZDMsJGMyLDB4MSAJOyAgMHg0ZmYwNzYwMQotICAgIGZpZSAJICAJOyAgMHg0ZmYwMDAwMAotICAgIGZvaCAkMiwweDEwMAotICAgIGZ1bSAkZDMsJGMyICAgICAJOyAgMHg0ZmYwNzYwMQotICAgIHBpZyAkMiwweDEwMAotCi0gICAgOyBDYWxsIGEgbWlwcyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiB3aXRoIHJlZ2lzdGVyICJkMSIgCi0gICAgOyBkZWZpbmVkIGluICJpdGJsIi4KLQotICAgIExXQzEgJGQxLDB4MTAwKCQyKQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1lbXBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2Y2NmYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGphbC1lbXBpYwotI2FzOiAtbWlwczEgLW1lbWJlZGRlZC1waWMKLSNzb3VyY2U6IGphbC5zCi0KLSMgVGVzdCB0aGUgamFsIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGphbHIJXCR0OQotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBqYWxyCVwkYTAsXCR0OQotMCswMDBjIDxbXj5dKj4gbm9wCi0wKzAwMTAgPFtePl0qPiBiYWwJMCswMDAwIDx0ZXh0X2xhYmVsPgotWyAJXSoxMDogUENSRUwxNgkudGV4dAotMCswMDE0IDxbXj5dKj4gbm9wCi0wKzAwMTggPFtePl0qPiBiYWwJMCswMDE4IDx0ZXh0X2xhYmVsXCsoMHh8KTE4PgotWyAJXSoxODogUENSRUwxNglleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwMWMgPFtePl0qPiBub3AKLTArMDAyMCA8W14+XSo+IGIJMCswMDAwIDx0ZXh0X2xhYmVsPgotWyAJXSoyMDogUENSRUwxNgkudGV4dAotMCswMDI0IDxbXj5dKj4gbm9wCi0wKzAwMjggPFtePl0qPiBiCTArMDAyOCA8dGV4dF9sYWJlbFwrKDB4fCkyOD4KLVsgCV0qMjg6IFBDUkVMMTYJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMDJjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1zdnI0cGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1zdnI0cGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNWJlNzYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtc3ZyNHBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIFIzMDAwIGphbC1zdnI0cGljCi0jYXM6IC1taXBzMSAtS1BJQyAtbWNwdT1yMzAwMAotCi0jIFRlc3QgdGhlIGphbCBtYWNybyB3aXRoIC1LUElDLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdWkJXCRncCwweDAKLVsgCV0qMDogUl9NSVBTX0hJMTYJX2dwX2Rpc3AKLTArMDAwNCA8W14+XSo+IGFkZGl1CVwkZ3AsXCRncCwwCi1bIAldKjQ6IFJfTUlQU19MTzE2CV9ncF9kaXNwCi0wKzAwMDggPFtePl0qPiBhZGR1CVwkZ3AsXCRncCxcJHQ5Ci0wKzAwMGMgPFtePl0qPiBzdwlcJGdwLDBcKFwkc3BcKQotMCswMDEwIDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwMTQgPFtePl0qPiBub3AKLTArMDAxOCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwMWMgPFtePl0qPiBqYWxyCVwkYTAsXCR0OQotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQotMCswMDI4IDxbXj5dKj4gbm9wCi0wKzAwMmMgPFtePl0qPiBsdwlcJHQ5LDBcKFwkZ3BcKQotWyAJXSoyYzogUl9NSVBTX0dPVDE2CS50ZXh0Ci0wKzAwMzAgPFtePl0qPiBub3AKLTArMDAzNCA8W14+XSo+IGFkZGl1CVwkdDksXCR0OSwwCi1bIAldKjM0OiBSX01JUFNfTE8xNgkudGV4dAotMCswMDM4IDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwNDQgPFtePl0qPiBub3AKLTArMDA0OCA8W14+XSo+IGx3CVwkdDksMFwoXCRncFwpCi1bIAldKjQ4OiBSX01JUFNfQ0FMTDE2CWV4dGVybmFsX3RleHRfbGFiZWwKLTArMDA0YyA8W14+XSo+IG5vcAotMCswMDUwIDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwNTQgPFtePl0qPiBub3AKLTArMDA1OCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwNWMgPFtePl0qPiBiCTArMDAwMCA8dGV4dF9sYWJlbD4KLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4OWRmYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1zdnI0cGljLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgamFsIG1hY3JvIHdpdGggLUtQSUMgY29kZS4KLQkKLXRleHRfbGFiZWw6CQotCS5zZXQJbm9yZW9yZGVyCi0JLmNwbG9hZAkkMjUKLQkuc2V0CXJlb3JkZXIKLQkuY3ByZXN0b3JlCTAKLQlqYWwJJDI1Ci0JamFsCSQ0LCQyNQotCWphbAl0ZXh0X2xhYmVsCi0JamFsCWV4dGVybmFsX3RleHRfbGFiZWwKLQkKLSMgVGVzdCBqIGFzIHdlbGwJCi0Jagl0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC14Z290LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC14Z290LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNmRjYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIFIzMDAwIGphbC14Z290Ci0jYXM6IC1taXBzMSAtS1BJQyAteGdvdCAtbWNwdT1yMzAwMAotI3NvdXJjZTogamFsLXN2cjRwaWMucwotCi0jIFRlc3QgdGhlIGphbCBtYWNybyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdWkJXCRncCwweDAKLVsgCV0qMDogUl9NSVBTX0hJMTYJX2dwX2Rpc3AKLTArMDAwNCA8W14+XSo+IGFkZGl1CVwkZ3AsXCRncCwwCi1bIAldKjQ6IFJfTUlQU19MTzE2CV9ncF9kaXNwCi0wKzAwMDggPFtePl0qPiBhZGR1CVwkZ3AsXCRncCxcJHQ5Ci0wKzAwMGMgPFtePl0qPiBzdwlcJGdwLDBcKFwkc3BcKQotMCswMDEwIDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwMTQgPFtePl0qPiBub3AKLTArMDAxOCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwMWMgPFtePl0qPiBqYWxyCVwkYTAsXCR0OQotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQotMCswMDI4IDxbXj5dKj4gbm9wCi0wKzAwMmMgPFtePl0qPiBsdwlcJHQ5LDBcKFwkZ3BcKQotWyAJXSoyYzogUl9NSVBTX0dPVDE2CS50ZXh0Ci0wKzAwMzAgPFtePl0qPiBub3AKLTArMDAzNCA8W14+XSo+IGFkZGl1CVwkdDksXCR0OSwwCi1bIAldKjM0OiBSX01JUFNfTE8xNgkudGV4dAotMCswMDM4IDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwNDQgPFtePl0qPiBsdWkJXCR0OSwweDAKLVsgCV0qNDQ6IFJfTUlQU19DQUxMX0hJMTYJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMDQ4IDxbXj5dKj4gYWRkdQlcJHQ5LFwkdDksXCRncAotMCswMDRjIDxbXj5dKj4gbHcJXCR0OSwwXChcJHQ5XCkKLVsgCV0qNGM6IFJfTUlQU19DQUxMX0xPMTYJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMDUwIDxbXj5dKj4gbm9wCi0wKzAwNTQgPFtePl0qPiBqYWxyCVwkdDkKLTArMDA1OCA8W14+XSo+IG5vcAotMCswMDVjIDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDA2MCA8W14+XSo+IGIJMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YjU4NmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwuZAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBqYWwKLQotIyBUZXN0IHRoZSBqYWwgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGphbHIJXCR0OQotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBqYWxyCVwkYTAsXCR0OQotMCswMDBjIDxbXj5dKj4gbm9wCi0wKzAwMTAgPFtePl0qPiBqYWwJMCsgPHRleHRfbGFiZWw+Ci1bIAldKjEwOiAoTUlQU19KTVB8TUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCS50ZXh0Ci0wKzAwMTQgPFtePl0qPiBub3AKLTArMDAxOCA8W14+XSo+IGphbAkwKyA8dGV4dF9sYWJlbD4KLVsgCV0qMTg6IChNSVBTX0pNUHxKTVBBRERSfFJfTUlQU18yNikJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMDFjIDxbXj5dKj4gbm9wCi0wKzAwMjAgPFtePl0qPiBqCTArIDx0ZXh0X2xhYmVsPgotWyAJXSoyMDogKE1JUFNfSk1QfEpNUEFERFJ8Ul9NSVBTXzI2KQkudGV4dAotMCswMDI0IDxbXj5dKj4gbm9wCi0wKzAwMjggPFtePl0qPiBqCTArIDx0ZXh0X2xhYmVsPgotWyAJXSoyODogKE1JUFNfSk1QfEpNUEFERFJ8Ul9NSVBTXzI2KQlleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwMmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzliZTk1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgamFsIG1hY3JvLgotCS5nbG9ibAl0ZXh0X2xhYmVsCS50ZXh0Ci10ZXh0X2xhYmVsOgkKLQlqYWwJJDI1Ci0JamFsCSQ0LCQyNQotCWphbAl0ZXh0X2xhYmVsCi0JamFsCWV4dGVybmFsX3RleHRfbGFiZWwKLQkKLSMgVGVzdCBqIGFzIHdlbGwJCi0Jagl0ZXh0X2xhYmVsCi0JaglleHRlcm5hbF90ZXh0X2xhYmVsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMjk1NzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYS1lbXBpYwotI2FzOiAtbWlwczEgLW1lbWJlZGRlZC1waWMKLQotIyBUZXN0IHRoZSBsYSBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsaQlcJGEwLDAKLTArMDAwNCA8W14+XSo+IGxpCVwkYTAsMQotMCswMDA4IDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAwYyA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwMTAgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLTArMDAxYyA8W14+XSo+IGxpCVwkYTAsMAotMCswMDIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDI0IDxbXj5dKj4gbGkJXCRhMCwxCi0wKzAwMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMmMgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDAzOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotMCswMDRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDUwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4NAotWyAJXSo1MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDU0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qNTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA1OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA1YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA2MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDY0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4NAotWyAJXSo2NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwNjggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE1Mzg0Ci1bIAldKjY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA2YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODMKLVsgCV0qNmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA3MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMQotWyAJXSo3NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMQotWyAJXSo3ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwN2MgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMQotWyAJXSo3YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODMKLVsgCV0qODA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDg0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNTM4MwotWyAJXSo4NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwODggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2Mzg0Ci1bIAldKjg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwOGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwOTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSo5MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDk4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qOTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDljIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGEwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qYTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGE4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwYjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2Mzg0Ci1bIAldKmIwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBiNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBiOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTUzODQKLVsgCV0qYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGMwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4MwotWyAJXSpjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMGM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGM4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKLVsgCV0qYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBkMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKmQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBkOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKmQ4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBlMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKmUwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGU4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4MwotWyAJXSplODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwZjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE1MzgzCi1bIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBmOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpmODogUkVMSEkJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMGZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDI1MgotWyAJXSpmYzogUkVMTE8JZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMTAwIDxbXj5dKj4gbGkJXCRhMCwyNDgKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkZjVlMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGEgbWFjcm8gd2l0aCAtbWVtYmVkZGVkLXBpYwotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLXRleHRfbGFiZWw6CQotCWxhCSQ0LDAKLQlsYQkkNCwxCi0JbGEJJDQsMHg4MDAwCi0JbGEJJDQsLTB4ODAwMAotCWxhCSQ0LDB4MTAwMDAKLQlsYQkkNCwweDFhNWE1Ci0JbGEJJDQsMCgkNSkKLQlsYQkkNCwxKCQ1KQotCWxhCSQ0LDB4ODAwMCgkNSkKLQlsYQkkNCwtMHg4MDAwKCQ1KQotCWxhCSQ0LDB4MTAwMDAoJDUpCi0JbGEJJDQsMHgxYTVhNSgkNSkKLQlsYQkkNCxkYXRhX2xhYmVsCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsYQkkNCxkYXRhX2xhYmVsKzEKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxhCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsYQkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQotc2Vjb25kX3RleHRfbGFiZWw6CQotCWxhCSQ0LGV4dGVybmFsX3RleHRfbGFiZWwgLSB0ZXh0X2xhYmVsCi0JbGEJJDQsc2Vjb25kX3RleHRfbGFiZWwgLSB0ZXh0X2xhYmVsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLXN2cjRwaWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtc3ZyNHBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDkzM2U3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtc3ZyNHBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYS1zdnI0cGljCi0jYXM6IC1taXBzMSAtS1BJQyAtLWRlZnN5bSBLUElDPTEKLSNzb3VyY2U6IGxhLnMKLQotIyBUZXN0IHRoZSBsYSBtYWNybyB3aXRoIC1LUElDLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci1bMC05YS1mXSsgPFtePl0qPiBsaQlcJGEwLDAKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMSwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTEsMQotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMSwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzE3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMxNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIyMTMxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMTc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzE3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjIxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEteGdvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGFlZjAyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsNjE1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYS14Z290Ci0jYXM6IC1taXBzMSAtS1BJQyAteGdvdCAtLWRlZnN5bSBLUElDPTEKLSNzb3VyY2U6IGxhLnMKLQotIyBUZXN0IHRoZSBsYSBtYWNybyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci1bMC05YS1mXSsgPFtePl0qPiBsaQlcJGEwLDAKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMSwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTEsMQotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMSwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzE3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMTc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIyMTMxCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMTc2OAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBub3AKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IG5vcAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gbm9wCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMxNzY4Ci1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuZGF0YQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVDE2CS5ic3MKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0xPMTYJLmJzcwotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UMTYJLmRhdGEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19MTzE2CS5kYXRhCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLVswLTlhLWZdKyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKlswLTlhLWZdKzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpbMC05YS1mXSs6IFJfTUlQU19HT1QxNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhdCwweDIKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjIxMzEKLVsgCV0qWzAtOWEtZl0rOiBSX01JUFNfTE8xNgkuYnNzCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ODMxNzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS5kCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYQotI2FzOiAtbWlwczEKLQotIyBUZXN0IHRoZSBsYSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotWzAtOWEtZl0rIDxbXj5dKj4gbGkJXCRhMCwwCi1bMC05YS1mXSsgPFtePl0qPiBsaQlcJGEwLDEKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi1bMC05YS1mXSsgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDEKLVswLTlhLWZdKyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTEsMAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGExLDEKLVswLTlhLWZdKyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTEsLTMyNzY4Ci1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDEKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MQotWzAtOWEtZl0rIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi1bMC05YS1mXSsgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLVswLTlhLWZdKyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLVswLTlhLWZdKyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi1bMC05YS1mXSsgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpbMC05YS1mXSs6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotWzAtOWEtZl0rIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotWzAtOWEtZl0rIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qWzAtOWEtZl0rOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLVswLTlhLWZdKyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKlswLTlhLWZdKzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi1bMC05YS1mXSsgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OGM4MTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsYSBtYWNyby4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JbGEJJDQsMAotCWxhCSQ0LDEKLQlsYQkkNCwweDgwMDAKLQlsYQkkNCwtMHg4MDAwCi0JbGEJJDQsMHgxMDAwMAotCWxhCSQ0LDB4MWE1YTUKLQlsYQkkNCwwKCQ1KQotCWxhCSQ0LDEoJDUpCi0JbGEJJDQsMHg4MDAwKCQ1KQotCWxhCSQ0LC0weDgwMDAoJDUpCi0JbGEJJDQsMHgxMDAwMCgkNSkKLQlsYQkkNCwweDFhNWE1KCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbgotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCWxhCSQ0LGRhdGFfbGFiZWwrMQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JbGEJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCWxhCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQlsYQkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCWxhCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JbGEJJDQsZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0JbGEJJDQsZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYQkkNCxkYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYQkkNCxkYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQotCS5pZm5kZWYJS1BJQwotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQkuZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItZW1waWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyNGEzMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLWVtcGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxiLWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYwotI3NvdXJjZTogbGItcGljLnMKLQotIyBUZXN0IHRoZSBsYiBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsYglcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAwYyA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAxMCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDFjIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwMjAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTFcKQotMCswMDI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGExXCkKLTArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDM4IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwNTQgPFtePl0qPiBsYglcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKjU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwNTggPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo1ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDVjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDYwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDY0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNjggPFtePl0qPiBsYglcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKjY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA2YyA8W14+XSo+IGxiCVwkYTAsLTE1Mzg0XChcJGdwXCkKLVsgCV0qNmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDcwIDxbXj5dKj4gbGIJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDc0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKLVsgCV0qNzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCi1bIAldKjc4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3YyA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCi1bIAldKjdjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCi1bIAldKjgwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDg0IDxbXj5dKj4gbGIJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSo4NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwODggPFtePl0qPiBsYglcJGEwLC0xNTM4M1woXCRncFwpCi1bIAldKjg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA4YyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDA5MCA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGEwXCkKLVsgCV0qOTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDA5OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSphMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSpiMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBiOCA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGEwXCkKLVsgCV0qYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGMwIDxbXj5dKj4gbGIJXCRhMCwtMTUzODRcKFwkYTBcKQotWyAJXSpjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYzggPFtePl0qPiBsYglcJGEwLC0xNjM4M1woXCRhMFwpCi1bIAldKmM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwY2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwZDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSpkMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGQ4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGUwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qZTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGU4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qZTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwZjAgPFtePl0qPiBsYglcJGEwLC0xNjM4M1woXCRhMFwpCi1bIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBmOCA8W14+XSo+IGxiCVwkYTAsLTE1MzgzXChcJGEwXCkKLVsgCV0qZjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGZjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1waWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjZmRmOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXBpYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxiIG1hY3JvIHdpdGggUElDIGNvZGUuCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCWxiCSQ0LDAKLQlsYgkkNCwxCi0JbGIJJDQsMHg4MDAwCi0JbGIJJDQsLTB4ODAwMAotCWxiCSQ0LDB4MTAwMDAKLQlsYgkkNCwweDFhNWE1Ci0JbGIJJDQsMCgkNSkKLQlsYgkkNCwxKCQ1KQotCWxiCSQ0LDB4ODAwMCgkNSkKLQlsYgkkNCwtMHg4MDAwKCQ1KQotCWxiCSQ0LDB4MTAwMDAoJDUpCi0JbGIJJDQsMHgxYTVhNSgkNSkKLQlsYgkkNCxkYXRhX2xhYmVsCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsYgkkNCxkYXRhX2xhYmVsKzEKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxiCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsYgkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1zdnI0cGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODg0ZDYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1zdnI0cGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxiLXN2cjRwaWMKLSNhczogLW1pcHMxIC1LUElDCi0jc291cmNlOiBsYi1waWMucwotCi0jIFRlc3QgdGhlIGxiIG1hY3JvIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDBjIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDEwIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwMWMgPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDAyMCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDAyNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPFtePl0qPiBsYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMzggPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNDggPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDA1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjU0OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDA1OCA8W14+XSo+IG5vcAotMCswMDVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qNWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwNjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDxbXj5dKj4gbm9wCi0wKzAwNmMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDcwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNzA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBub3AKLTArMDA3OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo3YzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IG5vcAotMCswMDg0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjg4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOGMgPFtePl0qPiBub3AKLTArMDA5MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwOTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo5NDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDA5OCA8W14+XSo+IG5vcAotMCswMDljIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qOWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBhMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSphNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBhOCA8W14+XSo+IG5vcAotMCswMGFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qYWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBiMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiNDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwYjggPFtePl0qPiBub3AKLTArMDBiYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKmJjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMGMwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBjNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmM0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjOCA8W14+XSo+IG5vcAotMCswMGNjIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBkMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmQwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ0IDxbXj5dKj4gbm9wCi0wKzAwZDggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZGM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTAgPFtePl0qPiBub3AKLTArMDBlNCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSplODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGVjIDxbXj5dKj4gbm9wCi0wKzAwZjAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZjQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwZjggPFtePl0qPiBub3AKLTArMDBmYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKmZjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTA0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTA0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTA4IDxbXj5dKj4gbm9wCi0wKzAxMGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSoxMGM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDExMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMTQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTE4IDxbXj5dKj4gbm9wCi0wKzAxMWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxMWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTI4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IG5vcAotMCswMTMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTM0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDEzOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjEzODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzYyA8W14+XSo+IG5vcAotMCswMTQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTQ0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE0ODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IG5vcAotMCswMTUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTU0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE1OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE1ODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTVjIDxbXj5dKj4gbm9wCi0wKzAxNjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxNjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTY4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTZjIDxbXj5dKj4gbm9wCi0wKzAxNzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxNzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE3NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE3OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxN2M6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxODAgPFtePl0qPiBub3AKLTArMDE4NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKjE4NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMTg4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMThjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE5MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE5MDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxOTQgPFtePl0qPiBub3AKLTArMDE5OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjE5ODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDE5YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFhMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxYTQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWE4IDxbXj5dKj4gbm9wCi0wKzAxYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYjAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWI0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWI4IDxbXj5dKj4gbm9wCi0wKzAxYmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYzAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWM0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWM4IDxbXj5dKj4gbm9wCi0wKzAxY2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWQ0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWQ0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZDggPFtePl0qPiBub3AKLTArMDFkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFlMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxZTQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxZTggPFtePl0qPiBub3AKLTArMDFlYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjFlYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMWYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWY0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFmOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFmODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFmYyA8W14+XSo+IG5vcAotMCswMjAwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMjAwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyMDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMDggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjBjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QtaWxvY2tzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QtaWxvY2tzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGJkMjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi14Z290LWlsb2Nrcy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYi14Z290LWlsb2NrcwotI2FzOiAtbWlwczEgLUtQSUMgLXhnb3QgLW1jcHU9cjM5MDAKLSNzb3VyY2U6IGxiLXBpYy5zCi0KLSMgVGVzdCB0aGUgbGIgbWFjcm8gd2l0aCAtS1BJQyAteGdvdC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKLTArMDAwMCA8Lio+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8Lio+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8Lio+IGx1aQlcJGEwLDB4MQotMCswMDBjIDwuKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDEwIDwuKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPC4qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwMWMgPC4qPiBsdWkJXCRhMCwweDIKLTArMDAyMCA8Lio+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDAyNCA8Lio+IGxiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPC4qPiBsYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDwuKj4gbHVpCVwkYTAsMHgxCi0wKzAwMzAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPC4qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMzggPC4qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPC4qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNDggPC4qPiBsdWkJXCRhMCwweDIKLTArMDA0YyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8Lio+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDA1NCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQk1NDogUl9NSVBTX0dPVDE2CVwuZGF0YQotMCswMDU4IDwuKj4gbm9wCi0wKzAwNWMgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJNWM6IFJfTUlQU19MTzE2CVwuZGF0YQotMCswMDYwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA2NCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJNjQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDZjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTZjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3MCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNzQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTc0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDdjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTdjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDgwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA4NCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJODQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwOGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJOGM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDk0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQk5NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDk4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDljIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTljOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGE0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCWE0OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDBhOCA8Lio+IG5vcAotMCswMGFjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCWFjOiBSX01JUFNfTE8xNglcLmJzcwotMCswMGIwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBiNCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQliNDogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAwYjggPC4qPiBub3AKLTArMDBiYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi0JCQliYzogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDBjMCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYzQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJYzQ6IFJfTUlQU19HT1QxNglcLmRhdGEKLTArMDBjOCA8Lio+IG5vcAotMCswMGNjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCWNjOiBSX01JUFNfTE8xNglcLmRhdGEKLTArMDBkMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZDQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCWQ0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBkYyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQlkYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGU0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQllNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBlYyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQllYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZjQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCWY0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGY4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGZjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCWZjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDEwNCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMTA0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxMGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMTBjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMTAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTE0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTExNDogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAxMTggPC4qPiBub3AKLTArMDExYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQkxMWM6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAxMjAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTI0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTEyNDogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAxMjggPC4qPiBub3AKLTArMDEyYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi0JCQkxMmM6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAxMzAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTM0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTEzNDogUl9NSVBTX0dPVDE2CVwuZGF0YQotMCswMTM4IDwuKj4gbm9wCi0wKzAxM2MgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJMTNjOiBSX01JUFNfTE8xNglcLmRhdGEKLTArMDE0MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE0NCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxNDggPC4qPiBsdWkJXCRhMCwweDAKLQkJCTE0ODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNGMgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxNTAgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMTUwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE1NCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE1OCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxNWMgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTE1YzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE2NCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxNjQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxNmMgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTcwIDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxNzA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxNzggPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMTc4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTdjIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTgwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE4NCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMTg0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxODggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxOGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMThjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxOTQgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTk4IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTE5ODogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAxOWMgPC4qPiBub3AKLTArMDFhMCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQkxYTA6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAxYTQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYTggPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWFjIDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTFhYzogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAxYjAgPC4qPiBub3AKLTArMDFiNCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi0JCQkxYjQ6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAxYjggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYmMgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWMwIDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTFjMDogUl9NSVBTX0dPVDE2CVwuZGF0YQotMCswMWM0IDwuKj4gbm9wCi0wKzAxYzggPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJMWM4OiBSX01JUFNfTE8xNglcLmRhdGEKLTArMDFjYyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFkMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZDQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTFkNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxZGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMWRjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlMCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFlNCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZTggPC4qPiBsdWkJXCRhMCwweDAKLQkJCTFlODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlYyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFmMCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxZjA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZjQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZjggPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWZjIDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxZmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyMDQgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMjA0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjA4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjBjIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDIxMCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMjEwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMTQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyMTggPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJMjE4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMWMgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMjAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjI0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTIyNDogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAyMjggPC4qPiBub3AKLTArMDIyYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQkyMmM6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAyMzAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMzQgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjM4IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTIzODogUl9NSVBTX0dPVDE2CVwuYnNzCi0wKzAyM2MgPC4qPiBub3AKLTArMDI0MCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi0JCQkyNDA6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAyNDQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNDggPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjRjIDwuKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMThjNjdlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsYi14Z290Ci0jYXM6IC1taXBzMSAtS1BJQyAteGdvdCAtbWNwdT1yMzAwMAotI3NvdXJjZTogbGItcGljLnMKLQotIyBUZXN0IHRoZSBsYiBtYWNybyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsYglcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAwYyA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAxMCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDFjIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwMjAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTFcKQotMCswMDI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGExXCkKLTArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDM4IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwNTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1NDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwNTggPFtePl0qPiBub3AKLTArMDA1YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjVjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDYwIDxbXj5dKj4gbm9wCi0wKzAwNjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDY4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjY4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA3MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjcwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IG5vcAotMCswMDc4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA3YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo3YzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA4MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA4NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjg0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDg4IDxbXj5dKj4gbm9wCi0wKzAwOGMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDkwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjkwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qOTg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOWMgPFtePl0qPiBub3AKLTArMDBhMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qYTQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBhOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBhYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKmFjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjAgPFtePl0qPiBub3AKLTArMDBiNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBiYyA8W14+XSo+IG5vcAotMCswMGMwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qYzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBjNCA8W14+XSo+IG5vcAotMCswMGM4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmNjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMGQwIDxbXj5dKj4gbm9wCi0wKzAwZDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSpkNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMGQ4IDxbXj5dKj4gbm9wCi0wKzAwZGMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGUwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZTA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMGU0IDxbXj5dKj4gbm9wCi0wKzAwZTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSplODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBlYyA8W14+XSo+IG5vcAotMCswMGYwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBmNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpmNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSpmYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMDAgPFtePl0qPiBub3AKLTArMDEwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMDggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTA4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTBjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTEwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTE0IDxbXj5dKj4gbm9wCi0wKzAxMTggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTFjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjExYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDEyNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjEyNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEyOCA8W14+XSo+IG5vcAotMCswMTJjIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDEzMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMzA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEzNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDEzOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjEzODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbm9wCi0wKzAxNDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTQ0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTQ0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTQ4IDxbXj5dKj4gbm9wCi0wKzAxNGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxNGM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE1MCA8W14+XSo+IG5vcAotMCswMTU0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDE1OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE1ODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE1YyA8W14+XSo+IG5vcAotMCswMTYwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMTYwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNjQgPFtePl0qPiBub3AKLTArMDE2OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxNmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNmM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTcwIDxbXj5dKj4gbm9wCi0wKzAxNzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxNzQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxNzggPFtePl0qPiBub3AKLTArMDE3YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE4MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxODQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTg0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE4YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjE4YzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOTAgPFtePl0qPiBub3AKLTArMDE5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE5OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxOWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTljOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWEwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWE0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWE4IDxbXj5dKj4gbm9wCi0wKzAxYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWI0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFiNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjFiYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IG5vcAotMCswMWM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWM4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDFjYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxY2M6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFkMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFkNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjFkNDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWQ4IDxbXj5dKj4gbm9wCi0wKzAxZGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWU0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMWU4IDxbXj5dKj4gbm9wCi0wKzAxZWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxZWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFmMCA8W14+XSo+IG5vcAotMCswMWY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWY4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDFmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFmYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDIwMCA8W14+XSo+IG5vcAotMCswMjA0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMjA0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyMDggPFtePl0qPiBub3AKLTArMDIwYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIxMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAyMTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyMTQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMjE4IDxbXj5dKj4gbm9wCi0wKzAyMWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoyMWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyMjAgPFtePl0qPiBub3AKLTArMDIyNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIyOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyMmMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjJjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDIzNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjIzNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzggPFtePl0qPiBub3AKLTArMDIzYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI0MCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyNDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjQ0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMjRjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjUwIDxbXj5dKj4gbm9wCi0wKzAyNTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNTggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjVjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI1YzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI2MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDI2NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjI2NDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI2OCA8W14+XSo+IG5vcAotMCswMjZjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjcwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDI3NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyNzQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI3OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDI3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjI3YzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjgwIDxbXj5dKj4gbm9wCi0wKzAyODQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyODggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjhjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjhjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMjkwIDxbXj5dKj4gbm9wCi0wKzAyOTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoyOTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI5OCA8W14+XSo+IG5vcAotMCswMjljIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmEwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDJhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjJhNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDJhOCA8W14+XSo+IG5vcAotMCswMmFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMmFjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyYjAgPFtePl0qPiBub3AKLTArMDJiNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJiOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyYmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1YzRjNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxiCi0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIGxiIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsYglcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAwYyA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAxMCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDFjIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwMjAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTFcKQotMCswMDI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGExXCkKLTArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDM4IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgyCi0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDU4IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSo1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjQgPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo2NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDZjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDcwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNzQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwNzggPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMDdjIDxbXj5dKj4gbGIJXCRhMCwtMTYzODRcKFwkZ3BcKQotWyAJXSo3YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwODAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDg0IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSo4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA4YyA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi1bIAldKjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTAgPFtePl0qPiBsYglcJGEwLDFcKFwkZ3BcKQotWyAJXSo5MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qOTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDk4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDljIDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKLVsgCV0qOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTQgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKmE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGE4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGdwXCkKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGFjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGIwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qYjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGI0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYmMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYzggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwY2MgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBkMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGQ0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwZDggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBkYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDBlMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDBlNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSplNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSplODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qZjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGZjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTA4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTBjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjEwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDExMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjExMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDExNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTE4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDExYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjExYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjEyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjEyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTM4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjEzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjE0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE0OCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTRjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE1MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjE1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNTQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTU4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE1YyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTYwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTY4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2YyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTc0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTc4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTdjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTgwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTg0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTg0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE4OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjE4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxOGMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMThjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE5MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE5NCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMTk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE5OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFhMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMWE4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDFiYyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjFiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxYzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYzggPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjFjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDFkMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjFkMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFkYyA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFlMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFlOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjFlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMWYwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qMWYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFmNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWZjIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIwMCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDIwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi1bIAldKjIwNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIwOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyMGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMTAgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjIxMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIxNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDIxOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjIxODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMWMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjI0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIyOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjMwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjNjIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI0MCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjI0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNDggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjRjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjU0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjU4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjYwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjY0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI2YyA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNzAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI3NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI3OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyN2MgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyODQgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjkwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjkwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyOTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjk4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjljIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMmFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmI0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMmI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmI4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYzAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMmM0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJjOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJjYyA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJkMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmQ4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMmQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZGMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmU0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoyZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmY0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmZjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMmZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzAwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzA0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzA4IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSozMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMGMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzEwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzE0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMzE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDMxOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMjAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzI0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMmMgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMzggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzNjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM0NCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjM0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNDggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNTAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNTQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzNTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNWMgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzNjAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzY4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM2YyA8W14+XSo+IGxidQlcJGEwLDBcKFwkemVyb1wpCi0wKzAzNzAgPFtePl0qPiBsaAlcJGEwLDBcKFwkemVyb1wpCi0wKzAzNzQgPFtePl0qPiBsaHUJXCRhMCwwXChcJHplcm9cKQotMCswMzc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJHplcm9cKQotMCswMzdjIDxbXj5dKj4gbHdsCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM4MCA8W14+XSo+IGx3cglcJGEwLDBcKFwkemVyb1wpCi0wKzAzODQgPFtePl0qPiBsd2MwCVwkNCwwXChcJHplcm9cKQotMCswMzg4IDxbXj5dKj4gbHdjMQlcJGY0LDBcKFwkemVyb1wpCi0wKzAzOGMgPFtePl0qPiBsd2MyCVwkNCwwXChcJHplcm9cKQotMCswMzkwIDxbXj5dKj4gbHdjMwlcJDQsMFwoXCR6ZXJvXCkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzY2NhZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxiIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQlsYgkkNCwwCi0JbGIJJDQsMQotCWxiCSQ0LDB4ODAwMAotCWxiCSQ0LC0weDgwMDAKLQlsYgkkNCwweDEwMDAwCi0JbGIJJDQsMHgxYTVhNQotCWxiCSQ0LDAoJDUpCi0JbGIJJDQsMSgkNSkKLQlsYgkkNCwweDgwMDAoJDUpCi0JbGIJJDQsLTB4ODAwMCgkNSkKLQlsYgkkNCwweDEwMDAwKCQ1KQotCWxiCSQ0LDB4MWE1YTUoJDUpCi0JbGIJJDQsZGF0YV9sYWJlbAotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JbGIJJDQsZGF0YV9sYWJlbCsxCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlsYgkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JbGIJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCWxiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JbGIJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlsYgkkNCxkYXRhX2xhYmVsKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0JbGIJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGIJJDQsZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYgkkNCxkYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCi0jIFNldmVyYWwgbWFjcm9zIGFyZSBoYW5kbGVkIGxpa2UgbGIuICBTYW5pdHkgY2hlY2sgdGhlbS4KLQlsYnUJJDQsMAotCWxoCSQ0LDAKLQlsaHUJJDQsMAotCWx3CSQ0LDAKLQlsd2wJJDQsMAotCWx3cgkkNCwwCi0JbHdjMAkkNCwwCi0JbHdjMQkkNCwwCi0JbHdjMgkkNCwwCi0JbHdjMwkkNCwwCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWVtcGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOTYxZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsZC1lbXBpYwotI2FzOiAtbWlwczEgLW1lbWJlZGRlZC1waWMgLS1kZWZzeW0gRU1QSUM9MQotI3NvdXJjZTogbGQtcGljLnMKLQotIyBUZXN0IHRoZSBsZCBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNmMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwODggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwOTAgPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKjkwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwOTQgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRncFwpCi1bIAldKjk0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo5ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmE0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmFjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmIwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjggPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKmI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBiYyA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGdwXCkKLVsgCV0qYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGMwIDxbXj5dKj4gbHcJXCRhMCwtMTUzODRcKFwkZ3BcKQotWyAJXSpjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYzQgPFtePl0qPiBsdwlcJGExLC0xNTM4MFwoXCRncFwpCi1bIAldKmM0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjOCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDBjYyA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGdwXCkKLVsgCV0qY2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDBkMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSpkNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGRjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGUwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZWMgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSplYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmMCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGY0IDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkZ3BcKQotWyAJXSpmNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZjggPFtePl0qPiBsdwlcJGEwLC0xNTM4M1woXCRncFwpCi1bIAldKmY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsLTE1Mzc5XChcJGdwXCkKLVsgCV0qZmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTAwIDxbXj5dKj4gbm9wCi0wKzAxMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxMDggPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRhdFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMTBjIDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkYXRcKQotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDExMCA8W14+XSo+IG5vcAotMCswMTE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxMWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyMCA8W14+XSo+IG5vcAotMCswMTI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjEyYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBub3AKLTArMDEzNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDEzOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjEzODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxM2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxM2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gbm9wCi0wKzAxNDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxNDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxNDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxNGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBub3AKLTArMDE1NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDE1OCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGF0XCkKLVsgCV0qMTU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDE1YyA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGF0XCkKLVsgCV0qMTVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDE2MCA8W14+XSo+IG5vcAotMCswMTY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTY4IDxbXj5dKj4gbHcJXCRhMCwtMTUzODRcKFwkYXRcKQotWyAJXSoxNjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTZjIDxbXj5dKj4gbHcJXCRhMSwtMTUzODBcKFwkYXRcKQotWyAJXSoxNmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTcwIDxbXj5dKj4gbm9wCi0wKzAxNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxNzggPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRhdFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMTdjIDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkYXRcKQotWyAJXSoxN2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDE4MCA8W14+XSo+IG5vcAotMCswMTg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTg4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5MCA8W14+XSo+IG5vcAotMCswMTk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTk4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjE5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTAgPFtePl0qPiBub3AKLTArMDFhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFhOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxYWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWIwIDxbXj5dKj4gbm9wCi0wKzAxYjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxYjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBub3AKLTArMDFjNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFjOCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGF0XCkKLVsgCV0qMWM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFjYyA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGF0XCkKLVsgCV0qMWNjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFkMCA8W14+XSo+IG5vcAotMCswMWQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwtMTUzODNcKFwkYXRcKQotWyAJXSoxZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMWRjIDxbXj5dKj4gbHcJXCRhMSwtMTUzNzlcKFwkYXRcKQotWyAJXSoxZGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1pbG9ja3MtYWRkcjMyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy1hZGRyMzIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0NmQ2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy1hZGRyMzIuZAorKysgL2Rldi9udWxsCkBAIC0xLDYzMiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI2FzOiAtbWlwczMgLW1jcHU9cjQwMDAKLSNuYW1lOiBNSVBTIGxkLWlsb2NrcwotI3NvdXJjZTogbGQucwotCi0jIFRlc3QgdGhlIGxkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPC50ZXh0PiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTFcKQotMCswMDQwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDc0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwNzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwN2MgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwODQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qODQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDhjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSphNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSphODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSphYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSpjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBjNCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qYzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGM4IDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkZ3BcKQotWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwY2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGQ0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSpmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjggPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSpmODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjEwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwYyA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExMCA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGdwXCkKLVsgCV0qMTEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjEyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTU0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTYwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTY0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNmMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNzggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTdjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMThjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE5MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTljIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYTggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhYyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFjMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxYzQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFlYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMjA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDIwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjIwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjEwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI0IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjJjIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjMwIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyM2MgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1NCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjc0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjc4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDI4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI4ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjJhNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjJhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyYzAgPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRhdFwpCi1bIAldKjJjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzQgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRhdFwpCi1bIAldKjJjNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJjYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJkMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmUwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJlYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJlYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZjAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZmMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzAwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDMwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjMwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMxMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzMTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSozMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzMjQgPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRhdFwpCi1bIAldKjMyNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMjggPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRhdFwpCi1bIAldKjMyODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDMzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMzNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMzOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMzYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM0NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM2NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozNmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNzQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzdjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDM4MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM4NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzOGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzhjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDM5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM5NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM5OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM5YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswM2EwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2E0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2E4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2FjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2IwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2I0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNiOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2I4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2JjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNjNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2M0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2M4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2QwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Q0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2Q4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2RjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNlMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNlNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2U0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2U4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2VjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswM2YwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Y0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzZjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDAwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDA0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSo0MDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDA4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSo0MDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDBjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0MTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDE4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQxYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0MWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQyNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDI4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQzNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MzggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Mzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDNjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDQ4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0NGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0NTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNDYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDY4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQ2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0NzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDc4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQ3YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0N2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNDgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDg0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDg4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDhjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjQ4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDkwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDk0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0OTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ5OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNDk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0OWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNDljOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRhNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0YWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGI0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGI4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0Yjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGJjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRjNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0Yzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0Y2MgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNGQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDRkYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0ZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNGUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGU0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGU4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGVjIDxbXj5dKj4gbHdjMQlcJGY1LDBcKFwkemVyb1wpCi0wKzA0ZjAgPFtePl0qPiBsd2MxCVwkZjQsNFwoXCR6ZXJvXCkKLTArMDRmNCA8W14+XSo+IGx3YzEJXCRmNSwxXChcJHplcm9cKQotMCswNGY4IDxbXj5dKj4gbHdjMQlcJGY0LDVcKFwkemVyb1wpCi0wKzA0ZmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDUwMCA8W14+XSo+IGx3YzEJXCRmNSwtMzI3NjhcKFwkYXRcKQotMCswNTA0IDxbXj5dKj4gbHdjMQlcJGY0LC0zMjc2NFwoXCRhdFwpCi0wKzA1MDggPFtePl0qPiBsd2MxCVwkZjUsLTMyNzY4XChcJHplcm9cKQotMCswNTBjIDxbXj5dKj4gbHdjMQlcJGY0LC0zMjc2NFwoXCR6ZXJvXCkKLTArMDUxMCA8W14+XSo+IGx3YzEJXCRmNSwwXChcJGExXCkKLTArMDUxNCA8W14+XSo+IGx3YzEJXCRmNCw0XChcJGExXCkKLTArMDUxOCA8W14+XSo+IGx3YzEJXCRmNSwxXChcJGExXCkKLTArMDUxYyA8W14+XSo+IGx3YzEJXCRmNCw1XChcJGExXCkKLTArMDUyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTI4IDxbXj5dKj4gbHdjMQlcJGY1LC0zMjc2OFwoXCRhdFwpCi0wKzA1MmMgPFtePl0qPiBsd2MxCVwkZjQsLTMyNzY0XChcJGF0XCkKLTArMDUzMCA8W14+XSo+IGx3YzEJXCRmNSwtMzI3NjhcKFwkYTFcKQotMCswNTM0IDxbXj5dKj4gbHdjMQlcJGY0LC0zMjc2NFwoXCRhMVwpCi0wKzA1MzggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTQwIDxbXj5dKj4gbHdjMQlcJGY1LC0yMzEzMVwoXCRhdFwpCi1bIAldKjU0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU0NCA8W14+XSo+IGx3YzEJXCRmNCwtMjMxMjdcKFwkYXRcKQotWyAJXSo1NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NDggPFtePl0qPiBub3AKLTArMDU0YyA8W14+XSo+IHN3YzEJXCRmNSwwXChcJHplcm9cKQotMCswNTUwIDxbXj5dKj4gc3djMQlcJGY0LDRcKFwkemVyb1wpCi0wKzA1NTQgPFtePl0qPiBzd2MxCVwkZjUsMVwoXCR6ZXJvXCkKLTArMDU1OCA8W14+XSo+IHN3YzEJXCRmNCw1XChcJHplcm9cKQotMCswNTVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1NjAgPFtePl0qPiBzd2MxCVwkZjUsLTMyNzY4XChcJGF0XCkKLTArMDU2NCA8W14+XSo+IHN3YzEJXCRmNCwtMzI3NjRcKFwkYXRcKQotMCswNTY4IDxbXj5dKj4gc3djMQlcJGY1LC0zMjc2OFwoXCR6ZXJvXCkKLTArMDU2YyA8W14+XSo+IHN3YzEJXCRmNCwtMzI3NjRcKFwkemVyb1wpCi0wKzA1NzAgPFtePl0qPiBzd2MxCVwkZjUsMFwoXCRhMVwpCi0wKzA1NzQgPFtePl0qPiBzd2MxCVwkZjQsNFwoXCRhMVwpCi0wKzA1NzggPFtePl0qPiBzd2MxCVwkZjUsMVwoXCRhMVwpCi0wKzA1N2MgPFtePl0qPiBzd2MxCVwkZjQsNVwoXCRhMVwpCi0wKzA1ODAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDU4OCA8W14+XSo+IHN3YzEJXCRmNSwtMzI3NjhcKFwkYXRcKQotMCswNThjIDxbXj5dKj4gc3djMQlcJGY0LC0zMjc2NFwoXCRhdFwpCi0wKzA1OTAgPFtePl0qPiBzd2MxCVwkZjUsLTMyNzY4XChcJGExXCkKLTArMDU5NCA8W14+XSo+IHN3YzEJXCRmNCwtMzI3NjRcKFwkYTFcKQotMCswNTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjU5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1OWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1YTAgPFtePl0qPiBzd2MxCVwkZjUsLTIzMTMxXChcJGF0XCkKLVsgCV0qNWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVhNCA8W14+XSo+IHN3YzEJXCRmNCwtMjMxMjdcKFwkYXRcKQotWyAJXSo1YTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWE4IDxbXj5dKj4gc3cJXCRhMCwwXChcJHplcm9cKQotMCswNWFjIDxbXj5dKj4gc3cJXCRhMSw0XChcJHplcm9cKQotMCswNWIwIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi1bIAldKjViMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDViNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDViOCA8W14+XSo+IGxkCVwkYTAsLTIzMTMxXChcJGEwXCkKLVsgCV0qNWI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNWJjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjViYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1YzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzA1YzQgPFtePl0qPiBzZAlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjVjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1YzggPFtePl0qPiBub3AKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1pbG9ja3MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtaWxvY2tzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjJiZGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1pbG9ja3MuZAorKysgL2Rldi9udWxsCkBAIC0xLDYzMSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1JUFMgbGQtaWxvY2tzCi0jc291cmNlOiBsZC5zCi0jYXM6Ci0jIFRlc3QgdGhlIGxkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPC50ZXh0PiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTFcKQotMCswMDQwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDc0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwNzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwN2MgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwODQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qODQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDhjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSphNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSphODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSphYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCi1bIAldKmI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSpjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBjNCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qYzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGM4IDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkZ3BcKQotWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwY2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGQ0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSpmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjggPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSpmODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjEwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwYyA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGdwXCkKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExMCA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGdwXCkKLVsgCV0qMTEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjEyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTU0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTYwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTY0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNmMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNzggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTdjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMThjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE5MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTljIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYTggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhYyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjFiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFjMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxYzQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFlYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMjA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDIwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjIwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjEwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI0IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjJjIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjMwIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyM2MgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSoyNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1NCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjc0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjc4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDI4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI4ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjJhNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjJhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyYzAgPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRhdFwpCi1bIAldKjJjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzQgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRhdFwpCi1bIAldKjJjNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJjYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJkMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmUwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJlYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJlYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZjAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZmMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzAwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDMwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjMwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMxMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzMTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSozMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzMjQgPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRhdFwpCi1bIAldKjMyNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMjggPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRhdFwpCi1bIAldKjMyODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDMzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMzNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMzOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMzYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM0NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM2NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozNmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNzQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjM3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzdjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDM4MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM4NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzOGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzhjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDM5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM5NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM5OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM5YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswM2EwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2E0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2E4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2FjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2IwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2I0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNiOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2I4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2JjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNjNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2M0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2M4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNjYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2QwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Q0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2Q4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2RjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNlMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNlNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qM2U0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2U4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2VjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswM2YwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Y0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzZjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDAwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDA0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSo0MDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDA4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSo0MDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDBjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0MTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDE4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQxYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0MWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQyNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDI4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQzNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MzggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Mzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDNjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDQ4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0NGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0NTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNDYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDY4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQ2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0NzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDc4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qNDc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQ3YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0N2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNDgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDg0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDg4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDhjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjQ4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDkwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDk0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0OTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ5OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNDk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0OWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNDljOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRhNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRhYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0YWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGI0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGI4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0Yjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGJjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRjNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNGM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0Yzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0Y2MgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNGQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDRkYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0ZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNGUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGU0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0ZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGU4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0ZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNGVjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDBcKFwkemVyb1wpCi0wKzA0ZjAgPFtePl0qPiBsd2MxCVwkZls0NV0sNFwoXCR6ZXJvXCkKLTArMDRmNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwxXChcJHplcm9cKQotMCswNGY4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDVcKFwkemVyb1wpCi0wKzA0ZmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDUwMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNTA0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1MDggPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJHplcm9cKQotMCswNTBjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDUxMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwwXChcJGExXCkKLTArMDUxNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSw0XChcJGExXCkKLTArMDUxOCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwxXChcJGExXCkKLTArMDUxYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSw1XChcJGExXCkKLTArMDUyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTI4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1MmMgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDUzMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYTFcKQotMCswNTM0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhMVwpCi0wKzA1MzggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTQwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0yMzEzMVwoXCRhdFwpCi1bIAldKjU0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU0NCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMjMxMjdcKFwkYXRcKQotWyAJXSo1NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NDggPFtePl0qPiBub3AKLTArMDU0YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwwXChcJHplcm9cKQotMCswNTUwIDxbXj5dKj4gc3djMQlcJGZbNDVdLDRcKFwkemVyb1wpCi0wKzA1NTQgPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCR6ZXJvXCkKLTArMDU1OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw1XChcJHplcm9cKQotMCswNTVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1NjAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDU2NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNTY4IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDU2YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkemVyb1wpCi0wKzA1NzAgPFtePl0qPiBzd2MxCVwkZls0NV0sMFwoXCRhMVwpCi0wKzA1NzQgPFtePl0qPiBzd2MxCVwkZls0NV0sNFwoXCRhMVwpCi0wKzA1NzggPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCRhMVwpCi0wKzA1N2MgPFtePl0qPiBzd2MxCVwkZls0NV0sNVwoXCRhMVwpCi0wKzA1ODAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDU4OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNThjIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1OTAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGExXCkKLTArMDU5NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYTFcKQotMCswNTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjU5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1OWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1YTAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTIzMTMxXChcJGF0XCkKLVsgCV0qNWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVhNCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMjMxMjdcKFwkYXRcKQotWyAJXSo1YTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWE4IDxbXj5dKj4gc3cJXCRhMCwwXChcJHplcm9cKQotMCswNWFjIDxbXj5dKj4gc3cJXCRhMSw0XChcJHplcm9cKQotMCswNWIwIDxbXj5dKj4gbHVpCVwkYTAsMHgyCi1bIAldKjViMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDViNCA8W14+XSo+IChkfClhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1YjggPFtePl0qPiBsZAlcJGEwLC0yMzEzMVwoXCRhMFwpCi1bIAldKjViODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDViYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo1YmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNWMwIDxbXj5dKj4gKGR8KWFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDVjNCA8W14+XSo+IHNkCVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNWM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDVjOCA8W14+XSo+IG5vcAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1waWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmNTJkZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXBpYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxkIG1hY3JvIHdpdGggUElDIGNvZGUuCi0JCi0JLnNldAltaXBzMQotCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCWxkCSQ0LDAKLQlsZAkkNCwxCi0JbGQJJDQsMHg4MDAwCi0JbGQJJDQsLTB4ODAwMAotCWxkCSQ0LDB4MTAwMDAKLQlsZAkkNCwweDFhNWE1Ci0JbGQJJDQsMCgkNSkKLQlsZAkkNCwxKCQ1KQotCWxkCSQ0LDB4ODAwMCgkNSkKLQlsZAkkNCwtMHg4MDAwKCQ1KQotCWxkCSQ0LDB4MTAwMDAoJDUpCi0JbGQJJDQsMHgxYTVhNSgkNSkKLQlsZAkkNCxkYXRhX2xhYmVsCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsZAkkNCxkYXRhX2xhYmVsKzEKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxkCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsZAkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQkuaWZuZGVmCUVNUElDCi0Jbm9wCi0Jbm9wCi0JLmVuZGlmCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXN2cjRwaWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtc3ZyNHBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDQzZDc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtc3ZyNHBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsZC1zdnI0cGljCi0jYXM6IC1taXBzMSAtbWNwdT1yMzAwMCAtS1BJQwotI3NvdXJjZTogbGQtcGljLnMKLQotIyBUZXN0IHRoZSBsZCBtYWNybyB3aXRoIC1LUElDLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNmMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwODggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwOTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo5MDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwOTQgPFtePl0qPiBub3AKLTArMDA5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjk4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwYTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSphMDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTQgPFtePl0qPiBub3AKLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwYWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qYjA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjQgPFtePl0qPiBub3AKLTArMDBiOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwYmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGMwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qYzA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYzQgPFtePl0qPiBub3AKLTArMDBjOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwY2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qZDA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBkNCA8W14+XSo+IG5vcAotMCswMGQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwZTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSplMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBlNCA8W14+XSo+IG5vcAotMCswMGU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qZTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBlYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmVjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwZjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpmMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBmNCA8W14+XSo+IG5vcAotMCswMGY4IDxbXj5dKj4gbHcJXCRhMCwxMDAwXChcJGF0XCkKLVsgCV0qZjg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsMTAwNFwoXCRhdFwpCi1bIAldKmZjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMDA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTA0IDxbXj5dKj4gbm9wCi0wKzAxMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxMDg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxMGM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMTA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTE0IDxbXj5dKj4gbm9wCi0wKzAxMTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDEyMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEyMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyNCA8W14+XSo+IG5vcAotMCswMTI4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDEyYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxMzAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMzA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMzQgPFtePl0qPiBub3AKLTArMDEzOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxM2MgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTQwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTQwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDQgPFtePl0qPiBub3AKLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxNGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTUwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTUwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTU0IDxbXj5dKj4gbm9wCi0wKzAxNTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxNTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE1YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjE1YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTYwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTYwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTY0IDxbXj5dKj4gbm9wCi0wKzAxNjggPFtePl0qPiBsdwlcJGEwLDEwMDFcKFwkYXRcKQotWyAJXSoxNjg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE2YyA8W14+XSo+IGx3CVwkYTEsMTAwNVwoXCRhdFwpCi1bIAldKjE2YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTcwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTcwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDE3NCA8W14+XSo+IG5vcAotMCswMTc4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMTdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTdjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTgwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMTgwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTg0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTg0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4OCA8W14+XSo+IG5vcAotMCswMThjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMTkwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDE5NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxOTggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxOTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBub3AKLTArMDFhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAxYTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMWFjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWFjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWIwIDxbXj5dKj4gbm9wCi0wKzAxYjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxYjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMWJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDFjMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFjMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWM0IDxbXj5dKj4gbm9wCi0wKzAxYzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxY2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMWQwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDFkNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFkNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFkOCA8W14+XSo+IG5vcAotMCswMWRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWUwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWUwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxZTQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxZTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFlOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFlODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFlYyA8W14+XSo+IG5vcAotMCswMWYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWY0IDxbXj5dKj4gbHcJXCRhMCwxMDAwXChcJGF0XCkKLVsgCV0qMWY0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxZjggPFtePl0qPiBsdwlcJGExLDEwMDRcKFwkYXRcKQotWyAJXSoxZjg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFmYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFmYzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAyMDAgPFtePl0qPiBub3AKLTArMDIwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjIwODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDIwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjIwYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDIxMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjIxMDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMTQgPFtePl0qPiBub3AKLTArMDIxOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIxYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyMjAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMjI0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjI0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI4IDxbXj5dKj4gbm9wCi0wKzAyMmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyMzAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDIzOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjIzODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IG5vcAotMCswMjQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjQ0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDI0OCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyNGMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyNGM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1MCA8W14+XSo+IG5vcAotMCswMjU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjU4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDI1YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyNjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyNjA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyNjQgPFtePl0qPiBub3AKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI2YyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjI2YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMjcwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMjcwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyNzQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyNzQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyNzggPFtePl0qPiBub3AKLTArMDI3YyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI4MCA8W14+XSo+IGx3CVwkYTAsMTAwMVwoXCRhdFwpCi1bIAldKjI4MDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjg0IDxbXj5dKj4gbHcJXCRhMSwxMDA1XChcJGF0XCkKLVsgCV0qMjg0OiBSX01JUFNfTE8xNgkuYnNzCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQteGdvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDI2MmNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQteGdvdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsZC14Z290Ci0jYXM6IC1taXBzMSAtbWNwdT1yMzAwMCAtS1BJQyAteGdvdAotI3NvdXJjZTogbGQtcGljLnMKLQotIyBUZXN0IHRoZSBsZCBtYWNybyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNmMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwODggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwOTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo5MDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwOTQgPFtePl0qPiBub3AKLTArMDA5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjk4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qOWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYTA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMGE4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qYTg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGFjIDxbXj5dKj4gbm9wCi0wKzAwYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGI0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDBjMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKmMwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM0IDxbXj5dKj4gbm9wCi0wKzAwYzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGNjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBkMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpkMDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBkNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDBkOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKmQ4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGRjIDxbXj5dKj4gbm9wCi0wKzAwZTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGU0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGVjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMGYwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qZjA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IG5vcAotMCswMGY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMDA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxMDQgPFtePl0qPiBub3AKLTArMDEwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjEwODogUl9NSVBTX0xPMTYJLmJzcwotMCswMTBjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMTBjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxMTQgPFtePl0qPiBub3AKLTArMDExOCA8W14+XSo+IGx3CVwkYTAsMTAwMFwoXCRhdFwpCi1bIAldKjExODogUl9NSVBTX0xPMTYJLmJzcwotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSwxMDA0XChcJGF0XCkKLVsgCV0qMTFjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMjA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTI0IDxbXj5dKj4gbm9wCi0wKzAxMjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxMjg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxMmM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxMzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTMwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDEzOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjEzODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxM2MgPFtePl0qPiBub3AKLTArMDE0MCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxNDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE0ODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDE1MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjE1MDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE1NCA8W14+XSo+IG5vcAotMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDE1YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxNjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTYwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTY4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTY4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTZjIDxbXj5dKj4gbm9wCi0wKzAxNzAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMTc0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDE3OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNzg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE3YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDE4MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjE4MDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTg0IDxbXj5dKj4gbm9wCi0wKzAxODggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMThjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDE5MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjE5MDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE5NCA8W14+XSo+IG5vcAotMCswMTk4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTk4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxOWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoxOWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFhMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFhMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFhNCA8W14+XSo+IG5vcAotMCswMWE4IDxbXj5dKj4gbHcJXCRhMCwxMDAxXChcJGF0XCkKLVsgCV0qMWE4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxYWMgPFtePl0qPiBsdwlcJGExLDEwMDVcKFwkYXRcKQotWyAJXSoxYWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFiMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFiMDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxYjQgPFtePl0qPiBub3AKLTArMDFiOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFiYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDFjMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFjMDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDFjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYzQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWM4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMWNjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMWNjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkMCA8W14+XSo+IG5vcAotMCswMWQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDFkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWUwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMWU4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMWU4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDxbXj5dKj4gbm9wCi0wKzAxZjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxZjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMWY4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDFmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyMDQgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyMDQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDggPFtePl0qPiBub3AKLTArMDIwYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIxMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAyMTQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMjE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjIxODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjFjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMjIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMjIwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMjQgPFtePl0qPiBub3AKLTArMDIyOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIyYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAyMzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjM0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMjM4IDxbXj5dKj4gbm9wCi0wKzAyM2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyNDA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI0NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjQ4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjQ4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMjRjIDxbXj5dKj4gbm9wCi0wKzAyNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNTQgPFtePl0qPiBsdwlcJGEwLDEwMDBcKFwkYXRcKQotWyAJXSoyNTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI1OCA8W14+XSo+IGx3CVwkYTEsMTAwNFwoXCRhdFwpCi1bIAldKjI1ODogUl9NSVBTX0xPMTYJLmJzcwotMCswMjVjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjVjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDI2MCA8W14+XSo+IG5vcAotMCswMjY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjY4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMjY4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjZjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMjZjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3MDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyNzggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyNzg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjdjIDxbXj5dKj4gbm9wCi0wKzAyODAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyODQgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMjg4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDI4YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyOGM6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyOTQgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyOTQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTggPFtePl0qPiBub3AKLTArMDI5YyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJhMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyYTQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMmE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDJiMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjJiMDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJiNCA8W14+XSo+IG5vcAotMCswMmI4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmJjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDJjMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmM0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYzggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyY2MgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyY2M6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJkMCA8W14+XSo+IG5vcAotMCswMmQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmQ4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDJkYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyZTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyZTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyZTQgPFtePl0qPiBub3AKLTArMDJlOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJlYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJlYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMmYwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMmYwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyZjQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyZjQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyZjggPFtePl0qPiBub3AKLTArMDJmYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMwMCA8W14+XSo+IGx3CVwkYTAsMTAwMVwoXCRhdFwpCi1bIAldKjMwMDogUl9NSVBTX0xPMTYJLmJzcwotMCswMzA0IDxbXj5dKj4gbHcJXCRhMSwxMDA1XChcJGF0XCkKLVsgCV0qMzA0OiBSX01JUFNfTE8xNgkuYnNzCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODljZjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC5kCisrKyAvZGV2L251bGwKQEAgLTEsNjM5ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jYXM6IC1tY3B1PXI0MDAwCi0jbmFtZTogTUlQUyBsZAotCi0jIFRlc3QgdGhlIGxkIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCi0wKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbm9wCi0wKzAwNGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwNmMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCi0wKzAwNzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwODggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi0wKzAwOTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDk0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDk4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDljIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjljOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSphMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRncFwpCi1bIAldKmFjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSpiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBjMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRncFwpCi1bIAldKmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwY2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSpjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBkMCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRncFwpCi1bIAldKmQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBkNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRncFwpCi1bIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZGMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZTAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSplMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSplYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGYwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmYyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDQgPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSoxMDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDggPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSoxMDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTBjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTEwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTE0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGdwXCkKLVsgCV0qMTE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRncFwpCi1bIAldKjExYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTI0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjEyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTNjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0MCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNDQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNjAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNjQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTZjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE3MCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE3OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxN2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTgwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTkwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTkwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5NCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5YyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWE0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFiMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYjQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYjggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDFjMCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYzQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFjYyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZDAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWQ0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFmMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjAwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjA0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjA4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjBjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjEwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDIxNCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMTggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDIyMCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMjQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMmMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjIzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyM2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjQwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0NCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjUwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjU0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjVjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjYwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjY0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI2OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjdjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBub3AKLTArMDI5NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDI5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI5ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJiMCA8W14+XSo+IG5vcAotMCswMmI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmJjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmMwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJjNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJjOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjJjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJjYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjJjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJkMCA8W14+XSo+IG5vcAotMCswMmQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmQ4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmQ4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDJkYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjJkYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDJlNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJlOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjJlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmYwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmY4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMwMCA8W14+XSo+IG5vcAotMCswMzA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMzA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMzA4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMxNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMxOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjMxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzIwIDxbXj5dKj4gbm9wCi0wKzAzMjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzMjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSozMjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzQwIDxbXj5dKj4gbm9wCi0wKzAzNDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzNDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMzRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzRjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDM1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzNTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzVjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDM2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzY4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM3MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzdjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM4MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzODggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzhjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM5MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM5NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM5OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM5YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjM5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNhMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNhMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDNhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNhOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjNhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNhYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNiMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzYjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswM2JjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2JjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDNjMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozYzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswM2M0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2M4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2M4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDNjYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzZDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2QwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNkYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2UwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2VjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2VjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNmMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2Y0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2Y4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2Y4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDNmYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjNmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNDAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDA4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDBjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjQxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDQxNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQxOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjQxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQxYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQyMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo0MjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDI4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQyYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0MzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNDM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQzYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0NDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ0NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ0OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ1YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ2YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0NzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0Nzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0N2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0N2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ODAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0ODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ODggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0ODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0OGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0OGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0OTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0OTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNDk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDk4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQ5YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0YTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0YTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNGE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDRhYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0YjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0YjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRiNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRiOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjRiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGJjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0YzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRjYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0ZDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ZDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGQ4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDRkYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0ZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0ZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0Zjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0ZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA1MDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1MDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNTA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTA4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNTA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDUwYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjUwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1MTAgPFtePl0qPiBsd2MxCVwkZls0NV0sMFwoXCR6ZXJvXCkKLTArMDUxNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSw0XChcJHplcm9cKQotMCswNTE4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDFcKFwkemVyb1wpCi0wKzA1MWMgPFtePl0qPiBsd2MxCVwkZls0NV0sNVwoXCR6ZXJvXCkKLTArMDUyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTI0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1MjggPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDUyYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkemVyb1wpCi0wKzA1MzAgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJHplcm9cKQotMCswNTM0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDBcKFwkYTFcKQotMCswNTM4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDRcKFwkYTFcKQotMCswNTNjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDFcKFwkYTFcKQotMCswNTQwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDVcKFwkYTFcKQotMCswNTQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1NDggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1NGMgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDU1MCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNTU0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhMVwpCi0wKzA1NTggPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGExXCkKLTArMDU1YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjU1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU2MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDU2NCA8W14+XSo+IGx3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNTY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTY4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLFstMC05XStcKFwkYXRcKQotWyAJXSo1Njg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NmMgPFtePl0qPiBub3AKLTArMDU3MCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwwXChcJHplcm9cKQotMCswNTc0IDxbXj5dKj4gc3djMQlcJGZbNDVdLDRcKFwkemVyb1wpCi0wKzA1NzggPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCR6ZXJvXCkKLTArMDU3YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSw1XChcJHplcm9cKQotMCswNTgwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1ODQgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDU4OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNThjIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDU5MCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkemVyb1wpCi0wKzA1OTQgPFtePl0qPiBzd2MxCVwkZls0NV0sMFwoXCRhMVwpCi0wKzA1OTggPFtePl0qPiBzd2MxCVwkZls0NV0sNFwoXCRhMVwpCi0wKzA1OWMgPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCRhMVwpCi0wKzA1YTAgPFtePl0qPiBzd2MxCVwkZls0NV0sNVwoXCRhMVwpCi0wKzA1YTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDVhOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDVhYyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNWIwIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1YjQgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGExXCkKLTArMDViOCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYTFcKQotMCswNWJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDVjNCA8W14+XSo+IHN3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNWM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVjOCA8W14+XSo+IHN3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNWM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDVjYyA8W14+XSo+IHN3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDVkMCA8W14+XSo+IHN3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDVkNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjVkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDVkOCA8W14+XSo+IGRhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1ZGMgPFtePl0qPiBsZAlcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSo1ZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA1ZTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1ZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNWU0IDxbXj5dKj4gZGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDVlOCA8W14+XSo+IHNkCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjVlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1ZWMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlZTNjMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxkIG1hY3JvLgotCQotCS5zZXQJbWlwczEKLQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQlsZAkkNCwwCi0JbGQJJDQsMQotCWxkCSQ0LDB4ODAwMAotCWxkCSQ0LC0weDgwMDAKLQlsZAkkNCwweDEwMDAwCi0JbGQJJDQsMHgxYTVhNQotCWxkCSQ0LDAoJDUpCi0JbGQJJDQsMSgkNSkKLQlsZAkkNCwweDgwMDAoJDUpCi0JbGQJJDQsLTB4ODAwMCgkNSkKLQlsZAkkNCwweDEwMDAwKCQ1KQotCWxkCSQ0LDB4MWE1YTUoJDUpCi0JbGQJJDQsZGF0YV9sYWJlbAotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JbGQJJDQsZGF0YV9sYWJlbCsxCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlsZAkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JbGQJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCWxkCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JbGQJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlsZAkkNCxkYXRhX2xhYmVsKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0JbGQJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGQJJDQsZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsZAkkNCxkYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCi0jIGwuZCBhbmQgcy5kIGFyZSBzb3J0IG9mIGxpa2UgbGQuCi0JbC5kCSRmNCwwCi0JbC5kCSRmNCwxCi0JbC5kCSRmNCwweDgwMDAKLQlsLmQJJGY0LC0weDgwMDAKLQlsLmQJJGY0LDAoJDUpCi0JbC5kCSRmNCwxKCQ1KQotCWwuZAkkZjQsMHg4MDAwKCQ1KQotCWwuZAkkZjQsLTB4ODAwMCgkNSkKLQlsLmQJJGY0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCSMgTGl0dGxlIGVuZGlhbiB3aWxsIGluc2VydCBhIG5vcCBoZXJlLgotCSMgV2UgcHV0IGl0IGluIGV4cGxpY2l0bHkgc28gdGhhdCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gYXJlIHNpbWlsYXIuCi0Jbm9wCi0Jcy5kCSRmNCwwCi0Jcy5kCSRmNCwxCi0Jcy5kCSRmNCwweDgwMDAKLQlzLmQJJGY0LC0weDgwMDAKLQlzLmQJJGY0LDAoJDUpCi0Jcy5kCSRmNCwxKCQ1KQotCXMuZAkkZjQsMHg4MDAwKCQ1KQotCXMuZAkkZjQsLTB4ODAwMCgkNSkKLQlzLmQJJGY0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQotIyBzZCBpcyBoYW5kbGVkIGxpa2UgbGQuICBTYW5pdHkgY2hlY2sgaXQuCi0Jc2QJJDQsMAotCi0jIFNhbml0eSBjaGVjayB0aGUgLW1pcHMzIHZlcnNpb25zCi0JLnNldAltaXBzMwotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQlzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlMmIyMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgbGkKLQotIyBUZXN0IHRoZSBsaSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMDQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAwOCA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMGMgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDEwIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwMWMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzYTYwMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGkgbWFjcm8uCi0KLWZvbzoKLQlsaQkkNCwwCi0JbGkJJDQsMQotCWxpCSQ0LDB4ODAwMAotCWxpCSQ0LC0weDgwMDAKLQlsaQkkNCwweDEwMDAwCi0JbGkJJDQsMHgxYTVhNQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtZW1waWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLWVtcGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MGRjYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtZW1waWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsaWZsb2F0LWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYyAtLWRlZnN5bSBFTVBJQz0xCi0jc291cmNlOiBsaWZsb2F0LnMKLQotIyBUZXN0IHRoZSBsaS5kIGFuZCBsaS5zIG1hY3JvcyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE2Mzg0Ci1bIAldKjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnJkYXRhLioKLTArMDAwNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwMDggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMDBjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0xNjM2OFwoXCRncFwpCi1bIAldKmM6IFtBLVowLTlfXSpMSVRFUkFMW0EtWjAtOV9dKgkubGl0OC4qCi0wKzAwMTAgPFtePl0qPiBsd2MxCVwkZls0NV0sLTE2MzY0XChcJGdwXCkKLVsgCV0qMTA6IFtBLVowLTlfXSpMSVRFUkFMW0EtWjAtOV9dKgkubGl0OC4qCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDNmOGYKLTArMDAxOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhjZDM2Ci0wKzAwMWMgPFtePl0qPiBsdWkJXCRhdCwweDNmOGYKLTArMDAyMCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhjZDM2Ci0wKzAwMjQgPFtePl0qPiBtdGMxCVwkYXQsXCRmNAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtc3ZyNHBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjA5YTdmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXN2cjRwaWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsaWZsb2F0LXN2cjRwaWMKLSNhczogLW1pcHMxIC1tY3B1PXIzMDAwIC1LUElDIC1FQiAtLWRlZnN5bSBTVlI0PTEKLSNzb3VyY2U6IGxpZmxvYXQucwotCi0jIFRlc3QgdGhlIGxpLmQgYW5kIGxpLnMgbWFjcm9zIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjA6IFJfTUlQU19HT1QxNgkucm9kYXRhCi0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjg6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmM6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAxMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEwOiBSX01JUFNfR09UMTYJLnJvZGF0YQotMCswMDE0IDxbXj5dKj4gbm9wCi0wKzAwMTggPFtePl0qPiBsd2MxCVwkZjUsOFwoXCRhdFwpCi1bIAldKjE4OiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMWMgPFtePl0qPiBsd2MxCVwkZjQsMTJcKFwkYXRcKQotWyAJXSoxYzogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDIwIDxbXj5dKj4gbHVpCVwkYTAsMHgzZjhmCi0wKzAwMjQgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4Y2QzNgotMCswMDI4IDxbXj5dKj4gbHVpCVwkYXQsMHgzZjhmCi0wKzAwMmMgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4Y2QzNgotMCswMDMwIDxbXj5dKj4gbXRjMQlcJGF0LFwkZjQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXhnb3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4NmUyYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi14Z290LmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGlmbG9hdC14Z290Ci0jYXM6IC1taXBzMSAtbWNwdT1yMzAwMCAtS1BJQyAteGdvdCAtRUIgLS1kZWZzeW0gWEdPVD0xCi0jc291cmNlOiBsaWZsb2F0LnMKLQotIyBUZXN0IHRoZSBsaS5kIGFuZCBsaS5zIG1hY3JvcyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSowOiBSX01JUFNfR09UMTYJLnJvZGF0YQotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo4OiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSpjOiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxMDogUl9NSVBTX0dPVDE2CS5yb2RhdGEKLTArMDAxNCA8W14+XSo+IG5vcAotMCswMDE4IDxbXj5dKj4gbHdjMQlcJGY1LDhcKFwkYXRcKQotWyAJXSoxODogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDFjIDxbXj5dKj4gbHdjMQlcJGY0LDEyXChcJGF0XCkKLVsgCV0qMWM6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAyMCA8W14+XSo+IGx1aQlcJGEwLDB4M2Y4ZgotMCswMDI0IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGNkMzYKLTArMDAyOCA8W14+XSo+IGx1aQlcJGF0LDB4M2Y4ZgotMCswMDJjIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGNkMzYKLTArMDAzMCA8W14+XSo+IG10YzEJXCRhdCxcJGY0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZmxvYXQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzFiNTU0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxpZmxvYXQKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgbGkuZCBhbmQgbGkucyBtYWNyb3MuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSowOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ybz9kYXRhLioKLTArMDAwNCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnJvP2RhdGEuKgotMCswMDA4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkucm8/ZGF0YS4qCi0wKzAwMGMgPFtePl0qPiBsd2MxCVwkZls0NV0sWy0wLTldK1woXCRncFwpCi1bIAldKmM6IFtBLVowLTlfXSpMSVRFUkFMW0EtWjAtOV9dKgkubGl0OC4qCi0wKzAwMTAgPFtePl0qPiBsd2MxCVwkZls0NV0sWy0wLTldK1woXCRncFwpCi1bIAldKjEwOiBbQS1aMC05X10qTElURVJBTFtBLVowLTlfXSoJLmxpdDguKgotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgzZjhmCi0wKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4Y2QzNgotMCswMDFjIDxbXj5dKj4gbHdjMQlcJGY0LFstMC05XStcKFwkZ3BcKQotWyAJXSoxYzogW0EtWjAtOV9dKkxJVEVSQUxbQS1aMC05X10qCS5saXQ0LioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NzdmMGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGkuZCBhbmQgbGkucyBtYWNyb3MuCi0JCi1mb286CQotCWxpLmQJJDQsMS4xMjM0NQotCWxpLmQJJGY0LDEuMTIzNDUKLQkKLQlsaS5zCSQ0LDEuMTIzNDUKLQlsaS5zCSRmNCwxLjEyMzQ1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0JLmlmZGVmCVNWUjQKLQlub3AKLQlub3AKLQlub3AKLQkuZW5kaWYKLQkuaWZkZWYJWEdPVAotCW5vcAotCW5vcAotCW5vcAotCS5lbmRpZgotCS5pZmRlZglFTVBJQwotCW5vcAotCW5vcAotCS5lbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGluZW5vLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTQwZjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8uZAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtbCAtbW1pcHM6NDAwMAotI25hbWU6IGFzc2VtYmx5IGxpbmUgbnVtYmVycwotI2FzOiAtZyAtbWNwdT1yNDAwMAotCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0wKzAwMDAgPG1haW4tMHgxMD46Ci0uKlswLTlhLWZdKzouKmRlYWRiZWVmLioKLS4qWzAtOWEtZl0rOi4qZGVhZGJlZWYuKgotLipbMC05YS1mXSs6LipkZWFkYmVlZi4qCi0uKlswLTlhLWZdKzouKmRlYWRiZWVmLioKLQotMCswMDEwIDxtYWluPjoKLW1haW5cKFwpOgotLipsaW5lbm8uczoxNgotLioxMDouKmFkZGl1LioKLS4qbGluZW5vLnM6MTcKLS4qMTQ6LipzZC4qCi0uKmxpbmVuby5zOjE4Ci0uKjE4Oi4qc2QuKgotLipsaW5lbm8uczoxOQotLioxYzouKm1vdmUuKgotLipsaW5lbm8uczoyMAotLioyMDouKmphbC4qCi0uKjI0Oi4qbm9wCi0uKmxpbmVuby5zOjIxCi0uKjI4Oi4qbGkuKgotLipsaW5lbm8uczoyMgotLioyYzouKnN3LioKLS4qbGluZW5vLnM6MjMKLS4qMzA6Lipsdy4qCi0uKmxpbmVuby5zOjI0Ci0uKjM0Oi4qbW92ZS4qCi0uKmxpbmVuby5zOjI1Ci0uKjM4Oi4qc2xsLioKLS4qbGluZW5vLnM6MjYKLS4qM2M6LiphZGR1LioKLS4qbGluZW5vLnM6MjcKLS4qNDA6Lipzdy4qCi0uKmxpbmVuby5zOjI4Ci0uKjQ0Oi4qbHcuKgotLipsaW5lbm8uczoyOQotLio0ODouKmphbC4qCi0uKjRjOi4qbm9wCi0uKmxpbmVuby5zOjMwCi0uKjUwOi4qbHcuKgotLipsaW5lbm8uczozMQotLio1NDouKm1vdmUuKgotLipsaW5lbm8uczozMgotLio1ODouKmIuKgotLio1YzouKm5vcAotCi0wMDAwMDAwMDAwMDAwMDYwIDxcJEwxPjoKLS4qbGluZW5vLnM6MzQKLS4qNjA6Liptb3ZlLioKLS4qbGluZW5vLnM6MzUKLS4qNjQ6LipsZC4qCi0uKmxpbmVuby5zOjM2Ci0uKjY4Oi4qbGQuKgotLipsaW5lbm8uczozNwotLio2YzouKmFkZGl1LioKLS4qbGluZW5vLnM6MzgKLS4qNzA6Lipqci4qCi0uKjc0Oi4qbm9wCi0KLTAwMDAwMDAwMDAwMDAwNzggPGc+OgotZ1woXCk6Ci0uKmxpbmVuby5zOjQ3Ci0uKjc4Oi4qYWRkaXUuKgotLipsaW5lbm8uczo0OAotLio3YzouKnNkLioKLS4qbGluZW5vLnM6NDkKLS4qODA6Liptb3ZlLioKLS4qbGluZW5vLnM6NTAKLS4qODQ6Lipzdy4qCi0uKmxpbmVuby5zOjUxCi0uKjg4Oi4qbHcuKgotLipsaW5lbm8uczo1MgotLio4YzouKmFkZGl1LioKLS4qbGluZW5vLnM6NTMKLS4qOTA6Liptb3ZlLioKLS4qbGluZW5vLnM6NTQKLS4qOTQ6LipiLioKLS4qOTg6Lipub3AKLQotMDAwMDAwMDAwMDAwMDA5YyA8XCRMMj46Ci0uKmxpbmVuby5zOjU2Ci0uKjljOi4qbW92ZS4qCi0uKmxpbmVuby5zOjU3Ci0uKmEwOi4qbGQuKgotLipsaW5lbm8uczo1OAotLiphNDouKmFkZGl1LioKLS4qbGluZW5vLnM6NTkKLS4qYTg6Lipqci4qCi0uKmFjOi4qbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxZjMzMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5zCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotCS50ZXh0Ci0KLSMgc29tZSBkYXRhCi0JLndvcmQJMHhkZWFkYmVlZgotCS53b3JkCTB4ZGVhZGJlZWYKLQkud29yZAkweGRlYWRiZWVmCi0JLndvcmQJMHhkZWFkYmVlZgotCi0jIHNvbWUgcmVhbCBjb2RlLCBjb21waWxlZCBmcm9tIGEgdG95IEMgcHJvZ3JhbQotCSAgICAgICAgLmdsb2JsICBtYWluCi0gICAgICAgIC5lbnQgICAgbWFpbgotbWFpbjoKLSAgICAgICAgLmZyYW1lICAkZnAsMzIsJDMxICAgICAgICAgICAgICAjIHZhcnM9IDE2LCByZWdzPSAyLzAsIGFyZ3M9IDAsIGV4dHJhPSAwCi0gICAgICAgIC5tYXNrICAgMHhjMDAwMDAwMCwtOAotICAgICAgICAuZm1hc2sgIDB4MDAwMDAwMDAsMAotICAgICAgICBzdWJ1ICAgICRzcCwkc3AsMzIKLSAgICAgICAgc2QgICAgICAkMzEsMjQoJHNwKQotICAgICAgICBzZCAgICAgICRmcCwxNigkc3ApCi0gICAgICAgIG1vdmUgICAgJGZwLCRzcAotICAgICAgICBqYWwgICAgIF9fbWFpbgotICAgICAgICBsaSAgICAgICQyLDIgICAgICAgICAgICAgICAgICAgICMgMHgyCi0gICAgICAgIHN3ICAgICAgJDIsMCgkZnApCi0gICAgICAgIGx3ICAgICAgJDIsMCgkZnApCi0gICAgICAgIG1vdmUgICAgJDMsJDIKLSAgICAgICAgc2xsICAgICAkNCwkMywxCi0gICAgICAgIGFkZHUgICAgJDIsJDQsJDIKLSAgICAgICAgc3cgICAgICAkMiw0KCRmcCkKLSAgICAgICAgbHcgICAgICAkNCw0KCRmcCkKLSAgICAgICAgamFsICAgICBnCi0gICAgICAgIGx3ICAgICAgJDMsMCgkZnApCi0gICAgICAgIG1vdmUgICAgJDIsJDMKLSAgICAgICAgYiAgICAgICAkTDEKLSRMMToKLSAgICAgICAgbW92ZSAgICAkc3AsJGZwCi0gICAgICAgIGxkICAgICAgJDMxLDI0KCRzcCkKLSAgICAgICAgbGQgICAgICAkZnAsMTYoJHNwKQotICAgICAgICBhZGR1ICAgICRzcCwkc3AsMzIKLSAgICAgICAgaiAgICAgICAkMzEKLSAgICAgICAgLmVuZCAgICBtYWluCi0gICAgICAgIC5hbGlnbiAgMgotICAgICAgICAuZ2xvYmwgIGcKLSAgICAgICAgLmVudCAgICBnCi1nOgotICAgICAgICAuZnJhbWUgICRmcCwzMiwkMzEgICAgICAgICAgICAgICMgdmFycz0gMTYsIHJlZ3M9IDEvMCwgYXJncz0gMCwgZXh0cmE9IDAKLSAgICAgICAgLm1hc2sgICAweDQwMDAwMDAwLC0xNgotICAgICAgICAuZm1hc2sgIDB4MDAwMDAwMDAsMAotICAgICAgICBzdWJ1ICAgICRzcCwkc3AsMzIKLSAgICAgICAgc2QgICAgICAkZnAsMTYoJHNwKQotICAgICAgICBtb3ZlICAgICRmcCwkc3AKLSAgICAgICAgc3cgICAgICAkNCwwKCRmcCkKLSAgICAgICAgbHcgICAgICAkMiwwKCRmcCkKLSAgICAgICAgYWRkdSAgICAkMywkMiwxCi0gICAgICAgIG1vdmUgICAgJDIsJDMKLSAgICAgICAgYiAgICAgICAkTDIKLSRMMjoKLSAgICAgICAgbW92ZSAgICAkc3AsJGZwCi0gICAgICAgIGxkICAgICAgJGZwLDE2KCRzcCkKLSAgICAgICAgYWRkdSAgICAkc3AsJHNwLDMyCi0gICAgICAgIGogICAgICAgJDMxCi0gICAgICAgIC5lbmQgICAgZwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYTBkNTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0jCi0jIFNvbWUgZ2VuZXJpYyBNSVBTIHRlc3RzCi0jCi1pZiBbaXN0YXJnZXQgbWlwcyotKi0qXSB0aGVuIHsKLSAgICBzZXQgbm9fbWlwczE2IDAKLSAgICBzZXQgc3ZyNHBpYyBbZXhwciBbaXN0YXJnZXQgKi0qLWVsZipdIHx8IFtpc3RhcmdldCAqLSotaXJpeDUqXSB8fCBbaXN0YXJnZXQgKi0qLWlyaXg2KiBdIF0KLSAgICBzZXQgZW1waWMgW2V4cHIgW2lzdGFyZ2V0ICotKi1lY29mZipdIHx8IFtpc3RhcmdldCAqLSotdWx0cml4Kl0gfHwgW2lzdGFyZ2V0ICotKi1pcml4XFsxLTRcXSpdIF0KLSAgICBzZXQgYW91dCBbZXhwciBbaXN0YXJnZXQgKi0qLWJzZCpdIHx8IFtpc3RhcmdldCAqLSotbmV0YnNkKl0gfHwgW2lzdGFyZ2V0ICotKi1vcGVuYnNkKl1dCi0gICAgc2V0IGlsb2NrcyBbaXN0YXJnZXQgbWlwc3R4MzkqLSotKl0KLSAgICBzZXQgZ3ByX2lsb2NrcyBbZXhwciBbaXN0YXJnZXQgbWlwc3R4MzkqLSotKl1dCi0gICAgc2V0IGFkZHIzMiBbZXhwciBbaXN0YXJnZXQgbWlwc3R4MzkqLSotKl1dCi0KLQotCi0KLQotICAgIHJ1bl9kdW1wX3Rlc3QgImFicyIKLSAgICBydW5fZHVtcF90ZXN0ICJhZGQiCi0gICAgcnVuX2R1bXBfdGVzdCAiYW5kIgotICAgIHJ1bl9kdW1wX3Rlc3QgImJyZWFrMjAiCi0gICAgcnVuX2R1bXBfdGVzdCAidHJhcDIwIgotICAgIHJ1bl9kdW1wX3Rlc3QgImJlcSIKLSAgICBydW5fZHVtcF90ZXN0ICJiZ2UiCi0gICAgcnVuX2R1bXBfdGVzdCAiYmdldSIKLSAgICBydW5fZHVtcF90ZXN0ICJibHQiCi0gICAgcnVuX2R1bXBfdGVzdCAiYmx0dSIKLSAgICBpZiAhJGlsb2NrcyB7IHJ1bl9kdW1wX3Rlc3QgImRpdiIgfSBlbHNlIHsgcnVuX2R1bXBfdGVzdCAiZGl2LWlsb2NrcyIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgImRsaSIKLSAgICBydW5fZHVtcF90ZXN0ICJqYWwiCi0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJqYWwtc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAiamFsLXhnb3QiIH0KLSAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJqYWwtZW1waWMiIH0KLSAgICBpZiAhJGFvdXQgeyBydW5fZHVtcF90ZXN0ICJsYSIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGEtc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGEteGdvdCIgfQotICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxhLWVtcGljIiB9Ci0gICAgaWYgISRhb3V0IHsgcnVuX2R1bXBfdGVzdCAibGIiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxiLXN2cjRwaWMiIH0KLSAgICBpZiAkc3ZyNHBpYyB7Ci0JIyBCb3RoIHZlcnNpb25zIHNwZWNpZnkgdGhlIGNwdSwgc28gd2UgY2FuIHJ1biBib3RoIHJlZ2FyZGxlc3Mgb2YKLQkjIHRoZSBpbnRlcmxvY2tpbmcgaW4gdGhlIGNvbmZpZ3VyZWQgZGVmYXVsdCBjcHUuCi0JcnVuX2R1bXBfdGVzdCAibGIteGdvdCIKLQlydW5fZHVtcF90ZXN0ICJsYi14Z290LWlsb2NrcyIKLSAgICB9Ci0gICAgaWYgJGVtcGljIHsgcnVuX2R1bXBfdGVzdCAibGItZW1waWMiIH0KLSAgICBpZiAhJGFvdXQgeyAKLSAgICAgICAgaWYgISRncHJfaWxvY2tzIHsgCi0gICAgICAgICAgICBydW5fZHVtcF90ZXN0ICJsZCIgCi0gICAgICAgIH0gZWxzZSB7IAotICAgICAgICAgICAgaWYgISRhZGRyMzIgewotICAgICAgICAgICAgICAgIHJ1bl9kdW1wX3Rlc3QgImxkLWlsb2NrcyIKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcnVuX2R1bXBfdGVzdCAibGQtaWxvY2tzLWFkZHIzMiIKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxkLXN2cjRwaWMiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxkLXhnb3QiIH0KLSAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJsZC1lbXBpYyIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgImxpIgotICAgIGlmICEkYW91dCB7IHJ1bl9kdW1wX3Rlc3QgImxpZmxvYXQiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxpZi1zdnI0cGljIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJsaWYteGdvdCIgfQotICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxpZi1lbXBpYyIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgIm1pcHM0IgotICAgIGlmICEkaWxvY2tzIHsgcnVuX2R1bXBfdGVzdCAibXVsIiB9IGVsc2UgeyBydW5fZHVtcF90ZXN0ICJtdWwtaWxvY2tzIiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAicm9sIgotICAgIGlmICEkYW91dCB7IHJ1bl9kdW1wX3Rlc3QgInNiIiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAidHJ1bmMiCi0gICAgaWYgISRhb3V0IHsgcnVuX2R1bXBfdGVzdCAidWxoIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJ1bGgtc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAidWxoLXhnb3QiIH0KLSAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJ1bGgtZW1waWMiIH0KLSAgICBpZiAhJGFvdXQgewotCXJ1bl9kdW1wX3Rlc3QgInVsdyIKLQlydW5fZHVtcF90ZXN0ICJ1bGQiCi0JcnVuX2R1bXBfdGVzdCAidXNoIgotCXJ1bl9kdW1wX3Rlc3QgInVzdyIKLQlydW5fZHVtcF90ZXN0ICJ1c2QiCi0gICAgfQotICAgICMgVGhlIG1pcHMxNiB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBvbiBFTEYsIGJlY2F1c2Ugb25seSBFTEYKLSAgICAjIHN1cHBvcnRzIHRoZSBuZWNlc3NhcnkgbWlwczE2IHJlbG9jLgotICAgIGlmIHsgJHN2cjRwaWMgJiYgISRub19taXBzMTYgfSB7IHJ1bl9kdW1wX3Rlc3QgIm1pcHMxNiIgfQotICAgIHJ1bl9kdW1wX3Rlc3QgImRlbGF5IgotICAgIHJ1bl9kdW1wX3Rlc3QgIm5vZGVsYXkiCi0gICAgcnVuX2R1bXBfdGVzdCAibWlwczQwMTAiCi0gICAgcnVuX2R1bXBfdGVzdCAibWlwczQ2NTAiCi0gICAgcnVuX2R1bXBfdGVzdCAibWlwczQxMDAiCi0gICAgcnVuX2R1bXBfdGVzdCAibGluZW5vIgotICAgIHJ1bl9kdW1wX3Rlc3QgInN5bmMiCi0KLSAgICAjIE1ha2Ugc3VyZSB0aGF0IC1tY3B1PUZPTyBhbmQgLW1GT08gYXJlIGVxdWl2YWxlbnQuICBBc3NlbWJsZSBhIGZpbGUKLSAgICAjIGNvbnRhaW5pbmcgNDY1MC1zcGVjaWZpYyBpbnN0cnVjdGlvbnMgd2l0aCAtbTQ2NTAgYW5kIC1tY3B1PTQ2NTAsCi0gICAgIyBhbmQgdmVyaWZ5IHRoYXQgdGhleSdyZSB0aGUgc2FtZS4gIFNwZWNpZmljYWxseSwgd2UncmUgY2hlY2tpbmcKLSAgICAjIHRoYXQgdGhlIEVGX01JUFNfTUFDSCBmaWVsZCBpcyBzZXQsIGFuZCB0aGF0IHRoZSA0NjUwICdtdWwnCi0gICAgIyBpbnN0cnVjdGlvbiBkb2VzIGdldCB1c2VkLiAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgR0FTLCAKLSAgICAjIG9ubHkgLW1jcHU9NDY1MCB3b3VsZCBzZXQgdGhlIEVGX01JUFNfTUFDSCBmaWVsZDsgLW00NjUwIHdvdWxkbid0LgotICAgIHJ1bl9kdW1wX3Rlc3QgImVsZl9lX2ZsYWdzMSIKLSAgICBydW5fZHVtcF90ZXN0ICJlbGZfZV9mbGFnczIiCi0gICAgcnVuX2R1bXBfdGVzdCAiZWxmX2VfZmxhZ3MzIgotICAgIHJ1bl9kdW1wX3Rlc3QgImVsZl9lX2ZsYWdzNCIKLSAgICAKLSAgICBpZiAkc3ZyNHBpYyB7Ci0JcnVuX2R1bXBfdGVzdCAiZWxmLXJlbCIKLQlpZiBbaXN0YXJnZXQgbWlwczY0Ki0qLSpdIHsgCi0JICAgIHJ1bl9kdW1wX3Rlc3QgImVsZi1yZWwyIiAKLQl9IHsKLQkgICAgcnVuX2R1bXBfdGVzdCAiZTMyLXJlbDIiIAotCX0gCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczE2LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YzFhMGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYuZAorKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC1tbWlwczo0MDAwCi0jYXM6IC1taXBzMyAtbWNwdT1yNDAwMAotI25hbWU6IG1pcHMxNgotCi0jIFRlc3QgdGhlIG1pcHMxNiBpbnN0cnVjdGlvbiBzZXQuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwMDAgPGRhdGExPjoKLSAgIDA6CTAwMDAwMDAwIAlub3AKLQotMCswMDAwMDQgPGluc25zMT46Ci0gICA0OgkzYjQwICAgICAgCWxkCVwkdjAsMFwoXCR2MVwpCi0gICA2OglmMDAwIDNiNDEgCWxkCVwkdjAsMVwoXCR2MVwpCi0gICBhOglmMDAwIDNiNDIgCWxkCVwkdjAsMlwoXCR2MVwpCi0gICBlOglmMDAwIDNiNDMgCWxkCVwkdjAsM1woXCR2MVwpCi0gIDEyOglmMDAwIDNiNDQgCWxkCVwkdjAsNFwoXCR2MVwpCi0gIDE2OgkzYjQxICAgICAgCWxkCVwkdjAsOFwoXCR2MVwpCi0gIDE4OgkzYjQyICAgICAgCWxkCVwkdjAsMTZcKFwkdjFcKQotICAxYToJM2I0NCAgICAgIAlsZAlcJHYwLDMyXChcJHYxXCkKLSAgMWM6CTNiNDggICAgICAJbGQJXCR2MCw2NFwoXCR2MVwpCi0gIDFlOgkzYjUwICAgICAgCWxkCVwkdjAsMTI4XChcJHYxXCkKLSAgMjA6CWYxMDAgM2I0MCAJbGQJXCR2MCwyNTZcKFwkdjFcKQotICAyNDoJZjIwMCAzYjQwIAlsZAlcJHYwLDUxMlwoXCR2MVwpCi0gIDI4OglmNDAwIDNiNDAgCWxkCVwkdjAsMTAyNFwoXCR2MVwpCi0gIDJjOglmMDAxIDNiNDAgCWxkCVwkdjAsMjA0OFwoXCR2MVwpCi0gIDMwOglmN2ZmIDNiNWYgCWxkCVwkdjAsLTFcKFwkdjFcKQotICAzNDoJZjdmZiAzYjVlIAlsZAlcJHYwLC0yXChcJHYxXCkKLSAgMzg6CWY3ZmYgM2I1ZCAJbGQJXCR2MCwtM1woXCR2MVwpCi0gIDNjOglmN2ZmIDNiNWMgCWxkCVwkdjAsLTRcKFwkdjFcKQotICA0MDoJZjdmZiAzYjU4IAlsZAlcJHYwLC04XChcJHYxXCkKLSAgNDQ6CWY3ZmYgM2I1MCAJbGQJXCR2MCwtMTZcKFwkdjFcKQotICA0ODoJZjdmZiAzYjQwIAlsZAlcJHYwLC0zMlwoXCR2MVwpCi0gIDRjOglmN2RmIDNiNDAgCWxkCVwkdjAsLTY0XChcJHYxXCkKLSAgNTA6CWY3OWYgM2I0MCAJbGQJXCR2MCwtMTI4XChcJHYxXCkKLSAgNTQ6CWY3MWYgM2I0MCAJbGQJXCR2MCwtMjU2XChcJHYxXCkKLSAgNTg6CWY2MWYgM2I0MCAJbGQJXCR2MCwtNTEyXChcJHYxXCkKLSAgNWM6CWY0MWYgM2I0MCAJbGQJXCR2MCwtMTAyNFwoXCR2MVwpCi0gIDYwOglmMDFmIDNiNDAgCWxkCVwkdjAsLTIwNDhcKFwkdjFcKQotICA2NDoJZjdiZiBmYzQwIAlsZAlcJHYwLDAgPGRhdGExPgotICA2ODoJZjZhMCBmYzU0IAlsZAlcJHYwLDcxYyA8ZGF0YTI+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/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3ZidSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZidS5zOiBtb3ZidSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmJ1LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEY1MzkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjc1OTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEY0OTlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjA5NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgQ0QwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGNEM5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTldIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92aHUge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92aHUuczogbW92aHUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZodS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4NjYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRkE2NjAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZDNjYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGOEJEMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEZBQkQwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGQ0JEMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjRBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgMzk4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMSBGQ0FEMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEYwNzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IEY4NzYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRkE3NjAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEZDNzYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTUgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRjg5NzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOSBGQTk3ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2QgRkM5NzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOCArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MyBGNERBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NSAwNzAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEZDODcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjEgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92bSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZtLnM6IG1vdm0gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZtLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQ0UzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQ0VGOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQ0YzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgQ0ZGOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tdWxkaXYge30gewotICAgIHNldCB0ZXN0bmFtZSAibXVsZGl2LnM6IG11bGRpdiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm11bGRpdi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYzNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYzNUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYzNkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fb3RoZXIge30gewotICAgIHNldCB0ZXN0bmFtZSAib3RoZXIuczogb3RoZXIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJvdGhlci5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZDMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjRFMEZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGMDA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBGRDAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEY0RTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjAwOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEVCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2hpZnQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2hpZnQuczogc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaGlmdC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYzM0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYzMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYzMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3ViIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInN1Yi5zOiBzdWIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzdWIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjJERlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjI1RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjcxRUZGN0YgXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBGNDZBRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY3MEVGRjdGIFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjQ2RUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs5ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOSBGMjk2IFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLWlmIFtpc3RhcmdldCBtbjEwMjAwKi0qLSpdIHRoZW4gewotICAgICMgVGVzdCB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gcGFyc2VyLgotICAgIGRvX2FkZAotICAgIGRvX2JjYwotICAgIGRvX2JjY3gKLSAgICBkb19iaXQKLSAgICBkb19jbXAKLSAgICBkb19leHQKLSAgICBkb19sb2dpY2FsCi0gICAgZG9fbW92MQotICAgIGRvX21vdjIKLSAgICBkb19tb3YzCi0gICAgZG9fbW92NAotICAgIGRvX21vdmIKLSAgICBkb19tb3Z4Ci0gICAgZG9fbW92YnUKLSAgICBkb19tdWxkaXYKLSAgICBkb19vdGhlcgotICAgIGRvX3NoaWZ0Ci0gICAgZG9fc3ViCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5MmRjZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjYy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCS50ZXh0Ci1mb286Ci0JYmVxIGZvbwotCWJuZSBmb28KLQliZ3QgZm9vCi0JYmdlIGZvbwotCWJsZSBmb28KLQlibHQgZm9vCi0JYmhpIGZvbwotCWJjYyBmb28KLQlibHMgZm9vCQotCWJjcyBmb28KLQlidmMgZm9vCi0JYnZzIGZvbwotCWJuYyBmb28KLQlibnMgZm9vCi0JYnJhIGZvbwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2N4LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjY3gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlN2VkZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjY3gucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkudGV4dAotZm9vOgotCWJlcXggZm9vCi0JYm5leCBmb28KLQliZ3R4IGZvbwotCWJnZXggZm9vCi0JYmxleCBmb28KLQlibHR4IGZvbwotCWJoaXggZm9vCi0JYmNjeCBmb28KLQlibHN4IGZvbwkKLQliY3N4IGZvbwotCWJ2Y3ggZm9vCi0JYnZzeCBmb28KLQlibmN4IGZvbwotCWJuc3ggZm9vCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JpdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiNjBkNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JpdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLQlidHN0IDY0LGQxCi0JYnRzdCA4MTkyLGQyCi0JYnNldCBkMSwoYTIpCi0JYmNsciBkMSwoYTIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2NtcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9jbXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzOTI1Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2NtcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci0JY21wIGQxLGQyCi0JY21wIGQyLGEzCi0JY21wIGEzLGQzCi0JY21wIGEzLGEyCi0JY21wIDE2LGQzCi0JY21wIDI1NixkMgotCWNtcCAxMzEwNzEsZDEKLQljbXAgMjU2LGEyCi0JY21wIDEzMTA3MSxhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9leHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvZXh0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTAxYmEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9leHQucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS50ZXh0Ci0JZXh0IGQxCi0JZXh0eCBkMgotCWV4dHh1IGQzCi0JZXh0eGIgZDIKLQlleHR4YnUgZDEKLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbG9naWNhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9sb2dpY2FsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MDlkN2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9sb2dpY2FsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLnRleHQKLQlhbmQgZDEsZDIKLQlhbmQgMTI3LGQyCi0JYW5kIDMyNzY3LGQzCi0JYW5kIDMyNzY3LHBzdwotCW9yIGQxLGQyCi0Jb3IgMTI3LGQyCi0Jb3IgMzI3NjcsZDMKLQlvciAzMjc2Nyxwc3cKLQl4b3IgZDEsZDIKLQl4b3IgMzI3NjcsZDMKLQlub3QgZDMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92MS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MjhlMzIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLnRleHQKLQltb3YgZDEsYTIKLQltb3YgYTIsZDEKLQltb3YgZDEsZDIKLQltb3YgYTIsYTEKLQltb3YgcHN3LGQzCi0JbW92IGQyLHBzdwotCW1vdiBtZHIsZDEKLQltb3YgZDIsbWRyCi0JbW92IChhMiksZDEKLQltb3YgKDgsYTIpLGQxCi0JbW92ICgyNTYsYTIpLGQxCi0JbW92ICgxMzEwNzEsYTIpLGQxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGY2ZTI1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Mi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci0JbW92IChkMSxhMSksZDIKLQltb3YgKDMyNzY4KSxkMQotCW1vdiAoMTMxMDcxKSxkMQotCW1vdiAoOCxhMiksYTEKLQltb3YgKDI1NixhMiksYTEKLQltb3YgKDEzMTA3MSxhMiksYTEKLQltb3YgKGQxLGExKSxhMgotICAgICAgICBtb3YgKDMyNzY4KSxhMQotICAgICAgICBtb3YgKDEzMTA3MSksYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzQ5MGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JLnRleHQKLSAgICAgICAgbW92IGQxLChhMikKLSAgICAgICAgbW92IGQxLCgzMixhMikKLQltb3YgZDEsKDI1NixhMikKLQltb3YgZDEsKDEzMTA3MSxhMikKLQltb3YgZDEsKGQyLGEyKQotCW1vdiBkMSwoMTI4KQotCW1vdiBkMSwoMTMxMDcxKQotCW1vdiBhMSwoMzIsYTIpCi0JbW92IGExLCgyNTYsYTIpCi0JbW92IGExLCgxMzEwNzEsYTIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92NC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTE4N2UwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92NC5zCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0JLnRleHQKLQltb3YgYTEsKGQyLGEyKQotCW1vdiBhMSwoMTI4KQotCW1vdiBhMSwoMTMxMDcxKQotCW1vdiA4LGQxCi0JbW92IDI1NixkMQotCW1vdiAxMzEwNzEsZDEKLQltb3YgMjU2LGExCi0JbW92IDEzMTA3MSxhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZiLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1NjYxNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmIucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotCW1vdmIgKDgsYTIpLGQxCi0JbW92YiAoMjU2LGEyKSxkMQotCW1vdmIgKDEzMTA3MSxhMiksZDEKLQltb3ZiIChkMixhMiksZDMKLQltb3ZiICgxMzEwNzEpLGQyCi0JbW92YiBkMSwoYTIpCi0JbW92YiBkMSwoOCxhMikKLQltb3ZiIGQxLCgyNTYsYTIpCi0JbW92YiBkMSwoMTMxMDcxLGEyKQotCW1vdmIgZDEsKGQyLGEyKQotCW1vdmIgZDEsKDI1NikKLQltb3ZiIGQxLCgxMzEwNzEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmJ1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmJ1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDk3M2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZidS5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLnRleHQKLQltb3ZidSAoYTIpLGQxCi0JbW92YnUgKDgsYTIpLGQxCi0JbW92YnUgKDI1NixhMiksZDEKLQltb3ZidSAoMTMxMDcxLGEyKSxkMQotCW1vdmJ1IChkMSxhMSksZDIKLQltb3ZidSAoMzI3NjgpLGQxCi0JbW92YnUgKDEzMTA3MSksZDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92eC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3Z4LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZTFkNzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3Z4LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkudGV4dAotCW1vdnggKDgsYTIpLGQxCi0JbW92eCAoMjU2LGEyKSxkMQotCW1vdnggKDEzMTA3MSxhMiksZDEKLQltb3Z4IGQxLCg4LGEyKQotCW1vdnggZDEsKDI1NixhMikKLQltb3Z4IGQxLCgxMzEwNzEsYTIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL211bGRpdi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tdWxkaXYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxNzAyNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL211bGRpdi5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0JLnRleHQKLQltdWwgZDEsZDIKLQltdWx1IGQyLGQzCi0JZGl2dSBkMyxkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9vdGhlci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9vdGhlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y5NGJkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvb3RoZXIucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkudGV4dAotCWptcCAyNTYKLQlqbXAgMTMxMDcxCi0Jam1wIChhMikKLQlqc3IgMjU2Ci0JanNyIDEzMTA3MQotCWpzciAoYTIpCi0JcnRzCi0JcnRpCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3NoaWZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3NoaWZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGU3NjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9zaGlmdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLQlhc3IgZDIKLQlsc3IgZDMKLQlyb3IgZDEKLQlyb2wgZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc3ViLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3N1Yi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTUxNjU0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc3ViLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLnRleHQKLQlzdWIgZDEsZDIKLQlzdWIgZDIsYTMKLQlzdWIgYTMsZDMKLQlzdWIgYTMsYTIKLQlzdWIgMzI3NjcsZDIKLQlzdWIgMTMxMDcxLGQyCi0Jc3ViIDMyNzY3LGEyCi0Jc3ViIDEzMTA3MSxhMgotCXN1YmMgZDEsZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY1NThmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLnRleHQKLQlhZGQgZDEsZDIKLQlhZGQgZDIsYTMKLQlhZGQgYTMsYTIKLQlhZGQgYTIsZDEKLQlhZGQgMTYsZDEKLQlhZGQgMjU2LGQyCi0JYWRkIDEzMTA3MSxkMwotCWFkZCAxNixhMQotCWFkZCAyNTYsYTIKLQlhZGQgMTMxMDcxLGEzCi0JYWRkIDE2LHNwCi0JYWRkIDI1NixzcAotCWFkZCAxMzEwNzEsc3AKLQlhZGRjIGQxLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zMy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWQzYjZjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zMy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotCS50ZXh0Ci0JLmFtMzMKLQljYWxsIDI1NixbYTIsYTMsZXhyZWcwXSw5Ci0JY2FsbCAyNTYsW2EyLGEzLGV4cmVnMV0sOQotCWNhbGwgMjU2LFthMixhMyxleG90aGVyXSw5Ci0JY2FsbCAyNTYsW2EyLGEzLGFsbF0sOQotCWNhbGwgMTMxMDcxLFthMixhMyxleHJlZzBdLDkKLQljYWxsIDEzMTA3MSxbYTIsYTMsZXhyZWcxXSw5Ci0JY2FsbCAxMzEwNzEsW2EyLGEzLGV4b3RoZXJdLDkKLQljYWxsIDEzMTA3MSxbYTIsYTMsYWxsXSw5Ci0JbW92bSAoc3ApLFthMixhMyxleHJlZzBdCi0JbW92bSAoc3ApLFthMixhMyxleHJlZzFdCi0JbW92bSAoc3ApLFthMixhMyxleG90aGVyXQotCW1vdm0gKHNwKSxbYTIsYTMsYWxsXQotCW1vdm0gW2EyLGEzLGV4cmVnMF0sKHNwKQotCW1vdm0gW2EyLGEzLGV4cmVnMV0sKHNwKQotCW1vdm0gW2EyLGEzLGV4b3RoZXJdLChzcCkKLQltb3ZtIFthMixhMyxhbGxdLChzcCkKLQltb3ZtICh1c3ApLFthMixhMyxleHJlZzBdCi0JbW92bSAodXNwKSxbYTIsYTMsZXhyZWcxXQotCW1vdm0gKHVzcCksW2EyLGEzLGV4b3RoZXJdCi0JbW92bSAodXNwKSxbYTIsYTMsYWxsXQotCW1vdm0gW2EyLGEzLGV4cmVnMF0sKHVzcCkKLQltb3ZtIFthMixhMyxleHJlZzFdLCh1c3ApCi0JbW92bSBbYTIsYTMsZXhvdGhlcl0sKHVzcCkKLQltb3ZtIFthMixhMyxhbGxdLCh1c3ApCi0JbW92IHVzcCxhMAotCW1vdiBzc3AsYTEKLQltb3YgbXNwLGEyCi0JbW92IHBjLGEzCi0JbW92IGEwLHVzcAotCW1vdiBhMSxzc3AKLQltb3YgYTIsbXNwCi0Jc3lzY2FsbCAweDQKLQltb3YgZXBzdyxkMAotCW1vdiBkMSxlcHN3Ci0JbW92IGEwLHIxCi0JbW92IGQyLHIzCi0JbW92IHI1LGExCi0JbW92IHI3LGQzCi0JbWNzdDkgZDAKLQltY3N0NDggZDEKLQlnZXRjaHggZDAKLQlnZXRjbHggZDEKLQlhbmQgMTMxMDcyLGVwc3cKLQlvciA2NTUzNSxlcHN3CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmMmE4Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfMi5zCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotCS50ZXh0Ci0JLmFtMzMKLQltb3YgcjAscjEKLQlleHQgcjIKLQlleHRiIHIzLHI0Ci0JZXh0YnUgcjQscjUKLQlleHRoIHI2LHI3Ci0JZXh0aHUgcjcscjgKLQljbHIgcjkKLQlhZGQgcjEwLHIxMQotCWFkZGMgcjEyLHIxMwotCXN1YiByMTQscjE1Ci0Jc3ViYyByMTUscjE0Ci0JaW5jIHIxMwotCWluYzQgcjEyCi0JY21wIHIxMSxyMTAKLQltb3YgeHIwLCByMQotCW1vdiByMSwgeHIyCi0JYW5kIHIwLHIxCi0Jb3IgcjIscjMKLQl4b3IgcjQscjUKLQlub3QgcjYKLQlhc3IgcjcscjgKLQlsc3IgcjkscjEwCi0JYXNsIHIxMSxyMTIKLQlhc2wyIHIxMwotCXJvciByMTQKLQlyb2wgcjE1Ci0JbXVsIHIxLHIyCi0JbXVsdSByMyxyNAotCWRpdiByNSxyNgotCWRpdnUgcjcscjgKLQltb3YgKHIxKSxyMgotCW1vdiByMywocjQpCi0JbW92YnUgKHI1KSxyNgotCW1vdmJ1IHI3LChyOCkKLQltb3ZodSAocjkpLHIxMAotCW1vdmh1IHIxMSwocjEyKQotCW1vdiAocjErKSxyMgotCW1vdiByMywocjQrKQotCW1vdiAoc3ApLHI1Ci0JbW92IHI2LChzcCkKLQltb3ZidSAoc3ApLHI3Ci0JbW92YnUgcjgsKHNwKQotCW1vdmh1IChzcCkscjkKLQltb3ZodSByMTAsKHNwKQotCW1vdmh1IChyNispLHI3Ci0JbW92aHUgcjgsKHI5KykKLQltYWMgcjEscjIKLQltYWN1IHIzLHI0Ci0JbWFjYiByNSxyNgotCW1hY2J1IHI3LHI4Ci0JbWFjaCByOSxyMTAKLQltYWNodSByMTEscjEyCi0JZG1hY2ggcjEzLHIxNAotCWRtYWNodSByMTUscjE0Ci0JZG11bGggcjEzLHIxMgotCWRtdWxodSByMTEscjEwCi0Jc2F0MTYgcjkscjgKLQltY3N0ZSByNyxyNgotCXN3YXAgcjUscjQKLQlzd2FwaCByMyxyMgotCXN3aHcgIHIxLHIwCi0JYnNjaCByMSxyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM18zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZmFkYjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzMucworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLQkudGV4dAotCS5hbTMzCi0JbW92IDE2LHIxCi0JbW92dSAxNixyMQotCWFkZCAxNixyMQotCWFkZGMgMTYscjEKLQlzdWIgMTYscjEKLQlzdWJjIDE2LHIxCi0JY21wIDE2LHIxCi0JbW92IDE2LHhyMQotCWFuZCAxNixyMQotCW9yIDE2LHIxCi0JeG9yIDE2LHIxCi0JYXNyIDE2LHIxCi0JbHNyIDE2LHIxCi0JYXNsIDE2LHIxCi0JbXVsIDE2LHIxCi0JbXVsdSAxNixyMQotCWJ0c3QgMTYscjEKLQltb3YgKDE2LHIxKSxyMgotCW1vdiByMiwoMTYscjEpCi0JbW92YnUgKDE2LHIxKSxyMgotCW1vdmJ1IHIyLCgxNixyMSkKLQltb3ZodSAoMTYscjEpLHIyCi0JbW92aHUgcjIsKDE2LHIxKQotCW1vdiAoMTYsc3ApLHIyCi0JbW92IHIyLCgxNixzcCkKLQltb3ZidSAoMTYsc3ApLHIyCi0JbW92YnUgcjIsKDE2LHNwKQotCW1vdmh1ICgxNixzcCkscjIKLQltb3ZodSByMiwoMTYsc3ApCi0JbWFjIDE2LHIxCi0JbWFjdSAxNixyMQotCW1hY2IgMTYscjEKLQltYWNidSAxNixyMQotCW1hY2ggMTYscjEKLQltYWNodSAxNixyMQotCW1jc3RlIDE2LHIxCi0JYWRkIHIxLHIyLHIzCi0JbW92IChyMSssMTYpLHIyCi0JbW92IHIxLChyMissMTYpCi0JbW92aHUgKHIxKywxNikscjIKLQltb3ZodSByMSwocjIrLDE2KQotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM180LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OTBmZDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzQucworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLQkudGV4dAotCS5hbTMzCi0JbW92IDB4MWZmZWZmLHIyCi0JbW92dSAweDFmZmVmZixyMgotCWFkZCAweDFmZmVmZixyMgotCWFkZGMgMHgxZmZlZmYscjIKLQlzdWIgMHgxZmZlZmYscjIKLQlzdWJjIDB4MWZmZWZmLHIyCi0JY21wIDB4MWZmZWZmLHIyCi0JbW92IDB4MWZmZWZmLHhyMgotCWFuZCAweDFmZmVmZixyMgotCW9yIDB4MWZmZWZmLHIyCi0JeG9yIDB4MWZmZWZmLHIyCi0JYXNyIDB4MWZmZWZmLHIyCi0JbHNyIDB4MWZmZWZmLHIyCi0JYXNsIDB4MWZmZWZmLHIyCi0JbXVsIDB4MWZmZWZmLHIyCi0JbXVsdSAweDFmZmVmZixyMgotCWJ0c3QgMHgxZmZlZmYscjIKLQltb3YgKDB4MWZmZWZmLHIxKSxyMgotCW1vdiByMiwoMHgxZmZlZmYscjEpCi0JbW92YnUgKDB4MWZmZWZmLHIxKSxyMgotCW1vdmJ1IHIyLCgweDFmZmVmZixyMSkKLQltb3ZodSAoMHgxZmZlZmYscjEpLHIyCi0JbW92aHUgcjIsKDB4MWZmZWZmLHIxKQotCW1vdiAoMHgxZmZlZmYsc3ApLHIyCi0JbW92IHIyLCgweDFmZmVmZixzcCkKLQltb3ZidSAoMHgxZmZlZmYsc3ApLHIyCi0JbW92YnUgcjIsKDB4MWZmZWZmLHNwKQotCW1vdmh1ICgweDFmZmVmZixzcCkscjIKLQltb3ZodSByMiwoMHgxZmZlZmYsc3ApCi0JbWFjIDB4MWZmZWZmLHIyCi0JbWFjdSAweDFmZmVmZixyMgotCW1hY2IgMHgxZmZlZmYscjIKLQltYWNidSAweDFmZmVmZixyMgotCW1hY2ggMHgxZmZlZmYscjIKLQltYWNodSAweDFmZmVmZixyMgotCW1vdiAoMHgxZmZlZmYpLHIyCi0JbW92IHIyLCgweDFmZmVmZikKLQltb3ZidSAoMHgxZmZlZmYpLHIyCi0JbW92YnUgcjIsKDB4MWZmZWZmKQotCW1vdmh1ICgweDFmZmVmZikscjIKLQltb3ZodSByMiwoMHgxZmZlZmYpCi0JbW92IChyMSssMHgxZmZlZmYpLHIyCi0JbW92IHIxLChyMissMHgxZmZlZmYpCi0JbW92aHUgKHIxKywweDFmZmVmZikscjIKLQltb3ZodSByMSwocjIrLDB4MWZmZWZmKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM181LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWE0MmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzUucworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLQkudGV4dAotCS5hbTMzCi0JbW92IDB4N2ZmZWZkZmMscjIKLQltb3Z1IDB4N2ZmZWZkZmMscjIKLQlhZGQgMHg3ZmZlZmRmYyxyMgotCWFkZGMgMHg3ZmZlZmRmYyxyMgotCXN1YiAweDdmZmVmZGZjLHIyCi0Jc3ViYyAweDdmZmVmZGZjLHIyCi0JY21wIDB4N2ZmZWZkZmMscjIKLQltb3YgMHg3ZmZlZmRmYyx4cjIKLQlhbmQgMHg3ZmZlZmRmYyxyMgotCW9yIDB4N2ZmZWZkZmMscjIKLQl4b3IgMHg3ZmZlZmRmYyxyMgotCWFzciAweDdmZmVmZGZjLHIyCi0JbHNyIDB4N2ZmZWZkZmMscjIKLQlhc2wgMHg3ZmZlZmRmYyxyMgotCW11bCAweDdmZmVmZGZjLHIyCi0JbXVsdSAweDdmZmVmZGZjLHIyCi0JYnRzdCAweDdmZmVmZGZjLHIyCi0JbW92ICgweDdmZmVmZGZjLHIxKSxyMgotCW1vdiByMiwoMHg3ZmZlZmRmYyxyMSkKLQltb3ZidSAoMHg3ZmZlZmRmYyxyMSkscjIKLQltb3ZidSByMiwoMHg3ZmZlZmRmYyxyMSkKLQltb3ZodSAoMHg3ZmZlZmRmYyxyMSkscjIKLQltb3ZodSByMiwoMHg3ZmZlZmRmYyxyMSkKLQltb3YgKDB4N2ZmZWZkZmMsc3ApLHIyCi0JbW92IHIyLCgweDdmZmVmZGZjLHNwKQotCW1vdmJ1ICgweDdmZmVmZGZjLHNwKSxyMgotCW1vdmJ1IHIyLCgweDdmZmVmZGZjLHNwKQotCW1vdmh1ICgweDdmZmVmZGZjLHNwKSxyMgotCW1vdmh1IHIyLCgweDdmZmVmZGZjLHNwKQotCW1hYyAweDdmZmVmZGZjLHIyCi0JbWFjdSAweDdmZmVmZGZjLHIyCi0JbWFjYiAweDdmZmVmZGZjLHIyCi0JbWFjYnUgMHg3ZmZlZmRmYyxyMgotCW1hY2ggMHg3ZmZlZmRmYyxyMgotCW1hY2h1IDB4N2ZmZWZkZmMscjIKLQlkbWFjaCAweDdmZmVmZGZjLHIyCi0JZG1hY2h1IDB4N2ZmZWZkZmMscjIKLQlkbXVsaCAweDdmZmVmZGZjLHIyCi0JZG11bGh1IDB4N2ZmZWZkZmMscjIKLQltb3YgKDB4N2ZmZWZkZmMpLHIyCi0JbW92IHIyLCgweDdmZmVmZGZjKQotCW1vdmJ1ICgweDdmZmVmZGZjKSxyMgotCW1vdmJ1IHIyLCgweDdmZmVmZGZjKQotCW1vdmh1ICgweDdmZmVmZGZjKSxyMgotCW1vdmh1IHIyLCgweDdmZmVmZGZjKQotCW11bCBkMCxkMSxhMCxhMQotCW11bHUgZDAsZDEsYTAsYTEKLQltb3YgKHIxKywweDdmZmVmZGZjKSxyMgotCW1vdiByMSwocjIrLDB4N2ZmZWZkZmMpCi0JbW92aHUgKHIxKywweDdmZmVmZGZjKSxyMgotCW1vdmh1IHIxLChyMissMHg3ZmZlZmRmYykKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM182LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ2NmYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM182LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0JLnRleHQKLQkuYW0zMwotCWFkZF9hZGQgcjQscjEscjIscjMKLQlhZGRfYWRkIHI0LHIxLDIscjMKLQlhZGRfc3ViIHI0LHIxLHIyLHIzCi0JYWRkX3N1YiByNCxyMSwyLHIzCi0JYWRkX2NtcCByNCxyMSxyMixyMwotCWFkZF9jbXAgcjQscjEsMixyMwotCWFkZF9tb3YgcjQscjEscjIscjMKLQlhZGRfbW92IHI0LHIxLDIscjMKLQlhZGRfYXNyIHI0LHIxLHIyLHIzCi0JYWRkX2FzciByNCxyMSwyLHIzCi0JYWRkX2xzciByNCxyMSxyMixyMwotCWFkZF9sc3IgcjQscjEsMixyMwotCWFkZF9hc2wgcjQscjEscjIscjMKLQlhZGRfYXNsIHI0LHIxLDIscjMKLQljbXBfYWRkIHI0LHIxLHIyLHIzCi0JY21wX2FkZCByNCxyMSwyLHIzCi0JY21wX3N1YiByNCxyMSxyMixyMwotCWNtcF9zdWIgcjQscjEsMixyMwotCWNtcF9tb3YgcjQscjEscjIscjMKLQljbXBfbW92IHI0LHIxLDIscjMKLQljbXBfYXNyIHI0LHIxLHIyLHIzCi0JY21wX2FzciByNCxyMSwyLHIzCi0JY21wX2xzciByNCxyMSxyMixyMwotCWNtcF9sc3IgcjQscjEsMixyMwotCWNtcF9hc2wgcjQscjEscjIscjMKLQljbXBfYXNsIHI0LHIxLDIscjMKLQlzdWJfYWRkIHI0LHIxLHIyLHIzCi0Jc3ViX2FkZCByNCxyMSwyLHIzCi0Jc3ViX3N1YiByNCxyMSxyMixyMwotCXN1Yl9zdWIgcjQscjEsMixyMwotCXN1Yl9jbXAgcjQscjEscjIscjMKLQlzdWJfY21wIHI0LHIxLDIscjMKLQlzdWJfbW92IHI0LHIxLHIyLHIzCi0Jc3ViX21vdiByNCxyMSwyLHIzCi0Jc3ViX2FzciByNCxyMSxyMixyMwotCXN1Yl9hc3IgcjQscjEsMixyMwotCXN1Yl9sc3IgcjQscjEscjIscjMKLQlzdWJfbHNyIHI0LHIxLDIscjMKLQlzdWJfYXNsIHI0LHIxLHIyLHIzCi0Jc3ViX2FzbCByNCxyMSwyLHIzCi0JbW92X2FkZCByNCxyMSxyMixyMwotCW1vdl9hZGQgcjQscjEsMixyMwotCW1vdl9zdWIgcjQscjEscjIscjMKLQltb3Zfc3ViIHI0LHIxLDIscjMKLQltb3ZfY21wIHI0LHIxLHIyLHIzCi0JbW92X2NtcCByNCxyMSwyLHIzCi0JbW92X21vdiByNCxyMSxyMixyMwotCW1vdl9tb3YgcjQscjEsMixyMwotCW1vdl9hc3IgcjQscjEscjIscjMKLQltb3ZfYXNyIHI0LHIxLDIscjMKLQltb3ZfbHNyIHI0LHIxLHIyLHIzCi0JbW92X2xzciByNCxyMSwyLHIzCi0JbW92X2FzbCByNCxyMSxyMixyMwotCW1vdl9hc2wgcjQscjEsMixyMwotCWFkZF9hZGQgNCxyMSxyMixyMwotCWFkZF9hZGQgNCxyMSwyLHIzCi0JYWRkX3N1YiA0LHIxLHIyLHIzCi0JYWRkX3N1YiA0LHIxLDIscjMKLQlhZGRfY21wIDQscjEscjIscjMKLQlhZGRfY21wIDQscjEsMixyMwotCWFkZF9tb3YgNCxyMSxyMixyMwotCWFkZF9tb3YgNCxyMSwyLHIzCi0JYWRkX2FzciA0LHIxLHIyLHIzCi0JYWRkX2FzciA0LHIxLDIscjMKLQlhZGRfbHNyIDQscjEscjIscjMKLQlhZGRfbHNyIDQscjEsMixyMwotCWFkZF9hc2wgNCxyMSxyMixyMwotCWFkZF9hc2wgNCxyMSwyLHIzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hbTMzXzcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlZTVmNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfNy5zCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotCS50ZXh0Ci0JLmFtMzMKLQljbXBfYWRkIDQscjEscjIscjMKLQljbXBfYWRkIDQscjEsMixyMwotCWNtcF9zdWIgNCxyMSxyMixyMwotCWNtcF9zdWIgNCxyMSwyLHIzCi0JY21wX21vdiA0LHIxLHIyLHIzCi0JY21wX21vdiA0LHIxLDIscjMKLQljbXBfYXNyIDQscjEscjIscjMKLQljbXBfYXNyIDQscjEsMixyMwotCWNtcF9sc3IgNCxyMSxyMixyMwotCWNtcF9sc3IgNCxyMSwyLHIzCi0JY21wX2FzbCA0LHIxLHIyLHIzCi0JY21wX2FzbCA0LHIxLDIscjMKLQlzdWJfYWRkIDQscjEscjIscjMKLQlzdWJfYWRkIDQscjEsMixyMwotCXN1Yl9zdWIgNCxyMSxyMixyMwotCXN1Yl9zdWIgNCxyMSwyLHIzCi0Jc3ViX2NtcCA0LHIxLHIyLHIzCi0Jc3ViX2NtcCA0LHIxLDIscjMKLQlzdWJfbW92IDQscjEscjIscjMKLQlzdWJfbW92IDQscjEsMixyMwotCXN1Yl9hc3IgNCxyMSxyMixyMwotCXN1Yl9hc3IgNCxyMSwyLHIzCi0Jc3ViX2xzciA0LHIxLHIyLHIzCi0Jc3ViX2xzciA0LHIxLDIscjMKLQlzdWJfYXNsIDQscjEscjIscjMKLQlzdWJfYXNsIDQscjEsMixyMwotCW1vdl9hZGQgNCxyMSxyMixyMwotCW1vdl9hZGQgNCxyMSwyLHIzCi0JbW92X3N1YiA0LHIxLHIyLHIzCi0JbW92X3N1YiA0LHIxLDIscjMKLQltb3ZfY21wIDQscjEscjIscjMKLQltb3ZfY21wIDQscjEsMixyMwotCW1vdl9tb3YgNCxyMSxyMixyMwotCW1vdl9tb3YgNCxyMSwyLHIzCi0JbW92X2FzciA0LHIxLHIyLHIzCi0JbW92X2FzciA0LHIxLDIscjMKLQltb3ZfbHNyIDQscjEscjIscjMKLQltb3ZfbHNyIDQscjEsMixyMwotCW1vdl9hc2wgNCxyMSxyMixyMwotCW1vdl9hc2wgNCxyMSwyLHIzCi0JYW5kX2FkZCByNCxyMSxyMixyMwotCWFuZF9hZGQgcjQscjEsMixyMwotCWFuZF9zdWIgcjQscjEscjIscjMKLQlhbmRfc3ViIHI0LHIxLDIscjMKLQlhbmRfY21wIHI0LHIxLHIyLHIzCi0JYW5kX2NtcCByNCxyMSwyLHIzCi0JYW5kX21vdiByNCxyMSxyMixyMwotCWFuZF9tb3YgcjQscjEsMixyMwotCWFuZF9hc3IgcjQscjEscjIscjMKLQlhbmRfYXNyIHI0LHIxLDIscjMKLQlhbmRfbHNyIHI0LHIxLHIyLHIzCi0JYW5kX2xzciByNCxyMSwyLHIzCi0JYW5kX2FzbCByNCxyMSxyMixyMwotCWFuZF9hc2wgcjQscjEsMixyMwotCWRtYWNoX2FkZCByNCxyMSxyMixyMwotCWRtYWNoX2FkZCByNCxyMSwyLHIzCi0JZG1hY2hfc3ViIHI0LHIxLHIyLHIzCi0JZG1hY2hfc3ViIHI0LHIxLDIscjMKLQlkbWFjaF9jbXAgcjQscjEscjIscjMKLQlkbWFjaF9jbXAgcjQscjEsMixyMwotCWRtYWNoX21vdiByNCxyMSxyMixyMwotCWRtYWNoX21vdiByNCxyMSwyLHIzCi0JZG1hY2hfYXNyIHI0LHIxLHIyLHIzCi0JZG1hY2hfYXNyIHI0LHIxLDIscjMKLQlkbWFjaF9sc3IgcjQscjEscjIscjMKLQlkbWFjaF9sc3IgcjQscjEsMixyMwotCWRtYWNoX2FzbCByNCxyMSxyMixyMwotCWRtYWNoX2FzbCByNCxyMSwyLHIzCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM184LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FtMzNfOC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmE5NmQ5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYW0zM184LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0JLnRleHQKLQkuYW0zMwotCXhvcl9hZGQgcjQscjEscjIscjMKLQl4b3JfYWRkIHI0LHIxLDIscjMKLQl4b3Jfc3ViIHI0LHIxLHIyLHIzCi0JeG9yX3N1YiByNCxyMSwyLHIzCi0JeG9yX2NtcCByNCxyMSxyMixyMwotCXhvcl9jbXAgcjQscjEsMixyMwotCXhvcl9tb3YgcjQscjEscjIscjMKLQl4b3JfbW92IHI0LHIxLDIscjMKLQl4b3JfYXNyIHI0LHIxLHIyLHIzCi0JeG9yX2FzciByNCxyMSwyLHIzCi0JeG9yX2xzciByNCxyMSxyMixyMwotCXhvcl9sc3IgcjQscjEsMixyMwotCXhvcl9hc2wgcjQscjEscjIscjMKLQl4b3JfYXNsIHI0LHIxLDIscjMKLQlzd2h3X2FkZCByNCxyMSxyMixyMwotCXN3aHdfYWRkIHI0LHIxLDIscjMKLQlzd2h3X3N1YiByNCxyMSxyMixyMwotCXN3aHdfc3ViIHI0LHIxLDIscjMKLQlzd2h3X2NtcCByNCxyMSxyMixyMwotCXN3aHdfY21wIHI0LHIxLDIscjMKLQlzd2h3X21vdiByNCxyMSxyMixyMwotCXN3aHdfbW92IHI0LHIxLDIscjMKLQlzd2h3X2FzciByNCxyMSxyMixyMwotCXN3aHdfYXNyIHI0LHIxLDIscjMKLQlzd2h3X2xzciByNCxyMSxyMixyMwotCXN3aHdfbHNyIHI0LHIxLDIscjMKLQlzd2h3X2FzbCByNCxyMSxyMixyMwotCXN3aHdfYXNsIHI0LHIxLDIscjMKLQlvcl9hZGQgcjQscjEscjIscjMKLQlvcl9hZGQgcjQscjEsMixyMwotCW9yX3N1YiByNCxyMSxyMixyMwotCW9yX3N1YiByNCxyMSwyLHIzCi0Jb3JfY21wIHI0LHIxLHIyLHIzCi0Jb3JfY21wIHI0LHIxLDIscjMKLQlvcl9tb3YgcjQscjEscjIscjMKLQlvcl9tb3YgcjQscjEsMixyMwotCW9yX2FzciByNCxyMSxyMixyMwotCW9yX2FzciByNCxyMSwyLHIzCi0Jb3JfbHNyIHI0LHIxLHIyLHIzCi0Jb3JfbHNyIHI0LHIxLDIscjMKLQlvcl9hc2wgcjQscjEscjIscjMKLQlvcl9hc2wgcjQscjEsMixyMwotCXNhdDE2X2FkZCByNCxyMSxyMixyMwotCXNhdDE2X2FkZCByNCxyMSwyLHIzCi0Jc2F0MTZfc3ViIHI0LHIxLHIyLHIzCi0Jc2F0MTZfc3ViIHI0LHIxLDIscjMKLQlzYXQxNl9jbXAgcjQscjEscjIscjMKLQlzYXQxNl9jbXAgcjQscjEsMixyMwotCXNhdDE2X21vdiByNCxyMSxyMixyMwotCXNhdDE2X21vdiByNCxyMSwyLHIzCi0Jc2F0MTZfYXNyIHI0LHIxLHIyLHIzCi0Jc2F0MTZfYXNyIHI0LHIxLDIscjMKLQlzYXQxNl9sc3IgcjQscjEscjIscjMKLQlzYXQxNl9sc3IgcjQscjEsMixyMwotCXNhdDE2X2FzbCByNCxyMSxyMixyMwotCXNhdDE2X2FzbCByNCxyMSwyLHIzCi0JbW92X2xsdCAocjErLDQpLHIyCi0JbW92X2xndCAocjErLDQpLHIyCi0JbW92X2xnZSAocjErLDQpLHIyCi0JbW92X2xsZSAocjErLDQpLHIyCi0JbW92X2xjcyAocjErLDQpLHIyCi0JbW92X2xoaSAocjErLDQpLHIyCi0JbW92X2xjYyAocjErLDQpLHIyCi0JbW92X2xscyAocjErLDQpLHIyCi0JbW92X2xlcSAocjErLDQpLHIyCi0JbW92X2xuZSAocjErLDQpLHIyCi0JbW92X2xyYSAocjErLDQpLHIyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmFzaWMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iYXNpYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMzJmZjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iYXNpYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQ0ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLXByb2MgZG9fYWRkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZC5zOiBBZGQgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGMTZCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGMTdFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGMTU5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyAyOTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQUMyMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRkNDM0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIDIxMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEZBRDIwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOSBGQ0QzRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFmIEY4RkUxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRkFGRTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEZDRkVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTQgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYmNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJjYy5zOiBCY2MgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiY2MucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBDODAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBDOTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBDMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBDMjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBDMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBDMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBDNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBDNjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBDNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBDNDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGOEU4MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE3IEY4RTkwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjhFQTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZCBGOEVCMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIENBMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JpdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXQuczogYml0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjhFRDQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGQUVFMDAyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRkNFRkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEZBRjkwODQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMSBGRTAyRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzAxMDA0MFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEYwODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEZBRjEwODQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSBGRTAwRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzkgKzAxMDA0MFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI1IEYwOTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEZBRjUwODQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYiBGRTAxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyICswMTAwNDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19jbXAge30gewotICAgIHNldCB0ZXN0bmFtZSAiY21wLnM6IGNtcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNtcC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEE2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjFBQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjE5RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgQkVcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBBRjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGQUNBMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRkNDOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEJGMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEZBREEwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGQ0Q5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2V4dCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHQuczogZXh0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjJEMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgMTJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyAxN1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDFBXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgMURcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT01XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2V4dGVuZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHRlbmQuczogZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHRlbmQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNTA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGNkZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGOTAyMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZCMDMwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGRDAzRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRjYxNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRjkxNjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGQjE3MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRkQxN0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGNjRCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBGNjVFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGNjc2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19sb2dpY2FsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogbG9naWNhbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvZ2ljYWwucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGOEUyN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEZBRTNGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQ0UzRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRkFGQ0ZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEYyMTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEY4RTY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRkFFN0ZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEZDRTdGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRkFGREZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEYyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEZBRUJGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGQ0VCRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE0ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIEYyMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19sb29wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvb3AuczogbG9vcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvb3AucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEOFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEQ5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRDFcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBEMlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQzXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBENVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEQ2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDdcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBENFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIERBXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgREJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3YxIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjEuczogbW92MSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdjEucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA4NlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEYxRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEYxRDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IDk5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgM0VcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGMkY0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGMkZCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBGMkUxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGMkZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiA3NlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY4MDYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRkEwNjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE3IEZDMDZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTQgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWQgNTkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWYgRkFCNTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIzIEYyRTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjIge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92Mi5zOiBtb3YyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92Mi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZDQjVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMiArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGMzI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIEZDQTVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMSBGMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBGODI2MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEZBMjYwMDAxIFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRkMyNkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs5ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDVEMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEZBQjEwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGQ0IxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYzQTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIEZBQTEwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMiBGQ0ExRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEY4RjEyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92MyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3YzLnM6IG1vdjMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3YzLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEY4MTYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRkExNjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEZDMTZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSA0NjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGQTk1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRkM5NUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEYzNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA1ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWYgRkM4NUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNSBGMDE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNyBGODM2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEZBMzYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyZSBGQzM2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDQ3MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE5XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjQge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92NC5zOiBtb3Y0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92NC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZBOTQwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGQzk0RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRjNEQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRkE4NDgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEZDODRGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGOEY1MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE5IDg1MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFiIDJEMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRkNDREZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCA5NTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiAyNTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IEZDRERGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTMgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92YnUge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92YnUuczogbW92YnUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZidS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4NDYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRkE0NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZDNDZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGOEI5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEZBQjkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGQ0I5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjQyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgMzUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMSBGQ0E5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEYwNTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IEY4NTYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRkE1NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEZDNTZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRjg5NjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOSBGQTk2MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2QgRkM5NkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MyBGNDVBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NSAwNjgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEZDODZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92aHUge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92aHUuczogbW92aHUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZodS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4NjYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRkE2NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZDNjZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGOEJEMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEZBQkQwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGQ0JERkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjRBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgMzkwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMSBGQ0FERkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEYwNzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IEY4NzYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRkE3NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEZDNzZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRjg5NzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOSBGQTk3MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2QgRkM5N0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MyBGNERBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NSAwNzgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEZDODdGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92bSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZtLnM6IG1vdm0gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZtLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQ0UzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQ0VGOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQ0YzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgQ0ZGOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tdWxkaXYge30gewotICAgIHNldCB0ZXN0bmFtZSAibXVsZGl2LnM6IG11bGRpdiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm11bGRpdi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYyNUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYyNkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYyN0VcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fb3RoZXIge30gewotICAgIHNldCB0ZXN0bmFtZSAib3RoZXIuczogb3RoZXIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJvdGhlci5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgNDRcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiA0OVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIDUzXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgQ0MwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBEQ0ZGRkYwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIENEMDAwMTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArMDlcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRERGRkZGMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArMDAzMDIwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjBGMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRkFGRjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEZDRkZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTMgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgREYzMDA3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOSBERTMwMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIEYwRkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEYwRkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIENCXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzMgRjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2hpZnQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2hpZnQuczogc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaGlmdC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYyQjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4Q0EwNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjJBQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjhDNzA0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBGMjlFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGOEMyMDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIDU2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjI4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjI4MlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09OV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAic3ViLnM6IHN1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN1Yi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYxMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYxMkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYxMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYxM0VcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEZDQzZGRkZGIFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRkNENUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEYxODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTldIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fdWRmIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInVkZi5zOiB1ZGYgdGVzdHMgcGFydCAxIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAidWRmLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjYwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjYxMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjYyMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjYzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjY0MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRjY1MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjY2MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRjY3MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjY4MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjY5MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjZBMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjZCMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjZDMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjZEMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjZFMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRjZGMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjUwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRjUxMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjUyMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRjUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRjU0MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRjU1MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjU2MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmUgRjU3MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRjU4MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgRjU5MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRjVBMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRjVCMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRjVDMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2EgRjVEMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRjVFMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2UgRjVGMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRjkwMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MyBGOTExN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ2IEY5MjE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDkgRjkzMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBGOTQxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRmIEY5NTE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTIgRjk2MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NSBGOTcxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEY5ODE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWIgRjk5MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1ZSBGOUExN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYxIEY5QjE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRjlDMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NyBGOUQxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZhIEY5RTE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmQgRjlGMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGQjAxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRkIxMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEZCMjFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBGQjMxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRkI0MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEZCNTFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBGQjYxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRkI3MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEZCODFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBGQjkxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRkJBMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEZCQjFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBGQkMxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgRkJEMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEZCRTFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBGQkYxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgRkQwMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2NiArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNiBGRDExRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzY3ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIEZEMjFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNjggKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzIgRkQzMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2OSArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCBGRDQxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcwICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNlIEZENTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzEgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgRkQ2MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3MiArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYSBGRDcxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzczICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIEZEODFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzQgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTYgRkQ5MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3NSArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyBGREExRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzc2ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYyIEZEQjFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzcgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggRkRDMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3OCArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmZSBGREQxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzc5ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IEZERTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArODAgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGEgRkRGMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4MSArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCBGOTA1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEzIEY5MTU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTYgRjkyNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOSBGOTM1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIEY5NDU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWYgRjk1NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMiBGOTY1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI1IEY5NzU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggRjk4NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYiBGOTk1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJlIEY5QTU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzEgRjlCNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCBGOUM1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM3IEY5RDU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2EgRjlFNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzZCBGOUY1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQwIEZCMDUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCBGQjE1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDggRkIyNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTRjIEZCMzUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCBGQjQ1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTQgRkI1NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU4IEZCNjUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyBGQjc1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjAgRkI4NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY0IEZCOTUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCBGQkE1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNmMgRkJCNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTcwIEZCQzUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCBGQkQ1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzggRkJFNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTdjIEZCRjUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4MCBGRDA1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExNCArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg2IEZEMTUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTE1ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOGMgRkQyNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMTYgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MiBGRDM1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExNyArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IEZENDUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTE4ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOWUgRkQ1NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMTkgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhNCBGRDY1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyMCArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWFhIEZENzUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTIxICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjAgRkQ4NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjIgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNiBGRDk1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyMyArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIEZEQTUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTI0ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzIgRkRCNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjUgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjOCBGREM1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyNiArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWNlIEZERDUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTI3ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDQgRkRFNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjggKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkYSBGREY1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyOSArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19hbTMzXzEge30gewotICAgIHNldCB0ZXN0bmFtZSAiYW0zMy5zOiBhbTMzIHRlc3RzIHBhcnQgMSIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzMucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBDRDAwMDEzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMgKzA5XFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IENEMDAwMTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNCArMDlcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgQ0QwMDAxMzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs1ICswOVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBDRDAwMDFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzA5XFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IERERkZGRjAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArMDAzNDA5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWIgRERGRkZGMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMDMyMDlcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBEREZGRkYwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzkgKzAwMzEwOVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IERERkZGRjAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAwRkYwOVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIENFMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIENFMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IENFMzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IENFRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IENGMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNhIENGMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIENGMzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNlIENGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEY4Q0UzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDMgRjhDRTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NiBGOENFMzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ5IEY4Q0VGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgRjhDRjM0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0ZiBGOENGMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUyIEY4Q0YzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTUgRjhDRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBGMDIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YSBGMDI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBGMDJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1ZSBGMDJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBGMDMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MiBGMDM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBGMDNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NiBGMEU0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBGMkVDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YSBGMkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBGNTAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2ZSBGNTYzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGNTk1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MiBGNURGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBGNjMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NiBGNjY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBGNkMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YSBGNkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBGQ0ZDMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQ1ICswMjAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODIgRkNGREZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0NiArMDAwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTU0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2FtMzNfMiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhbTMzXzIuczogYW0zMyB0ZXN0cyBwYXJ0IDIiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhbTMzXzIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGOTA4MDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEY5MTgyMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjkyODM0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGOTM4NDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY5NDg2N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjk1ODc4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGOTY4OTlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEY5NzhBQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjk4OENEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYiBGOTk4RUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEY5QThGRVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjEgRjlCOEREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBGOUM4Q0NcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEY5RDhCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRjlFODAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyZCBGOUY4MTJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEY5MDkwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzMgRjkxOTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNiBGOTI5NDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM5IEY5Mzk2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRjk0OTc4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzZiBGOTU5OUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQyIEY5NjlCQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDUgRjk3OUREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBGOTg5RUVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRiIEY5OTlGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGUgRjlBOTEyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MSBGOUI5MzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEY5Qzk1NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTcgRjlEOTc4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YSBGOTBBMjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVkIEY5MUEzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgRjkyQTY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MyBGOTNBNzhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY2IEY5NEFBOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjkgRjk1QUJDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBGOTZBMjFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZmIEY5N0EzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzIgRjk4QTUwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NSBGOTlBNjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEY5QUE3MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2IgRjlCQTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3ZSBGOUNBOTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgxIEY5REFBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRjlFQTc2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NyBGOUZBODlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhhIEY5MEIxMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGQgRjkxQjM0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCBGOTJCNTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkzIEY5M0I3OFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTYgRjk0QjlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OSBGOTVCQkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEY5NkJERVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWYgRjk3QkZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMiBGOThCRENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE1IEY5OUJCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRjlBQjk4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYiBGOUJCNzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFlIEY5Q0I1NFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjEgRjlEQjMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCBGOUVCMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI3IEY5RkIxMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYW0zM18zIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFtMzNfMy5zOiBhbTMzIHRlc3RzIHBhcnQgMyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzNfMy5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZCMDgxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGQjE4MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRkI3ODExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEZCODgxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGQjk4MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRkJBODExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEZCRDgxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGQkY4MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRkIwOTExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEZCMTkxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBGQjI5MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRkI0OTExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEZCNTkxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBGQjY5MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRkJBOTExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEZCQjkxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBGQkU5MTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRkIwQTIxMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEZCMUEyMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBGQjJBMjExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRkIzQTIxMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEZCNEEyMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBGQjVBMjExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRkI4QTIwMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEZCOUEyMDEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBGQkFBMjAxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRkJCQTIwMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEZCQ0EyMDEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGQkRBMjAxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRkIwQjExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEZCMUIxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBGQjJCMTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRkIzQjExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEZCNEIxMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBGQjVCMTExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRkJCQjExMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEZCN0MxMjMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBGQjZBMjExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRkI3QTEyMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEZCRUEyMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBGQkZBMTIxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NDFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYW0zM180IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFtMzNfNC5zOiBhbTMzIHRlc3RzIHBhcnQgNCIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzNfNC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZEMDgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMyArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEZEMTgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEZENzgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEZEODgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEZEOTgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEZEQTgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEZERDgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEZERjgyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGRDA5MjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRkQxOTIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMiArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEZEMjkyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTMgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MiBGRDQ5MjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE0ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRkQ1OTIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRlIEZENjkyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTYgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBGREE5MjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE3ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWEgRkRCOTIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEZERTkyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTkgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NiBGRDBBMjFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIwICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgRkQxQTIxRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcyIEZEMkEyMUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjIgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBGRDNBMjFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzIzICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2UgRkQ0QTIxRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyNCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEZENUEyMUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjUgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YSBGRDhBMjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzI2ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgRkQ5QTIwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyNyArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk2IEZEQUEyMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjggK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyBGREJBMjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzI5ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTIgRkRDQTIwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszMCArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEZEREEyMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMzEgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhZSBGRDBCMjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMyICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgRkQxQjIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszMyArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJhIEZEMkIyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMzQgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCBGRDNCMjJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzM1ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzYgRkQ0QjIyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszNiArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEZENUIyMkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMzcgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMiBGRDBFMjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzM4ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggRkQxRTIwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszOSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRlIEZEMkUyMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNDAgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCBGRDNFMjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQxICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWEgRkQ0RTIwRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0MiArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEZENUUyMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNDMgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNiBGRDZBMjFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQ0ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgRkQ3QTEyRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0NSArRkUxRlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAyIEZERUEyMUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNDYgK0ZFMUZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCBGREZBMTJGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzQ3ICtGRTFGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09OTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYW0zM181IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFtMzNfNS5zOiBhbTMzIHRlc3RzIHBhcnQgNSIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzNfNS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZFMDgyMkZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRkUxODIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBGRTc4MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgK0ZERkU3RlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEZFODgyMkZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRkU5ODIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMyBGRUE4MjJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggK0ZERkU3RlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEZFRDgyMkZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzEgRkVGODIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRkUwOTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2YgRkUxOTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDYgRkUyOTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGQgRkU0OTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgRkU1OTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWIgRkU2OTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjIgRkVBOTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxNyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjkgRkVCOTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgRkVFOTIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzcgRkUwQTIxRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2UgRkUxQTIxRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODUgRkUyQTIxRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRkUzQTIxRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyMyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTMgRkU0QTIxRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyNCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWEgRkU1QTIxRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyNSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTEgRkU4QTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyNiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRkU5QTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyNyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWYgRkVBQTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyOCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjYgRkVCQTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsyOSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmQgRkVDQTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszMCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgRkVEQTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszMSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2IgRkUwQjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszMiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDIgRkUxQjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszMyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDkgRkUyQjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszNCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRkUzQjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszNSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTcgRkU0QjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszNiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWUgRkU1QjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszNyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjUgRkU2QjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszOCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgRkU3QjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszOSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDMgRkU4QjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0MCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGEgRkU5QjIyRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0MSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTEgRkUwRTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0MiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggRkUxRTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0MyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWYgRkUyRTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0NCArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjYgRkUzRTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0NSArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmQgRkU0RTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0NiArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgRkU1RTIwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0NyArRkRGRTdGXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2IgRkJBRENEODlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNmIEZCQkRDRDg5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MyBGRTZBMjFGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUwICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YSBGRTdBMTJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUxICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MSBGRUVBMjFGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUyICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCBGRUZBMTJGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUzICtGREZFN0ZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMDBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYW0zM182IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFtMzNfNi5zOiBhbTMzIHRlc3RzIHBhcnQgNiIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzNfNi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY3MDA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNzEwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjcyMDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY3MzA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNzQwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjc1MDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY3NjA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNzcwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjc4MDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY3OTA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBGN0EwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjdCMDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEY3QzA0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBGN0QwNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRjcwMTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEY3MTE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBGNzIxNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRjczMTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEY3NjE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBGNzcxNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRjc4MTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEY3OTE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBGN0ExNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRjdCMTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEY3QzE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBGN0QxNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRjcwMjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEY3MTI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGNzIyNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRjczMjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEY3NDI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBGNzUyNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRjc2MjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEY3NzI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBGNzgyNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRjc5MjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEY3QTI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBGN0IyNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRjdDMjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEY3RDI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBGNzAzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgRjcxMzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEY3MjM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBGNzMzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgRjc0MzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEY3NTM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCBGNzYzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgRjc3MzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEY3ODM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCBGNzkzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggRjdBMzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEY3QjM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCBGN0MzNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgRjdEMzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IEY3MDQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyBGNzE0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRjcyNDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEY3MzQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCBGNzQ0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgRjc1NDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEY3NjQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCBGNzc0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggRjc4NDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIEY3OTQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCBGN0E0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgRjdCNDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IEY3QzQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyBGN0Q0NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYW0zM183IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFtMzNfNy5zOiBhbTMzIHRlc3RzIHBhcnQgNyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzNfNy5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY3MDU0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNzE1NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjcyNTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY3MzU0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNzY1NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjc3NTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY3ODU0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNzk1NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjdBNTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY3QjU0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBGN0M1NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjdENTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEY3MDY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBGNzE2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRjcyNjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEY3MzY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBGNzQ2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRjc1NjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEY3NjY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBGNzc2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRjc4NjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEY3OTY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBGN0E2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRjdCNjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEY3QzY0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBGN0Q2NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRjcwNzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEY3MTc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGNzI3NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRjczNzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEY3NDc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBGNzU3NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRjc2NzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEY3Nzc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBGNzg3NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRjc5NzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEY3QTc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBGN0I3NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRjdDNzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEY3RDc0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBGNzA4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgRjcxODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEY3Mjg0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBGNzM4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgRjc0ODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEY3NTg0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCBGNzY4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgRjc3ODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEY3ODg0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCBGNzk4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggRjdBODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEY3Qjg0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCBGN0M4NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgRjdEODQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IEY3MDk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyBGNzE5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRjcyOTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEY3Mzk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCBGNzQ5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgRjc1OTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEY3Njk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCBGNzc5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggRjc4OTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIEY3OTk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCBGN0E5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgRjdCOTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IEY3Qzk0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyBGN0Q5NDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NjhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYW0zM184IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFtMzNfOC5zOiBhbTMzIHRlc3RzIHBhcnQgOCIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFtMzNfOC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY3MEE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNzFBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjcyQTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY3M0E0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNzRBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjc1QTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY3NkE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNzdBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjc4QTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY3OUE0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBGN0FBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjdCQTQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEY3Q0E0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBGN0RBNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRjcwQjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEY3MUI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBGNzJCNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRjczQjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEY3NEI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBGNzVCNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRjc2QjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEY3N0I0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBGNzhCNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgRjc5QjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEY3QUI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBGN0JCNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggRjdDQjQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEY3REI0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGNzBDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRjcxQzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEY3MkM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBGNzNDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRjc0QzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEY3NUM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBGNzZDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRjc3QzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEY3OEM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBGNzlDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRjdBQzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEY3QkM0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBGN0NDNDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgRjdEQzQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEY3MEQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBGNzFENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgRjcyRDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEY3M0Q0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCBGNzRENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgRjc1RDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEY3NkQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCBGNzdENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggRjc4RDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEY3OUQ0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCBGN0FENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgRjdCRDQxMjNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IEY3Q0Q0MTIzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyBGN0RENDEyM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRjdFMDIxNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEY3RTAyMTQxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCBGN0UwMjE0MlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgRjdFMDIxNDNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEY3RTAyMTQ0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCBGN0UwMjE0NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggRjdFMDIxNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIEY3RTAyMTQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCBGN0UwMjE0OFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgRjdFMDIxNDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IEY3RTAyMTRBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02N10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotCi1pZiBbaXN0YXJnZXQgbW4xMDMwMCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19hZGQKLSAgICBkb19iY2MKLSAgICBkb19iaXQKLSAgICBkb19jbXAKLSAgICBkb19leHQKLSAgICBkb19leHRlbmQKLSAgICBkb19sb2dpY2FsCi0gICAgZG9fbG9vcAotICAgIGRvX21vdjEKLSAgICBkb19tb3YyCi0gICAgZG9fbW92MwotICAgIGRvX21vdjQKLSAgICBkb19tb3ZidQotICAgIGRvX21vdmh1Ci0gICAgZG9fbW92bQotICAgIGRvX211bGRpdgotICAgIGRvX290aGVyCi0gICAgZG9fc2hpZnQKLSAgICBkb19zdWIKLSAgICBkb191ZGYKLSAgICBkb19hbTMzXzEKLSAgICBkb19hbTMzXzIKLSAgICBkb19hbTMzXzMKLSAgICBkb19hbTMzXzQKLSAgICBkb19hbTMzXzUKLSAgICBkb19hbTMzXzYKLSAgICBkb19hbTMzXzcKLSAgICBkb19hbTMzXzgKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmNjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JjYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjkyZGNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0JLnRleHQKLWZvbzoKLQliZXEgZm9vCi0JYm5lIGZvbwotCWJndCBmb28KLQliZ2UgZm9vCi0JYmxlIGZvbwotCWJsdCBmb28KLQliaGkgZm9vCi0JYmNjIGZvbwotCWJscyBmb28JCi0JYmNzIGZvbwotCWJ2YyBmb28KLQlidnMgZm9vCi0JYm5jIGZvbwotCWJucyBmb28KLQlicmEgZm9vCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JpdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjNTUxOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JpdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS50ZXh0Ci0JYnRzdCA2NCxkMQotCWJ0c3QgODE5MixkMgotCWJ0c3QgMTMxMDcxLGQzCi0JYnRzdCA2NCwoOCxhMSkKLQlidHN0IDY0LCgxMzEwNzEpCi0JYnNldCBkMSwoYTIpCi0JYnNldCA2NCwoOCxhMSkKLQlic2V0IDY0LCgxMzEwNzEpCi0JYmNsciBkMSwoYTIpCi0JYmNsciA2NCwoOCxhMSkKLQliY2xyIDY0LCgxMzEwNzEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2NtcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9jbXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4YTcxZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2NtcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS50ZXh0Ci0JY21wIGQxLGQyCi0JY21wIGQyLGEzCi0JY21wIGEzLGQzCi0JY21wIGEzLGEyCi0JY21wIDE2LGQzCi0JY21wIDI1NixkMgotCWNtcCAxMzEwNzEsZDEKLQljbXAgMTYsYTMKLQljbXAgMjU2LGEyCi0JY21wIDEzMTA3MSxhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvZXh0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTJlNzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHQucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS50ZXh0Ci0JZXh0IGQxCi0JZXh0YiBkMgotCWV4dGJ1IGQzCi0JZXh0aCBkMgotCWV4dGh1IGQxCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2V4dGVuZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHRlbmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0MDViNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2V4dGVuZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci0JcHV0eCBkMQotCWdldHggZDIKLQltdWxxIGQxLGQyCi0JbXVscSAxNixkMgotCW11bHEgMjU2LGQzCi0JbXVscSAxMzEwNzEsZDMKLQltdWxxdSBkMSxkMgotCW11bHF1IDE2LGQyCi0JbXVscXUgMjU2LGQzCi0JbXVscXUgMTMxMDcxLGQzCi0Jc2F0MTYgZDIsZDMKLQlzYXQyNCBkMyxkMgotCWJzY2ggZDEsZDIKLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9naWNhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb2dpY2FsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTc2ZGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb2dpY2FsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLnRleHQKLQlhbmQgZDEsZDIKLQlhbmQgMTI3LGQyCi0JYW5kIDMyNzY3LGQzCi0JYW5kIDEzMTA3MSxkMwotCWFuZCAzMjc2Nyxwc3cKLQlvciBkMSxkMgotCW9yIDEyNyxkMgotCW9yIDMyNzY3LGQzCi0Jb3IgMTMxMDcxLGQzCi0Jb3IgMzI3NjcscHN3Ci0JeG9yIGQxLGQyCi0JeG9yIDMyNzY3LGQzCi0JeG9yIDEzMTA3MSxkMwotCW5vdCBkMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb29wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2xvb3AucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxODIwNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2xvb3AucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotZm9vOgotCWxlcQotCWxuZQotCWxndAotCWxnZQotCWxsZQotCWxsdAotCWxoaQotCWxjYwotCWxscwkKLQlsY3MKLQlscmEKLQlzZXRsYgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92MS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDRjYzU1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92MS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCS50ZXh0Ci0JbW92IGQxLGQyCi0JbW92IGQxLGEyCi0JbW92IGEyLGQxCi0JbW92IGEyLGExCi0JbW92IHNwLGEyCi0JbW92IGExLHNwCi0JbW92IGQyLHBzdwotCW1vdiBtZHIsZDEKLQltb3YgZDIsbWRyCi0JbW92IChhMiksZDEKLQltb3YgKDgsYTIpLGQxCi0JbW92ICgyNTYsYTIpLGQxCi0JbW92ICgxMzEwNzEsYTIpLGQxCi0JbW92ICg4LHNwKSxkMQotCW1vdiAoMjU2LHNwKSxkMQotCW1vdiBwc3csZDMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZDFlZGM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92Mi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCS50ZXh0Ci0gICAgICAgIG1vdiAoMTMxMDcxLHNwKSxkMQotCW1vdiAoZDEsYTEpLGQyCi0JbW92ICgzMjc2OCksZDEKLQltb3YgKDEzMTA3MSksZDEKLQltb3YgKGEyKSxhMQotCW1vdiAoOCxhMiksYTEKLQltb3YgKDI1NixhMiksYTEKLQltb3YgKDEzMTA3MSxhMiksYTEKLQltb3YgKDgsc3ApLGExCi0JbW92ICgyNTYsc3ApLGExCi0JbW92ICgxMzEwNzEsc3ApLGExCi0JbW92IChkMSxhMSksYTIKLSAgICAgICAgbW92ICgzMjc2OCksYTEKLSAgICAgICAgbW92ICgxMzEwNzEpLGExCi0gICAgICAgIG1vdiAoMzIsYTEpLHNwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92My5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVjMGI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92My5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCS50ZXh0Ci0gICAgICAgIG1vdiBkMSwoYTIpCi0gICAgICAgIG1vdiBkMSwoMzIsYTIpCi0JbW92IGQxLCgyNTYsYTIpCi0JbW92IGQxLCgxMzEwNzEsYTIpCi0JbW92IGQxLCgzMixzcCkKLQltb3YgZDEsKDMyNzY4LHNwKQotCW1vdiBkMSwoMTMxMDcxLHNwKQotCW1vdiBkMSwoZDIsYTIpCi0JbW92IGQxLCgxMjgpCi0JbW92IGQxLCgxMzEwNzEpCi0JbW92IGExLChhMikKLQltb3YgYTEsKDMyLGEyKQotCW1vdiBhMSwoMjU2LGEyKQotCW1vdiBhMSwoMTMxMDcxLGEyKQotCW1vdiBhMSwoMzIsc3ApCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92NC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWQ2OWMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92NC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci0JbW92IGExLCgzMjc2OCxzcCkKLQltb3YgYTEsKDEzMTA3MSxzcCkKLQltb3YgYTEsKGQyLGEyKQotCW1vdiBhMSwoMTI4KQotCW1vdiBhMSwoMTMxMDcxKQotCW1vdiBzcCwoMzIsYTEpCi0JbW92IDgsZDEKLQltb3YgMjU2LGQxCi0JbW92IDEzMTA3MSxkMQotCW1vdiA4LGExCi0JbW92IDI1NixhMQotCW1vdiAxMzEwNzEsYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92YnUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92YnUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkYjdiZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmJ1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0JLnRleHQKLQltb3ZidSAoYTIpLGQxCi0JbW92YnUgKDgsYTIpLGQxCi0JbW92YnUgKDI1NixhMiksZDEKLQltb3ZidSAoMTMxMDcxLGEyKSxkMQotCW1vdmJ1ICg4LHNwKSxkMQotCW1vdmJ1ICgyNTYsc3ApLGQxCi0JbW92YnUgKDEzMTA3MSxzcCksZDEKLQltb3ZidSAoZDEsYTEpLGQyCi0JbW92YnUgKDMyNzY4KSxkMQotCW1vdmJ1ICgxMzEwNzEpLGQxCi0JbW92YnUgZDEsKGEyKQotCW1vdmJ1IGQxLCgzMixhMikKLQltb3ZidSBkMSwoMjU2LGEyKQotCW1vdmJ1IGQxLCgxMzEwNzEsYTIpCi0JbW92YnUgZDEsKDMyLHNwKQotCW1vdmJ1IGQxLCgzMjc2OCxzcCkKLQltb3ZidSBkMSwoMTMxMDcxLHNwKQotCW1vdmJ1IGQxLChkMixhMikKLQltb3ZidSBkMSwoMTI4KQotCW1vdmJ1IGQxLCgxMzEwNzEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmh1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmh1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MzdlODAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZodS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotCS50ZXh0Ci0JbW92aHUgKGEyKSxkMQotCW1vdmh1ICg4LGEyKSxkMQotCW1vdmh1ICgyNTYsYTIpLGQxCi0JbW92aHUgKDEzMTA3MSxhMiksZDEKLQltb3ZodSAoOCxzcCksZDEKLQltb3ZodSAoMjU2LHNwKSxkMQotCW1vdmh1ICgxMzEwNzEsc3ApLGQxCi0JbW92aHUgKGQxLGExKSxkMgotCW1vdmh1ICgzMjc2OCksZDEKLQltb3ZodSAoMTMxMDcxKSxkMQotCW1vdmh1IGQxLChhMikKLQltb3ZodSBkMSwoMzIsYTIpCi0JbW92aHUgZDEsKDI1NixhMikKLQltb3ZodSBkMSwoMTMxMDcxLGEyKQotCW1vdmh1IGQxLCgzMixzcCkKLQltb3ZodSBkMSwoMzI3Njgsc3ApCi0JbW92aHUgZDEsKDEzMTA3MSxzcCkKLQltb3ZodSBkMSwoZDIsYTIpCi0JbW92aHUgZDEsKDEyOCkKLQltb3ZodSBkMSwoMTMxMDcxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdm0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmYzY4My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdm0ucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci0JbW92bSAoc3ApLFthMixhM10KLQltb3ZtIChzcCksW2QyLGQzLGEyLGEzLG90aGVyXQotCW1vdm0gW2EyLGEzXSwoc3ApCi0JbW92bSBbZDIsZDMsYTIsYTMsb3RoZXJdLChzcCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbXVsZGl2LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL211bGRpdi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjExZTVkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbXVsZGl2LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotCW11bCBkMSxkMgotCW11bHUgZDIsZDMKLQlkaXYgZDMsZDMKLQlkaXZ1IGQzLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL290aGVyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL290aGVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYWY3NGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9vdGhlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCS50ZXh0Ci0JY2xyIGQyCi0JaW5jIGQxCi0JaW5jIGEyCi0JaW5jNCBhMwotCWptcCAoYTIpCi0Jam1wIDI1NgotCWptcCAxMzEwNzEKLQljYWxsIDI1NixbYTIsYTNdLDkKLQljYWxsIDEzMTA3MSxbYTIsYTNdLDMyCi0JY2FsbHMgKGEyKQotCWNhbGxzIDI1NgotCWNhbGxzIDEzMTA3MQotCXJldCBbYTIsYTNdLDcKLQlyZXRmIFthMixhM10sNQotCXJldHMKLQlydGkKLQl0cmFwCi0Jbm9wCi0JcnRtCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3NoaWZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3NoaWZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGM5Y2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zaGlmdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci0JYXNyIGQxLGQyCi0JYXNyIDQsZDIKLQlsc3IgZDIsZDMKLQlsc3IgNCxkMwotCWFzbCBkMyxkMgotCWFzbCA0LGQyCi0JYXNsMiBkMgotCXJvciBkMQotCXJvbCBkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zdWIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvc3ViLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZGM2NjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zdWIucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS50ZXh0Ci0Jc3ViIGQxLGQyCi0Jc3ViIGQyLGEzCi0Jc3ViIGEzLGQzCi0Jc3ViIGEzLGEyCi0Jc3ViIDEzMTA3MSxkMgotCXN1YiAxMzEwNzEsYTEKLQlzdWJjIGQxLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3VkZi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC91ZGYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjYmQxMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3VkZi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLQkudGV4dAotCXVkZjAwIGQwLGQxCi0JdWRmMDEgZDAsZDEKLQl1ZGYwMiBkMCxkMQotCXVkZjAzIGQwLGQxCi0JdWRmMDQgZDAsZDEKLQl1ZGYwNSBkMCxkMQotCXVkZjA2IGQwLGQxCi0JdWRmMDcgZDAsZDEKLQl1ZGYwOCBkMCxkMQotCXVkZjA5IGQwLGQxCi0JdWRmMTAgZDAsZDEKLQl1ZGYxMSBkMCxkMQotCXVkZjEyIGQwLGQxCi0JdWRmMTMgZDAsZDEKLQl1ZGYxNCBkMCxkMQotCXVkZjE1IGQwLGQxCi0JdWRmMjAgZDAsZDEKLQl1ZGYyMSBkMCxkMQotCXVkZjIyIGQwLGQxCi0JdWRmMjMgZDAsZDEKLQl1ZGYyNCBkMCxkMQotCXVkZjI1IGQwLGQxCi0JdWRmMjYgZDAsZDEKLQl1ZGYyNyBkMCxkMQotCXVkZjI4IGQwLGQxCi0JdWRmMjkgZDAsZDEKLQl1ZGYzMCBkMCxkMQotCXVkZjMxIGQwLGQxCi0JdWRmMzIgZDAsZDEKLQl1ZGYzMyBkMCxkMQotCXVkZjM0IGQwLGQxCi0JdWRmMzUgZDAsZDEKLQl1ZGYwMCAxMjcsZDEKLQl1ZGYwMSAxMjcsZDEKLQl1ZGYwMiAxMjcsZDEKLQl1ZGYwMyAxMjcsZDEKLQl1ZGYwNCAxMjcsZDEKLQl1ZGYwNSAxMjcsZDEKLQl1ZGYwNiAxMjcsZDEKLQl1ZGYwNyAxMjcsZDEKLQl1ZGYwOCAxMjcsZDEKLQl1ZGYwOSAxMjcsZDEKLQl1ZGYxMCAxMjcsZDEKLQl1ZGYxMSAxMjcsZDEKLQl1ZGYxMiAxMjcsZDEKLQl1ZGYxMyAxMjcsZDEKLQl1ZGYxNCAxMjcsZDEKLQl1ZGYxNSAxMjcsZDEKLQl1ZGYwMCAzMjc2NyxkMQotCXVkZjAxIDMyNzY3LGQxCi0JdWRmMDIgMzI3NjcsZDEKLQl1ZGYwMyAzMjc2NyxkMQotCXVkZjA0IDMyNzY3LGQxCi0JdWRmMDUgMzI3NjcsZDEKLQl1ZGYwNiAzMjc2NyxkMQotCXVkZjA3IDMyNzY3LGQxCi0JdWRmMDggMzI3NjcsZDEKLQl1ZGYwOSAzMjc2NyxkMQotCXVkZjEwIDMyNzY3LGQxCi0JdWRmMTEgMzI3NjcsZDEKLQl1ZGYxMiAzMjc2NyxkMQotCXVkZjEzIDMyNzY3LGQxCi0JdWRmMTQgMzI3NjcsZDEKLQl1ZGYxNSAzMjc2NyxkMQotCXVkZjAwIDY1NTM1LGQxCi0JdWRmMDEgNjU1MzUsZDEKLQl1ZGYwMiA2NTUzNSxkMQotCXVkZjAzIDY1NTM1LGQxCi0JdWRmMDQgNjU1MzUsZDEKLQl1ZGYwNSA2NTUzNSxkMQotCXVkZjA2IDY1NTM1LGQxCi0JdWRmMDcgNjU1MzUsZDEKLQl1ZGYwOCA2NTUzNSxkMQotCXVkZjA5IDY1NTM1LGQxCi0JdWRmMTAgNjU1MzUsZDEKLQl1ZGYxMSA2NTUzNSxkMQotCXVkZjEyIDY1NTM1LGQxCi0JdWRmMTMgNjU1MzUsZDEKLQl1ZGYxNCA2NTUzNSxkMQotCXVkZjE1IDY1NTM1LGQxCi0JdWRmdTAwIDEyOCxkMQotCXVkZnUwMSAxMjgsZDEKLQl1ZGZ1MDIgMTI4LGQxCi0JdWRmdTAzIDEyOCxkMQotCXVkZnUwNCAxMjgsZDEKLQl1ZGZ1MDUgMTI4LGQxCi0JdWRmdTA2IDEyOCxkMQotCXVkZnUwNyAxMjgsZDEKLQl1ZGZ1MDggMTI4LGQxCi0JdWRmdTA5IDEyOCxkMQotCXVkZnUxMCAxMjgsZDEKLQl1ZGZ1MTEgMTI4LGQxCi0JdWRmdTEyIDEyOCxkMQotCXVkZnUxMyAxMjgsZDEKLQl1ZGZ1MTQgMTI4LGQxCi0JdWRmdTE1IDEyOCxkMQotCXVkZnUwMCAzMjc2OCxkMQotCXVkZnUwMSAzMjc2OCxkMQotCXVkZnUwMiAzMjc2OCxkMQotCXVkZnUwMyAzMjc2OCxkMQotCXVkZnUwNCAzMjc2OCxkMQotCXVkZnUwNSAzMjc2OCxkMQotCXVkZnUwNiAzMjc2OCxkMQotCXVkZnUwNyAzMjc2OCxkMQotCXVkZnUwOCAzMjc2OCxkMQotCXVkZnUwOSAzMjc2OCxkMQotCXVkZnUxMCAzMjc2OCxkMQotCXVkZnUxMSAzMjc2OCxkMQotCXVkZnUxMiAzMjc2OCxkMQotCXVkZnUxMyAzMjc2OCxkMQotCXVkZnUxNCAzMjc2OCxkMQotCXVkZnUxNSAzMjc2OCxkMQotCXVkZnUwMCA2NTUzNixkMQotCXVkZnUwMSA2NTUzNixkMQotCXVkZnUwMiA2NTUzNixkMQotCXVkZnUwMyA2NTUzNixkMQotCXVkZnUwNCA2NTUzNixkMQotCXVkZnUwNSA2NTUzNixkMQotCXVkZnUwNiA2NTUzNixkMQotCXVkZnUwNyA2NTUzNixkMQotCXVkZnUwOCA2NTUzNixkMQotCXVkZnUwOSA2NTUzNixkMQotCXVkZnUxMCA2NTUzNixkMQotCXVkZnUxMSA2NTUzNixkMQotCXVkZnUxMiA2NTUzNixkMQotCXVkZnUxMyA2NTUzNixkMQotCXVkZnUxNCA2NTUzNixkMQotCXVkZnUxNSA2NTUzNixkMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NoYXIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNWY0YjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NoYXIuZAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotI29iamNvcHk6IC1PIHNyZWMKLSNuYW1lOiBNUkkgY2hhcmFjdGVyIGNvbnN0YW50cwotI2FzOiAtTQotCi0jIFRlc3QgTVJJIGNoYXJhY3RlciBjb25zdGFudHMKLQotUzAuKgotUzExMy4uLi4oNjE2MTYyNjM2MTYyNjM2NDY1MDAwMDAwNjEyNzYyMDApfCg2MTYxNjI2MzY0NjM2MjYxMDAwMDAwNjUwMDYyMjc2MSkuKgotI3Bhc3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjBhODNhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTsgVGVzdCBNUkkgc3R5bGUgY2hhcmFjdGVyIGNvbnN0YW50cy4KLQotCWRjLmIJJ2EnCi0JZGMuYgknYWJjJwotCWRjLmwJJ2FiY2RlJwotCWRjLmwJJ2EnJ2InCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0MzRkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5kCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBNUkkgY29tbWVudHMKLSNhczogLU0KLQotIyBUZXN0IE1SSSBjb21tZW50cwotCi0wKzAyIEEgUkFNCi0wKzAxIEEgUk9NCi0gKiBVIGxhYmVsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3MzE4Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCXhyZWYgbGFiZWwKLQl4ZGVmCVJPTSxSQU0KLQkqIHRoaXMgaXMgYSBjb21tZW50Ci0KLQlkYy5sCWxhYmVsCWxvb3AgaWYgd2UgaGF2ZW4ndCByZWFjaCBlbmQgeWV0Ci0JCi1ST00JCQkJRVFVCSQwMDAwMDAwMQkqIHdvcmQgd2lkZQotUkFNCQkJCUVRVQkkMDAwMDAwMDIJd29yZCB3aWRlCi0JZGMubAlSQU0KLQlkYy5sCTAJLHJlYWxseSxhLGNvbW1lbnQKLTsgYSBjb21tZW50Ci0gOyBhbm90aGVyIGNvbW1lbnQKLSAgOyBhbm90aGVyIGNvbW1lbnQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjMTUzMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBjb21tb24gc2VjdGlvbnMKLSNhczogLU0KLQotIyBUZXN0IE1SSSBjb21tb24gc2VjdGlvbnMKLQotMCswOCBDIDAwY29tMgotMCswOCBDIGNvbTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczNWM2Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi07IFRlc3QgTVJJIGNvbW1vbiBzZWN0aW9ucwotCWNvbW1vbgljb20xCi0JZHMubAkxCi1jb20yCWNvbW1vbiAwMAotCWRzLmwJMQotaW5jb20JZHMubAkxCi0JY29tbW9uCWNvbTEKLQlkcy5sCTEKLQlkYXRhCi0JZGMubAljb20xCi0JZGMubAlpbmNvbQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjEwMDIyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBjb25zdGFudHMKLSNhczogLU0KLQotIyBUZXN0IE1SSSBzdHlsZSBjb25zdGFudHMKLQotMCowIFQgZm9vCi0wKmEgQSBzMDEKLTAqYSBBIHMwMgotMCphIEEgczAzCi0wKmEgQSBzMDQKLTAqYSBBIHMwNQotMCphIEEgczA2Ci0wKmEgQSBzMDcKLTAqYSBBIHMwOAotMCphIEEgczA5Ci0wKjYxIEEgczEwCi0wKjYxIEEgczExCi0wKjYxNjI2MzY0IEEgczEyCi0wKjYxMjc2MjAwIEEgczEzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29uc3RhbnRzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29uc3RhbnRzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMzRlNjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotCXhkZWYJczAxLHMwMixzMDMsczA0LHMwNSxzMDYsczA3LHMwOCxzMDksczEwLHMxMSxzMTIsczEzCi1zMDEJZXF1CSUxMDEwCi1zMDIJZXF1CTEwMTBiCi1zMDMJZXF1CUAxMgotczA0CWVxdQkxMm8KLXMwNQllcXUJMTJxCi1zMDYJZXF1CTEwCi1zMDcJZXF1CTEwZAotczA4CWVxdQkkYQotczA5CWVxdQkwYWgKLXMxMAllcXUJJ2EnCi1zMTEJZXF1CUEnYScKLXMxMgllcXUJJ2FiY2QnCi1zMTMJZXF1CSdhJydiJwotCi0JeGRlZglmb28KLWZvbwotCW1vdmVxLmwJIyUxMDEwLGQwCi0JbW92ZXEubAkjMTAxMGIsZDAKLQltb3ZlcS5sCSNAMTIsZDAKLQltb3ZlcS5sCSMxMm8sZDAKLQltb3ZlcS5sCSMxMnEsZDAKLQltb3ZlcS5sCSMxMCxkMAotCW1vdmVxLmwJIzEwZCxkMAotCW1vdmVxLmwJIyRhLGQwCi0JbW92ZXEubAkjMGFoLGQwCi0JbW92ZXEubAkjJ2EnLGQwCi0JbW92ZXEubAkjQSdhJyxkMAotCW5vcAotCi0JZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZW1wdHkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lbXB0eS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGMyY2RkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lbXB0eS5zCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TQlQJTUFDUk8JCTsgZW1wdHkgbWFjcm8KLQlFTkRNCi0KLQlTQlQJYXJnMSAKLSAgICAgICAgU0JUICAgICBhcmcyIC0gb25lIHR3dwotICAgICAgICBTQlQgICAgIGFyZzMgLSBvbmUgdHdvIHRocmVlCi0gICAgICAgIFNCVCAgICAgYXJnNCAtIG9uZSB0d28gdGhyZWUgZm91cgotICAgICAgICBTQlQgICAgIGFyZzUgLSBvbmUgdHdvIHRocmVlIGZvdXIgZml2ZQotICAgICAgICBTQlQgICAgIGFyZzYgLSBvbmUgdHdvICh0aHJlZSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmOWE4Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LmQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBFUVUKLSNhczogLU0KLQotIyBUZXN0IHRoZSBNUkkgRVFVIGRpcmVjdGl2ZQotCi0wKjQgQSBTWU1CT0wKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY1MTJhMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgVGVzdCB0aGUgTVJJIEVRVSBkaXJlY3RpdmUKLQlYREVGCVNZTUJPTAotU1lNQk9MCUVRVQk0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkZWU0ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5kCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogTVJJIGV4cHJlc3Npb25zCi0jYXM6IC1NCi0KLSMgVGVzdCBleHByZXNzaW9ucyBpbiBNUkkgbW9kZQotCi0wMCogQSBzMQotMDAqMTIgQSBzMgotMDAqNiBBIHMzCi0oMDAwMDAwMDApP2ZmKiBBIHM0Ci0wMCogQSBzNQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9leHByLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Njc3YzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotOyBUZXN0IGV4cHJlc3Npb25zIGluIE1SSSBtb2RlCi0JeGRlZglzMSxzMixzMyxzNCxzNQotczEJZXF1CTE+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+IGRvCi0JZW5kdwotCi0JY2xyIGQxCi0Jd2hpbGUgZDEgPGxlPiAjMTAgZG8KLQkgIGFkZCAjMSxkMQotCWVuZHcKLQotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcGovb3BzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9wai9vcHMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2MTk3MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wai9vcHMuZAorKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogcGoKLSNhcwotCi0jIHRlc3QgYWxsIHRoZSBpbnN0cnVjdGlvbnMKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1wagotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8Zm9vMC0weDE+OgotCS4uLgotCi0wMDAwMDAwMSA8Zm9vMD46Ci0JLi4uCi0KLTAwMDAwMDAyIDxmb28xPjoKLQkuLi4KLQotMDAwMDAwMDMgPGZvbzI+OgotCS4uLgotCi0wMDAwMDAwNCA8Zm9vMz46Ci0JLi4uCi0KLTAwMDAwMDA1IDxmb280PjoKLQkuLi4KLQotMDAwMDAwMDYgPGZvbzU+OgotCS4uLgotCi0wMDAwMDAwNyA8Zm9vNj46Ci0JLi4uCi0KLTAwMDAwMDA4IDxmb283PjoKLQkuLi4KLQotMDAwMDAwMDkgPGZvbzg+OgotCS4uLgotCi0wMDAwMDAwYSA8Zm9vOT46Ci0JLi4uCi0KLTAwMDAwMDBiIDxmb28xMD46Ci0JLi4uCi0KLTAwMDAwMDBjIDxmb28xMT46Ci0JLi4uCi0KLTAwMDAwMDBkIDxmb28xMj46Ci0JLi4uCi0KLTAwMDAwMDBlIDxmb28xMz46Ci0JLi4uCi0KLTAwMDAwMDBmIDxmb28xND46Ci0JLi4uCi0KLTAwMDAwMDEwIDxmb28xNT46Ci0JLi4uCi0KLTAwMDAwMDExIDxmb28xNj46Ci0JLi4uCi0KLTAwMDAwMDEyIDxmb28xNz46Ci0JLi4uCi0KLTAwMDAwMDEzIDxmb28xOD46Ci0JLi4uCi0KLTAwMDAwMDE0IDxmb28xOT46Ci0gIDE0OgkwMCAgICAgICAgICAJbm9wCi0gIDE1OgkwMSAgICAgICAgICAJYWNvbnN0X251bGwKLSAgMTY6CTAyICAgICAgICAgIAlpY29uc3RfbTEKLSAgMTc6CTAzICAgICAgICAgIAlpY29uc3RfMAotICAxODoJMDQgICAgICAgICAgCWljb25zdF8xCi0gIDE5OgkwNSAgICAgICAgICAJaWNvbnN0XzIKLSAgMWE6CTA2ICAgICAgICAgIAlpY29uc3RfMwotICAxYjoJMDcgICAgICAgICAgCWljb25zdF80Ci0gIDFjOgkwOCAgICAgICAgICAJaWNvbnN0XzUKLSAgMWQ6CTA5ICAgICAgICAgIAlsY29uc3RfMAotICAxZToJMGEgICAgICAgICAgCWxjb25zdF8xCi0gIDFmOgkwYiAgICAgICAgICAJZmNvbnN0XzAKLSAgMjA6CTBjICAgICAgICAgIAlmY29uc3RfMQotICAyMToJMGQgICAgICAgICAgCWZjb25zdF8yCi0gIDIyOgkwZSAgICAgICAgICAJZGNvbnN0XzAKLSAgMjM6CTBmICAgICAgICAgIAlkY29uc3RfMQotICAyNDoJMTAgZTcgICAgICAgCWJpcHVzaAktMjUKLSAgMjY6CTExIGEzIGM2ICAgIAlzaXB1c2gJLTIzNjEwCi0gIDI5OgkxMiAwMCAgICAgICAJbGRjCi0gIDJiOgkxMyAwMCAwMCAgICAJbGRjX3cKLSAgMmU6CTE0IDAwIDAwICAgIAlsZGMyX3cKLSAgMzE6CTE1IDY5ICAgICAgIAlpbG9hZAkxMDUKLSAgMzM6CTE2IDczICAgICAgIAlsbG9hZAkxMTUKLSAgMzU6CTE3IDUxICAgICAgIAlmbG9hZAk4MQotICAzNzoJMTggZmYgICAgICAgCWRsb2FkCTI1NQotICAzOToJMTkgNGEgICAgICAgCWFsb2FkCTc0Ci0gIDNiOgkxYSAgICAgICAgICAJaWxvYWRfMAotICAzYzoJMWIgICAgICAgICAgCWlsb2FkXzEKLSAgM2Q6CTFjICAgICAgICAgIAlpbG9hZF8yCi0gIDNlOgkxZCAgICAgICAgICAJaWxvYWRfMwotICAzZjoJMWUgICAgICAgICAgCWxsb2FkXzAKLSAgNDA6CTFmICAgICAgICAgIAlsbG9hZF8xCi0gIDQxOgkyMCAgICAgICAgICAJbGxvYWRfMgotICA0MjoJMjEgICAgICAgICAgCWxsb2FkXzMKLSAgNDM6CTIyICAgICAgICAgIAlmbG9hZF8wCi0gIDQ0OgkyMyAgICAgICAgICAJZmxvYWRfMQotICA0NToJMjQgICAgICAgICAgCWZsb2FkXzIKLSAgNDY6CTI1ICAgICAgICAgIAlmbG9hZF8zCi0gIDQ3OgkyNiAgICAgICAgICAJZGxvYWRfMAotICA0ODoJMjcgICAgICAgICAgCWRsb2FkXzEKLSAgNDk6CTI4ICAgICAgICAgIAlkbG9hZF8yCi0gIDRhOgkyOSAgICAgICAgICAJZGxvYWRfMwotICA0YjoJMmEgICAgICAgICAgCWFsb2FkXzAKLSAgNGM6CTJiICAgICAgICAgIAlhbG9hZF8xCi0gIDRkOgkyYyAgICAgICAgICAJYWxvYWRfMgotICA0ZToJMmQgICAgICAgICAgCWFsb2FkXzMKLSAgNGY6CTJlICAgICAgICAgIAlpYWxvYWQKLSAgNTA6CTJmICAgICAgICAgIAlsYWxvYWQKLSAgNTE6CTMwICAgICAgICAgIAlmYWxvYWQKLSAgNTI6CTMxICAgICAgICAgIAlkYWxvYWQKLSAgNTM6CTMyICAgICAgICAgIAlhYWxvYWQKLSAgNTQ6CTMzICAgICAgICAgIAliYWxvYWQKLSAgNTU6CTM0ICAgICAgICAgIAljYWxvYWQKLSAgNTY6CTM1ICAgICAgICAgIAlzYWxvYWQKLSAgNTc6CTM2IGVjICAgICAgIAlpc3RvcmUJMjM2Ci0gIDU5OgkzNyAyOSAgICAgICAJbHN0b3JlCTQxCi0gIDViOgkzOCBjZCAgICAgICAJZnN0b3JlCTIwNQotICA1ZDoJMzkgYmEgICAgICAgCWRzdG9yZQkxODYKLSAgNWY6CTNhIGFiICAgICAgIAlhc3RvcmUJMTcxCi0gIDYxOgkzYiAgICAgICAgICAJaXN0b3JlXzAKLSAgNjI6CTNjICAgICAgICAgIAlpc3RvcmVfMQotICA2MzoJM2QgICAgICAgICAgCWlzdG9yZV8yCi0gIDY0OgkzZSAgICAgICAgICAJaXN0b3JlXzMKLSAgNjU6CTNmICAgICAgICAgIAlsc3RvcmVfMAotICA2NjoJNDAgICAgICAgICAgCWxzdG9yZV8xCi0gIDY3Ogk0MSAgICAgICAgICAJbHN0b3JlXzIKLSAgNjg6CTQyICAgICAgICAgIAlsc3RvcmVfMwotICA2OToJNDMgICAgICAgICAgCWZzdG9yZV8wCi0gIDZhOgk0NCAgICAgICAgICAJZnN0b3JlXzEKLSAgNmI6CTQ1ICAgICAgICAgIAlmc3RvcmVfMgotICA2YzoJNDYgICAgICAgICAgCWZzdG9yZV8zCi0gIDZkOgk0NyAgICAgICAgICAJZHN0b3JlXzAKLSAgNmU6CTQ4ICAgICAgICAgIAlkc3RvcmVfMQotICA2ZjoJNDkgICAgICAgICAgCWRzdG9yZV8yCi0gIDcwOgk0YSAgICAgICAgICAJZHN0b3JlXzMKLSAgNzE6CTRiICAgICAgICAgIAlhc3RvcmVfMAotICA3MjoJNGMgICAgICAgICAgCWFzdG9yZV8xCi0gIDczOgk0ZCAgICAgICAgICAJYXN0b3JlXzIKLSAgNzQ6CTRlICAgICAgICAgIAlhc3RvcmVfMwotICA3NToJNGYgICAgICAgICAgCWlhc3RvcmUKLSAgNzY6CTUwICAgICAgICAgIAlsYXN0b3JlCi0gIDc3Ogk1MSAgICAgICAgICAJZmFzdG9yZQotICA3ODoJNTIgICAgICAgICAgCWRhc3RvcmUKLSAgNzk6CTUzICAgICAgICAgIAlhYXN0b3JlCi0gIDdhOgk1NCAgICAgICAgICAJYmFzdG9yZQotICA3YjoJNTUgICAgICAgICAgCWNhc3RvcmUKLSAgN2M6CTU2ICAgICAgICAgIAlzYXN0b3JlCi0gIDdkOgk1NyAgICAgICAgICAJcG9wCi0gIDdlOgk1OCAgICAgICAgICAJcG9wMgotICA3ZjoJNTkgICAgICAgICAgCWR1cAotICA4MDoJNWEgICAgICAgICAgCWR1cF94MQotICA4MToJNWIgICAgICAgICAgCWR1cF94MgotICA4MjoJNWMgICAgICAgICAgCWR1cDIKLSAgODM6CTVkICAgICAgICAgIAlkdXAyX3gxCi0gIDg0Ogk1ZSAgICAgICAgICAJZHVwMl94MgotICA4NToJNWYgICAgICAgICAgCXN3YXAKLSAgODY6CTYwICAgICAgICAgIAlpYWRkCi0gIDg3Ogk2MSAgICAgICAgICAJbGFkZAotICA4ODoJNjIgICAgICAgICAgCWZhZGQKLSAgODk6CTYzICAgICAgICAgIAlkYWRkCi0gIDhhOgk2NCAgICAgICAgICAJaXN1YgotICA4YjoJNjUgICAgICAgICAgCWxzdWIKLSAgOGM6CTY2ICAgICAgICAgIAlmc3ViCi0gIDhkOgk2NyAgICAgICAgICAJZHN1YgotICA4ZToJNjggICAgICAgICAgCWltdWwKLSAgOGY6CTY5ICAgICAgICAgIAlsbXVsCi0gIDkwOgk2YSAgICAgICAgICAJZm11bAotICA5MToJNmIgICAgICAgICAgCWRtdWwKLSAgOTI6CTZjICAgICAgICAgIAlpZGl2Ci0gIDkzOgk2ZCAgICAgICAgICAJbGRpdgotICA5NDoJNmUgICAgICAgICAgCWZkaXYKLSAgOTU6CTZmICAgICAgICAgIAlkZGl2Ci0gIDk2Ogk3MCAgICAgICAgICAJaXJlbQotICA5NzoJNzEgICAgICAgICAgCWxyZW0KLSAgOTg6CTcyICAgICAgICAgIAlmcmVtCi0gIDk5Ogk3MyAgICAgICAgICAJZHJlbQotICA5YToJNzQgICAgICAgICAgCWluZWcKLSAgOWI6CTc1ICAgICAgICAgIAlsbmVnCi0gIDljOgk3NiAgICAgICAgICAJZm5lZwotICA5ZDoJNzcgICAgICAgICAgCWRuZWcKLSAgOWU6CTc4ICAgICAgICAgIAlpc2hsCi0gIDlmOgk3OSAgICAgICAgICAJbHNobAotICBhMDoJN2EgICAgICAgICAgCWlzaHIKLSAgYTE6CTdiICAgICAgICAgIAlsc2hyCi0gIGEyOgk3YyAgICAgICAgICAJaXVzaHIKLSAgYTM6CTdkICAgICAgICAgIAlsdXNocgotICBhNDoJN2UgICAgICAgICAgCWlhbmQKLSAgYTU6CTdmICAgICAgICAgIAlsYW5kCi0gIGE2Ogk4MCAgICAgICAgICAJaW9yCi0gIGE3Ogk4MSAgICAgICAgICAJbG9yCi0gIGE4Ogk4MiAgICAgICAgICAJaXhvcgotICBhOToJODMgICAgICAgICAgCWx4b3IKLSAgYWE6CTg0IGYyIDdiICAgIAlpaW5jCTI0MiwxMjMKLSAgYWQ6CTg1ICAgICAgICAgIAlpMmwKLSAgYWU6CTg2ICAgICAgICAgIAlpMmYKLSAgYWY6CTg3ICAgICAgICAgIAlpMmQKLSAgYjA6CTg4ICAgICAgICAgIAlsMmkKLSAgYjE6CTg5ICAgICAgICAgIAlsMmYKLSAgYjI6CThhICAgICAgICAgIAlsMmQKLSAgYjM6CThiICAgICAgICAgIAlmMmkKLSAgYjQ6CThjICAgICAgICAgIAlmMmwKLSAgYjU6CThkICAgICAgICAgIAlmMmQKLSAgYjY6CThlICAgICAgICAgIAlkMmkKLSAgYjc6CThmICAgICAgICAgIAlkMmwKLSAgYjg6CTkwICAgICAgICAgIAlkMmYKLSAgYjk6CTkxICAgICAgICAgIAlpMmIKLSAgYmE6CTkyICAgICAgICAgIAlpMmMKLSAgYmI6CTkzICAgICAgICAgIAlpMnMKLSAgYmM6CTk0ICAgICAgICAgIAlsY21wCi0gIGJkOgk5NSAgICAgICAgICAJZmNtcGwKLSAgYmU6CTk2ICAgICAgICAgIAlmY21wZwotICBiZjoJOTcgICAgICAgICAgCWRjbXBsCi0gIGMwOgk5OCAgICAgICAgICAJZGNtcGcKLSAgYzE6CTk5IGZmIDQxICAgIAlpZmVxMiA8Zm9vMT4KLSAgYzQ6CTlhIGZmIDQ3ICAgIAlpZm5lYiA8Zm9vMTA+Ci0gIGM3Ogk5YiBmZiA0MSAgICAJaWZsdDggPGZvbzc+Ci0gIGNhOgk5YyBmZiA0OCAgICAJaWZnZTEyIDxmb28xNz4KLSAgY2Q6CTlkIGZmIDM5ICAgIAlpZmd0NiA8Zm9vNT4KLSAgZDA6CTllIGZmIDNhICAgIAlpZmxlYSA8Zm9vOT4KLSAgZDM6CTlmIGZmIDM4ICAgIAlpZl9pY21wZXFiIDxmb28xMD4KLSAgZDY6CWEwIGZmIDNhICAgIAlpZl9pY21wbmUxMCA8Zm9vMTU+Ci0gIGQ5OglhMSBmZiAzMCAgICAJaWZfaWNtcGx0OSA8Zm9vOD4KLSAgZGM6CWEyIGZmIDMxICAgIAlpZl9pY21wZ2VkIDxmb28xMj4KLSAgZGY6CWEzIGZmIDI5ICAgIAlpZl9pY21wZ3Q4IDxmb283PgotICBlMjoJYTQgZmYgMmIgICAgCWlmX2ljbXBsZWQgPGZvbzEyPgotICBlNToJYTUgZmYgMjIgICAgCWlmX2FjbXBlcTcgPGZvbzY+Ci0gIGU4OglhNiBmZiAyMCAgICAJaWZfYWNtcG5lOCA8Zm9vNz4KLSAgZWI6CWE3IGZmIDFiICAgIAlnb3RvNiA8Zm9vNT4KLSAgZWU6CWE4IDAwIDAwICAgIAlqc3IKLSAgZjE6CWE5IDAwICAgICAgIAlyZXQKLSAgZjM6CWFhIGZmIGZmIGZmIAl0YWJsZXN3aXRjaCBkZWZhdWx0OiAuKgotICBmNzoJMGYgMDAgMDAgMDAgCi0gIGZiOgkwMSAwMCAwMCAwMCAKLSAgZmY6CTA1IGZmIGZmIGZmIAotIDEwMzoJMTQgZmYgZmYgZmYgCi0gMTA3OgkxMiBmZiBmZiBmZiAKLSAxMGI6CTFmIGZmIGZmIGZmIAotIDEwZjoJMTQgZmYgZmYgZmYgCi0gMTEzOgkxMiAKLSAxMTQ6CWFiIDAwIDAwIDAwIAlsb29rdXBzd2l0Y2ggZGVmYXVsdDogLioKLSAxMTg6CWZmIGZmIGZlIGYyIAotIDExYzoJMDAgMDAgMDAgMDIgCi0gMTIwOgkwMCAwMCAwMCAwNyAKLSAxMjQ6CWZmIGZmIGZlIGZiIAotIDEyODoJMDAgMDAgMDAgMjUgCi0gMTJjOglmZiBmZiBmZSBmYyAKLSAxMzA6CWFjICAgICAgICAgIAlpcmV0dXJuCi0gMTMxOglhZCAgICAgICAgICAJbHJldHVybgotIDEzMjoJYWUgICAgICAgICAgCWZyZXR1cm4KLSAxMzM6CWFmICAgICAgICAgIAlkcmV0dXJuCi0gMTM0OgliMCAgICAgICAgICAJYXJldHVybgotIDEzNToJYjEgICAgICAgICAgCXJldHVybgotIDEzNjoJYjIgMDAgMDAgICAgCWdldHN0YXRpYwotIDEzOToJYjMgMDAgMDAgICAgCXB1dHN0YXRpYwotIDEzYzoJYjQgMDAgMDAgICAgCWdldGZpZWxkCi0gMTNmOgliNSAwMCAwMCAgICAJcHV0ZmllbGQKLSAxNDI6CWI2IDAwIDAwICAgIAlpbnZva2V2aXJ0dWFsCi0gMTQ1OgliNyAwMCAwMCAgICAJaW52b2tlc3BlY2lhbAotIDE0ODoJYjggMDAgMDAgICAgCWludm9rZXN0YXRpYwotIDE0YjoJYjkgMDAgMDAgMDAgCWludm9rZWludGVyZmFjZQotIDE0ZjoJMDAgCi0gMTUwOgliYiAwMCAwMCAgICAJbmV3Ci0gMTUzOgliYyAwMCAgICAgICAJbmV3YXJyYXkKLSAxNTU6CWJkIDAwIDAwICAgIAlhbmV3YXJyYXkKLSAxNTg6CWJlICAgICAgICAgIAlhcnJheWxlbmd0aAotIDE1OToJYmYgICAgICAgICAgCWF0aHJvdwotIDE1YToJYzAgMDAgMDAgICAgCWNoZWNrY2FzdAotIDE1ZDoJYzEgMDAgMDAgICAgCWluc3RhbmNlb2YKLSAxNjA6CWMyICAgICAgICAgIAltb25pdG9yZW50ZXIKLSAxNjE6CWMzICAgICAgICAgIAltb25pdG9yZXhpdAotIDE2MjoJYzQgICAgICAgICAgCXdpZGUKLSAxNjM6CWM1IDAwIDAwIDAwIAltdWx0aWFuZXdhcnJheQotIDE2NzoJYzYgMDAgMDAgICAgCWlmbnVsbAotIDE2YToJYzcgMDAgMDAgICAgCWlmbm9ubnVsbAotIDE2ZDoJYzggMDAgMDAgMDAgCWdvdG9fdwotIDE3MToJMDAgCi0gMTcyOgljOSAwMCAwMCAwMCAJanNyX3cKLSAxNzY6CTAwIAotIDE3NzoJY2EgICAgICAgICAgCWJyZWFrcG9pbnQKLSAxNzg6CWNiICAgICAgICAgIAlieXRlY29kZQotIDE3OToJY2MgICAgICAgICAgCXRyeQotIDE3YToJY2QgICAgICAgICAgCWVuZHRyeQotIDE3YjoJY2UgICAgICAgICAgCWNhdGNoCi0gMTdjOgljZiAgICAgICAgICAJdmFyCi0gMTdkOglkMCAgICAgICAgICAJZW5kdmFyCi0gMTdlOgllZCBiMCBhMyAgICAJc2V0aGkJLTIwMzE3Ci0gMTgxOgllZSA1YSBhNSAgICAJbG9hZF93b3JkX2luZGV4CTkwLDE2NQotIDE4NDoJZWYgNWQgODUgICAgCWxvYWRfc2hvcnRfaW5kZXgJOTMsMTMzCi0gMTg3OglmMCAxNyBkOCAgICAJbG9hZF9jaGFyX2luZGV4CTIzLDIxNgotIDE4YToJZjEgZTkgZGUgICAgCWxvYWRfYnl0ZV9pbmRleAkyMzMsMjIyCi0gMThkOglmMiBkNCAyYiAgICAJbG9hZF91Ynl0ZV9pbmRleAkyMTIsNDMKLSAxOTA6CWYzIGIyIDRkICAgIAlzdG9yZV93b3JkX2luZGV4CTE3OCw3NwotIDE5MzoJZjQgYzYgMWIgICAgCW5hX3N0b3JlX3dvcmRfaW5kZXgJMTk4LDI3Ci0gMTk2OglmNSBiNCBkNCAgICAJc3RvcmVfc2hvcnRfaW5kZXgJMTgwLDIxMgotIDE5OToJZjYgMTEgOGUgICAgCXN0b3JlX2J5dGVfaW5kZXgJMTcsMTQyCi0gMTljOglmZiAwMCAgICAgICAJbG9hZF91Ynl0ZQkKLSAxOWU6CWZmIDAxICAgICAgIAlsb2FkX2J5dGUJCi0gMWEwOglmZiAwMiAgICAgICAJbG9hZF9jaGFyCQotIDFhMjoJZmYgMDMgICAgICAgCWxvYWRfc2hvcnQJCi0gMWE0OglmZiAwNCAgICAgICAJbG9hZF93b3JkCQotIDFhNjoJZmYgMDUgICAgICAgCXByaXZfcmV0X2Zyb21fdHJhcAkKLSAxYTg6CWZmIDA2ICAgICAgIAlwcml2X3JlYWRfZGNhY2hlX3RhZwkKLSAxYWE6CWZmIDA3ICAgICAgIAlwcml2X3JlYWRfZGNhY2hlX2RhdGEJCi0gMWFjOglmZiAwYSAgICAgICAJbG9hZF9jaGFyX29lCQotIDFhZToJZmYgMGIgICAgICAgCWxvYWRfc2hvcnRfb2UJCi0gMWIwOglmZiAwYyAgICAgICAJbG9hZF93b3JkX29lCQotIDFiMjoJZmYgMGQgICAgICAgCXJldHVybjAJCi0gMWI0OglmZiAwZSAgICAgICAJcHJpdl9yZWFkX2ljYWNoZV90YWcJCi0gMWI2OglmZiAwZiAgICAgICAJcHJpdl9yZWFkX2ljYWNoZV9kYXRhCQotIDFiODoJZmYgMTAgICAgICAgCW5jbG9hZF91Ynl0ZQkKLSAxYmE6CWZmIDExICAgICAgIAluY2xvYWRfYnl0ZQkKLSAxYmM6CWZmIDEyICAgICAgIAluY2xvYWRfY2hhcgkKLSAxYmU6CWZmIDEzICAgICAgIAluY2xvYWRfc2hvcnQJCi0gMWMwOglmZiAxNCAgICAgICAJbmNsb2FkX3dvcmQJCi0gMWMyOglmZiAxNSAgICAgICAJaXVjbXAJCi0gMWM0OglmZiAxNiAgICAgICAJcHJpdl9wb3dlcmRvd24JCi0gMWM2OglmZiAxNyAgICAgICAJY2FjaGVfaW52YWxpZGF0ZQkKLSAxYzg6CWZmIDFhICAgICAgIAluY2xvYWRfY2hhcl9vZQkKLSAxY2E6CWZmIDFiICAgICAgIAluY2xvYWRfc2hvcnRfb2UJCi0gMWNjOglmZiAxYyAgICAgICAJbmNsb2FkX3dvcmRfb2UJCi0gMWNlOglmZiAxZCAgICAgICAJcmV0dXJuMQkKLSAxZDA6CWZmIDFlICAgICAgIAljYWNoZV9mbHVzaAkKLSAxZDI6CWZmIDFmICAgICAgIAljYWNoZV9pbmRleF9mbHVzaAkKLSAxZDQ6CWZmIDIwICAgICAgIAlzdG9yZV9ieXRlCQotIDFkNjoJZmYgMjIgICAgICAgCXN0b3JlX3Nob3J0CQotIDFkODoJZmYgMjQgICAgICAgCXN0b3JlX3dvcmQJCi0gMWRhOglmZiAyNSAgICAgICAJc29mdF90cmFwCQotIDFkYzoJZmYgMjYgICAgICAgCXByaXZfd3JpdGVfZGNhY2hlX3RhZwkKLSAxZGU6CWZmIDI3ICAgICAgIAlwcml2X3dyaXRlX2RjYWNoZV9kYXRhCQotIDFlMDoJZmYgMmEgICAgICAgCXN0b3JlX3Nob3J0X29lCQotIDFlMjoJZmYgMmMgICAgICAgCXN0b3JlX3dvcmRfb2UJCi0gMWU0OglmZiAyZCAgICAgICAJcmV0dXJuMgkKLSAxZTY6CWZmIDJlICAgICAgIAlwcml2X3dyaXRlX2ljYWNoZV90YWcJCi0gMWU4OglmZiAyZiAgICAgICAJcHJpdl93cml0ZV9pY2FjaGVfZGF0YQkKLSAxZWE6CWZmIDMwICAgICAgIAluY3N0b3JlX2J5dGUJCi0gMWVjOglmZiAzMiAgICAgICAJbmNzdG9yZV9zaG9ydAkKLSAxZWU6CWZmIDM0ICAgICAgIAluY3N0b3JlX3dvcmQJCi0gMWYwOglmZiAzNiAgICAgICAJcHJpdl9yZXNldAkKLSAxZjI6CWZmIDM3ICAgICAgIAlnZXRfY3VycmVudF9jbGFzcwkKLSAxZjQ6CWZmIDNhICAgICAgIAluY3N0b3JlX3Nob3J0X29lCQotIDFmNjoJZmYgM2MgICAgICAgCW5jc3RvcmVfd29yZF9vZQkKLSAxZjg6CWZmIDNkICAgICAgIAljYWxsCQotIDFmYToJZmYgM2UgICAgICAgCXplcm9fbGluZQkKLSAxZmM6CWZmIDNmICAgICAgIAlwcml2X3VwZGF0ZV9vcHRvcAkKLSAxZmU6CWZmIDQwICAgICAgIAlyZWFkX3BjCQotIDIwMDoJZmYgNDEgICAgICAgCXJlYWRfdmFycwkKLSAyMDI6CWZmIDQyICAgICAgIAlyZWFkX2ZyYW1lCQotIDIwNDoJZmYgNDMgICAgICAgCXJlYWRfb3B0b3AJCi0gMjA2OglmZiA0NCAgICAgICAJcHJpdl9yZWFkX29wbGltCQotIDIwODoJZmYgNDUgICAgICAgCXJlYWRfY29uc3RfcG9vbAkKLSAyMGE6CWZmIDQ2ICAgICAgIAlwcml2X3JlYWRfcHNyCQotIDIwYzoJZmYgNDcgICAgICAgCXByaXZfcmVhZF90cmFwYmFzZQkKLSAyMGU6CWZmIDQ4ICAgICAgIAlwcml2X3JlYWRfbG9ja2NvdW50MAkKLSAyMTA6CWZmIDQ5ICAgICAgIAlwcml2X3JlYWRfbG9ja2NvdW50MQkKLSAyMTI6CWZmIDRjICAgICAgIAlwcml2X3JlYWRfbG9ja2FkZHIwCQotIDIxNDoJZmYgNGQgICAgICAgCXByaXZfcmVhZF9sb2NrYWRkcjEJCi0gMjE2OglmZiA1MCAgICAgICAJcHJpdl9yZWFkX3VzZXJyYW5nZTEJCi0gMjE4OglmZiA1MSAgICAgICAJcHJpdl9yZWFkX2djX2NvbmZpZwkKLSAyMWE6CWZmIDUyICAgICAgIAlwcml2X3JlYWRfYnJrMWEJCi0gMjFjOglmZiA1MyAgICAgICAJcHJpdl9yZWFkX2JyazJhCQotIDIxZToJZmYgNTQgICAgICAgCXByaXZfcmVhZF9icmsxMmMJCi0gMjIwOglmZiA1NSAgICAgICAJcHJpdl9yZWFkX3VzZXJyYW5nZTIJCi0gMjIyOglmZiA1NyAgICAgICAJcHJpdl9yZWFkX3ZlcnNpb25pZAkKLSAyMjQ6CWZmIDU4ICAgICAgIAlwcml2X3JlYWRfaGNyCQotIDIyNjoJZmYgNTkgICAgICAgCXByaXZfcmVhZF9zY19ib3R0b20JCi0gMjI4OglmZiA1YSAgICAgICAJcmVhZF9nbG9iYWwwCQotIDIyYToJZmYgNWIgICAgICAgCXJlYWRfZ2xvYmFsMQkKLSAyMmM6CWZmIDVjICAgICAgIAlyZWFkX2dsb2JhbDIJCi0gMjJlOglmZiA1ZCAgICAgICAJcmVhZF9nbG9iYWwzCQotIDIzMDoJZmYgNjAgICAgICAgCXdyaXRlX3BjCQotIDIzMjoJZmYgNjEgICAgICAgCXdyaXRlX3ZhcnMJCi0gMjM0OglmZiA2MiAgICAgICAJd3JpdGVfZnJhbWUJCi0gMjM2OglmZiA2MyAgICAgICAJd3JpdGVfb3B0b3AJCi0gMjM4OglmZiA2NCAgICAgICAJcHJpdl93cml0ZV9vcGxpbQkKLSAyM2E6CWZmIDY1ICAgICAgIAl3cml0ZV9jb25zdF9wb29sCQotIDIzYzoJZmYgNjYgICAgICAgCXByaXZfd3JpdGVfcHNyCQotIDIzZToJZmYgNjcgICAgICAgCXByaXZfd3JpdGVfdHJhcGJhc2UJCi0gMjQwOglmZiA2OCAgICAgICAJcHJpdl93cml0ZV9sb2NrY291bnQwCQotIDI0MjoJZmYgNjkgICAgICAgCXByaXZfd3JpdGVfbG9ja2NvdW50MQkKLSAyNDQ6CWZmIDZjICAgICAgIAlwcml2X3dyaXRlX2xvY2thZGRyMAkKLSAyNDY6CWZmIDZkICAgICAgIAlwcml2X3dyaXRlX2xvY2thZGRyMQkKLSAyNDg6CWZmIDcwICAgICAgIAlwcml2X3dyaXRlX3VzZXJyYW5nZTEJCi0gMjRhOglmZiA3MSAgICAgICAJcHJpdl93cml0ZV9nY19jb25maWcJCi0gMjRjOglmZiA3MiAgICAgICAJcHJpdl93cml0ZV9icmsxYQkKLSAyNGU6CWZmIDczICAgICAgIAlwcml2X3dyaXRlX2JyazJhCQotIDI1MDoJZmYgNzQgICAgICAgCXByaXZfd3JpdGVfYnJrMTJjCQotIDI1MjoJZmYgNzUgICAgICAgCXByaXZfd3JpdGVfdXNlcnJhbmdlMgkKLSAyNTQ6CWZmIDc5ICAgICAgIAlwcml2X3dyaXRlX3NjX2JvdHRvbQkKLSAyNTY6CWZmIDdhICAgICAgIAl3cml0ZV9nbG9iYWwwCQotIDI1ODoJZmYgN2IgICAgICAgCXdyaXRlX2dsb2JhbDEJCi0gMjVhOglmZiA3YyAgICAgICAJd3JpdGVfZ2xvYmFsMgkKLSAyNWM6CWZmIDdkICAgICAgIAl3cml0ZV9nbG9iYWwzCQotIDI1ZToJZmYgYWUgICAgICAgCXRtX3B1dGNoYXIJCi0gMjYwOglmZiBhZiAgICAgICAJdG1fZXhpdAkKLSAyNjI6CWZmIGIwICAgICAgIAl0bV90cmFwCQotIDI2NDoJZmYgYjEgICAgICAgCXRtX21pbmZvCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcGovb3BzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9wai9vcHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4MTA5Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wai9vcHMucworKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0uTDA6CW5vcAotLmdsb2JsIGZvbzAKLWZvbzA6Ci0uTDE6CW5vcAotLmdsb2JsIGZvbzEKLWZvbzE6Ci0uTDI6CW5vcAotLmdsb2JsIGZvbzIKLWZvbzI6Ci0uTDM6CW5vcAotLmdsb2JsIGZvbzMKLWZvbzM6Ci0uTDQ6CW5vcAotLmdsb2JsIGZvbzQKLWZvbzQ6Ci0uTDU6CW5vcAotLmdsb2JsIGZvbzUKLWZvbzU6Ci0uTDY6CW5vcAotLmdsb2JsIGZvbzYKLWZvbzY6Ci0uTDc6CW5vcAotLmdsb2JsIGZvbzcKLWZvbzc6Ci0uTDg6CW5vcAotLmdsb2JsIGZvbzgKLWZvbzg6Ci0uTDk6CW5vcAotLmdsb2JsIGZvbzkKLWZvbzk6Ci0uTDEwOglub3AKLS5nbG9ibCBmb28xMAotZm9vMTA6Ci0uTDExOglub3AKLS5nbG9ibCBmb28xMQotZm9vMTE6Ci0uTDEyOglub3AKLS5nbG9ibCBmb28xMgotZm9vMTI6Ci0uTDEzOglub3AKLS5nbG9ibCBmb28xMwotZm9vMTM6Ci0uTDE0Oglub3AKLS5nbG9ibCBmb28xNAotZm9vMTQ6Ci0uTDE1Oglub3AKLS5nbG9ibCBmb28xNQotZm9vMTU6Ci0uTDE2Oglub3AKLS5nbG9ibCBmb28xNgotZm9vMTY6Ci0uTDE3Oglub3AKLS5nbG9ibCBmb28xNwotZm9vMTc6Ci0uTDE4Oglub3AKLS5nbG9ibCBmb28xOAotZm9vMTg6Ci0uTDE5Oglub3AKLS5nbG9ibCBmb28xOQotZm9vMTk6Ci0Jbm9wCi0JYWNvbnN0X251bGwKLQlpY29uc3RfbTEKLQlpY29uc3RfMAotCWljb25zdF8xCi0JaWNvbnN0XzIKLQlpY29uc3RfMwotCWljb25zdF80Ci0JaWNvbnN0XzUKLQlsY29uc3RfMAotCWxjb25zdF8xCi0JZmNvbnN0XzAKLQlmY29uc3RfMQotCWZjb25zdF8yCi0JZGNvbnN0XzAKLQlkY29uc3RfMQotCWJpcHVzaCAtMjUKLQlzaXB1c2ggLTIzNjEwCi0JbGRjCi0JbGRjX3cKLQlsZGMyX3cKLQlpbG9hZCAxMDUKLQlsbG9hZCAxMTUKLQlmbG9hZCA4MQotCWRsb2FkIDI1NQotCWFsb2FkIDc0Ci0JaWxvYWRfMAotCWlsb2FkXzEKLQlpbG9hZF8yCi0JaWxvYWRfMwotCWxsb2FkXzAKLQlsbG9hZF8xCi0JbGxvYWRfMgotCWxsb2FkXzMKLQlmbG9hZF8wCi0JZmxvYWRfMQotCWZsb2FkXzIKLQlmbG9hZF8zCi0JZGxvYWRfMAotCWRsb2FkXzEKLQlkbG9hZF8yCi0JZGxvYWRfMwotCWFsb2FkXzAKLQlhbG9hZF8xCi0JYWxvYWRfMgotCWFsb2FkXzMKLQlpYWxvYWQKLQlsYWxvYWQKLQlmYWxvYWQKLQlkYWxvYWQKLQlhYWxvYWQKLQliYWxvYWQKLQljYWxvYWQKLQlzYWxvYWQKLQlpc3RvcmUgMjM2Ci0JbHN0b3JlIDQxCi0JZnN0b3JlIDIwNQotCWRzdG9yZSAxODYKLQlhc3RvcmUgMTcxCi0JaXN0b3JlXzAKLQlpc3RvcmVfMQotCWlzdG9yZV8yCi0JaXN0b3JlXzMKLQlsc3RvcmVfMAotCWxzdG9yZV8xCi0JbHN0b3JlXzIKLQlsc3RvcmVfMwotCWZzdG9yZV8wCi0JZnN0b3JlXzEKLQlmc3RvcmVfMgotCWZzdG9yZV8zCi0JZHN0b3JlXzAKLQlkc3RvcmVfMQotCWRzdG9yZV8yCi0JZHN0b3JlXzMKLQlhc3RvcmVfMAotCWFzdG9yZV8xCi0JYXN0b3JlXzIKLQlhc3RvcmVfMwotCWlhc3RvcmUKLQlsYXN0b3JlCi0JZmFzdG9yZQotCWRhc3RvcmUKLQlhYXN0b3JlCi0JYmFzdG9yZQotCWNhc3RvcmUKLQlzYXN0b3JlCi0JcG9wCi0JcG9wMgotCWR1cAotCWR1cF94MQotCWR1cF94MgotCWR1cDIKLQlkdXAyX3gxCi0JZHVwMl94MgotCXN3YXAKLQlpYWRkCi0JbGFkZAotCWZhZGQKLQlkYWRkCi0JaXN1YgotCWxzdWIKLQlmc3ViCi0JZHN1YgotCWltdWwKLQlsbXVsCi0JZm11bAotCWRtdWwKLQlpZGl2Ci0JbGRpdgotCWZkaXYKLQlkZGl2Ci0JaXJlbQotCWxyZW0KLQlmcmVtCi0JZHJlbQotCWluZWcKLQlsbmVnCi0JZm5lZwotCWRuZWcKLQlpc2hsCi0JbHNobAotCWlzaHIKLQlsc2hyCi0JaXVzaHIKLQlsdXNocgotCWlhbmQKLQlsYW5kCi0JaW9yCi0JbG9yCi0JaXhvcgotCWx4b3IKLQlpaW5jIDI0MiwgMTIzCi0JaTJsCi0JaTJmCi0JaTJkCi0JbDJpCi0JbDJmCi0JbDJkCi0JZjJpCi0JZjJsCi0JZjJkCi0JZDJpCi0JZDJsCi0JZDJmCi0JaTJiCi0JaTJjCi0JaTJzCi0JbGNtcAotCWZjbXBsCi0JZmNtcGcKLQlkY21wbAotCWRjbXBnCi0JaWZlcSAuTDIKLQlpZm5lIC5MMTEKLQlpZmx0IC5MOAotCWlmZ2UgLkwxOAotCWlmZ3QgLkw2Ci0JaWZsZSAuTDEwCi0JaWZfaWNtcGVxIC5MMTEKLQlpZl9pY21wbmUgLkwxNgotCWlmX2ljbXBsdCAuTDkKLQlpZl9pY21wZ2UgLkwxMwotCWlmX2ljbXBndCAuTDgKLQlpZl9pY21wbGUgLkwxMwotCWlmX2FjbXBlcSAuTDcKLQlpZl9hY21wbmUgLkw4Ci0JZ290byAuTDYKLQlqc3IKLQlyZXQKLS5MdDoJdGFibGVzd2l0Y2gKLQotCS5hbGlnbiAyCi0JLmxvbmcgLkwyLS5MdAotCS5sb25nIDEKLQkubG9uZyA1Ci0JLmxvbmcgLkw3LS5MdAotCS5sb25nIC5MNS0uTHQKLQkubG9uZyAuTDE4LS5MdAotCS5sb25nIC5MNy0uTHQKLQkubG9uZyAuTDUtLkx0Ci0uTGw6CWxvb2t1cHN3aXRjaAotCi0JLmFsaWduIDIKLQkubG9uZyAuTDYtLkxsCi0JLmxvbmcgMgotCS5sb25nIDcKLQkubG9uZyAuTDE1LS5MbAotCS5sb25nIDM3Ci0JLmxvbmcgLkwxNi0uTGwKLQlpcmV0dXJuCi0JbHJldHVybgotCWZyZXR1cm4KLQlkcmV0dXJuCi0JYXJldHVybgotCXJldHVybgotCWdldHN0YXRpYwotCXB1dHN0YXRpYwotCWdldGZpZWxkCi0JcHV0ZmllbGQKLQlpbnZva2V2aXJ0dWFsCi0JaW52b2tlc3BlY2lhbAotCWludm9rZXN0YXRpYwotCWludm9rZWludGVyZmFjZQotCW5ldwotCW5ld2FycmF5Ci0JYW5ld2FycmF5Ci0JYXJyYXlsZW5ndGgKLQlhdGhyb3cKLQljaGVja2Nhc3QKLQlpbnN0YW5jZW9mCi0JbW9uaXRvcmVudGVyCi0JbW9uaXRvcmV4aXQKLQl3aWRlCi0JbXVsdGlhbmV3YXJyYXkKLQlpZm51bGwKLQlpZm5vbm51bGwKLQlnb3RvX3cKLQlqc3JfdwotCWJyZWFrcG9pbnQKLQlieXRlY29kZQotCXRyeQotCWVuZHRyeQotCWNhdGNoCi0JdmFyCi0JZW5kdmFyCi0Jc2V0aGkgLTIwMzE3Ci0JbG9hZF93b3JkX2luZGV4IDkwLCAtOTEKLQlsb2FkX3Nob3J0X2luZGV4IDkzLCAtMTIzCi0JbG9hZF9jaGFyX2luZGV4IDIzLCAtNDAKLQlsb2FkX2J5dGVfaW5kZXggMjMzLCAtMzQKLQlsb2FkX3VieXRlX2luZGV4IDIxMiwgNDMKLQlzdG9yZV93b3JkX2luZGV4IDE3OCwgNzcKLQluYV9zdG9yZV93b3JkX2luZGV4IDE5OCwgMjcKLQlzdG9yZV9zaG9ydF9pbmRleCAxODAsIC00NAotCXN0b3JlX2J5dGVfaW5kZXggMTcsIC0xMTQKLQlsb2FkX3VieXRlCi0JbG9hZF9ieXRlCi0JbG9hZF9jaGFyCi0JbG9hZF9zaG9ydAotCWxvYWRfd29yZAotCXByaXZfcmV0X2Zyb21fdHJhcAotCXByaXZfcmVhZF9kY2FjaGVfdGFnCi0JcHJpdl9yZWFkX2RjYWNoZV9kYXRhCi0JbG9hZF9jaGFyX29lCi0JbG9hZF9zaG9ydF9vZQotCWxvYWRfd29yZF9vZQotCXJldHVybjAKLQlwcml2X3JlYWRfaWNhY2hlX3RhZwotCXByaXZfcmVhZF9pY2FjaGVfZGF0YQotCW5jbG9hZF91Ynl0ZQotCW5jbG9hZF9ieXRlCi0JbmNsb2FkX2NoYXIKLQluY2xvYWRfc2hvcnQKLQluY2xvYWRfd29yZAotCWl1Y21wCi0JcHJpdl9wb3dlcmRvd24KLQljYWNoZV9pbnZhbGlkYXRlCi0JbmNsb2FkX2NoYXJfb2UKLQluY2xvYWRfc2hvcnRfb2UKLQluY2xvYWRfd29yZF9vZQotCXJldHVybjEKLQljYWNoZV9mbHVzaAotCWNhY2hlX2luZGV4X2ZsdXNoCi0Jc3RvcmVfYnl0ZQotCXN0b3JlX3Nob3J0Ci0Jc3RvcmVfd29yZAotCXNvZnRfdHJhcAotCXByaXZfd3JpdGVfZGNhY2hlX3RhZwotCXByaXZfd3JpdGVfZGNhY2hlX2RhdGEKLQlzdG9yZV9zaG9ydF9vZQotCXN0b3JlX3dvcmRfb2UKLQlyZXR1cm4yCi0JcHJpdl93cml0ZV9pY2FjaGVfdGFnCi0JcHJpdl93cml0ZV9pY2FjaGVfZGF0YQotCW5jc3RvcmVfYnl0ZQotCW5jc3RvcmVfc2hvcnQKLQluY3N0b3JlX3dvcmQKLQlwcml2X3Jlc2V0Ci0JZ2V0X2N1cnJlbnRfY2xhc3MKLQluY3N0b3JlX3Nob3J0X29lCi0JbmNzdG9yZV93b3JkX29lCi0JY2FsbAotCXplcm9fbGluZQotCXByaXZfdXBkYXRlX29wdG9wCi0JcmVhZF9wYwotCXJlYWRfdmFycwotCXJlYWRfZnJhbWUKLQlyZWFkX29wdG9wCi0JcHJpdl9yZWFkX29wbGltCi0JcmVhZF9jb25zdF9wb29sCi0JcHJpdl9yZWFkX3BzcgotCXByaXZfcmVhZF90cmFwYmFzZQotCXByaXZfcmVhZF9sb2NrY291bnQwCi0JcHJpdl9yZWFkX2xvY2tjb3VudDEKLQlwcml2X3JlYWRfbG9ja2FkZHIwCi0JcHJpdl9yZWFkX2xvY2thZGRyMQotCXByaXZfcmVhZF91c2VycmFuZ2UxCi0JcHJpdl9yZWFkX2djX2NvbmZpZwotCXByaXZfcmVhZF9icmsxYQotCXByaXZfcmVhZF9icmsyYQotCXByaXZfcmVhZF9icmsxMmMKLQlwcml2X3JlYWRfdXNlcnJhbmdlMgotCXByaXZfcmVhZF92ZXJzaW9uaWQKLQlwcml2X3JlYWRfaGNyCi0JcHJpdl9yZWFkX3NjX2JvdHRvbQotCXJlYWRfZ2xvYmFsMAotCXJlYWRfZ2xvYmFsMQotCXJlYWRfZ2xvYmFsMgotCXJlYWRfZ2xvYmFsMwotCXdyaXRlX3BjCi0Jd3JpdGVfdmFycwotCXdyaXRlX2ZyYW1lCi0Jd3JpdGVfb3B0b3AKLQlwcml2X3dyaXRlX29wbGltCi0Jd3JpdGVfY29uc3RfcG9vbAotCXByaXZfd3JpdGVfcHNyCi0JcHJpdl93cml0ZV90cmFwYmFzZQotCXByaXZfd3JpdGVfbG9ja2NvdW50MAotCXByaXZfd3JpdGVfbG9ja2NvdW50MQotCXByaXZfd3JpdGVfbG9ja2FkZHIwCi0JcHJpdl93cml0ZV9sb2NrYWRkcjEKLQlwcml2X3dyaXRlX3VzZXJyYW5nZTEKLQlwcml2X3dyaXRlX2djX2NvbmZpZwotCXByaXZfd3JpdGVfYnJrMWEKLQlwcml2X3dyaXRlX2JyazJhCi0JcHJpdl93cml0ZV9icmsxMmMKLQlwcml2X3dyaXRlX3VzZXJyYW5nZTIKLQlwcml2X3dyaXRlX3NjX2JvdHRvbQotCXdyaXRlX2dsb2JhbDAKLQl3cml0ZV9nbG9iYWwxCi0Jd3JpdGVfZ2xvYmFsMgotCXdyaXRlX2dsb2JhbDMKLQl0bV9wdXRjaGFyCi0JdG1fZXhpdAotCXRtX3RyYXAKLQl0bV9taW5mbwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcGovcGouZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcGovcGouZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGE0MDM2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BqL3BqLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIwotIyBTb21lIHBqIHRlc3RzCi0jCi1pZiBbaXN0YXJnZXQgcGoqXSB0aGVuIHsKLSAgICBydW5fZHVtcF90ZXN0ICJvcHMiCi19Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhhYWI1NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jb2JqZHVtcDogLURyCi0jbmFtZTogUG93ZXJQQyB0ZXN0IDEKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1wb3dlcnBjCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotCi0wKzAwMDAwMDAgPGZvbz46Ci0gICAwOgk2MCAwMCAwMCAwMCAJbm9wCi0gICA0Ogk2MCAwMCAwMCAwMCAJbm9wCi0gICA4Ogk2MCAwMCAwMCAwMCAJbm9wCi0KLTArMDAwMDAwYyA8YT46Ci0gICBjOgk0OCAwMCAwMCAwNCAJYgkxMCA8YXBmb3VyPgotCi0wKzAwMDAwMTAgPGFwZm91cj46Ci0gIDEwOgk0OCAwMCAwMCAwOCAJYgkxOCA8YXBmb3VyXCsweDg+Ci0gIDE0Ogk0OCAwMCAwMCAwMCAJYgkxNCA8YXBmb3VyXCsweDQ+Ci0JCQkxNDogUl9QUENfUkVMMjQJeAotICAxODoJNDggMDAgMDAgMDQgCWIJMWMgPGFwZm91clwrMHhjPgotCQkJMTg6IFJfUFBDX1JFTDI0CVwuZGF0YVwrMHg0Ci0gIDFjOgk0OCAwMCAwMCAwMCAJYgkxYyA8YXBmb3VyXCsweGM+Ci0JCQkxYzogUl9QUENfUkVMMjQJegotICAyMDoJNDggMDAgMDAgMTQgCWIJMzQgPGFwZm91clwrMHgyND4KLQkJCTIwOiBSX1BQQ19SRUwyNAl6XCsweDE0Ci0gIDI0Ogk0OCAwMCAwMCAwNCAJYgkyOCA8YXBmb3VyXCsweDE4PgotICAyODoJNDggMDAgMDAgMDAgCWIJMjggPGFwZm91clwrMHgxOD4KLQkJCTI4OiBSX1BQQ19SRUwyNAlhCi0gIDJjOgk0YiBmZiBmZiBlNCAJYgkxMCA8YXBmb3VyPgotICAzMDoJNDggMDAgMDAgMDQgCWIJMzQgPGFwZm91clwrMHgyND4KLQkJCTMwOiBSX1BQQ19SRUwyNAlhXCsweDQKLSAgMzQ6CTRiIGZmIGZmIGUwIAliCTE0IDxhcGZvdXJcKzB4ND4KLSAgMzg6CTQ4IDAwIDAwIDAwIAliCTM4IDxhcGZvdXJcKzB4Mjg+Ci0JCQkzODogUl9QUENfTE9DQUwyNFBDCWEKLSAgM2M6CTRiIGZmIGZmIGQ0IAliCTEwIDxhcGZvdXI+Ci0KLSAgNDA6CTAwIDAwIDAwIDQwIAlcLmxvbmcgMHg0MAotCQkJNDA6IFJfUFBDX0FERFIzMglcLnRleHRcKzB4NDAKLQotICA0NDoJMDAgMDAgMDAgNGMgCVwubG9uZyAweDRjCi0JCQk0NDogUl9QUENfQUREUjMyCVwudGV4dFwrMHg0YwotICA0ODoJMDAgMDAgMDAgMDAgCVwubG9uZyAweDAKLQkJCTQ4OiBSX1BQQ19SRUwzMgl4Ci0gIDRjOgkwMCAwMCAwMCAwNCAJXC5sb25nIDB4NAotCQkJNGM6IFJfUFBDX1JFTDMyCXhcKzB4NAotCVwuXC5cLgotCQkJNTA6IFJfUFBDX1JFTDMyCXoKLQkJCTU0OiBSX1BQQ19SRUwzMgl5Ci0JCQk1ODogUl9QUENfQUREUjMyCXgKLQkJCTVjOiBSX1BQQ19BRERSMzIJeQotCQkJNjA6IFJfUFBDX0FERFIzMgl6Ci0gIDY0OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotCQkJNjQ6IFJfUFBDX0FERFIzMgl4XCsweGYrZmZmZmZmYwotICA2ODoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKLQkJCTY4OiBSX1BQQ19BRERSMzIJeVwrMHhmK2ZmZmZmZmMKLSAgNmM6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0JCQk2YzogUl9QUENfQUREUjMyCXpcKzB4ZitmZmZmZmZjCi0gIDcwOglmZiBmZiBmZiA5YyAJXC5sb25nIDB4ZmZmZmZmOWMKLSAgNzQ6CWZmIGZmIGZmIDljIAlcLmxvbmcgMHhmZmZmZmY5YwotCVwuXC5cLgotCQkJNzg6IFJfUFBDX0FERFIzMglhCi0JCQk3YzogUl9QUENfQUREUjMyCWIKLQkJCTgwOiBSX1BQQ19BRERSMzIJYXBmb3VyCi0gIDg0OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotICA4ODoJMDAgMDAgMDAgMDIgCVwubG9uZyAweDIKLQkJCTg4OiBSX1BQQ19BRERSMzIJYXBmb3VyXCsweDIKLSAgOGM6CTAwIDAwIDAwIDAwIAlcLmxvbmcgMHgwCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwuZGF0YToKLQotMCswMDAwMDAwIDx4PjoKLSAgIDA6CTAwIDAwIDAwIDAwIAlcLmxvbmcgMHgwCi0KLTArMDAwMDAwNCA8eT46Ci0gICA0OgkwMCAwMCAwMCAwMCAJXC5sb25nIDB4MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWFmMjE2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QucworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLQkuc2VjdGlvbiAiLmRhdGEiCi0JLmdsb2JsIHgKLQkuZ2xvYmwgegoteDoJLmxvbmcgMAotegk9IC4gKyA0Ci1mb3VyCT0geiAtIHggLSA0Ci15OgkubG9uZyAwCi0JCi0JLnNlY3Rpb24gIi50ZXh0IgotZm9vOgkKLQlub3AgOyBub3AgOyBub3AKLQkuZ2xvYmwgYQotYToJYiAuKzQKLWI6CWIgLis4Ci0JYiB4Ci0JYiB5Ci0JYiB6Ci0JYiB6KzIwCi0JYiAuK2ZvdXIKLQliIGEKLQliIGIKLQliIGErNAotCWIgYis0Ci0JYiBhQGxvY2FsCi0JYiBiQGxvY2FsCi0JLmxvbmcgLgotCS5sb25nIC4rOAotCS5sb25nIHgtLgotCS5sb25nIHgrNC0uCi0JLmxvbmcgei0uCi0JLmxvbmcgeS0uCi0JLmxvbmcgeAotCS5sb25nIHkKLQkubG9uZyB6Ci0JLmxvbmcgeC1mb3VyCi0JLmxvbmcgeS1mb3VyCi0JLmxvbmcgei1mb3VyCi0JLmxvbmcgYS0uCi0JLmxvbmcgYi0uCi0JLmxvbmcgYQotCS5sb25nIGIKLQotYXBmb3VyCT0gYSArIGZvdXIKLQkubG9uZyBhcGZvdXIKLQkubG9uZyBhLWFwZm91cgotCS5sb25nIGFwZm91cisyCi0JLmxvbmcgYXBmb3VyLWIKLQotCS50eXBlCWZvbyxAZnVuY3Rpb24KLQkudHlwZQlhLEBmdW5jdGlvbgotCS50eXBlCWIsQGZ1bmN0aW9uCi0JLnR5cGUJYXBmb3VyLEBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MGUzYmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIuZAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSNvYmpkdW1wOiAtRHIKLSNuYW1lOiBQb3dlclBDIHRlc3QgMgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLXBvd2VycGMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwMDAwIDxmb28+OgotICAgMDoJNjAgMDAgMDAgMDAgCW5vcAotICAgNDoJNjAgMDAgMDAgMDAgCW5vcAotICAgODoJNjAgMDAgMDAgMDAgCW5vcAotICAgYzoJNDggMDAgMDAgMDQgCWIJMTAgPGZvb1wrMHgxMD4KLSAgMTA6CTQ4IDAwIDAwIDA4IAliCTE4IDxmb29cKzB4MTg+Ci0gIDE0Ogk0OCAwMCAwMCAwMCAJYgkxNCA8Zm9vXCsweDE0PgotCQkJMTQ6IFJfUFBDX1JFTDI0CXgKLSAgMTg6CTQ4IDAwIDAwIDA0IAliCTFjIDxmb29cKzB4MWM+Ci0JCQkxODogUl9QUENfUkVMMjQJLmRhdGFcKzB4NAotICAxYzoJNDggMDAgMDAgMDAgCWIJMWMgPGZvb1wrMHgxYz4KLQkJCTFjOiBSX1BQQ19SRUwyNAl6Ci0gIDIwOgk0OCAwMCAwMCAxNCAJYgkzNCA8Zm9vXCsweDM0PgotCQkJMjA6IFJfUFBDX1JFTDI0CXpcKzB4MTQKLSAgMjQ6CTQ4IDAwIDAwIDA0IAliCTI4IDxmb29cKzB4Mjg+Ci0gIDI4Ogk0OCAwMCAwMCAwMCAJYgkyOCA8Zm9vXCsweDI4PgotCQkJMjg6IFJfUFBDX1JFTDI0CWEKLSAgMmM6CTQ4IDAwIDAwIDUwIAliCTdjIDxhcGZvdXI+Ci0gIDMwOgk0OCAwMCAwMCAwNCAJYgkzNCA8Zm9vXCsweDM0PgotCQkJMzA6IFJfUFBDX1JFTDI0CWFcKzB4NAotICAzNDoJNDggMDAgMDAgNGMgCWIJODAgPGFwZm91clwrMHg0PgotICAzODoJNDggMDAgMDAgMDAgCWIJMzggPGZvb1wrMHgzOD4KLQkJCTM4OiBSX1BQQ19MT0NBTDI0UEMJYQotICAzYzoJNDggMDAgMDAgNDAgCWIJN2MgPGFwZm91cj4KLQotICA0MDoJMDAgMDAgMDAgNDAgCS5sb25nIDB4NDAKLQkJCTQwOiBSX1BQQ19BRERSMzIJLnRleHRcKzB4NDAKLQotICA0NDoJMDAgMDAgMDAgNGMgCS5sb25nIDB4NGMKLQkJCTQ0OiBSX1BQQ19BRERSMzIJLnRleHRcKzB4NGMKLSAgNDg6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKLQkJCTQ4OiBSX1BQQ19SRUwzMgl4Ci0gIDRjOgkwMCAwMCAwMCAwNCAJLmxvbmcgMHg0Ci0JCQk0YzogUl9QUENfUkVMMzIJeFwrMHg0Ci0JLi4uCi0JCQk1MDogUl9QUENfUkVMMzIJegotCQkJNTQ6IFJfUFBDX1JFTDMyCXkKLQkJCTU4OiBSX1BQQ19BRERSMzIJeAotCQkJNWM6IFJfUFBDX0FERFIzMgl5Ci0JCQk2MDogUl9QUENfQUREUjMyCXoKLSAgNjQ6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0JCQk2NDogUl9QUENfQUREUjMyCXhcKzB4ZitmZmZmZmZjCi0gIDY4OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotCQkJNjg6IFJfUFBDX0FERFIzMgl5XCsweGYrZmZmZmZmYwotICA2YzoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKLQkJCTZjOiBSX1BQQ19BRERSMzIJelwrMHhmK2ZmZmZmZmMKLSAgNzA6CTAwIDAwIDAwIDA4IAkubG9uZyAweDgKLSAgNzQ6CTAwIDAwIDAwIDA4IAkubG9uZyAweDgKLQotMCswMDAwMDc4IDxhPjoKLSAgNzg6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKLQkJCTc4OiBSX1BQQ19BRERSMzIJYQotCi0wKzAwMDAwN2MgPGFwZm91cj46Ci0JLi4uCi0JCQk3YzogUl9QUENfQUREUjMyCWIKLQkJCTgwOiBSX1BQQ19BRERSMzIJYXBmb3VyCi0gIDg0OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotICA4ODoJMDAgMDAgMDAgMDIgCS5sb25nIDB4MgotCQkJODg6IFJfUFBDX0FERFIzMglhcGZvdXJcKzB4MgotICA4YzoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MAotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAuZGF0YToKLQotMCswMDAwMDAwIDx4PjoKLSAgIDA6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKLQotMCswMDAwMDA0IDx5PjoKLSAgIDQ6CTAwIDAwIDAwIDAwIAkubG9uZyAweDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWYyMjMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1mb3VyCT0gNAotCS5zZWN0aW9uICIudGV4dCIKLWZvbzoJCi0Jbm9wIDsgbm9wIDsgbm9wCi0JLmdsb2JsIGEKLQliIC4rNAotCWIgLis4Ci0JYiB4Ci0JYiB5Ci0JYiB6Ci0JYiB6KzIwCi0JYiAuK2ZvdXIKLQliIGEKLQliIGIKLQliIGErNAotCWIgYis0Ci0JYiBhQGxvY2FsCi0JYiBiQGxvY2FsCi0JLmxvbmcgLgotCS5sb25nIC4rOAotCS5sb25nIHgtLgotCS5sb25nIHgrNC0uCi0JLmxvbmcgei0uCi0JLmxvbmcgeS0uCi0JLmxvbmcgeAotCS5sb25nIHkKLQkubG9uZyB6Ci0JLmxvbmcgeC1mb3VyCi0JLmxvbmcgeS1mb3VyCi0JLmxvbmcgei1mb3VyCi0JLmxvbmcgYS0uCi0JLmxvbmcgYi0uCi1hOgkubG9uZyBhCi1iOgkubG9uZyBiCi0KLWFwZm91cgk9IGEgKyBmb3VyCi0JLmxvbmcgYXBmb3VyCi0JLmxvbmcgYS1hcGZvdXIKLQkubG9uZyBhcGZvdXIrMgotCS5sb25nIGFwZm91ci1iCi0KLQkuc2VjdGlvbiAiLmRhdGEiCi0JLmdsb2JsIHgKLQkuZ2xvYmwgegoteDoJLmxvbmcgMAotegk9IC4gKyA0Ci15OgkubG9uZyAwCi0KLQkudHlwZQlmb28sQGZ1bmN0aW9uCi0JLnR5cGUJYSxAZnVuY3Rpb24KLQkudHlwZQliLEBmdW5jdGlvbgotCS50eXBlCWFwZm91cixAZnVuY3Rpb24KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9wcGMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3BwYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MmZiYzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3BwYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jCi0jIFNvbWUgUG93ZXJQQyB0ZXN0cwotIwotCi0jIFRoZXNlIHRlc3RzIGFyZSBjdXJyZW50bHkgRUxGIHNwZWNpZmljLCBvbmx5IGJlY2F1c2Ugbm9ib2R5IGhhcwotIyBjb252ZXJ0ZWQgdGhlbSB0byBsb29rIGZvciBYQ09GRiByZWxvY2F0aW9ucy4KLQotaWYgeyBbaXN0YXJnZXQgcG93ZXJwYyotKi0qYnNkKl0gXAotICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1lbGYqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWVhYmkqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLXN5c3Y0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1saW51eCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotc29sYXJpcypdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotcnRlbXMqXSB9IHRoZW4gewotICAgIHJ1bl9kdW1wX3Rlc3QgImFzdGVzdCIKLSAgICBydW5fZHVtcF90ZXN0ICJhc3Rlc3QyIgotfQotCi1pZiB7IFtpc3RhcmdldCBwb3dlcnBjKi0qLSpdIH0gdGhlbiB7Ci0gICBydW5fZHVtcF90ZXN0ICJzaW1wc2hmdCIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9zaW1wc2hmdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODkzZDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jb2JqZHVtcDogLXMgLWogLnRleHQKLSNhczogLW1wcGM2NAotI25hbWU6IFBvd2VyUEMgdGVzdCAzLCBzaW1wbGlmaWVkIHNoaWZ0cwotCi0uKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIFwudGV4dDoKLSAwMDAwIDc4NjQwZmUwIDc4ODNmODBlIDc4YTU0NWU0IDc4NjQwMDIwICB4ZC4ueC4uLnguRS54ZC4gCi0gMDAxMCA1NDY0MGZmZSA1MDgzZjgwMCA1NGE1NDAyZSA1NDY0MDQzZSAgVGQuLlAuLi5ULkAuVGQuPgotIDAwMjAgNzg2NDAwMDQgNzg2NDA3ZTQgNzg2NGY4MDYgNzg2NGZmZTYgIHhkLi54ZC4ueGQuLnhkLi4KLSAwMDMwIDc4NjRmODQyIDc4NjRmZmUyIDc4NjQwMDBjIDc4NjQwODBjICB4ZC5CeGQuLnhkLi54ZC4uCi0gMDA0MCA3ODY0MGZhYyA3ODY0MDdlYyA3ODY0MDAwMCA3ODY0MDgwMCAgeGQuLnhkLi54ZC4ueGQuLgotIDAwNTAgNzg2NGY4MDIgNzg2NDAwMDAgNzg2NGY4MDIgNzg2NDA4MDAgIHhkLi54ZC4ueGQuLnhkLi4KLSAwMDYwIDc4NjUyMDEwIDc4NjQwN2U0IDc4NjRmODA2IDc4NjQwMDAwICB4ZSAueGQuLnhkLi54ZC4uCi0gMDA3MCA3ODY0Zjg0MiA3ODY0MGZlMCA3ODY0MDAwMCA3ODY0MDA0MCAgeGQuQnhkLi54ZC4ueGQuQAotIDAwODAgNzg2NDA3ZTAgNzg2NDA3ZTQgNzg2NDA3YTQgNzg2NDAwMDQgIHhkLi54ZC4ueGQuLnhkLi4KLSAwMDkwIDc4NjQwMDA4IDc4NjQwMDQ4IDc4NjQwN2U4IDc4NjQwZmE4ICB4ZC4ueGQuSHhkLi54ZC4uCi0gMDBhMCA3ODY0ZjgwYSA1NDY0MDAwMCA1NDY0MDAzZSA1NDY0ZjgwMCAgeGQuLlRkLi5UZC4+VGQuLgotIDAwYjAgNTQ2NGY4M2UgNTQ2NGY4N2UgNTQ2NGZmZmUgNTA2NDAwMDAgIFRkLj5UZC5+VGQuLlBkLi4KLSAwMGMwIDUwNjQwMDNlIDUwNjQwZmZlIDUwNjRmODAwIDUwNjQwMDNlICBQZC4+UGQuLlBkLi5QZC4+Ci0gMDBkMCA1MDY0MDdmZSA1NDY0MDAzZSA1NDY0MDgzZSA1NDY0ZjgzZSAgUGQuLlRkLj5UZC4+VGQuPgotIDAwZTAgNTQ2NDAwM2UgNTQ2NGY4M2UgNTQ2NDA4M2UgNWM2NTIwM2UgIFRkLj5UZC4+VGQuPlxcZSA+Ci0gMDBmMCA1NDY0MDAzZSA1NDY0MDgzYyA1NDY0ZjgwMCA1NDY0MDAzZSAgVGQuPlRkLjxUZC4uVGQuPgotIDAxMDAgNTQ2NGY4N2UgNTQ2NDBmZmUgNTQ2NDAwM2UgNTQ2NDAwN2UgIFRkLn5UZC4uVGQuPlRkLn4KLSAwMTEwIDU0NjQwN2ZlIDU0NjQwMDNlIDU0NjQwMDNjIDU0NjQwMDAwICBUZC4uVGQuPlRkLjxUZC4uCi0gMDEyMCA1NDY0MDAzZSA1NDY0MDA3ZSA1NDY0MDdmZSA1NDY0MGZiYyAgVGQuPlRkLn5UZC4uVGQuLgotIDAxMzAgNTQ2NGY4MDAgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgIFRkLi4uLi4uICAgICAgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9zaW1wc2hmdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZmY5OGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIyBUaGVzZSBhcmUgYWxsIHRoZSBleGFtcGxlcyBmcm9tIHNlY3Rpb24gRi40IG9mCi0jICJQb3dlclBDIE1pY3JvcHJvY2Vzc29yIEZhbWlseTogVGhlIFByb2dyYW1taW5nIEVudmlyb25tZW50cyIuCi0jIDY0LWJpdCBleGFtcGxlcwotCWV4dHJkaQklcjQsJXIzLDEsMAotCWluc3JkaQklcjMsJXI0LDEsMAotCXNsZGkJJXI1LCVyNSw4Ci0JY2xybGRpCSVyNCwlcjMsMzIKLSMgMzItYml0IGV4YW1wbGVzCi0JZXh0cndpCSVyNCwlcjMsMSwwCi0JaW5zcndpCSVyMywlcjQsMSwwCi0Jc2x3aQklcjUsJXI1LDgKLQljbHJsd2kJJXI0LCVyMywxNgotCi0KLSMgVGhlc2UgdGVzdCB0aGUgcmVtYWluaW5nIGNvcm5lciBjYXNlcyBmb3IgNjQtYml0IG9wZXJhdGlvbnMuCi0JZXh0bGRpCSVyNCwlcjMsMSwwCi0JZXh0bGRpCSVyNCwlcjMsNjQsMAotCWV4dGxkaQklcjQsJXIzLDEsNjMKLQlleHRsZGkJJXI0LCVyMyw2NCw2MyAgICAjIGJpdCB3ZWlyZCwgdGhhdCBvbmUuCi0JCi0JZXh0cmRpCSVyNCwlcjMsNjMsMAotCWV4dHJkaQklcjQsJXIzLDEsNjIKLQotCWluc3JkaQklcjQsJXIzLDY0LDAKLQlpbnNyZGkJJXI0LCVyMyw2MywwCi0JaW5zcmRpCSVyNCwlcjMsMSw2MgotCWluc3JkaQklcjQsJXIzLDEsNjMKLQotCXJvdGxkaQklcjQsJXIzLDAKLQlyb3RsZGkJJXI0LCVyMywxCi0Jcm90bGRpCSVyNCwlcjMsNjMKLQotCXJvdHJkaQklcjQsJXIzLDAKLQlyb3RyZGkJJXI0LCVyMywxCi0Jcm90cmRpCSVyNCwlcjMsNjMKLQotCXJvdGxkCSVyNSwlcjMsJXI0Ci0KLQlzbGRpCSVyNCwlcjMsMAotCXNsZGkJJXI0LCVyMyw2MwotCi0Jc3JkaQklcjQsJXIzLDAKLQlzcmRpCSVyNCwlcjMsMQotCXNyZGkJJXI0LCVyMyw2MwotCi0JY2xybGRpCSVyNCwlcjMsMAotCWNscmxkaQklcjQsJXIzLDEKLQljbHJsZGkJJXI0LCVyMyw2MwotCi0JY2xycmRpCSVyNCwlcjMsMAotCWNscnJkaQklcjQsJXIzLDEKLQljbHJyZGkJJXI0LCVyMyw2MwotCQotCWNscmxzbGRpCSVyNCwlcjMsMCwwCi0JY2xybHNsZGkJJXI0LCVyMywxLDAKLQljbHJsc2xkaQklcjQsJXIzLDYzLDAKLQljbHJsc2xkaQklcjQsJXIzLDYzLDEKLQljbHJsc2xkaQklcjQsJXIzLDYzLDYzCi0JCi0jIFRoZXNlIHRlc3QgdGhlIHJlbWFpbmluZyBjb3JuZXIgY2FzZXMgZm9yIDMyLWJpdCBvcGVyYXRpb25zLgotCWV4dGx3aQklcjQsJXIzLDEsMAotCWV4dGx3aQklcjQsJXIzLDMyLDAKLQlleHRsd2kJJXI0LCVyMywxLDMxCi0JZXh0bHdpCSVyNCwlcjMsMzIsMzEgICAgIyBiaXQgd2VpcmQsIHRoYXQgb25lLgotCQotCWV4dHJ3aQklcjQsJXIzLDMxLDAKLQlleHRyd2kJJXI0LCVyMywxLDMwCi0JCi0JaW5zbHdpCSVyNCwlcjMsMSwwCi0JaW5zbHdpCSVyNCwlcjMsMzIsMAotCWluc2x3aQklcjQsJXIzLDEsMzEKLQkKLQlpbnNyd2kJJXI0LCVyMywxLDAKLQlpbnNyd2kJJXI0LCVyMywzMiwwCi0JaW5zcndpCSVyNCwlcjMsMSwzMQotCQotCXJvdGx3aQklcjQsJXIzLDAKLQlyb3Rsd2kJJXI0LCVyMywxCi0Jcm90bHdpCSVyNCwlcjMsMzEKLQotCXJvdHJ3aQklcjQsJXIzLDAKLQlyb3Ryd2kJJXI0LCVyMywxCi0Jcm90cndpCSVyNCwlcjMsMzEKLQotCXJvdGx3CSVyNSwlcjMsJXI0Ci0KLQlzbHdpCSVyNCwlcjMsMAotCXNsd2kJJXI0LCVyMywxCi0Jc2x3aQklcjQsJXIzLDMxCi0KLQlzcndpCSVyNCwlcjMsMAotCXNyd2kJJXI0LCVyMywxCi0Jc3J3aQklcjQsJXIzLDMxCi0KLQljbHJsd2kJJXI0LCVyMywwCi0JY2xybHdpCSVyNCwlcjMsMQotCWNscmx3aQklcjQsJXIzLDMxCi0KLQljbHJyd2kJJXI0LCVyMywwCi0JY2xycndpCSVyNCwlcjMsMQotCWNscnJ3aQklcjQsJXIzLDMxCi0JCi0JY2xybHNsd2kJJXI0LCVyMywwLDAKLQljbHJsc2x3aQklcjQsJXIzLDEsMAotCWNscmxzbHdpCSVyNCwlcjMsMzEsMAotCWNscmxzbHdpCSVyNCwlcjMsMzEsMQotCWNscmxzbHdpCSVyNCwlcjMsMzEsMzEKLQotIyBGb3JjZSBhbGlnbm1lbnQgc28gdGhhdCB3ZSBwYXNzIHRoZSB0ZXN0IG9uIEFJWAotCS5wMmFsaWduCTMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2Jhc2ljLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2Jhc2ljLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkYmIwYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zaC9iYXNpYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19mcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmcC5zOiBmbG9hdGluZyBwb2ludCB0ZXN0cyAoc2gzZSkiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJmcC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYwMDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYwMEJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEYwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEYwMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEYxMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEYwOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEYwOURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEYxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEYxMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEYxMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEYxMDNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEYxMEVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEYxMDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEYxMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEYwNERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEYwNURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEYwNkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEYwMkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEYwM0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEYwMERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYwMURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIDQzNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDQzNTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIDQzNkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDQzNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IDAzNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDQzNTJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNhIDAzNkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDQzNjJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTMxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi0KLWlmIFtpc3RhcmdldCBzaCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19mcAotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvZnAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2ZwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MmQ4NjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvZnAucworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLQkuZmlsZQkidGVzdC5jIgotCS5kYXRhCi0KLSEgSGl0YWNoaSBTSCBjYzEgKGN5Z251cy0yLjcuMS05NTA3MjgpIGFyZ3VtZW50czogLU8gLWZwZWVwaG9sZQotISAtZmZ1bmN0aW9uLWNzZSAtZnJlZy1zdHJ1Y3QtcmV0dXJuIC1mZGVsYXllZC1icmFuY2ggLWZjb21tb24gLWZnbnUtbGlua2VyCi0KLWdjYzJfY29tcGlsZWQuOgotX19fZ251X2NvbXBpbGVkX2M6Ci0JLnRleHQKLQkuYWxpZ24gMgotCS5nbG9iYWwJX2ZvbwotX2ZvbzoKLQlmbW92LnMJQHIwLGZyMAotCWZtb3YucwlmcjAsQHIwCi0JZm1vdi5zCUByMCssZnIwCi0JZm1vdi5zCWZyMCxALXIwCi0JZm1vdi5zCUAocjAscjApLGZyMAotCWZtb3YucwlmcjAsQChyMCxyMCkKLQlmbW92CWZyMCxmcjEKLQlmbGRpMAlmcjAKLQlmbGRpMQlmcjAKLQlmYWRkCWZyMCxmcjEKLQlmc3ViCWZyMCxmcjEKLQlmbXVsCWZyMCxmcjEKLQlmZGl2CWZyMCxmcjEKLQlmbWFjCWZyMCxmcjAsZnIxCi0JZmNtcC9lcQlmcjAsZnIxCi0JZmNtcC9ndAlmcjAsZnIxCi0JZm5lZwlmcjAKLQlmYWJzCWZyMAotCWZzcXJ0CWZyMAotCWZsb2F0CWZwdWwsZnIwCi0JZnRyYwlmcjAsZnB1bAotCWZzdHMJZnB1bCxmcjAKLQlmbGRzCWZyMCxmcHVsCi0JbGRzCXIzLGZwdWwKLQlsZHMubAlAcjMrLGZwdWwKLQlsZHMJcjMsZnBzY3IKLQlsZHMubAlAcjMrLGZwc2NyCi0Jc3RzCWZwdWwscjMKLQlzdHMubAlmcHVsLEAtcjMKLQlzdHMJZnBzY3IscjMKLQlzdHMubAlmcHNjcixALXIzCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4MzhjNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2FkZGVuZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jCi0jIFNvbGFyaXMgb24gU1BBUkMgdGVzdHMKLSMKLQotaWYgW2lzdGFyZ2V0IHNwYXJjKi0qLXNvbGFyaXMyKl0gdGhlbiB7Ci0gICAgc2V0IHgxIDAKLSAgICBzZXQgeDIgMAotICAgIHNldCB4MyAwCi0gICAgc2V0IHg0IDAKLSAgICBzZXQgeDUgMAotICAgIHNldCB4NiAwCi0gICAgc2V0IHRlc3RuYW1lICJhZGRlbmRzIChwYXJ0IDIpIgotICAgIGlmIFtnYXNfdGVzdF9vbGQgImFkZGVuZC5zIiAiIiAiYWRkZW5kcyAocGFydCAxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCXdoaWxlIDEgewotCSAgICAjIFRoZXNlIGFyZSB3aGF0IHdlIGdldCB1c2luZyB0aGUgU29sYXJpcyBhc3NlbWJsZXIuCi0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiMDggUl9TUEFSQ19XRElTUDIyICtmb28xXFsrXF0rMHgwKzA0XFteXG5cXSpcbiIJeyBpbmNyIHgxIH0KLQkJLXJlICIwYyBSX1NQQVJDX1dESVNQMjIgK2ZvbzFcWytcXSsweDArMDRcW15cblxdKlxuIgl7IGluY3IgeDIgfQotCQktcmUgIjEwIFJfU1BBUkNfV0RJU1AyMiArZm9vMVxbXlxuXF0qXG4iCQl7IGluY3IgeDMgfQotCQktcmUgIjE0IFJfU1BBUkNfV0RJU1AyMiArZm9vMVxbXlxuXF0qXG4iCQl7IGluY3IgeDQgfQotCQktcmUgIjFjIFJfU1BBUkNfMzIgK2ZvbzFcW15cblxdKlxuIgkJCXsgaW5jciB4NSB9Ci0JCS1yZSAiMjAgUl9TUEFSQ18zMiArZm9vMVxbK1xdKzB4MCswNFxbXlxuXF0qXG4iCQl7IGluY3IgeDYgfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0Jb2JqZHVtcF9maW5pc2gKLQlpZiBbYWxsX29uZXMgJHgxICR4MiAkeDMgJHg0ICR4NSAkeDZdIHRoZW4gewotCSAgICBwYXNzICR0ZXN0bmFtZQotCX0gZWxzZSB7Ci0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2FkZGVuZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGViMTA4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JLmdsb2JhbCBmb28KLWZvbzoKLQlub3AKLQlub3AKLQliYSBmb28xKzB4NAotCWJhIGZvbzErMHg0Ci0JYmEgZm9vMQotCWJhIGZvbzEKLQlub3AKLQkud29yZCBmb28xCi0JLndvcmQgZm9vMSs0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2dhcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2dhcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYWY2OTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9nYXMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIwotIyBTb2xhcmlzLTIgb24gU1BBUkMgdGVzdHMKLSMKLSMgVGhlIHR3byBjb21waWxlcnMsIGNjIGFuZCBnY2MsIGdlbmVyYXRlIHF1aXRlIGRpZmZlcmVudCBkZWJ1Z2dpbmcKLSMgcmVjb3Jkcy4gIFZlcmlmeSB0aGF0IHdlIGNhbiBhY2NlcHQgYm90aC4KLSMKLWlmIFtpc3RhcmdldCBzcGFyYy0qLXNvbGFyaXMyKl0gdGhlbiB7Ci0gICAgZ2FzX3Rlc3QgInNvbC1jYy5zIiAgIiIgJHN0ZG9wdGxpc3QgIlNQQVJDIFNvbGFyaXMgY2MgLWciCi0gICAgZ2FzX3Rlc3QgInNvbC1nY2MucyIgIiIgJHN0ZG9wdGxpc3QgIlNQQVJDIFNvbGFyaXMgZ2NjIC1nIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtY2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvc29sLWNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjUwZGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtY2MucworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLQkuc2VjdGlvbiAiLnRleHQiCQkJISBbaW50ZXJuYWxdCi0JLnByb2MJNAotCS5nbG9iYWwJbWFpbgotCS5hbGlnbgk0Ci0JLmdsb2JhbAltYWluCi1tYWluOgotISNQUk9MT0dVRSMgMAotISNQUk9MT0dVRSMgMQotCXNhdmUJJXNwLC05Niwlc3AKLQlzZXRoaQklaGkoLkwxOCksJW8wCi0Jc2V0aGkJJWhpKG1zZyksJW8xCi0Jb3IJJW8xLCVsbyhtc2cpLCVvMQkhIFtpbnRlcm5hbF0KLQljYWxsCXByaW50ZiwyCi0Jb3IJJW8wLCVsbyguTDE4KSwlbzAJISBbaW50ZXJuYWxdCi0JcmV0Ci0JcmVzdG9yZQklZzAsMCwlbzAKLQkudHlwZQltYWluLCNmdW5jdGlvbgotCS5zaXplCW1haW4sKC4tbWFpbikKLQkuc2VjdGlvbiAiLmRhdGEiCQkJISBbaW50ZXJuYWxdCi0JLmFsaWduCTQKLURkYXRhLmRhdGE6Ci0JLnNlY3Rpb24gIi5ic3MiCQkJISBbaW50ZXJuYWxdCi1CYnNzLmJzczoKLQkuc2VjdGlvbiAiLnJvZGF0YSIJCSEgW2ludGVybmFsXQotRHJvZGF0YS5yb2RhdGE6Ci0JLmZpbGUJImhpLXNvbC5jIgotCS5nbG9iYWwJbXNnCi0JLmdsb2JhbAltc2cKLW1zZzoKLQkuYXNjaWkJImhlbGxvLCB3b3JsZCFcMCIKLQkudHlwZQltc2csI29iamVjdAotCS5zaXplCW1zZywxNAotCS5zZWN0aW9uICIuZGF0YTEiLCAjd3JpdGUsICNhbGxvYyAhIFtpbnRlcm5hbF0KLQkuYWxpZ24JNAotLkwxODoKLQkuYXNjaWkJIiVzXG5cMCIKLQkuaWRlbnQJImFjb21wOiAoQ0RTKSBTUEFSQ29tcGlsZXJzIDIuMC4xIDAzIFNlcCAxOTkyIgotCS5zZWN0aW9uICJ0ZXh0IgkJCSEgW2ludGVybmFsXQotCS5zdGFicwkiL2N5Z2ludC9zMS91c2Vycy9yYWVidXJuLyIsMTAwLDAsMCwwCi0JLnN0YWJzCSJoaS1zb2wuYyIsMTAwLDAsMywwCi0JLnN0YWJzCSIiLDU2LDAsMCwwCi0JLnN0YWJzCSIiLDU2LDAsMCwwCi0JLnN0YWJzCSJYdCA7IGcgOyBPIDsgVj0yLjAiLDYwLDAsMCwweDJiYjc3M2JhCi0JLnN0YWJzCSJjaGFyOnQoMCwxKT1ic2MxOzA7ODsiLDEyOCwwLDAsMAotCS5zdGFicwkic2hvcnQ6dCgwLDIpPWJzMjswOzE2OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJpbnQ6dCgwLDMpPWJzNDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJsb25nOnQoMCw0KT1iczQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkibG9uZyBsb25nOnQoMCw1KT1iczg7MDs2NDsiLDEyOCwwLDAsMAotCS5zdGFicwkic2lnbmVkIGNoYXI6dCgwLDYpPWJzYzE7MDs4OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgc2hvcnQ6dCgwLDcpPWJzMjswOzE2OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgaW50OnQoMCw4KT1iczQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkic2lnbmVkIGxvbmc6dCgwLDkpPWJzNDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgbG9uZyBsb25nOnQoMCwxMCk9YnM4OzA7NjQ7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInVuc2lnbmVkIGNoYXI6dCgwLDExKT1idWMxOzA7ODsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgc2hvcnQ6dCgwLDEyKT1idTI7MDsxNjsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgaW50OnQoMCwxMyk9YnU0OzA7MzI7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInVuc2lnbmVkIGxvbmc6dCgwLDE0KT1idTQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgbG9uZyBsb25nOnQoMCwxNSk9YnU4OzA7NjQ7IiwxMjgsMCwwLDAKLQkuc3RhYnMJImZsb2F0OnQoMCwxNik9UjE7NDsiLDEyOCwwLDAsMAotCS5zdGFicwkiZG91YmxlOnQoMCwxNyk9UjI7ODsiLDEyOCwwLDAsMAotCS5zdGFicwkibG9uZyBkb3VibGU6dCgwLDE4KT1SNjsxNjsiLDEyOCwwLDAsMAotCS5zdGFicwkidm9pZDp0KDAsMTkpPWJzMDswOzAiLDEyOCwwLDAsMAotCS5zdGFicwkibXNnOkcoMCwyMCk9YXIoMCwzKTswOzEzOygwLDEpIiwzMiwwLDE0LDAKLQkuc3RhYnMJIm1haW46RigwLDMpOygwLDMpOygwLDIxKT0qKDAsMjIpPSooMCwxKSIsMzYsMCwwLG1haW4KLQkuc3RhYnMJIm1haW4iLDQyLDAsMCwwCi0JLnN0YWJuCTE5MiwwLDEsMAotCS5zdGFibgk2OCwwLDQsMAotCS5zdGFicwkiYXJnYzpwKDAsMykiLDE2MCwwLDQsNjgKLQkuc3RhYnMJImFyZ3Y6cCgwLDIxKSIsMTYwLDAsNCw3MgotCS5zdGFicwkicHJpbnRmOlAoMCwzKSIsMzYsMCwwLDAKLQkuc3RhYm4JMjI0LDAsMSwwCi0JLnN0YWJzCSIiLDk4LDAsMCwwCi0JLnNlY3Rpb24gInRleHQiCQkJISBbaW50ZXJuYWxdCi0JLnhzdGFicwkiLnN0YWIuaW5kZXgiLCIvY3lnaW50L3MxL3VzZXJzL3JhZWJ1cm4vIiwxMDAsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsImhpLXNvbC5jIiwxMDAsMCwzLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIiIsNTYsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIiIsNTYsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIlh0IDsgZyA7IE8gOyBWPTIuMCIsNjAsMCwwLDB4MmJiNzczYmEKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIm1zZyIsMzIsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIm1haW4iLDQyLDAsMCwwCi0JLnhzdGFicwkiLnN0YWIuaW5kZXgiLCJtYWluIiwzNiwwLDAsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtZ2NjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1nY2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1ZmRjZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1nY2MucworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLQkuZmlsZQkiaGktc29sLmMiCi0uc3RhYnMgIi8xaC9kZXZvL3NyYy9nYXMvdGVzdHN1aXRlL2dhcy8iLDEwMCwwLDAsLkxMdGV4dDAKLS5zdGFicyAiaGktc29sLmMiLDEwMCwwLDAsLkxMdGV4dDAKLS5zZWN0aW9uCSIudGV4dCIKLS5MTHRleHQwOgotCS5zdGFicwkiZ2NjMl9jb21waWxlZC4iLCAweDNjLCAwLCAwLCAwCi0uc3RhYnMgImludDp0MT1yMTstMjE0NzQ4MzY0ODsyMTQ3NDgzNjQ3OyIsMTI4LDAsMCwwCi0uc3RhYnMgImNoYXI6dDI9cjI7MDsxMjc7IiwxMjgsMCwwLDAKLS5zdGFicyAibG9uZyBpbnQ6dDM9cjE7LTIxNDc0ODM2NDg7MjE0NzQ4MzY0NzsiLDEyOCwwLDAsMAotLnN0YWJzICJ1bnNpZ25lZCBpbnQ6dDQ9cjE7MDstMTsiLDEyOCwwLDAsMAotLnN0YWJzICJsb25nIHVuc2lnbmVkIGludDp0NT1yMTswOy0xOyIsMTI4LDAsMCwwCi0uc3RhYnMgInNob3J0IGludDp0Nj1yMTstMzI3Njg7MzI3Njc7IiwxMjgsMCwwLDAKLS5zdGFicyAibG9uZyBsb25nIGludDp0Nz1yMTswOy0xOyIsMTI4LDAsMCwwCi0uc3RhYnMgInNob3J0IHVuc2lnbmVkIGludDp0OD1yMTswOzY1NTM1OyIsMTI4LDAsMCwwCi0uc3RhYnMgImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQ6dDk9cjE7MDstMTsiLDEyOCwwLDAsMAotLnN0YWJzICJzaWduZWQgY2hhcjp0MTA9cjE7LTEyODsxMjc7IiwxMjgsMCwwLDAKLS5zdGFicyAidW5zaWduZWQgY2hhcjp0MTE9cjE7MDsyNTU7IiwxMjgsMCwwLDAKLS5zdGFicyAiZmxvYXQ6dDEyPXIxOzQ7MDsiLDEyOCwwLDAsMAotLnN0YWJzICJkb3VibGU6dDEzPXIxOzg7MDsiLDEyOCwwLDAsMAotLnN0YWJzICJsb25nIGRvdWJsZTp0MTQ9cjE7ODswOyIsMTI4LDAsMCwwCi0uc3RhYnMgInZvaWQ6dDE1PTE1IiwxMjgsMCwwLDAKLS5zdGFicyAibXNnOkcxNj1hcjE7MDsxMzsyIiwzMiwwLDAsMAotCS5nbG9iYWwgbXNnCi0uc2VjdGlvbgkiLnJvZGF0YSIKLQkuYWxpZ24gOAotCS50eXBlCSBtc2csI29iamVjdAotCS5zaXplCSBtc2csMTQKLW1zZzoKLQkuYXNjaXoJImhlbGxvLCB3b3JsZCEiCi0JLmFsaWduIDgKLS5MTEMwOgotCS5hc2NpegkiJXNcbiIKLS5zZWN0aW9uCSIudGV4dCIKLQkuYWxpZ24gNAotLnN0YWJzICJtYWluOkYxIiwzNiwwLDAsbWFpbgotLnN0YWJzICJhcmdjOlAxIiw2NCwwLDAsMjQKLS5zdGFicyAiYXJndjpQMTc9KjE4PSoyIiw2NCwwLDAsMjUKLQkuZ2xvYmFsIG1haW4KLQkudHlwZQkgbWFpbiwjZnVuY3Rpb24KLQkucHJvYwkwNAotbWFpbjoKLS5zdGFibiA2OCwwLDQsLkxNMS1tYWluCi0uTE0xOgotCSEjUFJPTE9HVUUjIDAKLQlzYXZlICVzcCwtMTEyLCVzcAotCSEjUFJPTE9HVUUjIDEKLS5zdGFibiA2OCwwLDUsLkxNMi1tYWluCi0uTE0yOgotLkxMQkIyOgotCXNldGhpICVoaSguTExDMCksJW8wCi0Jb3IgJW8wLCVsbyguTExDMCksJW8wCi0Jc2V0aGkgJWhpKG1zZyksJW8xCi0JY2FsbCBwcmludGYsMAotCW9yICVvMSwlbG8obXNnKSwlbzEKLS5zdGFibiA2OCwwLDYsLkxNMy1tYWluCi0uTE0zOgotLnN0YWJuIDY4LDAsNywuTE00LW1haW4KLS5MTTQ6Ci0uTExCRTI6Ci0JcmV0Ci0JcmVzdG9yZSAlZzAsMCwlbzAKLS5MTGZlMToKLQkuc2l6ZQkgbWFpbiwuTExmZTEtbWFpbgotLnN0YWJuIDE5MiwwLDAsLkxMQkIyLW1haW4KLS5zdGFibiAyMjQsMCwwLC5MTEJFMi1tYWluCi0JLmlkZW50CSJHQ0M6IChHTlUpIGN5Z251cy0yLjMuMyIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNWVhMWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jYXM6IC1BdjkKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBzcGFyYzY0IGFzaQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+OgotICAgMDoJYzQgODAgNDAgMDAgCWxkYSAgXFsgJWcxIFxdIFwoMFwpLCAlZzIKLSAgIDQ6CWM0IDgwIDVmIGUwIAlsZGEgIFxbICVnMSBcXSBcKDI1NVwpLCAlZzIKLSAgIDg6CWM0IDgwIDQyIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVAsICVnMgotICAgYzoJYzQgODAgNDIgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUywgJWcyCi0gIDEwOgljNCA4MCA0MyAwMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVQX0wsICVnMgotICAxNDoJYzQgODAgNDMgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVU19MLCAlZzIKLSAgMTg6CWM0IDgwIDUwIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1AsICVnMgotICAxYzoJYzQgODAgNTAgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUywgJWcyCi0gIDIwOgljNCA4MCA1MCA0MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QTkYsICVnMgotICAyNDoJYzQgODAgNTAgNjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfU05GLCAlZzIKLSAgMjg6CWM0IDgwIDUxIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BfTCwgJWcyCi0gIDJjOgljNCA4MCA1MSAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TX0wsICVnMgotICAzMDoJYzQgODAgNTEgNDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUE5GX0wsICVnMgotICAzNDoJYzQgODAgNTEgNjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfU05GX0wsICVnMgotICAzODoJYzQgODAgNDIgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUCwgJWcyCi0gIDNjOgljNCA4MCA0MiAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTLCAlZzIKLSAgNDA6CWM0IDgwIDQzIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVBfTCwgJWcyCi0gIDQ0OgljNCA4MCA0MyAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTX0wsICVnMgotICA0ODoJYzQgODAgNTAgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUCwgJWcyCi0gIDRjOgljNCA4MCA1MCAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TLCAlZzIKLSAgNTA6CWM0IDgwIDUwIDQwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BORiwgJWcyCi0gIDU0OgljNCA4MCA1MCA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkYsICVnMgotICA1ODoJYzQgODAgNTEgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUF9MLCAlZzIKLSAgNWM6CWM0IDgwIDUxIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1NfTCwgJWcyCi0gIDYwOgljNCA4MCA1MSA0MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QTkZfTCwgJWcyCi0gIDY0OgljNCA4MCA1MSA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkZfTCwgJWcyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9hc2kucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTZmZTljLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBUZXN0IGFzaSdzLgotCS50ZXh0Ci0JbGR1d2EgWyVnMV0wLCVnMgotCWxkdXdhIFslZzFdMjU1LCVnMgotCWxkdXdhIFslZzFdI0FTSV9BSVVQLCVnMgotCWxkdXdhIFslZzFdI0FTSV9BSVVTLCVnMgotCWxkdXdhIFslZzFdI0FTSV9BSVVQX0wsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FJVVNfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUywlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUE5GLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TTkYsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1BfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU19MLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QTkZfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU05GX0wsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FTX0lGX1VTRVJfUFJJTUFSWSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfQVNfSUZfVVNFUl9TRUNPTkRBUlksJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FTX0lGX1VTRVJfUFJJTUFSWV9MSVRUTEUsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FTX0lGX1VTRVJfU0VDT05EQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUFJJTUFSWSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QUklNQVJZX05PRkFVTFQsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1NFQ09OREFSWV9OT0ZBVUxULCVnMgotCWxkdXdhIFslZzFdI0FTSV9QUklNQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUFJJTUFSWV9OT0ZBVUxUX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZX05PRkFVTFRfTElUVExFLCVnMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWVtYmFyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiNmIyZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIuZAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSNhczogLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgbWVtYmFyCi0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDwudGV4dD46Ci0gICAwOgk4MSA0MyBlMCAwMCAJbWVtYmFyICAwCi0gICA0Ogk4MSA0MyBlMCA3ZiAJbWVtYmFyICAjU3luY3wjTWVtSXNzdWV8I0xvb2thc2lkZXwjU3RvcmVTdG9yZXwjTG9hZFN0b3JlfCNTdG9yZUxvYWR8I0xvYWRMb2FkCi0gICA4Ogk4MSA0MyBlMCA3ZiAJbWVtYmFyICAjU3luY3wjTWVtSXNzdWV8I0xvb2thc2lkZXwjU3RvcmVTdG9yZXwjTG9hZFN0b3JlfCNTdG9yZUxvYWR8I0xvYWRMb2FkCi0gICBjOgk4MSA0MyBlMCA0MCAJbWVtYmFyICAjU3luYwotICAxMDoJODEgNDMgZTAgMjAgCW1lbWJhciAgI01lbUlzc3VlCi0gIDE0Ogk4MSA0MyBlMCAxMCAJbWVtYmFyICAjTG9va2FzaWRlCi0gIDE4Ogk4MSA0MyBlMCAwOCAJbWVtYmFyICAjU3RvcmVTdG9yZQotICAxYzoJODEgNDMgZTAgMDQgCW1lbWJhciAgI0xvYWRTdG9yZQotICAyMDoJODEgNDMgZTAgMDIgCW1lbWJhciAgI1N0b3JlTG9hZAotICAyNDoJODEgNDMgZTAgMDEgCW1lbWJhciAgI0xvYWRMb2FkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODA1ZTA3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBUZXN0IG1lbWJhciBhcmdzCi0JLnRleHQKLQltZW1iYXIgMAotCW1lbWJhciAxMjcKLQltZW1iYXIgI1N5bmN8I01lbUlzc3VlfCNMb29rYXNpZGV8I1N0b3JlU3RvcmV8I0xvYWRTdG9yZXwjU3RvcmVMb2FkfCNMb2FkTG9hZAotCW1lbWJhciAjU3luYwotCW1lbWJhciAjTWVtSXNzdWUKLQltZW1iYXIgI0xvb2thc2lkZQotCW1lbWJhciAjU3RvcmVTdG9yZQotCW1lbWJhciAjTG9hZFN0b3JlCi0JbWVtYmFyICNTdG9yZUxvYWQKLQltZW1iYXIgI0xvYWRMb2FkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9taXNtLTEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc20tMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWM1ZTQ4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc20tMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotISBUZXN0IGFyY2hpdGVjdHVyZSBtaXNtYXRjaCB3YXJuaW5ncy4KLSEgV2UgZG9uJ3QgdGVzdCBldmVyeSBwb3NzaWJsZSBtaXNtYXRjaCwgd2UganVzdCB3YW50IHRvIGJlIHJlYXNvbmFibGUgc3VyZQotISB0aGUgbWlzbWF0Y2ggY2hlY2tpbmcgY29kZSB3b3Jrcy4KLSEKLSEgeyBkZy1kbyBhc3NlbWJsZSB7IHRhcmdldCBzcGFyYyotKi0qIH0gfQotISB7IGRnLW9wdGlvbnMgLUF2NiB9Ci0KLSEgc3BhcmNsaXRlCi0KLQlkaXZzY2MgJWcxLCVnMiwlZzMJISB7IGRnLWVycm9yICJtaXNtYXRjaHxzcGFyY2xpdGUiICJzcGFyY2xpdGUgZGl2c2NjIG1pc21hdGNoIiB9Ci0KLQlzY2FuICVnMSwlZzIsJWczCSEgeyBkZy1lcnJvciAibWlzbWF0Y2h8c3BhcmNsaXRlIiAic3BhcmNsaXRlIHNjYW4gbWlzbWF0Y2giIH0KLQotISB2OQotCi0JbW92cnogJWcxLCVnMiwlZzMJISB7IGRnLWVycm9yICJtaXNtYXRjaHx2OSIgInY5IGZwIHJlZyBtaXNtYXRjaCIgfQotCi0hIHY5YQotCi0Jc2h1dGRvd24JCSEgeyBkZy1lcnJvciAibWlzbWF0Y2h8djlhIiAidjlhIHNodXRkb3duIG1pc21hdGNoIiB9Ci0KLWZvbzoKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc21hdGNoLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc21hdGNoLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4OWRlMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9taXNtYXRjaC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIFRlc3QgYXJjaGl0ZWN0dXJlIG1pc21hdGNoIGVycm9ycy4KLSMKLSMgR0FTIGlzc3VlcyB0d28gbGluZXMgb2YgZXJyb3IgdGV4dCBmb3IgZWFjaCBtaXNtYXRjaDoKLSMKLSMgbW0tbGl0ZS5zOjc6IEVycm9yOiBBcmNoaXRlY3R1cmUgbWlzbWF0Y2ggb24gImRpdnNjYyIuCi0jIG1tLWxpdGUuczo3OiAgKFJlcXVpcmVzIHNwYXJjbGl0ZTsgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZSBpcyB2OC4pCi0jCi0jIFRoZSBzdWdnZXN0ZWQgcmVnZXhwIGFyZ3VtZW50IHRvIGRnLWVycm9yIGlzICJtaXNtYXRjaHw8YXJjaD4iLgotCi1pZiBbaXN0YXJnZXQgc3BhcmMqLSotKl0gewotCi0gICAgbG9hZF9saWIgZ2FzLWRnLmV4cAotCi0gICAgZGctaW5pdAotCi0gICAgZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyL21pc20tKi5zXV0gIiIgIiIKLQotICAgIGRnLWZpbmlzaAotCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2guZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmNDIxNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgcHJlZmV0Y2gKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCsgPC50ZXh0PjoKLSAgIDA6CWMxIDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjbl9yZWFkcwotICAgNDoJZmYgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sIDMxCi0gICA4OgljMSA2OCA0MCAwMCAJcHJlZmV0Y2ggIFxbICVnMSBcXSwgI25fcmVhZHMKLSAgIGM6CWMzIDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjb25lX3JlYWQKLSAgMTA6CWM1IDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjbl93cml0ZXMKLSAgMTQ6CWM3IDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjb25lX3dyaXRlCi0gIDE4OgljMSBlOCA0MiAwMCAJcHJlZmV0Y2hhICBcWyAlZzEgXF0gI0FTSV9BSVVQLCAjbl9yZWFkcwotICAxYzoJZmYgZTggNjAgMDAgCXByZWZldGNoYSAgXFsgJWcxIFxdICVhc2ksIDMxCi0gIDIwOgljMSBlOCA0MiAyMCAJcHJlZmV0Y2hhICBcWyAlZzEgXF0gI0FTSV9BSVVTLCAjbl9yZWFkcwotICAyNDoJYzMgZTggNjAgMDAgCXByZWZldGNoYSAgXFsgJWcxIFxdICVhc2ksICNvbmVfcmVhZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3ByZWZldGNoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YzY4YmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2gucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkudGV4dAotCXByZWZldGNoIFslZzFdLDAKLQlwcmVmZXRjaCBbJWcxXSwzMQotCXByZWZldGNoIFslZzFdLCNuX3JlYWRzCi0JcHJlZmV0Y2ggWyVnMV0sI29uZV9yZWFkCi0JcHJlZmV0Y2ggWyVnMV0sI25fd3JpdGVzCi0JcHJlZmV0Y2ggWyVnMV0sI29uZV93cml0ZQotCXByZWZldGNoYSBbJWcxXSNBU0lfQUlVUCwwCi0JcHJlZmV0Y2hhIFslZzFdJWFzaSwzMQotCXByZWZldGNoYSBbJWcxXSNBU0lfQUlVUywjbl9yZWFkcwotCXByZWZldGNoYSBbJWcxXSVhc2ksI29uZV9yZWFkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNmVhOWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmRwci5kCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgcmRwcgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+OgotICAgMDoJODMgNTAgMDAgMDAgCXJkcHIgICV0cGMsICVnMQotICAgNDoJODUgNTAgNDAgMDAgCXJkcHIgICV0bnBjLCAlZzIKLSAgIDg6CTg3IDUwIDgwIDAwIAlyZHByICAldHN0YXRlLCAlZzMKLSAgIGM6CTg5IDUwIGMwIDAwIAlyZHByICAldHQsICVnNAotICAxMDoJOGIgNTEgMDAgMDAgCXJkcHIgICV0aWNrLCAlZzUKLSAgMTQ6CThkIDUxIDQwIDAwIAlyZHByICAldGJhLCAlZzYKLSAgMTg6CThmIDUxIDgwIDAwIAlyZHByICAlcHN0YXRlLCAlZzcKLSAgMWM6CTkxIDUxIGMwIDAwIAlyZHByICAldGwsICVvMAotICAyMDoJOTMgNTIgMDAgMDAgCXJkcHIgICVwaWwsICVvMQotICAyNDoJOTUgNTIgNDAgMDAgCXJkcHIgICVjd3AsICVvMgotICAyODoJOTcgNTIgODAgMDAgCXJkcHIgICVjYW5zYXZlLCAlbzMKLSAgMmM6CTk5IDUyIGMwIDAwIAlyZHByICAlY2FucmVzdG9yZSwgJW80Ci0gIDMwOgk5YiA1MyAwMCAwMCAJcmRwciAgJWNsZWFud2luLCAlbzUKLSAgMzQ6CTlkIDUzIDQwIDAwIAlyZHByICAlb3RoZXJ3aW4sICVzcAotICAzODoJOWYgNTMgODAgMDAgCXJkcHIgICV3c3RhdGUsICVvNwotICAzYzoJYTEgNTMgYzAgMDAgCXJkcHIgICVmcSwgJWwwCi0gIDQwOglhMyA1NyBjMCAwMCAJcmRwciAgJXZlciwgJWwxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDYxOWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmRwci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBUZXN0IHJkcHIKLQkudGV4dAotCXJkcHIgJXRwYywlZzEKLQlyZHByICV0bnBjLCVnMgotCXJkcHIgJXRzdGF0ZSwlZzMKLQlyZHByICV0dCwlZzQKLQlyZHByICV0aWNrLCVnNQotCXJkcHIgJXRiYSwlZzYKLQlyZHByICVwc3RhdGUsJWc3Ci0JcmRwciAldGwsJW8wCi0JcmRwciAlcGlsLCVvMQotCXJkcHIgJWN3cCwlbzIKLQlyZHByICVjYW5zYXZlLCVvMwotCXJkcHIgJWNhbnJlc3RvcmUsJW80Ci0JcmRwciAlY2xlYW53aW4sJW81Ci0JcmRwciAlb3RoZXJ3aW4sJW82Ci0JcmRwciAld3N0YXRlLCVvNwotCXJkcHIgJWZxLCVsMAotCXJkcHIgJXZlciwlbDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0MGQwYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZWxvYzY0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jYXM6IC02NCAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCByZWxvYzY0Ci0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDxmb28+OgotICAgMDoJMDMgMDQgOGQgMTUgCXNldGhpICAlaGlcKDB4MTIzNDU0MDBcKSwgJWcxCi0gICA0Ogk4MiAxMCA2MiA3OCAJb3IgICVnMSwgMHgyNzgsICVnMS4qCi0gICA4OgkwMSAwMCAwMCAwMCAJbm9wIAotICAgYzoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCWM6IFJfU1BBUkNfSEgyMgkudGV4dAotICAxMDoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQkxMDogUl9TUEFSQ19ITTEwCS50ZXh0Ci0gIDE0OgkwMSAwMCAwMCAwMCAJbm9wIAotICAxODoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCTE4OiBSX1NQQVJDX0hIMjIJLnRleHRcKzB4MTIzNDU2NzgwMDAwMDAwMAotICAxYzoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQkxYzogUl9TUEFSQ19ITTEwCS50ZXh0XCsweDEyMzQ1Njc4MDAwMDAwMDAKLSAgMjA6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDI0OgkwMyAzZiBiNyAyZSAJc2V0aGkgICVoaVwoMHhmZWRjYjgwMFwpLCAlZzEKLSAgMjg6CTgyIDEwIDYyIDk4IAlvciAgJWcxLCAweDI5OCwgJWcxLioKLSAgMmM6CTA1IDFkIDk1IDBjIAlzZXRoaSAgJWhpXCgweDc2NTQzMDAwXCksICVnMgotICAzMDoJODQgMTAgNjIgMTAgCW9yICAlZzEsIDB4MjEwLCAlZzIKLSAgMzQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDM4OgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJMzg6IFJfU1BBUkNfSEgyMgkudGV4dAotICAzYzoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQkzYzogUl9TUEFSQ19ITTEwCS50ZXh0Ci0gIDQwOgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMgotCQkJNDA6IFJfU1BBUkNfTE0yMgkudGV4dAotICA0NDoJODQgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzIKLQkJCTQ0OiBSX1NQQVJDX0xPMTAJLnRleHQKLSAgNDg6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDRjOgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJNGM6IFJfU1BBUkNfSEgyMgkudGV4dFwrMHhmZWRjYmE5ODc2NTQzMjEwCi0gIDUwOgk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTUwOiBSX1NQQVJDX0hNMTAJLnRleHRcKzB4ZmVkY2JhOTg3NjU0MzIxMAotICA1NDoJMDUgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzIKLQkJCTU0OiBSX1NQQVJDX0xNMjIJLnRleHRcKzB4ZmVkY2JhOTg3NjU0MzIxMAotICA1ODoJODQgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzIKLQkJCTU4OiBSX1NQQVJDX0xPMTAJLnRleHRcKzB4ZmVkY2JhOTg3NjU0MzIxMAotICA1YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgNjA6CTAzIDJhIDYxIGQ5IAlzZXRoaSAgJWhpXCgweGE5ODc2NDAwXCksICVnMQotICA2NDoJODIgMTAgNjEgNDMgCW9yICAlZzEsIDB4MTQzLCAlZzEuKgotICA2ODoJODIgMTAgNjIgMTAgCW9yICAlZzEsIDB4MjEwLCAlZzEKLSAgNmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDcwOgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJNzA6IFJfU1BBUkNfSDQ0CS50ZXh0Ci0gIDc0Ogk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTc0OiBSX1NQQVJDX000NAkudGV4dAotICA3ODoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEKLQkJCTc4OiBSX1NQQVJDX0w0NAkudGV4dAotICA3YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgODA6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQk4MDogUl9TUEFSQ19INDQJLnRleHRcKzB4YTk4NzY1NDMyMTAKLSAgODQ6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCSEgMCA8Zm9vPgotCQkJODQ6IFJfU1BBUkNfTTQ0CS50ZXh0XCsweGE5ODc2NTQzMjEwCi0gIDg4Ogk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQotCQkJODg6IFJfU1BBUkNfTDQ0CS50ZXh0XCsweGE5ODc2NTQzMjEwCi0gIDhjOgkwMSAwMCAwMCAwMCAJbm9wIAotICA5MDoJMDMgMjIgNmEgZjMgCXNldGhpICAlaGlcKDB4ODlhYmNjMDBcKSwgJWcxCi0gIDk0Ogk4MiAxOCA3ZSAxMCAJeG9yICAlZzEsIC00OTYsICVnMQotICA5ODoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgOWM6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQk5YzogUl9TUEFSQ19ISVgyMgkudGV4dAotICBhMDoJODIgMTggNjAgMDAgCXhvciAgJWcxLCAwLCAlZzEKLQkJCWEwOiBSX1NQQVJDX0xPWDEwCS50ZXh0Ci0gIGE0OgkwMSAwMCAwMCAwMCAJbm9wIAotICBhODoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCWE4OiBSX1NQQVJDX0hJWDIyCS50ZXh0XCsweGZmZmZmZmZmNzY1NDMyMTAKLSAgYWM6CTgyIDE4IDYwIDAwIAl4b3IgICVnMSwgMCwgJWcxCi0JCQlhYzogUl9TUEFSQ19MT1gxMAkudGV4dFwrMHhmZmZmZmZmZjc2NTQzMjEwCi0gIGIwOgkwMSAwMCAwMCAwMCAJbm9wIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFkNmFmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQucworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMgc3BhcmM2NCBzcGVjaWFsIHJlbG9jcwotCi1mb286Ci0Jc2V0aGkgJXVoaSgweDEyMzQ1Njc4MDAwMDAwMDApLCVnMQotCW9yICVnMSwldWxvKDB4MTIzNDU2NzgwMDAwMDAwMCksJWcxCi0Jbm9wCi0Jc2V0aGkgJXVoaShmb28pLCVnMQotCW9yICVnMSwldWxvKGZvbyksJWcxCi0Jbm9wCi0Jc2V0aGkgJXVoaShmb28rMHgxMjM0NTY3ODAwMDAwMDAwKSwlZzEKLQlvciAlZzEsJXVsbyhmb28rMHgxMjM0NTY3ODAwMDAwMDAwKSwlZzEKLQlub3AKLQlzZXRoaSAlaGgoMHhmZWRjYmE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJWhtKDB4ZmVkY2JhOTg3NjU0MzIxMCksJWcxCi0Jc2V0aGkgJWxtKDB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCi0Jb3IgJWcxLCVsbygweGZlZGNiYTk4NzY1NDMyMTApLCVnMgotCW5vcAotCXNldGhpICVoaChmb28pLCVnMQotCW9yICVnMSwlaG0oZm9vKSwlZzEKLQlzZXRoaSAlbG0oZm9vKSwlZzIKLQlvciAlZzEsJWxvKGZvbyksJWcyCi0Jbm9wCi0Jc2V0aGkgJWhoKGZvbysweGZlZGNiYTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlaG0oZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcxCi0Jc2V0aGkgJWxtKGZvbysweGZlZGNiYTk4NzY1NDMyMTApLCVnMgotCW9yICVnMSwlbG8oZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCi0Jbm9wCi0Jc2V0aGkgJWg0NCgweGE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJW00NCgweGE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJWw0NCgweGE5ODc2NTQzMjEwKSwlZzEKLQlub3AKLQlzZXRoaSAlaDQ0KGZvbyksJWcxCi0Jb3IgJWcxLCVtNDQoZm9vKSwlZzEKLQlvciAlZzEsJWw0NChmb28pLCVnMQotCW5vcAotCXNldGhpICVoNDQoZm9vKzB4YTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlbTQ0KGZvbysweGE5ODc2NTQzMjEwKSwlZzEKLQlvciAlZzEsJWw0NChmb28rMHhhOTg3NjU0MzIxMCksJWcxCi0Jbm9wCi0Jc2V0aGkgJWhpeCgweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCXhvciAlZzEsJWxveCgweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCW5vcAotCXNldGhpICVoaXgoZm9vKSwlZzEKLQl4b3IgJWcxLCVsb3goZm9vKSwlZzEKLQlub3AKLQlzZXRoaSAlaGl4KGZvbysweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCXhvciAlZzEsJWxveChmb28rMHhmZmZmZmZmZjc2NTQzMjEwKSwlZzEKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zZXQ2NC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTYwMjNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgc2V0NjQKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCsgPGZvbz46Ci0gICAwOgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMgotCQkJMDogUl9TUEFSQ19ISTIyCS50ZXh0Ci0gICA0Ogk4NCAxMCBhMCAwMCAJbW92ICAlZzIsICVnMgkhIDAgPGZvbz4KLQkJCTQ6IFJfU1BBUkNfTE8xMAkudGV4dAotICAgODoJMDcgMWQgOTUgMGMgCXNldGhpICAlaGlcKDB4NzY1NDMwMDBcKSwgJWczCi0gICBjOgk4NiAxMCBlMiAxMCAJb3IgICVnMywgMHgyMTAsICVnMwkhIDc2NTQzMjEwIDwoXCpBQlNcKnxmb28pXCsoMHh8KTB4NzY1NDMyMTA+Ci0gIDEwOgk4OCAxMCAyMCAwMCAJY2xyICAlZzQKLSAgMTQ6CTBiIDAwIDAwIDNmIAlzZXRoaSAgJWhpXCgweGZjMDBcKSwgJWc1Ci0gIDE4Ogk4YSAxMSA2MyBmZiAJb3IgICVnNSwgMHgzZmYsICVnNQkhIGZmZmYgPChcKkFCU1wqfGZvbylcKygweHwpZmZmZj4KLSAgMWM6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQkxYzogUl9TUEFSQ19ISDIyCS50ZXh0Ci0gIDIwOgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMgotCQkJMjA6IFJfU1BBUkNfTE0yMgkudGV4dAotICAyNDoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEKLQkJCTI0OiBSX1NQQVJDX0hNMTAJLnRleHQKLSAgMjg6CTg0IDEwIGEwIDAwIAltb3YgICVnMiwgJWcyCi0JCQkyODogUl9TUEFSQ19MTzEwCS50ZXh0Ci0gIDJjOgk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAgMzA6CTg0IDEwIDgwIDAxIAlvciAgJWcyLCAlZzEsICVnMgotICAzNDoJODYgMTAgM2YgZmYgCW1vdiAgLTEsICVnMwotICAzODoJODYgMTAgMjAgMDAgCWNsciAgJWczCi0gIDNjOgk4NiAxMCAyMCAwMSAJbW92ICAxLCAlZzMKLSAgNDA6CTg2IDEwIDJmIGZmIAltb3YgIDB4ZmZmLCAlZzMKLSAgNDQ6CTA3IDAwIDAwIDA0IAlzZXRoaSAgJWhpXCgweDEwMDBcKSwgJWczCi0gIDQ4Ogk4NiAxMCAzMCAwMCAJbW92ICAtNDA5NiwgJWczCi0gIDRjOgkwNyAwMCAwMCAwNCAJc2V0aGkgICVoaVwoMHgxMDAwXCksICVnMwotICA1MDoJODYgMTggZmYgZmYgCXhvciAgJWczLCAtMSwgJWczCi0gIDU0OgkwNyAwMCAwMCAzZiAJc2V0aGkgICVoaVwoMHhmYzAwXCksICVnMwotICA1ODoJODYgMTAgZTMgZmYgCW9yICAlZzMsIDB4M2ZmLCAlZzMJISBmZmZmIDwoXCpBQlNcKnxmb28pXCsoMHh8KWZmZmY+Ci0gIDVjOgkwNyAwMCAwMCAzZiAJc2V0aGkgICVoaVwoMHhmYzAwXCksICVnMwotICA2MDoJODYgMTggZmMgMDAgCXhvciAgJWczLCAtMTAyNCwgJWczCi0gIDY0OgkwOSAxZiBmZiBmZiAJc2V0aGkgICVoaVwoMHg3ZmZmZmMwMFwpLCAlZzQKLSAgNjg6CTg4IDExIDIzIGZmIAlvciAgJWc0LCAweDNmZiwgJWc0CSEgN2ZmZmZmZmYgPChcKkFCU1wqfGZvbylcKygweHwpN2ZmZmZmZmY+Ci0gIDZjOgkwOSAyMCAwMCAwMCAJc2V0aGkgICVoaVwoMHg4MDAwMDAwMFwpLCAlZzQKLSAgNzA6CTA5IDFmIGZmIGZmIAlzZXRoaSAgJWhpXCgweDdmZmZmYzAwXCksICVnNAotICA3NDoJODggMTkgM2MgMDAgCXhvciAgJWc0LCAtMTAyNCwgJWc0Ci0gIDc4OgkwOSAyMCAwMCAwMCAJc2V0aGkgICVoaVwoMHg4MDAwMDAwMFwpLCAlZzQKLSAgN2M6CTg4IDE5IDNmIGZmIAl4b3IgICVnNCwgLTEsICVnNAotICA4MDoJMDkgM2YgZmYgZmYgCXNldGhpICAlaGlcKDB4ZmZmZmZjMDBcKSwgJWc0Ci0gIDg0Ogk4OCAxMSAyMyBmZiAJb3IgICVnNCwgMHgzZmYsICVnNAkhIGZmZmZmZmZmIDwoXCpBQlNcKnxmb28pXCsoMHh8KWZmZmZmZmZmPgotICA4ODoJODggMTAgMjAgMDEgCW1vdiAgMSwgJWc0Ci0gIDhjOgk4OSAyOSAzMCAyMCAJc2xseCAgJWc0LCAweDIwLCAlZzQKLSAgOTA6CTAzIDFmIGZmIGZmIAlzZXRoaSAgJWhpXCgweDdmZmZmYzAwXCksICVnMQotICA5NDoJMGIgM2YgZmYgZmYgCXNldGhpICAlaGlcKDB4ZmZmZmZjMDBcKSwgJWc1Ci0gIDk4Ogk4MiAxMCA2MyBmZiAJb3IgICVnMSwgMHgzZmYsICVnMQotICA5YzoJOGEgMTEgNjMgZmYgCW9yICAlZzUsIDB4M2ZmLCAlZzUKLSAgYTA6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotICBhNDoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1Ci0gIGE4OgkwYiAyMCAwMCAwMCAJc2V0aGkgICVoaVwoMHg4MDAwMDAwMFwpLCAlZzUKLSAgYWM6CThiIDI5IDcwIDIwIAlzbGx4ICAlZzUsIDB4MjAsICVnNQotICBiMDoJMGIgM2YgZmYgZmYgCXNldGhpICAlaGlcKDB4ZmZmZmZjMDBcKSwgJWc1Ci0gIGI0Ogk4YSAxOSA3YyAwMCAJeG9yICAlZzUsIC0xMDI0LCAlZzUKLSAgYjg6CTBiIDFmIGZmIGZmIAlzZXRoaSAgJWhpXCgweDdmZmZmYzAwXCksICVnNQotICBiYzoJOGEgMTkgN2MgMDAgCXhvciAgJWc1LCAtMTAyNCwgJWc1Ci0gIGMwOgkwMyAzZiBmZiBjMCAJc2V0aGkgICVoaVwoMHhmZmZmMDAwMFwpLCAlZzEKLSAgYzQ6CTBiIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnNQotICBjODoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCi0gIGNjOgk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKLSAgZDA6CTAzIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnMQotICBkNDoJOGEgMTAgMjAgMDEgCW1vdiAgMSwgJWc1Ci0gIGQ4Ogk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAgZGM6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQotICBlMDoJMGIgM2YgZmYgYzAgCXNldGhpICAlaGlcKDB4ZmZmZjAwMDBcKSwgJWc1Ci0gIGU0Ogk4MiAxMCAyMCAwMSAJbW92ICAxLCAlZzEKLSAgZTg6CThhIDExIDYwIDAxIAlvciAgJWc1LCAxLCAlZzUKLSAgZWM6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotICBmMDoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1Ci0gIGY0OgkwYiAzZiBmZiBjMCAJc2V0aGkgICVoaVwoMHhmZmZmMDAwMFwpLCAlZzUKLSAgZjg6CTgyIDEwIDIwIDAxIAltb3YgIDEsICVnMQotICBmYzoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCi0gMTAwOgk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKLSAxMDQ6CTgyIDEwIDIwIDAxIAltb3YgIDEsICVnMQotIDEwODoJOGEgMTAgMjAgMDEgCW1vdiAgMSwgJWc1Ci0gMTBjOgk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAxMTA6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQotIDExNDoJMDUgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzIKLQkJCTExNDogUl9TUEFSQ19ISTIyCS50ZXh0Ci0gMTE4Ogk4NCAxMCBhMCAwMCAJbW92ICAlZzIsICVnMgkhIDAgPGZvbz4KLQkJCTExODogUl9TUEFSQ19MTzEwCS50ZXh0Ci0gMTFjOgkwNyAxZCA5NSAwYyAJc2V0aGkgICVoaVwoMHg3NjU0MzAwMFwpLCAlZzMKLSAxMjA6CTg2IDEwIGUyIDEwIAlvciAgJWczLCAweDIxMCwgJWczCSEgNzY1NDMyMTAgPChcKkFCU1wqfGZvbylcKzB4NzY1NDMyMTA+Ci0gMTI0Ogk4OCAxMCAyMCAwMCAJY2xyICAlZzQKLSAxMjg6CTBiIDAwIDAwIDNmIAlzZXRoaSAgJWhpXCgweGZjMDBcKSwgJWc1Ci0gMTJjOgk4YSAxMSA2MyBmZiAJb3IgICVnNSwgMHgzZmYsICVnNQkhIGZmZmYgPChcKkFCU1wqfGZvbylcKzB4ZmZmZj4KLSAxMzA6CTA1IDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcyCi0JCQkxMzA6IFJfU1BBUkNfSEkyMgkudGV4dAotIDEzNDoJODQgMTAgYTAgMDAgCW1vdiAgJWcyLCAlZzIJISAwIDxmb28+Ci0JCQkxMzQ6IFJfU1BBUkNfTE8xMAkudGV4dAotIDEzODoJODUgMzggODAgMDAgCXNpZ254ICAlZzIKLSAxM2M6CTA3IDFkIDk1IDBjIAlzZXRoaSAgJWhpXCgweDc2NTQzMDAwXCksICVnMwotIDE0MDoJODYgMTAgZTIgMTAgCW9yICAlZzMsIDB4MjEwLCAlZzMJISA3NjU0MzIxMCA8KFwqQUJTXCp8Zm9vKVwrMHg3NjU0MzIxMD4KLSAxNDQ6CTg4IDEwIDIwIDAwIAljbHIgICVnNAotIDE0ODoJMGIgMDAgMDAgM2YgCXNldGhpICAlaGlcKDB4ZmMwMFwpLCAlZzUKLSAxNGM6CThhIDExIDYzIGZmIAlvciAgJWc1LCAweDNmZiwgJWc1CSEgZmZmZiA8KFwqQUJTXCp8Zm9vKVwrMHhmZmZmPgotIDE1MDoJODIgMTAgM2YgZmYgCW1vdiAgLTEsICVnMQotIDE1NDoJMDUgMWYgZmYgZmYgCXNldGhpICAlaGlcKDB4N2ZmZmZjMDBcKSwgJWcyCi0gMTU4Ogk4NCAxMCBhMyBmZiAJb3IgICVnMiwgMHgzZmYsICVnMgkhIDdmZmZmZmZmIDwoXCpBQlNcKnxmb28pXCsweDdmZmZmZmZmPgotIDE1YzoJMDcgMDAgMDAgM2YgCXNldGhpICAlaGlcKDB4ZmMwMFwpLCAlZzMKLSAxNjA6CTg2IDE4IGZjIDAwIAl4b3IgICVnMywgLTEwMjQsICVnMwotIDE2NDoJODggMTAgM2YgZmYgCW1vdiAgLTEsICVnNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTAzNmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQucworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMgc3BhcmM2NCBzZXQgaW5zbiBoYW5kbGluZyAoaW5jbHVkZXMgc2V0LCBzZXR1dywgc2V0c3csIHNldHgpCi0KLWZvbzoKLQlzZXQgZm9vLCVnMgotCXNldCAweDc2NTQzMjEwLCVnMwotCXNldCAwLCVnNAotCXNldCA2NTUzNSwlZzUKLQotCXNldHggZm9vLCVnMSwlZzIKLQotCXNldHggLTEsJWcxLCVnMwotCXNldHggMCwlZzEsJWczCi0Jc2V0eCAxLCVnMSwlZzMKLQlzZXR4IDQwOTUsJWcxLCVnMwotCXNldHggNDA5NiwlZzEsJWczCi0Jc2V0eCAtNDA5NiwlZzEsJWczCi0Jc2V0eCAtNDA5NywlZzEsJWczCi0Jc2V0eCA2NTUzNSwlZzEsJWczCi0Jc2V0eCAtNjU1MzYsJWcxLCVnMwotCi0Jc2V0eCAyMTQ3NDgzNjQ3LCVnMSwlZzQKLQlzZXR4IDIxNDc0ODM2NDgsJWcxLCVnNAotCXNldHggLTIxNDc0ODM2NDgsJWcxLCVnNAotCXNldHggLTIxNDc0ODM2NDksJWcxLCVnNAotCXNldHggNDI5NDk2NzI5NSwlZzEsJWc0Ci0Jc2V0eCA0Mjk0OTY3Mjk2LCVnMSwlZzQKLQotISBHQVMgZG9lc24ndCBoYW5kbGUgbGFyZ2UgYmFzZTEwIG51bWJlcnMgeWV0LgotIQlzZXR4IDkyMjMzNzIwMzY4NTQ3NzU4MDcsJWcxLCVnNQotIQlzZXR4IDkyMjMzNzIwMzY4NTQ3NzU4MDgsJWcxLCVnNQotIQlzZXR4IC05MjIzMzcyMDM2ODU0Nzc1ODA4LCVnMSwlZzUKLSEJc2V0eCAtOTIyMzM3MjAzNjg1NDc3NTgwOSwlZzEsJWc1Ci0KLQlzZXR4IDB4N2ZmZmZmZmZmZmZmZmZmZiwlZzEsJWc1Ci0Jc2V0eCAweDgwMDAwMDAwMDAwMDAwMDAsJWcxLCVnNQkJISB0ZXN0IG9ubHkgaGgyMiBuZWVkZWQKLQlzZXR4IDB4ZmZmZmZmZmYwMDAwMDAwMCwlZzEsJWc1CQkhIHRlc3Qgb25seSBobTEwIG5lZWRlZAotCXNldHggMHhmZmZmZmZmZjgwMDAwMDAwLCVnMSwlZzUJCSEgdGVzdCBzaWduLWV4dCBvZiBsb3dlciAzMgotCXNldHggMHhmZmZmMDAwMGZmZmYwMDAwLCVnMSwlZzUJCSEgdGVzdCBoaDIyLGhpMjIKLQlzZXR4IDB4ZmZmZjAwMDAwMDAwMDAwMSwlZzEsJWc1CQkhIHRlc3QgaGgyMixsbzEwCi0Jc2V0eCAweDAwMDAwMDAxZmZmZjAwMDEsJWcxLCVnNQkJISB0ZXN0IGhtMTAsaGkyMixsbzEwCi0Jc2V0eCAweDAwMDAwMDAxZmZmZjAwMDAsJWcxLCVnNQkJISB0ZXN0IGhtMTAsaGkyMgotCXNldHggMHgwMDAwMDAwMTAwMDAwMDAxLCVnMSwlZzUJCSEgdGVzdCBobTEwLGxvMTAKLQotCXNldHV3IGZvbywlZzIKLQlzZXR1dyAweDc2NTQzMjEwLCVnMwotCXNldHV3IDAsJWc0Ci0Jc2V0dXcgNjU1MzUsJWc1Ci0KLQlzZXRzdyBmb28sJWcyCi0Jc2V0c3cgMHg3NjU0MzIxMCwlZzMKLQlzZXRzdyAwLCVnNAotCXNldHN3IDY1NTM1LCVnNQotCXNldHN3IDB4ZmZmZmZmZmYsJWcxCi0Jc2V0c3cgMHg3ZmZmZmZmZiwlZzIKLQlzZXRzdyAweGZmZmYwMDAwLCVnMwotCXNldHN3IC0xLCVnNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BhcmMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BhcmMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2RjYWFhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwYXJjLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgU29tZSBnZW5lcmljIFNQQVJDIGFuZCBTUEFSQzY0IHRlc3RzCi0KLSMgRklYTUU6IFRoZSB0ZXN0cyBoZXJlIGFyZW4ndCByZWFsbHkgYnVsbGV0IHByb29mLiAgQSBtaXN0YWtlIGluIHRoZSBvcGNvZGUKLSMgdGFibGUgY2FuIHNsaXAgdGhyb3VnaCBzaW5jZSB3ZSB1c2UgdGhlIHNhbWUgdGFibGUgZm9yIGFzc2VtYmx5IGFuZAotIyBkaXNhc3NlbWJseS4gIFRoZSB3YXkgdG8gZml4IHRoaXMgaXMgdG8gaW5jbHVkZSBhIGhleCBkdW1wIG9mIHRoZSBpbnNucwotIyBhbmQgdGVzdCB0aGF0IGFzIHdlbGwuICBMYXRlci4KLQotIyBGaW5kIG91dCBpZiB0aGVzZSBiaW51dGlscyBhcmUgZWl0aGVyIHNwYXJjNjQqLSotKiBvcgotIyBzcGFyYyotKi0qIHdpdGggLS1lbmFibGUtdGFyZ2V0cz1zcGFyYzY0LSotKgotcHJvYyBnYXNfNjRfY2hlY2sgeyB9IHsKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotICAgIGdsb2JhbCBzcmNkaXIKLQotICAgIGNhdGNoICJleGVjICRzcmNkaXIvbGliL3J1biAkTk0gJE5NRkxBR1MgLS1oZWxwIiBubV9oZWxwCi0gICAgcmV0dXJuIFtyZWdleHAgImVsZjY0XFtfLVxdc3BhcmMiICRubV9oZWxwXTsKLX0KLQotaWYgW2lzdGFyZ2V0IHNwYXJjKi0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJzeW50aCIKLSAgICBpZiBbZ2FzXzY0X2NoZWNrXSB7Ci0JcnVuX2R1bXBfdGVzdCAiYXNpIgotCXJ1bl9kdW1wX3Rlc3QgIm1lbWJhciIKLQlydW5fZHVtcF90ZXN0ICJwcmVmZXRjaCIKLQlydW5fZHVtcF90ZXN0ICJzZXQ2NCIKLQlydW5fZHVtcF90ZXN0ICJzeW50aDY0IgotCXJ1bl9kdW1wX3Rlc3QgInJkcHIiCi0JcnVuX2R1bXBfdGVzdCAid3JwciIKLQlydW5fZHVtcF90ZXN0ICJyZWxvYzY0IgotICAgIH0KLX0KLQotaWYgW2lzdGFyZ2V0IHNwYXJjbGV0Ki0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJzcGxldCIKLSAgICBydW5fZHVtcF90ZXN0ICJzcGxldC0yIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDU1NTM4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LTIuZAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNhczogLUFzcGFyY2xldAotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDxzdGFydD46Ci0gICAwOgk4MSBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY3NyCi0gICA0Ogk4MyBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY2ZyCi0gICA4Ogk4NSBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY2NyY3IKLSAgIGM6CTg3IGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjcHIKLSAgMTA6CTg5IGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjc3IyCi0gIDE0Ogk4YiBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY2NycgotICAxODoJOGQgYjAgNDAgYzAgCWN3cmN4dCAgJWcxLCAlY2Nyc3RyCi0gIDFjOgk4MyBiMCAwMSAwMCAJY3JkY3h0ICAlY2NzciwgJWcxCi0gIDIwOgk4MyBiMCA0MSAwMCAJY3JkY3h0ICAlY2NmciwgJWcxCi0gIDI0Ogk4MyBiMCA4MSAwMCAJY3JkY3h0ICAlY2NjcmNyLCAlZzEKLSAgMjg6CTgzIGIwIGMxIDAwIAljcmRjeHQgICVjY3ByLCAlZzEKLSAgMmM6CTgzIGIxIDAxIDAwIAljcmRjeHQgICVjY3NyMiwgJWcxCi0gIDMwOgk4MyBiMSA0MSAwMCAJY3JkY3h0ICAlY2NjcnIsICVnMQotICAzNDoJODMgYjEgODEgMDAgCWNyZGN4dCAgJWNjcnN0ciwgJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzQ0OTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotISBUZXN0IHNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycy4KLQotCS50ZXh0Ci0JLmdsb2JhbCBzdGFydAotc3RhcnQ6Ci0KLQljd3JjeHQgICAgJWcxLCVjY3NyCi0JY3dyY3h0ICAgICVnMSwlY2NmcgotCWN3cmN4dCAgICAlZzEsJWNjY3JjcgotCWN3cmN4dCAgICAlZzEsJWNjcHIKLQljd3JjeHQgICAgJWcxLCVjY3NyMgotCWN3cmN4dCAgICAlZzEsJWNjY3JyCi0JY3dyY3h0ICAgICVnMSwlY2Nyc3RyCi0KLQljcmRjeHQgICAgJWNjc3IsJWcxCi0JY3JkY3h0ICAgICVjY2ZyLCVnMQotCWNyZGN4dCAgICAlY2NjcmNyLCVnMQotCWNyZGN4dCAgICAlY2NwciwlZzEKLQljcmRjeHQgICAgJWNjc3IyLCVnMQotCWNyZGN4dCAgICAlY2NjcnIsJWcxCi0JY3JkY3h0ICAgICVjY3JzdHIsJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFjMGEyMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLSNhczogLUFzcGFyY2xldAotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjbGV0IGV4dGVuc2lvbnMKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8c3RhcnQ+OgotICAgMDoJYTEgNDAgMDAgMDAgCXJkICAleSwgJWwwCi0gICA0OglhMSA0MCA0MCAwMCAJcmQgICVhc3IxLCAlbDAKLSAgIDg6CWExIDQzIGMwIDAwIAlyZCAgJWFzcjE1LCAlbDAKLSAgIGM6CWExIDQ0IDQwIDAwIAlyZCAgJWFzcjE3LCAlbDAKLSAgMTA6CWExIDQ0IDgwIDAwIAlyZCAgJWFzcjE4LCAlbDAKLSAgMTQ6CWExIDQ0IGMwIDAwIAlyZCAgJWFzcjE5LCAlbDAKLSAgMTg6CWExIDQ1IDAwIDAwIAlyZCAgJWFzcjIwLCAlbDAKLSAgMWM6CWExIDQ1IDQwIDAwIAlyZCAgJWFzcjIxLCAlbDAKLSAgMjA6CWExIDQ1IDgwIDAwIAlyZCAgJWFzcjIyLCAlbDAKLSAgMjQ6CTgxIDg0IDIwIDAwIAltb3YgICVsMCwgJXkKLSAgMjg6CTgzIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjEKLSAgMmM6CTlmIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjE1Ci0gIDMwOglhMyA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IxNwotICAzNDoJYTUgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMTgKLSAgMzg6CWE3IDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjE5Ci0gIDNjOglhOSA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IyMAotICA0MDoJYWIgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMjEKLSAgNDQ6CWFkIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjIyCi0KLTArNDggPHRlc3RfdW11bD46Ci0gIDQ4Ogk4NiA1MCA0MCAwMiAJdW11bCAgJWcxLCAlZzIsICVnMwotICA0YzoJODYgNTAgNDAgMDIgCXVtdWwgICVnMSwgJWcyLCAlZzMKLQotMCs1MCA8dGVzdF9zbXVsPjoKLSAgNTA6CTg2IDU4IDQwIDAyIAlzbXVsICAlZzEsICVnMiwgJWczCi0gIDU0Ogk4NiA1OCA0MCAwMiAJc211bCAgJWcxLCAlZzIsICVnMwotCi0wKzU4IDx0ZXN0X3N0YmFyPjoKLSAgNTg6CTgxIDQzIGMwIDAwIAlzdGJhciAKLSAgNWM6CTgxIDQzIGMwIDAwIAlzdGJhciAKLSAgNjA6CTAwIDAwIDAwIDAxIAl1bmltcCAgMHgxCi0gIDY0Ogk4MSBkYyA0MCAwMCAJZmx1c2ggICVsMQotCi0wKzY4IDx0ZXN0X3NjYW4+OgotICA2ODoJYTcgNjQgN2YgZmYgCXNjYW4gICVsMSwgLTEsICVsMwotICA2YzoJYTcgNjQgNjAgMDAgCXNjYW4gICVsMSwgMCwgJWwzCi0gIDcwOglhNyA2NCA0MCAxMSAJc2NhbiAgJWwxLCAlbDEsICVsMwotCi0wKzc0IDx0ZXN0X3NodWZmbGU+OgotICA3NDoJYTMgNmMgMjAgMDEgCXNodWZmbGUgICVsMCwgMSwgJWwxCi0gIDc4OglhMyA2YyAyMCAwMiAJc2h1ZmZsZSAgJWwwLCAyLCAlbDEKLSAgN2M6CWEzIDZjIDIwIDA0IAlzaHVmZmxlICAlbDAsIDQsICVsMQotICA4MDoJYTMgNmMgMjAgMDggCXNodWZmbGUgICVsMCwgOCwgJWwxCi0gIDg0OglhMyA2YyAyMCAxMCAJc2h1ZmZsZSAgJWwwLCAweDEwLCAlbDEKLSAgODg6CWEzIDZjIDIwIDE4IAlzaHVmZmxlICAlbDAsIDB4MTgsICVsMQotCi0wKzhjIDx0ZXN0X3VtYWM+OgotICA4YzoJYTEgZjQgNDAgMTIgCXVtYWMgICVsMSwgJWwyLCAlbDAKLSAgOTA6CWExIGY0IDYwIDAyIAl1bWFjICAlbDEsIDIsICVsMAotICA5NDoJYTEgZjQgNjAgMDIgCXVtYWMgICVsMSwgMiwgJWwwCi0KLTArOTggPHRlc3RfdW1hY2Q+OgotICA5ODoJYTEgNzQgODAgMTQgCXVtYWNkICAlbDIsICVsNCwgJWwwCi0gIDljOglhMSA3NCBhMCAwMyAJdW1hY2QgICVsMiwgMywgJWwwCi0gIGEwOglhMSA3NCBhMCAwMyAJdW1hY2QgICVsMiwgMywgJWwwCi0KLTArYTQgPHRlc3Rfc21hYz46Ci0gIGE0OglhMSBmYyA0MCAxMiAJc21hYyAgJWwxLCAlbDIsICVsMAotICBhODoJYTEgZmMgN2YgZDYgCXNtYWMgICVsMSwgLTQyLCAlbDAKLSAgYWM6CWExIGZjIDdmIGQ2IAlzbWFjICAlbDEsIC00MiwgJWwwCi0KLTArYjAgPHRlc3Rfc21hY2Q+OgotICBiMDoJYTEgN2MgODAgMTQgCXNtYWNkICAlbDIsICVsNCwgJWwwCi0gIGI0OglhMSA3YyBhMCA3YiAJc21hY2QgICVsMiwgMHg3YiwgJWwwCi0gIGI4OglhMSA3YyBhMCA3YiAJc21hY2QgICVsMiwgMHg3YiwgJWwwCi0KLTArYmMgPHRlc3RfdW11bGQ+OgotICBiYzoJOTAgNGEgODAgMGMgCXVtdWxkICAlbzIsICVvNCwgJW8wCi0gIGMwOgk5MCA0YSBhMiAzNCAJdW11bGQgICVvMiwgMHgyMzQsICVvMAotICBjNDoJOTAgNGEgYTUgNjcgCXVtdWxkICAlbzIsIDB4NTY3LCAlbzAKLQotMCtjOCA8dGVzdF9zbXVsZD46Ci0gIGM4OgliMCA2ZSA4MCAxYyAJc211bGQgICVpMiwgJWk0LCAlaTAKLSAgY2M6CWIwIDZlIGIwIDAwIAlzbXVsZCAgJWkyLCAtNDA5NiwgJWkwCi0gIGQwOgliMCA2ZiAyZiBmZiAJc211bGQgICVpNCwgMHhmZmYsICVpMAotCi0wK2Q0IDx0ZXN0X2NvcHJvY2Vzc29yPjoKLSAgZDQ6CTgxIGI0IDAwIDExIAljcHVzaCAgJWwwLCAlbDEKLSAgZDg6CTgxIGI0IDIwIDAxIAljcHVzaCAgJWwwLCAxCi0gIGRjOgk4MSBiNCAwMCA1MSAJY3B1c2hhICAlbDAsICVsMQotICBlMDoJODEgYjQgMjAgNDEgCWNwdXNoYSAgJWwwLCAxCi0gIGU0OglhMSBiMCAwMCA4MCAJY3B1bGwgICVsMAotICBlODoJYTEgYjAgMDEgMDAgCWNyZGN4dCAgJWNjc3IsICVsMAotICBlYzoJYTEgYjAgNDEgMDAgCWNyZGN4dCAgJWNjZnIsICVsMAotICBmMDoJYTEgYjAgYzEgMDAgCWNyZGN4dCAgJWNjcHIsICVsMAotICBmNDoJYTEgYjAgODEgMDAgCWNyZGN4dCAgJWNjY3JjciwgJWwwCi0gIGY4Ogk4MSBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY3NyCi0gIGZjOgk4MyBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY2ZyCi0gMTAwOgk4NyBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY3ByCi0gMTA0Ogk4NSBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY2NyY3IKLSAxMDg6CTAxIGMwIDAwIDAxIAljYm4gIDEwYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkzOD4KLQkJCTEwODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWY4Ci0gMTBjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDExMDoJMjEgYzAgMDAgMDEgCWNibixhICAgMTE0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTQwPgotCQkJMTEwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZjAKLSAxMTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTE4OgkwMyBjMCAwMCAwMSAJY2JlICAxMWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNDg+Ci0JCQkxMTg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVlOAotIDExYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxMjA6CTIzIGMwIDAwIDAxIAljYmUsYSAgIDEyNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk1MD4KLQkJCTEyMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZWUwCi0gMTI0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDEyODoJMDUgYzAgMDAgMDEgCWNiZiAgMTJjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTU4PgotCQkJMTI4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZDgKLSAxMmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTMwOgkyNSBjMCAwMCAwMSAJY2JmLGEgICAxMzQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNjA+Ci0JCQkxMzA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVkMAotIDEzNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxMzg6CTA3IGMwIDAwIDAxIAljYmVmICAxM2MgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNjg+Ci0JCQkxMzg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVjOAotIDEzYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNDA6CTI3IGMwIDAwIDAxIAljYmVmLGEgICAxNDQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNzA+Ci0JCQkxNDA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVjMAotIDE0NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNDg6CTA5IGMwIDAwIDAxIAljYnIgIDE0YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk3OD4KLQkJCTE0ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWI4Ci0gMTRjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE1MDoJMjkgYzAgMDAgMDEgCWNicixhICAgMTU0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTgwPgotCQkJMTUwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYjAKLSAxNTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTU4OgkwYiBjMCAwMCAwMSAJY2JlciAgMTVjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTg4PgotCQkJMTU4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYTgKLSAxNWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTYwOgkyYiBjMCAwMCAwMSAJY2JlcixhICAgMTY0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTkwPgotCQkJMTYwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYTAKLSAxNjQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTY4OgkwZCBjMCAwMCAwMSAJY2JmciAgMTZjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTk4PgotCQkJMTY4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlOTgKLSAxNmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTcwOgkyZCBjMCAwMCAwMSAJY2JmcixhICAgMTc0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWEwPgotCQkJMTcwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlOTAKLSAxNzQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTc4OgkwZiBjMCAwMCAwMSAJY2JlZnIgIDE3YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fClhOD4KLQkJCTE3ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTg4Ci0gMTdjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE4MDoJMmYgYzAgMDAgMDEgCWNiZWZyLGEgICAxODQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpYjA+Ci0JCQkxODA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU4MAotIDE4NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxODg6CTExIGMwIDAwIDAxIAljYmEgIDE4YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCliOD4KLQkJCTE4ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTc4Ci0gMThjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE5MDoJMzEgYzAgMDAgMDEgCWNiYSxhICAgMTk0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWMwPgotCQkJMTkwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNzAKLSAxOTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTk4OgkxMyBjMCAwMCAwMSAJY2JuZSAgMTljIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWM4PgotCQkJMTk4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNjgKLSAxOWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWEwOgkzMyBjMCAwMCAwMSAJY2JuZSxhICAgMWE0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWQwPgotCQkJMWEwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNjAKLSAxYTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWE4OgkxNSBjMCAwMCAwMSAJY2JuZiAgMWFjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWQ4PgotCQkJMWE4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNTgKLSAxYWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWIwOgkzNSBjMCAwMCAwMSAJY2JuZixhICAgMWI0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWUwPgotCQkJMWIwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNTAKLSAxYjQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWI4OgkxNyBjMCAwMCAwMSAJY2JuZWYgIDFiYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCllOD4KLQkJCTFiODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTQ4Ci0gMWJjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDFjMDoJMzcgYzAgMDAgMDEgCWNibmVmLGEgICAxYzQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZjA+Ci0JCQkxYzA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU0MAotIDFjNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxYzg6CTE5IGMwIDAwIDAxIAljYm5yICAxY2MgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZjg+Ci0JCQkxYzg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUzOAotIDFjYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZDA6CTM5IGMwIDAwIDAxIAljYm5yLGEgICAxZDQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpMTAwPgotCQkJMWQwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlMzAKLSAxZDQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWQ4OgkxYiBjMCAwMCAwMSAJY2JuZXIgIDFkYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMDg+Ci0JCQkxZDg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUyOAotIDFkYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZTA6CTNiIGMwIDAwIDAxIAljYm5lcixhICAgMWU0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTExMD4KLQkJCTFlMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZTIwCi0gMWU0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDFlODoJMWQgYzAgMDAgMDEgCWNibmZyICAxZWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpMTE4PgotCQkJMWU4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlMTgKLSAxZWM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWYwOgkzZCBjMCAwMCAwMSAJY2JuZnIsYSAgIDFmNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMjA+Ci0JCQkxZjA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUxMAotIDFmNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZjg6CTFmIGMwIDAwIDAxIAljYm5lZnIgIDFmYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMjg+Ci0JCQkxZjg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUwOAotIDFmYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAyMDA6CTNmIGMwIDAwIDAxIAljYm5lZnIsYSAgIDIwNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMzA+Ci0JCQkyMDA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUwMAotIDIwNDoJMDEgMDAgMDAgMDAgCW5vcCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZkNTA3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotCS50ZXh0Ci0JLmdsb2JhbCBzdGFydAotCi0hCVN0YXJ0aW5nIHBvaW50Ci1zdGFydDoKLQotIQl0ZXN0IGFsbCBBU1JzCi0KLQlyZAklYXNyMCwgJWwwCi0JcmQJJWFzcjEsICVsMAotCXJkCSVhc3IxNSwgJWwwCi0JcmQJJWFzcjE3LCAlbDAKLQlyZAklYXNyMTgsICVsMAotCXJkCSVhc3IxOSwgJWwwCSEgc2hvdWxkIHN0b3AgdGhlIHByb2Nlc3NvcgotCXJkCSVhc3IyMCwgJWwwCi0JcmQJJWFzcjIxLCAlbDAKLQlyZAklYXNyMjIsICVsMAotCi0Jd3IJJWwwLCAwLCAlYXNyMAotCXdyCSVsMCwgMCwgJWFzcjEKLQl3cgklbDAsIDAsICVhc3IxNQotCXdyCSVsMCwgMCwgJWFzcjE3Ci0Jd3IJJWwwLCAwLCAlYXNyMTgKLQl3cgklbDAsIDAsICVhc3IxOQotCXdyCSVsMCwgMCwgJWFzcjIwCi0Jd3IJJWwwLCAwLCAlYXNyMjEKLQl3cgklbDAsIDAsICVhc3IyMgotCi0hCXRlc3QgVU1VTCB3aXRoIG5vIG92ZXJmbG93IGluc2lkZSBZCi10ZXN0X3VtdWw6Ci0JdW11bAklZzEsICVnMiwgJWczCi0KLSEJdGVzdCBVTVVMIHdpdGggYW4gb3ZlcmZsb3cgaW5zaWRlIFkKLQotCXVtdWwJJWcxLCAlZzIsICVnMwkhICVnMyBtdXN0IGJlIGVxdWFsIHRvIDAKLQotIQl0ZXN0IFNNVUwgd2l0aCBuZWdhdGl2ZSByZXN1bHQKLXRlc3Rfc211bDoKLQlzbXVsCSVnMSwgJWcyLCAlZzMKLQotIQl0ZXN0IFNNVUwgd2l0aCBwb3NpdGl2ZSByZXN1bHQKLQotCXNtdWwJJWcxLCAlZzIsICVnMwotCi0hCXRlc3QgU1RCQVI6IHRoZXJlIGFyZSB0d28gcG9zc2libGUgc3ludGF4ZXMKLXRlc3Rfc3RiYXI6Ci0Jc3RiYXIJCQkhIGlzIGEgdmFsaWQgVjggc3ludGF4LCBhdCBsZWFzdCBhIHN5bnRoZXRpYwotCQkJCSEgaW5zdHJ1Y3Rpb24KLQlyZAklYXNyMTUsICVnMAkhIG90aGVyIHNvbHV0aW9uCi0KLSEJdGVzdCBVTklNUAotCXVuaW1wCTEKLQotIQl0ZXN0IEZMVVNICi0JZmx1c2gJJWwxCQkhIGlzIHRoZSBvZmZpY2lhbCBWOCBzeW50YXgKLQotIQl0ZXN0IFNDQU46IGZpbmQgZmlyc3QgMAotdGVzdF9zY2FuOgotCXNjYW4JJWwxLCAweGZmZmZmZmZmLCAlbDMKLQotIQl0ZXN0IHNjYW46IGZpbmQgZmlyc3QgMQotCi0Jc2NhbgklbDEsIDAsICVsMwotCi0hCXRlc3Qgc2NhbjogZmluZCBmaXJzdCBiaXQgIT0gYml0LTAKLQotCXNjYW4JJWwxLCAlbDEsICVsMwotCi0hCXRlc3QgU0hVRkZMRQotdGVzdF9zaHVmZmxlOgotCXNodWZmbGUJJWwwLCAweDEsICVsMQotCXNodWZmbGUJJWwwLCAweDIsICVsMQotCXNodWZmbGUJJWwwLCAweDQsICVsMQotCXNodWZmbGUJJWwwLCAweDgsICVsMQotCXNodWZmbGUJJWwwLCAweDEwLCAlbDEKLQlzaHVmZmxlCSVsMCwgMHgxOCwgJWwxCi0KLSEJdGVzdCBVTUFDCi10ZXN0X3VtYWM6Ci0JdW1hYwklbDEsICVsMiwgJWwwCi0JdW1hYwklbDEsIDIsICVsMAotCXVtYWMJMiwgJWwxLCAlbDAKLQotIQl0ZXN0IFVNQUNECi10ZXN0X3VtYWNkOgotCXVtYWNkCSVsMiwgJWw0LCAlbDAKLQl1bWFjZAklbDIsIDMsICVsMAotCXVtYWNkCTMsICVsMiwgJWwwCi0KLSEJdGVzdCBTTUFDCi10ZXN0X3NtYWM6Ci0Jc21hYwklbDEsICVsMiwgJWwwCi0Jc21hYwklbDEsIC00MiwgJWwwCi0Jc21hYwktNDIsICVsMSwgJWwwCi0KLSEJdGVzdCBTTUFDRAotdGVzdF9zbWFjZDoKLQlzbWFjZAklbDIsICVsNCwgJWwwCi0Jc21hY2QJJWwyLCAxMjMsICVsMAotCXNtYWNkCTEyMywgJWwyLCAlbDAKLQotIQl0ZXN0IFVNVUxECi10ZXN0X3VtdWxkOgotCXVtdWxkCSVvMiwgJW80LCAlbzAKLQl1bXVsZAklbzIsIDB4MjM0LCAlbzAKLQl1bXVsZAkweDU2NywgJW8yLCAlbzAKLQotIQl0ZXN0IFNNVUxECi10ZXN0X3NtdWxkOgotCXNtdWxkCSVpMiwgJWk0LCAlaTAKLQlzbXVsZAklaTIsIC00MDk2LCAlaTAKLQlzbXVsZAk0MDk1LCAlaTQsICVpMAotCi0hCUNvcHJvY2Vzc29yIGluc3RydWN0aW9ucwotdGVzdF9jb3Byb2Nlc3NvcjoKLSEJJWNjc3IJaXMgcmVnaXN0ZXIgIyAwCi0hCSVjY2ZyCWlzIHJlZ2lzdGVyICMgMQotIQklY2NwcglpcyByZWdpc3RlciAjIDMKLSEJJWNjY3JjciBpcyByZWdpc3RlciAjIDIKLQotIQl0ZXN0IENQVVNIOiBqdXN0IHN5bnRheAotCi0JY3B1c2gJJWwwLCAlbDEKLQljcHVzaAklbDAsIDEKLQljcHVzaGEJJWwwLCAlbDEKLQljcHVzaGEJJWwwLCAxCi0KLSEJdGVzdCBDUFVMTDoganVzdCBzeW50YXgKLQotCWNwdWxsCSVsMAotCi0hCXRlc3QgQ1BSRENYVDoganVzdCBzeW50YXgKLQotCWNyZGN4dAklY2NzciwgJWwwCi0JY3JkY3h0CSVjY2ZyLCAlbDAKLQljcmRjeHQJJWNjcHIsICVsMAotCWNyZGN4dAklY2NjcmNyLCAlbDAKLQotIQl0ZXN0IENQV1JDWFQ6IGp1c3Qgc3ludGF4Ci0KLQljd3JjeHQJJWwwLCAlY2NzcgotCWN3cmN4dAklbDAsICVjY2ZyCi0JY3dyY3h0CSVsMCwgJWNjcHIKLQljd3JjeHQJJWwwLCAlY2NjcmNyCi0KLSEJdGVzdCBDQmNjYzoganVzdCBzeW50YXgKLQotCWNibglzdG9wCi0Jbm9wCi0JY2JuLGEJc3RvcAotCW5vcAotCWNiZQlzdG9wCi0Jbm9wCi0JY2JlLGEJc3RvcAotCW5vcAotCWNiZglzdG9wCi0Jbm9wCi0JY2JmLGEJc3RvcAotCW5vcAotCWNiZWYJc3RvcAotCW5vcAotCWNiZWYsYQlzdG9wCi0Jbm9wCi0JY2JyCXN0b3AKLQlub3AKLQljYnIsYQlzdG9wCi0Jbm9wCi0JY2JlcglzdG9wCi0Jbm9wCi0JY2JlcixhCXN0b3AKLQlub3AKLQljYmZyCXN0b3AKLQlub3AKLQljYmZyLGEJc3RvcAotCW5vcAotCWNiZWZyCXN0b3AKLQlub3AKLQljYmVmcixhCXN0b3AKLQlub3AKLQljYmEJc3RvcAotCW5vcAotCWNiYSxhCXN0b3AKLQlub3AKLQljYm5lCXN0b3AKLQlub3AKLQljYm5lLGEJc3RvcAotCW5vcAotCWNibmYJc3RvcAotCW5vcAotCWNibmYsYQlzdG9wCi0Jbm9wCi0JY2JuZWYJc3RvcAotCW5vcAotCWNibmVmLGEJc3RvcAotCW5vcAotCWNibnIJc3RvcAotCW5vcAotCWNibnIsYQlzdG9wCi0Jbm9wCi0JY2JuZXIJc3RvcAotCW5vcAotCWNibmVyLGEJc3RvcAotCW5vcAotCWNibmZyCXN0b3AKLQlub3AKLQljYm5mcixhCXN0b3AKLQlub3AKLQljYm5lZnIJc3RvcAotCW5vcAotCWNibmVmcixhCXN0b3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDIyMmM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jYXM6IC1BdjcKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogc3BhcmMgc3ludGgKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxmb28+IHhub3IgICVnMSwgJWcwLCAlZzIKLTArMDAwNCA8Zm9vXCsoMHh8KTQ+IHhub3IgICVnMSwgJWcwLCAlZzEKLTArMDAwOCA8Zm9vXCsoMHh8KTg+IG5lZyAgJWcxLCAlZzIKLTArMDAwYyA8Zm9vXCsoMHh8KWM+IG5lZyAgJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwNjYyOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIGNvbW1vbiAodjggb3IgdjkpIHN5bnRoZXRpYyBpbnNucwotCS50ZXh0Ci1mb286Ci0Jbm90ICVnMSwlZzIKLQlub3QgJWcxCi0JbmVnICVnMSwlZzIKLQluZWcgJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNmM4YzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGg2NC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBzcGFyYzY0IHN5bnRoNjQKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8Zm9vLSgweHwpND4gaXByZWZldGNoICAwKzAwMDQgPGZvbz4KLTArMDAwNCA8Zm9vPiBzaWdueCAgJWcxLCAlZzIKLTArMDAwOCA8Zm9vXCsoMHh8KTQ+IGNscnV3ICAlZzEsICVnMgotMCswMDBjIDxmb29cKygweHwpOD4gY2FzICBcWyAlZzEgXF0sICVnMiwgJWczCi0wKzAwMTAgPGZvb1wrKDB4fCljPiBjYXNsICBcWyAlZzEgXF0sICVnMiwgJWczCi0wKzAwMTQgPGZvb1wrKDB4fCkxMD4gY2FzeCAgXFsgJWcxIFxdLCAlZzIsICVnMwotMCswMDE4IDxmb29cKygweHwpMTQ+IGNhc3hsICBcWyAlZzEgXF0sICVnMiwgJWczCi0wKzAwMWMgPGZvb1wrKDB4fCkxOD4gY2xyeCAgXFsgJWcxIFwrICVnMiBcXQotMCswMDIwIDxmb29cKygweHwpMWM+IGNscnggIFxbICVnMSBcXQotMCswMDI0IDxmb29cKygweHwpMjA+IGNscnggIFxbICVnMSBcKyAxIFxdCi0wKzAwMjggPGZvb1wrKDB4fCkyND4gY2xyeCAgXFsgJWcxIFwrIDB4MmEgXF0KLTArMDAyYyA8Zm9vXCsoMHh8KTI4PiBjbHJ4ICBcWyAweDQyIFxdCi0wKzAwMzAgPGZvb1wrKDB4fCkyYz4gc2lnbnggICVnMQotMCswMDM0IDxmb29cKygweHwpMzA+IGNscnV3ICAlZzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhYjg3My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIHNwYXJjNjQgc3ludGhldGljIGluc25zCi0JLnRleHQKLQlpcHJlZmV0Y2ggZm9vCi1mb286Ci0Jc2lnbnggJWcxLCVnMgotCWNscnV3ICVnMSwlZzIKLQljYXMgWyVnMV0sJWcyLCVnMwotCWNhc2wgWyVnMV0sJWcyLCVnMwotCWNhc3ggWyVnMV0sJWcyLCVnMwotCWNhc3hsIFslZzFdLCVnMiwlZzMKLQotCWNscnggWyVnMSslZzJdCi0JY2xyeCBbJWcxXQotCWNscnggWyVnMSsxXQotCWNscnggWzQyKyVnMV0KLQljbHJ4IFsweDQyXQotCi0Jc2lnbnggJWcxCi0JY2xydXcgJWcyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy93cnByLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy93cnByLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2M4MGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5kCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI2FzOiAtNjQgLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgd3JwcgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+OgotICAgMDoJODEgOTAgNDAgMDAgCXdycHIgICVnMSwgJXRwYwotICAgNDoJODMgOTAgODAgMDAgCXdycHIgICVnMiwgJXRucGMKLSAgIDg6CTg1IDkwIGMwIDAwIAl3cnByICAlZzMsICV0c3RhdGUKLSAgIGM6CTg3IDkxIDAwIDAwIAl3cnByICAlZzQsICV0dAotICAxMDoJODkgOTEgNDAgMDAgCXdycHIgICVnNSwgJXRpY2sKLSAgMTQ6CThiIDkxIDgwIDAwIAl3cnByICAlZzYsICV0YmEKLSAgMTg6CThkIDkxIGMwIDAwIAl3cnByICAlZzcsICVwc3RhdGUKLSAgMWM6CThmIDkyIDAwIDAwIAl3cnByICAlbzAsICV0bAotICAyMDoJOTEgOTIgNDAgMDAgCXdycHIgICVvMSwgJXBpbAotICAyNDoJOTMgOTIgODAgMDAgCXdycHIgICVvMiwgJWN3cAotICAyODoJOTUgOTIgYzAgMDAgCXdycHIgICVvMywgJWNhbnNhdmUKLSAgMmM6CTk3IDkzIDAwIDAwIAl3cnByICAlbzQsICVjYW5yZXN0b3JlCi0gIDMwOgk5OSA5MyA0MCAwMCAJd3JwciAgJW81LCAlY2xlYW53aW4KLSAgMzQ6CTliIDkzIDgwIDAwIAl3cnByICAlc3AsICVvdGhlcndpbgotICAzODoJOWQgOTMgYzAgMDAgCXdycHIgICVvNywgJXdzdGF0ZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2ZkNDUwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3dycHIucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgVGVzdCB3cnByCi0JLnRleHQKLQl3cnByICVnMSwldHBjCi0Jd3JwciAlZzIsJXRucGMKLQl3cnByICVnMywldHN0YXRlCi0Jd3JwciAlZzQsJXR0Ci0Jd3JwciAlZzUsJXRpY2sKLQl3cnByICVnNiwldGJhCi0Jd3JwciAlZzcsJXBzdGF0ZQotCXdycHIgJW8wLCV0bAotCXdycHIgJW8xLCVwaWwKLQl3cnByICVvMiwlY3dwCi0Jd3JwciAlbzMsJWNhbnNhdmUKLQl3cnByICVvNCwlY2FucmVzdG9yZQotCXdycHIgJW81LCVjbGVhbndpbgotCXdycHIgJW82LCVvdGhlcndpbgotCXdycHIgJW83LCV3c3RhdGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zdW40L2FkZGVuZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGZmNDU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jb2JqZHVtcDogLXIKLSMgbmFtZSA6IGFkZGVuZHMKLS4qOiArZmlsZSBmb3JtYXQgYS5vdXQtc3Vub3MtYmlnCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsudGV4dFxdOgotT0ZGU0VUICAgVFlQRSArVkFMVUUgCi0wKzA4IFdESVNQMjIgK2ZvbzFcKzB4ZitmYwotMCswYyBXRElTUDIyICtmb28xXCsweGYrZjgKLTArMTAgV0RJU1AyMiArZm9vMVwrMHhmK2YwCi0wKzE0IFdESVNQMjIgK2ZvbzFcKzB4ZitlYwotMCsxYyAzMiArZm9vMQotMCsyMCAzMiArZm9vMVwrMHgwKzQKLSMwKzIwIDMyICtmb28xXCsweDArNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdiNDZlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIwotIyBTdW5PUzQgb24gU1BBUkMgdGVzdHMKLSMKLQotaWYgW2lzdGFyZ2V0IHNwYXJjLSotc3Vub3M0Kl0gdGhlbiB7Ci0gICAgcnVuX2R1bXBfdGVzdCAiYWRkZW5kIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWIxMDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkuZ2xvYmFsIGZvbwotZm9vOgotCW5vcAotCW5vcAotCWJhIGZvbzErMHg0Ci0JYmEgZm9vMSsweDQKLQliYSBmb28xCi0JYmEgZm9vMQotCW5vcAotCS53b3JkIGZvbzEKLQkud29yZCBmb28xKzQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RlbXBsYXRlIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNGQ3OWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0jCi0jIFRoaXMgaXMgc29ydCBvZiBhIHByb3RvdHlwZSB0ZXN0IGNhc2UsIHdoaWNoIHBhcnNlcyB0aGUgbGlzdGluZyBvdXRwdXQKLSMgZnJvbSB0aGUgYXNzZW1ibGVyLiAgTGF0ZXIsIG1vcmUgcHJvdG90eXBlcyBzaG91bGQgYmUgYWRkZWQgZm9yIGNhc2VzCi0jIHdoZXJlIG9iamR1bXAgZ2V0cyBydW4gb3ZlciB0aGUgLm8gZmlsZSwgYW5kIGFueXRoaW5nIGVsc2UgbGlrZSB0aGF0Li4uCi0jCi0jIFdoZW4geW91IHdyaXRlIGEgdGVzdCBjYXNlIHRoYXQgdXNlcyB0aGUgbGlzdGluZyBvdXRwdXQsIGp1c3QgY29weSB0aGlzCi0jIGZpbGUgKHRyaW1taW5nIGRvd24gdGhlIG92ZXJseS12ZXJib3NlIGNvbW1lbnRzIGEgbGl0dGxlKSwgYW5kCi0jIGFkanVzdCBpdCB0byBkbyB3aGF0IHlvdSBuZWVkLgotIwotIyBSZW1lbWJlciB0aGF0IGFueSAiLmV4cCIgZmlsZSBmb3VuZCBpbiB0aGUgdHJlZSB3aWxsIGJlIHByb2Nlc3NlZCBieQotIyBkZWphZ251LgotCi0jCi0jIEZJUlNUIFNBTVBMRSBURVNUIENBU0UKLSMKLQotcHJvYyBkb19mb28ge30gewotIyBUaGlzIHN0cmluZyBpcyB1c2VkIGJlbG93IHdoZW4gcHJpbnRpbmcgb3V0IGEgc3VjY2VzcyBvciBmYWlsdXJlIG1lc3NhZ2UuCi0jIElmIG1vcmUgdGhhbiBvbmUgdGVzdCBpcyBydW4gYnkgYSBnaXZlbiAuZXhwIGZpbGUsIGl0J2QgYmUgbmljZSB0byBpbmNsdWRlCi0jIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlLgotICAgIHNldCB0ZXN0bmFtZSAiZm9vLnM6IG11bHRpLXJlZ2lzdGVyIHR3ZWFraW5nIGFuZCBmcm9ibmljYXRpb24iCi0KLSMgSSB1c2UgdGhpcyBhcyBhIGZsYWcgdG8gcmVjb3JkIHdoZXRoZXIgdGhlIHRlc3QgY2FzZSBwYXNzZWQuICBJZiB0aGlzCi0jIGZsYWcgaXMgc3RpbGwgY2xlYXIgd2hlbiBFT0YgaXMgcmVhY2hlZCwgdGhpcyB0ZXN0IGZhaWxzLiAgSWYgdGhlcmUgYXJlCi0jIHR3byBvciBtb3JlIHBhdHRlcm5zLCBhbmQgSSBuZWVkIHRvIHNlZSBhbGwgb2YgdGhlbSwgSSdsbCBjcmVhdGUgTiB2YXJpYWJsZXMKLSMgYW5kIGNoZWNrIGlmIHRoZSBzdW0gaXMgTi4KLSAgICBzZXQgeCAwCi0KLSMgQ2FsbCBnYXNfc3RhcnQgd2l0aCB0d28gYXJndW1lbnRzOiBUaGUgaW5wdXQgZmlsZSBuYW1lICh3aGljaCBpdCdsbCBzZWFyY2gKLSMgZm9yIGluICRzcmNkaXIvJHN1YmRpciwgdGhhdCBpcywgdGhlIHNvdXJjZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIC5leHAgZmlsZQotIyBpcyksIGFuZCBhIChwb3NzaWJseSBlbXB0eSkgc3RyaW5nIG9mIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgYXNzZW1ibGVyLgotICAgIGdhc19zdGFydCAiZm9vLnMiICItYWwiCi0KLSMgTm93IEkganVzdCBpdGVyYXRlIG92ZXIgYWxsIHRoZSBvdXRwdXQgbGluZXMsIGxvb2tpbmcgZm9yIHdoYXQgSSB3YW50Ci0jIHRvIHNlZS4gIFNpbmNlIGVhY2ggcGF0dGVybiBleHBsaWNpdGx5IHdpbGwgbm90IHNwYW4gbGluZSBicmVha3MsIHRoZXJlJ3MKLSMgYWxzbyBhIHBhdHRlcm4gZm9yIGxpbmVzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55dGhpbmcgZWxzZS4gICAoSXMgaXQgc2FmZSB0bwotIyB1c2UgIi4qIiBmb3IgcGF0dGVybnMgbm90IGNyb3NzaW5nIGxpbmUgYnJlYWtzPyBJIGRvbid0IHRoaW5rICIkIiBkb2VzIHRoZQotIyByaWdodCB0aGluZyBmb3IgdGhhdCwgaW4gYW55IGNhc2UuICBJIHNob3VsZCBjaGVjayBpbnRvIHdoZXRoZXIgdGhlIGV4dHJhCi0jIHBhdHRlcm4gaXMgZXZlbiBuZWVkZWQuCi0KLSMgQXBwYXJlbnRseSBDUkxGIGlzIHJlY2VpdmVkIHdoZW4gdXNpbmcgcHR5cyBmb3Igc3VicHJvY2Vzc2VzOyBoZW5jZSB0aGUKLSMgXHJcbiBmb3IgbWF0Y2hpbmcgbGluZSBudW1iZXIgMy4KLQotIyBOb3RlIHRoYXQgaWYgeW91IHVzZSAieyAuLi4gfSIgZm9yIHRoZSBleHBlY3QgY2xhdXNlLCB5b3UgY2FuJ3QgaGF2ZQotIyBjb21tZW50cyBpbnNpZGUgaXQuCi0KLSMgVGhpcyB0ZXN0IGNhc2UgaXMga2luZGEgYm9ndXMgaW4gdGhhdCBzZWVpbmcgZWl0aGVyIGEgd29yZCBvZiBhbGwgemVyb3MKLSMgYXQgYWRkcmVzcyB6ZXJvIG9yIGEgQy1zdHlsZSBjb21tZW50IG9uIGxpbmUgdGhyZWUgdGhhdCBzYXlzICJMb29raW5nIGZvcgotIyBDIGNvbW1lbnRzIiAod2l0aCB2ZXJ5IHNwZWNpZmljIHB1bmN0dWF0aW9uIGFuZCB3aGl0ZXNwYWNlKSB3aWxsIGNhdXNlCi0jIGl0IHRvIHBhc3MgdGhpcyB0ZXN0LiAgVXN1YWxseSAKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDAwMDAwMDBcW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkgICAgLXJlICJeICszXFsgXHRcXSsvLiBMb29raW5nIGZvciBDIGNvbW1lbnRzLiAuL1xyXG4iCXsgc2V0IHggMSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0IGlzbid0Ci0jIG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiAkeCB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi0jIE5vdyBhY3R1YWxseSBydW4gdGhlIHRlc3QuICBJdCBjYW4gYmUgY29uZGl0aW9uYWxpemVkIGlmIHRoZSB0ZXN0IGlzCi0jIG5vdCBhcHByb3ByaWF0ZSBmb3IgYWxsIHRhcmdldHMuICBUaGUgcHJvYyAiaXN0YXJnZXQiIGNoZWNrcyBhIGdlbmVyYWxpemVkCi0jIGZvcm0gb2YgdGhlIHRhcmdldCBuYW1lLCBzbyB0aGF0IChlLmcuKSAibTY4MzMyLXVua25vd24tYW91dCIgd291bGQgbWF0Y2gKLSMgaGVyZS4gIFNvIGZhciwgSSB0aGluayBvbmx5IHRoZSBDUFUgbmFtZSBpcyBhY3R1YWxseSBldmVyIGFsdGVyZWQuCi1pZiBbaXN0YXJnZXQgbTY4ay0qXSB0aGVuIHsKLSAgICBkb19mb28KLX0KLQotCi0KLQotIwotIyBTRUNPTkQgU0FNUExFIFRFU1QgQ0FTRQotIwotCi0jIFRoaXMgaXMgYSB0aW55IGJpdCBsaWtlIHRoZSBDIGNvbXBpbGVyIHRvcnR1cmUgdGVzdHMsIGluIHRoYXQgaXQnbGwgcnVuCi0jIHRoZSBhc3NlbWJsZXIgd2l0aCB0aGUgcG93ZXIgc2V0IG9mIHRoZSBsaXN0IG9mIG9wdGlvbnMgc3VwcGxpZWQuCi0jCi0jIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgdGVzdCBmaWxlIG5hbWU7IHRoZSBzZWNvbmQgaXMgYXJndW1lbnRzIHRoYXQKLSMgYXJlIGFsd2F5cyB0byBiZSBwcm92aWRlZDsgdGhlIHRoaXJkIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2Ygb3B0aW9ucwotIyB3aGljaCBhcmUgb3B0aW9uYWwgKGVuZGluZyBpbiAiPiIgaWYgb3V0cHV0IHNob3VsZCBiZSBpZ25vcmVkLCBsaWtlICItYT4iKTsKLSMgdGhlIGZvdXJ0aCBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdC4gIFNvIGZhciwgb25seSBiaW5hcnkgb3B0aW9ucyBhcmUgaGFuZGxlZAotIyB0aGlzIHdheTsgTi13YXkgb3B0aW9ucyAobGlrZSBDUFUgdHlwZSBmb3IgbTY4aykgYXJlbid0IGhhbmRsZWQgeWV0LgotIwotIyBUaGUgdmFyaWFibGUgJHN0ZG9wdGxpc3QgdXN1YWxseSBoYXMgYSByZWFzb25hYmxlIHNldCBvZiBvcHRpb25hbCBvcHRpb25zCi0jIGZvciB0aGlzIHRhcmdldC4KLQotIyBObywgUElDIGlzbid0IHN1cHBvcnRlZCB5ZXQuICBUaGlzIGlzIG9ubHkgYW4gZXhhbXBsZS4KLWdhc190ZXN0ICJxdXV4LnMiICItSyIgJHN0ZG9wdGxpc3QgInVzZSBvZiBxdXV4ZXMgaW4gUElDIG1vZGUiCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGVjNzA3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgc2lnbmVkIGFuZCB1bnNpZ25lZCBhZGQgaW5zdHJ1Y3Rpb25zCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwYSAwMCBmYiA2Mi4qCi0gICA0OglmZiAzZiBhYyAyMC4qCi0gICA4OgkwMCA0MCAyYyAyMS4qCi0gICBjOgkwMCAxMCA3YiAzMSAwMCA0MCAwMCAwMC4qCi0gIDE0OgkwMCAxMCBmYiA0MSBmZiBiZiBmZiBmZi4qCi0gIDFjOgkwMCAxMCBiYiA1YSBmZiBmZiBmZiA3Zi4qCi0gIDI0OgkwMCAxMCAzYiA2YiAwMCAwMCAwMCA4MC4qCi0gIDJjOgkwYSAyMCBmYiA2Mi4qCi0gIDMwOglmZiBiZiBhYyAyMC4qCi0gIDM0OgkwMCBjMCAyYyAyMS4qCi0gIDM4OgkwMCAzMCA3YiAzMSAwMCA0MCAwMCAwMC4qCi0gIDQwOgkwMCAzMCBmYiA0MSBmZiBiZiBmZiBmZi4qCi0gIDQ4OgkwMCAzMCBiYiA1YSBmZiBmZiBmZiA3Zi4qCi0gIDUwOgkwMCAzMCAzYiA2YiAwMCAwMCAwMCA4MC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyYjM2OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQubHN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDIwOjEzOjMzIDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotYWRkLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDsgVGVzdCBzaWduZWQgYW5kIHVuc2lnbmVkIGFkZGl0aW9uIGluc3RydWN0aW9uLgotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOyBUZXN0IGJvdW5kYXJ5IGNvbmRpdGlvbnMgdG8gZW5zdXJlIHByb3BlciBoYW5kbGluZy4KLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDsgTm90ZSB0aGF0IHVuc2lnbmVkIGFkZGl0aW9uIHN0aWxsIHVzZXMgc2lnbmVkIGltbWVkaWF0ZXMuCi0gICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNSAwMDAwMDAwMCAgIDYyRkIwMDBBICAgICAgICAgYWRkICAgICByMTAscjExLHIxMiAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNiAwMDAwMDAwNCAgIDIwQUMzRkZGICAgICAgICAgYWRkICAgICAxNjM4MyxyMixyNCAgICAgICAgICAgICA7IE1heGltdW0gcG9zaXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICA3IDAwMDAwMDA4ICAgMjEyQzQwMDAgICAgICAgICBhZGQgICAgIC0xNjM4NCxyNCxyNCAgICAgICAgICAgIDsgTWluaW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgIDggMDAwMDAwMEMgICAzMTdCMTAwMCAgICAgICAgIGFkZCAgICAgMTYzODQscjUscjYgICAgICAgICAgICAgOyBNaW5pbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICAgIDAwMDAwMDEwICAgMDAwMDQwMDAgCi0gICAgICAgIDkgMDAwMDAwMTQgICA0MUZCMTAwMCAgICAgICAgIGFkZCAgICAgLTE2Mzg1LHI3LHI4ICAgICAgICAgICAgOyBNYXhpbXVtIG5lZ2F0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDAxOCAgIEZGRkZCRkZGIAotICAgICAgIDEwIDAwMDAwMDFDICAgNUFCQjEwMDAgICAgICAgICBhZGQgICAgIDIxNDc0ODM2NDcscjEwLHIxMSAgICAgIDsgTWF4aW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDAyMCAgIDdGRkZGRkZGIAotICAgICAgIDExIDAwMDAwMDI0ICAgNkIzQjEwMDAgICAgICAgICBhZGQgICAgIC0yMTQ3NDgzNjQ4LHIxMixyMTMgICAgIDsgTWluaW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDAyOCAgIDgwMDAwMDAwIAotICAgICAgIDEyICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMTMgMDAwMDAwMkMgICA2MkZCMjAwQSAgICAgICAgIGFkZHUgICAgcjEwLHIxMSxyMTIgICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTQgMDAwMDAwMzAgICAyMEFDQkZGRiAgICAgICAgIGFkZHUgICAgMTYzODMscjIscjQgICAgICAgICAgICAgOyBNYXhpbXVtIHBvc2l0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAxNSAwMDAwMDAzNCAgIDIxMkNDMDAwICAgICAgICAgYWRkdSAgICAtMTYzODQscjQscjQgICAgICAgICAgICA7IE1pbmltdW0gbmVnYXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgIDE2IDAwMDAwMDM4ICAgMzE3QjMwMDAgICAgICAgICBhZGR1ICAgIDE2Mzg0LHI1LHI2ICAgICAgICAgICAgIDsgTWluaW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDAzQyAgIDAwMDA0MDAwIAotICAgICAgIDE3IDAwMDAwMDQwICAgNDFGQjMwMDAgICAgICAgICBhZGR1ICAgIC0xNjM4NSxyNyxyOCAgICAgICAgICAgIDsgTWF4aW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgICAgMDAwMDAwNDQgICBGRkZGQkZGRiAKLSAgICAgICAxOCAwMDAwMDA0OCAgIDVBQkIzMDAwICAgICAgICAgYWRkdSAgICAyMTQ3NDgzNjQ3LHIxMCxyMTEgICAgICA7IE1heGltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgICAgMDAwMDAwNEMgICA3RkZGRkZGRiAKLSAgICAgICAxOSAwMDAwMDA1MCAgIDZCM0IzMDAwICAgICAgICAgYWRkdSAgICAtMjE0NzQ4MzY0OCxyMTIscjEzICAgICA7IE1pbmltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgICAgMDAwMDAwNTQgICA4MDAwMDAwMCAKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzIyOWVkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotOyBUZXN0IHNpZ25lZCBhbmQgdW5zaWduZWQgYWRkaXRpb24gaW5zdHJ1Y3Rpb24uCi07IFRlc3QgYm91bmRhcnkgY29uZGl0aW9ucyB0byBlbnN1cmUgcHJvcGVyIGhhbmRsaW5nLgotOyBOb3RlIHRoYXQgdW5zaWduZWQgYWRkaXRpb24gc3RpbGwgdXNlcyBzaWduZWQgaW1tZWRpYXRlcy4KLQotCWFkZAlyMTAscjExLHIxMgkJOyBSZWdpc3RlciBmb3JtCi0JYWRkCTE2MzgzLHIyLHI0CQk7IE1heGltdW0gcG9zaXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQotCWFkZAktMTYzODQscjQscjQJCTsgTWluaW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0JYWRkCTE2Mzg0LHI1LHI2CQk7IE1pbmltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkCS0xNjM4NSxyNyxyOAkJOyBNYXhpbXVtIG5lZ2F0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCWFkZAkyMTQ3NDgzNjQ3LHIxMCxyMTEJOyBNYXhpbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCWFkZAktMjE0NzQ4MzY0OCxyMTIscjEzCTsgTWluaW11bSBuZWdhdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLQotCWFkZHUJcjEwLHIxMSxyMTIJCTsgUmVnaXN0ZXIgZm9ybQotCWFkZHUJMTYzODMscjIscjQJCTsgTWF4aW11bSBwb3NpdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0JYWRkdQktMTYzODQscjQscjQJCTsgTWluaW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0JYWRkdQkxNjM4NCxyNSxyNgkJOyBNaW5pbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCWFkZHUJLTE2Mzg1LHI3LHI4CQk7IE1heGltdW0gbmVnYXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkdQkyMTQ3NDgzNjQ3LHIxMCxyMTEJOyBNYXhpbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCWFkZHUJLTIxNDc0ODM2NDgscjEyLHIxMwk7IE1pbmltdW0gbmVnYXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmOTYxMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgLmFsaWduIHBzZXVkbyBvcAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJYWIgMDAgMDAgMDAuKgotICAgNDoJY2QgMDAgZWYgMDAuKgotICAgODoJZjEgMDAgMDAgMDAuKgotICAgYzoJZWUgMDAgMDAgMDAuKgotICAxMDoJYWMgMDAgMDAgMDAuKgotICAxNDoJMDAgMDAgMDAgMDAuKgotICAxODoJYWIgMDAgMDAgMDAuKgotICAxYzoJMDAgMDAgMDAgMDAuKgotICAyMDoJZmUgMDAgMDAgMDAuKgotCVwuXC5cLgotICAzMDoJZGUgYWQgYmUgZWYuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTU0MTVhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgVGh1IEZlYiAyNyAxNzowMjoyMyAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWFsaWduLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyAgICAgIFRlc3QgdGhlIC5hbGlnbiBkaXJlY3RpdmUuCi0gICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgMyAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgLnRleHQKLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4QUIwMDAwMDAKLSAgICAgICAgNiAwMDAwMDAwMCAgIEFCICAgICAgICAgICAgICAgLmJ5dGUgICAweEFCCi0gICAgICAgIDcgMDAwMDAwMDEgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgICAgICAgICAgICAgICAgIDsgU2hvdWxkIGRlZmF1bHQgdG8gNCBieXRlIGFsaWdubWVudAotICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4Q0QwMEVGMDAKLSAgICAgICAxMCAwMDAwMDAwNCAgIENEICAgICAgICAgICAgICAgLmJ5dGUgICAweENECi0gICAgICAgMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgMiAgICAgICAgICAgICAgIDsgIFNob3VsZCBhbGlnbiB0byB0aGUgbmV4dCAyLWJ5dGUgYm91bmRhcnkgKHBhZCB3aXRoIG9uZSBudWxsIGJ5dAotICAgICAgIDEyIDAwMDAwMDA2ICAgRUYgICAgICAgICAgICAgICAuYnl0ZSAgIDB4RUYKLSAgICAgICAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFsaWduICAxCi0gICAgICAgMTQgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhGMTAwMDAwMAotICAgICAgIDE2IDAwMDAwMDA3ICAgICAgICAgICAgICAgICAgICAuYWxpZ24gIDQgICAgICAgICAgICAgICA7ICBTaG91bGQgbm90IGFmZmVjdCBhbGlnbm1lbnQgKGFscmVhZHkgb24gNCkKLSAgICAgICAxNyAwMDAwMDAwOCAgIEYxICAgICAgICAgICAgICAgLmJ5dGUgICAweEYxCi0gICAgICAgMTggMDAwMDAwMDkgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgNCAgICAgICAgICAgICAgIDsgIFNob3VsZCBhbGlnbiB0byBuZXh0IDQgYnl0ZSBib3VuZGFyeQotICAgICAgIDE5ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4RUUwMDAwMDAgc2luY2Ugd2UgYXJlIGFscmVhZHkgb24gNCBieXRlIGFsaWdubWVudAotICAgICAgIDIxIDAwMDAwMDBDICAgRUUgICAgICAgICAgICAgICAuYnl0ZSAweEVFCi0gICAgICAgMjIgMDAwMDAwMEQgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgOAotICAgICAgIDIzICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4QUMwMDAwMDAgMHgwMDAwMDAwMAotICAgICAgIDI1IDAwMDAwMDEwICAgQUMgICAgICAgICAgICAgICAuYnl0ZSAgIDB4QUMKLSAgICAgICAyNiAwMDAwMDAxMSAgICAgICAgICAgICAgICAgICAgLmFsaWduICA4Ci0gICAgICAgMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEFCMDAwMDAwIDB4MDAwMDAwMDAgc2luY2Ugd2UgYXJlIGF0IDggYnl0ZSBhbGlnbm1lbnQKLSAgICAgICAyOSAwMDAwMDAxOCAgIEFCICAgICAgICAgICAgICAgLmJ5dGUgICAweEFCCi0gICAgICAgMzAgMDAwMDAwMTkgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgMTYKLSAgICAgICAzMSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEZFMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwCi0gICAgICAgMzMgMDAwMDAwMjAgICBGRSAgICAgICAgICAgICAgIC5ieXRlICAgMHhGRQotICAgICAgIDM0IDAwMDAwMDIxICAgICAgICAgICAgICAgICAgICAuYWxpZ24gIDE2Ci0gICAgICAgMzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIGp1c3QgZm9yY2VzIHRoZSBkaXNhc3NlbWJsZXIgdG8gbm90IHByaW50IC4uLiBmb3IgdHJhaWxpbmcgbnVsbHMKLSAgICAgICAzNyAwMDAwMDAzMCAgIERFICAgICAgICAgICAgICAgLmJ5dGUgMHhERSwgMHhBRCwgMHhCRSwgMHhFRgotICAgICAgICAgIDAwMDAwMDMxICAgQUQgICAgICAgCi0gICAgICAgICAgMDAwMDAwMzIgICBCRSAgICAgICAKLSAgICAgICAgICAwMDAwMDAzMyAgIEVGICAgICAgIAotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMxMjU2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi07OwlUZXN0IHRoZSAuYWxpZ24gZGlyZWN0aXZlLgotCi0JLnRleHQKLQkKLQk7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEFCMDAwMDAwCi0JLmJ5dGUJMHhBQgotCS5hbGlnbgkJCTsgU2hvdWxkIGRlZmF1bHQgdG8gNCBieXRlIGFsaWdubWVudAotCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhDRDAwRUYwMAotCS5ieXRlCTB4Q0QKLQkuYWxpZ24JMgkJOyAgU2hvdWxkIGFsaWduIHRvIHRoZSBuZXh0IDItYnl0ZSBib3VuZGFyeSAocGFkIHdpdGggb25lIG51bGwgYnl0ZSkKLQkuYnl0ZQkweEVGCi0JLmFsaWduCTEKLQotCTs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4RjEwMDAwMDAKLQkuYWxpZ24JNAkJOyAgU2hvdWxkIG5vdCBhZmZlY3QgYWxpZ25tZW50IChhbHJlYWR5IG9uIDQpCi0JLmJ5dGUJMHhGMQotCS5hbGlnbgk0CQk7ICBTaG91bGQgYWxpZ24gdG8gbmV4dCA0IGJ5dGUgYm91bmRhcnkKLQotCTs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4RUUwMDAwMDAgc2luY2Ugd2UgYXJlIGFscmVhZHkgb24gNCBieXRlIGFsaWdubWVudAotCS5ieXRlIDB4RUUKLQkuYWxpZ24JOAotCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhBQzAwMDAwMCAweDAwMDAwMDAwCi0JLmJ5dGUJMHhBQwotCS5hbGlnbgk4Ci0JCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhBQjAwMDAwMCAweDAwMDAwMDAwIHNpbmNlIHdlIGFyZSBhdCA4IGJ5dGUgYWxpZ25tZW50Ci0JLmJ5dGUJMHhBQgotCS5hbGlnbgkxNgotCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhGRTAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMAotCS5ieXRlCTB4RkUKLQkuYWxpZ24JMTYKLQkKLQk7OyBUaGlzIGp1c3QgZm9yY2VzIHRoZSBkaXNhc3NlbWJsZXIgdG8gbm90IHByaW50IC4uLiBmb3IgdHJhaWxpbmcgbnVsbHMKLQkuYnl0ZSAweERFLCAweEFELCAweEJFLCAweEVGCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2FlZThiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5kCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgY292ZXJhZ2Ugb2Ygc3ltYm9saWMgQklUTlVNIHZhbHVlcwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMGEgNDAgMzkgZmEuKgotICAgNDoJMGEgNDAgMzkgZjIuKgotICAgODoJMGEgNDAgMzkgZWEuKgotICAgYzoJMGEgNDAgMzkgZTIuKgotICAxMDoJMGEgNDAgMzkgZGEuKgotICAxNDoJMGEgNDAgMzkgZDIuKgotICAxODoJMGEgNDAgMzkgY2EuKgotICAxYzoJMGEgNDAgMzkgYzIuKgotICAyMDoJMGEgNDAgMzkgYmEuKgotICAyNDoJMGEgNDAgMzkgYjIuKgotICAyODoJMGEgNDAgMzkgYWEuKgotICAyYzoJMGEgNDAgMzkgYTIuKgotICAzMDoJMGEgNDAgMzkgOWEuKgotICAzNDoJMGEgNDAgMzkgOTIuKgotICAzODoJMGEgNDAgMzkgOGEuKgotICAzYzoJMGEgNDAgMzkgODIuKgotICA0MDoJMGEgNDAgMzkgN2EuKgotICA0NDoJMGEgNDAgMzkgNzIuKgotICA0ODoJMGEgNDAgMzkgNmEuKgotICA0YzoJMGEgNDAgMzkgNjIuKgotICA1MDoJMGEgNDAgMzkgNWEuKgotICA1NDoJMGEgNDAgMzkgNTIuKgotICA1ODoJMGEgNDAgMzkgNGEuKgotICA1YzoJMGEgNDAgMzkgNDIuKgotICA2MDoJMGEgNDAgMzkgM2EuKgotICA2NDoJMGEgNDAgMzkgMzIuKgotICA2ODoJMGEgNDAgMzkgMmEuKgotICA2YzoJMGEgNDAgMzkgMjIuKgotICA3MDoJMGEgNDAgMzkgMWEuKgotICA3NDoJMGEgNDAgMzkgMTIuKgotICA3ODoJMGEgNDAgMzkgNWEuKgotICA3YzoJMGEgNDAgMzkgNTIuKgotICA4MDoJMGEgNDAgMzkgNGEuKgotICA4NDoJMGEgNDAgMzkgNDIuKgotICA4ODoJMGEgNDAgMzkgM2EuKgotICA4YzoJMGEgNDAgMzkgMzIuKgotICA5MDoJMGEgNDAgMzkgMmEuKgotICA5NDoJMGEgNDAgMzkgMjIuKgotICA5ODoJMGEgNDAgMzkgMWEuKgotICA5YzoJMGEgNDAgMzkgMTIuKgotICBhMDoJMGEgNDAgMzkgMGEuKgotICBhNDoJMGEgNDAgMzkgMDIuKgotICBhODoJMGEgNDAgMzkgZmEuKgotICBhYzoJMGEgNDAgMzkgZjIuKgotICBiMDoJMGEgNDAgMzkgZWEuKgotICBiNDoJMGEgNDAgMzkgZTIuKgotICBiODoJMGEgNDAgMzkgZGEuKgotICBiYzoJMGEgNDAgMzkgZDIuKgotICBjMDoJMGEgNDAgMzkgY2EuKgotICBjNDoJMGEgNDAgMzkgYzIuKgotICBjODoJMGEgNDAgMzkgYmEuKgotICBjYzoJMGEgNDAgMzkgYjIuKgotICBkMDoJMGEgNDAgMzkgYWEuKgotICBkNDoJMGEgNDAgMzkgYTIuKgotICBkODoJMGEgNDAgMzkgOWEuKgotICBkYzoJMGEgNDAgMzkgOTIuKgotICBlMDoJMGEgNDAgMzkgOGEuKgotICBlNDoJMGEgNDAgMzkgODIuKgotICBlODoJMGEgNDAgMzkgN2EuKgotICBlYzoJMGEgNDAgMzkgNzIuKgotICBmMDoJMGEgNDAgMzkgNmEuKgotICBmNDoJMGEgNDAgMzkgNjIuKgotICBmODoJMGEgNDAgMzkgNWEuKgotICBmYzoJMGEgNDAgMzkgNTIuKgotIDEwMDoJMGEgNDAgMzkgNGEuKgotIDEwNDoJMGEgNDAgMzkgNDIuKgotIDEwODoJMGEgNDAgMzkgM2EuKgotIDEwYzoJMGEgNDAgMzkgMzIuKgotIDExMDoJMGEgNDAgMzkgMmEuKgotIDExNDoJMGEgNDAgMzkgMjIuKgotIDExODoJMGEgNDAgMzkgMWEuKgotIDExYzoJMGEgNDAgMzkgMTIuKgotIDEyMDoJMGEgNDAgMzkgMGEuKgotIDEyNDoJMGEgNDAgMzkgMDIuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzI2OGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgU2F0IEZlYiAyMiAyMTozNzoxNSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWJpdG51bS5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUZXN0IHRoYXQgYWxsIHRoZSBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgdGhlIEJJVE5VTSBmaWVsZAotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgYXJlIHByb3Blcmx5IGFjY2VwdGVkIGFuZCB0cmFuc2xhdGVkIHRvIG51bWVyaWMgdmFsdWVzLiAgQWxzbwotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOzsgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBkaXNhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcywgYW5kCi0gICAgICAgIDQgICAgICAgICAgICAgICAgICAgICA7OyB0aGF0IHRoZSByYXcgbnVtZXJpYyB2YWx1ZXMgYXJlIGhhbmRsZWQgY29ycmVjdGx5IChzdG9yZWQgYXMKLSAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgIDs7IHRoZSBvbmUncyBjb21wbGVtZW50IG9mIHRoZSBvcGVyYW5kIG51bWVyaWMgdmFsdWUuCi0gICAgICAgIDYgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNyAwMDAwMDAwMCAgIEZBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZXEuYiAgICAgOyAofjAgJiAweDFGKQotICAgICAgICA4IDAwMDAwMDA0ICAgRjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxuZS5iICAgICA7ICh+MSAmIDB4MUYpCi0gICAgICAgIDkgMDAwMDAwMDggICBFQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGd0LmIgICAgIDsgKH4yICYgMHgxRikKLSAgICAgICAxMCAwMDAwMDAwQyAgIEUyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbGUuYiAgICAgOyAofjMgJiAweDFGKQotICAgICAgIDExIDAwMDAwMDEwICAgREEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsdC5iICAgICA7ICh+NCAmIDB4MUYpCi0gICAgICAgMTIgMDAwMDAwMTQgICBEMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGdlLmIgICAgIDsgKH41ICYgMHgxRikKLSAgICAgICAxMyAwMDAwMDAxOCAgIENBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaGkuYiAgICAgOyAofjYgJiAweDFGKQotICAgICAgIDE0IDAwMDAwMDFDICAgQzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxscy5iICAgICA7ICh+NyAmIDB4MUYpCi0gICAgICAgMTUgMDAwMDAwMjAgICBCQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxvLmIgICAgIDsgKH44ICYgMHgxRikKLSAgICAgICAxNiAwMDAwMDAyNCAgIEIyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaHMuYiAgICAgOyAofjkgJiAweDFGKQotICAgICAgIDE3ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMTggMDAwMDAwMjggICBBQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGVxLmggICAgIDsgKH4xMCAmIDB4MUYpCi0gICAgICAgMTkgMDAwMDAwMkMgICBBMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG5lLmggICAgIDsgKH4xMSAmIDB4MUYpCi0gICAgICAgMjAgMDAwMDAwMzAgICA5QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGd0LmggICAgIDsgKH4xMiAmIDB4MUYpCi0gICAgICAgMjEgMDAwMDAwMzQgICA5MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxlLmggICAgIDsgKH4xMyAmIDB4MUYpCi0gICAgICAgMjIgMDAwMDAwMzggICA4QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGx0LmggICAgIDsgKH4xNCAmIDB4MUYpCi0gICAgICAgMjMgMDAwMDAwM0MgICA4MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGdlLmggICAgIDsgKH4xNSAmIDB4MUYpCi0gICAgICAgMjQgMDAwMDAwNDAgICA3QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGhpLmggICAgIDsgKH4xNiAmIDB4MUYpCi0gICAgICAgMjUgMDAwMDAwNDQgICA3MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxzLmggICAgIDsgKH4xNyAmIDB4MUYpCi0gICAgICAgMjYgMDAwMDAwNDggICA2QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxvLmggICAgIDsgKH4xOCAmIDB4MUYpCi0gICAgICAgMjcgMDAwMDAwNEMgICA2MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGhzLmggICAgIDsgKH4xOSAmIDB4MUYpCi0gICAgICAgMjggICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAyOSAwMDAwMDA1MCAgIDVBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZXEudyAgICAgOyAofjIwICYgMHgxRikKLSAgICAgICAzMCAwMDAwMDA1NCAgIDUyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbmUudyAgICAgOyAofjIxICYgMHgxRikKLSAgICAgICAzMSAwMDAwMDA1OCAgIDRBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ3QudyAgICAgOyAofjIyICYgMHgxRikKLSAgICAgICAzMiAwMDAwMDA1QyAgIDQyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbGUudyAgICAgOyAofjIzICYgMHgxRikKLSAgICAgICAzMyAwMDAwMDA2MCAgIDNBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbHQudyAgICAgOyAofjI0ICYgMHgxRikKLSAgICAgICAzNCAwMDAwMDA2NCAgIDMyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ2UudyAgICAgOyAofjI1ICYgMHgxRikKLSAgICAgICAzNSAwMDAwMDA2OCAgIDJBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaGkudyAgICAgOyAofjI2ICYgMHgxRikKLSAgICAgICAzNiAwMDAwMDA2QyAgIDIyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbHMudyAgICAgOyAofjI3ICYgMHgxRikKLSAgICAgICAzNyAwMDAwMDA3MCAgIDFBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbG8udyAgICAgOyAofjI4ICYgMHgxRikKLSAgICAgICAzOCAwMDAwMDA3NCAgIDEyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaHMudyAgICAgOyAofjI5ICYgMHgxRikKLSAgICAgICAzOSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDQwIDAwMDAwMDc4ICAgNUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxlcS5mICAgICA7ICh+MjAgJiAweDFGKQotICAgICAgIDQxIDAwMDAwMDdDICAgNTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxuZS5mICAgICA7ICh+MjEgJiAweDFGKQotICAgICAgIDQyIDAwMDAwMDgwICAgNEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxndC5mICAgICA7ICh+MjIgJiAweDFGKQotICAgICAgIDQzIDAwMDAwMDg0ICAgNDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsZS5mICAgICA7ICh+MjMgJiAweDFGKQotICAgICAgIDQ0IDAwMDAwMDg4ICAgM0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsdC5mICAgICA7ICh+MjQgJiAweDFGKQotICAgICAgIDQ1IDAwMDAwMDhDICAgMzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxnZS5mICAgICA7ICh+MjUgJiAweDFGKQotICAgICAgIDQ2IDAwMDAwMDkwICAgMkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxvdS5mICAgICA7ICh+MjYgJiAweDFGKQotICAgICAgIDQ3IDAwMDAwMDk0ICAgMjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxpbi5mICAgICA7ICh+MjcgJiAweDFGKQotICAgICAgIDQ4IDAwMDAwMDk4ICAgMUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxpYi5mICAgICA7ICh+MjggJiAweDFGKQotICAgICAgIDQ5IDAwMDAwMDlDICAgMTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxvYi5mICAgICA7ICh+MjkgJiAweDFGKQotICAgICAgIDUwIDAwMDAwMEEwICAgMEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCx1by5mICAgICA7ICh+MzAgJiAweDFGKQotICAgICAgIDUxIDAwMDAwMEE0ICAgMDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxvci5mICAgICA7ICh+MzEgJiAweDFGKQotICAgICAgIDUyICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgNTMgMDAwMDAwQTggICBGQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDAKLSAgICAgICA1NCAwMDAwMDBBQyAgIEYyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsMQotICAgICAgIDU1IDAwMDAwMEIwICAgRUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyCi0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBTYXQgRmViIDIyIDIxOjM3OjE1IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotYml0bnVtLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCi0KLSAgICAgICA1NiAwMDAwMDBCNCAgIEUyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsMwotICAgICAgIDU3IDAwMDAwMEI4ICAgREEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCw0Ci0gICAgICAgNTggMDAwMDAwQkMgICBEMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDUKLSAgICAgICA1OSAwMDAwMDBDMCAgIENBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsNgotICAgICAgIDYwIDAwMDAwMEM0ICAgQzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCw3Ci0gICAgICAgNjEgMDAwMDAwQzggICBCQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDgKLSAgICAgICA2MiAwMDAwMDBDQyAgIEIyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsOQotICAgICAgIDYzIDAwMDAwMEQwICAgQUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxMAotICAgICAgIDY0IDAwMDAwMEQ0ICAgQTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxMQotICAgICAgIDY1IDAwMDAwMEQ4ICAgOUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxMgotICAgICAgIDY2IDAwMDAwMERDICAgOTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxMwotICAgICAgIDY3IDAwMDAwMEUwICAgOEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxNAotICAgICAgIDY4IDAwMDAwMEU0ICAgODIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxNQotICAgICAgIDY5IDAwMDAwMEU4ICAgN0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxNgotICAgICAgIDcwIDAwMDAwMEVDICAgNzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxNwotICAgICAgIDcxIDAwMDAwMEYwICAgNkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxOAotICAgICAgIDcyIDAwMDAwMEY0ICAgNjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxOQotICAgICAgIDczIDAwMDAwMEY4ICAgNUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyMAotICAgICAgIDc0IDAwMDAwMEZDICAgNTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyMQotICAgICAgIDc1IDAwMDAwMTAwICAgNEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyMgotICAgICAgIDc2IDAwMDAwMTA0ICAgNDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyMwotICAgICAgIDc3IDAwMDAwMTA4ICAgM0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyNAotICAgICAgIDc4IDAwMDAwMTBDICAgMzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyNQotICAgICAgIDc5IDAwMDAwMTEwICAgMkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyNgotICAgICAgIDgwIDAwMDAwMTE0ICAgMjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyNwotICAgICAgIDgxIDAwMDAwMTE4ICAgMUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyOAotICAgICAgIDgyIDAwMDAwMTFDICAgMTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwyOQotICAgICAgIDgzIDAwMDAwMTIwICAgMEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwzMAotICAgICAgIDg0IDAwMDAwMTI0ICAgMDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwzMQotICAgICAgIDg1ICAgICAgICAgICAgICAgICAgICAgCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyNmUwNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ucworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTs7IFRlc3QgdGhhdCBhbGwgdGhlIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciB0aGUgQklUTlVNIGZpZWxkCi07OyBhcmUgcHJvcGVybHkgYWNjZXB0ZWQgYW5kIHRyYW5zbGF0ZWQgdG8gbnVtZXJpYyB2YWx1ZXMuICBBbHNvCi07OyB2ZXJpZmllcyB0aGF0IHRoZXkgYXJlIGRpc2Fzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLCBhbmQKLTs7IHRoYXQgdGhlIHJhdyBudW1lcmljIHZhbHVlcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkgKHN0b3JlZCBhcwotOzsgdGhlIG9uZSdzIGNvbXBsZW1lbnQgb2YgdGhlIG9wZXJhbmQgbnVtZXJpYyB2YWx1ZS4KLQotCWJibwlyMTAscjgsZXEuYgk7ICh+MCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxuZS5iCTsgKH4xICYgMHgxRikKLQliYm8JcjEwLHI4LGd0LmIJOyAofjIgJiAweDFGKQotCWJibwlyMTAscjgsbGUuYgk7ICh+MyAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsdC5iCTsgKH40ICYgMHgxRikKLQliYm8JcjEwLHI4LGdlLmIJOyAofjUgJiAweDFGKQotCWJibwlyMTAscjgsaGkuYgk7ICh+NiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxscy5iCTsgKH43ICYgMHgxRikKLQliYm8JcjEwLHI4LGxvLmIJOyAofjggJiAweDFGKQotCWJibwlyMTAscjgsaHMuYgk7ICh+OSAmIDB4MUYpCi0KLQliYm8JcjEwLHI4LGVxLmgJOyAofjEwICYgMHgxRikKLQliYm8JcjEwLHI4LG5lLmgJOyAofjExICYgMHgxRikKLQliYm8JcjEwLHI4LGd0LmgJOyAofjEyICYgMHgxRikKLQliYm8JcjEwLHI4LGxlLmgJOyAofjEzICYgMHgxRikKLQliYm8JcjEwLHI4LGx0LmgJOyAofjE0ICYgMHgxRikKLQliYm8JcjEwLHI4LGdlLmgJOyAofjE1ICYgMHgxRikKLQliYm8JcjEwLHI4LGhpLmgJOyAofjE2ICYgMHgxRikKLQliYm8JcjEwLHI4LGxzLmgJOyAofjE3ICYgMHgxRikKLQliYm8JcjEwLHI4LGxvLmgJOyAofjE4ICYgMHgxRikKLQliYm8JcjEwLHI4LGhzLmgJOyAofjE5ICYgMHgxRikKLQotCWJibwlyMTAscjgsZXEudwk7ICh+MjAgJiAweDFGKQotCWJibwlyMTAscjgsbmUudwk7ICh+MjEgJiAweDFGKQotCWJibwlyMTAscjgsZ3Qudwk7ICh+MjIgJiAweDFGKQotCWJibwlyMTAscjgsbGUudwk7ICh+MjMgJiAweDFGKQotCWJibwlyMTAscjgsbHQudwk7ICh+MjQgJiAweDFGKQotCWJibwlyMTAscjgsZ2Uudwk7ICh+MjUgJiAweDFGKQotCWJibwlyMTAscjgsaGkudwk7ICh+MjYgJiAweDFGKQotCWJibwlyMTAscjgsbHMudwk7ICh+MjcgJiAweDFGKQotCWJibwlyMTAscjgsbG8udwk7ICh+MjggJiAweDFGKQotCWJibwlyMTAscjgsaHMudwk7ICh+MjkgJiAweDFGKQotCi0JYmJvCXIxMCxyOCxlcS5mCTsgKH4yMCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxuZS5mCTsgKH4yMSAmIDB4MUYpCi0JYmJvCXIxMCxyOCxndC5mCTsgKH4yMiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsZS5mCTsgKH4yMyAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsdC5mCTsgKH4yNCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxnZS5mCTsgKH4yNSAmIDB4MUYpCi0JYmJvCXIxMCxyOCxvdS5mCTsgKH4yNiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxpbi5mCTsgKH4yNyAmIDB4MUYpCi0JYmJvCXIxMCxyOCxpYi5mCTsgKH4yOCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxvYi5mCTsgKH4yOSAmIDB4MUYpCi0JYmJvCXIxMCxyOCx1by5mCTsgKH4zMCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxvci5mCTsgKH4zMSAmIDB4MUYpCi0KLQliYm8JcjEwLHI4LDAKLQliYm8JcjEwLHI4LDEKLQliYm8JcjEwLHI4LDIKLQliYm8JcjEwLHI4LDMKLQliYm8JcjEwLHI4LDQKLQliYm8JcjEwLHI4LDUKLQliYm8JcjEwLHI4LDYKLQliYm8JcjEwLHI4LDcKLQliYm8JcjEwLHI4LDgKLQliYm8JcjEwLHI4LDkKLQliYm8JcjEwLHI4LDEwCi0JYmJvCXIxMCxyOCwxMQotCWJibwlyMTAscjgsMTIKLQliYm8JcjEwLHI4LDEzCi0JYmJvCXIxMCxyOCwxNAotCWJibwlyMTAscjgsMTUKLQliYm8JcjEwLHI4LDE2Ci0JYmJvCXIxMCxyOCwxNwotCWJibwlyMTAscjgsMTgKLQliYm8JcjEwLHI4LDE5Ci0JYmJvCXIxMCxyOCwyMAotCWJibwlyMTAscjgsMjEKLQliYm8JcjEwLHI4LDIyCi0JYmJvCXIxMCxyOCwyMwotCWJibwlyMTAscjgsMjQKLQliYm8JcjEwLHI4LDI1Ci0JYmJvCXIxMCxyOCwyNgotCWJibwlyMTAscjgsMjcKLQliYm8JcjEwLHI4LDI4Ci0JYmJvCXIxMCxyOCwyOQotCWJibwlyMTAscjgsMzAKLQliYm8JcjEwLHI4LDMxCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jY29kZS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWEzOGFhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCBjb3ZlcmFnZSBvZiBzeW1ib2xpYyBjb25kaXRpb24gY29kZSB2YWx1ZXMKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTA3IGEwIDc5IDAxLioKLSAgIDQ6CTA3IGEwIDc5IDA5LioKLSAgIDg6CTA3IGEwIDc5IDExLioKLSAgIGM6CTA3IGEwIDc5IDE5LioKLSAgMTA6CTA3IGEwIDc5IDIxLioKLSAgMTQ6CTA3IGEwIDc5IDI5LioKLSAgMTg6CTA3IGEwIDc5IDMxLioKLSAgMWM6CTA3IGEwIDc5IDM5LioKLSAgMjA6CTA3IGEwIDc5IDQxLioKLSAgMjQ6CTA3IGEwIDc5IDQ5LioKLSAgMjg6CTA3IGEwIDc5IDUxLioKLSAgMmM6CTA3IGEwIDc5IDU5LioKLSAgMzA6CTA3IGEwIDc5IDYxLioKLSAgMzQ6CTA3IGEwIDc5IDY5LioKLSAgMzg6CTA3IGEwIDc5IDcxLioKLSAgM2M6CTA3IGEwIDc5IDc5LioKLSAgNDA6CTA3IGEwIDc5IDgxLioKLSAgNDQ6CTA3IGEwIDc5IDg5LioKLSAgNDg6CTA3IGEwIDc5IDkxLioKLSAgNGM6CTA3IGEwIDc5IDk5LioKLSAgNTA6CTA3IGEwIDc5IGExLioKLSAgNTQ6CTA3IGEwIDc5IGE5LioKLSAgNTg6CTA3IGEwIDc5IGIxLioKLSAgNWM6CTA3IGEwIDc5IGI5LioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMzUxYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jY29kZS5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6NDkgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1jY29kZS5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOzsgVGVzdCB0aGF0IGFsbCB0aGUgcHJlZGVmaW5lZCBzeW1ib2wgbmFtZXMgZm9yIHRoZSBjb25kaXRpb24KLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IGNvZGVzIGFyZSBwcm9wZXJseSBhY2NlcHRlZCBhbmQgdHJhbnNsYXRlZCB0byBudW1lcmljIHZhbHVlcy4KLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDs7ICBBbHNvIHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgZGlzYXNzZW1ibGVkIGNvcnJlY3RseSBhcyBzeW1ib2xpY3MuCi0gICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNSAwMDAwMDAwMCAgIDAxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxuZXYuYiAgICAgICAgICAgICA7IDAwMDAwCi0gICAgICAgIDYgMDAwMDAwMDQgICAwOTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZ3QwLmIgICAgICAgICAgICAgOyAwMDAwMQotICAgICAgICA3IDAwMDAwMDA4ICAgMTE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGVxMC5iICAgICAgICAgICAgIDsgMDAwMTAKLSAgICAgICAgOCAwMDAwMDAwQyAgIDE5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxnZTAuYiAgICAgICAgICAgICA7IDAwMDExCi0gICAgICAgIDkgMDAwMDAwMTAgICAyMTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbHQwLmIgICAgICAgICAgICAgOyAwMDEwMAotICAgICAgIDEwIDAwMDAwMDE0ICAgMjk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LG5lMC5iICAgICAgICAgICAgIDsgMDAxMDEKLSAgICAgICAxMSAwMDAwMDAxOCAgIDMxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxsZTAuYiAgICAgICAgICAgICA7IDAwMTEwCi0gICAgICAgMTIgMDAwMDAwMUMgICAzOTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsYWx3LmIgICAgICAgICAgICAgOyAwMDExMQotICAgICAgIDEzICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMTQgMDAwMDAwMjAgICA0MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbmV2LmggICAgICAgICAgICAgOyAwMTAwMAotICAgICAgIDE1IDAwMDAwMDI0ICAgNDk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGd0MC5oICAgICAgICAgICAgIDsgMDEwMDEKLSAgICAgICAxNiAwMDAwMDAyOCAgIDUxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxlcTAuaCAgICAgICAgICAgICA7IDAxMDEwCi0gICAgICAgMTcgMDAwMDAwMkMgICA1OTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZ2UwLmggICAgICAgICAgICAgOyAwMTAxMQotICAgICAgIDE4IDAwMDAwMDMwICAgNjE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGx0MC5oICAgICAgICAgICAgIDsgMDExMDAKLSAgICAgICAxOSAwMDAwMDAzNCAgIDY5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxuZTAuaCAgICAgICAgICAgICA7IDAxMTAxCi0gICAgICAgMjAgMDAwMDAwMzggICA3MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbGUwLmggICAgICAgICAgICAgOyAwMTExMAotICAgICAgIDIxIDAwMDAwMDNDICAgNzk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGFsdy5oICAgICAgICAgICAgIDsgMDExMTEKLSAgICAgICAyMiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDIzIDAwMDAwMDQwICAgODE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LG5ldi53ICAgICAgICAgICAgIDsgMTAwMDAKLSAgICAgICAyNCAwMDAwMDA0NCAgIDg5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxndDAudyAgICAgICAgICAgICA7IDEwMDAxCi0gICAgICAgMjUgMDAwMDAwNDggICA5MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZXEwLncgICAgICAgICAgICAgOyAxMDAxMAotICAgICAgIDI2IDAwMDAwMDRDICAgOTk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGdlMC53ICAgICAgICAgICAgIDsgMTAwMTEKLSAgICAgICAyNyAwMDAwMDA1MCAgIEExNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxsdDAudyAgICAgICAgICAgICA7IDEwMTAwCi0gICAgICAgMjggMDAwMDAwNTQgICBBOTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbmUwLncgICAgICAgICAgICAgOyAxMDEwMQotICAgICAgIDI5IDAwMDAwMDU4ICAgQjE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGxlMC53ICAgICAgICAgICAgIDsgMTAxMTAKLSAgICAgICAzMCAwMDAwMDA1QyAgIEI5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxhbHcudyAgICAgICAgICAgICA7IDEwMTExCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNGFhYzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUucworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTs7IFRlc3QgdGhhdCBhbGwgdGhlIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciB0aGUgY29uZGl0aW9uCi07OyBjb2RlcyBhcmUgcHJvcGVybHkgYWNjZXB0ZWQgYW5kIHRyYW5zbGF0ZWQgdG8gbnVtZXJpYyB2YWx1ZXMuCi07OyAgQWxzbyB2ZXJpZmllcyB0aGF0IHRoZXkgYXJlIGRpc2Fzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLgotCi0JYmNuZC5hCXI3LHI1LG5ldi5iCQk7IDAwMDAwCi0JYmNuZC5hCXI3LHI1LGd0MC5iCQk7IDAwMDAxCi0JYmNuZC5hCXI3LHI1LGVxMC5iCQk7IDAwMDEwCi0JYmNuZC5hCXI3LHI1LGdlMC5iCQk7IDAwMDExCi0JYmNuZC5hCXI3LHI1LGx0MC5iCQk7IDAwMTAwCi0JYmNuZC5hCXI3LHI1LG5lMC5iCQk7IDAwMTAxCi0JYmNuZC5hCXI3LHI1LGxlMC5iCQk7IDAwMTEwCi0JYmNuZC5hCXI3LHI1LGFsdy5iCQk7IDAwMTExCi0KLQliY25kLmEJcjcscjUsbmV2LmgJCTsgMDEwMDAKLQliY25kLmEJcjcscjUsZ3QwLmgJCTsgMDEwMDEKLQliY25kLmEJcjcscjUsZXEwLmgJCTsgMDEwMTAKLQliY25kLmEJcjcscjUsZ2UwLmgJCTsgMDEwMTEKLQliY25kLmEJcjcscjUsbHQwLmgJCTsgMDExMDAKLQliY25kLmEJcjcscjUsbmUwLmgJCTsgMDExMDEKLQliY25kLmEJcjcscjUsbGUwLmgJCTsgMDExMTAKLQliY25kLmEJcjcscjUsYWx3LmgJCTsgMDExMTEKLQotCWJjbmQuYQlyNyxyNSxuZXYudwkJOyAxMDAwMAotCWJjbmQuYQlyNyxyNSxndDAudwkJOyAxMDAwMQotCWJjbmQuYQlyNyxyNSxlcTAudwkJOyAxMDAxMAotCWJjbmQuYQlyNyxyNSxnZTAudwkJOyAxMDAxMQotCWJjbmQuYQlyNyxyNSxsdDAudwkJOyAxMDEwMAotCWJjbmQuYQlyNyxyNSxuZTAudwkJOyAxMDEwMQotCWJjbmQuYQlyNyxyNSxsZTAudwkJOyAxMDExMAotCWJjbmQuYQlyNyxyNSxhbHcudwkJOyAxMDExMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI2MWU5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMuZAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIGNvbnRyb2wgcmVnaXN0ZXIgb3BlcmFuZHMKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTM0IDAwIDAyIDEwLioKLSAgIDQ6CTM5IDAwIDAyIDEwLioKLSAgIDg6CTNhIDAwIDAyIDEwLioKLSAgIGM6CTAyIDAwIDAyIDEwLioKLSAgMTA6CTAwIDA1IDAyIDEwLioKLSAgMTQ6CTAwIDA0IDAyIDEwLioKLSAgMTg6CTAxIDA0IDAyIDEwLioKLSAgMWM6CTBhIDA0IDAyIDEwLioKLSAgMjA6CTBiIDA0IDAyIDEwLioKLSAgMjQ6CTBjIDA0IDAyIDEwLioKLSAgMjg6CTBkIDA0IDAyIDEwLioKLSAgMmM6CTBlIDA0IDAyIDEwLioKLSAgMzA6CTBmIDA0IDAyIDEwLioKLSAgMzQ6CTAyIDA0IDAyIDEwLioKLSAgMzg6CTAzIDA0IDAyIDEwLioKLSAgM2M6CTA0IDA0IDAyIDEwLioKLSAgNDA6CTA1IDA0IDAyIDEwLioKLSAgNDQ6CTA2IDA0IDAyIDEwLioKLSAgNDg6CTA3IDA0IDAyIDEwLioKLSAgNGM6CTA4IDA0IDAyIDEwLioKLSAgNTA6CTA5IDA0IDAyIDEwLioKLSAgNTQ6CTMzIDAwIDAyIDEwLioKLSAgNTg6CTAxIDAwIDAyIDEwLioKLSAgNWM6CTAwIDAwIDAyIDEwLioKLSAgNjA6CTExIDAwIDAyIDEwLioKLSAgNjQ6CTE0IDAwIDAyIDEwLioKLSAgNjg6CTEzIDAwIDAyIDEwLioKLSAgNmM6CTEwIDAwIDAyIDEwLioKLSAgNzA6CTEyIDAwIDAyIDEwLioKLSAgNzQ6CTA4IDAwIDAyIDEwLioKLSAgNzg6CTA2IDAwIDAyIDEwLioKLSAgN2M6CTAwIDAzIDAyIDEwLioKLSAgODA6CTAwIDQwIDAyIDEwLioKLSAgODQ6CTAxIDQwIDAyIDEwLioKLSAgODg6CTA0IDAwIDAyIDEwLioKLSAgOGM6CTAwIDAyIDAyIDEwLioKLSAgOTA6CTAxIDAyIDAyIDEwLioKLSAgOTQ6CTBhIDAyIDAyIDEwLioKLSAgOTg6CTBiIDAyIDAyIDEwLioKLSAgOWM6CTBjIDAyIDAyIDEwLioKLSAgYTA6CTBkIDAyIDAyIDEwLioKLSAgYTQ6CTBlIDAyIDAyIDEwLioKLSAgYTg6CTBmIDAyIDAyIDEwLioKLSAgYWM6CTAyIDAyIDAyIDEwLioKLSAgYjA6CTAzIDAyIDAyIDEwLioKLSAgYjQ6CTA0IDAyIDAyIDEwLioKLSAgYjg6CTA1IDAyIDAyIDEwLioKLSAgYmM6CTA2IDAyIDAyIDEwLioKLSAgYzA6CTA3IDAyIDAyIDEwLioKLSAgYzQ6CTA4IDAyIDAyIDEwLioKLSAgYzg6CTA5IDAyIDAyIDEwLioKLSAgY2M6CTMxIDAwIDAyIDEwLioKLSAgZDA6CTMwIDAwIDAyIDEwLioKLSAgZDQ6CTAyIDQwIDAyIDEwLioKLSAgZDg6CTBkIDAwIDAyIDEwLioKLSAgZGM6CTBhIDAwIDAyIDEwLioKLSAgZTA6CTIwIDAwIDAyIDEwLioKLSAgZTQ6CTIxIDAwIDAyIDEwLioKLSAgZTg6CTBlIDAwIDAyIDEwLioKLSAgZWM6CTBmIDAwIDAyIDEwLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZWE1N2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6NTYgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1jcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOzsgVGVzdCB0aGF0IGFsbCBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgY29udHJvbCByZWdpc3RlcnMKLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IGFyZSBwcm9wZXJseSBhY2NlcHRlZCBhbmQgdHJhbnNsYXRlZCB0byBudW1lcmljIHZhbHVlcy4gIEFsc28KLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDs7IHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgZGlhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcy4KLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA1IDAwMDAwMDAwICAgMTAwMjAwMzQgICAgICAgICByZGNyICAgIEFOQVNUQVQscjIKLSAgICAgICAgNiAwMDAwMDAwNCAgIDEwMDIwMDM5ICAgICAgICAgcmRjciAgICBCUksxLHIyCi0gICAgICAgIDcgMDAwMDAwMDggICAxMDAyMDAzQSAgICAgICAgIHJkY3IgICAgQlJLMixyMgotICAgICAgICA4IDAwMDAwMDBDICAgMTAwMjAwMDIgICAgICAgICByZGNyICAgIENPTkZJRyxyMgotICAgICAgICA5IDAwMDAwMDEwICAgMTAwMjA1MDAgICAgICAgICByZGNyICAgIERMUlUscjIKLSAgICAgICAxMCAwMDAwMDAxNCAgIDEwMDIwNDAwICAgICAgICAgcmRjciAgICBEVEFHMCxyMgotICAgICAgIDExIDAwMDAwMDE4ICAgMTAwMjA0MDEgICAgICAgICByZGNyICAgIERUQUcxLHIyCi0gICAgICAgMTIgMDAwMDAwMUMgICAxMDAyMDQwQSAgICAgICAgIHJkY3IgICAgRFRBRzEwLHIyCi0gICAgICAgMTMgMDAwMDAwMjAgICAxMDAyMDQwQiAgICAgICAgIHJkY3IgICAgRFRBRzExLHIyCi0gICAgICAgMTQgMDAwMDAwMjQgICAxMDAyMDQwQyAgICAgICAgIHJkY3IgICAgRFRBRzEyLHIyCi0gICAgICAgMTUgMDAwMDAwMjggICAxMDAyMDQwRCAgICAgICAgIHJkY3IgICAgRFRBRzEzLHIyCi0gICAgICAgMTYgMDAwMDAwMkMgICAxMDAyMDQwRSAgICAgICAgIHJkY3IgICAgRFRBRzE0LHIyCi0gICAgICAgMTcgMDAwMDAwMzAgICAxMDAyMDQwRiAgICAgICAgIHJkY3IgICAgRFRBRzE1LHIyCi0gICAgICAgMTggMDAwMDAwMzQgICAxMDAyMDQwMiAgICAgICAgIHJkY3IgICAgRFRBRzIscjIKLSAgICAgICAxOSAwMDAwMDAzOCAgIDEwMDIwNDAzICAgICAgICAgcmRjciAgICBEVEFHMyxyMgotICAgICAgIDIwIDAwMDAwMDNDICAgMTAwMjA0MDQgICAgICAgICByZGNyICAgIERUQUc0LHIyCi0gICAgICAgMjEgMDAwMDAwNDAgICAxMDAyMDQwNSAgICAgICAgIHJkY3IgICAgRFRBRzUscjIKLSAgICAgICAyMiAwMDAwMDA0NCAgIDEwMDIwNDA2ICAgICAgICAgcmRjciAgICBEVEFHNixyMgotICAgICAgIDIzIDAwMDAwMDQ4ICAgMTAwMjA0MDcgICAgICAgICByZGNyICAgIERUQUc3LHIyCi0gICAgICAgMjQgMDAwMDAwNEMgICAxMDAyMDQwOCAgICAgICAgIHJkY3IgICAgRFRBRzgscjIKLSAgICAgICAyNSAwMDAwMDA1MCAgIDEwMDIwNDA5ICAgICAgICAgcmRjciAgICBEVEFHOSxyMgotICAgICAgIDI2IDAwMDAwMDU0ICAgMTAwMjAwMzMgICAgICAgICByZGNyICAgIEVDT01DTlRMLHIyCi0gICAgICAgMjcgMDAwMDAwNTggICAxMDAyMDAwMSAgICAgICAgIHJkY3IgICAgRUlQLHIyCi0gICAgICAgMjggMDAwMDAwNUMgICAxMDAyMDAwMCAgICAgICAgIHJkY3IgICAgRVBDLHIyCi0gICAgICAgMjkgMDAwMDAwNjAgICAxMDAyMDAxMSAgICAgICAgIHJkY3IgICAgRkxUQURSLHIyCi0gICAgICAgMzAgMDAwMDAwNjQgICAxMDAyMDAxNCAgICAgICAgIHJkY3IgICAgRkxURFRILHIyCi0gICAgICAgMzEgMDAwMDAwNjggICAxMDAyMDAxMyAgICAgICAgIHJkY3IgICAgRkxURFRMLHIyCi0gICAgICAgMzIgMDAwMDAwNkMgICAxMDAyMDAxMCAgICAgICAgIHJkY3IgICAgRkxUT1AscjIKLSAgICAgICAzMyAwMDAwMDA3MCAgIDEwMDIwMDEyICAgICAgICAgcmRjciAgICBGTFRUQUcscjIKLSAgICAgICAzNCAwMDAwMDA3NCAgIDEwMDIwMDA4ICAgICAgICAgcmRjciAgICBGUFNULHIyCi0gICAgICAgMzUgMDAwMDAwNzggICAxMDAyMDAwNiAgICAgICAgIHJkY3IgICAgSUUscjIKLSAgICAgICAzNiAwMDAwMDA3QyAgIDEwMDIwMzAwICAgICAgICAgcmRjciAgICBJTFJVLHIyCi0gICAgICAgMzcgMDAwMDAwODAgICAxMDAyNDAwMCAgICAgICAgIHJkY3IgICAgSU4wUCxyMgotICAgICAgIDM4IDAwMDAwMDg0ICAgMTAwMjQwMDEgICAgICAgICByZGNyICAgIElOMVAscjIKLSAgICAgICAzOSAwMDAwMDA4OCAgIDEwMDIwMDA0ICAgICAgICAgcmRjciAgICBJTlRQRU4scjIKLSAgICAgICA0MCAwMDAwMDA4QyAgIDEwMDIwMjAwICAgICAgICAgcmRjciAgICBJVEFHMCxyMgotICAgICAgIDQxIDAwMDAwMDkwICAgMTAwMjAyMDEgICAgICAgICByZGNyICAgIElUQUcxLHIyCi0gICAgICAgNDIgMDAwMDAwOTQgICAxMDAyMDIwQSAgICAgICAgIHJkY3IgICAgSVRBRzEwLHIyCi0gICAgICAgNDMgMDAwMDAwOTggICAxMDAyMDIwQiAgICAgICAgIHJkY3IgICAgSVRBRzExLHIyCi0gICAgICAgNDQgMDAwMDAwOUMgICAxMDAyMDIwQyAgICAgICAgIHJkY3IgICAgSVRBRzEyLHIyCi0gICAgICAgNDUgMDAwMDAwQTAgICAxMDAyMDIwRCAgICAgICAgIHJkY3IgICAgSVRBRzEzLHIyCi0gICAgICAgNDYgMDAwMDAwQTQgICAxMDAyMDIwRSAgICAgICAgIHJkY3IgICAgSVRBRzE0LHIyCi0gICAgICAgNDcgMDAwMDAwQTggICAxMDAyMDIwRiAgICAgICAgIHJkY3IgICAgSVRBRzE1LHIyCi0gICAgICAgNDggMDAwMDAwQUMgICAxMDAyMDIwMiAgICAgICAgIHJkY3IgICAgSVRBRzIscjIKLSAgICAgICA0OSAwMDAwMDBCMCAgIDEwMDIwMjAzICAgICAgICAgcmRjciAgICBJVEFHMyxyMgotICAgICAgIDUwIDAwMDAwMEI0ICAgMTAwMjAyMDQgICAgICAgICByZGNyICAgIElUQUc0LHIyCi0gICAgICAgNTEgMDAwMDAwQjggICAxMDAyMDIwNSAgICAgICAgIHJkY3IgICAgSVRBRzUscjIKLSAgICAgICA1MiAwMDAwMDBCQyAgIDEwMDIwMjA2ICAgICAgICAgcmRjciAgICBJVEFHNixyMgotICAgICAgIDUzIDAwMDAwMEMwICAgMTAwMjAyMDcgICAgICAgICByZGNyICAgIElUQUc3LHIyCi0gICAgICAgNTQgMDAwMDAwQzQgICAxMDAyMDIwOCAgICAgICAgIHJkY3IgICAgSVRBRzgscjIKLSAgICAgICA1NSAwMDAwMDBDOCAgIDEwMDIwMjA5ICAgICAgICAgcmRjciAgICBJVEFHOSxyMgotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDo1NiAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWNyZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgotCi0gICAgICAgNTYgMDAwMDAwQ0MgICAxMDAyMDAzMSAgICAgICAgIHJkY3IgICAgTUlQLHIyCi0gICAgICAgNTcgMDAwMDAwRDAgICAxMDAyMDAzMCAgICAgICAgIHJkY3IgICAgTVBDLHIyCi0gICAgICAgNTggMDAwMDAwRDQgICAxMDAyNDAwMiAgICAgICAgIHJkY3IgICAgT1VUUCxyMgotICAgICAgIDU5IDAwMDAwMEQ4ICAgMTAwMjAwMEQgICAgICAgICByZGNyICAgIFBLVFJFUSxyMgotICAgICAgIDYwIDAwMDAwMERDICAgMTAwMjAwMEEgICAgICAgICByZGNyICAgIFBQRVJST1IscjIKLSAgICAgICA2MSAwMDAwMDBFMCAgIDEwMDIwMDIwICAgICAgICAgcmRjciAgICBTWVNTVEsscjIKLSAgICAgICA2MiAwMDAwMDBFNCAgIDEwMDIwMDIxICAgICAgICAgcmRjciAgICBTWVNUTVAscjIKLSAgICAgICA2MyAwMDAwMDBFOCAgIDEwMDIwMDBFICAgICAgICAgcmRjciAgICBUQ09VTlQscjIKLSAgICAgICA2NCAwMDAwMDBFQyAgIDEwMDIwMDBGICAgICAgICAgcmRjciAgICBUU0NBTEUscjIKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMGFkY2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotOzsgVGVzdCB0aGF0IGFsbCBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgY29udHJvbCByZWdpc3RlcnMKLTs7IGFyZSBwcm9wZXJseSBhY2NlcHRlZCBhbmQgdHJhbnNsYXRlZCB0byBudW1lcmljIHZhbHVlcy4gIEFsc28KLTs7IHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgZGlhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcy4KLQotCXJkY3IJQU5BU1RBVCxyMgotCXJkY3IJQlJLMSxyMgotCXJkY3IJQlJLMixyMgotCXJkY3IJQ09ORklHLHIyCi0JcmRjcglETFJVLHIyCi0JcmRjcglEVEFHMCxyMgotCXJkY3IJRFRBRzEscjIKLQlyZGNyCURUQUcxMCxyMgotCXJkY3IJRFRBRzExLHIyCi0JcmRjcglEVEFHMTIscjIKLQlyZGNyCURUQUcxMyxyMgotCXJkY3IJRFRBRzE0LHIyCi0JcmRjcglEVEFHMTUscjIKLQlyZGNyCURUQUcyLHIyCi0JcmRjcglEVEFHMyxyMgotCXJkY3IJRFRBRzQscjIKLQlyZGNyCURUQUc1LHIyCi0JcmRjcglEVEFHNixyMgotCXJkY3IJRFRBRzcscjIKLQlyZGNyCURUQUc4LHIyCi0JcmRjcglEVEFHOSxyMgotCXJkY3IJRUNPTUNOVEwscjIKLQlyZGNyCUVJUCxyMgotCXJkY3IJRVBDLHIyCi0JcmRjcglGTFRBRFIscjIKLQlyZGNyCUZMVERUSCxyMgotCXJkY3IJRkxURFRMLHIyCi0JcmRjcglGTFRPUCxyMgotCXJkY3IJRkxUVEFHLHIyCi0JcmRjcglGUFNULHIyCi0JcmRjcglJRSxyMgotCXJkY3IJSUxSVSxyMgotCXJkY3IJSU4wUCxyMgotCXJkY3IJSU4xUCxyMgotCXJkY3IJSU5UUEVOLHIyCi0JcmRjcglJVEFHMCxyMgotCXJkY3IJSVRBRzEscjIKLQlyZGNyCUlUQUcxMCxyMgotCXJkY3IJSVRBRzExLHIyCi0JcmRjcglJVEFHMTIscjIKLQlyZGNyCUlUQUcxMyxyMgotCXJkY3IJSVRBRzE0LHIyCi0JcmRjcglJVEFHMTUscjIKLQlyZGNyCUlUQUcyLHIyCi0JcmRjcglJVEFHMyxyMgotCXJkY3IJSVRBRzQscjIKLQlyZGNyCUlUQUc1LHIyCi0JcmRjcglJVEFHNixyMgotCXJkY3IJSVRBRzcscjIKLQlyZGNyCUlUQUc4LHIyCi0JcmRjcglJVEFHOSxyMgotCXJkY3IJTUlQLHIyCi0JcmRjcglNUEMscjIKLQlyZGNyCU9VVFAscjIKLQlyZGNyCVBLVFJFUSxyMgotCXJkY3IJUFBFUlJPUixyMgotCXJkY3IJU1lTU1RLLHIyCi0JcmRjcglTWVNUTVAscjIKLQlyZGNyCVRDT1VOVCxyMgotCXJkY3IJVFNDQUxFLHIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZDA4NDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5kCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgY292ZXJhZ2Ugb2Ygc2hpZnQgaW5zdHJ1Y3Rpb24gRU5ETUFTSyBmaWVsZAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMDUgMDAgYzcgNDkuKgotICAgNDoJMjUgMDAgYzcgNDkuKgotICAgODoJNDUgMDAgYzcgNDkuKgotICAgYzoJNjUgMDAgYzcgNDkuKgotICAxMDoJODUgMDAgYzcgNDkuKgotICAxNDoJYTUgMDAgYzcgNDkuKgotICAxODoJYzUgMDAgYzcgNDkuKgotICAxYzoJZTUgMDAgYzcgNDkuKgotICAyMDoJMDUgMDEgYzcgNDkuKgotICAyNDoJMjUgMDEgYzcgNDkuKgotICAyODoJNDUgMDEgYzcgNDkuKgotICAyYzoJNjUgMDEgYzcgNDkuKgotICAzMDoJODUgMDEgYzcgNDkuKgotICAzNDoJYTUgMDEgYzcgNDkuKgotICAzODoJYzUgMDEgYzcgNDkuKgotICAzYzoJZTUgMDEgYzcgNDkuKgotICA0MDoJMDUgMDIgYzcgNDkuKgotICA0NDoJMjUgMDIgYzcgNDkuKgotICA0ODoJNDUgMDIgYzcgNDkuKgotICA0YzoJNjUgMDIgYzcgNDkuKgotICA1MDoJODUgMDIgYzcgNDkuKgotICA1NDoJYTUgMDIgYzcgNDkuKgotICA1ODoJYzUgMDIgYzcgNDkuKgotICA1YzoJZTUgMDIgYzcgNDkuKgotICA2MDoJMDUgMDMgYzcgNDkuKgotICA2NDoJMjUgMDMgYzcgNDkuKgotICA2ODoJNDUgMDMgYzcgNDkuKgotICA2YzoJNjUgMDMgYzcgNDkuKgotICA3MDoJODUgMDMgYzcgNDkuKgotICA3NDoJYTUgMDMgYzcgNDkuKgotICA3ODoJYzUgMDMgYzcgNDkuKgotICA3YzoJZTUgMDMgYzcgNDkuKgotICA4MDoJMDUgMDAgYzcgNDkuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwM2IzMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDoyOSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWVuZG1hc2sucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUZXN0IGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdGhlIGVuZG1hc2sgaW4gYml0cyA1LTkuCi0gICAgICAgIDIgICAgICAgICAgICAgICAgICAgICA7OyBUaGUgbWFzayB0aGF0IGlzIHVzZWQgaXMgY29tcHV0ZWQgYXMgMioqYml0cy0xIHdoZXJlIGJpdHMKLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDs7IGFyZSB0aGUgYml0cyA1LTkgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgMCBhbmQgMzIKLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIDs7IGFyZSB0cmVhdGVkIGlkZW50aWNhbGx5LCBhbmQgZGlzYXNzZW1ibGVkIGFzIDAuCi0gICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNiAwMDAwMDAwMCAgIDQ5QzcwMDA1ICAgICAgICAgc2wuaXogICA1LDAscjcscjkKLSAgICAgICAgNyAwMDAwMDAwNCAgIDQ5QzcwMDI1ICAgICAgICAgc2wuaXogICA1LDEscjcscjkKLSAgICAgICAgOCAwMDAwMDAwOCAgIDQ5QzcwMDQ1ICAgICAgICAgc2wuaXogICA1LDIscjcscjkKLSAgICAgICAgOSAwMDAwMDAwQyAgIDQ5QzcwMDY1ICAgICAgICAgc2wuaXogICA1LDMscjcscjkKLSAgICAgICAxMCAwMDAwMDAxMCAgIDQ5QzcwMDg1ICAgICAgICAgc2wuaXogICA1LDQscjcscjkKLSAgICAgICAxMSAwMDAwMDAxNCAgIDQ5QzcwMEE1ICAgICAgICAgc2wuaXogICA1LDUscjcscjkKLSAgICAgICAxMiAwMDAwMDAxOCAgIDQ5QzcwMEM1ICAgICAgICAgc2wuaXogICA1LDYscjcscjkKLSAgICAgICAxMyAwMDAwMDAxQyAgIDQ5QzcwMEU1ICAgICAgICAgc2wuaXogICA1LDcscjcscjkKLSAgICAgICAxNCAwMDAwMDAyMCAgIDQ5QzcwMTA1ICAgICAgICAgc2wuaXogICA1LDgscjcscjkKLSAgICAgICAxNSAwMDAwMDAyNCAgIDQ5QzcwMTI1ICAgICAgICAgc2wuaXogICA1LDkscjcscjkKLSAgICAgICAxNiAwMDAwMDAyOCAgIDQ5QzcwMTQ1ICAgICAgICAgc2wuaXogICA1LDEwLHI3LHI5Ci0gICAgICAgMTcgMDAwMDAwMkMgICA0OUM3MDE2NSAgICAgICAgIHNsLml6ICAgNSwxMSxyNyxyOQotICAgICAgIDE4IDAwMDAwMDMwICAgNDlDNzAxODUgICAgICAgICBzbC5peiAgIDUsMTIscjcscjkKLSAgICAgICAxOSAwMDAwMDAzNCAgIDQ5QzcwMUE1ICAgICAgICAgc2wuaXogICA1LDEzLHI3LHI5Ci0gICAgICAgMjAgMDAwMDAwMzggICA0OUM3MDFDNSAgICAgICAgIHNsLml6ICAgNSwxNCxyNyxyOQotICAgICAgIDIxIDAwMDAwMDNDICAgNDlDNzAxRTUgICAgICAgICBzbC5peiAgIDUsMTUscjcscjkKLSAgICAgICAyMiAwMDAwMDA0MCAgIDQ5QzcwMjA1ICAgICAgICAgc2wuaXogICA1LDE2LHI3LHI5Ci0gICAgICAgMjMgMDAwMDAwNDQgICA0OUM3MDIyNSAgICAgICAgIHNsLml6ICAgNSwxNyxyNyxyOQotICAgICAgIDI0IDAwMDAwMDQ4ICAgNDlDNzAyNDUgICAgICAgICBzbC5peiAgIDUsMTgscjcscjkKLSAgICAgICAyNSAwMDAwMDA0QyAgIDQ5QzcwMjY1ICAgICAgICAgc2wuaXogICA1LDE5LHI3LHI5Ci0gICAgICAgMjYgMDAwMDAwNTAgICA0OUM3MDI4NSAgICAgICAgIHNsLml6ICAgNSwyMCxyNyxyOQotICAgICAgIDI3IDAwMDAwMDU0ICAgNDlDNzAyQTUgICAgICAgICBzbC5peiAgIDUsMjEscjcscjkKLSAgICAgICAyOCAwMDAwMDA1OCAgIDQ5QzcwMkM1ICAgICAgICAgc2wuaXogICA1LDIyLHI3LHI5Ci0gICAgICAgMjkgMDAwMDAwNUMgICA0OUM3MDJFNSAgICAgICAgIHNsLml6ICAgNSwyMyxyNyxyOQotICAgICAgIDMwIDAwMDAwMDYwICAgNDlDNzAzMDUgICAgICAgICBzbC5peiAgIDUsMjQscjcscjkKLSAgICAgICAzMSAwMDAwMDA2NCAgIDQ5QzcwMzI1ICAgICAgICAgc2wuaXogICA1LDI1LHI3LHI5Ci0gICAgICAgMzIgMDAwMDAwNjggICA0OUM3MDM0NSAgICAgICAgIHNsLml6ICAgNSwyNixyNyxyOQotICAgICAgIDMzIDAwMDAwMDZDICAgNDlDNzAzNjUgICAgICAgICBzbC5peiAgIDUsMjcscjcscjkKLSAgICAgICAzNCAwMDAwMDA3MCAgIDQ5QzcwMzg1ICAgICAgICAgc2wuaXogICA1LDI4LHI3LHI5Ci0gICAgICAgMzUgMDAwMDAwNzQgICA0OUM3MDNBNSAgICAgICAgIHNsLml6ICAgNSwyOSxyNyxyOQotICAgICAgIDM2IDAwMDAwMDc4ICAgNDlDNzAzQzUgICAgICAgICBzbC5peiAgIDUsMzAscjcscjkKLSAgICAgICAzNyAwMDAwMDA3QyAgIDQ5QzcwM0U1ICAgICAgICAgc2wuaXogICA1LDMxLHI3LHI5Ci0gICAgICAgMzggMDAwMDAwODAgICA0OUM3MDAwNSAgICAgICAgIHNsLml6ICAgNSwzMixyNyxyOQotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2sucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2sucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2YWVkZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi07OyBUZXN0IGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdGhlIGVuZG1hc2sgaW4gYml0cyA1LTkuCi07OyBUaGUgbWFzayB0aGF0IGlzIHVzZWQgaXMgY29tcHV0ZWQgYXMgMioqYml0cy0xIHdoZXJlIGJpdHMKLTs7IGFyZSB0aGUgYml0cyA1LTkgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgMCBhbmQgMzIKLTs7IGFyZSB0cmVhdGVkIGlkZW50aWNhbGx5LCBhbmQgZGlzYXNzZW1ibGVkIGFzIDAuCi0KLQlzbC5pegk1LDAscjcscjkKLQlzbC5pegk1LDEscjcscjkKLQlzbC5pegk1LDIscjcscjkKLQlzbC5pegk1LDMscjcscjkKLQlzbC5pegk1LDQscjcscjkKLQlzbC5pegk1LDUscjcscjkKLQlzbC5pegk1LDYscjcscjkKLQlzbC5pegk1LDcscjcscjkKLQlzbC5pegk1LDgscjcscjkKLQlzbC5pegk1LDkscjcscjkKLQlzbC5pegk1LDEwLHI3LHI5Ci0Jc2wuaXoJNSwxMSxyNyxyOQotCXNsLml6CTUsMTIscjcscjkKLQlzbC5pegk1LDEzLHI3LHI5Ci0Jc2wuaXoJNSwxNCxyNyxyOQotCXNsLml6CTUsMTUscjcscjkKLQlzbC5pegk1LDE2LHI3LHI5Ci0Jc2wuaXoJNSwxNyxyNyxyOQotCXNsLml6CTUsMTgscjcscjkKLQlzbC5pegk1LDE5LHI3LHI5Ci0Jc2wuaXoJNSwyMCxyNyxyOQotCXNsLml6CTUsMjEscjcscjkKLQlzbC5pegk1LDIyLHI3LHI5Ci0Jc2wuaXoJNSwyMyxyNyxyOQotCXNsLml6CTUsMjQscjcscjkKLQlzbC5pegk1LDI1LHI3LHI5Ci0Jc2wuaXoJNSwyNixyNyxyOQotCXNsLml6CTUsMjcscjcscjkKLQlzbC5pegk1LDI4LHI3LHI5Ci0Jc2wuaXoJNSwyOSxyNyxyOQotCXNsLml6CTUsMzAscjcscjkKLQlzbC5pegk1LDMxLHI3LHI5Ci0Jc2wuaXoJNSwzMixyNyxyOQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Zsb2F0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZWI4NWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQuZAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHNpbXBsZSBmbG9hdGluZyBwb2ludCBvcGVyYW5kcwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJODAgMTIgYmUgNTEgMTYgNjggYTkgNjUuKgotICAgODoJMDAgMTIgYmUgNTEgMTYgNjggYTkgZTUuKgotICAxMDoJMDAgMTAgYmUgNTEgOWEgNmQgNDEgMTkuKgotICAxODoJODAgYjAgM2UgNTIgOWEgNmQgNDEgOTkuKgotICAyMDoJMDAgYjAgM2UgNTIgMDAgMDAgMDAgMDAuKgotICAyODoJODAgNzIgYmUgNTEgMDAgMDAgMDAgNDAuKgotICAzMDoJMDAgNzIgYmUgNTEgMDAgMDAgMDAgM2YuKgotICAzODoJMDAgNzAgYmUgNTEgMDAgMDAgODAgNDUuKgotICA0MDoJODAgNTIgYmUgNTEgMDAgMDAgODAgYzUuKgotICA0ODoJMDAgNTIgYmUgNTEgMDAgMDAgMDAgNDAuKgotICA1MDoJMDAgNTAgYmUgNTEgMDAgMDAgMDAgNDAuKgotICA1ODoJODAgOTMgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA2MDoJODAgOTUgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA2ODoJODAgOTEgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA3MDoJODAgOTcgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA3ODoJMDAgOTIgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA4MDoJMDAgOTQgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA4ODoJMDAgOTAgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA5MDoJMDAgOTYgM2UgNDAgMDAgMDAgMDAgNDAuKgotICA5ODoJMDAgOTMgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBhMDoJMDAgOTUgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBhODoJMDAgOTEgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBiMDoJMDAgOTcgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBiODoJODAgOTIgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBjMDoJODAgOTQgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBjODoJODAgOTAgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBkMDoJODAgOTYgM2UgNDAgMDAgMDAgMDAgNDAuKgotICBkODoJMDAgZjIgM2UgNTAgMDAgMDAgMDAgNDAuKgotICBlMDoJMDAgZjAgM2UgNTAgMDAgMDAgMDAgNDAuKgotICBlODoJODAgMzIgYmUgNTEgMDAgMDAgMDAgNDAuKgotICBmMDoJMDAgMzIgYmUgNTEgMDAgMDAgMDAgNDAuKgotICBmODoJMDAgMzAgYmUgNTEgMDAgMDAgMDAgNDAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTM0NTkwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Zsb2F0LmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAyMjowOTowOSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWZsb2F0LnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgMDAwMDAwMDAgICA1MUJFMTI4MCAgICAgICAgIGZhZGQuc2RkICAgICAgICAxLjBFMjMscjYscjEwICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDA0ICAgNjVBOTY4MTYgCi0gICAgICAgIDIgMDAwMDAwMDggICA1MUJFMTIwMCAgICAgICAgIGZhZGQuc3NkICAgICAgICAtMS4wRTIzLHI2LHIxMCAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDBDICAgRTVBOTY4MTYgCi0gICAgICAgIDMgMDAwMDAwMTAgICA1MUJFMTAwMCAgICAgICAgIGZhZGQuc3NzICAgICAgICAxLjBFLTIzLHI2LHIxMCAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDE0ICAgMTk0MTZEOUEgCi0gICAgICAgIDQgMDAwMDAwMTggICA1MjNFQjA4MCAgICAgICAgIGZjbXAuc2QgICAgICAgICAtMS4wRS0yMyxyOCxyMTAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDFDICAgOTk0MTZEOUEgCi0gICAgICAgIDUgMDAwMDAwMjAgICA1MjNFQjAwMCAgICAgICAgIGZjbXAuc3MgICAgICAgICAwLjAscjgscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDI0ICAgMDAwMDAwMDAgCi0gICAgICAgIDYgMDAwMDAwMjggICA1MUJFNzI4MCAgICAgICAgIGZkaXYuc2RkICAgICAgICAyLjAscjYscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDJDICAgNDAwMDAwMDAgCi0gICAgICAgIDcgMDAwMDAwMzAgICA1MUJFNzIwMCAgICAgICAgIGZkaXYuc3NkICAgICAgICAwLjUscjYscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDM0ICAgM0YwMDAwMDAgCi0gICAgICAgIDggMDAwMDAwMzggICA1MUJFNzAwMCAgICAgICAgIGZkaXYuc3NzICAgICAgICA0MDk2LjAscjYscjEwICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDNDICAgNDU4MDAwMDAgCi0gICAgICAgIDkgMDAwMDAwNDAgICA1MUJFNTI4MCAgICAgICAgIGZtcHkuc2RkICAgICAgICAtNDA5Ni4wLHI2LHIxMCAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDQ0ICAgQzU4MDAwMDAgCi0gICAgICAgMTAgMDAwMDAwNDggICA1MUJFNTIwMCAgICAgICAgIGZtcHkuc3NkICAgICAgICAyLjAscjYscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDRDICAgNDAwMDAwMDAgCi0gICAgICAgMTEgMDAwMDAwNTAgICA1MUJFNTAwMCAgICAgICAgIGZtcHkuc3NzICAgICAgICAyLjAscjYscjEwICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDU0ICAgNDAwMDAwMDAgCi0gICAgICAgMTIgMDAwMDAwNTggICA0MDNFOTM4MCAgICAgICAgIGZybmRtLnNkICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDVDICAgNDAwMDAwMDAgCi0gICAgICAgMTMgMDAwMDAwNjAgICA0MDNFOTU4MCAgICAgICAgIGZybmRtLnNpICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDY0ICAgNDAwMDAwMDAgCi0gICAgICAgMTQgMDAwMDAwNjggICA0MDNFOTE4MCAgICAgICAgIGZybmRtLnNzICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDZDICAgNDAwMDAwMDAgCi0gICAgICAgMTUgMDAwMDAwNzAgICA0MDNFOTc4MCAgICAgICAgIGZybmRtLnN1ICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDc0ICAgNDAwMDAwMDAgCi0gICAgICAgMTYgMDAwMDAwNzggICA0MDNFOTIwMCAgICAgICAgIGZybmRuLnNkICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDdDICAgNDAwMDAwMDAgCi0gICAgICAgMTcgMDAwMDAwODAgICA0MDNFOTQwMCAgICAgICAgIGZybmRuLnNpICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDg0ICAgNDAwMDAwMDAgCi0gICAgICAgMTggMDAwMDAwODggICA0MDNFOTAwMCAgICAgICAgIGZybmRuLnNzICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDhDICAgNDAwMDAwMDAgCi0gICAgICAgMTkgMDAwMDAwOTAgICA0MDNFOTYwMCAgICAgICAgIGZybmRuLnN1ICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDk0ICAgNDAwMDAwMDAgCi0gICAgICAgMjAgMDAwMDAwOTggICA0MDNFOTMwMCAgICAgICAgIGZybmRwLnNkICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDlDICAgNDAwMDAwMDAgCi0gICAgICAgMjEgMDAwMDAwQTAgICA0MDNFOTUwMCAgICAgICAgIGZybmRwLnNpICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEE0ICAgNDAwMDAwMDAgCi0gICAgICAgMjIgMDAwMDAwQTggICA0MDNFOTEwMCAgICAgICAgIGZybmRwLnNzICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEFDICAgNDAwMDAwMDAgCi0gICAgICAgMjMgMDAwMDAwQjAgICA0MDNFOTcwMCAgICAgICAgIGZybmRwLnN1ICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEI0ICAgNDAwMDAwMDAgCi0gICAgICAgMjQgMDAwMDAwQjggICA0MDNFOTI4MCAgICAgICAgIGZybmR6LnNkICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEJDICAgNDAwMDAwMDAgCi0gICAgICAgMjUgMDAwMDAwQzAgICA0MDNFOTQ4MCAgICAgICAgIGZybmR6LnNpICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEM0ICAgNDAwMDAwMDAgCi0gICAgICAgMjYgMDAwMDAwQzggICA0MDNFOTA4MCAgICAgICAgIGZybmR6LnNzICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMENDICAgNDAwMDAwMDAgCi0gICAgICAgMjcgMDAwMDAwRDAgICA0MDNFOTY4MCAgICAgICAgIGZybmR6LnN1ICAgICAgICAyLjAscjggICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEQ0ICAgNDAwMDAwMDAgCi0gICAgICAgMjggMDAwMDAwRDggICA1MDNFRjIwMCAgICAgICAgIGZzcXJ0LnNkICAgICAgICAyLjAscjEwICAgICAgICAgOyBJbW1lZGlhdGUgZm9ybQotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAyMjowOTowOSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWZsb2F0LnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgotCi0gICAgICAgICAgMDAwMDAwREMgICA0MDAwMDAwMCAKLSAgICAgICAyOSAwMDAwMDBFMCAgIDUwM0VGMDAwICAgICAgICAgZnNxcnQuc3MgICAgICAgIDIuMCxyMTAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRTQgICA0MDAwMDAwMCAKLSAgICAgICAzMCAwMDAwMDBFOCAgIDUxQkUzMjgwICAgICAgICAgZnN1Yi5zZGQgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRUMgICA0MDAwMDAwMCAKLSAgICAgICAzMSAwMDAwMDBGMCAgIDUxQkUzMjAwICAgICAgICAgZnN1Yi5zc2QgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRjQgICA0MDAwMDAwMCAKLSAgICAgICAzMiAwMDAwMDBGOCAgIDUxQkUzMDAwICAgICAgICAgZnN1Yi5zc3MgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRkMgICA0MDAwMDAwMCAKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhMmI3YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotCWZhZGQuc2RkCTBmMS4wRTIzLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmFkZC5zc2QJMGYtMS4wRTIzLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmFkZC5zc3MJMGYxLjBFLTIzLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmNtcC5zZAkJMGYtMS4wRS0yMyxyOCxyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZjbXAuc3MJCTBmMC4wLHI4LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmRpdi5zZGQJMGYyLjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmZGl2LnNzZAkwZjAuNSxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZkaXYuc3NzCTBmNDA5Ni4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZm1weS5zZGQJMGYtNDA5Ni4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZm1weS5zc2QJMGYyLjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmbXB5LnNzcwkwZjIuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRtLnNkCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG0uc2kJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kbS5zcwkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRtLnN1CTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG4uc2QJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kbi5zaQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRuLnNzCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG4uc3UJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kcC5zZAkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRwLnNpCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZHAuc3MJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kcC5zdQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmR6LnNkCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZHouc2kJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kei5zcwkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmR6LnN1CTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnNxcnQuc2QJMGYyLjAscjEwCQk7IEltbWVkaWF0ZSBmb3JtCi0JZnNxcnQuc3MJMGYyLjAscjEwCQk7IEltbWVkaWF0ZSBmb3JtCi0JZnN1Yi5zZGQJMGYyLjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmc3ViLnNzZAkwZjIuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZzdWIuc3NzCTBmMi4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDBmYTg1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHJlZ2lzdGVyIG9wZXJhbmRzCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwMyAwMCAzYiAyOS4qCi0gICA0OgkwMyAyMCAzYiAyOS4qCi0gICA4OgkwNSAyMCAzMiAxMS4qCi0gICBjOgkwNSAyMCAzMiAxMS4qCi0gIDEwOgkwYSAwMCAzMyA3My4qCi0gIDE0OgkwYSA4MCAzMiA3My4qCi0gIDE4OgkwYSA0MCAzMiA3My4qCi0gIDFjOgkwYSA0MCAzOSAxYS4qCi0gIDIwOgkwYSA2MCAzOSBmYS4qCi0gIDI0OgkwYSAwMCAzOSAyMi4qCi0gIDI4OgkwYSAyMCAzOSAyYS4qCi0gIDJjOgkwNCA4MCBiOSAyMS4qCi0gIDMwOgkwNCBhMCBiOSAyMS4qCi0gIDM0OgkwNiAwMCAzOSAwMC4qCi0gIDM4OgkwNiAyMCAzOSAwMC4qCi0gIDNjOgkwYSAwMCAwMyAwMC4qCi0gIDQwOgkwNiAwMCAzOCBmOC4qCi0gIDQ0OgkwNiAyMCAzOCBmOC4qCi0gIDQ4OgkwNyA0MCAzMCAwMC4qCi0gIDRjOgkwMyAwMCAzYSAyOS4qCi0gIDUwOgkwOCAwMCBiNyAwMi4qCi0gIDU0OgkwOCAwMCBiNyAwYS4qCi0gIDU4OgkwNCAwNCBiNCA0MS4qCi0gIDVjOgkwNCAyNCBiNCA0MS4qCi0gIDYwOgkwNCA0NCBiNCA0MS4qCi0gIDY0OgkwNCA2NCBiNCA0MS4qCi0gIDY4OgkwNCAwNCBiNSA0MS4qCi0gIDZjOgkwNCAyNCBiNSA0MS4qCi0gIDcwOgkwNCAwNCBiNiA0MS4qCi0gIDc0OgkwNCAyNCBiNiA0MS4qCi0gIDc4OgkwNCA0NCBiNiA0MS4qCi0gIDdjOgkwNCA2NCBiNiA0MS4qCi0gIDgwOgkwNSAyMCAzMCAwOC4qCi0gIDg0OgllMyA0NyA3MSAzMS4qCi0gIDg4OgljMiAwNyA3MSA0OS4qCi0gIDhjOgkwMiAwMCAzZSAzMS4qCi0gIDkwOgkwMiAwMiAzZSAzMS4qCi0gIDk0Ogk4MiAwMiAzZSAzMS4qCi0gIDk4OgkyMiAwMiAzZSAzMS4qCi0gIDljOglhMiAwMiAzZSAzMS4qCi0gIGEwOgkwNCBhMCBiZSA0MS4qCi0gIGE0Ogk4NCBhMCBiZSA0MS4qCi0gIGE4OgkyNCBhMCBiZSA0MS4qCi0gIGFjOglhNCBhMCBiZSA0MS4qCi0gIGIwOgkwMiA2MCAzZSAzMS4qCi0gIGI0OgkwMiA2MiAzZSAzMS4qCi0gIGI4Ogk4MiA2MiAzZSAzMS4qCi0gIGJjOgkyMiA2MiAzZSAzMS4qCi0gIGMwOglhMiA2MiAzZSAzMS4qCi0gIGM0OgkwMiA0MCAzZSAzMS4qCi0gIGM4OgkwMiA0MiAzZSAzMS4qCi0gIGNjOgk4MiA0MiAzZSAzMS4qCi0gIGQwOgkyMiA0MiAzZSAzMS4qCi0gIGQ0OglhMiA0MiAzZSAzMS4qCi0gIGQ4Ogk0MiA0NSAzZSAzMS4qCi0gIGRjOgllMiA0NyAzZSAzMS4qCi0gIGUwOgk4NCA4MSAzZSAzMC4qCi0gIGU0Ogk4NCA4MyAzZSAzMC4qCi0gIGU4Ogk4NCA4NSAzZSAzMC4qCi0gIGVjOgk4NCA4NyAzZSAzMC4qCi0gIGYwOglhMiA4MSAzZSA0MC4qCi0gIGY0OglhMiA4MyAzZSA0MC4qCi0gIGY4OglhMiA4NSAzZSA0MC4qCi0gIGZjOglhMiA4NyAzZSA0MC4qCi0gMTAwOgljNCA4MSAzZSAzMC4qCi0gMTA0OgljNCA4MyAzZSAzMC4qCi0gMTA4OgllMiA4MSAzZSA0MC4qCi0gMTBjOgllMiA4MyAzZSA0MC4qCi0gMTEwOgkwNCA4MCAzZSAzMC4qCi0gMTE0OgkwNCA4MiAzZSAzMC4qCi0gMTE4OgkwNCA4NCAzZSAzMC4qCi0gMTFjOgkwNCA4NiAzZSAzMC4qCi0gMTIwOgkyMiA4MCAzZSA0MC4qCi0gMTI0OgkyMiA4MiAzZSA0MC4qCi0gMTI4OgkyMiA4NCAzZSA0MC4qCi0gMTJjOgkyMiA4NiAzZSA0MC4qCi0gMTMwOgk0NCA4MCAzZSAzMC4qCi0gMTM0Ogk0NCA4MiAzZSAzMC4qCi0gMTM4Ogk2MiA4MCAzZSA0MC4qCi0gMTNjOgk2MiA4MiAzZSA0MC4qCi0gMTQwOgkwNCA4MSAzZSAzMC4qCi0gMTQ0OgkwNCA4MyAzZSAzMC4qCi0gMTQ4OgkwNCA4NSAzZSAzMC4qCi0gMTRjOgkwNCA4NyAzZSAzMC4qCi0gMTUwOgkyMiA4MSAzZSA0MC4qCi0gMTU0OgkyMiA4MyAzZSA0MC4qCi0gMTU4OgkyMiA4NSAzZSA0MC4qCi0gMTVjOgkyMiA4NyAzZSA0MC4qCi0gMTYwOgk0NCA4MSAzZSAzMC4qCi0gMTY0Ogk0NCA4MyAzZSAzMC4qCi0gMTY4Ogk2MiA4MSAzZSA0MC4qCi0gMTZjOgk2MiA4MyAzZSA0MC4qCi0gMTcwOgk4NCA4MCAzZSAzMC4qCi0gMTc0Ogk4NCA4MiAzZSAzMC4qCi0gMTc4Ogk4NCA4NCAzZSAzMC4qCi0gMTdjOgk4NCA4NiAzZSAzMC4qCi0gMTgwOglhMiA4MCAzZSA0MC4qCi0gMTg0OglhMiA4MiAzZSA0MC4qCi0gMTg4OglhMiA4NCAzZSA0MC4qCi0gMThjOglhMiA4NiAzZSA0MC4qCi0gMTkwOgljNCA4MCAzZSAzMC4qCi0gMTk0OgljNCA4MiAzZSAzMC4qCi0gMTk4OgllMiA4MCAzZSA0MC4qCi0gMTljOgllMiA4MiAzZSA0MC4qCi0gMWEwOgkwNiBlMCAzZSA0MC4qCi0gMWE0OgkwNiBlMiAzZSA0MC4qCi0gMWE4OgkyNiBlMiAzZSA0MC4qCi0gMWFjOgkwMiAyMCAzZSAzMS4qCi0gMWIwOgkwMiAyMiAzZSAzMS4qCi0gMWI0Ogk4MiAyMiAzZSAzMS4qCi0gMWI4OgkyMiAyMiAzZSAzMS4qCi0gMWJjOglhMiAyMiAzZSAzMS4qCi0gMWMwOgllNCBlMyAzMSA1Mi4qCi0gMWM0OgkwNCA4MCBiOCA0MS4qCi0gMWM4OgkwNCBhMCBiOCA0MS4qCi0gMWNjOgkwNCAwMCBiNCA0MS4qCi0gMWQwOgkwNCAyMCBiNCA0MS4qCi0gMWQ0OgkwNCA0MCBiNCA0MS4qCi0gMWQ4OgkwNCA2MCBiNCA0MS4qCi0gMWRjOgkwNCAwMCBiNSA0MS4qCi0gMWUwOgkwNCAyMCBiNSA0MS4qCi0gMWU0OgkwMCAwMCBmZiA0MS4qCi0gMWU4OgkwMSBlMCBiMiAxOC4qCi0gMWVjOgkwMSBlMCBiMiAxOC4qCi0gMWYwOgkwMSBjMCBiMyAxOC4qCi0gMWY0OgkwMSBhMCBiMyAxOC4qCi0gMWY4OgkwMSA2MCBiMyAxOC4qCi0gMWZjOgkwNiA4MCAzMCAyMC4qCi0gMjAwOgkwMCAyMCAzZiAyOS4qCi0gMjA0OgllMiAwMyAzMSA1Mi4qCi0gMjA4OgllOCAwNyBiMSAzMC4qCi0gMjBjOgllNCBjMyBiMSAzMC4qCi0gMjEwOgk4NCAwMSA3MSAzMS4qCi0gMjE0Ogk4NCAyMSA3MSAzMS4qCi0gMjE4Ogk4NCA0MSA3MSAzMS4qCi0gMjFjOgk4NCA2MSA3MSAzMS4qCi0gMjIwOgk4NCA4MSA3MSAzMS4qCi0gMjI0Ogk4NCBhMSA3MSAzMS4qCi0gMjI4Ogk4NCBjMSA3MSAzMS4qCi0gMjJjOgk4NCBlMSA3MSAzMS4qCi0gMjMwOgk4NCAwOSA3MSAzMS4qCi0gMjM0Ogk4NCAyOSA3MSAzMS4qCi0gMjM4Ogk4NCA0OSA3MSAzMS4qCi0gMjNjOgk4NCA2OSA3MSAzMS4qCi0gMjQwOgk4NCA4OSA3MSAzMS4qCi0gMjQ0Ogk4NCBhOSA3MSAzMS4qCi0gMjQ4Ogk4NCBjOSA3MSAzMS4qCi0gMjRjOgk4NCBlOSA3MSAzMS4qCi0gMjUwOgk4NCAwNSA3MSAzMS4qCi0gMjU0Ogk4NCAyNSA3MSAzMS4qCi0gMjU4Ogk4NCA0NSA3MSAzMS4qCi0gMjVjOgk4NCA2NSA3MSAzMS4qCi0gMjYwOgk4NCA4NSA3MSAzMS4qCi0gMjY0Ogk4NCBhNSA3MSAzMS4qCi0gMjY4Ogk4NCBjNSA3MSAzMS4qCi0gMjZjOgk4NCBlNSA3MSAzMS4qCi0gMjcwOgkwNCBhNCBiMSA0MS4qCi0gMjc0Ogk4NCAwZCA3MSAzMS4qCi0gMjc4Ogk4NCAyZCA3MSAzMS4qCi0gMjdjOgk4NCA0ZCA3MSAzMS4qCi0gMjgwOgk4NCA2ZCA3MSAzMS4qCi0gMjg0Ogk4NCA4ZCA3MSAzMS4qCi0gMjg4Ogk4NCBhZCA3MSAzMS4qCi0gMjhjOgk4NCBjZCA3MSAzMS4qCi0gMjkwOgk4NCBlZCA3MSAzMS4qCi0gMjk0OgkwNCA2NCBiMSA0MS4qCi0gMjk4OgkwNCAwMCBiNiA0MS4qCi0gMjljOgkwNCAyMCBiNiA0MS4qCi0gMmEwOgkwNCA0MCBiNiA0MS4qCi0gMmE0OgkwNCA2MCBiNiA0MS4qCi0gMmE4OgkwNyA0MCAzYiA0YS4qCi0gMmFjOgkwNyA2MCAzYiA0YS4qCi0gMmIwOgkwOCBhMCBiMCAyMS4qCi0gMmI0OgkwYSAyMCAzMCAwMC4qCi0gMmI4OgkwMiAwMCAzYyAwMS4qCi0gMmJjOgk4MiAwMCBiYyAwMS4qCi0gMmMwOglhMiAwMCBiYyAwMi4qCi0gMmM0OgkwNiBhMCA3MCAwMS4qCi0gMmM4OgkwNSAyMCBiMyAzOS4qCi0gMmNjOgkwNyBjMCAzMiA0YS4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4OWRkMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMubHN0CisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDoyNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wcy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBTaW1wbGUgcmVnaXN0ZXIgZm9ybXMKLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IFRob3NlIGluc3RydWN0aW9ucyB3aGljaCBhbHNvIHVzZSBhbiBpbW1lZGlhdGUganVzdCB1c2UgYSBjb25zdGFudC4KLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA0IDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAudGV4dAotICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDYgMDAwMDAwMDAgICAyOTNCMDAwMyAgICAgICAgIGFkZCAgICAgICAgICAgICByMyxyNCxyNQotICAgICAgICA3IDAwMDAwMDA0ICAgMjkzQjIwMDMgICAgICAgICBhZGR1ICAgICAgICAgICAgcjMscjQscjUKLSAgICAgICAgOCAwMDAwMDAwOCAgIDExMzIyMDA1ICAgICAgICAgYW5kICAgICAgICAgICAgIHI1LHI0LHIyCi0gICAgICAgIDkgMDAwMDAwMEMgICAxMTMyMjAwNSAgICAgICAgIGFuZC50dCAgICAgICAgICByNSxyNCxyMgotICAgICAgIDEwIDAwMDAwMDEwICAgNzMzMzAwMEEgICAgICAgICBhbmQuZmYgICAgICAgICAgcjEwLHIxMixyMTQKLSAgICAgICAxMSAwMDAwMDAxNCAgIDczMzI4MDBBICAgICAgICAgYW5kLmZ0ICAgICAgICAgIHIxMCxyMTIscjE0Ci0gICAgICAgMTIgMDAwMDAwMTggICA3MzMyNDAwQSAgICAgICAgIGFuZC50ZiAgICAgICAgICByMTAscjEyLHIxNAotICAgICAgIDEzIDAwMDAwMDFDICAgMUEzOTQwMEEgICAgICAgICBiYm8gICAgICAgICAgICAgcjEwLHI4LGxvLncKLSAgICAgICAxNCAwMDAwMDAyMCAgIEZBMzk2MDBBICAgICAgICAgYmJvLmEgICAgICAgICAgIHIxMCxyOCxlcS5iCi0gICAgICAgMTUgMDAwMDAwMjQgICAyMjM5MDAwQSAgICAgICAgIGJieiAgICAgICAgICAgICByMTAscjgsbHMudwotICAgICAgIDE2IDAwMDAwMDI4ICAgMkEzOTIwMEEgICAgICAgICBiYnouYSAgICAgICAgICAgcjEwLHI4LGhpLncKLSAgICAgICAxNyAwMDAwMDAyQyAgIDIxQjk4MDA0ICAgICAgICAgYmNuZCAgICAgICAgICAgIHI0LHI2LGx0MC5iCi0gICAgICAgMTggMDAwMDAwMzAgICAyMUI5QTAwNCAgICAgICAgIGJjbmQuYSAgICAgICAgICByNCxyNixsdDAuYgotICAgICAgIDE5IDAwMDAwMDM0ICAgMDAzOTAwMDYgICAgICAgICBiciAgICAgICAgICAgICAgcjYKLSAgICAgICAyMCAwMDAwMDAzOCAgIDAwMzkyMDA2ICAgICAgICAgYnIuYSAgICAgICAgICAgIHI2Ci0gICAgICAgMjEgMDAwMDAwM0MgICAwMDAzMDAwQSAgICAgICAgIGJyY3IgICAgICAgICAgICAxMAotICAgICAgIDIyIDAwMDAwMDQwICAgRjgzODAwMDYgICAgICAgICBic3IgICAgICAgICAgICAgcjYscjMxCi0gICAgICAgMjMgMDAwMDAwNDQgICBGODM4MjAwNiAgICAgICAgIGJzci5hICAgICAgICAgICByNixyMzEKLSAgICAgICAyNCAwMDAwMDA0OCAgIDAwMzA0MDA3ICAgICAgICAgY21uZCAgICAgICAgICAgIHI3Ci0gICAgICAgMjUgMDAwMDAwNEMgICAyOTNBMDAwMyAgICAgICAgIGNtcCAgICAgICAgICAgICByMyxyNCxyNQotICAgICAgIDI2IDAwMDAwMDUwICAgMDJCNzAwMDggICAgICAgICBkY2FjaGVjICAgICAgICAgcjgocjEwKQotICAgICAgIDI3IDAwMDAwMDU0ICAgMEFCNzAwMDggICAgICAgICBkY2FjaGVmICAgICAgICAgcjgocjEwKQotICAgICAgIDI4IDAwMDAwMDU4ICAgNDFCNDA0MDQgICAgICAgICBkbGQuYiAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMjkgMDAwMDAwNUMgICA0MUI0MjQwNCAgICAgICAgIGRsZC5oICAgICAgICAgICByNChyNikscjgKLSAgICAgICAzMCAwMDAwMDA2MCAgIDQxQjQ0NDA0ICAgICAgICAgZGxkICAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDMxIDAwMDAwMDY0ICAgNDFCNDY0MDQgICAgICAgICBkbGQuZCAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzIgMDAwMDAwNjggICA0MUI1MDQwNCAgICAgICAgIGRsZC51YiAgICAgICAgICByNChyNikscjgKLSAgICAgICAzMyAwMDAwMDA2QyAgIDQxQjUyNDA0ICAgICAgICAgZGxkLnVoICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDM0IDAwMDAwMDcwICAgNDFCNjA0MDQgICAgICAgICBkc3QuYiAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzUgMDAwMDAwNzQgICA0MUI2MjQwNCAgICAgICAgIGRzdC5oICAgICAgICAgICByNChyNikscjgKLSAgICAgICAzNiAwMDAwMDA3OCAgIDQxQjY0NDA0ICAgICAgICAgZHN0ICAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDM3IDAwMDAwMDdDICAgNDFCNjY0MDQgICAgICAgICBkc3QuZCAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzggMDAwMDAwODAgICAwODMwMjAwNSAgICAgICAgIGV0cmFwICAgICAgICAgICByNQotICAgICAgIDM5IDAwMDAwMDg0ICAgMzE3MTQ3RTMgICAgICAgICBleHRzICAgICAgICAgICAgcjMsMzEscjUscjYKLSAgICAgICA0MCAwMDAwMDA4OCAgIDQ5NzEwN0MyICAgICAgICAgZXh0dSAgICAgICAgICAgIHIyLDMwLHI1LHI5Ci0gICAgICAgNDEgMDAwMDAwOEMgICAzMTNFMDAwMiAgICAgICAgIGZhZGQuc3NzICAgICAgICByMixyNCxyNgotICAgICAgIDQyIDAwMDAwMDkwICAgMzEzRTAyMDIgICAgICAgICBmYWRkLnNzZCAgICAgICAgcjIscjQscjYKLSAgICAgICA0MyAwMDAwMDA5NCAgIDMxM0UwMjgyICAgICAgICAgZmFkZC5zZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNDQgMDAwMDAwOTggICAzMTNFMDIyMiAgICAgICAgIGZhZGQuZHNkICAgICAgICByMixyNCxyNgotICAgICAgIDQ1IDAwMDAwMDlDICAgMzEzRTAyQTIgICAgICAgICBmYWRkLmRkZCAgICAgICAgcjIscjQscjYKLSAgICAgICA0NiAwMDAwMDBBMCAgIDQxQkVBMDA0ICAgICAgICAgZmNtcC5zcyAgICAgICAgIHI0LHI2LHI4Ci0gICAgICAgNDcgMDAwMDAwQTQgICA0MUJFQTA4NCAgICAgICAgIGZjbXAuc2QgICAgICAgICByNCxyNixyOAotICAgICAgIDQ4IDAwMDAwMEE4ICAgNDFCRUEwMjQgICAgICAgICBmY21wLmRzICAgICAgICAgcjQscjYscjgKLSAgICAgICA0OSAwMDAwMDBBQyAgIDQxQkVBMEE0ICAgICAgICAgZmNtcC5kZCAgICAgICAgIHI0LHI2LHI4Ci0gICAgICAgNTAgMDAwMDAwQjAgICAzMTNFNjAwMiAgICAgICAgIGZkaXYuc3NzICAgICAgICByMixyNCxyNgotICAgICAgIDUxIDAwMDAwMEI0ICAgMzEzRTYyMDIgICAgICAgICBmZGl2LnNzZCAgICAgICAgcjIscjQscjYKLSAgICAgICA1MiAwMDAwMDBCOCAgIDMxM0U2MjgyICAgICAgICAgZmRpdi5zZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNTMgMDAwMDAwQkMgICAzMTNFNjIyMiAgICAgICAgIGZkaXYuZHNkICAgICAgICByMixyNCxyNgotICAgICAgIDU0IDAwMDAwMEMwICAgMzEzRTYyQTIgICAgICAgICBmZGl2LmRkZCAgICAgICAgcjIscjQscjYKLSAgICAgICA1NSAwMDAwMDBDNCAgIDMxM0U0MDAyICAgICAgICAgZm1weS5zc3MgICAgICAgIHIyLHI0LHI2Ci0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCi0KLSAgICAgICA1NiAwMDAwMDBDOCAgIDMxM0U0MjAyICAgICAgICAgZm1weS5zc2QgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNTcgMDAwMDAwQ0MgICAzMTNFNDI4MiAgICAgICAgIGZtcHkuc2RkICAgICAgICByMixyNCxyNgotICAgICAgIDU4IDAwMDAwMEQwICAgMzEzRTQyMjIgICAgICAgICBmbXB5LmRzZCAgICAgICAgcjIscjQscjYKLSAgICAgICA1OSAwMDAwMDBENCAgIDMxM0U0MkEyICAgICAgICAgZm1weS5kZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNjAgMDAwMDAwRDggICAzMTNFNDU0MiAgICAgICAgIGZtcHkuaWlpICAgICAgICByMixyNCxyNgotICAgICAgIDYxIDAwMDAwMERDICAgMzEzRTQ3RTIgICAgICAgICBmbXB5LnV1dSAgICAgICAgcjIscjQscjYKLSAgICAgICA2MiAwMDAwMDBFMCAgIDMwM0U4MTg0ICAgICAgICAgZnJuZG0uc3MgICAgICAgIHI0LHI2Ci0gICAgICAgNjMgMDAwMDAwRTQgICAzMDNFODM4NCAgICAgICAgIGZybmRtLnNkICAgICAgICByNCxyNgotICAgICAgIDY0IDAwMDAwMEU4ICAgMzAzRTg1ODQgICAgICAgICBmcm5kbS5zaSAgICAgICAgcjQscjYKLSAgICAgICA2NSAwMDAwMDBFQyAgIDMwM0U4Nzg0ICAgICAgICAgZnJuZG0uc3UgICAgICAgIHI0LHI2Ci0gICAgICAgNjYgMDAwMDAwRjAgICA0MDNFODFBMiAgICAgICAgIGZybmRtLmRzICAgICAgICByMixyOAotICAgICAgIDY3IDAwMDAwMEY0ICAgNDAzRTgzQTIgICAgICAgICBmcm5kbS5kZCAgICAgICAgcjIscjgKLSAgICAgICA2OCAwMDAwMDBGOCAgIDQwM0U4NUEyICAgICAgICAgZnJuZG0uZGkgICAgICAgIHIyLHI4Ci0gICAgICAgNjkgMDAwMDAwRkMgICA0MDNFODdBMiAgICAgICAgIGZybmRtLmR1ICAgICAgICByMixyOAotICAgICAgIDcwIDAwMDAwMTAwICAgMzAzRTgxQzQgICAgICAgICBmcm5kbS5pcyAgICAgICAgcjQscjYKLSAgICAgICA3MSAwMDAwMDEwNCAgIDMwM0U4M0M0ICAgICAgICAgZnJuZG0uaWQgICAgICAgIHI0LHI2Ci0gICAgICAgNzIgMDAwMDAxMDggICA0MDNFODFFMiAgICAgICAgIGZybmRtLnVzICAgICAgICByMixyOAotICAgICAgIDczIDAwMDAwMTBDICAgNDAzRTgzRTIgICAgICAgICBmcm5kbS51ZCAgICAgICAgcjIscjgKLSAgICAgICA3NCAwMDAwMDExMCAgIDMwM0U4MDA0ICAgICAgICAgZnJuZG4uc3MgICAgICAgIHI0LHI2Ci0gICAgICAgNzUgMDAwMDAxMTQgICAzMDNFODIwNCAgICAgICAgIGZybmRuLnNkICAgICAgICByNCxyNgotICAgICAgIDc2IDAwMDAwMTE4ICAgMzAzRTg0MDQgICAgICAgICBmcm5kbi5zaSAgICAgICAgcjQscjYKLSAgICAgICA3NyAwMDAwMDExQyAgIDMwM0U4NjA0ICAgICAgICAgZnJuZG4uc3UgICAgICAgIHI0LHI2Ci0gICAgICAgNzggMDAwMDAxMjAgICA0MDNFODAyMiAgICAgICAgIGZybmRuLmRzICAgICAgICByMixyOAotICAgICAgIDc5IDAwMDAwMTI0ICAgNDAzRTgyMjIgICAgICAgICBmcm5kbi5kZCAgICAgICAgcjIscjgKLSAgICAgICA4MCAwMDAwMDEyOCAgIDQwM0U4NDIyICAgICAgICAgZnJuZG4uZGkgICAgICAgIHIyLHI4Ci0gICAgICAgODEgMDAwMDAxMkMgICA0MDNFODYyMiAgICAgICAgIGZybmRuLmR1ICAgICAgICByMixyOAotICAgICAgIDgyIDAwMDAwMTMwICAgMzAzRTgwNDQgICAgICAgICBmcm5kbi5pcyAgICAgICAgcjQscjYKLSAgICAgICA4MyAwMDAwMDEzNCAgIDMwM0U4MjQ0ICAgICAgICAgZnJuZG4uaWQgICAgICAgIHI0LHI2Ci0gICAgICAgODQgMDAwMDAxMzggICA0MDNFODA2MiAgICAgICAgIGZybmRuLnVzICAgICAgICByMixyOAotICAgICAgIDg1IDAwMDAwMTNDICAgNDAzRTgyNjIgICAgICAgICBmcm5kbi51ZCAgICAgICAgcjIscjgKLSAgICAgICA4NiAwMDAwMDE0MCAgIDMwM0U4MTA0ICAgICAgICAgZnJuZHAuc3MgICAgICAgIHI0LHI2Ci0gICAgICAgODcgMDAwMDAxNDQgICAzMDNFODMwNCAgICAgICAgIGZybmRwLnNkICAgICAgICByNCxyNgotICAgICAgIDg4IDAwMDAwMTQ4ICAgMzAzRTg1MDQgICAgICAgICBmcm5kcC5zaSAgICAgICAgcjQscjYKLSAgICAgICA4OSAwMDAwMDE0QyAgIDMwM0U4NzA0ICAgICAgICAgZnJuZHAuc3UgICAgICAgIHI0LHI2Ci0gICAgICAgOTAgMDAwMDAxNTAgICA0MDNFODEyMiAgICAgICAgIGZybmRwLmRzICAgICAgICByMixyOAotICAgICAgIDkxIDAwMDAwMTU0ICAgNDAzRTgzMjIgICAgICAgICBmcm5kcC5kZCAgICAgICAgcjIscjgKLSAgICAgICA5MiAwMDAwMDE1OCAgIDQwM0U4NTIyICAgICAgICAgZnJuZHAuZGkgICAgICAgIHIyLHI4Ci0gICAgICAgOTMgMDAwMDAxNUMgICA0MDNFODcyMiAgICAgICAgIGZybmRwLmR1ICAgICAgICByMixyOAotICAgICAgIDk0IDAwMDAwMTYwICAgMzAzRTgxNDQgICAgICAgICBmcm5kcC5pcyAgICAgICAgcjQscjYKLSAgICAgICA5NSAwMDAwMDE2NCAgIDMwM0U4MzQ0ICAgICAgICAgZnJuZHAuaWQgICAgICAgIHI0LHI2Ci0gICAgICAgOTYgMDAwMDAxNjggICA0MDNFODE2MiAgICAgICAgIGZybmRwLnVzICAgICAgICByMixyOAotICAgICAgIDk3IDAwMDAwMTZDICAgNDAzRTgzNjIgICAgICAgICBmcm5kcC51ZCAgICAgICAgcjIscjgKLSAgICAgICA5OCAwMDAwMDE3MCAgIDMwM0U4MDg0ICAgICAgICAgZnJuZHouc3MgICAgICAgIHI0LHI2Ci0gICAgICAgOTkgMDAwMDAxNzQgICAzMDNFODI4NCAgICAgICAgIGZybmR6LnNkICAgICAgICByNCxyNgotICAgICAgMTAwIDAwMDAwMTc4ICAgMzAzRTg0ODQgICAgICAgICBmcm5kei5zaSAgICAgICAgcjQscjYKLSAgICAgIDEwMSAwMDAwMDE3QyAgIDMwM0U4Njg0ICAgICAgICAgZnJuZHouc3UgICAgICAgIHI0LHI2Ci0gICAgICAxMDIgMDAwMDAxODAgICA0MDNFODBBMiAgICAgICAgIGZybmR6LmRzICAgICAgICByMixyOAotICAgICAgMTAzIDAwMDAwMTg0ICAgNDAzRTgyQTIgICAgICAgICBmcm5kei5kZCAgICAgICAgcjIscjgKLSAgICAgIDEwNCAwMDAwMDE4OCAgIDQwM0U4NEEyICAgICAgICAgZnJuZHouZGkgICAgICAgIHIyLHI4Ci0gICAgICAxMDUgMDAwMDAxOEMgICA0MDNFODZBMiAgICAgICAgIGZybmR6LmR1ICAgICAgICByMixyOAotICAgICAgMTA2IDAwMDAwMTkwICAgMzAzRTgwQzQgICAgICAgICBmcm5kei5pcyAgICAgICAgcjQscjYKLSAgICAgIDEwNyAwMDAwMDE5NCAgIDMwM0U4MkM0ICAgICAgICAgZnJuZHouaWQgICAgICAgIHI0LHI2Ci0gICAgICAxMDggMDAwMDAxOTggICA0MDNFODBFMiAgICAgICAgIGZybmR6LnVzICAgICAgICByMixyOAotICAgICAgMTA5IDAwMDAwMTlDICAgNDAzRTgyRTIgICAgICAgICBmcm5kei51ZCAgICAgICAgcjIscjgKLSAgICAgIDExMCAwMDAwMDFBMCAgIDQwM0VFMDA2ICAgICAgICAgZnNxcnQuc3MgICAgICAgIHI2LHI4Ci0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAzCi0KLSAgICAgIDExMSAwMDAwMDFBNCAgIDQwM0VFMjA2ICAgICAgICAgZnNxcnQuc2QgICAgICAgIHI2LHI4Ci0gICAgICAxMTIgMDAwMDAxQTggICA0MDNFRTIyNiAgICAgICAgIGZzcXJ0LmRkICAgICAgICByNixyOAotICAgICAgMTEzIDAwMDAwMUFDICAgMzEzRTIwMDIgICAgICAgICBmc3ViLnNzcyAgICAgICAgcjIscjQscjYKLSAgICAgIDExNCAwMDAwMDFCMCAgIDMxM0UyMjAyICAgICAgICAgZnN1Yi5zc2QgICAgICAgIHIyLHI0LHI2Ci0gICAgICAxMTUgMDAwMDAxQjQgICAzMTNFMjI4MiAgICAgICAgIGZzdWIuc2RkICAgICAgICByMixyNCxyNgotICAgICAgMTE2IDAwMDAwMUI4ICAgMzEzRTIyMjIgICAgICAgICBmc3ViLmRzZCAgICAgICAgcjIscjQscjYKLSAgICAgIDExNyAwMDAwMDFCQyAgIDMxM0UyMkEyICAgICAgICAgZnN1Yi5kZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAxMTggMDAwMDAxQzAgICA1MjMxRTNFNCAgICAgICAgIGlucyAgICAgICAgICAgICByNCwzMSxyOCxyMTAKLSAgICAgIDExOSAwMDAwMDFDNCAgIDQxQjg4MDA0ICAgICAgICAganNyICAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTIwIDAwMDAwMUM4ICAgNDFCOEEwMDQgICAgICAgICBqc3IuYSAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjEgMDAwMDAxQ0MgICA0MUI0MDAwNCAgICAgICAgIGxkLmIgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDEyMiAwMDAwMDFEMCAgIDQxQjQyMDA0ICAgICAgICAgbGQuaCAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTIzIDAwMDAwMUQ0ICAgNDFCNDQwMDQgICAgICAgICBsZCAgICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjQgMDAwMDAxRDggICA0MUI0NjAwNCAgICAgICAgIGxkLmQgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDEyNSAwMDAwMDFEQyAgIDQxQjUwMDA0ICAgICAgICAgbGQudWIgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTI2IDAwMDAwMUUwICAgNDFCNTIwMDQgICAgICAgICBsZC51aCAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjcgMDAwMDAxRTQgICA0MUZGMDAwNyAgICAgICAgIGxtbyAgICAgICAgICAgICByNyxyOAotICAgICAgMTI4IDAwMDAwMUU4ICAgMThCMkUwMDEgICAgICAgICBvciAgICAgICAgICAgICAgcjEscjIscjMKLSAgICAgIDEyOSAwMDAwMDFFQyAgIDE4QjJFMDAxICAgICAgICAgb3IudHQgICAgICAgICAgIHIxLHIyLHIzCi0gICAgICAxMzAgMDAwMDAxRjAgICAxOEIzQzAwMSAgICAgICAgIG9yLmZmICAgICAgICAgICByMSxyMixyMwotICAgICAgMTMxIDAwMDAwMUY0ICAgMThCM0EwMDEgICAgICAgICBvci5mdCAgICAgICAgICAgcjEscjIscjMKLSAgICAgIDEzMiAwMDAwMDFGOCAgIDE4QjM2MDAxICAgICAgICAgb3IudGYgICAgICAgICAgIHIxLHIyLHIzCi0gICAgICAxMzMgMDAwMDAxRkMgICAyMDMwODAwNiAgICAgICAgIHJkY3IgICAgICAgICAgICByNixyNAotICAgICAgMTM0IDAwMDAwMjAwICAgMjkzRjIwMDQgICAgICAgICBybW8gICAgICAgICAgICAgcjQscjUKLSAgICAgIDEzNSAwMDAwMDIwNCAgIDUyMzEwM0UyICAgICAgICAgcm90bCAgICAgICAgICAgIHIyLDMxLHI4LHIxMAotICAgICAgMTM2IDAwMDAwMjA4ICAgMzBCMTA3RTggICAgICAgICByb3RyICAgICAgICAgICAgcjgsMzEscjIscjYKLSAgICAgIDEzNyAwMDAwMDIwQyAgIDMwQjFDM0U0ICAgICAgICAgc2hsICAgICAgICAgICAgIHI0LDMxLHIyLHI2Ci0gICAgICAxMzggMDAwMDAyMTAgICAzMTcxMDE4NCAgICAgICAgIHNsLmR6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTM5IDAwMDAwMjE0ICAgMzE3MTIxODQgICAgICAgICBzbC5kbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0MCAwMDAwMDIxOCAgIDMxNzE0MTg0ICAgICAgICAgc2wuZHMgICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDEgMDAwMDAyMUMgICAzMTcxNjE4NCAgICAgICAgIHNsLmV6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQyIDAwMDAwMjIwICAgMzE3MTgxODQgICAgICAgICBzbC5lbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0MyAwMDAwMDIyNCAgIDMxNzFBMTg0ICAgICAgICAgc2wuZXMgICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDQgMDAwMDAyMjggICAzMTcxQzE4NCAgICAgICAgIHNsLml6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQ1IDAwMDAwMjJDICAgMzE3MUUxODQgICAgICAgICBzbC5pbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0NiAwMDAwMDIzMCAgIDMxNzEwOTg0ICAgICAgICAgc2xpLmR6ICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDcgMDAwMDAyMzQgICAzMTcxMjk4NCAgICAgICAgIHNsaS5kbSAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQ4IDAwMDAwMjM4ICAgMzE3MTQ5ODQgICAgICAgICBzbGkuZHMgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0OSAwMDAwMDIzQyAgIDMxNzE2OTg0ICAgICAgICAgc2xpLmV6ICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTAgMDAwMDAyNDAgICAzMTcxODk4NCAgICAgICAgIHNsaS5lbSAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTUxIDAwMDAwMjQ0ICAgMzE3MUE5ODQgICAgICAgICBzbGkuZXMgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1MiAwMDAwMDI0OCAgIDMxNzFDOTg0ICAgICAgICAgc2xpLml6ICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTMgMDAwMDAyNEMgICAzMTcxRTk4NCAgICAgICAgIHNsaS5pbSAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTU0IDAwMDAwMjUwICAgMzE3MTA1ODQgICAgICAgICBzci5keiAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1NSAwMDAwMDI1NCAgIDMxNzEyNTg0ICAgICAgICAgc3IuZG0gICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTYgMDAwMDAyNTggICAzMTcxNDU4NCAgICAgICAgIHNyLmRzICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTU3IDAwMDAwMjVDICAgMzE3MTY1ODQgICAgICAgICBzci5leiAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1OCAwMDAwMDI2MCAgIDMxNzE4NTg0ICAgICAgICAgc3IuZW0gICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTkgMDAwMDAyNjQgICAzMTcxQTU4NCAgICAgICAgIHNyLmVzICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTYwIDAwMDAwMjY4ICAgMzE3MUM1ODQgICAgICAgICBzci5peiAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2MSAwMDAwMDI2QyAgIDMxNzFFNTg0ICAgICAgICAgc3IuaW0gICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNjIgMDAwMDAyNzAgICA0MUIxQTQwNCAgICAgICAgIHNyYSAgICAgICAgICAgICByNCwzMixyNixyOAotICAgICAgMTYzIDAwMDAwMjc0ICAgMzE3MTBEODQgICAgICAgICBzcmkuZHogICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2NCAwMDAwMDI3OCAgIDMxNzEyRDg0ICAgICAgICAgc3JpLmRtICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNjUgMDAwMDAyN0MgICAzMTcxNEQ4NCAgICAgICAgIHNyaS5kcyAgICAgICAgICByNCwxMixyNSxyNgotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDoyNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wcy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgNAotCi0gICAgICAxNjYgMDAwMDAyODAgICAzMTcxNkQ4NCAgICAgICAgIHNyaS5leiAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTY3IDAwMDAwMjg0ICAgMzE3MThEODQgICAgICAgICBzcmkuZW0gICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2OCAwMDAwMDI4OCAgIDMxNzFBRDg0ICAgICAgICAgc3JpLmVzICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNjkgMDAwMDAyOEMgICAzMTcxQ0Q4NCAgICAgICAgIHNyaS5peiAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTcwIDAwMDAwMjkwICAgMzE3MUVEODQgICAgICAgICBzcmkuaW0gICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE3MSAwMDAwMDI5NCAgIDQxQjE2NDA0ICAgICAgICAgc3JsICAgICAgICAgICAgIHI0LDMyLHI2LHI4Ci0gICAgICAxNzIgMDAwMDAyOTggICA0MUI2MDAwNCAgICAgICAgIHN0LmIgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDE3MyAwMDAwMDI5QyAgIDQxQjYyMDA0ICAgICAgICAgc3QuaCAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTc0IDAwMDAwMkEwICAgNDFCNjQwMDQgICAgICAgICBzdCAgICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxNzUgMDAwMDAyQTQgICA0MUI2NjAwNCAgICAgICAgIHN0LmQgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDE3NiAwMDAwMDJBOCAgIDRBM0I0MDA3ICAgICAgICAgc3ViICAgICAgICAgICAgIHI3LHI4LHI5Ci0gICAgICAxNzcgMDAwMDAyQUMgICA0QTNCNjAwNyAgICAgICAgIHN1YnUgICAgICAgICAgICByNyxyOCxyOQotICAgICAgMTc4IDAwMDAwMkIwICAgMjFCMEEwMDggICAgICAgICBzd2NyICAgICAgICAgICAgcjgscjYscjQKLSAgICAgIDE3OSAwMDAwMDJCNCAgIDAwMzAyMDBBICAgICAgICAgdHJhcCAgICAgICAgICAgIHIxMAotICAgICAgMTgwIDAwMDAwMkI4ICAgMDEzQzAwMDIgICAgICAgICB2YWRkLnNzICAgICAgICAgcjIscjQscjQKLSAgICAgIDE4MSAwMDAwMDJCQyAgIDAxQkMwMDgyICAgICAgICAgdmFkZC5zZCAgICAgICAgIHIyLHI2LHI2Ci0gICAgICAxODIgMDAwMDAyQzAgICAwMkJDMDBBMiAgICAgICAgIHZhZGQuZGQgICAgICAgICByMixyMTAscjEwCi0gICAgICAxODMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZsZDAucyAgICAgICAgICByNgotICAgICAgMTg0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bGQxLnMgICAgICAgICAgcjcKLSAgICAgIDE4NSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdmxkMC5kICAgICAgICAgIHI2Ci0gICAgICAxODYgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZsZDEuZCAgICAgICAgICByOAotICAgICAgMTg3ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzcyAgICAgICAgcjcscjksMCxhMwotICAgICAgMTg4ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzcyAgICAgICAgcjcscjksMCxyMTAKLSAgICAgIDE4OSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc3MgICAgICAgIHI3LHI5LGExLGEzCi0gICAgICAxOTAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NzICAgICAgICByNyxyOSxhMyxyMTAKLSAgICAgIDE5MSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc2QgICAgICAgIHI3LHI5LDAsYTAKLSAgICAgIDE5MiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc2QgICAgICAgIHI3LHI5LDAscjEwCi0gICAgICAxOTMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NkICAgICAgICByNyxyOSxhMSxhMgotICAgICAgMTk0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzZCAgICAgICAgcjcscjksYTMscjEwCi0gICAgICAxOTUgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtcHkuc3MgICAgICAgICByMSxyMyxyMwotICAgICAgMTk2ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXB5LnNkICAgICAgICAgcjUscjYscjYKLSAgICAgIDE5NyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1weS5kZCAgICAgICAgIHIyLHI0LHI0Ci0gICAgICAxOTggICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NzICAgICAgICByNyxyOSwwLGEwCi0gICAgICAxOTkgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NzICAgICAgICByNyxyOSwwLHIxMAotICAgICAgMjAwICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzcyAgICAgICAgcjcscjksYTAsYTEKLSAgICAgIDIwMSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc3MgICAgICAgIHI3LHI5LGEzLHIxMAotICAgICAgMjAyICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzZCAgICAgICAgcjcscjksMCxhMAotICAgICAgMjAzICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzZCAgICAgICAgcjcscjksMCxyMTAKLSAgICAgIDIwNCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc2QgICAgICAgIHI3LHI5LGEwLGExCi0gICAgICAyMDUgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NkICAgICAgICByNyxyOSxhMyxyMTAKLSAgICAgIDIwNiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zdWIuc3MgICAgICAgIHI2LGEyLGE0Ci0gICAgICAyMDcgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc3ViLnNkICAgICAgICByNixhMixhNAotICAgICAgMjA4ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXN1Yi5zcyAgICAgICAgcjQsYTQscjYKLSAgICAgIDIwOSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zdWIuc2QgICAgICAgIHI0LGE0LHI2Ci0gICAgICAyMTAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc2kgICAgICAgICByNCxyNgotICAgICAgMjExICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnNpICAgICAgICAgcjQsYTAKLSAgICAgIDIxMiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zdSAgICAgICAgIHI0LHI2Ci0gICAgICAyMTMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc3UgICAgICAgICByNCxhMAotICAgICAgMjE0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnNzICAgICAgICAgcjQscjYKLSAgICAgIDIxNSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zcyAgICAgICAgIHI0LGEwCi0gICAgICAyMTYgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc2QgICAgICAgICByNCxyNgotICAgICAgMjE3ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnNkICAgICAgICAgcjQsYTAKLSAgICAgIDIxOCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kaSAgICAgICAgIHI0LHI2Ci0gICAgICAyMTkgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZGkgICAgICAgICByNCxhMAotICAgICAgMjIwICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmR1ICAgICAgICAgcjQscjYKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6MjQgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDUKLQotICAgICAgMjIxICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmR1ICAgICAgICAgcjQsYTAKLSAgICAgIDIyMiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kcyAgICAgICAgIHI0LHI2Ci0gICAgICAyMjMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZHMgICAgICAgICByNCxhMAotICAgICAgMjI0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmRkICAgICAgICAgcjQscjYKLSAgICAgIDIyNSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kZCAgICAgICAgIHI0LGEwCi0gICAgICAyMjYgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuaXMgICAgICAgICByNCxyNgotICAgICAgMjI3ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmlkICAgICAgICAgcjQscjYKLSAgICAgIDIyOCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC51cyAgICAgICAgIHI0LHI2Ci0gICAgICAyMjkgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQudWQgICAgICAgICByNCxyNgotICAgICAgMjMwICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2c3QucyAgICAgICAgICAgcjYKLSAgICAgIDIzMSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnN0LmQgICAgICAgICAgIHI2Ci0gICAgICAyMzIgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZzdWIuc3MgICAgICAgICByMixyNCxyNgotICAgICAgMjMzICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2c3ViLnNkICAgICAgICAgcjIscjQscjYKLSAgICAgIDIzNCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnN1Yi5kZCAgICAgICAgIHIyLHI0LHI2Ci0gICAgICAyMzUgMDAwMDAyQzQgICAwMTcwQTAwNiAgICAgICAgIHdyY3IgICAgICAgICAgICByNixyNQotICAgICAgMjM2IDAwMDAwMkM4ICAgMzlCMzIwMDUgICAgICAgICB4bm9yICAgICAgICAgICAgcjUscjYscjcKLSAgICAgIDIzNyAwMDAwMDJDQyAgIDRBMzJDMDA3ICAgICAgICAgeG9yICAgICAgICAgICAgIHI3LHI4LHI5Ci0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmOTM1Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMucworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi07OyBTaW1wbGUgcmVnaXN0ZXIgZm9ybXMKLTs7IFRob3NlIGluc3RydWN0aW9ucyB3aGljaCBhbHNvIHVzZSBhbiBpbW1lZGlhdGUganVzdCB1c2UgYSBjb25zdGFudC4KLQotCS50ZXh0Ci0KLQlhZGQJCXIzLHI0LHI1Ci0JYWRkdQkJcjMscjQscjUKLQlhbmQJCXI1LHI0LHIyCi0JYW5kLnR0CQlyNSxyNCxyMgotCWFuZC5mZgkJcjEwLHIxMixyMTQKLQlhbmQuZnQJCXIxMCxyMTIscjE0Ci0JYW5kLnRmCQlyMTAscjEyLHIxNAotCWJibwkJcjEwLHI4LGxvLncKLQliYm8uYQkJcjEwLHI4LGVxLmIKLQliYnoJCXIxMCxyOCxscy53Ci0JYmJ6LmEJCXIxMCxyOCxoaS53Ci0JYmNuZAkJcjQscjYsbHQwLmIKLQliY25kLmEJCXI0LHI2LGx0MC5iCi0JYnIJCXI2Ci0JYnIuYQkJcjYKLQlicmNyCQkxMAotCWJzcgkJcjYscjMxCi0JYnNyLmEJCXI2LHIzMQotCWNtbmQJCXI3Ci0JY21wCQlyMyxyNCxyNQotCWRjYWNoZWMJCXI4KHIxMCkKLQlkY2FjaGVmCQlyOChyMTApCi0JZGxkLmIJCXI0KHI2KSxyOAotCWRsZC5oCQlyNChyNikscjgKLQlkbGQJCXI0KHI2KSxyOAotCWRsZC5kCQlyNChyNikscjgKLQlkbGQudWIJCXI0KHI2KSxyOAotCWRsZC51aAkJcjQocjYpLHI4Ci0JZHN0LmIJCXI0KHI2KSxyOAotCWRzdC5oCQlyNChyNikscjgKLQlkc3QJCXI0KHI2KSxyOAotCWRzdC5kCQlyNChyNikscjgKLQlldHJhcAkJcjUKLQlleHRzCQlyMywzMSxyNSxyNgotCWV4dHUJCXIyLDMwLHI1LHI5Ci0JZmFkZC5zc3MJcjIscjQscjYKLQlmYWRkLnNzZAlyMixyNCxyNgotCWZhZGQuc2RkCXIyLHI0LHI2Ci0JZmFkZC5kc2QJcjIscjQscjYKLQlmYWRkLmRkZAlyMixyNCxyNgotCWZjbXAuc3MJCXI0LHI2LHI4Ci0JZmNtcC5zZAkJcjQscjYscjgKLQlmY21wLmRzCQlyNCxyNixyOAotCWZjbXAuZGQJCXI0LHI2LHI4Ci0JZmRpdi5zc3MJcjIscjQscjYKLQlmZGl2LnNzZAlyMixyNCxyNgotCWZkaXYuc2RkCXIyLHI0LHI2Ci0JZmRpdi5kc2QJcjIscjQscjYKLQlmZGl2LmRkZAlyMixyNCxyNgotCWZtcHkuc3NzCXIyLHI0LHI2Ci0JZm1weS5zc2QJcjIscjQscjYKLQlmbXB5LnNkZAlyMixyNCxyNgotCWZtcHkuZHNkCXIyLHI0LHI2Ci0JZm1weS5kZGQJcjIscjQscjYKLQlmbXB5LmlpaQlyMixyNCxyNgotCWZtcHkudXV1CXIyLHI0LHI2Ci0JZnJuZG0uc3MJcjQscjYKLQlmcm5kbS5zZAlyNCxyNgotCWZybmRtLnNpCXI0LHI2Ci0JZnJuZG0uc3UJcjQscjYKLQlmcm5kbS5kcwlyMixyOAotCWZybmRtLmRkCXIyLHI4Ci0JZnJuZG0uZGkJcjIscjgKLQlmcm5kbS5kdQlyMixyOAotCWZybmRtLmlzCXI0LHI2Ci0JZnJuZG0uaWQJcjQscjYKLQlmcm5kbS51cwlyMixyOAotCWZybmRtLnVkCXIyLHI4Ci0JZnJuZG4uc3MJcjQscjYKLQlmcm5kbi5zZAlyNCxyNgotCWZybmRuLnNpCXI0LHI2Ci0JZnJuZG4uc3UJcjQscjYKLQlmcm5kbi5kcwlyMixyOAotCWZybmRuLmRkCXIyLHI4Ci0JZnJuZG4uZGkJcjIscjgKLQlmcm5kbi5kdQlyMixyOAotCWZybmRuLmlzCXI0LHI2Ci0JZnJuZG4uaWQJcjQscjYKLQlmcm5kbi51cwlyMixyOAotCWZybmRuLnVkCXIyLHI4Ci0JZnJuZHAuc3MJcjQscjYKLQlmcm5kcC5zZAlyNCxyNgotCWZybmRwLnNpCXI0LHI2Ci0JZnJuZHAuc3UJcjQscjYKLQlmcm5kcC5kcwlyMixyOAotCWZybmRwLmRkCXIyLHI4Ci0JZnJuZHAuZGkJcjIscjgKLQlmcm5kcC5kdQlyMixyOAotCWZybmRwLmlzCXI0LHI2Ci0JZnJuZHAuaWQJcjQscjYKLQlmcm5kcC51cwlyMixyOAotCWZybmRwLnVkCXIyLHI4Ci0JZnJuZHouc3MJcjQscjYKLQlmcm5kei5zZAlyNCxyNgotCWZybmR6LnNpCXI0LHI2Ci0JZnJuZHouc3UJcjQscjYKLQlmcm5kei5kcwlyMixyOAotCWZybmR6LmRkCXIyLHI4Ci0JZnJuZHouZGkJcjIscjgKLQlmcm5kei5kdQlyMixyOAotCWZybmR6LmlzCXI0LHI2Ci0JZnJuZHouaWQJcjQscjYKLQlmcm5kei51cwlyMixyOAotCWZybmR6LnVkCXIyLHI4Ci0JZnNxcnQuc3MJcjYscjgKLQlmc3FydC5zZAlyNixyOAotCWZzcXJ0LmRkCXI2LHI4Ci0JZnN1Yi5zc3MJcjIscjQscjYKLQlmc3ViLnNzZAlyMixyNCxyNgotCWZzdWIuc2RkCXIyLHI0LHI2Ci0JZnN1Yi5kc2QJcjIscjQscjYKLQlmc3ViLmRkZAlyMixyNCxyNgotCWlucwkJcjQsMzEscjgscjEwCi0JanNyCQlyNChyNikscjgKLQlqc3IuYQkJcjQocjYpLHI4Ci0JbGQuYgkJcjQocjYpLHI4Ci0JbGQuaAkJcjQocjYpLHI4Ci0JbGQJCXI0KHI2KSxyOAotCWxkLmQJCXI0KHI2KSxyOAotCWxkLnViCQlyNChyNikscjgKLQlsZC51aAkJcjQocjYpLHI4Ci0JbG1vCQlyNyxyOAotCW9yCQlyMSxyMixyMwotCW9yLnR0CQlyMSxyMixyMwotCW9yLmZmCQlyMSxyMixyMwotCW9yLmZ0CQlyMSxyMixyMwotCW9yLnRmCQlyMSxyMixyMwotCXJkY3IJCXI2LHI0Ci0Jcm1vCQlyNCxyNQotCXJvdGwJCXIyLDMxLHI4LHIxMAotCXJvdHIJCXI4LDMxLHIyLHI2Ci0Jc2hsCQlyNCwzMSxyMixyNgotCXNsLmR6CQlyNCwxMixyNSxyNgotCXNsLmRtCQlyNCwxMixyNSxyNgotCXNsLmRzCQlyNCwxMixyNSxyNgotCXNsLmV6CQlyNCwxMixyNSxyNgotCXNsLmVtCQlyNCwxMixyNSxyNgotCXNsLmVzCQlyNCwxMixyNSxyNgotCXNsLml6CQlyNCwxMixyNSxyNgotCXNsLmltCQlyNCwxMixyNSxyNgotCXNsaS5kegkJcjQsMTIscjUscjYKLQlzbGkuZG0JCXI0LDEyLHI1LHI2Ci0Jc2xpLmRzCQlyNCwxMixyNSxyNgotCXNsaS5legkJcjQsMTIscjUscjYKLQlzbGkuZW0JCXI0LDEyLHI1LHI2Ci0Jc2xpLmVzCQlyNCwxMixyNSxyNgotCXNsaS5pegkJcjQsMTIscjUscjYKLQlzbGkuaW0JCXI0LDEyLHI1LHI2Ci0Jc3IuZHoJCXI0LDEyLHI1LHI2Ci0Jc3IuZG0JCXI0LDEyLHI1LHI2Ci0Jc3IuZHMJCXI0LDEyLHI1LHI2Ci0Jc3IuZXoJCXI0LDEyLHI1LHI2Ci0Jc3IuZW0JCXI0LDEyLHI1LHI2Ci0Jc3IuZXMJCXI0LDEyLHI1LHI2Ci0Jc3IuaXoJCXI0LDEyLHI1LHI2Ci0Jc3IuaW0JCXI0LDEyLHI1LHI2Ci0Jc3JhCQlyNCwzMixyNixyOAotCXNyaS5kegkJcjQsMTIscjUscjYKLQlzcmkuZG0JCXI0LDEyLHI1LHI2Ci0Jc3JpLmRzCQlyNCwxMixyNSxyNgotCXNyaS5legkJcjQsMTIscjUscjYKLQlzcmkuZW0JCXI0LDEyLHI1LHI2Ci0Jc3JpLmVzCQlyNCwxMixyNSxyNgotCXNyaS5pegkJcjQsMTIscjUscjYKLQlzcmkuaW0JCXI0LDEyLHI1LHI2Ci0Jc3JsCQlyNCwzMixyNixyOAotCXN0LmIJCXI0KHI2KSxyOAotCXN0LmgJCXI0KHI2KSxyOAotCXN0CQlyNChyNikscjgKLQlzdC5kCQlyNChyNikscjgKLQlzdWIJCXI3LHI4LHI5Ci0Jc3VidQkJcjcscjgscjkKLQlzd2NyCQlyOCxyNixyNAotCXRyYXAJCXIxMAotCXZhZGQuc3MJCXIyLHI0LHI0Ci0JdmFkZC5zZAkJcjIscjYscjYKLQl2YWRkLmRkCQlyMixyMTAscjEwCi07CXZsZDAucwkJcjYKLTsJdmxkMS5zCQlyNwotOwl2bGQwLmQJCXI2Ci07CXZsZDEuZAkJcjgKLTsJdm1hYy5zc3MJcjcscjksMCxhMwotOwl2bWFjLnNzcwlyNyxyOSwwLHIxMAotOwl2bWFjLnNzcwlyNyxyOSxhMSxhMwotOwl2bWFjLnNzcwlyNyxyOSxhMyxyMTAKLTsJdm1hYy5zc2QJcjcscjksMCxhMAotOwl2bWFjLnNzZAlyNyxyOSwwLHIxMAotOwl2bWFjLnNzZAlyNyxyOSxhMSxhMgotOwl2bWFjLnNzZAlyNyxyOSxhMyxyMTAKLTsJdm1weS5zcwkJcjEscjMscjMKLTsJdm1weS5zZAkJcjUscjYscjYKLTsJdm1weS5kZAkJcjIscjQscjQKLTsJdm1zYy5zc3MJcjcscjksMCxhMAotOwl2bXNjLnNzcwlyNyxyOSwwLHIxMAotOwl2bXNjLnNzcwlyNyxyOSxhMCxhMQotOwl2bXNjLnNzcwlyNyxyOSxhMyxyMTAKLTsJdm1zYy5zc2QJcjcscjksMCxhMAotOwl2bXNjLnNzZAlyNyxyOSwwLHIxMAotOwl2bXNjLnNzZAlyNyxyOSxhMCxhMQotOwl2bXNjLnNzZAlyNyxyOSxhMyxyMTAKLTsJdm1zdWIuc3MJcjYsYTIsYTQKLTsJdm1zdWIuc2QJcjYsYTIsYTQKLTsJdm1zdWIuc3MJcjQsYTQscjYKLTsJdm1zdWIuc2QJcjQsYTQscjYKLTsJdnJuZC5zaQkJcjQscjYKLTsJdnJuZC5zaQkJcjQsYTAKLTsJdnJuZC5zdQkJcjQscjYKLTsJdnJuZC5zdQkJcjQsYTAKLTsJdnJuZC5zcwkJcjQscjYKLTsJdnJuZC5zcwkJcjQsYTAKLTsJdnJuZC5zZAkJcjQscjYKLTsJdnJuZC5zZAkJcjQsYTAKLTsJdnJuZC5kaQkJcjQscjYKLTsJdnJuZC5kaQkJcjQsYTAKLTsJdnJuZC5kdQkJcjQscjYKLTsJdnJuZC5kdQkJcjQsYTAKLTsJdnJuZC5kcwkJcjQscjYKLTsJdnJuZC5kcwkJcjQsYTAKLTsJdnJuZC5kZAkJcjQscjYKLTsJdnJuZC5kZAkJcjQsYTAKLTsJdnJuZC5pcwkJcjQscjYKLTsJdnJuZC5pZAkJcjQscjYKLTsJdnJuZC51cwkJcjQscjYKLTsJdnJuZC51ZAkJcjQscjYKLTsJdnN0LnMJCXI2Ci07CXZzdC5kCQlyNgotOwl2c3ViLnNzCQlyMixyNCxyNgotOwl2c3ViLnNkCQlyMixyNCxyNgotOwl2c3ViLmRkCQlyMixyNCxyNgotCXdyY3IJCXI2LHI1Ci0JeG5vcgkJcjUscjYscjcKLQl4b3IJCXI3LHI4LHI5CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiN2Y0YTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5kCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgcmVnaXN0ZXIgb3BlcmFuZHMgd2l0aCA6bSBtb2RpZmllcgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMDggODAgYjcgMDIuKgotICAgNDoJMDQgMDAgOWUgMDIuKgotICAgODoJZmMgN2YgOWUgMDIuKgotICAgYzoJMDAgOTAgYjcgMDIgNzggNTYgMzQgMTIuKgotICAxNDoJMDAgOTAgYjcgMDIgZWYgYmUgYWQgZGUuKgotICAxYzoJMDggODAgYjcgMGEuKgotICAyMDoJMDQgMDAgOWUgMGEuKgotICAyNDoJZmMgN2YgOWUgMGEuKgotICAyODoJMDAgOTAgYjcgMGEgNzggNTYgMzQgMTIuKgotICAzMDoJMDAgOTAgYjcgMGEgZWYgYmUgYWQgZGUuKgotICAzODoJMDQgODQgYjQgNDEuKgotICAzYzoJMDQgYTQgYjQgNDEuKgotICA0MDoJMDQgYzQgYjQgNDEuKgotICA0NDoJMDQgZTQgYjQgNDEuKgotICA0ODoJMDAgOTQgYjQgNDEgMDAgMDAgMDAgZTAuKgotICA1MDoJMDAgYjQgYjQgNDEgMDAgMDAgMDAgZTAuKgotICA1ODoJMDAgZDQgYjQgNDEgMDAgMDAgMDAgZTAuKgotICA2MDoJMDAgZjQgYjQgNDEgMDAgMDAgMDAgZTAuKgotICA2ODoJMDQgODQgYjUgNDEuKgotICA2YzoJMDQgYTQgYjUgNDEuKgotICA3MDoJMDAgOTQgYjUgNDEgMDAgMDAgMDAgZTAuKgotICA3ODoJMDAgYjQgYjUgNDEgMDAgMDAgMDAgZTAuKgotICA4MDoJMDQgODQgYjYgNDEuKgotICA4NDoJMDQgYTQgYjYgNDEuKgotICA4ODoJMDQgYzQgYjYgNDEuKgotICA4YzoJMDQgZTQgYjYgNDEuKgotICA5MDoJMDAgOTQgYjYgNDEgMDAgMDAgMDAgZTAuKgotICA5ODoJMDAgYjQgYjYgNDEgMDAgMDAgMDAgZTAuKgotICBhMDoJMDAgZDQgYjYgNDEgMDAgMDAgMDAgZTAuKgotICBhODoJMDAgZjQgYjYgNDEgMDAgMDAgMDAgZTAuKgotICBiMDoJMDQgODAgYjQgNDEuKgotICBiNDoJMDQgYTAgYjQgNDEuKgotICBiODoJMDQgYzAgYjQgNDEuKgotICBiYzoJMDQgZTAgYjQgNDEuKgotICBjMDoJZjAgN2YgOTIgNDEuKgotICBjNDoJZjAgZmYgOTIgNDEuKgotICBjODoJZjAgN2YgOTMgNDEuKgotICBjYzoJZjAgZmYgOTMgNDEuKgotICBkMDoJMDAgOTAgYjQgNDEgMDAgMDAgMDAgZTAuKgotICBkODoJMDAgYjAgYjQgNDEgMDAgMDAgMDAgZTAuKgotICBlMDoJMDAgZDAgYjQgNDEgMDAgMDAgMDAgZTAuKgotICBlODoJMDAgZjAgYjQgNDEgMDAgMDAgMDAgZTAuKgotICBmMDoJMDQgODAgYjUgNDEuKgotICBmNDoJMDQgYTAgYjUgNDEuKgotICBmODoJZjAgN2YgOTYgNDEuKgotICBmYzoJZjAgZmYgOTYgNDEuKgotIDEwMDoJMDAgOTAgYjUgNDEgMDAgMDAgMDAgZTAuKgotIDEwODoJMDAgYjAgYjUgNDEgMDAgMDAgMDAgZTAuKgotIDExMDoJMDQgODAgYjYgNDEuKgotIDExNDoJMDQgYTAgYjYgNDEuKgotIDExODoJMDQgYzAgYjYgNDEuKgotIDExYzoJMDQgZTAgYjYgNDEuKgotIDEyMDoJMDAgN2YgOWEgNDEuKgotIDEyNDoJMDAgZmYgOWEgNDEuKgotIDEyODoJMDAgN2YgOWIgNDEuKgotIDEyYzoJMDAgZmYgOWIgNDEuKgotIDEzMDoJMDAgOTAgYjYgNDEgMDAgMDAgMDAgZTAuKgotIDEzODoJMDAgYjAgYjYgNDEgMDAgMDAgMDAgZTAuKgotIDE0MDoJMDAgZDAgYjYgNDEgMDAgMDAgMDAgZTAuKgotIDE0ODoJMDAgZjAgYjYgNDEgMDAgMDAgMDAgZTAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxZmI5Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAxNDozMjoxNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wczIucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgMDAwMDAwMDAgICAwMkI3ODAwOCAgICAgICAgIGRjYWNoZWMgcjgocjEwOm0pICAgICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtIChtb2RpZmllZCkKLSAgICAgICAgMiAwMDAwMDAwNCAgIDAyOUUwMDA0ICAgICAgICAgZGNhY2hlYyA0KHIxMDptKSAgICAgICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgMyAwMDAwMDAwOCAgIDAyOUU3RkZDICAgICAgICAgZGNhY2hlYyAtNChyMTA6bSkgICAgICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgNCAwMDAwMDAwQyAgIDAyQjc5MDAwICAgICAgICAgZGNhY2hlYyAweDEyMzQ1Njc4KHIxMDptKSAgICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotICAgICAgICAgIDAwMDAwMDEwICAgMTIzNDU2NzggCi0gICAgICAgIDUgMDAwMDAwMTQgICAwMkI3OTAwMCAgICAgICAgIGRjYWNoZWMgMHhERUFEQkVFRihyMTA6bSkgICAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgICAwMDAwMDAxOCAgIERFQURCRUVGIAotICAgICAgICA2IDAwMDAwMDFDICAgMEFCNzgwMDggICAgICAgICBkY2FjaGVmIHI4KHIxMDptKSAgICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybSAobW9kaWZpZWQpCi0gICAgICAgIDcgMDAwMDAwMjAgICAwQTlFMDAwNCAgICAgICAgIGRjYWNoZWYgNChyMTA6bSkgICAgICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAocG9zaXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0gICAgICAgIDggMDAwMDAwMjQgICAwQTlFN0ZGQyAgICAgICAgIGRjYWNoZWYgLTQocjEwOm0pICAgICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0gICAgICAgIDkgMDAwMDAwMjggICAwQUI3OTAwMCAgICAgICAgIGRjYWNoZWYgMHgxMjM0NTY3OChyMTA6bSkgICAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgICAwMDAwMDAyQyAgIDEyMzQ1Njc4IAotICAgICAgIDEwIDAwMDAwMDMwICAgMEFCNzkwMDAgICAgICAgICBkY2FjaGVmIDB4REVBREJFRUYocjEwOm0pICAgICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0gICAgICAgICAgMDAwMDAwMzQgICBERUFEQkVFRiAKLSAgICAgICAxMSAwMDAwMDAzOCAgIDQxQjQ4NDA0ICAgICAgICAgZGxkLmIgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMiAwMDAwMDAzQyAgIDQxQjRBNDA0ICAgICAgICAgZGxkLmggICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMyAwMDAwMDA0MCAgIDQxQjRDNDA0ICAgICAgICAgZGxkICAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNCAwMDAwMDA0NCAgIDQxQjRFNDA0ICAgICAgICAgZGxkLmQgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNSAwMDAwMDA0OCAgIDQxQjQ5NDAwICAgICAgICAgZGxkLmIgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDA0QyAgIEUwMDAwMDAwIAotICAgICAgIDE2IDAwMDAwMDUwICAgNDFCNEI0MDAgICAgICAgICBkbGQuaCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDU0ICAgRTAwMDAwMDAgCi0gICAgICAgMTcgMDAwMDAwNTggICA0MUI0RDQwMCAgICAgICAgIGRsZCAgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNUMgICBFMDAwMDAwMCAKLSAgICAgICAxOCAwMDAwMDA2MCAgIDQxQjRGNDAwICAgICAgICAgZGxkLmQgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDA2NCAgIEUwMDAwMDAwIAotICAgICAgIDE5IDAwMDAwMDY4ICAgNDFCNTg0MDQgICAgICAgICBkbGQudWIgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDIwIDAwMDAwMDZDICAgNDFCNUE0MDQgICAgICAgICBkbGQudWggIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDIxIDAwMDAwMDcwICAgNDFCNTk0MDAgICAgICAgICBkbGQudWIgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDc0ICAgRTAwMDAwMDAgCi0gICAgICAgMjIgMDAwMDAwNzggICA0MUI1QjQwMCAgICAgICAgIGRsZC51aCAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwN0MgICBFMDAwMDAwMCAKLSAgICAgICAyMyAwMDAwMDA4MCAgIDQxQjY4NDA0ICAgICAgICAgZHN0LmIgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyNCAwMDAwMDA4NCAgIDQxQjZBNDA0ICAgICAgICAgZHN0LmggICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyNSAwMDAwMDA4OCAgIDQxQjZDNDA0ICAgICAgICAgZHN0ICAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyNiAwMDAwMDA4QyAgIDQxQjZFNDA0ICAgICAgICAgZHN0LmQgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyNyAwMDAwMDA5MCAgIDQxQjY5NDAwICAgICAgICAgZHN0LmIgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDA5NCAgIEUwMDAwMDAwIAotICAgICAgIDI4IDAwMDAwMDk4ICAgNDFCNkI0MDAgICAgICAgICBkc3QuaCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDlDICAgRTAwMDAwMDAgCi0gICAgICAgMjkgMDAwMDAwQTAgICA0MUI2RDQwMCAgICAgICAgIGRzdCAgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQTQgICBFMDAwMDAwMCAKLSAgICAgICAzMCAwMDAwMDBBOCAgIDQxQjZGNDAwICAgICAgICAgZHN0LmQgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBBQyAgIEUwMDAwMDAwIAotICAgICAgIDMxIDAwMDAwMEIwICAgNDFCNDgwMDQgICAgICAgICBsZC5iICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDMyIDAwMDAwMEI0ICAgNDFCNEEwMDQgICAgICAgICBsZC5oICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDMzIDAwMDAwMEI4ICAgNDFCNEMwMDQgICAgICAgICBsZCAgICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDM0IDAwMDAwMEJDICAgNDFCNEUwMDQgICAgICAgICBsZC5kICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDM1IDAwMDAwMEMwICAgNDE5MjdGRjAgICAgICAgICBsZC5iICAgIC0xNihyNjptKSxyOCAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAzNiAwMDAwMDBDNCAgIDQxOTJGRkYwICAgICAgICAgbGQuaCAgICAtMTYocjY6bSkscjggICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgMzcgMDAwMDAwQzggICA0MTkzN0ZGMCAgICAgICAgIGxkICAgICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDM4IDAwMDAwMENDICAgNDE5M0ZGRjAgICAgICAgICBsZC5kICAgIC0xNihyNjptKSxyOCAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAzOSAwMDAwMDBEMCAgIDQxQjQ5MDAwICAgICAgICAgbGQuYiAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBENCAgIEUwMDAwMDAwIAotICAgICAgIDQwIDAwMDAwMEQ4ICAgNDFCNEIwMDAgICAgICAgICBsZC5oICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAxNDozMjoxNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wczIucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgotCi0gICAgICAgICAgMDAwMDAwREMgICBFMDAwMDAwMCAKLSAgICAgICA0MSAwMDAwMDBFMCAgIDQxQjREMDAwICAgICAgICAgbGQgICAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBFNCAgIEUwMDAwMDAwIAotICAgICAgIDQyIDAwMDAwMEU4ICAgNDFCNEYwMDAgICAgICAgICBsZC5kICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEVDICAgRTAwMDAwMDAgCi0gICAgICAgNDMgMDAwMDAwRjAgICA0MUI1ODAwNCAgICAgICAgIGxkLnViICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNDQgMDAwMDAwRjQgICA0MUI1QTAwNCAgICAgICAgIGxkLnVoICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNDUgMDAwMDAwRjggICA0MTk2N0ZGMCAgICAgICAgIGxkLnViICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDQ2IDAwMDAwMEZDICAgNDE5NkZGRjAgICAgICAgICBsZC51aCAgIC0xNihyNjptKSxyOCAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICA0NyAwMDAwMDEwMCAgIDQxQjU5MDAwICAgICAgICAgbGQudWIgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDEwNCAgIEUwMDAwMDAwIAotICAgICAgIDQ4IDAwMDAwMTA4ICAgNDFCNUIwMDAgICAgICAgICBsZC51aCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMTBDICAgRTAwMDAwMDAgCi0gICAgICAgNDkgMDAwMDAxMTAgICA0MUI2ODAwNCAgICAgICAgIHN0LmIgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNTAgMDAwMDAxMTQgICA0MUI2QTAwNCAgICAgICAgIHN0LmggICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNTEgMDAwMDAxMTggICA0MUI2QzAwNCAgICAgICAgIHN0ICAgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNTIgMDAwMDAxMUMgICA0MUI2RTAwNCAgICAgICAgIHN0LmQgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgNTMgMDAwMDAxMjAgICA0MTlBN0YwMCAgICAgICAgIHN0LmIgICAgLTI1NihyNjptKSxyOCAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDU0IDAwMDAwMTI0ICAgNDE5QUZGMDAgICAgICAgICBzdC5oICAgIC0yNTYocjY6bSkscjggICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICA1NSAwMDAwMDEyOCAgIDQxOUI3RjAwICAgICAgICAgc3QgICAgICAtMjU2KHI2Om0pLHI4ICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgNTYgMDAwMDAxMkMgICA0MTlCRkYwMCAgICAgICAgIHN0LmQgICAgLTI1NihyNjptKSxyOCAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDU3IDAwMDAwMTMwICAgNDFCNjkwMDAgICAgICAgICBzdC5iICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMTM0ICAgRTAwMDAwMDAgCi0gICAgICAgNTggMDAwMDAxMzggICA0MUI2QjAwMCAgICAgICAgIHN0LmggICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAxM0MgICBFMDAwMDAwMCAKLSAgICAgICA1OSAwMDAwMDE0MCAgIDQxQjZEMDAwICAgICAgICAgc3QgICAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDE0NCAgIEUwMDAwMDAwIAotICAgICAgIDYwIDAwMDAwMTQ4ICAgNDFCNkYwMDAgICAgICAgICBzdC5kICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMTRDICAgRTAwMDAwMDAgCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc1NWIzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczIucworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLQlkY2FjaGVjCXI4KHIxMDptKQkJOyBSZWdpc3RlciBmb3JtIChtb2RpZmllZCkKLQlkY2FjaGVjCTQocjEwOm0pCQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkY2FjaGVjCS00KHIxMDptKQkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0JZGNhY2hlYwkweDEyMzQ1Njc4KHIxMDptKQk7IExvbmcgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRjYWNoZWMJMHhERUFEQkVFRihyMTA6bSkJOyBMb25nIEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkY2FjaGVmCXI4KHIxMDptKQkJOyBSZWdpc3RlciBmb3JtIChtb2RpZmllZCkKLQlkY2FjaGVmCTQocjEwOm0pCQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkY2FjaGVmCS00KHIxMDptKQkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0JZGNhY2hlZgkweDEyMzQ1Njc4KHIxMDptKQk7IExvbmcgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRjYWNoZWYJMHhERUFEQkVFRihyMTA6bSkJOyBMb25nIEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkbGQuYglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLmgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLmQJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC5iCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JZGxkLmgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkbGQJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkbGQuZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRsZC51YglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLnVoCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQudWIJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkbGQudWgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkc3QuYglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmQJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdC5iCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JZHN0LmgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkc3QJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkc3QuZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWxkLmIJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5kCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5iCS0xNihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotCWxkLmgJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQuZAktMTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlsZC5iCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JbGQuaAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWxkCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JbGQuZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWxkLnViCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC51aAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQudWIJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQudWgJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQudWIJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlsZC51aAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCXN0LmIJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0CXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5kCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5iCS0yNTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlzdC5oCS0yNTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlzdAktMjU2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0Jc3QuZAktMjU2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0Jc3QuYgkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCXN0LmgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlzdAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCXN0LmQJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJhMzAxMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCByZWdpc3RlciBvcGVyYW5kcyB3aXRoIDpzIG1vZGlmaWVyCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwNCAwYyBiNCA0MS4qCi0gICA0OgkwNCAyYyBiNCA0MS4qCi0gICA4OgkwNCA0YyBiNCA0MS4qCi0gICBjOgkwNCA2YyBiNCA0MS4qCi0gIDEwOgkwNCAwYyBiNSA0MS4qCi0gIDE0OgkwNCAyYyBiNSA0MS4qCi0gIDE4OgkwNCAwYyBiNiA0MS4qCi0gIDFjOgkwNCAyYyBiNiA0MS4qCi0gIDIwOgkwNCA0YyBiNiA0MS4qCi0gIDI0OgkwNCA2YyBiNiA0MS4qCi0gIDI4OgkwNCAwOCBiNCA0MS4qCi0gIDJjOgkwNCAyOCBiNCA0MS4qCi0gIDMwOgkwNCA0OCBiNCA0MS4qCi0gIDM0OgkwNCA2OCBiNCA0MS4qCi0gIDM4OgkwNCAwOCBiNSA0MS4qCi0gIDNjOgkwNCAyOCBiNSA0MS4qCi0gIDQwOgkwNCAwOCBiNiA0MS4qCi0gIDQ0OgkwNCAyOCBiNiA0MS4qCi0gIDQ4OgkwNCA0OCBiNiA0MS4qCi0gIDRjOgkwNCA2OCBiNiA0MS4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjU4MDNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMubHN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDE0OjMyOjE5IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzMy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAwMDAwMDAwMCAgIDQxQjQwQzA0ICAgICAgICAgZGxkLmIgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgMiAwMDAwMDAwNCAgIDQxQjQyQzA0ICAgICAgICAgZGxkLmggICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgMyAwMDAwMDAwOCAgIDQxQjQ0QzA0ICAgICAgICAgZGxkICAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNCAwMDAwMDAwQyAgIDQxQjQ2QzA0ICAgICAgICAgZGxkLmQgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNSAwMDAwMDAxMCAgIDQxQjUwQzA0ICAgICAgICAgZGxkLnViICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNiAwMDAwMDAxNCAgIDQxQjUyQzA0ICAgICAgICAgZGxkLnVoICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgNyAwMDAwMDAxOCAgIDQxQjYwQzA0ICAgICAgICAgZHN0LmIgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgOCAwMDAwMDAxQyAgIDQxQjYyQzA0ICAgICAgICAgZHN0LmggICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAgOSAwMDAwMDAyMCAgIDQxQjY0QzA0ICAgICAgICAgZHN0ICAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMCAwMDAwMDAyNCAgIDQxQjY2QzA0ICAgICAgICAgZHN0LmQgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMSAwMDAwMDAyOCAgIDQxQjQwODA0ICAgICAgICAgbGQuYiAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMiAwMDAwMDAyQyAgIDQxQjQyODA0ICAgICAgICAgbGQuaCAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxMyAwMDAwMDAzMCAgIDQxQjQ0ODA0ICAgICAgICAgbGQgICAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNCAwMDAwMDAzNCAgIDQxQjQ2ODA0ICAgICAgICAgbGQuZCAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNSAwMDAwMDAzOCAgIDQxQjUwODA0ICAgICAgICAgbGQudWIgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNiAwMDAwMDAzQyAgIDQxQjUyODA0ICAgICAgICAgbGQudWggICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNyAwMDAwMDA0MCAgIDQxQjYwODA0ICAgICAgICAgc3QuYiAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxOCAwMDAwMDA0NCAgIDQxQjYyODA0ICAgICAgICAgc3QuaCAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxOSAwMDAwMDA0OCAgIDQxQjY0ODA0ICAgICAgICAgc3QgICAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAyMCAwMDAwMDA0QyAgIDQxQjY2ODA0ICAgICAgICAgc3QuZCAgICByNDpzKHI2KSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDg3ZDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCWRsZC5iCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQuaAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQuZAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLnViCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQudWgJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdC5iCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuaAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0CXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuZAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuYglyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuaAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmQJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLnViCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC51aAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuYglyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuaAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmQJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzYwN2M5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQuZAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHJlZ2lzdGVyIG9wZXJhbmRzIHdpdGggYm90aCA6bSBhbmQgOnMgbW9kaWZpZXIKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTA0IDhjIGI0IDQxLioKLSAgIDQ6CTA0IGFjIGI0IDQxLioKLSAgIDg6CTA0IGNjIGI0IDQxLioKLSAgIGM6CTA0IGVjIGI0IDQxLioKLSAgMTA6CTA0IDhjIGI1IDQxLioKLSAgMTQ6CTA0IGFjIGI1IDQxLioKLSAgMTg6CTA0IDhjIGI2IDQxLioKLSAgMWM6CTA0IGFjIGI2IDQxLioKLSAgMjA6CTA0IGNjIGI2IDQxLioKLSAgMjQ6CTA0IGVjIGI2IDQxLioKLSAgMjg6CTA0IDg4IGI0IDQxLioKLSAgMmM6CTA0IGE4IGI0IDQxLioKLSAgMzA6CTA0IGM4IGI0IDQxLioKLSAgMzQ6CTA0IGU4IGI0IDQxLioKLSAgMzg6CTA0IDg4IGI1IDQxLioKLSAgM2M6CTA0IGE4IGI1IDQxLioKLSAgNDA6CTA0IDg4IGI2IDQxLioKLSAgNDQ6CTA0IGE4IGI2IDQxLioKLSAgNDg6CTA0IGM4IGI2IDQxLioKLSAgNGM6CTA0IGU4IGI2IDQxLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjNjOWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFdlZCBGZWIgMjYgMTQ6MzI6MjUgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWdvcHM0LnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxIDAwMDAwMDAwICAgNDFCNDhDMDQgICAgICAgICBkbGQuYiAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICAyIDAwMDAwMDA0ICAgNDFCNEFDMDQgICAgICAgICBkbGQuaCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICAzIDAwMDAwMDA4ICAgNDFCNENDMDQgICAgICAgICBkbGQgICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA0IDAwMDAwMDBDICAgNDFCNEVDMDQgICAgICAgICBkbGQuZCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA1IDAwMDAwMDEwICAgNDFCNThDMDQgICAgICAgICBkbGQudWIgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA2IDAwMDAwMDE0ICAgNDFCNUFDMDQgICAgICAgICBkbGQudWggIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA3IDAwMDAwMDE4ICAgNDFCNjhDMDQgICAgICAgICBkc3QuYiAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA4IDAwMDAwMDFDICAgNDFCNkFDMDQgICAgICAgICBkc3QuaCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA5IDAwMDAwMDIwICAgNDFCNkNDMDQgICAgICAgICBkc3QgICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEwIDAwMDAwMDI0ICAgNDFCNkVDMDQgICAgICAgICBkc3QuZCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDExIDAwMDAwMDI4ICAgNDFCNDg4MDQgICAgICAgICBsZC5iICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEyIDAwMDAwMDJDICAgNDFCNEE4MDQgICAgICAgICBsZC5oICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEzIDAwMDAwMDMwICAgNDFCNEM4MDQgICAgICAgICBsZCAgICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE0IDAwMDAwMDM0ICAgNDFCNEU4MDQgICAgICAgICBsZC5kICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE1IDAwMDAwMDM4ICAgNDFCNTg4MDQgICAgICAgICBsZC51YiAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE2IDAwMDAwMDNDICAgNDFCNUE4MDQgICAgICAgICBsZC51aCAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE3IDAwMDAwMDQwICAgNDFCNjg4MDQgICAgICAgICBzdC5iICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE4IDAwMDAwMDQ0ICAgNDFCNkE4MDQgICAgICAgICBzdC5oICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE5IDAwMDAwMDQ4ICAgNDFCNkM4MDQgICAgICAgICBzdCAgICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDIwIDAwMDAwMDRDICAgNDFCNkU4MDQgICAgICAgICBzdC5kICAgIHI0OnMocjY6bSkscjggICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhNzdlOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHM0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JZGxkLmIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLmgJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC5kCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC51YglyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQudWgJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmgJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0CXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdC5kCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuaAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5kCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLnViCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLnVoCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuaAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5kCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5jIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWYwNGIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLWV4dGVybiBpbnQgeGZ1bmMgKGludCB5KTsKLQotc3RhdGljIGludCBzZnVuYyAoaW50IHkpCi17Ci0gIHhmdW5jICh5KTsKLX0KLQotaW50IGdmdW5jIChpbnQgeSkKLXsKLSAgc2Z1bmMgKHkpOwotfQotCi1pbnQgYnJhbmNoZXMgKGludCB5KQotewotICBpbnQgejsKLQotICBmb3IgKHogPSB5OyB6IDwgeSArIDEwOyB6KyspCi0gICAgewotICAgICAgaWYgKHogJiAweDEpCi0JewotCSAgZ2Z1bmMgKHopOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB4ZnVuYyAoeik7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjYTZjOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLmQKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCBzaW1wbGUgcmVsb2NzLCBnbG9iYWwvbG9jYWwgZnVuY3MgJiBicmFuY2hlcyAoY29kZSkKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPF9zZnVuYz46Ci0gICAwOglmMCBmZiA2YyAwOC4qCi0gICA0OgkwYyAwMCA1OSBmOC4qCi0gICA4OgkwMCAwMCA1OSAxMC4qCi0gICBjOgkwMCA5MCAzOCBmOCAwMCAwMCAwMCAwMC4qCi0gIDE0OgkwMCAwMCA1MSAxMC4qCi0gIDE4OgkwYyAwMCA1MSBmOC4qCi0gIDFjOgkxZiA4MCAzOCAwMC4qCi0gIDIwOgkxMCA4MCA2YyAwOC4qCi0KLTAwMDAwMDI0IDxfZ2Z1bmM+OgotICAyNDoJZjAgZmYgNmMgMDguKgotICAyODoJMGMgMDAgNTkgZjguKgotICAyYzoJMDAgMDAgNTkgMTAuKgotICAzMDoJMDAgOTAgMzggZjggMDAgMDAgMDAgMDAuKgotICAzODoJMDAgMDAgNTEgMTAuKgotICAzYzoJMGMgMDAgNTEgZjguKgotICA0MDoJMWYgODAgMzggMDAuKgotICA0NDoJMTAgODAgNmMgMDguKgotCi0wMDAwMDA0OCA8X2JyYW5jaGVzPjoKLSAgNDg6CWYwIGZmIDZjIDA4LioKLSAgNGM6CTBjIDAwIDU5IGY4LioKLSAgNTA6CTAwIDAwIDU5IDEwLioKLSAgNTQ6CTAwIDAwIDUxIDEwLioKLSAgNTg6CTA0IDAwIDU5IDEwLioKLSAgNWM6CTAwIDAwIDUxIDEwLioKLSAgNjA6CTA0IDAwIDUxIDE4LioKLSAgNjQ6CTBhIDgwIGFjIDEwLioKLSAgNjg6CTAzIDAwIGJhIDEwLioKLSAgNmM6CTEyIDgwIGE1IDMwLioKLSAgNzA6CTA0IDAwIDUxIDEwLioKLSAgNzQ6CTA1IDgwIGE0IGY4LioKLSAgNzg6CTAwIDkwIDM4IGY4IDI0IDAwIDAwIDAwLioKLSAgODA6CTA0IDAwIDUxIDEwLioKLSAgODQ6CTA0IDgwIDI0IDAwLioKLSAgODg6CTAwIDkwIDM4IGY4IDAwIDAwIDAwIDAwLioKLSAgOTA6CTA0IDAwIDUxIDEwLioKLSAgOTQ6CTA0IDAwIDUxIDEwLioKLSAgOTg6CTAxIDgwIGFjIDEwLioKLSAgOWM6CTA0IDAwIDU5IDEwLioKLSAgYTA6CTAwIDAwIDUxIDE4LioKLSAgYTQ6CTA0IDAwIDUxIDEwLioKLSAgYTg6CTBhIDgwIGVjIDE4LioKLSAgYWM6CTAyIDAwIGZhIDEwLioKLSAgYjA6CWYwIGZmIGE1IDM4LioKLSAgYjQ6CTBjIDAwIDUxIGY4LioKLSAgYjg6CTFmIDgwIDM4IDAwLioKLSAgYmM6CTEwIDgwIDZjIDA4LioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYWViMWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFNhdCBGZWIgMjIgMTM6MTk6MjggMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWxvY3MxLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBpcyB0aGUgaGFuZCBoYWNrZWQgb3V0cHV0IG9mIHRoZSBUSSBDIGNvbXBpbGVyIGZvciBhIHNpbXBsZQotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgdGVzdCBwcm9ncmFtIHRoYXQgY29udGFpbnMgbG9jYWwvZ2xvYmFsIGZ1bmN0aW9ucywgbG9jYWwvZ2xvYmFsCi0gICAgICAgIDMgICAgICAgICAgICAgICAgICAgICA7OyBmdW5jdGlvbiBjYWxscywgYW5kIGFuICJpZiIgYW5kICJmb3IiIHN0YXRlbWVudC4KLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94ZnVuYwotICAgICAgICA2ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDcgMDAwMDAwMDAgICAgICAgICAgICBfc2Z1bmM6Ci0gICAgICAgIDggMDAwMDAwMDAgICAwODZDRkZGMCAgICAgICAgICBhZGR1ICAgICAgLTE2LHIxLHIxCi0gICAgICAgIDkgMDAwMDAwMDQgICBGODU5MDAwQyAgICAgICAgICBzdCAgICAgICAgMTIocjEpLHIzMQotICAgICAgIDEwIDAwMDAwMDA4ICAgMTA1OTAwMDAgICAgICAgICAgc3QgICAgICAgIDAocjEpLHIyCi0gICAgICAgMTEgMDAwMDAwMEMgICBGODM4OTAwMCAgICAgICAgICBqc3IgICAgICAgX3hmdW5jKHIwKSxyMzEKLSAgICAgICAgICAwMDAwMDAxMCAgIDAwMDAwMDAwIAotICAgICAgIDEyIDAwMDAwMDE0ICAgMTA1MTAwMDAgICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCi0gICAgICAgMTMgMDAwMDAwMTggICBGODUxMDAwQyAgICAgICAgICBsZCAgICAgICAgMTIocjEpLHIzMQotICAgICAgIDE0IDAwMDAwMDFDICAgMDAzODgwMUYgICAgICAgICAganNyICAgICAgIHIzMShyMCkscjAKLSAgICAgICAxNSAwMDAwMDAyMCAgIDA4NkM4MDEwICAgICAgICAgIGFkZHUgICAgICAxNixyMSxyMQotICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dmdW5jCi0gICAgICAgMTggICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxOSAwMDAwMDAyNCAgICAgICAgICAgIF9nZnVuYzoKLSAgICAgICAyMCAwMDAwMDAyNCAgIDA4NkNGRkYwICAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKLSAgICAgICAyMSAwMDAwMDAyOCAgIEY4NTkwMDBDICAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCi0gICAgICAgMjIgMDAwMDAwMkMgICAxMDU5MDAwMCAgICAgICAgICBzdCAgICAgICAgMChyMSkscjIKLSAgICAgICAyMyAwMDAwMDAzMCAgIEY4Mzg5MDAwICAgICAgICAgIGpzciAgICAgICBfc2Z1bmMocjApLHIzMQotICAgICAgICAgIDAwMDAwMDM0ICAgMDAwMDAwMDAgCi0gICAgICAgMjQgMDAwMDAwMzggICAxMDUxMDAwMCAgICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAyNSAwMDAwMDAzQyAgIEY4NTEwMDBDICAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgMjYgMDAwMDAwNDAgICAwMDM4ODAxRiAgICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgIDI3IDAwMDAwMDQ0ICAgMDg2QzgwMTAgICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCi0gICAgICAgMjggICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAyOSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9icmFuY2hlcwotICAgICAgIDMxICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMzIgMDAwMDAwNDggICAgICAgICAgICBfYnJhbmNoZXM6Ci0gICAgICAgMzMgMDAwMDAwNDggICAwODZDRkZGMCAgICAgICAgICBhZGR1ICAgICAgLTE2LHIxLHIxCi0gICAgICAgMzQgMDAwMDAwNEMgICBGODU5MDAwQyAgICAgICAgICBzdCAgICAgICAgMTIocjEpLHIzMQotICAgICAgIDM1IDAwMDAwMDUwICAgMTA1OTAwMDAgICAgICAgICAgc3QgICAgICAgIDAocjEpLHIyCi0gICAgICAgMzYgMDAwMDAwNTQgICAxMDUxMDAwMCAgICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAzNyAwMDAwMDA1OCAgIDEwNTkwMDA0ICAgICAgICAgIHN0ICAgICAgICA0KHIxKSxyMgotICAgICAgIDM4IDAwMDAwMDVDICAgMTA1MTAwMDAgICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCi0gICAgICAgMzkgMDAwMDAwNjAgICAxODUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjMKLSAgICAgICA0MCAwMDAwMDA2NCAgIDEwQUM4MDBBICAgICAgICAgIGFkZHUgICAgICAxMCxyMixyMgotICAgICAgIDQxIDAwMDAwMDY4ICAgMTBCQTAwMDMgICAgICAgICAgY21wICAgICAgIHIzLHIyLHIyCi0gICAgICAgNDIgMDAwMDAwNkMgICAzMEE1ODAxMiAgICAgICAgICBiYm8uYSAgICAgTDEyLHIyLGdlLncKLSAgICAgICA0MyAwMDAwMDA3MCAgICAgICAgICAgIEw4OgotICAgICAgIDQ0IDAwMDAwMDcwICAgMTA1MTAwMDQgICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi0gICAgICAgNDUgMDAwMDAwNzQgICBGOEE0ODAwNSAgICAgICAgICBiYnouYSAgICAgTDEwLHIyLDAKLSAgICAgICA0NiAwMDAwMDA3OCAgIEY4Mzg5MDAwICAgICAgICAgIGpzciAgICAgICBfZ2Z1bmMocjApLHIzMQotICAgICAgICAgIDAwMDAwMDdDICAgMDAwMDAwMjQgCi0gICAgICAgNDcgMDAwMDAwODAgICAxMDUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICA0OCAwMDAwMDA4NCAgIDAwMjQ4MDA0ICAgICAgICAgIGJyLmEgICAgICBMMTEKLSAgICAgICA0OSAwMDAwMDA4OCAgICAgICAgICAgIEwxMDoKLSAgICAgICA1MCAwMDAwMDA4OCAgIEY4Mzg5MDAwICAgICAgICAgIGpzciAgICAgICBfeGZ1bmMocjApLHIzMQotICAgICAgICAgIDAwMDAwMDhDICAgMDAwMDAwMDAgCi0gICAgICAgNTEgMDAwMDAwOTAgICAxMDUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFNhdCBGZWIgMjIgMTM6MTk6MjggMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWxvY3MxLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDIKLQotICAgICAgIDUyIDAwMDAwMDk0ICAgICAgICAgICAgTDExOgotICAgICAgIDUzIDAwMDAwMDk0ICAgMTA1MTAwMDQgICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi0gICAgICAgNTQgMDAwMDAwOTggICAxMEFDODAwMSAgICAgICAgICBhZGR1ICAgICAgMSxyMixyMgotICAgICAgIDU1IDAwMDAwMDlDICAgMTA1OTAwMDQgICAgICAgICAgc3QgICAgICAgIDQocjEpLHIyCi0gICAgICAgNTYgMDAwMDAwQTAgICAxODUxMDAwMCAgICAgICAgICBsZCAgICAgICAgMChyMSkscjMKLSAgICAgICA1NyAwMDAwMDBBNCAgIDEwNTEwMDA0ICAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgotICAgICAgIDU4IDAwMDAwMEE4ICAgMThFQzgwMEEgICAgICAgICAgYWRkdSAgICAgIDEwLHIzLHIzCi0gICAgICAgNTkgMDAwMDAwQUMgICAxMEZBMDAwMiAgICAgICAgICBjbXAgICAgICAgcjIscjMscjIKLSAgICAgICA2MCAwMDAwMDBCMCAgIDM4QTVGRkYwICAgICAgICAgIGJiby5hICAgICBMOCxyMixsdC53Ci0gICAgICAgNjEgMDAwMDAwQjQgICAgICAgICAgICBMMTI6Ci0gICAgICAgNjIgMDAwMDAwQjQgICBGODUxMDAwQyAgICAgICAgICBsZCAgICAgICAgMTIocjEpLHIzMQotICAgICAgIDYzIDAwMDAwMEI4ICAgMDAzODgwMUYgICAgICAgICAganNyICAgICAgIHIzMShyMCkscjAKLSAgICAgICA2NCAwMDAwMDBCQyAgIDA4NkM4MDEwICAgICAgICAgIGFkZHUgICAgICAxNixyMSxyMQotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5ZTM5NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi07OyBUaGlzIGlzIHRoZSBoYW5kIGhhY2tlZCBvdXRwdXQgb2YgdGhlIFRJIEMgY29tcGlsZXIgZm9yIGEgc2ltcGxlCi07OyB0ZXN0IHByb2dyYW0gdGhhdCBjb250YWlucyBsb2NhbC9nbG9iYWwgZnVuY3Rpb25zLCBsb2NhbC9nbG9iYWwKLTs7IGZ1bmN0aW9uIGNhbGxzLCBhbmQgYW4gImlmIiBhbmQgImZvciIgc3RhdGVtZW50LgotCi0JLmZpbGUJICAgInJlbG9jczEucyIKLQotCS5nbG9iYWwJX3hmdW5jCi0KLV9zZnVuYzoKLSAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKLSAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBzdCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGpzciAgICAgICBfeGZ1bmMocjApLHIzMQotICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCi0gICAgICAgICBsZCAgICAgICAgMTIocjEpLHIzMQotICAgICAgICAganNyICAgICAgIHIzMShyMCkscjAKLSAgICAgICAgIGFkZHUgICAgICAxNixyMSxyMQotCi0JLmdsb2JhbAlfZ2Z1bmMKLQotX2dmdW5jOgotICAgICAgICAgYWRkdSAgICAgIC0xNixyMSxyMQotICAgICAgICAgc3QgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAgIHN0ICAgICAgICAwKHIxKSxyMgotICAgICAgICAganNyICAgICAgIF9zZnVuYyhyMCkscjMxCi0gICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCi0KLQotCS5nbG9iYWwJX2JyYW5jaGVzCi0KLV9icmFuY2hlczoKLSAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKLSAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBzdCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgotICAgICAgICAgc3QgICAgICAgIDQocjEpLHIyCi0gICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMwotICAgICAgICAgYWRkdSAgICAgIDEwLHIyLHIyCi0gICAgICAgICBjbXAgICAgICAgcjMscjIscjIKLSAgICAgICAgIGJiby5hICAgICBMMTIscjIsZ2UudwotTDg6Ci0gICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGJiei5hICAgICBMMTAscjIsMAotICAgICAgICAganNyICAgICAgIF9nZnVuYyhyMCkscjMxCi0gICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGJyLmEgICAgICBMMTEKLUwxMDoKLSAgICAgICAgIGpzciAgICAgICBfeGZ1bmMocjApLHIzMQotICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi1MMTE6Ci0gICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGFkZHUgICAgICAxLHIyLHIyCi0gICAgICAgICBzdCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMwotICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi0gICAgICAgICBhZGR1ICAgICAgMTAscjMscjMKLSAgICAgICAgIGNtcCAgICAgICByMixyMyxyMgotICAgICAgICAgYmJvLmEgICAgIEw4LHIyLGx0LncKLUwxMjoKLSAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxYi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMWIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViMzE2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxYi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jc291cmNlOiByZWxvY3MxLnMKLSNuYW1lOiBUSWM4MCBzaW1wbGUgcmVsb2NzLCBnbG9iYWwvbG9jYWwgZnVuY3MgJiBicmFuY2hlcyAocmVsb2NzKQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCAgIFRZUEUgICAgICAgICAgICAgIFZBTFVFIAotMDAwMDAwMTAgMzIgICAgICAgICAgICAgICAgX3hmdW5jCi0wMDAwMDAzNCAzMiAgICAgICAgICAgICAgICAudGV4dAotMDAwMDAwN2MgMzIgICAgICAgICAgICAgICAgLnRleHQKLTAwMDAwMDhjIDMyICAgICAgICAgICAgICAgIF94ZnVuYwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5jIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjExMjBjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLWV4dGVybiBjaGFyIHhfY2hhcjsKLWV4dGVybiBzaG9ydCB4X3Nob3J0Owotc3RhdGljIGludCB4X2ludDsKLWV4dGVybiBsb25nIHhfbG9uZzsKLWV4dGVybiBmbG9hdCB4X2Zsb2F0OwotZXh0ZXJuIGRvdWJsZSB4X2RvdWJsZTsKLWV4dGVybiBjaGFyICp4X2NoYXJfcDsKLQotc3RhdGljIGNoYXIgc19jaGFyOwotc3RhdGljIHNob3J0IHNfc2hvcnQ7Ci1zdGF0aWMgaW50IHNfaW50Owotc3RhdGljIGxvbmcgc19sb25nOwotc3RhdGljIGZsb2F0IHNfZmxvYXQ7Ci1zdGF0aWMgZG91YmxlIHNfZG91YmxlOwotc3RhdGljIGNoYXIgKnNfY2hhcl9wOwotCi1jaGFyIGdfY2hhcjsKLXNob3J0IGdfc2hvcnQ7Ci1pbnQgZ19pbnQ7Ci1sb25nIGdfbG9uZzsKLWZsb2F0IGdfZmxvYXQ7Ci1kb3VibGUgZ19kb3VibGU7Ci1jaGFyICpnX2NoYXJfcDsKLQotbWFpbiAoKQotewotICB4X2NoYXIgPSBzX2NoYXI7Ci0gIGdfY2hhciA9IHhfY2hhcjsKLSAgeF9zaG9ydCA9IHNfc2hvcnQ7Ci0gIGdfc2hvcnQgPSB4X3Nob3J0OwotICB4X2ludCA9IHNfaW50OwotICBnX2ludCA9IHhfaW50OwotICB4X2xvbmcgPSBzX2xvbmc7Ci0gIGdfbG9uZyA9IHhfbG9uZzsKLSAgeF9mbG9hdCA9IHNfZmxvYXQ7Ci0gIGdfZmxvYXQgPSB4X2Zsb2F0OwotICB4X2RvdWJsZSA9IHNfZG91YmxlOwotICBnX2RvdWJsZSA9IHhfZG91YmxlOwotICB4X2NoYXJfcCA9IHNfY2hhcl9wOwotICBnX2NoYXJfcCA9IHhfY2hhcl9wOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjNlODdkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIuZAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIHN0YXRpYyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyAoY29kZSkKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPF9tYWluPjoKLSAgIDA6CTAwIDEwIDM0IDEwIDI0IDAyIDAwIDAwLioKLSAgIDg6CTAwIDEwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgMTA6CTAwIDEwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgMTg6CTAwIDEwIDM2IDEwIDA0IDAyIDAwIDAwLioKLSAgMjA6CTAwIDMwIDM0IDEwIDI0IDAzIDAwIDAwLioKLSAgMjg6CTAwIDMwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgMzA6CTAwIDMwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgMzg6CTAwIDMwIDM2IDEwIDA0IDAzIDAwIDAwLioKLSAgNDA6CTAwIDUwIDM0IDEwIDM0IDAyIDAwIDAwLioKLSAgNDg6CTAwIDUwIDM2IDEwIDM0IDAzIDAwIDAwLioKLSAgNTA6CTAwIDUwIDM0IDEwIDM0IDAzIDAwIDAwLioKLSAgNTg6CTAwIDUwIDM2IDEwIDE0IDAyIDAwIDAwLioKLSAgNjA6CTAwIDUwIDM0IDEwIGY0IDAxIDAwIDAwLioKLSAgNjg6CTAwIDUwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgNzA6CTAwIDUwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgNzg6CTAwIDUwIDM2IDEwIGY0IDAwIDAwIDAwLioKLSAgODA6CTAwIDUwIDM0IDEwIGY0IDAyIDAwIDAwLioKLSAgODg6CTAwIDUwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgOTA6CTAwIDUwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgOTg6CTAwIDUwIDM2IDEwIDE0IDAzIDAwIDAwLioKLSAgYTA6CTAwIDcwIDM0IDEwIGU0IDAxIDAwIDAwLioKLSAgYTg6CTAwIDcwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgYjA6CTAwIDcwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgYjg6CTAwIDcwIDM2IDEwIGU0IDAyIDAwIDAwLioKLSAgYzA6CTAwIDUwIDM0IDEwIDQ0IDAzIDAwIDAwLioKLSAgYzg6CTAwIDUwIDM2IDEwIDAwIDAwIDAwIDAwLioKLSAgZDA6CTAwIDUwIDM0IDEwIDAwIDAwIDAwIDAwLioKLSAgZDg6CTAwIDUwIDM2IDEwIGU0IDAwIDAwIDAwLioKLSAgZTA6CTFmIGEwIDM4IDAwLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OTBhOGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBTdW4gRmViIDIzIDEyOjE2OjMyIDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVsb2NzMi5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgaXMgdGhlIGhhbmQgaGFja2VkIG91dHB1dCBvZiB0aGUgVEkgQyBjb21waWxlciBmb3IgYSBzaW1wbGUKLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IHRlc3QgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIHN0YXRpYywgZ2xvYmFsLCBhbmQgZXh0ZXJuIGRhdGEgdmFyaWFibGVzLgotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWxlICAgInJlbG9jczIucyIKLSAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9jaGFyCi0gICAgICAgIDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX3hfc2hvcnQKLSAgICAgICAgNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9sb25nCi0gICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX3hfZmxvYXQKLSAgICAgICAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9kb3VibGUKLSAgICAgICAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9jaGFyX3AKLSAgICAgICAxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19jaGFyCi0gICAgICAgMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfc2hvcnQKLSAgICAgICAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19pbnQKLSAgICAgICAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19sb25nCi0gICAgICAgMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfZmxvYXQKLSAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19kb3VibGUKLSAgICAgICAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19jaGFyX3AKLSAgICAgICAxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfbWFpbgotICAgICAgIDE5ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMjAgMDAwMDAwMDAgICAgICAgICAgICBfbWFpbjoKLSAgICAgICAyMSAwMDAwMDAwMCAgIDEwMzQxMDAwICAgICAgICAgIGxkLmIgICAgICBfc19jaGFyKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMDQgICAwMDAwMDAxQyAKLSAgICAgICAyMiAwMDAwMDAwOCAgIDEwMzYxMDAwICAgICAgICAgIHN0LmIgICAgICBfeF9jaGFyKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMEMgICAwMDAwMDAwMCAKLSAgICAgICAyMyAwMDAwMDAxMCAgIDEwMzQxMDAwICAgICAgICAgIGxkLmIgICAgICBfeF9jaGFyKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMTQgICAwMDAwMDAwMCAKLSAgICAgICAyNCAwMDAwMDAxOCAgIDEwMzYxMDAwICAgICAgICAgIHN0LmIgICAgICBfZ19jaGFyKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMUMgICAwMDAwMDAxNCAKLSAgICAgICAyNSAwMDAwMDAyMCAgIDEwMzQzMDAwICAgICAgICAgIGxkLmggICAgICBfc19zaG9ydCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDI0ICAgMDAwMDAwM0MgCi0gICAgICAgMjYgMDAwMDAwMjggICAxMDM2MzAwMCAgICAgICAgICBzdC5oICAgICAgX3hfc2hvcnQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDAyQyAgIDAwMDAwMDAwIAotICAgICAgIDI3IDAwMDAwMDMwICAgMTAzNDMwMDAgICAgICAgICAgbGQuaCAgICAgIF94X3Nob3J0KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMzQgICAwMDAwMDAwMCAKLSAgICAgICAyOCAwMDAwMDAzOCAgIDEwMzYzMDAwICAgICAgICAgIHN0LmggICAgICBfZ19zaG9ydCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDNDICAgMDAwMDAwMzQgCi0gICAgICAgMjkgMDAwMDAwNDAgICAxMDM0NTAwMCAgICAgICAgICBsZCAgICAgICAgX3NfaW50KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNDQgICAwMDAwMDAyMCAKLSAgICAgICAzMCAwMDAwMDA0OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfeF9pbnQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA0QyAgIDAwMDAwMDQwIAotICAgICAgIDMxIDAwMDAwMDUwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF94X2ludCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDU0ICAgMDAwMDAwNDAgCi0gICAgICAgMzIgMDAwMDAwNTggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX2dfaW50KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNUMgICAwMDAwMDAxOCAKLSAgICAgICAzMyAwMDAwMDA2MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfc19sb25nKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNjQgICAwMDAwMDAxMCAKLSAgICAgICAzNCAwMDAwMDA2OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfeF9sb25nKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNkMgICAwMDAwMDAwMCAKLSAgICAgICAzNSAwMDAwMDA3MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfeF9sb25nKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNzQgICAwMDAwMDAwMCAKLSAgICAgICAzNiAwMDAwMDA3OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfZ19sb25nKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwN0MgICAwMDAwMDAwNCAKLSAgICAgICAzNyAwMDAwMDA4MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfc19mbG9hdCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDg0ICAgMDAwMDAwMzAgCi0gICAgICAgMzggMDAwMDAwODggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX3hfZmxvYXQrMChyMCkscjIKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFN1biBGZWIgMjMgMTI6MTY6MzIgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWxvY3MyLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDIKLQotICAgICAgICAgIDAwMDAwMDhDICAgMDAwMDAwMDAgCi0gICAgICAgMzkgMDAwMDAwOTAgICAxMDM0NTAwMCAgICAgICAgICBsZCAgICAgICAgX3hfZmxvYXQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA5NCAgIDAwMDAwMDAwIAotICAgICAgIDQwIDAwMDAwMDk4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF9nX2Zsb2F0KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwOUMgICAwMDAwMDAzOCAKLSAgICAgICA0MSAwMDAwMDBBMCAgIDEwMzQ3MDAwICAgICAgICAgIGxkLmQgICAgICBfc19kb3VibGUrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDBBNCAgIDAwMDAwMDA4IAotICAgICAgIDQyIDAwMDAwMEE4ICAgMTAzNjcwMDAgICAgICAgICAgc3QuZCAgICAgIF94X2RvdWJsZSswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMEFDICAgMDAwMDAwMDAgCi0gICAgICAgNDMgMDAwMDAwQjAgICAxMDM0NzAwMCAgICAgICAgICBsZC5kICAgICAgX3hfZG91YmxlKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwQjQgICAwMDAwMDAwMCAKLSAgICAgICA0NCAwMDAwMDBCOCAgIDEwMzY3MDAwICAgICAgICAgIHN0LmQgICAgICBfZ19kb3VibGUrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDBCQyAgIDAwMDAwMDI4IAotICAgICAgIDQ1IDAwMDAwMEMwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF9zX2NoYXJfcCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMEM0ICAgMDAwMDAwNDQgCi0gICAgICAgNDYgMDAwMDAwQzggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX3hfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwQ0MgICAwMDAwMDAwMCAKLSAgICAgICA0NyAwMDAwMDBEMCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfeF9jaGFyX3ArMChyMCkscjIKLSAgICAgICAgICAwMDAwMDBENCAgIDAwMDAwMDAwIAotICAgICAgIDQ4IDAwMDAwMEQ4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF9nX2NoYXJfcCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMERDICAgMDAwMDAwMDAgCi0gICAgICAgNDkgMDAwMDAwRTAgICAwMDM4QTAxRiAgICAgICAgICBqc3IuYSAgICAgcjMxKHIwKSxyMAotICAgICAgIDUwICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgNTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfY2hhcl9wCi0gICAgICAgNTIgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX2dfY2hhcl9wLDQsNAotICAgICAgIDUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2xvbmcKLSAgICAgICA1NCAwMDAwMDAwNCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19sb25nLDQsNAotICAgICAgIDU1IDAwMDAwMDA4ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2RvdWJsZSw4LDgKLSAgICAgICA1NiAwMDAwMDAxMCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfc19sb25nLDQsNAotICAgICAgIDU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2NoYXIKLSAgICAgICA1OCAwMDAwMDAxNCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19jaGFyLDEsNAotICAgICAgIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2ludAotICAgICAgIDYwIDAwMDAwMDE4ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2ludCw0LDQKLSAgICAgICA2MSAwMDAwMDAxQyAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfc19jaGFyLDEsNAotICAgICAgIDYyIDAwMDAwMDIwICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2ludCw0LDQKLSAgICAgICA2MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19kb3VibGUKLSAgICAgICA2NCAwMDAwMDAyOCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19kb3VibGUsOCw4Ci0gICAgICAgNjUgMDAwMDAwMzAgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3NfZmxvYXQsNCw0Ci0gICAgICAgNjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfc2hvcnQKLSAgICAgICA2NyAwMDAwMDAzNCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19zaG9ydCwyLDQKLSAgICAgICA2OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19mbG9hdAotICAgICAgIDY5IDAwMDAwMDM4ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2Zsb2F0LDQsNAotICAgICAgIDcwIDAwMDAwMDNDICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX3Nob3J0LDIsNAotICAgICAgIDcxIDAwMDAwMDQwICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF94X2ludCw0LDQKLSAgICAgICA3MiAwMDAwMDA0NCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfc19jaGFyX3AsNCw0Ci0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI1N2RmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIucworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTs7IFRoaXMgaXMgdGhlIGhhbmQgaGFja2VkIG91dHB1dCBvZiB0aGUgVEkgQyBjb21waWxlciBmb3IgYSBzaW1wbGUKLTs7IHRlc3QgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIHN0YXRpYywgZ2xvYmFsLCBhbmQgZXh0ZXJuIGRhdGEgdmFyaWFibGVzLgotCi0JLmZpbGUJInJlbG9jczIucyIKLQkuZ2xvYmFsCV94X2NoYXIKLQkuZ2xvYmFsCV94X3Nob3J0Ci0JLmdsb2JhbAlfeF9sb25nCi0JLmdsb2JhbAlfeF9mbG9hdAotCS5nbG9iYWwJX3hfZG91YmxlCi0JLmdsb2JhbAlfeF9jaGFyX3AKLQkuZ2xvYmFsCV9nX2NoYXIKLQkuZ2xvYmFsCV9nX3Nob3J0Ci0JLmdsb2JhbAlfZ19pbnQKLQkuZ2xvYmFsCV9nX2xvbmcKLQkuZ2xvYmFsCV9nX2Zsb2F0Ci0JLmdsb2JhbAlfZ19kb3VibGUKLQkuZ2xvYmFsCV9nX2NoYXJfcAotCS5nbG9iYWwJX21haW4KLQotX21haW46Ci0gICAgICAgICBsZC5iICAgICAgX3NfY2hhciswKHIwKSxyMgotICAgICAgICAgc3QuYiAgICAgIF94X2NoYXIrMChyMCkscjIKLSAgICAgICAgIGxkLmIgICAgICBfeF9jaGFyKzAocjApLHIyCi0gICAgICAgICBzdC5iICAgICAgX2dfY2hhciswKHIwKSxyMgotICAgICAgICAgbGQuaCAgICAgIF9zX3Nob3J0KzAocjApLHIyCi0gICAgICAgICBzdC5oICAgICAgX3hfc2hvcnQrMChyMCkscjIKLSAgICAgICAgIGxkLmggICAgICBfeF9zaG9ydCswKHIwKSxyMgotICAgICAgICAgc3QuaCAgICAgIF9nX3Nob3J0KzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3NfaW50KzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX3hfaW50KzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3hfaW50KzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX2dfaW50KzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3NfbG9uZyswKHIwKSxyMgotICAgICAgICAgc3QgICAgICAgIF94X2xvbmcrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfeF9sb25nKzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX2dfbG9uZyswKHIwKSxyMgotICAgICAgICAgbGQgICAgICAgIF9zX2Zsb2F0KzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX3hfZmxvYXQrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfeF9mbG9hdCswKHIwKSxyMgotICAgICAgICAgc3QgICAgICAgIF9nX2Zsb2F0KzAocjApLHIyCi0gICAgICAgICBsZC5kICAgICAgX3NfZG91YmxlKzAocjApLHIyCi0gICAgICAgICBzdC5kICAgICAgX3hfZG91YmxlKzAocjApLHIyCi0gICAgICAgICBsZC5kICAgICAgX3hfZG91YmxlKzAocjApLHIyCi0gICAgICAgICBzdC5kICAgICAgX2dfZG91YmxlKzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3NfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX3hfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3hfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX2dfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICBqc3IuYSAgICAgcjMxKHIwKSxyMAotCi0JLmdsb2JhbAlfZ19jaGFyX3AKLQkuYnNzCV9nX2NoYXJfcCw0LDQKLQkuZ2xvYmFsCV9nX2xvbmcKLQkuYnNzCV9nX2xvbmcsNCw0Ci0JLmJzcwlfc19kb3VibGUsOCw4Ci0JLmJzcwlfc19sb25nLDQsNAotCS5nbG9iYWwJX2dfY2hhcgotCS5ic3MJX2dfY2hhciwxLDQKLQkuZ2xvYmFsCV9nX2ludAotCS5ic3MJX2dfaW50LDQsNAotCS5ic3MJX3NfY2hhciwxLDQKLQkuYnNzCV9zX2ludCw0LDQKLQkuZ2xvYmFsCV9nX2RvdWJsZQotCS5ic3MJX2dfZG91YmxlLDgsOAotCS5ic3MJX3NfZmxvYXQsNCw0Ci0JLmdsb2JhbAlfZ19zaG9ydAotCS5ic3MJX2dfc2hvcnQsMiw0Ci0JLmdsb2JhbAlfZ19mbG9hdAotCS5ic3MJX2dfZmxvYXQsNCw0Ci0JLmJzcwlfc19zaG9ydCwyLDQKLQkuYnNzCV94X2ludCw0LDQKLQkuYnNzCV9zX2NoYXJfcCw0LDQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczJiLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyYi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRmOTlkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczJiLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNzb3VyY2U6IHJlbG9jczIucwotI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIHN0YXRpYyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyAocmVsb2NzKQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCAgIFRZUEUgICAgICAgICAgICAgIFZBTFVFIAotMDAwMDAwMDQgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotMDAwMDAwMGMgMzIgICAgICAgICAgICAgICAgX3hfY2hhcgotMDAwMDAwMTQgMzIgICAgICAgICAgICAgICAgX3hfY2hhcgotMDAwMDAwMWMgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotMDAwMDAwMjQgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotMDAwMDAwMmMgMzIgICAgICAgICAgICAgICAgX3hfc2hvcnQKLTAwMDAwMDM0IDMyICAgICAgICAgICAgICAgIF94X3Nob3J0Ci0wMDAwMDAzYyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA0NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA0YyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA1NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA1YyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA2NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA2YyAzMiAgICAgICAgICAgICAgICBfeF9sb25nCi0wMDAwMDA3NCAzMiAgICAgICAgICAgICAgICBfeF9sb25nCi0wMDAwMDA3YyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA4NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDA4YyAzMiAgICAgICAgICAgICAgICBfeF9mbG9hdAotMDAwMDAwOTQgMzIgICAgICAgICAgICAgICAgX3hfZmxvYXQKLTAwMDAwMDljIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMGE0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMGFjIDMyICAgICAgICAgICAgICAgIF94X2RvdWJsZQotMDAwMDAwYjQgMzIgICAgICAgICAgICAgICAgX3hfZG91YmxlCi0wMDAwMDBiYyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDBjNCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDBjYyAzMiAgICAgICAgICAgICAgICBfeF9jaGFyX3AKLTAwMDAwMGQ0IDMyICAgICAgICAgICAgICAgIF94X2NoYXJfcAotMDAwMDAwZGMgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3RpYzgwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3RpYzgwLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljNDYzMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC90aWM4MC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jCi0jIFRJIFRNUzMyMEM4MCB0ZXN0cy4KLSMKLWlmIFtpc3RhcmdldCB0aWM4MCotKi0qXSB0aGVuIHsKLQotICAgIHJ1bl9kdW1wX3Rlc3QgInJlZ29wcyIKLSAgICBydW5fZHVtcF90ZXN0ICJyZWdvcHMyIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlZ29wczMiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVnb3BzNCIKLSAgICBydW5fZHVtcF90ZXN0ICJjcmVnb3BzIgotICAgIHJ1bl9kdW1wX3Rlc3QgImZsb2F0IgotICAgIHJ1bl9kdW1wX3Rlc3QgImVuZG1hc2siCi0gICAgcnVuX2R1bXBfdGVzdCAiYml0bnVtIgotICAgIHJ1bl9kdW1wX3Rlc3QgImNjb2RlIgotICAgIHJ1bl9kdW1wX3Rlc3QgImFkZCIKLSAgICBydW5fZHVtcF90ZXN0ICJyZWxvY3MxIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlbG9jczFiIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlbG9jczIiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVsb2NzMmIiCi0gICAgcnVuX2R1bXBfdGVzdCAiYWxpZ24iCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2FyaXRoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2FyaXRoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjE0MGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9hcml0aC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGFyaXRoX29wY29kZXMKLWFyaXRoX29wY29kZXM6Ci0JYWRkIHI1LHI2Ci0JYWRkIDUscjYKLQlhZGRpIDcscjUscjYKLQlkaXZoIHI1LHI2Ci0JbXVsaCByNSxyNgotCW11bGggNSxyNgotCW11bGhpIDcscjUscjYKLQlzYXIgcjUscjYKLQlzYXIgMzEscjYKLQlzYXRhZGQgcjUscjYKLQlzYXRhZGQgNSxyNgotCXNhdHN1YiByNSxyNgotCXNhdHN1YmkgNyxyNSxyNgotCXNhdHN1YnIgcjUscjYKLQlzaGwgcjUscjYKLQlzaGwgMzEscjYKLQlzaHIgcjUscjYKLQlzaHIgMzEscjYKLQlzdWIgcjUscjYKLQlzdWJyIHI1LHI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2Jhc2ljLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYmFzaWMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZhNjMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYmFzaWMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLXByb2MgZG9fYXJpdGgge30gewotICAgIHNldCB0ZXN0bmFtZSAiYXJpdGguczogQXJpdGhtZXRpYyBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYXJpdGgucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgICMgLXJlICJeICtcWzAtOVxdKyAwMDAwIDQ4OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEM1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIDQ1MzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCA0NTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBFNTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBFNTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBFNTM2MDcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRTUzN0EwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEJGMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEM1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIDI1MzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEE1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIDY1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiA4NTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBFNTM3QzAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggREYzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRTUzNzgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIDlGMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEE1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIDg1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTIwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JpdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXQuczogYml0IG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBDNkFGMTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQzY2RjEwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEM2MkYxMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBDNkVGMTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19icmFuY2gge30gewotICAgIHNldCB0ZXN0bmFtZSAiYnJhbmNoLnM6IGJyYW5jaCBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYnJhbmNoLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgOEYwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRkVGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRTZGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRDdGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggQ0JGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgQjlGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgQTFGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgOTNGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgODJGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRkFGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRTBGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRDhGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggQzRGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgQkNGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgQTFGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgOTlGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgODJGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRkFFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRTVFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRERFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY29tcGFyZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21wYXJlLnM6IGNvbXBhcmUgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNvbXBhcmUucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFNTMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiA2NTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBFMDJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRTgyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEUxMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBFMTJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRTkyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEU5MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBFMjJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRUEyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEUzMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBFQjJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRTQyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEU0MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBFQzJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRUMyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEU1MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBFRDJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRTYyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEVFMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBFNzJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRUYyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDY1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTIzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2p1bXBzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImp1bXBzLnM6IGp1bXBzIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJqdW1wcy5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDgwMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA2NTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBCRjA3RkFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19sb2dpY2FsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogbG9naWNhbCBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDQ1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEM1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiAyNTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwNTMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSA4NTM2MDcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgMjUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgQTUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbWVtIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1lbS5zOiBtZW1vcnkgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1lbS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA1MzcwNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyNTM3MDQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjUzNzA1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDQwMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIDQwMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDQwMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIDQ2MkYwNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiA2NjJGMDQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgNjYyRjA1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEMwMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEMwMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIDQxMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21pc2Mge30gewotICAgIHNldCB0ZXN0bmFtZSAibWlzYy5zOiBtaXNjIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtaXNjLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTAwNzYwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEUwODc2MDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBFMDA3MjAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRTAwNzQwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEUwMDcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGRjA3MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRTcyRjIwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEU1M0Y0MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT05XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdmUge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92ZS5zOiBtb3ZlIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZlLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDUzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgMDUzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDQ1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2hpbG8ge30gewotICAgIHNldCB0ZXN0bmFtZSAiaGlsby5zOiBoaWxvIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiaGlsby5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDIwMEVFRkJFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA0MTBFQUVERVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggNDEwRUFEREVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLQotcHJvYyBkb19zaW1wbGVfcmVsb2NfdGVzdHMge30gewotICAgIHNldCB0ZXN0bmFtZSAicmVsb2MuczogVGVzdCBmb3IgcHJvcGVyIHJlbG9jYXRpb25zIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlbG9jLnMiICIiICJUZXN0IGZvciBwcm9wZXIgcmVsb2NhdGlvbiAocGFydCAxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjAwMDAwMDAyXFteXG5cXSpSX1Y4NTBfTE8xNlxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMDZcW15cblxdKlJfVjg1MF9ISTE2X1NcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjAwMDAwMDBhXFteXG5cXSpSX1Y4NTBfSEkxNlxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMGVcW15cblxdKlJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAxMlxbXlxuXF0qUl9WODUwX1REQV8xNl8xNl9PRkZTRVRcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjAwMDAwMDE2XFteXG5cXSpSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBvYmpkdW1wX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgdjg1MCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19hcml0aAotICAgIGRvX2JpdAotICAgIGRvX2JyYW5jaAotICAgIGRvX2NvbXBhcmUKLSAgICBkb19qdW1wcwotICAgIGRvX2xvZ2ljYWwKLSAgICBkb19tZW0KLSAgICBkb19taXNjCi0gICAgZG9fbW92ZQotCi0gICAgIyBNYWtlIHN1cmUgd2UgaGFuZGxlIGxvKCkgaGkoKSBhbmQgaGkwKCkgY29ycmVjdGx5LgotICAgIGRvX2hpbG8KLQotICAgICMgQ2hlY2sgZm9yIHByb3BlciByZWxvY3Mgb24gbG8sIGhpLCBoaTAsIHpkYW9mZiwgdGRhb2ZmIGFuZCBzZGFvZmYKLSAgICAjIGV4cHJlc3Npb25zCi0gICAgZG9fc2ltcGxlX3JlbG9jX3Rlc3RzCi0KLSAgICBnYXNfdGVzdCAiaGlsbzIucyIgIiIgIiIgImhpL2xvIHJlZ3Jlc3Npb24gdGVzdCIKLSAgICBnYXNfdGVzdCAiZmVwc3cucyIgIiIgIiIgImVxc3cgcmVncmVzc2lvbiB0ZXN0IgotCi0gICAgZ2FzX3Rlc3RfZXJyb3IgInJhbmdlLnMiICItbXdhcm4tc2lnbmVkLW92ZXJmbG93IiAiQ2hlY2sgZm9yIHJhbmdlIGVycm9yIG9uIGJ5dGUgbG9hZC9zdG9yZSIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JpdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFhYzA1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYml0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQotCS50ZXh0Ci0JLmdsb2JhbCBiaXQKLWJpdDoKLQljbHIxIDUsMTZbcjZdCi0Jbm90MSA1LDE2W3I2XQotCXNldDEgNSwxNltyNl0KLQl0c3QxIDUsMTZbcjZdCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JyYW5jaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9icmFuY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjMWI0Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JyYW5jaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGJjYwotYmNjOgotCWJndCBiY2MKLQliZ2UgYmNjCi0JYmx0IGJjYwotCWJsZSBiY2MKLQliaCBiY2MKLQlibmwgYmNjCi0JYmwgYmNjCi0JYm5oIGJjYwotCWJlIGJjYwotCWJuZSBiY2MKLQlidiBiY2MKLQlibnYgYmNjCi0JYm4gYmNjCi0JYnAgYmNjCi0JYmMgYmNjCi0JYm5jIGJjYwotCWJ6IGJjYwotCWJueiBiY2MKLQliciBiY2MKLQlic2EgYmNjCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2NvbXBhcmUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvY29tcGFyZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDFjOGE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvY29tcGFyZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGNvbXBhcmUKLWNvbXBhcmU6Ci0JY21wIHI1LHI2Ci0JY21wIDUscjYKLQlzZXRmIHYscjUKLQlzZXRmIG52LHI1Ci0Jc2V0ZiBjLHI1Ci0Jc2V0ZiBsLHI1Ci0Jc2V0ZiBuYyxyNQotCXNldGYgbmwscjUKLQlzZXRmIHoscjUKLQlzZXRmIG56LHI1Ci0Jc2V0ZiBuaCxyNQotCXNldGYgaCxyNQotCXNldGYgcyxyNQotCXNldGYgbixyNQotCXNldGYgbnMscjUKLQlzZXRmIHAscjUKLQlzZXRmIHQscjUKLQlzZXRmIHNhLHI1Ci0Jc2V0ZiBsdCxyNQotCXNldGYgZ2UscjUKLQlzZXRmIGxlLHI1Ci0Jc2V0ZiBndCxyNQotCXRzdCByNSxyNgotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9mZXBzdy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9mZXBzdy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjAzMzNjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvZmVwc3cucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS50ZXh0Ci0JbGRzciByMTcsZmVwc3cKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvaGlsby5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjdlNTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQotCS50ZXh0Ci0JbW92ZWEgbG8oMHhkZWFkYmVlZikscjAscjEKLQltb3ZoaSBoaSgweGRlYWRiZWVmKSxyMSxyMQotCW1vdmhpIGhpMCgweGRlYWRiZWVmKSxyMSxyMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjFkNTkzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvaGlsbzIucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCS50ZXh0Ci0JLm9yZyAweDEwMDAwCi0JbW92ZWEgaGkoYmxhaCkscjAscjEKLWJsYWg6CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2p1bXBzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2p1bXBzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MzE2NGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9qdW1wcy5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwganVtcHMKLWp1bXBzOgotCWphcmwganVtcHMscjUKLQlqbXAgW3I1XQotCWpyIGp1bXBzCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2xvZ2ljYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbG9naWNhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjAwYjNiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbG9naWNhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGxvZ2ljYWxzCi1sb2dpY2FsczoKLQlhbmQgcjUscjYKLQlhbmRpIDcscjUscjYKLQlub3QgcjUscjYKLQlvciByNSxyNgotCW9yaSA3LHI1LHI2Ci0JeG9yIHI1LHI2Ci0JeG9yaSA3LHI1LHI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21lbS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9tZW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2OWNlYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21lbS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIG1lbW9yeQotbWVtb3J5OgotCWxkLmIgNVtyNV0scjYKLQlsZC5oIDRbcjVdLHI2Ci0JbGQudyA0W3I1XSxyNgotCXNsZC5iIDY0W2VwXSxyNgotCXNsZC5oIDEyOFtlcF0scjYKLQlzbGQudyAxMjhbZXBdLHI2Ci0Jc3QuYiByNSw1W3I2XQotCXN0LmggcjUsNFtyNl0KLQlzdC53IHI1LDRbcjZdCi0Jc3N0LmIgcjYsNjRbZXBdCi0Jc3N0LmggcjYsMTI4W2VwXQotCXNzdC53IHI2LDEyOFtlcF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbWlzYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9taXNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYzRlNGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9taXNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgbWlzYwotbWlzYzoKLQlkaQotCWVpCi0JaGFsdAotCW5vcAotCXJldGkKLQl0cmFwIDAKLQl0cmFwIDMxCi0JbGRzciByNyxwc3cKLQlzdHNyIHBzdyxyNwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9tb3ZlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21vdmUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhNmZhZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21vdmUucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIG1vdmUKLW1vdmU6Ci0JbW92IHI1LHI2Ci0JbW92IDUscjYKLQltb3ZlYSA3LHI1LHI2Ci0JbW92aGkgNyxyNSxyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yYW5nZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yYW5nZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmFjY2Y0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvcmFuZ2UucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS50ZXh0Ci0JbGQuYiAweGZmNjJbcjBdLHIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JlbG9jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JlbG9jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MzhkMjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yZWxvYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLnRleHQKLQltb3ZlYSBsbyhmb28pLHIwLHIxCi0JbW92aGkgaGkoZm9vKSxyMSxyMQotCW1vdmhpIGhpMChmb28pLHIxLHIxCi0JbW92ZWEgemRhb2ZmKF9mb28pLHIwLHIxCi0JbW92aGkgdGRhb2ZmKF9mb28pLGVwLHIxCi0JbW92aGkgc2Rhb2ZmKF9mb28pLGdwLHIxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NzcwYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdmF4L3F1YWQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcHJvYyBkb19xdWFkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInF1YWQuczogcXVhZHdvcmQgaW1tZWRpYXRlIHZhbHVlcyIKLSAgICBzZXQgeDEgMAotICAgIHNldCB4MiAwCi0gICAgc2V0IHgzIDAKLSAgICBnYXNfc3RhcnQgInF1YWQucyIgIi1hbCIKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gKzJcWyBcdFxdKzAwMDArIDdEOEY3ODU2XFsgXHRcXSttb3ZxXFteXG5cXSpcbiIgeyBzZXQgeDEgMSB9Ci0JICAgIC1yZSAiXiArMlxbIFx0XF0rMzQxMkREQ0NcW15cblxdKlxuIgkJICAgeyBzZXQgeDIgMSB9Ci0JICAgIC1yZSAiXiArMlxbIFx0XF0rQkJBQTUwMDFcWyBcdFxdKlxyXG4iCQkgICB7IHNldCB4MyAxIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0gICAgZ2FzX2ZpbmlzaAotICAgIGlmIFthbGxfb25lcyAkeDEgJHgyICR4M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotaWYgW2lzdGFyZ2V0IHZheC0qLSpdIHRoZW4gewotICAgIGRvX3F1YWQKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFkNGFkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQkudGV4dAotCW1vdnEgJDB4YWFiYmNjZGQxMjM0NTY3OCxyMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBiYjk5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTAuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IHZ0YWJsZSBlbnRyeTAKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCArVFlQRSArVkFMVUUgCi0wKzAwMDAwMTAgUl8uKl9HTlVfVlRFTlRSWSAgdnRibF9hCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmY4OWUzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTAucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotLnRleHQKLS52dGFibGVfZW50cnkgdnRibF9hLCAxNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmE2ZTRiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTEuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IHZ0YWJsZSBlbnRyeTEKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKLU9GRlNFVCArVFlQRSArVkFMVUUgCi0wKzAwMDAwMDAgUl8uKl9HTlVfVlRFTlRSWSAgdnRibF9hLioKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Zjg5ZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0udGV4dAotLnZ0YWJsZV9lbnRyeSB2dGJsX2EsIDE2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc5NWIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogdnRhYmxlIGluaGVyaXQwCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBcWy5kYXRhXF06Ci1PRkZTRVQgK1RZUEUgK1ZBTFVFIAotMCswMDAwMDAwIFJfLipfR05VX1ZUSU5IRVJJVCAgXCpBQlNcKgotMCswMDAwMDEwIFJfLipfR05VX1ZUSU5IRVJJVCAgdnRibF9hCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MzhkZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0uZGF0YQotCi0udHlwZSB2dGJsX2Esb2JqZWN0Ci12dGJsX2E6Ci0JLnNwYWNlIDE2Ci0uc2l6ZSB2dGJsX2EsMTYKLS52dGFibGVfaW5oZXJpdCB2dGJsX2EsIDAKLQotLnR5cGUgdnRibF9iLG9iamVjdAotdnRibF9iOgotCS5zcGFjZSAxNgotLnNpemUgdnRibF9iLDE2Ci0udnRhYmxlX2luaGVyaXQgdnRibF9iLCB2dGJsX2EKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MS5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDYzNTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLmwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjoxOiBFcnJvcjogZXhwZWN0ZWQgYHZ0YmxfYScgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciAudnRhYmxlX2luaGVyaXQKLS4qR0FTLioKLQotCi0gKzEuKnZ0YWJsZV9pbmhlcml0IHZ0YmxfYSwgMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkMWQyOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS52dGFibGVfaW5oZXJpdCB2dGJsX2EsIDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS92dGFibGUuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL3Z0YWJsZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkM2UxYmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL3Z0YWJsZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jCi0jIHZ0YWJsZSB0ZXN0cwotIwotcHJvYyBydW5fbGlzdF90ZXN0IHsgbmFtZSBvcHRzIH0gewotICAgIGdsb2JhbCBzcmNkaXIgc3ViZGlyCi0gICAgc2V0IHRlc3RuYW1lICJ2dGFibGUgJG5hbWUiCi0gICAgc2V0IGZpbGUgJHNyY2Rpci8kc3ViZGlyLyRuYW1lCi0gICAgZ2FzX3J1biAke25hbWV9LnMgJG9wdHMgIj4mZHVtcC5vdXQiCi0gICAgaWYgeyBbcmVnZXhwX2RpZmYgImR1bXAub3V0IiAiJHtmaWxlfS5sIl0gfSB0aGVuIHsKLQlmYWlsICR0ZXN0bmFtZQotCXZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotCXJldHVybgotICAgIH0KLSAgICBwYXNzICR0ZXN0bmFtZQotfQotCi0jIFZ0YWJsZSBiaXRzIGFyZSBvbmx5IHN1cHBvcnRlZCBieSBFTEYgdGFyZ2V0cy4KLWlmIHsgKFtpc3RhcmdldCAiKi0qLWVsZioiXQkJCi0gICAgICB8fCBbaXN0YXJnZXQgIiotKi1saW51eCoiXSkKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotbGludXgqYW91dCpdCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWxpbnV4Km9sZGxkKl0gfSB0aGVuIHsKLQotICAgICMgbm90IHN1cHBvcnRlZCBieSBEMzBWCi0gICAgaWYge1tpc3RhcmdldCAiZDMwdi0qLSoiXX0gewotICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgIyBub3QgeWV0IHN1cHBvcnRlZCBieSBpOTYwCi0gICAgaWYge1tpc3RhcmdldCAiaTk2MC0qLSoiXX0gewotICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgcnVuX2R1bXBfdGVzdCAiaW5oZXJpdDAiIAotICAgIHJ1bl9saXN0X3Rlc3QgImluaGVyaXQxIiAiLWFsIgotCi0gICAgIyBUaGUgdnRhYmxlIGVudHJ5IHJlc3VsdHMgYXJlIGRpZmZlcmVudCBvbiBSZWwgYW5kIFJlbGEgdGFyZ2V0cy4KLSAgICBpZiB7W2lzdGFyZ2V0ICJpKjg2LSotKiJdIAotCXx8IFtpc3RhcmdldCAibWlwcyotKi0qIl0gCi0JfHwgW2lzdGFyZ2V0ICJzdHJvbmdhcm0qLSotKiJdIAotCXx8IFtpc3RhcmdldCAiYXJtKi0qLSoiXX0gdGhlbiB7Ci0KLQlydW5fZHVtcF90ZXN0ICJlbnRyeTAiCi0KLSAgICB9IGVsc2UgewotCi0JcnVuX2R1bXBfdGVzdCAiZW50cnkxIgotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzEuSCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9JTkMxLkgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzczMjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzEuSAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotRklMRSAxIEZJUlNUIExJTkUKLQkuSU5DTFVERQkiSU5DMi5IIgotRklMRSAxIExBU1QgTElORQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzIuSCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9JTkMyLkgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2MzZGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzIuSAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCUZJTEUgMiBGSVJTVCBMSU5FCi0JRklMRSAyIExBU1QgTElORQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2NjcxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotZm9vOgkuQVNTSUdOQwkiaGVsbG8iCi1CQVI6CS5BU1NJR05BCTEyKzM0Ci0KLQlcJmZvbydmb28KLQlcJmZvb1wmZm9vXCZmb28gCi0JXCZmb28gXCZmb28gXCZmb28gCi0JXCZCQVJcJmJhclwmQkFSCi0KLQotCi0JCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzNzMzZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmVycgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWFzc2lnbi5hc206OCBDYW4ndCBmaW5kIHByZXByb2Nlc3NvciB2YXJpYWJsZSBiYXIuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24ub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTUwOWFlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24ub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIQotCi0hZm9vOgkuQVNTSUdOQwkiaGVsbG8iCi0hQkFSOgkuQVNTSUdOQQkxMiszNAotIQotCi0hCVwmZm9vJ2ZvbwotCWhlbGxvZm9vCi0hCVwmZm9vXCZmb29cJmZvbyAKLQloZWxsb2hlbGxvaGVsbG8gCi0hCVwmZm9vIFwmZm9vIFwmZm9vIAotCWhlbGxvIGhlbGxvIGhlbGxvIAotIQlcJkJBUlwmYmFyXCZCQVIKLQk0NjQ2Ci0hCi0KLSEKLQotIQotCi0hCQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZDlmMDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3MuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFFTFNFCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkxIEVRIDIKLQlCQUQKLQkuQUVMU0UKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBFUSAyCi0JQkFECi0JLkFFTFNFCi0JT0sKLQkuQUlGCTEgRVEgMgotCUJBRAotCS5BRUxTRQotCU9LCi0JLkFFTkRJCi0JLkFFTkRJCi0JLkFJRgkxIExUICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCTEgRVEgIDIKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgTkUgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBMRSAgMgotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIEdUICAyCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkzIEdFICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCTMgTFQgIDIKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTMgRVEgIDIKLQlCQUQgCi0JLkFFTkRJCi0JLkFJRgkzIE5FICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCTMgTEUgIDIKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTMgR1QgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJMyBHRSAgMgotCU9LCi0JLkFFTkRJCi0JLkFJRgkiRk9PIiBFUSAiQkFSIgotCUJBRAotCS5BRU5ESQotCS5BSUYJIkZPTyIgRVEgIkZPTyIKLQlPSwotCS5BRU5ESQotCS5BSUYJIkZPTyIgTkUgIkJBUiIKLQlPSwotCS5BRU5ESQotCS5BSUYJIkZPTyIgRVEgIkZPTyIKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBFUSAxCi0JLkFJRgkxIEVRIDEKLQlPSwotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQlPSwotCS5BRU5ESQotCU9LCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIEVRIDEKLQlPSwotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCU9LCi0JLkFFTkRJCi0JT0sKLQkuQUVOREkKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFJRgkxIEVRIDEKLQlPSwotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQlPSwotCS5BRU5ESQotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQlPSwotCS5BRU5ESQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3Mub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3Mub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVjZWY1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0hCS5BSUYJMSBFUSAxCi0hCU9LCi0JT0sKLSEJLkFFTFNFCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDIKLSEJQkFECi0hCS5BRUxTRQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMgotIQlCQUQKLSEJLkFFTFNFCi0hCU9LCi0JT0sKLSEJLkFJRgkxIEVRIDIKLSEJQkFECi0hCS5BRUxTRQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUVOREkKLSEJLkFJRgkxIExUICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAgMgotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMSBORSAgMgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgTEUgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEdUICAyCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkzIEdFICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMyBMVCAgMgotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMyBFUSAgMgotIQlCQUQgCi0hCS5BRU5ESQotIQkuQUlGCTMgTkUgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkzIExFICAyCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkzIEdUICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMyBHRSAgMgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCSJGT08iIEVRICJCQVIiCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkiRk9PIiBFUSAiRk9PIgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCSJGT08iIE5FICJCQVIiCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJIkZPTyIgRVEgIkZPTyIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDEKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJT0sKLQlPSwotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUlGCTEgRVEgMQotIQlPSwotCU9LCi0hCS5BRUxTRQkKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMAotIQlCQUQKLSEJLkFFTFNFCQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MTBjYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLQotCVN0dWZmIHRvIHRyeSBhbmQgY3Jhc2ggaXQKLQotZm9vOgkuTUFDUk8JCi0JSEkKLWJhcjoJLk1BQ1JPCQotCVRIRVJFCi0JYmFyCi0JLkVORE0JCi0KLQotCS5FTkRNCi0JZm9vCi0JZm9vCi0JZm9vCi0JZm9vCi0JZm9vCi0JYmFyCi0KLQotCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAwODgwMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotY3Jhc2guYXNtOjE4IFVucmVhc29uYWJsZSBleHBhbnNpb24gKC11IHR1cm5zIG9mZiBjaGVjaykuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5NDhhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMzA1OSArMCwwIEBACi0hCi0KLSEJU3R1ZmYgdG8gdHJ5IGFuZCBjcmFzaCBpdAotCVN0dWZmIHRvIHRyeSBhbmQgY3Jhc2ggaXQKLSEKLQotIWZvbzoJLk1BQ1JPCQotIQlISQotIWJhcjoJLk1BQ1JPCQotIQlUSEVSRQotIQliYXIKLSEJLkVORE0JCi0hCi0hCi0hCS5FTkRNCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiNmIzMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotCi0JLk1BQ1JPIAlmb28gYSBiIGM9YQotCVxhIFxiIFxjIFxkCi0JLkVORE0KLQotCWZvbyAxIDIKLQlmb28gMSAyIDMgNAotCWZvbyAxCi0JZm9vIAotCi0KLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNWQwNzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0hCi0KLSEKLQotIQkuTUFDUk8gCWZvbyBhIGIgYz1hCi0hCVxhIFxiIFxjIFxkCi0hCS5FTkRNCi0hCi0KLSEJZm9vIDEgMgotIQkxIDIgYSBcZAotCTEgMiBhIFxkCi0hCWZvbyAxIDIgMyA0Ci0hCWZvbyAxCi0hCTEgIGEgXGQKLQkxICBhIFxkCi0hCWZvbyAKLSEJICBhIFxkCi0JYSBcZAotIQotCi0hCi0KLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4YTAwMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQlmb28KLQlmb28JZm9vCi0JZm9vCWZvbwotCWZvbwotCS5FTkQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDFhMmY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIQotCi0hZm9vOgkuQVNTSUdOQQkxCi0hCVwmZm9vKzEJCi0JMSsxCQotIQlcJmZvbysxCi0JMSsxCi0hZm9vOgkuQVNTSUdOQwkiZm9vIgotIQlcJmZvbysxCi0JZm9vKzEKLSEJXCZmb28rMQotCWZvbysxCi0hCi0KLSFmb286CS5BU1NJR05BCTEKLSEJXCZmb28rMQkKLQkxKzEJCi0hCVwmZm9vKzEKLQkxKzEKLSFmb286CS5BU1NJR05DCSJmb28iCi0hCVwmZm9vKzEKLQlmb28rMQotIQlcJmZvbysxCi0JZm9vKzEKLSEKLQotIWZvbzoJLkFTU0lHTkEJMQotIQlcJmZvbysxCQotCTErMQkKLSEJXCZmb28rMQotCTErMQotIWZvbzoJLkFTU0lHTkMJImZvbyIKLSEJXCZmb28rMQotCWZvbysxCi0hCVwmZm9vKzEKLQlmb28rMQotIQotCi0hZm9vOgkuQVNTSUdOQQkxCi0hCVwmZm9vKzEJCi0JMSsxCQotIQlcJmZvbysxCi0JMSsxCi0hZm9vOgkuQVNTSUdOQwkiZm9vIgotIQlcJmZvbysxCi0JZm9vKzEKLSEJXCZmb28rMQotCWZvbysxCi0hCi0KLSFmb286CS5BU1NJR05BCTEKLSEJXCZmb28rMQkKLQkxKzEJCi0hCVwmZm9vKzEKLQkxKzEKLSFmb286CS5BU1NJR05DCSJmb28iCi0hCVwmZm9vKzEKLQlmb28rMQotIQlcJmZvbysxCi0JZm9vKzEKLSEJZm9vCi0JZm9vCi0hCWZvbwlmb28KLQlmb28JZm9vCi0hCWZvbwlmb28KLQlmb28JZm9vCi0hCWZvbwotCWZvbwotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNmIwYTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotCi1mb28JLkRBVEEJMSwyLDMKLWJhcgkuREFUQQkxLDIsMyw0LDUgLDYKLQkuREFUQS5CCTEyMzQ1LDEyLDIKLQkuREFUQS5XIDksMiwxMiwzLDEzKzQxLGZvbys5Ci0JLkRBVEEuTCAyfjk5Ci0KLQotCi0JLkRBVEFCCTEsMiwzCi0JLkRBVEFCCTEsMiwzCi0KLQotCi0KLQkuREFUQUIJMSw5KzMyCi0KLQkuREFUQUIuTAkxLEgnMTExMTExMTEKLQkuREFUQUIuVwkyLEgnMjIyMgotCS5EQVRBQi5CCTMsSCczMzMKLQotCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NmUxZTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIQotCi0hZm9vCS5EQVRBCTEsMiwzCi1mb286CS5sb25nCTEsMiwzCi0hYmFyCS5EQVRBCTEsMiwzLDQsNSAsNgotYmFyOgkubG9uZwkxLDIsMyw0LDUsNgotIQkuREFUQS5CCTEyMzQ1LDEyLDIKLQkuYnl0ZQkxMjM0NSwxMiwyCi0hCS5EQVRBLlcgOSwyLDEyLDMsMTMrNDEsZm9vKzkKLQkuc2hvcnQJOSwyLDEyLDMsNTQsZm9vKzkKLSEJLkRBVEEuTCAyfjk5Ci0JLmxvbmcJOTcKLSEKLQotIQotCi0hCi0KLSEJLkRBVEFCCTEsMiwzCi0JLmZpbGwJMSw0LDIKLSEJLkRBVEFCCTEsMiwzCi0JLmZpbGwJMSw0LDIKLSEKLQotIQotCi0hCi0KLSEKLQotIQkuREFUQUIJMSw5KzMyCi0JLmZpbGwJMSw0LDQxCi0hCi0KLSEJLkRBVEFCLkwJMSxIJzExMTExMTExCi0JLmZpbGwJMSw0LDI4NjMzMTE1MwotIQkuREFUQUIuVwkyLEgnMjIyMgotCS5maWxsCTIsMiw4NzM4Ci0hCS5EQVRBQi5CCTMsSCczMzMKLQkuZmlsbAkzLDEsODE5Ci0hCi0KLSEKLQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDE2MDhhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotCi07IHRlc3QgYWxsIG9wcwotCi1hMQkuRVFVCTQrMTAKLWEyCS5FUVUJNC0xMAotYTMJLkVRVQk0JjEwCi1hNAkuRVFVCTR8MgotYTUJLkVRVQk0fjIKLWE2CS5FUVUJNCoxMAotYTcJLkVRVQk0MC8xMAotYTgJLkVRVQkrNwotYTkJLkVRVQktNwotYTEwCS5FUVUJfjcKLQotCi0JYTEgYTIgYTMgYTQgYTUgYTYgYTcgYTggYTkgYTEwCi0KLTsgdGVzdCB0aGUgcHJpb3JpdGllcwotCi1iMQkuRVFVCTF8Mn4zJjQrNS04KjcvMgotYjIJLkVRVQkoMXwyfigzJig0KzUtKDgqKDcvMikpKSkpCi1iMwkuRVFVCTEwKjIvMyo0Ci1iNAkuRVFVCSgoKDEwKjIpLzMpKjQpCi1iNQkuRVFVCTEwKzItMys0Ci1iNgkuRVFVCSgoKDEwKzIpLTMpKzQpCi0KLQliMSBiMiBiMyBiNAotCi07IHRlc3QgYXNzb2NpYXRpb24KLQotYzEJLkVRVQktfjMKLWMyCS5FUVUJfi0zCi1jMwkuRVFVCS0ofjMpCi1jNAkuRVFVCX4oLTMpCi0KLQljMSBjMiBjMyBjNAotCi07IHRlc3QgcnVsZXMgZm9yIHN5bWJvbHMKLQotb2sxCS5FUVUJRk9PCi1vazIJLkVRVQlGT08rMTAKLW9rMwkuRVFVCTEwK0ZPTwotb2s0CS5FUVUJRk9PLTEwCi0KLQlvazEKLQlvazIgCi0Jb2szIAotCW9rNAotCi1vazUJLkVRVQlGT08rMys0KzUrNgotb2s2CS5FUVUJRk9PLUJBUgotCi0Jb2s1Ci0Jb2s2Ci0KLWJhZDEJLkVRVQlGT08rRk9PCi1iYWQyCS5FUVUJRk9PKjIKLWJhZDMJLkVRVQlGT08vMgotYmFkNAkuRVFVCUZPT3wyCi1iYWQ1CS5FUVUJRk9PJjIKLWJhZDYJLkVRVQlGT09+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+IC9kZXYvbnVsbCkKLXRoZW4KLQllY2hvIFJlbG9jIG9rLgotZWxzZQotCWVjaG8gLW4gUmVsb2MgZGlmZmVyZW5jZXMuLi4KLQotCWlmIChkb2JvdGggJEJPVEggZG91bnNvcnRyZWxvYykKLQl0aGVuCi0JCWVjaG8gYnV0IHJlbG9jcyBhcmUgc2ltcGx5IG9yZGVyZWQgZGlmZmVyZW50bHkuCi0JZWxzZQotCQllY2hvIGFuZCByZWxvY3MgZGlmZmVyIGluIGNvbnRlbnQuCi0JCWV4aXQgMQotCWZpCi1maQotCi1leGl0Ci0KLSMgZW9mCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3N0cmlwdGVzdCBiL2dhcy90ZXN0c3VpdGUvbGliL2Rvc3RyaXB0ZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYTUxNzAxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2Rvc3RyaXB0ZXN0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyEvYmluL3NoCi0KLXg9c3RyaXB0ZXN0Lnh4LiQkCi15PXN0cmlwdGVzdC55eS4kJAotCi1jcCAkMSAkeAotc3RyaXAgJHgKLWNwICQyICR5Ci1zdHJpcCAkeQotCi1kb29iamNtcCAkeCAkeQotZXhpdAotCi0jZW9mCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3Rlc3QgYi9nYXMvdGVzdHN1aXRlL2xpYi9kb3Rlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3NjhhMjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG90ZXN0CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyEvYmluL3NoCi0jIGFkIGhvYyBkZWJ1ZyB0b29sCi0KLXg9JDEKLXk9JDIKLQoteG91dD1gYmFzZW5hbWUgJHhgLnh4eC4kJAoteW91dD1gYmFzZW5hbWUgJHhgLnl5eS4kJAotCi1ta2RpciAkeG91dAotbWtkaXIgJHlvdXQKLQotZm9yIGkgaW4gKi5zCi1kbwotCWVjaG8gVGVzdGluZyAkaS4uLgotCW9iamVjdD1gYmFzZW5hbWUgJGkgLnNgLm8KLQkkeCAkaSAtbyAkeG91dC8kb2JqZWN0Ci0JJHkgJGkgLW8gJHlvdXQvJG9iamVjdAotCi0jIGlmIHRoZXkgY21wLCB3ZSdyZSBvay4gIE90aGVyd2lzZSB3ZSBoYXZlIHRvIGxvb2sgY2xvc2VyLgotCi0JaWYgKGNtcCAkeG91dC8kb2JqZWN0ICR5b3V0LyRvYmplY3QpCi0JdGhlbgotCQllY2hvICRpIGlzIG9rLgotCWVsc2UKLQkJaWYgKGRvb2JqY21wICR4b3V0LyRvYmplY3QgJHlvdXQvJG9iamVjdCkKLQkJdGhlbgotCQkJZWNobyBOb3QgdGhlIHNhbWUgYnV0IG9iamNtcCBvay4KLQkJZWxzZQotCQkJZXhpdCAxCi0JCWZpCi0JZmkKLQotCWVjaG8KLWRvbmUKLQotcm0gLXJmICR4b3V0ICR5b3V0Ci0KLWV4aXQgMAotCi0jIEVPRgotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zcmVsb2MgYi9nYXMvdGVzdHN1aXRlL2xpYi9kb3Vuc3JlbG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZDY5NTMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zcmVsb2MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBvYmpkdW1wIHRoZSByZWxvYyB0YWJsZSwgYnV0IHN0cmlwIG9mZiB0aGUgaGVhZGluZ3MgYW5kIHJlbG9jCi0jIG51bWJlcnMgYW5kIHNvcnQgdGhlIHJlc3VsdC4gIEludGVuZGVkIGZvciB1c2UgaW4gY29tcGFyaW5nIHJlbG9jCi0jIHRhYmxlcyB0aGF0IG1heSBub3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIuCi0KLW9iamR1bXAgK3JlbG9jICtvbWl0LXJlbG9jYXRpb24tbnVtYmVycyArb21pdC1zeW1ib2wtbnVtYmVycyAkMSBcCi0JfCBzb3J0Ci0jZW9mCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3Vuc3N5bSBiL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDRkYTYyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zc3ltCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIS9iaW4vc2gKLSMgb2JqZHVtcCB0aGUgc3ltYm9sIHRhYmxlLCBidXQgc3RyaXAgb2ZmIHRoZSBoZWFkaW5ncyBhbmQgc3ltYm9sCi0jIG51bWJlcnMgYW5kIHNvcnQgdGhlIHJlc3VsdC4gIEludGVuZGVkIGZvciB1c2UgaW4gY29tcGFyaW5nIHN5bWJvbAotIyB0YWJsZXMgdGhhdCBtYXkgbm90IGJlIGluIHRoZSBzYW1lIG9yZGVyLgotCi1vYmpkdW1wICtzeW1ib2xzICtvbWl0LXN5bWJvbC1udW1iZXJzICQxIFwKLQl8IHNvcnQKLSNlb2YKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZWZzLmV4cCBiL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZWZzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhNWY2OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9nYXMtZGVmcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBLZW4gUmFlYnVybiAocmFlYnVybkBjeWdudXMuY29tKS4KLQotcHJvYyBnYXNfdmVyc2lvbiB7fSB7Ci0gICAgZ2xvYmFsIEFTCi0gICAgY2F0Y2ggImV4ZWMgJEFTIC12ZXJzaW9uIDwgL2Rldi9udWxsIiB0bXAKLSAgICAjIFNob3VsZCBmaW5kIGEgd2F5IHRvIGRpc2NhcmQgY29uc3RhbnQgcGFydHMsIGtlZXAgd2hhdGV2ZXIncwotICAgICMgbGVmdCwgc28gdGhlIHZlcnNpb24gc3RyaW5nIGNvdWxkIGJlIGFsbW9zdCBhbnl0aGluZyBhdCBhbGwuLi4KLSAgICByZWdleHAgIlxbXlxuXF0qIChjeWdudXMtfCkoXFstMC05LmEtekEtWi1cXSspXFtcclxuXF0uKiIgJHRtcCB2ZXJzaW9uIGN5ZyBudW1iZXIKLSAgICBpZiAhW2luZm8gZXhpc3RzIG51bWJlcl0gdGhlbiB7Ci0gICAgICAgIHJldHVybiAiW3doaWNoICRBU10gKG5vIHZlcnNpb24gbnVtYmVyKVxuIgotICAgIH0KLSAgICBjbG9uZV9vdXRwdXQgIlt3aGljaCAkQVNdICRudW1iZXJcbiIKLSAgICB1bnNldCB2ZXJzaW9uCi19Ci0KLXByb2MgZ2FzX3J1biB7IHByb2cgYXNfb3B0cyByZWRpciB9IHsKLSAgICBnbG9iYWwgQVMKLSAgICBnbG9iYWwgQVNGTEFHUwotICAgIGdsb2JhbCBjb21wX291dHB1dAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgdmVyYm9zZSAiRXhlY3V0aW5nICRzcmNkaXIvbGliL3J1biAkQVMgJEFTRkxBR1MgJGFzX29wdHMgJHNyY2Rpci8kc3ViZGlyLyRwcm9nICRyZWRpciIKLSAgICBjYXRjaCAiZXhlYyAkc3JjZGlyL2xpYi9ydW4gJEFTICRBU0ZMQUdTICRhc19vcHRzICRzcmNkaXIvJHN1YmRpci8kcHJvZyAkcmVkaXIiIGNvbXBfb3V0cHV0Ci0gICAgc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0gICAgdmVyYm9zZSAib3V0cHV0IHdhcyAkY29tcF9vdXRwdXQiCi0gICAgcmV0dXJuIFtsaXN0ICRjb21wX291dHB1dCAiIl07Ci19Ci0KLXByb2MgYWxsX29uZXMgeyBhcmdzIH0gewotICAgIGZvcmVhY2ggeCAkYXJncyB7IGlmIFtleHByICR4IT0xXSB7IHJldHVybiAwIH0gfQotICAgIHJldHVybiAxCi19Ci0KLXByb2MgZ2FzX3N0YXJ0IHsgcHJvZyBhc19vcHRzIH0gewotICAgIGdsb2JhbCBBUwotICAgIGdsb2JhbCBBU0ZMQUdTCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgc3Bhd25faWQKLQotICAgIHZlcmJvc2UgIlN0YXJ0aW5nICRBUyAkQVNGTEFHUyAkYXNfb3B0cyAkcHJvZyIgMgotICAgIGNhdGNoIHsKLQlzcGF3biAtbm9lY2hvIC1ub3R0eWNvcHkgJHNyY2Rpci9saWIvcnVuICRBUyAkQVNGTEFHUyAkYXNfb3B0cyAkc3JjZGlyLyRzdWJkaXIvJHByb2cKLSAgICB9IGZvbwotICAgIGlmICFbcmVnZXhwIHteWzAtOV0rfSAkZm9vXSB0aGVuIHsKLQlwZXJyb3IgIkNhbid0IHJ1biAkc3ViZGlyLyRwcm9nOiAkZm9vIgotICAgIH0KLX0KLQotcHJvYyBnYXNfZmluaXNoIHsgfSB7Ci0gICAgZ2xvYmFsIHNwYXduX2lkCi0KLSAgICBjYXRjaCAiY2xvc2UiCi0gICAgY2F0Y2ggIndhaXQiCi19Ci0KLXByb2Mgd2FudF9ub19vdXRwdXQgeyB0ZXN0bmFtZSB9IHsKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCXZlcmJvc2UgIiRjb21wX291dHB1dCIgMwotICAgIH0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAiJHRlc3RuYW1lIgotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQlmYWlsICIkdGVzdG5hbWUiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLXByb2MgZ2FzX3Rlc3Rfb2xkIHsgZmlsZSBhc19vcHRzIHRlc3RuYW1lIH0gewotICAgIGdhc19ydW4gJGZpbGUgJGFzX29wdHMgIiIKLSAgICByZXR1cm4gW3dhbnRfbm9fb3V0cHV0ICR0ZXN0bmFtZV0KLX0KLQotcHJvYyBnYXNfdGVzdCB7IGZpbGUgYXNfb3B0cyB2YXJfb3B0cyB0ZXN0bmFtZSB9IHsKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLQotICAgIHNldCBpIDAKLSAgICBmb3JlYWNoIHdvcmQgJHZhcl9vcHRzIHsKLQlzZXQgaWdub3JlX3N0ZG91dCgkaSkgW3N0cmluZyBtYXRjaCAiKj4iICR3b3JkXQotCXNldCBvcHQoJGkpIFtzdHJpbmcgdHJpbSAkd29yZCB7Pn1dCi0JaW5jciBpCi0gICAgfQotICAgIHNldCBtYXggW2V4cHIgMTw8JGldCi0gICAgZm9yIHtzZXQgaSAwfSB7W2V4cHIgJGk8JG1heF19IHtpbmNyIGl9IHsKLQlzZXQgbWF5YmVfaWdub3JlX3N0ZG91dCAiIgotCXNldCBleHRyYV9vcHRzICIiCi0JZm9yIHtzZXQgYml0IDB9IHsoMTw8JGJpdCk8JG1heH0ge2luY3IgYml0fSB7Ci0JICAgIHNldCBudW0gW2V4cHIgMTw8JGJpdF0KLQkgICAgaWYgW2V4cHIgJGkmJG51bV0gdGhlbiB7Ci0JCXNldCBleHRyYV9vcHRzICIkZXh0cmFfb3B0cyAkb3B0KCRiaXQpIgotCQlpZiAkaWdub3JlX3N0ZG91dCgkYml0KSB0aGVuIHsKLQkJICAgIHNldCBtYXliZV9pZ25vcmVfc3Rkb3V0ICI+L2Rldi9udWxsIgotCQl9Ci0JICAgIH0KLQl9Ci0Jc2V0IGV4dHJhX29wdHMgW3N0cmluZyB0cmltICRleHRyYV9vcHRzXQotCWdhc19ydW4gJGZpbGUgIiRhc19vcHRzICRleHRyYV9vcHRzIiAkbWF5YmVfaWdub3JlX3N0ZG91dAotCi0JIyBTaG91bGQgSSBiZSBhYmxlIHRvIHVzZSBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaGVyZT8KLQlpZiBbc3RyaW5nIG1hdGNoICIiICRleHRyYV9vcHRzXSB0aGVuIHsKLQkgICAgd2FudF9ub19vdXRwdXQgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgd2FudF9ub19vdXRwdXQgIiR0ZXN0bmFtZSAoJGV4dHJhX29wdHMpIgotCX0KLSAgICB9Ci0gICAgaWYgW2luZm8gZXhpc3RzIGVycm9ySW5mb10gdGhlbiB7Ci0gICAgICAgIHVuc2V0IGVycm9ySW5mbwotICAgIH0KLX0KLQotcHJvYyBnYXNfdGVzdF9pZ25vcmVfc3Rkb3V0IHsgZmlsZSBhc19vcHRzIHRlc3RuYW1lIH0gewotICAgIGdsb2JhbCBjb21wX291dHB1dAotCi0gICAgZ2FzX3J1biAkZmlsZSAkYXNfb3B0cyAiPi9kZXYvbnVsbCIKLSAgICB3YW50X25vX291dHB1dCAkdGVzdG5hbWUKLX0KLQotcHJvYyBnYXNfdGVzdF9lcnJvciB7IGZpbGUgYXNfb3B0cyB0ZXN0bmFtZSB9IHsKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLQotICAgIGdhc19ydW4gJGZpbGUgJGFzX29wdHMgIj4vZGV2L251bGwiCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQlzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGNvbXBfb3V0cHV0IiAzCi0gICAgfQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQlmYWlsICIkdGVzdG5hbWUiCi0gICAgfSBlbHNlIHsKLQlwYXNzICIkdGVzdG5hbWUiCi0gICAgfQotfQotCi1wcm9jIGdhc19leGl0IHt9IHt9Ci0KLXByb2MgZ2FzX2luaXQgeyBhcmdzIH0gewotICAgIGdsb2JhbCB0YXJnZXRfY3B1Ci0gICAgZ2xvYmFsIHRhcmdldF9jcHVfZmFtaWx5Ci0gICAgZ2xvYmFsIHRhcmdldF9mYW1pbHkKLSAgICBnbG9iYWwgdGFyZ2V0X3ZlbmRvcgotICAgIGdsb2JhbCB0YXJnZXRfb3MKLSAgICBnbG9iYWwgc3Rkb3B0bGlzdAotCi0gICAgY2FzZSAiJHRhcmdldF9jcHUiIGluIHsKLQkibTY4Pz8/IgkJeyBzZXQgdGFyZ2V0X2NwdV9mYW1pbHkgbTY4ayB9Ci0JImlbMzRdODYiCQl7IHNldCB0YXJnZXRfY3B1X2ZhbWlseSBpMzg2IH0KLQlkZWZhdWx0CQkJeyBzZXQgdGFyZ2V0X2NwdV9mYW1pbHkgJHRhcmdldF9jcHUgfQotICAgIH0KLQotICAgIHNldCB0YXJnZXRfZmFtaWx5ICIkdGFyZ2V0X2NwdV9mYW1pbHktJHRhcmdldF92ZW5kb3ItJHRhcmdldF9vcyIKLSAgICBzZXQgc3Rkb3B0bGlzdCAiLWE+IgotCi0gICAgaWYgIVtpc3RhcmdldCAiKi0qLSoiXSB7Ci0JcGVycm9yICJUYXJnZXQgbmFtZSBbaXN0YXJnZXRdIGlzIG5vdCBhIHRyaXBsZS4iCi0gICAgfQotICAgICMgTmVlZCB0byByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgotICAgIHJldHVybgotfQotCi0KLSMgcnVuX2R1bXBfdGVzdCBGSUxFIAotIwotIyBBc3NlbWJsZSBhIC5zIGZpbGUsIHRoZW4gcnVuIHNvbWUgdXRpbGl0eSBvbiBpdCBhbmQgY2hlY2sgdGhlIG91dHB1dC4KLSMgCi0jIFRoZXJlIHNob3VsZCBiZSBhbiBhc3NlbWJseSBsYW5ndWFnZSBmaWxlIG5hbWVkIEZJTEUucyBpbiB0aGUgdGVzdAotIyBzdWl0ZSBkaXJlY3RvcnksIGFuZCBhIHBhdHRlcm4gZmlsZSBjYWxsZWQgRklMRS5kLiAgYHJ1bl9kdW1wX3Rlc3QnCi0jIHdpbGwgYXNzZW1ibGUgRklMRS5zLCBydW4gc29tZSB0b29sIGxpa2UgYG9iamR1bXAnLCBgb2JqY29weScsIG9yCi0jIGBubScgb24gdGhlIC5vIGZpbGUgdG8gcHJvZHVjZSB0ZXh0dWFsIG91dHB1dCwgYW5kIHRoZW4gYW5hbHl6ZSB0aGF0Ci0jIHdpdGggcmVnZXhwcy4gIFRoZSBGSUxFLmQgZmlsZSBzcGVjaWZpZXMgd2hhdCBwcm9ncmFtIHRvIHJ1biwgYW5kCi0jIHdoYXQgdG8gZXhwZWN0IGluIGl0cyBvdXRwdXQuCi0jCi0jIFRoZSBGSUxFLmQgZmlsZSBiZWdpbnMgd2l0aCB6ZXJvIG9yIG1vcmUgb3B0aW9uIGxpbmVzLCB3aGljaCBzcGVjaWZ5Ci0jIGZsYWdzIHRvIHBhc3MgdG8gdGhlIGFzc2VtYmxlciwgdGhlIHByb2dyYW0gdG8gcnVuIHRvIGR1bXAgdGhlCi0jIGFzc2VtYmxlcidzIG91dHB1dCwgYW5kIHRoZSBvcHRpb25zIGl0IHdhbnRzLiAgVGhlIG9wdGlvbiBsaW5lcyBoYXZlCi0jIHRoZSBzeW50YXg6Ci0jIAotIyAgICAgICAgICMgT1BUSU9OOiBWQUxVRQotIyAKLSMgT1BUSU9OIGlzIHRoZSBuYW1lIG9mIHNvbWUgb3B0aW9uLCBsaWtlICJuYW1lIiBvciAib2JqZHVtcCIsIGFuZAotIyBWQUxVRSBpcyBPUFRJT04ncyB2YWx1ZS4gIFRoZSB2YWxpZCBvcHRpb25zIGFyZSBkZXNjcmliZWQgYmVsb3cuCi0jIFdoaXRlc3BhY2UgaXMgaWdub3JlZCBldmVyeXdoZXJlLCBleGNlcHQgd2l0aGluIFZBTFVFLiAgVGhlIG9wdGlvbgotIyBsaXN0IGVuZHMgd2l0aCB0aGUgZmlyc3QgbGluZSB0aGF0IGRvZXNuJ3QgbWF0Y2ggdGhlIGFib3ZlIHN5bnRheAotIyAoaG1tLCBub3QgZ3JlYXQgZm9yIGVycm9yIGRldGVjdGlvbikuCi0jCi0jIFRoZSBpbnRlcmVzdGluZyBvcHRpb25zIGFyZToKLSMgCi0jICAgbmFtZTogVEVTVC1OQU1FCi0jCVRoZSBuYW1lIG9mIHRoaXMgdGVzdCwgcGFzc2VkIHRvIERlamFHTlUncyBgcGFzcycgYW5kIGBmYWlsJwotIyAgICAgICBjb21tYW5kcy4gIElmIG9taXR0ZWQsIHRoaXMgZGVmYXVsdHMgdG8gRklMRSwgdGhlIHJvb3Qgb2YgdGhlCi0jICAgICAgIC5zIGFuZCAuZCBmaWxlcycgbmFtZXMuCi0jIAotIyAgIGFzOiBGTEFHUwotIwlXaGVuIGFzc2VtYmxpbmcgRklMRS5zLCBwYXNzIEZMQUdTIHRvIHRoZSBhc3NlbWJsZXIuCi0jIAotIyAgIFBST0c6IFBST0dSQU0tTkFNRQotIyAgICAgICBUaGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byBydW4gdG8gYW5hbHl6ZSB0aGUgLm8gZmlsZSBwcm9kdWNlZAotIyAgICAgICBieSB0aGUgYXNzZW1ibGVyLiAgVGhpcyBjYW4gYmUgb21pdHRlZDsgcnVuX2R1bXBfdGVzdCB3aWxsIGd1ZXNzCi0jICAgICAgIHdoaWNoIHByb2dyYW0gdG8gcnVuIGJ5IHNlZWluZyB3aGljaCBvZiB0aGUgZmxhZ3Mgb3B0aW9ucyBiZWxvdwotIwlpcyBwcmVzZW50LgotIyAKLSMgICBvYmpkdW1wOiBGTEFHUwotIyAgIG5tOiBGTEFHUwotIyAgIG9iamNvcHk6IEZMQUdTCi0jCVVzZSB0aGUgc3BlY2lmaWVkIHByb2dyYW0gdG8gYW5hbHl6ZSB0aGUgLm8gZmlsZSwgYW5kIHBhc3MgaXQKLSMJRkxBR1MsIGluIGFkZGl0aW9uIHRvIHRoZSAubyBmaWxlIG5hbWUuCi0jCi0jICAgc291cmNlOiBTT1VSQ0UKLSMJQXNzZW1ibGUgdGhlIGZpbGUgU09VUkNFLnMuICBJZiBvbWl0dGVkLCB0aGlzIGRlZmF1bHRzIHRvIEZJTEUucy4KLSMgICAgICAgVGhpcyBpcyB1c2VmdWwgaWYgc2V2ZXJhbCAuZCBmaWxlcyB3YW50IHRvIHNoYXJlIGEgLnMgZmlsZS4KLSMKLSMgRWFjaCBvcHRpb24gbWF5IG9jY3VyIGF0IG1vc3Qgb25jZS4KLSMKLSMgQWZ0ZXIgdGhlIG9wdGlvbiBsaW5lcyBjb21lIHJlZ2V4cCBsaW5lcy4gIGBydW5fZHVtcF90ZXN0JyBjYWxscwotIyBgcmVnZXhwX2RpZmYnIHRvIGNvbXBhcmUgdGhlIG91dHB1dCBvZiB0aGUgZHVtcGluZyB0b29sIGFnYWluc3QgdGhlCi0jIHJlZ2V4cHMgaW4gRklMRS5kLiAgYHJlZ2V4cF9kaWZmJyBpcyBkZWZpbmVkIGxhdGVyIGluIHRoaXMgZmlsZTsgc2VlCi0jIGZ1cnRoZXIgY29tbWVudHMgdGhlcmUuCi0KLXByb2MgcnVuX2R1bXBfdGVzdCB7IG5hbWUgfSB7Ci0gICAgZ2xvYmFsIHN1YmRpciBzcmNkaXIKLSAgICBnbG9iYWwgT0JKRFVNUCBOTSBBUyBPQkpDT1BZCi0gICAgZ2xvYmFsIE9CSkRVTVBGTEFHUyBOTUZMQUdTIEFTRkxBR1MgT0JKQ09QWUZMQUdTCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiKi8qIiAkbmFtZV0gewotCXNldCBmaWxlICRuYW1lCi0Jc2V0IG5hbWUgW2ZpbGUgdGFpbCAkbmFtZV0KLSAgICB9IGVsc2UgewotCXNldCBmaWxlICIkc3JjZGlyLyRzdWJkaXIvJG5hbWUiCi0gICAgfQotICAgIHNldCBvcHRfYXJyYXkgW3NsdXJwX29wdGlvbnMgIiR7ZmlsZX0uZCJdCi0gICAgaWYgeyAkb3B0X2FycmF5ID09IC0xIH0gewotCXBlcnJvciAiZXJyb3IgcmVhZGluZyBvcHRpb25zIGZyb20gJGZpbGUuZCIKLQl1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgc2V0IG9wdHMoYXMpIHt9Ci0gICAgc2V0IG9wdHMob2JqZHVtcCkge30KLSAgICBzZXQgb3B0cyhubSkge30KLSAgICBzZXQgb3B0cyhvYmpjb3B5KSB7fQotICAgIHNldCBvcHRzKG5hbWUpIHt9Ci0gICAgc2V0IG9wdHMoUFJPRykge30KLSAgICBzZXQgb3B0cyhzb3VyY2UpIHt9Ci0KLSAgICBmb3JlYWNoIGkgJG9wdF9hcnJheSB7Ci0Jc2V0IG9wdF9uYW1lIFtsaW5kZXggJGkgMF0KLQlzZXQgb3B0X3ZhbCBbbGluZGV4ICRpIDFdCi0JaWYgIVtpbmZvIGV4aXN0cyBvcHRzKCRvcHRfbmFtZSldIHsKLQkgICAgcGVycm9yICJ1bmtub3duIG9wdGlvbiAkb3B0X25hbWUgaW4gZmlsZSAkZmlsZS5kIgotCSAgICB1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQkgICAgcmV0dXJuCi0JfQotCWlmIFtzdHJpbmcgbGVuZ3RoICRvcHRzKCRvcHRfbmFtZSldIHsKLQkgICAgcGVycm9yICJvcHRpb24gJG9wdF9uYW1lIG11bHRpcGx5IHNldCBpbiAkZmlsZS5kIgotCSAgICB1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQkgICAgcmV0dXJuCi0JfQotCXNldCBvcHRzKCRvcHRfbmFtZSkgJG9wdF92YWwKLSAgICB9Ci0KLSAgICBpZiB7JG9wdHMoUFJPRykgIT0gIiJ9IHsKLQlzd2l0Y2ggLS0gJG9wdHMoUFJPRykgewotCSAgICBvYmpkdW1wCi0JCXsgc2V0IHByb2dyYW0gb2JqZHVtcCB9Ci0JICAgIG5tCi0JCXsgc2V0IHByb2dyYW0gbm0gfQotCSAgICBvYmpjb3B5Ci0JCXsgc2V0IHByb2dyYW0gb2JqY29weSB9Ci0JICAgIGRlZmF1bHQKLQkJeyBwZXJyb3IgInVucmVjb2duaXplZCBwcm9ncmFtIG9wdGlvbiAkb3B0cyhQUk9HKSBpbiAkZmlsZS5kIgotCQkgIHVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQotCQkgIHJldHVybiB9Ci0JfQotICAgIH0gZWxzZSB7Ci0JIyBHdWVzcyB3aGljaCBwcm9ncmFtIHRvIHJ1biwgYnkgc2VlaW5nIHdoaWNoIG9wdGlvbiB3YXMgc3BlY2lmaWVkLgotCXNldCBwcm9ncmFtICIiCi0JZm9yZWFjaCBwIHtvYmpkdW1wIG9iamNvcHkgbm19IHsKLQkgICAgaWYgeyRvcHRzKCRwKSAhPSAiIn0gewotCQlpZiB7JHByb2dyYW0gIT0gIiJ9IHsKLQkJICAgIHBlcnJvciAiYW1iaWd1b3VzIGR1bXAgcHJvZ3JhbSBpbiAkZmlsZS5kIgotCQkgICAgdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCi0JCSAgICByZXR1cm4KLQkJfSBlbHNlIHsKLQkJICAgIHNldCBwcm9ncmFtICRwCi0JCX0KLQkgICAgfQotCX0KLQlpZiB7JHByb2dyYW0gPT0gIiJ9IHsKLQkgICAgcGVycm9yICJkdW1wIHByb2dyYW0gdW5zcGVjaWZpZWQgaW4gJGZpbGUuZCIKLQkgICAgdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBzZXQgcHJvZ29wdHMxICRvcHRzKCRwcm9ncmFtKQotICAgIGV2YWwgc2V0IHByb2dvcHRzIFwkW3N0cmluZyB0b3VwcGVyICRwcm9ncmFtXUZMQUdTCi0gICAgZXZhbCBzZXQgYmluYXJ5IFwkW3N0cmluZyB0b3VwcGVyICRwcm9ncmFtXQotICAgIGlmIHsgJG9wdHMobmFtZSkgPT0gIiIgfSB7Ci0Jc2V0IHRlc3RuYW1lICIkc3ViZGlyLyRuYW1lIgotICAgIH0gZWxzZSB7Ci0Jc2V0IHRlc3RuYW1lICRvcHRzKG5hbWUpCi0gICAgfQotCi0gICAgaWYgeyAkb3B0cyhzb3VyY2UpID09ICIiIH0gewotCXNldCBzb3VyY2VmaWxlICR7ZmlsZX0ucwotICAgIH0gZWxzZSB7Ci0Jc2V0IHNvdXJjZWZpbGUgJHNyY2Rpci8kc3ViZGlyLyRvcHRzKHNvdXJjZSkKLSAgICB9Ci0KLSAgICBzZW5kX2xvZyAiJEFTICRBU0ZMQUdTICRvcHRzKGFzKSAtbyBkdW1wLm8gJHNvdXJjZWZpbGVcbiIKLSAgICBjYXRjaCAiZXhlYyAkc3JjZGlyL2xpYi9ydW4gJEFTICRBU0ZMQUdTICRvcHRzKGFzKSAtbyBkdW1wLm8gJHNvdXJjZWZpbGUiIGNvbXBfb3V0cHV0Ci0gICAgc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4gewotCXNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKLQl2ZXJib3NlICIkY29tcF9vdXRwdXQiIDMKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIGlmIHsgW3doaWNoICRiaW5hcnldID09IDAgfSB7Ci0JdW50ZXN0ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgeyAkcHJvZ29wdHMxID09ICIiIH0geyBzZXQgJHByb2dvcHRzMSAiLXIiIH0KLSAgICB2ZXJib3NlICJydW5uaW5nICRiaW5hcnkgJHByb2dvcHRzICRwcm9nb3B0czEiIDMKLQotICAgICMgT2JqY29weSwgdW5saWtlIHRoZSBvdGhlciB0d28sIHdvbid0IHNlbmQgaXRzIG91dHB1dCB0byBzdGRvdXQsCi0gICAgIyBzbyB3ZSBoYXZlIHRvIHJ1biBpdCBzcGVjaWFsbHkuCi0gICAgaWYgeyAkcHJvZ3JhbSA9PSAib2JqY29weSIgfSB7Ci0Jc2VuZF9sb2cgIiRiaW5hcnkgJHByb2dvcHRzICRwcm9nb3B0czEgZHVtcC5vIGR1bXAub3V0XG4iCi0JY2F0Y2ggImV4ZWMgJGJpbmFyeSAkcHJvZ29wdHMgJHByb2dvcHRzMSBkdW1wLm8gZHVtcC5vdXQiIGNvbXBfb3V0cHV0Ci0Jc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0JaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQkgICAgc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCSAgICBmYWlsICR0ZXN0bmFtZQotCSAgICByZXR1cm4KLQl9Ci0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGJpbmFyeSAkcHJvZ29wdHMgJHByb2dvcHRzMSBkdW1wLm8gPiBkdW1wLm91dFxuIgotCWNhdGNoICJleGVjICRiaW5hcnkgJHByb2dvcHRzICRwcm9nb3B0czEgZHVtcC5vID4gZHVtcC5vdXQiIGNvbXBfb3V0cHV0Ci0Jc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0JaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQkgICAgc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCSAgICBmYWlsICR0ZXN0bmFtZQotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotCi0gICAgdmVyYm9zZV9ldmFsIHtbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXX0gMwotICAgIGlmIHsgW3JlZ2V4cF9kaWZmICJkdW1wLm91dCIgIiR7ZmlsZX0uZCJdIH0gdGhlbiB7Ci0JZmFpbCAkdGVzdG5hbWUKLQl2ZXJib3NlICJvdXRwdXQgaXMgW2ZpbGVfY29udGVudHMgImR1bXAub3V0Il0iIDIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0bmFtZQotfQotCi1wcm9jIHNsdXJwX29wdGlvbnMgeyBmaWxlIH0gewotICAgIGlmIFtjYXRjaCB7IHNldCBmIFtvcGVuICRmaWxlIHJdIH0geF0gewotCSNwZXJyb3IgImNvdWxkbid0IG9wZW4gYCRmaWxlJzogJHgiCi0JcGVycm9yICIkeCIKLQlyZXR1cm4gLTEKLSAgICB9Ci0gICAgc2V0IG9wdF9hcnJheSB7fQotICAgICMgd2hpdGVzcGFjZSBleHByZXNzaW9uCi0gICAgc2V0IHdzICB7WyAJXSp9Ci0gICAgc2V0IG53cyB7W14gCV0qfQotICAgICMgd2hpdGVzcGFjZSBpcyBpZ25vcmVkIGFueXdoZXJlIGV4Y2VwdCB3aXRoaW4gdGhlIG9wdGlvbnMgbGlzdDsKLSAgICAjIG9wdGlvbiBuYW1lcyBhcmUgYWxwaGFiZXRpYyBvbmx5Ci0gICAgc2V0IHBhdCAiXiMke3dzfShcW2EtekEtWlxdKikkd3M6JHt3c30oLiopJHdzXCQiCi0gICAgd2hpbGUgeyBbZ2V0cyAkZiBsaW5lXSAhPSAtMSB9IHsKLQlzZXQgbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCi0JIyBXaGl0ZXNwYWNlIGhlcmUgaXMgc3BhY2UtdGFiLgotCWlmIFtyZWdleHAgJHBhdCAkbGluZSB4eHggb3B0X25hbWUgb3B0X3ZhbF0gewotCSAgICAjIG1hdGNoIQotCSAgICBsYXBwZW5kIG9wdF9hcnJheSBbbGlzdCAkb3B0X25hbWUgJG9wdF92YWxdCi0JfSBlbHNlIHsKLQkgICAgYnJlYWsKLQl9Ci0gICAgfQotICAgIGNsb3NlICRmCi0gICAgcmV0dXJuICRvcHRfYXJyYXkKLX0KLQotcHJvYyBvYmpkdW1wIHsgb3B0cyB9IHsKLSAgICBnbG9iYWwgT0JKRFVNUAotICAgIGdsb2JhbCBjb21wX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIGNhdGNoICJleGVjICRPQkpEVU1QICRvcHRzIiBjb21wX291dHB1dAotICAgIHNldCBjb21wX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGNvbXBfb3V0cHV0XQotICAgIHZlcmJvc2UgIm9iamR1bXAgb3V0cHV0PSRjb21wX291dHB1dFxuIiAzCi19Ci0KLXByb2Mgb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgeyBwcm9nIG9wdHMgfSB7Ci0gICAgZ2xvYmFsIE9CSkRVTVAKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHNwYXduX2lkCi0KLSAgICB2ZXJib3NlICJTdGFydGluZyAkT0JKRFVNUCAkb3B0cyAkcHJvZyIgMgotICAgIGNhdGNoIHsKLQlzcGF3biAtbm9lY2hvIC1ub3R0eWluaXQgJHNyY2Rpci9saWIvcnVuICRPQkpEVU1QICRvcHRzICRwcm9nCi0gICAgfSBmb28KLSAgICBpZiAhW3JlZ2V4cCB7XlswLTldK30gJGZvb10gdGhlbiB7Ci0JcGVycm9yICJDYW4ndCBydW4gJHByb2c6ICRmb28iCi0gICAgfQotfQotCi1wcm9jIG9iamR1bXBfZmluaXNoIHsgfSB7Ci0gICAgZ2xvYmFsIHNwYXduX2lkCi0KLSAgICBjYXRjaCAiY2xvc2UiCi0gICAgY2F0Y2ggIndhaXQiCi19Ci0KLSMgRGVmYXVsdCB0aW1lb3V0IGlzIDEwIHNlY29uZHMsIGxvc2VzIG9uIGEgc2xvdyBtYWNoaW5lLiAgQnV0IHNvbWUKLSMgY29uZmlndXJhdGlvbnMgb2YgZGVqYWdudSBtYXkgb3ZlcnJpZGUgaXQuCi1pZiB7JHRpbWVvdXQ8MTIwfSB0aGVuIHsgc2V0IHRpbWVvdXQgMTIwIH0KLQotZXhwZWN0X2FmdGVyIC1pIHsKLSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXQiIH0KLSAgICAidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIgl7IHBlcnJvciAidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIiB9Ci0gICAgYnVmZmVyX2Z1bGwJCQl7IHBlcnJvciAiYnVmZmVyIGZ1bGwiIH0KLSAgICBlb2YJCQkJeyBwZXJyb3IgImVvZiIgfQotfQotCi0jIHJlZ2V4cF9kaWZmLCBiYXNlZCBvbiBzaW1wbGVfZGlmZiB0YWtlbiBmcm9tIGxkIHRlc3Qgc3VpdGUKLSMJY29tcGFyZXMgdHdvIGZpbGVzIGxpbmUtYnktbGluZQotIwlmaWxlMSBjb250YWlucyBzdHJpbmdzLCBmaWxlMiBjb250YWlucyByZWdleHBzIGFuZCAjLWNvbW1lbnRzCi0jCWJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkIGluIGVpdGhlciBmaWxlCi0jCXJldHVybnMgbm9uLXplcm8gaWYgZGlmZmVyZW5jZXMgZXhpc3QKLSMKLXByb2MgcmVnZXhwX2RpZmYgeyBmaWxlXzEgZmlsZV8yIH0gewotCi0gICAgc2V0IGVvZiAtMQotICAgIHNldCBlbmRfMSAwCi0gICAgc2V0IGVuZF8yIDAKLSAgICBzZXQgZGlmZmVyZW5jZXMgMAotICAgIHNldCBkaWZmX3Bhc3MgMAotCi0gICAgaWYgW2ZpbGUgZXhpc3RzICRmaWxlXzFdIHRoZW4gewotCXNldCBmaWxlX2EgW29wZW4gJGZpbGVfMSByXQotICAgIH0gZWxzZSB7Ci0Jd2FybmluZyAiJGZpbGVfMSBkb2Vzbid0IGV4aXN0IgotCXJldHVybiAxCi0gICAgfQotCi0gICAgaWYgW2ZpbGUgZXhpc3RzICRmaWxlXzJdIHRoZW4gewotCXNldCBmaWxlX2IgW29wZW4gJGZpbGVfMiByXQotICAgIH0gZWxzZSB7Ci0JZmFpbCAiJGZpbGVfMiBkb2Vzbid0IGV4aXN0IgotCWNsb3NlICRmaWxlX2EKLQlyZXR1cm4gMQotICAgIH0KLQotICAgIHZlcmJvc2UgIiBSZWdleHAtZGlmZidpbmc6ICRmaWxlXzEgJGZpbGVfMiIgMgotCi0gICAgd2hpbGUgeyAxIH0gewotCXNldCBsaW5lX2EgIiIKLQlzZXQgbGluZV9iICIiCi0Jd2hpbGUgeyBbc3RyaW5nIGxlbmd0aCAkbGluZV9hXSA9PSAwIH0gewotCSAgICBpZiB7IFtnZXRzICRmaWxlX2EgbGluZV9hXSA9PSAkZW9mIH0gewotCQlzZXQgZW5kXzEgMQotCQlicmVhawotCSAgICB9Ci0JfQotCXdoaWxlIHsgW3N0cmluZyBsZW5ndGggJGxpbmVfYl0gPT0gMCB8fCBbc3RyaW5nIG1hdGNoICIjKiIgJGxpbmVfYl0gfSB7Ci0JICAgIGlmIFsgc3RyaW5nIG1hdGNoICIjcGFzcyIgJGxpbmVfYiBdIHsKLQkJc2V0IGVuZF8yIDEKLQkJc2V0IGRpZmZfcGFzcyAxCi0JCWJyZWFrCi0JICAgIH0gZWxzZWlmIFsgc3RyaW5nIG1hdGNoICIjLi4uIiAkbGluZV9iIF0gewotCQlpZiB7IFtnZXRzICRmaWxlX2IgbGluZV9iXSA9PSAkZW9mIH0gewotCQkgICAgc2V0IGVuZF8yIDEKLQkJICAgIGJyZWFrCi0JCX0KLQkJdmVyYm9zZSAibG9va2luZyBmb3IgXCJeJGxpbmVfYiRcIiIgMwotCQl3aGlsZSB7ICFbcmVnZXhwICJeJGxpbmVfYiQiICIkbGluZV9hIl0gfSB7Ci0JCSAgICB2ZXJib3NlICJza2lwcGluZyAgICBcIiRsaW5lX2FcIiIgMwotCQkgICAgaWYgeyBbZ2V0cyAkZmlsZV9hIGxpbmVfYV0gPT0gJGVvZiB9IHsKLQkJCXNldCBlbmRfMSAxCi0JCQlicmVhawotCQkgICAgfQotCQl9Ci0JCWJyZWFrCi0JICAgIH0KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZV9iIGxpbmVfYl0gPT0gJGVvZiB9IHsKLQkJc2V0IGVuZF8yIDEKLQkJYnJlYWsKLQkgICAgfQotCX0KLQotICAgICAgICBpZiB7ICRkaWZmX3Bhc3MgfSB7IAotICAgICAgICAgICAgYnJlYWsgCi0gICAgICAgIH0gZWxzZWlmIHsgJGVuZF8xICYmICRlbmRfMiB9IHsgCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMSB9IHsKLSAgICAgICAgICAgIHNlbmRfbG9nICJleHRyYSByZWdleHBzIGluICRmaWxlXzIgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9iJFwiXG5FT0YgZnJvbSAkZmlsZV8xXG4iCi0gICAgICAgICAgICB2ZXJib3NlICJleHRyYSByZWdleHBzIGluICRmaWxlXzIgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9iJFwiXG5FT0YgZnJvbSAkZmlsZV8xIiAzCi0gICAgICAgICAgICBzZXQgZGlmZmVyZW5jZXMgMQotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzIgfSB7Ci0gICAgICAgICAgICBzZW5kX2xvZyAiZXh0cmEgbGluZXMgaW4gJGZpbGVfMSBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2EkXCJcbkVPRiBmcm9tICRmaWxlXzJcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImV4dHJhIGxpbmVzIGluICRmaWxlXzEgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9hJFwiXG5FT0YgZnJvbSAkZmlsZV8yXG4iIDMKLSAgICAgICAgICAgIHNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmVyYm9zZSAicmVnZXhwIFwiXiRsaW5lX2IkXCJcbmxpbmUgICBcIiRsaW5lX2FcIiIgMwotICAgICAgICAgICAgaWYgIVtyZWdleHAgIl4kbGluZV9iJCIgIiRsaW5lX2EiXSB7Ci0JCXNlbmRfbG9nICJyZWdleHBfZGlmZiBtYXRjaCBmYWlsdXJlXG4iCi0JCXNlbmRfbG9nICJyZWdleHAgXCJeJGxpbmVfYiRcIlxubGluZSAgIFwiJGxpbmVfYVwiXG4iCi0JCXNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIHsgJGRpZmZlcmVuY2VzID09IDAgJiYgISRkaWZmX3Bhc3MgJiYgW2VvZiAkZmlsZV9hXSAhPSBbZW9mICRmaWxlX2JdIH0gewotCXNlbmRfbG9nICIkZmlsZV8xIGFuZCAkZmlsZV8yIGFyZSBkaWZmZXJlbnQgbGVuZ3Roc1xuIgotCXZlcmJvc2UgIiRmaWxlXzEgYW5kICRmaWxlXzIgYXJlIGRpZmZlcmVudCBsZW5ndGhzIiAzCi0Jc2V0IGRpZmZlcmVuY2VzIDEKLSAgICB9Ci0KLSAgICBjbG9zZSAkZmlsZV9hCi0gICAgY2xvc2UgJGZpbGVfYgotCi0gICAgcmV0dXJuICRkaWZmZXJlbmNlcwotfQotCi1wcm9jIGZpbGVfY29udGVudHMgeyBmaWxlbmFtZSB9IHsKLSAgICBzZXQgZmlsZSBbb3BlbiAkZmlsZW5hbWUgcl0KLSAgICBzZXQgY29udGVudHMgW3JlYWQgJGZpbGVdCi0gICAgY2xvc2UgJGZpbGUKLSAgICByZXR1cm4gJGNvbnRlbnRzCi19Ci0KLXByb2MgdmVyYm9zZV9ldmFsIHsgZXhwciB7IGxldmVsIDEgfSB9IHsKLSAgICBnbG9iYWwgdmVyYm9zZQotICAgIGlmICR2ZXJib3NlPiRsZXZlbCB0aGVuIHsgZXZhbCB2ZXJib3NlICIkZXhwciIgJGxldmVsIH0KLX0KLQotIyBUaGlzIGRlZmluaXRpb24gaXMgdGFrZW4gZnJvbSBhbiB1bnJlbGVhc2VkIHZlcnNpb24gb2YgRGVqYUdudS4gIE9uY2UKLSMgdGhhdCB2ZXJzaW9uIGdldHMgcmVsZWFzZWQsIGFuZCBoYXMgYmVlbiBvdXQgaW4gdGhlIHdvcmxkIGZvciBhIGZldwotIyBtb250aHMgYXQgbGVhc3QsIGl0IG1heSBiZSBzYWZlIHRvIGRlbGV0ZSB0aGlzIGNvcHkuCi1pZiAhW3N0cmluZyBsZW5ndGggW2luZm8gcHJvYyBwcnVuZV93YXJuaW5nc11dIHsKLSAgICAjCi0gICAgIyBwcnVuZV93YXJuaW5ncyAtLSBkZWxldGUgdmFyaW91cyBzeXN0ZW0gdmVyYm9zaXRpZXMgZnJvbSBURVhULgotICAgICMKLSAgICAjIEFuIGV4YW1wbGUgaXM6Ci0gICAgIyBsZC5zbzogd2FybmluZzogL3Vzci9saWIvbGliYy5zby4xLjguMSBoYXMgb2xkZXIgcmV2aXNpb24gdGhhbiBleHBlY3RlZCA5Ci0gICAgIwotICAgICMgU2l0ZXMgd2l0aCBwYXJ0aWN1bGFyIHZlcmJvc2Ugb3MncyBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGluIHNpdGUuZXhwLgotICAgICMKLSAgICBwcm9jIHBydW5lX3dhcm5pbmdzIHsgdGV4dCB9IHsKLQkjIFRoaXMgaXMgZnJvbSBzdW40J3MuICBEbyBpdCBmb3IgYWxsIG1hY2hpbmVzIGZvciBub3cuCi0JIyBUaGUgIlxcMSIgaXMgdG8gdHJ5IHRvIHByZXNlcnZlIGEgIlxuIiBidXQgb25seSBpZiBuZWNlc3NhcnkuCi0JcmVnc3ViIC1hbGwgIihefFxuKShsZC5zbzogd2FybmluZzpcW15cblxdKlxuPykrIiAkdGV4dCAiXFwxIiB0ZXh0Ci0KLQkjIEl0IG1pZ2h0IGJlIHRlbXB0aW5nIHRvIGdldCBjYXJyaWVkIGF3YXkgYW5kIGRlbGV0ZSBibGFuayBsaW5lcywgZXRjLgotCSMgSnVzdCBkZWxldGUgKmV4YWN0bHkqIHdoYXQgd2UncmUgYXNrIHRvLCBhbmQgdGhhdCdzIGl0LgotCXJldHVybiAkdGV4dAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZy5leHAgYi9nYXMvdGVzdHN1aXRlL2xpYi9nYXMtZGcuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmY3ZjMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIERlZmluZSBnYXMgY2FsbGJhY2tzIGZvciBkZy5leHAuCi0KLWxvYWRfbGliIGRnLmV4cAotCi0jIFRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBzdGlsbCBpbiBhIGJpdCBvZiBmbHV4LgotIyBJdCBzaG91bGQgYmUgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0byBhc3NlbWJsZSwgbGluaywgYW5kIHJ1biBhIGZpbGUKLSMgYnV0IHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IHRoYXQuICBBc3NlbWJsZXIgdGVzdGNhc2VzIGFyZW4ndCB1c3VhbGx5Ci0jIHRoYXQgZWxhYm9yYXRlIGFueXdheS4gIDotKQotCi1wcm9jIGdhcy1kZy10ZXN0IHsgcHJvZyBkb193aGF0IHRvb2xfZmxhZ3MgfSB7Ci0gICAgIyBGSVhNRTogdGhlIGdhcyB0ZXN0c3VpdGUgZG9lc24ndCBkZWZpbmUgdG1wZGlyLiAgVXNlIG91dGRpcj8KLSAgICBzZXQgb3V0cHV0X2ZpbGUgIi4vYS5vdXQiCi0KLSAgICBzd2l0Y2ggJGRvX3doYXQgewotCSJwcmVwcm9jZXNzIiB7Ci0JfQotCSJhc3NlbWJsZSIgewotCX0KLQkibGluayIgewotCX0KLQkicnVuIiB7Ci0JICAgICMgVGhpcyBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBjYXJlIGlmIGFuIGV4ZWN1dGFibGUgd2FzCi0JICAgICMgY3JlYXRlZCBvciBub3QuICBJZiBpdCB3YXMsIGRnLmV4cCB3aWxsIHRyeSB0byBydW4gaXQuCi0JICAgIGNhdGNoICJleGVjIHJtIC1mICRvdXRwdXRfZmlsZSIKLQl9Ci0JZGVmYXVsdCB7Ci0JICAgIHBlcnJvciAiJGRvX3doYXQ6IG5vdCBhIHZhbGlkIGRnLWRvIGtleXdvcmQiCi0JICAgIHJldHVybiAiIgotCX0KLSAgICB9Ci0KLSAgICAjIGdhc19zdGFydCBwcmVwZW5kcyAkc3JjZGlyLyRzdWJkaXIgc28gd2UgbXVzdCByZW1vdmUgaXQgZnJvbSBQUk9HCi0gICAgIyBpZiBwcmVzZW50LiAgRmlyc3QgcmVtb3ZlIGV4dHJhbmVvdXMgLy8ncy4KLSAgICBnbG9iYWwgc3JjZGlyIHN1YmRpcgotICAgIHNldCBkaXIgIiRzcmNkaXIvJHN1YmRpciIKLSAgICByZWdzdWIgLWFsbCAiLy8iICRkaXIgIi8iIGRpcgotICAgIHJlZ3N1YiAtYWxsICIvLyIgJHByb2cgIi8iIHByb2cKLSAgICBpZiBbc3RyaW5nIG1hdGNoICIkZGlyLyoiICRwcm9nXSB7Ci0JcmVnc3ViICIkZGlyIiAkcHJvZyAiIiBwcm9nCi0gICAgfQotCi0gICAgIyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZ2FzX3N0YXJ0IGJ1dCBpdCBkb2Vzbid0IHNldCBjb21wX291dHB1dC4KLSAgICByZXR1cm4gW2dhc19ydW4gJHByb2cgJHRvb2xfZmxhZ3MgIiJdCi19Ci0KLXByb2MgZ2FzLWRnLXBydW5lIHsgc3lzdGVtIHRleHQgfSB7Ci0gICAgI3NlbmRfdXNlciAiQmVmb3JlOiR0ZXh0XG4iCi0gICAgcmVnc3ViIC1hbGwgIihefFxuKVxbXlxuXF0qOiBBc3NlbWJsZXIgbWVzc2FnZXM6XFteXG5cXSoiICR0ZXh0ICIiIHRleHQKLSAgICByZWdzdWIgLWFsbCAiKF58XG4pXFteXG5cXSo6IEVuZCBvZiBmaWxlIG5vdCBhdCBlbmRcW15cblxdKk5ld2xpbmUgaW5zZXJ0ZWQuIiAkdGV4dCAiIiB0ZXh0Ci0gICAgI3NlbmRfdXNlciAiQWZ0ZXI6JHRleHRcbiIKLQotICAgIHJldHVybiAkdGV4dAotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvcnVuIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvcnVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDE1MGY4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL3J1bgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi1ldmFsIGV4ZWMgJEAKZGlmZiAtLWdpdCBhL2dhcy92bXNjb25mLnNoIGIvZ2FzL3Ztc2NvbmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNDUzOGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Ztc2NvbmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotIyEvYmluL3NoCi0KLWNhdCA8PCAnRU9GJwotJCFtYWtlLWdhcy5jb20KLSQhIFNldCB0aGUgZGVmIGRpciB0byBwcm9wZXIgcGxhY2UgZm9yIHVzZSBpbiBiYXRjaC4gV29ya3MgZm9yIGludGVyYWN0aXZlIHRvLgotJGZsbm0gPSBmJGVudmlyb21lbnQoIlBST0NFRFVSRSIpICAgICAhIGdldCBjdXJyZW50IHByb2NlZHVyZSBuYW1lCi0kc2V0IGRlZmF1bHQgJ2YkcGFyc2UoZmxubSwsLCJERVZJQ0UiKScnZiRwYXJzZShmbG5tLCwsIkRJUkVDVE9SWSIpJwotJHYgPSAnZiR2ZXJpZnkoMCknCi0kIQotJCEJQ29tbWFuZCBmaWxlIHRvIGJ1aWxkIGEgR05VIGFzc2VtYmxlciBvbiBWTVMKLSQhCi0kIQlJZiB5b3UgYXJlIHVzaW5nIGEgdmVyc2lvbiBvZiBHQ0MgdGhhdCBzdXBwb3J0cyBnbG9iYWwgY29uc3RhbnRzCi0kIQl5b3Ugc2hvdWxkIHJlbW92ZSB0aGUgZGVmaW5lPSJjb25zdD0iIGZyb20gdGhlIGdjYyBsaW5lcy4KLSQhCi0kIQlDYXV0aW9uOiAgVmVyc2lvbnMgMS4zOC4xIGFuZCBlYXJsaWVyIGhhZCBhIGJ1ZyBpbiB0aGUgaGFuZGxpbmcgb2YKLSQhCXNvbWUgc3RhdGljIGNvbnN0YW50cy4gSWYgeW91IGFyZSB1c2luZyBzdWNoIGEgdmVyc2lvbiBvZiB0aGUKLSQhCWFzc2VtYmxlciwgYW5kIHlvdSB3aXNoIHRvIGNvbXBpbGUgd2l0aG91dCB0aGUgImNvbnN0PSIgaGFjaywKLSQhCXlvdSBzaG91bGQgZmlyc3QgYnVpbGQgdGhpcyB2ZXJzaW9uICp3aXRoKiB0aGUgImNvbnN0PSIKLSQhCWRlZmluaXRpb24sIGFuZCB0aGVuIHVzZSB0aGF0IGFzc2VtYmxlciB0byByZWJ1aWxkIGl0IHdpdGhvdXQgdGhlCi0kIQkiY29uc3Q9IiBkZWZpbml0aW9uLiAgRmFpbHVyZSB0byBkbyB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIGFzc2VtYmxlcgotJCEJdGhhdCB3aWxsIG11bmcgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotJCEKLSQhCU5vdGU6IFRoZSB2ZXJzaW9uIG9mIGdhcyBzaGlwcGVkIG9uIHRoZSBHQ0MgVk1TIHRhcGVzIGhhcyBiZWVuIHBhdGNoZWQKLSQhCXRvIGZpeCB0aGUgYWJvdmUgbWVudGlvbmVkIGJ1Zy4KLSQhCi0kCSFUaGUgZ2NjLXZtcyBkcml2ZXIgd2FzIG1vZGlmaWVkIHRvIHVzZSBgLTEnIHF1aXRlIHNvbWUgdGltZSBhZ28sCi0kCSFzbyBkb24ndCBlY2hvIHRoaXMgdGV4dCBhbnkgbW9yZS4uLgotJCAhd3JpdGUgc3lzJG91dHB1dCAiSWYgdGhpcyBhc3NlbWJsZXIgaXMgZ29pbmcgdG8gYmUgdXNlZCB3aXRoIEdDQyAxLm4sIHlvdSIKLSQgIXdyaXRlIHN5cyRvdXRwdXQgIm5lZWQgdG8gbW9kaWZ5IHRoZSBkcml2ZXIgdG8gc3VwcGx5IHRoZSAtMSBzd2l0Y2ggdG8gZ2FzLiIKLSQgIXdyaXRlIHN5cyRvdXRwdXQgIlRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBvZiBhIHNtYWxsIGNoYW5nZSBpbiBob3cgZ2xvYmFsIgotJCAhd3JpdGUgc3lzJG91dHB1dCAiY29uc3RhbnQgdmFyaWFibGVzIGFyZSBoYW5kbGVkLiAgRmFpbHVyZSB0byBpbmNsdWRlIHRoaXMiCi0kICF3cml0ZSBzeXMkb3V0cHV0ICJ3aWxsIHJlc3VsdCBpbiBsaW5rZXIgd2FybmluZyBtZXNzYWdlcyBhYm91dCBtaXNtYXRjaGVkCi0kICF3cml0ZSBzeXMkb3V0cHV0ICJwc2VjdCBhdHRyaWJ1dGVzLiIKLSQhCi0kIGdhc19ob3N0PSJ2bXMiCi0kIGFyY2hfaW5keCA9IDEgKyAoKGYkZ2V0c3lpKCJDUFUiKS5nZS4xMjgpLmFuZC4xKQkhIHZheD09MSwgYWxwaGE9PTIKLSQgYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCi0kIGlmIGFyY2guZXFzLiJWQVgiCi0kIHRoZW4KLSQgIGNwdV90eXBlPSJ2YXgiCi0kICBvYmpfZm9ybWF0PSJ2bXMiCi0kICBhdG9mPSJ2YXgiCi0kIGVsc2UKLSQgIGNwdV90eXBlPSJhbHBoYSIKLSQgIG9ial9mb3JtYXQ9ImV2YXgiCi0kICBhdG9mPSJpZWVlIgotJCBlbmRpZgotJCBlbXVsYXRpb249ImdlbmVyaWMiCi0kIQotJAlDT1BZCT0gImNvcHkvbm9Mb2ciCi0kIQotJCBDX0RFRlMgOj0iIiJWTVMiIiIKLSQhIENfREVGUyA6PSIiIlZNUyIiIiwiIiJjb25zdD0iIiIKLSQgQ19JTkNMVURFUwk9ICIvSW5jbHVkZT0oW10sWy5jb25maWddLFstLmluY2x1ZGVdLFstLmluY2x1ZGUuYW91dF0pIgotJCBDX0ZMQUdTCT0gIi9ub1ZlcmJvc2UvRGVidWciICsgY19pbmNsdWRlcwotJCEKLSQhCi0kIG9uIGVycm9yIHRoZW4gIGdvdG8gYmFpbAotJCBpZiBmJHNlYXJjaCgiWy0ubGliaWJlcnR5XWxpYmVydHkub2xiIikuZXFzLiIiCi0kIHRoZW4JQFstLmxpYmliZXJ0eV12bXNidWlsZC5jb20KLSQJd3JpdGUgc3lzJG91dHB1dCAiTm93IGJ1aWxkaW5nIGdhcy4iCi0kIGVuZGlmCi0kIGlmICInJ3AxJyIgLmVxcy4gIkxJTksiIHRoZW4gZ290byBMaW5rCi0kIQotJCEgIFRoaXMgaGVscHMgZ2NjIDEubm4gZmluZCB0aGUgYW91dC8qIGZpbGVzLgotJCEKLSQgYW91dF9kZXYgPSBmJHBhcnNlKGZsbm0sLCwiREVWSUNFIikKLSQgdG1wID0gYW91dF9kZXYgLSAiOiIKLSRpZiBmJHRybmxubSh0bXApLm5lcy4iIiB0aGVuIGFvdXRfZGV2ID0gZiR0cm5sbm0odG1wKQotJCBhb3V0X2RpciA9IGFvdXRfZGV2K2YkcGFyc2UoZmxubSwsLCJESVJFQ1RPUlkiKScgLQotCS0gIkdBU10iICsgIklOQ0xVREUuQU9VVC5dIiAtICJdWyIKLSRhc3NpZ24gJ2FvdXRfZGlyJyBhb3V0L3RyYW49Y29uYwotJCBvcGNvZGVfZGlyID0gYW91dF9kZXYrZiRwYXJzZShmbG5tLCwsIkRJUkVDVE9SWSIpJyAtCi0JLSAiR0FTXSIgKyAiSU5DTFVERS5PUENPREUuXSIgLSAiXVsiCi0kYXNzaWduICdvcGNvZGVfZGlyJyBvcGNvZGUvdHJhbj1jb25jCi0kIQotJCBzZXQgdmVyaWZ5Ci0kIQotJCBnY2MgJ2NfZmxhZ3MnL0RlZmluZT0oJ0NfREVGUycpL09iamVjdD1bXXRjLSdjcHVfdHlwZScub2JqIFsuY29uZmlnXXRjLSdjcHVfdHlwZScuYwotJCBnY2MgJ2NfZmxhZ3MnL0RlZmluZT0oJ0NfREVGUycpL09iamVjdD1bXW9iai0nb2JqX2Zvcm1hdCcub2JqIFsuY29uZmlnXW9iai0nb2JqX2Zvcm1hdCcuYwotJCBnY2MgJ2NfZmxhZ3MnL0RlZmluZT0oJ0NfREVGUycpL09iamVjdD1bXWF0b2YtJ2F0b2YnLm9iaiBbLmNvbmZpZ11hdG9mLSdhdG9mJy5jCi1FT0YKLQotY2ZpbGVzPSJgZWNobyAkKiB8IHNlZCAtZSAncy9cLm8vLmMvZycgLWUgJ3MhLi4vXChbXiAvXSpcKS9cKFteIC9dKlwuY1wpIVstLlwxXVwyIWcnYCIKLQotZm9yIGNmaWxlIGluICRjZmlsZXMgOyBkbwotICBjYXNlICRjZmlsZSBpbgotICAgICJbLS4iKikKLQliYXNlPWBlY2hvICRjZmlsZSB8IHNlZCAtZSAncy9cWy4qXF0vLycgLWUgJ3MvXC5jJC8vJ2AKLQllY2hvICJcJCBnY2MgJ2NfZmxhZ3MnL0RlZmluZT0oJ0NfREVGUycpL09iamVjdD1bXSRiYXNlLm9iaiAkY2ZpbGUiCi0JOzsKLSAgICAqKQotCWVjaG8gIlwkIGdjYyAnY19mbGFncycvRGVmaW5lPSgnQ19ERUZTJykgJGNmaWxlIgotCTs7Ci0gIGVzYWMKLWRvbmUKLQotY2F0IDw8ICdFT0YnCi0kbGluazoKLSQhJ2YkdmVyaWZ5KDApJwotJCBpZiBmJHRybmxubSgiSUZJTEUkIikubmVzLiIiIHRoZW4gIGNsb3NlL25vTG9nIGlmaWxlJAotJCBjcmVhdGUgZ2NjLWFzLm9wdAotIQotIQlMaW5rZXIgb3B0aW9ucyBmaWxlIGZvciBHTlUgYXNzZW1ibGVyCi0hCi0kIG9wZW4vQXBwZW5kIGlmaWxlJCBnY2MtYXMub3B0Ci0kIHdyaXRlIGlmaWxlJCAidGMtJydjcHVfdHlwZScub2JqIgotJCB3cml0ZSBpZmlsZSQgIm9iai0nJ29ial9mb3JtYXQnLm9iaiIKLSQgd3JpdGUgaWZpbGUkICJhdG9mLScnYXRvZicub2JqIgotJCBDT1BZIHN5cyRpbnB1dDogaWZpbGUkOgotRU9GCi0KLWZvciBvYmogaW4gJCogOyBkbwotICAjIENoYW5nZSAiZm9vLm8iIGludG8gImZvby5vYmoiLgotICBlY2hvICR7b2JqfWJqLC0gfCBzZWQgJ3MhLiovISFnJwotZG9uZQotCi1jYXQgPDwgJ0VPRicKLVstLmxpYmliZXJ0eV1saWJlcnR5Lm9sYi9MaWIKLWdudV9jYzpbMDAwMDAwXWdjY2xpYi5vbGIvTGliLHN5cyRsaWJyYXJ5OnZheGNydGwub2xiL0xpYgotISBUZWxsIGxpbmtlciBleGFjdGx5IHdoYXQgcHNlY3QgYXR0cmlidXRlcyB3ZSB3YW50IC0tIG1hdGNoIFZBWENSVEwuCi1wc2VjdF9hdHRyPUVOVklST04sbG9uZyxwaWMsb3ZyLHJlbCxnYmwsbm9zaHIsbm9leGUscmQsd3J0Ci0kIGNsb3NlIGlmaWxlJAotJCBzZXQgdmVyaWZ5PShQcm9jLG5vSW1hZykKLSQgbGluay9ub01hcC9FeGVjPWdjYy1hcy5leGUgZ2NjLWFzLm9wdC9PcHQsdmVyc2lvbi5vcHQvT3B0Ci0kIQotJGJhaWw6IGV4aXQgJHN0YXR1cyArIDAqZiR2ZXJpZnkodikJISdmJHZlcmlmeSgwKScKLUVPRgpkaWZmIC0tZ2l0IGEvZ2FzL3dyaXRlLmMgYi9nYXMvd3JpdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM4NmVjZS4uMDAwMDAwMAotLS0gYS9nYXMvd3JpdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NzcgKzAsMCBAQAotLyogd3JpdGUuYyAtIGVtaXQgLm8gZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTg2LCA4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgdGhpbmcgc2hvdWxkIGJlIHNldCB1cCB0byBkbyBieXRlb3JkZXJpbmcgY29ycmVjdGx5LiAgQnV0Li4uICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAib3V0cHV0LWZpbGUuaCIKLQotLyogVGhpcyBsb29rcyBsaWtlIGEgZ29vZCBpZGVhLiAgTGV0J3MgdHJ5IHR1cm5pbmcgaXQgb24gYWx3YXlzLCBmb3Igbm93LiAgKi8KLSN1bmRlZiAgQkZEX0ZBU1RfU0VDVElPTl9GSUxMCi0jZGVmaW5lIEJGRF9GQVNUX1NFQ1RJT05fRklMTAotCi0vKiBUaGUgTk9QX09QQ09ERSBpcyBmb3IgdGhlIGFsaWdubWVudCBmaWxsIHZhbHVlLiAgRmlsbCBpdCB3aXRoIGEgbm9wCi0gICBpbnN0cnVjdGlvbiBzbyB0aGF0IHRoZSBkaXNhc3NlbWJsZXIgZG9lcyBub3QgY2hva2Ugb24gaXQuICAqLwotI2lmbmRlZiBOT1BfT1BDT0RFCi0jZGVmaW5lIE5PUF9PUENPREUgMHgwMAotI2VuZGlmCi0KLSNpZm5kZWYgVENfQURKVVNUX1JFTE9DX0NPVU5UCi0jZGVmaW5lIFRDX0FESlVTVF9SRUxPQ19DT1VOVChGSVhQLENPVU5UKQotI2VuZGlmCi0KLSNpZm5kZWYgVENfRk9SQ0VfUkVMT0NBVElPTgotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWFApIDAKLSNlbmRpZgotCi0jaWZuZGVmIFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTgotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04oRklYUCxTRUcpIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkKLSNlbmRpZgotCi0jaWZuZGVmCU1EX1BDUkVMX0ZST01fU0VDVElPTgotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tKEZJWFApCi0jZW5kaWYKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi1leHRlcm4gQ09OU1QgaW50IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLWV4dGVybiBDT05TVCBpbnQgbWRfbG9uZ19qdW1wX3NpemU7Ci0jZW5kaWYKLQotaW50IHN5bWJvbF90YWJsZV9mcm96ZW47Ci12b2lkIHByaW50X2ZpeHVwIFBBUkFNUyAoKGZpeFMgKikpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIHZvaWQgcmVudW1iZXJfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0vKiBXZSBnZW5lcmFsbHkgYXR0YWNoIHJlbG9jcyB0byBmcmFnIGNoYWlucy4gIEhvd2V2ZXIsIGFmdGVyIHdlIGhhdmUKLSAgIGNoYWluZWQgdGhlc2UgYWxsIHRvZ2V0aGVyIGludG8gYSBzZWdtZW50LCBhbnkgcmVsb2NzIHdlIGFkZCBhZnRlcgotICAgdGhhdCBtdXN0IGJlIGF0dGFjaGVkIHRvIGEgc2VnbWVudC4gIFRoaXMgd2lsbCBpbmNsdWRlIHJlbG9jcyBhZGRlZAotICAgaW4gbWRfZXN0aW1hdGVfc2l6ZV9mb3JfcmVsYXgsIGZvciBleGFtcGxlLiAgKi8KLXN0YXRpYyBpbnQgZnJhZ3NfY2hhaW5lZCA9IDA7Ci0jZW5kaWYKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNpZm5kZWYgTUFOWV9TRUdNRU5UUwotc3RydWN0IGZyYWcgKnRleHRfZnJhZ19yb290Owotc3RydWN0IGZyYWcgKmRhdGFfZnJhZ19yb290Owotc3RydWN0IGZyYWcgKmJzc19mcmFnX3Jvb3Q7Ci0KLXN0cnVjdCBmcmFnICp0ZXh0X2xhc3RfZnJhZzsJLyogTGFzdCBmcmFnIGluIHNlZ21lbnQuICovCi1zdHJ1Y3QgZnJhZyAqZGF0YV9sYXN0X2ZyYWc7CS8qIExhc3QgZnJhZyBpbiBzZWdtZW50LiAqLwotc3RhdGljIHN0cnVjdCBmcmFnICpic3NfbGFzdF9mcmFnOwkvKiBMYXN0IGZyYWcgaW4gc2VnbWVudC4gKi8KLSNlbmRpZgotCi0jaWZuZGVmIEJGRAotc3RhdGljIG9iamVjdF9oZWFkZXJzIGhlYWRlcnM7Ci0jZW5kaWYKLQotbG9uZyBzdHJpbmdfYnl0ZV9jb3VudDsKLWNoYXIgKm5leHRfb2JqZWN0X2ZpbGVfY2hhclA7CS8qIFRyYWNrcyBvYmplY3QgZmlsZSBieXRlcy4gKi8KLQotI2lmbmRlZiBPQkpfVk1TCi1pbnQgbWFnaWNfbnVtYmVyX2Zvcl9vYmplY3RfZmlsZSA9IERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRTsKLSNlbmRpZgotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi1zdGF0aWMgaW50IG5fZml4dXBzOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIGZpeFMgKmZpeF9uZXdfaW50ZXJuYWwgUEFSQU1TICgoZnJhZ1MgKiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwKLQkJCQkgICAgICAgc3ltYm9sUyAqYWRkLCBzeW1ib2xTICpzdWIsCi0JCQkJICAgICAgIG9mZnNldFQgb2Zmc2V0LCBpbnQgcGNyZWwsCi0JCQkJICAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGUpKTsKLSNlbHNlCi1zdGF0aWMgZml4UyAqZml4X25ld19pbnRlcm5hbCBQQVJBTVMgKChmcmFnUyAqLCBpbnQgd2hlcmUsIGludCBzaXplLAotCQkJCSAgICAgICBzeW1ib2xTICphZGQsIHN5bWJvbFMgKnN1YiwKLQkJCQkgICAgICAgb2Zmc2V0VCBvZmZzZXQsIGludCBwY3JlbCwKLQkJCQkgICAgICAgaW50IHJfdHlwZSkpOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgKCFkZWZpbmVkIChCRkQpICYmICFkZWZpbmVkIChPQkpfVk1TKSkKLXN0YXRpYyBsb25nIGZpeHVwX3NlZ21lbnQgUEFSQU1TICgoZml4UyAqIGZpeFAsIHNlZ1QgdGhpc19zZWdtZW50X3R5cGUpKTsKLSNlbmRpZgotc3RhdGljIHJlbGF4X2FkZHJlc3NUIHJlbGF4X2FsaWduIFBBUkFNUyAoKHJlbGF4X2FkZHJlc3NUIGFkZHIsIGludCBhbGlnbikpOwotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICEgZGVmaW5lZCAoQkZEKQotc3RhdGljIGZyYWdTICpjaGFpbl9mcmNoYWluc190b2dldGhlcl8xIFBBUkFNUyAoKHNlZ1QsIHN0cnVjdCBmcmNoYWluICopKTsKLSNlbmRpZgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyB2b2lkIGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyIFBBUkFNUyAoKGJmZCAqLCBzZWdULCBQVFIpKTsKLXN0YXRpYyB2b2lkIGN2dF9mcmFnX3RvX2ZpbGwgUEFSQU1TICgoc2VnVCwgZnJhZ1MgKikpOwotc3RhdGljIHZvaWQgcmVsYXhfYW5kX3NpemVfc2VnIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGFkanVzdF9yZWxvY19zeW1zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBzZXRfc3ltdGFiIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICghIGRlZmluZWQgKEJGRCkgJiYgISBkZWZpbmVkIChPQkpfQU9VVCkpCi1zdGF0aWMgdm9pZCBtZXJnZV9kYXRhX2ludG9fdGV4dCBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLSNpZiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmICEgZGVmaW5lZCAoQkZEKQotc3RhdGljIHZvaWQgY3Z0X2ZyYWdfdG9fZmlsbCBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqLCBzZWdULCBmcmFnUyAqKSk7Ci1zdGF0aWMgdm9pZCByZW1vdmVfc3Vic2VncyBQQVJBTVMgKChmcmNoYWluUyAqLCBpbnQsIGZyYWdTICoqLCBmcmFnUyAqKikpOwotc3RhdGljIHZvaWQgcmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0vKgotICoJCQlmaXhfbmV3KCkKLSAqCi0gKiBDcmVhdGUgYSBmaXhTIGluIG9ic3RhY2sgJ25vdGVzJy4KLSAqLwotc3RhdGljIGZpeFMgKgotZml4X25ld19pbnRlcm5hbCAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsIHN1Yl9zeW1ib2wsIG9mZnNldCwgcGNyZWwsCi0JCSAgcl90eXBlKQotICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCi0gICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCi0gICAgIGludCBzaXplOwkJCS8qIDEsIDIsIG9yIDQgdXN1YWxseS4gKi8KLSAgICAgc3ltYm9sUyAqYWRkX3N5bWJvbDsJLyogWF9hZGRfc3ltYm9sLiAqLwotICAgICBzeW1ib2xTICpzdWJfc3ltYm9sOwkvKiBYX29wX3N5bWJvbC4gKi8KLSAgICAgb2Zmc2V0VCBvZmZzZXQ7CQkvKiBYX2FkZF9udW1iZXIuICovCi0gICAgIGludCBwY3JlbDsJCQkvKiBUUlVFIGlmIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOyAvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbHNlCi0gICAgIGludCByX3R5cGU7CQkvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbmRpZgotewotICBmaXhTICpmaXhQOwotCi0gIG5fZml4dXBzKys7Ci0KLSAgZml4UCA9IChmaXhTICopIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mIChmaXhTKSk7Ci0KLSAgZml4UC0+ZnhfZnJhZyA9IGZyYWc7Ci0gIGZpeFAtPmZ4X3doZXJlID0gd2hlcmU7Ci0gIGZpeFAtPmZ4X3NpemUgPSBzaXplOwotICAvKiBXZSd2ZSBtYWRlIGZ4X3NpemUgYSBuYXJyb3cgZmllbGQ7IGNoZWNrIHRoYXQgaXQncyB3aWRlIGVub3VnaC4gICovCi0gIGlmIChmaXhQLT5meF9zaXplICE9IHNpemUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJmaWVsZCBmeF9zaXplIHRvbyBzbWFsbCB0byBob2xkICVkIiksIHNpemUpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBmaXhQLT5meF9hZGRzeSA9IGFkZF9zeW1ib2w7Ci0gIGZpeFAtPmZ4X3N1YnN5ID0gc3ViX3N5bWJvbDsKLSAgZml4UC0+Znhfb2Zmc2V0ID0gb2Zmc2V0OwotICBmaXhQLT5meF9wY3JlbCA9IHBjcmVsOwotICBmaXhQLT5meF9wbHQgPSAwOwotI2lmIGRlZmluZWQoTkVFRF9GWF9SX1RZUEUpIHx8IGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gIGZpeFAtPmZ4X3JfdHlwZSA9IHJfdHlwZTsKLSNlbmRpZgotICBmaXhQLT5meF9pbV9kaXNwID0gMDsKLSAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gMDsKLSAgZml4UC0+ZnhfYml0X2ZpeFAgPSAwOwotICBmaXhQLT5meF9hZGRudW1iZXIgPSAwOwotICBmaXhQLT5meF90Y2JpdCA9IDA7Ci0gIGZpeFAtPmZ4X2RvbmUgPSAwOwotICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDA7Ci0gIGZpeFAtPmZ4X3NpZ25lZCA9IDA7Ci0KLSNpZmRlZiBVU0lOR19DR0VOCi0gIGZpeFAtPmZ4X2NnZW4uaW5zbiA9IE5VTEw7Ci0gIGZpeFAtPmZ4X2NnZW4ub3BpbmZvID0gMDsKLSNlbmRpZgotCi0jaWZkZWYgVENfRklYX1RZUEUKLSAgVENfSU5JVF9GSVhfREFUQShmaXhQKTsKLSNlbmRpZgotCi0gIGFzX3doZXJlICgmZml4UC0+ZnhfZmlsZSwgJmZpeFAtPmZ4X2xpbmUpOwotCi0gIC8qIFVzdWFsbHksIHdlIHdhbnQgcmVsb2NzIHNvcnRlZCBudW1lcmljYWxseSwgYnV0IHdoaWxlCi0gICAgIGNvbXBhcmluZyB0byBvbGRlciB2ZXJzaW9ucyBvZiBnYXMgdGhhdCBoYXZlIHJlbG9jcwotICAgICByZXZlcnNlIHNvcnRlZCwgaXQgaXMgY29udmVuaWVudCB0byBoYXZlIHRoaXMgY29tcGlsZQotICAgICB0aW1lIG9wdGlvbi4gIHhveG9yaWNoLiAqLwotCi0gIHsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICBmaXhTICoqc2VnX2ZpeF9yb290UCA9IChmcmFnc19jaGFpbmVkCi0JCQkgICAgPyAmc2VnX2luZm8gKG5vd19zZWcpLT5maXhfcm9vdAotCQkJICAgIDogJmZyY2hhaW5fbm93LT5maXhfcm9vdCk7Ci0gICAgZml4UyAqKnNlZ19maXhfdGFpbFAgPSAoZnJhZ3NfY2hhaW5lZAotCQkJICAgID8gJnNlZ19pbmZvIChub3dfc2VnKS0+Zml4X3RhaWwKLQkJCSAgICA6ICZmcmNoYWluX25vdy0+Zml4X3RhaWwpOwotI2VuZGlmCi0KLSNpZmRlZiBSRVZFUlNFX1NPUlRfUkVMT0NTCi0KLSAgICBmaXhQLT5meF9uZXh0ID0gKnNlZ19maXhfcm9vdFA7Ci0gICAgKnNlZ19maXhfcm9vdFAgPSBmaXhQOwotCi0jZWxzZSAvKiBSRVZFUlNFX1NPUlRfUkVMT0NTICovCi0KLSAgICBmaXhQLT5meF9uZXh0ID0gTlVMTDsKLQotICAgIGlmICgqc2VnX2ZpeF90YWlsUCkKLSAgICAgICgqc2VnX2ZpeF90YWlsUCktPmZ4X25leHQgPSBmaXhQOwotICAgIGVsc2UKLSAgICAgICpzZWdfZml4X3Jvb3RQID0gZml4UDsKLSAgICAqc2VnX2ZpeF90YWlsUCA9IGZpeFA7Ci0KLSNlbmRpZiAvKiBSRVZFUlNFX1NPUlRfUkVMT0NTICovCi0KLSAgfQotCi0gIHJldHVybiBmaXhQOwotfQotCi0vKiBDcmVhdGUgYSBmaXh1cCByZWxhdGl2ZSB0byBhIHN5bWJvbCAocGx1cyBhIGNvbnN0YW50KS4gICovCi0KLWZpeFMgKgotZml4X25ldyAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsIG9mZnNldCwgcGNyZWwsIHJfdHlwZSkKLSAgICAgZnJhZ1MgKmZyYWc7CQkvKiBXaGljaCBmcmFnPyAqLwotICAgICBpbnQgd2hlcmU7CQkJLyogV2hlcmUgaW4gdGhhdCBmcmFnPyAqLwotICAgICBpbnQgc2l6ZTsJCQkvKiAxLCAyLCBvciA0IHVzdWFsbHkuICovCi0gICAgIHN5bWJvbFMgKmFkZF9zeW1ib2w7CS8qIFhfYWRkX3N5bWJvbC4gKi8KLSAgICAgb2Zmc2V0VCBvZmZzZXQ7CQkvKiBYX2FkZF9udW1iZXIuICovCi0gICAgIGludCBwY3JlbDsJCQkvKiBUUlVFIGlmIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOyAvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbHNlCi0gICAgIGludCByX3R5cGU7CQkvKiBSZWxvY2F0aW9uIHR5cGUgKi8KLSNlbmRpZgotewotICByZXR1cm4gZml4X25ld19pbnRlcm5hbCAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsCi0JCQkgICAoc3ltYm9sUyAqKSBOVUxMLCBvZmZzZXQsIHBjcmVsLCByX3R5cGUpOwotfQotCi0vKiBDcmVhdGUgYSBmaXh1cCBmb3IgYW4gZXhwcmVzc2lvbi4gIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgZml4dXBzCi0gICBmb3IgZGlmZmVyZW5jZSBleHByZXNzaW9ucy4gIFRoYXQgaXMgaXRzZWxmIG1vcmUgdGhhbiBtb3N0IG9iamVjdAotICAgZmlsZSBmb3JtYXRzIHN1cHBvcnQgYW55aG93LiAgKi8KLQotZml4UyAqCi1maXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsIHJfdHlwZSkKLSAgICAgZnJhZ1MgKmZyYWc7CQkvKiBXaGljaCBmcmFnPyAqLwotICAgICBpbnQgd2hlcmU7CQkJLyogV2hlcmUgaW4gdGhhdCBmcmFnPyAqLwotICAgICBpbnQgc2l6ZTsJCQkvKiAxLCAyLCBvciA0IHVzdWFsbHkuICovCi0gICAgIGV4cHJlc3Npb25TICpleHA7CQkvKiBFeHByZXNzaW9uLiAgKi8KLSAgICAgaW50IHBjcmVsOwkJCS8qIFRSVUUgaWYgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGU7IC8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2Vsc2UKLSAgICAgaW50IHJfdHlwZTsJCS8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2VuZGlmCi17Ci0gIHN5bWJvbFMgKmFkZCA9IE5VTEw7Ci0gIHN5bWJvbFMgKnN1YiA9IE5VTEw7Ci0gIG9mZnNldFQgb2ZmID0gMDsKLQotICBzd2l0Y2ggKGV4cC0+WF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2Fic2VudDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX2FkZDoKLSAgICAgIC8qIFRoaXMgY29tZXMgdXAgd2hlbiBfR0xPQkFMX09GRlNFVF9UQUJMRV8rKC4tTDApIGlzIHJlYWQsIGlmCi0JIHRoZSBkaWZmZXJlbmNlIGV4cHJlc3Npb24gY2Fubm90IGltbWVkaWF0ZWx5IGJlIHJlZHVjZWQuICAqLwotICAgICAgewotCXN5bWJvbFMgKnN0bXAgPSBtYWtlX2V4cHJfc3ltYm9sIChleHApOwotCWV4cC0+WF9vcCA9IE9fc3ltYm9sOwotCWV4cC0+WF9vcF9zeW1ib2wgPSAwOwotCWV4cC0+WF9hZGRfc3ltYm9sID0gc3RtcDsKLQlleHAtPlhfYWRkX251bWJlciA9IDA7Ci0JcmV0dXJuIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY3JlbCwgcl90eXBlKTsKLSAgICAgIH0KLQotICAgIGNhc2UgT19zeW1ib2xfcnZhOgotICAgICAgYWRkID0gZXhwLT5YX2FkZF9zeW1ib2w7Ci0gICAgICBvZmYgPSBleHAtPlhfYWRkX251bWJlcjsKLQotI2lmIGRlZmluZWQoQkZEX0FTU0VNQkxFUikKLSAgICAgIHJfdHlwZSA9IEJGRF9SRUxPQ19SVkE7Ci0jZWxzZQotI2lmIGRlZmluZWQoVENfUlZBX1JFTE9DKQotICAgICAgcl90eXBlID0gVENfUlZBX1JFTE9DOwotI2Vsc2UKLSAgICAgIGFzX2ZhdGFsKF8oInJ2YSBub3Qgc3VwcG9ydGVkIikpOwotI2VuZGlmCi0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX3VtaW51czoKLSAgICAgIHN1YiA9IGV4cC0+WF9hZGRfc3ltYm9sOwotICAgICAgb2ZmID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19zdWJ0cmFjdDoKLSAgICAgIHN1YiA9IGV4cC0+WF9vcF9zeW1ib2w7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBhZGQgPSBleHAtPlhfYWRkX3N5bWJvbDsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICAqLwotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIG9mZiA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWRkID0gbWFrZV9leHByX3N5bWJvbCAoZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gZml4X25ld19pbnRlcm5hbCAoZnJhZywgd2hlcmUsIHNpemUsIGFkZCwgc3ViLCBvZmYsCi0JCQkgICBwY3JlbCwgcl90eXBlKTsKLX0KLQotLyogQXBwZW5kIGEgc3RyaW5nIG9udG8gYW5vdGhlciBzdHJpbmcsIGJ1bXBpbmcgdGhlIHBvaW50ZXIgYWxvbmcuICAqLwotdm9pZAotYXBwZW5kIChjaGFyUFAsIGZyb21QLCBsZW5ndGgpCi0gICAgIGNoYXIgKipjaGFyUFA7Ci0gICAgIGNoYXIgKmZyb21QOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLXsKLSAgLyogRG9uJ3QgdHJ1c3QgbWVtY3B5KCkgb2YgMCBjaGFycy4gKi8KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHJldHVybjsKLQotICBtZW1jcHkgKCpjaGFyUFAsIGZyb21QLCBsZW5ndGgpOwotICAqY2hhclBQICs9IGxlbmd0aDsKLX0KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi1pbnQgc2VjdGlvbl9hbGlnbm1lbnRbU0VHX01BWElNVU1fT1JESU5BTF07Ci0jZW5kaWYKLQotLyoKLSAqIFRoaXMgcm91dGluZSByZWNvcmRzIHRoZSBsYXJnZXN0IGFsaWdubWVudCBzZWVuIGZvciBlYWNoIHNlZ21lbnQuCi0gKiBJZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWdtZW50IGlzIGFsaWduZWQgb24gdGhlIHdvcnN0LWNhc2UKLSAqIGJvdW5kYXJ5LCBhbGwgb2YgdGhlIG90aGVyIGFsaWdubWVudHMgd2l0aGluIGl0IHdpbGwgd29yay4gIEF0Ci0gKiBsZWFzdCBvbmUgb2JqZWN0IGZvcm1hdCByZWFsbHkgdXNlcyB0aGlzIGluZm8uCi0gKi8KLXZvaWQKLXJlY29yZF9hbGlnbm1lbnQgKHNlZywgYWxpZ24pCi0gICAgIC8qIFNlZ21lbnQgdG8gd2hpY2ggYWxpZ25tZW50IHBlcnRhaW5zICovCi0gICAgIHNlZ1Qgc2VnOwotICAgICAvKiBBbGlnbm1lbnQsIGFzIGEgcG93ZXIgb2YgMiAoZS5nLiwgMSA9PiAyLWJ5dGUgYm91bmRhcnksIDIgPT4gNC1ieXRlCi0JYm91bmRhcnksIGV0Yy4pICAqLwotICAgICBpbnQgYWxpZ247Ci17Ci0gIGlmIChzZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICByZXR1cm47Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoKHVuc2lnbmVkIGludCkgYWxpZ24gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZykpCi0gICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcsIGFsaWduKTsKLSNlbHNlCi0gIGlmIChhbGlnbiA+IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pCi0gICAgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSA9IGFsaWduOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLS8qIFJlc2V0IHRoZSBzZWN0aW9uIGluZGljZXMgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdhcyBjcmVhdGVkIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXJlbnVtYmVyX3NlY3Rpb25zIChhYmZkLCBzZWMsIGNvdW50cGFyZykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBjb3VudHBhcmc7Ci17Ci0gIGludCAqY291bnRwID0gKGludCAqKSBjb3VudHBhcmc7Ci0KLSAgc2VjLT5pbmRleCA9ICpjb3VudHA7Ci0gICsrKmNvdW50cDsKLX0KLQotI2VuZGlmIC8qIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICovCi0KLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhIGRlZmluZWQgKEJGRCkKLQotc3RhdGljIGZyYWdTICoKLWNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEgKHNlY3Rpb24sIGZyY2hwKQotICAgICBzZWdUIHNlY3Rpb247Ci0gICAgIHN0cnVjdCBmcmNoYWluICpmcmNocDsKLXsKLSAgZnJhZ1MgZHVtbXksICpwcmV2X2ZyYWcgPSAmZHVtbXk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmaXhTIGZpeF9kdW1teSwgKnByZXZfZml4ID0gJmZpeF9kdW1teTsKLSNlbmRpZgotCi0gIGZvciAoOyBmcmNocCAmJiBmcmNocC0+ZnJjaF9zZWcgPT0gc2VjdGlvbjsgZnJjaHAgPSBmcmNocC0+ZnJjaF9uZXh0KQotICAgIHsKLSAgICAgIHByZXZfZnJhZy0+ZnJfbmV4dCA9IGZyY2hwLT5mcmNoX3Jvb3Q7Ci0gICAgICBwcmV2X2ZyYWcgPSBmcmNocC0+ZnJjaF9sYXN0OwotICAgICAgYXNzZXJ0IChwcmV2X2ZyYWctPmZyX3R5cGUgIT0gMCk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgaWYgKGZyY2hwLT5maXhfcm9vdCAhPSAoZml4UyAqKSBOVUxMKQotCXsKLQkgIGlmIChzZWdfaW5mbyAoc2VjdGlvbiktPmZpeF9yb290ID09IChmaXhTICopIE5VTEwpCi0JICAgIHNlZ19pbmZvIChzZWN0aW9uKS0+Zml4X3Jvb3QgPSBmcmNocC0+Zml4X3Jvb3Q7Ci0JICBwcmV2X2ZpeC0+ZnhfbmV4dCA9IGZyY2hwLT5maXhfcm9vdDsKLQkgIHNlZ19pbmZvIChzZWN0aW9uKS0+Zml4X3RhaWwgPSBmcmNocC0+Zml4X3RhaWw7Ci0JICBwcmV2X2ZpeCA9IGZyY2hwLT5maXhfdGFpbDsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0gIGFzc2VydCAocHJldl9mcmFnLT5mcl90eXBlICE9IDApOwotICBwcmV2X2ZyYWctPmZyX25leHQgPSAwOwotICByZXR1cm4gcHJldl9mcmFnOwotfQotCi0jZW5kaWYKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotc3RhdGljIHZvaWQKLWNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyIChhYmZkLCBzZWN0aW9uLCB4eHgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzZWdUIHNlY3Rpb247Ci0gICAgIFBUUiB4eHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKmluZm87Ci0KLSAgLyogQkZEIG1heSBoYXZlIGludHJvZHVjZWQgaXRzIG93biBzZWN0aW9ucyB3aXRob3V0IHVzaW5nCi0gICAgIHN1YnNlZ19uZXcsIHNvIGl0IGlzIHBvc3NpYmxlIHRoYXQgc2VnX2luZm8gaXMgTlVMTC4gICovCi0gIGluZm8gPSBzZWdfaW5mbyAoc2VjdGlvbik7Ci0gIGlmIChpbmZvICE9IChzZWdtZW50X2luZm9fdHlwZSAqKSBOVUxMKQotICAgaW5mby0+ZnJjaGFpblAtPmZyY2hfbGFzdAotICAgICA9IGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEgKHNlY3Rpb24sIGluZm8tPmZyY2hhaW5QKTsKLQotICAvKiBOb3cgdGhhdCB3ZSd2ZSBjaGFpbmVkIHRoZSBmcmFncyB0b2dldGhlciwgd2UgbXVzdCBhZGQgbmV3IGZpeHVwcwotICAgICB0byB0aGUgc2VnbWVudCwgbm90IHRvIHRoZSBmcmFnIGNoYWluLiAgKi8KLSAgZnJhZ3NfY2hhaW5lZCA9IDE7Ci19Ci0KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKEJGRCkgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfc3Vic2VncyAoaGVhZCwgc2VnLCByb290LCBsYXN0KQotICAgICBmcmNoYWluUyAqaGVhZDsKLSAgICAgaW50IHNlZzsKLSAgICAgZnJhZ1MgKipyb290OwotICAgICBmcmFnUyAqKmxhc3Q7Ci17Ci0gICpyb290ID0gaGVhZC0+ZnJjaF9yb290OwotICAqbGFzdCA9IGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEgKHNlZywgaGVhZCk7Ci19Ci0KLSNlbmRpZiAvKiBCRkQgKi8KLQotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICFkZWZpbmVkIChCRkQpCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgdm9pZAotY3Z0X2ZyYWdfdG9fZmlsbCAoc2VjLCBmcmFnUCkKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGZyYWdTICpmcmFnUDsKLSNlbHNlCi1zdGF0aWMgdm9pZAotY3Z0X2ZyYWdfdG9fZmlsbCAoaGVhZGVyc1AsIHNlYywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzUDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGZyYWdTICpmcmFnUDsKLSNlbmRpZgotewotICBzd2l0Y2ggKGZyYWdQLT5mcl90eXBlKQotICAgIHsKLSAgICBjYXNlIHJzX2FsaWduOgotICAgIGNhc2UgcnNfYWxpZ25fY29kZToKLSAgICBjYXNlIHJzX29yZzoKLSAgICBjYXNlIHJzX3NwYWNlOgotI2lmZGVmIEhBTkRMRV9BTElHTgotICAgICAgSEFORExFX0FMSUdOIChmcmFnUCk7Ci0jZW5kaWYKLSAgICAgIGtub3cgKGZyYWdQLT5mcl9uZXh0ICE9IE5VTEwpOwotICAgICAgZnJhZ1AtPmZyX29mZnNldCA9IChmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcwotCQkJICAtIGZyYWdQLT5mcl9hZGRyZXNzCi0JCQkgIC0gZnJhZ1AtPmZyX2ZpeCkgLyBmcmFnUC0+ZnJfdmFyOwotICAgICAgaWYgKGZyYWdQLT5mcl9vZmZzZXQgPCAwKQotCXsKLQkgIGFzX2JhZF93aGVyZSAoZnJhZ1AtPmZyX2ZpbGUsIGZyYWdQLT5mcl9saW5lLAotCQkJXygiYXR0ZW1wdCB0byAub3JnLy5zcGFjZSBiYWNrd2FyZHM/ICglbGQpIiksCi0JCQkobG9uZykgZnJhZ1AtPmZyX29mZnNldCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX3R5cGUgPSByc19maWxsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHJzX2ZpbGw6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcnNfbGViMTI4OgotICAgICAgewotCXZhbHVlVCB2YWx1ZSA9IFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKTsKLQlpbnQgc2l6ZTsKLQotCXNpemUgPSBvdXRwdXRfbGViMTI4IChmcmFnUC0+ZnJfbGl0ZXJhbCArIGZyYWdQLT5mcl9maXgsIHZhbHVlLAotCQkJICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUpOwotCi0JZnJhZ1AtPmZyX2ZpeCArPSBzaXplOwotCWZyYWdQLT5mcl90eXBlID0gcnNfZmlsbDsKLQlmcmFnUC0+ZnJfdmFyID0gMDsKLQlmcmFnUC0+ZnJfb2Zmc2V0ID0gMDsKLQlmcmFnUC0+ZnJfc3ltYm9sID0gTlVMTDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSByc19jZmE6Ci0gICAgICBlaF9mcmFtZV9jb252ZXJ0X2ZyYWcgKGZyYWdQKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBtZF9jb252ZXJ0X2ZyYWcgKHN0ZG91dHB1dCwgc2VjLCBmcmFnUCk7Ci0jZWxzZQotICAgICAgbWRfY29udmVydF9mcmFnIChoZWFkZXJzUCwgc2VjLCBmcmFnUCk7Ci0jZW5kaWYKLQotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfbmV4dCA9PSBOVUxMCi0JICAgICAgfHwgKChvZmZzZXRUKSAoZnJhZ1AtPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFnUC0+ZnJfYWRkcmVzcykKLQkJICA9PSBmcmFnUC0+ZnJfZml4KSk7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBBZnRlciBtZF9jb252ZXJ0X2ZyYWcsIHdlIG1ha2UgdGhlIGZyYWcgaW50byBhICIuc3BhY2UgMCIuCi0gICAgICAgKiBNZF9jb252ZXJ0X2ZyYWcoKSBzaG91bGQgc2V0IHVwIGFueSBmaXhTcyBhbmQgY29uc3RhbnRzCi0gICAgICAgKiByZXF1aXJlZC4KLSAgICAgICAqLwotICAgICAgZnJhZ193YW5lIChmcmFnUCk7Ci0gICAgICBicmVhazsKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0gICAgY2FzZSByc19icm9rZW5fd29yZDoKLSAgICAgIHsKLQlzdHJ1Y3QgYnJva2VuX3dvcmQgKmxpZTsKLQotCWlmIChmcmFnUC0+ZnJfc3VidHlwZSkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSBtZF9zaG9ydF9qdW1wX3NpemU7Ci0JICAgIGZvciAobGllID0gKHN0cnVjdCBicm9rZW5fd29yZCAqKSAoZnJhZ1AtPmZyX3N5bWJvbCk7Ci0JCSBsaWUgJiYgbGllLT5kaXNwZnJhZyA9PSBmcmFnUDsKLQkJIGxpZSA9IGxpZS0+bmV4dF9icm9rZW5fd29yZCkKLQkgICAgICBpZiAobGllLT5hZGRlZCA9PSAxKQotCQlmcmFnUC0+ZnJfZml4ICs9IG1kX2xvbmdfanVtcF9zaXplOwotCSAgfQotCWZyYWdfd2FuZSAoZnJhZ1ApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3R5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgIWRlZmluZWQgKEJGRCkgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyB2b2lkCi1yZWxheF9hbmRfc2l6ZV9zZWcgKGFiZmQsIHNlYywgeHh4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4eHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGZyYWdTICpmcmFncDsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0gIGludCB4OwotICB2YWx1ZVQgc2l6ZSwgbmV3c2l6ZTsKLQotICBzdWJzZWdfY2hhbmdlIChzZWMsIDApOwotCi0gIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpOwotCi0gIHNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgaWYgKHNlZ2luZm8gJiYgc2VnaW5mby0+ZnJjaGFpblApCi0gICAgewotICAgICAgcmVsYXhfc2VnbWVudCAoc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfcm9vdCwgc2VjKTsKLSAgICAgIGZvciAoZnJhZ3AgPSBzZWdpbmZvLT5mcmNoYWluUC0+ZnJjaF9yb290OyBmcmFncDsgZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dCkKLQljdnRfZnJhZ190b19maWxsIChzZWMsIGZyYWdwKTsKLSAgICAgIGZvciAoZnJhZ3AgPSBzZWdpbmZvLT5mcmNoYWluUC0+ZnJjaF9yb290OwotCSAgIGZyYWdwLT5mcl9uZXh0OwotCSAgIGZyYWdwID0gZnJhZ3AtPmZyX25leHQpCi0JLyogd2FsayB0byBsYXN0IGVsdCAqLzsKLSAgICAgIHNpemUgPSBmcmFncC0+ZnJfYWRkcmVzcyArIGZyYWdwLT5mcl9maXg7Ci0gICAgfQotICBlbHNlCi0gICAgc2l6ZSA9IDA7Ci0KLSAgaWYgKHNpemUgPiAwICYmICEgc2VnaW5mby0+YnNzKQotICAgIGZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgLyogQEAgVGhpcyBpcyBqdXN0IGFuIGFwcHJveGltYXRpb24uICAqLwotICBpZiAoc2VnaW5mbyAmJiBzZWdpbmZvLT5maXhfcm9vdCkKLSAgICBmbGFncyB8PSBTRUNfUkVMT0M7Ci0gIGVsc2UKLSAgICBmbGFncyAmPSB+U0VDX1JFTE9DOwotICB4ID0gYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzKTsKLSAgYXNzZXJ0ICh4ID09IHRydWUpOwotCi0gIG5ld3NpemUgPSBtZF9zZWN0aW9uX2FsaWduIChzZWMsIHNpemUpOwotICB4ID0gYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYywgbmV3c2l6ZSk7Ci0gIGFzc2VydCAoeCA9PSB0cnVlKTsKLQotICAvKiBJZiB0aGUgc2l6ZSBoYWQgdG8gYmUgcm91bmRlZCB1cCwgYWRkIHNvbWUgcGFkZGluZyBpbiB0aGUgbGFzdAotICAgICBub24tZW1wdHkgZnJhZy4gICovCi0gIGFzc2VydCAobmV3c2l6ZSA+PSBzaXplKTsKLSAgaWYgKHNpemUgIT0gbmV3c2l6ZSkKLSAgICB7Ci0gICAgICBmcmFnUyAqbGFzdCA9IHNlZ2luZm8tPmZyY2hhaW5QLT5mcmNoX2xhc3Q7Ci0gICAgICBmcmFncCA9IHNlZ2luZm8tPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0gICAgICB3aGlsZSAoZnJhZ3AtPmZyX25leHQgIT0gbGFzdCkKLQlmcmFncCA9IGZyYWdwLT5mcl9uZXh0OwotICAgICAgbGFzdC0+ZnJfYWRkcmVzcyA9IHNpemU7Ci0gICAgICBmcmFncC0+ZnJfb2Zmc2V0ICs9IG5ld3NpemUgLSBzaXplOwotICAgIH0KLQotI2lmZGVmIHRjX2Zyb2Jfc2VjdGlvbgotICB0Y19mcm9iX3NlY3Rpb24gKHNlYyk7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfZnJvYl9zZWN0aW9uCi0gIG9ial9mcm9iX3NlY3Rpb24gKHNlYyk7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIERFQlVHMgotc3RhdGljIHZvaWQKLWR1bXBfc2VjdGlvbl9yZWxvY3MgKGFiZmQsIHNlYywgc3RyZWFtXykKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNoYXIgKnN0cmVhbV87Ci17Ci0gIEZJTEUgKnN0cmVhbSA9IChGSUxFICopIHN0cmVhbV87Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGZpeFMgKmZpeHAgPSBzZWdpbmZvLT5maXhfcm9vdDsKLQotICBpZiAoIWZpeHApCi0gICAgcmV0dXJuOwotCi0gIGZwcmludGYgKHN0cmVhbSwgInNlYyAlcyByZWxvY3M6XG4iLCBzZWMtPm5hbWUpOwotICB3aGlsZSAoZml4cCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzID0gZml4cC0+ZnhfYWRkc3k7Ci0KLSAgICAgIGZwcmludGYgKHN0cmVhbSwgIiAgJTA4bHg6IHR5cGUgJWQgIiwgKHVuc2lnbmVkIGxvbmcpIGZpeHAsCi0JICAgICAgIChpbnQpIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCWZwcmludGYgKHN0cmVhbSwgIm5vIHN5bVxuIik7Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKHN0cmVhbSwgcyk7Ci0JICBmcHJpbnRmIChzdHJlYW0sICJcbiIpOwotCX0KLSAgICAgIGZpeHAgPSBmaXhwLT5meF9uZXh0OwotICAgIH0KLX0KLSNlbHNlCi0jZGVmaW5lIGR1bXBfc2VjdGlvbl9yZWxvY3MoQUJGRCxTRUMsU1RSRUFNKQkoKHZvaWQpIDApCi0jZW5kaWYKLQotI2lmbmRlZiBFTUlUX1NFQ1RJT05fU1lNQk9MUwotI2RlZmluZSBFTUlUX1NFQ1RJT05fU1lNQk9MUyAxCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLWFkanVzdF9yZWxvY19zeW1zIChhYmZkLCBzZWMsIHh4eCkKLSAgICAgYmZkICphYmZkIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4eHggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgZml4UyAqZml4cDsKLQotICBpZiAoc2VnaW5mbyA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBkdW1wX3NlY3Rpb25fcmVsb2NzIChhYmZkLCBzZWMsIHN0ZGVycik7Ci0KLSAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHA7IGZpeHAgPSBmaXhwLT5meF9uZXh0KQotICAgIGlmIChmaXhwLT5meF9kb25lKQotICAgICAgLyogaWdub3JlIGl0ICovOwotICAgIGVsc2UgaWYgKGZpeHAtPmZ4X2FkZHN5KQotICAgICAgewotCXN5bWJvbFMgKnN5bTsKLQlhc2VjdGlvbiAqc3ltc2VjOwotCi0jaWZkZWYgREVCVUc1Ci0JZnByaW50ZiAoc3RkZXJyLCAiXG5cbmFkanVzdGluZyBmaXh1cDpcbiIpOwotCXByaW50X2ZpeHVwIChmaXhwKTsKLSNlbmRpZgotCi0Jc3ltID0gZml4cC0+ZnhfYWRkc3k7Ci0KLQkvKiBBbGwgc3ltYm9scyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQgYXQgdGhpcwotCSAgIHBvaW50LiAgSXQgaXMgcG9zc2libGUgdG8gc2VlIHVucmVzb2x2ZWQgZXhwcmVzc2lvbgotCSAgIHN5bWJvbHMsIHRob3VnaCwgc2luY2UgdGhleSBhcmUgbm90IGluIHRoZSByZWd1bGFyIHN5bWJvbAotCSAgIHRhYmxlLiAgKi8KLQlpZiAoc3ltICE9IE5VTEwpCi0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltLCAxKTsKLQkKLQlpZiAoZml4cC0+Znhfc3Vic3kgIT0gTlVMTCkKLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmaXhwLT5meF9zdWJzeSwgMSk7Ci0KLQkvKiBJZiB0aGlzIHN5bWJvbCBpcyBlcXVhdGVkIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wsIGNvbnZlcnQKLSAgICAgICAgICAgdGhlIGZpeHVwIHRvIGJlaW5nIGFnYWluc3QgdGhhdCBzeW1ib2wuICAqLwotCWlmIChzeW0gIT0gTlVMTCAmJiBzeW1ib2xfZXF1YXRlZF9wIChzeW0pCi0JICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkpCi0JICB7Ci0JICAgIGZpeHAtPmZ4X29mZnNldCArPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSktPlhfYWRkX251bWJlcjsKLQkgICAgc3ltID0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzeW0pLT5YX2FkZF9zeW1ib2w7Ci0JICAgIGZpeHAtPmZ4X2FkZHN5ID0gc3ltOwotCSAgfQotCi0JaWYgKHN5bSAhPSBOVUxMICYmIHN5bWJvbF9tcmlfY29tbW9uX3AgKHN5bSkpCi0JICB7Ci0JICAgIC8qIFRoZXNlIHN5bWJvbHMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGluIGZpeHVwX3NlZ21lbnQuICAqLwotCSAgICBnb3RvIGRvbmU7Ci0JICB9Ci0KLQlzeW1zZWMgPSBTX0dFVF9TRUdNRU5UIChzeW0pOwotCi0JaWYgKHN5bXNlYyA9PSBOVUxMKQotCSAgYWJvcnQgKCk7Ci0JCi0JaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltc2VjKSkKLQkgIHsKLQkgICAgLyogVGhlIGZpeHVwX3NlZ21lbnQgcm91dGluZSB3aWxsIG5vdCB1c2UgdGhpcyBzeW1ib2wgaW4gYQotICAgICAgICAgICAgICAgcmVsb2NhdGlvbiB1bmxlc3MgVENfRk9SQ0VfUkVMT0NBVElPTiByZXR1cm5zIDEuICAqLwotCSAgICBpZiAoVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4cCkpCi0JICAgICAgewotCQlzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0jaWZkZWYgVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sKLQkJaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IE5VTEwpCi0JCSAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+Znhfc3Vic3kpOwotI2VuZGlmCi0JICAgICAgfQotCSAgICBnb3RvIGRvbmU7Ci0JICB9Ci0KLQkvKiBJZiBpdCdzIG9uZSBvZiB0aGVzZSBzZWN0aW9ucywgYXNzdW1lIHRoZSBzeW1ib2wgaXMKLQkgICBkZWZpbml0ZWx5IGdvaW5nIHRvIGJlIG91dHB1dC4gIFRoZSBjb2RlIGluCi0JICAgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggaW4gdGMtbWlwcy5jIHVzZXMgdGhpcyB0ZXN0Ci0JICAgYXMgd2VsbCwgc28gaWYgeW91IGNoYW5nZSB0aGlzIGNvZGUgeW91IHNob3VsZCBsb29rIGF0IHRoYXQKLQkgICBjb2RlLiAgKi8KLQlpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1zZWMpCi0JICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltc2VjKSkKLQkgIHsKLQkgICAgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+ZnhfYWRkc3kpOwotI2lmZGVmIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LCi0JICAgIC8qIFdlIGhhdmUgdGhlIGRpZmZlcmVuY2Ugb2YgYW4gdW5kZWZpbmVkIHN5bWJvbCBhbmQgc29tZQotCSAgICAgICBvdGhlciBzeW1ib2wuICBNYWtlIHN1cmUgdG8gbWFyayB0aGUgb3RoZXIgc3ltYm9sIGFzIHVzZWQKLQkgICAgICAgaW4gYSByZWxvY2F0aW9uIHNvIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgb3V0cHV0LiAgKi8KLQkgICAgaWYgKGZpeHAtPmZ4X3N1YnN5KQotCSAgICAgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X3N1YnN5KTsKLSNlbmRpZgotCSAgICBnb3RvIGRvbmU7Ci0JICB9Ci0KLQkvKiBEb24ndCB0cnkgdG8gcmVkdWNlIHJlbG9jcyB3aGljaCByZWZlciB0byBub24tbG9jYWwgc3ltYm9scwotICAgICAgICAgICBpbiAubGlua29uY2Ugc2VjdGlvbnMuICBJdCBjYW4gbGVhZCB0byBjb25mdXNpb24gd2hlbiBhCi0gICAgICAgICAgIGRlYnVnZ2luZyBzZWN0aW9uIHJlZmVycyB0byBhIC5saW5rb25jZSBzZWN0aW9uLiAgSSBob3BlCi0gICAgICAgICAgIHRoaXMgd2lsbCBhbHdheXMgYmUgY29ycmVjdC4gICovCi0JaWYgKHN5bXNlYyAhPSBzZWMgJiYgISBTX0lTX0xPQ0FMIChzeW0pKQotCSAgewotCSAgICBib29sZWFuIGxpbmtvbmNlOwotCi0JICAgIGxpbmtvbmNlID0gZmFsc2U7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzeW1zZWMpICYgU0VDX0xJTktfT05DRSkKLQkJIT0gMCkKLQkgICAgICBsaW5rb25jZSA9IHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0JICAgIC8qIFRoZSBHTlUgdG9vbGNoYWluIHVzZXMgYW4gZXh0ZW5zaW9uIGZvciBFTEY6IGEgc2VjdGlvbgotICAgICAgICAgICAgICAgYmVnaW5uaW5nIHdpdGggdGhlIG1hZ2ljIHN0cmluZyAuZ251LmxpbmtvbmNlIGlzIGEKLSAgICAgICAgICAgICAgIGxpbmtvbmNlIHNlY3Rpb24uICAqLwotCSAgICBpZiAoc3RybmNtcCAoc2VnbWVudF9uYW1lIChzeW1zZWMpLCAiLmdudS5saW5rb25jZSIsCi0JCQkgc2l6ZW9mICIuZ251LmxpbmtvbmNlIiAtIDEpID09IDApCi0JICAgICAgbGlua29uY2UgPSB0cnVlOwotI2VuZGlmCi0KLQkgICAgaWYgKGxpbmtvbmNlKQotCSAgICAgIHsKLQkJc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+ZnhfYWRkc3kpOwotI2lmZGVmIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LCi0JCWlmIChmaXhwLT5meF9zdWJzeSAhPSBOVUxMKQotCQkgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X3N1YnN5KTsKLSNlbmRpZgotCQlnb3RvIGRvbmU7Ci0JICAgICAgfQotCSAgfQotCi0JLyogU2luY2Ugd2UncmUgcmVkdWNpbmcgdG8gc2VjdGlvbiBzeW1ib2xzLCBkb24ndCBhdHRlbXB0IHRvIHJlZHVjZQotCSAgIGFueXRoaW5nIHRoYXQncyBhbHJlYWR5IHVzaW5nIG9uZS4gICovCi0JaWYgKHN5bWJvbF9zZWN0aW9uX3AgKHN5bSkpCi0JICB7Ci0JICAgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X2FkZHN5KTsKLQkgICAgZ290byBkb25lOwotCSAgfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCS8qIFdlIGNhbiBuZXZlciBhZGp1c3QgYSByZWxvYyBhZ2FpbnN0IGEgd2VhayBzeW1ib2wuICBJZiB3ZQotICAgICAgICAgICBkaWQsIGFuZCB0aGUgd2VhayBzeW1ib2wgd2FzIG92ZXJyaWRkZW4gYnkgYSByZWFsIHN5bWJvbAotICAgICAgICAgICBzb21ld2hlcmUgZWxzZSwgdGhlbiBvdXIgcmVsb2NhdGlvbiB3b3VsZCBiZSBwb2ludGluZyBhdAotICAgICAgICAgICB0aGUgd3JvbmcgYXJlYSBvZiBtZW1vcnkuICAqLwotCWlmIChTX0lTX1dFQUsgKHN5bSkpCi0JICB7Ci0JICAgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X2FkZHN5KTsKLQkgICAgZ290byBkb25lOwotCSAgfQotI2VuZGlmCi0KLQkvKiBJcyB0aGVyZSBzb21lIG90aGVyIHJlYXNvbiB3ZSBjYW4ndCBhZGp1c3QgdGhpcyBvbmU/ICAoRS5nLiwKLQkgICBjYWxsL2JhbCBsaW5rcyBpbiBpOTYwLWJvdXQgc3ltYm9scy4pICAqLwotI2lmZGVmIG9ial9maXhfYWRqdXN0YWJsZQotCWlmICghIG9ial9maXhfYWRqdXN0YWJsZSAoZml4cCkpCi0JICB7Ci0JICAgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X2FkZHN5KTsKLQkgICAgZ290byBkb25lOwotCSAgfQotI2VuZGlmCi0KLQkvKiBJcyB0aGVyZSBzb21lIG90aGVyICh0YXJnZXQgY3B1IGRlcGVuZGVudCkgcmVhc29uIHdlIGNhbid0IGFkanVzdAotCSAgIHRoaXMgb25lPyAgKEUuZy4gcmVsb2NhdGlvbnMgaW52b2x2aW5nIGZ1bmN0aW9uIGFkZHJlc3NlcyBvbgotCSAgIHRoZSBQQS4gICovCi0jaWZkZWYgdGNfZml4X2FkanVzdGFibGUKLQlpZiAoISB0Y19maXhfYWRqdXN0YWJsZSAoZml4cCkpCi0JICB7Ci0JICAgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X2FkZHN5KTsKLQkgICAgZ290byBkb25lOwotCSAgfQotI2VuZGlmCi0KLQkvKiBJZiB0aGUgc2VjdGlvbiBzeW1ib2wgaXNuJ3QgZ29pbmcgdG8gYmUgb3V0cHV0LCB0aGUgcmVsb2NzCi0JICAgYXQgbGVhc3Qgc2hvdWxkIHN0aWxsIHdvcmsuICBJZiBub3QsIGZpZ3VyZSBvdXQgd2hhdCB0byBkbwotCSAgIHdoZW4gd2UgcnVuIGludG8gdGhhdCBjYXNlLgotCi0JICAgV2UgcmVmZXRjaCB0aGUgc2VnbWVudCB3aGVuIGNhbGxpbmcgc2VjdGlvbl9zeW1ib2wsIHJhdGhlcgotCSAgIHRoYW4gdXNpbmcgc3ltc2VjLCBiZWNhdXNlIFNfR0VUX1ZBTFVFIG1heSB3aW5kIHVwIGNoYW5naW5nCi0JICAgdGhlIHNlY3Rpb24gd2hlbiBpdCBjYWxscyByZXNvbHZlX3N5bWJvbF92YWx1ZS4gKi8KLQlmaXhwLT5meF9vZmZzZXQgKz0gU19HRVRfVkFMVUUgKHN5bSk7Ci0JZml4cC0+ZnhfYWRkc3kgPSBzZWN0aW9uX3N5bWJvbCAoU19HRVRfU0VHTUVOVCAoc3ltKSk7Ci0Jc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+ZnhfYWRkc3kpOwotI2lmZGVmIERFQlVHNQotCWZwcmludGYgKHN0ZGVyciwgIlxuYWRqdXN0ZWQgZml4dXA6XG4iKTsKLQlwcmludF9maXh1cCAoZml4cCk7Ci0jZW5kaWYKLQotICAgICAgZG9uZToKLQk7Ci0gICAgICB9Ci0jaWYgMS8qZGVmIFJFTE9DX1JFUVVJUkVTX1NZTUJPTCovCi0gICAgZWxzZQotICAgICAgewotCS8qIFRoZXJlIHdhcyBubyBzeW1ib2wgcmVxdWlyZWQgYnkgdGhpcyByZWxvY2F0aW9uLiAgSG93ZXZlciwKLQkgICBCRkQgZG9lc24ndCByZWFsbHkgaGFuZGxlIHJlbG9jYXRpb25zIHdpdGhvdXQgc3ltYm9scyB3ZWxsLgotCSAgIChBdCBsZWFzdCwgdGhlIENPRkYgc3VwcG9ydCBkb2Vzbid0LikgIFNvIGZvciBub3cgd2UgZmFrZSB1cAotCSAgIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgKi8KLQotCWZpeHAtPmZ4X2FkZHN5ID0gc2VjdGlvbl9zeW1ib2wgKGFic29sdXRlX3NlY3Rpb24pOwotLyoJZml4cC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MgPSAxOyAqLwotICAgICAgfQotI2VuZGlmCi0KLSAgZHVtcF9zZWN0aW9uX3JlbG9jcyAoYWJmZCwgc2VjLCBzdGRlcnIpOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVsb2NzIChhYmZkLCBzZWMsIHh4eCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeHh4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGludCBpOwotICB1bnNpZ25lZCBpbnQgbjsKLSAgYXJlbGVudCAqKnJlbG9jczsKLSAgZml4UyAqZml4cDsKLSAgY2hhciAqZXJyOwotCi0gIC8qIElmIHNlZ2luZm8gaXMgTlVMTCwgd2UgZGlkIG5vdCBjcmVhdGUgdGhpcyBzZWN0aW9uOyBkb24ndCBkbwotICAgICBhbnl0aGluZyB3aXRoIGl0LiAgKi8KLSAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZml4dXBfc2VnbWVudCAoc2VnaW5mby0+Zml4X3Jvb3QsIHNlYyk7Ci0KLSAgbiA9IDA7Ci0gIGZvciAoZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXhwOyBmaXhwID0gZml4cC0+ZnhfbmV4dCkKLSAgICBuKys7Ci0KLSNpZm5kZWYgUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCi0gIC8qIFNldCB1cCByZWxvYyBpbmZvcm1hdGlvbiBhcyB3ZWxsLiAgKi8KLSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKG4gKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICBtZW1zZXQgKChjaGFyKilyZWxvY3MsIDAsIG4gKiBzaXplb2YgKGFyZWxlbnQqKSk7Ci0KLSAgaSA9IDA7Ci0gIGZvciAoZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXhwICE9IChmaXhTICopIE5VTEw7IGZpeHAgPSBmaXhwLT5meF9uZXh0KQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHM7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0KLSAgICAgIGlmIChmaXhwLT5meF9kb25lKQotCXsKLQkgIG4tLTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sIHdoaWNoIHdhcyBlcXVhdGVkIHRvIGFub3RoZXIKLSAgICAgICAgIHN5bWJvbCwgdGhlbiB1c2UgZ2VuZXJhdGUgdGhlIHJlbG9jIGFnYWluc3QgdGhlIGxhdHRlciBzeW1ib2wKLSAgICAgICAgIHJhdGhlciB0aGFuIHRoZSBmb3JtZXIuICAqLwotICAgICAgc3ltID0gZml4cC0+ZnhfYWRkc3k7Ci0gICAgICB3aGlsZSAoc3ltYm9sX2VxdWF0ZWRfcCAoc3ltKQotCSAgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKSkKLQl7Ci0JICBzeW1ib2xTICpuOwotCi0JICAvKiBXZSBtdXN0IGF2b2lkIGxvb3BpbmcsIGFzIHRoYXQgY2FuIG9jY3VyIHdpdGggYSBiYWRseQotCSAgICAgd3JpdHRlbiBwcm9ncmFtLiAgKi8KLQkgIG4gPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSktPlhfYWRkX3N5bWJvbDsKLQkgIGlmIChuID09IHN5bSkKLQkgICAgYnJlYWs7Ci0JICBmaXhwLT5meF9vZmZzZXQgKz0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzeW0pLT5YX2FkZF9udW1iZXI7Ci0JICBzeW0gPSBuOwotCX0KLSAgICAgIGZpeHAtPmZ4X2FkZHN5ID0gc3ltOwotCi0gICAgICByZWxvYyA9IHRjX2dlbl9yZWxvYyAoc2VjLCBmaXhwKTsKLSAgICAgIGlmICghcmVsb2MpCi0JewotCSAgbi0tOwotCSAgY29udGludWU7Ci0JfQotCi0jaWYgMAotICAgICAgLyogVGhpcyB0ZXN0IGlzIHRyaWdnZXJlZCBpbmFwcHJvcHJpYXRlbHkgZm9yIHRoZSBTSC4gICovCi0gICAgICBpZiAoZml4cC0+Znhfd2hlcmUgKyBmaXhwLT5meF9zaXplCi0JICA+IGZpeHAtPmZ4X2ZyYWctPmZyX2ZpeCArIGZpeHAtPmZ4X2ZyYWctPmZyX29mZnNldCkKLQlhYm9ydCAoKTsKLSNlbmRpZgotCi0gICAgICBzID0gYmZkX2luc3RhbGxfcmVsb2NhdGlvbiAoc3Rkb3V0cHV0LCByZWxvYywKLQkJCQkgIGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwsCi0JCQkJICBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzLAotCQkJCSAgc2VjLCAmZXJyKTsKLSAgICAgIHN3aXRjaCAocykKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsIF8oInJlbG9jYXRpb24gb3V0IG9mIHJhbmdlIikpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFzX2ZhdGFsIChfKCIlczoldTogYmFkIHJldHVybiBmcm9tIGJmZF9pbnN0YWxsX3JlbG9jYXRpb246ICV4IiksCi0JCSAgICBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLCBzKTsKLQl9Ci0gICAgICByZWxvY3NbaSsrXSA9IHJlbG9jOwotICAgIH0KLSNlbHNlCi0gIG4gPSBuICogTUFYX1JFTE9DX0VYUEFOU0lPTjsKLSAgLyogU2V0IHVwIHJlbG9jIGluZm9ybWF0aW9uIGFzIHdlbGwuICAqLwotICByZWxvY3MgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAobiAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0KLSAgaSA9IDA7Ci0gIGZvciAoZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXhwICE9IChmaXhTICopIE5VTEw7IGZpeHAgPSBmaXhwLT5meF9uZXh0KQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipyZWxvYzsKLSAgICAgIGNoYXIgKmRhdGE7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgczsKLSAgICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgIGludCBqOwotCi0gICAgICBpZiAoZml4cC0+ZnhfZG9uZSkKLQl7Ci0JICBuLS07Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCB3aGljaCB3YXMgZXF1YXRlZCB0byBhbm90aGVyCi0gICAgICAgICBzeW1ib2wsIHRoZW4gdXNlIGdlbmVyYXRlIHRoZSByZWxvYyBhZ2FpbnN0IHRoZSBsYXR0ZXIgc3ltYm9sCi0gICAgICAgICByYXRoZXIgdGhhbiB0aGUgZm9ybWVyLiAgKi8KLSAgICAgIHN5bSA9IGZpeHAtPmZ4X2FkZHN5OwotICAgICAgd2hpbGUgKHN5bWJvbF9lcXVhdGVkX3AgKHN5bSkKLQkgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkpCi0Jc3ltID0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzeW0pLT5YX2FkZF9zeW1ib2w7Ci0gICAgICBmaXhwLT5meF9hZGRzeSA9IHN5bTsKLQotICAgICAgcmVsb2MgPSB0Y19nZW5fcmVsb2MgKHNlYywgZml4cCk7Ci0KLSAgICAgIGZvciAoaiA9IDA7IHJlbG9jW2pdOyBqKyspCi0JewotICAgICAgICAgIHJlbG9jc1tpKytdID0gcmVsb2Nbal07Ci0gICAgICAgICAgYXNzZXJ0KGkgPD0gbik7Ci0JfQotICAgICAgZGF0YSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLSAgICAgIGlmIChmaXhwLT5meF93aGVyZSArIGZpeHAtPmZ4X3NpemUKLQkgID4gZml4cC0+ZnhfZnJhZy0+ZnJfZml4ICsgZml4cC0+ZnhfZnJhZy0+ZnJfb2Zmc2V0KQotCWFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgICAgXygiaW50ZXJuYWwgZXJyb3I6IGZpeHVwIG5vdCBjb250YWluZWQgd2l0aGluIGZyYWciKSk7Ci0gICAgICBmb3IgKGogPSAwOyByZWxvY1tqXTsgaisrKQotICAgICAgICB7Ci0JICBzID0gYmZkX2luc3RhbGxfcmVsb2NhdGlvbiAoc3Rkb3V0cHV0LCByZWxvY1tqXSwKLQkJCQkgICAgICBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsLAotCQkJCSAgICAgIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MsCi0JCQkJICAgICAgc2VjLCAmZXJyKTsKLSAgICAgICAgICBzd2l0Y2ggKHMpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2ZhdGFsIChfKCIlczoldTogYmFkIHJldHVybiBmcm9tIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24iKSwKLQkJCWZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotCSAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gIG4gPSBpOwotI2VuZGlmCi0KLSNpZmRlZiBERUJVRzQKLSAgewotICAgIGludCBpLCBqLCBuc3ltczsKLSAgICBhc3ltYm9sICoqc3ltcHA7Ci0gICAgc3ltcHAgPSBiZmRfZ2V0X291dHN5bWJvbHMgKHN0ZG91dHB1dCk7Ci0gICAgbnN5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChzdGRvdXRwdXQpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgICBpZiAoKCgqcmVsb2NzW2ldLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotCXsKLQkgIGZvciAoaiA9IDA7IGogPCBuc3ltczsgaisrKQotCSAgICBpZiAoc3ltcHBbal0gPT0gKnJlbG9jc1tpXS0+c3ltX3B0cl9wdHIpCi0JICAgICAgYnJlYWs7Ci0JICBpZiAoaiA9PSBuc3ltcykKLQkgICAgYWJvcnQgKCk7Ci0JfQotICB9Ci0jZW5kaWYKLQotICBpZiAobikKLSAgICBiZmRfc2V0X3JlbG9jIChzdGRvdXRwdXQsIHNlYywgcmVsb2NzLCBuKTsKLSAgZWxzZQotICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLAotCQkJICAgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKQotCQkJICAgICYgKGZsYWd3b3JkKSB+U0VDX1JFTE9DKSk7Ci0KLSNpZmRlZiBTRVRfU0VDVElPTl9SRUxPQ1MKLSAgU0VUX1NFQ1RJT05fUkVMT0NTIChzZWMsIHJlbG9jcywgbik7Ci0jZW5kaWYKLQotI2lmZGVmIERFQlVHMwotICB7Ci0gICAgaW50IGk7Ci0gICAgYXJlbGVudCAqcjsKLSAgICBhc3ltYm9sICpzOwotICAgIGZwcmludGYgKHN0ZGVyciwgInJlbG9jcyBmb3Igc2VjICVzXG4iLCBzZWMtPm5hbWUpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgICB7Ci0JciA9IHJlbG9jc1tpXTsKLQlzID0gKnItPnN5bV9wdHJfcHRyOwotCWZwcmludGYgKHN0ZGVyciwgIiAgcmVsb2MgJTJkIEAlMDh4IG9mZiAlNHggOiBzeW0gJS0xMHMgYWRkZW5kICV4XG4iLAotCQkgaSwgciwgci0+YWRkcmVzcywgcy0+bmFtZSwgci0+YWRkZW5kKTsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9jb250ZW50cyAoYWJmZCwgc2VjLCB4eHgpCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeHh4IEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKLSAgZnJhZ1MgKmY7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBmcmFncy4gICovCi0gIGlmIChzZWdpbmZvID09IE5VTEwKLSAgICAgIHx8ICEgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19IQVNfQ09OVEVOVFMpKQotICAgIHJldHVybjsKLQotICBmb3IgKGYgPSBzZWdpbmZvLT5mcmNoYWluUC0+ZnJjaF9yb290OwotICAgICAgIGY7Ci0gICAgICAgZiA9IGYtPmZyX25leHQpCi0gICAgewotICAgICAgaW50IHg7Ci0gICAgICB1bnNpZ25lZCBsb25nIGZpbGxfc2l6ZTsKLSAgICAgIGNoYXIgKmZpbGxfbGl0ZXJhbDsKLSAgICAgIGxvbmcgY291bnQ7Ci0KLSAgICAgIGFzc2VydCAoZi0+ZnJfdHlwZSA9PSByc19maWxsKTsKLSAgICAgIGlmIChmLT5mcl9maXgpCi0JewotCSAgeCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCBzZWMsCi0JCQkJCWYtPmZyX2xpdGVyYWwsIChmaWxlX3B0cikgb2Zmc2V0LAotCQkJCQkoYmZkX3NpemVfdHlwZSkgZi0+ZnJfZml4KTsKLQkgIGlmICh4ID09IGZhbHNlKQotCSAgICB7Ci0JICAgICAgYmZkX3BlcnJvciAoc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0JICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3Qgd3JpdGUgJXMiKSwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0JICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQkgICAgfQotCSAgb2Zmc2V0ICs9IGYtPmZyX2ZpeDsKLQl9Ci0gICAgICBmaWxsX2xpdGVyYWwgPSBmLT5mcl9saXRlcmFsICsgZi0+ZnJfZml4OwotICAgICAgZmlsbF9zaXplID0gZi0+ZnJfdmFyOwotICAgICAgY291bnQgPSBmLT5mcl9vZmZzZXQ7Ci0gICAgICBhc3NlcnQgKGNvdW50ID49IDApOwotICAgICAgaWYgKGZpbGxfc2l6ZSAmJiBjb3VudCkKLQl7Ci0JICBjaGFyIGJ1ZlsyNTZdOwotCSAgaWYgKGZpbGxfc2l6ZSA+IHNpemVvZihidWYpKQotCSAgICB7Ci0JICAgICAgLyogRG8gaXQgdGhlIG9sZCB3YXkuIENhbiB0aGlzIGV2ZXIgaGFwcGVuPyAqLwotCSAgICAgIHdoaWxlIChjb3VudC0tKQotCQl7Ci0JCSAgeCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCBzZWMsCi0JCQkJCQlmaWxsX2xpdGVyYWwsCi0JCQkJCQkoZmlsZV9wdHIpIG9mZnNldCwKLQkJCQkJCShiZmRfc2l6ZV90eXBlKSBmaWxsX3NpemUpOwotCQkgIGlmICh4ID09IGZhbHNlKQotCQkgICAgewotCQkgICAgICBiZmRfcGVycm9yIChzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLQkJICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3Qgd3JpdGUgJXMiKSwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0JCSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0JCSAgICB9Ci0JCSAgb2Zmc2V0ICs9IGZpbGxfc2l6ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBCdWlsZCBhIGJ1ZmZlciBmdWxsIG9mIGZpbGwgb2JqZWN0cyBhbmQgb3V0cHV0IGl0IGFzCi0JCSBvZnRlbiBhcyBuZWNlc3NhcnkuIFRoaXMgc2F2ZXMgb24gdGhlIG92ZXJoZWFkIG9mCi0JCSBwb3RlbnRpYWxseSBsb3RzIG9mIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyBjYWxscy4gICovCi0JICAgICAgaW50IG5fcGVyX2J1ZiwgaTsKLQkgICAgICBpZiAoZmlsbF9zaXplID09IDEpCi0JCXsKLQkJICBuX3Blcl9idWYgPSBzaXplb2YgKGJ1Zik7Ci0JCSAgbWVtc2V0IChidWYsICpmaWxsX2xpdGVyYWwsIG5fcGVyX2J1Zik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjaGFyICpidWZwOwotCQkgIG5fcGVyX2J1ZiA9IHNpemVvZihidWYpL2ZpbGxfc2l6ZTsKLQkJICBmb3IgKGkgPSBuX3Blcl9idWYsIGJ1ZnAgPSBidWY7IGk7IGktLSwgYnVmcCArPSBmaWxsX3NpemUpCi0JCSAgICBtZW1jcHkoYnVmcCwgZmlsbF9saXRlcmFsLCBmaWxsX3NpemUpOwotCQl9Ci0JICAgICAgZm9yICg7IGNvdW50ID4gMDsgY291bnQgLT0gbl9wZXJfYnVmKQotCQl7Ci0JCSAgbl9wZXJfYnVmID0gbl9wZXJfYnVmID4gY291bnQgPyBjb3VudCA6IG5fcGVyX2J1ZjsKLQkJICB4ID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChzdGRvdXRwdXQsIHNlYywKLQkJCQkJCWJ1ZiwgKGZpbGVfcHRyKSBvZmZzZXQsCi0JCQkJCQkoYmZkX3NpemVfdHlwZSkgbl9wZXJfYnVmICogZmlsbF9zaXplKTsKLQkJICBpZiAoeCAhPSB0cnVlKQotCQkgICAgYXNfZmF0YWwgKF8oIkNhbm5vdCB3cml0ZSB0byBvdXRwdXQgZmlsZS4iKSk7Ci0JCSAgb2Zmc2V0ICs9IG5fcGVyX2J1ZiAqIGZpbGxfc2l6ZTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChCRkRfQVNTRU1CTEVSKSB8fCAoIWRlZmluZWQgKEJGRCkgJiYgIWRlZmluZWQoT0JKX0FPVVQpKQotc3RhdGljIHZvaWQKLW1lcmdlX2RhdGFfaW50b190ZXh0ICgpCi17Ci0jaWYgZGVmaW5lZChCRkRfQVNTRU1CTEVSKSB8fCBkZWZpbmVkKE1BTllfU0VHTUVOVFMpCi0gIHNlZ19pbmZvICh0ZXh0X3NlY3Rpb24pLT5mcmNoYWluUC0+ZnJjaF9sYXN0LT5mcl9uZXh0ID0KLSAgICBzZWdfaW5mbyAoZGF0YV9zZWN0aW9uKS0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKLSAgc2VnX2luZm8gKHRleHRfc2VjdGlvbiktPmZyY2hhaW5QLT5mcmNoX2xhc3QgPQotICAgIHNlZ19pbmZvIChkYXRhX3NlY3Rpb24pLT5mcmNoYWluUC0+ZnJjaF9sYXN0OwotICBzZWdfaW5mbyAoZGF0YV9zZWN0aW9uKS0+ZnJjaGFpblAgPSAwOwotI2Vsc2UKLSAgZml4UyAqdG1wOwotCi0gIHRleHRfbGFzdF9mcmFnLT5mcl9uZXh0ID0gZGF0YV9mcmFnX3Jvb3Q7Ci0gIHRleHRfbGFzdF9mcmFnID0gZGF0YV9sYXN0X2ZyYWc7Ci0gIGRhdGFfbGFzdF9mcmFnID0gTlVMTDsKLSAgZGF0YV9mcmFnX3Jvb3QgPSBOVUxMOwotICBpZiAodGV4dF9maXhfcm9vdCkKLSAgICB7Ci0gICAgICBmb3IgKHRtcCA9IHRleHRfZml4X3Jvb3Q7IHRtcC0+ZnhfbmV4dDsgdG1wID0gdG1wLT5meF9uZXh0KTs7Ci0gICAgICB0bXAtPmZ4X25leHQgPSBkYXRhX2ZpeF9yb290OwotICAgICAgdGV4dF9maXhfdGFpbCA9IGRhdGFfZml4X3RhaWw7Ci0gICAgfQotICBlbHNlCi0gICAgdGV4dF9maXhfcm9vdCA9IGRhdGFfZml4X3Jvb3Q7Ci0gIGRhdGFfZml4X3Jvb3QgPSBOVUxMOwotI2VuZGlmCi19Ci0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiB8fCAoISBCRkQgJiYgISBPQkpfQU9VVCkgKi8KLQotI2lmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiAhZGVmaW5lZCAoQkZEKQotc3RhdGljIHZvaWQKLXJlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyAoKQotewotICBmcmFnUyAqZnJhZ1A7Ci0KLSAgcmVsYXhfc2VnbWVudCAodGV4dF9mcmFnX3Jvb3QsIFNFR19URVhUKTsKLSAgcmVsYXhfc2VnbWVudCAoZGF0YV9mcmFnX3Jvb3QsIFNFR19EQVRBKTsKLSAgcmVsYXhfc2VnbWVudCAoYnNzX2ZyYWdfcm9vdCwgU0VHX0JTUyk7Ci0gIC8qCi0gICAqIE5vdyB0aGUgYWRkcmVzc2VzIG9mIGZyYWdzIGFyZSBjb3JyZWN0IHdpdGhpbiB0aGUgc2VnbWVudC4KLSAgICovCi0KLSAga25vdyAodGV4dF9sYXN0X2ZyYWctPmZyX3R5cGUgPT0gcnNfZmlsbCAmJiB0ZXh0X2xhc3RfZnJhZy0+ZnJfb2Zmc2V0ID09IDApOwotICBIX1NFVF9URVhUX1NJWkUgKCZoZWFkZXJzLCB0ZXh0X2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyk7Ci0gIHRleHRfbGFzdF9mcmFnLT5mcl9hZGRyZXNzID0gSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycyk7Ci0KLSAgLyoKLSAgICogSm9pbiB0aGUgMiBzZWdtZW50cyBpbnRvIDEgaHVnZSBzZWdtZW50LgotICAgKiBUbyBkbyB0aGlzLCByZS1jb21wdXRlIGV2ZXJ5IHJuX2FkZHJlc3MgaW4gdGhlIFNFR19EQVRBIGZyYWdzLgotICAgKiBUaGVuIGpvaW4gdGhlIGRhdGEgZnJhZ3MgYWZ0ZXIgdGhlIHRleHQgZnJhZ3MuCi0gICAqCi0gICAqIERldGVybWluZSBhX2RhdGEgW2xlbmd0aCBvZiBkYXRhIHNlZ21lbnRdLgotICAgKi8KLSAgaWYgKGRhdGFfZnJhZ19yb290KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHJlbGF4X2FkZHJlc3NUIHNsaWRlOwotCi0gICAgICBrbm93ICgodGV4dF9sYXN0X2ZyYWctPmZyX3R5cGUgPT0gcnNfZmlsbCkgJiYgKHRleHRfbGFzdF9mcmFnLT5mcl9vZmZzZXQgPT0gMCkpOwotCi0gICAgICBIX1NFVF9EQVRBX1NJWkUgKCZoZWFkZXJzLCBkYXRhX2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyk7Ci0gICAgICBkYXRhX2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyA9IEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpOwotICAgICAgc2xpZGUgPSBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKTsJLyogJiBpbiBmaWxlIG9mIHRoZSBkYXRhIHNlZ21lbnQuICovCi0jaWZkZWYgT0JKX0JPVVQKLSNkZWZpbmUgUm91bmRVcChOLFMpICgoKE4pKyhTKS0xKSYtKFMpKQotICAgICAgLyogRm9yIGIub3V0OiBJZiB0aGUgZGF0YSBzZWN0aW9uIGhhcyBhIHN0cmljdCBhbGlnbm1lbnQKLQkgcmVxdWlyZW1lbnQsIGl0cyBsb2FkIGFkZHJlc3MgaW4gdGhlIC5vIGZpbGUgd2lsbCBiZQotCSByb3VuZGVkIHVwIGZyb20gdGhlIHNpemUgb2YgdGhlIHRleHQgc2VjdGlvbi4gIFRoZXNlCi0JIHR3byB2YWx1ZXMgYXJlICpub3QqIHRoZSBzYW1lISAgU2ltaWxhcmx5IGZvciB0aGUgYnNzCi0JIHNlY3Rpb24uLi4uICAqLwotICAgICAgc2xpZGUgPSBSb3VuZFVwIChzbGlkZSwgMSA8PCBzZWN0aW9uX2FsaWdubWVudFtTRUdfREFUQV0pOwotI2VuZGlmCi0KLSAgICAgIGZvciAoZnJhZ1AgPSBkYXRhX2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0JewotCSAgZnJhZ1AtPmZyX2FkZHJlc3MgKz0gc2xpZGU7Ci0JfQkJCS8qIGZvciBlYWNoIGRhdGEgZnJhZyAqLwotCi0gICAgICBrbm93ICh0ZXh0X2xhc3RfZnJhZyAhPSAwKTsKLSAgICAgIHRleHRfbGFzdF9mcmFnLT5mcl9uZXh0ID0gZGF0YV9mcmFnX3Jvb3Q7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgSF9TRVRfREFUQV9TSVpFICgmaGVhZGVycywgMCk7Ci0gICAgfQotCi0jaWZkZWYgT0JKX0JPVVQKLSAgLyogU2VlIGFib3ZlIGNvbW1lbnRzIG9uIGIub3V0IGRhdGEgc2VjdGlvbiBhZGRyZXNzLiAgKi8KLSAgewotICAgIGxvbmcgYnNzX3ZtYTsKLSAgICBpZiAoZGF0YV9sYXN0X2ZyYWcgPT0gMCkKLSAgICAgIGJzc192bWEgPSBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKTsKLSAgICBlbHNlCi0gICAgICBic3Nfdm1hID0gZGF0YV9sYXN0X2ZyYWctPmZyX2FkZHJlc3M7Ci0gICAgYnNzX3ZtYSA9IFJvdW5kVXAgKGJzc192bWEsIDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbU0VHX0JTU10pOwotICAgIGJzc19hZGRyZXNzX2ZyYWcuZnJfYWRkcmVzcyA9IGJzc192bWE7Ci0gIH0KLSNlbHNlIC8qICEgT0JKX0JPVVQgKi8KLSAgYnNzX2FkZHJlc3NfZnJhZy5mcl9hZGRyZXNzID0gKEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpICsKLQkJCQkgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycykpOwotCi0jZW5kaWYgLyogISBPQkpfQk9VVCAqLwotCi0gIC8qIFNsaWRlIGFsbCB0aGUgZnJhZ3MgKi8KLSAgaWYgKGJzc19mcmFnX3Jvb3QpCi0gICAgewotICAgICAgcmVsYXhfYWRkcmVzc1Qgc2xpZGUgPSBic3NfYWRkcmVzc19mcmFnLmZyX2FkZHJlc3M7Ci0KLSAgICAgIGZvciAoZnJhZ1AgPSBic3NfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLQl7Ci0JICBmcmFnUC0+ZnJfYWRkcmVzcyArPSBzbGlkZTsKLQl9CQkJLyogZm9yIGVhY2ggYnNzIGZyYWcgKi8KLSAgICB9Ci0KLSAgaWYgKGJzc19sYXN0X2ZyYWcpCi0gICAgSF9TRVRfQlNTX1NJWkUgKCZoZWFkZXJzLAotCQkgICAgYnNzX2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyAtIGJzc19mcmFnX3Jvb3QtPmZyX2FkZHJlc3MpOwotICBlbHNlCi0gICAgSF9TRVRfQlNTX1NJWkUgKCZoZWFkZXJzLCAwKTsKLX0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgJiYgISBCRkQgKi8KLQotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICFkZWZpbmVkIChCRkQpCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgdm9pZAotc2V0X3N5bXRhYiAoKQotewotICBpbnQgbnN5bXM7Ci0gIGFzeW1ib2wgKiphc3ltcHA7Ci0gIHN5bWJvbFMgKnN5bXA7Ci0gIGJvb2xlYW4gcmVzdWx0OwotICBleHRlcm4gUFRSIGJmZF9hbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7Ci0KLSAgLyogQ291bnQgc3ltYm9scy4gIFdlIGNhbid0IHJlbHkgb24gYSBjb3VudCBtYWRlIGJ5IHRoZSBsb29wIGluCi0gICAgIHdyaXRlX29iamVjdF9maWxlLCBiZWNhdXNlICpfZnJvYl9maWxlIG1heSBhZGQgYSBuZXcgc3ltYm9sIG9yCi0gICAgIHR3by4gICovCi0gIG5zeW1zID0gMDsKLSAgZm9yIChzeW1wID0gc3ltYm9sX3Jvb3RQOyBzeW1wOyBzeW1wID0gc3ltYm9sX25leHQgKHN5bXApKQotICAgIG5zeW1zKys7Ci0KLSAgaWYgKG5zeW1zKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBhc3ltcHAgPSAoYXN5bWJvbCAqKikgYmZkX2FsbG9jIChzdGRvdXRwdXQsCi0JCQkJICAgICAgIG5zeW1zICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgIHN5bXAgPSBzeW1ib2xfcm9vdFA7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnN5bXM7IGkrKywgc3ltcCA9IHN5bWJvbF9uZXh0IChzeW1wKSkKLQl7Ci0JICBhc3ltcHBbaV0gPSBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCk7Ci0JICBzeW1ib2xfbWFya193cml0dGVuIChzeW1wKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgYXN5bXBwID0gMDsKLSAgcmVzdWx0ID0gYmZkX3NldF9zeW10YWIgKHN0ZG91dHB1dCwgYXN5bXBwLCBuc3ltcyk7Ci0gIGFzc2VydCAocmVzdWx0ID09IHRydWUpOwotICBzeW1ib2xfdGFibGVfZnJvemVuID0gMTsKLX0KLSNlbmRpZgotCi0vKiBGaW5pc2ggdGhlIHN1YnNlZ21lbnRzLiAgQWZ0ZXIgZXZlcnkgc3ViLXNlZ21lbnQsIHdlIGZha2UgYW4KLSAgICIuYWxpZ24gLi4uIi4gIFRoaXMgY29uZm9ybXMgdG8gQlNENC4yIGJyYW5lLWRhbWFnZS4gIFdlIHRoZW4gZmFrZQotICAgIi5maWxsIDAiIGJlY2F1c2UgdGhhdCBpcyB0aGUga2luZCBvZiBmcmFnIHRoYXQgcmVxdWlyZXMgbGVhc3QKLSAgIHRob3VnaHQuICAiLmFsaWduIiBmcmFncyBsaWtlIHRvIGhhdmUgYSBmb2xsb3dpbmcgZnJhZyBzaW5jZSB0aGF0Ci0gICBtYWtlcyBjYWxjdWxhdGluZyB0aGVpciBpbnRlbmRlZCBsZW5ndGggdHJpdmlhbC4gICovCi0KLSNpZm5kZWYgU1VCX1NFR01FTlRfQUxJR04KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgKDApCi0jZWxzZQotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpICgyKQotI2VuZGlmCi0jZW5kaWYKLQotdm9pZAotc3Vic2Vnc19maW5pc2ggKCkKLXsKLSAgc3RydWN0IGZyY2hhaW4gKmZyY2hhaW5QOwotCi0gIGZvciAoZnJjaGFpblAgPSBmcmNoYWluX3Jvb3Q7IGZyY2hhaW5QOyBmcmNoYWluUCA9IGZyY2hhaW5QLT5mcmNoX25leHQpCi0gICAgewotICAgICAgc3Vic2VnX3NldCAoZnJjaGFpblAtPmZyY2hfc2VnLCBmcmNoYWluUC0+ZnJjaF9zdWJzZWcpOwotCi0gICAgICAvKiBUaGlzIG5vdyBnZXRzIGNhbGxlZCBldmVuIGlmIHdlIGhhZCBlcnJvcnMuICBJbiB0aGF0IGNhc2UsCi0gICAgICAgICBhbnkgYWxpZ25tZW50IGlzIG1lYW5pbmdsZXNzLCBhbmQsIG1vcmVvdmVyLCB3aWxsIGxvb2sgd2VpcmQKLSAgICAgICAgIGlmIHdlIGFyZSBnZW5lcmF0aW5nIGEgbGlzdGluZy4gICovCi0gICAgICBmcmFnX2FsaWduIChoYWRfZXJyb3JzICgpID8gMCA6IFNVQl9TRUdNRU5UX0FMSUdOIChub3dfc2VnKSwKLQkJICBzdWJzZWdfdGV4dF9wIChub3dfc2VnKSA/IE5PUF9PUENPREUgOiAwLAotCQkgIDApOwotCi0gICAgICAvKiBmcmFnX2FsaWduIHdpbGwgaGF2ZSBsZWZ0IGEgbmV3IGZyYWcuCi0JIFVzZSB0aGlzIGxhc3QgZnJhZyBmb3IgYW4gZW1wdHkgIi5maWxsIi4KLQotCSBGb3IgdGhpcyBzZWdtZW50IC4uLgotCSBDcmVhdGUgYSBsYXN0IGZyYWcuIERvIG5vdCBsZWF2ZSBhICJiZWluZyBmaWxsZWQgaW4gZnJhZyIuICAqLwotCi0gICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgICAgIGZyYWdfbm93LT5mcl9maXggPSAwOwotICAgICAga25vdyAoZnJhZ19ub3ctPmZyX25leHQgPT0gTlVMTCk7Ci0gICAgfQotfQotCi0vKiBXcml0ZSB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi12b2lkCi13cml0ZV9vYmplY3RfZmlsZSAoKQotewotI2lmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgISBkZWZpbmVkIChXT1JLSU5HX0RPVF9XT1JEKQotICBmcmFnUyAqZnJhZ1A7CQkJLyogVHJhY2sgYWxvbmcgYWxsIGZyYWdzLiAqLwotI2VuZGlmCi0KLSAgLyogRG8gd2UgcmVhbGx5IHdhbnQgdG8gd3JpdGUgaXQ/ICAqLwotICB7Ci0gICAgaW50IG5fd2FybnMsIG5fZXJyczsKLSAgICBuX3dhcm5zID0gaGFkX3dhcm5pbmdzICgpOwotICAgIG5fZXJycyA9IGhhZF9lcnJvcnMgKCk7Ci0gICAgLyogVGhlIC1aIGZsYWcgaW5kaWNhdGVzIHRoYXQgYW4gb2JqZWN0IGZpbGUgc2hvdWxkIGJlIGdlbmVyYXRlZCwKLSAgICAgICByZWdhcmRsZXNzIG9mIHdhcm5pbmdzIGFuZCBlcnJvcnMuICAqLwotICAgIGlmIChmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQpCi0gICAgICB7Ci0JaWYgKG5fd2FybnMgfHwgbl9lcnJzKQotCSAgYXNfd2FybiAoXygiJWQgZXJyb3IlcywgJWQgd2FybmluZyVzLCBnZW5lcmF0aW5nIGJhZCBvYmplY3QgZmlsZS5cbiIpLAotCQkgICBuX2VycnMsIG5fZXJycyA9PSAxID8gIiIgOiAicyIsCi0JCSAgIG5fd2FybnMsIG5fd2FybnMgPT0gMSA/ICIiIDogInMiKTsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0JaWYgKG5fZXJycykKLQkgIGFzX2ZhdGFsIChfKCIlZCBlcnJvciVzLCAlZCB3YXJuaW5nJXMsIG5vIG9iamVjdCBmaWxlIGdlbmVyYXRlZC5cbiIpLAotCQkgICAgbl9lcnJzLCBuX2VycnMgPT0gMSA/ICIiIDogInMiLAotCQkgICAgbl93YXJucywgbl93YXJucyA9PSAxID8gIiIgOiAicyIpOwotICAgICAgfQotICB9Ci0KLSNpZmRlZglPQkpfVk1TCi0gIC8qIFVuZGVyIFZNUyB3ZSB0cnkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFZBWC0xMSAiQyIuICBUaHVzLCB3ZSBjYWxsCi0gICAgIGEgcm91dGluZSB0byBjaGVjayBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByb2NlZHVyZSAiX21haW4iLAotICAgICBhbmQgaWYgc28gLS0gZml4IGl0IHVwIHNvIHRoYXQgaXQgY2FuIGJlIHByb2dyYW0gZW50cnkgcG9pbnQuICovCi0gIHZtc19jaGVja19mb3JfbWFpbiAoKTsKLSNlbmRpZiAvKiBPQkpfVk1TICovCi0KLSAgLyogRnJvbSBub3cgb24sIHdlIGRvbid0IGNhcmUgYWJvdXQgc3ViLXNlZ21lbnRzLiAgQnVpbGQgb25lIGZyYWcgY2hhaW4KLSAgICAgZm9yIGVhY2ggc2VnbWVudC4gTGlua2VkIHRocnUgZnJfbmV4dC4gICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIC8qIFJlbW92ZSB0aGUgc2VjdGlvbnMgY3JlYXRlZCBieSBnYXMgZm9yIGl0cyBvd24gcHVycG9zZXMuICAqLwotICB7Ci0gICAgYXNlY3Rpb24gKipzZWNsaXN0LCAqc2VjOwotICAgIGludCBpOwotCi0gICAgc2VjbGlzdCA9ICZzdGRvdXRwdXQtPnNlY3Rpb25zOwotICAgIHdoaWxlIChzZWNsaXN0ICYmICpzZWNsaXN0KQotICAgICAgewotCXNlYyA9ICpzZWNsaXN0OwotCXdoaWxlIChzZWMgPT0gcmVnX3NlY3Rpb24gfHwgc2VjID09IGV4cHJfc2VjdGlvbikKLQkgIHsKLQkgICAgc2VjID0gc2VjLT5uZXh0OwotCSAgICAqc2VjbGlzdCA9IHNlYzsKLQkgICAgc3Rkb3V0cHV0LT5zZWN0aW9uX2NvdW50LS07Ci0JICAgIGlmICghc2VjKQotCSAgICAgIGJyZWFrOwotCSAgfQotCWlmICgqc2VjbGlzdCkKLQkgIHNlY2xpc3QgPSAmKCpzZWNsaXN0KS0+bmV4dDsKLSAgICAgIH0KLSAgICBpID0gMDsKLSAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgcmVudW1iZXJfc2VjdGlvbnMsICZpKTsKLSAgfQotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBjaGFpbl9mcmNoYWluc190b2dldGhlciwgKGNoYXIgKikgMCk7Ci0jZWxzZQotICByZW1vdmVfc3Vic2VncyAoZnJjaGFpbl9yb290LCBTRUdfVEVYVCwgJnRleHRfZnJhZ19yb290LCAmdGV4dF9sYXN0X2ZyYWcpOwotICByZW1vdmVfc3Vic2VncyAoZGF0YTBfZnJjaGFpblAsIFNFR19EQVRBLCAmZGF0YV9mcmFnX3Jvb3QsICZkYXRhX2xhc3RfZnJhZyk7Ci0gIHJlbW92ZV9zdWJzZWdzIChic3MwX2ZyY2hhaW5QLCBTRUdfQlNTLCAmYnNzX2ZyYWdfcm9vdCwgJmJzc19sYXN0X2ZyYWcpOwotI2VuZGlmCi0KLSAgLyogV2UgaGF2ZSB0d28gc2VnbWVudHMuIElmIHVzZXIgZ2F2ZSAtUiBmbGFnLCB0aGVuIHdlIG11c3QgcHV0IHRoZQotICAgICBkYXRhIGZyYWdzIGludG8gdGhlIHRleHQgc2VnbWVudC4gRG8gdGhpcyBiZWZvcmUgcmVsYXhpbmcgc28KLSAgICAgd2Uga25vdyB0byB0YWtlIGFkdmFudGFnZSBvZiAtUiBhbmQgbWFrZSBzaG9ydGVyIGFkZHJlc3Nlcy4gICovCi0jaWYgIWRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0gICAgewotICAgICAgbWVyZ2VfZGF0YV9pbnRvX3RleHQgKCk7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCByZWxheF9hbmRfc2l6ZV9zZWcsIChjaGFyICopIDApOwotI2Vsc2UKLSAgcmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzICgpOwotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gIC8qCi0gICAqCi0gICAqIENyYXdsIHRoZSBzeW1ib2wgY2hhaW4uCi0gICAqCi0gICAqIEZvciBlYWNoIHN5bWJvbCB3aG9zZSB2YWx1ZSBkZXBlbmRzIG9uIGEgZnJhZywgdGFrZSB0aGUgYWRkcmVzcyBvZgotICAgKiB0aGF0IGZyYWcgYW5kIHN1YnN1bWUgaXQgaW50byB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4KLSAgICogQWZ0ZXIgdGhpcywgdGhlcmUgaXMganVzdCBvbmUgd2F5IHRvIGxvb2t1cCBhIHN5bWJvbCB2YWx1ZS4KLSAgICogVmFsdWVzIGFyZSBsZWZ0IGluIHRoZWlyIGZpbmFsIHN0YXRlIGZvciBvYmplY3QgZmlsZSBlbWlzc2lvbi4KLSAgICogV2UgYWRqdXN0IHRoZSB2YWx1ZXMgb2YgJ0wnIGxvY2FsIHN5bWJvbHMsIGV2ZW4gaWYgd2UgZG8KLSAgICogbm90IGludGVuZCB0byBlbWl0IHRoZW0gdG8gdGhlIG9iamVjdCBmaWxlLCBiZWNhdXNlIHRoZWlyIHZhbHVlcwotICAgKiBhcmUgbmVlZGVkIGZvciBmaXgtdXBzLgotICAgKgotICAgKiBVbmxlc3Mgd2Ugc2F3IGEgLUwgZmxhZywgcmVtb3ZlIGFsbCBzeW1ib2xzIHRoYXQgYmVnaW4gd2l0aCAnTCcKLSAgICogZnJvbSB0aGUgc3ltYm9sIGNoYWluLiAgKFRoZXkgYXJlIHN0aWxsIHBvaW50ZWQgdG8gYnkgdGhlIGZpeGVzLikKLSAgICoKLSAgICogQ291bnQgdGhlIHJlbWFpbmluZyBzeW1ib2xzLgotICAgKiBBc3NpZ24gYSBzeW1ib2wgbnVtYmVyIHRvIGVhY2ggc3ltYm9sLgotICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIHN0cmluZy10YWJsZSBjaGFycyB3ZSB3aWxsIGVtaXQuCi0gICAqIFB1dCB0aGlzIGluZm8gaW50byB0aGUgaGVhZGVycyBhcyBhcHByb3ByaWF0ZS4KLSAgICoKLSAgICovCi0gIGtub3cgKHplcm9fYWRkcmVzc19mcmFnLmZyX2FkZHJlc3MgPT0gMCk7Ci0gIHN0cmluZ19ieXRlX2NvdW50ID0gc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCk7Ci0KLSAgb2JqX2NyYXdsX3N5bWJvbF9jaGFpbiAoJmhlYWRlcnMpOwotCi0gIGlmIChzdHJpbmdfYnl0ZV9jb3VudCA9PSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KSkKLSAgICBzdHJpbmdfYnl0ZV9jb3VudCA9IDA7Ci0KLSAgSF9TRVRfU1RSSU5HX1NJWkUgKCZoZWFkZXJzLCBzdHJpbmdfYnl0ZV9jb3VudCk7Ci0KLSAgLyoKLSAgICogQWRkcmVzc2VzIG9mIGZyYWdzIG5vdyByZWZsZWN0IGFkZHJlc3NlcyB3ZSB1c2UgaW4gdGhlIG9iamVjdCBmaWxlLgotICAgKiBTeW1ib2wgdmFsdWVzIGFyZSBjb3JyZWN0LgotICAgKiBTY2FuIHRoZSBmcmFncywgY29udmVydGluZyBhbnkgIi5vcmcicyBhbmQgIi5hbGlnbiJzIHRvICIuZmlsbCJzLgotICAgKiBBbHNvIGNvbnZlcnRpbmcgYW55IG1hY2hpbmUtZGVwZW5kZW50IGZyYWdzIHVzaW5nIG1kX2NvbnZlcnRfZnJhZygpOwotICAgKi8KLSAgc3Vic2VnX2NoYW5nZSAoU0VHX1RFWFQsIDApOwotCi0gIGZvciAoZnJhZ1AgPSB0ZXh0X2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0gICAgewotICAgICAgLyogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGxpbmtlZCBhbGwgdGhlIGZyYWdzIGludG8gYSBzaW5nbGUKLSAgICAgICAgIGNoYWluLiAgSG93ZXZlciwgY3Z0X2ZyYWdfdG9fZmlsbCBtYXkgY2FsbCBtZF9jb252ZXJ0X2ZyYWcKLSAgICAgICAgIHdoaWNoIG1heSBjYWxsIGZpeF9uZXcuICBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGZpeF9uZXcgYWRkcwotICAgICAgICAgdGhlIGZpeHVwIHRvIHRoZSByaWdodCBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChmcmFnUCA9PSBkYXRhX2ZyYWdfcm9vdCkKLQlzdWJzZWdfY2hhbmdlIChTRUdfREFUQSwgMCk7Ci0KLSAgICAgIGN2dF9mcmFnX3RvX2ZpbGwgKCZoZWFkZXJzLCBTRUdfVEVYVCwgZnJhZ1ApOwotCi0gICAgICAvKiBTb21lIGFzc2VydCBtYWNyb3MgZG9uJ3Qgd29yayB3aXRoICMgZGlyZWN0aXZlcyBtaXhlZCBpbi4gICovCi0jaWZuZGVmIE5ERUJVRwotICAgICAgaWYgKCEoZnJhZ1AtPmZyX25leHQgPT0gTlVMTAotI2lmZGVmIE9CSl9CT1VUCi0JICAgIHx8IGZyYWdQLT5mcl9uZXh0ID09IGRhdGFfZnJhZ19yb290Ci0jZW5kaWYKLQkgICAgfHwgKChmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWdQLT5mcl9hZGRyZXNzKQotCQk9PSAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9vZmZzZXQgKiBmcmFnUC0+ZnJfdmFyKSkpKQotCWFib3J0ICgpOwotI2VuZGlmCi0gICAgfQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgewotICAgIHN0cnVjdCBicm9rZW5fd29yZCAqbGllOwotICAgIHN0cnVjdCBicm9rZW5fd29yZCAqKnByZXZQOwotCi0gICAgcHJldlAgPSAmYnJva2VuX3dvcmRzOwotICAgIGZvciAobGllID0gYnJva2VuX3dvcmRzOyBsaWU7IGxpZSA9IGxpZS0+bmV4dF9icm9rZW5fd29yZCkKLSAgICAgIGlmICghbGllLT5hZGRlZCkKLQl7Ci0JICBleHByZXNzaW9uUyBleHA7Ci0KLQkgIHN1YnNlZ19jaGFuZ2UgKGxpZS0+c2VnLCBsaWUtPnN1YnNlZyk7Ci0JICBleHAuWF9vcCA9IE9fc3VidHJhY3Q7Ci0JICBleHAuWF9hZGRfc3ltYm9sID0gbGllLT5hZGQ7Ci0JICBleHAuWF9vcF9zeW1ib2wgPSBsaWUtPnN1YjsKLQkgIGV4cC5YX2FkZF9udW1iZXIgPSBsaWUtPmFkZG51bTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZkZWYgVENfQ09OU19GSVhfTkVXCi0JICBUQ19DT05TX0ZJWF9ORVcgKGxpZS0+ZnJhZywKLQkJICAgICAgIGxpZS0+d29yZF9nb2VzX2hlcmUgLSBsaWUtPmZyYWctPmZyX2xpdGVyYWwsCi0JCSAgICAgICAyLCAmZXhwKTsKLSNlbHNlCi0JICBmaXhfbmV3X2V4cCAobGllLT5mcmFnLAotCQkgICAgICAgbGllLT53b3JkX2dvZXNfaGVyZSAtIGxpZS0+ZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDIsICZleHAsIDAsIEJGRF9SRUxPQ18xNik7Ci0jZW5kaWYKLSNlbHNlCi0jaWYgZGVmaW5lZChUQ19TUEFSQykgfHwgZGVmaW5lZChUQ19BMjlLKSB8fCBkZWZpbmVkKE5FRURfRlhfUl9UWVBFKQotCSAgZml4X25ld19leHAgKGxpZS0+ZnJhZywKLQkJICAgICAgIGxpZS0+d29yZF9nb2VzX2hlcmUgLSBsaWUtPmZyYWctPmZyX2xpdGVyYWwsCi0JCSAgICAgICAyLCAmZXhwLCAwLCBOT19SRUxPQyk7Ci0jZWxzZQotI2lmZGVmIFRDX05TMzJLCi0JICBmaXhfbmV3X25zMzJrX2V4cCAobGllLT5mcmFnLAotCQkJICAgICBsaWUtPndvcmRfZ29lc19oZXJlIC0gbGllLT5mcmFnLT5mcl9saXRlcmFsLAotCQkJICAgICAyLCAmZXhwLCAwLCAwLCAyLCAwLCAwKTsKLSNlbHNlCi0JICBmaXhfbmV3X2V4cCAobGllLT5mcmFnLAotCQkgICAgICAgbGllLT53b3JkX2dvZXNfaGVyZSAtIGxpZS0+ZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDIsICZleHAsIDAsIDApOwotI2VuZGlmIC8qIFRDX05TMzJLICovCi0jZW5kaWYgLyogVENfU1BBUkN8VENfQTI5S3xORUVEX0ZYX1JfVFlQRSAqLwotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQkgICpwcmV2UCA9IGxpZS0+bmV4dF9icm9rZW5fd29yZDsKLQl9Ci0gICAgICBlbHNlCi0JcHJldlAgPSAmKGxpZS0+bmV4dF9icm9rZW5fd29yZCk7Ci0KLSAgICBmb3IgKGxpZSA9IGJyb2tlbl93b3JkczsgbGllOykKLSAgICAgIHsKLQlzdHJ1Y3QgYnJva2VuX3dvcmQgKnVudHJ1dGg7Ci0JY2hhciAqdGFibGVfcHRyOwotCWFkZHJlc3NUIHRhYmxlX2FkZHI7Ci0JYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotCWludCBuLCBtOwotCi0Jc3Vic2VnX2NoYW5nZSAobGllLT5zZWcsIGxpZS0+c3Vic2VnKTsKLQlmcmFnUCA9IGxpZS0+ZGlzcGZyYWc7Ci0KLQkvKiBGaW5kIG91dCBob3cgbWFueSBicm9rZW5fd29yZHMgZ28gaGVyZS4gICovCi0JbiA9IDA7Ci0JZm9yICh1bnRydXRoID0gbGllOyB1bnRydXRoICYmIHVudHJ1dGgtPmRpc3BmcmFnID09IGZyYWdQOyB1bnRydXRoID0gdW50cnV0aC0+bmV4dF9icm9rZW5fd29yZCkKLQkgIGlmICh1bnRydXRoLT5hZGRlZCA9PSAxKQotCSAgICBuKys7Ci0KLQl0YWJsZV9wdHIgPSBsaWUtPmRpc3BmcmFnLT5mcl9vcGNvZGU7Ci0JdGFibGVfYWRkciA9IGxpZS0+ZGlzcGZyYWctPmZyX2FkZHJlc3MgKyAodGFibGVfcHRyIC0gbGllLT5kaXNwZnJhZy0+ZnJfbGl0ZXJhbCk7Ci0JLyogQ3JlYXRlIHRoZSBqdW1wIGFyb3VuZCB0aGUgbG9uZyBqdW1wcy4gIFRoaXMgaXMgYSBzaG9ydAotCSAgIGp1bXAgZnJvbSB0YWJsZV9wdHIrMCB0byB0YWJsZV9wdHIrbipsb25nX2p1bXBfc2l6ZS4gICovCi0JZnJvbV9hZGRyID0gdGFibGVfYWRkcjsKLQl0b19hZGRyID0gdGFibGVfYWRkciArIG1kX3Nob3J0X2p1bXBfc2l6ZSArIG4gKiBtZF9sb25nX2p1bXBfc2l6ZTsKLQltZF9jcmVhdGVfc2hvcnRfanVtcCAodGFibGVfcHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGxpZS0+ZGlzcGZyYWcsIGxpZS0+YWRkKTsKLQl0YWJsZV9wdHIgKz0gbWRfc2hvcnRfanVtcF9zaXplOwotCXRhYmxlX2FkZHIgKz0gbWRfc2hvcnRfanVtcF9zaXplOwotCi0JZm9yIChtID0gMDsgbGllICYmIGxpZS0+ZGlzcGZyYWcgPT0gZnJhZ1A7IG0rKywgbGllID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkKQotCSAgewotCSAgICBpZiAobGllLT5hZGRlZCA9PSAyKQotCSAgICAgIGNvbnRpbnVlOwotCSAgICAvKiBQYXRjaCB0aGUganVtcCB0YWJsZSAqLwotCSAgICAvKiBUaGlzIGlzIHRoZSBvZmZzZXQgZnJvbSA/Pz8gdG8gdGFibGVfcHRyKzAgKi8KLQkgICAgdG9fYWRkciA9IHRhYmxlX2FkZHIgLSBTX0dFVF9WQUxVRSAobGllLT5zdWIpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgICAgdG9fYWRkciAtPSBzeW1ib2xfZ2V0X2ZyYWcgKGxpZS0+c3ViKS0+ZnJfYWRkcmVzczsKLSNlbmRpZgotCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpZS0+d29yZF9nb2VzX2hlcmUsIHRvX2FkZHIsIDIpOwotCSAgICBmb3IgKHVudHJ1dGggPSBsaWUtPm5leHRfYnJva2VuX3dvcmQ7IHVudHJ1dGggJiYgdW50cnV0aC0+ZGlzcGZyYWcgPT0gZnJhZ1A7IHVudHJ1dGggPSB1bnRydXRoLT5uZXh0X2Jyb2tlbl93b3JkKQotCSAgICAgIHsKLQkJaWYgKHVudHJ1dGgtPnVzZV9qdW1wID09IGxpZSkKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHVudHJ1dGgtPndvcmRfZ29lc19oZXJlLCB0b19hZGRyLCAyKTsKLQkgICAgICB9Ci0KLQkgICAgLyogSW5zdGFsbCB0aGUgbG9uZyBqdW1wICovCi0JICAgIC8qIHRoaXMgaXMgYSBsb25nIGp1bXAgZnJvbSB0YWJsZV9wdHIrMCB0byB0aGUgZmluYWwgdGFyZ2V0ICovCi0JICAgIGZyb21fYWRkciA9IHRhYmxlX2FkZHI7Ci0JICAgIHRvX2FkZHIgPSBTX0dFVF9WQUxVRSAobGllLT5hZGQpICsgbGllLT5hZGRudW07Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgICB0b19hZGRyICs9IHN5bWJvbF9nZXRfZnJhZyAobGllLT5hZGQpLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0JICAgIG1kX2NyZWF0ZV9sb25nX2p1bXAgKHRhYmxlX3B0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBsaWUtPmRpc3BmcmFnLCBsaWUtPmFkZCk7Ci0JICAgIHRhYmxlX3B0ciArPSBtZF9sb25nX2p1bXBfc2l6ZTsKLQkgICAgdGFibGVfYWRkciArPSBtZF9sb25nX2p1bXBfc2l6ZTsKLQkgIH0KLSAgICAgIH0KLSAgfQotI2VuZGlmIC8qIG5vdCBXT1JLSU5HX0RPVF9XT1JEICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2lmbmRlZglPQkpfVk1TCi0gIHsJCQkJLyogbm90IHZtcyAqLwotICAgIGNoYXIgKnRoZV9vYmplY3RfZmlsZTsKLSAgICBsb25nIG9iamVjdF9maWxlX3NpemU7Ci0gICAgLyoKLSAgICAgKiBTY2FuIGV2ZXJ5IEZpeFMgcGVyZm9ybWluZyBmaXh1cHMuIFdlIGhhZCB0byB3YWl0IHVudGlsIG5vdyB0byBkbwotICAgICAqIHRoaXMgYmVjYXVzZSBtZF9jb252ZXJ0X2ZyYWcoKSBtYXkgaGF2ZSBtYWRlIHNvbWUgZml4U3MuCi0gICAgICovCi0gICAgaW50IHRyc2l6ZSwgZHJzaXplOwotCi0gICAgc3Vic2VnX2NoYW5nZSAoU0VHX1RFWFQsIDApOwotICAgIHRyc2l6ZSA9IG1kX3JlbG9jX3NpemUgKiBmaXh1cF9zZWdtZW50ICh0ZXh0X2ZpeF9yb290LCBTRUdfVEVYVCk7Ci0gICAgc3Vic2VnX2NoYW5nZSAoU0VHX0RBVEEsIDApOwotICAgIGRyc2l6ZSA9IG1kX3JlbG9jX3NpemUgKiBmaXh1cF9zZWdtZW50IChkYXRhX2ZpeF9yb290LCBTRUdfREFUQSk7Ci0gICAgSF9TRVRfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycywgdHJzaXplLCBkcnNpemUpOwotCi0gICAgLyogRklYTUUgbW92ZSB0aGlzIHN0dWZmIGludG8gdGhlIHByZS13cml0ZS1ob29rICovCi0gICAgSF9TRVRfTUFHSUNfTlVNQkVSICgmaGVhZGVycywgbWFnaWNfbnVtYmVyX2Zvcl9vYmplY3RfZmlsZSk7Ci0gICAgSF9TRVRfRU5UUllfUE9JTlQgKCZoZWFkZXJzLCAwKTsKLQotICAgIG9ial9wcmVfd3JpdGVfaG9vayAoJmhlYWRlcnMpOwkvKiBleHRyYSBjb2ZmIHN0dWZmICovCi0KLSAgICBvYmplY3RfZmlsZV9zaXplID0gSF9HRVRfRklMRV9TSVpFICgmaGVhZGVycyk7Ci0gICAgbmV4dF9vYmplY3RfZmlsZV9jaGFyUCA9IHRoZV9vYmplY3RfZmlsZSA9IHhtYWxsb2MgKG9iamVjdF9maWxlX3NpemUpOwotCi0gICAgb3V0cHV0X2ZpbGVfY3JlYXRlIChvdXRfZmlsZV9uYW1lKTsKLQotICAgIG9ial9oZWFkZXJfYXBwZW5kICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgJmhlYWRlcnMpOwotCi0gICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IEhfR0VUX0hFQURFUl9TSVpFICgmaGVhZGVycykpOwotCi0gICAgLyoKLSAgICAgKiBFbWl0IGNvZGUuCi0gICAgICovCi0gICAgZm9yIChmcmFnUCA9IHRleHRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLSAgICAgIHsKLQlyZWdpc3RlciBsb25nIGNvdW50OwotCXJlZ2lzdGVyIGNoYXIgKmZpbGxfbGl0ZXJhbDsKLQlyZWdpc3RlciBsb25nIGZpbGxfc2l6ZTsKLQotCVBST0dSRVNTICgxKTsKLQlrbm93IChmcmFnUC0+ZnJfdHlwZSA9PSByc19maWxsKTsKLQlhcHBlbmQgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBmcmFnUC0+ZnJfbGl0ZXJhbCwgKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9maXgpOwotCWZpbGxfbGl0ZXJhbCA9IGZyYWdQLT5mcl9saXRlcmFsICsgZnJhZ1AtPmZyX2ZpeDsKLQlmaWxsX3NpemUgPSBmcmFnUC0+ZnJfdmFyOwotCWtub3cgKGZyYWdQLT5mcl9vZmZzZXQgPj0gMCk7Ci0KLQlmb3IgKGNvdW50ID0gZnJhZ1AtPmZyX29mZnNldDsgY291bnQ7IGNvdW50LS0pCi0JICB7Ci0JICAgIGFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIGZpbGxfbGl0ZXJhbCwgKHVuc2lnbmVkIGxvbmcpIGZpbGxfc2l6ZSk7Ci0JICB9CQkJLyogZm9yIGVhY2ggICovCi0KLSAgICAgIH0JCQkJLyogZm9yIGVhY2ggY29kZSBmcmFnLiAqLwotCi0gICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IChIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSkpOwotCi0gICAgLyoKLSAgICAgKiBFbWl0IHJlbG9jYXRpb25zLgotICAgICAqLwotICAgIG9ial9lbWl0X3JlbG9jYXRpb25zICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgdGV4dF9maXhfcm9vdCwgKHJlbGF4X2FkZHJlc3NUKSAwKTsKLSAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gKEhfR0VUX0hFQURFUl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSkpOwotI2lmZGVmIFRDX0k5NjAKLSAgICAvKiBNYWtlIGFkZHJlc3NlcyBpbiBkYXRhIHJlbG9jYXRpb24gZGlyZWN0aXZlcyByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YKLSAgICAgKiBmaXJzdCBkYXRhIGZyYWdtZW50LCBub3QgZW5kIG9mIGxhc3QgdGV4dCBmcmFnbWVudDogIGFsaWdubWVudCBvZiB0aGUKLSAgICAgKiBzdGFydCBvZiB0aGUgZGF0YSBzZWdtZW50IG1heSBwbGFjZSBhIGdhcCBiZXR3ZWVuIHRoZSBzZWdtZW50cy4KLSAgICAgKi8KLSAgICBvYmpfZW1pdF9yZWxvY2F0aW9ucyAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIGRhdGFfZml4X3Jvb3QsIGRhdGEwX2ZyY2hhaW5QLT5mcmNoX3Jvb3QtPmZyX2FkZHJlc3MpOwotI2Vsc2UgLyogVENfSTk2MCAqLwotICAgIG9ial9lbWl0X3JlbG9jYXRpb25zICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgZGF0YV9maXhfcm9vdCwgdGV4dF9sYXN0X2ZyYWctPmZyX2FkZHJlc3MpOwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotICAgIGtub3cgKChuZXh0X29iamVjdF9maWxlX2NoYXJQIC0gdGhlX29iamVjdF9maWxlKSA9PSAoSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSkpOwotCi0gICAgLyoKLSAgICAgKiBFbWl0IGxpbmUgbnVtYmVyIGVudHJpZXMuCi0gICAgICovCi0gICAgT0JKX0VNSVRfTElORU5PICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgbGluZW5vX3Jvb3RQLCB0aGVfb2JqZWN0X2ZpbGUpOwotICAgIGtub3cgKChuZXh0X29iamVjdF9maWxlX2NoYXJQIC0gdGhlX29iamVjdF9maWxlKSA9PSAoSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0xJTkVOT19TSVpFICgmaGVhZGVycykpKTsKLQotICAgIC8qCi0gICAgICogRW1pdCBzeW1ib2xzLgotICAgICAqLwotICAgIG9ial9lbWl0X3N5bWJvbHMgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBzeW1ib2xfcm9vdFApOwotICAgIGtub3cgKChuZXh0X29iamVjdF9maWxlX2NoYXJQIC0gdGhlX29iamVjdF9maWxlKSA9PSAoSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0xJTkVOT19TSVpFICgmaGVhZGVycykgKyBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRSAoJmhlYWRlcnMpKSk7Ci0KLSAgICAvKgotICAgICAqIEVtaXQgc3RyaW5ncy4KLSAgICAgKi8KLQotICAgIGlmIChzdHJpbmdfYnl0ZV9jb3VudCA+IDApCi0gICAgICB7Ci0Jb2JqX2VtaXRfc3RyaW5ncyAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclApOwotICAgICAgfQkJCQkvKiBvbmx5IGlmIHdlIGhhdmUgYSBzdHJpbmcgdGFibGUgKi8KLQotI2lmZGVmIEJGRF9IRUFERVJTCi0gICAgYmZkX3NlZWsgKHN0ZG91dHB1dCwgMCwgMCk7Ci0gICAgYmZkX3dyaXRlICh0aGVfb2JqZWN0X2ZpbGUsIDEsIG9iamVjdF9maWxlX3NpemUsIHN0ZG91dHB1dCk7Ci0jZWxzZQotCi0gICAgLyogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIGZpbGUgKi8KLSAgICBvdXRwdXRfZmlsZV9hcHBlbmQgKHRoZV9vYmplY3RfZmlsZSwgb2JqZWN0X2ZpbGVfc2l6ZSwgb3V0X2ZpbGVfbmFtZSk7Ci0gICAgZnJlZSAodGhlX29iamVjdF9maWxlKTsKLSNlbmRpZgotICB9CQkJCS8qIG5vbiB2bXMgb3V0cHV0ICovCi0jZWxzZSAvKiBPQkpfVk1TICovCi0gIC8qCi0gICAqCU5vdyBkbyB0aGUgVk1TLWRlcGVuZGVudCBwYXJ0IG9mIHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlCi0gICAqLwotICB2bXNfd3JpdGVfb2JqZWN0X2ZpbGUgKEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpLAotCQkJIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpLAotCQkJIEhfR0VUX0JTU19TSVpFICgmaGVhZGVycyksCi0JCQkgdGV4dF9mcmFnX3Jvb3QsIGRhdGFfZnJhZ19yb290KTsKLSNlbmRpZiAvKiBPQkpfVk1TICovCi0jZWxzZSAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSAgLyogUmVzb2x2ZSBzeW1ib2wgdmFsdWVzLiAgVGhpcyBuZWVkcyB0byBiZSBkb25lIGJlZm9yZSBwcm9jZXNzaW5nCi0gICAgIHRoZSByZWxvY2F0aW9ucy4gICovCi0gIGlmIChzeW1ib2xfcm9vdFApCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltcDsKLQotICAgICAgZm9yIChzeW1wID0gc3ltYm9sX3Jvb3RQOyBzeW1wOyBzeW1wID0gc3ltYm9sX25leHQgKHN5bXApKQotCXJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1wLCAxKTsKLSAgICB9Ci0gIHJlc29sdmVfbG9jYWxfc3ltYm9sX3ZhbHVlcyAoKTsKLQotICBQUk9HUkVTUyAoMSk7Ci0KLSNpZmRlZiB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdAotICB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKTsKLSNlbmRpZgotI2lmZGVmIG9ial9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdAotICBvYmpfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKCk7Ci0jZW5kaWYKLQotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgYWRqdXN0X3JlbG9jX3N5bXMsIChjaGFyICopMCk7Ci0KLSAgLyogU2V0IHVwIHN5bWJvbCB0YWJsZSwgYW5kIHdyaXRlIGl0IG91dC4gICovCi0gIGlmIChzeW1ib2xfcm9vdFApCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltcDsKLQotICAgICAgZm9yIChzeW1wID0gc3ltYm9sX3Jvb3RQOyBzeW1wOyBzeW1wID0gc3ltYm9sX25leHQgKHN5bXApKQotCXsKLQkgIGludCBwdW50ID0gMDsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgIGlmIChzeW1ib2xfbXJpX2NvbW1vbl9wIChzeW1wKSkKLQkgICAgewotCSAgICAgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1wKSkKLQkJYXNfYmFkIChfKCIlczogZ2xvYmFsIHN5bWJvbHMgbm90IHN1cHBvcnRlZCBpbiBjb21tb24gc2VjdGlvbnMiKSwKLQkJCVNfR0VUX05BTUUgKHN5bXApKTsKLQkgICAgICBzeW1ib2xfcmVtb3ZlIChzeW1wLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBuYW1lID0gU19HRVRfTkFNRSAoc3ltcCk7Ci0JICBpZiAobmFtZSkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUyID0gZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUgKChjaGFyICopU19HRVRfTkFNRSAoc3ltcCkpOwotCSAgICAgIC8qIFRoZXkgb25seSBkaWZmZXIgaWYgYG5hbWUnIGlzIGEgZmIgb3IgZG9sbGFyIGxvY2FsCi0JCSBsYWJlbCBuYW1lLiAgKi8KLQkgICAgICBpZiAobmFtZTIgIT0gbmFtZSAmJiAhIFNfSVNfREVGSU5FRCAoc3ltcCkpCi0JCWFzX2JhZCAoXygibG9jYWwgbGFiZWwgJXMgaXMgbm90IGRlZmluZWQiKSwgbmFtZTIpOwotCSAgICB9Ci0KLQkgIC8qIERvIGl0IGFnYWluLCBiZWNhdXNlIGFkanVzdF9yZWxvY19zeW1zIG1pZ2h0IGludHJvZHVjZQotCSAgICAgbW9yZSBzeW1ib2xzLiAgVGhleSdsbCBwcm9iYWJseSBvbmx5IGJlIHNlY3Rpb24gc3ltYm9scywKLQkgICAgIGJ1dCB0aGV5J2xsIHN0aWxsIG5lZWQgdG8gaGF2ZSB0aGUgdmFsdWVzIGNvbXB1dGVkLiAgKi8KLQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1wLCAxKTsKLQotCSAgLyogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byB1bmRlZmluZWQgb3IgY29tbW9uCi0gICAgICAgICAgICAgc3ltYm9scy4gICovCi0JICBpZiAoc3ltYm9sX2VxdWF0ZWRfcCAoc3ltcCkKLQkgICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bXApIHx8IFNfSVNfQ09NTU9OIChzeW1wKSkpCi0JICAgIHsKLQkgICAgICBzeW1ib2xfcmVtb3ZlIChzeW1wLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBTbyBmYXIsIGNvbW1vbiBzeW1ib2xzIGhhdmUgYmVlbiB0cmVhdGVkIGxpa2UgdW5kZWZpbmVkIHN5bWJvbHMuCi0JICAgICBQdXQgdGhlbSBpbiB0aGUgY29tbW9uIHNlY3Rpb24gbm93LiAgKi8KLQkgIGlmIChTX0lTX0RFRklORUQgKHN5bXApID09IDAKLQkgICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltcCkgIT0gMCkKLQkgICAgU19TRVRfU0VHTUVOVCAoc3ltcCwgYmZkX2NvbV9zZWN0aW9uX3B0cik7Ci0jaWYgMAotCSAgcHJpbnRmICgic3ltYm9sIGAlcydcblx0QCV4OiB2YWx1ZT0lZCBmbGFncz0leCBzZWc9JXNcbiIsCi0JCSAgU19HRVRfTkFNRSAoc3ltcCksIHN5bXAsCi0JCSAgU19HRVRfVkFMVUUgKHN5bXApLAotCQkgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+ZmxhZ3MsCi0JCSAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW1wKSkpOwotI2VuZGlmCi0KLSNpZmRlZiBvYmpfZnJvYl9zeW1ib2wKLQkgIG9ial9mcm9iX3N5bWJvbCAoc3ltcCwgcHVudCk7Ci0jZW5kaWYKLSNpZmRlZiB0Y19mcm9iX3N5bWJvbAotCSAgaWYgKCEgcHVudCB8fCBzeW1ib2xfdXNlZF9pbl9yZWxvY19wIChzeW1wKSkKLQkgICAgdGNfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnQpOwotI2VuZGlmCi0KLQkgIC8qIElmIHdlIGRvbid0IHdhbnQgdG8ga2VlcCB0aGlzIHN5bWJvbCwgc3BsaWNlIGl0IG91dCBvZgotCSAgICAgdGhlIGNoYWluIG5vdy4gIElmIEVNSVRfU0VDVElPTl9TWU1CT0xTIGlzIDAsIHdlIG5ldmVyCi0JICAgICB3YW50IHNlY3Rpb24gc3ltYm9scy4gIE90aGVyd2lzZSwgd2Ugc2tpcCBsb2NhbCBzeW1ib2xzCi0JICAgICBhbmQgc3ltYm9scyB0aGF0IHRoZSBmcm9iX3N5bWJvbCBtYWNyb3MgdG9sZCB1cyB0byBwdW50LAotCSAgICAgYnV0IHdlIGtlZXAgc3VjaCBzeW1ib2xzIGlmIHRoZXkgYXJlIHVzZWQgaW4gcmVsb2NzLiAgKi8KLQkgIGlmICgoISBFTUlUX1NFQ1RJT05fU1lNQk9MUwotCSAgICAgICAmJiBzeW1ib2xfc2VjdGlvbl9wIChzeW1wKSkKLQkgICAgICAvKiBOb3RlIHRoYXQgU19JU19FWFRFUk4gYW5kIFNfSVNfTE9DQUwgYXJlIG5vdCBhbHdheXMKLQkJIG9wcG9zaXRlcy4gIFNvbWV0aW1lcyB0aGUgZm9ybWVyIGNoZWNrcyBmbGFncyBhbmQgdGhlCi0JCSBsYXR0ZXIgZXhhbWluZXMgdGhlIG5hbWUuLi4gICovCi0JICAgICAgfHwgKCFTX0lTX0VYVEVSTiAoc3ltcCkKLQkJICAmJiAoU19JU19MT0NBTCAoc3ltcCkgfHwgcHVudCkKLQkJICAmJiAhIHN5bWJvbF91c2VkX2luX3JlbG9jX3AgKHN5bXApKSkKLQkgICAgewotCSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bXAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIC8qIEFmdGVyIHN5bWJvbF9yZW1vdmUsIHN5bWJvbF9uZXh0KHN5bXApIHN0aWxsIHJldHVybnMKLQkJIHRoZSBvbmUgdGhhdCBjYW1lIGFmdGVyIGl0IGluIHRoZSBjaGFpbi4gIFNvIHdlIGRvbid0Ci0JCSBuZWVkIHRvIGRvIGFueSBleHRyYSBjbGVhbnVwIHdvcmsgaGVyZS4gICovCi0KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBNYWtlIHN1cmUgd2UgcmVhbGx5IGdvdCBhIHZhbHVlIGZvciB0aGUgc3ltYm9sLiAgKi8KLQkgIGlmICghIHN5bWJvbF9yZXNvbHZlZF9wIChzeW1wKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiY2FuJ3QgcmVzb2x2ZSB2YWx1ZSBmb3Igc3ltYm9sIFwiJXNcIiIpLAotCQkgICAgICBTX0dFVF9OQU1FIChzeW1wKSk7Ci0JICAgICAgc3ltYm9sX21hcmtfcmVzb2x2ZWQgKHN5bXApOwotCSAgICB9Ci0KLQkgIC8qIFNldCB0aGUgdmFsdWUgaW50byB0aGUgQkZEIHN5bWJvbC4gIFVwIHRpbCBub3cgdGhlIHZhbHVlCi0JICAgICBoYXMgb25seSBiZWVuIGtlcHQgaW4gdGhlIGdhcyBzeW1ib2xTIHN0cnVjdC4gICovCi0JICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPnZhbHVlID0gU19HRVRfVkFMVUUgKHN5bXApOwotCX0KLSAgICB9Ci0KLSAgUFJPR1JFU1MgKDEpOwotCi0gIC8qIE5vdyBkbyBhbnkgZm9ybWF0LXNwZWNpZmljIGFkanVzdG1lbnRzIHRvIHRoZSBzeW1ib2wgdGFibGUsIHN1Y2gKLSAgICAgYXMgYWRkaW5nIGZpbGUgc3ltYm9scy4gICovCi0jaWZkZWYgdGNfYWRqdXN0X3N5bXRhYgotICB0Y19hZGp1c3Rfc3ltdGFiICgpOwotI2VuZGlmCi0jaWZkZWYgb2JqX2FkanVzdF9zeW10YWIKLSAgb2JqX2FkanVzdF9zeW10YWIgKCk7Ci0jZW5kaWYKLQotICAvKiBOb3cgdGhhdCBhbGwgdGhlIHNpemVzIGFyZSBrbm93biwgYW5kIGNvbnRlbnRzIGNvcnJlY3QsIHdlIGNhbgotICAgICBzdGFydCB3cml0aW5nIHRvIHRoZSBmaWxlLiAgKi8KLSAgc2V0X3N5bXRhYiAoKTsKLQotICAvKiBJZiAqX2Zyb2JfZmlsZSBjaGFuZ2VzIHRoZSBzeW1ib2wgdmFsdWUgYXQgdGhpcyBwb2ludCwgaXQgaXMKLSAgICAgcmVzcG9uc2libGUgZm9yIG1vdmluZyB0aGUgY2hhbmdlZCB2YWx1ZSBpbnRvIHN5bXAtPmJzeW0tPnZhbHVlCi0gICAgIGFzIHdlbGwuICBIb3BlZnVsbHkgYWxsIHN5bWJvbCB2YWx1ZSBjaGFuZ2luZyBjYW4gYmUgZG9uZSBpbgotICAgICAqX2Zyb2Jfc3ltYm9sLiAgKi8KLSNpZmRlZiB0Y19mcm9iX2ZpbGUKLSAgdGNfZnJvYl9maWxlICgpOwotI2VuZGlmCi0jaWZkZWYgb2JqX2Zyb2JfZmlsZQotICBvYmpfZnJvYl9maWxlICgpOwotI2VuZGlmCi0KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIHdyaXRlX3JlbG9jcywgKGNoYXIgKikgMCk7Ci0KLSNpZmRlZiB0Y19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi0gIHRjX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCk7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotICBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAoKTsKLSNlbmRpZgotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCB3cml0ZV9jb250ZW50cywgKGNoYXIgKikgMCk7Ci0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotfQotI2VuZGlmIC8qICEgQkZEICovCi0KLS8qCi0gKgkJCXJlbGF4X3NlZ21lbnQoKQotICoKLSAqIE5vdyB3ZSBoYXZlIGEgc2VnbWVudCwgbm90IGEgY3Jvd2Qgb2Ygc3ViLXNlZ21lbnRzLCB3ZSBjYW4gbWFrZSBmcl9hZGRyZXNzCi0gKiB2YWx1ZXMuCi0gKgotICogUmVsYXggdGhlIGZyYWdzLgotICoKLSAqIEFmdGVyIHRoaXMsIGFsbCBmcmFncyBpbiB0aGlzIHNlZ21lbnQgaGF2ZSBhZGRyZXNzZXMgdGhhdCBhcmUgY29ycmVjdAotICogd2l0aGluIHRoZSBzZWdtZW50LiBTaW5jZSBzZWdtZW50cyBsaXZlIGluIGRpZmZlcmVudCBmaWxlIGFkZHJlc3NlcywKLSAqIHRoZXNlIGZyYWcgYWRkcmVzc2VzIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgZmluYWwgb2JqZWN0LWZpbGUgYWRkcmVzc2VzLgotICovCi0KLSNpZmRlZiBUQ19HRU5FUklDX1JFTEFYX1RBQkxFCi0KLXN0YXRpYyBpbnQgaXNfZG5yYW5nZSBQQVJBTVMgKChmcmFnUyAqLCBmcmFnUyAqKSk7Ci0KLS8qIFN1YnJvdXRpbmVzIG9mIHJlbGF4X3NlZ21lbnQuICAqLwotc3RhdGljIGludAotaXNfZG5yYW5nZSAoZjEsIGYyKQotICAgICBmcmFnUyAqZjE7Ci0gICAgIGZyYWdTICpmMjsKLXsKLSAgZm9yICg7IGYxOyBmMSA9IGYxLT5mcl9uZXh0KQotICAgIGlmIChmMS0+ZnJfbmV4dCA9PSBmMikKLSAgICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotLyogUmVsYXggYSBmcmFnbWVudCBieSBzY2FubmluZyBUQ19HRU5FUklDX1JFTEFYX1RBQkxFLiAgKi8KLQotbG9uZwotcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpCi0gICAgIGZyYWdTICpmcmFnUDsKLSAgICAgbG9uZyBzdHJldGNoOwotewotICBjb25zdCByZWxheF90eXBlUyAqdGhpc190eXBlOwotICBjb25zdCByZWxheF90eXBlUyAqc3RhcnRfdHlwZTsKLSAgcmVsYXhfc3Vic3RhdGVUIG5leHRfc3RhdGU7Ci0gIHJlbGF4X3N1YnN0YXRlVCB0aGlzX3N0YXRlOwotICBsb25nIGFpbSwgdGFyZ2V0LCBncm93dGg7Ci0gIHN5bWJvbFMgKnN5bWJvbFAgPSBmcmFnUC0+ZnJfc3ltYm9sOwotICBsb25nIG9mZnNldCA9IGZyYWdQLT5mcl9vZmZzZXQ7Ci0gIC8qIFJlY29tcHV0ZSB3YXNfYWRkcmVzcyBieSB1bmRvaW5nICIrPSBzdHJldGNoIiBkb25lIGJ5IHJlbGF4X3NlZ21lbnQuICAqLwotICB1bnNpZ25lZCBsb25nIHdhc19hZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgLSBzdHJldGNoOwotICB1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzczsKLSAgY29uc3QgcmVsYXhfdHlwZVMgKnRhYmxlID0gVENfR0VORVJJQ19SRUxBWF9UQUJMRTsKLQotICB0aGlzX3N0YXRlID0gZnJhZ1AtPmZyX3N1YnR5cGU7Ci0gIHN0YXJ0X3R5cGUgPSB0aGlzX3R5cGUgPSB0YWJsZSArIHRoaXNfc3RhdGU7Ci0gIHRhcmdldCA9IG9mZnNldDsKLQotICBpZiAoc3ltYm9sUCkKLSAgICB7Ci0jaWZuZGVmIERJRkZfRVhQUl9PSwotI2lmICFkZWZpbmVkIChNQU5ZX1NFR01FTlRTKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgICAgIGtub3cgKChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfQUJTT0xVVEUpCi0JICAgIHx8IChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfREFUQSkKLQkgICAgfHwgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19CU1MpCi0JICAgIHx8IChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfVEVYVCkpOwotI2VuZGlmCi0gICAgICBrbm93IChzeW1ib2xQLT5zeV9mcmFnKTsKLSNlbmRpZgotICAgICAga25vdyAoIShTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB8fCBzeW1ib2xQLT5zeV9mcmFnID09ICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICB0YXJnZXQgKz0JU19HRVRfVkFMVUUgKHN5bWJvbFApICsgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfYWRkcmVzczsKLQotICAgICAgLyogSWYgZnJhZyBoYXMgeWV0IHRvIGJlIHJlYWNoZWQgb24gdGhpcyBwYXNzLAotCSBhc3N1bWUgaXQgd2lsbCBtb3ZlIGJ5IFNUUkVUQ0gganVzdCBhcyB3ZSBkaWQuCi0JIElmIHRoaXMgaXMgbm90IHNvLCBpdCB3aWxsIGJlIGJlY2F1c2Ugc29tZSBmcmFnCi0JIGJldHdlZW4gZ3Jvd3MsIGFuZCB0aGF0IHdpbGwgZm9yY2UgYW5vdGhlciBwYXNzLgotCi0JIEJld2FyZSB6ZXJvLWxlbmd0aCBmcmFncy4KLQotCSBUaGVyZSBzaG91bGQgYmUgYSBmYXN0ZXIgd2F5IHRvIGRvIHRoaXMuICAqLwotCi0gICAgICBpZiAoc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfYWRkcmVzcyA+PSB3YXNfYWRkcmVzcwotCSAgJiYgaXNfZG5yYW5nZSAoZnJhZ1AsIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkpKQotCXsKLQkgIHRhcmdldCArPSBzdHJldGNoOwotCX0KLSAgICB9Ci0KLSAgYWltID0gdGFyZ2V0IC0gYWRkcmVzcyAtIGZyYWdQLT5mcl9maXg7Ci0jaWZkZWYgVENfUENSRUxfQURKVVNUCi0gIC8qIEN1cnJlbnRseSBvbmx5IHRoZSBuczMyayBmYW1pbHkgbmVlZHMgdGhpcyAqLwotICBhaW0gKz0gVENfUENSRUxfQURKVVNUKGZyYWdQKTsKLS8qI2Vsc2UqLwotICAvKiBUaGlzIG1hY2hpbmUgZG9lc24ndCB3YW50IHRvIHVzZSBwY3JlbF9hZGp1c3QuCi0gICAgIEluIHRoYXQgY2FzZSwgcGNyZWxfYWRqdXN0IHNob3VsZCBiZSB6ZXJvLiAgKi8KLS8qICBhc3NlcnQgKGZyYWdQLT5mcl90YXJnLm5zMzJrLnBjcmVsX2FkanVzdCA9PSAwKTsqLwotI2VuZGlmCi0jaWZkZWYgbWRfcHJlcGFyZV9yZWxheF9zY2FuIC8qIGZvcm1lcmx5IGNhbGxlZCBNNjhLX0FJTV9LTFVER0UgKi8KLSAgbWRfcHJlcGFyZV9yZWxheF9zY2FuIChmcmFnUCwgYWRkcmVzcywgYWltLCB0aGlzX3N0YXRlLCB0aGlzX3R5cGUpOwotI2VuZGlmCi0KLSAgaWYgKGFpbSA8IDApCi0gICAgewotICAgICAgLyogTG9vayBiYWNrd2FyZHMuICovCi0gICAgICBmb3IgKG5leHRfc3RhdGUgPSB0aGlzX3R5cGUtPnJseF9tb3JlOyBuZXh0X3N0YXRlOykKLQlpZiAoYWltID49IHRoaXNfdHlwZS0+cmx4X2JhY2t3YXJkKQotCSAgbmV4dF9zdGF0ZSA9IDA7Ci0JZWxzZQotCSAgewotCSAgICAvKiBHcm93IHRvIG5leHQgc3RhdGUuICovCi0JICAgIHRoaXNfc3RhdGUgPSBuZXh0X3N0YXRlOwotCSAgICB0aGlzX3R5cGUgPSB0YWJsZSArIHRoaXNfc3RhdGU7Ci0JICAgIG5leHRfc3RhdGUgPSB0aGlzX3R5cGUtPnJseF9tb3JlOwotCSAgfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIExvb2sgZm9yd2FyZHMuICovCi0gICAgICBmb3IgKG5leHRfc3RhdGUgPSB0aGlzX3R5cGUtPnJseF9tb3JlOyBuZXh0X3N0YXRlOykKLQlpZiAoYWltIDw9IHRoaXNfdHlwZS0+cmx4X2ZvcndhcmQpCi0JICBuZXh0X3N0YXRlID0gMDsKLQllbHNlCi0JICB7Ci0JICAgIC8qIEdyb3cgdG8gbmV4dCBzdGF0ZS4gKi8KLQkgICAgdGhpc19zdGF0ZSA9IG5leHRfc3RhdGU7Ci0JICAgIHRoaXNfdHlwZSA9IHRhYmxlICsgdGhpc19zdGF0ZTsKLQkgICAgbmV4dF9zdGF0ZSA9IHRoaXNfdHlwZS0+cmx4X21vcmU7Ci0JICB9Ci0gICAgfQotCi0gIGdyb3d0aCA9IHRoaXNfdHlwZS0+cmx4X2xlbmd0aCAtIHN0YXJ0X3R5cGUtPnJseF9sZW5ndGg7Ci0gIGlmIChncm93dGggIT0gMCkKLSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IHRoaXNfc3RhdGU7Ci0gIHJldHVybiBncm93dGg7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkIChUQ19HRU5FUklDX1JFTEFYX1RBQkxFKSAqLwotCi0vKiBSZWxheF9hbGlnbi4gQWR2YW5jZSBsb2NhdGlvbiBjb3VudGVyIHRvIG5leHQgYWRkcmVzcyB0aGF0IGhhcyAnYWxpZ25tZW50JwotICAgbG93ZXN0IG9yZGVyIGJpdHMgYWxsIDBzLCByZXR1cm4gc2l6ZSBvZiBhZGp1c3RtZW50IG1hZGUuICAqLwotc3RhdGljIHJlbGF4X2FkZHJlc3NUCi1yZWxheF9hbGlnbiAoYWRkcmVzcywgYWxpZ25tZW50KQotICAgICByZWdpc3RlciByZWxheF9hZGRyZXNzVCBhZGRyZXNzOwkvKiBBZGRyZXNzIG5vdy4gKi8KLSAgICAgcmVnaXN0ZXIgaW50IGFsaWdubWVudDsJLyogQWxpZ25tZW50IChiaW5hcnkpLiAqLwotewotICByZWxheF9hZGRyZXNzVCBtYXNrOwotICByZWxheF9hZGRyZXNzVCBuZXdfYWRkcmVzczsKLQotICBtYXNrID0gfigofjApIDw8IGFsaWdubWVudCk7Ci0gIG5ld19hZGRyZXNzID0gKGFkZHJlc3MgKyBtYXNrKSAmICh+bWFzayk7Ci0jaWZkZWYgTElOS0VSX1JFTEFYSU5HX1NIUklOS1NfT05MWQotICBpZiAobGlua3JlbGF4KQotICAgIC8qIFdlIG11c3QgcHJvdmlkZSBsb3RzIG9mIHBhZGRpbmcsIHNvIHRoZSBsaW5rZXIgY2FuIGRpc2NhcmQgaXQKLSAgICAgICB3aGVuIG5lZWRlZC4gIFRoZSBsaW5rZXIgd2lsbCBub3QgYWRkIGV4dHJhIHNwYWNlLCBldmVyLiAgKi8KLSAgICBuZXdfYWRkcmVzcyArPSAoMSA8PCBhbGlnbm1lbnQpOwotI2VuZGlmCi0gIHJldHVybiAobmV3X2FkZHJlc3MgLSBhZGRyZXNzKTsKLX0KLQotdm9pZAotcmVsYXhfc2VnbWVudCAoc2VnbWVudF9mcmFnX3Jvb3QsIHNlZ21lbnQpCi0gICAgIHN0cnVjdCBmcmFnICpzZWdtZW50X2ZyYWdfcm9vdDsKLSAgICAgc2VnVCBzZWdtZW50OwotewotICByZWdpc3RlciBzdHJ1Y3QgZnJhZyAqZnJhZ1A7Ci0gIHJlZ2lzdGVyIHJlbGF4X2FkZHJlc3NUIGFkZHJlc3M7Ci0jaWYgIWRlZmluZWQgKE1BTllfU0VHTUVOVFMpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICBrbm93IChzZWdtZW50ID09IFNFR19EQVRBIHx8IHNlZ21lbnQgPT0gU0VHX1RFWFQgfHwgc2VnbWVudCA9PSBTRUdfQlNTKTsKLSNlbmRpZgotICAvKiBJbiBjYXNlIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkgd2FudHMgdG8gbWFrZSBmaXhTcy4gKi8KLSAgc3Vic2VnX2NoYW5nZSAoc2VnbWVudCwgMCk7Ci0KLSAgLyogRm9yIGVhY2ggZnJhZyBpbiBzZWdtZW50OiBjb3VudCBhbmQgc3RvcmUgIChhIDFzdCBndWVzcyBvZikKLSAgICAgZnJfYWRkcmVzcy4gICovCi0gIGFkZHJlc3MgPSAwOwotICBmb3IgKGZyYWdQID0gc2VnbWVudF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotICAgIHsKLSAgICAgIGZyYWdQLT5mcl9hZGRyZXNzID0gYWRkcmVzczsKLSAgICAgIGFkZHJlc3MgKz0gZnJhZ1AtPmZyX2ZpeDsKLQotICAgICAgc3dpdGNoIChmcmFnUC0+ZnJfdHlwZSkKLQl7Ci0JY2FzZSByc19maWxsOgotCSAgYWRkcmVzcyArPSBmcmFnUC0+ZnJfb2Zmc2V0ICogZnJhZ1AtPmZyX3ZhcjsKLQkgIGJyZWFrOwotCi0JY2FzZSByc19hbGlnbjoKLQljYXNlIHJzX2FsaWduX2NvZGU6Ci0JICB7Ci0JICAgIGFkZHJlc3NUIG9mZnNldCA9IHJlbGF4X2FsaWduIChhZGRyZXNzLCAoaW50KSBmcmFnUC0+ZnJfb2Zmc2V0KTsKLQotCSAgICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgIT0gMCAmJiBvZmZzZXQgPiBmcmFnUC0+ZnJfc3VidHlwZSkKLQkgICAgICBvZmZzZXQgPSAwOwotCi0JICAgIGlmIChvZmZzZXQgJSBmcmFnUC0+ZnJfdmFyICE9IDApCi0JICAgICAgewotCQlhc19iYWQgKF8oImFsaWdubWVudCBwYWRkaW5nICglbHUgYnl0ZXMpIG5vdCBhIG11bHRpcGxlIG9mICVsZCIpLAotCQkJKHVuc2lnbmVkIGxvbmcpIG9mZnNldCwgKGxvbmcpIGZyYWdQLT5mcl92YXIpOwotCQlvZmZzZXQgLT0gKG9mZnNldCAlIGZyYWdQLT5mcl92YXIpOwotCSAgICAgIH0KLQotCSAgICBhZGRyZXNzICs9IG9mZnNldDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSByc19vcmc6Ci0JY2FzZSByc19zcGFjZToKLQkgIC8qIEFzc3VtZSAub3JnIGlzIG51Z2F0b3J5LiBJdCB3aWxsIGdyb3cgd2l0aCAxc3QgcmVsYXguICAqLwotCSAgYnJlYWs7Ci0KLQljYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgotCSAgYWRkcmVzcyArPSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpOwotCSAgYnJlYWs7Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotCSAgLyogQnJva2VuIHdvcmRzIGRvbid0IGNvbmNlcm4gdXMgeWV0ICovCi0JY2FzZSByc19icm9rZW5fd29yZDoKLQkgIGJyZWFrOwotI2VuZGlmCi0KLQljYXNlIHJzX2xlYjEyODoKLQkgIC8qIEluaXRpYWwgZ3Vlc3MgaXMgYWx3YXlzIDE7IGRvaW5nIG90aGVyd2lzZSBjYW4gcmVzdWx0IGluIAotCSAgICAgc3RhYmxlIHNvbHV0aW9ucyB0aGF0IGFyZSBsYXJnZXIgdGhhbiB0aGUgbWluaW11bS4gICovCi0JICBhZGRyZXNzICs9IGZyYWdQLT5mcl9vZmZzZXQgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlIHJzX2NmYToKLQkgIGFkZHJlc3MgKz0gZWhfZnJhbWVfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIEJBRF9DQVNFIChmcmFnUC0+ZnJfdHlwZSk7Ci0JICBicmVhazsKLQl9CQkJLyogc3dpdGNoKGZyX3R5cGUpICovCi0gICAgfQkJCQkvKiBmb3IgZWFjaCBmcmFnIGluIHRoZSBzZWdtZW50ICovCi0KLSAgLyogRG8gcmVsYXgoKS4gICovCi0gIHsKLSAgICBsb25nIHN0cmV0Y2g7CS8qIE1heSBiZSBhbnkgc2l6ZSwgMCBvciBuZWdhdGl2ZS4gKi8KLSAgICAvKiBDdW11bGF0aXZlIG51bWJlciBvZiBhZGRyZXNzZXMgd2UgaGF2ZSAqLwotICAgIC8qIHJlbGF4ZWQgdGhpcyBwYXNzLiAqLwotICAgIC8qIFdlIG1heSBoYXZlIHJlbGF4ZWQgbW9yZSB0aGFuIG9uZSBhZGRyZXNzLiAqLwotICAgIGxvbmcgc3RyZXRjaGVkOwkvKiBIYXZlIHdlIHN0cmV0Y2hlZCBvbiB0aGlzIHBhc3M/ICovCi0gICAgLyogVGhpcyBpcyAnY3V6IHN0cmV0Y2ggbWF5IGJlIHplcm8sIHdoZW4sIGluIGZhY3Qgc29tZSBwaWVjZSBvZiBjb2RlCi0gICAgICAgZ3JldywgYW5kIGFub3RoZXIgc2hyYW5rLiAgSWYgYSBicmFuY2ggaW5zdHJ1Y3Rpb24gZG9lc24ndCBmaXQgYW55bW9yZSwKLSAgICAgICB3ZSBjb3VsZCBiZSBzY3JvZC4gICovCi0KLSAgICBkbwotICAgICAgewotCXN0cmV0Y2ggPSBzdHJldGNoZWQgPSAwOwotCWZvciAoZnJhZ1AgPSBzZWdtZW50X2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0JICB7Ci0JICAgIGxvbmcgZ3Jvd3RoID0gMDsKLQkgICAgYWRkcmVzc1Qgd2FzX2FkZHJlc3M7Ci0JICAgIG9mZnNldFQgb2Zmc2V0OwotCSAgICBzeW1ib2xTICpzeW1ib2xQOwotCi0JICAgIHdhc19hZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3M7Ci0JICAgIGFkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzcyArPSBzdHJldGNoOwotCSAgICBzeW1ib2xQID0gZnJhZ1AtPmZyX3N5bWJvbDsKLQkgICAgb2Zmc2V0ID0gZnJhZ1AtPmZyX29mZnNldDsKLQotCSAgICBzd2l0Y2ggKGZyYWdQLT5mcl90eXBlKQotCSAgICAgIHsKLQkgICAgICBjYXNlIHJzX2ZpbGw6CS8qIC5maWxsIG5ldmVyIHJlbGF4ZXMuICovCi0JCWdyb3d0aCA9IDA7Ci0JCWJyZWFrOwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLQkJLyogSkY6ICBUaGlzIGlzIFJNUydzIGlkZWEuICBJIGRvICpOT1QqIHdhbnQgdG8gYmUgYmxhbWVkCi0JCSAgIGZvciBpdCBJIGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0LiAgSSBkbyBub3Qgd2FudCB0byBoYXZlCi0JCSAgIGFueXRoaW5nIHRvIGRvIHdpdGggaXQuICBUaGlzIGlzIG5vdCB0aGUgcHJvcGVyIHdheSB0bwotCQkgICBpbXBsZW1lbnQgdGhpcyBtaXNmZWF0dXJlLiAgKi8KLQkgICAgICBjYXNlIHJzX2Jyb2tlbl93b3JkOgotCQl7Ci0JCSAgc3RydWN0IGJyb2tlbl93b3JkICpsaWU7Ci0JCSAgc3RydWN0IGJyb2tlbl93b3JkICp1bnRydXRoOwotCi0JCSAgLyogWWVzIHRoaXMgaXMgdWdseSAoc3RvcmluZyB0aGUgYnJva2VuX3dvcmQgcG9pbnRlcgotCQkgICAgIGluIHRoZSBzeW1ib2wgc2xvdCkuICBTdGlsbCwgdGhpcyB3aG9sZSBjaHVuayBvZgotCQkgICAgIGNvZGUgaXMgdWdseSwgYW5kIEkgZG9uJ3QgZmVlbCBsaWtlIGRvaW5nIGFueXRoaW5nCi0JCSAgICAgYWJvdXQgaXQuICBUaGluayBvZiBpdCBhcyBzdHViYm9ybm5lc3MgaW4gYWN0aW9uLiAgKi8KLQkJICBncm93dGggPSAwOwotCQkgIGZvciAobGllID0gKHN0cnVjdCBicm9rZW5fd29yZCAqKSAoZnJhZ1AtPmZyX3N5bWJvbCk7Ci0JCSAgICAgICBsaWUgJiYgbGllLT5kaXNwZnJhZyA9PSBmcmFnUDsKLQkJICAgICAgIGxpZSA9IGxpZS0+bmV4dF9icm9rZW5fd29yZCkKLQkJICAgIHsKLQotCQkgICAgICBpZiAobGllLT5hZGRlZCkKLQkJCWNvbnRpbnVlOwotCi0JCSAgICAgIG9mZnNldCA9IChzeW1ib2xfZ2V0X2ZyYWcgKGxpZS0+YWRkKS0+ZnJfYWRkcmVzcwotCQkJCSsgU19HRVRfVkFMVUUgKGxpZS0+YWRkKQotCQkJCSsgbGllLT5hZGRudW0KLQkJCQktIChzeW1ib2xfZ2V0X2ZyYWcgKGxpZS0+c3ViKS0+ZnJfYWRkcmVzcwotCQkJCSAgICsgU19HRVRfVkFMVUUgKGxpZS0+c3ViKSkpOwotCQkgICAgICBpZiAob2Zmc2V0IDw9IC0zMjc2OCB8fCBvZmZzZXQgPj0gMzI3NjcpCi0JCQl7Ci0JCQkgIGlmIChmbGFnX3dhcm5fZGlzcGxhY2VtZW50KQotCQkJICAgIHsKLQkJCSAgICAgIGNoYXIgYnVmWzUwXTsKLQkJCSAgICAgIHNwcmludF92YWx1ZSAoYnVmLCAoYWRkcmVzc1QpIGxpZS0+YWRkbnVtKTsKLQkJCSAgICAgIGFzX3dhcm4gKF8oIi53b3JkICVzLSVzKyVzIGRpZG4ndCBmaXQiKSwKLQkJCQkgICAgICAgU19HRVRfTkFNRSAobGllLT5hZGQpLAotCQkJCSAgICAgICBTX0dFVF9OQU1FIChsaWUtPnN1YiksCi0JCQkJICAgICAgIGJ1Zik7Ci0JCQkgICAgfQotCQkJICBsaWUtPmFkZGVkID0gMTsKLQkJCSAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDApCi0JCQkgICAgewotCQkJICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUrKzsKLQkJCSAgICAgIGdyb3d0aCArPSBtZF9zaG9ydF9qdW1wX3NpemU7Ci0JCQkgICAgfQotCQkJICBmb3IgKHVudHJ1dGggPSBsaWUtPm5leHRfYnJva2VuX3dvcmQ7Ci0JCQkgICAgICAgdW50cnV0aCAmJiB1bnRydXRoLT5kaXNwZnJhZyA9PSBsaWUtPmRpc3BmcmFnOwotCQkJICAgICAgIHVudHJ1dGggPSB1bnRydXRoLT5uZXh0X2Jyb2tlbl93b3JkKQotCQkJICAgIGlmICgoc3ltYm9sX2dldF9mcmFnICh1bnRydXRoLT5hZGQpCi0JCQkJID09IHN5bWJvbF9nZXRfZnJhZyAobGllLT5hZGQpKQotCQkJCSYmIChTX0dFVF9WQUxVRSAodW50cnV0aC0+YWRkKQotCQkJCSAgICA9PSBTX0dFVF9WQUxVRSAobGllLT5hZGQpKSkKLQkJCSAgICAgIHsKLQkJCQl1bnRydXRoLT5hZGRlZCA9IDI7Ci0JCQkJdW50cnV0aC0+dXNlX2p1bXAgPSBsaWU7Ci0JCQkgICAgICB9Ci0JCQkgIGdyb3d0aCArPSBtZF9sb25nX2p1bXBfc2l6ZTsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGJyZWFrOwotCQl9CQkvKiBjYXNlIHJzX2Jyb2tlbl93b3JkICovCi0jZW5kaWYKLQkgICAgICBjYXNlIHJzX2FsaWduOgotCSAgICAgIGNhc2UgcnNfYWxpZ25fY29kZToKLQkJewotCQkgIGFkZHJlc3NUIG9sZG9mZiwgbmV3b2ZmOwotCi0JCSAgb2xkb2ZmID0gcmVsYXhfYWxpZ24gKHdhc19hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCwKLQkJCQkJKGludCkgb2Zmc2V0KTsKLQkJICBuZXdvZmYgPSByZWxheF9hbGlnbiAoYWRkcmVzcyArIGZyYWdQLT5mcl9maXgsCi0JCQkJCShpbnQpIG9mZnNldCk7Ci0KLQkJICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKG9sZG9mZiA+IGZyYWdQLT5mcl9zdWJ0eXBlKQotCQkJb2xkb2ZmID0gMDsKLQkJICAgICAgaWYgKG5ld29mZiA+IGZyYWdQLT5mcl9zdWJ0eXBlKQotCQkJbmV3b2ZmID0gMDsKLQkJICAgIH0KLQotCQkgIGdyb3d0aCA9IG5ld29mZiAtIG9sZG9mZjsKLQkJfQotCQlicmVhazsKLQotCSAgICAgIGNhc2UgcnNfb3JnOgotCQl7Ci0JCSAgbG9uZyB0YXJnZXQgPSBvZmZzZXQ7Ci0JCSAgbG9uZyBhZnRlcjsKLQotCQkgIGlmIChzeW1ib2xQKQotCQkgICAgewotI2lmICFkZWZpbmVkIChNQU5ZX1NFR01FTlRTKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLQkJICAgICAga25vdyAoKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19BQlNPTFVURSkKLQkJCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0RBVEEpCi0JCQkgICAgfHwgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19URVhUKQotCQkJICAgIHx8IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19CU1MpOwotCQkgICAgICBrbm93IChzeW1ib2xQLT5zeV9mcmFnKTsKLQkJICAgICAga25vdyAoIShTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfQUJTT0xVVEUpCi0JCQkgICAgfHwgKHN5bWJvbFAtPnN5X2ZyYWcgPT0gJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0jZW5kaWYKLQkJICAgICAgdGFyZ2V0ICs9IChTX0dFVF9WQUxVRSAoc3ltYm9sUCkKLQkJCQkgKyBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9hZGRyZXNzKTsKLQkJICAgIH0JCS8qIGlmIHdlIGhhdmUgYSBzeW1ib2wgKi8KLQotCQkgIGtub3cgKGZyYWdQLT5mcl9uZXh0KTsKLQkJICBhZnRlciA9IGZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzOwotCQkgIGdyb3d0aCA9IHRhcmdldCAtIGFmdGVyOwotCQkgIGlmIChncm93dGggPCAwKQotCQkgICAgewotCQkgICAgICAvKiBHcm93dGggbWF5IGJlIG5lZ2F0aXZlLCBidXQgdmFyaWFibGUgcGFydCBvZiBmcmFnCi0JCQkgY2Fubm90IGhhdmUgZmV3ZXIgdGhhbiAwIGNoYXJzLiAgVGhhdCBpcywgd2UgY2FuJ3QKLQkJCSAub3JnIGJhY2t3YXJkcy4gKi8KLQkJICAgICAgYXNfYmFkX3doZXJlIChmcmFnUC0+ZnJfZmlsZSwgZnJhZ1AtPmZyX2xpbmUsCi0JCQkJICAgIF8oImF0dGVtcHQgdG8gLm9yZyBiYWNrd2FyZHMgaWdub3JlZCIpKTsKLQotCQkgICAgICAvKiBXZSd2ZSBpc3N1ZWQgYW4gZXJyb3IgbWVzc2FnZS4gIENoYW5nZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnIHRvIGF2b2lkIGNhc2NhZGluZyBlcnJvcnMuICAqLwotCQkgICAgICBmcmFnUC0+ZnJfdHlwZSA9IHJzX2FsaWduOwotCQkgICAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IDA7Ci0JCSAgICAgIGZyYWdQLT5mcl9vZmZzZXQgPSAwOwotCQkgICAgICBmcmFnUC0+ZnJfZml4ID0gYWZ0ZXIgLSBhZGRyZXNzOwotCQkgICAgICBncm93dGggPSBzdHJldGNoOwotCQkgICAgfQotCi0JCSAgZ3Jvd3RoIC09IHN0cmV0Y2g7CS8qIFRoaXMgaXMgYW4gYWJzb2x1dGUgZ3Jvd3RoIGZhY3RvciAqLwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBjYXNlIHJzX3NwYWNlOgotCQlpZiAoc3ltYm9sUCkKLQkJICB7Ci0JCSAgICBncm93dGggPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0JCSAgICBpZiAoc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSAhPSAmemVyb19hZGRyZXNzX2ZyYWcKLQkJCXx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKQotCQkJfHwgISBTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCQkgICAgICBhc19iYWRfd2hlcmUgKGZyYWdQLT5mcl9maWxlLCBmcmFnUC0+ZnJfbGluZSwKLQkJCQkgICAgXygiLnNwYWNlIHNwZWNpZmllcyBub24tYWJzb2x1dGUgdmFsdWUiKSk7Ci0JCSAgICBmcmFnUC0+ZnJfc3ltYm9sID0gMDsKLQkJICAgIGlmIChncm93dGggPCAwKQotCQkgICAgICB7Ci0JCQlhc193YXJuIChfKCIuc3BhY2Ugb3IgLmZpbGwgd2l0aCBuZWdhdGl2ZSB2YWx1ZSwgaWdub3JlZCIpKTsKLQkJCWdyb3d0aCA9IDA7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICBncm93dGggPSAwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0jaWZkZWYgbWRfcmVsYXhfZnJhZwotCQlncm93dGggPSBtZF9yZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCk7Ci0jZWxzZQotI2lmZGVmIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUKLQkJLyogVGhlIGRlZmF1bHQgd2F5IHRvIHJlbGF4IGEgZnJhZyBpcyB0byBsb29rIHRocm91Z2gKLQkJICAgVENfR0VORVJJQ19SRUxBWF9UQUJMRS4gICovCi0JCWdyb3d0aCA9IHJlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKTsKLSNlbmRpZiAvKiBUQ19HRU5FUklDX1JFTEFYX1RBQkxFICovCi0jZW5kaWYKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHJzX2xlYjEyODoKLQkJewotCQkgIHZhbHVlVCB2YWx1ZTsKLQkJICBpbnQgc2l6ZTsKLQotCQkgIHZhbHVlID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZyYWdQLT5mcl9zeW1ib2wsIDApOwotCQkgIHNpemUgPSBzaXplb2ZfbGViMTI4ICh2YWx1ZSwgZnJhZ1AtPmZyX3N1YnR5cGUpOwotCQkgIGdyb3d0aCA9IHNpemUgLSBmcmFnUC0+ZnJfb2Zmc2V0OwotCQkgIGZyYWdQLT5mcl9vZmZzZXQgPSBzaXplOwotCQl9Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSByc19jZmE6Ci0JCWdyb3d0aCA9IGVoX2ZyYW1lX3JlbGF4X2ZyYWcgKGZyYWdQKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBkZWZhdWx0OgotCQlCQURfQ0FTRSAoZnJhZ1AtPmZyX3R5cGUpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGlmIChncm93dGgpCi0JICAgICAgewotCQlzdHJldGNoICs9IGdyb3d0aDsKLQkJc3RyZXRjaGVkKys7Ci0JICAgICAgfQotCSAgfQkJCS8qIEZvciBlYWNoIGZyYWcgaW4gdGhlIHNlZ21lbnQuICovCi0gICAgICB9Ci0gICAgd2hpbGUgKHN0cmV0Y2hlZCk7CQkvKiBVbnRpbCBub3RoaW5nIGZ1cnRoZXIgdG8gcmVsYXguICovCi0gIH0JCQkJLyogZG9fcmVsYXggKi8KLQotICAvKgotICAgKiBXZSBub3cgaGF2ZSB2YWxpZCBmcl9hZGRyZXNzJ2VzIGZvciBlYWNoIGZyYWcuCi0gICAqLwotCi0gIC8qCi0gICAqIEFsbCBmcl9hZGRyZXNzJ3MgYXJlIGNvcnJlY3QsIHJlbGF0aXZlIHRvIHRoZWlyIG93biBzZWdtZW50LgotICAgKiBXZSBoYXZlIG1hZGUgYWxsIHRoZSBmaXhTIHdlIHdpbGwgZXZlciBtYWtlLgotICAgKi8KLX0JCQkJLyogcmVsYXhfc2VnbWVudCgpICovCi0KLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAoIWRlZmluZWQgKEJGRCkgJiYgIWRlZmluZWQgKE9CSl9WTVMpKQotCi0jaWZuZGVmIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUAotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoWCkgKDEpCi0jZW5kaWYKLQotLyogZml4dXBfc2VnbWVudCgpCi0KLSAgIEdvIHRocm91Z2ggYWxsIHRoZSBmaXhTJ3MgaW4gYSBzZWdtZW50IGFuZCBzZWUgd2hpY2ggb25lcyBjYW4gYmUKLSAgIGhhbmRsZWQgbm93LiAgKFRoZXNlIGNvbnNpc3Qgb2YgZml4UyB3aGVyZSB3ZSBoYXZlIHNpbmNlIGRpc2NvdmVyZWQKLSAgIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCwgb3IgdGhlIGFkZHJlc3Mgb2YgdGhlIGZyYWcgaW52b2x2ZWQuKQotICAgRm9yIGVhY2ggb25lLCBjYWxsIG1kX2FwcGx5X2ZpeCB0byBwdXQgdGhlIGZpeCBpbnRvIHRoZSBmcmFnIGRhdGEuCi0KLSAgIFJlc3VsdCBpcyBhIGNvdW50IG9mIGhvdyBtYW55IHJlbG9jYXRpb24gc3RydWN0cyB3aWxsIGJlIG5lZWRlZCB0bwotICAgaGFuZGxlIHRoZSByZW1haW5pbmcgZml4UydzIHRoYXQgd2UgY291bGRuJ3QgY29tcGxldGVseSBoYW5kbGUgaGVyZS4KLSAgIFRoZXNlIHdpbGwgYmUgb3V0cHV0IGxhdGVyIGJ5IGVtaXRfcmVsb2NhdGlvbnMoKS4gICovCi0KLXN0YXRpYyBsb25nCi1maXh1cF9zZWdtZW50IChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZml4UyAqZml4UDsKLSAgICAgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZTsJLyogTl9UWVBFIGJpdHMgZm9yIHNlZ21lbnQuICovCi17Ci0gIGxvbmcgc2VnX3JlbG9jX2NvdW50ID0gMDsKLSAgc3ltYm9sUyAqYWRkX3N5bWJvbFA7Ci0gIHN5bWJvbFMgKnN1Yl9zeW1ib2xQOwotICB2YWx1ZVQgYWRkX251bWJlcjsKLSAgaW50IHNpemU7Ci0gIGNoYXIgKnBsYWNlOwotICBsb25nIHdoZXJlOwotICBpbnQgcGNyZWwsIHBsdDsKLSAgZnJhZ1MgKmZyYWdQOwotICBzZWdUIGFkZF9zeW1ib2xfc2VnbWVudCA9IGFic29sdXRlX3NlY3Rpb247Ci0KLSAgLyogSWYgdGhlIGxpbmtlciBpcyBkb2luZyB0aGUgcmVsYXhpbmcsIHdlIG11c3Qgbm90IGRvIGFueSBmaXh1cHMuCi0KLSAgICAgV2VsbCwgc3RyaWN0bHkgc3BlYWtpbmcgdGhhdCdzIG5vdCB0cnVlIC0tIHdlIGNvdWxkIGRvIGFueSB0aGF0IGFyZQotICAgICBQQy1yZWxhdGl2ZSBhbmQgZG9uJ3QgY3Jvc3MgcmVnaW9ucyB0aGF0IGNvdWxkIGNoYW5nZSBzaXplLiAgQW5kIGZvciB0aGUKLSAgICAgaTk2MCAodGhlIG9ubHkgbWFjaGluZSBmb3Igd2hpY2ggd2UndmUgZ290IGEgcmVsYXhpbmcgbGlua2VyIHJpZ2h0IG5vdyksCi0gICAgIHdlIG1pZ2h0IGJlIGFibGUgdG8gdHVybiBjYWxseC9jYWxsaiBpbnRvIGJhbCBhbnl3YXlzIGluIGNhc2VzIHdoZXJlIHdlCi0gICAgIGtub3cgdGhlIG1heGltdW0gZGlzcGxhY2VtZW50LiAgKi8KLSAgaWYgKGxpbmtyZWxheCkKLSAgICB7Ci0gICAgICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0Jc2VnX3JlbG9jX2NvdW50Kys7Ci0gICAgICBUQ19BREpVU1RfUkVMT0NfQ09VTlQgKGZpeFAsIHNlZ19yZWxvY19jb3VudCk7Ci0gICAgICByZXR1cm4gc2VnX3JlbG9jX2NvdW50OwotICAgIH0KLQotICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgewotCi0jaWZkZWYgREVCVUc1Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbnByb2Nlc3NpbmcgZml4dXA6XG4iKTsKLSAgICAgIHByaW50X2ZpeHVwIChmaXhQKTsKLSNlbmRpZgotCi0KLSAgICAgIGZyYWdQID0gZml4UC0+ZnhfZnJhZzsKLSAgICAgIGtub3cgKGZyYWdQKTsKLSAgICAgIHdoZXJlID0gZml4UC0+Znhfd2hlcmU7Ci0gICAgICBwbGFjZSA9IGZyYWdQLT5mcl9saXRlcmFsICsgd2hlcmU7Ci0gICAgICBzaXplID0gZml4UC0+Znhfc2l6ZTsKLSAgICAgIGFkZF9zeW1ib2xQID0gZml4UC0+ZnhfYWRkc3k7Ci0jaWZkZWYgVENfVkFMSURBVEVfRklYCi0gICAgICBUQ19WQUxJREFURV9GSVggKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlLCBza2lwKTsKLSNlbmRpZgotICAgICAgc3ViX3N5bWJvbFAgPSBmaXhQLT5meF9zdWJzeTsKLSAgICAgIGFkZF9udW1iZXIgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICBwY3JlbCA9IGZpeFAtPmZ4X3BjcmVsOwotICAgICAgcGx0ID0gZml4UC0+ZnhfcGx0OwotCi0gICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTAotCSAgJiYgc3ltYm9sX21yaV9jb21tb25fcCAoYWRkX3N5bWJvbFApKQotCXsKLQkgIGtub3cgKGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sKTsKLQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkgIGZpeFAtPmZ4X29mZnNldCA9IGFkZF9udW1iZXI7Ci0JICBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5ID0KLQkgICAgc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChhZGRfc3ltYm9sUCktPlhfYWRkX3N5bWJvbDsKLQl9Ci0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCkKLQlhZGRfc3ltYm9sX3NlZ21lbnQgPSBTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sUCk7Ci0KLSAgICAgIGlmIChzdWJfc3ltYm9sUCkKLQl7Ci0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ViX3N5bWJvbFAsIDEpOwotCSAgaWYgKGFkZF9zeW1ib2xQID09IE5VTEwgfHwgYWRkX3N5bWJvbF9zZWdtZW50ID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTCkKLQkJewotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkJICBhZGRfc3ltYm9sUCA9IE5VTEw7Ci0JCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQl9Ci0KLQkgICAgICAvKiBJdCdzIGp1c3QgLXN5bSAqLwotCSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkJewotCQkgIGFkZF9udW1iZXIgLT0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQkJICBmaXhQLT5meF9zdWJzeSA9IE5VTEw7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChwY3JlbAotCQkgICAgICAgJiYgU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IHRoaXNfc2VnbWVudF90eXBlKQotCQl7Ci0JCSAgLyogU2hvdWxkIHRyeSBjb252ZXJ0aW5nIHRvIGEgY29uc3RhbnQuICAqLwotCQkgIGdvdG8gYmFkX3N1Yl9yZWxvYzsKLQkJfQotCSAgICAgIGVsc2UKLQkgICAgICBiYWRfc3ViX3JlbG9jOgotCQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgICBfKCJOZWdhdGl2ZSBvZiBub24tYWJzb2x1dGUgc3ltYm9sICVzIiksCi0JCQkgICAgICBTX0dFVF9OQU1FIChzdWJfc3ltYm9sUCkpOwotCSAgICB9Ci0JICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWRkX3N5bWJvbF9zZWdtZW50Ci0JCSAgICYmIFNFR19OT1JNQUwgKGFkZF9zeW1ib2xfc2VnbWVudCkpCi0JICAgIHsKLQkgICAgICAvKiBEaWZmZXJlbmNlIG9mIDIgc3ltYm9scyBmcm9tIHNhbWUgc2VnbWVudC4KLQkJIENhbid0IG1ha2UgZGlmZmVyZW5jZSBvZiAyIHVuZGVmaW5lZHM6ICd2YWx1ZScgbWVhbnMKLQkJIHNvbWV0aGluZyBkaWZmZXJlbnQgZm9yIE5fVU5ERi4gKi8KLSNpZmRlZiBUQ19JOTYwCi0JICAgICAgLyogTWFrZXMgbm8gc2Vuc2UgdG8gdXNlIHRoZSBkaWZmZXJlbmNlIG9mIDIgYXJiaXRyYXJ5IHN5bWJvbHMKLQkJIGFzIHRoZSB0YXJnZXQgb2YgYSBjYWxsIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAoZml4UC0+ZnhfdGNiaXQpCi0JCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICAgIF8oImNhbGxqIHRvIGRpZmZlcmVuY2Ugb2YgMiBzeW1ib2xzIikpOwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQkgICAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCkgLQotCQlTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCi0JICAgICAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCSAgICAgIHBjcmVsID0gMDsJLyogTm8gZnVydGhlciBwY3JlbCBwcm9jZXNzaW5nLiAqLwotCi0JICAgICAgLyogTGV0IHRoZSB0YXJnZXQgbWFjaGluZSBtYWtlIHRoZSBmaW5hbCBkZXRlcm1pbmF0aW9uCi0JCSBhcyB0byB3aGV0aGVyIG9yIG5vdCBhIHJlbG9jYXRpb24gd2lsbCBiZSBuZWVkZWQgdG8KLQkJIGhhbmRsZSB0aGlzIGZpeHVwLiAgKi8KLQkgICAgICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTiAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpKQotCQl7Ci0JCSAgZml4UC0+ZnhfcGNyZWwgPSAwOwotCQkgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICBmaXhQLT5meF9zdWJzeSA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRGlmZmVyZW50IHNlZ21lbnRzIGluIHN1YnRyYWN0aW9uLiAqLwotCSAgICAgIGtub3cgKCEoU19JU19FWFRFUk5BTCAoc3ViX3N5bWJvbFApCi0JCSAgICAgICYmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikpKTsKLQotCSAgICAgIGlmICgoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pKQotCQlhZGRfbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0KLSNpZmRlZiBESUZGX0VYUFJfT0sKLQkgICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gdGhpc19zZWdtZW50X3R5cGUKLSNpZiAwIC8qIERvIHRoaXMgZXZlbiBpZiBpdCdzIGFscmVhZHkgZGVzY3JpYmVkIGFzIHBjLXJlbGF0aXZlLiAgRm9yIGV4YW1wbGUsCi0JIG9uIHRoZSBtNjhrLCBhbiBvcGVyYW5kIG9mICJwY0AoZm9vLS4tMikiIHNob3VsZCBhZGRyZXNzICJmb28iIGluIGEKLQkgcGMtcmVsYXRpdmUgbW9kZS4gICovCi0JCSAgICAgICAmJiBwY3JlbAotI2VuZGlmCi0JCSAgICAgICApCi0JCXsKLQkJICAvKiBNYWtlIGl0IHBjLXJlbGF0aXZlLiAgKi8KLQkJICBhZGRfbnVtYmVyICs9IChNRF9QQ1JFTF9GUk9NX1NFQ1RJT04gKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlKQotCQkJCSAtIFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCkpOwotCQkgIHBjcmVsID0gMTsKLQkJICBmaXhQLT5meF9wY3JlbCA9IDE7Ci0JCSAgc3ViX3N5bWJvbFAgPSAwOwotCQkgIGZpeFAtPmZ4X3N1YnN5ID0gMDsKLQkJfQotI2VuZGlmCi0jaWZkZWYgVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sKLQkgICAgICAvKiBUaGUgUEEgbmVlZHMgdGhpcyBmb3IgUElDIGNvZGUgZ2VuZXJhdGlvbi4gIFdlIGJhc2ljYWxseQotCQkgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyBpZiB3ZSBoYXZlIHRoZSBkaWZmZXJlbmNlIG9mIHR3bwotCQkgc3ltYm9scyBhdCB0aGlzIHBvaW50LiAgKi8KLQkgICAgICBlbHNlIGlmICgxKQotCQl7Ci0JCSAgLyogTGVhdmUgaXQgYWxvbmUuICAqLwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgICAgZWxzZSBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19HUFJFTDMyCi0JCSAgICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0dQUkVMMTYpCi0JCXsKLQkJICAvKiBMZWF2ZSBpdCBhbG9uZS4gICovCi0JCX0KLSNlbmRpZgotCSAgICAgIGVsc2UKLQkJewotCQkgIGNoYXIgYnVmWzUwXTsKLQkJICBzcHJpbnRfdmFsdWUgKGJ1ZiwgZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZSk7Ci0JCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCV8oIlN1YnRyYWN0aW9uIG9mIHR3byBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWN0aW9ucyBcIiVzXCIgeyVzIHNlY3Rpb259IC0gXCIlc1wiIHslcyBzZWN0aW9ufSBhdCBmaWxlIGFkZHJlc3MgJXMuIiksCi0JCQkJU19HRVRfTkFNRSAoYWRkX3N5bWJvbFApLAotCQkJCXNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbFApKSwKLQkJCQlTX0dFVF9OQU1FIChzdWJfc3ltYm9sUCksCi0JCQkJc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkpLAotCQkJCWJ1Zik7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKGFkZF9zeW1ib2xQKQotCXsKLQkgIGlmIChhZGRfc3ltYm9sX3NlZ21lbnQgPT0gdGhpc19zZWdtZW50X3R5cGUgJiYgcGNyZWwgJiYgIXBsdAotCSAgICAgICYmIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCAoZml4UCkpCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIFRoaXMgZml4dXAgd2FzIG1hZGUgd2hlbiB0aGUgc3ltYm9sJ3Mgc2VnbWVudCB3YXMKLQkgICAgICAgKiBTRUdfVU5LTk9XTiwgYnV0IGl0IGlzIG5vdyBpbiB0aGUgbG9jYWwgc2VnbWVudC4KLQkgICAgICAgKiBTbyB3ZSBrbm93IGhvdyB0byBkbyB0aGUgYWRkcmVzcyB3aXRob3V0IHJlbG9jYXRpb24uCi0JICAgICAgICovCi0jaWZkZWYgVENfSTk2MAotCSAgICAgIC8qIHJlbG9jX2NhbGxqKCkgbWF5IHJlcGxhY2UgYSAnY2FsbCcgd2l0aCBhICdjYWxscycgb3IgYQotCQkgJ2JhbCcsIGluIHdoaWNoIGNhc2VzIGl0IG1vZGlmaWVzICpmaXhQIGFzIGFwcHJvcHJpYXRlLgotCQkgSW4gdGhlIGNhc2Ugb2YgYSAnY2FsbHMnLCBubyBmdXJ0aGVyIHdvcmsgaXMgcmVxdWlyZWQsCi0JCSBhbmQgKmZpeFAgaGFzIGJlZW4gc2V0IHVwIHRvIG1ha2UgdGhlIHJlc3Qgb2YgdGhlIGNvZGUKLQkJIGJlbG93IGEgbm8tb3AuICovCi0JICAgICAgcmVsb2NfY2FsbGogKGZpeFApOwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotCSAgICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkgICAgICBhZGRfbnVtYmVyIC09IE1EX1BDUkVMX0ZST01fU0VDVElPTiAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpOwotCSAgICAgIHBjcmVsID0gMDsJLyogTGllLiBEb24ndCB3YW50IGZ1cnRoZXIgcGNyZWwgcHJvY2Vzc2luZy4gKi8KLQotCSAgICAgIC8qIExldCB0aGUgdGFyZ2V0IG1hY2hpbmUgbWFrZSB0aGUgZmluYWwgZGV0ZXJtaW5hdGlvbgotCQkgYXMgdG8gd2hldGhlciBvciBub3QgYSByZWxvY2F0aW9uIHdpbGwgYmUgbmVlZGVkIHRvCi0JCSBoYW5kbGUgdGhpcyBmaXh1cC4gICovCi0JICAgICAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhQKSkKLQkJewotCQkgIGZpeFAtPmZ4X3BjcmVsID0gMDsKLQkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGFkZF9zeW1ib2xfc2VnbWVudCA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0JCSAgJiYgISBwY3JlbCkKLQkJewotI2lmZGVmIFRDX0k5NjAKLQkJICAvKiBTZWUgY29tbWVudCBhYm91dCByZWxvY19jYWxsaigpIGFib3ZlLiAgKi8KLQkJICByZWxvY19jYWxsaiAoZml4UCk7Ci0jZW5kaWYgLyogVENfSTk2MCAqLwotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQotCQkgIC8qIExldCB0aGUgdGFyZ2V0IG1hY2hpbmUgbWFrZSB0aGUgZmluYWwgZGV0ZXJtaW5hdGlvbgotCQkgICAgIGFzIHRvIHdoZXRoZXIgb3Igbm90IGEgcmVsb2NhdGlvbiB3aWxsIGJlIG5lZWRlZCB0bwotCQkgICAgIGhhbmRsZSB0aGlzIGZpeHVwLiAgKi8KLQotCQkgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4UCkpCi0JCSAgICB7Ci0JCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICAgICAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoYWRkX3N5bWJvbF9zZWdtZW50ID09IHVuZGVmaW5lZF9zZWN0aW9uCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkgICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChhZGRfc3ltYm9sX3NlZ21lbnQpCi0jZW5kaWYKLQkJICAgICAgICkKLQkJewotI2lmZGVmIFRDX0k5NjAKLQkJICBpZiAoKGludCkgZml4UC0+ZnhfYml0X2ZpeFAgPT0gMTMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSBDT0JSIGluc3RydWN0aW9uLiAgVGhleSBoYXZlIG9ubHkgYQotCQkgICAgICAgKiAxMy1iaXQgZGlzcGxhY2VtZW50IGFuZCBhcmUgb25seSB0byBiZSB1c2VkCi0JCSAgICAgICAqIGZvciBsb2NhbCBicmFuY2hlczogZmxhZyBhcyBlcnJvciwgZG9uJ3QgZ2VuZXJhdGUKLQkJICAgICAgICogcmVsb2NhdGlvbi4KLQkJICAgICAgICovCi0JCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQkgICAgXygiY2FuJ3QgdXNlIENPQlIgZm9ybWF0IHdpdGggZXh0ZXJuYWwgbGFiZWwiKSk7Ci0JCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQkJLyogQ09CUiAqLwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotI2lmZGVmIE9CSl9DT0ZGCi0jaWZkZWYgVEVfSTM4NkFJWAotCQkgIGlmIChTX0lTX0NPTU1PTiAoYWRkX3N5bWJvbFApKQotCQkgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotI2VuZGlmIC8qIFRFX0kzODZBSVggKi8KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCQkgICsrc2VnX3JlbG9jX2NvdW50OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2VnX3JlbG9jX2NvdW50Kys7Ci0jaWYgIShkZWZpbmVkIChUQ19WODUwKSAmJiBkZWZpbmVkIChPQkpfRUxGKSkKLSNpZiAhKGRlZmluZWQgKFRDX002OEspICYmIGRlZmluZWQgKE9CSl9FTEYpKQotI2lmICEoZGVmaW5lZCAoVENfQVJNKSAgJiYgZGVmaW5lZCAoT0JKX0VMRikpCi0jaWYgIShkZWZpbmVkIChUQ19JOTYwKSAmJiBkZWZpbmVkIChPQkpfRUxGKSkKLSNpZiAhZGVmaW5lZCAoVENfSTM4NikgfHwgIShkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfQ09GRikpIHx8IGRlZmluZWQgKFRFX1BFKQotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHBjcmVsKQotCXsKLQkgIGFkZF9udW1iZXIgLT0gTURfUENSRUxfRlJPTV9TRUNUSU9OIChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSk7Ci0JICBpZiAoYWRkX3N5bWJvbFAgPT0gMCkKLQkgICAgewotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgICAgZml4UC0+ZnhfYWRkc3kgPSAmYWJzX3N5bWJvbDsKLSNlbHNlCi0JICAgICAgZml4UC0+ZnhfYWRkc3kgPSBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7Ci0jZW5kaWYKLQkgICAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhQLT5meF9hZGRzeSk7Ci0JICAgICAgKytzZWdfcmVsb2NfY291bnQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghZml4UC0+ZnhfZG9uZSkKLQl7Ci0jaWZkZWYgTURfQVBQTFlfRklYMwotCSAgbWRfYXBwbHlfZml4MyAoZml4UCwgJmFkZF9udW1iZXIsIHRoaXNfc2VnbWVudF90eXBlKTsKLSNlbHNlCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgbWRfYXBwbHlfZml4IChmaXhQLCAmYWRkX251bWJlcik7Ci0jZWxzZQotCSAgbWRfYXBwbHlfZml4IChmaXhQLCBhZGRfbnVtYmVyKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgVENfSEFORExFU19GWF9ET05FCi0JICAvKiBJZiB0aGUgdGMtKiBmaWxlcyBoYXZlbid0IGJlZW4gY29udmVydGVkLCBhc3N1bWUgaXQncyBoYW5kbGluZwotCSAgICAgaXQgdGhlIG9sZCB3YXksIHdoZXJlIGEgbnVsbCBmeF9hZGRzeSBtZWFucyB0aGF0IHRoZSBmaXggaGFzCi0JICAgICBiZWVuIGFwcGxpZWQgY29tcGxldGVseSwgYW5kIG5vIGZ1cnRoZXIgd29yayBpcyBuZWVkZWQuICAqLwotCSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IDAgJiYgZml4UC0+ZnhfcGNyZWwgPT0gMCkKLQkgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0jZW5kaWYKLQl9Ci0KLSAgICAgIGlmICghZml4UC0+ZnhfYml0X2ZpeFAgJiYgIWZpeFAtPmZ4X25vX292ZXJmbG93ICYmIHNpemUgPiAwKQotCXsKLQkgIGlmICgoc2l6ZV90KSBzaXplIDwgc2l6ZW9mICh2YWx1ZVQpKQotCSAgICB7Ci0JICAgICAgdmFsdWVUIG1hc2s7Ci0KLQkgICAgICBtYXNrID0gMDsKLQkgICAgICBtYXNrLS07CQkvKiBzZXQgYWxsIGJpdHMgdG8gb25lICovCi0JICAgICAgbWFzayA8PD0gc2l6ZSAqIDggLSAoZml4UC0+Znhfc2lnbmVkID8gMSA6IDApOwotCSAgICAgIGlmICgoYWRkX251bWJlciAmIG1hc2spICE9IDAgJiYgKGFkZF9udW1iZXIgJiBtYXNrKSAhPSBtYXNrKQotCQl7Ci0JCSAgY2hhciBidWZbNTBdLCBidWYyWzUwXTsKLQkJICBzcHJpbnRfdmFsdWUgKGJ1ZiwgZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZSk7Ci0JCSAgaWYgKGFkZF9udW1iZXIgPiAxMDAwKQotCQkgICAgc3ByaW50X3ZhbHVlIChidWYyLCBhZGRfbnVtYmVyKTsKLQkJICBlbHNlCi0JCSAgICBzcHJpbnRmIChidWYyLCAiJWxkIiwgKGxvbmcpIGFkZF9udW1iZXIpOwotCQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQlfKCJWYWx1ZSBvZiAlcyB0b28gbGFyZ2UgZm9yIGZpZWxkIG9mICVkIGJ5dGVzIGF0ICVzIiksCi0JCQkJYnVmMiwgc2l6ZSwgYnVmKTsKLQkJfSAvKiBnZW5lcmljIGVycm9yIGNoZWNraW5nICovCi0JICAgIH0KLSNpZmRlZiBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JECi0JICAvKiBXYXJuIGlmIGEgLndvcmQgdmFsdWUgaXMgdG9vIGxhcmdlIHdoZW4gdHJlYXRlZCBhcyBhIHNpZ25lZAotCSAgICAgbnVtYmVyLiAgV2UgYWxyZWFkeSBrbm93IGl0IGlzIG5vdCB0b28gbmVnYXRpdmUuICBUaGlzIGlzIHRvCi0JICAgICBjYXRjaCBvdmVyLWxhcmdlIHN3aXRjaGVzIGdlbmVyYXRlZCBieSBnY2Mgb24gdGhlIDY4ay4gICovCi0JICBpZiAoIWZsYWdfc2lnbmVkX292ZXJmbG93X29rCi0JICAgICAgJiYgc2l6ZSA9PSAyCi0JICAgICAgJiYgYWRkX251bWJlciA+IDB4N2ZmZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJTaWduZWQgLndvcmQgb3ZlcmZsb3c7IHN3aXRjaCBtYXkgYmUgdG9vIGxhcmdlOyAlbGQgYXQgMHglbHgiKSwKLQkJCSAgKGxvbmcpIGFkZF9udW1iZXIsCi0JCQkgICh1bnNpZ25lZCBsb25nKSAoZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZSkpOwotI2VuZGlmCi0JfQkJCS8qIG5vdCBhIGJpdCBmaXggKi8KLQotI2lmZGVmIFRDX1ZBTElEQVRFX0ZJWAotICAgIHNraXA6ICBBVFRSSUJVVEVfVU5VU0VEX0xBQkVMCi0gICAgICA7Ci0jZW5kaWYKLSNpZmRlZiBERUJVRzUKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInJlc3VsdDpcbiIpOwotICAgICAgcHJpbnRfZml4dXAgKGZpeFApOwotI2VuZGlmCi0gICAgfQkJCQkvKiBGb3IgZWFjaCBmaXhTIGluIHRoaXMgc2VnbWVudC4gKi8KLQotICBUQ19BREpVU1RfUkVMT0NfQ09VTlQgKGZpeFAsIHNlZ19yZWxvY19jb3VudCk7Ci0gIHJldHVybiBzZWdfcmVsb2NfY291bnQ7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAoIWRlZmluZWQgKEJGRCkgJiYgIWRlZmluZWQgKE9CSl9WTVMpKSAqLwotCi12b2lkCi1udW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKChzaXplX3QpIG4gPiBzaXplb2YgKHZhbCkgfHwgbiA8PSAwKQotICAgIGFib3J0ICgpOwotICB3aGlsZSAobi0tKQotICAgIHsKLSAgICAgIGJ1ZltuXSA9IHZhbCAmIDB4ZmY7Ci0gICAgICB2YWwgPj49IDg7Ci0gICAgfQotfQotCi12b2lkCi1udW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKChzaXplX3QpIG4gPiBzaXplb2YgKHZhbCkgfHwgbiA8PSAwKQotICAgIGFib3J0ICgpOwotICB3aGlsZSAobi0tKQotICAgIHsKLSAgICAgICpidWYrKyA9IHZhbCAmIDB4ZmY7Ci0gICAgICB2YWwgPj49IDg7Ci0gICAgfQotfQotCi12b2lkCi13cml0ZV9wcmludF9zdGF0aXN0aWNzIChmaWxlKQotICAgICBGSUxFICpmaWxlOwotewotICBmcHJpbnRmIChmaWxlLCAiZml4dXBzOiAlZFxuIiwgbl9maXh1cHMpOwotfQotCi0vKiBmb3IgZGVidWdnaW5nICovCi1leHRlcm4gaW50IGluZGVudF9sZXZlbDsKLQotdm9pZAotcHJpbnRfZml4dXAgKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGluZGVudF9sZXZlbCA9IDE7Ci0gIGZwcmludGYgKHN0ZGVyciwgImZpeCAlbHggJXM6JWQiLCAobG9uZykgZml4cCwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgcGNyZWwiKTsKLSAgaWYgKGZpeHAtPmZ4X3BjcmVsX2FkanVzdCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgcGNyZWxfYWRqdXN0PSVkIiwgZml4cC0+ZnhfcGNyZWxfYWRqdXN0KTsKLSAgaWYgKGZpeHAtPmZ4X2ltX2Rpc3ApCi0gICAgewotI2lmZGVmIFRDX05TMzJLCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgaW1fZGlzcD0lZCIsIGZpeHAtPmZ4X2ltX2Rpc3ApOwotI2Vsc2UKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiBpbV9kaXNwIik7Ci0jZW5kaWYKLSAgICB9Ci0gIGlmIChmaXhwLT5meF90Y2JpdCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgdGNiaXQiKTsKLSAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIGRvbmUiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4gICAgc2l6ZT0lZCBmcmFnPSVseCB3aGVyZT0lbGQgb2Zmc2V0PSVseCBhZGRudW1iZXI9JWx4IiwKLQkgICBmaXhwLT5meF9zaXplLCAobG9uZykgZml4cC0+ZnhfZnJhZywgKGxvbmcpIGZpeHAtPmZ4X3doZXJlLAotCSAgIChsb25nKSBmaXhwLT5meF9vZmZzZXQsIChsb25nKSBmaXhwLT5meF9hZGRudW1iZXIpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4gICAgJXMgKCVkKSIsIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhwLT5meF9yX3R5cGUpLAotCSAgIGZpeHAtPmZ4X3JfdHlwZSk7Ci0jZWxzZQotI2lmZGVmIE5FRURfRlhfUl9UWVBFCi0gIGZwcmludGYgKHN0ZGVyciwgIiByX3R5cGU9JWQiLCBmaXhwLT5meF9yX3R5cGUpOwotI2VuZGlmCi0jZW5kaWYKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5KQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuICAgKzwiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChzdGRlcnIsIGZpeHAtPmZ4X2FkZHN5KTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIj4iKTsKLSAgICB9Ci0gIGlmIChmaXhwLT5meF9zdWJzeSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiAgIC08Iik7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoc3RkZXJyLCBmaXhwLT5meF9zdWJzeSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI+Iik7Ci0gICAgfQotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotI2lmZGVmIFRDX0ZJWF9EQVRBX1BSSU5UCi0gIFRDX0ZJWF9EQVRBX1BSSU5UIChzdGRlcnIsIGZpeHApOwotI2VuZGlmCi19Ci0KLS8qIGVuZCBvZiB3cml0ZS5jICovCmRpZmYgLS1naXQgYS9nYXMvd3JpdGUuaCBiL2dhcy93cml0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODZkMmFkLi4wMDAwMDAwCi0tLSBhL2dhcy93cml0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qIHdyaXRlLmgKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9fd3JpdGVfaF9fCi0jZGVmaW5lIF9fd3JpdGVfaF9fCi0KLSNpZm5kZWYgVENfSTk2MAotI2lmZGVmIGhwdXgKLSNkZWZpbmUgRVhFQ19NQUNISU5FX1RZUEUgSFA5MDAwUzIwMF9JRAotI2VuZGlmCi0jZW5kaWYgLyogVENfSTk2MCAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotI2lmbmRlZiBMT0NBTF9MQUJFTAotI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSAobmFtZSBbMF0gPT0gJ0wnICkKLSNlbmRpZgotCi0jZGVmaW5lIFNfTE9DQUxfTkFNRShzKSAoTE9DQUxfTEFCRUwgKFNfR0VUX05BTUUgKHMpKSkKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBUaGlzIGlzIHRoZSBuYW1lIG9mIGEgZmFrZSBzeW1ib2wgd2hpY2ggd2lsbCBuZXZlciBhcHBlYXIgaW4gdGhlCi0gICBhc3NlbWJsZXIgb3V0cHV0LiAgU19JU19MT0NBTCBkZXRlY3RzIGl0IGJlY2F1c2Ugb2YgdGhlIFwwMDEuICAqLwotI2RlZmluZSBGQUtFX0xBQkVMX05BTUUgIkwwXDAwMSIKLQotI2luY2x1ZGUgImJpdF9maXguaCIKLQotLyoKLSAqIEZpeFNzIG1heSBiZSBidWlsdCB1cCBpbiBhbnkgb3JkZXIuCi0gKi8KLQotc3RydWN0IGZpeAotewotICAvKiBUaGVzZSBzbWFsbCBmaWVsZHMgYXJlIGdyb3VwZWQgdG9nZXRoZXIgZm9yIGNvbXBhY3RuZXNzIG9mCi0gICAgIHRoaXMgc3RydWN0dXJlLCBhbmQgZWZmaWNpZW5jeSBvZiBhY2Nlc3Mgb24gc29tZSBhcmNoaXRlY3R1cmVzLiAgKi8KLQotICAvKiBwYy1yZWxhdGl2ZSBvZmZzZXQgYWRqdXN0IChvbmx5IHVzZWQgYnkgbTY4aykgKi8KLSAgY2hhciBmeF9wY3JlbF9hZGp1c3Q7Ci0KLSAgLyogSG93IG1hbnkgYnl0ZXMgYXJlIGludm9sdmVkPyAqLwotICB1bnNpZ25lZCBjaGFyIGZ4X3NpemU7Ci0KLSAgLyogSXMgdGhpcyBhIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24/ICAqLwotICB1bnNpZ25lZCBmeF9wY3JlbCA6IDE7Ci0KLSAgLyogSXMgdGhpcyBhIHJlbG9jYXRpb24gdG8gYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeT8gIElmIHNvLAotICAgICBzb21lIG9mIHRoZSByZWR1Y3Rpb25zIHdlIHRyeSB0byBhcHBseSBhcmUgaW52YWxpZC4gIEEgYmV0dGVyIHdheQotICAgICBtaWdodCBiZSB0byByZXByZXNlbnQgUExUIGVudHJpZXMgd2l0aCBkaWZmZXJlbnQga2luZHMgb2YKLSAgICAgc3ltYm9scywgYW5kIHVzZSBub3JtYWwgcmVsb2NhdGlvbnMgKHdpdGggdW5kZWZpbmVkIHN5bWJvbHMpOwotICAgICBsb29rIGludG8gaXQgZm9yIHZlcnNpb24gMi42LiAgKi8KLSAgdW5zaWduZWQgZnhfcGx0IDogMTsKLQotICAvKiBJcyB0aGlzIHZhbHVlIGFuIGltbWVkaWF0ZSBkaXNwbGFjZW1lbnQ/ICAqLwotICAvKiBPbmx5IHVzZWQgb24gaTk2MCBhbmQgbnMzMms7IG1lcmdlIGl0IGludG8gVENfRklYX1RZUEUgc29tZXRpbWUuICAqLwotICB1bnNpZ25lZCBmeF9pbV9kaXNwIDogMjsKLQotICAvKiBBIGJpdCBmb3IgdGhlIENQVSBzcGVjaWZpYyBjb2RlLgotICAgICBUaGlzIHByb2JhYmx5IGNhbiBiZSBmb2xkZWQgaW50byB0Y19maXhfZGF0YSwgYmVsb3cuICAqLwotICB1bnNpZ25lZCBmeF90Y2JpdCA6IDE7Ci0KLSAgLyogSGFzIHRoaXMgcmVsb2NhdGlvbiBhbHJlYWR5IGJlZW4gYXBwbGllZD8gICovCi0gIHVuc2lnbmVkIGZ4X2RvbmUgOiAxOwotCi0gIC8qIFN1cHByZXNzIG92ZXJmbG93IGNvbXBsYWludHMgb24gbGFyZ2UgYWRkZW5kcy4gIFRoaXMgaXMgdXNlZAotICAgICBpbiB0aGUgUG93ZXJQQyBFTEYgY29uZmlnIHRvIGFsbG93IGxhcmdlIGFkZGVuZHMgb24gdGhlCi0gICAgIEJGRF9SRUxPQ197TE8xNixISTE2LEhJMTZfU30gcmVsb2NhdGlvbnMuCi0KLSAgICAgQEAgQ2FuIHRoaXMgYmUgZGV0ZXJtaW5lZCBmcm9tIEJGRD8gICovCi0gIHVuc2lnbmVkIGZ4X25vX292ZXJmbG93IDogMTsKLQotICAvKiBUaGUgdmFsdWUgaXMgc2lnbmVkIHdoZW4gY2hlY2tpbmcgZm9yIG92ZXJmbG93LiAgKi8KLSAgdW5zaWduZWQgZnhfc2lnbmVkIDogMTsKLQotICAvKiBXaGljaCBmcmFnIGRvZXMgdGhpcyBmaXggYXBwbHkgdG8/ICAqLwotICBmcmFnUyAqZnhfZnJhZzsKLQotICAvKiBXaGVyZSBpcyB0aGUgZmlyc3QgYnl0ZSB0byBmaXggdXA/ICAqLwotICBsb25nIGZ4X3doZXJlOwotCi0gIC8qIE5VTEwgb3IgU3ltYm9sIHdob3NlIHZhbHVlIHdlIGFkZCBpbi4gKi8KLSAgc3ltYm9sUyAqZnhfYWRkc3k7Ci0KLSAgLyogTlVMTCBvciBTeW1ib2wgd2hvc2UgdmFsdWUgd2Ugc3VidHJhY3QuICovCi0gIHN5bWJvbFMgKmZ4X3N1YnN5OwotCi0gIC8qIEFic29sdXRlIG51bWJlciB3ZSBhZGQgaW4uICovCi0gIHZhbHVlVCBmeF9vZmZzZXQ7Ci0KLSAgLyogTmV4dCBmaXhTIGluIGxpbmtlZCBsaXN0LCBvciBOVUxMLiAgKi8KLSAgc3RydWN0IGZpeCAqZnhfbmV4dDsKLQotICAvKiBJZiBOVUxMLCBubyBiaXRmaXgncyB0byBkby4gICovCi0gIC8qIE9ubHkgaTk2MC1jb2ZmIGFuZCBuczMyayB1c2UgdGhpcywgYW5kIGk5NjAtY29mZiBzdG9yZXMgYW4KLSAgICAgaW50ZWdlci4gIFRoaXMgY2FuIHByb2JhYmx5IGJlIGZvbGRlZCBpbnRvIHRjX2ZpeF9kYXRhLCBiZWxvdy4KLSAgICAgQEAgQWxwaGEgYWxzbyB1c2VzIGl0LCBidXQgb25seSB0byBkaXNhYmxlIGNlcnRhaW4gcmVsb2NhdGlvbgotICAgICBwcm9jZXNzaW5nLiAgKi8KLSAgYml0X2ZpeFMgKmZ4X2JpdF9maXhQOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgZnhfcl90eXBlOwotI2Vsc2UKLSNpZmRlZiBORUVEX0ZYX1JfVFlQRQotICAvKiBIYWNrIGZvciBtYWNoaW5lcyB3aGVyZSB0aGUgdHlwZSBvZiByZWxvYyBjYW4ndCBiZQotICAgICB3b3JrZWQgb3V0IGJ5IGxvb2tpbmcgYXQgaG93IGJpZyBpdCBpcy4gICovCi0gIGludCBmeF9yX3R5cGU7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIC8qIFRoaXMgZmllbGQgaXMgc29ydCBvZiBtaXNuYW1lZC4gIEl0IGFwcGVhcnMgdG8gYmUgYSBzb3J0IG9mIHJhbmRvbQotICAgICBzY3JhdGNoIGZpZWxkLCBmb3IgdXNlIGJ5IHRoZSBiYWNrIGVuZHMuICBUaGUgbWFpbiBnYXMgY29kZSBkb2Vzbid0Ci0gICAgIGRvIGFueXRoaW5nIGJ1dCBpbml0aWFsaXplIGl0IHRvIHplcm8uICBUaGUgdXNlIG9mIGl0IGRvZXMgbmVlZCB0bwotICAgICBiZSBjb29yZGluYXRlZCBiZXR3ZWVuIHRoZSBjcHUgYW5kIGZvcm1hdCBmaWxlcywgdGhvdWdoLiAgRS5nLiwgc29tZQotICAgICBjb2ZmIHRhcmdldHMgcGFzcyB0aGUgYGFkZGVuZCcgZmllbGQgZnJvbSB0aGUgY3B1IGZpbGUgdmlhIHRoaXMKLSAgICAgZmllbGQuICBJIGRvbid0IGtub3cgd2h5IHRoZSBgZnhfb2Zmc2V0JyBmaWVsZCBhYm92ZSBjYW4ndCBiZSB1c2VkCi0gICAgIGZvciB0aGF0OyBpbnZlc3RpZ2F0ZSBsYXRlciBhbmQgZG9jdW1lbnQuIEtSICAqLwotICB2YWx1ZVQgZnhfYWRkbnVtYmVyOwotCi0gIC8qIFRoZSBsb2NhdGlvbiBvZiB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggY3JlYXRlZCB0aGUgcmVsb2MsIHVzZWQKLSAgICAgaW4gZXJyb3IgbWVzc2FnZXMuICAqLwotICBjaGFyICpmeF9maWxlOwotICB1bnNpZ25lZCBmeF9saW5lOwotCi0jaWZkZWYgVVNJTkdfQ0dFTgotICBzdHJ1Y3QgewotICAgIC8qIENHRU5fSU5TTiBlbnRyeSBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gICAgY29uc3Qgc3RydWN0IGNnZW5faW5zbiAqaW5zbjsKLSAgICAvKiBUYXJnZXQgc3BlY2lmaWMgZGF0YSwgdXN1YWxseSByZWxvYyBudW1iZXIuICAqLwotICAgIGludCBvcGluZm87Ci0gIH0gZnhfY2dlbjsKLSNlbmRpZgotCi0jaWZkZWYgVENfRklYX1RZUEUKLSAgLyogTG9jYXRpb24gd2hlcmUgYSBiYWNrZW5kIGNhbiBhdHRhY2ggYWRkaXRpb25hbCBkYXRhCi0gICAgIG5lZWRlZCB0byBwZXJmb3JtIGZpeHVwcy4gICovCi0gIFRDX0ZJWF9UWVBFIHRjX2ZpeF9kYXRhOwotI2VuZGlmCi19OwotCi10eXBlZGVmIHN0cnVjdCBmaXggZml4UzsKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gY2hhciAqbmV4dF9vYmplY3RfZmlsZV9jaGFyUDsKLQotI2lmbmRlZiBNQU5ZX1NFR01FTlRTCi1DT01NT04gZml4UyAqdGV4dF9maXhfcm9vdCwgKnRleHRfZml4X3RhaWw7CS8qIENoYWlucyBmaXhTcy4gKi8KLUNPTU1PTiBmaXhTICpkYXRhX2ZpeF9yb290LCAqZGF0YV9maXhfdGFpbDsJLyogQ2hhaW5zIGZpeFNzLiAqLwotQ09NTU9OIGZpeFMgKmJzc19maXhfcm9vdCwgKmJzc19maXhfdGFpbDsJLyogQ2hhaW5zIGZpeFNzLiAqLwotZXh0ZXJuIHN0cnVjdCBmcmFnICp0ZXh0X2xhc3RfZnJhZzsJCS8qIExhc3QgZnJhZyBpbiBzZWdtZW50LiAqLwotZXh0ZXJuIHN0cnVjdCBmcmFnICpkYXRhX2xhc3RfZnJhZzsJCS8qIExhc3QgZnJhZyBpbiBzZWdtZW50LiAqLwotI2VuZGlmCi1DT01NT04gZml4UyAqKnNlZ19maXhfcm9vdFAsICoqc2VnX2ZpeF90YWlsUDsJLyogLT4gb25lIG9mIGFib3ZlLiAqLwotI2VuZGlmCi0KLWV4dGVybiBsb25nIHN0cmluZ19ieXRlX2NvdW50OwotZXh0ZXJuIGludCBzZWN0aW9uX2FsaWdubWVudFtdOwotCi1leHRlcm4gYml0X2ZpeFMgKmJpdF9maXhfbmV3Ci0gIFBBUkFNUyAoKGludCBzaXplLCBpbnQgb2Zmc2V0LCBsb25nIGJhc2VfdHlwZSwgbG9uZyBiYXNlX2FkaiwgbG9uZyBtaW4sCi0JICAgbG9uZyBtYXgsIGxvbmcgYWRkKSk7Ci1leHRlcm4gdm9pZCBhcHBlbmQgUEFSQU1TICgoY2hhciAqKmNoYXJQUCwgY2hhciAqZnJvbVAsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKSk7Ci1leHRlcm4gdm9pZCByZWNvcmRfYWxpZ25tZW50IFBBUkFNUyAoKHNlZ1Qgc2VnLCBpbnQgYWxpZ24pKTsKLWV4dGVybiB2b2lkIHN1YnNlZ3NfZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHdyaXRlX29iamVjdF9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBsb25nIHJlbGF4X2ZyYWcgUEFSQU1TICgoZnJhZ1MgKiwgbG9uZykpOwotZXh0ZXJuIHZvaWQgcmVsYXhfc2VnbWVudAotICBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqIHNlZ19mcmFnX3Jvb3QsIHNlZ1Qgc2VnX3R5cGUpKTsKLQotZXh0ZXJuIHZvaWQgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiBQQVJBTVMgKChjaGFyICosIHZhbHVlVCwgaW50KSk7Ci1leHRlcm4gdm9pZCBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuICAgIFBBUkFNUyAoKGNoYXIgKiwgdmFsdWVULCBpbnQpKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWV4dGVybiBmaXhTICpmaXhfbmV3Ci0gIFBBUkFNUyAoKGZyYWdTICogZnJhZywgaW50IHdoZXJlLCBpbnQgc2l6ZSwgc3ltYm9sUyAqIGFkZF9zeW1ib2wsCi0JICAgb2Zmc2V0VCBvZmZzZXQsIGludCBwY3JlbCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZSkpOwotZXh0ZXJuIGZpeFMgKmZpeF9uZXdfZXhwCi0gIFBBUkFNUyAoKGZyYWdTICogZnJhZywgaW50IHdoZXJlLCBpbnQgc2l6ZSwgZXhwcmVzc2lvblMgKmV4cCwgaW50IHBjcmVsLAotCSAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGUpKTsKLSNlbHNlCi1leHRlcm4gZml4UyAqZml4X25ldwotICBQQVJBTVMgKChmcmFnUyAqIGZyYWcsIGludCB3aGVyZSwgaW50IHNpemUsIHN5bWJvbFMgKiBhZGRfc3ltYm9sLAotCSAgIG9mZnNldFQgb2Zmc2V0LCBpbnQgcGNyZWwsIGludCByX3R5cGUpKTsKLWV4dGVybiBmaXhTICpmaXhfbmV3X2V4cAotICBQQVJBTVMgKChmcmFnUyAqIGZyYWcsIGludCB3aGVyZSwgaW50IHNpemUsIGV4cHJlc3Npb25TICpleHAsIGludCBwY3JlbCwKLQkgICBpbnQgcl90eXBlKSk7Ci0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgd3JpdGVfcHJpbnRfc3RhdGlzdGljcyBQQVJBTVMgKChGSUxFICopKTsKLQotI2VuZGlmIC8qIF9fd3JpdGVfaF9fICovCi0vKiBlbmQgb2Ygd3JpdGUuaCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3dpbmRvd3MubWggYi9nZGIvY29uZmlnL2kzODYvd2luZG93cy5taApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzM2E2ZS4uMDAwMDAwMAotLS0gYS9nZGIvY29uZmlnL2kzODYvd2luZG93cy5taAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgZ2Rid2luLm8gYW5kIHNlci13aW4zMnMuYyBoYXZlIHRvIGJlIG5hbWVkIGJlY2F1c2UgdGhleSBoYXZlCi0jICAgX2luaXRpYWxpemUgZnVuY3Rpb25zIHRoYXQgbmVlZCB0byBiZSBmb3VuZCBieSBpbml0LmMKLSMgZ3VpLm9yZXMgaGFzIHRvIGJlIG5hbWVkLCBvciBlbHNlIG1zdmMgd29uJ3QgbGluayBpdCBpbi4KLVhERVBGSUxFUyA9IFwKLQltc3dpbi9nZGJ3aW4ubyBcCi0JbXN3aW4vc2VyLXdpbjMycy5vIFwKLQltc3dpbi9ndWkub3JlcyBcCi0JbXN3aW4vbGlid2luZ2RiLmEKLQotJChYREVQRklMRVMpOgotCXJvb3RtZT1gcHdkYCA7IGV4cG9ydCByb290bWUgOyBcCi0JKCBjZCBtc3dpbiA7IFwKLQkgICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBhbGwgKQotCi1YTV9GSUxFPXhtLXdpbmRvd3MuaAotTU1BTExPQz0KLVNFUl9IQVJEV0lSRSA9CmRpZmYgLS1naXQgYS9nZGIvZG9jL0dEQnZuLnRleGkgYi9nZGIvZG9jL0dEQnZuLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzIyYmQuLjAwMDAwMDAKLS0tIGEvZ2RiL2RvYy9HREJ2bi50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQHNldCBHREJWTiA0LjE4CmRpZmYgLS1naXQgYS9nZGIvZG9jL3JlbW90ZS50ZXhpIGIvZ2RiL2RvYy9yZW1vdGUudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0YjJhMi4uMDAwMDAwMAotLS0gYS9nZGIvZG9jL3JlbW90ZS50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjIwMiArMCwwIEBACi1AYwkJCQkJCQkJLSotIFRleGluZm8gLSotCi1AYyBDb3B5cmlnaHQgKGMpIDE5OTAgMTk5MSAxOTkyIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgc291cmNlIGZvciB0aGUgR0RCIG1hbnVhbC4KLQotQG5vZGUgUmVtb3RlIFNlcmlhbAotQHN1YnNlY3Rpb24gVGhlIEB2YWx1ZXtHREJOfSByZW1vdGUgc2VyaWFsIHByb3RvY29sCi0KLUBjaW5kZXggcmVtb3RlIHNlcmlhbCBkZWJ1Z2dpbmcsIG92ZXJ2aWV3Ci1UbyBkZWJ1ZyBhIHByb2dyYW0gcnVubmluZyBvbiBhbm90aGVyIG1hY2hpbmUgKHRoZSBkZWJ1Z2dpbmcKLUBkZm57dGFyZ2V0fSBtYWNoaW5lKSwgeW91IG11c3QgZmlyc3QgYXJyYW5nZSBmb3IgYWxsIHRoZSB1c3VhbAotcHJlcmVxdWlzaXRlcyBmb3IgdGhlIHByb2dyYW0gdG8gcnVuIGJ5IGl0c2VsZi4gIEZvciBleGFtcGxlLCBmb3IgYSBDCi1wcm9ncmFtLCB5b3UgbmVlZDoKLQotQGVudW1lcmF0ZQotQGl0ZW0KLUEgc3RhcnR1cCByb3V0aW5lIHRvIHNldCB1cCB0aGUgQyBydW50aW1lIGVudmlyb25tZW50OyB0aGVzZSB1c3VhbGx5Ci1oYXZlIGEgbmFtZSBsaWtlIEBmaWxle2NydDB9LiAgVGhlIHN0YXJ0dXAgcm91dGluZSBtYXkgYmUgc3VwcGxpZWQgYnkKLXlvdXIgaGFyZHdhcmUgc3VwcGxpZXIsIG9yIHlvdSBtYXkgaGF2ZSB0byB3cml0ZSB5b3VyIG93bi4KLQotQGl0ZW0gCi1Zb3UgcHJvYmFibHkgbmVlZCBhIEMgc3Vicm91dGluZSBsaWJyYXJ5IHRvIHN1cHBvcnQgeW91ciBwcm9ncmFtJ3MKLXN1YnJvdXRpbmUgY2FsbHMsIG5vdGFibHkgbWFuYWdpbmcgaW5wdXQgYW5kIG91dHB1dC4KLQotQGl0ZW0KLUEgd2F5IG9mIGdldHRpbmcgeW91ciBwcm9ncmFtIHRvIHRoZSBvdGhlciBtYWNoaW5lLS0tZm9yIGV4YW1wbGUsIGEKLWRvd25sb2FkIHByb2dyYW0uICBUaGVzZSBhcmUgb2Z0ZW4gc3VwcGxpZWQgYnkgdGhlIGhhcmR3YXJlCi1tYW51ZmFjdHVyZXIsIGJ1dCB5b3UgbWF5IGhhdmUgdG8gd3JpdGUgeW91ciBvd24gZnJvbSBoYXJkd2FyZQotZG9jdW1lbnRhdGlvbi4KLUBlbmQgZW51bWVyYXRlCi0KLVRoZSBuZXh0IHN0ZXAgaXMgdG8gYXJyYW5nZSBmb3IgeW91ciBwcm9ncmFtIHRvIHVzZSBhIHNlcmlhbCBwb3J0IHRvCi1jb21tdW5pY2F0ZSB3aXRoIHRoZSBtYWNoaW5lIHdoZXJlIEB2YWx1ZXtHREJOfSBpcyBydW5uaW5nICh0aGUgQGRmbntob3N0fQotbWFjaGluZSkuICBJbiBnZW5lcmFsIHRlcm1zLCB0aGUgc2NoZW1lIGxvb2tzIGxpa2UgdGhpczoKLQotQHRhYmxlIEBlbXBoCi1AaXRlbSBPbiB0aGUgaG9zdCwKLUB2YWx1ZXtHREJOfSBhbHJlYWR5IHVuZGVyc3RhbmRzIGhvdyB0byB1c2UgdGhpcyBwcm90b2NvbDsgd2hlbiBldmVyeXRoaW5nCi1lbHNlIGlzIHNldCB1cCwgeW91IGNhbiBzaW1wbHkgdXNlIHRoZSBAc2FtcHt0YXJnZXQgcmVtb3RlfSBjb21tYW5kCi0oQHB4cmVme1RhcmdldHMsLFNwZWNpZnlpbmcgYSBEZWJ1Z2dpbmcgVGFyZ2V0fSkuCi0KLUBpdGVtIE9uIHRoZSB0YXJnZXQsCi15b3UgbXVzdCBsaW5rIHdpdGggeW91ciBwcm9ncmFtIGEgZmV3IHNwZWNpYWwtcHVycG9zZSBzdWJyb3V0aW5lcyB0aGF0Ci1pbXBsZW1lbnQgdGhlIEB2YWx1ZXtHREJOfSByZW1vdGUgc2VyaWFsIHByb3RvY29sLiAgVGhlIGZpbGUgY29udGFpbmluZyB0aGVzZQotc3Vicm91dGluZXMgaXMgY2FsbGVkICBhIEBkZm57ZGVidWdnaW5nIHN0dWJ9LgotCi1PbiBjZXJ0YWluIHJlbW90ZSB0YXJnZXRzLCB5b3UgY2FuIHVzZSBhbiBhdXhpbGlhcnkgcHJvZ3JhbQotQGNvZGV7Z2Ric2VydmVyfSBpbnN0ZWFkIG9mIGxpbmtpbmcgYSBzdHViIGludG8geW91ciBwcm9ncmFtLgotQHhyZWZ7U2VydmVyLCxVc2luZyB0aGUgQGNvZGV7Z2Ric2VydmVyfSBwcm9ncmFtfSwgZm9yIGRldGFpbHMuCi1AZW5kIHRhYmxlCi0KLVRoZSBkZWJ1Z2dpbmcgc3R1YiBpcyBzcGVjaWZpYyB0byB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSByZW1vdGUKLW1hY2hpbmU7IGZvciBleGFtcGxlLCB1c2UgQGZpbGV7c3BhcmMtc3R1Yi5jfSB0byBkZWJ1ZyBwcm9ncmFtcyBvbgotQHNje3NwYXJjfSBib2FyZHMuCi0KLUBjaW5kZXggcmVtb3RlIHNlcmlhbCBzdHViIGxpc3QKLVRoZXNlIHdvcmtpbmcgcmVtb3RlIHN0dWJzIGFyZSBkaXN0cmlidXRlZCB3aXRoIEB2YWx1ZXtHREJOfToKLQotQHRhYmxlIEBjb2RlCi0KLUBpdGVtIGkzODYtc3R1Yi5jCi1Aa2luZGV4IGkzODYtc3R1Yi5jCi1AY2luZGV4IEludGVsCi1AY2luZGV4IGkzODYKLUZvciBJbnRlbCAzODYgYW5kIGNvbXBhdGlibGUgYXJjaGl0ZWN0dXJlcy4KLQotQGl0ZW0gbTY4ay1zdHViLmMKLUBraW5kZXggbTY4ay1zdHViLmMKLUBjaW5kZXggTW90b3JvbGEgNjgweDAKLUBjaW5kZXggbTY4MHgwCi1Gb3IgTW90b3JvbGEgNjgweDAgYXJjaGl0ZWN0dXJlcy4KLQotQGl0ZW0gc2gtc3R1Yi5jCi1Aa2luZGV4IHNoLXN0dWIuYwotQGNpbmRleCBIaXRhY2hpCi1AY2luZGV4IFNICi1Gb3IgSGl0YWNoaSBTSCBhcmNoaXRlY3R1cmVzLgotCi1AaXRlbSBzcGFyYy1zdHViLmMKLUBraW5kZXggc3BhcmMtc3R1Yi5jCi1AY2luZGV4IFNwYXJjCi1Gb3IgQHNje3NwYXJjfSBhcmNoaXRlY3R1cmVzLgotCi1AaXRlbSBzcGFyY2wtc3R1Yi5jCi1Aa2luZGV4IHNwYXJjbC1zdHViLmMKLUBjaW5kZXggRnVqaXRzdQotQGNpbmRleCBTcGFyY0xpdGUKLUZvciBGdWppdHN1IEBzY3tzcGFyY2xpdGV9IGFyY2hpdGVjdHVyZXMuCi0KLUBlbmQgdGFibGUKLQotVGhlIEBmaWxle1JFQURNRX0gZmlsZSBpbiB0aGUgQHZhbHVle0dEQk59IGRpc3RyaWJ1dGlvbiBtYXkgbGlzdCBvdGhlcgotcmVjZW50bHkgYWRkZWQgc3R1YnMuCi0KLUBtZW51Ci0qIFN0dWIgQ29udGVudHM6OiAgICAgICBXaGF0IHRoZSBzdHViIGNhbiBkbyBmb3IgeW91Ci0qIEJvb3RzdHJhcHBpbmc6OiAgICAgICBXaGF0IHlvdSBtdXN0IGRvIGZvciB0aGUgc3R1YgotKiBEZWJ1ZyBTZXNzaW9uOjogICAgICAgUHV0dGluZyBpdCBhbGwgdG9nZXRoZXIKLSogUHJvdG9jb2w6OiAgICAgICAgICAgIERlZmluaXRpb24gb2YgdGhlIGNvbW11bmljYXRpb24gcHJvdG9jb2wKLSogU2VydmVyOjoJCVVzaW5nIHRoZSBgZ2Ric2VydmVyJyBwcm9ncmFtCi0qIE5ldFdhcmU6OgkJVXNpbmcgdGhlIGBnZGJzZXJ2ZS5ubG0nIHByb2dyYW0KLUBlbmQgbWVudQotCi1Abm9kZSBTdHViIENvbnRlbnRzCi1Ac3Vic3Vic2VjdGlvbiBXaGF0IHRoZSBzdHViIGNhbiBkbyBmb3IgeW91Ci0KLUBjaW5kZXggcmVtb3RlIHNlcmlhbCBzdHViCi1UaGUgZGVidWdnaW5nIHN0dWIgZm9yIHlvdXIgYXJjaGl0ZWN0dXJlIHN1cHBsaWVzIHRoZXNlIHRocmVlCi1zdWJyb3V0aW5lczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBzZXRfZGVidWdfdHJhcHMKLUBraW5kZXggc2V0X2RlYnVnX3RyYXBzCi1AY2luZGV4IHJlbW90ZSBzZXJpYWwgc3R1YiwgaW5pdGlhbGl6YXRpb24KLVRoaXMgcm91dGluZSBhcnJhbmdlcyBmb3IgQGNvZGV7aGFuZGxlX2V4Y2VwdGlvbn0gdG8gcnVuIHdoZW4geW91cgotcHJvZ3JhbSBzdG9wcy4gIFlvdSBtdXN0IGNhbGwgdGhpcyBzdWJyb3V0aW5lIGV4cGxpY2l0bHkgbmVhciB0aGUKLWJlZ2lubmluZyBvZiB5b3VyIHByb2dyYW0uCi0KLUBpdGVtIGhhbmRsZV9leGNlcHRpb24KLUBraW5kZXggaGFuZGxlX2V4Y2VwdGlvbgotQGNpbmRleCByZW1vdGUgc2VyaWFsIHN0dWIsIG1haW4gcm91dGluZQotVGhpcyBpcyB0aGUgY2VudHJhbCB3b3JraG9yc2UsIGJ1dCB5b3VyIHByb2dyYW0gbmV2ZXIgY2FsbHMgaXQKLWV4cGxpY2l0bHktLS10aGUgc2V0dXAgY29kZSBhcnJhbmdlcyBmb3IgQGNvZGV7aGFuZGxlX2V4Y2VwdGlvbn0gdG8KLXJ1biB3aGVuIGEgdHJhcCBpcyB0cmlnZ2VyZWQuCi0KLUBjb2Rle2hhbmRsZV9leGNlcHRpb259IHRha2VzIGNvbnRyb2wgd2hlbiB5b3VyIHByb2dyYW0gc3RvcHMgZHVyaW5nCi1leGVjdXRpb24gKGZvciBleGFtcGxlLCBvbiBhIGJyZWFrcG9pbnQpLCBhbmQgbWVkaWF0ZXMgY29tbXVuaWNhdGlvbnMKLXdpdGggQHZhbHVle0dEQk59IG9uIHRoZSBob3N0IG1hY2hpbmUuICBUaGlzIGlzIHdoZXJlIHRoZSBjb21tdW5pY2F0aW9ucwotcHJvdG9jb2wgaXMgaW1wbGVtZW50ZWQ7IEBjb2Rle2hhbmRsZV9leGNlcHRpb259IGFjdHMgYXMgdGhlIEB2YWx1ZXtHREJOfQotcmVwcmVzZW50YXRpdmUgb24gdGhlIHRhcmdldCBtYWNoaW5lOyBpdCBiZWdpbnMgYnkgc2VuZGluZyBzdW1tYXJ5Ci1pbmZvcm1hdGlvbiBvbiB0aGUgc3RhdGUgb2YgeW91ciBwcm9ncmFtLCB0aGVuIGNvbnRpbnVlcyB0byBleGVjdXRlLAotcmV0cmlldmluZyBhbmQgdHJhbnNtaXR0aW5nIGFueSBpbmZvcm1hdGlvbiBAdmFsdWV7R0RCTn0gbmVlZHMsIHVudGlsIHlvdQotZXhlY3V0ZSBhIEB2YWx1ZXtHREJOfSBjb21tYW5kIHRoYXQgbWFrZXMgeW91ciBwcm9ncmFtIHJlc3VtZTsgYXQgdGhhdCBwb2ludCwKLUBjb2Rle2hhbmRsZV9leGNlcHRpb259IHJldHVybnMgY29udHJvbCB0byB5b3VyIG93biBjb2RlIG9uIHRoZSB0YXJnZXQKLW1hY2hpbmUuIAotCi1AaXRlbSBicmVha3BvaW50Ci1AY2luZGV4IEBjb2Rle2JyZWFrcG9pbnR9IHN1YnJvdXRpbmUsIHJlbW90ZQotVXNlIHRoaXMgYXV4aWxpYXJ5IHN1YnJvdXRpbmUgdG8gbWFrZSB5b3VyIHByb2dyYW0gY29udGFpbiBhCi1icmVha3BvaW50LiAgRGVwZW5kaW5nIG9uIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiwgdGhpcyBtYXkgYmUgdGhlIG9ubHkKLXdheSBmb3IgQHZhbHVle0dEQk59IHRvIGdldCBjb250cm9sLiAgRm9yIGluc3RhbmNlLCBpZiB5b3VyIHRhcmdldAotbWFjaGluZSBoYXMgc29tZSBzb3J0IG9mIGludGVycnVwdCBidXR0b24sIHlvdSB3b24ndCBuZWVkIHRvIGNhbGwgdGhpczsKLXByZXNzaW5nIHRoZSBpbnRlcnJ1cHQgYnV0dG9uIHRyYW5zZmVycyBjb250cm9sIHRvCi1AY29kZXtoYW5kbGVfZXhjZXB0aW9ufS0tLWluIGVmZmVjdCwgdG8gQHZhbHVle0dEQk59LiAgT24gc29tZSBtYWNoaW5lcywKLXNpbXBseSByZWNlaXZpbmcgY2hhcmFjdGVycyBvbiB0aGUgc2VyaWFsIHBvcnQgbWF5IGFsc28gdHJpZ2dlciBhIHRyYXA7Ci1hZ2FpbiwgaW4gdGhhdCBzaXR1YXRpb24sIHlvdSBkb24ndCBuZWVkIHRvIGNhbGwgQGNvZGV7YnJlYWtwb2ludH0gZnJvbQoteW91ciBvd24gcHJvZ3JhbS0tLXNpbXBseSBydW5uaW5nIEBzYW1we3RhcmdldCByZW1vdGV9IGZyb20gdGhlIGhvc3QKLUB2YWx1ZXtHREJOfSBzZXNzaW9uIGdldHMgY29udHJvbC4gIAotCi1DYWxsIEBjb2Rle2JyZWFrcG9pbnR9IGlmIG5vbmUgb2YgdGhlc2UgaXMgdHJ1ZSwgb3IgaWYgeW91IHNpbXBseSB3YW50Ci10byBtYWtlIGNlcnRhaW4geW91ciBwcm9ncmFtIHN0b3BzIGF0IGEgcHJlZGV0ZXJtaW5lZCBwb2ludCBmb3IgdGhlCi1zdGFydCBvZiB5b3VyIGRlYnVnZ2luZyBzZXNzaW9uLgotQGVuZCB0YWJsZQotCi1Abm9kZSBCb290c3RyYXBwaW5nCi1Ac3Vic3Vic2VjdGlvbiBXaGF0IHlvdSBtdXN0IGRvIGZvciB0aGUgc3R1YgotCi1AY2luZGV4IHJlbW90ZSBzdHViLCBzdXBwb3J0IHJvdXRpbmVzCi1UaGUgZGVidWdnaW5nIHN0dWJzIHRoYXQgY29tZSB3aXRoIEB2YWx1ZXtHREJOfSBhcmUgc2V0IHVwIGZvciBhIHBhcnRpY3VsYXIKLWNoaXAgYXJjaGl0ZWN0dXJlLCBidXQgdGhleSBoYXZlIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXN0IG9mIHlvdXIKLWRlYnVnZ2luZyB0YXJnZXQgbWFjaGluZS4KLQotRmlyc3Qgb2YgYWxsIHlvdSBuZWVkIHRvIHRlbGwgdGhlIHN0dWIgaG93IHRvIGNvbW11bmljYXRlIHdpdGggdGhlCi1zZXJpYWwgcG9ydC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBpbnQgZ2V0RGVidWdDaGFyKCkKLUBraW5kZXggZ2V0RGVidWdDaGFyCi1Xcml0ZSB0aGlzIHN1YnJvdXRpbmUgdG8gcmVhZCBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc2VyaWFsIHBvcnQuCi1JdCBtYXkgYmUgaWRlbnRpY2FsIHRvIEBjb2Rle2dldGNoYXJ9IGZvciB5b3VyIHRhcmdldCBzeXN0ZW07IGEKLWRpZmZlcmVudCBuYW1lIGlzIHVzZWQgdG8gYWxsb3cgeW91IHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gaWYgeW91IHdpc2guCi0KLUBpdGVtIHZvaWQgcHV0RGVidWdDaGFyKGludCkKLUBraW5kZXggcHV0RGVidWdDaGFyCi1Xcml0ZSB0aGlzIHN1YnJvdXRpbmUgdG8gd3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyIHRvIHRoZSBzZXJpYWwgcG9ydC4KLUl0IG1heSBiZSBpZGVudGljYWwgdG8gQGNvZGV7cHV0Y2hhcn0gZm9yIHlvdXIgdGFyZ2V0IHN5c3RlbTsgYSAKLWRpZmZlcmVudCBuYW1lIGlzIHVzZWQgdG8gYWxsb3cgeW91IHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gaWYgeW91IHdpc2guCi1AZW5kIHRhYmxlCi0KLUBjaW5kZXggY29udHJvbCBDLCBhbmQgcmVtb3RlIGRlYnVnZ2luZwotQGNpbmRleCBpbnRlcnJ1cHRpbmcgcmVtb3RlIHRhcmdldHMKLUlmIHlvdSB3YW50IEB2YWx1ZXtHREJOfSB0byBiZSBhYmxlIHRvIHN0b3AgeW91ciBwcm9ncmFtIHdoaWxlIGl0IGlzCi1ydW5uaW5nLCB5b3UgbmVlZCB0byB1c2UgYW4gaW50ZXJydXB0LWRyaXZlbiBzZXJpYWwgZHJpdmVyLCBhbmQgYXJyYW5nZQotZm9yIGl0IHRvIHN0b3Agd2hlbiBpdCByZWNlaXZlcyBhIEBjb2Rle15DfSAoQHNhbXB7XDAwM30sIHRoZSBjb250cm9sLUMKLWNoYXJhY3RlcikuICBUaGF0IGlzIHRoZSBjaGFyYWN0ZXIgd2hpY2ggQHZhbHVle0dEQk59IHVzZXMgdG8gdGVsbCB0aGUKLXJlbW90ZSBzeXN0ZW0gdG8gc3RvcC4KLQotR2V0dGluZyB0aGUgZGVidWdnaW5nIHRhcmdldCB0byByZXR1cm4gdGhlIHByb3BlciBzdGF0dXMgdG8gQHZhbHVle0dEQk59Ci1wcm9iYWJseSByZXF1aXJlcyBjaGFuZ2VzIHRvIHRoZSBzdGFuZGFyZCBzdHViOyBvbmUgcXVpY2sgYW5kIGRpcnR5IHdheQotaXMgdG8ganVzdCBleGVjdXRlIGEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiAodGhlIGBgZGlydHknJyBwYXJ0IGlzIHRoYXQKLUB2YWx1ZXtHREJOfSByZXBvcnRzIGEgQGNvZGV7U0lHVFJBUH0gaW5zdGVhZCBvZiBhIEBjb2Rle1NJR0lOVH0pLgotCi1PdGhlciByb3V0aW5lcyB5b3UgbmVlZCB0byBzdXBwbHkgYXJlOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHZvaWQgZXhjZXB0aW9uSGFuZGxlciAoaW50IEB2YXJ7ZXhjZXB0aW9uX251bWJlcn0sIHZvaWQgKkB2YXJ7ZXhjZXB0aW9uX2FkZHJlc3N9KQotQGtpbmRleCBleGNlcHRpb25IYW5kbGVyCi1Xcml0ZSB0aGlzIGZ1bmN0aW9uIHRvIGluc3RhbGwgQHZhcntleGNlcHRpb25fYWRkcmVzc30gaW4gdGhlIGV4Y2VwdGlvbgotaGFuZGxpbmcgdGFibGVzLiAgWW91IG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIHRoZSBzdHViIGRvZXMgbm90IGhhdmUgYW55Ci13YXkgb2Yga25vd2luZyB3aGF0IHRoZSBleGNlcHRpb24gaGFuZGxpbmcgdGFibGVzIG9uIHlvdXIgdGFyZ2V0IHN5c3RlbQotYXJlIGxpa2UgKGZvciBleGFtcGxlLCB0aGUgcHJvY2Vzc29yJ3MgdGFibGUgbWlnaHQgYmUgaW4gQHNje3JvbX0sCi1jb250YWluaW5nIGVudHJpZXMgd2hpY2ggcG9pbnQgdG8gYSB0YWJsZSBpbiBAc2N7cmFtfSkuCi1AdmFye2V4Y2VwdGlvbl9udW1iZXJ9IGlzIHRoZSBleGNlcHRpb24gbnVtYmVyIHdoaWNoIHNob3VsZCBiZSBjaGFuZ2VkOwotaXRzIG1lYW5pbmcgaXMgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCAoZm9yIGV4YW1wbGUsIGRpZmZlcmVudCBudW1iZXJzCi1taWdodCByZXByZXNlbnQgZGl2aWRlIGJ5IHplcm8sIG1pc2FsaWduZWQgYWNjZXNzLCBldGMpLiAgV2hlbiB0aGlzCi1leGNlcHRpb24gb2NjdXJzLCBjb250cm9sIHNob3VsZCBiZSB0cmFuc2ZlcnJlZCBkaXJlY3RseSB0bwotQHZhcntleGNlcHRpb25fYWRkcmVzc30sIGFuZCB0aGUgcHJvY2Vzc29yIHN0YXRlIChzdGFjaywgcmVnaXN0ZXJzLAotYW5kIHNvIG9uKSBzaG91bGQgYmUganVzdCBhcyBpdCBpcyB3aGVuIGEgcHJvY2Vzc29yIGV4Y2VwdGlvbiBvY2N1cnMuICBTbyBpZgoteW91IHdhbnQgdG8gdXNlIGEganVtcCBpbnN0cnVjdGlvbiB0byByZWFjaCBAdmFye2V4Y2VwdGlvbl9hZGRyZXNzfSwgaXQKLXNob3VsZCBiZSBhIHNpbXBsZSBqdW1wLCBub3QgYSBqdW1wIHRvIHN1YnJvdXRpbmUuCi0KLUZvciB0aGUgMzg2LCBAdmFye2V4Y2VwdGlvbl9hZGRyZXNzfSBzaG91bGQgYmUgaW5zdGFsbGVkIGFzIGFuIGludGVycnVwdAotZ2F0ZSBzbyB0aGF0IGludGVycnVwdHMgYXJlIG1hc2tlZCB3aGlsZSB0aGUgaGFuZGxlciBydW5zLiAgVGhlIGdhdGUKLXNob3VsZCBiZSBhdCBwcml2aWxlZ2UgbGV2ZWwgMCAodGhlIG1vc3QgcHJpdmlsZWdlZCBsZXZlbCkuICBUaGUKLUBzY3tzcGFyY30gYW5kIDY4ayBzdHVicyBhcmUgYWJsZSB0byBtYXNrIGludGVycnVwdHMgdGhlbXNlbHZlcyB3aXRob3V0Ci1oZWxwIGZyb20gQGNvZGV7ZXhjZXB0aW9uSGFuZGxlcn0uCi0KLUBpdGVtIHZvaWQgZmx1c2hfaV9jYWNoZSgpCi1Aa2luZGV4IGZsdXNoX2lfY2FjaGUKLShzcGFyYyBhbmQgc3BhcmNsaXRlIG9ubHkpIFdyaXRlIHRoaXMgc3Vicm91dGluZSB0byBmbHVzaCB0aGUKLWluc3RydWN0aW9uIGNhY2hlLCBpZiBhbnksIG9uIHlvdXIgdGFyZ2V0IG1hY2hpbmUuICBJZiB0aGVyZSBpcyBubwotaW5zdHJ1Y3Rpb24gY2FjaGUsIHRoaXMgc3Vicm91dGluZSBtYXkgYmUgYSBuby1vcC4KLQotT24gdGFyZ2V0IG1hY2hpbmVzIHRoYXQgaGF2ZSBpbnN0cnVjdGlvbiBjYWNoZXMsIEB2YWx1ZXtHREJOfSByZXF1aXJlcyB0aGlzCi1mdW5jdGlvbiB0byBtYWtlIGNlcnRhaW4gdGhhdCB0aGUgc3RhdGUgb2YgeW91ciBwcm9ncmFtIGlzIHN0YWJsZS4KLUBlbmQgdGFibGUKLQotQG5vaW5kZW50Ci1Zb3UgbXVzdCBhbHNvIG1ha2Ugc3VyZSB0aGlzIGxpYnJhcnkgcm91dGluZSBpcyBhdmFpbGFibGU6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gdm9pZCAqbWVtc2V0KHZvaWQgKiwgaW50LCBpbnQpCi1Aa2luZGV4IG1lbXNldAotVGhpcyBpcyB0aGUgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbiBAY29kZXttZW1zZXR9IHRoYXQgc2V0cyBhbiBhcmVhIG9mCi1tZW1vcnkgdG8gYSBrbm93biB2YWx1ZS4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aGUgZnJlZSB2ZXJzaW9ucyBvZgotQGNvZGV7bGliYy5hfSwgQGNvZGV7bWVtc2V0fSBjYW4gYmUgZm91bmQgdGhlcmU7IG90aGVyd2lzZSwgeW91IG11c3QKLWVpdGhlciBvYnRhaW4gaXQgZnJvbSB5b3VyIGhhcmR3YXJlIG1hbnVmYWN0dXJlciwgb3Igd3JpdGUgeW91ciBvd24uCi1AZW5kIHRhYmxlCi0KLUlmIHlvdSBkbyBub3QgdXNlIHRoZSBHTlUgQyBjb21waWxlciwgeW91IG1heSBuZWVkIG90aGVyIHN0YW5kYXJkCi1saWJyYXJ5IHN1YnJvdXRpbmVzIGFzIHdlbGw7IHRoaXMgdmFyaWVzIGZyb20gb25lIHN0dWIgdG8gYW5vdGhlciwKLWJ1dCBpbiBnZW5lcmFsIHRoZSBzdHVicyBhcmUgbGlrZWx5IHRvIHVzZSBhbnkgb2YgdGhlIGNvbW1vbiBsaWJyYXJ5Ci1zdWJyb3V0aW5lcyB3aGljaCBAY29kZXtnY2N9IGdlbmVyYXRlcyBhcyBpbmxpbmUgY29kZS4KLQotCi1Abm9kZSBEZWJ1ZyBTZXNzaW9uCi1Ac3Vic3Vic2VjdGlvbiBQdXR0aW5nIGl0IGFsbCB0b2dldGhlcgotCi1AY2luZGV4IHJlbW90ZSBzZXJpYWwgZGVidWdnaW5nIHN1bW1hcnkKLUluIHN1bW1hcnksIHdoZW4geW91ciBwcm9ncmFtIGlzIHJlYWR5IHRvIGRlYnVnLCB5b3UgbXVzdCBmb2xsb3cgdGhlc2UKLXN0ZXBzLgotCi1AZW51bWVyYXRlCi1AaXRlbQotTWFrZSBzdXJlIHlvdSBoYXZlIHRoZSBzdXBwb3J0aW5nIGxvdy1sZXZlbCByb3V0aW5lcwotKEBweHJlZntCb290c3RyYXBwaW5nLCxXaGF0IHlvdSBtdXN0IGRvIGZvciB0aGUgc3R1Yn0pOgotQGRpc3BsYXkKLUBjb2Rle2dldERlYnVnQ2hhcn0sIEBjb2Rle3B1dERlYnVnQ2hhcn0sCi1AY29kZXtmbHVzaF9pX2NhY2hlfSwgQGNvZGV7bWVtc2V0fSwgQGNvZGV7ZXhjZXB0aW9uSGFuZGxlcn0uCi1AZW5kIGRpc3BsYXkKLQotQGl0ZW0KLUluc2VydCB0aGVzZSBsaW5lcyBuZWFyIHRoZSB0b3Agb2YgeW91ciBwcm9ncmFtOgotCi1AZXhhbXBsZQotc2V0X2RlYnVnX3RyYXBzKCk7Ci1icmVha3BvaW50KCk7Ci1AZW5kIGV4YW1wbGUKLQotQGl0ZW0KLUZvciB0aGUgNjgweDAgc3R1YiBvbmx5LCB5b3UgbmVlZCB0byBwcm92aWRlIGEgdmFyaWFibGUgY2FsbGVkCi1AY29kZXtleGNlcHRpb25Ib29rfS4gIE5vcm1hbGx5IHlvdSBqdXN0IHVzZToKLQotQGV4YW1wbGUKLXZvaWQgKCpleGNlcHRpb25Ib29rKSgpID0gMDsKLUBlbmQgZXhhbXBsZQotCi1idXQgaWYgYmVmb3JlIGNhbGxpbmcgQGNvZGV7c2V0X2RlYnVnX3RyYXBzfSwgeW91IHNldCBpdCB0byBwb2ludCB0byBhCi1mdW5jdGlvbiBpbiB5b3VyIHByb2dyYW0sIHRoYXQgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4KLUBjb2Rle0B2YWx1ZXtHREJOfX0gY29udGludWVzIGFmdGVyIHN0b3BwaW5nIG9uIGEgdHJhcCAoZm9yIGV4YW1wbGUsIGJ1cwotZXJyb3IpLiAgVGhlIGZ1bmN0aW9uIGluZGljYXRlZCBieSBAY29kZXtleGNlcHRpb25Ib29rfSBpcyBjYWxsZWQgd2l0aAotb25lIHBhcmFtZXRlcjogYW4gQGNvZGV7aW50fSB3aGljaCBpcyB0aGUgZXhjZXB0aW9uIG51bWJlci4KLQotQGl0ZW0KLUNvbXBpbGUgYW5kIGxpbmsgdG9nZXRoZXI6IHlvdXIgcHJvZ3JhbSwgdGhlIEB2YWx1ZXtHREJOfSBkZWJ1Z2dpbmcgc3R1YiBmb3IKLXlvdXIgdGFyZ2V0IGFyY2hpdGVjdHVyZSwgYW5kIHRoZSBzdXBwb3J0aW5nIHN1YnJvdXRpbmVzLgotCi1AaXRlbQotTWFrZSBzdXJlIHlvdSBoYXZlIGEgc2VyaWFsIGNvbm5lY3Rpb24gYmV0d2VlbiB5b3VyIHRhcmdldCBtYWNoaW5lIGFuZAotdGhlIEB2YWx1ZXtHREJOfSBob3N0LCBhbmQgaWRlbnRpZnkgdGhlIHNlcmlhbCBwb3J0IG9uIHRoZSBob3N0LgotCi1AaXRlbQotQGMgVGhlICJyZW1vdGUiIHRhcmdldCBub3cgcHJvdmlkZXMgYSBgbG9hZCcgY29tbWFuZCwgc28gd2Ugc2hvdWxkCi1AYyBkb2N1bWVudCB0aGF0LiAgRklYTUUuCi1Eb3dubG9hZCB5b3VyIHByb2dyYW0gdG8geW91ciB0YXJnZXQgbWFjaGluZSAob3IgZ2V0IGl0IHRoZXJlIGJ5Ci13aGF0ZXZlciBtZWFucyB0aGUgbWFudWZhY3R1cmVyIHByb3ZpZGVzKSwgYW5kIHN0YXJ0IGl0LgotCi1AaXRlbQotVG8gc3RhcnQgcmVtb3RlIGRlYnVnZ2luZywgcnVuIEB2YWx1ZXtHREJOfSBvbiB0aGUgaG9zdCBtYWNoaW5lLCBhbmQgc3BlY2lmeQotYXMgYW4gZXhlY3V0YWJsZSBmaWxlIHRoZSBwcm9ncmFtIHRoYXQgaXMgcnVubmluZyBpbiB0aGUgcmVtb3RlIG1hY2hpbmUuCi1UaGlzIHRlbGxzIEB2YWx1ZXtHREJOfSBob3cgdG8gZmluZCB5b3VyIHByb2dyYW0ncyBzeW1ib2xzIGFuZCB0aGUgY29udGVudHMKLW9mIGl0cyBwdXJlIHRleHQuCi0KLUBjaW5kZXggc2VyaWFsIGxpbmUsIEBjb2Rle3RhcmdldCByZW1vdGV9Ci1UaGVuIGVzdGFibGlzaCBjb21tdW5pY2F0aW9uIHVzaW5nIHRoZSBAY29kZXt0YXJnZXQgcmVtb3RlfSBjb21tYW5kLgotSXRzIGFyZ3VtZW50IHNwZWNpZmllcyBob3cgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgdGFyZ2V0Ci1tYWNoaW5lLS0tZWl0aGVyIHZpYSBhIGRldmljZW5hbWUgYXR0YWNoZWQgdG8gYSBkaXJlY3Qgc2VyaWFsIGxpbmUsIG9yIGEKLVRDUCBwb3J0ICh1c3VhbGx5IHRvIGEgdGVybWluYWwgc2VydmVyIHdoaWNoIGluIHR1cm4gaGFzIGEgc2VyaWFsIGxpbmUKLXRvIHRoZSB0YXJnZXQpLiAgRm9yIGV4YW1wbGUsIHRvIHVzZSBhIHNlcmlhbCBsaW5lIGNvbm5lY3RlZCB0byB0aGUKLWRldmljZSBuYW1lZCBAZmlsZXsvZGV2L3R0eWJ9OgotCi1AZXhhbXBsZQotdGFyZ2V0IHJlbW90ZSAvZGV2L3R0eWIKLUBlbmQgZXhhbXBsZQotCi1AY2luZGV4IFRDUCBwb3J0LCBAY29kZXt0YXJnZXQgcmVtb3RlfQotVG8gdXNlIGEgVENQIGNvbm5lY3Rpb24sIHVzZSBhbiBhcmd1bWVudCBvZiB0aGUgZm9ybQotQGNvZGV7QHZhcntob3N0fTpwb3J0fS4gIEZvciBleGFtcGxlLCB0byBjb25uZWN0IHRvIHBvcnQgMjgyOCBvbiBhCi10ZXJtaW5hbCBzZXJ2ZXIgbmFtZWQgQGNvZGV7bWFueWZhcm1zfToKLQotQGV4YW1wbGUKLXRhcmdldCByZW1vdGUgbWFueWZhcm1zOjI4MjgKLUBlbmQgZXhhbXBsZQotQGVuZCBlbnVtZXJhdGUKLQotTm93IHlvdSBjYW4gdXNlIGFsbCB0aGUgdXN1YWwgY29tbWFuZHMgdG8gZXhhbWluZSBhbmQgY2hhbmdlIGRhdGEgYW5kIHRvCi1zdGVwIGFuZCBjb250aW51ZSB0aGUgcmVtb3RlIHByb2dyYW0uCi0KLVRvIHJlc3VtZSB0aGUgcmVtb3RlIHByb2dyYW0gYW5kIHN0b3AgZGVidWdnaW5nIGl0LCB1c2UgdGhlIEBjb2Rle2RldGFjaH0KLWNvbW1hbmQuCi0KLUBjaW5kZXggaW50ZXJydXB0aW5nIHJlbW90ZSBwcm9ncmFtcwotQGNpbmRleCByZW1vdGUgcHJvZ3JhbXMsIGludGVycnVwdGluZwotV2hlbmV2ZXIgQHZhbHVle0dEQk59IGlzIHdhaXRpbmcgZm9yIHRoZSByZW1vdGUgcHJvZ3JhbSwgaWYgeW91IHR5cGUgdGhlCi1pbnRlcnJ1cHQgY2hhcmFjdGVyIChvZnRlbiBAa2V5e0MtQ30pLCBAdmFsdWV7R0RCTn0gYXR0ZW1wdHMgdG8gc3RvcCB0aGUKLXByb2dyYW0uICBUaGlzIG1heSBvciBtYXkgbm90IHN1Y2NlZWQsIGRlcGVuZGluZyBpbiBwYXJ0IG9uIHRoZSBoYXJkd2FyZQotYW5kIHRoZSBzZXJpYWwgZHJpdmVycyB0aGUgcmVtb3RlIHN5c3RlbSB1c2VzLiAgSWYgeW91IHR5cGUgdGhlCi1pbnRlcnJ1cHQgY2hhcmFjdGVyIG9uY2UgYWdhaW4sIEB2YWx1ZXtHREJOfSBkaXNwbGF5cyB0aGlzIHByb21wdDoKLQotQGV4YW1wbGUKLUludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBwcm9ncmFtLgotR2l2ZSB1cCAoYW5kIHN0b3AgZGVidWdnaW5nIGl0KT8gICh5IG9yIG4pCi1AZW5kIGV4YW1wbGUKLQotSWYgeW91IHR5cGUgQGtiZHt5fSwgQHZhbHVle0dEQk59IGFiYW5kb25zIHRoZSByZW1vdGUgZGVidWdnaW5nIHNlc3Npb24uCi0oSWYgeW91IGRlY2lkZSB5b3Ugd2FudCB0byB0cnkgYWdhaW4gbGF0ZXIsIHlvdSBjYW4gdXNlIEBzYW1we3RhcmdldAotcmVtb3RlfSBhZ2FpbiB0byBjb25uZWN0IG9uY2UgbW9yZS4pICBJZiB5b3UgdHlwZSBAa2Jke259LCBAdmFsdWV7R0RCTn0KLWdvZXMgYmFjayB0byB3YWl0aW5nLgotCi1Abm9kZSBQcm90b2NvbAotQHN1YnN1YnNlY3Rpb24gQ29tbXVuaWNhdGlvbiBwcm90b2NvbAotCi1AY2luZGV4IGRlYnVnZ2luZyBzdHViLCBleGFtcGxlCi1AY2luZGV4IHJlbW90ZSBzdHViLCBleGFtcGxlCi1AY2luZGV4IHN0dWIgZXhhbXBsZSwgcmVtb3RlIGRlYnVnZ2luZwotVGhlIHN0dWIgZmlsZXMgcHJvdmlkZWQgd2l0aCBAdmFsdWV7R0RCTn0gaW1wbGVtZW50IHRoZSB0YXJnZXQgc2lkZSBvZiB0aGUKLWNvbW11bmljYXRpb24gcHJvdG9jb2wsIGFuZCB0aGUgQHZhbHVle0dEQk59IHNpZGUgaXMgaW1wbGVtZW50ZWQgaW4gdGhlCi1AdmFsdWV7R0RCTn0gc291cmNlIGZpbGUgQGZpbGV7cmVtb3RlLmN9LiAgTm9ybWFsbHksIHlvdSBjYW4gc2ltcGx5IGFsbG93Ci10aGVzZSBzdWJyb3V0aW5lcyB0byBjb21tdW5pY2F0ZSwgYW5kIGlnbm9yZSB0aGUgZGV0YWlscy4gIChJZiB5b3UncmUKLWltcGxlbWVudGluZyB5b3VyIG93biBzdHViIGZpbGUsIHlvdSBjYW4gc3RpbGwgaWdub3JlIHRoZSBkZXRhaWxzOiBzdGFydAotd2l0aCBvbmUgb2YgdGhlIGV4aXN0aW5nIHN0dWIgZmlsZXMuICBAZmlsZXtzcGFyYy1zdHViLmN9IGlzIHRoZSBiZXN0Ci1vcmdhbml6ZWQsIGFuZCB0aGVyZWZvcmUgdGhlIGVhc2llc3QgdG8gcmVhZC4pCi0KLUhvd2V2ZXIsIHRoZXJlIG1heSBiZSBvY2Nhc2lvbnMgd2hlbiB5b3UgbmVlZCB0byBrbm93IHNvbWV0aGluZyBhYm91dAotdGhlIHByb3RvY29sLS0tZm9yIGV4YW1wbGUsIGlmIHRoZXJlIGlzIG9ubHkgb25lIHNlcmlhbCBwb3J0IHRvIHlvdXIKLXRhcmdldCBtYWNoaW5lLCB5b3UgbWlnaHQgd2FudCB5b3VyIHByb2dyYW0gdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwgaWYKLWl0IHJlY29nbml6ZXMgYSBwYWNrZXQgbWVhbnQgZm9yIEB2YWx1ZXtHREJOfS4KLQotSW4gdGhlIGV4YW1wbGVzIGJlbG93LCBAc2FtcHs8LX0gYW5kIEBzYW1wey0+fSBhcmUgdXNlZCB0byBpbmRpY2F0ZQotdHJhbnNtaXR0ZWQgYW5kIHJlY2VpdmVkIGRhdGEgcmVzcGVjdGZ1bGx5LgotCi1AY2luZGV4IHByb3RvY29sLCBAdmFsdWV7R0RCTn0gcmVtb3RlIHNlcmlhbAotQGNpbmRleCBzZXJpYWwgcHJvdG9jb2wsIEB2YWx1ZXtHREJOfSByZW1vdGUKLUBjaW5kZXggcmVtb3RlIHNlcmlhbCBwcm90b2NvbAotQWxsIEB2YWx1ZXtHREJOfSBjb21tYW5kcyBhbmQgcmVzcG9uc2VzIChvdGhlciB0aGFuIGFja25vd2xlZGdtZW50cykKLWFyZSBzZW50IGFzIGEgQHZhcntwYWNrZXR9LiAgQSBAdmFye3BhY2tldH0gaXMgaW50cm9kdWNlZCB3aXRoIHRoZQotY2hhcmFjdGVyIEBzYW1weyR9LCB0aGlzIGlzIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIHR3by1kaWdpdAotQHZhcntzZXF1ZW5jZS1pZH0gYW5kIHRoZSBjaGFyYWN0ZXIgQHNhbXB7On0sIHRoZSBhY3R1YWwKLUB2YXJ7cGFja2V0LWRhdGF9LCBhbmQgdGhlIHRlcm1pbmF0aW5nIGNoYXJhY3RlciBAc2FtcHsjfSBmb2xsb3dlZCBieSBhCi10d28tZGlnaXQgQHZhcntjaGVja3N1bX06Ci0KLUBleGFtcGxlCi1AY29kZXskfUB2YXJ7cGFja2V0LWRhdGF9QGNvZGV7I31AdmFye2NoZWNrc3VtfQotQGVuZCBleGFtcGxlCi1Abm9pbmRlbnQKLW9yLCB3aXRoIHRoZSBvcHRpb25hbCBAdmFye3NlcXVlbmNlLWlkfToKLUBleGFtcGxlCi1AY29kZXskfUB2YXJ7c2VxdWVuY2UtaWR9QGNvZGV7On1AdmFye3BhY2tldC1kYXRhfUBjb2RleyN9QHZhcntjaGVja3N1bX0KLUBlbmQgZXhhbXBsZQotCi1AY2luZGV4IGNoZWNrc3VtLCBmb3IgQHZhbHVle0dEQk59IHJlbW90ZQotQG5vaW5kZW50Ci1UaGUgdHdvLWRpZ2l0IEB2YXJ7Y2hlY2tzdW19IGlzIGNvbXB1dGVkIGFzIHRoZSBtb2R1bG8gMjU2IHN1bSBvZiBhbGwKLWNoYXJhY3RlcnMgYmV0d2VlbiB0aGUgbGVhZGluZyBAc2FtcHskfSBhbmQgdGhlIHRyYWlsaW5nIEBzYW1weyN9ICh0aGF0Ci1jb25zaXN0aW5nIG9mIGJvdGggdGhlIG9wdGlvbmFsIEB2YXJ7c2VxdWVuY2UtaWR9QGNvZGV7On0gYW5kIHRoZSBhY3R1YWwKLUB2YXJ7cGFja2V0LWRhdGF9KS4KLQotQGNpbmRleCBzZXF1ZW5jZS1pZCwgZm9yIEB2YWx1ZXtHREJOfSByZW1vdGUKLUBub2luZGVudAotVGhlIHR3by1kaWdpdCBAdmFye3NlcXVlbmNlLWlkfSwgd2hlbiBwcmVzZW50LCBpcyByZXR1cm5lZCB3aXRoIHRoZQotYWNrbm93bGVkZ21lbnQuICBCZXlvbmQgdGhhdCBpdHMgbWVhbmluZyBpcyBwb29ybHkgZGVmaW5lZC4KLUB2YWx1ZXtHREJOfSBpcyBub3Qga25vd24gdG8gb3V0cHV0IEB2YXJ7c2VxdWVuY2UtaWR9cy4KLQotV2hlbiBlaXRoZXIgdGhlIGhvc3Qgb3IgdGhlIHRhcmdldCBtYWNoaW5lIHJlY2VpdmVzIGEgcGFja2V0LCB0aGUgZmlyc3QKLXJlc3BvbnNlIGV4cGVjdGVkIGlzIGFuIGFja25vd2xlZGdtZW50OiBlaXRoZXIgQHNhbXB7K30gKHRvIGluZGljYXRlCi10aGUgcGFja2FnZSB3YXMgcmVjZWl2ZWQgY29ycmVjdGx5KSBvciBAc2FtcHstfSAodG8gcmVxdWVzdAotcmV0cmFuc21pc3Npb24pOgotCi1AZXhhbXBsZQotPC0gQGNvZGV7JH1AdmFye3BhY2tldC1kYXRhfUBjb2RleyN9QHZhcntjaGVja3N1bX0KLS0+IEBjb2Rleyt9Ci1AZW5kIGV4YW1wbGUKLUBub2luZGVudAotSWYgdGhlIHJlY2VpdmVkIHBhY2tldCBpbmNsdWRlZCBhIEB2YXJ7c2VxdWVuY2UtaWR9IHRoYW4gdGhhdCBpcwotYXBwZW5kZWQgdG8gYSBwb3NpdGl2ZSBhY2tub3dsZWRnbWVudDoKLQotQGV4YW1wbGUKLTwtIEBjb2RleyR9QHZhcntzZXF1ZW5jZS1pZH1AY29kZXs6fUB2YXJ7cGFja2V0LWRhdGF9QGNvZGV7I31AdmFye2NoZWNrc3VtfQotLT4gQGNvZGV7K31AdmFye3NlcXVlbmNlLWlkfQotQGVuZCBleGFtcGxlCi0KLVRoZSBob3N0IChAdmFsdWV7R0RCTn0pIHNlbmRzIEB2YXJ7Y29tbWFuZH1zLCBhbmQgdGhlIHRhcmdldCAodGhlCi1kZWJ1Z2dpbmcgc3R1YiBpbmNvcnBvcmF0ZWQgaW4geW91ciBwcm9ncmFtKSBzZW5kcyBhIEB2YXJ7cmVzcG9uc2V9LiAgSW4KLXRoZSBjYXNlIG9mIHN0ZXAgYW5kIGNvbnRpbnVlIEB2YXJ7Y29tbWFuZH1zLCB0aGUgcmVzcG9uc2UgaXMgb25seSBzZW50Ci13aGVuIHRoZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCAodGhlIHRhcmdldCBoYXMgYWdhaW4gc3RvcHBlZCkuCi0KLUB2YXJ7cGFja2V0LWRhdGF9IGNvbnNpc3RzIG9mIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB3aXRoIHRoZQotZXhjZXB0aW9uIG9mIEBzYW1weyN9IGFuZCBAc2FtcHskfSAoc2VlIEBzYW1we1h9IHBhY2tldCBmb3IgYW4KLWV4Y2VwdGlvbikuIEBzYW1wezp9IGNhbiBub3QgYXBwZWFyIGFzIHRoZSB0aGlyZCBjaGFyYWN0ZXIgaW4gYSBwYWNrZXQuCi1GaWVsZHMgd2l0aGluIHRoZSBwYWNrZXQgc2hvdWxkIGJlIHNlcGFyYXRlZCB1c2luZyBAc2FtcHssfSBhbmQgQHNhbXB7O30KLSh1bmZvcnR1bmF0ZWx5IHNvbWUgcGFja2V0cyBjaG9zZSB0byB1c2UgQHNhbXB7On0pLiAgRXhjZXB0IHdoZXJlCi1vdGhlcndpc2Ugbm90ZWQgYWxsIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGluIEhFWCB3aXRoIGxlYWRpbmcgemVyb3MKLXN1cHByZXNzZWQuCi0KLVJlc3BvbnNlIEB2YXJ7ZGF0YX0gY2FuIGJlIHJ1bi1sZW5ndGggZW5jb2RlZCB0byBzYXZlIHNwYWNlLiAgQSBAc2FtcHsqfQotbWVhbnMgdGhhdCB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgYW4gQVNDSUkgZW5jb2RpbmcgZ2l2aW5nIGEgcmVwZWF0IGNvdW50Ci13aGljaCBzdGFuZHMgZm9yIHRoYXQgbWFueSByZXBldGl0aW9ucyBvZiB0aGUgY2hhcmFjdGVyIHByZWNlZGluZyB0aGUKLUBzYW1weyp9LiAgVGhlIGVuY29kaW5nIGlzIEBjb2Rle24rMjl9LCB5aWVsZGluZyBhIHByaW50YWJsZSBjaGFyYWN0ZXIKLXdoZXJlIEBjb2Rle24gPj0zfSAod2hpY2ggaXMgd2hlcmUgcmxlIHN0YXJ0cyB0byB3aW4pLiAgRG9uJ3QgdXNlIGFuCi1AY29kZXtuID4gMTI2fS4KLQotU286Ci1AZXhhbXBsZQotIkBjb2RlezAqIH0iCi1AZW5kIGV4YW1wbGUKLUBub2luZGVudAotbWVhbnMgdGhlIHNhbWUgYXMgIjAwMDAiLgotCi1UaGUgZXJyb3IgcmVzcG9uc2UsIHJldHVybmVkIGZvciBzb21lIHBhY2tldHMgaW5jbHVkZXMgYSB0d28gY2hhcmFjdGVyCi1lcnJvciBudW1iZXIuICBUaGF0IG51bWJlciBpcyBub3Qgd2VsbCBkZWZpbmVkLgotCi1Gb3IgYW55IEB2YXJ7Y29tbWFuZH0gbm90IHN1cHBvcnRlZCBieSB0aGUgc3R1YiwgYW4gZW1wdHkgcmVzcG9uc2UKLShAc2FtcHskIzAwfSkgc2hvdWxkIGJlIHJldHVybmVkLiAgVGhhdCB3YXkgaXQgaXMgcG9zc2libGUgdG8gZXh0ZW5kIHRoZQotcHJvdG9jb2wuICBBIG5ld2VyIEB2YWx1ZXtHREJOfSBjYW4gdGVsbCBpZiBhIHBhY2tldCBpcyBzdXBwb3J0ZWQgYmFzZWQKLW9uIHRoZSByZXNwb25zZS4KLQotQmVsb3cgaXMgYSBjb21wbGV0ZSBsaXN0IG9mIGFsbCBjdXJyZW50bHkgZGVmaW5lZCBAdmFye2NvbW1hbmR9cyBhbmQKLXRoZWlyIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UgQHZhcntkYXRhfToKLQotQG11bHRpdGFibGUgQGNvbHVtbmZyYWN0aW9ucyAuMzAgLjMwIC40MAotQGl0ZW0gUGFja2V0Ci1AdGFiIFJlcXVlc3QKLUB0YWIgRGVzY3JpcHRpb24KLQotQGl0ZW0gZXh0ZW5kZWQgb3BzIEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2RleyF9Ci1AdGFiCi1Vc2UgdGhlIGV4dGVuZGVkIHJlbW90ZSBwcm90b2NvbC4gU3RpY2t5IC0tIG9ubHkgbmVlZHMgdG8gYmUgc2V0IG9uY2UuCi1UaGUgZXh0ZW5kZWQgcmVtb3RlIHByb3RvY29sIHN1cHBvcnQgdGhlIEBzYW1we1J9IHBhY2tldC4KLUBpdGVtCi1AdGFiIHJlcGx5IEBzYW1we30KLUB0YWIKLVN0dWJzIHRoYXQgc3VwcG9ydCB0aGUgZXh0ZW5kZWQgcmVtb3RlIHByb3RvY29sIHJldHVybiBAc2FtcHt9IHdoaWNoLAotdW5mb3J0dW5hdGVseSwgaXMgaWRlbnRpY2FsIHRvIHRoZSByZXNwb25zZSByZXR1cm5lZCBieSBzdHVicyB0aGF0IGRvIG5vdAotc3VwcG9ydCBwcm90b2NvbCBleHRlbnNpb25zLgotCi1AaXRlbSBsYXN0IHNpZ25hbAotQHRhYiBAY29kZXs/fQotQHRhYgotUmVwbHkgdGhlIGN1cnJlbnQgcmVhc29uIGZvciBzdG9wcGluZy4gIFRoaXMgaXMgdGhlIHNhbWUgcmVwbHkgYXMgaXMKLWdlbmVyYXRlZCBmb3Igc3RlcCBvciBjb250IDogQGNvZGV7U31AdmFye0FBfSB3aGVyZSBAdmFye0FBfSBpcyB0aGUKLXNpZ25hbCBudW1iZXIuCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle2F9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSBzZXQgcHJvZ3JhbSBhcmd1bWVudHMgQHN0cm9uZ3socmVzZXJ2ZWQpfSBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXtBfUB2YXJ7YXJnbGVufUBjb2Rleyx9QHZhcnthcmdudW19QGNvZGV7LH1AdmFye2FyZ31AY29kZXssLi4ufQotQHRhYgotSW5pdGlhbGl6ZWQgQHNhbXB7YXJndltdfSBhcnJheSBwYXNzZWQgaW50byBwcm9ncmFtLiBAdmFye2FyZ2xlbn0KLXNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBoZXggZW5jb2RlZCBieXRlIHN0cmVhbSBAdmFye2FyZ30uCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtPS30KLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle0V9QHZhcntOTn0KLQotQGl0ZW0gc2V0IGJhdWQgQHN0cm9uZ3soZGVwcmVjYXRlZCl9Ci1AdGFiIEBjb2Rle2J9QHZhcntiYXVkfQotQHRhYgotQ2hhbmdlIHRoZSBzZXJpYWwgbGluZSBzcGVlZCB0byBAdmFye2JhdWR9LiAgSlRDOiBAZW1waHtXaGVuIGRvZXMgdGhlCi10cmFuc3BvcnQgbGF5ZXIgc3RhdGUgY2hhbmdlPyAgV2hlbiBpdCdzIHJlY2VpdmVkLCBvciBhZnRlciB0aGUgQUNLIGlzCi10cmFuc21pdHRlZC4gIEluIGVpdGhlciBjYXNlLCB0aGVyZSBhcmUgcHJvYmxlbXMgaWYgdGhlIGNvbW1hbmQgb3IgdGhlCi1hY2tub3dsZWRnbWVudCBwYWNrZXQgaXMgZHJvcHBlZC59IFN0YW46IEBlbXBoe0lmIHBlb3BsZSByZWFsbHkgd2FudGVkCi10byBhZGQgc29tZXRoaW5nIGxpa2UgdGhpcywgYW5kIGdldCBpdCB3b3JraW5nIGZvciB0aGUgZmlyc3QgdGltZSwgdGhleQotb3VnaHQgdG8gbW9kaWZ5IHNlci11bml4LmMgdG8gc2VuZCBzb21lIGtpbmQgb2Ygb3V0LW9mLWJhbmQgbWVzc2FnZSB0byBhCi1zcGVjaWFsbHktc2V0dXAgc3R1YiBhbmQgaGF2ZSB0aGUgc3dpdGNoIGhhcHBlbiAiaW4gYmV0d2VlbiIgcGFja2V0cywgc28KLXRoYXQgZnJvbSByZW1vdGUgcHJvdG9jb2wncyBwb2ludCBvZiB2aWV3LCBub3RoaW5nIGFjdHVhbGx5Ci1oYXBwZW5lZC59Ci0KLUBpdGVtIHNldCBicmVha3BvaW50IEBzdHJvbmd7KGRlcHJlY2F0ZWQpfQotQHRhYiBAY29kZXtCfUB2YXJ7YWRkcn0sQHZhcnttb2RlfQotQHRhYgotU2V0IChAdmFye21vZGV9IGlzIEBzYW1we1N9KSBvciBjbGVhciAoQHZhcnttb2RlfSBpcyBAc2FtcHtDfSkgYQotYnJlYWtwb2ludCBhdCBAdmFye2FkZHJ9LiAgQGVtcGh7VGhpcyBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgQHNhbXB7Wn0gYW5kCi1Ac2FtcHt6fSBwYWNrZXRzLn0KLQotQGl0ZW0gY29udGludWUKLUB0YWIgQGNvZGV7Y31AdmFye2FkZHJ9Ci1AdGFiCi1AdmFye2FkZHJ9IGlzIGFkZHJlc3MgdG8gcmVzdW1lLiBJZiBAdmFye2FkZHJ9IGlzIG9taXR0ZWQsIHJlc3VtZSBhdAotY3VycmVudCBhZGRyZXNzLgotQGl0ZW0KLUB0YWIgcmVwbHkKLUB0YWIgc2VlIGJlbG93Ci0KLUBpdGVtIGNvbnRpbnVlIHdpdGggc2lnbmFsIEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle0N9QHZhcntzaWd9QGNvZGV7O31AdmFye2FkZHJ9Ci1AdGFiCi1Db250aW51ZSB3aXRoIHNpZ25hbCBAdmFye3NpZ30gKGhleCBzaWduYWwgbnVtYmVyKS4gIElmCi1AY29kZXs7fUB2YXJ7YWRkcn0gaXMgb21pdHRlZCwgcmVzdW1lIGF0IHNhbWUgYWRkcmVzcy4KLUBpdGVtCi1AdGFiIHJlcGx5Ci1AdGFiIHNlZSBiZWxvdwotCi1AaXRlbSB0b2dnbGUgZGVidWcgQGVtcGh7KG9wdGlvbmFsKX0KLUB0YWIgQGNvZGV7ZH0KLUB0YWIKLXRvZ2dsZSBkZWJ1ZyBmbGFnIChzZWUgMzg2ICYgNjhrIHN0dWJzKQotCi1AaXRlbSBkZXRhY2ggQGVtcGh7KG9wdGlvbmFsKX0KLUB0YWIgQGNvZGV7RH0KLUB0YWIgUmVwbHkgT0suCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle2V9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSByZXNlcnZlZAotQHRhYiBAY29kZXtFfQotQHRhYiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7Zn0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle0Z9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSByZWFkIHJlZ2lzdGVycwotQHRhYiBAY29kZXtnfQotQHRhYiBSZWFkIGdlbmVyYWwgcmVnaXN0ZXJzLgotQGl0ZW0KLUB0YWIgcmVwbHkgQHZhcntYWC4uLn0KLUB0YWIKLUVhY2ggYnl0ZSBvZiByZWdpc3RlciBkYXRhIGlzIGRlc2NyaWJlZCBieSB0d28gaGV4IGRpZ2l0cy4gIFRoZSBieXRlcwotd2l0aCB0aGUgcmVnaXN0ZXIgYXJlIHRyYW5zbWl0dGVkIGluIHRhcmdldCBieXRlIG9yZGVyLiAgVGhlIHNpemUgb2YKLWVhY2ggcmVnaXN0ZXIgYW5kIHRoZWlyIHBvc2l0aW9uIHdpdGhpbiB0aGUgQHNhbXB7Z30gQHZhcntwYWNrZXR9IGlzCi1kZXRlcm1pbmVkIGJ5IHRoZSBAdmFye1JFR0lTVEVSX1JBV19TSVpFfSBhbmQgQHZhcntSRUdJU1RFUl9OQU1FfQotbWFjcm9zLgotQGl0ZW0KLUB0YWIgQGNvZGV7RX1AdmFye05OfQotQHRhYiBmb3IgYW4gZXJyb3IuCi0KLUBpdGVtIHdyaXRlIHJlZ3MKLUB0YWIgQGNvZGV7R31AdmFye1hYLi4ufQotQHRhYgotU2VlIEBzYW1we2d9IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBAdmFye1hYLi4ufSBkYXRhLgotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7T0t9Ci1AdGFiIGZvciBzdWNjZXNzCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtFfUB2YXJ7Tk59Ci1AdGFiIGZvciBhbiBlcnJvcgotCi1AaXRlbSByZXNlcnZlZAotQHRhYiBAY29kZXtofQotQHRhYiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKLQotQGl0ZW0gc2V0IHRocmVhZCBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXtIfUB2YXJ7Y31AdmFye3QuLi59Ci1AdGFiCi1TZXQgdGhyZWFkIGZvciBzdWJzZXF1ZW50IG9wZXJhdGlvbnMuICBAdmFye2N9ID0gQHNhbXB7Y30gZm9yIHRocmVhZAotdXNlZCBpbiBzdGVwIGFuZCBjb250aW51ZTsgQHZhcnt0Li4ufSBjYW4gYmUgLTEgZm9yIGFsbCB0aHJlYWRzLgotQHZhcntjfSA9IEBzYW1we2d9IGZvciB0aHJlYWQgdXNlZCBpbiBvdGhlciBvcGVyYXRpb25zLiAgSWYgemVybywgcGljayBhCi10aHJlYWQsIGFueSB0aHJlYWQuCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtPS30KLUB0YWIgZm9yIHN1Y2Nlc3MKLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle0V9QHZhcntOTn0KLUB0YWIgZm9yIGFuIGVycm9yCi0KLUBpdGVtIGN5Y2xlIHN0ZXAgQHN0cm9uZ3soZHJhZnQpfSBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXtpfUB2YXJ7YWRkcn1AY29kZXssfUB2YXJ7bm5ufQotQHRhYgotU3RlcCB0aGUgcmVtb3RlIHRhcmdldCBieSBhIHNpbmdsZSBjbG9jayBjeWNsZS4gIElmIEBjb2Rleyx9QHZhcntubm59IGlzCi1wcmVzZW50LCBjeWNsZSBzdGVwIEB2YXJ7bm5ufSBjeWNsZXMuICBJZiBAdmFye2FkZHJ9IGlzIHByZXNlbnQsIGN5Y2xlCi1zdGVwIHN0YXJ0aW5nIGF0IHRoYXQgYWRkcmVzcy4KLQotQGl0ZW0gc2lnbmFsIHRoZW4gY3ljbGUgc3RlcCBAc3Ryb25neyhyZXNlcnZlZCl9IEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle0l9Ci1AdGFiCi1TZWUgQHNhbXB7aX0gYW5kIEBzYW1we1N9IGZvciBsaWtlbHkgc3ludGF4IGFuZCBzZW1hbnRpY3MuCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle2p9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle0p9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSBraWxsIHJlcXVlc3QgQGVtcGh7KG9wdGlvbmFsKX0KLUB0YWIgQGNvZGV7a30KLUB0YWIKLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7bH0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle0x9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSByZWFkIG1lbW9yeQotQHRhYiBAY29kZXttfUB2YXJ7YWRkcn1AY29kZXssfUB2YXJ7bGVuZ3RofQotQHRhYgotUmVhZCBAdmFye2xlbmd0aH0gYnl0ZXMgb2YgbWVtb3J5IHN0YXJ0aW5nIGF0IGFkZHJlc3MgQHZhcnthZGRyfS4KLUBpdGVtCi1AdGFiIHJlcGx5IEB2YXJ7WFguLi59Ci1AdGFiCi1AdmFye1hYLi4ufSBpcyBtZW0gY29udGVudHMuIENhbiBiZSBmZXdlciBieXRlcyB0aGFuIHJlcXVlc3RlZCBpZiBhYmxlIHRvCi1yZWFkIG9ubHkgcGFydCBvZiB0aGUgZGF0YS4KLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle0V9QHZhcntOTn0KLUB0YWIgQHZhcntOTn0gaXMgZXJybm8KLQotQGl0ZW0gd3JpdGUgbWVtCi1AdGFiIEBjb2Rle019QHZhcnthZGRyfSxAdmFye2xlbmd0aH1AY29kZXs6fUB2YXJ7WFguLi59Ci1AdGFiCi1Xcml0ZSBAdmFye2xlbmd0aH0gYnl0ZXMgb2YgbWVtb3J5IHN0YXJ0aW5nIGF0IGFkZHJlc3MgQHZhcnthZGRyfS4KLUB2YXJ7WFguLi59IGlzIHRoZSBkYXRhLgotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7T0t9Ci1AdGFiIGZvciBzdWNjZXNzCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtFfUB2YXJ7Tk59Ci1AdGFiCi1mb3IgYW4gZXJyb3IgKHRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgb25seSBwYXJ0IG9mIHRoZSBkYXRhIHdhcwotd3JpdHRlbikuCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle259Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSByZXNlcnZlZAotQHRhYiBAY29kZXtOfQotQHRhYiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7b30KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle099Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSByZWFkIHJlZyBAc3Ryb25neyhyZXNlcnZlZCl9Ci1AdGFiIEBjb2Rle3B9QHZhcntuLi4ufQotQHRhYgotU2VlIHdyaXRlIHJlZ2lzdGVyLgotQGl0ZW0KLUB0YWIgcmV0dXJuIEB2YXJ7ci4uLi59Ci1AdGFiIFRoZSBoZXggZW5jb2RlZCB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuCi0KLUBpdGVtIHdyaXRlIHJlZyBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXtQfUB2YXJ7bi4uLn1AY29kZXs9fUB2YXJ7ci4uLn0KLUB0YWIKLVdyaXRlIHJlZ2lzdGVyIEB2YXJ7bi4uLn0gd2l0aCB2YWx1ZSBAdmFye3IuLi59LCB3aGljaCBjb250YWlucyB0d28gaGV4Ci1kaWdpdHMgZm9yIGVhY2ggYnl0ZSBpbiB0aGUgcmVnaXN0ZXIgKHRhcmdldCBieXRlIG9yZGVyKS4KLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle09LfQotQHRhYiBmb3Igc3VjY2VzcwotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7RX1AdmFye05OfQotQHRhYiBmb3IgYW4gZXJyb3IKLQotQGl0ZW0gZ2VuZXJhbCBxdWVyeSBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXtxfUB2YXJ7cXVlcnl9Ci1AdGFiCi1SZXF1ZXN0IGluZm8gYWJvdXQgQHZhcntxdWVyeX0uIEluIGdlbmVyYWwgQHZhbHVle0dEQk59IEB2YXJ7cXVlcnl9J3MKLWhhdmUgYSBsZWFkaW5nIHVwcGVyIGNhc2UgbGV0dGVyLiAgQ3VzdG9tIHZlbmRvciBxdWVyaWVzIHNob3VsZCB1c2UgYQotbGVhZGluZyBsb3dlciBjYXNlIGxldHRlciBhbmQgYSBjb21wYW55IHByZWZpeCwgZXg6IEBzYW1we3Fmc2YudmFyfS4KLUB2YXJ7cXVlcnl9IG1heSBvcHRpb25hbGx5IGJlIGZvbGxvd2VkIGJ5IGEgQHNhbXB7LH0gb3IgQHNhbXB7O30KLXNlcGFyYXRlZCBsaXN0LiAgU3R1YnMgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZXkgZnVsbHkgbWF0Y2ggYW55Ci1AdmFye3F1ZXJ5fSBuYW1lLgotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7WFguLi59Ci1AdGFiIEhleCBlbmNvZGVkIGRhdGEgZnJvbSBxdWVyeS4gVGhlIHJlcGx5IGNhbiBub3QgYmUgZW1wdHkuCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtFfUB2YXJ7Tk59Ci1AdGFiIGVycm9yIHJlcGx5Ci1AaXRlbQotQHRhYiByZXBseSBAc2FtcHt9Ci1AdGFiIEluZGljYXRpbmcgYW4gdW5yZWNvZ25pemVkIEB2YXJ7cXVlcnl9LgotCi1AaXRlbSBjdXJyZW50IHRocmVhZAotQHRhYiBAY29kZXtxfUBjb2Rle0N9Ci1AdGFiIFJldHVybiB0aGUgY3VycmVudCB0aHJlYWQgaWQuCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtRQ31AdmFye3BpZH0KLUB0YWIKLVdoZXJlIEB2YXJ7cGlkfSBpcyBhIEhFWCBlbmNvZGVkIDE2IGJpdCBwcm9jZXNzIGlkLgotQGl0ZW0KLUB0YWIgcmVwbHkgKgotQHRhYiBBbnkgb3RoZXIgcmVwbHkgaW1wbGllcyB0aGUgb2xkIHBpZC4KLQotQGl0ZW0gY29tcHV0ZSBDUkMgb2YgbWVtb3J5IGJsb2NrCi1AdGFiIEBjb2Rle3F9QGNvZGV7Q1JDOn1AdmFye2FkZHJ9QGNvZGV7LH1AdmFye2xlbmd0aH0KLUB0YWIKLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle0V9QHZhcntOTn0KLUB0YWIgQW4gZXJyb3IgKHN1Y2ggYXMgbWVtb3J5IGZhdWx0KQotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7Q31AdmFye0NSQzMyfQotQHRhYiBBIDMyIGJpdCBjeWNsaWMgcmVkdW5kYW5jeSBjaGVjayBvZiB0aGUgc3BlY2lmaWVkIG1lbW9yeSByZWdpb24uCi0KLUBpdGVtIHF1ZXJ5IEB2YXJ7TElTVH0gb3IgQHZhcnt0aHJlYWRMSVNUfQotQHRhYiBAY29kZXtxfUBjb2Rle0x9QHZhcntzdGFydGZsYWd9QHZhcnt0aHJlYWRjb3VudH1AdmFye25leHR0aHJlYWR9Ci1AdGFiCi1PYnRhaW4gdGhyZWFkIGluZm9ybWF0aW9uIGZyb20gUlRPUy4gIEB2YXJ7c3RhcnRmbGFnfSBpcyBvbmUgaGV4IGRpZ2l0OwotQHZhcnt0aHJlYWRjb3VudH0gaXMgdHdvIGhleCBkaWdpdHM7IGFuZCBAdmFye25leHR0aHJlYWR9IGlzIDE2IGhleAotZGlnaXRzLgotQGl0ZW0KLUB0YWIgcmVwbHkgKgotQHRhYgotU2VlIEBjb2Rle3JlbW90ZS5jOnBhcnNlX3RocmVhZGxpc3RfcmVzcG9uc2UoKX0uCi0KLUBpdGVtIHF1ZXJ5IHNlY3Qgb2ZmcwotQHRhYiBAY29kZXtxfUBjb2Rle09mZnNldHN9Ci1AdGFiIEdldCBzZWN0aW9uIG9mZnNldHMuCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtUZXh0PX1AdmFye3h4eH1AY29kZXs7RGF0YT19QHZhcnt5eXl9QGNvZGV7O0Jzcz19QHZhcnt6enp9Ci0KLUBpdGVtIHRocmVhZCBpbmZvIHJlcXVlc3QKLUB0YWIgQGNvZGV7cX1AY29kZXtQfUB2YXJ7bW9kZX1AdmFye3RocmVhZGlkfQotQHRhYgotUmV0dXJucyBpbmZvcm1hdGlvbiBvbiBAdmFye3RocmVhZGlkfS4gIFdoZXJlOiBAdmFye21vZGV9IGlzIGEgaGV4Ci1lbmNvZGVkIDMyIGJpdCBtb2RlOyBAdmFye3RocmVhZGlkfSBpcyBhIGhleCBlbmNvZGVkIDY0IGJpdCB0aHJlYWQgSUQuCi1AaXRlbQotQHRhYiByZXBseSAqCi1AdGFiCi1TZWUgQGNvZGV7cmVtb3RlLmM6cmVtb3RlX3VucGFja190aHJlYWRfaW5mb19yZXNwb25zZSgpfS4KLQotQGl0ZW0gcmVtb3RlIGNvbW1hbmQKLUB0YWIgQGNvZGV7cX1AY29kZXtSY21kLH1AdmFye0NPTU1BTkR9Ci1AdGFiCi1AdmFye0NPTU1BTkR9IChoZXggZW5jb2RlZCkgaXMgcGFzc2VkIHRvIHRoZSBsb2NhbCBpbnRlcnByZXRlciBmb3IKLWV4ZWN1dGlvbi4gSW52YWxpZCBjb21tYW5kcyBzaG91bGQgYmUgcmVwb3J0ZWQgdXNpbmcgdGhlIG91dHB1dCBzdHJpbmcuCi1CZWZvcmUgdGhlIGZpbmFsIHJlc3VsdCBwYWNrZXQsIHRoZSB0YXJnZXQgbWF5IGFsc28gcmVzcG9uZCB3aXRoIGEKLW51bWJlciBvZiBpbnRlcm1lZGlhdGUgQGNvZGV7T31AdmFye09VVFBVVH0gY29uc29sZSBvdXRwdXQKLXBhY2tldHMuIEBlbXBoe0ltcGxlbWVudG9ycyBzaG91bGQgbm90ZSB0aGF0IHByb3ZpZGluZyBhY2Nlc3MgdG8gYQotc3R1YnMncyBpbnRlcnByZXRlciBtYXkgaGF2ZSBzZWN1cml0eSBpbXBsaWNhdGlvbnN9LgotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7T0t9Ci1AdGFiCi1BIGNvbW1hbmQgcmVzcG9uc2Ugd2l0aCBubyBvdXRwdXQuCi1AaXRlbQotQHRhYiByZXBseSBAdmFye09VVFBVVH0KLUB0YWIKLUEgY29tbWFuZCByZXNwb25zZSB3aXRoIHRoZSBoZXggZW5jb2RlZCBvdXRwdXQgc3RyaW5nIEB2YXJ7T1VUUFVUfS4KLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle0V9QHZhcntOTn0KLUB0YWIKLUluZGljYXRlIGEgYmFkbHkgZm9ybWVkIHJlcXVlc3QuCi0KLUBpdGVtCi1AdGFiIHJlcGx5IEBzYW1we30KLUB0YWIKLVdoZW4gQHNhbXB7cX1Ac2FtcHtSY21kfSBpcyBub3QgcmVjb2duaXplZC4KLQotQGl0ZW0gZ2VuZXJhbCBzZXQgQGVtcGh7KG9wdGlvbmFsKX0KLUB0YWIgQGNvZGV7UX1AdmFye3Zhcn1AY29kZXs9fUB2YXJ7dmFsfQotQHRhYgotU2V0IHZhbHVlIG9mIEB2YXJ7dmFyfSB0byBAdmFye3ZhbH0uICBTZWUgQHNhbXB7cX0gZm9yIGEgZGlzY3Vzc2luZyBvZgotbmFtaW5nIGNvbnZlbnRpb25zLgotCi1AaXRlbSByZXNldCBAZW1waHsob3B0aW9uYWwpfQotQHRhYiByCi1AdGFiIHJlc2V0IC0tIHNlZSBzcGFyYyBzdHViLgotCi1AaXRlbSByZW1vdGUgcmVzdGFydCBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXtSfUB2YXJ7WFh9Ci1AdGFiCi1SZXN0YXJ0IHRoZSByZW1vdGUgc2VydmVyLiBAdmFye1hYfSB3aGlsZSBuZWVkZWQgaGFzIG5vIGNsZWFyCi1kZWZpbml0aW9uLgotCi1AaXRlbSBzdGVwIEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle3N9QHZhcnthZGRyfQotQHRhYgotQHZhcnthZGRyfSBpcyBhZGRyZXNzIHRvIHJlc3VtZS4gIElmIEB2YXJ7YWRkcn0gaXMgb21pdHRlZCwgcmVzdW1lIGF0Ci1zYW1lIGFkZHJlc3MuCi1AaXRlbQotQHRhYiByZXBseQotQHRhYiBzZWUgYmVsb3cKLQotQGl0ZW0gc3RlcCB3aXRoIHNpZ25hbCBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXtTfUB2YXJ7c2lnfUBjb2Rlezt9QHZhcnthZGRyfQotQHRhYgotTGlrZSBAc2FtcHtDfSBidXQgc3RlcCBub3QgY29udGludWUuCi1AaXRlbQotQHRhYiByZXBseQotQHRhYiBzZWUgYmVsb3cKLQotQGl0ZW0gc2VhcmNoIEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle3R9QHZhcnthZGRyfUBjb2Rlezp9QHZhcntQUH1AY29kZXssfUB2YXJ7TU19Ci1AdGFiCi1TZWFyY2ggYmFja3dhcmRzIHN0YXJ0aW5nIGF0IGFkZHJlc3MgQHZhcnthZGRyfSBmb3IgYSBtYXRjaCB3aXRoIHBhdHRlcm4KLUB2YXJ7UFB9IGFuZCBtYXNrIEB2YXJ7TU19LiAgQHZhcntQUH0gYW5kIEB2YXJ7TU19IGFyZSA0Ci1ieXRlcy4gQHZhcnthZGRyfSBtdXN0IGJlIGF0IGxlYXN0IDMgZGlnaXRzLgotCi1AaXRlbSB0aHJlYWQgYWxpdmUgQGVtcGh7KG9wdGlvbmFsKX0KLUB0YWIgQGNvZGV7VH1AdmFye1hYfQotQHRhYiBGaW5kIG91dCBpZiB0aGUgdGhyZWFkIFhYIGlzIGFsaXZlLgotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7T0t9Ci1AdGFiIHRocmVhZCBpcyBzdGlsbCBhbGl2ZQotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7RX1AdmFye05OfQotQHRhYiB0aHJlYWQgaXMgZGVhZAotCQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7dX0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle1V9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSByZXNlcnZlZAotQHRhYiBAY29kZXt2fQotQHRhYiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7Vn0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle3d9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSByZXNlcnZlZAotQHRhYiBAY29kZXtXfQotQHRhYiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKLQotQGl0ZW0gcmVzZXJ2ZWQKLUB0YWIgQGNvZGV7eH0KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBpdGVtIHdyaXRlIG1lbSAoYmluYXJ5KSBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXtYfUB2YXJ7YWRkcn1AY29kZXssfUB2YXJ7bGVuZ3RofUB2YXJ7On1AdmFye1hYLi4ufQotQHRhYgotQHZhcnthZGRyfSBpcyBhZGRyZXNzLCBAdmFye2xlbmd0aH0gaXMgbnVtYmVyIG9mIGJ5dGVzLCBAdmFye1hYLi4ufSBpcwotYmluYXJ5IGRhdGEuCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtPS30KLUB0YWIgZm9yIHN1Y2Nlc3MKLUBpdGVtCi1AdGFiIHJlcGx5IEBjb2Rle0V9QHZhcntOTn0KLUB0YWIgZm9yIGFuIGVycm9yCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIEBjb2Rle3l9Ci1AdGFiIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIAotCi1AaXRlbSByZXNlcnZlZAotQHRhYiBAY29kZXtZfQotQHRhYiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKLQotQGl0ZW0gcmVtb3ZlIGJyZWFrIG9yIHdhdGNocG9pbnQgQHN0cm9uZ3soZHJhZnQpfSBAZW1waHsob3B0aW9uYWwpfQotQHRhYiBAY29kZXt6fUB2YXJ7dH1AY29kZXssfUB2YXJ7YWRkcn1AY29kZXssfUB2YXJ7bGVuZ3RofQotQHRhYgotU2VlIEBzYW1we1p9LgotCi1AaXRlbSBpbnNlcnQgYnJlYWsgb3Igd2F0Y2hwb2ludCBAc3Ryb25neyhkcmFmdCl9IEBlbXBoeyhvcHRpb25hbCl9Ci1AdGFiIEBjb2Rle1p9QHZhcnt0fUBjb2Rleyx9QHZhcnthZGRyfUBjb2Rleyx9QHZhcntsZW5ndGh9Ci1AdGFiCi1AdmFye3R9IGlzIHR5cGU6IEBzYW1wezB9IC0gc29mdHdhcmUgYnJlYWtwb2ludCwgQHNhbXB7MX0gLSBoYXJkd2FyZQotYnJlYWtwb2ludCwgQHNhbXB7Mn0gLSB3cml0ZSB3YXRjaHBvaW50LCBAc2FtcHszfSAtIHJlYWQgd2F0Y2hwb2ludCwKLUBzYW1wezR9IC0gYWNjZXNzIHdhdGNocG9pbnQ7IEB2YXJ7YWRkcn0gaXMgYWRkcmVzczsgQHZhcntsZW5ndGh9IGlzIGluCi1ieXRlcy4gIEZvciBhIHNvZnR3YXJlIGJyZWFrcG9pbnQsIEB2YXJ7bGVuZ3RofSBzcGVjaWZpZXMgdGhlIHNpemUgb2YKLXRoZSBpbnN0cnVjdGlvbiB0byBiZSBwYXRjaGVkLiAgRm9yIGhhcmR3YXJlIGJyZWFrcG9pbnRzIGFuZCB3YXRjaHBvaW50cwotQHZhcntsZW5ndGh9IHNwZWNpZmllcyB0aGUgbWVtb3J5IHJlZ2lvbiB0byBiZSBtb25pdG9yZWQuCi1AaXRlbQotQHRhYiByZXBseSBAY29kZXtFfUB2YXJ7Tk59Ci1AdGFiIGZvciBhbiBlcnJvcgotQGl0ZW0KLUB0YWIgcmVwbHkgQGNvZGV7T0t9Ci1AdGFiIGZvciBzdWNjZXNzCi1AaXRlbQotQHRhYiBAc2FtcHt9Ci1AdGFiIElmIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIHJlc2VydmVkCi1AdGFiIDxvdGhlcj4KLUB0YWIgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgCi0KLUBlbmQgbXVsdGl0YWJsZQotCi1JbiB0aGUgY2FzZSBvZiB0aGUgQHNhbXB7Q30sIEBzYW1we2N9LCBAc2FtcHtTfSBhbmQgQHNhbXB7c30gcGFja2V0cywKLXRoZXJlIGlzIG5vIGltbWVkaWF0ZSByZXNwb25zZS4gIFRoZSByZXBseSwgZGVzY3JpYmVkIGJlbG93LCBjb21lcyB3aGVuCi10aGUgbWFjaGluZSBzdG9wczoKLQotQG11bHRpdGFibGUgQGNvbHVtbmZyYWN0aW9ucyAuNCAuNgotCi1AaXRlbSBAY29kZXtTfUB2YXJ7QUF9Ci1AdGFiIEB2YXJ7QUF9IGlzIHRoZSBzaWduYWwgbnVtYmVyCi0KLUBpdGVtIEBjb2Rle1R9QHZhcntBQX1AdmFye24uLi59QGNvZGV7On1AdmFye3IuLi59QGNvZGV7O31AdmFye24uLi59QGNvZGV7On1AdmFye3IuLi59QGNvZGV7O31AdmFye24uLi59QGNvZGV7On1AdmFye3IuLi59QGNvZGV7O30KLUB0YWIKLUB2YXJ7QUF9ID0gdHdvIGhleCBkaWdpdCBzaWduYWwgbnVtYmVyOyBAdmFye24uLi59ID0gcmVnaXN0ZXIgbnVtYmVyCi0oaGV4KSwgQHZhcntyLi4ufSAgPSB0YXJnZXQgYnl0ZSBvcmRlcmVkIHJlZ2lzdGVyIGNvbnRlbnRzLCBzaXplIGRlZmluZWQKLWJ5IEBjb2Rle1JFR0lTVEVSX1JBV19TSVpFfTsgQHZhcntuLi4ufSA9IEBzYW1we3RocmVhZH0sIEB2YXJ7ci4uLn0gPQotdGhyZWFkIHByb2Nlc3MgSUQsIHRoaXMgaXMgYSBoZXggaW50ZWdlcjsgQHZhcntuLi4ufSA9IG90aGVyIHN0cmluZyBub3QKLXN0YXJ0aW5nIHdpdGggdmFsaWQgaGV4IGRpZ2l0LiBAdmFsdWV7R0RCTn0gc2hvdWxkIGlnbm9yZSB0aGlzCi1AdmFye24uLi59LCBAdmFye3IuLi59IHBhaXIgYW5kIGdvIG9uIHRvIHRoZSBuZXh0LiAgVGhpcyB3YXkgd2UgY2FuCi1leHRlbmQgdGhlIHByb3RvY29sLgotCi1AaXRlbSBAY29kZXtXfUB2YXJ7QUF9Ci1AdGFiCi1UaGUgcHJvY2VzcyBleGl0ZWQsIGFuZCBAdmFye0FBfSBpcyB0aGUgZXhpdCBzdGF0dXMuICBUaGlzIGlzIG9ubHkKLWFwcGxpY2FibGUgZm9yIGNlcnRhaW5zIHNvcnRzIG9mIHRhcmdldHMuCi0KLUBpdGVtIEBjb2Rle1h9QHZhcntBQX0KLUB0YWIKLVRoZSBwcm9jZXNzIHRlcm1pbmF0ZWQgd2l0aCBzaWduYWwgQHZhcntBQX0uCi0KLUBpdGVtIEBjb2Rle059QHZhcntBQX1AY29kZXs7fUB2YXJ7dHR0dHR0dHR9QGNvZGV7O31AdmFye2RkZGRkZGRkfUBjb2Rlezt9QHZhcntiYmJiYmJiYn0gQHN0cm9uZ3sob2Jzb2xldGUpfQotQHRhYgotQHZhcntBQX0gPSBzaWduYWwgbnVtYmVyOyBAdmFye3R0dHR0dHR0fSA9IGFkZHJlc3Mgb2Ygc3ltYm9sICJfc3RhcnQiOwotQHZhcntkZGRkZGRkZH0gPSBiYXNlIG9mIGRhdGEgc2VjdGlvbjsgQHZhcntiYmJiYmJiYn0gPSBiYXNlIG9mIGJzcwotc2VjdGlvbi4gQGVtcGh7Tm90ZTogb25seSB1c2VkIGJ5IENpc2NvIFN5c3RlbXMgdGFyZ2V0cy4gIFRoZSBkaWZmZXJlbmNlCi1iZXR3ZWVuIHRoaXMgcmVwbHkgYW5kIHRoZSAicU9mZnNldHMiIHF1ZXJ5IGlzIHRoYXQgdGhlICdOJyBwYWNrZXQgbWF5Ci1hcnJpdmUgc3BvbnRhbmVvdXNseSB3aGVyZWFzIHRoZSAncU9mZnNldHMnIGlzIGEgcXVlcnkgaW5pdGlhdGVkIGJ5IHRoZQotaG9zdCBkZWJ1Z2dlci59Ci0KLUBpdGVtIEBjb2Rle099QHZhcntYWC4uLn0KLUB0YWIKLUB2YXJ7WFguLi59IGlzIGhleCBlbmNvZGluZyBvZiBBU0NJSSBkYXRhLiBUaGlzIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUKLXdoaWxlIHRoZSBwcm9ncmFtIGlzIHJ1bm5pbmcgYW5kIHRoZSBkZWJ1Z2dlciBzaG91bGQgY29udGludWUgdG8gd2FpdAotZm9yICdXJywgJ1QnLCBldGMuCi0KLUBlbmQgbXVsdGl0YWJsZQotCi1FeGFtcGxlIHNlcXVlbmNlIG9mIGEgdGFyZ2V0IGJlaW5nIHJlLXN0YXJ0ZWQuICBOb3RpY2UgaG93IHRoZSByZXN0YXJ0Ci1kb2VzIG5vdCBnZXQgYW55IGRpcmVjdCBvdXRwdXQ6Ci0KLUBleGFtcGxlCi08LSBAY29kZXtSMDB9Ci0tPiBAY29kZXsrfQotQGVtcGh7dGFyZ2V0IHJlc3RhcnRzfQotPC0gQGNvZGV7P30KLS0+IEBjb2Rleyt9Ci0tPiBAY29kZXtUMDAxOjEyMzQxMjM0MTIzNDEyMzR9Ci08LSBAY29kZXsrfQotQGVuZCBleGFtcGxlCi0KLUV4YW1wbGUgc2VxdWVuY2Ugb2YgYSB0YXJnZXQgYmVpbmcgc3RlcHBlZCBieSBhIHNpbmdsZSBpbnN0cnVjdGlvbjoKLQotQGV4YW1wbGUKLTwtIEBjb2Rle0cxNDQ1Li4ufQotLT4gQGNvZGV7K30KLTwtIEBjb2Rle3N9Ci0tPiBAY29kZXsrfQotQGVtcGh7dGltZSBwYXNzZXN9Ci0tPiBAY29kZXtUMDAxOjEyMzQxMjM0MTIzNDEyMzR9Ci08LSBAY29kZXsrfQotPC0gQGNvZGV7Z30KLS0+IEBjb2Rleyt9Ci0tPiBAY29kZXsxNDU1Li4ufQotPC0gQGNvZGV7K30KLUBlbmQgZXhhbXBsZQotCi1Aa2luZGV4IHNldCByZW1vdGVkZWJ1ZwotQGtpbmRleCBzaG93IHJlbW90ZWRlYnVnCi1AY2luZGV4IHBhY2tldHMsIHJlcG9ydGluZyBvbiBzdGRvdXQKLUBjaW5kZXggc2VyaWFsIGNvbm5lY3Rpb25zLCBkZWJ1Z2dpbmcKLUlmIHlvdSBoYXZlIHRyb3VibGUgd2l0aCB0aGUgc2VyaWFsIGNvbm5lY3Rpb24sIHlvdSBjYW4gdXNlIHRoZSBjb21tYW5kCi1AY29kZXtzZXQgcmVtb3RlZGVidWd9LiAgVGhpcyBtYWtlcyBAdmFsdWV7R0RCTn0gcmVwb3J0IG9uIGFsbCBwYWNrZXRzIHNlbnQKLWJhY2sgYW5kIGZvcnRoIGFjcm9zcyB0aGUgc2VyaWFsIGxpbmUgdG8gdGhlIHJlbW90ZSBtYWNoaW5lLiAgVGhlCi1wYWNrZXQtZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgb24gdGhlIEB2YWx1ZXtHREJOfSBzdGFuZGFyZCBvdXRwdXQKLXN0cmVhbS4gIEBjb2Rle3NldCByZW1vdGVkZWJ1ZyBvZmZ9IHR1cm5zIGl0IG9mZiwgYW5kIEBjb2Rle3Nob3cKLXJlbW90ZWRlYnVnfSBzaG93cyB5b3UgaXRzIGN1cnJlbnQgc3RhdGUuCi0KLUBub2RlIFNlcnZlcgotQHN1YnN1YnNlY3Rpb24gVXNpbmcgdGhlIEBjb2Rle2dkYnNlcnZlcn0gcHJvZ3JhbQotCi1Aa2luZGV4IGdkYnNlcnZlcgotQGNpbmRleCByZW1vdGUgY29ubmVjdGlvbiB3aXRob3V0IHN0dWJzCi1AY29kZXtnZGJzZXJ2ZXJ9IGlzIGEgY29udHJvbCBwcm9ncmFtIGZvciBVbml4LWxpa2Ugc3lzdGVtcywgd2hpY2gKLWFsbG93cyB5b3UgdG8gY29ubmVjdCB5b3VyIHByb2dyYW0gd2l0aCBhIHJlbW90ZSBAdmFsdWV7R0RCTn0gdmlhCi1AY29kZXt0YXJnZXQgcmVtb3RlfS0tLWJ1dCB3aXRob3V0IGxpbmtpbmcgaW4gdGhlIHVzdWFsIGRlYnVnZ2luZyBzdHViLgotCi1AY29kZXtnZGJzZXJ2ZXJ9IGlzIG5vdCBhIGNvbXBsZXRlIHJlcGxhY2VtZW50IGZvciB0aGUgZGVidWdnaW5nIHN0dWJzLAotYmVjYXVzZSBpdCByZXF1aXJlcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBvcGVyYXRpbmctc3lzdGVtIGZhY2lsaXRpZXMKLXRoYXQgQHZhbHVle0dEQk59IGl0c2VsZiBkb2VzLiAgSW4gZmFjdCwgYSBzeXN0ZW0gdGhhdCBjYW4gcnVuCi1AY29kZXtnZGJzZXJ2ZXJ9IHRvIGNvbm5lY3QgdG8gYSByZW1vdGUgQHZhbHVle0dEQk59IGNvdWxkIGFsc28gcnVuCi1AdmFsdWV7R0RCTn0gbG9jYWxseSEgIEBjb2Rle2dkYnNlcnZlcn0gaXMgc29tZXRpbWVzIHVzZWZ1bCBuZXZlcnRoZWxlc3MsCi1iZWNhdXNlIGl0IGlzIGEgbXVjaCBzbWFsbGVyIHByb2dyYW0gdGhhbiBAdmFsdWV7R0RCTn0gaXRzZWxmLiAgSXQgaXMKLWFsc28gZWFzaWVyIHRvIHBvcnQgdGhhbiBhbGwgb2YgQHZhbHVle0dEQk59LCBzbyB5b3UgbWF5IGJlIGFibGUgdG8gZ2V0Ci1zdGFydGVkIG1vcmUgcXVpY2tseSBvbiBhIG5ldyBzeXN0ZW0gYnkgdXNpbmcgQGNvZGV7Z2Ric2VydmVyfS4KLUZpbmFsbHksIGlmIHlvdSBkZXZlbG9wIGNvZGUgZm9yIHJlYWwtdGltZSBzeXN0ZW1zLCB5b3UgbWF5IGZpbmQgdGhhdAotdGhlIHRyYWRlb2ZmcyBpbnZvbHZlZCBpbiByZWFsLXRpbWUgb3BlcmF0aW9uIG1ha2UgaXQgbW9yZSBjb252ZW5pZW50IHRvCi1kbyBhcyBtdWNoIGRldmVsb3BtZW50IHdvcmsgYXMgcG9zc2libGUgb24gYW5vdGhlciBzeXN0ZW0sIGZvciBleGFtcGxlCi1ieSBjcm9zcy1jb21waWxpbmcuICBZb3UgY2FuIHVzZSBAY29kZXtnZGJzZXJ2ZXJ9IHRvIG1ha2UgYSBzaW1pbGFyCi1jaG9pY2UgZm9yIGRlYnVnZ2luZy4KLQotQHZhbHVle0dEQk59IGFuZCBAY29kZXtnZGJzZXJ2ZXJ9IGNvbW11bmljYXRlIHZpYSBlaXRoZXIgYSBzZXJpYWwgbGluZQotb3IgYSBUQ1AgY29ubmVjdGlvbiwgdXNpbmcgdGhlIHN0YW5kYXJkIEB2YWx1ZXtHREJOfSByZW1vdGUgc2VyaWFsCi1wcm90b2NvbC4KLQotQHRhYmxlIEBlbXBoCi1AaXRlbSBPbiB0aGUgdGFyZ2V0IG1hY2hpbmUsCi15b3UgbmVlZCB0byBoYXZlIGEgY29weSBvZiB0aGUgcHJvZ3JhbSB5b3Ugd2FudCB0byBkZWJ1Zy4KLUBjb2Rle2dkYnNlcnZlcn0gZG9lcyBub3QgbmVlZCB5b3VyIHByb2dyYW0ncyBzeW1ib2wgdGFibGUsIHNvIHlvdSBjYW4KLXN0cmlwIHRoZSBwcm9ncmFtIGlmIG5lY2Vzc2FyeSB0byBzYXZlIHNwYWNlLiAgQHZhbHVle0dEQk59IG9uIHRoZSBob3N0Ci1zeXN0ZW0gZG9lcyBhbGwgdGhlIHN5bWJvbCBoYW5kbGluZy4KLQotVG8gdXNlIHRoZSBzZXJ2ZXIsIHlvdSBtdXN0IHRlbGwgaXQgaG93IHRvIGNvbW11bmljYXRlIHdpdGggQHZhbHVle0dEQk59OwotdGhlIG5hbWUgb2YgeW91ciBwcm9ncmFtOyBhbmQgdGhlIGFyZ3VtZW50cyBmb3IgeW91ciBwcm9ncmFtLiAgVGhlCi1zeW50YXggaXM6Ci0KLUBzbWFsbGV4YW1wbGUKLXRhcmdldD4gZ2Ric2VydmVyIEB2YXJ7Y29tbX0gQHZhcntwcm9ncmFtfSBbIEB2YXJ7YXJnc30gQGRvdHN7fSBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AdmFye2NvbW19IGlzIGVpdGhlciBhIGRldmljZSBuYW1lICh0byB1c2UgYSBzZXJpYWwgbGluZSkgb3IgYSBUQ1AKLWhvc3RuYW1lIGFuZCBwb3J0bnVtYmVyLiAgRm9yIGV4YW1wbGUsIHRvIGRlYnVnIEVtYWNzIHdpdGggdGhlIGFyZ3VtZW50Ci1Ac2FtcHtmb28udHh0fSBhbmQgY29tbXVuaWNhdGUgd2l0aCBAdmFsdWV7R0RCTn0gb3ZlciB0aGUgc2VyaWFsIHBvcnQKLUBmaWxley9kZXYvY29tMX06Ci0KLUBzbWFsbGV4YW1wbGUKLXRhcmdldD4gZ2Ric2VydmVyIC9kZXYvY29tMSBlbWFjcyBmb28udHh0Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtnZGJzZXJ2ZXJ9IHdhaXRzIHBhc3NpdmVseSBmb3IgdGhlIGhvc3QgQHZhbHVle0dEQk59IHRvIGNvbW11bmljYXRlCi13aXRoIGl0LgotCi1UbyB1c2UgYSBUQ1AgY29ubmVjdGlvbiBpbnN0ZWFkIG9mIGEgc2VyaWFsIGxpbmU6Ci0KLUBzbWFsbGV4YW1wbGUKLXRhcmdldD4gZ2Ric2VydmVyIGhvc3Q6MjM0NSBlbWFjcyBmb28udHh0Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgb25seSBkaWZmZXJlbmNlIGZyb20gdGhlIHByZXZpb3VzIGV4YW1wbGUgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LAotc3BlY2lmeWluZyB0aGF0IHlvdSBhcmUgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBob3N0IEB2YWx1ZXtHREJOfSB2aWEKLVRDUC4gIFRoZSBAc2FtcHtob3N0OjIzNDV9IGFyZ3VtZW50IG1lYW5zIHRoYXQgQGNvZGV7Z2Ric2VydmVyfSBpcyB0bwotZXhwZWN0IGEgVENQIGNvbm5lY3Rpb24gZnJvbSBtYWNoaW5lIEBzYW1we2hvc3R9IHRvIGxvY2FsIFRDUCBwb3J0IDIzNDUuCi0oQ3VycmVudGx5LCB0aGUgQHNhbXB7aG9zdH0gcGFydCBpcyBpZ25vcmVkLikgIFlvdSBjYW4gY2hvb3NlIGFueSBudW1iZXIKLXlvdSB3YW50IGZvciB0aGUgcG9ydCBudW1iZXIgYXMgbG9uZyBhcyBpdCBkb2VzIG5vdCBjb25mbGljdCB3aXRoIGFueQotVENQIHBvcnRzIGFscmVhZHkgaW4gdXNlIG9uIHRoZSB0YXJnZXQgc3lzdGVtIChmb3IgZXhhbXBsZSwgQGNvZGV7MjN9IGlzCi1yZXNlcnZlZCBmb3IgQGNvZGV7dGVsbmV0fSkuQGZvb3Rub3Rle0lmIHlvdSBjaG9vc2UgYSBwb3J0IG51bWJlciB0aGF0Ci1jb25mbGljdHMgd2l0aCBhbm90aGVyIHNlcnZpY2UsIEBjb2Rle2dkYnNlcnZlcn0gcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UKLWFuZCBleGl0cy59IFlvdSBtdXN0IHVzZSB0aGUgc2FtZSBwb3J0IG51bWJlciB3aXRoIHRoZSBob3N0IEB2YWx1ZXtHREJOfQotQGNvZGV7dGFyZ2V0IHJlbW90ZX0gY29tbWFuZC4KLQotQGl0ZW0gT24gdGhlIEB2YWx1ZXtHREJOfSBob3N0IG1hY2hpbmUsCi15b3UgbmVlZCBhbiB1bnN0cmlwcGVkIGNvcHkgb2YgeW91ciBwcm9ncmFtLCBzaW5jZSBAdmFsdWV7R0RCTn0gbmVlZHMKLXN5bWJvbHMgYW5kIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFN0YXJ0IHVwIEB2YWx1ZXtHREJOfSBhcyB1c3VhbCwKLXVzaW5nIHRoZSBuYW1lIG9mIHRoZSBsb2NhbCBjb3B5IG9mIHlvdXIgcHJvZ3JhbSBhcyB0aGUgZmlyc3QgYXJndW1lbnQuCi0oWW91IG1heSBhbHNvIG5lZWQgdGhlIEB3e0BzYW1wey0tYmF1ZH19IG9wdGlvbiBpZiB0aGUgc2VyaWFsIGxpbmUgaXMKLXJ1bm5pbmcgYXQgYW55dGhpbmcgb3RoZXIgdGhhbiA5NjAwIGJwcy4pICBBZnRlciB0aGF0LCB1c2UgQGNvZGV7dGFyZ2V0Ci1yZW1vdGV9IHRvIGVzdGFibGlzaCBjb21tdW5pY2F0aW9ucyB3aXRoIEBjb2Rle2dkYnNlcnZlcn0uICBJdHMgYXJndW1lbnQKLWlzIGVpdGhlciBhIGRldmljZSBuYW1lICh1c3VhbGx5IGEgc2VyaWFsIGRldmljZSwgbGlrZQotQGZpbGV7L2Rldi90dHlifSksIG9yIGEgVENQIHBvcnQgZGVzY3JpcHRvciBpbiB0aGUgZm9ybQotQGNvZGV7QHZhcntob3N0fTpAdmFye1BPUlR9fS4gIEZvciBleGFtcGxlOgotCi1Ac21hbGxleGFtcGxlCi0oQHZhbHVle0dEQlB9KSB0YXJnZXQgcmVtb3RlIC9kZXYvdHR5YgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1jb21tdW5pY2F0ZXMgd2l0aCB0aGUgc2VydmVyIHZpYSBzZXJpYWwgbGluZSBAZmlsZXsvZGV2L3R0eWJ9LCBhbmQKLQotQHNtYWxsZXhhbXBsZQotKEB2YWx1ZXtHREJQfSkgdGFyZ2V0IHJlbW90ZSB0aGUtdGFyZ2V0OjIzNDUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotY29tbXVuaWNhdGVzIHZpYSBhIFRDUCBjb25uZWN0aW9uIHRvIHBvcnQgMjM0NSBvbiBob3N0IEB3e0BmaWxle3RoZS10YXJnZXR9fS4KLUZvciBUQ1AgY29ubmVjdGlvbnMsIHlvdSBtdXN0IHN0YXJ0IHVwIEBjb2Rle2dkYnNlcnZlcn0gcHJpb3IgdG8gdXNpbmcKLXRoZSBAY29kZXt0YXJnZXQgcmVtb3RlfSBjb21tYW5kLiAgT3RoZXJ3aXNlIHlvdSBtYXkgZ2V0IGFuIGVycm9yIHdob3NlCi10ZXh0IGRlcGVuZHMgb24gdGhlIGhvc3Qgc3lzdGVtLCBidXQgd2hpY2ggdXN1YWxseSBsb29rcyBzb21ldGhpbmcgbGlrZQotQHNhbXB7Q29ubmVjdGlvbiByZWZ1c2VkfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgTmV0V2FyZQotQHN1YnN1YnNlY3Rpb24gVXNpbmcgdGhlIEBjb2Rle2dkYnNlcnZlLm5sbX0gcHJvZ3JhbQotCi1Aa2luZGV4IGdkYnNlcnZlLm5sbQotQGNvZGV7Z2Ric2VydmUubmxtfSBpcyBhIGNvbnRyb2wgcHJvZ3JhbSBmb3IgTmV0V2FyZSBzeXN0ZW1zLCB3aGljaAotYWxsb3dzIHlvdSB0byBjb25uZWN0IHlvdXIgcHJvZ3JhbSB3aXRoIGEgcmVtb3RlIEB2YWx1ZXtHREJOfSB2aWEKLUBjb2Rle3RhcmdldCByZW1vdGV9LgotCi1AdmFsdWV7R0RCTn0gYW5kIEBjb2Rle2dkYnNlcnZlLm5sbX0gY29tbXVuaWNhdGUgdmlhIGEgc2VyaWFsIGxpbmUsCi11c2luZyB0aGUgc3RhbmRhcmQgQHZhbHVle0dEQk59IHJlbW90ZSBzZXJpYWwgcHJvdG9jb2wuCi0KLUB0YWJsZSBAZW1waAotQGl0ZW0gT24gdGhlIHRhcmdldCBtYWNoaW5lLAoteW91IG5lZWQgdG8gaGF2ZSBhIGNvcHkgb2YgdGhlIHByb2dyYW0geW91IHdhbnQgdG8gZGVidWcuCi1AY29kZXtnZGJzZXJ2ZS5ubG19IGRvZXMgbm90IG5lZWQgeW91ciBwcm9ncmFtJ3Mgc3ltYm9sIHRhYmxlLCBzbyB5b3UKLWNhbiBzdHJpcCB0aGUgcHJvZ3JhbSBpZiBuZWNlc3NhcnkgdG8gc2F2ZSBzcGFjZS4gIEB2YWx1ZXtHREJOfSBvbiB0aGUKLWhvc3Qgc3lzdGVtIGRvZXMgYWxsIHRoZSBzeW1ib2wgaGFuZGxpbmcuCi0KLVRvIHVzZSB0aGUgc2VydmVyLCB5b3UgbXVzdCB0ZWxsIGl0IGhvdyB0byBjb21tdW5pY2F0ZSB3aXRoCi1AdmFsdWV7R0RCTn07IHRoZSBuYW1lIG9mIHlvdXIgcHJvZ3JhbTsgYW5kIHRoZSBhcmd1bWVudHMgZm9yIHlvdXIKLXByb2dyYW0uICBUaGUgc3ludGF4IGlzOgotCi1Ac21hbGxleGFtcGxlIAotbG9hZCBnZGJzZXJ2ZSBbIEJPQVJEPUB2YXJ7Ym9hcmR9IF0gWyBQT1JUPUB2YXJ7cG9ydH0gXQotICAgICAgICAgICAgICBbIEJBVUQ9QHZhcntiYXVkfSBdIEB2YXJ7cHJvZ3JhbX0gWyBAdmFye2FyZ3N9IEBkb3Rze30gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQHZhcntib2FyZH0gYW5kIEB2YXJ7cG9ydH0gc3BlY2lmeSB0aGUgc2VyaWFsIGxpbmU7IEB2YXJ7YmF1ZH0gc3BlY2lmaWVzCi10aGUgYmF1ZCByYXRlIHVzZWQgYnkgdGhlIGNvbm5lY3Rpb24uICBAdmFye3BvcnR9IGFuZCBAdmFye25vZGV9IGRlZmF1bHQKLXRvIDAsIEB2YXJ7YmF1ZH0gZGVmYXVsdHMgdG8gOTYwMCBicHMuCi0KLUZvciBleGFtcGxlLCB0byBkZWJ1ZyBFbWFjcyB3aXRoIHRoZSBhcmd1bWVudCBAc2FtcHtmb28udHh0fWFuZAotY29tbXVuaWNhdGUgd2l0aCBAdmFsdWV7R0RCTn0gb3ZlciBzZXJpYWwgcG9ydCBudW1iZXIgMiBvciBib2FyZCAxIAotdXNpbmcgYSAxOTIwMCBicHMgY29ubmVjdGlvbjoKLQotQHNtYWxsZXhhbXBsZQotbG9hZCBnZGJzZXJ2ZSBCT0FSRD0xIFBPUlQ9MiBCQVVEPTE5MjAwIGVtYWNzIGZvby50eHQKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIE9uIHRoZSBAdmFsdWV7R0RCTn0gaG9zdCBtYWNoaW5lLAoteW91IG5lZWQgYW4gdW5zdHJpcHBlZCBjb3B5IG9mIHlvdXIgcHJvZ3JhbSwgc2luY2UgQHZhbHVle0dEQk59IG5lZWRzCi1zeW1ib2xzIGFuZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBTdGFydCB1cCBAdmFsdWV7R0RCTn0gYXMgdXN1YWwsCi11c2luZyB0aGUgbmFtZSBvZiB0aGUgbG9jYWwgY29weSBvZiB5b3VyIHByb2dyYW0gYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgotKFlvdSBtYXkgYWxzbyBuZWVkIHRoZSBAd3tAc2FtcHstLWJhdWR9fSBvcHRpb24gaWYgdGhlIHNlcmlhbCBsaW5lIGlzCi1ydW5uaW5nIGF0IGFueXRoaW5nIG90aGVyIHRoYW4gOTYwMCBicHMuICBBZnRlciB0aGF0LCB1c2UgQGNvZGV7dGFyZ2V0Ci1yZW1vdGV9IHRvIGVzdGFibGlzaCBjb21tdW5pY2F0aW9ucyB3aXRoIEBjb2Rle2dkYnNlcnZlLm5sbX0uICBJdHMKLWFyZ3VtZW50IGlzIGEgZGV2aWNlIG5hbWUgKHVzdWFsbHkgYSBzZXJpYWwgZGV2aWNlLCBsaWtlCi1AZmlsZXsvZGV2L3R0eWJ9KS4gIEZvciBleGFtcGxlOgotCi1Ac21hbGxleGFtcGxlCi0oQHZhbHVle0dEQlB9KSB0YXJnZXQgcmVtb3RlIC9kZXYvdHR5YgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1jb21tdW5pY2F0aW9ucyB3aXRoIHRoZSBzZXJ2ZXIgdmlhIHNlcmlhbCBsaW5lIEBmaWxley9kZXYvdHR5Yn0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIGk5NjAtTmluZHkgUmVtb3RlCi1Ac3Vic2VjdGlvbiBAdmFsdWV7R0RCTn0gd2l0aCBhIHJlbW90ZSBpOTYwIChOaW5keSkKLQotQGNpbmRleCBOaW5keQotQGNpbmRleCBpOTYwCi1AZGZue05pbmR5fSBpcyBhIFJPTSBNb25pdG9yIHByb2dyYW0gZm9yIEludGVsIDk2MCB0YXJnZXQgc3lzdGVtcy4gIFdoZW4KLUB2YWx1ZXtHREJOfSBpcyBjb25maWd1cmVkIHRvIGNvbnRyb2wgYSByZW1vdGUgSW50ZWwgOTYwIHVzaW5nIE5pbmR5LCB5b3UgY2FuCi10ZWxsIEB2YWx1ZXtHREJOfSBob3cgdG8gY29ubmVjdCB0byB0aGUgOTYwIGluIHNldmVyYWwgd2F5czoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRocm91Z2ggY29tbWFuZCBsaW5lIG9wdGlvbnMgc3BlY2lmeWluZyBzZXJpYWwgcG9ydCwgdmVyc2lvbiBvZiB0aGUKLU5pbmR5IHByb3RvY29sLCBhbmQgY29tbXVuaWNhdGlvbnMgc3BlZWQ7Ci0KLUBpdGVtCi1CeSByZXNwb25kaW5nIHRvIGEgcHJvbXB0IG9uIHN0YXJ0dXA7Ci0KLUBpdGVtCi1CeSB1c2luZyB0aGUgQGNvZGV7dGFyZ2V0fSBjb21tYW5kIGF0IGFueSBwb2ludCBkdXJpbmcgeW91ciBAdmFsdWV7R0RCTn0KLXNlc3Npb24uICBAeHJlZntUYXJnZXQgQ29tbWFuZHMsICxDb21tYW5kcyBmb3IgbWFuYWdpbmcgdGFyZ2V0c30uCi0KLUBlbmQgaXRlbWl6ZQotCi1AbWVudQotKiBOaW5keSBTdGFydHVwOjogICAgICAgICAgICAgICBTdGFydHVwIHdpdGggTmluZHkKLSogTmluZHkgT3B0aW9uczo6ICAgICAgICAgICAgICAgT3B0aW9ucyBmb3IgTmluZHkKLSogTmluZHkgUmVzZXQ6OiAgICAgICAgICAgICAgICAgTmluZHkgcmVzZXQgY29tbWFuZAotQGVuZCBtZW51Ci0KLUBub2RlIE5pbmR5IFN0YXJ0dXAKLUBzdWJzdWJzZWN0aW9uIFN0YXJ0dXAgd2l0aCBOaW5keQotCi1JZiB5b3Ugc2ltcGx5IHN0YXJ0IEBjb2Rle0B2YWx1ZXtHREJQfX0gd2l0aG91dCB1c2luZyBhbnkgY29tbWFuZC1saW5lCi1vcHRpb25zLCB5b3UgYXJlIHByb21wdGVkIGZvciB3aGF0IHNlcmlhbCBwb3J0IHRvIHVzZSwgQGVtcGh7YmVmb3JlfSB5b3UKLXJlYWNoIHRoZSBvcmRpbmFyeSBAdmFsdWV7R0RCTn0gcHJvbXB0OgotCi1AZXhhbXBsZQotQXR0YWNoIC9kZXYvdHR5Tk4gLS0gc3BlY2lmeSBOTiwgb3IgInF1aXQiIHRvIHF1aXQ6ICAKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVJlc3BvbmQgdG8gdGhlIHByb21wdCB3aXRoIHdoYXRldmVyIHN1ZmZpeCAoYWZ0ZXIgQHNhbXB7L2Rldi90dHl9KQotaWRlbnRpZmllcyB0aGUgc2VyaWFsIHBvcnQgeW91IHdhbnQgdG8gdXNlLiAgWW91IGNhbiwgaWYgeW91IGNob29zZSwKLXNpbXBseSBzdGFydCB1cCB3aXRoIG5vIE5pbmR5IGNvbm5lY3Rpb24gYnkgcmVzcG9uZGluZyB0byB0aGUgcHJvbXB0Ci13aXRoIGFuIGVtcHR5IGxpbmUuICBJZiB5b3UgZG8gdGhpcyBhbmQgbGF0ZXIgd2lzaCB0byBhdHRhY2ggdG8gTmluZHksCi11c2UgQGNvZGV7dGFyZ2V0fSAoQHB4cmVme1RhcmdldCBDb21tYW5kcywgLENvbW1hbmRzIGZvciBtYW5hZ2luZyB0YXJnZXRzfSkuCi0KLUBub2RlIE5pbmR5IE9wdGlvbnMKLUBzdWJzdWJzZWN0aW9uIE9wdGlvbnMgZm9yIE5pbmR5Ci0KLVRoZXNlIGFyZSB0aGUgc3RhcnR1cCBvcHRpb25zIGZvciBiZWdpbm5pbmcgeW91ciBAdmFsdWV7R0RCTn0gc2Vzc2lvbiB3aXRoIGEKLU5pbmR5LTk2MCBib2FyZCBhdHRhY2hlZDoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtciBAdmFye3BvcnR9Ci1TcGVjaWZ5IHRoZSBzZXJpYWwgcG9ydCBuYW1lIG9mIGEgc2VyaWFsIGludGVyZmFjZSB0byBiZSB1c2VkIHRvIGNvbm5lY3QKLXRvIHRoZSB0YXJnZXQgc3lzdGVtLiAgVGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7R0RCTn0gaXMKLWNvbmZpZ3VyZWQgZm9yIHRoZSBJbnRlbCA5NjAgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gIFlvdSBtYXkgc3BlY2lmeQotQHZhcntwb3J0fSBhcyBhbnkgb2Y6IGEgZnVsbCBwYXRobmFtZSAoZS5nLiBAc2FtcHstciAvZGV2L3R0eWF9KSwgYQotZGV2aWNlIG5hbWUgaW4gQGZpbGV7L2Rldn0gKGUuZy4gQHNhbXB7LXIgdHR5YX0pLCBvciBzaW1wbHkgdGhlIHVuaXF1ZQotc3VmZml4IGZvciBhIHNwZWNpZmljIEBjb2Rle3R0eX0gKGUuZy4gQHNhbXB7LXIgYX0pLgotCi1AaXRlbSAtTwotKEFuIHVwcGVyY2FzZSBsZXR0ZXIgYGBPJycsIG5vdCBhIHplcm8uKSAgU3BlY2lmeSB0aGF0IEB2YWx1ZXtHREJOfSBzaG91bGQgdXNlCi10aGUgYGBvbGQnJyBOaW5keSBtb25pdG9yIHByb3RvY29sIHRvIGNvbm5lY3QgdG8gdGhlIHRhcmdldCBzeXN0ZW0uCi1UaGlzIG9wdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtHREJOfSBpcyBjb25maWd1cmVkIGZvciB0aGUgSW50ZWwgOTYwCi10YXJnZXQgYXJjaGl0ZWN0dXJlLgotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gaWYgeW91IHNwZWNpZnkgQHNhbXB7LU99LCBidXQgYXJlIGFjdHVhbGx5IHRyeWluZyB0bwotY29ubmVjdCB0byBhIHRhcmdldCBzeXN0ZW0gdGhhdCBleHBlY3RzIHRoZSBuZXdlciBwcm90b2NvbCwgdGhlIGNvbm5lY3Rpb24KLWZhaWxzLCBhcHBlYXJpbmcgdG8gYmUgYSBzcGVlZCBtaXNtYXRjaC4gIEB2YWx1ZXtHREJOfSByZXBlYXRlZGx5Ci1hdHRlbXB0cyB0byByZWNvbm5lY3QgYXQgc2V2ZXJhbCBkaWZmZXJlbnQgbGluZSBzcGVlZHMuICBZb3UgY2FuIGFib3J0Ci10aGlzIHByb2Nlc3Mgd2l0aCBhbiBpbnRlcnJ1cHQuCi1AZW5kIHF1b3RhdGlvbgotCi1AaXRlbSAtYnJrCi1TcGVjaWZ5IHRoYXQgQHZhbHVle0dEQk59IHNob3VsZCBmaXJzdCBzZW5kIGEgQGNvZGV7QlJFQUt9IHNpZ25hbCB0byB0aGUgdGFyZ2V0Ci1zeXN0ZW0sIGluIGFuIGF0dGVtcHQgdG8gcmVzZXQgaXQsIGJlZm9yZSBjb25uZWN0aW5nIHRvIGEgTmluZHkgdGFyZ2V0LgotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gTWFueSB0YXJnZXQgc3lzdGVtcyBkbyBub3QgaGF2ZSB0aGUgaGFyZHdhcmUgdGhhdCB0aGlzCi1yZXF1aXJlczsgaXQgb25seSB3b3JrcyB3aXRoIGEgZmV3IGJvYXJkcy4KLUBlbmQgcXVvdGF0aW9uCi1AZW5kIHRhYmxlCi0KLVRoZSBzdGFuZGFyZCBAc2FtcHstYn0gb3B0aW9uIGNvbnRyb2xzIHRoZSBsaW5lIHNwZWVkIHVzZWQgb24gdGhlIHNlcmlhbAotcG9ydC4KLQotQGMgQGdyb3VwCi1Abm9kZSBOaW5keSBSZXNldAotQHN1YnN1YnNlY3Rpb24gTmluZHkgcmVzZXQgY29tbWFuZAotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHJlc2V0Ci1Aa2luZGV4IHJlc2V0Ci1Gb3IgYSBOaW5keSB0YXJnZXQsIHRoaXMgY29tbWFuZCBzZW5kcyBhIGBgYnJlYWsnJyB0byB0aGUgcmVtb3RlIHRhcmdldAotc3lzdGVtOyB0aGlzIGlzIG9ubHkgdXNlZnVsIGlmIHRoZSB0YXJnZXQgaGFzIGJlZW4gZXF1aXBwZWQgd2l0aCBhCi1jaXJjdWl0IHRvIHBlcmZvcm0gYSBoYXJkIHJlc2V0IChvciBzb21lIG90aGVyIGludGVyZXN0aW5nIGFjdGlvbikgd2hlbgotYSBicmVhayBpcyBkZXRlY3RlZC4KLUBlbmQgdGFibGUKLUBjIEBlbmQgZ3JvdXAKLQotQG5vZGUgVURJMjlLIFJlbW90ZQotQHN1YnNlY3Rpb24gVGhlIFVESSBwcm90b2NvbCBmb3IgQU1EMjlLCi0KLUBjaW5kZXggVURJCi1AY2luZGV4IEFNRDI5SyB2aWEgVURJCi1AdmFsdWV7R0RCTn0gc3VwcG9ydHMgQU1EJ3MgVURJIChgYFVuaXZlcnNhbCBEZWJ1Z2dlciBJbnRlcmZhY2UnJykKLXByb3RvY29sIGZvciBkZWJ1Z2dpbmcgdGhlIGEyOWsgcHJvY2Vzc29yIGZhbWlseS4gIFRvIHVzZSB0aGlzCi1jb25maWd1cmF0aW9uIHdpdGggQU1EIHRhcmdldHMgcnVubmluZyB0aGUgTWluaU1PTiBtb25pdG9yLCB5b3UgbmVlZCB0aGUKLXByb2dyYW0gQGNvZGV7TU9OVElQfSwgYXZhaWxhYmxlIGZyb20gQU1EIGF0IG5vIGNoYXJnZS4gIFlvdSBjYW4gYWxzbwotdXNlIEB2YWx1ZXtHREJOfSB3aXRoIHRoZSBVREktY29uZm9ybWFudCBhMjlrIHNpbXVsYXRvciBwcm9ncmFtCi1AY29kZXtJU1NUSVB9LCBhbHNvIGF2YWlsYWJsZSBmcm9tIEFNRC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSB0YXJnZXQgdWRpIEB2YXJ7a2V5d29yZH0KLUBraW5kZXggdWRpCi1TZWxlY3QgdGhlIFVESSBpbnRlcmZhY2UgdG8gYSByZW1vdGUgYTI5ayBib2FyZCBvciBzaW11bGF0b3IsIHdoZXJlCi1AdmFye2tleXdvcmR9IGlzIGFuIGVudHJ5IGluIHRoZSBBTUQgY29uZmlndXJhdGlvbiBmaWxlIEBmaWxle3VkaV9zb2N9LgotVGhpcyBmaWxlIGNvbnRhaW5zIGtleXdvcmQgZW50cmllcyB3aGljaCBzcGVjaWZ5IHBhcmFtZXRlcnMgdXNlZCB0bwotY29ubmVjdCB0byBhMjlrIHRhcmdldHMuICBJZiB0aGUgQGZpbGV7dWRpX3NvY30gZmlsZSBpcyBub3QgaW4geW91cgotd29ya2luZyBkaXJlY3RvcnksIHlvdSBtdXN0IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQHNhbXB7VURJQ09ORn0KLXRvIGl0cyBwYXRobmFtZS4KLUBlbmQgdGFibGUKLQotQG5vZGUgRUIyOUsgUmVtb3RlCi1Ac3Vic2VjdGlvbiBUaGUgRUJNT04gcHJvdG9jb2wgZm9yIEFNRDI5SwotCi1AY2luZGV4IEVCMjlLIGJvYXJkCi1AY2luZGV4IHJ1bm5pbmcgMjlLIHByb2dyYW1zCi0KLUFNRCBkaXN0cmlidXRlcyBhIDI5SyBkZXZlbG9wbWVudCBib2FyZCBtZWFudCB0byBmaXQgaW4gYSBQQywgdG9nZXRoZXIKLXdpdGggYSBET1MtaG9zdGVkIG1vbml0b3IgcHJvZ3JhbSBjYWxsZWQgQGNvZGV7RUJNT059LiAgQXMgYSBzaG9ydGhhbmQKLXRlcm0sIHRoaXMgZGV2ZWxvcG1lbnQgc3lzdGVtIGlzIGNhbGxlZCB0aGUgYGBFQjI5SycnLiAgVG8gdXNlCi1AdmFsdWV7R0RCTn0gZnJvbSBhIFVuaXggc3lzdGVtIHRvIHJ1biBwcm9ncmFtcyBvbiB0aGUgRUIyOUsgYm9hcmQsIHlvdQotbXVzdCBmaXJzdCBjb25uZWN0IGEgc2VyaWFsIGNhYmxlIGJldHdlZW4gdGhlIFBDICh3aGljaCBob3N0cyB0aGUgRUIyOUsKLWJvYXJkKSBhbmQgYSBzZXJpYWwgcG9ydCBvbiB0aGUgVW5peCBzeXN0ZW0uICBJbiB0aGUgZm9sbG93aW5nLCB3ZQotYXNzdW1lIHlvdSd2ZSBob29rZWQgdGhlIGNhYmxlIGJldHdlZW4gdGhlIFBDJ3MgQGZpbGV7Q09NMX0gcG9ydCBhbmQKLUBmaWxley9kZXYvdHR5YX0gb24gdGhlIFVuaXggc3lzdGVtLgotCi1AbWVudQotKiBDb21tcyAoRUIyOUspOjogICAgICAgICAgICAgICBDb21tdW5pY2F0aW9ucyBzZXR1cAotKiBnZGItRUIyOUs6OiAgICAgICAgICAgICAgICAgICBFQjI5SyBjcm9zcy1kZWJ1Z2dpbmcKLSogUmVtb3RlIExvZzo6ICAgICAgICAgICAgICAgICAgUmVtb3RlIGxvZwotQGVuZCBtZW51Ci0KLUBub2RlIENvbW1zIChFQjI5SykKLUBzdWJzdWJzZWN0aW9uIENvbW11bmljYXRpb25zIHNldHVwCi0KLVRoZSBuZXh0IHN0ZXAgaXMgdG8gc2V0IHVwIHRoZSBQQydzIHBvcnQsIGJ5IGRvaW5nIHNvbWV0aGluZyBsaWtlIHRoaXMKLWluIERPUyBvbiB0aGUgUEM6Ci0KLUBleGFtcGxlCi1DOlw+IE1PREUgY29tMTo5NjAwLG4sOCwxLG5vbmUKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoaXMgZXhhbXBsZS0tLXJ1biBvbiBhbiBNUyBET1MgNC4wIHN5c3RlbS0tLXNldHMgdGhlIFBDIHBvcnQgdG8gOTYwMAotYnBzLCBubyBwYXJpdHksIGVpZ2h0IGRhdGEgYml0cywgb25lIHN0b3AgYml0LCBhbmQgbm8gYGByZXRyeScnIGFjdGlvbjsKLXlvdSBtdXN0IG1hdGNoIHRoZSBjb21tdW5pY2F0aW9ucyBwYXJhbWV0ZXJzIHdoZW4gZXN0YWJsaXNoaW5nIHRoZSBVbml4Ci1lbmQgb2YgdGhlIGNvbm5lY3Rpb24gYXMgd2VsbC4KLUBjIEZJWE1FOiBXaG8ga25vd3Mgd2hhdCB0aGlzICJubyByZXRyeSBhY3Rpb24iIGNydWQgZnJvbSB0aGUgRE9TIG1hbnVhbCBtYXkKLUBjICAgICAgIG1lYW4/ICBJdCdzIG9wdGlvbmFsOyBsZWF2ZSBpdCBvdXQ/IC0tLWRvY0BjeWdudXMuY29tLCAyNWZlYjkxIAotCi1UbyBnaXZlIGNvbnRyb2wgb2YgdGhlIFBDIHRvIHRoZSBVbml4IHNpZGUgb2YgdGhlIHNlcmlhbCBsaW5lLCB0eXBlCi10aGUgZm9sbG93aW5nIGF0IHRoZSBET1MgY29uc29sZToKLQotQGV4YW1wbGUKLUM6XD4gQ1RUWSBjb20xCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci0oTGF0ZXIsIGlmIHlvdSB3aXNoIHRvIHJldHVybiBjb250cm9sIHRvIHRoZSBET1MgY29uc29sZSwgeW91IGNhbiB1c2UKLXRoZSBjb21tYW5kIEBjb2Rle0NUVFkgY29ufS0tLWJ1dCB5b3UgbXVzdCBzZW5kIGl0IG92ZXIgdGhlIGRldmljZSB0aGF0Ci1oYWQgY29udHJvbCwgaW4gb3VyIGV4YW1wbGUgb3ZlciB0aGUgQGZpbGV7Q09NMX0gc2VyaWFsIGxpbmUpLgotCi1Gcm9tIHRoZSBVbml4IGhvc3QsIHVzZSBhIGNvbW11bmljYXRpb25zIHByb2dyYW0gc3VjaCBhcyBAY29kZXt0aXB9IG9yCi1AY29kZXtjdX0gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgUEM7IGZvciBleGFtcGxlLAotCi1AZXhhbXBsZQotY3UgLXMgOTYwMCAtbCAvZGV2L3R0eWEKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoZSBAY29kZXtjdX0gb3B0aW9ucyBzaG93biBzcGVjaWZ5LCByZXNwZWN0aXZlbHksIHRoZSBsaW5lc3BlZWQgYW5kIHRoZQotc2VyaWFsIHBvcnQgdG8gdXNlLiAgSWYgeW91IHVzZSBAY29kZXt0aXB9IGluc3RlYWQsIHlvdXIgY29tbWFuZCBsaW5lCi1tYXkgbG9vayBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOgotCi1AZXhhbXBsZQotdGlwIC05NjAwIC9kZXYvdHR5YQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotWW91ciBzeXN0ZW0gbWF5IHJlcXVpcmUgYSBkaWZmZXJlbnQgbmFtZSB3aGVyZSB3ZSBzaG93Ci1AZmlsZXsvZGV2L3R0eWF9IGFzIHRoZSBhcmd1bWVudCB0byBAY29kZXt0aXB9LiAgVGhlIGNvbW11bmljYXRpb25zCi1wYXJhbWV0ZXJzLCBpbmNsdWRpbmcgd2hpY2ggcG9ydCB0byB1c2UsIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCi1AY29kZXt0aXB9IGFyZ3VtZW50IGluIHRoZSBgYHJlbW90ZScnIGRlc2NyaXB0aW9ucyBmaWxlLS0tbm9ybWFsbHkgdGhlCi1zeXN0ZW0gdGFibGUgQGZpbGV7L2V0Yy9yZW1vdGV9LgotQGMgRklYTUU6IFdoYXQgaWYgYW55dGhpbmcgbmVlZHMgZG9pbmcgdG8gbWF0Y2ggdGhlICJuLDgsMSxub25lIiBwYXJ0IG9mCi1AYyB0aGUgRE9TIHNpZGUncyBjb21tcyBzZXR1cD8gIGN1IGNhbiBzdXBwb3J0IC1vIChvZGQKLUBjIHBhcml0eSksIC1lIChldmVuIHBhcml0eSktLS1hcHBhcmVudGx5IG5vIHNldHRpbmdzIGZvciBubyBwYXJpdHkgb3IKLUBjIGZvciBjaGFyYWN0ZXIgc2l6ZS4gIFRha2VuIGZyb20gc3R0eSBtYXliZS4uLj8gIEpvaG4gcG9pbnRzIG91dCB0aXAKLUBjIGNhbiBzZXQgdGhlc2UgYXMgaW50ZXJuYWwgdmFyaWFibGVzLCBlZyB+cyBwYXJpdHk9bm9uZTsgbWFuIHN0dHkKLUBjIHN1Z2dlc3RzIHRoYXQgaXQgKm1pZ2h0KiB3b3JrIHRvIHN0dHkgdGhlc2Ugb3B0aW9ucyB3aXRoIHN0ZGluIG9yCi1AYyBzdGRvdXQgcmVkaXJlY3RlZC4uLiAtLS1kb2NAY3lnbnVzLmNvbSwgMjVmZWI5MQotCi1Aa2luZGV4IEVCTU9OCi1Vc2luZyB0aGUgQGNvZGV7dGlwfSBvciBAY29kZXtjdX0gY29ubmVjdGlvbiwgY2hhbmdlIHRoZSBET1Mgd29ya2luZwotZGlyZWN0b3J5IHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGNvcHkgb2YgeW91ciAyOUsgcHJvZ3JhbSwgdGhlbgotc3RhcnQgdGhlIFBDIHByb2dyYW0gQGNvZGV7RUJNT059IChhbiBFQjI5SyBjb250cm9sIHByb2dyYW0gc3VwcGxpZWQKLXdpdGggeW91ciBib2FyZCBieSBBTUQpLiAgWW91IHNob3VsZCBzZWUgYW4gaW5pdGlhbCBkaXNwbGF5IGZyb20KLUBjb2Rle0VCTU9OfSBzaW1pbGFyIHRvIHRoZSBvbmUgdGhhdCBmb2xsb3dzLCBlbmRpbmcgd2l0aCB0aGUKLUBjb2Rle0VCTU9OfSBwcm9tcHQgQHNhbXB7I30tLS0KLQotQGV4YW1wbGUKLUM6XD4gRzoKLQotRzpcPiBDRCBcdXNyXGpvZVx3b3JrMjlrCi0KLUc6XFVTUlxKT0VcV09SSzI5Sz4gRUJNT04KLUFtMjkwMDAgUEMgQ29wcm9jZXNzb3IgQm9hcmQgTW9uaXRvciwgdmVyc2lvbiAzLjAtMTgKLUNvcHlyaWdodCAxOTkwIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KLVdyaXR0ZW4gYnkgR2liYm9ucyBhbmQgQXNzb2NpYXRlcywgSW5jLgotCi1FbnRlciAnPycgb3IgJ0gnIGZvciBoZWxwCi0KLVBDIENvcHJvY2Vzc29yIFR5cGUgICA9IEVCMjlLCi1JL08gQmFzZSAgICAgICAgICAgICAgPSAweDIwOAotTWVtb3J5IEJhc2UgICAgICAgICAgID0gMHhkMDAwMAotCi1EYXRhIE1lbW9yeSBTaXplICAgICAgPSAyMDQ4S0IKLUF2YWlsYWJsZSBJLVJBTSBSYW5nZSA9IDB4ODAwMCB0byAweDFmZmZmZgotQXZhaWxhYmxlIEQtUkFNIFJhbmdlID0gMHg4MDAwMjAwMCB0byAweDgwMWZmZmZmCi0KLVBhZ2VTaXplICAgICAgICAgICAgICA9IDB4NDAwCi1SZWdpc3RlciBTdGFjayBTaXplICAgPSAweDgwMAotTWVtb3J5IFN0YWNrIFNpemUgICAgID0gMHgxODAwCi0KLUNQVSBQUkwgICAgICAgICAgICAgICA9IDB4MwotQW0yOTAyNyBBdmFpbGFibGUgICAgID0gTm8KLUJ5dGUgV3JpdGUgQXZhaWxhYmxlICA9IFllcwotCi0jIH4uCi1AZW5kIGV4YW1wbGUKLQotVGhlbiBleGl0IHRoZSBAY29kZXtjdX0gb3IgQGNvZGV7dGlwfSBwcm9ncmFtIChkb25lIGluIHRoZSBleGFtcGxlIGJ5Ci10eXBpbmcgQGNvZGV7fi59IGF0IHRoZSBAY29kZXtFQk1PTn0gcHJvbXB0KS4gIEBjb2Rle0VCTU9OfSBrZWVwcwotcnVubmluZywgcmVhZHkgZm9yIEB2YWx1ZXtHREJOfSB0byB0YWtlIG92ZXIuCi0KLUZvciB0aGlzIGV4YW1wbGUsIHdlJ3ZlIGFzc3VtZWQgd2hhdCBpcyBwcm9iYWJseSB0aGUgbW9zdCBjb252ZW5pZW50Ci13YXkgdG8gbWFrZSBzdXJlIHRoZSBzYW1lIDI5SyBwcm9ncmFtIGlzIG9uIGJvdGggdGhlIFBDIGFuZCB0aGUgVW5peAotc3lzdGVtOiBhIFBDL05GUyBjb25uZWN0aW9uIHRoYXQgZXN0YWJsaXNoZXMgYGBkcml2ZSBAY29kZXtHOn0nJyBvbiB0aGUKLVBDIGFzIGEgZmlsZSBzeXN0ZW0gb24gdGhlIFVuaXggaG9zdC4gIElmIHlvdSBkbyBub3QgaGF2ZSBQQy9ORlMgb3IKLXNvbWV0aGluZyBzaW1pbGFyIGNvbm5lY3RpbmcgdGhlIHR3byBzeXN0ZW1zLCB5b3UgbXVzdCBhcnJhbmdlIHNvbWUKLW90aGVyIHdheS0tLXBlcmhhcHMgZmxvcHB5LWRpc2sgdHJhbnNmZXItLS1vZiBnZXR0aW5nIHRoZSAyOUsgcHJvZ3JhbQotZnJvbSB0aGUgVW5peCBzeXN0ZW0gdG8gdGhlIFBDOyBAdmFsdWV7R0RCTn0gZG9lcyBAZW1waHtub3R9IGRvd25sb2FkIGl0IG92ZXIgdGhlCi1zZXJpYWwgbGluZS4KLQotQG5vZGUgZ2RiLUVCMjlLCi1Ac3Vic3Vic2VjdGlvbiBFQjI5SyBjcm9zcy1kZWJ1Z2dpbmcKLQotRmluYWxseSwgQGNvZGV7Y2R9IHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBhbiBpbWFnZSBvZiB5b3VyIDI5SwotcHJvZ3JhbSBvbiB0aGUgVW5peCBzeXN0ZW0sIGFuZCBzdGFydCBAdmFsdWV7R0RCTn0tLS1zcGVjaWZ5aW5nIGFzIGFyZ3VtZW50IHRoZQotbmFtZSBvZiB5b3VyIDI5SyBwcm9ncmFtOgotCi1AZXhhbXBsZQotY2QgL3Vzci9qb2Uvd29yazI5awotQHZhbHVle0dEQlB9IG15Zm9vCi1AZW5kIGV4YW1wbGUKLQotQG5lZWQgNTAwCi1Ob3cgeW91IGNhbiB1c2UgdGhlIEBjb2Rle3RhcmdldH0gY29tbWFuZDoKLQotQGV4YW1wbGUKLXRhcmdldCBhbWQtZWIgL2Rldi90dHlhIDk2MDAgTVlGT08KLUBjIEZJWE1FOiB0ZXN0IGFib3ZlICd0YXJnZXQgYW1kLWViJyBhcyBzcGVsbGVkLCB3aXRoIGNhcHMhICBjYXBzIGFyZSBtZWFudCB0bwotQGMgZW1waGFzaXplIHRoYXQgdGhpcyBpcyB0aGUgbmFtZSBhcyBzZWVuIGJ5IERPUyAoc2luY2UgSSB0aGluayBET1MgaXMKLUBjIHNpbmdsZS1taW5kZWQgYWJvdXQgY2FzZSBvZiBsZXR0ZXJzKS4gIC0tLWRvY0BjeWdudXMuY29tLCAyNWZlYjkxCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1JbiB0aGlzIGV4YW1wbGUsIHdlJ3ZlIGFzc3VtZWQgeW91ciBwcm9ncmFtIGlzIGluIGEgZmlsZSBjYWxsZWQKLUBmaWxle215Zm9vfS4gIE5vdGUgdGhhdCB0aGUgZmlsZW5hbWUgZ2l2ZW4gYXMgdGhlIGxhc3QgYXJndW1lbnQgdG8KLUBjb2Rle3RhcmdldCBhbWQtZWJ9IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSBhcyBpdCBhcHBlYXJzIHRvIERPUy4KLUluIG91ciBleGFtcGxlIHRoaXMgaXMgc2ltcGx5IEBjb2Rle01ZRk9PfSwgYnV0IGluIGdlbmVyYWwgaXQgY2FuIGluY2x1ZGUKLWEgRE9TIHBhdGgsIGFuZCBkZXBlbmRpbmcgb24geW91ciB0cmFuc2ZlciBtZWNoYW5pc20gbWF5IG5vdCByZXNlbWJsZQotdGhlIG5hbWUgb24gdGhlIFVuaXggc2lkZS4KLQotQXQgdGhpcyBwb2ludCwgeW91IGNhbiBzZXQgYW55IGJyZWFrcG9pbnRzIHlvdSB3aXNoOyB3aGVuIHlvdSBhcmUgcmVhZHkKLXRvIHNlZSB5b3VyIHByb2dyYW0gcnVuIG9uIHRoZSAyOUsgYm9hcmQsIHVzZSB0aGUgQHZhbHVle0dEQk59IGNvbW1hbmQKLUBjb2Rle3J1bn0uCi0KLVRvIHN0b3AgZGVidWdnaW5nIHRoZSByZW1vdGUgcHJvZ3JhbSwgdXNlIHRoZSBAdmFsdWV7R0RCTn0gQGNvZGV7ZGV0YWNofQotY29tbWFuZC4KLQotVG8gcmV0dXJuIGNvbnRyb2wgb2YgdGhlIFBDIHRvIGl0cyBjb25zb2xlLCB1c2UgQGNvZGV7dGlwfSBvciBAY29kZXtjdX0KLW9uY2UgYWdhaW4sIGFmdGVyIHlvdXIgQHZhbHVle0dEQk59IHNlc3Npb24gaGFzIGNvbmNsdWRlZCwgdG8gYXR0YWNoIHRvCi1AY29kZXtFQk1PTn0uICBZb3UgY2FuIHRoZW4gdHlwZSB0aGUgY29tbWFuZCBAY29kZXtxfSB0byBzaHV0IGRvd24KLUBjb2Rle0VCTU9OfSwgcmV0dXJuaW5nIGNvbnRyb2wgdG8gdGhlIERPUyBjb21tYW5kLWxpbmUgaW50ZXJwcmV0ZXIuCi1UeXBlIEBjb2Rle0NUVFkgY29ufSB0byByZXR1cm4gY29tbWFuZCBpbnB1dCB0byB0aGUgbWFpbiBET1MgY29uc29sZSwKLWFuZCB0eXBlIEBrYmR7fi59IHRvIGxlYXZlIEBjb2Rle3RpcH0gb3IgQGNvZGV7Y3V9LgotCi1Abm9kZSBSZW1vdGUgTG9nCi1Ac3Vic3Vic2VjdGlvbiBSZW1vdGUgbG9nCi1Aa2luZGV4IGViLmxvZwotQGNpbmRleCBsb2cgZmlsZSBmb3IgRUIyOUsKLQotVGhlIEBjb2Rle3RhcmdldCBhbWQtZWJ9IGNvbW1hbmQgY3JlYXRlcyBhIGZpbGUgQGZpbGV7ZWIubG9nfSBpbiB0aGUKLWN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIHRvIGhlbHAgZGVidWcgcHJvYmxlbXMgd2l0aCB0aGUgY29ubmVjdGlvbi4KLUBmaWxle2ViLmxvZ30gcmVjb3JkcyBhbGwgdGhlIG91dHB1dCBmcm9tIEBjb2Rle0VCTU9OfSwgaW5jbHVkaW5nIGVjaG9lcwotb2YgdGhlIGNvbW1hbmRzIHNlbnQgdG8gaXQuICBSdW5uaW5nIEBzYW1we3RhaWwgLWZ9IG9uIHRoaXMgZmlsZSBpbgotYW5vdGhlciB3aW5kb3cgb2Z0ZW4gaGVscHMgdG8gdW5kZXJzdGFuZCB0cm91YmxlIHdpdGggQGNvZGV7RUJNT059LCBvcgotdW5leHBlY3RlZCBldmVudHMgb24gdGhlIFBDIHNpZGUgb2YgdGhlIGNvbm5lY3Rpb24uCi0KLUBub2RlIFNUMjAwMCBSZW1vdGUKLUBzdWJzZWN0aW9uIEB2YWx1ZXtHREJOfSB3aXRoIGEgVGFuZGVtIFNUMjAwMAotCi1UbyBjb25uZWN0IHlvdXIgU1QyMDAwIHRvIHRoZSBob3N0IHN5c3RlbSwgc2VlIHRoZSBtYW51ZmFjdHVyZXIncwotbWFudWFsLiAgT25jZSB0aGUgU1QyMDAwIGlzIHBoeXNpY2FsbHkgYXR0YWNoZWQsIHlvdSBjYW4gcnVuOgotCi1AZXhhbXBsZQotdGFyZ2V0IHN0MjAwMCBAdmFye2Rldn0gQHZhcntzcGVlZH0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXRvIGVzdGFibGlzaCBpdCBhcyB5b3VyIGRlYnVnZ2luZyBlbnZpcm9ubWVudC4gIEB2YXJ7ZGV2fSBpcyBub3JtYWxseQotdGhlIG5hbWUgb2YgYSBzZXJpYWwgZGV2aWNlLCBzdWNoIGFzIEBmaWxley9kZXYvdHR5YX0sIGNvbm5lY3RlZCB0byB0aGUKLVNUMjAwMCB2aWEgYSBzZXJpYWwgbGluZS4gIFlvdSBjYW4gaW5zdGVhZCBzcGVjaWZ5IEB2YXJ7ZGV2fSBhcyBhIFRDUAotY29ubmVjdGlvbiAoZm9yIGV4YW1wbGUsIHRvIGEgc2VyaWFsIGxpbmUgYXR0YWNoZWQgdmlhIGEgdGVybWluYWwKLWNvbmNlbnRyYXRvcikgdXNpbmcgdGhlIHN5bnRheCBAY29kZXtAdmFye2hvc3RuYW1lfTpAdmFye3BvcnRudW1iZXJ9fS4KLQotVGhlIEBjb2Rle2xvYWR9IGFuZCBAY29kZXthdHRhY2h9IGNvbW1hbmRzIGFyZSBAZW1waHtub3R9IGRlZmluZWQgZm9yCi10aGlzIHRhcmdldDsgeW91IG11c3QgbG9hZCB5b3VyIHByb2dyYW0gaW50byB0aGUgU1QyMDAwIGFzIHlvdSBub3JtYWxseQotd291bGQgZm9yIHN0YW5kYWxvbmUgb3BlcmF0aW9uLiAgQHZhbHVle0dEQk59IHJlYWRzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotKHN1Y2ggYXMgc3ltYm9scykgZnJvbSBhIHNlcGFyYXRlLCBkZWJ1Z2dpbmcgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbQotYXZhaWxhYmxlIG9uIHlvdXIgaG9zdCBjb21wdXRlci4KLUBjIEZJWE1FISEgVGhpcyBpcyB0ZXJyaWJseSB2YWd1ZTsgd2hhdCBsaXR0bGUgY29udGVudCBpcyBoZXJlIGlzCi1AYyBiYXNpY2FsbHkgaGVhcnNheS4KLQotQGNpbmRleCBTVDIwMDAgYXV4aWxpYXJ5IGNvbW1hbmRzCi1UaGVzZSBhdXhpbGlhcnkgQHZhbHVle0dEQk59IGNvbW1hbmRzIGFyZSBhdmFpbGFibGUgdG8gaGVscCB5b3Ugd2l0aCB0aGUgU1QyMDAwCi1lbnZpcm9ubWVudDoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBzdDIwMDAgQHZhcntjb21tYW5kfQotQGtpbmRleCBzdDIwMDAgQHZhcntjbWR9Ci1AY2luZGV4IFNUREJVRyBjb21tYW5kcyAoU1QyMDAwKQotQGNpbmRleCBjb21tYW5kcyB0byBTVERCVUcgKFNUMjAwMCkKLVNlbmQgYSBAdmFye2NvbW1hbmR9IHRvIHRoZSBTVERCVUcgbW9uaXRvci4gIFNlZSB0aGUgbWFudWZhY3R1cmVyJ3MKLW1hbnVhbCBmb3IgYXZhaWxhYmxlIGNvbW1hbmRzLgotCi1AaXRlbSBjb25uZWN0Ci1AY2luZGV4IGNvbm5lY3QgKHRvIFNUREJVRykKLUNvbm5lY3QgdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsIHRvIHRoZSBTVERCVUcgY29tbWFuZCBtb25pdG9yLiAgV2hlbgoteW91IGFyZSBkb25lIGludGVyYWN0aW5nIHdpdGggU1REQlVHLCB0eXBpbmcgZWl0aGVyIG9mIHR3byBjaGFyYWN0ZXIKLXNlcXVlbmNlcyBnZXRzIHlvdSBiYWNrIHRvIHRoZSBAdmFsdWV7R0RCTn0gY29tbWFuZCBwcm9tcHQ6Ci1Aa2Jke0BrZXl7UkVUfX4ufSAoUmV0dXJuLCBmb2xsb3dlZCBieSB0aWxkZSBhbmQgcGVyaW9kKSBvcgotQGtiZHtAa2V5e1JFVH1+QGtleXtDLWR9fSAoUmV0dXJuLCBmb2xsb3dlZCBieSB0aWxkZSBhbmQgY29udHJvbC1EKS4KLUBlbmQgdGFibGUKLQotQG5vZGUgVnhXb3JrcyBSZW1vdGUKLUBzdWJzZWN0aW9uIEB2YWx1ZXtHREJOfSBhbmQgVnhXb3JrcwotCi1AY2luZGV4IFZ4V29ya3MKLQotQHZhbHVle0dEQk59IGVuYWJsZXMgZGV2ZWxvcGVycyB0byBzcGF3biBhbmQgZGVidWcgdGFza3MgcnVubmluZyBvbiBuZXR3b3JrZWQKLVZ4V29ya3MgdGFyZ2V0cyBmcm9tIGEgVW5peCBob3N0LiAgQWxyZWFkeS1ydW5uaW5nIHRhc2tzIHNwYXduZWQgZnJvbQotdGhlIFZ4V29ya3Mgc2hlbGwgY2FuIGFsc28gYmUgZGVidWdnZWQuICBAdmFsdWV7R0RCTn0gdXNlcyBjb2RlIHRoYXQgcnVucyBvbgotYm90aCB0aGUgVW5peCBob3N0IGFuZCBvbiB0aGUgVnhXb3JrcyB0YXJnZXQuICBUaGUgcHJvZ3JhbQotQGNvZGV7Z2RifSBpcyBpbnN0YWxsZWQgYW5kIGV4ZWN1dGVkIG9uIHRoZSBVbml4IGhvc3QuICAoSXQgbWF5IGJlCi1pbnN0YWxsZWQgd2l0aCB0aGUgbmFtZSBAY29kZXt2eGdkYn0sIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gYQotQHZhbHVle0dEQk59IGZvciBkZWJ1Z2dpbmcgcHJvZ3JhbXMgb24gdGhlIGhvc3QgaXRzZWxmLikKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBWeFdvcmtzLXRpbWVvdXQgQHZhcnthcmdzfQotQGtpbmRleCB2eHdvcmtzLXRpbWVvdXQKLUFsbCBWeFdvcmtzLWJhc2VkIHRhcmdldHMgbm93IHN1cHBvcnQgdGhlIG9wdGlvbiBAY29kZXt2eHdvcmtzLXRpbWVvdXR9LiAgCi1UaGlzIG9wdGlvbiBpcyBzZXQgYnkgdGhlIHVzZXIsIGFuZCAgQHZhcnthcmdzfSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgCi1zZWNvbmRzIEB2YWx1ZXtHREJOfSB3YWl0cyBmb3IgcmVzcG9uc2VzIHRvIHJwYydzLiAgWW91IG1pZ2h0IHVzZSB0aGlzIGlmIAoteW91ciBWeFdvcmtzIHRhcmdldCBpcyBhIHNsb3cgc29mdHdhcmUgc2ltdWxhdG9yIG9yIGlzIG9uIHRoZSBmYXIgc2lkZSAKLW9mIGEgdGhpbiBuZXR3b3JrIGxpbmUuCi1AZW5kIHRhYmxlCi0KLVRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gb24gY29ubmVjdGluZyB0byBWeFdvcmtzIHdhcyBjdXJyZW50IHdoZW4KLXRoaXMgbWFudWFsIHdhcyBwcm9kdWNlZDsgbmV3ZXIgcmVsZWFzZXMgb2YgVnhXb3JrcyBtYXkgdXNlIHJldmlzZWQKLXByb2NlZHVyZXMuCi0KLUBraW5kZXggSU5DTFVERV9SREIKLVRvIHVzZSBAdmFsdWV7R0RCTn0gd2l0aCBWeFdvcmtzLCB5b3UgbXVzdCByZWJ1aWxkIHlvdXIgVnhXb3JrcyBrZXJuZWwKLXRvIGluY2x1ZGUgdGhlIHJlbW90ZSBkZWJ1Z2dpbmcgaW50ZXJmYWNlIHJvdXRpbmVzIGluIHRoZSBWeFdvcmtzCi1saWJyYXJ5IEBmaWxle3JkYi5hfS4gIFRvIGRvIHRoaXMsIGRlZmluZSBAY29kZXtJTkNMVURFX1JEQn0gaW4gdGhlCi1WeFdvcmtzIGNvbmZpZ3VyYXRpb24gZmlsZSBAZmlsZXtjb25maWdBbGwuaH0gYW5kIHJlYnVpbGQgeW91ciBWeFdvcmtzCi1rZXJuZWwuICBUaGUgcmVzdWx0aW5nIGtlcm5lbCBjb250YWlucyBAZmlsZXtyZGIuYX0sIGFuZCBzcGF3bnMgdGhlCi1zb3VyY2UgZGVidWdnaW5nIHRhc2sgQGNvZGV7dFJkYlRhc2t9IHdoZW4gVnhXb3JrcyBpcyBib290ZWQuICBGb3IgbW9yZQotaW5mb3JtYXRpb24gb24gY29uZmlndXJpbmcgYW5kIHJlbWFraW5nIFZ4V29ya3MsIHNlZSB0aGUgbWFudWZhY3R1cmVyJ3MKLW1hbnVhbC4KLUBjIFZ4V29ya3MsIHNlZSB0aGUgQGNpdGV7VnhXb3JrcyBQcm9ncmFtbWVyJ3MgR3VpZGV9LgotCi1PbmNlIHlvdSBoYXZlIGluY2x1ZGVkIEBmaWxle3JkYi5hfSBpbiB5b3VyIFZ4V29ya3Mgc3lzdGVtIGltYWdlIGFuZCBzZXQKLXlvdXIgVW5peCBleGVjdXRpb24gc2VhcmNoIHBhdGggdG8gZmluZCBAdmFsdWV7R0RCTn0sIHlvdSBhcmUgcmVhZHkgdG8KLXJ1biBAdmFsdWV7R0RCTn0uICBGcm9tIHlvdXIgVW5peCBob3N0LCBydW4gQGNvZGV7Z2RifSAob3IgQGNvZGV7dnhnZGJ9LAotZGVwZW5kaW5nIG9uIHlvdXIgaW5zdGFsbGF0aW9uKS4KLQotQHZhbHVle0dEQk59IGNvbWVzIHVwIHNob3dpbmcgdGhlIHByb21wdDoKLQotQGV4YW1wbGUKLSh2eGdkYikKLUBlbmQgZXhhbXBsZQotCi1AbWVudQotKiBWeFdvcmtzIENvbm5lY3Rpb246OiAgICAgICAgICBDb25uZWN0aW5nIHRvIFZ4V29ya3MKLSogVnhXb3JrcyBEb3dubG9hZDo6ICAgICAgICAgICAgVnhXb3JrcyBkb3dubG9hZAotKiBWeFdvcmtzIEF0dGFjaDo6ICAgICAgICAgICAgICBSdW5uaW5nIHRhc2tzCi1AZW5kIG1lbnUKLQotQG5vZGUgVnhXb3JrcyBDb25uZWN0aW9uCi1Ac3Vic3Vic2VjdGlvbiBDb25uZWN0aW5nIHRvIFZ4V29ya3MKLQotVGhlIEB2YWx1ZXtHREJOfSBjb21tYW5kIEBjb2Rle3RhcmdldH0gbGV0cyB5b3UgY29ubmVjdCB0byBhIFZ4V29ya3MgdGFyZ2V0IG9uIHRoZQotbmV0d29yay4gIFRvIGNvbm5lY3QgdG8gYSB0YXJnZXQgd2hvc2UgaG9zdCBuYW1lIGlzIGBgQGNvZGV7dHR9JycsIHR5cGU6Ci0KLUBleGFtcGxlCi0odnhnZGIpIHRhcmdldCB2eHdvcmtzIHR0Ci1AZW5kIGV4YW1wbGUKLQotQG5lZWQgNzUwCi1AdmFsdWV7R0RCTn0gZGlzcGxheXMgbWVzc2FnZXMgbGlrZSB0aGVzZToKLQotQHNtYWxsZXhhbXBsZQotQXR0YWNoaW5nIHJlbW90ZSBtYWNoaW5lIGFjcm9zcyBuZXQuLi4gCi1Db25uZWN0ZWQgdG8gdHQuCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AbmVlZCAxMDAwCi1AdmFsdWV7R0RCTn0gdGhlbiBhdHRlbXB0cyB0byByZWFkIHRoZSBzeW1ib2wgdGFibGVzIG9mIGFueSBvYmplY3QgbW9kdWxlcwotbG9hZGVkIGludG8gdGhlIFZ4V29ya3MgdGFyZ2V0IHNpbmNlIGl0IHdhcyBsYXN0IGJvb3RlZC4gIEB2YWx1ZXtHREJOfSBsb2NhdGVzCi10aGVzZSBmaWxlcyBieSBzZWFyY2hpbmcgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiB0aGUgY29tbWFuZCBzZWFyY2gKLXBhdGggKEBweHJlZntFbnZpcm9ubWVudCwgLFlvdXIgcHJvZ3JhbSdzIGVudmlyb25tZW50fSk7IGlmIGl0IGZhaWxzCi10byBmaW5kIGFuIG9iamVjdCBmaWxlLCBpdCBkaXNwbGF5cyBhIG1lc3NhZ2Ugc3VjaCBhczoKLQotQGV4YW1wbGUKLXByb2cubzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeS4KLUBlbmQgZXhhbXBsZQotCi1XaGVuIHRoaXMgaGFwcGVucywgYWRkIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgdG8gdGhlIHNlYXJjaCBwYXRoIHdpdGgKLXRoZSBAdmFsdWV7R0RCTn0gY29tbWFuZCBAY29kZXtwYXRofSwgYW5kIGV4ZWN1dGUgdGhlIEBjb2Rle3RhcmdldH0KLWNvbW1hbmQgYWdhaW4uCi0KLUBub2RlIFZ4V29ya3MgRG93bmxvYWQKLUBzdWJzdWJzZWN0aW9uIFZ4V29ya3MgZG93bmxvYWQKLQotQGNpbmRleCBkb3dubG9hZCB0byBWeFdvcmtzCi1JZiB5b3UgaGF2ZSBjb25uZWN0ZWQgdG8gdGhlIFZ4V29ya3MgdGFyZ2V0IGFuZCB5b3Ugd2FudCB0byBkZWJ1ZyBhbgotb2JqZWN0IHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBsb2FkZWQsIHlvdSBjYW4gdXNlIHRoZSBAdmFsdWV7R0RCTn0KLUBjb2Rle2xvYWR9IGNvbW1hbmQgdG8gZG93bmxvYWQgYSBmaWxlIGZyb20gVW5peCB0byBWeFdvcmtzCi1pbmNyZW1lbnRhbGx5LiAgVGhlIG9iamVjdCBmaWxlIGdpdmVuIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBAY29kZXtsb2FkfQotY29tbWFuZCBpcyBhY3R1YWxseSBvcGVuZWQgdHdpY2U6IGZpcnN0IGJ5IHRoZSBWeFdvcmtzIHRhcmdldCBpbiBvcmRlcgotdG8gZG93bmxvYWQgdGhlIGNvZGUsIHRoZW4gYnkgQHZhbHVle0dEQk59IGluIG9yZGVyIHRvIHJlYWQgdGhlIHN5bWJvbAotdGFibGUuICBUaGlzIGNhbiBsZWFkIHRvIHByb2JsZW1zIGlmIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3JpZXMgb24KLXRoZSB0d28gc3lzdGVtcyBkaWZmZXIuICBJZiBib3RoIHN5c3RlbXMgaGF2ZSBORlMgbW91bnRlZCB0aGUgc2FtZQotZmlsZXN5c3RlbXMsIHlvdSBjYW4gYXZvaWQgdGhlc2UgcHJvYmxlbXMgYnkgdXNpbmcgYWJzb2x1dGUgcGF0aHMuCi1PdGhlcndpc2UsIGl0IGlzIHNpbXBsZXN0IHRvIHNldCB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb24gYm90aCBzeXN0ZW1zCi10byB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBvYmplY3QgZmlsZSByZXNpZGVzLCBhbmQgdGhlbiB0byByZWZlcmVuY2UKLXRoZSBmaWxlIGJ5IGl0cyBuYW1lLCB3aXRob3V0IGFueSBwYXRoLiAgRm9yIGluc3RhbmNlLCBhIHByb2dyYW0KLUBmaWxle3Byb2cub30gbWF5IHJlc2lkZSBpbiBAZmlsZXtAdmFye3Z4cGF0aH0vdncvZGVtby9yZGJ9IGluIFZ4V29ya3MKLWFuZCBpbiBAZmlsZXtAdmFye2hvc3RwYXRofS92dy9kZW1vL3JkYn0gb24gdGhlIGhvc3QuICBUbyBsb2FkIHRoaXMKLXByb2dyYW0sIHR5cGUgdGhpcyBvbiBWeFdvcmtzOgotCi1AZXhhbXBsZQotLT4gY2QgIkB2YXJ7dnhwYXRofS92dy9kZW1vL3JkYiIKLUBlbmQgZXhhbXBsZQotdgotVGhlbiwgaW4gQHZhbHVle0dEQk59LCB0eXBlOgotCi1AZXhhbXBsZQotKHZ4Z2RiKSBjZCBAdmFye2hvc3RwYXRofS92dy9kZW1vL3JkYiAKLSh2eGdkYikgbG9hZCBwcm9nLm8KLUBlbmQgZXhhbXBsZQotCi1AdmFsdWV7R0RCTn0gZGlzcGxheXMgYSByZXNwb25zZSBzaW1pbGFyIHRvIHRoaXM6Ci0KLUBzbWFsbGV4YW1wbGUKLVJlYWRpbmcgc3ltYm9sIGRhdGEgZnJvbSB3aGVyZXZlci92dy9kZW1vL3JkYi9wcm9nLm8uLi4gZG9uZS4KLUBlbmQgc21hbGxleGFtcGxlCi0KLVlvdSBjYW4gYWxzbyB1c2UgdGhlIEBjb2Rle2xvYWR9IGNvbW1hbmQgdG8gcmVsb2FkIGFuIG9iamVjdCBtb2R1bGUKLWFmdGVyIGVkaXRpbmcgYW5kIHJlY29tcGlsaW5nIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlLiAgTm90ZSB0aGF0Ci10aGlzIG1ha2VzIEB2YWx1ZXtHREJOfSBkZWxldGUgYWxsIGN1cnJlbnRseS1kZWZpbmVkIGJyZWFrcG9pbnRzLAotYXV0by1kaXNwbGF5cywgYW5kIGNvbnZlbmllbmNlIHZhcmlhYmxlcywgYW5kIHRvIGNsZWFyIHRoZSB2YWx1ZQotaGlzdG9yeS4gIChUaGlzIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgaW50ZWdyaXR5IG9mCi1kZWJ1Z2dlciBkYXRhIHN0cnVjdHVyZXMgdGhhdCByZWZlcmVuY2UgdGhlIHRhcmdldCBzeXN0ZW0ncyBzeW1ib2wKLXRhYmxlLikKLQotQG5vZGUgVnhXb3JrcyBBdHRhY2gKLUBzdWJzdWJzZWN0aW9uIFJ1bm5pbmcgdGFza3MKLQotQGNpbmRleCBydW5uaW5nIFZ4V29ya3MgdGFza3MKLVlvdSBjYW4gYWxzbyBhdHRhY2ggdG8gYW4gZXhpc3RpbmcgdGFzayB1c2luZyB0aGUgQGNvZGV7YXR0YWNofSBjb21tYW5kIGFzCi1mb2xsb3dzOgotCi1AZXhhbXBsZQotKHZ4Z2RiKSBhdHRhY2ggQHZhcnt0YXNrfQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd2hlcmUgQHZhcnt0YXNrfSBpcyB0aGUgVnhXb3JrcyBoZXhhZGVjaW1hbCB0YXNrIElELiAgVGhlIHRhc2sgY2FuIGJlIHJ1bm5pbmcKLW9yIHN1c3BlbmRlZCB3aGVuIHlvdSBhdHRhY2ggdG8gaXQuICBSdW5uaW5nIHRhc2tzIGFyZSBzdXNwZW5kZWQgYXQKLXRoZSB0aW1lIG9mIGF0dGFjaG1lbnQuCi0KLUBub2RlIFNwYXJjbGV0IFJlbW90ZQotQHN1YnNlY3Rpb24gQHZhbHVle0dEQk59IGFuZCBTcGFyY2xldAotQGNpbmRleCBTcGFyY2xldAotCi1AdmFsdWV7R0RCTn0gZW5hYmxlcyBkZXZlbG9wZXJzIHRvIGRlYnVnIHRhc2tzIHJ1bm5pbmcgb24gCi1TcGFyY2xldCB0YXJnZXRzIGZyb20gYSBVbml4IGhvc3QuICAKLUB2YWx1ZXtHREJOfSB1c2VzIGNvZGUgdGhhdCBydW5zIG9uCi1ib3RoIHRoZSBVbml4IGhvc3QgYW5kIG9uIHRoZSBTcGFyY2xldCB0YXJnZXQuICBUaGUgcHJvZ3JhbQotQGNvZGV7Z2RifSBpcyBpbnN0YWxsZWQgYW5kIGV4ZWN1dGVkIG9uIHRoZSBVbml4IGhvc3QuICAKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSB0aW1lb3V0IEB2YXJ7YXJnc30KLUBraW5kZXggcmVtb3RldGltZW91dAotQHZhbHVle0dEQk59IG5vdyBzdXBwb3J0cyB0aGUgb3B0aW9uIEBjb2Rle3JlbW90ZXRpbWVvdXR9LiAgCi1UaGlzIG9wdGlvbiBpcyBzZXQgYnkgdGhlIHVzZXIsIGFuZCAgQHZhcnthcmdzfSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgCi1zZWNvbmRzIEB2YWx1ZXtHREJOfSB3YWl0cyBmb3IgcmVzcG9uc2VzLiAgCi1AZW5kIHRhYmxlCi0KLUBraW5kZXggQ29tcGlsaW5nCi1XaGVuIGNvbXBpbGluZyBmb3IgZGVidWdnaW5nLCBpbmNsdWRlIHRoZSBvcHRpb25zICItZyIgdG8gZ2V0IGRlYnVnIAotaW5mb3JtYXRpb24gYW5kICItVHRleHQiIHRvIHJlbG9jYXRlIHRoZSBwcm9ncmFtIHRvIHdoZXJlIHlvdSB3aXNoIHRvCi1sb2FkIGl0IG9uIHRoZSB0YXJnZXQuICBZb3UgbWF5IGFsc28gd2FudCB0byBhZGQgdGhlIG9wdGlvbnMgIi1uIiBvciAKLSItTiIgaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBzZWN0aW9ucy4KLQotQGV4YW1wbGUKLXNwYXJjbGV0LWFvdXQtZ2NjIHByb2cuYyAtVHRleHQgMHgxMjAxMDAwMCAtZyAtbyBwcm9nIC1OCi1AZW5kIGV4YW1wbGUKLQotWW91IGNhbiB1c2Ugb2JqZHVtcCB0byB2ZXJpZnkgdGhhdCB0aGUgYWRkcmVzc2VzIGFyZSB3aGF0IHlvdSBpbnRlbmRlZC4KLQotQGV4YW1wbGUKLXNwYXJjbGV0LWFvdXQtb2JqZHVtcCAtLWhlYWRlcnMgLS1zeW1zIHByb2cKLUBlbmQgZXhhbXBsZQotCi1Aa2luZGV4IFJ1bm5pbmcKLU9uY2UgeW91IGhhdmUgc2V0Ci15b3VyIFVuaXggZXhlY3V0aW9uIHNlYXJjaCBwYXRoIHRvIGZpbmQgQHZhbHVle0dEQk59LCB5b3UgYXJlIHJlYWR5IHRvCi1ydW4gQHZhbHVle0dEQk59LiAgRnJvbSB5b3VyIFVuaXggaG9zdCwgcnVuIEBjb2Rle2dkYn0gCi0ob3IgQGNvZGV7c3BhcmNsZXQtYW91dC1nZGJ9LCBkZXBlbmRpbmcgb24geW91ciBpbnN0YWxsYXRpb24pLgotCi1AdmFsdWV7R0RCTn0gY29tZXMgdXAgc2hvd2luZyB0aGUgcHJvbXB0OgotCi1AZXhhbXBsZQotKGdkYnNsZXQpCi1AZW5kIGV4YW1wbGUKLQotQG1lbnUKLSogU3BhcmNsZXQgRmlsZTo6ICAgICAgICAgICAgICAgIFNldHRpbmcgdGhlIGZpbGUgdG8gZGVidWcKLSogU3BhcmNsZXQgQ29ubmVjdGlvbjo6ICAgICAgICAgIENvbm5lY3RpbmcgdG8gU3BhcmNsZXQKLSogU3BhcmNsZXQgRG93bmxvYWQ6OiAgICAgICAgICAgIFNwYXJjbGV0IGRvd25sb2FkCi0qIFNwYXJjbGV0IEV4ZWN1dGlvbjo6ICAgICAgICAgICBSdW5uaW5nIGFuZCBkZWJ1Z2dpbmcgCi1AZW5kIG1lbnUKLQotQG5vZGUgU3BhcmNsZXQgRmlsZQotQHN1YnN1YnNlY3Rpb24gU2V0dGluZyBmaWxlIHRvIGRlYnVnCi0KLVRoZSBAdmFsdWV7R0RCTn0gY29tbWFuZCBAY29kZXtmaWxlfSBsZXRzIHlvdSBjaG9vc2Ugd2l0aCBwcm9ncmFtIHRvIGRlYnVnLgotCi1AZXhhbXBsZQotKGdkYnNsZXQpIGZpbGUgcHJvZwotQGVuZCBleGFtcGxlCi0KLUBuZWVkIDEwMDAKLUB2YWx1ZXtHREJOfSB0aGVuIGF0dGVtcHRzIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZSBvZiBAZmlsZXtwcm9nfS4KLUB2YWx1ZXtHREJOfSBsb2NhdGVzCi10aGUgZmlsZSBieSBzZWFyY2hpbmcgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiB0aGUgY29tbWFuZCBzZWFyY2gKLXBhdGguCi1JZiB0aGUgZmlsZSB3YXMgY29tcGlsZWQgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbiAob3B0aW9uICItZyIpLCBzb3VyY2UKLWZpbGVzIHdpbGwgYmUgc2VhcmNoZWQgYXMgd2VsbC4KLUB2YWx1ZXtHREJOfSBsb2NhdGVzCi10aGUgc291cmNlIGZpbGVzIGJ5IHNlYXJjaGluZyB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluIHRoZSBkaXJlY3Rvcnkgc2VhcmNoCi1wYXRoIChAcHhyZWZ7RW52aXJvbm1lbnQsICxZb3VyIHByb2dyYW0ncyBlbnZpcm9ubWVudH0pLgotSWYgaXQgZmFpbHMKLXRvIGZpbmQgYSBmaWxlLCBpdCBkaXNwbGF5cyBhIG1lc3NhZ2Ugc3VjaCBhczoKLQotQGV4YW1wbGUKLXByb2c6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkuCi1AZW5kIGV4YW1wbGUKLQotV2hlbiB0aGlzIGhhcHBlbnMsIGFkZCB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgdG8gdGhlIHNlYXJjaCBwYXRocyB3aXRoCi10aGUgQHZhbHVle0dEQk59IGNvbW1hbmRzIEBjb2Rle3BhdGh9IGFuZCBAY29kZXtkaXJ9LCBhbmQgZXhlY3V0ZSB0aGUgCi1AY29kZXt0YXJnZXR9IGNvbW1hbmQgYWdhaW4uCi0KLUBub2RlIFNwYXJjbGV0IENvbm5lY3Rpb24KLUBzdWJzdWJzZWN0aW9uIENvbm5lY3RpbmcgdG8gU3BhcmNsZXQKLQotVGhlIEB2YWx1ZXtHREJOfSBjb21tYW5kIEBjb2Rle3RhcmdldH0gbGV0cyB5b3UgY29ubmVjdCB0byBhIFNwYXJjbGV0IHRhcmdldC4KLVRvIGNvbm5lY3QgdG8gYSB0YXJnZXQgb24gc2VyaWFsIHBvcnQgYGBAY29kZXt0dHlhfScnLCB0eXBlOgotCi1AZXhhbXBsZQotKGdkYnNsZXQpIHRhcmdldCBzcGFyY2xldCAvZGV2L3R0eWEKLVJlbW90ZSB0YXJnZXQgc3BhcmNsZXQgY29ubmVjdGVkIHRvIC9kZXYvdHR5YQotbWFpbiAoKSBhdCAuLi9wcm9nLmM6MyAKLUBlbmQgZXhhbXBsZQotCi1AbmVlZCA3NTAKLUB2YWx1ZXtHREJOfSBkaXNwbGF5cyBtZXNzYWdlcyBsaWtlIHRoZXNlOgotCi1Ac21hbGxleGFtcGxlCi1Db25uZWN0ZWQgdG8gdHR5YS4KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIFNwYXJjbGV0IERvd25sb2FkCi1Ac3Vic3Vic2VjdGlvbiBTcGFyY2xldCBkb3dubG9hZAotCi1AY2luZGV4IGRvd25sb2FkIHRvIFNwYXJjbGV0Ci1PbmNlIGNvbm5lY3RlZCB0byB0aGUgU3BhcmNsZXQgdGFyZ2V0LCAKLXlvdSBjYW4gdXNlIHRoZSBAdmFsdWV7R0RCTn0KLUBjb2Rle2xvYWR9IGNvbW1hbmQgdG8gZG93bmxvYWQgdGhlIGZpbGUgZnJvbSB0aGUgaG9zdCB0byB0aGUgdGFyZ2V0LgotVGhlIGZpbGUgbmFtZSBhbmQgbG9hZCBvZmZzZXQgc2hvdWxkIGJlIGdpdmVuIGFzIGFyZ3VtZW50cyB0byB0aGUgQGNvZGV7bG9hZH0KLWNvbW1hbmQuCi1TaW5jZSB0aGUgZmlsZSBmb3JtYXQgaXMgYW91dCwgdGhlIHByb2dyYW0gbXVzdCBiZSBsb2FkZWQgdG8gdGhlIHN0YXJ0aW5nIAotYWRkcmVzcy4gIFlvdSBjYW4gdXNlIG9iamR1bXAgdG8gZmluZCBvdXQgd2hhdCB0aGlzIHZhbHVlIGlzLiAgVGhlIGxvYWQKLW9mZnNldCBpcyBhbiBvZmZzZXQgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIFZNQSAodmlydHVhbCBtZW1vcnkgYWRkcmVzcykKLW9mIGVhY2ggb2YgdGhlIGZpbGUncyBzZWN0aW9ucy4KLUZvciBpbnN0YW5jZSwgaWYgdGhlIHByb2dyYW0KLUBmaWxle3Byb2d9IHdhcyBsaW5rZWQgdG8gdGV4dCBhZGRyZXNzIDB4MTIwMTAwMCwgd2l0aCBkYXRhIGF0IDB4MTIwMTAxNjAKLWFuZCBic3MgYXQgMHgxMjAxMDE3MCwgaW4gQHZhbHVle0dEQk59LCB0eXBlOgotCi1AZXhhbXBsZQotKGdkYnNsZXQpIGxvYWQgcHJvZyAweDEyMDEwMDAwCi1Mb2FkaW5nIHNlY3Rpb24gLnRleHQsIHNpemUgMHhkYjAgdm1hIDB4MTIwMTAwMDAKLUBlbmQgZXhhbXBsZQotCi1JZiB0aGUgY29kZSBpcyBsb2FkZWQgYXQgYSBkaWZmZXJlbnQgYWRkcmVzcyB0aGVuIHdoYXQgdGhlIHByb2dyYW0gd2FzIGxpbmtlZCAKLXRvLCB5b3UgbWF5IG5lZWQgdG8gdXNlIHRoZSBAY29kZXtzZWN0aW9ufSBhbmQgQGNvZGV7YWRkLXN5bWJvbC1maWxlfSBjb21tYW5kcyAKLXRvIHRlbGwgQHZhbHVle0dEQk59IHdoZXJlIHRvIG1hcCB0aGUgc3ltYm9sIHRhYmxlLgotCi1Abm9kZSBTcGFyY2xldCBFeGVjdXRpb24KLUBzdWJzdWJzZWN0aW9uIFJ1bm5pbmcgYW5kIGRlYnVnZ2luZwotCi1AY2luZGV4IHJ1bm5pbmcgYW5kIGRlYnVnZ2luZyBTcGFyY2xldCBwcm9ncmFtcwotWW91IGNhbiBub3cgYmVnaW4gZGVidWdnaW5nIHRoZSB0YXNrIHVzaW5nIEB2YWx1ZXtHREJOfSdzIGV4ZWN1dGlvbiBjb250cm9sCi1jb21tYW5kcywgQGNvZGV7Yn0sIEBjb2Rle3N0ZXB9LCBAY29kZXtydW59LCBldGMuICBTZWUgdGhlIEB2YWx1ZXtHREJOfSAKLW1hbnVhbCBmb3IgdGhlIGxpc3Qgb2YgY29tbWFuZHMuCi0KLUBleGFtcGxlCi0oZ2Ric2xldCkgYiBtYWluCi1CcmVha3BvaW50IDEgYXQgMHgxMjAxMDAwMDogZmlsZSBwcm9nLmMsIGxpbmUgMy4KLShnZGJzbGV0KSBydW4gCi1TdGFydGluZyBwcm9ncmFtOiBwcm9nCi1CcmVha3BvaW50IDEsIG1haW4gKGFyZ2M9MSwgYXJndj0weGVmZmZmMjFjKSBhdCBwcm9nLmM6MwotMyAgICAgICAgY2hhciAqc3ltYXJnID0gMDsKLShnZGJzbGV0KSBzdGVwCi00ICAgICAgICBjaGFyICpleGVjYXJnID0gImhlbGxvISI7Ci0oZ2Ric2xldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAKLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBIaXRhY2hpIFJlbW90ZQotQHN1YnNlY3Rpb24gQHZhbHVle0dEQk59IGFuZCBIaXRhY2hpIG1pY3JvcHJvY2Vzc29ycwotQHZhbHVle0dEQk59IG5lZWRzIHRvIGtub3cgdGhlc2UgdGhpbmdzIHRvIHRhbGsgdG8geW91cgotSGl0YWNoaSBTSCwgSDgvMzAwLCBvciBIOC81MDA6IAotCi1AZW51bWVyYXRlCi1AaXRlbQotdGhhdCB5b3Ugd2FudCB0byB1c2UgQHNhbXB7dGFyZ2V0IGhtc30sIHRoZSByZW1vdGUgZGVidWdnaW5nIGludGVyZmFjZQotZm9yIEhpdGFjaGkgbWljcm9wcm9jZXNzb3JzLCBvciBAc2FtcHt0YXJnZXQgZTcwMDB9LCB0aGUgaW4tY2lyY3VpdAotZW11bGF0b3IgZm9yIHRoZSBIaXRhY2hpIFNIIGFuZCB0aGUgSGl0YWNoaSAzMDBILiAgKEBzYW1we3RhcmdldCBobXN9IGlzCi10aGUgZGVmYXVsdCB3aGVuIEdEQiBpcyBjb25maWd1cmVkIHNwZWNpZmljYWxseSBmb3IgdGhlIEhpdGFjaGkgU0gsCi1IOC8zMDAsIG9yIEg4LzUwMC4pCi0KLUBpdGVtCi13aGF0IHNlcmlhbCBkZXZpY2UgY29ubmVjdHMgeW91ciBob3N0IHRvIHlvdXIgSGl0YWNoaSBib2FyZCAodGhlIGZpcnN0Ci1zZXJpYWwgZGV2aWNlIGF2YWlsYWJsZSBvbiB5b3VyIGhvc3QgaXMgdGhlIGRlZmF1bHQpLgotCi1AaXRlbQotd2hhdCBzcGVlZCB0byB1c2Ugb3ZlciB0aGUgc2VyaWFsIGRldmljZS4KLUBlbmQgZW51bWVyYXRlCi0KLUBtZW51Ci0qIEhpdGFjaGkgQm9hcmRzOjogICAgICBDb25uZWN0aW5nIHRvIEhpdGFjaGkgYm9hcmRzLgotKiBIaXRhY2hpIElDRTo6ICAgICAgICAgVXNpbmcgdGhlIEU3MDAwIEluLUNpcmN1aXQgRW11bGF0b3IuCi0qIEhpdGFjaGkgU3BlY2lhbDo6ICAgICBTcGVjaWFsIEB2YWx1ZXtHREJOfSBjb21tYW5kcyBmb3IgSGl0YWNoaSBtaWNyb3MuCi1AZW5kIG1lbnUKLQotQG5vZGUgSGl0YWNoaSBCb2FyZHMKLUBzdWJzdWJzZWN0aW9uIENvbm5lY3RpbmcgdG8gSGl0YWNoaSBib2FyZHMKLQotQGMgb25seSBmb3IgVW5peCBob3N0cwotQGtpbmRleCBkZXZpY2UKLUBjaW5kZXggc2VyaWFsIGRldmljZSwgSGl0YWNoaSBtaWNyb3MKLVVzZSB0aGUgc3BlY2lhbCBAY29kZXtAdmFsdWV7R0RCUH19IGNvbW1hbmQgQHNhbXB7ZGV2aWNlIEB2YXJ7cG9ydH19IGlmIHlvdQotbmVlZCB0byBleHBsaWNpdGx5IHNldCB0aGUgc2VyaWFsIGRldmljZS4gIFRoZSBkZWZhdWx0IEB2YXJ7cG9ydH0gaXMgdGhlCi1maXJzdCBhdmFpbGFibGUgcG9ydCBvbiB5b3VyIGhvc3QuICBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IG9uIFVuaXgKLWhvc3RzLCB3aGVyZSBpdCBpcyB0eXBpY2FsbHkgc29tZXRoaW5nIGxpa2UgQGZpbGV7L2Rldi90dHlhfS4KLQotQGtpbmRleCBzcGVlZAotQGNpbmRleCBzZXJpYWwgbGluZSBzcGVlZCwgSGl0YWNoaSBtaWNyb3MKLUBjb2Rle0B2YWx1ZXtHREJQfX0gaGFzIGFub3RoZXIgc3BlY2lhbCBjb21tYW5kIHRvIHNldCB0aGUgY29tbXVuaWNhdGlvbnMKLXNwZWVkOiBAc2FtcHtzcGVlZCBAdmFye2Jwc319LiAgVGhpcyBjb21tYW5kIGFsc28gaXMgb25seSB1c2VkIGZyb20gVW5peAotaG9zdHM7IG9uIERPUyBob3N0cywgc2V0IHRoZSBsaW5lIHNwZWVkIGFzIHVzdWFsIGZyb20gb3V0c2lkZSBHREIgd2l0aAotdGhlIERPUyBAa2Jke21vZGV9IGNvbW1hbmQgKGZvciBpbnN0YW5jZSwgQHd7QHNhbXB7bW9kZQotY29tMjo5NjAwLG4sOCwxLHB9fSBmb3IgYSA5NjAwIGJwcyBjb25uZWN0aW9uKS4KLQotVGhlIEBzYW1we2RldmljZX0gYW5kIEBzYW1we3NwZWVkfSBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIG9ubHkgd2hlbiB5b3UKLXVzZSBhIFVuaXggaG9zdCB0byBkZWJ1ZyB5b3VyIEhpdGFjaGkgbWljcm9wcm9jZXNzb3IgcHJvZ3JhbXMuICBJZiB5b3UKLXVzZSBhIERPUyBob3N0LAotQHZhbHVle0dEQk59IGRlcGVuZHMgb24gYW4gYXV4aWxpYXJ5IHRlcm1pbmF0ZS1hbmQtc3RheS1yZXNpZGVudCBwcm9ncmFtCi1jYWxsZWQgQGNvZGV7YXN5bmN0c3J9IHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGRldmVsb3BtZW50IGJvYXJkCi10aHJvdWdoIGEgUEMgc2VyaWFsIHBvcnQuICBZb3UgbXVzdCBhbHNvIHVzZSB0aGUgRE9TIEBjb2Rle21vZGV9IGNvbW1hbmQKLXRvIHNldCB1cCB0aGUgc2VyaWFsIHBvcnQgb24gdGhlIERPUyBzaWRlLgotCi1UaGUgZm9sbG93aW5nIHNhbXBsZSBzZXNzaW9uIGlsbHVzdHJhdGVzIHRoZSBzdGVwcyBuZWVkZWQgdG8gc3RhcnQgYQotcHJvZ3JhbSB1bmRlciBAdmFsdWV7R0RCTn0gY29udHJvbCBvbiBhbiBIOC8zMDAuICBUaGUgZXhhbXBsZSB1c2VzIGEKLXNhbXBsZSBIOC8zMDAgcHJvZ3JhbSBjYWxsZWQgQGZpbGV7dC54fS4gIFRoZSBwcm9jZWR1cmUgaXMgdGhlIHNhbWUgZm9yCi10aGUgSGl0YWNoaSBTSCBhbmQgdGhlIEg4LzUwMC4KLQotRmlyc3QgaG9vayB1cCB5b3VyIGRldmVsb3BtZW50IGJvYXJkLiAgSW4gdGhpcyBleGFtcGxlLCB3ZSB1c2UgYQotYm9hcmQgYXR0YWNoZWQgdG8gc2VyaWFsIHBvcnQgQGNvZGV7Q09NMn07IGlmIHlvdSB1c2UgYSBkaWZmZXJlbnQgc2VyaWFsCi1wb3J0LCBzdWJzdGl0dXRlIGl0cyBuYW1lIGluIHRoZSBhcmd1bWVudCBvZiB0aGUgQGNvZGV7bW9kZX0gY29tbWFuZC4KLVdoZW4geW91IGNhbGwgQGNvZGV7YXN5bmN0c3J9LCB0aGUgYXV4aWxpYXJ5IGNvbW1zIHByb2dyYW0gdXNlZCBieSB0aGUKLWRlZ3VnZ2VyLCB5b3UgZ2l2ZSBpdCBqdXN0IHRoZSBudW1lcmljIHBhcnQgb2YgdGhlIHNlcmlhbCBwb3J0J3MgbmFtZTsKLWZvciBleGFtcGxlLCBAc2FtcHthc3luY3N0ciAyfSBiZWxvdyBydW5zIEBjb2Rle2FzeW5jc3RyfSBvbgotQGNvZGV7Q09NMn0uCi0KLUBleGFtcGxlCi1DOlxIODMwMFxURVNUPiBhc3luY3RzciAyCi1DOlxIODMwMFxURVNUPiBtb2RlIGNvbTI6OTYwMCxuLDgsMSxwCi0KLVJlc2lkZW50IHBvcnRpb24gb2YgTU9ERSBsb2FkZWQKLQotQ09NMjogOTYwMCwgbiwgOCwgMSwgcAotCi1AZW5kIGV4YW1wbGUKLQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IFdlIGhhdmUgbm90aWNlZCBhIGJ1ZyBpbiBQQy1ORlMgdGhhdCBjb25mbGljdHMgd2l0aAotQGNvZGV7YXN5bmN0c3J9LiAgSWYgeW91IGFsc28gcnVuIFBDLU5GUyBvbiB5b3VyIERPUyBob3N0LCB5b3UgbWF5IG5lZWQgdG8KLWRpc2FibGUgaXQsIG9yIGV2ZW4gYm9vdCB3aXRob3V0IGl0LCB0byB1c2UgQGNvZGV7YXN5bmN0c3J9IHRvIGNvbnRyb2wKLXlvdXIgZGV2ZWxvcG1lbnQgYm9hcmQuCi1AZW5kIHF1b3RhdGlvbgotCi1Aa2luZGV4IHRhcmdldCBobXMKLU5vdyB0aGF0IHNlcmlhbCBjb21tdW5pY2F0aW9ucyBhcmUgc2V0IHVwLCBhbmQgdGhlIGRldmVsb3BtZW50IGJvYXJkIGlzCi1jb25uZWN0ZWQsIHlvdSBjYW4gc3RhcnQgdXAgQHZhbHVle0dEQk59LiAgQ2FsbCBAY29kZXtAdmFsdWV7R0RCUH19IHdpdGgKLXRoZSBuYW1lIG9mIHlvdXIgcHJvZ3JhbSBhcyB0aGUgYXJndW1lbnQuICBAY29kZXtAdmFsdWV7R0RCUH19IHByb21wdHMKLXlvdSwgYXMgdXN1YWwsIHdpdGggdGhlIHByb21wdCBAc2FtcHsoQHZhbHVle0dEQlB9KX0uICBVc2UgdHdvIHNwZWNpYWwKLWNvbW1hbmRzIHRvIGJlZ2luIHlvdXIgZGVidWdnaW5nIHNlc3Npb246IEBzYW1we3RhcmdldCBobXN9IHRvIHNwZWNpZnkKLWNyb3NzLWRlYnVnZ2luZyB0byB0aGUgSGl0YWNoaSBib2FyZCwgYW5kIHRoZSBAY29kZXtsb2FkfSBjb21tYW5kIHRvCi1kb3dubG9hZCB5b3VyIHByb2dyYW0gdG8gdGhlIGJvYXJkLiAgQGNvZGV7bG9hZH0gZGlzcGxheXMgdGhlIG5hbWVzIG9mCi10aGUgcHJvZ3JhbSdzIHNlY3Rpb25zLCBhbmQgYSBAc2FtcHsqfSBmb3IgZWFjaCAySyBvZiBkYXRhIGRvd25sb2FkZWQuCi0oSWYgeW91IHdhbnQgdG8gcmVmcmVzaCBAdmFsdWV7R0RCTn0gZGF0YSBvbiBzeW1ib2xzIG9yIG9uIHRoZQotZXhlY3V0YWJsZSBmaWxlIHdpdGhvdXQgZG93bmxvYWRpbmcsIHVzZSB0aGUgQHZhbHVle0dEQk59IGNvbW1hbmRzCi1AY29kZXtmaWxlfSBvciBAY29kZXtzeW1ib2wtZmlsZX0uICBUaGVzZSBjb21tYW5kcywgYW5kIEBjb2Rle2xvYWR9Ci1pdHNlbGYsIGFyZSBkZXNjcmliZWQgaW4gQHJlZntGaWxlcywsQ29tbWFuZHMgdG8gc3BlY2lmeSBmaWxlc30uKQotCi1Ac21hbGxleGFtcGxlCi0oZWctQzpcSDgzMDBcVEVTVCkgQHZhbHVle0dEQlB9IHQueAotR0RCIGlzIGZyZWUgc29mdHdhcmUgYW5kIHlvdSBhcmUgd2VsY29tZSB0byBkaXN0cmlidXRlIGNvcGllcwotIG9mIGl0IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSAic2hvdyBjb3B5aW5nIiB0byBzZWUgCi0gdGhlIGNvbmRpdGlvbnMuCi1UaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGZvciBHREI7IHR5cGUgInNob3cgd2FycmFudHkiIAotZm9yIGRldGFpbHMuCi1HREIgQHZhbHVle0dEQlZOfSwgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLi4KLShnZGIpIHRhcmdldCBobXMKLUNvbm5lY3RlZCB0byByZW1vdGUgSDgvMzAwIEhNUyBzeXN0ZW0uCi0oZ2RiKSBsb2FkIHQueAotLnRleHQgICA6IDB4ODAwMCAuLiAweGFiZGUgKioqKioqKioqKioKLS5kYXRhICAgOiAweGFiZGUgLi4gMHhhZDMwICoKLS5zdGFjayAgOiAweGYwMDAgLi4gMHhmMDE0ICoKLUBlbmQgc21hbGxleGFtcGxlCi0KLUF0IHRoaXMgcG9pbnQsIHlvdSdyZSByZWFkeSB0byBydW4gb3IgZGVidWcgeW91ciBwcm9ncmFtLiAgRnJvbSBoZXJlIG9uLAoteW91IGNhbiB1c2UgYWxsIHRoZSB1c3VhbCBAdmFsdWV7R0RCTn0gY29tbWFuZHMuICBUaGUgQGNvZGV7YnJlYWt9IGNvbW1hbmQKLXNldHMgYnJlYWtwb2ludHM7IHRoZSBAY29kZXtydW59IGNvbW1hbmQgc3RhcnRzIHlvdXIgcHJvZ3JhbTsKLUBjb2Rle3ByaW50fSBvciBAY29kZXt4fSBkaXNwbGF5IGRhdGE7IHRoZSBAY29kZXtjb250aW51ZX0gY29tbWFuZAotcmVzdW1lcyBleGVjdXRpb24gYWZ0ZXIgc3RvcHBpbmcgYXQgYSBicmVha3BvaW50LiAgWW91IGNhbiB1c2UgdGhlCi1AY29kZXtoZWxwfSBjb21tYW5kIGF0IGFueSB0aW1lIHRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgQHZhbHVle0dEQk59IGNvbW1hbmRzLgotCi1SZW1lbWJlciwgaG93ZXZlciwgdGhhdCBAZW1waHtvcGVyYXRpbmcgc3lzdGVtfSBmYWNpbGl0aWVzIGFyZW4ndAotYXZhaWxhYmxlIG9uIHlvdXIgZGV2ZWxvcG1lbnQgYm9hcmQ7IGZvciBleGFtcGxlLCBpZiB5b3VyIHByb2dyYW0gaGFuZ3MsCi15b3UgY2FuJ3Qgc2VuZCBhbiBpbnRlcnJ1cHQtLS1idXQgeW91IGNhbiBwcmVzcyB0aGUgQHNje3Jlc2V0fSBzd2l0Y2ghCi0KLVVzZSB0aGUgQHNje3Jlc2V0fSBidXR0b24gb24gdGhlIGRldmVsb3BtZW50IGJvYXJkCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotdG8gaW50ZXJydXB0IHlvdXIgcHJvZ3JhbSAoZG9uJ3QgdXNlIEBrYmR7Y3RsLUN9IG9uIHRoZSBET1MgaG9zdC0tLWl0IGhhcwotbm8gd2F5IHRvIHBhc3MgYW4gaW50ZXJydXB0IHNpZ25hbCB0byB0aGUgZGV2ZWxvcG1lbnQgYm9hcmQpOyBhbmQKLQotQGl0ZW0KLXRvIHJldHVybiB0byB0aGUgQHZhbHVle0dEQk59IGNvbW1hbmQgcHJvbXB0IGFmdGVyIHlvdXIgcHJvZ3JhbSBmaW5pc2hlcwotbm9ybWFsbHkuICBUaGUgY29tbXVuaWNhdGlvbnMgcHJvdG9jb2wgcHJvdmlkZXMgbm8gb3RoZXIgd2F5IGZvciBAdmFsdWV7R0RCTn0KLXRvIGRldGVjdCBwcm9ncmFtIGNvbXBsZXRpb24uCi1AZW5kIGl0ZW1pemUKLQotSW4gZWl0aGVyIGNhc2UsIEB2YWx1ZXtHREJOfSBzZWVzIHRoZSBlZmZlY3Qgb2YgYSBAc2N7cmVzZXR9IG9uIHRoZQotZGV2ZWxvcG1lbnQgYm9hcmQgYXMgYSBgYG5vcm1hbCBleGl0Jycgb2YgeW91ciBwcm9ncmFtLgotCi1Abm9kZSBIaXRhY2hpIElDRQotQHN1YnN1YnNlY3Rpb24gVXNpbmcgdGhlIEU3MDAwIGluLWNpcmN1aXQgZW11bGF0b3IKLQotQGtpbmRleCB0YXJnZXQgZTcwMDAKLVlvdSBjYW4gdXNlIHRoZSBFNzAwMCBpbi1jaXJjdWl0IGVtdWxhdG9yIHRvIGRldmVsb3AgY29kZSBmb3IgZWl0aGVyIHRoZQotSGl0YWNoaSBTSCBvciB0aGUgSDgvMzAwSC4gIFVzZSBvbmUgb2YgdGhlc2UgZm9ybXMgb2YgdGhlIEBzYW1we3RhcmdldAotZTcwMDB9IGNvbW1hbmQgdG8gY29ubmVjdCBAdmFsdWV7R0RCTn0gdG8geW91ciBFNzAwMDoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSB0YXJnZXQgZTcwMDAgQHZhcntwb3J0fSBAdmFye3NwZWVkfQotVXNlIHRoaXMgZm9ybSBpZiB5b3VyIEU3MDAwIGlzIGNvbm5lY3RlZCB0byBhIHNlcmlhbCBwb3J0LiAgVGhlCi1AdmFye3BvcnR9IGFyZ3VtZW50IGlkZW50aWZpZXMgd2hhdCBzZXJpYWwgcG9ydCB0byB1c2UgKGZvciBleGFtcGxlLAotQHNhbXB7Y29tMn0pLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBsaW5lIHNwZWVkIGluIGJpdHMgcGVyIHNlY29uZAotKGZvciBleGFtcGxlLCBAc2FtcHs5NjAwfSkuCi0KLUBpdGVtIHRhcmdldCBlNzAwMCBAdmFye2hvc3RuYW1lfQotSWYgeW91ciBFNzAwMCBpcyBpbnN0YWxsZWQgYXMgYSBob3N0IG9uIGEgVENQL0lQIG5ldHdvcmssIHlvdSBjYW4ganVzdAotc3BlY2lmeSBpdHMgaG9zdG5hbWU7IEB2YWx1ZXtHREJOfSB1c2VzIEBjb2Rle3RlbG5ldH0gdG8gY29ubmVjdC4KLUBlbmQgdGFibGUKLQotQG5vZGUgSGl0YWNoaSBTcGVjaWFsCi1Ac3Vic3Vic2VjdGlvbiBTcGVjaWFsIEB2YWx1ZXtHREJOfSBjb21tYW5kcyBmb3IgSGl0YWNoaSBtaWNyb3MKLQotU29tZSBAdmFsdWV7R0RCTn0gY29tbWFuZHMgYXJlIGF2YWlsYWJsZSBvbmx5IG9uIHRoZSBIOC8zMDAgb3IgdGhlCi1IOC81MDAgY29uZmlndXJhdGlvbnM6Ci0KLUB0YWJsZSBAY29kZQotQGtpbmRleCBzZXQgbWFjaGluZQotQGtpbmRleCBzaG93IG1hY2hpbmUKLUBpdGVtIHNldCBtYWNoaW5lIGg4MzAwCi1AaXRlbXggc2V0IG1hY2hpbmUgaDgzMDBoCi1Db25kaXRpb24gQHZhbHVle0dEQk59IGZvciBvbmUgb2YgdGhlIHR3byB2YXJpYW50cyBvZiB0aGUgSDgvMzAwCi1hcmNoaXRlY3R1cmUgd2l0aCBAc2FtcHtzZXQgbWFjaGluZX0uICBZb3UgY2FuIHVzZSBAc2FtcHtzaG93IG1hY2hpbmV9Ci10byBjaGVjayB3aGljaCB2YXJpYW50IGlzIGN1cnJlbnRseSBpbiBlZmZlY3QuCi0KLUBraW5kZXggc2V0IG1lbW9yeSBAdmFye21vZH0KLUBjaW5kZXggbWVtb3J5IG1vZGVscywgSDgvNTAwCi1AaXRlbSBzZXQgbWVtb3J5IEB2YXJ7bW9kfQotQGl0ZW14IHNob3cgbWVtb3J5Ci1TcGVjaWZ5IHdoaWNoIEg4LzUwMCBtZW1vcnkgbW9kZWwgKEB2YXJ7bW9kfSkgeW91IGFyZSB1c2luZyB3aXRoCi1Ac2FtcHtzZXQgbWVtb3J5fTsgY2hlY2sgd2hpY2ggbWVtb3J5IG1vZGVsIGlzIGluIGVmZmVjdCB3aXRoIEBzYW1we3Nob3cKLW1lbW9yeX0uICBUaGUgYWNjZXB0ZWQgdmFsdWVzIGZvciBAdmFye21vZH0gYXJlIEBjb2Rle3NtYWxsfSwKLUBjb2Rle2JpZ30sIEBjb2Rle21lZGl1bX0sIGFuZCBAY29kZXtjb21wYWN0fS4KLUBlbmQgdGFibGUKLQotQG5vZGUgTUlQUyBSZW1vdGUKLUBzdWJzZWN0aW9uIEB2YWx1ZXtHREJOfSBhbmQgcmVtb3RlIE1JUFMgYm9hcmRzCi0KLUBjaW5kZXggTUlQUyBib2FyZHMKLUB2YWx1ZXtHREJOfSBjYW4gdXNlIHRoZSBNSVBTIHJlbW90ZSBkZWJ1Z2dpbmcgcHJvdG9jb2wgdG8gdGFsayB0byBhCi1NSVBTIGJvYXJkIGF0dGFjaGVkIHRvIGEgc2VyaWFsIGxpbmUuICBUaGlzIGlzIGF2YWlsYWJsZSB3aGVuCi15b3UgY29uZmlndXJlIEB2YWx1ZXtHREJOfSB3aXRoIEBzYW1wey0tdGFyZ2V0PW1pcHMtaWR0LWVjb2ZmfS4KLQotQG5lZWQgMTAwMAotVXNlIHRoZXNlIEB2YWx1ZXtHREJOfSBjb21tYW5kcyB0byBzcGVjaWZ5IHRoZSBjb25uZWN0aW9uIHRvIHlvdXIgdGFyZ2V0IGJvYXJkOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHRhcmdldCBtaXBzIEB2YXJ7cG9ydH0KLUBraW5kZXggdGFyZ2V0IG1pcHMgQHZhcntwb3J0fQotVG8gcnVuIGEgcHJvZ3JhbSBvbiB0aGUgYm9hcmQsIHN0YXJ0IHVwIEBjb2Rle0B2YWx1ZXtHREJQfX0gd2l0aCB0aGUKLW5hbWUgb2YgeW91ciBwcm9ncmFtIGFzIHRoZSBhcmd1bWVudC4gIFRvIGNvbm5lY3QgdG8gdGhlIGJvYXJkLCB1c2UgdGhlCi1jb21tYW5kIEBzYW1we3RhcmdldCBtaXBzIEB2YXJ7cG9ydH19LCB3aGVyZSBAdmFye3BvcnR9IGlzIHRoZSBuYW1lIG9mCi10aGUgc2VyaWFsIHBvcnQgY29ubmVjdGVkIHRvIHRoZSBib2FyZC4gIElmIHRoZSBwcm9ncmFtIGhhcyBub3QgYWxyZWFkeQotYmVlbiBkb3dubG9hZGVkIHRvIHRoZSBib2FyZCwgeW91IG1heSB1c2UgdGhlIEBjb2Rle2xvYWR9IGNvbW1hbmQgdG8KLWRvd25sb2FkIGl0LiAgWW91IGNhbiB0aGVuIHVzZSBhbGwgdGhlIHVzdWFsIEB2YWx1ZXtHREJOfSBjb21tYW5kcy4KLQotRm9yIGV4YW1wbGUsIHRoaXMgc2VxdWVuY2UgY29ubmVjdHMgdG8gdGhlIHRhcmdldCBib2FyZCB0aHJvdWdoIGEgc2VyaWFsCi1wb3J0LCBhbmQgbG9hZHMgYW5kIHJ1bnMgYSBwcm9ncmFtIGNhbGxlZCBAdmFye3Byb2d9IHRocm91Z2ggdGhlCi1kZWJ1Z2dlcjoKLQotQGV4YW1wbGUKLWhvc3QkIEB2YWx1ZXtHREJQfSBAdmFye3Byb2d9Ci1HREIgaXMgZnJlZSBzb2Z0d2FyZSBhbmQgQGRvdHN7fQotKGdkYikgdGFyZ2V0IG1pcHMgL2Rldi90dHliCi0oZ2RiKSBsb2FkIEB2YXJ7cHJvZ30KLShnZGIpIHJ1bgotQGVuZCBleGFtcGxlCi0KLUBpdGVtIHRhcmdldCBtaXBzIEB2YXJ7aG9zdG5hbWV9OkB2YXJ7cG9ydG51bWJlcn0KLU9uIHNvbWUgQHZhbHVle0dEQk59IGhvc3QgY29uZmlndXJhdGlvbnMsIHlvdSBjYW4gc3BlY2lmeSBhIFRDUAotY29ubmVjdGlvbiAoZm9yIGluc3RhbmNlLCB0byBhIHNlcmlhbCBsaW5lIG1hbmFnZWQgYnkgYSB0ZXJtaW5hbAotY29uY2VudHJhdG9yKSBpbnN0ZWFkIG9mIGEgc2VyaWFsIHBvcnQsIHVzaW5nIHRoZSBzeW50YXgKLUBzYW1we0B2YXJ7aG9zdG5hbWV9OkB2YXJ7cG9ydG51bWJlcn19LgotCi1AaXRlbSB0YXJnZXQgcG1vbiBAdmFye3BvcnR9Ci1Aa2luZGV4IHRhcmdldCBwbW9uIEB2YXJ7cG9ydH0KLQotQGl0ZW0gdGFyZ2V0IGRkYiBAdmFye3BvcnR9Ci1Aa2luZGV4IHRhcmdldCBkZGIgQHZhcntwb3J0fQotCi1AaXRlbSB0YXJnZXQgbHNpIEB2YXJ7cG9ydH0KLUBraW5kZXggdGFyZ2V0IGxzaSBAdmFye3BvcnR9Ci0KLUBlbmQgdGFibGUKLQotCi1Abm9pbmRlbnQKLUB2YWx1ZXtHREJOfSBhbHNvIHN1cHBvcnRzIHRoZXNlIHNwZWNpYWwgY29tbWFuZHMgZm9yIE1JUFMgdGFyZ2V0czoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBzZXQgcHJvY2Vzc29yIEB2YXJ7YXJnc30KLUBpdGVteCBzaG93IHByb2Nlc3NvcgotQGtpbmRleCBzZXQgcHJvY2Vzc29yIEB2YXJ7YXJnc30KLUBraW5kZXggc2hvdyBwcm9jZXNzb3IKLVVzZSB0aGUgQGNvZGV7c2V0IHByb2Nlc3Nvcn0gY29tbWFuZCB0byBzZXQgdGhlIHR5cGUgb2YgTUlQUwotcHJvY2Vzc29yIHdoZW4geW91IHdhbnQgdG8gYWNjZXNzIHByb2Nlc3Nvci10eXBlLXNwZWNpZmljIHJlZ2lzdGVycy4KLUZvciBleGFtcGxlLCBAY29kZXtzZXQgcHJvY2Vzc29yIEB2YXJ7cjMwNDF9fSB0ZWxscyBAdmFsdWV7R0RCTn0gCi10byB1c2UgdGhlIENQTyByZWdpc3RlcnMgYXBwcm9wcmlhdGUgZm9yIHRoZSAzMDQxIGNoaXAuCi1Vc2UgdGhlIEBjb2Rle3Nob3cgcHJvY2Vzc29yfSBjb21tYW5kIHRvIHNlZSB3aGF0IE1JUFMgcHJvY2Vzc29yIEB2YWx1ZXtHREJOfSAKLWlzIHVzaW5nLiAgVXNlIHRoZSBAY29kZXtpbmZvIHJlZ30gY29tbWFuZCB0byBzZWUgd2hhdCByZWdpc3RlcnMKLUB2YWx1ZXtHREJOfSBpcyB1c2luZy4gCi0KLUBpdGVtIHNldCBtaXBzZnB1IGRvdWJsZQotQGl0ZW14IHNldCBtaXBzZnB1IHNpbmdsZQotQGl0ZW14IHNldCBtaXBzZnB1IG5vbmUKLUBpdGVteCBzaG93IG1pcHNmcHUKLUBraW5kZXggc2V0IG1pcHNmcHUKLUBraW5kZXggc2hvdyBtaXBzZnB1Ci1AY2luZGV4IE1JUFMgcmVtb3RlIGZsb2F0aW5nIHBvaW50Ci1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBNSVBTIHJlbW90ZQotSWYgeW91ciB0YXJnZXQgYm9hcmQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgTUlQUyBmbG9hdGluZyBwb2ludAotY29wcm9jZXNzb3IsIHlvdSBzaG91bGQgdXNlIHRoZSBjb21tYW5kIEBzYW1we3NldCBtaXBzZnB1IG5vbmV9IChpZiB5b3UKLW5lZWQgdGhpcywgeW91IG1heSB3aXNoIHRvIHB1dCB0aGUgY29tbWFuZCBpbiB5b3VyIEB2YWx1ZXtHREJJTklUfQotZmlsZSkuICBUaGlzIHRlbGxzIEB2YWx1ZXtHREJOfSBob3cgdG8gZmluZCB0aGUgcmV0dXJuIHZhbHVlIG9mCi1mdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4gIEl0IGFsc28gYWxsb3dzCi1AdmFsdWV7R0RCTn0gdG8gYXZvaWQgc2F2aW5nIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgd2hlbiBjYWxsaW5nCi1mdW5jdGlvbnMgb24gdGhlIGJvYXJkLiAgSWYgeW91IGFyZSB1c2luZyBhIGZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yCi13aXRoIG9ubHkgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBzdXBwb3J0LCBhcyBvbiB0aGUgQHNje3I0NjUwfQotcHJvY2Vzc29yLCB1c2UgdGhlIGNvbW1hbmQgQHNhbXB7c2V0IG1pcHNmcHUgc2luZ2xlfS4gIFRoZSBkZWZhdWx0Ci1kb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIG1heSBiZSBzZWxlY3RlZCB1c2luZwotQHNhbXB7c2V0IG1pcHNmcHUgZG91YmxlfS4KLQotSW4gcHJldmlvdXMgdmVyc2lvbnMgdGhlIG9ubHkgY2hvaWNlcyB3ZXJlIGRvdWJsZSBwcmVjaXNpb24gb3Igbm8KLWZsb2F0aW5nIHBvaW50LCBzbyBAc2FtcHtzZXQgbWlwc2ZwdSBvbn0gd2lsbCBzZWxlY3QgZG91YmxlIHByZWNpc2lvbgotYW5kIEBzYW1we3NldCBtaXBzZnB1IG9mZn0gd2lsbCBzZWxlY3Qgbm8gZmxvYXRpbmcgcG9pbnQuCi0KLUFzIHVzdWFsLCB5b3UgY2FuIGlucXVpcmUgYWJvdXQgdGhlIEBjb2Rle21pcHNmcHV9IHZhcmlhYmxlIHdpdGgKLUBzYW1we3Nob3cgbWlwc2ZwdX0uCi0KLUBpdGVtIHNldCByZW1vdGVkZWJ1ZyBAdmFye259Ci1AaXRlbXggc2hvdyByZW1vdGVkZWJ1ZwotQGtpbmRleCBzZXQgcmVtb3RlZGVidWcKLUBraW5kZXggc2hvdyByZW1vdGVkZWJ1ZwotQGNpbmRleCBAY29kZXtyZW1vdGVkZWJ1Z30sIE1JUFMgcHJvdG9jb2wKLUBjaW5kZXggTUlQUyBAY29kZXtyZW1vdGVkZWJ1Z30gcHJvdG9jb2wKLUBjIEZJWE1FISBGb3IgdGhpcyB0byBiZSB1c2VmdWwsIHlvdSBtdXN0IGtub3cgc29tZXRoaW5nIGFib3V0IHRoZSBNSVBTCi1AYyBGSVhNRS4uLnByb3RvY29sLiAgV2hlcmUgaXMgaXQgZGVzY3JpYmVkPwotWW91IGNhbiBzZWUgc29tZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYWJvdXQgY29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgYm9hcmQKLWJ5IHNldHRpbmcgdGhlIEBjb2Rle3JlbW90ZWRlYnVnfSB2YXJpYWJsZS4gIElmIHlvdSBzZXQgaXQgdG8gQGNvZGV7MX0gdXNpbmcKLUBzYW1we3NldCByZW1vdGVkZWJ1ZyAxfSwgZXZlcnkgcGFja2V0IGlzIGRpc3BsYXllZC4gIElmIHlvdSBzZXQgaXQKLXRvIEBjb2RlezJ9LCBldmVyeSBjaGFyYWN0ZXIgaXMgZGlzcGxheWVkLiAgWW91IGNhbiBjaGVjayB0aGUgY3VycmVudCB2YWx1ZQotYXQgYW55IHRpbWUgd2l0aCB0aGUgY29tbWFuZCBAc2FtcHtzaG93IHJlbW90ZWRlYnVnfS4KLQotQGl0ZW0gc2V0IHRpbWVvdXQgQHZhcntzZWNvbmRzfQotQGl0ZW14IHNldCByZXRyYW5zbWl0LXRpbWVvdXQgQHZhcntzZWNvbmRzfQotQGl0ZW14IHNob3cgdGltZW91dAotQGl0ZW14IHNob3cgcmV0cmFuc21pdC10aW1lb3V0Ci1AY2luZGV4IEBjb2Rle3RpbWVvdXR9LCBNSVBTIHByb3RvY29sCi1AY2luZGV4IEBjb2Rle3JldHJhbnNtaXQtdGltZW91dH0sIE1JUFMgcHJvdG9jb2wKLUBraW5kZXggc2V0IHRpbWVvdXQKLUBraW5kZXggc2hvdyB0aW1lb3V0Ci1Aa2luZGV4IHNldCByZXRyYW5zbWl0LXRpbWVvdXQKLUBraW5kZXggc2hvdyByZXRyYW5zbWl0LXRpbWVvdXQKLVlvdSBjYW4gY29udHJvbCB0aGUgdGltZW91dCB1c2VkIHdoaWxlIHdhaXRpbmcgZm9yIGEgcGFja2V0LCBpbiB0aGUgTUlQUwotcmVtb3RlIHByb3RvY29sLCB3aXRoIHRoZSBAY29kZXtzZXQgdGltZW91dCBAdmFye3NlY29uZHN9fSBjb21tYW5kLiAgVGhlCi1kZWZhdWx0IGlzIDUgc2Vjb25kcy4gIFNpbWlsYXJseSwgeW91IGNhbiBjb250cm9sIHRoZSB0aW1lb3V0IHVzZWQgd2hpbGUKLXdhaXRpbmcgZm9yIGFuIGFja25vd2xlZGdlbWVudCBvZiBhIHBhY2tldCB3aXRoIHRoZSBAY29kZXtzZXQKLXJldHJhbnNtaXQtdGltZW91dCBAdmFye3NlY29uZHN9fSBjb21tYW5kLiAgVGhlIGRlZmF1bHQgaXMgMyBzZWNvbmRzLgotWW91IGNhbiBpbnNwZWN0IGJvdGggdmFsdWVzIHdpdGggQGNvZGV7c2hvdyB0aW1lb3V0fSBhbmQgQGNvZGV7c2hvdwotcmV0cmFuc21pdC10aW1lb3V0fS4gIChUaGVzZSBjb21tYW5kcyBhcmUgQGVtcGh7b25seX0gYXZhaWxhYmxlIHdoZW4KLUB2YWx1ZXtHREJOfSBpcyBjb25maWd1cmVkIGZvciBAc2FtcHstLXRhcmdldD1taXBzLWlkdC1lY29mZn0uKQotCi1UaGUgdGltZW91dCBzZXQgYnkgQGNvZGV7c2V0IHRpbWVvdXR9IGRvZXMgbm90IGFwcGx5IHdoZW4gQHZhbHVle0dEQk59Ci1pcyB3YWl0aW5nIGZvciB5b3VyIHByb2dyYW0gdG8gc3RvcC4gIEluIHRoYXQgY2FzZSwgQHZhbHVle0dEQk59IHdhaXRzCi1mb3JldmVyIGJlY2F1c2UgaXQgaGFzIG5vIHdheSBvZiBrbm93aW5nIGhvdyBsb25nIHRoZSBwcm9ncmFtIGlzIGdvaW5nCi10byBydW4gYmVmb3JlIHN0b3BwaW5nLgotQGVuZCB0YWJsZQotCi1Abm9kZSBTaW11bGF0b3IKLUBzdWJzZWN0aW9uIFNpbXVsYXRlZCBDUFUgdGFyZ2V0Ci0KLUBjaW5kZXggc2ltdWxhdG9yCi1AY2luZGV4IHNpbXVsYXRvciwgWjgwMDAKLUBjaW5kZXggWjgwMDAgc2ltdWxhdG9yCi1AY2luZGV4IHNpbXVsYXRvciwgSDgvMzAwIG9yIEg4LzUwMAotQGNpbmRleCBIOC8zMDAgb3IgSDgvNTAwIHNpbXVsYXRvcgotQGNpbmRleCBzaW11bGF0b3IsIEhpdGFjaGkgU0gKLUBjaW5kZXggSGl0YWNoaSBTSCBzaW11bGF0b3IKLUBjaW5kZXggQ1BVIHNpbXVsYXRvcgotRm9yIHNvbWUgY29uZmlndXJhdGlvbnMsIEB2YWx1ZXtHREJOfSBpbmNsdWRlcyBhIENQVSBzaW11bGF0b3IgdGhhdCB5b3UKLWNhbiB1c2UgaW5zdGVhZCBvZiBhIGhhcmR3YXJlIENQVSB0byBkZWJ1ZyB5b3VyIHByb2dyYW1zLgotQ3VycmVudGx5LCBzaW11bGF0b3JzIGFyZSBhdmFpbGFibGUgZm9yIEFSTSwgRDEwViwgRDMwViwgRlIzMCwgSDgvMzAwLAotSDgvNTAwLCBpOTYwLCBNMzJSLCBNSVBTLCBNTjEwMjAwLCBNTjEwMzAwLCBQb3dlclBDLCBTSCwgU3BhcmMsIFY4NTAsCi1XNjUsIGFuZCBaODAwMC4KLQotQGNpbmRleCBzaW11bGF0b3IsIFo4MDAwCi1AY2luZGV4IFppbG9nIFo4MDAwIHNpbXVsYXRvcgotV2hlbiBjb25maWd1cmVkIGZvciBkZWJ1Z2dpbmcgWmlsb2cgWjgwMDAgdGFyZ2V0cywgQHZhbHVle0dEQk59IGluY2x1ZGVzCi1hIFo4MDAwIHNpbXVsYXRvci4KLQotRm9yIHRoZSBaODAwMCBmYW1pbHksIEBzYW1we3RhcmdldCBzaW19IHNpbXVsYXRlcyBlaXRoZXIgdGhlIFo4MDAyICh0aGUKLXVuc2VnbWVudGVkIHZhcmlhbnQgb2YgdGhlIFo4MDAwIGFyY2hpdGVjdHVyZSkgb3IgdGhlIFo4MDAxICh0aGUKLXNlZ21lbnRlZCB2YXJpYW50KS4gIFRoZSBzaW11bGF0b3IgcmVjb2duaXplcyB3aGljaCBhcmNoaXRlY3R1cmUgaXMKLWFwcHJvcHJpYXRlIGJ5IGluc3BlY3RpbmcgdGhlIG9iamVjdCBjb2RlLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHRhcmdldCBzaW0gQHZhcnthcmdzfQotQGtpbmRleCBzaW0KLUBraW5kZXggdGFyZ2V0IHNpbQotRGVidWcgcHJvZ3JhbXMgb24gYSBzaW11bGF0ZWQgQ1BVLiAgSWYgdGhlIHNpbXVsYXRvciBzdXBwb3J0cyBzZXR1cAotb3B0aW9ucywgc3BlY2lmeSB0aGVtIHZpYSBAdmFye2FyZ3N9LgotQGVuZCB0YWJsZQotCi1Abm9pbmRlbnQKLUFmdGVyIHNwZWNpZnlpbmcgdGhpcyB0YXJnZXQsIHlvdSBjYW4gZGVidWcgcHJvZ3JhbXMgZm9yIHRoZSBzaW11bGF0ZWQKLUNQVSBpbiB0aGUgc2FtZSBzdHlsZSBhcyBwcm9ncmFtcyBmb3IgeW91ciBob3N0IGNvbXB1dGVyOyB1c2UgdGhlCi1AY29kZXtmaWxlfSBjb21tYW5kIHRvIGxvYWQgYSBuZXcgcHJvZ3JhbSBpbWFnZSwgdGhlIEBjb2Rle3J1bn0gY29tbWFuZAotdG8gcnVuIHlvdXIgcHJvZ3JhbSwgYW5kIHNvIG9uLgotCi1BcyB3ZWxsIGFzIG1ha2luZyBhdmFpbGFibGUgYWxsIHRoZSB1c3VhbCBtYWNoaW5lIHJlZ2lzdGVycyAoc2VlCi1AY29kZXtpbmZvIHJlZ30pLCB0aGUgWjgwMDAgc2ltdWxhdG9yIHByb3ZpZGVzIHRocmVlIGFkZGl0aW9uYWwgaXRlbXMKLW9mIGluZm9ybWF0aW9uIGFzIHNwZWNpYWxseSBuYW1lZCByZWdpc3RlcnM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gY3ljbGVzCi1Db3VudHMgY2xvY2stdGlja3MgaW4gdGhlIHNpbXVsYXRvci4KLQotQGl0ZW0gaW5zdHMKLUNvdW50cyBpbnN0cnVjdGlvbnMgcnVuIGluIHRoZSBzaW11bGF0b3IuCi0KLUBpdGVtIHRpbWUKLUV4ZWN1dGlvbiB0aW1lIGluIDYwdGhzIG9mIGEgc2Vjb25kLiAKLUBlbmQgdGFibGUKLQotWW91IGNhbiByZWZlciB0byB0aGVzZSB2YWx1ZXMgaW4gQHZhbHVle0dEQk59IGV4cHJlc3Npb25zIHdpdGggdGhlIHVzdWFsCi1jb252ZW50aW9uczsgZm9yIGV4YW1wbGUsIEB3e0BzYW1we2IgZnB1dGMgaWYgJGN5Y2xlcz41MDAwfX0gc2V0cyBhCi1jb25kaXRpb25hbCBicmVha3BvaW50IHRoYXQgc3VzcGVuZHMgb25seSBhZnRlciBhdCBsZWFzdCA1MDAwCi1zaW11bGF0ZWQgY2xvY2sgdGlja3MuCi0KLUBjIG5lZWQgdG8gYWRkIG11Y2ggbW9yZSBkZXRhaWwgYWJvdXQgc2ltcyEKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvUkVBRE1FIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NmZjNzUuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1JbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaW91cyBleGVjdXRhYmxlcyBmb3VuZCBpbiB0aGlzIHRlc3Q6Ci0KLSAgICAgICAgICAgICBCRkQgICAgICAgICAgICAgIENQVSAgICAgT2JqZmlsZQotRXhlY3V0YWJsZSAgIFRhcmdldCAgICAgICAgICAgVHlwZSAgICBUeXBlICAgICBJbmZvIGFib3V0IGNvbXBpbGF0aW9uIG1hY2hpbmUKLS0tLS0tLS0tLS0gICAtLS0tLS0gICAgICAgICAgIC0tLS0gICAgLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaTQ4Ni1lbGYgICAgIGVsZi1saXR0bGUgICAgICAgaTQ4NiAgICBFTEYgICAgICBOQ1IgMzAwMCwgL3Vzci9jY3MvQVRUL2NjCi1pODYwLWVsZiAgICAgZWxmLWJpZyAgICAgICAgICBpODYwICAgIEVMRiAgICAgIFN0cmF0dXMKLW02OGstZWxmICAgICBlbGYtYmlnICAgICAgICAgIG02OGsgICAgRUxGICAgICAgQW1pZ2EgMzAwMCBVWCwgL3Vzci9jY3MvYmluL2NjCi1tNjhrLWFvdXQgICAgYS5vdXQtbmV3c29zMyAgICBtNjhrICAgIGEub3V0ICAgIFNvbnkgTkVXUwotbTY4ay1hb3V0MiAgIGEub3V0LXN1bm9zLWJpZyAgbTY4ayAgICBhLm91dCAgICBTdW5PUyA0LjEsIGdjYyBjeWdudXMtMi4wLjEKLXNwYXJjLWFvdXQgICBhLm91dC1zdW5vcy1iaWcgIHNwYXJjICAgYS5vdXQgICAgU3VuIDQsIFN1bk9TIDQuMS4xLCBnY2MgMi4xCi1zcGFyYy1lbGYgICAgZWxmLWJpZyAgICAgICAgICBzcGFyYyAgIEVMRiAgICAgIFN1biA0LCBTb2xhcmlzIDEuMCwgZ2NjIDIuMC4yCi1taXBzLWVjb2ZmICAgZWNvZmYtYmlnbWlwcyAgICBtaXBzICAgIGVjb2ZmICAgIElSSVggNC4wLjEKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYW5ub3RhMi5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYW5ub3RhMi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzUyZS4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Fubm90YTIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotY2xhc3MgQSB7Ci1wdWJsaWM6Ci0gIGludCB4OwotICBpbnQgeTsKLSAgaW50IGZvbyAoaW50IGFyZyk7Ci19OwotCi0KLWludCBBOjpmb28gKGludCBhcmcpCi17Ci0gIHggKz0gYXJnOwotICByZXR1cm4gYXJnICoyOwotfQotCi1pbnQgbWFpbigpCi17Ci0gIEEgYTsKLQotICBhLnggPSAwOwotICBhLnggPSAxOwotICBhLnkgPSAyOwotCi0gIHByaW50ZiAoImEueCBpcyAlZFxuIiwgYS54KTsKLSAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYW5ub3RhMi5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Fubm90YTIuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWJjNTUxLi4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYW5ub3RhMi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5OQotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBFbGVuYSBaYW5ub25pIChlemFubm9uaUBjeWdudXMuY29tKQotCi1pZiAkdHJhY2VsZXZlbCB0aGVuIHsKLSAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKLX0KLQotCi0jCi0jIHRlc3QgcnVubmluZyBwcm9ncmFtcwotIwotc2V0IHBybXNfaWQgMAotc2V0IGJ1Z19pZCAwCi0KLXNldCB0ZXN0ZmlsZSAiYW5ub3RhMiIKLXNldCBzcmNmaWxlICR7dGVzdGZpbGV9LmNjCi1zZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9Ci0KLWlmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYysrIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIiB9IHsKLSAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKLX0KLQotIyBhcmUgd2Ugb24gYSB0YXJnZXQgYm9hcmQ/IElmIHNvLCBkb24ndCBydW4gdGhlc2UgdGVzdHMuCi0jIG5vdGU6IHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgY2Fubm90IHVzZSBydW50b19tYWluICh3aGljaCB3b3VsZAotIyB3b3JrIGZvciByZW1vdGUgdGFyZ2V0cyB0b28pIGJlY2F1c2Ugb2YgdGhlIGRpZmZlcmVudCBwcm9tcHQgd2UgZ2V0Ci0jIHdoZW4gdXNpbmcgYW5ub3RhdGlvbiBsZXZlbCAyLgotIwotaWYgIVtpc25hdGl2ZV0gdGhlbiB7Ci0gICAgcmV0dXJuIDAKLX0KLQotCi1nZGJfZXhpdAotZ2RiX3N0YXJ0Ci1nZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKLWdkYl9sb2FkICR7YmluZmlsZX0KLQotaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfc3R1Yl0gewotICAgIGdkYl9zdGVwX2Zvcl9zdHViOwotfQotCi0jCi0jIGxpbmUgbnVtYmVyIHdoZXJlIHdlIG5lZWQgdG8gc3RvcCBpbiBtYWluCi0jCi1zZXQgbWFpbl9saW5lIDI1Ci0KLSMgVGhlIGNvbW1hbmRzIHdlIHRlc3QgaGVyZSBwcm9kdWNlIG1hbnkgbGluZXMgb2Ygb3V0cHV0OyBkaXNhYmxlICJwcmVzcyAKLSMgPHJldHVybj4gdG8gY29udGludWUiIHByb21wdHMuCi1zZW5kX2dkYiAic2V0IGhlaWdodCAwXG4iCi1nZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKLQotIwotIyBicmVhayBhdCBtYWluCi0jCi1nZGJfdGVzdCAiYnJlYWsgMjUiIFwKLSAgICAiQnJlYWtwb2ludC4qYXQuKiBmaWxlIC4qJHNyY2ZpbGUsIGxpbmUuKiIgXAotICAgICJicmVha3BvaW50IG1haW4iCi0KLQotIwotIyBOT1RFOiB0aGlzIHByb21wdCBpcyBPSyBvbmx5IHdoZW4gdGhlIGFubm90YXRpb24gbGV2ZWwgaXMgPiAxCi0jIE5PVEU6IFdoZW4gdGhpcyBwcm9tcHQgaXMgaW4gdXNlIHRoZSBnZGJfdGVzdCBwcm9jZWR1cmUgY2Fubm90IGJlIHVzZWQgYmVjYXVzZQotIyBpdCBhc3N1bWVzIHRoYXQgdGhlIGxhc3QgY2hhciBvZiB0aGUgZ2RiX3Byb21wdCBpcyBhIHdoaXRlIHNwYWNlLiBUaGlzIGlzIG5vdAotIyB0cnVlIHdpdGggdGhpcyBhbm5vdGF0ZWQgcHJvbXB0LiBTbyB3ZSBtdXN0IHVzZSBzZW5kX2dkYiBhbmQgZ2RiX2V4cGVjdC4KLSMKLQotc2V0IG9sZF9nZGJfcHJvbXB0ICRnZGJfcHJvbXB0Ci1zZXQgZ2RiX3Byb21wdCAiXHJcblwwMzJcMDMycHJlLXByb21wdFxyXG4kZ2RiX3Byb21wdCBcclxuXDAzMlwwMzJwcm9tcHRcclxuIgotCi1zZW5kX2dkYiAic2V0IGFubm90YXRlIDJcbiIgCi1nZGJfZXhwZWN0IHsKLSAgICAtcmUgInNldCBhbm5vdGF0ZSAyXHJcbiRnZGJfcHJvbXB0JCIgeyBwYXNzICJhbm5vdGF0aW9uIHNldCBhdCBsZXZlbCAyIiB9Ci0gICAgLXJlICIuKiRnZGJfcHJvbXB0JCIgICAgICAgeyBmYWlsICJhbm5vdGF0aW9uIHNldCBhdCBsZXZlbCAyIiB9Ci0gICAgdGltZW91dAkgICAgICAgICAgICB7IGZhaWwgImFubm90YXRpb24gc2V0IGF0IGxldmVsIDIgKHRpbWVvdXQpIiB9Ci0gIH0KLQotc2VuZF9nZGIgInJ1blxuIgotICBnZGJfZXhwZWN0IHsKLSAgICAtcmUgIlxyXG5cMDMyXDAzMnBvc3QtcHJvbXB0XHJcblN0YXJ0aW5nIHByb2dyYW06ICRiaW5maWxlIFwoXHJcblxyXG5cMDMyXDAzMmZyYW1lcy1pbnZhbGlkXCkrXChcclxuXHJcblwwMzJcMDMyYnJlYWtwb2ludHMtaW52YWxpZFwpKi4qXChcclxuXHJcblwwMzJcMDMyZnJhbWVzLWludmFsaWRcKSpcclxuXHJcblwwMzJcMDMyc3RhcnRpbmdcKFxyXG5cclxuXDAzMlwwMzJmcmFtZXMtaW52YWxpZFwpK1xyXG5cclxuXDAzMlwwMzJicmVha3BvaW50IDFcclxuXHJcbkJyZWFrcG9pbnQgMSwgXHJcblwwMzJcMDMyZnJhbWUtYmVnaW4gMCAkaGV4XHJcblxyXG5cMDMyXDAzMmZyYW1lLWZ1bmN0aW9uLW5hbWVcclxubWFpblxyXG5cMDMyXDAzMmZyYW1lLWFyZ3NcclxuIFxcKFxcKVxyXG5cMDMyXDAzMmZyYW1lLXNvdXJjZS1iZWdpblxyXG4gYXQgXHJcblwwMzJcMDMyZnJhbWUtc291cmNlLWZpbGVcclxuLiphbm5vdGEyLmNjXHJcblwwMzJcMDMyZnJhbWUtc291cmNlLWZpbGUtZW5kXHJcbjpcclxuXDAzMlwwMzJmcmFtZS1zb3VyY2UtbGluZVxyXG4kbWFpbl9saW5lXHJcblwwMzJcMDMyZnJhbWUtc291cmNlLWVuZFxyXG5cclxuXHJcblwwMzJcMDMyc291cmNlLiokc3JjZmlsZTokbWFpbl9saW5lOi4qOmJlZzokaGV4XHJcblxyXG5cMDMyXDAzMmZyYW1lLWVuZFxyXG5cclxuXDAzMlwwMzJzdG9wcGVkXHJcbiRnZGJfcHJvbXB0JCIgXAotCSAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJydW4gdW50aWwgbWFpbiBicmVha3BvaW50IiB9Ci0gICAgLXJlICIuKiRnZGJfcHJvbXB0JCIgICAgICAgeyBmYWlsICJydW4gdW50aWwgbWFpbiBicmVha3BvaW50IiB9Ci0gICAgdGltZW91dAkgICAgICAgICAgICB7IGZhaWwgInJ1biB1bnRpbCBtYWluIGJyZWFrcG9pbnQgKHRpbWVvdXQpIiB9Ci0gIH0KLQotIwotIyBwcmludCBjbGFzcyAnYScgd2l0aCBwdWJsaWMgZmllbGRzLgotIyB0aGlzIHdpbGwgdGVzdDoKLSMgYW5ub3RhdGUtZmllbGQtYmVnaW4KLSMgYW5ub3RhdGUtZmllbGQtbmFtZS1lbmQKLSMgYW5ub3RhdGUtZmllbGQtdmFsdWUKLSMgYW5ub3RhdGUtZmllbGQtZW5kCi0jCi1zZW5kX2dkYiAicHJpbnQgYVxuIgotZ2RiX2V4cGVjdCB7Ci0gIC1yZSAiXHJcblwwMzJcMDMycG9zdC1wcm9tcHRcclxuXHJcblwwMzJcMDMydmFsdWUtaGlzdG9yeS1iZWdpbiAxIC1cclxuLio9IFxyXG5cMDMyXDAzMnZhbHVlLWhpc3RvcnktdmFsdWVcclxuXFx7XHJcblwwMzJcMDMyZmllbGQtYmVnaW4gLVxyXG54XHJcblwwMzJcMDMyZmllbGQtbmFtZS1lbmRcclxuID0gXHJcblwwMzJcMDMyZmllbGQtdmFsdWVcclxuMVxyXG5cMDMyXDAzMmZpZWxkLWVuZFxyXG4sIFxyXG5cMDMyXDAzMmZpZWxkLWJlZ2luIC1cclxueVxyXG5cMDMyXDAzMmZpZWxkLW5hbWUtZW5kXHJcbiA9IFxyXG5cMDMyXDAzMmZpZWxkLXZhbHVlXHJcbjJcclxuXDAzMlwwMzJmaWVsZC1lbmRcclxuXFx9XHJcblxyXG5cMDMyXDAzMnZhbHVlLWhpc3RvcnktZW5kXHJcbiRnZGJfcHJvbXB0JCIgXAotCXsgcGFzcyAicHJpbnQgY2xhc3MiIH0KLSAgLXJlICIuKiRnZGJfcHJvbXB0JCIgICAgIHsgZmFpbCAicHJpbnQgY2xhc3MiIH0KLSAgdGltZW91dAkgICAgICAgICAgICB7IGZhaWwgInByaW50IGNsYXNzICh0aW1lb3V0KSIgfQotfQotCi0jCi0jIGNvbnRpbnVlIHVudGlsIGV4aXQKLSMgdGhpcyB3aWxsIHRlc3Q6Ci0jIGFubm90YXRlLWV4aXRlZAotIwotc2VuZF9nZGIgImNvbnRpbnVlXG4iCi1nZGJfZXhwZWN0IHsKLSAgLXJlICJcclxuXDAzMlwwMzJwb3N0LXByb21wdFxyXG5Db250aW51aW5nLlxyXG5cclxuXDAzMlwwMzJzdGFydGluZ1xyXG5cclxuXDAzMlwwMzJmcmFtZXMtaW52YWxpZFxyXG5hLnggaXMgMVxyXG5cclxuXDAzMlwwMzJmcmFtZXMtaW52YWxpZFxyXG5cclxuXDAzMlwwMzJleGl0ZWQgMFxyXG5cclxuUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkuXHJcblxyXG5cMDMyXDAzMmZyYW1lcy1pbnZhbGlkXHJcblxyXG5cMDMyXDAzMnN0b3BwZWRcclxuJGdkYl9wcm9tcHQkIiBcCi0JICB7IHBhc3MgImNvbnRpbnVlIHVudGlsIGV4aXQiIH0KLSAgLXJlICIuKiRnZGJfcHJvbXB0JCIgICAgIHsgZmFpbCAiY29udGludWUgdG8gZXhpdCIgfQotICB0aW1lb3V0CSAgICAgICAgICAgIHsgZmFpbCAiY29udGludWUgdG8gZXhpdCAodGltZW91dCkiIH0KLX0KLQotIwotIyBkZWxldGUgYWxsIGJyZWFrcG9pbnRzCi0jCi1zZW5kX2dkYiAiZGVsZXRlXG4iCi1nZGJfZXhwZWN0IHsKLSAgLXJlICIgIiB7Ci0gICAgICAgICAgIHNlbmRfZ2RiICJ5XG4iCi0gICAgICAgICAgIGdkYl9leHBlY3QgewotCSAgICAgLXJlICIgIiB7IHBhc3MgImRlbGV0ZSBicHMiIH0KLQkgICAgIC1yZSAiLiokZ2RiX3Byb21wdCQiIHsgZmFpbCAiZGVsZXRlIGJwcyIgfQotCSAgICAgdGltZW91dCAgeyBmYWlsICJkZWxldGUgYnBzICh0aW1lb3V0KSIgfQotCSB9Ci0gICAgIH0KLSAgLXJlICIuKiRnZGJfcHJvbXB0JCIgeyBmYWlsICJkZWxldGUgYnBzIiB9Ci0gIHRpbWVvdXQgIHsgZmFpbCAiZGVsZXRlIGJwcyAodGltZW91dCkiIH0KLX0KLQotIwotIyBicmVhayBhdCBmaXJzdCBsaW5lIG9mIG1haW4uIAotIwotc2VuZF9nZGIgImJyZWFrIDIyXG4iCi1nZGJfZXhwZWN0IHsKLSAgLXJlICAiXHJcblwwMzJcMDMycG9zdC1wcm9tcHRcclxuXHJcblwwMzJcMDMyYnJlYWtwb2ludHMtaW52YWxpZFxyXG5CcmVha3BvaW50LiphdCAkaGV4OiBmaWxlLiokc3JjZmlsZSwgbGluZS4qXHJcbiRnZGJfcHJvbXB0JCIgXAotCSAgICB7IHBhc3MgImJyZWFrcG9pbnQgYXQgbWFpbiIgfQotICAtcmUgIi4qJGdkYl9wcm9tcHQkIiAgICAgeyBmYWlsICJicmVhayBhdCBtYWluIiB9Ci0gIHRpbWVvdXQJICAgICAgICAgICAgeyBmYWlsICJicmVhayBhdCBtYWluICh0aW1lb3V0KSIgfQotfQotCi0jCi0jIGNoYW5nZSB2YWx1ZSBvZiBtYWluX2xpbmUKLSMKLXNldCBtYWluX2xpbmUgMjIKLQotIwotIyBydW4gcHJvZ3JhbSB1cCB0byBicmVha3BvaW50LgotIwotc2VuZF9nZGIgInJ1blxuIgotICBnZGJfZXhwZWN0IHsKLSAgICAtcmUgIlxyXG5cMDMyXDAzMnBvc3QtcHJvbXB0XHJcbi4qU3RhcnRpbmcgcHJvZ3JhbTogJGJpbmZpbGUgXChcclxuXHJcblwwMzJcMDMyZnJhbWVzLWludmFsaWRcKStcKFxyXG5cclxuXDAzMlwwMzJicmVha3BvaW50cy1pbnZhbGlkXCkqLipcKFxyXG5cclxuXDAzMlwwMzJmcmFtZXMtaW52YWxpZFwpKlxyXG5cclxuXDAzMlwwMzJzdGFydGluZ1woXHJcblxyXG5cMDMyXDAzMmZyYW1lcy1pbnZhbGlkXCkrXHJcblxyXG5cMDMyXDAzMmJyZWFrcG9pbnQgMlxyXG5cclxuQnJlYWtwb2ludCAyLCBcclxuXDAzMlwwMzJmcmFtZS1iZWdpbiAwICRoZXhcclxuXHJcblwwMzJcMDMyZnJhbWUtZnVuY3Rpb24tbmFtZVxyXG5tYWluXHJcblwwMzJcMDMyZnJhbWUtYXJnc1xyXG4gXFwoXFwpXHJcblwwMzJcMDMyZnJhbWUtc291cmNlLWJlZ2luXHJcbiBhdCBcclxuXDAzMlwwMzJmcmFtZS1zb3VyY2UtZmlsZVxyXG4uKmFubm90YTIuY2NcclxuXDAzMlwwMzJmcmFtZS1zb3VyY2UtZmlsZS1lbmRcclxuOlxyXG5cMDMyXDAzMmZyYW1lLXNvdXJjZS1saW5lXHJcbiRtYWluX2xpbmVcclxuXDAzMlwwMzJmcmFtZS1zb3VyY2UtZW5kXHJcblxyXG5cclxuXDAzMlwwMzJzb3VyY2UuKiRzcmNmaWxlOiRtYWluX2xpbmU6Lio6YmVnOiRoZXhcclxuXHJcblwwMzJcMDMyZnJhbWUtZW5kXHJcblxyXG5cMDMyXDAzMnN0b3BwZWRcclxuJGdkYl9wcm9tcHQkIiBcCi0JICAgICAgICAgICAgICAgICAgICB7IHBhc3MgInJ1biB1bnRpbCBtYWluIGJyZWFrcG9pbnQiIH0KLSAgICAtcmUgIi4qJGdkYl9wcm9tcHQkIiAgICAgICB7IGZhaWwgInJ1biB1bnRpbCBtYWluIGJyZWFrcG9pbnQiIH0KLSAgICB0aW1lb3V0CSAgICAgICAgICAgIHsgZmFpbCAicnVuIHVudGlsIG1haW4gYnJlYWtwb2ludCAodGltZW91dCkiIH0KLSAgfQotCi0jCi0jIHNldCB1cCBhIHdhdGNoIHBvaW50IG9uIGEueCAKLSMKLXNlbmRfZ2RiICJ3YXRjaCBhLnhcbiIKLWdkYl9leHBlY3QgewotICAgLXJlICJcclxuXDAzMlwwMzJwb3N0LXByb21wdFxyXG5cclxuXDAzMlwwMzJicmVha3BvaW50cy1pbnZhbGlkXHJcbldhdGNocG9pbnQgMzogYS54XHJcbiRnZGJfcHJvbXB0JCIgXAotCSAgIHsgcGFzcyAic2V0IHdhdGNoIG9uIGEueCIgfQotICAgLXJlICIuKiRnZGJfcHJvbXB0JCIgIHsgZmFpbCAic2V0IHdhdGNoIG9uIGEueCIgfQotICAgdGltZW91dCAgICB7IGZhaWwgInNldCB3YXRjaCBvbiBhLnggKHRpbWVvdXQpIiB9Ci19Ci0KLSMKLSMgZG8gYSBuZXh0LCBzbyB0aGF0IHRoZSB3YXRjaHBvaW50IHRyaWdnZXJzLiBUaGlzIHdpbGwgdGVzdDoKLSMgYW5ub3RhdGUtd2F0Y2hwb2ludAotIwotc2VuZF9nZGIgIm5leHRcbiIKLWdkYl9leHBlY3QgewotICAgLXJlICJcclxuXDAzMlwwMzJwb3N0LXByb21wdFxyXG5cclxuXDAzMlwwMzJzdGFydGluZ1xyXG5cclxuXDAzMlwwMzJmcmFtZXMtaW52YWxpZFxyXG5cclxuXDAzMlwwMzJmcmFtZXMtaW52YWxpZFxyXG5cclxuXDAzMlwwMzJmcmFtZXMtaW52YWxpZFxyXG5cclxuXDAzMlwwMzJ3YXRjaHBvaW50IDNcclxuV2F0Y2hwb2ludCAzOiBhLnhcclxuXHJcbk9sZCB2YWx1ZSA9IDBcclxuTmV3IHZhbHVlID0gMVxyXG5cclxuXDAzMlwwMzJmcmFtZS1iZWdpbiAwICRoZXhcclxuXHJcblwwMzJcMDMyZnJhbWUtZnVuY3Rpb24tbmFtZVxyXG5tYWluXHJcblwwMzJcMDMyZnJhbWUtYXJnc1xyXG4gXFwoXFwpXHJcblwwMzJcMDMyZnJhbWUtc291cmNlLWJlZ2luXHJcbiBhdCBcclxuXDAzMlwwMzJmcmFtZS1zb3VyY2UtZmlsZVxyXG4uKiRzcmNmaWxlXHJcblwwMzJcMDMyZnJhbWUtc291cmNlLWZpbGUtZW5kXHJcbjpcclxuXDAzMlwwMzJmcmFtZS1zb3VyY2UtbGluZVxyXG4kZGVjaW1hbFxyXG5cMDMyXDAzMmZyYW1lLXNvdXJjZS1lbmRcclxuXHJcblxyXG5cMDMyXDAzMnNvdXJjZSAuKiRzcmNmaWxlLipiZWc6JGhleFxyXG5cclxuXDAzMlwwMzJmcmFtZS1lbmRcclxuXHJcblwwMzJcMDMyc3RvcHBlZFxyXG4kZ2RiX3Byb21wdCQiIFwKLQkgICB7IHBhc3MgIndhdGNoIHRyaWdnZXJlZCBvbiBhLngiIH0KLSAgIC1yZSAiLiokZ2RiX3Byb21wdCQiICB7IGZhaWwgIndhdGNoIHRyaWdnZXJlZCBvbiBhLngiIH0KLSAgIHRpbWVvdXQgICAgeyBmYWlsICJ3YXRjaCB0cmlnZ2VyZWQgb24gYS54ICh0aW1lb3V0KSIgfQotfQotCi0KLSMKLSMgc2VuZCBeQyB0byBnZGIsIHNvIHRoYXQgdGhlIHF1aXQoKSBmdW5jdGlvbiBnZXRzIGNhbGxlZCAKLSMgYW5kIGFubm90YXRlLXF1aXQgaXMgdGVzdGVkCi0jIHRlc3Q6Ci0jIGFubm90YXRlLXF1aXQKLSMKLXNlbmRfZ2RiICJcMDAzIgotZ2RiX2V4cGVjdCB7Ci0gICAgLXJlICJcclxuXDAzMlwwMzJlcnJvci1iZWdpblxyXG5RdWl0XHJcblxyXG5cMDMyXDAzMnF1aXRcclxuJGdkYl9wcm9tcHQkIiBcCi0JICAgIHsgcGFzcyAiYW5ub3RhdGUtcXVpdCIgfQotICAgIC1yZSAiLiokZ2RiX3Byb21wdCQiIHsgZmFpbCAiYW5ub3RhdGUtcXVpdCIgfQotICAgIHRpbWVvdXQgeyBmYWlsICJhbm5vdGF0ZS1xdWl0ICh0aW1lb3V0KSIgfQotfQotCi0jCi0jIEZJWE1FOiB0aGUgdGVzdHN1aXRlIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlIHRlc3RzIGZvciAKLSMgICAgICAgIGFubm90YXRlX2NhdGNocG9pbnRzIGFuZCBhbm5vdGF0ZV9mdW5jdGlvbl9jYWxsCi0jICAgICAgICBhbmQgYSBmZXcgdmFyaWFudHMgb2YgdGhlIGFubm90YXRpb25zIHRoYXQgYXJlIAotIyAgICAgICAgdGVzdGVkIChtYXJrZWQgYnkgRklYTUUgb24gdGhlIGFubm90Py5leHAgZmlsZXMpCi0jCi0KLSMgcmVpbnN0YWxsIHRoZSBvbGQgcHJvbXB0IGZvciB0aGUgcmVzdCBvZiB0aGUgdGVzdHN1aXRlLgotCi1zZXQgZ2RiX3Byb21wdCAkb2xkX2dkYl9wcm9tcHQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY3Jvc3Nsb2FkLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY3Jvc3Nsb2FkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiYjdhMS4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Nyb3NzbG9hZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQotIyBSb2IgU2F2b3llIGNoYW5nZWQgaXQgdG8gdXNlIGdkYl90ZXN0IChyb2JAY3lnbnVzLmNvbSkKLQotaWYgJHRyYWNlbGV2ZWwgdGhlbiB7Ci0Jc3RyYWNlICR0cmFjZWxldmVsCi19Ci0KLXNldCBwcm1zX2lkIDAKLXNldCBidWdfaWQgMAotCi0jIEZJWE1FOiBUaGUgY29uZmlndXJlLmluIGZvciB0aGlzIHRlc3Qgc2hvdWxkIGxvb2sgZm9yIC0td2l0aC10YXJnZXRzCi0jIGFuZCBkZWFsIGFjY29yZGluZ2x5LiAgVW50aWwgdGhhdCBoYXMgYmVlbiBkb25lLCBza2lwIHRoZSB3aG9sZSB0aGluZy4KLSMgV2l0aCBhIG1pbmltYWwgYmZkICh0aGUgZGVmYXVsdCksIGZldyBpZiBhbnkgb2YgdGhlc2UgdGVzdHMgd29yay4KLQotdmVyYm9zZSAiRklYTUU6IGFsbCB0aGUgY3Jvc3Nsb2FkIHRlc3RzIGlnbm9yZWQiCi1yZXR1cm4KLQotZm9yZWFjaCBpICJtNjhrLWVsZiBtNjhrLWFvdXQgbTY4ay1hb3V0MiBtaXBzLWVjb2ZmIGk0ODYtZWxmIHNwYXJjLWFvdXQgaTg2MC1lbGYgc3BhcmMtZWxmIiB7Ci0gICAgcmVtb3RlX2V4ZWMgYnVpbGQgImNkICR7b2JqZGlyfS8ke3N1YmRpcn0gOyB1dWRlY29kZSAke3NyY2Rpcn0vJHtzdWJkaXJ9LyRpLnUgIgotfQotCi0jIEZJWE1FOiBUaGVzZSB0ZXN0cyBkb24ndCB3b3JrIGZvciB0aGUgaTk2MCwgYmVjYXVzZQotIyBiZmQvY29uZmlnL2k5NjAtYm91dC5tdCBzZXRzIFNFTEVDVF9WRUNTLiAgSSBjb3VsZCB1c2Ugc2V0dXBfeGZhaWwKLSMgZm9yIGVhY2ggdGVzdCwgYnV0IHJlYm9vdGluZyB0aGUgYm9hcmQgYmV0d2VlbiBlYWNoIG9uZSB0YWtlcyBhIGxvbmcKLSMgdGltZSBzbyBJJ20ganVzdCBwdW50aW5nIHRoZSB3aG9sZSBmaWxlLgotaWYgW2lzdGFyZ2V0ICJpOTYwLSotKiJdIHRoZW4gewotICAgIGlmICR2ZXJib3NlPjEgdGhlbiB7Ci0Jd2FybmluZyAiRklYTUU6IGNyb3NzbG9hZCB0ZXN0IGNhc2UgZG9lc24ndCBydW4gb24gdGhlIGk5NjAuIgotICAgIH0KLSAgICBjb250aW51ZQotfQotCi0jIEZJWE1FOiBUaGVzZSB0ZXN0cyBkb24ndCB3b3JrIGZvciB0aGUgYTI5aywgYmVjYXVzZSBTRUxFQ1RfVkVDUyBpcwotIyB1c2VkIHdoZW4gY29tcGlsaW5nIGJmZC4gIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhlcmUgd2VyZSBzb21lIGJldHRlcgotIyB3YXkgb2YgZGV0ZWN0aW5nIHRoaXMgY2FzZS4KLWlmIFtpc3RhcmdldCAiYTI5ay0qLSoiXSB0aGVuIHsKLSAgICBpZiAkdmVyYm9zZT4xIHRoZW4gewotCXdhcm5pbmcgIkZJWE1FOiBjcm9zc2xvYWQgdGVzdCBjYXNlIGRvZXNuJ3QgcnVuIG9uIHRoZSBhMjlrLiIKLSAgICB9Ci0gICAgY29udGludWUKLX0KLQotIyBUZXN0IGlmIGdkYiBjYW4gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgdGhlIGJmZCBmb3JtYXQgb2YgYW4KLSMgZXhlY3V0YWJsZSBhbmQgcmVhZCBpdCdzIHN5bWJvbHMuCi0KLXByb2MgYmZkZGVmYXVsdCB7fSB7Ci0gICAgZ2xvYmFsIEdEQgotICAgIGdsb2JhbCBHREJGTEFHUwotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIG9iamRpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZmlsZV9sb2FkZWQKLQotICAgIGdkYl91bmxvYWQKLSAgICBzZXQgZmlsZV9sb2FkZWQgMAotICAgIHNlbmRfZ2RiICJmaWxlICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZVxuIgotICAgIGdkYl9leHBlY3QgewotCS1yZSAiQSBwcm9ncmFtIGlzIGJlaW5nIGRlYnVnZ2VkIGFscmVhZHkuICBLaWxsIGl0Lip5IG9yIG4uIiB7Ci0JICAgIHNlbmRfZ2RiICJ5XG4iCi0JICAgIGV4cF9jb250aW51ZQotCX0KLQktcmUgIlJlYWRpbmcgc3ltYm9scyBmcm9tICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZVxbLlxdK2RvbmVcLi4qJGdkYl9wcm9tcHQgJCIgewotCSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQiCi0JfQotCS1yZSAiUmVhZGluZyBzeW1ib2xzIGZyb20gJG9iamRpci8kc3ViZGlyLyRiaW5maWxlXFsuXF0rLm5vIGRlYnVnZ2luZyBzeW1ib2xzIGZvdW5kLlxbLlxdK2RvbmVcLi4qJGdkYl9wcm9tcHQgJCIgewotCSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQgKGJ1dCBubyBzeW1ib2xzIGZvdW5kKSIKLQl9Ci0JLXJlICJGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZC4qJGdkYl9wcm9tcHQgJCIgewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQgKGZvcm1hdCBub3QgcmVjb2duaXplZCkiCi0JICAgIHJldHVybgotCX0KLQktcmUgIkZpbGUgZm9ybWF0IGlzIGFtYmlndW91cy4qJGdkYl9wcm9tcHQgJCIgewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQgKGZvcm1hdCBpcyBhbWJpZ3VvdXMpIgotCSAgICByZXR1cm4KLQl9Ci0JLXJlICIkZ2RiX3Byb21wdCAkIiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBhdXRvIGZvcm1hdCIKLQkgICAgcmV0dXJuCi0JfQotCXRpbWVvdXQgewotCSAgICBmYWlsICIodGltZW91dCkgJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGF1dG8gZm9ybWF0IgotCSAgICByZXR1cm4KLQl9CQotICAgIH0KLQotICAgIGlmIFtnZGJfdGVzdCAiaW5mbyB0YXJnZXQiICIuKmZpbGUgdHlwZSAkYmZkZm9ybWF0IiAiIl09PTAgdGhlbiB7Ci0Jc2V0IGZpbGVfbG9hZGVkIDEKLSAgICB9IGVsc2UgewotCWZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSB3cm9uZyBmb3JtYXQgZm91bmQiCi0gICAgfQotfQotCi0jIFRlc3QgaWYgZ2RiIGNhbiByZWFkIHN5bWJvbHMgZnJvbSBhbiBleGVjdXRhYmxlIHdoZW4gdGhlIGJmZCBmb3JtYXQKLSMgaXMgZXhwbGljaXRseSBzZXQgdmlhIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHTlVUQVJHRVQuCi0KLXByb2MgYmZkZXhwbGljaXQge30gewotICAgIGdsb2JhbCBHREIKLSAgICBnbG9iYWwgR0RCRkxBR1MKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgb2JqZGlyCi0gICAgZ2xvYmFsIGRldF9maWxlCi0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGZpbGVfbG9hZGVkCi0KLSAgICBnZGJfdW5sb2FkCi0gICAgc2V0IGZpbGVfbG9hZGVkIDAKLQotICAgICMgT25jZSBHREIgNC4xMCAodGhlIGxhc3QgdG8gbGFjayBgc2V0IGdudXRhcmdldCcpIGlzIGZvcmdvdHRlbiwKLSAgICAjIGNoYW5nZSB0aGlzIHRvIHVzZSBzZXQgZ251dGFyZ2V0LgotICAgaWYgW2dkYl90ZXN0ICJzZXQgZW52IEdOVVRBUkdFVD0kYmZkZm9ybWF0IiAiIiAiIl0hPTAgdGhlbiB7Ci0gICAgICAgZmFpbCAic2V0dGluZyBHTlVUQVJHRVQ9JGJmZGZvcm1hdCBpbiBlbnZpcm9ubWVudCIKLSAgICAgICByZXR1cm4KLSAgICB9Ci0KLSAgICBzZW5kX2dkYiAiZmlsZSAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGVcbiIKLSAgICBnZGJfZXhwZWN0IHsKLQktcmUgIkEgcHJvZ3JhbSBpcyBiZWluZyBkZWJ1Z2dlZCBhbHJlYWR5LiAgS2lsbCBpdC4qeSBvciBuLiIgewotCSAgICBzZW5kX2dkYiAieVxuIgotCSAgICBleHBfY29udGludWUKLQl9Ci0JLXJlICJSZWFkaW5nIHN5bWJvbHMgZnJvbSAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGVcWy5cXStkb25lXC4uKiRnZGJfcHJvbXB0ICQiIHsKLQkgICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGV4cGxpY2l0IGZvcm1hdCIKLQl9Ci0JLXJlICJJbnZhbGlkIHRhcmdldC4qJGdkYl9wcm9tcHQgJCIgewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgZXhwbGljaXQgZm9ybWF0IChpbnZhbGlkIHRhcmdldCkiCi0JICAgIHJldHVybgotCX0KLQktcmUgIiRnZGJfcHJvbXB0ICQiIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGV4cGxpY2l0IGZvcm1hdCIKLQkgICAgcmV0dXJuCi0JfQotCXRpbWVvdXQgewotCSAgICBmYWlsICIodGltZW91dCkgJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGV4cGxpY2l0IGZvcm1hdCIKLQkgICAgcmV0dXJuCi0JfQkKLSAgICB9Ci0KLSAgICBzZXQgZmlsZV9sb2FkZWQgMQotfQotCi1wcm9jIHRlc3RfcHR5cGVfZnVuY3Rpb25zIHt9IHsKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotICAgIGdsb2JhbCBkZXRfZmlsZQotICAgIHNlbmRfZ2RiICJwdHlwZSBtYWluXG4iCi0gICAgZ2RiX2V4cGVjdCB7Ci0JLXJlICJ0eXBlID0gaW50IFxbKShcXStcclxuJGdkYl9wcm9tcHQgJCIge30KLQl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpICRiaW5maWxlICgkYmZkZm9ybWF0KSBmdW5jdGlvbiBtYWluIiA7IHJldHVybiB9Ci0gICAgfQotCi0gICAgIyBzZXQgdXAgYSBsaXN0IG9mIGxpc3RzIG9mIGNvbW1hbmQgYW5kIHBhdHRlcm5zCi0gICAgc2V0IGNvbW1hbmQgW2xpc3QgeyAicHR5cGUgdl9jaGFyX2Z1bmMiICJ0eXBlID0oXCB1bnNpZ25lZFwgfFwgc2lnbmVkXCB8XCApY2hhciBcWykoXF0rIiB9XAotCSAgICAgICAgeyAicHR5cGUgdl9zaG9ydF9mdW5jIiAidHlwZSA9IChzaG9ydHxzaG9ydCBpbnQpIFxbKShcXSsiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfaW50X2Z1bmMiICJ0eXBlID0gaW50IFxbKShcXSsiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfbG9uZ19mdW5jIiAidHlwZSA9IChsb25nfGxvbmcgaW50fGludCkgXFspKFxdKyIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9mbG9hdF9mdW5jIiAidHlwZSA9IGZsb2F0IFxbKShcXSsiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZG91YmxlX2Z1bmMiICJ0eXBlID0gZG91YmxlIFxbKShcXSsiIH0gXQotCi0gICAgZm9yZWFjaCBpICRjb21tYW5kIHsKLQlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIGZ1bmN0aW9uIHR5cGVzIgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBwdHlwZSBmdW5jdGlvbiB0eXBlcyIKLX0KLQotIyBOb3RlIHRoYXQgcGxhaW4gY2hhcnMgY2FuIGJlIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQuCi0KLXByb2MgdGVzdF9wdHlwZV9wbGFpbl90eXBlcyB7fSB7Ci0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLQotICAgICMgc2V0IHVwIGEgbGlzdCBvZiBsaXN0cyBvZiBjb21tYW5kIGFuZCBwYXR0ZXJucwotICAgIHNldCBjb21tYW5kIFtsaXN0IHsgInB0eXBlIHZfY2hhciIgInR5cGUgPShcIHVuc2lnbmVkXCB8XCBzaWduZWRcIHxcICljaGFyIiB9XAotCSAgICAgICAgeyAicHR5cGUgdl9zaG9ydCIgInR5cGUgPSBzaG9ydCIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9pbnQiICJ0eXBlID0gaW50IiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2xvbmciICJ0eXBlID0gbG9uZyIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9mbG9hdCIgInR5cGUgPSBmbG9hdCIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9kb3VibGUiICJ0eXBlID0gZG91YmxlIiB9IF0KLQotICAgIGZvcmVhY2ggaSAkY29tbWFuZCB7Ci0JaWYgW2dkYl90ZXN0IFtsaW5kZXggJGkgMF0gW2xpbmRleCAkaSAxXSAiIl0gdGhlbiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBcIltsaW5kZXggJGkgMF1cIiBwbGFpbiBDIHR5cGVzIgotCSAgICByZXR1cm4KLSAgICB9Ci0gICAgfQotICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBwdHlwZSBwbGFpbiBDIHR5cGVzIgotfQotCi0jIE5vdGUgdGhhdCBpZiBjb21waWxlZCB3aXRoIHByZS1BTlNJIGNvbXBpbGVycywgdGhlICJzaWduZWQiIGtleXdvcmRzIGFyZQotIyBkZWZpbmVkIGF3YXkgYW5kIHRoZSB2YXJpYWJsZXMgZGVmYXVsdCB0byBwbGFpbiB0eXBlcy4gIFNvIGFjY2VwdCBlaXRoZXIuCi0KLXByb2MgdGVzdF9wdHlwZV9zaWduZWRfdHlwZXMge30gewotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGRldF9maWxlCi0KLSAgICAjIHNldCB1cCBhIGxpc3Qgb2YgbGlzdHMgb2YgY29tbWFuZCBhbmQgcGF0dGVybnMKLSAgICBzZXQgY29tbWFuZCBbbGlzdCB7ICJwdHlwZSB2X3NpZ25lZF9jaGFyIiAidHlwZSA9KFwgc2lnbmVkXCB8XCApY2hhciIgfVwKLQkgICAgICAgIHsgInB0eXBlIHZfc2lnbmVkX3Nob3J0IiAgInR5cGUgPShcIHNpZ25lZFwgfFwgKXNob3J0IiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X3NpZ25lZF9pbnQiICJ0eXBlID0oXCBzaWduZWRcIHxcIClpbnQiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfc2lnbmVkX2xvbmciICJ0eXBlID0oXCBzaWduZWRcIHxcIClsb25nIiB9IF0KLQotICAgIGZvcmVhY2ggaSAkY29tbWFuZCB7Ci0JaWYgW2dkYl90ZXN0IFtsaW5kZXggJGkgMF0gW2xpbmRleCAkaSAxXSAiIl0gdGhlbiB7Ci0JICAgIGlmIFtleHByIFtzdHJpbmcgbWF0Y2ggImVjb2ZmLWJpZ21pcHMiICRiZmRmb3JtYXRdK1tzdHJpbmcgbWF0Y2ggInB0eXBlIHZfc2lnbmVkX2NoYXIiIFtsaW5kZXggJGkgMF1dXT09MiB0aGVuIHsKLQkJc2V0dXBfeGZhaWwgIiotKi0qIgotCSAgICB9Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBcIltsaW5kZXggJGkgMF1cIiBzaWduZWQgQyB0eXBlcyIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgcHR5cGUgc2lnbmVkIEMgdHlwZXMiCi19Ci0KLXByb2MgdGVzdF9wdHlwZV91bnNpZ25lZF90eXBlcyB7fSB7Ci0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZGV0X2ZpbGUKLQotICAgICMgc2V0IHVwIGEgbGlzdCBvZiBsaXN0cyBvZiBjb21tYW5kIGFuZCBwYXR0ZXJucwotICAgIHNldCBjb21tYW5kIFtsaXN0IHsgInB0eXBlIHZfdW5zaWduZWRfY2hhciIgInR5cGUgPSB1bnNpZ25lZCBjaGFyIiB9XAotCSAgICAgICAgeyAicHR5cGUgdl91bnNpZ25lZF9zaG9ydCIgXAotCQkgICJ0eXBlID0gKHVuc2lnbmVkIHNob3J0fHNob3J0IHVuc2lnbmVkIGludCkiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfdW5zaWduZWRfaW50IiAidHlwZSA9IHVuc2lnbmVkIGludCIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl91bnNpZ25lZF9sb25nIiBcCi0JCSAgInR5cGUgPSAodW5zaWduZWQgbG9uZ3xsb25nIHVuc2lnbmVkIGludCkiIH0gXQotCi0gICAgZm9yZWFjaCBpICRjb21tYW5kIHsKLQlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIHVuc2lnbmVkIEMgdHlwZXMiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0gICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHB0eXBlIHVuc2lnbmVkIEMgdHlwZXMiCi19Ci0KLSMgTm90ZSB0aGF0IHBsYWluIGNoYXJzIGNhbiBiZSBlaXRoZXIgc2lnbmVkIG9yIHVuc2lnbmVkLgotCi1wcm9jIHRlc3RfcHR5cGVfYXJyYXlfdHlwZXMge30gewotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGRldF9maWxlCi0KLSAgICAjIHNldCB1cCBhIGxpc3Qgb2YgbGlzdHMgb2YgY29tbWFuZCBhbmQgcGF0dGVybnMKLSAgICBzZXQgY29tbWFuZCBbbGlzdCB7ICJwdHlwZSB2X2NoYXJfYXJyYXkiICJ0eXBlID0oXCB1bnNpZ25lZFwgfFwgc2lnbmVkXCB8XCApY2hhciBcXFxbMlxcXF0iIH1cCi0JICAgICAgICB7ICJwdHlwZSB2X3Nob3J0X2FycmF5IiAgXAotCQkgICJ0eXBlID0gKHNob3J0fHNob3J0IGludCkgXFxcWzJcXFxdIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2ludF9hcnJheSIgInR5cGUgPSBpbnQgXFxcWzJcXFxdIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2xvbmdfYXJyYXkiICJ0eXBlID0gKGxvbmd8bG9uZyBpbnQpIFxcXFsyXFxcXSIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9mbG9hdF9hcnJheSIgInR5cGUgPSBmbG9hdCBcXFxbMlxcXF0iIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZG91YmxlX2FycmF5IiAidHlwZSA9IGRvdWJsZSBcXFxbMlxcXF0iIH0gXQotCi0gICAgZm9yZWFjaCBpICRjb21tYW5kIHsKLQlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIEMgYXJyYXkgdHlwZXMiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0gICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHB0eXBlIEMgYXJyYXkgdHlwZXMiCi19Ci0KLXByb2MgdGVzdF9wdHlwZV9wb2ludGVyX3R5cGVzIHt9IHsKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotICAgIGdsb2JhbCBkZXRfZmlsZQotCi0gICAgIyBzZXQgdXAgYSBsaXN0IG9mIGxpc3RzIG9mIGNvbW1hbmQgYW5kIHBhdHRlcm5zCi0gICAgc2V0IGNvbW1hbmQgW2xpc3QgeyAicHR5cGUgdl9jaGFyX3BvaW50ZXIiICJ0eXBlID0oXCB1bnNpZ25lZFwgfFwgc2lnbmVkXCB8XCApY2hhciBcKiIgfVwKLQkgICAgICAgIHsgInB0eXBlIHZfc2hvcnRfcG9pbnRlciIgICJ0eXBlID0gKHNob3J0fHNob3J0IGludCkgXCoiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfaW50X3BvaW50ZXIiICJ0eXBlID0gaW50IFwqIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2xvbmdfcG9pbnRlciIgInR5cGUgPSAobG9uZ3xsb25nIGludCkgXCoiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZmxvYXRfcG9pbnRlciIgInR5cGUgPSBmbG9hdCBcKiIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9kb3VibGVfcG9pbnRlciIgInR5cGUgPSBkb3VibGUgXCoiIH0gXQotCi0gICAgZm9yZWFjaCBpICRjb21tYW5kIHsKLQlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIEMgcG9pbnRlciB0eXBlcyIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgcHR5cGUgQyBwb2ludGVyIHR5cGVzIgotfQotCi1wcm9jIGxvYWRhbmR0ZXN0IHsgYXJncyB9IHsKLSAgICBnbG9iYWwgdmVyYm9zZQotICAgIGdsb2JhbCBHREIKLSAgICBnbG9iYWwgR0RCRkxBR1MKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgb2JqZGlyCi0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGZpbGVfbG9hZGVkCi0KLSAgICBzZXQgYmluZmlsZSBbIGxpbmRleCAkYXJncyAwIF0KLSAgICBzZXQgYmZkZm9ybWF0IFsgbGluZGV4ICRhcmdzIDEgXQotICAgIHNldCBmaXhtZSBbIGxpbmRleCAkYXJncyAyIF0KLQotICAgIGlmICFbZmlsZSBleGlzdHMgJG9iamRpci8kc3ViZGlyLyRiaW5maWxlXSB0aGVuIHsKLSAgICAgICAgcGVycm9yICIkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGUgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0gICAgZ2RiX2V4aXQKLSAgICBnZGJfc3RhcnQKLSAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQotICAgIGJmZGRlZmF1bHQKLSAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggJGJmZGZvcm1hdCAiZWxmLWJpZyJdIHRoZW4gewotCWlmIFtzdHJpbmcgbWF0Y2ggJGJpbmZpbGUgImk4NjAtZWxmIl0gdGhlbiB7Ci0JICAgIHNldHVwX3hmYWlsICIqLSotKiIKLQl9Ci0gICAgfQotICAgIGJmZGV4cGxpY2l0Ci0gICAgaWYgJGZpbGVfbG9hZGVkPT0xIHRoZW4gewotCXRlc3RfcHR5cGVfZnVuY3Rpb25zCi0gICAgICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9Ci0JdGVzdF9wdHlwZV9wbGFpbl90eXBlcwotICAgICAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQotCXRlc3RfcHR5cGVfc2lnbmVkX3R5cGVzCi0gICAgICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9Ci0JdGVzdF9wdHlwZV91bnNpZ25lZF90eXBlcwotICAgICAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQotCXRlc3RfcHR5cGVfYXJyYXlfdHlwZXMKLSAgICAgICAgaWYgJGZpeG1lIHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KLQl0ZXN0X3B0eXBlX3BvaW50ZXJfdHlwZXMKLSAgICB9Ci19Ci0KLSMgUnVuIHRlc3RzIGZvciBlYWNoIG9mIHRoZSB0ZXN0IGV4ZWN1dGFibGVzLgotIyBJZiB0aGUgdGhpcmQgYXJndW1lbnQgaXMgMSwgdGhlIHRlc3RzIHdpbGwgYmUgZXhwZWN0ZWQgdG8gZmFpbC4KLSMgV2Ugc2hvdWxkIGV4dHJhY3QgdGhlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSB0ZXN0cyBhbmQgYmZkIGZvcm1hdHMKLSMgZnJvbSB0aGUgbWFrZWZpbGUgb3Igc29tZSBvdGhlciBjb250cm9sIGZpbGUgKEZJWE1FKS4KLQotbG9hZGFuZHRlc3QgbTY4ay1lbGYJImVsZjMyLW02OGsiCQkwCi0KLSMgSSdtIGdldHRpbmcgYW4gWFBBU1MgZm9yIGV4cGxpY2l0IGZvcm1hdCBvbiB0aGlzIG9uZQotbG9hZGFuZHRlc3QgbTY4ay1hb3V0CSJhLm91dC1uZXdzb3MzIgkJMQotCi1sb2FkYW5kdGVzdCBtNjhrLWFvdXQyCSJhLm91dC1zdW5vcy1iaWciCTAKLWxvYWRhbmR0ZXN0IG1pcHMtZWNvZmYJImVjb2ZmLWJpZ21pcHMiCQkwCi1sb2FkYW5kdGVzdCBpNDg2LWVsZgkiZWxmMzItaTM4NiIJCTAKLWxvYWRhbmR0ZXN0IHNwYXJjLWFvdXQJImEub3V0LXN1bm9zLWJpZyIJMAotbG9hZGFuZHRlc3Qgc3BhcmMtZWxmCSJlbGYzMi1zcGFyYyIJCTAKLQotI0ZJWE1FOiAgaTg2MCBzdXBwb3J0IGlzIHVubGlrZWx5IHRvIGJlIHdvcmtpbmcgaW4gdGhlIG5lYXIgZnV0dXJlCi0jIHNvIHN1cHByZXNzIHRoaXMgdGVzdCB1bnRpbCBpdCBpcyB3b3JraW5nLiAgLWZuZgotI2xvYWRhbmR0ZXN0IGk4NjAtZWxmCSJlbGYzMi1pODYwIgkJMAotCi1nZGJfdGVzdCAic2V0IGdudXRhcmdldCBhdXRvIiAiIgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pNDg2LWVsZi51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pNDg2LWVsZi51CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODIzMzhiLi4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvaTQ4Ni1lbGYudQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi1iZWdpbiA3NzcgaTQ4Ni1lbGYKLU0/VDUsMUAkISAwICAgICAgICAgICAgKCAgUCAhICAgIFcoKCQiIzAgICAhXCtAICAgICAgICMwICggICUKLU0gIkAgJTAgMSAgOCAgICBUICAgIC0oICQiICAgICAiQCAgICBIICAgICA0ICAgICAgICAgIFAgICAtMCAKLU0gICAgICAgICAgICAgISwgICAgICAgICAhICAgICAgICAgICEgICAgLSAgICAjMiAhIEAgICAgICogOCAKLU0gIkAmICAgJSAgICAgISAgICAkICAgITwhQCAgNyk4JCIgICAgICI0ICAgIDIgKCAgIDwgICAgICQgICAKLU0gQCAgICggJiAgIiBFQDAoICAgICAnICAgICAgICAgICFQICAgICAgICAgTz03LVIrVlFJOEJdTDo2KUMKLU0rRy1PK0MkICAgLCAgICAsICAgICFAICAgIEwgICAgKiAgICAgICAgICAgICAgICEgICAgICAgICAgKCAKLU0gICAkICAgICAgICAgIDQgICAgIyAgICAiICAgICBEICAgICcgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICQgICAiPEBAMCgnICAgICEoICAgICogICAgSSlAJCIgICAgICAxIC8nXyNQICAgJiI2ISBAJCAgICAKLU0kMCArICFAICAgITxBQDAoICAgICAhJCBcP1w/ICAgIEsoKCQiJCAgICAgMiAgICApQCAgIC8iNiEgQCAKLU0gICAgJDAjUV9SVCAgICMsQEAwKCAgICAgISggICAgUiAgICAvKDgkIiAwICAgIDEgIEggL1AgICArUiIKLU0hIEAgICAgICRAICAgJEQgICAhREVAMCggICAgICEkIFw/XT8gICAgQCk4JCIgICAgICAxIC8nXyAlXUMKLU07JjVBO0c1UCAlXUU7RjAgN1Y1Tj1GRVI7VlggN1Y1VDk3QVQgJiVUOTdBST0gIT85NjFBPSYkIDk3QUkKLU09ICE/OyZFQjdXOUU8Ry1JO1ZYIDdVXUY8Jy1UODcpVCAlXSczJF0iMDRRPzNUOSY0VDU0N1UxITBEUSUKLU03UCE/MSVFLjA0VSkwUCBPPTctUitWUUk4Ql1MOjYpQytHLU8rQyQgICciNiEgQCcgMCAgPSk4JCIgPCUKLU0gICFYRUAwKCFQRCAgJ1I2ISBAJyFQICBQUCAgIC9cVTopOCQiL1xFOyk4JCIgICAgICNfKTciNiEgQUgKLU0gICAgIC5HQF9fX19fUjVURUAwKDogQCAgICNJVC9fX19fXEU+KTgkIiZAMCAgICBaPCNfX19fXyk3UjYKLU0hIEFIJiAgICAuRlBfX19fOkAhSiAoT0w0S0I8QEAwKEE8IVQjNkI8QEAwKForO19fX14jUSAyWEApOCQKLU0iKDcgPSA3SEk/X19fVkBYQUAwKFopT19fX14rMTBCLTUoNDBCMTVARUAwKDRIVTUjJSkwWiVfX19fX0gKLU1DT19fX15AISAwICBAXDAsNC5CMF9fX186QCJYIDAgICApSCAgICAgIVAjVFBeTCYsXCNLICxHIzU4T0wKLU1aXzYwRCkjSyFDLyBaUCMpUFU2K1suT1VEKSIwWlA4U1AuTCBSPC01Ql5TS105IjBELkwmLFwjSyAsRyMKLU01OE9MWl82MEQpI0shQy8gWlAjKVBVNitbLk9VRCkiMFpQOFNQLkwgUjwtNUJeU0tdOSIwRC5MJixcI0sKLU0gLEcjNThPTFpfNjBEKSNLIUMvIFpQIylQVTYrWy5PVUQpIjBaUDhTUC5MIFI8LTVCXlNLXTkiMEQuTCYKLU0sXCNLICxHIzU4T0xaXzYwRCkjSyFDLyBaUCMpUFU2K1suT1VEKSIwWlA4U1AuTCBSPC01Ql5TS105IjAKLU1ELkwqVzA1IEFAMChaUCMpUFU2K1suT1FEKSIwWlBLPSE0QiYhIENLICxHIzU4T0xaXyYwRCkjSVxQJCAKLU0gKSMmIT9CNyEgQCBRQDVURVAwKCA8OCUuSTwkIiApRlFQNUxFUDAoIFAhRlFQNTxFUDAoISAhRlFQNCQKLU1FUDAoITAjJyExIjchIEAmICAgIFFQN1BFQDAoIVAgICAsPCVdKTgkIiBAICAgIychNkI3ISBAKSAgICAKLU1RUDdcRUAwKCJAICAgLDwlPik8JCIgTCAgICJBNCg4JCIqLFxFUDAoSDVCJiEgQkMjKTwkIiolNEFAMCgKLU1IUEI3ISBCQF4pPCQiKis0RVAwKEgnMjchIEJCLik8JCIqIFpFUDAoSE9CNiEgQUZINlI3ISBBRkhXUjcKLU0hIEFGSDVSNyEgQUZIVEI3ISBBRkgwMjchIEFGSFgiNyEgQkEkKTwkIiosPEVQMChIPyI2ISBCQ0MpPCQKLU0iKidURUAwKEhVIjchIEJBOik8JCIqL1BFUDAoSD9SNiEgQkMwKTwkIiolWEVQMChIViI3ISBCQS8pPCQKLU0iKi9ARVAwKEgwUjchIEJDKyk8JCIqJChFUDAoSFJCNyEgQychODI3ISBDWEVQMChRUDdMRVAwKD0pPCQKLU0iLDwlQik8JCIjSjchIEMnIT5CNyEgQUxFUDAoUVA2PEVQMCg3KTwkIiw8JSApPCQiIDI3ISBDJyE0UjcKLU0hIEAwRVAwKFFQNjRFUDAoXCk4JCIsPCU2KTwkIi8yNiEgQychNyI3ISBBSEVQMChRUDc8RVAwKF8pOCQKLU0iLDwlJik8JCInQjchIEMnIT1CNyEgQFxFUDAoUVA2QEVQMCgiKTwkIiw8JSkpPCQiICggICAjJyExMjcKLU0hIEAiICAgIFFQNjBGIDAoIDAgICAsPCVfKTwkIiAkICAgIkFGKTwkIiosIEYgMCg5SiY8RiAwKDlKLjQKLU1GIDAoUjwtNUJeU0khT1tfX1kgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsQSIKLU0gICAgICAgIDo0ICAgICAgICAgICAoIjYhIEAgICAgICAgICAgKioiISBCUkBAMChQSCgkIi0qIiEgQCEKLU0gICAgOiAgICAgUCAgICIoQEAwKCMwICAgI0ImISBAJCAgICBaKCAkIiA0ICAgI0xAMDAoIUAgICAiUiEKLU0hIEAqICAgID5QICAgIEwgICAgMCAgICAlMCAgICAgICAgICMgICAgOSk4JCIgKCAgICBAICAgICUgICAKLU0gISQgICAgNyAgICA6KCgkIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQgICAgICAgICAKLU0gICAgICAwIFw/XCAgICAgVSggJCIgICAgICAjICAkICAgICAgLkIgISBAICAgICAgUCAiICAgICAgIEwKLU1AMDAoICAgICAgLCAgUCAgICAgIFsoJCQiICAgICAgIyAgMCAgICAgICZCIiEgQCAgICAgIFAgJSAgICAKLU0gICIoQEAwKCAgICAgICwgIUAgICAgICBDKCgkIiAgICAgICMgIDwgICAgICAtUiIhIEAgICAgICBQICgKLU0gICAgICAgWEFAMCggICAgICAsICIwICAgICAgLyg4JCIgICAgICAjICBIICAgICAgJVI2ISBAICAgICAKLU0gUCArICAgICAgIURFQDAoICAgICAgLCAjICAgICAgIEApOCQiICAgICAgIyAgVCAgICAgIC8iNiEgQCAKLU0gICAgIFAgLiAgICAgICAgICAgICAgICAgICwgI1AgICAgICAgICAgICAgICAgICMgISAgICAgICAgICAKLU0gICAgICAgICBQIDEgICAgICAgICAgICAgICAgICAsICRAICAgICAgICAgICAgICAgICAjICEsICAgICAKLU0gICAgICAgICAgICAgUCA0ICBIICAgICAgICAgICAgICAgMCBcP1wxICAgICAgICAgICAgICAgJCAvJ18KLU0mICAgICAgICAgICAgICAgISAjUV9SMCAgICAgICAgICAgICAgIDAgXD9cTCAgICAgICAgICAgICAgICQKLU0gLydfLUAgICAgICAgICAgICAgICEgI1FfU1QgICAhLEBQMCgjMCAgICEoICIgISkgICAgXCk4JCIgMCAKLU0gICAxICBYIDVAICAgLzI2ISBAJCAgICAkMCAuICY0ICAgIFhBQDAoICAgICAhKCAiMCFLICAgIF4pOCQKLU0iICggICAgMSAgWCBAMCAgICMyJCEgQCEgQCAgJEAgKCAoOCAgICNcRUAwKCEgICAgISQgI0AiNCAgICAKLU0gKTwkIiAwICAgIDEgIFggSzAgICApUiIhIEA8ICAgICRAICAgKzggICAiREYgMCggICAgICEkIFw/XlsKLU0gICAgISk8JCIgKCAgICAxICBYIFMgICAgKVIjISBALSAgICAkQCAoIC4oICAgIChFUDAoIiAgICAhJCAKLU0jQCNLICAgICQpPCQiIDAgICAgMSAgWCBcMCAgIC1SIiEgQCAgICAgJEAgKCAvQCAgICA0RVAwKCEgICAKLU0gISQgI0AgIyAwICA4KTgkIiAwICAgIDEgIEwgIyAkICAhQjchIEAkICAgICQwIC4gIjAhICAgPEVQMCgKLU0iICAgICEkICNAIFAgMCAgKSk8JCIgMCAgICAxICBYIC4gJCAgJVIjISBALSAgICAkQCAoICRMISAgIEgKLU1FUDAoJCAgICAhJCAjQCE6IDAgIDcoOCQiICAgICAgMSAvJ184MCQgICNCNyEgQCIgICAgJDAgLiAnNCEKLU0gICBaRVAwKCAwICAgISQgI0AiJSAwICAvKTwkIiAwICAgIDEgIFggQzAkICAkIjchIEAoICAgICQwIC4KLU0gKiQhICAiTEBAMCgwICAgICEoICAgIkggMCAgOCk4JCIgMCAgICBBICBMIEwgJCAgLVIjISBALSAgICAKLU0kQCAoICtQISAgI1xAUDAoIzAgICAhKCAiICMxIDAgIDIpPCQiIDAgICAgMSAgWCBZQCQgICRSNyEgQCQKLU0gICAgJDAgLiAvMCEgICNQRUAwKCAgICAgISQgXD9fWyAwICA/KCwkIiBUICAgIDIgIEAgIiAoICAlIjcKLU0hIEAoICAgICQwIC4gIVQiICAhOEVQMCghICAgICEkICNAIFQgQCAgSygsJCIgVCAgICAyICBAIC9QKCAKLU0gJVI3ISBAIiAgICAkMCAuICRYIiAgICxBIDAoJDAgICAhKCAiICE7IEAgIFMoKCQiICAgICAgMiAgICAKLU04ICggICYiNyEgQCggICAgJDAgLiAnOCIgICFIRVAwKCEgICAgISQgI0AhXSBAICA7KTwkIiAoICAgIDEKLU0gIFggQTAoICAnIjchIEAkICAgICQwIC4gKTAiICAhVEVQMCggMCAgICEkICNAIkIgQCAgPik8JCIgMCAKLU0gICAxICBYIExAKCAgJ1I3ISBAJCAgICAkMCAuICwgIiAgIiBFUDAoISAgICAhJCAjQCM3IEAgIC8oOCQKLU0iIDAgICAgMSAgSCBZICggICROIyEgQCAgICAgJEAgKCAuUCIgICIkRVAwKCEgICAgISQgI0AjWyBAICAKLU1CKTwkIiAwICAgIDEgIFggJFAsICAoUjchIEAoICAgICQwIC4gIjgjICAiXEBAMCggICAgICEoICAgIFAKLU0gUCAgRSk8JCIgMCAgICAxICBYIDEwLCAgKUI3ISBAJCAgICAkMCAuICRQIyAgIURFQDAoICAgICAhJCAKLU1cP11CIFAgIEcpPCQiIDAgICAgMSAgWCA+MCwgICoiNyEgQCQgICAgJDAgLiAoSCMgICE8RUAwKCEgICAKLU0gISQgIlAiPCBQICBJKTwkIiFAICAgIDEgIFggSUAsICArUjchIEA4ICAgICQwIC4gKyAjICAjNEVQMCgKLU0gQCAgICEkICNAIl0gUCAgVik8JCIgMCAgICAxICBYIFMwLCAgLVI3ISBAJCAgICAkMCAuIC4sIyAgIEAKLU1BIDAoJDAgICAhKCAiICNRIFAgIE8oLCQiIFQgICAgMiAgQCAgUDAgICgiNiEgQCAgICAgJDAjUV9QUCQKLU0gICNARVAwKCIgICAgISQgI0AgOiEgICBaKTwkIiAwICAgIDEgIFggKkAwICAuUiMhIEAtICAgICRAICgKLU0gI1QkICAjTEVQMCghICAgICEkICNAITMhICAgXCk8JCIgQCAgICAxICBYIDggMCAgKEIiISBAICAgICAKLU0kQCAmICY4JCAgI1hFUDAoIDAgICAhJCAjQCFNISAgIF8pPCQiIDAgICAgMSAgWCA9MDAgICZSIyEgQC0KLU0gICAgJEAgKCAoSCQgICAgRiAwKEQgICAgISQgI0AiMSEgICBDKCwkIiBUICAgIDIgIEAgSTAwICApIjgKLU0hIEAkICAgICQwIC4gKlwkICAiNEYgMCgiICAgICEkICNAIlghICAgUygsJCIgVCAgICAyICBAIFMgMCAKLU0gKVI4ISBAKCAgICAkMCAuICAhSS0jQFYrRjVMOUAhQzxHMFErRywgOFcpVDoyWVMgJzlBOyc1RTxSVTgKLU09IllDICY9RDhGVUUrRiwgPFZBPzkmJVQ4MllDICYtUj0mWE48UCFWN1YtSDg3KT85RzVOOFAhVjdXLUkKLU05VllFOSVdSTtHMCA9RV1VO0ctSTlWWUU5JV1JO0cwIDdWOUk7RkQgPUVdVTtHLUk5VllFOSVdQzomJVIKLU03ViVSPEYlWSAmVUE6NlggPUVdUzo2PU45NjE/OyZdTjlQIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdXIU8KLU06NllUOTcoIDdWLUw5NiVOPTcgIDdWNU45ICFWN1c1TjxWRUc7RjVEN1ctSDtXKVQgJzk/PTZZUzo2PU4KLU05NjE/PFZBTzxHMT85RzVOOFAhVjdWMU89NilMOTAhVjdWRU49ICE/PFcxQTxHMCA7Rl1OPCcpSTs2JVIKLU0+MCE/OTZZVjo3KU87QCFWN1c1TjxWRUc7RjVEN1ZRTztGPT88Jl1JO0cxRTxAIVY3VkVOPSVdQTxHKUEKLU0+MCFQPEZFTTg3KVkgJzk/PFZFRztGNUQ3Vi1IODcpPzlHNU44UCFWN1YxTz02KUw5NV1BPEcpQT4wIT8KLU05NzFFPicwID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3Vi1IODcoID1FXUYKLU07Jl1BPSAhVjdXLUk5VllFOSVdTDtWWUc3ViVSPEYlWSAmJVQ5N0FJPSAhRTtHOUk8Rl1OICc5PzsmXU4KLU05VV1GPTZZQyAnOT89NllTOjY9Tjk2MT87Jl1OOVVdRj02WUMgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWJVIKLU08RiVZICc5Pzo2WVQ3VyFPOjZZVDk3KCA3VjVEODcxQSAnOT88VkFPPEcxPzlHNU44UCFWN1c1TjxWRUcKLU07RjVEN1ZFTj0lXUE8RylBPjAhVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJzk/OjZZVDdWOVUKLU07RiwgPUVdUzo2PU45NjE/PFZBTzxHMCA9RV1GOyZdQT0lXUY9NllDICY1WDo3MCA9RV1VO0ctSTlWWUUKLU05JV1MO1ZZRzdWJVI8RiVZICc5PzsmXU45UCFWN1ctSDtXKVQgJzk/OyZdTjlVXVA7VkVOPSY1UiAnOT8KLU08VkVHO0Y1RDdWLUg4NyggPUVdVTtHLUk5VllFOSVdTDtWWUcgJzk/PFZBTzxHMT84NylSODdEID1FXVUKLU07Ry1JOVZZRTklXVM6Jl1SPSVdQTxHKUE+MCE/OyZFQjdXOUU8Ry1JO1ZYIDdWVUM7VzVOPSAhVjdWLUgKLU04Nyk/PCZdSTtHMUU8QCFWN1c1TjxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRTxAIVY3Vy1JOVZZRTklXUkKLU07RzE/ODcpUjg3RCA3VV1GPCctVDg3KVQgJzk/PFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICctPzsmRU4KLU06UCE/MVRRLzBEJSw3VF0mMUUtJTUlXTQwNCksMTVcID1FXVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUUKLU08QCFWN1YxTz02KUw5NV1QO1ZFTj0mNVIgJV0/OyZdTjlWMU89NilMOTVdVTxWNUQgJzk/PFcxUj02LVQKLU0sMCFWN1ctVDxHNUM9IyggPUVdQzomJVI3ViVSPEYlWSAnOT85RlFPODcxPzwmXUk7RzFFPEAhVjdXLUkKLU05VllFOSVdTDtWWUc3VyFPOjZZVDk3KCA9RV1EO1c1QjsmNT85RzVOOFAhVjdXLUk5VllFOSVdSTtHMT8KLU05RzVOOFAhPzElRS4wNFUpMFAhVjdWOUw7ViVUN1YlUjxGJVkgJzk/PFZBTzxHMT88Jl1JO0cxRTxAIVYKLU03Vy1JOVZZRTklXUw7VllHN1Y5VTtGLCA9RV1TOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSICc5PzsmXU4KLU05VV1BPEcpQT4wIT86NllJPSAhVjdWLUg4NyggOFZRVTtGTUU8QCFWN1c1TjxWRUc7RjVEN1YtSDg3KT8KLU05RzVOOFAhVTdWUUk7RkwgPUVdUzo2PU45NjE/PFZBTzxHMT85RzVOOFAhUzwmXVI9Jy1DODcoID1FXVUKLU07RkVPO0MoID1FXVU7Ry1JOVZZRTklXUk7RzE/OUc1TjhQIVY3VzVOOjZdTiAgIE46NllUOTcpUCAiWUgKLU04Ny1IICJZRD42WVM+NlQgK0YxWTtHLVQ8QCBOPEY1TCtHIUw9ICBOOjZZST0gIE48JlFUICJZVDk3QVQKLU0gIllGOjZZSSAiWVI7VjFBPSYkICtGMUE9JiQgK0Y9Tz0gIE45J0VOODZVSThQIE44Ry1TICJZUz42VVQKLU04NiggK0ctVDxHMUE4QCBOPFZBUz0nKVQ4NiggK0YtTzs2VUU7RzAgK0YxRThHNUcgIllMOjZZRSAkIEgKLU0oUkVMOjYpQys2RFMuIzhaOyZFQjhSVUksU0BWK1YtUz0yXUM8RzBRK0csKSwyWFEuICFBPFNIQColLSMKLU0xJDRJKCM0TiwiIEAsIzBPLDNETy4zICAwIkBDKjZRSThGLE06MyxYLUNJQzxXNE84VylUOjJZUyIzJE4KLU0sQCFBPFNIQColLSMxJDRJKCM0TiwiIEAsIzBPLDNETy4zICAwIkBDKjZRSThGLE08Jl1SPSNJRzk2WE8KLU09RiVMPTY1Uys1QVQrRiwpLDJYUyAkIEgoUkVMOjYpQy5GRU44Ul1TPjZZTztHRU08UllIIjMkTixTLCAKLU0wIkBDKjZBRTg2MFo7NiVUOiJZSCIzKE4sMyROLDJYUi1QIUE4Vl1NPCNIQColLSMxJDRJKCM0TiwiIEAKLU0sIzBPLDNETy4zICA7VyFUOjZUWigiQTMwVDElKjIgVStDIEAoIyBUK1MkWStTRFAgJiVTLkIgSDRULSQKLU0xMkRALTJYUCgiIFAtIlxRLjJcWSwgIUE4Vl1NPCNIQColLSMxJDRJKCM0TiwiIEAsIzBPLDNETy4zICAKLU04NyxaKCJBMzBUMSUqMiBVK0MgQCgjIFQrUyRZK1NEUCAkIEgoUkVMOjYpQys2RFMuIzhaOVY1TitXLUgKLU03VjFBPSYkTjhQRFErQywgODYtTzs3IFooIkEzMFQxJSoyIFUrQyBAKCMgVCtTJFkrU0RQICZdUD0mRU0KLU0uQiBINFQtJDEyREAtMlhQKCIgUC0iXFEuMlxZLCAhQTxTSEAqJS0jMSQ0SSgjNE4sIiBALCMwTywzRE8KLU0uMyAgMCJAQyo2UUk4RixNOjMsWC1DSUw6NilDKzZEUy4jOE84Vy1VK1YtUj0mWE48UERRK0M0IDg3LFoKLU0oIkEzMFQxJSoyIFUrQyBAKCMgVCtTJFkrU0RQICIhTDkiIFooIkEzMFQxJSoyIFUrQyBAKCMgVCtTJFkKLU0rU0RQICAgICtAICAgISQgJEAhUCVAICAuICFHOSYpTTkyWUMgIzghIDAgICAhJCEzKCwkIiIkIS04OCQKLU0iIDghICAgICAhVCAgICAzICEoIDNAJCAgI0AgPSVdUz0nKVU4VzAgTUAgOCAgICAqQCAgICBUICRAIVUKLU0gICAgLiAhVjdWLUg4Nyk/OzY1TThGNVIgJTQgIDAgQyAgOCAhICAgICAgJypQICAgIFQgJEAiQCAgICAKLU0uICFWN1ctSDtXKVQ3VlVFOzYpRTxAITUgIDAgKFAgJiAgMCIgICAgIVJEICAgIC0gISggUjAgICAjQCAKLU09RV1JO0cxPzs2NU04RjVSICU0ICFQIEMgIDggISAwICAgICcqQCAgICBUICRAI1MgICAgLiAhVjdWUU8KLU07Rj0/OzY1TThGNVIgJTQgIkAgQyAgOCAhIEAgICAgJypQICAgIFQgJEAgPiAwICAuICFWN1Y5TDtWJVQKLU03VlVFOzYpRTxAITUgIFggKFAgJiAgMCwgICAgIVJQICAgIC0gISggMkAkICAjQCA9RV1EO1c1QjsmNT8KLU07NjVNOEY1UiAlNCAjUCBDICA4ICEhICAgICAnISAgICAhTCAgICAzICEoIDsgKCAgI0AgK0MhRjg2TUUKLU0gKzggJiAgICAiSCAgICAtICEoIERQJCAgI0AgPUVdQzomJVI3VlVFOzYpRTxAITUgICQgKFAgJiAgMCAKLU0gICAgIVJMICAgIC0gISggT0AkICAjQCA9RV1TOiZdUj0lXU05NlVCOTcoIDUwICQgIiwgIUAgJCBAICAKLU0gIDxJICAgICMwIDIgLjwhICAgWCAnOT86NllUN1ZVRTs2KUU8QCE1ICA8IChQICYgIDAkICAgICFSSCAKLU0gICAtICEoICQwKCAgI0AgPUVdTDtWWUc3VlVFOzYpRTxAITUgIEggKFAgJiAgMCggICAgIVJMICAgIC0KLU0gISggLyAoICAjQCA9RV1GOyZdQT0lXU05NlVCOTcoIDUwIC4gIiwgIUAgJCMgICAgIDxMICAgICMwIDIKLU0gJkAiICAgWCAnOT85Jl1VOEZRRTdWVUU7NilFPEAhNSAgXCAoUCAmICAwMCAgICAhUDAgICAgPCAgICAKLU0lUCAyIChMIyAgIFggJzE/PTZZSTtWWCBNQCAoICAgICpAICAgIFQgJEAiUiBAICAuICFWN1YtSDg3KT8KLU07NjVNOEY1UiAlNCAgMCBDICA4ICEgICAgICAnKlAgICAgVCAkQCM9IEAgIC4gIVY3Vy1IO1cpVDdWVUUKLU07NilFPEAhNSAgMCAoUCAmICAwICAgICAhUkQgICAgLSAhKCAhQCwgICNAID1FXUk7RzE/OzY1TThGNVIKLU0gJTQgIVAgQyAgOCAhICAgICAgJypAICAgIFQgJEAgUCBQICAuICFWN1ZRTztGPT87NjVNOEY1UiAlNCAKLU0iQCBDICA4ICEgICAgICAnKlAgICAgVCAkQCE7IFAgIC4gIVY3VjlMO1YlVDdWVUU7NilFPEAhNSAgWCAKLU0oUCAmICAwICAgICAhUlAgICAgLSAhKCBBUCwgICNAID1FXUQ7VzVCOyY1Pzs2NU04RjVSICU0ICNQIEMKLU0gIDggISAgICAgICchICAgICFMICAgIDcgISggSjAwICAjQCArQyVGODZNRSArOCAiICAgICJIICAgIC0KLU0gISggVCAsICAjQCA9RV1DOiYlUjdWVUU7NilFPEAhNSAgJCAoUCAmICAwICAgICAhUkwgICAgLSAhKCAKLU1eUCwgICNAID1FXVM6Jl1SPSVdTTk2VUI5NyggNTAgJCAiLCAhQCAkICAgICAgPEkgICAgIzAgMiAiMCQKLU0gICBYICc5Pzo2WVQ3VlVFOzYpRTxAITUgIDwgKFAgJiAgMCAgICAgIVJIICAgIC0gISggM0AwICAjQCAKLU09RV1MO1ZZRzdWVUU7NilFPEAhNSAgSCAoUCAmICAwICAgICAhUkwgICAgLSAhKCA+MDAgICNAID1FXUYKLU07Jl1BPSVdTTk2VUI5NyggNTAgLiAiLCAhQCAkICAgICAgPEwgICAgIzAgMiAqNCQgICBYICc5PzkmXVUKLU04RlFFN1ZVRTs2KUU8QCE1ICBcIChQICYgIDAgICAgICFQMCAgICBKICAgICFAIDIgLTwkICAgWCAnOT8KLU04VkFBPEVdRj02WUMgJTQgIDAgMSA0UiMhIEBBIDVGIyEgQCQgICAgLDAgICAgOCAkQCAsITAgIC4gIVYKLU03Vy1JOVZZRTklXUM6JiVSN1Y5VTtGLCA1MCAiICEkITcoLCQiIiQhOjgsJCIgMCAgICBTICAgICFAIDIKLU0gJCwlICAgWCAnOT89NllTOjY9Tjk2MT84VkFBPEVdRj02WUMgJTQgIFAgMSA2UiMhIEBBIDdGIyEgQCQKLU0gICAgKlAgICAgOCAkQCFSITAgIC4gIVY3Vy1IO1cpVDdWOVU7RiwgNTAgJCAhJCE/KCwkIiIkIUI4LCQKLU0iIDAgICAgUiAgICAhQCAyICpAJSAgIFggJzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgNTAgJSAhJCEKLU1DKCwkIiIkIUY4LCQiIDAgICAgVCAgICAhQCAyIC4gJSAgIFggJzk/PTZZUzo2PU45NjE/PFZBTzxHMT8KLU05RzVOOFAhNSAgOCAkMCY8QFAwKCgwJklAUDAoISAgICAiRCAgICAmICEoICMwOCAgI0AgPUVdSTtHMT8KLU05RzVOOFAhNSAgPCAkMCZMQFAwKCgwJllAUDAoISAgICAjICAgICAmICEoIDAwOCAgI0AgPUVdUzo2PU4KLU05NjE/OjZZVDdWOVU7RiwgNTAgKCAhJCFPKCwkIiIkIVI4LCQiIDAgICAgUiAgICAhQCAyICc8JiAgIFgKLU0gJzk/PTZZUzo2PU45NjE/OjZZVDdWOVU7RiwgNTAgKSAhJCFTKCwkIiIkIVY4LCQiIDAgICAgSiAgICAKLU0hQCAyICo0JiAgIFggJzk/OyZdTjlVXUY9NllDICU0ICJAIDEgPVIjISBAQSA+RiMhIEAkICAgICwwICAKLU0gIDggJEAjOiFAICAuICFWN1ctSTlWWUU5JV1MO1ZZRzdWOVU7RiwgNTAgKyAhJCFbKCwkIiIkIV44LCQKLU0iIDAgICAgUyAgICAhQCAyICEkJyAgIFggJzk/PTZZUzo2PU45NjE/OyZdTjlVXUY9NllDICU0ICMgIDEKLU0gP1IjISBAQSAwRiQhIEAkICAgICpQICAgIDggJEAhICFQICAuICFWN1Y5TDtWJVQ3VjlVO0YsIDUwIC4KLU0gISQhIygwJCIiJCEnODAkIiAwICAgIEwgICAgIUAgMiAnICcgICBYICc5PzkmXVU4RlFFN1Y5VTtGLCAKLU01MCAvICEkISgoMCQiIiQhLDgwJCIgMCAgICA1ICAgICUwIDIgKlgnICAiIyAgNCAgPkgnICAgNSAgICAKLU0hMCAyIClIJyAgIiMgIDQgID5IJyAgIDAgICAgITAgMiAqSCcgICE1ICA8ICEgICAgI1AgICAgISAhKCAKLU1aQDwgICk0ICAgIkMgIkAgICBAICAgICAgICAgICAgICIgICAgICAgIDAgICAgICggICAgICAgIiAgICAKLU0iJyggK0AgICAhRCAgICAzICEoID5QQCAgI0AgOyZFTjpQIlYgKUAgICAgRiAgICAjMCAyICJEKCAgIFgKLU0gJllFPicwIEBQICUgICdKIVAgIChQICYgIDAgICAgICFSSCAgICAtICEoIDRQQCAgI0AgOyZFTjpWOVUKLU07RiwgQFAgJSAgJVAhUCAgKFAgJiAgMCQgICAgIVIwICAgIC0gISggPVBAICAjQCA8VzFVOUY4IDxAIk4KLU0hUCAgKFAgJiAgMCggICAgIVAwICAgIDUgICAgJTAgMiArRCggICIjICA0ICA+SCcgICA1ICAgICEwIDIKLU0gKjQoICAiIyAgNCAgPkgnICAgMCAgICAhMCAyICs0KCAgITUgIDwgISAgICAjUCAgICAhICEoIF0wQCAKLU0gKTQgICAiQyAiQCAgIEAgICAgICAgICAgICAgIiAgICAgICAgMCAgICAgKCAgICAgICAiICAgICInKCAKLU0rQCAgICFQICAgIDcgISggQjBEICAjQCA9JzU/OyZFTjpQIlYgKSAgICAgRiAgICAjMCAyICM8KSAgIFgKLU0gJllFPicwIEBQICUgICdKIVAgIChQICYgIDAgICAgICFSSCAgICAtICEoIDgwRCAgI0AgOyZFTjpWOVUKLU07RiwgQFAgJSAgJVsiICAgKFAgJiAgMCAgICAgIVIwICAgIC0gISggQTBEICAjQCA8VzFVOUY4IDxAIlkKLU0iICAgKFAgJiAgMCAgICAgIVAwICAgIFogICAgISAgMiAsPCkgICBYICJYUjlGJUs5MCJWICAwICAgI1MKLU0gIUwgIEAgICAmKUw9NjQgIDAgICAmPVI5NjVOICAgICAgIVI5NjAgISAgICAjWCAgICAkICEoICIwSCAKLU0gI0AgOFZdTDtXKVMgKzggISAgICAvLCAnUCAiICAgIDwmRU46UCAhICAgIDwnNVI8JlFFICAgICAgIVkKLU05NlFMO1c8ICEgICAgIyggICAgJCAhKCAvUEggICNAICtDLUY4Nk1FICs4ICEgICAgLywgJFAgISAgICAKLU05Rl1SOSAgICAgICA4VkFFPUdEICEgICAgIyQgICAgJCAhKCA9IEggICNAIDhWJVI8UCJWICAwICAgI1MKLU0gITAgIDAgICAnIU88Ry1DOiY0ICAgICAgJilNPVAgJCAgICAsQCAgICAwICRAIkoiQCAgLiAgTi0mOUEKLU06VjQgTUAgJCAgICBcUCAzICAkICAgITQ0RTUlICAgICAgISYwNFEzMTAgJCAgICAnICAgICE4ICRAIyYKLU0iQCAgLiAhQjtWXUw5NiVOICcoID0gSCAgIyQgICAgJCAhKCBeUEggICNAIDhHOUE7JywgTUAgJCAgICAKLU1cUCAzICAkICAgIVQ8RzVFICAgICAgIUY4NlFTOTAgJCAgICAnMCAgICE4ICRAIDgiUCAgLiAhQjtWXUwKLU05NiVOLEAhUiAsOCogICEmICAgICEgIDIgJigrICAgWCAmVUk8Vl1SOSY1Ujk2MCBNQCAkICAgIFxQIEMKLU0gICwgICAhVDonKUU5MCAgICAgID5GNVI7UCAhICAgIDtWWUUgICggICAhVD1WXCAhICAgICIsICAgICYKLU0gISggQjBMICAjQCA7NiVJO0AhNSAgPCAkMCRUQSAwKCgwJFVBQDAoISAgICAiPCAgICAnICEoIEwgTCAKLU0gI0AgPFchTzxHMVM4ViVSICcoIC9QSCAgIiwgITAgI0QpQCQiIjQgICAgJyAhKCBVMEwgICNAIDhWUVUKLU07Rk1FPEAhUiAgRCogICBDICA0ICBfUjchIEBIICAgICFQIDIgL1QrICAgWCAmWU87RyFSOjZVQTxHRCAKLU08QCMnIjAgIChQICUgICw0RVAwKCkwICAgIDwgJEAgQiMgICAuICFQPEZFTTg3KVkgJyggQjBEICAiLCAKLU0hMCAjKSk8JCIiMCAgICAnICEoIDFAUCAgI0AgPTVdTDo2WUsgJyggXTBAICAiLCAhMCAjIClAJCIiPCAKLU0gICAnICEoIDswUCAgI0AgPFVdTDo2WUsgKCwgITAgIVpAPCAgIiwgITAgI0YpPCQiIjggICAgJyAhKCAKLU1EUFAgICNAID1FXVU7RkVPO0MoIDxAIisgUCAgKFAgJSAgLjRGIDAoKTAgICAgPCAkQCJYIyAgIC4gIVYKLU03VzVOOjZdTiAnKCA7ICggICIsICEwICNHKUAkIiI8ICAgICcgISggV1BQICAjQCA9RV1TPScpVThXMFIKLU0gJyggM0AkICAiLCAhMCAjTyk8JCIiPCAgICAnICEoICFAVCAgI0AgPUVdUz0nKVU4VzBRICcoICtAICAKLU0gIiwgITAgI0kpPCQiIlwgICAgJyAhKCAtMFQgICNAID1FXUQ7VzVCOyY1PzwmXUk7RzFFPEAhQyAgLCAKLU0gMFwgKFAgJSAgLkBFUDAoK0AgICAgPCAkQCFDIzAgIC4gIVY3VjlMO1YlVDdXIU86NllUOTcoIDhQICMKLU0gICQuICIsICEwICNWKTwkIiM4ICAgICcgISggRjBUICAjQCA9RV1VO0ctSTlWWUU5JV1MO1ZZRzdXIU8KLU06NllUOTcoIDhQICMgICQsICIsICEwICMmKTwkIiMwICAgICcgISggUzBUICAjQCA9RV1TOjY9Tjk2MT8KLU07Jl1OOVVdUDtWRU49JjVSICYsICBQICEiUCBDICA0ICBdUjchIEBNICAgICFQIDIgL0gtICAgWCAnOT8KLU07Jl1OOVVdUDtWRU49JjVSICYsICBQICEiQCBDICA0ICBXIjchIEBVICAgICFQIDIgIlwuICAgWCAnOT8KLU09NllTOjY9Tjk2MT86NllUN1chTzo2WVQ5NyggOFAgIyAgJCkgIiwgITAgIzYpPCQiIywgICAgJyAhKCAKLU04QFggICNAID1FXVM6Nj1OOTYxPzo2WVQ3VyFPOjZZVDk3KCA4UCAjICAkKCAiLCAhMCAjRSk8JCIiUCAKLU0gICAnICEoIENAWCAgI0AgPUVdSTtHMT88Jl1JO0cxRTxAIUMgICwgIDA8IChQICUgIC0sRVAwKC1QICAKLU0gIDwgJEAjJSNAICAuICFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVDk3KCA4UCAjICAkJiAiLCAKLU0hMCAjICk8JCIjNCAgICAnICEoIF5AWCAgI0AgPUVdUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxAIUMKLU0gICwgIDA0IChQICUgIC48RVAwKCtAICAgIDwgJEAgSCNQICAuICFWN1ctSDtXKVQ3VyFPOjZZVDk3KCAKLU04UCAjICAkJCAiLCAhMCAjWik8JCIjOCAgICAnICEoIDdAXCAgI0AgPUVdVTtHLUk5VllFOSVdQzomJVIKLU03VyFPOjZZVDk3KCA4UCAjICAkIyAiLCAhMCAjQik8JCIjMCAgICAnICEoIERAXCAgI0AgPUVdUzo2PU4KLU05NjE/OFZBQTxFXVA7VkVOPSY1UiAmLCAgUCAhIEAgQyAgNCAgXlI3ISBATSAgICAhUCAyICtcLyAgIFgKLU0gJzk/OFZBQTxFXVA7VkVOPSY1UiAmLCAgUCAhIDAgQyAgNCAgWDI3ISBARCAgICAgMCAyIC4sLyAgIjUKLU0gICAgSFAgMCAgICggICAgICAgISAgICAiJTQgI1AgTCAgICAhUCAyICBcMCAgIFggJzk/OSZdVThGUUUKLU03ViVSPEYlWSAnKCBPUFwgICIsICEwICMqKTwkIiIwICAgICEgISggLFEgICApNCAgICJDICEgICAgQCAKLU0gICAgICAkICAgICg1MCAuICJMICAgICcgISggN0EgICAjQCA9RV1GOyZdQT0lXUE8RylBPjAhUiAgXDAKLU0gICBDICA0ICBeIjchIEBEICAgICAwIDIgKCgwICAiNSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAKLU0jICBTICAgICFQIDIgKzQwICAgWCAnOT89NllTOjY9Tjk2MT87Jl1OOVVdQTxHKUE+MCFSICVYMCAgIEMKLU0gIDQgIFYiNyEgQEQgICAgIDAgMiAtRDAgICI1ICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0ICJQIFEKLU0gICAgIVAgMiAgSDEgICBYICc5PzxWRUc7RjVEN1ZRTztGPT84NylSODdEIDxAIlUkICAgKFAgJSAgLSAKLU1FUDAoKSAgICAgJCAkQCBOJDAgIEUwICAgKiwgJCAgICIgICAgICAgIDAgICAgQTUgIEggKkAgICAgPCAKLU0kQCE4JDAgIC4gIVY3VlFPO0Y9Pzg3KVI4N0QgPEAgKiQwICAoUCAlICAvUEVQMCgpICAgICAkICRAIVwKLU0kMCAgRTAgICAqLCAkICAgIiAgICAgICAgMCAgICBBNSAgRCAsQCAgICA8ICRAIk4kMCAgLiAhVjdXNU4KLU08VkVHO0Y1RDdWRU49JV1BPEcpQT4wIVIgJUAxICAgQyAgNCAgVSI3ISBARCAgICAgMCAyIC0oMSAgIjUKLU0gICAgSFAgMCAgICggICAgICAgISAgICAiJTQgIiAgUCAgICAhUCAyICAoMiAgIFggJzk/PFZFRztGNUQKLU03VkVOPSVdQTxHKUE+MCFSICpYMSAgIEMgIDQgIFhSNyEgQEQgICAgIDAgMiAiODIgICI1ICAgIEhQIDAKLU0gICAoICAgICAgICEgICAgIiU0ICFQIEkgICAgIVAgMiAkXDIgICBYICc5Pzo2WVQ3ViVSPEYlWSAnKCAKLU0gQSggICIsICEwICMnKTwkIiIwICAgICEgISggPFEoICApNCAgICJDICEgICAgQCAgICAgICAkICAgICgKLU01MCAmICMwICAgICcgISggSVEoICAjQCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUE8RylBPjAhUiAkXDIKLU0gICBDICA0ICBYIjchIEBEICAgICAwIDIgLEwyICAiNSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAKLU0hMCBSICAgICFQIDIgL1QyICAgWCAnOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJyggSVEoICAiLCAKLU0hMCAjMik8JCIiMCAgICAhICEoICgxLCAgKTQgICAiQyAhICAgIEAgICAgICAgJCAgICAoNTAgJCAiTCAKLU0gICAnICEoIDMhLCAgI0AgPUVdUzomXVI9JV1BPEcpQT4wIVIgL1QyICAgQyAgNCAgV1I3ISBARCAgICAKLU0gMCAyICcgMyAgIjUgICAgSFAgMCAgICggICAgICAgISAgICAiJTQgIFAgUyAgICAhUCAyICosMyAgIFgKLU0gJzk/PTZZUzo2PU45NjE/OFZBQTxFXUE8RylBPjAhUiAkUDMgICBDICA0ICBfQjYhIEBEICAgICAwIDIKLU0gLDwzICAiNSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAgQCBRICAgICFQIDIgL0AzICAgWCAnOT8KLU08VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RCA8QCJDJFAgIChQICUgICxYRVAwKCkgICAgICQgJEAgPCUgICAKLU1FMCAgICosICQgICAiICAgICAgICAwICAgIEE1ICAkICpAICAgIDwgJEAhJiUgICAuICFWN1YtSDg3KT8KLU04NylSODdEIDxAI1gkUCAgKFAgJSAgLzRFUDAoKSAgICAgPCAkQCFKJSAgIC4gIVY3VjFPPTYpTDkwITUKLU0gIFwgKFAgJSAgLChFUDAoKFAgICAgPCAkQCItJSAgIC4gIVY3VjlMO1YlVCAlNCAjQCBDICA0ICBTUjcKLU0hIEBLICAgICFQIDIgK0A0ICAgWCAnOT89NllTOjY9Tjk2MT87Jl1OOVAhNSAgUCAoUCAlICAtWEVQMCgKLU0qMCAgICA8ICRAI0ElICAgLiAhVjdXLUk5VllFOSVdTDtWWUcgJTQgIlAgQyAgNCAgX1I2ISBAQiAgICAKLU0hUCAyICAsNSAgIFggJzk/OyZdTjlQITUgIEggKFAgJSAgLUhFUDAoKkAgICAgPCAkQCBNJTAgIC4gIVYKLU03VzVOPFZFRztGNUQ3VkVOPSAhNSAgRCAoUCAlICAvVEVAMCgqICAgICA8ICRAITUlMCAgLiAhVjdXLUkKLU05VllFOSVdSTtHMCA1MCAoICIsICEwICNcKTgkIiIkICAgICcgISggPUE0ICAjQCA9RV1JO0cwIDUwICcKLU0gIiwgITAgIyQpPCQiIlAgICAgJyAhKCBIQTQgICNAID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSAhNSAgOCAKLU0oUCAlICAsJEVQMCgqQCAgICA8ICRAIywlMCAgLiAhVjdXLUk5VllFOSVdUzomXVI9ICE1ICA0IChQICUKLU0gIC08RVAwKChQICAgIDwgJEAjTyUwICAuICFWN1ctSDtXKVQgJTQgISAgQyAgNCAgVlI3ISBASyAgICAKLU0hUCAyICFINiAgIFggJzk/PTZZUzo2PU45NjE/OFZBQTxAITUgICwgKFAgJSAgLFpFUDAoKjAgICAgPCAKLU0kQCEjJUAgIC4gIVY3Vy1JOVZZRTklXUM6JiVSICU0ICBAIEMgIDQgIFcyNyEgQEIgICAgIVAgMiAmNDYKLU0gICBYICc5PzhWQUE8QCE1ICAkIChQICUgIC9YRVAwKCEgICAgIDwgICAgICAgIjIgQCAgMygsJCInRCAKLU0gICNfX1AgICAgIVogICAgX19cMCAgICA+UCAgIC9fXyggICAgJ1QgICAjX19TICAgICFeICAgIF9fXSAKLU0gICAgP1AgICAvX180ICAgICgkICAgI19fViAgICAiIiAgICBfX11QICAgIEBQICAgL19fQCAgICAoNCAKLU0gICNfX1kgICAgIiYgICAgX19eQCAgICBBUCAgIC9fX0wgICAgKEQgICAjX19cICAgICIqICAgIF9fXzQKLU0gICAgTEAgICAvX19aICAgICs0ICAgI19fXlggICAiViAgICBfX19VICAgIE1QICAgL19fXyAgICArRCAKLU0gICNfX1AsISAgIlogICAgX19cLCAwICBOUCAgIC9fXyUwJCAgK1QgICAjX19RWCEgICJeICAgIF9fXEgKLU0gMCAgT1AgICAvX18sQCQgICwkICAgI19fU1AhICAjIiAgICBfX10mIDAgIFBQICAgL19fNCAkICAsNCAKLU0gICNfX1VIISAgIyYgICAgX19dRCAwICBSMCAgIC9fXz4gJCAgLEggICAjX19YKCEgICMrICAgIF9fXiwKLU0gMCAgUzAgICAvX19FQCQgICxYICAgI19fWighICAjLyAgICBfX15OIDAgIFQwICAgL19fTkAkICAtKCAKLU0gICNfX1wwISAgIzMgICAgX19fLiAwICBVMCAgIC9fX1YgJCAgLTggICAjX19eKCEgICM3ICAgIF9fX0wKLU0gMCAgVjAgICAvX19dQCQgIC1IICAgI19fUCAiICAjPCAgICBfX1w0IEAgIFcwICAgL19fJ0AoICAtWCAKLU0gICNfX1JAIiAgI0AgICAgX19cUiBAICBYMCAgIC9fXy8gKCAgLiggICAjX19UOCIgICNEICAgIF9fXTAKLU0gQCAgWTAgICAvX182QCggIC44ICAgI19fVjAiICAjSCAgICBfX11OIEAgIFowICAgL19fPiAoICAuSCAKLU0gICNfX1goIiAgI0wgICAgX19eLCBAICBbMCAgIC9fX0VAKCAgLlwgICAjX19aICIgICNQICAgIF9fXkoKLU0gQCAgXDAgICAvX19NICggIC8oICAgI19fW1giICAjVCAgICBfX18oIEAgIF1AICAgL19fVEAoICAvPCAKLU0gICNfX11YIiAgICAgICAgX19fSSBAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAwICAgICQgICAgIiAgICBVKCAkIi0wICAgIDMgICAgICAgICAgICAKLU0gICAhICAgICAgICAgIEQgICAgJSAgICAgQCAgIC5CICEgQ0ggICAgMSAgICAgLCAgICAgICAgICEgICAKLU0gIDAgICAgLyAgICAiUCAgICAoICAgIExAMDAoKyAkICAsICAgICAkICAgICAwICAgIDAgICAgMCAgICAKLU0lUCAgICAsICAgICIgICAgWygkJCIuUCEgICFbICAgICAgICAgICAgICAgISAgICAgICAgICFcICAgICkKLU0gICAgIEAgICAmQiIhIEFIIEAgICggICAgICwgICAgJyAgICAhICAgICBAICAgIEggICAgIDAgICAgOCAKLU0gICIoQEAwKEIgKCAgICQgICAgICAgICAgICAgICAwICAgICAgICAgK0AgICAgJCAgICAmICAgIEMoKCQKLU0iKFAiICAhMCAgICAgICAgICAgICAgICQgICAgISAgICAjLCAgICAhICAgICFAICAgLVIiISBDPCBAICAKLU02MCwgICAgICAgICAgICAgISAgICAgICAgICBZICAgICAwICAgIDggICAgWEFAMCguIDggICAkICAgICAKLU0gICAgICAgICAgMCAgICAgICAgIC9QICAgICQgICAgIiAgICAvKDgkIiNQJiAgIEAgICAgICAgICAgICAKLU0gICAkICAgICAgICAgJDwgICAgISAgICAgUCAgICVSNiEgQTwhQCAgIiAgICAgICAgICAgICAgICEgICAKLU0gICAgICAhLSAgICAgMCAgICAsICAgIURFQDAoOSA4ICAhUCAgICAgICAgICAgICAgIDAgICAgJCAgICAKLU00QCAgICA4ICAgICMgICAgQCk4JCIoICYgICFQICAgICEgICAgICAgICAgJCAgICAiICAgICVMICAgICgKLU0gICAgIFAgICAvIjYhIENQIUAgIE0gJCAgICAgICAgICAgICAhICAgICAgICAgIUAgICAgIEAgICAgICAKLU0gICAgICAgIFwgOCAgICAnICAgMCAgICAnICAgICAwICAgIDAgICAgOiAgICAgLCAgICAgICAgICAgICAKLU0gLyAtICAjNCEgICAgICAgICAgICAgICEgICAgICAgICAnICAgICAjICAgICAgICAgICAgICAjJCRAICAKLU1EICAgICAgICAgICAgICAgIDAgICAgICAgICFaICAgICAwICAgICAgICAgICAgICA1ISwgICIoIiAgICAKLU0gICAgICAgICAgJCAgICAgICAgIEBQICAgICQgICAgICAgICAgICAgICdANSAgIVAlQCAgICAgICAgICAKLU0gICAkICAgICAgICAgKEggICAgISAgICAgICAgICAgICAgI0gqUCAgREAoICAgICAgICAgICAgICAwICAKLSUgICAgICAgIAotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k4NjAtZWxmLnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k4NjAtZWxmLnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNmU4M2IuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pODYwLWVsZi51CisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLWJlZ2luIDc3NSBpODYwLWVsZgotTT9UNSwxQCQiIDAgICAgICAgICAgICAgIiAgPCAgICAhICAgMzIgICAgIzAgICMtNCAgICAgICBUICIgIAotTSEwIEggITQgJDAgICAgOCAgICBUICAgMC0gICAgICAgICAiQCAgICBIICAgICA0ICAgICAgICAgIFAgIAotTSAtMCAgICAgICAgICAgICAgISwgICAgICAgICAhICAgICAgICAgICEgICAgLSAgICQjMCAgICAgICAgKAotTVwgICAiLyAgICAgJSAgIDAgICAgICAkICAgREQgICBJKSAgICAgICAgICI4ICAgIjcgICAgIDggICEgIAotTSAgICAgQCAgIjRQICAiRSwgICAgICAgICAnICAgICAgICAgICFQICAgICBPPTctUitWUUk4Ql1MOjYpQwotTStHLU8rQyQgICAgICAgLCAgICAsICAgICFQICAgIFAgICAgKyAgICAgICAgICAgICAgICAgICAgIEAgIAotTSAgICAgICAjICAgICEwICAgICAgICAgJiAgICAhICAgICBEICAgICogICAgIiAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICEgICAgIDAgICRNICAgICEsJEAgICAgICAgIEggICJOIAotTSAgICAgISQgX18kICAgIC8gICBJKiAgICAgMDEgICArICAgICYgICAmMjAgICAgICQwI19cMCAgICFcIAotTSAhK0wgICAgRiEoICAgICAgICBGICAgSU8gICAgICAxIC9fUSAgICArMCAgJFIwICAgICAkQCAgICAgIAotTSAjKCAgIUQwICAgICEhJCAgIEggICAgXyAgIDMiICAgICAgMiAgICAgICAgMjAgICozICAgICAgJDAjXwotTVwwICAgJVwgICJFLCAgICAgISQgX18kIDdWLUw5NiVOPTcgIDdWNU45ICE/OTZZVjo3KU87QCE/OTcxRQotTT4nMCA4NzFFPiZFVCAlXUU5JiVUODAhRT4mRVQgJV1MOjYpPz1GNVI8VkVPO0AhPzdWOVA8VzFBPEcwIAotTTdUPSwzVCkhMyVdLzFEOTMxNTE/NSQlIjMkNT8gJV0kNjRZITM0RSMgIl1VPFcoTzsmRUIrVlFJOEYsTgotTTxWXE4sMCAgICAgSS8gICAgQDAgICAgICAgIEkwICAgIUAwICAgICAgICBJMSAgICJAMCAgICAgICAgSQotTTIgICAiIDAgICAgICAgICAgKiAgICAhICAgQCBIICAgICogICAgIDdfUkRZWyFcICAhPz4qMzUgIC9AIAotTSVfXEkvPlA/ICAjRCcwICAwICNYICZPX19fO09PMCAgWyFcICAuUD4gICEgIC9AICVfXEkwPl5dICAjRAotTScwICxbIVggICZPX19eXDdfUkUlWyFcICAuMD0gIUEgIC9AIDpfX19aLl5dICAjTCdQICBbIVggICQgIAotTV4gIDdfUkUpW1tUICAuMD0gIjNMJ0AgIDpfX19YOiAgICAjKCAgIDQnJCAgIDgxIl9fIkAwUCAgJyQgIAotTSE+UDAgICM0MEAgLzZAICAgTjgwJE0iQCAgICA7X19fWC4/Pyo0U0wnQCAgO19fX1ZVT0AgICtMJCAgIAotTUgpICAgLjgwJjAhT19fXzhIICAgICZfX19cPkAgICAgO19fX1ZaODIgICg0PCAgMUFFKCAmKCkyJiAgPwotTVk5JElbIVwgICZQICApSiQ8MCA0O19fX1VaICAgICJAJCAgIEggICAgJD9AXiAiJCdQICFIXCQgICogXwotTSAgIkAgICAgMCAjWCAqICAgICJAICAgIEggICAgLEAgICBQPDAhQCFBJCtfXCogMCAgIiQwUCAgJSYsIAotTSA4MV8gISJHWEAgIDAgICggKiAgICAjKCAgICwnJCA4IDgxIl9fIkAkICAgQSQsICAhMUMgICYkP1AgMAotTUleKCAgJCAgIiAiQCAgICBSICAgIyFRICYgJiQwT19QSCEgICAoMSMgICA0OFAgIUEnXCAkKj9CICAhIAotTSAgQCBIICAgICxAICAgUDwwIUAhQSQrX1wqIDAgICIkMFAgICUmLCAgODFfICEiR1hAICAwICAoICogIAotTSAgIyggICAsJyQgOCA4MSJfXyJAJCAgIEEkLCAgITFDICAmJD9QIDBJXiggICQgICIgIkAgICAgUiAgIAotTSMhUSAmICYkME9fUEghICAgKDEjICAgNDhQICFBJ1wgJCo/QiAgISAgIEAgSCAgICAsQCAgIFA8MCFAIQotTUEkK19cKiAwICAiJDBQICAlJiwgIDgxXyAhIkdYQCAgMCAgKCAqICAgICMoICAgLCckIDggODEiX18iQAotTSQgICBBJCwgICExQyAgJiQ/UCAwSV4oICAkICAiICJAICAgIFIgICAjIVEgJiAmJDBPX1BIISAgICgxIwotTSAgIDQ4UCAhQSdcICQqP0IgICEgICBAIEggICAgLEAgICBQPDAhQCFBJCtfXCogMCAgIiQwUCAgJSYsIAotTSA4MV8gISJHWEAgIDAgICggKiAgICAjKCAgICwnJCA4IDgxIl9fIkAkICAgQSQsICAhMUMgICYkP1AgMAotTUleKCAgJCAgIiAiQCAgICBSICAgIyFRICYgJiQwT19QSCEgICAoMSMgICA0OFAgIUEnXCAkKj9CICAhIAotTSAgQCBIICAgICxAICAgUDwwIUAhQSQrX1wkQCggPEYkMFAgICUmLCAgODFfICEiR1hAICAwICAoICogIAotTSAgIyggICAsJyQgOCA4MSJfXyEoIiAnKUEkLCAgITFDICAmJD9QIDBJXiggICQgICIgIkAgICAgUiAgIAotTSMhUSAmICYkME9fUFshXCAgKDEjICAiNCcgICEjXjQiUyBfRVhEM0wnUCAgWyFcICApMDwgICo0JyAgIwotTSNeN0IiQV9FWENTTCdQICBbIVwgICkwPCAgMjQnICAlJ143QishX0VYPTNMJ1AgIFshXCAgKTA8ICA6NAotTScgICcnXjdBWDFfRVg8N0wnUCAgWyFcICApMDwgIEI0JyAgKSdeN0FQMV9FWENHTCdQICBbIVwgICkwPAotTSAgSjQnICArJ143QVMxX0VYREdMJ1AgIClfIDkoTlA/ICAgT1wiSC5bIVwgICI/UCYxQ0wnUCAgK18gSQotTVYuUD8gICAnXyJLLFshXCAgIF9FWEpDTCdQICAhX1BKMS5QPyAgIC9ZPigoWyFcICAgP1wqQEtMJ1AgIAotTSNeN0FSLlA/ICAgN18iSFxbIVwgICFfRVhEU0wnUCAgJV9QSisuUD8gICA/WT4oOFshXCAgIT9cKj0zTAotTSdQICAnXjdCNC5QPyAgIDdfIkdBWyFcICAhX0VYPldMJ1AgICVfUElRPlA/ICAgP1k+KT1bIVwgICE/XAotTSo8J0wnUCAgJ143Qig+UD8gICA3XyJIWVshXCAgIV9FWEw3TCdQICAlX1BJUz5QPyAgID9ZPigxWyFcIAotTSAhP1wqREdMJ1AgICdeN0IsPlA/ICAgR1wiSC5bIVwgICJfUCpLO0wnUCAgKV8gSVYuUD8gICBPXCJHWAotTVshXCAgLj9cKkxTTCdQICAnXjdCNT5QPyAgI0dfIkkkWyFcICAhX0VYTCdMJ1AgIFlfUEoiTlA/ICAgPwotTVk+KTlbIVwgIC4/XCpDU0wnUCAgJ143Qk8+UD8gICNHXyJITFshXCAgIV9FWEZXTCdQICBZX1BJVS5QPwotTSAgID9ZPicxWyFcICAuP1wqPiNMJ1AgICdeN0InPlA/ICAjR18iRyRbIVwgICFfRVhGN0wnUCAgWV9QSQotTVAuUD8gICA/WT4oSVshXCAgLj9cKkNDTCdQICAnXjdCMD5QPyAgI0dfIkcsWyFcICAhX0VYSydMJ1AgIAotTVlfUEoyLlA/ICAgP1k+J0lbIVwgIC4/XCpAU0wnUCAgJ143Qks+UD8gICNHXyJHOFshXCAgIV9FWEcnTAotTSdQICBbIVwgICkwPCAgKjQnICAiJ143QV0xX0VYPjdMJ1AgIFshXCAgKTA8ICAmNCcgICEnXjdDOjFfRQotTVhNJ0wnUCAgJV9QSjo+UD8gICA/WT4rOVshXCAgIT9cKldDTCdQICAnXjdDPC5QPyAgIDQ4UCAhQSdcIAotTSQqP0IgICEgICBAIEggICAgJCAgIiAiQCAgICBIICAgICAgICAgICAgICAgMCZEICAgICAgICEiUiAgIAotTSAgICAgICAgICAgICAgICAgICBJMyAgICAgICAgICAgICAgMlcgICAkT0AgICEsNCAgIDMsICAgICAkIAotTSAgIUggICAgIyAgICRLICAgICAtICAgOSAgICAgIDAgICEjSCAgICAhMCAgJEAgICAgICYgICAxLCAgIAotTSAgSCAgICFbICAgICJQICAgISAgICAgNSAgICAgICAgICAsICAiRFAgICAgIEAgICAjICAgICA0ICAgIAotTSFQICAgITwgICEpXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQgICAgIAotTSAgICAgIDAgX18kICAgICAgICAwVSAgICAgICMgICAhICAgICAgICAkLkAgICAgICBQICAgQCAgICAgIAotTSAhJFAgICAgICAsICAgLCAgICAgICAgMiAgICAgICAjICAgJCAgICAgICAgJEdQICAgICAgUCAgITAgIAotTSAgICAgISpQICAgICAgLCAgIDggICAgICAgIDJQICAgICAgIyAgICcgICAgICAgICRUICAgICAgIFAgIAotTSIgICAgICAgICFEICAgICAgICwgICBEICAgICAgICA5JCAgICAgICMgICAqICAgICAgICAqMjAgICAgIAotTSBQICAiUCAgICAgICAiRFAgICAgICAsICAgUCAgICAgICAgSTMgICAgICAjICAgLSAgICAgICAgKjwgIAotTSAgICAgUCAgI0AgICAgICAgICAgICAgICAgLCAgIFwgICAgICAgICAgICAgICAgIyAgIDAgICAgICAgIAotTSAgICAgICAgIFAgICQwICAgICAgICAgICAgICAgICwgICEoICAgICAgICAgICAgICAgICMgICAzICAgIAotTSAgICAgICAgICAgICBQICAlICAgICA8ICAgICAgICAgICAwIF9fJCAgICAuICAgICAgICAgICAkIC9fUQotTSAgICAlMCAgICAgICAgICAhICNfXDAgICAiJCAgICAgICAgICAgMCBfXyQgICAgSSAgICAgICAgICAgJAotTSAvX1EgICAgLFAgICAgICAgICAgISAjX1wwICAgI0ggICJHICAgICAhISQgICBYICAgISkgICBJUSAgIAotTSAgMDEgICAuICAgIDVAICAkX0AgICAgQCRAICAiICAgICYoICAhRCAgICAgICEoICAgRCAgICFIICAgSQotTVIgICAgICgxICAgLiAgICA/QCAgJUJAICAgKzgkQCAgIiAgICAoLCAgIkcsICAgICEhJCAgIFggICAiMQotTSAgIElUICAgICAwMSAgIC4gICAgSkAgICRYICAgICEsJEAgICAgICAgKywgICJOICAgICAgISQgX18kIAotTSAgIlggICBJVSAgICAgKDEgICAuICAgIFIwICAlLCAgICAgQCRAICAiICAgIC1cICAiRzggICAgIiEkIAotTSAgWCAgICNIICAgSVggICAgIDAxICAgLiAgICBbQCAgJFRAICAgICAkQCAgIiAgICAvNCAgIkdEICAgIAotTSEhJCAgIFggICAkICAgIEkqICAgICAwMSAgICsgICAhIjAgICo+QCAgICAkJDAgICNAICAgMiQgICJHTAotTSAgICAiISQgICBYICAgJE0gICBJXSAgICAgMDEgICAuICAgIS0wICAlIiAgICAgQCRAICAiICAgIDRAIAotTSAiR1ggICAgJCEkICAgWCAgICU3ICAgOSkgICAgICAxIC9fUSAgICE3QCAgKkBAICAgICIkMCAgI0AgIAotTSA3KCAgIkgqICAgICAxJCAgIFggICAmIiAgIEojICAgICAwMSAgIC4gICAhQkAgICpBICAgICAoJDAgIAotTSNAICAgOVggICEzMCAgICBGISggICAgICAgJkUgICBJKiAgICAgMEEgICArICAgIUswICAlNiAgICAgQAotTSRAICAiICAgIDtEICAiSDggICAgISEkICAgWCAgICcuICAgNUwgICAgIiAyICAgKCAgICFYUCAgKkFQIAotTSAgICQkMCAgI0AgICA/JCAgIkZcICAgICAhJCBfXyQgICAnWCAgIDQ8ICAgICIgMiAgICggICAiITAgIAotTSpCICAgICAoJDAgICNAICAgQUggICJISCAgICAhISQgICBYICAgKFEgICA0WiAgICAiIDIgICAoICAgIgotTS8gICAqQlAgICAgIiQwICAjQCAgIERMICAhNzggICAgKCEoICAgQCAgICk4ICAgNzwgICAgICAyICAgIAotTSAgICI3MCAgKkMgICAgICgkMCAgI0AgICBHLCAgIkhYICAgICEhJCAgIFggICApWiAgIEovICAgICAoMQotTSAgIC4gICAiQEAgICpEICAgICAkJDAgICNAICAgSSQgICJJJCAgICAgMSQgICBYICAgKj8gICBKMiAgIAotTSAgMDEgICAuICAgIktQICAqRFAgICAgJCQwICAjQCAgIEtUICAiSTAgICAgISEkICAgWCAgICs0ICAgOQotTSQgICAgIDAxICAgKiAgICJYMCAgJF1AICAgICAkQCAgIiAgICBORCAgIkk0ICAgICEhJCAgIFggICArWAotTSAgIEo2ICAgICAwMSAgIC4gICAjJCAgICpFUCAgICAoJDAgICNAICAgUiwgICE4QCAgICAgISggICAgIAotTSAgLE0gICBKOSAgICAgMDEgICAuICAgIzBAICAqRkAgICAgJCQwICAjQCAgIFREICAiRFAgICAgICEkIAotTV9fJCAgIC0/ICAgSjsgICAgIDAxICAgLiAgICM9QCAgKkcgICAgICQkMCAgI0AgICBYPCAgIkREICAgIAotTSEhJCAgIEwgICAuOSAgIEo+ICAgICFAMSAgIC4gICAjSFAgICpJICAgICA4JDAgICNAICAgWlQgICJKSAotTSAgICAgQSQgICBYICAgLlogICBKSyAgICAgMDEgICAuICAgI1JAICAqSyAgICAgJCQwICAjQCAgIF4gIAotTSAhOCAgICAgKCEoICAgQCAgIC9OICAgNSQgICAgIiAyICAgKCAgICQgICAgKjRQICAgICAkMCNfXDAgIAotTSEgRCAgIkpUICAgICIhJCAgIFggICAwNyAgIEpPICAgICAwMSAgIC4gICAkKVAgICU4QCAgICBAJEAgIAotTSIgICAhI0ggICJLICAgICAhISQgICBYICAgMTAgICBKUSAgICAgQDEgICAuICAgJDcwICAkSyAgICAgIAotTSRAICAhQCAgISYsICAiSywgICAgIDEkICAgWCAgIDFKICAgSlQgICAgIDAxICAgLiAgICQ8QCAgJSRAIAotTSAgIEAkQCAgIiAgICEoPCAgIks4ICAgIEQhJCAgIFggICAyLiAgIEs6ICAgICAwMSAgIC4gICAkRiAgIAotTSUpQCAgICBAJEAgICIgICAhKlAgICJNUCAgICAiISQgICBYICAgMlUgICBLPiAgICAgQDEgICAuICAgJAotTU8wICAlM0AgICAgQCRAICAiICFHOSYpTTkwIUM8RzBRK0csIDhXKVQ6MllTICc5QTsnNUU8UlU4PSJZQwotTSAmPUQ4RlVFK0YsIDxWQT85JiVUODJZQyAmLVI9JlhOPFAhVjdXNU48VkVHO0Y1RDdWRU49ICFWN1ctSQotTTlWWUU5JV1JO0cwID1FXUM6JiVSN1Y5VTtGLCA3VjlJO0ZEID1FXVU7Ry1JOVZZRTklXUM6JiVSN1YlUgotTTxGJVkgJlVBOjZYID1FXVM6Nj1OOTYxPzsmXU45UCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVAotTTk3KCA3Vi1MOTYlTj03ICA3VjVOOSAhVjdXNU48VkVHO0Y1RDdXLUg7VylUICc5Pz02WVM6Nj1OOTYxPwotTTxWQU88RzE/OUc1TjhQIVY3VjFPPTYpTDkwIVY3VkVOPSAhPzxXMUE8RzAgO0ZdTjwnKUk7NiVSPjAhPwotTTk2WVY6NylPO0AhVjdXNU48VkVHO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCFWN1ZFTj0lXUE8RylBPjAhUAotTTxGRU04NylZICc5PzxWRUc7RjVEN1YtSDg3KT85RzVOOFAhVjdWMU89NilMOTVdQTxHKUE+MCE/OTcxRQotTT4nMCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1YtSDg3KCA9RV1GOyZdQQotTT0gIVY3Vy1JOVZZRTklXUw7VllHN1YlUjxGJVkgJiVUOTdBST0gIUU7RzlJPEZdTiAnOT87Jl1OOVVdRgotTT02WUMgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1GPTZZQwotTSAnOT86NllUN1chTzo2WVQ5NyggN1Y1RDg3MUEgJzk/PFZBTzxHMT85RzVOOFAhVjdXNU48VkVHO0Y1RAotTTdWRU49JV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICc5Pzo2WVQ3VjlVO0YsIAotTT1FXVM6Nj1OOTYxPzxWQU88RzAgPUVdRjsmXUE9JV1GPTZZQyAmNVg6NzAgPUVdVTtHLUk5VllFOSVdTAotTTtWWUc3ViVSPEYlWSAnOT87Jl1OOVAhVjdXLUg7VylUICc5PzsmXU45VV1QO1ZFTj0mNVIgJzk/PFZFRwotTTtGNUQ3Vi1IODcoID1FXVU7Ry1JOVZZRTklXUw7VllHICc5PzxWQU88RzE/ODcpUjg3RCA9RV1VO0ctSQotTTlWWUU5JV1TOiZdUj0lXUE8RylBPjAhPzsmRUI3VzlFPEctSTtWWCA3VlVDO1c1Tj0gIVY3Vi1IODcpPwotTTwmXUk7RzFFPEAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUU8QCFWN1ctSTlWWUU5JV1JO0cxPwotTTg3KVI4N0QgN1VdRjwnLVQ4NylUICc5PzxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAnLT87JkVOOlAhPwotTTFUUS8wRCUsN1RdJjFFLSU1JV00MDQpLDE1XCA9RV1TOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhVgotTTdWMU89NilMOTVdUDtWRU49JjVSICVdPzsmXU45VjFPPTYpTDk1XVU8VjVEICc5PzxXMVI9Ni1ULDAhVgotTTdXLVQ8RzVDPSMoID1FXUM6JiVSN1YlUjxGJVkgJzk/OUZRTzg3MT88Jl1JO0cxRTxAIVY3Vy1JOVZZRQotTTklXUw7VllHN1chTzo2WVQ5NyggPUVdRDtXNUI7JjU/OUc1TjhQIVY3Vy1JOVZZRTklXUk7RzE/OUc1TgotTThQIT8xJUUuMDRVKTBQIVY3VjlMO1YlVDdWJVI8RiVZICc5PzxWQU88RzE/PCZdSTtHMUU8QCFWN1ctSQotTTlWWUU5JV1MO1ZZRzdWOVU7RiwgPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UiAnOT87Jl1OOVVdQQotTTxHKUE+MCE/OjZZST0gIVY3Vi1IODcoIDhWUVU7Rk1FPEAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/OUc1TgotTThQIVU3VlFJO0ZMIDxXIU88RzFTOFYlUiAnOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA9RV1VO0ZFTwotTTtDKCA9RV1VO0ZFTztAIVY3VzVOPFZFRztGNUQ3VkVOPSVdRj02WUMgICBOOjZZVDk3KVAgIllIODctSAotTSAiWUQ+NllTPjZUICtGMVk7Ry1UPEAgTjxGNUw4MllQOycwICtGRU46NzAgK0chTD0gIE49JjVYPSAgTgotTTlGRU46MCBOPEZdRDg3MUEgIllEODcxQSAiWUc7VzAgK0YxWTtGJU06NiwgK0YpUzxQIE48V0VNPSYlQgotTSAiWVM9JylUODYoICtHLUg8VzFSPSYlQiAiWUM7VlVNOTZZVCAiWUQ5NilVOVAgTjsmRU45MCBEMiY1QQotTTkmNVIuQiBPPCJdMjBVLE89NzFJOyMoTSxCWFErVzVTPEJdUzxGLE87JkVCK1ZRSThGLE86M0BWLCJdQwotTTxXNE84VylULDJZUysnOEAsQlhRKCNEUitTIFUrUyRUKCMgVy5DJFYuQyhQKCYxQT1GRUQ7VjlGKCQ1WAotTTwiIEQgJCBIKFJFJjUlQEAsQlhRK0MgTiwyIVM4VjFFLkJdVTxXKE84Vi1TK1ZRSThCXUM8RzBRK0ZcIAotTSkkQUU4NjFFPENIQCtXIE80RC0zK1c1VDo2UFIrMyhOLDJdVTxXKE88VylDK1ZRSThCXUw6NilDK1ZEWAotTS1DIE84Vy1VK1YtUj0mRE48UlFWKCMoTiwyIFksQlxQLTJcUS0iIFAtU0hRLUNIUiwyIUQ4NzlJOSZdRgotTTlCISU+JyBAKSAhICoiLEkxRTE4KCMoTiwyWFArQyRAPFYtRDkzSE89Ny1SK1YtQzxSXUw6NihPOFcpVAotTToyWU8gIjEoOTYlRDk3KFooIl1QK1UpIzRSXVU9JkVMLEJUUitDJE89Ny1SK1ctUjhSXUw6NihPOyZFQgotTThSXVA7VylUK1Y9RTtCXVY4NlFVOTcsTTYnME44UlFWKCMoTiwyIFksQlxQLTJcUS0iIFAtU0hSLVNIUAotTSxCIUQ4NzlJOSZdRjlCISU+JyBAKSAgRDImNUE5JjVSLkIgTzwiXTIwVSxPPTcxSTsjKE0sQlhRK1c1UwotTTxCXVM8RixPOyZFQitWUUk4RixPOjZZQytXLVk7Rl1OPjZVUytGQEw9QiBSK0MkQC4zKE8sIzRPLDMwQAotTSwjPFosQyhaLDNEQDkmJVY6NjFPOUY4QDE3QVAoIjAgKSRBRTg2MUU8Q0hAK1cgTzRELTMrVzVUOjZQUgotTSszKE4sMl1VPFcoTzxXKUMrVkFFODYwTzs2JVQ6IllIKyc4QCxCWFEoI0RSK1MgVStTJFQoIyBXLkMkUgotTS5DNFcoJjFBPUZFRDtWOUYoJDVYPCIgRCAmJUM7VlVQLkIgSDRULSQxMkRALTJYUCgjJFIrUyBYK1NAWQotTSAmJVMuQiBINFQtJDEyREAtMlhQKCMkUitTIFgrU0BZICQgSChSRSY1JUBALEJYUStDIE4sMiFTOFYxRQotTS5CXVU8VyhPOFYtUytWUUk4Ql1WODZRVTk3LE02JzBOO1AhQThWXU08I0hAKiUtIzEkNEkoIzROLCIgUQotTSxCXFAuIlxYLjAhQTxTSEAqJS0jMSQ0SSgjNE4sIiBRLEJcUC4iXFguMCBEMiY1QTkmNVIuQiBPPCJdMgotTTBVLE89NzFJOyMoTSxCWFErVzVTPEJdUzxGLE87JkVCK1ZRSThGLE86M0BWLCJdRzk2WE88VkE/OSYlVAotTTgyWUMrJzhALEJYUSgjRFIrUyBVK1MkVCgjIFcuQyRXLkM0VCgmMUE9RkVEO1Y5RigkNVg8IiBEICYlQwotTTtWVVAuQiBINFQtJDEyREAtMlhQKCMkUitTIFgrU0BZICYlUy5CIEg0VC0kMTJEQC0yWFAoIyRSK1MgWAotTStTQFkgJCBIKFJFJjUlQEAsQlhRK0MgTiwyIVM4VjFFLkJdVTxXKE84Vi1TK1ZRSThCXUw6NilDK0ctTwotTSAiMSg5NiVEOTcoWigiXVArVSkjNFJdVT0mRUwsQlRSK0MkTz03LVIrVy1SOFJdTDo2KE87JkVCOFJdSQotTS4jOFArVi1TPTJdQzxHMU4rRyxMPUIgUitDJEAuMyhPLCM0TywzMEAsIzxaLDM4WixDKEA5JiVWOjYxTwotTTlGOEAxN0FQKCIwIDAiQEMqNDk0NiIgUitDJE4sIlhRKCctQzkmNForVzVTPEJdQzhXLE87JkVCK1YtUgotTT0mWE47UCBAOyYwQC5CIEg0VC0kMTJEQC0yWFAoIyRSK1MgWCtTQFkgICAgICJYICQwIDIgICA2PCAgWAotTTlWMUI7NjROOFAgIS1AICAgICQhJDAgICRfICEoMCAgJjAgISFAICAgICAgICAgPSAhLCAkQCAgIDRYIAotTS4nMT88VzFSPTYtVCAgIlYgICAgJiAgICAiSCAjMCAyICAgID0wIFg9RV1DOiYlUjdWVUU7NilFPEAgIAotTTUwICEgIiwgIUAwICAgICAhUCAgICJMICMwIDIgICAgSCAgWD1FXVM6Jl1SPSVdTTk2VUI5NyggICU0IAotTSEgIEMgIDgkICAgICBAPCAgICBJICBUICRAICAgLEQgLic5Pzo2WVQ3VlVFOzYpRTxAICA1MCAnICIsIAotTSFAMCAgICAkIVAgICAiSCAjMCAyICAgIFxQIFg9RV1MO1ZZRzdWVUU7NilFPEAgIDUwICogIiwgIUAwIAotTSAgICghUCAgICJMICMwIDIgICAhJ0AgWD1FXUY7Jl1BPSVdTTk2VUI5NyggICU0ICNAIEMgIDgkICAgIAotTSMgPCAgICBMICBUICRAICAgNEggLic5PzkmXVU4RlFFN1ZVRTs2KUU8QCAgNTAgLyAiLCAhQDAgICAgMAotTSFQICAgIDAgICAgOyAhLCAkQCAgIEZQIC4iWFA5RiVLOTAgIE1AICAgIUAgICAgSiAgVCAkQCAgIDksIAotTS4nOT84VkFBPEVdTTk2VUI5NyggICU0ICAwIEMgIDgkICAgICAgPCAgICBLICBUICRAICAgO1ggLic5PwotTTxWQU88RzE/OzY1TThGNVIgICE1ICAwIChQICYhICAgICAoJyAgICAqMCAtICEoICAgJ0cgI0FWN1ZFTgotTT0lXU05NlVCOTcoICAlNCAhUCBDICA4JCAgICAhIDwgICAgSiAgVCAkQCAgIEEkIC4nOT87Jl1OOVVdTQotTTk2VUI5NyggICU0ICJAIEMgIDgkICAgICIgPCAgICBLICBUICRAICAgQ1AgLic5PzlGUU84NzE/OzY1TQotTThGNVIgICE1ICBYIChQICYhICAgICBQJyAgICArICAtICEoICAgKUggI0FWN1YxTz02KUw5NV1NOTZVQgotTTk3KCAgJTQgI1AgQyAgOCQgICAgJCA8ICAgICQgICAgJyAgNyAhKCAgIC4rICNBVDdXNU46Nl1OICAiVgotTSAgICAiICAgICJIICMwIDIgICAiTEAgWD1FXUM6JiVSN1ZVRTs2KUU8QCAgNTAgISAiLCAhQDAgICAgIAotTSFQICAgIkwgIzAgMiAgICJXMCBYPUVdUzomXVI9JV1NOTZVQjk3KCAgJTQgISAgQyAgOCQgICAgICA8IAotTSAgIEkgIFQgJEAgICBQOCAuJzk/OjZZVDdWVUU7NilFPEAgIDUwICcgIiwgIUAwICAgICAhUCAgICJIIAotTSMwIDIgICAjLCAgWD1FXUw7VllHN1ZVRTs2KUU8QCAgNTAgKiAiLCAhQDAgICAgICFQICAgIkwgIzAgMgotTSAgICM2UCBYPUVdRjsmXUE9JV1NOTZVQjk3KCAgJTQgI0AgQyAgOCQgICAgICA8ICAgIEwgIFQgJEAgIAotTSBYPCAuJzk/OSZdVThGUUU3VlVFOzYpRTxAICA1MCAvICIsICFAMCAgICAgIVAgICAgMCAgICA7ICE8IAotTSRAICAhKkQgLiJYUTlGJUs5MCAgTUAgICAgQCAgICBKICBUICRAICAgXSAgLic5PzhWQUE8RV1NOTZVQgotTTk3KCAgJTQgIDAgQyAgOCQgICAgICA8ICAgIEsgIFQgJEAgICBfTCAuJzk/PFZBTzxHMT87NjVNOEY1UgotTSAgITUgIDAgKFAgJiEgICAgICAnICAgICowIC0gISggICAwRCAjQVY3VkVOPSVdTTk2VUI5NyggICU0IAotTSFQIEMgIDgkICAgICAgPCAgICBKICBUICRAICAhJFggLic5PzsmXU45VV1NOTZVQjk3KCAgJTQgIkAgQwotTSAgOCQgICAgICA8ICAgIEsgIFQgJEAgICEnRCAuJzk/OUZRTzg3MT87NjVNOEY1UiAgITUgIFggKFAgJgotTSEgICAgICAnICAgICsgIC0gISggICAyRSAjQVY3VjFPPTYpTDk1XU05NlVCOTcoICAlNCAjUCBDICA4JAotTSAgICAgIDwgICAgJCAgICAqQCAmICEoICAgMzcgI0FWN1YtSDg3KT85RzVOOFAgIDUwICEgMSQgICEvWAotTSAyJCAgITA4ICAgICEgICAgIyQgIUAgMiAgICUjICBYPUVdUzo2PU45NjE/OFZBQTxFXUY9NllDICAhNQotTSAgKCEkMCAgJSIgISgwICAlJCAgICAgJCAgICAsUCAmICEoICAgNSMgI0FWN1c1TjxWRUc7RjVEN1YtSAotTTg3KT85RzVOOFAgIDUwICMgMSQgICExKCAyJCAgITFIICAgICEgICAgIkwgIUAgMiAgICU8QCBYPUVdUwotTTomXVI9JV1GPTZZQyAgITUgIDAhJDAgICUnICEoMCAgJSkgICAgICQgICAgLEAgJiAhKCAgIDZIICNBVgotTTdXLUk5VllFOSVdUzomXVI9JV1GPTZZQyAgITUgIDQhJDAgICUpQCEoMCAgJStAICAgICQgICAgLSAgJgotTSAhKCAgIDdAICNBVjdXNU48VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCAgJTQgIUAkMSAgIDRQICRBICAgNAotTVggICAgIDAgICAgSSAgOCAkQCAgIUBUIC4nOT86NllUN1Y5VTtGLCAgJTQgIVAkMSAgIDRaICRBICAgNQotTSIgICAgIDAgICAgUCAgOCAkQCAgIUQkIC4nOT88VkVHO0Y1RDdWRU49JV1GPTZZQyAgITUgIEAhJDAgIAotTSUxICEoMCAgJTMgICAgICQgICAgLEAgJiAhKCAgIDlXICNBVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQwotTSAgITUgIEQhJDAgICUzQCEoMCAgJTVAICAgICQgICAgKkAgJiAhKCAgIDpFICNBVjdWUU87Rj0/OUc1TgotTThQICA1MCAqIDEkICAhNUAgMiQgICE2ICAgICAhICAgICMkICFAIDIgICAmVkAgWD1FXVM6Nj1OOTYxPwotTTsmXU45VV1GPTZZQyAgITUgIEwhJDAgICU4QCEoMCAgJTpAICAgICQgICAgLFAgJiAhKCAgIDwxICNBVgotTTdXNU48VkVHO0Y1RDdWUU87Rj0/OUc1TjhQICA1MCAsIDEkICAhNlAgMiQgICE3MCAgICAhICAgICJMIAotTSFAIDIgICAnMCAgWD1FXUY7Jl1BPSVdRj02WUMgICE1ICBYISQwICAlPUAhKDAgICU/QCAgICAkICAgIAotTSsgICYgISggICA9UCAjQVY3VjFPPTYpTDk1XUY9NllDICAhNSAgXCEkMCAgJUAgISgwICAlQiAgICAgJAotTSAgICAlMCA1ICEoICAgPk4gKCwgITAkICAgP0ogICAgJTAgJSAhKCAgID46ICgsICEwJCAgID9KICAgIAotTSQgICUgISggICA+SiAlNCAhUCAgICAwICAgIFwgICQgJEAgICFeSCBFMCAgICosICogICAiICAgICAgIAotTSAgICAgICAoICAgICAgICAgICQgICBAICAgICAgICAgIEBAIDxAICAgIlggICAgOSAhLCAkQCAgIidMIAotTS4mUUk7RkwgICs4ICAgIjggICAgKUAgLSAhKCAgIEBJICNBTjk3QVQgICIjICA0ISAgICdaQCBDICA4JAotTSAgICAgIDwgICAgSiAgVCAkQCAgIiUsIC4mUUk7Rk1GPTZZQyAgIiMgIDQhICAgJzwgIEMgIDgkICAgIAotTSEgPCAgICBEICBUICRAICAiJzwgLictVD02OUYgICFSICAgJ0tAIEMgIDgkICAgICIgPCAgICAkICAgIAotTSUwIDUgISggICBCWSAoLCAhMCQgICA/SiAgICAlMCAlICEoICAgQkUgKCwgITAkICAgP0ogICAgJCAgJQotTSAhKCAgIEJVICU0ICFQICAgIDAgICAgXCAgJCAkQCAgIi80IEUwICAgKiwgKiAgICIgICAgICAgICAgIAotTSAgICggICAgICAgICAgJCAgIEAgICAgICAgICAgQEAgPEAgICAiWCAgICA8ICE8ICRAICAiOEQgLicxVQotTTdWUUk7RkwgICs4ICAgIjAgICAgKUAgLSAhKCAgIERXICNBTjk3QVQgICIjICA0ISAgICdaQCBDICA4JAotTSAgICAgIDwgICAgSiAgVCAkQCAgIjYkIC4mUUk7Rk1GPTZZQyAgIiMgIDQhICAgKD5QIEMgIDgkICAgIAotTSAgPCAgICBEICBUICRAICAiODQgLictVD02OUYgICFSICAgKE4wIEMgIDgkICAgICAgPCAgICAkICAgIAotTS5AICQgISggICBHJyAjQE4sRjlBOlY0ICArOCAgICAkIC8sICZQICAgIClCOyc1RSAgICAgICVHPEY1RQotTTtAICAgICAgPEY1RCAgICAgIDAgICAgXiAgMCAkQCAgIkBEIC4mLU87Jl1SPFAgIE1AICAgIDAgXFAgPwotTSAgICAgRyFJO0ZMICAgICAgNyFVPEchTDkwICAgICAgPjY1TDsmXVcgICAgICAwICAgIFIgIDAgJEAgIAotTSJDXCAuIlhTOUYlSzkwICBNQCAgICAwIFxQIDMgICAgIDY5TzxGMCAgICAgICYtSDk3OVkgICAgICAwIAotTSAgIFEgIDAgJEAgICJHMCAuJi1BPEcsICArOCAgICAkIC8sICUgICAgICVQO1cpUzhWQUUgICAgICAhQgotTTs3PCAgICAgISAgICAjKCAhICAyICAgKkpAIFgrQzFGODZNRSAgIlYgICAgISAjUyAhLCAgICAhNSUpNQotTTEwICAgICAgMUQlLDRUNCAgICAgISAgICAhUCAlQCAyICAgKlFAIFg4Rl1POyY1QTtAICA8QCAgIkcwIAotTSAgIFEgIDAgJEAgICJPTCAuJilWODZRUyAgIlYgICAgISAjUyAhLCAgICAhPScpVTkwICAgICAgOUYlTAotTTxWNCAgICAgISAgICAhVCAlQCAyICAgKyYgIFg4Rl1POyY1QTtDKCAgJyggICBLJiAgICAxQCAkICEoIAotTSAgTUIgI0FNOjctTzxGMUU8RjVEICAiViAgICAhICNTICIsICAgICM9JkFSOTY0ICAgICAgJ0lFPEZcIAotTSAgICAgNl1OOTAgICAgICI9Jz1PICAgICAgMCAgICBDICA4ICRAICAiWEQgLiZVQTo2WCAgJTQgIVAkMQotTSAgIDYqICRBICAgOSAgICAgIDAgICAgRyAgPCAkQCAgIlsgIC4nLVA7VylUPFYtQTxAICA8QCAgIkNcIAotTShQICUgUCAgKlZAICAgIEUgIDwgJEAgICJdNCAuJi1MPTZZSzk3KCAgJyggICBIKSAiLCAhMCwgICJLMAotTSAgICAqICAnICEoICAgT10gI0FOO1ZZUDxGRU04NylZICAhUiAgIClRUCBDICA0IyAgIElZICAgICI0IAotTSFQIDIgICAsKEAgWDwnKUk7NiVSPjAgIDxAICAiOEQgKFAgJSBQICAqPzAgICAgRCAgPCAkQCAgIyQ4IAotTS4nNT87JkVOOlAgIDxAICAiLzQgKFAgJSBQICAqTUAgICAgRyAgPCAkQCAgIyZUIC4nLT87JkVOOlAgIAotTUBQICUgMCAgIV5IIChQICUgUCAgKkZAICAgIEYgIDwgJEAgICMpLCAuJzk/PTZZSTtWWFIgICFSICAgIwotTUJQIEMgIDQjICAgSzwgICAgIjQgIVAgMiAgICxOICBYPUVdVTtGRU87QCAgPEAgICBGUCAoUCAlIFAgIAotTSpXQCAgICBHICA8ICRAICAjLVwgLic5PzxXMVI9Ni1ULEAgIDxAICAgNFggKFAgJSBQICAqSSAgICAgRwotTSAgPCAkQCAgIzA4IC4nOT88VzFSPTYtVCwwICA8QCAgICJYIChQICUgUCAgKkdAICAgIE8gIDwgJEAgIAotTSMzNCAuJzk/OSZdVThGUUU3VyFPOjZZVDk3KCAgJiwgIFAkICNQIEMgIDQjICAgSjwgICAgIlggIVAgMgotTSAgIC04UCBYPUVdRjsmXUE9JV1QO1ZFTj0mNVIgICFDICAsISAgWCAoUCAlIFAgICpKUCAgICBWICA8IAotTSRAICAjOUQgLic5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgICFDICAsISAgUCAoUCAlIFAgIAotTSo+QCAgICBUICA8ICRAICAjPFQgLic5PzxWRUc7RjVEN1ZRTztGPT88Jl1JO0cxRTxAICA4UCAjIDAgKwotTSAiLCAhMCwgICJKUCAgICArMCAnICEoICAgV1ogI0FWN1ZRTztGPT88Jl1JO0cxRTxAICA4UCAjIDAgKgotTSAiLCAhMCwgICJJICAgICAtMCAnICEoICAgWE8gI0FWN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UgotTSAgIUMgICwhICBEIChQICUgUCAgKkJAICAgIFMgIDwgJEAgICNGKCAuJzk/PFZFRztGNUQ3VkVOPSVdUAotTTtWRU49JjVSICAhQyAgLCEgIEAgKFAgJSBQICAqRjAgICAgTCAgPCAkQCAgI0hYIC4nOT86NllUN1chTwotTTo2WVQ5NyggICYsICBQJCAhUCBDICA0IyAgIEonICAgICM8ICFQIDIgICAuUTAgWD1FXVU7Ry1JOVZZRQotTTklXVM6Jl1SPSVdUDtWRU49JjVSICAhQyAgLCEgIDggKFAgJSBQICAqPSAgICAgVSAgPCAkQCAgI09IIAotTS4nOT88VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggICYsICBQJCAhMCBDICA0IyAgIEo7ICAgICJYIAotTSFQIDIgICAvKiAgWD1FXVM6Jl1SPSVdUDtWRU49JjVSICAhQyAgLCEgIDAgKFAgJSBQICAqS1AgICAgVgotTSAgPCAkQCAgI1VYIC4nOT89NllTOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSICAhQyAgLCEgICwgKFAgJQotTSBQICAqRUAgICAgVCAgPCAkQCAgI1koIC4nOT88VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUU8QCAgOFAgIwotTSAwICIgIiwgITAsICAiSyAgICAgKzAgJyAhKCAgIF5fICNBVjdWLUg4Nyk/PCZdSTtHMUU8QCAgOFAgIwotTSAwICEgIiwgITAsICAiSTQgICAgKSAgISAhKCAgIF9DICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIAotTTUwIC8gICAgKyAgJyAhKCAgISAvICNBVjdWMU89NilMOTVdQTxHKUE+MCAgPEAgICNbXCAoUCAlIFAgIAotTSo/QCAgICBEICAkICRAICAkIywgRTAgICAqLCAkICAgIiAgICAgICAgICAhIiAhNSAgWCAgICBLICA8IAotTSRAICAkJVggLic5PzlGUU84NzE/ODcpUjg3RCAgJyggICEgLyAiLCAhMCwgICJKVCAgICApICAhICEoIAotTSAhIiIgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgLCAgICAsUCAnICEoICAhIlUgI0FWN1c1TgotTTxWRUc7RjVEN1ZRTztGPT84NylSODdEICAnKCAgISE+ICIsICEwLCAgIkhQICAgICkgICEgISggICEjOQotTSApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCArICAgICwwICcgISggICEkKiAjQVY3Vy1JOVZZRQotTTklXUw7VllHN1YlUjxGJVkgICFSICAgME0wIEMgIDQjICAgSiQgICAgIjAgIDAgMiAgIDErQCI1ICAgIAotTUhQIDAgICAoICAgICAgICAgICQoICU0ICJAICAgIkggIVAgMiAgIDE2ICBYPUVdTDtWWUc3ViVSPEYlWQotTSAgIVIgICAxIkAgQyAgNCMgICBKUSAgICAiMCAgMCAyICAgMT8gIjUgICAgSFAgMCAgICggICAgICAgIAotTSAgJCggJTQgIjAgICAjKCAhUCAyICAgMUtAIFg9RV1VO0ctSTlWWUU5JV1JO0cxPzg3KVI4N0QgICcoIAotTSAhJTggIiwgITAsICAiSEAgICAgKSAgISAhKCAgIScyICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIAotTTUwICggICAgLCAgJyAhKCAgISgiICNBVjdXLUk5VllFOSVdSTtHMT84NylSODdEICAnKCAgISZOICIsIAotTSEwLCAgIkk8ICAgICkgICEgISggICEoRiApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCAnICAgIAotTSowICcgISggICEpLyAjQVY3VkVOPSVdQTxHKUE+MCAgPEAgICRAKCAoUCAlIFAgICo+UCAgICBEICAkIAotTSRAICAkRywgRTAgICAqLCAkICAgIiAgICAgICAgICAhIiAhNSAgOCAgICBUICA8ICRAICAkSjwgLic5PwotTT02WVM6Nj1OOTYxPzxWQU88RzE/ODcpUjg3RCAgJyggICEpLyAiLCAhMCwgICJJMCAgICApICAhICEoIAotTSAhKysgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgJSAgICAsQCAnICEoICAhK10gI0FWN1ctSQotTTlWWUU5JV1TOiZdUj0lXUE8RylBPjAgIDxAICAkSjwgKFAgJSBQICAqQUAgICAgRCAgJCAkQCAgJFIkIAotTUUwICAgKiwgJCAgICIgICAgICAgICAgISIgITUgIDAgICAgSyAgPCAkQCAgJFRQIC4nOT88VkFPPEcxPwotTTg3KVI4N0QgICcoICAhK10gIiwgITAsICAiSSwgICAgKSAgISAhKCAgIS1QICk0ICAgIkMgISAgICBAIAotTSAgICAgICAgIDBAIDUwICMgICAgLFAgJyAhKCAgIS5DICNBVjdXNU48VkVHO0Y1RDdWLUg4Nyk/ODcpUgotTTg3RCAgJyggICEtLCAiLCAhMCwgICJHKCAgICApICAhICEoICAhLycgKTQgICAiQyAhICAgIEAgICAgIAotTSAgICAgMEAgNTAgIiAgICAsMCAnICEoICAhL1ggI0FWN1ctSTlWWUU5JV1DOiYlUjdWJVI8RiVZICAhUgotTSAgIDNIUCBDICA0IyAgIEoiICAgICIwICAwIDIgICA0JyAiNSAgICBIUCAwICAgKCAgICAgICAgICAkKAotTSAlNCAgMCAgICJIICFQIDIgICA0MUAgWD1FXUM6JiVSN1YlUjxGJVkgICFSICAgM14gIEMgIDQjICAgSgotTUogICAgIjAgIVAgMiAgIDQ6QCBYPUVdRDtXNUI7JjQgICU0ICNQIEMgIDQjICAgSVYgICAgIiwgIVAgMgotTSAgIDRDMCBYPUVdRjsmXUE9ICAgNTAgLiAiLCAhMCwgICJILCAgICAqUCAnICEoICAhMlggI0FWN1c1TgotTTxWRUc7RjVEN1ZRTztGPCAgJTQgIyAgQyAgNCMgICBKMiAgICAiRCAhUCAyICAgNFgwIFg9RV1TOjY9TgotTTk2MT87Jl1OOVAgIDUwICsgIiwgITAsICAiRywgICAgKEAgJyAhKCAgITQjICNBVjdWUU87RjwgICU0IAotTSJAIEMgIDQjICAgSi4gICAgIkggIVAgMiAgIDUrMCBYPUVdVTtHLUk5VllFOSVdSTtHMCAgJTQgIjAgQwotTSAgNCMgICBJUCAgICAiQCAhUCAyICAgNTUwIFg9RV1TOjY9Tjk2MT86NllUICAhNSAgQCAoUCAlIFAgIAotTSo8MCAgICBBICA8ICRAICAlNzggLic5Pzo2WVQgICE1ICA8IChQICUgUCAgKj4gICAgIEwgIDwgJEAgIAotTSU6KCAuJzk/PTZZUzo2PU45NjE/PFZBTzxHMCAgJTQgIUAgQyAgNCMgICBJVSAgICAiSCAhUCAyICAgNQotTVMgIFg9RV1TOjY9Tjk2MT88VkFPPEcwICAlNCAhMCBDICA0IyAgIEorICAgICIsICFQIDIgICA1W1AgWAotTT1FXVM6Jl1SPSAgIDUwICQgIiwgITAsICAiSFwgICAgKlAgJyAhKCAgITg6ICNBVjdXNU48VkVHO0Y1RAotTTdWLUg4NyggICU0ICBQIEMgIDQjICAgSiJAICAgIkQgIVAgMiAgIDYwUCBYPUVdUzo2PU45NjE/OFZBQQotTTxAICA1MCAiICIsICEwLCAgIkkkICAgIChAICcgISggICE5RSAjQVY3Vi1IODcoICAlNCAgMCBDICA0IwotTSAgIEpTICAgICAwICAgICcgICAgICAgIkRAICAkXyAgICAhWV9fXCAgICAoICAgID5PX18gICAgLCAgIAotTSAnT19fUCAgICVAICAgIV1fX1wgICAiICAgICA/T19fICAgIEogICAgJ19fX1AgICAtICAgICIhX19cIAotTSAgI1ggICAgQE9fXyAgICEoICAgICgvX19QICAgNEAgICAiJV9fXCAgICVQICAgIEFPX18gICAhRiAgIAotTSAoP19fUCAgIDwgICAgIilfX1wgICAnSCAgICBCT19fICAgIiQgICAgKytfX1AgICBDQCAgICJVX19cIAotTSAgKSQgICAgTU9fXyAgICIzICAgICs/X19QICAgRUAgICAiWV9fXCAgIClEICAgIE5PX18gICAiPCAgIAotTSArT19fUCAgIEdQICAgIl1fX1wgICAqKCAgICBPT19fICAgIkUgICAgK19fX1AgICBKICAgICMhX19cIAotTSAgKkwgICAgUE9fXyAgICJOICAgICwvX19QICAgTDAgICAjJV9fXCAgICswICAgIFFPX18gICAiWCAgIAotTSAsR19fUCAgIE8gICAgIypfX1wgICAsICAgICBSX19fICAgIyQgICAgLFdfX1AgICBSICAgICMuX19cIAotTSAgLFAgICAgU19fXyAgICMwICAgIC0nX19QICAgVSAgICAjMl9fXCAgIC1AICAgIFRfX18gICAjPCAgIAotTSAtN19fUCAgIFggICAgIzZfX1wgICAuMCAgICBVX19fICAgI0ggICAgLUdfX1AgICBbICAgICM6X19cIAotTSAgLyAgICAgVy9fXyAgICNUICAgIC1XX19QICAgXiAgICAjPl9fXCAgIC9QICAgIFgvX18gICAkICAgIAotTSAuJ19fUCAgISEgICAgI0JfX1wgICAwQCAgICBZL19fICAgJCwgICAgLjdfX1AgICEkICAgICNGX19cIAotTSAgMTAgICAgWi9fXyAgICQ4ICAgIC5HX19QICAhJyAgICAjSl9fXCAgIDIgICAgIFsvX18gICAkRCAgIAotTSAuV19fUCAgISogICAgI09fX1wgICAyUCAgICBcL19fICAgJE8gICAgLydfX1AgICEsQCAgICNSX19cIAotTSAgMzQgICAgXS9fXyAgICRYICAgIC87X19QICAhLyAgICAjV19fXCAgIDNQICAgICAvX18gICAlJCAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkIAotTSAgICEgICAgIEAgICQtMCAgICM0ICAgICRQICAgICAgICAgICAgICAgMCAgICAgICAgICkgICAgITAgIAotTSAgKCAgISNIICAgIFogICAgJEAgICAgIyAgICAgICAgICAwICAgICQgICAgI1AgICAgTCAgICAiICAgMQotTSwgICAgMyAgICAjMCAgICAhICAgICAoICAgICQgICAgJCAgICAhPCAgICAjICAgICBAICAkQCAgICAoIAotTSAgICA+UCAgICAgICAgICAgICAgIDAgICAgICAgICA/ICAgICEgICAgICggICEpXCAgICI/ICAgICMgIAotTSAgICMgICAgIVAgICAgMCAgICAsICAgICowICAgIFAgICAgJiAgIDJMICAgIEsgICAgIDAgICAgICAgIAotTSAgICAgICAwICAgICIgICAgIlwgICAgLCAgICAhQCAgJEwgICAgKyAgICAgQCAgICAgICAgICAgICAgIAotTSQgICAgIEAgICAgVCAgICAjICAgICA4ICAhLSAgICAjMCAgICE8ICAgICAgICAgICAgICAgISAgICAgKAotTSAgICAuQCAgICBQICAgICYgICA5ICAgICIwICAgICAwICAgICAgICAgICAgICAgMCAgICAiICAgICQgIAotTSAgICEgICAgIEAgICYxICAgIEQwICAgICUgICAgICAgICAgICAgICAiICAgICAgICAgISggICAgIDAgIAotTSAgLCAgIkREICAgKSkgICAgIEAgICAgICAgICAgICAgICAwICAgICAgICAgM0AgICAgJCAgICAjICAgSQotTSwgICAiMyAgICAgPCAgICAgICAgICAgICAgIDAgICAgISAgICAlLCAgICAmICAgICBQICAqNFAgICBFLAotTSAgICA8ICAgICAwICAgICAgICAgISAgICAgQCAgICE8ICAgICIgICAgICwgICJHICAgIClQICAgIDwgIAotTSAgICAgICAgICAgICAgQCAgICAgICAgIDgwICAgICggICAgICAgICAgICAgIjwgICAgPCAgICAgJCAgIAotTSAhUCAgICAkICAgICQgICAgJkQgICAgIyAgICAgICAgICAgICAhIyAgICAkVDAgICAgICAgICAgICAgIAotTSAwICAgICAgICAhUSAgICAgUCAgICAgICAgICAgICA1RDAgICApJCAgICAgICAgICAgICAgICQgICAgIAotTSAgICA+UCAgICAkICAgICAgICAgICAgICVCKCAgIDBOICAgICAgICAgICAgICAgISAgICAgICAgICgwIAotTSAgICEgICAgICAgICAgICAgIUkwICAgNjwgICAgICAgICAgICAgICAhICAgICAgICAgIisgICAgIDAgIAotPiAgICAgICAgICAgUFAgICAgSSggICAgICAgICAgICAgICAkICAgICAKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWFvdXQudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1hb3V0LnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOTVmYzAuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWFvdXQudQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi1iZWdpbiA3NzcgbTY4ay1hb3V0Ci1NICAgISJQICAkICAgICEgICAgICAgICAgIyRAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICRZNl9fIShVU0IgMl5YICEkR00gIDBGMyRKPDlPUllUVjQiNjhQQ1MgICAkIDBPLjAgICQgME8iUlw1Ci1NOD9cICAgJSJXT1AgIyJcIDg/XCAgIC0uNihdLFtDQiBfXyEuN0RZVTNFOCAgJFk+M0c0ICAkQC4gICAgCi1NICRDNyAgIVAgJiAgICApLjdEWVUyIFggICAgIDItPCAgJyAgOCAgICBEWT4zRzUoI0AgICAgIShVUCAgCi1NPCAhQCAgICIzRVkuPTRALiAgICAgJEM3ICAhUCAmICAgICkuN0RZVTIgWCAgICAgMi08ICAnICA4ICAgCi1NIERZPjNHNSgjQCAgICAhKFVQICA8ICFAICAgIjNFWS49NEAuICAgICAkQzcgICEiQCYgICAgKS43RFlVCi1NMiBYICAgICAyLTwgICQqIDggICAgRFk+M0c1KCNAICAgICEoVVAgIDBIIUAgICAiM0VZLj00QC4gICAgCi1NICRDNyAgISJAJiAgICApLjdEWVUyIFggICAgIDItPCAgJCogOCAgICBEWT4zRzUoI0AgICAgIShVUCAgCi1NMEghQCAgICIzRVkuPTRALiAgICAgJEM3ICAjUiAlUC84ICAgIERZPjNHNSgjQCAgICAhKFVQICBcQCE8Ci1NI1YgICAgKS43RFlVMiBYICAgICAyLTwgICQoWSAgIDAtIS9cICAkICAhIFYkX1AgIEAgICQjQFNfICAjCi1NICAgMC5DL1wgIDAgICEgXCxfUCAhMCAgJCNZUCFCLyAgICAwMCcgJyhcICAgISEkPCBAQ1AgICAkJEFQCi1NIjIvICAgIDAzJyAqKFwgICAhITA8IExDUCAgICQlMENfJCsoICAgICAhITgoX1EgOjAgICAgIDA3Ii9cCi1NICAgICAgICAkJiAzXjAgICQjMCAgISFEJF9EICAhIFYgICAwOUEvWSAgIDAuICAgJCZAU14wICAkI0ggCi1NICEhTCxfRCAgISBcICAgMDwjL1kgICAwL0AgICQnMENeMCAgJCQgICAhIVwoX0QgICEhJCAgIDBBIi9ZCi1NICAgMDIgICAkKFBDXjAgICQkUCAgISI0KF9EICAhITAgICAwRyIvWSAgIDA1ICAgJCowQ14wICAkJUAgCi1NICEiTChfRCAgISE8ICAgME0iL1kgICAwOCAgICQrQENfICAgJCMwICAhIyQoX1AgICEgViAgIDBSIi9cCi1NICAgMC4gICAkLFBDXyAgICQjSCAgISMwKF9QICAhIFwgICAwVSIvXCAgIDAvQCAgJC1AQ18gICAkJCAgCi1NICEjPChfUCAgISEkICAgMFgiL1wgICAwMiAgICQuMENfICAgJCRQICAhI0goX1AgICEhMCAgIDBbIi9cCi1NICAgMDUgICAkLyBDXyAgICQlQCAgISNUKF9QICAhITwgICAwXicgIihcICAgISc0PCAoQ1AgICAkPUFQCi1NIDIvICAgIDFYJyAhKFwgICAhJzwoX0QgICEkXCAgIDExIy9ZICAgMSsgICAkMzEuN0RZVTAiQEMqNjFCCi1NPidBWCtHLCktMlhSKCJBIjk3KUs5NlFFPjJEQC1SXFEsQlxYLTAgIDInRCAgISdIKCdEICAhJ0QzSSE4Ci1NQ1RZUiJIUS41QCAgOD9cICAgIDYrUlggIiYnXyAgICAlJUIvM0VZLj0wICAzRTggICRZPjNHNS41QCAgCi1NPCAlLjAiLyAgICAzWScjXzNFWS49MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAhICwgICAgICRZVSAgISAqIixJOFcpVCwiWUMiMzBOLUIgSDBGNVI6VjVMOTdESSgjLE8sUyBPCi1NLiMsICAgICAgICAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAhIDAgICYwICAgICAgICAgIlAwICApKCAgICE0ICAgICRWMCAgICAgICAhNCAgICAmWCAgCi1NICAgICAgICAgICAgLzggICAgICAgICAgICAgIDNYICAgICAgICAgICAgICA8SCAgICAgICAgICAgICAgCi1NQyggICAgICAgICAgICAgIElYICAgICAgICAgICAgICBROCAgICAgICAgICAgICAgV1ggICAgICAgICAgCi1NICAgIF4oICAgICAgICAgICAgICEiOCAgICAgICAgICAgICAhJyggICAgICAgICAgICAgISooICAgICAgCi1NICAgICAgICEsQiAgICAkICAgICAgICAhLyIgICAgJCAgICAgICAgITMyICAgICQgICAgICAgICE4IiAgCi1NICAoICAgICAgICAhOlIgICAgKCAgICAgICAgIT8yICAgICggICAgICAgICFEMiAgICAwICAgICAgICAhCi1NRkIgICAgMCAgICAgICAgIUpCICAgIDAgICAgICAgICFPIiAgICAwICAgICAgICAhUUIgICAgMCAgICAgCi1NICAgIVVSICAgIDAgICAgICAgICFaQiAgICAwICAgICAgICAhXTIgICAgQCAgICAgICAgIiBCICAgICQgCi1NICAgICAgICInMiAgICAkICAgICAgICAiLTIgICAgJCAgICAgICAgIjYyICAgICggICAgICAgICI9MiAgCi1NICAoICAgICAgICAiQ0IgICAgKCAgICAgICAgIkxSICAgIDAgICAgICAgICJTMiAgICAwICAgICAgICAiCi1NWSIgICAgMCAgICAgICAgIyFSICAgIDAgICAgICAgICMmIiAgICAwICAgICAgICAjLCIgICAgMCAgICAgCi1NICAgIzJCICAgIDAgICAgICAgICM5QiAgICBAICAgICAgICAjQSIgICAgJCAgICAgICAgI0ZCICAgICQgCi1NICAgICAgICNNIiAgICAkICAgICAgICAjVFIgICAgKCAgICAgICAgI1pCICAgICggICAgICAgICQhMiAgCi1NICAoICAgICAgICAkKTIgICAgMCAgICAgICAgJC5CICAgIDAgICAgICAgICQ0UiAgICAwICAgICAgICAkCi1NPDIgICAgMCAgICAgICAgJEEiICAgIDAgICAgICAgICRHQiAgICAwICAgICAgICAkTkIgICAgMCAgICAgCi1NICAgJFQyICAgIEAgICAgICAgICRaSCAgICFDX19fTCUgICAlQFIgICAhQCAgICAgICAgJUQyICAgIUAgCi1NICAgICAgICYqWCAgICBDX19fTCUgICAmTyIgICAgQCAgICAgICAgJlIiICAgIEAgICAgICAgICc2QjAgCi1NICAkICAgITQgICAgICQwICAnRCAgICE+ICAgJzoyMCAgICQgICAhSCAgICAgJDAgICdIICAgIVIgICAnCi1NP1IwICAgJCAgICFcICAgICAkMCAgJ0wgICAiJiAgICdFUjAgICAoICAgIjAgICAgICQwICAnVCAgICI6Ci1NICAgJ0lSMCAgICggICAiRCAgICAgJDAgICdYICAgIk4gICAnT0IwICAgKCAgICJYICAgICAkMCAgJ1wgCi1NICAjIiAgICdVUjAgICAwICAgIywgICAgICQwICAoJCAgICM2ICAgJ1kyMCAgIDAgICAjQCAgICAgJDAgCi1NICgoICAgI0ogICAnXkIwICAgMCAgICNUICAgICAkMCAgKCwgICAjXiAgICgkMjAgICAwICAgJCggICAgCi1NICQwICAoNCAgICQyICAgKCgiMCAgIDAgICAkPCAgICAgJDAgICg4ICAgJEYgICAoLUIwICAgMCAgICRQCi1NICAgICAkMCAgKDwgICAkWiAgICgzQjAgICAwICAgJSQgICAgICQwICAoRCAgICUuICAgKDdCMCAgIEAgCi1NICAlOiAgICAgJDAgIChIICAgJUQgICAoPCggICApQ19fX0wlICAgKFciICAgKUAgICAgICAgIChZWCAgCi1NICkjX19fTCUgICApKVIgICApICAgICAgICAgKSxCICAgIDAgICAgICAgICk1SCAgICAzX19fTCUgICApCi1NPzIgICAgMCAgICAgICAgKUMiICAgIDAgICAgICAgIClKSCAgICAzX19fTCUgICApUUIgICAgMCAgICAgCi1NICAgKVUoICAgIDNfX19MJSAgIClcSCAgICAzX19fTCUgICAqI0ggICAgM19fX0wlICAgKiZYICAgIDNfCi1NX19MJSAgICoyIjAgICAwICAgJVAgICAgICQwICArKCAgICVaICAgICAkMCAgKywgICAlWiAgICAgJDAgCi1NICswICAgJVogICAgICQwICArNCAgICVaICAgICAkMCAgKzggICAmICAgICAgJDAgICs8ICAgJiggICAgCi1NICQwICArQCAgICYwICAgICAkMCAgK0QgICAmMCAgICAgJDAgICtIICAgJjggICAgICQwICArTCAgICZACi1NICAgICAkMCAgK1AgICAmSCAgICAgJDAgICtUICAgJkggICAgICQwICArWCAgICZQICAgICAkMCAgK1wgCi1NICAmWCAgICAgJDAgICwgICAgJyAgICAgICQwICAsJCAgICcgICAgICAkMCAgLCggICAnKCAgICAgJDAgCi1NICwsICAgJzAgICAgICQwICAsMCAgICc4ICAgICAkMCAgLDQgICAnOCAgICAgJDAgICw4ICAgJ0IgICAgCi1NICQwICAsPCAgICdWICAgICAkMCAgLEAgICAnViAgICAgJDAgICxEICAgJ1YgICAgICQwICAsSCAgICggCi1NICAgICAkMCAgLEwgICAoKiAgICAgJDAgICxQICAgKDQgICAgICQwICAsVCAgICg0ICAgICAkMCAgLFggCi1NICAoPiAgICAgJDAgICxcICAgKEggICAgICQwICAtICAgIChSICAgICAkMCAgLSQgICAoUiAgICAgJDAgCi1NIC0oICAgKFwgICAgICQwICAtLCAgICkmICAgICAkMCAgLTAgICApMCAgICAgJDAgIC00ICAgKTAgICAgCi1NICQwICAtOCAgICk6ICAgICAkMCAgLTwgICApRCAgICAgJDAgIC1AICAgKU4gICAgICQwICAtRCAgIClOCi1NICAgICAkMCAgLUggICApWCAgICAgJDAgIC1MICAgKiwgICAgICQwICAtUCAgICosICAgICAkMCAgLVQgCi1NICAqNiAgICAgJDAgIC1YICAgKkAgICAgICQwICAtXCAgICpKICAgICAkMCAgLiAgICAqSiAgICAgJDAgCi1NIC4kICAgKlQgICAgICQwICAuKCAgICpeICAgICAkMCAgLiwgICArKCAgICAgJDAgIC4wICAgKyggICAgCi1NICQwICAuNCAgICsyICAgICAkMCAgLjggICArPCAgICAgJDAgIC48ICAgK0YgICAgICQwICAuQCAgICtGCi1NICAgICAkMCAgLkQgICArUCAgICAgJDAgIC5IICAgK1ogICAgICQwICAuTCAgICwkICAgICAkMCAgLlAgCi1NICAsJCAgICAgJDAgIC5UICAgLC4gICAgICQwICAuWCAgICw4ICAgICAkMCAgLlwgICAsOCAgICAgJDAgCi1NIC8gICAgLEAgICAgICQwICAvJCAgICxIICAgICAkMCAgLyggICAsUCAgICAgJDAgIC8sICAgLFggICAgCi1NICQwICAvMCAgICxYICAgICAkMCAgLzQgICAtIiAgICAgJDAgIC84ICAgLSIgICAgICQwICAvPCAgIC0sCi1NICAgKjQgMCAgLzwgICAtMCAgICo1IDAgICAgICAgLTAgICAqNyAwICAgICAgIC4oICAgKjhQMCAhTiggCi1NICAuRCAgICo6UDAgIFk4ICAgLkwgICAqPFAwICFOKCAgIC5UICAgKj8gPCAhNyggICEgJCAgICpBMDQgCi1NITBYICAgICAgICAqQlA0ICBXWCAgICVQICAgKkQwNCAgWiAgICAuKCAgICpFUDQgIUJYICAgISogICAqCi1NSFA8ICApKCAgISAoICAgKkpARCAhVDggICEgVCAgICpMQEQgIV5YICAhIFYgICAqUDBEICEmOCAgISBYCi1NICAgKlRARCAhWUggICEgWiAgICpWUEQgICRQICAhIFwgICAqWlBEICA9SCAgISBeICAgKl8wRCAhXyAgCi1NICEhICAgICshIEQgIiQwICAhISQgICArJEBEICFIICAgISEoICAgKyhARCAhW0QgICEhLCAgICsqQEQgCi1NIiYkICAhITAgICArLjBEICEtRCAgISE0ICAgKzJARCAhTEAgICEhOCAgICs0UEQgITZMICAhITwgICArCi1NNzBEICFXLCAgISFEICAgKzpQRCAhRVQgICEhRiAgICtAIEQgISZEICAhIUggICArRVBEICBJRCAgISFMCi1NICAgK0lARCAgJlQgICEhUCAgICtPIEQgITIsICAhIVQgICArVSBEICFNVCAgISFcICAgK1gwRCAgQCwgCi1NICEiJCAgICtdMEQgIDBEICAhIiwgICAsIlBEICA7TCAgISI0ICAgLCYwRCAgKjQgICEiPCAgICwrQEQgCi1NIVRcICAhIkQgICAsMTBEICA8VCAgISJMICAgLDUgRCAgK0QgICEiVCAgICw5IEQgIiUoICAhIyQgICAsCi1NPSBEICBfSCAgISMoICAgLEJQRCAhLEAgICEjLCAgICxJIEQgIUI4ICAhIzAgICAsTTBEICFBMCAgISM0Ci1NICAgLFMwRCAhWlAgICEjOCAgICxZUEQgIT9IICAhIzwgICAsXUBEICBcWCAgISNAICAgLSMgRCAiKDAgCi1NICEjRCAgIC0pIEQgIEpYICAhI0ggICAtLSBEICFPMCAgISNMICAgLTJQRCAhXCggICEjUCAgIC05IEQgCi1NIE84ICAhI1QgICAtPTBEICFUMCAgISNYICAgLUFQRCAhUkwgICEjXCAgIC1EQEQgIVJQICAhJDQgICAtCi1NRzBEICFcOCAgISRMICAgLUlARCAhUiAgICEkVCAgIC1MIDQgIFpMICAgITQgICAtTzA0ICFWXCAgICFICi1NICAgLVQwNCAhRzQgICAhXCAgIC1ZUDQgIThUICAgIjAgICAtXTA0ICEnPCAgICJEICAgLiJANCAgSCwgCi1NICAiWCAgIC4oMDQgIVpcICAgIywgICAuKzA0ICAvLCAgICNAICAgLjAgNCAhLDQgICAjVCAgIC41MDQgCi1NICxcICAgJCggICAuOEA0ICEpLCAgICQ8ICAgLj1ANCAgWUQgICAkUCAgIC5DIDQgITI8ICAgJSQgICAuCi1NRkA0ICEpVCAgICU6ICAgLkowRCAhVDQgICEkXCAgIC5MMEQgIVg0ICAhJSQgICAuTjBEICFcXCAgISc0Ci1NICAgLlBARCAgRzwgICEnOCAgIC5TQEQgISlYICAhJzwgICAuVVBEICBPQCAgISdAICAgLlhARCAgMjwgCi1NICEnRCAgIC5aUDQgIDpEICAgLVQgICAuXSA0ICA7MCAgIC4kICAgLl8wPCAhLDggICEgUCAgIC8hUDQgCi1NIFk4ICAgLkQgICAvJDA0ICFOKCAgIC5MICAgLyYgNCAiIVAgICAuVCAgIC8nUEQgIVk8ICAhL0QgICAvCi1NKUYtUj0jIE47UCFHOSYpTTkyWU8gJj1EOEZVRStGLCA6NllULkcwUS83KFEuUlRSLDMwVy0jQFMtQzBYCi1NLlMoUS0jPFQuIyxWLSM8WyAmLUg4NyhaPSMoXTxDKFssI0xRLEM8WyAmUU87RjxaPSMsXTxDJFsrMyhRCi1NLSM8VC4jLFYtI0BbLEMkVC1TMFgsUzhULVNMIDxWQU88RzBaPSMwXTxDJFsrMyxSLVM4WC5TLFItUzhXCi1NLlAhVTtHLUk5VllFOSIhQzomJVIuRzBVLzcoUS5TIFssQzRVLlAhVTtHLUk5VllFOSIhUzomXVI9I0lUCi1NLUNVUiwzTFAuUzhVLTMsVS5QIVU7Ry1JOVZZRTkiIUw7VllHLkcwVy83KFEuUyBbKzMkWyAnNU48VkVHCi1NO0Y1RCgmRU49I0lULiNVUiwzTFAuUlRRLlAhRjsmXUE9I0lULjNVUiwzTFQuUyBbICYxTz02KUw5M0lUCi1NLDMgXTxDJFsuI0xQLlAhVjtWRUQuRzBRLDNUUSwwIF8vU1xaPSMkUi8zJCA9RV1DOiYlUi5EPFIgJzk/Ci1NPFZFRztGNUQ3Vi1IODcoWjFTKCA9RV1VO0ctSTlWWUU5JV1DOiYlUi5EPFUgJzk/PFZBTzxHMFoxUzAgCi1NPUVdUzo2PU45NjE/PFZBTzxHMFoxUzAgPUVdVTtHLUk5VllFOSVdUzomXVI9I0knLUAhVjdWRU49I0knCi1NLDAhVjdXLUk5VllFOSVdSTtHMFoxUyQgPUVdVTtHLUk5VllFOSVdSTtHMFoxU0AgPUVdTDtWWUcuRDxRCi1NICc5PzxWRUc7RjVEN1ZRTztGPFoxUyQgPUVdVTtHLUk5VllFOSVdTDtWWUcuRDxYICc5PzlGUU84NzBaCi1NMVNEID1FXUQ7VzVCOyY0WjFTJFAgJzk/OFZBQTxFXUE8RylBPjNJJywzLF04NyhRLlMgWywzTFIgJzk/Ci1NPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0RaMVMkUyAnOT89NllTOjY9Tjk2MT84VkFBPEVdQTxHKUE+M0knCi1NLDMwXTg3KFEuUyBbLDNMVSAnOT88VkFPPEcxPzg3KVI4N0RaMVMkVS82JVIsM0xQLlMkWy0gIVY3Vy1JCi1NOVZZRTklXVM6Jl1SPSVdQTxHKUE+M0knLDM0ID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdQTxHKUE+M0knCi1NLDM4XTg3KFEuUyBbLDNMViAnOT86NllUN1YlUjxGJVkuRDxRLVNVQTxDJFssI0xRLlMkID1FXVM6Nj1OCi1NOTYxPzo2WVQ3ViVSPEYlWS5EPFEtUCFWN1c1TjxWRUc7RjVEN1ZFTj0lXUE8RylBPjNJJywzQF04NyhRCi1NLlMgWywzTFggJzk/OyZdTjlVXUE8RylBPjNJJywzPCA9RV1TOjY9Tjk2MT87Jl1OOVVdQTxHKUE+M0knCi1NLDM8ID1FXVU7Ry1JOVZZRTklXUw7VllHN1YlUjxGJVkuRDxRLiAhVjdWOUw7ViVUN1YlUjxGJVkuRDxRCi1NLjNVQTxDJFssI0xRLlNEID1FXUQ7VzVCOyY1Pzg3KVI4N0RaMVMoUC82JVIsM0xQLlMkWywzICA9RV1DCi1NOiYlUjdXIU86NllUOTcoWjFTKFEvMkhSICc5PzxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRTxDSScsQyQgCi1NPUVdVTtHLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KFoxUyhSLzJIVSAnOT88VkFPPEcxPzwmXUk7RzFFCi1NPENJJyxDLF0qQzAgPUVdUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxDSScsQywgPUVdVTtHLUk5VllFCi1NOSVdUzomXVI9JV1QO1ZFTj0mNVIuRDxSLSNUSi1AIVY3VkVOPSVdUDtWRU49JjVSLkQ8Ui0zVEosMCFWCi1NN1ctSTlWWUU5JV1JO0cxPzwmXUk7RzFFPENJJyxDNCA9RV1VO0ctSTlWWUU5JV1JO0cxPzwmXUk7RzFFCi1NPENJJyxDOF0qQ0AgPUVdTDtWWUc3VyFPOjZZVDk3KFoxUyhVICc5PzxWRUc7RjVEN1ZRTztGPT88Jl1JCi1NO0cxRTxDSScsQzQgPUVdVTtHLUk5VllFOSVdTDtWWUc3VyFPOjZZVDk3KFoxUyhWICc5PzlGUU84NzE/Ci1NPCZdSTtHMUU8Q0knLEM8XSpDRCA9RV1EO1c1QjsmNT88Jl1JO0cxRTxDSScsQ0BdKkMkUCAnMT88VzFSCi1NPTYtVC5FMFIuM1VTLEMxVjdWLUg4Nyk/OzY1TThGNVIuQyhMLCJQWC5XOT88VkFPPEcxPzs2NU04RjVSCi1NLkMwTCwzOEwsMzhbPUVdSTtHMT87NjVNOEY1Ui5DJEwsUyhMLFMoWz1FXUw7VllHN1ZVRTs2KUU8Q0hRCi1NKyM4VCsjLFIuVzk/OUZRTzg3MT87NjVNOEY1Ui5DREwuMzhMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSCi1NLkMkUCsjJFIuIlBWLSNMWyAnOT88VzFSPTYtVCwzSScsQ0QgPUVdUz0nKVU4VzBSLkQ8UywjVVMsQzFWCi1NN1YtSDg3KT87NjVNOEY1Ui5DKEwsIlBYLlc5PzxWQU88RzE/OzY1TThGNVIuQzBMLDM4TCwzOFs9RV1JCi1NO0cxPzs2NU04RjVSLkMkTCxTKEwsUyhbPUVdTDtWWUc3VlVFOzYpRTxDSFErIzhUKyMsUi5XOT85RlFPCi1NODcxPzs2NU04RjVSLkNETC4zOEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIuQyRQKyMkUi4iUFYtI0xbCi1NICcxPz02WUk7VlhaNSMsUS83NFg9RV1DOiYlUjdWVUU7NilFPENIUisjIEwuI01WN1ctSDtXKVQ3VlVFCi1NOzYpRTxDSFQrIyBMLDM4Wz1FXUk7RzE/OzY1TThGNVIuQyRMLCJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSCi1NLkMkTCwiUFMsQ01WN1Y5TDtWJVQ3VlVFOzYpRTxDSFkrIyBMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSCi1NLkMkUCsjIEwtQzBbLlAhVjdXNU46Nl1OLkQ8UywwIVY3VzVOOjZdTixDSScsUyhdPTNBVjdWLUg4Nyk/Ci1NOzY1TThGNVIuQyhMLCJQWC5XOT88VkFPPEcxPzs2NU04RjVSLkMwTCwiUFEtQ01WN1ZFTj0lXU05NlVCCi1NOTcoWiwyUFArIyxSLlc5PzsmXU45VV1NOTZVQjk3KFosMlBQKyMsUi5XOT85RlFPODcxPzs2NU04RjVSCi1NLkNETCwiUFMsQ01WN1YxTz02KUw5NV1NOTZVQjk3KFosMyBMLCJQVi0jTFsgJzk/OFZBQTxFXUY9NllDCi1NLkQ4UiAnOT88VkVHO0Y1RDdWLUg4Nyk/OUc1TjhTSSYsQCFWN1c1TjxWRUc7RjVEN1YtSDg3KT85RzVOCi1NOFNJJi0wIVY3Vy1IO1cpVDdWOVU7RixaMUMwID1FXVM6Nj1OOTYxPzxWQU88RzE/OUc1TjhTSSYtICFWCi1NN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsWjFDOCA9RV1JO0cxPzlHNU44U0kmLDAhVjdXLUk5VllFCi1NOSVdSTtHMT85RzVOOFNJJiwwIVY3VzVOPFZFRztGNUQ3VkVOPSVdRj02WUMuRDhYICc5PzsmXU45VV1GCi1NPTZZQy5EOFEgJzk/PFZFRztGNUQ3VlFPO0Y9PzlHNU44U0kmLDAhVjdXNU48VkVHO0Y1RDdWUU87Rj0/Ci1NOUc1TjhTSSYuICFWN1Y5TDtWJVQ3VjlVO0YsWjFDRCA9RV1EO1c1QjsmNT85RzVOOFNJJiwzICA7JkVOCi1NOlNJNCxTLF08UyRVLEZZRT4nMFosUzBdKkMsUysjIEwsUyhbOyZFTjpWOVU7RixaLFM0XSpDLFYvNjhTCi1NLSJQUyxCUFMsQ01TPSc1RjlDSFMtU1VBPEMkWywjTFAuUyxYLzYlUiwzTFAuUyRbLFNEXTg3KFEuUyBbCi1NLENMUi4yUFYtIlBRLDM0Ui5TTCA8VV1MOjZZSy5EPFMtICFUPTVdTDo2WUsuRTBULCNVVSwzMFQ7RjVYCi1NPSNIUy0iUFArIyxSLlZRSTtGTUY9NllDLkMsVSsjIEwsUyhbPFcxVTlGOFosUzxMLCJQUSwzNFIuU0wgCi1NPTVdTDo2WUsuRDxULCAhUDxGRU04NylZLkQ8VCwzVUU8RjVELkMgTDlXKUU5NlhaLDJRQjsnNUUuQyhMCi1NLlAhQztWUU88RyxaNSMwUi82NVk5NlFMO1c8WiwiUVA9NylQOyY0WiwyUVA6NllLLkMoTC5QIU47VllQCi1NPEZFTTg3KVkuRDxULEAhQzsnNU46VjVSLkQ8VCxTVUU4VkFFPUdEWiwiUUY7VylELkMkTC5QIUM4NylTCi1NLkUwVC0jVUU4RlVXLkMgTDwmXVI8Vi1IOTNIUSsjTCA8VyFPPEcxUzhWJVIuRDxULSAhQjtWXUw5NiVOCi1NLkcwVC0zVUUxRCUsNFQ0WiwiUTQ0RTUlLkMkTC5QIUI9RiVMPFNJNC0jOF05NjlBOyctRS5DIEw9JylVCi1NOTNIUSsjTCA4Rl1POyY1QTtDKFo9IzBWICZVSTxWXVI5JjVSOTYwWjUjMFcvNjVUPVZcWixCUU87RjRaCi1NLDJRWjk3KU8uQyBMPSZBUjk2NFosUlBbICZVQTo2WFoxQyQgKzZRRyAlXVM4Vi1TOjYwIDk3QUk9IllPCi1NICY5QTpWLVUrRlwgN1Y1WDo3ME47UCFDOTcpUjtXKE47UCE/OTZZVjo3KU87QCFTPSYlUj0gIT87NiVJCi1NO0AhPzk3QUk9ICE/OzZdTjhWXU49JylPOyAhTThWXVU7RzAgN1c5PzhWQUE8QCE/PUVdUzo2PU45NjE/Ci1NOFZBQTxAIT89RV1VO0ctSTlWWUU5JV1DOiYlUiAlXVY3Vy1IO1cpVCAlXVY3Vy1JOVZZRTklXVM6Jl1SCi1NPSAhPz1FXVU7Ry1JOVZZRTklXVM6Jl1SPSAhPz1FXUk7RzAgN1c5PzxWRUc7RjVEN1ZFTj0gIT89RV1VCi1NO0ctSTlWWUU5JV1JO0cwIDdXOT87Jl1OOVAhPz1FXVM6Nj1OOTYxPzsmXU45UCE/PUVdVTtHLUk5VllFCi1NOSVdTDtWWUcgJV1WN1Y5TDtWJVQgJV1WN1YxTz02KUw5MCE/PUVdQzomJVI3ViVSPEYlWSAlXVY3Vy1JCi1NOVZZRTklXUM6JiVSN1YlUjxGJVkgJV1WN1c1TjxWRUc7RjVEN1YtSDg3KT84NylSODdEIDdXOT88VkFPCi1NPEcxPzg3KVI4N0QgN1c5PzxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3Vy1ICi1NO1cpVDdWJVI8RiVZICVdVjdWRU49JV1BPEcpQT4wIT89RV1TOjY9Tjk2MT86NllUN1YlUjxGJVkgJV1WCi1NN1c1TjxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhPz1FXUw7VllHN1YlUjxGJVkgJV1WN1ctSTlWWUU5JV1MCi1NO1ZZRzdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA3Vzk/OUZRTzg3MT84NylSCi1NODdEIDdXOT85Jl1VOEZRRTdWJVI8RiVZICVdVjdWLUg4Nyk/PCZdSTtHMUU8QCE/PUVdUzo2PU45NjE/Ci1NOFZBQTxFXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQ3Vi1IODcpPzwmXUk7RzFFPEAhPz1FXVM6Jl1SCi1NPSVdUDtWRU49JjVSICVdVjdXLUk5VllFOSVdUzomXVI9JV1QO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVECi1NN1ctSDtXKVQ3VyFPOjZZVDk3KCA3Vzk/OjZZVDdXIU86NllUOTcoIDdXOT88VkVHO0Y1RDdWRU49JV1QCi1NO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAlXVY3VlFPO0Y9PzwmXUk7RzFFCi1NPEAhPz1FXVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT88Jl1JCi1NO0cxRTxAIT89RV1GOyZdQT0lXVA7VkVOPSY1UiAlXVY3VjFPPTYpTDk1XVA7VkVOPSY1UiAlXVY3Vy1UCi1NPEc1Qz0jJCA3Vzk/PFcxUj02LVQsQCE/PUVdVTtGRU87QCE/PUVdVTtGRU87QyggN1c5PzhWQUE8RV1GCi1NPTZZQyAlXVY3Vy1JOVZZRTklXUM6JiVSN1Y5VTtGLCA3Vzk/PTZZUzo2PU45NjE/OFZBQTxFXUY9NllDCi1NICVdVjdXLUg7VylUN1Y5VTtGLCA3Vzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgN1c5Pz02WVM6Nj1OCi1NOTYxPzxWQU88RzE/OUc1TjhQIT89RV1JO0cxPzlHNU44UCE/PUVdUzo2PU45NjE/OjZZVDdWOVU7RiwgCi1NN1c5Pz02WVM6Nj1OOTYxPzo2WVQ3VjlVO0YsIDdXOT87Jl1OOVVdRj02WUMgJV1WN1ctSTlWWUU5JV1MCi1NO1ZZRzdWOVU7RiwgN1c5Pz02WVM6Nj1OOTYxPzsmXU45VV1GPTZZQyAlXVY3VjlMO1YlVDdWOVU7RiwgCi1NN1c5PzkmXVU4RlFFN1Y5VTtGLCA3Vy0/OyZFTjpQIT89NV1MOjZZSyAlXVA8RkVNODcpWSAlXU47VllQCi1NPEZFTTg3KVkgJV1DOyc1TjpWNVIgJV1TPCZdUj0nLUM4NyggN1VdRDhGJVI5VywgN1VdRDhHLVU4RiwgCi1NN1VdRDhHLVU4RlggN1VdTDlVXUY7JiVHICVdPzhWUUU4NllVPCAhPzdWNVg6NzAgOFY1UjxGXVIgJV1FCi1NPEcpTjtQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0lICAgICAgICAKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWFvdXQyLnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dDIudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyMDk2MS4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dDIudQorKysgL2Rldi9udWxsCkBAIC0xLDIyMDggKzAsMCBAQAotYmVnaW4gNzc3IG02OGstYW91dDIKLU0gMCghIlAgIEAgICAgLCAgICAgICAgICAnQjAgICIgQCAgICAgICAgICAhLV4gICApIT0nW1AgJChAK0UKLU1ANEdTJiAwQ1MgICIgICEqTjAgIChAOUcgICAmODAgICpEQTQyJSxPIERaWSAgIEJGJFpZICAgQzlNW1wKLU0gIFBPICRaWSAgIEYwJUIvK1AhLk4wICApTUEuNU9fKDIuPFAgJEFaIDpRKD4gICAyJ0ghQkRaWiAzOz8KLU1fICAgICBATTAvX1AyJ0AgKCRBTl9cQE8gJFpaIDNTP18gICAgISAsQCAgICAiIUciJCdaIDc5QCAgJFQKLU0jJlghIl9fKjlPIEQvICAgJ19fNEtPXywgSCtfX0AgICFIKCAgQCAgKCArMEtPXzBUKltfVSRBWiA2KSgKLU0+ICAgK1JbX1wiXFogOUBPLkAmQCtQISg+ICAgM0tIIFMtX1wgICAgJiJVIF9eQE8rT18sK1JbX1wiXFoKLU0gN0BPLkAlWCtSW19UIiAiVCpbX1oiXCAzS0ggSE1fXCAgICAmIjggRSpbX1MiXCIoIltfWi0iTl9cUE8KLU0gJFpaICkjP18gICAgIFEoPkAkQjInQCAgJEFaICxFLk5AIUY0KFxNMC9fTDJKW19VJjgkNihdQChEQVgKLU0gICBPICJcWiAxQE8uQCQ4K1JbX1UtOk5fXSBPIFRaWiAkMz9fICAgICFRIV5PWygrNENfXyJVWSAgKCAKLU0gL19YKzdIIDsvX1QyJltfWiRBWCAgJEA7T19IVD5bX1ckWjA0KF0sV1AgLDNFWS49MiFPICBRKD4gICUKLU04IVBAO1AgPDInQCAxViAyKCZcICMkQVggJEVAIiIhTyAhISg+ICAjM0QhRSBEWVUrUUEoNCRBWCAgKSgKLU0+ICAgMidAICEkWSArV1AgICAhXyAgMSg+ICAhM0QgICAgICArVzVTPEJdTDo2KE87JjBOPFZcICtWMUUKLU09Ql1aOTcpTyAgICAgICA4OFcpVCwjSEA7RlxAK1c1UzxCXUw6NihPOyYwTjxWXCogICAgKTYtUj0jIFoKLU0oIl1VPFcoTzsmRUIrVlFEK0ctTygmVUE8JyFJO0Y8QDlGJUk7JzVSOTBIICAgICAkVi1SPSMgWigmWU8KLU0oIl1EOTc4Tz5GNVI7UEggQCAgICBIICAgISggICAgJyAgICAhMCAgICAgICAkW1kgICBFUiAgIDNFOCAKLU0gJCogOCAgICBEWT4zRzUuNUAgIDBIIUAgICAiM0VZLj00WTYgICEiQCYgICAgKS43RFlVM0U4ICAkKiAKLU04ICAgIERZPjNHNS41QCAgMEghQCAgICIzRVkuPTRZNiAgISJAJiAgICApLjdEWVUzRTggICQqIDggICAKLU0gRFk+M0c1LjVAICAwSCFAICAgIjNFWS49NFk2ICAhIkAmICAgICkuN0RZVTNFOCAgJCogOCAgICBEWT4KLU0zRzUuNUAgIDBIIUAgICAiM0VZLj00WTYgICEiQCYgICAgKS43RFlVM0U4ICAnICA4ICAgIERZPjNHNS4KLU01QCAgPCAhUiAmICAgICkuN0RZVTNFOCAgJidfICAgIjBEKFkgICpQNCEvXCAgJCAgSyEyJF9QICBAICIKLU1MJTBTXyAgIyAgKlA1Qy9cICAwICBLITgsX1AgITAgIkwlSVAhQi8gICAqUDcnICcoXCAgIEshQDwgQEMKLU1QICAiTCYxUCIyLyAgICpQOicgKihcICAgSyFMPCBMQ1AgICJMJyBDXyQrKCAgICAgSyFUKF9RIDowICAKLU0gICpQPiQqWSAgKlA/IS9ZICAqUDQgICJMKCAzXjAgIkwlKCAgSyIiJF9EICBLITQgICpQQSMvWSAgKlAKLU01QCAiTChAU14wICJMJUAgIEsiLCxfRCAgSyE6ICAqUEQiL1kgICpQNyAgIkwpQENeMCAiTCYgICBLIkAKLU0oX0QgIEshRCAgKlBKIi9ZICAqUDogICJMKyBDXjAgIkwmUCAgSyJYKF9EICBLIVAgICpQUCIvWSAgKlAKLU09ICAiTCxAQ14wICJMJ0AgIEsjMChfRCAgSyFcICAqUFUiL1wgICpQNCAgIkwuIENfICAiTCUoICBLI0QKLU0oX1AgIEshNCAgKlBaIi9cICAqUDVAICJMLlBDXyAgIkwlQCAgSyNQKF9QICBLITogICpQXSIvXCAgKlAKLU03ICAiTC9AQ18gICJMJiAgIEsjXChfUCAgSyFEICAqUSAiL1wgICpQOiAgIkwwMENfICAiTCZQICBLJCgKLU0oX1AgIEshUCAgKlEjIi9cICAqUD0gICJMMSBDXyAgIkwnQCAgSyQ0PCAoQ1AgICJMMUBDUCAgIkwxUVAKLU0gMi8gICAqUSgiLyAgICpRKSIvWSAgKlEqICAiTDMgU14wICJMPCAgIEsnKDNFWS49MCAgM0U4ICAiXCsKLU0rUEkiQCQnWSAgKlIjJEowOVBBODIlKiAySSFGXiRKIDtRMSdeMCAiTEBBJVxQUCAoJSkuRCVFKk1cSU0KLU1dQjFOX19ARjtPX1wzRVkuPTRZNiAgIE8iRDdZICAqUiUkSjI5UEBANkRaMDJJKUZeJCpHMidEICAiNSAKLU04P1wgICAjRikmW19fJFk+M0c1LjVAICAyS0QgIEAgXDlASVAgMi8gICAoIC8mJlwzRVkuPTRDR0AsIS4KLU1OMCAgKlxBKjAmPCwzS0QgICJNSDMtXCMgNFlVMidAIC80QVogITkoPiAgIjNLRCAgIjsuMidAIDhUWlkKLU0gICBGViRVIy1DQFguIyRAOUZRTzg3MUk7RjxAPCZdSTtHMEA7Rl1UKCYlVjg2RUw4NilMOTIgTSsyIVAKLU08Rl1HPEYlTSgnKUU8NzVJPEY1UygmRVQiQCAgICAgICAkWTZfX0EoVVIiICtCWCAiJiA0KF5UICIgICIKLU1MQUBPKzAgJCtQPEA1NFowNCRcSj4wICJMQUEqQzY7QjNLRCAgIjtQK1A9Lk4wICApTUE4M1RTTigoI18KLU1eJFk+M0c0ICAkWTZfX1BOQzRBWCAgUS5OMCAgK1BBODNSSSAySFVGIScjXzghSEpLQCAoKlZYICMgICQKLU0qV0QgIEsoOCAgQENTMCAiTEFBUCAiSU5fX1EuN0RZVSAgIS5eMCAgKU4hKD4gICQzRCFFXERZVTInQCAKLU0gNFkgICAgQ1AgICIgJDFQX1RZVSAgICAgICAgM0U4ICAkQVkgICBHIURaWSAgIFcoJUEvM0VZLj00WTYKLU1fX0EoVVIiICpGWCAiJ1tfMkhVRzwjIE0gISAiQCAgICAwLUcuQyBNICEgKCAgICY5QyBQKzAgMCIgICAKLU0gRjwkP0AhQCMkQTUzS0QgICI+NDYkXE4gISBNICEpKVAiXCAzS0QgICNBVjYkXSpAJlAiP09cUCswIDAKLU0iICAgIFY8MCtSVCAiJFpZICAgUCdFQS8wSlQgIiQpTSAhISJFMk1NICBAICEkKk0gIFBAIVRTTigoI18KLU1eJFk+M0c1LjVPX1wrSFRKO0AgKCwiVCAkIEAgICAlRilGIFwsIlQgJCBAICAgJUcpJEpNICBBRydCIE0KLU0gIDJQSzAgKDhRMSg1NFpZICAgSThFQS8sIlQgJCBAICAgKUdUQyBNICEgKCAgICU5UDFQX1YgIjwgIEoKLU07T19cM0VZLj00WTZfXlEoVVIjICpGWCAjIVBOICBMUCswIDAgSCAgICAiMiMoICAgICIiOUNQQCswICgKLU1UKlQgIysiTSAgMUMgICJcKCZUICElKSgqVEAgISElJl9fXCwhQCAqOUAgISdEQTUzS0QgICJFQjYkXV4KLU1fWyInOUAgISMmICAgMDBQKzAgMD9BOyBBV1gmTCg9RiwhVSZfX10iRTRBWCAgJSg7T19fJCJUICRERyAKLU0rUCEuTjAgIClMWV4gOyInOVAgIFVAIU0gIiAgJCcjXzggICBTQyBNICEhXiRMIic/QCpQQVY4QDJKVCAKLU0iJjw6KCJUICErIk0gIEFGKSRKNTlCIFArMCAwIEggICAgIiQ5QTEoNTRaWSAgIElZRUEvMkghRyFHI18KLU04ICAgQyMgTSAhICJAICAgICgxRiAvXEYyJTUuTjAgICo2KTgzVS41OzEgQDswICQ0REBLMiAgJCQ0O18KLU1fViEsLCJUICQgQCAgID1HLEIgNTEoIlBLMCAsOyJAQDswICQkKDgsIUAgKjlRIEA7MCAkNERASzIgICQKLU0kIkNfX1YgPDIlNEA7MCAkPCAgMCQmICYyJTVQICEgJitQIS5OMCAgKV8hMDNTIE0gISAoICAgJTlQMVAKLU1fViAkPCAgMCFEU04oLCNfWyRZPjNHNS41T19QMi08UFAiSU4gIEBIOzAgKCsiVCAhKVIsKlRQICEjIE0KLU0gISAiQCAgICAoMUchJ1ggOCAwTiswICwqSD0qRTZQJD9AIUAgQlg1KCJUICItIk0gIFIwSzAgJEwoPUwKLU0iREE1M0tEICAiTSA2JF0qQUZcQCtQOSg1ISBNICEpKVAiXCAzS0QgICI7Lk8oIUciQCFNICIgICQnI18KLU04IClQICRTTiwsI19cJFk+M0c1LjVPX1gyLTxAQCJJTiAgQFArMCAwP0ErIEFXWCJMKD1HJ0MgTSAhICIKLU1AICAgIDApRiEnI184JkFQW1whTSAhIVIgSCEhLlQgICQjIE0gISAoICAgJjlEWSpLMCAoOUBJKDU0WlkKLU0gICBKQEVBLygiVCAhKyJNICBBRi0jIE0gISAiQCAgICAoMUYqIkpNICBRKkU2UCQ/QCFAIEJYNSgiVCAKLU0iLSJNICBSMEswICRMKD1MIkRBNTNLRCAgIk0gNiRdUCAkU04oKCNfXiRZPjNHNS41T15UMi08QFAiSU4KLU0gIEAwKzAgMjI8IEwgIyBNICEgKCAgICI5UThAPjAgIiBJMSFcJlggKlRAICInWCgqVDwgIyYhWitQOS4KLU1OMCAgLTchODNUSiA5UFggOzAiICAhIE4vICAgICghQCdEQU5fXDBPIURaWSAgIFhBRSEvMkghTSFCWE4KLU1fXyFOIUJYXCAgICQgIiAnNCggTyAkWlkgICBPIiVBLypUICAiJjwsICZUICIgIDAqVDwgIyYgQCgnRCAKLU0gQCo0MD8hTiAiTSggIEFeIiJNJyAgUCI7P11fICEgIDswICQgISBLOzAgKCAgMSxbQiMgX1sxLjdEWVUKLU0zRTtfXSIpTiAgQEA6MCAoVD5EICMiIChEKkQgISZIJihUQCAhJiAmTCklTCBCKiAzRVkuPTRDR1AsIEAKLU0uMCAiICRQLDAgICQ5QDhQLyAgMjgiMCwwICAjOUA4UC8gIC44IUAsMCAgIjlAOFAvICAqOCBQLDAgICEKLU05QDhQLyAgJjNHJSFeMCAiSlpRQCFCLVEgICAgIEIpOExfUCAgICAgOU8hLjBEUz8gUC0uPTAgICAgICAKLU0gJFtZICAgS1ogICAzRTggICcoIShcJCAgSyg8KCZYICQlUkggIFEuN0RZVTNFO19ZIlonMktEICBAITgKLU05UUgsTjAgICAgKCAgQCE4OUAgIFEnWCMoXDwgIEAhLDggICBOIlVcICAgS1QvX1QwSltfXiQqTl9fUSgKLU07T19IMiZbX10kQVggID0uTjAgIC1aIS9bUCAsMEtEICBLKDwzS0QgICNIODImW19dJEFOX15BKD4gICcKLU0zS0QgICM+QDNeXCAjJEpZICAqUicmPCQ/QCVAIEdYIihcPCAgQCE4IytEICAgICIgICggNiY5Lj9ALEMKLU1RUCAiICRRLk4wICAuQyEqQCY4VjInRCAgIlNAMidEICBAKyQzS0QgICNFUDQkXSg+MCAgKzIhKD4wICIKLU0gTDEuTjAgIC43ITAzVEFZICAoIlEkWlkgICBHRSVBLzNLRCAgI0g4IytEICAgICIgICggNiY4JDwgJUAKLU0gRyAgK0JbX1kkWT4zRzQqKCUhTDk2JVM5MiFOO1cxRS5CIS0wUzhYLiNAUSgnNVA5VylBOSY0QD0mXEAKLU0wM0RTM0IhTTg3LUsoJlVBPjIhQjkyIUE5JzlJPFYlQjsmNE4oIEggNFY1RSgkOUw7ViVUOjZZRys1IU8KLU06NllUKCUhUjtWPVI4NlVNOTcoRzxSISc9NkVEOTJYKiAkWTZfXlEoVVMjQConUCAgQCJQKkUwSitAICwKLU0rIlggIiYgME8qVCAiJjAkKiRVQCEkR00gIDBKNSRKLTlAMV4gJiAkK0JUICMrWiU5LiEuTjAgIC0oME4KLU0gJj0kKig8QDFUKjAwSkAgISIlJiAgQEExMCAsKCQ4QEEyQSc2KD0qQzY8Pk8qVCAiJiwsKihVKVswICQKLU0qRlQgISYgKCgkPEBDMlgtKkU1KkM2O0JGXFRAMVIiLSooVSxbQyNAX15RLjdEWVUzRTtfWiRDNywvIEoKLU07QCAoKiU0TCUmOCQ+ICFAIUIhJioiQCAjIlhMICAxRiEnSCA4IDhAMVJISCAgUlxBVj1UTig1RS4kSiYKLU05VkEqQSY4OigkOEAqICAoNiggTyAkQVkgICggXCRaWSAgIFU3JSEvOCRYSkFFQiYqRDhMJTY4JD4gIUAKLU0vIiEmKiJAICMmIFQySD1HLCRKJTlBSEAxUiBIICBBOEAiXCAyJ0QgIEAkJDNLRCAgIzU8NCRdQCVCSicKLU0qRDxOJTY4JD5AIUAhQiEnKkJAICMrUic5SFEiRTRBNDNLRCAgIzUiNiRdLFtDI1BfXkEuN0RZVTNFO18KLU1ZJEM3LCggSjtAICgoJTUqQiY4JDwgIUAhIiBIICBQSDQiKUggIDEqQyY4JD9AIUApQlhMICBRQCgrWiEKLU05MThKQyRPTCAgMEg1NEosOUAxXiAmIDgrQlAgIyYgMipIREoyMik1MkhFRiEnKCA4IDBCKjAgLE9IIUIKLU1UKyogOExQSkIiIiwoNEQgISRTTiwoI19ZJFk+M0c1LjVPX0QyLTxQXiJATiAgQThBJ1goTig9RCEnQCgKLU04IDk2QS4yLFk4USpOMCAiICshRiEnSCA4IEhAPjAgIiArIEoqICAsTkgxRCUiXCQzS0QgICMvKDYkXSoKLU1AJjgmPCAhQCAgIyIqJ1AgIEAiUCpFMUAoK1omOEBSXkEmMDQyPlQgISJJIzghIlxBJjQoMj5UICEiSSMKLU04IDBIMzJJJSpBNEYrMCAkMkg1RiEnWCA4IDhAMTJYSCAgUSpAVjgkPyAhQCFCISMrIkAgIytaJDkrSlwKLU1BJjJWKCJUICMpIiQ/QEJQQVYoMCpCVCAiJEE0M0tEICAiVzo2JF1AK0JITSAgQE4hPVokKCQ0RiQpOiQKLU0qVCwgIyIhJygoLTJOMCAiICcwSzFQICgyJTEuTjAgICtJMTgzUiElKCgwQDEyIDBUO0QgIEAiRDRLRCAKLU0gQCJITitEICBAIjg5IDkyTjAgIiAnQThBMiAlMy5YUF4vX0QzRVkuPTRZNl9eIShVUyNcKSJYICIhICIKLU0/QC8gQVY8NitQKSg+MCAiIDFBLk4wICAtNVEwM1cgIDggICBcKzJZICAoIE0mNChNK0QgIEAiWDhQWV4KLU0lQi8nICAoIDEnICA4ICAgVEJQIjY4OEAxQkAwRjtEICBAIkQ0W0QgIEAiSConUCAgQCJQKkUxKkM2PCAKLU0gKihOKzAgKClCVCAjK1InOSNASiFNSiROSD1GJS1CIzRbRCAgQCFUMiUxLk4wICArPUk4M1YhUE5IPUMKLU0lIlwnK1A5KD4wICIgNT0uTjAgIC01UVAgJiFOKiRVQDUrUic4U1BKIV1KI05IOUYlQlAnVigtM04wICIKLU0gJzEoNSRaWSAgIE1WRUEvOCMqWkFGLDQrUCkoPjAgIiA3OS5OMCAgLTVRMDNXICA4IyEpWzAgJDghME8KLU0gREFZICAoIUYkWlkgICBVNyUhLzwgIUAlQkk0MkhVRiAvXUIrUDBPIURaWSAgIE0yJSEvPCAlLFtDI1wKLU1fXiEuN0RZVTNFO19cJEM3LCwgSDtAICgrIlggJCJYTiAgUj5BRygoT0glRSgkT1Q6ICBKQVJCJjRLRCAKLU0gQCFUNEtEICBAIkgyJlQgISRaWSAgIFAnRUEvNiRQQCMkU04sLCNfXCRZPjNHNS41T19AMi08WF4iSU4KLU0gIEBAIzdYI1AoPUYkK09ZICAoIE0mNChOX0QgIEAiWDhROSg1NEFZICAoIU5EWlkgICBVNyUhLzwgIUAKLU0gICNUMV5XX18iQDMwPy0oICJQKDInQCAgMlwkMiUtLk4wICAsTCEvW1AgLD9PXlBBVjgmPCAhQCAgIyoKLU0rQlggIyVCJz5AQl5BNjAkPUBBQCIlOidZKF9FQ1I4J04oLUUkIlwjK1AxKDRUWlkgICBRMCYgICApWlwKLU1OMCAiICtBRDhCQVwgICggTCJJNCgkOEokJiAqMj5UICEmICIqJFRKNSRKLTlAMV4gJiAkK0JUICMrWiUKLU05M0hOKzAgKE8oPUVZK1InOE1ITiEtWiVPSC1FKURBNDNLRCAgIlc6NiRdM04wICIgJzM7TjAgIiAqMEYKLU1BUlwjK1A9KDRUWlkgICBRMCYgUitSWCAjJFpZICAgTyIlQS8qRCEqQzY8PjYkTTlBIlwkMiU1KDRUWlkKLU0gICBdIiRfTyAgUSg0VFpZICAgUCdFQS8oIFUsW0NDWF9eIS43RFlVM0U7X1kkQzcvLiBKK0AgLCsiWCAKLU0iIjEmVTw0Rj8gICIgKyFAIiI5LTggMSdbMCAkKkUtKkM2OCQ/QCFAISJYTSAgUl5BNjQgICw4SDswICgKLU1PKFFGJyRBMzNLRCAgIlc6NiRfO04wICIgKjEyTjAgIiAqQVAgNiAgICoyXEMmNlwrQFM+RStSJzkrQlUKLU1RViw6MkpYICQmPDArUDkoPjAgIiBEPS5OMCAgLTVRMDNXI184J0JVUVY4TjIlLS5OMCAgKz1JODNVKlkKLU0gICggPS1OWSAgKCBJJTJZICAoIEopTjQyJlAgISRaWSAgIFAnRUEvPCAlQDFEQTMzS0QgICJXOjYkXTQKLU1OMCAiICcwQCUtJlkgICggSSU6WSAgKCBKIiAnRCg6MUUpWiopKD0oOyAgJDNLRCAgIyA+NiRdKDpAICQKLU0zS0QgICMgPjYkXVAgNiAiPCAhLFtDU0BfXjEuN0RZVTNFO19dJEM3KCwhKk4wICIgJlFGKERaWSAgIFgKLU1JQi8gICAoIDskWlkgICBUQSJJIDJIVUcuREE1M0tEICAjNSI2JFxOLjAgIiAmUTNBXVpOICBBLD43ICcKLU0gICggOyRQWTwgPCAgQCFMKyA8TyFEWlkgICBYWCVBLypEIVJfW08hOUAxUCAmISwyS0QgIEAiVDlAOEMKLU1TMCAiICsxIV02QCAoXEAgIEAiWCpIPEAuMCAiICtCME4wICIgKzBDUCAgIiAnIz9OMCAiICoxMk4wICIKLU0gJzEyTjAgIiAqQSg7MCAkM0tEICAjID42JF1QIDRTTigsI19dJFk+M0c1LjVPX1gyLTxAQCRKWSAgKCAKLU1RJjw2KkdEICBAIyQoJ0QgIEAjJChdICAgQCMkOCAgIENESlkgICggUCZZUCtDUCAgIiAkK1A9Lk4wICAKLU0uLiE4M1JJIDxPXlBANjgyMidEICBAKVkzS0QgICM1PDYkXVAgJiE8MktEICBAIlQ5QDhDUzAgIiArMEoKLU1BVCdNICAwQ1IgICIgK1BDXyAgICBAICAgQCMgMD81WCAiLyggICggTiIgWSAgKCBOKSJZICAoIE0iLyAKLU0gICggPC1eWSAgKCBLJS5ZICAoIFAiSVkgICggTydYMFdbRCAgQCJcKCBVLFtCIiBfX0EuN0RZVTNFOCAKLU0gIiFOICBAQE4wICIgLDBDW0AgKCAgKCBRJFk+M0c1LjVAICA8QThDUDAgIiAkMS43RFlVICAgICAkWTYKLU1fXkBOQVJYWSAgKCAxJEFOX15RKD40IDI1ICRPK0AgKDNLRCAgI0JWMkghTCJCLycgICggMScgIDggKVAKLU0gMlhOX15BLjdEWVUzRTtfXyJaLTJLRCAgSlpMOUNASj8gICIgSVBQKzAgMCBIICAgICQjOUAwQCM2IUgKLU0yXlQgJStPXCAgKCUnJjdEM0tEICAjOFwySCFGIycoLChcJCAgQCEkPCAhQDFCSVkgICpOSyRKNTlSMEAKLU01MyBIICEgIkAgICAgMC1HJUVBLU5fRCAgSlpQOT4xUiYiLyEgICggMScgIDghQSpFNjgyMidAICUkQVgKLU0gICUuTjAgIC85ITAzUkogKCE0SjtPX1wzRVkuPTRZNl9fQShVUiIgM0tEICAjQjYrQCEoPiAgJCtQPS4KLU1OMCAgLzkhMDNSLyAgICpOSyRKWSAgKk5LJjgkPCAhQDciICdZWCBPICRaWSAgIE8iJUEvKFwgICBAKjQKLU05QUBPLjAgIktKUS5OMCAgLCFZODNUKlkgICpOSycgIDgiWEA+MCAiS0pRIVwnUCAoXEAgIEpaUCtDUCAKLU0gQCo8KkdEICBKWkw4IDhKUVcoNFdIJCxBUCAiITFRRVxHICEzLlhAQC9fWDNFWS49NFk2X19QTkM0SlkKLU0gICpOSyY4KjNLRCAgIzhcMkghRytCSVkgICpOSytPWSAgKk5MJjBAMkk1RiREQVggITEoPiAgITNLRCAKLU0gI1YwNCRcSkAlQS1OX0QgIEpaUDk+IEo7T19cM0VZLj00WTZfX1BOQzRKTiAgQUc5REpZICAqTksmOEoKLU0qR1AgIEAqPCwiVCAkICogICAgISBWPCoyJTRAO0AgKDNJITgzVE9NICEyW18gICIhMVFELUYjPCpHRCAKLU0gSlpMTl9EICBKWlA5IjkqRTY8OCglNFAqICAwIEggICAgJCM5UEhPJTIhTiAgQS5EJUEvNiRWW14wICIKLU1LSyFFVkJJTl9fUS43RFlVICAgICAgICAzRTtfViRDNy8uIE4rQCAoO1A5XCgrWiY7MDleJUYgICAqOEQKLU07QCAwKyJYICMiICc0WCFSID4mQStQJS5OMCAgLiw5ODNSSCAyX0QgIEsoQDJfNVwgIjk1MiUoTyFCXCcKLU0zS0QgICNFRjNeXCAjJEogOlU5KkFGPFYwPltfXSIpJigtREBWMiM5Mj5bX10iUDQ5UFlSIDtSITlQQEoKLU1BQkJcICAgWSYkKkcyJTBPIVRaWSAgIFk5RF9PICBRKkAmTDwySElHIkBSMiAgIFkmJjgiKShMTyE0WlkKLU0gICBYVUVBLzwgIUAmQlhZICAoIDEiXCUzS0QgICNDNjYkXEpCUi8nICAoIDEnI18zLlhcWC9fODNFWS4KLU09NFtZICAgRlgkQVggIDkuMCY3UjNHNS5eMCAgKU4hKD4gIF4zRCFFXERZVTNPRCAgIjtAMidAIDY0WSAKLU05PykuPTRbWSAgIEZYJEFYICQhLjAmN1IzRzUuXjAgIClOISg+ICBWM0QhRVxEWVUzT0QgICI7QDInQCAKLU07NFkgOT8pLj00W1kgICBGWCRBWCAmWS4wJjdSM0c0QCtQICQ1SCFSXywiIVQrRCAgQDQ8K1QgICEkQVgKLU0gISUuMCY0MCgjRCAgQDQ8KF5cICEgICIhMVEuPTRbWSAgIEZYICAgICAgICAkQ0dQLCEuTjAgIC5HIEAKLU0rUCQwWThAQD8gICJMQiBAPCBAICtSXCEnIlxPIDFQTytQJDwrUlwhJyRaMFdfUCAgICAwM0tEICAjSlgKLU0zLVwjIF1fXCAgICAiJEFYIChNLjAkW1kgICBGWCRBWCAmUS4wJjdSM0c1LjVPT1gyLTxAQCJJTiAgQSEKLU1bQCAwK0BAUCswIDAiICAgIDY4NiwiVCAkIEAgICBBRyIgIU0gICggJCYgJDwvXUA6QyBNICEgKCAgICIKLU05VFgiOz9fWyAhISFbT1AgKlRAICIkJ05fICBLMiAgJCpXUCAgIDAgICBRKDUyXCcrUlggIyRaWSAgIF0KLU1YJF9PICBQTiAkQTUzS0QgICI+NDYkXCA7MCAkICEhIkswICgwSlQgIyQqNTghISg1MlwnK1JYICMkWlkKLU0gICBdWCJYICggPSxbQiIgXl9BLjdEWVUgICNSLklQICAgMS49MCAgICAgICAgICAgICAgICAgICAgI1IKLU0uRTA0ICJDUiAmMCAjKCBFQCAgIDlBO1IuRTAgICFbUiAmMCAjKCAgQCAgIDlAMVAgNiAiMEghLj0zX1AKLU0gICAgICAgIS4gX19fX1ggICAgICAgICBHX1AgICAjXCtSXCBfJCdPICAwQCogJDAoLCAsMCAgKDlSUEAKLU0uMCAiICRQQFAgUSAgIDFGIiRaWSAgIFtZRiA2IyQgICBWOCgzS0QgICNLWjggQCwwICAiOUApQTZEWVUKLU0wPlwgISIgOCMkICAiJjxKKCFALDAgICQ5QEEuTjAgIC8mIUAmQFEgICAtRiIkWlkgICBbIUYgLCMkICAKLU0gRjgmM0tEICAjTVYrVTwhIC1fXCAgICEgJFlVXEEjUFAvKEhPICAgJiRZVVxBQzBQLygwRyAhLj0yKVkKLU0gICglVSMgSV9fWCggICAuOVBAUT8hIUMgIiFAKERJSV9fWUpaJEFIICIgTy8kICIgICBPLjAgIkxKIS4KLU1OMCAgLis7P18gICAgIFBTPyEhQ19fUFM/ISEgX19QQEQyJTEgIDBBNDAgKCg1JCAjIiUxICEgQTQwIDQKLU0oNSQgJiIlMSAhUS49MilZICAoJVUjIElfX1goICAgLjlQKUAoRElJX19ZSltEQUggIjBPLyQgIiAgIE8KLU0uMCAiTEohLk4wICAuKzs/XyAgICAgUFM/ISFDX19QUz8hISFfX1BCRCIqSCAgMEJKICAoKEpAICMiKkgKLU0gISBCSiAgNChKQCAmIipIICFQUCo/X14iICAgI0Y/VixWQCAoL19cM0c3UiQvIyBUP1AgICAgOFxBQlwKLU0gIilcWCAgLyUiIzkoLURAVjIjOSgtREBWMiM5KC1EQFYyIzkoLURDXyAgICAgI0AgIF4kKEdTQCAgWCAKLU0oLURAVjIjOSgtREBWMiM5KC1EQFYyKVxYICAgICItXCAgICAgIFw8KFdQICAgICAjUTBDPyAgICAgKCgKLU1ULyhcQiAgICAgICBcQ1IwICAgICAgIS49Mi9cICAgICAuICAjWDNSJi0jIFxBQjwgLSdcICAgICsiKVwKLU1YICAsICIrOChNQEJWIis4KE1AQlYiKzgoTUIxXyAgICAkUEI/LiAgI1EwQlYiKzgoTUBCPy4gICAgIEAKLU0qICA4IEggICAgIC8oVCAoVCItSCAhUCk2Ii1cICAgICAgRyQoISEhWiAgKDNLRCAgI1M+KCJDX18kJ0gKLU0gIEEuTjAgIC8tWS49NEEgIiAgICNWODogRCA/XyIuMCAgISgwIEAgICBdRiJAKSAnX1BDSiAgJCAgIS4KLU09MCAgICAgICAiIU8gIDBCO1AgKCgiXCAjJl0sKEBGMkImUCAgIDEkQDsqIDswICAwIygoIiAkICAmPCQKLU0kTUEzQCIoKSIgJCAgJjg+KEAjREImICIoTUExUi9fXDBEITNAJjNUKCAkIkAgICAgIC1AIEErODQ8Q18KLU1fJCkgNFghRF0kWVVMXEFOJCYgIiRNQTFSL19cMEQhM0AmM1QzRzcxUC0vIDggKDMoJScoX19RIjAlLiAKLU05LzEuPTAgICAgIS41T19YMi08IFAiUE4gIEEsK0YgJiAgUE8hRFpZICAgTyIlQS8rQCFGIScgIDggWE8KLU0hQlwnM0tEICAkX1g0JFxAIVRTTiAsI19eJFk+M0c1LjVAICArUlggIiRaWSAgIFAnRUEvM0VZLj00WTYKLU1dSCEoVVNTXDNLRCAgJVhWKCQgQDQhVTBfX10iS09fWD9AJE0xX19UMEpbX1wiVU4gIFNfWSJVTl9eM18KLU1aIlVOX15DX1siVU5fXlNfWCJJTiAgQDwnNj0mKUZYICQjIEsgISFeJEwiJz9AKlBBVjhAMkpMICImPDoKLU0oIkwgISsiSyAgQUYqREozOUI4UCpQIDAgSCAgICAiJDlBSSg0VFpZICAgSVlFQS8ySCFHIycjXzggIC4KLU0+JyAgOCAgLjxHMCApJkwgISJYMzA+W1ZRIlUoXUshIVtPOyQrNENWTSQnTl1MME0yLzs0IyA4ICk2PCAKLU0gQkEzQVZITCwiTCAkICogICAgIEEmPCooID0kQCsiSyAgUU0lQj0qICAxKDRUWlkgICBJOEVBLykmTCAKLU0hIlgzNFg8NFFFKiI4ICAtTkIhTl9eQEg0JUJOX15BKkMmOCYqJ0QgIEA0RCchUUcgIFZANFg9SisjIEsKLU0gISAiQCAgICAoMUciQiAnMSgiUEpQICw7MThHMkAgJDIlLS5OMCAgKjYpODNSMUsgIDBOJFUuJyUsOTIKLU1ARiMkKCZbX1oiIDAnICE4S09fSDRYPUorIyBLICEgIkAgICAgKDFHIkIgJzEoIlBKUCAsOzE4RzJAICQKLU0yJS0uTjAgICo2KTgzUjFLICAwTiRVLiclLDkyQEYgICMyOEA7T19IKyEhOEtPX0gySDlKMSUuJzpCUFAKLU0qUCAwIEggICAgIiQ5UEhAIVQyIEwqTCAjJlQ2KVRIICEkQTMzS0QgICJFQjYkXEQ6UCAkK0EtM0FRM1wKLU0gIlUyQEQyJjggSEA7T19IKyEhOEtPX0gqJ0QgIEA0SDI+W1tXUkhZICAoJSoiICYzJ1AgIDAgICAgSEAKLU0xMURQJiAhLD8mICYgICAgIkY7RjggICBCIkhZICAoJSsiIU5fXkBMJCVCTl9eQSlbT08/Mkg5RyAgIlgKLU0ySDlHOicgL1AoOEAxMURQIiAjSENGO1I4JUBKLjAgIiEyQEA7T19IKyEhOEtPX0gyPltbV1RKJjlQICAKLU1CREomOVNJUCNcIiYoJDQ5LCBAIFooWUZcRiBKKkNEICBANEgoJltfWiJQMDYqW19aJEdOXl1dKkFGPTwKLU0ySDlHI0cgJ1AoOEAxMURQIiAjRkNGO1IwPltbV1I4KE48LUQgIFA0JyFRM0FWSEwsIkwgJCAqICAgICAKLU1BJjwqKCA9JEArIksgIFFNJUI9KiAgMSg0VFpZICAgSThFQS8pJkwgISJYMzRYPDRRRSoiTjwtRVFGICAKLU0iXTlcLCYgIF9HMTUzNiEuKCRVMjMxIDAyPCFcPisiJjhOWSFeQCBQPEBWUCYlMylfX1FGWCMgWyRAOS4KLU1eUCAiX0grXzdPWypfUCteL09aIl9dU15AT188X1VbXywvV05fTEtfLCdBVTxXIU87JkVIOSYtODU0XSQKLU0wQltbVFQoTl5dKSIrT08xMEJbW1QkKE5eXF0iK09PLjgiOD0/ICAhXl0pQCdBVVwgICdbVDYgNic3UCAKLU0gP08wOCBYPT8gICFeXF1AIUFVXCAgJ1tTRSktJCE1KVAnUEBMKDlHV0dQQ0woOUdYJ1BLTCg5R1BHUE0KLU1MKDlHUSdQUEwoOUdVRiE8MkpbX10mPDoyJltbICJcTl9eME8rQCAoM0tEICAkU0ozXlwgIyQqTl9fMCwKLU1LQCAgICMrX1wmWDQoIltfXCQvViMyI1pfIlUpXUpITTQ/X0g4IVBNO09PJF9eQE8rT19QMiZbX1oiXE4KLU0gIEEuTjAgIDNHWS9bUCAsNERULCUwIEo5QCAgSEUpLTImW1tSJEE1M0tEICAkXj40JFxKICY9VDJKW18KLU1dJjw6MiZbWyAiXE5fXjBPK0AgKDNLRCAgJFNKM15cICMkKk5fXzAsS0AgICAjK1tSJlg0KCJbW1IkL1YKLU0jMiNaXyJVKV1KSE00P19AOCFQTTtPTyRfXiBPK09PKDImW19YIlxOICBBLk4wICAzR1kvW1AgLCgmW18KLU1YIlAwNipbX1gkSiY6QEEkQUFVXCAgJ1tUMkklOCRAQDtPX0grISE4S09fSDJIOUouRDImJzdQICA/TzEKLU04IyFcICQqTl9fIUAlQSA9MjwhWiwpIiVXKDhCIU42IVcoJzxAIlUmX18gMCU0QiAwP0QgIEA3PSIjICAKLU0gQCAgOU1ALCUwIE45QCAgTyUpLSMhNCAqRjggIChJMjM0QU5eT1EoNTRaWSAgIS9HRSEvKiAhRzokSk4KLU1fXzFHJkRBTl5QIE8rT19EK1JYICIkWlkgICEsWkRfTyAgUSJLT19UIypYICAgIFJeT1FOJSIgTl5PUSMKLU1dQFRAXk9QTTI/OkorNSdfWyYgPCs2W1tRL19MK1JbWl8kQU5fXlBPK0AgKDNLRCAgJFleM15cICMiIU4KLU1fXlBKJCVCTl9eUEoxJiBWKCZbX1oiSDA2KltfWiYgSj5AIDAlNEIgMD9EICBANz0iIyAgIEAgIDlRODAKLU0nNEcgPiMiMEEtSiUoQDdFQD1KIVZIIUBWR0tfIyE0ICkmPCBfQCkiS09LWCs3UCAgQDUkXk8xIktPS1AKLU0rN1AgIEA1JF5OUUAgIDlIJzdQICA/TzM4ICAmN0FVXCAgS1paViAuJzdQICIvS0s4IDg9PyAgMF5OTSoKLU1BNlAiPkAkQDtPX0gqISE4S09fSCMiWCA5L0tKOVEgLCtAISReTklHIiBQTiAmR1paRjhOMkgxTCMiVVwKLU0gICglMT9LVDEoMUAnREhOXl0pRyJCVVwgICglMV9LVDggWSorT08wOVBATT8gICIhNEdaXSRITl5cWUcKLU0lQlxOXk8xLk4wICA0KSE4M1JBJkY8IllRNlwiKkBQLCtAITheTklGIiI4WSAgKCUrJiAmKUNEICBANEgKLU0yPltbV1EgTl5OTSlQJygoTCglRyInKDBMKCVHJUYhIDJIMUcwJyAnUCgwQDBRRFAiICNGQyY7UjgjISoKLU1BJjxMPCBfIEEiISMmMyAoIC5CLDlPKUAnIiAkMydQICAwICAgIEhAMFFEUCYgISw/JCAkICAgICJESiQKLU05TjEhW09PPylAQEAjKSIjVCg0TTAvS1gyQltbU1Y8ICE7OllQVjhSOCAgJUtAUk4gICAgID9LWDsgICUKLU1IR0ghKzQ3Wl4mICAhOUBNPyAgIiE0T1pdJiAgIThQTT8gICIhNFtaXSYgICE4IDArT0tKMjwhWjYrIiUKLU05XkFaO1siJTlcIVo+KyIlOV0hQCAgNUQySDVMIEdIJjJCW1tUVjhYKCZbX1oiVTBeTiBNOiAgJF5OMTAKLU1LT19IMiZbVlYkQU5eTUEoO09LPCggNTJAIlwgK1JbWlkiXE5eTiEuTjAgIDg/QS9bUCA4OCM4SDtPOzQKLU09QSM2QyIhTl9eQEhUJUJOX15CWVBWN1IyJltWViRBTl5NQSg7T0s8KCA1MkAiXCAyJltWUSRaWSAgIigKLU08JF9PICEwSDAkSk5eTUFHIkJVXCAgKCU0P0tUOCFZKitPTzI5UEhNPyAgIiE1L1pdJiAuMkJbW1QmPCgKLU0rN1AgIEA1NV5PMCwrQCBZXU1BTyVER05dTUEhWyAgISlAQEAwVEgwOVAgIFNFKiM4LzEhW09PNClAQSoKLU0lJjwkJiFRQCBHQFAoJCwwQSUqIzJINUYhREhOXlxdRyIiISMkKltfX1UqIys0N1pcJiAuMkExRyQlLk4KLU1eTyBAMFEiPDRILSpLT0tQO05RKVtPTzQjIlggLC87ODlROEorT0s8NFg1SiQkMiU4IFEhW087ICpAQVgKLU0hJiBYPkAhKDtPOl48ICBQITJcIDNLRCAgJ0IwNCRdIitPOyI+JjJaQSZXOCMoNCAgIC9IOyBJIVtPOl8KLU0qQEFYITYgKDA+W1ZPQkgoPiA4TTEvOlg0WDRIITRKTl5NUU4iIFBOICMjVlYmOCQ+Qk1AIEdITSgkMDAKLU1BNS4kKzQzWlsiISQkKltaWkRITl5dJUYhJ0ghOCApWiAhIE5eXFkpUCwiJTlQICNPIlxOXk8xLk4wICAKLU00KSE4M1QnTl5dMEIgWSooVCgnMEtPS1BUKltWTiIoJkRIIE0wP0tYOCAgI0RESiU7IClaIURITl5dLUYKLU0tIiFOX15ATTQvS0ArNkAgIS9LRDQqW19aJEFOXU1BKDtPSzgyJltaVyJcJStSW1pZIlxOXk4hLk4wICAKLU04TFkvW1AgODgjKEg7TzpUPUEjNkMiIU5fXkBIVCVCTl9eQllQVjdSMiZbVlYkQU5eTUEoO09LPCtQNSgKLU07TzskM0tEICAoRSYzXlwgJSJBIDJKW1pWJjwqKzdQICBANTdeTzFAJ0RITl5dKUciQlVcICAoJTY/S1QKLU04IFkqK09PMDlQQE0/ICAiITVPWl0gUE4gI0dWViZcNjI+W1ZWJCdMICAkRiIiISMyQSFHICArNjRILUAKLU1dJCdOXl0wRiIiQE5eTVFOIkIhIyQrUCAsJSojOCE5KiUmOCgoJCwwTyAgUDggMEAwUSI8NEgtM0EmO0oKLU0yQltbU1Y4JDJINU8iIiEjJCpbX19VKiMqIDRAITkiJSs0I1pcJiA8NEpbWlckSk5eTVFPISRINDlAQEAKLU0wUSJcICMhQCEiISMkKVEyQFUuJDpOISorT08xOUA4WD8gICE4ICo5UyEgTl5cWSlQIigsUCglRyhCXE4KLU1eTzEuTjAgIDQpITgzVCdOXl0wQiBZKihUKCcwS09LUChAOjJAIlUhXk9BKVtPTzQ4ICAiKSRKJTsgMVoKLU0hRiAmMkg1RiBHSCEyQltbVFY4VCgmW19aIlUwXk4gTTogICReTjEwS09fSDImW1ZWISBOXlxdKVAiXCAKLU0rUDRPK09LRCtSW1pYJFpZICAhRUtEX08gITFALEJBTl1LIVYkLTosKCZbX1oiQzA2KltfWitHIzk/KSgKLU07Tzs4JCJbW1NURyArUCBPITRBTl1MMS5OMCAgQkNRL1tQIDAyPltWViBQTiAiV1ZWJjgsKzdQICBANT0KLU1eTzEyMyYgPjJCW1tURjwqKzdQICBANT9eTzFAI0RITl5dIUciIlVcICAoJTg/S1QkIltaWkRCIDA/RCAKLU0gQDc9IiMgICAgICA5UkhGIyYgKigkLCwkICFFOVBBMkBSISMyQSFGXCIhIyMhICA5NjgkJCtQIDEyISMKLU0yQSFHJCUqIzgvOEYjJiAiNEgsQDBUSDA5T0EiS09LUDJCW1tUNjgkPkAlQCBHSCAkIltbU0RHIFAoNUcKLU0gICQuK1JbWl0kWlkgICEwRCVBLyhALjJDLSIhKEA6MkAiVSFeT0FAICAjUCgmW19aIiAwJzQjW1UlQk4KLU1fXkEpW09PNDA+UCAgMjgoOCAgIFUiIU5fXkBINCVCTl9eQSpBNkgmKkNRX19fX18ySFFGIUJBWSAgKCUKLU0pJ0AgOCA6WEE2UCg0SDA9Ny86TzlPMSorT08xOUAxWiA2ICI+QCAwK09PLjI8IyBBNjwoKCA6MEEiVSAKLU1eT0EzMyI4LEY8MUA/R0ghKzQ3X14mIVYyPltaWkQnTCAgJEYiJiFKKCRVMjMxVTBeTkgwK09LSjI8IVgKLU0+KyIkOE4hIV5AIF48QTJQJiUzKV9fUUZUQyBbJEA5Ll5QICIgRyNZPk9LPl9BW1k8L0YiXjdLWUJPXTIKLU1eN0taV09SUF9BW19VT0VaX107X1BPRiJfVltZPk9GKj4nNVM7VllMOjZBRzlGNUQ4VUE1M1RRJzE0MCAKLU0gJEpOXk8hTCEnSCA4IDBKK09LUDJKW1peJlAkPiAhQCEiQE5eT0BPK09LVDNLRCAgJSIwNiRcTTAvOkoKLU0rUltaWyRaWSAgITBEJUEvRyg2PEAiICNEKFI8QClSJEcqW1ZKREhOXl0lRj5GIFY0WD1KKyMgSyAhICIKLU1AICAgICgxRyJCICcxKCJQSlAgLDsxOEcyQCAkMiUtLk4wICAqNik4M1IxSyAgME4kVS4nJS9QICglKiIKLU00WDlKUUYgXDRYPUorIyBLICEgIkAgICAgKDFHIkIgJzEoIlBKUCAsOzE4RzJAICQyJS0uTjAgICo2KTgKLU0zUjFLICAwTiRVLicoJltaXSEzMDRIKTJLT0tUKCZbWl0kSDA5S1FALUUuJzpCUFAqUCAwIEggICAgIiQKLU05UEhAIVQyIEwqTCAjJlQ2KVRIICEkQTMzS0QgICJFQjYkXEQ6UCAkK0EtM0FRM1wgIyEyQEUuTl5PQUoKLU1RK0cjOSchM0FWSEwsIkwgJCAqICAgICBBJjwqKCA9JEArIksgIFFNJUI9KiAgMSg0VFpZICAgSThFQS8KLU0pJkwgISJYMzRYPDRXJSoiTjwtRVImIFY0WD1KKyMgSyAhICJAICAgICgxRyJCICcxKCJQSlAgLDsxOEcKLU0yQCAkMiUtLk4wICAqNik4M1IxSyAgME4kVS4nJS9QICwlKiI0WltaXCZLJDgjUTNBVkhMLCJMICQgKiAKLU0gICAgQSY8KiggPSRAKyJLICBRTSVCPSogIDEoNFRaWSAgIEk4RUEvKSZMICEiWDM0WDxAO09LTCUtITIKLU1ARSpOXk5QQDtPS0wyQSFGTyRITl5dJUcvJiBWNFg9SisjIEsgISAiQCAgICAoMUciQiAnMSgiUEpQICwKLU07MThHMkAgJDIlLS5OMCAgKjYpODNSMUsgIDBOJFUuJyUvUCAoJSoiNFg5SlFAUk4gICAgID9fWDlBIEAKLU07T19IKCUhOEtPX0goKCkiS09fWCchVUYgLygkKVRIICEiOicsIkwgJCAqICAgICBBJjxQLCJMICQgQCAKLU0gIClGJyk3SyAgQE8iREFYICBITypQICgzS0QgICUqKDNeXCAjJEogOVBJKDRUWlkgICBJOEVBLywiTCAKLU0kIEAgICA1RyEnI184IChAIERTTi8vU1ZAJFk+M0c1LjVPXDwyLTxcWCRBWCAsQSJJVEFOX1NBLk4wICAKLU00I0EvW1AgLD5PXVwgIkFOICBBKD4gIEUyJTEuTjAgIDgwQTAzUlggOVAgIF9FKicqJDxPLjAgIiEzISgKLU01JFpZICAhQTYlIS8rQCAsLSAgRD4gIUYkREE0M0tEICAlIlA2JF0zQCJQIDRIPzlRV1ggKCA7RUAkP1YKLU0iMiNfLiJcWSAgKCUtJEE0M0tEICAmJTg0JF85UCIxLDREUDAkREcgPEcuUEA2KUAwP0ggOkcoKkwhQTQKLU1SP19cOUUoUC5RKCYzT0wgIE9dWiAhUCApQCBGICI4IClAIEYgITggLiAgUiAiUCAhUCAhOCpYICFQICIKLU0uR1AgIDYgXC5HUCAhJiBWLkdQICBWIFAuR1AgIUYgSiIgPCAgJjwmLkdQICFWID4uR1AgIiYgOCIgPCAKLU0gJj8wLkdQICBGICw8VyFOOyY9Rjk0PSUqQjQgMkg5TSNHKFJPKCVMIiI6LU5IOUwgQkgmNEg5ODJQQCcKLU0gICVHIC9bXCJIPCAgICAiOCAjXzBHWCAySDVNNCRPTl9TQEwrQCAwKEQ4QktAICwySTVGJEcoISpIJUAKLU0jJSJOICBRQColQk4gIFFAKEIgNTRYIVIhWyIhOEFAUC5QSCYzT0wgIE9fSF9eQ19aL19CX14rX1ovX0gKLU1fXkEyQVVCJjYkVl5BNl5YMy5YXFgvXDwzRVkuPTRZNl9dUShVU1NYKSZYICInSFIrIDRKO0AgLClCWCAKLU0kJiAsTkgtRyAgI1I2KTUyQTUqJiokSVggJiAiNEg6WkBWPCAgLUEoPiAgRTIlMS5OMCAgODBBMDNSWCAKLU05UCAgUSUqJyokPE8uMCAiITNBKDUkWlkgICFBNiUhLytAICwtICBEPiAhRiQkQTQzS0QgICUiUDYkXEwKLU0gJSonVjw+WkFGOlI+ICVeICJcWSAgKCUvJEE0M0tEICAmJTg0JF85UCI5LDREUDAkVEcgPEcuUEA2KSIKLU0wP0ggMicoKkwhQTRSP19cOUMwUC5RKCYzT0wgIE9dViAhUCApICBEICIwICkgIEQgITggKyAgQCAiICAKLU0hUCAhOCpYICFQICI2KTVAJyBAJyAgITBFNiA0IiA8ICAlQjU4IFFTPCZZTDlWOUUxVDRKKTAhMkE1KiYKLU0iIDwgIDY8IF9TICpBUCAgICApQCAvXVYySDFHIC9cLDJIMUYgL1wyMy5YXF4vXzwzRVkuPTRZNl9fMSgKLU1VUCMgP0AhXCAiKU4gIEFAJSUqJldIPEIhXjYhV0gkMiY0RyFXSCVSLClaISQhJShAJCdZICAoJVcwQFAKLU0gICggICY7OjJIOUckQFAxICIxRiMiIU4gIFBAQVUpKSggRUAgRyAgMy5YIFAvX1QzRVkuPTIpTyAgMEAKLU0rUCAoO1MpIkAwQE8gICAgIVY8JCRMJTNAIiEgWShBQCBCKyE0PENfXyQpIDRYIURdIiAoIiAgICA2PCIKLU0sTCQoICAgIDlQKDJQNFlVICAgQitQICg5UFgwID4mKSRAI0FCMSggWDhEMiAiKU8gIDBAK1AgLDtTICgKLU0rUCAgICA9RyEhKyE0WCBAMC4yKDggKEJQNScoX19RIjAlLiA5LzBAIiBAICAgJUcgQyshIiAgICAmPCIKLU0kTCRAK1AgJDNHNCAgICAgKCZcICEiKSg8T10qJjU/KV9fUUYgL19YNFhGM1IiICkzRzQgICAgICAgIS4KLU01T19QMi08IFAiKU4gIEFSICEgMTI8IE4gJCdZICAoJVcwQFAgIClYICY5JDA/RCAgQDc9IiMgICBXQCAKLU05UTkyMjEgMTI8IE4gJiNIPEAlMjIxIDEyPCBOICYgLiggPVwqWyImOV5ZXCs7IiY5XjkhXjAgIiE9VCgKLU0sICAiPiAhRiEnICA4IylcLClSJzggWzxBQiAmWTgjPEAnIFBEKD88QCUpKSQhJSlQIlggMD9EICBANz0KLU0iIyAgIEdAIDlNUSpANjgiMSg4QCFEU04gLCNfXCRZPjNHNCAgICAgICAhLjVPX1wwP0QgIEA3PVQ+WCAKLU0iISAwPEAvIEA0WT4zRzUuNU9fXDA/RCAgQDc9VD5YICIhIDA8QCcgQDRZPjNHNS41T19cMD9EICBANz0KLU1UPlggIiEgMDxAKyBANFk+M0c1LjVPX1wwP0QgIEA3PVQ+WCAiISAwPEAzIEA0WT4zRzUuNU9fXDA/RCAKLU0gQDc9VD5YICIhIDA8RCMgQDRZPjNHNS41T19cMD9EICBANz1UPlggIiEgMDxAQyBANFk+M0c1LjVPX1wKLU0wP0QgIEA3PVQ+WCAiISAwPEEjIEA0WT4zRzUuNU9fXDA/RCAgQDc9VD5YICIhIDA8QD8gQDRZPjNHNS4KLU01T19cMD9EICBANz1UPlggIiEgMCBIICAgICI3M0VZLj00WTZfX1EhXjAgIiE9VzFbQCAoJCEhUiVcIiEKLU0zRVkuPTRZNl9fUSFeMCAiIT1XMVtAICgkISFSKCwiITNFWS49NFk2X19RUCAgUk4gICAgP1AgKDRcISQKLU0gJFk+M0c1LjVPX1woIlggIicpX1AoJS43RFlVM0U7X1wkQzcgLCBAO0AgKCRCWCAjUlhOICEhM0FWTCwKLU0nIUJcIDY7VjRUQEAiJiAiPCAhLFtAIyBfXyEuN0RZVTNFO11PJEM3IC8hKi4wICJMTSFGIURaWSAgIUAKLU1EQkBOICBASitAICw5QCAkIERKJDlAICBFR0AgP0AgTC8gICJMTSBKLyAgIkxNXE8hMlwmM0tEICAmJEgKLU00JF0qQCY4MjRIPVIjXUohVyglUiFLWiE7PikqQSY9ODInRCAgSyswMidEICBKWyQzS0QgIChPWDQkXV4KLU0jUDonICAqUlQiUFwgICpTLjRBWSAgKCg1JEFZICAqTlEkWlkgICIrVCUhLytQPSg+MCAiS0wxLk4wICAKLU1CXSEwM1dIL1dINl5BRjc0KCNQICBKWyQ4ICAjR0IgXCAgKlJUJiAgIFkwQCEiKCBaOCUkQC0iISFIICAKLU0gSyshOCAgI0AkQVggIlxPITRaWSAgIUEiJSEvMkghRyAgJFYrUDUuTjAgIDQpITgzV1lYTCg9TiAgLDgKLU0rUDUoPjAgIktMMS5OMCAgQl9BMDNSWFwgICpOUSdQIDInRCAgQEE2K1A9Lk4wICA4OSEwM1JYIDlAICAKLU1NRyAgOCAgIylCXCcyJ0AgIDRaWSAgITJOJSEvMkghRiAgIlo8ICFAICAsLCtQPSg+ICAiM0tEICAlKlgKLU00JF0qQCY4ICAqIVAgJiAgIE8oTyFUQVggIC0uTjAgIDRLQTAzVEogOUAgIEFHICA4ICAiViJcJzInQCAKLU0hJFpZICAhMk4lIS8ySCFGOycgIDggICJQIlwnMidAICE0WlkgICEyTiUhLzJIIUY1JyAgOCAgIkoiXCcKLU0yJ0AgIURaWSAgITJOJSEvMkghRi8nICA4ICAiRCJcJzInQCAhVFpZICAhMk4lIS8ySCFGKScgIDggICIKLU0+IiAmPEA6UEA2KDYsI0wqIURbWyAgK18wT108X1c7X0QvXkhfXCNfVidYIDRIOVIhW1IhOzAjXyNEQVkKLU0gICgoNiQqRzNLRCAgJiYwNCRdKkAmOCAgLikoPjAgIkxNISg7T1dcK1A1Lk4wICA1USEvW1AgLC9AIU0KLU0gICc6MkQ9RywkQVggMCUoO09XXDInRCAgQDc8M0tEICAoTSAzXlwgIyRBWCAwJSg7T1tdMidEICBAPCAKLU0zS0QgIChNIDNeXCAjJEokOUAgIVVEQVkgICpSV1RBTl88UE8hNFpZICAhNzxEX08gIFBOICY9UCgkPSoKLU0kJj0kMktEICBAQSg5UFhPLjAgIiIkQS5OMCAgLCFZODNSLycgICgoMiRBWCAjISFbT1csM15fX1QiKS8KLU0sI1AgIlIrODQ8Q19fIlxZICAoKDEkWlkgICIrMCRfTyAjQSpBJjggIDZRKD4wICJMTlhPITRBWCAgLSgKLU0+MCAiIiVJLk4wICA2WTkvW1AgMC9AIUwhRyAgOCAgITRESSc5UFEoUVJcJzNLRCAgI0FWNiRdKkEmOCAKLU0gMyEoPjAgIkxPVSg7T1csK1A1Lk4wICA2JjEvW1AgLCtAIUcgICM+KCQ9KiQmPFQyS0QgIEBBLDlQWE8KLU0uMCAiIiRRLk4wICAsIVk4M1IvJyAgKCgzJEFYICMhKDtPVywrU0QgIEBBJDNLRCAgKE0gM15cICMkSiQKLU05QCAgVSRBWSAgKlMjIlwlMidAICE0QVkgICgoOERaWSAgITtFRF9PICEgXiAmUCwwR0QgIEBAMjwgIUAKLU0gICJUMkQ9RyREKVkgICgoJERDJytQPS5OMCAgLic5ODNUSiQ5QCAgQyRBWSAgKlMmUlwlMidAICFEQVkKLU0gICgoOlRaWSAgITtFRF9PICEgXiAmVFQyRD1HIyRDJytQPS5OMCAgLic5ODNUSiQ5RTkoPjAgIkxSSE8KLU0hNEFYICA9KD4wICIiJzkuTjAgIDZZOS9bUCAwL0AhTCEnICA4I1kqMVY8TjIsPE8hVFpZICAgWD1FQS8KLU04IiBAISdYJ0woPUImIyBbIkA5Ll5QICJfKVtdWU9YXF9KO15YT1xeX1g7X05EKkcrUDEuTjAgIDRLQTAKLU0zVFNOIC8jXU8kWT4zRzUuNU9fXCtIPE8rQCAwK1JYICIkQVggICUoPjAgIiIoKS5OMCAgNlk5L1tQIDAKLU0rQCFPLERBWCBAKE8rQCAsK1A9Lk4wICBCSTkvW1AgLCMoICAgICgiOVBQTyFUWlkgICBYPUVBLz9PXE8KLU0hVFpZICAgWD1FQS8oIDxOK09fXDNFWS49NFk2X1sxKFVSI0ArUlggJCJcTiAgQSg+ICAiMidEICBAQisKLU0zS0QgICVONjNeXCAkIkggOzAgIE9ESiU5QEhALyAgIiIpOUAgICJSMiZbX1EiXCUzS0QgICNCJjQkXSoKLU1AJjggIClQQCtPXzQ1KCBPICRaWSAgIE8iJUEvK0AhRyAgIiYrUltfVSJcJytQNS5OMCAgQkk5L1tQICwKLU1MKltfVSY5QipGWCAjIlAnVypbX1UiISYkK1AgIkUqJigkOSIkJEE1K1A9Lk4wICA2QykwM1JQIDlTKSgKLU07MCAkK1A5Lk4wICA2QykwM1JQIDlSISg7MCAoK1A5Lk4wICA2RkEwM1RKIDlQWE8hNFpZICAgWD1FQS8KLU0oID1AJUJcJTNLRCAgI0FWNiRcTyFUWlkgICBQJ0VBLzwgISxbQiNAX1sxLjdEWVUzRTtfTSRDNyguIE8KLU0rQCAwK1JYICIkQVggIDEoPjAgIiIpPS5OMCAgNlk5L1tQIDArICFNICAmOjJIOUYiQiBcICAoKEhWICAKLU0gOFkoO09fJCtQOS5OMCAgLig5MDNUSiA5QCAhPiIgTl9dMTRAIlwgM0tEICAiXCg2JFxKICY8ICA2KE8KLU0rT180K1A0TyFEWlkgICIqRURfTyAgUlBLT180OUAgIS9CSU4gIFBOIT1aTl9dMEAxUSJcICBJMkFSIScKLU0wQSEoOzAgLCtQNS5OMCAgNkMpMDNSWCA5UCAhIkRBTSAhIE8hVFpZICAhOixFIS8rQCFHICAjVjImVCAKLU0lIlwnM0tEICAlSFI0JFxOICY8ICAuKSg7MCA4K1A9Lk4wICA2QykwM1JYIDlQICBTREFNICFQTyFUWlkKLU0gICE6OiUhLytAIUcgICJaMiZUICgiXCczS0QgICVIUjQkXE4gJjwgICo5KDswIEQrUD0uTjAgIDZDKTAKLU0zUlggOVAgIEREQU0gIkRPIVRaWSAgITpOJSEvK0AhRz9EQU0gIkhPIVRaWSAgITsnJSEvK0AhRzskQU0KLU0gIkxPIVRaWSAgITsnJSEvK0AhRzZEQU0gIlBPIVRaWSAgITsnJSEvK0AhRzIkQU0gIlRPIVRaWSAgITsKLU0nJSEvK0AhRy1EQU0gIlhPIVRaWSAgITpOJSEvK0AhRykkQU0gIlxPIVRaWSAgITpOJSEvMkghRyRCXCYKLU0zS0QgICNBVjYkXEAvICAiTE9VQCVCXCYzS0QgICNBVjYkXE8hNFpZICAgUCdFQS88ICEsW0IjQF9bMS4KLU03RFlVM0U7X18iWicrQlggIiIhTiAgUEBBVEFYICBITyFUWlkgICFBIiUhLytAIUYhJyAgOCBAQDFUKDAKLU00SDxAIVJYTl9fUS43RFlVM0U7X14iWicoRlggIiRIMTlQUEA7QCAsKChFQChESic5QDFQICYgSjxDIl4KLU1ANlQuPENGXkA2WCg8QyI+QDEqJzggMDJPICFfNEREMCQ0RyArQCFSIktaITlNKSImMiApK0JbX14kWT4KLU0zRzUuNU9fVDItPCBQIilOICBBKiQ2PEAjISQgIkY4KigmWCAjISJcICddQC1HUCA4IiFSLCtaITswOVIKLU0uO1ohO1AxUCAmIEZXKDhCIU42IVcoJzxBV1hQRyg9MjIxIDEyPCBOICcoKk9IJUZVIiFOICBQMEFEKDkKLU0oIEUsW0AjIF9fMS43RFlVM0U7X10iWi0qRlggIiRINTlVUEA7QCAsIyE0ICJGODAkK1AgP1YhMCQrUCAKLU0gNiEgMEEhQC8iKS00RFQwJDRHIDxEOlBANj9OPERaUEA2P0g8RTJQQDY/PDxFRlBANj82PEY6UEA2PzYKLU08RlpQQDY/MDxHMlBANj8kPEdGUEA2Pl48ICFAI0BQNSAgSUchJyAgOCAxIicyIC0qRltfXSRZPjNHNS4KLU01T088Mi08QFAiSU4gIEBOK0AgMCgkPSokJjlKMiU1Lk4wICBDJyE4M1JYIDlQOEAxVEgwOUU5KD4wICIKLU0iKjEuTjAgIEMnITgzUlggOVA4QDFUSDA5Q1kqLjAgIktLMUYsJEFZICAoKEo0WlkgICIsPCVBLytAIUcKLU0hQiEnMkEhRiIkQVkgICgoTSYgIitQPSg+MCAiS0sxLk4wICBCX0EwM1JYXCAgKk5NIiBOICBQQiAuRiEKLU0xKCMwQDA6ICAgKlJQMlwgK1A9Lk4wICA4MkEwM1RKIDlBME8hUlxOICExLk4wICBCX0EwM1cgIDggICEKLU1SIlwnM0tEICAlIjA2JF1cI0siJjtQOVBfViAgIDspKD4wICIiKzkoO09QIDNLRCAgKE9YNCRdKDU0QU4KLU1fICEuTjAgIEJdITAzVEFZICAoKFBUQU5fICEuTjAgIEJdITAzUlwnMiZbXCAkWlkgICIrVCUhLzBKPSgKLU07T1AgM0tEICAoTFY0JFxMICZRPCMrRCAgICAiICAoIDEmOTAyJ0QgIEBDJTImW1wgJFpZICAiK14lIS8KLU0yJTUoO09QIDNLRCAgKE8wNCRdKD4wICIiLVEoO09QIDNLRCAgKE8wNCRcTyFUQU5fICEuTjAgIEJdITAKLU0zVCpHMiZbXCAkWlkgICIrLUUhLysgISpBRlQuK1A8TytAIDQzS0QgIChPWDQkXCxLQCAgICAkICMmOCAKLU0gLjEoPjAgIiItWSg7T1AgM0tEICAoTzA0JF0iSVRBTl8gIS5OMCAgQlM5MDNSWCA8T15eQDY4KjNLRCAKLU0gJiEuOCAgIExEQVggIUEoO09PSCtQPS5OMCAgQkk5L1tQICw8QUJQQDY8NjNLRCAgJiEuK1A9Lk4wICAKLU0uJzk4M1cjXzggICBBJEFOXl5BKD4wICIhTjEuTjAgIEJfQTAzUi9OXl9AICBAO1QyS0QgIEA7WDlQWE8KLU0uMCAiIU9BLk4wICAsIVk4M1RKTl5fUU81QlxOXl9RLk4wICArUEE4M1JJICtSW1tfJEE1K1A9Lk4wICAKLU1CSTkvW1AgLEwqW1tfJjw0K1A9Lk4wICAuJzk4M1RaWSAgIUAzRyNfOCEoQ1MwICIhT0BPIVRaWSAgIFgKLU09RUEvKCA5LFtCIyBeXVEuN0RZVTBLRCAgQDtYK1A9Lk4wICAuJzk4M1RaWSAgIUAzRyNfOC1RLjVPX1wKLU0oI0QgIEBBJDNFWS49NFk2X18hKFVSIyArI1AgIEBDQitDUCAgQEVIKkdQICBARl0yS0QgIEBAIjlAICEKLU1WJEFYICshLk4wICArUEE4M1IvICAgKCggREpZICAoKCBGPVorUDkuTjAgIDQpITgzVSogK1AhLk4wICAKLU0rUEE4M1IvICAgKCghRj08K1A4Ty4wICIiIDkuTjAgIEJfQTAzUlwnM0tEICAlIjA2JF0yQCJcIDNLRCAKLU0gIlwoNiRcQ1AgICIiIElHK0JcJytTRCAgQEAqM0tEICAoT1g0JF0oNTRaWSAgITBEJUEvNEggTyAkWlkKLU0gICBPIiVBLyhcICAgQEAuOUA5UCAmICAgNDEoNTJcWSAgKCgjRFpZICAiK14lIS8rI0QgIEBAJj9AIEAKLU0+MCAiIiApKDwnMCArUDkuTjAgIDZDKTAzUlAgNEQ8LDFQICw7PileICIhWSAgKCggREFQPSMgTyFEWlkKLU0gICE6LEUhLysgITIxUFEnICBRTVhCUFkgICgoIkdYICgnRCAgQEAiMichVDgiXCYzS0QgICVIUjQkXEwKLU0gJSknIyQ8ICFWV0I/QCBAPjAgIiIgKSg8JzFcK1A5Lk4wICA2QykwM1JQIDREPCwxUCAnOz4oTC4wICIKLU0iIFhALjAgIiIgKCZAICAgIClATyAiXCYzS0QgICVIUjQkXEwgIiBZICAoKCBAOiAgICAgRyJcICtQOS4KLU1OMCAgNkMpMDNSUCAoI0QgIEBAIiFIICAgICJAK1AgTyFEWlkgICE6LEUhLysgIEAuMCAiIiAoJkAgICAKLU0gKjBPICJcJjNLRCAgJUhSNCRcTCAiIFkgICgoIEA6ICAgICBKIlwgK1A5Lk4wICA2QykwM1JQICgjRCAKLU0gQEAiIUggICAgIkwrUCBPIURaWSAgITosRSEvKCNEICBAQCIzLlhAUC9fUDNFWS49NFk2ICAhKD4wICIKLU1LSzEoPjAgIiFOMS5OMCAgQl9BMDNUKlkgICgmXSRKWSAgKCZeJjwuK1NEICBAO1gzS0QgICMgPjYkXSIKLU1OMCAiIU9BIk4wICIhT1EuN0RZVTNFO19fIlonP0AhKD4wICIiPzhQIVRDIChAI0lANDIgVCgkJkAgICIKLU1MTSBPICRaWSAgIiteJSEvNEQ8LDFQICc7PTkoPjAgIiI/QSg+MCAiIU4xLk4wICBCX0EwM1RBWSAgKCoKLU0gJEFZICAqUlAkWlkgICIrXiUhLyhfUCAgQEgiICAqUkwiL1wgICgqIUAgIkxLME4rT19cM0VZLj00WTYKLU1fXzBAO0AgKCRCWCAjWygwOUAwQCImICYyQUFGXScgIDNFWS49MCAgM0U7X10iWicoJlggIyIpTiAgQD4KLU0mK1gxOUBBKiY2O1Y8ICFAIkEgMTI8IDIoJEchRCgkTitPX1QzRVkuPTAgIDNFO19dIlotKEZYICIiIU4KLU0gIFFAJUJJKDggQDAlOyAxOVA5MjM0SDU5TzEqJTY8JjRERSokNjtGRF5YICIiICkqRltfXSRZPjNHNS4KLU01T19YMi08QEAiWE4gIEFGIUJYWSAgKk8xJEonOVE4TytAICwrUD0uTjAgIDg1QTAzXSInKkQhKiU2OCQKLU08ICFAKiJcTiAgUSg1NFpZICAiLSIlIS8rQCFGIiQqWSAgKk8xJiAsKCQ9IiQlKicoXDwgIEpdJCggVSwKLU1bQiIgX19BLjdEWVUgICAgICRZNl88QShVUyNAKyJYICQiVVkgICpTLy9fVD9AJE0xX19YKzQ7X18kQU4KLU1fPVEoO09XQDImW19dJEFOICBBLk4wICA8RThAO0AgOCgqW11ZIklOICEwSitAIDwoIltdWCdYJUwoPUIKLU0/IyBbIkA5Ll5QICIgIlggIyAgLCAkOCA2ICE4KCJbXVotIiYqSCEqQUZdNjJeW11bIkElMD85SSgvV0wKLU0rQEA4VztPJzk/SUAwJ1ghKkg9KkFGXFgqRDRIMU1HJSZPUCAsK08sOT9BQCokKjUrQ0QgIEBIQDxAQlwKLU1ANlQsPyBBQCJEKjUrQ0QgIEBIPD8gLEoxUkElV0g4OFc7Tyc5P0hAMTQoUDogIEAhNFNOLC4jXVIkWT4KLU0zRzUuNU9XKDItPEBcIkhOICEgTT4wICJMU1NfXSQqTl9fQE0xP19cMiZbXVckQU5fPiEoO09fVDImWCAKLU0iJFpZICAhUjVCIU4gIUBAS09XRCoiWCAnIlhOICEwQCtPV0A/IDZQQUYoICArKFAuUEgmM09MICBAISQKLU0gIFAgIyAhUiAoOCBBREolOzBQQDFSIE5fXyIwQTIiIDggOEAxUiJOX18hXiAkT05fPlBMISYgKCgkODAKLU1HNSonNEg6XktPX1A7PyhAMS0nTl9fISIkJiFEKCQ9IkQiISQkK1AgLCNJXCAgJlpDNlw2P0AnPkEtSiQKLU0rIDRAMVEiXCAjITIzNSonT0g5RVxEKFUyICFALUIhJzBJIEwuMCAiIkIhXiIrSic7MFlaIiYgLCgkPSIKLU1EIlBZICAoKicnSCMrQDhKMS1SJSgkPDpUJSonT0g5RV1CISQwQyE4ICIgJDMuWEBcL1coM0VZLj00WTYKLU1fXiEoVVNTQComWCAjIlhOICExLk4wICA3QzhAMCIhMCchIEoxVEpMICAxRyAgJiAoJDwwTyAgTTRIPEoKLU0xViAgIDcoOl8gIFAySDVHICAmLiZMOjlTJS0qK0BKWVFWUCAgOCA6XyAgUDREUUBcR1goTTw9TCIiQVkKLU0gICgqLiYgLionRCAgQEhUOCA4SD4wICIiQ1EqJSY8ICA1ODpXJiNWMkpQICImWC4oIEk2QCQyIEwqUCAKLU0iJlwgIClIOlsgICwmTDhWPyAgIT9AJUAhQUsyNERNMkFUN1Q+IFEqJEY7UjJINUYjIFBFICMhR15LUDUKLU05UCkyMzFLXCAmNEg7ICAoVjxNMzMkSiw6UDg6XyAgSzggSDpfICBNKCBRJEAiQSAyJltfXycgICwgUE8KLU0gJFpZICAhWEQlIS8/QCEpW09fXDggMTJBVSksIyEwICwmP1Y/ICpeQUZcJD9AKUAiJ1AjT0g5TiAgIlwKLU0yPzlYXyQnTl9fUTYyIlgoJk1SWVFWL1o4ICAgSUcgIUQoSlBLICAoO0M5XiAiOSc4IEA6XStALDRIPTIKLU0yUiAqVCpQICIrWiA7Plg6UUI5JzJDMlgjJj0gT0hJTC8iWCspREg6XSdALDRIPl5CVldWOCJQOl8gIFAKLU0mTDleICYgJiZPUCAsJSonKCJQICItIioxKCJeQCZXTj9AIUAhIUszNEg9J10nQCwyQS1GXSRKJTlDMCwKLU0pMCBQOV9KXCU2PEo0RFVAKUIxTiAgQEorQCAwKCExXiE7Iic4QCNeUUMgWyJAOS5eUCAiX0c7Xk8vWlwKLU1fSTteSy9aTDBBNSxbQ1NAX14hLjdEWVUzRTtdVyJVWSAgKlMvL19UPEAkTTA/X1grNlggJC9fXDImW10KLU1XJEFOXz4hKDtPX1QyJlggIiRaWSAgIVI1RF9PICEgTytAIDgrUlggJSRBTl8+IE8rQCAwM0tEICAmLzgKLU0oIlggJiRZPjNHNS41T19cK1JYICUkKkcrUlggJCJcTiAgUE8rQCAoM0tEICAmNk4zRVkuPTAgIDNFO18KLU1cJEM3KCwgSjtAICwrIlggJiFYTiAhPCwhUCBQOUA5KkFGPCAgLFhCO0AgMDxAJiNEMiFOICBAQCQnKCMKLU1MKCVCN0MgWyJAOS5eUCAiICBAIEwgITAgJEAsIVAgVTswICBIQFAnICM1TjAkSiY5Q1EqSzAoMDtQICAKLU1EJCdNICBQQCswKDAkIyAoX1RHID9DIjBBVyghMkghTCIkMiBQKCUkQCYgIlAoJSpAJiAsMkpUICEmOUIKLU04IDkqSzAgJDlVSE4rMCgwNFg8TCFWICwySD1NJEEqXCAjITNBVS4mMF81SCMgUDEgI0VHWkRKJzswOTIKLU0tN0AsOCQoOz8gIFEgIFBAO0AgKCMqQCAgICAhICAxRiFFKk0gIEFAKiRKTSBBIU8iQiBNIEEgO08gIFAKLU0iIFEySzAoMDghKSpLMCgwO0BQOz8gIFAgIFFeIDJNJyBBIEArMCgwMEM0KCMkU04oLCNfXCRZPjNHNS4KLU01T0xMMi08WFAjVVwgMCNdXiNVXCAwI1tcJEFOXl5RKDtPV1grUlggIiRaWSAgIV5CRF9PICBRKktPT0wKLU06QiEoO09PSigiW1tbJDIgIEggICAvX18rUCEoO09XWDNLRCAgJ1JWM15cICMkQU5eXyEoO09XWDNLRCAKLU0gJ18qNCRdKktPT0w7QEkhW09PUCs0Q1tZJiFUMiZbW1kiXE4gIFBPK09PTDInQCAgREFOXl8hLk4wICAKLU1AMykvW1AgNCgiW1tZJjxIP0AmUEFWOSorUltbWyRBWSAgKCo3JEFOXlkxLk4wICBCTyEvW1AgLDImW1sKLU1FJEFYICIpQCgiXE5eXlEoPjAgIiJHJSg7T00kM0tEICAoS1AzXlwgIyRBTl5UMSg+ICAsM0tEICAoI04KLU00JF0oO09NICgmW1tZJyAgLCJAICBEJ1AiQDlQICMgSF9fWE8gJFpZICAhWEQlIS8/QCErW09NIDggMTIKLU1BVSktIyE0ICwmP1YpRlggJClPLT8gLl5BRlg+MD85WSgvTSArQEBIMlQnTl5UITYyIlAoKCQ8OFQlKicKLU00RFZeQUYvVCgmW1tZJyAgLCJAICBFNiArQCFNKU4uJzA/LzggIlAoK1A4QDtPT0Q8ICBQLCdAJitQIS4KLU1OMCAgPikhMDNVQS02KDk1QVZLQjBDLzggIiFOICFAQEMyIU5eXjBQKiAgJDIsIEA7QCA0KCghIVtPT1AKLU0oIltbWSsiKDlQSE8gJFpZICAiIFRFQS8zLlhYUC9MTDNFWS49NFk2XlIxKFVSI1wqRlggJSJITiAhIEwKLU0rQCAsK0JYICIiIU4gIUEiRCIhJzJKQCAhJjhUP0AgSCM2ICooJDAwTyAgUDRIPTJBK1olOF8pIV03QCAKLU0qQEFAIkIhJSQrUCAsJSonNEg2XkFGL1IoJlggJyIiJzggICI9Q1VcIDAjXV4jVVwgMCNbXCRBTl5eUSgKLU07T1dYK1A9Lk4wICA/SEkvW1AgLC82W1tbT1dcPSEmNEtPT0w8QCBSK09XWlo4RjRANFBcKCAoICAkVDEKLU08QSNCSk0yJk0oNUQgQjAlK0A2XEFWLCIrQDksLydAJyAgLTI6QDonICA6RFUnKDBYSj0yQVQyJzImW1sKLU1aIlwnK1ApKD4gICoyJltdXiRaWSAgIiEsRF9PICEwQCtPT0g5UjleIDsiJzlEOE8gREFZICAoKkFEQU4KLU1eWUEuTjAgIEJPIS9bUCAsMiZbW0YkQVggIilAJ0JcIjInRCAgQEo8MiZbWzIkWlkgICIqXCRfTyAgUSgKLU07T00oMidAICMkWlkgICIgW0UhLygmW1taIFFIX18gICEmWVYsIkAgISRDIDEoIUohJ1gvVCg/SEAiQCAKLU0/QCFcICYgLigmW1taJElQOiA5RiIlKic1KDpeQSZXTk9IMUwiQiFOXl5AIDwgICEyQDhOISJQJFhYOEoKLU0hLi4lKCA6MEEySCA4ISBAO09PSCw7IUghRUAmNEg9NEE1MiYoJltbWicgICwiQCAgS1ogOT4qOTogICIKLU0oJltbWi5GJFY2QCAhIiFOXl5BKjogICQ7IyEoO09NJiwiQCAhJEMgMSggIkAgICBfX1xPICJcKDNLRCAKLU0gJ1JWM15cICMkSU5eVDlHIkIhTl5eQCA6ICAhICA5KDtPT1ArUltbWiRaWSAgIV9SRSEvP0AgXitPT1IKLU00WDxMIV4uJjA/OUkoL09WKyBBQCElLic1ODhAMURJMDlfOSg7T00gPCAgUC1HTEBeXzhPICRaWSAgIVgKLU1EJSEvPkAhIVtPTSArIEFAISUqJTRIOEAxQFAwICMhR10nUCA+IC5aQSZYQjA/OTkoL00gKkBASCM0J04KLU1eVCE2MiI4KCgkMEIxMSIxNEg1MkFFKiROSC1DXCUuJzpTK0NBVCdWPjIjW11CWCgwPzVIICJIKDA+W1sKLU1dQkAoK1A0QDFXICAsISBPICRaWSAgIVhEJSEvNig5OEE1NidPSDFEWSQoVTogIEA7QCA8KCg4QDtAIDgKLU1FKDhAQEQnTl8/QEArT09ITChBRyJCXCAzS0QgICgjMjYkXSxbQiNcXlIxLjdEWVUzRTtKMCRDNy4vUEYKLU07QCAwK0JYICInOFAwSltfXyIhJylVICAhIjpIICAwLEogICAgICggISY8LCMqQCAgICAhICAxRiAgOT4KLU0qJlggIyBSTCAgICIgICAoOyEwLEsgICAgICQgISY4NiMqUCAgICAhICBBTCMiIU4gITFeIiheMDggICYKLU0sJCdOX11QQjFTIFwgIDxAVjUnKF9fUSFbT188MF5bX08jIFwgIDxCViUnKF9fUCxLT19fX19fX1kmWCgKLU0wSltfWCYgICAyUCxLQCAgIClfX1kmVCgwSltfUCYgICAtWEArT19EPEFdKkAmUCgxKCMgQDQyIDggKyAKLU1AN1g/TCg9RjEiIE5fXjEyQCZIIlQoP0pAIlAgP0AhK1tPXyg4IDEiRzUqJ09IOUVeJ1AlT0g5TCAgIjIKLU1ZOD0hXUdDSCtAQSFbT19IMD5AICUiUCgoJD0iRCVCJ09IOUVdRiFSKCJbX1klKiA6QDFeJ10iJ1pIIEwKLU0gJ1ggMl5bX1ImICQwSVUyQVtaJjk/QEArT19EPEFdKkAmUCgxKCMgQDQyIDggKyBANyg/REghUCA+LkAKLU00WCBOIU42J1A7OVhSJDogUDs5WFolKiYrQDlcITtaJjshU0VBVCdWPi5ATiIkJ05fXkEhWiAgNCsgQEAKLU0xVCowNig+XkFGN1YyJltfTyRaWSAgIVM6JUEvMkpbX1gmPFYjKlAgICAgISAgMUYiIlhMICBBMkFWICYKLU0rQ1AgICEtJDImW0w8JEFOWycxKDtOUVgrUD0oO09fPDNLRCAgJjxQM15cICUmICgwSltMPCQqTlsnMEQKLU0rTlFQVSpbTD0nQCAySlAgISY4JjJKUCAiJlA0IypQICAgICEgIDFGOkIgTCAgQTJAKyIiO1YgLEsgICAKLU0gICQgISY4OitCUCAiJTInR0goLEFQICAgQCFDIUJYXCAgICIgJ1AhOCE5XiAiUEwgIEE0QUBSJiAgICIKLU0gJiwmKyNQICAgKCAyJltKOiRBTlpGUSg7TklQK1A4TyFUQU5fW1EuTjAgIDouKS9bUCA4KiJbSjstQk4KLU1aRkAsSyAgICAgJCAhJjggIEAgSitOUVBOSlAgIiZcJCpCUCAiJ1ggMkg1TyckT0sgIFEhW05RWCsgQSEKLU1bTlFYVkhAQDFBSzA0SD0yQUtSJTk/MEo7TlFQVl5bTD0rT0wgIEFPISJJTCAgQl5DNlA4MD5MICMiUCcKLU1XKEM7UiIhJiQrUCAsJSonNEg6XEM2N1JPSlAgIiY4ICAqMEcxUCgwKCAqMEFSPSAgIEJeQEZRLE9KW0wKLU08JjAqJUM5WSguUVg0SD1AIEc4UDA/OVkoLlFYKyBBQCJLWk5bJyFEIyUqJzRIOEAxQFAwICMhR1tLWk4KLU1bJyFEIUdYISs0P19fJEpOX1whRyAgJE4/QCRNMV9fXDggICEpJEpOX1whRyAgJDwySltKOyZcJj1DIVwKLU0gJiAmJUJbSjwnUCErQDkhXUZEQFpHIEwiJiAoT0gxTCMlKic0SDhAMUBQMCAjIUdcK1okOyAgIFonWCEKLU0rND9fXyYgICAtWEorICAoRkg9KkFWOD4/ICErW05JUDggMTJBRSktIyE0ICwmP1ZWSDs6S05JTFcqW0oKLU07JiAiPyAiWkEmXCIqQDBAITQyIClUICAiK0pOWkZRTyFCQE5aRlFAIEJAJU8oMUwkRE9LICBTO1FRS1wKLU0gIyEyQVUqJk8oMU1dK1IlOyFJK1pQICxWXDxAIUkiTlpGUDpdQERAWkchMkFVKiZPKDVNWylSTlpGUlwKLU1LTklIOyNJKkFGUCQ9QyFAIUE4VjoyI0o8JSomOkApXCAkT1Y6MiNKPCYgKk8qW0o6JlAqNEg5MjMwUDUKLU0gIyFHXCtSTlpGQUwoR1AhKzQ7X18mIDowPkwgIyJQKFcoPUAiQiEmJCtQICwlKic0SDpeSyAgKDs/IEcKLU0xUCgwK1JbX18kRyMrUCxPK0AgNDIlLSg1JFpZICAhRigmICAgQzkqSyAgKDswICEnQiAiVCpQICIgUiAKLU0gICAiICZQIF5eMV4gJE9LICBRIVtOUVgrIEFAIiIhJiZNITJBVSomT0pbTDwmN1JPSClMJkRPSyAgUSEKLU1dN0AgKyBDO1BCISYkK1AgLCUqJzRIOlxDNjdSKkAyWEsgICg7UDBKKyAgKE5KW0o7JlwmKiJbSjsmICIKLU0qIDVcICRKJDtRKStaUCAsVlw8Ol8gIFA0SD0yQUtSJDs/MlxBNlA6Ml5MICMtTycoIDowS05JTCZPOCkKLU0oLklQNEg9MkFLUiU7PlErWlAgLFZcPUAiIUtcICMhMkFVKiZPKlAgIiZXUilUPCIkKTInKVQoICIpUk4KLU1aRlBOIUtaTlpGQUwvJEonOyAxViwmICYlQzlZKC5JUDRIPUogR1ggMD85WSguSVArIEFAIktaTlpGQUwKLU0jJSonNEg4QDFAUDAgIyFHW0taTlpGQUwhR1ghKzQ/X18iXE5fX1EpUFJcIytSWCAlJEEzMiUxLk4wICAKLU05QiFAICAkMisiUCAiJDImIygoICAgKCA7ICNaUiBSJiAgICIgJlAgXktaVEFGWFpNKDlGIiE4TlsnQV4KLU0gNiAkPUMhXiAkT1Y+MiNMPiYgKk9KW0w8JjAqNEg9MjMwUDUgIyFHXCtaTlsnIUQhR1ghKzQ/X18kKksKLU0gQSFAO0dYIDA+TCAjIkAmMl5bTD4iSCg4IEBAMTEiPTRIPTJBMiBOWyciMEErWiA5PlleICRPSyAgUjQKLU1BQkgiOCA4Ol8gIFA0SD5eQTZXVilUPCIkK1pOWychRCshOFY+MiNMPiUqJzJfOVkoLlFYOCBKXktOUVAKLU05IEkyQVUpLSMhNCAsJj9QT0pbTDwmMCY/QCRNMV9fXDJKW19QJjwmP0AkTTFfX1wrUltfXyRHIytQLE8KLU0rQCA0MiUtKDUkWlkgICFGKCJYSyBBISlaUCAsVjw9QCFBQ1wgIyEyQVIgSyBBIzBBS1ogOz8hIkpQICgKLU0pVDwiJCQoUz4gUSxbQ0NcWkQhLjdEWVUzRTtfVSJaLSpGWCAkIiFOICExIkQiIU4gIEBNNC9fWCs2QCAKLU0hL19cWj5YICA/X1gqVCAgISJcTiAgQS5OMCAgPSwhODNSSiAoITVSITsiIThBMFAuUEgmM09MICBAIFAKLU0gIFAgIyAgUCAjICAsJEFOX19BKDtPXzgzS0QgICc1WDQkXE8rQCA0MiU0TytAICwyJltfViRaWSAgIUsKLU1OQklOX10xLjdEWVUzRTtfTyRDNy4sIEg7QCAoKCZYICUkKjA/QCErW09fUDA+W19cJCdIICEgTCIiS1QKLU0+ICE4QVtPJjk/OUAlIyBbIkA5Ll5QICIgJSAgK0AgTiAlICA0ICEwKUZYICQuR04gICdfXCI9ICAgMSgKLU01JFpZICAhVkhFQS8pSCBAJFdYJUwoPUNSREE0MiZbX1QkWlkgICFXMSUhLytSWCAlJEEzK1JYICMkQU4KLU1fXSEuTjAgIDpbSSxbQ0MgX1tRLjdEWVUgICAgICRZNl9dQShVUCNYKCZYICIgUkggICAgIEAgJDlAICEKLU0oR1ggOCBALDFQICU5IFEyMVcgICwgPSpMIFAsOV5YLDFQICU5MEEiSiAgJDggICBfREknOVVJIktPX1wKLU0+QCBaIVdAJUYoNjNSNiAuVyg0QUwmUCxGIFEyS09fXDYkREwrT19cTygxRVpAUk4gICAgIT9fXDshU0UKLU1BQlUmX18wQCtPX1QwSyAoIyVCTl9fMCxLQCAgICEzX10mV0o8ICBQIV5OKEQ6QCAiJiAiNEQ9UCAjICcKLU08QDIyQCIpITJLIjwjJj9OMEZbX15CWEggIFAsQVAgIF9fXUIiJyAwWDpcXTAvX1ojKDwgX19fXzhAO0EKLU1DVSFOX19ILEFQX19fX11CIU5GLzYmW19eQFInL19fX19WKCZZOF00O09fWiMoPV9fX19fOEAxMjtPX1oKLU08ICBQK09fWkQ6QCAiIFFOICAnX15GNE4/ICEqQjZUSDwgIFArT19aPUIiNkAiWClZOD0jXCdALCpBJFIKLU0rT19aWFpUSCQ+OkxDKDRCQUJQJDY4PUpZRFNOIC9DX1YkWT4zRzUuNUAgIDwgJFIrQCAqWFoiIU4wICIKLU1MVDEuN0RZVTNFO19dIiFOICBATTQvX1grNkAgIS9fXCwiW19eICkgP18hRiZCIE5fX0AiQCAgL19fXUYKLU0iREpOX19RRiEnICA4JDFQIDYhICwiW19eICkgP18gLDAnX1A5QyBAK09fWCBIICAjX19fOUBJKktPX1wKLU05QDFQIFYgPCgiW19eICogICBfX19QUiAgIDAgICY0JDwgMUAhRyAlOCApUCBEWT4zRzUuNU9fRDItPCAKLU1cJ1AgKEJYICMiIE4gIEFeIy0iJz4iIjhAMyFcICEjMVAiWDBYWlxKJC5CTUMoPEBBQlAlNjRCUVAmM0wKLU0zLlggXC9fRDNFWS49NFk2X18hKFVSIiAqRlggIiIhTiAgUE00L19YKzZAICEvX1xaPlggID9fWCpIIEsKLU07T19cICEhXiIkKlU+IFE4QVcoNE9IJU1dIyBOX19AIjAnX1A5VlBQK09fWCBEIV9cIFEgP18hRyAgIjIKLU1aPlggMl9fWCEoICAgIC9fKlQgICInWCIqVDwgISIgTl9fQCJAICAvX19cIEAgIDAgICBLMCAgLDInQCAKLU0iVEE1M0tEICAnNFo0JF1AJiRKTl9fUUY3J1gjKlQ8ICEmICoySltfXyY4OjBKVCAhJFNOKCgjX1wkWT4KLU0zRzRAK09fWCBIICAjX19fOV4hXiBCTScgIDBLPy9fX18gVCAiIiBOX19AIkAgIC9fX1xLMCAgLDIlNS4KLU1OMCAgPFZBODNWIyIoIltfXiAqICAgX19fVj4+KCJbX14gKiAgIF9fX1BAICAhLUciJ1gkKlQ8ICEmIDIKLU0/QDBLMVAgJDInQCAhJFpZICAhVEpFQS8oIltfXiAqICAgX19fUCIgICBAICAmICBfVFkuNU9fQDItPCAKLU1QIilOICBBXCAkJ05fXyBOIiQnTl9fISFaICAwKEBAQDFSIlE6ICE4QUVCJ09IJUVcQyBOX18gIjAnX18KLU05VEhQK09fUCBEIV9fUFEgP19dRzFHICI4IllQISYgSjJKW19dJjheMkpbX14mOFgySltfXyY4UjwgLUAKLU0lJEpOX18xRidESk5fX0FGJiRKTl9fUUYkRyAgMy5YIFAvX0AzRVkuPTRJTl9fKUdXJyAhOC5RKjtPX1IKLU05W1FQICMgTl9fKCxAICAgQCAhREpHICU4LTEuNU9fPDItPFBYIkFOICBRXCAkJ05fXyBOIiQnTl9fISEKLU1aICAwKkBAQDFSIlQ6ICE4QUVCJ09INUVcQklOICBDSVtAICFfXyBKQCJNTl9fMCAkIk1OX19AICUiTU4KLU1fX1AgJidYMDBLNVgjJUInPyEyXkFGV1QsIltfXCApID9fXUc4IyBOX18gIjAnX18jJCFfX1Y8ICAoSVAKLU0gIyBOX18gIjAnX18hKCAgICNfXypUICAiJ1giKlQ8ICEnICAsIltfXEAiICAgJCAgIk0gICBRKD4gIC8KLU0yJTUuTjAgID0zSTAzViAsP0AsSzFQICQ4IDEiSzAgJDMuWFBYL188M0VZLj03ICAsIltfXEgiTl9fMiAKLU1LT19YQCpbX18mPz4/QChLMVAgJCpXU19fXCAxICBBUCAjIE5fXyhLMCAgLDIlNS5OMCAgPFZBODNWIl4KLU08ICBQK09fUkAqW19dKCJOX19CIEtPX1w5WVgoK0AgJ19fKUciJ1gkKlQ8ICEmIDI/QDBLMVAgJDInQCAKLU0hJFpZICAhVEpFQS88ICBQK09fUiAkIiAgIk0gICBRKD4gIDA4ICNfNyAgICAgICAgJFk2X18xKFVQIyAKLU0/ICxAO0AgLC9CWCAiRyAgLCA8TiAkUVwgICQgICAgKjwjIzJAISYhOCAhLD8nICcgICAgIkUnLl9eISwKLU1bQCMgX18xLjdEWVUzRTtfVyRDNy4vUVwgJ0AgPkAgSDtAIDA9QCBWK0AgKikgLTNAQklOICBRQCwiXCYKLU0oICowQVMgVCJAICJAICAgX19cTyAnICAsITRPICRaWSAgIVleJF9PICBQTiArWiY5ICkyMSJQJzRINTQKLU0zMlglT0gtRVJCOU4gITBQLy9fX1AkOFZAJygwWEpYVzFAICItVDAgISRTTi4vU19XJFk+M0c1LjVPXzwKLU0yLTxYXydYID4gIVwgIkFOICEhViAjOE4gIEhEIFUuIipGWCAjJiBYK1A8QCBJIiUsIzAqICAqICAgI18KLU1fUlwgPCAgUCUyXCAzS0QgICdHWDNeXCAjIlggIyg+UlQlWCA5MEEyMSAyJ0xNIT4gJSomNSRUSiFLSiMKLU05PChGO0AgNCggPSw/ICAhICAgRyQjOiEzJ1FQIVAgIClRIEAhVFFcICAkICAiPDAtVCQgIERRXDwgPCAKLU0gIjwwPCAgUCEkMiBZOEBCIC0qIVQoJzBBUz0gICAxLFtDQ1xfXVEuN0RZVSAgICAgJFk2X19QUCtAICoKLU1QLlggI00iTiAhIS43RFlVM0U7X14kQzcgKDFeICNYTiAgSz5LQCAsKCA9LD8gICAgICBHJCcoMFhaQSwKLU0/JyAiICAgRyQoIiIzLlggQS9fWDNFWS49NFk2X19ATkFSWE4gIEFHJiIhTiAgUVAgIyAwV0ggUC8vX18KLU1QJDxQUCcoMFhKXUZbIlhOX19BLjdEWVUzRTtfXiRDNygoIE4rQCAoOVIwSjtAICwrUD1QICMgNStQIS4KLU1OMCAgPkBRMDNSWCAsI1NfX1whJy5MIVIkLipPOU4hLFtCIiBfX0EuN0RZVTNFO19eJEM3ICgwUCtAICoKLU1QLlggI00iTiAhIE4gJFFcICAgICAiPDA8QSNDSiRRXDwgKCAgIjwwQCgpLFtAIiRfX0EuN0RZVTNFO18KLU1fIyBOICBLIFtAIC4zRVkuPTRZNl9fQShVUCIkLCJYICJMI04gIFhOICRRXCAgICAgIjwwPEEjQ0okUVwKLU08ICggICI8MEAoKSxbQCIkX19BLjdEWVUzRTtfXiRDNyAoMF4rQCAuPCAgUCtAICpbWkMwS0AgMCtAISwKLU0/ICAgICAgRyQnKDBYWkEsPycgIiAgIEckKCIiMy5YIEEvX1gzRVkuPTRZNl9fUFArQCAqUC9QRyQtIk4KLU0gIFEuN0RZVTNFO19eJEM3ICgxXiAjWE4gIElSJC4uT1dKWCAjIiAnMydQICAgICApUSFSJC4uSDMnUVAKLU0gQCAgKVEiIEBEU04gKDNfXiRZPjNHNS41T19YMi08IEEiWE4gIEBAIVRRXCAgICAgIjwwPEEjQ0okUVwKLU08ICggICI8MEAoKSxbQCIkX19BLjdEWVUzRTtfWSRDNywvIEg7QCAoLiJQICBHWCA/ICErWyAgJj5AIFoKLU0rQCAuPCAgUCEiQCA4IjBPIVJcJTwgIFAlMlwgM0tEICAnTEAzXlwgIyJYICwjU19fXCEnLkwhUiQuKkcKLU00SDpcQSY3ODJIPUcpRE9MICA4SiFOLiVWXDRPIVRaWSAgIVtJRUEvK0AgUC8vX19QJDxaUCUqJjxBI0IKLU1JVjtELjQ4ICBEU04sLyNfWSRZPjNHNS41T19EMi08IF4iIU4gIEBeKiAgIj5AIVwgIzhOICBZI1ogICYKLU0+ICBYIVYgOD9AIF4kPj5PV0g0UC8vX19QJDxSUCcoMFhKXEohVSomTygxRVkkSiU5UFBQLy9fX1AkNFEKLU1AJkgmNEg4UTFAICIzLlggXi9fRDNFWS49NFk2X15BKFVQI1QoRlggIidQID5AIFoqMCAiNFg1Sy4lUSkKLU0rQEVQICMgTiAgWVgkKUIgWFg3OkFSKSUqQD1eICNYMVo6XVQkLjZOV0g4QCFXKDBYSkBSQCAqJyAgI18KLU1fUlAnNTRGU1E2Mz4oJlggJCMiJjMuWCBdL19IM0VZLj00WTZfXkEoVVMjQD9AIVwgIkFOICBBK1sgICYKLU0+QCBaK0AgLjgiME8hUlwlPCAgUCUyXCAzS0QgICdKSDNeXCAjIlggLCNTX19cIScuTCFSJC4qRzRIOVAKLU0gIyBMICAqXEAmNzIySD1HKURPTCAgOEohTi4lVlw0TyFUWlkgICFbSUVBLytAIFAvL19fUCQ8WlAlKiYKLU08QSNCSVY7RC40OCAgRFNOLC4jX1okWT4zRzUuNU9fRDItPFBeIkFOICBAXisgICI/ICBKK0AgMDJeUCAKLU0hR0AgLiJYICNHOCAtQD1AKSJcJStQMVAgIyA1K1AhLk4wICA+P0EvW1AgLCpAIFAvL19fUCQ0WlAnKDAKLU1YSlUyQUtSIzk9QSpBNjwsLCNTX19cISUuOCFKIUUqJi40OCAgRFNOLC9DX1kkWT4zRzUuNU9fRDItPFAKLU1cIkFOICBAWCsgICI/QCFcICRPTCAgOVogI0hOICBZUCAjICQqICFAKSJcJytQNVAgIyA1K1AhLk4wICAKLU0+UiEvW1AgLCtAIFAvL19fUCQ8WlAnKDBYSl0yQUtSJDk9QSpBVjxGMl5QICFCSCZYWDc7UTJcJzNLRCAKLU0gJ05GNiRcTiAjIFxfX18gMVNLIDRIOVIkLipPOU4wWTFAICIzLlhQXC9fRDNFWS49NFk2X11BKFVTQyAKLU0/QCxCO0AgKDJeRCAjJ1AsKzQ7X18tTyY4IDEzQVVFLTJJNUdeIjlOICBRKkFWVSAwPkQgIyQqTl9fMEAKLU0hXi4gRCpbX10iVSBfX0BKMiJQJ1k4OzxCIiBOX19BKVxQSCYoITQiQCAgIF9fXFhAIiA9PEEjQkojRSAKLU0gICk1S09fWE5cOUNXLi4nNSg8VzFQICIyRkwgIUY4SC4nUCAgM0lcICApQCNEJ0sgIDhRTF1AJlYvWTIKLU0zJTEtKCBRUiAjKEsgICpQQDY3RjRWTCAgQiBJICBBMkAnKCAsQkwgIE5GKUQoJEA7QCAwKCghIjpQICQKLU0zLlhYUC9fODNFWS49NFk2X15RKFVTI0A/ICBIO0AgKCtCWCAjJE9MICA5QCgiXCc8ICBQJTJcIDNLRCAKLU0gJ01ONCRcTiAjIFxfX18gMVNLIDxBI0JLVSomPCAgUCsgICJPKCFFVURKJzlSOStbICAmKkA7Q0E9TyUKLU0rUD0uTjAgID5aOTgzUlggLCNTX19cIScuTCEyQUcoMFhKXUZZI0UmICApLFtDI0BfXlEuN0RZVTNFO18KLU1cJEM3LCwgSDtAICgqRlggIyQnTCAgOEwiJyAgLCJQICBCISYsIyAqX0AqICAgI19fWCNcKVEhKDAjTSAKLU0gIDlQICMgTCAgKFIrMCAmTEcgKl9GOCguV1AgIDAgIjgiIFs/ICAiICApUCAjIEwgIChAMUMgUCJPWCIKLU1AICAgX19eIF8iPDAuVCAgIidYIC9CUCAgRTYnOlFTQ0FdWiYoJD1QICMgMCtQISg1NFpZICAhXzQlIS8KLU01OD5eQUYzSD9AIUAkJCpHMiU1Lk4wICA/VSEwM1dQMFdIOFArICAkMiwhXCQpIiZPSCFPWEMgTCAgMSgKLU1QKyInO1FIUCsgICQyLCIwQVAqICAgI19fUlwgMiU1Lk4wICA+XTEwM1QpTSAgMSxbQyMgX18hLjdEWVUKLU0gICEuNU9fUCwiWCAkRyggMkQhRyQiIU4gIFBCO0AgKCxNQTIwOykgOT9BLjdEWVUzRTtfXyJaLSpGWCAKLU0iJEE1M0tEICAjID42JFxKO09fXDNFWS49NFk2X1YgQ1tAICggICggMSJcTiAgUSg+ICBPMidEICBASz4KLU0yJ0QgIEBKVDImW184JFpZICAiKlwkX08gITEoO09dQDNLRCAgKFNANiRdLk4wICBDISEuN0RZVTNFO18KLU06JEM3Ly9QSjtAICgqIlggJSQpTl9fWE0zP19YMkgxTSJHW18rND9fXSYgICAvMSRBJCpOX18xQCAgI0oKLU0vN1AgIk9fUi83RCAgRzkuX15QXT4wICJCTSNfW0NVWSAgKFBTT19QKzdQICBHOTBfXiBNPyAgIkJNK18KLU1ZIlVcICAoUFQvX0gwSltfVSQqTl9dQSJLT188KzdQICBHOVZfXEBNPyAgIkg9O19TIlVcICApViIvXzAKLU0oIDEyQCZIIjVII0RAJTIgLzQjX1FGICAgKSBdPyAgIl9fKF0+MCAiPUJTX1sjVVkgIClWRk9fTi83RCAKLU0gQE00X18gTT8gICI9QltfWCJVXCAgKVZHL19EKzdQICBATTZfXkBNPyAgIj1DQ19SIlVcICAqKThPXywKLU0rN1AgIEMiMF9dIE0/ICAiPUQzX1UiVVwgICoqJk9fOCs3UCAgQyJQX11QQCElKiA6QDFeI10iJ1ooITQKLU1AI1UgX1w5QCUiIE4gIFFeIEsiJzlQI18jR1gqTCg9RyAvXVQrIlggJCQnTl9eUE4iJCdOX1tASiIkJ04KLU1fXlE8MiJAKCgkPVAgIyAwKEA5LDAhICAoJDRQQCIhJzwgIFAkJFEgOCA5NEE1MidPSDFFV0dYIis0P18KLU1NJ0AkMD85KE4iQCg4IFBAMSRJMDlAUTNLT15UNTgxKktPXlQ7LlkqQUZcUitQOVAgIyBOX1tQTyAnICAKLU0sIltfTkJcIDwgIFArT15YK1AhKD4wICIiTjEuTjAgIEJKIEA7QCA4P0AkQEFWICAhNzhcKzAgIjA+W18KLU1OIlgoMD5bX1IiSCgwPltfTiVRKCogQEAxVyAgLCEgQDEyITAwPyAqICIpJzwgIFAkMiklKEUlI1wwSCAKLU0sIkQgIEkhMFckITRBVUIlT0gxRVUrUU5fXDlEISNVJl9cOlw1NigoKCZYICYiIi04JyFYICNAJiEoMCAKLU0gICQgWFhQJkEgICAgQDhPISRaWSAgIE8iJUEvKiAhRiJCIU4gIUEiRCYgICEvKEA7QCA4KCgxUCAjIE0KLU0gIChPICRBTSAgOEA7QCA4KCEhPEAiXCAzS0QgICgiUDNeXCAjIiFOICFAQDQjJU0gICggIEIhTiAhQEAKLU00IyVNICAwICEiIU4gIUBKNCNKJjBKW19QJEpOX1sxSyAgMSY8ICBQK09fUis0I19EJyAgLCJbX1FCVSAKLU1fWiEhW09fQCs0Q19GJD9OX1tBJVtPXygwPltfVSJVKF9ZMSo0VjwgIF9BUCAjIDMoJShQLCBIIiBIICAKLU0gL19fPEAgUiRSITIsQyA6ICAqISAgI19fWSIhKzQjX0wnICAsIlQgIEJVIF9aUSpLT19UOyJRQC5DIE0KLU0gIDEoUCQyIDpAMV4jXSInWiggTTAvX1Q4IjBQKzAgJDIsISRAJkgiNUgjREAiVSBfXzFAJCIgTl9ZIV4KLU0gSyInOVxRXiJLIic5XVAsO0AgIl9fKUYqRyAgLCEsQDtPXjQoJSEhXCBIICwhIzE7T19ePCAgUCRSIU4KLU1fWTBANCQnUCJAIFAkLkUoVDZUICEgUk4gICAgID9eUDlVUCxLQCAgICAnX0smPUYoIltfRCdYIkwoPUcKLU0gICMwP0BKUEFWPCAgLFlAICAjMDwgIFAkUlwgMiU1Lk4wICA/QDEwM1YgICBRMSJJVyAgLCEsQDtPXjgKLU0oJSEhXCBIIDwgIFAkIlwgMiU1Lk4wICA/OUEvW1AgLDggICJbQiBOX1khXiBLIic5XSFeIksiJzlbOUAKLU0gICs6LyJUICFCXE5fWyFQICMgMyglKFAsIEggIEggICAvX18oJltfRiIhMDInICogJEFNICA5Lk4wICAKLU1AKyEvW1AgLC5WW19MQCAiKCJbX0QnWCJMKD1HJydYKkwoPUYgICoyPCAgUCFCXCAyJTUuTjAgID8xOTAKLU0zViAgIEdZIklXICAsIDhPICRBNTNLRCAgJ1Y4M15cICMmICAgRjkiO09eSjggOF0/IjwwX1pIQCtPXkwKLU1MKltfTCY0JCgiW19MJTogRDZbX0pCQE5fWlM4S09eUDA/NSohRClIX19YTCElNiY6UCAhTScgICwiW18KLU1fQihOX18yMkAiVSFfWVBWISIwTl9aUTNAQkAmWFgwTiFJWk5fWyEyQVJIIjwgIFAkUiEyLCMgKiAgKiAKLU0gICNfX1JBTl9ZQEg1JEdUIkAiXEBGUCIqQDkqQVZQICAtKV4gJiAgICxRKDtPXkQoIDowQTRBVCJAISgKLU09N0gmRkg9MkEwKiUgICNfX1JcJTNLRCAgJ0MuM15cICQkSU5fWkFHJiQnVTIgOSg6ICAkPCAgUCtPXkgKLU0rUCEuTjAgID5EITAzVElOX1o5RyAgIjIwPzUoIURBSCAgKVAgIyBOX1o4TyAkWlkgICFaMCUhLzgnOSgKLU07T15EKCA6MEE0QVQiQCEoPTdIJkZIPTJBMColICAjX19SXCUzS0QgICdFKDNeXCAkJElOX1pBRyYkJ1UKLU0yIDkoOiAgJDwgIFArT15IK1AhLk4wICA+RlEwM1RJTl9aOUcrJCdVMiA5KDogICI8ICBQK09eRitQIS4KLU1OMCAgPkZRMDNWIDIoIltfRCcoIkwoJUcgL1xMPEBKUEA2PioyPzUoIUNCTl9aMF4gVyAgLCAtIV0wSCYKLU0yRkNfX0Y4JC9ALTMxW1lOX1w5QyMnICAsID4wS09eQC5AIUAgR0ggKCJbX1ArIk5fWzFGMCJYJjUoPVAKLU0gIyAlT0ghQi0jIEwgICpQO09eSjhCSVAgIyBMICApUiAjKDRAKCVHJyNIJzJKW19dJlQmT0pbX0cmWC4KLU08ICBQITAhVSAgJCohQ1AlOCBRM0FFNiQySDlKIC9ZTD8gIEArT15MVCpbX0wjTSAgIClQICMgTSAgKSEKLU1dMEgmMkZDX19GOCg0VlQgIEYgIjREOVAgIyAmMD80KiFCWCgyRSFHXCRJJjlUKVggI0AmPCAgUCswICIKLU1EKDBPICJcJzImVCAhRFpZICAiIEwkX08gIFI9OzAgIigiW19EJ1giTCg9RyInWCpMKD1HIiYgLiggM0kKLU1CJiAkKCAzRUItJU0gIDEyS09fIDUkTThLT140NiRJOEtPXjgoIltfUCsiTl9bMU8gL09KKCJbX14rIi0KLU05VShAMCMgTSAgKlA0JikoKCZbX14jJU0gICggIEIhTl9fQFE7MCAkICAxUCAjIE0gIChPICRBTSAgOEAKLU0rT19YNyggTyAkWlkgICIgTCRfTyAgUEA7QCA4K1EhLk4wICBALSk4M1IhTiAhQEBLT19YMy5YXF8vXUgKLU0zRVkuPTAgIDNFO11SJEM3LC4gTCtAICwrN0QgIEssXF9fMV4gMlUnX19ATTFPX1wyJltdVyRBTl8+ISgKLU07T19UK1JYICIkWlkgICFSVSIhTiAhMEBLT1dEKkZYICQiSE4gIUBAK09XQD9ANlBBVilcLCNMKiFEW1sKLU0gICggK0AgLCAgUCAxQCE4ICVAQCtPV0hUKDhKQCRKJjtVOStbT1dMKiQ1IV1GREBfPlBOIiFDPU5cPUUKLU1eRiEgP0AkSkFUSiY7U0BKMTJBJlY8NDpfICBQTlxRRV4mIEgwSTROLjAgIiJSQVIiK1IhOzBRXCImICoKLU0wSTROLjAgIiJSMVwgUkknKiQ3PkFBQz1OXD1FXkIhJTBDIUggIiAlMy5YUFgvVygzRVkuPTRZNl88USgKLU1VUiNAKyJYICMiVVkgICpTLy9fVDBKW19eIlUmX19RKDtPVzwyJltdWCRBTl9fME8rQCAoM0tEICAnKzQKLU0oJlggJSIiTl8+MEorQCA4K0JYICQiIE5fPiFSITsiIThAICBHQyBbIkA5Ll5QICIgJDAgIyAgLCAnICAKLU1CQCIqMkg5TSMiIScoIltfXCkiJigoIUAhQiEnKCpbX1wnWCAyXltdWyJQJTggQEAxQSI9NEg9MkFLWk4KLU1fXyFNXEIhJVQ+W19cJCgwOCUgQDFUKjAoJDQwTyAgUC5HUCAgO1ItO1ExXiA9WiVXKDRAMVEiXCAjITIKLU0zNSonT0g5RVxEKFU2ICFAKSIhJzBJIV4iK1InOyBASi8gICIiU0VAJEJIXCAgKCsvNiAqKCQ9IkQiSFwKLU0gICgrMUIgJTMuWEBYL1csM0VZLj00WTZfPVBNPjAgIkxTU19dJyghKzQnX14iVU4gIFNfXyRBTl89USgKLU07T1dAMiZbX10iXE4gIEEuTjAgIDxNMS9bUCAwK1JYICUiXE4gISEoO09XQCtSWCAjJFpZICAhQ1YiIE4KLU0gITEuN0RZVSAgICAgJFtZICAgRlgkQVggIC0uMCY3UjNHNS41T19cK0g9IVtAICwrQEBQLjAgIiBMICgKLU0gICAhOUFIUC4wICIgTCAoICAgKDlQSCA+MCAiICAoIlAmICQ8L11AJERBWSAgKCJMIlwnK1JYICIkWlkKLU0gICBdWCJYTl9fUS43RFlVICAgICAkWTZfXkBNPydfX19fX19bIlVOICBDX1wiVU5fXyNfXSNVXCAkK18KLU1fJEFOX15RKDtAIDArUlggIyRaWSAgIF1YIiFOX18hIiQiIE4gIEEuN0RZVSAgIS5eMCAgKU4hKD4gICUKLU0zRCFFXERZVShGXCAhIiFPICBAQCtQICw7VFBCIjkqKDsgICAhJDIhTEghTSAgISQsQEAoIDAgIDlQMDIKLU1WJS4gKEBEKCAwICA5QVhCIC4yKDggKEJWJScoX19RIjAlLiA5LzBAIDAqICAgICAgViAiJE1BMVIvX1wKLU0wRCEzQCYzVCgiXCAhJFlVTFxBTiUmICIkTUExUi9fXDBEITNAJjNUKCJcICEkWVVUPCMzUCYgIiRSITEKLU1SL19cMEQhM0AmM1QoIlwgISRZVSgmXCAhIilPICBAQCInK18yQUE3Uj9fXDlAI19eJS4oPE9cMFY1PykKLU1fX1FGIC9fWDNHNCAgIiFPICAwQjtQICgoIEFSX1EjOTVcR19fJjggX19BLj00WTZfX1BOQVQqRzInQCAKLU0hRFpZICAiLTQlIS8rQCFHJCJcJzInQCAhRFpZICAiLTQlIS84IUEyTjAgIiJUUCxOMCAgICAkICBATSwKLU05QDkuTjAgIClPISg+ICAmM0tEICAoVSYrUCEuTjAgIEM+WTAzUlhOX19RLjdEWVUgICAgICRZNl9fMSgKLU1VUyIgKkdEICBAICAySFVHJyJBTiAgQSpFNjw0K1FVKDUkWlkgICIsSkUhLytAIUdbIiAnOCApUCAkU04KLU0sKCNfXSRZPjNHNS41T19UKCZYICMiKU4gIEAyJisoMTlASCwmMCBdOU8wQCImIDIyQSVGIyBQSCAjV18KLU1fVjgkKCBBQCBHICAzRVkuPTAgICAgIS41QCAgMidEICBAKyQzS0QgICI+NDYkXE8rQCAoM0tEICAoV1gKLU02JF0uN0RZVSAgICAgICAgM0U7X1wiWi0oJlggIyIpTiAgQEoyJiAoJCE2UCQ2PCY0RFUqJTY7VDJBNUcKLU0hIiApOCA5KiY2O0Q8ICBKO09fUDNFWS49MCAgICAhLl4wICApTiEoPiAgNDNEIUVcRFlVM0U7X1ckQzcKLU0sKCBOK0AgKCs2WCAjL19UKCA/RUAiSSAhSCAgIEpdLCokIE01L19YVl9QICBKXywrNTdfXyRBTl9eQSgKLU07T19UK1A9Lk4wICAtWiEvW1AgLDJIIUswIiBOX19CUEtPX0w5QEhAK09fXEwqW19cJjxQKzZbX1svX1gKLU0qKltfXiIgTl9fIVJeXCIhKzQjX18iSk5fX1EiSVRBTl9fME8hVFpZICAgV0gkSiA7IDFQX1YgJCgiW18KLU1aJFNOLCgjX1ckWT4zRzUuXjAgIClOISg+ICBFM0QhRVxEWVUzRTtfViRDNywgIEg7QCAoMl5bX1gkSiwKLU05UjEqJSY8QCpIUSg1JFpZICAhMEQlQS8qVCAgISUhLSpLUCAgSilMPEAoSzAwICQ0JFRALjAgIiAkMlAKLU1OMCAiSF8hRCRCIFkgICggMSQnWSAgKkJBIkFQIyAhQCFCQVwgICpCO1JKLCtRNS5OMCAgNCkhODNSTSAKLU0gIDEwMzJKXCAgKkI/NyghKlQkICEkJ05fXiBAIzkiKFlIITJAIlwgMiZbX1gkQVggICkuTjAgIENKOSwKLU1bQyAgX11BLjdEWVUgICAgICAgIDNPRCAgIjtAMidAID40WSA5PykuPTAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAkIEgoUkUtOFcpVCwyWVMoIyROLUIgWC4iXFAsQlxQLiIhIztXIVkKLU08QiBRLjNAVSglLVU7QiEtOjYtUjtQICAgICAiICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhRCAgICAhICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhSTtHLUU8RzBaKCYpQTkiIUIKLU07Jl1DOlIhUzo3SUUoIkBFOSJEQDg3MEApMi1YIkAhQjsmXUM6Vy1JPkY0XSwiIUE9IiBFKFdAKiAmKUwKLU07Vi1LPFZFWjkzVFAoJiVUKCI0Qz4gSCA5RylFOTNIQDo2UUw5Nj1BOyIhQTkmMVI5Ny1TKCJARShXQEkKLU0iQCFGPEY1RS5CIUI4NjBAOEZRTzhWTEA8VkVaOTIgSCk2MEkoJiVUKCI0Qz4gSCA5RylFOTNIQDhGUU8KLU04Vk1TKCI0Qz4iUEApMi1YKCZdVjk3KUw4NyAqICY5Ujk2NFooJilMO1YtSygiNEM+IiFXODcsQDg2UVIKLU05NiVEPjIhRjxGNUUiQCFGPEY1RS5CIUI7Jl1DOlIgRShXQEA9ViVTKCYlTDxGNUE5J0RAOUcpRTkwSCAKLU08RjVBOyZRTzhTSEA6NlFMOTY9QTsiIUE5JjFSOTctUygiQEUoV0BJIkAhUjk2JUw7Jl1DLkIhQjg2MEAKLU04RlFPOFZMQDxWRVo5MiBIKTYwSSgmJVQoIjRDPiBIIDxGNUE7JlFPOFNIQDhGJUQoJilMO1YtSzxWRVoKLU05MkBFOSJEQDg3MEApMi1YIkAhUjk2JUw7Jl1DLkIhQjg2MEA4RlFPOFZMQDxWRVo5MiBIKTYwSSgmJVQKLU0oIjRDPiBIIDxGNUE7JlFPOFNIQDhGUU84VkxAKTItWCgnLVQ8RiVEOSZRRTxSIUY8RjVFKCYpTDtWLUsKLU0oJilPPTZZRDg3KVkiQCFHOTcxRjxGNUU6JjFSLkIhTz03MEA7VjhAOzY1TTtXKVkgICAgIEpWTCAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAiIDAgICAgICAKLU0gICAgICAgICAgICAgICAgICA4IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgIEstLCAgICAgICAiITowICBANksgICglTyAgIiE2LCAgQDVPICAoJUBAICIKLU0hOFggICAgICAiVCAqUCBAICMhWCAjITggIlQgKlAgQCAiVCAqUCBAICJUICpQIEAgIyBRLEMsVC0zOFcKLU0uI0RQICIsQCpSVE4sIyRSLFMwVS1DPFguNkEsKSAgUCwzKFMtIzRWLVNAWSwgIEMoIkxNK0MgUSxDLFQKLU0tMzhXLiNFSCkgICAgICAgKiZZVTsmUEkgIyBRLEMsVC0zOFcuI0VBOEYtRDk2OCAsIyRSLFMwVS1DPFgKLU0uNCUiMFQxJTFAICAgICAgICAgICAgICAgICAgICAgICgiIEAoIiBAKCIgQCoiQEgqIkBAKCIgQCgiIEAKLU0oIiBAKCIgQCgiIEAoIiIoJCEgMCQhIDAkISAwJCEgMCQhIDAxJDEkMSQxJDEkMSQxISAwJCEgMCQhISEKLU0wNCUhMDQkISAwJCEgMCQhIDAkISAwJCEgMCQhIDAkISAxIDAkISAwJCQpIjBEKSIwQCgiIEAoIiBAKCIKLU0gQCgiIEAoIiBAKCIgQCgiJCEgMCQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAhIEAsJCEwOCciIEQqIlBQLSNAXDAkMSgzJSE0NiVRQDkmQUw8JzFYPygiJEIoUjBFKUI8SCoySEsKLU0rIlROK1MgUSxDLFQtMzhXLiNEWi5TUF0vQ10gODYpQzkmNUY5VkFJOkZNTDs2WU88JyVSPFcxVT1HPVgKLU0+N0k7NyVVPjdWISEwRC0kMTQ5JzIkRSoyVFEtM0RdMDQ1KTM1JTU2NVVBOTZHTVw/N1lfICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgISAgKCojICAiIkBYICBASC8gICgqJCAgIiJBJCAgQEgyICAoKiRQICIiQTAgIEBINSAgKCoKLU0lR11fP1ddXz9XXV8gICgoJSAgICAgICAgICAgICAgICAiXCArUCBPICRRIzdVMSkzNDQgMyQlLjFURS4KLU0xRFwgMyQtPzBUXSwzJCU0MTAhLDBVXS0xNS0zMDQ9JTRQISwwVV0jNSVFMDEwISwwVV0uNTRVJTRERSMKLU0gICEsMFVdLTNUWSU1JCUyNjAgIDMkJS4xUCEsMFVdRDk2OUE9NlFUICQsICtWNVQ4Ul1MO1YtQTsmNE8KLU0gIlwgK1c1UzxCXVM6JiVSOTJdTDo2KE87Jl1DODZRRStQIE8gIllDOjAhKjg2WCoxRjVCIkRVQTxASSEKLU08JygqMzYlWSJESVU7QEkqPTZQKjA3NUciRS1FPCBJLzhXMCozRl1WIkQxRThQSSo4NllVODcpWSJEOUUKLU04RylVODcpWSJEVUE8Ri1IIkQlUDxGRUwiRFVBPjBJKj02WUUiRElVOydEKjA3NUc9Ny1UIkUtRTwnMUUKLU07NilFPEBJLzhXMU84RjVSIkRZTz1GNU04RjVSIkQxRThWNU04RjVSICUtVTtASS07VlgqNSc1RSJFPUUKLU05IEk0Oic0KjFHKUkiRS1BPSBJMz02WUQ4N0QqMzZdTjkmJVkiRTFVOTctRDg3RCo1VjVEO0Y1UzkmJVkKLU0iRTFIPTcpUzkmJVkiRDlSOjYxQT4wSTM4NzFVPEYxQT4wIEUyI0hFMzNIRTRQSEU7MlxFOSJcRT4wSEUKLU04MiBFOEIgRTkyIEU1IiBFNkIgRTYwSSEzMEkwMzBIRTAyUEApNChAKTY0TCgiNTkiQCEjICYxRTlGJVUKLU07JzAgMFAhWTk3LCA7RlwgICAgICtAICAgICAgICAgICAgICAgICAgICAgIiJCMCAgQEhIM0YlLiAkRU4KLU05RkVOOjcxWSAgICAgICAiIkQwICBASS0gICgqNDAgICAgISk7RjlJO0ZFVD4wISk7RjggM0YlLiAgICAKLU0gICAgICAgQDhGRU44NylZKCY1WDwmXU45NllUKCI1RCggIEA4RkVOODcpWSgmNVg8Jl1OOTZZVCgiNUQKLU0oICBAOSY1Qzo2VUE7IiFFPichTztGNU49IiBFOSIgICgmMUU4VkVNODZQQDk3QVA7VllFO0cwQCk2MEAKLU0gICAgKCZRSThGLEA4RiVTOTIhQztWWVY5NylTOjZdTigmOUk7JjRAKTcsQDsmRU45MiBFOSNIQCk3LCAKLU03VUE4K0YsICJCIT89JkVNOTctPzwmXVc5NyhAOUYlSTsmNUQoJjFVOTIhVDtSIUU+JyFPO0Y1Tj0iIEUKLU05IiBFOSIgRTkiIUw5NjlUO1c5RTxDSEApNjBAIkAgICAgICIiUlAgIEBMUDNGJS4gJEVOOUZFTjo3MVkKLU0gJEVOOUAhKTtGOUk7RkVUPjAhLjg0WCAgICAgICAgICAgICAgIDNMICAlQSAmPlAiQUsyID4nIFQgNVMKLU0uXUwyK0NeQ0dZV0I4Oys8WEJJQyErUjQpTTY7ODcgRUVMK0M9O0Q0IlJQQSdRVUo4K0AzLloqKVRHVVMKLU04Lyc3V1w7KldSTCY6ODxXKStAJls2OjM7Tkw5Mj1NT0RYViI9NVlURkM7JTtLPFEtSSEiUTxASD44WEQKLU1LQFs+QSwkO0RcLUdQNT8jUlo7V005I0BbQlBWMy1GUjdQVDBFTTE9TCs9WFQmLCY5MlBSRkkkTD47NlIKLU0yMyQgX0IkSFJRJk85JzpEWDQ4IChQRVc0UVcuICQ1V0NMKz5LPFwiKz8yJUJJQFc8WDVbPjxaNEJJUDYKLU1ZSSczTSxULVgkLC43NFBeXl9FNF5NUj0qPkw5QjJGT0c/MUg/J1dVPkReJ0QwKUVfSUs9NC48M1JPMDUKLU0nOSpLOiYqREAmQUM0JDZTMjVNUCosV1ErUVYwRFQsPjIwIkJXQjgwUEQhSiUgUDRHTyJeO1RAIVJcIiMKLU0wNVteWCZDXV8mOkIwXCJaKUomWV0+OVsrVkpdJEVUTS8/SkFOMjwsUUAjPSgwIzBfNjtBPk8mP185WlcKLU1PUFcwVDUjXy5LMDZHPS4xLiRPNkkuM1QwM19OITkoSC07XTRDU1lYJ11ZMzJMK1xRTSxJIS8hSl8yQUEKLU0tO0w2NiBcPjknOTVMVjBPTjk+MVdIXVElIjpeSSpfXSFCOTJSNzE5UyU1IykvNFM0O1xCQSYvJzkpIksKLU04TzAlIC1SKywyQl48SVEzSlM0QyBDUkpcU10nSiFIITMoRk5SPjZDR01TK1gnXjEsSlVcIT1XUUsjNjAKLU0nTiYqTV0jWTYgUywlNjtFKj4gIkczRU4wVTEtLCBVXFJAJUYoO1ksID1MOSckJDRGXCxBVCoyJTdIIFsKLU1EUStfM1dIL0E0QlYyLiIxM1NBVUxGXyY0UCVYPDlWVUsqMEAgSFU9WSYoKiNKXiooRlggOzQ7MCc2JlsKLU0wPiheRElTNUFQSDEoVTE4QjYvISpAUSpDUU08IiguQVNBODM5RV0mMjwxMEVMNC0+PlpbNDQ+S1k3IkIKLU0sWVw+WjxdIyQ4Ml1WJCwqQj4kMkVcIDZKPz9LJUE7LD4yPTdTWVtIVUgsICMpRiE8J1UsNCJUOV5AXy0KLU07UzhUWUJFPEBAPyJXSVUnMyUrOUBdJy0wXD9KIk1ZK0VBPz1EMzcxPkBPSCE7NzlLPEJJMUcvMkw0NiYKLU1ATj8mQCs6IUteT0MhRkY9N09CUlEqPjRdSlEgUCJXV0xcXDpBO0NRIFVKSksmNFEmXk1SViZcKFUkVysKLU1NPlFeXU80PjE8SiwmUkFESEcsVjQgOlNCKCEhOjMxKTA9RVUvLV0yVEdaWS9KO0xJKlUpKUEzTztOQTUKLU1KN0M9ODtVOS44UUI9LzY7MFUjOTcpUVoxTSQhQzwqODpeS0suJis6RS1YSVsoSjBGSzxfKT8vKiZaWUsKLU06LC9OSFhGV0xaSlsjWF9bUy0nSztBVCM6WjhKWSE9JzpCKj1MTixKRlhZXDQ8PyNbXz8kNVZGKT9VN1UKLU1YWiVLSVlTSyI+QFteTFxOP1U8QDlKTUkmTkgwIilIVSM1QFdFX0NEWTRIQklWW0NKJTlOPSwrKkslO0YKLU0jVlguJFM4WC4xKVM4Tzc3NSdCWlktTVMtNTQqID8hOEZFIzpdR0lSRFoxQzE5QTxaWkMuIiU+QFJeSEQKLU1OQi4yUFhDQjBDJzAwO0onJVUjTjMsRVA5L0c8Tj5dSUA9IzdWXDEtQk1aVzZESS4uRjo0JSRAVDJMPFEKLU06IlslJ0NQXjJeIVYlQ1UyWyJVJi9AU0JDR0dWLV4jSihJUEIhLjg0LjYzQE0qNk82Kz1cOjhHSkkwXl4KLU1PTV9BICA7OV5NOEpOXFdJV1FKWUJDJk5fTEssX0QyTUxKIj06JCtENjwgPlJORlUpPFpbQUo8MUEkT0YKLU1YOVEnQFknVSlDKTAnPjUqMkoyIlpXOlwuNV81J0tEX1RGX0hWPlw7I0QtQkZZMj1KIFEqKUQpUUMiPUsKLU0/LShKOzAiTilOIVVJSTNSKVNJSV1NUTxHXj5YIkk4PjlXRF1VTDQ8WFFbMVg2XD1BUUROQS00TTFBTEYKLU0pMk9cI15PRjopIygjMStCPU4kQTopVkE/LlomIypGTlk7Qk04NCYlJVRDUTsuTDdSVCJHOz84QEsvJkAKLU1fMjBLNEw5OTIyKy9XXUpEWlIiUTQ1L18uTD8oIDUrUCNHITk+Ry9OQ1c3VVw9QEFMKS4sXj8hLDFJTVMKLU0xVjs6NDdcNDwgLk5TJFwlLDFQITAhPTtVVlVCOy02OSZYXjU8RkMuIEdOJVlUSyskKjowJUFOWS5BWk4KLU0qT0tFUV5CUkQlNTYgXjtPSFlJMC5QLU1RSE4yTkk7NkpaRl1MLURfKzs/KiYtUTBUI0UnQz4yNkVHIVQKLU1UTks6SzFKViEkSz5cSk8tOENLU1tERDNNVUJNLjotKTBbRUw+NCRXPSoyTjU9IC0rOl1TV1ZOWTpGNEQKLU1bSSlUPjAgVl8gLUwhPiAgITs9Uj0pUVQwPEZGRF5BMi5eKSBOQT1eSyBFKk5XKFxQVl83UDpcMk5GIlIKLU1HUC5YQVInTClESiEkRVwvWiRaL1VMLE9EKCFEOzI/IiEhL0AjTV8jKSEyUCM5RTNOR14kXD5UWEJDVUwKLU0qNjtZIzIgK1gvRiteWE9RVSk0SCpOOD9NNSw8XC5CPFchNTNLNEtBR0cqJjdHXiNPRVApUyBGQ0UmW1wKLU07LjUoTFg4Uj48XUlcXEhAMCNfRSMxO1g6SEUsI0dHVzhIUzlUWjQrJTNZITQ+Sz9XKy8mUlA5TjEsJyEKLU00WFI9Oi1ERUsxLkc0QCYuX1stUUxIVDVZMC85PzMkPjxWJF9bWFVSOyRRJCEkPiAtQC0uOEZJTyBTTC8KLU1WSig4M1E/KUkgMFpHRTUySig9XTQkSktVLj4pQT1HOE1AIiErUDxeTT03XSpKKlhLXjwoLFAsIFtdXFUKLU03QF5GOSRSLjJFJkdCIi4+TDBQUT1DPzw3LTwvQ19WQDctVltWTl9JS14pWlYyK1gtKE8kJzIuTSFEOVIKLU04VCVPU0JdRUBGSSJeXCA/KihTLV9YTSc8MUg/WSVMKkIvVCNZTVxOPkNYUiFTRFVAJERBUk9LSz0oJSAKLU0tMyokKlAuW1U8SVgoOj8pJyxfUCVdQyFVIz9FVCc2Ui4mVUpdUEdEWyxYQi8mSV80NEVRXSJHWjpWNSoKLU0yRS0rIklPKUxDNi8xWCddV08mWzxZRVVVKSMuUF9JJS9fUFs4VTRBPVo6QkhNSUJHKTUxWS9GMF0rPDIKLU1IPjxQSSojUU1GQi1ATi40JklDTUMwVldJKTApSCUkNzEkXEdTI05GLVtJRCI+LDlYREwoRzFES0RDPFAKLU09Pjc9QEA1IE8zO1clS1EgRD42PD5VJy1fREhQUUA+VkMlJlAkXTJcVjU/KDZAJ1spTE5NNVpIIUImQVQKLU1KIyRONSNANF1cSFwjQ0ZUO19aQVYwPlZUVkkiRUw6VlktODUlRDNeVzJbME48RyMoR0slXFZMN1lHWVsKLU1bQE8/LldEJyE3PyFcSjlcVyJSMTMjXlRUPD0yXjE7KSxBSSE7XDJLLClXUDtFJUsuKykmNUs0Rjw5SFoKLU0pSD46TjlcSEVMNkAqNl8oQCI5MlhSJU9dQlM+LVA9XjNBJEUxIkRaSlgvJU1ZO0lcO1ZYQF5NLFwvLFQKLU0yLk1URlFWMSsiVTRPQkchVkhFUUpMWyBeVypMPiQkMVdQMklKRiY2XCQwKCZAXDwwJkxTOVI6QyYhRkYKLU05NEtUTFRFOlRRIVYiME8iWSE3VzYnOjpCK0EsMkMrQFJDTzQ7IjUnI18oTk4yWTtMOV1WMFlGNkddQEIKLU1aRi4jWCsnLScuK0k3TkE+NkZIXD8lWzsjKz8wTEpcVygtIDcgKjJBICs1JllbS09OPERYNDhCIjAqLVgKLU1KVCJZPTQxOVZGMChOLUMsRClTKjE1PkxEQ1A8WyBNUVg7VF1YPyAnQkc7US44MjQ0Plo8QUdYTzdGNisKLU0pWSU1KkkgXl5RPyEkIi1TNSA9MCgyWU0lSS81Ny9bVEswNTUmN0Y7KFsuW1pKVERATD0ySD8kRkE6WS0KLU01XVtcPiNUPScwI1AzMSgyNkhKJFcyJSZQKi9CISghXzBZTz5ZJlhYOkonTkY4VUdaN1pOLFZbPlVPSFAKLU1ZLlhcIzsrJjtZNCFVJz9WX0UjN0wzQEdcQFMmODorPjBXS0MxWElePCxKXkBCT1YoPjojPSJFUURbXiEKLU0kK0lZMyNNPVsnNERJN1QzUSRHTyFGIUxBVy5UTio3I1QqLVw/KThbRyg7T1UkSTw9M1E7TEBYQDMxTEQKLU0/VktMNy4/MURJKFlZVkI0XSohOUwmIEIlPEU4QU1WLlFDX0g7MjQ9JChEPFVCS102UzpNJFFLMkJdLEAKLU1CVzBKK0ZANyEvPyEmNjIwVEYpWVJDSScgWkVVR11EIFk1VSNBSSM5QidIRiQ2JEFMUSYmKSpDODYjPDcKLU05X1Q4MD9bJk8kPSBdUyQzSiw7XkslJjdBOF0zUiwsQjhDMi5XIllfIi8gJ0JaO1c8KSQ2UTxcNjZJMFcKLU1bIUspQVpFKV5MQ1xAPidVTTtCLVg6WjMlVUMyS1ggPjInPVdPJC84PUBNJVBXXDlKWVpOMSpCOlZHPDsKLU1TSlcpIDExIjxEUyNaNDYzOCM1LF4xTSBETEEhNzlHKFI5UEdEVCI4VU5WUTVZRTIqUjYrXzQnNy0kNloKLU0yXTcxRE8mPTYjQFZdREU7SDtBUVslSltOOklCKFErMClSIiErME9VUVA4W1U1PiYkXV8pI1xMMjUnPzIKLU1JLVU5NCQ3Nj8zMzBHP0A3KU4xIiAhKyZbMV1fQkpIXVk8Sj8nNz0wKjZTKE9UUT9PLlpfTTpKKD5CPEAKLU1bUjwpQTRCTFgiK0knNjo6PyNJMFUtIlVfI1kwKUBFWUhJJ0E3Ty44TlFUIENINVwlNkZcSD0gWSw3PjEKLU1VKzw1ICkjLiZIR1MsUE5CMz9HLioiKUdCUytUWzItW0YkW1oqUFA3UydGNU1SXj8gQy9VQD4kV0tDNV4KLU0tVjpMRFRIWipMRkRXQE1AW0tBMiNLOUxLXyRVVykxQFtMLCs6LSo2NUU+VlFYTUs5WjtHK1FHRUU4UjwKLU1TODApTCFGPkFPPSgpQzI4MEkiUEBVUkQrMVZCJkYxSVwsO1sxPSYlRUpBKFkjNi1bVTpcREY0ICI3LCEKLU0pIDZMRCZBJFs6WVw5VyZCOE9OLDZFJUwnVk0lLzY1JyxeQV8iMV5eUUU+T0lDUCEpJU9cWjFWXDgrUVMKLU1ZMzNTUUsiTTlbTzNZLFZGLy5cNF5dVE5USjxGUlxaR1IsXEdUX1kvL0IpIDVUN09JP0Q+LVAjS1VPNDsKLU0nLklCQVZWNE1PWldBIiZBKFc6IzI9JCFCJyogUic9XUAhMkpAU0lbMTZfPzxTICpcT1UkVkI3KD5cT1YKLU1cLCkmR0VUOSBFN1U9V0xSX0JBOT8qICw5IzRWTFIqVFcyQ0AuW1UmJjQyIFw1Oz9DWTY4TDVSNS8kOysKLU08MDgpKUkvWSpGOV03US1bVk5JRUAiLFtMUig4NyswSUw0LSk+RjhfUSZJMllcLUssRVdfKiE8RVEsXksKLU0/WjAzLlY0M1k6IS1bQCZHODJUIi1SJFtFJlIwPyBAKk5XX084ODxOSkxJTkEpV05JPTEgW1wmTkgsPV8KLU1TMVIvQChSPj8tVV5EKTkzPTU+OllSX09UJjgrUkZGUFMjWDBEMEZFLDJfPz4hNkNaKSs/T1xDNCQwXycKLU1eTztYSVdfQE5RNzlEIEwsRUkgLihIK0VWPDhQNUNAKzBfTFY+JihKIFFdUDpUVV4/ICQ/OTdIQlklQU4KLU1JKE81R1kyJFRRWiRaQEZfNDRcU1teUjcxR1Y1JUZKXDZfM05BNDlDSEUxKzwlKzUxWywwMThUQ0MzT1YKLU1CQDI6JD4rQCsyRlhfKyAvKVtWWUEwQlpdMlNHM0U/SjdSKTEwOy5bVyEyO0ZAT1NWUllIVjwmPUxFO1UKLU02SzoxWTYvW0sqPlsuIilbQSU4STgnMyVZQyc5IV8wXiM9MVA+WyssS0NFVzVVVTxOTCpcM1kyPkxaRzYKLU1JWjZYREUtRzI/SFNHIFReIDtRWTFORiI4N0k8TUlHQT4pPCU4WFArKiZTP1hIQV1USU0/OlE/IiYzJ0YKLU1GUF8zIkIqM15EUlEoRztIJFVKSyxeQyQ5VUopSzFCJClISSxFRCo7KVc2R1pTLEhfQSRNWk5MNEdcVEAKLU0/PFZeQSxDSlwlVCdfJ0RKLFM6IUhRNy1AXUhWMyZFUzVQPztbOVpUIzJaLTBHREJdIUFQSlQpVkk+TVgKLU04N1dEK048T1YjW0JdRkE5KDUuLyw/P14tMFAzIEhATF5dISNGSkYlRSIgXV1OPikjMj8qWTVMQkhPOlYKLU1LNDUyVTstKj5EKlQ9TFgoUy89OStFRE4tJ0Q0XUJUTyAkT1UxUFFKV1VIKi5fMC1IWzlDUjIuL1woJigKLU0sMjdXNi1WNSFRVktOKVBdMjMyXkk6LVI3Q0BeJE06WFVdS1EvOCI5KTInODY0QzdPIlVHSSVFMiI1P0sKLU1DMF8qOSJAKV00X15SOipDVVNYXVBOTkNGLDlZJzs0WlM6WjQ6JCwxRi1YMlQuLCJQLEpBW1JRUiNMOkkKLU0mIDVISSA/IzEyJkBHIVMpNlNfMTEkKlZUXis9TlhZLzgwIigwVEskUlA5LDNAJ01TJVxTJzpQXlRLLFYKLU09VSstMTRUUiI0KltOUD5MPihRMkdVKDNaIidIKSNaTjIpOUhDREMoODtHUCQ/JDFLQCI1WVoqTEJaXkQKLU04PzozWiM1Ll1EX0M/STBGQlAoSTogVihTWClOVDQyWSNQUVMqPkckOlEhSjAtTEleRlpcUywwJDM5VloKLU0jPUM2XUUrWDMzSzQ9WitZPC1TJk0uMjswNiFTQ0QzOkY4Uz9dTVdNVixfQDAsOTIxN0oiPy4mPE9PPVcKLU0qQ0I8WSc2VUpUQElCOTQlLVtbMT0oUjwnLSVZNiM9ODsgQEA8IjM5TzhNKCU4TURaP0ZTNyYmLC5dVCgKLU0qRjhAOSBJW0M3XjRFOTk6VEQ2SE9FVyVGSiFcTjQ1W1goM0EzNSdVLjslIkskOEIjJy85KlNIQSpFMjUKLU1fXUc1KChCU0xKWVNRW0ZRPyY/JkxcWDk1N0YzOzw2I1M2JS1ELERYJ0BTRE0lMUpeIVBTV1JDRjk2MTkKLU0iQ1MnRE8mWkgzPVZaQD41ICtQRUlfTCcyQ1JLPE0zVzghNUVNLiw8Xy88WilCVSIxNiM2WjY7ODFaQFUKLU1HUFY7JVdRUS1FSEo0MjFGTTYyQ0BILl0iSDZcOzNZRUY7PCU6PlBfJ11eL0VKSi5fXU1WXChaJS1MPF8KLU0gPVRVKlFUWUFdVVdbUkBHKE8nRDBIX0VPPD9JJlVIVlI4PEErWEhZViQjLklSSzRVRUgnR0szQShcJFgKLU1OLyM9IUhXXUozNjsnSFUmUEI6SENMNlxSU0hQJENIVDgoXV8sNU5NVyJPQy43MDVdOFA3Jkc5VkQkPDoKLU1eIkUvRkZCSz9bISVMQC0xRFJGMlBRMyJcSzolQFAwXDBdODI3Iig5JUg0XjtWJUA4LT8kWVoxJk1RXicKLU0gNT5WRypeO0tKXlReOycuXyAvMU08JFJXWT1JKl9FKVBUWCA0S1BCUCgiLFM8WCJVXlsrQzhcUztfQzMKLU1eSSAvJ0lWIl05P0hKRywtKzdOM0YuUS8mLl1CT04qSCU0Ui5CNyRcQlc0NFI8KlUkJDBMOkwmQTReWyAKLU1IQE9XJDotMkVCL1hMWVAjVT00OU5TP0oiWURTJ1E7UFVbJzssXzE5SygjIj06NUBAXk1WIkdIQyNcJkcKLU1TRTFMSDU+JzVQPDI8LjZCM0lUMSs/RDFaRTpGOVg4NjVXPlArK1BQRTUwSCJUM1YmMEEsQls/JzlWVSIKLU0tKSNLXzxJSlkqPlpaSFpKPldbMCUsVzMiOiRFOj4nPUFaLFlcITtBPFYjM0ZcKVROP15YRzc2UFxJT0IKLU0yV0dWRUdBRUJAW08vNk0gSFQuOVBDJkg2XEY6SC0tPDpINygtLV01WVpJLDlUS0MsJVIvIz1CJ1ZEOV8KLU1MUzUnO0VcQ1FdOUhdXjA0OV06WlBKJDMmWShIXVleJFJGSS9DXFhHJUZCIiQuTl5bRjIhOjU5TCI/Rj8KLU1DTCQyPT86QF1HUkIiLVE7M1Y7Wzk1XUJbVS1OJFBDMD1OL1hYLjY7ISU6XC4mWjswIEhKJU0nRiVYJlkKLU0wN1xHWF8gVyguSiQwUCIlN0owPjBAU1VGNio/LkZUXEA4Mz5YOS8jMjkuXzFLLE5ZWDglIl5CUFQ3XDwKLU0mPU5WNFksIlhBJDc2LTRbM1VSUVFYKztRQEEjLVwkO15bN0dSRy8jSjI8R1ZIVCBdMDInMEhXKDNKUyIKLU1SPCIrRDYuRSQzLFtLPjkoIk8hXys5RUcpLF1BRilDRFdQJTo7UE9WUUhbR0ZQLUNTVlQ7TVRSO0JdLkAKLU05IjcqTlYkUSA5Pzo8PlRMXiokUF4lVVFcLF1PNSAmODVYLkVUV0xFUykwPFQ1MyM4MUVTSSkoKVkoVlwKLU1FXSJNVSElUlYuTyYwU1I0ICkpTzVJPic1K0FIXzxORVVBTVI/JV8wNC9ZJCAsISY5VU0kID9UVSQmQjkKLU0xT1czPS4mIzZYSiNEIzMpO1gjUCFFUDhBXTFMPTs0NywkK1NTPl5WWFo9RUhRQVsuIDZWWEAmTFsxMkoKLU0sPU84UylOODpFRlxcLydCRy8iPTNBMUYiWkVIWlU2MzQ+K1dJTThPW1owTFFGRCpKUyskJD5KIlBfWlkKLU1BXFEhK0wuRzoyIyE6I1E8OjJCK1VNMj4jVjFcNTQjQjxEVE0yVk1HWCg0RVkuVDo+RVJJUiNRUEpBMlAKLU0sVjpaUzAtLzA8I003SVdLI1AlUE9UW0ghJyguRDVGIE0pSiNdKiUhRlYmKi1BRjZWL1ZPIF07KEg+US4KLU0uO140LltGOFFHIzssPixGK0MgJzRAIi8mSVwhXDxIQ1ZGLk81S08kLyJFVSU7XUtCMzEtIFFaPERdSV0KLU08XjJETUtaTVg+KDYvPlwvODU2KjFNPEk7OFBKTUAnSktXSlErXlJNNTMgODNeVzZWSExdJSQ8Oiw2UlcKLU1GOC5TIU9ASSZAUlI2PiswS1MrRS4xNFhdT184UV8kQSVGQFldVitfRDdaPVFeIV0vLStXWk5NJF09Ij8KLU0nX1YnK08jWC1BSipDVlAjRChXUC5dQ0ZWWiJCQC5KKCBVRkUvWTQsRSw2TlNUI0FVMSI2MVM+OidXUVkKLU1AP0EmJyY1WTc5IStJPCRWKUlWUEQvXUUgL1dZNCQ2LiE/Ti0xMyI2S1wqLVorWTVdOVdYMl4zKSJUKVIKLU1DRFtFWVBGNCJIPk4pKy9RPilHSz1dOjdBOkE4SV4yUU8zQFpKRlNPNyU3VjJRJlYtJCspRFlVIVM3UCIKLU1MXEdTLzpJNFcjLz5WQUZNREdCLVIlPDciMj5DWT5CNFUzPzYxOT5bICZbSS9BKTFQLzgqSV0rPi5ALzMKLU0vNCZaLjlAKkMvU0E1T1E3QFYlTkxIQUZYJ0ciUjRBQFUxQz5TIVFMKltbQSdFRCUvSSRHMlVLJTUrJkIKLU0tKzhTODgmTDxbXExcW0g7WVIySSpSO14lLig2V1RCWFUrJiUiS1tEWUI2I0k9OVdZTE07PEE5JycpU00KLU05IyA3P08gWVdILUVQLiVbKEg7Uj4iVFIsO1YsTkdLKiNQIldCWCQ9IFQjLDA+Uk1HL0xJUFpfPVgoPioKLU0mKlFQKyhdKS8lIFlETCI0L0heJ108KlxPLUFbIFAxIlVaSEwmKSo/Tik2M0ddRTBSK1EvSS5GNjlQKzoKLU0iUDk2W1pCIUhXQ0NVRVFWLlA0NE4pJENLWCMjT0pcLiEzRVlSV0w/VCdFICk6SCs3N1ZRTzgsJi4tMkMKLU0qQTMxOCBOLTBTL0Q5QklJOF4xUFVVLUokOExZMy85VVkmJjxaLk8gIihQXVNTVUhFW15GS1tGO0JWLkAKLU1AJjslO09CL108XV03QCUuNEpLUlhZUygsVDFMNzI6NCMlVVNcNlBCPVEyNyNRKj5PPyhSSDZCJ1QhODkKLU08RCRAMUFAS0k9MEUyQk0tUS8rNlVVV11IWDldMlpePSIlQTosRkEpS11LQ1E7VEFRUSxSVy0vLFskN1QKLU1FKzBFLzVYMitWRzs9PE8hITdOSjtJK1FOIUVaKiJeOCokLkIvTigsICdIQSAiTzAlNUQ0QSM1W10zRUAKLU01L0FSKz1bWV5GPkUmIztbUT9TWi5KWE0qLiovITQqSDAzJV48Ry5CVylXNStOLEVVTi00UjUsM1A0MjMKLU1OVChUIztKOzImXkwiMVMrSVdHXU1JNE1NWyo+P0AoOU1WOzAjVU1ZNCEsUTNPOF01KkpcVCExXEtHXVgKLU03JTozKFUgRClfXzBIRkEnO0dIT0UqSi5GIDtRSENNXVlbLjFcNUw0KlRYKUhOLFo+Ry1OUStbP101WTIKLU1XKjBJLzFCTiRdVSw4MyM3SkImQ0xAN0YxUEFIMC08MCYzSEIgUlE+LVIkRU5CNFtFMTUsQEs1JDc0VVsKLU0vNjM7PkkvMVEjUzJLPUhFOTImQkRGKTxIKilDSTAnU0VQUUVPMDIpKlM4XjxFJFNESUtMMFZXQSBdJCUKLU09QlArWjdMTkkkVEdQQj04SSk1LDJRNig1P00vNz5WQExLST0tMilDJ1VARDUhX11XNTUrXjlSKCopTyoKLU06KyQtNShKPkoxJE1HV18xOyBaKDosITVXLCUuMzNdT09XQlszWVNHQj9OLlZaPltDOCMgJVhUWUBULjYKLU0nKT84JCQgOTswJEgwVSJYOUUmIjdXLk1OIUQ6TD1cS0U9NzwgRzkvNERVU1BEMilVIypWKU5AWDo9X1YKLU1TRzk6T1MmO1ZYOE0tV0hGXkIwSCs2RSY4Wlo8PlYwRVs0KksiOyBJLVxQRlouSDY1VUEzIlBWWUkhKi8KLU1bWCwkSUZeTkdTMyNRIC8oRlRXSDggIjgqNjhFMFoxSUFIQTM0SE5JWCBHXzlOXFBOTEkrWSEsPSQrUE8KLU0qIkY5PDw+JyM0JS1JK0tNOFIpXSEpVzVLJyFcXzMwQy1PW1E+Vk5TPz41Wy9ERS9GNS9DWjgzJj1MJCMKLU1SIz4wKjMiLjNUXiZeO0M+NTdTVzhDWylRU0Q1UzI4Jz4oOklARj8yPE8jIzJIVCQ3JSkxMj9JKFtTTysKLU03JzM5QFVcX0onWlUmLFcuIzNVNEZMMlUvVV5JJjUtJSlBJDRQKC4kUS1fWTY+TyVUUSQsIVBQKU5NIFUKLU1WLUBcID4pTUo0Ty8uNSM/PU9XXkhAPF1HXTRWSTdbXV8/Oz5UOF4lSUUkSE8oJlEiMl5KXCAnIjIiTDAKLU0tKV1KIUI6UEQ9ODspPiEnMCEiWSBSWVAnVk9eUTROR1dXOC8tKTBKOS8nOkVSLFFNWl9SVDY3MyI+O1gKLU0uO0xMJFsvUCwtRkpJNU06LitBUktBKDNLJTc2Vjg0XCYmJyBJVEU4UDReRVE4UDsjVSZeTE8kMCNNQD4KLU1CLVMjIT09UjwiKClDICJKPFZCWCxUUF86MEchIyomTywrUDBUPVAnOUBLJ14mVVUjLztZSjU7PD1HMyIKLU1eRFQoMisjLSQxLFlQSideMSNLNz03WzddIVo0PEVNTyJXU0ErKj43I1szMTRQU1ZOV1w0KjdUPT4hJzMKLU0tUEddUUAnL1xIVS9IICVdSyBdJTJEQ1BOODRfLVQhQTokKCBdNihQNS5BISFVXCJBP0BRMF8gJDZMLVcKLU0iR1olUlI3KjUsIFNLKVFEVTtKWE1AQiY1SCJPMSdQLjczNE0hNTNCI0UlSCIuLyg/NCIiXFc4W0dVXi8KLU09LTggRS40NDUiLFheTFUiQFtSV0BbVkRULjw6Sk5OLjtCXl0oQj9ZNFQmLjtFIiEqXSMiXydFIU8tJ1AKLU0xRFoxLVtIPFhFICcqIUYgLj5GVTIwPlkwSVotN1NHKTE3SkFONyo0LUBIODguSEM4XlEhNTwtU0pNIiQKLU03SEYtNU01QSc5PF8iXlwrXT4qMCVeVkNBJ0hBUCwyViJSOERDIjVVVCwkIiZbUlpPUkc+JTomUFo4VUQKLU0/RE9bNz8kJCVVVDleMUMmIlA7LVE1O05GN1tDIkhRNTVSOCYwU0k4SV1YUTQnSFkhLyhKSDIhMkRWJyIKLU0mOTVWN1g/OShRTCFRKEVWQD1IKV89MkFDTEtEKiApKzQjMzs3OShdV1s7USFEWlZGSj4sWTc6TkpKWywKLU02TSgqPDBJRVcuLTM3MiteICA+LEA/X1czVyhPVE1bJjpVTTFPOEBSRSZPVCIwNFIvSD1JJFhCUVRALFYKLU1IRkQkX1dDOjcyXUpURFxBMFsiTkQwSVgkOVdRMCteV1s6X0olKzlOS11aTTVaQEk+Xj1aJkxWQicvKzcKLU1YPzAwKThPXzYrQUouKjJeTUopSCAuXVpaSVRQRDI+KSYqRjNPIT1XW1AgVDNWLEdPWD43IypHUS5PJ10KLU1YQSwvKlNZODlRQF9fXV1NVUhdJ0MlKTBJKTsuQCNERCQ9TTYhQl8nRiskSFpGUCgwWi1IWyxNUysmMjMKLU1aNS8kKVgpWSlDJiIzISchSC1XS1VDVSpCMT9ZOUEgTCgoMFY0K1gpQkggP00qMk1RIVo8P1ssUCc6XSoKLU0kS1RBRkxFK04xUC9GNzVDQTdSTkExTCtHNF0wI1FWP1JRQitUIjU0Lz04MCMhT1c9VE9EIi5PR1MyPCwKLU1PJ1JeS00xKTVIOTQ7OVQqSlYyOCgvUTwmOi1ZJEBHWUtXMkY4NylSRCpaUFAyTDFPJFRESVQoNkRdVV4KLU1GR0swPENPS1hYP0hUVDQ8PC9TSSYmKkZNTUVFJ1BbPioxLEZTRjJLPjApXykkI0o6Kzg7PzBNQV48TUwKLU08Mz5YUk8mLjMkXT9EKipVOS8uSio7WTVIMV5PSU0gVkpSODxRUjNSLUJVWl0jJz9WMklYOi9GXyk+IDoKLU0iV1NfUUxXN1BKPkEzIkBSNC01OERTIlgzM1Y+SSZOXU5aI0VXREpMKTRQRlteRloiXCc6UyolK1pPX0cKLU0wOzAqNFwsN0I0VkhBIFVPX1hcPDNIWl8pSkAtX0I+RTZcQipVMEg2KyA2RilaWz9QXkNSJylKKVcyJjAKLU1RMiIuTCRIVyQpVTYuUEshL11XSC8xIzRDP0lDTTYuLjxdIksqQTBNIDpJPF8wMS8yXFQ6MTUyOkQ+Ty0KLU00UC4lWyJGLEsiQUkmKyxBSkc9Pl9PJzMnTDoiWjNUIF1APlQuIVIxNSJOMTpbNkc4MVJdSTU0RjVUOFcKLU0sVTgxUyM/UUgzXldRUlYuQS1TLTdSRyomSUInSys1VzE8LkBTJi0gLTs7KSROW1VeKFA2SlckKllUOl8KLU0vUDowPjpILiFIKCtGQyEtRUIgOj46XiEsR0InT0EwNiAuXkpCSjBXLjtCKSlCNTdMIiMwPSk3Okk9UkgKLU1bQiNVL0oiLSA9Pjk3Rj9JRCFePUM8IjRfIT5IP0kkJD4kJj03WUk7QkkxKj02Jy1dPUxOWF4yL1BGI1wKLU1POEUrVTYxMkxVSCAtUl4+SU1HS1hUJzReJkVLVV0/PDspSzRTVygjKEJSJiwhMVlMPTNKREAmNU1HIkAKLU01Rj1NTFQvSj1MSyBAVE5MSyc9VFpGMSk1V1k0O1xaUVhLXjVdWD06TFw/QEleOkBMLz5SPj5WSEk5LT4KLU0yUTlSTkpVUjMiPTpAIyEyMFNAXUpLRVU7K1EtPEZcXSVFPT4gUS8/Qj5FIiNVI19UXyQyQTVLSS1fUjEKLU0mVDtfTENaPi1WJVYxTCRDS1I0PTUzVFEpQk4jXTg4IVQjJDxYJTBUVlZcXTIlSEkrNj4pTkRTMFdWMjMKLU1UQThUWiFfVkxTLltfXTpEPEpBJS4qQScyRidSWl9VJkEgIlgoO19QRT9WXD1QSEs9TUcoUTYlVT1eRTcKLU04TSckNTlLXyNHNyBBSilBMDI1WCApWUApIzVBRVxPRDY1Vl9HWFUqVCM6XDRNUThUOFhPKCctUDMgQCwKLU0nOjUjODAlSkhNUEFJLElLWT80MTlcXjM1LkYxVVE3WFlIKi5YWFVfRCQxJEIhIDlIJEFOKypfS11YOUYKLU1TMVAjQFxMMStfIkZYQTU1IC5fKDM2TCg1NSlVQV1FRDslQTVNRkJMJSxHXjZfISVTV1crKFA6QTBFQUEKLU0zUFRfVlVARSNWOUNfS0EqI0pfWDElRiZcUz8nSEJQJiNTWzM9MTFWWT1cLSc+SlY7OV4/IzIsU0UoQCQKLU0qREBHIjIsRDxZVzwhWj04KysqQlQmPi8nN0tCKysxVzZcW0k9OSglMUwnUzAhIzhYTyJUJ1skK1U5RSgKLU1GNTE9Ql5PVDdJLF83MlVFVUxXVDhCJClYODtQKjgoN1RLTT0+Mj9SPDpONV1OVEwqIUNDJ0gnRUJWLV8KLU1HLFItRFxdMipXPSJfUFkvTkgmXkEoP0hdXERWVVtHTVhXXylWOCE3RlRHVlFNNzhSVD5GQT4mXSczSzMKLU0hVCE9RTQ7RDpBT0EgJE9MPTxePTI/RTNBVzZeOihJUktMSUogMkcoUFhPIiYtRC9OWTVKVFMiJ1NGTy0KLU04UURHTSNPQk0vRjdRNUQqM1hMQS5PVionXE9VQSxbXCU+TFM4SVczK0ZISigxSUhTMkMlMy5cJCZGKz8KLU0qISg/JyhLN0dcTUUqREVcJDBJXUROXi4+UlMnJyMgR01NW18xMyw4T1lfTCkhJjJKSk5SWyEqPE8yJEgKLU05PCJJVyUvSDYiL1VdNVo5SCdYOEJbQDxENl0mOkFBWVgmRFZNKidAO1VaPi83OyhfOSpfV182NEwrXDEKLU1cJUlISEpOWStUNjxQWzhPK0haRjo4ISBbVV4+OVpYKTlNM0c8XStCUTJCLlUoUlpYJkIhMV1SRFM+RjEKLU0gQj5GJzsoUiIwOkg9SVNfR1JQUEs8MEYiL0g+Il5XRi9HR1smUlQuM0s7MDVcTSw1TEtDUThHWUlbWV4KLU1ZU0E6VC4vMydaLiNCJSVZWksnNDFYVzUtUVlZRShLTEtKO0gxXS02P1lLKzwoRyY6XFQpVjFZWC8oWFsKLU03V08kLz8ySFw4TTY3OlFJOEA7UllIJls2SSZBKS5LTTgxXV9eWkIuXS0rOSUrNF0pUzdUU1hKRU8zXTAKLU0rVD0tUyktW1NaN1dDQUlPTUJPJiZYKzQyJSsxRVkmPiVfSVFKVCtQJkhPJzlKQSs/LTRCSls2Oz9RLSgKLU1HIUE4VCU4Vl1BMTs8SD4kWCxVRikuWFwrKVAlLjcvNTUmNEQxJEQjVitXJD8jPVg0JCZbKDZYX0VPXksKLU1HNC5UWSw4KUcjRyszPU5JTjdFWU4wJiRUKF4yQV5PMSgsPideOFglIDxLMiYqWDhAUTBWQEtfXiRbJzUKLU0uLk4wNEFaQy8oVkVIRFdeRllZPVFbPEZGVS1PQCVVOEpTQSVGWjlESy88XjA9VjpcNCZTQCBUXyREXikKLU1QLUJeSTJYMjImS0ZMK1I6QidcXV9WXCpTXkhOM1smNj06U01PJlY3KSMuSCM7MC5JSFo3VUA0SVYnIjAKLU1KSy4rSFhaNkJeTU9IV0FWM1pXVC8rQUhAKU4rSDcpT11HWTRCQFpQVCxeVUZPQFUuVCFHTjErPVtfTTIKLU1FNzc4XDgtXykwTyksTV5VXjZDVlIxKltGMypAMDZZQ05AQTtPRz8pJyZAKyNJSyEqK0ZXTT5eK109Nk0KLU1PNzRXSiBTKzs3QCVFQi9BKUQhLjo7I11XJCJWUTZFMCMyOlI0XzJLPVAlVks+Lz1QMiA/Ty9SPy4jPlEKLU1GTkInMUolJS5YW1NSW0swTy0iMCwxTSAwKCNBPEo1KS1JTltWICBcODUjUyBWV1dCWkIvNzwuJDgiS0YKLU1fJFw/LC0nSSxHLilSNyRRX0ozNlRBWTwkRFZDXEEoSiwrUFA4IFQ6WzdNXFgyMEk8RzkqNUw+S14nSD8KLU1BTTpPXFdaVCteOlZLPFYwL1wkMCROOy9VPV8gIykuXF5AUUsrRjQvKlwwW05GRTFFQCExJV9MXCk5N1oKLU0lKzxdNC0vLUlYKSQrM0EiSkM6X1A5Wj42T0JQLkYhMFNZQkI5MCI1PytMIT1SRCVWSSNHLTZURDMnPlMKLU1QKUgrRkg9UzldSDE9QzhaXEQqRkVTRFo/Oy1bWy9AVCYxOlIlK1tTL1JdJDFRXE5SKDwuPjVdXzdQOTMKLU1ePFIzOD45QS9DWVUjIjcmTyZJICg8QV1LRFhFKEBfT0FJOTogJzdCWlspWTdANjwlVz0vIkNDXFwvMkgKLU0wL1wuODpaVSlQUiksKiQpTkQhWzIwJE9YJzBUNCNXLy4kLl06UkBIPT0zWUBMXC5FNEVUR1cpODghKD4KLU0rNEVZWCgrOD0+NyNTIixBP0ZaSiU+XlssMlRXITNGMzc0Pk4zTjdJMkFTS1YvTzw6LTMuKT0tVyhBLCwKLU0rMyRBUkFQPCFcWTcnIUUoVEBJKV8iIjkjJzwvLShRNT5QKF1AT0JLMkwiPkNZQCcnUC0pRCEoOFI1T0MKLU09NksrOFlEJkZcPkIgMS9QUEtQOU5eKDohP0ZYWEs1SDAhOz8rKlNPIVpdPUlZN01BKjYrOjNETSVVUzoKLU0vSCMiWEU+RlhHKC8jT1ZdIztePE9UWEJMKCY6L1hHQlVdXlVaQidNVkJCKlokTl07I0xTIEcjRC9EQD4KLU0iKSI9Rlg9VVtKXF43IlopRz81RCJbMS9bOz4gKFJFTFlbUixNKS8gSjwkTl42S1EpXTgqSVlNPCRWOz4KLU1UOTtfNCYuMSY0MzFLSjpTU01LSCJBIitdV0FBOltXXVtUKUhNTCc9KUJCRUM9LD0pTSRPQiksQCRAPzkKLU06QDFDX1Q/SykrJChWX1lXT0RbS0A7JkJYOlhONzUzXl81LS85LFdQTC4yRChJSVAsUzNPS1wxOVI7UEQKLU0wX0ZePk8/Ryo6Pj89KlI7J0BOME8gOEkgICAgICAgISAjOCBHUCRdIEBYIyUgMS4hO1QnN1BEViJUJC0KLU1AMF9UJElQICAgICAgITggKzAhIyAlSCA8ICInIClUIE0gIyogLiQgXVAkLiAyMCAgIDA6ICAkMVghMzIKLU0iRiwqMkBKLCAvJCJYIT9GIlY4MTEhIkcgVCg+UVFZJiQ5TCwkMjQtKT5UPFYgWVsjKVgtJiFYSSRaRCkKLU05Qi4zIylQOycyKVMhMlQzVyIyKSkuRClAUUhQKS40MEkwUTolOUBFMyErVSU6XDtcMiZaJkkgKCNAIFMKLU0iQVwxLCBNXyEkTDQ5UCo7JyM4L0FCMiMmOTgvSCBOXyBCUCVKUC4oKEZQPVVQPUwkSywtNVEmPyVeQCQKLU0jME5VICYkIURRT1wjX1Q0OCBSTiUgWEEoIUIzKEskLz8iMDYiN0wgI0I4UCIsVEJcQUZWJDBYJFNBPUQKLU0lVkgzPkBEPCMjVEVTISclJT9UMVYiLzsiXVBDWzFQISMiXEY5ITgmI00wMiIxRDUlVjhFJlAoKyUlLCgKLU06IVFaJk1cRjUxJTklUjQjJ0FRJCNbLDhIUiMuIClUKVUhP18oPDg9MSI1TylNKDQoIUpfJ1Q4IkpQI1QKLU0nVDgkSyBaTikzUCFRICYxJVZAPSZANzUgTyRGOFAxRiJRLDY6QVhdIzcsIzwwQlwhTFQwQjEyPyNFPCsKLU0/ITJOJ01IRj8hVTAoM1AvPDBHPyM9SCpGIEw/Il5APF8gWzcmRyxAIkEkIichKD9fQSc6JjJANUFSJUUKLU0lIiQ1PEFbTiBGUDQ+UTZHI1IkOFUiLVYlMEgmLVFPJyQjXCkkIiAkJjpEN0wgJEIpT0ggTlIsMChBKDIKLU0rUCdCJ1pcL1lAISwiVCxFRFFQUSZXLDZLQFM5JzdEPDJCIkEiRTBBISA6MCEmLD9YMStQKDtMI1ZROT4KLU0oVlwsJUBGJCY0QCUlUEJQJyhEJU4gTEcpSyglTSAzLiY1JENEQClXIyZYI1FCOCQjWTA+PkE0OyQ1VCgKLU1LQEpIIzokQT5QIyokVyAhJjE9XCAhJEJDUSpcIy9ARjwgJUcjW1wwSkIgQCRbIEMsQUcuKCpILydAS1MKLU0hMSwqWUE3JSgzID0gMFQhJlVAIVwwTU4iVDg2TFFRQyQ/MEMxUUFYI09QMkBQTE8jNkAxNCItTSI3XCsKLU0rUSM3IktYMiAwPSwpRlhBIlAlSyFRJColMTYgIV5AOEZBOEooXVAyPTIkRic/MCpFMCRBIzIgISRQSDkKLU0iKVQwIjBLMidQMDI4QictJC9MO1xAWTwmOyQhNSFEXyIkRCo8IUJBJ1U4PkghN0IpNiwwViBWKidVMCcKLU0/IF9GIlpQLUAxRDApRTAoP0IrQihdNDdPIiFYIFVEJDIgMjwgRlAyXlAiOCEkMD0wUSopI1MkLy8gSEcKLU0kMyQuOyEkLCJLIDBdMDtBJkQsNSpRUlMjJzg3OTIyVCJcVCNFQV4zJyJANTUwMSomUDQ/QVE3UCdCSDsKLU1RIjJUIlJcJTRCLikpPiA3IiAiRChMVCIqUCZSKC9UMzYxTCkiNCAhJzA5SSZDRDo2IjwlJlEoRj5ARksKLU0gJDwzLzEyUyQyUEMmIF5aKCs0JV1QLkwlTCA0VjFMWSQoUCtHMEM7Ij9YOj8gIloiJ1Q0PyFILyNPREUKLU1FUSQ3Jis8OFBRXD0lXUgqPkIsSylATCUoQCBSI11AMSgxXCohOTg3VDI3UiA8JDogUTs0IUpMNj5QQFwKLU0iWjQuXCBDWShGPDMuITU9IFNcKzpCL0kiKShAOjE/RyIiQCtZMUdRJFckKlQxUVIkTyA4OlA3JSFLVEYKLU1HIFUoICdMMUIyKEspLFgrPUBDVilOKC47IiJZIUIoL0pRUFQjNUwyUkE1KSIsKCAgMCdbJ1IkNF0hWjsKLU0oTFxAI0IpSiE+TEROMS0sIyBcNVUgRzgiVEQgTCAjNSJCXEZUUCU1Jkk8M1tAQj8oOCBGTUE2RSFNUCwKLU0nITtZIkxYJlZBT10gSjhAMSBIUSUoJDAlUC4vIlI0Ny4gPkMnRTgxK0FUISVZKCs1QDomJShUOjgiJ1gKLU0oTDQiVFBALSEqJDEiMDMkJik8RD9AWkEiTSgoUTI0TSg6QCIhUCUmJFI4KVNAI1AiUCQ3WSFRQyVEIDYKLU0qMSo2IDkgPl0gRiEiTSA7UlI6QSdXQDMiIFRTJixMIE8gTTQjQlAiU0BISSBDRDFDMjNfJ0Q8OjNBIiUKLU0nKzgxVkBXMylOUDxFQE1NJyc0M00gLi4hKSg6XUI0JyVNODFaUEAyKT84J1oiNV4pQ0g6TEI4XCBWWEEKLU0wUCc/I08sPikwRkMkT1g4UUFEPSFNTEE/UjZVJz5IN0wiJFQjSUw6LDI3TShBPDwlIF0wIEgsLVRCL0wKLU0hX1ApVCBeXiRIOEJGQEtOJTJURFoxJi0nTyw+QFFdICkvSCM/MEYzIjogIjRQKigkRkBFVTAwTSYyIDYKLU00IjI2Ii8sQDcyNykgXCwjJzBaTyhBSEYuUFBOJiFcOlohUkwlSlAmXlEmMykjSDVYIiZPIV0gK1EhVUUKLU0jS1A2UiIpKCgiREI8USE6KEg8JFZQWk0mPEwgKUIsPCFJREUgUElAJC0wKlEwOTEoMiw8XlElMCA6OC0KLU0sUjJDJ1A0MlghQ10kUCAgQSEqKCRZSChSMFFSJ1BMQiFROD0mXiAnRzI5QyQiPD1DQCFKIU9EOFIhRF4KLU0lUFBFNVA7LyhDPEY1UEsuIko4Qk4wMjolWUglLjBESCBPOChVQjldKUhYITAgXi0iTjwuRVAySCdSLDgKLU0uQD9QJDdYPighWV8jXTwkW0FSNiQqTCIpUEVFJzNALjIwMjckIjQiOUEtVyNCOCJWMDgxIycoI11QMU4KLU0mMlQsODI6MSRNNCAkUE4jIy8oJCxAQi8jRixFL0I7WSEvSDgjIS9YIVVYM1QxXFwkSiQ1VCEiLCFeXDsKLU1bIE8yJ0hALlxRMFInJiQ8TSI4TyZKSDdZMiIiJTBUIlRQXEcnRTgoOCA5SiU2QDBQUUI+ITI0MSEhMT4KLU0mQkAlR0AsIChCIDlBIExAKSMwJT5QMS8pNSwoWEEtXCEvODdWUTYrKEssKVJQJDMnX0wyL0AvLyAqNDoKLU1VID5VIFg4RyJQNi0gJFg5QUFYKCAqTCQ/UCAkJTAgKyggUDknMzhFOzEqPyBDMDxeIE0uKTQ4IlVAR0cKLU0mOkA5KEE6LygoWDohIV5NIFAgMScxXCwgVCBFX1FJMCQxLD4hQiUmIDRQIEsyIFEoMyggISFGQiM6NCwKLU0qIS4mIEkwJV0hSkcmJig5MlFfUidPREA6QjM/KFxEKCQxLj0jM1A6WVFFTyZBTDAtUDJYJ1Q0MChAWUwKLU0mUjAoQzAsRSEoKCBBMSEpJj5cJyRQLz4lODBBTTAkTCIwOC1PQS45JS5YNlZCJz8mOlQgLDE2MCU5QD8KLU1AIFVRJVJcNFshPSslQCA3KEIxJyI6WCYuUilbIStQRjpRK1AiQFRCRUFCTSgmUDtaIFFZJiUgKF4xQjMKLU0iIlhELkBbVSkiKC4mIjAoJihYLVlRTkklIDg+KyBMQSctWEUnIEQjIlVQIkAxN14hLzwoPTFWRCRPVEQKLU1YMU42IiBYLyNAJCMlMFwlUTBRSCVMQC0lUFsjIzo8N1EyOC8hIlAwLTBaOilARCpSMUNbIUI8N14iNUIKLU0gOixCVCEqJyAoTDNcQjM1Ji0oOVtQP0AgIiA5OVBKICAvVCwgIiNWIVEkLiUxVCUmMDwtUFBRWiMuNC0KLU01UV4zJzEoICMxQ0gjQCxGPyBSPiBZLDhSIV5CKF5AMCdQNS8jSCQ2PkFLQCJGTC9DMDoxIClMKloxRSEKLU0mK1g+TVBHPiNeTCogIS5HISkoIDMxRF8hVTQ1LFFcSiJITCErMSw+IjBQOi8iOiMgLkw4SyI5SiVUVDEKLU1AMi1bJiksQTtCMjInWExGUyFEJSZPOC5dMT5IIj4kIkxRSVIhTiQsPFIqSicnLDdQIVNcJUNUMUUwNl8KLU0pRkQ4V0EpJyRIJCxdQTpbJSZUNEdRSCMpSCghSiEkWiAiLCJBMV9fKSJcNikgRzElJyAzWFFfWSFcKEIKLU0jITk2JzokLCsgSkwiJDg8M1BbISYvPDQrMTRNKCFcL1AwW1UlQ0RFSTEsIyRJRDZYISQqKShANyMhXSUKLU0iQCAsUCFfIyVMSClZUiJXI1g8IjQxR1QlTDwmKjElLCgvKCRNMipQI0ggL18xOj4gJEg2PlEzTCA6NCYKLU0hMCosIElQNixQPTcjTyQgPkIqVyY2NEVVICxdITM8Jl4gWScmRzwrUTFWQChQTEJbUScyIzRYMlIgTjoKLU0jXzQ7WyE3WSVVTCtEMDVWIl9MKjUwRy4hIlgqWUAtMig/SC1MQDMlJyRAIkpQSlwjT1A2RUBcUSQuQEEKLU0jQTc6JkIwKkUhTSclIFw6RyBTWSVLWCc+UEBdID8wNT0xO1smW1wvOlAtKShFXD1bMClJIlZEKFFQIV0KLU0mRjhAV1A9RSIgKENSIVtbJ0o4QlkwLFsjODg/IEIqKiVCPEA4UEMiIDhMP0ZAO0InWSRASTFLPSFOXC8KLU1FQElJJCkwLVRCOjUlNVQwNjFQKyFaMEI9ISU6ISBII01BLyglKkggKzEnMyFMXD0mIF5ZKFgsRlxRO1UKLU0nSEwvOCBdRCVdRCAuQCkgKFFQIkYgXS8pKzRBTjFbPCVAJCMiQCdBIVYgJE0hL00nSzg9STIvRyk+WCoKLU1AMSYlIVBQOFFRI0sjIChASTE6VSMrWEYgUFkhIiIgKywhOEogJFRDPkFCKSBdNCtXUSZcJSFIJj1BID8KLU0jJ1wlPUExXyFPPENSUTEhIEwoKk9CI04pSkApXFBLXyI8VC0zIElNI0gkKkhAPCcgKEgjR0IuPig0VDEKLU05Qic8JiwgRipCJ00pNFAjWTE7Nic4PEUiUiJKIUgkKlMyLiUoI1QmTzI5MiAtND5TMExFITgsKFkhQ1AKLU0oKEQzOjEyRSIsTDlcUjlJIlo4RCVQLj8mPzQlTCFcTig/IDdMUVpSIiFQN1YhMUEgSDAtTzE8UyZdOD0KLU1EUStaJD9IKy9CMjImQjgkViAgUiguPDdYMTQqKFZUOVdAQTshQkAlJFBbIyNePDo/USEgJFZcI11QUjAKLU0lOjQyVUBLICc2NCIlIC9XIzZQN1ghTFQhIiQ0VkA2SSU8PCA/UVUuJj00PUEhM0EhJyAyLUA7LSI5VDMKLU1dIipQI14wPVFCOlYhVVA6XEBWWiU4IC8iMSw4IU8wRkEwNDgjMzgnVTFSMyFEWD5DQTI7KTQkJDdAW1YKLU0hViQtI0IkMiYwICBfQEhaKTs0OTJBLUAgOFQqJCFUXCkjTEAqICMnKDc4IEgxQzgmOlQ1SjA+RiJfTDQKLU1DUChPJFVYIS5QODIoSUQ8JEImTiNMOD4vIFMuIVAoPDkgSSglN1RFREIoQiNDTDhBMT1cI0FIISghIU4KLU0lSjAtRFFQJiRTIEItQUJTI1QkQ1AhXDEkMEQxO1BQNyM+KCZEUT4uIVhEPFNRQVIiJkA5SEE7NiMtXC8KLU0wQClNI1dcNUIhTFIlJCA/OTBHWyYlJDtHUVUgIStQMyhARkknKiAuQSE7ISk8QEVJUU8wIDtMPU8iJDEKLU0lXig/UFE7ISMoID4xIjBaJC08RENBKFwnKDBCKCBdTSBEQERVUTxCJkZENlJQNVopSjg7TCBGOiIkIDQKLU03UDtSJjtQRyFSO0QoW1A6MzEyMiM9QDkpMjY/IUUoNTBAXVsiLCQ5PzEvSSZIQEIvMTdfI1w4JlIgUlgKLU0oKVw0UEI7WyZOMDc/UDFCJSc8QS0xOjAmP0QzXkFLQCA8UCFWUDRRIk1EPzghRkInSjg7OkI6RSkqXC4KLU1UMjlKJCY8LyBQKVMpPUQoOTAiQCEyXEVSQiVQKSUsQyExUlUnX0w3QDFOPCdZVDY/MVZWIjc8IEFQJVQKLU0mKVgxXzA/SyhdLCUrITYnKFhMQkRCLEIoIkAxPUFcTCdUNDwsISYiJV5QISowMDkmVDBFRTAkVyhPPEIKLU1MUT06I15URTswRywkRjwxMyBULSM8TCIiUi5WJy5EPzBQLlYjLVwhSFFYJSJORDIlIDZaKSggJkdCODAKLU0gRSAvLzFXKCUrMCI3UEwuJyosLF8hU1QpJ1wjWkIxViA5ICFZMjtCIS5EIC0hTV8jKCgqMEEuLyMtTDAKLU1DMjNEJkxQNFZRVTQhKTxEIyEsUShbRCUvICRSIiUkRlEhXlAgXVw7U0E4SyZPSDhTIEZMIS80Pz0wKioKLU0jP0g+MzA9NSc4WCI3IDAsJ18kP1owO1EnOigvVVA7MSJIUD8xMCAhIDcwIzJQUj0lTUw2MiBaSCI2REAKLU1JIStGIFooL1pRXzUiQ1A5SVBTRiZUUEAzQCtVIyxMLy5RWjggPkA8QUIzTyI8UEIjQVU9KDxYOyMwV0cKLU0oOkQ3NTFeOShXJDciMT1eIl1cL1FAUFsoUSxCVSFYWyI6IDEyIVlBIFQoNkQiMzcgP0wvRSIpPyVFPEMKLU0vIFA7JzYsL1IwSzUnTkRBOEE/KiY2RDhNICpGJTJANU9CMFMlUCwqIEAhSiFaKDNGQE4zKUFEJC9AKF4KLU0pIiBBIjFaOSUhXEUwMFZSKUY0PDogLjgoOFAzSiI4Kyk3QEJVMiItKC1UPk0gWCUoN1grWCFaJSQyKCAKLU0nIDhZJDJIJTNBLVkoSjxDQiFURiBUMC1AQjBRKSJYLFNQLjAgMiglVjElLCVRXDAsQF5DJU8oQVFQIkcKLU0oKlApTFFMNCRYVDk9UEhAIEFAKkpQIyEnLjgrQDFZWiBRJC9fQSE4IStUQkUgOjYkO1Q5ITBUPSYxPCUKLU1YQT8pIStUJDsxL14jNTwkLTA+RiZBLDxfUUApJldINlFQNFohIkgnQ1ApJyAmIEIzMFAkJEwgPEFAND4KLU0mTEg3TUIvPiNUQC06ITA9IEo0PTMwL0kjRkwlVSBMICZXRC9cUTBLIlxYJ1ohPSAjWSRBPyBIQyVWJDQKLU1VMCM0JDpQKjtRNEgnKVxCQVBLIiZKSEBDUUg0JUE0RFRAMkEhVzAmQzFNRikxNDpHQD8/JCRIPTgiLikKLU0iQTQ8IzFfPyggUCVLIUswKS9MNFhSOUYkMyw2WCBQLyVZTDxEISAzIF1YIz4yIkQnTyw+JyBQQygmPEIKLU1KMS1QJUkkLl1RITwgVCxAKVBZSiM8MERLQU1PIVUwPDEhJSsgQCg4U0EuOCBAPCBFUDE/IVggO18wIikKLU0lRkBELzBHPidUIDInQVdbIydUPzJBUSQoVCwrWyAmTSQpTCI7MSkvIEQwRVFCJzQnSlA4RFIjWSRWRCkKLU05UCcsJypMOjoxRUQpT1wjKTAuMyg/QDE3MCBYKSU8Ol8gXS0oJjA3ViI4UyM+XCJNIDNLIDIwIzAwUVYKLU0pK1guRyAkMyEkTCVSQUslISNAQTtRXyshNzAzKUBMWik4VDZMQCNMKC9MNSoiIykoQlwuKCAhRiYrIC8KLU1JMCxJIjJUPDdAMEQgWVw4MSA8VSIwNDlSMCNKJlZcJCMxXiwkKzhCNFAxNyJOJDRYUi82JFAoQTdQPlsKLU0pPjRCXVBOKyFEPCEvMCdcJD9cRU5BKSAmS0AnOiAzSylGQDxZQCJQIDNULDwxNzEiUiAlRVAoQSg0KEQKLU0rIi0+JEUsMjxARTwjXyAlR0FPWSAiOCkxMEBBIDY8NiBCIzwnLDgmNDAwMilHKCFbICZKJTUgRFYhOycKLU0mKTQtP1AtXykgKCEsUF1PICEoPE1APSIhUFQhOCFeNSM+WEZQMFtfKFBYPTMwWFIoMSxATEEhUSMqSCIKLU06MCBGJVNMLSwhR04hQDwwU1FBUiFdQEMhMTdHJEpENjcxLEwkLUA1OyFCJCRUTCtGMD8lJ14gKSRQWD0KLU0lTyA4LFAwOyI0IDQiQS9aJCNUQkcwVlEoMUw0QFA0QCk9WEYyUURAIDVYO00iJFsmMVQzKCEiQCBbRDYKLU1bMSs0JVc4NEMiJSsgWEQoOiFYTyJTRDBJQjs3IjowOVJAJEshWzwuSDIxVCQ7PDA/MSJRJl5AISowXkkKLU0oNTwhUFBaXSJYMDcoQT0kI15cNUVQKk8pIkxEI0FLNCRXOD9YMDg3JVJIQkZQWkEpKCgtTVBZTiFCUDgKLU0mMCUjJTs4LkVSKigoK0Q6WiA3WCM2LEVMIU9WJzkwQj0wUC0hQDg0IVElLiZKSDxaQjErIEMoJFdCJlAKLU0iTkg4PCFXRyEjTEI+QSReITswKFlBWlUoKTQuNzBOSCRFLCFQUFdIIUJQPUdRRU0jXFQ/KSAlISQ6ICYKLU0/Qi9CIDcsPltQMzgoUTgjWTA8TCkxMDRcITUoJVhEMDNBLiMjOSg/KEBBOyFZXDxeUitOJkJEMTVAV0cKLU0iIVBCTTBDMCY+LCInUCJEJU1UMl4hW0IiJSQmTyBbKig1NCwvUFczIi9QOygxUSwkLzgvWFAtWidBJEUKLU07IVggICNUNz1SKkYnQTBDKSFIWyMySCdSIC1ZI1EwOU9BN0MhXjBFSjA7QSJVXCIwISomJC1UJ1VRO1QKLU0iTUhCTVBMTCIjQCdTQihdIyE4IicgUVspKlQ1TSBXMiRTWCw9QVRQIEYkNURCO04pRDw2JyA9QSAgJCMKLU1UIS1TIl4gQ11ALlskMjwrIDAuSiElQDVEUTQrITFINzBAPlUoVFBBKyE9KShWJDBbMSMtIEQ8MEJQVlUKLU0oVUwjRiBKJSUxWCNQMTxZIlNQNzUyI0AhNCQhIjItNyEtRC0oMjZZJUJMPCRBQiwkQ0BFWlEwWihASCsKLU1bUjMwJ14gLVUgQ00iW0AgNFEuIyQhKCggMFJXKCdYOChANVIhRUg/UCE1KiBeQDxHMC5aIyI8Q0FRQD8KLU0hRjg8KkEuJCUyWChIQjhIICgkI04hTVsjITwpXDAhJCIkRDchUTswJ1Y4ODYyJCYkTSwgKjI2WyBPMDQKLU0rQSVDJiFMIy8hTF0gN1Q1JzIlLCVJUD86ITdYKU1UL1tRXTUpSzQ1LkIyPik0VDFJUFNTKUcsK1swLkgKLU0iKywmJlIsOyQzOCxBQFk4JUIsMy9QWSYjJDxATFBcICNKPDdRMT5RJyxMKzJRNC8gNTArIDEhNSgjLCoKLU0iISJUJFpUNVJQX1cpSUQsNSFXIiBOKDFUMD1dJTYsITkiIUggQVQjSlBeSSRVJD1ZQixWJSQ4J0lCKFoKLU0oNUApVFE+OSE5OEBfUVs4JFcgNzVAPFgiIFQjNCBBMChYQEBEITooIS8wKk4gRi0hXFQiKFEyMiIhKCoKLU1YMURZJldMNF4hVyIhNlQlJiEgNyBYLDFRUFxFIyQwLylQV0wjUDArXkBDRydFLDAvUFoiJ0s8N15QKCQKLU0jXkwuWTAmOyZLND1EQC0/Ji9UKSBCN00lVDQnNlBGPCEoUD5YUiQuJig4KTVQMlUpOShBRyFPRCVGWDYKLU1fIjo/Iz0sRichSVUhTzwsSEFPOCIuVDxHUTNUKFNcMD0gL00hUiwyV0FNMCZBPCpSMiQxKE1MOiowQTsKLU0nVkQnTkIqOSJeSC8lQSogJ0JcREMhTUwnWCAjMiFRNyI2XCNHMToqKDpcQkJQOlomXyAzUTAySSVPODEKLU1AUicuJUdUQzAwL0YnWCw4PjAtICNcXCxFMUUiIi5cRVJBNjAhMFQ9KCBWIiVIPCJcUFpIJjEgPFxRRCoKLU0hSVQtN1IvVidLQDcgIiZGJDREMiRROD8lSUA5X1AqIyMmMCdCMiYzIDowOU5BTSkiXVA5OCFDKiUnKCQKLU1CUjs5IDJQIyghWCQnV1A6ODFJWiQ/QDk9QE1RJTVQL1sxOyAgOlw+OUAtKSJZQCQiIVhEKSpYRyBQQDUKLU0iJTwyMUAhUScoMC0uIik+JCBUJywxSC0mQiQ2LVAsOyROMEJGUi5KISckIiswVz8kJlQvT0BJRCVQQCcKLU1VQUcjISxAOEYwSFslK0gxSkAoRiJNQDZTIjhSISMwLSZRQyIoPVg9U0BaISczMCRZIT5GKTQwNU1AS1MKLU0oLFAvOyE3LiAmRCtUQjUzIChIJj1BWUwpRUxGNzBYQiBEODlVQDRNJ0NUIiRARlwjM0wjTUBVQCRNPD0KLU0kQjopKT8oJyEhL0siWTAyITBZJCRMPDogUVUmJCdcQjNBXzshRjAoRCA8MiJFKC4zMi4oKCVQPj0iNCoKLU0pTCA7KVFDMyhRUCE3QFY4IVwgIyAhOVMkNSwrNEIhQCBcPCcyQSVDKEJMPVJAWUQmNFAyRCFHLCBCWCkKLU00MixJIjlYNCdBMismPUApNUEhOCkzODctMFEiI1E0LUZAIDMmLDQ7PyFDQSAuLDVSQjhRJCZAIiZBSF4KLU0iTCAlLkEiLSIgIDZGMTwrJEJAKlBQTCMpMTBEWkI1QiFCVCNOQFNPI0ZMRSlBKTcpQ1gzKlBHJiY8NEAKLU1LMSRMIyYoIDcgUUEpK1wjOUIvMCZcMCA2QS9PJCswNFghLFgmWDQmQ1A3UCZYTEJPMUxdJkooKVQgKF4KLU0mIiw1XEAjQSFGUCtBUDRCKUpUJVZQSDYjTjgpTTIoIiM2REVRMFxTID00OFVSIl4lNFw1SUFJQiQxUCEKLU0jUF5OIFYsP0dRSSEgWSgpOiBBNScnLEQ+ITkzKT5UKE4wVjAjUiRGSFE8NiU1XDhSQCM+J18kRTJQOCcKLU0nKywkOUEtUiI+QDs0QTtVKFE0RFEwOCYpUEA9MiFSKyY+TCMvUUJcI0tEIUJAPTUgIjQxUDBORiUvWD4KLU1VIi09JjooKEUxQ0woM1goVFA+QCJYUEBOQDcuJjw8LyUgMD4gN1QiQzBdSig+IEI4MjtIJUVEK1UhSUkKLU0lTyAmKEBBVSIwXDksUVlMIDBENSghM1kgJCxCKyBCOiYwNDNeQElHJDUkODxAXEspOFwvWiFWRCNdTCkKLU07USIuKCJMKiAyNU4kKygwKzE4OCFVXEJWQiQkIVAgIVxBSCciSEQ3JFFBXikxWDwxUC88JSFQNVYyLSkKLU0mSiwqQCFQTCg9IDBUUEInJ1g8MyNALV8lLyA5RlAjQSZIUDs4UDQ1ITAkPEtAMEAmUFA4MUIxXCAhIDgKLU0oIUQ+JlswMCIyKDAlRUw3NzI6ViUrJDAjQFkjJFdQNk8xKCgkRzw2OUFdSikxQCU9MSJKJzBEIUFQK0IKLU0jVkQxXUEiTyc5SCIkMCc4JkFURi9RSjIjKUg8VjFXTiZJOCc/UjRVJkREPyZBPCApPDQqMyFWVyc1UEIKLU0zIUBaI1dUIDwgMlklNywqNFBGPiVUTClUUDMuJCFEL1VATVwgRDg0PiIgMiEjQEQgMDApIEVIPSQwQDEKLU0mVTgtLFAnSSBJKD0zMUA3IypIKkwyNTQhQSggXEBEMyMxRCMiUTI6IyEkOFEwIDghMyBAXjAzISJVNEYKLU1MUi4pI0w8LyAwUiwhMCw0VSFbViQ6XDAhUDhdJyM0NF4yLyQkLFRCUUBdTylNWDk/UEE0JkNcKiFBNFMKLU0iPVgzJiA9LSFPRCwrUTgsKUtYJl1RLl8iWUw4MEBHSCZTLCxdQD4yIVVQNykiLDEiN1BAPVBSOSErSCsKLU0nQSw0Jy8kNEohPCEjIVwuUCBXVidJQCYiQCpIKT0oRkswMikkKFAjPzIsVClDUC0hUClMJjs0I0syJ1YKLU0gPFgtUFFHXiE8REY9MVQvJzMwNk8wW0soVFgkPiFFJylPLDVHUi04I1dUREQwNzgiXCQ7LjBKJSVHTCkKLU0mQUo6IjMgJVogRzspPzw9KiFZOyguXCtWMCtPJ04gPFpBKFQiTEQ0WzBIWSVTJCpZITBBJEZcQlNAX04KLU0iLTRCTyImXiBATDsoIEssJCskQClAWzQoLiA5KDFWUCYkXC1FMjAmKChIQTlQIF0oXTw9JEBfTChHPEYKLU1JQSAhJ19MRkQyNUUjM1wxOjBATCIzKEZEQUBCJiU4QUJQKSckITwoRSIjJikxXEBDIi9bIUNQLFpBVCkKLU0pKzQgWVFbLCk1LCA0USorJC0kNSggW0MkTygmWyBFRiFVNC1eQUA9J0lEICNCIigiQjA3NVExICU7SCEKLU1AUTooIyk4JzUwRk0nWCA2VEFBICRKLDsrITZGJzVEREkxWkQjPEwqTlE5RSBMRCghMEk/JzMgM0IhLEcKLU0oRywwPFI7KiNbWCUvMEwzIUU4ICMiJiYlI0hAUCFBOCRBIEQvMDI6JyQgMlwwLVchIFQyXkIlXyZHMDcKLU03IVFfJzFERidCOiogTDQvRkAsPyE3QCk3MVg7J01YJE4gUiQnVjxBSSFXPSFSTEJfITg5IiJAIE8wRCwKLU0mJ1wgVkFAKSUzUCAgMCMiIko4RS9RJTkjQSwtMVIzJCRPWEFDUjtYITxYKCYwVzciMFAjMjEuOCNeRDcKLU0/QUhBI1RAPEkyLUspTThCNyFZISkuUD9UMEI/JU8gLkRSMikpTVBDWFFGKCguREI/MUhAJV0wL01CMj4KLU0kUVQ2PiAgLSVDTChOMSNOJT9YODlAJlIhLDQ9KTBFWiVASDI5QEtcISBEMSEgUDEhQywnUjFHLyRULD0KLU1UUDEqJFg0ICVQRD0lRzw8K1BHJyVEPCEpMDJKIVZMIUpRN18hI0QuNyAoTClCNDRCIVcgJzA8QllRNVUKLU0gSFA3PzI2WyNGTDlfIDtAJCxIKVcgK1YmRCxFUDBSJSkmVEZIQVg5KEhELChBIDQjMTArRFFRIiAjXC4KLU01USFGIUlMNDpSPCEmMDRCKyAsXiYsUDRaME8wJFpAPUAhV0UhTkAqRCFCXyQ/PCBcUiIsI0EoQ0giLiQKLU0kJCwmNEI1VyhVQDQhIT8kKFlUN1hBJ00gPFgiWjFRViY4IDtYUUMrIVIkI0kgMEsgMjQhTlFINyAkJC4KLU1RISNfIE5cRUBSKCclOCBCUyFZJCg1VDBGQVsxKSY0PDRAQSAjJjQwSlE9QiRMMCQqQSpYJyNcJVQgKjUKLU0pNCgwNDItUiBJICkoQTJQIVRcMF5SIyIoJ0QrMSEzWiUmMD1HQEtNKDgoPzwxOEojWERFVzBEXiBCJCMKLU05MUpIKEAoLl1AQVQkXiQpSiBJJCBeUCpDMDlGJlxEP0kxKiwgWiRCMVIwWCFBQEI1MThAKCQoRUMxNU4KLU0kQDRGQVIsTSRfQCchUSNZKDw0Ii5CO08mNjAjMCImMCBUOEMxUVpQJVEsIT8wSysnXURAU0AvQyVKRDgKLU1SQDJeJFhcNFEhTDAgOiAyVjE8WCExJD0/MDc7IFQ8J0IhO1YlRyQsUiBILCUoICVNIF0hJCwgOkhARTQKLU0nSyxEKiAyQSIoNC0oUV1SKCtQRkhQJlclPCA/MFE7PCEsVEVAQVpHJVUkQzgxNjUgXEgkSSAlVCRUICkKLU0qIjZeKF44JD9SK08lJkgkUyBHJig6JEZQQiApKEEwPVhQXy4pPUxGTCA3XygjSC9LUT0rKUNIOU0yISgKLU0kKDg+WkBCKikhLDhFUSNeIk5ILFFQV0AnNUw4M1BBPCQtSChSQD5XIEcsMTtBOFojNTQuKFEkWSg2KCoKLU1eQURTJ1ZIOzExOzcmQFhBSyE+SSJaRCIiIFwuJSZMQ1VRVzAiOlwqWUI1WihAREYyIUBcIFIwQC0gKCEKLU0gSEhBJiBQPyhIJCtYMDIqIS8sPlMhXlIlQCA8MjBdMSk9XCkqMCtUKT9QRSEwTCQmVVArSlA3SyYuLDwKLU1FQVUnJ15YJVUgNz4iI0xGPDI2Ric9SEZDUiZNJlRcKStBK14pKVAmUzI4NyNQMDI5Ijs1IFpYIzgwSz0KLU0lNDwgI1AoMCNDIDZdQCU/ICAgJTwxXTwkRSA/NEFWICVKOCwwMD07IC8kJTghJ0ojIjg/SzAsTSI2VDwKLU1TQSVLJzxcQlxBJUYiOSwiTCE7SygjKC0oMiogJDU0NUNQT1UgNlAvSyIiNSQoPEBKITk8JVo8J0hRVF4KLU0oMUApJiI2MSE3LEAkUEgiI1JEIykhOFQhQlA1XUAjXSIkMDxQMUInKEhYRSRAUCQmQ0gjNlEsWSA9OCYKLU0oIF0qIzxYNlkwISQiLTBGO0A7MSZENEVSUFFdIDckRDRRTC8mTignU1EjPyFcSDlTIV8tIjhAKSoxVDMKLU0gPCQgUkBfICA+SDRWQikgJyYkM0UiJ0AlUFA1STEsOyVdIDEnUUJTJU5YJV0hVzYjNEA4V0FBJSA6UCcKLU00IS9TJiJIKT0xNyghVURCOSI1RCdDOC8qMjVbIkQwPjQhLyInTzA1TDEwRCQgKENYQCQtJ19ULV8yIEkKLU0mJSArMlFYICM3OD9SQVYwKUcsQCMgPyIlXlgtQyIvTigsMCUpIiMjKSYkLkQhS0kpRTQxJSA+Tyg3JDcKLU1UUV5KJCAwNEgwXDUpKVxDQjI3SCcjQCdKMEgpI0YsOTEgQVkiMkQ2NUInVCUwRDtEIFErIVtIRFkxKjoKLU0lMFg5QzFIJyg0SEIxUiBVIF9YICEhVDshRTwxMkE0VyJIUC1FQCM4KEBEQ05CLyApNDwpKyAjKSUrPDcKLU0hQTZPIz5QJyRQIjQkWUg2RVBVNyJFWDEoUTxKJyREIy1AJFAlKiAzIkImSyNRXDlLMDwyJ1tEN1cwM0QKLU0oSzBEXDBVPiZcLDJEIThcI0RMKC9QJjYmUDQ5X0I6TiUjPCQ2UU5BJTRARFcgKV0iXTwyIEBCRSg4QDkKLU1UIiA9JlU8NkcyNDsgJzwxJlIoLyI7XERWMTFdJiRMOU4wNl4nS0AgJDFfJSFFPDBaUi5AJzskKlkhKjEKLU0hJUQsWiI3PyIuVEQyMjpGJlEoLiMgV0EoKDwuPUIlKCBbQDkpMDwiKSgwKTExXUopOTwyM1AtNCdBWCsKLU0jQCsoJlI0MzhBViwgVFQhMTImNiVRTD5JQCImI19QQEAgSEIjMiQtR0BBRCNSKCRDUVhJIls0MkdBXDQKLU0iWlguPkFBNiZfOChXQVM3Jl8wIFcgJy0kMjQ6OjBUXyc/NC1TMSEzJDYwJ09QIUAkT1QzOjA+QyFMKDYKLU1LIEoiID4gNUQyIVMpK1w0RFExSCU9NCE4QV9LIVhMRC1BMzomNDQsL0BDVic1NDdTIVpQJE0kRVdCOzIKLU0hTDggTVBQLihIPCU4QDpAJkVUNDExSE0hOSQ5JzBOTSYpLDFTMEYpKCtcLElBKUgpK1QrPUBETyU2QDwKLU0jUEdQJ1JcPE9BISchSlguRVBaJihCJD4xQE5JISEgPjVASyMmRlg4TlIuJyVZXDVTITVdJiokJkRCNCIKLU0gPFQvRUElKihBWCogQF1GKUEwOyZQIjYmLTw+IEBUUyEzID9QIT00Jk5QMl8gQFsjMCguPiAyVSAnLDYKLU0kIiEgIy5QIT1CLFMoQzgzTUEwQiReMDYwQUo6Jl8wRS8wUEkjTiQvSCEtRCcuLDpIIDQiKTg4RF9SOUYKLU0pTSQtW1InXyI0QDpbMTFCJydULENQVSYoNjQpT0A4UyNNUCsqQixbJVUgPkZROl0nM0w7VDAoQChUIEAKLU1TUVU2JD1MKCtAVzIhQkQ7VkE6XiFcUCVSUDpEJTk8Ii5ALDciQSgsIiEsRyRKLDxGIDgpKS5YPTxRI0sKLU0jUUBGMkFLOCg1IC9HIU81JUYwRThQLDYnMlhFUDAjOycoTChFUEQnKD1UNEQhXyIlN0Q4TEFPISBDTCsKLU06IiExJyEoRi8wXSAkXSgqTkA4JChVWCFCUFYwIy8kKFghN0AhWzA0X0EzIyczXC8rUis3ITYsMyBSOlcKLU0gKVwmW1BHJiUpWD9fMDs3IEhEMlZROCQlUig/RTFcSiNSMCNOMCE7JSkkIjJCIlEhMywsIDE1ISJGICIKLU1dIFpGJFxELTohN0EiVlQwWSBQRSFDIDBFIjlXJkgwNUohSVwgVkwrR0A1XyRaKClNMFlcIigsNlVBPjkKLU0mJixFJFElOSg4SCReUUBNKD4oICohKUAlQEhGMFAhOCM2JDc+QiU9JSE8PygyMTcmSSwqNzEyPSEsMCoKLU0pQDdHIEZENzciI1YgOlApQVIuLiRMVCIlQDI+KF4oQDpSNSomQSwkJVFKNCFJICo+QFJdJ1RAOjxBVkIKLU0iWiQxL0IzVCA7KD03UClHKFZQNC5BW0siRkgvOiEsXCdKXChLUiVcJSsoJiQiIyUkKlw8W0FDOyc9WEAKLU1TQV9AIiE0IiZRLkknOzAlRyEyOyA+KDBfUi5VJ1NcOTZAPSAjTFAzOyEwMyQwPDpFUDNCKCo0LSdQWSEKLU0mRig7QzIpNSM+SC5UMSBSICNQNztBXEsoN1wiNCEnSCQgSC0zIVchJk4kKkIwUTAoMkA4TjBPQyZTSEQKLU0kID09IyNIMl5RQEwjUlQkJSAsVigzKDkiID4hJkUkQilQJk8mMDQ8SyFPISEtODopUi4sJDcsNCIhJEcKLU0kOyA1J0AwSCguMCJcQFBfIDY8Ij5BMDonMFwnI1AxUiVTNCAtIDgyKCE4QS8wT0EjW0wwP0AxLiI7NCwKLU1OQFxAJzgoOk8gUU8jRFA3P1BBRiEpTC9dQE5eJUEgJCtBWj8pKyghSDElXCVRSCw0MV83KEMoMVVBUloKLU0iLUgqKFI3KylHRCogMFwjI0w8MTAwMSMmTFA8MVAsKChHODlRUDwkJFYwOVhAOk4kTiAmUjEtWSk/UCEKLU1dIilYJFA4MVMwVD0iRDwnOkInMyVaPDdLUDUwI1JAN1wxQSsiLEAtOFBbSylGSCIkMidWJFxcMjoyNzIKLU0mXSAlPiA1SSJdRERSIVw3IC5AO1xANCgkXDAyM0FGNik6KDNAMFJMIyg0KjshKkAnQzAzWlA2TShRMCEKLU0mMCIwJT1UL1hBOVIiKlArJUI5OiBYWC4/ITZdKDBcQDQwSlYjVkghLCFEJiEgMENcUEE8I0ZMKTlAPToKLU0gOkgrOkA+QSM2TDlMICNVJi0wNlxQRVYpPCg4TzAuVyApOCg4MVRVJVRYJUBASysgMyxEWyE6SiVGJCUKLU0uUFJaIiBcRlxBQEAhTUgyRTBTQSBcOEE3UipeICc0ODEwQ0IkLURCKFBVPCBLLDc2MSY5Ij5AK00wXEkKLU0jPyAlWUE5QCZHVENJQVk3IUNEQy4xWlghW0AuSEFaViUpRDRCMFNFKDY8KldQRTsnPVQhLlFETycwNCkKLU1CIC5PIz5cJ0FRKEkoTFxDLUFQJCFcSDgjMSBPKEM0KV1QWSApPUQ2LVFDUykoWC8pQFhQI1kgPDEwR1MKLU0pPjAjWDBDRiVKPCgtIDs0Jy1ERVExWU8nXTg4S1BCUSlIWEVWQC1UIkc0LlcgTTciJ1w1MyFSXihQJD0KLU0lMCgjKTIsKzxRT0MoVkghJSBZKSRWLCc8UD9cIEVMNCEhUCcmVzw+KCElQSlIRDRDQTs5KFUkLj4xQSoKLU0jX1AkWVA/Nyk8WC4qITBcIz0oQjBRXy4kXVxCLTFKQSMgSC5OMVEsJFEsMiJRISchSixDRlIvPiE0MCsKLU02QU0vJTA4LUEyJlQmVzBEOzBYIychMDEnUjtOJ0c4IDowTisnNygrQUBeNChbODpCMTM8Iz4sJDcxMUIKLU0mLFQ7N0BbKSkwQEY7USpbJzJARVRBTT4jXUgwI0BfRSEqODBQIEVeKDA4LCEgNVMmPChDUlFUVydYJDIKLU1EUSwqIEg8OC4gUyYkSUQlUzIqPCRPVCk2UDZIKCg8IyIiOksoJTREISBUViJNWCwsUTEqI0goM0EwOCIKLU0iQyxDUUIxPyhJRClMUSFWIl84MyQhWkYoRDA/RyBZTyc3NENCMCo7J0dYNjdQQzUkXig1N1IuIyM0WCEKLU1JQF46Jk84NDsgMyAhWlQhPVBLJSBeMDAuUDU7JF0wPV0gLkwiLzxCJyItQyhGQDhVQEpRJ18sNFghJSIKLU0mVywuK1FPOSFPVCA4IVA4IS1YIz5SKEQiMiAzMiBCRSE4OD48ME9BKCI8OUAhTkYgMkw8PzA6MyghID8KLU1IMDomJj8sPFFBMDopOVRGXSBOQSk9MCVJMEQ+JzQoJDQhRzUmR0goVUAoJSQ7KDEuUV1UIlRMNkVAV14KLU0nRzQqNkFPKCkmUDdPMDAsIC1EI1UhOVkoV0gkXlFJTiJaVDgzUEhTIi8kRyJQICAmVVwuVEBWUykrRDwKLU0gQV4hJzUkNS0xXkwgI0QyVCFCRCBRTDQtIjknIEAoQEwxRy0iJFRBKEErVyVDXDtTIEpGJjwwNTIwL1oKLU0nISxBVVFDTyUzSDU4ICFPISZUPS5QKFwiRSg8U0BZOCY7KCYwMS5OIVhcP0shXlAgLUw0JDI6OyErQDEKLU0pUC1IJFg0RU5BQCwkI0AgXVFNTiFLQC06UFk1IFdQLSAgXSIpQThFU1BQWiEkQCopQV4tJUBQRChRKlYKLU0mWjwyViAjWCZVICAjMSJPIDgkKkBATFsnUyw5WzIwQCY7LEZIISBTJTAgMVhBX0opIlQ8OEI4KyU5OCwKLU1KUDNXJihAIEFAQ1YhKSQ3T1ApVSI+VCIuUDBSI14sODJRP10jXUw+O1FBXSQxKCFeIEBaJCZQICMgJiwKLU0oJkA6UFEyUyFbUChHMT8zJzY4QUowM1snKEAwVEBQJychNDxSUTs2IVVQJDMyIEUgJEQxNiAoMyVBJDMKLU0vUi1HJjgkOFQgMk8kTzwkTyIyNSFZLDIlQiIiIS4wRCZAQ1gmKDQtTSFMWSg8XDRWQiksJyVcIjZSM1gKLU0nKCA1TlI7TiNWJDs4MCgxKDZUKlAhPUQoVSAnNCAoPSgmPDAsIEVSI0EsISMyKjopKSgpMiA9OiAuJD0KLU0mIEUtIVhMIUpAQCsjMEQ/KzFBLSg9RDVYUEBFIEhMOlEwPCYlUThCN1BcUCFXVDNUUVIjIiI8MTQxN00KLU0gOzRCTzBUTiU6ID9dIEVNI01UMktBM0snPSgjMDAsXCQtWDdNMD43JlJELSBSN1chIVw/LTIqUidLUCwKLU03UD41JUUsREJCJyYmOURBUFBINSMqRDoiMF1AJUJUIyIiLCEiQjAlPyIkICM4SEBNQUQnKTQwLiYiJkYKLU0lWDQiLzAuVSguIDtaUiZNIkgsOScyJ1MnPSgjISAhOSJOKDwgMUpHKTBYPj9QODIhOTRANUBZSCUuQDIKLU0sQio0KFM0Q1JRN1giM0xDKCFUWChYTDUtMV4vIS0sJEYyI1kpLixCQjA3ViBYLDI0QVwrKTdYIFRBXV0KLU0lLyxBTiInNCNMXDtXUTlQI1YsNDFBKzMoJiwlWlFbLiMiSDsqIEciJUdYIF0wMTAlWVwoIiBUUydTPDsKLU00MVhIIU0oMTYhWVgjJ0gpVCEjKCMgIEFVQD4pJ0AgL1whLicnJTQ6LEAhISddIDVPUFBbIzpQPzggUioKLU0oQSRGITAjViMwPD9SUEgkIjAsNCJBWCUlX1wqQEEtQyhUMC8/UiMhJjM4K1MgXCQhVjQrMjE2RSgzQCEKLU09QVgpIiEwMDlRR0glVywwMDFUIyUvOC5fMVRZJCVAL1ZRSC0iWjg5SyFcJiZOUCwkQi5XI10wI1ciLEQKLU0nNTApP0BPTiYsVC9LQS01JiFMKjYiOy0hIFgrWUIrWyNKSDAmUFFHI1YoKj5AW1cpMkQkTzAmKiBQXDMKLU1ZQV1LJFY4LC5RPiIoXFg7PVFPQyU4WDM9MTBbKDpYKlEyME4jQywrNFEvRSkhOEMjUEUmJCkwQjtAID8KLU0mTCwpRTFXNiBBIDdHMFchJERYNSlRSEEkLzgyJTA+KCIoOCNSIFQwJz44N1IhMispM0woMkIiOiQkVCIKLU1XUi8nJDs0PTExSTkiREw4T0FbQydOUCojICc+J1dcKj1RKkkhKSA1JTE2KiFHXCokUUc3IVpQQUQxNVoKLU0lWTA9KVIpTyErQDNTMTFSIEYkQyFBJyghKDQoLFAgTCBeRERMMiBeICwwJVswIVEjPjQ3IUFIPCVYMCoKLU00IFdNIEogNlJCKiwjKlQvMiEiMiA+IC85IFlUKSNIMTAgR14kTlgyVyE3PyhYVDkkUDY/JSJQNDhQT1AKLU0iQ0w1QUFVOSIyLCtCIVVTIkpAOlggQTwgOTgrViEzIiJCIDpaMSYqIktQQklQXjwjKCg5PVBGPCdPPEAKLU1BIEMiJyxURS9BVyonPUQzOTBeJCUvRC8wIEAlKEJAQU1AIVwhOTwmOlEzWCdDKCZXMEhVJy84IFgyLyYKLU0nQlggUTBJOCkzTDtFQEQuKFBQIUwwJyonTExCQCBJRiMvKD9GUUk8JUQ8NCEhVDcnVEBEJTFISCdMQCAKLU0nIic3IEBUKzZBVUEiOEg8MzFYWihNWCAhIDtQJCckIDpSKyslTDRAOFBbMCZeMEFcQTlBIVtQQEMxQycKLU0kR0QzJlFHNSFVMDtUIExJJDUkMTcxMjsnICwgLCIxSSdKMDtUUExDJyBEQjZSODApOjwpTDBIISQyWEIKLU1aQT1VI0EsRTBRK1MmLlA4WiE1RihWOChUQV49JCkoLiZBQ0MhJiBDNjAmUCg4MEY9ICZbJD84MzswLS0KLU0lVDgzUTFcLCkyQENOMiMiJyJQID9AOighKUBEQTEoTiQ/SCMrQVA3IV1AMTpROVEnNjgiQUE9TylOTEEKLU05QjhfJ0ZIISUxRyYnOyAjQTBUOCdYSCw1MFktJjQ4I0IwWSkkJFQyUSFIOylIJDEgMDFDKCY0IkcxSz8KLU0gRSghODA2NCMzTDYoUV41ISk8MERQJikmJVghUDE8SyNULCVEIFJEICxUK1NRQDsgK1A+KlIuJyE0XCcKLU04QDtfKCwoIU8gIkIiPFQuSzBUOiJMNCBZUUgoJlEkOSZCLSEgWkQkRVFaJyUhKDUpIi06KE1ERklQLlUKLU0iR0gjQzI2NiUpXCchMVFKJCwsLk0gV1cpJCg5MTBORCMqVDJcQUpfI0ZINEsxNUcoKkghIiIsNyJLKCUKLU1XUUo+IUE0KkdSMEUlJyxEQVAvVSg7PD1CQVI+IkA0NFdQVTgjUjAqTzE1KClDIC1XIERJJ1lcNU0xPUoKLU0gXkQgUjE+LCRSPDRGMSwrIzNMRj9BPSAoIlwiJSEsPCQ7UEYuUDUtIlc8PT0hUTYgMjwrUyEgUSk9VCwKLU1SISUnJjggPkQiLjQoK1w5WDBRNCUzMD9GUD0rJkFIOz5BViIgVywwTFArWyNfVCJNIVdBJDpMKiZSI1sKLU0iISQ0SjIySSYjODxDITQsJCEkLkhAQkYkMlQxLEFBIiQvSCBRUC9dKUpMNF9RPUYoVCw7TDBUKiUpOCYKLU0gMjY2IVYgJVVCNCUnVTAtO0EoJiUwOEcgIiA4JDVYLVkgVVIhNEgsQkE6XyVKQDpDQFRGIllAJk9BTUkKLU0lPzA2LTFZOSFVOD0zIUtaI1NUOSNBNUciTCAiUVAvTChAMDBcQjleKENAJCFQUS4gTjwjUVAqTCdSWDUKLU0rQT8pJ0dEI14wUVYhSjA3J1E1SyY8PD5cQEciIytYMyMwQEghNVgvTUFfNyFKJClGIU01J1NUPCYxKFYKLU0mWVA5L1BWLig9MCw/UVQrJTRUJC0gJkMiQ0wlP0FGJSlLPDc7Ijo1JFcoPV4gNDggUzgyUlFUUik3PCUKLU1EQi5FKU4sJV0xOyolREg3N0BWXiUyXDg7IDBIIk4sIjcwL10kNyAmSjErRik4WCEvUEQzKCxQLVZQIFUKLU0lWkRGPFEgTikzXD89MEJPJU88QF9CIEwkWlA/UjItUSI5IEEsQUMmJixERCNRKD8pT1gkUDE7QiFWMEMKLU1QUiw1ITMsNUVCI00nKzRDQyIqVSNNQEM+QTwyKEA8QSxRNDYiMVQpUFA1LiUxMDFRQTtOKDIwNU8iMS4KLU0pRCA6QEA8TCZCWCZDUjciICg8PF9BN1omKTw+RSFOSCMxJCBOMFlXJVwoKU9SKkwlJCAuW0FVTCg3MCoKLU0/MDk4JThMRitQJFQpKjxCJzBQJScnMDxBQCBDKTZUMy9RVEYkTlQtIFE4XSRGSEEyQEIwIFwwPzgwQUEKLU0gTVA2SCItSiBVQCoqMCkhKDRcNUVBPS8oLDwrXSEjWCBVNCxbUUwmKCsoNkdRSUMpIkgnSyBcNicpWCoKLU1QUDhIIUhMID1QJiIiQEw/XzBUSiBLVCxUMCsmKEs0N15SO0koTUg/W0IiVyVfSEY9UStWJUkkQTlRW1oKLU0nLkQtQDBRJyE+MDY+MFlOJVZENDshNUgiPSw6OlIiLyhYIDM8UVxTJUggK1dROiYlTlAnQyBVSyglKCYKLU1AUiFRKTxYNjsxMSkpJkhGVkBGISBaIC1fQiNVJSMkPTgyOiQpQFQjMiAgOicsMCovIVMtISVIPUwxTigKLU0lKkRBSiBMICk+PC4iUEAsJF1YKjwwVyohNFwnMTEhXCNHMCNAUDUoJTpcI18hOV8oMiwjWCIgWiksLCwKLU07IUdKIFVAODtBQFIjVFRENCItKyIyUENVQVsgIzJYQkMwXSQjKEhAI0BcXSEjTClCQUdCJzcoJVtQPzIKLU0lL1wkTlEnVSEgLEJUME46JSwwJ11QW1QpM0hBWCA0KiYmLEBTQVdWIERAQTpCOFYkRSQpJEBcUyU8KCkKLU1CMFhEIlssPScxVSUnNjBDWjA8UCg3KDtLUipQIUlQREtAQSgmKjgkSEBbOCQ7ICpHMFojJCVQIzQgXEUKLU0gXFRBXCAiSyNBSCclQSIiJ15AMSVAKiAhRzBDTzA+XydGIDY3IV41Jz1IMj8hJSAmJ0g0MiFFOSQjPDYKLU02MDtSIkkwOElCJ1ooTCAnOCFfSyNWWDJFISMkIV00MUFRTDwiXSxBWiEiWCdeRDxaIiZHIFUgMjNBJDIKLU0hMUwmXCFSSCYkIDZZIUREIEs8KUMgST8iMTgwLCE5TSNVIDZcMS1TJ0VANT9RUEMiLkw+OyA/VShaTCsKLU05Iig0JEkoQD0gRTsmRSwhWTFeKSdLNCRJUC81IVxYME0wRCIlODQrKzAqRCRaXDFIUUtUIiI0PFtQTiQKLU0kTEg8MlFeSyVeUC88UFZdISAsJU5RXkYkIUQuSkI0RiJYUCtUUC5QKEtEQFEgQz0oRFRCWzAnVyFDMD0KLU0nIjgjJlg0Qz9CKl8gJUgsMiE3ISE4PC9HIipCJEIgLVMwWFIkRFhDIDEzPigkLEFHIi1ZKSlAPl1RP0UKLU0nNTRCUVBSWCZWICwmUFZUIyxERVsyMj0hNVhCXCBYVygzRC9SQCAsIEEoRC4xKyEgT0QzLDFHLiZFLDUKLU1ZMTglIExcOzIgMUohIzhCNyEkWyciMEFXITFJIUNQQjghXjMlPzAjQ0FdNihDJDUpQFE7KUQ0KU8gQF0KLU0pLiBGIjBZKyJYQCNEMSMpI1BcOlpRSzMlMSBGJzIyMSQtQDUpUFctJVZIIiAwUjgjOVghNkEgViJMIDcKLU0hUFJPIi4sNCQxNFAmTDhGT0BDQScwSDlfUEM9KT9ALzJSOFkoOVAuVVE+USNeOChHIEFBJEckOjVSJTUKLU0kOUAxSCIlQyggPEEuQFFQIlBUQUBBPSspOVQsXVA2IyBRIENSIF01IiQ0QCYhXzwlJlgjXzIkNClPTCAKLU1RUT9UJDxQLS8hJT8hPVxDXFBeXCRBRDFOMjlWJlwgI1FCOFoiNig4QiIjKSM7SC42US8qICJUNTshX1kKLU0mLkA4IVBaXSdaNEBKUVE5IicwLVcgMl8kQ0wiK1AnXyVETDZGUVYgJjtUQllQQiMhJCAoXjA/USEmVCIKLU0vQisgIywkKj4wVUAiIkg/KSEmOSE0VDtRIiU/KTFQLV8gMTwlMUAgWyFVOCQoNEJVQDJOIEIgOylQOTUKLU0jLUhAVUE/VyE3QCAzQi4mITBERj4xIj4jPjQiTiAnQyUxQCk3UEovIDlEJVtAMDMoM0QnNTE+TCM5TEQKLU0gUC4yJDQgKEIxREgnLjQnWFEsOShbPDpMQE9XKCowLlsxTVshWzBAPiA3NiRKOEUwMiolJUBUKFIiLjEKLU0iMCxBRTImLCEqOD5eQiBdKEc4OlEwISUmVCA8OyIqOiEsNEYmMS88JDY0JlRASCQlK0gmKyI1QSE5RDkKLU0qIjImITIgIEhQSE8mWzBDPlEoMCggTEJVUVklIzcgOklRQEYhXlw9PyE2SyRBUDNOQTleJ08sMitQL1IKLU0pUCwjISFUJicuNEI7MEU+KCNMKU4gSEsgJzglI0AjQykqIEZXUFw8ISMsNE9RW0ckNlRAKCAkMiJVPEQKLU0tQFQ/IktILjVQRycnOjw6L0EkJShSLDMiMENdIV1EPjRRJkEkVEQvRiAzISNBWDtTQThFJTAoJFwwNUMKLU0mW1g+XTA0RyFOQCxIQihVIjFcLCowOlomTyAiLFFURSQtRENDQDE9KFlYRVBBSF8hNUQxVzBXLiMhKC0KLU1KQVo6IldcQSRCMyMmNjREKFBITCBXUCFUQShSJjlELzswJVkiQkghJyAhQyJHLERZMEIvJTkgNStQUF4KLU0mXUxBUzEsIiAxUDc4QjFBIz40JSFAOSIhJVAqKSEyISZIXEFVUDgtJyMoPzsxM1goOlAgNTIhUSddIDkKLU1fMSxRIFFQNikgJzcoSTQ9ViE0VCMwVDIsQVhAJUpELTMwWVMgLFw6STBQMSNXPDcnMDRKJyJYIU1BVyEKLU0hQEwxKVAiVyRWNDQtIitFJEkgIVdSOCUgWzg+QEE4USM/VDAwQF8xIz8wLysgMlsnPEw3VFEkWic5MD4KLU1PICNFIzdQJkNRRVQgUFhDOiEvSSNdQDRPICZIIFRcQF9QMl4kPSwiXlFPXigzSCc+ISpcIk08LyFQIEMKLU0lNVwoJTBXJSMvRDI5MiFQIlw8LiwwMCMpMCwvXDAgLykrLD0xUTJNITZEIlBRJl8kOzQgI1BDSiVcIDkKLU0uIVpDKERAKC4hO1IjRSgvIUFAQic1VEMtMDQiJSNELkRBLywiQCgkWkAkKiRCIEQ6IEJJISM4QDpQUSsKLU0lNDAoVEE/PiU+LDJdISJMKCtIJTQhWTYjT0grJDBONiA/KCclQTMsKDU8L0AhKk4lWTg0WSE0IigtPDsKLU03IF0+JU9YOTsxJVwiPTgjS0AmIydMQCEtQEIyIFE0RS0gXjomNigyMSBCMiZXNCVPUVguKF9YMz8wLEcKLU0pTjgrQlA2ICk+JERGMF8rIEsoQF4wUzgoLzQlOCEtWCEwTEI6IiYpKUQgQUVRXFEiVCxBOVI2ICg6MD8KLU1UMV49JS8wPUcxSkkgV1BDUjFSWSUqLDssQSo/JENEQU8yJF8oKVxFQlBTLChXRDBZMFBYJyQgQy1COUQKLU0mWkwoRiBVLiRXIC4vQSogJF5QJFtRW08hNUAgNFFTRSdVLCI8QDI9KDZIRiJCMyElSDhGLyFLKiZQVDkKLU1YMjhXJU5QOV5QXi8oODgpWCIuXSArSD8qICRHJCNYMCNAWychKCwnT1EgISJGPC40MS5ZKCc4KS4xOjIKLU0oUjQlTEBGJSNVSCVMUFJaKE0sNjwyLFMhI0BCM0BNMCRQVC1QQVMoJ1dMREpRLCcjNURDR0FAJSU8SCsKLU0rUCUlJDZUPjVAWEMmTEg6UDAvWSlQND0mQDlDJUZUN0dBXzkhSkQ8SjA0XyQ5UCs/IEIhKCYsLjUgXjQKLU0nI1hGIzIwXCE9MEM5ITsnIVdMMFhQU18lIjA9VEE4QyAlVCYzUU9KIDggJT5RVDogSEAhQzBUVCgjQCUKLU1UIiJbIis0Q1xQJ0EoXCRALDArISkzVD00ME8nKFZYID8xJ1soLkQ0IlIqTyJRPDArIT9QJUNAJiRQSiwKLU0lX0BFWiIgXiREOCNVMCQoKStEPDVQVzInWzApJSAkOCZWUDAjUTJSKSYsLDRQXkwoMVAqOyBOLyBBXD8KLU04MDVNI0BANl4wXiIhUzQkMFAwKCU4JEREIU40IElMOThCPCIlWFA3SlBGWSYuQDo8UiYnJCdEL0JBRikKLU0iPFBEIyI5RiJXNClGUiNLIUpIQyhRN14kTkQ0N1FDWCYsODZCQS4mKSE8ODciLSQlSFg3WEBRWCU/NCoKLU09QEMqI1JEKiFSLkQpNjQmQyBEKCE1QDstIFJCJCYsRiMhLycpJiRAOlApQyRDJDkhIDRfJ0xcQj1CICUKLU0lRyg+PyE1NyFfJCwnQT5PIi5AOVswMDsiOkgyTSBDTydQJEY1QFZLJyhUJjkxUDkmT1A1MlBSWSJXPC4KLU1GMFImKDVERkAwTUsgSUwkUEBRJiknQDcyIixDJzY8KCAxVUIoIVw2WUAzJikxQChBIFw6KDAgOiBCM0cKLU0gUyxFQzE3JikmNCciQFBbIl04Qi5QX0gjXlA9S0InOyNWJCY/IS5OICtMNVYgLSgoL1xGW1EoOykhND0KLU1LQjlYIkVUK1owWkYlRCwhXTBYNCI5QEFTQjNTI0o4KksxUFYlT0w0TkEwVyhBPClAQShaKExYPi0gRlMKLU0hJkBAWCIhNCRTQDQ7QCs8IDBAMiNBKigkP1wmWTFQUiYpVDRJITs3KSRYRjhRT1AlJVA/KlFWXyA1SEQKLU1VUjJOJktYMVwgXjMoUyg3VjFNSSIwNCZBIig8J08gMyxQIl0kJjAqKCFFPSYvVD0rQiNXID8wPCohL0IKLU0nSEQtNEAwPyMtVEAjUU04I1RAIjxQJzElUSQ5MkBIRCI+WCMiQCRMJU88IUghJUAgLSQ4JEFdXyNKTDwKLU0mITovIzssKVYiOU4nTzwhNVFUSydVQC8iID07JSM4NiwiKyMnQjwyIlE1WyZJSDoxIU8zJikoJlMiJUoKLU0lJTwmUjArVShBUCYpQDsxIS4wIDpRLyMgTzw5M1BHKyk4PDg+UUlLKTBUJyZAOjQoKkA4RyEnKSdIWCoKLU0pMDxeIVs8MENBUjIoIiA6LDIgJyRHPD4oUExHJkAwJlJQVS4mODwgKlAzOiAyQD4yMD85JSpMIy0wIDIKLU0hNDA6LCExSiA7NCxFMD5KJDsgJzBAJDwmXCgiLCBEPCA6IDlIQURDIkdMM09QNy0jO0hFRlAyXyYjVCUKLU1RMUY7JERcLE5AWkMpRUhGKEA/IiclTCAnIEZdKUhYQzcgOlgoPDQnIiEzLyc1PCJEQEhdJlVIP10yKkIKLU0hJCA1Q1AjMSFMUD48ME8mISk8NDRQXlcmOUgoV0ExLyBVSCQzUDI3KUJEIzAwTUUmVVwqNFBLLygiKC8KLU1aMUEqJVtIJE1RTEUjWyQ5WyE4NydaIEM3UEdIKF4oQkJQNTMlJjAsWlBGKCVXREVFIT5CISVMMjEgWy8KLU0gXSRGTTFTIyhNXDg8ICBeIEJcNFQxQUUlQ1A1Q1BFTiUsUEEzQUBOKS9ILydRRD4lPChBMUBQJCQ7MEEKLU05IDIpI1RQRSlQJUQhPSwnNTEwXyVbNDMnQjJdI0dMOSBSKjclXFQ5JUI3SCg/PC1JQE05IVwwLiNQLlEKLU0gR0wyNFBRTyJdIEVPQC0jJlBUK1BQXSQhXiQ0R1IgQCQgIEYiQC4lITJAKD1AM08pQlQmNUE3SiVSMDMKLU0rUVdPJT5IIiMhSCIlNCQgTFArTSQmTC9JMThDKSdEICgyIVkgMDgpLVI2Nyg1UD5VMic3Jlg8QjRBJyYKLU0jRVgtPVA2ICcpKEA3MFFfIVJMNjoxViQnJ1hBX1FfIChWJEBUUSA7JkJQOjdQNyspLkQhVjEiNChMTDgKLU1VUTZaIVs4K1pCI14oTTQgXlFHNidNVCRWUjZDIyZUQUlRMiAlITBEQUEwNiAkUDlaMV02JEdIJz9BRy8KLU0nUTA+IDFeLSElUCEjUTcnI1I4IV0gRkgmVUQ2WkFRMSFQNEYsUT8jJlFIODkhPjklRVQxXCI5MCA1SD0KLU02QiYnJC40MSEwQ18nOCQoIjFbISBNTC4sQS0nJj0wI1gwJTUjXjxDWDI6PCREWCdBICdHIiRILVdRXz0KLU0kKjQ2SyIsTyNZXDtEQE1RI040OD5CMEAjSTA+KiBNVCROWEMsMTYpIDgoNlpBSFUhKiwrXzE8WyBfJCYKLU1CMTA5IF4gKEAgI1ghPyAnOFAkXSQkTCJdMiQ2IEhQO0pSIjImNVQwVFIiMyE8VEA0QjQuJTFIPyBQIkUKLU0mXERFS0BNTyYhNDcwUjY0KF4sMSUxSlchPig5NiIgRSRQJDo3MTRLIF9QOzciLCwjKlg8WyAuRyJRSCcKLU0wIjM5IiEsOFNCMTAgPlBEPiFdRCcyIDM6QFRKJkVARDJQNFsiXFxFLCFMOiA+TD0nIiJHKSg0Ol0iLkUKLU0kKEgwRTEsNignPCgkMi9FKE9AIStRPSYnJkg3UiBEKSQ6XD4+UEFdIytMQEQhWjIiRlQhO1AwQCQqWDYKLU0nIjc7JFIkLycxXEggIkQkNVBLPSZbJDIgMicsICowPyIiLSchQSw1PFBYISJbPC8jIiNEJ0VQI1IxXlgKLU0kXlgxLUAxUCE5VCtQIEFFIEU8O0hCOkQlPExGI1E7KyhLTDNDQTciIiwsIUAhRzEhJlQ8O1IrKCJSXCsKLU1eQD8+KEJQMTswSTohVEghKCFNNiU4UC8uMDIuKUQ0QTRSIFonSTwuPCAtRiZWXCFBMVYmIVxcQDBAP14KLU0nNUQqXlIgTiEpNDQiICFaJEQsPDExX1YpLUgsSiIgPCc3SEBJQjgiKT8oQjNATlAoKDBDLDI3XiZWIEcKLU0jMTg9IV8kJEogK1kjWzQ+TDIsJCYpUCwhQSg3I1JUQj8xNEQoNTQzM1I7JSA/PDIpQCRIKDo8JyVATEgKLU0nMyw3VUIrVSA6KEUxIEZQIiUkPF1COkskM1wpPSBFJig/REEgIiMlJlwsJFkwMzwlUzw+MVE8LyFeNCUKLU1QQVcyJyg0IlNAUVEoQjQqUDBIPSZcPDoqUEkiIjE4LisiNS8pTCwoLSEjOSc1MEZUMC05ISlMJy9QKVUKLU0hUUAzRVEnVyJIXCkvITA9IjcgPUkiI14pSEBGJFAtNCFaODhdQi9bIEY0L0YgS1AgJFw6VUE6VydIVEIKLU0nMjpZJEJcLTlBOV0gXUhBSzFTTig7ND1aMi84KTogJk8wNTsiMFQ/UiBPSSZRRDIzIjglIUpYNkkxMFoKLU0jLDQgTzBATyMwPDM9MTQ0JDIkMlQwNl0iLyQvXlBKJidGWD9eIFkzJFZcOllCMFAgTFhBVjAmJCBMQCgKLU1UUD0yIl08NiMiNlwoPkxBKiEvNCk6TEUnMD1AJF1EJjxRJ1wkMTg/TCBFTiY9MEZSMUFBJT1QJDogQFcKLU0kISg7JUBYMiFRXChHUTY6IlowKjhBOCEmQSg+OCEvTSg1KCdDUVkgITkgQCchXyAkVCwlMlFaRSYhSEYKLU1CUUZYJlE8OkJRMEsnPVQ+TlEjWSA1QCQgQEhXIkQkP1UxLlomSUw8QFIsOyctSEE6MVVdIlY4MkMgLlYKLU0oLigpNTFVQiItNCBfUitOJ0U8Nz5QLFQoTzQ1QzAnSiUvVCMjMjpNJiIkLTtRKT8hTiQ0IDFVTicpXDIKLU0nMSpTJC1ELCYwUiIhREgqUyBaRiQySEAjMD4rISM0NCdQMjskPDQ0R1IlKiRGPCxcUShCJVRQOychTScKLU0mUDAzUyIyNyEoMEVZQUcwIElYIFBQMz8gNEA8JSBeQiVMSDROUCpMKFAoKlJBWlYkWFxFVVI7KydSMDgKLU1QMSIhJT8sMzkiJTUmJkA8JDEjOCYnRDZcQUMkJFlIOV8iJColTyAjIEAoSiExOC9WQiBYJDA4MishPigKLU0gV0gzIlBKMSU9ID08QC8wJTwsITogPDwjNTA3RUFCSykmLDlIMSFFJEUoRFNCODgjSTQ8ISI1NCJeKDIKLU0pUTM6JjZENCAwQksmPyBANDAwVihHTCgqUClPJkw0N1kyNSYoM0A3LDBANihMOC9WUiU7KDsgP0sxJ04KLU0hRVA4PyIzVSZfVEUkUF8hJCdQQFpAJiwiRzwnLlImVCNUJCQ0QS4iIi40OjwxJTQjOyg0OEIqOycwMDsKLU1VQSFBJjtQJVxBSCIiJzwxTTBJKCgiKCFVITBXKC1EQzAiNTwhVDwxRiIvPiIpNEFUMiUxIUBIMEoiLFYKLU0mSkAgOkEzTSghNEMgUFQsIEdYJj4iO0AkO1QkKEIpQSlBXChLQE1IIUw8Nl5AJSEhRCgqQVIoXCI0XEQKLU1DMUQwJjw4KzFBIiEjUCApSjBBPCJfOD8oQV4pKS40KDAiKzUiQjAgSlE3MyBAUEAnQT9bI1M8RilQRiYKLU0iNzgnVTE2ISRVLDI7QTJOIj48PysgLlcoUUAlP1A2QCM9OCg1QFNVJEooIEAiJCIhWUwlTSBVQCVAJCoKLU0lQCopIEA8QCNRP0klX0xGSUI7XCFKWEYqMTFJIDFQPiVQSSAoJkxCWlBYLCZAICs+ISpCICksKkxQPjQKLU0oSiwyNUI0TiBWLCtfMjJbKSgwKU5AMjEoM1AjNTFdUiAoLC5WME80JjZINTIgQzQoTFg3J1AqPiErQCQKLU1QQCNEJV1IKV1CNkomJlQlJEFMQSlGXD1ZMF4tKFQwMV0xKSMkUVhEKyFITChUJDcuISZdJSMoLywgP0oKLU0hRlxAWSEhVyJFTCU2QTpNJz8wRUoyIUQkRyQ0O1IiICAgLEBfIEBWIUJUK10wMColNUgjQ0I3VSlHUDoKLU07UCRdIlBIMy9CNkMhNzhEUiAxUyZDRCQyIjIhJkUkIikhTzQkMywpQVIpRikpNDNHMjRYKThUOCkxKDkKLU0pOEgqLjI5RCMnTCxaQjA0IUcoJDNROSUiJSwrPzE2JSU7MCcvMDM/Ilo8NCIyKiUiQ1xGPzFeVyVJKEYKLU0gUS9SJktIPy5QJE0mSjAoL0FTLSg1TC4jUUsgJUtUNFBAT10pQUQ0KVImOCdDJDcsIC48IyVAMzswXCkKLU0kWFgtS0I1LyUtVCYwMDEkIDskJikhPFolWTgtVjEzKiI2TEZIMVc5KEwwOCwiOiIhISwyUlBTTCdGLCkKLU1cMVw7JjlYIDJCLDslRUgzSEBNISRGXDNXIjBaJTckJSxAOjYpLzAxNTIjXiIhTDJOIUErKT00IjkhOVMKLU0kOEgvNlE5KSM/XDJJUTUpIUlcOSpSIjgoM1RDXjFFRyJZNDsrUEpGIUVQISogRi8hOVgnPkE0KigqSDAKLU0tIS1TKStAQFdCMTQoKig9OlI7PiUgNEJEME1bIVM8PyZAMUQgVSwrP1I6MCVBPCMnMScoJ0YkPipSJDwKLU0lLigjVDBYXChaIDxRIStDKD1UQ1EyNygnSEhBU0ItTCczSCY6QUZSJ1NYJzpCMz4gXzxAPlFPPCFOMEAKLU0iQTdWITswQjAgViEgJlxCNjFLWCg8JCRPIUhDJTw8KlkhWicgSDgrVkBRPyFANC4nQCJCJlZcLEQyJkIKLU0kQ1QhNkI4MyQiIDxcUCBVIVMwKUVBNigkMUQ1SzIvTSJaUDZKIVBeJidYRkdRJTchIyQqRDI3QCRCODsKLU1QUjBCJEw4RT9BRlEhMVhEPlIjQig0PDcnMERWISQ0RyExXSQjMlA3XiEjQSRDJDc8IThdIjlYLyQgX1kKLU0iPUg4ICIhKyMzIEZQUjFQJTxYKk0iI00iXjwhX1IxJCYmODYtQU8/JFcgJEVRIDgoXDRBMzFPViQhPEAKLU1KMDwyJD04IkZBQUEjU0AyPzBZUCk4SDRdMjlcKENcJSUxO08oNUwiSkEuIiEjWD5BMC0zJVVMKjYgUSIKLU0pUEwxW1AkJyUnMEIsMVMkI1lcIVMwSDkmXDAhLEEwQCJLNCZWQSZfKSRAJkIgQComJFQyTDA7JSBYVDcKLU1RIVBIJzwkIkgwT1QoPTQxMDBCWSgpOEU4UURcJk5EKkRAXTklIlwjUVFMVilLUDlKUUEmJiAkQ1wgL1IKLU0iKThDPVBMJSZYRDpeMiBLJjNUMzYyJykgWEQhRVI3TyIxLCo6QEBLISAkNSNQMzkmRSREKCIxMigwKEQKLU05UDZWKFtYJjFRISomOFQ+OTA2WyguMDUgICMiJj9MPF1QKCEjP0grMjFKUyRKQC9dMCg6J11MLD5CM1sKLU0iI0RBLjFTKSRLRDA+MjdWKEtMLipAO0soQSQgPSE2RCcpWC8zQUtOJ1RQMDUhT0IlJzA0TVBISiM+UEMKLU0rUTg+JEdEOy4xJi0kVCQlV0E7QSg+XCA4MF0oJDo8QCYhNVokJzg/P1A7Mig5IEVZQixZIT9MJFFRIjcKLU0gUzAwPkAyQiNALEZdMDsmITEkQDRQP0gpTCA3TVE8NCQsSCM/UFxeIkNMJ11SJU8iOVghMyFfISJIQDsKLU1dIS4xJUVYMSNCKSwiRVgqSFEsJyAvMCNdUjwjIU80MCogICEgICAgICAgISAlOCBfUCdcIFRYJF0gO04KLU0iM1QrWCBbNyRCKDVQQUZWJz9YQkZQICAgICAgISAgISAgSCA5IC9IICAgICAgICEgICggIFAgJCAgICAKLU0gICAgICAgICAgICAgISAgIDAgIiAgMCAiICAwICIgIDAgIiAgMCAiICAwICIgIDAgIiAgJi8gICAwSzAKLU0gICwgICAgICAgJCAgQCAjICAwICEwICYgIDwgIiAgKSAgSCAiUCAsICBUICNAIDAgISggICAhOiAgJEcKLU0kLiQgIT80MCAtMkUgLkFPUDg7UiAiLUMkJVhNOlw8ICE6JCBTLlQ7U00vIiQgICI4M1hFU0VYQDNeXiEKLU1BOlEhNlJVTSEuWj8kKy0rIVE1W1I5Py4gLCFBICtHVU9aTTxJLycjOFJEICcxICAgMVREJC4tX1dVKjYKLU08V09RICAxXzA7JEtFRyI1VUBZI0MwNk8qPUwwTFFKMiIgWTQsIFY1PzQ8NCZLSEEgJEQtPF0zJ0IvV18KLU06QjI0I1BRWCEhMDAgKSM5RSY1IistPUIxMCY6KEI4NzNSPCBHUVwhT1ZLTTkmWFhFXlc6SV9HVFozXS8KLU0gUCA4JVEgQTZSXVVDW0ZKSDMqPlspVTMkWEMnTThYICBeJCBdQzMvOUMnLTFPWTVaO1IpLkRLSicwXl4KLU1ELjAwICcmNUk/JVc9MkVZWiY2VEpQPUQlOzQxRjxSRyVBTy5QMj1EOFooOFJOXkQ+UjctVD5dUDpdXF4KLU0nWVdKIFVdMyQtJyxbQilBVF9IKD4+IyZWQjlHVldGSzk4WDpRUEAgQFokIC82UFAoVjomWVZXRClLOFgKLU0tPDxMOyNLLVw8Pl4rQU4uICEwMCAmLTE4KF85TiIlVCtbIC40LEReME8zTkVXOUgiPDFXWTElVCAgLi4KLU1APiQ3TENPRD4tIDonJDgoI1dHVV0qPUJZWEkxOExXNUJXPzlDUSJIK0QsKEpLKDo/KFhBU0QjU0JMWCsKLU1BLDArKVdTS0UsLk0pMSkpODAiOk0oKElUVUpFUl5UOk46XT4mKys5MVsiV0xJVUMlI14sIFVXWyBMSDAKLU0gIjgtPjJPXz8mR09YLlFIJzo3NTJOTUYySjAwIVM/VF0jQSYsQFQgXVAhTTdEJEU/TlhdK05MMlpAXEIKLU1YIy40Xzs4LlApT00+J1E5NFwgRDlLQDNIPzQgJCxMMEYkJFRCLiAqVlxAQyBMSV9fMDY5RlwpVy8uLVgKLU1TKFtZVzI9S084WUZCOzggIEIkIEJAUDdOWFpENUpeP0owOSdMQzk9MlVfQEAtUkoiTyNeVjQiSENIIzAKLU06UUlDKFEgID48RC1QLkc/KjsvJlJEVyw3RTU8WDJQXEgmJFoyPU8yPiw1LCFNOlhOVD43QVBcQC9AJE4KLU1FOUQpIF1cWF8wXDVZIlxDPS83TFRcXzwiLDAkTC1KXFM3XDlJQyxGIF5EPyBEWCckKjcmXUpNLjIxTUcKLU0rMClOLzA4MTYiR0s9QUMxXz0tQUIiKyxXNVxbRS5aLDQrUEo8QCE6WDAiJzxZI1sqMy1TOEIpLi06WCgKLU1YTCldT00uJ18wN1ldU00vSDUwXzlQPSVVXTBGJDcnIiZAIC0kICA+QTYlOztEXEo6MUFbWEFQJDQjMEsKLU0rXVRHW0YtMDw5RkZSPkQ2Q0RITiohPCg7Rlw6MjFFTiAgKE1QPz04XyxKVjkkTEg6N1I3QC0hOEwsNygKLU0rNkw3PVs8PFkwMzMzQyQwLUpeK1RXLzQ6NVNCNEAlIyQuMVtOJVcoVE45NEFTPCgmKDI+K1FJWFI1I1sKLU07LD8jRSc6ODZMUSkzQkBJVU9FRVRVUik1M1AsQFokICNOTzNLOj0hM14zV0UzWEE3MVNbVyMqXzdRWEkKLU1SXTc5S1U/MlYoMlpTK11ETCorXU1RRiVXTEhRID5AMCAtMSFGITlbNy0vJS4oIC5VUVxbM181SzdITj4KLU1GIy1SXCU8MSwkJyFTL0RQLkNXKis1RU4yXSBOPzk1OiAkSE1AP08jVC8xMihCQTBNUF9SXFU8MyUhLzwKLU0wRVVdVUNEOUY/QTkuIVAgREEzNkFLLVdON0pFX0YkMk1WJUogIE1fJCdAQTg6SVAgTCYoUCE5MCdHTSIKLU0sV0c1LCAxSygtMCkwIUFYWlo1L0tePVZMVVZfJz1eNE9cOFMwI11bTyhUICA2JCBHJywyXSVUJ1g5PVgKLU1ZWyRPU0VGWTdKSzpNIz05WyVEIlQuR0EiXD9EPzhCJCg3QE5IRkUoPzElI08oKS0/VC81JCAhOl83LD8KLU1ZJTBISD4nPDNGKi9GMD08X15GXkA6WF9aXUI7KS1WMDcpOk8gJVBXRjBEV1lKTjg1I144UERWU08iLCoKLU02M1UhXi0oQlQjL0dJXy9WRUUyJUNaRV5LWzg8RkAnICVFKFxYKlMlK09YQC9SL11ISV5ZWkA/VydCO1oKLU0tV1xDIlUlJSA5MlskKTFYIE89VFAoUDs3MCJQXCw5VUo9TlklLis5PE1dRSNUTSw9UkNAJUZXVkQ8KTEKLU0wXEcvKVk2SzU9O0JZQj48SismRiAjVEEgKlArWVE+LDxfIiBZNiJNLCU1LyYvQlcqVUMtMjhWSz1VQEsKLU1FP1VNQ0dOMU5OPT87Myk2MlFOTjZPOSQ9I0YlR0dRJzo+TCAiMSAgPEtELEwmXVNHNlg6TEQ4ID4lVUQKLU1BIC1fWFwsQTcuLkkqPUdYMSknIlgsP1IySlk0Mz5fNjdKPDVWTUg4KFdWPEo9LV5JRl5ZICAlPSA6UiEKLU0/QV5JWD4kRTkhKls/Rzo9SCQ7UU4jUiBfSj8vMy46QlQgJVNLOFNMVUNBQkI8LyRRMDddJ09CNEg2WzUKLU02RFkpLz4sWCcvPDA/NCJVME9BLlNTTEE+T0RFPDZPID4zT1Q7LilESlpeOy1cJSowOzYtVSY4ISAiQSAKLU0pVERRK1gnUC5dX15TQjEhKSFZXyhMXFEiKF9BICtGUj0zUiJCITozUzNcWjpYRlRBXVgoR0Q1JjokVkYKLU0jL1c7RFknPykuUDMsJkEkKVlGVDA+WlZAPEsjNiApMVw9RUgpOildPUcmLSA0WDAgLU1VRSE3UjheKDoKLU08JiQzIDEgSjkuLlBGX15QMkYlJEpFMCY9TFIkUSxAXCBINFpUUSZGPiUwOSdXVClbMSNDPzdMICo0UzcKLU0nSjtUIiMsICxYUyFFPFExUiNSPFtZIUgtNk4mWTo+ViUuN1JFISxbXjMzOkM5KFo4K1AiQj1XMkRGVTkKLU00XyU9MyMtRTUhMUZfLSpWLlgwKis7UDM4OkcpPCAgJyxRIiYuSk07RkNLUi9bSz0sRDs7VikhKjYuQSkKLU0xTDRIQyw4PywlTjolUEFFQCdQSUErJCZPVzYvSVhRNSVeIjRdMTtUOUg7RElbV1YwSzdGLCJQICA6JCAKLU0wNkpHKlkvJVUnQV1RTktDSzJNTCpfUiQyXyFVS0ExVTYnTFQ4SzlaVlgsMSMlNCJGMlxCXV1aUFsgIkIKLU0uXFZEXTw1L0JFTUVCW0ItXF0qIStGRDAgJTRRIjpNOFRKOCwpTE02ODguJzpBU1RQNzYnWic4TDEkPy8KLU0wOiAlR0xEKCFDWkBOTENIWVxfIDU+J1oxKytPIDdaUCkiIEU8XSVSXjgnRE4gNk4hUTcsQDsyT0MpRSIKLU0zNywmLE9PNkdPRzFQVCAuUiktLzBbQCxMODNVPT4vKTZfMiw4SS9fIUIyNyZaXTJeOE47KDhPPz4jNTQKLU1YOy1aVUVcJT45K19RSjRNIDExTyQhLEQtIitVMSIxXT9DViNJWTMvJkFaIjJUIFE2P0ssOTowXyFXRiQKLU1LO01ZTFgjSTpHJTk6ODRCUjYtOTZPVSRHRC05OiUtSVQsOC5ZOVxYWyUzNy1HMCAqRiQgT1MpUyJbQFQKLU0+I1BUODtaU1pAOSpFKTZMQz8mXzpTPCpfIiNfR1o7Uy5MWzRGXUAjUiJXTEZdTklSPVkpXiZHIlNQQFQKLU09RVNLRFA2USoqNyklUVxALEcjTyAgODAgKV9NXk1SIFM8LzsnVkBYK0o9WTYvNjooOlNGNjVAM1U6SUYKLU02NkI7LDJBOVtaRDVIJ1smQTNOPUpJJURBRFRVOjNCQzgvPkNMMCVdMC5cNkYkMFxJKj1cVj9OOyckJSoKLU0pVlg3S0U/TDhIRkpbUitbVzs6QlteMDdYO1dSLFY6KEAjPlQrI1pfTi1aMSY6UUQiLTNUOkRYVV9WSC4KLU05VTpZJSQjOy5cSVgqSU1IOlMrJVY/Nk86O1BGOSpMMEVbXU1QIzxcU0tKREwzNEFDNFReQ004Plo6SyAKLU1RLVU7I10/XCUjWT8iRCA9ND8iVj8mSipAWj0+MjJDKyc5Xi5LMDImWzhSJVw7XkBVNkM2Py5MQigmNF0KLU1MRiglVlIkIEtQSFMpWkFfMkBVQUZXKFFFXk5AO19VS0g0TCtZXSA6WCM7L0pINUY7ODBNSCxHOSQ1SlAKLU0rLVQiUSBER147Rz5BKUJELUFfRjJGJkUsU19KSlpcNSNaMCUoWSs1WiAjRCQgIVtKM1hFWitaVUE8J1wKLU1KLzE9JyA8Pi8iTkg2UEAsXjclPSggKzYgISAoRlRKVkxYO0o7K0VFLjAnITI4UVk9P0YtVykmOyg2WVEKLU1bQi4pTz01TUwrMEIhSDowKVtPTVpOLCAoR1AhRiJaJzZbWzNHVys4VjJeJyRBNTBRRk8+O0cjLzJNQC8KLU1VOTVRO0I6UjlLIk1RQzhEJzE3MzZDUSI1IFlDX1cvIFMlN08lVjdZKi8pNU8sP1dALVNNVy8xTltcWT8KLU1XJS9XICA3RyQpPys6PkBGVVcoXk0uMkpBRU4wLjIqPCxQPVUyV0tJRDJVJ143Pjo7RCNHJUBPWFEgUjIKLU1cISNSN1ZQMSk8LiswTEdZRDlVUyJXUk8hP1xNQTshIz02RE0qWDBMSUU/TyQtID9YMCIsXDBWSS9JRjsKLU1TMU5OKz9LIyE8WDhELj1CKTRbI05ZMykkW104Q08hNyAhPjc6WVRNJTcrS1BZJV0iUiZNUV4uQ1NSLkEKLU1cXkIlPzRPVicjSSAoRyFVPDlLXUkrSjo+Ric/OkFfISQgIkg5OlwxLko0ITc1MkZePUdaNFo9ITdOKzsKLU07KyBJNDQyMlNXUE5HIyolU1g+VkomRDROUCoxODlGO0FYQ0QmJS9EPC1ILkZeXighVFZeSTM8VDtOMDkKLU1ILENHRTQ5M0I4RE8zKDRHIS1DS1A6JyFaIDkpUEkyNU43SVAzWCUiPTo0WS5GLCtCUiciNU1NJj0hK10KLU1RNEcqRkQ3QjhELFk6LzE4NSYnWy9RLTpNTjZbMjM2SS5eKkFQJFBCJTFCMElUWSRWIlYmQEROPU8kSkcKLU0yPSQgTzIsMElQRiMjRFYnIVklJDMiSF0sVC4xIjdOM1lGTygrJTI6PyA8QEU/JCZCNUBSREJOSiExTyUKLU1ARiUjOkJLRShWW19ZSD8pNzlPO1JOKls1JyZHP0MtOkdUXCczLiY4SEkuQSxYJV89LigzICFSQSAtM0kKLU07JVFdO1lPRFY+P1kuVl5BPVYoVDQ8Ois2PkM+Kl1ZOFNTU182IikmPyE2SDVXNTkpTj1HNFE9V01WL0sKLU1ZQEk/WF9UWTozL0hIIzZIITtGJ11DJC8wUiQ/MF1PODZPNjZKUUw5SEZAXyAgMDAgLjhBWkNTMD4oVUMKLU1ZU0ZRW1o8Nz0yQk4xWVZLJSxNXTomXUYuOlVdJ181Nl44Szk3T1hfTDU8QCdaQFRDTDNENlQrTlMmNlgKLU02OV0iJ0NNO1BELDNdRV0uUCxVJEdbVSVeRTFDXSJFQi5SIzlLIkFLQD5LPTxTVCpfU0BDSlNALUVIL18KLU1RVSAiMVUmX0w6UjNAQDsvRFtWIj1cMC8jPy4+JldUW1U/XVQpTidKLidCM04jLiYsXCA+MD9DXTNLUEQKLU0sLkRMNDk8XDEuOEJDP11FVzhZUDE/JEtDPV4jJkQxPyQmRFdISjo6QT1DPTEhIy1AIUwiTjIwM1YzNSkKLU02U0RBLyBRUiFdST5eWVc4IEFIIFQ+QzAzIExNIV05OVw/QSwnO0NKQF1TMl0xXU1NO1o/IFRRJS9AMEwKLU1MWUUyVyBUPj5AOisqXFBePy8vNShFSCQgRiQgIE8mJDtAMEE0JjMyJVYpQic3TDI3VkMwPUk9Skw0NksKLU0qQypVQUJXQlRfWE9NPjFCLzFeMS1OVCpeVlgoLSUmXDAjVz1dWTlOTEAhMkpYI0s3WS4nWFFGRiY/KzMKLU0tOVxTRkU7MU9dKU5OPUAgVSktPiApUDAgLzM9IjUpPTE0K0FLSzBUK0ouU0hWXF9TN0lOTSJBV11UTyEKLU1SLSFHVE9DQEtKQFs5WlcpNUstTFIpVCtFOVchICVNKEJDVSpPQztUNE1HSDM3JzsoPDdZJygkKTJENzgKLU06TT5KMydQKFg6Njw9OU4oIC4wXCAhP1swM0FcNitSIzJWJVQ3WEIoKUNDSjQsIVJHJlROLl5UVTdEQi8KLU1GPDJdVVpBWUBBOiRILEpUNDtKLjI1UyYpTTMpXF9SXUxPPkZJVDNSMycyPihDIk9WTj41RENMIE1fNiEKLU1JPFJIWCtMPyZAX1VEPylcQCo1IyAgLjskKSg2LiVaTy5NPShPVVk6XFRFRjUqX1okTjk8WkdCUSElSDQKLU1AVSpVWUEuJ0UxNl1WMk1cRChYMCIgUDZRVkJKJys2QF1QI1ZPRDotPzw0O1JMUDFZTVZYQUw7MlZVITkKLU04NzkoSV5IKVpFPC9fWF0+MSlQT0NGPEEgKSwpW0JLMi44PFw6K0cxOFJZIF9SLUwiWF9IJEo7MCFcQSIKLU1QLVlcOj40UUFUSCMzW0JYTDgpLkNBVzI0JUAkKz0vVUJbOiNEIEVWWkEyNVQlUS0tXyw1Rkg9KCBVOV4KLU1BVkhDLUpRPi9bTVNTU0FHL09JMktUMDVOQSAgRSlFPyNfO0dNXS8vLENMSlBfLS4vSTI+OU9SKjUxMSgKLU1MPVteO04rXVcwTz1GJSo0RSAkIjNaN1ZZUVFSIyJIMkRPLjVNU1kxSTcuTkwzIldFSlIyMT1ASTtcTUQKLU0hJ0dSIkdaTlxINScySSY4JkA1XixOJVY8TFE+IFUiOyA1IjxLPycnVypUTC4jVS0tVy8mOV0jSjs6QCYKLU00OU9SXiwwI1g6KkA0QixaVVEhU0o0MiVWO0svJEFAIzwoPFpGVSs8NE5DRUxPTS4hUT5GK1tZLVVeJCoKLU1KXlUvQyYrTD5cWlkwIic0OUgsIEgxNVVZTFNDKj8qJCtQIiFVUSNFOUopPCckSkUvXkRcLzAxUiojWkoKLU00Oj4uKT0hMyBfLzowXjgoSThUQiVOOUAmRiI8XU9QNFQlQDRSKVQ6NV1OWkw5LERBPDpZWyFDKEMwNlkKLU0qXig5ViojP0QtQTVGQUxeSTJCO1ZCRTA6JUEtQC8xVSs5UUM8RTsjLlAgM1gwICEsJFMhKFY7UTA9I1YKLU1DXTkjU14oK0UvXjFRO19AOF9HOVJLRy1dTkY0SEBMUzoyPS05TjRTRF87RDJMSytcSkJPPVxKXEctLkcKLU0qMiM+RVFAVS0gUzEjKCAqI0lJTVdbKERUUyBfWVwrX1I0UDQyK0UhPz5UMTVTUSIoQC9aICAsMCAoNTUKLU0sU1ssJUAhVktDIlcwTU9CViBBKzszOCwtI1krVVcnQV4wTClaMVctQ01aJSk3IUsoX188NjokU08oN0EKLU08M1VWOkg4MSdcRV5eNiQ+QFU5LksiWSldLDMoMFVAUEwpMTJISFgxPytbTV0kPyYqUldIPEBaW1slVU8KLU03Wz1VUlRLIU5DQEMsMiIkLFEqPE0kQDZWQFVSUUQhIk9BXiY6JyJCM1EhI0QhRTNRJlArJyZAISpBPToKLU0jT0cvKF5BSlUvLyYmXCM7LDxRXD5cWCMvNE4oVEBPRUE8XyhOWDtFMUxKLVg4JDRDMFFbLEkoNF1FMl0KLU0yPickKV1SPFpLJTgyQSdZJFEgVlosOVoqOVtUJUNcKlxURkZTVz5FKFouRE9FTiJTKilSK1M0MDEnXl4KLU1HMS5YSiwoUjNMRSwsWlZcR09aWj1KUEEsQlksUzMoXiRZJlQ8L1s5LUtNPEVYNSIlIUtdMUxTPV4uOFgKLU1BXSlJIV0kNyZAK1FfQ1pVSlpbI04+WU8nIEAiT0okIFI2QCYgLEhJSDtGO1dFVE4mUF5WUSIlUTBVIj8KLU0wWDg2OlJHMjsqRChXVC1ARTFUQigqIFA7OzInWFwpPjlcNj5QU01dVCdAUFk3XjBOLUA7V0lXOlktP0YKLU0xJVkkWTgzPkxEVC03SVkhTUJGQj1AWCdVPUJDLyQ5UUEsK01TMVNBKEI8IDpRICBBUSVeTl4pWjo2QkgKLU1DPlJIIiI9LDg2R1M6QUhTPT0uTSFANksmTkI7ME9LPjgwWzw7RypGUk4jM1k6TlosJ0knM00+SlJOOFIKLU1QVDhWQSszJV08RiwtWkcmTi0kW09CSUNdITkjJSxUOk47NF0qUEhaMVoxWDg7O1hZLVxMJDNFOSVdQTgKLU1ZQCAwIkglXTMtI1ZEMFgzWTdQWEVYUi4zSl83SVxIOkApVkowWVJIQlQjKzoxWlcyKS5OMVYxIz5ETkMKLU1CP1g2IlknOVAxQV5JUUxPIDgiQiMlPkElUjUpXD1PJT8/PyokXDEtSD09Qj9NJzwzOU1cIUgrVT1cXTcKLU1fREc+OE1NWl8iTSk7RCI8IFdaMCAgKS8kJkk6RydZMlBDPVIzSEc/TS1XX1UiOT09JCY6USpMNVNMICEKLU0kVjxNUFdSKlYtPyhSLUIkRjdNPTpCKl4rXlcvUDdDRltULjwpPzNaJjxEQktVRjhSSUJBXilFSCdKN1wKLU05JyoxTCw+Nk07OFdFM1A5WlQwSD80VjVdMis1WUUySkZEOCJcLFlBO1AgICAgICAgMCAiICAwICFQICoKLU0gIFggJEAgNyAhUCAoQCBJICMkIC4gISAgJEQgNFAhPSAmQCA8UCFfIChMIEYgIkYgKzQgUFAjMiAuKCAKLU1cUCQkIDE4ISogJFsgNFghOEAlVyA4VCFIQCZYIDxcIVlQJ18gQUAiLDApKyBGNCJAICo8IEtEIlUwK1IKLU0gUSAjK1AtLiBWWCNDQC5PIF0gI1xAMDUhI0AkNlAxXyEqMCRSQDNQITE4JS8wNUUhOFQlTUA3QCFASCYKLU0tIDk/IUhMJk4gO0UhUSgnMCA9TyFZWCdTQD9fIiMgKDgwQjMiLDgoXkBETiI2KCAgICAgICAgICAgICAKLU0gICQgIDAgISAgJCAgQCAiICAoICBAICMgICwgIFAgIyAgMCAhICAkICAwICEwICUgIDQgITAgJiAgOCAKLU0hQCAmICA8ICFQICcgIDwgIiAgKCAgQCAiICApICBEICIwICkgIEggIkAgKiAgSCAiUCArICBMICJQICwKLU0gIFAgIyAgLCAgVCAjMCAtICBUICNAIC4gIFggI0AgLyAgXCAjUCAvICEgICQgIDAgISAgJDAgMSAhJCAKLU0kMCAyICEoICRAIDIgISwgJFAgMyAhLCAlICA0ICEwICUgIDUgITQgJTAgNSAhOCAlQCAgICQ4ICAxNkAKLU0gIDg8QCI0OCAiSCJEIVdXJEhUISYwOTAgW0wiWDFJOCFTMDgoIVROJiksRUNASDUiIkQgIDAlMCQyTDcKLU0rUSNRITkoJjYyMCwgIDwgOCBNSiRWLEE0QEsqJS4wOlJCMC0gIywlTCFKRSQtVDFfUUMhJEFII0pBSEQKLU0iUDwhNSAmQCBFOC4nUEk4IVIsNFswUSUiXzgnUDArSSIrOCtIIFJWJjlcK1JQOTwoKDwuOSA8PChUNDwKLU1IQCJDJEA8ICAxMDAjQ1wnR1FAOyI1VEJbUi9MKTwwOTIxXVUgOUxFXDE6NCAgRCs0IFVbJEIgNTEgI0sKLU0kJCQ9XEBEMCdNOC5eUV4sI1FIJlFRWD4gI1goVCBaIyk7SEBSQUdQJks8ODkwWlImL0QoXVBcQiRfJCEKLU0rMF09I0skIUZSMCAhICAkIyBGUSNdRDBAMU9IJywsOEhBTUshPjA6I0I5IiRcPDojUjs6Ikg8RiwiME0KLU0hXVAmMUE6VCYiVDpWUiMlKCUoQTBRIyMkWFwsWDBOLiNQLDJKQSlCJz8wICAyOzAiWSxDSlBeRyVHWCEKLU1CQChUJjowRj1AUyUgUSQ6V1EuMCZbSDBCUUBTI0ksIz8hOkAgIEw2MCIhPCg8ICooQEdaKE1IMyYwPzAKLU0gPUgmTFFQNicnSERGQVJYITxALFNRNEoiQDwhOiIqNyAkTCtcIVYhJS00OzkhPF0oTiwvQiBfLicgODwKLU1MUS83JD0kIDkgQEQhO1AoUiE2QiYxNEYuQFhYIyogIVwxXTAjNkwrSzBUWyk5NCNbUjcmJEZYJl1AICoKLU0lN0grSkBWRidAKCFeMScmIyFUK0FRUzQlI0Q4MTBILyMrTDlMIidVKTkwICVAXzcnR1hFXzBCTSVbWDsKLU1AMU0yJjdcKS0gJyQlWEwoMEFMSyZZNDNHMiBPKFhQNygiJ18hNFwgIEEqICc3QCxXQStLKDs4IjNCKFgKLU0oXkgpMDIpSiRULEQ4ITc7J0IwQFxQSEomRSg0RzBHRyNaWCYvQEsrKDosIVNSPCAgIFRBLCEoLSRaLCkKLU1CIVNdIk8gRCQhNDEkWyw+IlE5WiM+JDM1QEYxJkRMRlkiJlEnPFxARlFeWCJRLDkqUiY8KTgoMTtRU0cKLU0gJUwvJCFVTylCJCMkUicqKS1MOixBQCgjNDQhSzEnJyZdKDk2ICFKKEo0IiQwUlQhTSxDLCFNUydGMDsKLU0+IF4iIl88IDkwIVciLVQiNjFKQChUODhBUCxGIUFQQkQxQU4hOSg3WEFQSiZeVDwsMSI1KSdQRSJBSCsKLU0mOSAqRCI4KyA/TDdeQCIvI1pIKllCL1wpLjwnSlA/NiNWMC0sISotKT9cLDhQWCYoJ0ggQjEzMCYzNDIKLU0lMSA3ICpAPVFAX0AjPlQiRFA0IyIrTCsjMCkjIy4kJzRAJE0hS0A3J1IsJShXVD9FQS1bJUtYICBCNSAKLU0iQVBGMTIjNSRaLEY6ME1IJkM8QiUyI1UjIzA7QTFFPygjXClLQDhWJlYkJTYhPUgjUlQ3OSE+Vyg6TC8KLU0tMio4KFQ8LF0gWFkhIDgsVCIwLiAhICUkIjZfIyU4ME9RJzEoLzhFNyAzNiU8XDEwIjhCIUNYKU8gQyoKLU0iMEBBKTBDJShdXCJKMUdGJFpAQDsxJz4nXEQpJ0BZKSY6PEA+MTxXJE4gQjIiLUsgJlgyLCBMTSVYIC0KLU1TQVlRIkY0JjFBQUwlPjwtWzA1QCA/TDgrUEQ8I1hMP0wwXTghUFggUVFfNSBFSDxFQT5UJjBUMSAwJyUKLU0oSyAuV1EtJChMRDVZQEVdKCwsIlVBN1AoUyQtICBZJCUlUCkwQiEkIUNYJStASD4gWDw2QyFISyBAVCsKLU1VUjZOKDgsLkxQVk4kJEQ3TzFDXiA5PCg3ICNQJiwwKjZQWkQoM0whRSBRSyNGRDhUQSAmJElMIEwgKVUKLU0iUjREMiFWLyQ3XCszUCo2IStYOyRRPT4pPlwtSFAkUiJfNCA+IUZCKCA0JlJAR0kpN1BDUSEvPSk+XCoKLU06Ijk2JzNUOEgyMUQiL0QmLzBRIilMKCEuUStXISwkICBRI1AjLiRAQkFOOSFPPDRXMT5eI01cM00hXEQKLU0hTlxENiI5PSZPMD4lUSQ8J1UwJi8hMkwmJSwgNFAnWiBDTC04UDgtJ0VEJF9AVzQkRVQ8NDE+QyI4LEIKLU0tQipCKSg4Q0oxJ0ogITAwICApQCY1SDkoMU0yKS9EKl5RNCwoNUQ3SEInKCg4NCAnUEsxKFRIP1lBVCUKLU0nVSg7MCFSWiAyUCZZISQ0JT5YPipSMVklUiw2TyFcICEvSDZVQjk8IC9ERTlCN00pLSQ+XjAsLCAoODUKLU00IEpLIkQsNV0wLlMjXyAuREFDXCYgIEIrUS1WISQ8PkxCMlAgNyg4KVAnMiYsMCZFUVRLKFI8PSxBLTgKLU0nRFQlKkAjWSBZUEBFUDxRJFBUJyRAPEkiUEAsWUA7SCA7LDovQCBRJlFUIztBJSAkPVAjUzEvMiktPCwKLU0kMT4jIkhcM1tROk0nQUgxV1ItSyU+SEZFIDdOIDJEJSRALC4oKzA8WiEuVCMrTDQ2QjM3Jl1QOlwgTTcKLU0mMzQkPUBBKykoRDYrMiJcKSRERiUgWVMlKkw2MTE/MCVHWDswIjRcJjVUN0ZQUyUiPSglRkBSWCdPOEYKLU1RIiQuJ0FEMyhRQ1AgMyxATVEgUic/TD1aQEc1IS8sKClBLDUjVSQwMEEnMiJbSDgvQEw1JDMwIUggQSoKLU0oXSRCTkIpWiVLJCYkQTFIJTI0MlUxQUInQ0wgIFIuUCRQND4qMUcuJkg8QlhRL00kQDxFUlAyWSBKLCEKLU01UDU1I1VcJTwxPiAmXjg3NiEtXSQtICI5IUQhJlc8QVdRRiMiPFhDIyE/LCYqJENNIDxPICdELUhRMCsKLU0oUkw5MVAvWyAvUCI3MSZWJyhYL0tBUkIgIUA6XCEoUSUvTCVCUiEyJjdUPV1AQDshIUA5KDEpWSMsQEIKLU1OIFBBJzBULj5RVVMpTURANCI2SyYmJEZXMTZdKEIoKUNBX0clNDQwJCEkWiA2UCI4ID1aJlNIP0dBIiwKLU0iOVQuI0A7OiBaMDA3MVsiKSw0NDFALiggKig4PCFDKSQxUCMkQSEnJj4kLytRVE4lLSxGWTA9TyRLMDUKLU0pQVVKIUMoIk0wIyskVChDIyFaWSMzJEE+UE9FICJUQEEyJUMmWDBFXjArJyNaQEA1IjpAKDBcL1dQVzkKLU0hVDgyLFBaLSEhRDkjMVtNIVs0LVNCJVMiTDwkKUBSMCZQPEQsQCAkI0UoLFswPFwpKzglNzFLTiAwREIKLU1DQFMzIUFQRFohSl4oKVguWEA0NSkuKDlXMDJIIy1UQz4xVSggTlgmMFA5OSlFICtCMEI7JCcgNzVSIE0KLU0hTUAkXFElLSIlOCZDUjA9IEFQMTAxT1cnT0RGViFSNiZTJC5QIShUIVgoKy5BLjAiRUQxIiIzWyI9PDAKLU03IEJNIydUKjkyOUEkMUwlN1AnOCZOPDxDQjNAJUY8KSExWlgjWVQ8UlAxSyhaQDk6MVhaIiI4NCtSOycKLU0lI0hDWiBPUSU9XDw0IExCKE4wJSsgID0lWkQkRFA9KCFaID1RQF89JT9AICEgXUAiPEgiV0BPVyMjMD4KLU0hQSNDJ0xcPC8wNCIiVUAsM0BDKSg8JDlBQCsgIV04RS1AUz4nRDwjL0AjNyAvIEJYUEAnKTM0ICYgNz4KLU0gLFRCOyFfWylAPCFVIC01I00wN1YgOTckXyA4NkIgKikgSCZTQERPJkdYQSohX1khRyAkLlIsTCAhVEUKLU1YIixSKUdEJipRJlogKkwpUTAsICE5TDFNMS02JzBAJDUwNEUoSTwgSkI5SihXSD8zQDFJJUJcNi0gIFEKLU0jQDQzREBcQSUqQDQ8USlTJD4gI1VBRzwkQlA0SDAjViY9WDMxMUNQJFBIO1ZCKlwkJTA5R0AoUCNbID4KLU07UUxeJik0LEpCNTEgLCw7RCBNNyMiWDciIEpCJi9UOiBRXUYoXkgvXyBNPCVWTD9RMV9YKUs8Q1AgQT8KLU0iNiAzSUBJTiYsUC8gQiUmKFQwQkwgWlMpQUQ1XDAtJyNGUDhSISo2JkxEN1ZRRSQgXlwpTUEgXSQtJC4KLU0qQEw6KEM8KU1QUSUmJkg8P1IuRSNKVEJfQUgiIiUgJSEgP0AnJSghJTAqVCc9KCY4QUAlIV1QIkZAV1MKLU0lODw8VSBXWilMQCNJUCZOI0MkIVBAPDIjXzggJzAuNCBTXDJYQiozICpEPDpSNj8hPyQxL0EnRCFUSCYKLU0gQFM9Jk1MO1oiLispLjBFXyA7NyZaOEEgUTRcJFEgIjJBPyIjTjBBO0E/QycuNDBFUEFeKC4gIjAiL1wKLU0gXUgqSyFDNyVNWCYqMig7ICo0LTdAQ1shUDw4KDErXSEsSDlVQS9SJFkkLClQPkYnKUwkRCFEMyY0OCMKLU0sIFgpJThEMycwVFIlTzguWCAjIiY8QCBAIDhOJCkoQk1QOTMjV0g8OTEySSEmLEM/MDQ+JVwkLlRQUDMKLU0iIUhCJiI6MClJICwnMTFKJSIwICEyKEAhN1hCSSAsUyEzJERTIicgJSIoIkUhMj8pPUgwWyFXTyBdKEMKLU0pMFElICooLFZRMy4pSTwrRDBfKSMqTEchIjhVJiM8LU5QWyQiRzgqTzI2LChOXEJKMD0lKEVML1tRQTkKLU0hIDAwRiFPTic3QCYuQD4jIUowK09SLC0mP0gnQFA8Kig5JDdTQDxPITtEPk5QNyEgIjApUCAtRCI6MCgKLU0tQEo9J0k4KlVSLzUnNzhCSiIjVCU1LCJfISUvI01YPTxRU14gIjw4SCEuWiZLSCFAUjglJE08LCBQO0sKLU0pPEBDR1AiViVYJCAsMDZDKTQ8IkJQNEooUUAqMDA9IyNFNCBcICZdI080OChQWzsnTTgwQlBSJykmLEEKLU0nQElCIkhQIkFQQ1ghMig3UUIrWiAuUD5MIDklKDVIKydBL0EkRFwuQSI6XyJENDJWMjlUJipMNEkxLkIKLU0oVVwjNDFWUiQ8NENdIV5RIDlMPDpRJSwjVEgyU0EkWyVKQDgmUVI4ITFYIk4yKSUpMiA5MzBMUCNfQCMKLU07QiZZI0tAKj9BL0cgMDAnXUBdISVdXDoqIDpPKElQNEIgI18kQSRFJCEsQSkoPCJRIjAuJSNQJiQgLFAKLU0mRlQ6WlA2IyE1JCIyMEcgJVMwQ09SI1MnVDgxISIvICg3XCVDMjMiIC8kLCMwUTkjUyhBJVFOWiEjVDsKLU0kIT0lIFRcPidQKj0jV1ggQiFQLiFWQCY5UiwjJzg0RlUxU0gnVlA4NDEkSyM8NCpQIF9LITlQN1IyLjMKLU0lVVggTDEyQiVfLDYqQTtWIVs8RCRQLCUhWDg7LkE7ISAqWCAgMVMwJi8sKzdRRF0jSiw9LiA6OiAsOEIKLU1IQT9XJjY0PD4wXlghKVQrKlBQJiVNOCBEMjRKJUdUI01QIE4jIEwiIlBUPCdWMC4wQSA3ICo0Qk4gJl0KLU0jL1A3K0I6ViQsMCs2UDgyICU8MFhAN1EjKDw/XCFRJSYwLD9NMUFRJVk8Qz4wRCslTEAlSVFZVSIkVD4KLU1YUjlbJy5cQTdATF8hOiw6JiAgJiM9IDo8UU9WJyBENjogXCAkT1w8KiBWMiE7QEYlISZAJEFUMSohME4KLU0oNiQuKzAwKiA8SCwnUEZHIFdQPjtBNjwiLDREMkItSiZDNCFNIS5cIU5AMVpARUggSEw1NUA0JiFcWCcKLU0mQU9bKDgwLzRAVDonPCAxNjFXXyFZXCs4UD8tJS5UJDoyKU4jRVgzWlFOSyZSUEVdIU40JCIkPEYyOzIKLU0mVSggKlEyUCcwNCQqIikzIT9cNlMhSTElLyBENjFUUyQ6UCkjMCAoJDlAPjRCLDImICw/MyBDOiErSEYKLU0wISMzITA8OC8xJ0MkI1AhISAmXSc/OCJXMCtVKT04IllSN1ghVkwzWSIyLyc3ODhCUTsgKC5ILT8hIF8KLU0lKkggLTAwSCAuPDFEMjNBJSgwJkpCLzQiJ1QzKlErRiMyPD5HUSUiJV5AMkMwXS4jUyghJ0InMCFHLEMKLU0oQDwxJS4sP1gxIlcmXEw9TlBIOCNRKDlJMjQjJCY0RlcwUCcoO0wyPEFOTyM1PDkqUVhNIl9ARDkwICkKLU0nPFQ5UVExSiNcMD9WQTZYJkAkOjFBKlsmOjQmWFEqXCNQSCgyMEw9JDlQNT4hSyQiSEg/Q1AqLiVJVDoKLU1eQStPJlIsQkIxUy8pRlhETUEzLyE4VEIxMjMvKSNYIi9AMjcgTSBCNiA9NCk5IDohUDkpIz8gKykxI1MKLU0hXlw6KCAxRyRSUDJWUi5FJj4oOihRMFcgQjAtVjFWQCQ+PCc4IC0hJ0ksKz1CLEUgVzQwPDBALSQyMD0KLU0/MU01I0EgRT5SKF4oXyw0RSBOUyIqODNKIU5SI05YMzFBNDkoPzQkIyBPNiM6MChEUjUzKCNYIToyMTsKLU0lU0AlWEA8LyFUVCYpMUdUIyk8MkgiJDooNzwuKSFQXyMlLChfICAhJCUgREpQMSgiWzQ9SiIyWyIgND8KLU1EME03J1hYMTUxVzUhM1AyUUBJPic9XEIiQiEgISpAJ1YgXDglRjAvM1FHQSgoMDpLMVFQJTY0ICVBLCQKLU0lNTAlWzA2VCUoXC8/QStSJitcJj9QUjMkXDBFUyBDQSlHPChXMC1LIUIoMS1QLUMmRlQqKFE8QyZUKDgKLU0oIFVBKDssIT4wNzYlWzw6PUBTUSI5KDkxQSchIzhcLUYwKUMgIEBARCBbNyhRJEFBIitZJElQOz8iOjQKLU0jWCBCQUFAPSc1TEA5ISsiI1xEJEkgLFUiMUQrVCEgKSQqQD1fIFEvIUk8M1ciOkwmSzxAUEFYKikrLEEKLU0jQFxZIjxENUgwJCwlPUwpKlFbMCEwOCxOMjQ7JkU8PlVBOTYoSlA8NVFUMSg5KDoxICNfJkUsQzBBPlYKLU0hL1wlXEBYPCMrUEJDUCorJSJYMy0gXiojPCw0P0BXTiUrXEA5QCBUJ1ogNyFAOEYnQiggKlBCKCI9TEUKLU1MQDhHIyZMJjxQVk0jSzhAJlBGMyMrOCsnIig1JV5cM1pQRUgiLkwwRSI6PyVcJEVdUTczKT9IOkRAMUIKLU0nIkBEKUBSOCkiLEZUIThPKTtMLSYgL0AoXiQ+QDA3PiUwNDlOQS42IVNUI0ghMEIgODg2PiIpKyIjMCoKLU09MCUqJCUoNz1QMCgoKjwnPzBSUChIIDEzIjJZJFUoNj9BLy0gOEAoTVAlOikvIChQMENYJFlcQUZQLi4KLU0hRkRCWiBGKykjQCMgQERWIT8kM1JQSEogLTA2M1AjUCYmWEAnUSAsJDdARiRQQyYoX1gwREBUIic7VEUKLU09MT03IFRUPFVSKCskQ1g4TTBfQikuQEZeIFlFJEM8IyxRQU8oVkA0XDAqPSEjIEU0UiZSIlAkNV9SIFAKLU0jJCQuLiElKSFCMCg1MEc6IihcPD9AVkglJzwlIlBOMSJGVEIhIjdaIzA8LS8gIS0iLVRAWCFfMiUuMCkKLU0yIi5IJCJcIigwJyMiXDA2TCBWPihOUDYzMC1RJ0xAIktRVF8lWywuQiBWWiVJOC8zUideJ0NALTkxICIKLU0iR1g8WEEnViA7XDtLIVo1JEEkIFtROlMgU1gjIlItQSU6QEEzISchIl5IRDQxWz0oQSxDJFBWUSYgUCUKLU1KMDozIz1EIU0wOSQgSSQmLkImMSVITDckMF1IIUdMN0EgNEAgQyAzP0EtVSdXWDhBUVo2KDFUJkZBLCYKLU0gICQjVCA2IylLXEFDMV9WJTVYME0wJFYnLVArIlFGQSRFJC4nUSg8KS8kMyJAR0slVUwuOTFbLyIoPC0KLU1FUjtHIzw8LjAiLE0mOUgjJTBOSyRHSEZZIVk5JSwgLTZQM1EiWSw/LFEoUSBaUDQ0UU0qJD5cP11QLUIKLU0iMEgzLSBHQiJCICdWQUZcJiA4KUgwSFInPyBBXEA0LiQ9UD5YQEleICRMPUpQSV0oQ0hAPUFVPiNSOC0KLU0tQV1DKVA4JT1QNVknMVQgIjBRICdAUCMvUFleIVM8NUpQU10kJiQnVEInUiAuLCUmIFROKDhYMFwhJTwKLU0nSlA4XEIyISY7RDo+QF83JUwkIlkyJCElPTQnSjAtPiErPDJeIVNYJDUoP1YwRUElNEglTSE1KyM6RDEKLU0jMjtTKDkoJiZAMjwnR1w3OCAiLSgmTDchUSNcJC84RTohRjQkX1gzREFeJCBBTEM9QVY7IT48Kl4hRC0KLU0jVVgvUDA4UCQhKD5SUV9LI1U4PEEgJTMkXzxDJ0InPCAjXCNAIFYoIFNQL0pSMTogMkgtWEEiMiBCRCMKLU1QUFhIIDs0OzhBQzAgOEQhRUFZVyQwNDZEITpPJiFEKzYgWyMgNiRBMyE+WyJKRDMlUVZSIE04OkQxMUwKLU0jXjw0XkFMPCglODhIUS9cJzhEP0AgOyQjPkAqSEFRVig4UEYxMSE/KFkwQ1NBOlIhKkgpTiFANyhMRDwKLU09IUldKSgkOk0xJzskWCwjIFAqLiI6SDU0MTVPJyUoOEwhWzIoNTgxUFFJIiIlPDM6ITcsIDooISAgSDAKLU0mNlghMSEjLyBMWDpdUU07KF9IMk5CKSciWjggWEApRScnJCBQUVtVITs8MUNRNEApOlA7MCI1SyhQXCQKLU1GUU43JzhIKSQhSE0oT1wzWkFJWyEySDNCUS5LIjtURjNQVlohLFAnMFAyVSkyUCkkUFEhIFk8KUtRNzMKLU0pKSAqOyEiLCdYKCU9IUpCKDMkKiZRUl4oKlAjO1I6LSIuQCNYQTdAIDVYOCVAPCQhWkwzSzAnLyVTID8KLU1PMEtMIzVAOk8gVU8gRlAqTVFQUCI2VDg4QUJZIzxcK1oiN1QjUDwpRlI7OylFXDZZQCpMJFtMJjgxUSUKLU0jXygkNDBdKSddLDIlIERGJFxQQE8xOigoMzBFLCBQKiFZRCNLMDM+IVpAK1NBMjwmOTAwRiFbNSdGICQKLU1WUjQiIl88QSZARlwhR1g/VCI4SCVPOC1eIDVRJ1MsJDxAMUAjQSgvWlFSOiBUXCUrUC8jIEI4OjlBWFQKLU0nWywwUyFRSSJfREJbQVgxJiIsMj8yKyYhVyxENjAsJCMlPDJfQjFBJ1JAICAxWUAlQUglXkIgXSEtRDoKLU1cUVkpIElQQCxASjUlLDg5I0EuVyZKOC0vQSohJTA0L1EiNiwnMFAvSEE4LyFQPCFLUUZRI01YQFsxI1sKLU0nQlAoMyBeWChBOCozMVheJC0oRj0gVkMpPCgoSTFBJyhJRCg3UDNBJyAkN08yLF0kQTA0RCEvPyUiTCkKLU0iIVlHJ1RQKl1ANDQmVDAnKFI6KSElPDchMichJSwwPyxQN0klOCwrTlIvTCcuICk0UEZeJTc8Mz1RKkYKLU0jLUQ6M1ImWSYhUD5BMCArJ1AgLjAhT10oO1gwSVAvSiVLWEJHQEBOISBcQCNQSyUiKzhFUiA7NyYmVCEKLU0hQiVUKDI0QVxQW0InVUA4QEFaISMhRCwrUVszIC5IQTtCLV4gUTAtTTE3VSZVPEIsUSggIEswLyUxJkUKLU0gTlQsIyA6QSg0KDZCQjBHICU4RiEgPE8lXzQ2MzBPXyFTLDUwIUYgJSRIRjIwIDAkQEg0JyAuRyUkVDcKLU0+MC1MKCdMOiQgKlsoQjApMyBNIiI4IDoiQD1NIT8wQ1pBRVUmMVAySTBSNiIjPCAzMFlQJypEREIhTC4KLU0mOzgzRVFPWSdfTCFUMTghIE9IOUJAVDkoRkA7IlFeOSE4MCdaMi1dKFFQQ0hBOy4lNFAmVEFAPSZaVDMKLU1GQU9EKDsoOCkwPV8gXigjNTBTSCM+IDw5MDE8KFRIJUFRPlUnT1wyUFEoMyg0OC1KUUlBJlBEMUBRI1oKLU0lJihBJkBOQSdPIDItIUlRIjRMKl5RM08pN0BGSyFJIilJTEJVUVZAIEpULTBSMCkiWFghOFBGKShNMD0KLU1RUjFOJ1IwQEtBXlslNShANSBTXiAjQCFeQDBAIVNYIl1AWE4jMTA4KSFANiAqND5WUVJMJS4wREUxLl8KLU0iX0gtP0E/IClHQEVOQVo3JlwwQDsyK1sgQUQmLUEwViJcQDdRIjsqIDRMMVIhICElLzBCJFFGJiU5NDEKLU08ITpYKTQ4KjUxUT8nT1glQUFGOiVVODhEQVVYKE0oLEwyKiglLTA4PVFBIiRBTEVQQFowJDlQPD5ROzcKLU0mMihELDFbJiYsTCE5MFY6IVRQQ19APFklU0wyL1E5KCRWVEREMidbJCEsOSZQWlAoQUAmS0FNISFRSCYKLU0sMFNUJVggIkYiI1cgSEBAP0ElJyU2PC8jMjs9JVc4MiciNz0lTiQ5O0A2QCE+WEBOIDMvJUU0JE9QLjwKLU0pJDglXSE6JSNGMCFZMCw5IjMoPTIwP18gU0AnSTE4VCkrKEQiQis0Jj5IKjFBMiolK1AgWCI6USIqPDMKLU1GMCkzJExIPE0hLDcpNCg2X1FMJSk4QCAvMDUsIUE4IlVARzomR0Q7KFBSKSMwLEFMUVwwKD88L1hQLlQKLU0mMygyOlFXLydRPD5aIS9CKFM8PVlRSl0nM0grKTBaUiVPUCBLMUUvJ0UwJlEgICIgICAgICAgISAgLCAKLU0hQCAqICBcICVAID4gIjwgLDAgXCAkRCA1UCFGICc4IEFQIjogKlggUFAjOSAvICEiMCRDIDNYITZAJVcKLU0gOTghTUAnNyA/RCInICkhIEY8IkNAKlYgTVwjIkAsViBWLCNEMC8gIF8kJChQMTYhKEgkT1AzViEyWCUKLU05UDZBIT1UJiZAOTghSTwmVVA8OSFVUCdIID9FIiJMKDxQQlwiMDgpNDBGPSI+TCouQEoqIk1MKyswTiEKLU0gICAgICAgICAgIFooICE1O0ZNTjtXPU4oJjVSPEZdUiAgSCAgICAgICAgICBKL1QgICpDXyAgIkkgOCAKLU0gSjBAICAqRCwgICJJJEAgIEoxMiAgKkQ7ICAiSSdYICBKMjAgICpESCAgIkkqUCAgSjJeICAqRFQgICIKLU1JLiggIEozTiAgKkUhICAiSTEgICBKNDwgICpFK0AgIkkzVCAgSjUtICAqRTcgICJJNlQgIEo2ISAgKkUKLU1FMCAiSTswICBKNyMgICpFVEAgIkk+SCAgSjdXICAqRiMwICJJQVAgIEo4SCAgKkYuUCAiSURQICBKOUIKLU0gICpGPyAgIklJSCAgSjpZICAqRlVAICJJTjwgIEo8JiAgKkcpUCAiSVNYICBKPTggICpHPkAgIklZQCAKLU0gSj8oICAqR1dQICJJX1ggIEpALiAgKkgpMCAiSiREICBKQUogICpIQFAgIkopVCAgSkJZICAqSFQwICIKLU1KLyggIEpENCAgKkkqMCAiSjNQICBKRT4gICpJPDAgIko3WCAgSkYyICAqSUlAICJKO0QgIEpHKCAgKkkKLU1XICAiSj8oICBKSDQgICpKKiAgIkpDOCAgSkkuICAqSjowICJKR1AgIEpKLyAgKkpMUCAiSkxUICBKS0sKLU0gICpKXyAgIkpRKCAgSkxDICAqSyxAICJKVFggIEpNPSAgKks8ICAiSldQICBKTjMgICAgNlQ1UjxGXVIKLU0oIyAgM0ZdVCgmXVc7RjVSICRZTygnLVU4VkBAOUZFTDkyIU88QiFEOjcpRThXMU88R0QgM0ZcQDxXNUMKLU06IiFQPEZdQzk3LVMgJEVOPSY1UjxHNVA9JjVEKCctWTxXMUU7MiFDODZRTCAkRE8zUiFFPEcpTzxAIS4KLU07UiFTPTYtSCgmMUU9RkVDOTIhTzxCIUE5JjFSOTctUyAkJVI5UiFMOjctVCgnMU87UiFMO1ZZRyAkNVgKLU05NixAOUZdUjs2JVQoJjVSPEZdUiAkKUE5IiFGOjZRRSgmWVU7NilFPEAhLjtSIUM6JkVMOScpRTtAIS4KLU07UiFNO1cpRSgnIVI7Vi1FPFctRTxQIS47VzBAOTZZTz02PUgoJlVFOzZdUj4wITA5NylNOjctUzo2XU4KLU0oJjFFO0ZFRTkgISI4NjBAODYxRDxGNVM8UCEiOyZdQzpSIUQ5NzlJOFY0QDxGNVE9NkVSOTYwIDEmNVYKLU06Ni1FKCYpVTxXRCAxRkVMOTIhRT4mRVM9JywgMFcpTzxXLE05JjVWOjYtRSgmUUk7RkwgM0ZcQDxXNUMKLU06IiFEOTc5SThWNCAzRl1UKCYkQDkmRVI5Ni1UO1cpWSAkRVMoJiRAOSZFUjk2LVQ7VylZICRFTj1GJUwKLU06NjBAODcpRz02VUU7RzAgMUZFTDkyIVQ4NilMOTIhTz1GNVI5RlFPPVAhNDtWXEA7NiVOPjIhTzwmNU4KLU0oJjlJOyY1UyAkRU44NyFQPEZdUDxGRUE9JjRAOjZdQz0mUEA5Rl1SKCYxRT1GRUM5MCE0OTdBVCgmOUkKLU07JjRAOEc1Uz4wISY6NlFFKCcxTztSIUw4NylHOTAhLjtSIVM8JiVDOTIhTDk2OVQoJl1OKCYxRT1GRUMKLU05MCEpOyZRRTlWJUwoJy1FOTZMIDRGNUE5IlVPO0ZRWSgmOUk7JjRAPFdFUz0mNU0gJTFPO1IhTTg2WVkKLU0oJlFJO0ZNUyAkKVI7Vk1FO0IhUDo3IUUgJCVSOVc1TTk2WVQoJzFPO1IhTDg3KUc5MCEyOTctVTsnMEAKLU09Jl1PKCZRQTxGPUUgJF1QOTcpQT0mRU87QiFXO1c1TDkiIUI7Jl1DOlAhLzwmNVI4NzFJO1ZYQDtGXVcKLU0oJkVOKCchUjtWPVI5Ny1TICRdUDk3KUE9JkVPO0IhQTsnKUU4NjFZKCZFTignIVI7Vj1SOTctUyAlLU8KLU04Vk1FPSIhTzwmNVI4NzFJO1ZYQDtWWEA7Rl1OKzctTzhWTUU9ICEkOTctVDo2WUE9JkVPO0IhQTkmMVIKLU05Ny1TKCcpRTw3NUk8RjVEICRVRTxXLUE5VjRAPSZdTygmUU87RjwgNCcpTz0mXUM7VlBAPVcpTztGPEAKLU09J0VQOTIhRjtXKEA8Vl1DOlY1VCAkXVA9JkVPO0IhTjtXMEA8VzVQPCZdUj0mNUQoJilZKCchUjtXMU8KLU04Vl1MICUhUjtXMU84Vl1MKCZZTz0iIVM9NyFQO1cpVDk2MCA0Vl1DOlY1VCgnMVk8JjRAO0ZdVCgnLVUKLU08JyFPPEcxRTkgIS88JjVSODcxSTtWWEA7Rl1UKCctVTwnIU88RzFFOSIhTztCIVM7Vi1LOTcwIDQnKU8KLU09Jl1DO1ZQQDlGJU06NlFZKCZZTz0iIVM9NyFQO1cpVDk2MCAwNjFEPEY1UzxSIUY4NlVJOydEQDtGXVQKLU0oJy1VPCchTzxHMUU5IiFCPjIhUDxGXVQ7Vi1POyIhRjg2VUk7J0QgMDYxRDxGNVM8UiFBOycpRTg2MVkKLU0oJkVOKCc1UzkwISM4NlhHPSIhQTxXLUk5VlhAPEY1UT02NVM9JjVEKCYlRDknKUU8VywgM0Y1VD1WXVIKLU06UiFJPFIhRDtXPU4gJFlFPSc9TzxGTEA6NyxAPTZZUjk2JUM6JiVCOyY0IDNGNVQ9Vl1SOlIhRDxGXVAKLU08JjVEKCYtTztGWUU4VzFJO1ZYQDtWWEA8RjVTOTcwIDRWXUY9Jz1BPEY0QDhWJVU8VjVEKCYtTztGWUUKLU04VzFJO1ZYQDg2KU88RzAgMFZdTjtGNUM9JkVPO0IhUjk3LUU9IiFCPjIhUDk2NVIgJFlPKCYpVTlGOUUKLU08QiFTPCYlQzkyIUE9RiVJOyYlQjsmNCA0Vl1DOlY1VCgmRVMoJiVMPEY1QTknREA4Vl1OO0Y1Qz0mNUQKLU0gJS1POFZNRT0iIUk8UiFOO1cwQDhWXU47RjVDPSY1RCAkLUE7Qj1UKCctRTtGMEA4NjlUOTcoQDxWXUMKLU06VjVUKCctSD03MUQ7Vz1OICUxTztSIU04NllZKCcpRTlGNVI5NllDOTcsWigmLUE7Qj1UKCctUDsmRUMKLU05MCEjO1ZZTjk2LVQ6Nl1OKCcxSTs2NUQoJl1VPSAhIztWWU45Ni1UOjZdTignKUU5RzVTOTYwIDUmXU8KLU0oJlVBO0dEQDsmNVY5NlFTKCZdRignLVk7NilPOyZFQygmUUk7Rk1TICQ5STsmNEA7RiVNOTIhVDtWXEAKLU07Jl1OOVAhKDtXLVQoJkVTKCYxTz1WWCAyJl1TPSIhSTxSIVU7RylFODYtSDg2KUw5MCEkOjcpRThXMU8KLU08R0RAO0ZdVCgmNU08JzFZICUxTztSIU04NllZKCchUjtWLUU8Vy1FPFAhNDtWXEA7NiVOPjIhVTxWNVIKLU08UCEkOjctQygnJVU7VzFBKCY1WDhWNUU5JjVEICUtVDg2UUUoJFkmNFIhRjo2UUUoJkFBO0YxTDkwITQKLU07VlxAOzYlTj4yIUw5NzlFOycsQDtWOEA8RjVNO1cxRSgmRU4oJyFBPSZAIDNGXVQoJiRAPFcxUjk2JU0KLU0oJjFFPUZFQzkwITQ6NlVFPEIhRT4nIUk8RjVEICRdVT0iIU85QiFTPScpRTg2VEA8RjVTO1c1UjhWNVMKLU0gJFlPKCZVRTxXLUE5VjRAO1Y4QDkmNVM6NylFOSIhVD43IUUgJFlPPSIhQSgmMUE9JiRAOzY1UzxWJUcKLU05MCEpOSY1Tj0mRUY6NjVSKCcpRTs2XVY5NjAgMSY1QTkmUU84VkxAPFZFVD02JVQ6Nl1OKCYxRT0mNUMKLU09JjVEK1YlVjtWRUQ5NjAgM0ZcQDxGNUM7VylEKCZRTzhWTVMoJiVWODZFTDg2KUw5MCEtODYtSDo2WUUKLU0oJkVTKCZZTz0iIU87QiFUOiY0QDtGNVQ9Vl1SOlAhLzhGSUU4VzBAOjcsQDxGNU07VzFFICRRSTtGTEAKLU06JiVTKCYpRTk2WEA8VjVWOTcpRTkgISE5JzlFPEcxSTxWNEA5NylSO1coQCAlLVI7Nl1VO0cwQDk3KVIKLU07VyhAICQtTzs2VVU7RkVDODcxSTtWWEA5NylSO1coQDtWWEA8VjVOOSAhMDxGXVQ7Vi1POyIhRTxHKU8KLU08QCEtPTZRVDo2QU88IiFBPScxRTs3IVQ5NjAgMTQxLzUkMS81IiRBKDIkIDRGNU07VzFFKCYlRDknKUUKLU08VyxAOFZBQTtGPUU5ICEmPTZZQz0mRU87QiFOO1cwQDo2VVA7JjVNOTZZVDk2MCAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCEgICAgICAgKCIgICAgIDAhICAgICAgIChJQCAKLU0gICA9ISAgICAgICAoSiAgICAgRSEgICAgICAgKEogICAgIFQ5ICAgICAgIChKICAgICE3OSAgICAgICAKLU0oSiAgICAhP0AgICAgICAgICAgICAgIiFAICAgICAgICAgICAgICIzQCAgICAgICAgICAgICAiWkAgICAKLU0gICAgICAgICAgIzNAICAgICAgICAgICAgICNRQCAgICAgICAgICAgICAkL0AgICAgICAgICAgICAgJEkKLU1AICAgICAgICAgICAgICUrQCAgICAgICAgICAgICAlTkAgICAgICAgICAgICAgJitAICAgICAgICAgICAKLU0gICZHQCAgICAgICAgICAgICAmWUAgICAgICAgICAgICAgJyxAICAgICAgICAgICAgICdEQCAgICAgICAKLU0gICAgICAnUEAgICAgICAgICAgICAgKE1AICAgICAgICAgICAgICk6QCAgICAgICAgICAgICAqLkAgICAKLU0gICAgICAgICAgKyhAICAgICAgICAgICAgICtTQCAgICAgICAgICAgICAgIDEgICA+MCAgKEogICAgICAKLU0xICAgPjAgIChKMCAgICAgMSAgID4wICAoSkggICAsRCkgICAgICAgKEogICAgICAxICAgPkAgIChKWCAKLU0gICAgMSAgID5AICAoSyggICAgIDEgICA+QCAgKEtAICAgLFMpICAgICAgIChKWCAgICAgMSAgID5QICAKLU0oS1AgICAgIDEgICA+UCAgKEwgICAgICAxICAgPlAgIChMOCAgIC0qKSAgICAgICAoS1AgICAgIDEgICAKLU0/MCAgKExIICAgICAxICAgPzAgIChMWCAgICAgMSAgID8wICAoTTAgICAtQykgICAgICAgKExIICAgICAKLU0xICAgP0AgIChNQCAgICAgMSAgID9AICAoTVAgICAgIDEgICA/QCAgKE4oICAgLVMpICAgICAgIChNQCAKLU0gICAgMSAgID9QICAoTjggICAgIDEgICA/UCAgKE5IICAgICAxICAgP1AgIChPICAgIC4qKSAgICAgICAKLU0oTjggICAgIDEgICBAMCAgKE8wICAgICAxICAgQDAgIChPQCAgICAgMSAgIEAwICAoT1ggICAuQykgICAKLU0gICAgKE8wICAgICAxICAgQEAgIChQKCAgICAgMSAgIEBAICAoUDggICAgIDEgICBAQCAgKFBQICAgLlEKLU0pICAgICAgIChQKCAgICAgMSAgIEBQICAoUSAgICAgIDEgICBAUCAgKFEwICAgICAxICAgQFAgIChRSCAKLU0gIC8mKSAgICAgICAoUSAgICAgIDEgICBBMCAgKFFYICAgICAxICAgQTAgIChSKCAgICAgMSAgIEEwICAKLU0oUkAgICAvPSkgICAgICAgKFFYICAgICAxICAgQUAgIChSUCAgICAgMSAgIEFAICAoUyAgICAgIDEgICAKLU1BQCAgKFM4ICAgL0wpICAgICAgIChSUCAgICAgMSAgIEFQICAoU0ggICAgIDEgICBBUCAgKFNYICAgICAKLU0xICAgQVAgIChUMCAgIDAiKSAgICAgICAoU0ggICAgIDEgICBCMCAgKFRAICAgICAxICAgQjAgIChUUCAKLU0gICAgMSAgIEIwICAoVSggICAwOikgICAgICAgKFRAICAgICAxICAgQkAgIChVOCAgICAgMSAgIEJAICAKLU0oVUggICAgIDEgICBCQCAgKFYoICAgMEspICAgICAgIChVOCAgIDBdQCAgICAgICAgICAgICAxV0AgICAKLU0gICAgICAgICAgMktAICAgICAgICAgICAgIDM7QCAgICAgICAgICAgICAzTUAgICAgICAgICAgICAgNDQKLU1AICAgICAgICAgICAgIDRQQCAgICAgICAgICAgICA1LkAgICAgICAgICAgICAgNUpAICAgICAgICAgICAKLU0gIDVXQCAgICAgICAgICAgICAgIDEgICBMQCAgKFY4ICAgICAxICAgTTAgIChXICAgICAgMSAgIE1AICAKLU0oVzggICAgIDEgICBNUCAgKFdYICAgICAxICAgTjAgIChYOCAgICAgMSAgIE5AICAoWFggICAgIDEgICAKLU1OUCAgKFk4ICAgICAxICAgTzAgIChZWCAgICAgMSAgIE9AICAoWjggICAgIDEgICBPUCAgKFpYICAgICAKLU0xICAgUDAgIChbOCAgICAgMSAgIFBAICAoW1ggICAgIDEgICBQUCAgKFw4ICAgICAxICAgUTAgIChcWCAKLU0gICAgMSAgIFFAICAoXUAgICAgIDEgICBSMCAgKF5AICAgICAxICAgUkAgIChfKCAgICAgMSAgIFJQICAKLU0oX1AgICAgIDEgICBTMCAgKSA4ICAgICAxICAgU0AgICkhICAgICAgMSAgIFNQICApIUggICAgIDEgICAKLU1UMCAgKSIwICAgICAxICAgVEAgICkiWCAgICAgMSAgIFRQICApI0AgICAgIDEgICBVMCAgKSQoICAgICAKLU0xICAgVUAgICkkUCAgICAgMSAgIFVQICApJTggICAgIDEgICBWMCAgKSYgICAgICAxICAgVkAgICkmSCAKLU0gICAgMSAgIFcgICApJ1ggICAgIDEgICBXMCAgKShAICAgICAxICAgV0AgICkpKCAgICAgMSAgIFggICAKLU0pKVAgICAgIDEgICBYMCAgKSo4ICAgICAxICAgWEAgICkrICAgICAgMSAgIFkgICApK0ggICAgIDEgICAKLU1ZMCAgKSwwICAgICAxICAgWUAgICksWCAgICAgMSAgIFogICApLUAgICAgIDEgICBaMCAgKS4oICAgICAKLU0xICAgWkAgICkuUCAgICAgMSAgIFsgICApLzggICAgIDEgICBbMCAgKTAgICAgICAxICAgW1AgICkwSCAKLU0gICAgMSAgIFwgICApMSggICAgIDEgICBcMCAgKTFAICAgICAxICAgXEAgICkyICAgICAgMSAgIF0gICAKLU0pMjggICAgIDEgICBdQCAgKTMgICAgICAxICAgXVAgICkzSCAgICAgMSAgIF1QICApM0ggICA2RCkgICAKLU0gICAgKFY4ICAgNkwoICAgICAgICAgICAgIDZWKCAgICAgICAgICAgICA3KCggICAgICAgICAgICAgNzwKLU0oICAgICAgICAgICAgIDdHKCAgICAgICAgICAgICA3WSggICAgICAgICAgICAgOC0oICAgICAgICAgICAKLU0gIDg2KCAgICAgICAgICAgICA4RiggICAgICAgICAgICAgOFgoICAgICAgICAgICAgIDkiKCAgICAgICAKLU0gICAgICA5MyggICAgICAgICAgICAgOUYoICAgICAgICAgICAgIDlSKCAgICAgICAgICAgICA5XyggICAKLU0gICAgICAgICAgOjooICAgICAgICAgICAgIDpdKCAgICAgICAgICAgICA7QiggICAgICAgICAgICAgO14KLU0oICAgICAgICAgICAgIDw3KCAgICAgICAgICAgICA8XCggICAgICAgICAgICAgPTYoICAgICAgICAgICAKLU0gID1NKCAgICAgICAgICAgICA+MCggICAgICAgICAgICAgPksoICAgICAgICAgICAgID8jKCAgICAgICAKLU0gICAgICA/RyggICAgICAgICAgICAgQCQoICAgICAgICAgICAgIEBCKCAgICAgICAgICAgICBAWCggICAKLU0gICAgICAgICAgQTYoICAgICAgICAgICAgIEFWKCAgICAgICAgICAgICBCLSggICAgICAgICAgICAgQkgKLU0oICAgICAgICAgICAgIEMoKCAgICAgICAgICAgICBDPSggICAgICAgICAgICAgQ1YoICAgICAgICAgICAKLU0gIEQ0KCAgICAgICAgICAgICBESiggICAgICAgICAgICAgRSQoICAgICAgICAgICAgIEVDKCAgICAgICAKLU0gICAgICBFWyggICAgICAgICAgICAgRjQoICAgICAgICAgICAgIEZCKCAgICAgICAgICAgICBHQCggICAKLU0gICAgICAgICAgSC0oICAgICAgICAgICAgIEkhKCAgICAgICAgICAgICBJLSggICAgICAgICAgICAgSigKLU0oICAgICAgICAgICAgIEpTKCAgICAgICAgICAgICBLRCggICAgICAgICAgICAgS08oICAgICAgICAgICAKLU0gIEtaKCAgICAgICAgICAgICBMPiggICAgICAgICAgICAgTE0oICAgICAgICAgICAgIE0rKCAgICAgICAKLU0gICAgICBNOSEgICAgICAgKTQgICAgTUIhICAgICAgICk0ICAgIE1ROSAgICAgICApNCAgICBOOjkgICAKLU0gICAgKTQgICAgTlNAICAgICAgICAgICAgIE81QCAgICAgICAgICAgICBPR0AgICAgICAgICAgICAgUC4KLU1AICAgICAgICAgICAgIFBHQCAgICAgICAgICAgICBRJUAgICAgICAgICAgICAgUUNAICAgICAgICAgICAKLU0gIFFdQCAgICAgICAgICAgICBSP0AgICAgICAgICAgICAgUyJAICAgICAgICAgICAgIFM/QCAgICAgICAKLU0gICAgICBTW0AgICAgICAgICAgICAgVC1AICAgICAgICAgICAgIFRAQCAgICAgICAgICAgICBUWEAgICAKLU0gICAgICAgICAgVSRAICAgICAgICAgICAgIFYiQCAgICAgICAgICAgICBXJkAgICAgICAgICAgICAgWDQKLU1AICAgICAgICAgICAgIFkrQCAgICAgICAgICAgICBZOEAgICAgICAgICAgICAgWUJAICAgICAgICAgICAKLU0gIFlNQCAgICAgICAgICAgICBaNkAgICAgICAgICAgICAgWlxAICAgICAgICAgICAgIFsxKSAgICAgICAKLU0pNCAgICBbRyggICAgICAgICAgICAgW14pICAgICAgICk4ICAgIFw0IUAgICAgICIgI1AgICBcQykgICAKLU0gICAgKTpYICAgXE4hICAgICAgICk8QCAgIFxWISAgICAgICApPEAgICBdJTkgICAgICAgKTxAICAgXU4KLU05ICAgICAgICk8QCAgIF4nQCAgICAgICAgICAgICBeSUAgICAgICAgICAgICAgXltAICAgICAgICAgICAKLU0gIF9CQCAgICAgICAgICAgICBfW0AgICAgICAgICAgICAhIDlAICAgICAgICAgICAgISBXQCAgICAgICAKLU0gICAgICEhMUAgICAgICAgICAgICAhIVNAICAgICAgICAgICAgISI2QCAgICAgICAgICAgICEiU0AgICAKLU0gICAgICAgICAhIy9AICAgICAgICAgICAgISNBQCAgICAgICAgICAgICEjVEAgICAgICAgICAgICAhJCwKLU1AICAgICAgICAgICAgISQ4QCAgICAgICAgICAgICElNkAgICAgICAgICAgICAhJjpAICAgICAgICAgICAKLU0gISdIQCAgICAgICAgICAgICEoP0AgICAgICAgICAgICAhKExAICAgICAgICAgICAgIShWQCAgICAgICAKLU0gICAgICEpIUAgICAgICAgICAgICAhKUpAICAgICAgICAgICAgISowQCAgICAgICAgICAgICEqRSggICAKLU0gICAgICAgICAhKlkoICAgICAgICAgICAgISs2KCAgICAgICAgICAgICErSCEgICAgICAgKTxAICAhK0wKLU05ICAgICAgICk8QCAgICAgMSAjX19QICApPEAgICErUyEgICAgICAgKTxAICAhK10hICAgICAgIClEICAKLU0gISwkISAgICAgICApSEAgICEsLiEgICAgICAgKUxAICAhLDYhICAgICAgIClMQCAgISw6ISAgICAgICAKLU0pTUAgICEsQiEgICAgICAgKU4gICAhLEshICAgICAgIClPICAgISxTISAgICAgICApTyAgICEsXCEgICAKLU0gICAgKlZAICAhLSshICAgICAgICpcQCAgIS0zISAgICAgICAqXSAgICEtQCEgICAgICAgKl0gICAhLUoKLU0hICAgICAgICs0QCAgIS1TISAgICAgICAtNyAgICEtXCEgICAgICAgLTpAICAhLiYhICAgICAgIC1aICAKLU0gIS4sISAgICAgICAtWiAgICEuNSEgICAgICAgLicgICAhLj0hICAgICAgIC4nICAgIS5BISAgICAgICAKLU0uKCAgICEuSSEgICAgICAgLiggICAhLk0hICAgICAgIC4pICAgIS5dISAgICAgICAuKSAgICEvISEgICAKLU0gICAgLiogICAhLy8hICAgICAgIC4qICAgIS8zISAgICAgICAuKyAgICEvOyEgICAgICAgLisgICAhLz8KLU0hICAgICAgIC4sICAgIS9KISAgICAgICAuLCAgICEvTiEgICAgICAgLi0gICAhL1shICAgICAgIC4tICAKLU0gIS9fISAgICAgICAuLiAgICEwJiEgICAgICAgLjFAICAhMDEhICAgICAgIC42ICAgITA7ISAgICAgICAKLU0uNyAgICEwRSEgICAgICAgLkFAICAhMFAhICAgICAgIC5DICAgITBYISAgICAgICAuRyAgICExIiEgICAKLU0gICAgLzBAICAhMSohICAgICAgIC85ICAgITEzISAgICAgICAvPiAgICExPCEgICAgICAgM19AICAhMUkKLU0hICAgICAgIDNfQCAgITFRISAgICAgICA0I0AgICExWiEgICAgICAgNCkgICAhMiMhICAgICAgIDQrICAKLU0gITIqISAgICAgICA0NUAgICEyMyEgICAgICAgNEhAICAhMjwhICAgICAgIDRLQCAgITJIISAgICAgICAKLU04MEAgICEyUSEgICAgICAgODJAICAhMlohICAgICAgIDg1QCAgITMjISAgICAgICA4OSAgICEzLCEgICAKLU0gICAgOD9AICAhMzchICAgICAgIDhdQCAgITNCISAgICAgICA5QiAgICEzUSEgICAgICAgPFZAICAhNCAKLU0hICAgICAgID4pICAgITQqISAgICAgICA+P0AgICE0NSEgICAgICAgPkpAICAhNEQhICAgICAgIEArICAKLU0gITRTISAgICAgICBCJyAgICE0XyEgICAgICAgQkkgICAhNSYhICAgICAgIEJJICAgITUqISAgICAgICAKLU1CSiAgICE1MyEgICAgICAgQk8gICAhNT0hICAgICAgIEJTICAgITVEISAgICAgICBCUyAgICE1SCEgICAKLU0gICAgQlQgICAhNVEhICAgICAgIEJdICAgITVaISAgICAgICBCX0AgICE2IyEgICAgICAgQyEgICAhNisKLU0hICAgICAgIEMnICAgITY0ISAgICAgICBDLiAgICE2PSEgICAgICAgQzBAICAhNkchICAgICAgIEM0ICAKLU0gITZUISAgICAgICBDNCAgICE3IyEgICAgICAgQzQgICAhNywhICAgICAgIEM0ICAgITcwISAgICAgICAKLU1DNSAgICE3OSEgICAgICAgQz5AICAhN0AhICAgICAgIEM+QCAgITdEISAgICAgICBDP0AgICE3TiEgICAKLU0gICAgQ0ogICAhN1chICAgICAgIENKICAgITggISAgICAgICBDSiAgICE4JCEgICAgICAgQ0sgICAhOCgKLU05ICAgICAgIENLICAgICAgMSAjX19QICBDSyAgICE4LyEwICNIICAgKUQgICAhODUgUCAgICAgICAgICAKLU0gITg/ITAgJSNAICAoIiAgICE4RSEwICAgICAgKFY4ICAhOEshMCAjOEAgIChJQCAgIThXITAgJlhAICAKLU0pTUAgICE4XiFQICU8QCAiICAgICAhOSchMCAkMCAgICk8QCAgITkvITAgI0kgICAoSUAgICE5OyEwICAKLU0gICAgKEogICAhOUghMCAgICAgIChKWCAgITlcITAgICAgICAoS1AgICE6MiEwICAgICAgKExIICAhOkAKLU0hMCAgICAgIChNQCAgITpVITAgICAgICAoTjggICE7LCEwICAgICAgKE8wICAhOzghMCAgICAgIChQKCAKLU0gITtLITAgICAgICAoUSAgICE8ICEwICAgICAgKFFYICAhPC0hMCAgICAgIChSUCAgITxBITAgICAgICAKLU0oU0ggICE8VyEwICAgICAgKFRAICAhPSUhMCAgICAgIChVOCAgIT00ITAgICAgICApOlggICE9PCIwICAKLU0gICAiTCUgICAhPUQiMCAgICAgIkwlKCAgIT1TIjAgICAgICJMJTAgICE+JCIwICAgICAiTCU4ICAhPi0KLU0iMCAgICAgIkwlQCAgIT49IjAgICAgICJMJUggICE+TyIwICAgICAiTCVQICAhPlYiMCAgICAgIkwmICAKLU0gIT8kIjAgICAgICJMJjAgICE/NCIwICAgICAiTCZAICAhPzwiMCAgICAgIkwmUCAgIT9LIjAgICAgICIKLU1MJyAgICE/XCIwICAgICAiTCcwICAhQCUiMCAgICAgIkwnQCAgIUAvIjAgICAgICJMKCAgICFAPSIwICAKLU0gICAiTCgoICAhQFIiMCAgICAgIkwoMCAgIUEpIjAgICAgICJMKEAgICFBOCIwICAgICAiTChQICAhQU4KLU0iMCAgICAgIkwpICAgIUImIjAgICAgICJMKUAgICFCMyIwICAgICAiTCogICAhQkciMCAgICAgIkwqQCAKLU0gIUJdIjAgICAgICJMKyAgICFDKyIwICAgICAiTCtAICAhQ0AiMCAgICAgIkwsICAgIUNXIjAgICAgICIKLU1MLEAgICFEJiIwICAgICAiTC0gICAhRDYiMCAgICAgIkwuICAgIURGIjAgICAgICJMLjAgICFEXSIwICAKLU0gICAiTC5AICAhRTYiMCAgICAgIkwuUCAgIUVHIjAgICAgICJMLyAgICFFXyIwICAgICAiTC8wICAhRjkKLU0iMCAgICAgIkwvQCAgIUZIIjAgICAgICJML1AgICFGXiIwICAgICAiTDAgICAhRzYiMCAgICAgIkwwMCAKLU0gIUdGIjAgICAgICJMMEAgICFHXSIwICAgICAiTDBQICAhSDYiMCAgICAgIkwxICAgIUhHIjAgICAgICIKLU1MMTAgICFIWSIwICAgICAiTDFAICAhSSIiMCAgICAgIkwxUCAgIUkuIjAgICAgICJMMiAgICFJOSIwICAKLU0gICAiTDIwICAhSUIiMCAgICAgIkwyQCAgIUlKIjAgICAgICJMMyAgICFJUiIwICAgICAiTDwgICAhSVsKLU0iMCAgICAgIkw8QCAgIUolIjAgICAgICJMPSAgICFKMCIwICAgICAiTD8gICAhSjshMCAgICAgICk0ICAKLU0gIUpOIjAgICAgICJMQEAgICFKXSFQICAgICAiICNAICAhSy4hUCAgICAgIiAkICAgIUtAITAgICAgICAKLU0pOCAgICFLUyIwICAgICAiTEEgICAhTCIhMCAmPSAgIClIQCAgIUwrITAgICAgICApTFggICFMMiEwICYKLU1ZMCAgKTxAICAhTD4hMCAiPiAgICpcQCAgIUxEITAgJSZAICAqVkAgICFMUSEwICNFQCAgKU8gICAhTFsKLU0iMCAnQjAgIkxBQCAgIU0rITAgJkpQICArUEAgICFNMyEwICgnICAgKU4gICAhTTohUCAnRVAgIiAkMCAKLU0gIU1BITAgJFcwICAqPjggICFNSiEwICI5QCAgKV8gICAhTVMhMCAjPjAgICwhWCAgIU1ZIVAgJV5AICIKLU0gSTAgICFOISEwICYzICAgKVkwICAhTikhMCAkOSAgICpIKCAgIU4zITAgIC9AICAqNiggICFOPSEwICAKLU0gICAgLig4ICAhTkQhMCAlKVAgICpUICAgIU5OITAgICAgICAuJzggICFOVSEwICcsUCAgLTcgICAhTl0KLU0hMCAmIDAgIClQOCAgIU8lITAgJTowICAtUiAgICFPLSIwICMoICAiSlpQICAhTzMhUCAjPEAgIiAkUCAKLU0gIU8+ITAgJDUwICAqXkAgICFPSCFQICZAUCAiICVAICAhT1ohUCAlNTAgIiAmICAgIVAhIVAgJkowICIKLU0gJjAgICFQKiFQICNSUCAiICVQICAhUDshUCAjP0AgIiAlMCAgIVBMIVAgJjtQICIgJSAgICFQXyEwICcKLU1VUCAgLVogICAhUSchMCAjLiAgICpdICAgIVEzITAgJUkgICAuNyAgICFRPCEwICQqMCAgLkMgICAhUUQKLU0hMCAiTEAgIC5BQCAgIVFOIjAgI0ogICJMQVAgICFRXCFQICMrQCAiIElQICAhUiIhMCAmLVAgICw4SCAKLU0gIVIrITAgI1AwICAuLiAgICFSMSEwICAgICAgLio4ICAhUj4hMCAmXDAgIC8wQCAgIVJFIVAgI1BAICIKLU0gK0AgICFSTiFQICMzMCAiICcgICAhUlohUCAnLEAgIiArICAgIVMhIVAgIkhAICIgKzAgICFTKiEwICAKLU0gICAgLis4ICAhUzEhMCAkP0AgIC06QCAgIVM7ITAgICAgICAuKTggICFTSiEwICJIUCAgLUNQICAhU1gKLU0hMCAkNVAgIC1NKCAgIVQkITAgJTpQICAvOSAgICFULCIwICc/UCAiTEIgICAhVDYhMCAgICAgIC4tOCAKLU0gIVRCITAgJz4gICAuMUAgICFUTSEwICNIUCAgLjY4ICAhVFYhMCAgICAgIC4sOCAgIVUgIjAgICAgICIKLU1MVFAgICFVJSFQICAvMCAiITFQICAhVSwhMCAgKjAgIC5HICAgIVU0ITAgJFUwICAuS0AgICFVPyEwICIKLU0/QCAgLz4gICAhVUgiMCAjXkAgIkxKICAgIVVRIVAgKD5QICIhPTAgICFVWyEwICc+UCAgM19AICAhViIKLU0hMCAmXlAgIC88UCAgIVYpITAgIzwwICA0KyAgICFWLyEwICA1QCAgODVAICAhVjchUCAiUVAgIiE9UCAKLU0gIVZAITAgJlQgICA0SEAgICFWSCEwICcjICAgNCNAICAhVlAhMCAhJkAgIEI0OCAgIVZbITAgKEIgICAKLU04TFggICFXJSEwICAiQCAgODBAICAhVy0hMCAlNCAgIDdDOCAgIVc5ITAgI18gICAzLkggICFXRCEwICAKLU0pICAgNCkgICAhV0whMCAlUVAgID4pICAgIVdeITAgIUZAICBCQ1AgICFYKSEwICA6QCAgOTpYICAhWDMKLU0hMCAgRkAgIEInICAgIVg+ITAgKCIgICA4P0AgICFYSCEwICIlMCAgM0dYICAhWFEgUCAkNl4gICAgICAKLU0gIVhbITAgJlwgICA0PkAgICFZJCEwICYoQCAgNEMoICAhWS0hMCAlUTAgIDRGKCAgIVk2ITAgKCEwICAKLU00R0AgICFZPyIwICRTQCAiTEowICAhWUwhMCAlPiAgIDQ7QCAgIVlWITAgJk0wICA0PSAgICFZXyEwICUKLU1VMCAgNEAgICAhWighMCAnKEAgIDQ3ICAgIVoxITAgJiVAICA0REggICFaOiEwICZWQCAgNEFAICAhWkMKLU0hMCAlTVAgIDQ1QCAgIVpMITAgJVAgICA0OiAgICFaVSEwICZJQCAgNDhAICAhWl4hMCAgICAgIEJJOCAKLU0gIVskIVAgJ0JAICIiJDAgICFbKyEwICVQMCAgNVEgICAhWzwiMCAhWTAgIkxLICAgIVtHITAgIl8gICAKLU03RDAgICFbVCEwIChHICAgQl0gICAhW1wiMCAnT1AgIkxMICAgIVwmITAgJVFQICA0S0AgICFcMSEwICAKLU01MCAgODkgICAhXDkhMCAmPjAgIDgpKCAgIVxHITAgIDZQICA1VyggICFcWiEwICZZUCAgQlQgICAhXSIKLU0iMCAlXDAgIkxNICAgIV0sITAgICRAICA4MkAgICFdNCEwICAgICAgQlM4ICAhXTohMCAoMTAgIDZZOCAKLU0gIV1GITAgICgwICBCX0AgICFdTiFQICZaICAiIU4wICAhXV4hUCAjVSAgIiFQICAgIV4pITAgJjggICAKLU1DJyAgICFeMSFQICI3ICAiIiAoICAhXjohMCAgU1AgIEMwQCAgIV5DIjAgIEhAICJMU1AgICFeUSIwICcKLU09ICAiTFQgICAhXygiMCAgSDAgIkxUMCAgIV9AIjAgI0QgICJMVEAgICFfVyEwICRFQCAgPEU4ICAiICoKLU0hMCAjPUAgIDk/WCAgIiAwITAgJk4gICA4XUAgICIgNyEwIChCICAgOVMgICAiIFIhMCAlNzAgID8rOCAKLU0gIiEpITAgJ14gICA5QiAgICIhOCEwICRIICAgQDMoICAiIVAhMCAmNEAgIDouKCAgIiIsITAgI1RQICAKLU08VkAgICIiOyEwICAxQCAgQk8gICAiIkQhMCAhMyAgIEAtKCAgIiJVITAgJiAgICA/SEggICIjLSEwICcKLU0oICAgQC5YICAiI0UhMCAlUFAgID03QCAgIiNVITAgJDZQICA9LCAgICIkJCEwICVHICAgPE0wICAiJDoKLU0hMCAnTyAgIDpbSCAgIiRQITAgJkMgICA/XEggICIlLCEwICBYUCAgPVQwICAiJT8hMCAmV1AgID1KKCAKLU0gIiVRITAgJC4gICA9M0ggICImICEwICJHICAgPSpIICAiJjMhMCAnJTAgID4/QCAgIiY6ITAgIiogICAKLU0+LFggICImVSEwICBZICAgPjRAICAiJzAhMCAhQTAgID5EICAgIidGITAgITggICA+RlAgICInXCEwICAKLU0yICAgPkBQICAiKC4hMCAgNyAgID5KQCAgIig9ITAgIzAwICA/OUAgICIoUSEwICYqMCAgPyVIICAiKScKLU0hMCAoK1AgID9AMCAgIilCITAgIycgICA/MTggICIpViEwICYhICAgPl0wICAiKiwhMCAlKyAgID5VSCAKLU0gIipAITAgJUUgICA+TVggICIqTiEwICEuICAgPlo4ICAiKyEhMCAjIUAgID5WWCAgIis1ITAgJipAICAKLU0+UiAgICIrRSEwICRfICAgPk5YICAiK1MhMCAlTyAgID9VICAgIiwkITAgKCYgICBCSiAgICIsLCFQICcKLU1ZQCAiLCsgICAiLEshUCAjSiAgIkJBSCAgIi0sIVAgJzggICI9RDAgICItTCFQICg8QCAiLCkgICAiLiMKLU0hUCAlWCAgIkI2KCAgIi48IVAgKD8gICI9Q0AgICIuVCFQICFNQCAiIlU4ICAiLyUhUCAkUkAgIj1JUCAKLU0gIi84IVAgI0hAICI9QlggICIvSiFQICZTQCAiIlUwICAiL18hUCAnW0AgIj1JSCAgIjA2IVAgJS0gICIKLU09QlAgICIwTCEwICNYMCAgQCsgICAiMSQhMCAmViAgIEMhICAgIjErIVAgKEVQICI9QEAgICIxQiFQICYKLU0hMCAiSD04ICAiMVshUCAgIFAgIj1HOCAgIjIzIVAgIVZQICIsLSAgICIyRCFQICRbUCAiQk0oICAiMlcKLU0hUCAjUVAgIj1FICAgIjMpIVAgJlxQICIsLFggICIzPiFQICgkUCAiQk0gICAiM1UhUCAlNjAgIj1EWCAKLU0gIjQrITAgJ0hAICBDLiAgICI0MyEwICAgICAgQz5YICAiNDkhMCAnTiAgIEM1ICAgIjRBITAgICAgICAKLU1DNDggICI0SSEwICM7QCAgQz9AICAiNFIhUCAlUEAgIkhIMCAgIjRfITAgICAgICBDSjggICI1JyFQICIKLU1GQCAiSF8gICAiNTEhMCAgICAgIiAgICAgIjU4IVAgICAgICJKWlAgICI1PyIwICAgICAiTFRQICAiNUUKLU0rVlFJOEJdQzxHMFArRlwgK1ZRSThCXS04VylULDJZTyAmPUQ4RlVFK0ZcIDlWLUMsRV1DO1ZVUDo2UUUKLU05IlggK1YtWTlWRU49Il1QOyYlWStWOU45Ql1EOTc5TytWPUQ4RzFFPFcwTz0jJFArUCFHOSYpTTkyWUMKLU0gJkVOPSNJVCwzVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVy5QIUM6JiVSLkcwUi83KFIKLU0uUyBbLDMoVy5QIUw7VllHKCZFTj0jSVQsU1VSLDNMTSxDJFQtUzBYLFM4VC4jTFIsMzBXLSNAUy1DMFcKLU0uUCFVO0ctSTlWWUU5IiFJO0cwWj0jMF08QyRbLCNMTSwzTCA7Jl1OOVIhVTtHLUk5VllFOSIhSTtHMFoKLU09IzRdPEMkWywjTE0sM0wgPFZBTzxHMEA6NllULkcwVi83KFEuUlRTLEM8Vi4jTFMsQzxWLVNMIDsmXU4KLU05UiFMO1ZZRygmRU49I0lULVNVUiwzTFAuUlRRLlAhUzomXVI9IiFVO0ctSTlWWUU5IiFJO0cwWj0jQF0KLU08QyRbLCNMVi0zNFMtM0wgOyZdTjlSIUw7VllHKCc1TjxWRUc7RjVEKCZFTj0jSVQuM1VSLDNMUC5SVFEKLU0uUCFTOjY9Tjk2MEA4VkFBPENJVCwzIF08QyRbKzMkUi4jTFEsQzxbICc1TjxWRUc7RjVEKCYtSDg3KFoKLU09IyRRLzcoUS5TIFssQzRVLlAhRjsmXUE9I0lULDMoXTxDJFstI0xQLlAhRDtXNUI7JjRaPSMkUy83KFEKLU0uU0BbLCNMIDsmXU45UiFEO1c1QjsmNFo9IyRULzcoUS5TQFssI0wgPUZdSTkjSVQsMzRdLDM0ID0lXVMKLU09JylVOFcwWjUjJFYvNyxSLSc5PzhWQUE8RV1NOTZVQjk3KFosQlBQKyNAWz1FXVM6Jl1SPSVdTTk2VUIKLU05NyhaLUJQUS1CUFEtQ008ICc5Pzo2WVQ3VlVFOzYpRTxDSFErIyxSKyMsUi5XOT87Jl1OOVVdTTk2VUIKLU05NyhaLFJQVi0iUFMsQ008ICc5PzlGUU84NzE/OzY1TThGNVIuQyRSKyNEVisjLFIuVzk/OSZdVThGUUUKLU03VlVFOzYpRTxDSFEsUlBRLENATC1DMFsuUCFUN1c1Tjo2XU4uRTBRLVNVVS4nOT84VkFBPEVdTTk2VUIKLU05NyhaLEJQUCsjQFs9RV1TOiZdUj0lXU05NlVCOTcoWi1CUFArIyRWLlVQID1FXUk7RzE/OzY1TThGNVIKLU0uQyRMLCJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSLkMsTCwiUFMsQ008ICc5PzlGUU84NzE/OzY1TThGNVIKLU0uQyRSKyMgTCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1Ui5DJFMrIyBMLUMwWy5QIVY3Vi1IODcpPzlHNU4KLU04U0kmLEAhVjdXLUk5VllFOSVdQzomJVI3VjlVO0YsWjFDJFAgJzk/PTZZUzo2PU45NjE/OFZBQTxFXUYKLU09NllDLkQ4USwwIVY3Vy1IO1cpVDdWOVU7RixaMUM4ID1FXVM6Nj1OOTYxPzxWQU88RzE/OUc1TjhTSSYKLU0tQCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsWjFDQCA9RV1JO0cxPzlHNU44U0kmLDAhVjdXLUkKLU05VllFOSVdSTtHMT85RzVOOFNJJiwwIVY3VzVOPFZFRztGNUQ3VkVOPSVdRj02WUMuRDhUICc5PzsmXU4KLU05VV1GPTZZQy5EOFMgJzk/PFZFRztGNUQ3VlFPO0Y9PzlHNU44U0kmLFAhVjdXNU48VkVHO0Y1RDdWUU8KLU07Rj0/OUc1TjhTSSYtMCFWN1Y5TDtWJVQ3VjlVO0YsWjFDJFIgJzk/OSZdVThGUUU3VjlVO0YsWjFDJFMKLU0gJlFJO0ZMWjUjJFgvNyxRLTMpTjk3QVQuQyRZLzJIUS4iUFArIyxSLlZRSTtGTUY9NllDLkMoUC8ySFIKLU0sM1VGLDNETCxTKEwsUyhbNyAhUz0nNUY5Q0hSLENVQTxDJFssI0xQLlMoUy82JVIsM0xQLlMkWyxDMF0KLU04NyhRLlMgWyxDTFEtQlBWLSJQUSwzNFIuU0wgPSc1PzsmRU46U0k0LEM0XT0zJFQtJllFPicwWiwzREwKLU0sIlBTLENNTDo2WUs5RzVOOFNIUiwiUFArIyxSLlVQIDxXMVU5RjhaLEMoTCwiUFEsMzRSLlNMIDhWXUwKLU07VylTLkUwUi1DVUU+NjVMOyZdVy5DIEw8JzVSPCZRRS5DJEw8JkVOOlNIUisjTCA4ViVSPFNJNCxDPF0KLU05NilNPVNIUCsnIU88Ry1DOiY0WiwyUFsgJilPO1ZRRTg2WFo9IyhYLzY1JjA0UTMxM0hQKyUxMjU0NFoKLU0sMlBbICYpVjg2UVMuRTBSLjNVRTlGJUw8VjRaLCJRVDxHNUUuQyRMLlAhQjtWXUw5NiVOLENJVCxDRCAKLU07NkVTO1cpRDk3KUU5I0k0LFMgXTk3MVc7U0hSKyZdTjkzSFErJ0lFPEZcWiwiUVQ6JylFOTNIUysjTCAKLU07NiVJO0NJJiwwIVY3Vi1IODcoWjFTKCA9RV1TOjY9Tjk2MT84VkFBPENJJywzICA9RV1VO0ctSTlWWUUKLU05JV1DOiYlUi5EPFEsMCFWN1ctSDtXKVQuRDxWICc5PzxWRUc7RjVEN1ctSDtXKVQuRDxWICc5Pz02WVMKLU06Nj1OOTYxPzxWQU88RzBaMVNAID1FXUk7RzBaMVMkID1FXVM6Nj1OOTYxPzo2WVQuRDxRICc5Pz02WVMKLU06Nj1OOTYxPzo2WVQuRDxUICc5PzsmXU45U0knLFAhVjdXLUk5VllFOSVdTDtWWUcuRDxTICc5Pz02WVMKLU06Nj1OOTYxPzsmXU45U0knLTAhVjdWOUw7ViVULkQ8USxAIVY3VjFPPTYpTDkzSScsMywgPUVdQzomJVIKLU03ViVSPEYlWS5EPFMsM1VBPEMkWywjTFEuUyggPUVdUzo2PU45NjE/OFZBQTxFXUE8RylBPjNJJyxTKF0KLU04NyhRLlMgWywzTFEsICFWN1c1TjxWRUc7RjVEN1YtSDg3KT84NylSODdEWjFTLFMvNiVSLDNMUC5TJFsKLU0sMyQgPUVdUzomXVI9JV1BPEcpQT4zSScsUzBdODcoUS5TIFssM0xWICc5PzxWRUc7RjVEN1ctSDtXKVQKLU03ViVSPEYlWS5EPFMtICFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWS5EPFMtM1VBPEMkWywjTFEKLU0uU0AgPUVdSTtHMT84NylSODdEWjFTLFYvNiVSLDNMUC5TJFssMCFWN1ctSTlWWUU5JV1JO0cxPzg3KVIKLU04N0RaMVMsViAnOT89NllTOjY9Tjk2MT86NllUN1YlUjxGJVkuRDxTLVNVQTxDJFssI0xRLlMwID1FXUwKLU07VllHN1YlUjxGJVkuRDxTLiNVQTxDJFssI0xRLlMsID1FXVM6Nj1OOTYxPzsmXU45VV1BPEcpQT4zSScKLU0sU0AgPUVdVTtHLUk5VllFOSVdTDtWWUc3ViVSPEYlWS5EPFMuM1VBPEMkWywjTFEuUzQgPUVdRjsmXUEKLU09JV1BPEcpQT4zSSctIyBdODcoUS5TIFssM0xRLEAhVjdWMU89NilMOTVdQTxHKUE+M0knLSMkXTg3KFEKLU0uUyBbLDNMUSxQIVY3Vi1IODcpPzwmXUk7RzFFPENJJy0jKF0qQyggPUVdUzo2PU45NjE/OFZBQTxFXVAKLU07VkVOPSY1Ui5EPFQsU1RKLDMgID1FXVU7Ry1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyhaMVMwVC8ySFEKLU0sMCFWN1ctSDtXKVQ3VyFPOjZZVDk3KFoxUzBVLzJIViAnOT88VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQKLU05NyhaMVMwVSAnOT89NllTOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPENJJy0jOF0qQ0AgPUVdSTtHMT8KLU08Jl1JO0cxRTxDSSctIzxdKkMkID1FXVM6Nj1OOTYxPzo2WVQ3VyFPOjZZVDk3KFoxUzBXICc5Pz02WVMKLU06Nj1OOTYxPzo2WVQ3VyFPOjZZVDk3KFoxUzBYLzJIVCAnOT87Jl1OOVVdUDtWRU49JjVSLkQ8VC4zVEoKLU0sUCFWN1ctSTlWWUU5JV1MO1ZZRzdXIU86NllUOTcoWjFTMFkgJzk/PTZZUzo2PU45NjE/OyZdTjlVXVAKLU07VkVOPSY1Ui5EPFUsI1RKLTAhVjdWOUw7ViVUN1chTzo2WVQ5NyhaMVM0US8ySFEsQCFWN1YxTz02KUwKLU05NV1QO1ZFTj0mNVIuRDxVLENUSiwzLCA9RV1TPScpVThXMFEuRDxRLUAhVjdXLVQ8RzVDPSMoWjFTNFMKLU0vNyxSLSc5PzhWQUE8RV1NOTZVQjk3KFosQlBQKyNAWz1FXVM6Jl1SPSVdTTk2VUI5NyhaLUJQUS1CUFEKLU0tQ008ICc5Pzo2WVQ3VlVFOzYpRTxDSFErIyxSKyMsUi5XOT87Jl1OOVVdTTk2VUI5NyhaLFJQVi0iUFMKLU0sQ008ICc5PzlGUU84NzE/OzY1TThGNVIuQyRSKyNEVisjLFIuVzk/OSZdVThGUUU3VlVFOzYpRTxDSFEKLU0sUlBRLENATC1DMFsuUCFWN1c1Tjo2XU4uRDxRLVAhVjdXNU46Nl1OLENJJy0zMF09M0FWN1YtSDg3KT8KLU07NjVNOEY1Ui5DKEwsIlBYLlc5PzxWQU88RzE/OzY1TThGNVIuQzhMLCJQUS1DTTwgJzk/OjZZVDdWVUUKLU07NilFPENIUSsjIEwsUyhbPUVdTDtWWUc3VlVFOzYpRTxDSFMrIyBMLFMoWzcgIVY3VjlMO1YlVDdWVUUKLU07NilFPENIUSxCUFArIyxSLlc5PzkmXVU4RlFFN1ZVRTs2KUU8Q0hRLFJQUCsjOFQuU0wgPFVdTDo2WUsKLU0uRDxRLjAhVTdWUUk7RkxaMVMoVSAnIVI6NlVBPEdEWjFTNFUvNjVSOTYwWiwiUUc8RjVFO0NIUSsmKUwKLU09NjRaLEJQWyAmWU87RyFSOjZVQTxHRFoxUyhWICYtTD02WUs5NyhaMVM0Vi82NUM6JjVWPjNIUCsmOU8KLU08RjBaLDJQWyAnLVA7VylUPFYtQTxDSScsQzwgN1VdTTg2RU4rRlwgOVYtQyxFXUM7VlVQOjZRRTkiWCAKLU0rVy1FO0YxQToyXUE4RixPPEZFQzoiXUw4NzFFPFcwTztWKUo5JkVSKzctVTtDLE85Vi1DK1AgTitCXE4KLU0rQl1EOTc5TytWPUM4Ul1MOjYpRzhWLFIrRiwgOjZZVC5HMFEvNyhRLlJUUiwzMFctI0BTLUMwWC5TKFEKLU0tIzxULiMsVi0jPFsgJi1IODcoWj0jKF08QyhbLCNMUSxDPFsgJlFPO0Y8QDo2WVQuRzBTLzcoUS5SVFIKLU0sMzBXLSNAUy1DMFguUyhRLSM8VC4jLFYtIzxbICc1TjxWRUc7RjVEKCZFTj0jSVQtI1VSLDNMUC5SVFEKLU0uUCFMO1ZZRygnNU48VkVHO0Y1RCgmRU49I0lULTNVUiwzTFAuUlRRLlAhUzomXVI9IiFJO0cwWj0jOF0KLU08QyRbKzMsUi1TOFguUyxSLVM4Vy5QIUw7VllHKCZRTztGPEA6NllULkcwVy83KFEuUyBbKzMkWyAnLUgKLU07VylUKCc1TjxWRUc7RjVEKCZFTj0jSVQuI1VSLDNMUC5TOFUtMyxVLlAhTDtWWUcoJlFPO0Y8QD02WVMKLU06Nj1OOTYwQDo2WVQuRzBZLzcoUS5TIFsrMyRbICctSTlWWUU5IiFDOiYlUi5HMFEsI1VSLDNMTSwzKFgKLU0uUyRSLVNMID02WVM6Nj1OOTYwQDhWQUE8Q0lULDMkXTxDJFssI0xSLTM0WyAmOUw7ViVULkcwUSxDVVIKLU0sM0xULlMgWyAmMU89NilMOTNJVCwzLF08QyRbLiNMUC5QIUw7VllHKCYxTz02KUw5M0lULDMwXTxDJFsKLU0uI0xQLlAhVjtWRUQuRzBRLTNUUS0wIVI5Nj0/OFZRQTxXLFo1IyRWLzY1LjNVXTIxND0zLkMgTDMkXT8KLU0xRSEhN1UpJTFVLFosMlEmNCQlPzRENSc0U0hSKyQ5MDdVKSUxVSxaLFJRPCAkOTA3VF0yN1Q5MDA1XTIKLU0xND0zLkMwTDEkJTQwNV0yMTQ9My5DNEwxJCU0MDVdLzRFXSY0JCU/NEQ1JzRTSFYrJDEhNSQlPzNVKT8KLU0xRSE/NEQ1JzRTSFcrJVAgMSQlNDA1XS80RV0mNCVdLzRFXSY0JCU/NEQ1JzRTSFgrJCUkMSUpPzRENScKLU00U0hZKyQ9JTNENTIwNFE/NEQ1JzRTSFEsIlEnMTRZJTREJSw3VF0yN1Q5MDA1XTIxND0zLkMkUSslUCAKLU0xVDUuMTUpITMlXS80RV0mNCVdMjE0PTMuQyRSKyQlLDMlXTIxND0zLkMkUyskUSkzNV0yMTQ9PzBUUSEKLU00VS0lNFNIUS0iUFsgJyFUPEYxSTlGOT89I0lULDAhUzo3SUU3VzBaPSMkID1WLUg4Nyk/PSNJVC4gIUwKLU07VllHOyZdTjlTSTQsMzxdPFNBSDo2PUguQyxMLCJQUyxDTUw7VzxaLFJQUyxCUFMsQ0xbICZRTztGPT8KLU07Jl1OOVNJVCwzQF09M0FTLkMkVysjIEwtQzBbOyZQWi1SUFArIzhULlNMIDlHNU44VV1QPScoWj0jJFkKLU0vMkhSLCNVRiwzNCA3VV1EO1VdRzsmXUI4NlE/OScxTzxHLFoxQyRVICVdRT4mRVQ3VjFVOzZVWTdXKUUKLU05Q0knLEMkXSpDJCA3VV1EO1VdRzsmXUI4NlE/OFcxTzxHLFoxQyRVICVdSTtGRVQ6NiVMOjdJRTkiWFAKLU0gJV0/OzYlSTtDSSYsMzQgN1Y1WDo3ME47UCFHOFYsUjdWLU87NyFJOyY1RCtAIE88VjVOOSYlSStWJUIKLU04Ul1SOjYtSCtWUUE9JjVTPSJdTzhGSUQ6NyhNPFc1TixSXUc4VixPICJYTitSWE4rVjFFPUZcTzlWLUMKLU0rVlFJOEY9QzhTKE44UCFJO0cwWj0jJF08QyRbKzMoUS0jPFQuIyxWLSNAWyxDJFQtUzBYLFM4VC1TTCAKLU04VkFBPENJVCxDVVIsQ0xQLlMkUi1TTCA7Jl1OOVIhSTtHMFo9IyxdPEMkWyszKFEtIzxULiMsVi0jQFsKLU0sQyRULVMwWCxTOFQtU0wgPTZZUzo2PU45NjBAOjZZVC5HMFQvNyhRLlMgWyszJFsgJlFPO0Y8QD02WVMKLU06Nj1OOTYwQDo2WVQuRzBVLzcoUS5TIFsrMyRbICctSDtXKVQoJkVOPSNJVC1DVVIsM0xNLFMoVy1DQFsKLU0sUyhXLUM8WyAmUU87RjxAOyZdTjlSIUk7RzBaPSM8XTxDJFssI0xNLDNMIDxWQU88RzBAPTZZUzo2PU4KLU05NjBAOjZZVC5HMFgvNyhRLlMgWy1DNFUsUzRbICZRTztGPEA7Jl1OOVIhVTtHLUk5VllFOSIhSTtHMFoKLU09I0RdPEMkWywjTE0sM0wgPFZFRztGNUQoJi1IODcoWj0jJFAvNyhRLlJUUSxDQFssMyhXLlAhVTtHLUkKLU05VllFOSIhQzomJVIuRzBRLDNVUiwzTFAuUyhVLTNMIDlGUU84NzBaPSMkUi83KFEuUzBbLCNMIDkmXVUKLU04RlFFLkcwUSxTVVIsM0xYLlMgWyAmUU87RjxAOSZdVThGUUUuRzBRLSNVUiwzTFguUyBbICc5Tzo2MFoKLU09IyRVLzMkVSAnKUU5VV1DOyYlUzxTSTQsMzhdOTRZLzdVKSUxVSxaLCJRLDNVXSY0JCU/NEQ1JzRTSFEKLU0rJDkwMDVdMjE0PTMuQyhMMUUhPzRENSc0U0hTKyVQIDFFIT8zVSk/MUUhITdVKSUxVSxaLSJRJDA1MSEKLU03VSklMVUsWi0yUSQwNTEhN1RdMjdUOTAwNV0yMTQ9My5DOEwxJCU0MDVdLzRFXSY0JV0yMTQ9My5DPEwKLU03ICEkMDUxITdUXTI3VDkwN1RdMjdUOTAwNV0yMTQ9My5DQEwwNDEkNEVdMjE0PTMuQ0RMMVQ1LjE1KSEKLU0zJV0yMTQ9My5DJFArJD0lM0Q1MjA0UT8zVSk/MUUhITdVKSUxVSxaLDMkTDcgIScxNFklNEQlLDdUXTIKLU03VDkwN1UpJTFVLFosMyhMMDRRLDdVKSUxVSxaLDMsTDMkRS03VSklMVVdIzMkJTM0VDUzLkMkVCsjTCAKLU08JzFSOSZFRjlFXVQuRzBRICctST5GNT89I0lULDAhVzhWQUE8RV1ULkcwWCAmUU87Rj1MO1ZZRy5FMFEKLU0tU1VTLiZBSTlWQFosUlBQKyMsUi5WUU89U0hTKyMsUisjLFIuU0wgOyZdTjlVXUw7VllHLkcwUS4jVVUKLU0uJyxaLDM8TCwiUFYtI01MOyNIVysjIEwtQzBbLlAhRj02WUM3VyFUPENJVCwzRF0qQyhQLzY4US0wIT8KLU05N0FJPSVdRD02VU0+NV1EOTYtTC5EPFEgJV0/MFUxLzRFXSwyNS00N1VcWjFTKFEvNiVSLDNMUC5TJFsKLU0sM0QgN1VdJDUkXTI3VFEpNFUxPzdTSScsQyQgKzZRRyAmUUk4RjxOPFAhLTxXPUk9Ji1IK0ZcIDk3QUkKLU09IllPICZdTjdWNVg6NzBOO1AhVzxGRVQ5MllPICY1UjxAIT85N0FJPSJZTyAmLUU8RylPPEJZTyAmNVIKLU08RllPK0ZcIDlGUVM4RzVGK0ZcIDlGUU84NzE/PFc9ST0mLUgrRlwgMzZFTjo3ME47UCFGPCVdRzsmXUIKLU04NlFTK0ZcIDs2RU46NzFGPCJZTyAmVUE7JlFPOFJZTyAmRVM4NzFUPjJZTyAmOUk7RjFJO1cgTjtQIUkKLU07VihOO1AhUzo2PVY5NixOO1AhQzsmXVM5MllPICY1UjxAIUY8VzFBPSJZTyAmNVI8QCFHOTcxRD0mJUIKLU07JjVTOjdJRStGXCA5NylSICY9RT0nIUE5VjVTOjdJRStGXCA5NylSICZFTzhXMUwrRlwgOTcpUiAnLUkKLU05VilMO1YtSytGXCA5NylSICctSTlXLUU9JlVBPFZMTjtQIUU8RyggPFYpUjpSWU8gJy1JOVcxUjg2VVAKLU0rRlwgN1ctSTlXOUU4UllPICY5UDxGRU49JjhOO1AhLTkmNUY4NzVMPSJZTyAmVUEuMy1OK0ZcIDlHIT8KLU08ViVWOTJZTyAmKUM7VyFZK0ZcIDhWJUw7Jl1DK0ZcIDkmXVA8RllUK0ZcIDlHIT84Vl1NOzZdTjxSWU8KLU0gJilaOTcpTytGXCA7NjVNPFY1VCtGXCA8VzFSOyY1TitGXCA4NzFPOjJZTyAmLVQ+NyFFN1JZTyAmVUUKLU07Ni1IPEJZTyAnLUU9JlFPOFYlTDkyWU8gJy1UPEYtSDxCWU8gJy1UPEYtTTwiWU8gJy1UPEctUDtCWU8KLU0gJy1UPEcxTzpSWU8gJjVDO1ZZVjk3KVQrRlwgOVYtTztHOUU8RzBOO1AhRDtXNUI7JjU/OSY1Qzo2VE4KLU07UCE/PTZZUDg2LUs3VjFCOyY0TjtQIT84RiVTOTVdMytGXCA3VilBPFY1Pzo2UE47UCE/PFchUjo2WVQKLU05RV1TPTcgTjtQIT89JkVNOTctPzwmXVc5NyhOO1AhUTk2LU87RzlFPEcwTjtQIVI5NiVEK0ZcIDk3KVIKLU0gJyFSOjZZVDlCWU8gJy1QPEZFTj0mOE47UCFPPCY1TitGXCA5NylSICZVRTs2LVA+MllPICctVDxGLUEKLU09IllPICctVDxGLVA+MllPICYlQjtXKVQrRlwgOVY1VDk2WVYrRlwgPCY1UjxGXVIrRlwgPFcxUjwmKVIKLU06UllPICVdQjo2PT88Jl1XOTcoTjtQIT88VlVBOyZRPzwmXVc5NyhOO1AhRzk3MVA6NjBOO1AhRTxHKCAKLU08VkVHO0YlTCtGXCA6VkVMOyJZTyAmNVI8QCE/PCY1UjxGXVIrRlwgOTcpUjsnLVQrRlwgPVcpST0mNVYKLU0rRlwgOTcpUiAiVUw5UCFMOjYpRytHLCA3VjVYOjcwIDdVXSQ2NFkhMzRFIyAnLVQ4NylUICVdTTg2RU4KLU0gJy1UODcpVDdWOUw7ViVUICVdPzk3QUk9ICE/OTZZVjo3KU87QCEtPFc9ST0mLUggJjhWLiNAWCw1XVUKLU08VjVEICVdVjdWLUg4Nyk/OUc1TjhQIT89RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgJV1WN1c1TjxWRUcKLU07RjVEN1YtSDg3KT85RzVOOFAhPz1FXVM6Jl1SPSVdRj02WUMgJV1WN1ctSTlWWUU5JV1TOiZdUj0lXUYKLU09NllDICVdVjdXNU48VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA3Vzk/OjZZVDdWOVU7RiwgN1c5PzxWRUcKLU07RjVEN1ZFTj0lXUY9NllDICVdVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQyAlXVY3VlFPO0Y9PzlHNU4KLU04UCE/PUVdUzo2PU45NjE/OyZdTjlVXUY9NllDICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/OUc1TjhQIT8KLU09RV1GOyZdQT0lXUY9NllDICVdVjdWMU89NilMOTVdRj02WUMgJV0/N1ZVQTo2WCA3Vzk/OFZBQTxAIT8KLU09RV1TOjY9Tjk2MT84VkFBPEAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSICVdVjdXLUg7VylUICVdVjdXLUkKLU05VllFOSVdUzomXVI9ICE/PUVdVTtHLUk5VllFOSVdUzomXVI9ICE/PUVdSTtHMCA3Vzk/PFZFRztGNUQKLU03VkVOPSAhPz1FXVU7Ry1JOVZZRTklXUk7RzAgN1c5PzsmXU45UCE/PUVdUzo2PU45NjE/OyZdTjlQIT8KLU09RV1VO0ctSTlWWUU5JV1MO1ZZRyAlXVY3VjlMO1YlVCAlXVY3VjFPPTYpTDkwIT89RV1DOiYlUjdWJVIKLU08RiVZICVdVjdXLUk5VllFOSVdQzomJVI3ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3Vi1IODcpPzg3KVIKLU04N0QgN1c5PzxWQU88RzE/ODcpUjg3RCA3Vzk/PFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICVdVjdXNU4KLU08VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJV1WN1ZFTj0lXUE8RylBPjAhPz1FXVM6Nj1OOTYxPzo2WVQKLU03ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3VkVOPSVdQTxHKUE+MCE/PUVdTDtWWUc3ViVSPEYlWSAlXVYKLU03Vy1JOVZZRTklXUw7VllHN1YlUjxGJVkgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT84NylSODdEIDdXOT8KLU05RlFPODcxPzg3KVI4N0QgN1c5PzkmXVU4RlFFN1YlUjxGJVkgJV1WN1YtSDg3KT88Jl1JO0cxRTxAIT8KLU09RV1TOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUUKLU08QCE/PUVdUzomXVI9JV1QO1ZFTj0mNVIgJV1WN1ctSTlWWUU5JV1TOiZdUj0lXVA7VkVOPSY1UiAlXVYKLU03VzVOPFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoIDdXOT86NllUN1chTzo2WVQ5NyggN1c5PzxWRUcKLU07RjVEN1ZFTj0lXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICVdVjdWUU8KLU07Rj0/PCZdSTtHMUU8QCE/PUVdUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQKLU03VlFPO0Y9PzwmXUk7RzFFPEAhPz1FXUY7Jl1BPSVdUDtWRU49JjVSICVdVjdWMU89NilMOTVdUDtWRU4KLU09JjVSICVdUDxGRU04NylZICVdTjtWWVA8RkVNODcpWSAlXVM8Jl1SPSctQzg3KCA3Vi1MPTZZSzk3KCAKLU03Vy0/OyZFTjpQIT89NV1MOjZZSyAlXVY3VzVOOjZdTiAlXVY3VzVOOjZdTixAIT89RV1TPScpVThXMFEKLU0gJV1WN1ctVDxHNUM9IyggN1VdPzkmXT85VlFPOEYlTDdWMVQ7VylTICVdPzdUMTQzVSk/MyRFMzUlXT8KLU0gJV0/OTdBST0lXUQ9NlVNPjVdUjk2OCA3VV1FPiZFVDdWMVU7NlVZN1YxRThWUCA3VV0/OSZdPzlWUU8KLU04RiVMN1YtVDtXKVMgJV0/N1QtNDNVKT8zJEUzNSVdPyAlXU87RV1FPiZFVCAlXVc8RkVUOTAhPzs3LVcKLU06NzFDOiY5UDdQIS06NllJPSAhRjsmXUE9JV1TPVZFVDhWQCA3VV1DOyY1QTtHNVAgJV0/OTdBST0lXUgKLU04NllEOyY1UjxQIT87NiVMOyZdQyAmLUU8RylPPEAhPzk3KVI7RlwgN1VdVzxHMUM6JkwgN1VdRjsnLUIKLU09NjggN1Y5Ujk2NCA3VV1TOzYpVTlAIT85RjlMPTctSCAlXT85RkVOOSYpVTlAIT83V0FGOyctQj02OCAKLU03VjlTPSYlVCAlXT84RzVGPFdFTjhQIT84VlFPPFY0IDdWRVM4NzFUPjAhPzlGLUw7Vy1FICVdPzlHPUEKLU07JkwgNUZRSTxXMCA3VjlQN1ctVzo3MUM6ICE/OzZFTjo3MUY8JVwgN1Y5UDdXLVQ4NzFFN1ZVQy1DQFgKLU0uIyQgN1Q5TTtWMUUgJV0mPFcxQT0nNVMgJV1GPCVdUz0mJVQ5NV1TPTZZRjwmJCA3VjlQN1ctVDg3MUUKLU03Vy1LPjY5RjwgIT85RyE/PFcxQT0mNT88Vl1GPSc9QTxGNCA3Vy1JOVc5RThQIT8xNFU0NFchRThWRUEKLU07ICE/OUchUjo2WVQ5QCE/OzYkWSxWWT8gJV0tOSY1Rjg3NUw9ICE/MTRVNDRWRUc7RiVMOyY1RCAlXT8KLU06Nl1CICVdUjk2JUw7Jl1DICVdUzhHKUsgJV1HOTcxUDg2PUU8VkVaOTAhPzhGLU88J0QgN1VdVThGXVUKLU07RjAgN1VdPzs2JUw7JkVOOUZcIDdVXVI7Vl1UICVdPzsmKU89NllEICVdSTtWLVQ7ICE/N1Y5STtGMUkKLU07VyAgN1Y9RT0mMVQ4NilMOTctST5GNCA3VV1GN1ZVTzxGNUY6NlFFPFAhPzlFXVA8RjVBOyZRTzhQIT8KLU04ViVMOyZdQyAlXT88VkVHOUc1TjhQIT88VkVHPFY1VDs2JVM6UCE/N1ctSTlXMVI4NlVQICVdPzxWRUcKLU09RjVDICVdUzo2PUI7Jl1DOlAhPzk2WUQgJi1VPEYpUjpQIUY8JV1TODc5RSAmOVA3VylFPFcxTzxGNCAKLU03VV1EO1chUjtHMCA3VV1TOldFPzlGMCA3VV1TOldFQjg3LUUgJV1CPkY1UjtQIT84VjlSOTY0IDdWJVQKLU07VkQgN1ctVDxHLVA7QCE/N1YtVD43IUU3UCE/OzY1TThWQVIgJV1NOTZVUzk3MCA3VyVGOFZdTj1GNVIKLU09ICE/OUYtTztHOUU8RzAgN1ctVDxGLUg8QCE/OyZdQzg2UUU4Vl1OPUAhPzdWVUs4NylHOyctVCAlXVMKLU09JylMOTZYIDdVXUY7VzVSOSZFRzo3MVM8NzVJOFZMIDdXJUc4Vl1OPUY1Uj0gIT85Vi1PO0c5RTxHMCAKLU03VyVFOFZdTj1GNVI9ICE/OTYtTztHOUU8RzAgN1VdRzk3MUE8RjwgN1VdRjwmJUI4Ny1FICVdSTxXIVUKLU07Ri1UICVdSTxWPVI4NyFIICVdSTxWJVM4VkVJICVdVDtWJVM4VkVJICVdPzs2KT84VzVSN1ZVQT4gIT8KLU06Ny1YOSZFRzo3MCA3VkVTPFchQThWNCA3VkVTODZRTj02VCA3VkVTPTchUDk3KCA3VkVTOFZZVDxGUCAKLU03VkVTPCcpSTtHMCA3VkVTODZRUDomJCA3VkVTOSZFRzo3MCA3VkVTOyZdVzk3KCA3VylFODYwIDdWUUMKLU07VllWICVdRzk3MUw7Vi1BOyY1PzhXMVk8JjQgN1VdTDg2WUc6NllGO1AhPzsmXUM4NlFEPSYtTztHOCAKLU03Vy1UPEYtQT0gIT83VlVZN1cxSTs2NCA3Vy1FPSZRTzhWJUw5MCE/PFcxUj0mXUsgJV1JO0ZFVDdXLVQKLU04NzFJOFcsIDdWPUU9JlFPOFYlTDk1XU49NlVFPEZFQyAlXU05NlVDPCdEIDdVXUw7Vi1BOyY1UyAlXVMKLU09JylDOzcgIDdWXVA5NlggN1ZdUDk2WUw7Vi1BOyY0IDdXLVQ8Ri1QPjAhPzdWLU85JjU/PFY1VDdWRU4KLU05RlwgN1VdQz0nRVA5NV1VOyAhPzlWNVQ5NllWICVdPzknMUM7VllWICVdUz0nKVA4RylLICVdRjwlXUQKLU06NylFOFcxSTtWWCA3VV1GPCVdQz03KVI5NllUN1YxSTxGNUM9JkVPO0AhPzdWOVA3Vi1VPEcpRTtHMT8KLU05N0FDOTchVDo2XU48UCE/N1Y5UDdWLVU8RylFO0cxPzwnKUU4VkVTOjZdTiAlXUQ7VzVCOyY1Pz0mXT8KLU05JjVDOjZVQTsgIT85Vi1WPSAhPzdWPUM9RzAgN1YpSTtGJVI+NV1UO1VdRDk2LUk7NiVMN1ZFTj0mNUcKLU05NyggN1VdUjo2PUg9JV1TOiZFRj0lXUI4Ny1FN1cxVztQIT85JjVDOjZVQTslXVI7VzVOOSAhPzdWKUkKLU05VV1GOyZdQT0lXVQ6NlVFPFVdUDtXPUU8QCE/OEZFTjg3KVk3VzFPN1YxRThWRU04NlE/OUcpQThXMUkKLU07VlggN1VdRjwlXU47VylNODZRST5GNCA3Vy1QPEZFTj0mOCA3VV1GPEY1RTdWKUk5VV1GOyZdQT0gIT8KLU03VzVOPCYlQzpWNUQ3VzFPN1YpSTlVXUY7Jl1BPSAhPzdWKUE8VjU/OFZdTj1GNVI8VkVPO0VdQThGXVIKLU09ICE/N1c1TjwmJUM6VV1EO1c1QjsmNCA3VV1DOyYlUzxVXUQ7VzVCOyY0IDdXJVU4NjFSPTchTDk1XVQKLU07VV1EOTYtSTs2JUwgJV0/PTZZUDg2LUs5NjE/PSZdPzkmNUM6NlVBOyAhPzdWKUk5VV1COjZZQTxHRT8KLU09Jl0/OEZFRzdWMUU4VkVNODZQIDdVXVU7RyFBOFZNPzw3NUE5JylVPCZRRSAlXT84VlFBPFctPzw3NUEKLU05JylVPCZRRSAlXT85RyE/OyY1Rj0nLUg6NjlUICVdPzlHIT88VjVUN1Y1WDhWNVA9JkVPO0AhPzdXNU0KLU04NiwgN1VdTT02UVQ6NyFMPjVdQjg3LUU3VzFXO1VdVjk2LVQ7VyggN1VdTT02UVQ6NyFMPjVdQjg3LUUKLU03VzFFO0VdVjk2LVQ7VyggN1VdQzg3KVI+NV1QPEZdUDg2PUE9JjU/PSc9TyAlXT84ViVSPEdFPzwnKU8KLU08JiVHODcxRTdXMUU7QCE/N1YtQTxHKVk3VkVON1YoUSwjIFAsICE/N1chUjtWMUM3VihRLCMgUCwgIT8KLU03VlVVOycxSTwmUVk3VilBPFY1Pz0nPU8gJV0/OyY1Rj0lXVM6JkVGPSVdQjg3LUU3VzFXO1AhPzdWVVUKLU07JzFJPCZRWTdWKUE8VjU/PSY1TjdWKVk3VzFXO1AhPzdWVVU7JzFJPCZRWTdWKUE8VjU/PSY1TiAlXT8KLU07JjVGPSVdUzomRUY9JV1CODctRTdXMUU7QCE/N1chUjtWMT8sMyBQLCMhPzhDOFUtMyxWICVdPzwnKU8KLU05JV1CLUM0VSxTOCA3VV1DODcpUj41XU89NzE/OEMkUCwjIFAgJV0/PCcpTzklXFYtMzRTLUVdQiwzIFAKLU0sIyAgN1VdTDxWQUk5RzE/OEMkUCwjIFAgJV0/PCcpTzklXUIsMyBQLCMgIDdVXU09NlE/LUM0VSxTOVMKLU06Jl1SPSAhPzwnKUk7RzFGICVdPzsmNUE5JkVOOVVdWjk3KU88VV1COjY9PzwmXVc5NylTN1cxRTtAIT8KLU03VlFFODYxSTtGPT8+RjVSO1ctPzxWVUE7JlE/PCZdVzk3KVM3VzFFO0AhPzdWUUU4NjFJO0Y9Pz5GNVIKLU07Vy0/PSZFTj41XVA7Vz1FPEctPz0mNU4gJV0/PFcxQTxHMT84RkVHN1chTz1WNVI8VV1UOTZYIDdVXVMKLU09JiVSPSVdUzs2JUw7JV1QO1c9RTxHLT89JjVOICVdPzxXMUE8RzE/PSZFTj41XVA7Vz1FPEctPz0mNU4KLU0gJV0/OEZFRzdXIU89VjVSPFVdVDk2WCA3VV1TOzYlTDslXVA7Vz1FPEctPz0mNU4gJV0/PSZFTj41XVAKLU07Vz1FPEctPz0mNU4gJV0/OzYlWDdWKUk5VV1QO1c9RTxHLT89JjVOICVdPzs2JVg3Vy1NODZRTDdXIU8KLU09VjVSPFVdVDk2WCA3VV1NODdBPz0mRU4+NV1QO1c9RTxHLT89JjVOICVdPzhWXVA+NV1COjY9PzlGUU8KLU04NzE/OSZFRzo3MVMgJV1BOEZdUj0gIT83Vy1UODcpVDdWKUk5VV1QO1c9RTxHLT89Jz1PICVdPzxXMUEKLU08RzE/PFZVQTsmUT88Jl1XOTcpUzdXMVc7UCE/N1ctVDg3KVQ3VzFJO0dFPzwmXVc5NylTN1cxVztQIT8KLU03VilJOVVdUDtXPUU8Ry0/PSc9TyAlXT88VlVBOyZRPzwmXVc5NylTN1cxVztQIT83VzFJO0dFPzwmXVcKLU05NylTN1cxVztQIT83VlVBPiVdQjo2PT88Jl1XOTcpUzdXMVc7UCE/N1ZVQT4lXVM7NiVMOyVdUDtXPUUKLU08Ry0/PSc9TyAlXT87NiVYN1cxSTtHRT88Jl1XOTcpUzdXMVc7UCE/PCY1UjxGXVIgJV1LOjZRTCAlXVMKLU06Nj1OODZQIDdWPUU9JyFJOSAhPzdXIUU8RylPPEAhPzxXRVM3VjVSPEZRSTxXMCA3Vz1SOjcxRT1AIT8KLT08V0VTN1ZZRTxHKCA3VjVUOTdBVCAlXUU5JiVUODAhPzdWNU45ICFSCi0gCi1lbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1lbGYudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1lbGYudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkMDVlNy4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstZWxmLnUKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotYmVnaW4gNzc3IG02OGstZWxmCi1NP1Q1LDFAJCIgMCAgICAgICAgICAgICAiICAwICAgICFAICAkPiAgICAjMCAgIyIwICAgICAgIFQgIiAgCi1NITAgSCAhNCAkMCAgICA4ICAgIFRAICAgLSAgICAgICAgICJAICAgIEggICAgIDQgICAgICAgICAgUCAgCi1NIC0wICAgICAgICAgICAgICAhLCAgICAgICAgICEgICAgICAgICAgISAgICAtKCAgICMwICAgICAgICApCi1NQyAgICI4UCAgICAlICAgQCAgICAgICQgICBHIEAgIElQICAgICAgICAgIjQgICAiNiAgICAgPCAgIiAgCi1NICAgICBAICAiPjIgICJHRCAgICAgICAgICcgICAgICAgICAgIVAgICAgIE89Ny1SK1ZRSThCXUw6NilDCi1NK0ctTytDJCAgICAgICYkICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICA0ICAgICAgICAgIFAgICAgICAgICAgICAgICFQICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgCi1NICAgICAgICAgICArICAgICAgICAgICAgICAgICAgICAhICAgICAgICAgICAgICAgIEAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJAICAgICAgICAgICAgICAgICAgCi1NICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NIUAgICAgICAgICAgICAgICAgICAgICAgICAgISAgICAgICAgICIwMiAgICAgICAgIkggICshQCAgICAgCi1NJDAjX1wwICAgIF4gICJHJCAgICAhISQgICBIICAgIDhAICApUCAgICAgIDEgL19RICAgICdQICAgICAgCi1NICAhOiRAICAgICAgICI6ICAiSTQgICAgICEkIF9fJCAgICBNICAgICAgICAgICAyICAgICAgICAsSCAgCi1NIS1AICAgICQkMCAgIiAgICAjXCAgICAgICAgICAhKCAgICAgICAhKUAgIElSICAgICAgMSAvX1EgICAgCi1NN1ggICo+MCAgICAgJDAjX1wwIT84VlFFODZZVTwgIT85NllEICVdRTtHOUk8Rl1OICVdRT0mNVg9ICFBCi1NPSY1WDo3MCA3VjVEODcxQSAmNVg6NzAgN1ZRSThFXVY5NylTOjZdTiAlXT85RyFTPSYlUj0gIT8xVFEvCi1NMEQlLDdUXSYxRS0lNSVdNDA0KSwxNVwgN1QxOTNEJS0yNCwgK1c1UzxCXUw6NihPOyZFQjhSWVM7UlhRCi1NICAiICAiRzQgICAlJTAgICAgIiAgIkc4ICAgISUwICAgICIgICJHPCAgICklMCAgICAiICAiR0AgICAnCi1NJTAgICAgIS49NFlRK1NMITwgICApOzkuXlAlUSAgIEVMQCAgICAhLl5QJVEgICBFSkJcXCAgICAgJiNfCi1NX19fX1ckW1sgNyQgICI2OitTUCAgICAsOC9fX19fXygzT0whPDAgICk4SE8vICAgICFBQF9fX19fWzEuCi1NXlAlUSAgIEU+QlxcICAgICkmI19fX19fSCJcXEAgIClPJFpZQCAgJColQS8oI1IgICAwXDlfXCAgICAuCi1NK1AhLk44ICAhIkE4M1lfXCAgICAjIlo2MD5YICEiXSggIDEqRiY7XChcQiAgIkckK1RAICIkWllAICAkCi1NJCRaWUAgICQ0JFpZQCAgJ0siWiAzS0YgICAxRDNHNS48MCAgICAhKCNPX19fX1EoW1AgICAgM1ItXyAgCi1NIDcgICAgICQ8ICFAX1AgICAgM1ItXSAgIDcgICAgICQzLlwgICAgJDNFWS49NEAuX19fX18kQ08gICAgCi1NIS8oV1wgICE8ICAgICAxUCAmI18gICAgIS8oV1QgICE8ICAgICAxLFtQICAgIDEuN0RZVTIgW19fX19cCi1NMi5cICAgICRcQz9QICAlUCAgICAhJyAgOC9cICAgICRcQz8wICAlUCAgICAhJFNPICAgICEkWT4zRzUoCi1NI09fX19fUShbUCAgICAzUi1fICAgNyAgICAgJDwgIUBfUCAgICAzUi1dICAgNyAgICAgJDMuXCAgICAkCi1NM0VZLj00QC5fX19fXyRDTyAgICAhLyhXXCAgITwgICAgIDFQICYjXyAgICAhLyhXVCAgITwgICAgIDEsCi1NW1AgICAgMS43RFlVMiBbX19fX1wyLlwgICAgJFxDP1AgICVQICAgICEnICA4L1wgICAgJFxDPzAgICVQCi1NICAgICEkU08gICAgISRZPjNHNSgjT19fX19RKFtQICAgIDNSLV8gICA3ICAgICAkPCAhQF9QICAgIDNSCi1NLV0gICA3ICAgICAkMy5cICAgICQzRVkuPTRALl9fX19fJENPICAgICEvKFdcICAhPCAgICAgMVAgJiNfCi1NICAgICEvKFdUICAhPCAgICAgMSxbUCAgICAxLjdEWVUyIFtfX19fXDIuXCAgICAkXEM/UCAgJVAgICAgCi1NIScgIDgvXCAgICAkXEM/MCAgJVAgICAgISRTTyAgICAhJFk+M0c1KCNPX19fX1EoW1AgICAgM1ItXyAgCi1NIDcgICAgICQ8ICFAX1AgICAgM1ItXSAgIDcgICAgICQzLlwgICAgJDNFWS49NEAuX19fX18kQ08gICAgCi1NIS8oV1wgICE8ICAgICAxUCAmI18gICAgIS8oV1QgICE8ICAgICAxLFtQICAgIDEuN0RZVTIgW19fX19cCi1NMi5cICAgICRcQz9QICAlUCAgICAhJyAgOC9cICAgICRcQz8wICAlUCAgICAhJFNPICAgICEkWT4zRzUoCi1NI09fX19fUShbUCAgICAzUi1fICAgNyAgICAgJFxDUTQgICAgICAgICAgICA4L1wgICAgJFxDPzAgICVQCi1NICAgICEkU08gICAgISRZPjNHNSgjT19fX19RKFtQICAgIDNSLV8gICA3ICAgICAkXENRNCAgICAgICAgCi1NICAgIDgvXCAgICAkXEM/MCAgJVAgICAgISRTTyAgICAhJFk+M0c1KCNPX19fX1EoW1AgICAgM1ItXyAgCi1NIDcgICAgICQwQ0YgICJNRCRfUCAgOCAgKk4gM18gICJAICBKSSMvXCAgLiAgIks4LF9QICEoICAqTEBTCi1NXyAgJUAgIEo7Ii9cICAgICFIICAqR0BDXyAgICAgPiAgIkk4KF9QICAgIChAICBKNyIvXCAgICAiOCAgCi1NKk0wQ18gICAgIEogICJJRChfUCAgICArQCAgSlkiL1wwTEAgICggICpKQENfJCFJICAiICAiSVAoX1AgCi1NICAgIEAgIEo9IS9ZQCAgSzkoICAqVCAzXjggICpOIiAgIkpAJF9GICAiSkRAICBKOCMvWUAgIEpWKCAgCi1NKk5AU144ICAqTEIgICJKVCxfRiAgIklMQCAgSlsiL1lAICBKPiggICpIMENeOCAgKkVCICAiS1goX0YgCi1NICJJPEAgIEpPIi9ZQCAgSlUoICAqVVBDXjggICpGMiAgIkpMKF9GICAiS0RAICBKUyIvWUAgIEpKKCAgCi1NKlRQQ144ICAqRyIgICJKMChfRiAgIklUQCAgSkUiL1xAICBLOSggICpPIENfKCAgKk4iICAiTTgoX1IgCi1NICJKREAgIEpdIi9cQCAgSlYoICAqVTBDXyggICpMQiAgIkwoKF9SICAiSUxAICBKOiIvXEAgIEo+KCAgCi1NKktAQ18oICAqRUIgICJMIChfUiAgIkk8QCAgSlEiL1xAICBKVSggICpNUENfKCAgKkYyICAiTSgoX1IgCi1NICJLREAgIEpAIi9cQCAgSkooICAqVDBDXyggICpHIiAgIkwsKF9QICAgICJAICBKQyIvXCAgICAgSCAgCi1NKkdQQ18gICAgICYgICJQIChfUCAgICAhQCAgSzoiL1lAICBLISggICpXIFNeOCAgKyEiICAiUChcQz8wCi1NICAlUCAgICAhJFNPICAgICEkWT4zRzUuPTRZUSAgICAgICAgICAiICAiR0QgICAgICAgICAgIiAgIDBQCi1NQCAgJDEoICAhJUIgICAxTCAgICAgMCAgICZAICAgICxAICAkJCAgICAgViAgIEZcICAgICEoICAgLkAgCi1NICAgJUAgICM5ICAgICA6ICAgKkQgICAgIkAgICAnTCAgICArICAgICQgICAgITQgICAgICAgICAgWCAgCi1NKjxAICAgICIgICAgLCAgICAhMCAgICAnICAgICVYICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAwICAgICAgICAgICEgI19cMCAgICAiICAgIzQgICAgICAsICAgJCAgICAgCi1NQCAgIFogICAgICAjICAgIiAgICAgKCAgIEowICAgICAgUCAgIFAgICAgIiAgIC1EICAgICAgLCAgIDAgCi1NICAgIEAgICNYICAgICAgIyAgICUgICAgICggICEhICAgICAgIFAgICFAICAgICIgICAwNCAgICAgICwgCi1NICA8ICAgICBAICAkPiAgICAgICMgICAoICAgICAoICAiO1AgICAgICBQICAiMCAgICAiICAiRyAgICAgCi1NICAsICAgSCAgICAgQCAgSVIgICAgICAjICAgKyAgICAgKCAgKj4wICAgICAgUCAgIyAgICAgIiAgIkk4Ci1NICAgICAgLCAgIFQgICAgICAgICAgICAgICAgIyAgIC4gICAgICAgICAgICAgICAgIFAgICNQICAgICAgCi1NICAgICAgICAgICwgICEgICAgICAgICAgICAgICAgICMgICAxICAgICAgICAgICAgICAgICBQICAkQCAgCi1NICAgICAgICAgICAgICAsICAhLCAgICAgICAgICAgICAgICAjICAgNCAgICAiQCAgICAgICAgICAhICNfCi1NXDAgICAhJCAgICAgICAgICAgMCBfXyQgICAgOCAgICAgICAgICAgJCAvX1EgICAgKSAgICAgICAgICAgCi1NISAjX1wwICAgIlAgICAgICAgICAgIDAgX18kICAgIFYgICAgICAgICAgICQgL19RICAgIC84ICAhLVAgCi1NICAgUiRAICAiICAgICRGICAiSTggICAgISEkICAgVCAgICE2QCAgSjcgICAgIDAxICAgLSAgICA5OCAgCi1NIjtQICAgICAkQCAgIjAgICAmTiAgIklAICAgICBBJCAgIFQgICAiIUAgICdLICAgIEEgMiAgICggICAgCi1NQUggICpGMCAgICAkJDAgICMwICAgKTIgICJJSCAgICAhISQgICBUICAgIk1AICAkLyAgICAiMDIgICAgCi1NICAgIE1IICArIUAgICAgICQwI19cMCAgICtOICAiSUwgICAgIEEkICAgVCAgICMsQCAgJVVAICAgIygyCi1NICAgKCAgICBYSCAgKkcgICAgICgkMCAgIzAgICAuTiAgIklYICAgICEhJCAgIFQgICAjUUAgICQ+ICAgCi1NICAgMiAgICggICAgXiggICpHUCAgICAkJDAgICMwICAgMC4gICJHJCAgICAhISQgICBIICAgJCxAICBKCi1NQCAgICAgMDEgICAtICAgISkoICAqSDAgICAgKCQwICAjMCAgIDMiICAiSiwgICAgISEkICAgVCAgICRYCi1NQCAgJSNAICAgIygyICAgKCAgICEyWCAgKkkgICAgIDAkMCAgIzAgICA1SiAgIEcgICAgICAhJCBfXyQgCi1NICAlQUAgIEpIICAgICAoMSAgIC0gICAhPTggICpKMCAgICAhJDAgICMwICAgODYgICJKSCAgICAhISQgCi1NICBUICAgJi1AICBKSyAgICAgQDEgICAtICAgIUg4ICAhIkAgICAhOiRAICAgICAgIDpCICAiRyQgICAgCi1NISIkICAgSCAgICZQQCAgJkdAICAgIygyICAgKCAgICFPKCAgIVAoICAgIFIkQCAgIiAgICA9JiAgIkpUCi1NICAgICEhJCAgIFQgICAnRkAgIEpOICAgICAwMSAgIC0gICAhXSggICpFMCAgICAgJDAjX1wwICAgP04gCi1NICA1UiAgICAsQSggICBAICAgKChAICBKTyAgICAgQDEgICAtICAgIic4ICAqTDAgICAgJCQwICAjMCAgCi1NIEMyICAgOCggICAgLEEoICAgQCAgIChfQCAgSlIgICAgICgxICAgLSAgICIzSCAgIVMwICAgIFwkQCAgCi1NIiAgICBFTiAgIDFEICAgICAhKCAgICAgICApQEAgIEpTICAgICBAMSAgIC0gICAiPUggICpNMCAgICAkCi1NJDAgICMwICAgR1YgICJLOCAgICAgQSQgICBUICAgKiVAICBKVyAgICAgMDEgICAtICAgIkUoICAqTiAgCi1NICAgISQwICAjMCAgIEoqICAiS0QgICAgISEkICAgVCAgICpSQCAgSlogICAgIDAxICAgLSAgICJQKCAgCi1NKk5QICAgICQkMCAgIzAgICBNPiAgIDM4ICAgICEhJCAgIEAgICArREAgICRVICAgICAgMiAgICggICAiCi1NWyggICpPICAgICAkJDAgICMwICAgT04gICJLVCAgICAhISQgICBUICAgLDNAICBKXiAgICAgQDEgICAtCi1NICAgIylIICAhJSAgICAgICRAICAgICAgIFMiICAiTCAgICAgISEkICAgVCAgIC0lQCAgSyEgICAgIDAxCi1NICAgLSAgICMzKCAgKjxAICAgICAkMCNfXDAgICBWKiAgIkwoICAgICEhJCAgIFQgICAtWUAgIEsjICAgCi1NICAwMSAgIC0gICAjQkggICo8ICAgICAkJDAgICJAICAgWVIgICJMMCAgICAmISQgICBUICAgLkZAICBLCi1NKiAgICAhQDEgICAtICAgI0woICAqVCAgICAgIiQwICAjMCAgIFtWICAiTSQgICAgISEkICAgVCAgIC8tCi1NQCAgSzIgICAgIDAxICAgLSAgICNYWCAgIVcgICAgIFwkQCAgIiAgICBfJiAgIDhaICAgICxBKCAgIEAgCi1NICAwI0AgIElZICAgICAgMSAvX1EgICAkIyggICpUUCAgICAoJDAgICMwICAhIUogICJNNCAgICAhISQgCi1NICBUICAgMEpAICAmVCAgICAjKDIgICAoICAgJC84ICAqVUAgICAgJCQwICAjMCAgISUuICAiTTwgICAgCi1NIiEkICAgVCAgIDFAQCAgJCQgICAgICAyICAgJiAgICQ5SCAgKlYwICAgICEkMCAgIzAgICEmViAgIk1ICi1NICAgICEhJCAgIFQgICAxVUAgICUwICAgICMoMiAgICggICAkQkggICpXICAgICIwJDAgICMwICAhKSYgCi1NICA2RCAgICAsQSggICBAICAgMkVAICBMICAgICAgMDEgICAtICAgJEtYICArIEAgICAgKCQwICAjMCAgCi1NIStCICAgOUwgICAgLEEoICAgQCAgIDMsQCAgTCQgICAgIEAxICAgLSAmVFYuJkxOOTZRRiAmLVI9IyROCi1NPFAhQzxHMUkrRywgPUYlTD02NVMrNUFUK0YsIDlWMUI7NjROOFAhUzolXUQ4NzFBK0YsIDhXKVQ7QllTCi1NICc5PzhWQUE8RV1GPTZZQyAnOT88VkVHO0Y1RDdWRU49ICFWN1c1TjxWRUc7RjVEN1ZFTj0gIT85RkVOCi1NOjAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RCA7NiVJO0AhVjdXLUk5VllFOSVdTDtWWUcgJzk/Ci1NPTZZUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxAIT84VlFFODZZVTwgIT85NllEICc5Pz02WVM6Nj1OCi1NOTYxPzxWQU88RzAgPUVdVTtHLUk5VllFOSVdUzomXVI9JV1GPTZZQyAnOT85Jl1VOEZRRSAnOT86NllUCi1NICVdUz0mJVI9ICFOO1ZZUDxGRU04NylZICVdRTtHOUk8Rl1OICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1QCi1NO1ZFTj0mNVIgJzk/OjZZVDdWJVI8RiVZICchUjo2VUE8R0QgPUVdUzo2PU45NjE/OFZBQTxFXUY9NllDCi1NICc5PzkmXVU4RlFFN1YlUjxGJVkgJV1FPSY1WD0gIVY3Vy1JOVZZRTklXUM6JiVSN1YlUjxGJVkgJzk/Ci1NPTZZUzo2PU45NjE/OFZBQTxAIVY3VjlMO1YlVCAnOT88VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA4NzFFCi1NPiZFVCAmNU49RkVSO1ZYID1FXUw7VllHN1Y5VTtGLCA9RV1VO0ctSTlWWUU5JV1MO1ZZRzdWOVU7RiwgCi1NPUVdUzo2PU45NjE/PFZBTzxHMT84NylSODdEID1FXUk7RzE/PCZdSTtHMUU8QCE/OTYxQT0mJCA9RV1TCi1NOiZdUj0lXUY9NllDICc5Pz02WVM6Nj1OOTYxPzo2WVQ3ViVSPEYlWSAnOT89NllTOjY9Tjk2MT86NllUCi1NN1chTzo2WVQ5NyggPUVdSTtHMT85RzVOOFAhVjdXLUk5VllFOSVdUzomXVI9ICFWN1Y5TDtWJVQ3VjlVCi1NO0YsIDk3QUk9ICFWN1c1TjxWRUc7RjVEN1ZRTztGPT84NylSODdEID1FXUw7VllHICc5PzxWQU88RzAgCi1NPUVdTDtWWUc3VyFPOjZZVDk3KCA9RV1TOjY9Tjk2MT84VkFBPEAhVjdXNU48VkVHO0Y1RDdWUU87RjwgCi1NPUVdUzomXVI9JV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICVdTDo2KT89RjVSCi1NPFZFTztAIT87Ni1PPTZZVCAnOT84VkFBPEVdUDtWRU49JjVSICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1QCi1NO1ZFTj0mNVIgJzk/PFZFRztGNUQ3VkVOPSVdQTxHKUE+MCE/N1Y5UDxXMUE8RzAgPUVdUzo2PU45NjE/Ci1NOjZZVDdXIU86NllUOTcoIDxVXUw6NllLICVdJzMkXSIwNFE/M1Q5JjRUNTQ3VTEhMERRJTdQIVY3Vy1JCi1NOVZZRTklXVM6Jl1SPSVdUDtWRU49JjVSICc5PzkmXVU4RlFFN1chTzo2WVQ5NyggN1VdTDtWWUc5Jl1VCi1NOEZRRTdXNVM5NjAgPUVdUz0nKVU4VzBRICc5PzxXMVI9Ni1ULEAhVjdWLUg4Nyk/ODcpUjg3RCA9RV1GCi1NOyZdQT0lXVA7VkVOPSY1UiAnOT88VkVHO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCFWN1YxTz02KUw5NV1GCi1NPTZZQyAnOT88VkVHO0Y1RDdWRU49JV1GPTZZQyAlXSQ2NFkhMzRFIyAnOT85RlFPODcxPzg3KVI4N0QgCi1NPUVdUzomXVI9JV1QO1ZFTj0mNVIgJzk/PFZFRztGNUQ3VlFPO0Y9PzlHNU44UCFWN1ctSTlWWUU5JV1DCi1NOiYlUjdXIU86NllUOTcoID1FXUw7VllHN1YlUjxGJVkgJV1JO0ZFVCAnOT84VkFBPEAhQzsnNU46VjVSCi1NICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAnNT87JkVOOlAhVjdXLUk5VllFOSVdUzomXVI9JV1GCi1NPTZZQyAnLVA7VylUPFYtQTxAIVY3VzVOOjZdTixAIVY3VzVOPFZFRztGNUQ3VkVOPSVdRj02WUMgJzk/Ci1NPTZZSTtWWCAgIllJO0cxRTxHICArRkFBPFZAICtGMVk7Ry1ZOzAgTjknRU48VzFSICJZUjk2UUErRyFMCi1NPSAgTjo2WUk9ICBOPCZRVCAiWVQ5N0FUICJZRjo2WUkgIllEODcxQSAiWUc7VzAgK0YxWTtGJU06NiwgCi1NK0YpUzxQIE48V0VNPSYlQiAiWVM9JylUODYoICtHIUU8VjVMICJZUzonLVQ8RzFBOEAgTjhWXU07NjVOCi1NPSAgTjkmNUI9NjwgK0ZRSTtGNCAwIkBDKjZRSThGLE07MyxSLkZUVCtGMUU5QERRK0MwIDAiQEMqNlFJCi1NOEYsTTszLFIuRi1TPTJdQzxHMFErRywpLDJYUS4gICAgICEgKiIsSTsmRUI4UlVNLFMoWjszME45JjVGCi1NIjMkTi0gISAqIixJOyZFQjhSVU0sUyhaOFctVStWLVI9JkROPFBEUStDLCA4NyxaKCJBIzElLEkoIzROCi1NLCIgUStTKE8uMyAgICAgIDAiQEMqNlFJOEYsTTszLFIuRlRUK0YxRTlARFErQzAgMCJAQyo2UUk4RixNCi1NOzMsUi5GLVM9Ml1DPEcxTitHLCksMlhWICIhTDkiIFooIkEjMSUsSSgjNE4sIiBRK1MoTy4zICAgICAgCi1NICJYICQwIDIgICA2PCAgWDlWMUI7NjROOFAgIS1AICAgICQhJDggICEtUCEoOCAgIjtQISFAICAgICAgCi1NICAgPSAhLCAkQCAgIDRYIC4nMT88VzFSPTYtVCAgIlYgICAgJiAgICAiSCAjMCAyICAgID0wIFg9RV1DCi1NOiYlUjdWVUU7NilFPEAgIDUwICEgIiwgIUAwICAgICAhUCAgICJMICMwIDIgICAgSCAgWD1FXVM6Jl1SCi1NPSVdTTk2VUI5NyggICU0ICEgIEMgIDgkICAgICBAPCAgICBJICBUICRAICAgLEQgLic5Pzo2WVQ3VlVFCi1NOzYpRTxAICA1MCAnICIsICFAMCAgICAkIVAgICAiSCAjMCAyICAgIFxQIFg9RV1MO1ZZRzdWVUU7NilFCi1NPEAgIDUwICogIiwgIUAwICAgICghUCAgICJMICMwIDIgICAhJ0AgWD1FXUY7Jl1BPSVdTTk2VUI5NyggCi1NICU0ICNAIEMgIDgkICAgICMgPCAgICBMICBUICRAICAgNEggLic5PzkmXVU4RlFFN1ZVRTs2KUU8QCAgCi1NNTAgLyAiLCAhQDAgICAgMCFQICAgIDAgICAgOyAhLCAkQCAgIEZQIC4nWFA5RiVLOTAgIE1AICAgIUAgCi1NICAgSiAgVCAkQCAgIDksIC4nOT84VkFBPEVdTTk2VUI5NyggICU0ICAwIEMgIDgkICAgICAgPCAgICBLCi1NICBUICRAICAgO1ggLic5PzxWQU88RzE/OzY1TThGNVIgICE1ICAwIChQICYhICAgICAoJyAgICAqMCAtCi1NICEoICAgJ0cgI0FWN1ZFTj0lXU05NlVCOTcoICAlNCAhUCBDICA4JCAgICAhIDwgICAgSiAgVCAkQCAgCi1NIEEkIC4nOT87Jl1OOVVdTTk2VUI5NyggICU0ICJAIEMgIDgkICAgICIgPCAgICBLICBUICRAICAgQ1AgCi1NLic5PzlGUU84NzE/OzY1TThGNVIgICE1ICBYIChQICYhICAgICBQJyAgICArICAtICEoICAgKUggI0FWCi1NN1YxTz02KUw5NV1NOTZVQjk3KCAgJTQgI1AgQyAgOCQgICAgJCA8ICAgICQgICAgJyAgNyAhKCAgIC4rCi1NICNBVDdXNU46Nl1OICAiViAgICAiICAgICJIICMwIDIgICAiTEAgWD1FXUM6JiVSN1ZVRTs2KUU8QCAgCi1NNTAgISAiLCAhQDAgICAgICFQICAgIkwgIzAgMiAgICJXMCBYPUVdUzomXVI9JV1NOTZVQjk3KCAgJTQgCi1NISAgQyAgOCQgICAgICA8ICAgIEkgIFQgJEAgICBQOCAuJzk/OjZZVDdWVUU7NilFPEAgIDUwICcgIiwgCi1NIUAwICAgICAhUCAgICJIICMwIDIgICAjLCAgWD1FXUw7VllHN1ZVRTs2KUU8QCAgNTAgKiAiLCAhQDAgCi1NICAgICFQICAgIkwgIzAgMiAgICM2UCBYPUVdRjsmXUE9JV1NOTZVQjk3KCAgJTQgI0AgQyAgOCQgICAgCi1NICA8ICAgIEwgIFQgJEAgICBYPCAuJzk/OSZdVThGUUU3VlVFOzYpRTxAICA1MCAvICIsICFAMCAgICAgCi1NIVAgICAgMCAgICA7ICE8ICRAICAhKkQgLidYUTlGJUs5MCAgTUAgICAgQCAgICBKICBUICRAICAgXSAgCi1NLic5PzhWQUE8RV1NOTZVQjk3KCAgJTQgIDAgQyAgOCQgICAgICA8ICAgIEsgIFQgJEAgICBfTCAuJzk/Ci1NPFZBTzxHMT87NjVNOEY1UiAgITUgIDAgKFAgJiEgICAgICAnICAgICowIC0gISggICAwRCAjQVY3VkVOCi1NPSVdTTk2VUI5NyggICU0ICFQIEMgIDgkICAgICAgPCAgICBKICBUICRAICAhJFggLic5PzsmXU45VV1NCi1NOTZVQjk3KCAgJTQgIkAgQyAgOCQgICAgICA8ICAgIEsgIFQgJEAgICEnRCAuJzk/OUZRTzg3MT87NjVNCi1NOEY1UiAgITUgIFggKFAgJiEgICAgICAnICAgICsgIC0gISggICAyRSAjQVY3VjFPPTYpTDk1XU05NlVCCi1NOTcoICAlNCAjUCBDICA4JCAgICAgIDwgICAgJCAgICAqQCAmICEoICAgMzcgI0FWN1YtSDg3KT85RzVOCi1NOFAgIDUwICEgMSYgICAzPCAyJiAgIDQuICAgICEgICAgIyQgIUAgMiAgICUjICBYPUVdUzo2PU45NjE/Ci1NOFZBQTxFXUY9NllDICAhNSAgKCEkOCAgITBYISg4ICAhNCAgICAgJCAgICAsUCAmICEoICAgNSMgI0FWCi1NN1c1TjxWRUc7RjVEN1YtSDg3KT85RzVOOFAgIDUwICMgMSYgICA1ICAyJiAgIDVSICAgICEgICAgIkwgCi1NIUAgMiAgICU8QCBYPUVdUzomXVI9JV1GPTZZQyAgITUgIDAhJDggICE3KCEoOCAgITowICAgICQgICAgCi1NLEAgJiAhKCAgIDZIICNBVjdXLUk5VllFOSVdUzomXVI9JV1GPTZZQyAgITUgIDQhJDggICE6MCEoOCAgCi1NIT04ICAgICQgICAgLSAgJiAhKCAgIDdAICNBVjdXNU48VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCAgJTQgCi1NIUAkMUAgICVVQCRBQCAgJiIgICAgIDAgICAgSSAgOCAkQCAgIUBUIC4nOT86NllUN1Y5VTtGLCAgJTQgCi1NIVAkMUAgICYiICRBQCAgJi5AICAgIDAgICAgUCAgOCAkQCAgIUQkIC4nOT88VkVHO0Y1RDdWRU49JV1GCi1NPTZZQyAgITUgIEAhJDggICFDSCEoOCAgIUZQICAgICQgICAgLEAgJiAhKCAgIDlXICNBVjdXNU48VkVHCi1NO0Y1RDdWRU49JV1GPTZZQyAgITUgIEQhJDggICFGUCEoOCAgIUlYICAgICQgICAgKkAgJiAhKCAgIDpFCi1NICNBVjdWUU87Rj0/OUc1TjhQICA1MCAqIDEmICAgOj4gMiYgICA7MCAgICAhICAgICMkICFAIDIgICAmCi1NVkAgWD1FXVM6Nj1OOTYxPzsmXU45VV1GPTZZQyAgITUgIEwhJDggICFNICEoOCAgIVAoICAgICQgICAgCi1NLFAgJiAhKCAgIDwxICNBVjdXNU48VkVHO0Y1RDdWUU87Rj0/OUc1TjhQICA1MCAsIDEmICAgPCIgMiYgCi1NICA8VCAgICAhICAgICJMICFAIDIgICAnMCAgWD1FXUY7Jl1BPSVdRj02WUMgICE1ICBYISQ4ICAhUzAhCi1NKDggICFXICAgICAkICAgICsgICYgISggICA9UCAjQVY3VjFPPTYpTDk1XUY9NllDICAhNSAgXCEkOCAgCi1NIVcgISg4ICAhWlAgICAgJCAgICAlMCA1ICEoICAgPk4gKCwgITAkICAgP0ogICAgJTAgJSAhKCAgID46Ci1NICgsICEwJCAgID9KICAgICQgICUgISggICA+SiAlNCAhUCAgICAwICAgIFwgICQgJEAgICFeSCBFMCAgCi1NICosICogICAiICAgICAgICAgICAgICAoICAgICAgICAgICQgICBAICAgICAgICAgIEBAIDxAICAgIlggCi1NICAgOSAhLCAkQCAgIidMIC4mUUk7RkwgICs4ICAgIjggICAgKUAgLSAhKCAgIEBJICNBTjk3QVQgICIjCi1NICA0ISAgICdaQCBDICA4JCAgICAgIDwgICAgSiAgVCAkQCAgIiUsIC4mUUk7Rk1GPTZZQyAgIiMgIDQhCi1NICAgJzwgIEMgIDgkICAgICEgPCAgICBEICBUICRAICAiJzwgLictVD02OUYgICFSICAgJ0tAIEMgIDgkCi1NICAgICIgPCAgICAkICAgICUwIDUgISggICBCWSAoLCAhMCQgICA/SiAgICAlMCAlICEoICAgQkUgKCwgCi1NITAkICAgP0ogICAgJCAgJSAhKCAgIEJVICU0ICFQICAgIDAgICAgXCAgJCAkQCAgIi80IEUwICAgKiwgCi1NKiAgICIgICAgICAgICAgICAgICggICAgICAgICAgJCAgIEAgICAgICAgICAgQEAgPEAgICAiWCAgICA8Ci1NICE8ICRAICAiOEQgLicxVTdWUUk7RkwgICs4ICAgIjAgICAgKUAgLSAhKCAgIERXICNBTjk3QVQgICIjCi1NICA0ISAgICdaQCBDICA4JCAgICAgIDwgICAgSiAgVCAkQCAgIjYkIC4mUUk7Rk1GPTZZQyAgIiMgIDQhCi1NICAgKD5QIEMgIDgkICAgICAgPCAgICBEICBUICRAICAiODQgLictVD02OUYgICFSICAgKE4wIEMgIDgkCi1NICAgICAgPCAgICAkICAgIC5AICQgISggICBHJyAjQV4sRjlBOlY0ICArOCAgICAkIC8sICZQICAgIClCCi1NOyc1RSAgICAgICVHPEY1RTtAICAgICAgPEY1RCAgICAgIDAgICAgXiAgMCAkQCAgIkBEIC4mLU87Jl1SCi1NPFAgIE1AICAgIDAgXFAgPyAgICAgRyFJO0ZMICAgICAgNyFVPEchTDkwICAgICAgPjY1TDsmXVcgICAgCi1NICAwICAgIFIgIDAgJEAgICJDXCAuJ1hTOUYlSzkwICBNQCAgICAwIFxQIDMgICAgIDY5TzxGMCAgICAgCi1NICYtSDk3OVkgICAgICAwICAgIFEgIDAgJEAgICJHMCAuJi1BPEcsICArOCAgICAkIC8sICUgICAgICVQCi1NO1cpUzhWQUUgICAgICAhQjs3PCAgICAgISAgICAjKCAhICAyICAgKkpAIFg/QzFGODZNRSAgIlYgICAgCi1NISAjUyAhLCAgICAhNSUpNTEwICAgICAgMUQlLDRUNCAgICAgISAgICAhUCAlQCAyICAgKlFAIFg4Rl1PCi1NOyY1QTtAICA8QCAgIkcwICAgIFEgIDAgJEAgICJPTCAuJilWODZRUyAgIlYgICAgISAjUyAhLCAgICAhCi1NPScpVTkwICAgICAgOUYlTDxWNCAgICAgISAgICAhVCAlQCAyICAgKyYgIFg4Rl1POyY1QTtDKCAgJyggCi1NICBLJiAgICAxQCAkICEoICAgTUIgI0FNOjctTzxGMUU8RjVEICAiViAgICAhICNTICIsICAgICM9JkFSCi1NOTY0ICAgICAgJ0lFPEZcICAgICAgNl1OOTAgICAgICI9Jz1PICAgICAgMCAgICBDICA4ICRAICAiWEQgCi1NLiZVQTo2WCAgJTQgIVAkMUAgICdLICRBQCAgKU8gICAgIDAgICAgRyAgPCAkQCAgIlsgIC4nLVA7VylUCi1NPFYtQTxAICA8QCAgIkNcIChQICUgWCAgKyAgICAgIEUgIDwgJEAgICJdNCAuJi1MPTZZSzk3KCAgJyggCi1NICBIKSAiLCAhMC4gICJNSCAgICAqICAnICEoICAgT10gI0FOO1ZZUDxGRU04NylZICAhUiAgIClRUCBDCi1NICA0I0AgIEo/ICAgICI0ICFQIDIgICAsKEAgWDwnKUk7NiVSPjAgIDxAICAiOEQgKFAgJSBYICAqSFAgCi1NICAgRCAgPCAkQCAgIyQ4IC4nNT87JkVOOlAgIDxAICAiLzQgKFAgJSBYICAqVyAgICAgRyAgPCAkQCAgCi1NIyZUIC4nLT87JkVOOlAgIEBQICUgMCAgIV5IIChQICUgWCAgKlAwICAgIEYgIDwgJEAgICMpLCAuJzk/Ci1NPTZZSTtWWFIgICFSICAgI0JQIEMgIDQjQCAgTCIgICAgIjQgIVAgMiAgICxOICBYPUVdVTtGRU87QCAgCi1NPEAgICBGUCAoUCAlIFggICshICAgICBHICA8ICRAICAjLVwgLic5PzxXMVI9Ni1ULEAgIDxAICAgNFggCi1NKFAgJSBYICAqUkAgICAgRyAgPCAkQCAgIzA4IC4nOT88VzFSPTYtVCwwICA8QCAgICJYIChQICUgWCAgCi1NKlEgICAgIE8gIDwgJEAgICMzNCAuJzk/OSZdVThGUUU3VyFPOjZZVDk3KCAgJiwgIFAkICNQIEMgIDQjCi1NQCAgSyMgICAgIlggIVAgMiAgIC04UCBYPUVdRjsmXUE9JV1QO1ZFTj0mNVIgICFDICAsISAgWCAoUCAlCi1NIFggICpUMCAgICBWICA8ICRAICAjOUQgLic5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgICFDCi1NICAsISAgUCAoUCAlIFggICpIICAgICBUICA8ICRAICAjPFQgLic5PzxWRUc7RjVEN1ZRTztGPT88Jl1JCi1NO0cxRTxAICA4UCAjIDAgKyAiLCAhMC4gICJNKCAgICArMCAnICEoICAgV1ogI0FWN1ZRTztGPT88Jl1JCi1NO0cxRTxAICA4UCAjIDAgKiAiLCAhMC4gICJLPCAgICAtMCAnICEoICAgWE8gI0FWN1c1TjxWRUc7RjVECi1NN1ZFTj0lXVA7VkVOPSY1UiAgIUMgICwhICBEIChQICUgWCAgKkwwICAgIFMgIDwgJEAgICNGKCAuJzk/Ci1NPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICAhQyAgLCEgIEAgKFAgJSBYICAqUCAgICAgTCAgPCAkQCAgCi1NI0hYIC4nOT86NllUN1chTzo2WVQ5NyggICYsICBQJCAhUCBDICA0I0AgIEpOICAgICM8ICFQIDIgICAuCi1NUTAgWD1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdUDtWRU49JjVSICAhQyAgLCEgIDggKFAgJSBYICAqRkAgCi1NICAgVSAgPCAkQCAgI09IIC4nOT88VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggICYsICBQJCAhMCBDCi1NICA0I0AgIEsiICAgICJYICFQIDIgICAvKiAgWD1FXVM6Jl1SPSVdUDtWRU49JjVSICAhQyAgLCEgIDAgCi1NKFAgJSBYICAqVTAgICAgViAgPCAkQCAgI1VYIC4nOT89NllTOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSCi1NICAhQyAgLCEgICwgKFAgJSBYICAqTzAgICAgVCAgPCAkQCAgI1koIC4nOT88VkVHO0Y1RDdWLUg4Nyk/Ci1NPCZdSTtHMUU8QCAgOFAgIyAwICIgIiwgITAuICAiTTggICAgKzAgJyAhKCAgIF5fICNBVjdWLUg4Nyk/Ci1NPCZdSTtHMUU8QCAgOFAgIyAwICEgIiwgITAuICAiS1AgICAgKSAgISAhKCAgIF9DICk0ICAgIkMgISAgCi1NICBAICAgICAgICAgIDBAIDUwIC8gICAgKyAgJyAhKCAgISAvICNBVjdWMU89NilMOTVdQTxHKUE+MCAgCi1NPEAgICNbXCAoUCAlIFggICpJICAgICBEICAkICRAICAkIywgRTAgICAqLCAkICAgIiAgICAgICAgICAhCi1NIiAhNSAgWCAgICBLICA8ICRAICAkJVggLic5PzlGUU84NzE/ODcpUjg3RCAgJyggICEgLyAiLCAhMC4gCi1NICJNLCAgICApICAhICEoICAhIiIgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgLCAgICAsUCAnCi1NICEoICAhIlUgI0FWN1c1TjxWRUc7RjVEN1ZRTztGPT84NylSODdEICAnKCAgISE+ICIsICEwLiAgIkssCi1NICAgICkgICEgISggICEjOSApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCArICAgICwwICcgISggCi1NICEkKiAjQVY3Vy1JOVZZRTklXUw7VllHN1YlUjxGJVkgICFSICAgME0wIEMgIDQjQCAgSksgICAgIjAgCi1NIDAgMiAgIDErQCI1ICAgIEhQIDAgICAoICAgICAgICAgICQoICU0ICJAICAgIkggIVAgMiAgIDE2ICBYCi1NPUVdTDtWWUc3ViVSPEYlWSAgIVIgICAxIkAgQyAgNCNAICBLNyAgICAiMCAgMCAyICAgMT8gIjUgICAgCi1NSFAgMCAgICggICAgICAgICAgJCggJTQgIjAgICAjKCAhUCAyICAgMUtAIFg9RV1VO0ctSTlWWUU5JV1JCi1NO0cxPzg3KVI4N0QgICcoICAhJTggIiwgITAuICAiSlwgICAgKSAgISAhKCAgIScyICk0ICAgIkMgISAgCi1NICBAICAgICAgICAgIDBAIDUwICggICAgLCAgJyAhKCAgISgiICNBVjdXLUk5VllFOSVdSTtHMT84NylSCi1NODdEICAnKCAgISZOICIsICEwLiAgIktYICAgICkgICEgISggICEoRiApNCAgICJDICEgICAgQCAgICAgCi1NICAgICAwQCA1MCAnICAgICowICcgISggICEpLyAjQVY3VkVOPSVdQTxHKUE+MCAgPEAgICRAKCAoUCAlCi1NIFggICpIMCAgICBEICAkICRAICAkRywgRTAgICAqLCAkICAgIiAgICAgICAgICAhIiAhNSAgOCAgICBUCi1NICA8ICRAICAkSjwgLic5Pz02WVM6Nj1OOTYxPzxWQU88RzE/ODcpUjg3RCAgJyggICEpLyAiLCAhMC4gCi1NICJLTCAgICApICAhICEoICAhKysgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgJSAgICAsQCAnCi1NICEoICAhK10gI0FWN1ctSTlWWUU5JV1TOiZdUj0lXUE8RylBPjAgIDxAICAkSjwgKFAgJSBYICAqSzAgCi1NICAgRCAgJCAkQCAgJFIkIEUwICAgKiwgJCAgICIgICAgICAgICAgISIgITUgIDAgICAgSyAgPCAkQCAgCi1NJFRQIC4nOT88VkFPPEcxPzg3KVI4N0QgICcoICAhK10gIiwgITAuICAiS0ggICAgKSAgISAhKCAgIS1QCi1NICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICMgICAgLFAgJyAhKCAgIS5DICNBVjdXNU48VkVHCi1NO0Y1RDdWLUg4Nyk/ODcpUjg3RCAgJyggICEtLCAiLCAhMC4gICJJQCAgICApICAhICEoICAhLycgKTQgCi1NICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgIiAgICAsMCAnICEoICAhL1ggI0FWN1ctSTlWWUU5JV1DCi1NOiYlUjdWJVI8RiVZICAhUiAgIDNIUCBDICA0I0AgIEpIICAgICIwICAwIDIgICA0JyAiNSAgICBIUCAwCi1NICAgKCAgICAgICAgICAkKCAlNCAgMCAgICJIICFQIDIgICA0MUAgWD1FXUM6JiVSN1YlUjxGJVkgICFSCi1NICAgM14gIEMgIDQjQCAgSzAgICAgIjAgIVAgMiAgIDQ6QCBYPUVdRDtXNUI7JjQgICU0ICNQIEMgIDQjCi1NQCAgSjwgICAgIiwgIVAgMiAgIDRDMCBYPUVdRjsmXUE9ICAgNTAgLiAiLCAhMC4gICJKSCAgICAqUCAnCi1NICEoICAhMlggI0FWN1c1TjxWRUc7RjVEN1ZRTztGPCAgJTQgIyAgQyAgNCNAICBKWSAgICAiRCAhUCAyCi1NICAgNFgwIFg9RV1TOjY9Tjk2MT87Jl1OOVAgIDUwICsgIiwgITAuICAiSUQgICAgKEAgJyAhKCAgITQjCi1NICNBVjdWUU87RjwgICU0ICJAIEMgIDQjQCAgSlUgICAgIkggIVAgMiAgIDUrMCBYPUVdVTtHLUk5VllFCi1NOSVdSTtHMCAgJTQgIjAgQyAgNCNAICBKNyAgICAiQCAhUCAyICAgNTUwIFg9RV1TOjY9Tjk2MT86NllUCi1NICAhNSAgQCAoUCAlIFggICpFQCAgICBBICA8ICRAICAlNzggLic5Pzo2WVQgICE1ICA8IChQICUgWCAgCi1NKkdAICAgIEwgIDwgJEAgICU6KCAuJzk/PTZZUzo2PU45NjE/PFZBTzxHMCAgJTQgIUAgQyAgNCNAICBKCi1NOyAgICAiSCAhUCAyICAgNVMgIFg9RV1TOjY9Tjk2MT88VkFPPEcwICAlNCAhMCBDICA0I0AgIEpSICAgCi1NICIsICFQIDIgICA1W1AgWD1FXVM6Jl1SPSAgIDUwICQgIiwgITAuICAiSzggICAgKlAgJyAhKCAgITg6Ci1NICNBVjdXNU48VkVHO0Y1RDdWLUg4NyggICU0ICBQIEMgIDQjQCAgSkkgICAgIkQgIVAgMiAgIDYwUCBYCi1NPUVdUzo2PU45NjE/OFZBQTxAICA1MCAiICIsICEwLiAgIktAICAgIChAICcgISggICE5RSAjQVY3Vi1ICi1NODcoICAlNCAgMCBDICA0I0AgIEs5ICAgICAwICAgICcgICAgICAgIkRIICAhLVAgICAhWV9fXCAgICAgCi1NICAgID5PX18gICAgLEAgICAnT19fUCAgICYwICAgIV1fX1wgICAiNiAgICA/T19fICAgIFIgICAgJ19fCi1NX1AgICAvSCAgICIhX19cICAgJEwgICAgQE9fXyAgICE3QCAgICgvX19QICAgOSAgICAiJV9fXCAgICciCi1NICAgIEFPX18gICAhXSAgICAoP19fUCAgIEI4ICAgIilfX1wgICApOCAgICBCT19fICAgIkUgICAgKytfCi1NX1AgICBNICAgICJVX19cICAgK0YgICAgTU9fXyAgICJbICAgICs/X19QICAgTzAgICAiWV9fXCAgICtcCi1NICAgIE5PX18gICAjISAgICArT19fUCAgIFBQICAgIl1fX1wgICAsNCAgICBPT19fICAgIydAICAgK19fCi1NX1AgICBSQCAgICMhX19cICAgLFIgICAgUE9fXyAgICMvICAgICwvX19QICAgVDggICAjJV9fXCAgIC0wCi1NICAgIFFPX18gICAjNkAgICAsR19fUCAgIFZYICAgIypfX1wgICAtWCAgICBSX19fICAgI0BAICAgLFdfCi1NX1AgICBYUCAgICMuX19cICAgLjYgICAgU19fXyAgICNIICAgIC0nX19QICAgWkggICAjMl9fXCAgIC5UCi1NICAgIFRfX18gICAjT0AgICAtN19fUCAgIFxAICAgIzZfX1wgICAvMiAgICBVX19fICAgI1cgICAgLUdfCi1NX1AgICBeOCAgICM6X19cICAgL1AgICAgVy9fXyAgICQhICAgIC1XX19QICAhIFggICAjPl9fXCAgIDA4Ci1NICAgIFgvX18gICAkKEAgICAuJ19fUCAgISJQICAgI0JfX1wgICAwViAgICBZL19fICAgJDAgICAgLjdfCi1NX1AgICEkSCAgICNGX19cICAgMTQgICAgWi9fXyAgICQ3QCAgIC5HX19QICAhJkAgICAjSl9fXCAgIDFSCi1NICAgIFsvX18gICAkPyAgICAuV19fUCAgISg4ICAgI09fX1wgICAyMCAgICBcL19fICAgJEZAICAgLydfCi1NX1AgICEqMCAgICNSX19cICAgMk4gICAgXS9fXyAgICROICAgIC87X19QICAhLCggICAjV19fXCAgIDMsCi1NICAgICAvX18gICAkWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAkICAgICEgICAgIEggICAtMCAgICM0ICAgICRQICAgICAgICAgICAgICAgMCAgCi1NICAgICAgICkgICAgITAgICAgKiAgICNIICAgIFogICAgO1AgICAgIyAgICAgICAgICAwICAgICQgICAgCi1NI1AgICAgTCAgICAiQCAgIkkgICAgSjAgICAjICAgICAhICAgICAkICAgICQgICAgJCAgICAhPCAgICAjCi1NICAgICBIICAgVjAgICAtRCAgICA+UCAgICAgICAgICAgICAgIDAgICAgICAgICA/ICAgICEgICAgICogCi1NICAvQCAgICNYICAgICMgICAgICMgICAgIVAgICAgMCAgICAsICAgICowICAgICQgICAgJkAgICQkICAgCi1NISEgICAgICQgICAgICAgICAgICAgICAkICAgICAgICAgIlwgICAgISAgICAhSCAgISEwICAgMDQgICAgCi1NOSAgICAgICAgICAgICAgICEgICAgITAgICAgVCAgICAgMCAgICA6ICAgMVggICAkPiAgICE0MCAgICAgCi1NICAgICAgICAgIDAgICAgICAgICAuQCAgICAkICAgICZAICApTyAgICI7UCAgICAkICAgICAgICAgICAgCi1NICAgJCAgICAgICAgICQgICAgICEgICAgIFggICo8ICAgIEcgICAgICIgICAgICAgICAgICAgICAhICAgCi1NICAgICAgISYgICAgIDAgICAgLiAgIkcoICAgKVIgICAgIVAgICAgICAgICAgICAgICAwICAgICQgICAgCi1NMlAgICAgOCAgICAjQCAgSVkgICAiPjAgICAhUCAgICAhICAgICAgICAgICQgICAgIiAgICAlMCAgICAoCi1NICAgICBYICAqRUAgICBJOCAgICFQICAgICAgICAgICAgICAgIiAgICAgICAgICE5ICAgICBAICAgICAgCi1NICAgICAgICo2ICAgIVAgICAgIC8gICAgJyAgICAgMCAgICAwICAgIDgwICAgICwgICAgICAgICAgICAgCi1NJDVAICAgMzQgICAgICAgICAgICAgICAhICAgICAgICAgJkQgICAgIyAgICAgICAgICAgICAhOEwgICAgCi1NICAgICAgICAgICAgICAgICEgICAgICAgICAhUCAgICAgUCAgICAgICAgICAgICA2KyAgICApICAgICAgCi1NICAgICAgICAgICQgICAgICAgICA+QCAgICAkICAgICAgICAgICAgICVLUCAgICMvICAgICAgICAgICAgCi1NICAgJCAgICAgICAgICgsICAgICEgICAgICAgICAgICAgIT4sICAgNjwgICAgICAgICAgICAgICAhICAgCi1KICAgICAgIiogICAgIDAgICAgICAgICAgICAgTV8gICAgSTAgICAgICAgICAgICAgICAwICAgICAKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9taXBzLWVjb2ZmLnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL21pcHMtZWNvZmYudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmNjU2YS4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL21pcHMtZWNvZmYudQorKysgL2Rldi9udWxsCkBAIC0xLDY3MSArMCwwIEBACi1iZWdpbiA3NzcgbWlwcy1lY29mZgotTSA2ICAiMkc8XyUwICAjICAgICAgOCAgWCAgPCEiUCgqICAgQCAgICAkICAgICk9ICAkICFQICEgICAgMAotTSAgICAkICAwIC8vX19fWCAgICAgICAgLVQgICAgICAgICAgICQgIipAIllUOTdBVCAgICAgJCAhUCAhIAotTSA8ICAgIUUwICAgIVAgICAgICAgICAgICAgICAgICAgICIgTjo2WUk9ICAgICAhICZRICAwIUwwICAgIAotTSggICAmUSAgICAgICAgICAgICAgICAiICAgICArRjFBPSYkICAgIDAgICAgJCAgICAgICAiSSAgICIgIAotTSAgICAgICAgICAgICAgICAgICAgMCJZTDo3MFggICAgJCAgKkQhICAiSSAgICAgMCAgIEpEICAgICAgIAotTSAgICAgICAgICBAICAgIE47JkVULSAgICAhICAiSiAwICBKQCAgICAkICAgKkogICAgICAgICAgICAgIAotTSAgIDAgICAgK0ctRDg3MUEgICAwICBKUCQgICpMICAgICYgICAiSlAgICAgICAgICwgICAgICAgICAgIgotTSAiWVM4Ry1TICAgICQgICskISAgIlEgICAgJSAgICAgICAgICAgICAgIyAgICAgICAgICAhICBOOEctUwotTSAgICAgISAgIyUgMCAgUTAgICI6XCAgICAgICAgICAgICAgICAgICAgICAgICAiIDxHLVI4UCAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICheRAotTSAgIFwnISAhKVo0ICEiPjxCSCBESUAgJCAgMDBAKl4lQDkwIFBDIEEpW1dfWipeJkAjIk9IICA0ICAjUAotTSgwUDAhTD5PQSgmMCMhICE5ICAgICAgLCQgJUggICBAKDheJEA5Ii9BOCY0Q1g6ICwgUDAgLkwgICAgIAotTSMhICFJICEgKCIkICAgIC0gXiAgIiAgICAgIEdPMCAoIF4gICIgIEBeIiQjWCAgKCAgICAgICAgICAgIAotTSAgICAgICAgICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgIiAgIAotTSAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gIAotTSIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQQotTSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAIAotTSAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICAvQAotTSAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgIAotTSAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICQyICAgICNYICAoICAgICAgL0AgIEAgICAgIAotTSBeICAiICAgICAhJEAgICAxKCAoICAvQCAgQCAgICAgIF4gICIgICAgICAjWCAgKCAgICAgKi4gQCkgRAotTSNAICFIWFogRDIwLyAgKkNDWCIyKSFAICBaPjhAKTBEJjAgJElZRiBFQjAoICA2R0IoIjgpIEQgIUpeKQotTUApUEQiQCAnS1hKIEgiMCsgIEJPQlgiRCkgUCAiOl4sQCpARCMwICpLWFYgSyIwLiAgTk9DSCJQUVgyIAotTSggICAgICNHQSgiVFFYPiAkLD4mQCEzR0FYIlhZWDogTykuL0ApICAgICAgSFheIFApLjhAKSQgICAgIAotTUhZQiBQSS45QCkoICAgICBIWUYgUSg+KEApMCAgICAgSVhCIFIoPilAKTggICAgIElYRiBTKT4qQClAIAotTSAgICBJWEogVCheK0ApUCAgICAgS1hOIFYoXixAKiAgICAgIEtYUiBYKF4tQCowICAgICBLWFYgWiheLgotTUAqQCAgICAgS1haIFwoXi9AKlAgICAgIEtYXiBeKF44QCsgICAgICBLWUIhICw+KEArMCAgICAgWVhCIQotTSIsPitAK0MnQkgiXC8gJDAgLjBLOF8jRCpGL1QpWUYgRCpeOUAxIEdCKCIxS1hCISUiPilAKSpPQjgkOAotTSlYSiBFKl4qQDFQR0JYIjZLWE4hKCI+LEApQk9DKCREKVhWIEcqXi1AMkBHQ0giQEtYWiErIj4vQCoyTwotTUNYJFApWUIgSipeOEAzMEdGOCJMS1lGIS4iPihAKyJPQigkXClYRiBNKl4pQDQgR0JIIlhLWEohMSIwKwotTSAgKk9CWCU8KSBQICBKXixANiBEIzAgIUtYViE6IjAuICAmT0NIJURDWF4hNiNQISQgIkwrVixQQVlCIQotTTIgICAgICJHRiglMCBeICAiICAgJCIkI1ggICggICAgICAgICAgICNYICAoICAgICAgICAgICAgICAgIAotTSlbV100ICIgJiIkRCNPX19LW1wgJyExQCAhJk9LQCBELyAwMCAgUDAgOzBEQSAoJCQkICAhMCEgJiImMAotTTNQICAgICAgICE3QCAgQCAgICAgRFlCIDAgICAgICAzICAgIyAgICAgISAgICIsICAhIEEpWC4gMSNQJQotTSQgIkNAKCEgKSo0IiQiPkQgQyAsJCAnVEtaLCJMKF5DIEsgR0kgKF4jISAhXSAhQCoiJEdJIChQIyEgIgotTSggICAqIiQkMCAgMSAkIEAoMj5FICJQRCFAKCIjISAiKipeRCAiQEQgMCgiJSQkICIoXkQgIkBcISEgIAotTSkoMCAgIj5FICJQLCQgKFApIDgiIEpeQCAiMi9JICBIIyEgIl0gICAgICIvSEAgRCAgICAgKF5fICFQRwotTU8wKlAgXiAgIiAgICAgICAgICAgKVtXX1gqXl8gIVAsJCAsLktaMCAoIFAwIFJAICAgICBDWjAgKCBQMAotTSE0UCAgICAgQ1tcICciPl0gIiAjWCAgKCAgICAgICAgICAgICAgICAgICAgICI+XV9eIi9ASCBQS1skIAotTSYqXlAgITAgQChAQUtbXCAnITEgICAsIDAoIEEkICAgJTAgICQiJi9DSCBQICAgICAoVy8gICAgICAgIAotTSQ+ICAjUCAgJCImLiEwICAgICAgICAoQCgiJCwkICc3KUEgICEhISAgICwgMCFAQSQgICAhQCFAJCImLgotTSEwICAgICAgICEyQF9fPCIoIiBBICAgMCg4Xl8gIVIvTCAgNENbJCAmIC9AICBAR08wIEBEKiggICkiIwotTSAgIERJMCAhJCQsICEiMCYgI1QwICAgLCkgOCAvMjAmICNUIDghIEElJDggIFIyJCAgJCNYICAoICogMAotTSg5IkIgICIwQFAgICkqNCAgMSEjX19AIDghIEElJiAgIiAgICQiJjBLT19fICAgICAhMy4gIDAgICEgQQotTSBeICAiICJAJCIkICAhIEEgXiAgIiAgICAgICBAISBBQCpAICAjMi0gICwxICAgRCA6MVAoSCJJICAkIAotTUtHQEAkMiAgJ1AgICAgIiBKQCAiICAgICAhJSAgIUooSyAgIEAqTCAgWUJMICAsMTggIDRKKFAgICImRAotTV9fViFaICAhKD5cICEhJCAgISxAQSAgJEA+R19fQCAgICAgMSggIC4gICAgICgnSl9fXCAgICAgJDQgIAotTSI4R0xfX1YhWlAgIEY+UCAgITVAX18mTEMgICAgXiAgIiAgICAgICNYICAoTihQICBaIiogICpAQjAgIQotTSBeICAiKiIoICAgICAgICAgICAgICIwIiBeVCAgICAsJC4gICBQICAgICAoJCA1MCAgICAgIC9AICBAIAotTSAgICApICgjWlAgICAgUDBYICAjICAgICAgQDAhNSAgICAgICBeICAiICAgICAgMFAgIDogKCBYKDEiRAotTSAhQCBBMEBKJSIgICIiQyEgISAgSUEgQCAoKCgqQSBAICAwSFAwIDAkICAgNlJDISAhIEhQMCAwJSIgIAotTSEwICAgICBQSEAgIywoLCAgUSEjICBMICAgICAkLCAgIVAgICAgICBJQUBBQCooICAiMkUgICREQSAgIQotTSUqL19fKiIiX19cI1ggICggLiAwKDEhICAhQEQgMCAhJCQkICNSMCEgICgwMDAgJyAgICAgKCJCICAgRAotTUkwICEpKDAgIDIzJl9fXDAgICAuSCgrX19YMkIgICBESTAgIikoMCAgQjMmX19YMCAgIChJKCtfX0giQgotTSAgIiRIUCAhSCgoICAiMkUgICxEQSAgIyksO19fOjIjX19YSFAwIEAlIiAgJUJDISAhIixIQCAgQyosIAotTSEoUkggIEIsSjAgLEMqSCAkKFJLICEyLEsgIDhDKlQgJypSIiAgIkxAUCAkSyhAICIqUikgIFJMQkAgMAotTUsoTCAlKlIsICFAREkwIEApKDAgKCIzJl9eIDAgL19KSyhXX18iQyEgISA0KCAgLiosJCAhKFJCICAiLAotTUhQICRDKkAgIihSSSAgUkxAQCAgSygsICEqUiggIEBESTAgMCkoMCAkIjMmX18gMCAvX1JLKEdfXyJDIQotTSAgMDQoL15VICAgICAoUkIgICBESTAgJCkoMCAhIjMmX19QMCAvX1hLKCtfXyJDISAhICBJQkBAJSIgIAotTSEwIiYoIiBQSEAgIywoLCAgUSEjICBUICAgICAkLCNfSzAgICAgIERJP19fKSgzX19QIkYmIi4gSEAgIAotTSkqN19fUjIkX19cNEhfX1xIKCggIDAvQCAgQCBYISBBJCQgICYiMCEgICwwMDAgLykgJCAgQSEhICA8IAotTSAgICBAKitfX1IyRV9fXERBL19fKSw7X19RICAgIFpAQEAgIEEqK19fQjJFX19YREEvX14pLDtfX0EgIAotTSAgQkRAQCAgQCorX19YMkNfX1ZAQE9fXykqN19fMjIkX19URFFPX11JKCwgICJDISAiIDQoICA2KiwkIAotTSQoUkJfX1IsSF9fWEMqQ19dKFJJX18iLEpPX0xDKk9fWihSTF9eMixLP19ASygrX18qUiNfX0JMQi9fVAotTUsoR19cKlIqX15STEJfX0hLKFNfWSIyRV9eIERBL19AKSw7X1ghICBfXkpMQzAgICosJCAkITBAICBYSAotTVAwICRDKitfXyhSQ19fQixKL19UQypHX1wqUiJfX1JMQF9fWEsoQ19dIjJFX18gREEvX1ApLDtfXCEgIAotTV9fKkxCMCAgKiwkICEhMEBfWywgICAgIEMqK19fIjJFX19QREEvX1wpLDtfXyEgIF9fQkxAQCAgICAgIAotTSAgICAgICAgICAgICkgKCNbQCAgICBQMFggICMgICAgICBAMCE1ICAgICAgIF4gICIgICAkIiQwQCAgLwotTSkgKCAgOF4jQCYgICAgICAqJiQgKCEgQCAgSEQgQCAhICAtUEAjUCEkICAgK0BAQSkmLCAgOlBEIEIiTwotTUBYIUAgXiAgIiAgICQiJEQgQCAhIF4gICIgICAgICIvQFghQClbV19YKl5fICFST0wwIDhLWyAgJSFBQAotTSAgXEQ4T19fLyBcMCAiN08gQiAgIEciIC8hJDAgIjhRIEIgIVNYIEFDQUAgICAgICAgICMgL0ApICAgIAotTSAiODBfX1AiJDBASyQiI19eMCAgICAiL09QIDxDWyAgJSheUSAhQCNYICAoKVtUICgoXi5AJyBHTz9fQAotTS8gXDAgKl5QICFARVtQMFUvISAwICAnLyIiTk9PUCA8JSIgICQyODAhIzBcJiEgIENRQCsgICAgICAgMwotTSAgICUgICAgICBQMCBXOCIgIiBBJCAgICBQICAgICAsJCAtJiBAIEAoOF45QCcgRiQgIDAgQUQoKlEwQAotTV9fJCAgICAgQ1tcICcoXlAgIUAjWCAgKClbVCAoIj5dX11CT0wgIDggKCIgKDpeXyAhUDYgICAjKSAvXwotTV9RICAgIjREIE9fX0RAKCAjICAgICAgUDNAIiMkPCAgJSMhOCAgQFAzUCAmKSAkICBBN0EgIDggICFAQQotTSMhICM9QCggKCIkMCAgICIgJCA4KDAgICYiJjIhICAtIyEgIl0qXkMgIjIvSFAgRCEkJCAgQCAgICAgRAotTSBfX19EQCggIyAgICAgIFA2ICAoJFAgICFAICAgICIuISAgKCMhICYmSl5DICIyL0hQIERLQCAgIihYOQotTSAgQkIgICAsS0AgICAgIUAkIiZOJjAgJENbXCAnKF5QICFAI1ggICgpW1QgKiI+XV9eIk9MICA4ICgiIAotTSgxOCAgIS5PT1AgPENYWiA8I1AvJCAgRVtQMFUvISAwICAnLyIiTDQoICAqKUEgJC0hKCAgICwgICAgIAotTSMhICM9QCggKCImL0YoIVApQSAgJCAoOCIiTDQoL19YICAgICAhICAgI0AgICEgQURALCAjICAgICAgUAotTThAICIlJCAgIyMhSCAgMi4hMCAgREAwICMyMCYgICQsJCA5UCAgNEgoWFg5ICBCTiAgICAgICAwKDEgIAotTSAiRk4mMCAkLCZAICEhNCAgIiBQOzAgQCQkICAnQyFNICIiLiBAICggICAgICEhICAhSFA7MCBAQ0BEIAotTSEgICAgICAgMjBASyQiICAlMyFNICIgLCQgMTQgQCBAKDkoIyAgUCAgICAgLCZIICEhNSAgIFhQOzAgQAotTSwmTCAgQSVAICBMUDswIEBDQCggIiAgICAgIDAwICAnLCZUICgoWCwgIDAgICAgICAkUCgqUTBAX15YIAotTSAgICAsJlQgKCEmQCAgMCAgIUBBJCAgICBCMCNfX1wgICFAQSAmIDAoOF5fICFSL0wgIDggXiAgIiI+XQotTSAiIEdPP15QS1sgICcqXl8gIlJPTFAgSCAqIiAoOl5SICIyT0wwIEBLWjAgNCkoIyAgUEQkMCEiKSEoIAotTSFCMDMgIChQO0AhMiVCWCApMyFMICE6MiNQIC0vIUQwICAgL1AoICMuLEBBQ1NEIkgoWCIgIDAgICAgIAotTSAlRCgqUSBAICRcICAgICBDWkAgNCIwISAgSkAyICAgQ0BEICEgICAgICBFKkAgIUtASCAhKS5LICUsIAotTSAgICAkNiQgISAgICAgIi9IQCEwJCAgIDgoXl8gIlAsJCAxNCBAIEAoMjAhX19cNDAwICRDWiwgNCEgIAotTSAgLEQgX19fQ1osIDQgICAgICAwICAhNCAmIDAoMyFMICE4NjMgIDQsJ0AgJEheTSAlIEdJMCEsSFpUIAotTTMpKCQgIFZOICAgICMhICY+IjAmICAkRCAwICElJCQgISAgICAgIi9IQCEwJCAgIDE4Xl8gIlIyI0AgLAotTSkgK19fUzcvICIgMCAgIF9IQFwgIyMhWCAhKDY+ICAwICAgICAoWCIgIEAgICAgICQkICAjICAgICAiLgotTSYwICQgICAgICExOSAgUCAgICAgQ0BAICAgICAgICA1ICAgKCAgICAgIyFJICQwNSggICYgICA4KDBQMAotTSEpSCIgIiBBJCAgICBAISAmIiQgICFAQSQmICAgUCAgICAgMCAgIEQpICtfX1koIyAgUCAgICAgLCZIIAotTTEhNSBfWjxQO0AhMiMhICQ1ICggKCImLiBAICAgICAgICIxIl9fXCQwMCAmS0AoICApLkQgJSwsJCAvKAotTSBAIEgoMSAgICBKMiNQICxDWkwgNChYLCAgMCAgICAgSDhMICAoWC0gIDAgICAgICk6WCAgOlguICAyMgotTSNQICwgICAgICMnWCAiIDMgICAkQ1osIDQhICAgICxEIF9fX0NaLCA0ICAgICAgIDghIEFDW1wgKyheUAotTSAhUi9MMCBAQ1soICkoXlMgIkAjWCAgKClbVCA0Ij5dX14iT09QIDQgKCBYKDhTQyAgQjBbUCAsQy5YIAotTSEgIUAqIiRRXiAhJEsuNCAhISwgICBAIVEzIENEL0QgIzNQKSQgIEUqMCpAICFFIEAgJCkoIiQwICAgKgotTUsuICAgKSNKICBUXCMhICApOFAiSCAgKjYoICE7IiBBQyhUICAgICAgICAhSFEgQ0suKCAgKFNCICAgIAotTSAgICAhJCQgISAhICYiJDAgICAiICAgOCgwISAmIiYsQ0AgIEMuXCAhICAgICAgIVNcIEMgUCwoKkEgQAotTSAgSCAgICAgS1o0ICcqXkYgIUAgWCIgQSMhICUtSl5HICIiL0kwIDxDWjggJiheRyAiICAgICAgJiwgIAotTSNQICAkIiYwWSAgLUtaPCAoIFAwIUdCT0lAIDhDWjggJiheRyAiIDBQQCAnICAgMCg5I1kgIFBEIE9fXwotTS1SQCAoISAgICAqQFogICwgICAwKDheXyAhMEdPMCBAIF4gICIgICAgICBHTz9fSEtbXCAlKSIiICBQRAotTSAwICIsJFggJEEnISAgUCAgICAgLCRcIEBBN0AgIDhEID9fTyMhICZAUjAkICBEMCAgIFIpICtfX1IwIQotTV9eXCAwPCBELVFEICBKIjkgIFIsQFAgKCAgICAgITFAICA8ICAgICAjISAkVzpeRCAhQi9JICA4ICAgIAotTSAoUiMgIEAgICAgIEMoQCAhICAgICAgNDogIEAgICAwKDkiKSAgUCAgICAgLDJIIDEhNSAgIUwgICEgQQotTUQoTCAjM1AtJCAgRUswKkAgIE1AQCAmLSoiJixLQCAgICAgICAgJyM+Ii5MQ1AgIEMoKCAgICAgICAgJAotTTAwICQgJCA4KDEgICAgKCAgIUBBICQgOCg4UlggICIsRjAgJCAgICAgICw5MCIsISBQQEokIiAgISAgIAotTSQiJCwkIDRWICAgICAgICAkIiYvT1AgNClbVCAmIC9AICBAICAgICApW1dfWCpeXyAhMCBAIkBBRCpYIAotTSMpIkMgIFRRU1AgJCQ+ICAjICFALCIkXCYxICApU0VAIiAgJlAsICMmMSBBICAtKEAjUCEkICAgKjBAQQotTUsqKCAiIjEoICBAMCAgIFRLIkAiSCJDISAgKDAoICAzICAgICAhMyAgIDggICAgIC8gLDAgIjFDJCAiTAotTUhQICgkICAgITAhQCQiJFwgUSAgKSYtICAqUkMgIEAgOCEgQUQqTCAjM1AhJCAgICJWIiAgIlAoKDIxKgotTSggIDAgICA/SyJIIkgqXkUgIiBEISIgKCMhICU1Kl5GICFSL0kwIEBDWjggJyEhICAgUkxIQCAoRCpUIAotTSMpIlkgIFYsS1AgKC8gJDAgIzZOICBAICY0IiBIKlggIyAgSCIiJEVeIiAgJCAgICMqUFggSiBcIlEgIAotTUQqUCAjMjVLOCBAICFEQyAgMkwwKDNQISQgICAjJkIgICJUKCg6UkIgIEBEMkAgKEsiSCJIKFJOICBAIAotTVAiIEFLKlggISBQMCFIQk9JMCBAQ1o0ICghISAgIEYvT1AgNEQqKCAjICAgICAgUDNQICQlPiAgISheXwotTSAhMFQ2MCEgSCtEICMoXl8gITBHTzAgQCBeICAiICAgICAiMENAIC0vICwwICAgLj4oICA7UUBBQyYsIgotTUgoUjggIDAgICAgICAnQDAoUDEhICAsICAgICAgXiAgIipSIyAgMixGMCAgICAgICAgITkiIkgwKCAgIgotTSAgICAgKlIiICAgI1ggICggICAgICAgICAgICAgICAgKSAoI1owICAgIFAjWCAgKCAgICAgI1AhJCAiTAotTShAUDggXiAgIiIwIl9fXEdPP15IS1s4ICsqXlIgIVJPT1AgVEtbPCAsKl5VICJCL0NIJVBLWzAgKSpeUwotTSAiIk9MMCA4ICgiMCg6XlAgITAxUCAgJCAgIlAoOF4lQDgwMCAgICspWTYhPCI+IkA3MEdFOCVQS1gqIQotTT8jMS8gICZPQ1glUC1LQCAgMCpALiImT0YoJVQgJCBIKDpeJ0A3Qi9BWCVYKSE/X19SMDRfX1ggWChAQQotTSAgIFAoOFhDICAgICAgICAgJiAwKDMhOSAgJDcoICA9IEIiICgwIUBAIiYuIEAgIClEMCAhUCAkKCgoUAotTTIgICElMCAgI0AgJCgoICIoI0BBS1g+IT4hMlAgICpOKEAgICBCIEgoOFhDICAgICAgICAgJiIgKDhYIgotTSAgICAgICAgLCREICAxJEBfXzggICAgICBCMDAoMCgiIiJMNCggICMgJSQoKlEgQCAmSCAgICAgICYgMAotTSgwKEBAIiQgNShARCBBJCgqUTBAX11MICAgICBDWEohPyAgICAgIDIiQCAjICAgICAhICAgIDJPQTgmJAotTSRDNCAhMjMmICAmT0E4JiQkICAgOlAgICQiJERRQCAhKywkICBBMEBfXFAgICAgIClELCAhUCAjJigqTwotTUhQIFggKiIoKDAgICgiJCwkIDpAS1g2IUEoXitAN1IvSFAgWCk2UCAhISEsICBQIDAoIEEpJjgnX1AgJgotTSxMKFAxICAjJCggICQgICYsVCBEIzAgJCA6MDgoUCFATCIkIDBYIEEkICAgIkAjNiwiJi9BOCYkQ1haIQotTT8gICAgICAhUTdAQyAgXyBAUCFYLCIsRFFAQCAgIDhSUEAgJixUICIhTEBBIFMgKCpRIEAgIDBcIDdfXwotTSQgICAwMCAgJCIkXCA3X18tIidAIDAjISIiTDQoICAtICwiOCgzUCQ/X1xUQS4gICMhICZIKl5GICRCLwotTUlAISglJTwgISNQIUAgIDAgICBTICAgMCgzUCFAICBUKDIgICAsJFAoMFAwIUogIFAiIEElJTwgITAgIAotTSAgICwkIDpMIEAgQCgxICAgIkAgICEgQUNYQiE/ICgzMiIkIS1FIEMpNE9fXypUMCAgIk4iUCAgQ1hSIQotTT8gKCAqIiRFQzAgJCRAVCAhMzpCICAmLUNAICAgICAgICM3LyAgJk1DUCAgQ0FAICAgICAgICJPRiglXAotTUNZRiE/ISAgX1c+TyhAICAgJCBYKDAjUCIiTDAoICAmLS5EICA4U0ggICAgICAgIEtYQiFAKlNDICAgVAotTVowICEkKyQgISpYSSAgIk9BWCVYJCAgICEqXiVAODAgWCJAQUtYNiFBKl4nQDdARihAICRDW1wgLSheUAotTSAhMi9MMCA4Q1soICcoXlMgIiIvTSAgRENbNCAqKF5WICJSL01QIFAgXiAgIiI+XSAlQDBAICAtICggMAotTSgyMiJfX1JPQEglWEMkWCAgIjAhX19YIVA3QERLJFwgIChROSAgIi9GKCVcICAgICAhPDkgICggICAgIAotTUtYKiFBIC9AICBAICAgICApW1dfUipeUCAhQCBAKCBBJEAgIC4qXl8gIVIuIE9fXCAgICAgIyEuICAkMQotTVAgICggJSA4KFAoICgiJCwkIDg6S1o0IC8oXkUgI1IuIE9fXCAgICAgICEwJiIsICBRQiNLWiwgKSAiQAotTSgiJCwkIDU0S1o0IC8oXkMgIjIvSTAgXCQkICAhMCEgKCIkMDQgICMgICAgICEyQCAgMERJUCAjJCAgIAotTSgwIiAkIiRESVAgIyAgPFhAQCNDIiJMMCggICIgICAgICAjQCYiJk9JICBUIEAgSCgwICMsKCAsJCAoUAotTUtaPCAoKF5EICMyL0lQIEAgJSAoKlEgQCAhICAgICAgICA9WEAgIS8mIiQgPCBASyUiICAiUCAgICAgIAotTTwsQEMgIUUgQFheOEA4ICAiJEIgICRFMCgxICAgIDJNNiAgICMhICU1ICJAKCIkIDAiIEEgKCAwKDheXwotTSAhUi9MICA4IF4gICIiPl0gI0AgICAgICAgICAgIjAiIF9MICAgICwkLiAgIFAgICAgICgkIDUwICAgIAotTSAgL0AgIEAgICAgICkgKCNbICAgICBQMFggICMgICAgICBAMCE1ICAgICAgIF4gICIgICAgICIvQEgmOAotTSBeICAiICAgICAiT0EoJjggXiAgIiAiICQiJCAgICAgICAgICAiPl1fWyJPT1AgPCMhICZAKl5EICUiLwotTUkgITBLWiggKSIwJTUgQCwkIDpcKVo4ICogMSEgIDxEIEAgIUNaMCApIFAwIUgsICAgICAkICAgIEAgIAotTSQiJEQgQCAhQ1tcICciPl0gJSAjWCAgKCAgICAgICAgICAgICAgICAgICAgICNQIyQgIiw4UEokKSAoIwotTV4wIiMoIiQgICAgLCUuICAhI1AhJCAgIDghIEEgXiAgIipQRCJIMCgkIDUwICAgICAjUCIkICIsMEBKIAotTSAgICAgICIiIiJMMCggICIgICAgICAhICgiJEQgQC9ZICAgICMhM0BfXzBcIDEgIEsiMCpBIC9AICBAIAotTSAhIEEgICAgICAgICAgIEQgQDA+ICAgICMhI0AgICwgICAgICIhICU0ICAgICAgI1ggICggICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAjWCAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAoIiBAKCIgQCgiIEAqIkBIKiJAQCgiIEAoIiBAKCIgQCgiIEAoIiBAKCIhKCQhIDAkISAwJCEgMAotTSQhIDAkISAwQSgyJEEoMiRBKDIkQSEgMCQhIDAkISIhQDgmIUA4JCEgMCQhIDAkISAwJCEgMCQhIDAkIQotTSAwJCEgMSAwJCEgMCQoKiJASCoiQEAoIiBAKCIgQCgiIEAoIiBAKCIgQCgiIEAoIiQhIDAkIiAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKCMhIDQmIVBAKQotTSJATCwjMFgvJCEkMiRRMDUlQTw4JjFIOychVD4nUiBBKEIsRCkyOEcqIkRKKlJQTStCXFAsMyhTLSM0VgotTS1TQFkuQ0xcLzNYXzAmJUI4VjFFOUY9SDo2SUs7JlVOO1chUTxHLVQ9NzlXPidFWjZVUT03RV1AMDQpIwotTTEkNSYxVEEpMkRNLDM0WS80JSUyNFUxNTVFPTg2NUlbPydVXj9QICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEjMiUpIzMkJTM0UCAgICAgTzsmRUIrVi1IPEYtTAotTTg3LVMrUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICEgIDgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgJCAgICAgICAgICAgICAgICAgICAgIiAwICAgICAgICEgIDghQDAgJiA4IUAoIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAqPSAkICJHMCAgIAotTSAgICAgICAgMCZEICAgICAgICAgICAgICAgICAgJCsoICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAwICAgJiVTOFZFSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAkICAqPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICA8IEQiIkAgICFEICAgICsgICAgUDggICAgICAgICAgICAgICAtICAgLFIgICAgJFkgICBdTCAgIAotTSAgICAgICAgICAgIiRQICAzJVAgICBBLCAgITRKICAgIUIwICAlU1QgICAgJ0AgIDhRQCAgICE8ICAhSwotTUIgICAgKDwgICZTWCwvIEBYIyAwMC0hIFQkIDAoKiIhICE5IFwjIDAkISVAUCUgQSghIDAoMDQlITA0JQotTSEwNCUhMDQlITA4JywhJDEoMSQxKDEkMSgxJDEoQSxSJEEoQiRBKEIkQShCJEEoQiUiJDEkMiQxJDIkMQotTSQyJDEkMiQxKDEkMSQyKEIkUCQhLC0iICAgQlA2KCwgIjEkMCwvIDQkQTBGNSEgQikwJiAgIFogX18qIQotTSAgXDIkUDRQWCMkNyUhJDggITwyJDFAISQxKTA4ISAwJCEgMCQhIDAkISAwJCEgMCQhIFAkISAwJCEgMAotTSQhIDAkISAwJCEgMCQhIFAkIiAwJCEgICQhJDEkMCAwJDEkMTAvIEEsQSAyJDgoICJBIDAkNyQwKCEgQAotTSQuISBcKCQgIkEoMiwhIEAkISMwPCEgQCQhIzA8ISBAXCMgMFgoKCAjISAwJCEgMCQhIDAoISAwJCEgMAotTSQpIiAgIEQwJC0hUiQhIDAkIiAwJC0hMCQhIzA8QSAwKCEgMFQoICAkLCEgVCQgMCQ3JDAkISBAJCIgMAotTVgkI1BAMCAqJEEoUCQiIDAkLSFQJCIgMCQtIVAkIiNQLCEjQEBAICwkISAwJCEgMCQhIEAkISAwJCEgMAotTUQoICAiMSAwVCcoMCQhIDAoISAwVCUgMCQtIVIkISBAJCEjMCAhIDEkMiQ2JSEoQiEiPDclIyMwLC0gUgotTVQjJiQgIEgzLDEwMyBUIzAwMTBDJFIgNSQiJDIkUSEgWCEgQFwhLCIsLSFWJFI4VCkiI1AoPyEoISFAKAotTSAhQCEiICkyJiAgSCAxKDggMygwKC4gQFwhMDIkISNQJC8hSCIgODElIyQ4IiJAJyBEIEBYMiNQJC4gSAotTSFBQCghIUAgJCEjUCQvIFQgMTAyJDEkQyhRNDgmIUAmKSApIFQjJzAyISNQLEJAKC1SIDJcISNQJDEjUAotTS4gJEAkLyA4ICEkMy4gIDElISAxICEpQTwvICU8KTFQVCMwUFgxIEBYIyAxMEEgNSYkI1AkITw2KCEgMAotTSRCQEEkUSUgXCEoMFwhJ1A8MSdQKEEgUFgiIFcoUSUjXCI4MShCLDEkNCEiUCQgMEQnKDMkQSBAWCQgQgotTSRBIEAoLiBFJiApIFQnJFMlMyQiQCAgKUAvX1dBICArJTEkNSguIEMkMjAwJUE8NCQvIFIlICAwJDEkMQotTSAhIDEkMSUiMCIkITAsITBcITBCJDIwQSgvIEAkMiNQJDIkMyQiIDAkMSQxICEgMSQxJCAgICAgICAgIAotTSBAICAgICAgICAgICAgICAgL19fX19cICAgICAgICAgICAgICAhQCAnMCAgICAgIC4gICAgJjwgICAgIAotTSAgICA6ICAgICAwICAgIDogICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgICgoIAotTSAgIiQgICAgJkAgICAnICAgICAmICAgICcgICAgICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPQotTSAhXCAgICIvICAgIERQICAgIUwgICAhXCAgICAiICAgICFcICAgICAgICAgIC9fX19fXCAgICAgICAgIAotTSAgICAgICAgJzAgPyAgICBHQCAgICogICAgID4gICAgICAgICAiJCAgICAgICAgICAgICAgICNfX19fXwotTSAgICAgICAgICAgICAgICAgIVQgJ1AgICAnRCAgICFZICAgICAgICAgIUAgICAgRSAgICAhQCAgICAgIAotTSAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAhWiAgICA+QCAgICAkICAgIFAgICAgKjAgIAotTSAgUCAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgPlAgICAnTCAgICAiICAgIAotTTIgICAgIlQgICAgMiAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAgJ1QgICAhXQotTSAgICAgUCAgICYgICAgIFEgICAgJiAgICAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcIAotTSAgIV4gICAgP0AgICAgMCAgICFYICAgIC0wICAgIVggICAgICAgICAgL19fX19cICAgICAgICAgICAgIAotTSAgICAnMCA/ICAgID9QICAgJ1wgICAgJSAgICBEICAgICNEICAgIEQgICAgICAgICAgI19fX19fICAgIAotTSAgICAgICAgICAgICAhVCAnUCAgICgkICAgIiEgICAgIUAgICAqQCAgICBdICAgICpAICAgICAgICAgIAotTV9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICIiICAgIEBAICAgIDwgICAjICAgICAwMCAgICMgIAotTSAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICBAUCAgICgsICAgICggICAgViAgIAotTSAkNCAgICBWICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgICAoNCAgICIlICAgIAotTSIwICAgLyAgICAhKSAgICAvICAgICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAiJgotTSAgICBBQCAgICBIICAgJCggICAgMzAgICAkKCAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgIAotTScwID8gICAgQVAgICAoPCAgICArICAgISggICAgJSQgICAhKCAgICAgICAgICAjX19fX18gICAgICAgIAotTSAgICAgICAgICFUICdQICAgKEQgICAiKSAgICAjICAgIDNQICAgITUgICAgM1AgICAgICAgICAgX19fXwotTV9QICAgICAgICAgICAgICAgICA9ICFcICAgIiogICAgQkAgICAgVCAgICU8ICAgIEEwICAgJTwgICAgIAotTSAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgIExAICAgLzwgICAgLiAgICAgICAgICAkIAotTSAgICAgICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgICAoICAgICIgICAgICAgIAotTSAgICAgICAiICAgICAoICAgICNfX19VTF9fX19fUCAgICAgICAgICAgICAiTCAgPSAhXCAgICE/ICAgIAotTUBQICAgICAgICAgICAgICAgMCAgICAiICAgICBfX19fXy9fX19fXCAgICAgICAgICAgICAgIiAgJzAgPwotTSAgICAnMCAgICJYICAgICAgICAgICAgICAgJCAgICAgQCAsICAvX19fX1NfX19fXyAgICAgICAgICAgIAotTSAgIEAgIVQgJ1AgICAhWCAgICBGICAgICAgICAgKFAgICAgIyAgICAoUCAgICAgICAgICBfX19fX1AgIAotTSAgICAgICAgICAgICAgID0gIVwgICAgUyAgICAuMCAgICBEICAgICAgICAgIDAgICAgICAgICAgICAgIAotTSAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgOEAgICApSCAgICAgICAgICAgICAgICQgICAgIAotTSAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAgIFggICAgMiAgICAgICAgICAgIAotTSAgICEgICAgICAgICAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgIC4gICAgJEAgIAotTSAgICAgICAgICAgICAwICAgICAgICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgIAotTSogICAgMlggICAgICAgICAgICAgICAkICAgICAgICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgIAotTSAhVCAnUCAgICBYICAgIDMgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgIF9fX19fUCAgICAgIAotTSAgICAgICAgICAgPSAhXCAgICA3ICAgICcgICAgICAgICAhKCAgICAhMCAgICEqICBQICBfX19fXy9fXwotTV9fXCAgICAgICAgICAgICAgIiAgJzAgPyAgICAoMCAgICI0ICAgICQgICAgICAgICAgJCAgICAgQCAkIAotTSAvX19fX1NfX19fXyAgICAgICAgICAgICAgIEAgIVQgJ1AgICAiSCAgICBdICAgICAgICAgJ0AgICAgIwotTSAgICAnSCAhICAjX19fX1RfX19fX1AgICAgICAgICAgICAgICogID0gIVwgICAhLiAgICA5MCAgICBYIAotTSAgJFggICAgITAgICAkWiAgMCAgX19fX18vX19fX1wgICAgICAgICAgICAgICIgICcwID8gICAgPEAgIAotTSAoRCAgICBCICAgIkAgICAgIDwgICAiQEAgXCAgL19fX11TX19fX18gICAgICAgICAgICAgICEwICFUIAotTSdQICAgKUggICAiWiAgICAtMCAgISsgICAgICkgICAhKyggICAgI19fX19UX19fX19QICAgICAgICAgIAotTSAgICAoICA9ICFcICAgIzIgICAgV0AgICAlOCAgIDcoICAgICJQICAgNyogICAgIF9fX19fL19fX19cIAotTSAgICAgICAgICAgICAhQCAnMCA/ICAgIFpAICAgL0AgICAhSyAgICZVICAgICBUICAgJlVAICAgIC9fXwotTV9fM19fX19fICAgICAgICAgICAgICAgQCAhVCAnUCAgIDAsICAgJDsgICAgPiAgICIjQCAgICAvICAgIgotTSNAICAgICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICRJICAgISwgICAgKTQgICAgIAotTSAgICAgMCAgICAgICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICAjQCAgICBcIAotTSAgICAgICAgICAgICAgJCAgICAgICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgIAotTSAhJCAgICA+ICAgICAgICAgICAgICAgJiAgICAgKCNfICAjX19fXzxfX19fX1AgICAgICAgICAgICAgIAotTTYgID0gIVwgICAhRCAgICBRMCAgICAgICAgLDggICAgIiAgICAsPCAgICAgICAgICAvX19fX1wgICAgIAotTSAgICAgICAgICAgICcwID8gICAgUyAgICAtTCAgICEuICAgIzYgICAgIEggICAjN0AgJCAgL19fX14zXwotTV9fX18gICAgICAgICAgICAgICBYICFUICdQICAgLjggICAkISAgICA1ICAgICAgICAgICEgICAgICAgIAotTSAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgIC4gICAgJEAgICAgICAgICAgICAgIAotTSAwICAgICAgICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgICNAICAgISggICAgIAotTSAgICAgICAgICAkICAgICAgICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgICFcIAotTSAgIEMgICAgICAgICAgUCAgICAjICAgICBQICAgICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPQotTSAhXCAgICBKICAgICwgICAgICQgICAgICAgICAgMCAgICAiICAgICBfX19fUy9fX19fXCAgICAgICAgIAotTSAgICAgJSAgJzAgPyAgICAnQCAgICJAICAgICAgICAgICAgICAgJCAgICAgICAgICAgICAgICNfX19fXwotTSAgICAgICAgICAgICAgICAgIVQgJ1AgICAhPCAgICA/ICAgICAgICAgIyAgICAgJCAgICAiUCAgICAgIAotTSAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAgRSAgICArUCAgICBAICAgICAgICAgIDAgIAotTSAgICAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgI0AgICAhKCAgICAgICAgIAotTSAwICAgICBMKCAgKyAgICAjICAgICAgKEtfX18gICAgJTAhICA8IDgoICAiICAgICUwICAgJkBAKCAgIgotTSAgICAnMCEgIEJAOCggICYgICAgJzAgICAgQEAoICAkICAgICowISAgQyA4KCAgKiAgICAqMCAgICBQQAotTSggICYgICAgLDAhICBDUDgoICAuICAgICwwICAgIEBAKCAgKCAgICAgMCAgICAgQCggICAgICAgIDAgIAotTSAgIEwoICAiICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICIgICAgIDAgICAgIEAoICAgICAgIAotTSAwICAgICBMKCAgIiAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICIqICAgIDBAICAgIUFJOCAgKQotTSAgICAyUCAgICAgRTggICggICAgNjAgICAhIEU4ICAjICAgIDogICAgIiBFOCAgJCAgICA9MCAgICQgRQotTTggICUgICAgQFAgICAmIEU4ICAmICAgIERAICAgKCBFOCAgJyAgICAgICAgICAgQTggICEgICAgSEAgIAotTSAhQUk4ICAxICAgIElQICAgICBFOCAgKCAgICBNMCAgICEgRTggICMgICAgUSAgICAiIEU4ICAkICAgIAotTVQwICAgJCBFOCAgJSAgICBXUCAgICYgRTggICYgICAgW0AgICAoIEU4ICAnICAgICAgICAgICBBOCAgKQotTSAgICBfQCAgICBBTTggIDkgICAhIUAgICAgIEU4ICAoICAgISUgICAgICBFOCAgIyAgICEoUCAgICAgRQotTTggICQgICAhLCAgICAgIEU4ICAlICAgIS9AICAgICBFOCAgJiAgICEzMCAgICAgRTggICcgICAgICAgIAotTSAgIEE4ICAxICAgITcwICAgIEFNOCAgQSAgICE4QCAgICAgRTggICggICAhPCAgICAgIEU4ICAjICAgIQotTT9QICAgICBFOCAgJCAgICFDICAgICAgRTggICUgICAhRkAgICAgIEU4ICAmICAgIUowICAgICBFOCAgJwotTSAgICAgICAgICAgQTggIDkgICAhTjAhICBFIDgoICInICAgICAgICAgICA8KCAgRCAgICAgICAgICBAQAotTSggIEIgICAhTjAgICAhQEAoICBBICAgIVEwISAgRkA4KCAiKSAgICAgICAgICAgPCggIEggICAgICAgIAotTSAgQEAoICBGICAgIVEwICAgIUBAKCAgRSAgICFWICEgIEggOCggIisgICAgICAgICAgIDwoICBMICAgIAotTSAgICAgIEBAKCAgSiAgICFWICAgICFAQCggIEkgICAhWzAhICBJQDgoICItICAgICAgICAgICA8KCAgUAotTSAgICAgICAgICBAQCggIE4gICAhWzAgICAhQEAoICBNICAgIV5AISAgSyA4KCAiLyAgICAgICAgICAgPAotTSggIFQgICAgICAgICAgQEAoICBSICAgIV5AICAgIUBAKCAgUSAgICIjQCEgIExAOCggIjEgICAgICAgIAotTSAgIDwoICBYICAgICAgICAgIEBAKCAgViAgICIjQCAgICFAQCggIFUgICAiKSAhICBOIDgoICIzICAgIAotTSAgICAgICA8KCAgXCAgICAgICAgICBAQCggIFogICAiKSAgICAhQEAoICBZICAgIitQISAgT0A4KCAiNQotTSAgICAgICAgICAgPCggISAgICAgICAgICAgQEAoICBeICAgIitQICAgIUBAKCAgXSAgICIwMCEgIFEgOAotTSggIjcgICAgICAgICAgIDwoICEkICAgICAgICAgIEBAKCAhIiAgICIwMCAgICFAQCggISEgICAiNTAhIAotTSBSQDgoICI5ICAgICAgICAgICA8KCAhKCAgICAgICAgICBAQCggISYgICAiNTAgICAhQEAoICElICAgIgotTTgwISAgVCA4KCAiOyAgICAgICAgICAgPCggISwgICAgICAgICAgQEAoICEqICAgIjgwICAgIUBAKCAhKQotTSAgICI9ICEgIFVAOCggIj0gICAgICAgICAgIDwoICEwICAgICAgICAgIEBAKCAhLiAgICI9ICAgICFAQAotTSggIS0gICAiQjAhICBXIDgoICI/ICAgICAgICAgICA8KCAhNCAgICAgICAgICBQQCggITIgICAiQjAgIAotTSAhUEAoICExICAgIkVAISAgWFA4KCAiQSAgICAgICAgICAgPCggITggICAgICAgICAhIEAoICE2ICAgIgotTUVAICAgIiBAKCAhNSAgICJJICAgIClBSTggIT4gICAiSjAgICAgIEU4ICJGICAgIktAICAgIiBFOCAiSQotTSAgICJNUCAgICQgRTggIkwgICAgICAgICAgIEE4ICE5ICAgIk8wICAgKSFNOCAhQyAgICJRMCAgICAgRQotTTggIyQgICAiUkAgICAgIEU4ICMnICAgIlRQICAgICBFOCAjKiAgICAgICAgICAgQTggIT4gICAiVjAgIAotTSAgMVE4ICFIICAgIldAICAgICBFOCAjQiAgICJYQCAgICAkRTggI0MgICAiWiAgICAgKEU4ICNEICAgIAotTSAgICAgICBBOCAhQyAgICJbMCAgICAxUTggIU0gICAiXSAgICAgIEU4ICNLICAgIl5QICAgICRFOCAjTAotTSAgICMgQCAgICAoRTggI00gICAgICAgICAgIEE4ICFIICAgIyFQICAgIDFROCAhUSAgICMjICAgICAgRQotTTggI1QgICAjJEAgICAgJEU4ICNVICAgICAgICAgICBBOCAhTSAgICMlUCAgICAxUTggIVUgICAjJyAgIAotTSAgIEU4ICNcICAgIyggICAgICRFOCAjXSAgICAgICAgICAgQTggIVEgICAjKiAgICAgMVE4ICFZICAgIwotTSswICAgICBFOCAkJCAgICMsUCAgICAkRTggJCUgICAgICAgICAgIEE4ICFVICAgIy4gICAgICBJOCAkJgotTSAgICMwICAgICAxUTggIV4gICAjMUAgICAgIEU4ICQsICAgIzMgICAgICRFOCAkLSAgICAgICAgICAgQQotTTggIVogICAjNDAgICAgIEk4ICQuICAgIzZAICAgIDFROCAiJSAgICM5MCAgICAoRTggJDQgICAjOjAgIAotTSAgJEU4ICQ1ICAgIzswICAgICBFOCAkNiAgICM8QCAgICAsRTggJDcgICAgICAgICAgIEE4ICFfICAgIwotTT4gISAgWlA4KCAkOCAgICAgICAgICAgPCggIiggICAgICAgICA9IEAoICImICAgIz4gICAgPiBAKCAiJQotTSAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAkICAgICUgISAhOSA4KCAgLSAgICAlICAgICBAQAotTSggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJSAgICAiMSAgIkwgKUtfX18gICAgJSAhIAotTSE6IDgoICAtICAgICUgICAgLlBAKCAgIiAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAkICAgIAotTSNAISAhSSA4KCAgLSAgICAjQCAgICMwQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJgotTSAgICAiQCEgIU0gOCggIC0gICAgIkAgICAoUEAoICAhICAgICQwISAhVVBYKCAgLyAgICAkMCAgICcwQAotTSggICMgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgKSAgICAjQCEgIV0gOCggICIgICAgJTAhIAotTSIhQDQrX19fICAgIChAISAiJiA0K19fXyAgICAqMCEgIiZANCtfX18gICAgLCAhICImUDQrX19fICAgIAotTS1QISAiJyA0K19fXyAgICAjQCAgICpAQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJQotTSAgICAjMCEgIiggOCggICIgICAgJFAhICIpQDQrX19fICAgICMwICAgIiBAKCAgISAgICAgMCAgICAgQAotTSggICAgICAgIDAgICAgIEwoICAiICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICIgICAgIDAgIAotTSAgIEAoICAgICAgICAwICAgICBMKCAgJSAgICAjMCEgIiogOCggICIgICAgJFAhICIrQDQrX19fICAgIAotTSMwICAgIiBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICA5ICAgICMwISAiLCA4KCAgIgotTSAgICAlICEgIi8gNCtfX18gICAgJ1AhICIwUDQrX19fICAgICwwISAiMUA0K19fXyAgICAvUCEgIjJQNAotTStfX18gICAgMFAhICIzMDQrX19fICAgIDQwISAiNjA0K19fXyAgICA3ICEgIjdQNCtfX18gICAgOVAhIAotTSI5QDQrX19fICAgIDwgISAiOUA0K19fXyAgICA/ICEgIj8wNCtfX18gICAgQiAhICJDIDQrX19fICAgIAotTURQISAiRTA0K19fXyAgICBHUCEgIkcwNCtfX18gICAgTEAhICJIQDQrX19fICAgIFAgISAiSjA0K19fXwotTSAgICBTQCEgIk0wNCtfX18gICAgVjAhICJOUDQrX19fICAgIFkgISAiUEA0K19fXyAgICBbQCEgIlBANAotTStfX18gICAgXlAhICJWMDQrX19fICAgISIgISAiWiA0K19fXyAgICAjMCAgIFAwQCggICEgICAgIDAgIAotTSAgIEAoICAgICAgICAwICAgICBMKCAgJSAgICAjQCEgIl0gOCggICIgICAgJTAhICJeQDQrX19fICAgIAotTSNAICAgIiBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAoICAgICJBICAiTiApS19fXwotTSAgICAkUSAgIEIgKDNfX18gICAgJ0AhICJfIDgoICAtICAgICdAICAgJEBAKCAgIyAgICApMCEgIyNAOAotTSggIC8gICAgKTAgICAmQEAoICAlICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggIDIgICAgIkAhIAotTSMqIDgoICAtICAgICJAICAgJ0BAKCAgISAgICAkUCEgIzFAOCggIC8gICAgJFAgICAsIEAoICAjICAgIAotTSZAISAjPUA4KCAgMSAgICAmQCAgIDRAQCggICUgICAgKDAhICNSIDgoICAzICAgICgwICAgQyBAKCAgJwotTSAgICAqMCEgJDUgOCggIDUgICAgKjAgICAxQEAoICApICAgICxAISAkRkA4KCAgNyAgICAsQCAgIDBQQAotTSggICsgICAgLkAhICRXMDgoICA5ICAgIC5AICAgNjBAKCAgLSAgICAwUCEgJS1AOCggIDsgICAgMFAgIAotTSAlIEAoICAvICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICQgICAgIyAhICUzIDgoICAiICAgIAotTSMgICAgISBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAkICAgICNAISAlNCA4KCAgIgotTSAgICAjQCAgICEgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgIiAgICAgMCAgICAgQAotTSggICAgICAgIDAgICAgIEwoICAiICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggIC0gICAgIkEgIAotTSJfIClTX19fICAgICQxICAiX0ApU19fXyAgICAmISAgIl9QKVNfX18gICAgJ1EgICMgIClTX19fICAgIAotTSlBICAjIDApU19fXyAgICArUCEgJTUgOCggIC0gICAgK1AgICBRQEAoICAmICAgIC1AISAmJkA4KCAgLwotTSAgICAtQCAgICQgQCggICggICAgLlAhICYqQDgoICAxICAgIC5QICAgMSBAKCAgKiAgICAgMCAgICAgQAotTSggICAgICAgIDAgICAgIEwoICAlICAgICNAISAmPCA4KCAgIiAgICAlMCEgJj1ANCtfX18gICAgI0AgIAotTSAiIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICUgICAgI0AhICY+IDgoICAiICAgIAotTSUwISAmP0A0K19fXyAgICAjQCAgICIgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJgotTSAgICAjICEgJkAgOCggIC0gICAgIyAgICAgUEAoICAhICAgICUwISAmQFA4KCAgLyAgICAlMCAgICBQQAotTSggICMgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJCAgICAiUCEgJkIgOCggIC0gICAgIlAgIAotTSAlMEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICggICAgIzAhICZIIDgoICAiICAgIAotTSMwICAgIkBAKCAgISAgICAkUCEgJkpANCtfX18gICAgJVAhICZLIDgoICAmICAgICcgISAmTFA0K19fXwotTSAgICAlUCAgICNAQCggICQgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJSAgICAjQCEgJk8gOAotTSggICIgICAgJTAhICZQQDQrX19fICAgICNAICAgIiBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgIAotTSAgIEwoICAiICAgICAwICAgICBAKCAgIF9fX19fUCAgICAgICAgICQgICAgIC9fX19fXCAgICAgICAgIAotTSFAICAgICNfX19fXyAgICAgICAgICBAICAgICBfX19fX1AgICAgICAgICAqICAgICAgICAgICAmICAgIAotTSBAICAgIDAgICAgJiAgICAiICAgICBIICAgICsgICAgIFAgICAgNCAgICAnICAgICIwICAgIUggICAgIwotTSAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgIEAjICMgIF9fICAhICAgICAgICAgICAgICAgIDAgIAotTSAgQCMgIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICBAJCAjICBfXyAgISAgICAgICAgICAgICAgIAotTSAwICAgISAkICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAhICUgIyAgX18gICEgICAgICAgICAgIAotTSAgICAgMCAgICEgJiAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgIiAmICMgIF9fICAhICAgICAgIAotTSAgICAgICAgIDAgICAiICcgIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICIgKCAjICBfXyAgISAgIAotTSAgICAgICAgICAgICAwICAgIiAoICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAiICkgIyAgX18gIAotTSEgICAgICAgICAgICAgICAgMCAgICIgKiAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgIiArICMgIAotTV9fICAhICAgICAgICAgICAgICAgIDAgICAkICMgISAgIFAgMCAgLCAkICAkICEgICEgIDAgIDQgJCAgJgotTSAhICAhQCAwICA8ICQgICggISAgIiAgMCAgRCAkICAqICEgICJQIDAgIFAgICAjX19fX19fX19fX1BQIAotTSAgI19cICAhICAgICAgUCAgICNfX19fX19fX19fUFAgICAjX1wgICkgICAgICBUICAgI19fX19fX19fXwotTV9QVCAgICNfXCAgMSAgICAgIFQgICAjX19fX19fX19fX1BUICAgI19cICA5ICAgICAgICAgIjQjICAgIAotTSAgICAqMCwgICAgICAgIE0gUCAgICAgICAjJCQgICAgICAgIC0wMCAgICAgICAgWSEwICAgICAgICNUJgotTSAgICAgICAgMDA4ICAgICAgICElIVAgICAgICAgJEQoICAgICAgICAzMEAgICAgICAgITEiMCAgICAgIAotTSAlNCogICAgICAgIDYwTCAgICAsICAgIF9fX19fX19fX19cLCAhICBfXyAgNjAgICAgICwgISgwX18gIAotTTYwICAgICAsICMsUF9fICAgMCAgICAjX1wgICQgICAgICAgICAgICAgICAiICAgIFAvX1AgIDAgICAgIAotTSAgICAgICAgICAkICAgKSBfXyAgISAgICAgICAgICAgICAgICAgICAhKCAsICEgIF9fICA2MCAgICAgLQotTSAgICBfX19fX19fX19fXCwgISAgX18gIDYwICAgICAsICEoMF9fICA2MCAgICAgLCAjLFBfXyAgIDAgIAotTSAgI19cICAkICAgICAgICAgICAgICAgIiAgICBQL19QICAwICAgICAgICAgICAgICAgJCAgICkgX18gIAotTSEgICAgICAgICAgICAgICAgICAgISggLSAgICBfXyAgN0AgICAgIC4gICAgX19fX19fX19fX1wgICAgIAotTSAgICAgICAgICAgLiAgICBfXyAgOFAgICAgIC4gICAgX19fX19fX19fX1wgICAgICAgICAgICAgICAgLgotTSAgICBfXyAgOiAgICAgIC4gICAgX19fX19fX19fX1wgICAgICAgICAgIFggICAjX1wgIU0gICAgICBYIAotTSAgI19fX19fX19fX19QICAgICAgICAgICNAICAgL19QICckICAgICAjQCAgIC9fX19fX19fX19fICAgIAotTSAgICAgICAuICAgIF9fICA9MCAgICAgLiAgICBfX19fX19fX19fXCAgICAgICAgICAgWCAgICNfXCAhWgotTSAgICAgIFggICAjX19fX19fX19fX1AgICAgICAgICAgICAgICAgICAgICAgICAiKSFAICAgICAgICAgJgotTSAgICAgQCAgICAwICAgICYgICAgIiAgICAgSCAgICArICAgICBQICAgIDQgICAgJyAgICAiMCAgICFIIAotTSAgICAgICAjIUAgICAgICAgICAmICAgICBAICAgIDAgICAgJiAgICAiICAgICBIICAgICsgICAgIFAgIAotTSAgNCAgICAnICAgICIwICAgIUggICAgICAgICQhQCAgICAgICAgICYgICAgIEAgICAgMCAgICAmICAgIAotTSIgICAgIEggICAgKyAgICAgUCAgICA0ICAgICcgICAgIjAgICAhSCAgICAgICAgIyFAICAgICAgICAgJgotTSAgICAgQCAgICAwICAgICYgICAgIiAgICAgSCAgICArICAgICBQICAgIDQgICAgJyAgICAiMCAgICFIIAotTSAgICAgICAjIFAgMCAgICAgIDQjICEgIF9fX19fUCAgICAgICAgICggICAgIC9fX19fXCAgICAgICAgIAotTSEgICAgICNfX19fXyAgICAgICAgICAwICAgICBfX19fX1AgICAgICAgICA4ICAgICAvX19fX1wgICAgIAotTSAgICAhICAgICAgICAgICAhQCAgICAoICAgICQgICAgIUAgICAgQCAgICAqICAgICJQICAgICwgICAgJQotTSAgICAhUCAgICBEICAgIDogICAgICAgICEwOCAgICAgICAgJyZAICAgICAgICAgJiAgICAgQCAgICAwIAotTSAgICYgICAgIiAgICAgSCAgICArICAgICBQICAgIDQgICAgJyAgICAiMCAgICFIICAgICAgICAjJkAgIAotTSAgICAgIDQmICAgICAgICAhUDggICAgICAgICkhQCAgICAgICAgTCYgICAgICAgICMwOCAgICAgICAgLwotTSFAICAgICAgICEkJiAgICBfX19fX1AgICAgICAgICAjICAgICAvX19fX1wgICAgICAgICAgUCAgICAgIAotTSAgICAhQCAgICAoICAgICQgICAgIUAgICAgQCAgICAqICAgICJQICAgICwgICAgJSAgICAhUCAgICBEIAotTSAgIDogICAgICAgICAgOCAgICAiICAgICEgICAgIDggICAgKCAgICAiQCAgICBMICAgICMgICAgITAgIAotTSAgPCAgICApICAgICZAICAgICAgICAgJiAgICAgQCAgICAwICAgICYgICAgIiAgICAgSCAgICArICAgIAotTSBQICAgIDQgICAgJyAgICAiMCAgICFIICAgICAgICAoJkAgMCAgICAgIEg6ICAgICAgICAjIUggJCAjXwotTV9fX18gICAgICAgICAgMCAgICAgX19fX19QICAgICAgICAgJCAgICAgICAgICAgJiAgICAgQCAgICAwIAotTSAgICYgICAgIiAgICAgSCAgICArICAgICBQICAgIDQgICAgJyAgICAiMCAgICFIICAgICAgICAjIUAgIAotTSAgICAgIDQmICAgICAgICAgIDggICAgIiAgICAhICAgICA4ICAgICggICAgIkAgICAgTCAgICAjICAgIAotTSEwICAgIDwgICAgKSAgICAmQCAgICAgICAgLCYgICAgX19fX19QICAgICAgICAgIyAgICAgL19fX19cIAotTSAgICAgICAgIVAgICAgI19fX19fICAgICAgICAgIDAgICAgICAmLVI9IyVUOTdBVCtHLCA0VTEhNEUxJgotTTREVCA3VV1TPSYlUj0gIT87Nl1OOFZdTj0nKU87ICE/OzYtTz02WVQgJV1TPCcpTzhWVU87Ry1UODcpVAotTSAgIE84RiVCODJdQz43IVI5Ny1TK1c1UzxCXUk7Ri1MPTYxRStXKUU5VjFFOUJZSCAgIE84RiVCODJdQwotTT43IVI5Ny1TK1c1UzxCXUk7Ri1MPTYxRStWJVM7MllIICAhQzxHMFE9JkVOOjcwTjxQICA5VjFCOzY0TgotTThQIFwrUzEkOTYpVTlSXF4gJyFVPCZFTC5CXUM+Nj1JO0cwTzwmUUE+Ml1GO0Y4TzlWMUI7NjROOFAgVwotTSwjKFMtI0BTLUNEIC0zLFgtQCFUN1ctVDxHNUM9ICFWN1YtSDg3KT87NjVNOEY1UiAnOT88VkFPPEcxPwotTTs2NU04RjVSICc5Pzo2WVQ3VlVFOzYpRTxAIVY3VlFPO0Y9Pzs2NU04RjVSICc5PzlGUU84NzE/OzY1TQotTThGNVIgJzk/OSZdVThGUUU3VlVFOzYpRTxAIE4xQyRRICc5PzhWQUE8RV1NOTZVQjk3KCA9RV1TOiZdUgotTT0lXU05NlVCOTcoID1FXUk7RzE/OzY1TThGNVIgJzk/OyZdTjlVXU05NlVCOTcoID1FXUY7Jl1BPSVdTQotTTk2VUI5NyggPUVdRDtXNUI7JjU/OzY1TThGNVIgJzE/PTZZSTtWWCA9RV1DOiYlUjdWVUU7NilFPEAhVgotTTdXLUg7VylUN1ZVRTs2KUU8QCFWN1ZFTj0lXU05NlVCOTcoID1FXUw7VllHN1ZVRTs2KUU8QCFWN1Y5TAotTTtWJVQ3VlVFOzYpRTxAIVY3VjFPPTYpTDk1XU05NlVCOTcoICtEOFEsUCFWN1YtSDg3KT87NjVNOEY1UgotTSAnOT88VkFPPEcxPzs2NU04RjVSICc5Pzo2WVQ3VlVFOzYpRTxAIVY3VlFPO0Y9Pzs2NU04RjVSICc5PwotTTlGUU84NzE/OzY1TThGNVIgJzk/OSZdVThGUUU3VlVFOzYpRTxAIVY3Vi1IODcpPzlHNU44UCFWN1ctSQotTTlWWUU5JV1DOiYlUjdWOVU7RiwgPUVdVTtHLUk5VllFOSVdQzomJVI3VjlVO0YsID1FXVM6Jl1SPSVdRgotTT02WUMgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgPUVdVTtHLUk5VllFOSVdUzomXVI9JV1GPTZZQwotTSAnOT86NllUN1Y5VTtGLCA9RV1TOjY9Tjk2MT86NllUN1Y5VTtGLCA9RV1VO0ctSTlWWUU5JV1JO0cxPwotTTlHNU44UCFWN1ZRTztGPT85RzVOOFAhVjdXLUk5VllFOSVdTDtWWUc3VjlVO0YsID1FXVU7Ry1JOVZZRQotTTklXUw7VllHN1Y5VTtGLCA9RV1GOyZdQT0lXUY9NllDICc5PzkmXVU4RlFFN1Y5VTtGLCA7JkVOOlAhTgotTTk3QVQgJlFJO0ZNRj02WUMgJy1UPTY5RiAnMVU3VlFJO0ZMIDtGNVg9ICFMOjZZSzlHNU44UCFTPSc1RgotTTlAIE4xQyhZICcpRTkgIUc8RjVFO0AhQjsnNUUgJi1POyZdUjxQIVk5NlFMO1c8IDwnNVI8JlFFICchSQotTTtGTCArRDhTLDAhQzomNVY+MCFGO1cpRCAmLUE8RywgOEZVVyAnIU88Ry1DOiY0ICtEOFMsUCEmMDRRMwotTTEwITQ0RTUlICYpTztWUUU4NlggOEc5QTsnLCA5RiVMPFY0ID0nKVU5MCFCO1ZdTDk2JU4sQCFNOjctTwotTTxGMUU8RjVEICcxVztQIU87RjQgPkY1UjtQIVQ6JylFOTAhTTg2RU4gICFHOTZYTzxXMVU4RjlQOTctVAotTTg3KVQrRiwgN1VdUjk2JUQ5NllWN1ctSTlWOVA5MCAgOFcxWTwmNE44UCFGOjcpUz0lXUM4NlFMICVdUwotTTk3MUM6JylDOyYlUzxQICA5VjVOK1YtVTk3QUk9IllDICY1WDo3MCAgJj1FPSY1Tj1CWUMgJj1FPSY1TgotTT1AIU49RlVBPSYtSCAgIUc5NlhPPFcxUjhXIVkrRywgPFcxUjhXIVkgIyRELCMgUCwjIFAsIyBQLCAgRAotTTkmXUM6IywgKSYxTzhWQFIgIjFEO1YtSCwwIEQ5Jl1DOiMgICAnLVk8Ul0/O1chRTtCWVMgJV1PPCY1TgotTSAjREQsIyBQLCMgUCwjIFAsICAgK1YpQThGJE84V0VQPEY1UzxSXVU8VyhPOjZZQzsnNUQ5Ml1TPjcsTgotTTxQICArVilBOEYkTzhXRVA8RjVTPFJdVTxXKE86NllDOyc1RDkyXVM+NyxPPFdFUzhWJUw7IllIICAhUwotTT43LE83VylFODYwTjxQIT88RjVBOSAgWSkjIFAsIyBQLCMgUCwjICAgJj1FO0JdQjhWXVA+MllTICZVRQotTTs2LVA+MCFHO1Y5TzxHPUE8RjFTICY5TzxHPUE8RjFTN1YpWT0mNUM7VyFZICNEWSkjIFAsIyBQLCMgUAotTSwjICA8RjVUICY5TzxHPUE7JkVHO0YlQjsmNCA5Rl1SPVVdQztXIVksQCFGO1cpVzdWLU88J0RTICY5TwotTTxHPUE8RjFTICY5TzxHPUE8RjFTN1MsUiAmOU88Rz1BPEYxUzdTJFYgJjlPPEc9QTxGMVM3UzAgOVZdQgotTTg2LUs9ViVSOScsIDhGJUM6Vz1BPEYxUzdWKVk9JjVDO1chWSAjRFkpIyBQLCMgUCwjIFAsIyQgOEYlQwotTTpWJUw6Nj1OODYpTDkwIUI4Ni1LN1YtTzwnRFIgJilBOFZNPzhWXVA+MywgOEYlQzpXPUE8RjFTICYpQQotTThWTVc4NylEPFVcUyxAIUI4Ni1LPVYlUjknLT8sMzggOEYlQzpXPUE8RjFTN1MwICAnLVk8Ul0/OFZRTwotTTxWNE48UCE/OFZRTzxWNCAuMjBQLCMgUCwjIFAsIyBQICAhQT0mNVg6NzBOOFAhPzdWWUU+JzFGO0AhPwotTTdWNVg6NzE/OUZZUyAmJVQ5N0FJPSAhPzdWLUE7JlE/OTdBST0mOU48UCAgOUZRUzhHNUYrRiwgN1YtTAotTTk2JU49NyAgOUYtTDtXLUUgJjlGOyc1UzogIT85RlFTOEc1RiAlXVg5RlFTOEc1RiAlXVc8RzFDOiZMIAotTTdWOUk7RjFCPTY4IDdWKVU5Ry1ZO0YsICAnLVk8Ul1FPiZFVCtHLCA3VjVYOjcwICAmLVI9Il1DOTcpUgotTTtXKE48UCE/OFY1UjxGXVIgICFEODcxQStGLCAgJlVQN1YxRTlCWUMgICFNODZRTDtWLE44UCFBOyZRTwotTThXLCA4NlFMO1YtUCAmJUw7Jl1DPSAhQTsmUU84V0AgODZRTDtWLUU7RjAgOzYlTDsmXUMgJjlSOTY0IAotTTxGNUE7JlFPOFAgIDxXRVMrVV1MPFY1RTpSWVMgJV1MPFY1RTpQIFkpIyBQLCMgUCwjIFAsIyAgICctWQotTTxSXT89VylJPSY0TjxQIT89VylJPSY0IC4yMFAsIyBQLCMgUCwjIFAgICE/O1ctRTxHKU88QllDICVdTwotTTxWNVI8Rl1SICVdUzk3MU88VjVSPEZdUiAgIT86Ny1BPScxWStGLCA3VkVTODcxVD4wICA8V0VTK1VdUwotTThHKUsrRywgN1ctQjxGTCA5NylSICVdQjxGTCAsMjBQLCMgUCwjIFAsIyBQICAhUz43LE83VkVPOFcxTAotTStHLCA3VkVPOFcxTCAjREQsIyBQLCMgUCwjIFAsICAgOFcpVDtGRU46NzBOPFAgIDdWNU49RkVSO1ZYIAotTTk2WVY6NylPO0AhPzdUJVI5ViwgN1VdITxGPVYgJjVSPEZZTyAlXT88VzFBPEcwIDdWPVAgJV0/OjctVAotTTg3KVQgJV0/PEY1QTkmNU49RV1TOjY9RjwmNCA3Vy1FPSYtSDxGLUw4Ny1TICZVQTo2WCA5N0FJPSAhPwotTTs2XU44Vl1OPScpTzsgIT87Ni1PPTZZVCAlXVM8JylPOFZVTztHLVQ4NylUICc5PzhWQUE8QCFWN1ctSQotTTlWWUU5JV1DOiYlUiAnOT89NllTOjY9Tjk2MT84VkFBPEAhVjdXLUg7VylUICc5PzxWRUc7RjVEN1ctSAotTTtXKVQgJzk/PTZZUzo2PU45NjE/PFZBTzxHMCA9RV1JO0cwID1FXVM6Nj1OOTYxPzo2WVQgJzk/PTZZUwotTTo2PU45NjE/OjZZVCAnOT87Jl1OOVAhVjdXLUk5VllFOSVdTDtWWUcgJzk/PTZZUzo2PU45NjE/OyZdTgotTTlQIVY3VjlMO1YlVCAnOT85Jl1VOEZRRSAnOT84VkFBPEVdQTxHKUE+MCFWN1ctSTlWWUU5JV1DOiYlUgotTTdWJVI8RiVZICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVY3Vy1IO1cpVDdWJVI8RiVZICc5PwotTTxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAnOT89NllTOjY9Tjk2MT88VkFPPEcxPzg3KVI4N0QgPUVdSQotTTtHMT84NylSODdEID1FXVM6Nj1OOTYxPzo2WVQ3ViVSPEYlWSAnOT89NllTOjY9Tjk2MT86NllUN1YlUgotTTxGJVkgJzk/OyZdTjlVXUE8RylBPjAhVjdXLUk5VllFOSVdTDtWWUc3ViVSPEYlWSAnOT89NllTOjY9TgotTTk2MT87Jl1OOVVdQTxHKUE+MCFWN1Y5TDtWJVQ3ViVSPEYlWSAnOT85Jl1VOEZRRTdWJVI8RiVZICc5PwotTThWQUE8RV1QO1ZFTj0mNVIgJzk/PFZFRztGNUQ3Vi1IODcpPzwmXUk7RzFFPEAhVjdXNU48VkVHO0Y1RAotTTdWLUg4Nyk/PCZdSTtHMUU8QCFWN1ctSDtXKVQ3VyFPOjZZVDk3KCA9RV1TOjY9Tjk2MT88VkFPPEcxPwotTTwmXUk7RzFFPEAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggPUVdSTtHMT88Jl1JO0cxRQotTTxAIVY3Vy1JOVZZRTklXUk7RzE/PCZdSTtHMUU8QCFWN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UgotTSAnOT87Jl1OOVVdUDtWRU49JjVSICc5PzxWRUc7RjVEN1ZRTztGPT88Jl1JO0cxRTxAIVY3VzVOPFZFRwotTTtGNUQ3VlFPO0Y9PzwmXUk7RzFFPEAhVjdWOUw7ViVUN1chTzo2WVQ5NyggPUVdRDtXNUI7JjU/PCZdSQotTTtHMUU8QCFWN1ctVDxHNUM9IyQgPUVdUz0nKVU4VzBSICc5Pz02WUk7VlggPUVdVTtGRU87QyggPUVdQwotTTomJVI3VjlVO0YsID1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAnOT89NllTOjY9Tjk2MT84VkFBPEVdRgotTT02WUMgJzk/PFZBTzxHMT85RzVOOFAhVjdXLUk5VllFOSVdUzomXVI9JV1GPTZZQyAnOT89NllTOjY9TgotTTk2MT88VkFPPEcxPzlHNU44UCFWN1ZFTj0lXUY9NllDICc5PzxWRUc7RjVEN1ZFTj0lXUY9NllDICc5PwotTT02WVM6Nj1OOTYxPzo2WVQ3VjlVO0YsID1FXUw7VllHN1Y5VTtGLCA9RV1TOjY9Tjk2MT87Jl1OOVVdRgotTT02WUMgJzk/PTZZUzo2PU45NjE/OyZdTjlVXUY9NllDICc5PzlGUU84NzE/OUc1TjhQIVY3VjFPPTYpTAotTTk1XUY9NllDICctPzsmRU46UCFVN1ZRSTtGTCA8JylJOzYlUj4wIU47VllQPEZFTTg3KVkgJi1MPTZZSwotTTk3KCA8VyFPPEcxUzhWJVIgJV1DPSdFUDkwIUc5NzFFO0c4IDxXMVI4VyFZICVdTzwmNU4gJV1SOTYlRAotTSAmVUU7Ni1QPjAhPzhWUU88VjQgN1VdVDxGJVA3VjlQOTVdTz1GNVI8RkVEOTAhPzdWLUE7JlE/OTdBSQotTT0mOU48UCE/OFZRRTg2WVU8ICE/OTdBST0gIT84VjVSPEZdUiAmJVQ5N0FJPSAhPzhHNUY5NllEPSYlQgotTSAlXUk7ViggN1ctUDxGXUM5NjAgN1ZRQTxXMUI9NjggN1ctSThHNUYgJV1TO1YpVTlAIT88VlVCPTY4IAotTTlGOUw9Ny1IICY5QzsmXVM5MCFGPEY1RSAlXUw8VjVFOlAhPz4mOUw8VilVOUAhPzlGUVM4RzVGICVdVwotTTxGRVQ5MCE/PVcpVDhWQUsgJV1CPTY5Uz42WUMgJV1TOTcxTzxWNVI8Rl1SICVdRjo2WUQ4RzVGICZVQQotTTsmUU84UCE/OjctQT0nMVkgJV1MO1YtSyAlXVU7Jl1DOlAhPztGUU84VkwgN1ZFTDtWLUsgJV1GOyZdQwotTTpQIT89VlFPOFZMIDdWLUw7Vi1LICVdVDsmXUM6UCE/OFcxTDtWLUsgJV1EOyZdQzpQIT84ViVTICVdVQotTTxVXVI8VzFIPEY1QTklXVM9JjFJO1AhPzxWKVI6UCE/OEcpSyAnKUU4NlFMO1YsIDdWXVM5NylSO1coIAotTTdWRU84VzFMICY1TjkgIT87NkVOOEcpSyAlXUM9NylCPEZMIDdWNU45ICAgICQgIVAgICAgICQgICAgIAotTSAgICAwICAgICAgICAgICsgICAgICAgICAiJCAgICAgICAgICAgICAgIDAgICAgICAgICAkICAgICAgIAotTSAgICUmOCAgICAgICAgICAgICA/ICQgIVAgICAgICQgICAhICAgICApICAgICBMICAgICIgICAgICAgIAotTSAgICAgICAgICAgICAgICQgICAgICAgMCAgICAgICAgICA0ICAgICUnOCAgICAgICAgICAgICAgICQgIQotTVAgICAgICQgICAhRCAgICAoMCAgICBUICAgICIgICAgICAgICAgICAgICAgICAgICAgICQgICAgICAgMAotTSAgICAgICAgICBIICAgICUnOCAgICAgICAgICAgICAgICQgIVAgICAgICQgICAiJSAgICAjMCAgICBcIAotTSAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcICAgICEnOCAgICAgIAotTSAgICAgICAgICQgIjQgICAgICQgICAiMiAgICM/MCAgICEkICAgIiogICAgKDAgICAsXCAgICAgICAgIAotTSAgICQgIFwgICAgMCAgICEmQCAgICEgICAgICEgMCAgICAgICAhXCAgICBfICQgJUQgICAgICQgICAwLwotTSAgICApMCAgIClMICAgICQgICAgXCAgICAgKCAgICAgICAgICAgIDMgICQgICAkSiAgICAjUCAgICEkIAotTSAgICEgOCAgICAgICAlWCAgICAhICQgJUggICAgICQgICAwVCAgICAoMCAgIClcICAgICUgICAgXEAgIAotTSAjTCAgICAgICAgICAgIDQgICQgICAkWSAgICAjUCAgICEoICAgICEgOCAgICAgICAlXCAgICA3ICQgJgotTUQgICAgICQgICAxNSAgICAkUCAgICowICAgICQgICAhKzAgICAgVCAgICAgICAgICAgIDUgICQgICAlKAotTSAgICAjUCAgICEsICAgICEgOCAgICAgICAnOCAgICAsICQgJlQgICAgICQgICAxSCAgICAmMCAgICpAIAotTSAgICYgICAhLkAgICAkICAgICAgICAgICAgIDYgICggICAlNyAgICAkMCAgICEwICAgICEgOCAgICAgIAotTSAoKCAgICAwICQgJ1QgICAgICQgICAyISAgICAvQCAgICpYICAgICkgICAhPkAgICAiSCAgICAgICAgIAotTSAgIDggICQgICAlSCAgICAhICAgICE0ICAgICUmOCAgICAgICApKCAgICBKICQgKEAgICAgICQgICAyXwotTSAgICAoICAgICs8ICAgICUgICAhSSAgICAgQCAgICAgICAgICAgIDkgICQgICAlTCAgICAhICAgICFIIAotTSAgICUmOCAgICAgICArUCAgICAlICQgKEAgICAgICQgICAzPyAgICAoMCAgICtQICAgICIgICAgICAgIAotTSAgICAgICAgICAgICAgICEgICAgICAgJCAgICAgICAgICFcICAgICUnOCAgICAgICAgICAgICAgICQgKAotTUAgICAgICQgICA0ICAgICAqMCAgICtYICAgICIgICAgICAgICAgICAgICAgICAgICAgICEgICAgICAgJAotTSAgICAgICAgICIwICAgICUnOCAgICAgICAgICAgICAgICQgKEggICAgICQgICA0SSAgICAoICAgICwgIAotTSAgICUgICAhSyAgICAgQCAgICAgICAgICAgIDogICQgICAlUCAgICAhICAgICJEICAgICUmOCAgICAgIAotTSAsJCAgICAlICQgKFAgICAgICQgICA1KSAgICElICAgICw0ICAgIDkgICAhTSAgICAsOCAgICAgICAgIAotTSAgIDsgICQgICAlVCAgICAhICAgICJYICAgICUmOCAgICAgICAsOCAgICJUICQgK1QgICAgICQgICA5PQotTSAgICAoQCAgIC1YICAgICUgICAiPkAgICAgQCAgICAgICAgICAgIDwgICQgICAlWCAgICAhICAgICMsIAotTSAgICUmOCAgICAgICA3SCAgICAlICQgK1wgICAgICQgICA5XyAgICAtICAgIC4sICAgICggICAiQEAgIAotTSAiUCAgICAgICAgICAgID0gICggICAlXCAgICAkMCAgICNAICAgICEgOCAgICAgICA3XCAgICAoICQgLAotTUggICAgICQgICA6UyAgICAzICAgIC5MICAgIDIgICAiS0AgICBCKCAgICAgICAgICAgID8gIEAgICAmLQotTSAgICAnMCAgICNEICAgICEgOCAgICAgICA4PCAgICI7ICQgNSwgICAgICQgICA7XyAgICAkQCAgIC9UIAotTSAgICQgICAkVCAgICAgMCAgICAgICAgICAgIEcgICQgICAmSiAgICAhICAgICNIICAgICUmOCAgICAgIAotTSBCKCAgICAiICQgNTAgICAgICQgICA8MSAgICAlQCAgIDAkICAgICQgICAkVSAgICAgMCAgICAgICAgIAotTSAgIEggICQgICAmTiAgICAhICAgICNcICAgICMmOCAgICAgICBCMCAgICAjICQgNTQgICAgICQgICA8RwotTSAgICAiICAgIDA0ICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUiAgICAjMCAgICQoIAotTSAgICEgOCAgICAgICAgICAgICAgICQgNTQgICAgICQgICA8TyAgICAiQCAgIDA8ICAgICIgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAmXyAgICAjMCAgICQsICAgICEgOCAgICAgICAgICAgICAgICQgNQotTTQgICAgICQgICA8WSAgICAwUCAgIDBEICAgIC0gICAkViAgICAxTCAgICAgICAgICAgIEkgICwgICAnLAotTSAgICAkUCAgICQwICAgICEgOCAgICAgICBCPCAgICFOICQgOVAgICAgICQgICA9XCAgICAoQCAgIDE4IAotTSAgICUgICAlXFAgICAgQCAgICAgICAgICAgIEwgICQgICAnPyAgICAhICAgICQ0ICAgICUmOCAgICAgIAotTSBJNCAgICAlICQgOVggICAgICQgICA+PiAgICAoQCAgIDFMICAgICUgICAlXlAgICAgQCAgICAgICAgIAotTSAgIE0gICQgICAnQyAgICAhICAgICRIICAgICUmOCAgICAgICBJSCAgICAlICQgOiAgICAgICQgICA/IAotTSAgICAoMCAgIDIgICAgICYgICAmIFAgICAgOCAgICAgICAgICAgIE4gICggICAnRyAgICAkMCAgICRcIAotTSAgICEgOCAgICAgICBJXCAgICAjICQgOiggICAgICQgICA/QSAgICAkUCAgIDI4ICAgICQgICAmIjAgIAotTSAhNCAgICAgICAgICAgIFAgICQgICAnWCAgICAjUCAgICUgICAgICEgOCAgICAgICBKKCAgICApICQgOgotTUAgICAgICQgICA/VCAgICAqMCAgIDJIICAgICggICAmJ0AgICAhSCAgICAgICAgICAgIFEgICggICAoJwotTSAgICAiICAgICUkICAgICUmOCAgICAgICBKTCAgICAwICQgOlwgICAgICQgICBAPSAgICAoQCAgIDMoIAotTSAgICUgICAmLiAgICAgQCAgICAgICAgICAgIFMgICQgICAoLyAgICAhICAgICU4ICAgICUmOCAgICAgIAotTSBLTCAgICAlJCQgOyQgICAgICQgICBAXyAgICAjICAgIDM8ICAgICIgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICVMICAgICEnOCAgICAgICAgICAgICAgICAgICAgICAgICQgICAgIQotTSAgICAgQCAgICAoICAgICAgICAgIDAgICAgJCAgICAiICAgICBAICAgICAgICAgISAgICAgMCAgICAoIAotTSAgICIgICAgIFAgICAgMCAgICAlICAgICFAICAgIDwgICAgKCAgICAiMCAgICAoICAgICIgICAgIDAgIAotTSAgJCAgICAqICAgICAwICAgICggICAgKyAgICAjICAgICBIICAgICEgICAgIEAgICAgTCAgICAsICAgIAotTSJAICAgICQgICAgIiAgICAiUCAgICBQICAgIC0gICAgIDAgICAgKCAgICArICAgICMgICAgIFggICAgIgotTSAgICAgQCAgICAkICAgICEgICAgI1AgICAgJCAgICAiICAgICJQICAgIFAgICAgMCAgICAkMCAgICEoIAotTSAgICEgICAgIEAgICAgTCAgICAsICAgICRQICAgICQgICAgIiAgICAlICAgICE0ICAgIDYgICAgJVAgIAotTSAgJCAgICAiICAgICJQICAgIFAgICAgOCAgICAgMCAgICAoICAgICsgICAgIyAgICAhRCAgICA6ICAgIAotTSZQICAgICQgICAgIiAgICAiUCAgICBQICAgIDwgICAgIDAgICAgKCAgICArICAgICMgICAgIVQgICAgIAotTSAgICAgISAgIksgJUtfX18gICAgICAgICAgRDAgIEpQITpfX19QICAgICAgICAgMSQgICwkIDcvX19cIAotTSAgICAgICAgJiEgICMhMCVTX19fICAgICAgICAgIVwwICBQOCE8X19fUCAgICAgICAgIEUgJCAhUCFAQAotTSAgKCAgICAgICAgICsxICBCSCA0S19fXyAgICAgUCAgICMkIDAhTDwlTF9fX1AgICAgNCAgICBaICQgJQotTUQhQEAgICQgICAgJiAgICAyUCEgITogOCggICIgICAgISAgICAlQCAwIC5MJiIgIEEwICAgIDwgICAhPQotTSAkICZEIUBAICAkICAgICAgICAgOEAhICBCQDgoICAkICAgICAgICAgJlggMCAoUCYiICAhQCAgICAgIAotTSAgIVYgJCAiLyFAQCAgQCAgICAkICAgIEExICAiUSAlUCAgKCAgICAhICAgIChQMCAgTDEhPCAgIiAgIAotTSAgMCAgICI6JCAgKyRANyAgIEAgICAgJCAgICBKQSAgIlEwJVAgICMgICAgISAgICArKDAgIEw2ITwgIAotTSBQICAgIDAgICAjISQgICsmIDcgICBEICAgICQgICAgVEEgICJRUCVQICAkICAgICEgICAgLUAwICBMQAotTSE8ICAhICAgICAwICAgI0UkICArKSA3ICAgSCAgICAkICAgIF0hICAiUkAlUCAgJSAgICAhICAgIC9MMAotTSAgTEwhPCAgITAgICAgMCAgICQpJCAgKywgNyAgIEwgICAgJCAgICEmMSAgIlMwJVAgICYgICAgISAgIAotTSAyJDAgIExYITwgICFQICAgIDAgICAkSiQgICswIDcgICBUICAgICQgICAhLVEgICJUKCVQICAzICAgIAotTSEgICAgNEwwICBNJCE8ICAmMCAgICAwICAgJUEkICArMiA3ICAhXCAgICAkICAgITtRICAiVFAlUCAgRQotTSAgICAhICAgIDgwMCAgTTAhPCAgKlAgICAgMCAgICY7JCAgKzYgNyAgIyQgICAgJCAgICFJUSAgIlYgJQotTVAgIFcgICAgISAgICA7SDAgIE1IITwgIC8wICAgIDAgICAnLyQgICs8IDcgICQsICAgICQgICAhVyEgIAotTSJXQCVQICEpICAgICEgICAgPyAwICBOICE8ICAzUCAgICAwICAgKCYkICArQiA3ICAlNCAgICAkICAgIgotTSUhICA4XyAkOCAhOyAgICAhICAgIEIsMCAgTjAhPCAgODAgICAgMCAgIChSJCAgK0UgNyAgJiggICAgJAotTSAgICIyISAgIllAJVAgIUMgICAgISAgICBGIDAgIE48ITwgIDkgICAgIDAgICApUCQgICtIIDcgICY0IAotTSAgICQgICAiQVEgICJaMCVQICFGICAgICEgICAgSiAwICBOSCE8ICA5UCAgICAwICAgKk4kICArSyA3IAotTSAmQCAgICAkICAgIlBRICAiWyAlUCAhSSAgICAhICAgIE1IMCAgTlQhPCAgOkAgICAgMCAgICtJJCAgKwotTU4gNyAgJkwgICAgJCAgICJfUSAgIltQJVAgIUwgICAgISAgICBRPDAgIE8gITwgIDswICAgIDAgICAsRwotTSQgICtRIDcgICZYICAgICQgICAjLiEgIDhcICQ4ICFSICAgICEgICAgVCgwICYvOCEmICA+ICAgICAwIAotTSAgLSwkICArUiA3ICAnWCAgICAkICAgIzUhICAiXSAlUCAiJCAgICAhICAgIFVUIDAgKTAmIiAgKDAgIAotTSAgMCAgIC1JICQgIjohQEAgIjQgICAgJCAgICM/ICEgIEggOCggIEkgICAgISAgICBZJCAwICo4JiIgIAotTSswICAgIDAgICAuPiAkICJMIUBAICMkICAgICQgICAjTEAhICBMQDgoICBVICAgICEgICAgXEAgMCArQAotTSYiICAuMCAgICAwICAgLzMgJCAiXiFAQCAjVCAgICAkICAgI1kwISAgUSA4KCAhISAgICAhICAgIF9EIAotTTAgLEgmIiAgMTAgICAgMCAgIDAlICQgIzAhQEAgJEQgICAgJCAgICQmICEgIFVAOCggIS0gICAgISAgIAotTSEiVCAwIC1QJiIgIDQwICAgIDAgICAwWiAkICNDIUBAICU0ICAgICQgICAkMiEgICJdQCVQICJeICAgIAotTSEgICAhJFwwICYsUCEmICBXICAgICAwICAgMTYkICArVyA3ICAuNCAgICAkICAgJDdBICAiXiAlUCAjTgotTSAgICAhICAgISZEMCAgT0QhPCAgXUAgICAgMCAgIDFRJCAgK1ogNyAgL1ggICAgJiAgICQ+USAgICAgJAotTTNfX18gICAgIiAgICEoKCAwIDswJiIgICAwICAgIEQgICAyKSAkICdUIUBAICAkICAgICogICAkRCAhIAotTSIoIDgoICAhICAgICMwICAhKTggMCBCQCYiICAgMCAgICBYICAgMjwgJCAoUCFAQCAgJCAgICAvICAgJAotTUhQISAiXSA4KCAgISAgICAhUCAgISpIMCAgSzAhOl9fX1AgICAhICAgIDJeICQgLC4hQEAgIDQgICAgMQotTSAgICRTMCEgIyogOCggICEgICAgJEAgICEtOCAwITRQJiIgICAwICAgISwgICAzPCAkIDUwIUBAICAkIAotTSAgIDAgICAkWSAhICJfIDgoICAjICAgICUgICAhLkwwICAqQCEkX19fUCAgICEwICAgM1YkICAkLSAxLwotTV9fXCAgICA1ICAgJF5RICAiUCAlS19fXyAgICAlICAgITAwMCAgS1AhOl9fX1AgICAhMCAgIDQtJCAgMAotTSAgMU9fX1wgICAgNCAgICUlISAgMCAgJDtfX18gICAgJSAgICExTDAgJiAoISZfX19QICAgISQgICA0QgotTSAkIC1WIUBAICA0ICAgIDEgICAlKjAhICMxQDgoICAjICAgICVAICAhMyAgMCFBSCYiICAiICAgICE8IAotTSAgNFUgJCA5UCFAQCAgJCAgICAxICAgJS8gISAkNSA4KCAgKSAgICAkMCAgITQ0IDAgXEAmIiAgIVAgIAotTSAhQCAgIDUtICQgOVghQEAgICQgICAgMSAgICU1ICEgJEZAOCggICsgICAgJDAgICE1UCAwITM4JiIgIAotTSNQICAgIUQgICA1RSAkIDojIUBAICAsICAgIDEgICAlPDAhICRXMDgoICAtICAgICVAICAhN0ggMCE1MAotTSYiICAhQCAgICFIICAgNiEgJCA6KCFAQCAgJCAgICA1ICAgJUIxICAjIVAlU19fXyAgICAlMCAgIThcMAotTSAgUEAhPF9fX1AgICAhNCAgIDY2JCAgLCkgNy9fX1wgICAgNSAgICVHMSAgIyJAJVNfX18gICAgJTAgIAotTSE6MDAgIFBMITxfX19QICAgITQgICA2SyQgICwsIDcvX19cICAgIDUgICAlTEEgICMjMCVTX19fICAgIAotTSUwICAhO0QwICBQWCE8X19fUCAgICE0ICAgNyAkICAsLyA3L19fXCAgICA1ICAgJVIhICAjJCAlU19fXwotTSAgICAlMCAgITxcMCAgUSQhPF9fX1AgICAhNCAgIDc0JCAgKyEgNk9fX1wgICAgOyAgICVZUCEgJkggOAotTSggICEgICAgJlAgICE+VCAwIUpQJiIgICEgICAgITggICA3UiAkIDhKIUBAICBIICAgIDkgICAlXkAhIAotTSZAIDgoICAhICAgICcgICAhQCwgMCFLUCYiICAgMCAgICFMICAgOCokICJHMCExT19fXCAgICA7ICAgJgotSSNBICAiSCAkM19fXyAgICAmUCAgIUE4MCAgSiQhJF9fX1AgIF9fXCAgIDg+JCAiRzAhMU9fX1w7Ci0gCi1lbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3BhcmMtYW91dC51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcGFyYy1hb3V0LnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGVlZjkuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcGFyYy1hb3V0LnUKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotYmVnaW4gNzc3IHNwYXJjLWFvdXQKLU1AMCwhIlAgICggICAgIiAgICAgICAgICAjWVAgICIgQCAgICAgICAgICAiXCQiICBUIC5AMCkoI0gkMjUKLU0qQiAiRSAqQCEpMCIwIEg3ICAgMFUiK0BIICwgICBDIiAmKChAKSAgIDAqICAgMCEgICAgMCAgICJAJCAKLU0gICEgICBAJCAwICAgJCAgIC02PChaIEAwICAoIFAkICAgISAgIEAkIDAgICApV0NPVkBPICAgKEtBN0IKLU0qISQgICBCMCRCKCwwICAgMlkoMCggIkwkICAoREAuQDckICAgJE40JCIgQEAqKEAoISogICRcISAgICAKLU1QQS5AN0giQDgwTDJAICErIDAgICAuQCNIJiMiIFohRFhALkA6KjAlICAmMiEoIDErUCAgIipYNVhEQjAKLU0kIiAgRSEgQCExPEAgICI2JE4gIkYhICAlRCAgICMyOiQiICBJQSAgIikgIiAhMzIgWiFERSEgQCFRPEAKLU0gICI2JE4gMkYhICAlRCAgICJOOiQgIDQrUCAgIipYNVhHMDEgICAoRCEoQiZUICAgIi4yJCIgIEpBICAKLU0iLCgjSCZCIEQgICEgSCAgIlJcICAgQk4lPikoRCAzICRJKDAgISY0JCIgJyVSICAgKTgyWCEqOCQgIDUKLU0wICAgJVlIMCggIyIgWiFQSCAzICA+OENIJ1NKKFoiIFsiLkBBICwgICBDIiAmKChQQi5AQiAsICAhIyIKLU0gJiJAUEIuQEMgLCAgIEIiJCYhRFBCLkBEKSAwKCAmP1EgICBEQSBAPygnJ1ggQiFaICAgJCggICFIKDAKLU0oIDQwQCAgJEBBIEAxUSIgICAqIiQiICNEPSBAICBKICAgMCEgICAgQDwvQCIgJCAgICIwJCIgIkRAN0AKLU0hLTAlUCAiIiQiICREPSBAICkgMCgnXiIkIiAhRD0gQCAgICAwICBPPTctUitWUUk4Ql1MOSJZUztQIE8KLU05JjVWK1dJRTxGXCAgICAgICAgICY2LVI9IyBaKCZZTygiXVU8VyhPOyZFQitWUUQrRy1PIkAgICAgICAKLU0gICBGOFcpVCwjSEArVzVTPEJdTDo2KE87JjBOPFZcQDs2JVA8JkVOOVIhRjg2RUw9NylFIkAgICAgICAKLU0gITFDPEcwUC5CIU47UiBPOSY1VitXSUU8RlwqICAgICAgIj1YW14wTCEgQCAjIiAgICYhUV4gKEA+QCAKLU0gKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQQCAgIUA8P0AiKCdIICAiPVhbXjAKLU1MISBAICMiICAgJiFRXiAoQD5AICApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFAKLU1AICAhQDw/QCIoJ0ggICI9WFteMEwhIEAgIyIgICAmIVFeIChAPkAgIClXQ09ZIlAkIiAgLCggICA4JycKLU1YIEIhWiAgIEc+Ll9EKyAwKCAgUEAgICFAPD9AIignSCAgIj1YW14wTCEgQCAjIiAgICYhUV4gKEA+QCAKLU0gKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQQCAgIUA8P0AiKCdIICAgICAgICAKLU1HPi5fRCEkICAgQyEgQi4gLCggICA4JydYIEIhWiAgIEc+Ll9EISQgICEjISZCIkgsKCAgIDgnJ1ggQiEKLU1aICAgMExAICApV0NPV0EgICAjRCAwICAgISQgICEjICpCLDAkMCAgJCkoMCggJzIqQik4JDAgICQpKDAKLU0oICsyKkIlWCQwICAkKSgwKCAvMixCJFAkMCAgJCkoMCggMzIsQiQoJDAgICQpKDAoIDcyLEInQCQwICAKLU0kKSgwKCA7MihCJygkMCAgJCkoMCggPzIoQiZAJDAgICQpKDAoIEMyKEIkICQwICAkKSgwKCBHMihCLCgKLU0kMCAgJCkoMCggSzIoQikoJDAgICQpKDAoIE8yKEIlQCQwICAkISwgICBDNCBGLlRVIihBKiEkICAhIDMKLU0gICAwVSFJQEwtMFooOEAxICAgMCRQICAkLTAqOFEjNCpCJlAkMCAgJCEsICAhIzQiRik4VSJIQUYhJCAKLU0gISAzICAgMFUgSUE+LTBKKC5AMSAgIDAkUCAgJC0wMjgzIzQsQilIJDAgICQhLCAgISM0JEYkKFUjKEIKLU0sISQgICEgMyAgIDBVISlBWC0wUig1QDEgICAwJFAgICQtMCI4PEM0KEIlICQwICAkISwgICEjNCBGJkAKLU1VIihBLiEkICAhIDMgICAwVSApQSAtMEIoQkAxICAgMCRQICAkLTAiOFBDNChCJkgkMCAgJCEsICAhIzQKLU0gRikoVSIoQUQhJCAgISAzICAgMFUgKUE4LTBCKC4gMSAgIDAkUCAgJC0wIjgyQzQoQilAJDAgICQhLCAKLU0gISM0JkYmKFUjSEEkISQgICEgNSAgIDBEQSpDJC0oQigvQDEgICAwJTAgICQpKDJIRUMyKEIjOCQwICAKLU0kITQgICEiMiRKJVhUQihBUCEkICAhIDUgICAwREEqQSwtKEIoNyAxICAgMCUwICAkKSgySDBDMihCJTAKLU0kMCAgJCE0ICAhIjIkSidAVEIoQyAhJCAgISA1ICAgMERBKkFSLShCKEUgMSAgIDAlMCAgJCkoMkg6IzIKLU0oQihAJDAgICQhNCAgISIyJEokIFRCKEEyISQgICEgNSAgIDBEQSpDIi0oQigvIDEgICAwJTAgICQpKDIKLU1IREMyKEIjMCQwICAkITQgICEiMiRKJUBUQihBTiEkICAhIDUgICAwREEqQSotKEIoNkAxICAgMCUwICAKLU0kKSgySDhDMihCJzgkMCAgJCkoMCggKzIoQiMoJDAgICQpKDAoICsyKEIoWCQwICAkKSgwKCAnMihCJzAKLU0kMCAgJCkoMCggJzIoQidIJDAgICQhLCAgISM0IEYpIFUiKEI8ISQgICEgMyAgIDBVISlBKC0wUig4IiEKLU1RXiAoQD5AICApV0NPWSAxICAgMFUgKEMoKCJCT19cMkAgIC1EQShDKC0gIjggMiBIQiAgIEggICI5MDAKLU0oICI2IEYgJERBIEAgKSgiOCAzMCBEICtAKihAICEqX19fVjQgSiAhREkqICAgMiAgIEgxICAgMEhBKEMKLU0oKiRKOCArMCEgIDFHXCggICogJC9fUiBJIiAgLStfX189ICQgISYhUV4gKEA+QCAgKVdDT1kgMSAgIDAKLU1UQChDJygiQjggICJAICApSCEoQyctICQgICI/UEAgIEggMEAhLSAkICAiIEhCICAkS19fXlAkICAgIDEKLU0gICApRCEoQkIkICAhRTYyJCIgIEA8P0AiKCdIICAiPVhbXjAkUCAgJC0gIjgrUiBIQiAgJEggICEpIDAKLU0oICVfX19fR1QiKUBPKCcnWCBCIVogICAgICAgICAgIDAmUCAgIDI2X19fX1EgICAwJ0AgICBGNl9fX18KLU1NICAgMCgwICAgNjZfX19fSyAgIDApICAgJFY2X19fXzMgICAgIDQgICAgNiAgICAyQCAgICAgICAgICAKLU0gICAgJiAgICAgSCAgICA3ICAgICEgICAgIUQgICAgKSAgICA1MCAgICBUICAgIEEgICAgKEAgICAiVCAKLU0gICBHICAgIDFfX19fX1wgICAgICAgICAtQCAgICAjX19fX18gICAgICAgICAkJCAgICAgICAgICFAICAKLU0gI1ggICAgIiAgICAlMCAgICBQICAgIFIgICAgKkAgICAgICAgICBLICAgICxQICAgIjAgICAgVSAgICAKLU0hUCAgICIwICAgICEgICAgKCAgICAgLCAgICA6ICAgICIgICAgI0AgICAgKyAgICAsICAgICBYICAgIDwKLU0gICAgI1AgICAhTCAgICAwICAgICkwICAgISQgICAgPSAgICAkQCAgICFYICAgIDMgICAgJ1AgICAhMCAKLU0gICBZICAgICUwICAgIiggICAgNiAgICAqUCAgICE8ICAgISYgICAgJiAgICAiLCAgICA5ICAgICwwICAKLU0gIUggICAgRyAgICAmUCAgICI4ICAgIDwgICAgKiAgICAhVCAgICBKICAgICdAICAgIkQgICAgPyAgICAKLU0vUCAgICIgICAgISEgICAgKDAgICAiUCAgICBDICAgICtQICAgIjQgICAgTiAgICApQCAgICAgICAgIEgKLU0gICAgICAgICAiRCAgICBbICAgICsgICAgIzggICAgTSAgICAtUCAgICJYICAgIFQgICAgK1AgICAjVCAKLU0gICBQICAgIC5AICAgIyQgICAhLyAgICAsQCAgICAgICAgIFMgICAgMEAgICAjMCAgICAgICAgIC0wICAKLU0gJDQgICAgVyAgICAvICAgICNAICAgISAgICAgLjAgICAgICAgICBaICAgICAgICAgI0wgICAhNCAgICAKLU0vICAgICUoICAgIF0gICAgMFAgICAjWCAgICEkICAgIC9QICAgJEQgICAhICAgICAyICAgICQoICAgICAKLU0gICAgMFAgICAgICAgICEkICAgIDMwICAgJDQgICAhKiAgICAxQCAgICRQICAgIScgICAgMlAgICAkQCAKLU0gICEwICAgIDIwICAgJFggICAhKyAgICA0MCAgICRQICAgITMgICAgMzAgICAgICAgICEuICAgICAgICAKLU0gJFwgICAgICAgICA0ICAgICAgICAgITEgICAgICAgICAlKCAgICAgICAgIDRQICAgICAgICAgICEwICcKLU1DICAgLFtAICAgICchUCAmWDAgIDAsQCAgICAuIjAgJVMgICAwUkAgICAgMyEwICUjQCAgKCIgICAgIDkKLU0gMCAjOEAgICAgICAgICBFIDAgJlhAICAgICAgICAgTCEwICM/QCAgKFtAICAgIFIhUCAlPEAgIDAqICAKLU0gICBbIVAgJy4wICAwICAgICAhJSAwICNIICAgICAgICAgISshMCAgXFAgIChRUCAgICE+ITAgJ0tQICAKLU0oUEAgICAhSiIwICdTUCAgMCxAICAgIVMhMCAiQFAgIChPMCAgICIqIjAgJl0gICAwLSAgICAiQSIwICMKLU1eQCAgMC1AICAgIlgiMCAnM1AgIDAuICAgICMvIjAgJDowICAwLkAgICAjRiIwICJLQCAgMC8gICAgI1YKLU0iMCAoNEAgIDAvQCAgICQmIjAgJkAgICAwMCAgICAkNiIwICAzICAgMDBAICAgJEYiMCAgTjAgIDAxICAKLU0gICRWIjAgJ1FAICAwMiAgICAkXyIwICZSICAgMDJAICAgJSgiMCAnRkAgIDAzICAgICUxITAgJERQICAKLU0oVUAgICAlRSEwICc7UCAgKEowICAgJVkiMCAiIFAgIDAzQCAgICYtITAgIFNQICAoVDAgICAmOiEwICMKLU1KUCAgKEkgICAgJkciMCAmVzAgIDA0ICAgICZUITAgJElAICApVFAgICAmXCIwIChBICAgMDRAICAgJzQKLU0iMCAmJSAgIDA1ICAgICdMIjAgJShQICAwNUAgICAoJCIwICRWMCAgMDYgICAgKDUiMCAiXUAgIDA2QCAKLU0gIChGIjAgJilAICAwNyAgICAoVyIwICQ5QCAgMDdAICAgKSgiMCAnKCAgIDA4ICAgICkyIjAgJTpQICAKLU0wOEAgICApPCEwICRRMCAgKFMgICAgKVEhMCAkPVAgIChOICAgIComIjAgIEkwICAwOSAgICAqOyIwICYKLU03MCAgMDlAICAgKlAhMCAlKVAgIChYMCAgICpeITAgJUMwICAoTFAgICArLCIwICgxICAgMDogICAgKzoKLU0iMCAhTlAgIDA6QCAgICtIIjAgJzxQICAwOyAgICArViIwICdQQCAgMDtAICAgLC8iMCAkUiAgIDA8ICAKLU0gICxIIjAgJ1wgICAwPEAgICAsTyIwICJeICAgMD0gICAgLFoiMCAnMSAgIDA9QCAgIC0sIjAgIVZAICAKLU0wPiAgICAtPiIwICRHQCAgMD5AICAgLUciMCAnKlAgIDA/ICAgIC1SIjAgJysgICAwQEAgICAtXSEwICMKLU1GMCAgKFZQICAgLjMhMCAmPTAgIChLQCAgIC5JIjAgI1NAICAwQiAgICAuXyIwICEiMCAgMEJAICAgLzUKLU0iMCAgOzAgIDBDICAgIC9LIjAgIj1QICAwQ0AgICAvVyIwICcxMCAgMEQgICAgL18hMCAkRzAgIChZUCAKLU0gIDAuIjAgKDgwICAwREAgICAwPSIwICVeQCAgMEUgICAgMEwiMCAnW0AgIDBFQCAgIDBbIjAgIVMwICAKLU0wRiAgICAxKiIwICJGMCAgMEZAICAgMTkiMCAnQTAgIDBHICAgIDFBIjAgJ0sgICAwUCAgICAxWyIwICcKLU1OMCAgMFBAICAgMiMiMCAnMUAgIDBRICAgIDIrIDAgJj0gICAgICAgICAyNCFQICJGICAgMCwgICAgMkYKLU0iMCAnPDAgIDBRQCAgIDJVIjAgIlRQICAwUiAgICAzJCEwICY+MCAgKVAgICAgMzchMCAmQjAgIClIQCAKLU0gIDNKIVAgJUggICAwK0E/OTcxRT4nMCA3VjVEODcxQSAlXUU7RjAgPFcxQTxHMCA8VzFBPEcxPzlGUU8KLU04NzAgN1VdRT4mRVQgJV1NODZFTiAlXUU7RzlJPEZdTiAlXT8xJUUuMDRVKTBQIT85N0FJPSAhPz1FXVMKLU06Nj1OOTYxPzo2WVQ3VjlVO0YsIDdXOT86NllUN1Y5VTtGLCA3VyFSOjZVQTxHRCA3Vzk/PTZZUzo2PU4KLU05NjE/PFZBTzxHMT85RzVOOFAhPz1FXVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgJV1WN1ctSTlWWUUKLU05JV1DOiYlUjdXIU86NllUOTcoIDdXOT89NllTOjY9Tjk2MT87Jl1OOVVdQTxHKUE+MCE/PUVdVTtHLUkKLU05VllFOSVdQzomJVI3ViVSPEYlWSAlXVY3VlFPO0Y9PzwmXUk7RzFFPEAhPz1FXUM6JiVSN1chTzo2WVQKLU05NyggN1c5Pz02WVM6Nj1OOTYxPzo2WVQgJV1WN1ctSTlWWUU5JV1TOiZdUj0gIT89RV1EO1c1QjsmNT8KLU04NylSODdEIDdXOT89NllJO1ZYIDdXOT85RlFPODcwIDdXOT88VkFPPEcwIDdXOT88VkVHO0Y1RDdWUU8KLU07Rj0/OUc1TjhQIT89RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgJV1WN1ctSTlWWUU5JV1JO0cxPzg3KVIKLU04N0QgN1c5PzsmXU45VV1GPTZZQyAlXVY3Vi1IODcpPzlHNU44UCE/PUVdSTtHMT84NylSODdEIDdVXT8KLU07NiVJO0AhPz1FXVU7Ry1JOVZZRTklXUk7RzE/PCZdSTtHMUU8QCE/PUVdUzo2PU45NjE/PFZBTzxHMT8KLU08Jl1JO0cxRTxAIT89RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUE8RylBPjAhPz1FXVU7Ry1JOVZZRTklXUwKLU07VllHICVdVjdWOUw7ViVUN1chTzo2WVQ5NyggN1c5PzxWQU88RzE/PCZdSTtHMUU8QCE/PUVdVTtHLUkKLU05VllFOSVdQzomJVIgJV1WN1c1Tjo2XU4sQCE/PUVdRDtXNUI7JjQgN1c5Pz02WVM6Nj1OOTYxPzo2WVQKLU03VjlVO0YsIDdXOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA3Vzk/PFZFRztGNUQ3VlFPO0Y9Pzg3KVIKLU04N0QgN1c5PzxWRUc7RjVEN1YtSDg3KT84NylSODdEIDdXOT85RlFPODcxPzlHNU44UCE/PUVdUzomXVIKLU09JV1GPTZZQyAlXVY3Vy1JOVZZRTklXUk7RzAgN1c5PzsmXU45VV1BPEcpQT4wIT89RV1DOiYlUjdWJVIKLU08RiVZICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCE/PUVdVTtHLUk5VllFOSVdQzomJVIKLU03VyFPOjZZVDk3KCA3Vzk/OjZZVCAlXVM8Jl1SPSctQzg3KCA3Vzk/OSZdVThGUUU3VyFPOjZZVDk3KCAKLU03Vzk/PTZZUzo2PU45NjE/PFZBTzxHMCA3Vi1MPTZZSzk3KCA3Vzk/PFcxUj02LVQsMCE/PUVdUz0nKVUKLU04VzBSICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/OUc1TjhQIT89RV1VO0ctSTlWWUU5JV1DOiYlUjdWOVUKLU07RiwgN1c5PzxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQ3VkVOPSVdQTxHKUEKLU0+MCE/PUVdUzo2PU45NjE/PFZBTzxHMT84NylSODdEIDdWWU87RyFSOjZVQTxHRCA3Vy0/OyZFTjpQIT8KLU09RV1EO1c1QjsmNT85RzVOOFAhPz1FXVM6Nj1OOTYxPzsmXU45UCE/PUVdSTtHMT88Jl1JO0cxRTxAIT8KLU09RV1TOjY9Tjk2MT84VkFBPEAhPz1FXUY7Jl1BPSVdQTxHKUE+MCE/PUVdUzomXVI9JV1BPEcpQT4wIT8KLU09NV1MOjZZSyAlXVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoIDdXOT87Jl1OOVAhPz1FXUMKLU06JiVSICVdTztFXUU+JkVUICVdPzk3QUk9JV1EPTZVTT41XUQ5Ni1MICVdPzdULTQzVSk/MyRFMzUlXT8KLU0gJV0/N1QxNDNVKT8zJEUzNSVdPyAlXT83VjFPN1Y9TDtWKUE7JV1DPSZdUjxQIT83VV1EO1VdRzsmXUIKLU04NlE/OScxTzxHLCA3VV1FPiZFVDdWMVU7NlVZN1cpRTlAICAgICAgICJdVTxXKE87Jl1DODZQTzsmRUIKLU0rVj1DOFJVTDo2KE88VzVOLSJcUitDJE8uQl1VPFcoTzsmXUM4NlBPOyZFQitQICAgICAgICAgICAgIDMKLU1EKCAgICAgICAwICYgICAgICYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgIyAgISAjICAgMCIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLU1AICAgJFRAICAkITwgICEgOCAgICFXQCAgID5IICAgKjYgICAgICAgICAgNSAgIC4yICAgITAgICAiICAKLU0gICAgLyAgIDAgICMgICAgQDwhQCAgJCAgICI9WFteQD9fX19fICQgICAiPVhbXkA/X19fXjAkICAgJj0KLU1YW15AP19fX11AJCAgICo9WFteQD9fX19cUCQgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAkIUkKLU0gICAgICAgICAgISBQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgMCYgICAgICAhICAgICAgIFgkICAgICAgIEAoICAgICE0JCAgICAgICBCRCAgICAhVCQKLU0gICAgICAgQkQgICAgIlFEICAgICAgIEJEICAgICU1RCAgICAgICBCRCAgICAlViAgICAgICAgICAgICAKLU0gJ14gICAgICAgICAgICAgICkmICAgICAgICAgICAgICArQiAgICAgICAgICAgICAgLSYgICAgICAgICAKLU0gICAgIC5eICAgICAgICAgICAgICAwViAgICAgICAgICAgICAgMj4gICAgICAgICAgICAgIDRGICAgICAKLU0gICAgICAgICA2UiAgICAgICAgICAgICAgOEYgICAgICAgICAgICAgIDo2ICAgICAgICAgICAgICA7PiAKLU0gICAgICAgICAgICAgPEogICAgICAgICAgICAgID4qICAgICAgICAgICAgICA+WiAgICAgICAgICAgICAKLU0gSEIgICAgICAgICAgICAgICAhJCAgIVkgICBCRCAgICAgISQgICFZICAgQkUgICAgICEkICAhWSAgIEIKLU1HICAgIFFIRCAgICAgICBCRCAgICAgISQgICFaICAgQkkgICAgICEkICAhWiAgIEJKICAgICAhJCAgIVoKLU0gICBCTCAgICBSREQgICAgICAgQkkgICAgICEkICAhWyAgIEJOICAgICAhJCAgIVsgICBCTyAgICAgISQKLU0gICFbICAgQlEgICAgVCBEICAgICAgIEJOICAgICAhJCAgIV0gICBCUyAgICAgISQgICFdICAgQlQgICAKLU0gICEkICAhXSAgIEJWICAgIFVERCAgICAgICBCUyAgICAgISQgICFeICAgQlggICAgICEkICAhXiAgIEIKLU1ZICAgICAhJCAgIV4gICBCWyAgICBWREQgICAgICAgQlggICAgICEkICAhXyAgIEJdICAgICAhJCAgIV8KLU0gICBCXiAgICAgISQgICFfICAgQyAgICAgWCBEICAgICAgIEJdICAgICAhJCAgIiEgICBDIiAgICAgISQKLU0gICIhICAgQyMgICAgICEkICAiISAgIEMlICAgIFlERCAgICAgICBDIiAgICAgISQgICIiICAgQycgICAKLU0gICEkICAiIiAgIEMoICAgICAhJCAgIiIgICBDKiAgICBaPEQgICAgICAgQycgICAgICEkICAiIyAgIEMKLU0sICAgICAhJCAgIiMgICBDLSAgICAgISQgICIjICAgQy8gICAgW1BEICAgICAgIEMsICAgICAhJCAgIiUKLU0gICBDMSAgICAgISQgICIlICAgQzIgICAgICEkICAiJSAgIEM0ICAgIF0sRCAgICAgICBDMSAgICAgISQKLU0gICImICAgQzYgICAgICEkICAiJiAgIEM3ICAgICAhJCAgIiYgICBDOSAgICBeKEQgICAgICAgQzYgICAKLU0gICEkICAiJyAgIEM7ICAgICAhJCAgIicgICBDPCAgICAgISQgICInICAgQz4gICAgX0BEICAgICAgIEMKLU07ICAgICAhJCAgIikgICBDQSAgICAgISQgICIpICAgQ0IgICAgICEkICAiKSAgIENFICAgISEgRCAgICAKLU0gICBDQSAgICAgISQgICIqICAgQ0cgICAgICEkICAiKiAgIENIICAgICAhJCAgIiogICBDSyAgICEiJEQKLU0gICAgICAgQ0cgICAhIy4gICAgICAgICAgICAgISleICAgICAgICAgICAgICEtXiAgICAgICAgICAgICAKLU0hMDogICAgICAgICAgICAgITIqICAgICAgICAgICAgICE0IiAgICAgICAgICAgICAhNVIgICAgICAgICAKLU0gICAgITZGICAgICAgICAgICAgICAgISQgICJSICAgQ04gICAgICEkICAiVSAgIENRICAgICAhJCAgIlYKLU0gICBDUyAgICAgISQgICJXICAgQ1YgICAgICEkICAiWSAgIENZICAgICAhJCAgIlogICBDXCAgICAgISQKLU0gICJbICAgQ18gICAgICEkICAiXSAgIEQiICAgICAhJCAgIl4gICBEJSAgICAgISQgICJfICAgRCggICAKLU0gICEkICAjISAgIEQrICAgICAhJCAgIyIgICBELiAgICAgISQgICMjICAgRDEgICAgICEkICAjJSAgIEQKLU00ICAgICAhJCAgIyYgICBEOCAgICAgISQgICMpICAgRDwgICAgICEkICAjKiAgIERAICAgICAhJCAgIysKLU0gICBERCAgICAgISQgICMtICAgREggICAgICEkICAjLiAgIERMICAgICAhJCAgIy8gICBEUCAgICAgISQKLU0gICMxICAgRFQgICAgICEkICAjMiAgIERYICAgICAhJCAgIzMgICBEXCAgICAgISQgICM1ICAgRSAgICAKLU0gICEkICAjNiAgIEUkICAgICAhJCAgIzcgICBFKCAgICAgISQgICM5ICAgRSwgICAgICEkICAjOiAgIEUKLU0wICAgICAhJCAgIzwgICBFNCAgICAgISQgICM9ICAgRTggICAgICEkICAjPiAgIEU8ICAgICAhJCAgI0AKLU0gICBFQCAgICAgISQgICNBICAgRUQgICAgICEkICAjQiAgIEVIICAgICAhJCAgI0QgICBFTCAgICAgISQKLU0gICNFICAgRVAgICAgICEkICAjRiAgIEVUICAgICAhJCAgI0ggICBFWCAgICAgISQgICNJICAgRVwgICAKLU0gICEkICAjSiAgIEYgICAgICAhJCAgI0wgICBGJCAgICAgISQgICNNICAgRiggICAgICEkICAjTyAgIEYKLU0sICAgICAhJCAgI1AgICBGLyAgICAgISQgICNRICAgRjIgICAgICEkICAjUiAgIEY1ICAgICAhJCAgI1QKLU0gICBGOCAgICAgISQgICNWICAgRjwgICAgICEkICAjVyAgIEZAICAgICAhJCAgI1cgICBGQCAgICE5OEQKLU0gICAgICAgQ04gICAhOVhAICAgICAgICAgICAgITpAQCAgICAgICAgICAgICE7SEAgICAgICAgICAgICAKLU0hPFhAICAgICAgICAgICAgIT1EQCAgICAgICAgICAgICE+TEAgICAgICAgICAgICAhP1xAICAgICAgICAKLU0gICAgIUBAQCAgICAgICAgICAgICFBQEAgICAgICAgICAgICAhQkhAICAgICAgICAgICAgIUMwQCAgICAKLU0gICAgICAgICFENEAgICAgICAgICAgICAhRUBAICAgICAgICAgICAgIUYwQCAgICAgICAgICAgICFHJEAKLU0gICAgICAgICAgICAhSFBAICAgICAgICAgICAgIUpcQCAgICAgICAgICAgICFNMEAgICAgICAgICAgICAKLU0hTyBAICAgICAgICAgICAgIVBEQCAgICAgICAgICAgICFSWEAgICAgICAgICAgICAhVEBAICAgICAgICAKLU0gICAgIVVcQCAgICAgICAgICAgICFYKEAgICAgICAgICAgICAhWVRAICAgICAgICAgICAgIVs0QCAgICAKLU0gICAgICAgICFdREAgICAgICAgICAgICAhXzhAICAgICAgICAgICAgIiEwQCAgICAgICAgICAgICIiSEAKLU0gICAgICAgICAgICAiJEBAICAgICAgICAgICAgIiZAQCAgICAgICAgICAgICInXEAgICAgICAgICAgICAKLU0iKUhAICAgICAgICAgICAgIitIQCAgICAgICAgICAgICIsXEAgICAgICAgICAgICAiLkBAICAgICAgICAKLU0gICAgIjA4QCAgICAgICAgICAgICIxUEAgICAgICAgICAgICAiMzhAICAgICAgICAgICAgIjU0QCAgICAKLU0gICAgICAgICI2VEAgICAgICAgICAgICAiODhAICAgICAgICAgICAgIjkwQCAgICAgICAgICAgICJCXEAKLU0gICAgICAgICAgICAiQ0xAICAgICAgICAgICAgIkxYQCAgICAgICAgICAgICJNREAgICAgICAgICAgICAKLU0iTjBAICAgICAgICAgICAgIlBAQCAgICAgICAgICAgICJRPEAgICAgICAgICAgICAiUzRAICAgICAgICAKLU0gICAgIlQsJCAgICAgICBGQiAgICJUUCQgICAgICAgRkIgICAiVUwmICAgICAgISBPICAgIlZJRCAgICAKLU0gICBGQiAgICJXVUQgICAgICAgRkIgICAiWEYgICAgICAgICAgICAgIlpOICAgICAgICAgICAgICJbViAKLU0gICAgICAgICAgICAiXjIgICAgICAgICAgICAgIl9WICAgICAgICAgICAgICMhTiAgICAgICAgICAgICAKLU0jI0YgICAgICAgICAgICAgIyUuICAgICAgICAgICAgICMnNiAgICAgICAgICAgICAjKUIgICAgICAgICAKLU0gICAgIys2ICAgICAgICAgICAgICMtJiAgICAgICAgICAgICAjLi4gICAgICAgICAgICAgIy86ICAgICAKLU0gICAgICAgICMwWiAgICAgICAgICAgICAjMUogICAgICAgICAgICAgIzZOICAgICAgICAgICAgICM3QiAKLU0gICAgICAgICAgICAjOCogICAgICAgICAgICAgIzhWICAgICAgICAgICAgICM7OiAgICAgICAgICAgICAKLU0jPVIgICAgICAgICAgICAgIz8kRCAgICAgICBGQiAgICNAPEAgICAgICAgICAgICAjQVhEICAgICAgIEcKLU0gICAgI0MwRCAgICAgICBHMyAgICNDXCQgICAgICAgRz4gICAjRDwkICAgICAgIEc+ICAgI0U5RCAgICAKLU0gICBHPiAgICNGRUQgICAgICAgRz4gICAjRzYgICAgICAgICAgICAgI0k+ICAgICAgICAgICAgICNKRiAKLU0gICAgICAgICAgICAjTSIgICAgICAgICAgICAgI05GICAgICAgICAgICAgICNQPiAgICAgICAgICAgICAKLU0jUjYgICAgICAgICAgICAgI1NeICAgICAgICAgICAgICNWJiAgICAgICAgICAgICAjWDIgICAgICAgICAKLU0gICAgI1omICAgICAgICAgICAgICNbViAgICAgICAgICAgICAjXF4gICAgICAgICAgICAgI14qICAgICAKLU0gICAgICAgICNfSiAgICAgICAgICAgICAkIDogICAgICAgICAgICAgJCU+ICAgICAgICAgICAgICQmMiAKLU0gICAgICAgICAgICAkJlogICAgICAgICAgICAgJCdGICAgICAgICAgICAgICQqKiAgICAgICAgICAgICAKLU0kLEIgICAgICAgICAgICAgJC1UQCAgICAgICAgICAgICQvJEAgICAgICAgICAgICAkMFhAICAgICAgICAKLU0gICAgJDIgJCAgICAgICBHPiAgICQyMUQgICAgICAgRz4gICAgICEkIC9fXyAgIEc+ICAgJDJMJSAgPiwKLU0gICBTTiAgICQzKCcgIDtBICAhIFIgICAkM0QpICA3LCAgISMqICAgJDNYJSAgNC4gICBAKCAgICQ0MCUKLU0gIC1eICAgQ04gICAkNEgnICA1UiAgISBIICAgJDUsJSAgI1MgICBDJyAgICQ2OCUgID5PICAgQyIgICAKLU0kNygpICA/LyAgISBSICAgJDdMJSAgKiMgICBCXSAgICQ5KCkgIDtUICAhIFQgICAkOkQpICAvWiAgISAKLU1WICAgJDwgKSAgPS8gICEgWCAgICQ9PCkgIDFJICAhIFogICAkPlgpICAqTiAgISBcICAgJD9YKSAgQTIKLU0gICEgXiAgICRAWCkgIDogICAhISAgICAkQVgpICAhLCAgISEiICAgJEJYKSAgIlkgICEhJCAgICRDWCkKLU0gID8mICAhISggICAkRDwpICA7KCAgISEqICAgJEUgKSAgPjogICEhLCAgICRFRCUgIDIzICAgQzYgICAKLU0kRlQlICA9TyAgIEJJICAgJEgkKSAgKCMgICEhLiAgICRJNCUgICMvICAgQzEgICAkSiglICAuSyAgIEIKLU1EICAgJEpcKSAgOz0gICEhMCAgICRLUCUgIDJGICAgRzMgICAkTDApICBCJCAgISEyICAgJE1QKSAgODQKLU0gICEhNCAgICRPMCkgIDRDICAhITYgICAkUFApICAzOSAgISE4ICAgJFFUKSAgK1YgICEhOiAgICRSWCkKLU0gIDhGICAhITwgICAkU1wpICAxRiAgISE+ICAgJFUgKSAgPEAgICEhQCAgICRVSCkgIDVLICAhIUIgICAKLU0kVjAlICAzJSAgIEMsICAgJFdEJSAgMVcgICBCWCAgICRYWCkgICJFICAhIUQgICAkWiwpICA5PSAgISEKLU1GICAgJFtAJSAgNEcgICBDQSAgICRcOCUgIDYtICAgQlMgICAkXTApICBBJCAgISFIICAgJF4oKSAgJlsKLU0gICEhSiAgICRfICkgID1TICAhIUwgICAkX1gpICA/IiAgISFOICAgJSE8KSAgMyggICEhUCAgICUjICkKLU0gID9QICAhIVIgICAlIzwpICArWCAgISFUICAgJSQoKSAgPSQgICEhViAgICUlMCkgICc6ICAhIVggICAKLU0lJjgpICAyPiAgISFaICAgJSZcKSAgPEsgICEhXCAgICUnSCkgIDxMICAhIiIgICAlKDQlICAuOSAgIEMKLU07ICAgJSlMJSAgOVUgICBCTiAgICUrJCkgIC8uICAhIiggICAlLDwpICAkKSAgISIqICAgJS1UKSAgIU0KLU0gICEiLCAgICUvLCkgIClXICAhIi4gICAlL1wpICA9JSAgISIwICAgJTA8JSAgMj0gICBDRyAgICUxOCkKLU0gIEFBICAhIjIgICAlMjQpICA3WiAgISI0ICAgJTMwKSAgP04gICEiNiAgICU0LCkgICctICAhIjggICAKLU0lNSgpICAqOSAgISI6ICAgJTYkKSAgPiUgICEiPCAgICU2RCkgID5MICAhIyAgICAlOCwpICA+WSAgISMKLU0iICAgJThMKSAgPSYgICEjJCAgICU5LCcgICo4ICAhIFAgICAlOjQpICA9USAgISMmICAgJTswKSAgKzMKLU0gICEjKCAgICU8LCUgIDlZICAgRyAgICAlPTglICA6KSAgIEZCICAgJT5EJyAgNkAgICEgTiAgICU/ST8KLU03VDE5M0QlLTI0LCA4VylULCJZTyAmPUQ4RlVFK0ZcIDlWLUMsRV1DO1ZVUDo2UUU5IlggK1ZBTzs2NE8KLU05VllVK1Y9RDhCXVc7VylLK1ZZRT1SXUQ5NzlPK1Y9RDhHMUU8VzBPPSMkUCtQIUc5JilNOTJZQyAmRU4KLU09I0lULDNVUiwzTE0sQyRULVMwWCxTOFQuI0xSLDMwVy0jQFMtQzBXLlAhQzomJVIuRzBSLzcoUi5TIFsKLU0sMyhXLlAhTDtWWUcoJkVOPSNJVCxTVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVy5QIVUKLU07Ry1JOVZZRTkiIUk7RzBaPSMwXTxDJFssI0xNLDNMIDsmXU45UiFVO0ctSTlWWUU5IiFJO0cwWj0jNF0KLU08QyRbLCNMTSwzTCA8VkFPPEcwQDo2WVQuRzBWLzcoUS5SVFMsQzxWLiNMUyxDPFYtU0wgOyZdTjlSIUwKLU07VllHKCZFTj0jSVQtU1VSLDNMUC5SVFEuUCFTOiZdUj0iIVU7Ry1JOVZZRTkiIUk7RzBaPSNAXTxDJFsKLU0sI0xWLTM0Uy0zTCA7Jl1OOVIhTDtWWUcoJzVOPFZFRztGNUQoJkVOPSNJVC4zVVIsM0xQLlJUUS5QIVMKLU06Nj1OOTYwQDhWQUE8Q0lULDMgXTxDJFsrMyRSLiNMUSxDPFsgJzVOPFZFRztGNUQoJi1IODcoWj0jJFEKLU0vNyhRLlMgWyxDNFUuUCFGOyZdQT0jSVQsMyhdPEMkWy0jTFAuUCFEO1c1QjsmNFo9IyRTLzcoUS5TQFsKLU0sI0wgOyZdTjlSIUQ7VzVCOyY0Wj0jJFQvNyhRLlNAWywjTCA9Rl1JOSNJVCwzNF0sMzQgPSVdUz0nKVUKLU04VzBaNSMkVi83LFItJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQjk3KFoKLU0tQlBRLUJQUS1DTVY3VkVOPSVdTTk2VUI5NyhaLDJQUyxCUFMsQ01WN1ZRTztGPT87NjVNOEY1Ui5DLEwKLU0tQzBMLFMoWz1FXUY7Jl1BPSVdTTk2VUI5NyhaLDMoTC4zOEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIKLU0uQyRTKyMkUi4iUFYtI0xbICcxPz02WUk7VlhaNSMkVy83NFg9RV1DOiYlUjdWVUU7NilFPENIUisjIEwKLU0uI01WN1ctSDtXKVQ3VlVFOzYpRTxDSFYrIyBMLDM4Wz1FXUk7RzE/OzY1TThGNVIuQyRMLCJQUyxDTVYKLU03VlFPO0Y9Pzs2NU04RjVSLkMsTCwiUFMsQ01WN1Y5TDtWJVQ3VlVFOzYpRTxDSFEsQlBQKyMsUi5XOT8KLU05Jl1VOEZRRTdWVUU7NilFPENIUSxSUFArIzhULlNMID1FXUM6JiVSN1Y5VTtGLFoxQyggPUVdUzo2PU4KLU05NjE/OFZBQTxFXUY9NllDLkQ4USwgIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzlHNU44U0kmLDMkID1FXVMKLU06Jl1SPSVdRj02WUMuRDhWICc5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsWjFDOCA9RV1VO0ctSTlWWUUKLU05JV1TOiZdUj0lXUY9NllDLkQ4WCAnOT86NllUN1Y5VTtGLFoxQyQgPUVdUzo2PU45NjE/OjZZVDdWOVUKLU07RixaMUMkID1FXVU7Ry1JOVZZRTklXUk7RzE/OUc1TjhTSSYtICFWN1ZRTztGPT85RzVOOFNJJixQIVYKLU03Vy1JOVZZRTklXUw7VllHN1Y5VTtGLFoxQywgPUVdVTtHLUk5VllFOSVdTDtWWUc3VjlVO0YsWjFDNCAKLU09RV1GOyZdQT0lXUY9NllDLkQ4USxAIVY3VjFPPTYpTDk1XUY9NllDLkQ4USxQIUw6NllLLkUwUS4jVVMKLU0sMzRSO0Y1WD0jSFEuM1RKLDNATCwiUFMsQ01MOjZZSzlHNU44U0hSLCNUSixDJF05QyRZKyMsUisjLFIKLU0uVy1UPTY5Ri5DKFIvNiVSLDNMUC5TIFssQyxdODcoUS5TIFssM0xSLSNVQTxDJFssI0xSLlMkVisjOFQKLU0rIyRRLTMoWy5QIVQ9NV1MOjZZSy5FMFItM1VVLDMwVDtGNVg9I0hRLjJQUCsjLFIuVlFJO0ZNRj02WUMKLU0uQyhQKyMgTCxTKFs8VzFVOUY4WixDKEwsIlBRLDM0Ui5TTCA4Vl1MO1cpUy5FMFItQ1VFPjY1TDsmXVcKLU0uQyBMPCc1UjwmUUUuQyRMPCZFTjpTSFIrI0wgOFYlUjxTSTQsQzxdOTYpTT1TSFArJyFPPEctQzomNFoKLU0sMlBbICYpTztWUUU4NlhaPSMoWC82NSYwNFEzMTNIUCslMTI1NDRaLDJQWyAmKVY4NlFTLkUwUi4zVUUKLU05RiVMPFY0WiwiUVQ8RzVFLkMkTC5QIUI7Vl1MOTYlTixDSVQsQ0QgOzZFUztXKUQ5NylFOSNJNCxTIF0KLU05NzFXO1NIUismXU45M0hRKydJRTxGXFosIlFUOicpRTkzSFMrI0wgOzYlSTtDSSYsMCFWN1YtSDg3KFoKLU0xUyggPUVdUzo2PU45NjE/OFZBQTxDSScsMyAgPUVdVTtHLUk5VllFOSVdQzomJVIuRDxRLDAhVjdXLUgKLU07VylULkQ8ViAnOT88VkVHO0Y1RDdXLUg7VylULkQ8ViAnOT89NllTOjY9Tjk2MT88VkFPPEcwWjFTQCAKLU09RV1JO0cwWjFTJCA9RV1TOjY9Tjk2MT86NllULkQ8USAnOT89NllTOjY9Tjk2MT86NllULkQ8VCAnOT8KLU07Jl1OOVNJJyxQIVY3Vy1JOVZZRTklXUw7VllHLkQ8UyAnOT89NllTOjY9Tjk2MT87Jl1OOVNJJy0wIVYKLU03VjlMO1YlVC5EPFEsQCFWN1YxTz02KUw5M0knLDMsID1FXUM6JiVSN1YlUjxGJVkuRDxTLDNVQTxDJFsKLU0sI0xRLlMoID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4zSScsUyhdODcoUS5TIFssM0xRLCAhVjdXNU4KLU08VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RFoxUyxTLzYlUiwzTFAuUyRbLDMkID1FXVM6Jl1SPSVdQTxHKUEKLU0+M0knLFMwXTg3KFEuUyBbLDNMViAnOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkuRDxTLSAhVjdXNU4KLU08VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkuRDxTLTNVQTxDJFssI0xRLlNAID1FXUk7RzE/ODcpUjg3RFoKLU0xUyxWLzYlUiwzTFAuUyRbLDAhVjdXLUk5VllFOSVdSTtHMT84NylSODdEWjFTLFYgJzk/PTZZUzo2PU4KLU05NjE/OjZZVDdWJVI8RiVZLkQ8Uy1TVUE8QyRbLCNMUS5TMCA9RV1MO1ZZRzdWJVI8RiVZLkQ8Uy4jVUEKLU08QyRbLCNMUS5TLCA9RV1TOjY9Tjk2MT87Jl1OOVVdQTxHKUE+M0knLFNAID1FXVU7Ry1JOVZZRTklXUwKLU07VllHN1YlUjxGJVkuRDxTLjNVQTxDJFssI0xRLlM0ID1FXUY7Jl1BPSVdQTxHKUE+M0knLSMgXTg3KFEKLU0uUyBbLDNMUSxAIVY3VjFPPTYpTDk1XUE8RylBPjNJJy0jJF04NyhRLlMgWywzTFEsUCFWN1YtSDg3KT8KLU08Jl1JO0cxRTxDSSctIyhdKkMoID1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIuRDxULFNUSiwzICAKLU09RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoWjFTMFQvMkhRLDAhVjdXLUg7VylUN1chTzo2WVQKLU05NyhaMVMwVS8ySFYgJzk/PFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoWjFTMFUgJzk/PTZZUzo2PU4KLU05NjE/PFZBTzxHMT88Jl1JO0cxRTxDSSctIzhdKkNAID1FXUk7RzE/PCZdSTtHMUU8Q0knLSM8XSpDJCAKLU09RV1TOjY9Tjk2MT86NllUN1chTzo2WVQ5NyhaMVMwVyAnOT89NllTOjY9Tjk2MT86NllUN1chTzo2WVQKLU05NyhaMVMwWC8ySFQgJzk/OyZdTjlVXVA7VkVOPSY1Ui5EPFQuM1RKLFAhVjdXLUk5VllFOSVdTDtWWUcKLU03VyFPOjZZVDk3KFoxUzBZICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIuRDxVLCNUSi0wIVYKLU03VjlMO1YlVDdXIU86NllUOTcoWjFTNFEvMkhRLEAhVjdWMU89NilMOTVdUDtWRU49JjVSLkQ8VSxDVEoKLU0sMywgPUVdUz0nKVU4VzBRLkQ8US1AIVY3Vy1UPEc1Qz0jKFoxUzRTLzcsUi0nOT84VkFBPEVdTTk2VUIKLU05NyhaLEJQUCsjQFs9RV1TOiZdUj0lXU05NlVCOTcoWi1CUFEtQlBRLUNNVjdWRU49JV1NOTZVQjk3KFoKLU0sMlBTLEJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSLkMsTC1DMEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFoKLU0sMyhMLjM4TCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1Ui5DJFMrIyRSLiJQVi0jTFsgJzk/PTZZSTtWWFoKLU0xUyRXICc5Pz02WUk7VlhSLkQ8VS0jVVUuJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVIKLU09JV1NOTZVQjk3KFotQlBQKyMkVi5XOT86NllUN1ZVRTs2KUU8Q0hRKyMgTCxTKFs9RV1MO1ZZRzdWVUUKLU07NilFPENIUysjIEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFosMyhMLCJQUyxDTVY3VjFPPTYpTDk1XU0KLU05NlVCOTcoWiwzLEwsIlBWLSNMWyAnLT87JkVOOlNJJywzRCA9NV1MOjZZSy5EPFItMCFQPEZFTTg3KVkKLU0uRDxVLTNVRTxGNUQuQyBMOVcpRTk2WFosMlFCOyc1RS5DKEwuUCFOO1ZZUDxGRU04NylZLkQ8Ui1AIUMKLU07JzVOOlY1Ui5EPFUtQ1VFOFZBRT1HRFosIlFGO1cpRC5DJEwuUCFTPCZdUj0nLUM4NyhaMVMoVyAlXT8KLU07NiVJO0JZTyAmPUM4Uyk/OFZdTTwmRUw5NjBOICVdSTtGRVQ6NiVMOjdJRTkiWFAgIl1HO0c0TzlWLUMKLU0rVj1DOFMoTzxXKUMrUCBOK1ZRSThGPUM4UyhOOFAhSTtHMFo9IyRdPEMkWyszKFEtIzxULiMsVi0jQFsKLU0sQyRULVMwWCxTOFQtU0wgOFZBQTxDSVQsQ1VSLENMUC5TJFItU0wgOyZdTjlSIUk7RzBaPSMsXTxDJFsKLU0rMyhRLSM8VC4jLFYtI0BbLEMkVC1TMFgsUzhULVNMID02WVM6Nj1OOTYwQDo2WVQuRzBULzcoUS5TIFsKLU0rMyRbICZRTztGPEA9NllTOjY9Tjk2MEA6NllULkcwVS83KFEuUyBbKzMkWyAnLUg7VylUKCZFTj0jSVQKLU0tQ1VSLDNMTSxTKFctQ0BbLFMoVy1DPFsgJlFPO0Y8QDsmXU45UiFJO0cwWj0jPF08QyRbLCNMTSwzTCAKLU08VkFPPEcwQD02WVM6Nj1OOTYwQDo2WVQuRzBYLzcoUS5TIFstQzRVLFM0WyAmUU87RjxAOyZdTjlSIVUKLU07Ry1JOVZZRTkiIUk7RzBaPSNEXTxDJFssI0xNLDNMIDxWRUc7RjVEKCYtSDg3KFo9IyRQLzcoUS5SVFEKLU0sQ0BbLDMoVy5QIVU7Ry1JOVZZRTkiIUM6JiVSLkcwUSwzVVIsM0xQLlMoVS0zTCA5RlFPODcwWj0jJFIKLU0vNyhRLlMwWywjTCA5Jl1VOEZRRS5HMFEsU1VSLDNMWC5TIFsgJlFPO0Y8QDkmXVU4RlFFLkcwUS0jVVIKLU0sM0xYLlMgWyAnOU86NjBaPSMkVS8zJFUgJylFOVVdQzsmJVM8U0k0LDM4XTk0WS83VSklMVUsWiwiUScKLU0xNFklNEQlLDdVKSUxVSxaLDJRJjQlXTIxND0zLkMoTDA0USw3VSklMVUsWixSUSwyNFU/NEQ1JzdULSwKLU0wNS0zMTUsWi0iUFsgJyFUPEYxSTlGOT89I0lULDAhUzo3SUU3VzBaPSMkID1WLUg4Nyk/PSNJVC4gIUwKLU07VllHOyZdTjlTSTQsMzxdPFNBSDo2PUguQyxMLCJQUyxDTUw7VzxaLFJQUyxCUFMsQ0xbICZRTztGPT8KLU07Jl1OOVNJVCwzQF09M0FTLkMkVysjIEwtQzBbOyZQWi1SUFArIzhULlNMIDlHNU44VV1QPScoWj0jJFkKLU0vMkhSLCNVRiwzNCA3VV1EO1VdRzsmXUI4NlE/OScxTzxHLFoxQyRVICVdRT4mRVQ3VjFVOzZVWTdXKUUKLU05Q0knLEMkXSpDJCA3VV1EO1VdRzsmXUI4NlE/OFcxTzxHLFoxQyRVICVdPzs2JUk7Q0kmLDM0IDdWNVgKLU06NzBOO1AhRzhWLFI3Vi1POzchSTsmNUQrQCBPOVZZVStWPUM4Ul1HOFYsUitXLVI4UlwgK0JdTDo2KUcKLU04VixSK0YsIDo2WVQuRzBRLzcoUS5SVFIsMzBXLSNAUy1DMFguUyhRLSM8VC4jLFYtIzxbICYtSDg3KFoKLU09IyhdPEMoWywjTFEsQzxbICZRTztGPEA6NllULkcwUy83KFEuUlRSLDMwVy0jQFMtQzBYLlMoUS0jPFQKLU0uIyxWLSM8WyAnNU48VkVHO0Y1RCgmRU49I0lULSNVUiwzTFAuUlRRLlAhTDtWWUcoJzVOPFZFRztGNUQKLU0oJkVOPSNJVC0zVVIsM0xQLlJUUS5QIVM6Jl1SPSIhSTtHMFo9IzhdPEMkWyszLFItUzhYLlMsUi1TOFcKLU0uUCFMO1ZZRygmUU87RjxAOjZZVC5HMFcvNyhRLlMgWyszJFsgJy1IO1cpVCgnNU48VkVHO0Y1RCgmRU4KLU09I0lULiNVUiwzTFAuUzhVLTMsVS5QIUw7VllHKCZRTztGPEA9NllTOjY9Tjk2MEA6NllULkcwWS83KFEKLU0uUyBbKzMkWyAnLUk5VllFOSIhQzomJVIuRzBRLCNVUiwzTE0sMyhYLlMkUi1TTCA9NllTOjY9Tjk2MEAKLU04VkFBPENJVCwzJF08QyRbLCNMUi0zNFsgJjlMO1YlVC5HMFEsQ1VSLDNMVC5TIFsgJjFPPTYpTDkzSVQKLU0sMyxdPEMkWy4jTFAuUCFMO1ZZRygmMU89NilMOTNJVCwzMF08QyRbLiNMUC5QIVY7VkVELkcwUS0zVFEKLU0tMCFSOTY9PzhWUUE8VyxaNSMkVi82NS4zVV0yMTQ9My5DIEwxVDUuMTUpITMlXTIxND0zLkMkTDFFIT8KLU00RDUnNFNIUiskJSwzJV0yMTQ9My5DLEwzJEUtN1UpJTFVXSMzJCUzNFQ1My5DMEwuUCFQPScpRDo2OUYKLU03VzBaPSMkIDxWRVo5NV1ULkcwUSAnPUM6JiVSN1cwWj0jQCA7Jl1OOVZRTztGPFo1IyRXLzcsWDomRUcKLU06I0hTKyMgTCxTKFs7Jl1XLkMsTCxTKEwsUyhbLlAhTDtWWUc3VlFPO0Y8Wj0jJFgvNzRYPFNIUS1SUFAKLU0rIzhULlZRTC5DPEwsIlBWLSNMWyAmOVU7Ri0/PCcxUi5HMFEuM1RKLEMgXTlDJFUgJV1FPiZFVDdWMVUKLU07NlVZN1YxRThWUFoxUyQgN1VdIzUkXTI3VFEpNFUxPzdTSScsQyRdODcoUS5TIFssM0xRLjAhPzdUMTQKLU0zVSk/MyRFMzUlXT8uRDxSLDAgTTsmPCA7JkVCOVJZUyAlXUU9JjVYPSAhPzk2MUE9JiQgN1Y1TjkgIVMKLU09JiVSPSAhPzs2JUk7QCE/OTZZVjo3KU87QCE/PUVdUzo2PU45NjE/OjZZVDdWOVU7RiwgN1c5Pzo2WVQKLU03VjlVO0YsIDdXIVI6NlVBPEdEIDdXOT89NllTOjY9Tjk2MT88VkFPPEcxPzlHNU44UCE/PUVdUzo2PU4KLU05NjE/OyZdTjlVXVA7VkVOPSY1UiAlXVY3Vy1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyggN1c5Pz02WVMKLU06Nj1OOTYxPzsmXU45VV1BPEcpQT4wIT89RV1VO0ctSTlWWUU5JV1DOiYlUjdWJVI8RiVZICVdVjdWUU8KLU07Rj0/PCZdSTtHMUU8QCE/PUVdQzomJVI3VyFPOjZZVDk3KCA3Vzk/PTZZUzo2PU45NjE/OjZZVCAlXVYKLU03Vy1JOVZZRTklXVM6Jl1SPSAhPz1FXUQ7VzVCOyY1Pzg3KVI4N0QgN1c5Pz02WUk7VlggN1c5PzlGUU8KLU04NzAgN1c5PzxWQU88RzAgN1c5PzxWRUc7RjVEN1ZRTztGPT85RzVOOFAhPz1FXVM6Nj1OOTYxPzhWQUEKLU08RV1GPTZZQyAlXVY3Vy1JOVZZRTklXUk7RzE/ODcpUjg3RCA3Vzk/OyZdTjlVXUY9NllDICVdVjdWLUgKLU04Nyk/OUc1TjhQIT89RV1JO0cxPzg3KVI4N0QgN1VdPzs2JUk7QCE/PUVdVTtHLUk5VllFOSVdSTtHMT8KLU08Jl1JO0cxRTxAIT89RV1TOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhPz1FXVU7Ry1JOVZZRTklXVMKLU06Jl1SPSVdQTxHKUE+MCE/PUVdVTtHLUk5VllFOSVdTDtWWUcgJV1WN1Y5TDtWJVQ3VyFPOjZZVDk3KCAKLU03Vzk/PFZBTzxHMT88Jl1JO0cxRTxAIT89RV1VO0ctSTlWWUU5JV1DOiYlUiAlXVY3VzVOOjZdTixAIT8KLU09RV1EO1c1QjsmNCA3Vzk/PTZZUzo2PU45NjE/OjZZVDdWOVU7RiwgN1c5PzxWRUc7RjVEN1ctSDtXKVQKLU03VjlVO0YsIDdXOT88VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA3Vzk/PFZFRztGNUQ3Vi1IODcpPzg3KVIKLU04N0QgN1c5PzlGUU84NzE/OUc1TjhQIT89RV1TOiZdUj0lXUY9NllDICVdVjdXLUk5VllFOSVdSTtHMCAKLU03Vzk/OyZdTjlVXUE8RylBPjAhPz1FXUM6JiVSN1YlUjxGJVkgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT8KLU08Jl1JO0cxRTxAIT89RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoIDdXOT86NllUICVdUzwmXVIKLU09Jy1DODcoIDdXOT85Jl1VOEZRRTdXIU86NllUOTcoIDdXOT89NllTOjY9Tjk2MT88VkFPPEcwIDdWLUwKLU09NllLOTcoIDdXOT88VzFSPTYtVCwwIT89RV1TPScpVThXMFIgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT8KLU05RzVOOFAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSN1Y5VTtGLCA3Vzk/PFZFRztGNUQ3VkVOPSVdUDtWRU4KLU09JjVSICVdVjdXNU48VkVHO0Y1RDdWRU49JV1BPEcpQT4wIT89RV1TOjY9Tjk2MT88VkFPPEcxPzg3KVIKLU04N0QgN1ZZTztHIVI6NlVBPEdEIDdXLT87JkVOOlAhPz1FXUQ7VzVCOyY1PzlHNU44UCE/PUVdUzo2PU4KLU05NjE/OyZdTjlQIT89RV1JO0cxPzwmXUk7RzFFPEAhPz1FXVM6Nj1OOTYxPzhWQUE8QCE/PUVdRjsmXUEKLU09JV1BPEcpQT4wIT89RV1TOiZdUj0lXUE8RylBPjAhPz01XUw6NllLICVdVjdXNU48VkVHO0Y1RDdXLUgKLU07VylUN1chTzo2WVQ5NyggN1c5PzsmXU45UCE/PUVdQzomJVIgJV0/OTdBST0lXUQ9NlVNPjVdRDk2LUwKLU0gJV0/N1QtNDNVKT8zJEUzNSVdPyAlXT83VDE0M1UpPzMkRTM1JV0/ICVdPzdWMU83Vj1MO1YpQTslXUMKLU09Jl1SPFAhPzdVXUQ7VV1HOyZdQjg2UT85JzFPPEcsIDdVXUU+JkVUN1YxVTs2VVk3VylFOUAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSggICAgICAgICAgICAKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcGFyYy1lbGYudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3BhcmMtZWxmLnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjBjMGYuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcGFyYy1lbGYudQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi1iZWdpbiA3Nzcgc3BhcmMtZWxmCi1NP1Q1LDFAJCIgMCAgICAgICAgICAgICAiICAoICAgICEgICQvJSAgICAjMCAgIzswICAgICAgIFQgIiAgCi1NITAgSCAhPCAkUCAgICA4ICAgIFQgICQgLSAgICAgICAgICJAICAgIEggICAgIDQgICAgICAgICAgUCAgCi1NIC0wICAgICAgICAgICAgICAhJCAgICAgICAgICEgICAgICAgICAgISAgICAtICAhICMwICAgICAgICAzCi1NPSAgICRXMCAgICAlICAkICAgICAgICQgICEuSCAgKDNKICAgICAgICAgI0wgICAiTSAgICAgPCAgMCAgCi1NICAgICBAICAlIFAgIEEwLCAgICAgICAgIChAICAgICAgICAgIVAgICAgIE89Ny1SK1ZRSThCXUw5IllTCi1NO1JYUSAgICAgICAgICUsICAgIUggICAgMlAgICAgICAgICAgICAgIC5AICAgJiggICAgVyAgICA1ICAgCi1NICAgICAgICAgICAgNFAgICAlXCAgICFEICAgIDQgICAgJCAgICAhKiAgICA1UCAgICM4ICAgICAgICAgCi1NMjAgICAjLCAgICBNICAgIC9QICAgJVggICAgICAgICAgICAgICI0ICAgIDwgICAgMFAgICAgICAgICExCi1NICAgICogICAgICAgICAhIiAgICAgICAgICIwICAgITsgICAgLCAgICAjJCAgICBSICAgIDFQICAgJDQgCi1NICAhLiAgICA4ICAgICAgICAgIEMgICAgK0AgICAlQCAgICAgICAgIC8wICAgICAgICAgICAgICAoICAgCi1NICQwICAgITwgICAgMiAgICAgICAgICAgICAgICsgICAgICAgICAhLyAgICAgICAgICAgICAgITYgICAgCi1NICAgICAmPCAgICE6ICAgIDYwICAgJjggICAgICAgICAuUCAgICAgICAgICAgICAgICAgICAlVCAgICAgCi1NICAgICtQICAgICAgICAhRSAgICAgICAgICAgICAgIUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkAgICAiRCAgICAgICAgICAgICAgICAgCi1NICAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQICAgICAgICAgICAgICAgICAgCi1NICI4ICAgIDsgICAgICAgICAhVCAgICAgICAgICAgICAgIUggICAgXiAgICAwMCAgICJMICAgIFUgICAgCi1NICAgICAgICAgICA3ICAgICAgICAgICAgICAgICAgICAgICAgICIoICAgICAgICAgICAgICAkUCAgICAgCi1NICAgICAgICAgJDggICAgWCAgICA0QCAgICMwICAgIS0gICAgICAgICAjUCAgICAgICAgICAgICAgICAgCi1NICAgRyAgICAgICAgICU0ICAgICAgICAgICAgICAhQCAgICA+ICAgICAgICAgICAgICAgWSAgICA4UCAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAkIFUgICAgICAjICAgISAgICAgICAhIC5AICAgICAgUCAgCi1NIEAgICAgICAgMC88ICAgICAgLCAgICwgICAgICAgJCo3ICAgICAgIyAgICQgICAgICAgISNNQCAgICAgCi1NIFAgICEwICAgICAgIDBbRCAgICAgICwgICA4ICAgICAgICQvIiAgICAgICMgICAnICAgICAgICEjUTAgCi1NICAgICBQICAiICAgICAgICAxLVAgICAgICAsICAgRCAgICAgICAkM0AgICAgICAjICAgKiAgICAgICAiCi1NJFpAICAgICAgUCAgIlAgICAgICAgQTAgICAgICAgLCAgIFAgICAgICAgKDQjICAgICAgIyAgIC0gICAgCi1NICAgIiUpQCAgICAgIFAgICNAICAgICAgICAgICAgICAgICwgICBcICAgICAgICAgICAgICAgICMgICAwCi1NICAgICAgICAgICAgICAgICBQICAkMCAgICAgICAgICAgICAgICAsICAhKCAgICAgICAgICAgICAgICAjCi1NICAgMyAgICAgICAgICAgICAgICAgUCAgJSAgICAgICAgICAgICAgICAgLCAgITQgICAgICAgICAgICAgCi1NICAgIyAgIDYgICAgIDAgIiUpQCAgICAoJDAgICNAICAgIEQgIDEtUCAgICAgISggICBEICAgIC8gICg0Ci1NSCAgICAgMDEgICAuICAgICVAICIlKkAgICAiMCQwICAjQCAgICFUICBBNFggICAgISEkICAgWCAgICBUCi1NICAoNS8gICAgIDAxICAgLiAgICAuQCAiJTQgICAgICEkMCAgI0AgICAkQCAgQTUkICAgICEhJCAgIFggCi1NICAhNiAgKDUyICAgICBAMSAgIC4gICAgN1AgIiU1ICAgICAoJDAgICNAICAgJzQgIEE1OCAgICAiISQgCi1NICBYICAgIiogICg1OCAgICAgMDEgICAuICAgIEdQICIlNjAgICAgJCQwICAjQCAgICo8ICBBNUggICAgCi1NISEkICAgWCAgICJUICAkMDkgICAgITAyICAgKCAgICBSMCAhI1hAICAgIDQkQCAgIiAgICAtNCAgQTVQCi1NICAgICIhJCAgIFggICAjPiAgKDU+ICAgICAwMSAgIC4gICAgWiAgIiU3UCAgICAiJDAgICNAICAgL1ggCi1NIEE1XiAgICAgQSQgICBYICAgJC8gICg1QCAgICAgQDEgICAuICAgIShQICEjUEAgICAgICRAICAhUCAgCi1NIDJEICBBNiggICAgIEEkICAgWCAgICRYICAkL1EgICAgITAyICAgKCAgICExMCAiJThQICAgICQkMCAgCi1NI0AgICA0VCAgQTYwICAgICBBJCAgIFggICAlOiAgKDVGICAgICFAMSAgIC4gICAhOSAgIiU7ICAgICA4Ci1NJDAgICNAICAgNlggIEE3KCAgICAhISQgICBYICAgJVUgICg1UyAgICAgMDEgICAuICAgIUEgICIlPSAgCi1NICAgJCQwICAjQCAgIDlQICAxITAgICAgJSEoICAgQCAgICZPICAoNVUgICAgIDAxICAgLiAgICFRQCAiCi1NJT1AICAgICIkMCAgI0AgICA8WCAgMF9MICAgICUhKCAgIEAgICAnRCAgKDQjICAgICAgMSAvX1EgICAhCi1NWzAgISQqQCAgICsoJEAgICIgICAgPyggIDEuICAgICAhISQgICBIICAgJ18gICQwRCAgICAhQDIgICAoCi1NICAgIiMwICIlPUggICAgIiQwICAjQCAgIEIkICAxIDQgICAgJSEoICAgQCAgIChTICAoNVcgICAgIDAxCi1NICAgLiAgICIwUCAiJT4gICAgICQkMCAgI0AgICBFKCAgQTdIICAgICQhJCAgIFggICApQSAgJC8lICAgCi1NICcwMiAgICggICAiOiAgIiUpMCAgICAgJDAjX1wwICAgRlwgIDEgSCAgICAlISggICBAICAgKiMgICg1Ci1NXiAgICAgQDEgICAuICAgIkNQICIlQCAgICAgJCQwICAjQCAgIEk8ICAxIVggICAgJiEoICAgQCAgICpECi1NICAkMC8gICAgITAyICAgKCAgICJMICAiJUAwICAgICgkMCAgI0AgICBMLCAgQTkwICAgICEiJCAgIFggCi1NICArKyAgKDYjICAgICAwMSAgIC4gICAiVyAgIiVBICAgICAkJDAgICNAICAgTyggIDBfOCAgICAlISggCi1NICBAICAgLCYgICg2JSAgICAgMDEgICAuICAgIyUwICIlQUAgICAgJCQwICAjQCAgIFJUICAwXlAgICAgCi1NJSEoICAgQCAgIC0iICAoNjcgICAgICAxIC9fUSAgICMxUCAiJUFQICAgICQkMCAgI0AgICBVWCAgQThACi1NICAgICEhJCAgIFggICAtTCAgKDYpICAgICAkMSAgIC4gICAjPyAgIiVCQCAgICAkJDAgICNAICAgWFAgCi1NIEE4TCAgICAhISQgICBYICAgLjwgICQzSiAgICAgIDEgL19RICAgI0hQICIlQyAgICAgKCQwICAjQCAgCi1NIFskICBBOFggICAgISEkICAgWCAgIC8mICAoNCAgICAgICAxIC9fUSAgICNXICAhJCAgICAgIDQkQCAgCi1NIiAgICBePCAgMF48ICAgICUhKCAgIEAgICAvWiAgKDYvICAgICAwMSAgIC4gICAkIiAgIiVEICAgICAhCi1NJDAgICNAICAhIFwgIEE5JCAgICAhISQgICBYICAgMDogICg2MiAgICAgQDEgICAuICAgJClQICIkXjAgCi1NICAgMCRAICAgICAgISJQICBBLzggICAgNiEoICAgICAgIDBTICAoM1wgICAgIEAyICAgICAgICQuMCAiCi1NJUUgICAgICQkMCAgI0AgICEkKCAgQTk0ICAgICEhJCAgIFggICAxOyAgKDY2ICAgICAwMSAgIC4gJzk/Ci1NPTZZSTtWWCA3VjlJO0ZEIDxVXUw6NllLICc1PzsmRU46UCFWN1ctSTlWWUU5JV1TOiZdUj0lXVA7VkVOCi1NPSY1UiAnOT86NllUICc5PzxWRUc7RjVEN1YtSDg3KCA9RV1JO0cxPzwmXUk7RzFFPEAhVjdWMU89NilMCi1NOTAhVjdXNU48VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA9RV1VO0ctSTlWWUU5JV1JO0cxPzg3KVI4N0QgCi1NPUVdUzo2PU45NjE/OjZZVDdXIU86NllUOTcoIDhWUVU7Rk1FPEAhVjdXLUk5VllFOSVdSTtHMCA9RV1VCi1NO0ctSTlWWUU5JV1MO1ZZRzdWOVU7RiwgPUVdQzomJVI3VjlVO0YsID1FXVU7RkVPO0MoIDxXIU88RzFTCi1NOFYlUiAnOT89NllTOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQgJzk/Ci1NPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgN1ZFTjo3MCA9RV1TOjY9Tjk2MT88VkFPPEcwID1FXVM6Jl1SCi1NPSVdRj02WUMgJzk/OUZRTzg3MCA9RV1DOiYlUjdWJVI8RiVZICc5PzxXMVI9Ni1ULDAhVjdXLVQ8RzVDCi1NPSMoID1FXUw7VllHICc5PzsmXU45VV1QO1ZFTj0mNVIgJzk/PTZZUzo2PU45NjE/OyZdTjlVXVA7VkVOCi1NPSY1UiAnOT88VkVHO0Y1RDdWUU87Rj0/OUc1TjhQIVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSCi1NICc5PzxWQU88RzAgPUVdVTtHLUk5VllFOSVdUzomXVI9JV1GPTZZQyAlXSQ2NFkhMzRFIyAmVUE6NlggCi1NN1ZRSThFXVY5NylTOjZdTiAnOT85Jl1VOEZRRTdWOVU7RiwgPUVdUzo2PU45NjE/OFZBQTxFXUE8RylBCi1NPjAhVjdXLUk5VllFOSVdSTtHMT85RzVOOFAhVjdXNU48VkVHO0Y1RDdWUU87RjwgPUVdVTtHLUk5VllFCi1NOSVdSTtHMCA9RV1EO1c1QjsmNT84NylSODdEIDdXLVQ4NylUICVdRTkmJVQ4MCFWN1c1TjxWRUc7RjVECi1NN1ZFTj0lXUY9NllDICc5Pzo2WVQ3ViVSPEYlWSAnIVI6NlVBPEdEID1FXUY7Jl1BPSVdRj02WUMgJzk/Ci1NOyZdTjlVXUY9NllDICc5PzxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhRTtHOUk8Rl1OICc5PzkmXVU4RlFFCi1NN1chTzo2WVQ5NyggPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UiAnOT88VkVHO0Y1RDdXLUg7VylUCi1NN1Y5VTtGLCA9RV1DOiYlUjdXIU86NllUOTcoID1FXVU7Ry1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyggCi1NPUVdVTtHLUk5VllFOSVdQzomJVI3VjlVO0YsIDdWNU45ICFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3ViVSCi1NPEYlWSAnOT88VkVHO0Y1RDdWUU87RjwgPUVdVTtHLUk5VllFOSVdQzomJVIgJzk/PFZBTzxHMT88Jl1JCi1NO0cxRTxAIVY3VjlMO1YlVDdXIU86NllUOTcoIDdWNVQ5N0FUICc5PzlGUU84NzE/ODcpUjg3RCA9RV1TCi1NOjY9Tjk2MT88VkFPPEcxPzg3KVI4N0QgN1Q9LDNUKSEzJV0vMUQ5MzE1MT81JCUiMyQ1PyAnOT86NllUCi1NN1Y5VTtGLCA9RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgJzk/PFZBTzxHMT84NylSODdEID1FXUM6JiVSCi1NICZZTztHIVI6NlVBPEdEID1FXUw7VllHN1YlUjxGJVkgJjVYOjcwIDg3MUU+JkVUICVdRT4mRVQgJV1FCi1NO0c5STxGXU4gJzk/PTZZUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxAIVY3Vy1JOVZZRTklXUw7VllHCi1NN1chTzo2WVQ5NyggOyZFQjhSWVM7UlhRICAgICBBOTAgICFFJFAgICAgICAgQS84ICAhQyUwICAgICAgCi1NIEEvRCAgIUIlMCAgICAgICBBL1AgICFEJTAgICAgIj1YW15AQDw/QCIoJ0ggICJcJCIgIFggLkAwKigjCi1NSCQyPChaIEBAKSAgIDAqICAgMjAkICAhMCAhISpAJCAgICAxICAhJEQhKEM8JCAgMDI4ISAgICA/X19fCi1NXCAkICAgIjAkICAwREEgICQ5NEwoICo0IEogJEUgMSAiQTwgICg2NiROKTBVIisgICQgICAkWCEgICAgCi1NMCAhISZQJCAgICEgICQkPCAwICAgKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQCi1NQCAgIUA8P0AiKCdIICAiPVhbXjBMISBAICMiICAgJiFRXiAoQD5AICApV0NPWSJQJCIgICwoICAgOCcnCi1NWCBCIVogICBHPi5fRCsgMCggIFBAICAhQDw/QCIoJ0ggICI9WFteMEwhIEAgIyIgICAmIVFeIChAPkAgCi1NIClXQ09ZIlAkIiAgLCggICA4JydYIEIhWiAgIEc+Ll9EKyAwKCAgUEAgICFAPD9AIignSCAgIj1YW14wCi1NTCEgQCAjIiAgICYhUV4gKEA+QCAgKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQCi1NQCAgIUA8P0AiKCdIICAiPVhbXjBMISBAICMiICAgJiFRXiAoQD5AICApV0NPWSAxICAhJFAwKENCIyIgCi1NICAmIVFeIChAPkAgIClXQ09ZIDEgICEkUDFIQ0QjIiAgICYhUV4gKEA+QCAgKVdDT1kgMSAgIiVQIkhCCi1NMCEkICAoNjIkIiAhVEJIQTAhJCAgKDYyJCIgIlRCSEIpISQgICg2MiQiICNUQyhBViEkICAoNjIkIiAkCi1NVEMoQUIhJCAgKDYyJCIgJVRDKEE/QSQgICg2MiQiICZUQihBLyEkICAoNjIkIiAnVEIoQTohJCAgKDYyCi1NJCIgKFRCKEFYISQgICg2MiQiIClUQihBUiEkICAoNjIkIiAqVEIoQighJCAgKDYyJCIgK1RCKEFXISQgCi1NICg0MyAgISRVIClDRi0wQig4UDEgICIlJFAgIDEtMDo4WiM0LkIlKCQwICBBMSwgICg3NCJGKSBVIkhBCi1NRCEkICAoNDMgICIlVSBJQTAtMEooPUgxICAiJSRQICBBPTAqOEIzNCpCJVwkMCAgQTEsICAoNzQkRic4Ci1NVSMoQi8hJCAgKDQzICAiJVUhKUFCLTBSKENAMSAgIiUkUCAgQT0wMjg3WzQsQig8JDAgIEExLCAgKDc0Ci1NIEYkXFUiKEFeISQgICg0MyAgIiVVIClBOi0wQihAMDEgICIlJFAgIEE9MCI4PiM0KEIlOCQwICBBMSwgCi1NICg3NCBGJyhVIihCMiEkICAoNDMgICIlVSApQigtMEIoOCAxICAiJSRQICBBPTAiOD1TNChCJTAkMCAgCi1NQTEsICAoNzQgRiYsVSIoQiwhJCAgKDQzICAiJVUhSUEyLTBaKD5AMSAgIiUlMCAgQTkoMkhEIzIoQig0Ci1NJDAgIEExNCAgKDYyJEolIFRCKEIkISQgICg0NSAgIiVEQSpCKS0oQihBQDEgICIlJTAgIEE5KDJIPUMyCi1NKEIoSCQwICBBMTQgICg2MiRKJihUQihBLiEkICAoNDUgICIlREEqQT9NKEIoRTAxICAiJSUwICBBOSgyCi1NSDNTMihCJSQkMCAgQTE0ICAoNjIkSiVIVEIoQTghJCAgKDQ1ICAiJURBKkFYLShCKD0wMSAgIiUlMCAgCi1NQTkoMkg8QzIoQicsJDAgIEExNCAgKDYyJEooQFRCKEI2ISQgICg0NSAgIiVEQSpBVy0oQig9IDEgICIlCi1NJTAgIEE5KDJIOFMyKEIoTCQwICBBMTQgICg2MiRKJShUQihCIyEkICAoNjIkIiAiVEIoQiAhJCAgKDYyCi1NJCIgIlRCKEIxISQgICg2MiQiICFUQihBPiEkICAoNjIkIiAhVEIoQTkhJCAgKDQzICAiJVUgKUBILTBCCi1NKCpAMSAgIiUkUCAgQT0wMjgpQzQsQiVQQDw/QCIoJ0ggICI9WFteQEA8P0AiKCdIICAgICAgICAgICAgCi1NIDAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMQCAgICAgICAhIDowICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgIyBQCi1NT19fUyAwICAgICwgICNQUE9fX1AgMCAgICAsICAkQFBPX19NIDAgICAgJCAgICAgIEEwLCAgICAgICAgCi1NICAgICAgICEgICAkPDAgICAgUCAgMFwoICAgICMwICEkVyAgICAgJCAgJCBaICAgICA0ICAwSTwgICAgCi1NIUAgISBdUCAgICAqICAgJD5QICAgIEwgICAgMCAgICAlMCAgICAgICAgICMgICgzSiAgICAgKCAgICBECi1NICAgICUgICAgIDwgICAgNyAgJC5ZICAgICA8ICAwWzggICAgIiAgICAjICAgICApICAgICMgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhICAgICAgICAgICAkIC9fUSAgICAgICAhCi1NIC0wICAgICAgUCAgIDAgICAgICAgMCNIICAgICAgLCAgICggICAgICAgJCNXICAgICAgIyAgICMgICAgCi1NICAgISJFUCAgICAgIFAgICEgICAgICAgIDBbOCAgICAgICwgICA0ICAgICAgICQuWSAgICAgICMgICAmCi1NICAgICAgICEjUEAgICAgICBQICAhUCAgICAgICAwXDQgICAgICAsICAgQCAgICAgICAkMzwgICAgICAjCi1NICAgKSAgICAgICAhJFggICAgICAgUCAgIkAgICAgICAgQS5IICAgICAgLCAgIEwgICAgICAgKDQgICAgCi1NICAgIyAgICwgICAgICAgIiUgUCAgICAgIFAgICMwICAgICAgIEEyOCAgICAgICwgICBYICAgICAgICAgCi1NICAgICAgICMgICAvICAgICAgICAgICAgICAgICBQICAkICAgICAgICAgICAgICAgICAsICAhJCAgICAgCi1NICAgICAgICAgICAjICAgMiAgICAgICAgICAgICAgICAgUCAgJFAgICAgICAgICAgICAgICAgLCAgITAgCi1NICAgICAgICAgICAgICAgIyAgIDUgICAgICAgICAgICAgICAgIFAgICVAICAgIDwgICAgICAgICAgIDAgCi1NX18kICAgIC4gICAgICAgICAgICQgL19RICAgICZAICAgICAgICAgICEgI19cMCAgICIoICAgICAgICAgCi1NICAwIF9fJCAgICBJICAoNEYgICAgIEAxICAgLiAgICAsMCAhJFcgICAgICAkQCAgIjAgICAjPCAgQTJACi1NICAgICEhJCAgIFggICAgXiAgKDRKICAgICkgMSAgIC4gICAgMTAgIiUzQCAgICAkJDAgICNAICAgJVAgCi1NIEE0XCAgICAhISQgICBYICAgIUIgICg1MCAgICAgJDEgICAuICAgIDwgICIlNDAgICAgJCQwICAjQCAgCi1NICdYICBBNSggICAgIiEkICAgWCAgICInICAoNTQgICAgIEAxICAgLiAgICBHMCAiJTVAICAgICgkMCAgCi1NI0AgICArKCAgQTVAICAgICEhJCAgIFggICAjJyAgKDU5ICAgICAwMSAgIC4gICAgU1AgIiU2QCAgICAkCi1NJDAgICNAICAgLVAgIDEhRCAgICAlISggICBAICAgI1EgICQvQiAgICAhMDIgICAoICAgIF8wICIlNyAgCi1NICAgKCQwICAjQCAgIDA4ICBBNVggICAgISEkICAgWCAgICQwICAoNT8gICAgICgxICAgLiAgICEpQCAiCi1NJTdYICAgICIkMCAgI0AgICAzPCAgQTYgICAgICIhJCAgIFggICAlKyAgJC8iICAgICAgMiAgICcgICAhCi1NNDAgIiU4QCAgICAiJDAgICNAICAgNiAgIDBfJCAgICAlISggICBAICAgJU0gICg1QyAgICAgMDEgICAuCi1NICAgIT0wICIlOSAgICAgIiQwICAjQCAgIDgoICBBNjggICAgJiEkICAgWCAgICYsICAoNUwgICAgIUAxCi1NICAgLiAgICFFQCAiJTxAICAgICQkMCAgI0AgICA5VCAgQTcsICAgICEhJCAgIFggICAmTCAgKDVUICAgCi1NICAwMSAgIC4gICAhUSAgISQlICAgICA0JEAgICIgICAgPTwgIEE3NCAgICAhISQgICBYICAgJ04gICg1Ci1NViAgICAgKDEgICAuICAgIV1AICEjXlAgICAgNCRAICAiICAgIEBQICBBMCwgICAgICEkIF9fJCAgICg1Ci1NICAkMEogICAgTEAyICAgKCAgICImQCAhJFggICAgICQkMCAgIkAgICBCPCAgMSIwICAgICYhKCAgIEAgCi1NICAoVSAgKDVWQCAgICAoMSAgIC4gICAiMjAgISQhMCAgICA0JEAgICIgICAgRUwgIEE3PCAgICAhISQgCi1NICBYICAgKUsgICg1WCAgICAgMDEgICAuICAgIj5AICIlPkAgICAgMCQwICAjQCAgIEhEICAwXDQgICAgCi1NPSEoICAgQCAgICowICAoNEUgICAgICAxIC9fUSAgICJFUCAhJCJAICAgIDQkQCAgIiAgICBKTCAgQTdYCi1NICAgICIhJCAgIFggICAqVyAgKDYgICAgICAwMSAgIC4gICAiT1AgISQnQCAgICA4JEAgICIgICAgTFAgCi1NIDEgXCAgICAlISggICBAICAgKzggICg2ISAgICAgQDEgICAuICAgIlpQICIlRSAgICAgJCgwICAjQCAgCi1NIE8sICBBOCwgICAgISEkICAgWCAgICwkICAoNiQgICAgIDAxICAgLiAgICMmQCAhI11AICAgIDQkQCAgCi1NIiAgICBSWCAgQTg0ICAgICEhJCAgIFggICAsXSAgKDYmICAgICAwMSAgIC4gICAjNTAgISNbICAgICA0Ci1NJEAgICIgICAgVkggIEE5PCAgICAgISQgX18kICAgLU8gICg2JyAgICAgMDEgICAuICAgI0FAICIlQiAgCi1NICAgJCQwICAjQCAgIFkwICBBOEQgICAgIDEkICAgWCAgIC5EICAoNiogICAgIDAxICAgLiAgICNNICAiCi1NJUJQICAgICQkMCAgI0AgICBcMCAgMS5IICAgICAhJCBfXyQgICAvKyAgKDYsICAgICBAMSAgIC4gICAjCi1NVjAgIiVDQCAgICAkJDAgICNAICAgXlggIEEwICAgICAgISQgX18kICAgMCQgICQwICAgICAhMDIgICAoCi1NICAgJCNQICEjWVAgICAgNCRAICAiICAgISIoICBBOFwgICAgISEkICAgWCAgIDBQICAoNjAgICAgICQxCi1NICAgLiAgICQtUCAiJUQwICAgICQkMCAgI0AgICEkKCAgQTkoICAgICIhJCAgIFggICAxLyAgKDNZICAgCi1NICEgMiAgICAgICAkNSAgIiRdQCAgICE4JEAgICAgICAhJUwgIEEvUCAgICAiISggICAgICAgMUEgICg2Ci1NNCAgICAgMDEgICAuICAgJDpAICIlRTAgICAgJCQwICAjQCAgISgsICBBOTggICAgISEkICAgWCA5VjFCCi1NOzY0IDhXKVQ6MllTICc5QTsnNUU8UlU4ODJZQyAmPUQ4RlVFK0YsIDhXKVQ7QllTICc5Pz02WUk7VlggCi1NN1Y5STtGRCA8VV1MOjZZSyAnNT87JkVOOlAhVjdXLUk5VllFOSVdUzomXVI9JV1QO1ZFTj0mNVIgJzk/Ci1NOjZZVCAnOT88VkVHO0Y1RDdWLUg4NyggPUVdSTtHMT88Jl1JO0cxRTxAIVY3VjFPPTYpTDkwIVY3VzVOCi1NPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgPUVdVTtHLUk5VllFOSVdSTtHMT84NylSODdEID1FXVM6Nj1OCi1NOTYxPzo2WVQ3VyFPOjZZVDk3KCA4VlFVO0ZNRTxAIVY3Vy1JOVZZRTklXUk7RzAgPUVdVTtHLUk5VllFCi1NOSVdTDtWWUc3VjlVO0YsID1FXUM6JiVSN1Y5VTtGLCA9RV1VO0ZFTztDKCA8VyFPPEcxUzhWJVIgJzk/Ci1NPTZZUzo2PU45NjE/OFZBQTxFXUE8RylBPjAhVjdXNU48VkVHO0Y1RDdXLUg7VylUICc5PzxWRUc7RjVECi1NN1ZRTztGPT84NylSODdEIDdWRU46NzAgPUVdUzo2PU45NjE/PFZBTzxHMCA9RV1TOiZdUj0lXUY9NllDCi1NICc5PzlGUU84NzAgPUVdQzomJVI3ViVSPEYlWSAnOT88VzFSPTYtVCwwIVY3Vy1UPEc1Qz0jKCA9RV1MCi1NO1ZZRyAnOT87Jl1OOVVdUDtWRU49JjVSICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgJzk/Ci1NPFZFRztGNUQ3VlFPO0Y9PzlHNU44UCFWN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAnOT88VkFPCi1NPEcwID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdRj02WUMgJV0kNjRZITM0RSMgJlVBOjZYIDdWUUk4RV1WCi1NOTcpUzo2XU4gJzk/OSZdVThGUUU3VjlVO0YsID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVY3Vy1JCi1NOVZZRTklXUk7RzE/OUc1TjhQIVY3VzVOPFZFRztGNUQ3VlFPO0Y8ID1FXVU7Ry1JOVZZRTklXUk7RzAgCi1NPUVdRDtXNUI7JjU/ODcpUjg3RCA3Vy1UODcpVCAlXUU5JiVUODAhVjdXNU48VkVHO0Y1RDdWRU49JV1GCi1NPTZZQyAnOT86NllUN1YlUjxGJVkgJyFSOjZVQTxHRCA9RV1GOyZdQT0lXUY9NllDICc5PzsmXU45VV1GCi1NPTZZQyAnOT88VkVHO0Y1RDdWRU49JV1BPEcpQT4wIUU7RzlJPEZdTiAnOT85Jl1VOEZRRTdXIU86NllUCi1NOTcoID1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgCi1NPUVdQzomJVI3VyFPOjZZVDk3KCA9RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoID1FXVU7Ry1JCi1NOVZZRTklXUM6JiVSN1Y5VTtGLCA3VjVOOSAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJzk/Ci1NPFZFRztGNUQ3VlFPO0Y8ID1FXVU7Ry1JOVZZRTklXUM6JiVSICc5PzxWQU88RzE/PCZdSTtHMUU8QCFWCi1NN1Y5TDtWJVQ3VyFPOjZZVDk3KCA3VjVUOTdBVCAnOT85RlFPODcxPzg3KVI4N0QgPUVdUzo2PU45NjE/Ci1NPFZBTzxHMT84NylSODdEIDdUPSwzVCkhMyVdLzFEOTMxNTE/NSQlIjMkNT8gJzk/OjZZVDdWOVU7RiwgCi1NPUVdUzo2PU45NjE/OFZBQTxFXUY9NllDICc5PzxWQU88RzE/ODcpUjg3RCA9RV1DOiYlUiAmWU87RyFSCi1NOjZVQTxHRCA9RV1MO1ZZRzdWJVI8RiVZICY1WDo3MCA4NzFFPiZFVCAlXUU+JkVUICVdRTtHOUk8Rl1OCi1NICc5Pz02WVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8QCFWN1ctSTlWWUU5JV1MO1ZZRzdXIU86NllUCi1NOTcoICAnOUE7JzVFPFJVODgyWUMgIl1EOjc5RStXKUU7JjVBPFY0TzhCVVM+Ny1JOUZFWCtXNVM8Ql1TCi1NPEYsTzsmRUIrVlFJOEYsTyAnIU88RzBPOVY1TitXOUE7JzVFPFJVODgyWUMgICAgNicwQC5SITYvMyhOCi1NLCAhTTg2RU4gJV1MOjYpPz1GNVI8VkVPO0AgTz0mVVAgIl1VPFcoTzhWLVMrVlFJOEJdVjg2UVU5NyxNCi1NNiYkTjtQICA5VjFCOzY0TjhQIE89JlVQK1AhRzkmKU05MllDICY9QzhTKT84Vl1NPCZFTDk2ME4gJkVOCi1NPSNJVCwzVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVy5QIUM6JiVSLkcwUi83KFIuUyBbCi1NLDMoVy5QIUw7VllHKCZFTj0jSVQsU1VSLDNMTSxDJFQtUzBYLFM4VC4jTFIsMzBXLSNAUy1DMFcuUCFVCi1NO0ctSTlWWUU5IiFJO0cwWj0jMF08QyRbLCNMTSwzTCA7Jl1OOVIhVTtHLUk5VllFOSIhSTtHMFo9IzRdCi1NPEMkWywjTE0sM0wgPFZBTzxHMEA6NllULkcwVi83KFEuUlRTLEM8Vi4jTFMsQzxWLVNMIDsmXU45UiFMCi1NO1ZZRygmRU49I0lULVNVUiwzTFAuUlRRLlAhUzomXVI9IiFVO0ctSTlWWUU5IiFJO0cwWj0jQF08QyRbCi1NLCNMVi0zNFMtM0wgOyZdTjlSIUw7VllHKCc1TjxWRUc7RjVEKCZFTj0jSVQuM1VSLDNMUC5SVFEuUCFTCi1NOjY9Tjk2MEA4VkFBPENJVCwzIF08QyRbKzMkUi4jTFEsQzxbICc1TjxWRUc7RjVEKCYtSDg3KFo9IyRRCi1NLzcoUS5TIFssQzRVLlAhRjsmXUE9I0lULDMoXTxDJFstI0xQLlAhRDtXNUI7JjRaPSMkUy83KFEuU0BbCi1NLCNMIDsmXU45UiFEO1c1QjsmNFo9IyRULzcoUS5TQFssI0wgPUZdSTkjSVQsMzRdLDM0ID0lXVM9JylVCi1NOFcwWjUjJFYvNyxSLSc5PzhWQUE8RV1NOTZVQjk3KFosQlBQKyNAWz1FXVM6Jl1SPSVdTTk2VUI5NyhaCi1NLUJQUS1CUFEtQ01WN1ZFTj0lXU05NlVCOTcoWiwyUFMsQlBTLENNVjdWUU87Rj0/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/OyZFTjpTSScsM0QgPTVdTDo2WUsuRDxSLTAhUDxGRU04NylZCi1NLkQ8VS0zVUU8RjVELkMgTDlXKUU5NlhaLDJRQjsnNUUuQyhMLlAhTjtWWVA8RkVNODcpWS5EPFItQCFDCi1NOyc1TjpWNVIuRDxVLUNVRThWQUU9R0RaLCJRRjtXKUQuQyRMLlAhUzwmXVI9Jy1DODcoWjFTKFcgICBOCi1NOjZZVDk3KVAgIllIODctSCAiWUQ+NllTPjZUICtGMVk7Ry1UPEAgTjxGNUw4MllCPFcsICtHKUU7JiROCi1NPCZRVCAiWUk7RkVUICJZVDk3QVQgIllGOjZZSSAiWVI7VjFBPSYkICtHIUw9ICBOOVZdVCAiWUQ+NllBCi1NOzZFQyAiWUI8VywgK0ctWTs3MUE4QCBOPFcxUj0mJUIgIllTPSYlQitGRU45JjVYPFcxUiAiWVM9JiVCCi1NPFcxUiAiWVM6Jy1UPEcxQThAIE44Vl1NOzY1Tj0gIE48VzFBOEJZSTtGMUU+ICBOPFcxQThAICA4NyxaCi1NKCQsQDEmNVY5NlFPPCZVRTtHMEA0VjVUKCIgSDBUMTMqMiEzNCQlMjBWXU08JkVMOTcpUygjKE4sIiBRCi1NLiIhLTg3REAsM0RZLEBIICAmJVMuQiEjKCQxRT1GNUw7VyFNOTZZVCglLUU9IiBAKiQtJDRSREA0VSEhCi1NNEQtTzs3IUk7JjVSPFIgUitDIEAsM0BAMzYlWSgjJFkuMygqICAhICoiLEk0VzVOM1UsQC0yWFAoJjlDCi1NPFJYQCgkSVU7RjRALDNEWSxAICA4NyxaKCQsQDEmNVY5NlFPPCZVRTtHMEA0VjVUKCIgSDBUMTMqMiEzCi1NNCQlMjBWXU08JkVMOTcpUygjKE4sIiBRLiIhLTg3REAsM0RZLEBIIDFULSMuQiBIMVRZNSoyIUM+Nj1OCi1NPTcsTSxCWFArQyggICYlUy5CISMoJDFFPUY1TDtXIU05NllUKCUtRT0iIEAqJC0kNFJEQDRVISE0RC1PCi1NOzchSTsmNVI8UiBSK0MgQCwzQEAzNiVZKCMkWS4zKCogJlFELkIgSDRUPTUqMiEzPTZZLzRSXTM1RShUCi1NKCJBLDJSVFErQyBJICAgICAgICAgICQgICAgJyAgICBCMCAgICBVRCAgICAgICAgICAgICAjPUQgICAjCi1NICAgICAgICAgJkxYICAgICAgICAgICAgICcgWCAgICAgICAgICAgICAkWFwgICAgKkE9NiFAICAgJURKCi1NICAgICAgICAgICAgICVYQCAgICAgICAgICAgICAgJCAgICJcICAgKyMgICAgIEVEICAgICAgJC9CICAgCi1NICBdRCAgICAgICQvQiAgICAhPFwgICAgICAgICAgICAgIjogICAgICAgICAgICAgICRCICAgICAgICAgCi1NICAgICAlSiAgICAgICAgICAgICAgKCYgICAgICAgICAgICAgIClKICAgICAgICAgICAgICArQiAgICAgCi1NICAgICAgICAgLTogICAgICAgICAgICAgIC8iICAgICAgICAgICAgICAxKiAgICAgICAgICAgICAgMzYgCi1NICAgICAgICAgICAgIDUqICAgICAgICAgICAgICA2WiAgICAgICAgICAgICAgOCIgICAgICAgICAgICAgCi1NIDkuICAgICAgICAgICAgICA6TiAgICAgICAgICAgICAgOz4gICAgICAgICAgICAgIEUmICAgICAgICAgCi1NICAgICBOLEQgICAgICAkL0IgICAgICEkICAhWSAgICAgICAgICAhJCAgIVkgICAgISAgICAgISQgICFZCi1NICAgICMgICAgTyhEICAgICAgJC9HICAgICAhJCAgIVogICAgICAgICAgISQgICFaICAgICEgICAgICEkCi1NICAhWiAgICAjICAgIFBERCAgICAgICQvTCAgICAgISQgICFbICAgICAgICAgICEkICAhWyAgICAhICAgCi1NICAhJCAgIVsgICAgIyAgICBSKEQgICAgICAkL1EgICAgICEkICAhXSAgICAgICAgICAhJCAgIV0gICAgCi1NISAgICAgISQgICFdICAgICMgICAgUyhEICAgICAgJC9WICAgICAhJCAgIV4gICAgICAgICAgISQgICFeCi1NICAgICEgICAgICEkICAhXiAgICAjICAgIFRERCAgICAgICQvWyAgICAgISQgICFfICAgICAgICAgICEkCi1NICAhXyAgICAhICAgICAhJCAgIV8gICAgIyAgICBWKEQgICAgICAkMCAgICAgICEkICAiISAgICAgICAgCi1NICAhJCAgIiEgICAgISAgICAgISQgICIhICAgICMgICAgVyBEICAgICAgJDAlICAgICAhJCAgIiIgICAgCi1NICAgICAgISQgICIiICAgICEgICAgICEkICAiIiAgICAjICAgIFg0RCAgICAgICQwKiAgICAgISQgICIjCi1NICAgICAgICAgICEkICAiIyAgICAhICAgICAhJCAgIiMgICAgIyAgICBZUEQgICAgICAkMC8gICAgICEkCi1NICAiJSAgICAgICAgICAhJCAgIiUgICAgISAgICAgISQgICIlICAgICMgICAgWkxEICAgICAgJDA0ICAgCi1NICAhJCAgIiYgICAgICAgICAgISQgICImICAgICEgICAgICEkICAiJiAgICAjICAgIFwkRCAgICAgICQwCi1NOSAgICAgISQgICInICAgICAgICAgICEkICAiJyAgICAhICAgICAhJCAgIicgICAgIyAgICBdREQgICAgCi1NICAkMD4gICAgICEkICAiKSAgICAgICAgICAhJCAgIikgICAgISAgICAgISQgICIpICAgICQgICAgXkhECi1NICAgICAgJDBEICAgICAhJCAgIiogICAgICAgICAgISQgICIqICAgICEgICAgICEkICAiKiAgICAkICAgCi1NIF9SICAgICAgICAgICAgICEmQiAgICAgICAgICAgICAhKkIgICAgICAgICAgICAgISxeICAgICAgICAgCi1NICAgICEuTiAgICAgICAgICAgICAhMEYgICAgICAgICAgICAgITI2ICAgICAgICAgICAgICEzKiAgICAgCi1NICAgICAgICAhNVxEICAgICAgJDBKICAgICAhJCAgIlIgICAgICAgICAgISQgICJVICAgICEgICAgICEkCi1NICAiViAgICAjICAgICAhJCAgIlcgICAgJiAgICAgISQgICJZICAgICkgICAgICEkICAiWiAgICAsICAgCi1NICAhJCAgIlsgICAgLyAgICAgISQgICJdICAgIDIgICAgICEkICAiXiAgICA1ICAgICAhJCAgIl8gICAgCi1NOCAgICAgISQgICMhICAgIDsgICAgICEkICAjIiAgICA+ICAgICAhJCAgIyMgICAgQSAgICAgISQgICMlCi1NICAgIEQgICAgICEkICAjJiAgICBIICAgICAhJCAgIykgICAgTCAgICAgISQgICMqICAgIFAgICAgICEkCi1NICAjKyAgICBUICAgICAhJCAgIy0gICAgWCAgICAgISQgICMuICAgIFwgICAgICEkICAjLyAgICEgICAgCi1NICAhJCAgIzEgICAhJCAgICAgISQgICMyICAgISggICAgICEkICAjMyAgICEsICAgICAhJCAgIzUgICAhCi1NMCAgICAgISQgICM2ICAgITQgICAgICEkICAjNyAgICE4ICAgICAhJCAgIzkgICAhPCAgICAgISQgICM6Ci1NICAgIUAgICAgICEkICAjPCAgICFEICAgICAhJCAgIz0gICAhSCAgICAgISQgICM+ICAgIUwgICAgICEkCi1NICAjQCAgICFQICAgICAhJCAgI0EgICAhVCAgICAgISQgICNCICAgIVggICAgICEkICAjRCAgICFcICAgCi1NICAhJCAgI0UgICAiICAgICAgISQgICNGICAgIiQgICAgICEkICAjSCAgICIoICAgICAhJCAgI0kgICAiCi1NLCAgICAgISQgICNKICAgIjAgICAgICEkICAjTCAgICI0ICAgICAhJCAgI00gICAiOCAgICAgISQgICNPCi1NICAgIjwgICAgICEkICAjUCAgICI/ICAgICAhJCAgI1EgICAiQiAgICAgISQgICNSICAgIkUgICAgICEkCi1NICAjVCAgICJIICAgICAhJCAgI1YgICAiTCAgICAgISQgICNXICAgIlAgICAgICEkICAjVyAgICJQICAgCi1NITY8QCAgICAgICAgICAgICE3JEAgICAgICAgICAgICAhOCxAICAgICAgICAgICAgITk8QCAgICAgICAgCi1NICAgICE6KEAgICAgICAgICAgICAhOzBAICAgICAgICAgICAgITxAQCAgICAgICAgICAgICE9JEAgICAgCi1NICAgICAgICAhPiRAICAgICAgICAgICAgIT8sQCAgICAgICAgICAgICE/VEAgICAgICAgICAgICAhQFhACi1NICAgICAgICAgICAgIUIkQCAgICAgICAgICAgICFCVEAgICAgICAgICAgICAhQ0hAICAgICAgICAgICAgCi1NIUU0QCAgICAgICAgICAgICFHQEAgICAgICAgICAgICAhSVRAICAgICAgICAgICAgIUtEQCAgICAgICAgCi1NICAgICFNKEAgICAgICAgICAgICAhTzxAICAgICAgICAgICAgIVEkQCAgICAgICAgICAgICFSQEAgICAgCi1NICAgICAgICAhVExAICAgICAgICAgICAgIVY4QCAgICAgICAgICAgICFXWEAgICAgICAgICAgICAhWihACi1NICAgICAgICAgICAgIVtcQCAgICAgICAgICAgICFdVEAgICAgICAgICAgICAhXyxAICAgICAgICAgICAgCi1NIiEkQCAgICAgICAgICAgICIjJEAgICAgICAgICAgICAiJEBAICAgICAgICAgICAgIiYsQCAgICAgICAgCi1NICAgICIoLEAgICAgICAgICAgICAiKUBAICAgICAgICAgICAgIiskQCAgICAgICAgICAgICIsXEAgICAgCi1NICAgICAgICAiLjRAICAgICAgICAgICAgIi9cQCAgICAgICAgICAgICIxWEAgICAgICAgICAgICAiMzhACi1NICAgICAgICAgICAgIjRcQCAgICAgICAgICAgICI1VEAgICAgICAgICAgICAiP0BAICAgICAgICAgICAgCi1NIkAwQCAgICAgICAgICAgICJJPEAgICAgICAgICAgICAiSihAICAgICAgICAgICAgIkpUQCAgICAgICAgCi1NICAgICJNJEAgICAgICAgICAgICAiTiBAICAgICAgICAgICAgIk9YQCAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhICAgICAwICAgICggCi1NIDAjNCAgICBVICAgICEkICAgICAgICAgICAgICAgJCAgICAgICAgICIwICAgIDQgICAgIiAgJCBaICAgCi1NIC5AICAgK1QgICAgIFAgICAgICAgICAkICAgICEgICAgIFwgICAgKyAgICAgQCAhIF1QICAgLzwgICAmCi1NQCAgICAgMCAgICA3ICAgICEgICAgISAgICAgNyAgICAgUCAgICAoICAwSTwgICAqNyAgICEnTCAgICAgCi1NICAgICAgICAgICQgICAgICAgICAnUCAgICAwICAgICIgICQuViAgICNNQCAgICAsICAgICBQICAgIFggCi1NICAgJCAgICAjICAgICJEICAgICQgICAgIEAgISNOMCAgIFtEICAgICkgICAgICwgICAgKyAgICAhICAgCi1NICBQICAgIFMgICAgIDAgICAgOCAgMFwoICAgLyIgICAgIFAgICAgICAgICAgICAgICAwICAgICAgICAgCi1NLjAgICAgJCAgICAmICAkLyUgICAjUTAgICAxPCAgICAgICAgICAgICAgICQgICAgICAgICAjXCAgICAhCi1NICAgICFAICEkVyAgICEtUCAgICAjICAgICAgICAgICAgICAgISAgICAgICAgICElICAgICAwICAgICggCi1NIDEuICAgIDNAICAgICJAICAgICAgICAgICAgICAgQCAgICAgICAgIDMwICAgICQgICAgJyAgKDNKICAgCi1NJFpAICAgITggICAgICAgICAgICAgICAkICAgICEgICAgJSggICAgISAgICAgUCAiJSAgICAhMCAgICAgCi1NIyAgICAgICAgICAgICAgICEgICAgIDAgICAhNyAgICAhQCAgICAsICBBMCwgICA0IyAgICAoQCAgICAkCi1NICAgICAgICAgIDAgICAgKCAgICA4ICAgICBAICAgICMgICg0RiAgICUpQCAgICckICAgICAgICAgICAgCi1NICAgKCAgICAgICAgICY0ICAgICIgICAgICAgICAgICAgITI4ICAgJlQgICAgISAgICAgPCAgICAhICAgCi1NICEgICAgIU0gICAgIFAgICAgICAgICAgICAgOzogICAhKUQgICAgICAgICAgICAgICAkICAgICAgICAgCi1NPTAgICAgLCAgICAgICAgICAgICAoICQgICAiKSAgICAgICAgICAgICAgICEgICAgICAgICAoMCAgICAjCi1NICAgICAgICAgICAgICIiKiAgICsjICAgICAgICAgICAgICAgIDAgICAgICAgICItICAgICBQICAgICAgCi1NICAgICAgIEtFQCAgICsoICAgICAgICAgICAgICAgJCAgICAgICAgIEVQICAgICQgICAgICAgICAgICAgCi1NKyRAICAgJSkgICAgICAgICAgICAgICAhICAgICAgICAgKiAgICAgISAgICAgICAgICAgICAiVjQgICAgCi1NOCAgICAgICAgICAgICAgICEgICAgIFAgICAiTCAgICAgMCAgICAgICAgICAgICBNXSAgICItUCAgICAgCi0sICAgICAgICAgIDAgICAgLAotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdHVpL01ha2VmaWxlIGIvZ2RiL3R1aS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4OWM2ZS4uMDAwMDAwMAotLS0gYS9nZGIvdHVpL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5pbiBieSBjb25maWd1cmUuCi0jIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLWFsbDogbGlidHVpLmEKLQotc3JjZGlyPS4KLQotU0hFTEwgPSAvYmluL3NoCi0KLUNDPWdjYwotQ0ZMQUdTPS1nIC1PMgotQVI9YXIKLVJBTkxJQj1yYW5saWIKLQotIyBIb3N0IGFuZCB0YXJnZXQtZGVwZW5kZW50IG1ha2VmaWxlIGZyYWdtZW50cyBjb21lIGluIGhlcmUuCi0KLSMgSG9zdDogU3VuIDQgb3IgU3BhcmNzdGF0aW9uLCBydW5uaW5nIFN1bk9TIDQKLVhERVBGSUxFUz0gc2VyLXRjcC5vCi1YTV9GSUxFPSB4bS1zdW40b3M0LmgKLU5BVF9GSUxFPSBubS1zdW40b3M0LmgKLU5BVERFUEZJTEVTPSBmb3JrLWNoaWxkLm8gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGNvcmVsb3cubyBzcGFyYy1uYXQubwotSE9TVF9JUEM9LURCU0RfSVBDCi1HREJTRVJWRVJfREVQRklMRVM9IGxvdy1zcGFyYy5vCi0jIFNldHRpbmcgWE1fQ0xJQlM9LWxyZXNvbHYgd291bGQgbGV0IHVzIHVzZSB0aGUgRE5TLCBidXQgdGhhdCB3b3VsZCBzY3JldwotIyBhbnlvbmUgd2hvIHdhbnRzIHRvIHVzZSBOSVMsIHdoaWNoIGluY2x1ZGVzIGF0IGxlYXN0IG9uZSBDeWdudXMgY3VzdG9tZXIKLSMgKFBSIDM1OTMpLiAgU28gbGVhdmUgaXQgdGhpcyB3YXkgdW50aWwvdW5sZXNzIHdlIGZpbmQgYSByZXNvbHZlciB3aGljaCBjYW4KLSMgZ2V0IG5hbWVzIGZyb20gZWl0aGVyIEROUyBvciBOSVMgZnJvbSB0aGUgc2FtZSBHREIgYmluYXJ5LgotCi0jIFRhcmdldDogU3VuIDQgb3IgU3BhcmNzdGF0aW9uLCBydW5uaW5nIFN1bk9TIDQKLVRERVBGSUxFUz0gc3BhcmMtdGRlcC5vIHNvbGliLm8KLVRNX0ZJTEU9IHRtLXN1bjRvczQuaAotIyBFbmQgb2YgaG9zdCBhbmQgdGFyZ2V0LWRlcGVuZGVudCBtYWtlZmlsZSBmcmFnbWVudHMKLQotIyBXaGVyZSBpcyBvdXIgImluY2x1ZGUiIGRpcmVjdG9yeT8gIFR5cGljYWxseSAkKHNyY2RpcikvLi4vaW5jbHVkZS4KLSMgVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgaGVhZGVyIGZpbGUgZGlyZWN0b3J5IGZvciB0aGUgbGlicmFyeQotIyByb3V0aW5lcyBpbiBsaWJpYmVydHkuCi1JTkNMVURFX0RJUiA9ICAkKHNyY2RpcikvLi4vLi4vaW5jbHVkZQotSU5DTFVERV9DRkxBR1MgPSAtSSQoSU5DTFVERV9ESVIpCi0KLSMgQ29uZmlndXJlZCBieSB0aGUgLS13aXRoLW1tYWxsb2Mgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLU1NQUxMT0MgPSAKLU1NQUxMT0NfQ0ZMQUdTID0gCi0KLSMgV2hlcmUgaXMgdGhlIEJGRCBsaWJyYXJ5PyAgVHlwaWNhbGx5IGluIC4uL2JmZC4KLUJGRF9ESVIgPSAuLi8uLi9iZmQKLUJGRF9TUkMgPSAkKHNyY2RpcikvJChCRkRfRElSKQotQkZEX0NGTEFHUyA9IC1JJChCRkRfRElSKSAtSSQoQkZEX1NSQykKLQotIyBXaGVyZSBpcyB0aGUgUkVBRExJTkUgbGlicmFyeT8gIFR5cGljYWxseSBpbiAuLi9yZWFkbGluZS4KLVJFQURMSU5FX0RJUiA9IC4uLy4uL3JlYWRsaW5lCi1SRUFETElORV9TUkMgPSAkKHNyY2RpcikvJChSRUFETElORV9ESVIpCi1SRUFETElORV9DRkxBR1MgPSAtSSQoUkVBRExJTkVfU1JDKQotCi0jIFdoZXJlIGlzIHRoZSBJTlRMIGxpYnJhcnk/ICBUeXBpY2FsbHkgaW4gLi4vaW50bC4KLUlOVExfRElSID0gLi4vLi4vaW50bAotSU5UTF9TUkMgPSAkKHNyY2RpcikvJChJTlRMX0RJUikKLUlOVExfQ0ZMQUdTID0gLUkkKElOVExfRElSKSAtSSQoSU5UTF9TUkMpCi0KLSMgV2hlcmUgaXMgdGhlIFRDTCBsaWJyYXJ5PyAgVHlwaWNhbGx5IGluIC4uL3RjbC4KLVRDTF9DRkxBR1MgPSBAVENMSERJUkAKLQotIyBXaGVyZSBpcyB0aGUgVEsgbGlicmFyeT8gIFR5cGljYWxseSBpbiAuLi90ay4KLVRLX0NGTEFHUyA9IEBUS0hESVJAIEBUS19CVUlMRF9JTkNMVURFU0AKLQotIyBXaGVyZSBpcyBJdGNsPyAgVHlwaWNhbGx5IGluIC4uL2l0Y2wuCi1JVENMX0NGTEFHUyA9IEBJVENMSERJUkAKLQotIyBXaGVyZSBpcyBUaXg/ICBUeXBpY2FsbHkgaW4gLi4vdGl4LgotVElYX0NGTEFHUyA9IEBUSVhIRElSQAotCi1YMTFfQ0ZMQUdTID0gQFRLX1hJTkNMVURFU0AKLQotRU5BQkxFX0lERT0gQEVOQUJMRV9JREVACi0KLUdVSV9DRkxBR1NfWCA9IC1JJChzcmNkaXIpLy4uLy4uL2xpYmd1aS9zcmMKLQotSURFX0NGTEFHU19YID0gLUkkKHNyY2RpcikvLi4vLi4vbGliaWRldGNsL3NyYyAtSSQoc3JjZGlyKS8uLi8uLi9saWJpZGUvc3JjIFwKLSAgYGlmIFsgeCIkKEVOQUJMRV9JREUpIiAhPSB4IF0gOyB0aGVuIFwKLSAgICBlY2hvIC1ESURFIC1JJChzcmNkaXIpLy4uLy4uL2lsdS9ydW50aW1lL21haW5sb29wO1wKLSAgZmlgCi0KLUlERV9DRkxBR1M9JChHVUlfQ0ZMQUdTX1gpICQoSURFX0NGTEFHU19YKQotCi1FTkFCTEVfQ0ZMQUdTPSAKLQotIyAtSS4gZm9yIGNvbmZpZyBmaWxlcy4KLSMgLUkkKHNyY2RpcikgZm9yIGdkYiBpbnRlcm5hbCBoZWFkZXJzIGFuZCBwb3NzaWJseSBmb3IgZ251LXJlZ2V4LmggYWxzby4KLSMgLUkkKHNyY2RpcikvY29uZmlnIGZvciBtb3JlIGdlbmVyaWMgY29uZmlnIGZpbGVzLgotCi0jIEl0IGlzIGFsc28gcG9zc2libGUgdGhhdCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCAtSS91c3IvaW5jbHVkZS9zeXMgaWYKLSMgeW91ciBzeXN0ZW0gZG9lc24ndCBoYXZlIGZjbnRsLmggaW4gL3Vzci9pbmNsdWRlICh3aGljaCBpcyB3aGVyZSBpdAotIyBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIFBvc2l4KS4KLURFRlMgPSAtREhBVkVfQ09ORklHX0gKLUdEQl9DRkxBR1MgPSAtSS4gLUkuLiAtSSQoc3JjZGlyKSAtSSQoc3JjZGlyKS8uLiAtSSQoc3JjZGlyKS8uLi9jb25maWcgJChERUZTKQotCi0jIE17SCxUfV9DRkxBR1MsIGlmIGRlZmluZWQsIGhhdmUgaG9zdC0gYW5kIHRhcmdldC1kZXBlbmRlbnQgQ0ZMQUdTCi0jIGZyb20gdGhlIGNvbmZpZyBkaXJlY3RvcnkuCi1HTE9CQUxfQ0ZMQUdTID0gJChNVF9DRkxBR1MpICQoTUhfQ0ZMQUdTKQotI1BST0ZJTEVfQ0ZMQUdTID0gLXBnCi0KLSMgSU5URVJOQUxfQ0ZMQUdTIGlzIHRoZSBhZ2dyZWdhdGUgb2YgYWxsIG90aGVyICpDRkxBR1MgbWFjcm9zLgotSU5URVJOQUxfQ0ZMQUdTID0gJChDRkxBR1MpICQoR0xPQkFMX0NGTEFHUykgJChQUk9GSUxFX0NGTEFHUykgXAotCSQoR0RCX0NGTEFHUykgJChSRUFETElORV9DRkxBR1MpICQoQkZEX0NGTEFHUykgXAotCSQoTU1BTExPQ19DRkxBR1MpICQoSU5DTFVERV9DRkxBR1MpICQoSU5UTF9DRkxBR1MpIFwKLQkkKEVOQUJMRV9DRkxBR1MpCi0KLUhFQURFUlMgPSB0dWlJTy5oIHR1aURhdGEuaCB0dWlHZW5lcmFsV2luLmggdHVpTGF5b3V0LmggdHVpU3RhY2suaCBcCi0JICB0dWlTb3VyY2UuaCB0dWlDb21tYW5kLmggdHVpV2luLmggdHVpRGlzYXNzZW0uaCBcCi0JICB0dWlTb3VyY2VXaW4uaCB0dWlSZWdzLmggdHVpRGF0YVdpbi5oCi0KLVNPVVJDRVMgPSB0dWkuYyB0dWlEYXRhLmMgdHVpU291cmNlLmMgdHVpU3RhY2suYyB0dWlJTy5jIFwKLQkgIHR1aUdlbmVyYWxXaW4uYyB0dWlMYXlvdXQuYyB0dWlXaW4uYyB0dWlDb21tYW5kLmMgXAotCSAgdHVpRGlzYXNzZW0uYyB0dWlTb3VyY2VXaW4uYyB0dWlSZWdzLmMgdHVpRGF0YVdpbi5jCi0KLU9CSkVDVFMgPSB0dWkubyB0dWlEYXRhLm8gdHVpU291cmNlLm8gdHVpU3RhY2subyB0dWlJTy5vIFwKLQkgIHR1aUdlbmVyYWxXaW4ubyB0dWlMYXlvdXQubyB0dWlXaW4ubyB0dWlDb21tYW5kLm8gXAotCSAgdHVpRGlzYXNzZW0ubyB0dWlTb3VyY2VXaW4ubyB0dWlSZWdzLm8gdHVpRGF0YVdpbi5vIFwKLQkgIHR1aUluaXQubwotCi0KLSMgUHJldmVudCBTdW4gbWFrZSBmcm9tIHB1dHRpbmcgaW4gdGhlIG1hY2hpbmUgdHlwZS4gIFNldHRpbmcKLSMgVEFSR0VUX0FSQ0ggdG8gbm90aGluZyB3b3JrcyBmb3IgU3VuT1MgMywgNC4wLCBidXQgbm90IGZvciA0LjEuCi0uYy5vOgotCSQoQ0MpIC1jICQoSU5URVJOQUxfQ0ZMQUdTKSAkPAotLlNVRkZJWEVTOiAuY3BwCi0uYy5jcHA6Ci0JJChDQykgLUUgJChJTlRFUk5BTF9DRkxBR1MpICQ8ID4gJEAKLQotbGlidHVpLmE6ICQoT0JKRUNUUykKLQlybSAtZiBsaWJ0dWkuYQotCSQoQVIpIHJjIGxpYnR1aS5hICQoT0JKRUNUUykKLQkkKFJBTkxJQikgbGlidHVpLmEKLQotdHVpLm86IHR1aS5jIHR1aS5oIHR1aURhdGEuaCB0dWlMYXlvdXQuaCB0dWlJTy5oIHR1aVJlZ3MuaCB0dWlXaW4uaAotdHVpQ29tbWFuZC5vOiB0dWkuaCB0dWlEYXRhLmggdHVpV2luLmggdHVpSU8uaAotdHVpRGF0YS5vOiB0dWkuaCB0dWlEYXRhLmgKLXR1aURhdGFXaW4ubzogdHVpLmggdHVpRGF0YS5oIHR1aVJlZ3MuaAotdHVpRGlzYXNzZW0ubzogdHVpLmggdHVpRGF0YS5oIHR1aUxheW91dC5oIHR1aVNvdXJjZVdpbi5oIHR1aVN0YWNrLmgKLXR1aUdlbmVyYWxXaW4ubzogdHVpLmggdHVpRGF0YS5oIHR1aUdlbmVyYWxXaW4uaAotdHVpSU8ubzogdHVpLmggdHVpRGF0YS5oIHR1aUlPLmggdHVpQ29tbWFuZC5oIHR1aVdpbi5oCi10dWlMYXlvdXQubzogdHVpLmggdHVpRGF0YS5oIHR1aUdlbmVyYWxXaW4uaCB0dWlTdGFjay5oIHR1aVJlZ3MuaCBcCi0JdHVpRGlzYXNzZW0uaAotdHVpUmVncy5vOiB0dWkuaCB0dWlEYXRhLmggdHVpTGF5b3V0LmggdHVpV2luLmgKLXR1aVNvdXJjZS5vOiB0dWkuaCB0dWlEYXRhLmggdHVpU3RhY2suaCB0dWlTb3VyY2VXaW4uaCB0dWlTb3VyY2UuaAotdHVpU291cmNlV2luLm86IHR1aS5oIHR1aURhdGEuaCB0dWlTdGFjay5oIHR1aVNvdXJjZVdpbi5oIHR1aVNvdXJjZS5oIFwKLQl0dWlEaXNhc3NlbS5oCi10dWlTdGFjay5vOiB0dWkuaCB0dWlEYXRhLmggdHVpU3RhY2suaCB0dWlTb3VyY2VXaW4uaAotdHVpV2luLm86IHR1aS5oIHR1aURhdGEuaCB0dWlHZW5lcmFsV2luLmggdHVpU3RhY2suaCB0dWlTb3VyY2VXaW4uaCBcCi0JdHVpRGF0YVdpbi5oCi0KLXR1aUluaXQubzogdHVpSW5pdC5jCi10dWlJbml0LmM6ICQoU09VUkNFUykKLQlAZWNobyBNYWtpbmcgdHVpSW5pdC5jCi0JQHJtIC1mIGluaXQuYy10bXAKLQlAZWNobyAnLyogRG8gbm90IG1vZGlmeSB0aGlzIGZpbGUuICAqLycgPmluaXQuYy10bXAKLQlAZWNobyAnLyogSXQgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBNYWtlZmlsZS4JKi8nPj5pbml0LmMtdG1wCi0JQGVjaG8gJyNpbmNsdWRlICJhbnNpZGVjbC5oIicgPj5pbml0LmMtdG1wCi0JQGVjaG8gJ2V4dGVybiB2b2lkIGluaXRpYWxpemVfdHVpX2ZpbGVzIFBBUkFNUyAoKHZvaWQpKTsnID4+aW5pdC5jLXRtcAotCUBlY2hvICd2b2lkIGluaXRpYWxpemVfdHVpX2ZpbGVzIFBBUkFNUyAoKHZvaWQpKSB7JyA+PmluaXQuYy10bXAKLQlALSggY2QgJChzcmNkaXIpIDsgZ3JlcCAnXl9pbml0aWFsaXplX1thLXpfMC05QS1aXSogKignICQoU09VUkNFUykgKSAyPi9kZXYvbnVsbCBcCi0JfCBzZWQgLWUgJ3MvXi4qOi8vJyAtZSAncy9eXChbYS16XzAtOUEtWl0qXCkuKi8gIHtleHRlcm4gdm9pZCBcMSBQQVJBTVMgKCh2b2lkKSk7IFwxICgpO30vJyA+PmluaXQuYy10bXAKLQlAZWNobyAnfScgPj5pbml0LmMtdG1wCi0JQG12IGluaXQuYy10bXAgdHVpSW5pdC5jCi0KLWNsZWFuOgotCXJtIC1mICoubyAqLmEKZGlmZiAtLWdpdCBhL2dkYi93aW5kb3dzLW5hdC5jIGIvZ2RiL3dpbmRvd3MtbmF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NWVjNmQuLjAwMDAwMDAKLS0tIGEvZ2RiL3dpbmRvd3MtbmF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjk0ICswLDAgQEAKLS8qIFRhcmdldC12ZWN0b3Igb3BlcmF0aW9ucyBmb3IgY29udHJvbGxpbmcgd2luMzIgY2hpbGQgcHJvY2Vzc2VzLCBmb3IgR0RCLgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmUgbnRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICovCi0KLS8qIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCBzYWNAY3lnbnVzLmNvbSAqLwotCi0vKiBXZSBhc3N1bWUgd2UncmUgYmVpbmcgYnVpbHQgd2l0aCBhbmQgd2lsbCBiZSB1c2VkIGZvciBjeWd3aW4uICAqLwotCi0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgImZyYW1lLmgiCQkvKiByZXF1aXJlZCBieSBpbmZlcmlvci5oICovCi0jaW5jbHVkZSAiaW5mZXJpb3IuaCIKLSNpbmNsdWRlICJ0YXJnZXQuaCIKLSNpbmNsdWRlICJ3YWl0LmgiCi0jaW5jbHVkZSAiZ2RiY29yZS5oIgotI2luY2x1ZGUgImNvbW1hbmQuaCIKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaWZkZWYgX01TQ19WRVIKLSNpbmNsdWRlICJ3aW5kZWZzLmgiCi0jZWxzZSAvKiBvdGhlciBXSU4zMiBjb21waWxlciAqLwotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxpbWFnZWhscC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJidWlsZHN5bS5oIgotI2luY2x1ZGUgInN5bWZpbGUuaCIKLSNpbmNsdWRlICJvYmpmaWxlcy5oIgotI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKLSNpbmNsdWRlICJnZGJ0aHJlYWQuaCIKLSNpbmNsdWRlICJnZGJjbWQuaCIKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotLyogVGhlIHVpJ3MgZXZlbnQgbG9vcC4gKi8KLWV4dGVybiBpbnQgKCp1aV9sb29wX2hvb2spIFBBUkFNUyAoKGludCBzaWdubykpOwotCi0vKiBJZiB3ZSdyZSBub3QgdXNpbmcgdGhlIG9sZCBDeWd3aW4gaGVhZGVyIGZpbGUgc2V0LCBkZWZpbmUgdGhlCi0gICBmb2xsb3dpbmcgd2hpY2ggbmV2ZXIgc2hvdWxkIGhhdmUgYmVlbiBpbiB0aGUgZ2VuZXJpYyBXaW4zMiBBUEkKLSAgIGhlYWRlcnMgaW4gdGhlIGZpcnN0IHBsYWNlIHNpbmNlIHRoZXkgd2VyZSBvdXIgb3duIGludmVudGlvbi4uLiAqLwotI2lmbmRlZiBfR05VX0hfV0lORE9XU19ICi0jZGVmaW5lIEZMQUdfVFJBQ0VfQklUIDB4MTAwCi0jZGVmaW5lIENPTlRFWFRfREVCVUdHRVIgKENPTlRFWFRfRlVMTCB8IENPTlRFWFRfRkxPQVRJTkdfUE9JTlQpCi0jZW5kaWYKLQotLyogVGhlIHN0cmluZyBzZW50IGJ5IGN5Z3dpbiB3aGVuIGl0IHByb2Nlc3NlcyBhIHNpZ25hbC4KLSAgIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBpbiBhIGN5Z3dpbiBpbmNsdWRlIGZpbGUuICovCi0jZGVmaW5lIENZR1dJTl9TSUdOQUxfU1RSSU5HICJjeWd3aW46IHNpZ25hbCIKLQotI2RlZmluZSBDSEVDSyh4KSAJY2hlY2sgKHgsIF9fRklMRV9fLF9fTElORV9fKQotI2RlZmluZSBERUJVR19FWEVDKHgpCWlmIChkZWJ1Z19leGVjKQkJcHJpbnRmIHgKLSNkZWZpbmUgREVCVUdfRVZFTlRTKHgpCWlmIChkZWJ1Z19ldmVudHMpCXByaW50ZiB4Ci0jZGVmaW5lIERFQlVHX01FTSh4KQlpZiAoZGVidWdfbWVtb3J5KQlwcmludGYgeAotI2RlZmluZSBERUJVR19FWENFUFQoeCkJaWYgKGRlYnVnX2V4Y2VwdGlvbnMpCXByaW50ZiB4Ci0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KLWV4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBjaGlsZF9vcHM7Ci0KLXN0YXRpYyB2b2lkIGNoaWxkX3N0b3AgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCB3aW4zMl9jaGlsZF90aHJlYWRfYWxpdmUgUEFSQU1TICgoaW50KSk7Ci12b2lkIGNoaWxkX2tpbGxfaW5mZXJpb3IgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUaHJlYWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIHVzZWQgdG8gdHJhY2sgaW5mb3JtYXRpb24gdGhhdCBpcwotICAgbm90IGF2YWlsYWJsZSBpbiBnZGIncyB0aHJlYWQgc3RydWN0dXJlLiAqLwotdHlwZWRlZiBzdHJ1Y3QgdGhyZWFkX2luZm9fc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3QgdGhyZWFkX2luZm9fc3RydWN0ICpuZXh0OwotICAgIERXT1JEIGlkOwotICAgIEhBTkRMRSBoOwotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IHN1c3BlbmRfY291bnQ7Ci0gICAgQ09OVEVYVCBjb250ZXh0OwotICAgIFNUQUNLRlJBTUUgc2Y7Ci0gIH0gdGhyZWFkX2luZm87Ci0KLXN0YXRpYyB0aHJlYWRfaW5mbyB0aHJlYWRfaGVhZCA9IHtOVUxMfTsKLQotLyogVGhlIHNhdmVkIHN0YXRlIGZvciBhIGNvbnRpbnVlIGFmdGVyIGJyZWFraW5nIGJhY2sgdG8gZ2RiLiAqLwotc3RhdGljIERXT1JEIGNvbnRpbnVlX3N0YXR1czsKLQotLyogVGhlIHByb2Nlc3MgYW5kIHRocmVhZCBoYW5kbGVzIGZvciB0aGUgYWJvdmUgY29udGV4dC4gKi8KLQotc3RhdGljIERFQlVHX0VWRU5UIGN1cnJlbnRfZXZlbnQ7CS8qIFRoZSBjdXJyZW50IGRlYnVnIGV2ZW50IGZyb20KLQkJCQkJICAgV2FpdEZvckRlYnVnRXZlbnQgKi8KLXN0YXRpYyBIQU5ETEUgY3VycmVudF9wcm9jZXNzX2hhbmRsZTsJLyogQ3VycmVudGx5IGV4ZWN1dGluZyBwcm9jZXNzICovCi1zdGF0aWMgdGhyZWFkX2luZm8gKmN1cnJlbnRfdGhyZWFkOwkvKiBJbmZvIG9uIGN1cnJlbnRseSBzZWxlY3RlZCB0aHJlYWQgKi8KLXN0YXRpYyBEV09SRCBtYWluX3RocmVhZF9pZDsJLyogVGhyZWFkIElEIG9mIHRoZSBtYWluIHRocmVhZCAqLwotCi0vKiBDb3VudHMgb2YgdGhpbmdzLiAqLwotc3RhdGljIGludCBleGNlcHRpb25fY291bnQgPSAwOwotc3RhdGljIGludCBldmVudF9jb3VudCA9IDA7Ci0KLS8qIFVzZXIgb3B0aW9ucy4gKi8KLXN0YXRpYyBpbnQgbmV3X2NvbnNvbGUgPSAwOwotc3RhdGljIGludCBuZXdfZ3JvdXAgPSAxOwotc3RhdGljIGludCBkZWJ1Z19leGVjID0gMDsJLyogc2hvdyBleGVjdXRpb24gKi8KLXN0YXRpYyBpbnQgZGVidWdfZXZlbnRzID0gMDsJLyogc2hvdyBldmVudHMgZnJvbSBrZXJuZWwgKi8KLXN0YXRpYyBpbnQgZGVidWdfbWVtb3J5ID0gMDsJLyogc2hvdyB0YXJnZXQgbWVtb3J5IGFjY2Vzc2VzICovCi1zdGF0aWMgaW50IGRlYnVnX2V4Y2VwdGlvbnMgPSAwOwkvKiBzaG93IHRhcmdldCBleGNlcHRpb25zICovCi0KLS8qIFRoaXMgdmVjdG9yIG1hcHMgR0RCJ3MgaWRlYSBvZiBhIHJlZ2lzdGVyJ3MgbnVtYmVyIGludG8gYW4gYWRkcmVzcwotICAgaW4gdGhlIHdpbjMyIGV4Y2VwdGlvbiBjb250ZXh0IHZlY3Rvci4KLQotICAgSXQgYWxzbyBjb250YWlucyB0aGUgYml0IG1hc2sgbmVlZGVkIHRvIGxvYWQgdGhlIHJlZ2lzdGVyIGluIHF1ZXN0aW9uLgotCi0gICBPbmUgZGF5IHdlIGNvdWxkIHJlYWQgYSByZWcsIHdlIGNvdWxkIGluc3BlY3QgdGhlIGNvbnRleHQgd2UKLSAgIGFscmVhZHkgaGF2ZSBsb2FkZWQsIGlmIGl0IGRvZXNuJ3QgaGF2ZSB0aGUgYml0IHNldCB0aGF0IHdlIG5lZWQsCi0gICB3ZSByZWFkIHRoYXQgc2V0IG9mIHJlZ2lzdGVycyBpbiB1c2luZyBHZXRUaHJlYWRDb250ZXh0LiAgSWYgdGhlCi0gICBjb250ZXh0IGFscmVhZHkgY29udGFpbnMgd2hhdCB3ZSBuZWVkLCB3ZSBqdXN0IHVucGFjayBpdC4gVGhlbiB0bwotICAgd3JpdGUgYSByZWdpc3RlciwgZmlyc3Qgd2UgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGV4dCBjb250YWlucwotICAgdGhlIG90aGVyIHJlZ3Mgb2YgdGhlIGdyb3VwLCBhbmQgdGhlbiB3ZSBjb3B5IHRoZSBpbmZvIGluIGFuZCBzZXQKLSAgIG91dCBiaXQuICovCi0KLSNkZWZpbmUgY29udGV4dF9vZmZzZXQoeCkgKChpbnQpJigoKENPTlRFWFQgKilOVUxMKS0+eCkpCi1zdGF0aWMgY29uc3QgaW50IG1hcHBpbmdzW10gPQotewotICBjb250ZXh0X29mZnNldCAoRWF4KSwKLSAgY29udGV4dF9vZmZzZXQgKEVjeCksCi0gIGNvbnRleHRfb2Zmc2V0IChFZHgpLAotICBjb250ZXh0X29mZnNldCAoRWJ4KSwKLSAgY29udGV4dF9vZmZzZXQgKEVzcCksCi0gIGNvbnRleHRfb2Zmc2V0IChFYnApLAotICBjb250ZXh0X29mZnNldCAoRXNpKSwKLSAgY29udGV4dF9vZmZzZXQgKEVkaSksCi0gIGNvbnRleHRfb2Zmc2V0IChFaXApLAotICBjb250ZXh0X29mZnNldCAoRUZsYWdzKSwKLSAgY29udGV4dF9vZmZzZXQgKFNlZ0NzKSwKLSAgY29udGV4dF9vZmZzZXQgKFNlZ1NzKSwKLSAgY29udGV4dF9vZmZzZXQgKFNlZ0RzKSwKLSAgY29udGV4dF9vZmZzZXQgKFNlZ0VzKSwKLSAgY29udGV4dF9vZmZzZXQgKFNlZ0ZzKSwKLSAgY29udGV4dF9vZmZzZXQgKFNlZ0dzKSwKLSAgY29udGV4dF9vZmZzZXQgKEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbMCAqIDEwXSksCi0gIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzEgKiAxMF0pLAotICBjb250ZXh0X29mZnNldCAoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVsyICogMTBdKSwKLSAgY29udGV4dF9vZmZzZXQgKEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbMyAqIDEwXSksCi0gIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzQgKiAxMF0pLAotICBjb250ZXh0X29mZnNldCAoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVs1ICogMTBdKSwKLSAgY29udGV4dF9vZmZzZXQgKEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbNiAqIDEwXSksCi0gIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzcgKiAxMF0pLAotICBjb250ZXh0X29mZnNldCAoRmxvYXRTYXZlLkNvbnRyb2xXb3JkKSwKLSAgY29udGV4dF9vZmZzZXQgKEZsb2F0U2F2ZS5TdGF0dXNXb3JkKSwKLSAgY29udGV4dF9vZmZzZXQgKEZsb2F0U2F2ZS5UYWdXb3JkKSwKLSAgY29udGV4dF9vZmZzZXQgKEZsb2F0U2F2ZS5FcnJvclNlbGVjdG9yKSwKLSAgY29udGV4dF9vZmZzZXQgKEZsb2F0U2F2ZS5FcnJvck9mZnNldCksCi0gIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNhdmUuRGF0YVNlbGVjdG9yKSwKLSAgY29udGV4dF9vZmZzZXQgKEZsb2F0U2F2ZS5EYXRhT2Zmc2V0KSwKLX07Ci0KLS8qIFRoaXMgdmVjdG9yIG1hcHMgdGhlIHRhcmdldCdzIGlkZWEgb2YgYW4gZXhjZXB0aW9uIChleHRyYWN0ZWQKLSAgIGZyb20gdGhlIERFQlVHX0VWRU5UIHN0cnVjdHVyZSkgdG8gR0RCJ3MgaWRlYS4gKi8KLQotc3RydWN0IHhsYXRlX2V4Y2VwdGlvbgotICB7Ci0gICAgaW50IHRoZW07Ci0gICAgZW51bSB0YXJnZXRfc2lnbmFsIHVzOwotICB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHhsYXRlX2V4Y2VwdGlvbgotICB4bGF0ZVtdID0KLXsKLSAge0VYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OLCBUQVJHRVRfU0lHTkFMX1NFR1Z9LAotICB7U1RBVFVTX1NUQUNLX09WRVJGTE9XLCBUQVJHRVRfU0lHTkFMX1NFR1Z9LAotICB7RVhDRVBUSU9OX0JSRUFLUE9JTlQsIFRBUkdFVF9TSUdOQUxfVFJBUH0sCi0gIHtEQkdfQ09OVFJPTF9DLCBUQVJHRVRfU0lHTkFMX0lOVH0sCi0gIHtFWENFUFRJT05fU0lOR0xFX1NURVAsIFRBUkdFVF9TSUdOQUxfVFJBUH0sCi0gIHstMSwgLTF9fTsKLQotLyogRmluZCBhIHRocmVhZCByZWNvcmQgZ2l2ZW4gYSB0aHJlYWQgaWQuCi0gICBJZiBnZXRfY29udGV4dCB0aGVuIGFsc28gcmV0cmlldmUgdGhlIGNvbnRleHQgZm9yIHRoaXMKLSAgIHRocmVhZC4gKi8KLXN0YXRpYyB0aHJlYWRfaW5mbyAqCi10aHJlYWRfcmVjIChEV09SRCBpZCwgaW50IGdldF9jb250ZXh0KQotewotICB0aHJlYWRfaW5mbyAqdGg7Ci0KLSAgZm9yICh0aCA9ICZ0aHJlYWRfaGVhZDsgKHRoID0gdGgtPm5leHQpICE9IE5VTEw7KQotICAgIGlmICh0aC0+aWQgPT0gaWQpCi0gICAgICB7Ci0JaWYgKCF0aC0+c3VzcGVuZF9jb3VudCAmJiBnZXRfY29udGV4dCkKLQkgIHsKLQkgICAgaWYgKGdldF9jb250ZXh0ID4gMCkKLQkgICAgICB0aC0+c3VzcGVuZF9jb3VudCA9IFN1c3BlbmRUaHJlYWQgKHRoLT5oKSArIDE7Ci0JICAgIGVsc2UgaWYgKGdldF9jb250ZXh0IDwgMCkKLQkgICAgICB0aC0+c3VzcGVuZF9jb3VudCA9IC0xOwotCi0JICAgIHRoLT5jb250ZXh0LkNvbnRleHRGbGFncyA9IENPTlRFWFRfREVCVUdHRVI7Ci0JICAgIEdldFRocmVhZENvbnRleHQgKHRoLT5oLCAmdGgtPmNvbnRleHQpOwotCSAgfQotCXJldHVybiB0aDsKLSAgICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQWRkIGEgdGhyZWFkIHRvIHRoZSB0aHJlYWQgbGlzdCAqLwotc3RhdGljIHRocmVhZF9pbmZvICoKLWNoaWxkX2FkZF90aHJlYWQgKERXT1JEIGlkLCBIQU5ETEUgaCkKLXsKLSAgdGhyZWFkX2luZm8gKnRoOwotCi0gIGlmICgodGggPSB0aHJlYWRfcmVjIChpZCwgRkFMU0UpKSkKLSAgICByZXR1cm4gdGg7Ci0KLSAgdGggPSAodGhyZWFkX2luZm8gKikgeG1hbGxvYyAoc2l6ZW9mICgqdGgpKTsKLSAgbWVtc2V0ICh0aCwgMCwgc2l6ZW9mICgqdGgpKTsKLSAgdGgtPmlkID0gaWQ7Ci0gIHRoLT5oID0gaDsKLSAgdGgtPm5leHQgPSB0aHJlYWRfaGVhZC5uZXh0OwotICB0aHJlYWRfaGVhZC5uZXh0ID0gdGg7Ci0gIGFkZF90aHJlYWQgKGlkKTsKLSAgcmV0dXJuIHRoOwotfQotCi0vKiBDbGVhciBvdXQgYW55IG9sZCB0aHJlYWQgbGlzdCBhbmQgcmVpbnRpYWxpemUgaXQgdG8gYQotICAgcHJpc3RpbmUgc3RhdGUuICovCi1zdGF0aWMgdm9pZAotY2hpbGRfaW5pdF90aHJlYWRfbGlzdCAoKQotewotICB0aHJlYWRfaW5mbyAqdGggPSAmdGhyZWFkX2hlYWQ7Ci0KLSAgREVCVUdfRVZFTlRTICgoImdkYjogY2hpbGRfaW5pdF90aHJlYWRfbGlzdFxuIikpOwotICBpbml0X3RocmVhZF9saXN0ICgpOwotICB3aGlsZSAodGgtPm5leHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB0aHJlYWRfaW5mbyAqaGVyZSA9IHRoLT5uZXh0OwotICAgICAgdGgtPm5leHQgPSBoZXJlLT5uZXh0OwotICAgICAgKHZvaWQpIENsb3NlSGFuZGxlIChoZXJlLT5oKTsKLSAgICAgIGZyZWUgKGhlcmUpOwotICAgIH0KLX0KLQotLyogRGVsZXRlIGEgdGhyZWFkIGZyb20gdGhlIGxpc3Qgb2YgdGhyZWFkcyAqLwotc3RhdGljIHZvaWQKLWNoaWxkX2RlbGV0ZV90aHJlYWQgKERXT1JEIGlkKQotewotICB0aHJlYWRfaW5mbyAqdGg7Ci0KLSAgaWYgKGluZm9fdmVyYm9zZSkKLSAgICBwcmludGZfdW5maWx0ZXJlZCAoIltEZWxldGluZyAlc11cbiIsIHRhcmdldF9waWRfdG9fc3RyIChpZCkpOwotICBkZWxldGVfdGhyZWFkIChpZCk7Ci0KLSAgZm9yICh0aCA9ICZ0aHJlYWRfaGVhZDsKLSAgICAgICB0aC0+bmV4dCAhPSBOVUxMICYmIHRoLT5uZXh0LT5pZCAhPSBpZDsKLSAgICAgICB0aCA9IHRoLT5uZXh0KQotICAgIGNvbnRpbnVlOwotCi0gIGlmICh0aC0+bmV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHRocmVhZF9pbmZvICpoZXJlID0gdGgtPm5leHQ7Ci0gICAgICB0aC0+bmV4dCA9IGhlcmUtPm5leHQ7Ci0gICAgICBDbG9zZUhhbmRsZSAoaGVyZS0+aCk7Ci0gICAgICBmcmVlIChoZXJlKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGVjayAoQk9PTCBvaywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIGlmICghb2spCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiZXJyb3IgcmV0dXJuICVzOiVkIHdhcyAlZFxuIiwgZmlsZSwgbGluZSwgR2V0TGFzdEVycm9yICgpKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoaW50IHIpCi17Ci0gIGNoYXIgKmNvbnRleHRfb2Zmc2V0ID0gKChjaGFyICopICZjdXJyZW50X3RocmVhZC0+Y29udGV4dCkgKyBtYXBwaW5nc1tyXTsKLSAgbG9uZyBsOwotICBpZiAociA9PSBGQ1NfUkVHTlVNKQotICAgIHsKLSAgICAgIGwgPSAqKChsb25nICopY29udGV4dF9vZmZzZXQpICYgMHhmZmZmOwotICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyLCAoY2hhciAqKSAmbCk7Ci0gICAgfQotICBlbHNlIGlmIChyID09IEZPUF9SRUdOVU0pCi0gICAgewotICAgICAgbCA9ICgqKChsb25nICopY29udGV4dF9vZmZzZXQpID4+IDE2KSAmICgoMSA8PCAxMSkgLSAxKTsKLSAgICAgIHN1cHBseV9yZWdpc3RlciAociwgKGNoYXIgKikgJmwpOwotICAgIH0KLSAgZWxzZSBpZiAociA+PSAwKQotICAgIHN1cHBseV9yZWdpc3RlciAociwgKChjaGFyICopICZjdXJyZW50X3RocmVhZC0+Y29udGV4dCkgKyBtYXBwaW5nc1tyXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKHIgPSAwOyByIDwgTlVNX1JFR1M7IHIrKykKLQlkb19jaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWNoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoaW50IHIpCi17Ci0gIGN1cnJlbnRfdGhyZWFkID0gdGhyZWFkX3JlYyAoaW5mZXJpb3JfcGlkLCBUUlVFKTsKLSAgZG9fY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAoaW50IHIpCi17Ci0gIGlmIChyID49IDApCi0gICAgcmVhZF9yZWdpc3Rlcl9nZW4gKHIsICgoY2hhciAqKSAmY3VycmVudF90aHJlYWQtPmNvbnRleHQpICsgbWFwcGluZ3Nbcl0pOwotICBlbHNlCi0gICAgewotICAgICAgZm9yIChyID0gMDsgciA8IE5VTV9SRUdTOyByKyspCi0JZG9fY2hpbGRfc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyKTsKLSAgICB9Ci19Ci0KLS8qIFN0b3JlIGEgbmV3IHJlZ2lzdGVyIHZhbHVlIGludG8gdGhlIGN1cnJlbnQgdGhyZWFkIGNvbnRleHQgKi8KLXN0YXRpYyB2b2lkCi1jaGlsZF9zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKGludCByKQotewotICBjdXJyZW50X3RocmVhZCA9IHRocmVhZF9yZWMgKGluZmVyaW9yX3BpZCwgVFJVRSk7Ci0gIGRvX2NoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocik7Ci19Ci0KLSNpbmNsdWRlIDxwc2FwaS5oPgotc3RhdGljIGludCBwc2FwaV9sb2FkZWQgPSAwOwotc3RhdGljIEhNT0RVTEUgcHNhcGlfbW9kdWxlX2hhbmRsZSA9IE5VTEw7Ci1zdGF0aWMgQk9PTCAgV0lOQVBJICgqcHNhcGlfRW51bVByb2Nlc3NNb2R1bGVzKShIQU5ETEUsIEhNT0RVTEUqLCBEV09SRCwgTFBEV09SRCk9IE5VTEw7Ci1zdGF0aWMgQk9PTCAgV0lOQVBJICgqcHNhcGlfR2V0TW9kdWxlSW5mb3JtYXRpb24pIChIQU5ETEUsIEhNT0RVTEUsIExQTU9EVUxFSU5GTywgRFdPUkQpPSBOVUxMOwotc3RhdGljIERXT1JEIFdJTkFQSSAoKnBzYXBpX0dldE1vZHVsZUZpbGVOYW1lRXhBKSAoSEFORExFLCBITU9EVUxFLCBMUFNUUiwgRFdPUkQpPSBOVUxMOwotCi1pbnQgcHNhcGlfZ2V0X2RsbF9uYW1lIChEV09SRCBCYXNlQWRkcmVzcywgY2hhciAqZGxsX25hbWVfcmV0KQotewotICBEV09SRCBsZW47Ci0gIE1PRFVMRUlORk8gbWk7Ci0gIGludCBpOwotICBITU9EVUxFIGRoX2J1ZiBbIDEgXTsKLSAgSE1PRFVMRSogRGxsSGFuZGxlID0gZGhfYnVmOwotICBEV09SRCBjYk5lZWRlZDsKLSAgQk9PTCBvazsKLQotICBpZiAoIXBzYXBpX2xvYWRlZCB8fAotICAgICAgIHBzYXBpX0VudW1Qcm9jZXNzTW9kdWxlcyAgID09IE5VTEwgfHwKLSAgICAgICBwc2FwaV9HZXRNb2R1bGVJbmZvcm1hdGlvbiA9PSBOVUxMIHx8Ci0gICAgICAgcHNhcGlfR2V0TW9kdWxlRmlsZU5hbWVFeEEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAocHNhcGlfbG9hZGVkKWdvdG8gZmFpbGVkOwotICAgICAgcHNhcGlfbG9hZGVkID0gMTsKLSAgICAgIHBzYXBpX21vZHVsZV9oYW5kbGUgPSBMb2FkTGlicmFyeSAoInBzYXBpLmRsbCIpOwotICAgICAgaWYgKCFwc2FwaV9tb2R1bGVfaGFuZGxlKQotICAgICAgICB7Ci0gICAgICAgICAgLyogcHJpbnRmX3VuZmlsdGVyZWQgKCJlcnJvciBsb2FkaW5nIHBzYXBpLmRsbDogJXUiLCBHZXRMYXN0RXJyb3IgKCkpOyovCi0gICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgIHBzYXBpX0VudW1Qcm9jZXNzTW9kdWxlcyAgID0gR2V0UHJvY0FkZHJlc3MgKHBzYXBpX21vZHVsZV9oYW5kbGUsICJFbnVtUHJvY2Vzc01vZHVsZXMiICk7Ci0gICAgICBwc2FwaV9HZXRNb2R1bGVJbmZvcm1hdGlvbiA9IEdldFByb2NBZGRyZXNzIChwc2FwaV9tb2R1bGVfaGFuZGxlLCAiR2V0TW9kdWxlSW5mb3JtYXRpb24iKTsKLSAgICAgIHBzYXBpX0dldE1vZHVsZUZpbGVOYW1lRXhBID0gKHZvaWQgKikgR2V0UHJvY0FkZHJlc3MgKHBzYXBpX21vZHVsZV9oYW5kbGUsCi0JCQkJCQkJICAgICJHZXRNb2R1bGVGaWxlTmFtZUV4QSIpOwotICAgICAgaWYgKHBzYXBpX0VudW1Qcm9jZXNzTW9kdWxlcyAgID09IE5VTEwgfHwKLSAgICAgICAgICAgcHNhcGlfR2V0TW9kdWxlSW5mb3JtYXRpb24gPT0gTlVMTCB8fAotICAgICAgICAgICBwc2FwaV9HZXRNb2R1bGVGaWxlTmFtZUV4QSA9PSBOVUxMKQotCWdvdG8gZmFpbGVkOwotICAgIH0KLQotICBjYk5lZWRlZCA9IDA7Ci0gIG9rID0gKCpwc2FwaV9FbnVtUHJvY2Vzc01vZHVsZXMpIChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLAotCQkJCSAgICAgRGxsSGFuZGxlLAotCQkJCSAgICAgc2l6ZW9mIChITU9EVUxFKSwKLQkJCQkgICAgICZjYk5lZWRlZCk7Ci0KLSAgaWYgKCFvayB8fCAhY2JOZWVkZWQpCi0gICAgZ290byBmYWlsZWQ7Ci0KLSAgRGxsSGFuZGxlID0gKEhNT0RVTEUqKSBhbGxvY2EgKGNiTmVlZGVkKTsKLSAgaWYgKCFEbGxIYW5kbGUpCi0gICAgZ290byBmYWlsZWQ7Ci0KLSAgb2sgPSAoKnBzYXBpX0VudW1Qcm9jZXNzTW9kdWxlcykgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCi0JCQkJICAgICBEbGxIYW5kbGUsCi0JCQkJICAgICBjYk5lZWRlZCwKLQkJCQkgICAgICZjYk5lZWRlZCk7Ci0gIGlmICghb2spCi0gICAgZ290byBmYWlsZWQ7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNiTmVlZGVkIC8gc2l6ZW9mIChITU9EVUxFKTsgaSsrKQotICAgIHsKLSAgICAgIGlmICghKCpwc2FwaV9HZXRNb2R1bGVJbmZvcm1hdGlvbikgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCi0JCQkJCSAgICAgRGxsSGFuZGxlIFtpXSwKLQkJCQkJICAgICAmbWksCi0JCQkJCSAgICAgc2l6ZW9mIChtaSkpKQotCWVycm9yICgiQ2FuJ3QgZ2V0IG1vZHVsZSBpbmZvIik7Ci0KLSAgICAgIGxlbiA9ICgqcHNhcGlfR2V0TW9kdWxlRmlsZU5hbWVFeEEpIChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLAotCQkJCQkgICAgRGxsSGFuZGxlIFtpXSwKLQkJCQkJICAgIGRsbF9uYW1lX3JldCwKLQkJCQkJICAgIE1BWF9QQVRIKTsKLSAgICAgIGlmIChsZW4gPT0gMCkKLQllcnJvciAoIkVycm9yIGdldHRpbmcgZGxsIG5hbWU6ICV1XG4iLCBHZXRMYXN0RXJyb3IgKCkpOyAKLQotICAgICAgaWYgKChEV09SRCkgKG1pLmxwQmFzZU9mRGxsKSA9PSBCYXNlQWRkcmVzcykKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLWZhaWxlZDoKLSAgZGxsX25hbWVfcmV0WzBdID0gJ1wwJzsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdhaXQgZm9yIGNoaWxkIHRvIGRvIHNvbWV0aGluZy4gIFJldHVybiBwaWQgb2YgY2hpbGQsIG9yIC0xIGluIGNhc2UKLSAgIG9mIGVycm9yOyBzdG9yZSBzdGF0dXMgdGhyb3VnaCBhcmd1bWVudCBwb2ludGVyIE9VUlNUQVRVUy4gICovCi0KLXN0YXRpYyBpbnQKLWhhbmRsZV9sb2FkX2RsbCAoUFRSIGR1bW15KQotewotICBMT0FEX0RMTF9ERUJVR19JTkZPICpldmVudCA9ICZjdXJyZW50X2V2ZW50LnUuTG9hZERsbDsKLSAgRFdPUkQgZGxsX25hbWVfcHRyOwotICBEV09SRCBkb25lOwotICBjaGFyIGRsbF9idWZbTUFYX1BBVEggKyAxXTsKLSAgY2hhciAqcCwgKmRsbF9uYW1lID0gTlVMTDsKLSAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Ci0gIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBtaW5mbzsKLSAgc3RydWN0IHNlY3Rpb25fYWRkcl9pbmZvIHNlY3Rpb25fYWRkcnM7Ci0KLSAgbWVtc2V0ICgmc2VjdGlvbl9hZGRycywgMCwgc2l6ZW9mIChzZWN0aW9uX2FkZHJzKSk7Ci0gIGRsbF9idWZbMF0gPSBkbGxfYnVmW3NpemVvZiAoZGxsX2J1ZikgLSAxXSA9ICdcMCc7Ci0KLSAgaWYgKCFwc2FwaV9nZXRfZGxsX25hbWUgKChEV09SRCkgKGV2ZW50LT5scEJhc2VPZkRsbCksIGRsbF9idWYpKQotICAgIGRsbF9idWZbMF0gPSBkbGxfYnVmW3NpemVvZihkbGxfYnVmKSAtIDFdID0gJ1wwJzsKLQotICBkbGxfbmFtZSA9IGRsbF9idWY7Ci0KLSAgLyogQXR0ZW1wdCB0byByZWFkIHRoZSBuYW1lIG9mIHRoZSBkbGwgdGhhdCB3YXMgZGV0ZWN0ZWQuCi0gICAgIFRoaXMgaXMgZG9jdW1lbnRlZCB0byB3b3JrIG9ubHkgd2hlbiBhY3RpdmVseSBkZWJ1Z2dpbmcKLSAgICAgYSBwcm9ncmFtLiAgSXQgd2lsbCBub3Qgd29yayBmb3IgYXR0YWNoZWQgcHJvY2Vzc2VzLiAqLwotICBpZiAoZGxsX25hbWUgPT0gTlVMTCB8fCAqZGxsX25hbWUgPT0gJ1wwJykKLSAgICB7Ci0gICAgICBpbnQgc2l6ZSA9IGV2ZW50LT5mVW5pY29kZSA/IHNpemVvZiAoV0NIQVIpIDogc2l6ZW9mIChjaGFyKTsKLSAgICAgIGludCBsZW4gPSAwOwotICAgICAgY2hhciBiWzJdOwotCi0gICAgICBSZWFkUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwKLQkJCSAoTFBDVk9JRCkgZXZlbnQtPmxwSW1hZ2VOYW1lLAotCQkJIChjaGFyICopICZkbGxfbmFtZV9wdHIsCi0JCQkgc2l6ZW9mIChkbGxfbmFtZV9wdHIpLCAmZG9uZSk7Ci0KLSAgICAgIC8qIFNlZSBpZiB3ZSBjb3VsZCByZWFkIHRoZSBhZGRyZXNzIG9mIGEgc3RyaW5nLCBhbmQgdGhhdCB0aGUKLSAgICAgICAgIGFkZHJlc3MgaXNuJ3QgbnVsbC4gKi8KLQotICAgICAgaWYgKGRvbmUgIT0gc2l6ZW9mIChkbGxfbmFtZV9wdHIpIHx8ICFkbGxfbmFtZV9wdHIpCi0JcmV0dXJuIDE7Ci0KLSAgICAgIGRvCi0JewotCSAgUmVhZFByb2Nlc3NNZW1vcnkgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCi0JCQkgICAgIChMUENWT0lEKSAoZGxsX25hbWVfcHRyICsgbGVuICogc2l6ZSksCi0JCQkgICAgICZiLAotCQkJICAgICBzaXplLAotCQkJICAgICAmZG9uZSk7Ci0JICBsZW4rKzsKLQl9Ci0gICAgICB3aGlsZSAoKGJbMF0gIT0gMCB8fCBiW3NpemUgLSAxXSAhPSAwKSAmJiBkb25lID09IHNpemUpOwotCi0gICAgICBkbGxfbmFtZSA9IGFsbG9jYSAobGVuKTsKLQotICAgICAgaWYgKGV2ZW50LT5mVW5pY29kZSkKLQl7Ci0JICBXQ0hBUiAqdW5pY29kZV9kbGxfbmFtZSA9IChXQ0hBUiAqKSBhbGxvY2EgKGxlbiAqIHNpemVvZiAoV0NIQVIpKTsKLQkgIFJlYWRQcm9jZXNzTWVtb3J5IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLAotCQkJICAgICAoTFBDVk9JRCkgZGxsX25hbWVfcHRyLAotCQkJICAgICB1bmljb2RlX2RsbF9uYW1lLAotCQkJICAgICBsZW4gKiBzaXplb2YgKFdDSEFSKSwKLQkJCSAgICAgJmRvbmUpOwotCi0JICBXaWRlQ2hhclRvTXVsdGlCeXRlIChDUF9BQ1AsIDAsCi0JCQkgICAgICAgdW5pY29kZV9kbGxfbmFtZSwgbGVuLAotCQkJICAgICAgIGRsbF9uYW1lLCBsZW4sIDAsIDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBSZWFkUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwKLQkJCSAgICAgKExQQ1ZPSUQpIGRsbF9uYW1lX3B0ciwKLQkJCSAgICAgZGxsX25hbWUsCi0JCQkgICAgIGxlbiwKLQkJCSAgICAgJmRvbmUpOwotCX0KLSAgICB9Ci0KLSAgaWYgKCFkbGxfbmFtZSkKLSAgICByZXR1cm4gMTsKLQotICB3aGlsZSAoKHAgPSBzdHJjaHIgKGRsbF9uYW1lLCAnXFwnKSkpCi0gICAgKnAgPSAnLyc7Ci0KLSAgLyogVGhlIHN5bWJvbHMgaW4gYSBkbGwgYXJlIG9mZnNldCBieSAweDEwMDAsIHdoaWNoIGlzIHRoZQotICAgICB0aGUgb2Zmc2V0IGZyb20gMCBvZiB0aGUgZmlyc3QgYnl0ZSBpbiBhbiBpbWFnZSAtIGJlY2F1c2UKLSAgICAgb2YgdGhlIGZpbGUgaGVhZGVyIGFuZCB0aGUgc2VjdGlvbiBhbGlnbm1lbnQuCi0KLSAgICAgRklYTUU6IElzIHRoaXMgdGhlIHJlYWwgcmVhc29uIHRoYXQgd2UgbmVlZCB0aGUgMHgxMDAwID8gKi8KLQotICBwcmludGZfdW5maWx0ZXJlZCAoIiV4OiVzIiwgZXZlbnQtPmxwQmFzZU9mRGxsLCBkbGxfbmFtZSk7Ci0gIHNlY3Rpb25fYWRkcnMudGV4dF9hZGRyID0gKGludCkgZXZlbnQtPmxwQmFzZU9mRGxsICsgMHgxMDAwOwotICBzeW1ib2xfZmlsZV9hZGQgKGRsbF9uYW1lLCAwLCAmc2VjdGlvbl9hZGRycywgMCwgT0JKRl9TSEFSRUQpOwotICBwcmludGZfdW5maWx0ZXJlZCAoIlxuIik7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIEhhbmRsZSBERUJVR19TVFJJTkcgb3V0cHV0IGZyb20gY2hpbGQgcHJvY2Vzcy4KLSAgIEN5Z3dpbiBwcmVwZW5kcyBpdHMgbWVzc2FnZXMgd2l0aCBhICJjeWd3aW46Ii4gIEludGVycHJldCB0aGlzIGFzCi0gICBhIEN5Z3dpbiBzaWduYWwuICBPdGhlcndpc2UganVzdCBwcmludCB0aGUgc3RyaW5nIGFzIGEgd2FybmluZy4gKi8KLXN0YXRpYyBpbnQKLWhhbmRsZV9vdXRwdXRfZGVidWdfc3RyaW5nIChzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKm91cnN0YXR1cykKLXsKLSAgY2hhciAqczsKLSAgaW50IGdvdGFzaWcgPSBGQUxTRTsKLQotICBpZiAoIXRhcmdldF9yZWFkX3N0cmluZwotICAgICgoQ09SRV9BRERSKSBjdXJyZW50X2V2ZW50LnUuRGVidWdTdHJpbmcubHBEZWJ1Z1N0cmluZ0RhdGEsICZzLCAxMDI0LCAwKQotICAgICAgfHwgIXMgfHwgISpzKQotICAgIHJldHVybiBnb3Rhc2lnOwotCi0gIGlmIChzdHJuY21wIChzLCBDWUdXSU5fU0lHTkFMX1NUUklORywgc2l6ZW9mIChDWUdXSU5fU0lHTkFMX1NUUklORykgLSAxKSkKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAocywgImNZZyIsIDMpKQotCXdhcm5pbmcgKHMpOwotICAgIH0KLSAgICB7Ci0gICAgICBjaGFyICpwOwotICAgICAgaW50IHNpZyA9IHN0cnRvbCAocyArIHNpemVvZiAoQ1lHV0lOX1NJR05BTF9TVFJJTkcpIC0gMSwgJnAsIDApOwotICAgICAgZ290YXNpZyA9IHRhcmdldF9zaWduYWxfZnJvbV9ob3N0IChzaWcpOwotICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBnb3Rhc2lnOwotICAgICAgaWYgKGdvdGFzaWcpCi0Jb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7Ci0gICAgfQotCi0gIGZyZWUgKHMpOwotICByZXR1cm4gZ290YXNpZzsKLX0KLQotc3RhdGljIGludAotaGFuZGxlX2V4Y2VwdGlvbiAoc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXMpCi17Ci0gIGludCBpOwotICBpbnQgZG9uZSA9IDA7Ci0gIHRocmVhZF9pbmZvICp0aDsKLQotICBvdXJzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKLQotICAvKiBSZWNvcmQgdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgdGhyZWFkICovCi0gIHRoID0gdGhyZWFkX3JlYyAoY3VycmVudF9ldmVudC5kd1RocmVhZElkLCAtMSk7Ci0KLSAgc3dpdGNoIChjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25Db2RlKQotICAgIHsKLSAgICBjYXNlIEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OOgotICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBBQ0NFU1NfVklPTEFUSU9OIGF0IDB4JTA4eFxuIiwKLQkgICAgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOwotICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1NFR1Y7Ci0gICAgICBjb250aW51ZV9zdGF0dXMgPSBEQkdfRVhDRVBUSU9OX05PVF9IQU5ETEVEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVEFUVVNfU1RBQ0tfT1ZFUkZMT1c6Ci0gICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIFNUQUNLX09WRVJGTE9XIGF0IDB4JTA4eFxuIiwKLQkgICAgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOwotICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1NFR1Y7Ci0gICAgICBjb250aW51ZV9zdGF0dXMgPSBEQkdfRVhDRVBUSU9OX05PVF9IQU5ETEVEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFWENFUFRJT05fQlJFQUtQT0lOVDoKLSAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gQlJFQUtQT0lOVCBhdCAweCUwOHhcbiIsCi0JICAgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKLSAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEQkdfQ09OVFJPTF9DOgotICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBDT05UUk9MX0MgYXQgMHglMDh4XG4iLAotCSAgICAgICBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzKSk7Ci0gICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfSU5UOwotICAgICAgY29udGludWVfc3RhdHVzID0gREJHX0VYQ0VQVElPTl9OT1RfSEFORExFRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRVhDRVBUSU9OX1NJTkdMRV9TVEVQOgotICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBTSU5HTEVfU1RFUCBhdCAweCUwOHhcbiIsCi0JICAgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKLSAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFRoaXMgbWF5IGJlIGEgc3RydWN0dXJlZCBleGNlcHRpb24gaGFuZGxpbmcgZXhjZXB0aW9uLiAgSW4KLSAgICAgICAgIHRoYXQgY2FzZSwgd2Ugd2FudCB0byBsZXQgdGhlIHByb2dyYW0gdHJ5IHRvIGhhbmRsZSBpdCwgYW5kCi0gICAgICAgICBvbmx5IGJyZWFrIGlmIHdlIHNlZSB0aGUgZXhjZXB0aW9uIGEgc2Vjb25kIHRpbWUuICAqLwotICAgICAgaWYgKGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uZHdGaXJzdENoYW5jZSkKLQlyZXR1cm4gMDsKLQotICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJnZGI6IHVua25vd24gdGFyZ2V0IGV4Y2VwdGlvbiAweCUwOHggYXQgMHglMDh4XG4iLAotCQkgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQ29kZSwKLQkJY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcyk7Ci0gICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVU5LTk9XTjsKLSAgICAgIGNvbnRpbnVlX3N0YXR1cyA9IERCR19FWENFUFRJT05fTk9UX0hBTkRMRUQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGV4Y2VwdGlvbl9jb3VudCsrOwotICByZXR1cm4gMTsKLX0KLQotLyogUmVzdW1lIGFsbCBhcnRpZmljaWFsbHkgc3VzcGVuZGVkIHRocmVhZHMgaWYgd2UgYXJlIGNvbnRpbnVpbmcKLSAgIGV4ZWN1dGlvbiAqLwotc3RhdGljIEJPT0wKLWNoaWxkX2NvbnRpbnVlIChpbnQgaWQpCi17Ci0gIGludCBpOwotICB0aHJlYWRfaW5mbyAqdGg7Ci0gIEJPT0wgcmVzOwotCi0gIERFQlVHX0VWRU5UUyAoKCJDb250aW51ZURlYnVnRXZlbnQgKGNwaWQ9JWQsIGN0aWQ9JWQsIERCR19DT05USU5VRSk7XG4iLAotCQkgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3VycmVudF9ldmVudC5kd1RocmVhZElkKSk7Ci0gIHJlcyA9IENvbnRpbnVlRGVidWdFdmVudCAoY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwKLQkJCSAgICBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCQkgICAgY29udGludWVfc3RhdHVzKTsKLSAgY29udGludWVfc3RhdHVzID0gMDsKLSAgaWYgKHJlcykKLSAgICBmb3IgKHRoID0gJnRocmVhZF9oZWFkOyAodGggPSB0aC0+bmV4dCkgIT0gTlVMTDspCi0gICAgICBpZiAoKChpZCA9PSAtMSkgfHwgKGlkID09IHRoLT5pZCkpICYmIHRoLT5zdXNwZW5kX2NvdW50KQotCXsKLQkgIGZvciAoaSA9IDA7IGkgPCB0aC0+c3VzcGVuZF9jb3VudDsgaSsrKQotCSAgICAodm9pZCkgUmVzdW1lVGhyZWFkICh0aC0+aCk7Ci0JICB0aC0+c3VzcGVuZF9jb3VudCA9IDA7Ci0JfQotCi0gIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9jaGlsZF9kZWJ1Z19ldmVudCAoaW50IHBpZCwgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXMsCi0JCSAgICAgICBEV09SRCAqZXZlbnRfY29kZSwgaW50ICpyZXR2YWwpCi17Ci0gIEJPT0wgZGVidWdfZXZlbnQ7Ci0gIGludCBicmVha291dCA9IDE7Ci0KLSAgaWYgKCEoZGVidWdfZXZlbnQgPSBXYWl0Rm9yRGVidWdFdmVudCAoJmN1cnJlbnRfZXZlbnQsIDIwKSkpCi0gICAgewotICAgICAgYnJlYWtvdXQgPSAqcmV0dmFsID0gKmV2ZW50X2NvZGUgPSAwOwotICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gIGV2ZW50X2NvdW50Kys7Ci0gIGNvbnRpbnVlX3N0YXR1cyA9IERCR19DT05USU5VRTsKLSAgKnJldHZhbCA9IDA7Ci0KLSAgc3dpdGNoICgqZXZlbnRfY29kZSA9IGN1cnJlbnRfZXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSkKLSAgICB7Ci0gICAgY2FzZSBDUkVBVEVfVEhSRUFEX0RFQlVHX0VWRU5UOgotICAgICAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSV4IGNvZGU9JXMpXG4iLAotCQkgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLAotCQkgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCSAgICAiQ1JFQVRFX1RIUkVBRF9ERUJVR19FVkVOVCIpKTsKLSAgICAgIC8qIFJlY29yZCB0aGUgZXhpc3RlbmNlIG9mIHRoaXMgdGhyZWFkICovCi0gICAgICBjaGlsZF9hZGRfdGhyZWFkIChjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCQljdXJyZW50X2V2ZW50LnUuQ3JlYXRlVGhyZWFkLmhUaHJlYWQpOwotICAgICAgaWYgKGluZm9fdmVyYm9zZSkKLQlwcmludGZfdW5maWx0ZXJlZCAoIltOZXcgJXNdXG4iLAotCQkgICAgICB0YXJnZXRfcGlkX3RvX3N0ciAoY3VycmVudF9ldmVudC5kd1RocmVhZElkKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRVhJVF9USFJFQURfREVCVUdfRVZFTlQ6Ci0gICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylcbiIsCi0JCSAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsCi0JCSAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJICAgICJFWElUX1RIUkVBRF9ERUJVR19FVkVOVCIpKTsKLSAgICAgIGNoaWxkX2RlbGV0ZV90aHJlYWQgKGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ1JFQVRFX1BST0NFU1NfREVCVUdfRVZFTlQ6Ci0gICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylcbiIsCi0JCSAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsCi0JCSAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJICAgICJDUkVBVEVfUFJPQ0VTU19ERUJVR19FVkVOVCIpKTsKLSAgICAgIGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUgPSBjdXJyZW50X2V2ZW50LnUuQ3JlYXRlUHJvY2Vzc0luZm8uaFByb2Nlc3M7Ci0KLSAgICAgIG1haW5fdGhyZWFkX2lkID0gaW5mZXJpb3JfcGlkID0gY3VycmVudF9ldmVudC5kd1RocmVhZElkOwotICAgICAgLyogQWRkIHRoZSBtYWluIHRocmVhZCAqLwotICAgICAgY3VycmVudF90aHJlYWQgPSBjaGlsZF9hZGRfdGhyZWFkIChpbmZlcmlvcl9waWQsCi0JCQkgY3VycmVudF9ldmVudC51LkNyZWF0ZVByb2Nlc3NJbmZvLmhUaHJlYWQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVYSVRfUFJPQ0VTU19ERUJVR19FVkVOVDoKLSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKLQkJICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwKLQkJICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkgICAgIkVYSVRfUFJPQ0VTU19ERUJVR19FVkVOVCIpKTsKLSAgICAgIG91cnN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9FWElURUQ7Ci0gICAgICBvdXJzdGF0dXMtPnZhbHVlLmludGVnZXIgPSBjdXJyZW50X2V2ZW50LnUuRXhpdFByb2Nlc3MuZHdFeGl0Q29kZTsKLSAgICAgIENsb3NlSGFuZGxlIChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlKTsKLSAgICAgICpyZXR2YWwgPSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkOwotICAgICAgZ290byBvdXQ7Ci0KLSAgICBjYXNlIExPQURfRExMX0RFQlVHX0VWRU5UOgotICAgICAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkIGNvZGU9JXMpXG4iLAotCQkgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLAotCQkgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCSAgICAiTE9BRF9ETExfREVCVUdfRVZFTlQiKSk7Ci0gICAgICBjYXRjaF9lcnJvcnMgKGhhbmRsZV9sb2FkX2RsbCwgTlVMTCwgIiIsIFJFVFVSTl9NQVNLX0FMTCk7Ci0gICAgICByZWdpc3RlcnNfY2hhbmdlZCAoKTsJLyogbWFyayBhbGwgcmVncyBpbnZhbGlkICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgVU5MT0FEX0RMTF9ERUJVR19FVkVOVDoKLSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKLQkJICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwKLQkJICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkgICAgIlVOTE9BRF9ETExfREVCVUdfRVZFTlQiKSk7Ci0gICAgICBicmVhazsJCS8qIEZJWE1FOiBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSAqLwotCi0gICAgY2FzZSBFWENFUFRJT05fREVCVUdfRVZFTlQ6Ci0gICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylcbiIsCi0JCSAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsCi0JCSAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJICAgICJFWENFUFRJT05fREVCVUdfRVZFTlQiKSk7Ci0gICAgICBpZiAoaGFuZGxlX2V4Y2VwdGlvbiAob3Vyc3RhdHVzKSkJLyogc2V0cyBjb250aW51ZV9zdGF0dXMgKi8KLQl7Ci0JICAqcmV0dmFsID0gY3VycmVudF9ldmVudC5kd1RocmVhZElkOwotCSAgZ290byBvdXQ7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9VVFBVVF9ERUJVR19TVFJJTkdfRVZFTlQ6Ci0gICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylcbiIsCi0JCSAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsCi0JCSAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJICAgICJPVVRQVVRfREVCVUdfU1RSSU5HX0VWRU5UIikpOwotICAgICAgaWYgKGhhbmRsZV9vdXRwdXRfZGVidWdfc3RyaW5nIChvdXJzdGF0dXMpKQotCXsKLQkgICpyZXR2YWwgPSBtYWluX3RocmVhZF9pZDsKLQkgIGdvdG8gb3V0OwotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGZfdW5maWx0ZXJlZCAoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkXG4iLAotCQkJIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsCi0JCQkgY3VycmVudF9ldmVudC5kd1RocmVhZElkKTsKLSAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiICAgICAgICAgICAgICAgICB1bmtub3duIGV2ZW50IGNvZGUgJWRcbiIsCi0JCQkgY3VycmVudF9ldmVudC5kd0RlYnVnRXZlbnRDb2RlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBicmVha291dCA9IDA7Ci0gIENIRUNLIChjaGlsZF9jb250aW51ZSAoLTEpKTsKLSAgY29udGludWVfc3RhdHVzID0gMDsKLQotb3V0OgotICByZXR1cm4gYnJlYWtvdXQ7Ci19Ci0KLQotLyogV2FpdCBmb3IgaW50ZXJlc3RpbmcgZXZlbnRzIHRvIG9jY3VyIGluIHRoZSB0YXJnZXQgcHJvY2Vzcy4gKi8KLXN0YXRpYyBpbnQKLWNoaWxkX3dhaXQgKGludCBwaWQsIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqb3Vyc3RhdHVzKQotewotICBEV09SRCBldmVudF9jb2RlOwotICBpbnQgcmV0dmFsOwotCi0gIC8qIFdlIGxvb3Agd2hlbiB3ZSBnZXQgYSBub24tc3RhbmRhcmQgZXhjZXB0aW9uIHJhdGhlciB0aGFuIHJldHVybgotICAgICB3aXRoIGEgU1BVUklPVVMgYmVjYXVzZSByZXN1bWUgY2FuIHRyeSBhbmQgc3RlcCBvciBtb2RpZnkgdGhpbmdzLAotICAgICB3aGljaCBuZWVkcyBhIGN1cnJlbnRfdGhyZWFkLT5oLiAgQnV0IHNvbWUgb2YgdGhlc2UgZXhjZXB0aW9ucyBtYXJrCi0gICAgIHRoZSBiaXJ0aCBvciBkZWF0aCBvZiB0aHJlYWRzLCB3aGljaCBtZWFuIHRoYXQgdGhlIGN1cnJlbnQgdGhyZWFkCi0gICAgIGlzbid0IG5lY2Vzc2FyaWx5IHdoYXQgeW91IHRoaW5rIGl0IGlzLiAqLwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChjb250aW51ZV9zdGF0dXMgIT0gMCkKLQlDSEVDSyAoY2hpbGRfY29udGludWUgKC0xKSk7Ci0gICAgICBpZiAoZ2V0X2NoaWxkX2RlYnVnX2V2ZW50IChwaWQsIG91cnN0YXR1cywgJmV2ZW50X2NvZGUsICZyZXR2YWwpKQotCXJldHVybiByZXR2YWw7Ci0gICAgICBlbHNlCi0JewotCSAgaW50IGRldGFjaCA9IDA7Ci0KLQkgIGlmICh1aV9sb29wX2hvb2sgIT0gTlVMTCkKLQkgICAgZGV0YWNoID0gdWlfbG9vcF9ob29rICgwKTsKLQotCSAgaWYgKGRldGFjaCkKLQkgICAgY2hpbGRfa2lsbF9pbmZlcmlvciAoKTsKLQl9Ci0gICAgfQotfQotCi0vKiBBdHRhY2ggdG8gcHJvY2VzcyBQSUQsIHRoZW4gaW5pdGlhbGl6ZSBmb3IgZGVidWdnaW5nIGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLWNoaWxkX2F0dGFjaCAoYXJncywgZnJvbV90dHkpCi0gICAgIGNoYXIgKmFyZ3M7Ci0gICAgIGludCBmcm9tX3R0eTsKLXsKLSAgQk9PTCBvazsKLQotICBpZiAoIWFyZ3MpCi0gICAgZXJyb3Jfbm9fYXJnICgicHJvY2Vzcy1pZCB0byBhdHRhY2giKTsKLQotICBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkID0gc3RydG91bCAoYXJncywgMCwgMCk7Ci0KLSAgb2sgPSBEZWJ1Z0FjdGl2ZVByb2Nlc3MgKGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQpOwotCi0gIGlmICghb2spCi0gICAgZXJyb3IgKCJDYW4ndCBhdHRhY2ggdG8gcHJvY2Vzcy4iKTsKLQotICBleGNlcHRpb25fY291bnQgPSAwOwotICBldmVudF9jb3VudCA9IDA7Ci0KLSAgaWYgKGZyb21fdHR5KQotICAgIHsKLSAgICAgIGNoYXIgKmV4ZWNfZmlsZSA9IChjaGFyICopIGdldF9leGVjX2ZpbGUgKDApOwotCi0gICAgICBpZiAoZXhlY19maWxlKQotCXByaW50Zl91bmZpbHRlcmVkICgiQXR0YWNoaW5nIHRvIHByb2dyYW0gYCVzJywgJXNcbiIsIGV4ZWNfZmlsZSwKLQkJCSAgIHRhcmdldF9waWRfdG9fc3RyIChjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkKSk7Ci0gICAgICBlbHNlCi0JcHJpbnRmX3VuZmlsdGVyZWQgKCJBdHRhY2hpbmcgdG8gJXNcbiIsCi0JCQkgICB0YXJnZXRfcGlkX3RvX3N0ciAoY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCkpOwotCi0gICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOwotICAgIH0KLQotICBwdXNoX3RhcmdldCAoJmNoaWxkX29wcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGlsZF9kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KQotICAgICBjaGFyICphcmdzOwotICAgICBpbnQgZnJvbV90dHk7Ci17Ci0gIGlmIChmcm9tX3R0eSkKLSAgICB7Ci0gICAgICBjaGFyICpleGVjX2ZpbGUgPSBnZXRfZXhlY19maWxlICgwKTsKLSAgICAgIGlmIChleGVjX2ZpbGUgPT0gMCkKLQlleGVjX2ZpbGUgPSAiIjsKLSAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiRGV0YWNoaW5nIGZyb20gcHJvZ3JhbTogJXMgJXNcbiIsIGV4ZWNfZmlsZSwKLQkJCSB0YXJnZXRfcGlkX3RvX3N0ciAoaW5mZXJpb3JfcGlkKSk7Ci0gICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOwotICAgIH0KLSAgaW5mZXJpb3JfcGlkID0gMDsKLSAgdW5wdXNoX3RhcmdldCAoJmNoaWxkX29wcyk7Ci19Ci0KLS8qIFByaW50IHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHdlJ3JlIGFjY2Vzc2luZy4gICovCi0KLXN0YXRpYyB2b2lkCi1jaGlsZF9maWxlc19pbmZvIChpZ25vcmUpCi0gICAgIHN0cnVjdCB0YXJnZXRfb3BzICppZ25vcmU7Ci17Ci0gIHByaW50Zl91bmZpbHRlcmVkICgiXHRVc2luZyB0aGUgcnVubmluZyBpbWFnZSBvZiAlcyAlcy5cbiIsCi0gICAgICBhdHRhY2hfZmxhZyA/ICJhdHRhY2hlZCIgOiAiY2hpbGQiLCB0YXJnZXRfcGlkX3RvX3N0ciAoaW5mZXJpb3JfcGlkKSk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotY2hpbGRfb3BlbiAoYXJnLCBmcm9tX3R0eSkKLSAgICAgY2hhciAqYXJnOwotICAgICBpbnQgZnJvbV90dHk7Ci17Ci0gIGVycm9yICgiVXNlIHRoZSBcInJ1blwiIGNvbW1hbmQgdG8gc3RhcnQgYSBVbml4IGNoaWxkIHByb2Nlc3MuIik7Ci19Ci0KLS8qIFN0YXJ0IGFuIGluZmVyaW9yIHdpbjMyIGNoaWxkIHByb2Nlc3MgYW5kIHNldHMgaW5mZXJpb3JfcGlkIHRvIGl0cyBwaWQuCi0gICBFWEVDX0ZJTEUgaXMgdGhlIGZpbGUgdG8gcnVuLgotICAgQUxMQVJHUyBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBhcmd1bWVudHMgdG8gdGhlIHByb2dyYW0uCi0gICBFTlYgaXMgdGhlIGVudmlyb25tZW50IHZlY3RvciB0byBwYXNzLiAgRXJyb3JzIHJlcG9ydGVkIHdpdGggZXJyb3IoKS4gICovCi0KLXN0YXRpYyB2b2lkCi1jaGlsZF9jcmVhdGVfaW5mZXJpb3IgKGV4ZWNfZmlsZSwgYWxsYXJncywgZW52KQotICAgICBjaGFyICpleGVjX2ZpbGU7Ci0gICAgIGNoYXIgKmFsbGFyZ3M7Ci0gICAgIGNoYXIgKiplbnY7Ci17Ci0gIGNoYXIgcmVhbF9wYXRoW01BWFBBVEhMRU5dOwotICBjaGFyICp3aW5lbnY7Ci0gIGNoYXIgKnRlbXA7Ci0gIGludCBlbnZsZW47Ci0gIGludCBpOwotICBTVEFSVFVQSU5GTyBzaTsKLSAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKLSAgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzIGR1bW15OwotICBCT09MIHJldDsKLSAgRFdPUkQgZmxhZ3M7Ci0gIGNoYXIgKmFyZ3M7Ci0gIERXT1JEIGV2ZW50X2NvZGU7Ci0KLSAgaWYgKCFleGVjX2ZpbGUpCi0gICAgewotICAgICAgZXJyb3IgKCJObyBleGVjdXRhYmxlIHNwZWNpZmllZCwgdXNlIGB0YXJnZXQgZXhlYycuXG4iKTsKLSAgICB9Ci0KLSAgbWVtc2V0ICgmc2ksIDAsIHNpemVvZiAoc2kpKTsKLSAgc2kuY2IgPSBzaXplb2YgKHNpKTsKLQotICBjeWd3aW4zMl9jb252X3RvX3dpbjMyX3BhdGggKGV4ZWNfZmlsZSwgcmVhbF9wYXRoKTsKLQotICBmbGFncyA9IERFQlVHX09OTFlfVEhJU19QUk9DRVNTOwotCi0gIGlmIChuZXdfZ3JvdXApCi0gICAgZmxhZ3MgfD0gQ1JFQVRFX05FV19QUk9DRVNTX0dST1VQOwotCi0gIGlmIChuZXdfY29uc29sZSkKLSAgICBmbGFncyB8PSBDUkVBVEVfTkVXX0NPTlNPTEU7Ci0KLSAgYXJncyA9IGFsbG9jYSAoc3RybGVuIChyZWFsX3BhdGgpICsgc3RybGVuIChhbGxhcmdzKSArIDIpOwotCi0gIHN0cmNweSAoYXJncywgcmVhbF9wYXRoKTsKLQotICBzdHJjYXQgKGFyZ3MsICIgIik7Ci0gIHN0cmNhdCAoYXJncywgYWxsYXJncyk7Ci0KLSAgLyogUHJlcGFyZSB0aGUgZW52aXJvbm1lbnQgdmFycyBmb3IgQ3JlYXRlUHJvY2Vzcy4gICovCi0gIHsKLSAgICAvKiBUaGlzIGNvZGUgdXNlIHRvIGFzc3VtZSBhbGwgZW52IHZhcnMgd2VyZSBmaWxlIG5hbWVzIGFuZCB3b3VsZAotICAgICAgIHRyYW5zbGF0ZSB0aGVtIGFsbCB0byB3aW4zMiBzdHlsZS4gIFRoYXQgb2J2aW91c2x5IGRvZXNuJ3Qgd29yayBpbiB0aGUKLSAgICAgICBnZW5lcmFsIGNhc2UuICBUaGUgY3VycmVudCBydWxlIGlzIHRoYXQgd2Ugb25seSB0cmFuc2xhdGUgUEFUSC4KLSAgICAgICBXZSBuZWVkIHRvIGhhbmRsZSBQQVRIIGJlY2F1c2Ugd2UncmUgYWJvdXQgdG8gY2FsbCBDcmVhdGVQcm9jZXNzIGFuZAotICAgICAgIGl0IHVzZXMgUEFUSCB0byBmaW5kIERMTCdzLiAgRm9ydHVuYXRlbHkgUEFUSCBoYXMgYSB3ZWxsLWRlZmluZWQgdmFsdWUKLSAgICAgICBpbiBib3RoIHBvc2l4IGFuZCB3aW4zMiBlbnZpcm9ubWVudHMuICBjeWd3aW4uZGxsIHdpbGwgY2hhbmdlIGl0IGJhY2sKLSAgICAgICB0byBwb3NpeCBzdHlsZSBpZiBuZWNlc3NhcnkuICAqLwotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnZfcGF0aF9uYW1lc1tdID0KLSAgICB7Ci0gICAgICAiUEFUSD0iLAotICAgICAgMAotICAgIH07Ci0KLSAgICAvKiBDcmVhdGVQcm9jZXNzIHRha2VzIHRoZSBlbnZpcm9ubWVudCBsaXN0IGFzIGEgbnVsbCB0ZXJtaW5hdGVkIHNldCBvZgotICAgICAgIHN0cmluZ3MgKGkuZS4gdHdvIG51bGxzIHRlcm1pbmF0ZSB0aGUgbGlzdCkuICAqLwotCi0gICAgLyogR2V0IHRvdGFsIHNpemUgZm9yIGVudiBzdHJpbmdzLiAgKi8KLSAgICBmb3IgKGVudmxlbiA9IDAsIGkgPSAwOyBlbnZbaV0gJiYgKmVudltpXTsgaSsrKQotICAgICAgewotCWludCBqLCBsZW47Ci0KLQlmb3IgKGogPSAwOyBjb252X3BhdGhfbmFtZXNbal07IGorKykKLQkgIHsKLQkgICAgbGVuID0gc3RybGVuIChjb252X3BhdGhfbmFtZXNbal0pOwotCSAgICBpZiAoc3RybmNtcCAoY29udl9wYXRoX25hbWVzW2pdLCBlbnZbaV0sIGxlbikgPT0gMCkKLQkgICAgICB7Ci0JCWlmIChjeWd3aW4zMl9wb3NpeF9wYXRoX2xpc3RfcCAoZW52W2ldICsgbGVuKSkKLQkJICBlbnZsZW4gKz0gbGVuCi0JCSAgICArIGN5Z3dpbjMyX3Bvc2l4X3RvX3dpbjMyX3BhdGhfbGlzdF9idWZfc2l6ZSAoZW52W2ldICsgbGVuKTsKLQkJZWxzZQotCQkgIGVudmxlbiArPSBzdHJsZW4gKGVudltpXSkgKyAxOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JaWYgKGNvbnZfcGF0aF9uYW1lc1tqXSA9PSBOVUxMKQotCSAgZW52bGVuICs9IHN0cmxlbiAoZW52W2ldKSArIDE7Ci0gICAgICB9Ci0KLSAgICB3aW5lbnYgPSBhbGxvY2EgKGVudmxlbiArIDEpOwotCi0gICAgLyogQ29weSBlbnYgc3RyaW5ncyBpbnRvIG5ldyBidWZmZXIuICAqLwotICAgIGZvciAodGVtcCA9IHdpbmVudiwgaSA9IDA7IGVudltpXSAmJiAqZW52W2ldOyBpKyspCi0gICAgICB7Ci0JaW50IGosIGxlbjsKLQotCWZvciAoaiA9IDA7IGNvbnZfcGF0aF9uYW1lc1tqXTsgaisrKQotCSAgewotCSAgICBsZW4gPSBzdHJsZW4gKGNvbnZfcGF0aF9uYW1lc1tqXSk7Ci0JICAgIGlmIChzdHJuY21wIChjb252X3BhdGhfbmFtZXNbal0sIGVudltpXSwgbGVuKSA9PSAwKQotCSAgICAgIHsKLQkJaWYgKGN5Z3dpbjMyX3Bvc2l4X3BhdGhfbGlzdF9wIChlbnZbaV0gKyBsZW4pKQotCQkgIHsKLQkJICAgIG1lbWNweSAodGVtcCwgZW52W2ldLCBsZW4pOwotCQkgICAgY3lnd2luMzJfcG9zaXhfdG9fd2luMzJfcGF0aF9saXN0IChlbnZbaV0gKyBsZW4sIHRlbXAgKyBsZW4pOwotCQkgIH0KLQkJZWxzZQotCQkgIHN0cmNweSAodGVtcCwgZW52W2ldKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCWlmIChjb252X3BhdGhfbmFtZXNbal0gPT0gTlVMTCkKLQkgIHN0cmNweSAodGVtcCwgZW52W2ldKTsKLQotCXRlbXAgKz0gc3RybGVuICh0ZW1wKSArIDE7Ci0gICAgICB9Ci0KLSAgICAvKiBGaW5hbCBuaWwgc3RyaW5nIHRvIHRlcm1pbmF0ZSBuZXcgZW52LiAgKi8KLSAgICAqdGVtcCA9IDA7Ci0gIH0KLQotICByZXQgPSBDcmVhdGVQcm9jZXNzICgwLAotCQkgICAgICAgYXJncywJLyogY29tbWFuZCBsaW5lICovCi0JCSAgICAgICBOVUxMLAkvKiBTZWN1cml0eSAqLwotCQkgICAgICAgTlVMTCwJLyogdGhyZWFkICovCi0JCSAgICAgICBUUlVFLAkvKiBpbmhlcml0IGhhbmRsZXMgKi8KLQkJICAgICAgIGZsYWdzLAkvKiBzdGFydCBmbGFncyAqLwotCQkgICAgICAgd2luZW52LAotCQkgICAgICAgTlVMTCwJLyogY3VycmVudCBkaXJlY3RvcnkgKi8KLQkJICAgICAgICZzaSwKLQkJICAgICAgICZwaSk7Ci0gIGlmICghcmV0KQotICAgIGVycm9yICgiRXJyb3IgY3JlYXRpbmcgcHJvY2VzcyAlcywgKGVycm9yICVkKVxuIiwgZXhlY19maWxlLCBHZXRMYXN0RXJyb3IgKCkpOwotCi0gIGV4Y2VwdGlvbl9jb3VudCA9IDA7Ci0gIGV2ZW50X2NvdW50ID0gMDsKLQotICBjdXJyZW50X3Byb2Nlc3NfaGFuZGxlID0gcGkuaFByb2Nlc3M7Ci0gIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQgPSBwaS5kd1Byb2Nlc3NJZDsKLSAgbWVtc2V0ICgmY3VycmVudF9ldmVudCwgMCwgc2l6ZW9mIChjdXJyZW50X2V2ZW50KSk7Ci0gIGluZmVyaW9yX3BpZCA9IGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCA9IHBpLmR3VGhyZWFkSWQ7Ci0gIHB1c2hfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKLSAgY2hpbGRfaW5pdF90aHJlYWRfbGlzdCAoKTsKLSAgaW5pdF93YWl0X2Zvcl9pbmZlcmlvciAoKTsKLSAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7Ci0gIHRhcmdldF90ZXJtaW5hbF9pbml0ICgpOwotICB0YXJnZXRfdGVybWluYWxfaW5mZXJpb3IgKCk7Ci0KLSAgLyogUnVuIHVudGlsIHByb2Nlc3MgYW5kIHRocmVhZHMgYXJlIGxvYWRlZCAqLwotICBkbwotICAgIGdldF9jaGlsZF9kZWJ1Z19ldmVudCAoaW5mZXJpb3JfcGlkLCAmZHVtbXksICZldmVudF9jb2RlLCAmcmV0KTsKLSAgd2hpbGUgKGV2ZW50X2NvZGUgIT0gRVhDRVBUSU9OX0RFQlVHX0VWRU5UKTsKLQotICBwcm9jZWVkICgoQ09SRV9BRERSKSAtIDEsIFRBUkdFVF9TSUdOQUxfMCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGlsZF9tb3Vybl9pbmZlcmlvciAoKQotewotICBjb250aW51ZV9zdGF0dXMgPSBEQkdfQ09OVElOVUU7Ci0gICh2b2lkKSBjaGlsZF9jb250aW51ZSAoLTEpOwotICB1bnB1c2hfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKLSAgZ2VuZXJpY19tb3Vybl9pbmZlcmlvciAoKTsKLX0KLQotLyogU2VuZCBhIFNJR0lOVCB0byB0aGUgcHJvY2VzcyBncm91cC4gIFRoaXMgYWN0cyBqdXN0IGxpa2UgdGhlIHVzZXIgdHlwZWQgYQotICAgXkMgb24gdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsLiAqLwotCi1zdGF0aWMgdm9pZAotY2hpbGRfc3RvcCAoKQotewotICBERUJVR19FVkVOVFMgKCgiZ2RiOiBHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQgKENUUkxDX0VWRU5ULCAwKVxuIikpOwotICBDSEVDSyAoR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50IChDVFJMX0NfRVZFTlQsIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQpKTsKLSAgcmVnaXN0ZXJzX2NoYW5nZWQgKCk7CQkvKiByZWZyZXNoIHJlZ2lzdGVyIHN0YXRlICovCi19Ci0KLWludAotY2hpbGRfeGZlcl9tZW1vcnkgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpvdXIsIGludCBsZW4sCi0JCSAgIGludCB3cml0ZSwgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldCkKLXsKLSAgRFdPUkQgZG9uZTsKLSAgaWYgKHdyaXRlKQotICAgIHsKLSAgICAgIERFQlVHX01FTSAoKCJnZGI6IHdyaXRlIHRhcmdldCBtZW1vcnksICVkIGJ5dGVzIGF0IDB4JTA4eFxuIiwKLQkJICBsZW4sIG1lbWFkZHIpKTsKLSAgICAgIFdyaXRlUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwgKExQVk9JRCkgbWVtYWRkciwgb3VyLAotCQkJICBsZW4sICZkb25lKTsKLSAgICAgIEZsdXNoSW5zdHJ1Y3Rpb25DYWNoZSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwgKExQQ1ZPSUQpIG1lbWFkZHIsIGxlbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgREVCVUdfTUVNICgoImdkYjogcmVhZCB0YXJnZXQgbWVtb3J5LCAlZCBieXRlcyBhdCAweCUwOHhcbiIsCi0JCSAgbGVuLCBtZW1hZGRyKSk7Ci0gICAgICBSZWFkUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwgKExQQ1ZPSUQpIG1lbWFkZHIsIG91ciwgbGVuLAotCQkJICZkb25lKTsKLSAgICB9Ci0gIHJldHVybiBkb25lOwotfQotCi12b2lkCi1jaGlsZF9raWxsX2luZmVyaW9yICh2b2lkKQotewotICBDSEVDSyAoVGVybWluYXRlUHJvY2VzcyAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwgMCkpOwotCi0gIGZvciAoOzspCi0gICAgewotICAgICAgY29udGludWVfc3RhdHVzID0gREJHX0NPTlRJTlVFOwotICAgICAgaWYgKCFjaGlsZF9jb250aW51ZSAoLTEpKQotCWJyZWFrOwotICAgICAgaWYgKCFXYWl0Rm9yRGVidWdFdmVudCAoJmN1cnJlbnRfZXZlbnQsIElORklOSVRFKSkKLQlicmVhazsKLSAgICAgIGlmIChjdXJyZW50X2V2ZW50LmR3RGVidWdFdmVudENvZGUgPT0gRVhJVF9QUk9DRVNTX0RFQlVHX0VWRU5UKQotCWJyZWFrOwotICAgIH0KLQotICBDSEVDSyAoQ2xvc2VIYW5kbGUgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUpKTsKLQotICAvKiB0aGlzIG1heSBmYWlsIGluIGFuIGF0dGFjaGVkIHByb2Nlc3Mgc28gZG9uJ3QgY2hlY2suICovCi0gICh2b2lkKSBDbG9zZUhhbmRsZSAoY3VycmVudF90aHJlYWQtPmgpOwotICB0YXJnZXRfbW91cm5faW5mZXJpb3IgKCk7CS8qIG9yIGp1c3QgY2hpbGRfbW91cm5faW5mZXJpb3I/ICovCi19Ci0KLXZvaWQKLWNoaWxkX3Jlc3VtZSAoaW50IHBpZCwgaW50IHN0ZXAsIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWcpCi17Ci0gIGludCBpOwotICB0aHJlYWRfaW5mbyAqdGg7Ci0KLSAgREVCVUdfRVhFQyAoKCJnZGI6IGNoaWxkX3Jlc3VtZSAocGlkPSVkLCBzdGVwPSVkLCBzaWc9JWQpO1xuIiwKLQkgICAgICAgcGlkLCBzdGVwLCBzaWcpKTsKLQotICAvKiBHZXQgY29udGV4dCBmb3IgY3VycmVudGx5IHNlbGVjdGVkIHRocmVhZCAqLwotICB0aCA9IHRocmVhZF9yZWMgKGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwgRkFMU0UpOwotICBpZiAoc3RlcCkKLSAgICB7Ci0jaWZkZWYgaTM4NgotICAgICAgLyogU2luZ2xlIHN0ZXAgYnkgc2V0dGluZyB0IGJpdCAqLwotICAgICAgY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChQU19SRUdOVU0pOwotICAgICAgdGgtPmNvbnRleHQuRUZsYWdzIHw9IEZMQUdfVFJBQ0VfQklUOwotI2VuZGlmCi0gICAgfQotCi0gIGlmICh0aC0+Y29udGV4dC5Db250ZXh0RmxhZ3MpCi0gICAgewotICAgICAgQ0hFQ0sgKFNldFRocmVhZENvbnRleHQgKHRoLT5oLCAmdGgtPmNvbnRleHQpKTsKLSAgICAgIHRoLT5jb250ZXh0LkNvbnRleHRGbGFncyA9IDA7Ci0gICAgfQotCi0gIC8qIEFsbG93IGNvbnRpbnVpbmcgd2l0aCB0aGUgc2FtZSBzaWduYWwgdGhhdCBpbnRlcnJ1cHRlZCB1cy4KLSAgICAgT3RoZXJ3aXNlIGNvbXBsYWluLiAqLwotCi0gIGNoaWxkX2NvbnRpbnVlIChwaWQpOwotfQotCi1zdGF0aWMgdm9pZAotY2hpbGRfcHJlcGFyZV90b19zdG9yZSAoKQotewotICAvKiBEbyBub3RoaW5nLCBzaW5jZSB3ZSBjYW4gc3RvcmUgaW5kaXZpZHVhbCByZWdzICovCi19Ci0KLXN0YXRpYyBpbnQKLWNoaWxkX2Nhbl9ydW4gKCkKLXsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGlsZF9jbG9zZSAoKQotewotICBERUJVR19FVkVOVFMgKCgiZ2RiOiBjaGlsZF9jbG9zZSwgaW5mZXJpb3JfcGlkPSVkXG4iLCBpbmZlcmlvcl9waWQpKTsKLX0KLQotc3RydWN0IHRhcmdldF9vcHMgY2hpbGRfb3BzOwotCi1zdGF0aWMgdm9pZAotaW5pdF9jaGlsZF9vcHMgKHZvaWQpCi17Ci0gIGNoaWxkX29wcy50b19zaG9ydG5hbWUgPSAiY2hpbGQiOwotICBjaGlsZF9vcHMudG9fbG9uZ25hbWUgPSAiV2luMzIgY2hpbGQgcHJvY2VzcyI7Ci0gIGNoaWxkX29wcy50b19kb2MgPSAiV2luMzIgY2hpbGQgcHJvY2VzcyAoc3RhcnRlZCBieSB0aGUgXCJydW5cIiBjb21tYW5kKS4iOwotICBjaGlsZF9vcHMudG9fb3BlbiA9IGNoaWxkX29wZW47Ci0gIGNoaWxkX29wcy50b19jbG9zZSA9IGNoaWxkX2Nsb3NlOwotICBjaGlsZF9vcHMudG9fYXR0YWNoID0gY2hpbGRfYXR0YWNoOwotICBjaGlsZF9vcHMudG9fZGV0YWNoID0gY2hpbGRfZGV0YWNoOwotICBjaGlsZF9vcHMudG9fcmVzdW1lID0gY2hpbGRfcmVzdW1lOwotICBjaGlsZF9vcHMudG9fd2FpdCA9IGNoaWxkX3dhaXQ7Ci0gIGNoaWxkX29wcy50b19mZXRjaF9yZWdpc3RlcnMgPSBjaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnM7Ci0gIGNoaWxkX29wcy50b19zdG9yZV9yZWdpc3RlcnMgPSBjaGlsZF9zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnM7Ci0gIGNoaWxkX29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gY2hpbGRfcHJlcGFyZV90b19zdG9yZTsKLSAgY2hpbGRfb3BzLnRvX3hmZXJfbWVtb3J5ID0gY2hpbGRfeGZlcl9tZW1vcnk7Ci0gIGNoaWxkX29wcy50b19maWxlc19pbmZvID0gY2hpbGRfZmlsZXNfaW5mbzsKLSAgY2hpbGRfb3BzLnRvX2luc2VydF9icmVha3BvaW50ID0gbWVtb3J5X2luc2VydF9icmVha3BvaW50OwotICBjaGlsZF9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQ7Ci0gIGNoaWxkX29wcy50b190ZXJtaW5hbF9pbml0ID0gdGVybWluYWxfaW5pdF9pbmZlcmlvcjsKLSAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luZmVyaW9yID0gdGVybWluYWxfaW5mZXJpb3I7Ci0gIGNoaWxkX29wcy50b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgPSB0ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQ7Ci0gIGNoaWxkX29wcy50b190ZXJtaW5hbF9vdXJzID0gdGVybWluYWxfb3VyczsKLSAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luZm8gPSBjaGlsZF90ZXJtaW5hbF9pbmZvOwotICBjaGlsZF9vcHMudG9fa2lsbCA9IGNoaWxkX2tpbGxfaW5mZXJpb3I7Ci0gIGNoaWxkX29wcy50b19sb2FkID0gMDsKLSAgY2hpbGRfb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSAwOwotICBjaGlsZF9vcHMudG9fY3JlYXRlX2luZmVyaW9yID0gY2hpbGRfY3JlYXRlX2luZmVyaW9yOwotICBjaGlsZF9vcHMudG9fbW91cm5faW5mZXJpb3IgPSBjaGlsZF9tb3Vybl9pbmZlcmlvcjsKLSAgY2hpbGRfb3BzLnRvX2Nhbl9ydW4gPSBjaGlsZF9jYW5fcnVuOwotICBjaGlsZF9vcHMudG9fbm90aWNlX3NpZ25hbHMgPSAwOwotICBjaGlsZF9vcHMudG9fdGhyZWFkX2FsaXZlID0gd2luMzJfY2hpbGRfdGhyZWFkX2FsaXZlOwotICBjaGlsZF9vcHMudG9fc3RvcCA9IGNoaWxkX3N0b3A7Ci0gIGNoaWxkX29wcy50b19zdHJhdHVtID0gcHJvY2Vzc19zdHJhdHVtOwotICBjaGlsZF9vcHMuRE9OVF9VU0UgPSAwOwotICBjaGlsZF9vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAxOwotICBjaGlsZF9vcHMudG9faGFzX21lbW9yeSA9IDE7Ci0gIGNoaWxkX29wcy50b19oYXNfc3RhY2sgPSAxOwotICBjaGlsZF9vcHMudG9faGFzX3JlZ2lzdGVycyA9IDE7Ci0gIGNoaWxkX29wcy50b19oYXNfZXhlY3V0aW9uID0gMTsKLSAgY2hpbGRfb3BzLnRvX3NlY3Rpb25zID0gMDsKLSAgY2hpbGRfb3BzLnRvX3NlY3Rpb25zX2VuZCA9IDA7Ci0gIGNoaWxkX29wcy50b19tYWdpYyA9IE9QU19NQUdJQzsKLX0KLQotdm9pZAotX2luaXRpYWxpemVfaW5mdGFyZyAoKQotewotICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYzsKLSAgaW5pdF9jaGlsZF9vcHMgKCk7Ci0KLSAgYWRkX3Nob3dfZnJvbV9zZXQKLSAgICAoYWRkX3NldF9jbWQgKCJuZXctY29uc29sZSIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAotCQkgIChjaGFyICopICZuZXdfY29uc29sZSwKLQkJICAiU2V0IGNyZWF0aW9uIG9mIG5ldyBjb25zb2xlIHdoZW4gY3JlYXRpbmcgY2hpbGQgcHJvY2Vzcy4iLAotCQkgICZzZXRsaXN0KSwKLSAgICAgJnNob3dsaXN0KTsKLQotICBhZGRfc2hvd19mcm9tX3NldAotICAgIChhZGRfc2V0X2NtZCAoIm5ldy1ncm91cCIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAotCQkgIChjaGFyICopICZuZXdfZ3JvdXAsCi0JCSAgIlNldCBjcmVhdGlvbiBvZiBuZXcgZ3JvdXAgd2hlbiBjcmVhdGluZyBjaGlsZCBwcm9jZXNzLiIsCi0JCSAgJnNldGxpc3QpLAotICAgICAmc2hvd2xpc3QpOwotCi0gIGFkZF9zaG93X2Zyb21fc2V0Ci0gICAgKGFkZF9zZXRfY21kICgiZGVidWdleGVjIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0JCSAgKGNoYXIgKikgJmRlYnVnX2V4ZWMsCi0JCSAgIlNldCB3aGV0aGVyIHRvIGRpc3BsYXkgZXhlY3V0aW9uIGluIGNoaWxkIHByb2Nlc3MuIiwKLQkJICAmc2V0bGlzdCksCi0gICAgICZzaG93bGlzdCk7Ci0KLSAgYWRkX3Nob3dfZnJvbV9zZXQKLSAgICAoYWRkX3NldF9jbWQgKCJkZWJ1Z2V2ZW50cyIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAotCQkgIChjaGFyICopICZkZWJ1Z19ldmVudHMsCi0JCSAgIlNldCB3aGV0aGVyIHRvIGRpc3BsYXkga2VybmVsIGV2ZW50cyBpbiBjaGlsZCBwcm9jZXNzLiIsCi0JCSAgJnNldGxpc3QpLAotICAgICAmc2hvd2xpc3QpOwotCi0gIGFkZF9zaG93X2Zyb21fc2V0Ci0gICAgKGFkZF9zZXRfY21kICgiZGVidWdtZW1vcnkiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKLQkJICAoY2hhciAqKSAmZGVidWdfbWVtb3J5LAotCQkgICJTZXQgd2hldGhlciB0byBkaXNwbGF5IG1lbW9yeSBhY2Nlc3NlcyBpbiBjaGlsZCBwcm9jZXNzLiIsCi0JCSAgJnNldGxpc3QpLAotICAgICAmc2hvd2xpc3QpOwotCi0gIGFkZF9zaG93X2Zyb21fc2V0Ci0gICAgKGFkZF9zZXRfY21kICgiZGVidWdleGNlcHRpb25zIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0JCSAgKGNoYXIgKikgJmRlYnVnX2V4Y2VwdGlvbnMsCi0JICAgICAgICJTZXQgd2hldGhlciB0byBkaXNwbGF5IGtlcm5lbCBleGNlcHRpb25zIGluIGNoaWxkIHByb2Nlc3MuIiwKLQkJICAmc2V0bGlzdCksCi0gICAgICZzaG93bGlzdCk7Ci0KLSAgYWRkX3RhcmdldCAoJmNoaWxkX29wcyk7Ci19Ci0KLS8qIERldGVybWluZSBpZiB0aGUgdGhyZWFkIHJlZmVyZW5jZWQgYnkgInBpZCIgaXMgYWxpdmUKLSAgIGJ5ICJwb2xsaW5nIiBpdC4gIElmIFdhaXRGb3JTaW5nbGVPYmplY3QgcmV0dXJucyBXQUlUX09CSkVDVF8wCi0gICBpdCBtZWFucyB0aGF0IHRoZSBwaWQgaGFzIGRpZWQuICBPdGhlcndpc2UgaXQgaXMgYXNzdW1lZCB0byBiZSBhbGl2ZS4gKi8KLXN0YXRpYyBpbnQKLXdpbjMyX2NoaWxkX3RocmVhZF9hbGl2ZSAoaW50IHBpZCkKLXsKLSAgcmV0dXJuIFdhaXRGb3JTaW5nbGVPYmplY3QgKHRocmVhZF9yZWMgKHBpZCwgRkFMU0UpLT5oLCAwKSA9PSBXQUlUX09CSkVDVF8wID8KLSAgICBGQUxTRSA6IFRSVUU7Ci19Ci0KLS8qIENvbnZlcnQgcGlkIHRvIHByaW50YWJsZSBmb3JtYXQuICovCi1jaGFyICoKLWN5Z3dpbl9waWRfdG9fc3RyIChpbnQgcGlkKQotewotICBzdGF0aWMgY2hhciBidWZbODBdOwotICBpZiAocGlkID09IGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQpCi0gICAgc3ByaW50ZiAoYnVmLCAicHJvY2VzcyAlZCIsIHBpZCk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChidWYsICJ0aHJlYWQgJWQuMHgleCIsIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIHBpZCk7Ci0gIHJldHVybiBidWY7Ci19Ci0jaWZkZWYgTk9UWUVUCi1DT1JFX0FERFIKLXdpbjMyX3JlYWRfZnAgKCkKLXsKLSAgU1RBQ0tGUkFNRSAqc2YgPSBjdXJyZW50X3RocmVhZC0+c2Y7Ci0gIAotICBtZW1zZXQgKCZzZiwgMCwgc2l6ZW9mKHNmKSk7Ci0gIHNmLT5BZGRyUEMuT2Zmc2V0ID0gY3VycmVudF90aHJlYWQtPmNvbnRleHQuRWlwOwotICBzZi0+QWRkclBDLk1vZGUgPSBBZGRyTW9kZUZsYXQ7Ci0gIHNmLT5BZGRyU3RhY2suT2Zmc2V0ID0gY3VycmVudF90aHJlYWQtPmNvbnRleHQuRXNwOwotICBzZi0+QWRkclN0YWNrLk1vZGUgPSBBZGRyTW9kZUZsYXQ7Ci0gIHNmLT5BZGRyRnJhbWUuT2Zmc2V0ID0gY3VycmVudF90aHJlYWQtPmNvbnRleHQuRWJwOwotICBpZiAoIVN0YWNrV2FsayAoSU1BR0VfRklMRV9NQUNISU5FX0kzODYsIGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCi0JCSAgY3VycmVudC0+dGhyZWFkLT5oLCBzZiwgTlVMTCwgTlVMTCwKLQkJICBTeW1GdW5jdGlvblRhYmxlQWNjZXNzLCBTeW1HZXRNb2R1bGVCYXNlLCBOVUxMKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIChDT1JFX0FERFIpIHNmLkFkZHJGcmFtZS5PZmZzZXQ7Ci19Ci0KLUNPUkVfQUREUgotY2hpbGRfZnJhbWVfY2hhaW4oc3RydWN0IGZyYW1lX2luZm8gKnRoaXNmcmFtZSkKLXsKLSAgU1RBQ0tGUkFNRSAqc2YgPSBjdXJyZW50LT50aHJlYWQtPnNmOwotI2lmIDAKLSAgc2YuQWRkclBDLk9mZnNldCA9IHRoaXNmcmFtZS0+cGM7Ci0gIHNmLkFkZHJQQy5Nb2RlID0gQWRkck1vZGVGbGF0OwotICBzZi5BZGRyU3RhY2suT2Zmc2V0ID0gdGhpc2ZyYW1lLT47Ci0gIHNmLkFkZHJTdGFjay5Nb2RlID0gQWRkck1vZGVGbGF0OwotICBzZi5BZGRyRnJhbWUuT2Zmc2V0ID0gY3gtPkVicDsKLSNlbmRpZgotICBpZiAoIVN0YWNrV2FsayAoSU1BR0VfRklMRV9NQUNISU5FX0kzODYsIGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCi0JCSAgY3VycmVudC0+dGhyZWFkLT5oLCAmc2YsIE5VTEwsIE5VTEwsCi0JCSAgU3ltRnVuY3Rpb25UYWJsZUFjY2VzcywgU3ltR2V0TW9kdWxlQmFzZSwgTlVMTCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiAoQ09SRV9BRERSKSBzZi0+QWRkckZyYW1lLk9mZnNldDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3Byb2YvLmdkYmluaXQgYi9ncHJvZi8uZ2RiaW5pdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxOTQ3Mi4uMDAwMDAwMAotLS0gYS9ncHJvZi8uZ2RiaW5pdAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWRpciAuLgpkaWZmIC0tZ2l0IGEvZ3Byb2YvQ2hhbmdlTG9nIGIvZ3Byb2YvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTVlOWY0Li4wMDAwMDAwCi0tLSBhL2dwcm9mL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDEzNjMgKzAsMCBAQAotMTk5OS0wOS0yNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ21vbl9pby5jIChnbW9uX291dF9yZWFkKTogTWFrZSBzdXJlIHRoYXQgc2Vuc2libGUgdmFsdWVzCi0JYXJlIGV4dHJhY3RlZCBmcm9tIGEgcmF3IGhlYWRlci4KLQotMTk5OS0wOC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIEJyYWQgTHVjaWVyIDxsdWNpZXJAbWF0aC5wdXJkdWUuZWR1PjoKLQkqIGNvcmVmaWxlLmMgKGNvcmVfY3JlYXRlX2xpbmVfc3ltcyk6IEFkZCBjYXN0IGZvciBwcmludGYuCi0KLTE5OTktMDctMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBNYXJrIEVsYnJlY2h0OgotCSogY29uZmlndXJlLmJhdDogUmVtb3ZlOyBvYnNvbGV0ZS4KLQotMTk5OS0wNy0xNSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQnVtcCB2ZXJzaW9uIG51bWJlciB0byAyLjkuNS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvcmVmaWxlLmMgKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMpOiBBZGQgQVRUUklCVVRFRF9VTlVTRUQuCi0JKiBzeW0taWRzLmMgKG5vbl9leGlzdGVudF9maWxlKTogRnVsbHkgaW5pdGlhbGl6ZSBzdHJ1Y3R1cmUuCi0KLTE5OTktMDctMDEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYW55IGZpbGVzOiBBZGQgY2FzdHMgaW4gbWFueSBwcmludCBzdGF0ZW1lbnRzIHRvIGNhc3QgYmZkX3ZtYQotCXZhbHVlcyB0byB1bnNpZ25lZCBsb25nIHdoZW4gY2FsbGluZyBwcmludGYuCi0JKiBNYWtlZmlsZS5hbSAoJChPQkpFQ1RTKSk6IEFkZCBnbW9uLmguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEp1biAxNCAxMDozNToyOCAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+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+bmFtZS4KLQotCSogZ3Byb2YuaCAoU1JDREVCVUcpOiBhZGRlZC4KLQotCSogc2VhcmNoX2xpc3QuYyAoc2VhcmNoX2xpc3RfYXBwZW5kKTogZGlyZWN0b3JpZXMgd2VyZSBhZGRlZCBpbiB3cm9uZwotCW9yZGVyLgotCi0JKiByZWltcGxlbWVudGVkIHNlbGVjdGlvbiBtZWNoYW5pc20gZnJvbSBncm91bmQgdXA7IGl0IGlzIG5vdyBwb3NzaWJsZQotCXRvIGFjY3VyYXRlbHkgY29udHJvbCB3aGF0IGdldHMgaW5jbHVkZWQvZXhjbHVkZWQgaW4gZWFjaCBvZiB0aGUKLQlvdXRwdXQgc3R5bGVzOwlhICJzeW1ib2wtc3BlY2lmaWNhdGlvbiIgKHNwZWMpIGlzIHRoZSBiYXNpYyBtZWFucwotCXRvIHNlbGVjdCBhIHNldCBvZiBzeW1ib2xzOyBhIHNwZWMgaGFzIHRoZSBzeW50YXg6Ci0KLQkgIHNwZWMgPT0gKEZJTEVOQU1FOihGVU5DTkFNRXxMSU5FX05VTSkgfCBOQU1FKS4KLQkgIGFyYyA9PSBzcGVjL3NwZWMuCi0KLQlhbnkgb2YgdGhlIHRlcm1pbmFsIHN5bWJvbHMgY2FuIGJlIGVtcHR5LCBpbiB3aGljaCBjYXNlIHRoZXkKLQltYXRjaCBhbnl0aGluZyAod2lsZGNhcmRzKS4gIE5BTUUgaXMgaW50ZXJwcmV0ZWQgYXMgYSBGSUxFTkFNRQotCWlmIGl0IGNvbnRhaW5zIGEgZG90IChlLmcuLCBmb28uYyksIGFzIExJTkVfTlVNIGlmIGl0IHN0YXJ0cwotCXdpdGggYSBkaWdpdCwgYW5kIGFzIEZVTkNOQU1FIG90aGVyd2lzZS4KLQotCUZvciBleGFtcGxlLCB0byBnZXQgYSBjYWxsLWdyYXBoIGRpc3BsYXkgdGhhdCBpZ25vcmVzIGFyY3MKLQlmcm9tIGZvbygpIHRvIGJhcigpLCB5b3UnZCBzYXkgIi0tbm8tZ3JhcGg9Zm9vL2JhciI7IHRvCi0Jc2hvdyBvbmx5IGFyY3MgaW50byBiYXIoKSAobm8gbWF0dGVyIHdoYXQgdGhlIGNhbGxlciksCi0JeW91J2Qgc2F5ICItLWdyYXBoPS9iYXIiOyBhbmQgdG8gZ2V0IGEgY2FsbC1ncmFwaCB3aXRob3V0Ci0JYW55IGFyYyBpbmZvLCB5b3UnZCBzYXkgIi0tZ3JhcGg9LyI7ICBzaW1pbGFybHksIHRvCi0JZ2V0IGEgZmxhdCBwcm9maWxlIHdpdGhvdXQgbWNvdW50LCB5b3UnZCBzYXkgIi0tbm8tZmxhdD1tY291bnQiCi0JYW5kIHRvIGdldCBhIGZsYXQgcHJvZmlsZSB0aGF0IHNob3dzIGluY2x1ZGVzIGFsbCBmdW5jdGlvbnMKLQl5b3UnZCBzYXkgIi0tZmxhdD0iIiIgKGkuZS4sIGFuIGVtcHR5IHNwZWMpCi0KLQkqIGhpc3QuYyAoaGlzdF9wcmludCk6IHRvcF90aW1lIHdhc24ndCBpbml0aWFsaXplZCB0byAwLjAuCi0KLQlGcmkgU2VwCSA5IDAxOjEwOjIxIDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQotCi0JKiBnbW9uX291dC5oOiBhbGwgaGVhZGVycyBub3cgZGVjbGFyZWQgaW4gdGVybXMgb2YgY2hhcmFjdGVycwotCSAgdG8gYXZvaWQgZ2V0dGluZyBpbnRvIHRyb3VibGUgd2l0aCBkaWZmZXJlbnQgY29tcGlsZXJzIGludHJvZHVjaW5nCi0JICBkaWZmZXJlbnQgYW1vdW50IG9mIHBhZGRpbmc7IHRoZSBjb2RlIGFscmVhZHkgYWNjZXNzZWQgdGhlIGZpZWxkcwotCSAgdGhyb3VnaCBiZmQgZnVuY3Rpb25zLCBzbyB0aGF0IGRpZG4ndCBoYXZlIHRvIGNoYW5nZS4KLQotCSogaGlzdC5jIChoaXN0X3JlYWRfcmVjLCBoaXN0X3dyaXRlX3JlYyk6IGFkZGVkIHN1cHBvcnQgZm9yCi0JICBjb2xsZWN0aW9uIHBjIGhpc3RvZ3JhbXMgbWVhc3VyaW5nIHF1YW50aXRpZXMgb3RoZXIgdGhhbiB0aW1lOwotCSAgdGhlIGhpc3RvZ3JhbSBoZWFkZXIgbm93IGluY2x1ZGVzIGEgZmllbGQgdGhhdCBzcGVjaWZpZXMgdGhlCi0JICBkaW1lbnNpb24gb2YgdGhlIHF1YW50aXR5IG1lYXN1cmVkIGJ5IHRoZSBoaXN0b2dyYW0gYmlucwotCSAgKG5vcm1hbGx5LCB0aGlzIGlzICJzZWNvbmRzIiwgYnV0IG90aGVyIG1lYW5pbmdmdWwgZGltZW5zaW9ucwotCSAgIGluY2x1ZGUgc3VjaCB0aGluZ3MgYXMgIkktY2FjaGUgbWlzc2VzIiwgImluc3RydWN0aW9uIGlzc3VlIHN0YWxscyIKLQkgICBldGMuKTsgdGhlcmUgaXMgYWxzbyBhIGZpZWxkIHRvIHNwZWNpZnkgYSBvbmUtY2hhcmFjdGVyCi0JICBhYmJyZXZpYXRpb24gZm9yIHRoZSBkaW1lbnNpb247IGluIHRoZSBjYXNlIG9mIHRpbWUsIHRoaXMgd291bGQKLQkgIGJlICdzJzsgaW4gbW9zdCBvdGhlciBjYXNlcyBpdCBwcm9iYWJseSB3b3VsZCBiZSAnMScgKG5vdCBhIHBoeXNpY2FsCi0JICBkaW1lbnNpb24pLgotCi0JVGh1IFNlcAkgOCAxNjowNTowOCAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogZ3Byb2YuYywgZ21vbl9pby5bY2hdOiBCU0RfQ09NUEFUSUJMRSBpcyBnb25lIGFuZCBuZXdfZmlsZV92ZXJzaW9uCi0JICBoYXMgYmVjb21lIG9sZF9maWxlX3ZlcnNpb247IGdtb25faW8uYyBub3cgYWx3YXlzIHN1cHBvcnRzIG9sZC1zdHlsZQotCSAgZ21vbi5vdXQgZmlsZXM7IGl0IGZpcnN0IHRyaWVzIHRvIHJlYWQgZ21vbi5vdXQgYXMgYSBuZXcgdmVyc2lvbgotCSAgZmlsZSwgaWYgdGhhdCBmYWlscywgaXQgdHJpZXMgdG8gcmVhZCBpdCBpbiB0aGUgb2xkIGZvcm1hdDsKLQkgIGFsdGhvdWdoIG5vdCB2ZXJ5IGxpa2VseSwgaXQgaXMgcG9zc2libGUgZm9yIGdwcm9mIHRvIG1pc3Rha2UgYW4KLQkgIG9sZC1zdHlsZSBmaWxlIGFzIGEgbmV3IG9uZSAodGhlIGZpcnN0IDQgYnl0ZXMgd291bGQgaGF2ZSB0bwotCSAgYmUgImdtb24iLS0taW5jbHVkaW5nIHRoZSB0cmFpbGluZyAnXDAnKTsgaW4gdGhhdCBjYXNlLCBpdCBpcwotCSAgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgLS1vbGQtZmlsZS12ZXJzaW9uCi0KLQkqIGdwcm9mLmg6IHJlbW92ZWQgZGVwZW5kZW5jeSBvbiBTWVNWOyB0aGUgY29kZSBub3cgYWx3YXlzIHVzZXMKLQkgIHN0cnJjaHIoKSwgbWVtc2V0KCksIGFuZCBtZW1jcHkoKSBhbmQgZG9lcyBub3QgaW5jbHVkZSBlaXRoZXIKLQkgIG9mIHN0cmluZy5oIG9yIHN0cmluZ3MuaDsgdGhpcyBzaG91bGQgbWFrZSBncHJvZiBjb21waWxlIG9uCi0JICBhbnkgKFVuaXgpIHN5c3RlbSB3aXRob3V0IGNvbmZpZ3VyYXRpb24gKHBlciBzdWdnZXN0aW9uIG9mCi0JICByYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGdwcm9mLmMgKHVzYWdlKTogZml4ZWQgbG9jYXRpb24gb2YgLS1uZXctZmlsZS1mb3JtYXQgb3B0aW9uLgotCi0JKiBjZ19hcmNzLmMgKHByb3BhZ2F0ZV9mbGFncyk6IGZpeGVkIHR5cG8gaW4gZGVjbGFyYXRpb24uCi0KLQkqIGZsYXRfYmwubTogcmVtb3ZlZCBmb3JtZmVlZCBhdCBlbmQgb2YgZmlsZTsgdGhlIGZvcm0tZmVlZAotCSAgaXMgbm93IHByaW50ZWQgY2dfcHJpbnQuYyBvbmx5IHdoZW4gbmVjZXNzYXJ5LgotCi0JKiBtYWpvciByZXdyaXRlIG9mIGdwcm9mLS0tdG9vIG1hbnkgY2hhbmdlcyB0byBtZW50aW9uIGFsbCBvZgotCSAgdGhlbS4JIG5ldyBmZWF0dXJlczoKLQotCSsgLWwgbm93IHJlcXVlc3RzIHByb2ZpbGluZyBhdCB0aGUgbGluZSBsZXZlbCAoYXMgb3Bwb3NlZAotCSAgdG8gZnVuY3Rpb24gbGV2ZWwpOyBpbiB0aGlzIG1vZGUsIGdwcm9mIGNyZWF0ZXMgYSAic3ltYm9sIgotCSAgKGFrYSBuYW1lLWxpc3QgZW50cnkpIGZvciBlYWNoIGxpbmUgb2Ygc291cmNlIGNvZGUsIGluc3RlYWQKLQkgICBvZiBvbmUgcGVyIGZ1bmN0aW9uKQotCi0JKyBzdXBwb3J0IGZvciBhIG5ldyBnbW9uLm91dCBmaWxlIGZvcm1hdDsgdGhlIG5ldyBmb3JtYXQgCi0JICBjb25zaXN0cyBvZiBhIGhlYWRlciB3aXRoIGEgbWFnaWMgYW5kIGEgdmVyc2lvbiBudW1iZXIsCi0JICBmb2xsb3dlZCBieSBhIHNlcXVlbmNlIG9mIHByb2ZpbGUgZGF0YTsgcHJvZmlsZSBkYXRhCi0JICBjYW4gYW55IG9mOiAoYSkgUEMgaGlzdG9ncmFtLCAoYikgY2FsbC1ncmFwaCBhcmNzLCBvcgotCSAgKGMpIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHM7IHRoZSB2ZXJzaW9uIG51bWJlciBtYWtlcwotCSAgaXQgcG9zc2libGUgdG8gZXh0ZW5kIGdtb24ub3V0IGluIGEgYmFja3dhcmRzIGNvbXBhdGlibGUKLQkgIGZhc2hpb24KLQotCSsgc3VwcG9ydCBmb3IgdGNvdiBzdHlsZSBhbm5vdGF0ZWQgb3V0cHV0OiBpZiB0aGUgZ21vbi5vdXQgZmlsZQotCSAgY29udGFpbnMgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cywgdGhlIHVzZXIgY2FuIHJlcXVlc3QKLQkgIHRoZSBnZW5lcmF0aW9uIG9mIGFubm90YXRlZCBzb3VyY2UgZmlsZXMsIG11Y2ggbGlrZSBTdW4ncwotCSAgdGNvdiB1c2VkIHRvIGRvCi0KLQkrIGxvbmcgb3B0aW9ucwotCi0JKyBuZXcgc2NoZW1lIHRvIHN1cHByZXNzIHN5bWJvbHMgdGhhdCBhcmVuJ3QgZnVuY3Rpb24gbmFtZXMKLQkgIChlLmcuLCBhdm9pZHMgbWlzdGFraW5nIGEgZ290byBsYWJlbCBhcyBhIGZ1bmN0aW9uKQotCi0JKyByZW9yZ2FuaXplZCBzb3VyY2UgY29kZSB0byBtYWtlIGl0IG1vcmUgbWFuYWdhYmxlOyBhcyBhCi0JICBzaWRlIGVmZmVjdCwgZ3Byb2Ygbm93IGNvbXBpbGVzIGNsZWFubHkgd2l0aCAiZ2NjIC1XYWxsIgotCi0JVGh1IFNlcAkgMSAxNTo0Njo0OSAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogZ3Byb2YuYyAoZnVuY3N5bWJvbCk6IGJmZF9maW5kX25lYXJlc3RfbGluZSgpIGlzIG5vdyB1c2VkIGFzIGEKLQlmaW5hbCBjcm9zcy1jaGVjayB0byBkZXRlcm1pbmUgd2hldGhlciBhIHN0YXRpYyBzeW1ib2wgc2hvdWxkIGJlCi0JY29uc2lkZXJlZCBhcyBhIGZ1bmN0aW9uLW5hbWUuCi0KLQlGcmkgQXVnCSA1IDE5OjMyOjM2IDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQotCi0JKiBnbW9uX2lvLmMgKGdtb25fb3V0X3JlYWQpOiByZWNvZ25pemUgIi0iIGFzIHRoZSBmaWxlbmFtZSBmb3IKLQlzdGRpbjsgdGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbm5hIGtlZXAgZ21vbi5vdXQgZmlsZXMgY29tcHJlc3NlZDsKLQl0aGlzIHdheSB5b3UgY2FuICJnemNhdCIgdGhlIGNvbXByZXNzZWQgZmlsZSBpbnRvIGdwcm9mLgotCi0JKiBncHJvZi5jOiBmbGFnX21pbl9jb3VudCBub3cgaW5pdGlhbGl6ZWQgd2l0aCAxIGluc3RlYWQgb2YgMC4KLQotCSogYmFzaWNfYmxvY2tzLmMgKGJiX2Fubm90YXRlX3NvdXJjZSk6IGFkZGVkIHN1cHBvcnQgZm9yIGNyZWF0aW5nCi0JLnRjb3YgZmlsZXMgd2hlbiBvcHRpb24gZmxhZ19hbm5vdGF0ZV9tYWtlX2ZpbGVzIGlzIFRSVUUuCi0JKGFubm90YXRlX3dpdGhfY291bnQpOiBhbGwgY291bnRzIGxlc3MgdGhhbiB0aGUgbWluaW11bSBjb3VudAotCXNwZWNpZmllZCBieSAtbSBhcmUgbm93IGFubm90YXRlZCB3aXRoIGhhc2gtbWFya3MuCi0KLQkqIGdwcm9mLmMgKG1haW4pOiAtQSBpcyBub3cgZm9sbG93ZWQgYnkgYSBzdHJpbmcgb2Ygb3B0aW9uIGNoYXJzLgotCi0JKiBiYXNpY19ibG9ja3MuYyAoYW5ub3RhdGVfd2l0aF9jb3VudCk6IHJlcGxhY2VkIGItPmNvdW50IHdpdGgKLQljbnQuCi0KLQkqIHNvdXJjZS5jOiBmbGFnX2Fubm90YXRlX3NvdXJjZSByZXBsYWNlZCBieSBzb3VyY2VfbG9ja19tYXAuCi0KLQkqIHNvdXJjZS5oOiBzb3VyY2VfbG9ja19tYXAgYWRkZWQuCi0KLQkqIGdwcm9mLmMgKG1haW4pOiBuZXcgY29tbWFuZC1saW5lIHN5bnRheDogLVMgc2ltcGx5IHNwZWNpZmllcwotCXdoaWNoIHNvdXJjZS1maWxlcyB1c2VyIGlzIGludGVyZXN0ZWQgaW47IC1BIHJlcXVlc3RzIGFubm90YXRlZAotCXNvdXJjZSBmaWxlcyBhbmQgLUFBIHJlcXVlc3RzIHRoYXQgYWxsIGxpbmVzIGluIGEgc291cmNlIGZpbGUKLQlhcmUgYW5ub3RhdGVkLgotCi0JVGh1IEF1ZwkgNCAyMzoyNzowMyAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogYmFzaWNfYmxvY2tzLmMgKFBBVEhfTUFYKTogaWYgdW5kZWZpbmVkLCBkZWZpbmUgYXMgMTAyNC4KLQotCSogc3BhcmMuYywgaTM4Ni5jLCB0YWhvZS5jLCB2YXguYzogYWRkZWQgaW5jbHVkZSBvZiAidGltZV9oaXN0LmgiCi0Jc28gc19sb3dwYyBldGMuIGdldCBkZWNsYXJlZC4KLQotCSogYXJjcy5oIChkb2FyY3MpOiBjcmVhdGVkLgotCi0JKiBhcmNzLmM6IHJlb3JkZXJlZCBzdGF0aWMgZnVuY3Rpb25zIHN1Y2ggdGhhdCB0aGV5IGdldCBkZWZpbmVkCi0JYmVmb3JlIHVzZS4KLQotCSogZ3Byb2YuYyAobWFpbik6IGFkZGVkIG9wdGlvbnM6Ci0JICAgLUE6IHJlcXVlc3QgYW5ub3RhdGlvbiBvZiBhbGwgc291cmNlIGxpbmVzICh3aXRoIC1TKQotCSAgIC1tOiBtaW5pbXVtIGV4ZWN1dGlvbiBjb3VudCAod2l0aCBkZWZhdWx0IGJhc2ljLWJsb2NrIGRpc3BsYXkpCi0JICAgLU46IGZvcmNlIG5ldyBmaWxlIGZvcm1hdCAob25seSBpZiBCU0RfQ09NUEFUSUJMRSBpcyBkZWZpbmVkKQotCSAgIC1TOiBhbm5vdGF0ZSBzb3VyY2UgZmlsZQotCSAgIC10OiBzZXQgdGFibGUgbGVuZ3RoICh3aXRoIC1TKQotCi0JKiBNYWtlZmlsZSAoT0JKUyk6IGFkZGVkIGJhc2ljX2Jsb2Nrcy5vIGNhbGxfZ3JhcGgubyBnbW9uX2lvLm8KLQlzb3VyY2UubyB0aW1lX2hpc3QubwotCi0JRnJpIEp1bAkgMSAxNToyMzo1MCAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogZ3Byb2YuYyAoYXNnbnNhbXBsZXMpOiBjb21wdXRhdGlvbiBvZiAicGNsIiBhbmQgInBjaCIgZGVwZW5kZWQKLQlvbiB0aGUgZmFjdCBiZWluZyBhYmxlIHRvIHN0b3JlIGEgbG9uZyBpbiBhIGRvdWJsZSB3aXRob3V0IGxvc3Mgb2YKLQlwcmVjaXNpb247IHRoaXMgZG9lcyBub3QgaG9sZCBvbiBtYWNoaW5lcyB3aXRoIDY0IGJpdCBsb25ncyBhbmQgNjQKLQliaXQgZG91Ymxlcy4KLQotRnJpIE9jdCAyMSAxODo1ODowMiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBwcmludGdwcm9mLmMgKGZsYXRwcm9maGVhZGVyKTogQWx3YXlzIHNldCB0b3RpbWUgdG8gMS4wIGlmIG5vdAotCWdyZWF0ZXIgdGhhbiAwLjAuICBTdWdnZXN0ZWQgYnkgSGFyb2xkIEFzc2luawotCTxjYXJsb0BzZy50bi50dWRlbGZ0Lm5sPi4KLQotRnJpIFNlcCAyMyAxNTowNjo0NSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBwcmludGdwcm9mLmMgKHByaW50cHJvZik6IFVzZSBmcmVlLCBub3QgY2ZyZWUuCi0JKHByaW50Z3Byb2YsIHByaW50aW5kZXgpOiBEaXR0by4KLQotVGh1IFNlcCAgMSAxMDo0MDo0NSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ3Byb2YuaCAoa2Zyb21saXN0LCBrdG9saXN0LCBmbGlzdCwgRmxpc3QsIGVsaXN0LCBFbGlzdCk6IE1ha2UKLQlkZWNscyBleHRlcm4gdG8ga2VlcCBuYXRpdmUgSFAgY29tcGlsZXIgcXVpZXQuCi0KLVR1ZSBBdWcgMzAgMTE6MTI6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBncHJvZi5jIChmdW5jc3ltYm9sKTogSWdub3JlIF9fX2dudV9jb21waWxlZCBhcyB3ZWxsIGFzCi0JX19nbnVfY29tcGlsZWQsIGZvciB0aGUgYmVuZWZpdCBvZiBzeXN0ZW1zIHdoaWNoIGFkZCBhIGxlYWRpbmcKLQl1bmRlcnNjb3JlLgotCi1XZWQgQXVnIDI0IDEyOjQ5OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgaTM4Ni0qLSogdG8gaVszNDVdODYtKi0qLgotCi1TdW4gSnVsIDEwIDAwOjM1OjMxIDE5OTQgIElhbiBEYWxsICAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KQotCi0JKiBuczUzMi5jLCBuczUzMi5oOiBOZXcgRmlsZXMuIG5zNTMyIHN1cHBvcnQuCi0KLQkqIGNvbmZpZy9tdC1uczUzMjogTmV3IEZpbGUuIG5zNTMyIHN1cHBvcnQuCi0KLQkqIGdwcm9mLmM6IHVzZXIgcmVnaXN0ZXIgaW50IGkgaW5zdGVhZCBvZiBkZWZhdWx0aW5nIHRoZSBpbnQuCi0JQWxsb3dzIGNvbXBpbGF0aW9uIHdpdGggLURyZWdpc3Rlcj0gZm9yIGRlYnVnZ2luZy4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbnM1MzIgc3VwcG9ydC4KLQotVGh1IEp1biAyMyAxMToyMjo0MSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKGdwcm9mKTogRGVwZW5kIG9uICQoTElCUykuCi0KLUZyaSBNYXkgMjcgMTI6MjQ6NTcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCUZyb20gYmludXRpbHMtMi40IHJlbGVhc2U6Ci0KLQlXZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogY29uZmlndXJlLmJhdDogW25ld10gYnVpbGQgbWFrZWZpbGUgZnJvbSBtYWtlZmlsZS5pbiAoZG9zKQotCSogaGVydHouYzogYWxsb3cgc3RhdGljIEhFUlRaIChtc2RvcyBuZWVkcyBpdCkKLQkqIGdwcm9mLmM6IGFsbG93IHRhcmdldCB0byBzZWxlY3QgInIiIG9yICJyYiIgZm9yIGZvcGVuCi0JKiBncHJvZi5jOiBpZ25vcmUgX19nbnVfY29tcGlsZWQgc3ltYm9scwotCSogaTM4Ni5oOiBkZmluZSBGT1BFTl9SQiB0byAicmIiIGZvciBkb3MuCi0KLVR1ZSBNYXkgMTcgMTU6MzA6MjIgMTk5NCAgRS4gTWljaGFlbCBTbWl0aCAoZW1zQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICgubS5jOik6ICBBZGRlZCAuU1VGRklYRVMgOiAubSAKLQlzbyBmbGF0X2JsLmMgd291bGQgbWFrZSBmcm9tIGZsYXRfYmwubSBmaWxlLgotCi1UaHUgTWF5ICA1IDE5OjIzOjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBDaGVjayBmb3IgZ3Byb2YuaW5mbyBpbiBidWlsZCBkaXIsCi0JZmFsbCBiYWNrIHRvIHNyY2Rpci4gIERlcGVuZCBvbiBpdC4KLQotCSogZ3Byb2YuaCAoVFJVRSwgRkFMU0UpOiBBbHdheXMgdXNlIHVuZGVmIGJlZm9yZSBkZWZpbmluZyB0aGVtLgotCi1Nb24gQXByICA0IDIzOjQ3OjMwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbiAoTVlfTUFDSElORSk6IFJlbmFtZWQgZnJvbSBNQUNISU5FIHRvIGF2b2lkIGxvc2luZwotCW1ha2VzIChvc2YxKSBpbiB3aGljaCB0aGUgdmFsdWUgb2YgTUFDSElORSBjYW4gbm90IGJlIGNoYW5nZWQuCi0JKiBjb25maWcvKi5tdDogQ2hhbmdlZCBhcHByb3ByaWF0ZWx5LgotCi1XZWQgTWFyIDMwIDE2OjEyOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuYyAoZ2V0c3ltdGFiKTogQ2hhbmdlIG5vc3ltcyB0byBsb25nLiAgUmVuYW1lCi0JZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCB0byBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZC4gIENoZWNrIGZvcgotCWVycm9ycyBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCi1UdWUgTWFyIDIyIDEwOjUwOjUyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBncHJvZi5jIChmdW5jc3ltYm9sKTogVXNlIGJmZF9nZXRfc3ltYm9sX2luZm8gaW5zdGVhZCBvZgotCWJmZF9kZWNvZGVfc3ltY2xhc3MuCi0KLVN1biBNYXIgMjAgMTU6NDA6MjEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluOiBBdm9pZCBidWcgaW4gaHB1eCBzZWQuCi0KLVdlZCBEZWMgMTUgMjA6MTY6NDAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBncHJvZi50ZXhpIChJbnZva2luZyk6IGFkZCB0ZXh0IGFib3V0IC12IGZsYWcKLQotCSogZ3Byb2YuMTogYWRkIHRleHQgYWJvdXQgLXYgZmxhZwotCi1XZWQgRGVjICA4IDE2OjU1OjA2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuYyAoVkVSU0lPTik6IGRlZmluZWQgYSB2ZXJzaW9uIG1hY3JvLCBwcmludCB0aGUgdmFsdWUgCi0Jd2hlbiB0aGUgLXYgb3B0aW9uIGlzIHVzZWQKLQotVHVlIEp1bCAgNiAxMDoxMTo1NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogSW5zdGFsbCBjb3JyZWN0bHkuCi0KLVRodSBKdW4gMjQgMTQ6NDM6MjIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBncHJvZi5jIChtYWluKTogR2V0IHdob2FtaSBmcm9tIGFyZ3YsIGluc3RlYWQgb2YgaGFyZGNvZGluZy4KLQlVc2UgaXQgaW4gdXNhZ2UgbWVzc2FnZS4gIFNwbGl0IHVzYWdlIG1lc3NhZ2UgdG8gZml0IGluIDgwIGNvbHMuCi0KLVN1biBKdW4gMjAgMjA6NTg6MDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBVbmRvIDE1IEp1bmUgY2hhbmdlLgotCi1XZWQgSnVuIDE2IDEyOjU0OjUzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGdtb24uaCwgZ3Byb2YuaDogc3RydWN0cyBvZiBjaGFycyB1c2VkIHRvIGhvbGQgZXh0ZXJuYWwKLQlyZXByZXNlbnRhdGlvbnMuCi0JKiBncHJvZi5jIChnZXRwZmlsZSwgb3BlbnBmaWxlLCByZWFkc2FtcGxlcyk6IFN3YXAgZGF0YSBpbiB1c2luZwotCW5ldyBzdHJ1Y3R1cmVzLgotCi1UdWUgSnVuIDE1IDIzOjA5OjE3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKC5jLm8pOiBMb29rIGluIC4uL2luY2x1ZGUsIG5vdCAuLi9iZmQsIGZvciBiZmQuaC4KLQotTW9uIEp1biAxNCAxNjoyMjo1OSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQKLQotTW9uIEp1biAgNyAxMjo1NjoxNyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6ICBBZGQgLUkuLi9iZmQgZm9yIHN5c2RlcC5oIGFuZCBiZmQuaC4KLQkqIGNvbmZpZ3VyZS5pbjogIE5vIGxvbmdlciBuZWVkIHRvIGNvbmZpZ3VyZSB0byBnZXQgc3lzZGVwLmguCi0KLVR1ZSBNYXkgMTggMjE6NDQ6MTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IHNob3VsZCBub3QgZGVwZW5kIG9uIGluc3RhbGwtaW5mbwotCi1Nb24gQXByIDI2IDEyOjM3OjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuaDogSW5jbHVkZSBhbnNpZGVjbC5oIGJlZm9yZSBzeXNkZXAuaC4gIFVuZGVmaW5lIGh6LgotCi1UdWUgQXByIDEzIDE2OjE0OjAzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNIE1ha2VmaWxlLmluOiAgQWRkIC1nIHRvIENGTEFHUy4KLQlBZHMgTERGTEFHUyBhbmQgdXNlIGluIHBsYWNlIG9mIENGTEFHUyB3aGVyZSBhcHByb3ByaWF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogIE1ha2UgYSBzeXNkZXAuaGxpbmsgaW4gdGhlIHNhbWUgd2F5IG90aGVyCi0JYmZkLWJhc2VkIGRpcmVjdG9yaWVzIGRvLgotCSogZ3Byb2YuaCAoVU5JVCk6ICBSZXBsYWNlIG5vbi1zdGFuZGFyZCAndV9zaG9ydCcgYnkgJ3Vuc2lnbmVkCi0Jc2hvcnQnLgotCSogZ3Byb2YuaDogICNpbmNsdWRlIHN5c2RlcC5oIGluc3RlYWQgb2YgYSBidW5jaCBvZiBzdHVmZi4KLQkqIGdwcm9mLmMgKG1haW4pOiAgRml4IHR5cG8gZ3Byb2ZmLT5ncHJvZi4KLQotVGh1IE1hciAyNSAxOTowMDozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGdwcm9mLnRleGk6IGFkZCBJTkZPLURJUi1FTlRSWQotCi1UdWUgTWFyIDIzIDAwOjAzOjExIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgdGFyZ2V0Ci0KLVNhdCBGZWIgMjcgMTg6MTc6MTAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBncHJvZi5jIChmdW5jc3ltYm9sKTogIEludmVydCB0ZXN0IGZvciBhZmxhZy4KLQotVGh1IEZlYiAyNSAxNjowMTo1MCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIHByaW50Z3Byb2YgKHhtYWxsb2MsIHhyZWFsbG9jKTogIENhc3QgcmVzdWx0cyBvZiBtYWxsb2MKLQlhbmQgcmVhbGxvYyB0byBQVFIuCi0KLVdlZCBGZWIgIDMgMTM6NTU6MzMgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNyZWF0ZWQgaW5mbywgaW5zdGFsbC1pbmZvLCBkdmkKLQotV2VkIEphbiAgNiAwMDo1ODowOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBmaXggaW5zdGFsbCBydWxlIGZvciAkKFBST0cpCi0KLUZyaSBPY3QgIDkgMTE6MjU6NDEgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuMTogdXBkYXRlZCBTWU5PUFNJUyB0byBtYXRjaCBhY3R1YWwgYmVoYXZpb3IuCi0KLU1vbiBPY3QgIDUgMTc6NTA6MTYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGdlbi1jLXByb2cuYXdrOiAgTmV3IGF3ayBzY3JpcHQsIGxpZ2h0bHkgY2hhbmdlZCBmcm9tCi0JcHJldmlvdXNseSBkZWxldGVkIG1ha2UtYy1wcm9nLmF3ay4gIENvbnZlcnRzIGEgdGV4dCBmaWxlCi0JdG8gYSBjIGZ1bmN0aW9uIHRoYXQgcHJpbnRzIHRoYXQgdGV4dC4KLQkqIGZsYXRfYmwubSwgZnNmX2NhbGxnX2JsLm0sIGJzZF9jYWxsZ19ibC5tOiAgTmV3IGZpbGVzLgotCUlucHV0cyB0byBnZW4tYy1wcm9nLmF3aywgY29udGFpbmluZyB0ZXh0IGRlc2NyaWJpbmcKLQlncHJvZiBvdXRwdXQuCi0JKiBibHVyYnMuYzogIFJlbW92ZWQuICBVc2UgKl9ibC5jIGluc3RlYWQuCi0JKiBNYWtlZmlsZS5pbjogVXNlIGdlbi1jcHJvZy5hd2sgdG8gZ2VuZXJhdGUgKl9ibC5jIGZpbGVzCi0JZnJvbSAqX2JsLm0gZmlsZXMuICBBbHNvLCBpbXByb3ZlICpjbGVhbiBydWxlcy4KLQkqIHByaW50Z3Byb2YuYyAocHJpbnRncHJvZik6ICBVc3cgbmV3IGZ1bmN0aW9uIG5hbWVzIGZyb20gKl9ibC5jLgotCQotCi1TdW4gQXVnIDMwIDE5OjU0OjUzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuaCwgZ3Byb2YuYywgcHJpbnRmZ3Byb2YuYzogIEFkZCBzdXBwb3J0IGZvciB0d28KLQlvdXRwdXQgc3R5bGVzOiAgVGhlIGRlZmF1bHQgaXMgc2ltaWxhciB0byB0aGUgb2xkIEZTRiBncHJvZiwKLQl3aGlsZSAtVCBzZXRzIHRoZSB2YXJpYWJsZSBic2Rfc3R5bGVfb3V0cHV0LCB3aGljaCBjYXVzZXMKLQlvdXRwdXQgbWF0Y2hpbmcgQmVya2VsZXkncyBncHJvZi4gIFRoZSBiaWdnZXN0IGRpZmZlcmVuY2VzCi0JYXJlIHRoYXQgd2l0aCB0aGUgRlNGIHN0eWxlIG91dHB1dCwgdGhlIGZsYXQgcHJvZmlsZSBjb21lcwotCWJlZm9yZSB0aGUgY2FsbCBncmFwaDsgbnVtYmVycyBjb21lIGJlZm9yZSBleHBsYW5hdGlvbnM7Ci0JYW5kIHRoZXJlIGlzIGxlc3MgZ3JhdHVpdG91cyB3aGl0ZSBzcGFjZS4KLQkqIGdwcm9mLmgsIGdwcm9mLmMsIHByaW50Zmdwcm9mLmM6ICBOZXcgZGlzY2FyZF91bmRlcnNjb3JlcwotCXZhcmlhYmxlIGNhdXNlcyBkaXNjYXJkaW5nIG9mIGluaXRpYWwgdW5kZXJzY29yZXMgd2hlbgotCXByaW50aW5nIHN5bWJvbCBuYW1lcy4gIEl0IGlzIHNldCB1bmxlc3MgdGhlcmUgaXMgYSAibWFpbiIKLQlzeW1ib2wgKHdpdGhvdXQgYW4gdW5kZXJzY29yZSkuCi0JKiBwcmludGZncHJvZi5jOiAgTmV3IGZ1bmN0aW9uIHByaW50bmFtZW9ubHkoKSwgY2FsbGVkCi0JYnkgcHJpbnRuYW1lKCkuICBJdCBoYW5kbGVzIHN0cmlwcGluZyBvZiBpbml0aWFsICdfJywKLQlhcyB3ZWxsIGFzIEMrKyBuYW1lLWRlbWFuZ2xpbmcuCi0JKiBncHJvZi5jYWxsZywgZ3Byb2YuZmxhdCwgbWFrZS1jLXByb2cuYXdrOiAgUmVtb3ZlZC4KLQlJdCBpcyBqdXN0IGFzIGNvbnZlbmllbnQgdG8gZWRpdCBibHVyYnMuYyBkaXJlY3RseS4KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlZCBydWxlIGZvciBtYWtpbmcgYmx1cmJzLmMuCi0JKiBibHVyYnMuYzogIFRoaXMgaXMgbm93IGEgdHJ1ZSBzb3VyY2UgZmlsZSAoYXMgb3Bwb3NlZAotCXRvIGJlaW5nIGdlbmVyYXRlZCBmcm9tIGdwcm9mLmNhbGxnIGFuZCBncHJvZi5mbGF0KS4KLQlDaGFuZ2Ugc3R5bGUgdG8gdXNlIG9uZSBsb25nIHN0cmluZyBsaXRlcmFsLCBpbnN0ZWFkIG9mCi0Jb25lIGxpdGVyYWwgcGVyIG91dHB1dCBsaW5lLiAgQWRkIEZTRi1zdHlsZSBibHVyYiBmb3IgY2FsbCBncmFwaC4KLQotV2VkIEF1ZyAxOSAxNDozNjozOSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLQotV2VkIEF1ZyAxMiAxNToxNDoxNCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2hhbmdlICR7TUFDSElORX0gdG8gJChNQUNISU5FKS4KLQotU3VuIEp1bCAxOSAxNzozNDowMSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgcmVtb3ZlZCBpbnN0YWxsYXRpb24gb2YgdGhlIG5vdyB1c2VsZXNzCi0JY2FsbC57ZmxhZyxjYWxsZ30gZmlsZXMuICAKLQotCSogZ3Byb2YuMTogbm93IHVzZXMgdGhlIHN0YW5kYXJkIG1hbiBtYWNyb3MgaW5zdGVhZCBvZiB0aGUgbmV3IEJTRAotCW1hbmRvYyBtYWNyb3MuIAotCi1TdW4gSnVsIDEyIDE5OjA2OjAwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZW1vdmUgaG9zdCBzZWN0aW9uLCBleHBhbmQgdGFyZ2V0IHNlY3Rpb24uCi0JKiBjb25maWcvbXQte3RhaG9lLHZheH06ICBBZGQsIHRvIG1hdGNoIGV4aXN0aW5nIHN1cHBvcnQgZmlsZXMuCi0JKiBjb25maWcvdG1ha2UtKjogIFJlbW92ZSBsZWZ0b3ZlciBjcnVkLgotCi0JKiBibHVyYnMuYzogIE5ldyBmaWxlLCBjcmVhdGVkIGZyb20gZ3Byb2YuZmxhdCBhbmQgZ3Byb2YuY2FsbGcgYnkKLQkqIG1ha2UtYy1wcm9nLmF3azogIHdoaWNoIHByb2Nlc3NlcyB0ZXh0IGZpbGVzIGludG8gQyBwcm9ncmFtcy4KLQkqIHByaW50Z3Byb2YuYyAoZmxhdHByb2ZoZWFkZXIsIGdwcm9maGVhZGVyKTogIENhbGwgbmV3IGZ1bmN0aW9ucwotCXRvIHByaW50IGJsdXJicy4KLQkocHJpbnRibHVyYik6ICBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbjogIEluZnJhc3RydWN0dXJlIHRvIGJ1aWxkIGJsdXJicy4KLQkqIHBhdGhuYW1lcy5oOiAgaGFzIGJlZW4gcmVtb3ZlZC4gIEdwcm9mIG5vdyBoYXMgbm8gZmlsZW5hbWUKLQlkZXBlbmRlbmNpZXMgaW4gaXQuCi0JKiBncHJvZi5jOiAgTGludC4KLQotU2F0IEp1bCAxMSAxODowNzoyMSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgbWFuMWRpciBhbmQgaW5zdGFsbCB0aGUgbWFuIHBhZ2UKLQotRnJpIEp1bCAxMCAyMToxNDowOCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgZHVtbXkgaW5mbyBhbmQgaW5zdGFsbC1pbmZvIHRhcmdldHMKLQotVGh1IEp1biAgNCAxMTozNDowMiAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQotCi0JKiBsb29rdXAuYzogZml4ZWQgZmVuY2Vwb3N0IGluIG5sbG9va3VwIGFuZCBhZGRlZCBkYmdfbmxsb29rdXAgZm9yCi0JaGVscCBpbiBkZWJ1Z2dpbmcgdGhlIHByb2JsZW0gKHdpdGggLURERUJVRykKLQkqIGdwcm9mLmM6IHN5bWJvbCB2YWx1ZXMgYXJlIG5vdyByZWFsIHZhbHVlcywgZG9uJ3QgYWRkIHRoZSB2bWEKLQlhbnltb3JlLiAoZG9uZSBmb3Igc29sYXJpczsgc2hvdWxkIHZlcmlmeSB0aGlzIG9uIG90aGVyIHBsYXRmb3JtcykKLQkqIENoYW5nZUxvZzogY3JlYXRlZC4KZGlmZiAtLWdpdCBhL2dwcm9mL01ha2VmaWxlLmFtIGIvZ3Byb2YvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MWU0YzUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotU1VGRklYRVMgPSAubQotCi1TVUJESVJTID0gcG8KLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1EREVCVUcgLUkuLi9iZmQgLUkkKHNyY2RpcikvLi4vaW5jbHVkZSAtSSQoc3JjZGlyKS8uLi9iZmQgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1iaW5fUFJPR1JBTVMgPSBncHJvZgotCi0jIyBDb252ZW5pZW5jZSB2YXIgbGlzdGluZyBwdXJlIHNvdXJjZXMuCi1zb3VyY2VzID0gYmFzaWNfYmxvY2tzLmMgY2FsbF9ncmFwaC5jIGNnX2FyY3MuYyBjZ19kZm4uYyBcCi0JY2dfcHJpbnQuYyBjb3JlZmlsZS5jIGdtb25faW8uYyBncHJvZi5jIGhlcnR6LmMgaGlzdC5jIHNvdXJjZS5jIFwKLQlzZWFyY2hfbGlzdC5jIHN5bXRhYi5jIHN5bV9pZHMuYyB1dGlscy5jIFwKLQlpMzg2LmMgYWxwaGEuYyB2YXguYyB0YWhvZS5jIHNwYXJjLmMKLWdwcm9mX1NPVVJDRVMgPSAkKHNvdXJjZXMpIGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYwotZ3Byb2ZfREVQRU5ERU5DSUVTID0gLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMREVQUykKLWdwcm9mX0xEQUREID0gLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMTElCUykKLQotbm9pbnN0X0hFQURFUlMgPSBcCi0JYmFzaWNfYmxvY2tzLmggY2FsbF9ncmFwaC5oIGNnX2FyY3MuaCBjZ19kZm4uaCBjZ19wcmludC5oIFwKLQljb3JlZmlsZS5oIGdtb24uaCBnbW9uX2lvLmggZ21vbl9vdXQuaCBncHJvZi5oIGhlcnR6LmggaGlzdC5oIFwKLQlzZWFyY2hfbGlzdC5oIHNvdXJjZS5oIHN5bV9pZHMuaCBzeW10YWIuaCB1dGlscy5oCi0KLUVYVFJBX0RJU1QgPSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMgYmJjb252LnBsCi0KLUJVSUxUX1NPVVJDRVMgPSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMKLQotZGlzdHN0dWZmOiAkKEJVSUxUX1NPVVJDRVMpIGluZm8KLQotLm0uYzoKLQlhd2sgLWYgJChzcmNkaXIpL2dlbi1jLXByb2cuYXdrID4gLi8kKi5jIFwKLQkgICAgRlVOQ1RJT049YChlY2hvICQqfHNlZCAtZSAncywuKi8sLGcnIC1lICdzL19ibC8vJylgX2JsdXJiIFwKLQkgICAgRklMRT0kKi5tICQoc3JjZGlyKS8kKi5tCi0KLVBPVEZJTEVTID0gJChzb3VyY2VzKSAkKG5vaW5zdF9IRUFERVJTKQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotaW5mb19URVhJTkZPUyA9IGdwcm9mLnRleGkKLW1hbl9NQU5TID0gZ3Byb2YuMQotCi0jIERlcGVuZGVuY2llcy4KLSQoT0JKRUNUUyk6IC4uL2JmZC9iZmQuaCBjYWxsX2dyYXBoLmggY2dfYXJjcy5oIGNnX3ByaW50LmggXAotCWNvcmVmaWxlLmggZ21vbl9pby5oIGdtb24uaCBnbW9uX291dC5oIGdwcm9mLmggaGVydHouaCBoaXN0LmggXAotCXNlYXJjaF9saXN0Lmggc291cmNlLmggc3ltX2lkcy5oIHN5bXRhYi5oIHV0aWxzLmggXAotCSQoc3JjZGlyKS8uLi9pbmNsdWRlL2xpYmliZXJ0eS5oICQoc3JjZGlyKS8uLi9iZmQvc3lzZGVwLmggXAotCWdjb25maWcuaCAuLi9iZmQvY29uZmlnLmgKLWJhc2ljX2Jsb2Nrcy5vOiBiYXNpY19ibG9ja3MuYwotYnNkX2NhbGxfYmwubzogYnNkX2NhbGxfYmwuYwotY2FsbF9ncmFwaC5vOiBjYWxsX2dyYXBoLmMKLWNnX2FyY3MubzogY2dfYXJjcy5jCi1jZ19kZm4ubzogY2dfZGZuLmMKLWNnX3ByaW50Lm86IGNnX3ByaW50LmMKLWNvcmVmaWxlLm86IGNvcmVmaWxlLmMKLWZsYXRfYmwubzogZmxhdF9ibC5jCi1mc2ZfY2FsbGdfYmwubzogZnNmX2NhbGxnX2JsLmMKLWdtb25faW8ubzogZ21vbl9pby5jCi1ncHJvZi5vOiBncHJvZi5jCi1oZXJ0ei5vOiBoZXJ0ei5jCi1oaXN0Lm86IGhpc3QuYwotc2VhcmNoX2xpc3Qubzogc2VhcmNoX2xpc3QuYwotc291cmNlLm86IHNvdXJjZS5jCi1zeW10YWIubzogc3ltdGFiLmMKLXN5bV9pZHMubzogc3ltX2lkcy5jCi11dGlscy5vOiB1dGlscy5jCi1pMzg2Lm86IGkzODYuYwotYWxwaGEubzogYWxwaGEuYwotdmF4Lm86IHZheC5jCi10YWhvZS5vOiB0YWhvZS5jCi1zcGFyYy5vOiBzcGFyYy5jCmRpZmYgLS1naXQgYS9ncHJvZi9NYWtlZmlsZS5pbiBiL2dwcm9mL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDEzZmZlLi4wMDAwMDAwCi0tLSBhL2dwcm9mL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzI2ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFTID0gQEFTQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVYRUVYVCA9IEBFWEVFWFRACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLUdNU0dGTVQgPSBAR01TR0ZNVEAKLUdUX05PID0gQEdUX05PQAotR1RfWUVTID0gQEdUX1lFU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxEID0gQExEQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OTSA9IEBOTUAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVVTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotVVNFX05MUyA9IEBVU0VfTkxTQAotVVNFX1NZTUJPTF9VTkRFUlNDT1JFID0gQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLWwgPSBAbEAKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1TVUZGSVhFUyA9IC5tCi0KLVNVQkRJUlMgPSBwbwotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLURERUJVRyAtSS4uL2JmZCAtSSQoc3JjZGlyKS8uLi9pbmNsdWRlIC1JJChzcmNkaXIpLy4uL2JmZCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLWJpbl9QUk9HUkFNUyA9IGdwcm9mCi0KLXNvdXJjZXMgPSBiYXNpY19ibG9ja3MuYyBjYWxsX2dyYXBoLmMgY2dfYXJjcy5jIGNnX2Rmbi5jIFwKLQljZ19wcmludC5jIGNvcmVmaWxlLmMgZ21vbl9pby5jIGdwcm9mLmMgaGVydHouYyBoaXN0LmMgc291cmNlLmMgXAotCXNlYXJjaF9saXN0LmMgc3ltdGFiLmMgc3ltX2lkcy5jIHV0aWxzLmMgXAotCWkzODYuYyBhbHBoYS5jIHZheC5jIHRhaG9lLmMgc3BhcmMuYwotCi1ncHJvZl9TT1VSQ0VTID0gJChzb3VyY2VzKSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMKLWdwcm9mX0RFUEVOREVOQ0lFUyA9IC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTERFUFMpCi1ncHJvZl9MREFERCA9IC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTExJQlMpCi0KLW5vaW5zdF9IRUFERVJTID0gXAotCWJhc2ljX2Jsb2Nrcy5oIGNhbGxfZ3JhcGguaCBjZ19hcmNzLmggY2dfZGZuLmggY2dfcHJpbnQuaCBcCi0JY29yZWZpbGUuaCBnbW9uLmggZ21vbl9pby5oIGdtb25fb3V0LmggZ3Byb2YuaCBoZXJ0ei5oIGhpc3QuaCBcCi0Jc2VhcmNoX2xpc3QuaCBzb3VyY2UuaCBzeW1faWRzLmggc3ltdGFiLmggdXRpbHMuaAotCi0KLUVYVFJBX0RJU1QgPSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMgYmJjb252LnBsCi0KLUJVSUxUX1NPVVJDRVMgPSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMKLQotUE9URklMRVMgPSAkKHNvdXJjZXMpICQobm9pbnN0X0hFQURFUlMpCi0KLWluZm9fVEVYSU5GT1MgPSBncHJvZi50ZXhpCi1tYW5fTUFOUyA9IGdwcm9mLjEKLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBnY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IAotYmluX1BST0dSQU1TID0gIGdwcm9mJChFWEVFWFQpCi1QUk9HUkFNUyA9ICAkKGJpbl9QUk9HUkFNUykKLQotCi1ERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotZ3Byb2ZfT0JKRUNUUyA9ICBiYXNpY19ibG9ja3MubyBjYWxsX2dyYXBoLm8gY2dfYXJjcy5vIGNnX2Rmbi5vIFwKLWNnX3ByaW50Lm8gY29yZWZpbGUubyBnbW9uX2lvLm8gZ3Byb2YubyBoZXJ0ei5vIGhpc3QubyBzb3VyY2UubyBcCi1zZWFyY2hfbGlzdC5vIHN5bXRhYi5vIHN5bV9pZHMubyB1dGlscy5vIGkzODYubyBhbHBoYS5vIHZheC5vIHRhaG9lLm8gXAotc3BhcmMubyBmbGF0X2JsLm8gYnNkX2NhbGxnX2JsLm8gZnNmX2NhbGxnX2JsLm8KLWdwcm9mX0xERkxBR1MgPSAKLUNGTEFHUyA9IEBDRkxBR1NACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGdwcm9mLmluZm8KLURWSVMgPSBncHJvZi5kdmkKLVRFWElORk9TID0gZ3Byb2YudGV4aQotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1NQU5TID0gJChtYW5fTUFOUykKLQotTlJPRkYgPSBucm9mZgotSEVBREVSUyA9ICAkKG5vaW5zdF9IRUFERVJTKQotCi1ESVNUX0NPTU1PTiA9ICAuL3N0YW1wLWguaW4gQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluIFRPRE8gXAotYWNsb2NhbC5tNCBjb25maWd1cmUgY29uZmlndXJlLmluIGdjb25maWcuaW4KLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSBndGFyCi1HWklQX0VOViA9IC0tYmVzdAotU09VUkNFUyA9ICQoZ3Byb2ZfU09VUkNFUykKLU9CSkVDVFMgPSAkKGdwcm9mX09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5kdmkgLmluZm8gLmxvIC5tIC5vIC5wcyAucyAudGV4aSAudGV4aW5mbyAudHhpCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluIAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotZ2NvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2djb25maWcuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1nY29uZmlnLmg6Z2NvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2djb25maWcuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2Rpcikvc3RhbXAtaC5pbgotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCQkkKE1BS0UpICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JZWxzZSA6OyBmaQotJChzcmNkaXIpL3N0YW1wLWguaW46ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCi0JQGVjaG8gdGltZXN0YW1wID4gJChzcmNkaXIpL3N0YW1wLWguaW4gMj4gL2Rldi9udWxsCi0KLW1vc3RseWNsZWFuLWhkcjoKLQotY2xlYW4taGRyOgotCi1kaXN0Y2xlYW4taGRyOgotCS1ybSAtZiBnY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci0KLW1vc3RseWNsZWFuLWJpblBST0dSQU1TOgotCi1jbGVhbi1iaW5QUk9HUkFNUzoKLQktdGVzdCAteiAiJChiaW5fUFJPR1JBTVMpIiB8fCBybSAtZiAkKGJpbl9QUk9HUkFNUykKLQotZGlzdGNsZWFuLWJpblBST0dSQU1TOgotCi1tYWludGFpbmVyLWNsZWFuLWJpblBST0dSQU1TOgotCi1pbnN0YWxsLWJpblBST0dSQU1TOiAkKGJpbl9QUk9HUkFNUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGJpbmRpcikKLQlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLXVuaW5zdGFsbC1iaW5QUk9HUkFNUzoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgcm0gLWYgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JZG9uZQotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1ncHJvZiQoRVhFRVhUKTogJChncHJvZl9PQkpFQ1RTKSAkKGdwcm9mX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgZ3Byb2YkKEVYRUVYVCkKLQkkKExJTkspICQoZ3Byb2ZfTERGTEFHUykgJChncHJvZl9PQkpFQ1RTKSAkKGdwcm9mX0xEQUREKSAkKExJQlMpCi0KLWdwcm9mLmluZm86IGdwcm9mLnRleGkKLWdwcm9mLmR2aTogZ3Byb2YudGV4aQotCi0KLURWSVBTID0gZHZpcHMKLQotLnRleGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udGV4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udHhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLS5kdmkucHM6Ci0JJChEVklQUykgJDwgLW8gJEAKLQotaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCi0JQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCi0JICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCi0JICAgIGVsc2UgOiA7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCUAkKFBPU1RfSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBsaXN0PSckKElORk9fREVQUyknOyBcCi0JICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAotCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCi0JICBkb25lOyBcCi0JZWxzZSA6IDsgZmkKLQotdW5pbnN0YWxsLWluZm86Ci0JJChQUkVfVU5JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlpPXllczsgXAotCWVsc2UgaWk9OyBmaTsgXAotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgLXogIiRpaSIgXAotCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKLQlkb25lCi0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKLQlkb25lCi0KLWRpc3QtaW5mbzogJChJTkZPX0RFUFMpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tYW1pbmZvOgotCS1ybSAtZiBncHJvZi5hdXggZ3Byb2YuY3AgZ3Byb2YuY3BzIGdwcm9mLmR2aSBncHJvZi5mbiBncHJvZi5mbnMgXAotCSAgZ3Byb2Yua3kgZ3Byb2Yua3lzIGdwcm9mLnBzIGdwcm9mLmxvZyBncHJvZi5wZyBncHJvZi50b2MgXAotCSAgZ3Byb2YudHAgZ3Byb2YudHBzIGdwcm9mLnZyIGdwcm9mLnZycyBncHJvZi5vcCBncHJvZi50ciBcCi0JICBncHJvZi5jdiBncHJvZi5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLQotaW5zdGFsbC1tYW4xOgotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobWFuMWRpcikKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAotCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotCi11bmluc3RhbGwtbWFuMToKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLWluc3RhbGwtbWFuOiAkKE1BTlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1tYW4xCi11bmluc3RhbGwtbWFuOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLW1hbjEKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGdjb25maWcuaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotICAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLSAgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpZ2NvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAotCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBnY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCi1pbmZvLWFtOiAkKElORk9fREVQUykKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06ICQoRFZJUykKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGdjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWJpblBST0dSQU1TCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMgdW5pbnN0YWxsLW1hbgotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTUFOUykgJChIRUFERVJTKSBnY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQoYmluZGlyKSAkKERFU1RESVIpJChtYW5kaXIpL21hbjEKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQlVJTFRfU09VUkNFUykiIHx8IHJtIC1mICQoQlVJTFRfU09VUkNFUykKLW1vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4taGRyIG1vc3RseWNsZWFuLWJpblBST0dSQU1TIFwKLQkJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIFwKLQkJbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLXRhZ3MgbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCi0JCWNsZWFuLWFtaW5mbyBjbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1iaW5QUk9HUkFNUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1hbWluZm8gZGlzdGNsZWFuLXRhZ3MgXAotCQlkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1hbQotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWJpblBST0dSQU1TIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCi0JCW1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tdGFncyBcCi0JCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBkaXN0Y2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tYmluUFJPR1JBTVMgXAotbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUyB1bmluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1iaW5QUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAotY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIFwKLW1vc3RseWNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBcCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbyBpbnN0YWxsLW1hbjEgdW5pbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW4gXAotdW5pbnN0YWxsLW1hbiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBpbmZvLWFtIGluZm8gXAotZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIGluc3RhbGwtaW5mby1hbSBcCi1pbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIFwKLWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBpbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgXAotYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi1kaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBcCi1tb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi0KLWRpc3RzdHVmZjogJChCVUlMVF9TT1VSQ0VTKSBpbmZvCi0KLS5tLmM6Ci0JYXdrIC1mICQoc3JjZGlyKS9nZW4tYy1wcm9nLmF3ayA+IC4vJCouYyBcCi0JICAgIEZVTkNUSU9OPWAoZWNobyAkKnxzZWQgLWUgJ3MsLiovLCxnJyAtZSAncy9fYmwvLycpYF9ibHVyYiBcCi0JICAgIEZJTEU9JCoubSAkKHNyY2RpcikvJCoubQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotIyBEZXBlbmRlbmNpZXMuCi0kKE9CSkVDVFMpOiAuLi9iZmQvYmZkLmggY2FsbF9ncmFwaC5oIGNnX2FyY3MuaCBjZ19wcmludC5oIFwKLQljb3JlZmlsZS5oIGdtb25faW8uaCBnbW9uLmggZ21vbl9vdXQuaCBncHJvZi5oIGhlcnR6LmggaGlzdC5oIFwKLQlzZWFyY2hfbGlzdC5oIHNvdXJjZS5oIHN5bV9pZHMuaCBzeW10YWIuaCB1dGlscy5oIFwKLQkkKHNyY2RpcikvLi4vaW5jbHVkZS9saWJpYmVydHkuaCAkKHNyY2RpcikvLi4vYmZkL3N5c2RlcC5oIFwKLQlnY29uZmlnLmggLi4vYmZkL2NvbmZpZy5oCi1iYXNpY19ibG9ja3MubzogYmFzaWNfYmxvY2tzLmMKLWJzZF9jYWxsX2JsLm86IGJzZF9jYWxsX2JsLmMKLWNhbGxfZ3JhcGgubzogY2FsbF9ncmFwaC5jCi1jZ19hcmNzLm86IGNnX2FyY3MuYwotY2dfZGZuLm86IGNnX2Rmbi5jCi1jZ19wcmludC5vOiBjZ19wcmludC5jCi1jb3JlZmlsZS5vOiBjb3JlZmlsZS5jCi1mbGF0X2JsLm86IGZsYXRfYmwuYwotZnNmX2NhbGxnX2JsLm86IGZzZl9jYWxsZ19ibC5jCi1nbW9uX2lvLm86IGdtb25faW8uYwotZ3Byb2YubzogZ3Byb2YuYwotaGVydHoubzogaGVydHouYwotaGlzdC5vOiBoaXN0LmMKLXNlYXJjaF9saXN0Lm86IHNlYXJjaF9saXN0LmMKLXNvdXJjZS5vOiBzb3VyY2UuYwotc3ltdGFiLm86IHN5bXRhYi5jCi1zeW1faWRzLm86IHN5bV9pZHMuYwotdXRpbHMubzogdXRpbHMuYwotaTM4Ni5vOiBpMzg2LmMKLWFscGhhLm86IGFscGhhLmMKLXZheC5vOiB2YXguYwotdGFob2UubzogdGFob2UuYwotc3BhcmMubzogc3BhcmMuYwotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9ncHJvZi9OT1RFUyBiL2dwcm9mL05PVEVTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTFhZjMwLi4wMDAwMDAwCi0tLSBhL2dwcm9mL05PVEVTCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLVN1biBGZWIgIDUgMTY6MDk6MTYgMTk5NQotCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBjaGFuZ2VzIGFuZCBuZXcgZmVhdHVyZXMgYXZhaWxhYmxlIHdpdGggdGhpcwotdmVyc2lvbiBvZiBHTlUgZ3Byb2YuCi0KLSogTmV3IEZlYXR1cmVzCi0KLSBvIExvbmcgb3B0aW9ucwotCi0gbyBTdXBwb3J0cyBnZW5lcmFsaXplZCBmaWxlIGZvcm1hdCwgd2l0aG91dCBicmVha2luZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgotICAgbmV3IGZpbGUgZm9ybWF0IHN1cHBvcnRzIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMgYW5kIG5vbi1yZWFsdGltZQotICAgaGlzdG9ncmFtcyAoc2VlIGJlbG93KQotCi0gbyBTdXBwb3J0cyBwcm9maWxpbmcgYXQgdGhlIGxpbmUgbGV2ZWw6IGZsYXQgcHJvZmlsZXMsIGNhbGwtZ3JhcGggcHJvZmlsZXMsCi0gICBhbmQgZXhlY3V0aW9uLWNvdW50cyBjYW4gYWxsIGJlIGRpc3BsYXllZCBhdCBhIGxldmVsIHRoYXQgaWRlbnRpZmllcwotICAgaW5kaXZpZHVhbCBsaW5lcyByYXRoZXIgdGhhbiBqdXN0IGZ1bmN0aW9ucwotCi0gbyBUZXN0LWNvdmVyYWdlIHN1cHBvcnQgKHNpbWlsYXIgdG8gU3VuIHRjb3YgcHJvZ3JhbSk6IHNvdXJjZSBmaWxlcwotICAgY2FuIGJlIGFubm90YXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgdGltZXMgYSBmdW5jdGlvbiB3YXMgaW52b2tlZAotICAgb3Igd2l0aCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggYmFzaWMtYmxvY2sgaW4gYSBmdW5jdGlvbiB3YXMKLSAgIGV4ZWN1dGVkCi0KLSBvIEdlbmVyYWxpemVkIGhpc3RvZ3JhbXM6IG5vdCBqdXN0IGV4ZWN1dGlvbi10aW1lLCBidXQgYXJiaXRyYXJ5Ci0gICBoaXN0b2dyYW1zIGFyZSBzdXBwb3J0IChmb3IgZXhhbXBsZSwgcGVyZm9ybWFuY2UgY291bnRlciBiYXNlZAotICAgcHJvZmlsZXMpCi0KLSBvIFBvd2VyZnVsIG1lY2hhbmlzbSB0byBzZWxlY3QgZGF0YSB0byBiZSBpbmNsdWRlZC9leGNsdWRlZCBmcm9tCi0gICBhbmFseXNpcyBhbmQvb3Igb3V0cHV0Ci0KLSBvIFN1cHBvcnQgZm9yIERFQyBPU0YvMSB2My4wCi0KLSBvIEZ1bGwgY3Jvc3MtcGxhdGZvcm0gcHJvZmlsaW5nIHN1cHBvcnQ6IGdwcm9mIHVzZXMgQkZEIHRvIHN1cHBvcnQKLSAgIGFyYml0cmFyeSwgbm9uLW5hdGl2ZSBvYmplY3QgZmlsZSBmb3JtYXRzIGFuZCBub24tbmF0aXZlIGJ5dGUtb3JkZXJzCi0gICAodGhpcyBmZWF0dXJlIGhhcyBub3QgYmVlbiB0ZXN0ZWQgeWV0KQotCi0gbyBJbiB0aGUgY2FsbC1ncmFwaCBmdW5jdGlvbiBpbmRleCwgc3RhdGljIGZ1bmN0aW9uIG5hbWVzIGFyZSBub3cKLSAgIHByaW50ZWQgdG9nZXRoZXIgd2l0aCB0aGUgZmlsZW5hbWUgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkCi0gICAocmVxdWlyZWQgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkgc3VwcG9ydCBhbmQgc3ltYm9saWMgZGVidWdnaW5nCi0gICAgaW5mb3JtYXRpb24gdG8gYmUgcHJlc2VudCBpbiB0aGUgZXhlY3V0YWJsZSBmaWxlKQotCi0gbyBNYWpvciBvdmVyaGF1bCBvZiBzb3VyY2UgY29kZSAoY29tcGlsZXMgY2xlYW5seSB3aXRoIC1XYWxsLCBldGMuKQotCi0qIFN1cHBvcnRlZCBQbGF0Zm9ybXMKLQotVGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBrbm93biB0byB3b3JrIG9uOgotCi0gbyBERUMgT1NGLzEgdjMuMAotCUFsbCBmZWF0dXJlcyBzdXBwb3J0ZWQuCi0KLSBvIFN1bk9TIDQuMS54Ci0JQWxsIGZlYXR1cmVzIHN1cHBvcnRlZC4KLQotIG8gU29sYXJpcyAyLjMKLQlMaW5lLWxldmVsIHByb2ZpbGluZyB1bnN1cHBvcnRlZCBiZWNhdXNlIGJmZF9maW5kX25lYXJlc3RfbGluZSgpCi0JaXMgbm90IGZ1bGx5IGltcGxlbWVudGVkIGZvciBFbGYgYmluYXJpZXMuCi0KLSBvIEhQLVVYIDkuMDEKLQlMaW5lLWxldmVsIHByb2ZpbGluZyB1bnN1cHBvcnRlZCBiZWNhdXNlIGJmZF9maW5kX25lYXJlc3RfbGluZSgpCi0JaXMgbm90IGZ1bGx5IGltcGxlbWVudGVkIGZvciBTT00gYmluYXJpZXMuCi0KLSogRGV0YWlsZWQgRGVzY3JpcHRpb24KLQotKiogVXNlciBJbnRlcmZhY2UgQ2hhbmdlcwotCi1UaGUgY29tbWFuZC1saW5lIGludGVyZmFjZSBpcyBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIKLXZlcnNpb25zIG9mIEdOVSBncHJvZiBhbmQgQmVya2VsZXkgZ3Byb2YuICBUaGUgb25seSBleGNlcHRpb24gaXMKLXRoZSBvcHRpb24gdG8gZGVsZXRlIGFyY3MgZnJvbSB0aGUgY2FsbCBncmFwaC4gIFRoZSBvbGQgc3ludGF4Ci13YXM6Ci0KLQktayBmcm9tbmFtZSB0b25hbWUKLQotd2hpbGUgdGhlIG5ldyBzeW50YXggaXM6Ci0KLQktayBmcm9tbmFtZS90b25hbWUKLQotVGhpcyBjaGFuZ2Ugd2FzIG5lY2Vzc2FyeSB0byBiZSBjb21wYXRpYmxlIHdpdGggbG9uZy1vcHRpb24gcGFyc2luZy4KLUFsc28sICJmcm9tbmFtZSIgYW5kICJ0b25hbWUiIGNhbiBub3cgYmUgYXJiaXRyYXJ5IHN5bXNwZWNzIHJhdGhlcgotdGhhbiBqdXN0IGZ1bmN0aW9uIG5hbWVzIChzZWUgYmVsb3cgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHN5bXNwZWNzKS4KLUZvciBleGFtcGxlLCBvcHRpb24gIi1rIGdwcm9mLmMvIiBzdXBwcmVzc2VzIGFsbCBhcmNzIGR1ZSB0byBjYWxscyBvdXQKLW9mIGZpbGUgImdwcm9mLmMiLgotCi0qKiogU3ltIFNwZWNzCi0KLUl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byBhcHBseSBncHJvZiBvbmx5IHRvIHNwZWNpZmljIHBhcnRzIG9mIGEKLXByb2dyYW0uICBHTlUgZ3Byb2YgaGFzIGEgc2ltcGxlIGJ1dCBwb3dlcmZ1bCBtZWNoYW5pc20gdG8gYWNoaWV2ZQotdGhpcy4gIFNvIGNhbGxlZCB7XGVtIHN5bXNwZWNzXC99IHByb3ZpZGUgdGhlIGZvdW5kYXRpb24gZm9yIHRoaXMKLW1lY2hhbmlzbS4gIEEgc3ltc3BlYyBzZWxlY3RzIHRoZSBwYXJ0cyBvZiBhIHByb2ZpbGVkIHByb2dyYW0gdG8gd2hpY2gKLWFuIG9wZXJhdGlvbiBzaG91bGQgYmUgYXBwbGllZCB0by4gIFRoZSBzeW50YXggb2YgYSBzeW1zcGVjIGlzCi1zaW1wbGU6Ci0KLQkgIGZpbGVuYW1lX2NvbnRhaW5pbmdfYV9kb3QKLQl8IGZ1bmNuYW1lX25vdF9jb250YWluaW5nX2FfZG90Ci0JfCBsaW5lbnVtYmVyCi0JfCAoIFsgYW55X2ZpbGVuYW1lIF0gYDonICggYW55X2Z1bmNuYW1lIHwgbGluZW51bWJlciApICkKLQotSGVyZSBhcmUgc29tZSBleGFtcGxlczoKLQotCW1haW4uYwkJCVNlbGVjdHMgZXZlcnl0aGluZyBpbiBmaWxlICJtYWluLmMiLS0tdGhlCi0JCQkJZG90IGluIHRoZSBzdHJpbmcgdGVsbHMgZ3Byb2YgdG8gaW50ZXJwcmV0Ci0JCQkJdGhlIHN0cmluZyBhcyBhIGZpbGVuYW1lLCByYXRoZXIgdGhhbiBhcwotCQkJCWEgZnVuY3Rpb24gbmFtZS4gIFRvIHNlbGVjdCBhIGZpbGUgd2hvc2UKLQkJCQluYW1lIGRvZXMgY29udGFpbiBhIGRvdCwgYSB0cmFpbGluZyBjb2xvbgotCQkJCXNob3VsZCBiZSBzcGVjaWZpZWQuICBGb3IgZXhhbXBsZSwgIm9kZDoiIGlzCi0JCQkJaW50ZXJwcmV0ZWQgYXMgdGhlIGZpbGUgbmFtZWQgIm9kZCIuCi0KLQltYWluCQkJU2VsZWN0cyBhbGwgZnVuY3Rpb25zIG5hbWVkICJtYWluIi4gIE5vdGljZQotCQkJCXRoYXQgdGhlcmUgbWF5IGJlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUKLQkJCQlzYW1lIGZ1bmN0aW9uIG5hbWUgYmVjYXVzZSBzb21lIG9mIHRoZQotCQkJCWRlZmluaXRpb25zIG1heSBiZSBsb2NhbCAoaS5lLiwgc3RhdGljKS4KLQkJCQlVbmxlc3MgYSBmdW5jdGlvbiBuYW1lIGlzIHVuaXF1ZSBpbiBhIHByb2dyYW0sCi0JCQkJeW91IG11c3QgdXNlIHRoZSBjb2xvbiBub3RhdGlvbiBleHBsYWluZWQKLQkJCQliZWxvdyB0byBzcGVjaWZ5IGEgZnVuY3Rpb24gZnJvbSBhIHNwZWNpZmljCi0JCQkJc291cmNlIGZpbGUuICBTb21ldGltZXMsIGZ1bmN0aW9ubmFtZXMgY29udGFpbgotCQkJCWRvdHMuICBJbiBzdWNoIGNhc2VzLCBpdCBpcyBuZWNlc3NhciB0bwotCQkJCWFkZCBhIGxlYWRpbmcgY29sb24gdG8gdGhlIG5hbWUuICBGb3IgZXhhbXBsZSwKLQkJCQkiOi5tdWwiIHNlbGVjdHMgZnVuY3Rpb24gIi5tdWwiLgotCQkJCQotCW1haW4uYzptYWluCQlTZWxlY3RzIGZ1bmN0aW9uICJtYWluIiBpbiBmaWxlICJtYWluLmMiLgotCi0JbWFpbi5jOjEzNAkJU2VsZWN0cyBsaW5lIDEzNCBpbiBmaWxlICJtYWluLmMiLgotCi1JTVBMRU1FTlRBVElPTiBOT1RFOiBUaGUgc291cmNlIGNvZGUgdXNlcyB0aGUgdHlwZSBzeW1faWQgZm9yIHN5bXNwZWNzLgotQXQgc29tZSBwb2ludCwgdGhpcyBwcm9iYWJseSBvdWdodCB0byBiZSBjaGFuZ2VkIHRvICJzeW1fc3BlYyIgdG8gbWFrZQotcmVhZGluZyB0aGUgY29kZSBlYXNpZXIuCi0KLSoqKiBMb25nIG9wdGlvbnMKLQotR05VIGdwcm9mIG5vdyBzdXBwb3J0cyBsb25nIG9wdGlvbnMuICBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBhbGwKLXN1cHBvcnRlZCBvcHRpb25zLiAgT3B0aW9ucyB0aGF0IGFyZSBsaXN0ZWQgd2l0aG91dCBkZXNjcmlwdGlvbgotb3BlcmF0ZSBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgdGhlIGNvcnJlc3BvbmRpbmcgb3B0aW9uIGluIG9sZGVyCi12ZXJzaW9ucyBvZiBncHJvZi4KLQotU2hvcnQgRm9ybToJTG9uZyBGb3JtOgotLS0tLS0tLS0tLS0JLS0tLS0tLS0tLQotLWwJCS0tbGluZQotCQkJUmVxdWVzdCBwcm9maWxpbmcgYXQgdGhlIGxpbmUtbGV2ZWwgcmF0aGVyCi0JCQl0aGFuIGp1c3QgYXQgdGhlIGZ1bmN0aW9uIGxldmVsLiAgU291cmNlCi0JCQlsaW5lcyBhcmUgaWRlbnRpZmllZCBieSBzeW1ib2xzIG9mIHRoZSBmb3JtOgotCi0JCQkJZnVuYyAoZmlsZTpsaW5lKQotCi0JCQl3aGVyZSAiZnVuYyIgaXMgdGhlIGZ1bmN0aW9uIG5hbWUsICJmaWxlIiBpcyB0aGUKLQkJCWZpbGUgbmFtZSBhbmQgImxpbmUiIGlzIHRoZSBsaW5lLW51bWJlciB0aGF0Ci0JCQljb3JyZXNwb25kcyB0byB0aGUgbGluZS4KLQotCQkJVG8gd29yayBwcm9wZXJseSwgdGhlIGJpbmFyeSBtdXN0IGNvbnRhaW4gc3ltYm9saWMKLQkJCWRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgc291cmNlCi0JCQloYXZlIHRvIGJlIHRyYW5zbGF0ZWQgd2l0aCBvcHRpb24gIi1nIiBzcGVjaWZpZWQuCi0JCQlGdW5jdGlvbnMgZm9yIHdoaWNoIHRoZXJlIGlzIG5vIHN5bWJvbGljIGRlYnVnZ2luZwotCQkJaW5mb3JtYXRpb24gYXZhaWxhYmxlIGFyZSB0cmVhdGVkIGFzIGlmICItLWxpbmUiCi0JCQloYWQgbm90IGJlZW4gc3BlY2lmaWVkLiAgSG93ZXZlciwgdGhlIGxpbmUgbnVtYmVyCi0JCQlwcmludGVkIHdpdGggc3VjaCBzeW1ib2xzIGlzIHVzdWFsbHkgaW5jb3JyZWN0Ci0JCQlhbmQgc2hvdWxkIGJlIGlnbm9yZWQuCi0KLS1hCQktLW5vLXN0YXRpYwotLUFbc3ltc3BlY10JLS1hbm5vdGF0ZWQtc291cmNlWz1zeW1zcGVjXQotCQkJUmVxdWVzdCBvdXRwdXQgaW4gdGhlIGZvcm0gb2YgYW5ub3RhdGVkIHNvdXJjZQotCQkJZmlsZXMuICBJZiAic3ltc3BlYyIgaXMgc3BlY2lmaWVkLCBwcmludCBvdXRwdXQgb25seQotCQkJZm9yIHN5bWJvbHMgc2VsZWN0ZWQgYnkgInN5bXNwZWMiLiAgSWYgdGhlIG9wdGlvbgotCQkJaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCBhbm5vdGF0ZWQgb3V0cHV0IGlzCi0JCQlnZW5lcmF0ZWQgZm9yIHRoZSB1bmlvbiBvZiBhbGwgc3ltc3BlY3MuCi0KLQkJCUV4YW1wbGVzOgotCi0JCQkgIC1BCQlQcmludHMgYW5ub3RhdGVkIHNvdXJjZSBmb3IgYWxsCi0JCQkJCXNvdXJjZSBmaWxlcy4KLQkJCSAgLUFncHJvZi5jCVByaW50cyBhbm5vdGF0ZWQgc291cmNlIGZvciBmaWxlCi0JCQkJCWdwcm9mLmMuCi0JCQkgIC1BZm9vYmFyCVByaW50cyBhbm5vdGF0ZWQgc291cmNlIGZvciBmaWxlcwotCQkJCQljb250YWluaW5nIGEgZnVuY3Rpb24gbmFtZWQgImZvb2JhciIuCi0JCQkJCVRoZSBlbnRpcmUgZmlsZSB3aWxsIGJlIHByaW50ZWQsIGJ1dAotCQkJCQlvbmx5IHRoZSBmdW5jdGlvbiBpdHNlbGYgd2lsbCBiZQotCQkJCQlhbm5vdGF0ZWQgd2l0aCBwcm9maWxlIGRhdGEuCi0KLS1KW3N5bXNwZWNdCS0tbm8tYW5ub3RhdGVkLXNvdXJjZVs9c3ltc3BlY10KLQkJCVN1cHByZXNzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0LiAgSWYgc3BlY2lmaWVkCi0JCQl3aXRob3V0IGFyZ3VtZW50LCBhbm5vdGF0ZWQgb3V0cHV0IGlzIHN1cHByZXNzZWQKLQkJCWNvbXBsZXRlbHkuICBXaXRoIGFuIGFyZ3VtZW50LCBhbm5vdGF0ZWQgb3V0cHV0Ci0JCQlpcyBzdXBwcmVzc2VkIG9ubHkgZm9yIHRoZSBzeW1ib2xzIHNlbGVjdGVkIGJ5Ci0JCQkic3ltc3BlYyIuICBJZiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZCBtdWx0aXBsZQotCQkJdGltZXMsIGFubm90YXRlZCBvdXRwdXQgaXMgc3VwcHJlc3NlZCBmb3IgdGhlCi0JCQl1bmlvbiBvZiBhbGwgc3ltc3BlY3MuICBUaGlzIG9wdGlvbiBoYXMgbG93ZXIKLQkJCXByZWNlZGVuY2UgdGhhbiAtLWFubm90YXRlZC1zb3VyY2UKLQotLXBbc3ltc3BlY10JLS1mbGF0LXByb2ZpbGVbPXN5bXNwZWNdCi0JCQlSZXF1ZXN0IG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhIGZsYXQgcHJvZmlsZQotCQkJKHVubGVzcyBhbnkgb3RoZXIgb3V0cHV0LXN0eWxlIG9wdGlvbiBpcyBzcGVjaWZpZWQsCi0JCQkgdGhpcyBvcHRpb24gaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQpLiAgSWYKLQkJCSJzeW1zcGVjIiBpcyBzcGVjaWZpZWQsIGluY2x1ZGUgb25seSBzeW1ib2xzCi0JCQlzZWxlY3RlZCBieSAic3ltc3BlYyIgaW4gZmxhdCBwcm9maWxlLiAgSWYgdGhlCi0JCQlvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCB0aGUgZmxhdAotCQkJcHJvZmlsZSBpbmNsdWRlcyBzeW1ib2xzIHNlbGVjdGVkIGJ5IHRoZSB1bmlvbgotCQkJb2YgYWxsIHN5bXNwZWNzLgotCQkJCi0tUFtzeW1zcGVjXQktLW5vLWZsYXQtcHJvZmlsZVs9c3ltc3BlY10KLQkJCVN1cHByZXNzIG91dHB1dCBpbiB0aGUgZmxhdCBwcm9maWxlLiAgSWYgZ2l2ZW4KLQkJCXdpdGhvdXQgYW4gYXJndW1lbnQsIHRoZSBmbGF0IHByb2ZpbGUgaXMgc3VwcHJlc3NlZAotCQkJY29tcGxldGVseS4gIElmICJzeW1zcGVjIiBpcyBzcGVjaWZpZWQsIHN1cHByZXNzCi0JCQl0aGUgc2VsZWN0ZWQgc3ltYm9scyBpbiB0aGUgZmxhdCBwcm9maWxlLiAgSWYgdGhlCi0JCQlvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCB0aGUgdW5pb24gb2YKLQkJCXRoZSBzZWxlY3RlZCBzeW1ib2xzIGlzIHN1cHByZXNzZWQuICBUaGlzIG9wdGlvbgotCQkJaGFzIGxvd2VyIHByZWNlZGVuY2UgdGhhbiAtLWZsYXQtcHJvZmlsZS4KLQotLXFbc3ltc3BlY10JLS1ncmFwaFs9c3ltc3BlY10KLQkJCVJlcXVlc3Qgb3V0cHV0IGluIHRoZSBmb3JtIG9mIGEgY2FsbC1ncmFwaAotCQkJKHVubGVzcyBhbnkgb3RoZXIgb3V0cHV0LXN0eWxlIG9wdGlvbiBpcyBzcGVjaWZpZWQsCi0JCQkgdGhpcyBvcHRpb24gaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQpLiAgSWYgInN5bXNwZWMiCi0JCQlpcyBzcGVjaWZpZWQsIGluY2x1ZGUgb25seSBzeW1ib2xzIHNlbGVjdGVkIGJ5Ci0JCQkic3ltc3BlYyIgaW4gdGhlIGNhbGwtZ3JhcGguICBJZiB0aGUgb3B0aW9uIGlzCi0JCQlzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHRoZSBjYWxsLWdyYXBoIGluY2x1ZGVzCi0JCQlzeW1ib2xzIHNlbGVjdGVkIGJ5IHRoZSB1bmlvbiBvZiBhbGwgc3ltc3BlY3MuCi0KLS1RW3N5bXNwZWNdCS0tbm8tZ3JhcGhbPXN5bXNwZWNdCi0JCQlTdXBwcmVzcyBvdXRwdXQgaW4gdGhlIGNhbGwtZ3JhcGguICBJZiBnaXZlbiB3aXRob3V0Ci0JCQlhbiBhcmd1bWVudCwgdGhlIGNhbGwtZ3JhcGggaXMgc3VwcHJlc3NlZCBjb21wbGV0ZWx5LgotCQkJV2l0aCBhICJzeW1zcGVjIiwgc3VwcHJlc3MgdGhlIHNlbGVjdGVkIHN5bWJvbHMKLQkJCWZyb20gdGhlIGNhbGwtZ3JhcGguICBJZiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZAotCQkJbXVsdGlwbGUgdGltZXMsIHRoZSB1bmlvbiBvZiB0aGUgc2VsZWN0ZWQgc3ltYm9scwotCQkJaXMgc3VwcHJlc3NlZC4gIFRoaXMgb3B0aW9uIGhhcyBsb3dlciBwcmVjZWRlbmNlCi0JCQl0aGFuIC0tZ3JhcGguCi0KLS1DW3N5bXNwZWNdCS0tZXhlYy1jb3VudHNbPXN5bXNwZWNdCi0JCQlSZXF1ZXN0IG91dHB1dCBpbiB0aGUgZm9ybSBvZiBleGVjdXRpb24gY291bnRzLgotCQkJSWYgInN5bXNwZWMiIGlzIHByZXNlbnQsIGluY2x1ZGUgb25seSBzeW1ib2xzCi0JCQlzZWxlY3RlZCBieSAic3ltc3BlYyIgaW4gdGhlIGV4ZWN1dGlvbiBjb3VudAotCQkJbGlzdGluZy4gIElmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlCi0JCQl0aW1lcywgdGhlIGV4ZWN1dGlvbiBjb3VudCBsaXN0aW5nIGluY2x1ZGVzCi0JCQlzeW1ib2xzIHNlbGVjdGVkIGJ5IHRoZSB1bmlvbiBvZiBhbGwgc3ltc3BlY3MuCi0KLS1aW3N5bXNwZWNdCS0tbm8tZXhlYy1jb3VudHNbPXN5bXNwZWNdCi0JCQlTdXBwcmVzcyBvdXRwdXQgaW4gdGhlIGV4ZWN1dGlvbiBjb3VudCBsaXN0aW5nLgotCQkJSWYgZ2l2ZW4gd2l0aG91dCBhbiBhcmd1bWVudCwgdGhlIGxpc3RpbmcgaXMKLQkJCXN1cHByZXNzZWQgY29tcGxldGVseS4gIFdpdGggYSAic3ltc3BlYyIsIHN1cHByZXNzCi0JCQl0aGUgc2VsZWN0ZWQgc3ltYm9scyBmcm9tIHRoZSBjYWxsLWdyYXBoLiAgSWYgdGhlCi0JCQlvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCB0aGUgdW5pb24gb2YKLQkJCXRoZSBzZWxlY3RlZCBzeW1ib2xzIGlzIHN1cHByZXNzZWQuICBUaGlzIG9wdGlvbgotCQkJaGFzIGxvd2VyIHByZWNlZGVuY2UgdGhhbiAtLWV4ZWMtY291bnRzLgotCi0taQkJLS1maWxlLWluZm8KLQkJCVByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9maWxlIGZpbGVzIHRoYXQKLQkJCWFyZSByZWFkLiAgVGhlIGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZQotCQkJbnVtYmVyIGFuZCB0eXBlcyBvZiByZWNvcmRzIHByZXNlbnQgaW4gdGhlCi0JCQlwcm9maWxlIGZpbGUuICBDdXJyZW50bHksIGEgcHJvZmlsZSBmaWxlIGNhbgotCQkJY29udGFpbiBhbnkgbnVtYmVyIGFuZCBhbnkgY29tYmluYXRpb24gb2YgaGlzdG9ncmFtLAotCQkJY2FsbC1ncmFwaCwgb3IgYmFzaWMtYmxvY2sgY291bnQgcmVjb3Jkcy4KLQotLXMJCS0tc3VtCi0KLS14CQktLWFsbC1saW5lcwotCQkJVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dCBvbmx5LgotCQkJQnkgZGVmYXVsdCwgb25seSB0aGUgbGluZXMgYXQgdGhlIGJlZ2lubmluZyBvZgotCQkJYSBiYXNpYy1ibG9jayBhcmUgYW5ub3RhdGVkLiAgSWYgdGhpcyBvcHRpb24gaXMKLQkJCXNwZWNpZmllZCwgZXZlcnkgbGluZSBpbiBhIGJhc2ljLWJsb2NrIGlzIGFubm90YXRlZAotCQkJYnkgcmVwZWF0aW5nIHRoZSBhbm5vdGF0aW9uIGZvciB0aGUgZmlyc3QgbGluZS4KLQkJCVRoaXMgb3B0aW9uIGlzIGlkZW50aWNhbCB0byB0Y292J3MgIi1hIi4KLQotLUkgZGlycwkJLS1kaXJlY3RvcnktcGF0aD1kaXJzCi0JCQlUaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0IG9ubHkuCi0JCQlTcGVjaWZpZXMgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gYmUgc2VhcmNoZWQKLQkJCWZvciBzb3VyY2UgZmlsZXMuICBUaGUgYXJndW1lbnQgImRpcnMiIGlzIGEgY29sb24KLQkJCXNlcGFyYXRlZCBsaXN0IG9mIGRpcmVjdG9yaWVzLiAgQnkgZGVmYXVsdCwgZ3Byb2YKLQkJCXNlYXJjaGVzIGZvciBzb3VyY2UgZmlsZXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQKLQkJCXdvcmtpbmcgZGlyZWN0b3J5IG9ubHkuCi0KLS16CQktLWRpc3BsYXktdW51c2VkLWZ1bmN0aW9ucwotCi0tbSBudW0JCS0tbWluLWNvdW50PW51bQotCQkJVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIGFuZCBleGVjdXRpb24KLQkJCWNvdW50IG91dHB1dCBvbmx5LiAgU3ltYm9scyB0aGF0IGFyZSBleGVjdXRlZAotCQkJbGVzcyB0aGFuICJudW0iIHRpbWVzIGFyZSBzdXBwcmVzc2VkLiAgRm9yIGFubm90YXRlZAotCQkJc291cmNlIG91dHB1dCwgc3VwcHJlc3NlZCBzeW1ib2xzIGFyZSBtYXJrZWQKLQkJCWJ5IGZpdmUgaGFzaC1tYXJrcyAoIyMjIyMpLiAgSW4gYW4gZXhlY3V0aW9uIGNvdW50Ci0JCQlvdXRwdXQsIHN1cHByZXNzZWQgc3ltYm9scyBkbyBub3QgYXBwZWFyIGF0IGFsbC4KLQotLUwJCS0tcHJpbnQtcGF0aAotCQkJTm9ybWFsbHksIHNvdXJjZSBmaWxlbmFtZXMgYXJlIHByaW50ZWQgd2l0aCB0aGUgcGF0aAotCQkJY29tcG9uZW50IHN1cHByZXNzZWQuICBXaXRoIHRoaXMgb3B0aW9uLCBncHJvZgotCQkJY2FuIGJlIGZvcmNlZCB0byBwcmludCB0aGUgZnVsbCBwYXRobmFtZSBvZgotCQkJc291cmNlIGZpbGVuYW1lcy4gIFRoZSBmdWxsIHBhdGhuYW1lIGlzIGRldGVybWluZWQKLQkJCWZyb20gc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIHRoZSBpbWFnZSBmaWxlCi0JCQlhbmQgaXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tcGlsZXIKLQkJCXdhcyBpbnZva2VkLgotCi0teQkJLS1zZXBhcmF0ZS1maWxlcwotCQkJVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dCBvbmx5LgotCQkJTm9ybWFsbHksIGdwcm9mIHByaW50cyBhbm5vdGF0ZWQgc291cmNlIGZpbGVzCi0JCQl0byBzdGFuZGFyZC1vdXRwdXQuICBJZiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsCi0JCQlhbm5vdGF0ZWQgc291cmNlIGZvciBhIGZpbGUgbmFtZWQgInBhdGgvZmlsZW5hbWUiCi0JCQlpcyBnZW5lcmF0ZWQgaW4gdGhlIGZpbGUgImZpbGVuYW1lLWFubiIuICBUaGF0IGlzLAotCQkJYW5ub3RhdGVkIG91dHB1dCBpcyB7XGVtIGFsd2F5c1wvfSBnZW5lcmF0ZWQgaW4KLQkJCWdwcm9mJ3MgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIENhcmUgaGFzIHRvCi0JCQliZSB0YWtlbiBpZiBhIHByb2dyYW0gY29uc2lzdHMgb2YgZmlsZXMgdGhhdCBoYXZlCi0JCQlpZGVudGljYWwgZmlsZW5hbWVzLCBidXQgZGlzdGluY3QgcGF0aHMuCi0KLS1jCQktLXN0YXRpYy1jYWxsLWdyYXBoCi0KLS10IG51bQkJLS10YWJsZS1sZW5ndGg9bnVtCi0JCQlUaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0IG9ubHkuCi0JCQlBZnRlciBhbm5vdGF0aW5nIGEgc291cmNlIGZpbGUsIGdwcm9mIGdlbmVyYXRlcwotCQkJYW4gZXhlY3V0aW9uIGNvdW50IHN1bW1hcnkgY29uc2lzdGluZyBvZiBhIHRhYmxlCi0JCQlvZiBsaW5lcyB3aXRoIHRoZSB0b3AgZXhlY3V0aW9uIGNvdW50cy4gIEJ5Ci0JCQlkZWZhdWx0LCB0aGlzIHRhYmxlIGlzIHRlbiBlbnRyaWVzIGxvbmcuCi0JCQlUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHRhYmxlIGxlbmd0aAotCQkJb3IsIGJ5IHNwZWNpZnlpbmcgYW4gYXJndW1lbnQgdmFsdWUgb2YgMCwgaXQgY2FuIGJlCi0JCQlzdXBwcmVzc2VkIGNvbXBsZXRlbHkuCi0KLS1uIHN5bXNwZWMJLS10aW1lPXN5bXNwZWMKLQkJCU9ubHkgc3ltYm9scyBzZWxlY3RlZCBieSAic3ltc3BlYyIgYXJlIGNvbnNpZGVyZWQKLQkJCWluIHRvdGFsIGFuZCBwZXJjZW50YWdlIHRpbWUgY29tcHV0YXRpb25zLgotCQkJSG93ZXZlciwgdGhpcyBvcHRpb24gZG9lcyBub3QgYWZmZWN0IHBlcmNlbnRhZ2UgdGltZQotCQkJY29tcHV0YXRpb24gZm9yIHRoZSBmbGF0IHByb2ZpbGUuCi0JCQlJZiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgdGhlIHVuaW9uCi0JCQlvZiBhbGwgc2VsZWN0ZWQgc3ltYm9scyBpcyB1c2VkIGluIHRpbWUgY29tcHV0YXRpb25zLgotCi0tTgkJLS1uby10aW1lPXN5bXNwZWMKLQkJCUV4Y2x1ZGUgdGhlIHN5bWJvbHMgc2VsZWN0ZWQgYnkgInN5bXNwZWMiIGZyb20KLQkJCXRvdGFsIGFuZCBwZXJjZW50YWdlIHRpbWUgY29tcHV0YXRpb25zLgotCQkJSG93ZXZlciwgdGhpcyBvcHRpb24gZG9lcyBub3QgYWZmZWN0IHBlcmNlbnRhZ2UgdGltZQotCQkJY29tcHV0YXRpb24gZm9yIHRoZSBmbGF0IHByb2ZpbGUuCi0JCQlUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGlmIGFueSAtLXRpbWUgb3B0aW9ucyBhcmUKLQkJCXNwZWNpZmllZC4KLQotLXcgbnVtCQktLXdpZHRoPW51bQotCQkJU2V0cyB0aGUgb3V0cHV0IGxpbmUgd2lkdGguICBDdXJyZW50bHksIHRoaXMgb3B0aW9uCi0JCQlhZmZlY3RzIHRoZSBwcmludGluZyBvZiB0aGUgY2FsbC1ncmFwaCBmdW5jdGlvbiBpbmRleAotCQkJb25seS4KLQotLWUJCTxubyBsb25nIGZvcm0tLS1mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seT4KLS1FCQk8bm8gbG9uZyBmb3JtLS0tZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHk+Ci0tZgkJPG5vIGxvbmcgZm9ybS0tLWZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5PgotLUYJCTxubyBsb25nIGZvcm0tLS1mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seT4KLS1rCQk8bm8gbG9uZyBmb3JtLS0tZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHk+Ci0tYgkJLS1icmllZgotLWRudW0JCS0tZGVidWdbPW51bV0KLQotLWgJCS0taGVscAotCQkJUHJpbnRzIGEgdXNhZ2UgbWVzc2FnZS4KLQotLU8gbmFtZQkJLS1maWxlLWZvcm1hdD1uYW1lCi0JCQlTZWxlY3RzIHRoZSBmb3JtYXQgb2YgdGhlIHByb2ZpbGUgZGF0YSBmaWxlcy4KLQkJCVJlY29nbml6ZWQgZm9ybWF0cyBhcmUgImF1dG8iLCAiYnNkIiwgIm1hZ2ljIiwKLQkJCWFuZCAicHJvZiIuICBUaGUgbGFzdCBvbmUgaXMgbm90IHlldCBzdXBwb3J0ZWQuCi0JCQlGb3JtYXQgImF1dG8iIGF0dGVtcHRzIHRvIGRldGVjdCB0aGUgZmlsZSBmb3JtYXQKLQkJCWF1dG9tYXRpY2FsbHkgKHRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IpLgotCQkJSXQgYXR0ZW1wdHMgdG8gcmVhZCB0aGUgcHJvZmlsZSBkYXRhIGZpbGVzIGFzCi0JCQkibWFnaWMiIGZpbGVzIGFuZCBpZiB0aGlzIGZhaWxzLCBmYWxscyBiYWNrIHRvCi0JCQl0aGUgImJzZCIgZm9ybWF0LiAgImJzZCIgZm9yY2VzIGdwcm9mIHRvIHJlYWQKLQkJCXRoZSBkYXRhIGZpbGVzIGluIHRoZSBCU0QgZm9ybWF0LiAgIm1hZ2ljIiBmb3JjZXMKLQkJCWdwcm9mIHRvIHJlYWQgdGhlIGRhdGEgZmlsZXMgaW4gdGhlICJtYWdpYyIgZm9ybWF0LgotCi0tVAkJLS10cmFkaXRpb25hbAotLXYJCS0tdmVyc2lvbgotCi0qKiBGaWxlIEZvcm1hdCBDaGFuZ2VzCi0KLVRoZSBvbGQgQlNELWRlcml2ZWQgZm9ybWF0IHVzZWQgZm9yIHByb2ZpbGUgZGF0YSBkb2VzIG5vdCBjb250YWluIGEKLW1hZ2ljIGNvb2tpZSB0aGF0IGFsbG93cyB0byBjaGVjayB3aGV0aGVyIGEgZGF0YSBmaWxlIHJlYWxseSBpcyBhCi1ncHJvZiBmaWxlLiAgRnVydGhlcm1vcmUsIGl0IGRvZXMgbm90IHByb3ZpZGUgYSB2ZXJzaW9uIG51bWJlciwgdGh1cwotcmVuZGVyaW5nIGNoYW5nZXMgdG8gdGhlIGZpbGUgZm9ybWF0IGFsbW9zdCBpbXBvc3NpYmxlLiAgR05VIGdwcm9mCi11c2VzIGEgbmV3IGZpbGUgZm9ybWF0IHRoYXQgcHJvdmlkZXMgdGhlc2UgZmVhdHVyZXMuICBGb3IgYmFja3dhcmQKLWNvbXBhdGliaWxpdHksIEdOVSBncHJvZiBjb250aW51ZXMgdG8gc3VwcG9ydCB0aGUgb2xkIEJTRC1kZXJpdmVkCi1mb3JtYXQsIGJ1dCBub3QgYWxsIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQgd2l0aCBpdC4gIEZvciBleGFtcGxlLAotYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBjYW5ub3QgYmUgYWNjb21tb2RhdGVkIGJ5IHRoZSBvbGQgZmlsZQotZm9ybWF0LgotCi1UaGUgbmV3IGZpbGUgZm9ybWF0IGlzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGUgXGZpbGV7Z21vbl9vdXQuaH0uICBJdAotY29uc2lzdHMgb2YgYSBoZWFkZXIgY29udGFpbmluZyB0aGUgbWFnaWMgY29va2llIGFuZCBhIHZlcnNpb24gbnVtYmVyLAotYXMgd2VsbCBhcyBzb21lIHNwYXJlIGJ5dGVzIGF2YWlsYWJsZSBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuICBBbGwgZGF0YQotaW4gYSBwcm9maWxlIGRhdGEgZmlsZSBpcyBpbiB0aGUgbmF0aXZlIGZvcm1hdCBvZiB0aGUgaG9zdCBvbiB3aGljaAotdGhlIHByb2ZpbGUgd2FzIGNvbGxlY3RlZC4gIEdOVSBncHJvZiBhZGFwdHMgYXV0b21hdGljYWxseSB0byB0aGUKLWJ5dGUtb3JkZXIgaW4gdXNlLgotCi1JbiB0aGUgbmV3IGZpbGUgZm9ybWF0LCB0aGUgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YKLXJlY29yZHMuICBDdXJyZW50bHksIHRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgcmVjb3JkIHR5cGVzOiBoaXN0b2dyYW0KLXJlY29yZHMsIGNhbGwtZ3JhcGggYXJjIHJlY29yZHMsIGFuZCBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnQKLXJlY29yZHMuICBFYWNoIGZpbGUgY2FuIGNvbnRhaW4gYW55IG51bWJlciBvZiBlYWNoIHJlY29yZCB0eXBlLiAgV2hlbgotcmVhZGluZyBhIGZpbGUsIEdOVSBncHJvZiB3aWxsIGVuc3VyZSByZWNvcmRzIG9mIHRoZSBzYW1lIHR5cGUgYXJlCi1jb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlciBhbmQgY29tcHV0ZSB0aGUgdW5pb24gb2YgYWxsIHJlY29yZHMuICBGb3IKLWV4YW1wbGUsIGZvciBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLCB0aGUgdW5pb24gaXMgc2ltcGx5IHRoZSBzdW0KLW9mIGFsbCBleGVjdXRpb24gY291bnRzIGZvciBlYWNoIGJhc2ljLWJsb2NrLgotCi0qKiogSGlzdG9ncmFtIFJlY29yZHMKLQotSGlzdG9ncmFtIHJlY29yZHMgY29uc2lzdCBvZiBhIGhlYWRlciB0aGF0IGlzIGZvbGxvd2VkIGJ5IGFuIGFycmF5IG9mCi1iaW5zLiAgVGhlIGhlYWRlciBjb250YWlucyB0aGUgdGV4dC1zZWdtZW50IHJhbmdlIHRoYXQgdGhlIGhpc3RvZ3JhbQotc3BhbnMsIHRoZSBzaXplIG9mIHRoZSBoaXN0b2dyYW0gaW4gYnl0ZXMgKHVubGlrZSBpbiB0aGUgb2xkIEJTRAotZm9ybWF0LCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGhlYWRlciksIHRoZSByYXRlIG9mIHRoZQotcHJvZmlsaW5nIGNsb2NrLCBhbmQgdGhlIHBoeXNpY2FsIGRpbWVuc2lvbiB0aGF0IHRoZSBiaW4gY291bnRzCi1yZXByZXNlbnQgYWZ0ZXIgYmVpbmcgc2NhbGVkIGJ5IHRoZSBwcm9maWxpbmcgY2xvY2sgcmF0ZS4gIFRoZQotcGh5c2ljYWwgZGltZW5zaW9uIGlzIHNwZWNpZmllZCBpbiB0d28gcGFydHM6IGEgbG9uZyBuYW1lIG9mIHVwIHRvIDE1Ci1jaGFyYWN0ZXJzIGFuZCBhIHNpbmdsZSBjaGFyYWN0ZXIgYWJicmV2aWF0aW9uLiAgRm9yIGV4YW1wbGUsIGEKLWhpc3RvZ3JhbSByZXByZXNlbnRpbmcgcmVhbC10aW1lIHdvdWxkIHNwZWNpZnkgdGhlIGxvbmcgbmFtZSBhcwotInNlY29uZHMiIGFuZCB0aGUgYWJicmV2aWF0aW9uIGFzICJzIi4gIFRoaXMgZmVhdHVyZSBpcyB1c2VmdWwgZm9yCi1hcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydCBwZXJmb3JtYW5jZSBtb25pdG9yIGhhcmR3YXJlICh3aGljaCwKLWZvcnR1bmF0ZWx5LCBpcyBiZWNvbWluZyBpbmNyZWFzaW5nbHkgY29tbW9uKS4gIEZvciBleGFtcGxlLCB1bmRlciBERUMKLU9TRi8xLCB0aGUgInVwcm9maWxlIiBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHByb2R1Y2UgYSBoaXN0b2dyYW0gb2YsCi1zYXksIGluc3RydWN0aW9uIGNhY2hlIG1pc3Nlcy4gIEluIHRoaXMgY2FzZSwgdGhlIGRpbWVuc2lvbiBpbiB0aGUKLWhpc3RvZ3JhbSBoZWFkZXIgY291bGQgYmUgc2V0IHRvICJpLWNhY2hlIG1pc3NlcyIgYW5kIHRoZSBhYmJyZXZpYXRpb24KLWNvdWxkIGJlIHNldCB0byAiMSIgKGJlY2F1c2UgaXQgaXMgc2ltcGx5IGEgY291bnQsIG5vdCBhIHBoeXNpY2FsCi1kaW1lbnNpb24pLiAgQWxzbywgdGhlIHByb2ZpbGluZyByYXRlIHdvdWxkIGhhdmUgdG8gYmUgc2V0IHRvIDEgaW4KLXRoaXMgY2FzZS4KLQotSGlzdG9ncmFtIGJpbnMgYXJlIDE2LWJpdCBudW1iZXJzIGFuZCBlYWNoIGJpbiByZXByZXNlbnQgYW4gZXF1YWwKLWFtb3VudCBvZiB0ZXh0LXNwYWNlLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSB0ZXh0LXNlZ21lbnQgaXMgb25lCi10aG91c2FuZCBieXRlcyBsb25nIGFuZCBpZiB0aGVyZSBhcmUgdGVuIGJpbnMgaW4gdGhlIGhpc3RvZ3JhbSwgZWFjaAotYmluIHJlcHJlc2VudHMgb25lIGh1bmRyZWQgYnl0ZXMuCi0KLQotKioqIENhbGwtR3JhcGggUmVjb3JkcwotCi1DYWxsLWdyYXBoIHJlY29yZHMgaGF2ZSBhIGZvcm1hdCB0aGF0IGlzIGlkZW50aWNhbCB0byB0aGUgb25lIHVzZWQgaW4KLXRoZSBCU0QtZGVyaXZlZCBmaWxlIGZvcm1hdC4gIEl0IGNvbnNpc3RzIG9mIGFuIGFyYyBpbiB0aGUgY2FsbCBncmFwaAotYW5kIGEgY291bnQgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhcmMgd2FzIHRyYXZlcnNlZAotZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uLiAgQXJjcyBhcmUgc3BlY2lmaWVkIGJ5IGEgcGFpciBvZiBhZGRyZXNzZXM6Ci10aGUgZmlyc3QgbXVzdCBiZSB3aXRoaW4gY2FsbGVyJ3MgZnVuY3Rpb24gYW5kIHRoZSBzZWNvbmQgbXVzdCBiZQotd2l0aGluIHRoZSBjYWxsZWUncyBmdW5jdGlvbi4gIFdoZW4gcGVyZm9ybWluZyBwcm9maWxpbmcgYXQgdGhlCi1mdW5jdGlvbiBsZXZlbCwgdGhlc2UgYWRkcmVzc2VzIGNhbiBwb2ludCBhbnl3aGVyZSB3aXRoaW4gdGhlCi1yZXNwZWN0aXZlIGZ1bmN0aW9uLiAgSG93ZXZlciwgd2hlbiBwcm9maWxpbmcgYXQgdGhlIGxpbmUtbGV2ZWwsIGl0IGlzCi1iZXR0ZXIgaWYgdGhlIGFkZHJlc3NlcyBhcmUgYXMgY2xvc2UgdG8gdGhlIGNhbGwtc2l0ZS9lbnRyeS1wb2ludCBhcwotcG9zc2libGUuICBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGxpbmUtbGV2ZWwgY2FsbC1ncmFwaCBpcyBhYmxlIHRvCi1pZGVudGlmeSBleGFjdGx5IHdoaWNoIGxpbmUgb2Ygc291cmNlIGNvZGUgcGVyZm9ybWVkIGNhbGxzIHRvIGEKLWZ1bmN0aW9uLgotCi0qKiogQmFzaWMtQmxvY2sgRXhlY3V0aW9uIENvdW50IFJlY29yZHMKLQotQmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50IHJlY29yZHMgY29uc2lzdCBvZiBhIGhlYWRlciBmb2xsb3dlZCBieSBhCi1zZXF1ZW5jZSBvZiBhZGRyZXNzL2NvdW50IHBhaXJzLiAgVGhlIGhlYWRlciBzaW1wbHkgc3BlY2lmaWVzIHRoZQotbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZS4gIEluIGFuIGFkZHJlc3MvY291bnQgcGFpciwgdGhlIGFkZHJlc3MKLWlkZW50aWZpZXMgYSBiYXNpYy1ibG9jayBhbmQgdGhlIGNvdW50IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRpbWVzCi10aGF0IGJhc2ljLWJsb2NrIHdhcyBleGVjdXRlZC4gIEFueSBhZGRyZXNzIHdpdGhpbiB0aGUgYmFzaWMtYWRkcmVzcyBjYW4KLWJlIHVzZWQuCi0KLUlNUExFTUVOVEFUSU9OIE5PVEU6IGdjYyAtYSBjYW4gYmUgdXNlZCB0byBpbnN0cnVtZW50IGEgcHJvZ3JhbSB0bwotcmVjb3JkIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMuICBIb3dldmVyLCB0aGUgX19iYl9leGl0X2Z1bmMoKQotdGhhdCBpcyBjdXJyZW50bHkgcHJlc2VudCBpbiBsaWJnY2MyLmMgZG9lcyBub3QgZ2VuZXJhdGUgYSBnbW9uLm91dAotZmlsZSBpbiBhIHN1aXRlYWJsZSBmb3JtYXQuICBUaGlzIHNob3VsZCBiZSBmaXhlZCBmb3IgZnV0dXJlIHJlbGVhc2VzCi1vZiBnY2MuICBJbiB0aGUgbWVhbnRpbWUsIGNvbnRhY3QgZGF2aWRtQGNzLmFyaXpvbmEuZWR1IGZvciBhIHZlcnNpb24KLW9mIF9fYmJfZXhpdF9mdW5jKCkgdG8gaXMgYXBwcm9wcmlhdGUuCmRpZmYgLS1naXQgYS9ncHJvZi9URVNUIGIvZ3Byb2YvVEVTVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhOTAzMC4uMDAwMDAwMAotLS0gYS9ncHJvZi9URVNUCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0tIGNoZWNrIHdoZXRoZXIgb2xkIGZpbGUgZm9ybWF0IGlzIHByb3Blcmx5IHJlYWQgd2hlbiBpbnB1dCBjb21lcyBmcm9tCi0gIHN0ZGluCi0KLS0gY2hlY2sgd2hldGhlciB1bmRlcnNjb3JlcyBhcmUgcHJvcGVybHkgZGVhbHQgd2l0aCAoYm90aCwgb24gc3lzdGVtcwotICB0aGF0IHByZXBlbmQgdGhlbSB0byBlYWNoIEMgbmFtZSBhbmQgb24gc3lzdGVtcyB0aGF0IGRvbid0KQotCi0tIGVuc3VyZSBncHJvZiBmYWlscyBncmFjZWZ1bGx5IHdoZW4gbm8gZGVidWdnaW5nIGluZm8gYXZhaWxhYmxlCmRpZmYgLS1naXQgYS9ncHJvZi9UT0RPIGIvZ3Byb2YvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxMTFjNi4uMDAwMDAwMAotLS0gYS9ncHJvZi9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotCi0tIGdtb25faW8uYyBjYW5ub3QgZGVhbCB3aXRoIHRhcmdldCBhcmNoaXRlY3R1cmUgdGhhdCBoYXZlIGEgcG9pbnRlciBzaXplCi0gIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGhvc3QgYXJjaGl0ZWN0dXJlcyBwb2ludGVyIHNpemUtLS1maXggdGhpcwotICAoZ21vbl9vdXQuaCwgYW5kIGdtb25faW8uYykKLS0gYWRkIHN1cHBvcnQgZm9yIHByb2YgZmlsZSBmb3JtYXQgc28gdGhhdCBwcm9mIGZpbGVzIGNhbiBiZSBkaXNwbGF5ZWQKLSAgYXQgdGhlIGxpbmUtbGV2ZWwgKHRoaXMgaXMgdXNlZnVsIGZvciB0aGUgdXByb2ZpbGUgdG9vbCB1bmRlciBERUMncwotICBPU0YvMSkKLS0gdGFrZSBhIGhhcmQgbG9vayBhdCAtLWZpbGUtb3JkZXJpbmcgKGJyb2tlbikgYW5kIC0tZnVuY3Rpb24tb3JkZXJpbmcKLQotKyBkb2N1bWVudGF0aW9uCi0rIG9wdGltaXplIGJmZF9maW5kX25lYXJlc3RfbGluZV9udW0oKSAob3IgcmVwbGFjZSBieSBkaWZmZXJlbnQgaW50ZXJmYWNlKQotKyBjbGVhbnVwIF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmVfbnVtKCkgZml4ZXMgJiBkZXNjcmlwdGlvbgotKyBlbnN1cmUgImNjIC1wZyIgcHJvZHVjZXMgZ29vZCBmaWxlcyB1bmRlciBPU0YvMSB2My4wCi0rIG1ha2Ugc3VyZSBncHJvZiB3b3JrcyB0b2dldGhlciB3aXRoIE9TRi8xIHYzLjAncyBwcm9maWxpbmcgbGlicmFyaWVzCi0rIGltcGxlbWVudCBzeW10YWJfcGFyc2UoKTsgbW9kaWZ5IHN5bV9sb29rdXAoKSB0byBjb25zaWRlciBhZGRyX2hpZ2gKLSsgY2hhbmdlIGdwcm9mLmMgdG8gY29sbGVjdCBsaXN0cywgdGhlbiBpbnZva2Ugc3ltdGFiX3BhcnNlKCkgZm9yCi0gIGVhY2ggbGlzdAotKyBRdWVzdGlvbnM6Ci0JbyBpcyAtYyAoLS1zdGF0aWMtY2FsbC1ncmFwaCkgdXNlZnVsIGF0IGFsbD8gIGkgY2FuJ3Qgc2VlCi0JICBob3c7IGlmIGl0IHdlcmUgZGVsZXRlZCwgZ3Byb2Ygd291bGQgYmUgY29tcGxldGVseSBtYWNoaW5lCi0JICBpbmRlcGVuZGVudCA9PiB5dXAsIGl0IGlzCi0JbyBhcmUgKGxvbmcpIG9wdGlvbiBuYW1lcyBhcHByb3ByaWF0ZT8KLQlvIC1rICgtLWV4Y2x1ZGUtYXJjKSBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgd2l0aCBnZXRvcHQoKTsKLQkgIGlzIG5ldyBzeW50YXggKC1rIGZyb20vdG8pIGFjY2VwdGFibGU/ICBJZiBub3QsIGhvdyB0bwotCSAgZml4IGl0PwotCW8gaW4gdGhlIEZTRiBvdXRwdXQsIHRoZSBjYWxsLWdyYXBoIGluZGV4IG5vdyBwcmludHMKLQkgIHRoZSBmaWxlbmFtZSBvZiBzdGF0aWMgZnVuY3Rpb25zIGluIHBhcmVudGhlc2VzOyBlLmcuLAotCSAgc3RhdGljIGZ1bmN0aW9uIGZvbygpIHRoYXQgaXMgZGVmaW5lZCBpbiBmaWxlIGJhci5jCi0JICB3b3VsZCBiZSBwcmludGVkIGFzOgotCi0JCQlbNF0gZm9vIChiYXIuYykKLQotCSAgaXMgdGhpcyBhY2NlcHRhYmxlPyAgc2hvdWxkIGl0IGJlIGRvbmUgb25seSBvcHRpb25hbGx5PwotCW8gc3ltYm9scyB3aXRoIGFkZHJlc3NlcyB0aGF0IG1hcCBiYWNrIHRvIGEgZGlmZmVyZW50Ci0JICBuYW1lIGFyZSBzdXBwcmVzc2VkIChoYXBwZW5zIHdpdGggbGFiZWxzLCBmb3IgZXhhbXBsZSk7Ci0JICBpcyB0aGlzIGFjY2VwdGFibGU/ICBzaG91bGQgaXQgYmUgZG9uZSBvbmx5IG9wdGlvbmFsbHk/Ci0rIGdlbmVyYWxpemUgdG8gYWxsb3cgYXJiaXRyYXJ5IGhpc3RvZ3JhbXMgKG5vdCBqdXN0IHRpbWUgaGlzdG9ncmFtcykKLSsgYmFzaWMtYmxvY2sgaW5mb3JtYXRpb24gY3VycmVudGx5IHJlcGxhY2VzIGFsbCBzeW1ib2xzIGNyZWF0ZWQgZnJvbQotICB0aGUgY29yZSBiZWNhdXNlIG9mIGFuIHVnbHkgb3JkZXJpbmcgY29uZmxpY3QtLS1mb3Igbm93LCB0aGUgY3VycmVudAotICBzb2x1dGlvbiB3b3JrcywgYnV0IHNvbWV0aGluZyBjbGVhbmVyIGlzIGRlc2lyYWJsZSA9PT4gY2xlYW5lZCB1cCwKLSAgYnV0IGl0J3Mgc2xvd2VyIG5vdwotKyBjb252ZXJ0IHRvIHZlcnkgbmV3IGZpbGUgZm9ybWF0IChiYWNrIHRvIHRyaXZpYWwgZm9ybWF0LCB0aGF0IGlzIDopCi0rIHJlcGxhY2UgImR1bW15LmgiIGZvciBBbHBoYSAoaWYgdGhlcmUgaXMgYW55IHVzZSB0byBpdCkKLSsgYWRkIHN1cHBvcnQgZm9yIGV4ZWN1dGlvbiB0aW1lIHByb2ZpbGluZyBhdCBhIGJhc2ljLWJsb2NrIGxldmVsCi0rIGZpeCBmaWxlbmFtZS1vZmYtYnktb25lIGJ1ZyBmb3IgQWxwaGEgKHNlZSB+L3RtcC9kLltjaF0pLS0tbm8gbG9uZ2VyCi0gIHJlbGV2YW50Ci0rICItcGcgLWEiIGRvZXNuJ3Qgd29yayBhcyBleHBlY3RlZCBiZWNhdXNlIG1jbGVhbnVwKCkgd2lsbCBvdmVyd3JpdGUKLSAgdGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IF9fYmJfZXhpdF9mdW5jKCkgKG9yIHZpY2UgdmVyc2EpCi0rIGZpcnN0IGJhc2ljLWJsb2NrIG9mIGZhYygpIHNlZW1zIHRvIGdldCBjcmVkaXRlZCB0byBsYXN0IGJhc2ljLWJsb2NrCi0gIG9mIHByZXZpb3VzIGZ1bmN0aW9uID0+IGJ1ZyBpbiBiYXNpY19ibG9ja3MuYwotKyBmbGF0IHByb2ZpbGUgc2hvdWxkIHByb3ZpZGUgYXV0b21hdGljIHNjYWxpbmcgZm9yIHBlci1jYWxsIHRpbWVzIGJlY2F1c2UKLSAgb3RoZXJ3aXNlIHRoZXknbGwgYWx3YXlzIGJlIHplcm8gb24gYSBmYXN0IG1hY2hpbmUgd2l0aCB0b25zIG9mIHNtYWxsCi0gIGZ1bmN0aW9ucwotKyBtYWtlICItYSIgaW1wbHkgdG8gcmV0YWluIGxpbmUgbnVtYmVyIGluZm8gKHdpdGhvdXQgYWN0dWFsbHkgZ2VuZXJhdGluZwotICB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uICh1bmxlc3MgLWcgaXMgc3BlY2lmaWVkKS0tLW5vLCB0aGlzIGlzIGEKLSAgYmFkIGlkZWEsIGJlY2F1c2UgaXQgaXMgbm90IGNsZWFyIHdoYXQgbGV2ZWwgb2YgZGVidWdnaW5nIGluZm8gc2hvdWxkCi0gIGJlIHJlcXVlc3RlZCAoZS5nLiwgLWcgdnMuIC1nMyk7IGxlYXZpbmcgaXQgdXAgdG8gdGhlIHVzZXIgc2VlbXMgYmVzdAotKyBhZGQgbG9uZyBvcHRpb25zIHN1cHBvcnQgKG9yIGF0IGxlYXN0IHVzZSBnZXRvcHQgaW5zdGVhZCBvZiBhZC1ob2MKLSAgaW1wbGVtZW50YXRpb24pCi0rIHNwbGl0IGludG8gZmlsZXMgYWNjb3JkaW5nIHRvIGFic3RyYWN0IG9iamVjdHMgdGhhdCBhcmUgbWFuaXB1bGF0ZWQKLSsgcmVwbGFjZSBzY2NzaWQgYnkgcmNzaWQgJiBhZGQgImVuZCBvZiAuLi4iIHRvIGV2ZXJ5IC5jIGZpbGUKLSsgdXNlIERCRygpIGV2ZXJ5d2hlcmUKLSsgZml4IHNwYWNpbmcgKCIgLCIgLT4gIiwiIGV0Yy4pCi0rIHVzZSBERUZVTnMgZXZlcnl3aGVyZQotKyBtYWtlIGNvbXBpbGUgY2xlYW5seSB3aXRoIC1XYWxsCi0rICJnY2MgLXBnIC1PMiIgZG9lc24ndCB3b3JrIG9uIHRlY2MuYyB1bmxlc3MgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgaXMKLSAgc3BlY2lmaWVkOyBmaW5kIG91dCB3aHkKLSsgbWFrZSB0aGluZ3MgcG9ydGFibGUgKHByb3RvdHlwZXMsIGNvbnN0LCBldGMuKQotKyBpZiBORVdfR01PTl9PVVQgaXMgbm90IGRlZmluZWQsIGhhdmUgYSBmbGFnIHRoYXQgd2lsbCBhbGxvdyB0bwotICByZWFkIG5ldyBnbW9uLm91dCBzdHlsZSBmaWxlcy4gIFRoZSBpZGVhIGJlaW5nIHRoYXQgZXZlcnlvbmUKLSAgd2lsbCB1c2UgdGhlIG5ldyBmb3JtYXQgZm9yIGJhc2ljLWJsb2NrIHN0eWxlIHByb2ZpbGluZyBidXQKLSAgdGhlIG9sZCBmb3JtYXQgZm9yIHJlZ3VsYXIgZ3Bwcm9maWxpbmcKZGlmZiAtLWdpdCBhL2dwcm9mL2FjbG9jYWwubTQgYi9ncHJvZi9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDIwMTIyLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTA5ICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40Ci0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KLSMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgotIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBzZXJpYWwgMQotCi1kbmwgVXNhZ2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQotCi1BQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi1QQUNLQUdFPVskMV0KLUFDX1NVQlNUKFBBQ0tBR0UpCi1WRVJTSU9OPVskMl0KLUFDX1NVQlNUKFZFUlNJT04pCi1kbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotaWZlbHNlKFskM10sLAotQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQotZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgotIwotCi1BQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotcm0gLWYgY29uZnRlc3QqCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi1kbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKLWRubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCi1BQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCi1bQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgJDE9JDIKLSAgIEFDX01TR19SRVNVTFQoZm91bmQpCi1lbHNlCi0gICAkMT0iJDMvbWlzc2luZyAkMiIKLSAgIEFDX01TR19SRVNVTFQobWlzc2luZykKLWZpCi1BQ19TVUJTVCgkMSldKQotCi0KLSMgc2VyaWFsIDM1IEFDX1BST0dfTElCVE9PTAotQUNfREVGVU4oQUNfUFJPR19MSUJUT09MLAotW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLUFDX0NBQ0hFX1NBVkUKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLUFDX0NBQ0hFX0xPQUQKLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLUFDX1NVQlNUKExJQlRPT0wpZG5sCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLUFDX0RFRlVOKEFDX0xJQlRPT0xfU0VUVVAsCi1bQUNfUFJFUkVRKDIuMTMpZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotZG5sCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKLSAgICBbQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gIEFDX1NZU19MSUJUT09MX0NZR1dJTgotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLVsgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZ10sCi1uZWVkX2xvY2tzPSRlbmFibGV2YWwsCi1uZWVkX2xvY2tzPXllcykKLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi1dKQotCi0jIEFDX0xJQlRPT0xfRExPUEVOIC0gY2hlY2sgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW2x0X2Rsb3Blbj15ZXNdKQotCi0jIEFDX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TSEFSRUQsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc2hhcmVkLAotY2hhbmdlcXVvdGUoPDwsID4+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+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0jIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKLSMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLQotIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMwotCi1BQ19ERUZVTihDWV9XSVRIX05MUywKLSAgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUwotICAgIEFDX0FSR19FTkFCTEUobmxzLAotICAgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCi0gICAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQotICAgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCi0gICAgQUNfU1VCU1QoVVNFX05MUykKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCi0gICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTLCAxLCBbRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKLSAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQotICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAotICAgICAgICBkbmwgdG8gdXNlLiAgSWYgZ2V0dGV4dCBvciBjYXRnZXRzIGFyZSBhdmFpbGFibGUgKGluIHRoaXMgb3JkZXIpIHdlCi0gICAgICAgIGRubCB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgotCWRubCBjYXRnZXRzIGlzIG9ubHkgdXNlZCBpZiBwZXJtaXR0ZWQgYnkgb3B0aW9uIC0td2l0aC1jYXRnZXRzLgotCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlBQ19DSEVDS19IRUFERVIobGliaW50bC5oLAotCSAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMsCi0JICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD5dLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JICAgICAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcywgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8pXSkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIEFDX0NIRUNLX0xJQihpbnRsLCBiaW5kdGV4dGRvbWFpbiwKLQkgICAgICAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsLAotCQkgW0FDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMsCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubyldKV0pCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCwgMSwKLQkJCVtEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC5dKQotCSAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JCVt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbm8pZG5sCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlBQ19DSEVDS19GVU5DUyhkY2dldHRleHQpCi0JCUFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotCQlBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0JCUFDX1RSWV9MSU5LKCwgW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cl0sCi0JCSAgW0NBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlXSwKLQkJICBbQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWJdKQotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JXSkKLQotCWRubCBJbiB0aGUgc3RhbmRhcmQgZ2V0dGV4dCwgd2Ugd291bGQgbm93IGNoZWNrIGZvciBjYXRnZXRzLgotICAgICAgICBkbmwgSG93ZXZlciwgd2UgbmV2ZXIgd2FudCB0byB1c2UgY2F0Z2V0cyBmb3Igb3VyIHJlbGVhc2VzLgotCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICBkbmwgTmVpdGhlciBnZXR0ZXh0IG5vciBjYXRnZXRzIGluIGluY2x1ZGVkIGluIHRoZSBDIGxpYnJhcnkuCi0JICBkbmwgRmFsbCBiYWNrIG9uIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0JICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KLSAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbXNnZm10KQotICAgICAgICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0gICAgICAgIEFDX1NVQlNUKE1TR0ZNVCkKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCi0gICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCWRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKLQlkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgotCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIEFDX01TR19SRVNVTFQoCi0JICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICBkbmwgVGhlc2UgcnVsZXMgYXJlIHNvbGVseSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBnb2FsLiAgV2hpbGUgZG9pbmcgdGhpcwotICAgIGRubCB3ZSBvbmx5IGhhdmUgdG8ga2VlcCBleGFjdGx5IG9uZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgY2F0YWxvZ3MKLSAgICBkbmwgaW4gY29uZmlndXJlLmluLgotICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCi0gICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCi0gICAgQUNfU1VCU1QoQ0FUQUxPR1MpCi0gICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQotICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQotICAgIEFDX1NVQlNUKEdNT0ZJTEVTKQotICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCi0gICAgQUNfU1VCU1QoSU5UTERFUFMpCi0gICAgQUNfU1VCU1QoSU5UTExJQlMpCi0gICAgQUNfU1VCU1QoSU5UTE9CSlMpCi0gICAgQUNfU1VCU1QoUE9GSUxFUykKLSAgICBBQ19TVUJTVChQT1NVQikKLSAgXSkKLQotQUNfREVGVU4oQ1lfR05VX0dFVFRFWFQsCi0gIFtBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX01NQVBdKWRubAotCi0gICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaF0pCi0gICBBQ19DSEVDS19GVU5DUyhbZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dF0pCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5KQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIEFDX0RFRklORShIQVZFX1NUUENQWSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uXSkKLSAgIGZpCi0KLSAgIEFNX0xDX01FU1NBR0VTCi0gICBDWV9XSVRIX05MUwotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkKQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgQUNfTVNHX1JFU1VMVCgkTElOR1VBUykKLSAgICAgZmkKLQotICAgICBkbmwgQ29uc3RydWN0IGxpc3Qgb2YgbmFtZXMgb2YgY2F0YWxvZyBmaWxlcyB0byBiZSBjb25zdHJ1Y3RlZC4KLSAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgZG5sIFRoZSByZWZlcmVuY2UgdG8gPGxvY2FsZS5oPiBpbiB0aGUgaW5zdGFsbGVkIDxsaWJpbnRsLmg+IGZpbGUKLSAgIGRubCBtdXN0IGJlIHJlc29sdmVkIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdCB0aGUgdXNlcnMgb2YgdGhpcwotICAgZG5sIHRvIGRlZmluZSBIQVZFX0xPQ0FMRV9ILgotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICBBQ19TVUJTVChJTkNMVURFX0xPQ0FMRV9IKQotCi0gICBkbmwgRGV0ZXJtaW5lIHdoaWNoIGNhdGFsb2cgZm9ybWF0IHdlIGhhdmUgKGlmIGFueSBpcyBuZWVkZWQpCi0gICBkbmwgRm9yIG5vdyB3ZSBrbm93IGFib3V0IHR3byBkaWZmZXJlbnQgZm9ybWF0czoKLSAgIGRubCAgIExpbnV4IGxpYmMtNSBhbmQgdGhlIG5vcm1hbCBYL09wZW4gZm9ybWF0Ci0gICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgbXNnZm9ybWF0PWxpbnV4LCBtc2dmb3JtYXQ9eG9wZW4pCi0KLQkgZG5sIFRyYW5zZm9ybSB0aGUgU0VEIHNjcmlwdHMgd2hpbGUgY29weWluZyBiZWNhdXNlIHNvbWUgZHVtYiBTRURzCi0gICAgICAgICBkbmwgY2Fubm90IGhhbmRsZSBjb21tZW50cy4KLQkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgZG5sIHBvMnRibC5zZWQgaXMgYWx3YXlzIG5lZWRlZC4KLSAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICBkbmwgSW4gdGhlIGludGwvTWFrZWZpbGUuaW4gd2UgaGF2ZSBhIHNwZWNpYWwgZGVwZW5kZW5jeSB3aGljaCBtYWtlcwotICAgZG5sIG9ubHkgc2Vuc2UgZm9yIGdldHRleHQuICBXZSBjb21tZW50IHRoaXMgb3V0IGZvciBub24tZ2V0dGV4dAotICAgZG5sIHBhY2thZ2VzLgotICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIEFDX1NVQlNUKEdUX05PKQotICAgQUNfU1VCU1QoR1RfWUVTKQotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQotCi0gICBkbmwgKioqIEZvciBub3cgdGhlIGxpYnRvb2wgc3VwcG9ydCBpbiBpbnRsL01ha2VmaWxlIGlzIG5vdCBmb3IgcmVhbC4KLSAgIGw9Ci0gICBBQ19TVUJTVChsKQotCi0gICBkbmwgR2VuZXJhdGUgbGlzdCBvZiBmaWxlcyB0byBiZSBwcm9jZXNzZWQgYnkgeGdldHRleHQgd2hpY2ggd2lsbAotICAgZG5sIGJlIGluY2x1ZGVkIGluIHBvL01ha2VmaWxlLiAgQnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgcG8gZGlyZWN0b3J5Ci0gICBkbmwgZXhpc3RzIGluIHNyY2Rpci4KLSAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICBdKQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1kbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCi1kbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCi1BQ19ERUZVTihBTV9QQVRIX1BST0dfV0lUSF9URVNULAotWyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKLUFDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAotW2Nhc2UgIlskXSQxIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgWyQzXTsgdGhlbgotCWFjX2N2X3BhdGhfJDE9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWRubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCi1kbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KLWlmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCi1dKWRubAotICA7OwotZXNhY10pZG5sCi0kMT0iJGFjX2N2X3BhdGhfJDEiCi1pZiB0ZXN0IC1uICJbJF0kMSI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVChbJF0kMSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1BQ19TVUJTVCgkMSlkbmwKLV0pCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTENfTUVTU0FHRVMsCi0gIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAotICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCi0gICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCi0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUywgMSwKLQkJW0RlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuXSkKLSAgICBmaQotICBmaV0pCi0KLSMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLgotIyBGcm9tIEppbSBNZXllcmluZwotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX01BSU5UQUlORVJfTU9ERSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKLSAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAotWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbCwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8pCi0gIEFDX01TR19SRVNVTFQoJFVTRV9NQUlOVEFJTkVSX01PREUpCi0gIEFNX0NPTkRJVElPTkFMKE1BSU5UQUlORVJfTU9ERSwgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllcykKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIEFDX1NVQlNUKE1BSU5UKWRubAotXQotKQotCi0jIERlZmluZSBhIGNvbmRpdGlvbmFsLgotCi1BQ19ERUZVTihBTV9DT05ESVRJT05BTCwKLVtBQ19TVUJTVCgkMV9UUlVFKQotQUNfU1VCU1QoJDFfRkFMU0UpCi1pZiAkMjsgdGhlbgotICAkMV9UUlVFPQotICAkMV9GQUxTRT0nIycKLWVsc2UKLSAgJDFfVFJVRT0nIycKLSAgJDFfRkFMU0U9Ci1maV0pCi0KZGlmZiAtLWdpdCBhL2dwcm9mL2FscGhhLmMgYi9ncHJvZi9hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWFkNzRkLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2FscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5OCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotLyoKLSAqIE9wY29kZXMgb2YgdGhlIGNhbGwgaW5zdHJ1Y3Rpb25zOgotICovCi0jZGVmaW5lIE9QX0p4eAkweDFhCi0jZGVmaW5lCU9QX0JTUgkweDM0Ci0KLSNkZWZpbmUgSnh4X0ZVTkNfSk1QCQkwCi0jZGVmaW5lIEp4eF9GVU5DX0pTUgkJMQotI2RlZmluZSBKeHhfRlVOQ19SRVQJCTIKLSNkZWZpbmUgSnh4X0ZVTkNfSlNSX0NPUk9VVElORQkzCi0KLXR5cGVkZWYgdW5pb24KLSAgewotICAgIHN0cnVjdAotICAgICAgewotCXVuc2lnbmVkIG90aGVyOjI2OwotCXVuc2lnbmVkIG9wX2NvZGU6NjsKLSAgICAgIH0KLSAgICBhOwkJCQkvKiBhbnkgZm9ybWF0ICovCi0gICAgc3RydWN0Ci0gICAgICB7Ci0JaW50IGRpc3A6MjE7Ci0JdW5zaWduZWQgcmE6NTsKLQl1bnNpZ25lZCBvcF9jb2RlOjY7Ci0gICAgICB9Ci0gICAgYjsJCQkJLyogYnJhbmNoIGZvcm1hdCAqLwotICAgIHN0cnVjdAotICAgICAgewotCWludCBoaW50OjE0OwotCXVuc2lnbmVkIGZ1bmM6MjsKLQl1bnNpZ25lZCByYjo1OwotCXVuc2lnbmVkIHJhOjU7Ci0JdW5zaWduZWQgb3BfY29kZTo2OwotICAgICAgfQotICAgIGo7CQkJCS8qIGp1bXAgZm9ybWF0ICovCi0gIH0KLWFscGhhX0luc3RydWN0aW9uOwotCi1zdGF0aWMgU3ltIGluZGlyZWN0X2NoaWxkOwotCi0KLS8qCi0gKiBPbiB0aGUgQWxwaGEgd2UgY2FuIG9ubHkgZGV0ZWN0IFBDIHJlbGF0aXZlIGNhbGxzLCB3aGljaCBhcmUKLSAqIHVzdWFsbHkgZ2VuZXJhdGVkIGZvciBjYWxscyB0byBmdW5jdGlvbnMgd2l0aGluIHRoZSBzYW1lCi0gKiBvYmplY3QgZmlsZSBvbmx5LiAgVGhpcyBpcyBzdGlsbCBiZXR0ZXIgdGhhbiBub3RoaW5nLCBob3dldmVyLgotICogKEluIHBhcnRpY3VsYXIgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGZpbmQgZnVuY3Rpb25zIHRoYXQKLSAqICBwb3RlbnRpYWxseSBjYWxsIGludGVnZXIgZGl2aXNpb24gcm91dGluZXMsIGZvciBleGFtcGxlLikKLSAqLwotdm9pZAotYWxwaGFfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKQotICAgICBTeW0gKnBhcmVudDsKLSAgICAgYmZkX3ZtYSBwX2xvd3BjOwotICAgICBiZmRfdm1hIHBfaGlnaHBjOwotewotICBzdGF0aWMgYmZkX3ZtYSBkZWx0YSA9IDA7Ci0gIGJmZF92bWEgZGVzdF9wYzsKLSAgYWxwaGFfSW5zdHJ1Y3Rpb24gKnBjOwotICBTeW0gKmNoaWxkOwotCi0gIGlmICghZGVsdGEpCi0gICAgewotICAgICAgZGVsdGEgPSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlIC0gY29yZV90ZXh0X3NlY3QtPnZtYTsKLQotICAgICAgc3ltX2luaXQgKCZpbmRpcmVjdF9jaGlsZCk7Ci0gICAgICBpbmRpcmVjdF9jaGlsZC5uYW1lID0gXygiPGluZGlyZWN0IGNoaWxkPiIpOwotICAgICAgaW5kaXJlY3RfY2hpbGQuY2cucHJvcC5mcmFjdCA9IDEuMDsKLSAgICAgIGluZGlyZWN0X2NoaWxkLmNnLmN5Yy5oZWFkID0gJmluZGlyZWN0X2NoaWxkOwotICAgIH0KLQotICBpZiAoIWNvcmVfdGV4dF9zcGFjZSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAocF9sb3dwYyA8IHNfbG93cGMpCi0gICAgewotICAgICAgcF9sb3dwYyA9IHNfbG93cGM7Ci0gICAgfQotICBpZiAocF9oaWdocGMgPiBzX2hpZ2hwYykKLSAgICB7Ci0gICAgICBwX2hpZ2hwYyA9IHNfaGlnaHBjOwotICAgIH0KLSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoXygiW2ZpbmRfY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iKSwKLQkJCSAgcGFyZW50LT5uYW1lLCAodW5zaWduZWQgbG9uZykgcF9sb3dwYywKLQkJCSAgKHVuc2lnbmVkIGxvbmcpIHBfaGlnaHBjKSk7Ci0gIGZvciAocGMgPSAoYWxwaGFfSW5zdHJ1Y3Rpb24gKikgKHBfbG93cGMgKyBkZWx0YSk7Ci0gICAgICAgcGMgPCAoYWxwaGFfSW5zdHJ1Y3Rpb24gKikgKHBfaGlnaHBjICsgZGVsdGEpOwotICAgICAgICsrcGMpCi0gICAgewotICAgICAgc3dpdGNoIChwYy0+YS5vcF9jb2RlKQotCXsKLQljYXNlIE9QX0p4eDoKLQkgIC8qCi0JICAgKiBUaGVyZSBpcyBubyBzaW1wbGUgYW5kIHJlbGlhYmxlIHdheSB0byBkZXRlcm1pbmUgdGhlCi0JICAgKiB0YXJnZXQgb2YgYSBqc3IgKHRoZSBoaW50IGJpdHMgaGVscCwgYnV0IHRoZXJlIGFyZW4ndAotCSAgICogZW5vdWdoIGJpdHMgdG8gZ2V0IGEgc2F0aXNmYWN0b3J5IGhpdCByYXRlKS4gIEluc3RlYWQsCi0JICAgKiBmb3IgYW55IGluZGlyZWN0IGp1bXAgd2Ugc2ltcGx5IGFkZCBhbiBhcmMgZnJvbSBQQVJFTlQKLQkgICAqIHRvIElORElSRUNUX0NISUxELS0tdGhhdCB3YXkgdGhlIHVzZXIgaXQgYXQgbGVhc3QgYWJsZQotCSAgICogdG8gc2VlIHRoYXQgdGhlcmUgYXJlIG90aGVyIGNhbGxzIGFzIHdlbGwuCi0JICAgKi8KLQkgIGlmIChwYy0+ai5mdW5jID09IEp4eF9GVU5DX0pTUgotCSAgICAgIHx8IHBjLT5qLmZ1bmMgPT0gSnh4X0ZVTkNfSlNSX0NPUk9VVElORSkKLQkgICAgewotCSAgICAgIERCRyAoQ0FMTERFQlVHLAotCQkgICBwcmludGYgKF8oIltmaW5kX2NhbGxdIDB4JWx4OiBqc3IlcyA8aW5kaXJlY3RfY2hpbGQ+XG4iKSwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBwYyAtIGRlbHRhLAotCQkJICAgcGMtPmouZnVuYyA9PSBKeHhfRlVOQ19KU1IgPyAiIiA6ICJfY29yb3V0aW5lIikpOwotCSAgICAgIGFyY19hZGQgKHBhcmVudCwgJmluZGlyZWN0X2NoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBPUF9CU1I6Ci0JICBEQkcgKENBTExERUJVRywKLQkgICAgICAgcHJpbnRmIChfKCJbZmluZF9jYWxsXSAweCVseDogYnNyIiksCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgcGMgLSBkZWx0YSkpOwotCSAgLyoKLQkgICAqIFJlZ3VsYXIgUEMgcmVsYXRpdmUgYWRkcmVzc2luZy4gIENoZWNrIHRoYXQgdGhpcyBpcyB0aGUKLQkgICAqIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbi4gIFRoZSBsaW5rZXIgc29tZXRpbWVzIHJlZGlyZWN0cwotCSAgICogdGhlIGVudHJ5IHBvaW50IGJ5IDggYnl0ZXMgdG8gc2tpcCBsb2FkaW5nIHRoZSBnbG9iYWwKLQkgICAqIHBvaW50ZXIsIHNvIHdlIGFsbCBmb3IgZWl0aGVyIGFkZHJlc3M6Ci0JICAgKi8KLQkgIGRlc3RfcGMgPSAoKGJmZF92bWEpIChwYyArIDEgKyBwYy0+Yi5kaXNwKSkgLSBkZWx0YTsKLQkgIGlmIChkZXN0X3BjID49IHNfbG93cGMgJiYgZGVzdF9wYyA8PSBzX2hpZ2hwYykKLQkgICAgewotCSAgICAgIGNoaWxkID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgZGVzdF9wYyk7Ci0JICAgICAgREJHIChDQUxMREVCVUcsCi0JCSAgIHByaW50ZiAoIiAweCVseFx0OyBuYW1lPSVzLCBhZGRyPTB4JWx4IiwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBkZXN0X3BjLCBjaGlsZC0+bmFtZSwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBjaGlsZC0+YWRkcikpOwotCSAgICAgIGlmIChjaGlsZC0+YWRkciA9PSBkZXN0X3BjIHx8IGNoaWxkLT5hZGRyID09IGRlc3RfcGMgLSA4KQotCQl7Ci0JCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlxuIikpOwotCQkgIC8qIGEgaGl0OiAgKi8KLQkJICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgLyoKLQkgICAqIFNvbWV0aGluZyBmdW5ueSBnb2luZyBvbi4KLQkgICAqLwotCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlx0YnV0IGl0J3MgYSBib3RjaFxuIikpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2Jhc2ljX2Jsb2Nrcy5jIGIvZ3Byb2YvYmFzaWNfYmxvY2tzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZGQ3NjJiLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2Jhc2ljX2Jsb2Nrcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM5ICswLDAgQEAKLS8qCi0gKiBCYXNpYy1ibG9jayBsZXZlbCByZWxhdGVkIGNvZGU6IHJlYWRpbmcvd3JpdGluZyBvZiBiYXNpYy1ibG9jayBpbmZvCi0gKiB0by9mcm9tIGdtb24ub3V0OyBjb21wdXRpbmcgYW5kIGZvcm1hdHRpbmcgb2YgYmFzaWMtYmxvY2sgcmVsYXRlZAotICogc3RhdGlzdGljcy4KLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAiYmFzaWNfYmxvY2tzLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJnbW9uX2lvLmgiCi0jaW5jbHVkZSAiZ21vbl9vdXQuaCIKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInNvdXJjZS5oIgotI2luY2x1ZGUgInN5bV9pZHMuaCIKLQotCi0vKgotICogRGVmYXVsdCBvcHRpb24gdmFsdWVzOgotICovCi1ib29sIGJiX2Fubm90YXRlX2FsbF9saW5lcyA9IEZBTFNFOwotdW5zaWduZWQgbG9uZyBiYl9taW5fY2FsbHMgPSAxOwotaW50IGJiX3RhYmxlX2xlbmd0aCA9IDEwOwotCi0vKgotICogVmFyaWFibGVzIHVzZWQgdG8gY29tcHV0ZSBhbm5vdGF0ZWQgc291cmNlIGxpc3Rpbmcgc3RhdHM6Ci0gKi8KLXN0YXRpYyBsb25nIG51bV9leGVjdXRhYmxlX2xpbmVzOwotc3RhdGljIGxvbmcgbnVtX2xpbmVzX2V4ZWN1dGVkOwotCi0KLS8qCi0gKiBIZWxwZXIgZm9yIHNvcnRpbmcuICBDb21wYXJlcyB0d28gc3ltYm9scyBhbmQgcmV0dXJucyByZXN1bHQKLSAqIHN1Y2ggdGhhdCBzb3J0aW5nIHdpbGwgYmUgaW5jcmVhc2luZyBhY2NvcmRpbmcgdG8gZmlsZW5hbWUsIGxpbmUKLSAqIG51bWJlciwgYW5kIGFkZHJlc3MgKGluIHRoYXQgb3JkZXIpLgotICovCi0KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfYmIsIChscCwgcnApLCBjb25zdCB2b2lkICpscCBBTkQgY29uc3Qgdm9pZCAqcnApCi17Ci0gIGludCByOwotICBjb25zdCBTeW0gKmxlZnQgPSAqKGNvbnN0IFN5bSAqKikgbHA7Ci0gIGNvbnN0IFN5bSAqcmlnaHQgPSAqKGNvbnN0IFN5bSAqKikgcnA7Ci0KLSAgaWYgKGxlZnQtPmZpbGUgJiYgcmlnaHQtPmZpbGUpCi0gICAgewotICAgICAgciA9IHN0cmNtcCAobGVmdC0+ZmlsZS0+bmFtZSwgcmlnaHQtPmZpbGUtPm5hbWUpOwotICAgICAgaWYgKHIpCi0JewotCSAgcmV0dXJuIHI7Ci0JfQotCi0gICAgICBpZiAobGVmdC0+bGluZV9udW0gIT0gcmlnaHQtPmxpbmVfbnVtKQotCXsKLQkgIHJldHVybiBsZWZ0LT5saW5lX251bSAtIHJpZ2h0LT5saW5lX251bTsKLQl9Ci0gICAgfQotCi0gIGlmIChsZWZ0LT5hZGRyIDwgcmlnaHQtPmFkZHIpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgZWxzZSBpZiAobGVmdC0+YWRkciA+IHJpZ2h0LT5hZGRyKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotCi0vKgotICogSGVscGVyIGZvciBzb3J0aW5nLiAgT3JkZXIgYmFzaWMgYmxvY2tzIGluIGRlY3JlYXNpbmcgbnVtYmVyIG9mCi0gKiBjYWxscywgdGllcyBhcmUgYnJva2VuIGluIGluY3JlYXNpbmcgb3JkZXIgb2YgbGluZSBudW1iZXJzLgotICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX25jYWxscywgKGxwLCBycCksIGNvbnN0IHZvaWQgKmxwIEFORCBjb25zdCB2b2lkICpycCkKLXsKLSAgY29uc3QgU3ltICpsZWZ0ID0gKihjb25zdCBTeW0gKiopIGxwOwotICBjb25zdCBTeW0gKnJpZ2h0ID0gKihjb25zdCBTeW0gKiopIHJwOwotCi0gIGlmICghbGVmdCkKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKCFyaWdodCkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChsZWZ0LT5uY2FsbHMgPCByaWdodC0+bmNhbGxzKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChsZWZ0LT5uY2FsbHMgPiByaWdodC0+bmNhbGxzKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gbGVmdC0+bGluZV9udW0gLSByaWdodC0+bGluZV9udW07Ci19Ci0KLQotLyoKLSAqIFNraXAgb3ZlciB2YXJpYWJsZSBsZW5ndGggc3RyaW5nLgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKGZza2lwX3N0cmluZywgKGZwKSwgRklMRSAqIGZwKQotewotICBpbnQgY2g7Ci0KLSAgd2hpbGUgKChjaCA9IGZnZXRjIChmcCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBpZiAoY2ggPT0gJ1wwJykKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBSZWFkIGEgYmFzaWMtYmxvY2sgcmVjb3JkIGZyb20gZmlsZSBJRlAuICBGSUxFTkFNRSBpcyB0aGUgbmFtZQotICogb2YgZmlsZSBJRlAgYW5kIGlzIHByb3ZpZGVkIGZvciBmb3JtYXR0aW5nIGVycm9yLW1lc3NhZ2VzIG9ubHkuCi0gKi8KLXZvaWQKLURFRlVOIChiYl9yZWFkX3JlYywgKGlmcCwgZmlsZW5hbWUpLCBGSUxFICogaWZwIEFORCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgaW50IG5ibG9ja3MsIGI7Ci0gIGJmZF92bWEgYWRkcjsKLSAgdW5zaWduZWQgbG9uZyBuY2FsbHM7Ci0gIFN5bSAqc3ltOwotCi0gIGlmIChmcmVhZCAoJm5ibG9ja3MsIHNpemVvZiAobmJsb2NrcyksIDEsIGlmcCkgIT0gMSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIiksIHdob2FtaSwgZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIG5ibG9ja3MgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICYgbmJsb2Nrcyk7Ci0gIGlmIChnbW9uX2ZpbGVfdmVyc2lvbiA9PSAwKQotICAgIHsKLSAgICAgIGZza2lwX3N0cmluZyAoaWZwKTsKLSAgICB9Ci0KLSAgZm9yIChiID0gMDsgYiA8IG5ibG9ja3M7ICsrYikKLSAgICB7Ci0gICAgICBpZiAoZ21vbl9maWxlX3ZlcnNpb24gPT0gMCkKLQl7Ci0JICBpbnQgbGluZV9udW07Ci0JICAvKgotCSAgICogVmVyc2lvbiAwIGhhZCBsb3RzIG9mIGV4dHJhIHN0dWZmIHRoYXQgd2UgZG9uJ3QKLQkgICAqIGNhcmUgYWJvdXQgYW55bW9yZS4KLQkgICAqLwotCSAgaWYgKChmcmVhZCAoJm5jYWxscywgc2l6ZW9mIChuY2FsbHMpLCAxLCBpZnApICE9IDEpCi0JICAgICAgfHwgKGZyZWFkICgmYWRkciwgc2l6ZW9mIChhZGRyKSwgMSwgaWZwKSAhPSAxKQotCSAgICAgIHx8IChmc2tpcF9zdHJpbmcgKGlmcCksIEZBTFNFKQotCSAgICAgIHx8IChmc2tpcF9zdHJpbmcgKGlmcCksIEZBTFNFKQotCSAgICAgIHx8IChmcmVhZCAoJmxpbmVfbnVtLCBzaXplb2YgKGxpbmVfbnVtKSwgMSwgaWZwKSAhPSAxKSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChmcmVhZCAoJmFkZHIsIHNpemVvZiAoYWRkciksIDEsIGlmcCkgIT0gMQotCSAgICAgIHx8IGZyZWFkICgmbmNhbGxzLCBzaXplb2YgKG5jYWxscyksIDEsIGlmcCkgIT0gMSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKgotICAgICAgICogQmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBhcmUgbWVhbmluZ2Z1bCBvbmx5IGlmIHdlJ3JlCi0gICAgICAgKiBwcm9maWxpbmcgYXQgdGhlIGxpbmUtYnktbGluZSBsZXZlbDoKLSAgICAgICAqLwotICAgICAgaWYgKGxpbmVfZ3JhbnVsYXJpdHkpCi0JewotCi0JICAvKiBjb252ZXJ0IGZyb20gdGFyZ2V0IHRvIGhvc3QgZW5kaWFubmVzczogKi8KLQotCSAgYWRkciA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJiBhZGRyKTsKLQkgIG5jYWxscyA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJm5jYWxscyk7Ci0KLQkgIHN5bSA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGFkZHIpOwotCi0JICBpZiAoc3ltKQotCSAgICB7Ci0JICAgICAgaW50IGk7Ci0KLQkgICAgICBEQkcgKEJCREVCVUcsCi0JCSAgIHByaW50ZiAoIltiYl9yZWFkX3JlY10gMHglbHgtPjB4JWx4ICglczolZCkgY250PSVsdVxuIiwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBhZGRyLCAodW5zaWduZWQgbG9uZykgc3ltLT5hZGRyLAotCQkJICAgc3ltLT5uYW1lLCBzeW0tPmxpbmVfbnVtLCBuY2FsbHMpKTsKLQotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBOQkJTOyBpKyspCi0JCXsKLQkJICBpZiAoISBzeW0tPmJiX2FkZHJbaV0gfHwgc3ltLT5iYl9hZGRyW2ldID09IGFkZHIpCi0JCSAgICB7Ci0JCSAgICAgIHN5bS0+YmJfYWRkcltpXSA9IGFkZHI7Ci0JCSAgICAgIHN5bS0+YmJfY2FsbHNbaV0gKz0gbmNhbGxzOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0YXRpYyBib29sIHVzZXJfd2FybmVkID0gRkFMU0U7Ci0KLQkgIGlmICghdXNlcl93YXJuZWQpCi0JICAgIHsKLQkgICAgICB1c2VyX3dhcm5lZCA9IFRSVUU7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IHdhcm5pbmc6IGlnbm9yaW5nIGJhc2ljLWJsb2NrIGV4ZWMgY291bnRzICh1c2UgLWwgb3IgLS1saW5lKVxuIiksCi0JCSAgICAgICB3aG9hbWkpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuOwotfQotCi0KLS8qCi0gKiBXcml0ZSBhbGwgYmFzaWMtYmxvY2tzIHdpdGggbm9uLXplcm8gY291bnRzIHRvIGZpbGUgT0ZQLiAgRklMRU5BTUUKLSAqIGlzIHRoZSBuYW1lIG9mIE9GUCBhbmQgaXMgcHJvdmlkZWQgZm9yIHByb2R1Y2luZyBlcnJvci1tZXNzYWdlcwotICogb25seS4KLSAqLwotdm9pZAotREVGVU4gKGJiX3dyaXRlX2Jsb2NrcywgKG9mcCwgZmlsZW5hbWUpLCBGSUxFICogb2ZwIEFORCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciB0YWcgPSBHTU9OX1RBR19CQl9DT1VOVDsKLSAgaW50IG5ibG9ja3MgPSAwOwotICBiZmRfdm1hIGFkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwotICBTeW0gKnN5bTsKLSAgaW50IGk7Ci0KLSAgLyogY291bnQgaG93IG1hbnkgbm9uLXplcm8gYmxvY2tzIHdpdGggaGF2ZTogKi8KLQotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOQkJTICYmIHN5bS0+YmJfYWRkcltpXTsgaSsrKQotCTsKLSAgICAgIG5ibG9ja3MgKz0gaTsKLSAgICB9Ci0KLSAgLyogd3JpdGUgaGVhZGVyOiAqLwotICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgbmJsb2NrcywgKGJmZF9ieXRlICopICYgbmJsb2Nrcyk7Ci0gIGlmIChmd3JpdGUgKCZ0YWcsIHNpemVvZiAodGFnKSwgMSwgb2ZwKSAhPSAxCi0gICAgICB8fCBmd3JpdGUgKCZuYmxvY2tzLCBzaXplb2YgKG5ibG9ja3MpLCAxLCBvZnApICE9IDEpCi0gICAgewotICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogd3JpdGUgY291bnRzOiAqLwotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOQkJTICYmIHN5bS0+YmJfYWRkcltpXTsgaSsrKQotCXsKLQkgIHB1dF92bWEgKGNvcmVfYmZkLCBzeW0tPmJiX2FkZHJbaV0sIChiZmRfYnl0ZSAqKSAmIGFkZHIpOwotCSAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIHN5bS0+YmJfY2FsbHNbaV0sIChiZmRfYnl0ZSAqKSAmIG5jYWxscyk7Ci0KLQkgIGlmIChmd3JpdGUgKCZhZGRyLCBzaXplb2YgKGFkZHIpLCAxLCBvZnApICE9IDEKLQkgICAgICB8fCBmd3JpdGUgKCZuY2FsbHMsIHNpemVvZiAobmNhbGxzKSwgMSwgb2ZwKSAhPSAxKQotCSAgICB7Ci0JICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBPdXRwdXQgYmFzaWMtYmxvY2sgc3RhdGlzdGljcyBpbiBhIGZvcm1hdCB0aGF0IGlzIGVhc2lseSBwYXJzZWFibGUuCi0gKiBDdXJyZW50IHRoZSBmb3JtYXQgaXM6Ci0gKgotICogICAgICA8ZmlsZW5hbWU+OjxsaW5lLW51bWJlcj46ICg8ZnVuY3Rpb24tbmFtZT46PGJiLWFkZHIpOiA8bmNhbGxzPgotICovCi12b2lkCi1ERUZVTl9WT0lEIChwcmludF9leGVjX2NvdW50cykKLXsKLSAgU3ltICoqc29ydGVkX2JicywgKnN5bTsKLSAgaW50IGksIGosIGxlbjsKLQotICBpZiAoZmlyc3Rfb3V0cHV0KQotICAgIHsKLSAgICAgIGZpcnN0X291dHB1dCA9IEZBTFNFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIlxmXG4iKTsKLSAgICB9Ci0KLSAgLyogc29ydCBiYXNpYy1ibG9ja3MgYWNjb3JkaW5nIHRvIGZ1bmN0aW9uIG5hbWUgYW5kIGxpbmUgbnVtYmVyOiAqLwotCi0gIHNvcnRlZF9iYnMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChzb3J0ZWRfYmJzWzBdKSk7Ci0gIGxlbiA9IDA7Ci0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEFjY2VwdCBzeW1ib2wgaWYgaXQncyBpbiB0aGUgSU5DTF9FWEVDIHRhYmxlCi0gICAgICAgKiBvciB0aGVyZSBpcyBubyBJTkNMX0VYRUMgdGFibGUKLSAgICAgICAqICAgIGFuZCBpdCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIEVYQ0xfRVhFQyB0YWJsZS4KLSAgICAgICAqLwotICAgICAgaWYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfRVhFQ10sIHN5bS0+YWRkcikKLQkgIHx8IChzeW1zW0lOQ0xfRVhFQ10ubGVuID09IDAKLQkgICAgICAmJiAhc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9FWEVDXSwgc3ltLT5hZGRyKSkpCi0JewotCSAgc29ydGVkX2Jic1tsZW4rK10gPSBzeW07Ci0JfQotICAgIH0KLSAgcXNvcnQgKHNvcnRlZF9iYnMsIGxlbiwgc2l6ZW9mIChzb3J0ZWRfYmJzWzBdKSwgY21wX2JiKTsKLQotICAvKiBvdXRwdXQgYmFzaWMtYmxvY2tzOiAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKLSAgICB7Ci0gICAgICBpZiAoc3ltLT5uY2FsbHMgPiAwIHx8ICEgaWdub3JlX3plcm9zKQotCXsKLQkgIC8qIEZJWE1FOiBUaGlzIG9ubHkgd29ya3MgaWYgYmZkX3ZtYSBpcyB1bnNpZ25lZCBsb25nLiAgKi8KLQkgIHByaW50ZiAoXygiJXM6JWQ6ICglczoweCVseCkgJWx1IGV4ZWN1dGlvbnNcbiIpLAotCQkgIHN5bS0+ZmlsZSA/IHN5bS0+ZmlsZS0+bmFtZSA6IF8oIjx1bmtub3duPiIpLCBzeW0tPmxpbmVfbnVtLAotCQkgIHN5bS0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIHN5bS0+YWRkciwgc3ltLT5uY2FsbHMpOwotCX0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBOQkJTICYmIHN5bS0+YmJfYWRkcltqXTsgaiArKykKLQl7Ci0JICBpZiAoc3ltLT5iYl9jYWxsc1tqXSA+IDAgfHwgISBpZ25vcmVfemVyb3MpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogVGhpcyBvbmx5IHdvcmtzIGlmIGJmZF92bWEgaXMgdW5zaWduZWQgbG9uZy4gICovCi0JICAgICAgcHJpbnRmIChfKCIlczolZDogKCVzOjB4JWx4KSAlbHUgZXhlY3V0aW9uc1xuIiksCi0JCSAgICAgIHN5bS0+ZmlsZSA/IHN5bS0+ZmlsZS0+bmFtZSA6IF8oIjx1bmtub3duPiIpLCBzeW0tPmxpbmVfbnVtLAotCQkgICAgICBzeW0tPm5hbWUsICh1bnNpZ25lZCBsb25nKSBzeW0tPmJiX2FkZHJbal0sCi0JCSAgICAgIHN5bS0+YmJfY2FsbHNbal0pOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZnJlZSAoc29ydGVkX2Jicyk7Ci19Ci0KLS8qCi0gKiBIZWxwZXIgZm9yIGJiX2Fubm90YXRlZF9zb3VyY2U6IGZvcm1hdCBhbm5vdGF0aW9uIGNvbnRhaW5pbmcKLSAqIG51bWJlciBvZiBsaW5lIGV4ZWN1dGlvbnMuICBEZXBlbmRzIG9uIGJlaW5nIGNhbGxlZCBvbiBlYWNoCi0gKiBsaW5lIG9mIGEgZmlsZSBpbiBzZXF1ZW50aWFsIG9yZGVyLgotICoKLSAqIEdsb2JhbCB2YXJpYWJsZSBiYl9hbm5vdGF0ZV9hbGxfbGluZXMgZW5hYmxlcyBleGVjdXRpb24gY291bnQKLSAqIGNvbXByZXNzaW9uIChjb3VudHMgYXJlIHN1cHJlc3NlZCBpZiBpZGVudGljYWwgdG8gdGhlIGxhc3Qgb25lKQotICogYW5kIHByaW50cyBjb3VudHMgb24gYWxsIGV4ZWN1dGVkIGxpbmVzLiAgT3RoZXJ3aXNlLCBwcmludAotICogYWxsIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMgZXhhY3RseSBvbmNlIG9uIHRoZSBsaW5lCi0gKiB0aGF0IHN0YXJ0cyB0aGUgYmFzaWMtYmxvY2suCi0gKi8KLQotc3RhdGljIHZvaWQKLURFRlVOIChhbm5vdGF0ZV93aXRoX2NvdW50LCAoYnVmLCB3aWR0aCwgbGluZV9udW0sIGFyZyksCi0gICAgICAgY2hhciAqYnVmIEFORCBpbnQgd2lkdGggQU5EIGludCBsaW5lX251bSBBTkQgdm9pZCAqYXJnKQotewotICBTb3VyY2VfRmlsZSAqc2YgPSBhcmc7Ci0gIFN5bSAqYjsKLSAgaW50IGk7Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfY291bnQ7Ci0gIHVuc2lnbmVkIGxvbmcgbGFzdF9wcmludCA9ICh1bnNpZ25lZCBsb25nKSAtMTsKLQotICBiID0gTlVMTDsKLSAgaWYgKGxpbmVfbnVtIDw9IHNmLT5udW1fbGluZXMpCi0gICAgewotICAgICAgYiA9IHNmLT5saW5lW2xpbmVfbnVtIC0gMV07Ci0gICAgfQotICBpZiAoIWIpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspCi0JYnVmW2ldID0gJyAnOwotICAgICAgYnVmW3dpZHRoXSA9ICdcMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciB0bXBidWZbTkJCUyAqIDMwXTsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICB1bnNpZ25lZCBsb25nIG5jYWxsczsKLSAgICAgIGludCBuY2FsbHNfc2V0OwotICAgICAgaW50IGxlbjsKLQotICAgICAgKytudW1fZXhlY3V0YWJsZV9saW5lczsKLQotICAgICAgcCA9IHRtcGJ1ZjsKLSAgICAgICpwID0gJ1wwJzsKLQotICAgICAgbmNhbGxzID0gMDsKLSAgICAgIG5jYWxsc19zZXQgPSAwOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQsIGxhYmVsIHRoZSBsaW5lIG5vIG1hdHRlciB3aGF0LgotICAgICAgICogT3RoZXJ3aXNlLCB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgZnVuY3Rpb24sIHNvIGNoZWNrIHRvIHNlZQotICAgICAgICogaWYgdGhlIGZpcnN0IGJhc2ljLWJsb2NrIGFkZHJlc3MgaXMgbGFyZ2VyIHRoYW4gdGhlIHN0YXJ0aW5nCi0gICAgICAgKiBhZGRyZXNzIG9mIHRoZSBsaW5lLiAgSWYgc28sIHRoZW4gdGhpcyBsaW5lIGJlZ2lucyB3aXRoIGEKLSAgICAgICAqIGEgcG9ydGlvbiBvZiB0aGUgcHJldmlvdXMgYmFzaWMtYmxvY2ssIHNvIHByaW50IHRoYXQgcHJpb3IKLSAgICAgICAqIGV4ZWN1dGlvbiBjb3VudCAoaWYgYmJfYW5ub3RhdGVfYWxsX2xpbmVzIGlzIHNldCkuCi0gICAgICAgKi8KLQotICAgICAgaWYgKGItPmlzX2Z1bmMpCi0JewotCSAgc3ByaW50ZiAocCwgIiVsdSIsIGItPm5jYWxscyk7Ci0JICBwICs9IHN0cmxlbiAocCk7Ci0JICBsYXN0X2NvdW50ID0gYi0+bmNhbGxzOwotCSAgbGFzdF9wcmludCA9IGxhc3RfY291bnQ7Ci0JICBuY2FsbHMgPSBiLT5uY2FsbHM7Ci0JICBuY2FsbHNfc2V0ID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmIChiYl9hbm5vdGF0ZV9hbGxfbGluZXMKLQkgICAgICAgJiYgYi0+YmJfYWRkclswXSAmJiBiLT5iYl9hZGRyWzBdID4gYi0+YWRkcikKLQl7Ci0JICBzcHJpbnRmIChwLCAiJWx1IiwgbGFzdF9jb3VudCk7Ci0JICBwICs9IHN0cmxlbiAocCk7Ci0JICBsYXN0X3ByaW50ID0gbGFzdF9jb3VudDsKLQkgIG5jYWxscyA9IGxhc3RfY291bnQ7Ci0JICBuY2FsbHNfc2V0ID0gMTsKLQl9Ci0KLSAgICAgIC8qIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhpcyBsaW5lJ3MgYmFzaWMtYmxvY2tzLiAgRm9yIGVhY2ggb25lLAotICAgICAgICogdXBkYXRlIGxhc3RfY291bnQsIHRoZW4gY29tcHJlc3Mgc2VxdWVudGlhbCBpZGVudGljYWwgY291bnRzCi0gICAgICAgKiAoaWYgYmJfYW5ub3RhdGVfYWxsX2xpbmVzKSBhbmQgcHJpbnQgdGhlIGV4ZWN1dGlvbiBjb3VudC4KLSAgICAgICAqLwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgTkJCUyAmJiBiLT5iYl9hZGRyW2ldOyBpKyspCi0JewotCSAgbGFzdF9jb3VudCA9IGItPmJiX2NhbGxzW2ldOwotCSAgaWYgKCEgbmNhbGxzX3NldCkKLQkgICAgewotCSAgICAgIG5jYWxscyA9IDA7Ci0JICAgICAgbmNhbGxzX3NldCA9IDE7Ci0JICAgIH0KLQkgIG5jYWxscyArPSBsYXN0X2NvdW50OwotCi0JICBpZiAoYmJfYW5ub3RhdGVfYWxsX2xpbmVzICYmIGxhc3RfY291bnQgPT0gbGFzdF9wcmludCkKLQkgICAgewotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGlmIChwID4gdG1wYnVmKQotCSAgICAqcCsrID0gJywnOwotCSAgc3ByaW50ZiAocCwgIiVsdSIsIGxhc3RfY291bnQpOwotCSAgcCArPSBzdHJsZW4gKHApOwotCi0JICBsYXN0X3ByaW50ID0gbGFzdF9jb3VudDsKLQl9Ci0KLSAgICAgIC8qIFdlJ3JlIGRvbmUuICBJZiBub3RoaW5nIGhhcyBiZWVuIHByaW50ZWQgb24gdGhpcyBsaW5lLAotICAgICAgICogcHJpbnQgdGhlIGxhc3QgZXhlY3V0aW9uIGNvdW50IChiYl9hbm5vdGF0ZV9hbGxfbGluZXMpLAotICAgICAgICogd2hpY2ggY291bGQgYmUgZnJvbSBlaXRoZXIgYSBwcmV2aW91cyBsaW5lIChpZiB0aGVyZSB3ZXJlCi0gICAgICAgKiBubyBCQnMgb24gdGhpcyBsaW5lKSwgb3IgZnJvbSB0aGlzIGxpbmUgKGlmIGFsbCBvdXIgQkIKLSAgICAgICAqIGNvdW50cyB3ZXJlIGNvbXByZXNzZWQgb3V0IGJlY2F1c2UgdGhleSB3ZXJlIGlkZW50aWNhbCkuCi0gICAgICAgKi8KLQotICAgICAgaWYgKGJiX2Fubm90YXRlX2FsbF9saW5lcyAmJiBwID09IHRtcGJ1ZikKLQl7Ci0JICBzcHJpbnRmIChwLCAiJWx1IiwgbGFzdF9jb3VudCk7Ci0JICBwICs9IHN0cmxlbiAocCk7Ci0JICBuY2FsbHMgPSBsYXN0X2NvdW50OwotCSAgbmNhbGxzX3NldCA9IDE7Ci0JfQotCi0gICAgICBpZiAoISBuY2FsbHNfc2V0KQotCXsKLQkgIGludCBjOwotCi0JICBmb3IgKGMgPSAwOyBjIDwgd2lkdGg7IGMrKykKLQkgICAgYnVmW2NdID0gJyAnOwotCSAgYnVmW3dpZHRoXSA9ICdcMCc7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICArK251bV9saW5lc19leGVjdXRlZDsKLQotICAgICAgaWYgKG5jYWxscyA8IGJiX21pbl9jYWxscykKLQl7Ci0JICBzdHJjcHkgKHRtcGJ1ZiwgIiMjIyMjIik7Ci0JICBwID0gdG1wYnVmICsgNTsKLQl9Ci0KLSAgICAgIHN0cmNweSAocCwgIiAtPiAiKTsKLSAgICAgIHAgKz0gNDsKLQotICAgICAgbGVuID0gcCAtIHRtcGJ1ZjsKLSAgICAgIGlmIChsZW4gPj0gd2lkdGgpCi0JewotCSAgc3RybmNweSAoYnVmLCB0bXBidWYsIHdpZHRoKTsKLQkgIGJ1Zlt3aWR0aF0gPSAnXDAnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgYzsKLQotCSAgc3RyY3B5IChidWYgKyB3aWR0aCAtIGxlbiwgdG1wYnVmKTsKLQkgIGZvciAoYyA9IDA7IGMgPCB3aWR0aCAtIGxlbjsgKytjKQotCSAgICBidWZbY10gPSAnICc7Ci0JfQotICAgIH0KLX0KLQotLyoKLSAqIEFubm90YXRlIHRoZSBmaWxlcyBuYW1lZCBpbiBTT1VSQ0VfRklMRVMgd2l0aCBiYXNpYy1ibG9jayBzdGF0aXN0aWNzCi0gKiAoZXhlY3V0aW9uIGNvdW50cykuICBBZnRlciBlYWNoIHNvdXJjZSBmaWxlcywgYSBmZXcgc3RhdGlzdGljcwotICogcmVnYXJkaW5nIHRoYXQgc291cmNlIGZpbGUgYXJlIHByaW50ZWQuCi0gKi8KLXZvaWQKLURFRlVOX1ZPSUQgKHByaW50X2Fubm90YXRlZF9zb3VyY2UpCi17Ci0gIFN5bSAqc3ltLCAqbGluZV9zdGF0cywgKm5ld19saW5lOwotICBTb3VyY2VfRmlsZSAqc2Y7Ci0gIGludCBpLCB0YWJsZV9sZW47Ci0gIEZJTEUgKm9mcDsKLQotICAvKgotICAgKiBGaW5kIG1heGltdW0gbGluZSBudW1iZXIgZm9yIGVhY2ggc291cmNlIGZpbGUgdGhhdCB1c2VyIGlzCi0gICAqIGludGVyZXN0ZWQgaW46Ci0gICAqLwotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBBY2NlcHQgc3ltYm9sIGlmIGl0J3MgZmlsZSBpcyBrbm93biwgaXRzIGxpbmUgbnVtYmVyIGlzCi0gICAgICAgKiBiaWdnZXIgdGhhbiBhbnl0aGluZyB3ZSBoYXZlIHNlZW4gZm9yIHRoYXQgZmlsZSBzbyBmYXIgYW5kCi0gICAgICAgKiBpZiBpdCdzIGluIHRoZSBJTkNMX0FOTk8gdGFibGUgb3IgdGhlcmUgaXMgbm8gSU5DTF9BTk5PCi0gICAgICAgKiB0YWJsZSBhbmQgaXQgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBFWENMX0FOTk8gdGFibGUuCi0gICAgICAgKi8KLSAgICAgIGlmIChzeW0tPmZpbGUgJiYgc3ltLT5saW5lX251bSA+IHN5bS0+ZmlsZS0+bnVtX2xpbmVzCi0JICAmJiAoc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9BTk5PXSwgc3ltLT5hZGRyKQotCSAgICAgIHx8IChzeW1zW0lOQ0xfQU5OT10ubGVuID09IDAKLQkJICAmJiAhc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9BTk5PXSwgc3ltLT5hZGRyKSkpKQotCXsKLQkgIHN5bS0+ZmlsZS0+bnVtX2xpbmVzID0gc3ltLT5saW5lX251bTsKLQl9Ci0gICAgfQotCi0gIC8qIGFsbG9jYXRlIGxpbmUgZGVzY3JpcHRvcnM6ICovCi0KLSAgZm9yIChzZiA9IGZpcnN0X3NyY19maWxlOyBzZjsgc2YgPSBzZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc2YtPm51bV9saW5lcyA+IDApCi0JewotCSAgc2YtPmxpbmUgPSAodm9pZCAqKSB4bWFsbG9jIChzZi0+bnVtX2xpbmVzICogc2l6ZW9mIChzZi0+bGluZVswXSkpOwotCSAgbWVtc2V0IChzZi0+bGluZSwgMCwgc2YtPm51bV9saW5lcyAqIHNpemVvZiAoc2YtPmxpbmVbMF0pKTsKLQl9Ci0gICAgfQotCi0gIC8qIGNvdW50IGV4ZWN1dGlvbnMgcGVyIGxpbmU6ICovCi0KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBpZiAoc3ltLT5maWxlICYmIHN5bS0+ZmlsZS0+bnVtX2xpbmVzCi0JICAmJiAoc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9BTk5PXSwgc3ltLT5hZGRyKQotCSAgICAgIHx8IChzeW1zW0lOQ0xfQU5OT10ubGVuID09IDAKLQkJICAmJiAhc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9BTk5PXSwgc3ltLT5hZGRyKSkpKQotCXsKLQkgIHN5bS0+ZmlsZS0+bmNhbGxzICs9IHN5bS0+bmNhbGxzOwotCSAgbGluZV9zdGF0cyA9IHN5bS0+ZmlsZS0+bGluZVtzeW0tPmxpbmVfbnVtIC0gMV07Ci0JICBpZiAoIWxpbmVfc3RhdHMpCi0JICAgIHsKLQkgICAgICAvKiBjb21tb24gY2FzZSBoYXMgYXQgbW9zdCBvbmUgYmFzaWMtYmxvY2sgcGVyIHNvdXJjZSBsaW5lOiAqLwotCSAgICAgIHN5bS0+ZmlsZS0+bGluZVtzeW0tPmxpbmVfbnVtIC0gMV0gPSBzeW07Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCFsaW5lX3N0YXRzLT5hZGRyKQotCSAgICB7Ci0JICAgICAgLyogc3ltIGlzIHRoZSAzcmQgLi4gbnRoIGJhc2ljIGJsb2NrIGZvciB0aGlzIGxpbmU6ICovCi0JICAgICAgbGluZV9zdGF0cy0+bmNhbGxzICs9IHN5bS0+bmNhbGxzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBzeW0gaXMgdGhlIHNlY29uZCBiYXNpYyBibG9jayBmb3IgdGhpcyBsaW5lICovCi0JICAgICAgbmV3X2xpbmUgPSAoU3ltICopIHhtYWxsb2MgKHNpemVvZiAoKm5ld19saW5lKSk7Ci0JICAgICAgKm5ld19saW5lID0gKmxpbmVfc3RhdHM7Ci0JICAgICAgbmV3X2xpbmUtPmFkZHIgPSAwOwotCSAgICAgIG5ld19saW5lLT5uY2FsbHMgKz0gc3ltLT5uY2FsbHM7Ci0JICAgICAgc3ltLT5maWxlLT5saW5lW3N5bS0+bGluZV9udW0gLSAxXSA9IG5ld19saW5lOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBwbG9kIG92ZXIgc291cmNlIGZpbGVzLCBhbm5vdGF0aW5nIHRoZW06ICovCi0KLSAgZm9yIChzZiA9IGZpcnN0X3NyY19maWxlOyBzZjsgc2YgPSBzZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoIXNmLT5udW1fbGluZXMgfHwgKGlnbm9yZV96ZXJvcyAmJiBzZi0+bmNhbGxzID09IDApKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgbnVtX2V4ZWN1dGFibGVfbGluZXMgPSBudW1fbGluZXNfZXhlY3V0ZWQgPSAwOwotICAgICAgb2ZwID0gYW5ub3RhdGVfc291cmNlIChzZiwgMTYsIGFubm90YXRlX3dpdGhfY291bnQsIHNmKTsKLSAgICAgIGlmICghb2ZwKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGJiX3RhYmxlX2xlbmd0aCA+IDApCi0JewotCSAgZnByaW50ZiAob2ZwLCBfKCJcblxuVG9wICVkIExpbmVzOlxuXG4gICAgIExpbmUgICAgICBDb3VudFxuXG4iKSwKLQkJICAgYmJfdGFibGVfbGVuZ3RoKTsKLQotCSAgLyogYWJ1c2UgbGluZSBhcnJheXMtLS1pdCdzIG5vdCBuZWVkZWQgYW55bW9yZTogKi8KLQkgIHFzb3J0IChzZi0+bGluZSwgc2YtPm51bV9saW5lcywgc2l6ZW9mIChzZi0+bGluZVswXSksIGNtcF9uY2FsbHMpOwotCSAgdGFibGVfbGVuID0gYmJfdGFibGVfbGVuZ3RoOwotCSAgaWYgKHRhYmxlX2xlbiA+IHNmLT5udW1fbGluZXMpCi0JICAgIHsKLQkgICAgICB0YWJsZV9sZW4gPSBzZi0+bnVtX2xpbmVzOwotCSAgICB9Ci0JICBmb3IgKGkgPSAwOyBpIDwgdGFibGVfbGVuOyArK2kpCi0JICAgIHsKLQkgICAgICBzeW0gPSBzZi0+bGluZVtpXTsKLQkgICAgICBpZiAoIXN5bSB8fCBzeW0tPm5jYWxscyA9PSAwKQotCQl7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBmcHJpbnRmIChvZnAsICIlOWQgJTEwbHVcbiIsIHN5bS0+bGluZV9udW0sIHN5bS0+bmNhbGxzKTsKLQkgICAgfQotCX0KLQotICAgICAgZnJlZSAoc2YtPmxpbmUpOwotICAgICAgc2YtPmxpbmUgPSAwOwotCi0gICAgICBmcHJpbnRmIChvZnAsIF8oIlxuRXhlY3V0aW9uIFN1bW1hcnk6XG5cbiIpKTsKLSAgICAgIGZwcmludGYgKG9mcCwgXygiJTlsZCAgIEV4ZWN1dGFibGUgbGluZXMgaW4gdGhpcyBmaWxlXG4iKSwKLQkgICAgICAgbnVtX2V4ZWN1dGFibGVfbGluZXMpOwotICAgICAgZnByaW50ZiAob2ZwLCBfKCIlOWxkICAgTGluZXMgZXhlY3V0ZWRcbiIpLCBudW1fbGluZXNfZXhlY3V0ZWQpOwotICAgICAgZnByaW50ZiAob2ZwLCBfKCIlOS4yZiAgIFBlcmNlbnQgb2YgdGhlIGZpbGUgZXhlY3V0ZWRcbiIpLAotCSAgICAgICBudW1fZXhlY3V0YWJsZV9saW5lcwotCSAgICAgICA/IDEwMC4wICogbnVtX2xpbmVzX2V4ZWN1dGVkIC8gKGRvdWJsZSkgbnVtX2V4ZWN1dGFibGVfbGluZXMKLQkgICAgICAgOiAxMDAuMCk7Ci0gICAgICBmcHJpbnRmIChvZnAsIF8oIlxuJTlsdSAgIFRvdGFsIG51bWJlciBvZiBsaW5lIGV4ZWN1dGlvbnNcbiIpLAotCSAgICAgICBzZi0+bmNhbGxzKTsKLSAgICAgIGZwcmludGYgKG9mcCwgXygiJTkuMmYgICBBdmVyYWdlIGV4ZWN1dGlvbnMgcGVyIGxpbmVcbiIpLAotCSAgICAgICBudW1fZXhlY3V0YWJsZV9saW5lcwotCSAgICAgICA/IChkb3VibGUpIHNmLT5uY2FsbHMgLyAoZG91YmxlKSBudW1fZXhlY3V0YWJsZV9saW5lcwotCSAgICAgICA6IDAuMCk7Ci0gICAgICBpZiAob2ZwICE9IHN0ZG91dCkKLQl7Ci0JICBmY2xvc2UgKG9mcCk7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2Jhc2ljX2Jsb2Nrcy5oIGIvZ3Byb2YvYmFzaWNfYmxvY2tzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2VjYTEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYmFzaWNfYmxvY2tzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jaWZuZGVmIGJhc2ljX2Jsb2Nrc19oCi0jZGVmaW5lIGJhc2ljX2Jsb2Nrc19oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAic291cmNlLmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLS8qCi0gKiBPcHRpb25zOgotICovCi1leHRlcm4gYm9vbCBiYl9hbm5vdGF0ZV9hbGxfbGluZXM7CS8qIGZvcmNlIGFubm90YXRpb24gb2YgYWxsIGxpbmVzPyAqLwotZXh0ZXJuIGludCBiYl90YWJsZV9sZW5ndGg7CQkvKiBsZW5ndGggb2YgbW9zdC11c2VkIGJiIHRhYmxlICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBiYl9taW5fY2FsbHM7CS8qIG1pbmltdW0gZXhlY3V0aW9uIGNvdW50ICovCi0KLWV4dGVybiB2b2lkIGJiX3JlYWRfcmVjIFBBUkFNUyAoKEZJTEUgKiBpZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci1leHRlcm4gdm9pZCBiYl93cml0ZV9ibG9ja3MgUEFSQU1TICgoRklMRSAqIG9mcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiB2b2lkIGJiX2NyZWF0ZV9zeW1zIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgcHJpbnRfYW5ub3RhdGVkX3NvdXJjZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBwcmludF9leGVjX2NvdW50cyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZiAvKiBiYXNpY19ibG9ja3NfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvYmJfZXhpdF9mdW5jLmMgYi9ncHJvZi9iYl9leGl0X2Z1bmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEzMzIxNS4uMDAwMDAwMAotLS0gYS9ncHJvZi9iYl9leGl0X2Z1bmMuYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQgRGF2aWQgTW9zYmVyZ2VyLVRhbmcuCi0gKgotICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBfX2JiX2V4aXRfZnVuYygpIGR1bXBzIGFsbCB0aGUgYmFzaWMtYmxvY2sgc3RhdGlzdGljcyBsaW5rZWQgaW50bwotICogdGhlIGJiX2hlYWQgY2hhaW4gdG8gLmQgZmlsZXMuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJnbW9uX291dC5oIgotCi0vKiBzdHJ1Y3R1cmUgZW1pdHRlZCBieSAtYSAqLwotc3RydWN0IGJiIHsKLSAgICBsb25nCQl6ZXJvX3dvcmQ7Ci0gICAgY29uc3QgY2hhcgkJKmZpbGVuYW1lOwotICAgIGxvbmcJCSpjb3VudHM7Ci0gICAgbG9uZwkJbmNvdW50czsKLSAgICBzdHJ1Y3QgYmIJCSpuZXh0OwotICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcJKmFkZHJlc3NlczsKLX07Ci0KLXN0cnVjdCBiYiAqX19iYl9oZWFkID0gKHN0cnVjdCBiYiAqKTA7Ci0KLQotdm9pZAotX19iYl9leGl0X2Z1bmMgKHZvaWQpCi17Ci0gICAgY29uc3QgaW50IHZlcnNpb24gPSBHTU9OX1ZFUlNJT047Ci0gICAgc3RydWN0IGdtb25faGRyIGdoZHI7Ci0gICAgc3RydWN0IGJiICpwdHI7Ci0gICAgRklMRSAqZnA7Ci0gICAgLyoKLSAgICAgKiBHRU5fR01PTl9DTlRfRklMRSBzaG91bGQgYmUgZGVmaW5lZCBvbiBzeXN0ZW1zIHdpdGggbWNsZWFudXAoKQotICAgICAqIGZ1bmN0aW9ucyB0aGF0IGRvIG5vdCB3cml0ZSBiYXNpYy1ibG9jayB0byBnbW9uLm91dC4gIEluIHN1Y2gKLSAgICAgKiBjYXNlcyBwcm9maWxpbmcgd2l0aCAiLXBnIC1hIiB3b3VsZCByZXN1bHQgaW4gYSBnbW9uLm91dCBmaWxlCi0gICAgICogd2l0aG91dCBiYXNpYy1ibG9jayBpbmZvIChiZWNhdXNlIHRoZSBmaWxlIHdyaXR0ZW4gaGVyZSB3b3VsZAotICAgICAqIGJlIG92ZXJ3cml0dGVuLiAgVGh1cywgYSBzZXBhcmF0ZSBmaWxlIGlzIGdlbmVyYXRlZCBpbnN0ZWFkLgotICAgICAqIFRoZSB0d28gZmlsZXMgY2FuIGVhc2lseSBiZSBjb21iaW5lZCBieSBzcGVjaWZ5aW5nIHRoZW0KLSAgICAgKiBvbiBncHJvZidzIGNvbW1hbmQgbGluZSAoYW5kIHBvc3NpYmx5IGdlbmVyYXRpbmcgYSBnbW9uLnN1bQotICAgICAqIGZpbGUgd2l0aCAiZ3Byb2YgLXMiKS4KLSAgICAgKi8KLSNpZm5kZWYgR0VOX0dNT05fQ05UX0ZJTEUKLSMgICBkZWZpbmUgT1VUX05BTUUJImdtb24ub3V0IgotI2Vsc2UKLSMgICBkZWZpbmUgT1VUX05BTUUJImdtb24uY250IgotI2VuZGlmCi0gICAgZnAgPSBmb3BlbihPVVRfTkFNRSwgIndiIik7Ci0gICAgaWYgKCFmcCkgewotCXBlcnJvcihPVVRfTkFNRSk7Ci0JcmV0dXJuOwotICAgIH0gLyogaWYgKi8KLSAgICBtZW1jcHkoJmdoZHIuY29va2llWzBdLCBHTU9OX01BR0lDLCA0KTsKLSAgICBtZW1jcHkoJmdoZHIudmVyc2lvbiwgJnZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSk7Ci0gICAgZndyaXRlKCZnaGRyLCBzaXplb2YoZ2hkciksIDEsIGZwKTsKLQotICAgIGZvciAocHRyID0gX19iYl9oZWFkOyBwdHIgIT0gMDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JdV9pbnQgbmNvdW50cyA9IHB0ci0+bmNvdW50czsKLQl1X2NoYXIgdGFnOwotCXVfaW50IGk7Ci0KLQl0YWcgPSBHTU9OX1RBR19CQl9DT1VOVDsKLQlmd3JpdGUoJnRhZywgc2l6ZW9mKHRhZyksIDEsIGZwKTsKLQlmd3JpdGUoJm5jb3VudHMsIHNpemVvZihuY291bnRzKSwgMSwgZnApOwotCi0JZm9yIChpID0gMDsgaSA8IG5jb3VudHM7ICsraSkgewotCSAgICBmd3JpdGUoJnB0ci0+YWRkcmVzc2VzW2ldLCBzaXplb2YocHRyLT5hZGRyZXNzZXNbMF0pLCAxLCBmcCk7Ci0JICAgIGZ3cml0ZSgmcHRyLT5jb3VudHNbaV0sIHNpemVvZihwdHItPmNvdW50c1swXSksIDEsIGZwKTsKLQl9IC8qIGZvciAqLwotICAgIH0gLyogZm9yICovCi0gICAgZmNsb3NlIChmcCk7Ci19IC8qIF9fYmJfZXhpdF9mdW5jICovCi0KLQkJCS8qKiogZW5kIG9mIF9fYmJfZXhpdF9mdW5jLmMgKioqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvYmJjb252LnBsIGIvZ3Byb2YvYmJjb252LnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MzEyZjUxLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2JiY29udi5wbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMhIC91c3IvYmluL3BlcmwKLQotIyBUaGlzIHNjcmlwdCBjb252ZXJ0cyBhICJiYi5vdXQiIGZpbGUgaW50byBhIGZvcm1hdAotIyBzdWl0YWJsZSBmb3IgcHJvY2Vzc2luZyBieSBncHJvZgotCi0jIFdyaXRlIGEgbmV3LXN0eWxlIGdtb24gaGVhZGVyCi0KLXByaW50IHBhY2soIkE0SXgxMiIsICJnbW9uIiwgMSk7Ci0KLQotIyBUaGUgaW5wdXQgZmlsZSBmb3JtYXQgY29udGFpbnMgaGVhZGVyIGxpbmVzIGFuZCBkYXRhIGxpbmVzLgotIyBIZWFkZXIgbGluZXMgY29udGFpbiBhIGNvdW50IG9mIGhvdyBtYW55IGRhdGEgbGluZXMgZm9sbG93IGJlZm9yZQotIyB0aGUgbmV4dCBoZWFkZXIgbGluZS4gICRibG9ja2NvdW50IGlzIHNldCB0byB0aGUgY291bnQgdGhhdAotIyBhcHBlYXJzIGluIGVhY2ggaGVhZGVyIGxpbmUsIHRoZW4gZGVjcmVtZW50ZWQgYXQgZWFjaCBkYXRhIGxpbmUuCi0jICRibG9ja2NvdW50IHNob3VsZCBhbHdheXMgYmUgemVybyBhdCB0aGUgc3RhcnQgb2YgYSBoZWFkZXIgbGluZSwKLSMgYW5kIHNob3VsZCBuZXZlciBiZSB6ZXJvIGF0IHRoZSBzdGFydCBvZiBhIGRhdGEgbGluZS4KLQotJGJsb2NrY291bnQ9MDsKLQotd2hpbGUgKDw+KSB7Ci0gICAgaWYgKC9eRmlsZSAuKiwgKFswLTldKykgYmFzaWMgYmxvY2tzLykgewotCXByaW50IFNUREVSUiAiTWlzY291bnQ6IGxpbmUgJC5cbiIgaWYgKCRibG9ja2NvdW50ICE9IDApOwotCSRibG9ja2NvdW50ID0gJDE7Ci0KLQlwcmludCBwYWNrKCJjSSIsIDIsICRibG9ja2NvdW50KTsKLSAgICB9Ci0gICAgaWYgKC9CbG9jay4qZXhlY3V0ZWQoWyAwLTldKykgdGltZS4qIGFkZHJlc3M9IDB4KFswLTlhLWZBLUZdKikvKSB7Ci0JcHJpbnQgU1RERVJSICJNaXNjb3VudDogbGluZSAkLlxuIiBpZiAoJGJsb2NrY291bnQgPT0gMCk7Ci0JJGJsb2NrY291bnQtLSBpZiAoJGJsb2NrY291bnQgPiAwKTsKLQotCSRjb3VudCA9ICQxOwotCSRhZGRyID0gaGV4ICQyOwotCi0JcHJpbnQgcGFjaygiSUkiLCRhZGRyLCRjb3VudCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvYnNkX2NhbGxnX2JsLm0gYi9ncHJvZi9ic2RfY2FsbGdfYmwubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzYzk2Yy4uMDAwMDAwMAotLS0gYS9ncHJvZi9ic2RfY2FsbGdfYmwubQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0KLQotCi1jYWxsIGdyYXBoIHByb2ZpbGU6Ci0gICAgICAgICAgVGhlIHN1bSBvZiBzZWxmIGFuZCBkZXNjZW5kZW50cyBpcyB0aGUgbWFqb3Igc29ydAotICAgICAgICAgIGZvciB0aGlzIGxpc3RpbmcuCi0KLSAgICAgICAgICBmdW5jdGlvbiBlbnRyaWVzOgotCi1pbmRleCAgICAgdGhlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgY2FsbCBncmFwaAotICAgICAgICAgIGxpc3RpbmcsIGFzIGFuIGFpZCB0byBsb2NhdGluZyBpdCAoc2VlIGJlbG93KS4KLQotJXRpbWUgICAgIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCB0aW1lIG9mIHRoZSBwcm9ncmFtCi0gICAgICAgICAgYWNjb3VudGVkIGZvciBieSB0aGlzIGZ1bmN0aW9uIGFuZCBpdHMKLSAgICAgICAgICBkZXNjZW5kZW50cy4KLQotc2VsZiAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzcGVudCBpbiB0aGlzIGZ1bmN0aW9uCi0gICAgICAgICAgaXRzZWxmLgotCi1kZXNjZW5kZW50cwotICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzcGVudCBpbiB0aGUgZGVzY2VuZGVudHMgb2YKLSAgICAgICAgICB0aGlzIGZ1bmN0aW9uIG9uIGJlaGFsZiBvZiB0aGlzIGZ1bmN0aW9uLgotCi1jYWxsZWQgICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAob3RoZXIKLSAgICAgICAgICB0aGFuIHJlY3Vyc2l2ZSBjYWxscykuCi0KLXNlbGYgICAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gY2FsbHMgaXRzZWxmCi0gICAgICAgICAgcmVjdXJzaXZlbHkuCi0KLW5hbWUgICAgICB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24sIHdpdGggYW4gaW5kaWNhdGlvbiBvZgotICAgICAgICAgIGl0cyBtZW1iZXJzaGlwIGluIGEgY3ljbGUsIGlmIGFueS4KLQotaW5kZXggICAgIHRoZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGNhbGwgZ3JhcGgKLSAgICAgICAgICBsaXN0aW5nLCBhcyBhbiBhaWQgdG8gbG9jYXRpbmcgaXQuCi0KLQotCi0gICAgICAgICAgcGFyZW50IGxpc3RpbmdzOgotCi1zZWxmKiAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIHRoaXMgZnVuY3Rpb24ncyBzZWxmIHRpbWUKLSAgICAgICAgICB3aGljaCBpcyBkdWUgdG8gY2FsbHMgZnJvbSB0aGlzIHBhcmVudC4KLQotZGVzY2VuZGVudHMqCi0gICAgICAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIHRoaXMgZnVuY3Rpb24ncwotICAgICAgICAgIGRlc2NlbmRlbnQgdGltZSB3aGljaCBpcyBkdWUgdG8gY2FsbHMgZnJvbSB0aGlzCi0gICAgICAgICAgcGFyZW50LgotCi1jYWxsZWQqKiAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieQotICAgICAgICAgIHRoaXMgcGFyZW50LiAgVGhpcyBpcyB0aGUgbnVtZXJhdG9yIG9mIHRoZQotICAgICAgICAgIGZyYWN0aW9uIHdoaWNoIGRpdmlkZXMgdXAgdGhlIGZ1bmN0aW9uJ3MgdGltZSB0bwotICAgICAgICAgIGl0cyBwYXJlbnRzLgotCi10b3RhbCogICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgYnkKLSAgICAgICAgICBhbGwgb2YgaXRzIHBhcmVudHMuICBUaGlzIGlzIHRoZSBkZW5vbWluYXRvciBvZgotICAgICAgICAgIHRoZSBwcm9wYWdhdGlvbiBmcmFjdGlvbi4KLQotcGFyZW50cyAgIHRoZSBuYW1lIG9mIHRoaXMgcGFyZW50LCB3aXRoIGFuIGluZGljYXRpb24gb2YgdGhlCi0gICAgICAgICAgcGFyZW50J3MgbWVtYmVyc2hpcCBpbiBhIGN5Y2xlLCBpZiBhbnkuCi0KLWluZGV4ICAgICB0aGUgaW5kZXggb2YgdGhpcyBwYXJlbnQgaW4gdGhlIGNhbGwgZ3JhcGgKLSAgICAgICAgICBsaXN0aW5nLCBhcyBhbiBhaWQgaW4gbG9jYXRpbmcgaXQuCi0KLQotCi0gICAgICAgICAgY2hpbGRyZW4gbGlzdGluZ3M6Ci0KLXNlbGYqICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhpcyBjaGlsZCdzIHNlbGYgdGltZQotICAgICAgICAgIHdoaWNoIGlzIGR1ZSB0byBiZWluZyBjYWxsZWQgYnkgdGhpcyBmdW5jdGlvbi4KLQotZGVzY2VuZGVudCoKLSAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhpcyBjaGlsZCdzIGRlc2NlbmRlbnQncwotICAgICAgICAgIHRpbWUgd2hpY2ggaXMgZHVlIHRvIGJlaW5nIGNhbGxlZCBieSB0aGlzCi0gICAgICAgICAgZnVuY3Rpb24uCi0KLWNhbGxlZCoqICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgY2hpbGQgaXMgY2FsbGVkIGJ5IHRoaXMKLSAgICAgICAgICBmdW5jdGlvbi4gIFRoaXMgaXMgdGhlIG51bWVyYXRvciBvZiB0aGUKLSAgICAgICAgICBwcm9wYWdhdGlvbiBmcmFjdGlvbiBmb3IgdGhpcyBjaGlsZC4KLQotdG90YWwqICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBjaGlsZCBpcyBjYWxsZWQgYnkgYWxsCi0gICAgICAgICAgZnVuY3Rpb25zLiAgVGhpcyBpcyB0aGUgZGVub21pbmF0b3Igb2YgdGhlCi0gICAgICAgICAgcHJvcGFnYXRpb24gZnJhY3Rpb24uCi0KLWNoaWxkcmVuICB0aGUgbmFtZSBvZiB0aGlzIGNoaWxkLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiBpdHMKLSAgICAgICAgICBtZW1iZXJzaGlwIGluIGEgY3ljbGUsIGlmIGFueS4KLQotaW5kZXggICAgIHRoZSBpbmRleCBvZiB0aGlzIGNoaWxkIGluIHRoZSBjYWxsIGdyYXBoIGxpc3RpbmcsCi0gICAgICAgICAgYXMgYW4gYWlkIHRvIGxvY2F0aW5nIGl0LgotCi0KLQotICAgICAgICAgICogdGhlc2UgZmllbGRzIGFyZSBvbWl0dGVkIGZvciBwYXJlbnRzIChvcgotICAgICAgICAgIGNoaWxkcmVuKSBpbiB0aGUgc2FtZSBjeWNsZSBhcyB0aGUgZnVuY3Rpb24uICBJZgotICAgICAgICAgIHRoZSBmdW5jdGlvbiAob3IgY2hpbGQpIGlzIGEgbWVtYmVyIG9mIGEgY3ljbGUsCi0gICAgICAgICAgdGhlIHByb3BhZ2F0ZWQgdGltZXMgYW5kIHByb3BhZ2F0aW9uIGRlbm9taW5hdG9yCi0gICAgICAgICAgcmVwcmVzZW50IHRoZSBzZWxmIHRpbWUgYW5kIGRlc2NlbmRlbnQgdGltZSBvZiB0aGUKLSAgICAgICAgICBjeWNsZSBhcyBhIHdob2xlLgotCi0gICAgICAgICAgKiogc3RhdGljLW9ubHkgcGFyZW50cyBhbmQgY2hpbGRyZW4gYXJlIGluZGljYXRlZAotICAgICAgICAgIGJ5IGEgY2FsbCBjb3VudCBvZiAwLgotCi0KLQotICAgICAgICAgIGN5Y2xlIGxpc3RpbmdzOgotICAgICAgICAgIHRoZSBjeWNsZSBhcyBhIHdob2xlIGlzIGxpc3RlZCB3aXRoIHRoZSBzYW1lCi0gICAgICAgICAgZmllbGRzIGFzIGEgZnVuY3Rpb24gZW50cnkuICBCZWxvdyBpdCBhcmUgbGlzdGVkCi0gICAgICAgICAgdGhlIG1lbWJlcnMgb2YgdGhlIGN5Y2xlLCBhbmQgdGhlaXIgY29udHJpYnV0aW9ucwotICAgICAgICAgIHRvIHRoZSB0aW1lIGFuZCBjYWxsIGNvdW50cyBvZiB0aGUgY3ljbGUuCi0MCmRpZmYgLS1naXQgYS9ncHJvZi9jYWxsX2dyYXBoLmMgYi9ncHJvZi9jYWxsX2dyYXBoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZWUyNTEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2FsbF9ncmFwaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY2FsbF9ncmFwaC5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAiZ21vbl9pby5oIgotI2luY2x1ZGUgImdtb25fb3V0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0jaW5jbHVkZSAic3ltX2lkcy5oIgotCi1leHRlcm4gdm9pZAotREVGVU4gKGNnX3RhbGx5LCAoZnJvbV9wYywgc2VsZl9wYywgY291bnQpLAotICAgICAgIGJmZF92bWEgZnJvbV9wYyBBTkQgYmZkX3ZtYSBzZWxmX3BjIEFORCB1bnNpZ25lZCBsb25nIGNvdW50KQotewotICBTeW0gKnBhcmVudDsKLSAgU3ltICpjaGlsZDsKLQotICBwYXJlbnQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBmcm9tX3BjKTsKLSAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBzZWxmX3BjKTsKLQotICBpZiAoY2hpbGQgPT0gTlVMTCB8fCBwYXJlbnQgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogSWYgd2UncmUgZG9pbmcgbGluZS1ieS1saW5lIHByb2ZpbGluZywgYm90aCB0aGUgcGFyZW50IGFuZCB0aGUKLSAgICAgY2hpbGQgd2lsbCBwcm9iYWJseSBwb2ludCB0byBsaW5lIHN5bWJvbHMgaW5zdGVhZCBvZiBmdW5jdGlvbgotICAgICBzeW1ib2xzLiAgRm9yIHRoZSBwYXJlbnQgdGhpcyBpcyBmaW5lLCBzaW5jZSB0aGlzIGlkZW50aWZpZXMgdGhlCi0gICAgIGxpbmUgbnVtYmVyIGluIHRoZSBjYWxsaW5nIHJvdXRpbmcsIGJ1dCB0aGUgY2hpbGQgc2hvdWxkIGFsd2F5cwotICAgICBwb2ludCB0byBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50LCBzbyB3ZSBiYWNrIHVwIGluIHRoZSBzeW1ib2wKLSAgICAgdGFibGUgdW50aWwgd2UgZmluZCBpdC4KLSAgIAotICAgICBGb3Igbm9ybWFsIHByb2ZpbGluZywgaXNfZnVuYyB3aWxsIGJlIHNldCBvbiBhbGwgc3ltYm9scywgc28gdGhpcwotICAgICBjb2RlIHdpbGwgZG8gbm90aGluZy4gICovCi0KLSAgd2hpbGUgKGNoaWxkID49IHN5bXRhYi5iYXNlICYmICEgY2hpbGQtPmlzX2Z1bmMpCi0gICAgLS1jaGlsZDsKLQotICBpZiAoY2hpbGQgPCBzeW10YWIuYmFzZSkKLSAgICByZXR1cm47Ci0KLSAgLyoKLSAgICogS2VlcCBhcmMgaWYgaXQgaXMgb24gSU5DTF9BUkNTIHRhYmxlIG9yIGlmIHRoZSBJTkNMX0FSQ1MgdGFibGUKLSAgICogaXMgZW1wdHkgYW5kIGl0IGlzIG5vdCBpbiB0aGUgRVhDTF9BUkNTIHRhYmxlLgotICAgKi8KLSAgaWYgKHN5bV9pZF9hcmNfaXNfcHJlc2VudCAoJnN5bXNbSU5DTF9BUkNTXSwgcGFyZW50LCBjaGlsZCkKLSAgICAgIHx8IChzeW1zW0lOQ0xfQVJDU10ubGVuID09IDAKLQkgICYmICFzeW1faWRfYXJjX2lzX3ByZXNlbnQgKCZzeW1zW0VYQ0xfQVJDU10sIHBhcmVudCwgY2hpbGQpKSkKLSAgICB7Ci0gICAgICBjaGlsZC0+bmNhbGxzICs9IGNvdW50OwotICAgICAgREJHIChUQUxMWURFQlVHLAotCSAgIHByaW50ZiAoXygiW2NnX3RhbGx5XSBhcmMgZnJvbSAlcyB0byAlcyB0cmF2ZXJzZWQgJWx1IHRpbWVzXG4iKSwKLQkJICAgcGFyZW50LT5uYW1lLCBjaGlsZC0+bmFtZSwgY291bnQpKTsKLSAgICAgIGFyY19hZGQgKHBhcmVudCwgY2hpbGQsIGNvdW50KTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIFJlYWQgYSByZWNvcmQgZnJvbSBmaWxlIElGUCBkZXNjcmliaW5nIGFuIGFyYyBpbiB0aGUgZnVuY3Rpb24KLSAqIGNhbGwtZ3JhcGggYW5kIHRoZSBjb3VudCBvZiBob3cgbWFueSB0aW1lcyB0aGUgYXJjIGhhcyBiZWVuCi0gKiB0cmF2ZXJzZWQuICBGSUxFTkFNRSBpcyB0aGUgbmFtZSBvZiBmaWxlIElGUCBhbmQgaXMgcHJvdmlkZWQKLSAqIGZvciBmb3JtYXR0aW5nIGVycm9yLW1lc3NhZ2VzIG9ubHkuCi0gKi8KLXZvaWQKLURFRlVOIChjZ19yZWFkX3JlYywgKGlmcCwgZmlsZW5hbWUpLCBGSUxFICogaWZwIEFORCBDT05TVCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgYmZkX3ZtYSBmcm9tX3BjLCBzZWxmX3BjOwotICBzdHJ1Y3QgZ21vbl9jZ19hcmNfcmVjb3JkIGFyYzsKLSAgdW5zaWduZWQgbG9uZyBjb3VudDsKLQotICBpZiAoZnJlYWQgKCZhcmMsIHNpemVvZiAoYXJjKSwgMSwgaWZwKSAhPSAxKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlXG4iKSwKLQkgICAgICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0gIGZyb21fcGMgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGFyYy5mcm9tX3BjKTsKLSAgc2VsZl9wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgYXJjLnNlbGZfcGMpOwotICBjb3VudCA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgYXJjLmNvdW50KTsKLSAgREJHIChTQU1QTEVERUJVRywKLSAgICAgICBwcmludGYgKCJbY2dfcmVhZF9yZWNdIGZyb21wYyAweCVseCBzZWxmcGMgMHglbHggY291bnQgJWx1XG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgZnJvbV9wYywgKHVuc2lnbmVkIGxvbmcpIHNlbGZfcGMsIGNvdW50KSk7Ci0gIC8qIGFkZCB0aGlzIGFyYzogKi8KLSAgY2dfdGFsbHkgKGZyb21fcGMsIHNlbGZfcGMsIGNvdW50KTsKLX0KLQotCi0vKgotICogV3JpdGUgYWxsIHRoZSBhcmNzIGluIHRoZSBjYWxsLWdyYXBoIHRvIGZpbGUgT0ZQLiAgRklMRU5BTUUgaXMKLSAqIHRoZSBuYW1lIG9mIE9GUCBhbmQgaXMgcHJvdmlkZWQgZm9yIGZvcm1hdHRpbmcgZXJyb3ItbWVzc2FnZXMKLSAqIG9ubHkuCi0gKi8KLXZvaWQKLURFRlVOIChjZ193cml0ZV9hcmNzLCAob2ZwLCBmaWxlbmFtZSksIEZJTEUgKiBvZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBjb25zdCB1bnNpZ25lZCBjaGFyIHRhZyA9IEdNT05fVEFHX0NHX0FSQzsKLSAgc3RydWN0IGdtb25fY2dfYXJjX3JlY29yZCByYXdfYXJjOwotICBBcmMgKmFyYzsKLSAgU3ltICpzeW07Ci0KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyBzeW0rKykKLSAgICB7Ci0gICAgICBmb3IgKGFyYyA9IHN5bS0+Y2cuY2hpbGRyZW47IGFyYzsgYXJjID0gYXJjLT5uZXh0X2NoaWxkKQotCXsKLQkgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPnBhcmVudC0+YWRkciwgKGJmZF9ieXRlICopIHJhd19hcmMuZnJvbV9wYyk7Ci0JICBwdXRfdm1hIChjb3JlX2JmZCwgYXJjLT5jaGlsZC0+YWRkciwgKGJmZF9ieXRlICopIHJhd19hcmMuc2VsZl9wYyk7Ci0JICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgYXJjLT5jb3VudCwgKGJmZF9ieXRlICopIHJhd19hcmMuY291bnQpOwotCSAgaWYgKGZ3cml0ZSAoJnRhZywgc2l6ZW9mICh0YWcpLCAxLCBvZnApICE9IDEKLQkgICAgICB8fCBmd3JpdGUgKCZyYXdfYXJjLCBzaXplb2YgKHJhd19hcmMpLCAxLCBvZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCSAgREJHIChTQU1QTEVERUJVRywKLQkgICAgIHByaW50ZiAoIltjZ193cml0ZV9hcmNzXSBmcm9tcGMgMHglbHggc2VsZnBjIDB4JWx4IGNvdW50ICVsdVxuIiwKLQkJICAgICAodW5zaWduZWQgbG9uZykgYXJjLT5wYXJlbnQtPmFkZHIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIGFyYy0+Y2hpbGQtPmFkZHIsIGFyYy0+Y291bnQpKTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2FsbF9ncmFwaC5oIGIvZ3Byb2YvY2FsbF9ncmFwaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUxMzliLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2NhbGxfZ3JhcGguaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNpZm5kZWYgY2FsbF9ncmFwaF9oCi0jZGVmaW5lIGNhbGxfZ3JhcGhfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi1leHRlcm4gdm9pZCBjZ190YWxseSBQQVJBTVMgKChiZmRfdm1hIGZyb21fcGMsIGJmZF92bWEgc2VsZl9wYywKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpKTsKLWV4dGVybiB2b2lkIGNnX3JlYWRfcmVjIFBBUkFNUyAoKEZJTEUgKiBpZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci1leHRlcm4gdm9pZCBjZ193cml0ZV9hcmNzIFBBUkFNUyAoKEZJTEUgKiBvZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSNlbmRpZiAvKiBjYWxsX2dyYXBoX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2NnX2FyY3MuYyBiL2dwcm9mL2NnX2FyY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcwMjMxNy4uMDAwMDAwMAotLS0gYS9ncHJvZi9jZ19hcmNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNhbGxfZ3JhcGguaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY2dfZGZuLmgiCi0jaW5jbHVkZSAiY2dfcHJpbnQuaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotI2luY2x1ZGUgInN5bV9pZHMuaCIKLQotU3ltICpjeWNsZV9oZWFkZXI7Ci11bnNpZ25lZCBpbnQgbnVtX2N5Y2xlczsKLUFyYyAqKmFyY3M7Ci11bnNpZ25lZCBpbnQgbnVtYXJjczsKLQotLyoKLSAqIFJldHVybiBUUlVFIGlmZiBQQVJFTlQgaGFzIGFuIGFyYyB0byBjb3ZlcnMgdGhlIGFkZHJlc3MKLSAqIHJhbmdlIGNvdmVyZWQgYnkgQ0hJTEQuCi0gKi8KLUFyYyAqCi1ERUZVTiAoYXJjX2xvb2t1cCwgKHBhcmVudCwgY2hpbGQpLCBTeW0gKiBwYXJlbnQgQU5EIFN5bSAqIGNoaWxkKQotewotICBBcmMgKmFyYzsKLQotICBpZiAoIXBhcmVudCB8fCAhY2hpbGQpCi0gICAgewotICAgICAgcHJpbnRmICgiW2FyY19sb29rdXBdIHBhcmVudCA9PSAwIHx8IGNoaWxkID09IDBcbiIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBEQkcgKExPT0tVUERFQlVHLCBwcmludGYgKCJbYXJjX2xvb2t1cF0gcGFyZW50ICVzIGNoaWxkICVzXG4iLAotCQkJICAgIHBhcmVudC0+bmFtZSwgY2hpbGQtPm5hbWUpKTsKLSAgZm9yIChhcmMgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKLSAgICB7Ci0gICAgICBEQkcgKExPT0tVUERFQlVHLCBwcmludGYgKCJbYXJjX2xvb2t1cF1cdCBwYXJlbnQgJXMgY2hpbGQgJXNcbiIsCi0JCQkJYXJjLT5wYXJlbnQtPm5hbWUsIGFyYy0+Y2hpbGQtPm5hbWUpKTsKLSAgICAgIGlmIChjaGlsZC0+YWRkciA+PSBhcmMtPmNoaWxkLT5hZGRyCi0JICAmJiBjaGlsZC0+ZW5kX2FkZHIgPD0gYXJjLT5jaGlsZC0+ZW5kX2FkZHIpCi0JewotCSAgcmV0dXJuIGFyYzsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi0vKgotICogQWRkIChvciBqdXN0IGluY3JlbWVudCkgYW4gYXJjOgotICovCi12b2lkCi1ERUZVTiAoYXJjX2FkZCwgKHBhcmVudCwgY2hpbGQsIGNvdW50KSwKLSAgICAgICBTeW0gKiBwYXJlbnQgQU5EIFN5bSAqIGNoaWxkIEFORCB1bnNpZ25lZCBsb25nIGNvdW50KQotewotICBzdGF0aWMgdW5zaWduZWQgaW50IG1heGFyY3MgPSAwOwotICBBcmMgKmFyYywgKipuZXdhcmNzOwotCi0gIERCRyAoVEFMTFlERUJVRywgcHJpbnRmICgiW2FyY19hZGRdICVsdSBhcmNzIGZyb20gJXMgdG8gJXNcbiIsCi0JCQkgICBjb3VudCwgcGFyZW50LT5uYW1lLCBjaGlsZC0+bmFtZSkpOwotICBhcmMgPSBhcmNfbG9va3VwIChwYXJlbnQsIGNoaWxkKTsKLSAgaWYgKGFyYykKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogQSBoaXQ6IGp1c3QgaW5jcmVtZW50IHRoZSBjb3VudC4KLSAgICAgICAqLwotICAgICAgREJHIChUQUxMWURFQlVHLCBwcmludGYgKCJbdGFsbHldIGhpdCAlbHUgKz0gJWx1XG4iLAotCQkJICAgICAgIGFyYy0+Y291bnQsIGNvdW50KSk7Ci0gICAgICBhcmMtPmNvdW50ICs9IGNvdW50OwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYXJjID0gKEFyYyAqKSB4bWFsbG9jIChzaXplb2YgKCphcmMpKTsKLSAgbWVtc2V0IChhcmMsIDAsIHNpemVvZiAoKmFyYykpOwotICBhcmMtPnBhcmVudCA9IHBhcmVudDsKLSAgYXJjLT5jaGlsZCA9IGNoaWxkOwotICBhcmMtPmNvdW50ID0gY291bnQ7Ci0KLSAgLyogSWYgdGhpcyBpc24ndCBhbiBhcmMgZm9yIGEgcmVjdXJzaXZlIGNhbGwgdG8gcGFyZW50LCB0aGVuIGFkZCBpdAotICAgICB0byB0aGUgYXJyYXkgb2YgYXJjcy4gICovCi0gIGlmIChwYXJlbnQgIT0gY2hpbGQpCi0gICAgewotICAgICAgLyogSWYgd2UndmUgZXhoYXVzdGVkIHNwYWNlIGluIG91ciBjdXJyZW50IGFycmF5LCBnZXQgYSBuZXcgb25lCi0JIGFuZCBjb3B5IHRoZSBjb250ZW50cy4gICBXZSBtaWdodCB3YW50IHRvIHRocm90dGxlIHRoZSBkb3VibGluZwotCSBmYWN0b3Igb25lIGRheS4gICovCi0gICAgICBpZiAobnVtYXJjcyA9PSBtYXhhcmNzKQotCXsKLQkgIC8qIERldGVybWluZSBob3cgbXVjaCBzcGFjZSB3ZSB3YW50IHRvIGFsbG9jYXRlLiAgKi8KLQkgIGlmIChtYXhhcmNzID09IDApCi0JICAgIG1heGFyY3MgPSAxOwotCSAgbWF4YXJjcyAqPSAyOwotCQotCSAgLyogQWxsb2NhdGUgdGhlIG5ldyBhcnJheS4gICovCi0JICBuZXdhcmNzID0gKEFyYyAqKil4bWFsbG9jKHNpemVvZiAoQXJjICopICogbWF4YXJjcyk7Ci0KLQkgIC8qIENvcHkgdGhlIG9sZCBhcnJheSdzIGNvbnRlbnRzIGludG8gdGhlIG5ldyBhcnJheS4gICovCi0JICBtZW1jcHkgKG5ld2FyY3MsIGFyY3MsIG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7Ci0KLQkgIC8qIEZyZWUgdXAgdGhlIG9sZCBhcnJheS4gICovCi0JICBmcmVlIChhcmNzKTsKLQotCSAgLyogQW5kIG1ha2UgdGhlIG5ldyBhcnJheSBiZSB0aGUgY3VycmVudCBhcnJheS4gICovCi0JICBhcmNzID0gbmV3YXJjczsKLQl9Ci0KLSAgICAgIC8qIFBsYWNlIHRoaXMgYXJjIGluIHRoZSBhcmMgYXJyYXkuICAqLwotICAgICAgYXJjc1tudW1hcmNzKytdID0gYXJjOwotICAgIH0KLQotICAvKiBwcmVwZW5kIHRoaXMgY2hpbGQgdG8gdGhlIGNoaWxkcmVuIG9mIHRoaXMgcGFyZW50OiAqLwotICBhcmMtPm5leHRfY2hpbGQgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOwotICBwYXJlbnQtPmNnLmNoaWxkcmVuID0gYXJjOwotCi0gIC8qIHByZXBlbmQgdGhpcyBwYXJlbnQgdG8gdGhlIHBhcmVudHMgb2YgdGhpcyBjaGlsZDogKi8KLSAgYXJjLT5uZXh0X3BhcmVudCA9IGNoaWxkLT5jZy5wYXJlbnRzOwotICBjaGlsZC0+Y2cucGFyZW50cyA9IGFyYzsKLX0KLQotCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX3RvcG8sIChscCwgcnApLCBjb25zdCBQVFIgbHAgQU5EIGNvbnN0IFBUUiBycCkKLXsKLSAgY29uc3QgU3ltICpsZWZ0ID0gKihjb25zdCBTeW0gKiopIGxwOwotICBjb25zdCBTeW0gKnJpZ2h0ID0gKihjb25zdCBTeW0gKiopIHJwOwotCi0gIHJldHVybiBsZWZ0LT5jZy50b3Bfb3JkZXIgLSByaWdodC0+Y2cudG9wX29yZGVyOwotfQotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJvcGFnYXRlX3RpbWUsIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCi17Ci0gIEFyYyAqYXJjOwotICBTeW0gKmNoaWxkOwotICBkb3VibGUgc2hhcmUsIHByb3Bfc2hhcmU7Ci0KLSAgaWYgKHBhcmVudC0+Y2cucHJvcC5mcmFjdCA9PSAwLjApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBnYXRoZXIgdGltZSBmcm9tIGNoaWxkcmVuIG9mIHRoaXMgcGFyZW50OiAqLwotCi0gIGZvciAoYXJjID0gcGFyZW50LT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBhcmMtPm5leHRfY2hpbGQpCi0gICAgewotICAgICAgY2hpbGQgPSBhcmMtPmNoaWxkOwotICAgICAgaWYgKGFyYy0+Y291bnQgPT0gMCB8fCBjaGlsZCA9PSBwYXJlbnQgfHwgY2hpbGQtPmNnLnByb3AuZnJhY3QgPT0gMCkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkICE9IGNoaWxkKQotCXsKLQkgIGlmIChwYXJlbnQtPmNnLmN5Yy5udW0gPT0gY2hpbGQtPmNnLmN5Yy5udW0pCi0JICAgIHsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgaWYgKHBhcmVudC0+Y2cudG9wX29yZGVyIDw9IGNoaWxkLT5jZy50b3Bfb3JkZXIpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJbcHJvcGFnYXRlXSB0b3BvcmRlciBib3RjaGVzXG4iKTsKLQkgICAgfQotCSAgY2hpbGQgPSBjaGlsZC0+Y2cuY3ljLmhlYWQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChwYXJlbnQtPmNnLnRvcF9vcmRlciA8PSBjaGlsZC0+Y2cudG9wX29yZGVyKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW3Byb3BhZ2F0ZV0gdG9wb3JkZXIgYm90Y2hlc1xuIik7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoY2hpbGQtPm5jYWxscyA9PSAwKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogZGlzdHJpYnV0ZSB0aW1lIGZvciB0aGlzIGFyYzogKi8KLSAgICAgIGFyYy0+dGltZSA9IGNoaWxkLT5oaXN0LnRpbWUgKiAoKChkb3VibGUpIGFyYy0+Y291bnQpCi0JCQkJICAgICAgLyAoKGRvdWJsZSkgY2hpbGQtPm5jYWxscykpOwotICAgICAgYXJjLT5jaGlsZF90aW1lID0gY2hpbGQtPmNnLmNoaWxkX3RpbWUKLQkqICgoKGRvdWJsZSkgYXJjLT5jb3VudCkgLyAoKGRvdWJsZSkgY2hpbGQtPm5jYWxscykpOwotICAgICAgc2hhcmUgPSBhcmMtPnRpbWUgKyBhcmMtPmNoaWxkX3RpbWU7Ci0gICAgICBwYXJlbnQtPmNnLmNoaWxkX3RpbWUgKz0gc2hhcmU7Ci0KLSAgICAgIC8qICgxIC0gY2cucHJvcC5mcmFjdCkgZ2V0cyBsb3N0IGFsb25nIHRoZSB3YXk6ICovCi0gICAgICBwcm9wX3NoYXJlID0gcGFyZW50LT5jZy5wcm9wLmZyYWN0ICogc2hhcmU7Ci0KLSAgICAgIC8qIGZpeCB0aGluZ3MgZm9yIHByaW50aW5nOiAqLwotICAgICAgcGFyZW50LT5jZy5wcm9wLmNoaWxkICs9IHByb3Bfc2hhcmU7Ci0gICAgICBhcmMtPnRpbWUgKj0gcGFyZW50LT5jZy5wcm9wLmZyYWN0OwotICAgICAgYXJjLT5jaGlsZF90aW1lICo9IHBhcmVudC0+Y2cucHJvcC5mcmFjdDsKLQotICAgICAgLyogYWRkIHRoaXMgc2hhcmUgdG8gdGhlIHBhcmVudCdzIGN5Y2xlIGhlYWRlciwgaWYgYW55OiAqLwotICAgICAgaWYgKHBhcmVudC0+Y2cuY3ljLmhlYWQgIT0gcGFyZW50KQotCXsKLQkgIHBhcmVudC0+Y2cuY3ljLmhlYWQtPmNnLmNoaWxkX3RpbWUgKz0gc2hhcmU7Ci0JICBwYXJlbnQtPmNnLmN5Yy5oZWFkLT5jZy5wcm9wLmNoaWxkICs9IHByb3Bfc2hhcmU7Ci0JfQotICAgICAgREJHIChQUk9QREVCVUcsCi0JICAgcHJpbnRmICgiW3Byb3BfdGltZV0gY2hpbGQgXHQiKTsKLQkgICBwcmludF9uYW1lIChjaGlsZCk7Ci0JICAgcHJpbnRmICgiIHdpdGggJWYgJWYgJWx1LyVsdVxuIiwgY2hpbGQtPmhpc3QudGltZSwKLQkJICAgY2hpbGQtPmNnLmNoaWxkX3RpbWUsIGFyYy0+Y291bnQsIGNoaWxkLT5uY2FsbHMpOwotCSAgIHByaW50ZiAoIltwcm9wX3RpbWVdIHBhcmVudFx0Iik7Ci0JICAgcHJpbnRfbmFtZSAocGFyZW50KTsKLQkgICBwcmludGYgKCJcbltwcm9wX3RpbWVdIHNoYXJlICVmXG4iLCBzaGFyZSkpOwotICAgIH0KLX0KLQotCi0vKgotICogQ29tcHV0ZSB0aGUgdGltZSBvZiBhIGN5Y2xlIGFzIHRoZSBzdW0gb2YgdGhlIHRpbWVzIG9mIGFsbAotICogaXRzIG1lbWJlcnMuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTl9WT0lEIChjeWNsZV90aW1lKQotewotICBTeW0gKm1lbWJlciwgKmN5YzsKLQotICBmb3IgKGN5YyA9ICZjeWNsZV9oZWFkZXJbMV07IGN5YyA8PSAmY3ljbGVfaGVhZGVyW251bV9jeWNsZXNdOyArK2N5YykKLSAgICB7Ci0gICAgICBmb3IgKG1lbWJlciA9IGN5Yy0+Y2cuY3ljLm5leHQ7IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKLQl7Ci0JICBpZiAobWVtYmVyLT5jZy5wcm9wLmZyYWN0ID09IDAuMCkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogQWxsIG1lbWJlcnMgaGF2ZSB0aGUgc2FtZSBwcm9wZnJhY3Rpb24gZXhjZXB0IHRob3NlCi0JICAgICAgICogdGhhdCB3ZXJlIGV4Y2x1ZGVkIHdpdGggLUUuCi0JICAgICAgICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGN5Yy0+aGlzdC50aW1lICs9IG1lbWJlci0+aGlzdC50aW1lOwotCX0KLSAgICAgIGN5Yy0+Y2cucHJvcC5zZWxmID0gY3ljLT5jZy5wcm9wLmZyYWN0ICogY3ljLT5oaXN0LnRpbWU7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTl9WT0lEIChjeWNsZV9saW5rKQotewotICBTeW0gKnN5bSwgKmN5YywgKm1lbWJlcjsKLSAgQXJjICphcmM7Ci0gIGludCBudW07Ci0KLSAgLyogY291bnQgdGhlIG51bWJlciBvZiBjeWNsZXMsIGFuZCBpbml0aWFsaXplIHRoZSBjeWNsZSBsaXN0czogKi8KLQotICBudW1fY3ljbGVzID0gMDsKLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICAvKiB0aGlzIGlzIGhvdyB5b3UgZmluZCB1bmF0dGFjaGVkIGN5Y2xlczogKi8KLSAgICAgIGlmIChzeW0tPmNnLmN5Yy5oZWFkID09IHN5bSAmJiBzeW0tPmNnLmN5Yy5uZXh0KQotCXsKLQkgICsrbnVtX2N5Y2xlczsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIGN5Y2xlX2hlYWRlciBpcyBpbmRleGVkIGJ5IGN5Y2xlIG51bWJlcjogaS5lLiBpdCBpcyBvcmlnaW4gMSwKLSAgICogbm90IG9yaWdpbiAwLgotICAgKi8KLSAgY3ljbGVfaGVhZGVyID0gKFN5bSAqKSB4bWFsbG9jICgobnVtX2N5Y2xlcyArIDEpICogc2l6ZW9mIChTeW0pKTsKLQotICAvKgotICAgKiBOb3cgbGluayBjeWNsZXMgdG8gdHJ1ZSBjeWNsZS1oZWFkcywgbnVtYmVyIHRoZW0sIGFjY3VtdWxhdGUKLSAgICogdGhlIGRhdGEgZm9yIHRoZSBjeWNsZS4KLSAgICovCi0gIG51bSA9IDA7Ci0gIGN5YyA9IGN5Y2xlX2hlYWRlcjsKLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBpZiAoIShzeW0tPmNnLmN5Yy5oZWFkID09IHN5bSAmJiBzeW0tPmNnLmN5Yy5uZXh0ICE9IDApKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgICsrbnVtOwotICAgICAgKytjeWM7Ci0gICAgICBzeW1faW5pdCAoY3ljKTsKLSAgICAgIGN5Yy0+Y2cucHJpbnRfZmxhZyA9IFRSVUU7CS8qIHNob3VsZCB0aGlzIGJlIHByaW50ZWQ/ICovCi0gICAgICBjeWMtPmNnLnRvcF9vcmRlciA9IERGTl9OQU47CS8qIGdyYXBoIGNhbGwgY2hhaW4gdG9wLXNvcnQgb3JkZXIgKi8KLSAgICAgIGN5Yy0+Y2cuY3ljLm51bSA9IG51bTsJLyogaW50ZXJuYWwgbnVtYmVyIG9mIGN5Y2xlIG9uICovCi0gICAgICBjeWMtPmNnLmN5Yy5oZWFkID0gY3ljOwkvKiBwb2ludGVyIHRvIGhlYWQgb2YgY3ljbGUgKi8KLSAgICAgIGN5Yy0+Y2cuY3ljLm5leHQgPSBzeW07CS8qIHBvaW50ZXIgdG8gbmV4dCBtZW1iZXIgb2YgY3ljbGUgKi8KLSAgICAgIERCRyAoQ1lDTEVERUJVRywgcHJpbnRmICgiW2N5Y2xlX2xpbmtdICIpOwotCSAgIHByaW50X25hbWUgKHN5bSk7Ci0JICAgcHJpbnRmICgiIGlzIHRoZSBoZWFkIG9mIGN5Y2xlICVkXG4iLCBudW0pKTsKLQotICAgICAgLyogbGluayBtZW1iZXJzIHRvIGN5Y2xlIGhlYWRlcjogKi8KLSAgICAgIGZvciAobWVtYmVyID0gc3ltOyBtZW1iZXI7IG1lbWJlciA9IG1lbWJlci0+Y2cuY3ljLm5leHQpCi0JewotCSAgbWVtYmVyLT5jZy5jeWMubnVtID0gbnVtOwotCSAgbWVtYmVyLT5jZy5jeWMuaGVhZCA9IGN5YzsKLQl9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBDb3VudCBjYWxscyBmcm9tIG91dHNpZGUgdGhlIGN5Y2xlIGFuZCB0aG9zZSBhbW9uZyBjeWNsZQotICAgICAgICogbWVtYmVyczoKLSAgICAgICAqLwotICAgICAgZm9yIChtZW1iZXIgPSBzeW07IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKLQl7Ci0JICBmb3IgKGFyYyA9IG1lbWJlci0+Y2cucGFyZW50czsgYXJjOyBhcmMgPSBhcmMtPm5leHRfcGFyZW50KQotCSAgICB7Ci0JICAgICAgaWYgKGFyYy0+cGFyZW50ID09IG1lbWJlcikKLQkJewotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKGFyYy0+cGFyZW50LT5jZy5jeWMubnVtID09IG51bSkKLQkJewotCQkgIGN5Yy0+Y2cuc2VsZl9jYWxscyArPSBhcmMtPmNvdW50OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY3ljLT5uY2FsbHMgKz0gYXJjLT5jb3VudDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotCi0vKgotICogQ2hlY2sgaWYgYW55IHBhcmVudCBvZiB0aGlzIGNoaWxkIChvciBvdXRzaWRlIHBhcmVudHMgb2YgdGhpcwotICogY3ljbGUpIGhhdmUgdGhlaXIgcHJpbnQgZmxhZ3Mgb24gYW5kIHNldCB0aGUgcHJpbnQgZmxhZyBvZiB0aGUKLSAqIGNoaWxkIChjeWNsZSkgYXBwcm9wcmlhdGVseS4gIFNpbWlsYXJseSwgZGVhbCB3aXRoIHByb3BhZ2F0aW9uCi0gKiBmcmFjdGlvbnMgZnJvbSBwYXJlbnRzLgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKGluaGVyaXRfZmxhZ3MsIChjaGlsZCksIFN5bSAqIGNoaWxkKQotewotICBTeW0gKmhlYWQsICpwYXJlbnQsICptZW1iZXI7Ci0gIEFyYyAqYXJjOwotCi0gIGhlYWQgPSBjaGlsZC0+Y2cuY3ljLmhlYWQ7Ci0gIGlmIChjaGlsZCA9PSBoZWFkKQotICAgIHsKLSAgICAgIC8qIGp1c3QgYSByZWd1bGFyIGNoaWxkLCBjaGVjayBpdHMgcGFyZW50czogKi8KLSAgICAgIGNoaWxkLT5jZy5wcmludF9mbGFnID0gRkFMU0U7Ci0gICAgICBjaGlsZC0+Y2cucHJvcC5mcmFjdCA9IDAuMDsKLSAgICAgIGZvciAoYXJjID0gY2hpbGQtPmNnLnBhcmVudHM7IGFyYzsgYXJjID0gYXJjLT5uZXh0X3BhcmVudCkKLQl7Ci0JICBwYXJlbnQgPSBhcmMtPnBhcmVudDsKLQkgIGlmIChjaGlsZCA9PSBwYXJlbnQpCi0JICAgIHsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgY2hpbGQtPmNnLnByaW50X2ZsYWcgfD0gcGFyZW50LT5jZy5wcmludF9mbGFnOwotCSAgLyoKLQkgICAqIElmIHRoZSBjaGlsZCB3YXMgbmV2ZXIgYWN0dWFsbHkgY2FsbGVkIChlLmcuLCB0aGlzIGFyYwotCSAgICogaXMgc3RhdGljIChhbmQgYWxsIG90aGVycyBhcmUsIHRvbykpIG5vIHRpbWUgcHJvcGFnYXRlcwotCSAgICogYWxvbmcgdGhpcyBhcmMuCi0JICAgKi8KLQkgIGlmIChjaGlsZC0+bmNhbGxzICE9IDApCi0JICAgIHsKLQkgICAgICBjaGlsZC0+Y2cucHJvcC5mcmFjdCArPSBwYXJlbnQtPmNnLnByb3AuZnJhY3QKLQkJKiAoKChkb3VibGUpIGFyYy0+Y291bnQpIC8gKChkb3VibGUpIGNoaWxkLT5uY2FsbHMpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogSXRzIGEgbWVtYmVyIG9mIGEgY3ljbGUsIGxvb2sgYXQgYWxsIHBhcmVudHMgZnJvbSBvdXRzaWRlCi0gICAgICAgKiB0aGUgY3ljbGUuCi0gICAgICAgKi8KLSAgICAgIGhlYWQtPmNnLnByaW50X2ZsYWcgPSBGQUxTRTsKLSAgICAgIGhlYWQtPmNnLnByb3AuZnJhY3QgPSAwLjA7Ci0gICAgICBmb3IgKG1lbWJlciA9IGhlYWQtPmNnLmN5Yy5uZXh0OyBtZW1iZXI7IG1lbWJlciA9IG1lbWJlci0+Y2cuY3ljLm5leHQpCi0JewotCSAgZm9yIChhcmMgPSBtZW1iZXItPmNnLnBhcmVudHM7IGFyYzsgYXJjID0gYXJjLT5uZXh0X3BhcmVudCkKLQkgICAgewotCSAgICAgIGlmIChhcmMtPnBhcmVudC0+Y2cuY3ljLmhlYWQgPT0gaGVhZCkKLQkJewotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgcGFyZW50ID0gYXJjLT5wYXJlbnQ7Ci0JICAgICAgaGVhZC0+Y2cucHJpbnRfZmxhZyB8PSBwYXJlbnQtPmNnLnByaW50X2ZsYWc7Ci0JICAgICAgLyoKLQkgICAgICAgKiBJZiB0aGUgY3ljbGUgd2FzIG5ldmVyIGFjdHVhbGx5IGNhbGxlZCAoZS5nLiB0aGlzCi0JICAgICAgICogYXJjIGlzIHN0YXRpYyAoYW5kIGFsbCBvdGhlcnMgYXJlLCB0b28pKSBubyB0aW1lCi0JICAgICAgICogcHJvcGFnYXRlcyBhbG9uZyB0aGlzIGFyYy4KLQkgICAgICAgKi8KLQkgICAgICBpZiAoaGVhZC0+bmNhbGxzICE9IDApCi0JCXsKLQkJICBoZWFkLT5jZy5wcm9wLmZyYWN0ICs9IHBhcmVudC0+Y2cucHJvcC5mcmFjdAotCQkgICAgKiAoKChkb3VibGUpIGFyYy0+Y291bnQpIC8gKChkb3VibGUpIGhlYWQtPm5jYWxscykpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBmb3IgKG1lbWJlciA9IGhlYWQ7IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKLQl7Ci0JICBtZW1iZXItPmNnLnByaW50X2ZsYWcgPSBoZWFkLT5jZy5wcmludF9mbGFnOwotCSAgbWVtYmVyLT5jZy5wcm9wLmZyYWN0ID0gaGVhZC0+Y2cucHJvcC5mcmFjdDsKLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBJbiBvbmUgdG9wLXRvLWJvdHRvbSBwYXNzIG92ZXIgdGhlIHRvcG9sb2dpY2FsbHkgc29ydGVkIHN5bWJvbHMKLSAqIHByb3BhZ2F0ZToKLSAqICAgICAgY2cucHJpbnRfZmxhZyBhcyB0aGUgdW5pb24gb2YgcGFyZW50cycgcHJpbnRfZmxhZ3MKLSAqICAgICAgcHJvcGZyYWN0aW9uIGFzIHRoZSBzdW0gb2YgZnJhY3Rpb25hbCBwYXJlbnRzJyBwcm9wZnJhY3Rpb25zCi0gKiBhbmQgd2hpbGUgd2UncmUgaGVyZSwgc3VtIHRpbWUgZm9yIGZ1bmN0aW9ucy4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChwcm9wYWdhdGVfZmxhZ3MsIChzeW1ib2xzKSwgU3ltICoqIHN5bWJvbHMpCi17Ci0gIGludCBpbmRleDsKLSAgU3ltICpvbGRfaGVhZCwgKmNoaWxkOwotCi0gIG9sZF9oZWFkID0gMDsKLSAgZm9yIChpbmRleCA9IHN5bXRhYi5sZW4gLSAxOyBpbmRleCA+PSAwOyAtLWluZGV4KQotICAgIHsKLSAgICAgIGNoaWxkID0gc3ltYm9sc1tpbmRleF07Ci0gICAgICAvKgotICAgICAgICogSWYgd2UgaGF2ZW4ndCBkb25lIHRoaXMgZnVuY3Rpb24gb3IgY3ljbGUsIGluaGVyaXQgdGhpbmdzCi0gICAgICAgKiBmcm9tIHBhcmVudC4gIFRoaXMgd2F5LCB3ZSBhcmUgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgYXJjcwotICAgICAgICogc2luY2Ugd2UgZG8gYWxsIG1lbWJlcnMgb2YgYSBjeWNsZSAoYW5kIHRoZSBjeWNsZSBpdHNlbGYpCi0gICAgICAgKiBhcyB3ZSBoaXQgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgY3ljbGUuCi0gICAgICAgKi8KLSAgICAgIGlmIChjaGlsZC0+Y2cuY3ljLmhlYWQgIT0gb2xkX2hlYWQpCi0JewotCSAgb2xkX2hlYWQgPSBjaGlsZC0+Y2cuY3ljLmhlYWQ7Ci0JICBpbmhlcml0X2ZsYWdzIChjaGlsZCk7Ci0JfQotICAgICAgREJHIChQUk9QREVCVUcsCi0JICAgcHJpbnRmICgiW3Byb3BfZmxhZ3NdICIpOwotCSAgIHByaW50X25hbWUgKGNoaWxkKTsKLQkgICBwcmludGYgKCJpbmhlcml0cyBwcmludC1mbGFnICVkIGFuZCBwcm9wLWZyYWN0ICVmXG4iLAotCQkgICBjaGlsZC0+Y2cucHJpbnRfZmxhZywgY2hpbGQtPmNnLnByb3AuZnJhY3QpKTsKLSAgICAgIGlmICghY2hpbGQtPmNnLnByaW50X2ZsYWcpCi0JewotCSAgLyoKLQkgICAqIFByaW50ZmxhZyBpcyBvZmYuIEl0IGdldHMgdHVybmVkIG9uIGJ5IGJlaW5nIGluIHRoZQotCSAgICogSU5DTF9HUkFQSCB0YWJsZSwgb3IgdGhlcmUgYmVpbmcgYW4gZW1wdHkgSU5DTF9HUkFQSAotCSAgICogdGFibGUgYW5kIG5vdCBiZWluZyBpbiB0aGUgRVhDTF9HUkFQSCB0YWJsZS4KLQkgICAqLwotCSAgaWYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfR1JBUEhdLCBjaGlsZC0+YWRkcikKLQkgICAgICB8fCAoc3ltc1tJTkNMX0dSQVBIXS5sZW4gPT0gMAotCQkgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0dSQVBIXSwgY2hpbGQtPmFkZHIpKSkKLQkgICAgewotCSAgICAgIGNoaWxkLT5jZy5wcmludF9mbGFnID0gVFJVRTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKgotCSAgICogVGhpcyBmdW5jdGlvbiBoYXMgcHJpbnRpbmcgcGFyZW50czogbWF5YmUgc29tZW9uZSB3YW50cwotCSAgICogdG8gc2h1dCBpdCB1cCBieSBwdXR0aW5nIGl0IGluIHRoZSBFWENMX0dSQVBIIHRhYmxlLgotCSAgICogKEJ1dCBmYXZvciBJTkNMX0dSQVBIIG92ZXIgRVhDTF9HUkFQSC4pCi0JICAgKi8KLQkgIGlmICghc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9HUkFQSF0sIGNoaWxkLT5hZGRyKQotCSAgICAgICYmIHN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfR1JBUEhdLCBjaGlsZC0+YWRkcikpCi0JICAgIHsKLQkgICAgICBjaGlsZC0+Y2cucHJpbnRfZmxhZyA9IEZBTFNFOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGNoaWxkLT5jZy5wcm9wLmZyYWN0ID09IDAuMCkKLQl7Ci0JICAvKgotCSAgICogTm8gcGFyZW50cyB0byBwYXNzIHRpbWUgdG8uICBDb2xsZWN0IHRpbWUgZnJvbSBjaGlsZHJlbgotCSAgICogaWYgaXRzIGluIHRoZSBJTkNMX1RJTUUgdGFibGUsIG9yIHRoZXJlIGlzIGFuIGVtcHR5Ci0JICAgKiBJTkNMX1RJTUUgdGFibGUgYW5kIGl0cyBub3QgaW4gdGhlIEVYQ0xfVElNRSB0YWJsZS4KLQkgICAqLwotCSAgaWYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfVElNRV0sIGNoaWxkLT5hZGRyKQotCSAgICAgIHx8IChzeW1zW0lOQ0xfVElNRV0ubGVuID09IDAKLQkJICAmJiAhc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9USU1FXSwgY2hpbGQtPmFkZHIpKSkKLQkgICAgewotCSAgICAgIGNoaWxkLT5jZy5wcm9wLmZyYWN0ID0gMS4wOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qCi0JICAgKiBJdCBoYXMgcGFyZW50cyB0byBwYXNzIHRpbWUgdG8sIGJ1dCBtYXliZSBzb21lb25lIHdhbnRzCi0JICAgKiB0byBzaHV0IGl0IHVwIGJ5IHB1dHR0aW5nIGl0IGluIHRoZSBFWENMX1RJTUUgdGFibGUuCi0JICAgKiAoQnV0IGZhdm9yIGJlaW5nIGluIElOQ0xfVElNRSB0YWJlIG92ZXIgYmVpbmcgaW4KLQkgICAqIEVYQ0xfVElNRSB0YWJsZS4pCi0JICAgKi8KLQkgIGlmICghc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9USU1FXSwgY2hpbGQtPmFkZHIpCi0JICAgICAgJiYgc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9USU1FXSwgY2hpbGQtPmFkZHIpKQotCSAgICB7Ci0JICAgICAgY2hpbGQtPmNnLnByb3AuZnJhY3QgPSAwLjA7Ci0JICAgIH0KLQl9Ci0gICAgICBjaGlsZC0+Y2cucHJvcC5zZWxmID0gY2hpbGQtPmhpc3QudGltZSAqIGNoaWxkLT5jZy5wcm9wLmZyYWN0OwotICAgICAgcHJpbnRfdGltZSArPSBjaGlsZC0+Y2cucHJvcC5zZWxmOwotICAgICAgREJHIChQUk9QREVCVUcsCi0JICAgcHJpbnRmICgiW3Byb3BfZmxhZ3NdICIpOwotCSAgIHByaW50X25hbWUgKGNoaWxkKTsKLQkgICBwcmludGYgKCIgZW5kcyB1cCB3aXRoIHByaW50ZmxhZyAlZCBhbmQgcHJvcC1mcmFjdCAlZlxuIiwKLQkJICAgY2hpbGQtPmNnLnByaW50X2ZsYWcsIGNoaWxkLT5jZy5wcm9wLmZyYWN0KTsKLQkgICBwcmludGYgKCJbcHJvcF9mbGFnc10gdGltZSAlZiBwcm9wc2VsZiAlZiBwcmludF90aW1lICVmXG4iLAotCQkgICBjaGlsZC0+aGlzdC50aW1lLCBjaGlsZC0+Y2cucHJvcC5zZWxmLCBwcmludF90aW1lKSk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBDb21wYXJlIGJ5IGRlY3JlYXNpbmcgcHJvcGFnYXRlZCB0aW1lLiAgSWYgdGltZXMgYXJlIGVxdWFsLCBidXQgb25lCi0gKiBpcyBhIGN5Y2xlIGhlYWRlciwgc2F5IHRoYXQncyBmaXJzdCAoZS5nLiBsZXNzLCBpLmUuIC0xKS4gIElmIG9uZSdzCi0gKiBuYW1lIGRvZXNuJ3QgaGF2ZSBhbiB1bmRlcnNjb3JlIGFuZCB0aGUgb3RoZXIgZG9lcywgc2F5IHRoYXQgb25lIGlzCi0gKiBmaXJzdC4gIEFsbCBlbHNlIGJlaW5nIGVxdWFsLCBjb21wYXJlIGJ5IG5hbWVzLgotICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX3RvdGFsLCAobHAsIHJwKSwgY29uc3QgUFRSIGxwIEFORCBjb25zdCBQVFIgcnApCi17Ci0gIGNvbnN0IFN5bSAqbGVmdCA9ICooY29uc3QgU3ltICoqKSBscDsKLSAgY29uc3QgU3ltICpyaWdodCA9ICooY29uc3QgU3ltICoqKSBycDsKLSAgZG91YmxlIGRpZmY7Ci0KLSAgZGlmZiA9IChsZWZ0LT5jZy5wcm9wLnNlbGYgKyBsZWZ0LT5jZy5wcm9wLmNoaWxkKQotICAgIC0gKHJpZ2h0LT5jZy5wcm9wLnNlbGYgKyByaWdodC0+Y2cucHJvcC5jaGlsZCk7Ci0gIGlmIChkaWZmIDwgMC4wKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKGRpZmYgPiAwLjApCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKCFsZWZ0LT5uYW1lICYmIGxlZnQtPmNnLmN5Yy5udW0gIT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpZiAoIXJpZ2h0LT5uYW1lICYmIHJpZ2h0LT5jZy5jeWMubnVtICE9IDApCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAoIWxlZnQtPm5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKCFyaWdodC0+bmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChsZWZ0LT5uYW1lWzBdICE9ICdfJyAmJiByaWdodC0+bmFtZVswXSA9PSAnXycpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKGxlZnQtPm5hbWVbMF0gPT0gJ18nICYmIHJpZ2h0LT5uYW1lWzBdICE9ICdfJykKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChsZWZ0LT5uY2FsbHMgPiByaWdodC0+bmNhbGxzKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGlmIChsZWZ0LT5uY2FsbHMgPCByaWdodC0+bmNhbGxzKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgcmV0dXJuIHN0cmNtcCAobGVmdC0+bmFtZSwgcmlnaHQtPm5hbWUpOwotfQotCi0KLS8qCi0gKiBUb3BvbG9naWNhbGx5IHNvcnQgdGhlIGdyYXBoIChjb2xsYXBzaW5nIGN5Y2xlcyksIGFuZCBwcm9wYWdhdGVzCi0gKiB0aW1lIGJvdHRvbSB1cCBhbmQgZmxhZ3MgdG9wIGRvd24uCi0gKi8KLVN5bSAqKgotREVGVU5fVk9JRCAoY2dfYXNzZW1ibGUpCi17Ci0gIFN5bSAqcGFyZW50LCAqKnRpbWVfc29ydGVkX3N5bXMsICoqdG9wX3NvcnRlZF9zeW1zOwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIEFyYyAqYXJjOwotCi0gIC8qCi0gICAqIGluaXRpYWxpemUgdmFyaW91cyB0aGluZ3M6Ci0gICAqICAgICAgemVybyBvdXQgY2hpbGQgdGltZXMuCi0gICAqICAgICAgY291bnQgc2VsZi1yZWN1cnNpdmUgY2FsbHMuCi0gICAqICAgICAgaW5kaWNhdGUgdGhhdCBub3RoaW5nIGlzIG9uIGN5Y2xlcy4KLSAgICovCi0gIGZvciAocGFyZW50ID0gc3ltdGFiLmJhc2U7IHBhcmVudCA8IHN5bXRhYi5saW1pdDsgcGFyZW50KyspCi0gICAgewotICAgICAgcGFyZW50LT5jZy5jaGlsZF90aW1lID0gMC4wOwotICAgICAgYXJjID0gYXJjX2xvb2t1cCAocGFyZW50LCBwYXJlbnQpOwotICAgICAgaWYgKGFyYyAmJiBwYXJlbnQgPT0gYXJjLT5jaGlsZCkKLQl7Ci0JICBwYXJlbnQtPm5jYWxscyAtPSBhcmMtPmNvdW50OwotCSAgcGFyZW50LT5jZy5zZWxmX2NhbGxzID0gYXJjLT5jb3VudDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcGFyZW50LT5jZy5zZWxmX2NhbGxzID0gMDsKLQl9Ci0gICAgICBwYXJlbnQtPmNnLnByb3AuZnJhY3QgPSAwLjA7Ci0gICAgICBwYXJlbnQtPmNnLnByb3Auc2VsZiA9IDAuMDsKLSAgICAgIHBhcmVudC0+Y2cucHJvcC5jaGlsZCA9IDAuMDsKLSAgICAgIHBhcmVudC0+Y2cucHJpbnRfZmxhZyA9IEZBTFNFOwotICAgICAgcGFyZW50LT5jZy50b3Bfb3JkZXIgPSBERk5fTkFOOwotICAgICAgcGFyZW50LT5jZy5jeWMubnVtID0gMDsKLSAgICAgIHBhcmVudC0+Y2cuY3ljLmhlYWQgPSBwYXJlbnQ7Ci0gICAgICBwYXJlbnQtPmNnLmN5Yy5uZXh0ID0gMDsKLSAgICAgIGlmIChpZ25vcmVfZGlyZWN0X2NhbGxzKQotCXsKLQkgIGZpbmRfY2FsbCAocGFyZW50LCBwYXJlbnQtPmFkZHIsIChwYXJlbnQgKyAxKS0+YWRkcik7Ci0JfQotICAgIH0KLSAgLyoKLSAgICogVG9wb2xvZ2ljYWxseSBvcmRlciB0aGluZ3MuICBJZiBhbnkgbm9kZSBpcyB1bm51bWJlcmVkLCBudW1iZXIKLSAgICogaXQgYW5kIGFueSBvZiBpdHMgZGVzY2VuZGVudHMuCi0gICAqLwotICBmb3IgKHBhcmVudCA9IHN5bXRhYi5iYXNlOyBwYXJlbnQgPCBzeW10YWIubGltaXQ7IHBhcmVudCsrKQotICAgIHsKLSAgICAgIGlmIChwYXJlbnQtPmNnLnRvcF9vcmRlciA9PSBERk5fTkFOKQotCXsKLQkgIGNnX2RmbiAocGFyZW50KTsKLQl9Ci0gICAgfQotCi0gIC8qIGxpbmsgdG9nZXRoZXIgbm9kZXMgb24gdGhlIHNhbWUgY3ljbGU6ICovCi0gIGN5Y2xlX2xpbmsgKCk7Ci0KLSAgLyogc29ydCB0aGUgc3ltYm9sIHRhYmxlIGluIHJldmVyc2UgdG9wb2xvZ2ljYWwgb3JkZXI6ICovCi0gIHRvcF9zb3J0ZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47ICsraW5kZXgpCi0gICAgewotICAgICAgdG9wX3NvcnRlZF9zeW1zW2luZGV4XSA9ICZzeW10YWIuYmFzZVtpbmRleF07Ci0gICAgfQotICBxc29ydCAodG9wX3NvcnRlZF9zeW1zLCBzeW10YWIubGVuLCBzaXplb2YgKFN5bSAqKSwgY21wX3RvcG8pOwotICBEQkcgKERGTkRFQlVHLAotICAgICAgIHByaW50ZiAoIltjZ19hc3NlbWJsZV0gdG9wb2xvZ2ljYWwgc29ydCBsaXN0aW5nXG4iKTsKLSAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyArK2luZGV4KQotICAgICAgIHsKLSAgICAgICBwcmludGYgKCJbY2dfYXNzZW1ibGVdICIpOwotICAgICAgIHByaW50ZiAoIiVkOiIsIHRvcF9zb3J0ZWRfc3ltc1tpbmRleF0tPmNnLnRvcF9vcmRlcik7Ci0gICAgICAgcHJpbnRfbmFtZSAodG9wX3NvcnRlZF9zeW1zW2luZGV4XSk7Ci0gICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgICB9Ci0gICk7Ci0gIC8qCi0gICAqIFN0YXJ0aW5nIGZyb20gdGhlIHRvcG9sb2dpY2FsIHRvcCwgcHJvcGFnYXRlIHByaW50IGZsYWdzIHRvCi0gICAqIGNoaWxkcmVuLiAgYWxzbywgY2FsY3VsYXRlIHByb3BhZ2F0aW9uIGZyYWN0aW9ucy4gIHRoaXMgaGFwcGVucwotICAgKiBiZWZvcmUgdGltZSBwcm9wYWdhdGlvbiBzaW5jZSB0aW1lIHByb3BhZ2F0aW9uIHVzZXMgdGhlCi0gICAqIGZyYWN0aW9ucy4KLSAgICovCi0gIHByb3BhZ2F0ZV9mbGFncyAodG9wX3NvcnRlZF9zeW1zKTsKLQotICAvKgotICAgKiBTdGFydGluZyBmcm9tIHRoZSB0b3BvbG9naWNhbCBib3R0b20sIHByb3BvZ2F0ZSBjaGlsZHJlbiB0aW1lcwotICAgKiB1cCB0byBwYXJlbnRzLgotICAgKi8KLSAgY3ljbGVfdGltZSAoKTsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgKytpbmRleCkKLSAgICB7Ci0gICAgICBwcm9wYWdhdGVfdGltZSAodG9wX3NvcnRlZF9zeW1zW2luZGV4XSk7Ci0gICAgfQotCi0gIGZyZWUgKHRvcF9zb3J0ZWRfc3ltcyk7Ci0KLSAgLyoKLSAgICogTm93LCBzb3J0IGJ5IENHLlBST1AuU0VMRiArIENHLlBST1AuQ0hJTEQuICBTb3J0aW5nIGJvdGggdGhlIHJlZ3VsYXIKLSAgICogZnVuY3Rpb24gbmFtZXMgYW5kIGN5Y2xlIGhlYWRlcnMuCi0gICAqLwotICB0aW1lX3NvcnRlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoKHN5bXRhYi5sZW4gKyBudW1fY3ljbGVzKSAqIHNpemVvZiAoU3ltICopKTsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgaW5kZXgrKykKLSAgICB7Ci0gICAgICB0aW1lX3NvcnRlZF9zeW1zW2luZGV4XSA9ICZzeW10YWIuYmFzZVtpbmRleF07Ci0gICAgfQotICBmb3IgKGluZGV4ID0gMTsgaW5kZXggPD0gbnVtX2N5Y2xlczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICB0aW1lX3NvcnRlZF9zeW1zW3N5bXRhYi5sZW4gKyBpbmRleCAtIDFdID0gJmN5Y2xlX2hlYWRlcltpbmRleF07Ci0gICAgfQotICBxc29ydCAodGltZV9zb3J0ZWRfc3ltcywgc3ltdGFiLmxlbiArIG51bV9jeWNsZXMsIHNpemVvZiAoU3ltICopLAotCSBjbXBfdG90YWwpOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuICsgbnVtX2N5Y2xlczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICB0aW1lX3NvcnRlZF9zeW1zW2luZGV4XS0+Y2cuaW5kZXggPSBpbmRleCArIDE7Ci0gICAgfQotICByZXR1cm4gdGltZV9zb3J0ZWRfc3ltczsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2NnX2FyY3MuaCBiL2dwcm9mL2NnX2FyY3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhMDE5Ny4uMDAwMDAwMAotLS0gYS9ncHJvZi9jZ19hcmNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jaWZuZGVmIGNnX2FyY3NfaAotI2RlZmluZSBjZ19hcmNzX2gKLQotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLS8qCi0gKiBBcmMgc3RydWN0dXJlIGZvciBjYWxsLWdyYXBoLgotICoKLSAqIFdpdGggcG9pbnRlcnMgdG8gdGhlIHN5bWJvbHMgb2YgdGhlIHBhcmVudCBhbmQgdGhlIGNoaWxkLCBhIGNvdW50Ci0gKiBvZiBob3cgbWFueSB0aW1lcyB0aGlzIGFyYyB3YXMgdHJhdmVyc2VkLCBhbmQgcG9pbnRlcnMgdG8gdGhlIG5leHQKLSAqIHBhcmVudCBvZiB0aGlzIGNoaWxkIGFuZCB0aGUgbmV4dCBjaGlsZCBvZiB0aGlzIHBhcmVudC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgYXJjCi0gIHsKLSAgICBTeW0gKnBhcmVudDsJCS8qIHNvdXJjZSB2ZXJ0aWNlIG9mIGFyYyAqLwotICAgIFN5bSAqY2hpbGQ7CQkJLyogZGVzdCB2ZXJ0aWNlIG9mIGFyYyAqLwotICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7CS8qICMgb2YgY2FsbHMgZnJvbSBwYXJlbnQgdG8gY2hpbGQgKi8KLSAgICBkb3VibGUgdGltZTsJCS8qIHRpbWUgaW5oZXJpdGVkIGFsb25nIGFyYyAqLwotICAgIGRvdWJsZSBjaGlsZF90aW1lOwkJLyogY2hpbGQtdGltZSBpbmhlcml0ZWQgYWxvbmcgYXJjICovCi0gICAgc3RydWN0IGFyYyAqbmV4dF9wYXJlbnQ7CS8qIG5leHQgcGFyZW50IG9mIENISUxEICovCi0gICAgc3RydWN0IGFyYyAqbmV4dF9jaGlsZDsJLyogbmV4dCBjaGlsZCBvZiBQQVJFTlQgKi8KLSAgICBpbnQgaGFzX2JlZW5fcGxhY2VkOwkvKiBoYXZlIHRoaXMgYXJjJ3MgZnVuY3Rpb25zIGJlZW4gcGxhY2VkPyAqLwotICB9Ci1BcmM7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgbnVtX2N5Y2xlczsJLyogbnVtYmVyIG9mIGN5Y2xlcyBkaXNjb3ZlcmVkICovCi1leHRlcm4gU3ltICpjeWNsZV9oZWFkZXI7CS8qIGN5Y2xlIGhlYWRlcnMgKi8KLQotZXh0ZXJuIHZvaWQgYXJjX2FkZCBQQVJBTVMgKChTeW0gKiBwYXJlbnQsIFN5bSAqIGNoaWxkLCB1bnNpZ25lZCBsb25nIGNvdW50KSk7Ci1leHRlcm4gQXJjICphcmNfbG9va3VwIFBBUkFNUyAoKFN5bSAqIHBhcmVudCwgU3ltICogY2hpbGQpKTsKLWV4dGVybiBTeW0gKipjZ19hc3NlbWJsZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gQXJjICoqYXJjczsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbnVtYXJjczsKLQotI2VuZGlmIC8qIGNnX2FyY3NfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfZGZuLmMgYi9ncHJvZi9jZ19kZm4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJkNjRlNy4uMDAwMDAwMAotLS0gYS9ncHJvZi9jZ19kZm4uYworKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY2dfZGZuLmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0jaW5jbHVkZSAidXRpbHMuaCIKLQotI2RlZmluZQlERk5fSU5DUl9ERVBUSCAoMTI4KQotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgU3ltICpzeW07Ci0gICAgaW50IGN5Y2xlX3RvcDsKLSAgfQotREZOX1N0YWNrOwotCi1ERk5fU3RhY2sgKmRmbl9zdGFjayA9IE5VTEw7Ci1pbnQgZGZuX21heGRlcHRoID0gMDsKLWludCBkZm5fZGVwdGggPSAwOwotaW50IGRmbl9jb3VudGVyID0gREZOX05BTjsKLQotCi0vKgotICogSXMgQ0hJTEQgYWxyZWFkeSBudW1iZXJlZD8KLSAqLwotc3RhdGljIGJvb2wKLURFRlVOIChpc19udW1iZXJlZCwgKGNoaWxkKSwgU3ltICogY2hpbGQpCi17Ci0gIHJldHVybiBjaGlsZC0+Y2cudG9wX29yZGVyICE9IERGTl9OQU4gJiYgY2hpbGQtPmNnLnRvcF9vcmRlciAhPSBERk5fQlVTWTsKLX0KLQotCi0vKgotICogSXMgQ0hJTEQgYWxyZWFkeSBidXN5PwotICovCi1zdGF0aWMgYm9vbAotREVGVU4gKGlzX2J1c3ksIChjaGlsZCksIFN5bSAqIGNoaWxkKQotewotICBpZiAoY2hpbGQtPmNnLnRvcF9vcmRlciA9PSBERk5fTkFOKQotICAgIHsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBDSElMRCBpcyBwYXJ0IG9mIGEgY3ljbGUuICBGaW5kIHRoZSB0b3AgY2FsbGVyIGludG8gdGhpcyBjeWNsZQotICogdGhhdCBpcyBub3QgcGFydCBvZiB0aGUgY3ljbGUgYW5kIG1ha2UgYWxsIGZ1bmN0aW9ucyBpbiBjeWNsZQotICogbWVtYmVycyBvZiB0aGF0IGN5Y2xlICh0b3AgY2FsbGVyID09IGNhbGxlciB3aXRoIHNtYWxsZXN0Ci0gKiBkZXB0aC1maXJzdCBudW1iZXIpLgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKGZpbmRfY3ljbGUsIChjaGlsZCksIFN5bSAqIGNoaWxkKQotewotICBTeW0gKmhlYWQgPSAwOwotICBTeW0gKnRhaWw7Ci0gIGludCBjeWNsZV90b3A7Ci0gIGludCBpbmRleDsKLQotICBmb3IgKGN5Y2xlX3RvcCA9IGRmbl9kZXB0aDsgY3ljbGVfdG9wID4gMDsgLS1jeWNsZV90b3ApCi0gICAgewotICAgICAgaGVhZCA9IGRmbl9zdGFja1tjeWNsZV90b3BdLnN5bTsKLSAgICAgIGlmIChjaGlsZCA9PSBoZWFkKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmIChjaGlsZC0+Y2cuY3ljLmhlYWQgIT0gY2hpbGQgJiYgY2hpbGQtPmNnLmN5Yy5oZWFkID09IGhlYWQpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgaWYgKGN5Y2xlX3RvcCA8PSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIltmaW5kX2N5Y2xlXSBjb3VsZG4ndCBmaW5kIGhlYWQgb2YgY3ljbGVcbiIpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotI2lmZGVmIERFQlVHCi0gIGlmIChkZWJ1Z19sZXZlbCAmIERGTkRFQlVHKQotICAgIHsKLSAgICAgIHByaW50ZiAoIltmaW5kX2N5Y2xlXSBkZm5fZGVwdGggJWQgY3ljbGVfdG9wICVkICIsCi0JICAgICAgZGZuX2RlcHRoLCBjeWNsZV90b3ApOwotICAgICAgaWYgKGhlYWQpCi0JewotCSAgcHJpbnRfbmFtZSAoaGVhZCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoIjx1bmtub3duPiIpOwotCX0KLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotI2VuZGlmCi0gIGlmIChjeWNsZV90b3AgPT0gZGZuX2RlcHRoKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBUaGlzIGlzIHByZXZpb3VzIGZ1bmN0aW9uLCBlLmcuIHRoaXMgY2FsbHMgaXRzZWxmLiAgU29ydCBvZgotICAgICAgICogYm9yaW5nLgotICAgICAgICoKLSAgICAgICAqIFNpbmNlIHdlIGFyZSB0YWtpbmcgb3V0IHNlbGYtY3ljbGVzIGVsc2V3aGVyZSBubyBuZWVkIGZvcgotICAgICAgICogdGhlIHNwZWNpYWwgY2FzZSwgaGVyZS4KLSAgICAgICAqLwotICAgICAgREJHIChERk5ERUJVRywKLQkgICBwcmludGYgKCJbZmluZF9jeWNsZV0gIik7Ci0JICAgcHJpbnRfbmFtZSAoY2hpbGQpOwotCSAgIHByaW50ZiAoIlxuIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBHbG9tIGludGVydmVuaW5nIGZ1bmN0aW9ucyB0aGF0IGFyZW4ndCBhbHJlYWR5IGdsb21tZWQgaW50bwotICAgICAgICogdGhpcyBjeWNsZS4gIFRoaW5ncyBoYXZlIGJlZW4gZ2xvbW1lZCB3aGVuIHRoZWlyIGN5Y2xlaGVhZAotICAgICAgICogZmllbGQgcG9pbnRzIHRvIHRoZSBoZWFkIG9mIHRoZSBjeWNsZSB0aGV5IGFyZSBnbG9tbWVkCi0gICAgICAgKiBpbnRvLgotICAgICAgICovCi0gICAgICBmb3IgKHRhaWwgPSBoZWFkOyB0YWlsLT5jZy5jeWMubmV4dDsgdGFpbCA9IHRhaWwtPmNnLmN5Yy5uZXh0KQotCXsKLQkgIC8qIHZvaWQ6IGNoYXNlIGRvd24gdG8gdGFpbCBvZiB0aGluZ3MgYWxyZWFkeSBnbG9tbWVkICovCi0JICBEQkcgKERGTkRFQlVHLAotCSAgICAgICBwcmludGYgKCJbZmluZF9jeWNsZV0gdGFpbCAiKTsKLQkgICAgICAgcHJpbnRfbmFtZSAodGFpbCk7Ci0JICAgICAgIHByaW50ZiAoIlxuIikpOwotCX0KLSAgICAgIC8qCi0gICAgICAgKiBJZiB3aGF0IHdlIHRoaW5rIGlzIHRoZSB0b3Agb2YgdGhlIGN5Y2xlIGhhcyBhIGN5Y2xlaGVhZAotICAgICAgICogZmllbGQsIHRoZW4gaXQncyBub3QgcmVhbGx5IHRoZSBoZWFkIG9mIHRoZSBjeWNsZSwgd2hpY2ggaXMKLSAgICAgICAqIHJlYWxseSB3aGF0IHdlIHdhbnQuCi0gICAgICAgKi8KLSAgICAgIGlmIChoZWFkLT5jZy5jeWMuaGVhZCAhPSBoZWFkKQotCXsKLQkgIGhlYWQgPSBoZWFkLT5jZy5jeWMuaGVhZDsKLQkgIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltmaW5kX2N5Y2xlXSBuZXcgY3ljbGVoZWFkICIpOwotCSAgICAgICBwcmludF9uYW1lIChoZWFkKTsKLQkgICAgICAgcHJpbnRmICgiXG4iKSk7Ci0JfQotICAgICAgZm9yIChpbmRleCA9IGN5Y2xlX3RvcCArIDE7IGluZGV4IDw9IGRmbl9kZXB0aDsgKytpbmRleCkKLQl7Ci0JICBjaGlsZCA9IGRmbl9zdGFja1tpbmRleF0uc3ltOwotCSAgaWYgKGNoaWxkLT5jZy5jeWMuaGVhZCA9PSBjaGlsZCkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogTm90IHlldCBnbG9tbWVkIGFueXdoZXJlLCBnbG9tIGl0IGFuZCBmaXggYW55Ci0JICAgICAgICogY2hpbGRyZW4gaXQgaGFzIGdsb21tZWQuCi0JICAgICAgICovCi0JICAgICAgdGFpbC0+Y2cuY3ljLm5leHQgPSBjaGlsZDsKLQkgICAgICBjaGlsZC0+Y2cuY3ljLmhlYWQgPSBoZWFkOwotCSAgICAgIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltmaW5kX2N5Y2xlXSBnbG9tbWluZyAiKTsKLQkJICAgcHJpbnRfbmFtZSAoY2hpbGQpOwotCQkgICBwcmludGYgKCIgb250byAiKTsKLQkJICAgcHJpbnRfbmFtZSAoaGVhZCk7Ci0JCSAgIHByaW50ZiAoIlxuIikpOwotCSAgICAgIGZvciAodGFpbCA9IGNoaWxkOyB0YWlsLT5jZy5jeWMubmV4dDsgdGFpbCA9IHRhaWwtPmNnLmN5Yy5uZXh0KQotCQl7Ci0JCSAgdGFpbC0+Y2cuY3ljLm5leHQtPmNnLmN5Yy5oZWFkID0gaGVhZDsKLQkJICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbZmluZF9jeWNsZV0gYW5kIGl0cyB0YWlsICIpOwotCQkgICAgICAgcHJpbnRfbmFtZSAodGFpbC0+Y2cuY3ljLm5leHQpOwotCQkgICAgICAgcHJpbnRmICgiIG9udG8gIik7Ci0JCSAgICAgICBwcmludF9uYW1lIChoZWFkKTsKLQkJICAgICAgIHByaW50ZiAoIlxuIikpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGNoaWxkLT5jZy5jeWMuaGVhZCAhPSBoZWFkIC8qIGZpcmV3YWxsICovICkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIltmaW5kX2N5Y2xlXSBnbG9tbWVkLCBidXQgbm90IHRvIGhlYWRcbiIpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotCi0vKgotICogUHJlcGFyZSBmb3IgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIFBBUkVOVC4gIFB1c2ggYSBwYXJlbnQgb250bwotICogdGhlIHN0YWNrIGFuZCBtYXJrIGl0IGJ1c3kuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJlX3Zpc2l0LCAocGFyZW50KSwgU3ltICogcGFyZW50KQotewotICArK2Rmbl9kZXB0aDsKLQotICBpZiAoZGZuX2RlcHRoID49IGRmbl9tYXhkZXB0aCkKLSAgICB7Ci0gICAgICBkZm5fbWF4ZGVwdGggKz0gREZOX0lOQ1JfREVQVEg7Ci0gICAgICBkZm5fc3RhY2sgPSB4cmVhbGxvYyAoZGZuX3N0YWNrLCBkZm5fbWF4ZGVwdGggKiBzaXplb2YgKmRmbl9zdGFjayk7Ci0gICAgfQotCi0gIGRmbl9zdGFja1tkZm5fZGVwdGhdLnN5bSA9IHBhcmVudDsKLSAgZGZuX3N0YWNrW2Rmbl9kZXB0aF0uY3ljbGVfdG9wID0gZGZuX2RlcHRoOwotICBwYXJlbnQtPmNnLnRvcF9vcmRlciA9IERGTl9CVVNZOwotICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbcHJlX3Zpc2l0XVx0XHQlZDoiLCBkZm5fZGVwdGgpOwotICAgICAgIHByaW50X25hbWUgKHBhcmVudCk7Ci0gICAgICAgcHJpbnRmICgiXG4iKSk7Ci19Ci0KLQotLyoKLSAqIERvbmUgd2l0aCB2aXNpdGluZyBub2RlIFBBUkVOVC4gIFBvcCBQQVJFTlQgb2ZmIGRmbl9zdGFjawotICogYW5kIG51bWJlciBmdW5jdGlvbnMgaWYgUEFSRU5UIGlzIGhlYWQgb2YgYSBjeWNsZS4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChwb3N0X3Zpc2l0LCAocGFyZW50KSwgU3ltICogcGFyZW50KQotewotICBTeW0gKm1lbWJlcjsKLQotICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbcG9zdF92aXNpdF1cdCVkOiAiLCBkZm5fZGVwdGgpOwotICAgICAgIHByaW50X25hbWUgKHBhcmVudCk7Ci0gICAgICAgcHJpbnRmICgiXG4iKSk7Ci0gIC8qCi0gICAqIE51bWJlciBmdW5jdGlvbnMgYW5kIHRoaW5ncyBpbiB0aGVpciBjeWNsZXMgdW5sZXNzIHRoZSBmdW5jdGlvbgotICAgKiBpcyBpdHNlbGYgcGFydCBvZiBhIGN5Y2xlOgotICAgKi8KLSAgaWYgKHBhcmVudC0+Y2cuY3ljLmhlYWQgPT0gcGFyZW50KQotICAgIHsKLSAgICAgICsrZGZuX2NvdW50ZXI7Ci0gICAgICBmb3IgKG1lbWJlciA9IHBhcmVudDsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQotCXsKLQkgIG1lbWJlci0+Y2cudG9wX29yZGVyID0gZGZuX2NvdW50ZXI7Ci0JICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbcG9zdF92aXNpdF1cdFx0bWVtYmVyICIpOwotCSAgICAgICBwcmludF9uYW1lIChtZW1iZXIpOwotCSAgICAgICBwcmludGYgKCItPiBjZy50b3Bfb3JkZXIgPSAlZFxuIiwgZGZuX2NvdW50ZXIpKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW3Bvc3RfdmlzaXRdXHRcdGlzIHBhcnQgb2YgYSBjeWNsZVxuIikpOwotICAgIH0KLSAgLS1kZm5fZGVwdGg7Ci19Ci0KLQotLyoKLSAqIEdpdmVuIHRoaXMgUEFSRU5ULCBkZXB0aCBmaXJzdCBudW1iZXIgaXRzIGNoaWxkcmVuLgotICovCi12b2lkCi1ERUZVTiAoY2dfZGZuLCAocGFyZW50KSwgU3ltICogcGFyZW50KQotewotICBBcmMgKmFyYzsKLQotICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbZGZuXSBkZm4oICIpOwotICAgICAgIHByaW50X25hbWUgKHBhcmVudCk7Ci0gICAgICAgcHJpbnRmICgiKVxuIikpOwotICAvKgotICAgKiBJZiB3ZSdyZSBhbHJlYWR5IG51bWJlcmVkLCBubyBuZWVkIHRvIGxvb2sgYW55IGZ1cnRoZXI6Ci0gICAqLwotICBpZiAoaXNfbnVtYmVyZWQgKHBhcmVudCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgLyoKLSAgICogSWYgd2UncmUgYWxyZWFkeSBidXN5LCBtdXN0IGJlIGEgY3ljbGU6Ci0gICAqLwotICBpZiAoaXNfYnVzeSAocGFyZW50KSkKLSAgICB7Ci0gICAgICBmaW5kX2N5Y2xlIChwYXJlbnQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgcHJlX3Zpc2l0IChwYXJlbnQpOwotICAvKgotICAgKiBSZWN1cnNpdmVseSB2aXNpdCBjaGlsZHJlbjoKLSAgICovCi0gIGZvciAoYXJjID0gcGFyZW50LT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBhcmMtPm5leHRfY2hpbGQpCi0gICAgewotICAgICAgY2dfZGZuIChhcmMtPmNoaWxkKTsKLSAgICB9Ci0gIHBvc3RfdmlzaXQgKHBhcmVudCk7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9jZ19kZm4uaCBiL2dwcm9mL2NnX2Rmbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQzMDMwLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2NnX2Rmbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotI2lmbmRlZiBjZ19kZm5faAotI2RlZmluZSBjZ19kZm5faAotCi0vKgotICogRmxhZ3Mgd2hpY2ggbWFyayBhIHN5bWJvbCBhcyB0b3BvbG9naWNhbGx5IGBgYnVzeScnIG9yIGFzCi0gKiB0b3BvbG9naWNhbGx5IGBgbm90X251bWJlcmVkJyc6Ci0gKi8KLSNkZWZpbmUJREZOX0JVU1kJLTEKLSNkZWZpbmUJREZOX05BTgkJMAotCi0vKgotICogRGVwdGgtZmlyc3QgbnVtYmVyaW5nIG9mIGEgY2FsbC1ncmFwaC4KLSAqLwotCi1leHRlcm4gdm9pZCBjZ19kZm4gUEFSQU1TICgoU3ltICogcm9vdCkpOwotCi0jZW5kaWYgLyogY2dfZGZuX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2NnX3ByaW50LmMgYi9ncHJvZi9jZ19wcmludC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjQ1YmM3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2NnX3ByaW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjc2ICswLDAgQEAKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY2dfcHJpbnQuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAidXRpbHMuaCIKLQotLyoKLSAqIFJldHVybiB2YWx1ZSBvZiBjb21wYXJpc29uIGZ1bmN0aW9ucyB1c2VkIHRvIHNvcnQgdGFibGVzOgotICovCi0jZGVmaW5lCUxFU1NUSEFOCS0xCi0jZGVmaW5lCUVRVUFMVE8JCTAKLSNkZWZpbmUJR1JFQVRFUlRIQU4JMQotCi1zdGF0aWMgdm9pZCBvcmRlcl9hbmRfZHVtcF9mdW5jdGlvbnNfYnlfYXJjcyBQQVJBTVMgKChBcmMgKiosIHVuc2lnbmVkIGxvbmcsCi0JCQkJCQkgICAgICBpbnQsIEFyYyAqKiwKLQkJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKikpOwotLyogZGVjbGFyYXRpb25zIG9mIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZ1bmN0aW9ucyB0byBvdXRwdXQgYmx1cmJzOiAqLwotZXh0ZXJuIHZvaWQgYnNkX2NhbGxnX2JsdXJiIFBBUkFNUyAoKEZJTEUgKiBmcCkpOwotZXh0ZXJuIHZvaWQgZnNmX2NhbGxnX2JsdXJiIFBBUkFNUyAoKEZJTEUgKiBmcCkpOwotCi1kb3VibGUgcHJpbnRfdGltZSA9IDAuMDsKLQotCi1zdGF0aWMgdm9pZAotREVGVU5fVk9JRCAocHJpbnRfaGVhZGVyKQotewotICBpZiAoZmlyc3Rfb3V0cHV0KQotICAgIHsKLSAgICAgIGZpcnN0X291dHB1dCA9IEZBTFNFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIlxmXG4iKTsKLSAgICB9Ci0gIGlmICghYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBpZiAocHJpbnRfZGVzY3JpcHRpb25zKQotCXsKLQkgIHByaW50ZiAoXygiXHRcdCAgICAgQ2FsbCBncmFwaCAoZXhwbGFuYXRpb24gZm9sbG93cylcblxuIikpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKF8oIlx0XHRcdENhbGwgZ3JhcGhcblxuIikpOwotCX0KLSAgICB9Ci0gIHByaW50ZiAoXygiXG5ncmFudWxhcml0eTogZWFjaCBzYW1wbGUgaGl0IGNvdmVycyAlbGQgYnl0ZShzKSIpLAotCSAgKGxvbmcpIGhpc3Rfc2NhbGUgKiBzaXplb2YgKFVOSVQpKTsKLSAgaWYgKHByaW50X3RpbWUgPiAwLjApCi0gICAgewotICAgICAgcHJpbnRmIChfKCIgZm9yICUuMmYlJSBvZiAlLjJmIHNlY29uZHNcblxuIiksCi0JICAgICAgMTAwLjAgLyBwcmludF90aW1lLCBwcmludF90aW1lIC8gaHopOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiIG5vIHRpbWUgcHJvcGFnYXRlZFxuXG4iKSk7Ci0gICAgICAvKgotICAgICAgICogVGhpcyBkb2Vzbid0IGh1cnQsIHNpbmNlIGFsbCB0aGUgbnVtZXJhdG9ycyB3aWxsIGJlIDAuMDoKLSAgICAgICAqLwotICAgICAgcHJpbnRfdGltZSA9IDEuMDsKLSAgICB9Ci0gIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIHByaW50ZiAoIiU2LjZzICU1LjVzICU3LjdzICUxMS4xMXMgJTcuN3MvJS03LjdzICAgICAlLTguOHNcbiIsCi0JICAgICAgIiIsICIiLCAiIiwgIiIsIF8oImNhbGxlZCIpLCBfKCJ0b3RhbCIpLCBfKCJwYXJlbnRzIikpOwotICAgICAgcHJpbnRmICgiJS02LjZzICU1LjVzICU3LjdzICUxMS4xMXMgJTcuN3MrJS03LjdzICUtOC44c1x0JTUuNXNcbiIsCi0JICAgICAgXygiaW5kZXgiKSwgXygiJXRpbWUiKSwgXygic2VsZiIpLCBfKCJkZXNjZW5kZW50cyIpLAotCSAgICAgIF8oImNhbGxlZCIpLCBfKCJzZWxmIiksIF8oIm5hbWUiKSwgXygiaW5kZXgiKSk7Ci0gICAgICBwcmludGYgKCIlNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3LjdzLyUtNy43cyAgICAgJS04LjhzXG4iLAotCSAgICAgICIiLCAiIiwgIiIsICIiLCBfKCJjYWxsZWQiKSwgXygidG90YWwiKSwgXygiY2hpbGRyZW4iKSk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiaW5kZXggJSUgdGltZSAgICBzZWxmICBjaGlsZHJlbiAgICBjYWxsZWQgICAgIG5hbWVcbiIpKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIFByaW50IGEgY3ljbGUgaGVhZGVyLgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHByaW50X2N5Y2xlLCAoY3ljKSwgU3ltICogY3ljKQotewotICBjaGFyIGJ1ZltCVUZTSVpdOwotCi0gIHNwcmludGYgKGJ1ZiwgIlslZF0iLCBjeWMtPmNnLmluZGV4KTsKLSAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0Ci0JICA/ICIlLTYuNnMgJTUuMWYgJTcuMmYgJTExLjJmICU3bHUiCi0JICA6ICIlLTYuNnMgJTUuMWYgJTcuMmYgJTcuMmYgJTdsdSIsIGJ1ZiwKLQkgIDEwMCAqIChjeWMtPmNnLnByb3Auc2VsZiArIGN5Yy0+Y2cucHJvcC5jaGlsZCkgLyBwcmludF90aW1lLAotCSAgY3ljLT5jZy5wcm9wLnNlbGYgLyBoeiwgY3ljLT5jZy5wcm9wLmNoaWxkIC8gaHosIGN5Yy0+bmNhbGxzKTsKLSAgaWYgKGN5Yy0+Y2cuc2VsZl9jYWxscyAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoIislLTdsdSIsIGN5Yy0+Y2cuc2VsZl9jYWxscyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiICU3LjdzIiwgIiIpOwotICAgIH0KLSAgcHJpbnRmIChfKCIgPGN5Y2xlICVkIGFzIGEgd2hvbGU+IFslZF1cbiIpLCBjeWMtPmNnLmN5Yy5udW0sIGN5Yy0+Y2cuaW5kZXgpOwotfQotCi0KLS8qCi0gKiBDb21wYXJlIExFRlQgYW5kIFJJR0hUIG1lbWJtZXIuICBNYWpvciBjb21wYXJpc29uIGtleSBpcwotICogQ0cuUFJPUC5TRUxGK0NHLlBST1AuQ0hJTEQsIHNlY29uZGFyeSBrZXkgaXMgTkNBTExTK0NHLlNFTEZfQ0FMTFMuCi0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfbWVtYmVyLCAobGVmdCwgcmlnaHQpLCBTeW0gKiBsZWZ0IEFORCBTeW0gKiByaWdodCkKLXsKLSAgZG91YmxlIGxlZnRfdGltZSA9IGxlZnQtPmNnLnByb3Auc2VsZiArIGxlZnQtPmNnLnByb3AuY2hpbGQ7Ci0gIGRvdWJsZSByaWdodF90aW1lID0gcmlnaHQtPmNnLnByb3Auc2VsZiArIHJpZ2h0LT5jZy5wcm9wLmNoaWxkOwotICB1bnNpZ25lZCBsb25nIGxlZnRfY2FsbHMgPSBsZWZ0LT5uY2FsbHMgKyBsZWZ0LT5jZy5zZWxmX2NhbGxzOwotICB1bnNpZ25lZCBsb25nIHJpZ2h0X2NhbGxzID0gcmlnaHQtPm5jYWxscyArIHJpZ2h0LT5jZy5zZWxmX2NhbGxzOwotCi0gIGlmIChsZWZ0X3RpbWUgPiByaWdodF90aW1lKQotICAgIHsKLSAgICAgIHJldHVybiBHUkVBVEVSVEhBTjsKLSAgICB9Ci0gIGlmIChsZWZ0X3RpbWUgPCByaWdodF90aW1lKQotICAgIHsKLSAgICAgIHJldHVybiBMRVNTVEhBTjsKLSAgICB9Ci0KLSAgaWYgKGxlZnRfY2FsbHMgPiByaWdodF9jYWxscykKLSAgICB7Ci0gICAgICByZXR1cm4gR1JFQVRFUlRIQU47Ci0gICAgfQotICBpZiAobGVmdF9jYWxscyA8IHJpZ2h0X2NhbGxzKQotICAgIHsKLSAgICAgIHJldHVybiBMRVNTVEhBTjsKLSAgICB9Ci0gIHJldHVybiBFUVVBTFRPOwotfQotCi0KLS8qCi0gKiBTb3J0IG1lbWJlcnMgb2YgYSBjeWNsZS4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChzb3J0X21lbWJlcnMsIChjeWMpLCBTeW0gKiBjeWMpCi17Ci0gIFN5bSAqdG9kbywgKmRvaW5nLCAqcHJldjsKLSAgLyoKLSAgICogRGV0YWNoIGN5Y2xlIG1lbWJlcnMgZnJvbSBjeWNsZWhlYWQsIGFuZCBpbnNlcnRpb24gc29ydCB0aGVtCi0gICAqIGJhY2sgb24uCi0gICAqLwotICB0b2RvID0gY3ljLT5jZy5jeWMubmV4dDsKLSAgY3ljLT5jZy5jeWMubmV4dCA9IDA7Ci0gIGZvciAoZG9pbmcgPSB0b2RvOyBkb2luZyAmJiBkb2luZy0+Y2cuY3ljLm5leHQ7IGRvaW5nID0gdG9kbykKLSAgICB7Ci0gICAgICB0b2RvID0gZG9pbmctPmNnLmN5Yy5uZXh0OwotICAgICAgZm9yIChwcmV2ID0gY3ljOyBwcmV2LT5jZy5jeWMubmV4dDsgcHJldiA9IHByZXYtPmNnLmN5Yy5uZXh0KQotCXsKLQkgIGlmIChjbXBfbWVtYmVyIChkb2luZywgcHJldi0+Y2cuY3ljLm5leHQpID09IEdSRUFURVJUSEFOKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBkb2luZy0+Y2cuY3ljLm5leHQgPSBwcmV2LT5jZy5jeWMubmV4dDsKLSAgICAgIHByZXYtPmNnLmN5Yy5uZXh0ID0gZG9pbmc7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBQcmludCB0aGUgbWVtYmVycyBvZiBhIGN5Y2xlLgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHByaW50X21lbWJlcnMsIChjeWMpLCBTeW0gKiBjeWMpCi17Ci0gIFN5bSAqbWVtYmVyOwotCi0gIHNvcnRfbWVtYmVycyAoY3ljKTsKLSAgZm9yIChtZW1iZXIgPSBjeWMtPmNnLmN5Yy5uZXh0OyBtZW1iZXI7IG1lbWJlciA9IG1lbWJlci0+Y2cuY3ljLm5leHQpCi0gICAgewotICAgICAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0Ci0JICAgICAgPyAiJTYuNnMgJTUuNXMgJTcuMmYgJTExLjJmICU3bHUiCi0JICAgICAgOiAiJTYuNnMgJTUuNXMgJTcuMmYgJTcuMmYgJTdsdSIsCi0JICAgICAgIiIsICIiLCBtZW1iZXItPmNnLnByb3Auc2VsZiAvIGh6LCBtZW1iZXItPmNnLnByb3AuY2hpbGQgLyBoeiwKLQkgICAgICBtZW1iZXItPm5jYWxscyk7Ci0gICAgICBpZiAobWVtYmVyLT5jZy5zZWxmX2NhbGxzICE9IDApCi0JewotCSAgcHJpbnRmICgiKyUtN2x1IiwgbWVtYmVyLT5jZy5zZWxmX2NhbGxzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiICU3LjdzIiwgIiIpOwotCX0KLSAgICAgIHByaW50ZiAoIiAgICAgIik7Ci0gICAgICBwcmludF9uYW1lIChtZW1iZXIpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIENvbXBhcmUgdHdvIGFyY3MgdG8vZnJvbSB0aGUgc2FtZSBjaGlsZC9wYXJlbnQuCi0gKiAgICAgIC0gaWYgb25lIGFyYyBpcyBhIHNlbGYgYXJjLCBpdCdzIGxlYXN0LgotICogICAgICAtIGlmIG9uZSBhcmMgaXMgd2l0aGluIGEgY3ljbGUsIGl0J3MgbGVzcyB0aGFuLgotICogICAgICAtIGlmIGJvdGggYXJjcyBhcmUgd2l0aGluIGEgY3ljbGUsIGNvbXBhcmUgYXJjIGNvdW50cy4KLSAqICAgICAgLSBpZiBuZWl0aGVyIGFyYyBpcyB3aXRoaW4gYSBjeWNsZSwgY29tcGFyZSB3aXRoCi0gKiAgICAgICAgICAgICAgdGltZSArIGNoaWxkX3RpbWUgYXMgbWFqb3Iga2V5Ci0gKiAgICAgICAgICAgICAgYXJjIGNvdW50IGFzIG1pbm9yIGtleQotICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX2FyYywgKGxlZnQsIHJpZ2h0KSwgQXJjICogbGVmdCBBTkQgQXJjICogcmlnaHQpCi17Ci0gIFN5bSAqbGVmdF9wYXJlbnQgPSBsZWZ0LT5wYXJlbnQ7Ci0gIFN5bSAqbGVmdF9jaGlsZCA9IGxlZnQtPmNoaWxkOwotICBTeW0gKnJpZ2h0X3BhcmVudCA9IHJpZ2h0LT5wYXJlbnQ7Ci0gIFN5bSAqcmlnaHRfY2hpbGQgPSByaWdodC0+Y2hpbGQ7Ci0gIGRvdWJsZSBsZWZ0X3RpbWUsIHJpZ2h0X3RpbWU7Ci0KLSAgREJHIChUSU1FREVCVUcsCi0gICAgICAgcHJpbnRmICgiW2NtcF9hcmNdICIpOwotICAgICAgIHByaW50X25hbWUgKGxlZnRfcGFyZW50KTsKLSAgICAgICBwcmludGYgKCIgY2FsbHMgIik7Ci0gICAgICAgcHJpbnRfbmFtZSAobGVmdF9jaGlsZCk7Ci0gICAgICAgcHJpbnRmICgiICVmICsgJWYgJWx1LyVsdVxuIiwgbGVmdC0+dGltZSwgbGVmdC0+Y2hpbGRfdGltZSwKLQkgICAgICAgbGVmdC0+Y291bnQsIGxlZnRfY2hpbGQtPm5jYWxscyk7Ci0gICAgICAgcHJpbnRmICgiW2NtcF9hcmNdICIpOwotICAgICAgIHByaW50X25hbWUgKHJpZ2h0X3BhcmVudCk7Ci0gICAgICAgcHJpbnRmICgiIGNhbGxzICIpOwotICAgICAgIHByaW50X25hbWUgKHJpZ2h0X2NoaWxkKTsKLSAgICAgICBwcmludGYgKCIgJWYgKyAlZiAlbHUvJWx1XG4iLCByaWdodC0+dGltZSwgcmlnaHQtPmNoaWxkX3RpbWUsCi0JICAgICAgIHJpZ2h0LT5jb3VudCwgcmlnaHRfY2hpbGQtPm5jYWxscyk7Ci0gICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICApOwotICBpZiAobGVmdF9wYXJlbnQgPT0gbGVmdF9jaGlsZCkKLSAgICB7Ci0gICAgICByZXR1cm4gTEVTU1RIQU47CQkvKiBsZWZ0IGlzIGEgc2VsZiBjYWxsICovCi0gICAgfQotICBpZiAocmlnaHRfcGFyZW50ID09IHJpZ2h0X2NoaWxkKQotICAgIHsKLSAgICAgIHJldHVybiBHUkVBVEVSVEhBTjsJLyogcmlnaHQgaXMgYSBzZWxmIGNhbGwgKi8KLSAgICB9Ci0KLSAgaWYgKGxlZnRfcGFyZW50LT5jZy5jeWMubnVtICE9IDAgJiYgbGVmdF9jaGlsZC0+Y2cuY3ljLm51bSAhPSAwCi0gICAgICAmJiBsZWZ0X3BhcmVudC0+Y2cuY3ljLm51bSA9PSBsZWZ0X2NoaWxkLT5jZy5jeWMubnVtKQotICAgIHsKLSAgICAgIC8qIGxlZnQgaXMgYSBjYWxsIHdpdGhpbiBhIGN5Y2xlICovCi0gICAgICBpZiAocmlnaHRfcGFyZW50LT5jZy5jeWMubnVtICE9IDAgJiYgcmlnaHRfY2hpbGQtPmNnLmN5Yy5udW0gIT0gMAotCSAgJiYgcmlnaHRfcGFyZW50LT5jZy5jeWMubnVtID09IHJpZ2h0X2NoaWxkLT5jZy5jeWMubnVtKQotCXsKLQkgIC8qIHJpZ2h0IGlzIGEgY2FsbCB3aXRoaW4gdGhlIGN5Y2xlLCB0b28gKi8KLQkgIGlmIChsZWZ0LT5jb3VudCA8IHJpZ2h0LT5jb3VudCkKLQkgICAgewotCSAgICAgIHJldHVybiBMRVNTVEhBTjsKLQkgICAgfQotCSAgaWYgKGxlZnQtPmNvdW50ID4gcmlnaHQtPmNvdW50KQotCSAgICB7Ci0JICAgICAgcmV0dXJuIEdSRUFURVJUSEFOOwotCSAgICB9Ci0JICByZXR1cm4gRVFVQUxUTzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogcmlnaHQgaXNuJ3QgYSBjYWxsIHdpdGhpbiB0aGUgY3ljbGUgKi8KLQkgIHJldHVybiBMRVNTVEhBTjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogbGVmdCBpc24ndCBhIGNhbGwgd2l0aGluIGEgY3ljbGUgKi8KLSAgICAgIGlmIChyaWdodF9wYXJlbnQtPmNnLmN5Yy5udW0gIT0gMCAmJiByaWdodF9jaGlsZC0+Y2cuY3ljLm51bSAhPSAwCi0JICAmJiByaWdodF9wYXJlbnQtPmNnLmN5Yy5udW0gPT0gcmlnaHRfY2hpbGQtPmNnLmN5Yy5udW0pCi0JewotCSAgLyogcmlnaHQgaXMgYSBjYWxsIHdpdGhpbiBhIGN5Y2xlICovCi0JICByZXR1cm4gR1JFQVRFUlRIQU47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIG5laXRoZXIgaXMgYSBjYWxsIHdpdGhpbiBhIGN5Y2xlICovCi0JICBsZWZ0X3RpbWUgPSBsZWZ0LT50aW1lICsgbGVmdC0+Y2hpbGRfdGltZTsKLQkgIHJpZ2h0X3RpbWUgPSByaWdodC0+dGltZSArIHJpZ2h0LT5jaGlsZF90aW1lOwotCSAgaWYgKGxlZnRfdGltZSA8IHJpZ2h0X3RpbWUpCi0JICAgIHsKLQkgICAgICByZXR1cm4gTEVTU1RIQU47Ci0JICAgIH0KLQkgIGlmIChsZWZ0X3RpbWUgPiByaWdodF90aW1lKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIEdSRUFURVJUSEFOOwotCSAgICB9Ci0JICBpZiAobGVmdC0+Y291bnQgPCByaWdodC0+Y291bnQpCi0JICAgIHsKLQkgICAgICByZXR1cm4gTEVTU1RIQU47Ci0JICAgIH0KLQkgIGlmIChsZWZ0LT5jb3VudCA+IHJpZ2h0LT5jb3VudCkKLQkgICAgewotCSAgICAgIHJldHVybiBHUkVBVEVSVEhBTjsKLQkgICAgfQotCSAgcmV0dXJuIEVRVUFMVE87Ci0JfQotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHNvcnRfcGFyZW50cywgKGNoaWxkKSwgU3ltICogY2hpbGQpCi17Ci0gIEFyYyAqYXJjLCAqZGV0YWNoZWQsIHNvcnRlZCwgKnByZXY7Ci0KLSAgLyoKLSAgICogVW5saW5rIHBhcmVudHMgZnJvbSBjaGlsZCwgdGhlbiBpbnNlcnRpb24gc29ydCBiYWNrIG9uIHRvCi0gICAqIHNvcnRlZCdzIHBhcmVudHMuCi0gICAqICAgICAgKmFyYyAgICAgICAgdGhlIGFyYyB5b3UgaGF2ZSBkZXRhY2hlZCBhbmQgYXJlIGluc2VydGluZy4KLSAgICogICAgICAqZGV0YWNoZWQgICB0aGUgcmVzdCBvZiB0aGUgYXJjcyB0byBiZSBzb3J0ZWQuCi0gICAqICAgICAgc29ydGVkICAgICAgYXJjIGxpc3Qgb250byB3aGljaCB5b3UgaW5zZXJ0aW9uIHNvcnQuCi0gICAqICAgICAgKnByZXYgICAgICAgYXJjIGJlZm9yZSB0aGUgYXJjIHlvdSBhcmUgY29tcGFyaW5nLgotICAgKi8KLSAgc29ydGVkLm5leHRfcGFyZW50ID0gMDsKLSAgZm9yIChhcmMgPSBjaGlsZC0+Y2cucGFyZW50czsgYXJjOyBhcmMgPSBkZXRhY2hlZCkKLSAgICB7Ci0gICAgICBkZXRhY2hlZCA9IGFyYy0+bmV4dF9wYXJlbnQ7Ci0KLSAgICAgIC8qIGNvbnNpZGVyICphcmMgYXMgZGlzY29ubmVjdGVkOyBpbnNlcnQgaXQgaW50byBzb3J0ZWQ6ICovCi0gICAgICBmb3IgKHByZXYgPSAmc29ydGVkOyBwcmV2LT5uZXh0X3BhcmVudDsgcHJldiA9IHByZXYtPm5leHRfcGFyZW50KQotCXsKLQkgIGlmIChjbXBfYXJjIChhcmMsIHByZXYtPm5leHRfcGFyZW50KSAhPSBHUkVBVEVSVEhBTikKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgYXJjLT5uZXh0X3BhcmVudCA9IHByZXYtPm5leHRfcGFyZW50OwotICAgICAgcHJldi0+bmV4dF9wYXJlbnQgPSBhcmM7Ci0gICAgfQotCi0gIC8qIHJlYXR0YWNoIHNvcnRlZCBhcmNzIHRvIGNoaWxkOiAqLwotICBjaGlsZC0+Y2cucGFyZW50cyA9IHNvcnRlZC5uZXh0X3BhcmVudDsKLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHByaW50X3BhcmVudHMsIChjaGlsZCksIFN5bSAqIGNoaWxkKQotewotICBTeW0gKnBhcmVudDsKLSAgQXJjICphcmM7Ci0gIFN5bSAqY3ljbGVfaGVhZDsKLQotICBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkICE9IDApCi0gICAgewotICAgICAgY3ljbGVfaGVhZCA9IGNoaWxkLT5jZy5jeWMuaGVhZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjeWNsZV9oZWFkID0gY2hpbGQ7Ci0gICAgfQotICBpZiAoIWNoaWxkLT5jZy5wYXJlbnRzKQotICAgIHsKLSAgICAgIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAotCSAgICAgID8gXygiJTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlNy43cyAlNy43cyAgICAgPHNwb250YW5lb3VzPlxuIikKLQkgICAgICA6IF8oIiU2LjZzICU1LjVzICU3LjdzICU3LjdzICU3LjdzICU3LjdzICAgICA8c3BvbnRhbmVvdXM+XG4iKSwKLQkgICAgICAiIiwgIiIsICIiLCAiIiwgIiIsICIiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHNvcnRfcGFyZW50cyAoY2hpbGQpOwotICBmb3IgKGFyYyA9IGNoaWxkLT5jZy5wYXJlbnRzOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9wYXJlbnQpCi0gICAgewotICAgICAgcGFyZW50ID0gYXJjLT5wYXJlbnQ7Ci0gICAgICBpZiAoY2hpbGQgPT0gcGFyZW50IHx8IChjaGlsZC0+Y2cuY3ljLm51bSAhPSAwCi0JCQkgICAgICAmJiBwYXJlbnQtPmNnLmN5Yy5udW0gPT0gY2hpbGQtPmNnLmN5Yy5udW0pKQotCXsKLQkgIC8qIHNlbGZjYWxsIG9yIGNhbGwgYW1vbmcgc2libGluZ3M6ICovCi0JICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkJICA/ICIlNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3bHUgJTcuN3MgICAgICIKLQkJICA6ICIlNi42cyAlNS41cyAlNy43cyAlNy43cyAlN2x1ICU3LjdzICAgICAiLAotCQkgICIiLCAiIiwgIiIsICIiLAotCQkgIGFyYy0+Y291bnQsICIiKTsKLQkgIHByaW50X25hbWUgKHBhcmVudCk7Ci0JICBwcmludGYgKCJcbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiByZWd1bGFyIHBhcmVudCBvZiBjaGlsZDogKi8KLQkgIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAotCQkgID8gIiU2LjZzICU1LjVzICU3LjJmICUxMS4yZiAlN2x1LyUtN2x1ICAgICAiCi0JCSAgOiAiJTYuNnMgJTUuNXMgJTcuMmYgJTcuMmYgJTdsdS8lLTdsdSAgICAgIiwKLQkJICAiIiwgIiIsCi0JCSAgYXJjLT50aW1lIC8gaHosIGFyYy0+Y2hpbGRfdGltZSAvIGh6LAotCQkgIGFyYy0+Y291bnQsIGN5Y2xlX2hlYWQtPm5jYWxscyk7Ci0JICBwcmludF9uYW1lIChwYXJlbnQpOwotCSAgcHJpbnRmICgiXG4iKTsKLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAoc29ydF9jaGlsZHJlbiwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKLXsKLSAgQXJjICphcmMsICpkZXRhY2hlZCwgc29ydGVkLCAqcHJldjsKLSAgLyoKLSAgICogVW5saW5rIGNoaWxkcmVuIGZyb20gcGFyZW50LCB0aGVuIGluc2VydGlvbiBzb3J0IGJhY2sgb24gdG8KLSAgICogc29ydGVkJ3MgY2hpbGRyZW4uCi0gICAqICAgICAgKmFyYyAgICAgICAgdGhlIGFyYyB5b3UgaGF2ZSBkZXRhY2hlZCBhbmQgYXJlIGluc2VydGluZy4KLSAgICogICAgICAqZGV0YWNoZWQgICB0aGUgcmVzdCBvZiB0aGUgYXJjcyB0byBiZSBzb3J0ZWQuCi0gICAqICAgICAgc29ydGVkICAgICAgYXJjIGxpc3Qgb250byB3aGljaCB5b3UgaW5zZXJ0aW9uIHNvcnQuCi0gICAqICAgICAgKnByZXYgICAgICAgYXJjIGJlZm9yZSB0aGUgYXJjIHlvdSBhcmUgY29tcGFyaW5nLgotICAgKi8KLSAgc29ydGVkLm5leHRfY2hpbGQgPSAwOwotICBmb3IgKGFyYyA9IHBhcmVudC0+Y2cuY2hpbGRyZW47IGFyYzsgYXJjID0gZGV0YWNoZWQpCi0gICAgewotICAgICAgZGV0YWNoZWQgPSBhcmMtPm5leHRfY2hpbGQ7Ci0KLSAgICAgIC8qIGNvbnNpZGVyICphcmMgYXMgZGlzY29ubmVjdGVkOyBpbnNlcnQgaXQgaW50byBzb3J0ZWQ6ICovCi0gICAgICBmb3IgKHByZXYgPSAmc29ydGVkOyBwcmV2LT5uZXh0X2NoaWxkOyBwcmV2ID0gcHJldi0+bmV4dF9jaGlsZCkKLQl7Ci0JICBpZiAoY21wX2FyYyAoYXJjLCBwcmV2LT5uZXh0X2NoaWxkKSAhPSBMRVNTVEhBTikKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgYXJjLT5uZXh0X2NoaWxkID0gcHJldi0+bmV4dF9jaGlsZDsKLSAgICAgIHByZXYtPm5leHRfY2hpbGQgPSBhcmM7Ci0gICAgfQotCi0gIC8qIHJlYXR0YWNoIHNvcnRlZCBjaGlsZHJlbiB0byBwYXJlbnQ6ICovCi0gIHBhcmVudC0+Y2cuY2hpbGRyZW4gPSBzb3J0ZWQubmV4dF9jaGlsZDsKLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHByaW50X2NoaWxkcmVuLCAocGFyZW50KSwgU3ltICogcGFyZW50KQotewotICBTeW0gKmNoaWxkOwotICBBcmMgKmFyYzsKLQotICBzb3J0X2NoaWxkcmVuIChwYXJlbnQpOwotICBhcmMgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOwotICBmb3IgKGFyYyA9IHBhcmVudC0+Y2cuY2hpbGRyZW47IGFyYzsgYXJjID0gYXJjLT5uZXh0X2NoaWxkKQotICAgIHsKLSAgICAgIGNoaWxkID0gYXJjLT5jaGlsZDsKLSAgICAgIGlmIChjaGlsZCA9PSBwYXJlbnQgfHwgKGNoaWxkLT5jZy5jeWMubnVtICE9IDAKLQkJCSAgICAgICYmIGNoaWxkLT5jZy5jeWMubnVtID09IHBhcmVudC0+Y2cuY3ljLm51bSkpCi0JewotCSAgLyogc2VsZiBjYWxsIG9yIGNhbGwgdG8gc2libGluZzogKi8KLQkgIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAotCQkgID8gIiU2LjZzICU1LjVzICU3LjdzICUxMS4xMXMgJTdsdSAlNy43cyAgICAgIgotCQkgIDogIiU2LjZzICU1LjVzICU3LjdzICU3LjdzICU3bHUgJTcuN3MgICAgICIsCi0JCSAgIiIsICIiLCAiIiwgIiIsIGFyYy0+Y291bnQsICIiKTsKLQkgIHByaW50X25hbWUgKGNoaWxkKTsKLQkgIHByaW50ZiAoIlxuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHJlZ3VsYXIgY2hpbGQgb2YgcGFyZW50OiAqLwotCSAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0Ci0JCSAgPyAiJTYuNnMgJTUuNXMgJTcuMmYgJTExLjJmICU3bHUvJS03bHUgICAgICIKLQkJICA6ICIlNi42cyAlNS41cyAlNy4yZiAlNy4yZiAlN2x1LyUtN2x1ICAgICAiLAotCQkgICIiLCAiIiwKLQkJICBhcmMtPnRpbWUgLyBoeiwgYXJjLT5jaGlsZF90aW1lIC8gaHosCi0JCSAgYXJjLT5jb3VudCwgY2hpbGQtPmNnLmN5Yy5oZWFkLT5uY2FsbHMpOwotCSAgcHJpbnRfbmFtZSAoY2hpbGQpOwotCSAgcHJpbnRmICgiXG4iKTsKLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfbGluZSwgKG5wKSwgU3ltICogbnApCi17Ci0gIGNoYXIgYnVmW0JVRlNJWl07Ci0KLSAgc3ByaW50ZiAoYnVmLCAiWyVkXSIsIG5wLT5jZy5pbmRleCk7Ci0gIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAotCSAgPyAiJS02LjZzICU1LjFmICU3LjJmICUxMS4yZiIKLQkgIDogIiUtNi42cyAlNS4xZiAlNy4yZiAlNy4yZiIsIGJ1ZiwKLQkgIDEwMCAqIChucC0+Y2cucHJvcC5zZWxmICsgbnAtPmNnLnByb3AuY2hpbGQpIC8gcHJpbnRfdGltZSwKLQkgIG5wLT5jZy5wcm9wLnNlbGYgLyBoeiwgbnAtPmNnLnByb3AuY2hpbGQgLyBoeik7Ci0gIGlmICgobnAtPm5jYWxscyArIG5wLT5jZy5zZWxmX2NhbGxzKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAlN2x1IiwgbnAtPm5jYWxscyk7Ci0gICAgICBpZiAobnAtPmNnLnNlbGZfY2FsbHMgIT0gMCkKLQl7Ci0JICBwcmludGYgKCIrJS03bHUgIiwgbnAtPmNnLnNlbGZfY2FsbHMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCIgJTcuN3MgIiwgIiIpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCIgJTcuN3MgJTcuN3MgIiwgIiIsICIiKTsKLSAgICB9Ci0gIHByaW50X25hbWUgKG5wKTsKLSAgcHJpbnRmICgiXG4iKTsKLX0KLQotCi0vKgotICogUHJpbnQgZHluYW1pYyBjYWxsIGdyYXBoLgotICovCi12b2lkCi1ERUZVTiAoY2dfcHJpbnQsICh0aW1lc29ydHN5bSksIFN5bSAqKiB0aW1lc29ydHN5bSkKLXsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICBTeW0gKnBhcmVudDsKLQotICBpZiAocHJpbnRfZGVzY3JpcHRpb25zICYmIGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgYnNkX2NhbGxnX2JsdXJiIChzdGRvdXQpOwotICAgIH0KLQotICBwcmludF9oZWFkZXIgKCk7Ci0KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbiArIG51bV9jeWNsZXM7ICsraW5kZXgpCi0gICAgewotICAgICAgcGFyZW50ID0gdGltZXNvcnRzeW1baW5kZXhdOwotICAgICAgaWYgKChpZ25vcmVfemVyb3MgJiYgcGFyZW50LT5uY2FsbHMgPT0gMAotCSAgICYmIHBhcmVudC0+Y2cuc2VsZl9jYWxscyA9PSAwICYmIHBhcmVudC0+Y2cucHJvcC5zZWxmID09IDAKLQkgICAmJiBwYXJlbnQtPmNnLnByb3AuY2hpbGQgPT0gMCkKLQkgIHx8ICFwYXJlbnQtPmNnLnByaW50X2ZsYWcKLQkgIHx8IChsaW5lX2dyYW51bGFyaXR5ICYmICEgcGFyZW50LT5pc19mdW5jKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAoIXBhcmVudC0+bmFtZSAmJiBwYXJlbnQtPmNnLmN5Yy5udW0gIT0gMCkKLQl7Ci0JICAvKiBjeWNsZSBoZWFkZXI6ICovCi0JICBwcmludF9jeWNsZSAocGFyZW50KTsKLQkgIHByaW50X21lbWJlcnMgKHBhcmVudCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50X3BhcmVudHMgKHBhcmVudCk7Ci0JICBwcmludF9saW5lIChwYXJlbnQpOwotCSAgcHJpbnRfY2hpbGRyZW4gKHBhcmVudCk7Ci0JfQotICAgICAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0JcHJpbnRmICgiXG4iKTsKLSAgICAgIHByaW50ZiAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgICAgIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotCXByaW50ZiAoIlxuIik7Ci0gICAgfQotICBmcmVlICh0aW1lc29ydHN5bSk7Ci0gIGlmIChwcmludF9kZXNjcmlwdGlvbnMgJiYgIWJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgZnNmX2NhbGxnX2JsdXJiIChzdGRvdXQpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX25hbWUsIChsZWZ0LCByaWdodCksIGNvbnN0IFBUUiBsZWZ0IEFORCBjb25zdCBQVFIgcmlnaHQpCi17Ci0gIGNvbnN0IFN5bSAqKm5wcDEgPSAoY29uc3QgU3ltICoqKSBsZWZ0OwotICBjb25zdCBTeW0gKipucHAyID0gKGNvbnN0IFN5bSAqKikgcmlnaHQ7Ci0KLSAgcmV0dXJuIHN0cmNtcCAoKCpucHAxKS0+bmFtZSwgKCpucHAyKS0+bmFtZSk7Ci19Ci0KLQotdm9pZAotREVGVU5fVk9JRCAoY2dfcHJpbnRfaW5kZXgpCi17Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgdW5zaWduZWQgaW50IG5uYW1lcywgdG9kbywgaSwgajsKLSAgaW50IGNvbCwgc3RhcnRpbmdfY29sOwotICBTeW0gKipuYW1lX3NvcnRlZF9zeW1zLCAqc3ltOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgY2hhciBidWZbMjBdOwotICBpbnQgY29sdW1uX3dpZHRoID0gKG91dHB1dF93aWR0aCAtIDEpIC8gMzsJLyogZG9uJ3Qgd3JpdGUgaW4gbGFzdCBjb2whICovCi0gIC8qCi0gICAqIE5vdywgc29ydCByZWd1bGFyIGZ1bmN0aW9uIG5hbWUgYWxwaGFiZXRpY2FsbHkgdG8gY3JlYXRlIGFuCi0gICAqIGluZGV4OgotICAgKi8KLSAgbmFtZV9zb3J0ZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKChzeW10YWIubGVuICsgbnVtX2N5Y2xlcykgKiBzaXplb2YgKFN5bSAqKSk7Ci0gIGZvciAoaW5kZXggPSAwLCBubmFtZXMgPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47IGluZGV4KyspCi0gICAgewotICAgICAgaWYgKGlnbm9yZV96ZXJvcyAmJiBzeW10YWIuYmFzZVtpbmRleF0ubmNhbGxzID09IDAKLQkgICYmIHN5bXRhYi5iYXNlW2luZGV4XS5oaXN0LnRpbWUgPT0gMCkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBuYW1lX3NvcnRlZF9zeW1zW25uYW1lcysrXSA9ICZzeW10YWIuYmFzZVtpbmRleF07Ci0gICAgfQotICBxc29ydCAobmFtZV9zb3J0ZWRfc3ltcywgbm5hbWVzLCBzaXplb2YgKFN5bSAqKSwgY21wX25hbWUpOwotICBmb3IgKGluZGV4ID0gMSwgdG9kbyA9IG5uYW1lczsgaW5kZXggPD0gbnVtX2N5Y2xlczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBuYW1lX3NvcnRlZF9zeW1zW3RvZG8rK10gPSAmY3ljbGVfaGVhZGVyW2luZGV4XTsKLSAgICB9Ci0gIHByaW50ZiAoIlxmXG4iKTsKLSAgcHJpbnRmIChfKCJJbmRleCBieSBmdW5jdGlvbiBuYW1lXG5cbiIpKTsKLSAgaW5kZXggPSAodG9kbyArIDIpIC8gMzsKLSAgZm9yIChpID0gMDsgaSA8IGluZGV4OyBpKyspCi0gICAgewotICAgICAgY29sID0gMDsKLSAgICAgIHN0YXJ0aW5nX2NvbCA9IDA7Ci0gICAgICBmb3IgKGogPSBpOyBqIDwgdG9kbzsgaiArPSBpbmRleCkKLQl7Ci0JICBzeW0gPSBuYW1lX3NvcnRlZF9zeW1zW2pdOwotCSAgaWYgKHN5bS0+Y2cucHJpbnRfZmxhZykKLQkgICAgewotCSAgICAgIHNwcmludGYgKGJ1ZiwgIlslZF0iLCBzeW0tPmNnLmluZGV4KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ByaW50ZiAoYnVmLCAiKCVkKSIsIHN5bS0+Y2cuaW5kZXgpOwotCSAgICB9Ci0JICBpZiAoaiA8IG5uYW1lcykKLQkgICAgewotCSAgICAgIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotCQl7Ci0JCSAgcHJpbnRmICgiJTYuNnMgJS0xOS4xOXMiLCBidWYsIHN5bS0+bmFtZSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjb2wgKz0gc3RybGVuIChidWYpOwotCQkgIGZvciAoOyBjb2wgPCBzdGFydGluZ19jb2wgKyA1OyArK2NvbCkKLQkJICAgIHsKLQkJICAgICAgcHV0Y2hhciAoJyAnKTsKLQkJICAgIH0KLQkJICBwcmludGYgKCIgJXMgIiwgYnVmKTsKLQkJICBjb2wgKz0gcHJpbnRfbmFtZV9vbmx5IChzeW0pOwotCQkgIGlmICghbGluZV9ncmFudWxhcml0eSAmJiBzeW0tPmlzX3N0YXRpYyAmJiBzeW0tPmZpbGUpCi0JCSAgICB7Ci0JCSAgICAgIGZpbGVuYW1lID0gc3ltLT5maWxlLT5uYW1lOwotCQkgICAgICBpZiAoIXByaW50X3BhdGgpCi0JCQl7Ci0JCQkgIGZpbGVuYW1lID0gc3RycmNociAoZmlsZW5hbWUsICcvJyk7Ci0JCQkgIGlmIChmaWxlbmFtZSkKLQkJCSAgICB7Ci0JCQkgICAgICArK2ZpbGVuYW1lOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGZpbGVuYW1lID0gc3ltLT5maWxlLT5uYW1lOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgcHJpbnRmICgiICglcykiLCBmaWxlbmFtZSk7Ci0JCSAgICAgIGNvbCArPSBzdHJsZW4gKGZpbGVuYW1lKSArIDM7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0JCXsKLQkJICBwcmludGYgKCIlNi42cyAiLCBidWYpOwotCQkgIHNwcmludGYgKGJ1ZiwgXygiPGN5Y2xlICVkPiIpLCBzeW0tPmNnLmN5Yy5udW0pOwotCQkgIHByaW50ZiAoIiUtMTkuMTlzIiwgYnVmKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGNvbCArPSBzdHJsZW4gKGJ1Zik7Ci0JCSAgZm9yICg7IGNvbCA8IHN0YXJ0aW5nX2NvbCArIDU7ICsrY29sKQotCQkgICAgcHV0Y2hhciAoJyAnKTsKLQkJICBwcmludGYgKCIgJXMgIiwgYnVmKTsKLQkJICBzcHJpbnRmIChidWYsIF8oIjxjeWNsZSAlZD4iKSwgc3ltLT5jZy5jeWMubnVtKTsKLQkJICBwcmludGYgKCIlcyIsIGJ1Zik7Ci0JCSAgY29sICs9IHN0cmxlbiAoYnVmKTsKLQkJfQotCSAgICB9Ci0JICBzdGFydGluZ19jb2wgKz0gY29sdW1uX3dpZHRoOwotCX0KLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotICBmcmVlIChuYW1lX3NvcnRlZF9zeW1zKTsKLX0KLQotLyogQ29tcGFyZSB0d28gYXJjcyBiYXNlZCBvbiB0aGVpciB1c2FnZSBjb3VudHMuICBXZSB3YW50IHRvIHNvcnQKLSAgIGluIGRlc2NlbmRpbmcgb3JkZXIuICAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF9hcmNfY291bnQsIChsZWZ0LCByaWdodCksIGNvbnN0IFBUUiBsZWZ0IEFORCBjb25zdCBQVFIgcmlnaHQpCi17Ci0gIGNvbnN0IEFyYyAqKm5wcDEgPSAoY29uc3QgQXJjICoqKSBsZWZ0OwotICBjb25zdCBBcmMgKipucHAyID0gKGNvbnN0IEFyYyAqKikgcmlnaHQ7Ci0KLSAgaWYgKCgqbnBwMSktPmNvdW50ID4gKCpucHAyKS0+Y291bnQpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmICgoKm5wcDEpLT5jb3VudCA8ICgqbnBwMiktPmNvdW50KQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbXBhcmUgdHdvIGZ1bnRpb25zIGJhc2VkIG9uIHRoZWlyIHVzYWdlIGNvdW50cy4gIFdlIHdhbnQgdG8gc29ydAotICAgaW4gZGVzY2VuZGluZyBvcmRlci4gICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX2Z1bl9udXNlcywgKGxlZnQsIHJpZ2h0KSwgY29uc3QgUFRSIGxlZnQgQU5EIGNvbnN0IFBUUiByaWdodCkKLXsKLSAgY29uc3QgU3ltICoqbnBwMSA9IChjb25zdCBTeW0gKiopIGxlZnQ7Ci0gIGNvbnN0IFN5bSAqKm5wcDIgPSAoY29uc3QgU3ltICoqKSByaWdodDsKLQotICBpZiAoKCpucHAxKS0+bnVzZXMgPiAoKm5wcDIpLT5udXNlcykKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKCgqbnBwMSktPm51c2VzIDwgKCpucHAyKS0+bnVzZXMpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogUHJpbnQgYSBzdWdnZXN0ZWQgZnVuY3Rpb24gb3JkZXJpbmcgYmFzZWQgb24gdGhlIHByb2ZpbGluZyBkYXRhLgotCi0gICBXZSBwZXJmb3JtIDQgbWFqb3Igc3RlcHMgd2hlbiBvcmRlcmluZyBmdW5jdGlvbnM6Ci0KLQkqIEdyb3VwIHVudXNlZCBmdW5jdGlvbnMgdG9nZXRoZXIgYW5kIHBsYWNlIHRoZW0gYXQgdGhlCi0JZW5kIG9mIHRoZSBmdW5jdGlvbiBvcmRlci4KLQotCSogU2VhcmNoIHRoZSBoaWdoZXN0IHVzZSBhcmNzICh0aG9zZSB3aGljaCBhY2NvdW50IGZvciA5MCUgb2YKLQl0aGUgdG90YWwgYXJjIGNvdW50KSBmb3IgZnVuY3Rpb25zIHdoaWNoIGhhdmUgc2V2ZXJhbCBwYXJlbnRzLgotCi0JR3JvdXAgdGhvc2Ugd2l0aCB0aGUgbW9zdCBjYWxsIHNpdGVzIHRvZ2V0aGVyIChjdXJyZW50bHkgdGhlCi0JdG9wIDEuMjUlIHdoaWNoIGhhdmUgYXQgbGVhc3QgZml2ZSBkaWZmZXJlbnQgY2FsbCBzaXRlcykuCi0KLQlUaGVzZSBhcmUgZW1pdHRlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uIG9yZGVyLgotCi0JKiBVc2UgYSBncmVlZHkgcGxhY2VtZW50IGFsZ29yaXRobSB0byBwbGFjZSBmdW5jdGlvbnMgd2hpY2gKLQlvY2N1ciBpbiB0aGUgdG9wIDk5JSBvZiB0aGUgYXJjcyBpbiB0aGUgcHJvZmlsZS4gIFNvbWUgcHJvdmlzaW9ucwotCWFyZSBtYWRlIHRvIGhhbmRsZSBoaWdoIHVzYWdlIGFyY3Mgd2hlcmUgdGhlIHBhcmVudCBhbmQvb3IKLQljaGlsZCBoYXMgYWxyZWFkeSBiZWVuIHBsYWNlZC4KLQotCSogUnVuIHRoZSBzYW1lIGdyZWVkeSBwbGFjZW1lbnQgYWxnb3JpdGhtIG9uIHRoZSByZW1haW5pbmcKLQlhcmNzIHRvIHBsYWNlIHRoZSBsZWZ0b3ZlciBmdW5jdGlvbnMuCi0KLQotICAgVGhlIHZhcmlvdXMgIm1hZ2ljIG51bWJlcnMiIHNob3VsZCAob25lIGRheSkgYmUgdHVuZWFibGUgYnkgY29tbWFuZAotICAgbGluZSBvcHRpb25zLiAgVGhleSB3ZXJlIGFycml2ZWQgYXQgYnkgYmVuY2htYXJraW5nIGEgZmV3IGFwcGxpY2F0aW9ucwotICAgd2l0aCB2YXJpb3VzIHZhbHVlcyB0byBzZWUgd2hpY2ggdmFsdWVzIHByb2R1Y2VkIGJldHRlciBvdmVyYWxsIGZ1bmN0aW9uCi0gICBvcmRlcmluZ3MuCi0KLSAgIE9mIGNvdXJzZSwgcHJvZmlsaW5nIGVycm9ycywgbWFjaGluZSBsaW1pdGF0aW9ucyAoUEEgbG9uZyBjYWxscyksIGFuZAotICAgcG9vciBjdXRvZmYgdmFsdWVzIGZvciB0aGUgcGxhY2VtZW50IGFsZ29yaXRobSBtYXkgbGltaXQgdGhlIHVzZWZ1bGxuZXNzCi0gICBvZiB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIG9yZGVyLiAgSW1wcm92ZW1lbnRzIHdvdWxkIGJlIGdyZWF0bHkgYXBwcmVjaWF0ZWQuCi0gICAKLSAgIFN1Z2dlc3Rpb25zOgotCi0JKiBQbGFjZSB0aGUgZnVuY3Rpb25zIHdpdGggbWFueSBjYWxsZXJzIG5lYXIgdGhlIG1pZGRsZSBvZiB0aGUKLQlsaXN0IHRvIHJlZHVjZSBsb25nIGNhbGxzLgotCi0JKiBQcm9wYWdhdGUgYXJjIHVzYWdlIGNoYW5nZXMgYXMgZnVuY3Rpb25zIGFyZSBwbGFjZWQuICBJZSBpZgotCWZ1bmMxIGFuZCBmdW5jMiBhcmUgcGxhY2VkIHRvZ2V0aGVyLCBhcmNzIHRvL2Zyb20gdGhvc2UgYXJjcwotCXRvIHRoZSBzYW1lIHBhcmVudC9jaGlsZCBzaG91bGQgYmUgY29tYmluZWQsIHRoZW4gcmVzb3J0IHRoZQotCWFyY3MgdG8gY2hvb3NlIHRoZSBuZXh0IG9uZS4KLQotCSogSW1wbGVtZW50IHNvbWUgZ2xvYmFsIHBvc2l0aW9uaW5nIGFsZ29yaXRobSB0byBwbGFjZSB0aGUKLQljaGFpbnMgbWFkZSBieSB0aGUgZ3JlZWR5IGxvY2FsIHBvc2l0aW9uaW5nIGFsZ29yaXRobS4gIFByb2JhYmx5Ci0JYnkgZXhhbWluaW5nIGFyY3Mgd2hpY2ggaGF2ZW4ndCBiZWVuIHBsYWNlZCB5ZXQgdG8gdGllIHR3bwotCWNoYWlucyB0b2dldGhlci4KLQotCSogVGFrZSBhIGZ1bmN0aW9uJ3Mgc2l6ZSBhbmQgdGltZSBpbnRvIGFjY291bnQgaW4gdGhlIGFsZ29yaXRobTsKLQlzaXplIGluIHBhcnRpY3VsYXIgaXMgaW1wb3J0YW50IG9uIHRoZSBQQSAobG9uZyBjYWxscykuICBQbGFjaW5nCi0JbWFueSBzbWFsbCBmdW5jdGlvbnMgb250byB0aGVpciBvd24gcGFnZSBtYXkgYmUgd2lzZS4KLQotCSogVXNlIGJldHRlciBwcm9maWxpbmcgaW5mb3JtYXRpb247IG1hbnkgcHVibGlzaGVkIGFsZ29yaXRobXMKLQlhcmUgYmFzZWQgb24gY2FsbCBzZXF1ZW5jZXMgdGhyb3VnaCB0aW1lLCByYXRoZXIgdGhhbiBqdXN0Ci0JYXJjIGNvdW50cy4KLQotCSogUHJvZGVjdXJlIGNsb25pbmcgY291bGQgaW1wcm92ZSBwZXJmb3JtYW5jZSB3aGVuIGEgc21hbGwgbnVtYmVyCi0Jb2YgYXJjcyBhY2NvdW50IGZvciBtb3N0IG9mIHRoZSBjYWxscyB0byBhIHBhcnRpY3VsYXIgZnVuY3Rpb24uCi0KLQkqIFVzZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGF2b2lkIG1vdmluZyB1bnVzZWQgZnVuY3Rpb25zCi0JY29tcGxldGVseSBvdXQgb2YgdGhlIGNvZGUgc3RyZWFtOyB0aGlzIHdvdWxkIGF2b2lkIHNldmVyZSBsb3NzYWdlCi0Jd2hlbiB0aGUgcHJvZmlsZSBkYXRhIGJlYXJzIGxpdHRsZSByZXNlbWJsYW5jZSB0byBhY3R1YWwgcnVucy4KLQotCSogUHJvcGFnYXRpb24gb2YgYXJjIHVzYWdlcyBzaG91bGQgYWxzbyBpbXByb3ZlIC5vIGxpbmsgbGluZQotCW9yZGVyaW5nIHdoaWNoIHNoYXJlcyB0aGUgc2FtZSBhcmMgcGxhY2VtZW50IGFsZ29yaXRobSB3aXRoCi0JdGhlIGZ1bmN0aW9uIG9yZGVyaW5nIGNvZGUgKGluIGZhY3QgaXQgaXMgYSBkZWdlbmVyYXRlIGNhc2UKLQlvZiBmdW5jdGlvbiBvcmRlcmluZykuICAqLwotCQotdm9pZAotREVGVU5fVk9JRCAoY2dfcHJpbnRfZnVuY3Rpb25fb3JkZXJpbmcpCi17Ci0gIHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVzZWQsIHVudXNlZCwgc2NyYXRjaF9pbmRleDsKLSAgdW5zaWduZWQgbG9uZyAgdW5wbGFjZWRfYXJjX2NvdW50LCBoaWdoX2FyY19jb3VudCwgc2NyYXRjaF9hcmNfY291bnQ7Ci0jaWZkZWYgX19HTlVDX18KLSAgdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsX2FyY3MsIHRtcF9hcmNzX2NvdW50OwotI2Vsc2UKLSAgdW5zaWduZWQgbG9uZyB0b3RhbF9hcmNzLCB0bXBfYXJjc19jb3VudDsKLSNlbmRpZgotICBTeW0gKip1bnVzZWRfc3ltcywgKip1c2VkX3N5bXMsICoqc2NyYXRjaF9zeW1zOwotICBBcmMgKip1bnBsYWNlZF9hcmNzLCAqKmhpZ2hfYXJjcywgKipzY3JhdGNoX2FyY3M7Ci0KLSAgaW5kZXggPSAwOwotICB1c2VkID0gMDsKLSAgdW51c2VkID0gMDsKLSAgc2NyYXRjaF9pbmRleCA9IDA7Ci0gIHVucGxhY2VkX2FyY19jb3VudCA9IDA7Ci0gIGhpZ2hfYXJjX2NvdW50ID0gMDsKLSAgc2NyYXRjaF9hcmNfY291bnQgPSAwOwotCi0gIC8qIEZpcnN0IGdyb3VwIGFsbCB0aGUgdW51c2VkIGZ1bmN0aW9ucyB0b2dldGhlci4gICovCi0gIHVudXNlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltICopKTsKLSAgdXNlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltICopKTsKLSAgc2NyYXRjaF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltICopKTsKLSAgaGlnaF9hcmNzID0gKEFyYyAqKikgeG1hbGxvYyAobnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLSAgc2NyYXRjaF9hcmNzID0gKEFyYyAqKikgeG1hbGxvYyAobnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLSAgdW5wbGFjZWRfYXJjcyA9IChBcmMgKiopIHhtYWxsb2MgKG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7Ci0KLSAgLyogV2FsayB0aHJvdWdoIGFsbCB0aGUgZnVuY3Rpb25zOyBtYXJrIHRob3NlIHdoaWNoIGFyZSBuZXZlcgotICAgICBjYWxsZWQgYXMgcGxhY2VkICh3ZSdsbCBlbWl0IHRoZW0gYXMgYSBncm91cCBsYXRlcikuICAqLwotICBmb3IgKGluZGV4ID0gMCwgdXNlZCA9IDAsIHVudXNlZCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoc3ltdGFiLmJhc2VbaW5kZXhdLm5jYWxscyA9PSAwKQotCXsKLQkgIC8qIEZpbHRlciBvdXQgZ3Byb2YgZ2VuZXJhdGVkIG5hbWVzLiAgKi8KLQkgIGlmIChzdHJjbXAgKHN5bXRhYi5iYXNlW2luZGV4XS5uYW1lLCAiPGxvY29yZT4iKQotCSAgICAgICYmIHN0cmNtcCAoc3ltdGFiLmJhc2VbaW5kZXhdLm5hbWUsICI8aGljb3JlPiIpKQotCSAgICB7Ci0JICAgICAgdW51c2VkX3N5bXNbdW51c2VkKytdID0gJnN5bXRhYi5iYXNlW2luZGV4XTsKLQkgICAgICBzeW10YWIuYmFzZVtpbmRleF0uaGFzX2JlZW5fcGxhY2VkID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1c2VkX3N5bXNbdXNlZCsrXSA9ICZzeW10YWIuYmFzZVtpbmRleF07Ci0JICBzeW10YWIuYmFzZVtpbmRleF0uaGFzX2JlZW5fcGxhY2VkID0gMDsKLQkgIHN5bXRhYi5iYXNlW2luZGV4XS5uZXh0ID0gMDsKLQkgIHN5bXRhYi5iYXNlW2luZGV4XS5wcmV2ID0gMDsKLQkgIHN5bXRhYi5iYXNlW2luZGV4XS5udXNlcyA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBTb3J0IHRoZSBhcmNzIGZyb20gbW9zdCB1c2VkIHRvIGxlYXN0IHVzZWQuICAqLwotICBxc29ydCAoYXJjcywgbnVtYXJjcywgc2l6ZW9mIChBcmMgKiksIGNtcF9hcmNfY291bnQpOwotCi0gIC8qIENvbXB1dGUgdGhlIHRvdGFsIGFyYyBjb3VudC4gIEFsc28gbWFyayBhcmNzIGFzIHVucGxhY2VkLgotCi0gICAgIE5vdGUgd2UgZG9uJ3QgY29tcGVuc2F0ZSBmb3Igb3ZlcmZsb3cgaWYgdGhhdCBoYXBwZW5zIQotICAgICBPdmVyZmxvdyBpcyBtdWNoIGxlc3MgbGlrZWx5IHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkCi0gICAgIHdpdGggR0NDIGFzIGl0IGNhbiBkb3VibGUtd2lkZSBpbnRlZ2VycyB2aWEgbG9uZyBsb25nLiAgKi8KLSAgdG90YWxfYXJjcyA9IDA7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWFyY3M7IGluZGV4KyspCi0gICAgewotICAgICAgdG90YWxfYXJjcyArPSBhcmNzW2luZGV4XS0+Y291bnQ7Ci0gICAgICBhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkID0gMDsKLSAgICB9Ci0KLSAgLyogV2Ugd2FudCB0byBwdWxsIG91dCB0aG9zZSBmdW5jdGlvbnMgd2hpY2ggYXJlIHJlZmVyZW5jZWQKLSAgICAgYnkgbWFueSBoaWdobHkgdXNlZCBhcmNzIGFuZCBlbWl0IHRoZW0gYXMgYSBncm91cC4gIFRoaXMKLSAgICAgY291bGQgcHJvYmFibHkgdXNlIHNvbWUgdHVuaW5nLiAgKi8KLSAgdG1wX2FyY3NfY291bnQgPSAwOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIHRtcF9hcmNzX2NvdW50ICs9IGFyY3NbaW5kZXhdLT5jb3VudDsKLQotICAgICAgLyogQ291bnQgaG93IG1hbnkgdGltZXMgZWFjaCBwYXJlbnQgYW5kIGNoaWxkIGFyZSB1c2VkIHVwCi0JIHRvIG91ciB0aHJlc2hob2xkIG9mIGFyY3MgKDkwJSkuICAqLwotICAgICAgaWYgKChkb3VibGUpdG1wX2FyY3NfY291bnQgLyAoZG91YmxlKXRvdGFsX2FyY3MgPiAwLjkwKQotCWJyZWFrOwotCi0gICAgICBhcmNzW2luZGV4XS0+Y2hpbGQtPm51c2VzKys7Ci0gICAgfQotCi0gIC8qIE5vdyBzb3J0IGEgdGVtcG9yYXJ5IHN5bWJvbCB0YWJsZSBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mCi0gICAgIHRpbWVzIGVhY2ggZnVuY3Rpb24gd2FzIHVzZWQgaW4gdGhlIGhpZ2hlc3QgdXNlZCBhcmNzLiAgKi8KLSAgbWVtY3B5IChzY3JhdGNoX3N5bXMsIHVzZWRfc3ltcywgdXNlZCAqIHNpemVvZiAoU3ltICopKTsKLSAgcXNvcnQgKHNjcmF0Y2hfc3ltcywgdXNlZCwgc2l6ZW9mIChTeW0gKiksIGNtcF9mdW5fbnVzZXMpOwotCi0gIC8qIE5vdyBwaWNrIG91dCB0aG9zZSBzeW1ib2xzIHdlJ3JlIGdvaW5nIHRvIGVtaXQgYXMKLSAgICAgYSBncm91cC4gIFdlIHRha2UgdXAgdG8gMS4yNSUgb2YgdGhlIHVzZWQgc3ltYm9scy4gICovCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHVzZWQgLyA4MDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBTeW0gKnN5bSA9IHNjcmF0Y2hfc3ltc1tpbmRleF07Ci0gICAgICBBcmMgKmFyYzsKLQotICAgICAgLyogSWYgd2UgaGl0IHN5bWJvbHMgdGhhdCBhcmVuJ3QgdXNlZCBmcm9tIG1hbnkgY2FsbCBzaXRlcywKLQkgdGhlbiB3ZSBjYW4gcXVpdC4gIFdlIGNob29zZSBmaXZlIGFzIHRoZSBsb3cgbGltaXQgZm9yCi0JIG5vIHBhcnRpY3VsYXIgcmVhc29uLiAgKi8KLSAgICAgIGlmIChzeW0tPm51c2VzID09IDUpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFdlJ3JlIGdvaW5nIHRvIG5lZWQgdGhlIGFyY3MgYmV0d2VlbiB0aGVzZSBmdW5jdGlvbnMuCi0JIFVuZm9ydHVuYXRlbHksIHdlIGRvbid0IGtub3cgYWxsIHRoZXNlIGZ1bmN0aW9ucwotCSB1bnRpbCB3ZSdyZSBkb25lLiAgU28gd2Uga2VlcCB0cmFjayBvZiBhbGwgdGhlIGFyY3MKLQkgdG8gdGhlIGZ1bmN0aW9ucyB3ZSBjYXJlIGFib3V0LCB0aGVuIHBydW5lIG91dCB0aG9zZQotCSB3aGljaCBhcmUgdW5pbnRlcmVzdGluZy4gCi0KLQkgQW4gaW50ZXJlc3RpbmcgdmFyaWF0aW9uIHdvdWxkIGJlIHRvIHF1aXQgd2hlbiB3ZSBmb3VuZAotCSBtdWx0aS1jYWxsIHNpdGUgZnVuY3Rpb25zIHdoaWNoIGFjY291bnQgZm9yIHNvbWUgcGVyY2VudGFnZQotCSBvZiB0aGUgYXJjcy4gICovCi0KLSAgICAgIGFyYyA9IHN5bS0+Y2cuY2hpbGRyZW47Ci0gICAgICB3aGlsZSAoYXJjKQotCXsKLQkgIGlmIChhcmMtPnBhcmVudCAhPSBhcmMtPmNoaWxkKQotCSAgICBzY3JhdGNoX2FyY3Nbc2NyYXRjaF9hcmNfY291bnQrK10gPSBhcmM7Ci0JICBhcmMtPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JICBhcmMgPSBhcmMtPm5leHRfY2hpbGQ7Ci0JfQotCi0gICAgICBhcmMgPSBzeW0tPmNnLnBhcmVudHM7Ci0gICAgICB3aGlsZSAoYXJjKQotCXsKLQkgIGlmIChhcmMtPnBhcmVudCAhPSBhcmMtPmNoaWxkKQotCSAgICBzY3JhdGNoX2FyY3Nbc2NyYXRjaF9hcmNfY291bnQrK10gPSBhcmM7Ci0JICBhcmMtPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JICBhcmMgPSBhcmMtPm5leHRfcGFyZW50OwotCX0KLQotICAgICAgLyogS2VlcCB0cmFjayBvZiBob3cgbWFueSBzeW1ib2xzIHdlJ3JlIGdvaW5nIHRvIHBsYWNlLiAgKi8KLSAgICAgIHNjcmF0Y2hfaW5kZXggPSBpbmRleDsKLQotICAgICAgLyogQSBsaWUsIGJ1dCBpdCBtYWtlcyBpZGVudGlmeWluZyB0aGVzZSBmdW5jdGlvbnMgZWFzaWVyCi0JIGxhdGVyLiAgKi8KLSAgICAgIHN5bS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLSAgICB9Ci0KLSAgLyogTm93IHdhbGsgdGhyb3VnaCB0aGUgdGVtcG9yYXJ5IGFyY3MgYW5kIGNvcHkgdGhvc2Ugd2UgY2FyZSBhYm91dAotICAgICBpbnRvIHRoZSBoaWdoIGFyY3MgYXJyYXkuICAqLwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzY3JhdGNoX2FyY19jb3VudDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBBcmMgKmFyYyA9IHNjcmF0Y2hfYXJjc1tpbmRleF07Ci0KLSAgICAgIC8qIElmIHRoaXMgYXJjIHJlZmVycyB0byBoaWdobHkgdXNlZCBmdW5jdGlvbnMsIHRoZW4KLQkgdGhlbiB3ZSB3YW50IHRvIGtlZXAgaXQuICAqLwotICAgICAgaWYgKGFyYy0+Y2hpbGQtPmhhc19iZWVuX3BsYWNlZAotCSAgJiYgYXJjLT5wYXJlbnQtPmhhc19iZWVuX3BsYWNlZCkKLQl7Ci0JICBoaWdoX2FyY3NbaGlnaF9hcmNfY291bnQrK10gPSBzY3JhdGNoX2FyY3NbaW5kZXhdOwotCi0JICAvKiBXZSBuZWVkIHRvIHR1cm4gb2YgaGFzX2JlZW5fcGxhY2VkIHNpbmNlIHdlJ3JlIGdvaW5nIHRvCi0JICAgICB1c2UgdGhlIG1haW4gYXJjIHBsYWNlbWVudCBhbGdvcml0aG0gb24gdGhlc2UgYXJjcy4gICovCi0JICBhcmMtPmNoaWxkLT5oYXNfYmVlbl9wbGFjZWQgPSAwOwotCSAgYXJjLT5wYXJlbnQtPmhhc19iZWVuX3BsYWNlZCA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBEdW1wIHRoZSBtdWx0aS1zaXRlIGhpZ2ggdXNhZ2UgZnVuY3Rpb25zIHdoaWNoIGFyZSBub3QgZ29pbmcKLSAgICAgdG8gYmUgb3JkZXJlZCBieSB0aGUgbWFpbiBvcmRlcmluZyBhbGdvcml0aG0uICAqLwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzY3JhdGNoX2luZGV4OyBpbmRleCsrKQotICAgIHsKLSAgICAgIGlmIChzY3JhdGNoX3N5bXNbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQpCi0JcHJpbnRmICgiJXNcbiIsIHNjcmF0Y2hfc3ltc1tpbmRleF0tPm5hbWUpOwotICAgIH0KLQotICAvKiBOb3cgd2UgY2FuIG9yZGVyIHRoZSBtdWx0aS1zaXRlIGhpZ2ggdXNlIGZ1bmN0aW9ucyBiYXNlZCBvbiB0aGUKLSAgICAgYXJjcyBiZXR3ZWVuIHRoZW0uICAqLwotICBxc29ydCAoaGlnaF9hcmNzLCBoaWdoX2FyY19jb3VudCwgc2l6ZW9mIChBcmMgKiksIGNtcF9hcmNfY291bnQpOwotICBvcmRlcl9hbmRfZHVtcF9mdW5jdGlvbnNfYnlfYXJjcyAoaGlnaF9hcmNzLCBoaWdoX2FyY19jb3VudCwgMSwKLQkJCQkgICAgdW5wbGFjZWRfYXJjcywgJnVucGxhY2VkX2FyY19jb3VudCk7Ci0KLSAgLyogT3JkZXIgYW5kIGR1bXAgdGhlIGhpZ2ggdXNlIGZ1bmN0aW9ucyBsZWZ0LCB0aGVzZSB0eXBpY2FsbHkKLSAgICAgaGF2ZSBvbmx5IGEgZmV3IGNhbGwgc2l0ZXMuICAqLwotICBvcmRlcl9hbmRfZHVtcF9mdW5jdGlvbnNfYnlfYXJjcyAoYXJjcywgbnVtYXJjcywgMCwKLQkJCQkgICAgdW5wbGFjZWRfYXJjcywgJnVucGxhY2VkX2FyY19jb3VudCk7Ci0KLSAgLyogTm93IHBsYWNlIHRoZSByYXJlbHkgdXNlZCBmdW5jdGlvbnMuICAqLwotICBvcmRlcl9hbmRfZHVtcF9mdW5jdGlvbnNfYnlfYXJjcyAodW5wbGFjZWRfYXJjcywgdW5wbGFjZWRfYXJjX2NvdW50LCAxLAotCQkJCSAgICBzY3JhdGNoX2FyY3MsICZzY3JhdGNoX2FyY19jb3VudCk7Ci0KLSAgLyogT3V0cHV0IGFueSBmdW5jdGlvbnMgbm90IGVtaXR0ZWQgYnkgdGhlIG9yZGVyX2FuZF9kdW1wIGNhbGxzLiAgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdXNlZDsgaW5kZXgrKykKLSAgICBpZiAodXNlZF9zeW1zW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkID09IDApCi0gICAgICBwcmludGYoIiVzXG4iLCB1c2VkX3N5bXNbaW5kZXhdLT5uYW1lKTsKLQotICAvKiBPdXRwdXQgdGhlIHVudXNlZCBmdW5jdGlvbnMuICAqLwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB1bnVzZWQ7IGluZGV4KyspCi0gICAgcHJpbnRmKCIlc1xuIiwgdW51c2VkX3N5bXNbaW5kZXhdLT5uYW1lKTsKLQotICB1bnVzZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7Ci0gIHVzZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7Ci0gIHNjcmF0Y2hfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7Ci0gIGhpZ2hfYXJjcyA9IChBcmMgKiopIHhtYWxsb2MgKG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7Ci0gIHNjcmF0Y2hfYXJjcyA9IChBcmMgKiopIHhtYWxsb2MgKG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7Ci0gIHVucGxhY2VkX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotCi0gIGZyZWUgKHVudXNlZF9zeW1zKTsKLSAgZnJlZSAodXNlZF9zeW1zKTsKLSAgZnJlZSAoc2NyYXRjaF9zeW1zKTsKLSAgZnJlZSAoaGlnaF9hcmNzKTsKLSAgZnJlZSAoc2NyYXRjaF9hcmNzKTsKLSAgZnJlZSAodW5wbGFjZWRfYXJjcyk7Ci19Ci0KLS8qIFBsYWNlIGZ1bmN0aW9ucyBiYXNlZCBvbiB0aGUgYXJjcyBpbiBBUkNTIHdpdGggTlVNQVJDUyBlbnRyaWVzOwotICAgcGxhY2UgdW51c2VkIGFyY3MgaW50byBVTlBMQUNFRF9BUkNTL1VOUExBQ0VEX0FSQ19DT1VOVC4KLQotICAgSWYgQUxMIGlzIG5vbnplcm8sIHRoZW4gcGxhY2UgYWxsIGZ1bmN0aW9ucyByZWZlcmVuY2VkIGJ5IEFSQ1MsCi0gICBlbHNlIG9ubHkgcGxhY2UgdGhvc2UgcmVmZXJlbmNlZCBpbiB0aGUgdG9wIDk5JSBvZiB0aGUgYXJjcyBpbiBBUkNTLiAgKi8KLQotI2RlZmluZSBNT1NUIDAuOTkKLXN0YXRpYyB2b2lkCi1vcmRlcl9hbmRfZHVtcF9mdW5jdGlvbnNfYnlfYXJjcyAoYXJjcywgbnVtYXJjcywgYWxsLAotCQkJCSAgdW5wbGFjZWRfYXJjcywgdW5wbGFjZWRfYXJjX2NvdW50KQotICAgICBBcmMgKiphcmNzOwotICAgICB1bnNpZ25lZCBsb25nIG51bWFyY3M7Ci0gICAgIGludCBhbGw7Ci0gICAgIEFyYyAqKnVucGxhY2VkX2FyY3M7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnVucGxhY2VkX2FyY19jb3VudDsKLXsKLSNpZmRlZiBfX0dOVUNfXwotICB1bnNpZ25lZCBsb25nIGxvbmcgdG1wX2FyY3MsIHRvdGFsX2FyY3M7Ci0jZWxzZQotICB1bnNpZ25lZCBsb25nIHRtcF9hcmNzLCB0b3RhbF9hcmNzOwotI2VuZGlmCi0gIHVuc2lnbmVkIGludCBpbmRleDsKLQotICAvKiBJZiBuZWVkZWQsIGNvbXB1dGUgdGhlIHRvdGFsIGFyYyBjb3VudC4KLQotICAgICBOb3RlIHdlIGRvbid0IGNvbXBlbnNhdGUgZm9yIG92ZXJmbG93IGlmIHRoYXQgaGFwcGVucyEgICovCi0gIGlmICghIGFsbCkKLSAgICB7Ci0gICAgICB0b3RhbF9hcmNzID0gMDsKLSAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWFyY3M7IGluZGV4KyspCi0JdG90YWxfYXJjcyArPSBhcmNzW2luZGV4XS0+Y291bnQ7Ci0gICAgfQotICBlbHNlCi0gICAgdG90YWxfYXJjcyA9IDA7Ci0KLSAgdG1wX2FyY3MgPSAwOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIFN5bSAqc3ltMSwgKnN5bTI7Ci0gICAgICBTeW0gKmNoaWxkLCAqcGFyZW50OwotCi0gICAgICB0bXBfYXJjcyArPSBhcmNzW2luZGV4XS0+Y291bnQ7Ci0KLSAgICAgIC8qIElnbm9yZSB0aGlzIGFyYyBpZiBpdCdzIGFscmVhZHkgYmVlbiBwbGFjZWQuICAqLwotICAgICAgaWYgKGFyY3NbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQpCi0JY29udGludWU7Ci0KLSAgICAgIGNoaWxkID0gYXJjc1tpbmRleF0tPmNoaWxkOwotICAgICAgcGFyZW50ID0gYXJjc1tpbmRleF0tPnBhcmVudDsKLQotICAgICAgLyogSWYgd2UncmUgbm90IHVzaW5nIGFsbCBhcmNzLCBhbmQgdGhpcyBpcyBhIHJhcmVseSB1c2VkCi0JIGFyYywgdGhlbiBwdXQgaXQgb24gdGhlIHVucGxhY2VkX2FyYyBsaXN0LiAgU2ltaWxhcmx5Ci0JIGlmIGJvdGggdGhlIHBhcmVudCBhbmQgY2hpbGQgb2YgdGhpcyBhcmMgaGF2ZSBiZWVuIHBsYWNlZC4gICovCi0gICAgICBpZiAoKCEgYWxsICYmIChkb3VibGUpdG1wX2FyY3MgLyAoZG91YmxlKXRvdGFsX2FyY3MgPiBNT1NUKQotCSAgfHwgY2hpbGQtPmhhc19iZWVuX3BsYWNlZCB8fCBwYXJlbnQtPmhhc19iZWVuX3BsYWNlZCkKLQl7Ci0JICB1bnBsYWNlZF9hcmNzWygqdW5wbGFjZWRfYXJjX2NvdW50KSsrXSA9IGFyY3NbaW5kZXhdOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBJZiBhbGwgc2xvdHMgaW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgYXJlIGZ1bGwsIHRoZW4gdGhlcmUgaXNuJ3QKLQkgYW55dGhpbmcgd2UgY2FuIGRvIHJpZ2h0IG5vdy4gIFdlJ2xsIHBsYWNlIHRoaXMgYXJjIG9uIHRoZQotCSB1bnBsYWNlZCBhcmMgbGlzdCBpbiB0aGUgaG9wZSB0aGF0IGEgZ2xvYmFsIHBvc2l0aW9uaW5nCi0JIGFsZ29yaXRobSBjYW4gdXNlIGl0IHRvIHBsYWNlIGZ1bmN0aW9uIGNoYWlucy4gICovCi0gICAgICBpZiAocGFyZW50LT5uZXh0ICYmIHBhcmVudC0+cHJldiAmJiBjaGlsZC0+bmV4dCAmJiBjaGlsZC0+cHJldikKLQl7Ci0JICB1bnBsYWNlZF9hcmNzWygqdW5wbGFjZWRfYXJjX2NvdW50KSsrXSA9IGFyY3NbaW5kZXhdOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgcGFyZW50IGlzIHVuYXR0YWNoZWQsIHRoZW4gZmluZCB0aGUgY2xvc2VzdAotCSBwbGFjZSB0byBhdHRhY2ggaXQgb250byBjaGlsZCdzIGNoYWluLiAgIFNpbWlsYXJseQotCSBmb3IgdGhlIG9wcG9zaXRlIGNhc2UuICAqLwotICAgICAgaWYgKCFwYXJlbnQtPm5leHQgJiYgIXBhcmVudC0+cHJldikKLQl7Ci0JICBpbnQgbmV4dF9jb3VudCA9IDA7Ci0JICBpbnQgcHJldl9jb3VudCA9IDA7Ci0JICBTeW0gKnByZXYgPSBjaGlsZDsKLQkgIFN5bSAqbmV4dCA9IGNoaWxkOwotCi0JICAvKiBXYWxrIHRvIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgY2hpbGQncyBjaGFpbi4gICovCi0JICB3aGlsZSAobmV4dC0+bmV4dCkKLQkgICAgewotCSAgICAgIG5leHQgPSBuZXh0LT5uZXh0OwotCSAgICAgIG5leHRfY291bnQrKzsKLQkgICAgfQotCi0JICB3aGlsZSAocHJldi0+cHJldikKLQkgICAgewotCSAgICAgIHByZXYgPSBwcmV2LT5wcmV2OwotCSAgICAgIHByZXZfY291bnQrKzsKLQkgICAgfQotCSAgCi0JICAvKiBDaG9vc2UgdGhlIGNsb3Nlc3QuICAqLwotCSAgY2hpbGQgPSBuZXh0X2NvdW50IDwgcHJldl9jb3VudCA/IG5leHQgOiBwcmV2OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoISBjaGlsZC0+bmV4dCAmJiAhY2hpbGQtPnByZXYpCi0JewotCSAgaW50IG5leHRfY291bnQgPSAwOwotCSAgaW50IHByZXZfY291bnQgPSAwOwotCSAgU3ltICpwcmV2ID0gcGFyZW50OwotCSAgU3ltICpuZXh0ID0gcGFyZW50OwotCi0JICB3aGlsZSAobmV4dC0+bmV4dCkKLQkgICAgewotCSAgICAgIG5leHQgPSBuZXh0LT5uZXh0OwotCSAgICAgIG5leHRfY291bnQrKzsKLQkgICAgfQotCi0JICB3aGlsZSAocHJldi0+cHJldikKLQkgICAgewotCSAgICAgIHByZXYgPSBwcmV2LT5wcmV2OwotCSAgICAgIHByZXZfY291bnQrKzsKLQkgICAgfQotCi0JICBwYXJlbnQgPSBwcmV2X2NvdW50IDwgbmV4dF9jb3VudCA/IHByZXYgOiBuZXh0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDb3VsZG4ndCBmaW5kIGFueXdoZXJlIHRvIGF0dGFjaCB0aGUgZnVuY3Rpb25zLAotCSAgICAgcHV0IHRoZSBhcmMgb24gdGhlIHVucGxhY2VkIGFyYyBsaXN0LiAgKi8KLQkgIHVucGxhY2VkX2FyY3NbKCp1bnBsYWNlZF9hcmNfY291bnQpKytdID0gYXJjc1tpbmRleF07Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCB0aWUgdHdvIGVuZHMgdG9nZXRoZXIuICAqLwotICAgICAgc3ltMSA9IHBhcmVudDsKLSAgICAgIGlmIChzeW0xLT5uZXh0KQotCXdoaWxlIChzeW0xLT5uZXh0KQotCSAgc3ltMSA9IHN5bTEtPm5leHQ7Ci0gICAgICBlbHNlCi0Jd2hpbGUgKHN5bTEtPnByZXYpCi0JICBzeW0xID0gc3ltMS0+cHJldjsKLQotICAgICAgc3ltMiA9IGNoaWxkOwotICAgICAgaWYgKHN5bTItPm5leHQpCi0Jd2hpbGUgKHN5bTItPm5leHQpCi0JICBzeW0yID0gc3ltMi0+bmV4dDsKLSAgICAgIGVsc2UKLQl3aGlsZSAoc3ltMi0+cHJldikKLQkgIHN5bTIgPSBzeW0yLT5wcmV2OwotCi0gICAgICBpZiAoc3ltMSA9PSBjaGlsZAotCSAgJiYgc3ltMiA9PSBwYXJlbnQpCi0JewotCSAgLyogVGhpcyB3b3VsZCB0aWUgdHdvIGVuZHMgdG9nZXRoZXIuICAqLwotCSAgdW5wbGFjZWRfYXJjc1soKnVucGxhY2VkX2FyY19jb3VudCkrK10gPSBhcmNzW2luZGV4XTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHBhcmVudC0+bmV4dCkKLQl7Ci0JICAvKiBNdXN0IGF0dGFjaCB0byB0aGUgcGFyZW50J3MgcHJldiBmaWVsZC4gICovCi0JICBpZiAoISBjaGlsZC0+bmV4dCkKLQkgICAgewotCSAgICAgIC8qIHBhcmVudC1wcmV2IGFuZCBjaGlsZC1uZXh0ICovCi0JICAgICAgcGFyZW50LT5wcmV2ID0gY2hpbGQ7Ci0JICAgICAgY2hpbGQtPm5leHQgPSBwYXJlbnQ7Ci0JICAgICAgYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChwYXJlbnQtPnByZXYpCi0JewotCSAgLyogTXVzdCBhdHRhY2ggdG8gdGhlIHBhcmVudCdzIG5leHQgZmllbGQuICAqLwotCSAgaWYgKCEgY2hpbGQtPnByZXYpCi0JICAgIHsKLQkgICAgICAvKiBwYXJlbnQtbmV4dCBhbmQgY2hpbGQtcHJldiAqLwotCSAgICAgIHBhcmVudC0+bmV4dCA9IGNoaWxkOwotCSAgICAgIGNoaWxkLT5wcmV2ID0gcGFyZW50OwotCSAgICAgIGFyY3NbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIENhbiBhdHRhY2ggdG8gZWl0aGVyIGZpZWxkIGluIHRoZSBwYXJlbnQsIGRlcGVuZHMKLQkgICAgIG9uIHdoZXJlIHdlJ3ZlIGdvdCBzcGFjZSBpbiB0aGUgY2hpbGQuICAqLwotCSAgaWYgKGNoaWxkLT5wcmV2KQotCSAgICB7Ci0JICAgICAgLyogcGFyZW50LXByZXYgYW5kIGNoaWxkLW5leHQgKi8KLQkgICAgICBwYXJlbnQtPnByZXYgPSBjaGlsZDsKLQkgICAgICBjaGlsZC0+bmV4dCA9IHBhcmVudDsKLQkgICAgICBhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogcGFyZW50LW5leHQgYW5kIGNoaWxkLXByZXYgKi8KLQkgICAgICBwYXJlbnQtPm5leHQgPSBjaGlsZDsKLQkgICAgICBjaGlsZC0+cHJldiA9IHBhcmVudDsKLQkgICAgICBhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogRHVtcCB0aGUgY2hhaW5zIG9mIGZ1bmN0aW9ucyB3ZSd2ZSBtYWRlLiAgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBTeW0gKnN5bTsKLSAgICAgIGlmIChhcmNzW2luZGV4XS0+cGFyZW50LT5oYXNfYmVlbl9wbGFjZWQKLQkgIHx8IGFyY3NbaW5kZXhdLT5jaGlsZC0+aGFzX2JlZW5fcGxhY2VkKQotCWNvbnRpbnVlOwotCi0gICAgICBzeW0gPSBhcmNzW2luZGV4XS0+cGFyZW50OwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpc24ndCBhdHRhY2hlZCB0byBhbnkgb3RoZXIKLQkgc3ltYm9scywgdGhlbiB3ZSd2ZSBnb3QgYSByYXJlbHkgdXNlZCBhcmMuCi0KLQkgU2tpcCBpdCBmb3Igbm93LCB3ZSdsbCBkZWFsIHdpdGggdGhlbSBsYXRlci4gICovCi0gICAgICBpZiAoc3ltLT5uZXh0ID09IE5VTEwKLQkgICYmIHN5bS0+cHJldiA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgY2hhaW4uICAqLwotICAgICAgd2hpbGUgKHN5bS0+cHJldikKLQlzeW0gPSBzeW0tPnByZXY7Ci0KLSAgICAgIHdoaWxlIChzeW0pCi0JewotCSAgLyogTWFyayBpdCBhcyBwbGFjZWQuICAqLwotCSAgc3ltLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgcHJpbnRmICgiJXNcbiIsIHN5bS0+bmFtZSk7Ci0JICBzeW0gPSBzeW0tPm5leHQ7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSB3YW50IHRvIHBsYWNlIGFsbCB0aGUgYXJjcywgdGhlbiBvdXRwdXQgdGhvc2Ugd2hpY2ggd2VyZW4ndAotICAgICBwbGFjZWQgYnkgdGhlIG1haW4gYWxnb3JpdGhtLiAgKi8KLSAgaWYgKGFsbCkKLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQotICAgICAgewotCVN5bSAqc3ltOwotCWlmIChhcmNzW2luZGV4XS0+cGFyZW50LT5oYXNfYmVlbl9wbGFjZWQKLQkgICAgfHwgYXJjc1tpbmRleF0tPmNoaWxkLT5oYXNfYmVlbl9wbGFjZWQpCi0JICBjb250aW51ZTsKLQotCXN5bSA9IGFyY3NbaW5kZXhdLT5wYXJlbnQ7Ci0KLQlzeW0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JcHJpbnRmICgiJXNcbiIsIHN5bS0+bmFtZSk7Ci0gICAgICB9Ci19Ci0KLS8qIFByaW50IGEgc3VnZ2VzdGVkIC5vIG9yZGVyaW5nIGZvciBmaWxlcyBvbiBhIGxpbmsgbGluZSBiYXNlZAotICAgb24gcHJvZmlsaW5nIGluZm9ybWF0aW9uLiAgVGhpcyB1c2VzIHRoZSBmdW5jdGlvbiBwbGFjZW1lbnQKLSAgIGNvZGUgZm9yIHRoZSBidWxrIG9mIGl0cyB3b3JrLiAgKi8KLQotc3RydWN0IGZ1bmN0aW9uX21hcCB7Ci0gIGNoYXIgKmZ1bmN0aW9uX25hbWU7Ci0gIGNoYXIgKmZpbGVfbmFtZTsKLX07Ci0KLXZvaWQKLURFRlVOX1ZPSUQgKGNnX3ByaW50X2ZpbGVfb3JkZXJpbmcpCi17Ci0gIHVuc2lnbmVkIGxvbmcgc2NyYXRjaF9hcmNfY291bnQsIGluZGV4OwotICBBcmMgKipzY3JhdGNoX2FyY3M7Ci0gIGV4dGVybiBzdHJ1Y3QgZnVuY3Rpb25fbWFwICpzeW1ib2xfbWFwOwotICBleHRlcm4gdW5zaWduZWQgaW50IHN5bWJvbF9tYXBfY291bnQ7Ci0gIGNoYXIgKmxhc3Q7Ci0KLSAgc2NyYXRjaF9hcmNfY291bnQgPSAwOwotCi0gIHNjcmF0Y2hfYXJjcyA9IChBcmMgKiopIHhtYWxsb2MgKG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWFyY3M7IGluZGV4KyspCi0gICAgewotICAgICAgaWYgKCEgYXJjc1tpbmRleF0tPnBhcmVudC0+bWFwcGVkCi0JICB8fCAhIGFyY3NbaW5kZXhdLT5jaGlsZC0+bWFwcGVkKQotCWFyY3NbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotICAgIH0KLQotICBvcmRlcl9hbmRfZHVtcF9mdW5jdGlvbnNfYnlfYXJjcyAoYXJjcywgbnVtYXJjcywgMCwKLQkJCQkgICAgc2NyYXRjaF9hcmNzLCAmc2NyYXRjaF9hcmNfY291bnQpOwotCi0gIC8qIE91dHB1dCAubydzIG5vdCBoYW5kbGVkIGJ5IHRoZSBtYWluIHBsYWNlbWVudCBhbGdvcml0aG0uICAqLwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGlmIChzeW10YWIuYmFzZVtpbmRleF0ubWFwcGVkCi0JICAmJiAhIHN5bXRhYi5iYXNlW2luZGV4XS5oYXNfYmVlbl9wbGFjZWQpCi0JcHJpbnRmICgiJXNcbiIsIHN5bXRhYi5iYXNlW2luZGV4XS5uYW1lKTsKLSAgICB9Ci0KLSAgLyogTm93IG91dHB1dCBhbnkgLm8ncyB0aGF0IGRpZG4ndCBoYXZlIGFueSB0ZXh0IHN5bWJvbHMuICAqLwotICBsYXN0ID0gTlVMTDsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltYm9sX21hcF9jb3VudDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaW5kZXgyOwotCi0gICAgICAvKiBEb24ndCBib3RoZXIgc2VhcmNoaW5nIGlmIHRoaXMgc3ltYm9sIGlzIHRoZQotCSBzYW1lIGFzIHRoZSBwcmV2aW91cyBvbmUuICAqLwotICAgICAgaWYgKGxhc3QgJiYgIXN0cmNtcCAobGFzdCwgc3ltYm9sX21hcFtpbmRleF0uZmlsZV9uYW1lKSkKLQljb250aW51ZTsKLQotICAgICAgZm9yIChpbmRleDIgPSAwOyBpbmRleDIgPCBzeW10YWIubGVuOyBpbmRleDIrKykKLQl7Ci0JICBpZiAoISBzeW10YWIuYmFzZVtpbmRleDJdLm1hcHBlZCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmICghc3RyY21wIChzeW10YWIuYmFzZVtpbmRleDJdLm5hbWUsIHN5bWJvbF9tYXBbaW5kZXhdLmZpbGVfbmFtZSkpCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgLyogSWYgd2UgZGlkbid0IGZpbmQgaXQgaW4gdGhlIHN5bWJvbCB0YWJsZSwgdGhlbiBpdCBtdXN0IGJlIGEgLm8KLQkgd2l0aCBubyB0ZXh0IHN5bWJvbHMuICBPdXRwdXQgaXQgbGFzdC4gICovCi0gICAgICBpZiAoaW5kZXgyID09IHN5bXRhYi5sZW4pCi0JcHJpbnRmICgiJXNcbiIsIHN5bWJvbF9tYXBbaW5kZXhdLmZpbGVfbmFtZSk7Ci0gICAgICBsYXN0ID0gc3ltYm9sX21hcFtpbmRleF0uZmlsZV9uYW1lOwotICAgIH0gCi19CmRpZmYgLS1naXQgYS9ncHJvZi9jZ19wcmludC5oIGIvZ3Byb2YvY2dfcHJpbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyYzRhYS4uMDAwMDAwMAotLS0gYS9ncHJvZi9jZ19wcmludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI2lmbmRlZiBjZ19wcmludF9oCi0jZGVmaW5lIGNnX3ByaW50X2gKLQotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLWV4dGVybiBkb3VibGUgcHJpbnRfdGltZTsJLyogdG90YWwgb2YgdGltZSBiZWluZyBwcmludGVkICovCi0KLWV4dGVybiB2b2lkIGNnX3ByaW50IFBBUkFNUyAoKFN5bSAqKiBjZykpOwotZXh0ZXJuIHZvaWQgY2dfcHJpbnRfaW5kZXggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgY2dfcHJpbnRfZmlsZV9vcmRlcmluZyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBjZ19wcmludF9mdW5jdGlvbl9vcmRlcmluZyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZiAvKiBjZ19wcmludF9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9jb25maWd1cmUgYi9ncHJvZi9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0N2Q3MWEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDQxNCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1ncHJvZi5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYwMTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MjI6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0MDogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NzU6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzI4OiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIiQqIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgMT4mMjsgZXhpdCAxOyB9Ci0gICBmaQotCi0gICB0ZXN0ICIkMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siIDE+JjI7IGV4aXQgMTsgfQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZWNobyAiJGFjX3QiInllcyIgMT4mNgotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc4NTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi0KLVBBQ0tBR0U9Z3Byb2YKLQotVkVSU0lPTj0yLjkuNQotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0IiAxPiYyOyBleGl0IDE7IH0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLUVPRgotCi0KLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgzMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYWNsb2NhbCAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFDTE9DQUw9YWNsb2NhbAotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBQ0xPQ0FMPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhY2xvY2FsIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NDQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvY29uZiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9DT05GPWF1dG9jb25mCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9DT05GPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvY29uZiIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODU3OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b21ha2UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPTUFLRT1hdXRvbWFrZQotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPTUFLRT0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b21ha2UiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODcwOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvaGVhZGVyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0hFQURFUj1hdXRvaGVhZGVyCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9IRUFERVI9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9oZWFkZXIiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg4MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKG1ha2VpbmZvIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgTUFLRUlORk89bWFrZWluZm8KLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgTUFLRUlORk89IiRtaXNzaW5nX2Rpci9taXNzaW5nIG1ha2VpbmZvIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zaGFyZWQ9eWVzCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIG9yIC0tZGlzYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zdGF0aWMiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zdGF0aWM9eWVzCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmFzdC1pbnN0YWxsIG9yIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZmFzdF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9mYXN0X2luc3RhbGwiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk2OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTk5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDI5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTExMjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTEyMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE1NDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNTk6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNjg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE4NzogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKLSAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMzA6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI1NDogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjU3OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTEQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi10ZXN0IC16ICIkTEQiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotCi1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI5MzogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ251X2xkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2dudV9sZCIgMT4mNgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMwOTogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX05NJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maQotZmkKLQotTk09IiRhY19jdl9wYXRoX05NIgotZWNobyAiJGFjX3QiIiROTSIgMT4mNgotCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1lY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNDc6IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qIAlcKCRhY19zeW1jb2RlXCkgCSAJKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTQ6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ2NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0JICAgIGNhdCBjb25mdGVzdC5jID4mNQotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC5jID4mNQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi0KLWZpCi0KLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1lY2hvICIkYWNfdCIiJGFjX3Jlc3VsdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTUxMjogY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUyMTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTI0OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYyA+JjUKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlIiAxPiY2Ci1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1NTA6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKLXRoZW4KLSAgcm0gLWYgY29uZnRlc3RkYXRhCi0gIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCi1lbHNlCi0gIGFjX2N2X3Byb2dfTE5fUz1sbgotZmkKLWZpCi1MTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgotaWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJyNsaW5lIDE1OTIgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1OTM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYxNDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfY2NfbmVlZHNfYmVsZicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgMT4mNgotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjQ5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY4MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCIgJiYgYWNfY3ZfcHJvZ19ETExUT09MPSJmYWxzZSIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIERMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzE2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9IiR7YWNfdG9vbF9wcmVmaXh9YXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NDg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iYXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIiAmJiBhY19jdl9wcm9nX0FTPSJmYWxzZSIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBBUz0iZmFsc2UiCi1maQotZmkKLQotCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgb3IgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKLSAgbmVlZF9sb2Nrcz0kZW5hYmxldmFsCi1lbHNlCi0gIG5lZWRfbG9ja3M9eWVzCi1maQotCi0KLWlmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KLSAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi1maQotCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbGlidG9vbCBjb25maWd1cmUgZmFpbGVkIiAxPiYyOyBleGl0IDE7IH0KLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotCi0KLQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODg2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTE2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk2NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk5OTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMjAxMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwMTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA0MTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNDY6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA3NDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTE3OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTcxOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLQotQUxMX0xJTkdVQVM9Ci1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE5NDogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjE1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjMyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjQzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjQ5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjc0OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjc5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjg3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMyMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzQzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM3ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzgzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ1MzogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDYwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ2NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0OTM6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0OTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUyNjogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTMxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTYxOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU2NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTczOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU5NDogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTk5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2Mjc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjU5OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY2NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2ODk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2OTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjcxNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzQ0OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc1MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzcxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3OTY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODAxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODA2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4MzU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg2MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg4ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg5NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAzNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwNjQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDY5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDc0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzEwNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzEwOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTYxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzIyMzogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIzNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNTY6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI3NjogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjk1OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzAwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMzMDU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzIyOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzMzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM1MDogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzNTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzg1OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzOTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzk3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQyNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ1OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQ2NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDg3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTE0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU1MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTgyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTkwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzYyMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2NTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjkyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzgyOiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODEwOiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzODE1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM4MjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg4MzogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQotICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKLSAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KLWZpCi0KLSAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2Ci0gIAotCi1pZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPQotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCi1lbHNlCi0gIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJwotICBNQUlOVEFJTkVSX01PREVfRkFMU0U9Ci1maQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5MDY6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5MjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5Mzk6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzk0NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5NTE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk3MDogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk4MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7Ci0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotICBmaQotICBybSAtZiBjb25mdGVzdCoKLSAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubwotZmkKLWZpCi0KLUVYRUVYVD0iIgotdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KLWVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKLWFjX2V4ZWV4dD0kRVhFRVhUCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gZ2NvbmZpZy5oOmdjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUB0YXJnZXRAJSR0YXJnZXQlZwotcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKLXMlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKLXMlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKLXMlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBQQUNLQUdFQCUkUEFDS0FHRSVnCi1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCi1zJUBBQ0xPQ0FMQCUkQUNMT0NBTCVnCi1zJUBBVVRPQ09ORkAlJEFVVE9DT05GJWcKLXMlQEFVVE9NQUtFQCUkQVVUT01BS0UlZwotcyVAQVVUT0hFQURFUkAlJEFVVE9IRUFERVIlZwotcyVATUFLRUlORk9AJSRNQUtFSU5GTyVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBDQ0AlJENDJWcKLXMlQExEQCUkTEQlZwotcyVATk1AJSROTSVnCi1zJUBVU0VfU1lNQk9MX1VOREVSU0NPUkVAJSRVU0VfU1lNQk9MX1VOREVSU0NPUkUlZwotcyVATE5fU0AlJExOX1MlZwotcyVARExMVE9PTEAlJERMTFRPT0wlZwotcyVAQVNAJSRBUyVnCi1zJUBMSUJUT09MQCUkTElCVE9PTCVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVATUFJTlRBSU5FUl9NT0RFX1RSVUVAJSRNQUlOVEFJTkVSX01PREVfVFJVRSVnCi1zJUBNQUlOVEFJTkVSX01PREVfRkFMU0VAJSRNQUlOVEFJTkVSX01PREVfRkFMU0UlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iZ2NvbmZpZy5oOmdjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLXNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2dwcm9mL2NvbmZpZ3VyZS5pbiBiL2dwcm9mL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiMjg5Zi4uMDAwMDAwMAotLS0gYS9ncHJvZi9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChncHJvZi5jKQotCi1BQ19DQU5PTklDQUxfU1lTVEVNCi0KLUFNX0lOSVRfQVVUT01BS0UoZ3Byb2YsIDIuOS41KQotCi1BTV9QUk9HX0xJQlRPT0wKLQotZG5sIEZvciBzaW1wbGljaXR5LCB3ZSB1c2UgdGhlIEJGRCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIG1vc3QKLWRubCB0aGluZ3MuICBIb3dldmVyLCB3ZSBhbHNvIG5lZWQgb3VyIG93biBjb25maWd1cmF0aW9uIGZpbGUgZm9yCi1kbmwgdGhlIGF1dG9tYWtlIFBBQ0tBR0UgYW5kIFZFUlNJT04gbWFjcm9zLiAgV2UgZG9uJ3QgbmFtZSBpdAotZG5sIGNvbmZpZy5oLCB0byBhdm9pZCBhbnkgcG9zc2libGUgY29uZnVzaW9uIHdpdGggdGhlIGJmZCBjb25maWcuaC4KLUFNX0NPTkZJR19IRUFERVIoZ2NvbmZpZy5oOmdjb25maWcuaW4pCi0KLUFDX1BST0dfQ0MKLUFDX1BST0dfSU5TVEFMTAotCi1BQ19JU0NfUE9TSVgKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi1BTV9NQUlOVEFJTkVSX01PREUKLUFDX0VYRUVYVAotCi1BQ19PVVRQVVQoTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKLVtzZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGVdKQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29yZWZpbGUuYyBiL2dwcm9mL2NvcmVmaWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MGZjMjguLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY29yZWZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDc2NiArMCwwIEBACi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi1iZmQgKmNvcmVfYmZkOwotaW50IGNvcmVfbnVtX3N5bXM7Ci1hc3ltYm9sICoqY29yZV9zeW1zOwotYXNlY3Rpb24gKmNvcmVfdGV4dF9zZWN0OwotUFRSIGNvcmVfdGV4dF9zcGFjZTsKLQotaW50IG1pbl9pbnNuX3NpemU7Ci1pbnQgb2Zmc2V0X3RvX2NvZGU7Ci0KLS8qIEZvciBtYXBwaW5nIHN5bWJvbHMgdG8gc3BlY2lmaWMgLm8gZmlsZXMgZHVyaW5nIGZpbGUgb3JkZXJpbmcuICAqLwotc3RydWN0IGZ1bmN0aW9uX21hcCB7Ci0gIGNoYXIgKmZ1bmN0aW9uX25hbWU7Ci0gIGNoYXIgKmZpbGVfbmFtZTsKLX07Ci0KLXN0cnVjdCBmdW5jdGlvbl9tYXAgKnN5bWJvbF9tYXA7Ci11bnNpZ25lZCBpbnQgc3ltYm9sX21hcF9jb3VudDsKLQotZXh0ZXJuIHZvaWQgaTM4Nl9maW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKLWV4dGVybiB2b2lkIGFscGhhX2ZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgdmF4X2ZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgdGFob2VfZmluZF9jYWxsIFBBUkFNUyAoKFN5bSAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gdm9pZCBzcGFyY19maW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKLQotc3RhdGljIHZvaWQKLURFRlVOIChyZWFkX2Z1bmN0aW9uX21hcHBpbmdzLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgRklMRSAqZmlsZSA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKLSAgY2hhciBkdW1teVsxMDI0XTsKLSAgaW50IGNvdW50ID0gMDsKLQotICBpZiAoIWZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY291bGQgbm90IG9wZW4gJXMuXG4iKSwgd2hvYW1pLCBmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogRmlyc3QgcGFyc2UgdGhlIG1hcHBpbmcgZmlsZSBzbyB3ZSBrbm93IGhvdyBiaWcgd2UgbmVlZCB0bwotICAgICBtYWtlIG91ciB0YWJsZXMuICBXZSBhbHNvIGRvIHNvbWUgc2FuaXR5IGNoZWNrcyBhdCB0aGlzCi0gICAgIHRpbWUuICAqLwotICB3aGlsZSAoIWZlb2YgKGZpbGUpKQotICAgIHsKLSAgICAgIGludCBtYXRjaGVzOwotCi0gICAgICBtYXRjaGVzID0gZnNjYW5mIChmaWxlLCAiJVteXG46XSIsIGR1bW15KTsKLSAgICAgIGlmICghbWF0Y2hlcykKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bmFibGUgdG8gcGFyc2UgbWFwcGluZyBmaWxlICVzLlxuIiksCi0JCSAgIHdob2FtaSwgZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotCi0gICAgICAvKiBKdXN0IHNraXAgbWVzc2FnZXMgYWJvdXQgZmlsZXMgd2l0aCBubyBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICghc3RybmNtcCAoZHVtbXksICJObyBzeW1ib2xzIGluICIsIDE0KSkKLQl7Ci0JICBmc2NhbmYgKGZpbGUsICJcbiIpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBEb24ndCBjYXJlIHdoYXQgZWxzZSBpcyBvbiB0aGlzIGxpbmUgYXQgdGhpcyBwb2ludC4gICovCi0gICAgICBmc2NhbmYgKGZpbGUsICIlW15cbl1cbiIsIGR1bW15KTsKLSAgICAgIGNvdW50Kys7Ci0gICAgfQotCi0gIC8qIE5vdyB3ZSBrbm93IGhvdyBiaWcgd2UgbmVlZCB0byBtYWtlIG91ciB0YWJsZS4gICovCi0gIHN5bWJvbF9tYXAgPSAoKHN0cnVjdCBmdW5jdGlvbl9tYXAgKikKLQkJeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKHN0cnVjdCBmdW5jdGlvbl9tYXApKSk7Ci0KLSAgLyogUmV3aW5kIHRoZSBpbnB1dCBmaWxlIHNvIHdlIGNhbiByZWFkIGl0IGFnYWluLiAgKi8KLSAgcmV3aW5kIChmaWxlKTsKLQotICAvKiBSZWFkIGVhY2ggZW50cnkgYW5kIHB1dCBpdCBpbnRvIHRoZSB0YWJsZS4gICovCi0gIGNvdW50ID0gMDsKLSAgd2hpbGUgKCFmZW9mIChmaWxlKSkKLSAgICB7Ci0gICAgICBpbnQgbWF0Y2hlczsKLSAgICAgIGNoYXIgKnRtcDsKLQotICAgICAgbWF0Y2hlcyA9IGZzY2FuZiAoZmlsZSwgIiVbXlxuOl0iLCBkdW1teSk7Ci0gICAgICBpZiAoIW1hdGNoZXMpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5hYmxlIHRvIHBhcnNlIG1hcHBpbmcgZmlsZSAlcy5cbiIpLAotCQkgICB3aG9hbWksIGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLQotICAgICAgLyogSnVzdCBza2lwIG1lc3NhZ2VzIGFib3V0IGZpbGVzIHdpdGggbm8gc3ltYm9scy4gICovCi0gICAgICBpZiAoIXN0cm5jbXAgKGR1bW15LCAiTm8gc3ltYm9scyBpbiAiLCAxNCkpCi0JewotCSAgZnNjYW5mIChmaWxlLCAiXG4iKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogZHVtbXkgaGFzIHRoZSBmaWxlbmFtZSwgZ28gYWhlYWQgYW5kIGNvcHkgaXQuICAqLwotICAgICAgc3ltYm9sX21hcFtjb3VudF0uZmlsZV9uYW1lID0geG1hbGxvYyAoc3RybGVuIChkdW1teSkgKyAxKTsKLSAgICAgIHN0cmNweSAoc3ltYm9sX21hcFtjb3VudF0uZmlsZV9uYW1lLCBkdW1teSk7Ci0KLSAgICAgIC8qIE5vdyB3ZSBuZWVkIHRoZSBmdW5jdGlvbiBuYW1lLiAgKi8KLSAgICAgIGZzY2FuZiAoZmlsZSwgIiVbXlxuXVxuIiwgZHVtbXkpOwotICAgICAgdG1wID0gc3RycmNociAoZHVtbXksICcgJykgKyAxOwotICAgICAgc3ltYm9sX21hcFtjb3VudF0uZnVuY3Rpb25fbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAodG1wKSArIDEpOwotICAgICAgc3RyY3B5IChzeW1ib2xfbWFwW2NvdW50XS5mdW5jdGlvbl9uYW1lLCB0bXApOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0KLSAgLyogUmVjb3JkIHRoZSBzaXplIG9mIHRoZSBtYXAgdGFibGUgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICAqLwotICBzeW1ib2xfbWFwX2NvdW50ID0gY291bnQ7Ci19Ci0KLXZvaWQKLURFRlVOIChjb3JlX2luaXQsIChhX291dF9uYW1lKSwgY29uc3QgY2hhciAqYV9vdXRfbmFtZSkKLXsKLSAgY29yZV9iZmQgPSBiZmRfb3BlbnIgKGFfb3V0X25hbWUsIDApOwotCi0gIGlmICghY29yZV9iZmQpCi0gICAgewotICAgICAgcGVycm9yIChhX291dF9uYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBpZiAoIWJmZF9jaGVja19mb3JtYXQgKGNvcmVfYmZkLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogbm90IGluIGEub3V0IGZvcm1hdFxuIiksIHdob2FtaSwgYV9vdXRfbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogZ2V0IGNvcmUncyB0ZXh0IHNlY3Rpb246ICovCi0gIGNvcmVfdGV4dF9zZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGNvcmVfYmZkLCAiLnRleHQiKTsKLSAgaWYgKCFjb3JlX3RleHRfc2VjdCkKLSAgICB7Ci0gICAgICBjb3JlX3RleHRfc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChjb3JlX2JmZCwgIiRDT0RFJCIpOwotICAgICAgaWYgKCFjb3JlX3RleHRfc2VjdCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjYW4ndCBmaW5kIC50ZXh0IHNlY3Rpb24gaW4gJXNcbiIpLAotCQkgICB3aG9hbWksIGFfb3V0X25hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgIH0KLQotICAvKiByZWFkIGNvcmUncyBzeW1ib2wgdGFibGU6ICovCi0KLSAgLyogdGhpcyB3aWxsIHByb2JhYmx5IGdpdmUgdXMgbW9yZSB0aGFuIHdlIG5lZWQsIGJ1dCB0aGF0J3Mgb2s6ICAqLwotICBjb3JlX251bV9zeW1zID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGNvcmVfYmZkKTsKLSAgaWYgKGNvcmVfbnVtX3N5bXMgPCAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsIHdob2FtaSwgYV9vdXRfbmFtZSwKLQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGNvcmVfc3ltcyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChjb3JlX251bV9zeW1zKTsKLSAgY29yZV9udW1fc3ltcyA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChjb3JlX2JmZCwgY29yZV9zeW1zKTsKLSAgaWYgKGNvcmVfbnVtX3N5bXMgPCAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsIHdob2FtaSwgYV9vdXRfbmFtZSwKLQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIG1pbl9pbnNuX3NpemUgPSAxOwotICBvZmZzZXRfdG9fY29kZSA9IDA7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGNvcmVfYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF92YXg6Ci0gICAgY2FzZSBiZmRfYXJjaF90YWhvZToKLSAgICAgIG9mZnNldF90b19jb2RlID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKLSAgICAgIG1pbl9pbnNuX3NpemUgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChmdW5jdGlvbl9tYXBwaW5nX2ZpbGUpCi0gICAgcmVhZF9mdW5jdGlvbl9tYXBwaW5ncyAoZnVuY3Rpb25fbWFwcGluZ19maWxlKTsKLX0KLQotCi0vKgotICogUmVhZCBpbiB0aGUgdGV4dCBzcGFjZSBvZiBhbiBhLm91dCBmaWxlCi0gKi8KLXZvaWQKLURFRlVOIChjb3JlX2dldF90ZXh0X3NwYWNlLCAoY29yZV9iZmQpLCBiZmQgKiBjb3JlX2JmZCkKLXsKLSAgY29yZV90ZXh0X3NwYWNlID0gKFBUUikgbWFsbG9jIChjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplKTsKLQotICBpZiAoIWNvcmVfdGV4dF9zcGFjZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiByYW4gb3V0IHJvb20gZm9yICVsdSBieXRlcyBvZiB0ZXh0IHNwYWNlXG4iKSwKLQkgICAgICAgd2hvYW1pLCAodW5zaWduZWQgbG9uZykgY29yZV90ZXh0X3NlY3QtPl9yYXdfc2l6ZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0gIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChjb3JlX2JmZCwgY29yZV90ZXh0X3NlY3QsIGNvcmVfdGV4dF9zcGFjZSwKLQkJCQkgMCwgY29yZV90ZXh0X3NlY3QtPl9yYXdfc2l6ZSkpCi0gICAgewotICAgICAgYmZkX3BlcnJvciAoImJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyIpOwotICAgICAgZnJlZSAoY29yZV90ZXh0X3NwYWNlKTsKLSAgICAgIGNvcmVfdGV4dF9zcGFjZSA9IDA7Ci0gICAgfQotICBpZiAoIWNvcmVfdGV4dF9zcGFjZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjYW4ndCBkbyAtY1xuIiksIHdob2FtaSk7Ci0gICAgfQotfQotCi0KLXZvaWQKLURFRlVOIChmaW5kX2NhbGwsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKSwKLSAgICAgICBTeW0gKiBwYXJlbnQgQU5EIGJmZF92bWEgcF9sb3dwYyBBTkQgYmZkX3ZtYSBwX2hpZ2hwYykKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGNvcmVfYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgaTM4Nl9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgYWxwaGFfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF92YXg6Ci0gICAgICB2YXhfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIHNwYXJjX2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfdGFob2U6Ci0gICAgICB0YWhvZV9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogLWMgbm90IHN1cHBvcnRlZCBvbiBhcmNoaXRlY3R1cmUgJXNcbiIpLAotCSAgICAgICB3aG9hbWksIGJmZF9wcmludGFibGVfbmFtZShjb3JlX2JmZCkpOwotCi0gICAgICAvKiBEb24ndCBnaXZlIHRoZSBlcnJvciBtb3JlIHRoYW4gb25jZS4gICovCi0gICAgICBpZ25vcmVfZGlyZWN0X2NhbGxzID0gRkFMU0U7Ci0gICAgfQotfQotCi0vKgotICogUmV0dXJuIGNsYXNzIG9mIHN5bWJvbCBTWU0uICBUaGUgcmV0dXJuZWQgY2xhc3MgY2FuIGJlIGFueSBvZjoKLSAqICAgICAgMCAgIC0+IHN5bWJvbCBpcyBub3QgaW50ZXJlc3RpbmcgdG8gdXMKLSAqICAgICAgJ1QnIC0+IHN5bWJvbCBpcyBhIGdsb2JhbCBuYW1lCi0gKiAgICAgICd0JyAtPiBzeW1ib2wgaXMgYSBsb2NhbCAoc3RhdGljKSBuYW1lCi0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjb3JlX3N5bV9jbGFzcywgKHN5bSksIGFzeW1ib2wgKiBzeW0pCi17Ci0gIHN5bWJvbF9pbmZvIHN5bWluZm87Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNoYXIgc3ltX3ByZWZpeDsKLSAgaW50IGk7Ci0KLSAgaWYgKHN5bS0+c2VjdGlvbiA9PSBOVUxMIHx8IChzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykgIT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyoKLSAgICogTXVzdCBiZSBhIHRleHQgc3ltYm9sLCBhbmQgc3RhdGljIHRleHQgc3ltYm9scyBkb24ndCBxdWFsaWZ5IGlmCi0gICAqIGlnbm9yZV9zdGF0aWNfZnVuY3Mgc2V0LgotICAgKi8KLSAgaWYgKGlnbm9yZV9zdGF0aWNfZnVuY3MgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfTE9DQUwpKQotICAgIHsKLSAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbY29yZV9zeW1fY2xhc3NdICVzOiBub3QgYSBmdW5jdGlvblxuIiwKLQkJCSAgICAgIHN5bS0+bmFtZSkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGJmZF9nZXRfc3ltYm9sX2luZm8gKGNvcmVfYmZkLCBzeW0sICZzeW1pbmZvKTsKLSAgaSA9IHN5bWluZm8udHlwZTsKLQotICBpZiAoaSA9PSAnVCcpCi0gICAgewotICAgICAgcmV0dXJuIGk7CQkJLyogaXQncyBhIGdsb2JhbCBzeW1ib2wgKi8KLSAgICB9Ci0KLSAgaWYgKGkgPT0gJ1cnKQotICAgIHsKLSAgICAgIC8qIFRyZWF0IHdlYWsgc3ltYm9scyBhcyB0ZXh0IHN5bWJvbHMuICBGSVhNRTogYSB3ZWFrIHN5bWJvbCBtYXkKLSAgICAgICAgIGFsc28gYmUgYSBkYXRhIHN5bWJvbC4gICovCi0gICAgICByZXR1cm4gJ1QnOwotICAgIH0KLQotICBpZiAoaSAhPSAndCcpCi0gICAgewotICAgICAgLyogbm90IGEgc3RhdGljIHRleHQgc3ltYm9sICovCi0gICAgICBEQkcgKEFPVVRERUJVRywgcHJpbnRmICgiW2NvcmVfc3ltX2NsYXNzXSAlcyBpcyBvZiBjbGFzcyAlY1xuIiwKLQkJCSAgICAgIHN5bS0+bmFtZSwgaSkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIGRvIHNvbWUgbW9yZSBmaWx0ZXJpbmcgb24gc3RhdGljIGZ1bmN0aW9uLW5hbWVzOiAqLwotCi0gIGlmIChpZ25vcmVfc3RhdGljX2Z1bmNzKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgLyoKLSAgICogQ2FuJ3QgemVyby1sZW5ndGggbmFtZSBvciBmdW5ueSBjaGFyYWN0ZXJzIGluIG5hbWUsIHdoZXJlCi0gICAqIGBmdW5ueScgaW5jbHVkZXM6IGAuJyAoLm8gZmlsZSBuYW1lcykgYW5kIGAkJyAoUGFzY2FsIGxhYmVscykuCi0gICAqLwotICBpZiAoIXN5bS0+bmFtZSB8fCBzeW0tPm5hbWVbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgZm9yIChuYW1lID0gc3ltLT5uYW1lOyAqbmFtZTsgKytuYW1lKQotICAgIHsKLSAgICAgIGlmICgqbmFtZSA9PSAnLicgfHwgKm5hbWUgPT0gJyQnKQotCXsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gIC8qCi0gICAqIE9uIHN5c3RlbXMgd2hlcmUgdGhlIEMgY29tcGlsZXIgYWRkcyBhbiB1bmRlcnNjb3JlIHRvIGFsbAotICAgKiBuYW1lcywgc3RhdGljIG5hbWVzIHdpdGhvdXQgdW5kZXJzY29yZXMgc2VlbSB1c3VhbGx5IHRvIGJlCi0gICAqIGxhYmVscyBpbiBoYW5kIHdyaXR0ZW4gYXNzZW1ibGVyIGluIHRoZSBsaWJyYXJ5LiAgV2UgZG9uJ3Qgd2FudAotICAgKiB0aGVzZSBuYW1lcy4gIFRoaXMgaXMgY2VydGFpbmx5IG5lY2Vzc2FyeSBvbiBhIFNwYXJjIHJ1bm5pbmcKLSAgICogU3VuT1MgNC4xICh0cnkgcHJvZmlsaW5nIGEgcHJvZ3JhbSB0aGF0IGRvZXMgYSBsb3Qgb2YKLSAgICogZGl2aXNpb24pLiBJIGRvbid0IGtub3cgd2hldGhlciBpdCBoYXMgaGFybWZ1bCBzaWRlIGVmZmVjdHMgb24KLSAgICogb3RoZXIgc3lzdGVtcy4gIFBlcmhhcHMgaXQgc2hvdWxkIGJlIG1hZGUgY29uZmlndXJhYmxlLgotICAgKi8KLSAgc3ltX3ByZWZpeCA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoY29yZV9iZmQpOwotICBpZiAoKHN5bV9wcmVmaXggJiYgc3ltX3ByZWZpeCAhPSBzeW0tPm5hbWVbMF0pCi0gIC8qCi0gICAqIEdDQyBtYXkgYWRkIHNwZWNpYWwgc3ltYm9scyB0byBoZWxwIGdkYiBmaWd1cmUgb3V0IHRoZSBmaWxlCi0gICAqIGxhbmd1YWdlLiAgV2Ugd2FudCB0byBpZ25vcmUgdGhlc2UsIHNpbmNlIHNvbWV0aW1lcyB0aGV5IG1hc2sKLSAgICogdGhlIHJlYWwgZnVuY3Rpb24uICAoZGpAY3Ryb24pCi0gICAqLwotICAgICAgfHwgIXN0cm5jbXAgKHN5bS0+bmFtZSwgIl9fZ251X2NvbXBpbGVkIiwgMTQpCi0gICAgICB8fCAhc3RybmNtcCAoc3ltLT5uYW1lLCAiX19fZ251X2NvbXBpbGVkIiwgMTUpKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBJZiB0aGUgb2JqZWN0IGZpbGUgc3VwcG9ydHMgbWFya2luZyBvZiBmdW5jdGlvbiBzeW1ib2xzLCB0aGVuIHdlIGNhbgotICAgICB6YXAgYW55dGhpbmcgdGhhdCBkb2Vzbid0IGhhdmUgQlNGX0ZVTkNUSU9OIHNldC4gICovCi0gIGlmIChpZ25vcmVfbm9uX2Z1bmN0aW9ucyAmJiAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gJ3QnOwkJCS8qIGl0J3MgYSBzdGF0aWMgdGV4dCBzeW1ib2wgKi8KLX0KLQotCi0vKgotICogR2V0IHdoYXRldmVyIHNvdXJjZSBpbmZvIHdlIGNhbiBnZXQgcmVnYXJkaW5nIGFkZHJlc3MgQUREUjoKLSAqLwotc3RhdGljIGJvb2wKLURFRlVOIChnZXRfc3JjX2luZm8sIChhZGRyLCBmaWxlbmFtZSwgbmFtZSwgbGluZV9udW0pLAotICAgICAgIGJmZF92bWEgYWRkciBBTkQgY29uc3QgY2hhciAqKmZpbGVuYW1lIEFORCBjb25zdCBjaGFyICoqbmFtZQotICAgICAgIEFORCBpbnQgKmxpbmVfbnVtKQotewotICBjb25zdCBjaGFyICpmbmFtZSA9IDAsICpmdW5jX25hbWUgPSAwOwotICBpbnQgbCA9IDA7Ci0KLSAgaWYgKGJmZF9maW5kX25lYXJlc3RfbGluZSAoY29yZV9iZmQsIGNvcmVfdGV4dF9zZWN0LCBjb3JlX3N5bXMsCi0JCQkgICAgIGFkZHIgLSBjb3JlX3RleHRfc2VjdC0+dm1hLAotCQkJICAgICAmZm5hbWUsICZmdW5jX25hbWUsICh1bnNpZ25lZCBpbnQgKikgJmwpCi0gICAgICAmJiBmbmFtZSAmJiBmdW5jX25hbWUgJiYgbCkKLSAgICB7Ci0gICAgICBEQkcgKEFPVVRERUJVRywgcHJpbnRmICgiW2dldF9zcmNfaW5mb10gMHglbHggLT4gJXM6JWQgKCVzKVxuIiwKLQkJCSAgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyLCBmbmFtZSwgbCwgZnVuY19uYW1lKSk7Ci0gICAgICAqZmlsZW5hbWUgPSBmbmFtZTsKLSAgICAgICpuYW1lID0gZnVuY19uYW1lOwotICAgICAgKmxpbmVfbnVtID0gbDsKLSAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbZ2V0X3NyY19pbmZvXSBubyBpbmZvIGZvciAweCVseCAoJXM6JWQsJXMpXG4iLAotCQkJICAgICAgKGxvbmcpIGFkZHIsIGZuYW1lID8gZm5hbWUgOiAiPHVua25vd24+IiwgbCwKLQkJCSAgICAgIGZ1bmNfbmFtZSA/IGZ1bmNfbmFtZSA6ICI8dW5rbm93bj4iKSk7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBSZWFkIGluIHN5bWJvbCB0YWJsZSBmcm9tIGNvcmUuICBPbmUgc3ltYm9sIHBlciBmdW5jdGlvbiBpcwotICogZW50ZXJlZC4KLSAqLwotdm9pZAotY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyAoY29yZV9iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgYmZkX3ZtYSBtaW5fdm1hID0gfjAsIG1heF92bWEgPSAwOwotICBpbnQgY2xhc3M7Ci0gIGxvbmcgaSwgZm91bmQsIHNraXA7Ci0gIHVuc2lnbmVkIGludCBqOwotCi0gIC8qIHBhc3MgMSAtIGRldGVybWluZSB1cHBlciBib3VuZCBvbiBudW1iZXIgb2YgZnVuY3Rpb24gbmFtZXM6ICovCi0gIHN5bXRhYi5sZW4gPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgY29yZV9udW1fc3ltczsgKytpKQotICAgIHsKLSAgICAgIGlmICghY29yZV9zeW1fY2xhc3MgKGNvcmVfc3ltc1tpXSkpCi0JewotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgYmluYXJ5IHNlYXJjaCBvciBoYXNoZWQKLQkgc2VhcmNoLiAgR3Jvc3MuIAotCi0JIERvbid0IGNyZWF0ZSBhIHN5bXRhYiBlbnRyeSBmb3IgYSBmdW5jdGlvbiB0aGF0IGhhcwotCSBhIG1hcHBpbmcgdG8gYSBmaWxlLCB1bmxlc3MgaXQncyB0aGUgZmlyc3QgZnVuY3Rpb24KLQkgaW4gdGhlIGZpbGUuICAqLwotICAgICAgc2tpcCA9IDA7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgc3ltYm9sX21hcF9jb3VudDsgaisrKQotCWlmICghc3RyY21wIChjb3JlX3N5bXNbaV0tPm5hbWUsIHN5bWJvbF9tYXBbal0uZnVuY3Rpb25fbmFtZSkpCi0JICB7Ci0JICAgIGlmIChqID4gMCAmJiAhIHN0cmNtcCAoc3ltYm9sX21hcCBbal0uZmlsZV9uYW1lLAotCQkJIAkgICBzeW1ib2xfbWFwIFtqIC0gMV0uZmlsZV9uYW1lKSkKLQkgICAgICBza2lwID0gMTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICBpZiAoIXNraXApCi0gICAgICAgICsrc3ltdGFiLmxlbjsKLSAgICB9Ci0KLSAgaWYgKHN5bXRhYi5sZW4gPT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBmaWxlIGAlcycgaGFzIG5vIHN5bWJvbHNcbiIpLCB3aG9hbWksIGFfb3V0X25hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIC8qIHRoZSAiKyAyIiBpcyBmb3IgdGhlIHNlbnRpbmVsczogKi8KLSAgc3ltdGFiLmJhc2UgPSAoU3ltICopIHhtYWxsb2MgKChzeW10YWIubGVuICsgMikgKiBzaXplb2YgKFN5bSkpOwotCi0gIC8qIHBhc3MgMiAtIGNyZWF0ZSBzeW1ib2xzOiAqLwotCi0gIHN5bXRhYi5saW1pdCA9IHN5bXRhYi5iYXNlOwotICBmb3IgKGkgPSAwOyBpIDwgY29yZV9udW1fc3ltczsgKytpKQotICAgIHsKLSAgICAgIGNsYXNzID0gY29yZV9zeW1fY2xhc3MgKGNvcmVfc3ltc1tpXSk7Ci0gICAgICBpZiAoIWNsYXNzKQotCXsKLQkgIERCRyAoQU9VVERFQlVHLAotCSAgICAgICBwcmludGYgKCJbY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltc10gcmVqZWN0aW5nOiAweCVseCAlc1xuIiwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBjb3JlX3N5bXNbaV0tPnZhbHVlLAotCQkgICAgICAgY29yZV9zeW1zW2ldLT5uYW1lKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICAvKiBUaGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgYmluYXJ5IHNlYXJjaCBvciBoYXNoZWQKLQkgc2VhcmNoLiAgR3Jvc3MuICAgKi8KLQotICAgICAgc2tpcCA9IDA7Ci0gICAgICBmb3VuZCA9IDA7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgc3ltYm9sX21hcF9jb3VudDsgaisrKQotCWlmICghc3RyY21wIChjb3JlX3N5bXNbaV0tPm5hbWUsIHN5bWJvbF9tYXBbal0uZnVuY3Rpb25fbmFtZSkpCi0JICB7Ci0JICAgIGlmIChqID4gMCAmJiAhIHN0cmNtcCAoc3ltYm9sX21hcCBbal0uZmlsZV9uYW1lLAotCQkJIAkgICBzeW1ib2xfbWFwIFtqIC0gMV0uZmlsZV9uYW1lKSkKLQkgICAgICBza2lwID0gMTsKLQkgICAgZWxzZQotCSAgICAgIGZvdW5kID0gajsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLSAgICAgIGlmIChza2lwKQotCWNvbnRpbnVlOwotCi0gICAgICBzeW1faW5pdCAoc3ltdGFiLmxpbWl0KTsKLQotICAgICAgLyogc3ltYm9sIG9mZnNldHMgYXJlIGFsd2F5cyBzZWN0aW9uLXJlbGF0aXZlOiAqLwotCi0gICAgICBzeW10YWIubGltaXQtPmFkZHIgPSBjb3JlX3N5bXNbaV0tPnZhbHVlICsgY29yZV9zeW1zW2ldLT5zZWN0aW9uLT52bWE7Ci0gICAgICBpZiAoc3ltYm9sX21hcF9jb3VudAotCSAgJiYgIXN0cmNtcCAoY29yZV9zeW1zW2ldLT5uYW1lLCBzeW1ib2xfbWFwW2ZvdW5kXS5mdW5jdGlvbl9uYW1lKSkKLQl7Ci0JICBzeW10YWIubGltaXQtPm5hbWUgPSBzeW1ib2xfbWFwW2ZvdW5kXS5maWxlX25hbWU7Ci0JICBzeW10YWIubGltaXQtPm1hcHBlZCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bXRhYi5saW1pdC0+bmFtZSA9IGNvcmVfc3ltc1tpXS0+bmFtZTsKLQkgIHN5bXRhYi5saW1pdC0+bWFwcGVkID0gMDsKLQl9Ci0KLSAgICAgIC8qIExvb2t1cCBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIsIGlmIHdlIGNhbiAqLwotCi0gICAgICB7Ci0JY29uc3QgY2hhciAqZmlsZW5hbWUsICpmdW5jX25hbWU7Ci0JCi0JaWYgKGdldF9zcmNfaW5mbyAoc3ltdGFiLmxpbWl0LT5hZGRyLCAmZmlsZW5hbWUsICZmdW5jX25hbWUsCi0JCQkgICZzeW10YWIubGltaXQtPmxpbmVfbnVtKSkKLQkgIHsKLQkgICAgc3ltdGFiLmxpbWl0LT5maWxlID0gc291cmNlX2ZpbGVfbG9va3VwX3BhdGggKGZpbGVuYW1lKTsKLQotCSAgICAvKiBGSVhNRTogQ2hlY2tpbmcgX19vc2ZfXyBoZXJlIGRvZXMgbm90IHdvcmsgd2l0aCBhIGNyb3NzCi0gICAgICAgICAgICAgICBncHJvZi4gICovCi0jaWZkZWYgX19vc2ZfXwotCSAgICAvKgotCSAgICAgKiBTdXBwcmVzcyBzeW1ib2xzIHRoYXQgYXJlIG5vdCBmdW5jdGlvbiBuYW1lcy4gIFRoaXMgaXMKLQkgICAgICogdXNlZnVsIHRvIHN1cHByZXNzIGNvZGUtbGFiZWxzIGFuZCBhbGlhc2VzLgotCSAgICAgKgotCSAgICAgKiBUaGlzIGlzIGtub3duIHRvIGJlIHVzZWZ1bCB1bmRlciBERUMncyBPU0YvMS4gIFVuZGVyIFN1bk9TIDQueCwKLQkgICAgICogbGFiZWxzIGRvIG5vdCBhcHBlYXIgaW4gdGhlIHN5bWJvbCB0YWJsZSBpbmZvLCBzbyB0aGlzIGlzbid0Ci0JICAgICAqIG5lY2Vzc2FyeS4KLQkgICAgICovCi0KLQkgICAgaWYgKHN0cmNtcCAoc3ltdGFiLmxpbWl0LT5uYW1lLCBmdW5jX25hbWUpICE9IDApCi0JICAgICAgewotCQkvKgotCQkgKiBUaGUgc3ltYm9sJ3MgYWRkcmVzcyBtYXBzIHRvIGEgZGlmZmVyZW50IG5hbWUsIHNvCi0JCSAqIGl0IGNhbid0IGJlIGEgZnVuY3Rpb24tZW50cnkgcG9pbnQuICBUaGlzIGhhcHBlbnMKLQkJICogZm9yIGxhYmVscywgZm9yIGV4YW1wbGUuCi0JCSAqLwotCQlEQkcgKEFPVVRERUJVRywKLQkJICAgICBwcmludGYgKCJbY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltczogcmVqICVzIChtYXBzIHRvICVzKVxuIiwKLQkJCSAgICAgc3ltdGFiLmxpbWl0LT5uYW1lLCBmdW5jX25hbWUpKTsKLQkJY29udGludWU7Ci0JICAgICAgfQotI2VuZGlmCi0JICB9Ci0gICAgICB9Ci0KLSAgICAgIHN5bXRhYi5saW1pdC0+aXNfZnVuYyA9IFRSVUU7Ci0gICAgICBzeW10YWIubGltaXQtPmlzX2JiX2hlYWQgPSBUUlVFOwotICAgICAgaWYgKGNsYXNzID09ICd0JykKLQl7Ci0JICBzeW10YWIubGltaXQtPmlzX3N0YXRpYyA9IFRSVUU7Ci0JfQotCi0gICAgICBtaW5fdm1hID0gTUlOIChzeW10YWIubGltaXQtPmFkZHIsIG1pbl92bWEpOwotICAgICAgbWF4X3ZtYSA9IE1BWCAoc3ltdGFiLmxpbWl0LT5hZGRyLCBtYXhfdm1hKTsKLQotICAgICAgLyoKLSAgICAgICAqIElmIHdlIHNlZSAibWFpbiIgd2l0aG91dCBhbiBpbml0aWFsICdfJywgd2UgYXNzdW1lIG5hbWVzCi0gICAgICAgKiBhcmUgKm5vdCogcHJlZml4ZWQgYnkgJ18nLgotICAgICAgICovCi0gICAgICBpZiAoc3ltdGFiLmxpbWl0LT5uYW1lWzBdID09ICdtJyAmJiBkaXNjYXJkX3VuZGVyc2NvcmVzCi0JICAmJiBzdHJjbXAgKHN5bXRhYi5saW1pdC0+bmFtZSwgIm1haW4iKSA9PSAwKQotCXsKLQkgIGRpc2NhcmRfdW5kZXJzY29yZXMgPSAwOwotCX0KLQotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zXSAlbGQgJXMgMHglbHhcbiIsCi0JCQkgICAgICAobG9uZykgKHN5bXRhYi5saW1pdCAtIHN5bXRhYi5iYXNlKSwKLQkJCSAgICAgIHN5bXRhYi5saW1pdC0+bmFtZSwKLQkJCSAgICAgICh1bnNpZ25lZCBsb25nKSBzeW10YWIubGltaXQtPmFkZHIpKTsKLSAgICAgICsrc3ltdGFiLmxpbWl0OwotICAgIH0KLQotICAvKiBjcmVhdGUgc2VudGluZWxzOiAqLwotCi0gIHN5bV9pbml0IChzeW10YWIubGltaXQpOwotICBzeW10YWIubGltaXQtPm5hbWUgPSAiPGxvY29yZT4iOwotICBzeW10YWIubGltaXQtPmFkZHIgPSAwOwotICBzeW10YWIubGltaXQtPmVuZF9hZGRyID0gbWluX3ZtYSAtIDE7Ci0gICsrc3ltdGFiLmxpbWl0OwotCi0gIHN5bV9pbml0IChzeW10YWIubGltaXQpOwotICBzeW10YWIubGltaXQtPm5hbWUgPSAiPGhpY29yZT4iOwotICBzeW10YWIubGltaXQtPmFkZHIgPSBtYXhfdm1hICsgMTsKLSAgc3ltdGFiLmxpbWl0LT5lbmRfYWRkciA9IH4wOwotICArK3N5bXRhYi5saW1pdDsKLQotICBzeW10YWIubGVuID0gc3ltdGFiLmxpbWl0IC0gc3ltdGFiLmJhc2U7Ci0gIHN5bXRhYl9maW5hbGl6ZSAoJnN5bXRhYik7Ci19Ci0KLQotLyoKLSAqIFJlYWQgaW4gc3ltYm9sIHRhYmxlIGZyb20gY29yZS4gIE9uZSBzeW1ib2wgcGVyIGxpbmUgb2Ygc291cmNlIGNvZGUKLSAqIGlzIGVudGVyZWQuCi0gKi8KLXZvaWQKLURFRlVOIChjb3JlX2NyZWF0ZV9saW5lX3N5bXMsIChjb3JlX2JmZCksIGJmZCAqIGNvcmVfYmZkKQotewotICBjaGFyICpwcmV2X25hbWUsICpwcmV2X2ZpbGVuYW1lOwotICBpbnQgcHJldl9uYW1lX2xlbiwgcHJldl9maWxlbmFtZV9sZW47Ci0gIGJmZF92bWEgdm1hLCBtaW5fdm1hID0gfjAsIG1heF92bWEgPSAwOwotICBiZmRfdm1hIG9mZnNldDsKLSAgU3ltICpwcmV2LCBkdW1teSwgKnNlbnRpbmVsLCAqc3ltOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgaW50IHByZXZfbGluZV9udW07Ci0gIFN5bV9UYWJsZSBsdGFiOwotICAvKgotICAgKiBDcmVhdGUgc3ltYm9scyBmb3IgZnVuY3Rpb25zIGFzIHVzdWFsLiAgVGhpcyBpcyBuZWNlc3NhcnkgaW4KLSAgICogY2FzZXMgd2hlcmUgcGFydHMgb2YgYSBwcm9ncmFtIHdlcmUgbm90IGNvbXBpbGVkIHdpdGggLWcuICBGb3IKLSAgICogdGhvc2UgcGFydHMgd2Ugc3RpbGwgd2FudCB0byBnZXQgaW5mbyBhdCB0aGUgZnVuY3Rpb24gbGV2ZWw6Ci0gICAqLwotICBjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zIChjb3JlX2JmZCk7Ci0KLSAgLyogcGFzcyAxIC0gY291bnRlciBudW1iZXIgb2Ygc3ltYm9sczogKi8KLQotICAvKgotICAgKiBUbyBmaW5kIGFsbCBsaW5lIGluZm9ybWF0aW9uLCB3YWxrIHRocm91Z2ggYWxsIHBvc3NpYmxlCi0gICAqIHRleHQtc3BhY2UgYWRkcmVzc2VzIChvbmUgYnkgb25lISkgYW5kIGdldCB0aGUgZGVidWdnaW5nCi0gICAqIGluZm8gZm9yIGVhY2ggYWRkcmVzcy4gIFdoZW4gdGhlIGRlYnVnZ2luZyBpbmZvIGNoYW5nZXMsCi0gICAqIGl0IGlzIHRpbWUgdG8gY3JlYXRlIGEgbmV3IHN5bWJvbC4KLSAgICoKLSAgICogT2YgY291cnNlLCB0aGlzIGlzIHJhdGhlciBzbG93IGFuZCBpdCB3b3VsZCBiZSBiZXR0ZXIgaWYKLSAgICogYmZkIHdvdWxkIHByb3ZpZGUgYW4gaXRlcmF0b3IgZm9yIGVudW1lcmF0aW5nIGFsbCBsaW5lIGluZm9zCi0gICAqLwotICBwcmV2X25hbWVfbGVuID0gUEFUSF9NQVg7Ci0gIHByZXZfZmlsZW5hbWVfbGVuID0gUEFUSF9NQVg7Ci0gIHByZXZfbmFtZSA9IHhtYWxsb2MgKHByZXZfbmFtZV9sZW4pOwotICBwcmV2X2ZpbGVuYW1lID0geG1hbGxvYyAocHJldl9maWxlbmFtZV9sZW4pOwotICBsdGFiLmxlbiA9IDA7Ci0gIHByZXZfbGluZV9udW0gPSAwOwotICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemU7IG9mZnNldCArPSBtaW5faW5zbl9zaXplKQotICAgIHsKLSAgICAgIGludCBsZW47Ci0KLSAgICAgIHZtYSA9IGNvcmVfdGV4dF9zZWN0LT52bWEgKyBvZmZzZXQ7Ci0gICAgICBpZiAoIWdldF9zcmNfaW5mbyAodm1hLCAmZmlsZW5hbWUsICZkdW1teS5uYW1lLCAmZHVtbXkubGluZV9udW0pCi0JICB8fCAocHJldl9saW5lX251bSA9PSBkdW1teS5saW5lX251bQotCSAgICAgICYmIHByZXZfbmFtZSAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChwcmV2X25hbWUsIGR1bW15Lm5hbWUpID09IDAKLQkgICAgICAmJiBzdHJjbXAgKHByZXZfZmlsZW5hbWUsIGZpbGVuYW1lKSA9PSAwKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgICsrbHRhYi5sZW47Ci0gICAgICBwcmV2X2xpbmVfbnVtID0gZHVtbXkubGluZV9udW07Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoZHVtbXkubmFtZSk7Ci0gICAgICBpZiAobGVuID49IHByZXZfbmFtZV9sZW4pCi0JewotCSAgcHJldl9uYW1lX2xlbiA9IGxlbiArIDEwMjQ7Ci0JICBmcmVlIChwcmV2X25hbWUpOwotCSAgcHJldl9uYW1lID0geG1hbGxvYyAocHJldl9uYW1lX2xlbik7Ci0JfQotICAgICAgc3RyY3B5IChwcmV2X25hbWUsIGR1bW15Lm5hbWUpOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKGZpbGVuYW1lKTsKLSAgICAgIGlmIChsZW4gPj0gcHJldl9maWxlbmFtZV9sZW4pCi0JewotCSAgcHJldl9maWxlbmFtZV9sZW4gPSBsZW4gKyAxMDI0OwotCSAgZnJlZSAocHJldl9maWxlbmFtZSk7Ci0JICBwcmV2X2ZpbGVuYW1lID0geG1hbGxvYyAocHJldl9maWxlbmFtZV9sZW4pOwotCX0KLSAgICAgIHN0cmNweSAocHJldl9maWxlbmFtZSwgZmlsZW5hbWUpOwotCi0gICAgICBtaW5fdm1hID0gTUlOICh2bWEsIG1pbl92bWEpOwotICAgICAgbWF4X3ZtYSA9IE1BWCAodm1hLCBtYXhfdm1hKTsKLSAgICB9Ci0KLSAgZnJlZSAocHJldl9uYW1lKTsKLSAgZnJlZSAocHJldl9maWxlbmFtZSk7Ci0KLSAgLyogbWFrZSByb29tIGZvciBmdW5jdGlvbiBzeW1ib2xzLCB0b286ICovCi0gIGx0YWIubGVuICs9IHN5bXRhYi5sZW47Ci0gIGx0YWIuYmFzZSA9IChTeW0gKikgeG1hbGxvYyAobHRhYi5sZW4gKiBzaXplb2YgKFN5bSkpOwotICBsdGFiLmxpbWl0ID0gbHRhYi5iYXNlOwotCi0gIC8qIHBhc3MgMiAtIGNyZWF0ZSBzeW1ib2xzOiAqLwotCi0gIC8qIFdlIG5vdyBzZXQgaXNfc3RhdGljIGFzIHdlIGdvIGFsb25nLCByYXRoZXIgdGhhbiBieSBydW5uaW5nCi0gICAgIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBhdCB0aGUgZW5kLgotCi0gICAgIFRoZSBvbGQgd2F5IGNhbGxlZCBzeW10YWJfZmluYWxpemUgYmVmb3JlIHRoZSBpc19zdGF0aWMgcGFzcywKLSAgICAgY2F1c2luZyBhIHByb2JsZW0gc2luY2Ugc3ltdGFiX2ZpbmFsaXplIHVzZXMgaXNfc3RhdGljIGFzIHBhcnQgb2YKLSAgICAgaXRzIGFkZHJlc3MgY29uZmxpY3QgcmVzb2x1dGlvbiBhbGdvcml0aG0uICBTaW5jZSBnbG9iYWwgc3ltYm9scwotICAgICB3ZXJlIHByZWZlcmVkIG92ZXIgc3RhdGljIHN5bWJvbHMsIGFuZCBhbGwgbGluZSBzeW1ib2xzIHdlcmUKLSAgICAgZ2xvYmFsIGF0IHRoYXQgcG9pbnQsIHN0YXRpYyBmdW5jdGlvbiBuYW1lcyB0aGF0IGNvbmZsaWN0ZWQgd2l0aAotICAgICB0aGVpciBvd24gbGluZSBudW1iZXJzIChzdGF0aWMsIGJ1dCBsYWJlbGVkIGFzIGdsb2JhbCkgd2VyZQotICAgICByZWplY3RlZCBpbiBmYXZvciBvZiB0aGUgbGluZSBudW0uCi0KLSAgICAgVGhpcyB3YXMgbm90IHRoZSBkZXNpcmVkIGZ1bmN0aW9uYWxpdHkuICBXZSBhbHdheXMgd2FudCB0byBrZWVwCi0gICAgIG91ciBmdW5jdGlvbiBzeW1ib2xzIGFuZCBkaXNjYXJkIGFueSBjb25mbGljdGluZyBsaW5lIHN5bWJvbHMuCi0gICAgIFBlcmhhcHMgc3ltdGFiX2ZpbmFsaXplIHNob3VsZCBiZSBtb2RpZmllZCB0byBtYWtlIHRoaXMKLSAgICAgZGlzdGluY3Rpb24gYXMgd2VsbCwgYnV0IHRoZSBjdXJyZW50IGZpeCB3b3JrcyBhbmQgdGhlIGNvZGUgaXMgYQotICAgICBsb3QgY2xlYW5lciBub3cuICAqLwotCi0gIHByZXYgPSAwOwotICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemU7IG9mZnNldCArPSBtaW5faW5zbl9zaXplKQotICAgIHsKLSAgICAgIHN5bV9pbml0IChsdGFiLmxpbWl0KTsKLSAgICAgIGlmICghZ2V0X3NyY19pbmZvIChjb3JlX3RleHRfc2VjdC0+dm1hICsgb2Zmc2V0LCAmZmlsZW5hbWUsCi0JCQkgJmx0YWIubGltaXQtPm5hbWUsICZsdGFiLmxpbWl0LT5saW5lX251bSkKLQkgIHx8IChwcmV2ICYmIHByZXYtPmxpbmVfbnVtID09IGx0YWIubGltaXQtPmxpbmVfbnVtCi0JICAgICAgJiYgc3RyY21wIChwcmV2LT5uYW1lLCBsdGFiLmxpbWl0LT5uYW1lKSA9PSAwCi0JICAgICAgJiYgc3RyY21wIChwcmV2LT5maWxlLT5uYW1lLCBmaWxlbmFtZSkgPT0gMCkpCi0JewotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBtYWtlIG5hbWUgcG9pbnRlciBhIG1hbGxvYydlZCBzdHJpbmc6ICovCi0gICAgICBsdGFiLmxpbWl0LT5uYW1lID0geHN0cmR1cCAobHRhYi5saW1pdC0+bmFtZSk7Ci0gICAgICBsdGFiLmxpbWl0LT5maWxlID0gc291cmNlX2ZpbGVfbG9va3VwX3BhdGggKGZpbGVuYW1lKTsKLQotICAgICAgbHRhYi5saW1pdC0+YWRkciA9IGNvcmVfdGV4dF9zZWN0LT52bWEgKyBvZmZzZXQ7Ci0KLSAgICAgIC8qIFNldCBpc19zdGF0aWMgYmFzZWQgb24gdGhlIGVuY2xvc2luZyBmdW5jdGlvbiwgdXNpbmcgZWl0aGVyOgotICAgICAgICogMSkgdGhlIHByZXZpb3VzIHN5bWJvbCwgaWYgaXQncyBmcm9tIHRoZSBzYW1lIGZ1bmN0aW9uLCBvcgotICAgICAgICogMikgYSBzeW10YWIgbG9va3VwCi0gICAgICAgKi8KLQotICAgICAgaWYgKHByZXYgJiYgbHRhYi5saW1pdC0+ZmlsZSA9PSBwcmV2LT5maWxlICYmCi0JICBzdHJjbXAgKGx0YWIubGltaXQtPm5hbWUsIHByZXYtPm5hbWUpID09IDApCi0JewotCSAgbHRhYi5saW1pdC0+aXNfc3RhdGljID0gcHJldi0+aXNfc3RhdGljOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW0gPSBzeW1fbG9va3VwKCZzeW10YWIsIGx0YWIubGltaXQtPmFkZHIpOwotCSAgbHRhYi5saW1pdC0+aXNfc3RhdGljID0gc3ltLT5pc19zdGF0aWM7Ci0JfQotCi0gICAgICBwcmV2ID0gbHRhYi5saW1pdDsKLQotICAgICAgLyoKLSAgICAgICAqIElmIHdlIHNlZSAibWFpbiIgd2l0aG91dCBhbiBpbml0aWFsICdfJywgd2UgYXNzdW1lIG5hbWVzCi0gICAgICAgKiBhcmUgKm5vdCogcHJlZml4ZWQgYnkgJ18nLgotICAgICAgICovCi0gICAgICBpZiAobHRhYi5saW1pdC0+bmFtZVswXSA9PSAnbScgJiYgZGlzY2FyZF91bmRlcnNjb3JlcwotCSAgJiYgc3RyY21wIChsdGFiLmxpbWl0LT5uYW1lLCAibWFpbiIpID09IDApCi0JewotCSAgZGlzY2FyZF91bmRlcnNjb3JlcyA9IDA7Ci0JfQotCi0gICAgICBEQkcgKEFPVVRERUJVRywgcHJpbnRmICgiW2NvcmVfY3JlYXRlX2xpbmVfc3ltc10gJWx1ICVzIDB4JWx4XG4iLAotCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIChsdGFiLmxpbWl0IC0gbHRhYi5iYXNlKSwKLQkJCSAgICAgIGx0YWIubGltaXQtPm5hbWUsCi0JCQkgICAgICAodW5zaWduZWQgbG9uZykgbHRhYi5saW1pdC0+YWRkcikpOwotICAgICAgKytsdGFiLmxpbWl0OwotICAgIH0KLQotICAvKiB1cGRhdGUgc2VudGluZWxzOiAqLwotCi0gIHNlbnRpbmVsID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgMCk7Ci0gIGlmIChzdHJjbXAgKHNlbnRpbmVsLT5uYW1lLCAiPGxvY29yZT4iKSA9PSAwCi0gICAgICAmJiBtaW5fdm1hIDw9IHNlbnRpbmVsLT5lbmRfYWRkcikKLSAgICB7Ci0gICAgICBzZW50aW5lbC0+ZW5kX2FkZHIgPSBtaW5fdm1hIC0gMTsKLSAgICB9Ci0KLSAgc2VudGluZWwgPSBzeW1fbG9va3VwICgmc3ltdGFiLCB+MCk7Ci0gIGlmIChzdHJjbXAgKHNlbnRpbmVsLT5uYW1lLCAiPGhpY29yZT4iKSA9PSAwICYmIG1heF92bWEgPj0gc2VudGluZWwtPmFkZHIpCi0gICAgewotICAgICAgc2VudGluZWwtPmFkZHIgPSBtYXhfdm1hICsgMTsKLSAgICB9Ci0KLSAgLyogY29weSBpbiBmdW5jdGlvbiBzeW1ib2xzOiAqLwotICBtZW1jcHkgKGx0YWIubGltaXQsIHN5bXRhYi5iYXNlLCBzeW10YWIubGVuICogc2l6ZW9mIChTeW0pKTsKLSAgbHRhYi5saW1pdCArPSBzeW10YWIubGVuOwotCi0gIGlmICgodW5zaWduZWQgaW50KSAobHRhYi5saW1pdCAtIGx0YWIuYmFzZSkgIT0gbHRhYi5sZW4pCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICBfKCIlczogc29tZWJvZHkgbWlzY291bnRlZDogbHRhYi5sZW49JWQgaW5zdGVhZCBvZiAlbGRcbiIpLAotCSAgICAgICB3aG9hbWksIGx0YWIubGVuLCAobG9uZykgKGx0YWIubGltaXQgLSBsdGFiLmJhc2UpKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiBmaW5hbGl6ZSBsdGFiIGFuZCBtYWtlIGl0IHN5bWJvbCB0YWJsZTogKi8KLQotICBzeW10YWJfZmluYWxpemUgKCZsdGFiKTsKLSAgZnJlZSAoc3ltdGFiLmJhc2UpOwotICBzeW10YWIgPSBsdGFiOwotCi19CmRpZmYgLS1naXQgYS9ncHJvZi9jb3JlZmlsZS5oIGIvZ3Byb2YvY29yZWZpbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5NmY4NS4uMDAwMDAwMAotLS0gYS9ncHJvZi9jb3JlZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotI2lmbmRlZiBjb3JlZmlsZV9oCi0jZGVmaW5lIGNvcmVmaWxlX2gKLQotI2luY2x1ZGUgImJmZC5oIgotCi1leHRlcm4gYmZkICpjb3JlX2JmZDsJCS8qIGJmZCBmb3IgY29yZS1maWxlICovCi1leHRlcm4gaW50IGNvcmVfbnVtX3N5bXM7CS8qICMgb2YgZW50cmllcyBpbiBzeW1ib2wtdGFibGUgKi8KLWV4dGVybiBhc3ltYm9sICoqY29yZV9zeW1zOwkvKiBzeW1ib2wgdGFibGUgaW4gYS5vdXQgKi8KLWV4dGVybiBhc2VjdGlvbiAqY29yZV90ZXh0X3NlY3Q7CS8qIGNvcmUgdGV4dCBzZWN0aW9uICovCi1leHRlcm4gUFRSIGNvcmVfdGV4dF9zcGFjZTsJLyogdGV4dCBzcGFjZSBvZiBhLm91dCBpbiBjb3JlICovCi0KLWV4dGVybiBpbnQgbWluX2luc25fc2l6ZTsJLyogc2l6ZSBvZiBzbWFsbGVzdCBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMgKi8KLWV4dGVybiBpbnQgb2Zmc2V0X3RvX2NvZGU7CS8qIG9mZnNldCAoaW4gYnl0ZXMpIG9mIGNvZGUgZnJvbSBlbnRyeQotCQkJCSAgIGFkZHJlc3Mgb2Ygcm91dGluZSAqLwotCi1leHRlcm4gdm9pZCBjb3JlX2luaXQgUEFSQU1TICgoY29uc3QgY2hhciAqYV9vdXRfbmFtZSkpOwotZXh0ZXJuIHZvaWQgY29yZV9nZXRfdGV4dF9zcGFjZSBQQVJBTVMgKChiZmQgKiBjb3JlX2JmZCkpOwotZXh0ZXJuIHZvaWQgY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyBQQVJBTVMgKChiZmQgKiBjb3JlX2JmZCkpOwotZXh0ZXJuIHZvaWQgY29yZV9jcmVhdGVfbGluZV9zeW1zIFBBUkFNUyAoKGJmZCAqIGNvcmVfYmZkKSk7Ci0KLSNlbmRpZiAvKiBjb3JlZmlsZV9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9mbGF0X2JsLm0gYi9ncHJvZi9mbGF0X2JsLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjg3MWEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZmxhdF9ibC5tCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCi0gJSAgICAgICAgIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUgb2YgdGhlCi10aW1lICAgICAgIHByb2dyYW0gdXNlZCBieSB0aGlzIGZ1bmN0aW9uLgotCi1jdW11bGF0aXZlIGEgcnVubmluZyBzdW0gb2YgdGhlIG51bWJlciBvZiBzZWNvbmRzIGFjY291bnRlZAotIHNlY29uZHMgICBmb3IgYnkgdGhpcyBmdW5jdGlvbiBhbmQgdGhvc2UgbGlzdGVkIGFib3ZlIGl0LgotCi0gc2VsZiAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhY2NvdW50ZWQgZm9yIGJ5IHRoaXMKLXNlY29uZHMgICAgZnVuY3Rpb24gYWxvbmUuICBUaGlzIGlzIHRoZSBtYWpvciBzb3J0IGZvciB0aGlzCi0gICAgICAgICAgIGxpc3RpbmcuCi0KLWNhbGxzICAgICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGZ1bmN0aW9uIHdhcyBpbnZva2VkLCBpZgotICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGlzIHByb2ZpbGVkLCBlbHNlIGJsYW5rLgotIAotIHNlbGYgICAgICB0aGUgYXZlcmFnZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IGluIHRoaXMKLW1zL2NhbGwgICAgZnVuY3Rpb24gcGVyIGNhbGwsIGlmIHRoaXMgZnVuY3Rpb24gaXMgcHJvZmlsZWQsCi0JICAgZWxzZSBibGFuay4KLQotIHRvdGFsICAgICB0aGUgYXZlcmFnZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IGluIHRoaXMKLW1zL2NhbGwgICAgZnVuY3Rpb24gYW5kIGl0cyBkZXNjZW5kZW50cyBwZXIgY2FsbCwgaWYgdGhpcyAKLQkgICBmdW5jdGlvbiBpcyBwcm9maWxlZCwgZWxzZSBibGFuay4KLQotbmFtZSAgICAgICB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICBUaGlzIGlzIHRoZSBtaW5vciBzb3J0Ci0gICAgICAgICAgIGZvciB0aGlzIGxpc3RpbmcuIFRoZSBpbmRleCBzaG93cyB0aGUgbG9jYXRpb24gb2YKLQkgICB0aGUgZnVuY3Rpb24gaW4gdGhlIGdwcm9mIGxpc3RpbmcuIElmIHRoZSBpbmRleCBpcwotCSAgIGluIHBhcmVudGhlc2lzIGl0IHNob3dzIHdoZXJlIGl0IHdvdWxkIGFwcGVhciBpbgotCSAgIHRoZSBncHJvZiBsaXN0aW5nIGlmIGl0IHdlcmUgdG8gYmUgcHJpbnRlZC4KZGlmZiAtLWdpdCBhL2dwcm9mL2ZzZl9jYWxsZ19ibC5tIGIvZ3Byb2YvZnNmX2NhbGxnX2JsLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMTY4MjEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZnNmX2NhbGxnX2JsLm0KKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0KLSBUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgY2FsbCB0cmVlIG9mIHRoZSBwcm9ncmFtLCBhbmQgd2FzIHNvcnRlZCBieQotIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBzcGVudCBpbiBlYWNoIGZ1bmN0aW9uIGFuZCBpdHMgY2hpbGRyZW4uCi0KLSBFYWNoIGVudHJ5IGluIHRoaXMgdGFibGUgY29uc2lzdHMgb2Ygc2V2ZXJhbCBsaW5lcy4gIFRoZSBsaW5lIHdpdGggdGhlCi0gaW5kZXggbnVtYmVyIGF0IHRoZSBsZWZ0IGhhbmQgbWFyZ2luIGxpc3RzIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgotIFRoZSBsaW5lcyBhYm92ZSBpdCBsaXN0IHRoZSBmdW5jdGlvbnMgdGhhdCBjYWxsZWQgdGhpcyBmdW5jdGlvbiwKLSBhbmQgdGhlIGxpbmVzIGJlbG93IGl0IGxpc3QgdGhlIGZ1bmN0aW9ucyB0aGlzIG9uZSBjYWxsZWQuCi0gVGhpcyBsaW5lIGxpc3RzOgotICAgICBpbmRleAlBIHVuaXF1ZSBudW1iZXIgZ2l2ZW4gdG8gZWFjaCBlbGVtZW50IG9mIHRoZSB0YWJsZS4KLQkJSW5kZXggbnVtYmVycyBhcmUgc29ydGVkIG51bWVyaWNhbGx5LgotCQlUaGUgaW5kZXggbnVtYmVyIGlzIHByaW50ZWQgbmV4dCB0byBldmVyeSBmdW5jdGlvbiBuYW1lIHNvCi0JCWl0IGlzIGVhc2llciB0byBsb29rIHVwIHdoZXJlIHRoZSBmdW5jdGlvbiBpbiB0aGUgdGFibGUuCi0KLSAgICAgJSB0aW1lCVRoaXMgaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGB0b3RhbCcgdGltZSB0aGF0IHdhcyBzcGVudAotCQlpbiB0aGlzIGZ1bmN0aW9uIGFuZCBpdHMgY2hpbGRyZW4uICBOb3RlIHRoYXQgZHVlIHRvCi0JCWRpZmZlcmVudCB2aWV3cG9pbnRzLCBmdW5jdGlvbnMgZXhjbHVkZWQgYnkgb3B0aW9ucywgZXRjLAotCQl0aGVzZSBudW1iZXJzIHdpbGwgTk9UIGFkZCB1cCB0byAxMDAlLgotCi0gICAgIHNlbGYJVGhpcyBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gdGhpcyBmdW5jdGlvbi4KLQotICAgICBjaGlsZHJlbglUaGlzIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBwcm9wYWdhdGVkIGludG8gdGhpcwotCQlmdW5jdGlvbiBieSBpdHMgY2hpbGRyZW4uCi0KLSAgICAgY2FsbGVkCVRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZC4KLQkJSWYgdGhlIGZ1bmN0aW9uIGNhbGxlZCBpdHNlbGYgcmVjdXJzaXZlbHksIHRoZSBudW1iZXIKLQkJb25seSBpbmNsdWRlcyBub24tcmVjdXJzaXZlIGNhbGxzLCBhbmQgaXMgZm9sbG93ZWQgYnkKLQkJYSBgKycgYW5kIHRoZSBudW1iZXIgb2YgcmVjdXJzaXZlIGNhbGxzLgotCi0gICAgIG5hbWUJVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICBUaGUgaW5kZXggbnVtYmVyIGlzCi0JCXByaW50ZWQgYWZ0ZXIgaXQuICBJZiB0aGUgZnVuY3Rpb24gaXMgYSBtZW1iZXIgb2YgYQotCQljeWNsZSwgdGhlIGN5Y2xlIG51bWJlciBpcyBwcmludGVkIGJldHdlZW4gdGhlCi0JCWZ1bmN0aW9uJ3MgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlci4KLQotCi0gRm9yIHRoZSBmdW5jdGlvbidzIHBhcmVudHMsIHRoZSBmaWVsZHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgotCi0gICAgIHNlbGYJVGhpcyBpcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCB3YXMgcHJvcGFnYXRlZCBkaXJlY3RseQotCQlmcm9tIHRoZSBmdW5jdGlvbiBpbnRvIHRoaXMgcGFyZW50LgotCi0gICAgIGNoaWxkcmVuCVRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgd2FzIHByb3BhZ2F0ZWQgZnJvbQotCQl0aGUgZnVuY3Rpb24ncyBjaGlsZHJlbiBpbnRvIHRoaXMgcGFyZW50LgotCi0gICAgIGNhbGxlZAlUaGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBwYXJlbnQgY2FsbGVkIHRoZQotCQlmdW5jdGlvbiBgLycgdGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24KLQkJd2FzIGNhbGxlZC4gIFJlY3Vyc2l2ZSBjYWxscyB0byB0aGUgZnVuY3Rpb24gYXJlIG5vdAotCQlpbmNsdWRlZCBpbiB0aGUgbnVtYmVyIGFmdGVyIHRoZSBgLycuCi0KLSAgICAgbmFtZQlUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQuICBUaGUgcGFyZW50J3MgaW5kZXgKLQkJbnVtYmVyIGlzIHByaW50ZWQgYWZ0ZXIgaXQuICBJZiB0aGUgcGFyZW50IGlzIGEKLQkJbWVtYmVyIG9mIGEgY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMgcHJpbnRlZCBiZXR3ZWVuCi0JCXRoZSBuYW1lIGFuZCB0aGUgaW5kZXggbnVtYmVyLgotCi0gSWYgdGhlIHBhcmVudHMgb2YgdGhlIGZ1bmN0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCB0aGUgd29yZAotIGA8c3BvbnRhbmVvdXM+JyBpcyBwcmludGVkIGluIHRoZSBgbmFtZScgZmllbGQsIGFuZCBhbGwgdGhlIG90aGVyCi0gZmllbGRzIGFyZSBibGFuay4KLQotIEZvciB0aGUgZnVuY3Rpb24ncyBjaGlsZHJlbiwgdGhlIGZpZWxkcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6Ci0KLSAgICAgc2VsZglUaGlzIGlzIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHdhcyBwcm9wYWdhdGVkIGRpcmVjdGx5Ci0JCWZyb20gdGhlIGNoaWxkIGludG8gdGhlIGZ1bmN0aW9uLgotCi0gICAgIGNoaWxkcmVuCVRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgd2FzIHByb3BhZ2F0ZWQgZnJvbSB0aGUKLQkJY2hpbGQncyBjaGlsZHJlbiB0byB0aGUgZnVuY3Rpb24uCi0KLSAgICAgY2FsbGVkCVRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gY2FsbGVkCi0JCXRoaXMgY2hpbGQgYC8nIHRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIGNoaWxkCi0JCXdhcyBjYWxsZWQuICBSZWN1cnNpdmUgY2FsbHMgYnkgdGhlIGNoaWxkIGFyZSBub3QKLQkJbGlzdGVkIGluIHRoZSBudW1iZXIgYWZ0ZXIgdGhlIGAvJy4KLQotICAgICBuYW1lCVRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGNoaWxkLiAgVGhlIGNoaWxkJ3MgaW5kZXgKLQkJbnVtYmVyIGlzIHByaW50ZWQgYWZ0ZXIgaXQuICBJZiB0aGUgY2hpbGQgaXMgYQotCQltZW1iZXIgb2YgYSBjeWNsZSwgdGhlIGN5Y2xlIG51bWJlciBpcyBwcmludGVkCi0JCWJldHdlZW4gdGhlIG5hbWUgYW5kIHRoZSBpbmRleCBudW1iZXIuCi0KLSBJZiB0aGVyZSBhcmUgYW55IGN5Y2xlcyAoY2lyY2xlcykgaW4gdGhlIGNhbGwgZ3JhcGgsIHRoZXJlIGlzIGFuCi0gZW50cnkgZm9yIHRoZSBjeWNsZS1hcy1hLXdob2xlLiAgVGhpcyBlbnRyeSBzaG93cyB3aG8gY2FsbGVkIHRoZQotIGN5Y2xlIChhcyBwYXJlbnRzKSBhbmQgdGhlIG1lbWJlcnMgb2YgdGhlIGN5Y2xlIChhcyBjaGlsZHJlbi4pCi0gVGhlIGArJyByZWN1cnNpdmUgY2FsbHMgZW50cnkgc2hvd3MgdGhlIG51bWJlciBvZiBmdW5jdGlvbiBjYWxscyB0aGF0Ci0gd2VyZSBpbnRlcm5hbCB0byB0aGUgY3ljbGUsIGFuZCB0aGUgY2FsbHMgZW50cnkgZm9yIGVhY2ggbWVtYmVyIHNob3dzLAotIGZvciB0aGF0IG1lbWJlciwgaG93IG1hbnkgdGltZXMgaXQgd2FzIGNhbGxlZCBmcm9tIG90aGVyIG1lbWJlcnMgb2YKLSB0aGUgY3ljbGUuCi0KZGlmZiAtLWdpdCBhL2dwcm9mL2djb25maWcuaW4gYi9ncHJvZi9nY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDdlOGUwLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2djb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyogZ2NvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KZGlmZiAtLWdpdCBhL2dwcm9mL2dlbi1jLXByb2cuYXdrIGIvZ3Byb2YvZ2VuLWMtcHJvZy5hd2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OWMxZjguLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ2VuLWMtcHJvZy5hd2sKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1OUiA9PSAxCXsKLSAgICBGUz0iXCIiOwotICAgIHByaW50ICIvKiA9PT4gRG8gbm90IG1vZGlmeSB0aGlzIGZpbGUhISAgSXQgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IgotICAgIHByaW50ZiAiICAgZnJvbSAlcyB1c2luZyB0aGUgZ2VuLWMtcHJvZy5hd2sgc2NyaXB0LiAgPD09ICovXG5cbiIsIEZJTEUKLSAgICBwcmludCAiI2luY2x1ZGUgPHN0ZGlvLmg+IgotfQotCi0JewotCSAgaWYgKGN1cmZ1biAhPSBGVU5DVElPTikKLQkgICAgewotCSAgICAgIGlmIChjdXJmdW4pCi0JCXByaW50ICJ9IgotCSAgICAgIGN1cmZ1biA9IEZVTkNUSU9OCi0JICAgICAgcHJpbnQgIiIKLQkgICAgICBwcmludCAidm9pZCI7Ci0JICAgICAgcHJpbnRmICIlcyAoZmlsZSlcbiIsIEZVTkNUSU9OCi0JICAgICAgcHJpbnQgIiAgICAgRklMRSAqZmlsZTsiOwotCSAgICAgIHByaW50ICJ7IjsKLQkgICAgfQotCSAgcHJpbnRmICIgIGZwdXRzIChcIiI7Ci0JICBmb3IgKGkgPSAxOyBpIDwgTkY7IGkrKykKLQkgICAgcHJpbnRmICIlc1xcXCIiLCAkaTsKLQkgIHByaW50ZiAiJXNcXG5cIiwgZmlsZSk7XG4iLCAkTkY7Ci19Ci0KLUVORAl7IHByaW50ICJ9IiB9CmRpZmYgLS1naXQgYS9ncHJvZi9nbW9uLmggYi9ncHJvZi9nbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MWZhNGQuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ21vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qLQotICogQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICoJQCgjKWdtb24uaAk1LjIgKEJlcmtlbGV5KSA1LzYvOTEKLSAqLwotI2lmbmRlZiBnbW9uX2gKLSNkZWZpbmUgZ21vbl9oCi0KLXN0cnVjdCByYXdfcGhkcgotICB7Ci0gICAgLyogRklYTUU6IENoZWNraW5nIGEgaG9zdCBjb21waWxlciBkZWZpbmUgbWVhbnMgdGhhdCB3ZSBjYW4ndCB1c2UKLSAgICAgICBhIGNyb3NzIGdwcm9mIHRvIHRoZSBhbHBoYS4gICovCi0jaWZkZWYgX19hbHBoYV9fCi0gICAgY2hhciBsb3dfcGNbOF07CQkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLwotICAgIGNoYXIgaGlnaF9wY1s4XTsJCS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCi0jZWxzZQotICAgIGNoYXIgbG93X3BjWzRdOwkJLyogYmFzZSBwYyBhZGRyZXNzIG9mIHNhbXBsZSBidWZmZXIgKi8KLSAgICBjaGFyIGhpZ2hfcGNbNF07CQkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLwotI2VuZGlmCi0gICAgY2hhciBuY250WzRdOwkJLyogc2l6ZSBvZiBzYW1wbGUgYnVmZmVyIChwbHVzIHRoaXMgaGVhZGVyKSAqLwotCi0gICAgY2hhciB2ZXJzaW9uWzRdOwkJLyogdmVyc2lvbiBudW1iZXIgKi8KLSAgICBjaGFyIHByb2ZyYXRlWzRdOwkJLyogcHJvZmlsaW5nIGNsb2NrIHJhdGUgKi8KLSAgICBjaGFyIHNwYXJlWzMqNF07CQkvKiByZXNlcnZlZCAqLwotICB9OwotCi0jZGVmaW5lIEdNT05WRVJTSU9OICAgICAweDAwMDUxODc5Ci0KLXN0cnVjdCBvbGRfcmF3X3BoZHIKLSAgewotICAgIC8qIEZJWE1FOiBDaGVja2luZyBhIGhvc3QgY29tcGlsZXIgZGVmaW5lIG1lYW5zIHRoYXQgd2UgY2FuJ3QgdXNlCi0gICAgICAgYSBjcm9zcyBncHJvZiB0byB0aGUgYWxwaGEuICAqLwotI2lmZGVmIF9fYWxwaGFfXwotICAgIGNoYXIgbG93X3BjWzhdOwkJLyogYmFzZSBwYyBhZGRyZXNzIG9mIHNhbXBsZSBidWZmZXIgKi8KLSAgICBjaGFyIGhpZ2hfcGNbOF07CQkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLwotI2Vsc2UKLSAgICBjaGFyIGxvd19wY1s0XTsJCS8qIGJhc2UgcGMgYWRkcmVzcyBvZiBzYW1wbGUgYnVmZmVyICovCi0gICAgY2hhciBoaWdoX3BjWzRdOwkJLyogbWF4IHBjIGFkZHJlc3Mgb2Ygc2FtcGxlZCBidWZmZXIgKi8KLSNlbmRpZgotICAgIGNoYXIgbmNudFs0XTsJCS8qIHNpemUgb2Ygc2FtcGxlIGJ1ZmZlciAocGx1cyB0aGlzIGhlYWRlcikgKi8KLQotICAgIC8qIEZJWE1FOiBDaGVja2luZyBob3N0IGNvbXBpbGVyIGRlZmluZXMgaGVyZSBtZWFucyB0aGF0IHdlIGNhbid0Ci0gICAgICAgdXNlIGEgY3Jvc3MgZ3Byb2YgYWxwaGEgT1NGLiAgKi8KLSNpZiBkZWZpbmVkIChfX2FscGhhX18pICYmIGRlZmluZWQgKF9fb3NmX18pCi0gICAgLyoKLSAgICAgKiBERUMncyBPU0YgdjMuMCB1c2VzIDQgYnl0ZXMgb2YgcGFkZGluZyB0byBicmluZyB0aGUgaGVhZGVyIHRvCi0gICAgICogYSBzaXplIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiA4LgotICAgICAqLwotICAgIGNoYXIgcGFkWzRdOwotI2VuZGlmCi0gIH07Ci0KLS8qCi0gKiBIaXN0b2dyYW0gY291bnRlcnMgYXJlIHVuc2lnbmVkIHNob3J0czoKLSAqLwotI2RlZmluZQlISVNUQ09VTlRFUiB1bnNpZ25lZCBzaG9ydAotCi0vKgotICogRnJhY3Rpb24gb2YgdGV4dCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgaGlzdG9ncmFtIGNvdW50ZXJzIGhlcmUsIDEvMjoKLSAqLwotI2RlZmluZQlISVNURlJBQ1RJT04JMgotCi0vKgotICogRnJhY3Rpb24gb2YgdGV4dCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgZnJvbSBoYXNoIGJ1Y2tldHMuICBUaGUKLSAqIHZhbHVlIG9mIEhBU0hGUkFDVElPTiBpcyBiYXNlZCBvbiB0aGUgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgb2YKLSAqIHNlcGFyYXRpb24gYmV0d2VlbiB0d28gc3Vicm91dGluZSBjYWxsIHBvaW50cyBpbiB0aGUgb2JqZWN0IGNvZGUuCi0gKiBHaXZlbiBNSU5fU1VCUl9TRVBBUkFUSU9OIGJ5dGVzIG9mIHNlcGFyYXRpb24gdGhlIHZhbHVlIG9mCi0gKiBIQVNIRlJBQ1RJT04gaXMgY2FsY3VsYXRlZCBhczoKLSAqCi0gKiAgICAgIEhBU0hGUkFDVElPTiA9IE1JTl9TVUJSX1NFUEFSQVRJT04gLyAoMiAqIHNpemVvZihzaG9ydCkgLSAxKTsKLSAqCi0gKiBGb3IgdGhlIFZBWCwgdGhlIHNob3J0ZXN0IHR3byBjYWxsIHNlcXVlbmNlIGlzOgotICoKLSAqICAgICAgY2FsbHMgICAkMCwocjApCi0gKiAgICAgIGNhbGxzICAgJDAsKHIwKQotICoKLSAqIHdoaWNoIGlzIHNlcGFyYXRlZCBieSBvbmx5IHRocmVlIGJ5dGVzLCB0aHVzIEhBU0hGUkFDVElPTiBpcyAKLSAqIGNhbGN1bGF0ZWQgYXM6Ci0gKgotICogICAgICBIQVNIRlJBQ1RJT04gPSAzIC8gKDIgKiAyIC0gMSkgPSAxCi0gKgotICogTm90ZSB0aGF0IHRoZSBkaXZpc2lvbiBhYm92ZSByb3VuZHMgZG93biwgdGh1cyBpZiBNSU5fU1VCUl9GUkFDVElPTgotICogaXMgbGVzcyB0aGFuIHRocmVlLCB0aGlzIGFsZ29yaXRobSB3aWxsIG5vdCB3b3JrIQotICovCi0jZGVmaW5lCUhBU0hGUkFDVElPTiAxCi0KLS8qCi0gKiBQZXJjZW50IG9mIHRleHQgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIHRvc3RydWN0cyB3aXRoIGEgbWluaW11bToKLSAqLwotI2RlZmluZSBBUkNERU5TSVRZCTIKLSNkZWZpbmUgTUlOQVJDUwkJNTAKLQotc3RydWN0IHRvc3RydWN0Ci0gIHsKLSAgICBjaGFyICpzZWxmcGM7Ci0gICAgaW50IGNvdW50OwotICAgIHVuc2lnbmVkIHNob3J0IGxpbms7Ci0gIH07Ci0KLS8qCi0gKiBBIHJhdyBhcmMsIHdpdGggcG9pbnRlcnMgdG8gdGhlIGNhbGxpbmcgc2l0ZSBhbmQgdGhlIGNhbGxlZCBzaXRlCi0gKiBhbmQgYSBjb3VudC4gIEV2ZXJ5dGhpbmcgaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiBjaGFyYWN0ZXJzIHNvCi0gKiBhcyB0byBnZXQgYSBwYWNrZWQgcmVwcmVzZW50YXRpb24gKG90aGVyd2lzZSwgZGlmZmVyZW50IGNvbXBpbGVycwotICogbWlnaHQgaW50cm9kdWNlIGRpZmZlcmVudCBwYWRkaW5nKToKLSAqLwotc3RydWN0IHJhd19hcmMKLSAgewotICAgIC8qIEZJWE1FOiBDaGVja2luZyBhIGhvc3QgY29tcGlsZXIgZGVmaW5lIG1lYW5zIHRoYXQgd2UgY2FuJ3QgdXNlCi0gICAgICAgYSBjcm9zcyBncHJvZiB0byB0aGUgYWxwaGEuICAqLwotI2lmZGVmIF9fYWxwaGFfXwotICAgIGNoYXIgZnJvbV9wY1s4XTsKLSAgICBjaGFyIHNlbGZfcGNbOF07Ci0gICAgY2hhciBjb3VudFs4XTsKLSNlbHNlCi0gICAgY2hhciBmcm9tX3BjWzRdOwotICAgIGNoYXIgc2VsZl9wY1s0XTsKLSAgICBjaGFyIGNvdW50WzRdOwotI2VuZGlmCi0gIH07Ci0KLS8qCi0gKiBHZW5lcmFsIHJvdW5kaW5nIGZ1bmN0aW9uczoKLSAqLwotI2RlZmluZSBST1VORERPV04oeCx5KQkoKCh4KS8oeSkpKih5KSkKLSNkZWZpbmUgUk9VTkRVUCh4LHkpCSgoKCh4KSsoeSktMSkvKHkpKSooeSkpCi0KLSNlbmRpZiAvKiBnbW9uX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2dtb25faW8uYyBiL2dwcm9mL2dtb25faW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwYTFhMC4uMDAwMDAwMAotLS0gYS9ncHJvZi9nbW9uX2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotLyoKLSAqIElucHV0IGFuZCBvdXRwdXQgZnJvbS90byBnbW9uLm91dCBmaWxlcy4KLSAqLwotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJiYXNpY19ibG9ja3MuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImNhbGxfZ3JhcGguaCIKLSNpbmNsdWRlICJnbW9uX2lvLmgiCi0jaW5jbHVkZSAiZ21vbl9vdXQuaCIKLSNpbmNsdWRlICJnbW9uLmgiCQkvKiBmZXRjaCBoZWFkZXIgZm9yIG9sZCBmb3JtYXQgKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImhlcnR6LmgiCi0jaW5jbHVkZSAiaGlzdC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi1pbnQgZ21vbl9pbnB1dCA9IDA7Ci1pbnQgZ21vbl9maWxlX3ZlcnNpb24gPSAwOwkvKiAwID09IG9sZCAobm9uLXZlcnNpb25lZCkgZmlsZSBmb3JtYXQgKi8KLQotLyoKLSAqIFRoaXMgcHJvYmFibHkgb3VnaHQgdG8gYmUgaW4gbGliYmZkLgotICovCi1iZmRfdm1hCi1ERUZVTiAoZ2V0X3ZtYSwgKGFiZmQsIGFkZHIpLCBiZmQgKiBhYmZkIEFORCBiZmRfYnl0ZSAqIGFkZHIpCi17Ci0gIHN3aXRjaCAoc2l6ZW9mIChjaGFyKikpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyKTsKLSAgICBjYXNlIDg6Ci0gICAgICByZXR1cm4gYmZkX2dldF82NCAoYWJmZCwgYWRkcik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF92bWEgaGFzIHVuZXhwZWN0ZWQgc2l6ZSBvZiAlbGQgYnl0ZXNcbiIpLAotCSAgICAgICB3aG9hbWksIChsb25nKSBzaXplb2YgKGNoYXIqKSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIFRoaXMgcHJvYmFibHkgb3VnaHQgdG8gYmUgaW4gbGliYmZkLgotICovCi12b2lkCi1ERUZVTiAocHV0X3ZtYSwgKGFiZmQsIHZhbCwgYWRkciksIGJmZCAqIGFiZmQgQU5EIGJmZF92bWEgdmFsIEFORCBiZmRfYnl0ZSAqIGFkZHIpCi17Ci0gIHN3aXRjaCAoc2l6ZW9mIChjaGFyKikpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgYWRkcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBiZmRfcHV0XzY0IChhYmZkLCB2YWwsIGFkZHIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF92bWEgaGFzIHVuZXhwZWN0ZWQgc2l6ZSBvZiAlbGQgYnl0ZXNcbiIpLAotCSAgICAgICB3aG9hbWksIChsb25nKSBzaXplb2YgKGNoYXIqKSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci19Ci0KLQotdm9pZAotREVGVU4gKGdtb25fb3V0X3JlYWQsIChmaWxlbmFtZSksIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBGSUxFICppZnA7Ci0gIHN0cnVjdCBnbW9uX2hkciBnaGRyOwotICB1bnNpZ25lZCBjaGFyIHRhZzsKLSAgaW50IG5oaXN0ID0gMCwgbmFyY3MgPSAwLCBuYmJzID0gMDsKLQotICAvKiBvcGVuIGdtb24ub3V0IGZpbGU6ICovCi0KLSAgaWYgKHN0cmNtcCAoZmlsZW5hbWUsICItIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZnAgPSBzdGRpbjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZnAgPSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1JCKTsKLSAgICAgIGlmICghaWZwKQotCXsKLQkgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgIH0KLSAgaWYgKGZyZWFkICgmZ2hkciwgc2l6ZW9mIChzdHJ1Y3QgZ21vbl9oZHIpLCAxLCBpZnApICE9IDEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZmlsZSB0b28gc2hvcnQgdG8gYmUgYSBnbW9uIGZpbGVcbiIpLAotCSAgICAgICBmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgaWYgKChmaWxlX2Zvcm1hdCA9PSBGRl9NQUdJQykgfHwKLSAgICAgIChmaWxlX2Zvcm1hdCA9PSBGRl9BVVRPICYmICFzdHJuY21wICgmZ2hkci5jb29raWVbMF0sIEdNT05fTUFHSUMsIDQpKSkKLSAgICB7Ci0gICAgICBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfTUFHSUMgJiYgc3RybmNtcCAoJmdoZHIuY29va2llWzBdLCBHTU9OX01BR0lDLCA0KSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBmaWxlIGAlcycgaGFzIGJhZCBtYWdpYyBjb29raWVcbiIpLAotCQkgICB3aG9hbWksIGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLQotICAgICAgLyogcmlnaHQgbWFnaWMsIHNvIGl0J3MgcHJvYmFibHkgcmVhbGx5IGEgbmV3IGdtb24ub3V0IGZpbGUgKi8KLQotICAgICAgZ21vbl9maWxlX3ZlcnNpb24gPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGdoZHIudmVyc2lvbik7Ci0gICAgICBpZiAoZ21vbl9maWxlX3ZlcnNpb24gIT0gR01PTl9WRVJTSU9OICYmIGdtb25fZmlsZV92ZXJzaW9uICE9IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICBfKCIlczogZmlsZSBgJXMnIGhhcyB1bnN1cHBvcnRlZCB2ZXJzaW9uICVkXG4iKSwKLQkJICAgd2hvYW1pLCBmaWxlbmFtZSwgZ21vbl9maWxlX3ZlcnNpb24pOwotCSAgZG9uZSAoMSk7Ci0JfQotCi0gICAgICAvKiByZWFkIGluIGFsbCB0aGUgcmVjb3JkczogKi8KLSAgICAgIHdoaWxlIChmcmVhZCAoJnRhZywgc2l6ZW9mICh0YWcpLCAxLCBpZnApID09IDEpCi0JewotCSAgc3dpdGNoICh0YWcpCi0JICAgIHsKLQkgICAgY2FzZSBHTU9OX1RBR19USU1FX0hJU1Q6Ci0JICAgICAgKytuaGlzdDsKLQkgICAgICBnbW9uX2lucHV0IHw9IElOUFVUX0hJU1RPR1JBTTsKLQkgICAgICBoaXN0X3JlYWRfcmVjIChpZnAsIGZpbGVuYW1lKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEdNT05fVEFHX0NHX0FSQzoKLQkgICAgICArK25hcmNzOwotCSAgICAgIGdtb25faW5wdXQgfD0gSU5QVVRfQ0FMTF9HUkFQSDsKLQkgICAgICBjZ19yZWFkX3JlYyAoaWZwLCBmaWxlbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBHTU9OX1RBR19CQl9DT1VOVDoKLQkgICAgICArK25iYnM7Ci0JICAgICAgZ21vbl9pbnB1dCB8PSBJTlBVVF9CQl9DT1VOVFM7Ci0JICAgICAgYmJfcmVhZF9yZWMgKGlmcCwgZmlsZW5hbWUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6ICVzOiBmb3VuZCBiYWQgdGFnICVkIChmaWxlIGNvcnJ1cHRlZD8pXG4iKSwKLQkJICAgICAgIHdob2FtaSwgZmlsZW5hbWUsIHRhZyk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChmaWxlX2Zvcm1hdCA9PSBGRl9BVVRPCi0JICAgfHwgZmlsZV9mb3JtYXQgPT0gRkZfQlNECi0JICAgfHwgZmlsZV9mb3JtYXQgPT0gRkZfQlNENDQpCi0gICAgewotICAgICAgc3RydWN0IGhkcgotICAgICAgewotCWJmZF92bWEgbG93X3BjOwotCWJmZF92bWEgaGlnaF9wYzsKLQlpbnQgbmNudDsKLSAgICAgIH07Ci0gICAgICBpbnQgaSwgc2FtcF9ieXRlcywgaGVhZGVyX3NpemU7Ci0gICAgICB1bnNpZ25lZCBsb25nIGNvdW50OwotICAgICAgYmZkX3ZtYSBmcm9tX3BjLCBzZWxmX3BjOwotICAgICAgc3RydWN0IHJhd19hcmMgcmF3X2FyYzsKLSAgICAgIHN0cnVjdCByYXdfcGhkciByYXc7Ci0gICAgICBzdGF0aWMgc3RydWN0IGhkciBoOwotICAgICAgVU5JVCByYXdfYmluX2NvdW50OwotICAgICAgc3RydWN0IGhkciB0bXA7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBJbmZvcm1hdGlvbiBmcm9tIGEgZ21vbi5vdXQgZmlsZSBpcyBpbiB0d28gcGFydHM6IGFuIGFycmF5IG9mCi0gICAgICAgKiBzYW1wbGluZyBoaXRzIHdpdGhpbiBwYyByYW5nZXMsIGFuZCB0aGUgYXJjcy4KLSAgICAgICAqLwotICAgICAgZ21vbl9pbnB1dCA9IElOUFVUX0hJU1RPR1JBTSB8IElOUFVUX0NBTExfR1JBUEg7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBUaGlzIGZzZWVrKCkgb3VnaHQgdG8gd29yayBldmVuIG9uIHN0ZGluIGFzIGxvbmcgYXMgaXQncwotICAgICAgICogbm90IGFuIGludGVyYWN0aXZlIGRldmljZSAoaGVjaywgaXMgdGhlcmUgYW55Ym9keSB3aG8gd291bGQKLSAgICAgICAqIHdhbnQgdG8gdHlwZSBpbiBhIGdtb24ub3V0IGF0IHRoZSB0ZXJtaW5hbD8pLgotICAgICAgICovCi0gICAgICBpZiAoZnNlZWsgKGlmcCwgMCwgU0VFS19TRVQpIDwgMCkKLQl7Ci0JICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLSAgICAgIGlmIChmcmVhZCAoJnJhdywgMSwgc2l6ZW9mIChzdHJ1Y3QgcmF3X3BoZHIpLCBpZnApCi0JICAhPSBzaXplb2YgKHN0cnVjdCByYXdfcGhkcikpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZmlsZSB0b28gc2hvcnQgdG8gYmUgYSBnbW9uIGZpbGVcbiIpLAotCQkgICBmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgICB0bXAubG93X3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmcmF3Lmxvd19wY1swXSk7Ci0gICAgICB0bXAuaGlnaF9wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy5oaWdoX3BjWzBdKTsKLSAgICAgIHRtcC5uY250ID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmcmF3Lm5jbnRbMF0pOwotCi0gICAgICBpZiAoYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmcmF3LnZlcnNpb25bMF0pCi0JICA9PSBHTU9OVkVSU0lPTikKLQl7Ci0JICBpbnQgcHJvZnJhdGU7Ci0KLQkgIC8qIDQuNEJTRCBmb3JtYXQgaGVhZGVyLiAgKi8KLQotCSAgcHJvZnJhdGUgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICZyYXcucHJvZnJhdGVbMF0pOwotCSAgaWYgKCFzX2hpZ2hwYykKLQkgICAgaHogPSBwcm9mcmF0ZTsKLQkgIGVsc2UgaWYgKGh6ICE9IHByb2ZyYXRlKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IHByb2ZpbGluZyByYXRlIGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIiksCi0JCSAgICAgICBmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQotCSAgaGVhZGVyX3NpemUgPSBzaXplb2YgKHN0cnVjdCByYXdfcGhkcik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIG9sZCBzdHlsZSBCU0QgZm9ybWF0LiAgKi8KLQkgIGlmIChmaWxlX2Zvcm1hdCA9PSBGRl9CU0Q0NCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgYCVzJyBoYXMgYmFkIG1hZ2ljIGNvb2tpZVxuIiksCi0JCSAgICAgICB3aG9hbWksIGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCi0JICBpZiAoZnNlZWsgKGlmcCwgc2l6ZW9mIChzdHJ1Y3Qgb2xkX3Jhd19waGRyKSwgU0VFS19TRVQpIDwgMCkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0KLQkgIGhlYWRlcl9zaXplID0gc2l6ZW9mIChzdHJ1Y3Qgb2xkX3Jhd19waGRyKTsKLQl9Ci0KLSAgICAgIGlmIChzX2hpZ2hwYyAmJiAodG1wLmxvd19wYyAhPSBoLmxvd19wYyB8fAotCQkgICAgICAgdG1wLmhpZ2hfcGMgIT0gaC5oaWdoX3BjIHx8IHRtcC5uY250ICE9IGgubmNudCkpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaW5jb21wYXRpYmxlIHdpdGggZmlyc3QgZ21vbiBmaWxlXG4iKSwKLQkJICAgZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgICAgaCA9IHRtcDsKLSAgICAgIHNfbG93cGMgPSAoYmZkX3ZtYSkgaC5sb3dfcGM7Ci0gICAgICBzX2hpZ2hwYyA9IChiZmRfdm1hKSBoLmhpZ2hfcGM7Ci0gICAgICBsb3dwYyA9IChiZmRfdm1hKSBoLmxvd19wYyAvIHNpemVvZiAoVU5JVCk7Ci0gICAgICBoaWdocGMgPSAoYmZkX3ZtYSkgaC5oaWdoX3BjIC8gc2l6ZW9mIChVTklUKTsKLSAgICAgIHNhbXBfYnl0ZXMgPSBoLm5jbnQgLSBoZWFkZXJfc2l6ZTsKLSAgICAgIGhpc3RfbnVtX2JpbnMgPSBzYW1wX2J5dGVzIC8gc2l6ZW9mIChVTklUKTsKLSAgICAgIERCRyAoU0FNUExFREVCVUcsCi0JICAgcHJpbnRmICgiW2dtb25fb3V0X3JlYWRdIGxvd3BjIDB4JWx4IGhpZ2hwYyAweCVseCBuY250ICVkXG4iLAotCQkgICAodW5zaWduZWQgbG9uZykgaC5sb3dfcGMsICh1bnNpZ25lZCBsb25nKSBoLmhpZ2hfcGMsCi0JCSAgIGgubmNudCk7Ci0JICAgcHJpbnRmICgiW2dtb25fb3V0X3JlYWRdICAgc19sb3dwYyAweCVseCAgIHNfaGlnaHBjIDB4JWx4XG4iLAotCQkgICAodW5zaWduZWQgbG9uZykgc19sb3dwYywgKHVuc2lnbmVkIGxvbmcpIHNfaGlnaHBjKTsKLQkgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gICAgIGxvd3BjIDB4JWx4ICAgICBoaWdocGMgMHglbHhcbiIsCi0JCSAgICh1bnNpZ25lZCBsb25nKSBsb3dwYywgKHVuc2lnbmVkIGxvbmcpIGhpZ2hwYyk7Ci0JICAgcHJpbnRmICgiW2dtb25fb3V0X3JlYWRdIHNhbXBfYnl0ZXMgJWQgaGlzdF9udW1fYmlucyAlZFxuIiwKLQkJICAgc2FtcF9ieXRlcywgaGlzdF9udW1fYmlucykpOwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHNlbnNpYmxlIHZhbHVlcy4gICovCi0gICAgICBpZiAoc2FtcF9ieXRlcyA8IDAgfHwgbG93cGMgPiBoaWdocGMpCi0gICAgICAgIHsKLSAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsIAotCSAgICBfKCIlczogZmlsZSAnJXMnIGRvZXMgbm90IGFwcGVhciB0byBiZSBpbiBnbW9uLm91dCBmb3JtYXRcbiIpLAotCSAgICB3aG9hbWksIGZpbGVuYW1lKTsKLSAgICAgICAgICBkb25lICgxKTsKLSAgICAgICAgfQotCi0gICAgICBpZiAoaGlzdF9udW1fYmlucykKLQl7Ci0JICArK25oaXN0OwotCX0KLQotICAgICAgaWYgKCFoaXN0X3NhbXBsZSkKLQl7Ci0JICBoaXN0X3NhbXBsZSA9Ci0JICAgIChpbnQgKikgeG1hbGxvYyAoaGlzdF9udW1fYmlucyAqIHNpemVvZiAoaGlzdF9zYW1wbGVbMF0pKTsKLQkgIG1lbXNldCAoaGlzdF9zYW1wbGUsIDAsIGhpc3RfbnVtX2JpbnMgKiBzaXplb2YgKGhpc3Rfc2FtcGxlWzBdKSk7Ci0JfQotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgaGlzdF9udW1fYmluczsgKytpKQotCXsKLQkgIGlmIChmcmVhZCAocmF3X2Jpbl9jb3VudCwgc2l6ZW9mIChyYXdfYmluX2NvdW50KSwgMSwgaWZwKSAhPSAxKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IHVuZXhwZWN0ZWQgRU9GIGFmdGVyIHJlYWRpbmcgJWQvJWQgYmluc1xuIiksCi0JCSAgICAgICB3aG9hbWksIC0taSwgaGlzdF9udW1fYmlucyk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQkgIGhpc3Rfc2FtcGxlW2ldICs9IGJmZF9nZXRfMTYgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgcmF3X2Jpbl9jb3VudCk7Ci0JfQotCi0gICAgICAvKgotICAgICAgICogVGhlIHJlc3Qgb2YgdGhlIGZpbGUgY29uc2lzdHMgb2YgYSBidW5jaCBvZiA8ZnJvbSxzZWxmLGNvdW50PgotICAgICAgICogdHVwbGVzOgotICAgICAgICovCi0gICAgICB3aGlsZSAoZnJlYWQgKCZyYXdfYXJjLCBzaXplb2YgKHJhd19hcmMpLCAxLCBpZnApID09IDEpCi0JewotCSAgKytuYXJjczsKLQkgIGZyb21fcGMgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIHJhd19hcmMuZnJvbV9wYyk7Ci0JICBzZWxmX3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLnNlbGZfcGMpOwotCSAgY291bnQgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIHJhd19hcmMuY291bnQpOwotCSAgREJHIChTQU1QTEVERUJVRywKLQkgICAgIHByaW50ZiAoIltnbW9uX291dF9yZWFkXSBmcm9tcGMgMHglbHggc2VsZnBjIDB4JWx4IGNvdW50ICVsdVxuIiwKLQkJICAgICAodW5zaWduZWQgbG9uZykgZnJvbV9wYywgKHVuc2lnbmVkIGxvbmcpIHNlbGZfcGMsIGNvdW50KSk7Ci0JICAvKiBhZGQgdGhpcyBhcmM6ICovCi0JICBjZ190YWxseSAoZnJvbV9wYywgc2VsZl9wYywgY291bnQpOwotCX0KLSAgICAgIGZjbG9zZSAoaWZwKTsKLQotICAgICAgaWYgKGh6ID09IEhaX1dST05HKQotCXsKLQkgIC8qCi0JICAgKiBIb3cgbWFueSB0aWNrcyBwZXIgc2Vjb25kPyAgSWYgd2UgY2FuJ3QgdGVsbCwgcmVwb3J0Ci0JICAgKiB0aW1lIGluIHRpY2tzLgotCSAgICovCi0JICBoeiA9IGhlcnR6ICgpOwotCSAgaWYgKGh6ID09IEhaX1dST05HKQotCSAgICB7Ci0JICAgICAgaHogPSAxOwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygidGltZSBpcyBpbiB0aWNrcywgbm90IHNlY29uZHNcbiIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGggZmlsZSBmb3JtYXQgJWRcbiIpLAotCSAgICAgICB3aG9hbWksIGZpbGVfZm9ybWF0KTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfR01PTl9JTkZPKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiRmlsZSBgJXMnICh2ZXJzaW9uICVkKSBjb250YWluczpcbiIpLAotCSAgICAgIGZpbGVuYW1lLCBnbW9uX2ZpbGVfdmVyc2lvbik7Ci0gICAgICBwcmludGYgKF8oIlx0JWQgaGlzdG9ncmFtIHJlY29yZCVzXG4iKSwKLQkgICAgICBuaGlzdCwgbmhpc3QgPT0gMSA/ICIiIDogInMiKTsKLSAgICAgIHByaW50ZiAoXygiXHQlZCBjYWxsLWdyYXBoIHJlY29yZCVzXG4iKSwKLQkgICAgICBuYXJjcywgbmFyY3MgPT0gMSA/ICIiIDogInMiKTsKLSAgICAgIHByaW50ZiAoXygiXHQlZCBiYXNpYy1ibG9jayBjb3VudCByZWNvcmQlc1xuIiksCi0JICAgICAgbmJicywgbmJicyA9PSAxID8gIiIgOiAicyIpOwotICAgICAgZmlyc3Rfb3V0cHV0ID0gRkFMU0U7Ci0gICAgfQotfQotCi0KLXZvaWQKLURFRlVOIChnbW9uX291dF93cml0ZSwgKGZpbGVuYW1lKSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIEZJTEUgKm9mcDsKLSAgc3RydWN0IGdtb25faGRyIGdoZHI7Ci0KLSAgb2ZwID0gZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9XQik7Ci0gIGlmICghb2ZwKQotICAgIHsKLSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmIChmaWxlX2Zvcm1hdCA9PSBGRl9BVVRPIHx8IGZpbGVfZm9ybWF0ID09IEZGX01BR0lDKQotICAgIHsKLSAgICAgIC8qIHdyaXRlIGdtb24gaGVhZGVyOiAqLwotCi0gICAgICBtZW1jcHkgKCZnaGRyLmNvb2tpZVswXSwgR01PTl9NQUdJQywgNCk7Ci0gICAgICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgR01PTl9WRVJTSU9OLCAoYmZkX2J5dGUgKikgZ2hkci52ZXJzaW9uKTsKLSAgICAgIGlmIChmd3JpdGUgKCZnaGRyLCBzaXplb2YgKGdoZHIpLCAxLCBvZnApICE9IDEpCi0JewotCSAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0KLSAgICAgIC8qIHdyaXRlIGV4ZWN1dGlvbiB0aW1lIGhpc3RvZ3JhbSBpZiB3ZSBoYXZlIG9uZTogKi8KLSAgICAgIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfSElTVE9HUkFNKQotCXsKLQkgIGhpc3Rfd3JpdGVfaGlzdCAob2ZwLCBmaWxlbmFtZSk7Ci0JfQotCi0gICAgICAvKiB3cml0ZSBjYWxsIGdyYXBoIGFyY3MgaWYgd2UgaGF2ZSBhbnk6ICovCi0gICAgICBpZiAoZ21vbl9pbnB1dCAmIElOUFVUX0NBTExfR1JBUEgpCi0JewotCSAgY2dfd3JpdGVfYXJjcyAob2ZwLCBmaWxlbmFtZSk7Ci0JfQotCi0gICAgICAvKiB3cml0ZSBiYXNpYy1ibG9jayBpbmZvIGlmIHdlIGhhdmUgaXQ6ICovCi0gICAgICBpZiAoZ21vbl9pbnB1dCAmIElOUFVUX0JCX0NPVU5UUykKLQl7Ci0JICBiYl93cml0ZV9ibG9ja3MgKG9mcCwgZmlsZW5hbWUpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGZpbGVfZm9ybWF0ID09IEZGX0JTRCB8fCBmaWxlX2Zvcm1hdCA9PSBGRl9CU0Q0NCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcmF3X2FyYyByYXdfYXJjOwotICAgICAgVU5JVCByYXdfYmluX2NvdW50OwotICAgICAgc3RydWN0IHJhd19waGRyIGg7Ci0gICAgICBpbnQgaTsKLSAgICAgIEFyYyAqYXJjOwotICAgICAgU3ltICpzeW07Ci0KLSAgICAgIG1lbXNldCAoJmgsIDAsIHNpemVvZiBoKTsKLSAgICAgIHB1dF92bWEgKGNvcmVfYmZkLCBzX2xvd3BjLCAoYmZkX2J5dGUgKikgJmgubG93X3BjKTsKLSAgICAgIHB1dF92bWEgKGNvcmVfYmZkLCBzX2hpZ2hwYywgKGJmZF9ieXRlICopICZoLmhpZ2hfcGMpOwotICAgICAgYmZkX3B1dF8zMiAoY29yZV9iZmQsCi0JCSAgaGlzdF9udW1fYmlucyAqIHNpemVvZiAoVU5JVCkgKyBzaXplb2YgKHN0cnVjdCByYXdfcGhkciksCi0JCSAgKGJmZF9ieXRlICopICZoLm5jbnQpOwotCi0gICAgICAvKiBXcml0ZSBoZWFkZXIuICBVc2UgbmV3IHN0eWxlIEJTRCBmb3JtYXQgaXMgZXhwbGljaXRseQotICAgICAgICAgc3BlY2lmaWVkLCBvciBpZiB0aGUgcHJvZmlsaW5nIHJhdGUgaXMgbm9uLXN0YW5kYXJkOwotICAgICAgICAgb3RoZXJ3aXNlLCB1c2UgdGhlIG9sZCBCU0QgZm9ybWF0LiAgKi8KLSAgICAgIGlmIChmaWxlX2Zvcm1hdCA9PSBGRl9CU0Q0NAotCSAgfHwgaHogIT0gaGVydHogKCkpCi0JewotCSAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIEdNT05WRVJTSU9OLCAoYmZkX2J5dGUgKikgJmgudmVyc2lvbik7Ci0JICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgaHosIChiZmRfYnl0ZSAqKSAmaC5wcm9mcmF0ZSk7Ci0JICBpZiAoZndyaXRlICgmaCwgc2l6ZW9mIChzdHJ1Y3QgcmF3X3BoZHIpLCAxLCBvZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZndyaXRlICgmaCwgc2l6ZW9mIChzdHJ1Y3Qgb2xkX3Jhd19waGRyKSwgMSwgb2ZwKSAhPSAxKQotCSAgICB7Ci0JICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIGR1bXAgdGhlIHNhbXBsZXM6ICovCi0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoaXN0X251bV9iaW5zOyArK2kpCi0JewotCSAgYmZkX3B1dF8xNiAoY29yZV9iZmQsIGhpc3Rfc2FtcGxlW2ldLCAoYmZkX2J5dGUgKikgJiByYXdfYmluX2NvdW50WzBdKTsKLQkgIGlmIChmd3JpdGUgKCZyYXdfYmluX2NvdW50WzBdLCBzaXplb2YgKHJhd19iaW5fY291bnQpLCAxLCBvZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogZHVtcCB0aGUgbm9ybWFsaXplZCByYXcgYXJjIGluZm9ybWF0aW9uOiAqLwotCi0gICAgICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotCXsKLQkgIGZvciAoYXJjID0gc3ltLT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBhcmMtPm5leHRfY2hpbGQpCi0JICAgIHsKLQkgICAgICBwdXRfdm1hIChjb3JlX2JmZCwgYXJjLT5wYXJlbnQtPmFkZHIsCi0JCSAgICAgICAoYmZkX2J5dGUgKikgcmF3X2FyYy5mcm9tX3BjKTsKLQkgICAgICBwdXRfdm1hIChjb3JlX2JmZCwgYXJjLT5jaGlsZC0+YWRkciwKLQkJICAgICAgIChiZmRfYnl0ZSAqKSByYXdfYXJjLnNlbGZfcGMpOwotCSAgICAgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBhcmMtPmNvdW50LCAoYmZkX2J5dGUgKikgcmF3X2FyYy5jb3VudCk7Ci0JICAgICAgaWYgKGZ3cml0ZSAoJnJhd19hcmMsIHNpemVvZiAocmF3X2FyYyksIDEsIG9mcCkgIT0gMSkKLQkJewotCQkgIHBlcnJvciAoZmlsZW5hbWUpOwotCQkgIGRvbmUgKDEpOwotCQl9Ci0JICAgICAgREJHIChTQU1QTEVERUJVRywKLQkJICAgcHJpbnRmICgiW2R1bXBzdW1dIGZyb21wYyAweCVseCBzZWxmcGMgMHglbHggY291bnQgJWx1XG4iLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGFyYy0+cGFyZW50LT5hZGRyLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGFyYy0+Y2hpbGQtPmFkZHIsIGFyYy0+Y291bnQpKTsKLQkgICAgfQotCX0KLSAgICAgIGZjbG9zZSAob2ZwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGggZmlsZSBmb3JtYXQgJWRcbiIpLAotCSAgICAgICB3aG9hbWksIGZpbGVfZm9ybWF0KTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2dtb25faW8uaCBiL2dwcm9mL2dtb25faW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyNTdhNC4uMDAwMDAwMAotLS0gYS9ncHJvZi9nbW9uX2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jaWZuZGVmIGdtb25faW9faAotI2RlZmluZSBnbW9uX2lvX2gKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdtb24uaCIKLQotI2RlZmluZSBJTlBVVF9ISVNUT0dSQU0JCSgxPDwwKQotI2RlZmluZSBJTlBVVF9DQUxMX0dSQVBICSgxPDwxKQotI2RlZmluZSBJTlBVVF9CQl9DT1VOVFMJCSgxPDwyKQotCi1leHRlcm4gaW50IGdtb25faW5wdXQ7CQkvKiB3aGF0IGlucHV0IGRpZCB3ZSBzZWU/ICovCi1leHRlcm4gaW50IGdtb25fZmlsZV92ZXJzaW9uOwkvKiBmaWxlIHZlcnNpb24gYXJlIHdlIGRlYWxpbmcgd2l0aCAqLwotCi1leHRlcm4gYmZkX3ZtYSBnZXRfdm1hIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGJmZF9ieXRlICogYWRkcikpOwotZXh0ZXJuIHZvaWQgcHV0X3ZtYSBQQVJBTVMgKChiZmQgKiBhYmZkLCBiZmRfdm1hIHZhbCwgYmZkX2J5dGUgKiBhZGRyKSk7Ci0KLWV4dGVybiB2b2lkIGdtb25fb3V0X3JlYWQgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiB2b2lkIGdtb25fb3V0X3dyaXRlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSNlbmRpZiAvKiBnbW9uX2lvX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2dtb25fb3V0LmggYi9ncHJvZi9nbW9uX291dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTQ0ZmI1Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2dtb25fb3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIGdtb24ub3V0IGZpbGVzLiAgSXQgc2hvdWxkIGhhdmUKLSAqIGFzIGZldyBleHRlcm5hbCBkZXBlbmRlbmNpZXMgYXMgcG9zc2libGUgYXMgaXQgaXMgZ29pbmcgdG8gYmUKLSAqIGluY2x1ZGVkIGluIG1hbnkgZGlmZmVyZW50IHByb2dyYW1zLiAgVGhhdCBpcywgbWluaW1pemUgdGhlCi0gKiBudW1iZXIgb2YgI2luY2x1ZGUncy4KLSAqCi0gKiBBIGdtb24ub3V0IGZpbGUgY29uc2lzdHMgb2YgYSBoZWFkZXIgKGRlZmluZWQgYnkgZ21vbl9oZHIpIGZvbGxvd2VkCi0gKiBieSBhIHNlcXVlbmNlIG9mIHJlY29yZHMuICBFYWNoIHJlY29yZCBzdGFydHMgd2l0aCBhIG9uZS1ieXRlIHRhZwotICogaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgcmVjb3JkcywgZm9sbG93ZWQgYnkgcmVjb3JkcyBzcGVjaWZpYyBkYXRhLgotICovCi0jaWZuZGVmIGdtb25fb3V0X2gKLSNkZWZpbmUgZ21vbl9vdXRfaAotCi0jZGVmaW5lCUdNT05fTUFHSUMJImdtb24iCS8qIG1hZ2ljIGNvb2tpZSAqLwotI2RlZmluZSBHTU9OX1ZFUlNJT04JMQkvKiB2ZXJzaW9uIG51bWJlciAqLwotCi0vKgotICogUmF3IGhlYWRlciBhcyBpdCBhcHBlYXJzIG9uIGZpbGUgKHdpdGhvdXQgcGFkZGluZyk6Ci0gKi8KLXN0cnVjdCBnbW9uX2hkcgotICB7Ci0gICAgY2hhciBjb29raWVbNF07Ci0gICAgY2hhciB2ZXJzaW9uWzRdOwotICAgIGNoYXIgc3BhcmVbMyAqIDRdOwotICB9OwotCi0vKiB0eXBlcyBvZiByZWNvcmRzIGluIHRoaXMgZmlsZTogKi8KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgR01PTl9UQUdfVElNRV9ISVNUID0gMCwgR01PTl9UQUdfQ0dfQVJDID0gMSwgR01PTl9UQUdfQkJfQ09VTlQgPSAyCi0gIH0KLUdNT05fUmVjb3JkX1RhZzsKLQotc3RydWN0IGdtb25faGlzdF9oZHIKLSAgewotICAgIGNoYXIgbG93X3BjW3NpemVvZiAoY2hhciopXTsJLyogYmFzZSBwYyBhZGRyZXNzIG9mIHNhbXBsZSBidWZmZXIgKi8KLSAgICBjaGFyIGhpZ2hfcGNbc2l6ZW9mIChjaGFyKildOwkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLwotICAgIGNoYXIgaGlzdF9zaXplWzRdOwkJCS8qIHNpemUgb2Ygc2FtcGxlIGJ1ZmZlciAqLwotICAgIGNoYXIgcHJvZl9yYXRlWzRdOwkJCS8qIHByb2ZpbGluZyBjbG9jayByYXRlICovCi0gICAgY2hhciBkaW1lblsxNV07CQkJLyogcGh5cy4gZGltLiwgdXN1YWxseSAic2Vjb25kcyIgKi8KLSAgICBjaGFyIGRpbWVuX2FiYnJldjsJCQkvKiB1c3VhbGx5ICdzJyBmb3IgInNlY29uZHMiICovCi0gIH07Ci0KLXN0cnVjdCBnbW9uX2NnX2FyY19yZWNvcmQKLSAgewotICAgIGNoYXIgZnJvbV9wY1tzaXplb2YgKGNoYXIqKV07CS8qIGFkZHJlc3Mgd2l0aGluIGNhbGxlcidzIGJvZHkgKi8KLSAgICBjaGFyIHNlbGZfcGNbc2l6ZW9mIChjaGFyKildOwkvKiBhZGRyZXNzIHdpdGhpbiBjYWxsZWUncyBib2R5ICovCi0gICAgY2hhciBjb3VudFs0XTsJCQkvKiBudW1iZXIgb2YgYXJjIHRyYXZlcnNhbHMgKi8KLSAgfTsKLQotI2VuZGlmIC8qIGdtb25fb3V0X2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2dwcm9mLjEgYi9ncHJvZi9ncHJvZi4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTczNGRhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2dwcm9mLjEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk4MywgMTk5MCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKLS5cIiB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0uXCIgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5IHRoZSBmb2xsb3dpbmcKLS5cIiBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0uXCIgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnIGluIHRoZQotLlwiIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiBhbmQgaW4KLS5cIiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0uXCIgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5Ci0uXCIgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotLlwiIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0uXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLS5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotLlwiCi0uXCIgICAgIEAoIylncHJvZi4xCTYuNiAoQmVya2VsZXkpIDcvMjQvOTAKLS5cIgotLlRIIEdQUk9GIDEgIkphbnVhcnkgMjksIDE5OTMiCi0uU0ggTkFNRQotZ3Byb2YgXC0gZGlzcGxheSBjYWxsIGdyYXBoIHByb2ZpbGUgZGF0YQotLlNIIFNZTk9QU0lTCi0uQiBncHJvZiBbIFwtYWJjc3ogXSBbIFwtZXxcLUUKLS5JIG5hbWUKLS5CIF0gWyBcLWZ8XC1GIAotLkkgbmFtZQotLkIgXSAKLS5CIFsgXC1rCi0uSSBmcm9tbmFtZSB0b25hbWUKLS5CIF0gWyAKLS5JIG9iamZpbGUKLS5CIFsgCi0uSSBnbW9uLm91dAotLkIgXSAKLS5CIF0gCi0uU0ggREVTQ1JJUFRJT04KLS5CIGdwcm9mCi1wcm9kdWNlcyBhbiBleGVjdXRpb24gcHJvZmlsZSBvZiBDLCBQYXNjYWwsIG9yIEZvcnRyYW43NyBwcm9ncmFtcy4KLVRoZSBlZmZlY3Qgb2YgY2FsbGVkIHJvdXRpbmVzIGlzIGluY29ycG9yYXRlZCBpbiB0aGUgcHJvZmlsZSBvZiBlYWNoIGNhbGxlci4KLVRoZSBwcm9maWxlIGRhdGEgaXMgdGFrZW4gZnJvbSB0aGUgY2FsbCBncmFwaCBwcm9maWxlIGZpbGUKLVwmKGBnbW9uLm91dCcgZGVmYXVsdCkgd2hpY2ggaXMgY3JlYXRlZCBieSBwcm9ncmFtcwotdGhhdCBhcmUgY29tcGlsZWQgd2l0aCB0aGUKLS5CIFwtcGcKLW9wdGlvbiBvZgotLkJSIGNjICggMSApICwKLS5CUiBwYyAoIDEgKSAsCi1hbmQKLS5CUiBmNzcgKCAxICkgLgotVGhlCi0uQiBcLXBnCi1vcHRpb24gYWxzbyBsaW5rcyBpbiB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSByb3V0aW5lcwotdGhhdCBhcmUgY29tcGlsZWQgZm9yIHByb2ZpbGluZy4KLS5CIEdwcm9mCi1yZWFkcyB0aGUgZ2l2ZW4gb2JqZWN0IGZpbGUgKHRoZSBkZWZhdWx0IGlzIGBhLm91dCcpCi1hbmQgZXN0YWJsaXNoZXMgdGhlIHJlbGF0aW9uIGJldHdlZW4gaXRzIHN5bWJvbCB0YWJsZQotYW5kIHRoZSBjYWxsIGdyYXBoIHByb2ZpbGUgZnJvbSBgZ21vbi5vdXQnLgotSWYgbW9yZSB0aGFuIG9uZSBwcm9maWxlIGZpbGUgaXMgc3BlY2lmaWVkLAotdGhlCi0uQiBncHJvZgotb3V0cHV0IHNob3dzIHRoZSBzdW0gb2YgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gaW4gdGhlIGdpdmVuIHByb2ZpbGUgZmlsZXMuCi0uUFAKLS5CIEdwcm9mCi1jYWxjdWxhdGVzIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBpbiBlYWNoIHJvdXRpbmUuCi1OZXh0LCB0aGVzZSB0aW1lcyBhcmUgcHJvcGFnYXRlZCBhbG9uZyB0aGUgZWRnZXMgb2YgdGhlIGNhbGwgZ3JhcGguCi1DeWNsZXMgYXJlIGRpc2NvdmVyZWQsIGFuZCBjYWxscyBpbnRvIGEgY3ljbGUgYXJlIG1hZGUgdG8gc2hhcmUgdGhlIHRpbWUKLW9mIHRoZSBjeWNsZS4KLVRoZSBmaXJzdCBsaXN0aW5nIHNob3dzIHRoZSBmdW5jdGlvbnMKLXNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIHRpbWUgdGhleSByZXByZXNlbnQKLWluY2x1ZGluZyB0aGUgdGltZSBvZiB0aGVpciBjYWxsIGdyYXBoIGRlc2NlbmRhbnRzLgotQmVsb3cgZWFjaCBmdW5jdGlvbiBlbnRyeSBpcyBzaG93biBpdHMgKGRpcmVjdCkgY2FsbCBncmFwaCBjaGlsZHJlbiwKLWFuZCBob3cgdGhlaXIgdGltZXMgYXJlIHByb3BhZ2F0ZWQgdG8gdGhpcyBmdW5jdGlvbi4KLUEgc2ltaWxhciBkaXNwbGF5IGFib3ZlIHRoZSBmdW5jdGlvbiBzaG93cyBob3cgdGhpcyBmdW5jdGlvbidzIHRpbWUgYW5kIHRoZQotdGltZSBvZiBpdHMgZGVzY2VuZGFudHMgaXMgcHJvcGFnYXRlZCB0byBpdHMgKGRpcmVjdCkgY2FsbCBncmFwaCBwYXJlbnRzLgotLlBQCi1DeWNsZXMgYXJlIGFsc28gc2hvd24sIHdpdGggYW4gZW50cnkgZm9yIHRoZSBjeWNsZSBhcyBhIHdob2xlIGFuZAotYSBsaXN0aW5nIG9mIHRoZSBtZW1iZXJzIG9mIHRoZSBjeWNsZSBhbmQgdGhlaXIgY29udHJpYnV0aW9ucyB0byB0aGUKLXRpbWUgYW5kIGNhbGwgY291bnRzIG9mIHRoZSBjeWNsZS4KLS5QUAotU2Vjb25kLCBhIGZsYXQgcHJvZmlsZSBpcyBnaXZlbiwKLXNpbWlsYXIgdG8gdGhhdCBwcm92aWRlZCBieQotLkJSIHByb2YgKCAxICkgIC4KLVRoaXMgbGlzdGluZyBnaXZlcyB0aGUgdG90YWwgZXhlY3V0aW9uIHRpbWVzLCB0aGUgY2FsbCBjb3VudHMsCi10aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdGhlIGNhbGwgc3BlbnQgaW4gdGhlIHJvdXRpbmUgaXRzZWxmLCBhbmQKLXRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0aGUgY2FsbCBzcGVudCBpbiB0aGUgcm91dGluZSBpdHNlbGYgaW5jbHVkaW5nCi1pdHMgZGVzY2VuZGFudHMuCi0uUFAKLUZpbmFsbHksIGFuIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBpcyBwcm92aWRlZC4KLS5TSCBPUFRJT05TCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZToKLS5UUAotLkIgXC1hCi1zdXBwcmVzc2VzIHRoZSBwcmludGluZyBvZiBzdGF0aWNhbGx5IGRlY2xhcmVkIGZ1bmN0aW9ucy4KLUlmIHRoaXMgb3B0aW9uIGlzIGdpdmVuLCBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRpYyBmdW5jdGlvbgotKGUuZy4sIHRpbWUgc2FtcGxlcywgY2FsbHMgdG8gb3RoZXIgZnVuY3Rpb25zLCBjYWxscyBmcm9tIG90aGVyIGZ1bmN0aW9ucykKLWJlbG9uZ3MgdG8gdGhlIGZ1bmN0aW9uIGxvYWRlZCBqdXN0IGJlZm9yZSB0aGUgc3RhdGljIGZ1bmN0aW9uIGluIHRoZQotXCZgb2JqZmlsZScgZmlsZS4KLS5UUAotLkIgXC1iCi1zdXBwcmVzc2VzIHRoZSBwcmludGluZyBvZiBhIGRlc2NyaXB0aW9uIG9mIGVhY2ggZmllbGQgaW4gdGhlIHByb2ZpbGUuCi0uVFAKLS5CIFwtYwotdGhlIHN0YXRpYyBjYWxsIGdyYXBoIG9mIHRoZSBwcm9ncmFtIGlzIGRpc2NvdmVyZWQgYnkgYSBoZXVyaXN0aWMKLXRoYXQgZXhhbWluZXMgdGhlIHRleHQgc3BhY2Ugb2YgdGhlIG9iamVjdCBmaWxlLgotU3RhdGljLW9ubHkgcGFyZW50cyBvciBjaGlsZHJlbiBhcmUgc2hvd24KLXdpdGggY2FsbCBjb3VudHMgb2YgMC4KLS5UUAotLkJJICJcLWUgIiBuYW1lCi1zdXBwcmVzc2VzIHRoZSBwcmludGluZyBvZiB0aGUgZ3JhcGggcHJvZmlsZSBlbnRyeSBmb3Igcm91dGluZQotLkkgbmFtZQotYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMKLSh1bmxlc3MgdGhleSBoYXZlIG90aGVyIGFuY2VzdG9ycyB0aGF0IGFyZW4ndCBzdXBwcmVzc2VkKS4KLU1vcmUgdGhhbiBvbmUKLS5CIFwtZQotb3B0aW9uIG1heSBiZSBnaXZlbi4KLU9ubHkgb25lCi0uSSBuYW1lCi1tYXkgYmUgZ2l2ZW4gd2l0aCBlYWNoCi0uQiBcLWUKLW9wdGlvbi4KLS5UUAotLkJJICJcLUUgIiBuYW1lCi1zdXBwcmVzc2VzIHRoZSBwcmludGluZyBvZiB0aGUgZ3JhcGggcHJvZmlsZSBlbnRyeSBmb3Igcm91dGluZQotLkkgbmFtZQotKGFuZCBpdHMgZGVzY2VuZGFudHMpIGFzCi0uQiBcLWUgICwKLWFib3ZlLCBhbmQgYWxzbyBleGNsdWRlcyB0aGUgdGltZSBzcGVudCBpbgotLkkgbmFtZQotKGFuZCBpdHMgZGVzY2VuZGFudHMpIGZyb20gdGhlIHRvdGFsIGFuZCBwZXJjZW50YWdlIHRpbWUgY29tcHV0YXRpb25zLgotKEZvciBleGFtcGxlLAotLkJJICJcLUUgIiBtY291bnQKLS5CSSAiXC1FICIgbWNsZWFudXAKLWlzIHRoZSBkZWZhdWx0LikKLS5UUAotLkJJICJcLWYgIiBuYW1lCi1wcmludHMgdGhlIGdyYXBoIHByb2ZpbGUgZW50cnkgb2Ygb25seSB0aGUgc3BlY2lmaWVkIHJvdXRpbmUKLS5JIG5hbWUKLWFuZCBpdHMgZGVzY2VuZGFudHMuCi1Nb3JlIHRoYW4gb25lCi0uQiBcLWYKLW9wdGlvbiBtYXkgYmUgZ2l2ZW4uCi1Pbmx5IG9uZQotLkkgbmFtZQotbWF5IGJlIGdpdmVuIHdpdGggZWFjaAotLkIgXC1mCi1vcHRpb24uCi0uVFAKLS5CSSAiXC1GICIgbmFtZQotcHJpbnRzIHRoZSBncmFwaCBwcm9maWxlIGVudHJ5IG9mIG9ubHkgdGhlIHJvdXRpbmUKLS5JIG5hbWUKLWFuZCBpdHMgZGVzY2VuZGFudHMgKGFzCi0uQiBcLWYgLAotYWJvdmUpIGFuZCBhbHNvIHVzZXMgb25seSB0aGUgdGltZXMgb2YgdGhlIHByaW50ZWQgcm91dGluZXMKLWluIHRvdGFsIHRpbWUgYW5kIHBlcmNlbnRhZ2UgY29tcHV0YXRpb25zLgotTW9yZSB0aGFuIG9uZQotLkIgXC1GCi1vcHRpb24gbWF5IGJlIGdpdmVuLgotT25seSBvbmUKLS5JIG5hbWUKLW1heSBiZSBnaXZlbiB3aXRoIGVhY2gKLS5CIFwtRgotb3B0aW9uLgotVGhlCi0uQiBcLUYKLW9wdGlvbgotb3ZlcnJpZGVzCi10aGUKLS5CIFwtRQotb3B0aW9uLgotLlRQCi0uQkkgIlwtayAiICJmcm9tbmFtZSB0b25hbWUiCi13aWxsIGRlbGV0ZSBhbnkgYXJjcyBmcm9tIHJvdXRpbmUKLS5JIGZyb21uYW1lCi10byByb3V0aW5lCi0uSVIgdG9uYW1lICAuCi1UaGlzIGNhbiBiZSB1c2VkIHRvIGJyZWFrIHVuZGVzaXJlZCBjeWNsZXMuCi1Nb3JlIHRoYW4gb25lCi0uQiBcLWsKLW9wdGlvbiBtYXkgYmUgZ2l2ZW4uCi1Pbmx5IG9uZSBwYWlyIG9mIHJvdXRpbmUgbmFtZXMgbWF5IGJlIGdpdmVuIHdpdGggZWFjaAotLkIgXC1rCi1vcHRpb24uCi0uVFAKLS5CIFwtcwotYSBwcm9maWxlIGZpbGUgYGdtb24uc3VtJyBpcyBwcm9kdWNlZCB0aGF0IHJlcHJlc2VudHMKLXRoZSBzdW0gb2YgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gaW4gYWxsIHRoZSBzcGVjaWZpZWQgcHJvZmlsZSBmaWxlcy4KLVRoaXMgc3VtbWFyeSBwcm9maWxlIGZpbGUgbWF5IGJlIGdpdmVuIHRvIGxhdGVyCi1leGVjdXRpb25zIG9mIGdwcm9mIChwcm9iYWJseSBhbHNvIHdpdGggYQotLkJSIFwtcyAgKQotdG8gYWNjdW11bGF0ZSBwcm9maWxlIGRhdGEgYWNyb3NzIHNldmVyYWwgcnVucyBvZiBhbiBgb2JqZmlsZScgZmlsZS4KLS5UUAotLkIgLXYKLXByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIGdwcm9mLCBhbmQgdGhlbiBleGl0cy4KLS5UUAotLkIgLXoKLWRpc3BsYXlzIHJvdXRpbmVzIHRoYXQgaGF2ZSB6ZXJvIHVzYWdlIChhcyBzaG93biBieSBjYWxsIGNvdW50cwotYW5kIGFjY3VtdWxhdGVkIHRpbWUpLgotVGhpcyBpcyB1c2VmdWwgd2l0aCB0aGUKLS5CIFwtYwotb3B0aW9uIGZvciBkaXNjb3ZlcmluZyB3aGljaCByb3V0aW5lcyB3ZXJlIG5ldmVyIGNhbGxlZC4KLS5QUAotLlNIIEZJTEVTCi0udGEgXHcnZ21vbi5zdW0gJ3UKLWEub3V0CXRoZSBuYW1lbGlzdCBhbmQgdGV4dCBzcGFjZS4KLS5icgotZ21vbi5vdXQJZHluYW1pYyBjYWxsIGdyYXBoIGFuZCBwcm9maWxlLgotLmJyCi1nbW9uLnN1bSBzdW1tYXJpemVkIGR5bmFtaWMgY2FsbCBncmFwaCBhbmQgcHJvZmlsZS4KLS5TSCBTRUUgQUxTTwotLkJSIG1vbml0b3IgKCAzICkgLAotLkJSIHByb2ZpbCAoIDIgKSAsCi0uQlIgY2MgKCAxICkgLAotLkJSIHByb2YgKCAxICkKLS5zcAotYGBBbiBFeGVjdXRpb24gUHJvZmlsZXIgZm9yIE1vZHVsYXIgUHJvZ3JhbXMnJywKLWJ5IFMuIEdyYWhhbSwgUC4gS2Vzc2xlciwgTS4gTWNLdXNpY2s7Ci0uSQotU29mdHdhcmUgXC0gUHJhY3RpY2UgYW5kIEV4cGVyaWVuY2UsCi1Wb2wuIDEzLCBwcC4gNjcxLTY4NSwgMTk4My4KLS5zcAotYGBncHJvZjogQSBDYWxsIEdyYXBoIEV4ZWN1dGlvbiBQcm9maWxlcicnLAotYnkgUy4gR3JhaGFtLCBQLiBLZXNzbGVyLCBNLiBNY0t1c2ljazsKLS5JCi1Qcm9jZWVkaW5ncyBvZiB0aGUgU0lHUExBTiAnODIgU3ltcG9zaXVtIG9uIENvbXBpbGVyIENvbnN0cnVjdGlvbiwKLVNJR1BMQU4gTm90aWNlcywgVm9sLiAxNywgTm8gIDYsIHBwLiAxMjAtMTI2LCBKdW5lIDE5ODIuCi0uU0ggSElTVE9SWQotLkIgR3Byb2YKLWFwcGVhcmVkIGluIDQuMiBCU0QuCi0uU0ggQlVHUwotVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzYW1wbGluZyBpcyBzaG93biwgYnV0IHJlbWFpbnMKLXN0YXRpc3RpY2FsIGF0IGJlc3QuCi1XZSBhc3N1bWUgdGhhdCB0aGUgdGltZSBmb3IgZWFjaCBleGVjdXRpb24gb2YgYSBmdW5jdGlvbgotY2FuIGJlIGV4cHJlc3NlZCBieSB0aGUgdG90YWwgdGltZSBmb3IgdGhlIGZ1bmN0aW9uIGRpdmlkZWQKLWJ5IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLVRodXMgdGhlIHRpbWUgcHJvcGFnYXRlZCBhbG9uZyB0aGUgY2FsbCBncmFwaCBhcmNzIHRvIHRoZSBmdW5jdGlvbidzCi1wYXJlbnRzIGlzIGRpcmVjdGx5IHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQKLWFyYyBpcyB0cmF2ZXJzZWQuCi0uUFAKLVBhcmVudHMgdGhhdCBhcmUgbm90IHRoZW1zZWx2ZXMgcHJvZmlsZWQgd2lsbCBoYXZlIHRoZSB0aW1lIG9mCi10aGVpciBwcm9maWxlZCBjaGlsZHJlbiBwcm9wYWdhdGVkIHRvIHRoZW0sIGJ1dCB0aGV5IHdpbGwgYXBwZWFyCi10byBiZSBzcG9udGFuZW91c2x5IGludm9rZWQgaW4gdGhlIGNhbGwgZ3JhcGggbGlzdGluZywgYW5kIHdpbGwKLW5vdCBoYXZlIHRoZWlyIHRpbWUgcHJvcGFnYXRlZCBmdXJ0aGVyLgotU2ltaWxhcmx5LCBzaWduYWwgY2F0Y2hlcnMsIGV2ZW4gdGhvdWdoIHByb2ZpbGVkLCB3aWxsIGFwcGVhcgotdG8gYmUgc3BvbnRhbmVvdXMgKGFsdGhvdWdoIGZvciBtb3JlIG9ic2N1cmUgcmVhc29ucykuCi1BbnkgcHJvZmlsZWQgY2hpbGRyZW4gb2Ygc2lnbmFsIGNhdGNoZXJzIHNob3VsZCBoYXZlIHRoZWlyIHRpbWVzCi1wcm9wYWdhdGVkIHByb3Blcmx5LCB1bmxlc3MgdGhlIHNpZ25hbCBjYXRjaGVyIHdhcyBpbnZva2VkIGR1cmluZwotdGhlIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZmlsaW5nIHJvdXRpbmUsIGluIHdoaWNoIGNhc2UgYWxsIGlzIGxvc3QuCi0uUFAKLVRoZSBwcm9maWxlZCBwcm9ncmFtIG11c3QgY2FsbAotLkJSIGV4aXQgKCAyICkKLW9yIHJldHVybiBub3JtYWxseSBmb3IgdGhlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byBiZSBzYXZlZAotaW4gdGhlIGBnbW9uLm91dCcgZmlsZS4KZGlmZiAtLWdpdCBhL2dwcm9mL2dwcm9mLmMgYi9ncHJvZi9ncHJvZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjkwNDg3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2dwcm9mLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5OCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImJhc2ljX2Jsb2Nrcy5oIgotI2luY2x1ZGUgImNhbGxfZ3JhcGguaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY2dfcHJpbnQuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImdtb25faW8uaCIKLSNpbmNsdWRlICJoZXJ0ei5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzb3VyY2UuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0KLWNvbnN0IGNoYXIgKndob2FtaTsKLWNvbnN0IGNoYXIgKmZ1bmN0aW9uX21hcHBpbmdfZmlsZTsKLWNvbnN0IGNoYXIgKmFfb3V0X25hbWUgPSBBX09VVE5BTUU7Ci1sb25nIGh6ID0gSFpfV1JPTkc7Ci0KLS8qCi0gKiBEZWZhdWx0IG9wdGlvbnMgdmFsdWVzOgotICovCi1pbnQgZGVidWdfbGV2ZWwgPSAwOwotaW50IG91dHB1dF9zdHlsZSA9IDA7Ci1pbnQgb3V0cHV0X3dpZHRoID0gODA7Ci1ib29sIGJzZF9zdHlsZV9vdXRwdXQgPSBGQUxTRTsKLWJvb2wgZGVtYW5nbGUgPSBUUlVFOwotYm9vbCBkaXNjYXJkX3VuZGVyc2NvcmVzID0gVFJVRTsKLWJvb2wgaWdub3JlX2RpcmVjdF9jYWxscyA9IEZBTFNFOwotYm9vbCBpZ25vcmVfc3RhdGljX2Z1bmNzID0gRkFMU0U7Ci1ib29sIGlnbm9yZV96ZXJvcyA9IFRSVUU7Ci1ib29sIGxpbmVfZ3JhbnVsYXJpdHkgPSBGQUxTRTsKLWJvb2wgcHJpbnRfZGVzY3JpcHRpb25zID0gVFJVRTsKLWJvb2wgcHJpbnRfcGF0aCA9IEZBTFNFOwotYm9vbCBpZ25vcmVfbm9uX2Z1bmN0aW9ucyA9IEZBTFNFOwotRmlsZV9Gb3JtYXQgZmlsZV9mb3JtYXQgPSBGRl9BVVRPOwotCi1ib29sIGZpcnN0X291dHB1dCA9IFRSVUU7Ci0KLWNoYXIgY29weXJpZ2h0W10gPQotIE5fKCJAKCMpIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG5cCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiIpOwotCi1zdGF0aWMgY2hhciAqZ21vbl9uYW1lID0gR01PTk5BTUU7CS8qIHByb2ZpbGUgZmlsZW5hbWUgKi8KLQotYmZkICphYmZkOwotCi0vKgotICogRnVuY3Rpb25zIHRoYXQgZ2V0IGV4Y2x1ZGVkIGJ5IGRlZmF1bHQ6Ci0gKi8KLXN0YXRpYyBjaGFyICpkZWZhdWx0X2V4Y2x1ZGVkX2xpc3RbXSA9Ci17Ci0gICJfZ3Byb2ZfbWNvdW50IiwgIm1jb3VudCIsICJfbWNvdW50IiwgIl9fbWNvdW50IiwgIl9fbWNvdW50X2ludGVybmFsIiwKLSAgIl9fbWNsZWFudXAiLAotICAiPGxvY29yZT4iLCAiPGhpY29yZT4iLAotICAwCi19OwotCi0vKiBDb2RlcyB1c2VkIGZvciB0aGUgbG9uZyBvcHRpb25zIHdpdGggbm8gc2hvcnQgc3lub255bXMuICAxNTAgaXNuJ3QKLSAgIHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotCi0jZGVmaW5lIE9QVElPTl9ERU1BTkdMRQkJKDE1MCkKLSNkZWZpbmUgT1BUSU9OX05PX0RFTUFOR0xFCShPUFRJT05fREVNQU5HTEUgKyAxKQotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsibGluZSIsIG5vX2FyZ3VtZW50LCAwLCAnbCd9LAotICB7Im5vLXN0YXRpYyIsIG5vX2FyZ3VtZW50LCAwLCAnYSd9LAotICB7Imlnbm9yZS1ub24tZnVuY3Rpb25zIiwgbm9fYXJndW1lbnQsIDAsICdEJ30sCi0KLSAgICAvKiBvdXRwdXQgc3R5bGVzOiAqLwotCi0gIHsiYW5ub3RhdGVkLXNvdXJjZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnQSd9LAotICB7Im5vLWFubm90YXRlZC1zb3VyY2UiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ0onfSwKLSAgeyJmbGF0LXByb2ZpbGUiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ3AnfSwKLSAgeyJuby1mbGF0LXByb2ZpbGUiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ1AnfSwKLSAgeyJncmFwaCIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAncSd9LAotICB7Im5vLWdyYXBoIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdRJ30sCi0gIHsiZXhlYy1jb3VudHMiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ0MnfSwKLSAgeyJuby1leGVjLWNvdW50cyIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnWid9LAotICB7ImZ1bmN0aW9uLW9yZGVyaW5nIiwgbm9fYXJndW1lbnQsIDAsICdyJ30sCi0gIHsiZmlsZS1vcmRlcmluZyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUid9LAotICB7ImZpbGUtaW5mbyIsIG5vX2FyZ3VtZW50LCAwLCAnaSd9LAotICB7InN1bSIsIG5vX2FyZ3VtZW50LCAwLCAncyd9LAotCi0gICAgLyogdmFyaW91cyBvcHRpb25zIHRvIGFmZmVjdCBvdXRwdXQ6ICovCi0KLSAgeyJhbGwtbGluZXMiLCBub19hcmd1bWVudCwgMCwgJ3gnfSwKLSAgeyJkZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fREVNQU5HTEV9LAotICB7Im5vLWRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9OT19ERU1BTkdMRX0sCi0gIHsiZGlyZWN0b3J5LXBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwKLSAgeyJkaXNwbGF5LXVudXNlZC1mdW5jdGlvbnMiLCBub19hcmd1bWVudCwgMCwgJ3onfSwKLSAgeyJtaW4tY291bnQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ20nfSwKLSAgeyJwcmludC1wYXRoIiwgbm9fYXJndW1lbnQsIDAsICdMJ30sCi0gIHsic2VwYXJhdGUtZmlsZXMiLCBub19hcmd1bWVudCwgMCwgJ3knfSwKLSAgeyJzdGF0aWMtY2FsbC1ncmFwaCIsIG5vX2FyZ3VtZW50LCAwLCAnYyd9LAotICB7InRhYmxlLWxlbmd0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAndCd9LAotICB7InRpbWUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ24nfSwKLSAgeyJuby10aW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdOJ30sCi0gIHsid2lkdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3cnfSwKLSAgICAvKgotICAgICAqIFRoZXNlIGFyZSBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgb25seS4gIFRoZWlyIGZ1bmN0aW9uYWxpdHkKLSAgICAgKiBpcyBwcm92aWRlZCBieSB0aGUgb3V0cHV0IHN0eWxlIG9wdGlvbnMgYWxyZWFkeToKLSAgICAgKi8KLSAgeyIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2UnfSwKLSAgeyIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0UnfSwKLSAgeyIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2YnfSwKLSAgeyIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnfSwKLSAgeyIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2snfSwKLQotICAgIC8qIG1pc2NlbGxhbmVvdXM6ICovCi0KLSAgeyJicmllZiIsIG5vX2FyZ3VtZW50LCAwLCAnYid9LAotICB7ImRlYnVnIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdkJ30sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7ImZpbGUtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCi0gIHsidHJhZGl0aW9uYWwiLCBub19hcmd1bWVudCwgMCwgJ1QnfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICd2J30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOICh1c2FnZSwgKHN0cmVhbSwgc3RhdHVzKSwgRklMRSAqIHN0cmVhbSBBTkQgaW50IHN0YXR1cykKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy1bYWJjRGhpbExzVHZ3eHl6XV0gWy1bQUNlRWZGSm5OT3BQcVFaXVtuYW1lXV0gWy1JIGRpcnNdXG5cCi0JWy1kW251bV1dIFstayBmcm9tL3RvXSBbLW0gbWluLWNvdW50XSBbLXQgdGFibGUtbGVuZ3RoXVxuXAotCVstLVtuby1dYW5ub3RhdGVkLXNvdXJjZVs9bmFtZV1dIFstLVtuby1dZXhlYy1jb3VudHNbPW5hbWVdXVxuXAotCVstLVtuby1dZmxhdC1wcm9maWxlWz1uYW1lXV0gWy0tW25vLV1ncmFwaFs9bmFtZV1dXG5cCi0JWy0tW25vLV10aW1lPW5hbWVdIFstLWFsbC1saW5lc10gWy0tYnJpZWZdIFstLWRlYnVnWz1sZXZlbF1dXG5cCi0JWy0tZnVuY3Rpb24tb3JkZXJpbmddIFstLWZpbGUtb3JkZXJpbmddXG5cCi0JWy0tZGlyZWN0b3J5LXBhdGg9ZGlyc10gWy0tZGlzcGxheS11bnVzZWQtZnVuY3Rpb25zXVxuXAotCVstLWZpbGUtZm9ybWF0PW5hbWVdIFstLWZpbGUtaW5mb10gWy0taGVscF0gWy0tbGluZV0gWy0tbWluLWNvdW50PW5dXG5cCi0JWy0tbm8tc3RhdGljXSBbLS1wcmludC1wYXRoXSBbLS1zZXBhcmF0ZS1maWxlc11cblwKLQlbLS1zdGF0aWMtY2FsbC1ncmFwaF0gWy0tc3VtXSBbLS10YWJsZS1sZW5ndGg9bGVuXSBbLS10cmFkaXRpb25hbF1cblwKLQlbLS12ZXJzaW9uXSBbLS13aWR0aD1uXSBbLS1pZ25vcmUtbm9uLWZ1bmN0aW9uc11cblwKLQlbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdXG5cCi0JW2ltYWdlLWZpbGVdIFtwcm9maWxlLWZpbGUuLi5dXG4iKSwKLQkgICB3aG9hbWkpOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZG9uZSAoc3RhdHVzKTsKLX0KLQotCi1pbnQKLURFRlVOIChtYWluLCAoYXJnYywgYXJndiksIGludCBhcmdjIEFORCBjaGFyICoqYXJndikKLXsKLSAgY2hhciAqKnNwLCAqc3RyOwotICBTeW0gKipjZyA9IDA7Ci0gIGludCBjaCwgdXNlcl9zcGVjaWZpZWQgPSAwOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgd2hvYW1pID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lICh3aG9hbWkpOwotCi0gIHdoaWxlICgoY2ggPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwKLQkiYUE6OmJCY0NkRDo6ZTpFOmY6RjpoaUk6Sjo6azpsTG06bjo6Tjo6TzpwOjpQOjpxOjpROjpzdDpUdnc6eHl6Wjo6IiwKLQkJCSAgICBsb25nX29wdGlvbnMsIDApKQotCSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAnYSc6Ci0JICBpZ25vcmVfc3RhdGljX2Z1bmNzID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ0EnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9BTk5PKTsKLQkgICAgfQotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9BTk5PVEFURURfU09VUkNFOwotCSAgYnJlYWs7Ci0JY2FzZSAnYic6Ci0JICBwcmludF9kZXNjcmlwdGlvbnMgPSBGQUxTRTsKLQkgIGJyZWFrOwotCWNhc2UgJ0InOgotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0NBTExfR1JBUEg7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9DQUxMX0dSQVBIOwotCSAgYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JICBpZ25vcmVfZGlyZWN0X2NhbGxzID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ0MnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9FWEVDKTsKLQkgICAgfQotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0VYRUNfQ09VTlRTOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfRVhFQ19DT1VOVFM7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBkZWJ1Z19sZXZlbCB8PSBhdG9pIChvcHRhcmcpOwotCSAgICAgIGRlYnVnX2xldmVsIHw9IEFOWURFQlVHOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBkZWJ1Z19sZXZlbCA9IH4wOwotCSAgICB9Ci0JICBEQkcgKEFOWURFQlVHLCBwcmludGYgKCJbbWFpbl0gZGVidWctbGV2ZWw9MHgleFxuIiwgZGVidWdfbGV2ZWwpKTsKLSNpZm5kZWYgREVCVUcKLQkgIHByaW50ZiAoXygiJXM6IGRlYnVnZ2luZyBub3Qgc3VwcG9ydGVkOyAtZCBpZ25vcmVkXG4iKSwgd2hvYW1pKTsKLSNlbmRpZgkvKiBERUJVRyAqLwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICBpZ25vcmVfbm9uX2Z1bmN0aW9ucyA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICdFJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9USU1FKTsKLQljYXNlICdlJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9HUkFQSCk7Ci0JICBicmVhazsKLQljYXNlICdGJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9USU1FKTsKLQljYXNlICdmJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9HUkFQSCk7Ci0JICBicmVhazsKLQljYXNlICdnJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9GTEFUKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0cnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0ZMQVQpOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQljYXNlICdpJzoKLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9HTU9OX0lORk87Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9HTU9OX0lORk87Ci0JICBicmVhazsKLQljYXNlICdJJzoKLQkgIHNlYXJjaF9saXN0X2FwcGVuZCAoJnNyY19zZWFyY2hfbGlzdCwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0onOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9BTk5PKTsKLQkgICAgICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfQU5OT1RBVEVEX1NPVVJDRTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3V0cHV0X3N0eWxlICY9IH5TVFlMRV9BTk5PVEFURURfU09VUkNFOwotCSAgICB9Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9BTk5PVEFURURfU09VUkNFOwotCSAgYnJlYWs7Ci0JY2FzZSAnayc6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfQVJDUyk7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIGxpbmVfZ3JhbnVsYXJpdHkgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAnTCc6Ci0JICBwcmludF9wYXRoID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ20nOgotCSAgYmJfbWluX2NhbGxzID0gKHVuc2lnbmVkIGxvbmcpIHN0cnRvdWwgKG9wdGFyZywgKGNoYXIgKiopIE5VTEwsIDEwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ24nOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX1RJTUUpOwotCSAgYnJlYWs7Ci0JY2FzZSAnTic6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfVElNRSk7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQkgIHN3aXRjaCAob3B0YXJnWzBdKQotCSAgICB7Ci0JICAgIGNhc2UgJ2EnOgotCSAgICAgIGZpbGVfZm9ybWF0ID0gRkZfQVVUTzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnbSc6Ci0JICAgICAgZmlsZV9mb3JtYXQgPSBGRl9NQUdJQzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnYic6Ci0JICAgICAgZmlsZV9mb3JtYXQgPSBGRl9CU0Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJzQnOgotCSAgICAgIGZpbGVfZm9ybWF0ID0gRkZfQlNENDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3AnOgotCSAgICAgIGZpbGVfZm9ybWF0ID0gRkZfUFJPRjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bmtub3duIGZpbGUgZm9ybWF0ICVzXG4iKSwKLQkJICAgICAgIG9wdGFyZywgd2hvYW1pKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAncCc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0ZMQVQpOwotCSAgICB9Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRkxBVF9QUk9GSUxFOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfRkxBVF9QUk9GSUxFOwotCSAgYnJlYWs7Ci0JY2FzZSAnUCc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0ZMQVQpOwotCSAgICAgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9GTEFUX1BST0ZJTEU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG91dHB1dF9zdHlsZSAmPSB+U1RZTEVfRkxBVF9QUk9GSUxFOwotCSAgICB9Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9GTEFUX1BST0ZJTEU7Ci0JICBicmVhazsKLQljYXNlICdxJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY2hyIChvcHRhcmcsICcvJykpCi0JCXsKLQkJICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfQVJDUyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfR1JBUEgpOwotCQl9Ci0JICAgIH0KLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9DQUxMX0dSQVBIOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfQ0FMTF9HUkFQSDsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0ZVTkNUSU9OX09SREVSOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfRlVOQ1RJT05fT1JERVI7Ci0JICBicmVhazsKLQljYXNlICdSJzoKLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9GSUxFX09SREVSOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfRklMRV9PUkRFUjsKLQkgIGZ1bmN0aW9uX21hcHBpbmdfZmlsZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ1EnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIGlmIChzdHJjaHIgKG9wdGFyZywgJy8nKSkKLQkJewotCQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9BUkNTKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9HUkFQSCk7Ci0JCX0KLQkgICAgICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfQ0FMTF9HUkFQSDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3V0cHV0X3N0eWxlICY9IH5TVFlMRV9DQUxMX0dSQVBIOwotCSAgICB9Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9DQUxMX0dSQVBIOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfU1VNTUFSWV9GSUxFOwotCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfU1VNTUFSWV9GSUxFOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBiYl90YWJsZV9sZW5ndGggPSBhdG9pIChvcHRhcmcpOwotCSAgaWYgKGJiX3RhYmxlX2xlbmd0aCA8IDApCi0JICAgIHsKLQkgICAgICBiYl90YWJsZV9sZW5ndGggPSAwOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdUJzoKLQkgIGJzZF9zdHlsZV9vdXRwdXQgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICAvKiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuICAqLwotCSAgcHJpbnRmIChfKCJHTlUgZ3Byb2YgJXNcbiIpLCBWRVJTSU9OKTsKLQkgIHByaW50ZiAoXygiQmFzZWQgb24gQlNEIGdwcm9mLCBjb3B5cmlnaHQgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG4iKSk7Ci0JICBwcmludGYgKF8oIlwKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIikpOwotCSAgZG9uZSAoMCk7Ci0JY2FzZSAndyc6Ci0JICBvdXRwdXRfd2lkdGggPSBhdG9pIChvcHRhcmcpOwotCSAgaWYgKG91dHB1dF93aWR0aCA8IDEpCi0JICAgIHsKLQkgICAgICBvdXRwdXRfd2lkdGggPSAxOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGJiX2Fubm90YXRlX2FsbF9saW5lcyA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICd5JzoKLQkgIGNyZWF0ZV9hbm5vdGF0aW9uX2ZpbGVzID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ3onOgotCSAgaWdub3JlX3plcm9zID0gRkFMU0U7Ci0JICBicmVhazsKLQljYXNlICdaJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfRVhFQyk7Ci0JICAgICAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0VYRUNfQ09VTlRTOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvdXRwdXRfc3R5bGUgJj0gflNUWUxFX0VYRUNfQ09VTlRTOwotCSAgICB9Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9BTk5PVEFURURfU09VUkNFOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fREVNQU5HTEU6Ci0JICBkZW1hbmdsZSA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19ERU1BTkdMRToKLQkgIGRlbWFuZ2xlID0gRkFMU0U7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JfQotICAgIH0KLQotICAvKiBEb24ndCBhbGxvdyBib3RoIG9yZGVyaW5nIG9wdGlvbnMsIHRoZXkgbW9kaWZ5IHRoZSBhcmMgZGF0YSBpbi1wbGFjZS4gICovCi0gIGlmICgodXNlcl9zcGVjaWZpZWQgJiBTVFlMRV9GVU5DVElPTl9PUkRFUikKLSAgICAgICYmICh1c2VyX3NwZWNpZmllZCAmIFNUWUxFX0ZJTEVfT1JERVIpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVycixfKCJcCi0lczogT25seSBvbmUgb2YgLS1mdW5jdGlvbi1vcmRlcmluZyBhbmQgLS1maWxlLW9yZGVyaW5nIG1heSBiZSBzcGVjaWZpZWQuXG4iKSwKLQkgICAgICAgd2hvYW1pKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiAtLXN1bSBpbXBsaWVzIC0tbGluZSwgb3RoZXJ3aXNlIHdlJ2QgbG9zZSBiLWIgY291bnRzIGluIGdtb24uc3VtICovCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9TVU1NQVJZX0ZJTEUpCi0gICAgewotICAgICAgbGluZV9ncmFudWxhcml0eSA9IDE7Ci0gICAgfQotCi0gIC8qIGFwcGVuZCB2YWx1ZSBvZiBHUFJPRl9QQVRIIHRvIHNvdXJjZSBzZWFyY2ggbGlzdCBpZiBzZXQ6ICovCi0gIHN0ciA9IChjaGFyICopIGdldGVudiAoIkdQUk9GX1BBVEgiKTsKLSAgaWYgKHN0cikKLSAgICB7Ci0gICAgICBzZWFyY2hfbGlzdF9hcHBlbmQgKCZzcmNfc2VhcmNoX2xpc3QsIHN0cik7Ci0gICAgfQotCi0gIGlmIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIGFfb3V0X25hbWUgPSBhcmd2W29wdGluZCsrXTsKLSAgICB9Ci0gIGlmIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIGdtb25fbmFtZSA9IGFyZ3Zbb3B0aW5kKytdOwotICAgIH0KLQotICAvKgotICAgKiBUdXJuIG9mZiBkZWZhdWx0IGZ1bmN0aW9uczoKLSAgICovCi0gIGZvciAoc3AgPSAmZGVmYXVsdF9leGNsdWRlZF9saXN0WzBdOyAqc3A7IHNwKyspCi0gICAgewotICAgICAgc3ltX2lkX2FkZCAoKnNwLCBFWENMX1RJTUUpOwotICAgICAgc3ltX2lkX2FkZCAoKnNwLCBFWENMX0dSQVBIKTsKLSNpZmRlZiBfX2FscGhhX18KLSAgICAgIHN5bV9pZF9hZGQgKCpzcCwgRVhDTF9GTEFUKTsKLSNlbmRpZgotICAgIH0KLQotICAvKgotICAgKiBGb3IgbGluZS1ieS1saW5lIHByb2ZpbGluZywgYWxzbyB3YW50IHRvIGtlZXAgdGhvc2UKLSAgICogZnVuY3Rpb25zIG9mZiB0aGUgZmxhdCBwcm9maWxlOgotICAgKi8KLSAgaWYgKGxpbmVfZ3JhbnVsYXJpdHkpCi0gICAgewotICAgICAgZm9yIChzcCA9ICZkZWZhdWx0X2V4Y2x1ZGVkX2xpc3RbMF07ICpzcDsgc3ArKykKLQl7Ci0JICBzeW1faWRfYWRkICgqc3AsIEVYQ0xfRkxBVCk7Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBSZWFkIHN5bWJvbCB0YWJsZSBmcm9tIGNvcmUgZmlsZToKLSAgICovCi0gIGNvcmVfaW5pdCAoYV9vdXRfbmFtZSk7Ci0KLSAgLyoKLSAgICogSWYgd2Ugc2hvdWxkIGlnbm9yZSBkaXJlY3QgZnVuY3Rpb24gY2FsbHMsIHdlIG5lZWQgdG8gbG9hZAotICAgKiB0byBjb3JlJ3MgdGV4dC1zcGFjZToKLSAgICovCi0gIGlmIChpZ25vcmVfZGlyZWN0X2NhbGxzKQotICAgIHsKLSAgICAgIGNvcmVfZ2V0X3RleHRfc3BhY2UgKGNvcmVfYmZkKTsKLSAgICB9Ci0KLSAgLyoKLSAgICogQ3JlYXRlIHN5bWJvbHMgZnJvbSBjb3JlIGltYWdlOgotICAgKi8KLSAgaWYgKGxpbmVfZ3JhbnVsYXJpdHkpCi0gICAgewotICAgICAgY29yZV9jcmVhdGVfbGluZV9zeW1zIChjb3JlX2JmZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyAoY29yZV9iZmQpOwotICAgIH0KLQotICAvKgotICAgKiBUcmFuc2xhdGUgc3ltIHNwZWNzIGludG8gc3ltczoKLSAgICovCi0gIHN5bV9pZF9wYXJzZSAoKTsKLQotICBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfUFJPRikKLSAgICB7Ci0jaWZkZWYgUFJPRl9TVVBQT1JUX0lNUExFTUVOVEVECi0gICAgICAvKgotICAgICAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IG1vbi5vdXQgZmlsZShzKToKLSAgICAgICAqLwotICAgICAgZG8KLQl7Ci0JICBtb25fb3V0X3JlYWQgKGdtb25fbmFtZSk7Ci0JICBpZiAob3B0aW5kIDwgYXJnYykKLQkgICAgewotCSAgICAgIGdtb25fbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKLQkgICAgfQotCX0KLSAgICAgIHdoaWxlIChvcHRpbmQrKyA8IGFyZ2MpOwotI2Vsc2UKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgICAgXygiJXM6IHNvcnJ5LCBmaWxlIGZvcm1hdCBgcHJvZicgaXMgbm90IHlldCBzdXBwb3J0ZWRcbiIpLAotCSAgICAgICB3aG9hbWkpOwotICAgICAgZG9uZSAoMSk7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGdtb24ub3V0IGZpbGUocyk6Ci0gICAgICAgKi8KLSAgICAgIGRvCi0JewotCSAgZ21vbl9vdXRfcmVhZCAoZ21vbl9uYW1lKTsKLQkgIGlmIChvcHRpbmQgPCBhcmdjKQotCSAgICB7Ci0JICAgICAgZ21vbl9uYW1lID0gYXJndltvcHRpbmRdOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKG9wdGluZCsrIDwgYXJnYyk7Ci0gICAgfQotCi0gIC8qCi0gICAqIElmIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IG91dHB1dCBzdHlsZSwgdHJ5IHRvIGd1ZXNzIHNvbWV0aGluZwotICAgKiByZWFzb25hYmxlOgotICAgKi8KLSAgaWYgKG91dHB1dF9zdHlsZSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChnbW9uX2lucHV0ICYgKElOUFVUX0hJU1RPR1JBTSB8IElOUFVUX0NBTExfR1JBUEgpKQotCXsKLQkgIG91dHB1dF9zdHlsZSA9IFNUWUxFX0ZMQVRfUFJPRklMRSB8IFNUWUxFX0NBTExfR1JBUEg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG91dHB1dF9zdHlsZSA9IFNUWUxFX0VYRUNfQ09VTlRTOwotCX0KLSAgICAgIG91dHB1dF9zdHlsZSAmPSB+dXNlcl9zcGVjaWZpZWQ7Ci0gICAgfQotCi0gIC8qCi0gICAqIER1bXAgYSBnbW9uLnN1bSBmaWxlIGlmIHJlcXVlc3RlZCAoYmVmb3JlIGFueSBvdGhlciBwcm9jZXNzaW5nISk6Ci0gICAqLwotICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfU1VNTUFSWV9GSUxFKQotICAgIHsKLSAgICAgIGdtb25fb3V0X3dyaXRlIChHTU9OU1VNKTsKLSAgICB9Ci0KLSAgaWYgKGdtb25faW5wdXQgJiBJTlBVVF9ISVNUT0dSQU0pCi0gICAgewotICAgICAgaGlzdF9hc3NpZ25fc2FtcGxlcyAoKTsKLSAgICB9Ci0KLSAgaWYgKGdtb25faW5wdXQgJiBJTlBVVF9DQUxMX0dSQVBIKQotICAgIHsKLSAgICAgIGNnID0gY2dfYXNzZW1ibGUgKCk7Ci0gICAgfQotCi0gIC8qIGRvIHNvbWUgc2ltcGxlIHNhbml0eSBjaGVja3M6ICovCi0KLSAgaWYgKChvdXRwdXRfc3R5bGUgJiBTVFlMRV9GTEFUX1BST0ZJTEUpCi0gICAgICAmJiAhKGdtb25faW5wdXQgJiBJTlBVVF9ISVNUT0dSQU0pKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGdtb24ub3V0IGZpbGUgaXMgbWlzc2luZyBoaXN0b2dyYW1cbiIpLCB3aG9hbWkpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmICgob3V0cHV0X3N0eWxlICYgU1RZTEVfQ0FMTF9HUkFQSCkgJiYgIShnbW9uX2lucHV0ICYgSU5QVVRfQ0FMTF9HUkFQSCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICBfKCIlczogZ21vbi5vdXQgZmlsZSBpcyBtaXNzaW5nIGNhbGwtZ3JhcGggZGF0YVxuIiksIHdob2FtaSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogb3V0cHV0IHdoYXRldmVyIHVzZXIgd2hpc2hlcyB0byBzZWU6ICovCi0KLSAgaWYgKGNnICYmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9DQUxMX0dSQVBIKSAmJiBic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGNnX3ByaW50IChjZyk7CQkvKiBwcmludCB0aGUgZHluYW1pYyBwcm9maWxlICovCi0gICAgfQotCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9GTEFUX1BST0ZJTEUpCi0gICAgewotICAgICAgaGlzdF9wcmludCAoKTsJCS8qIHByaW50IHRoZSBmbGF0IHByb2ZpbGUgKi8KLSAgICB9Ci0KLSAgaWYgKGNnICYmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9DQUxMX0dSQVBIKSkKLSAgICB7Ci0gICAgICBpZiAoIWJzZF9zdHlsZV9vdXRwdXQpCi0JewotCSAgY2dfcHJpbnQgKGNnKTsJLyogcHJpbnQgdGhlIGR5bmFtaWMgcHJvZmlsZSAqLwotCX0KLSAgICAgIGNnX3ByaW50X2luZGV4ICgpOwotICAgIH0KLQotICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfRVhFQ19DT1VOVFMpCi0gICAgewotICAgICAgcHJpbnRfZXhlY19jb3VudHMgKCk7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9BTk5PVEFURURfU09VUkNFKQotICAgIHsKLSAgICAgIHByaW50X2Fubm90YXRlZF9zb3VyY2UgKCk7Ci0gICAgfQotICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfRlVOQ1RJT05fT1JERVIpCi0gICAgewotICAgICAgY2dfcHJpbnRfZnVuY3Rpb25fb3JkZXJpbmcgKCk7Ci0gICAgfQotICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfRklMRV9PUkRFUikKLSAgICB7Ci0gICAgICBjZ19wcmludF9maWxlX29yZGVyaW5nICgpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLWRvbmUgKHN0YXR1cykKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2dwcm9mLmggYi9ncHJvZi9ncHJvZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjYyYWVlLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2dwcm9mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogICAgICBAKCMpZ3Byb2YuaCAgICAgNS45IChCZXJrZWxleSkgNi8xLzkwCi0gKi8KLSNpZm5kZWYgZ3Byb2ZfaAotI2RlZmluZSBncHJvZl9oCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBJbmNsdWRlIHRoZSBCRkQgc3lzZGVwLmggZmlsZS4gICovCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLS8qIFVuZGVmaW5lIHRoZSBCRkQgUEFDS0FHRSBhbmQgVkVSU0lPTiBtYWNyb3MgYmVmb3JlIGluY2x1ZGluZyB0aGUKLSAgIGdwcm9mIGNvbmZpZy5oIGZpbGUuICAqLwotI3VuZGVmIFBBQ0tBR0UKLSN1bmRlZiBWRVJTSU9OCi0vKiBBbHNvIHVuZGVmaW5lIEJGRCdzIGBfJyBtYWNybzsgd2UgaGF2ZSBvdXIgb3duIGRlZmluaXRpb24uICAqLwotI3VuZGVmIF8KLQotI2luY2x1ZGUgImdjb25maWcuaCIKLQotI2lmbmRlZiBNSU4KLSNkZWZpbmUgTUlOKGEsYikJKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotI2lmbmRlZiBNQVgKLSNkZWZpbmUgTUFYKGEsYikJKChhKSA+IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi0vKiBBSVggZGVmaW5lcyBoeiBhcyBhIG1hY3JvLiAgKi8KLSN1bmRlZiBoegotCi0jaWZuZGVmIFBBVEhfTUFYCi0jZGVmaW5lIFBBVEhfTUFYCTEwMjQKLSNlbmRpZgotCi0jZGVmaW5lCUFfT1VUTkFNRQkiYS5vdXQiCS8qIGRlZmF1bHQgY29yZSBmaWxlbmFtZSAqLwotI2RlZmluZQlHTU9OTkFNRQkiZ21vbi5vdXQiCS8qIGRlZmF1bHQgcHJvZmlsZSBmaWxlbmFtZSAqLwotI2RlZmluZQlHTU9OU1VNCQkiZ21vbi5zdW0iCS8qIHByb2ZpbGUgc3VtbWFyeSBmaWxlbmFtZSAqLwotCi0jaWZkZWYgSEFWRV9MT0NBTEVfSAotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX05MUwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jIGRlZmluZSBfKFN0cmluZykgZ2V0dGV4dCAoU3RyaW5nKQotIyBpZmRlZiBnZXR0ZXh0X25vb3AKLSMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQotIyBlbHNlCi0jICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotIyBlbmRpZgotI2Vsc2UKLS8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCi0jIGRlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKLSMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCi0KLQotLyoKLSAqIFRoZXNlIG1heSBhbHJlYWR5IGJlIGRlZmluZWQgb24gc29tZSBzeXN0ZW1zLiAgV2UgY291bGQgcHJvYmFibHkKLSAqIGp1c3QgdXNlIHRoZSBCRkQgdmVyc2lvbnMgb2YgdGhlc2UsIHNpbmNlIEJGRCBoYXMgYWxyZWFkeSBkZWFsdAotICogd2l0aCB0aGlzIHByb2JsZW0uCi0gKi8KLSN1bmRlZiBGQUxTRQotI2RlZmluZQlGQUxTRQkwCi0jdW5kZWYgVFJVRQotI2RlZmluZQlUUlVFCTEKLQotI2RlZmluZSBTVFlMRV9GTEFUX1BST0ZJTEUJKDE8PDApCi0jZGVmaW5lIFNUWUxFX0NBTExfR1JBUEgJKDE8PDEpCi0jZGVmaW5lIFNUWUxFX1NVTU1BUllfRklMRQkoMTw8MikKLSNkZWZpbmUgU1RZTEVfRVhFQ19DT1VOVFMJKDE8PDMpCi0jZGVmaW5lIFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0UJKDE8PDQpCi0jZGVmaW5lIFNUWUxFX0dNT05fSU5GTwkJKDE8PDUpCi0jZGVmaW5lIFNUWUxFX0ZVTkNUSU9OX09SREVSCSgxPDw2KQotI2RlZmluZSBTVFlMRV9GSUxFX09SREVSCSgxPDw3KQotCi0jZGVmaW5lCUFOWURFQlVHCSgxPDwwKQkvKiAgICAxICovCi0jZGVmaW5lCURGTkRFQlVHCSgxPDwxKQkvKiAgICAyICovCi0jZGVmaW5lCUNZQ0xFREVCVUcJKDE8PDIpCS8qICAgIDQgKi8KLSNkZWZpbmUJQVJDREVCVUcJKDE8PDMpCS8qICAgIDggKi8KLSNkZWZpbmUJVEFMTFlERUJVRwkoMTw8NCkJLyogICAxNiAqLwotI2RlZmluZQlUSU1FREVCVUcJKDE8PDUpCS8qICAgMzIgKi8KLSNkZWZpbmUJU0FNUExFREVCVUcJKDE8PDYpCS8qICAgNjQgKi8KLSNkZWZpbmUJQU9VVERFQlVHCSgxPDw3KQkvKiAgMTI4ICovCi0jZGVmaW5lCUNBTExERUJVRwkoMTw8OCkJLyogIDI1NiAqLwotI2RlZmluZQlMT09LVVBERUJVRwkoMTw8OSkJLyogIDUxMiAqLwotI2RlZmluZQlQUk9QREVCVUcJKDE8PDEwKQkvKiAxMDI0ICovCi0jZGVmaW5lIEJCREVCVUcJCSgxPDwxMSkJLyogMjA0OCAqLwotI2RlZmluZSBJRERFQlVHCQkoMTw8MTIpCS8qIDQwOTYgKi8KLSNkZWZpbmUgU1JDREVCVUcJKDE8PDEzKQkvKiA4MTkyICovCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBEQkcobCxzKQlpZiAoZGVidWdfbGV2ZWwgJiAobCkpIHtzO30KLSNlbHNlCi0jZGVmaW5lIERCRyhsLHMpCi0jZW5kaWYKLQotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBGRl9BVVRPID0gMCwgRkZfTUFHSUMsIEZGX0JTRCwgRkZfQlNENDQsIEZGX1BST0YKLSAgfQotRmlsZV9Gb3JtYXQ7Ci0KLXR5cGVkZWYgaW50IGJvb2w7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgVU5JVFsyXTsJLyogdW5pdCBvZiBwcm9maWxpbmcgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKndob2FtaTsJLyogY29tbWFuZC1uYW1lLCBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KLWV4dGVybiBjb25zdCBjaGFyICpmdW5jdGlvbl9tYXBwaW5nX2ZpbGU7IC8qIGZpbGUgbWFwcGluZyBmdW5jdGlvbnMgdG8gZmlsZXMgKi8KLWV4dGVybiBjb25zdCBjaGFyICphX291dF9uYW1lOwkvKiBjb3JlIGZpbGVuYW1lICovCi1leHRlcm4gbG9uZyBoejsJCQkvKiB0aWNrcyBwZXIgc2Vjb25kICovCi0KLS8qCi0gKiBDb21tYW5kLWxpbmUgb3B0aW9uczoKLSAqLwotZXh0ZXJuIGludCBkZWJ1Z19sZXZlbDsJCS8qIGRlYnVnIGxldmVsICovCi1leHRlcm4gaW50IG91dHB1dF9zdHlsZTsKLWV4dGVybiBpbnQgb3V0cHV0X3dpZHRoOwkvKiBjb250cm9scyBjb2x1bW4gd2lkdGggaW4gaW5kZXggKi8KLWV4dGVybiBib29sIGJzZF9zdHlsZV9vdXRwdXQ7CS8qIGFzIG9wcG9zZWQgdG8gRlNGIHN0eWxlIG91dHB1dCAqLwotZXh0ZXJuIGJvb2wgZGVtYW5nbGU7CQkvKiBkZW1hbmdsZSBzeW1ib2wgbmFtZXM/ICovCi1leHRlcm4gYm9vbCBkaXNjYXJkX3VuZGVyc2NvcmVzOwkvKiBkaXNjYXJkIGxlYWRpbmcgdW5kZXJzY29yZXM/ICovCi1leHRlcm4gYm9vbCBpZ25vcmVfZGlyZWN0X2NhbGxzOwkvKiBkb24ndCBjb3VudCBkaXJlY3QgY2FsbHMgKi8KLWV4dGVybiBib29sIGlnbm9yZV9zdGF0aWNfZnVuY3M7CS8qIHN1cHByZXNzIHN0YXRpYyBmdW5jdGlvbnMgKi8KLWV4dGVybiBib29sIGlnbm9yZV96ZXJvczsJLyogaWdub3JlIHVudXNlZCBzeW1ib2xzL2ZpbGVzICovCi1leHRlcm4gYm9vbCBsaW5lX2dyYW51bGFyaXR5OwkvKiBmdW5jdGlvbiBvciBsaW5lIGdyYW51bGFyaXR5PyAqLwotZXh0ZXJuIGJvb2wgcHJpbnRfZGVzY3JpcHRpb25zOwkvKiBvdXRwdXQgcHJvZmlsZSBkZXNjcmlwdGlvbiAqLwotZXh0ZXJuIGJvb2wgcHJpbnRfcGF0aDsJCS8qIHByaW50IHBhdGggb3IganVzdCBmaWxlbmFtZT8gKi8KLWV4dGVybiBib29sIGlnbm9yZV9ub25fZnVuY3Rpb25zOy8qIElnbm9yZSBub24tZnVuY3Rpb24gc3ltYm9scy4gICovCi0KLWV4dGVybiBGaWxlX0Zvcm1hdCBmaWxlX2Zvcm1hdDsJLyogcmVxdWVzdGVkIGZpbGUgZm9ybWF0ICovCi0KLWV4dGVybiBib29sIGZpcnN0X291dHB1dDsJLyogbm8gb3V0cHV0IHNvIGZhcj8gKi8KLQotZXh0ZXJuIHZvaWQgZG9uZSBQQVJBTVMgKChpbnQgc3RhdHVzKSk7Ci0KLSNlbmRpZiAvKiBncHJvZl9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9ncHJvZi50ZXhpIGIvZ3Byb2YvZ3Byb2YudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2MDZiNC4uMDAwMDAwMAotLS0gYS9ncHJvZi9ncHJvZi50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjAyOCArMCwwIEBACi1caW5wdXQgdGV4aW5mbyBAYyAtKi10ZXhpbmZvLSotCi1Ac2V0ZmlsZW5hbWUgZ3Byb2YuaW5mbwotQHNldHRpdGxlIEdOVSBncHJvZgotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotCi1AaWZpbmZvCi1AYyBUaGlzIGlzIGEgZGlyLmluZm8gZnJhZ21lbnQgdG8gc3VwcG9ydCBzZW1pLWF1dG9tYXRlZCBhZGRpdGlvbiBvZgotQGMgbWFudWFscyB0byBhbiBpbmZvIHRyZWUuICB6b29AY3lnbnVzLmNvbSBpcyBkZXZlbG9waW5nIHRoaXMgZmFjaWxpdHkuCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBncHJvZjogKGdwcm9mKS4gICAgICAgICAgICAgICAgUHJvZmlsaW5nIHlvdXIgcHJvZ3JhbSdzIGV4ZWN1dGlvbgotRU5ELUlORk8tRElSLUVOVFJZCi1AZW5kIGZvcm1hdAotQGVuZCBpZmluZm8KLQotQGlmaW5mbwotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgZ3Byb2YgcHJvZmlsZXIgb2YgdGhlIEdOVSBzeXN0ZW0uCi0KLUNvcHlyaWdodCAoQykgMTk4OCwgMTk5MiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZXggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotCi1AZW5kIGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi0KLUBmaW5hbG91dAotQHNtYWxsYm9vawotCi1AdGl0bGVwYWdlCi1AdGl0bGUgR05VIGdwcm9mCi1Ac3VidGl0bGUgVGhlIEBzY3tnbnV9IFByb2ZpbGVyIAotQGF1dGhvciBKYXkgRmVubGFzb24gYW5kIFJpY2hhcmQgU3RhbGxtYW4KLQotQHBhZ2UKLQotVGhpcyBtYW51YWwgZGVzY3JpYmVzIHRoZSBAc2N7Z251fSBwcm9maWxlciwgQGNvZGV7Z3Byb2Z9LCBhbmQgaG93IHlvdQotY2FuIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hpY2ggcGFydHMgb2YgYSBwcm9ncmFtIGFyZSB0YWtpbmcgbW9zdCBvZiB0aGUKLWV4ZWN1dGlvbiB0aW1lLiAgV2UgYXNzdW1lIHRoYXQgeW91IGtub3cgaG93IHRvIHdyaXRlLCBjb21waWxlLCBhbmQKLWV4ZWN1dGUgcHJvZ3JhbXMuICBAc2N7Z251fSBAY29kZXtncHJvZn0gd2FzIHdyaXR0ZW4gYnkgSmF5IEZlbmxhc29uLgotCi1UaGlzIG1hbnVhbCB3YXMgZWRpdGVkIEphbnVhcnkgMTk5MyBieSBKZWZmcmV5IE9zaWVyCi1hbmQgdXBkYXRlZCBTZXB0ZW1iZXIgMTk5NyBieSBCcmVudCBCYWNjYWxhLgotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5ODgsIDE5OTIsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIGFzIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLQotQGVuZCB0aXRsZXBhZ2UKLQotQGlmaW5mbwotQG5vZGUgVG9wCi1AdG9wIFByb2ZpbGluZyBhIFByb2dyYW06IFdoZXJlIERvZXMgSXQgU3BlbmQgSXRzIFRpbWU/Ci0KLVRoaXMgbWFudWFsIGRlc2NyaWJlcyB0aGUgQHNje2dudX0gcHJvZmlsZXIsIEBjb2Rle2dwcm9mfSwgYW5kIGhvdyB5b3UKLWNhbiB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoaWNoIHBhcnRzIG9mIGEgcHJvZ3JhbSBhcmUgdGFraW5nIG1vc3Qgb2YgdGhlCi1leGVjdXRpb24gdGltZS4gIFdlIGFzc3VtZSB0aGF0IHlvdSBrbm93IGhvdyB0byB3cml0ZSwgY29tcGlsZSwgYW5kCi1leGVjdXRlIHByb2dyYW1zLiAgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IHdhcyB3cml0dGVuIGJ5IEpheSBGZW5sYXNvbi4KLQotVGhpcyBtYW51YWwgd2FzIHVwZGF0ZWQgQXVndXN0IDE5OTcgYnkgQnJlbnQgQmFjY2FsYS4KLQotQG1lbnUKLSogSW50cm9kdWN0aW9uOjogICAgICAgIFdoYXQgcHJvZmlsaW5nIG1lYW5zLCBhbmQgd2h5IGl0IGlzIHVzZWZ1bC4KLQotKiBDb21waWxpbmc6OiAgICAgICAgICAgSG93IHRvIGNvbXBpbGUgeW91ciBwcm9ncmFtIGZvciBwcm9maWxpbmcuCi0qIEV4ZWN1dGluZzo6ICAgICAgICAgICBFeGVjdXRpbmcgeW91ciBwcm9ncmFtIHRvIGdlbmVyYXRlIHByb2ZpbGUgZGF0YQotKiBJbnZva2luZzo6ICAgICAgICAgICAgSG93IHRvIHJ1biBAY29kZXtncHJvZn0sIGFuZCBpdHMgb3B0aW9ucwotCi0qIE91dHB1dDo6CQlJbnRlcnByZXRpbmcgQGNvZGV7Z3Byb2Z9J3Mgb3V0cHV0Ci0KLSogSW5hY2N1cmFjeTo6ICAgICAgICAgIFBvdGVudGlhbCBwcm9ibGVtcyB5b3Ugc2hvdWxkIGJlIGF3YXJlIG9mCi0qIEhvdyBkbyBJPzo6ICAgICAgICAgICBBbnN3ZXJzIHRvIGNvbW1vbiBxdWVzdGlvbnMKLSogSW5jb21wYXRpYmlsaXRpZXM6OiAgIChiZXR3ZWVuIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSBhbmQgVW5peCBAY29kZXtncHJvZn0uKQotKiBEZXRhaWxzOjogICAgICAgICAgICAgRGV0YWlscyBvZiBob3cgcHJvZmlsaW5nIGlzIGRvbmUKLUBlbmQgbWVudQotQGVuZCBpZmluZm8KLQotQG5vZGUgSW50cm9kdWN0aW9uCi1AY2hhcHRlciBJbnRyb2R1Y3Rpb24gdG8gUHJvZmlsaW5nCi0KLVByb2ZpbGluZyBhbGxvd3MgeW91IHRvIGxlYXJuIHdoZXJlIHlvdXIgcHJvZ3JhbSBzcGVudCBpdHMgdGltZSBhbmQgd2hpY2gKLWZ1bmN0aW9ucyBjYWxsZWQgd2hpY2ggb3RoZXIgZnVuY3Rpb25zIHdoaWxlIGl0IHdhcyBleGVjdXRpbmcuICBUaGlzCi1pbmZvcm1hdGlvbiBjYW4gc2hvdyB5b3Ugd2hpY2ggcGllY2VzIG9mIHlvdXIgcHJvZ3JhbSBhcmUgc2xvd2VyIHRoYW4geW91Ci1leHBlY3RlZCwgYW5kIG1pZ2h0IGJlIGNhbmRpZGF0ZXMgZm9yIHJld3JpdGluZyB0byBtYWtlIHlvdXIgcHJvZ3JhbQotZXhlY3V0ZSBmYXN0ZXIuICBJdCBjYW4gYWxzbyB0ZWxsIHlvdSB3aGljaCBmdW5jdGlvbnMgYXJlIGJlaW5nIGNhbGxlZCBtb3JlCi1vciBsZXNzIG9mdGVuIHRoYW4geW91IGV4cGVjdGVkLiAgVGhpcyBtYXkgaGVscCB5b3Ugc3BvdCBidWdzIHRoYXQgaGFkCi1vdGhlcndpc2UgYmVlbiB1bm5vdGljZWQuCi0KLVNpbmNlIHRoZSBwcm9maWxlciB1c2VzIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBkdXJpbmcgdGhlIGFjdHVhbCBleGVjdXRpb24KLW9mIHlvdXIgcHJvZ3JhbSwgaXQgY2FuIGJlIHVzZWQgb24gcHJvZ3JhbXMgdGhhdCBhcmUgdG9vIGxhcmdlIG9yIHRvbwotY29tcGxleCB0byBhbmFseXplIGJ5IHJlYWRpbmcgdGhlIHNvdXJjZS4gIEhvd2V2ZXIsIGhvdyB5b3VyIHByb2dyYW0gaXMgcnVuCi13aWxsIGFmZmVjdCB0aGUgaW5mb3JtYXRpb24gdGhhdCBzaG93cyB1cCBpbiB0aGUgcHJvZmlsZSBkYXRhLiAgSWYgeW91Ci1kb24ndCB1c2Ugc29tZSBmZWF0dXJlIG9mIHlvdXIgcHJvZ3JhbSB3aGlsZSBpdCBpcyBiZWluZyBwcm9maWxlZCwgbm8KLXByb2ZpbGUgaW5mb3JtYXRpb24gd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHRoYXQgZmVhdHVyZS4KLQotUHJvZmlsaW5nIGhhcyBzZXZlcmFsIHN0ZXBzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotWW91IG11c3QgY29tcGlsZSBhbmQgbGluayB5b3VyIHByb2dyYW0gd2l0aCBwcm9maWxpbmcgZW5hYmxlZC4KLUB4cmVme0NvbXBpbGluZ30uCi0KLUBpdGVtCi1Zb3UgbXVzdCBleGVjdXRlIHlvdXIgcHJvZ3JhbSB0byBnZW5lcmF0ZSBhIHByb2ZpbGUgZGF0YSBmaWxlLgotQHhyZWZ7RXhlY3V0aW5nfS4KLQotQGl0ZW0KLVlvdSBtdXN0IHJ1biBAY29kZXtncHJvZn0gdG8gYW5hbHl6ZSB0aGUgcHJvZmlsZSBkYXRhLgotQHhyZWZ7SW52b2tpbmd9LgotQGVuZCBpdGVtaXplCi0KLVRoZSBuZXh0IHRocmVlIGNoYXB0ZXJzIGV4cGxhaW4gdGhlc2Ugc3RlcHMgaW4gZ3JlYXRlciBkZXRhaWwuCi0KLVNldmVyYWwgZm9ybXMgb2Ygb3V0cHV0IGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgYW5hbHlzaXMuCi0KLVRoZSBAZGZue2ZsYXQgcHJvZmlsZX0gc2hvd3MgaG93IG11Y2ggdGltZSB5b3VyIHByb2dyYW0gc3BlbnQgaW4gZWFjaCBmdW5jdGlvbiwKLWFuZCBob3cgbWFueSB0aW1lcyB0aGF0IGZ1bmN0aW9uIHdhcyBjYWxsZWQuICBJZiB5b3Ugc2ltcGx5IHdhbnQgdG8ga25vdwotd2hpY2ggZnVuY3Rpb25zIGJ1cm4gbW9zdCBvZiB0aGUgY3ljbGVzLCBpdCBpcyBzdGF0ZWQgY29uY2lzZWx5IGhlcmUuCi1AeHJlZntGbGF0IFByb2ZpbGV9LgotCi1UaGUgQGRmbntjYWxsIGdyYXBofSBzaG93cywgZm9yIGVhY2ggZnVuY3Rpb24sIHdoaWNoIGZ1bmN0aW9ucyBjYWxsZWQgaXQsIHdoaWNoCi1vdGhlciBmdW5jdGlvbnMgaXQgY2FsbGVkLCBhbmQgaG93IG1hbnkgdGltZXMuICBUaGVyZSBpcyBhbHNvIGFuIGVzdGltYXRlCi1vZiBob3cgbXVjaCB0aW1lIHdhcyBzcGVudCBpbiB0aGUgc3Vicm91dGluZXMgb2YgZWFjaCBmdW5jdGlvbi4gIFRoaXMgY2FuCi1zdWdnZXN0IHBsYWNlcyB3aGVyZSB5b3UgbWlnaHQgdHJ5IHRvIGVsaW1pbmF0ZSBmdW5jdGlvbiBjYWxscyB0aGF0IHVzZSBhCi1sb3Qgb2YgdGltZS4gIEB4cmVme0NhbGwgR3JhcGh9LgotCi1UaGUgQGRmbnthbm5vdGF0ZWQgc291cmNlfSBsaXN0aW5nIGlzIGEgY29weSBvZiB0aGUgcHJvZ3JhbSdzCi1zb3VyY2UgY29kZSwgbGFiZWxlZCB3aXRoIHRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCBsaW5lIG9mIHRoZQotcHJvZ3JhbSB3YXMgZXhlY3V0ZWQuICBAeHJlZntBbm5vdGF0ZWQgU291cmNlfS4KLQotVG8gYmV0dGVyIHVuZGVyc3RhbmQgaG93IHByb2ZpbGluZyB3b3JrcywgeW91IG1heSB3aXNoIHRvIHJlYWQKLWEgZGVzY3JpcHRpb24gb2YgaXRzIGltcGxlbWVudGF0aW9uLgotQHhyZWZ7SW1wbGVtZW50YXRpb259LgotCi1Abm9kZSBDb21waWxpbmcKLUBjaGFwdGVyIENvbXBpbGluZyBhIFByb2dyYW0gZm9yIFByb2ZpbGluZwotCi1UaGUgZmlyc3Qgc3RlcCBpbiBnZW5lcmF0aW5nIHByb2ZpbGUgaW5mb3JtYXRpb24gZm9yIHlvdXIgcHJvZ3JhbSBpcwotdG8gY29tcGlsZSBhbmQgbGluayBpdCB3aXRoIHByb2ZpbGluZyBlbmFibGVkLgotCi1UbyBjb21waWxlIGEgc291cmNlIGZpbGUgZm9yIHByb2ZpbGluZywgc3BlY2lmeSB0aGUgQHNhbXB7LXBnfSBvcHRpb24gd2hlbgoteW91IHJ1biB0aGUgY29tcGlsZXIuICAoVGhpcyBpcyBpbiBhZGRpdGlvbiB0byB0aGUgb3B0aW9ucyB5b3Ugbm9ybWFsbHkKLXVzZS4pCi0KLVRvIGxpbmsgdGhlIHByb2dyYW0gZm9yIHByb2ZpbGluZywgaWYgeW91IHVzZSBhIGNvbXBpbGVyIHN1Y2ggYXMgQGNvZGV7Y2N9Ci10byBkbyB0aGUgbGlua2luZywgc2ltcGx5IHNwZWNpZnkgQHNhbXB7LXBnfSBpbiBhZGRpdGlvbiB0byB5b3VyIHVzdWFsCi1vcHRpb25zLiAgVGhlIHNhbWUgb3B0aW9uLCBAc2FtcHstcGd9LCBhbHRlcnMgZWl0aGVyIGNvbXBpbGF0aW9uIG9yIGxpbmtpbmcKLXRvIGRvIHdoYXQgaXMgbmVjZXNzYXJ5IGZvciBwcm9maWxpbmcuICBIZXJlIGFyZSBleGFtcGxlczoKLQotQGV4YW1wbGUKLWNjIC1nIC1jIG15cHJvZy5jIHV0aWxzLmMgLXBnCi1jYyAtbyBteXByb2cgbXlwcm9nLm8gdXRpbHMubyAtcGcKLUBlbmQgZXhhbXBsZQotCi1UaGUgQHNhbXB7LXBnfSBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIGEgY29tbWFuZCB0aGF0IGJvdGggY29tcGlsZXMgYW5kIGxpbmtzOgotCi1AZXhhbXBsZQotY2MgLW8gbXlwcm9nIG15cHJvZy5jIHV0aWxzLmMgLWcgLXBnCi1AZW5kIGV4YW1wbGUKLQotSWYgeW91IHJ1biB0aGUgbGlua2VyIEBjb2Rle2xkfSBkaXJlY3RseSBpbnN0ZWFkIG9mIHRocm91Z2ggYSBjb21waWxlcgotc3VjaCBhcyBAY29kZXtjY30sIHlvdSBtYXkgaGF2ZSB0byBzcGVjaWZ5IGEgcHJvZmlsaW5nIHN0YXJ0dXAgZmlsZQotQGZpbGV7Z2NydDAub30gYXMgdGhlIGZpcnN0IGlucHV0IGZpbGUgaW5zdGVhZCBvZiB0aGUgdXN1YWwgc3RhcnR1cAotZmlsZSBAZmlsZXtjcnQwLm99LiAgSW4gYWRkaXRpb24sIHlvdSB3b3VsZCBwcm9iYWJseSB3YW50IHRvCi1zcGVjaWZ5IHRoZSBwcm9maWxpbmcgQyBsaWJyYXJ5LCBAZmlsZXtsaWJjX3AuYX0sIGJ5IHdyaXRpbmcKLUBzYW1wey1sY19wfSBpbnN0ZWFkIG9mIHRoZSB1c3VhbCBAc2FtcHstbGN9LiAgVGhpcyBpcyBub3QgYWJzb2x1dGVseQotbmVjZXNzYXJ5LCBidXQgZG9pbmcgdGhpcyBnaXZlcyB5b3UgbnVtYmVyLW9mLWNhbGxzIGluZm9ybWF0aW9uIGZvcgotc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbnMgc3VjaCBhcyBAY29kZXtyZWFkfSBhbmQgQGNvZGV7b3Blbn0uICBGb3IKLWV4YW1wbGU6Ci0KLUBleGFtcGxlCi1sZCAtbyBteXByb2cgL2xpYi9nY3J0MC5vIG15cHJvZy5vIHV0aWxzLm8gLWxjX3AKLUBlbmQgZXhhbXBsZQotCi1JZiB5b3UgY29tcGlsZSBvbmx5IHNvbWUgb2YgdGhlIG1vZHVsZXMgb2YgdGhlIHByb2dyYW0gd2l0aCBAc2FtcHstcGd9LCB5b3UKLWNhbiBzdGlsbCBwcm9maWxlIHRoZSBwcm9ncmFtLCBidXQgeW91IHdvbid0IGdldCBjb21wbGV0ZSBpbmZvcm1hdGlvbiBhYm91dAotdGhlIG1vZHVsZXMgdGhhdCB3ZXJlIGNvbXBpbGVkIHdpdGhvdXQgQHNhbXB7LXBnfS4gIFRoZSBvbmx5IGluZm9ybWF0aW9uCi15b3UgZ2V0IGZvciB0aGUgZnVuY3Rpb25zIGluIHRob3NlIG1vZHVsZXMgaXMgdGhlIHRvdGFsIHRpbWUgc3BlbnQgaW4gdGhlbTsKLXRoZXJlIGlzIG5vIHJlY29yZCBvZiBob3cgbWFueSB0aW1lcyB0aGV5IHdlcmUgY2FsbGVkLCBvciBmcm9tIHdoZXJlLiAgVGhpcwotd2lsbCBub3QgYWZmZWN0IHRoZSBmbGF0IHByb2ZpbGUgKGV4Y2VwdCB0aGF0IHRoZSBAY29kZXtjYWxsc30gZmllbGQgZm9yCi10aGUgZnVuY3Rpb25zIHdpbGwgYmUgYmxhbmspLCBidXQgd2lsbCBncmVhdGx5IHJlZHVjZSB0aGUgdXNlZnVsbmVzcyBvZiB0aGUKLWNhbGwgZ3JhcGguCi0KLUlmIHlvdSB3aXNoIHRvIHBlcmZvcm0gbGluZS1ieS1saW5lIHByb2ZpbGluZywKLXlvdSB3aWxsIGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZSBAc2FtcHstZ30gb3B0aW9uLAotaW5zdHJ1Y3RpbmcgdGhlIGNvbXBpbGVyIHRvIGluc2VydCBkZWJ1Z2dpbmcgc3ltYm9scyBpbnRvIHRoZSBwcm9ncmFtCi10aGF0IG1hdGNoIHByb2dyYW0gYWRkcmVzc2VzIHRvIHNvdXJjZSBjb2RlIGxpbmVzLgotQHhyZWZ7TGluZS1ieS1saW5lfS4KLQotSW4gYWRkaXRpb24gdG8gdGhlIEBzYW1wey1wZ30gYW5kIEBzYW1wey1nfSBvcHRpb25zLAoteW91IG1heSBhbHNvIHdpc2ggdG8gc3BlY2lmeSB0aGUgQHNhbXB7LWF9IG9wdGlvbiB3aGVuIGNvbXBpbGluZy4KLVRoaXMgd2lsbCBpbnN0cnVtZW50Ci10aGUgcHJvZ3JhbSB0byBwZXJmb3JtIGJhc2ljLWJsb2NrIGNvdW50aW5nLiAgQXMgdGhlIHByb2dyYW0gcnVucywKLWl0IHdpbGwgY291bnQgaG93IG1hbnkgdGltZXMgaXQgZXhlY3V0ZWQgZWFjaCBicmFuY2ggb2YgZWFjaCBAc2FtcHtpZn0KLXN0YXRlbWVudCwgZWFjaCBpdGVyYXRpb24gb2YgZWFjaCBAc2FtcHtkb30gbG9vcCwgZXRjLiAgVGhpcyB3aWxsCi1lbmFibGUgQGNvZGV7Z3Byb2Z9IHRvIGNvbnN0cnVjdCBhbiBhbm5vdGF0ZWQgc291cmNlIGNvZGUKLWxpc3Rpbmcgc2hvd2luZyBob3cgbWFueSB0aW1lcyBlYWNoIGxpbmUgb2YgY29kZSB3YXMgZXhlY3V0ZWQuCi0KLUBub2RlIEV4ZWN1dGluZwotQGNoYXB0ZXIgRXhlY3V0aW5nIHRoZSBQcm9ncmFtCi0KLU9uY2UgdGhlIHByb2dyYW0gaXMgY29tcGlsZWQgZm9yIHByb2ZpbGluZywgeW91IG11c3QgcnVuIGl0IGluIG9yZGVyIHRvCi1nZW5lcmF0ZSB0aGUgaW5mb3JtYXRpb24gdGhhdCBAY29kZXtncHJvZn0gbmVlZHMuICBTaW1wbHkgcnVuIHRoZSBwcm9ncmFtCi1hcyB1c3VhbCwgdXNpbmcgdGhlIG5vcm1hbCBhcmd1bWVudHMsIGZpbGUgbmFtZXMsIGV0Yy4gIFRoZSBwcm9ncmFtIHNob3VsZAotcnVuIG5vcm1hbGx5LCBwcm9kdWNpbmcgdGhlIHNhbWUgb3V0cHV0IGFzIHVzdWFsLiAgSXQgd2lsbCwgaG93ZXZlciwgcnVuCi1zb21ld2hhdCBzbG93ZXIgdGhhbiBub3JtYWwgYmVjYXVzZSBvZiB0aGUgdGltZSBzcGVudCBjb2xsZWN0aW5nIGFuZCB0aGUKLXdyaXRpbmcgdGhlIHByb2ZpbGUgZGF0YS4KLQotVGhlIHdheSB5b3UgcnVuIHRoZSBwcm9ncmFtLS0tdGhlIGFyZ3VtZW50cyBhbmQgaW5wdXQgdGhhdCB5b3UgZ2l2ZQotaXQtLS1tYXkgaGF2ZSBhIGRyYW1hdGljIGVmZmVjdCBvbiB3aGF0IHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHNob3dzLiAgVGhlCi1wcm9maWxlIGRhdGEgd2lsbCBkZXNjcmliZSB0aGUgcGFydHMgb2YgdGhlIHByb2dyYW0gdGhhdCB3ZXJlIGFjdGl2YXRlZCBmb3IKLXRoZSBwYXJ0aWN1bGFyIGlucHV0IHlvdSB1c2UuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpcnN0IGNvbW1hbmQgeW91IGdpdmUKLXRvIHlvdXIgcHJvZ3JhbSBpcyB0byBxdWl0LCB0aGUgcHJvZmlsZSBkYXRhIHdpbGwgc2hvdyB0aGUgdGltZSB1c2VkIGluCi1pbml0aWFsaXphdGlvbiBhbmQgaW4gY2xlYW51cCwgYnV0IG5vdCBtdWNoIGVsc2UuCi0KLVlvdXIgcHJvZ3JhbSB3aWxsIHdyaXRlIHRoZSBwcm9maWxlIGRhdGEgaW50byBhIGZpbGUgY2FsbGVkIEBmaWxle2dtb24ub3V0fQotanVzdCBiZWZvcmUgZXhpdGluZy4gIElmIHRoZXJlIGlzIGFscmVhZHkgYSBmaWxlIGNhbGxlZCBAZmlsZXtnbW9uLm91dH0sCi1pdHMgY29udGVudHMgYXJlIG92ZXJ3cml0dGVuLiAgVGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0byB0ZWxsIHRoZQotcHJvZ3JhbSB0byB3cml0ZSB0aGUgcHJvZmlsZSBkYXRhIHVuZGVyIGEgZGlmZmVyZW50IG5hbWUsIGJ1dCB5b3UgY2FuIHJlbmFtZQotdGhlIGZpbGUgYWZ0ZXJ3YXJkIGlmIHlvdSBhcmUgY29uY2VybmVkIHRoYXQgaXQgbWF5IGJlIG92ZXJ3cml0dGVuLgotCi1JbiBvcmRlciB0byB3cml0ZSB0aGUgQGZpbGV7Z21vbi5vdXR9IGZpbGUgcHJvcGVybHksIHlvdXIgcHJvZ3JhbSBtdXN0IGV4aXQKLW5vcm1hbGx5OiBieSByZXR1cm5pbmcgZnJvbSBAY29kZXttYWlufSBvciBieSBjYWxsaW5nIEBjb2Rle2V4aXR9LiAgQ2FsbGluZwotdGhlIGxvdy1sZXZlbCBmdW5jdGlvbiBAY29kZXtfZXhpdH0gZG9lcyBub3Qgd3JpdGUgdGhlIHByb2ZpbGUgZGF0YSwgYW5kCi1uZWl0aGVyIGRvZXMgYWJub3JtYWwgdGVybWluYXRpb24gZHVlIHRvIGFuIHVuaGFuZGxlZCBzaWduYWwuCi0KLVRoZSBAZmlsZXtnbW9uLm91dH0gZmlsZSBpcyB3cml0dGVuIGluIHRoZSBwcm9ncmFtJ3MgQGVtcGh7Y3VycmVudCB3b3JraW5nCi1kaXJlY3Rvcnl9IGF0IHRoZSB0aW1lIGl0IGV4aXRzLiAgVGhpcyBtZWFucyB0aGF0IGlmIHlvdXIgcHJvZ3JhbSBjYWxscwotQGNvZGV7Y2hkaXJ9LCB0aGUgQGZpbGV7Z21vbi5vdXR9IGZpbGUgd2lsbCBiZSBsZWZ0IGluIHRoZSBsYXN0IGRpcmVjdG9yeQoteW91ciBwcm9ncmFtIEBjb2Rle2NoZGlyfSdkIHRvLiAgSWYgeW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byB3cml0ZSBpbgotdGhpcyBkaXJlY3RvcnksIHRoZSBmaWxlIGlzIG5vdCB3cml0dGVuLCBhbmQgeW91IHdpbGwgZ2V0IGFuIGVycm9yIG1lc3NhZ2UuCi0KLU9sZGVyIHZlcnNpb25zIG9mIHRoZSBAc2N7Z251fSBwcm9maWxpbmcgbGlicmFyeSBtYXkgYWxzbyB3cml0ZSBhIGZpbGUKLWNhbGxlZCBAZmlsZXtiYi5vdXR9LiAgVGhpcyBmaWxlLCBpZiBwcmVzZW50LCBjb250YWlucyBhbiBodW1hbi1yZWFkYWJsZQotbGlzdGluZyBvZiB0aGUgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cy4gIFVuZm9ydHVuYXRlbHksIHRoZQotYXBwZWFyYW5jZSBvZiBhIGh1bWFuLXJlYWRhYmxlIEBmaWxle2JiLm91dH0gbWVhbnMgdGhlIGJhc2ljLWJsb2NrCi1jb3VudHMgZGlkbid0IGdldCB3cml0dGVuIGludG8gQGZpbGV7Z21vbi5vdXR9LgotVGhlIFBlcmwgc2NyaXB0IEBjb2Rle2JiY29udi5wbH0sIGluY2x1ZGVkIHdpdGggdGhlIEBjb2Rle2dwcm9mfQotc291cmNlIGRpc3RyaWJ1dGlvbiwgd2lsbCBjb252ZXJ0IGEgQGZpbGV7YmIub3V0fSBmaWxlIGludG8KLWEgZm9ybWF0IHJlYWRhYmxlIGJ5IEBjb2Rle2dwcm9mfS4KLQotQG5vZGUgSW52b2tpbmcKLUBjaGFwdGVyIEBjb2Rle2dwcm9mfSBDb21tYW5kIFN1bW1hcnkKLQotQWZ0ZXIgeW91IGhhdmUgYSBwcm9maWxlIGRhdGEgZmlsZSBAZmlsZXtnbW9uLm91dH0sIHlvdSBjYW4gcnVuIEBjb2Rle2dwcm9mfQotdG8gaW50ZXJwcmV0IHRoZSBpbmZvcm1hdGlvbiBpbiBpdC4gIFRoZSBAY29kZXtncHJvZn0gcHJvZ3JhbSBwcmludHMgYQotZmxhdCBwcm9maWxlIGFuZCBhIGNhbGwgZ3JhcGggb24gc3RhbmRhcmQgb3V0cHV0LiAgVHlwaWNhbGx5IHlvdSB3b3VsZAotcmVkaXJlY3QgdGhlIG91dHB1dCBvZiBAY29kZXtncHJvZn0gaW50byBhIGZpbGUgd2l0aCBAc2FtcHs+fS4KLQotWW91IHJ1biBAY29kZXtncHJvZn0gbGlrZSB0aGlzOgotCi1Ac21hbGxleGFtcGxlCi1ncHJvZiBAdmFye29wdGlvbnN9IFtAdmFye2V4ZWN1dGFibGUtZmlsZX0gW0B2YXJ7cHJvZmlsZS1kYXRhLWZpbGVzfUBkb3Rze31dXSBbPiBAdmFye291dGZpbGV9XQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1IZXJlIHNxdWFyZS1icmFja2V0cyBpbmRpY2F0ZSBvcHRpb25hbCBhcmd1bWVudHMuCi0KLUlmIHlvdSBvbWl0IHRoZSBleGVjdXRhYmxlIGZpbGUgbmFtZSwgdGhlIGZpbGUgQGZpbGV7YS5vdXR9IGlzIHVzZWQuICBJZgoteW91IGdpdmUgbm8gcHJvZmlsZSBkYXRhIGZpbGUgbmFtZSwgdGhlIGZpbGUgQGZpbGV7Z21vbi5vdXR9IGlzIHVzZWQuICBJZgotYW55IGZpbGUgaXMgbm90IGluIHRoZSBwcm9wZXIgZm9ybWF0LCBvciBpZiB0aGUgcHJvZmlsZSBkYXRhIGZpbGUgZG9lcyBub3QKLWFwcGVhciB0byBiZWxvbmcgdG8gdGhlIGV4ZWN1dGFibGUgZmlsZSwgYW4gZXJyb3IgbWVzc2FnZSBpcyBwcmludGVkLgotCi1Zb3UgY2FuIGdpdmUgbW9yZSB0aGFuIG9uZSBwcm9maWxlIGRhdGEgZmlsZSBieSBlbnRlcmluZyBhbGwgdGhlaXIgbmFtZXMKLWFmdGVyIHRoZSBleGVjdXRhYmxlIGZpbGUgbmFtZTsgdGhlbiB0aGUgc3RhdGlzdGljcyBpbiBhbGwgdGhlIGRhdGEgZmlsZXMKLWFyZSBzdW1tZWQgdG9nZXRoZXIuCi0KLVRoZSBvcmRlciBvZiB0aGVzZSBvcHRpb25zIGRvZXMgbm90IG1hdHRlci4KLQotQG1lbnUKLSogT3V0cHV0IE9wdGlvbnM6OiAgICAgIENvbnRyb2xsaW5nIEBjb2Rle2dwcm9mfSdzIG91dHB1dCBzdHlsZQotKiBBbmFseXNpcyBPcHRpb25zOjogICAgQ29udHJvbGxpbmcgaG93IEBjb2Rle2dwcm9mfSBhbmFseXNlcyBpdHMgZGF0YQotKiBNaXNjZWxsYW5lb3VzIE9wdGlvbnM6OgotKiBEZXByaWNhdGVkIE9wdGlvbnM6OiAgT3B0aW9ucyB5b3Ugbm8gbG9uZ2VyIG5lZWQgdG8gdXNlLCBidXQgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGJlZW4gcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkKLSogU3ltc3BlY3M6OiAgICAgICAgICAgIFNwZWNpZnlpbmcgZnVuY3Rpb25zIHRvIGluY2x1ZGUgb3IgZXhjbHVkZQotQGVuZCBtZW51Ci0KLUBub2RlIE91dHB1dCBPcHRpb25zLEFuYWx5c2lzIE9wdGlvbnMsLEludm9raW5nCi1Ac2VjdGlvbiBPdXRwdXQgT3B0aW9ucwotCi1UaGVzZSBvcHRpb25zIHNwZWNpZnkgd2hpY2ggb2Ygc2V2ZXJhbCBvdXRwdXQgZm9ybWF0cwotQGNvZGV7Z3Byb2Z9IHNob3VsZCBwcm9kdWNlLgotCi1NYW55IG9mIHRoZXNlIG9wdGlvbnMgdGFrZSBhbiBvcHRpb25hbCBAZGZue3N5bXNwZWN9IHRvIHNwZWNpZnkKLWZ1bmN0aW9ucyB0byBiZSBpbmNsdWRlZCBvciBleGNsdWRlZC4gIFRoZXNlIG9wdGlvbnMgY2FuIGJlCi1zcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHdpdGggZGlmZmVyZW50IHN5bXNwZWNzLCB0byBpbmNsdWRlCi1vciBleGNsdWRlIHNldHMgb2Ygc3ltYm9scy4gIEB4cmVme1N5bXNwZWNzfS4KLQotU3BlY2lmeWluZyBhbnkgb2YgdGhlc2Ugb3B0aW9ucyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgKEBzYW1wey1wIC1xfSksCi13aGljaCBwcmludHMgYSBmbGF0IHByb2ZpbGUgYW5kIGNhbGwgZ3JhcGggYW5hbHlzaXMKLWZvciBhbGwgZnVuY3Rpb25zLgotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gLUFbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLWFubm90YXRlZC1zb3VyY2VbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LUF9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHByaW50IGFubm90YXRlZCBzb3VyY2UgY29kZS4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCBvdXRwdXQgb25seSBmb3IgbWF0Y2hpbmcgc3ltYm9scy4KLUB4cmVme0Fubm90YXRlZCBTb3VyY2V9LgotCi1AaXRlbSAtYgotQGl0ZW14IC0tYnJpZWYKLUlmIHRoZSBAc2FtcHstYn0gb3B0aW9uIGlzIGdpdmVuLCBAY29kZXtncHJvZn0gZG9lc24ndCBwcmludCB0aGUKLXZlcmJvc2UgYmx1cmJzIHRoYXQgdHJ5IHRvIGV4cGxhaW4gdGhlIG1lYW5pbmcgb2YgYWxsIG9mIHRoZSBmaWVsZHMgaW4KLXRoZSB0YWJsZXMuICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaW50ZW5kIHRvIHByaW50IG91dCB0aGUgb3V0cHV0LCBvcgotYXJlIHRpcmVkIG9mIHNlZWluZyB0aGUgYmx1cmJzLgotCi1AaXRlbSAtQ1tAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tZXhlYy1jb3VudHNbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LUN9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvCi1wcmludCBhIHRhbGx5IG9mIGZ1bmN0aW9ucyBhbmQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHdhcyBjYWxsZWQuCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgcHJpbnQgdGFsbHkgb25seSBmb3IgbWF0Y2hpbmcgc3ltYm9scy4KLQotSWYgdGhlIHByb2ZpbGUgZGF0YSBmaWxlIGNvbnRhaW5zIGJhc2ljLWJsb2NrIGNvdW50IHJlY29yZHMsIHNwZWNpZmluZwotdGhlIEBzYW1wey1sfSBvcHRpb24sIGFsb25nIHdpdGggQHNhbXB7LUN9LCB3aWxsIGNhdXNlIGJhc2ljLWJsb2NrCi1leGVjdXRpb24gY291bnRzIHRvIGJlIHRhbGxpZWQgYW5kIGRpc3BsYXllZC4KLQotQGl0ZW0gLWkKLUBpdGVteCAtLWZpbGUtaW5mbwotVGhlIEBzYW1wey1pfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBkaXNwbGF5IHN1bW1hcnkgaW5mb3JtYXRpb24KLWFib3V0IHRoZSBwcm9maWxlIGRhdGEgZmlsZShzKSBhbmQgdGhlbiBleGl0LiAgVGhlIG51bWJlciBvZiBoaXN0b2dyYW0sCi1jYWxsIGdyYXBoLCBhbmQgYmFzaWMtYmxvY2sgY291bnQgcmVjb3JkcyBpcyBkaXNwbGF5ZWQuCi0KLUBpdGVtIC1JIEB2YXJ7ZGlyc30KLUBpdGVteCAtLWRpcmVjdG9yeS1wYXRoPUB2YXJ7ZGlyc30KLVRoZSBAc2FtcHstSX0gb3B0aW9uIHNwZWNpZmllcyBhIGxpc3Qgb2Ygc2VhcmNoIGRpcmVjdG9yaWVzIGluCi13aGljaCB0byBmaW5kIHNvdXJjZSBmaWxlcy4gIEVudmlyb25tZW50IHZhcmlhYmxlIEB2YXJ7R1BST0ZfUEFUSH0KLWNhbiBhbHNvIGJlIHVzZWQgdG8gY29udmVyeSB0aGlzIGluZm9ybWF0aW9uLgotVXNlZCBtb3N0bHkgZm9yIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0LgotCi1AaXRlbSAtSltAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tbm8tYW5ub3RhdGVkLXNvdXJjZVs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstSn0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gbm90IHRvCi1wcmludCBhbm5vdGF0ZWQgc291cmNlIGNvZGUuCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgQGNvZGV7Z3Byb2Z9IHByaW50cyBhbm5vdGF0ZWQgc291cmNlLAotYnV0IGV4Y2x1ZGVzIG1hdGNoaW5nIHN5bWJvbHMuCi0KLUBpdGVtIC1MCi1AaXRlbXggLS1wcmludC1wYXRoCi1Ob3JtYWxseSwgc291cmNlIGZpbGVuYW1lcyBhcmUgcHJpbnRlZCB3aXRoIHRoZSBwYXRoCi1jb21wb25lbnQgc3VwcHJlc3NlZC4gIFRoZSBAc2FtcHstTH0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0KLXRvIHByaW50IHRoZSBmdWxsIHBhdGhuYW1lIG9mCi1zb3VyY2UgZmlsZW5hbWVzLCB3aGljaCBpcyBkZXRlcm1pbmVkCi1mcm9tIHN5bWJvbGljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgaW1hZ2UgZmlsZQotYW5kIGlzIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNvbXBpbGVyCi13YXMgaW52b2tlZC4KLQotQGl0ZW0gLXBbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLWZsYXQtcHJvZmlsZVs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstcH0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgYSBmbGF0IHByb2ZpbGUuCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgcHJpbnQgZmxhdCBwcm9maWxlIG9ubHkgZm9yIG1hdGNoaW5nIHN5bWJvbHMuCi1AeHJlZntGbGF0IFByb2ZpbGV9LgotCi1AaXRlbSAtUFtAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tbm8tZmxhdC1wcm9maWxlWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1QfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBzdXBwcmVzcyBwcmludGluZyBhIGZsYXQgcHJvZmlsZS4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBAY29kZXtncHJvZn0gcHJpbnRzIGEgZmxhdCBwcm9maWxlLAotYnV0IGV4Y2x1ZGVzIG1hdGNoaW5nIHN5bWJvbHMuCi0KLUBpdGVtIC1xW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1ncmFwaFs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstcX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgdGhlIGNhbGwgZ3JhcGggYW5hbHlzaXMuCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgcHJpbnQgY2FsbCBncmFwaCBvbmx5IGZvciBtYXRjaGluZyBzeW1ib2xzCi1hbmQgdGhlaXIgY2hpbGRyZW4uCi1AeHJlZntDYWxsIEdyYXBofS4KLQotQGl0ZW0gLVFbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLW5vLWdyYXBoWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1RfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBzdXBwcmVzcyBwcmludGluZyB0aGUKLWNhbGwgZ3JhcGguCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgQGNvZGV7Z3Byb2Z9IHByaW50cyBhIGNhbGwgZ3JhcGgsCi1idXQgZXhjbHVkZXMgbWF0Y2hpbmcgc3ltYm9scy4KLQotQGl0ZW0gLXkKLUBpdGVteCAtLXNlcGFyYXRlLWZpbGVzCi1UaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0IG9ubHkuCi1Ob3JtYWxseSwgZ3Byb2YgcHJpbnRzIGFubm90YXRlZCBzb3VyY2UgZmlsZXMKLXRvIHN0YW5kYXJkLW91dHB1dC4gIElmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwKLWFubm90YXRlZCBzb3VyY2UgZm9yIGEgZmlsZSBuYW1lZCBAZmlsZXtwYXRoL2ZpbGVuYW1lfQotaXMgZ2VuZXJhdGVkIGluIHRoZSBmaWxlIEBmaWxle2ZpbGVuYW1lLWFubn0uCi0KLUBpdGVtIC1aW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1uby1leGVjLWNvdW50c1s9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstWn0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gbm90IHRvCi1wcmludCBhIHRhbGx5IG9mIGZ1bmN0aW9ucyBhbmQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHdhcyBjYWxsZWQuCi1JZiBAdmFye3N5bXNwZWN9IGlzIHNwZWNpZmllZCwgcHJpbnQgdGFsbHksIGJ1dCBleGNsdWRlIG1hdGNoaW5nIHN5bWJvbHMuCi0KLUBpdGVtIC0tZnVuY3Rpb24tb3JkZXJpbmcKLVRoZSBAc2FtcHstLWZ1bmN0aW9uLW9yZGVyaW5nfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCBhCi1zdWdnZXN0ZWQgZnVuY3Rpb24gb3JkZXJpbmcgZm9yIHRoZSBwcm9ncmFtIGJhc2VkIG9uIHByb2ZpbGluZyBkYXRhLgotVGhpcyBvcHRpb24gc3VnZ2VzdHMgYW4gb3JkZXJpbmcgd2hpY2ggbWF5IGltcHJvdmUgcGFnaW5nLCB0bGIgYW5kCi1jYWNoZSBiZWhhdmlvciBmb3IgdGhlIHByb2dyYW0gb24gc3lzdGVtcyB3aGljaCBzdXBwb3J0IGFyYml0cmFyeQotb3JkZXJpbmcgb2YgZnVuY3Rpb25zIGluIGFuIGV4ZWN1dGFibGUuCi0KLVRoZSBleGFjdCBkZXRhaWxzIG9mIGhvdyB0byBmb3JjZSB0aGUgbGlua2VyIHRvIHBsYWNlIGZ1bmN0aW9ucwotaW4gYSBwYXJ0aWN1bGFyIG9yZGVyIGlzIHN5c3RlbSBkZXBlbmRlbnQgYW5kIG91dCBvZiB0aGUgc2NvcGUgb2YgdGhpcwotbWFudWFsLgotCi1AaXRlbSAtLWZpbGUtb3JkZXJpbmcgQHZhcnttYXBfZmlsZX0KLVRoZSBAc2FtcHstLWZpbGUtb3JkZXJpbmd9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHByaW50IGEKLXN1Z2dlc3RlZCAubyBsaW5rIGxpbmUgb3JkZXJpbmcgZm9yIHRoZSBwcm9ncmFtIGJhc2VkIG9uIHByb2ZpbGluZyBkYXRhLgotVGhpcyBvcHRpb24gc3VnZ2VzdHMgYW4gb3JkZXJpbmcgd2hpY2ggbWF5IGltcHJvdmUgcGFnaW5nLCB0bGIgYW5kCi1jYWNoZSBiZWhhdmlvciBmb3IgdGhlIHByb2dyYW0gb24gc3lzdGVtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBhcmJpdHJhcnkKLW9yZGVyaW5nIG9mIGZ1bmN0aW9ucyBpbiBhbiBleGVjdXRhYmxlLgotCi1Vc2Ugb2YgdGhlIEBzYW1wey1hfSBhcmd1bWVudCBpcyBoaWdobHkgcmVjb21tZW5kZWQgd2l0aCB0aGlzIG9wdGlvbi4KLQotVGhlIEB2YXJ7bWFwX2ZpbGV9IGFyZ3VtZW50IGlzIGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdoaWNoIHByb3ZpZGVzCi1mdW5jdGlvbiBuYW1lIHRvIG9iamVjdCBmaWxlIG1hcHBpbmdzLiAgVGhlIGZvcm1hdCBvZiB0aGUgZmlsZSBpcyBzaW1pbGFyIHRvCi10aGUgb3V0cHV0IG9mIHRoZSBwcm9ncmFtIEBjb2Rle25tfS4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1jLXBhcnNlLm86MDAwMDAwMDAgVCB5eXBhcnNlCi1jLXBhcnNlLm86MDAwMDAwMDQgQyB5eWVycmZsYWcKLWMtbGFuZy5vOjAwMDAwMDAwIFQgbWF5YmVfb2JqY19tZXRob2RfbmFtZQotYy1sYW5nLm86MDAwMDAwMDAgVCBwcmludF9sYW5nX3N0YXRpc3RpY3MKLWMtbGFuZy5vOjAwMDAwMDAwIFQgcmVjb2duaXplX29iamNfa2V5d29yZAotYy1kZWNsLm86MDAwMDAwMDAgVCBwcmludF9sYW5nX2lkZW50aWZpZXIKLWMtZGVjbC5vOjAwMDAwMDAwIFQgcHJpbnRfbGFuZ190eXBlCi1AZG90c3t9Ci0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUdOVSBAY29kZXtubX0gQHNhbXB7LS1leHRlcm4tb25seX0gQHNhbXB7LS1kZWZpbmVkLW9ubHl9IEBzYW1wey12fSBAc2FtcHstLXByaW50LWZpbGUtbmFtZX0gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIEB2YXJ7bWFwX2ZpbGV9LgotCi1AaXRlbSAtVAotQGl0ZW14IC0tdHJhZGl0aW9uYWwKLVRoZSBAc2FtcHstVH0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgaXRzIG91dHB1dCBpbgotYGB0cmFkaXRpb25hbCcnIEJTRCBzdHlsZS4KLQotQGl0ZW0gLXcgQHZhcnt3aWR0aH0KLUBpdGVteCAtLXdpZHRoPUB2YXJ7d2lkdGh9Ci1TZXRzIHdpZHRoIG9mIG91dHB1dCBsaW5lcyB0byBAdmFye3dpZHRofS4KLUN1cnJlbnRseSBvbmx5IHVzZWQgd2hlbiBwcmludGluZyB0aGUgZnVuY3Rpb24gaW5kZXggYXQgdGhlIGJvdHRvbQotb2YgdGhlIGNhbGwgZ3JhcGguCi0KLUBpdGVtIC14Ci1AaXRlbXggLS1hbGwtbGluZXMKLVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KLUJ5IGRlZmF1bHQsIG9ubHkgdGhlIGxpbmVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBiYXNpYy1ibG9jawotYXJlIGFubm90YXRlZC4gIElmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwgZXZlcnkgbGluZSBpbgotYSBiYXNpYy1ibG9jayBpcyBhbm5vdGF0ZWQgYnkgcmVwZWF0aW5nIHRoZSBhbm5vdGF0aW9uIGZvciB0aGUKLWZpcnN0IGxpbmUuICBUaGlzIGJlaGF2aW9yIGlzIHNpbWlsYXIgdG8gQGNvZGV7dGNvdn0ncyBAc2FtcHstYX0uCi0KLUBpdGVtIC0tZGVtYW5nbGUKLUBpdGVteCAtLW5vLWRlbWFuZ2xlCi1UaGVzZSBvcHRpb25zIGNvbnRyb2wgd2hldGhlciBDKysgc3ltYm9sIG5hbWVzIHNob3VsZCBiZSBkZW1hbmdsZWQgd2hlbgotcHJpbnRpbmcgb3V0cHV0LiAgVGhlIGRlZmF1bHQgaXMgdG8gZGVtYW5nbGUgc3ltYm9scy4gIFRoZQotQGNvZGV7LS1uby1kZW1hbmdsZX0gb3B0aW9uIG1heSBiZSB1c2VkIHRvIHR1cm4gb2ZmIGRlbWFuZ2xpbmcuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgQW5hbHlzaXMgT3B0aW9ucyxNaXNjZWxsYW5lb3VzIE9wdGlvbnMsT3V0cHV0IE9wdGlvbnMsSW52b2tpbmcKLUBzZWN0aW9uIEFuYWx5c2lzIE9wdGlvbnMKLQotQHRhYmxlIEBjb2RlCi0KLUBpdGVtIC1hCi1AaXRlbXggLS1uby1zdGF0aWMKLVRoZSBAc2FtcHstYX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gc3VwcHJlc3MgdGhlIHByaW50aW5nIG9mCi1zdGF0aWNhbGx5IGRlY2xhcmVkIChwcml2YXRlKSBmdW5jdGlvbnMuICAoVGhlc2UgYXJlIGZ1bmN0aW9ucyB3aG9zZQotbmFtZXMgYXJlIG5vdCBsaXN0ZWQgYXMgZ2xvYmFsLCBhbmQgd2hpY2ggYXJlIG5vdCB2aXNpYmxlIG91dHNpZGUgdGhlCi1maWxlL2Z1bmN0aW9uL2Jsb2NrIHdoZXJlIHRoZXkgd2VyZSBkZWZpbmVkLikgIFRpbWUgc3BlbnQgaW4gdGhlc2UKLWZ1bmN0aW9ucywgY2FsbHMgdG8vZnJvbSB0aGVtLCBldGMsIHdpbGwgYWxsIGJlIGF0dHJpYnV0ZWQgdG8gdGhlCi1mdW5jdGlvbiB0aGF0IHdhcyBsb2FkZWQgZGlyZWN0bHkgYmVmb3JlIGl0IGluIHRoZSBleGVjdXRhYmxlIGZpbGUuCi1AYyBUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCBVbml4IEBjb2Rle2dwcm9mfSwgYnV0IGEgYmFkIGlkZWEuICAKLVRoaXMgb3B0aW9uIGFmZmVjdHMgYm90aCB0aGUgZmxhdCBwcm9maWxlIGFuZCB0aGUgY2FsbCBncmFwaC4KLQotQGl0ZW0gLWMKLUBpdGVteCAtLXN0YXRpYy1jYWxsLWdyYXBoCi1UaGUgQHNhbXB7LWN9IG9wdGlvbiBjYXVzZXMgdGhlIGNhbGwgZ3JhcGggb2YgdGhlIHByb2dyYW0gdG8gYmUKLWF1Z21lbnRlZCBieSBhIGhldXJpc3RpYyB3aGljaCBleGFtaW5lcyB0aGUgdGV4dCBzcGFjZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGFuZCBpZGVudGlmaWVzIGZ1bmN0aW9uIGNhbGxzIGluIHRoZSBiaW5hcnkgbWFjaGluZSBjb2RlLgotU2luY2Ugbm9ybWFsIGNhbGwgZ3JhcGggcmVjb3JkcyBhcmUgb25seSBnZW5lcmF0ZWQgd2hlbiBmdW5jdGlvbnMgYXJlCi1lbnRlcmVkLCB0aGlzIG9wdGlvbiBpZGVudGlmaWVzIGNoaWxkcmVuIHRoYXQgY291bGQgaGF2ZSBiZWVuIGNhbGxlZCwKLWJ1dCBuZXZlciB3ZXJlLiAgQ2FsbHMgdG8gZnVuY3Rpb25zIHRoYXQgd2VyZSBub3QgY29tcGlsZWQgd2l0aAotcHJvZmlsaW5nIGVuYWJsZWQgYXJlIGFsc28gaWRlbnRpZmllZCwgYnV0IG9ubHkgaWYgc3ltYm9sIHRhYmxlCi1lbnRyaWVzIGFyZSBwcmVzZW50IGZvciB0aGVtLgotQ2FsbHMgdG8gZHluYW1pYyBsaWJyYXJ5IHJvdXRpbmVzIGFyZSB0eXBpY2FsbHkgQGVtcGh7bm90fSBmb3VuZAotYnkgdGhpcyBvcHRpb24uCi1QYXJlbnRzIG9yIGNoaWxkcmVuIGlkZW50aWZpZWQgdmlhIHRoaXMgaGV1cmlzdGljCi1hcmUgaW5kaWNhdGVkIGluIHRoZSBjYWxsIGdyYXBoIHdpdGggY2FsbCBjb3VudHMgb2YgQHNhbXB7MH0uCi0KLUBpdGVtIC1ECi1AaXRlbXggLS1pZ25vcmUtbm9uLWZ1bmN0aW9ucwotVGhlIEBzYW1wey1EfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBpZ25vcmUgc3ltYm9scyB3aGljaAotYXJlIG5vdCBrbm93biB0byBiZSBmdW5jdGlvbnMuICBUaGlzIG9wdGlvbiB3aWxsIGdpdmUgbW9yZSBhY2N1cmF0ZQotcHJvZmlsZSBkYXRhIG9uIHN5c3RlbXMgd2hlcmUgaXQgaXMgc3VwcG9ydGVkIChTb2xhcmlzIGFuZCBIUFVYIGZvcgotZXhhbXBsZSkuCi0KLUBpdGVtIC1rIEB2YXJ7ZnJvbX0vQHZhcnt0b30KLVRoZSBAc2FtcHsta30gb3B0aW9uIGFsbG93cyB5b3UgdG8gZGVsZXRlIGZyb20gdGhlIGNhbGwgZ3JhcGggYW55IGFyY3MgZnJvbQotc3ltYm9scyBtYXRjaGluZyBzeW1zcGVjIEB2YXJ7ZnJvbX0gdG8gdGhvc2UgbWF0Y2hpbmcgc3ltc3BlYyBAdmFye3RvfS4KLQotQGl0ZW0gLWwKLUBpdGVteCAtLWxpbmUKLVRoZSBAc2FtcHstbH0gb3B0aW9uIGVuYWJsZXMgbGluZS1ieS1saW5lIHByb2ZpbGluZywgd2hpY2ggY2F1c2VzCi1oaXN0b2dyYW0gaGl0cyB0byBiZSBjaGFyZ2VkIHRvIGluZGl2aWR1YWwgc291cmNlIGNvZGUgbGluZXMsCi1pbnN0ZWFkIG9mIGZ1bmN0aW9ucy4KLUlmIHRoZSBwcm9ncmFtIHdhcyBjb21waWxlZCB3aXRoIGJhc2ljLWJsb2NrIGNvdW50aW5nIGVuYWJsZWQsCi10aGlzIG9wdGlvbiB3aWxsIGFsc28gaWRlbnRpZnkgaG93IG1hbnkgdGltZXMgZWFjaCBsaW5lIG9mCi1jb2RlIHdhcyBleGVjdXRlZC4KLVdoaWxlIGxpbmUtYnktbGluZSBwcm9maWxpbmcgY2FuIGhlbHAgaXNvbGF0ZSB3aGVyZSBpbiBhIGxhcmdlIGZ1bmN0aW9uCi1hIHByb2dyYW0gaXMgc3BlbmRpbmcgaXRzIHRpbWUsIGl0IGFsc28gc2lnbmlmaWNhbnRseSBpbmNyZWFzZXMKLXRoZSBydW5uaW5nIHRpbWUgb2YgQGNvZGV7Z3Byb2Z9LCBhbmQgbWFnbmlmaWVzIHN0YXRpc3RpY2FsCi1pbmFjY3VyYWNpZXMuCi1AeHJlZntTYW1wbGluZyBFcnJvcn0uCi0KLUBpdGVtIC1tIEB2YXJ7bnVtfQotQGl0ZW14IC0tbWluLWNvdW50PUB2YXJ7bnVtfQotVGhpcyBvcHRpb24gYWZmZWN0cyBleGVjdXRpb24gY291bnQgb3V0cHV0IG9ubHkuCi1TeW1ib2xzIHRoYXQgYXJlIGV4ZWN1dGVkIGxlc3MgdGhhbiBAdmFye251bX0gdGltZXMgYXJlIHN1cHByZXNzZWQuCi0KLUBpdGVtIC1uW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS10aW1lWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1ufSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSwgaW4gaXRzIGNhbGwgZ3JhcGggYW5hbHlzaXMsCi10byBvbmx5IHByb3BhZ2F0ZSB0aW1lcyBmb3Igc3ltYm9scyBtYXRjaGluZyBAdmFye3N5bXNwZWN9LgotCi1AaXRlbSAtTltAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tbm8tdGltZVs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstbn0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0sIGluIGl0cyBjYWxsIGdyYXBoIGFuYWx5c2lzLAotbm90IHRvIHByb3BhZ2F0ZSB0aW1lcyBmb3Igc3ltYm9scyBtYXRjaGluZyBAdmFye3N5bXNwZWN9LgotCi1AaXRlbSAtegotQGl0ZW14IC0tZGlzcGxheS11bnVzZWQtZnVuY3Rpb25zCi1JZiB5b3UgZ2l2ZSB0aGUgQHNhbXB7LXp9IG9wdGlvbiwgQGNvZGV7Z3Byb2Z9IHdpbGwgbWVudGlvbiBhbGwKLWZ1bmN0aW9ucyBpbiB0aGUgZmxhdCBwcm9maWxlLCBldmVuIHRob3NlIHRoYXQgd2VyZSBuZXZlciBjYWxsZWQsIGFuZAotdGhhdCBoYWQgbm8gdGltZSBzcGVudCBpbiB0aGVtLiAgVGhpcyBpcyB1c2VmdWwgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLUBzYW1wey1jfSBvcHRpb24gZm9yIGRpc2NvdmVyaW5nIHdoaWNoIHJvdXRpbmVzIHdlcmUgbmV2ZXIgY2FsbGVkLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIE1pc2NlbGxhbmVvdXMgT3B0aW9ucyxEZXByaWNhdGVkIE9wdGlvbnMsQW5hbHlzaXMgT3B0aW9ucyxJbnZva2luZwotQHNlY3Rpb24gTWlzY2VsbGFuZW91cyBPcHRpb25zCi0KLUB0YWJsZSBAY29kZQotCi1AaXRlbSAtZFtAdmFye251bX1dCi1AaXRlbXggLS1kZWJ1Z1s9QHZhcntudW19XQotVGhlIEBzYW1wey1kIEB2YXJ7bnVtfX0gb3B0aW9uIHNwZWNpZmllcyBkZWJ1Z2dpbmcgb3B0aW9ucy4KLUlmIEB2YXJ7bnVtfSBpcyBub3Qgc3BlY2lmaWVkLCBlbmFibGUgYWxsIGRlYnVnZ2luZy4KLUB4cmVme0RlYnVnZ2luZ30uCi0KLUBpdGVtIC1PQHZhcntuYW1lfQotQGl0ZW14IC0tZmlsZS1mb3JtYXQ9QHZhcntuYW1lfQotU2VsZWN0cyB0aGUgZm9ybWF0IG9mIHRoZSBwcm9maWxlIGRhdGEgZmlsZXMuICBSZWNvZ25pemVkIGZvcm1hdHMgYXJlCi1Ac2FtcHthdXRvfSAodGhlIGRlZmF1bHQpLCBAc2FtcHtic2R9LCBAc2FtcHs0LjRic2R9LCBAc2FtcHttYWdpY30sIGFuZAotQHNhbXB7cHJvZn0gKG5vdCB5ZXQgc3VwcG9ydGVkKS4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLXN1bQotVGhlIEBzYW1wey1zfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBzdW1tYXJpemUgdGhlIGluZm9ybWF0aW9uCi1pbiB0aGUgcHJvZmlsZSBkYXRhIGZpbGVzIGl0IHJlYWQgaW4sIGFuZCB3cml0ZSBvdXQgYSBwcm9maWxlIGRhdGEKLWZpbGUgY2FsbGVkIEBmaWxle2dtb24uc3VtfSwgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBmcm9tCi10aGUgcHJvZmlsZSBkYXRhIGZpbGVzIHRoYXQgQGNvZGV7Z3Byb2Z9IHJlYWQgaW4uICBUaGUgZmlsZSBAZmlsZXtnbW9uLnN1bX0KLW1heSBiZSBvbmUgb2YgdGhlIHNwZWNpZmllZCBpbnB1dCBmaWxlczsgdGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRvCi1tZXJnZSB0aGUgZGF0YSBpbiB0aGUgb3RoZXIgaW5wdXQgZmlsZXMgaW50byBAZmlsZXtnbW9uLnN1bX0uCi0KLUV2ZW50dWFsbHkgeW91IGNhbiBydW4gQGNvZGV7Z3Byb2Z9IGFnYWluIHdpdGhvdXQgQHNhbXB7LXN9IHRvIGFuYWx5emUgdGhlCi1jdW11bGF0aXZlIGRhdGEgaW4gdGhlIGZpbGUgQGZpbGV7Z21vbi5zdW19LgotCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyc2lvbgotVGhlIEBzYW1wey12fSBmbGFnIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgdGhlIGN1cnJlbnQgdmVyc2lvbgotbnVtYmVyLCBhbmQgdGhlbiBleGl0LgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIERlcHJpY2F0ZWQgT3B0aW9ucyxTeW1zcGVjcyxNaXNjZWxsYW5lb3VzIE9wdGlvbnMsSW52b2tpbmcKLUBzZWN0aW9uIERlcHJpY2F0ZWQgT3B0aW9ucwotCi1AdGFibGUgQGNvZGUKLQotVGhlc2Ugb3B0aW9ucyBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBuZXdlciB2ZXJzaW9ucyB0aGF0IHVzZSBzeW1zcGVjcy4KLQotQGl0ZW0gLWUgQHZhcntmdW5jdGlvbl9uYW1lfQotVGhlIEBzYW1wey1lIEB2YXJ7ZnVuY3Rpb259fSBvcHRpb24gdGVsbHMgQGNvZGV7Z3Byb2Z9IHRvIG5vdCBwcmludAotaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZ1bmN0aW9uIEB2YXJ7ZnVuY3Rpb25fbmFtZX0gKGFuZCBpdHMKLWNoaWxkcmVuQGRvdHN7fSkgaW4gdGhlIGNhbGwgZ3JhcGguICBUaGUgZnVuY3Rpb24gd2lsbCBzdGlsbCBiZSBsaXN0ZWQKLWFzIGEgY2hpbGQgb2YgYW55IGZ1bmN0aW9ucyB0aGF0IGNhbGwgaXQsIGJ1dCBpdHMgaW5kZXggbnVtYmVyIHdpbGwgYmUKLXNob3duIGFzIEBzYW1we1tub3QgcHJpbnRlZF19LiAgTW9yZSB0aGFuIG9uZSBAc2FtcHstZX0gb3B0aW9uIG1heSBiZQotZ2l2ZW47IG9ubHkgb25lIEB2YXJ7ZnVuY3Rpb25fbmFtZX0gbWF5IGJlIGluZGljYXRlZCB3aXRoIGVhY2ggQHNhbXB7LWV9Ci1vcHRpb24uIAotCi1AaXRlbSAtRSBAdmFye2Z1bmN0aW9uX25hbWV9Ci1UaGUgQGNvZGV7LUUgQHZhcntmdW5jdGlvbn19IG9wdGlvbiB3b3JrcyBsaWtlIHRoZSBAY29kZXstZX0gb3B0aW9uLCBidXQKLXRpbWUgc3BlbnQgaW4gdGhlIGZ1bmN0aW9uIChhbmQgY2hpbGRyZW4gd2hvIHdlcmUgbm90IGNhbGxlZCBmcm9tCi1hbnl3aGVyZSBlbHNlKSwgd2lsbCBub3QgYmUgdXNlZCB0byBjb21wdXRlIHRoZSBwZXJjZW50YWdlcy1vZi10aW1lIGZvcgotdGhlIGNhbGwgZ3JhcGguICBNb3JlIHRoYW4gb25lIEBzYW1wey1FfSBvcHRpb24gbWF5IGJlIGdpdmVuOyBvbmx5IG9uZQotQHZhcntmdW5jdGlvbl9uYW1lfSBtYXkgYmUgaW5kaWNhdGVkIHdpdGggZWFjaCBAc2FtcHstRX0gb3B0aW9uLgotCi1AaXRlbSAtZiBAdmFye2Z1bmN0aW9uX25hbWV9Ci1UaGUgQHNhbXB7LWYgQHZhcntmdW5jdGlvbn19IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIGxpbWl0IHRoZQotY2FsbCBncmFwaCB0byB0aGUgZnVuY3Rpb24gQHZhcntmdW5jdGlvbl9uYW1lfSBhbmQgaXRzIGNoaWxkcmVuIChhbmQKLXRoZWlyIGNoaWxkcmVuQGRvdHN7fSkuICBNb3JlIHRoYW4gb25lIEBzYW1wey1mfSBvcHRpb24gbWF5IGJlIGdpdmVuOwotb25seSBvbmUgQHZhcntmdW5jdGlvbl9uYW1lfSBtYXkgYmUgaW5kaWNhdGVkIHdpdGggZWFjaCBAc2FtcHstZn0KLW9wdGlvbi4gIAotCi1AaXRlbSAtRiBAdmFye2Z1bmN0aW9uX25hbWV9Ci1UaGUgQHNhbXB7LUYgQHZhcntmdW5jdGlvbn19IG9wdGlvbiB3b3JrcyBsaWtlIHRoZSBAY29kZXstZn0gb3B0aW9uLCBidXQKLW9ubHkgdGltZSBzcGVudCBpbiB0aGUgZnVuY3Rpb24gYW5kIGl0cyBjaGlsZHJlbiAoYW5kIHRoZWlyCi1jaGlsZHJlbkBkb3Rze30pIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdG90YWwtdGltZSBhbmQKLXBlcmNlbnRhZ2VzLW9mLXRpbWUgZm9yIHRoZSBjYWxsIGdyYXBoLiAgTW9yZSB0aGFuIG9uZSBAc2FtcHstRn0gb3B0aW9uCi1tYXkgYmUgZ2l2ZW47IG9ubHkgb25lIEB2YXJ7ZnVuY3Rpb25fbmFtZX0gbWF5IGJlIGluZGljYXRlZCB3aXRoIGVhY2gKLUBzYW1wey1GfSBvcHRpb24uICBUaGUgQHNhbXB7LUZ9IG9wdGlvbiBvdmVycmlkZXMgdGhlIEBzYW1wey1FfSBvcHRpb24uCi0KLUBlbmQgdGFibGUKLQotTm90ZSB0aGF0IG9ubHkgb25lIGZ1bmN0aW9uIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCBlYWNoIEBjb2Rley1lfSwKLUBjb2Rley1FfSwgQGNvZGV7LWZ9IG9yIEBjb2Rley1GfSBvcHRpb24uICBUbyBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUKLWZ1bmN0aW9uLCB1c2UgbXVsdGlwbGUgb3B0aW9ucy4gIEZvciBleGFtcGxlLCB0aGlzIGNvbW1hbmQ6Ci0KLUBleGFtcGxlCi1ncHJvZiAtZSBib3JpbmcgLWYgZm9vIC1mIGJhciBteXByb2dyYW0gPiBncHJvZi5vdXRwdXQKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLWxpc3RzIGluIHRoZSBjYWxsIGdyYXBoIGFsbCBmdW5jdGlvbnMgdGhhdCB3ZXJlIHJlYWNoZWQgZnJvbSBlaXRoZXIKLUBjb2Rle2Zvb30gb3IgQGNvZGV7YmFyfSBhbmQgd2VyZSBub3QgcmVhY2hhYmxlIGZyb20gQGNvZGV7Ym9yaW5nfS4KLQotQG5vZGUgU3ltc3BlY3MsLERlcHJpY2F0ZWQgT3B0aW9ucyxJbnZva2luZwotQHNlY3Rpb24gU3ltc3BlY3MKLQotTWFueSBvZiB0aGUgb3V0cHV0IG9wdGlvbnMgYWxsb3cgZnVuY3Rpb25zIHRvIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkCi11c2luZyBAZGZue3N5bXNwZWNzfSAoc3ltYm9sIHNwZWNpZmljYXRpb25zKSwgd2hpY2ggb2JzZXJ2ZSB0aGUKLWZvbGxvd2luZyBzeW50YXg6Ci0KLUBleGFtcGxlCi0gIGZpbGVuYW1lX2NvbnRhaW5pbmdfYV9kb3QKLXwgZnVuY25hbWVfbm90X2NvbnRhaW5pbmdfYV9kb3QKLXwgbGluZW51bWJlcgotfCAoIFsgYW55X2ZpbGVuYW1lIF0gYDonICggYW55X2Z1bmNuYW1lIHwgbGluZW51bWJlciApICkKLUBlbmQgZXhhbXBsZQotCi1IZXJlIGFyZSBzb21lIHNhbXBsZSBzeW1zcGVjczoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBtYWluLmMKLVNlbGVjdHMgZXZlcnl0aGluZyBpbiBmaWxlIEBmaWxle21haW4uY30tLS10aGUKLWRvdCBpbiB0aGUgc3RyaW5nIHRlbGxzIGdwcm9mIHRvIGludGVycHJldAotdGhlIHN0cmluZyBhcyBhIGZpbGVuYW1lLCByYXRoZXIgdGhhbiBhcwotYSBmdW5jdGlvbiBuYW1lLiAgVG8gc2VsZWN0IGEgZmlsZSB3aG9zZQotbmFtZSBkb2VzIG5vdCBjb250YWluIGEgZG90LCBhIHRyYWlsaW5nIGNvbG9uCi1zaG91bGQgYmUgc3BlY2lmaWVkLiAgRm9yIGV4YW1wbGUsIEBzYW1we29kZDp9IGlzCi1pbnRlcnByZXRlZCBhcyB0aGUgZmlsZSBuYW1lZCBAZmlsZXtvZGR9LgotCi1AaXRlbSBtYWluCi1TZWxlY3RzIGFsbCBmdW5jdGlvbnMgbmFtZWQgQHNhbXB7bWFpbn0uCi0KLU5vdGUgdGhhdCB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGZ1bmN0aW9uIG5hbWUKLWJlY2F1c2Ugc29tZSBvZiB0aGUgZGVmaW5pdGlvbnMgbWF5IGJlIGxvY2FsIChpLmUuLCBzdGF0aWMpLiAgVW5sZXNzIGEKLWZ1bmN0aW9uIG5hbWUgaXMgdW5pcXVlIGluIGEgcHJvZ3JhbSwgeW91IG11c3QgdXNlIHRoZSBjb2xvbiBub3RhdGlvbgotZXhwbGFpbmVkIGJlbG93IHRvIHNwZWNpZnkgYSBmdW5jdGlvbiBmcm9tIGEgc3BlY2lmaWMgc291cmNlIGZpbGUuCi0KLVNvbWV0aW1lcywgZnVuY3Rpb24gbmFtZXMgY29udGFpbiBkb3RzLiAgSW4gc3VjaCBjYXNlcywgaXQgaXMgbmVjZXNzYXJ5Ci10byBhZGQgYSBsZWFkaW5nIGNvbG9uIHRvIHRoZSBuYW1lLiAgRm9yIGV4YW1wbGUsIEBzYW1wezoubXVsfSBzZWxlY3RzCi1mdW5jdGlvbiBAc2FtcHsubXVsfS4KLQotSW4gc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLCBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuICBncHJvZgotd2lsbCBub3JtYWxseSBub3QgcHJpbnQgdGhlc2UgdW5kZXJzY29yZXMuICBIb3dldmVyLCB5b3UgbXVzdCB1c2UgdGhlCi11bmRlcnNjb3JlIHdoZW4geW91IG5hbWUgYSBzeW1ib2wgaW4gYSBzeW1zcGVjLiAgWW91IGNhbiB1c2UgdGhlCi1AY29kZXtubX0gcHJvZ3JhbSB0byBzZWUgd2hldGhlciBzeW1ib2xzIGhhdmUgdW5kZXJzY29yZXMgZm9yIHRoZSBvYmplY3QKLWZpbGUgZm9ybWF0IHlvdSBhcmUgdXNpbmcuCi0KLUBpdGVtIG1haW4uYzptYWluCi1TZWxlY3RzIGZ1bmN0aW9uIEBzYW1we21haW59IGluIGZpbGUgQGZpbGV7bWFpbi5jfS4KLQotQGl0ZW0gbWFpbi5jOjEzNAotU2VsZWN0cyBsaW5lIDEzNCBpbiBmaWxlIEBmaWxle21haW4uY30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIE91dHB1dAotQGNoYXB0ZXIgSW50ZXJwcmV0aW5nIEBjb2Rle2dwcm9mfSdzIE91dHB1dAotCi1AY29kZXtncHJvZn0gY2FuIHByb2R1Y2Ugc2V2ZXJhbCBkaWZmZXJlbnQgb3V0cHV0IHN0eWxlcywgdGhlCi1tb3N0IGltcG9ydGFudCBvZiB3aGljaCBhcmUgZGVzY3JpYmVkIGJlbG93LiAgVGhlIHNpbXBsZXN0IG91dHB1dAotc3R5bGVzIChmaWxlIGluZm9ybWF0aW9uLCBleGVjdXRpb24gY291bnQsIGFuZCBmdW5jdGlvbiBhbmQgZmlsZSBvcmRlcmluZykKLWFyZSBub3QgZGVzY3JpYmVkIGhlcmUsIGJ1dCBhcmUgZG9jdW1lbnRlZCB3aXRoIHRoZSByZXNwZWN0aXZlIG9wdGlvbnMKLXRoYXQgdHJpZ2dlciB0aGVtLgotQHhyZWZ7T3V0cHV0IE9wdGlvbnN9LgotCi1AbWVudQotKiBGbGF0IFByb2ZpbGU6OiAgICAgICAgVGhlIGZsYXQgcHJvZmlsZSBzaG93cyBob3cgbXVjaCB0aW1lIHdhcyBzcGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGluZyBkaXJlY3RseSBpbiBlYWNoIGZ1bmN0aW9uLgotKiBDYWxsIEdyYXBoOjogICAgICAgICAgVGhlIGNhbGwgZ3JhcGggc2hvd3Mgd2hpY2ggZnVuY3Rpb25zIGNhbGxlZCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVycywgYW5kIGhvdyBtdWNoIHRpbWUgZWFjaCBmdW5jdGlvbiB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBpdHMgc3Vicm91dGluZSBjYWxscyBhcmUgaW5jbHVkZWQuCi0qIExpbmUtYnktbGluZTo6ICAgICAgICBAY29kZXtncHJvZn0gY2FuIGFuYWx5emUgaW5kaXZpZHVhbCBzb3VyY2UgY29kZSBsaW5lcwotKiBBbm5vdGF0ZWQgU291cmNlOjogICAgVGhlIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZyBkaXNwbGF5cyBzb3VyY2UgY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsZWQgd2l0aCBleGVjdXRpb24gY291bnRzCi1AZW5kIG1lbnUKLQotCi1Abm9kZSBGbGF0IFByb2ZpbGUsQ2FsbCBHcmFwaCwsT3V0cHV0Ci1Ac2VjdGlvbiBUaGUgRmxhdCBQcm9maWxlCi1AY2luZGV4IGZsYXQgcHJvZmlsZQotCi1UaGUgQGRmbntmbGF0IHByb2ZpbGV9IHNob3dzIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSB5b3VyIHByb2dyYW0KLXNwZW50IGV4ZWN1dGluZyBlYWNoIGZ1bmN0aW9uLiAgVW5sZXNzIHRoZSBAc2FtcHsten0gb3B0aW9uIGlzIGdpdmVuLAotZnVuY3Rpb25zIHdpdGggbm8gYXBwYXJlbnQgdGltZSBzcGVudCBpbiB0aGVtLCBhbmQgbm8gYXBwYXJlbnQgY2FsbHMKLXRvIHRoZW0sIGFyZSBub3QgbWVudGlvbmVkLiAgTm90ZSB0aGF0IGlmIGEgZnVuY3Rpb24gd2FzIG5vdCBjb21waWxlZAotZm9yIHByb2ZpbGluZywgYW5kIGRpZG4ndCBydW4gbG9uZyBlbm91Z2ggdG8gc2hvdyB1cCBvbiB0aGUgcHJvZ3JhbQotY291bnRlciBoaXN0b2dyYW0sIGl0IHdpbGwgYmUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIGZ1bmN0aW9uIHRoYXQKLXdhcyBuZXZlciBjYWxsZWQuCi0KLVRoaXMgaXMgcGFydCBvZiBhIGZsYXQgcHJvZmlsZSBmb3IgYSBzbWFsbCBwcm9ncmFtOgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLUZsYXQgcHJvZmlsZToKLQotRWFjaCBzYW1wbGUgY291bnRzIGFzIDAuMDEgc2Vjb25kcy4KLSAgJSAgIGN1bXVsYXRpdmUgICBzZWxmICAgICAgICAgICAgICBzZWxmICAgICB0b3RhbCAgICAgICAgICAgCi0gdGltZSAgIHNlY29uZHMgICBzZWNvbmRzICAgIGNhbGxzICBtcy9jYWxsICBtcy9jYWxsICBuYW1lICAgIAotIDMzLjM0ICAgICAgMC4wMiAgICAgMC4wMiAgICAgNzIwOCAgICAgMC4wMCAgICAgMC4wMCAgb3BlbgotIDE2LjY3ICAgICAgMC4wMyAgICAgMC4wMSAgICAgIDI0NCAgICAgMC4wNCAgICAgMC4xMiAgb2ZmdGltZQotIDE2LjY3ICAgICAgMC4wNCAgICAgMC4wMSAgICAgICAgOCAgICAgMS4yNSAgICAgMS4yNSAgbWVtY2NweQotIDE2LjY3ICAgICAgMC4wNSAgICAgMC4wMSAgICAgICAgNyAgICAgMS40MyAgICAgMS40MyAgd3JpdGUKLSAxNi42NyAgICAgIDAuMDYgICAgIDAuMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jb3VudAotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgIDIzNiAgICAgMC4wMCAgICAgMC4wMCAgdHpzZXQKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAxOTIgICAgIDAuMDAgICAgIDAuMDAgIHRvbG93ZXIKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgNDcgICAgIDAuMDAgICAgIDAuMDAgIHN0cmxlbgotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICA0NSAgICAgMC4wMCAgICAgMC4wMCAgc3RyY2hyCi0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgICAxICAgICAwLjAwICAgIDUwLjAwICBtYWluCi0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgICAxICAgICAwLjAwICAgICAwLjAwICBtZW1jcHkKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgIDEgICAgIDAuMDAgICAgMTAuMTEgIHByaW50Ci0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgICAxICAgICAwLjAwICAgICAwLjAwICBwcm9maWwKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgIDEgICAgIDAuMDAgICAgNTAuMDAgIHJlcG9ydAotQGRvdHN7fQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGUgZnVuY3Rpb25zIGFyZSBzb3J0ZWQgYnkgZmlyc3QgYnkgZGVjcmVhc2luZyBydW4tdGltZSBzcGVudCBpbiB0aGVtLAotdGhlbiBieSBkZWNyZWFzaW5nIG51bWJlciBvZiBjYWxscywgdGhlbiBhbHBoYWJldGljYWxseSBieSBuYW1lLiAgVGhlCi1mdW5jdGlvbnMgQHNhbXB7bWNvdW50fSBhbmQgQHNhbXB7cHJvZmlsfSBhcmUgcGFydCBvZiB0aGUgcHJvZmlsaW5nCi1hcGFyYXR1cyBhbmQgYXBwZWFyIGluIGV2ZXJ5IGZsYXQgcHJvZmlsZTsgdGhlaXIgdGltZSBnaXZlcyBhIG1lYXN1cmUgb2YKLXRoZSBhbW91bnQgb2Ygb3ZlcmhlYWQgZHVlIHRvIHByb2ZpbGluZy4KLQotSnVzdCBiZWZvcmUgdGhlIGNvbHVtbiBoZWFkZXJzLCBhIHN0YXRlbWVudCBhcHBlYXJzIGluZGljYXRpbmcKLWhvdyBtdWNoIHRpbWUgZWFjaCBzYW1wbGUgY291bnRlZCBhcy4KLVRoaXMgQGRmbntzYW1wbGluZyBwZXJpb2R9IGVzdGltYXRlcyB0aGUgbWFyZ2luIG9mIGVycm9yIGluIGVhY2ggb2YgdGhlIHRpbWUKLWZpZ3VyZXMuICBBIHRpbWUgZmlndXJlIHRoYXQgaXMgbm90IG11Y2ggbGFyZ2VyIHRoYW4gdGhpcyBpcyBub3QKLXJlbGlhYmxlLiAgSW4gdGhpcyBleGFtcGxlLCBlYWNoIHNhbXBsZSBjb3VudGVkIGFzIDAuMDEgc2Vjb25kcywKLXN1Z2dlc3RpbmcgYSAxMDAgSHogc2FtcGxpbmcgcmF0ZS4KLVRoZSBwcm9ncmFtJ3MgdG90YWwgZXhlY3V0aW9uIHRpbWUgd2FzIDAuMDYKLXNlY29uZHMsIGFzIGluZGljYXRlZCBieSB0aGUgQHNhbXB7Y3VtdWxhdGl2ZSBzZWNvbmRzfSBmaWVsZC4gIFNpbmNlCi1lYWNoIHNhbXBsZSBjb3VudGVkIGZvciAwLjAxIHNlY29uZHMsIHRoaXMgbWVhbnMgb25seSBzaXggc2FtcGxlcwotd2VyZSB0YWtlbiBkdXJpbmcgdGhlIHJ1bi4gIFR3byBvZiB0aGUgc2FtcGxlcyBvY2N1cmVkIHdoaWxlIHRoZQotcHJvZ3JhbSB3YXMgaW4gdGhlIEBzYW1we29wZW59IGZ1bmN0aW9uLCBhcyBpbmRpY2F0ZWQgYnkgdGhlCi1Ac2FtcHtzZWxmIHNlY29uZHN9IGZpZWxkLiAgRWFjaCBvZiB0aGUgb3RoZXIgZm91ciBzYW1wbGVzCi1vY2N1cmVkIG9uZSBlYWNoIGluIEBzYW1we29mZnRpbWV9LCBAc2FtcHttZW1jY3B5fSwgQHNhbXB7d3JpdGV9LAotYW5kIEBzYW1we21jb3VudH0uCi1TaW5jZSBvbmx5IHNpeCBzYW1wbGVzIHdlcmUgdGFrZW4sIG5vbmUgb2YgdGhlc2UgdmFsdWVzIGNhbgotYmUgcmVnYXJkZWQgYXMgcGFydGljdWxhcmx5IHJlbGlhYmxlLgotSW4gYW5vdGhlciBydW4sCi10aGUgQHNhbXB7c2VsZiBzZWNvbmRzfSBmaWVsZCBmb3IKLUBzYW1we21jb3VudH0gbWlnaHQgd2VsbCBiZSBAc2FtcHswLjAwfSBvciBAc2FtcHswLjAyfS4KLUB4cmVme1NhbXBsaW5nIEVycm9yfSwgZm9yIGEgY29tcGxldGUgZGlzY3Vzc2lvbi4KLQotVGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgaW4gdGhlIGxpc3RpbmcgKHRob3NlIHdob3NlCi1Ac2FtcHtzZWxmIHNlY29uZHN9IGZpZWxkIGlzIEBzYW1wezAuMDB9KSBkaWRuJ3QgYXBwZWFyCi1pbiB0aGUgaGlzdG9ncmFtIHNhbXBsZXMgYXQgYWxsLiAgSG93ZXZlciwgdGhlIGNhbGwgZ3JhcGgKLWluZGljYXRlZCB0aGF0IHRoZXkgd2VyZSBjYWxsZWQsIHNvIHRoZXJlZm9yZSB0aGV5IGFyZSBsaXN0ZWQsCi1zb3J0ZWQgaW4gZGVjcmVhc2luZyBvcmRlciBieSB0aGUgQHNhbXB7Y2FsbHN9IGZpZWxkLgotQ2xlYXJseSBzb21lIHRpbWUgd2FzIHNwZW50IGV4ZWN1dGluZyB0aGVzZSBmdW5jdGlvbnMsCi1idXQgdGhlIHBhdWNpdHkgb2YgaGlzdG9ncmFtIHNhbXBsZXMgcHJldmVudHMgYW55Ci1kZXRlcm1pbmF0aW9uIG9mIGhvdyBtdWNoIHRpbWUgZWFjaCB0b29rLgotCi1IZXJlIGlzIHdoYXQgdGhlIGZpZWxkcyBpbiBlYWNoIGxpbmUgbWVhbjoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAlIHRpbWUKLVRoaXMgaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIGV4ZWN1dGlvbiB0aW1lIHlvdXIgcHJvZ3JhbSBzcGVudAotaW4gdGhpcyBmdW5jdGlvbi4gIFRoZXNlIHNob3VsZCBhbGwgYWRkIHVwIHRvIDEwMCUuCi0KLUBpdGVtIGN1bXVsYXRpdmUgc2Vjb25kcwotVGhpcyBpcyB0aGUgY3VtdWxhdGl2ZSB0b3RhbCBudW1iZXIgb2Ygc2Vjb25kcyB0aGUgY29tcHV0ZXIgc3BlbnQKLWV4ZWN1dGluZyB0aGlzIGZ1bmN0aW9ucywgcGx1cyB0aGUgdGltZSBzcGVudCBpbiBhbGwgdGhlIGZ1bmN0aW9ucwotYWJvdmUgdGhpcyBvbmUgaW4gdGhpcyB0YWJsZS4KLQotQGl0ZW0gc2VsZiBzZWNvbmRzCi1UaGlzIGlzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhY2NvdW50ZWQgZm9yIGJ5IHRoaXMgZnVuY3Rpb24gYWxvbmUuCi1UaGUgZmxhdCBwcm9maWxlIGxpc3RpbmcgaXMgc29ydGVkIGZpcnN0IGJ5IHRoaXMgbnVtYmVyLgotCi1AaXRlbSBjYWxscwotVGhpcyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkLiAgSWYgdGhlCi1mdW5jdGlvbiB3YXMgbmV2ZXIgY2FsbGVkLCBvciB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IHdhcyBjYWxsZWQgY2Fubm90Ci1iZSBkZXRlcm1pbmVkIChwcm9iYWJseSBiZWNhdXNlIHRoZSBmdW5jdGlvbiB3YXMgbm90IGNvbXBpbGVkIHdpdGgKLXByb2ZpbGluZyBlbmFibGVkKSwgdGhlIEBkZm57Y2FsbHN9IGZpZWxkIGlzIGJsYW5rLgotCi1AaXRlbSBzZWxmIG1zL2NhbGwKLVRoaXMgcmVwcmVzZW50cyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IGluIHRoaXMKLWZ1bmN0aW9uIHBlciBjYWxsLCBpZiB0aGlzIGZ1bmN0aW9uIGlzIHByb2ZpbGVkLiAgT3RoZXJ3aXNlLCB0aGlzIGZpZWxkCi1pcyBibGFuayBmb3IgdGhpcyBmdW5jdGlvbi4KLQotQGl0ZW0gdG90YWwgbXMvY2FsbAotVGhpcyByZXByZXNlbnRzIHRoZSBhdmVyYWdlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc3BlbnQgaW4gdGhpcwotZnVuY3Rpb24gYW5kIGl0cyBkZXNjZW5kYW50cyBwZXIgY2FsbCwgaWYgdGhpcyBmdW5jdGlvbiBpcyBwcm9maWxlZC4KLU90aGVyd2lzZSwgdGhpcyBmaWVsZCBpcyBibGFuayBmb3IgdGhpcyBmdW5jdGlvbi4KLVRoaXMgaXMgdGhlIG9ubHkgZmllbGQgaW4gdGhlIGZsYXQgcHJvZmlsZSB0aGF0IHVzZXMgY2FsbCBncmFwaCBhbmFseXNpcy4KLQotQGl0ZW0gbmFtZQotVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICAgVGhlIGZsYXQgcHJvZmlsZSBpcyBzb3J0ZWQgYnkgdGhpcwotZmllbGQgYWxwaGFiZXRpY2FsbHkgYWZ0ZXIgdGhlIEBkZm57c2VsZiBzZWNvbmRzfSBhbmQgQGRmbntjYWxsc30KLWZpZWxkcyBhcmUgc29ydGVkLgotQGVuZCB0YWJsZQotCi1Abm9kZSBDYWxsIEdyYXBoLExpbmUtYnktbGluZSxGbGF0IFByb2ZpbGUsT3V0cHV0Ci1Ac2VjdGlvbiBUaGUgQ2FsbCBHcmFwaAotQGNpbmRleCBjYWxsIGdyYXBoCi0KLVRoZSBAZGZue2NhbGwgZ3JhcGh9IHNob3dzIGhvdyBtdWNoIHRpbWUgd2FzIHNwZW50IGluIGVhY2ggZnVuY3Rpb24KLWFuZCBpdHMgY2hpbGRyZW4uICBGcm9tIHRoaXMgaW5mb3JtYXRpb24sIHlvdSBjYW4gZmluZCBmdW5jdGlvbnMgdGhhdCwKLXdoaWxlIHRoZXkgdGhlbXNlbHZlcyBtYXkgbm90IGhhdmUgdXNlZCBtdWNoIHRpbWUsIGNhbGxlZCBvdGhlcgotZnVuY3Rpb25zIHRoYXQgZGlkIHVzZSB1bnVzdWFsIGFtb3VudHMgb2YgdGltZS4KLQotSGVyZSBpcyBhIHNhbXBsZSBjYWxsIGZyb20gYSBzbWFsbCBwcm9ncmFtLiAgVGhpcyBjYWxsIGNhbWUgZnJvbSB0aGUKLXNhbWUgQGNvZGV7Z3Byb2Z9IHJ1biBhcyB0aGUgZmxhdCBwcm9maWxlIGV4YW1wbGUgaW4gdGhlIHByZXZpb3VzCi1jaGFwdGVyLgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLWdyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzIDIgYnl0ZShzKSBmb3IgMjAuMDAlIG9mIDAuMDUgc2Vjb25kcwotCi1pbmRleCAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gICAgY2FsbGVkICAgICBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwb250YW5lb3VzPgotWzFdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAgICAgICAgICAgc3RhcnQgWzFdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEvMSAgICAgICAgICAgbWFpbiBbMl0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8yICAgICAgICAgICBvbl9leGl0IFsyOF0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xICAgICAgICAgICBleGl0IFs1OV0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEvMSAgICAgICAgICAgc3RhcnQgWzFdCi1bMl0gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEgICAgICAgICBtYWluIFsyXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIHJlcG9ydCBbM10KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEvMSAgICAgICAgICAgbWFpbiBbMl0KLVszXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgMSAgICAgICAgIHJlcG9ydCBbM10KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDMgICAgICAgOC84ICAgICAgICAgICB0aW1lbG9jYWwgWzZdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAxICAgICAgIDEvMSAgICAgICAgICAgcHJpbnQgWzldCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAxICAgICAgIDkvOSAgICAgICAgICAgZmdldHMgWzEyXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgIDEyLzM0ICAgICAgICAgIHN0cm5jbXAgPGN5Y2xlIDE+IFs0MF0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgOC84ICAgICAgICAgICBsb29rdXAgWzIwXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzEgICAgICAgICAgIGZvcGVuIFsyMV0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgOC84ICAgICAgICAgICBjaGV3dGltZSBbMjRdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDgvMTYgICAgICAgICAgc2tpcHNwYWNlIFs0NF0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1bNF0gICAgIDU5LjggICAgMC4wMSAgICAgICAgMC4wMiAgICAgICA4KzQ3MiAgICAgPGN5Y2xlIDIgYXMgYSB3aG9sZT4JWzRdCi0gICAgICAgICAgICAgICAgMC4wMSAgICAgICAgMC4wMiAgICAgMjQ0KzI2MCAgICAgICAgIG9mZnRpbWUgPGN5Y2xlIDI+IFs3XQotICAgICAgICAgICAgICAgIDAuMDAgICAgICAgIDAuMDAgICAgIDIzNisxICAgICAgICAgICB0enNldCA8Y3ljbGUgMj4gWzI2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBsaW5lcyBmdWxsIG9mIGRhc2hlcyBkaXZpZGUgdGhpcyB0YWJsZSBpbnRvIEBkZm57ZW50cmllc30sIG9uZSBmb3IgZWFjaAotZnVuY3Rpb24uICBFYWNoIGVudHJ5IGhhcyBvbmUgb3IgbW9yZSBsaW5lcy4KLQotSW4gZWFjaCBlbnRyeSwgdGhlIHByaW1hcnkgbGluZSBpcyB0aGUgb25lIHRoYXQgc3RhcnRzIHdpdGggYW4gaW5kZXggbnVtYmVyCi1pbiBzcXVhcmUgYnJhY2tldHMuICBUaGUgZW5kIG9mIHRoaXMgbGluZSBzYXlzIHdoaWNoIGZ1bmN0aW9uIHRoZSBlbnRyeSBpcwotZm9yLiAgVGhlIHByZWNlZGluZyBsaW5lcyBpbiB0aGUgZW50cnkgZGVzY3JpYmUgdGhlIGNhbGxlcnMgb2YgdGhpcwotZnVuY3Rpb24gYW5kIHRoZSBmb2xsb3dpbmcgbGluZXMgZGVzY3JpYmUgaXRzIHN1YnJvdXRpbmVzIChhbHNvIGNhbGxlZAotQGRmbntjaGlsZHJlbn0gd2hlbiB3ZSBzcGVhayBvZiB0aGUgY2FsbCBncmFwaCkuCi0KLVRoZSBlbnRyaWVzIGFyZSBzb3J0ZWQgYnkgdGltZSBzcGVudCBpbiB0aGUgZnVuY3Rpb24gYW5kIGl0cyBzdWJyb3V0aW5lcy4KLQotVGhlIGludGVybmFsIHByb2ZpbGluZyBmdW5jdGlvbiBAY29kZXttY291bnR9IChAcHhyZWZ7RmxhdCBQcm9maWxlfSkKLWlzIG5ldmVyIG1lbnRpb25lZCBpbiB0aGUgY2FsbCBncmFwaC4KLQotQG1lbnUKLSogUHJpbWFyeTo6ICAgICAgIERldGFpbHMgb2YgdGhlIHByaW1hcnkgbGluZSdzIGNvbnRlbnRzLgotKiBDYWxsZXJzOjogICAgICAgRGV0YWlscyBvZiBjYWxsZXItbGluZXMnIGNvbnRlbnRzLgotKiBTdWJyb3V0aW5lczo6ICAgRGV0YWlscyBvZiBzdWJyb3V0aW5lLWxpbmVzJyBjb250ZW50cy4KLSogQ3ljbGVzOjogICAgICAgIFdoZW4gdGhlcmUgYXJlIGN5Y2xlcyBvZiByZWN1cnNpb24sCi0gICAgICAgICAgICAgICAgICAgc3VjaCBhcyBAY29kZXthfSBjYWxscyBAY29kZXtifSBjYWxscyBAY29kZXthfUBkb3Rze30KLUBlbmQgbWVudQotCi1Abm9kZSBQcmltYXJ5Ci1Ac3Vic2VjdGlvbiBUaGUgUHJpbWFyeSBMaW5lCi0KLVRoZSBAZGZue3ByaW1hcnkgbGluZX0gaW4gYSBjYWxsIGdyYXBoIGVudHJ5IGlzIHRoZSBsaW5lIHRoYXQKLWRlc2NyaWJlcyB0aGUgZnVuY3Rpb24gd2hpY2ggdGhlIGVudHJ5IGlzIGFib3V0IGFuZCBnaXZlcyB0aGUgb3ZlcmFsbAotc3RhdGlzdGljcyBmb3IgdGhpcyBmdW5jdGlvbi4KLQotRm9yIHJlZmVyZW5jZSwgd2UgcmVwZWF0IHRoZSBwcmltYXJ5IGxpbmUgZnJvbSB0aGUgZW50cnkgZm9yIGZ1bmN0aW9uCi1AY29kZXtyZXBvcnR9IGluIG91ciBtYWluIGV4YW1wbGUsIHRvZ2V0aGVyIHdpdGggdGhlIGhlYWRpbmcgbGluZSB0aGF0Ci1zaG93cyB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkczoKLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1pbmRleCAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuIGNhbGxlZCAgICAgbmFtZQotQGRvdHN7fQotWzNdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAxICAgICAgICAgcmVwb3J0IFszXQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotSGVyZSBpcyB3aGF0IHRoZSBmaWVsZHMgaW4gdGhlIHByaW1hcnkgbGluZSBtZWFuOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGluZGV4Ci1FbnRyaWVzIGFyZSBudW1iZXJlZCB3aXRoIGNvbnNlY3V0aXZlIGludGVnZXJzLiAgRWFjaCBmdW5jdGlvbgotdGhlcmVmb3JlIGhhcyBhbiBpbmRleCBudW1iZXIsIHdoaWNoIGFwcGVhcnMgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMKLXByaW1hcnkgbGluZS4KLQotRWFjaCBjcm9zcy1yZWZlcmVuY2UgdG8gYSBmdW5jdGlvbiwgYXMgYSBjYWxsZXIgb3Igc3Vicm91dGluZSBvZgotYW5vdGhlciwgZ2l2ZXMgaXRzIGluZGV4IG51bWJlciBhcyB3ZWxsIGFzIGl0cyBuYW1lLiAgVGhlIGluZGV4IG51bWJlcgotZ3VpZGVzIHlvdSBpZiB5b3Ugd2lzaCB0byBsb29rIGZvciB0aGUgZW50cnkgZm9yIHRoYXQgZnVuY3Rpb24uCi0KLUBpdGVtICUgdGltZQotVGhpcyBpcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgdGltZSB0aGF0IHdhcyBzcGVudCBpbiB0aGlzCi1mdW5jdGlvbiwgaW5jbHVkaW5nIHRpbWUgc3BlbnQgaW4gc3Vicm91dGluZXMgY2FsbGVkIGZyb20gdGhpcwotZnVuY3Rpb24uCi0KLVRoZSB0aW1lIHNwZW50IGluIHRoaXMgZnVuY3Rpb24gaXMgY291bnRlZCBhZ2FpbiBmb3IgdGhlIGNhbGxlcnMgb2YKLXRoaXMgZnVuY3Rpb24uICBUaGVyZWZvcmUsIGFkZGluZyB1cCB0aGVzZSBwZXJjZW50YWdlcyBpcyBtZWFuaW5nbGVzcy4KLQotQGl0ZW0gc2VsZgotVGhpcyBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gdGhpcyBmdW5jdGlvbi4gIFRoaXMKLXNob3VsZCBiZSBpZGVudGljYWwgdG8gdGhlIG51bWJlciBwcmludGVkIGluIHRoZSBAY29kZXtzZWNvbmRzfSBmaWVsZAotZm9yIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGZsYXQgcHJvZmlsZS4KLQotQGl0ZW0gY2hpbGRyZW4KLVRoaXMgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHRoZSBzdWJyb3V0aW5lIGNhbGxzIG1hZGUgYnkKLXRoaXMgZnVuY3Rpb24uICBUaGlzIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgc3VtIG9mIGFsbCB0aGUgQGNvZGV7c2VsZn0KLWFuZCBAY29kZXtjaGlsZHJlbn0gZW50cmllcyBvZiB0aGUgY2hpbGRyZW4gbGlzdGVkIGRpcmVjdGx5IGJlbG93IHRoaXMKLWZ1bmN0aW9uLgotCi1AaXRlbSBjYWxsZWQKLVRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZC4KLQotSWYgdGhlIGZ1bmN0aW9uIGNhbGxlZCBpdHNlbGYgcmVjdXJzaXZlbHksIHRoZXJlIGFyZSB0d28gbnVtYmVycywKLXNlcGFyYXRlZCBieSBhIEBzYW1weyt9LiAgVGhlIGZpcnN0IG51bWJlciBjb3VudHMgbm9uLXJlY3Vyc2l2ZSBjYWxscywKLWFuZCB0aGUgc2Vjb25kIGNvdW50cyByZWN1cnNpdmUgY2FsbHMuCi0KLUluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgZnVuY3Rpb24gQGNvZGV7cmVwb3J0fSB3YXMgY2FsbGVkIG9uY2UgZnJvbQotQGNvZGV7bWFpbn0uCi0KLUBpdGVtIG5hbWUKLVRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICBUaGUgaW5kZXggbnVtYmVyIGlzCi1yZXBlYXRlZCBhZnRlciBpdC4KLQotSWYgdGhlIGZ1bmN0aW9uIGlzIHBhcnQgb2YgYSBjeWNsZSBvZiByZWN1cnNpb24sIHRoZSBjeWNsZSBudW1iZXIgaXMKLXByaW50ZWQgYmV0d2VlbiB0aGUgZnVuY3Rpb24ncyBuYW1lIGFuZCB0aGUgaW5kZXggbnVtYmVyCi0oQHB4cmVme0N5Y2xlc30pLiAgRm9yIGV4YW1wbGUsIGlmIGZ1bmN0aW9uIEBjb2Rle2dudXJyfSBpcyBwYXJ0IG9mCi1jeWNsZSBudW1iZXIgb25lLCBhbmQgaGFzIGluZGV4IG51bWJlciB0d2VsdmUsIGl0cyBwcmltYXJ5IGxpbmUgd291bGQKLWJlIGVuZCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1nbnVyciA8Y3ljbGUgMT4gWzEyXQotQGVuZCBleGFtcGxlCi1AZW5kIHRhYmxlCi0KLUBub2RlIENhbGxlcnMsIFN1YnJvdXRpbmVzLCBQcmltYXJ5LCBDYWxsIEdyYXBoCi1Ac3Vic2VjdGlvbiBMaW5lcyBmb3IgYSBGdW5jdGlvbidzIENhbGxlcnMKLQotQSBmdW5jdGlvbidzIGVudHJ5IGhhcyBhIGxpbmUgZm9yIGVhY2ggZnVuY3Rpb24gaXQgd2FzIGNhbGxlZCBieS4KLVRoZXNlIGxpbmVzJyBmaWVsZHMgY29ycmVzcG9uZCB0byB0aGUgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGxpbmUsIGJ1dAotdGhlaXIgbWVhbmluZ3MgYXJlIGRpZmZlcmVudCBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbmNlIGluIGNvbnRleHQuCi0KLUZvciByZWZlcmVuY2UsIHdlIHJlcGVhdCB0d28gbGluZXMgZnJvbSB0aGUgZW50cnkgZm9yIHRoZSBmdW5jdGlvbgotQGNvZGV7cmVwb3J0fSwgdGhlIHByaW1hcnkgbGluZSBhbmQgb25lIGNhbGxlci1saW5lIHByZWNlZGluZyBpdCwgdG9nZXRoZXIKLXdpdGggdGhlIGhlYWRpbmcgbGluZSB0aGF0IHNob3dzIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzOgotCi1Ac21hbGxleGFtcGxlCi1pbmRleCAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuIGNhbGxlZCAgICAgbmFtZQotQGRvdHN7fQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIG1haW4gWzJdCi1bM10gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEgICAgICAgICByZXBvcnQgWzNdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1IZXJlIGFyZSB0aGUgbWVhbmluZ3Mgb2YgdGhlIGZpZWxkcyBpbiB0aGUgY2FsbGVyLWxpbmUgZm9yIEBjb2Rle3JlcG9ydH0KLWNhbGxlZCBmcm9tIEBjb2Rle21haW59OgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHNlbGYKLUFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBpbiBAY29kZXtyZXBvcnR9IGl0c2VsZiB3aGVuIGl0IHdhcwotY2FsbGVkIGZyb20gQGNvZGV7bWFpbn0uCi0KLUBpdGVtIGNoaWxkcmVuCi1BbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gc3Vicm91dGluZXMgb2YgQGNvZGV7cmVwb3J0fQotd2hlbiBAY29kZXtyZXBvcnR9IHdhcyBjYWxsZWQgZnJvbSBAY29kZXttYWlufS4KLQotVGhlIHN1bSBvZiB0aGUgQGNvZGV7c2VsZn0gYW5kIEBjb2Rle2NoaWxkcmVufSBmaWVsZHMgaXMgYW4gZXN0aW1hdGUKLW9mIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCB3aXRoaW4gY2FsbHMgdG8gQGNvZGV7cmVwb3J0fSBmcm9tIEBjb2Rle21haW59LgotCi1AaXRlbSBjYWxsZWQKLVR3byBudW1iZXJzOiB0aGUgbnVtYmVyIG9mIHRpbWVzIEBjb2Rle3JlcG9ydH0gd2FzIGNhbGxlZCBmcm9tIEBjb2Rle21haW59LAotZm9sbG93ZWQgYnkgdGhlIHRvdGFsIG51bWJlciBvZiBub25yZWN1cnNpdmUgY2FsbHMgdG8gQGNvZGV7cmVwb3J0fSBmcm9tCi1hbGwgaXRzIGNhbGxlcnMuCi0KLUBpdGVtIG5hbWUgYW5kIGluZGV4IG51bWJlcgotVGhlIG5hbWUgb2YgdGhlIGNhbGxlciBvZiBAY29kZXtyZXBvcnR9IHRvIHdoaWNoIHRoaXMgbGluZSBhcHBsaWVzLAotZm9sbG93ZWQgYnkgdGhlIGNhbGxlcidzIGluZGV4IG51bWJlci4KLQotTm90IGFsbCBmdW5jdGlvbnMgaGF2ZSBlbnRyaWVzIGluIHRoZSBjYWxsIGdyYXBoOyBzb21lCi1vcHRpb25zIHRvIEBjb2Rle2dwcm9mfSByZXF1ZXN0IHRoZSBvbWlzc2lvbiBvZiBjZXJ0YWluIGZ1bmN0aW9ucy4KLVdoZW4gYSBjYWxsZXIgaGFzIG5vIGVudHJ5IG9mIGl0cyBvd24sIGl0IHN0aWxsIGhhcyBjYWxsZXItbGluZXMKLWluIHRoZSBlbnRyaWVzIG9mIHRoZSBmdW5jdGlvbnMgaXQgY2FsbHMuCi0KLUlmIHRoZSBjYWxsZXIgaXMgcGFydCBvZiBhIHJlY3Vyc2lvbiBjeWNsZSwgdGhlIGN5Y2xlIG51bWJlciBpcwotcHJpbnRlZCBiZXR3ZWVuIHRoZSBuYW1lIGFuZCB0aGUgaW5kZXggbnVtYmVyLgotQGVuZCB0YWJsZQotCi1JZiB0aGUgaWRlbnRpdHkgb2YgdGhlIGNhbGxlcnMgb2YgYSBmdW5jdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgYQotZHVtbXkgY2FsbGVyLWxpbmUgaXMgcHJpbnRlZCB3aGljaCBoYXMgQHNhbXB7PHNwb250YW5lb3VzPn0gYXMgdGhlCi1gYGNhbGxlcidzIG5hbWUnJyBhbmQgYWxsIG90aGVyIGZpZWxkcyBibGFuay4gIFRoaXMgY2FuIGhhcHBlbiBmb3IKLXNpZ25hbCBoYW5kbGVycy4KLUBjIFdoYXQgaWYgc29tZSBjYWxscyBoYXZlIGRldGVybWluYWJsZSBjYWxsZXJzJyBuYW1lcyBidXQgbm90IGFsbD8KLUBjIEZJWE1FIC0gc3RpbGwgcmVsZXZhbnQ/Ci0KLUBub2RlIFN1YnJvdXRpbmVzLCBDeWNsZXMsIENhbGxlcnMsIENhbGwgR3JhcGgKLUBzdWJzZWN0aW9uIExpbmVzIGZvciBhIEZ1bmN0aW9uJ3MgU3Vicm91dGluZXMKLQotQSBmdW5jdGlvbidzIGVudHJ5IGhhcyBhIGxpbmUgZm9yIGVhY2ggb2YgaXRzIHN1YnJvdXRpbmVzLS0taW4gb3RoZXIKLXdvcmRzLCBhIGxpbmUgZm9yIGVhY2ggb3RoZXIgZnVuY3Rpb24gdGhhdCBpdCBjYWxsZWQuICBUaGVzZSBsaW5lcycKLWZpZWxkcyBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZHMgb2YgdGhlIHByaW1hcnkgbGluZSwgYnV0IHRoZWlyIG1lYW5pbmdzCi1hcmUgZGlmZmVyZW50IGJlY2F1c2Ugb2YgdGhlIGRpZmZlcmVuY2UgaW4gY29udGV4dC4KLQotRm9yIHJlZmVyZW5jZSwgd2UgcmVwZWF0IHR3byBsaW5lcyBmcm9tIHRoZSBlbnRyeSBmb3IgdGhlIGZ1bmN0aW9uCi1AY29kZXttYWlufSwgdGhlIHByaW1hcnkgbGluZSBhbmQgYSBsaW5lIGZvciBhIHN1YnJvdXRpbmUsIHRvZ2V0aGVyCi13aXRoIHRoZSBoZWFkaW5nIGxpbmUgdGhhdCBzaG93cyB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkczoKLQotQHNtYWxsZXhhbXBsZQotaW5kZXggICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiBjYWxsZWQgICAgIG5hbWUKLUBkb3Rze30KLVsyXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgMSAgICAgICAgIG1haW4gWzJdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEvMSAgICAgICAgICAgcmVwb3J0IFszXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSGVyZSBhcmUgdGhlIG1lYW5pbmdzIG9mIHRoZSBmaWVsZHMgaW4gdGhlIHN1YnJvdXRpbmUtbGluZSBmb3IgQGNvZGV7bWFpbn0KLWNhbGxpbmcgQGNvZGV7cmVwb3J0fToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBzZWxmCi1BbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgZGlyZWN0bHkgd2l0aGluIEBjb2Rle3JlcG9ydH0KLXdoZW4gQGNvZGV7cmVwb3J0fSB3YXMgY2FsbGVkIGZyb20gQGNvZGV7bWFpbn0uCi0KLUBpdGVtIGNoaWxkcmVuCi1BbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gc3Vicm91dGluZXMgb2YgQGNvZGV7cmVwb3J0fQotd2hlbiBAY29kZXtyZXBvcnR9IHdhcyBjYWxsZWQgZnJvbSBAY29kZXttYWlufS4KLQotVGhlIHN1bSBvZiB0aGUgQGNvZGV7c2VsZn0gYW5kIEBjb2Rle2NoaWxkcmVufSBmaWVsZHMgaXMgYW4gZXN0aW1hdGUKLW9mIHRoZSB0b3RhbCB0aW1lIHNwZW50IGluIGNhbGxzIHRvIEBjb2Rle3JlcG9ydH0gZnJvbSBAY29kZXttYWlufS4KLQotQGl0ZW0gY2FsbGVkCi1Ud28gbnVtYmVycywgdGhlIG51bWJlciBvZiBjYWxscyB0byBAY29kZXtyZXBvcnR9IGZyb20gQGNvZGV7bWFpbn0KLWZvbGxvd2VkIGJ5IHRoZSB0b3RhbCBudW1iZXIgb2Ygbm9ucmVjdXJzaXZlIGNhbGxzIHRvIEBjb2Rle3JlcG9ydH0uCi1UaGlzIHJhdGlvIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIG9mIEBjb2Rle3JlcG9ydH0ncyBAY29kZXtzZWxmfQotYW5kIEBjb2Rle2NoaWxkcmVufSB0aW1lIGdldHMgY3JlZGl0ZWQgdG8gQGNvZGV7bWFpbn0uCi1AeHJlZntBc3N1bXB0aW9uc30uCi0KLUBpdGVtIG5hbWUKLVRoZSBuYW1lIG9mIHRoZSBzdWJyb3V0aW5lIG9mIEBjb2Rle21haW59IHRvIHdoaWNoIHRoaXMgbGluZSBhcHBsaWVzLAotZm9sbG93ZWQgYnkgdGhlIHN1YnJvdXRpbmUncyBpbmRleCBudW1iZXIuCi0KLUlmIHRoZSBjYWxsZXIgaXMgcGFydCBvZiBhIHJlY3Vyc2lvbiBjeWNsZSwgdGhlIGN5Y2xlIG51bWJlciBpcwotcHJpbnRlZCBiZXR3ZWVuIHRoZSBuYW1lIGFuZCB0aGUgaW5kZXggbnVtYmVyLgotQGVuZCB0YWJsZQotCi1Abm9kZSBDeWNsZXMsLCBTdWJyb3V0aW5lcywgQ2FsbCBHcmFwaAotQHN1YnNlY3Rpb24gSG93IE11dHVhbGx5IFJlY3Vyc2l2ZSBGdW5jdGlvbnMgQXJlIERlc2NyaWJlZAotQGNpbmRleCBjeWNsZQotQGNpbmRleCByZWN1cnNpb24gY3ljbGUKLQotVGhlIGdyYXBoIG1heSBiZSBjb21wbGljYXRlZCBieSB0aGUgcHJlc2VuY2Ugb2YgQGRmbntjeWNsZXMgb2YKLXJlY3Vyc2lvbn0gaW4gdGhlIGNhbGwgZ3JhcGguICBBIGN5Y2xlIGV4aXN0cyBpZiBhIGZ1bmN0aW9uIGNhbGxzCi1hbm90aGVyIGZ1bmN0aW9uIHRoYXQgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGNhbGxzIChvciBhcHBlYXJzIHRvCi1jYWxsKSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uICBGb3IgZXhhbXBsZTogaWYgQGNvZGV7YX0gY2FsbHMgQGNvZGV7Yn0sCi1hbmQgQGNvZGV7Yn0gY2FsbHMgQGNvZGV7YX0sIHRoZW4gQGNvZGV7YX0gYW5kIEBjb2Rle2J9IGZvcm0gYSBjeWNsZS4KLQotV2hlbmV2ZXIgdGhlcmUgYXJlIGNhbGwgcGF0aHMgYm90aCB3YXlzIGJldHdlZW4gYSBwYWlyIG9mIGZ1bmN0aW9ucywgdGhleQotYmVsb25nIHRvIHRoZSBzYW1lIGN5Y2xlLiAgSWYgQGNvZGV7YX0gYW5kIEBjb2Rle2J9IGNhbGwgZWFjaCBvdGhlciBhbmQKLUBjb2Rle2J9IGFuZCBAY29kZXtjfSBjYWxsIGVhY2ggb3RoZXIsIGFsbCB0aHJlZSBtYWtlIG9uZSBjeWNsZS4gIE5vdGUgdGhhdAotZXZlbiBpZiBAY29kZXtifSBvbmx5IGNhbGxzIEBjb2Rle2F9IGlmIGl0IHdhcyBub3QgY2FsbGVkIGZyb20gQGNvZGV7YX0sCi1AY29kZXtncHJvZn0gY2Fubm90IGRldGVybWluZSB0aGlzLCBzbyBAY29kZXthfSBhbmQgQGNvZGV7Yn0gYXJlIHN0aWxsCi1jb25zaWRlcmVkIGEgY3ljbGUuCi0KLVRoZSBjeWNsZXMgYXJlIG51bWJlcmVkIHdpdGggY29uc2VjdXRpdmUgaW50ZWdlcnMuICBXaGVuIGEgZnVuY3Rpb24KLWJlbG9uZ3MgdG8gYSBjeWNsZSwgZWFjaCB0aW1lIHRoZSBmdW5jdGlvbiBuYW1lIGFwcGVhcnMgaW4gdGhlIGNhbGwgZ3JhcGgKLWl0IGlzIGZvbGxvd2VkIGJ5IEBzYW1wezxjeWNsZSBAdmFye251bWJlcn0+fS4KLQotVGhlIHJlYXNvbiBjeWNsZXMgbWF0dGVyIGlzIHRoYXQgdGhleSBtYWtlIHRoZSB0aW1lIHZhbHVlcyBpbiB0aGUgY2FsbAotZ3JhcGggcGFyYWRveGljYWwuICBUaGUgYGB0aW1lIHNwZW50IGluIGNoaWxkcmVuJycgb2YgQGNvZGV7YX0gc2hvdWxkCi1pbmNsdWRlIHRoZSB0aW1lIHNwZW50IGluIGl0cyBzdWJyb3V0aW5lIEBjb2Rle2J9IGFuZCBpbiBAY29kZXtifSdzCi1zdWJyb3V0aW5lcy0tLWJ1dCBvbmUgb2YgQGNvZGV7Yn0ncyBzdWJyb3V0aW5lcyBpcyBAY29kZXthfSEgIEhvdyBtdWNoIG9mCi1AY29kZXthfSdzIHRpbWUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBjaGlsZHJlbiBvZiBAY29kZXthfSwgd2hlbgotQGNvZGV7YX0gaXMgaW5kaXJlY3RseSByZWN1cnNpdmU/Ci0KLVRoZSB3YXkgQGNvZGV7Z3Byb2Z9IHJlc29sdmVzIHRoaXMgcGFyYWRveCBpcyBieSBjcmVhdGluZyBhIHNpbmdsZSBlbnRyeQotZm9yIHRoZSBjeWNsZSBhcyBhIHdob2xlLiAgVGhlIHByaW1hcnkgbGluZSBvZiB0aGlzIGVudHJ5IGRlc2NyaWJlcyB0aGUKLXRvdGFsIHRpbWUgc3BlbnQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9ucyBvZiB0aGUgY3ljbGUuICBUaGUKLWBgc3Vicm91dGluZXMnJyBvZiB0aGUgY3ljbGUgYXJlIHRoZSBpbmRpdmlkdWFsIGZ1bmN0aW9ucyBvZiB0aGUgY3ljbGUsIGFuZAotYWxsIG90aGVyIGZ1bmN0aW9ucyB0aGF0IHdlcmUgY2FsbGVkIGRpcmVjdGx5IGJ5IHRoZW0uICBUaGUgYGBjYWxsZXJzJycgb2YKLXRoZSBjeWNsZSBhcmUgdGhlIGZ1bmN0aW9ucywgb3V0c2lkZSB0aGUgY3ljbGUsIHRoYXQgY2FsbGVkIGZ1bmN0aW9ucyBpbgotdGhlIGN5Y2xlLgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgcG9ydGlvbiBvZiBhIGNhbGwgZ3JhcGggd2hpY2ggc2hvd3MgYSBjeWNsZSBjb250YWluaW5nCi1mdW5jdGlvbnMgQGNvZGV7YX0gYW5kIEBjb2Rle2J9LiAgVGhlIGN5Y2xlIHdhcyBlbnRlcmVkIGJ5IGEgY2FsbCB0bwotQGNvZGV7YX0gZnJvbSBAY29kZXttYWlufTsgYm90aCBAY29kZXthfSBhbmQgQGNvZGV7Yn0gY2FsbGVkIEBjb2Rle2N9LgotCi1Ac21hbGxleGFtcGxlCi1pbmRleCAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuIGNhbGxlZCAgICAgbmFtZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAxLjc3ICAgICAgICAwICAgIDEvMSAgICAgICAgbWFpbiBbMl0KLVszXSAgICAgOTEuNzEgICAgMS43NyAgICAgICAgMCAgICAxKzUgICAgPGN5Y2xlIDEgYXMgYSB3aG9sZT4gWzNdCi0gICAgICAgICAgICAgICAgIDEuMDIgICAgICAgIDAgICAgMyAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KLSAgICAgICAgICAgICAgICAgMC43NSAgICAgICAgMCAgICAyICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi1bNF0gICAgIDUyLjg1ICAgIDEuMDIgICAgICAgIDAgICAgMCAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgMy82ICAgICAgICBjIFs2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAxLjc3ICAgICAgICAwICAgIDEvMSAgICAgICAgbWFpbiBbMl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotWzVdICAgICAzOC44NiAgICAwLjc1ICAgICAgICAwICAgIDEgICAgICBhIDxjeWNsZSAxPiBbNV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYyBbNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotKFRoZSBlbnRpcmUgY2FsbCBncmFwaCBmb3IgdGhpcyBwcm9ncmFtIGNvbnRhaW5zIGluIGFkZGl0aW9uIGFuIGVudHJ5IGZvcgotQGNvZGV7bWFpbn0sIHdoaWNoIGNhbGxzIEBjb2Rle2F9LCBhbmQgYW4gZW50cnkgZm9yIEBjb2Rle2N9LCB3aXRoIGNhbGxlcnMKLUBjb2Rle2F9IGFuZCBAY29kZXtifS4pCi0KLUBzbWFsbGV4YW1wbGUKLWluZGV4ICAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gY2FsbGVkICAgICBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BvbnRhbmVvdXM+Ci1bMV0gICAgMTAwLjAwICAgICAgIDAgICAgIDEuOTMgICAgMCAgICAgIHN0YXJ0IFsxXQotICAgICAgICAgICAgICAgICAwLjE2ICAgICAxLjc3ICAgIDEvMSAgICAgICAgbWFpbiBbMl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgMC4xNiAgICAgMS43NyAgICAxLzEgICAgICAgIHN0YXJ0IFsxXQotWzJdICAgIDEwMC4wMCAgICAwLjE2ICAgICAxLjc3ICAgIDEgICAgICBtYWluIFsyXQotICAgICAgICAgICAgICAgICAxLjc3ICAgICAgICAwICAgIDEvMSAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgIDEuNzcgICAgICAgIDAgICAgMS8xICAgICAgICBtYWluIFsyXQotWzNdICAgICA5MS43MSAgICAxLjc3ICAgICAgICAwICAgIDErNSAgICA8Y3ljbGUgMSBhcyBhIHdob2xlPiBbM10KLSAgICAgICAgICAgICAgICAgMS4wMiAgICAgICAgMCAgICAzICAgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAwLjc1ICAgICAgICAwICAgIDIgICAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgNi82ICAgICAgICBjIFs2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi1bNF0gICAgIDUyLjg1ICAgIDEuMDIgICAgICAgIDAgICAgMCAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgMy82ICAgICAgICBjIFs2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAxLjc3ICAgICAgICAwICAgIDEvMSAgICAgICAgbWFpbiBbMl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotWzVdICAgICAzOC44NiAgICAwLjc1ICAgICAgICAwICAgIDEgICAgICBhIDxjeWNsZSAxPiBbNV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYyBbNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi1bNl0gICAgICAwLjAwICAgICAgIDAgICAgICAgIDAgICAgNiAgICAgIGMgWzZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQGNvZGV7c2VsZn0gZmllbGQgb2YgdGhlIGN5Y2xlJ3MgcHJpbWFyeSBsaW5lIGlzIHRoZSB0b3RhbCB0aW1lCi1zcGVudCBpbiBhbGwgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgY3ljbGUuICBJdCBlcXVhbHMgdGhlIHN1bSBvZiB0aGUKLUBjb2Rle3NlbGZ9IGZpZWxkcyBmb3IgdGhlIGluZGl2aWR1YWwgZnVuY3Rpb25zIGluIHRoZSBjeWNsZSwgZm91bmQKLWluIHRoZSBlbnRyeSBpbiB0aGUgc3Vicm91dGluZSBsaW5lcyBmb3IgdGhlc2UgZnVuY3Rpb25zLgotCi1UaGUgQGNvZGV7Y2hpbGRyZW59IGZpZWxkcyBvZiB0aGUgY3ljbGUncyBwcmltYXJ5IGxpbmUgYW5kIHN1YnJvdXRpbmUgbGluZXMKLWNvdW50IG9ubHkgc3Vicm91dGluZXMgb3V0c2lkZSB0aGUgY3ljbGUuICBFdmVuIHRob3VnaCBAY29kZXthfSBjYWxscwotQGNvZGV7Yn0sIHRoZSB0aW1lIHNwZW50IGluIHRob3NlIGNhbGxzIHRvIEBjb2Rle2J9IGlzIG5vdCBjb3VudGVkIGluCi1AY29kZXthfSdzIEBjb2Rle2NoaWxkcmVufSB0aW1lLiAgVGh1cywgd2UgZG8gbm90IGVuY291bnRlciB0aGUgcHJvYmxlbSBvZgotd2hhdCB0byBkbyB3aGVuIHRoZSB0aW1lIGluIHRob3NlIGNhbGxzIHRvIEBjb2Rle2J9IGluY2x1ZGVzIGluZGlyZWN0Ci1yZWN1cnNpdmUgY2FsbHMgYmFjayB0byBAY29kZXthfS4KLQotVGhlIEBjb2Rle2NoaWxkcmVufSBmaWVsZCBvZiBhIGNhbGxlci1saW5lIGluIHRoZSBjeWNsZSdzIGVudHJ5IGVzdGltYXRlcwotdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IEBlbXBoe2luIHRoZSB3aG9sZSBjeWNsZX0sIGFuZCBpdHMgb3RoZXIKLXN1YnJvdXRpbmVzLCBvbiB0aGUgdGltZXMgd2hlbiB0aGF0IGNhbGxlciBjYWxsZWQgYSBmdW5jdGlvbiBpbiB0aGUgY3ljbGUuCi0KLVRoZSBAY29kZXtjYWxsc30gZmllbGQgaW4gdGhlIHByaW1hcnkgbGluZSBmb3IgdGhlIGN5Y2xlIGhhcyB0d28gbnVtYmVyczoKLWZpcnN0LCB0aGUgbnVtYmVyIG9mIHRpbWVzIGZ1bmN0aW9ucyBpbiB0aGUgY3ljbGUgd2VyZSBjYWxsZWQgYnkgZnVuY3Rpb25zCi1vdXRzaWRlIHRoZSBjeWNsZTsgc2Vjb25kLCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZXkgd2VyZSBjYWxsZWQgYnkKLWZ1bmN0aW9ucyBpbiB0aGUgY3ljbGUgKGluY2x1ZGluZyB0aW1lcyB3aGVuIGEgZnVuY3Rpb24gaW4gdGhlIGN5Y2xlIGNhbGxzCi1pdHNlbGYpLiAgVGhpcyBpcyBhIGdlbmVyYWxpemF0aW9uIG9mIHRoZSB1c3VhbCBzcGxpdCBpbnRvIG5vbnJlY3Vyc2l2ZSBhbmQKLXJlY3Vyc2l2ZSBjYWxscy4KLQotVGhlIEBjb2Rle2NhbGxzfSBmaWVsZCBvZiBhIHN1YnJvdXRpbmUtbGluZSBmb3IgYSBjeWNsZSBtZW1iZXIgaW4gdGhlCi1jeWNsZSdzIGVudHJ5IHNheXMgaG93IG1hbnkgdGltZSB0aGF0IGZ1bmN0aW9uIHdhcyBjYWxsZWQgZnJvbSBmdW5jdGlvbnMgaW4KLXRoZSBjeWNsZS4gIFRoZSB0b3RhbCBvZiBhbGwgdGhlc2UgaXMgdGhlIHNlY29uZCBudW1iZXIgaW4gdGhlIHByaW1hcnkgbGluZSdzCi1AY29kZXtjYWxsc30gZmllbGQuCi0KLUluIHRoZSBpbmRpdmlkdWFsIGVudHJ5IGZvciBhIGZ1bmN0aW9uIGluIGEgY3ljbGUsIHRoZSBvdGhlciBmdW5jdGlvbnMgaW4KLXRoZSBzYW1lIGN5Y2xlIGNhbiBhcHBlYXIgYXMgc3Vicm91dGluZXMgYW5kIGFzIGNhbGxlcnMuICBUaGVzZSBsaW5lcyBzaG93Ci1ob3cgbWFueSB0aW1lcyBlYWNoIGZ1bmN0aW9uIGluIHRoZSBjeWNsZSBjYWxsZWQgb3Igd2FzIGNhbGxlZCBmcm9tIGVhY2ggb3RoZXIKLWZ1bmN0aW9uIGluIHRoZSBjeWNsZS4gIFRoZSBAY29kZXtzZWxmfSBhbmQgQGNvZGV7Y2hpbGRyZW59IGZpZWxkcyBpbiB0aGVzZQotbGluZXMgYXJlIGJsYW5rIGJlY2F1c2Ugb2YgdGhlIGRpZmZpY3VsdHkgb2YgZGVmaW5pbmcgbWVhbmluZ3MgZm9yIHRoZW0KLXdoZW4gcmVjdXJzaW9uIGlzIGdvaW5nIG9uLgotCi1Abm9kZSBMaW5lLWJ5LWxpbmUsQW5ub3RhdGVkIFNvdXJjZSxDYWxsIEdyYXBoLE91dHB1dAotQHNlY3Rpb24gTGluZS1ieS1saW5lIFByb2ZpbGluZwotCi1AY29kZXtncHJvZn0ncyBAc2FtcHstbH0gb3B0aW9uIGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBwZXJmb3JtCi1AZGZue2xpbmUtYnktbGluZX0gcHJvZmlsaW5nLiAgSW4gdGhpcyBtb2RlLCBoaXN0b2dyYW0KLXNhbXBsZXMgYXJlIGFzc2lnbmVkIG5vdCB0byBmdW5jdGlvbnMsIGJ1dCB0byBpbmRpdmlkdWFsCi1saW5lcyBvZiBzb3VyY2UgY29kZS4gIFRoZSBwcm9ncmFtIHVzdWFsbHkgbXVzdCBiZSBjb21waWxlZAotd2l0aCBhIEBzYW1wey1nfSBvcHRpb24sIGluIGFkZGl0aW9uIHRvIEBzYW1wey1wZ30sIGluIG9yZGVyCi10byBnZW5lcmF0ZSBkZWJ1Z2dpbmcgc3ltYm9scyBmb3IgdHJhY2tpbmcgc291cmNlIGNvZGUgbGluZXMuCi0KLVRoZSBmbGF0IHByb2ZpbGUgaXMgdGhlIG1vc3QgdXNlZnVsIG91dHB1dCB0YWJsZQotaW4gbGluZS1ieS1saW5lIG1vZGUuCi1UaGUgY2FsbCBncmFwaCBpc24ndCBhcyB1c2VmdWwgYXMgbm9ybWFsLCBzaW5jZQotdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBAY29kZXtncHJvZn0gZG9lcyBub3QgcHJvcGFnYXRlCi1jYWxsIGdyYXBoIGFyY3MgZnJvbSBzb3VyY2UgY29kZSBsaW5lcyB0byB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uLgotVGhlIGNhbGwgZ3JhcGggZG9lcywgaG93ZXZlciwgc2hvdyBlYWNoIGxpbmUgb2YgY29kZQotdGhhdCBjYWxsZWQgZWFjaCBmdW5jdGlvbiwgYWxvbmcgd2l0aCBhIGNvdW50LgotCi1IZXJlIGlzIGEgc2VjdGlvbiBvZiBAY29kZXtncHJvZn0ncyBvdXRwdXQsIHdpdGhvdXQgbGluZS1ieS1saW5lIHByb2ZpbGluZy4KLU5vdGUgdGhhdCBAY29kZXtjdF9pbml0fSBhY2NvdW50ZWQgZm9yIGZvdXIgaGlzdG9ncmFtIGhpdHMsIGFuZAotMTMzMjcgY2FsbHMgdG8gQGNvZGV7aW5pdF9ibG9ja30uCi0KLUBzbWFsbGV4YW1wbGUKLUZsYXQgcHJvZmlsZToKLQotRWFjaCBzYW1wbGUgY291bnRzIGFzIDAuMDEgc2Vjb25kcy4KLSAgJSAgIGN1bXVsYXRpdmUgICBzZWxmICAgICAgICAgICAgICBzZWxmICAgICB0b3RhbCAgICAgICAgICAgCi0gdGltZSAgIHNlY29uZHMgICBzZWNvbmRzICAgIGNhbGxzICB1cy9jYWxsICB1cy9jYWxsICBuYW1lICAgIAotIDMwLjc3ICAgICAgMC4xMyAgICAgMC4wNCAgICAgNjMzNSAgICAgNi4zMSAgICAgNi4zMSAgY3RfaW5pdAotCi0KLQkJICAgICBDYWxsIGdyYXBoIChleHBsYW5hdGlvbiBmb2xsb3dzKQotCi0KLWdyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzIDQgYnl0ZShzKSBmb3IgNy42OSUgb2YgMC4xMyBzZWNvbmRzCi0KLWluZGV4ICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiAgICBjYWxsZWQgICAgIG5hbWUKLQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzEzNDk2ICAgICAgIG5hbWVfdG9vX2xvbmcKLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICA0MC8xMzQ5NiAgICAgICBkZWZsYXRlCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAxMjgvMTM0OTYgICAgICAgZGVmbGF0ZV9mYXN0Ci0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgMTMzMjcvMTM0OTYgICAgICAgY3RfaW5pdAotWzddICAgICAgMC4wICAgIDAuMDAgICAgMC4wMCAgIDEzNDk2ICAgICAgICAgaW5pdF9ibG9jawotCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Ob3cgbGV0J3MgbG9vayBhdCBzb21lIG9mIEBjb2Rle2dwcm9mfSdzIG91dHB1dCBmcm9tIHRoZSBzYW1lIHByb2dyYW0gcnVuLAotdGhpcyB0aW1lIHdpdGggbGluZS1ieS1saW5lIHByb2ZpbGluZyBlbmFibGVkLiAgTm90ZSB0aGF0IEBjb2Rle2N0X2luaXR9J3MKLWZvdXIgaGlzdG9ncmFtIGhpdHMgYXJlIGJyb2tlbiBkb3duIGludG8gZm91ciBsaW5lcyBvZiBzb3VyY2UgY29kZSAtIG9uZSBoaXQKLW9jY3VyZWQgb24gZWFjaCBvZiBsaW5lcyAzNDksIDM1MSwgMzgyIGFuZCAzODUuICBJbiB0aGUgY2FsbCBncmFwaCwKLW5vdGUgaG93Ci1AY29kZXtjdF9pbml0fSdzIDEzMzI3IGNhbGxzIHRvIEBjb2Rle2luaXRfYmxvY2t9IGFyZSBicm9rZW4gZG93bgotaW50byBvbmUgY2FsbCBmcm9tIGxpbmUgMzk2LCAzMDcxIGNhbGxzIGZyb20gbGluZSAzODQsIDM3MzAgY2FsbHMKLWZyb20gbGluZSAzODUsIGFuZCA2NTI1IGNhbGxzIGZyb20gMzg3LgotCi1Ac21hbGxleGFtcGxlCi1GbGF0IHByb2ZpbGU6Ci0KLUVhY2ggc2FtcGxlIGNvdW50cyBhcyAwLjAxIHNlY29uZHMuCi0gICUgICBjdW11bGF0aXZlICAgc2VsZiAgICAgICAgICAgICAgICAgICAgCi0gdGltZSAgIHNlY29uZHMgICBzZWNvbmRzICAgIGNhbGxzICBuYW1lICAgIAotICA3LjY5ICAgICAgMC4xMCAgICAgMC4wMSAgICAgICAgICAgY3RfaW5pdCAodHJlZXMuYzozNDkpCi0gIDcuNjkgICAgICAwLjExICAgICAwLjAxICAgICAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM1MSkKLSAgNy42OSAgICAgIDAuMTIgICAgIDAuMDEgICAgICAgICAgIGN0X2luaXQgKHRyZWVzLmM6MzgyKQotICA3LjY5ICAgICAgMC4xMyAgICAgMC4wMSAgICAgICAgICAgY3RfaW5pdCAodHJlZXMuYzozODUpCi0KLQotCQkgICAgIENhbGwgZ3JhcGggKGV4cGxhbmF0aW9uIGZvbGxvd3MpCi0KLQotZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgNCBieXRlKHMpIGZvciA3LjY5JSBvZiAwLjEzIHNlY29uZHMKLQotICAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gICAgY2FsbGVkICAgICBuYW1lCi0KLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzEzNDk2ICAgICAgIG5hbWVfdG9vX2xvbmcgKGd6aXAuYzoxNDQwKQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMTM0OTYgICAgICAgZGVmbGF0ZSAoZGVmbGF0ZS5jOjc2MykKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzEzNDk2ICAgICAgIGN0X2luaXQgKHRyZWVzLmM6Mzk2KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDIvMTM0OTYgICAgICAgZGVmbGF0ZSAoZGVmbGF0ZS5jOjcyNykKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICA0LzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo2ODYpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgNS8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6Njc1KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgMTIvMTM0OTYgICAgICAgZGVmbGF0ZSAoZGVmbGF0ZS5jOjY3OSkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgIDE2LzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo3MzApCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgIDEyOC8xMzQ5NiAgICAgICBkZWZsYXRlX2Zhc3QgKGRlZmxhdGUuYzo2NTQpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgMzA3MS8xMzQ5NiAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM4NCkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAzNzMwLzEzNDk2ICAgICAgIGN0X2luaXQgKHRyZWVzLmM6Mzg1KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgIDY1MjUvMTM0OTYgICAgICAgY3RfaW5pdCAodHJlZXMuYzozODcpCi1bNl0gIDAuMCAgICAwLjAwICAgIDAuMDAgICAxMzQ5NiAgICAgICAgIGluaXRfYmxvY2sgKHRyZWVzLmM6NDA4KQotCi1AZW5kIHNtYWxsZXhhbXBsZQotCi0KLUBub2RlIEFubm90YXRlZCBTb3VyY2UsLExpbmUtYnktbGluZSxPdXRwdXQKLUBzZWN0aW9uIFRoZSBBbm5vdGF0ZWQgU291cmNlIExpc3RpbmcKLQotQGNvZGV7Z3Byb2Z9J3MgQHNhbXB7LUF9IG9wdGlvbiB0cmlnZ2VycyBhbiBhbm5vdGF0ZWQgc291cmNlIGxpc3RpbmcsCi13aGljaCBsaXN0cyB0aGUgcHJvZ3JhbSdzIHNvdXJjZSBjb2RlLCBlYWNoIGZ1bmN0aW9uIGxhYmVsZWQgd2l0aCB0aGUKLW51bWJlciBvZiB0aW1lcyBpdCB3YXMgY2FsbGVkLiAgWW91IG1heSBhbHNvIG5lZWQgdG8gc3BlY2lmeSB0aGUKLUBzYW1wey1JfSBvcHRpb24sIGlmIEBjb2Rle2dwcm9mfSBjYW4ndCBmaW5kIHRoZSBzb3VyY2UgY29kZSBmaWxlcy4KLQotQ29tcGlsaW5nIHdpdGggQHNhbXB7Z2NjIEBkb3Rze30gLWcgLXBnIC1hfSBhdWdtZW50cyB5b3VyIHByb2dyYW0KLXdpdGggYmFzaWMtYmxvY2sgY291bnRpbmcgY29kZSwgaW4gYWRkaXRpb24gdG8gZnVuY3Rpb24gY291bnRpbmcgY29kZS4KLVRoaXMgZW5hYmxlcyBAY29kZXtncHJvZn0gdG8gZGV0ZXJtaW5lIGhvdyBtYW55IHRpbWVzIGVhY2ggbGluZQotb2YgY29kZSB3YXMgZXhldWN0ZWQuCi1Gb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiwgdGFrZW4gZnJvbSBnemlwLAotd2l0aCBsaW5lIG51bWJlcnMgYWRkZWQ6Ci0KLUBzbWFsbGV4YW1wbGUKLSAxIHVsZyB1cGRjcmMocywgbikKLSAyICAgICB1Y2ggKnM7Ci0gMyAgICAgdW5zaWduZWQgbjsKLSA0IEB7Ci0gNSAgICAgcmVnaXN0ZXIgdWxnIGM7Ci0gNgotIDcgICAgIHN0YXRpYyB1bGcgY3JjID0gKHVsZykweGZmZmZmZmZmTDsKLSA4Ci0gOSAgICAgaWYgKHMgPT0gTlVMTCkgQHsKLTEwICAgICAgICAgYyA9IDB4ZmZmZmZmZmZMOwotMTEgICAgIEB9IGVsc2UgQHsKLTEyICAgICAgICAgYyA9IGNyYzsKLTEzICAgICAgICAgaWYgKG4pIGRvIEB7Ci0xNCAgICAgICAgICAgICBjID0gY3JjXzMyX3RhYlsuLi5dOwotMTUgICAgICAgICBAfSB3aGlsZSAoLS1uKTsKLTE2ICAgICBAfQotMTcgICAgIGNyYyA9IGM7Ci0xOCAgICAgcmV0dXJuIGMgXiAweGZmZmZmZmZmTDsKLTE5IEB9Ci0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle3VwZGNyY30gaGFzIGF0IGxlYXN0IGZpdmUgYmFzaWMtYmxvY2tzLgotT25lIGlzIHRoZSBmdW5jdGlvbiBpdHNlbGYuICBUaGUKLUBjb2Rle2lmfSBzdGF0ZW1lbnQgb24gbGluZSA5IGdlbmVyYXRlcyB0d28gbW9yZSBiYXNpYy1ibG9ja3MsIG9uZQotZm9yIGVhY2ggYnJhbmNoIG9mIHRoZSBAY29kZXtpZn0uICBBIGZvdXJ0aCBiYXNpYy1ibG9jayByZXN1bHRzIGZyb20KLXRoZSBAY29kZXtpZn0gb24gbGluZSAxMywgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgQGNvZGV7ZG99IGxvb3AgZm9ybQotdGhlIGZpZnRoIGJhc2ljLWJsb2NrLiAgVGhlIGNvbXBpbGVyIG1heSBhbHNvIGdlbmVyYXRlIGFkZGl0aW9uYWwKLWJhc2ljLWJsb2NrcyB0byBoYW5kbGUgdmFyaW91cyBzcGVjaWFsIGNhc2VzLgotCi1BIHByb2dyYW0gYXVnbWVudGVkIGZvciBiYXNpYy1ibG9jayBjb3VudGluZyBjYW4gYmUgYW5hbHl6ZWQgd2l0aAotQGNvZGV7Z3Byb2YgLWwgLUF9LiAgSSBhbHNvIHN1Z2dlc3QgdXNlIG9mIHRoZSBAc2FtcHsteH0gb3B0aW9uLAotd2hpY2ggZW5zdXJlcyB0aGF0IGVhY2ggbGluZSBvZiBjb2RlIGlzIGxhYmVsZWQgYXQgbGVhc3Qgb25jZS4KLUhlcmUgaXMgQGNvZGV7dXBkY3JjfSdzCi1hbm5vdGF0ZWQgc291cmNlIGxpc3RpbmcgZm9yIGEgc2FtcGxlIEBjb2Rle2d6aXB9IHJ1bjoKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICAgICAgICAgIHVsZyB1cGRjcmMocywgbikKLSAgICAgICAgICAgICAgICAgICAgdWNoICpzOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBuOwotICAgICAgICAgICAgMiAtPkB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHVsZyBjOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdWxnIGNyYyA9ICh1bGcpMHhmZmZmZmZmZkw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAyIC0+ICAgIGlmIChzID09IE5VTEwpIEB7Ci0gICAgICAgICAgICAxIC0+CWMgPSAweGZmZmZmZmZmTDsKLSAgICAgICAgICAgIDEgLT4gICAgQH0gZWxzZSBAewotICAgICAgICAgICAgMSAtPgljID0gY3JjOwotICAgICAgICAgICAgMSAtPiAgICAgICAgaWYgKG4pIGRvIEB7Ci0gICAgICAgIDI2MzEyIC0+ICAgICAgICAgICAgYyA9IGNyY18zMl90YWJbLi4uXTsKLTI2MzEyLDEsMjYzMTEgLT4gICAgICAgIEB9IHdoaWxlICgtLW4pOwotICAgICAgICAgICAgICAgICAgICBAfQotICAgICAgICAgICAgMiAtPiAgICBjcmMgPSBjOwotICAgICAgICAgICAgMiAtPiAgICByZXR1cm4gYyBeIDB4ZmZmZmZmZmZMOwotICAgICAgICAgICAgMiAtPkB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1JbiB0aGlzIGV4YW1wbGUsIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkIHR3aWNlLCBwYXNzaW5nIG9uY2UgdGhyb3VnaAotZWFjaCBicmFuY2ggb2YgdGhlIEBjb2Rle2lmfSBzdGF0ZW1lbnQuICBUaGUgYm9keSBvZiB0aGUgQGNvZGV7ZG99Ci1sb29wIHdhcyBleGVjdXRlZCBhIHRvdGFsIG9mIDI2MzEyIHRpbWVzLiAgTm90ZSBob3cgdGhlIEBjb2Rle3doaWxlfQotc3RhdGVtZW50IGlzIGFubm90YXRlZC4gIEl0IGJlZ2FuIGV4ZWN1dGlvbiAyNjMxMiB0aW1lcywgb25jZSBmb3IKLWVhY2ggaXRlcmF0aW9uIHRocm91Z2ggdGhlIGxvb3AuICBPbmUgb2YgdGhvc2UgdGltZXMgKHRoZSBsYXN0IHRpbWUpCi1pdCBleGl0ZWQsIHdoaWxlIGl0IGJyYW5jaGVkIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9vcCAyNjMxMSB0aW1lcy4KLQotQG5vZGUgSW5hY2N1cmFjeQotQGNoYXB0ZXIgSW5hY2N1cmFjeSBvZiBAY29kZXtncHJvZn0gT3V0cHV0Ci0KLUBtZW51Ci0qIFNhbXBsaW5nIEVycm9yOjogICAgICBTdGF0aXN0aWNhbCBtYXJnaW5zIG9mIGVycm9yCi0qIEFzc3VtcHRpb25zOjogICAgICAgICBFc3RpbWF0aW5nIGNoaWxkcmVuIHRpbWVzCi1AZW5kIG1lbnUKLQotQG5vZGUgU2FtcGxpbmcgRXJyb3IsQXNzdW1wdGlvbnMsLEluYWNjdXJhY3kKLUBzZWN0aW9uIFN0YXRpc3RpY2FsIFNhbXBsaW5nIEVycm9yCi0KLVRoZSBydW4tdGltZSBmaWd1cmVzIHRoYXQgQGNvZGV7Z3Byb2Z9IGdpdmVzIHlvdSBhcmUgYmFzZWQgb24gYSBzYW1wbGluZwotcHJvY2Vzcywgc28gdGhleSBhcmUgc3ViamVjdCB0byBzdGF0aXN0aWNhbCBpbmFjY3VyYWN5LiAgSWYgYSBmdW5jdGlvbiBydW5zCi1vbmx5IGEgc21hbGwgYW1vdW50IG9mIHRpbWUsIHNvIHRoYXQgb24gdGhlIGF2ZXJhZ2UgdGhlIHNhbXBsaW5nIHByb2Nlc3MKLW91Z2h0IHRvIGNhdGNoIHRoYXQgZnVuY3Rpb24gaW4gdGhlIGFjdCBvbmx5IG9uY2UsIHRoZXJlIGlzIGEgcHJldHR5IGdvb2QKLWNoYW5jZSBpdCB3aWxsIGFjdHVhbGx5IGZpbmQgdGhhdCBmdW5jdGlvbiB6ZXJvIHRpbWVzLCBvciB0d2ljZS4KLQotQnkgY29udHJhc3QsIHRoZSBudW1iZXItb2YtY2FsbHMgYW5kIGJhc2ljLWJsb2NrIGZpZ3VyZXMKLWFyZSBkZXJpdmVkIGJ5IGNvdW50aW5nLCBub3QKLXNhbXBsaW5nLiAgVGhleSBhcmUgY29tcGxldGVseSBhY2N1cmF0ZSBhbmQgd2lsbCBub3QgdmFyeSBmcm9tIHJ1biB0byBydW4KLWlmIHlvdXIgcHJvZ3JhbSBpcyBkZXRlcm1pbmlzdGljLgotCi1UaGUgQGRmbntzYW1wbGluZyBwZXJpb2R9IHRoYXQgaXMgcHJpbnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmbGF0Ci1wcm9maWxlIHNheXMgaG93IG9mdGVuIHNhbXBsZXMgYXJlIHRha2VuLiAgVGhlIHJ1bGUgb2YgdGh1bWIgaXMgdGhhdCBhCi1ydW4tdGltZSBmaWd1cmUgaXMgYWNjdXJhdGUgaWYgaXQgaXMgY29uc2lkZXJhYmx5IGJpZ2dlciB0aGFuIHRoZSBzYW1wbGluZwotcGVyaW9kLgotCi1UaGUgYWN0dWFsIGFtb3VudCBvZiBlcnJvciBjYW4gYmUgcHJlZGljdGVkLgotRm9yIEB2YXJ7bn0gc2FtcGxlcywgdGhlIEBlbXBoe2V4cGVjdGVkfSBlcnJvcgotaXMgdGhlIHNxdWFyZS1yb290IG9mIEB2YXJ7bn0uICBGb3IgZXhhbXBsZSwKLWlmIHRoZSBzYW1wbGluZyBwZXJpb2QgaXMgMC4wMSBzZWNvbmRzIGFuZCBAY29kZXtmb299J3MgcnVuLXRpbWUgaXMgMSBzZWNvbmQsCi1AdmFye259IGlzIDEwMCBzYW1wbGVzICgxIHNlY29uZC8wLjAxIHNlY29uZHMpLCBzcXJ0KEB2YXJ7bn0pIGlzIDEwIHNhbXBsZXMsIHNvCi10aGUgZXhwZWN0ZWQgZXJyb3IgaW4gQGNvZGV7Zm9vfSdzIHJ1bi10aW1lIGlzIDAuMSBzZWNvbmRzICgxMCowLjAxIHNlY29uZHMpLAotb3IgdGVuIHBlcmNlbnQgb2YgdGhlIG9ic2VydmVkIHZhbHVlLgotQWdhaW4sIGlmIHRoZSBzYW1wbGluZyBwZXJpb2QgaXMgMC4wMSBzZWNvbmRzIGFuZCBAY29kZXtiYXJ9J3MgcnVuLXRpbWUgaXMKLTEwMCBzZWNvbmRzLCBAdmFye259IGlzIDEwMDAwIHNhbXBsZXMsIHNxcnQoQHZhcntufSkgaXMgMTAwIHNhbXBsZXMsIHNvCi10aGUgZXhwZWN0ZWQgZXJyb3IgaW4gQGNvZGV7YmFyfSdzIHJ1bi10aW1lIGlzIDEgc2Vjb25kLAotb3Igb25lIHBlcmNlbnQgb2YgdGhlIG9ic2VydmVkIHZhbHVlLgotSXQgaXMgbGlrZWx5IHRvCi12YXJ5IHRoaXMgbXVjaCBAZW1waHtvbiB0aGUgYXZlcmFnZX0gZnJvbSBvbmUgcHJvZmlsaW5nIHJ1biB0byB0aGUgbmV4dC4KLShAZW1waHtTb21ldGltZXN9IGl0IHdpbGwgdmFyeSBtb3JlLikKLQotVGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgYSBzbWFsbCBydW4tdGltZSBmaWd1cmUgaXMgZGV2b2lkIG9mIGluZm9ybWF0aW9uLgotSWYgdGhlIHByb2dyYW0ncyBAZW1waHt0b3RhbH0gcnVuLXRpbWUgaXMgbGFyZ2UsIGEgc21hbGwgcnVuLXRpbWUgZm9yIG9uZQotZnVuY3Rpb24gZG9lcyB0ZWxsIHlvdSB0aGF0IHRoYXQgZnVuY3Rpb24gdXNlZCBhbiBpbnNpZ25pZmljYW50IGZyYWN0aW9uIG9mCi10aGUgd2hvbGUgcHJvZ3JhbSdzIHRpbWUuICBVc3VhbGx5IHRoaXMgbWVhbnMgaXQgaXMgbm90IHdvcnRoIG9wdGltaXppbmcuCi0KLU9uZSB3YXkgdG8gZ2V0IG1vcmUgYWNjdXJhY3kgaXMgdG8gZ2l2ZSB5b3VyIHByb2dyYW0gbW9yZSAoYnV0IHNpbWlsYXIpCi1pbnB1dCBkYXRhIHNvIGl0IHdpbGwgdGFrZSBsb25nZXIuICBBbm90aGVyIHdheSBpcyB0byBjb21iaW5lIHRoZSBkYXRhIGZyb20KLXNldmVyYWwgcnVucywgdXNpbmcgdGhlIEBzYW1wey1zfSBvcHRpb24gb2YgQGNvZGV7Z3Byb2Z9LiAgSGVyZSBpcyBob3c6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1SdW4geW91ciBwcm9ncmFtIG9uY2UuCi0KLUBpdGVtCi1Jc3N1ZSB0aGUgY29tbWFuZCBAc2FtcHttdiBnbW9uLm91dCBnbW9uLnN1bX0uCi0KLUBpdGVtCi1SdW4geW91ciBwcm9ncmFtIGFnYWluLCB0aGUgc2FtZSBhcyBiZWZvcmUuCi0KLUBpdGVtCi1NZXJnZSB0aGUgbmV3IGRhdGEgaW4gQGZpbGV7Z21vbi5vdXR9IGludG8gQGZpbGV7Z21vbi5zdW19IHdpdGggdGhpcyBjb21tYW5kOgotCi1AZXhhbXBsZQotZ3Byb2YgLXMgQHZhcntleGVjdXRhYmxlLWZpbGV9IGdtb24ub3V0IGdtb24uc3VtCi1AZW5kIGV4YW1wbGUKLQotQGl0ZW0KLVJlcGVhdCB0aGUgbGFzdCB0d28gc3RlcHMgYXMgb2Z0ZW4gYXMgeW91IHdpc2guCi0KLUBpdGVtCi1BbmFseXplIHRoZSBjdW11bGF0aXZlIGRhdGEgdXNpbmcgdGhpcyBjb21tYW5kOgotCi1AZXhhbXBsZQotZ3Byb2YgQHZhcntleGVjdXRhYmxlLWZpbGV9IGdtb24uc3VtID4gQHZhcntvdXRwdXQtZmlsZX0KLUBlbmQgZXhhbXBsZQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgQXNzdW1wdGlvbnMsLFNhbXBsaW5nIEVycm9yLEluYWNjdXJhY3kKLUBzZWN0aW9uIEVzdGltYXRpbmcgQGNvZGV7Y2hpbGRyZW59IFRpbWVzCi0KLVNvbWUgb2YgdGhlIGZpZ3VyZXMgaW4gdGhlIGNhbGwgZ3JhcGggYXJlIGVzdGltYXRlcy0tLWZvciBleGFtcGxlLCB0aGUKLUBjb2Rle2NoaWxkcmVufSB0aW1lIHZhbHVlcyBhbmQgYWxsIHRoZSB0aGUgdGltZSBmaWd1cmVzIGluIGNhbGxlciBhbmQKLXN1YnJvdXRpbmUgbGluZXMuCi0KLVRoZXJlIGlzIG5vIGRpcmVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBtZWFzdXJlbWVudHMgaW4gdGhlIHByb2ZpbGUKLWRhdGEgaXRzZWxmLiAgSW5zdGVhZCwgQGNvZGV7Z3Byb2Z9IGVzdGltYXRlcyB0aGVtIGJ5IG1ha2luZyBhbiBhc3N1bXB0aW9uCi1hYm91dCB5b3VyIHByb2dyYW0gdGhhdCBtaWdodCBvciBtaWdodCBub3QgYmUgdHJ1ZS4KLQotVGhlIGFzc3VtcHRpb24gbWFkZSBpcyB0aGF0IHRoZSBhdmVyYWdlIHRpbWUgc3BlbnQgaW4gZWFjaCBjYWxsIHRvIGFueQotZnVuY3Rpb24gQGNvZGV7Zm9vfSBpcyBub3QgY29ycmVsYXRlZCB3aXRoIHdobyBjYWxsZWQgQGNvZGV7Zm9vfS4gIElmCi1AY29kZXtmb299IHVzZWQgNSBzZWNvbmRzIGluIGFsbCwgYW5kIDIvNSBvZiB0aGUgY2FsbHMgdG8gQGNvZGV7Zm9vfSBjYW1lCi1mcm9tIEBjb2Rle2F9LCB0aGVuIEBjb2Rle2Zvb30gY29udHJpYnV0ZXMgMiBzZWNvbmRzIHRvIEBjb2Rle2F9J3MKLUBjb2Rle2NoaWxkcmVufSB0aW1lLCBieSBhc3N1bXB0aW9uLgotCi1UaGlzIGFzc3VtcHRpb24gaXMgdXN1YWxseSB0cnVlIGVub3VnaCwgYnV0IGZvciBzb21lIHByb2dyYW1zIGl0IGlzIGZhcgotZnJvbSB0cnVlLiAgU3VwcG9zZSB0aGF0IEBjb2Rle2Zvb30gcmV0dXJucyB2ZXJ5IHF1aWNrbHkgd2hlbiBpdHMgYXJndW1lbnQKLWlzIHplcm87IHN1cHBvc2UgdGhhdCBAY29kZXthfSBhbHdheXMgcGFzc2VzIHplcm8gYXMgYW4gYXJndW1lbnQsIHdoaWxlCi1vdGhlciBjYWxsZXJzIG9mIEBjb2Rle2Zvb30gcGFzcyBvdGhlciBhcmd1bWVudHMuICBJbiB0aGlzIHByb2dyYW0sIGFsbCB0aGUKLXRpbWUgc3BlbnQgaW4gQGNvZGV7Zm9vfSBpcyBpbiB0aGUgY2FsbHMgZnJvbSBjYWxsZXJzIG90aGVyIHRoYW4gQGNvZGV7YX0uCi1CdXQgQGNvZGV7Z3Byb2Z9IGhhcyBubyB3YXkgb2Yga25vd2luZyB0aGlzOyBpdCB3aWxsIGJsaW5kbHkgYW5kCi1pbmNvcnJlY3RseSBjaGFyZ2UgMiBzZWNvbmRzIG9mIHRpbWUgaW4gQGNvZGV7Zm9vfSB0byB0aGUgY2hpbGRyZW4gb2YKLUBjb2Rle2F9LgotCi1AYyBGSVhNRSAtIGhhcyB0aGlzIGJlZW4gZml4ZWQ/Ci1XZSBob3BlIHNvbWUgZGF5IHRvIHB1dCBtb3JlIGNvbXBsZXRlIGRhdGEgaW50byBAZmlsZXtnbW9uLm91dH0sIHNvIHRoYXQKLXRoaXMgYXNzdW1wdGlvbiBpcyBubyBsb25nZXIgbmVlZGVkLCBpZiB3ZSBjYW4gZmlndXJlIG91dCBob3cuICBGb3IgdGhlCi1ub25jZSwgdGhlIGVzdGltYXRlZCBmaWd1cmVzIGFyZSB1c3VhbGx5IG1vcmUgdXNlZnVsIHRoYW4gbWlzbGVhZGluZy4KLQotQG5vZGUgSG93IGRvIEk/Ci1AY2hhcHRlciBBbnN3ZXJzIHRvIENvbW1vbiBRdWVzdGlvbnMKLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBIb3cgZG8gSSBmaW5kIHdoaWNoIGxpbmVzIGluIG15IHByb2dyYW0gd2VyZSBleGVjdXRlZCB0aGUgbW9zdCB0aW1lcz8KLQotQ29tcGlsZSB5b3VyIHByb2dyYW0gd2l0aCBiYXNpYy1ibG9jayBjb3VudGluZyBlbmFibGVkLCBydW4gaXQsIHRoZW4KLXVzZSB0aGUgZm9sbG93aW5nIHBpcGVsaW5lOgotCi1AZXhhbXBsZQotZ3Byb2YgLWwgLUMgQHZhcntvYmpmaWxlfSB8IHNvcnQgLWsgMyAtbiAtcgotQGVuZCBleGFtcGxlCi0KLVRoaXMgbGlzdGluZyB3aWxsIHNob3cgeW91IHRoZSBsaW5lcyBpbiB5b3VyIGNvZGUgZXhlY3V0ZWQgbW9zdCBvZnRlbiwKLWJ1dCBub3QgbmVjZXNzYXJpbHkgdGhvc2UgdGhhdCBjb25zdW1lZCB0aGUgbW9zdCB0aW1lLgotCi1AaXRlbSBIb3cgZG8gSSBmaW5kIHdoaWNoIGxpbmVzIGluIG15IHByb2dyYW0gY2FsbGVkIGEgcGFydGljdWxhciBmdW5jdGlvbj8KLQotVXNlIEBjb2Rle2dwcm9mIC1sfSBhbmQgbG9va3VwIHRoZSBmdW5jdGlvbiBpbiB0aGUgY2FsbCBncmFwaC4KLVRoZSBjYWxsZXJzIHdpbGwgYmUgYnJva2VuIGRvd24gYnkgZnVuY3Rpb24gYW5kIGxpbmUgbnVtYmVyLgotCi1AaXRlbSBIb3cgZG8gSSBhbmFseXplIGEgcHJvZ3JhbSB0aGF0IHJ1bnMgZm9yIGxlc3MgdGhhbiBhIHNlY29uZD8KLQotVHJ5IHVzaW5nIGEgc2hlbGwgc2NyaXB0IGxpa2UgdGhpcyBvbmU6Ci0KLUBleGFtcGxlCi1mb3IgaSBpbiBgc2VxIDEgMTAwYDsgZG8KLSAgZmFzdHByb2cKLSAgbXYgZ21vbi5vdXQgZ21vbi5vdXQuJGkKLWRvbmUKLQotZ3Byb2YgLXMgZmFzdHByb2cgZ21vbi5vdXQuKgotCi1ncHJvZiBmYXN0cHJvZyBnbW9uLnN1bQotQGVuZCBleGFtcGxlCi0KLUlmIHlvdXIgcHJvZ3JhbSBpcyBjb21wbGV0ZWx5IGRldGVybWluaXN0aWMsIGFsbCB0aGUgY2FsbCBjb3VudHMKLXdpbGwgYmUgc2ltcGxlIG11bHRpcGxlcyBvZiAxMDAgKGkuZS4gYSBmdW5jdGlvbiBjYWxsZWQgb25jZSBpbgotZWFjaCBydW4gd2lsbCBhcHBlYXIgd2l0aCBhIGNhbGwgY291bnQgb2YgMTAwKS4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBJbmNvbXBhdGliaWxpdGllcwotQGNoYXB0ZXIgSW5jb21wYXRpYmlsaXRpZXMgd2l0aCBVbml4IEBjb2Rle2dwcm9mfQotCi1Ac2N7Z251fSBAY29kZXtncHJvZn0gYW5kIEJlcmtlbGV5IFVuaXggQGNvZGV7Z3Byb2Z9IHVzZSB0aGUgc2FtZSBkYXRhCi1maWxlIEBmaWxle2dtb24ub3V0fSwgYW5kIHByb3ZpZGUgZXNzZW50aWFsbHkgdGhlIHNhbWUgaW5mb3JtYXRpb24uICBCdXQKLXRoZXJlIGFyZSBhIGZldyBkaWZmZXJlbmNlcy4KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUBzY3tnbnV9IEBjb2Rle2dwcm9mfSB1c2VzIGEgbmV3LCBnZW5lcmFsaXplZCBmaWxlIGZvcm1hdCB3aXRoIHN1cHBvcnQKLWZvciBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGFuZCBub24tcmVhbHRpbWUgaGlzdG9ncmFtcy4gIEEgbWFnaWMKLWNvb2tpZSBhbmQgdmVyc2lvbiBudW1iZXIgYWxsb3dzIEBjb2Rle2dwcm9mfSB0byBlYXNpbHkgaWRlbnRpZnkKLW5ldyBzdHlsZSBmaWxlcy4gIE9sZCBCU0Qtc3R5bGUgZmlsZXMgY2FuIHN0aWxsIGJlIHJlYWQuCi1AeHJlZntGaWxlIEZvcm1hdH0uCi0KLUBpdGVtCi1Gb3IgYSByZWN1cnNpdmUgZnVuY3Rpb24sIFVuaXggQGNvZGV7Z3Byb2Z9IGxpc3RzIHRoZSBmdW5jdGlvbiBhcyBhCi1wYXJlbnQgYW5kIGFzIGEgY2hpbGQsIHdpdGggYSBAY29kZXtjYWxsc30gZmllbGQgdGhhdCBsaXN0cyB0aGUgbnVtYmVyCi1vZiByZWN1cnNpdmUgY2FsbHMuICBAc2N7Z251fSBAY29kZXtncHJvZn0gb21pdHMgdGhlc2UgbGluZXMgYW5kIHB1dHMKLXRoZSBudW1iZXIgb2YgcmVjdXJzaXZlIGNhbGxzIGluIHRoZSBwcmltYXJ5IGxpbmUuCi0KLUBpdGVtCi1XaGVuIGEgZnVuY3Rpb24gaXMgc3VwcHJlc3NlZCBmcm9tIHRoZSBjYWxsIGdyYXBoIHdpdGggQHNhbXB7LWV9LCBAc2N7Z251fQotQGNvZGV7Z3Byb2Z9IHN0aWxsIGxpc3RzIGl0IGFzIGEgc3Vicm91dGluZSBvZiBmdW5jdGlvbnMgdGhhdCBjYWxsIGl0LgotCi1AaXRlbQotQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGFjY2VwdHMgdGhlIEBzYW1wey1rfSB3aXRoIGl0cyBhcmd1bWVudAotaW4gdGhlIGZvcm0gQHNhbXB7ZnJvbS90b30sIGluc3RlYWQgb2YgQHNhbXB7ZnJvbSB0b30uCi0KLUBpdGVtCi1JbiB0aGUgYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nLAotaWYgdGhlcmUgYXJlIG11bHRpcGxlIGJhc2ljIGJsb2NrcyBvbiB0aGUgc2FtZSBsaW5lLAotQHNje2dudX0gQGNvZGV7Z3Byb2Z9IHByaW50cyBhbGwgb2YgdGhlaXIgY291bnRzLCBzZXBlcmF0ZWQgYnkgY29tbWFzLgotCi1AaWdub3JlIC0gaXQgZG9lcyB0aGlzIG5vdwotQGl0ZW0KLVRoZSBmdW5jdGlvbiBuYW1lcyBwcmludGVkIGluIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSBvdXRwdXQgZG8gbm90IGluY2x1ZGUKLXRoZSBsZWFkaW5nIHVuZGVyc2NvcmVzIHRoYXQgYXJlIGFkZGVkIGludGVybmFsbHkgdG8gdGhlIGZyb250IG9mIGFsbAotQyBpZGVudGlmaWVycyBvbiBtYW55IG9wZXJhdGluZyBzeXN0ZW1zLgotQGVuZCBpZ25vcmUKLQotQGl0ZW0KLVRoZSBibHVyYnMsIGZpZWxkIHdpZHRocywgYW5kIG91dHB1dCBmb3JtYXRzIGFyZSBkaWZmZXJlbnQuICBAc2N7Z251fQotQGNvZGV7Z3Byb2Z9IHByaW50cyBibHVyYnMgYWZ0ZXIgdGhlIHRhYmxlcywgc28gdGhhdCB5b3UgY2FuIHNlZSB0aGUKLXRhYmxlcyB3aXRob3V0IHNraXBwaW5nIHRoZSBibHVyYnMuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgRGV0YWlscwotQGNoYXB0ZXIgRGV0YWlscyBvZiBQcm9maWxpbmcKLQotQG1lbnUKLSogSW1wbGVtZW50YXRpb246OiAgICAgIEhvdyBhIHByb2dyYW0gY29sbGV0cyBwcm9maWxpbmcgaW5mb3JtYXRpb24KLSogRmlsZSBGb3JtYXQ6OiAgICAgICAgIEZvcm1hdCBvZiBAc2FtcHtnbW9uLm91dH0gZmlsZXMKLSogSW50ZXJuYWxzOjogICAgICAgICAgIEBjb2Rle2dwcm9mfSdzIGludGVybmFsIG9wZXJhdGlvbgotKiBEZWJ1Z2dpbmc6OiAgICAgICAgICAgVXNpbmcgQGNvZGV7Z3Byb2Z9J3MgQHNhbXB7LWR9IG9wdGlvbgotQGVuZCBtZW51Ci0KLUBub2RlIEltcGxlbWVudGF0aW9uLEZpbGUgRm9ybWF0LCxEZXRhaWxzCi1Ac2VjdGlvbiBJbXBsZW1lbnRhdGlvbiBvZiBQcm9maWxpbmcKLQotUHJvZmlsaW5nIHdvcmtzIGJ5IGNoYW5naW5nIGhvdyBldmVyeSBmdW5jdGlvbiBpbiB5b3VyIHByb2dyYW0gaXMgY29tcGlsZWQKLXNvIHRoYXQgd2hlbiBpdCBpcyBjYWxsZWQsIGl0IHdpbGwgc3Rhc2ggYXdheSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlCi1pdCB3YXMgY2FsbGVkIGZyb20uICBGcm9tIHRoaXMsIHRoZSBwcm9maWxlciBjYW4gZmlndXJlIG91dCB3aGF0IGZ1bmN0aW9uCi1jYWxsZWQgaXQsIGFuZCBjYW4gY291bnQgaG93IG1hbnkgdGltZXMgaXQgd2FzIGNhbGxlZC4gIFRoaXMgY2hhbmdlIGlzIG1hZGUKLWJ5IHRoZSBjb21waWxlciB3aGVuIHlvdXIgcHJvZ3JhbSBpcyBjb21waWxlZCB3aXRoIHRoZSBAc2FtcHstcGd9IG9wdGlvbiwKLXdoaWNoIGNhdXNlcyBldmVyeSBmdW5jdGlvbiB0byBjYWxsIEBjb2Rle21jb3VudH0KLShvciBAY29kZXtfbWNvdW50fSwgb3IgQGNvZGV7X19tY291bnR9LCBkZXBlbmRpbmcgb24gdGhlIE9TIGFuZCBjb21waWxlcikKLWFzIG9uZSBvZiBpdHMgZmlyc3Qgb3BlcmF0aW9ucy4KLQotVGhlIEBjb2Rle21jb3VudH0gcm91dGluZSwgaW5jbHVkZWQgaW4gdGhlIHByb2ZpbGluZyBsaWJyYXJ5LAotaXMgcmVzcG9uc2libGUgZm9yIHJlY29yZGluZyBpbiBhbiBpbi1tZW1vcnkgY2FsbCBncmFwaCB0YWJsZQotYm90aCBpdHMgcGFyZW50IHJvdXRpbmUgKHRoZSBjaGlsZCkgYW5kIGl0cyBwYXJlbnQncyBwYXJlbnQuICBUaGlzIGlzCi10eXBpY2FsbHkgZG9uZSBieSBleGFtaW5pbmcgdGhlIHN0YWNrIGZyYW1lIHRvIGZpbmQgYm90aAotdGhlIGFkZHJlc3Mgb2YgdGhlIGNoaWxkLCBhbmQgdGhlIHJldHVybiBhZGRyZXNzIGluIHRoZSBvcmlnaW5hbCBwYXJlbnQuCi1TaW5jZSB0aGlzIGlzIGEgdmVyeSBtYWNoaW5lLWRlcGVuZGFudCBvcGVyYXRpb24sIEBjb2Rle21jb3VudH0KLWl0c2VsZiBpcyB0eXBpY2FsbHkgYSBzaG9ydCBhc3NlbWJseS1sYW5ndWFnZSBzdHViIHJvdXRpbmUKLXRoYXQgZXh0cmFjdHMgdGhlIHJlcXVpcmVkCi1pbmZvcm1hdGlvbiwgYW5kIHRoZW4gY2FsbHMgQGNvZGV7X19tY291bnRfaW50ZXJuYWx9Ci0oYSBub3JtYWwgQyBmdW5jdGlvbikgd2l0aCB0d28gYXJndW1lbnRzIC0gQGNvZGV7ZnJvbXBjfSBhbmQgQGNvZGV7c2VsZnBjfS4KLUBjb2Rle19fbWNvdW50X2ludGVybmFsfSBpcyByZXNwb25zaWJsZSBmb3IgbWFpbnRhaW5pbmcKLXRoZSBpbi1tZW1vcnkgY2FsbCBncmFwaCwgd2hpY2ggcmVjb3JkcyBAY29kZXtmcm9tcGN9LCBAY29kZXtzZWxmcGN9LAotYW5kIHRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCBvZiB0aGVzZSBjYWxsIGFyY3Mgd2FzIHRyYW5zdmVyc2VkLgotCi1HQ0MgVmVyc2lvbiAyIHByb3ZpZGVzIGEgbWFnaWNhbCBmdW5jdGlvbiAoQGNvZGV7X19idWlsdGluX3JldHVybl9hZGRyZXNzfSksCi13aGljaCBhbGxvd3MgYSBnZW5lcmljIEBjb2Rle21jb3VudH0gZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUKLXJlcXVpcmVkIGluZm9ybWF0aW9uIGZyb20gdGhlIHN0YWNrIGZyYW1lLiAgSG93ZXZlciwgb24gc29tZQotYXJjaGl0ZWN0dXJlcywgbW9zdCBub3RhYmx5IHRoZSBTUEFSQywgdXNpbmcgdGhpcyBidWlsdGluIGNhbiBiZQotdmVyeSBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlLCBhbmQgYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgdmVyc2lvbgotb2YgQGNvZGV7bWNvdW50fSBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgotCi1OdW1iZXItb2YtY2FsbHMgaW5mb3JtYXRpb24gZm9yIGxpYnJhcnkgcm91dGluZXMgaXMgY29sbGVjdGVkIGJ5IHVzaW5nIGEKLXNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgQyBsaWJyYXJ5LiAgVGhlIHByb2dyYW1zIGluIGl0IGFyZSB0aGUgc2FtZSBhcyBpbgotdGhlIHVzdWFsIEMgbGlicmFyeSwgYnV0IHRoZXkgd2VyZSBjb21waWxlZCB3aXRoIEBzYW1wey1wZ30uICBJZiB5b3UKLWxpbmsgeW91ciBwcm9ncmFtIHdpdGggQHNhbXB7Z2NjIEBkb3Rze30gLXBnfSwgaXQgYXV0b21hdGljYWxseSB1c2VzIHRoZQotcHJvZmlsaW5nIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuCi0KLVByb2ZpbGluZyBhbHNvIGludm9sdmVzIHdhdGNoaW5nIHlvdXIgcHJvZ3JhbSBhcyBpdCBydW5zLCBhbmQga2VlcGluZyBhCi1oaXN0b2dyYW0gb2Ygd2hlcmUgdGhlIHByb2dyYW0gY291bnRlciBoYXBwZW5zIHRvIGJlIGV2ZXJ5IG5vdyBhbmQgdGhlbi4KLVR5cGljYWxseSB0aGUgcHJvZ3JhbSBjb3VudGVyIGlzIGxvb2tlZCBhdCBhcm91bmQgMTAwIHRpbWVzIHBlciBzZWNvbmQgb2YKLXJ1biB0aW1lLCBidXQgdGhlIGV4YWN0IGZyZXF1ZW5jeSBtYXkgdmFyeSBmcm9tIHN5c3RlbSB0byBzeXN0ZW0uCi0KLVRoaXMgaXMgZG9uZSBpcyBvbmUgb2YgdHdvIHdheXMuICBNb3N0IFVOSVgtbGlrZSBvcGVyYXRpbmcgc3lzdGVtcwotcHJvdmlkZSBhIEBjb2Rle3Byb2ZpbCgpfSBzeXN0ZW0gY2FsbCwgd2hpY2ggcmVnaXN0ZXJzIGEgbWVtb3J5Ci1hcnJheSB3aXRoIHRoZSBrZXJuZWwsIGFsb25nIHdpdGggYSBzY2FsZQotZmFjdG9yIHRoYXQgZGV0ZXJtaW5lcyBob3cgdGhlIHByb2dyYW0ncyBhZGRyZXNzIHNwYWNlIG1hcHMKLWludG8gdGhlIGFycmF5LgotVHlwaWNhbCBzY2FsaW5nIHZhbHVlcyBjYXVzZSBldmVyeSAyIHRvIDggYnl0ZXMgb2YgYWRkcmVzcyBzcGFjZQotdG8gbWFwIGludG8gYSBzaW5nbGUgYXJyYXkgc2xvdC4KLU9uIGV2ZXJ5IHRpY2sgb2YgdGhlIHN5c3RlbSBjbG9jawotKGFzc3VtaW5nIHRoZSBwcm9maWxlZCBwcm9ncmFtIGlzIHJ1bm5pbmcpLCB0aGUgdmFsdWUgb2YgdGhlCi1wcm9ncmFtIGNvdW50ZXIgaXMgZXhhbWluZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHNsb3QgaW4KLXRoZSBtZW1vcnkgYXJyYXkgaXMgaW5jcmVtZW50ZWQuICBTaW5jZSB0aGlzIGlzIGRvbmUgaW4gdGhlIGtlcm5lbCwKLXdoaWNoIGhhZCB0byBpbnRlcnJ1cHQgdGhlIHByb2Nlc3MgYW55d2F5IHRvIGhhbmRsZSB0aGUgY2xvY2sKLWludGVycnVwdCwgdmVyeSBsaXR0bGUgYWRkaXRpb25hbCBzeXN0ZW0gb3ZlcmhlYWQgaXMgcmVxdWlyZWQuCi0KLUhvd2V2ZXIsIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIG1vc3Qgbm90YWJseSBMaW51eCAyLjAgKGFuZCBlYXJsaWVyKSwKLWRvIG5vdCBwcm92aWRlIGEgQGNvZGV7cHJvZmlsKCl9IHN5c3RlbSBjYWxsLiAgT24gc3VjaCBhIHN5c3RlbSwKLWFycmFuZ2VtZW50cyBhcmUgbWFkZSBmb3IgdGhlIGtlcm5lbCB0byBwZXJpb2RpY2FsbHkgZGVsaXZlcgotYSBzaWduYWwgdG8gdGhlIHByb2Nlc3MgKHR5cGljYWxseSB2aWEgQGNvZGV7c2V0aXRpbWVyKCl9KSwKLXdoaWNoIHRoZW4gcGVyZm9ybXMgdGhlIHNhbWUgb3BlcmF0aW9uIG9mIGV4YW1pbmluZyB0aGUKLXByb2dyYW0gY291bnRlciBhbmQgaW5jcmVtZW50aW5nIGEgc2xvdCBpbiB0aGUgbWVtb3J5IGFycmF5LgotU2luY2UgdGhpcyBtZXRob2QgcmVxdWlyZXMgYSBzaWduYWwgdG8gYmUgZGVsaXZlcmVkIHRvCi11c2VyIHNwYWNlIGV2ZXJ5IHRpbWUgYSBzYW1wbGUgaXMgdGFrZW4sIGl0IHVzZXMgY29uc2lkZXJhYmx5Ci1tb3JlIG92ZXJoZWFkIHRoYW4ga2VybmVsLWJhc2VkIHByb2ZpbGluZy4gIEFsc28sIGR1ZSB0byB0aGUKLWFkZGVkIGRlbGF5IHJlcXVpcmVkIHRvIGRlbGl2ZXIgdGhlIHNpZ25hbCwgdGhpcyBtZXRob2QgaXMKLWxlc3MgYWNjdXJhdGUgYXMgd2VsbC4KLQotQSBzcGVjaWFsIHN0YXJ0dXAgcm91dGluZSBhbGxvY2F0ZXMgbWVtb3J5IGZvciB0aGUgaGlzdG9ncmFtIGFuZCAKLWVpdGhlciBjYWxscyBAY29kZXtwcm9maWwoKX0gb3Igc2V0cyB1cAotYSBjbG9jayBzaWduYWwgaGFuZGxlci4KLVRoaXMgcm91dGluZSAoQGNvZGV7bW9uc3RhcnR1cH0pIGNhbiBiZSBpbnZva2VkIGluIHNldmVyYWwgd2F5cy4KLU9uIExpbnV4IHN5c3RlbXMsIGEgc3BlY2lhbCBwcm9maWxpbmcgc3RhcnR1cCBmaWxlIEBjb2Rle2djcnQwLm99LAotd2hpY2ggaW52b2tlcyBAY29kZXttb25zdGFydHVwfSBiZWZvcmUgQGNvZGV7bWFpbn0sCi1pcyB1c2VkIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgQGNvZGV7Y3J0MC5vfS4KLVVzZSBvZiB0aGlzIHNwZWNpYWwgc3RhcnR1cCBmaWxlIGlzIG9uZSBvZiB0aGUgZWZmZWN0cwotb2YgdXNpbmcgQHNhbXB7Z2NjIEBkb3Rze30gLXBnfSB0byBsaW5rLgotT24gU1BBUkMgc3lzdGVtcywgbm8gc3BlY2lhbCBzdGFydHVwIGZpbGVzIGFyZSB1c2VkLgotUmF0aGVyLCB0aGUgQGNvZGV7bWNvdW50fSByb3V0aW5lLCB3aGVuIGl0IGlzIGludm9rZWQgZm9yCi10aGUgZmlyc3QgdGltZSAodHlwaWNhbGx5IHdoZW4gQGNvZGV7bWFpbn0gaXMgY2FsbGVkKSwKLWNhbGxzIEBjb2Rle21vbnN0YXJ0dXB9LgotCi1JZiB0aGUgY29tcGlsZXIncyBAc2FtcHstYX0gb3B0aW9uIHdhcyB1c2VkLCBiYXNpYy1ibG9jayBjb3VudGluZwotaXMgYWxzbyBlbmFibGVkLiAgRWFjaCBvYmplY3QgZmlsZSBpcyB0aGVuIGNvbXBpbGVkIHdpdGggYSBzdGF0aWMgYXJyYXkKLW9mIGNvdW50cywgaW5pdGlhbGx5IHplcm8uCi1JbiB0aGUgZXhlY3V0YWJsZSBjb2RlLCBldmVyeSB0aW1lIGEgbmV3IGJhc2ljLWJsb2NrIGJlZ2lucwotKGkuZS4gd2hlbiBhbiBAY29kZXtpZn0gc3RhdGVtZW50IGFwcGVhcnMpLCBhbiBleHRyYSBpbnN0cnVjdGlvbgotaXMgaW5zZXJ0ZWQgdG8gaW5jcmVtZW50IHRoZSBjb3JyZXNwb25kaW5nIGNvdW50IGluIHRoZSBhcnJheS4KLUF0IGNvbXBpbGUgdGltZSwgYSBwYWlyZWQgYXJyYXkgd2FzIGNvbnN0cnVjdGVkIHRoYXQgcmVjb3JkZWQKLXRoZSBzdGFydGluZyBhZGRyZXNzIG9mIGVhY2ggYmFzaWMtYmxvY2suICBUYWtlbiB0b2dldGhlciwKLXRoZSB0d28gYXJyYXlzIHJlY29yZCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiBldmVyeSBiYXNpYy1ibG9jaywKLWFsb25nIHdpdGggdGhlIG51bWJlciBvZiB0aW1lcyBpdCB3YXMgZXhlY3V0ZWQuCi0KLVRoZSBwcm9maWxpbmcgbGlicmFyeSBhbHNvIGluY2x1ZGVzIGEgZnVuY3Rpb24gKEBjb2Rle21jbGVhbnVwfSkgd2hpY2ggaXMKLXR5cGljYWxseSByZWdpc3RlcmVkIHVzaW5nIEBjb2Rle2F0ZXhpdCgpfSB0byBiZSBjYWxsZWQgYXMgdGhlCi1wcm9ncmFtIGV4aXRzLCBhbmQgaXMgcmVzcG9uc2libGUgZm9yIHdyaXRpbmcgdGhlIGZpbGUgQGZpbGV7Z21vbi5vdXR9LgotUHJvZmlsaW5nIGlzIHR1cm5lZCBvZmYsIHZhcmlvdXMgaGVhZGVycyBhcmUgb3V0cHV0LCBhbmQgdGhlIGhpc3RvZ3JhbQotaXMgd3JpdHRlbiwgZm9sbG93ZWQgYnkgdGhlIGNhbGwtZ3JhcGggYXJjcyBhbmQgdGhlIGJhc2ljLWJsb2NrIGNvdW50cy4KLQotVGhlIG91dHB1dCBmcm9tIEBjb2Rle2dwcm9mfSBnaXZlcyBubyBpbmRpY2F0aW9uIG9mIHBhcnRzIG9mIHlvdXIgcHJvZ3JhbSB0aGF0Ci1hcmUgbGltaXRlZCBieSBJL08gb3Igc3dhcHBpbmcgYmFuZHdpZHRoLiAgVGhpcyBpcyBiZWNhdXNlIHNhbXBsZXMgb2YgdGhlCi1wcm9ncmFtIGNvdW50ZXIgYXJlIHRha2VuIGF0IGZpeGVkIGludGVydmFscyBvZiB0aGUgcHJvZ3JhbSdzIHJ1biB0aW1lLgotVGhlcmVmb3JlLCB0aGUKLXRpbWUgbWVhc3VyZW1lbnRzIGluIEBjb2Rle2dwcm9mfSBvdXRwdXQgc2F5IG5vdGhpbmcgYWJvdXQgdGltZSB0aGF0IHlvdXIKLXByb2dyYW0gd2FzIG5vdCBydW5uaW5nLiAgRm9yIGV4YW1wbGUsIGEgcGFydCBvZiB0aGUgcHJvZ3JhbSB0aGF0IGNyZWF0ZXMKLXNvIG11Y2ggZGF0YSB0aGF0IGl0IGNhbm5vdCBhbGwgZml0IGluIHBoeXNpY2FsIG1lbW9yeSBhdCBvbmNlIG1heSBydW4gdmVyeQotc2xvd2x5IGR1ZSB0byB0aHJhc2hpbmcsIGJ1dCBAY29kZXtncHJvZn0gd2lsbCBzYXkgaXQgdXNlcyBsaXR0bGUgdGltZS4gIE9uCi10aGUgb3RoZXIgaGFuZCwgc2FtcGxpbmcgYnkgcnVuIHRpbWUgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCB0aGUgYW1vdW50IG9mCi1sb2FkIGR1ZSB0byBvdGhlciB1c2VycyB3b24ndCBkaXJlY3RseSBhZmZlY3QgdGhlIG91dHB1dCB5b3UgZ2V0LgotCi1Abm9kZSBGaWxlIEZvcm1hdCxJbnRlcm5hbHMsSW1wbGVtZW50YXRpb24sRGV0YWlscwotQHNlY3Rpb24gUHJvZmlsaW5nIERhdGEgRmlsZSBGb3JtYXQKLQotVGhlIG9sZCBCU0QtZGVyaXZlZCBmaWxlIGZvcm1hdCB1c2VkIGZvciBwcm9maWxlIGRhdGEgZG9lcyBub3QgY29udGFpbiBhCi1tYWdpYyBjb29raWUgdGhhdCBhbGxvd3MgdG8gY2hlY2sgd2hldGhlciBhIGRhdGEgZmlsZSByZWFsbHkgaXMgYQotZ3Byb2YgZmlsZS4gIEZ1cnRoZXJtb3JlLCBpdCBkb2VzIG5vdCBwcm92aWRlIGEgdmVyc2lvbiBudW1iZXIsIHRodXMKLXJlbmRlcmluZyBjaGFuZ2VzIHRvIHRoZSBmaWxlIGZvcm1hdCBhbG1vc3QgaW1wb3NzaWJsZS4gIEBzY3tnbnV9IEBjb2Rle2dwcm9mfQotdXNlcyBhIG5ldyBmaWxlIGZvcm1hdCB0aGF0IHByb3ZpZGVzIHRoZXNlIGZlYXR1cmVzLiAgRm9yIGJhY2t3YXJkCi1jb21wYXRpYmlsaXR5LCBAc2N7Z251fSBAY29kZXtncHJvZn0gY29udGludWVzIHRvIHN1cHBvcnQgdGhlIG9sZCBCU0QtZGVyaXZlZAotZm9ybWF0LCBidXQgbm90IGFsbCBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkIHdpdGggaXQuICBGb3IgZXhhbXBsZSwKLWJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMgY2Fubm90IGJlIGFjY29tbW9kYXRlZCBieSB0aGUgb2xkIGZpbGUKLWZvcm1hdC4KLQotVGhlIG5ldyBmaWxlIGZvcm1hdCBpcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlIEBmaWxle2dtb25fb3V0Lmh9LiAgSXQKLWNvbnNpc3RzIG9mIGEgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIG1hZ2ljIGNvb2tpZSBhbmQgYSB2ZXJzaW9uIG51bWJlciwKLWFzIHdlbGwgYXMgc29tZSBzcGFyZSBieXRlcyBhdmFpbGFibGUgZm9yIGZ1dHVyZSBleHRlbnNpb25zLiAgQWxsIGRhdGEKLWluIGEgcHJvZmlsZSBkYXRhIGZpbGUgaXMgaW4gdGhlIG5hdGl2ZSBmb3JtYXQgb2YgdGhlIGhvc3Qgb24gd2hpY2gKLXRoZSBwcm9maWxlIHdhcyBjb2xsZWN0ZWQuICBAc2N7Z251fSBAY29kZXtncHJvZn0gYWRhcHRzIGF1dG9tYXRpY2FsbHkgdG8gdGhlCi1ieXRlLW9yZGVyIGluIHVzZS4KLQotSW4gdGhlIG5ldyBmaWxlIGZvcm1hdCwgdGhlIGhlYWRlciBpcyBmb2xsb3dlZCBieSBhIHNlcXVlbmNlIG9mCi1yZWNvcmRzLiAgQ3VycmVudGx5LCB0aGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IHJlY29yZCB0eXBlczogaGlzdG9ncmFtCi1yZWNvcmRzLCBjYWxsLWdyYXBoIGFyYyByZWNvcmRzLCBhbmQgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50Ci1yZWNvcmRzLiAgRWFjaCBmaWxlIGNhbiBjb250YWluIGFueSBudW1iZXIgb2YgZWFjaCByZWNvcmQgdHlwZS4gIFdoZW4KLXJlYWRpbmcgYSBmaWxlLCBAc2N7Z251fSBAY29kZXtncHJvZn0gd2lsbCBlbnN1cmUgcmVjb3JkcyBvZiB0aGUgc2FtZSB0eXBlIGFyZQotY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgYW5kIGNvbXB1dGUgdGhlIHVuaW9uIG9mIGFsbCByZWNvcmRzLiAgRm9yCi1leGFtcGxlLCBmb3IgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cywgdGhlIHVuaW9uIGlzIHNpbXBseSB0aGUgc3VtCi1vZiBhbGwgZXhlY3V0aW9uIGNvdW50cyBmb3IgZWFjaCBiYXNpYy1ibG9jay4KLQotQHN1YnNlY3Rpb24gSGlzdG9ncmFtIFJlY29yZHMKLQotSGlzdG9ncmFtIHJlY29yZHMgY29uc2lzdCBvZiBhIGhlYWRlciB0aGF0IGlzIGZvbGxvd2VkIGJ5IGFuIGFycmF5IG9mCi1iaW5zLiAgVGhlIGhlYWRlciBjb250YWlucyB0aGUgdGV4dC1zZWdtZW50IHJhbmdlIHRoYXQgdGhlIGhpc3RvZ3JhbQotc3BhbnMsIHRoZSBzaXplIG9mIHRoZSBoaXN0b2dyYW0gaW4gYnl0ZXMgKHVubGlrZSBpbiB0aGUgb2xkIEJTRAotZm9ybWF0LCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGhlYWRlciksIHRoZSByYXRlIG9mIHRoZQotcHJvZmlsaW5nIGNsb2NrLCBhbmQgdGhlIHBoeXNpY2FsIGRpbWVuc2lvbiB0aGF0IHRoZSBiaW4gY291bnRzCi1yZXByZXNlbnQgYWZ0ZXIgYmVpbmcgc2NhbGVkIGJ5IHRoZSBwcm9maWxpbmcgY2xvY2sgcmF0ZS4gIFRoZQotcGh5c2ljYWwgZGltZW5zaW9uIGlzIHNwZWNpZmllZCBpbiB0d28gcGFydHM6IGEgbG9uZyBuYW1lIG9mIHVwIHRvIDE1Ci1jaGFyYWN0ZXJzIGFuZCBhIHNpbmdsZSBjaGFyYWN0ZXIgYWJicmV2aWF0aW9uLiAgRm9yIGV4YW1wbGUsIGEKLWhpc3RvZ3JhbSByZXByZXNlbnRpbmcgcmVhbC10aW1lIHdvdWxkIHNwZWNpZnkgdGhlIGxvbmcgbmFtZSBhcwotInNlY29uZHMiIGFuZCB0aGUgYWJicmV2aWF0aW9uIGFzICJzIi4gIFRoaXMgZmVhdHVyZSBpcyB1c2VmdWwgZm9yCi1hcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydCBwZXJmb3JtYW5jZSBtb25pdG9yIGhhcmR3YXJlICh3aGljaCwKLWZvcnR1bmF0ZWx5LCBpcyBiZWNvbWluZyBpbmNyZWFzaW5nbHkgY29tbW9uKS4gIEZvciBleGFtcGxlLCB1bmRlciBERUMKLU9TRi8xLCB0aGUgInVwcm9maWxlIiBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHByb2R1Y2UgYSBoaXN0b2dyYW0gb2YsCi1zYXksIGluc3RydWN0aW9uIGNhY2hlIG1pc3Nlcy4gIEluIHRoaXMgY2FzZSwgdGhlIGRpbWVuc2lvbiBpbiB0aGUKLWhpc3RvZ3JhbSBoZWFkZXIgY291bGQgYmUgc2V0IHRvICJpLWNhY2hlIG1pc3NlcyIgYW5kIHRoZSBhYmJyZXZpYXRpb24KLWNvdWxkIGJlIHNldCB0byAiMSIgKGJlY2F1c2UgaXQgaXMgc2ltcGx5IGEgY291bnQsIG5vdCBhIHBoeXNpY2FsCi1kaW1lbnNpb24pLiAgQWxzbywgdGhlIHByb2ZpbGluZyByYXRlIHdvdWxkIGhhdmUgdG8gYmUgc2V0IHRvIDEgaW4KLXRoaXMgY2FzZS4KLQotSGlzdG9ncmFtIGJpbnMgYXJlIDE2LWJpdCBudW1iZXJzIGFuZCBlYWNoIGJpbiByZXByZXNlbnQgYW4gZXF1YWwKLWFtb3VudCBvZiB0ZXh0LXNwYWNlLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSB0ZXh0LXNlZ21lbnQgaXMgb25lCi10aG91c2FuZCBieXRlcyBsb25nIGFuZCBpZiB0aGVyZSBhcmUgdGVuIGJpbnMgaW4gdGhlIGhpc3RvZ3JhbSwgZWFjaAotYmluIHJlcHJlc2VudHMgb25lIGh1bmRyZWQgYnl0ZXMuCi0KLQotQHN1YnNlY3Rpb24gQ2FsbC1HcmFwaCBSZWNvcmRzCi0KLUNhbGwtZ3JhcGggcmVjb3JkcyBoYXZlIGEgZm9ybWF0IHRoYXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgdXNlZCBpbgotdGhlIEJTRC1kZXJpdmVkIGZpbGUgZm9ybWF0LiAgSXQgY29uc2lzdHMgb2YgYW4gYXJjIGluIHRoZSBjYWxsIGdyYXBoCi1hbmQgYSBjb3VudCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFyYyB3YXMgdHJhdmVyc2VkCi1kdXJpbmcgcHJvZ3JhbSBleGVjdXRpb24uICBBcmNzIGFyZSBzcGVjaWZpZWQgYnkgYSBwYWlyIG9mIGFkZHJlc3NlczoKLXRoZSBmaXJzdCBtdXN0IGJlIHdpdGhpbiBjYWxsZXIncyBmdW5jdGlvbiBhbmQgdGhlIHNlY29uZCBtdXN0IGJlCi13aXRoaW4gdGhlIGNhbGxlZSdzIGZ1bmN0aW9uLiAgV2hlbiBwZXJmb3JtaW5nIHByb2ZpbGluZyBhdCB0aGUKLWZ1bmN0aW9uIGxldmVsLCB0aGVzZSBhZGRyZXNzZXMgY2FuIHBvaW50IGFueXdoZXJlIHdpdGhpbiB0aGUKLXJlc3BlY3RpdmUgZnVuY3Rpb24uICBIb3dldmVyLCB3aGVuIHByb2ZpbGluZyBhdCB0aGUgbGluZS1sZXZlbCwgaXQgaXMKLWJldHRlciBpZiB0aGUgYWRkcmVzc2VzIGFyZSBhcyBjbG9zZSB0byB0aGUgY2FsbC1zaXRlL2VudHJ5LXBvaW50IGFzCi1wb3NzaWJsZS4gIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgbGluZS1sZXZlbCBjYWxsLWdyYXBoIGlzIGFibGUgdG8KLWlkZW50aWZ5IGV4YWN0bHkgd2hpY2ggbGluZSBvZiBzb3VyY2UgY29kZSBwZXJmb3JtZWQgY2FsbHMgdG8gYQotZnVuY3Rpb24uCi0KLUBzdWJzZWN0aW9uIEJhc2ljLUJsb2NrIEV4ZWN1dGlvbiBDb3VudCBSZWNvcmRzCi0KLUJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudCByZWNvcmRzIGNvbnNpc3Qgb2YgYSBoZWFkZXIgZm9sbG93ZWQgYnkgYQotc2VxdWVuY2Ugb2YgYWRkcmVzcy9jb3VudCBwYWlycy4gIFRoZSBoZWFkZXIgc2ltcGx5IHNwZWNpZmllcyB0aGUKLWxlbmd0aCBvZiB0aGUgc2VxdWVuY2UuICBJbiBhbiBhZGRyZXNzL2NvdW50IHBhaXIsIHRoZSBhZGRyZXNzCi1pZGVudGlmaWVzIGEgYmFzaWMtYmxvY2sgYW5kIHRoZSBjb3VudCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lcwotdGhhdCBiYXNpYy1ibG9jayB3YXMgZXhlY3V0ZWQuICBBbnkgYWRkcmVzcyB3aXRoaW4gdGhlIGJhc2ljLWFkZHJlc3MgY2FuCi1iZSB1c2VkLgotCi1Abm9kZSBJbnRlcm5hbHMsRGVidWdnaW5nLEZpbGUgRm9ybWF0LERldGFpbHMKLUBzZWN0aW9uIEBjb2Rle2dwcm9mfSdzIEludGVybmFsIE9wZXJhdGlvbgotCi1MaWtlIG1vc3QgcHJvZ3JhbXMsIEBjb2Rle2dwcm9mfSBiZWdpbnMgYnkgcHJvY2Vzc2luZyBpdHMgb3B0aW9ucy4KLUR1cmluZyB0aGlzIHN0YWdlLCBpdCBtYXkgYnVpbGRpbmcgaXRzIHN5bXNwZWMgbGlzdAotKEBjb2Rle3N5bV9pZHMuYzpzeW1faWRfYWRkfSksIGlmCi1vcHRpb25zIGFyZSBzcGVjaWZpZWQgd2hpY2ggdXNlIHN5bXNwZWNzLgotQGNvZGV7Z3Byb2Z9IG1haW50YWlucyBhIHNpbmdsZSBsaW5rZWQgbGlzdCBvZiBzeW1zcGVjcywKLXdoaWNoIHdpbGwgZXZlbnR1YWxseSBnZXQgdHVybmVkIGludG8gMTIgc3ltYm9sIHRhYmxlcywKLW9yZ2FuaXplZCBpbnRvIHNpeCBpbmNsdWRlL2V4Y2x1ZGUgcGFpcnMgLSBvbmUKLXBhaXIgZWFjaCBmb3IgdGhlIGZsYXQgcHJvZmlsZSAoSU5DTF9GTEFUL0VYQ0xfRkxBVCksCi10aGUgY2FsbCBncmFwaCBhcmNzIChJTkNMX0FSQ1MvRVhDTF9BUkNTKSwKLXByaW50aW5nIGluIHRoZSBjYWxsIGdyYXBoIChJTkNMX0dSQVBIL0VYQ0xfR1JBUEgpLAotdGltaW5nIHByb3BhZ2F0aW9uIGluIHRoZSBjYWxsIGdyYXBoIChJTkNMX1RJTUUvRVhDTF9USU1FKSwKLXRoZSBhbm5vdGF0ZWQgc291cmNlIGxpc3RpbmcgKElOQ0xfQU5OTy9FWENMX0FOTk8pLAotYW5kIHRoZSBleGVjdXRpb24gY291bnQgbGlzdGluZyAoSU5DTF9FWEVDL0VYQ0xfRVhFQykuCi0KLUFmdGVyIG9wdGlvbiBwcm9jZXNzaW5nLCBAY29kZXtncHJvZn0gZmluaXNoZXMKLWJ1aWxkaW5nIHRoZSBzeW1zcGVjIGxpc3QgYnkgYWRkaW5nIGFsbCB0aGUgc3ltc3BlY3MgaW4KLUBjb2Rle2RlZmF1bHRfZXhjbHVkZWRfbGlzdH0gdG8gdGhlIGV4Y2x1ZGUgbGlzdHMKLUVYQ0xfVElNRSBhbmQgRVhDTF9HUkFQSCwgYW5kIGlmIGxpbmUtYnktbGluZSBwcm9maWxpbmcgaXMgc3BlY2lmaWVkLAotRVhDTF9GTEFUIGFzIHdlbGwuCi1UaGVzZSBkZWZhdWx0IGV4Y2x1ZGVzIGFyZSBub3QgYWRkZWQgdG8gRVhDTF9BTk5PLCBFWENMX0FSQ1MsIGFuZCBFWENMX0VYRUMuCi0KLU5leHQsIHRoZSBCRkQgbGlicmFyeSBpcyBjYWxsZWQgdG8gb3BlbiB0aGUgb2JqZWN0IGZpbGUsCi12ZXJpZnkgdGhhdCBpdCBpcyBhbiBvYmplY3QgZmlsZSwKLWFuZCByZWFkIGl0cyBzeW1ib2wgdGFibGUgKEBjb2Rle2NvcmUuYzpjb3JlX2luaXR9KSwKLXVzaW5nIEBjb2Rle2JmZF9jYW5vbmljYWxpemVfc3ltdGFifSBhZnRlciBtYWxsb2NpbmcKLWFuIGFwcHJvcGlhdGUgc2l6ZWQgYXJyYXkgb2YgYXN5bWJvbHMuICBBdCB0aGlzIHBvaW50LAotZnVuY3Rpb24gbWFwcGluZ3MgYXJlIHJlYWQgKGlmIHRoZSBAc2FtcHstLWZpbGUtb3JkZXJpbmd9IG9wdGlvbgotaGFzIGJlZW4gc3BlY2lmaWVkKSwgYW5kIHRoZSBjb3JlIHRleHQgc3BhY2UgaXMgcmVhZCBpbnRvCi1tZW1vcnkgKGlmIHRoZSBAc2FtcHstY30gb3B0aW9uIHdhcyBnaXZlbikuCi0KLUBjb2Rle2dwcm9mfSdzIG93biBzeW1ib2wgdGFibGUsIGFuIGFycmF5IG9mIFN5bSBzdHJ1Y3R1cmVzLAotaXMgbm93IGJ1aWx0LgotVGhpcyBpcyBkb25lIGluIG9uZSBvZiB0d28gd2F5cywgYnkgb25lIG9mIHR3byByb3V0aW5lcywgZGVwZW5kaW5nCi1vbiB3aGV0aGVyIGxpbmUtYnktbGluZSBwcm9maWxpbmcgKEBzYW1wey1sfSBvcHRpb24pIGhhcyBiZWVuCi1lbmFibGVkLgotRm9yIG5vcm1hbCBwcm9maWxpbmcsIHRoZSBCRkQgY2Fub25pY2FsIHN5bWJvbCB0YWJsZSBpcyBzY2FubmVkLgotRm9yIGxpbmUtYnktbGluZSBwcm9maWxpbmcsIGV2ZXJ5Ci10ZXh0IHNwYWNlIGFkZHJlc3MgaXMgZXhhbWluZWQsIGFuZCBhIG5ldyBzeW1ib2wgdGFibGUgZW50cnkKLWdldHMgY3JlYXRlZCBldmVyeSB0aW1lIHRoZSBsaW5lIG51bWJlciBjaGFuZ2VzLgotSW4gZWl0aGVyIGNhc2UsIHR3byBwYXNzZXMgYXJlIG1hZGUgdGhyb3VnaCB0aGUgc3ltYm9sCi10YWJsZSAtIG9uZSB0byBjb3VudCB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlIHJlcXVpcmVkLAotYW5kIHRoZSBvdGhlciB0byBhY3R1YWxseSByZWFkIHRoZSBzeW1ib2xzLiAgSW4gYmV0d2VlbiB0aGUKLXR3byBwYXNzZXMsIGEgc2luZ2xlIGFycmF5IG9mIHR5cGUgQGNvZGV7U3ltfSBpcyBjcmVhdGVkIG9mCi10aGUgYXBwcm9waWF0ZSBsZW5ndGguCi1GaW5hbGx5LCBAY29kZXtzeW10YWIuYzpzeW10YWJfZmluYWxpemV9Ci1pcyBjYWxsZWQgdG8gc29ydCB0aGUgc3ltYm9sIHRhYmxlIGFuZCByZW1vdmUgZHVwbGljYXRlIGVudHJpZXMKLShlbnRyaWVzIHdpdGggdGhlIHNhbWUgbWVtb3J5IGFkZHJlc3MpLgotCi1UaGUgc3ltYm9sIHRhYmxlIG11c3QgYmUgYSBjb250aWd1b3VzIGFycmF5IGZvciB0d28gcmVhc29ucy4KLUZpcnN0LCB0aGUgQGNvZGV7cXNvcnR9IGxpYnJhcnkgZnVuY3Rpb24gKHdoaWNoIHNvcnRzIGFuIGFycmF5KQotd2lsbCBiZSB1c2VkIHRvIHNvcnQgdGhlIHN5bWJvbCB0YWJsZS4KLUFsc28sIHRoZSBzeW1ib2wgbG9va3VwIHJvdXRpbmUgKEBjb2Rle3N5bXRhYi5jOnN5bV9sb29rdXB9KSwKLXdoaWNoIGZpbmRzIHN5bWJvbHMKLWJhc2VkIG9uIG1lbW9yeSBhZGRyZXNzLCB1c2VzIGEgYmluYXJ5IHNlYXJjaCBhbGdvcml0aG0KLXdoaWNoIHJlcXVpcmVzIHRoZSBzeW1ib2wgdGFibGUgdG8gYmUgYSBzb3J0ZWQgYXJyYXkuCi1GdW5jdGlvbiBzeW1ib2xzIGFyZSBpbmRpY2F0ZWQgd2l0aCBhbiBAY29kZXtpc19mdW5jfSBmbGFnLgotTGluZSBudW1iZXIgc3ltYm9scyBoYXZlIG5vIHNwZWNpYWwgZmxhZ3Mgc2V0LgotQWRkaXRpb25hbGx5LCBhIHN5bWJvbCBjYW4gaGF2ZSBhbiBAY29kZXtpc19zdGF0aWN9IGZsYWcKLXRvIGluZGljYXRlIHRoYXQgaXQgaXMgYSBsb2NhbCBzeW1ib2wuCi0KLVdpdGggdGhlIHN5bWJvbCB0YWJsZSByZWFkLCB0aGUgc3ltc3BlY3MgY2FuIG5vdyBiZSB0cmFuc2xhdGVkCi1pbnRvIFN5bXMgKEBjb2Rle3N5bV9pZHMuYzpzeW1faWRfcGFyc2V9KS4gIFJlbWVtYmVyIHRoYXQgYSBzaW5nbGUKLXN5bXNwZWMgY2FuIG1hdGNoIG11bHRpcGxlIHN5bWJvbHMuCi1BbiBhcnJheSBvZiBzeW1ib2wgdGFibGVzCi0oQGNvZGV7c3ltc30pIGlzIGNyZWF0ZWQsIGVhY2ggZW50cnkgb2Ygd2hpY2ggaXMgYSBzeW1ib2wgdGFibGUKLW9mIFN5bXMgdG8gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQgZnJvbSBhIHBhcnRpY3VsYXIgbGlzdGluZy4KLVRoZSBtYXN0ZXIgc3ltYm9sIHRhYmxlIGFuZCB0aGUgc3ltc3BlY3MgYXJlIGV4YW1pbmVkIGJ5IG5lc3RlZAotbG9vcHMsIGFuZCBldmVyeSBzeW1ib2wgdGhhdCBtYXRjaGVzIGEgc3ltc3BlYyBpcyBpbnNlcnRlZAotaW50byB0aGUgYXBwcm9wcmlhdGUgc3ltcyB0YWJsZS4gIFRoaXMgaXMgZG9uZSB0d2ljZSwgb25jZSB0bwotY291bnQgdGhlIHNpemUgb2YgZWFjaCByZXF1aXJlZCBzeW1ib2wgdGFibGUsIGFuZCBhZ2FpbiB0byBidWlsZAotdGhlIHRhYmxlcywgd2hpY2ggaGF2ZSBiZWVuIG1hbGxvY2VkIGJldHdlZW4gcGFzc2VzLgotRnJvbSBub3cgb24sIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc3ltYm9sIGlzIG9uIGFuIGluY2x1ZGUKLW9yIGV4Y2x1ZGUgc3ltc3BlYyBsaXN0LCBAY29kZXtncHJvZn0gc2ltcGx5IHVzZXMgaXRzCi1zdGFuZGFyZCBzeW1ib2wgbG9va3VwIHJvdXRpbmUgb24gdGhlIGFwcHJvcHJpYXRlIHRhYmxlCi1pbiB0aGUgQGNvZGV7c3ltc30gYXJyYXkuCi0KLU5vdyB0aGUgcHJvZmlsZSBkYXRhIGZpbGUocykgdGhlbXNlbHZlcyBhcmUgcmVhZAotKEBjb2Rle2dtb25faW8uYzpnbW9uX291dF9yZWFkfSksCi1maXJzdCBieSBjaGVja2luZyBmb3IgYSBuZXctc3R5bGUgQHNhbXB7Z21vbi5vdXR9IGhlYWRlciwKLXRoZW4gYXNzdW1pbmcgdGhpcyBpcyBhbiBvbGQtc3R5bGUgQlNEIEBzYW1we2dtb24ub3V0fQotaWYgdGhlIG1hZ2ljIG51bWJlciB0ZXN0IGZhaWxlZC4KLQotTmV3LXN0eWxlIGhpc3RvZ3JhbSByZWNvcmRzIGFyZSByZWFkIGJ5IEBjb2Rle2hpc3QuYzpoaXN0X3JlYWRfcmVjfS4KLUZvciB0aGUgZmlyc3QgaGlzdG9ncmFtIHJlY29yZCwgYWxsb2NhdGUgYSBtZW1vcnkgYXJyYXkgdG8gaG9sZAotYWxsIHRoZSBiaW5zLCBhbmQgcmVhZCB0aGVtIGluLgotV2hlbiBtdWx0aXBsZSBwcm9maWxlIGRhdGEgZmlsZXMgKG9yIGZpbGVzIHdpdGggbXVsdGlwbGUgaGlzdG9ncmFtCi1yZWNvcmRzKSBhcmUgcmVhZCwgdGhlIHN0YXJ0aW5nIGFkZHJlc3MsIGVuZGluZyBhZGRyZXNzLCBudW1iZXIKLW9mIGJpbnMgYW5kIHNhbXBsaW5nIHJhdGUgbXVzdCBtYXRjaCBiZXR3ZWVuIHRoZSB2YXJpb3VzIGhpc3RvZ3JhbXMsCi1vciBhIGZhdGFsIGVycm9yIHdpbGwgcmVzdWx0LgotSWYgZXZlcnl0aGluZyBtYXRjaGVzLCBqdXN0IHN1bSB0aGUgYWRkaXRpb25hbCBoaXN0b2dyYW1zIGludG8KLXRoZSBleGlzdGluZyBpbi1tZW1vcnkgYXJyYXkuCi0KLUFzIGVhY2ggY2FsbCBncmFwaCByZWNvcmQgaXMgcmVhZCAoQGNvZGV7Y2FsbF9ncmFwaC5jOmNnX3JlYWRfcmVjfSksCi10aGUgcGFyZW50IGFuZCBjaGlsZCBhZGRyZXNzZXMKLWFyZSBtYXRjaGVkIHRvIHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBhbmQgYSBjYWxsIGdyYXBoIGFyYyBpcwotY3JlYXRlZCBieSBAY29kZXtjZ19hcmNzLmM6YXJjX2FkZH0sIHVubGVzcyB0aGUgYXJjIGZhaWxzIGEgc3ltc3BlYwotY2hlY2sgYWdhaW5zdCBJTkNMX0FSQ1MvRVhDTF9BUkNTLiAgQXMgZWFjaCBhcmMgaXMgYWRkZWQsCi1hIGxpbmtlZCBsaXN0IGlzIG1haW50YWluZWQgb2YgdGhlIHBhcmVudCdzIGNoaWxkIGFyY3MsIGFuZCBvZiB0aGUgY2hpbGQncwotcGFyZW50IGFyY3MuCi1Cb3RoIHRoZSBjaGlsZCdzIGNhbGwgY291bnQgYW5kIHRoZSBhcmMncyBjYWxsIGNvdW50IGFyZQotaW5jcmVtZW50ZWQgYnkgdGhlIHJlY29yZCdzIGNhbGwgY291bnQuCi0KLUJhc2ljLWJsb2NrIHJlY29yZHMgYXJlIHJlYWQgKEBjb2Rle2Jhc2ljX2Jsb2Nrcy5jOmJiX3JlYWRfcmVjfSksCi1idXQgb25seSBpZiBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIGhhcyBiZWVuIHNlbGVjdGVkLgotRWFjaCBiYXNpYy1ibG9jayBhZGRyZXNzIGlzIG1hdGNoZWQgdG8gYSBjb3JyZXNwb25kaW5nIGxpbmUKLXN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlLCBhbmQgYW4gZW50cnkgbWFkZSBpbiB0aGUgc3ltYm9sJ3MKLWJiX2FkZHIgYW5kIGJiX2NhbGxzIGFycmF5cy4gIEFnYWluLCBpZiBtdWx0aXBsZSBiYXNpYy1ibG9jawotcmVjb3JkcyBhcmUgcHJlc2VudCBmb3IgdGhlIHNhbWUgYWRkcmVzcywgdGhlIGNhbGwgY291bnRzCi1hcmUgY3VtdWxhdGl2ZS4KLQotQSBnbW9uLnN1bSBmaWxlIGlzIGR1bXBlZCwgaWYgcmVxdWVzdGVkIChAY29kZXtnbW9uX2lvLmM6Z21vbl9vdXRfd3JpdGV9KS4KLQotSWYgaGlzdG9ncmFtcyB3ZXJlIHByZXNlbnQgaW4gdGhlIGRhdGEgZmlsZXMsIGFzc2lnbiB0aGVtIHRvIHN5bWJvbHMKLShAY29kZXtoaXN0LmM6aGlzdF9hc3NpZ25fc2FtcGxlc30pIGJ5IGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgc2FtcGxlCi1iaW5zIGFuZCBhc3NpZ25pbmcgdGhlbSB0byBzeW1ib2xzLiAgU2luY2UgdGhlIHN5bWJvbCB0YWJsZQotaXMgc29ydGVkIGluIG9yZGVyIG9mIGFzY2VuZGluZyBtZW1vcnkgYWRkcmVzc2VzLCB3ZSBjYW4KLXNpbXBsZSBmb2xsb3cgYWxvbmcgaW4gdGhlIHN5bWJvbCB0YWJsZSBhcyB3ZSBtYWtlIG91ciBwYXNzCi1vdmVyIHRoZSBzYW1wbGUgYmlucy4KLVRoaXMgc3RlcCBpbmNsdWRlcyBhIHN5bXNwZWMgY2hlY2sgYWdhaW5zdCBJTkNMX0ZMQVQvRVhDTF9GTEFULgotRGVwZW5kaW5nIG9uIHRoZSBoaXN0b2dyYW0KLXNjYWxlIGZhY3RvciwgYSBzYW1wbGUgYmluIG1heSBzcGFuIG11bHRpcGxlIHN5bWJvbHMsCi1pbiB3aGljaCBjYXNlIGEgZnJhY3Rpb24gb2YgdGhlIHNhbXBsZSBjb3VudCBpcyBhbGxvY2F0ZWQKLXRvIGVhY2ggc3ltYm9sLCBwcm9wb3J0aW9uYWwgdG8gdGhlIGRlZ3JlZSBvZiBvdmVybGFwLgotVGhpcyBlZmZlY3QgaXMgcmFyZSBmb3Igbm9ybWFsIHByb2ZpbGluZywgYnV0IG92ZXJsYXBzCi1hcmUgbW9yZSBjb21tb24gZHVyaW5nIGxpbmUtYnktbGluZSBwcm9maWxpbmcsIGFuZCBjYW4KLWNhdXNlIGVhY2ggb2YgdHdvIGFkamFjZW50IGxpbmVzIHRvIGJlIGNyZWRpdGVkIHdpdGggaGFsZgotYSBoaXQsIGZvciBleGFtcGxlLgotCi1JZiBjYWxsIGdyYXBoIGRhdGEgaXMgcHJlc2VudCwgQGNvZGV7Y2dfYXJjcy5jOmNnX2Fzc2VtYmxlfSBpcyBjYWxsZWQuCi1GaXJzdCwgaWYgQHNhbXB7LWN9IHdhcyBzcGVjaWZpZWQsIGEgbWFjaGluZS1kZXBlbmRhbnQKLXJvdXRpbmUgKEBjb2Rle2ZpbmRfY2FsbH0pIHNjYW5zIHRocm91Z2ggZWFjaCBzeW1ib2wncyBtYWNoaW5lIGNvZGUsCi1sb29raW5nIGZvciBzdWJyb3V0aW5lIGNhbGwgaW5zdHJ1Y3Rpb25zLCBhbmQgYWRkaW5nIHRoZW0KLXRvIHRoZSBjYWxsIGdyYXBoIHdpdGggYSB6ZXJvIGNhbGwgY291bnQuCi1BIHRvcG9sb2dpY2FsIHNvcnQgaXMgcGVyZm9ybWVkIGJ5IGRlcHRoLWZpcnN0IG51bWJlcmluZwotYWxsIHRoZSBzeW1ib2xzIChAY29kZXtjZ19kZm4uYzpjZ19kZm59KSwgc28gdGhhdAotY2hpbGRyZW4gYXJlIGFsd2F5cyBudW1iZXJlZCBsZXNzIHRoYW4gdGhlaXIgcGFyZW50cywKLXRoZW4gbWFraW5nIGEgYXJyYXkgb2YgcG9pbnRlcnMgaW50byB0aGUgc3ltYm9sIHRhYmxlIGFuZCBzb3J0aW5nIGl0IGludG8KLW51bWVyaWNhbCBvcmRlciwgd2hpY2ggaXMgcmV2ZXJzZSB0b3BvbG9naWNhbAotb3JkZXIgKGNoaWxkcmVuIGFwcGVhciBiZWZvcmUgcGFyZW50cykuCi1DeWNsZXMgYXJlIGFsc28gZGV0ZWN0ZWQgYXQgdGhpcyBwb2ludCwgYWxsIG1lbWJlcnMKLW9mIHdoaWNoIGFyZSBhc3NpZ25lZCB0aGUgc2FtZSB0b3BvbG9naWNhbCBudW1iZXIuCi1Ud28gcGFzc2VzIGFyZSBub3cgbWFkZSB0aHJvdWdoIHRoaXMgc29ydGVkIGFycmF5IG9mIHN5bWJvbCBwb2ludGVycy4KLVRoZSBmaXJzdCBwYXNzLCBmcm9tIGVuZCB0byBiZWdpbm5pbmcgKHBhcmVudHMgdG8gY2hpbGRyZW4pLAotY29tcHV0ZXMgdGhlIGZyYWN0aW9uIG9mIGNoaWxkIHRpbWUgdG8gcHJvcG9nYXRlIHRvIGVhY2ggcGFyZW50Ci1hbmQgYSBwcmludCBmbGFnLgotVGhlIHByaW50IGZsYWcgcmVmbGVjdHMgc3ltc3BlYyBoYW5kbGluZyBvZiBJTkNMX0dSQVBIL0VYQ0xfR1JBUEgsCi13aXRoIGEgcGFyZW50J3MgaW5jbHVkZSBvciBleGNsdWRlIChwcmludCBvciBubyBwcmludCkgcHJvcGVydHkKLWJlaW5nIHByb3BhZ2F0ZWQgdG8gaXRzIGNoaWxkcmVuLCB1bmxlc3MgdGhleSB0aGVtc2VsdmVzIGV4cGxpY2l0bHkgYXBwZWFyCi1pbiBJTkNMX0dSQVBIIG9yIEVYQ0xfR1JBUEguCi1BIHNlY29uZCBwYXNzLCBmcm9tIGJlZ2lubmluZyB0byBlbmQgKGNoaWxkcmVuIHRvIHBhcmVudHMpIGFjdHVhbGx5Ci1wcm9wb2dhdGVzIHRoZSB0aW1pbmdzIGFsb25nIHRoZSBjYWxsIGdyYXBoLCBzdWJqZWN0Ci10byBhIGNoZWNrIGFnYWluc3QgSU5DTF9USU1FL0VYQ0xfVElNRS4KLVdpdGggdGhlIHByaW50IGZsYWcsIGZyYWN0aW9ucywgYW5kIHRpbWluZ3Mgbm93IHN0b3JlZCBpbiB0aGUgc3ltYm9sCi1zdHJ1Y3R1cmVzLCB0aGUgdG9wb2xvZ2ljYWwgc29ydCBhcnJheSBpcyBub3cgZGlzY2FyZGVkLCBhbmQgYQotbmV3IGFycmF5IG9mIHBvaW50ZXJzIGlzIGFzc2VtYmxlZCwgdGhpcyB0aW1lIHNvcnRlZCBieSBwcm9wYWdhdGVkIHRpbWUuCi0KLUZpbmFsbHksIHByaW50IHRoZSB2YXJpb3VzIG91dHB1dHMgdGhlIHVzZXIgcmVxdWVzdGVkLCB3aGljaCBpcyBub3cgZmFpcmx5Ci1zdHJhaWdodGZvcndhcmQuICBUaGUgY2FsbCBncmFwaCAoQGNvZGV7Y2dfcHJpbnQuYzpjZ19wcmludH0pIGFuZAotZmxhdCBwcm9maWxlIChAY29kZXtoaXN0LmM6aGlzdF9wcmludH0pIGFyZSByZWd1cmdpdGF0aW9ucyBvZiB2YWx1ZXMKLWFscmVhZHkgY29tcHV0ZWQuICBUaGUgYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nCi0oQGNvZGV7YmFzaWNfYmxvY2tzLmM6cHJpbnRfYW5ub3RhdGVkX3NvdXJjZX0pIHVzZXMgYmFzaWMtYmxvY2sKLWluZm9ybWF0aW9uLCBpZiBwcmVzZW50LCB0byBsYWJlbCBlYWNoIGxpbmUgb2YgY29kZSB3aXRoIGNhbGwgY291bnRzLAotb3RoZXJ3aXNlIG9ubHkgdGhlIGZ1bmN0aW9uIGNhbGwgY291bnRzIGFyZSBwcmVzZW50ZWQuCi0KLVRoZSBmdW5jdGlvbiBvcmRlcmluZyBjb2RlIGlzIG1hcmdpbmFsbHkgd2VsbCBkb2N1bWVudGVkCi1pbiB0aGUgc291cmNlIGNvZGUgaXRzZWxmIChAY29kZXtjZ19wcmludC5jfSkuICBCYXNpY2FsbHksCi10aGUgZnVuY3Rpb25zIHdpdGggdGhlIG1vc3QgdXNlIGFuZCB0aGUgbW9zdCBwYXJlbnRzIGFyZQotcGxhY2VkIGZpcnN0LCBmb2xsb3dlZCBieSBvdGhlciBmdW5jdGlvbnMgd2l0aCB0aGUgbW9zdCB1c2UsCi1mb2xsb3dlZCBieSBsb3dlciB1c2UgZnVuY3Rpb25zLCBmb2xsb3dlZCBieSB1bnVzZWQgZnVuY3Rpb25zCi1hdCB0aGUgZW5kLgotCi1Abm9kZSBEZWJ1Z2dpbmcsLEludGVybmFscyxEZXRhaWxzCi1Ac3Vic2VjdGlvbiBEZWJ1Z2dpbmcgQGNvZGV7Z3Byb2Z9Ci0KLUlmIEBjb2Rle2dwcm9mfSB3YXMgY29tcGlsZWQgd2l0aCBkZWJ1Z2dpbmcgZW5hYmxlZCwKLXRoZSBAc2FtcHstZH0gb3B0aW9uIHRyaWdnZXJzIGRlYnVnZ2luZyBvdXRwdXQKLSh0byBzdGRvdXQpIHdoaWNoIGNhbiBiZSBoZWxwZnVsIGluIHVuZGVyc3RhbmRpbmcgaXRzIG9wZXJhdGlvbi4KLVRoZSBkZWJ1Z2dpbmcgbnVtYmVyIHNwZWNpZmllZCBpcyBpbnRlcnByZXRlZCBhcyBhIHN1bSBvZiB0aGUgZm9sbG93aW5nCi1vcHRpb25zOgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIDIgLSBUb3BvbG9naWNhbCBzb3J0Ci1Nb25pdG9yIGRlcHRoLWZpcnN0IG51bWJlcmluZyBvZiBzeW1ib2xzIGR1cmluZyBjYWxsIGdyYXBoIGFuYWx5c2lzCi1AaXRlbSA0IC0gQ3ljbGVzCi1TaG93cyBzeW1ib2xzIGFzIHRoZXkgYXJlIGlkZW50aWZpZWQgYXMgY3ljbGUgaGVhZHMKLUBpdGVtIDE2IC0gVGFsbHlpbmcKLUFzIHRoZSBjYWxsIGdyYXBoIGFyY3MgYXJlIHJlYWQsIHNob3cgZWFjaCBhcmMgYW5kIGhvdwotdGhlIHRvdGFsIGNhbGxzIHRvIGVhY2ggZnVuY3Rpb24gYXJlIHRhbGxpZWQKLUBpdGVtIDMyIC0gQ2FsbCBncmFwaCBhcmMgc29ydGluZwotRGV0YWlscyBzb3J0aW5nIGluZGl2aWR1YWwgcGFyZW50cy9jaGlsZHJlbiB3aXRoaW4gZWFjaCBjYWxsIGdyYXBoIGVudHJ5Ci1AaXRlbSA2NCAtIFJlYWRpbmcgaGlzdG9ncmFtIGFuZCBjYWxsIGdyYXBoIHJlY29yZHMKLVNob3dzIGFkZHJlc3MgcmFuZ2VzIG9mIGhpc3RvZ3JhbXMgYXMgdGhleSBhcmUgcmVhZCwgYW5kIGVhY2gKLWNhbGwgZ3JhcGggYXJjCi1AaXRlbSAxMjggLSBTeW1ib2wgdGFibGUKLVJlYWRpbmcsIGNsYXNzaWZ5aW5nLCBhbmQgc29ydGluZyB0aGUgc3ltYm9sIHRhYmxlIGZyb20gdGhlIG9iamVjdCBmaWxlLgotRm9yIGxpbmUtYnktbGluZSBwcm9maWxpbmcgKEBzYW1wey1sfSBvcHRpb24pLCBhbHNvIHNob3dzIGxpbmUgbnVtYmVycwotYmVpbmcgYXNzaWduZWQgdG8gbWVtb3J5IGFkZHJlc3Nlcy4KLUBpdGVtIDI1NiAtIFN0YXRpYyBjYWxsIGdyYXBoCi1UcmFjZSBvcGVyYXRpb24gb2YgQHNhbXB7LWN9IG9wdGlvbgotQGl0ZW0gNTEyIC0gU3ltYm9sIHRhYmxlIGFuZCBhcmMgdGFibGUgbG9va3VwcwotRGV0YWlsIG9wZXJhdGlvbiBvZiBsb29rdXAgcm91dGluZXMKLUBpdGVtIDEwMjQgLSBDYWxsIGdyYXBoIHByb3BhZ2F0aW9uCi1TaG93cyBob3cgZnVuY3Rpb24gdGltZXMgYXJlIHByb3BhZ2F0ZWQgYWxvbmcgdGhlIGNhbGwgZ3JhcGgKLUBpdGVtIDIwNDggLSBCYXNpYy1ibG9ja3MKLVNob3dzIGJhc2ljLWJsb2NrIHJlY29yZHMgYXMgdGhleSBhcmUgcmVhZCBmcm9tIHByb2ZpbGUgZGF0YQotKG9ubHkgbWVhbmluZ2Z1bCB3aXRoIEBzYW1wey1sfSBvcHRpb24pCi1AaXRlbSA0MDk2IC0gU3ltc3BlY3MKLVNob3dzIHN5bXNwZWMtdG8tc3ltYm9sIHBhdHRlcm4gbWF0Y2hpbmcgb3BlcmF0aW9uCi1AaXRlbSA4MTkyIC0gQW5ub3RhdGUgc291cmNlCi1UcmFja3Mgb3BlcmF0aW9uIG9mIEBzYW1wey1BfSBvcHRpb24KLUBlbmQgdGFibGUKLQotQGNvbnRlbnRzCi1AYnllCi0KLU5FRURTIEFOIElOREVYCi0KLS1UIC0gInRyYWRpdGlvbmFsIEJTRCBzdHlsZSI6IEhvdyBpcyBpdCBkaWZmZXJlbnQ/ICBTaG91bGQgdGhlCi1kaWZmZXJlbmNlcyBiZSBkb2N1bWVudGVkPwotCi1leGFtcGxlIGZsYXQgZmlsZSBhZGRzIHVwIHRvIDEwMC4wMSUuLi4KLQotbm90ZTogdGltZSBlc3RpbWF0ZXMgbm93IG9ubHkgZ28gb3V0IHRvIG9uZSBkZWNpbWFsIHBsYWNlICgwLjApLCB3aGVyZQotdGhleSB1c2VkIHRvIGV4dGVuZCB0d28gKDc4LjY3KS4KZGlmZiAtLWdpdCBhL2dwcm9mL2hlcnR6LmMgYi9ncHJvZi9oZXJ0ei5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTMxNGFjLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2hlcnR6LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2luY2x1ZGUgImhlcnR6LmgiCi0KLQotI2lmZGVmIF9fTVNET1NfXwotI2RlZmluZSBIRVJUWiAxOAotI2VuZGlmCi0KLWludAotaGVydHogKCkKLXsKLSNpZmRlZiBIRVJUWgotICByZXR1cm4gSEVSVFo7Ci0jZWxzZSAvKiAhIGRlZmluZWQgKEhFUlRaKSAqLwotI2lmZGVmIEhBVkVfU0VUSVRJTUVSCi0gIHN0cnVjdCBpdGltZXJ2YWwgdGltOwotCi0gIHRpbS5pdF9pbnRlcnZhbC50dl9zZWMgPSAwOwotICB0aW0uaXRfaW50ZXJ2YWwudHZfdXNlYyA9IDE7Ci0gIHRpbS5pdF92YWx1ZS50dl9zZWMgPSAwOwotICB0aW0uaXRfdmFsdWUudHZfdXNlYyA9IDA7Ci0gIHNldGl0aW1lciAoSVRJTUVSX1JFQUwsICZ0aW0sIDApOwotICBzZXRpdGltZXIgKElUSU1FUl9SRUFMLCAwLCAmdGltKTsKLSAgaWYgKHRpbS5pdF9pbnRlcnZhbC50dl91c2VjIDwgMikKLSAgICB7Ci0gICAgICByZXR1cm4gSFpfV1JPTkc7Ci0gICAgfQotICByZXR1cm4gMTAwMDAwMCAvIHRpbS5pdF9pbnRlcnZhbC50dl91c2VjOwotI2Vsc2UgLyogISBkZWZpbmVkIChIQVZFX1NFVElUSU1FUikgKi8KLSNpZiBkZWZpbmVkIChIQVZFX1NZU0NPTkYpICYmIGRlZmluZWQgKF9TQ19DTEtfVENLKQotICByZXR1cm4gc3lzY29uZiAoX1NDX0NMS19UQ0spOwotI2Vsc2UgLyogISBkZWZpbmVkIChIQVZFX1NZU0NPTkYpIHx8ICEgZGVmaW5lZCAoX1NDX0NMS19UQ0spICovCi0gIHJldHVybiBIWl9XUk9ORzsKLSNlbmRpZiAvKiAhIGRlZmluZWQgKEhBVkVfU1lTQ09ORikgfHwgISBkZWZpbmVkIChfU0NfQ0xLX1RDSykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEhBVkVfU0VUSVRJTUVSKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoSEVSVFopICovCi19CmRpZmYgLS1naXQgYS9ncHJvZi9oZXJ0ei5oIGIvZ3Byb2YvaGVydHouaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhMDFiYS4uMDAwMDAwMAotLS0gYS9ncHJvZi9oZXJ0ei5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotI2lmbmRlZiBoZXJ0el9oCi0jZGVmaW5lIGhlcnR6X2gKLQotI2luY2x1ZGUgImdwcm9mLmgiCi0KLSNkZWZpbmUJSFpfV1JPTkcgMAkJLyogaW1wb3NzaWJsZSBjbG9jayBmcmVxdWVuY3kgKi8KLQotLyoKLSAqIERpc2NvdmVyIHRoZSB0aWNrIGZyZXF1ZW5jeSBvZiB0aGUgbWFjaGluZSBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZywKLSAqIHdlIHJldHVybiBIWl9XUk9ORywgYW4gaW1wb3NzaWJsZSBzYW1wbGluZyBmcmVxdWVuY3kuCi0gKi8KLQotLyogRklYTUU6IENoZWNraW5nIGZvciBNQUNIIGhlcmUgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBmb3IgYSBjcm9zcwotICAgZ3Byb2YuICAqLwotI2lmZGVmIE1BQ0gKLSNpbmNsdWRlIDxtYWNoaW5lL21hY2hfcGFyYW0uaD4KLSNkZWZpbmUgaGVydHooKSAoSFopCi0jZWxzZQotZXh0ZXJuIGludCBoZXJ0eiBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIGhlcnR6X2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2hpc3QuYyBiL2dwcm9mL2hpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZlZjI1YS4uMDAwMDAwMAotLS0gYS9ncHJvZi9oaXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDAgKzAsMCBAQAotLyoKLSAqIEhpc3RvZ3JhbSByZWxhdGVkIG9wZXJhdGlvbnMuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJnbW9uX2lvLmgiCi0jaW5jbHVkZSAiZ21vbl9vdXQuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0jaW5jbHVkZSAic3ltX2lkcy5oIgotI2luY2x1ZGUgInV0aWxzLmgiCi0KLSNkZWZpbmUgVU5JVFNfVE9fQ09ERSAob2Zmc2V0X3RvX2NvZGUgLyBzaXplb2YoVU5JVCkpCi0KLXN0YXRpYyB2b2lkIHNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogZGVjbGFyYXRpb25zIG9mIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZ1bmN0aW9ucyB0byBvdXRwdXQgYmx1cmJzOiAqLwotZXh0ZXJuIHZvaWQgZmxhdF9ibHVyYiBQQVJBTVMgKChGSUxFICogZnApKTsKLQotYmZkX3ZtYSBzX2xvd3BjOwkJLyogbG93ZXN0IGFkZHJlc3MgaW4gLnRleHQgKi8KLWJmZF92bWEgc19oaWdocGMgPSAwOwkJLyogaGlnaGVzdCBhZGRyZXNzIGluIC50ZXh0ICovCi1iZmRfdm1hIGxvd3BjLCBoaWdocGM7CQkvKiBzYW1lLCBidXQgZXhwcmVzc2VkIGluIFVOSVRzICovCi1pbnQgaGlzdF9udW1fYmlucyA9IDA7CQkvKiBudW1iZXIgb2YgaGlzdG9ncmFtIHNhbXBsZXMgKi8KLWludCAqaGlzdF9zYW1wbGUgPSAwOwkJLyogaGlzdG9ncmFtIHNhbXBsZXMgKHNob3J0cyBpbiB0aGUgZmlsZSEpICovCi1kb3VibGUgaGlzdF9zY2FsZTsKLWNoYXIgaGlzdF9kaW1lbnNpb25bc2l6ZW9mICgoKHN0cnVjdCBnbW9uX2hpc3RfaGRyICopIDApLT5kaW1lbikgKyAxXSA9Ci0gICJzZWNvbmRzIjsKLWNoYXIgaGlzdF9kaW1lbnNpb25fYWJicmV2ID0gJ3MnOwotCi1zdGF0aWMgZG91YmxlIGFjY3VtX3RpbWU7CS8qIGFjY3VtdWxhdGVkIHRpbWUgc28gZmFyIGZvciBwcmludF9saW5lKCkgKi8KLXN0YXRpYyBkb3VibGUgdG90YWxfdGltZTsJLyogdG90YWwgdGltZSBmb3IgYWxsIHJvdXRpbmVzICovCi0vKgotICogVGFibGUgb2YgU0kgcHJlZml4ZXMgZm9yIHBvd2VycyBvZiAxMCAodXNlZCB0byBhdXRvbWF0aWNhbGx5Ci0gKiBzY2FsZSBzb21lIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGZsYXQgcHJvZmlsZSkuCi0gKi8KLWNvbnN0IHN0cnVjdAotICB7Ci0gICAgY2hhciBwcmVmaXg7Ci0gICAgZG91YmxlIHNjYWxlOwotICB9Ci1TSXRhYltdID0KLXsKLSAgewotICAgICdUJywgMWUtMTIKLSAgfQotICAsCQkJCS8qIHRlcmEgKi8KLSAgewotICAgICdHJywgMWUtMDkKLSAgfQotICAsCQkJCS8qIGdpZ2EgKi8KLSAgewotICAgICdNJywgMWUtMDYKLSAgfQotICAsCQkJCS8qIG1lZ2EgKi8KLSAgewotICAgICdLJywgMWUtMDMKLSAgfQotICAsCQkJCS8qIGtpbG8gKi8KLSAgewotICAgICcgJywgMWUtMDAKLSAgfQotICAsCi0gIHsKLSAgICAnbScsIDFlKzAzCi0gIH0KLSAgLAkJCQkvKiBtaWxsaSAqLwotICB7Ci0gICAgJ3UnLCAxZSswNgotICB9Ci0gICwJCQkJLyogbWljcm8gKi8KLSAgewotICAgICduJywgMWUrMDkKLSAgfQotICAsCQkJCS8qIG5hbm8gKi8KLSAgewotICAgICdwJywgMWUrMTIKLSAgfQotICAsCQkJCS8qIHBpY28gKi8KLSAgewotICAgICdmJywgMWUrMTUKLSAgfQotICAsCQkJCS8qIGZlbXRvICovCi0gIHsKLSAgICAnYScsIDFlKzE4Ci0gIH0KLSAgLAkJCQkvKiBhdG8gKi8KLX07Ci0KLS8qCi0gKiBSZWFkIHRoZSBoaXN0b2dyYW0gZnJvbSBmaWxlIElGUC4gIEZJTEVOQU1FIGlzIHRoZSBuYW1lIG9mIElGUCBhbmQKLSAqIGlzIHByb3ZpZGVkIGZvciBmb3JtYXR0aW5nIGVycm9yIG1lc3NhZ2VzIG9ubHkuCi0gKi8KLXZvaWQKLURFRlVOIChoaXN0X3JlYWRfcmVjLCAoaWZwLCBmaWxlbmFtZSksIEZJTEUgKiBpZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBzdHJ1Y3QgZ21vbl9oaXN0X2hkciBoZHI7Ci0gIGJmZF92bWEgbl9sb3dwYywgbl9oaWdocGM7Ci0gIGludCBpLCBuY250LCBwcm9mcmF0ZTsKLSAgVU5JVCBjb3VudDsKLQotICBpZiAoZnJlYWQgKCZoZHIsIHNpemVvZiAoaGRyKSwgMSwgaWZwKSAhPSAxKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlXG4iKSwKLQkgICAgICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgbl9sb3dwYyA9IChiZmRfdm1hKSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGhkci5sb3dfcGMpOwotICBuX2hpZ2hwYyA9IChiZmRfdm1hKSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGhkci5oaWdoX3BjKTsKLSAgbmNudCA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgaGRyLmhpc3Rfc2l6ZSk7Ci0gIHByb2ZyYXRlID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBoZHIucHJvZl9yYXRlKTsKLSAgc3RybmNweSAoaGlzdF9kaW1lbnNpb24sIGhkci5kaW1lbiwgc2l6ZW9mIChoZHIuZGltZW4pKTsKLSAgaGlzdF9kaW1lbnNpb25bc2l6ZW9mIChoZHIuZGltZW4pXSA9ICdcMCc7Ci0gIGhpc3RfZGltZW5zaW9uX2FiYnJldiA9IGhkci5kaW1lbl9hYmJyZXY7Ci0KLSAgaWYgKCFzX2hpZ2hwYykKLSAgICB7Ci0KLSAgICAgIC8qIHRoaXMgaXMgdGhlIGZpcnN0IGhpc3RvZ3JhbSByZWNvcmQ6ICovCi0KLSAgICAgIHNfbG93cGMgPSBuX2xvd3BjOwotICAgICAgc19oaWdocGMgPSBuX2hpZ2hwYzsKLSAgICAgIGxvd3BjID0gKGJmZF92bWEpIG5fbG93cGMgLyBzaXplb2YgKFVOSVQpOwotICAgICAgaGlnaHBjID0gKGJmZF92bWEpIG5faGlnaHBjIC8gc2l6ZW9mIChVTklUKTsKLSAgICAgIGhpc3RfbnVtX2JpbnMgPSBuY250OwotICAgICAgaHogPSBwcm9mcmF0ZTsKLSAgICB9Ci0KLSAgREJHIChTQU1QTEVERUJVRywKLSAgICAgICBwcmludGYgKCJbaGlzdF9yZWFkX3JlY10gbl9sb3dwYyAweCVseCBuX2hpZ2hwYyAweCVseCBuY250ICVkXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgbl9sb3dwYywgKHVuc2lnbmVkIGxvbmcpIG5faGlnaHBjLCBuY250KTsKLSAgICAgICBwcmludGYgKCJbaGlzdF9yZWFkX3JlY10gc19sb3dwYyAweCVseCBzX2hpZ2hwYyAweCVseCBuc2FtcGxlcyAlZFxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNfbG93cGMsICh1bnNpZ25lZCBsb25nKSBzX2hpZ2hwYywKLQkgICAgICAgaGlzdF9udW1fYmlucyk7Ci0gICAgICAgcHJpbnRmICgiW2hpc3RfcmVhZF9yZWNdICAgbG93cGMgMHglbHggICBoaWdocGMgMHglbHhcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBsb3dwYywgKHVuc2lnbmVkIGxvbmcpIGhpZ2hwYykpOwotCi0gIGlmIChuX2xvd3BjICE9IHNfbG93cGMgfHwgbl9oaWdocGMgIT0gc19oaWdocGMKLSAgICAgIHx8IG5jbnQgIT0gaGlzdF9udW1fYmlucyB8fCBoeiAhPSBwcm9mcmF0ZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBgJXMnIGlzIGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIiksCi0JICAgICAgIHdob2FtaSwgZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmICghaGlzdF9zYW1wbGUpCi0gICAgewotICAgICAgaGlzdF9zYW1wbGUgPSAoaW50ICopIHhtYWxsb2MgKGhpc3RfbnVtX2JpbnMgKiBzaXplb2YgKGhpc3Rfc2FtcGxlWzBdKSk7Ci0gICAgICBtZW1zZXQgKGhpc3Rfc2FtcGxlLCAwLCBoaXN0X251bV9iaW5zICogc2l6ZW9mIChoaXN0X3NhbXBsZVswXSkpOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgaGlzdF9udW1fYmluczsgKytpKQotICAgIHsKLSAgICAgIGlmIChmcmVhZCAoJmNvdW50WzBdLCBzaXplb2YgKGNvdW50KSwgMSwgaWZwKSAhPSAxKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgXygiJXM6ICVzOiB1bmV4cGVjdGVkIEVPRiBhZnRlciByZWFkaW5nICVkIG9mICVkIHNhbXBsZXNcbiIpLAotCQkgICB3aG9hbWksIGZpbGVuYW1lLCBpLCBoaXN0X251bV9iaW5zKTsKLQkgIGRvbmUgKDEpOwotCX0KLSAgICAgIGhpc3Rfc2FtcGxlW2ldICs9IGJmZF9nZXRfMTYgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJiBjb3VudFswXSk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBXcml0ZSBleGVjdXRpb24gaGlzdG9ncmFtIHRvIGZpbGUgT0ZQLiAgRklMRU5BTUUgaXMgdGhlIG5hbWUKLSAqIG9mIE9GUCBhbmQgaXMgcHJvdmlkZWQgZm9yIGZvcm1hdHRpbmcgZXJyb3ItbWVzc2FnZXMgb25seS4KLSAqLwotdm9pZAotREVGVU4gKGhpc3Rfd3JpdGVfaGlzdCwgKG9mcCwgZmlsZW5hbWUpLCBGSUxFICogb2ZwIEFORCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgc3RydWN0IGdtb25faGlzdF9oZHIgaGRyOwotICB1bnNpZ25lZCBjaGFyIHRhZzsKLSAgVU5JVCBjb3VudDsKLSAgaW50IGk7Ci0KLSAgLyogd3JpdGUgaGVhZGVyOiAqLwotCi0gIHRhZyA9IEdNT05fVEFHX1RJTUVfSElTVDsKLSAgcHV0X3ZtYSAoY29yZV9iZmQsIHNfbG93cGMsIChiZmRfYnl0ZSAqKSBoZHIubG93X3BjKTsKLSAgcHV0X3ZtYSAoY29yZV9iZmQsIHNfaGlnaHBjLCAoYmZkX2J5dGUgKikgaGRyLmhpZ2hfcGMpOwotICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgaGlzdF9udW1fYmlucywgKGJmZF9ieXRlICopIGhkci5oaXN0X3NpemUpOwotICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgaHosIChiZmRfYnl0ZSAqKSBoZHIucHJvZl9yYXRlKTsKLSAgc3RybmNweSAoaGRyLmRpbWVuLCBoaXN0X2RpbWVuc2lvbiwgc2l6ZW9mIChoZHIuZGltZW4pKTsKLSAgaGRyLmRpbWVuX2FiYnJldiA9IGhpc3RfZGltZW5zaW9uX2FiYnJldjsKLQotICBpZiAoZndyaXRlICgmdGFnLCBzaXplb2YgKHRhZyksIDEsIG9mcCkgIT0gMQotICAgICAgfHwgZndyaXRlICgmaGRyLCBzaXplb2YgKGhkciksIDEsIG9mcCkgIT0gMSkKLSAgICB7Ci0gICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgaGlzdF9udW1fYmluczsgKytpKQotICAgIHsKLSAgICAgIGJmZF9wdXRfMTYgKGNvcmVfYmZkLCBoaXN0X3NhbXBsZVtpXSwgKGJmZF9ieXRlICopICYgY291bnRbMF0pOwotICAgICAgaWYgKGZ3cml0ZSAoJmNvdW50WzBdLCBzaXplb2YgKGNvdW50KSwgMSwgb2ZwKSAhPSAxKQotCXsKLQkgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgIH0KLX0KLQotCi0vKgotICogQ2FsY3VsYXRlIHNjYWxlZCBlbnRyeSBwb2ludCBhZGRyZXNzZXMgKHRvIHNhdmUgdGltZSBpbgotICogaGlzdF9hc3NpZ25fc2FtcGxlcyksIGFuZCwgb24gYXJjaGl0ZWN0dXJlcyB0aGF0IGhhdmUgcHJvY2VkdXJlCi0gKiBlbnRyeSBtYXNrcyBhdCB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbiwgcG9zc2libHkgcHVzaCB0aGUgc2NhbGVkCi0gKiBlbnRyeSBwb2ludHMgb3ZlciB0aGUgcHJvY2VkdXJlIGVudHJ5IG1hc2ssIGlmIGl0IHR1cm5zIG91dCB0aGF0Ci0gKiB0aGUgZW50cnkgcG9pbnQgaXMgaW4gb25lIGJpbiBhbmQgdGhlIGNvZGUgZm9yIGEgcm91dGluZSBpcyBpbiB0aGUKLSAqIG5leHQgYmluLgotICovCi1zdGF0aWMgdm9pZAotc2NhbGVfYW5kX2FsaWduX2VudHJpZXMgKCkKLXsKLSAgU3ltICpzeW07Ci0gIGJmZF92bWEgYmluX29mX2VudHJ5OwotICBiZmRfdm1hIGJpbl9vZl9jb2RlOwotCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgc3ltKyspCi0gICAgewotICAgICAgc3ltLT5oaXN0LnNjYWxlZF9hZGRyID0gc3ltLT5hZGRyIC8gc2l6ZW9mIChVTklUKTsKLSAgICAgIGJpbl9vZl9lbnRyeSA9IChzeW0tPmhpc3Quc2NhbGVkX2FkZHIgLSBsb3dwYykgLyBoaXN0X3NjYWxlOwotICAgICAgYmluX29mX2NvZGUgPSAoc3ltLT5oaXN0LnNjYWxlZF9hZGRyICsgVU5JVFNfVE9fQ09ERSAtIGxvd3BjKSAvIGhpc3Rfc2NhbGU7Ci0gICAgICBpZiAoYmluX29mX2VudHJ5IDwgYmluX29mX2NvZGUpCi0JewotCSAgREJHIChTQU1QTEVERUJVRywKLQkgICAgICAgcHJpbnRmICgiW3NjYWxlX2FuZF9hbGlnbl9lbnRyaWVzXSBwdXNoaW5nIDB4JWx4IHRvIDB4JWx4XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN5bS0+aGlzdC5zY2FsZWRfYWRkciwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoc3ltLT5oaXN0LnNjYWxlZF9hZGRyCi0JCQkJCSsgVU5JVFNfVE9fQ09ERSkpKTsKLQkgIHN5bS0+aGlzdC5zY2FsZWRfYWRkciArPSBVTklUU19UT19DT0RFOwotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIEFzc2lnbiBzYW1wbGVzIHRvIHRoZSBzeW1ib2wgdG8gd2hpY2ggdGhleSBiZWxvbmcuCi0gKgotICogSGlzdG9ncmFtIGJpbiBJIGNvdmVycyBzb21lIGFkZHJlc3MgcmFuZ2UgW0JJTl9MT1dQQyxCSU5fSElHSF9QQykKLSAqIHdoaWNoIG1heSBvdmVybGFwIG9uZSBtb3JlIHN5bWJvbCBhZGRyZXNzIHJhbmdlcy4gIElmIGEgc3ltYm9sCi0gKiBvdmVybGFwcyB3aXRoIHRoZSBiaW4ncyBhZGRyZXNzIHJhbmdlIGJ5IE8gcGVyY2VudCwgdGhlbiBPIHBlcmNlbnQKLSAqIG9mIHRoZSBiaW4ncyBjb3VudCBpcyBjcmVkaXRlZCB0byB0aGF0IHN5bWJvbC4KLSAqCi0gKiBUaGVyZSBhcmUgdGhyZWUgY2FzZXMgYXMgdG8gd2hlcmUgQklOX0xPV19QQyBhbmQgQklOX0hJR0hfUEMgY2FuIGJlCi0gKiB3aXRoIHJlc3BlY3QgdG8gdGhlIHN5bWJvbCdzIGFkZHJlc3MgcmFuZ2UgW1NZTV9MT1dfUEMsCi0gKiBTWU1fSElHSF9QQykgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBkaWFncmFtLiAgT1ZFUkxBUCBjb21wdXRlcwotICogdGhlIGRpc3RhbmNlIChpbiBVTklUcykgYmV0d2VlbiB0aGUgYXJyb3dzLCB0aGUgZnJhY3Rpb24gb2YgdGhlCi0gKiBzYW1wbGUgdGhhdCBpcyB0byBiZSBjcmVkaXRlZCB0byB0aGUgc3ltYm9sIHdoaWNoIHN0YXJ0cyBhdAotICogU1lNX0xPV19QQy4KLSAqCi0gKiAgICAgICAgc3ltX2xvd19wYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltX2hpZ2hfcGMKLSAqICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKLSAqCi0gKiAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgfCAgLT58ICAgIHw8LSAgICAgICAgIC0+fCAgICAgICAgIHw8LSAgICAgICAgIC0+fCAgICB8PC0gIHwKLSAqICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgfAotICogICAgICAgICstLS0tLS0tLS0rICAgICAgICAgICAgICstLS0tLS0tLS0rICAgICAgICAgICAgICstLS0tLS0tLS0rCi0gKgotICogICAgICAgIF4gICAgICAgICBeICAgICAgICAgICAgIF4gICAgICAgICBeICAgICAgICAgICAgIF4gICAgICAgICBeCi0gKiAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgIHwKLSAqICAgYmluX2xvd19wYyBiaW5faGlnaF9wYyAgYmluX2xvd19wYyBiaW5faGlnaF9wYyAgYmluX2xvd19wYyBiaW5faGlnaF9wYwotICoKLSAqIEZvciB0aGUgVkFYIHdlIGFzc2VydCB0aGF0IHNhbXBsZXMgd2lsbCBuZXZlciBmYWxsIGluIHRoZSBmaXJzdCB0d28KLSAqIGJ5dGVzIG9mIGFueSByb3V0aW5lLCBzaW5jZSB0aGF0IGlzIHRoZSBlbnRyeSBtYXNrLCB0aHVzIHdlIGNhbGwKLSAqIHNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzKCkgdG8gYWRqdXN0IHRoZSBlbnRyeSBwb2ludHMgaWYgdGhlIGVudHJ5Ci0gKiBtYXNrIGZhbGxzIGluIG9uZSBiaW4gYnV0IHRoZSBjb2RlIGZvciB0aGUgcm91dGluZSBkb2Vzbid0IHN0YXJ0Ci0gKiB1bnRpbCB0aGUgbmV4dCBiaW4uICBJbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbGlnbm1lbnQgb2Ygcm91dGluZQotICogYWRkcmVzc2VzLCB0aGlzIHNob3VsZCBhbGxvdyB1cyB0byBoYXZlIG9ubHkgb25lIHNhbXBsZSBmb3IgZXZlcnkKLSAqIGZvdXIgYnl0ZXMgb2YgdGV4dCBzcGFjZSBhbmQgbmV2ZXIgaGF2ZSBhbnkgb3ZlcmxhcCAodGhlIHR3byBlbmQKLSAqIGNhc2VzLCBhYm92ZSkuCi0gKi8KLXZvaWQKLURFRlVOX1ZPSUQgKGhpc3RfYXNzaWduX3NhbXBsZXMpCi17Ci0gIGJmZF92bWEgYmluX2xvd19wYywgYmluX2hpZ2hfcGM7Ci0gIGJmZF92bWEgc3ltX2xvd19wYywgc3ltX2hpZ2hfcGM7Ci0gIGJmZF92bWEgb3ZlcmxhcCwgYWRkcjsKLSAgaW50IGJpbl9jb3VudCwgaTsKLSAgdW5zaWduZWQgaW50IGo7Ci0gIGRvdWJsZSB0aW1lLCBjcmVkaXQ7Ci0KLSAgLyogcmVhZCBzYW1wbGVzIGFuZCBhc3NpZ24gdG8gc3ltYm9sczogKi8KLSAgaGlzdF9zY2FsZSA9IGhpZ2hwYyAtIGxvd3BjOwotICBoaXN0X3NjYWxlIC89IGhpc3RfbnVtX2JpbnM7Ci0gIHNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzICgpOwotCi0gIC8qIGl0ZXJhdGUgb3ZlciBhbGwgc2FtcGxlIGJpbnM6ICovCi0KLSAgZm9yIChpID0gMCwgaiA9IDE7IGkgPCBoaXN0X251bV9iaW5zOyArK2kpCi0gICAgewotICAgICAgYmluX2NvdW50ID0gaGlzdF9zYW1wbGVbaV07Ci0gICAgICBpZiAoIWJpbl9jb3VudCkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBiaW5fbG93X3BjID0gbG93cGMgKyAoYmZkX3ZtYSkgKGhpc3Rfc2NhbGUgKiBpKTsKLSAgICAgIGJpbl9oaWdoX3BjID0gbG93cGMgKyAoYmZkX3ZtYSkgKGhpc3Rfc2NhbGUgKiAoaSArIDEpKTsKLSAgICAgIHRpbWUgPSBiaW5fY291bnQ7Ci0gICAgICBEQkcgKFNBTVBMRURFQlVHLAotCSAgIHByaW50ZiAoCi0gICAgICAiW2Fzc2lnbl9zYW1wbGVzXSBiaW5fbG93X3BjPTB4JWx4LCBiaW5faGlnaF9wYz0weCVseCwgYmluX2NvdW50PSVkXG4iLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIChzaXplb2YgKFVOSVQpICogYmluX2xvd19wYyksCi0JCSAgICAodW5zaWduZWQgbG9uZykgKHNpemVvZiAoVU5JVCkgKiBiaW5faGlnaF9wYyksCi0JCSAgICBiaW5fY291bnQpKTsKLSAgICAgIHRvdGFsX3RpbWUgKz0gdGltZTsKLQotICAgICAgLyogY3JlZGl0IGFsbCBzeW1ib2xzIHRoYXQgYXJlIGNvdmVyZWQgYnkgYmluIEk6ICovCi0KLSAgICAgIGZvciAoaiA9IGogLSAxOyBqIDwgc3ltdGFiLmxlbjsgKytqKQotCXsKLQkgIHN5bV9sb3dfcGMgPSBzeW10YWIuYmFzZVtqXS5oaXN0LnNjYWxlZF9hZGRyOwotCSAgc3ltX2hpZ2hfcGMgPSBzeW10YWIuYmFzZVtqICsgMV0uaGlzdC5zY2FsZWRfYWRkcjsKLQkgIC8qCi0JICAgKiBJZiBoaWdoIGVuZCBvZiBiaW4gaXMgYmVsb3cgZW50cnkgYWRkcmVzcywgZ28gZm9yIG5leHQKLQkgICAqIGJpbjoKLQkgICAqLwotCSAgaWYgKGJpbl9oaWdoX3BjIDwgc3ltX2xvd19wYykKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKgotCSAgICogSWYgbG93IGVuZCBvZiBiaW4gaXMgYWJvdmUgaGlnaCBlbmQgb2Ygc3ltYm9sLCBnbyBmb3IKLQkgICAqIG5leHQgc3ltYm9sLgotCSAgICovCi0JICBpZiAoYmluX2xvd19wYyA+PSBzeW1faGlnaF9wYykKLQkgICAgewotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBvdmVybGFwID0KLQkgICAgTUlOIChiaW5faGlnaF9wYywgc3ltX2hpZ2hfcGMpIC0gTUFYIChiaW5fbG93X3BjLCBzeW1fbG93X3BjKTsKLQkgIGlmIChvdmVybGFwID4gMCkKLQkgICAgewotCSAgICAgIERCRyAoU0FNUExFREVCVUcsCi0JCSAgIHByaW50ZiAoCi0JCQkgICAgIlthc3NpZ25fc2FtcGxlc10gWzB4JWx4LDB4JWx4KSAlcyBnZXRzICVmIHRpY2tzICVsZCBvdmVybGFwXG4iLAotCQkJICAgICh1bnNpZ25lZCBsb25nKSBzeW10YWIuYmFzZVtqXS5hZGRyLAotCQkJICAgICh1bnNpZ25lZCBsb25nKSAoc2l6ZW9mIChVTklUKSAqIHN5bV9oaWdoX3BjKSwKLQkJCSAgICBzeW10YWIuYmFzZVtqXS5uYW1lLCBvdmVybGFwICogdGltZSAvIGhpc3Rfc2NhbGUsCi0JCQkgICAgKGxvbmcpIG92ZXJsYXApKTsKLQkgICAgICBhZGRyID0gc3ltdGFiLmJhc2Vbal0uYWRkcjsKLQkgICAgICBjcmVkaXQgPSBvdmVybGFwICogdGltZSAvIGhpc3Rfc2NhbGU7Ci0JICAgICAgLyoKLQkgICAgICAgKiBDcmVkaXQgc3ltYm9sIGlmIGl0IGFwcGVhcnMgaW4gSU5DTF9GTEFUIG9yIHRoYXQKLQkgICAgICAgKiB0YWJsZSBpcyBlbXB0eSBhbmQgaXQgZG9lcyBub3QgYXBwZWFyIGl0IGluCi0JICAgICAgICogRVhDTF9GTEFULgotCSAgICAgICAqLwotCSAgICAgIGlmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0ZMQVRdLCBhZGRyKQotCQkgIHx8IChzeW1zW0lOQ0xfRkxBVF0ubGVuID09IDAKLQkJICAgICAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfRkxBVF0sIGFkZHIpKSkKLQkJewotCQkgIHN5bXRhYi5iYXNlW2pdLmhpc3QudGltZSArPSBjcmVkaXQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB0b3RhbF90aW1lIC09IGNyZWRpdDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgREJHIChTQU1QTEVERUJVRywgcHJpbnRmICgiW2Fzc2lnbl9zYW1wbGVzXSB0b3RhbF90aW1lICVmXG4iLAotCQkJICAgIHRvdGFsX3RpbWUpKTsKLX0KLQotCi0vKgotICogUHJpbnQgaGVhZGVyIGZvciBmbGFnIGhpc3RvZ3JhbSBwcm9maWxlOgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHByaW50X2hlYWRlciwgKHByZWZpeCksIGNvbnN0IGNoYXIgcHJlZml4KQotewotICBjaGFyIHVuaXRbNjRdOwotCi0gIHNwcmludGYgKHVuaXQsIF8oIiVjJWMvY2FsbCIpLCBwcmVmaXgsIGhpc3RfZGltZW5zaW9uX2FiYnJldik7Ci0KLSAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgcHJpbnRmIChfKCJcbmdyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzICVsZCBieXRlKHMpIiksCi0JICAgICAgKGxvbmcpIGhpc3Rfc2NhbGUgKiBzaXplb2YgKFVOSVQpKTsKLSAgICAgIGlmICh0b3RhbF90aW1lID4gMC4wKQotCXsKLQkgIHByaW50ZiAoXygiIGZvciAlLjJmJSUgb2YgJS4yZiAlc1xuXG4iKSwKLQkJICAxMDAuMCAvIHRvdGFsX3RpbWUsIHRvdGFsX3RpbWUgLyBoeiwgaGlzdF9kaW1lbnNpb24pOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlxuRWFjaCBzYW1wbGUgY291bnRzIGFzICVnICVzLlxuIiksIDEuMCAvIGh6LCBoaXN0X2RpbWVuc2lvbik7Ci0gICAgfQotCi0gIGlmICh0b3RhbF90aW1lIDw9IDAuMCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIiBubyB0aW1lIGFjY3VtdWxhdGVkXG5cbiIpKTsKLSAgICAgIC8qIHRoaXMgZG9lc24ndCBodXJ0IHNpbmNlIGFsbCB0aGUgbnVtZXJhdG9ycyB3aWxsIGJlIHplcm86ICovCi0gICAgICB0b3RhbF90aW1lID0gMS4wOwotICAgIH0KLQotICBwcmludGYgKCIlNS41cyAlMTAuMTBzICU4LjhzICU4LjhzICU4LjhzICU4LjhzICAlLTguOHNcbiIsCi0JICAiJSAgIiwgXygiY3VtdWxhdGl2ZSIpLCBfKCJzZWxmICAiKSwgIiIsIF8oInNlbGYgICIpLCBfKCJ0b3RhbCAiKSwgIiIpOwotICBwcmludGYgKCIlNS41cyAlOS45cyAgJTguOHMgJTguOHMgJTguOHMgJTguOHMgICUtOC44c1xuIiwKLQkgIF8oInRpbWUiKSwgaGlzdF9kaW1lbnNpb24sIGhpc3RfZGltZW5zaW9uLCBfKCJjYWxscyIpLCB1bml0LCB1bml0LAotCSAgXygibmFtZSIpKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHByaW50X2xpbmUsIChzeW0sIHNjYWxlKSwgU3ltICogc3ltIEFORCBkb3VibGUgc2NhbGUpCi17Ci0gIGlmIChpZ25vcmVfemVyb3MgJiYgc3ltLT5uY2FsbHMgPT0gMCAmJiBzeW0tPmhpc3QudGltZSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYWNjdW1fdGltZSArPSBzeW0tPmhpc3QudGltZTsKLSAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgcHJpbnRmICgiJTUuMWYgJTEwLjJmICU4LjJmIiwKLQkgICAgICB0b3RhbF90aW1lID4gMC4wID8gMTAwICogc3ltLT5oaXN0LnRpbWUgLyB0b3RhbF90aW1lIDogMC4wLAotCSAgICAgIGFjY3VtX3RpbWUgLyBoeiwgc3ltLT5oaXN0LnRpbWUgLyBoeik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiJTYuMmYgJTkuMmYgJTguMmYiLAotCSAgICAgIHRvdGFsX3RpbWUgPiAwLjAgPyAxMDAgKiBzeW0tPmhpc3QudGltZSAvIHRvdGFsX3RpbWUgOiAwLjAsCi0JICAgICAgYWNjdW1fdGltZSAvIGh6LCBzeW0tPmhpc3QudGltZSAvIGh6KTsKLSAgICB9Ci0gIGlmIChzeW0tPm5jYWxscyAhPSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAlOGx1ICU4LjJmICU4LjJmICAiLAotCSAgICAgIHN5bS0+bmNhbGxzLCBzY2FsZSAqIHN5bS0+aGlzdC50aW1lIC8gaHogLyBzeW0tPm5jYWxscywKLQkgIHNjYWxlICogKHN5bS0+aGlzdC50aW1lICsgc3ltLT5jZy5jaGlsZF90aW1lKSAvIGh6IC8gc3ltLT5uY2FsbHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAlOC44cyAlOC44cyAlOC44cyAgIiwgIiIsICIiLCAiIik7Ci0gICAgfQotICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBwcmludF9uYW1lIChzeW0pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50X25hbWVfb25seSAoc3ltKTsKLSAgICB9Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci0KLQotLyoKLSAqIENvbXBhcmUgTFAgYW5kIFJQLiAgVGhlIHByaW1hcnkgY29tcGFyaXNvbiBrZXkgaXMgZXhlY3V0aW9uIHRpbWUsCi0gKiB0aGUgc2Vjb25kYXJ5IGlzIG51bWJlciBvZiBpbnZvY2F0aW9uLCBhbmQgdGhlIHRlcnRpYXJ5IGlzIHRoZQotICogbGV4aWNvZ3JhcGhpYyBvcmRlciBvZiB0aGUgZnVuY3Rpb24gbmFtZXMuCi0gKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfdGltZSwgKGxwLCBycCksIGNvbnN0IFBUUiBscCBBTkQgY29uc3QgUFRSIHJwKQotewotICBjb25zdCBTeW0gKmxlZnQgPSAqKGNvbnN0IFN5bSAqKikgbHA7Ci0gIGNvbnN0IFN5bSAqcmlnaHQgPSAqKGNvbnN0IFN5bSAqKikgcnA7Ci0gIGRvdWJsZSB0aW1lX2RpZmY7Ci0KLSAgdGltZV9kaWZmID0gcmlnaHQtPmhpc3QudGltZSAtIGxlZnQtPmhpc3QudGltZTsKLSAgaWYgKHRpbWVfZGlmZiA+IDAuMCkKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmICh0aW1lX2RpZmYgPCAwLjApCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAocmlnaHQtPm5jYWxscyA+IGxlZnQtPm5jYWxscykKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChyaWdodC0+bmNhbGxzIDwgbGVmdC0+bmNhbGxzKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHN0cmNtcCAobGVmdC0+bmFtZSwgcmlnaHQtPm5hbWUpOwotfQotCi0KLS8qCi0gKiBQcmludCB0aGUgZmxhdCBoaXN0b2dyYW0gcHJvZmlsZS4KLSAqLwotdm9pZAotREVGVU5fVk9JRCAoaGlzdF9wcmludCkKLXsKLSAgU3ltICoqdGltZV9zb3J0ZWRfc3ltcywgKnRvcF9kb2csICpzeW07Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgaW50IGxvZ19zY2FsZTsKLSAgZG91YmxlIHRvcF90aW1lLCB0aW1lOwotICBiZmRfdm1hIGFkZHI7Ci0KLSAgaWYgKGZpcnN0X291dHB1dCkKLSAgICB7Ci0gICAgICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCJcZlxuIik7Ci0gICAgfQotCi0gIGFjY3VtX3RpbWUgPSAwLjA7Ci0gIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGlmIChwcmludF9kZXNjcmlwdGlvbnMpCi0JewotCSAgcHJpbnRmIChfKCJcblxuXG5mbGF0IHByb2ZpbGU6XG4iKSk7Ci0JICBmbGF0X2JsdXJiIChzdGRvdXQpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIkZsYXQgcHJvZmlsZTpcbiIpKTsKLSAgICB9Ci0gIC8qCi0gICAqIFNvcnQgdGhlIHN5bWJvbCB0YWJsZSBieSB0aW1lIChjYWxsLWNvdW50IGFuZCBuYW1lIGFzIHNlY29uZGFyeQotICAgKiBhbmQgdGVydGlhcnkga2V5cyk6Ci0gICAqLwotICB0aW1lX3NvcnRlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltICopKTsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgKytpbmRleCkKLSAgICB7Ci0gICAgICB0aW1lX3NvcnRlZF9zeW1zW2luZGV4XSA9ICZzeW10YWIuYmFzZVtpbmRleF07Ci0gICAgfQotICBxc29ydCAodGltZV9zb3J0ZWRfc3ltcywgc3ltdGFiLmxlbiwgc2l6ZW9mIChTeW0gKiksIGNtcF90aW1lKTsKLQotICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBsb2dfc2NhbGUgPSA1OwkJLyogbWlsbGktc2Vjb25kcyBpcyBCU0QtZGVmYXVsdCAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBTZWFyY2ggZm9yIHN5bWJvbCB3aXRoIGhpZ2hlc3QgcGVyLWNhbGwgZXhlY3V0aW9uIHRpbWUgYW5kCi0gICAgICAgKiBzY2FsZSBhY2NvcmRpbmdseToKLSAgICAgICAqLwotICAgICAgbG9nX3NjYWxlID0gMDsKLSAgICAgIHRvcF9kb2cgPSAwOwotICAgICAgdG9wX3RpbWUgPSAwLjA7Ci0gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyArK2luZGV4KQotCXsKLQkgIHN5bSA9IHRpbWVfc29ydGVkX3N5bXNbaW5kZXhdOwotCSAgaWYgKHN5bS0+bmNhbGxzICE9IDApCi0JICAgIHsKLQkgICAgICB0aW1lID0gKHN5bS0+aGlzdC50aW1lICsgc3ltLT5jZy5jaGlsZF90aW1lKSAvIHN5bS0+bmNhbGxzOwotCSAgICAgIGlmICh0aW1lID4gdG9wX3RpbWUpCi0JCXsKLQkJICB0b3BfZG9nID0gc3ltOwotCQkgIHRvcF90aW1lID0gdGltZTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgaWYgKHRvcF9kb2cgJiYgdG9wX2RvZy0+bmNhbGxzICE9IDAgJiYgdG9wX3RpbWUgPiAwLjApCi0JewotCSAgdG9wX3RpbWUgLz0gaHo7Ci0JICB3aGlsZSAoU0l0YWJbbG9nX3NjYWxlXS5zY2FsZSAqIHRvcF90aW1lIDwgMTAwMC4wCi0JCSAmJiAoKHNpemVfdCkgbG9nX3NjYWxlCi0JCSAgICAgPCBzaXplb2YgKFNJdGFiKSAvIHNpemVvZiAoU0l0YWJbMF0pIC0gMSkpCi0JICAgIHsKLQkgICAgICArK2xvZ19zY2FsZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICogRm9yIG5vdywgdGhlIGRpbWVuc2lvbiBpcyBhbHdheXMgc2Vjb25kcy4gIEluIHRoZSBmdXR1cmUsIHdlCi0gICAqIG1heSBhbHNvIHdhbnQgdG8gc3VwcG9ydCBvdGhlciAocHNldWRvLSlkaW1lbnNpb25zIChzdWNoIGFzCi0gICAqIEktY2FjaGUgbWlzc2VzIGV0Yy4pLgotICAgKi8KLSAgcHJpbnRfaGVhZGVyIChTSXRhYltsb2dfc2NhbGVdLnByZWZpeCk7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47ICsraW5kZXgpCi0gICAgewotICAgICAgYWRkciA9IHRpbWVfc29ydGVkX3N5bXNbaW5kZXhdLT5hZGRyOwotICAgICAgLyoKLSAgICAgICAqIFByaW50IHN5bWJvbCBpZiBpdHMgaW4gSU5DTF9GTEFUIHRhYmxlIG9yIHRoYXQgdGFibGUKLSAgICAgICAqIGlzIGVtcHR5IGFuZCB0aGUgc3ltYm9sIGlzIG5vdCBpbiBFWENMX0ZMQVQuCi0gICAgICAgKi8KLSAgICAgIGlmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0ZMQVRdLCBhZGRyKQotCSAgfHwgKHN5bXNbSU5DTF9GTEFUXS5sZW4gPT0gMAotCSAgICAgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0ZMQVRdLCBhZGRyKSkpCi0JewotCSAgcHJpbnRfbGluZSAodGltZV9zb3J0ZWRfc3ltc1tpbmRleF0sIFNJdGFiW2xvZ19zY2FsZV0uc2NhbGUpOwotCX0KLSAgICB9Ci0gIGZyZWUgKHRpbWVfc29ydGVkX3N5bXMpOwotCi0gIGlmIChwcmludF9kZXNjcmlwdGlvbnMgJiYgIWJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgZmxhdF9ibHVyYiAoc3Rkb3V0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9oaXN0LmggYi9ncHJvZi9oaXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNjJlZjcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvaGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI2lmbmRlZiBoaXN0X2gKLSNkZWZpbmUgaGlzdF9oCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotZXh0ZXJuIGJmZF92bWEgc19sb3dwYzsJCS8qIGxvd3BjIGZyb20gdGhlIHByb2ZpbGUgZmlsZSAqLwotZXh0ZXJuIGJmZF92bWEgc19oaWdocGM7CS8qIGhpZ2hwYyBmcm9tIHRoZSBwcm9maWxlIGZpbGUgKi8KLWV4dGVybiBiZmRfdm1hIGxvd3BjLCBoaWdocGM7CS8qIHJhbmdlIHByb2ZpbGVkLCBpbiBVTklUJ3MgKi8KLWV4dGVybiBpbnQgaGlzdF9udW1fYmluczsJLyogbnVtYmVyIG9mIGhpc3RvZ3JhbSBiaW5zICovCi1leHRlcm4gaW50ICpoaXN0X3NhbXBsZTsJLyogY29kZSBoaXN0b2dyYW0gKi8KLS8qCi0gKiBTY2FsZSBmYWN0b3IgY29udmVydGluZyBzYW1wbGVzIHRvIHBjIHZhbHVlczogZWFjaCBzYW1wbGUgY292ZXJzCi0gKiBISVNUX1NDQUxFIGJ5dGVzOgotICovCi1leHRlcm4gZG91YmxlIGhpc3Rfc2NhbGU7Ci0KLQotZXh0ZXJuIHZvaWQgaGlzdF9yZWFkX3JlYyBQQVJBTVMgKChGSUxFICogaWZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIHZvaWQgaGlzdF93cml0ZV9oaXN0IFBBUkFNUyAoKEZJTEUgKiBvZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci1leHRlcm4gdm9pZCBoaXN0X2Fzc2lnbl9zYW1wbGVzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGhpc3RfcHJpbnQgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogaGlzdF9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9pMzg2LmMgYi9ncHJvZi9pMzg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYmYyZGMuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLQotaW50Ci1ERUZVTiAoaTM4Nl9pc2NhbGwsIChpcCksIHVuc2lnbmVkIGNoYXIgKmlwKQotewotICBpZiAoKmlwID09IDB4ZTgpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0KLXZvaWQKLWkzODZfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKQotICAgICBTeW0gKnBhcmVudDsKLSAgICAgYmZkX3ZtYSBwX2xvd3BjOwotICAgICBiZmRfdm1hIHBfaGlnaHBjOwotewotICB1bnNpZ25lZCBjaGFyICppbnN0cnVjdHA7Ci0gIFN5bSAqY2hpbGQ7Ci0gIGJmZF92bWEgZGVzdHBjLCBkZWx0YTsKLQotICBpZiAoY29yZV90ZXh0X3NwYWNlID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdICVzOiAweCVseCB0byAweCVseFxuIiwKLQkJCSAgcGFyZW50LT5uYW1lLCAodW5zaWduZWQgbG9uZykgcF9sb3dwYywKLQkJCSAgKHVuc2lnbmVkIGxvbmcpIHBfaGlnaHBjKSk7Ci0KLSAgZGVsdGEgPSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlIC0gY29yZV90ZXh0X3NlY3QtPnZtYTsKLQotICBmb3IgKGluc3RydWN0cCA9ICh1bnNpZ25lZCBjaGFyICopIChwX2xvd3BjICsgZGVsdGEpOwotICAgICAgIGluc3RydWN0cCA8ICh1bnNpZ25lZCBjaGFyICopIChwX2hpZ2hwYyArIGRlbHRhKTsKLSAgICAgICBpbnN0cnVjdHAgKyspCi0gICAgewotICAgICAgaWYgKGkzODZfaXNjYWxsIChpbnN0cnVjdHApKQotCXsKLQkgIERCRyAoQ0FMTERFQlVHLAotCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHQweCV4OmNhbGwiLAotCQkgICAgICAgaW5zdHJ1Y3RwIC0gKHVuc2lnbmVkIGNoYXIgKikgZGVsdGEpKTsKLQkgIC8qCi0JICAgKiAgcmVndWxhciBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nCi0JICAgKiAgICBjaGVjayB0aGF0IHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgCi0JICAgKiAgICBhIGZ1bmN0aW9uLgotCSAgICovCi0KLQkgIGRlc3RwYyA9ICgoYmZkX3ZtYSkgYmZkX2dldF8zMiAoY29yZV9iZmQsIGluc3RydWN0cCArIDEpCi0JCSAgICArIChiZmRfdm1hKSBpbnN0cnVjdHAgLSAoYmZkX3ZtYSkgZGVsdGEgKyA1KTsKLQkgIGlmIChkZXN0cGMgPj0gc19sb3dwYyAmJiBkZXN0cGMgPD0gc19oaWdocGMpCi0JICAgIHsKLQkgICAgICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RwYyk7Ci0JICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5hZGRyID09IGRlc3RwYykKLQkJewotCQkgIC8qCi0JCSAgICogICAgICBhIGhpdAotCQkgICAqLwotCQkgIERCRyAoQ0FMTERFQlVHLAotCQkgICAgICAgcHJpbnRmICgiXHRkZXN0cGMgMHglbHggKCVzKVxuIiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZykgZGVzdHBjLCBjaGlsZC0+bmFtZSkpOwotCQkgIGFyY19hZGQgKHBhcmVudCwgY2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkJICBpbnN0cnVjdHAgKz0gNDsJLyogY2FsbCBpcyBhIDUgYnl0ZSBpbnN0cnVjdGlvbiAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQkgIC8qCi0JICAgKiAgZWxzZToKLQkgICAqICAgIGl0IGxvb2tlZCBsaWtlIGEgY2FsbGYsIGJ1dCBpdDoKLQkgICAqICAgICAgYSkgd2Fzbid0IGFjdHVhbGx5IGEgY2FsbGYsIG9yCi0JICAgKiAgICAgIGIpIGRpZG4ndCBwb2ludCB0byBhIGtub3duIGZ1bmN0aW9uIGluIHRoZSBzeW10YWIsIG9yCi0JICAgKiAgICAgIGMpIHNvbWV0aGluZyBmdW5ueSBpcyBnb2luZyBvbi4KLQkgICAqLwotCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlx0YnV0IGl0J3MgYSBib3RjaFxuIikpOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9wby9NYWtlLWluIGIvZ3Byb2YvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9ncHJvZi9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dwcm9mL3BvL1BPVEZJTEVTLmluIGIvZ3Byb2YvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZTgxMTYuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1hbHBoYS5jCi1iYXNpY19ibG9ja3MuYwotYmFzaWNfYmxvY2tzLmgKLWNhbGxfZ3JhcGguYwotY2FsbF9ncmFwaC5oCi1jZ19hcmNzLmMKLWNnX2FyY3MuaAotY2dfZGZuLmMKLWNnX2Rmbi5oCi1jZ19wcmludC5jCi1jZ19wcmludC5oCi1jb3JlZmlsZS5jCi1jb3JlZmlsZS5oCi1nbW9uLmgKLWdtb25faW8uYwotZ21vbl9pby5oCi1nbW9uX291dC5oCi1ncHJvZi5jCi1ncHJvZi5oCi1oZXJ0ei5jCi1oZXJ0ei5oCi1oaXN0LmMKLWhpc3QuaAotaTM4Ni5jCi1zZWFyY2hfbGlzdC5jCi1zZWFyY2hfbGlzdC5oCi1zb3VyY2UuYwotc291cmNlLmgKLXNwYXJjLmMKLXN5bV9pZHMuYwotc3ltX2lkcy5oCi1zeW10YWIuYwotc3ltdGFiLmgKLXRhaG9lLmMKLXV0aWxzLmMKLXV0aWxzLmgKLXZheC5jCmRpZmYgLS1naXQgYS9ncHJvZi9wby9ncHJvZi5wb3QgYi9ncHJvZi9wby9ncHJvZi5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxY2YwZWUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvcG8vZ3Byb2YucG90CisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk5LTA3LTAxIDAxOjM2LTA0MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhbHBoYS5jOjg5Ci1tc2dpZCAiPGluZGlyZWN0IGNoaWxkPiIKLW1zZ3N0ciAiIgotCi0jOiBhbHBoYS5jOjEwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJbZmluZF9jYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBhbHBoYS5jOjEyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJbZmluZF9jYWxsXSAweCVseDoganNyJXMgPGluZGlyZWN0X2NoaWxkPlxuIgotbXNnc3RyICIiCi0KLSM6IGFscGhhLmM6MTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIltmaW5kX2NhbGxdIDB4JWx4OiBic3IiCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6MTM0IGNhbGxfZ3JhcGguYzo3MCBoaXN0LmM6MTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjIxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogaWdub3JpbmcgYmFzaWMtYmxvY2sgZXhlYyBjb3VudHMgKHVzZSAtbCBvciAtLWxpbmUpXG4iCi1tc2dzdHIgIiIKLQotIy4gRklYTUU6IFRoaXMgb25seSB3b3JrcyBpZiBiZmRfdm1hIGlzIHVuc2lnbmVkIGxvbmcuCi0jOiBiYXNpY19ibG9ja3MuYzozMjQgYmFzaWNfYmxvY2tzLmM6MzMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiAoJXM6MHglbHgpICVsdSBleGVjdXRpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6MzI1IGJhc2ljX2Jsb2Nrcy5jOjMzNAotbXNnaWQgIjx1bmtub3duPiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo1OTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlRvcCAlZCBMaW5lczpcbiIKLSJcbiIKLSIgICAgIExpbmUgICAgICBDb3VudFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjYyMAotbXNnaWQgIiIKLSJcbiIKLSJFeGVjdXRpb24gU3VtbWFyeTpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTlsZCAgIEV4ZWN1dGFibGUgbGluZXMgaW4gdGhpcyBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6NjIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU5bGQgICBMaW5lcyBleGVjdXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjYyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlOS4yZiAgIFBlcmNlbnQgb2YgdGhlIGZpbGUgZXhlY3V0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiU5bHUgICBUb3RhbCBudW1iZXIgb2YgbGluZSBleGVjdXRpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6NjMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU5LjJmICAgQXZlcmFnZSBleGVjdXRpb25zIHBlciBsaW5lXG4iCi1tc2dzdHIgIiIKLQotIzogY2FsbF9ncmFwaC5jOjQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIltjZ190YWxseV0gYXJjIGZyb20gJXMgdG8gJXMgdHJhdmVyc2VkICVsdSB0aW1lc1xuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6MzkKLW1zZ2lkICIiCi0iXHRcdCAgICAgQ2FsbCBncmFwaCAoZXhwbGFuYXRpb24gZm9sbG93cylcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjQzCi1tc2dpZCAiIgotIlx0XHRcdENhbGwgZ3JhcGhcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjQ2IGhpc3QuYzozODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotImdyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzICVsZCBieXRlKHMpIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NTAKLW1zZ2lkICIiCi0iIGZvciAlLjJmJSUgb2YgJS4yZiBzZWNvbmRzXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo1NQotbXNnaWQgIiIKLSIgbm8gdGltZSBwcm9wYWdhdGVkXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NCBjZ19wcmludC5jOjY3IGNnX3ByaW50LmM6NjkKLW1zZ2lkICJjYWxsZWQiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NCBjZ19wcmludC5jOjY5Ci1tc2dpZCAidG90YWwiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NAotbXNnaWQgInBhcmVudHMiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NiBjZ19wcmludC5jOjY3Ci1tc2dpZCAiaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NgotbXNnaWQgIiV0aW1lIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjYgY2dfcHJpbnQuYzo2NwotbXNnaWQgInNlbGYiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NgotbXNnaWQgImRlc2NlbmRlbnRzIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjcgaGlzdC5jOjQwOQotbXNnaWQgIm5hbWUiCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2OQotbXNnaWQgImNoaWxkcmVuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NzQKLW1zZ2lkICJpbmRleCAlJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuICAgIGNhbGxlZCAgICAgbmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6MTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiA8Y3ljbGUgJWQgYXMgYSB3aG9sZT4gWyVkXVxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6MzUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU2LjZzICU1LjVzICU3LjdzICUxMS4xMXMgJTcuN3MgJTcuN3MgICAgIDxzcG9udGFuZW91cz5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjM1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlNi42cyAlNS41cyAlNy43cyAlNy43cyAlNy43cyAlNy43cyAgICAgPHNwb250YW5lb3VzPlxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NTg3Ci1tc2dpZCAiIgotIkluZGV4IGJ5IGZ1bmN0aW9uIG5hbWVcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY0NCBjZ19wcmludC5jOjY1MwotIywgYy1mb3JtYXQKLW1zZ2lkICI8Y3ljbGUgJWQ+IgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6MzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvdWxkIG5vdCBvcGVuICVzLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6NTMgY29yZWZpbGUuYzo4NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5hYmxlIHRvIHBhcnNlIG1hcHBpbmcgZmlsZSAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjEyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IG5vdCBpbiBhLm91dCBmb3JtYXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjEzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3QgZmluZCAudGV4dCBzZWN0aW9uIGluICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzoxOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJhbiBvdXQgcm9vbSBmb3IgJWx1IGJ5dGVzIG9mIHRleHQgc3BhY2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjIxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3QgZG8gLWNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjI0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogLWMgbm90IHN1cHBvcnRlZCBvbiBhcmNoaXRlY3R1cmUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjQzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZmlsZSBgJXMnIGhhcyBubyBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzo3NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNvbWVib2R5IG1pc2NvdW50ZWQ6IGx0YWIubGVuPSVkIGluc3RlYWQgb2YgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjMzIGdtb25faW8uYzo1NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmZkX3ZtYSBoYXMgdW5leHBlY3RlZCBzaXplIG9mICVsZCBieXRlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzo4NyBnbW9uX2lvLmM6MTgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmaWxlIHRvbyBzaG9ydCB0byBiZSBhIGdtb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzo5NyBnbW9uX2lvLmM6MjE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmaWxlIGAlcycgaGFzIGJhZCBtYWdpYyBjb29raWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6MTA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmaWxlIGAlcycgaGFzIHVuc3VwcG9ydGVkIHZlcnNpb24gJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6MTM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogZm91bmQgYmFkIHRhZyAlZCAoZmlsZSBjb3JydXB0ZWQ/KVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoyMDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHByb2ZpbGluZyByYXRlIGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoyMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoyNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuZXhwZWN0ZWQgRU9GIGFmdGVyIHJlYWRpbmcgJWQvJWQgYmluc1xuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzozMDYKLW1zZ2lkICJ0aW1lIGlzIGluIHRpY2tzLCBub3Qgc2Vjb25kc1xuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzozMTIgZ21vbl9pby5jOjQ1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZG9uJ3Qga25vdyBob3cgdG8gZGVhbCB3aXRoIGZpbGUgZm9ybWF0ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjMxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJGaWxlIGAlcycgKHZlcnNpb24gJWQpIGNvbnRhaW5zOlxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzozMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHQlZCBoaXN0b2dyYW0gcmVjb3JkJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6MzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlx0JWQgY2FsbC1ncmFwaCByZWNvcmQlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzozMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHQlZCBiYXNpYy1ibG9jayBjb3VudCByZWNvcmQlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6NTkKLW1zZ2lkICIiCi0iQCgjKSBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuIgotIiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6MTQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1bYWJjRGhpbExzVHZ3eHl6XV0gWy1bQUNlRWZGSm5OT3BQcVFaXVtuYW1lXV0gWy1JIGRpcnNdXG4iCi0iXHRbLWRbbnVtXV0gWy1rIGZyb20vdG9dIFstbSBtaW4tY291bnRdIFstdCB0YWJsZS1sZW5ndGhdXG4iCi0iXHRbLS1bbm8tXWFubm90YXRlZC1zb3VyY2VbPW5hbWVdXSBbLS1bbm8tXWV4ZWMtY291bnRzWz1uYW1lXV1cbiIKLSJcdFstLVtuby1dZmxhdC1wcm9maWxlWz1uYW1lXV0gWy0tW25vLV1ncmFwaFs9bmFtZV1dXG4iCi0iXHRbLS1bbm8tXXRpbWU9bmFtZV0gWy0tYWxsLWxpbmVzXSBbLS1icmllZl0gWy0tZGVidWdbPWxldmVsXV1cbiIKLSJcdFstLWZ1bmN0aW9uLW9yZGVyaW5nXSBbLS1maWxlLW9yZGVyaW5nXVxuIgotIlx0Wy0tZGlyZWN0b3J5LXBhdGg9ZGlyc10gWy0tZGlzcGxheS11bnVzZWQtZnVuY3Rpb25zXVxuIgotIlx0Wy0tZmlsZS1mb3JtYXQ9bmFtZV0gWy0tZmlsZS1pbmZvXSBbLS1oZWxwXSBbLS1saW5lXSBbLS1taW4tY291bnQ9bl1cbiIKLSJcdFstLW5vLXN0YXRpY10gWy0tcHJpbnQtcGF0aF0gWy0tc2VwYXJhdGUtZmlsZXNdXG4iCi0iXHRbLS1zdGF0aWMtY2FsbC1ncmFwaF0gWy0tc3VtXSBbLS10YWJsZS1sZW5ndGg9bGVuXSBbLS10cmFkaXRpb25hbF1cbiIKLSJcdFstLXZlcnNpb25dIFstLXdpZHRoPW5dIFstLWlnbm9yZS1ub24tZnVuY3Rpb25zXVxuIgotIlx0Wy0tZGVtYW5nbGVdIFstLW5vLWRlbWFuZ2xlXVxuIgotIlx0W2ltYWdlLWZpbGVdIFtwcm9maWxlLWZpbGUuLi5dXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzoxNjAKLW1zZ2lkICJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjIyOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZGVidWdnaW5nIG5vdCBzdXBwb3J0ZWQ7IC1kIGlnbm9yZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjMwOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5rbm93biBmaWxlIGZvcm1hdCAlc1xuIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4KLSM6IGdwcm9mLmM6MzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkdOVSBncHJvZiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6Mzk0Ci1tc2dpZCAiIgotIkJhc2VkIG9uIEJTRCBncHJvZiwgY29weXJpZ2h0IDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6Mzk1Ci1tc2dpZCAiIgotIlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6NDQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogT25seSBvbmUgb2YgLS1mdW5jdGlvbi1vcmRlcmluZyBhbmQgLS1maWxlLW9yZGVyaW5nIG1heSBiZSBzcGVjaWZpZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo1NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNvcnJ5LCBmaWxlIGZvcm1hdCBgcHJvZicgaXMgbm90IHlldCBzdXBwb3J0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjYwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZ21vbi5vdXQgZmlsZSBpcyBtaXNzaW5nIGhpc3RvZ3JhbVxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6NjA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBnbW9uLm91dCBmaWxlIGlzIG1pc3NpbmcgY2FsbC1ncmFwaCBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjE0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYCVzJyBpcyBpbmNvbXBhdGlibGUgd2l0aCBmaXJzdCBnbW9uIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6MTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogdW5leHBlY3RlZCBFT0YgYWZ0ZXIgcmVhZGluZyAlZCBvZiAlZCBzYW1wbGVzXG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjM4MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlYyVjL2NhbGwiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjM4OQotbXNnaWQgIiIKLSIgZm9yICUuMmYlJSBvZiAlLjJmICVzXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjM5NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRWFjaCBzYW1wbGUgY291bnRzIGFzICVnICVzLlxuIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo0MDAKLW1zZ2lkICIiCi0iIG5vIHRpbWUgYWNjdW11bGF0ZWRcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6NDA2Ci1tc2dpZCAiY3VtdWxhdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6NDA2Ci1tc2dpZCAic2VsZiAgIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo0MDYKLW1zZ2lkICJ0b3RhbCAiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjQwOAotbXNnaWQgInRpbWUiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjQwOAotbXNnaWQgImNhbGxzIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo1MTcKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iXG4iCi0iZmxhdCBwcm9maWxlOlxuIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo1MjMKLW1zZ2lkICJGbGF0IHByb2ZpbGU6XG4iCi1tc2dzdHIgIiIKLQotIzogc291cmNlLmM6MTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb3VsZCBub3QgbG9jYXRlIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBzb3VyY2UuYzoyMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiKioqIEZpbGUgJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogdXRpbHMuYzo5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIgPGN5Y2xlICVkPiIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvZ3Byb2Yvc2VhcmNoX2xpc3QuYyBiL2dwcm9mL3NlYXJjaF9saXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzVkYmYuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc2VhcmNoX2xpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgInNlYXJjaF9saXN0LmgiCi0KLQotdm9pZAotREVGVU4gKHNlYXJjaF9saXN0X2FwcGVuZCwgKGxpc3QsIHBhdGhzKSwKLSAgICAgICBTZWFyY2hfTGlzdCAqIGxpc3QgQU5EIGNvbnN0IGNoYXIgKnBhdGhzKQotewotICBTZWFyY2hfTGlzdF9FbGVtICpuZXdfZWw7Ci0gIGNvbnN0IGNoYXIgKmJlZywgKmNvbG9uOwotICBpbnQgbGVuOwotCi0gIGNvbG9uID0gcGF0aHMgLSAxOwotICBkbwotICAgIHsKLSAgICAgIGJlZyA9IGNvbG9uICsgMTsKLSAgICAgIGNvbG9uID0gc3RyY2hyIChiZWcsICc6Jyk7Ci0gICAgICBpZiAoY29sb24pCi0JewotCSAgbGVuID0gY29sb24gLSBiZWc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxlbiA9IHN0cmxlbiAoYmVnKTsKLQl9Ci0gICAgICBuZXdfZWwgPSAoU2VhcmNoX0xpc3RfRWxlbSAqKSB4bWFsbG9jIChzaXplb2YgKCpuZXdfZWwpICsgbGVuKTsKLSAgICAgIG1lbWNweSAobmV3X2VsLT5wYXRoLCBiZWcsIGxlbik7Ci0gICAgICBuZXdfZWwtPnBhdGhbbGVuXSA9ICdcMCc7Ci0KLSAgICAgIC8qIGFwcGVuZCBuZXcgcGF0aCBhdCBlbmQgb2YgbGlzdDogKi8KLSAgICAgIG5ld19lbC0+bmV4dCA9IDA7Ci0gICAgICBpZiAobGlzdC0+dGFpbCkKLQl7Ci0JICBsaXN0LT50YWlsLT5uZXh0ID0gbmV3X2VsOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsaXN0LT5oZWFkID0gbmV3X2VsOwotCX0KLSAgICAgIGxpc3QtPnRhaWwgPSBuZXdfZWw7Ci0gICAgfQotICB3aGlsZSAoY29sb24pOwotfQpkaWZmIC0tZ2l0IGEvZ3Byb2Yvc2VhcmNoX2xpc3QuaCBiL2dwcm9mL3NlYXJjaF9saXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZGZlMzUuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc2VhcmNoX2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNpZm5kZWYgc2VhcmNoX2xpc3RfaAotI2RlZmluZSBzZWFyY2hfbGlzdF9oCi0KLXR5cGVkZWYgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0KLSAgewotICAgIHN0cnVjdCBzZWFyY2hfbGlzdF9lbGVtICpuZXh0OwotICAgIGNoYXIgcGF0aFsxXTsKLSAgfQotU2VhcmNoX0xpc3RfRWxlbTsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBzZWFyY2hfbGlzdF9lbGVtICpoZWFkOwotICAgIHN0cnVjdCBzZWFyY2hfbGlzdF9lbGVtICp0YWlsOwotICB9Ci1TZWFyY2hfTGlzdDsKLQotZXh0ZXJuIHZvaWQgc2VhcmNoX2xpc3RfYXBwZW5kIFBBUkFNUyAoKFNlYXJjaF9MaXN0ICogbGlzdCwgY29uc3QgY2hhciAqcGF0aHMpKTsKLQotI2VuZGlmIC8qIHNlYXJjaF9saXN0X2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL3NvdXJjZS5jIGIvZ3Byb2Yvc291cmNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDFhMDQuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc291cmNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoKLSAqIEtlZXBzIHRyYWNrIG9mIHNvdXJjZSBmaWxlcy4KLSAqLwotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic2VhcmNoX2xpc3QuaCIKLSNpbmNsdWRlICJzb3VyY2UuaCIKLQotI2RlZmluZSBFWFRfQU5OTyAiLWFubiIJCS8qIHBvc3RmaXggb2YgYW5ub3RhdGVkIGZpbGVzICovCi0KLS8qCi0gKiBEZWZhdWx0IG9wdGlvbiB2YWx1ZXM6Ci0gKi8KLWJvb2wgY3JlYXRlX2Fubm90YXRpb25fZmlsZXMgPSBGQUxTRTsKLQotU2VhcmNoX0xpc3Qgc3JjX3NlYXJjaF9saXN0ID0KLXswLCAwfTsKLVNvdXJjZV9GaWxlICpmaXJzdF9zcmNfZmlsZSA9IDA7Ci0KLQotU291cmNlX0ZpbGUgKgotREVGVU4gKHNvdXJjZV9maWxlX2xvb2t1cF9wYXRoLCAocGF0aCksIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gIFNvdXJjZV9GaWxlICpzZjsKLQotICBmb3IgKHNmID0gZmlyc3Rfc3JjX2ZpbGU7IHNmOyBzZiA9IHNmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHBhdGgsIHNmLT5uYW1lKSA9PSAwKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGlmICghc2YpCi0gICAgewotICAgICAgLyogY3JlYXRlIGEgbmV3IHNvdXJjZSBmaWxlIGRlc2NyaXB0b3I6ICovCi0KLSAgICAgIHNmID0gKFNvdXJjZV9GaWxlICopIHhtYWxsb2MgKHNpemVvZiAoKnNmKSk7Ci0gICAgICBtZW1zZXQgKHNmLCAwLCBzaXplb2YgKCpzZikpOwotICAgICAgc2YtPm5hbWUgPSB4c3RyZHVwIChwYXRoKTsKLSAgICAgIHNmLT5uZXh0ID0gZmlyc3Rfc3JjX2ZpbGU7Ci0gICAgICBmaXJzdF9zcmNfZmlsZSA9IHNmOwotICAgIH0KLSAgcmV0dXJuIHNmOwotfQotCi0KLVNvdXJjZV9GaWxlICoKLURFRlVOIChzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSwgKGZpbGVuYW1lKSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIGNvbnN0IGNoYXIgKmZuYW1lOwotICBTb3VyY2VfRmlsZSAqc2Y7Ci0gIC8qCi0gICAqIFRoZSB1c2VyIGNhbm5vdCBrbm93IGV4YWN0bHkgaG93IGEgZmlsZW5hbWUgd2lsbCBiZSBzdG9yZWQgaW4KLSAgICogdGhlIGRlYnVnZ2luZyBpbmZvIChlLmcuLCAuLi9pbmNsdWRlL2Zvby5oCi0gICAqIHZzLiAvdXNyL2luY2x1ZGUvZm9vLmgpLiAgU28gd2Ugc2ltcGx5IGNvbXBhcmUgdGhlIGZpbGVuYW1lCi0gICAqIGNvbXBvbmVudCBvZiBhIHBhdGggb25seToKLSAgICovCi0gIGZvciAoc2YgPSBmaXJzdF9zcmNfZmlsZTsgc2Y7IHNmID0gc2YtPm5leHQpCi0gICAgewotICAgICAgZm5hbWUgPSBzdHJyY2hyIChzZi0+bmFtZSwgJy8nKTsKLSAgICAgIGlmIChmbmFtZSkKLQl7Ci0JICArK2ZuYW1lOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmbmFtZSA9IHNmLT5uYW1lOwotCX0KLSAgICAgIGlmIChzdHJjbXAgKGZpbGVuYW1lLCBmbmFtZSkgPT0gMCkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gc2Y7Ci19Ci0KLQotRklMRSAqCi1ERUZVTiAoYW5ub3RhdGVfc291cmNlLCAoc2YsIG1heF93aWR0aCwgYW5ub3RlLCBhcmcpLAotICAgICAgIFNvdXJjZV9GaWxlICogc2YgQU5EIGludCBtYXhfd2lkdGgKLSAgICAgICBBTkQgdm9pZCAoKmFubm90ZSkgUEFSQU1TICgoY2hhciAqYnVmLCBpbnQgdywgaW50IGwsIHZvaWQgKmFyZykpCi0gICAgICAgQU5EIHZvaWQgKmFyZykKLXsKLSAgc3RhdGljIGJvb2wgZmlyc3RfZmlsZSA9IFRSVUU7Ci0gIGludCBpLCBsaW5lX251bSwgbnJlYWQ7Ci0gIGJvb2wgbmV3X2xpbmU7Ci0gIGNoYXIgYnVmWzgxOTJdOwotICBjaGFyIGZuYW1lW1BBVEhfTUFYXTsKLSAgY2hhciAqYW5ub3RhdGlvbiwgKm5hbWVfb25seTsKLSAgRklMRSAqaWZwLCAqb2ZwOwotICBTZWFyY2hfTGlzdF9FbGVtICpzbGUgPSBzcmNfc2VhcmNoX2xpc3QuaGVhZDsKLQotICAvKgotICAgKiBPcGVuIGlucHV0IGZpbGUuICBJZiBvcGVuIGZhaWxzLCB3YWxrIGFsb25nIHNlYXJjaC1saXN0IHVudGlsCi0gICAqIG9wZW4gc3VjY2VlZHMgb3IgcmVhY2hpbmcgZW5kIG9mIGxpc3Q6Ci0gICAqLwotICBzdHJjcHkgKGZuYW1lLCBzZi0+bmFtZSk7Ci0gIGlmIChzZi0+bmFtZVswXSA9PSAnLycpCi0gICAgewotICAgICAgc2xlID0gMDsJCQkvKiBkb24ndCB1c2Ugc2VhcmNoIGxpc3QgZm9yIGFic29sdXRlIHBhdGhzICovCi0gICAgfQotICBuYW1lX29ubHkgPSAwOwotICB3aGlsZSAoVFJVRSkKLSAgICB7Ci0gICAgICBEQkcgKFNSQ0RFQlVHLCBwcmludGYgKCJbYW5ub3RhdGVfc291cmNlXTogbG9va2luZyBmb3IgJXMsIHRyeWluZyAlc1xuIiwKLQkJCSAgICAgc2YtPm5hbWUsIGZuYW1lKSk7Ci0gICAgICBpZnAgPSBmb3BlbiAoZm5hbWUsIEZPUEVOX1JCKTsKLSAgICAgIGlmIChpZnApCi0JewotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKCFzbGUgJiYgIW5hbWVfb25seSkKLQl7Ci0JICBuYW1lX29ubHkgPSBzdHJyY2hyIChzZi0+bmFtZSwgJy8nKTsKLQkgIGlmIChuYW1lX29ubHkpCi0JICAgIHsKLQkgICAgICAvKiB0cnkgc2VhcmNoLWxpc3QgYWdhaW4sIGJ1dCB0aGlzIHRpbWUgd2l0aCBuYW1lIG9ubHk6ICovCi0JICAgICAgKytuYW1lX29ubHk7Ci0JICAgICAgc2xlID0gc3JjX3NlYXJjaF9saXN0LmhlYWQ7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc2xlKQotCXsKLQkgIHN0cmNweSAoZm5hbWUsIHNsZS0+cGF0aCk7Ci0JICBzdHJjYXQgKGZuYW1lLCAiLyIpOwotCSAgaWYgKG5hbWVfb25seSkKLQkgICAgewotCSAgICAgIHN0cmNhdCAoZm5hbWUsIG5hbWVfb25seSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cmNhdCAoZm5hbWUsIHNmLT5uYW1lKTsKLQkgICAgfQotCSAgc2xlID0gc2xlLT5uZXh0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZXJybm8gPT0gRU5PRU5UKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY291bGQgbm90IGxvY2F0ZSBgJXMnXG4iKSwKLQkJICAgICAgIHdob2FtaSwgc2YtPm5hbWUpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKHNmLT5uYW1lKTsKLQkgICAgfQotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLQotICBvZnAgPSBzdGRvdXQ7Ci0gIGlmIChjcmVhdGVfYW5ub3RhdGlvbl9maWxlcykKLSAgICB7Ci0gICAgICAvKiB0cnkgdG8gY3JlYXRlIGFubm90YXRlZCBzb3VyY2UgZmlsZTogKi8KLSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCi0gICAgICAvKiBjcmVhdGUgYW5ub3RhdGlvbiBmaWxlcyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeTogKi8KLSAgICAgIGZpbGVuYW1lID0gc3RycmNociAoc2YtPm5hbWUsICcvJyk7Ci0gICAgICBpZiAoZmlsZW5hbWUpCi0JewotCSAgKytmaWxlbmFtZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZmlsZW5hbWUgPSBzZi0+bmFtZTsKLQl9Ci0KLSAgICAgIHN0cmNweSAoZm5hbWUsIGZpbGVuYW1lKTsKLSAgICAgIHN0cmNhdCAoZm5hbWUsIEVYVF9BTk5PKTsKLSAgICAgIG9mcCA9IGZvcGVuIChmbmFtZSwgInciKTsKLSAgICAgIGlmICghb2ZwKQotCXsKLQkgIHBlcnJvciAoZm5hbWUpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBQcmludCBmaWxlIG5hbWVzIGlmIG91dHB1dCBnb2VzIHRvIHN0ZG91dCBhbmQgdGhlcmUgYXJlCi0gICAqIG1vcmUgdGhhbiBvbmUgc291cmNlIGZpbGU6Ci0gICAqLwotICBpZiAob2ZwID09IHN0ZG91dCkKLSAgICB7Ci0gICAgICBpZiAoZmlyc3RfZmlsZSkKLQl7Ci0JICBmaXJzdF9maWxlID0gRkFMU0U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwdXRjICgnXG4nLCBvZnApOwotCX0KLSAgICAgIGlmIChmaXJzdF9vdXRwdXQpCi0JewotCSAgZmlyc3Rfb3V0cHV0ID0gRkFMU0U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKG9mcCwgIlxmXG4iKTsKLQl9Ci0gICAgICBmcHJpbnRmIChvZnAsIF8oIioqKiBGaWxlICVzOlxuIiksIHNmLT5uYW1lKTsKLSAgICB9Ci0KLSAgYW5ub3RhdGlvbiA9IHhtYWxsb2MgKG1heF93aWR0aCArIDEpOwotICBsaW5lX251bSA9IDE7Ci0gIG5ld19saW5lID0gVFJVRTsKLSAgd2hpbGUgKChucmVhZCA9IGZyZWFkIChidWYsIDEsIHNpemVvZiAoYnVmKSwgaWZwKSkgPiAwKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBucmVhZDsgKytpKQotCXsKLQkgIGlmIChuZXdfbGluZSkKLQkgICAgewotCSAgICAgICgqYW5ub3RlKSAoYW5ub3RhdGlvbiwgbWF4X3dpZHRoLCBsaW5lX251bSwgYXJnKTsKLQkgICAgICBmcHV0cyAoYW5ub3RhdGlvbiwgb2ZwKTsKLQkgICAgICArK2xpbmVfbnVtOwotCSAgICAgIG5ld19saW5lID0gRkFMU0U7Ci0JICAgIH0KLQkgIG5ld19saW5lID0gKGJ1ZltpXSA9PSAnXG4nKTsKLQkgIGZwdXRjIChidWZbaV0sIG9mcCk7Ci0JfQotICAgIH0KLSAgZnJlZSAoYW5ub3RhdGlvbik7Ci0gIHJldHVybiBvZnA7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zb3VyY2UuaCBiL2dwcm9mL3NvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzNiYWQzLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3NvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotI2lmbmRlZiBzb3VyY2VfaAotI2RlZmluZSBzb3VyY2VfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgInNlYXJjaF9saXN0LmgiCi0KLXR5cGVkZWYgc3RydWN0IHNvdXJjZV9maWxlCi0gIHsKLSAgICBzdHJ1Y3Qgc291cmNlX2ZpbGUgKm5leHQ7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsJCS8qIG5hbWUgb2Ygc291cmNlIGZpbGUgKi8KLSAgICB1bnNpZ25lZCBsb25nIG5jYWxsczsJLyogIyBvZiAiY2FsbHMiIHRvIHRoaXMgZmlsZSAqLwotICAgIGludCBudW1fbGluZXM7CQkvKiAjIG9mIGxpbmVzIGluIGZpbGUgKi8KLSAgICBpbnQgbmFsbG9jZWQ7CQkvKiBudW1iZXIgb2YgbGluZXMgYWxsb2NhdGVkICovCi0gICAgdm9pZCAqKmxpbmU7CQkvKiB1c2FnZS1kZXBlbmRlbnQgcGVyLWxpbmUgZGF0YSAqLwotICB9Ci1Tb3VyY2VfRmlsZTsKLQotLyoKLSAqIE9wdGlvbnM6Ci0gKi8KLWV4dGVybiBib29sIGNyZWF0ZV9hbm5vdGF0aW9uX2ZpbGVzOwkvKiBjcmVhdGUgYW5ub3RhdGVkIG91dHB1dCBmaWxlcz8gKi8KLQotLyoKLSAqIExpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBzb3VyY2UgZmlsZXM6Ci0gKi8KLWV4dGVybiBTZWFyY2hfTGlzdCBzcmNfc2VhcmNoX2xpc3Q7Ci0KLS8qCi0gKiBDaGFpbiBvZiBzb3VyY2UtZmlsZSBkZXNjcmlwdG9yczoKLSAqLwotZXh0ZXJuIFNvdXJjZV9GaWxlICpmaXJzdF9zcmNfZmlsZTsKLQotLyoKLSAqIFJldHVybnMgcG9pbnRlciB0byBzb3VyY2UgZmlsZSBkZXNjcmlwdG9yIGZvciBQQVRIL0ZJTEVOQU1FLgotICovCi1leHRlcm4gU291cmNlX0ZpbGUgKnNvdXJjZV9maWxlX2xvb2t1cF9wYXRoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnBhdGgpKTsKLWV4dGVybiBTb3VyY2VfRmlsZSAqc291cmNlX2ZpbGVfbG9va3VwX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLQotLyoKLSAqIFJlYWQgc291cmNlIGZpbGUgU0Ygb3V0cHV0IGFubm90YXRlZCBzb3VyY2UuICBUaGUgYW5ub3RhdGlvbiBpcyBhdAotICogTUFYX1dJRFRIIGNoYXJhY3RlcnMgd2lkZSBhbmQgZm9yIGVhY2ggc291cmNlLWxpbmUgYW4gYW5ub3RhdGlvbiBpcwotICogb2J0YWluZWQgYnkgaW52b2tpbmcgZnVuY3Rpb24gQU5OT1RFLiAgQVJHIGlzIGFuIGFyZ3VtZW50IHBhc3NlZCB0bwotICogQU5OT1RFIHRoYXQgaXMgbGVmdCB1bmludGVycHJldGVkIGJ5IGFubm90YXRlX3NvdXJjZSgpLgotICoKLSAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgZmlsZSAod2hpY2ggbWF5YmUgc3Rkb3V0KSBzdWNoCi0gKiB0aGF0IHN1bW1hcnkgc3RhdGlzdGljcyBjYW4gYmUgcHJpbnRlZC4gIElmIHRoZSByZXR1cm5lZCBmaWxlCi0gKiBpcyBub3Qgc3Rkb3V0LCBpdCBzaG91bGQgYmUgY2xvc2VkIHdoZW4gZG9uZSB3aXRoIGl0LgotICovCi1leHRlcm4gRklMRSAqYW5ub3RhdGVfc291cmNlIFBBUkFNUyAoKFNvdXJjZV9GaWxlICogc2YsIGludCBtYXhfd2lkdGgsCi0JCQkJICAgICAgdm9pZCAoKmFubm90ZSkgKGNoYXIgKmIsIGludCB3LCBpbnQgbCwKLQkJCQkJCSAgICAgIHZvaWQgKmFyZyksCi0JCQkJICAgICAgdm9pZCAqYXJnKSk7Ci0KLSNlbmRpZiAvKiBzb3VyY2VfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2Yvc3BhcmMuYyBiL2dwcm9mL3NwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNjU4MjcuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3BhcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLSAgICAvKgotICAgICAqICAgICAgICBvcGNvZGUgb2YgdGhlIGBjYWxsZicgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSNkZWZpbmUJQ0FMTAkoMHhjMDAwMDAwMCkKLQotdm9pZAotc3BhcmNfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKQotICAgICBTeW0gKnBhcmVudDsKLSAgICAgYmZkX3ZtYSBwX2xvd3BjOwotICAgICBiZmRfdm1hIHBfaGlnaHBjOwotewotICBiZmRfdm1hIGRlc3RfcGMsIGRlbHRhOwotICB1bnNpZ25lZCBpbnQgKmluc3RyOwotICBTeW0gKmNoaWxkOwotCi0gIGRlbHRhID0gKGJmZF92bWEpIGNvcmVfdGV4dF9zcGFjZSAtIGNvcmVfdGV4dF9zZWN0LT52bWE7Ci0KLSAgaWYgKGNvcmVfdGV4dF9zcGFjZSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChwX2xvd3BjIDwgc19sb3dwYykKLSAgICB7Ci0gICAgICBwX2xvd3BjID0gc19sb3dwYzsKLSAgICB9Ci0gIGlmIChwX2hpZ2hwYyA+IHNfaGlnaHBjKQotICAgIHsKLSAgICAgIHBfaGlnaHBjID0gc19oaWdocGM7Ci0gICAgfQotICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiW2ZpbmRfY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iLAotCQkJICBwYXJlbnQtPm5hbWUsICh1bnNpZ25lZCBsb25nKSBwX2xvd3BjLAotCQkJICAodW5zaWduZWQgbG9uZykgcF9oaWdocGMpKTsKLSAgZm9yIChpbnN0ciA9ICh1bnNpZ25lZCBpbnQgKikgKCgocF9sb3dwYyArIGRlbHRhKSArIDMpICZ+IDMpOwotICAgICAgIGluc3RyIDwgKHVuc2lnbmVkIGludCAqKSAocF9oaWdocGMgKyBkZWx0YSk7Ci0gICAgICAgKytpbnN0cikKLSAgICB7Ci0gICAgICBpZiAoKCppbnN0ciAmIENBTEwpKQotCXsKLQkgIERCRyAoQ0FMTERFQlVHLAotCSAgICAgICBwcmludGYgKCJbZmluZF9jYWxsXSAweCVseDogY2FsbGYiLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGluc3RyIC0gZGVsdGEpKTsKLQkgIC8qCi0JICAgKiBSZWd1bGFyIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcgY2hlY2sgdGhhdCB0aGlzIGlzIHRoZQotCSAgICogYWRkcmVzcyBvZiBhIGZ1bmN0aW9uLgotCSAgICovCi0JICBkZXN0X3BjID0gKChiZmRfdm1hKSAoaW5zdHIgKyAoKmluc3RyICYgfkNBTEwpKSkgLSBkZWx0YTsKLQkgIGlmIChkZXN0X3BjID49IHNfbG93cGMgJiYgZGVzdF9wYyA8PSBzX2hpZ2hwYykKLQkgICAgewotCSAgICAgIGNoaWxkID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgZGVzdF9wYyk7Ci0JICAgICAgREJHIChDQUxMREVCVUcsCi0JCSAgIHByaW50ZiAoIlx0ZGVzdF9wYz0weCVseCwgKG5hbWU9JXMsIGFkZHI9MHglbHgpXG4iLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGRlc3RfcGMsIGNoaWxkLT5uYW1lLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGNoaWxkLT5hZGRyKSk7Ci0JICAgICAgaWYgKGNoaWxkLT5hZGRyID09IGRlc3RfcGMpCi0JCXsKLQkJICAvKiBhIGhpdDogICovCi0JCSAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBTb21ldGhpbmcgZnVubnkgZ29pbmcgb24uCi0JICAgKi8KLQkgIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJcdGJ1dCBpdCdzIGEgYm90Y2hcbiIpKTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2Yvc3RhbXAtaC5pbiBiL2dwcm9mL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3RhbXAtaC5pbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRpbWVzdGFtcApkaWZmIC0tZ2l0IGEvZ3Byb2Yvc3ltX2lkcy5jIGIvZ3Byb2Yvc3ltX2lkcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTJjOGQ0Li4wMDAwMDAwCi0tLSBhL2dwcm9mL3N5bV9pZHMuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0KLXN0cnVjdCBzeW1faWQKLSAgewotICAgIHN0cnVjdCBzeW1faWQgKm5leHQ7Ci0gICAgY2hhciAqc3BlYzsJCQkvKiBwYXJzaW5nIG1vZGlmaWVzIHRoaXMgKi8KLSAgICBUYWJsZV9JZCB3aGljaF90YWJsZTsKLSAgICBib29sIGhhc19yaWdodDsKLSAgICBzdHJ1Y3QgbWF0Y2gKLSAgICAgIHsKLQlpbnQgcHJldl9pbmRleDsJCS8qIGluZGV4IG9mIHByZXYgbWF0Y2ggKi8KLQlTeW0gKnByZXZfbWF0Y2g7CS8qIHByZXZpb3VzIG1hdGNoICovCi0JU3ltICpmaXJzdF9tYXRjaDsJLyogY2hhaW4gb2YgYWxsIG1hdGNoZXMgKi8KLQlTeW0gc3ltOwotICAgICAgfQotICAgIGxlZnQsIHJpZ2h0OwotICB9Ci0gKmlkX2xpc3Q7Ci0KLVN5bV9UYWJsZSBzeW1zW05VTV9UQUJMRVNdOwotCi0jaWZkZWYgREVCVUcKLWNvbnN0IGNoYXIgKnRhYmxlX25hbWVbXSA9Ci17Ci0gICJJTkNMX0dSQVBIIiwgIkVYQ0xfR1JBUEgiLAotICAiSU5DTF9BUkNTIiwgIkVYQ0xfQVJDUyIsCi0gICJJTkNMX0ZMQVQiLCAiRVhDTF9GTEFUIiwKLSAgIklOQ0xfVElNRSIsICJFWENMX1RJTUUiLAotICAiSU5DTF9BTk5PIiwgIkVYQ0xfQU5OTyIsCi0gICJJTkNMX0VYRUMiLCAiRVhDTF9FWEVDIgotfTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0vKgotICogVGhpcyBpcyB0aGUgdGFibGUgaW4gd2hpY2ggd2Uga2VlcCBhbGwgdGhlIHN5bXMgdGhhdCBtYXRjaAotICogdGhlIHJpZ2h0IGhhbGYgb2YgYW4gYXJjIGlkLiAgSXQgaXMgTk9UIHNvcnRlZCBhY2NvcmRpbmcKLSAqIHRvIHRoZSBhZGRyZXNzZXMsIGJlY2F1c2UgaXQgaXMgYWNjZXNzZWQgb25seSB0aHJvdWdoCi0gKiB0aGUgbGVmdCBoYWxmJ3MgQ0hJTERSRU4gcG9pbnRlcnMgKHNvIGl0J3MgY3J1Y2lhbCBub3QKLSAqIHRvIHJlb3JkZXIgdGhpcyB0YWJsZSBvbmNlIHBvaW50ZXJzIGludG8gaXQgZXhpc3QpLgotICovCi1zdGF0aWMgU3ltX1RhYmxlIHJpZ2h0X2lkczsKLQotc3RhdGljIFNvdXJjZV9GaWxlIG5vbl9leGlzdGVudF9maWxlID0KLXsKLSAgMCwgIjxub24tZXhpc3RlbnQtZmlsZT4iLCAwLCAwLCAwLCBOVUxMCi19OwotCi0KLXZvaWQKLURFRlVOIChzeW1faWRfYWRkLCAoc3BlYywgd2hpY2hfdGFibGUpLAotICAgICAgIGNvbnN0IGNoYXIgKnNwZWMgQU5EIFRhYmxlX0lkIHdoaWNoX3RhYmxlKQotewotICBzdHJ1Y3Qgc3ltX2lkICppZDsKLSAgaW50IGxlbiA9IHN0cmxlbiAoc3BlYyk7Ci0KLSAgaWQgPSAoc3RydWN0IHN5bV9pZCAqKSB4bWFsbG9jIChzaXplb2YgKCppZCkgKyBsZW4gKyAxKTsKLSAgbWVtc2V0IChpZCwgMCwgc2l6ZW9mICgqaWQpKTsKLQotICBpZC0+c3BlYyA9IChjaGFyICopIGlkICsgc2l6ZW9mICgqaWQpOwotICBzdHJjcHkgKGlkLT5zcGVjLCBzcGVjKTsKLSAgaWQtPndoaWNoX3RhYmxlID0gd2hpY2hfdGFibGU7Ci0KLSAgaWQtPm5leHQgPSBpZF9saXN0OwotICBpZF9saXN0ID0gaWQ7Ci19Ci0KLQotLyoKLSAqIEEgc3BlYyBoYXMgdGhlIHN5bnRheCBGSUxFTkFNRTooRlVOQ05BTUV8TElORU5VTSkuICBBcyBhIGNvbnZlbmllbmNlCi0gKiB0byB0aGUgdXNlciwgYSBzcGVjIHdpdGhvdXQgYSBjb2xvbiBpcyBpbnRlcnByZXRlZCBhczoKLSAqCi0gKiAgICAgIChpKSAgIGEgRklMRU5BTUUgaWYgaXQgY29udGFpbnMgYSBkb3QKLSAqICAgICAgKGlpKSAgYSBGVU5DTkFNRSBpZiBpdCBzdGFydHMgd2l0aCBhIG5vbi1kaWdpdCBjaGFyYWN0ZXIKLSAqICAgICAgKGlpaSkgYSBMSU5FTlVNIGlmIGl0IHN0YXJ0cyB3aXRoIGEgZGlnaXQKLSAqCi0gKiBBIEZVTkNOQU1FIGNvbnRhaW5pbmcgYSBkb3QgY2FuIGJlIHNwZWNpZmllZCBieSA6RlVOQ05BTUUsIGEKLSAqIEZJTEVOQU1FIG5vdCBjb250YWluaW5nIGEgZG90IGNhbiBiZSBzcGVjaWZpZWQgYnkgRklMRU5BTUU6LgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHBhcnNlX3NwZWMsIChzcGVjLCBzeW0pLCBjaGFyICpzcGVjIEFORCBTeW0gKiBzeW0pCi17Ci0gIGNoYXIgKmNvbG9uOwotCi0gIHN5bV9pbml0IChzeW0pOwotICBjb2xvbiA9IHN0cnJjaHIgKHNwZWMsICc6Jyk7Ci0gIGlmIChjb2xvbikKLSAgICB7Ci0gICAgICAqY29sb24gPSAnXDAnOwotICAgICAgaWYgKGNvbG9uID4gc3BlYykKLQl7Ci0JICBzeW0tPmZpbGUgPSBzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSAoc3BlYyk7Ci0JICBpZiAoIXN5bS0+ZmlsZSkKLQkgICAgewotCSAgICAgIHN5bS0+ZmlsZSA9ICZub25fZXhpc3RlbnRfZmlsZTsKLQkgICAgfQotCX0KLSAgICAgIHNwZWMgPSBjb2xvbiArIDE7Ci0gICAgICBpZiAoc3RybGVuIChzcGVjKSkKLQl7Ci0JICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHNwZWNbMF0pKQotCSAgICB7Ci0JICAgICAgc3ltLT5saW5lX251bSA9IGF0b2kgKHNwZWMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzeW0tPm5hbWUgPSBzcGVjOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3RybGVuIChzcGVjKSkKLSAgICB7Ci0gICAgICAvKiBubyBjb2xvbjogc3BlYyBpcyBhIGZpbGVuYW1lIGlmIGl0IGNvbnRhaW5zIGEgZG90OiAqLwotICAgICAgaWYgKHN0cmNociAoc3BlYywgJy4nKSkKLQl7Ci0JICBzeW0tPmZpbGUgPSBzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSAoc3BlYyk7Ci0JICBpZiAoIXN5bS0+ZmlsZSkKLQkgICAgewotCSAgICAgIHN5bS0+ZmlsZSA9ICZub25fZXhpc3RlbnRfZmlsZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqc3BlYykpCi0JewotCSAgc3ltLT5saW5lX251bSA9IGF0b2kgKHNwZWMpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmxlbiAoc3BlYykpCi0JewotCSAgc3ltLT5uYW1lID0gc3BlYzsKLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBBIHN5bWJvbCBpZCBoYXMgdGhlIHN5bnRheCBTUEVDWy9TUEVDXSwgd2hlcmUgU1BFQyBpcyBpcyBkZWZpbmVkCi0gKiBieSBwYXJzZV9zcGVjKCkuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocGFyc2VfaWQsIChpZCksIHN0cnVjdCBzeW1faWQgKmlkKQotewotICBjaGFyICpzbGFzaDsKLQotICBEQkcgKElEREVCVUcsIHByaW50ZiAoIltwYXJzZV9pZF0gJXMgLT4gIiwgaWQtPnNwZWMpKTsKLQotICBzbGFzaCA9IHN0cmNociAoaWQtPnNwZWMsICcvJyk7Ci0gIGlmIChzbGFzaCkKLSAgICB7Ci0gICAgICBwYXJzZV9zcGVjIChzbGFzaCArIDEsICZpZC0+cmlnaHQuc3ltKTsKLSAgICAgICpzbGFzaCA9ICdcMCc7Ci0gICAgICBpZC0+aGFzX3JpZ2h0ID0gVFJVRTsKLSAgICB9Ci0gIHBhcnNlX3NwZWMgKGlkLT5zcGVjLCAmaWQtPmxlZnQuc3ltKTsKLQotI2lmZGVmIERFQlVHCi0gIGlmIChkZWJ1Z19sZXZlbCAmIElEREVCVUcpCi0gICAgewotICAgICAgcHJpbnRmICgiJXM6IiwgaWQtPmxlZnQuc3ltLmZpbGUgPyBpZC0+bGVmdC5zeW0uZmlsZS0+bmFtZSA6ICIqIik7Ci0gICAgICBpZiAoaWQtPmxlZnQuc3ltLm5hbWUpCi0JewotCSAgcHJpbnRmICgiJXMiLCBpZC0+bGVmdC5zeW0ubmFtZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoaWQtPmxlZnQuc3ltLmxpbmVfbnVtKQotCXsKLQkgIHByaW50ZiAoIiVkIiwgaWQtPmxlZnQuc3ltLmxpbmVfbnVtKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiKiIpOwotCX0KLSAgICAgIGlmIChpZC0+aGFzX3JpZ2h0KQotCXsKLQkgIHByaW50ZiAoIi8lczoiLAotCQkgIGlkLT5yaWdodC5zeW0uZmlsZSA/IGlkLT5yaWdodC5zeW0uZmlsZS0+bmFtZSA6ICIqIik7Ci0JICBpZiAoaWQtPnJpZ2h0LnN5bS5uYW1lKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJXMiLCBpZC0+cmlnaHQuc3ltLm5hbWUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChpZC0+cmlnaHQuc3ltLmxpbmVfbnVtKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJWQiLCBpZC0+cmlnaHQuc3ltLmxpbmVfbnVtKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiKiIpOwotCSAgICB9Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotCi0vKgotICogUmV0dXJuIFRSVUUgaWZmIFBBVFRFUk4gbWF0Y2hlcyBTWU0uCi0gKi8KLXN0YXRpYyBib29sCi1ERUZVTiAobWF0Y2gsIChwYXR0ZXJuLCBzeW0pLCBTeW0gKiBwYXR0ZXJuIEFORCBTeW0gKiBzeW0pCi17Ci0gIHJldHVybiAocGF0dGVybi0+ZmlsZSA/IHBhdHRlcm4tPmZpbGUgPT0gc3ltLT5maWxlIDogVFJVRSkKLSAgICAmJiAocGF0dGVybi0+bGluZV9udW0gPyBwYXR0ZXJuLT5saW5lX251bSA9PSBzeW0tPmxpbmVfbnVtIDogVFJVRSkKLSAgICAmJiAocGF0dGVybi0+bmFtZSA/IHN0cmNtcCAocGF0dGVybi0+bmFtZSwgc3ltLT5uYW1lKSA9PSAwIDogVFJVRSk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChleHRlbmRfbWF0Y2gsIChtLCBzeW0sIHRhYiwgc2Vjb25kX3Bhc3MpLAotICAgICBzdHJ1Y3QgbWF0Y2ggKm0gQU5EIFN5bSAqIHN5bSBBTkQgU3ltX1RhYmxlICogdGFiIEFORCBib29sIHNlY29uZF9wYXNzKQotewotICBpZiAobS0+cHJldl9tYXRjaCAhPSBzeW0gLSAxKQotICAgIHsKLSAgICAgIC8qIGRpc2NvbnRpbnVpdHk6IGFkZCBuZXcgbWF0Y2ggdG8gdGFibGU6ICovCi0gICAgICBpZiAoc2Vjb25kX3Bhc3MpCi0JewotCSAgdGFiLT5iYXNlW3RhYi0+bGVuXSA9ICpzeW07Ci0JICBtLT5wcmV2X2luZGV4ID0gdGFiLT5sZW47Ci0KLQkgIC8qIGxpbmsgbWF0Y2ggaW50byBtYXRjaCdzIGNoYWluOiAqLwotCSAgdGFiLT5iYXNlW3RhYi0+bGVuXS5uZXh0ID0gbS0+Zmlyc3RfbWF0Y2g7Ci0JICBtLT5maXJzdF9tYXRjaCA9ICZ0YWItPmJhc2VbdGFiLT5sZW5dOwotCX0KLSAgICAgICsrdGFiLT5sZW47Ci0gICAgfQotCi0gIC8qIGV4dGVuZCBtYXRjaCB0byBpbmNsdWRlIHRoaXMgc3ltYm9sOiAqLwotICBpZiAoc2Vjb25kX3Bhc3MpCi0gICAgewotICAgICAgdGFiLT5iYXNlW20tPnByZXZfaW5kZXhdLmVuZF9hZGRyID0gc3ltLT5lbmRfYWRkcjsKLSAgICB9Ci0gIG0tPnByZXZfbWF0Y2ggPSBzeW07Ci19Ci0KLQotLyoKLSAqIEdvIHRocm91Z2ggc3ltX2lkIGxpc3QgcHJvZHVjZWQgYnkgb3B0aW9uIHByb2Nlc3NpbmcgYW5kIGZpbGwKLSAqIGluIHRoZSB2YXJpb3VzIHN5bWJvbCB0YWJsZXMgaW5kaWNhdGluZyB3aGF0IHN5bWJvbHMgc2hvdWxkCi0gKiBiZSBkaXNwbGF5ZWQgb3Igc3VwcHJlc3NlZCBmb3IgdGhlIHZhcmlvdXMga2luZHMgb2Ygb3V0cHV0cy4KLSAqCi0gKiBUaGlzIGNhbiBwb3RlbnRpYWxseSBwcm9kdWNlIGh1Z2UgdGFibGVzIGFuZCBpbiBwYXJ0aWN1bGFycwotICogdG9ucyBvZiBhcmNzLCBidXQgdGhpcyBoYXBwZW5zIG9ubHkgaWYgdGhlIHVzZXIgbWFrZXMgc2lsbHkKLSAqIHJlcXVlc3RzLS0teW91IGdldCB3aGF0IHlvdSBhc2sgZm9yIQotICovCi12b2lkCi1ERUZVTl9WT0lEIChzeW1faWRfcGFyc2UpCi17Ci0gIFN5bSAqc3ltLCAqbGVmdCwgKnJpZ2h0OwotICBzdHJ1Y3Qgc3ltX2lkICppZDsKLSAgU3ltX1RhYmxlICp0YWI7Ci0KLSAgLyoKLSAgICogQ29udmVydCBzeW1ib2wgaWRzIGludG8gU3ltcywgc28gd2UgY2FuIGRlYWwgd2l0aCB0aGVtIG1vcmUgZWFzaWx5OgotICAgKi8KLSAgZm9yIChpZCA9IGlkX2xpc3Q7IGlkOyBpZCA9IGlkLT5uZXh0KQotICAgIHsKLSAgICAgIHBhcnNlX2lkIChpZCk7Ci0gICAgfQotCi0gIC8qIGZpcnN0IGRldGVybWluZSBzaXplIG9mIGVhY2ggdGFibGU6ICovCi0KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBmb3IgKGlkID0gaWRfbGlzdDsgaWQ7IGlkID0gaWQtPm5leHQpCi0JewotCSAgaWYgKG1hdGNoICgmaWQtPmxlZnQuc3ltLCBzeW0pKQotCSAgICB7Ci0JICAgICAgZXh0ZW5kX21hdGNoICgmaWQtPmxlZnQsIHN5bSwgJnN5bXNbaWQtPndoaWNoX3RhYmxlXSwgRkFMU0UpOwotCSAgICB9Ci0JICBpZiAoaWQtPmhhc19yaWdodCAmJiBtYXRjaCAoJmlkLT5yaWdodC5zeW0sIHN5bSkpCi0JICAgIHsKLQkgICAgICBleHRlbmRfbWF0Y2ggKCZpZC0+cmlnaHQsIHN5bSwgJnJpZ2h0X2lkcywgRkFMU0UpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBjcmVhdGUgdGFibGVzIG9mIGFwcHJvcHJpYXRlIHNpemUgYW5kIHJlc2V0IGxlbmd0aHM6ICovCi0KLSAgZm9yICh0YWIgPSBzeW1zOyB0YWIgPCAmc3ltc1tOVU1fVEFCTEVTXTsgKyt0YWIpCi0gICAgewotICAgICAgaWYgKHRhYi0+bGVuKQotCXsKLQkgIHRhYi0+YmFzZSA9IChTeW0gKikgeG1hbGxvYyAodGFiLT5sZW4gKiBzaXplb2YgKFN5bSkpOwotCSAgdGFiLT5saW1pdCA9IHRhYi0+YmFzZSArIHRhYi0+bGVuOwotCSAgdGFiLT5sZW4gPSAwOwotCX0KLSAgICB9Ci0gIGlmIChyaWdodF9pZHMubGVuKQotICAgIHsKLSAgICAgIHJpZ2h0X2lkcy5iYXNlID0gKFN5bSAqKSB4bWFsbG9jIChyaWdodF9pZHMubGVuICogc2l6ZW9mIChTeW0pKTsKLSAgICAgIHJpZ2h0X2lkcy5saW1pdCA9IHJpZ2h0X2lkcy5iYXNlICsgcmlnaHRfaWRzLmxlbjsKLSAgICAgIHJpZ2h0X2lkcy5sZW4gPSAwOwotICAgIH0KLQotICAvKiBtYWtlIGEgc2Vjb25kIHBhc3MgdGhyb3VnaCBzeW10YWIsIGNyZWF0aW5nIHN5bXMgYXMgbmVjZXNzYXJ5OiAqLwotCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgZm9yIChpZCA9IGlkX2xpc3Q7IGlkOyBpZCA9IGlkLT5uZXh0KQotCXsKLQkgIGlmIChtYXRjaCAoJmlkLT5sZWZ0LnN5bSwgc3ltKSkKLQkgICAgewotCSAgICAgIGV4dGVuZF9tYXRjaCAoJmlkLT5sZWZ0LCBzeW0sICZzeW1zW2lkLT53aGljaF90YWJsZV0sIFRSVUUpOwotCSAgICB9Ci0JICBpZiAoaWQtPmhhc19yaWdodCAmJiBtYXRjaCAoJmlkLT5yaWdodC5zeW0sIHN5bSkpCi0JICAgIHsKLQkgICAgICBleHRlbmRfbWF0Y2ggKCZpZC0+cmlnaHQsIHN5bSwgJnJpZ2h0X2lkcywgVFJVRSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIGdvIHRocm91Z2ggaWRzIGNyZWF0aW5nIGFyY3MgYXMgbmVlZGVkOiAqLwotCi0gIGZvciAoaWQgPSBpZF9saXN0OyBpZDsgaWQgPSBpZC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoaWQtPmhhc19yaWdodCkKLQl7Ci0JICBmb3IgKGxlZnQgPSBpZC0+bGVmdC5maXJzdF9tYXRjaDsgbGVmdDsgbGVmdCA9IGxlZnQtPm5leHQpCi0JICAgIHsKLQkgICAgICBmb3IgKHJpZ2h0ID0gaWQtPnJpZ2h0LmZpcnN0X21hdGNoOyByaWdodDsgcmlnaHQgPSByaWdodC0+bmV4dCkKLQkJewotCQkgIERCRyAoSURERUJVRywKLQkJICAgICAgIHByaW50ZiAoCi0JCQkJIltzeW1faWRfcGFyc2VdOiBhcmMgJXM6JXMoJWx4LSVseCkgLT4gJXM6JXMoJWx4LSVseCkgdG8gJXNcbiIsCi0JCQkJbGVmdC0+ZmlsZSA/IGxlZnQtPmZpbGUtPm5hbWUgOiAiKiIsCi0JCQkJbGVmdC0+bmFtZSA/IGxlZnQtPm5hbWUgOiAiKiIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpIGxlZnQtPmFkZHIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpIGxlZnQtPmVuZF9hZGRyLAotCQkJCXJpZ2h0LT5maWxlID8gcmlnaHQtPmZpbGUtPm5hbWUgOiAiKiIsCi0JCQkJcmlnaHQtPm5hbWUgPyByaWdodC0+bmFtZSA6ICIqIiwKLQkJCQkodW5zaWduZWQgbG9uZykgcmlnaHQtPmFkZHIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpIHJpZ2h0LT5lbmRfYWRkciwKLQkJCQl0YWJsZV9uYW1lW2lkLT53aGljaF90YWJsZV0pKTsKLQkJICBhcmNfYWRkIChsZWZ0LCByaWdodCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIGZpbmFsbHksIHdlIGNhbiBzb3J0IHRoZSB0YWJsZXMgYW5kIHdlJ3JlIGRvbmU6ICovCi0KLSAgZm9yICh0YWIgPSAmc3ltc1swXTsgdGFiIDwgJnN5bXNbTlVNX1RBQkxFU107ICsrdGFiKQotICAgIHsKLSAgICAgIERCRyAoSURERUJVRywgcHJpbnRmICgiW3N5bV9pZF9wYXJzZV0gc3ltc1slc106XG4iLAotCQkJICAgIHRhYmxlX25hbWVbdGFiIC0gJnN5bXNbMF1dKSk7Ci0gICAgICBzeW10YWJfZmluYWxpemUgKHRhYik7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBTeW1ib2wgdGFibGVzIHN0b3JpbmcgdGhlIEZST00gc3ltYm9scyBvZiBhcmNzIGRvIG5vdCBuZWNlc3NhcmlseQotICogaGF2ZSBkaXN0aW5jdCBhZGRyZXNzIHJhbmdlcy4gIEZvciBleGFtcGxlLCBzb21lYm9keSBtaWdodCByZXF1ZXN0Ci0gKiAtayAvX21jb3VudCB0byBzdXBwcmVzcyBhbnkgYXJjcyBpbnRvIF9tY291bnQsIHdoaWxlIGF0IHRoZSBzYW1lCi0gKiB0aW1lIHJlcXVlc3RpbmcgLWsgYS9iLiAgRm9ydHVuYXRlbHksIHRob3NlIHN5bWJvbCB0YWJsZXMgZG9uJ3QgZ2V0Ci0gKiB2ZXJ5IGJpZyAodGhlIHVzZXIgaGFzIHRvIHR5cGUgdGhlbSEpLCBzbyBhIGxpbmVhciBzZWFyY2ggaXMgcHJvYmFibHkKLSAqIHRvbGVyYWJsZS4KLSAqLwotYm9vbAotREVGVU4gKHN5bV9pZF9hcmNfaXNfcHJlc2VudCwgKHN5bXRhYiwgZnJvbSwgdG8pLAotICAgICAgIFN5bV9UYWJsZSAqIHN5bXRhYiBBTkQgU3ltICogZnJvbSBBTkQgU3ltICogdG8pCi17Ci0gIFN5bSAqc3ltOwotCi0gIGZvciAoc3ltID0gc3ltdGFiLT5iYXNlOyBzeW0gPCBzeW10YWItPmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBpZiAoZnJvbS0+YWRkciA+PSBzeW0tPmFkZHIgJiYgZnJvbS0+YWRkciA8PSBzeW0tPmVuZF9hZGRyCi0JICAmJiBhcmNfbG9va3VwIChzeW0sIHRvKSkKLQl7Ci0JICByZXR1cm4gVFJVRTsKLQl9Ci0gICAgfQotICByZXR1cm4gRkFMU0U7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zeW1faWRzLmggYi9ncHJvZi9zeW1faWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTYzMzguLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3ltX2lkcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI2lmbmRlZiBzeW1faWRzX2gKLSNkZWZpbmUgc3ltX2lkc19oCi0KLSNpbmNsdWRlICJzeW10YWIuaCIKLQotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBJTkNMX0dSQVBIID0gMCwgRVhDTF9HUkFQSCwKLSAgICBJTkNMX0FSQ1MsIEVYQ0xfQVJDUywKLSAgICBJTkNMX0ZMQVQsIEVYQ0xfRkxBVCwKLSAgICBJTkNMX1RJTUUsIEVYQ0xfVElNRSwKLSAgICBJTkNMX0FOTk8sIEVYQ0xfQU5OTywKLSAgICBJTkNMX0VYRUMsIEVYQ0xfRVhFQywKLSAgICBOVU1fVEFCTEVTCi0gIH0KLVRhYmxlX0lkOwotCi1leHRlcm4gU3ltX1RhYmxlIHN5bXNbTlVNX1RBQkxFU107Ci0KLWV4dGVybiB2b2lkIHN5bV9pZF9hZGQgUEFSQU1TICgoY29uc3QgY2hhciAqc3BlYywgVGFibGVfSWQgd2hpY2hfdGFibGUpKTsKLWV4dGVybiB2b2lkIHN5bV9pZF9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gYm9vbCBzeW1faWRfYXJjX2lzX3ByZXNlbnQgUEFSQU1TICgoU3ltX1RhYmxlICogc3ltdGFiLAotCQkJCQkgICBTeW0gKiBmcm9tLCBTeW0gKiB0bykpOwotCi0jZW5kaWYgLyogc3ltX2lkc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi9zeW10YWIuYyBiL2dwcm9mL3N5bXRhYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2IyNjFhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3N5bXRhYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi1TeW1fVGFibGUgc3ltdGFiOwotCi0KLS8qCi0gKiBJbml0aWFsaXplIGEgc3ltYm9sIChzbyBpdCdzIGVtcHR5KS4KLSAqLwotdm9pZAotREVGVU4gKHN5bV9pbml0LCAoc3ltKSwgU3ltICogc3ltKQotewotICBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mICgqc3ltKSk7Ci0gIC8qCi0gICAqIEl0IGlzIG5vdCBzYWZlIHRvIGFzc3VtZSB0aGF0IGEgYmluYXJ5IHplcm8gY29ycmVzcG9uZHMgdG8KLSAgICogYSBmbG9hdGluZy1wb2ludCAwLjAsIHNvIGluaXRpYWxpemUgZmxvYXRzIGV4cGxpY2l0bHk6Ci0gICAqLwotICBzeW0tPmhpc3QudGltZSA9IDAuMDsKLSAgc3ltLT5jZy5jaGlsZF90aW1lID0gMC4wOwotICBzeW0tPmNnLnByb3AuZnJhY3QgPSAwLjA7Ci0gIHN5bS0+Y2cucHJvcC5zZWxmID0gMC4wOwotICBzeW0tPmNnLnByb3AuY2hpbGQgPSAwLjA7Ci19Ci0KLQotLyoKLSAqIENvbXBhcmUgdGhlIGZ1bmN0aW9uIGVudHJ5LXBvaW50IG9mIHR3byBzeW1ib2xzIGFuZCByZXR1cm4gPDAsID0wLAotICogb3IgPjAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGxlZnQgdmFsdWUgaXMgc21hbGxlciB0aGFuLCBlcXVhbAotICogdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgcmlnaHQgdmFsdWUuICBJZiB0d28gc3ltYm9scyBhcmUgZXF1YWwKLSAqIGJ1dCBvbmUgaGFzIGlzX2Z1bmMgc2V0IGFuZCB0aGUgb3RoZXIgZG9lc24ndCwgd2UgbWFrZSB0aGUKLSAqIG5vbi1mdW5jdGlvbiBzeW1ib2wgb25lICJiaWdnZXIiIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIHN5bWJvbCB3aWxsCi0gKiBzdXJ2aXZlIGR1cGxpY2F0ZSByZW1vdmFsLiAgRmluYWxseSwgaWYgYm90aCBzeW1ib2xzIGhhdmUgdGhlCi0gKiBzYW1lIGlzX2Z1bmMgdmFsdWUsIHdlIGRpc2NyaW1pbmF0ZSBhZ2FpbnN0IGlzX3N0YXRpYyBzdWNoIHRoYXQKLSAqIHRoZSBnbG9iYWwgc3ltYm9sIHN1cnZpdmVzLgotICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX2FkZHIsIChscCwgcnApLCBjb25zdCBQVFIgbHAgQU5EIGNvbnN0IFBUUiBycCkKLXsKLSAgU3ltICpsZWZ0ID0gKFN5bSAqKSBscDsKLSAgU3ltICpyaWdodCA9IChTeW0gKikgcnA7Ci0KLSAgaWYgKGxlZnQtPmFkZHIgPiByaWdodC0+YWRkcikKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlZnQtPmFkZHIgPCByaWdodC0+YWRkcikKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChsZWZ0LT5pc19mdW5jICE9IHJpZ2h0LT5pc19mdW5jKQotICAgIHsKLSAgICAgIHJldHVybiByaWdodC0+aXNfZnVuYyAtIGxlZnQtPmlzX2Z1bmM7Ci0gICAgfQotCi0gIHJldHVybiBsZWZ0LT5pc19zdGF0aWMgLSByaWdodC0+aXNfc3RhdGljOwotfQotCi0KLXZvaWQKLURFRlVOIChzeW10YWJfZmluYWxpemUsICh0YWIpLCBTeW1fVGFibGUgKiB0YWIpCi17Ci0gIFN5bSAqc3JjLCAqZHN0OwotICBiZmRfdm1hIHByZXZfYWRkcjsKLQotICBpZiAoIXRhYi0+bGVuKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyoKLSAgICogU29ydCBzeW1ib2wgdGFibGUgaW4gb3JkZXIgb2YgaW5jcmVhc2luZyBmdW5jdGlvbiBhZGRyZXNzZXM6Ci0gICAqLwotICBxc29ydCAodGFiLT5iYXNlLCB0YWItPmxlbiwgc2l6ZW9mIChTeW0pLCBjbXBfYWRkcik7Ci0KLSAgLyoKLSAgICogUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzIHRvIHNwZWVkLXVwIGxhdGVyIHByb2Nlc3NpbmcgYW5kCi0gICAqIHNldCBlbmRfYWRkciBpZiBpdHMgbm90IHNldCB5ZXQ6Ci0gICAqLwotICBwcmV2X2FkZHIgPSB0YWItPmJhc2VbMF0uYWRkciArIDE7Ci0gIGZvciAoc3JjID0gZHN0ID0gdGFiLT5iYXNlOyBzcmMgPCB0YWItPmxpbWl0OyArK3NyYykKLSAgICB7Ci0gICAgICBpZiAoc3JjLT5hZGRyID09IHByZXZfYWRkcikKLQl7Ci0JICAvKgotCSAgICogSWYgc2FtZSBhZGRyZXNzLCBmYXZvciBnbG9iYWwgc3ltYm9sIG92ZXIgc3RhdGljIG9uZSwKLQkgICAqIHRoZW4gZnVuY3Rpb24gb3ZlciBsaW5lIG51bWJlci4gIElmIGJvdGggc3ltYm9scyBhcmUKLQkgICAqIGVpdGhlciBzdGF0aWMgb3IgZ2xvYmFsIGFuZCBlaXRoZXIgZnVuY3Rpb24gb3IgbGluZSwgY2hlY2sKLQkgICAqIHdoZXRoZXIgb25lIGhhcyBuYW1lIGJlZ2lubmluZyB3aXRoIHVuZGVyc2NvcmUgd2hpbGUKLQkgICAqIHRoZSBvdGhlciBkb2Vzbid0LiAgSW4gc3VjaCBjYXNlcywga2VlcCBzeW0gd2l0aG91dAotCSAgICogdW5kZXJzY29yZS4gIFRoaXMgdGFrZXMgY2FyZXMgb2YgY29tcGlsZXIgZ2VuZXJhdGVkCi0JICAgKiBzeW1ib2xzIChzdWNoIGFzIF9fZ251X2NvbXBpbGVkLCBfX2M4OV91c2VkLCBldGMuKS4KLQkgICAqLwotCSAgaWYgKCghc3JjLT5pc19zdGF0aWMgJiYgZHN0Wy0xXS5pc19zdGF0aWMpCi0JICAgICAgfHwgKChzcmMtPmlzX3N0YXRpYyA9PSBkc3RbLTFdLmlzX3N0YXRpYykKLQkJICAmJiAoKHNyYy0+aXNfZnVuYyAmJiAhZHN0Wy0xXS5pc19mdW5jKQotCQkgICAgICB8fCAoKHNyYy0+aXNfZnVuYyA9PSBkc3RbLTFdLmlzX2Z1bmMpCi0JCQkgICYmICgoc3JjLT5uYW1lWzBdICE9ICdfJyAmJiBkc3RbLTFdLm5hbWVbMF0gPT0gJ18nKQotCQkJICAgICAgfHwgKHNyYy0+bmFtZVswXQotCQkJCSAgJiYgc3JjLT5uYW1lWzFdICE9ICdfJwotCQkJCSAgJiYgZHN0Wy0xXS5uYW1lWzFdID09ICdfJykpKSkpKQotCSAgICB7Ci0JICAgICAgREJHIChBT1VUREVCVUcgfCBJRERFQlVHLAotCQkgICBwcmludGYgKCJbc3ltdGFiX2ZpbmFsaXplXSBmYXZvciAlc0AlYyVjIG92ZXIgJXNAJWMlYyIsCi0JCQkgICBzcmMtPm5hbWUsIHNyYy0+aXNfc3RhdGljID8gJ3QnIDogJ1QnLAotCQkJICAgc3JjLT5pc19mdW5jID8gJ0YnIDogJ2YnLAotCQkJICAgZHN0Wy0xXS5uYW1lLCBkc3RbLTFdLmlzX3N0YXRpYyA/ICd0JyA6ICdUJywKLQkJCSAgIGRzdFstMV0uaXNfZnVuYyA/ICdGJyA6ICdmJyk7Ci0JCSAgIHByaW50ZiAoIiAoYWRkcj0lbHgpXG4iLCAodW5zaWduZWQgbG9uZykgc3JjLT5hZGRyKSk7Ci0JICAgICAgZHN0Wy0xXSA9ICpzcmM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIERCRyAoQU9VVERFQlVHIHwgSURERUJVRywKLQkJICAgcHJpbnRmICgiW3N5bXRhYl9maW5hbGl6ZV0gZmF2b3IgJXNAJWMlYyBvdmVyICVzQCVjJWMiLAotCQkJICAgZHN0Wy0xXS5uYW1lLCBkc3RbLTFdLmlzX3N0YXRpYyA/ICd0JyA6ICdUJywKLQkJCSAgIGRzdFstMV0uaXNfZnVuYyA/ICdGJyA6ICdmJywKLQkJCSAgIHNyYy0+bmFtZSwgc3JjLT5pc19zdGF0aWMgPyAndCcgOiAnVCcsCi0JCQkgICBzcmMtPmlzX2Z1bmMgPyAnRicgOiAnZicpOwotCQkgICBwcmludGYgKCIgKGFkZHI9JWx4KVxuIiwgKHVuc2lnbmVkIGxvbmcpIHNyYy0+YWRkcikpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChkc3QgPiB0YWItPmJhc2UgJiYgZHN0Wy0xXS5lbmRfYWRkciA9PSAwKQotCSAgICB7Ci0JICAgICAgZHN0Wy0xXS5lbmRfYWRkciA9IHNyYy0+YWRkciAtIDE7Ci0JICAgIH0KLQotCSAgLyogcmV0YWluIHN5bSBvbmx5IGlmIGl0IGhhcyBhIG5vbi1lbXB0eSBhZGRyZXNzIHJhbmdlOiAqLwotCSAgaWYgKCFzcmMtPmVuZF9hZGRyIHx8IHNyYy0+YWRkciA8PSBzcmMtPmVuZF9hZGRyKQotCSAgICB7Ci0JICAgICAgKmRzdCsrID0gKnNyYzsKLQkgICAgICBwcmV2X2FkZHIgPSBzcmMtPmFkZHI7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBpZiAodGFiLT5sZW4gPiAwICYmIGRzdFstMV0uZW5kX2FkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBkc3RbLTFdLmVuZF9hZGRyID0gY29yZV90ZXh0X3NlY3QtPnZtYSArIGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemUgLSAxOwotICAgIH0KLQotICBEQkcgKEFPVVRERUJVRyB8IElEREVCVUcsCi0gICAgICAgcHJpbnRmICgiW3N5bXRhYl9maW5hbGl6ZV06IHJlbW92ZWQgJWQgZHVwbGljYXRlIGVudHJpZXNcbiIsCi0JICAgICAgIHRhYi0+bGVuIC0gKGludCkgKGRzdCAtIHRhYi0+YmFzZSkpKTsKLQotICB0YWItPmxpbWl0ID0gZHN0OwotICB0YWItPmxlbiA9IHRhYi0+bGltaXQgLSB0YWItPmJhc2U7Ci0KLSAgREJHIChBT1VUREVCVUcgfCBJRERFQlVHLAotICAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICAgZm9yIChqID0gMDsgaiA8IHRhYi0+bGVuOyArK2opCi0gICAgICAgewotICAgICAgIHByaW50ZiAoIltzeW10YWJfZmluYWxpemVdIDB4JWx4LTB4JWx4XHQlc1xuIiwKLQkgICAgICAgKGxvbmcpIHRhYi0+YmFzZVtqXS5hZGRyLCAobG9uZykgdGFiLT5iYXNlW2pdLmVuZF9hZGRyLAotCSAgICAgICB0YWItPmJhc2Vbal0ubmFtZSk7Ci0gICAgICAgfQotICApOwotfQotCi0KLSNpZmRlZiBERUJVRwotCi1TeW0gKgotREVGVU4gKGRiZ19zeW1fbG9va3VwLCAoc3ltdGFiLCBhZGRyZXNzKSwgU3ltX1RhYmxlICogc3ltdGFiIEFORCBiZmRfdm1hIGFkZHJlc3MpCi17Ci0gIGxvbmcgbG93LCBtaWQsIGhpZ2g7Ci0gIFN5bSAqc3ltOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIltkYmdfc3ltX2xvb2t1cF0gYWRkcmVzcyAweCVseFxuIiwKLQkgICAodW5zaWduZWQgbG9uZykgYWRkcmVzcyk7Ci0KLSAgc3ltID0gc3ltdGFiLT5iYXNlOwotICBmb3IgKGxvdyA9IDAsIGhpZ2ggPSBzeW10YWItPmxlbiAtIDE7IGxvdyAhPSBoaWdoOykKLSAgICB7Ci0gICAgICBtaWQgPSAoaGlnaCArIGxvdykgPj4gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIltkYmdfc3ltX2xvb2t1cF0gbG93PTB4JWx4LCBtaWQ9MHglbHgsIGhpZ2g9MHglbHhcbiIsCi0JICAgICAgIGxvdywgbWlkLCBoaWdoKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIltkYmdfc3ltX2xvb2t1cF0gc3ltW21dPTB4JWx4IHN5bVttICsgMV09MHglbHhcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzeW1bbWlkXS5hZGRyLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc3ltW21pZCArIDFdLmFkZHIpOwotICAgICAgaWYgKHN5bVttaWRdLmFkZHIgPD0gYWRkcmVzcyAmJiBzeW1bbWlkICsgMV0uYWRkciA+IGFkZHJlc3MpCi0JewotCSAgcmV0dXJuICZzeW1bbWlkXTsKLQl9Ci0gICAgICBpZiAoc3ltW21pZF0uYWRkciA+IGFkZHJlc3MpCi0JewotCSAgaGlnaCA9IG1pZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG93ID0gbWlkICsgMTsKLQl9Ci0gICAgfQotICBmcHJpbnRmIChzdGRlcnIsICJbZGJnX3N5bV9sb29rdXBdIGJpbmFyeSBzZWFyY2ggZmFpbHM/Pz9cbiIpOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCS8qIERFQlVHICovCi0KLQotLyoKLSAqIExvb2sgdXAgYW4gYWRkcmVzcyBpbiB0aGUgc3ltYm9sLXRhYmxlIHRoYXQgaXMgc29ydGVkIGJ5IGFkZHJlc3MuCi0gKiBJZiBhZGRyZXNzIGRvZXMgbm90IGhpdCBhbnkgc3ltYm9sLCAwIGlzIHJldHVybmVkLgotICovCi1TeW0gKgotREVGVU4gKHN5bV9sb29rdXAsIChzeW10YWIsIGFkZHJlc3MpLCBTeW1fVGFibGUgKiBzeW10YWIgQU5EIGJmZF92bWEgYWRkcmVzcykKLXsKLSAgbG9uZyBsb3csIGhpZ2g7Ci0gIGxvbmcgbWlkID0gLTE7Ci0gIFN5bSAqc3ltOwotI2lmZGVmIERFQlVHCi0gIGludCBwcm9iZXMgPSAwOwotI2VuZGlmIC8qIERFQlVHICovCi0KLSAgaWYgKCFzeW10YWItPmxlbikKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgc3ltID0gc3ltdGFiLT5iYXNlOwotICBmb3IgKGxvdyA9IDAsIGhpZ2ggPSBzeW10YWItPmxlbiAtIDE7IGxvdyAhPSBoaWdoOykKLSAgICB7Ci0gICAgICBEQkcgKExPT0tVUERFQlVHLCArK3Byb2Jlcyk7Ci0gICAgICBtaWQgPSAoaGlnaCArIGxvdykgLyAyOwotICAgICAgaWYgKHN5bVttaWRdLmFkZHIgPD0gYWRkcmVzcyAmJiBzeW1bbWlkICsgMV0uYWRkciA+IGFkZHJlc3MpCi0JewotCSAgaWYgKGFkZHJlc3MgPiBzeW1bbWlkXS5lbmRfYWRkcikKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogQWRkcmVzcyBmYWxscyBpbnRvIGdhcCBiZXR3ZWVuIHN5bVttaWRdIGFuZAotCSAgICAgICAqIHN5bVttaWQgKyAxXToKLQkgICAgICAgKi8KLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgREJHIChMT09LVVBERUJVRywKLQkJICAgcHJpbnRmICgiW3N5bV9sb29rdXBdICVkIHByb2JlcyAoc3ltdGFiLT5sZW49JXUpXG4iLAotCQkJICAgcHJvYmVzLCBzeW10YWItPmxlbiAtIDEpKTsKLQkgICAgICByZXR1cm4gJnN5bVttaWRdOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHN5bVttaWRdLmFkZHIgPiBhZGRyZXNzKQotCXsKLQkgIGhpZ2ggPSBtaWQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvdyA9IG1pZCArIDE7Ci0JfQotICAgIH0KLSAgaWYgKHN5bVttaWQgKyAxXS5hZGRyIDw9IGFkZHJlc3MpCi0gICAgewotICAgICAgaWYgKGFkZHJlc3MgPiBzeW1bbWlkICsgMV0uZW5kX2FkZHIpCi0JewotCSAgLyogYWRkcmVzcyBpcyBiZXlvbmQgZW5kIG9mIHN5bVttaWQgKyAxXTogKi8KLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBEQkcgKExPT0tVUERFQlVHLCBwcmludGYgKCJbc3ltX2xvb2t1cF0gJWQgKCV1KSBwcm9iZXMsIGZhbGwgb2ZmXG4iLAotCQkJCSAgICBwcm9iZXMsIHN5bXRhYi0+bGVuIC0gMSkpOwotCSAgcmV0dXJuICZzeW1bbWlkICsgMV07Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zeW10YWIuaCBiL2dwcm9mL3N5bXRhYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmE0NTBlLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3N5bXRhYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLSNpZm5kZWYgc3ltdGFiX2gKLSNkZWZpbmUgc3ltdGFiX2gKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0KLS8qCi0gKiBGb3IgYSBwcm9maWxlIHRvIGJlIGludGVsbGlnaWJsZSB0byBhIGh1bWFuIHVzZXIsIGl0IGlzIG5lY2Vzc2FyeQotICogdG8gbWFwIGNvZGUtYWRkcmVzc2VzIGludG8gc291cmNlLWNvZGUgaW5mb3JtYXRpb24uICBTb3VyY2UtY29kZQotICogaW5mb3JtYXRpb24gY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZjogKGkpIGZ1bmN0aW9uLW5hbWUsIChpaSkKLSAqIHNvdXJjZSBmaWxlLW5hbWUsIGFuZCAoaWlpKSBzb3VyY2UgbGluZSBudW1iZXIuCi0gKgotICogVGhlIHN5bWJvbCB0YWJsZSBpcyB1c2VkIHRvIG1hcCBhZGRyZXNzZXMgaW50byBzb3VyY2UtY29kZQotICogaW5mb3JtYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgInNvdXJjZS5oIgotCi0jZGVmaW5lIE5CQlMgMTAKLQotLyoKLSAqIFN5bWJvbC1lbnRyeS4gIEZvciBlYWNoIGV4dGVybmFsIGluIHRoZSBzcGVjaWZpZWQgZmlsZSB3ZSBnYXRoZXIKLSAqIGl0cyBhZGRyZXNzLCB0aGUgbnVtYmVyIG9mIGNhbGxzIGFuZCBjb21wdXRlIGl0cyBzaGFyZSBvZiBjcHUgdGltZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3ltCi0gIHsKLSAgICAvKgotICAgICAqIENvbW1vbiBpbmZvcm1hdGlvbjoKLSAgICAgKgotICAgICAqIEluIHRoZSBzeW1ib2wtdGFibGUsIGZpZWxkcyBBRERSIGFuZCBGVU5DX05BTUUgYXJlIGd1YXJhbnRlZWQKLSAgICAgKiB0byBjb250YWluIHZhbGlkIGluZm9ybWF0aW9uLiAgRklMRSBtYXkgYmUgMCwgaWYgdW5rbm93biBhbmQKLSAgICAgKiBMSU5FX05VTSBtYXliZSAwIGlmIHVua25vd24uCi0gICAgICovCi0gICAgYmZkX3ZtYSBhZGRyOwkJLyogYWRkcmVzcyBvZiBlbnRyeSBwb2ludCAqLwotICAgIGJmZF92bWEgZW5kX2FkZHI7CQkvKiBlbmQtYWRkcmVzcyAqLwotICAgIGNvbnN0IGNoYXIgKm5hbWU7CQkvKiBuYW1lIG9mIGZ1bmN0aW9uIHRoaXMgc3ltIGlzIGZyb20gKi8KLSAgICBTb3VyY2VfRmlsZSAqZmlsZTsJCS8qIHNvdXJjZSBmaWxlIHN5bWJvbCBjb21lcyBmcm9tICovCi0gICAgaW50IGxpbmVfbnVtOwkJLyogc291cmNlIGxpbmUgbnVtYmVyICovCi0gICAgdW5zaWduZWQgaW50IGlzX2Z1bmM6MSwJLyogaXMgdGhpcyBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50PyAqLwotICAgICAgaXNfc3RhdGljOjEsCQkvKiBpcyB0aGlzIGEgbG9jYWwgKHN0YXRpYykgc3ltYm9sPyAqLwotICAgICAgaXNfYmJfaGVhZDoxLAkJLyogaXMgdGhpcyB0aGUgaGVhZCBvZiBhIGJhc2ljLWJsaz8gKi8KLSAgICAgIG1hcHBlZDoxLAkJCS8qIHRoaXMgc3ltYm9sIHdhcyBtYXBwZWQgdG8gYW5vdGhlciBuYW1lICovCi0gICAgICBoYXNfYmVlbl9wbGFjZWQ6MTsJLyogaGF2ZSB3ZSBwbGFjZWQgdGhpcyBzeW1ib2w/ICAqLwotICAgIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwkvKiBob3cgbWFueSB0aW1lcyBleGVjdXRlZCAqLwotICAgIGludCBudXNlczsJCQkvKiBob3cgbWFueSB0aW1lcyB0aGlzIHN5bWJvbCBhcHBlYXJzIGluCi0JCQkJICAgYSBwYXJ0aWN1bGFyIGNvbnRleHQgKi8KLSAgICBiZmRfdm1hIGJiX2FkZHJbTkJCU107CS8qIGFkZHJlc3Mgb2YgYmFzaWMtYmxvY2sgc3RhcnQgKi8KLSAgICB1bnNpZ25lZCBsb25nIGJiX2NhbGxzW05CQlNdOyAvKiBob3cgbWFueSB0aW1lcyBiYXNpYy1ibG9jayB3YXMgY2FsbGVkICovCi0gICAgc3RydWN0IHN5bSAqbmV4dDsJCS8qIGZvciBidWlsZGluZyBjaGFpbnMgb2Ygc3ltcyAqLwotICAgIHN0cnVjdCBzeW0gKnByZXY7CQkvKiBmb3IgYnVpbGRpbmcgY2hhaW5zIG9mIHN5bXMgKi8KLQotICAgIC8qIHByb2ZpbGUtc3BlY2lmaWMgaW5mb3JtYXRpb246ICovCi0KLSAgICAvKiBoaXN0b2dyYW0gc3BlY2lmaWMgaW5mbzogKi8KLSAgICBzdHJ1Y3QKLSAgICAgIHsKLQlkb3VibGUgdGltZTsJCS8qICh3ZWlnaHRlZCkgdGlja3MgaW4gdGhpcyByb3V0aW5lICovCi0JYmZkX3ZtYSBzY2FsZWRfYWRkcjsJLyogc2NhbGVkIGVudHJ5IHBvaW50ICovCi0gICAgICB9Ci0gICAgaGlzdDsKLQotICAgIC8qIGNhbGwtZ3JhcGggc3BlY2lmaWMgaW5mbzogKi8KLSAgICBzdHJ1Y3QKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nIHNlbGZfY2FsbHM7IC8qIGhvdyBtYW55IGNhbGxzIHRvIHNlbGYgKi8KLQlkb3VibGUgY2hpbGRfdGltZTsJLyogY3VtdWxhdGl2ZSB0aWNrcyBpbiBjaGlsZHJlbiAqLwotCWludCBpbmRleDsJCS8qIGluZGV4IGluIHRoZSBncmFwaCBsaXN0ICovCi0JaW50IHRvcF9vcmRlcjsJCS8qIGdyYXBoIGNhbGwgY2hhaW4gdG9wLXNvcnQgb3JkZXIgKi8KLQlib29sIHByaW50X2ZsYWc7CS8qIHNob3VsZCB0aGlzIGJlIHByaW50ZWQ/ICovCi0Jc3RydWN0Ci0JICB7Ci0JICAgIGRvdWJsZSBmcmFjdDsJLyogd2hhdCAlIG9mIHRpbWUgcHJvcGFnYXRlcyAqLwotCSAgICBkb3VibGUgc2VsZjsJLyogaG93IG11Y2ggc2VsZiB0aW1lIHByb3BhZ2F0ZXMgKi8KLQkgICAgZG91YmxlIGNoaWxkOwkvKiBob3cgbXVjaCBjaGlsZCB0aW1lIHByb3BhZ2F0ZXMgKi8KLQkgIH0KLQlwcm9wOwotCXN0cnVjdAotCSAgewotCSAgICBpbnQgbnVtOwkJLyogaW50ZXJuYWwgbnVtYmVyIG9mIGN5Y2xlIG9uICovCi0JICAgIHN0cnVjdCBzeW0gKmhlYWQ7CS8qIGhlYWQgb2YgY3ljbGUgKi8KLQkgICAgc3RydWN0IHN5bSAqbmV4dDsJLyogbmV4dCBtZW1iZXIgb2YgY3ljbGUgKi8KLQkgIH0KLQljeWM7Ci0Jc3RydWN0IGFyYyAqcGFyZW50czsJLyogbGlzdCBvZiBjYWxsZXIgYXJjcyAqLwotCXN0cnVjdCBhcmMgKmNoaWxkcmVuOwkvKiBsaXN0IG9mIGNhbGxlZSBhcmNzICovCi0gICAgICB9Ci0gICAgY2c7Ci0gIH0KLVN5bTsKLQotLyoKLSAqIFN5bWJvbC10YWJsZXMgYXJlIGFsd2F5cyBhc3N1bWVkIHRvIGJlIHNvcnRlZCBpbiBpbmNyZWFzaW5nIG9yZGVyCi0gKiBvZiBhZGRyZXNzZXM6Ci0gKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBpbnQgbGVuOwkJLyogIyBvZiBzeW1ib2xzIGluIHRoaXMgdGFibGUgKi8KLSAgICBTeW0gKmJhc2U7CQkJLyogZmlyc3QgZWxlbWVudCBpbiBzeW1ib2wgdGFibGUgKi8KLSAgICBTeW0gKmxpbWl0OwkJCS8qIGxpbWl0ID0gYmFzZSArIGxlbiAqLwotICB9Ci1TeW1fVGFibGU7Ci0KLWV4dGVybiBTeW1fVGFibGUgc3ltdGFiOwkvKiB0aGUgc3ltYm9sIHRhYmxlICovCi0KLWV4dGVybiB2b2lkIHN5bV9pbml0IFBBUkFNUyAoKFN5bSAqIHN5bSkpOwotZXh0ZXJuIHZvaWQgc3ltdGFiX2ZpbmFsaXplIFBBUkFNUyAoKFN5bV9UYWJsZSAqIHN5bXRhYikpOwotZXh0ZXJuIFN5bSAqc3ltX2xvb2t1cCBQQVJBTVMgKChTeW1fVGFibGUgKiBzeW10YWIsIGJmZF92bWEgYWRkcmVzcykpOwotCi1leHRlcm4gdm9pZCBmaW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKLQotI2VuZGlmIC8qIHN5bXRhYl9oICovCmRpZmYgLS1naXQgYS9ncHJvZi90YWhvZS5jIGIvZ3Byb2YvdGFob2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE0YjM1OC4uMDAwMDAwMAotLS0gYS9ncHJvZi90YWhvZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLSAgICAvKgotICAgICAqICAgICAgICBvcGNvZGUgb2YgdGhlIGBjYWxsZicgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSNkZWZpbmUJQ0FMTEYJMHhmZQotCi0gICAgLyoKLSAgICAgKiAgICAgICAgcmVnaXN0ZXIgZm9yIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLSAgICAgKi8KLSNkZWZpbmUJUEMJMHhmCi0KLWVudW0gdGFob2Vfb3Blcm1vZGVzCi0gIHsKLSAgICBsaXRlcmFsLCBpbmRleGVkLCByZWcsIHJlZ2RlZiwgYXV0b2RlYywgYXV0b2luYywgYXV0b2luY2RlZiwKLSAgICBieXRlZGlzcCwgYnl0ZWRpc3BkZWYsIHdvcmRkaXNwLCB3b3JkZGlzcGRlZiwgbG9uZ2Rpc3AsIGxvbmdkaXNwZGVmLAotICAgIGltbWVkaWF0ZSwgYWJzb2x1dGUsIGJ5dGVyZWwsIGJ5dGVyZWxkZWYsIHdvcmRyZWwsIHdvcmRyZWxkZWYsCi0gICAgbG9uZ3JlbCwgbG9uZ3JlbGRlZgotICB9OwotdHlwZWRlZiBlbnVtIHRhaG9lX29wZXJtb2RlcyB0YWhvZV9vcGVyYW5kZW51bTsKLQotLyoKLSAqIEEgc3ltYm9sIHRvIGJlIHRoZSBjaGlsZCBvZiBpbmRpcmVjdCBjYWxsZjoKLSAqLwotU3ltIGluZGlyZWN0Y2hpbGQ7Ci0KLQotdGFob2Vfb3BlcmFuZGVudW0KLXRhaG9lX29wZXJhbmRtb2RlIChtb2RlcCkKLSAgICAgdW5zaWduZWQgY2hhciAqbW9kZXA7Ci17Ci0gIGxvbmcgdXNlc3JlZyA9ICgobG9uZykgKm1vZGVwKSAmIDB4ZjsKLQotICBzd2l0Y2ggKCgobG9uZykgKm1vZGVwKSA+PiA0KQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDM6Ci0gICAgICByZXR1cm4gbGl0ZXJhbDsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gaW5kZXhlZDsKLSAgICBjYXNlIDU6Ci0gICAgICByZXR1cm4gcmVnOwotICAgIGNhc2UgNjoKLSAgICAgIHJldHVybiByZWdkZWY7Ci0gICAgY2FzZSA3OgotICAgICAgcmV0dXJuIGF1dG9kZWM7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gMHhlID8gYXV0b2luYyA6IGltbWVkaWF0ZTsKLSAgICBjYXNlIDk6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGF1dG9pbmNkZWYgOiBhYnNvbHV0ZTsKLSAgICBjYXNlIDEwOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBieXRlZGlzcCA6IGJ5dGVyZWw7Ci0gICAgY2FzZSAxMToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYnl0ZWRpc3BkZWYgOiBieXRlcmVsZGVmOwotICAgIGNhc2UgMTI6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IHdvcmRkaXNwIDogd29yZHJlbDsKLSAgICBjYXNlIDEzOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyB3b3JkZGlzcGRlZiA6IHdvcmRyZWxkZWY7Ci0gICAgY2FzZSAxNDoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gbG9uZ2Rpc3AgOiBsb25ncmVsOwotICAgIGNhc2UgMTU6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGxvbmdkaXNwZGVmIDogbG9uZ3JlbGRlZjsKLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLWNoYXIgKgotdGFob2Vfb3BlcmFuZG5hbWUgKG1vZGUpCi0gICAgIHRhaG9lX29wZXJhbmRlbnVtIG1vZGU7Ci17Ci0KLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBjYXNlIGxpdGVyYWw6Ci0gICAgICByZXR1cm4gImxpdGVyYWwiOwotICAgIGNhc2UgaW5kZXhlZDoKLSAgICAgIHJldHVybiAiaW5kZXhlZCI7Ci0gICAgY2FzZSByZWc6Ci0gICAgICByZXR1cm4gInJlZ2lzdGVyIjsKLSAgICBjYXNlIHJlZ2RlZjoKLSAgICAgIHJldHVybiAicmVnaXN0ZXIgZGVmZXJyZWQiOwotICAgIGNhc2UgYXV0b2RlYzoKLSAgICAgIHJldHVybiAiYXV0b2RlY3JlbWVudCI7Ci0gICAgY2FzZSBhdXRvaW5jOgotICAgICAgcmV0dXJuICJhdXRvaW5jcmVtZW50IjsKLSAgICBjYXNlIGF1dG9pbmNkZWY6Ci0gICAgICByZXR1cm4gImF1dG9pbmNyZW1lbnQgZGVmZXJyZWQiOwotICAgIGNhc2UgYnl0ZWRpc3A6Ci0gICAgICByZXR1cm4gImJ5dGUgZGlzcGxhY2VtZW50IjsKLSAgICBjYXNlIGJ5dGVkaXNwZGVmOgotICAgICAgcmV0dXJuICJieXRlIGRpc3BsYWNlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBieXRlcmVsOgotICAgICAgcmV0dXJuICJieXRlIHJlbGF0aXZlIjsKLSAgICBjYXNlIGJ5dGVyZWxkZWY6Ci0gICAgICByZXR1cm4gImJ5dGUgcmVsYXRpdmUgZGVmZXJyZWQiOwotICAgIGNhc2Ugd29yZGRpc3A6Ci0gICAgICByZXR1cm4gIndvcmQgZGlzcGxhY2VtZW50IjsKLSAgICBjYXNlIHdvcmRkaXNwZGVmOgotICAgICAgcmV0dXJuICJ3b3JkIGRpc3BsYWNlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSB3b3JkcmVsOgotICAgICAgcmV0dXJuICJ3b3JkIHJlbGF0aXZlIjsKLSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0gICAgICByZXR1cm4gIndvcmQgcmVsYXRpdmUgZGVmZXJyZWQiOwotICAgIGNhc2UgaW1tZWRpYXRlOgotICAgICAgcmV0dXJuICJpbW1lZGlhdGUiOwotICAgIGNhc2UgYWJzb2x1dGU6Ci0gICAgICByZXR1cm4gImFic29sdXRlIjsKLSAgICBjYXNlIGxvbmdkaXNwOgotICAgICAgcmV0dXJuICJsb25nIGRpc3BsYWNlbWVudCI7Ci0gICAgY2FzZSBsb25nZGlzcGRlZjoKLSAgICAgIHJldHVybiAibG9uZyBkaXNwbGFjZW1lbnQgZGVmZXJyZWQiOwotICAgIGNhc2UgbG9uZ3JlbDoKLSAgICAgIHJldHVybiAibG9uZyByZWxhdGl2ZSI7Ci0gICAgY2FzZSBsb25ncmVsZGVmOgotICAgICAgcmV0dXJuICJsb25nIHJlbGF0aXZlIGRlZmVycmVkIjsKLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLWxvbmcKLXRhaG9lX29wZXJhbmRsZW5ndGggKG1vZGVwKQotICAgICB1bnNpZ25lZCBjaGFyICptb2RlcDsKLXsKLQotICBzd2l0Y2ggKHRhaG9lX29wZXJhbmRtb2RlIChtb2RlcCkpCi0gICAgewotICAgIGNhc2UgbGl0ZXJhbDoKLSAgICBjYXNlIHJlZzoKLSAgICBjYXNlIHJlZ2RlZjoKLSAgICBjYXNlIGF1dG9kZWM6Ci0gICAgY2FzZSBhdXRvaW5jOgotICAgIGNhc2UgYXV0b2luY2RlZjoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgYnl0ZWRpc3A6Ci0gICAgY2FzZSBieXRlZGlzcGRlZjoKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgY2FzZSBieXRlcmVsZGVmOgotICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSB3b3JkZGlzcDoKLSAgICBjYXNlIHdvcmRkaXNwZGVmOgotICAgIGNhc2Ugd29yZHJlbDoKLSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0gICAgICByZXR1cm4gMzsKLSAgICBjYXNlIGltbWVkaWF0ZToKLSAgICBjYXNlIGFic29sdXRlOgotICAgIGNhc2UgbG9uZ2Rpc3A6Ci0gICAgY2FzZSBsb25nZGlzcGRlZjoKLSAgICBjYXNlIGxvbmdyZWw6Ci0gICAgY2FzZSBsb25ncmVsZGVmOgotICAgICAgcmV0dXJuIDU7Ci0gICAgY2FzZSBpbmRleGVkOgotICAgICAgcmV0dXJuIDEgKyB0YWhvZV9vcGVyYW5kbGVuZ3RoIChtb2RlcCArIDEpOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotYmZkX3ZtYQotdGFob2VfcmVsYWRkciAobW9kZXApCi0gICAgIGNoYXIgKm1vZGVwOwotewotICB0YWhvZV9vcGVyYW5kZW51bSBtb2RlID0gdGFob2Vfb3BlcmFuZG1vZGUgKG1vZGVwKTsKLSAgY2hhciAqY3A7Ci0gIHNob3J0ICpzcDsKLSAgbG9uZyAqbHA7Ci0gIGludCBpOwotICBsb25nIHZhbHVlID0gMDsKLQotICBjcCA9IG1vZGVwOwotICArK2NwOwkJCQkvKiBza2lwIG92ZXIgdGhlIG1vZGUgKi8KLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW3JlbGFkZHJdIG5vdCByZWxhdGl2ZSBhZGRyZXNzXG4iKTsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgbW9kZXA7Ci0gICAgY2FzZSBieXRlcmVsOgotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKmNwICsgKmNwKTsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICBmb3IgKGkgPSAwOyAoc2l6ZV90KSBpIDwgc2l6ZW9mICpzcDsgaSsrKQotCXZhbHVlID0gKHZhbHVlIDw8IDgpICsgKGNwW2ldICYgMHhmZik7Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIChjcCArIHNpemVvZiAqc3AgKyB2YWx1ZSk7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgZm9yIChpID0gMDsgKHNpemVfdCkgaSA8IHNpemVvZiAqbHA7IGkrKykKLQl2YWx1ZSA9ICh2YWx1ZSA8PCA4KSArIChjcFtpXSAmIDB4ZmYpOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKmxwICsgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZAotdGFob2VfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKQotICAgICBTeW0gKnBhcmVudDsKLSAgICAgYmZkX3ZtYSBwX2xvd3BjOwotICAgICBiZmRfdm1hIHBfaGlnaHBjOwotewotICB1bnNpZ25lZCBjaGFyICppbnN0cnVjdHA7Ci0gIGxvbmcgbGVuZ3RoOwotICBTeW0gKmNoaWxkOwotICB0YWhvZV9vcGVyYW5kZW51bSBtb2RlOwotICB0YWhvZV9vcGVyYW5kZW51bSBmaXJzdG1vZGU7Ci0gIGJmZF92bWEgZGVzdHBjOwotICBzdGF0aWMgYm9vbCBpbml0ZWQgPSBGQUxTRTsKLQotICBpZiAoIWluaXRlZCkKLSAgICB7Ci0gICAgICBpbml0ZWQgPSBUUlVFOwotICAgICAgc3ltX2luaXQgKCZpbmRpcmVjdGNoaWxkKTsKLSAgICAgIGluZGlyZWN0Y2hpbGQuY2cucHJvcC5mcmFjdCA9IDEuMDsKLSAgICAgIGluZGlyZWN0Y2hpbGQuY2cuY3ljLmhlYWQgPSAmaW5kaXJlY3RjaGlsZDsKLSAgICB9Ci0KLSAgaWYgKGNvcmVfdGV4dF9zcGFjZSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChwX2xvd3BjIDwgc19sb3dwYykKLSAgICB7Ci0gICAgICBwX2xvd3BjID0gc19sb3dwYzsKLSAgICB9Ci0gIGlmIChwX2hpZ2hwYyA+IHNfaGlnaHBjKQotICAgIHsKLSAgICAgIHBfaGlnaHBjID0gc19oaWdocGM7Ci0gICAgfQotICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiW2ZpbmRjYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIsCi0JCQkgIHBhcmVudC0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIHBfbG93cGMsCi0JCQkgICh1bnNpZ25lZCBsb25nKSBwX2hpZ2hwYykpOwotICBmb3IgKGluc3RydWN0cCA9ICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSArIHBfbG93cGM7Ci0gICAgICAgaW5zdHJ1Y3RwIDwgKHVuc2lnbmVkIGNoYXIgKikgY29yZV90ZXh0X3NwYWNlICsgcF9oaWdocGM7Ci0gICAgICAgaW5zdHJ1Y3RwICs9IGxlbmd0aCkKLSAgICB7Ci0gICAgICBsZW5ndGggPSAxOwotICAgICAgaWYgKCppbnN0cnVjdHAgPT0gQ0FMTEYpCi0JewotCSAgLyoKLQkgICAqICAgIG1heWJlIGEgY2FsbGYsIGJldHRlciBjaGVjayBpdCBvdXQuCi0JICAgKiAgICAgIHNraXAgdGhlIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgotCSAgICovCi0JICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiW2ZpbmRjYWxsXVx0MHgleDpjYWxsZiIsCi0JCQkJICBpbnN0cnVjdHAgLSAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UpKTsKLQkgIGZpcnN0bW9kZSA9IHRhaG9lX29wZXJhbmRtb2RlIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgc3dpdGNoIChmaXJzdG1vZGUpCi0JICAgIHsKLQkgICAgY2FzZSBsaXRlcmFsOgotCSAgICBjYXNlIGltbWVkaWF0ZToKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBnb3RvIGJvdGNoZWQ7Ci0JICAgIH0KLQkgIGxlbmd0aCArPSB0YWhvZV9vcGVyYW5kbGVuZ3RoIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgbW9kZSA9IHRhaG9lX29wZXJhbmRtb2RlIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoIlx0Zmlyc3Qgb3BlcmFuZCBpcyAlcyIsIHRhaG9lX29wZXJhbmRuYW1lIChmaXJzdG1vZGUpKTsKLQkgICAgICAgcHJpbnRmICgiXHRzZWNvbmQgb3BlcmFuZCBpcyAlc1xuIiwgdGFob2Vfb3BlcmFuZG5hbWUgKG1vZGUpKTsKLQkgICAgKTsKLQkgIHN3aXRjaCAobW9kZSkKLQkgICAgewotCSAgICBjYXNlIHJlZ2RlZjoKLQkgICAgY2FzZSBieXRlZGlzcGRlZjoKLQkgICAgY2FzZSB3b3JkZGlzcGRlZjoKLQkgICAgY2FzZSBsb25nZGlzcGRlZjoKLQkgICAgY2FzZSBieXRlcmVsZGVmOgotCSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0JICAgIGNhc2UgbG9uZ3JlbGRlZjoKLQkgICAgICAvKgotCSAgICAgICAqICAgIGluZGlyZWN0IGNhbGw6IGNhbGwgdGhyb3VnaCBwb2ludGVyCi0JICAgICAgICogICAgICBlaXRoZXIgICpkKHIpICAgYXMgYSBwYXJhbWV0ZXIgb3IgbG9jYWwKLQkgICAgICAgKiAgICAgICAgICAgICAgKHIpICAgICBhcyBhIHJldHVybiB2YWx1ZQotCSAgICAgICAqICAgICAgICAgICAgICAqZiAgICAgIGFzIGEgZ2xvYmFsIHBvaW50ZXIKLQkgICAgICAgKiAgICAgIFthcmUgdGhlcmUgb3RoZXJzIHRoYXQgd2UgbWlzcz8sCi0JICAgICAgICogICAgICAgZS5nLiBhcnJheXMgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zPz8/XQotCSAgICAgICAqLwotCSAgICAgIGFyY19hZGQgKHBhcmVudCwgJmluZGlyZWN0Y2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkgICAgICBsZW5ndGggKz0gdGFob2Vfb3BlcmFuZGxlbmd0aCAoaW5zdHJ1Y3RwICsgbGVuZ3RoKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgY2FzZSBieXRlcmVsOgotCSAgICBjYXNlIHdvcmRyZWw6Ci0JICAgIGNhc2UgbG9uZ3JlbDoKLQkgICAgICAvKgotCSAgICAgICAqICAgIHJlZ3VsYXIgcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotCSAgICAgICAqICAgICAgY2hlY2sgdGhhdCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIAotCSAgICAgICAqICAgICAgYSBmdW5jdGlvbi4KLQkgICAgICAgKi8KLQkgICAgICBkZXN0cGMgPSB0YWhvZV9yZWxhZGRyIChpbnN0cnVjdHAgKyBsZW5ndGgpCi0JCS0gKGJmZF92bWEpIGNvcmVfdGV4dF9zcGFjZTsKLQkgICAgICBpZiAoZGVzdHBjID49IHNfbG93cGMgJiYgZGVzdHBjIDw9IHNfaGlnaHBjKQotCQl7Ci0JCSAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBkZXN0cGMpOwotCQkgIERCRyAoQ0FMTERFQlVHLAotCQkgICAgICAgcHJpbnRmICgiW2ZpbmRjYWxsXVx0ZGVzdHBjIDB4JWx4IiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZykgZGVzdHBjKTsKLQkJICAgICAgIHByaW50ZiAoIiBjaGlsZC0+bmFtZSAlcyIsIGNoaWxkLT5uYW1lKTsKLQkJICAgICAgIHByaW50ZiAoIiBjaGlsZC0+YWRkciAweCVseFxuIiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZykgY2hpbGQtPmFkZHIpOwotCQkgICAgKTsKLQkJICBpZiAoY2hpbGQtPmFkZHIgPT0gZGVzdHBjKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKiAgICBhIGhpdAotCQkgICAgICAgKi8KLQkJICAgICAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQkgICAgICBsZW5ndGggKz0gdGFob2Vfb3BlcmFuZGxlbmd0aCAoaW5zdHJ1Y3RwICsgbGVuZ3RoKTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCSAgZ290byBib3RjaGVkOwotCQl9Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICBlbHNlOgotCSAgICAgICAqICAgICAgaXQgbG9va2VkIGxpa2UgYSBjYWxsZiwKLQkgICAgICAgKiAgICAgIGJ1dCBpdCB3YXNuJ3QgdG8gYW55d2hlcmUuCi0JICAgICAgICovCi0JICAgICAgZ290byBib3RjaGVkOwotCSAgICBkZWZhdWx0OgotCSAgICBib3RjaGVkOgotCSAgICAgIC8qCi0JICAgICAgICogICAgc29tZXRoaW5nIGZ1bm55IGdvaW5nIG9uLgotCSAgICAgICAqLwotCSAgICAgIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdXHRidXQgaXQncyBhIGJvdGNoXG4iKSk7Ci0JICAgICAgbGVuZ3RoID0gMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi91dGlscy5jIGIvZ3Byb2YvdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmMDMxZC4uMDAwMDAwMAotLS0gYS9ncHJvZi91dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTggUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSA8ZGVtYW5nbGUuaD4KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotCi0vKgotICogUHJpbnQgbmFtZSBvZiBzeW1ib2wuICBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KLSAqLwotaW50Ci1ERUZVTiAocHJpbnRfbmFtZV9vbmx5LCAoc2VsZiksIFN5bSAqIHNlbGYpCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSBzZWxmLT5uYW1lOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgY2hhciAqZGVtYW5nbGVkID0gMDsKLSAgY2hhciBidWZbUEFUSF9NQVhdOwotICBpbnQgc2l6ZSA9IDA7Ci0KLSAgaWYgKG5hbWUpCi0gICAgewotICAgICAgaWYgKCFic2Rfc3R5bGVfb3V0cHV0KQotCXsKLQkgIGlmIChuYW1lWzBdID09ICdfJyAmJiBuYW1lWzFdICYmIGRpc2NhcmRfdW5kZXJzY29yZXMpCi0JICAgIHsKLQkgICAgICBuYW1lKys7Ci0JICAgIH0KLQkgIGlmIChkZW1hbmdsZSkKLQkgICAgewotCSAgICAgIGRlbWFuZ2xlZCA9IGNwbHVzX2RlbWFuZ2xlIChuYW1lLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7Ci0JICAgICAgaWYgKGRlbWFuZ2xlZCkKLQkJewotCQkgIG5hbWUgPSBkZW1hbmdsZWQ7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIHByaW50ZiAoIiVzIiwgbmFtZSk7Ci0gICAgICBzaXplID0gc3RybGVuIChuYW1lKTsKLSAgICAgIGlmIChsaW5lX2dyYW51bGFyaXR5ICYmIHNlbGYtPmZpbGUpCi0JewotCSAgZmlsZW5hbWUgPSBzZWxmLT5maWxlLT5uYW1lOwotCSAgaWYgKCFwcmludF9wYXRoKQotCSAgICB7Ci0JICAgICAgZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLQkgICAgICBpZiAoZmlsZW5hbWUpCi0JCXsKLQkJICArK2ZpbGVuYW1lOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZmlsZW5hbWUgPSBzZWxmLT5maWxlLT5uYW1lOwotCQl9Ci0JICAgIH0KLQkgIHNwcmludGYgKGJ1ZiwgIiAoJXM6JWQpIiwgZmlsZW5hbWUsIHNlbGYtPmxpbmVfbnVtKTsKLQkgIHByaW50ZiAoYnVmKTsKLQkgIHNpemUgKz0gc3RybGVuIChidWYpOwotCX0KLSAgICAgIGlmIChkZW1hbmdsZWQpCi0JewotCSAgZnJlZSAoZGVtYW5nbGVkKTsKLQl9Ci0gICAgICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJ7JWR9ICIsIHNlbGYtPmNnLnRvcF9vcmRlcikpOwotICAgICAgREJHIChQUk9QREVCVUcsIHByaW50ZiAoIiU0LjBmJSUgIiwgMTAwLjAgKiBzZWxmLT5jZy5wcm9wLmZyYWN0KSk7Ci0gICAgfQotICByZXR1cm4gc2l6ZTsKLX0KLQotCi12b2lkCi1ERUZVTiAocHJpbnRfbmFtZSwgKHNlbGYpLCBTeW0gKiBzZWxmKQotewotICBwcmludF9uYW1lX29ubHkgKHNlbGYpOwotCi0gIGlmIChzZWxmLT5jZy5jeWMubnVtICE9IDApCi0gICAgewotICAgICAgcHJpbnRmIChfKCIgPGN5Y2xlICVkPiIpLCBzZWxmLT5jZy5jeWMubnVtKTsKLSAgICB9Ci0gIGlmIChzZWxmLT5jZy5pbmRleCAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzZWxmLT5jZy5wcmludF9mbGFnKQotCXsKLQkgIHByaW50ZiAoIiBbJWRdIiwgc2VsZi0+Y2cuaW5kZXgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCIgKCVkKSIsIHNlbGYtPmNnLmluZGV4KTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvdXRpbHMuaCBiL2dwcm9mL3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZmI5YzYuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiB1dGlsc19oCi0jZGVmaW5lIHV0aWxzX2gKLQotZXh0ZXJuIGludCBwcmludF9uYW1lX29ubHkgUEFSQU1TICgoU3ltICogc2VsZikpOwotZXh0ZXJuIHZvaWQgcHJpbnRfbmFtZSBQQVJBTVMgKChTeW0gKiBzZWxmKSk7Ci0KLSNlbmRpZiAvKiB1dGlsc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi92YXguYyBiL2dwcm9mL3ZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2ZkZjQzLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3ZheC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLSAgICAvKgotICAgICAqICAgICAgICBvcGNvZGUgb2YgdGhlIGBjYWxscycgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSNkZWZpbmUJQ0FMTFMJMHhmYgotCi0gICAgLyoKLSAgICAgKiAgICAgICAgcmVnaXN0ZXIgZm9yIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLSAgICAgKi8KLSNkZWZpbmUJUEMJMHhmCi0KLWVudW0gb3Blcm1vZGVzCi0gIHsKLSAgICBsaXRlcmFsLCBpbmRleGVkLCByZWcsIHJlZ2RlZiwgYXV0b2RlYywgYXV0b2luYywgYXV0b2luY2RlZiwKLSAgICBieXRlZGlzcCwgYnl0ZWRpc3BkZWYsIHdvcmRkaXNwLCB3b3JkZGlzcGRlZiwgbG9uZ2Rpc3AsIGxvbmdkaXNwZGVmLAotICAgIGltbWVkaWF0ZSwgYWJzb2x1dGUsIGJ5dGVyZWwsIGJ5dGVyZWxkZWYsIHdvcmRyZWwsIHdvcmRyZWxkZWYsCi0gICAgbG9uZ3JlbCwgbG9uZ3JlbGRlZgotICB9OwotdHlwZWRlZiBlbnVtIG9wZXJtb2RlcyBvcGVyYW5kZW51bTsKLQotc3RydWN0IG1vZGVieXRlCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgcmVnZmllbGQ6NDsKLSAgICB1bnNpZ25lZCBpbnQgbW9kZWZpZWxkOjQ7Ci0gIH07Ci0KLS8qCi0gKiBBIHN5bWJvbCB0byBiZSB0aGUgY2hpbGQgb2YgaW5kaXJlY3QgY2FsbHM6Ci0gKi8KLVN5bSBpbmRpcmVjdGNoaWxkOwotCi0KLXN0YXRpYyBvcGVyYW5kZW51bQotdmF4X29wZXJhbmRtb2RlIChtb2RlcCkKLSAgICAgc3RydWN0IG1vZGVieXRlICptb2RlcDsKLXsKLSAgbG9uZyB1c2VzcmVnID0gbW9kZXAtPnJlZ2ZpZWxkOwotCi0gIHN3aXRjaCAobW9kZXAtPm1vZGVmaWVsZCkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIGxpdGVyYWw7Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuIGluZGV4ZWQ7Ci0gICAgY2FzZSA1OgotICAgICAgcmV0dXJuIHJlZzsKLSAgICBjYXNlIDY6Ci0gICAgICByZXR1cm4gcmVnZGVmOwotICAgIGNhc2UgNzoKLSAgICAgIHJldHVybiBhdXRvZGVjOwotICAgIGNhc2UgODoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYXV0b2luYyA6IGltbWVkaWF0ZTsKLSAgICBjYXNlIDk6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGF1dG9pbmNkZWYgOiBhYnNvbHV0ZTsKLSAgICBjYXNlIDEwOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBieXRlZGlzcCA6IGJ5dGVyZWw7Ci0gICAgY2FzZSAxMToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYnl0ZWRpc3BkZWYgOiBieXRlcmVsZGVmOwotICAgIGNhc2UgMTI6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IHdvcmRkaXNwIDogd29yZHJlbDsKLSAgICBjYXNlIDEzOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyB3b3JkZGlzcGRlZiA6IHdvcmRyZWxkZWY7Ci0gICAgY2FzZSAxNDoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gbG9uZ2Rpc3AgOiBsb25ncmVsOwotICAgIGNhc2UgMTU6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGxvbmdkaXNwZGVmIDogbG9uZ3JlbGRlZjsKLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXZheF9vcGVyYW5kbmFtZSAobW9kZSkKLSAgICAgb3BlcmFuZGVudW0gbW9kZTsKLXsKLQotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGNhc2UgbGl0ZXJhbDoKLSAgICAgIHJldHVybiAibGl0ZXJhbCI7Ci0gICAgY2FzZSBpbmRleGVkOgotICAgICAgcmV0dXJuICJpbmRleGVkIjsKLSAgICBjYXNlIHJlZzoKLSAgICAgIHJldHVybiAicmVnaXN0ZXIiOwotICAgIGNhc2UgcmVnZGVmOgotICAgICAgcmV0dXJuICJyZWdpc3RlciBkZWZlcnJlZCI7Ci0gICAgY2FzZSBhdXRvZGVjOgotICAgICAgcmV0dXJuICJhdXRvZGVjcmVtZW50IjsKLSAgICBjYXNlIGF1dG9pbmM6Ci0gICAgICByZXR1cm4gImF1dG9pbmNyZW1lbnQiOwotICAgIGNhc2UgYXV0b2luY2RlZjoKLSAgICAgIHJldHVybiAiYXV0b2luY3JlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBieXRlZGlzcDoKLSAgICAgIHJldHVybiAiYnl0ZSBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2UgYnl0ZWRpc3BkZWY6Ci0gICAgICByZXR1cm4gImJ5dGUgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgICByZXR1cm4gImJ5dGUgcmVsYXRpdmUiOwotICAgIGNhc2UgYnl0ZXJlbGRlZjoKLSAgICAgIHJldHVybiAiYnl0ZSByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSB3b3JkZGlzcDoKLSAgICAgIHJldHVybiAid29yZCBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2Ugd29yZGRpc3BkZWY6Ci0gICAgICByZXR1cm4gIndvcmQgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICByZXR1cm4gIndvcmQgcmVsYXRpdmUiOwotICAgIGNhc2Ugd29yZHJlbGRlZjoKLSAgICAgIHJldHVybiAid29yZCByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSBpbW1lZGlhdGU6Ci0gICAgICByZXR1cm4gImltbWVkaWF0ZSI7Ci0gICAgY2FzZSBhYnNvbHV0ZToKLSAgICAgIHJldHVybiAiYWJzb2x1dGUiOwotICAgIGNhc2UgbG9uZ2Rpc3A6Ci0gICAgICByZXR1cm4gImxvbmcgZGlzcGxhY2VtZW50IjsKLSAgICBjYXNlIGxvbmdkaXNwZGVmOgotICAgICAgcmV0dXJuICJsb25nIGRpc3BsYWNlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgcmV0dXJuICJsb25nIHJlbGF0aXZlIjsKLSAgICBjYXNlIGxvbmdyZWxkZWY6Ci0gICAgICByZXR1cm4gImxvbmcgcmVsYXRpdmUgZGVmZXJyZWQiOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIGxvbmcKLXZheF9vcGVyYW5kbGVuZ3RoIChtb2RlcCkKLSAgICAgc3RydWN0IG1vZGVieXRlICptb2RlcDsKLXsKLQotICBzd2l0Y2ggKHZheF9vcGVyYW5kbW9kZSAobW9kZXApKQotICAgIHsKLSAgICBjYXNlIGxpdGVyYWw6Ci0gICAgY2FzZSByZWc6Ci0gICAgY2FzZSByZWdkZWY6Ci0gICAgY2FzZSBhdXRvZGVjOgotICAgIGNhc2UgYXV0b2luYzoKLSAgICBjYXNlIGF1dG9pbmNkZWY6Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIGJ5dGVkaXNwOgotICAgIGNhc2UgYnl0ZWRpc3BkZWY6Ci0gICAgY2FzZSBieXRlcmVsOgotICAgIGNhc2UgYnl0ZXJlbGRlZjoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2Ugd29yZGRpc3A6Ci0gICAgY2FzZSB3b3JkZGlzcGRlZjoKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgY2FzZSB3b3JkcmVsZGVmOgotICAgICAgcmV0dXJuIDM7Ci0gICAgY2FzZSBpbW1lZGlhdGU6Ci0gICAgY2FzZSBhYnNvbHV0ZToKLSAgICBjYXNlIGxvbmdkaXNwOgotICAgIGNhc2UgbG9uZ2Rpc3BkZWY6Ci0gICAgY2FzZSBsb25ncmVsOgotICAgIGNhc2UgbG9uZ3JlbGRlZjoKLSAgICAgIHJldHVybiA1OwotICAgIGNhc2UgaW5kZXhlZDoKLSAgICAgIHJldHVybiAxICsgdmF4X29wZXJhbmRsZW5ndGggKChzdHJ1Y3QgbW9kZWJ5dGUgKikgKChjaGFyICopIG1vZGVwKSArIDEpOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIGJmZF92bWEKLXZheF9yZWxhZGRyIChtb2RlcCkKLSAgICAgc3RydWN0IG1vZGVieXRlICptb2RlcDsKLXsKLSAgb3BlcmFuZGVudW0gbW9kZSA9IHZheF9vcGVyYW5kbW9kZSAobW9kZXApOwotICBjaGFyICpjcDsKLSAgc2hvcnQgKnNwOwotICBsb25nICpscDsKLQotICBjcCA9IChjaGFyICopIG1vZGVwOwotICArK2NwOwkJCQkvKiBza2lwIG92ZXIgdGhlIG1vZGUgKi8KLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW3JlbGFkZHJdIG5vdCByZWxhdGl2ZSBhZGRyZXNzXG4iKTsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgbW9kZXA7Ci0gICAgY2FzZSBieXRlcmVsOgotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKmNwICsgKmNwKTsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICBzcCA9IChzaG9ydCAqKSBjcDsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgKGNwICsgc2l6ZW9mICpzcCArICpzcCk7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgbHAgPSAobG9uZyAqKSBjcDsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgKGNwICsgc2l6ZW9mICpscCArICpscCk7Ci0gICAgfQotfQotCi0KLXZvaWQKLXZheF9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmluc3RydWN0cDsKLSAgbG9uZyBsZW5ndGg7Ci0gIFN5bSAqY2hpbGQ7Ci0gIG9wZXJhbmRlbnVtIG1vZGU7Ci0gIG9wZXJhbmRlbnVtIGZpcnN0bW9kZTsKLSAgYmZkX3ZtYSBkZXN0cGM7Ci0gIHN0YXRpYyBib29sIGluaXRlZCA9IEZBTFNFOwotCi0gIGlmICghaW5pdGVkKQotICAgIHsKLSAgICAgIGluaXRlZCA9IFRSVUU7Ci0gICAgICBzeW1faW5pdCAoJmluZGlyZWN0Y2hpbGQpOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5wcm9wLmZyYWN0ID0gMS4wOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5jeWMuaGVhZCA9ICZpbmRpcmVjdGNoaWxkOwotICAgIH0KLQotICBpZiAoY29yZV90ZXh0X3NwYWNlID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdICVzOiAweCVseCB0byAweCVseFxuIiwKLQkJCSAgcGFyZW50LT5uYW1lLCAodW5zaWduZWQgbG9uZykgcF9sb3dwYywKLQkJCSAgKHVuc2lnbmVkIGxvbmcpIHBfaGlnaHBjKSk7Ci0gIGZvciAoaW5zdHJ1Y3RwID0gKHVuc2lnbmVkIGNoYXIgKikgY29yZV90ZXh0X3NwYWNlICsgcF9sb3dwYzsKLSAgICAgICBpbnN0cnVjdHAgPCAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UgKyBwX2hpZ2hwYzsKLSAgICAgICBpbnN0cnVjdHAgKz0gbGVuZ3RoKQotICAgIHsKLSAgICAgIGxlbmd0aCA9IDE7Ci0gICAgICBpZiAoKmluc3RydWN0cCA9PSBDQUxMUykKLQl7Ci0JICAvKgotCSAgICogICAgbWF5YmUgYSBjYWxscywgYmV0dGVyIGNoZWNrIGl0IG91dC4KLQkgICAqICAgICAgc2tpcCB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCi0JICAgKi8KLQkgIERCRyAoQ0FMTERFQlVHLAotCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHQweCV4OmNhbGxzIiwKLQkJICAgICAgIGluc3RydWN0cCAtICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSkpOwotCSAgZmlyc3Rtb2RlID0gdmF4X29wZXJhbmRtb2RlICgoc3RydWN0IG1vZGVieXRlICopIChpbnN0cnVjdHAgKyBsZW5ndGgpKTsKLQkgIHN3aXRjaCAoZmlyc3Rtb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgbGl0ZXJhbDoKLQkgICAgY2FzZSBpbW1lZGlhdGU6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZ290byBib3RjaGVkOwotCSAgICB9Ci0JICBsZW5ndGggKz0gdmF4X29wZXJhbmRsZW5ndGggKChzdHJ1Y3QgbW9kZWJ5dGUgKikgKGluc3RydWN0cCArIGxlbmd0aCkpOwotCSAgbW9kZSA9IHZheF9vcGVyYW5kbW9kZSAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSk7Ci0JICBEQkcgKENBTExERUJVRywKLQkgICAgICAgcHJpbnRmICgiXHRmaXJzdCBvcGVyYW5kIGlzICVzIiwgdmF4X29wZXJhbmRuYW1lIChmaXJzdG1vZGUpKTsKLQkgICAgICAgcHJpbnRmICgiXHRzZWNvbmQgb3BlcmFuZCBpcyAlc1xuIiwgdmF4X29wZXJhbmRuYW1lIChtb2RlKSkpOwotCSAgc3dpdGNoIChtb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgcmVnZGVmOgotCSAgICBjYXNlIGJ5dGVkaXNwZGVmOgotCSAgICBjYXNlIHdvcmRkaXNwZGVmOgotCSAgICBjYXNlIGxvbmdkaXNwZGVmOgotCSAgICBjYXNlIGJ5dGVyZWxkZWY6Ci0JICAgIGNhc2Ugd29yZHJlbGRlZjoKLQkgICAgY2FzZSBsb25ncmVsZGVmOgotCSAgICAgIC8qCi0JICAgICAgICogICAgaW5kaXJlY3QgY2FsbDogY2FsbCB0aHJvdWdoIHBvaW50ZXIKLQkgICAgICAgKiAgICAgIGVpdGhlciAgKmQocikgICBhcyBhIHBhcmFtZXRlciBvciBsb2NhbAotCSAgICAgICAqICAgICAgICAgICAgICAocikgICAgIGFzIGEgcmV0dXJuIHZhbHVlCi0JICAgICAgICogICAgICAgICAgICAgICpmICAgICAgYXMgYSBnbG9iYWwgcG9pbnRlcgotCSAgICAgICAqICAgICAgW2FyZSB0aGVyZSBvdGhlcnMgdGhhdCB3ZSBtaXNzPywKLQkgICAgICAgKiAgICAgICBlLmcuIGFycmF5cyBvZiBwb2ludGVycyB0byBmdW5jdGlvbnM/Pz9dCi0JICAgICAgICovCi0JICAgICAgYXJjX2FkZCAocGFyZW50LCAmaW5kaXJlY3RjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCSAgICAgIGxlbmd0aCArPSB2YXhfb3BlcmFuZGxlbmd0aCAoCi0JCQkJICAoc3RydWN0IG1vZGVieXRlICopIChpbnN0cnVjdHAgKyBsZW5ndGgpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgY2FzZSBieXRlcmVsOgotCSAgICBjYXNlIHdvcmRyZWw6Ci0JICAgIGNhc2UgbG9uZ3JlbDoKLQkgICAgICAvKgotCSAgICAgICAqICAgIHJlZ3VsYXIgcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotCSAgICAgICAqICAgICAgY2hlY2sgdGhhdCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIAotCSAgICAgICAqICAgICAgYSBmdW5jdGlvbi4KLQkgICAgICAgKi8KLQkgICAgICBkZXN0cGMgPSB2YXhfcmVsYWRkciAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSkKLQkJLSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlOwotCSAgICAgIGlmIChkZXN0cGMgPj0gc19sb3dwYyAmJiBkZXN0cGMgPD0gc19oaWdocGMpCi0JCXsKLQkJICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RwYyk7Ci0JCSAgREJHIChDQUxMREVCVUcsCi0JCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHRkZXN0cGMgMHglbHgiLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBkZXN0cGMpOwotCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5uYW1lICVzIiwgY2hpbGQtPm5hbWUpOwotCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5hZGRyIDB4JWx4XG4iLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBjaGlsZC0+YWRkcik7Ci0JCSAgICApOwotCQkgIGlmIChjaGlsZC0+YWRkciA9PSBkZXN0cGMpCi0JCSAgICB7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqICAgIGEgaGl0Ci0JCSAgICAgICAqLwotCQkgICAgICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JCSAgICAgIGxlbmd0aCArPSB2YXhfb3BlcmFuZGxlbmd0aCAoKHN0cnVjdCBtb2RlYnl0ZSAqKQotCQkJCQkJICAgKGluc3RydWN0cCArIGxlbmd0aCkpOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJICBnb3RvIGJvdGNoZWQ7Ci0JCX0KLQkgICAgICAvKgotCSAgICAgICAqICAgIGVsc2U6Ci0JICAgICAgICogICAgICBpdCBsb29rZWQgbGlrZSBhIGNhbGxzLAotCSAgICAgICAqICAgICAgYnV0IGl0IHdhc24ndCB0byBhbnl3aGVyZS4KLQkgICAgICAgKi8KLQkgICAgICBnb3RvIGJvdGNoZWQ7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGJvdGNoZWQ6Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICBzb21ldGhpbmcgZnVubnkgZ29pbmcgb24uCi0JICAgICAgICovCi0JICAgICAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF1cdGJ1dCBpdCdzIGEgYm90Y2hcbiIpKTsKLQkgICAgICBsZW5ndGggPSAxOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvQ09QWUlORyBiL2luY2x1ZGUvQ09QWUlORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1NDliZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL0NPUFlJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwotdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQotdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCi15b3VyIHByb2dyYW1zLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91Ci1kaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgotcmlnaHRzLgotCi0gIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKLSgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCi1kaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgotCi0gIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwotdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKLWF1dGhvcnMnIHJlcHV0YXRpb25zLgotCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCi1wcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCi1wcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKLXBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuCi0MCi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0MCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCi13aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAotdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCi1TZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCi0gICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCi0gICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQotICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCi0gICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQotICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQotICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCi0gICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKLSAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKLQotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKLWNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Ci1hc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KLWNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKLXNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQotYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKLWZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAotaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCi1hY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50Ci1hY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQwKLSAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi1leGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0Ci1vdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKLXZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KLUhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCi10aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAotcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KLXRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotCi0gIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KLWFwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCi1jaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQwKLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0JICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKLWZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi0gIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Ci10byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAotdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgotCi0gICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgotICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKLSAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCi0KLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQotcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQotYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCi1tb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCi0gIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KLXByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Ci1jb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKLWxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9pbmNsdWRlL0NoYW5nZUxvZyBiL2luY2x1ZGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjA2YWJhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTU2MSArMCwwIEBACi1TdW4gT2N0IDI0IDE5OjExOjMyIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWQxMHYuaCAoU0lNX0QxMFZfVFMyX0RNQVBfUkVHTlVNKTogRGVmaW5lLgotCi1TYXQgT2N0IDIzIDE5OjAwOjEzIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2ltLWQxMHYuaDogTmV3IGZpbGUuCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3BqKTogRGVjbGFyZS4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFuc2lkZWNsLmg6IENvcHkgYXR0cmlidXRlIHN1cHBvcnQgbWFjcm9zIGZyb20gZWdjcy4KLQotMTk5OS0wNi0yMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBpbml0X2Z1bmN0aW9uIGFuZAotCWZpbmlfZnVuY3Rpb24uCi0KLTE5OTktMDYtMjAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+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+/RuZy1UaOVvIFb1LCBhbmQKLQlKb2huIEdpbG1vcmUuCi0KLQkqIGEub3V0LmdudS5oOiAgVXBkYXRlIHNsaWdodGx5LgotCSogYmZkLmg6ICBBZGQgbmV3IGVycm9yIGNvZGUsIGZpeCBkb2MsIGFkZCBiZmRfYXJjaF9yczYwMDAuCi0JKiBpbnRlcm5hbGNvZmYuaDogIEFkZCBtb3JlIEZfIGNvZGVzIGZvciBmaWxlaGRyLiAgQWRkCi0JcnMvNjAwMC1kZXBlbmRlbnQgZmllbGRzIHRvIGFvdXRoZHIuICBBZGQgc3RvcmFnZSBjbGFzc2VzCi0JdG8gc3ltZW50cy4gIEFkZCA2MDAwLXNwZWNpZmljIGF1eGVudC4gIEFkZCByX3NpemUgaW4gcmVsb2MuCi0JKiByczYwMDBjb2ZmLmM6ICBOZXcgZmlsZS4KLQotVGh1IE9jdCAyNCAwNDoxMzoyMCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaDogTmV3IGZpbGUgZm9yIGR3YXJmIHN1cHBvcnQuICBDb3BpZWQgZnJvbSBnY2MyCi0JZGlzdHJpYnV0aW9uLgotCi1XZWQgT2N0IDE2IDEzOjMxOjQ1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaDogIFJlbW92ZSBQQUdFX1NJWkUgZGVmaW5lczsgdGhleSBhcmUgdGFyZ2V0LWRlcGVuZGVudC4KLQlBZGQgTl9GTl9TRVEgZm9yIE5fRk4gc3ltYm9sIHR5cGUgdXNlZCBvbiBTZXF1ZW50IG1hY2hpbmVzLgotCSogc3RhYi5kZWY6ICBJbmNsdWRlIE5fRk5fU0VRIGluIHRhYmxlLgotCSogYm91dC5oOiAgRXh0ZXJuYWwgZm9ybWF0cyBvZiBzdHJ1Y3R1cmVzIHVzZSB1bnNpZ25lZCBjaGFycy4KLQotRnJpIE9jdCAxMSAxMjo0MDo0MyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOnVwZ3JhZGUgZnJvbSBiZmQuYwotCSogaW50ZXJuYWxjb2ZmLmg6IGFkZCBuX25hbWUsIG5femVyb2VzIGFuZCBuX29mZnNldCBtYWNyb3MKLQkqIGFtZGNvZmYuaDogRGVmaW5lIE9NQUdJQyBhbmQgQU9VVEhEUlNaLgotCi1GcmkgT2N0IDExIDEwOjU4OjA2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhLm91dC5ob3N0Lmg6IENoYW5nZSBTRUdNRU5UX1NJWkUgdG8gMHgxMDAwIGZvciBTb255LgotCSogYmZkLmggKGFsaWduX3Bvd2VyKTogQWRkIChhY3R1YWxseSBtb3ZlKSBjb21tZW50LgotCi1UdWUgT2N0ICA4IDE1OjI5OjMyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzeXMvaC1ydGJzZC5oOiBEZWZpbmUgTUlTU0lOR19WRlBSSU5UIChmb3IgYmludXRpbHMvYnVjb21tLmMpLgotCi1TdW4gT2N0ICA2IDE5OjI0OjM5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaDogIE1vdmUgc3RydWN0IGludGVybmFsX2V4ZWMgdG8gLi4vYmZkL2xpYmFvdXQuaCBzbwotCWl0IGNhbiBiZSBzaGFyZWQgYnkgYWxsIGBhLm91dC1mYW1pbHknIGNvZGUuICBSZW5hbWUKLQlFWFRFUk5BTF9MSVNUX1NJWkUgdG8gRVhURVJOQUxfTkxJU1RfU0laRS4gIFVzZSBiYXNpYyB0eXBlcwotCWZvciBubGlzdCBtZW1iZXJzLCBhbmQgbWFrZSBzdHJ4IGludGVncmFsIHJhdGhlciB0aGFuIHBvaW50ZXIuCi0JTW9yZSBjb21tZW50YXJ5IG9uIG5fdHlwZSB2YWx1ZXMuCi0JKiBib3V0Lmg6ICBQcm92aWRlIGEgc3RydWN0IGV4dGVybmFsX2V4ZWMgcmF0aGVyIHRoYW4gYW4KLQlpbnRlcm5hbF9leGVjLgotCSogbTY4a2NvZmYuaDogIFJlbW92ZSBgdGFnZW50cmllcycgd2hpY2ggc251Y2sgaW4gZnJvbSB0aGUgaTk2MAotCUNPRkYgcG9ydC4KLQotRnJpIE9jdCAgNCAwMToyNTo1OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtb3Bjb2RlLmg6ICBSZW1vdmUgYF9lbnVtJyBmcm9tIHRoZSB0eXBlZGVmIGZvciBhbiBlbnVtLgotCSogYmZkLmg6ICBVcGRhdGUgdG8gbWF0Y2ggYmZkIGNoYW5nZXMuCi0KLQkqIHN5cy9oLWkzODZtYWNoLmgsIHN5c2RlcC5oOiAgQWRkIDM4NiBNYWNoIGhvc3Qgc3VwcG9ydC4KLQotVHVlIE9jdCAgMSAwNDo1ODo0MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmgsIGVsZi1jb21tb24uaCwgZWxmLWV4dGVybmFsLmgsIGVsZi1pbnRlcm5hbC5oOgotCUFkZCBwcmVsaW1pbmFyeSBFTEYgc3VwcG9ydCwgc3VmZmljaWVudCBmb3IgR0RCLCBmcm9tIEZyZWQgRmlzaC4KLQkqIHN5c2RlcC5oLCBzeXMvaC1hbWl4Lmg6ICBTdXBwb3J0IEFtaWdhIFNWUjQuCi0KLQkqIHN5cy9oLXZheHVsdC5oOiAgTWFrZSBpdCB3b3JrLiAgKERhdmlkIFRheWxvciA8dGF5bG9yQHRoaW5rLmNvbT4pCi0JKiBhLm91dC52YXguaDogIFJlbW92ZSB1bnVzZWQgYW5kIGNvbmZ1c2luZyBmaWxlLgotCi1Nb24gU2VwIDMwIDEyOjUyOjM1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzeXNkZXAuaDogRGVmaW5lIE5FV1NPUzNfU1lTLCBhbmQgdXNlIGl0LgotCi1GcmkgU2VwIDIwIDEzOjM4OjIxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhLm91dC5nbnUuaCAoTl9GTik6ICBJdHMgdmFsdWUgKnJlYWxseSBpcyogMHgxRi4KLQlGaXggaXQsIGFuZCBhZGQgY29tbWVudHMgd2FybmluZyBhYm91dCBvci1pbmcgTl9FWFQgd2l0aCBpdAotCWFuZC9vciBOX1dBUk5JTkcuCi0JKiBhb3V0NjQuaCAoTl9GTik6ICBGaXggdmFsdWUsIGFkZCBjb21tZW50cyBhYm91dCBOX0VYVC4KLQkqIHN0YWIuZGVmICh0YWJsZSBhdCBlbmQpOiAgVXBkYXRlIHRvIHNob3cgYWxsIHRoZSB0eXBlCi0JdmFsdWVzIDwweDIwLCBpbmNsdWRpbmcgbG93IG9yZGVyIGJpdHMuICBNb3ZlIE5fRk4gdG8KLQlpdHMgcmlnaHRmdWwgcGxhY2UuCi0KLVR1ZSBTZXAgMTcgMTc6NDE6MzcgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogc3lzL2gtaXJpeDMuaDogIHNnaS9pcml4IHN1cHBvcnQuCi0KLVR1ZSBTZXAgMTcgMDc6NTI6NTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBzdGFiLmRlZiAoTl9ERUZEKTogIEFkZCBHTlUgTW9kdWxhLTIgZGVidWcgc3RhYiwgZnJvbSBBbmRyZXcKLQlCZWVycy4KLQotVGh1IFNlcCAxMiAxNDoxMjo1OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsY29mZi5oIChTWU1OTUxFTiwgRklMTk1MRU4sIERJTU5VTSk6ICBEZWZpbmUgdGhlc2UKLQlmb3IgaW50ZXJuYWxjb2ZmLCBzZXBhcmF0ZWx5IGZyb20gdGhlIHZhcmlvdXMgZXh0ZXJuYWwgY29mZidzLgotCSogYW1kY29mZi5oLCBiY3M4OGtjb2ZmLmgsIGkzODZjb2ZmLmgsIGludGVsLWNvZmYuaCwgbTY4a2NvZmYuaCwKLQltODhrLWJjcy5oOiBQcmVmaXggU1lNTk1MRU4sIEZJTE5NTEVOLCBhbmQgRElNTlVNIHdpdGggRV8ncyBmb3IKLQl0aGUgZXh0ZXJuYWwgc3RydWN0IGRlZmluaXRpb25zLgotCSogZWNvZmYuaDogUmVtb3ZlIHRoZXNlICNkZWZpbmUncywga2x1ZGdlIG5vIGxvbmdlciBuZWVkZWQuCi0KLQkqIHN5cy9oLXVsdHJhMy5oOiAgQWRkIG5ldyBVbHRyYWNvbXB1dGVyIGhvc3QuCi0JKiBzeXNkZXAuaDogIEFkZCBVTFRSQTNfU1lNMV9TWVMgYW5kIHVzZSBpdC4KLQotVHVlIFNlcCAxMCAxMDoxMTo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGkzODZjb2ZmLmggKExJTkVTWik6ICBBbHdheXMgNiwgbm90IGJhc2VkIG9uIHNpemVvZigpLgotCShGaXggZnJvbSBQZXRlciBTY2hhdWVyIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4uKQotCi1XZWQgU2VwICA0IDA4OjU4OjM3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYS5vdXQuZ251LmgsIGFvdXQ2NC5oOiAgQWRkIE5fV0FSTklORy4gIENoYW5nZSBOX0ZOIHRvIDB4MEUsCi0JdG8gbWF0Y2ggU3VuT1MgYW5kIEJTRC4gIEFkZCBOX0NPTU0gYXMgMHgxMiBmb3IgU3VuT1Mgc2hhcmVkIGxpYgotCXN1cHBvcnQuCi0JKiBzdGFiLmRlZjogIEFkZCBOX0NPTU0gdG8gdGFibGUsIGZpeCBvdmVybGFwIGNvbW1lbnQuCi0KLVR1ZSBTZXAgIDMgMDY6Mjk6MjAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JTWVyZ2Ugd2l0aCBsYXRlc3QgRlNGIHZlcnNpb25zIG9mIHRoZXNlIGZpbGVzLgotCi0JKiBzdGFiLmdudS5oOiAgQWRkIExBU1RfVU5VU0VEX1NUQUJfQ09ERS4KLQkqIHN0YWIuZGVmOiAgVXBkYXRlIHRvIEdQTDIuICBNb3ZlIE5fV0FSTklORyBvdXQsIHNpbmNlIG5vdCBhCi0JZGVidWcgc3ltYm9sLiAgQ2hhbmdlIGNvbW1lbnRzLCBhbmQgcmVvcmRlciB0YWJsZSB0byBudW1lcmljCi0Jb3JkZXIuICBVcGRhdGUgZmluYWwgdGFibGUgY29tbWVudC4KLQkoTl9EU0xJTkUsIE5fQlNMSU5FKTogIFJlbnVtYmVyIGZyb20gMHg2NiBhbmQgMHg2OCwgdG8gMHg0NiBhbmQgMHg0OC4KLQotCSogb2JzdGFjay5oOiAgR1BMMi4gIE1lcmdlLgotCi1GcmkgQXVnIDIzIDAxOjU0OjIzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYS5vdXQuZ251LmgsIGEub3V0LnN1bjQuaDogIE1ha2UgU0VHTUVOVF9TSVpFIGFibGUgdG8gZGVwZW5kCi0Jb24gdGhlIHBhcnRpY3VsYXIgYS5vdXQgYmVpbmcgZXhhbWluZWQuCi0JKiBhLm91dC5zdW40Lmg6ICBEZWZpbmUgc2VnbWVudCBzaXplcyBmb3IgU3VuLTMncyBhbmQgU3VuLTQncy4KLQkqIEZJWE1FOiAgYS5vdXQuZ251LmggaXMgYWxtb3N0IG9ic29sZXRlLgotCSogRklYTUU6ICBhLm91dC5zdW40Lmggc2hvdWxkIGJlIHJlbmFtZWQgYS5vdXQuc3VuLmggbm93LgotCi1XZWQgQXVnIDIxIDIwOjMyOjEzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogU3RhcnQgYSBDaGFuZ2VMb2cgZm9yIHRoZSBpbmNsdWRlcyBkaXJlY3RvcnkuCi0KLQkqIGEub3V0LmdudS5oIChOX0ZOKTogIEZpeCB2YWx1ZSAtLSB3YXMgMTUsIHNob3VsZCBiZSAweDFFLgotCSogc3RhYi5kZWY6ICBVcGRhdGUgYWxsb2NhdGlvbiB0YWJsZSBpbiBjb21tZW50cyBhdCBlbmQsCi0JdG8gcmVmbGVjdCByZWFsaXR5IGFzIEkga25vdyBpdC4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hbnNpZGVjbC5oIGIvaW5jbHVkZS9hbnNpZGVjbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODlkZDY3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW5zaWRlY2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKiBBTlNJIGFuZCB0cmFkaXRpb25hbCBDIGNvbXBhdGFiaWxpdHkgbWFjcm9zCi0gICBDb3B5cmlnaHQgMTk5MSwgMTk5MiwgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBTlNJIGFuZCB0cmFkaXRpb25hbCBDIGNvbXBhdGliaWxpdHkgbWFjcm9zCi0KLSAgIEFOU0kgQyBpcyBhc3N1bWVkIGlmIF9fU1REQ19fIGlzICNkZWZpbmVkLgotCi0gICBNYWNybwlBTlNJIEMgZGVmaW5pdGlvbglUcmFkaXRpb25hbCBDIGRlZmluaXRpb24KLSAgIC0tLS0tCS0tLS0gLSAtLS0tLS0tLS0tCS0tLS0tLS0tLS0tIC0gLS0tLS0tLS0tLQotICAgUFRSCQlgdm9pZCAqJwkJYGNoYXIgKicKLSAgIExPTkdfRE9VQkxFCWBsb25nIGRvdWJsZScJCWBkb3VibGUnCi0gICBWT0xBVElMRQlgdm9sYXRpbGUnCQlgJwotICAgU0lHTkVECWBzaWduZWQnCQlgJwotICAgUFRSQ09OU1QJYHZvaWQgKmNvbnN0JwkJYGNoYXIgKicKLSAgIEFOU0lfUFJPVE9UWVBFUyAgMQkJCW5vdCBkZWZpbmVkCi0KLSAgIENPTlNUIGlzIGFsc28gZGVmaW5lZCwgYnV0IGlzIG9ic29sZXRlLiAgSnVzdCB1c2UgY29uc3QuCi0KLSAgIG9ic29sZXRlIC0tICAgICBERUZVTiAobmFtZSwgYXJnbGlzdCwgYXJncykKLQotCURlZmluZXMgZnVuY3Rpb24gTkFNRS4KLQotCUFSR0xJU1QgbGlzdHMgdGhlIGFyZ3VtZW50cywgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgZW5jbG9zZWQgaW4KLQlwYXJlbnRoZXNlcy4gIEFSR0xJU1QgYmVjb21lcyB0aGUgYXJndW1lbnQgbGlzdCBpbiB0cmFkaXRpb25hbCBDLgotCi0JQVJHUyBsaXN0IHRoZSBhcmd1bWVudHMgd2l0aCB0aGVpciB0eXBlcy4gIEl0IGJlY29tZXMgYSBwcm90b3R5cGUgaW4KLQlBTlNJIEMsIGFuZCB0aGUgdHlwZSBkZWNsYXJhdGlvbnMgaW4gdHJhZGl0aW9uYWwgQy4gIEFyZ3VtZW50cyBzaG91bGQKLQliZSBzZXBhcmF0ZWQgd2l0aCBgQU5EJy4gIEZvciBmdW5jdGlvbnMgd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZgotCWFyZ3VtZW50cywgdGhlIGxhc3QgdGhpbmcgbGlzdGVkIHNob3VsZCBiZSBgRE9UUycuCi0KLSAgIG9ic29sZXRlIC0tICAgICBERUZVTl9WT0lEIChuYW1lKQotCi0JRGVmaW5lcyBhIGZ1bmN0aW9uIE5BTUUsIHdoaWNoIHRha2VzIG5vIGFyZ3VtZW50cy4KLQotICAgb2Jzb2xldGUgLS0gICAgIEVYRlVOIChuYW1lLCAocHJvdG90eXBlKSkJLS0gb2Jzb2xldGUuCi0KLQlSZXBsYWNlZCBieSBQQVJBTVMuICBEbyBub3QgdXNlOyB3aWxsIGRpc2FwcGVhciBzb21lZGF5IHNvb24uCi0JV2FzIHVzZWQgaW4gZXh0ZXJuYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCUluIEFOU0kgQyBpdCBpcyBgTkFNRSBQUk9UT1RZUEUnIChzbyBQUk9UT1RZUEUgc2hvdWxkIGJlIGVuY2xvc2VkIGluCi0JcGFyZW50aGVzZXMpLiAgSW4gdHJhZGl0aW9uYWwgQyBpdCBpcyBgTkFNRSgpJy4KLQlGb3IgYSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cywgUFJPVE9UWVBFIHNob3VsZCBiZSBgKHZvaWQpJy4KLQotICAgb2Jzb2xldGUgLS0gICAgIFBST1RPICh0eXBlLCBuYW1lLCAocHJvdG90eXBlKSAgICAtLSBvYnNvbGV0ZS4KLQotCVRoaXMgb25lIGhhcyBhbHNvIGJlZW4gcmVwbGFjZWQgYnkgUEFSQU1TLiAgRG8gbm90IHVzZS4KLQotICAgUEFSQU1TICgoYXJncykpCi0KLQlXZSBjb3VsZCB1c2UgdGhlIEVYRlVOIG1hY3JvIHRvIGhhbmRsZSBwcm90b3R5cGUgZGVjbGFyYXRpb25zLCBidXQKLQl0aGUgbmFtZSBpcyBtaXNsZWFkaW5nIGFuZCB0aGUgcmVzdWx0IGlzIHVnbHkuICBTbyB3ZSBqdXN0IGRlZmluZSBhCi0Jc2ltcGxlIG1hY3JvIHRvIGhhbmRsZSB0aGUgcGFyYW1ldGVyIGxpc3RzLCBhcyBpbjoKLQotCSAgICAgIHN0YXRpYyBpbnQgZm9vIFBBUkFNUyAoKGludCwgY2hhcikpOwotCi0JVGhpcyBwcm9kdWNlczogIGBzdGF0aWMgaW50IGZvbygpOycgb3IgYHN0YXRpYyBpbnQgZm9vIChpbnQsIGNoYXIpOycKLQotCUVYRlVOIHdvdWxkIGhhdmUgZG9uZSBpdCBsaWtlIHRoaXM6Ci0KLQkgICAgICBzdGF0aWMgaW50IEVYRlVOIChmb28sIChpbnQsIGNoYXIpKTsKLQotCWJ1dCB0aGUgZnVuY3Rpb24gaXMgbm90IGV4dGVybmFsLi4uYW5kIGl0J3MgaGFyZCB0byB2aXN1YWxseSBwYXJzZQotCXRoZSBmdW5jdGlvbiBuYW1lIG91dCBvZiB0aGUgbWVzcy4gICBFWEZVTiBzaG91bGQgYmUgY29uc2lkZXJlZAotCW9ic29sZXRlOyBuZXcgY29kZSBzaG91bGQgYmUgd3JpdHRlbiB0byB1c2UgUEFSQU1TLgotCi0gICBET1RTIGlzIGFsc28gb2Jzb2xldGUuCi0KLSAgIEV4YW1wbGVzOgotCi0JZXh0ZXJuIGludCBwcmludGYgUEFSQU1TICgoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pKTsKLSovCi0KLSNpZm5kZWYJX0FOU0lERUNMX0gKLQotI2RlZmluZQlfQU5TSURFQ0xfSAkxCi0KLQotLyogRXZlcnkgc291cmNlIGZpbGUgaW5jbHVkZXMgdGhpcyBmaWxlLAotICAgc28gdGhleSB3aWxsIGFsbCBnZXQgdGhlIHN3aXRjaCBmb3IgbGludC4gICovCi0vKiBMSU5UTElCUkFSWSAqLwotCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX0FJWCkgfHwgKGRlZmluZWQgKF9fbWlwcykgJiYgZGVmaW5lZCAoX1NZU1RZUEVfU1ZSNCkpIHx8IGRlZmluZWQoX1dJTjMyKQotLyogQWxsIGtub3duIEFJWCBjb21waWxlcnMgaW1wbGVtZW50IHRoZXNlIHRoaW5ncyAoYnV0IGRvbid0IGFsd2F5cwotICAgZGVmaW5lIF9fU1REQ19fKS4gIFRoZSBSSVNDL09TIE1JUFMgY29tcGlsZXIgZGVmaW5lcyB0aGVzZSB0aGluZ3MKLSAgIGluIFNWUjQgbW9kZSwgYnV0IGRvZXMgbm90IGRlZmluZSBfX1NURENfXy4gICovCi0KLSNkZWZpbmUJUFRSCQl2b2lkICoKLSNkZWZpbmUJUFRSQ09OU1QJdm9pZCAqQ09OU1QKLSNkZWZpbmUJTE9OR19ET1VCTEUJbG9uZyBkb3VibGUKLQotI2lmbmRlZiBJTl9HQ0MKLSNkZWZpbmUJQU5ECQksCi0jZGVmaW5lCU5PQVJHUwkJdm9pZAotI2RlZmluZQlWT0xBVElMRQl2b2xhdGlsZQotI2RlZmluZQlTSUdORUQJCXNpZ25lZAotI2VuZGlmIC8qICEgSU5fR0NDICovCi0KLSNkZWZpbmUgUEFSQU1TKHBhcmFtbGlzdCkJCXBhcmFtbGlzdAotI2RlZmluZSBBTlNJX1BST1RPVFlQRVMJCQkxCi0KLSNkZWZpbmUgVlBBUkFNUyhBUkdTKQkJCUFSR1MKLSNkZWZpbmUgVkFfU1RBUlQodmFfbGlzdCx2YXIpCQl2YV9zdGFydCh2YV9saXN0LHZhcikKLQotLyogVGhlc2UgYXJlIG9ic29sZXRlLiAgRG8gbm90IHVzZS4gICovCi0jaWZuZGVmIElOX0dDQwotI2RlZmluZSBDT05TVAkJCQljb25zdAotI2RlZmluZSBET1RTCQkJCSwgLi4uCi0jZGVmaW5lIFBST1RPKHR5cGUsIG5hbWUsIGFyZ2xpc3QpCXR5cGUgbmFtZSBhcmdsaXN0Ci0jZGVmaW5lIEVYRlVOKG5hbWUsIHByb3RvKQkJbmFtZSBwcm90bwotI2RlZmluZSBERUZVTihuYW1lLCBhcmdsaXN0LCBhcmdzKQluYW1lKGFyZ3MpCi0jZGVmaW5lIERFRlVOX1ZPSUQobmFtZSkJCW5hbWUodm9pZCkKLSNlbmRpZiAvKiAhIElOX0dDQyAqLwotCi0jZWxzZQkvKiBOb3QgQU5TSSBDLiAgKi8KLQotI2RlZmluZQlQVFIJCWNoYXIgKgotI2RlZmluZQlQVFJDT05TVAlQVFIKLSNkZWZpbmUJTE9OR19ET1VCTEUJZG91YmxlCi0KLSNpZm5kZWYgSU5fR0NDCi0jZGVmaW5lCUFORAkJOwotI2RlZmluZQlOT0FSR1MKLSNkZWZpbmUJVk9MQVRJTEUKLSNkZWZpbmUJU0lHTkVECi0jZW5kaWYgLyogIUlOX0dDQyAqLwotCi0jaWZuZGVmIGNvbnN0IC8qIHNvbWUgc3lzdGVtcyBkZWZpbmUgaXQgaW4gaGVhZGVyIGZpbGVzIGZvciBub24tYW5zaSBtb2RlICovCi0jZGVmaW5lCWNvbnN0Ci0jZW5kaWYKLQotI2RlZmluZSBQQVJBTVMocGFyYW1saXN0KQkJKCkKLQotI2RlZmluZSBWUEFSQU1TKEFSR1MpCQkJKHZhX2FsaXN0KSB2YV9kY2wKLSNkZWZpbmUgVkFfU1RBUlQodmFfbGlzdCx2YXIpCQl2YV9zdGFydCh2YV9saXN0KQotCi0vKiBUaGVzZSBhcmUgb2Jzb2xldGUuICBEbyBub3QgdXNlLiAgKi8KLSNpZm5kZWYgSU5fR0NDCi0jZGVmaW5lIENPTlNUCi0jZGVmaW5lIERPVFMKLSNkZWZpbmUgUFJPVE8odHlwZSwgbmFtZSwgYXJnbGlzdCkJdHlwZSBuYW1lICgpCi0jZGVmaW5lIEVYRlVOKG5hbWUsIHByb3RvKQkJbmFtZSgpCi0jZGVmaW5lIERFRlVOKG5hbWUsIGFyZ2xpc3QsIGFyZ3MpCW5hbWUgYXJnbGlzdCBhcmdzOwotI2RlZmluZSBERUZVTl9WT0lEKG5hbWUpCQluYW1lKCkKLSNlbmRpZiAvKiAhIElOX0dDQyAqLwotCi0jZW5kaWYJLyogQU5TSSBDLiAgKi8KLQotLyogRGVmaW5lIG1hY3JvcyBmb3Igc29tZSBnY2MgYXR0cmlidXRlcy4gIFRoaXMgcGVybWl0cyB1cyB0byB1c2UgdGhlCi0gICBtYWNyb3MgZnJlZWx5LCBhbmQga25vdyB0aGF0IHRoZXkgd2lsbCBjb21lIGludG8gcGxheSBmb3IgdGhlCi0gICB2ZXJzaW9uIG9mIGdjYyBpbiB3aGljaCB0aGV5IGFyZSBzdXBwb3J0ZWQuICAqLwotCi0jaWYgX19HTlVDX18gPCAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNykKLSMgZGVmaW5lIF9fYXR0cmlidXRlX18oeCkKLSNlbmRpZgotCi0jaWZuZGVmIEFUVFJJQlVURV9VTlVTRURfTEFCRUwKLSMgaWYgX19HTlVDX18gPCAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgOTMpCi0jICBkZWZpbmUgQVRUUklCVVRFX1VOVVNFRF9MQUJFTAotIyBlbHNlCi0jICBkZWZpbmUgQVRUUklCVVRFX1VOVVNFRF9MQUJFTCBBVFRSSUJVVEVfVU5VU0VECi0jIGVuZGlmIC8qIEdOVUMgPCAyLjkzICovCi0jZW5kaWYgLyogQVRUUklCVVRFX1VOVVNFRF9MQUJFTCAqLwotCi0jaWZuZGVmIEFUVFJJQlVURV9VTlVTRUQKLSNkZWZpbmUgQVRUUklCVVRFX1VOVVNFRCBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCi0jZW5kaWYgLyogQVRUUklCVVRFX1VOVVNFRCAqLwotCi0jaWZuZGVmIEFUVFJJQlVURV9OT1JFVFVSTgotI2RlZmluZSBBVFRSSUJVVEVfTk9SRVRVUk4gX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpCi0jZW5kaWYgLyogQVRUUklCVVRFX05PUkVUVVJOICovCi0KLSNpZm5kZWYgQVRUUklCVVRFX1BSSU5URgotI2RlZmluZSBBVFRSSUJVVEVfUFJJTlRGKG0sIG4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKF9fcHJpbnRmX18sIG0sIG4pKSkKLSNkZWZpbmUgQVRUUklCVVRFX1BSSU5URl8xIEFUVFJJQlVURV9QUklOVEYoMSwgMikKLSNkZWZpbmUgQVRUUklCVVRFX1BSSU5URl8yIEFUVFJJQlVURV9QUklOVEYoMiwgMykKLSNkZWZpbmUgQVRUUklCVVRFX1BSSU5URl8zIEFUVFJJQlVURV9QUklOVEYoMywgNCkKLSNkZWZpbmUgQVRUUklCVVRFX1BSSU5URl80IEFUVFJJQlVURV9QUklOVEYoNCwgNSkKLSNkZWZpbmUgQVRUUklCVVRFX1BSSU5URl81IEFUVFJJQlVURV9QUklOVEYoNSwgNikKLSNlbmRpZiAvKiBBVFRSSUJVVEVfUFJJTlRGICovCi0KLSNlbmRpZgkvKiBhbnNpZGVjbC5oCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvQ2hhbmdlTG9nIGIvaW5jbHVkZS9hb3V0L0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNmMTdlYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLTE5OTktMDctMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBhb3V0NjQuaCAoTl9TSEFSRURfTElCKTogRGVmaW5lIGFzIDAgaWYgVEVYVF9TVEFSVF9BRERSIGlzCi0JZGVmaW5lZCBhcyAwLgotCi1TdW4gSnVuIDI4IDExOjMzOjQ4IDE5OTggIFBldGVyIFNjaGF1ZXIgIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4KLQotCSogc3RhYi5kZWY6ICBBZGQgTl9BTElBUyBmcm9tIFN1blBybyBGNzcuCi0KLU1vbiBNYXIgMTEgMTI6MTU6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFiLmRlZjogVXNlIF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlIHJhdGhlciB0aGFuIF9fZGVmaW5lX3N0YWIKLQlmb3IgZHVwbGljYXRlIGVudHJpZXMgTl9CUk9XUyBhbmQgTl9NT0QyLgotCSogc3RhYl9nbnUuaCAoX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUpOiBEZWZpbmUgYmVmb3JlIGluY2x1ZGluZwotCXN0YWIuZGVmLgotCi1GcmkgT2N0IDI3IDE3OjQ3OjE2IDE5OTUgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGFvdXQ2NC5oLCBob3N0LmgsIGhwMzAwaHB1eC5oLCBzdW40Lmg6IENoYW5nZWQgUEFHRV9TSVpFIHRvCi0JVEFSR0VUX1BBR0VfU0laRS4KLQotVHVlIFNlcCAxMiAxMjowNzowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bjQuaCAoc3RydWN0IGludGVybmFsX3N1bjRfZHluYW1pY19saW5rKTogQ2hhbmdlIGFsbCBmaWVsZHMKLQlmcm9tIGxvbmcgdG8gdW5zaWduZWQgbG9uZy4KLQotV2VkIEp1bCAxMiAwMDoxNToxMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogc3VuNC5oIChQQUdFX1NJWkUpOiBVbmRlZmluZSBiZWZvcmUgZGVmaW5pbmcuCi0KLVRodSBKdW4gMTYgMTQ6MjI6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoQk1BR0lDKTogRGVmaW5lLgotCi1TYXQgSnVuIDExIDE2OjE2OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCB3ZWFrIHN5bWJvbHMgYXMgYW4gZXh0ZW5zaW9uIHRvIGEub3V0LgotCSogYW91dDY0LmggKE5fV0VBS1UsIE5fV0VBS0EsIE5fV0VBS1QsIE5fV0VBS0QsIE5fV0VBS0IpOiBEZWZpbmUuCi0JKiBzdGFiLmRlZjogVXBkYXRlIHN5bWJvbCB2YWx1ZSB0YWJsZS4KLQotVGh1IEp1biAgMiAxNzoxMzozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHN1bjQuaCAoRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUpOiBDb3JyZWN0IGZyb20gMjggdG8KLQkyNC4gIEZpeCB1cCBsZF9nb3QgY29tbWVudC4KLQotV2VkIE1hciAzMCAwMDozMTo0OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGR5bml4My5oOiAgQ2xlYW51cCwgYWRhcHQgdG8gY3VycmVudCBiZmQgdmVyc2lvbi4KLQotU2F0IEZlYiAyNiAxMDoyNTo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBTVlI0IGNjLgotCi1GcmkgRmViIDExIDEyOjU2OjA0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXIuaCAoQVJNQUcsIEFSTUFHQiwgQVJGTUFHKTogQ2hhbmdlICdcbicgdG8gJ1wwMTInLCBmb3IgZ3JlYXRlcgotCXBvcnRhYmlsaXR5LgotCi1GcmkgSmFuIDIxIDAwOjU5OjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc3VuNC5oOiBBZGRlZCBpbmZvcm1hdGlvbiBhYm91dCBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLgotCi1GcmkgSmFuICA3IDA4OjIwOjEzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoTl9UWFRBRERSKTogQWRkIGNvbW1lbnQgcmVnYXJkaW5nIE9NQUdJQyBhbmQgTk1BR0lDLgotCi1TYXQgRGVjIDI1IDE0OjU1OjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoTl9EQVRPRkYpOiBEb24ndCBwYWQgKHJldmVydCBjaGFuZ2Ugb2YgOCBKdWwgMTk5MykuCi0KLVR1ZSBOb3YgMTYgMTU6NDM6NDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oOiBOZXcgbWFjcm9zIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgYW5kIE5fRElTS19CTE9DS19TSVpFCi0JZm9yIExpbnV4IFpNQUdJQy4KLQkoTl9UWFRPRkYsIE5fREFUT0ZGKTogVXNlIHRoZW0uCi0KLVRodSBOb3YgIDQgMDA6MzM6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIChSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUpOiBGaXhlZCB2YWx1ZSB0byBtYXRjaAotCXN1bjMgc3lzdGVtOyB1c2VkIHRvIG92ZXJsYXAgb3RoZXIgZmllbGRzLgotCShSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpOiBMaWtld2lzZS4KLQotV2VkIE5vdiAgMyAxMzo0ODoyNyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIChSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSk6IE1ha2UgaXQgMHgxMCAoS2VuJ3MKLQlzdWdnZXN0aW9uKSB0byBhdm9pZCBjb25mbGljdCB3aXRoIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUuCi0KLUZyaSBPY3QgMjkgMTU6MDk6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBocDMwMGhwdXguaCAoTl9TSEFSRURfTElCKTogRGVmaW5lIHRvIGJlIDAuCi0KLU1vbiBTZXAgMTMgMjE6MDA6NTYgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGFyLmggKEFSTUFQX1RJTUVfT0ZGU0VUKTogIEFkZCBhbmQgZGVzY3JpYmUuCi0KLU1vbiBBdWcgMjMgIFNlYW4gRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggW0FSQ0hfU0laRSAhPSA2NF06IEFsbG93IE5fQkFETUFHIHRvIGJlIG92ZXJyaWRkZW4uCi0KLU1vbiBBdWcgMTYgMTQ6MzA6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN0YWJfZ251Lmg6IEluY2x1ZGUgYW91dC9zdGFiLmRlZiBub3QganVzdCBzdGFiLmRlZi4KLQotU3VuIEp1bCAxOCAyMTo0MTo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIGR5bml4My5oOiBOZXcsIGZvciBzeW1tZXRyeSBydW5uaW5nIGR5bml4LgotCi1UaHUgSnVsICA4IDEyOjUyOjIyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoTl9CQURNQUcpOiBSZWNvZ25pemUgUU1BR0lDLgotCU5fVFhUT0ZGLCBOX1RYVEFERFIsIE5fVFhUU0laRTogU3BlY2lhbCBjb2RlIGZvciBRTUFHSUMuCi0JTl9EQVRPRkY6IFBhZCB0ZXh0IHNpemUgaWYgd2UgbmVlZCB0by4KLQotRnJpIEp1biAxOCAxOToxOTozOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWYgKE5fRUNPTUwpOiBGaXggY29tbWVudC4KLQotTW9uIE1heSAzMSAwOToyMTozMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6IFJlbW92ZSBTb2xhcmlzIGluZm9ybWF0aW9uIG9uIE5fRlVOIHN0YWJzdHJpbmcgZ3JhbW1hcjsKLQlJJ3ZlIHRyYW5zZmVycmVkIGl0IHRvIGdkYi9kb2Mvc3RhYnMudGV4aW5mbywgd2hlcmUgaXQgYmVsb25ncy4KLQotTW9uIE1heSAxMCAwNTo0ODo0MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogaHAzMDBocHV4Lmg6IFBhdGNoIGZyb20gR2xlbm4gRW5nZWwgZm9yIGxpbmtlciBwcm9ibGVtIGFuZAotCWNvbXBhdGliaWxpdHkgZml4OgotCShPTUFHSUMsIE5NQUdJQyk6IE5ldyBkZWZpbml0aW9ucy4KLQkoU0hBUkVNQUdJQyk6IERlbGV0ZWQuCi0JKEhQVVhfRE9UX09fTUFHSUMpOiBOZXcgbWFjcm8uCi0JKF9OX0JBRE1BRyk6IEFkanVzdGVkLgotCShOX0hFQURFUl9JTl9URVhULCBOX0RBVEFERFIpOiBOZXcgbWFjcm9zLgotCi1UaHUgQXByIDI5IDEyOjA3OjM3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBocDMwMGhwdXguaDogTmV3IGZpbGUgZnJvbSBHbGVubiBFbmdlbCwgZ2xlbm5lQGxzaWQuaHAuY29tLgotCi1UdWUgQXByIDI3IDA1OjUxOjA0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoc3RydWN0IGV4dGVybmFsX2V4ZWMsICpNQUdJQywgTl9CQURNQUcpOiBEb24ndCBkZWZpbmUKLQlpZiBgZXh0ZXJuYWxfZXhlYycgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgbWFjcm8uCi0JKE5fREFUT0ZGLCBOX1RSRUxPRkYsIE5fRFJFTE9GRiwgTl9TWU1PRkYsIE5fU1RST0ZGKTogRG9uJ3QgZGVmaW5lCi0JaWYgYWxyZWFkeSBkZWZpbmVkLgotCShzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QsIEVYVEVSTkFMX05MSVNUX1NJWkUpOiBEb24ndCBkZWZpbmUgaWYKLQlgZXh0ZXJuYWxfbmxpc3QnIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi1TYXQgQXVnIDE1IDA0OjIzOjAyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhZG9iZS5oOiAgQWRkIGRlc2NyaXB0aW9uIG9mIGEub3V0LmFkb2JlIGZvcm1hdC4KLQotRnJpIEp1bCAgMyAwMDozNjo1MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6ICBVcGRhdGUgbW9yZSBTb2xhcmlzIGRlZmluaXRpb25zLgotCSogc3RhYl9nbnUuaDogIEFkZCBOX1NPIGxhbmd1YWdlIHR5cGVzLCBhbmQgU29sYXJpcyBiYXNpYyBmbG9hdCB0eXBlcy4KLQotU3VuIEp1biAxNCAxMDo1Mzo1MyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6ICBVcGRhdGUgZGVzY3JpcHRpb25zIG9mIFNvbGFyaXMtMiBzdGFiczsgYWRkIE5fVU5ERi4KLQotVGh1IEp1biAxMSAwMToxMjowNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi5kZWY6ICBBZGQgTl9PQkogYW5kIE5fT1BUIGZyb20gU29sYXJpcy0yLgotCi1UaHUgSmFuIDMwIDE4OjEyOjQ0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0L2FvdXQ2NC5oOiBOX1RYVFNJWkUgbmVlZHMgc29tZSBtb3JlIHBhcmVudGhlc2VzLgotCUkgZG9uJ3QgdHJ1c3QgQyBwcmVjZWRlbmNlLgotCi1XZWQgRGVjIDE4IDE0OjMyOjAxIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0L2FvdXQ2NC5oOiAgTW92ZSBjb21tb24gc3Vub3Mtc3BlY2lmaWMgdGVzdAotCXRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzIGludG8gbmV3IG1hY3JvIE5fU0hBUkVEX0xJQi4KLQlVc2UgaXQgdG8gc2ltcGxpZnkmcmVmb3JtYXQgTl9UWFRBRERSLCBOX1RYVE9GRiwgTl9UWFRTSVpFLgotCi1TYXQgTm92IDMwIDIwOjM0OjUyIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBDaGFuZ2VMb2csIGFvdXQ2NC5oLCBhci5oLCBlbmNhcC5oLCBob3N0LmgsIGhwLmgsIHJhbmxpYi5oLAotCXJlbG9jLmgsIHN0YWIuZGVmLCBzdGFiX2dudS5oLCBzdW40Lmg6IEFsbCBtb3ZlZCBmcm9tIHRoZQotCWRldm8vaW5jbHVkZSBkaXJlY3RvcnkKLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2Fkb2JlLmggYi9pbmNsdWRlL2FvdXQvYWRvYmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyZjE1Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvYWRvYmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKiBgYS5vdXQuYWRvYmUnIGRpZmZlcmVuY2VzIGZyb20gc3RhbmRhcmQgYS5vdXQgZmlsZXMgKi8KLQotI2lmbmRlZiBfX0FfT1VUX0FET0JFX0hfXwotI2RlZmluZSBfX0FfT1VUX0FET0JFX0hfXwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotCi0vKiBTdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBpcyB0aGUgc2FtZS4gICovCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBvbiBkaXNrIG9mIHRoZSAzMi1iaXQgb3IgNjQtYml0IGV4ZWMgaGVhZGVyLiAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAKLXsKLSAgYmZkX2J5dGUgZV9pbmZvWzRdOwkJLyogbWFnaWMgbnVtYmVyIGFuZCBzdHVmZgkJKi8KLSAgYmZkX2J5dGUgZV90ZXh0W0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCBzZWN0aW9uIGluIGJ5dGVzCSovCi0gIGJmZF9ieXRlIGVfZGF0YVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGRhdGEgc2VjdGlvbiBpbiBieXRlcwkqLwotICBiZmRfYnl0ZSBlX2Jzc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGJzcyBhcmVhIGluIGJ5dGVzIAkJKi8KLSAgYmZkX2J5dGUgZV9zeW1zW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGluIGJ5dGVzIAkqLwotICBiZmRfYnl0ZSBlX2VudHJ5W0JZVEVTX0lOX1dPUkRdOyAvKiBzdGFydCBhZGRyZXNzIAkJCSovCi0gIGJmZF9ieXRlIGVfdHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCByZWxvY2F0aW9uIGluZm8JKi8KLSAgYmZkX2J5dGUgZV9kcnNpemVbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHJlbG9jYXRpb24gaW5mbyAJKi8KLX07Ci0KLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCSg0ICsgQllURVNfSU5fV09SRCAqIDcpCi0KLS8qIE1hZ2ljIG51bWJlcnMgZm9yIGEub3V0IGZpbGVzICovCi0KLSN1bmRlZglaTUFHSUMKLSNkZWZpbmUJWk1BR0lDCTB4QUQwQkUJCS8qIEN1dGUsIGVoPyAgKi8KLSN1bmRlZglPTUFHSUMKLSN1bmRlZglOTUFHSUMKLQotI2RlZmluZSBOX0JBRE1BRyh4KQkgICgoeCkuYV9pbmZvICE9IFpNQUdJQykKLQotLyogQnkgZGVmYXVsdCwgc2VnbWVudCBzaXplIGlzIGNvbnN0YW50LiAgQnV0IHNvbWUgbWFjaGluZXMgb3ZlcnJpZGUgdGhpcwotICAgdG8gYmUgYSBmdW5jdGlvbiBvZiB0aGUgYS5vdXQgaGVhZGVyIChlLmcuIG1hY2hpbmUgdHlwZSkuICAqLwotI2lmbmRlZglOX1NFR1NJWkUKLSNkZWZpbmUJTl9TRUdTSVpFKHgpCVNFR01FTlRfU0laRQotI2VuZGlmCi0jdW5kZWYgTl9TRUdTSVpFICAgLyogRklYTUVYWFhYICovCi0KLS8qIFNlZ21lbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBhLm91dC5BZG9iZSBmb3JtYXQgaXMgc3BlY2lmaWVkIGFmdGVyIHRoZQotICAgZmlsZSBoZWFkZXIuICBJdCBjb250YWlucyBOIHNlZ21lbnQgZGVzY3JpcHRvcnMsIGZvbGxvd2VkIGJ5IG9uZSB3aXRoCi0gICBhIHR5cGUgb2YgemVyby4gIAotCi0gICBUaGUgYWN0dWFsIHRleHQgb2YgdGhlIHNlZ21lbnRzIHN0YXJ0cyBhdCBOX1RYVE9GRiBpbiB0aGUgZmlsZSwKLSAgIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgb3IgaG93IGZldyBzZWdtZW50IGhlYWRlcnMgdGhlcmUgYXJlLiAgKi8KLQotc3RydWN0IGV4dGVybmFsX3NlZ2Rlc2MgewotCXVuc2lnbmVkIGNoYXIgZV90eXBlWzFdOwotCXVuc2lnbmVkIGNoYXIgZV9zaXplWzNdOwotCXVuc2lnbmVkIGNoYXIgZV92aXJ0YmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfZmlsZWJhc2VbNF07Ci19OwotCi1zdHJ1Y3QgaW50ZXJuYWxfc2VnZGVzYyB7Ci0JdW5zaWduZWQgaW50CWFfdHlwZTo4OwkvKiBTZWdtZW50IHR5cGUgTl9URVhULCBOX0RBVEEsIDAgKi8KLQl1bnNpZ25lZCBpbnQgCWFfc2l6ZToyNDsJLyogU2VnbWVudCBzaXplICovCi0JYmZkX3ZtYQkJYV92aXJ0YmFzZTsJLyogVmlydHVhbCBhZGRyZXNzICovCi0JdW5zaWduZWQgaW50CWFfZmlsZWJhc2U7CS8qIEJhc2UgYWRkcmVzcyBpbiBvYmplY3QgZmlsZSAqLwotfTsKLQotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotCi0vKiBUaGlzIGlzIGRvY3VtZW50ZWQgdG8gYmUgYXQgMTAyNCwgYnV0IGFwcGVhcnMgdG8gcmVhbGx5IGJlIGF0IDIwNDguCi0gICBGSVhNRT8hICAqLwotI2RlZmluZSBOX1RYVE9GRih4KQkyMDQ4Ci0KLSNkZWZpbmUJTl9UWFRTSVpFKHgpICgoeCkuYV90ZXh0KQotCi0jZGVmaW5lIE5fREFUQUREUih4KQotCi0jZGVmaW5lIE5fQlNTQUREUih4KQotCi0vKiBPZmZzZXRzIG9mIHRoZSB2YXJpb3VzIHBvcnRpb25zIG9mIHRoZSBmaWxlIGFmdGVyIHRoZSB0ZXh0IHNlZ21lbnQuICAqLwotCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkgKQotI2RlZmluZSBOX1RSRUxPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2RlZmluZSBOX0RSRUxPRkYoeCkJKCBOX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUgKQotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLQwKLS8qIFN5bWJvbHMgKi8KLXN0cnVjdCBleHRlcm5hbF9ubGlzdCB7Ci0gIGJmZF9ieXRlIGVfc3RyeFtCWVRFU19JTl9XT1JEXTsJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgb2YgbmFtZSAqLwotICBiZmRfYnl0ZSBlX3R5cGVbMV07CQkJLyogdHlwZSBvZiBzeW1ib2wgKi8KLSAgYmZkX2J5dGUgZV9vdGhlclsxXTsJCQkvKiBtaXNjIGluZm8gKHVzdWFsbHkgZW1wdHkpICovCi0gIGJmZF9ieXRlIGVfZGVzY1syXTsJCQkvKiBkZXNjcmlwdGlvbiBmaWVsZCAqLwotICBiZmRfYnl0ZSBlX3ZhbHVlW0JZVEVTX0lOX1dPUkRdOwkvKiB2YWx1ZSBvZiBzeW1ib2wgKi8KLX07Ci0KLSNkZWZpbmUgRVhURVJOQUxfTkxJU1RfU0laRSAoQllURVNfSU5fV09SRCs0K0JZVEVTX0lOX1dPUkQpCi0KLXN0cnVjdCBpbnRlcm5hbF9ubGlzdCB7Ci0gIHVuc2lnbmVkIGxvbmcgbl9zdHJ4OwkJCS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlIG9mIG5hbWUgKi8KLSAgdW5zaWduZWQgY2hhciBuX3R5cGU7CQkJLyogdHlwZSBvZiBzeW1ib2wgKi8KLSAgdW5zaWduZWQgY2hhciBuX290aGVyOwkJLyogbWlzYyBpbmZvICh1c3VhbGx5IGVtcHR5KSAqLwotICB1bnNpZ25lZCBzaG9ydCBuX2Rlc2M7CQkvKiBkZXNjcmlwdGlvbiBmaWVsZCAqLwotICBiZmRfdm1hIG5fdmFsdWU7CQkJLyogdmFsdWUgb2Ygc3ltYm9sICovCi19OwotCi0vKiBUaGUgbl90eXBlIGZpZWxkIGlzIHRoZSBzeW1ib2wgdHlwZSwgY29udGFpbmluZzogICovCi0KLSNkZWZpbmUgTl9VTkRGCTAJLyogVW5kZWZpbmVkIHN5bWJvbCAqLwotI2RlZmluZSBOX0FCUyAJMgkvKiBBYnNvbHV0ZSBzeW1ib2wgLS0gZGVmaW5lZCBhdCBwYXJ0aWN1bGFyIGFkZHIgKi8KLSNkZWZpbmUgTl9URVhUIAk0CS8qIFRleHQgc3ltIC0tIGRlZmluZWQgYXQgb2Zmc2V0IGluIHRleHQgc2VnICovCi0jZGVmaW5lIE5fREFUQSAJNgkvKiBEYXRhIHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiBkYXRhIHNlZyAqLwotI2RlZmluZSBOX0JTUyAJOAkvKiBCU1MgIHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiB6ZXJvJ2Qgc2VnICovCi0jZGVmaW5lCU5fQ09NTQkweDEyCS8qIENvbW1vbiBzeW1ib2wgKHZpc2libGUgYWZ0ZXIgc2hhcmVkIGxpYiBkeW5saW5rKSAqLwotI2RlZmluZSBOX0ZOCTB4MWYJLyogRmlsZSBuYW1lIG9mIC5vIGZpbGUgKi8KLSNkZWZpbmUJTl9GTl9TRVEgMHgwQwkvKiBOX0ZOIGZyb20gU2VxdWVudCBjb21waWxlcnMgKHNpZ2gpICovCi0vKiBOb3RlOiBOX0VYVCBjYW4gb25seSBiZSB1c2VmdWxseSBPUi1lZCB3aXRoIE5fVU5ERiwgTl9BQlMsIE5fVEVYVCwKLSAgIE5fREFUQSwgb3IgTl9CU1MuICBXaGVuIHRoZSBsb3ctb3JkZXIgYml0IG9mIG90aGVyIHR5cGVzIGlzIHNldCwKLSAgIChlLmcuIE5fV0FSTklORyB2ZXJzdXMgTl9GTiksIHRoZXkgYXJlIHR3byBkaWZmZXJlbnQgdHlwZXMuICAqLwotI2RlZmluZSBOX0VYVCAJMQkvKiBFeHRlcm5hbCBzeW1ib2wgKGFzIG9wcG9zZWQgdG8gbG9jYWwtdG8tdGhpcy1maWxlKSAqLwotI2RlZmluZSBOX1RZUEUgIDB4MWUKLSNkZWZpbmUgTl9TVEFCIAkweGUwCS8qIElmIGFueSBvZiB0aGVzZSBiaXRzIGFyZSBvbiwgaXQncyBhIGRlYnVnIHN5bWJvbCAqLwotCi0jZGVmaW5lIE5fSU5EUiAweDBhCi0KLS8qIFRoZSBmb2xsb3dpbmcgc3ltYm9scyByZWZlciB0byBzZXQgZWxlbWVudHMuCi0gICBBbGwgdGhlIE5fU0VUW0FUREJdIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lIGZvcm0gb25lIHNldC4KLSAgIFNwYWNlIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNldCBpbiB0aGUgdGV4dCBzZWN0aW9uLCBhbmQgZWFjaCBzZXQKLSAgIGVsZW1lbnRzIHZhbHVlIGlzIHN0b3JlZCBpbnRvIG9uZSB3b3JkIG9mIHRoZSBzcGFjZS4KLSAgIFRoZSBmaXJzdCB3b3JkIG9mIHRoZSBzcGFjZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXQgKG51bWJlciBvZiBlbGVtZW50cykuCi0KLSAgIFRoZSBhZGRyZXNzIG9mIHRoZSBzZXQgaXMgbWFkZSBpbnRvIGFuIE5fU0VUViBzeW1ib2wKLSAgIHdob3NlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIHNldC4KLSAgIFRoaXMgc3ltYm9sIGFjdHMgbGlrZSBhIE5fREFUQSBnbG9iYWwgc3ltYm9sCi0gICBpbiB0aGF0IGl0IGNhbiBzYXRpc2Z5IHVuZGVmaW5lZCBleHRlcm5hbCByZWZlcmVuY2VzLiAgKi8KLQotLyogVGhlc2UgYXBwZWFyIGFzIGlucHV0IHRvIExELCBpbiBhIC5vIGZpbGUuICAqLwotI2RlZmluZQlOX1NFVEEJMHgxNAkJLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUVAkweDE2CQkvKiBUZXh0IHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVEQJMHgxOAkJLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRCCTB4MUEJCS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLQotLyogVGhpcyBpcyBvdXRwdXQgZnJvbSBMRC4gICovCi0jZGVmaW5lIE5fU0VUVgkweDFDCQkvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAgKi8KLQotLyogV2FybmluZyBzeW1ib2wuIFRoZSB0ZXh0IGdpdmVzIGEgd2FybmluZyBtZXNzYWdlLCB0aGUgbmV4dCBzeW1ib2wKLSAgIGluIHRoZSB0YWJsZSB3aWxsIGJlIHVuZGVmaW5lZC4gV2hlbiB0aGUgc3ltYm9sIGlzIHJlZmVyZW5jZWQsIHRoZQotICAgbWVzc2FnZSBpcyBwcmludGVkLiAgKi8KLQotI2RlZmluZQlOX1dBUk5JTkcgMHgxZQotCi0vKiBSZWxvY2F0aW9ucyAKLQotICBUaGVyZQlhcmUgdHdvIHR5cGVzIG9mIHJlbG9jYXRpb24gZmxhdm91cnMgZm9yIGEub3V0IHN5c3RlbXMsCi0gIHN0YW5kYXJkIGFuZCBleHRlbmRlZC4gVGhlIHN0YW5kYXJkIGZvcm0gaXMgdXNlZCBvbiBzeXN0ZW1zIHdoZXJlIHRoZQotICBpbnN0cnVjdGlvbiBoYXMgcm9vbSBmb3IgYWxsIHRoZSBiaXRzIG9mIGFuIG9mZnNldCB0byB0aGUgb3BlcmFuZCwgd2hpbHN0Ci0gIHRoZSBleHRlbmRlZCBmb3JtIGlzIHVzZWQgd2hlbiBhbiBhZGRyZXNzIG9wZXJhbmQgaGFzIHRvIGJlIHNwbGl0IG92ZXIgbgotICBpbnN0cnVjdGlvbnMuIEVnLCBvbiB0aGUgNjhrLCBlYWNoIG1vdmUgaW5zdHJ1Y3Rpb24gY2FuIHJlZmVyZW5jZQotICB0aGUgdGFyZ2V0IHdpdGggYSBkaXNwbGFjZW1lbnQgb2YgMTYgb3IgMzIgYml0cy4gT24gdGhlIHNwYXJjLCBtb3ZlCi0gIGluc3RydWN0aW9ucyB1c2UgYW4gb2Zmc2V0IG9mIDE0IGJpdHMsIHNvIHRoZSBvZmZzZXQgaXMgc3RvcmVkIGluCi0gIHRoZSByZWxvYyBmaWVsZCwgYW5kIHRoZSBkYXRhIGluIHRoZSBzZWN0aW9uIGlzIGlnbm9yZWQuCi0qLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCi0gICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKLSAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgotICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsIHsKLSAgYmZkX2J5dGUgcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAqLwotICBiZmRfYnl0ZSByX2luZGV4WzNdOwkvKiBzeW1ib2wgdGFibGUgaW5kZXggb2Ygc3ltYm9sIAkqLwotICBiZmRfYnl0ZSByX3R5cGVbMV07CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi19OwotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRwkweDgwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRQkweDAxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRwkweDYwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcJNQkvKiBUbyBzaGlmdCB0byB1bml0cyBwbGFjZSAqLwotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFCTB4MDYKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRQkxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwkweDEwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHCTB4MDgKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRwkweDA0Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRQkweDA0Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHCTB4MDIKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFCTB4MDIKLQotI2RlZmluZQlSRUxPQ19TVERfU0laRQkoQllURVNfSU5fV09SRCArIDMgKyAxKQkJLyogQnl0ZXMgcGVyIHJlbG9jYXRpb24gZW50cnkgKi8KLQotc3RydWN0IHJlbG9jX3N0ZF9pbnRlcm5hbAotewotICBiZmRfdm1hIHJfYWRkcmVzczsJCS8qIEFkZHJlc3MgKHdpdGhpbiBzZWdtZW50KSB0byBiZSByZWxvY2F0ZWQuICAqLwotICAvKiBUaGUgbWVhbmluZyBvZiByX3N5bWJvbG51bSBkZXBlbmRzIG9uIHJfZXh0ZXJuLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICAvKiBOb256ZXJvIG1lYW5zIHZhbHVlIGlzIGEgcGMtcmVsYXRpdmUgb2Zmc2V0Ci0gICAgIGFuZCBpdCBzaG91bGQgYmUgcmVsb2NhdGVkIGZvciBjaGFuZ2VzIGluIGl0cyBvd24gYWRkcmVzcwotICAgICBhcyB3ZWxsIGFzIGZvciBjaGFuZ2VzIGluIHRoZSBzeW1ib2wgb3Igc2VjdGlvbiBzcGVjaWZpZWQuICAqLwotICB1bnNpZ25lZCBpbnQgcl9wY3JlbDoxOwotICAvKiBMZW5ndGggKGFzIGV4cG9uZW50IG9mIDIpIG9mIHRoZSBmaWVsZCB0byBiZSByZWxvY2F0ZWQuCi0gICAgIFRodXMsIGEgdmFsdWUgb2YgMiBpbmRpY2F0ZXMgMTw8MiBieXRlcy4gICovCi0gIHVuc2lnbmVkIGludCByX2xlbmd0aDoyOwotICAvKiAxID0+IHJlbG9jYXRlIHdpdGggdmFsdWUgb2Ygc3ltYm9sLgotICAgICByX3N5bWJvbG51bSBpcyB0aGUgaW5kZXggb2YgdGhlIHN5bWJvbAotICAgICBpbiBmaWxlcyB0aGUgc3ltYm9sIHRhYmxlLgotICAgICAwID0+IHJlbG9jYXRlIHdpdGggdGhlIGFkZHJlc3Mgb2YgYSBzZWdtZW50LgotICAgICByX3N5bWJvbG51bSBpcyBOX1RFWFQsIE5fREFUQSwgTl9CU1Mgb3IgTl9BQlMKLSAgICAgKHRoZSBOX0VYVCBiaXQgbWF5IGJlIHNldCBhbHNvLCBidXQgc2lnbmlmaWVzIG5vdGhpbmcpLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfZXh0ZXJuOjE7Ci0gIC8qIFRoZSBuZXh0IHRocmVlIGJpdHMgYXJlIGZvciBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgc2VlbSB0bwotICAgICBiZSB1bmRvY3VtZW50ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgcl9iYXNlcmVsOjE7CS8qIExpbmthZ2UgdGFibGUgcmVsYXRpdmUgKi8KLSAgdW5zaWduZWQgaW50IHJfam1wdGFibGU6MTsJLyogcGMtcmVsYXRpdmUgdG8ganVtcCB0YWJsZSAqLwotICB1bnNpZ25lZCBpbnQgcl9yZWxhdGl2ZToxOwkvKiAicmVsYXRpdmUgcmVsb2NhdGlvbiIgKi8KLSAgLyogdW51c2VkICovCi0gIHVuc2lnbmVkIGludCByX3BhZDoxOwkJLyogUGFkZGluZyAtLSBzZXQgdG8gemVybyAqLwotfTsKLQotCi0vKiBFWFRFTkRFRCBSRUxPQ1MgICovCi0KLXN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgewotICBiZmRfYnl0ZSByX2FkZHJlc3NbQllURVNfSU5fV09SRF07CS8qIG9mZnNldCBvZiBvZiBkYXRhIHRvIHJlbG9jYXRlIAkqLwotICBiZmRfYnl0ZSByX2luZGV4WzNdOwkvKiBzeW1ib2wgdGFibGUgaW5kZXggb2Ygc3ltYm9sIAkqLwotICBiZmRfYnl0ZSByX3R5cGVbMV07CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi0gIGJmZF9ieXRlIHJfYWRkZW5kW0JZVEVTX0lOX1dPUkRdOwkvKiBkYXR1bSBhZGRlbmQJCQkJKi8KLX07Ci0KLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRwkweDgwCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUJMHgwMQotCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfQklHCQkweDFGCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHCTAKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUJMHhGOAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRQkzCi0KLS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0jZGVmaW5lCVJFTE9DX0VYVF9TSVpFCShCWVRFU19JTl9XT1JEICsgMyArIDEgKyBCWVRFU19JTl9XT1JEKQotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgLyogc2ltcGxlIHJlbG9jYXRpb25zICovCi0gIFJFTE9DXzgsCQkJLyogZGF0YVswOjddID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ18xNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ18zMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kICsgc3YgCQkqLwotICAvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCi0gIFJFTE9DX0RJU1A4LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX0RJU1AxNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgUkVMT0NfRElTUDMyLAkJCS8qIGRhdGFbMDozMV0gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICAvKiBTcGVjaWFsICovCi0gIFJFTE9DX1dESVNQMzAsCQkvKiBkYXRhWzA6MjldID0gKGFkZGVuZCArIHN2IC0gcGMpPj4yIAkqLwotICBSRUxPQ19XRElTUDIyLAkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KLSAgUkVMT0NfSEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KT4+MTAgCSovCi0gIFJFTE9DXzIyLAkJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YpIAkJKi8KLSAgUkVMT0NfMTMsCQkJLyogZGF0YVswOjEyXSA9IChhZGRlbmQgKyBzdikJCSovCi0gIFJFTE9DX0xPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KQkJKi8KLSAgUkVMT0NfU0ZBX0JBU0UsCQkKLSAgUkVMT0NfU0ZBX09GRjEzLAotICAvKiBQLkkuQy4gKGJhc2UtcmVsYXRpdmUpICovCi0gIFJFTE9DX0JBU0UxMCwgIAkJLyogTm90IHN1cmUgLSBtYXliZSB3ZSBjYW4gZG8gdGhpcyB0aGUgKi8KLSAgUkVMT0NfQkFTRTEzLAkJCS8qIHJpZ2h0IHdheSBub3cgKi8KLSAgUkVMT0NfQkFTRTIyLAotICAvKiBmb3Igc29tZSBzb3J0IG9mIHBjLXJlbCBQLkkuQy4gKD8pICovCi0gIFJFTE9DX1BDMTAsCi0gIFJFTE9DX1BDMjIsCi0gIC8qIFAuSS5DLiBqdW1wIHRhYmxlICovCi0gIFJFTE9DX0pNUF9UQkwsCi0gIC8qIHJlcHV0ZWRseSBmb3Igc2hhcmVkIGxpYnJhcmllcyBzb21laG93ICovCi0gIFJFTE9DX1NFR09GRjE2LAotICBSRUxPQ19HTE9CX0RBVCwKLSAgUkVMT0NfSk1QX1NMT1QsCi0gIFJFTE9DX1JFTEFUSVZFLAotCi0gIFJFTE9DXzExLAkKLSAgUkVMT0NfV0RJU1AyXzE0LAotICBSRUxPQ19XRElTUDE5LAotICBSRUxPQ19ISEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSA+PiA0MiAgICAgKi8KLSAgUkVMT0NfSExPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KSA+PiAzMiAgICAgICovCi0gIAotICAvKiAyOUsgcmVsb2NhdGlvbiB0eXBlcyAqLwotICBSRUxPQ19KVU1QVEFSRywKLSAgUkVMT0NfQ09OU1QsCi0gIFJFTE9DX0NPTlNUSCwKLSAgCi0gIE5PX1JFTE9DCi0gIH07Ci0KLQotc3RydWN0IHJlbG9jX2ludGVybmFsIHsKLSAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgbG9uZwlyX2luZGV4OwkJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgZW51bSByZWxvY190eXBlIHJfdHlwZTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLSAgYmZkX3ZtYSByX2FkZGVuZDsJCS8qIGRhdHVtIGFkZGVuZAkJCQkqLwotfTsKLQotI2VuZGlmCQkJCS8qIF9fQV9PVVRfQURPQkVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvYW91dDY0LmggYi9pbmNsdWRlL2FvdXQvYW91dDY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzQzYzQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2FvdXQ2NC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qIGBhLm91dCcgb2JqZWN0LWZpbGUgZGVmaW5pdGlvbnMsIGluY2x1ZGluZyBleHRlbnNpb25zIHRvIDY0LWJpdCBmaWVsZHMgKi8KLQotI2lmbmRlZiBfX0FfT1VUXzY0X0hfXwotI2RlZmluZSBfX0FfT1VUXzY0X0hfXwotCi0vKiBUaGlzIGlzIHRoZSBsYXlvdXQgb24gZGlzayBvZiB0aGUgMzItYml0IG9yIDY0LWJpdCBleGVjIGhlYWRlci4gKi8KLQotI2lmbmRlZiBleHRlcm5hbF9leGVjCi1zdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAKLXsKLSAgYmZkX2J5dGUgZV9pbmZvWzRdOwkJLyogbWFnaWMgbnVtYmVyIGFuZCBzdHVmZgkJKi8KLSAgYmZkX2J5dGUgZV90ZXh0W0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCBzZWN0aW9uIGluIGJ5dGVzCSovCi0gIGJmZF9ieXRlIGVfZGF0YVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGRhdGEgc2VjdGlvbiBpbiBieXRlcwkqLwotICBiZmRfYnl0ZSBlX2Jzc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGJzcyBhcmVhIGluIGJ5dGVzIAkJKi8KLSAgYmZkX2J5dGUgZV9zeW1zW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGluIGJ5dGVzIAkqLwotICBiZmRfYnl0ZSBlX2VudHJ5W0JZVEVTX0lOX1dPUkRdOyAvKiBzdGFydCBhZGRyZXNzIAkJCSovCi0gIGJmZF9ieXRlIGVfdHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCByZWxvY2F0aW9uIGluZm8JKi8KLSAgYmZkX2J5dGUgZV9kcnNpemVbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHJlbG9jYXRpb24gaW5mbyAJKi8KLX07Ci0KLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCSg0ICsgQllURVNfSU5fV09SRCAqIDcpCi0KLS8qIE1hZ2ljIG51bWJlcnMgZm9yIGEub3V0IGZpbGVzICovCi0KLSNpZiBBUkNIX1NJWkU9PTY0Ci0jZGVmaW5lIE9NQUdJQyAweDEwMDEJCS8qIENvZGUgaW5kaWNhdGluZyBvYmplY3QgZmlsZSAgKi8KLSNkZWZpbmUgWk1BR0lDIDB4MTAwMgkJLyogQ29kZSBpbmRpY2F0aW5nIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDB4MTAwMwkJLyogQ29kZSBpbmRpY2F0aW5nIHB1cmUgZXhlY3V0YWJsZS4gICovCi0KLS8qIFRoZXJlIGlzIG5vIDY0LWJpdCBRTUFHSUMgYXMgZmFyIGFzIEkga25vdy4gICovCi0KLSNkZWZpbmUgTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKLQkJCSYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQlcCi0gIAkJCSYmIE5fTUFHSUMoeCkgIT0gWk1BR0lDKQotI2Vsc2UKLSNkZWZpbmUgT01BR0lDIDA0MDcJCS8qIC4uLm9iamVjdCBmaWxlIG9yIGltcHVyZSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDA0MTAJCS8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBaTUFHSUMgMDQxMwkJLyogQ29kZSBpbmRpY2F0aW5nIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgQk1BR0lDIDA0MTUJCS8qIFVzZWQgYnkgYSBiLm91dCBvYmplY3QuICAqLwotCi0vKiBUaGlzIGluZGljYXRlcyBhIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlIHdpdGggdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4KLSAgIEl0IGlzIHVzZWQgYnkgMzg2QlNEIChhbmQgdmFyaWFudHMpIGFuZCBMaW51eCwgYXQgbGVhc3QuICAqLwotI2lmbmRlZiBRTUFHSUMKLSNkZWZpbmUgUU1BR0lDIDAzMTQKLSNlbmRpZgotIyBpZm5kZWYgTl9CQURNQUcKLSMgIGRlZmluZSBOX0JBRE1BRyh4KQkgIChOX01BR0lDKHgpICE9IE9NQUdJQwkJXAotCQkJJiYgTl9NQUdJQyh4KSAhPSBOTUFHSUMJCVwKLSAgCQkJJiYgTl9NQUdJQyh4KSAhPSBaTUFHSUMgXAotCQkgICAgICAgICYmIE5fTUFHSUMoeCkgIT0gUU1BR0lDKQotIyBlbmRpZiAvKiBOX0JBRE1BRyAqLwotI2VuZGlmCi0KLSNlbmRpZgotCi0jaWZkZWYgUU1BR0lDCi0jZGVmaW5lIE5fSVNfUU1BR0lDKHgpIChOX01BR0lDICh4KSA9PSBRTUFHSUMpCi0jZWxzZQotI2RlZmluZSBOX0lTX1FNQUdJQyh4KSAoMCkKLSNlbmRpZgotCi0vKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFRBUkdFVF9QQUdFX1NJWkUgYW5kIE5fU0VHU0laRSBpcyB0aGF0IFRBUkdFVF9QQUdFX1NJWkUgaXMKLSAgIHRoZSBmaW5lc3QgZ3JhbnVsYXJpdHkgYXQgd2hpY2ggeW91IGNhbiBwYWdlIHNvbWV0aGluZywgdGh1cyBpdAotICAgY29udHJvbHMgdGhlIHBhZGRpbmcgKGlmIGFueSkgYmVmb3JlIHRoZSB0ZXh0IHNlZ21lbnQgb2YgYSBaTUFHSUMKLSAgIGZpbGUuICBOX1NFR1NJWkUgaXMgdGhlIHJlc29sdXRpb24gYXQgd2hpY2ggdGhpbmdzIGNhbiBiZSBtYXJrZWQgYXMKLSAgIHJlYWQtb25seSB2ZXJzdXMgcmVhZC93cml0ZSwgc28gaXQgY29udHJvbHMgdGhlIHBhZGRpbmcgYmV0d2VlbiB0aGUKLSAgIHRleHQgc2VnbWVudCBhbmQgdGhlIGRhdGEgc2VnbWVudCAoaW4gbWVtb3J5OyBvbiBkaXNrIHRoZSBwYWRkaW5nCi0gICBiZXR3ZWVuIHRoZW0gaXMgVEFSR0VUX1BBR0VfU0laRSkuICBUQVJHRVRfUEFHRV9TSVpFIGFuZCBOX1NFR1NJWkUgYXJlIHRoZSBzYW1lCi0gICBmb3IgbW9zdCBtYWNoaW5lcywgYnV0IGRpZmZlcmVudCBmb3Igc3VuMy4gICovCi0KLS8qIEJ5IGRlZmF1bHQsIHNlZ21lbnQgc2l6ZSBpcyBjb25zdGFudC4gIEJ1dCBzb21lIG1hY2hpbmVzIG92ZXJyaWRlIHRoaXMKLSAgIHRvIGJlIGEgZnVuY3Rpb24gb2YgdGhlIGEub3V0IGhlYWRlciAoZS5nLiBtYWNoaW5lIHR5cGUpLiAgKi8KLQotI2lmbmRlZglOX1NFR1NJWkUKLSNkZWZpbmUJTl9TRUdTSVpFKHgpCVNFR01FTlRfU0laRQotI2VuZGlmCi0MCi0vKiBWaXJ0dWFsIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSB0ZXh0IHNlY3Rpb24uCi0gICBUaGlzIGlzIGdldHRpbmcgdmVyeSBjb21wbGljYXRlZC4gIEEgZ29vZCByZWFzb24gdG8gZGlzY2FyZCBhLm91dCBmb3JtYXQKLSAgIGZvciBzb21ldGhpbmcgdGhhdCBzcGVjaWZpZXMgdGhlc2UgZmllbGRzIGV4cGxpY2l0bHkuICBCdXQgdGlsIHRoZW4uLi4KLQotICAgKiBPTUFHSUMgYW5kIE5NQUdJQyBmaWxlczoKLSAgICAgICAob2JqZWN0IGZpbGVzOiB0ZXh0IGZvciAicmVsb2NhdGFibGUgYWRkciAwIiByaWdodCBhZnRlciB0aGUgaGVhZGVyKQotICAgICAgIHN0YXJ0IGF0IDAsIG9mZnNldCBpcyBFWEVDX0JZVEVTX1NJWkUsIHNpemUgYXMgc3RhdGVkLgotICAgKiBUaGUgdGV4dCBhZGRyZXNzLCBvZmZzZXQsIGFuZCBzaXplIG9mIFpNQUdJQyBmaWxlcyBkZXBlbmQKLSAgICAgb24gdGhlIGVudHJ5IHBvaW50IG9mIHRoZSBmaWxlOgotICAgICAqIGVudHJ5IHBvaW50IGJlbG93IFRFWFRfU1RBUlRfQUREUjoKLSAgICAgICAoaGFjayBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcykKLSAgICAgICBzdGFydCBhdCAwLCBvZmZzZXQgaXMgMCwgc2l6ZSBhcyBzdGF0ZWQuCi0gICAgICogSWYgTl9IRUFERVJfSU5fVEVYVCh4KSBpcyB0cnVlICh3aGljaCBkZWZhdWx0cyB0byBiZWluZyB0aGUKLSAgICAgICBjYXNlIHdoZW4gdGhlIGVudHJ5IHBvaW50IGlzIEVYRUNfQllURVNfU0laRSBvciBmdXJ0aGVyIGludG8gYSBwYWdlKToKLSAgICAgICBubyBwYWRkaW5nIGlzIG5lZWRlZDsgdGV4dCBjYW4gc3RhcnQgYWZ0ZXIgZXhlYyBoZWFkZXIuICBTdW4KLSAgICAgICBjb25zaWRlcnMgdGhlIHRleHQgc2VnbWVudCBvZiBzdWNoIGZpbGVzIHRvIGluY2x1ZGUgdGhlIGV4ZWMgaGVhZGVyOwotICAgICAgIGZvciBCRkQncyBwdXJwb3Nlcywgd2UgZG9uJ3QsIHdoaWNoIG1ha2VzIG1vcmUgd29yayBmb3IgdXMuCi0gICAgICAgc3RhcnQgYXQgVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFLCBvZmZzZXQgaXMgRVhFQ19CWVRFU19TSVpFLAotICAgICAgIHNpemUgYXMgc3RhdGVkIG1pbnVzIEVYRUNfQllURVNfU0laRS4KLSAgICAgKiBJZiBOX0hFQURFUl9JTl9URVhUKHgpIGlzIGZhbHNlICh3aGljaCBkZWZhdWx0cyB0byBiZWluZyB0aGUgY2FzZSB3aGVuCi0gICAgICAgdGhlIGVudHJ5IHBvaW50IGlzIGxlc3MgdGhhbiBFWEVDX0JZVEVTX1NJWkUgaW50byBhIHBhZ2UgKGUuZy4gcGFnZQotICAgICAgIGFsaWduZWQpKTogKHBhZGRpbmcgaXMgbmVlZGVkIHNvIHRoYXQgdGV4dCBjYW4gc3RhcnQgYXQgYSBwYWdlIGJvdW5kYXJ5KQotICAgICAgIHN0YXJ0IGF0IFRFWFRfU1RBUlRfQUREUiwgb2Zmc2V0IFRBUkdFVF9QQUdFX1NJWkUsIHNpemUgYXMgc3RhdGVkLgotCi0gICAgU3BlY2lmaWMgY29uZmlndXJhdGlvbnMgbWF5IHdhbnQgdG8gaGFyZHdpcmUgTl9IRUFERVJfSU5fVEVYVCwKLSAgICBmb3IgZWZmaWNpZW5jeSBvciB0byBhbGxvdyBwZW9wbGUgdG8gcGxheSBnYW1lcyB3aXRoIHRoZSBlbnRyeSBwb2ludC4KLSAgICBJbiB0aGF0IGNhc2UsIHlvdSB3b3VsZCAjZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgYXMgMSBmb3Igc3Vub3MsCi0gICAgYW5kIGFzIDAgZm9yIG1vc3Qgb3RoZXIgaG9zdHMgKFNvbnkgTmV3cywgVmF4IFVsdHJpeCwgZXRjKS4KLSAgICAoRG8gdGhpcyBpbiB0aGUgYXBwcm9wcmlhdGUgYmZkIHRhcmdldCBmaWxlLikKLSAgICAoVGhlIGRlZmF1bHQgaXMgYSBoZXVyaXN0aWMgdGhhdCB3aWxsIGJyZWFrIGlmIHBlb3BsZSB0cnkgY2hhbmdpbmcKLSAgICB0aGUgZW50cnkgcG9pbnQsIHBlcmhhcHMgd2l0aCB0aGUgbGQgLWUgZmxhZy4pCi0KLSAgICAqIFFNQUdJQyBpcyBhbHdheXMgbGlrZSBhIFpNQUdJQyBmb3Igd2hpY2ggTl9IRUFERVJfSU5fVEVYVCBpcyB0cnVlLAotICAgIGFuZCBmb3Igd2hpY2ggdGhlIHN0YXJ0aW5nIGFkZHJlc3MgaXMgVEFSR0VUX1BBR0VfU0laRSAob3Igc2hvdWxkIHRoaXMgYmUKLSAgICBTRUdNRU5UX1NJWkU/KSAoVEVYVF9TVEFSVF9BRERSIG9ubHkgYXBwbGllcyB0byBaTUFHSUMsIG5vdCB0byBRTUFHSUMpLgotICAgICovCi0KLS8qIFRoaXMgbWFjcm8gaXMgb25seSByZWxldmFudCBmb3IgWk1BR0lDIGZpbGVzOyBRTUFHSUMgYWx3YXlzIGhhcyB0aGUgaGVhZGVyCi0gICBpbiB0aGUgdGV4dC4gICovCi0jaWZuZGVmIE5fSEVBREVSX0lOX1RFWFQKLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAoKCh4KS5hX2VudHJ5ICYgKFRBUkdFVF9QQUdFX1NJWkUtMSkpID49IEVYRUNfQllURVNfU0laRSkKLSNlbmRpZgotCi0vKiBTdW4gc2hhcmVkIGxpYnJhcmllcywgbm90IGxpbnV4LiAgVGhpcyBtYWNybyBpcyBvbmx5IHJlbGV2YW50IGZvciBaTUFHSUMKLSAgIGZpbGVzLiAgKi8KLSNpZm5kZWYgTl9TSEFSRURfTElCCi0jaWYgZGVmaW5lZCAoVEVYVF9TVEFSVF9BRERSKSAmJiBURVhUX1NUQVJUX0FERFIgPT0gMAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgKDApCi0jZWxzZQotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgKCh4KS5hX2VudHJ5IDwgVEVYVF9TVEFSVF9BRERSKQotI2VuZGlmCi0jZW5kaWYKLQotLyogUmV0dXJuaW5nIDAgbm90IFRFWFRfU1RBUlRfQUREUiBmb3IgT01BR0lDIGFuZCBOTUFHSUMgaXMgYmFzZWQgb24KLSAgIHRoZSBhc3N1bXB0aW9uIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIC5vIGZpbGUsIG5vdCBhbgotICAgZXhlY3V0YWJsZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBPTUFHSUMgKGJ1dCBtZWFucyB3ZSBkb24ndCB3b3JrCi0gICByaWdodCBvbiB0aGUgb3V0cHV0IGZyb20gbGQgLU4pOyBtb3JlIHF1ZXN0aW9uYWJsZSBmb3IgTk1BR0lDLiAgKi8KLQotI2lmbmRlZiBOX1RYVEFERFIKLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLSAgICAoLyogVGhlIGFkZHJlc3Mgb2YgYSBRTUFHSUMgZmlsZSBpcyBhbHdheXMgb25lIHBhZ2UgaW4sICovIFwKLSAgICAgLyogd2l0aCB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAgKi8gXAotICAgICBOX0lTX1FNQUdJQyAoeCkgPyBUQVJHRVRfUEFHRV9TSVpFICsgRVhFQ19CWVRFU19TSVpFIDogXAotICAgICBOX01BR0lDKHgpICE9IFpNQUdJQyA/IDAgOgkvKiBvYmplY3QgZmlsZSBvciBOTUFHSUMgKi9cCi0gICAgIE5fU0hBUkVEX0xJQih4KSA/IDAgOglcCi0gICAgIE5fSEVBREVSX0lOX1RFWFQoeCkgID8JXAotCSAgICBURVhUX1NUQVJUX0FERFIgKyBFWEVDX0JZVEVTX1NJWkUgOgkvKiBubyBwYWRkaW5nICovXAotCSAgICBURVhUX1NUQVJUX0FERFIJCQkvKiBhIHBhZ2Ugb2YgcGFkZGluZyAqL1wKLSAgICApCi0jZW5kaWYKLQotLyogSWYgTl9IRUFERVJfSU5fVEVYVCBpcyBub3QgdHJ1ZSBmb3IgWk1BR0lDLCB0aGVyZSBpcyBzb21lIHBhZGRpbmcKLSAgIHRvIG1ha2UgdGhlIHRleHQgc2VnbWVudCBzdGFydCBhdCBhIGNlcnRhaW4gYm91bmRhcnkuICBGb3IgbW9zdAotICAgc3lzdGVtcywgdGhpcyBib3VuZGFyeSBpcyBUQVJHRVRfUEFHRV9TSVpFLiAgQnV0IGZvciBMaW51eCwgaW4gdGhlCi0gICB0aW1lLWhvbm9yZWQgdHJhZGl0aW9uIG9mIGNyYXp5IFpNQUdJQyBoYWNrcywgaXQgaXMgMTAyNCB3aGljaCBpcwotICAgbm90IHdoYXQgVEFSR0VUX1BBR0VfU0laRSBuZWVkcyB0byBiZSBmb3IgUU1BR0lDLiAgKi8KLQotI2lmbmRlZiBaTUFHSUNfRElTS19CTE9DS19TSVpFCi0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2VuZGlmCi0KLSNkZWZpbmUgTl9ESVNLX0JMT0NLX1NJWkUoeCkgXAotICAoTl9NQUdJQyh4KSA9PSBaTUFHSUMgPyBaTUFHSUNfRElTS19CTE9DS19TSVpFIDogVEFSR0VUX1BBR0VfU0laRSkKLQotLyogT2Zmc2V0IGluIGFuIGEub3V0IG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAqLwotI2lmbmRlZiBOX1RYVE9GRgotI2RlZmluZSBOX1RYVE9GRih4KQlcCi0gICAgKC8qIEZvciB7TyxOLFF9TUFHSUMsIG5vIHBhZGRpbmcuICAqLyBcCi0gICAgIE5fTUFHSUMoeCkgIT0gWk1BR0lDID8gRVhFQ19CWVRFU19TSVpFIDogXAotICAgICBOX1NIQVJFRF9MSUIoeCkgPyAwIDogXAotICAgICBOX0hFQURFUl9JTl9URVhUKHgpID8JXAotCSAgICBFWEVDX0JZVEVTX1NJWkUgOgkJCS8qIG5vIHBhZGRpbmcgKi9cCi0JICAgIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUJCS8qIGEgcGFnZSBvZiBwYWRkaW5nICovXAotICAgICkKLSNlbmRpZgotLyogU2l6ZSBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgSXQncyBhbHdheXMgYXMgc3RhdGVkLCBleGNlcHQgdGhhdCB3ZQotICAgb2Zmc2V0IGl0IHRvIGB1bmRvJyB0aGUgYWRqdXN0bWVudCB0byBOX1RYVEFERFIgYW5kIE5fVFhUT0ZGCi0gICBmb3IgWk1BR0lDIGZpbGVzIHRoYXQgbm9taW5hbGx5IGluY2x1ZGUgdGhlIGV4ZWMgaGVhZGVyCi0gICBhcyBwYXJ0IG9mIHRoZSBmaXJzdCBwYWdlIG9mIHRleHQuICAoQkZEIGRvZXNuJ3QgY29uc2lkZXIgdGhlCi0gICBleGVjIGhlYWRlciB0byBiZSBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQuKSAgKi8KLSNpZm5kZWYgTl9UWFRTSVpFCi0jZGVmaW5lCU5fVFhUU0laRSh4KSBcCi0gICAgKC8qIEZvciBRTUFHSUMsIHdlIGRvbid0IGNvbnNpZGVyIHRoZSBoZWFkZXIgcGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgKi9cCi0gICAgIE5fSVNfUU1BR0lDICh4KSA/ICh4KS5hX3RleHQgLSBFWEVDX0JZVEVTX1NJWkUgOiBcCi0gICAgIChOX01BR0lDKHgpICE9IFpNQUdJQyB8fCBOX1NIQVJFRF9MSUIoeCkpID8gKHgpLmFfdGV4dCA6IFwKLSAgICAgTl9IRUFERVJfSU5fVEVYVCh4KSAgPwlcCi0JICAgICh4KS5hX3RleHQgLSBFWEVDX0JZVEVTX1NJWkU6CS8qIG5vIHBhZGRpbmcgKi9cCi0JICAgICh4KS5hX3RleHQJCQkJLyogYSBwYWdlIG9mIHBhZGRpbmcgKi9cCi0gICAgKQotI2VuZGlmCi0vKiBUaGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWdtZW50IGluIHZpcnR1YWwgbWVtb3J5LgotICAgSXQgaXMgdGhlIHRleHQgc2VnbWVudCBhZGRyZXNzLCBwbHVzIHRleHQgc2VnbWVudCBzaXplLCByb3VuZGVkCi0gICB1cCB0byBhIE5fU0VHU0laRSBib3VuZGFyeSBmb3IgcHVyZSBvciBwYWdlYWJsZSBmaWxlcy4gKi8KLSNpZm5kZWYgTl9EQVRBRERSCi0jZGVmaW5lIE5fREFUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCkpIFwKLSAgICAgOiAgKE5fU0VHU0laRSh4KSArICgoTl9UWFRBRERSKHgpK05fVFhUU0laRSh4KS0xKSAmIH4oTl9TRUdTSVpFKHgpLTEpKSkpCi0jZW5kaWYKLS8qIFRoZSBhZGRyZXNzIG9mIHRoZSBCU1Mgc2VnbWVudCAtLSBpbW1lZGlhdGVseSBhZnRlciB0aGUgZGF0YSBzZWdtZW50LiAgKi8KLQotI2RlZmluZSBOX0JTU0FERFIoeCkJKE5fREFUQUREUih4KSArICh4KS5hX2RhdGEpCi0KLS8qIE9mZnNldHMgb2YgdGhlIHZhcmlvdXMgcG9ydGlvbnMgb2YgdGhlIGZpbGUgYWZ0ZXIgdGhlIHRleHQgc2VnbWVudC4gICovCi0KLS8qIEZvciB7USxafU1BR0lDLCB0aGVyZSBpcyBwYWRkaW5nIHRvIG1ha2UgdGhlIGRhdGEgc2VnbWVudCBzdGFydCBvbgotICAgYSBwYWdlIGJvdW5kYXJ5LiAgTW9zdCBvZiB0aGUgdGltZSB0aGUgYV90ZXh0IGZpZWxkIChhbmQgdGh1cwotICAgTl9UWFRTSVpFKSBhbHJlYWR5IGNvbnRhaW5zIHRoaXMgcGFkZGluZy4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgZm9yCi0gICBCU0RJIGFuZC9vciAzODZCU0QgaXQgc29tZXRpbWVzIGRvZXNuJ3QgY29udGFpbiB0aGUgcGFkZGluZywgYW5kCi0gICBwZXJoYXBzIHdlIHNob3VsZCBiZSBhZGRpbmcgaXQgaGVyZS4gIEJ1dCB0aGlzIHNlZW1zIGtpbmQgb2YKLSAgIHF1ZXN0aW9uYWJsZSBhbmQgcHJvYmFibHkgc2hvdWxkIGJlIEJTREkvMzg2QlNELXNwZWNpZmljIGlmIHdlIGRvCi0gICBkbyBpdC4KLQotICAgRm9yIE5NQUdJQyAoYXQgbGVhc3QgZm9yIGhwMzAwIEJTRCwgcHJvYmFibHkgb3RoZXJzKSwgdGhlcmUgaXMKLSAgIHBhZGRpbmcgaW4gbWVtb3J5IG9ubHksIG5vdCBvbiBkaXNrLCBzbyB3ZSBtdXN0ICpub3QqIGV2ZXIgcGFkIGhlcmUKLSAgIGZvciBOTUFHSUMuICAqLwotCi0jaWZuZGVmIE5fREFUT0ZGCi0jZGVmaW5lIE5fREFUT0ZGKHgpIFwKLSAoTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1RSRUxPRkYKLSNkZWZpbmUgTl9UUkVMT0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKLSNlbmRpZgotI2lmbmRlZiBOX0RSRUxPRkYKLSNkZWZpbmUgTl9EUkVMT0ZGKHgpCSggTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNlbmRpZgotI2lmbmRlZiBOX1NZTU9GRgotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZW5kaWYKLSNpZm5kZWYgTl9TVFJPRkYKLSNkZWZpbmUgTl9TVFJPRkYoeCkJKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQotI2VuZGlmCi0MCi0vKiBTeW1ib2xzICovCi0jaWZuZGVmIGV4dGVybmFsX25saXN0Ci1zdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgewotICBiZmRfYnl0ZSBlX3N0cnhbQllURVNfSU5fV09SRF07CS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlIG9mIG5hbWUgKi8KLSAgYmZkX2J5dGUgZV90eXBlWzFdOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCi0gIGJmZF9ieXRlIGVfb3RoZXJbMV07CQkJLyogbWlzYyBpbmZvICh1c3VhbGx5IGVtcHR5KSAqLwotICBiZmRfYnl0ZSBlX2Rlc2NbMl07CQkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KLSAgYmZkX2J5dGUgZV92YWx1ZVtCWVRFU19JTl9XT1JEXTsJLyogdmFsdWUgb2Ygc3ltYm9sICovCi19OwotI2RlZmluZSBFWFRFUk5BTF9OTElTVF9TSVpFIChCWVRFU19JTl9XT1JEKzQrQllURVNfSU5fV09SRCkKLSNlbmRpZgotCi1zdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgewotICB1bnNpZ25lZCBsb25nIG5fc3RyeDsJCQkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCi0gIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCi0gIHVuc2lnbmVkIGNoYXIgbl9vdGhlcjsJCS8qIG1pc2MgaW5mbyAodXN1YWxseSBlbXB0eSkgKi8KLSAgdW5zaWduZWQgc2hvcnQgbl9kZXNjOwkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KLSAgYmZkX3ZtYSBuX3ZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotfTsKLQotLyogVGhlIG5fdHlwZSBmaWVsZCBpcyB0aGUgc3ltYm9sIHR5cGUsIGNvbnRhaW5pbmc6ICAqLwotCi0jZGVmaW5lIE5fVU5ERgkwCS8qIFVuZGVmaW5lZCBzeW1ib2wgKi8KLSNkZWZpbmUgTl9BQlMgCTIJLyogQWJzb2x1dGUgc3ltYm9sIC0tIGRlZmluZWQgYXQgcGFydGljdWxhciBhZGRyICovCi0jZGVmaW5lIE5fVEVYVCAJNAkvKiBUZXh0IHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiB0ZXh0IHNlZyAqLwotI2RlZmluZSBOX0RBVEEgCTYJLyogRGF0YSBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gZGF0YSBzZWcgKi8KLSNkZWZpbmUgTl9CU1MgCTgJLyogQlNTICBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gemVybydkIHNlZyAqLwotI2RlZmluZQlOX0NPTU0JMHgxMgkvKiBDb21tb24gc3ltYm9sICh2aXNpYmxlIGFmdGVyIHNoYXJlZCBsaWIgZHlubGluaykgKi8KLSNkZWZpbmUgTl9GTgkweDFmCS8qIEZpbGUgbmFtZSBvZiAubyBmaWxlICovCi0jZGVmaW5lCU5fRk5fU0VRIDB4MEMJLyogTl9GTiBmcm9tIFNlcXVlbnQgY29tcGlsZXJzIChzaWdoKSAqLwotLyogTm90ZTogTl9FWFQgY2FuIG9ubHkgYmUgdXNlZnVsbHkgT1ItZWQgd2l0aCBOX1VOREYsIE5fQUJTLCBOX1RFWFQsCi0gICBOX0RBVEEsIG9yIE5fQlNTLiAgV2hlbiB0aGUgbG93LW9yZGVyIGJpdCBvZiBvdGhlciB0eXBlcyBpcyBzZXQsCi0gICAoZS5nLiBOX1dBUk5JTkcgdmVyc3VzIE5fRk4pLCB0aGV5IGFyZSB0d28gZGlmZmVyZW50IHR5cGVzLiAgKi8KLSNkZWZpbmUgTl9FWFQgCTEJLyogRXh0ZXJuYWwgc3ltYm9sIChhcyBvcHBvc2VkIHRvIGxvY2FsLXRvLXRoaXMtZmlsZSkgKi8KLSNkZWZpbmUgTl9UWVBFICAweDFlCi0jZGVmaW5lIE5fU1RBQiAJMHhlMAkvKiBJZiBhbnkgb2YgdGhlc2UgYml0cyBhcmUgb24sIGl0J3MgYSBkZWJ1ZyBzeW1ib2wgKi8KLQotI2RlZmluZSBOX0lORFIgMHgwYQotCi0vKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgcmVmZXIgdG8gc2V0IGVsZW1lbnRzLgotICAgQWxsIHRoZSBOX1NFVFtBVERCXSBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZSBmb3JtIG9uZSBzZXQuCi0gICBTcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzZXQgaW4gdGhlIHRleHQgc2VjdGlvbiwgYW5kIGVhY2ggc2V0Ci0gICBlbGVtZW50cyB2YWx1ZSBpcyBzdG9yZWQgaW50byBvbmUgd29yZCBvZiB0aGUgc3BhY2UuCi0gICBUaGUgZmlyc3Qgd29yZCBvZiB0aGUgc3BhY2UgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2V0IChudW1iZXIgb2YgZWxlbWVudHMpLgotCi0gICBUaGUgYWRkcmVzcyBvZiB0aGUgc2V0IGlzIG1hZGUgaW50byBhbiBOX1NFVFYgc3ltYm9sCi0gICB3aG9zZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBzZXQuCi0gICBUaGlzIHN5bWJvbCBhY3RzIGxpa2UgYSBOX0RBVEEgZ2xvYmFsIHN5bWJvbAotICAgaW4gdGhhdCBpdCBjYW4gc2F0aXNmeSB1bmRlZmluZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCi0KLS8qIFRoZXNlIGFwcGVhciBhcyBpbnB1dCB0byBMRCwgaW4gYSAubyBmaWxlLiAgKi8KLSNkZWZpbmUJTl9TRVRBCTB4MTQJCS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVFQJMHgxNgkJLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRECTB4MTgJCS8qIERhdGEgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUQgkweDFBCQkvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0KLS8qIFRoaXMgaXMgb3V0cHV0IGZyb20gTEQuICAqLwotI2RlZmluZSBOX1NFVFYJMHgxQwkJLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gICovCi0KLS8qIFdhcm5pbmcgc3ltYm9sLiBUaGUgdGV4dCBnaXZlcyBhIHdhcm5pbmcgbWVzc2FnZSwgdGhlIG5leHQgc3ltYm9sCi0gICBpbiB0aGUgdGFibGUgd2lsbCBiZSB1bmRlZmluZWQuIFdoZW4gdGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkLCB0aGUKLSAgIG1lc3NhZ2UgaXMgcHJpbnRlZC4gICovCi0KLSNkZWZpbmUJTl9XQVJOSU5HIDB4MWUKLQotLyogV2VhayBzeW1ib2xzLiAgVGhlc2UgYXJlIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgYS5vdXQgZm9ybWF0LiAgVGhlCi0gICBzZW1hbnRpY3MgYXJlIHRob3NlIG9mIEVMRiB3ZWFrIHN5bWJvbHMuICBXZWFrIHN5bWJvbHMgYXJlIGFsd2F5cwotICAgZXh0ZXJuYWxseSB2aXNpYmxlLiAgVGhlIE5fV0VBSz8gdmFsdWVzIGFyZSBzcXVlZXplZCBpbnRvIHRoZQotICAgYXZhaWxhYmxlIHNsb3RzLiAgVGhlIHZhbHVlIG9mIGEgTl9XRUFLVSBzeW1ib2wgaXMgMC4gIFRoZSB2YWx1ZXMKLSAgIG9mIHRoZSBvdGhlciB0eXBlcyBhcmUgdGhlIGRlZmluaXRpb25zLiAgKi8KLSNkZWZpbmUgTl9XRUFLVQkweDBkCQkvKiBXZWFrIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtBIDB4MGUJCS8qIFdlYWsgYWJzb2x1dGUgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLVCAweDBmCQkvKiBXZWFrIHRleHQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLRCAweDEwCQkvKiBXZWFrIGRhdGEgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLQiAweDExCQkvKiBXZWFrIGJzcyBzeW1ib2wuICAqLwotCi0vKiBSZWxvY2F0aW9ucyAKLQotICBUaGVyZQlhcmUgdHdvIHR5cGVzIG9mIHJlbG9jYXRpb24gZmxhdm91cnMgZm9yIGEub3V0IHN5c3RlbXMsCi0gIHN0YW5kYXJkIGFuZCBleHRlbmRlZC4gVGhlIHN0YW5kYXJkIGZvcm0gaXMgdXNlZCBvbiBzeXN0ZW1zIHdoZXJlIHRoZQotICBpbnN0cnVjdGlvbiBoYXMgcm9vbSBmb3IgYWxsIHRoZSBiaXRzIG9mIGFuIG9mZnNldCB0byB0aGUgb3BlcmFuZCwgd2hpbHN0Ci0gIHRoZSBleHRlbmRlZCBmb3JtIGlzIHVzZWQgd2hlbiBhbiBhZGRyZXNzIG9wZXJhbmQgaGFzIHRvIGJlIHNwbGl0IG92ZXIgbgotICBpbnN0cnVjdGlvbnMuIEVnLCBvbiB0aGUgNjhrLCBlYWNoIG1vdmUgaW5zdHJ1Y3Rpb24gY2FuIHJlZmVyZW5jZQotICB0aGUgdGFyZ2V0IHdpdGggYSBkaXNwbGFjZW1lbnQgb2YgMTYgb3IgMzIgYml0cy4gT24gdGhlIHNwYXJjLCBtb3ZlCi0gIGluc3RydWN0aW9ucyB1c2UgYW4gb2Zmc2V0IG9mIDE0IGJpdHMsIHNvIHRoZSBvZmZzZXQgaXMgc3RvcmVkIGluCi0gIHRoZSByZWxvYyBmaWVsZCwgYW5kIHRoZSBkYXRhIGluIHRoZSBzZWN0aW9uIGlzIGlnbm9yZWQuCi0qLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCi0gICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKLSAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgotICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsIHsKLSAgYmZkX2J5dGUJcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotfTsKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4ODApCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwMSkKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfQklHCSgodW5zaWduZWQgaW50KSAweDYwKQotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHCTUKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwNikKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRQkxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwkoKHVuc2lnbmVkIGludCkgMHgxMCkKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwOCkKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRwkoKHVuc2lnbmVkIGludCkgMHgwOCkKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MTApCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHCSgodW5zaWduZWQgaW50KSAweDA0KQotI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MjApCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHCSgodW5zaWduZWQgaW50KSAweDAyKQotI2RlZmluZQlSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4NDApCi0KLSNkZWZpbmUJUkVMT0NfU1REX1NJWkUJKEJZVEVTX0lOX1dPUkQgKyAzICsgMSkJCS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0KLXN0cnVjdCByZWxvY19zdGRfaW50ZXJuYWwKLXsKLSAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBBZGRyZXNzICh3aXRoaW4gc2VnbWVudCkgdG8gYmUgcmVsb2NhdGVkLiAgKi8KLSAgLyogVGhlIG1lYW5pbmcgb2Ygcl9zeW1ib2xudW0gZGVwZW5kcyBvbiByX2V4dGVybi4gICovCi0gIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKLSAgLyogTm9uemVybyBtZWFucyB2YWx1ZSBpcyBhIHBjLXJlbGF0aXZlIG9mZnNldAotICAgICBhbmQgaXQgc2hvdWxkIGJlIHJlbG9jYXRlZCBmb3IgY2hhbmdlcyBpbiBpdHMgb3duIGFkZHJlc3MKLSAgICAgYXMgd2VsbCBhcyBmb3IgY2hhbmdlcyBpbiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gc3BlY2lmaWVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKLSAgLyogTGVuZ3RoIChhcyBleHBvbmVudCBvZiAyKSBvZiB0aGUgZmllbGQgdG8gYmUgcmVsb2NhdGVkLgotICAgICBUaHVzLCBhIHZhbHVlIG9mIDIgaW5kaWNhdGVzIDE8PDIgYnl0ZXMuICAqLwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg6MjsKLSAgLyogMSA9PiByZWxvY2F0ZSB3aXRoIHZhbHVlIG9mIHN5bWJvbC4KLSAgICAgcl9zeW1ib2xudW0gaXMgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wKLSAgICAgaW4gZmlsZXMgdGhlIHN5bWJvbCB0YWJsZS4KLSAgICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KLSAgICAgcl9zeW1ib2xudW0gaXMgTl9URVhULCBOX0RBVEEsIE5fQlNTIG9yIE5fQUJTCi0gICAgICh0aGUgTl9FWFQgYml0IG1heSBiZSBzZXQgYWxzbywgYnV0IHNpZ25pZmllcyBub3RoaW5nKS4gICovCi0gIHVuc2lnbmVkIGludCByX2V4dGVybjoxOwotICAvKiBUaGUgbmV4dCB0aHJlZSBiaXRzIGFyZSBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcywgYW5kIHNlZW0gdG8KLSAgICAgYmUgdW5kb2N1bWVudGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfYmFzZXJlbDoxOwkvKiBMaW5rYWdlIHRhYmxlIHJlbGF0aXZlICovCi0gIHVuc2lnbmVkIGludCByX2ptcHRhYmxlOjE7CS8qIHBjLXJlbGF0aXZlIHRvIGp1bXAgdGFibGUgKi8KLSAgdW5zaWduZWQgaW50IHJfcmVsYXRpdmU6MTsJLyogInJlbGF0aXZlIHJlbG9jYXRpb24iICovCi0gIC8qIHVudXNlZCAqLwotICB1bnNpZ25lZCBpbnQgcl9wYWQ6MTsJCS8qIFBhZGRpbmcgLS0gc2V0IHRvIHplcm8gKi8KLX07Ci0KLQotLyogRVhURU5ERUQgUkVMT0NTICAqLwotCi1zdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIHsKLSAgYmZkX2J5dGUgcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotICBiZmRfYnl0ZSByX2FkZGVuZFtCWVRFU19JTl9XT1JEXTsJLyogZGF0dW0gYWRkZW5kCQkJCSovCi19OwotCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4ODApCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDEpCi0KLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcJCSgodW5zaWduZWQgaW50KSAweDFGKQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRwkwCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFCSgodW5zaWduZWQgaW50KSAweEY4KQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRQkzCi0KLS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0jZGVmaW5lCVJFTE9DX0VYVF9TSVpFCShCWVRFU19JTl9XT1JEICsgMyArIDEgKyBCWVRFU19JTl9XT1JEKQotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgLyogc2ltcGxlIHJlbG9jYXRpb25zICovCi0gIFJFTE9DXzgsCQkJLyogZGF0YVswOjddID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ18xNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ18zMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kICsgc3YgCQkqLwotICAvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCi0gIFJFTE9DX0RJU1A4LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX0RJU1AxNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgUkVMT0NfRElTUDMyLAkJCS8qIGRhdGFbMDozMV0gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICAvKiBTcGVjaWFsICovCi0gIFJFTE9DX1dESVNQMzAsCQkvKiBkYXRhWzA6MjldID0gKGFkZGVuZCArIHN2IC0gcGMpPj4yIAkqLwotICBSRUxPQ19XRElTUDIyLAkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KLSAgUkVMT0NfSEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KT4+MTAgCSovCi0gIFJFTE9DXzIyLAkJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YpIAkJKi8KLSAgUkVMT0NfMTMsCQkJLyogZGF0YVswOjEyXSA9IChhZGRlbmQgKyBzdikJCSovCi0gIFJFTE9DX0xPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KQkJKi8KLSAgUkVMT0NfU0ZBX0JBU0UsCQkKLSAgUkVMT0NfU0ZBX09GRjEzLAotICAvKiBQLkkuQy4gKGJhc2UtcmVsYXRpdmUpICovCi0gIFJFTE9DX0JBU0UxMCwgIAkJLyogTm90IHN1cmUgLSBtYXliZSB3ZSBjYW4gZG8gdGhpcyB0aGUgKi8KLSAgUkVMT0NfQkFTRTEzLAkJCS8qIHJpZ2h0IHdheSBub3cgKi8KLSAgUkVMT0NfQkFTRTIyLAotICAvKiBmb3Igc29tZSBzb3J0IG9mIHBjLXJlbCBQLkkuQy4gKD8pICovCi0gIFJFTE9DX1BDMTAsCi0gIFJFTE9DX1BDMjIsCi0gIC8qIFAuSS5DLiBqdW1wIHRhYmxlICovCi0gIFJFTE9DX0pNUF9UQkwsCi0gIC8qIHJlcHV0ZWRseSBmb3Igc2hhcmVkIGxpYnJhcmllcyBzb21laG93ICovCi0gIFJFTE9DX1NFR09GRjE2LAotICBSRUxPQ19HTE9CX0RBVCwKLSAgUkVMT0NfSk1QX1NMT1QsCi0gIFJFTE9DX1JFTEFUSVZFLAotCi0gIFJFTE9DXzExLAkKLSAgUkVMT0NfV0RJU1AyXzE0LAotICBSRUxPQ19XRElTUDE5LAotICBSRUxPQ19ISEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSA+PiA0MiAgICAgKi8KLSAgUkVMT0NfSExPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KSA+PiAzMiAgICAgICovCi0gIAotICAvKiAyOUsgcmVsb2NhdGlvbiB0eXBlcyAqLwotICBSRUxPQ19KVU1QVEFSRywKLSAgUkVMT0NfQ09OU1QsCi0gIFJFTE9DX0NPTlNUSCwKLSAgCi0gIC8qIEFsbCB0aGUgbmV3IG9uZXMgSSBjYW4gdGhpbmsgb2YsIGZvciBzcGFyYyB2OSAqLwotCi0gIFJFTE9DXzY0LAkJCS8qIGRhdGFbMDo2M10gPSBhZGRlbmQgKyBzdiAJCSovCi0gIFJFTE9DX0RJU1A2NCwJCQkvKiBkYXRhWzA6NjNdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgUkVMT0NfV0RJU1AyMSwJCS8qIGRhdGFbMDoyMF0gPSAoYWRkZW5kICsgc3YgLSBwYyk+PjIgCSovCi0gIFJFTE9DX0RJU1AyMSwJCQkvKiBkYXRhWzA6MjBdID0gYWRkZW5kIC0gcGMgKyBzdiAgICAgICAgKi8KLSAgUkVMT0NfRElTUDE0LAkJCS8qIGRhdGFbMDoxM10gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICAvKiBRIC4KLSAgICAgV2hhdCBhcmUgdGhlIG90aGVyIG9uZXMsCi0gICAgIFNpbmNlIHRoaXMgaXMgYSBjbGVhbiBzbGF0ZSwgY2FuIHdlIHRocm93IGF3YXkgdGhlIG9uZXMgd2UgZG9udAotICAgICB1bmRlcnN0YW5kID8gU2hvdWxkIHdlIHNvcnQgdGhlIHZhbHVlcyA/IFdoYXQgYWJvdXQgdXNpbmcgYQotICAgICBtaWNyb2NvZGUgZm9ybWF0IGxpa2UgdGhlIDY4ayA/Ci0gICAgICovCi0gIE5PX1JFTE9DCi0gIH07Ci0KLQotc3RydWN0IHJlbG9jX2ludGVybmFsIHsKLSAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgbG9uZwlyX2luZGV4OwkJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgZW51bSByZWxvY190eXBlIHJfdHlwZTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLSAgYmZkX3ZtYSByX2FkZGVuZDsJCS8qIGRhdHVtIGFkZGVuZAkJCQkqLwotfTsKLQotLyogUS4KLSAgIFNob3VsZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGFibGUgYmUgNCBieXRlcyBvciA4IGJ5dGVzID8KLQotICAgUS4KLSAgIFdoYXQgYWJvdXQgYXJjaGl2ZSBpbmRleGVzID8KLQotICovCi0KLSNlbmRpZgkJCQkvKiBfX0FfT1VUXzY0X0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2FyLmggYi9pbmNsdWRlL2FvdXQvYXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1ZGNkYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvYXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIGFyY2hpdmUgZmlsZSBkZWZpbml0aW9uIGZvciBHTlUgc29mdHdhcmUgKi8KLQotLyogU28gZmFyIHRoaXMgaXMgY29ycmVjdCBmb3IgQlNEaXNoIGFyY2hpdmVzLiAgRG9uJ3QgZm9yZ2V0IHRoYXQKLSAgIGZpbGVzIG11c3QgYmVnaW4gb24gYW4gZXZlbiBieXRlIGJvdW5kYXJ5LiAqLwotCi0jaWZuZGVmIF9fR05VX0FSX0hfXwotI2RlZmluZSBfX0dOVV9BUl9IX18KLQotLyogTm90ZSB0aGF0IHRoZSB1c3VhbCAnXG4nIGluIG1hZ2ljIHN0cmluZ3MgbWF5IHRyYW5zbGF0ZSB0byBkaWZmZXJlbnQKLSAgIGNoYXJhY3RlcnMsIGFzIGFsbG93ZWQgYnkgQU5TSS4gICdcMDEyJyBoYXMgYSBmaXhlZCB2YWx1ZSwgYW5kIHJlbWFpbnMKLSAgIGNvbXBhdGlibGUgd2l0aCBleGlzdGluZyBCU0Rpc2ggYXJjaGl2ZXMuICovCi0KLSNkZWZpbmUgQVJNQUcgICIhPGFyY2g+XDAxMiIJLyogRm9yIENPRkYgYW5kIGEub3V0IGFyY2hpdmVzICovCi0jZGVmaW5lIEFSTUFHQiAiITxib3V0PlwwMTIiCS8qIEZvciBiLm91dCBhcmNoaXZlcyAqLwotI2RlZmluZSBTQVJNQUcgOAotI2RlZmluZSBBUkZNQUcgImBcMDEyIgotCi0vKiBUaGUgYXJfZGF0ZSBmaWVsZCBvZiB0aGUgYXJtYXAgKF9fLlNZTURFRikgbWVtYmVyIG9mIGFuIGFyY2hpdmUKLSAgIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBtb2RpZmllZCBkYXRlIG9mIHRoZSBlbnRpcmUgZmlsZSwgb3IgCi0gICBCU0QtZGVyaXZlZCBsaW5rZXJzIGNvbXBsYWluLiAgV2Ugb3JpZ2luYWxseSB3cml0ZSB0aGUgYXJfZGF0ZSB3aXRoCi0gICB0aGlzIG9mZnNldCBmcm9tIHRoZSByZWFsIGZpbGUncyBtb2QtdGltZS4gIEFmdGVyIGZpbmlzaGluZyB0aGUKLSAgIGZpbGUsIHdlIHJld3JpdGUgYXJfZGF0ZSBpZiBpdCdzIG5vdCBzdGlsbCBncmVhdGVyIHRoYW4gdGhlIG1vZCBkYXRlLiAgKi8KLQotI2RlZmluZSBBUk1BUF9USU1FX09GRlNFVCAgICAgICA2MAotCi1zdHJ1Y3QgYXJfaGRyIHsKLSAgY2hhciBhcl9uYW1lWzE2XTsJCS8qIG5hbWUgb2YgdGhpcyBtZW1iZXIgKi8KLSAgY2hhciBhcl9kYXRlWzEyXTsJCS8qIGZpbGUgbXRpbWUgKi8KLSAgY2hhciBhcl91aWRbNl07CQkvKiBvd25lciB1aWQ7IHByaW50ZWQgYXMgZGVjaW1hbCAqLwotICBjaGFyIGFyX2dpZFs2XTsJCS8qIG93bmVyIGdpZDsgcHJpbnRlZCBhcyBkZWNpbWFsICovCi0gIGNoYXIgYXJfbW9kZVs4XTsJCS8qIGZpbGUgbW9kZSwgcHJpbnRlZCBhcyBvY3RhbCAgICovCi0gIGNoYXIgYXJfc2l6ZVsxMF07CQkvKiBmaWxlIHNpemUsIHByaW50ZWQgYXMgZGVjaW1hbCAqLwotICBjaGFyIGFyX2ZtYWdbMl07CQkvKiBzaG91bGQgY29udGFpbiBBUkZNQUcgKi8KLX07Ci0KLSNlbmRpZiAvKiBfX0dOVV9BUl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9keW5peDMuaCBiL2luY2x1ZGUvYW91dC9keW5peDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlZWViZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvZHluaXgzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogYS5vdXQgc3BlY2lmaWNzIGZvciBTZXF1ZW50IFN5bW1ldHJ5IHJ1bm5pbmcgRHluaXggMy54Ci0gKi8KLSNpZm5kZWYgQV9PVVRfRFlOSVgzX0gKLSNkZWZpbmUgQV9PVVRfRFlOSVgzX0gKLQotI2RlZmluZSBleHRlcm5hbF9leGVjIGR5bml4X2V4dGVybmFsX2V4ZWMKLQotLyogc3RydWN0IGV4ZWMgZm9yIER5bml4IDMKLSAqCi0gKiBhX2dkdGJsIGFuZCBhX2Jvb3RzdHJhcCBhcmUgb25seSBmb3Igc3RhbmRhbG9uZSBiaW5hcmllcy4KLSAqIFNoYXJlZCBkYXRhIGZpZWxkcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUga2VybmVsIGFzIG9mIER5bml4IDMuMSwKLSAqIGJ1dCBhcmUgc3VwcG9ydGVkIGJ5IER5bml4IGNvbXBpbGVyIHByb2dyYW1zLgotICovCi1zdHJ1Y3QgZHluaXhfZXh0ZXJuYWxfZXhlYyB7Ci0JdW5zaWduZWQgY2hhciBlX2luZm9bNF07Ci0JdW5zaWduZWQgY2hhciBlX3RleHRbNF07Ci0JdW5zaWduZWQgY2hhciBlX2RhdGFbNF07Ci0JdW5zaWduZWQgY2hhciBlX2Jzc1s0XTsKLQl1bnNpZ25lZCBjaGFyIGVfc3ltc1s0XTsKLQl1bnNpZ25lZCBjaGFyIGVfZW50cnlbNF07Ci0JdW5zaWduZWQgY2hhciBlX3Ryc2l6ZVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfZHJzaXplWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9nX2NvZGVbOF0sIGVfZ19kYXRhWzhdLCBlX2dfZGVzY1s4XTsKLQl1bnNpZ25lZCBjaGFyIGVfc2hkYXRhWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9zaGJzc1s0XTsKLQl1bnNpZ25lZCBjaGFyIGVfc2hkcnNpemVbNF07Ci0JdW5zaWduZWQgY2hhciBlX2Jvb3RzdHJhcFs0NF07Ci0JdW5zaWduZWQgY2hhciBlX3Jlc2VydmVkWzEyXTsKLQl1bnNpZ25lZCBjaGFyIGVfdmVyc2lvbls0XTsKLX07Ci0KLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCSgxMjgpCi0KLS8qCi0gKiBBbGwgZXhlY3V0YWJsZXMgdW5kZXIgRHluaXggYXJlIGRlbWFuZCBwYWdlZCB3aXRoIHJlYWQtb25seSB0ZXh0LAotICogVGh1cyBubyBOTUFHSUMuCi0gKgotICogWk1BR0lDIGhhcyBhIHBhZ2Ugb2YgMHMgYXQgdmlydHVhbCAwLAotICogWE1BR0lDIGhhcyBhbiBpbnZhbGlkIHBhZ2UgYXQgdmlydHVhbCAwCi0gKi8KLSNkZWZpbmUgT01BR0lDCTB4MTJlYgkJLyogLm8gKi8KLSNkZWZpbmUgWk1BR0lDCTB4MjJlYgkJLyogemVybyBAIDAsIGRlbWFuZCBsb2FkICovCi0jZGVmaW5lIFhNQUdJQwkweDMyZWIJCS8qIGludmFsaWQgQCAwLCBkZW1hbmQgbG9hZCAqLwotI2RlZmluZSBTTUFHSUMJMHg0MmViCQkvKiBzdGFuZGFsb25lLCBub3Qgc3VwcG9ydGVkIGhlcmUgKi8KLQotI2RlZmluZSBOX0JBRE1BRyh4KSAoKE9NQUdJQyAhPSBOX01BR0lDKHgpKSAmJiBcCi0JCSAgICAgKFpNQUdJQyAhPSBOX01BR0lDKHgpKSAmJiBcCi0JCSAgICAgKFhNQUdJQyAhPSBOX01BR0lDKHgpKSAmJiBcCi0JCSAgICAgKFNNQUdJQyAhPSBOX01BR0lDKHgpKSkKLQotI2RlZmluZSBOX0FERFJBREooeCkgKChaTUFHSUMgPT0gTl9NQUdJQyh4KSB8fCBYTUFHSUMgPT0gTl9NQUdJQyh4KSkgPyAweDEwMDAgOiAwKQotCi0jZGVmaW5lIE5fVFhUT0ZGKHgpIChFWEVDX0JZVEVTX1NJWkUpCi0jZGVmaW5lIE5fREFUT0ZGKHgpIChOX1RYVE9GRih4KSArIE5fVFhUU0laRSh4KSkKLSNkZWZpbmUgTl9TSERBVE9GRih4KSAoTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhKQotI2RlZmluZSBOX1RSRUxPRkYoeCkgKE5fU0hEQVRPRkYoeCkgKyAoeCkuYV9zaGRhdGEpCi0jZGVmaW5lIE5fRFJFTE9GRih4KSAoTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplKQotI2RlZmluZSBOX1NIRFJFTE9GRih4KSAoTl9EUkVMT0ZGKHgpICsgKHgpLmFfZHJzaXplKQotI2RlZmluZSBOX1NZTU9GRih4KSAoTl9TSERSRUxPRkYoeCkgKyAoeCkuYV9zaGRyc2l6ZSkKLSNkZWZpbmUgTl9TVFJPRkYoeCkgKE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcykKLQotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotCSgoKE9NQUdJQyA9PSBOX01BR0lDKHgpKSB8fCAoU01BR0lDID09IE5fTUFHSUMoeCkpKSA/IDAgXAotCSA6IFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRSkKLQotI2RlZmluZSBOX1RYVFNJWkUoeCkgXAotCSgoKE9NQUdJQyA9PSBOX01BR0lDKHgpKSB8fCAoU01BR0lDID09IE5fTUFHSUMoeCkpKSA/ICgoeCkuYV90ZXh0KSBcCi0JIDogKCh4KS5hX3RleHQgLSBOX0FERFJBREooeCkgLSBFWEVDX0JZVEVTX1NJWkUpKQotCi0jZW5kaWYgLyogQV9PVVRfRFlOSVgzX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9lbmNhcC5oIGIvaW5jbHVkZS9hb3V0L2VuY2FwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMTVkNDkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2VuY2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyogWWV0IEFub3RoZXIgVHJ5IGF0IGVuY2Fwc3VsYXRpbmcgYnNkIG9iamVjdCBmaWxlcyBpbiBjb2ZmLgotICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBQYWNlIFdpbGxpc3NvbiAxMi85Lzg4Ci0KLSAgIFRoaXMgZmlsZSBpcyBvYnNvbGV0ZS4gIEl0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBqdXN0IGRlZmluZSBhIGJ1bmNoCi0gICBvZiBzdHVmZiB0aGF0IEJGRCBjYW4gdXNlIHRvIGRvIGNvZmYtZW5jYXBzdWxhdGVkIGZpbGVzLiAgLS1nbnVAY3lnbnVzLmNvbQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogV2Ugb25seSB1c2UgdGhlIGNvZmYgaGVhZGVycyB0byB0ZWxsIHRoZSBrZXJuZWwKLSAqIGhvdyB0byBleGVjIHRoZSBmaWxlLiAgVGhlcmVmb3JlLCB0aGUgb25seSBmaWVsZHMgdGhhdCBuZWVkIHRvIAotICogYmUgZmlsbGVkIGluIGFyZSB0aGUgc2NucHRyIGFuZCB2YWRkciBmb3IgdGhlIHRleHQgYW5kIGRhdGEKLSAqIHNlY3Rpb25zLCBhbmQgdGhlIHZhZGRyIGZvciB0aGUgYnNzLiAgQXMgZmFyIGFzIGNvZmYgaXMgY29uY2VybmVkLAotICogdGhlcmUgaXMgbm8gc3ltYm9sIHRhYmxlLCByZWxvY2F0aW9uLCBvciBsaW5lIG51bWJlcnMuCi0gKgotICogQSBub3JtYWwgYnNkIGhlYWRlciAoc3RydWN0IGV4ZWMpIGlzIHBsYWNlZCBhZnRlciB0aGUgY29mZiBoZWFkZXJzLAotICogYW5kIGJlZm9yZSB0aGUgcmVhbCB0ZXh0LiAgSSBkZWZpbmVkIGEgdGhlIG5ldyBmaWVsZHMgJ2FfbWFjaHR5cGUnCi0gKiBhbmQgYV9mbGFncy4gIElmIGFfbWFjaHR5cGUgaXMgTV8zODYsIGFuZCBhX2ZsYWdzICYgQV9FTkNBUCBpcwotICogdHJ1ZSwgdGhlbiB0aGUgYnNkIGhlYWRlciBpcyBwcmVjZWVkZWQgYnkgYSBjb2ZmIGhlYWRlci4gIE1hY3JvcwotICogbGlrZSBOX1RYVE9GRiBhbmQgTl9UWFRBRERSIHVzZSB0aGlzIGZpZWxkIHRvIGZpbmQgdGhlIGJzZCBoZWFkZXIuCi0gKiAKLSAqIFRoZSBvbmx5IHByb2JsZW0gaXMgdG8gdHJhY2sgZG93biB0aGUgYnNkIGV4ZWMgaGVhZGVyLiAgVGhlCi0gKiBtYWNyb3MgSEVBREVSX09GRlNFVCwgZXRjIGRvIHRoaXMuCi0gKi8KLQotI2RlZmluZSBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUgMHgyMCAvKiBjb2ZmIGhlYWRlciBwcmVjZWRlcyBic2QgaGVhZGVyICovCi0KLS8qIERlc2NyaWJlIHRoZSBDT0ZGIGhlYWRlciB1c2VkIGZvciBlbmNhcHN1bGF0aW9uLiAgKi8KLQotc3RydWN0IGNvZmZoZWFkZXIKLXsKLSAgLyogZmlsZWhkciAqLwotICB1bnNpZ25lZCBzaG9ydCBmX21hZ2ljOwotICB1bnNpZ25lZCBzaG9ydCBmX25zY25zOwotICBsb25nIGZfdGltZGF0OwotICBsb25nIGZfc3ltcHRyOwotICBsb25nIGZfbnN5bXM7Ci0gIHVuc2lnbmVkIHNob3J0IGZfb3B0aGRyOwotICB1bnNpZ25lZCBzaG9ydCBmX2ZsYWdzOwotICAvKiBhb3V0aGRyICovCi0gIHNob3J0IG1hZ2ljOwotICBzaG9ydCB2c3RhbXA7Ci0gIGxvbmcgdHNpemU7Ci0gIGxvbmcgZHNpemU7Ci0gIGxvbmcgYnNpemU7Ci0gIGxvbmcgZW50cnk7Ci0gIGxvbmcgdGV4dF9zdGFydDsKLSAgbG9uZyBkYXRhX3N0YXJ0OwotICBzdHJ1Y3QgY29mZnNjbgotICAgIHsKLSAgICAgIGNoYXIgc19uYW1lWzhdOwotICAgICAgbG9uZyBzX3BhZGRyOwotICAgICAgbG9uZyBzX3ZhZGRyOwotICAgICAgbG9uZyBzX3NpemU7Ci0gICAgICBsb25nIHNfc2NucHRyOwotICAgICAgbG9uZyBzX3JlbHB0cjsKLSAgICAgIGxvbmcgc19sbm5vcHRyOwotICAgICAgdW5zaWduZWQgc2hvcnQgc19ucmVsb2M7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBzX25sbm5vOwotICAgICAgbG9uZyBzX2ZsYWdzOwotICAgIH0gc2Nuc1szXTsKLX07Ci0MCi0vKiBEZXNjcmliZSBzb21lIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBlbmNhcHN1bGF0aW9uLAotICAgaW5jbHVkaW5nIGhvdyB0byBmaW5kIHRoZSBlbmNhcHN1bGF0ZWQgQlNEIGhlYWRlci4gICovCi0KLS8qIEZJWE1FLCB0aGlzIGlzIGR1bWIuICBUaGUgc2FtZSB0b29scyBjYW4ndCBoYW5kbGUgYS5vdXRzIGZvciBkaWZmZXJlbnQKLSAgIGFyY2hpdGVjdHVyZXMsIGp1c3QgYmVjYXVzZSBDT0ZGX01BR0lDIGlzIGRpZmZlcmVudDsgc28geW91IG5lZWQgYQotICAgc2VwYXJhdGUgR05VIG5tIGZvciBldmVyeSBhcmNoaXRlY3R1cmUhIT8gIFVuZm9ydHVuYXRlbHksIGl0IG5lZWRzIHRvCi0gICBiZSB0aGlzIHdheSwgc2luY2UgdGhlIENPRkZfTUFHSUMgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUga2VybmVsCi0gICB3ZSdyZSB0cnlpbmcgdG8gZm9vbCBoZXJlLiAgKi8KLSAgIAotI2RlZmluZSBDT0ZGX01BR0lDX0kzODYgMDUxNCAvKiBJMzg2TUFHSUMgKi8KLSNkZWZpbmUgQ09GRl9NQUdJQ19NNjhLIDA1MjAgLyogTUM2OE1BR0lDICovCi0jZGVmaW5lCUNPRkZfTUFHSUNfQTI5SyAweDE3QQkvKiBVc2VkIGJ5IGFzbTI5ayBjcm9zcy10b29scyAqLwotCi0jaWZkZWYgQ09GRl9NQUdJQwotc2hvcnQgX19oZWFkZXJfb2Zmc2V0X3RlbXA7Ci0jZGVmaW5lIEhFQURFUl9PRkZTRVQoZikgXAotCShfX2hlYWRlcl9vZmZzZXRfdGVtcCA9IDAsIFwKLQkgZnJlYWQgKChjaGFyICopJl9faGVhZGVyX29mZnNldF90ZW1wLCBzaXplb2YgKHNob3J0KSwgMSwgKGYpKSwgXAotCSBmc2VlayAoKGYpLCAtc2l6ZW9mIChzaG9ydCksIDEpLCBcCi0JIF9faGVhZGVyX29mZnNldF90ZW1wPT1DT0ZGX01BR0lDID8gc2l6ZW9mKHN0cnVjdCBjb2ZmaGVhZGVyKSA6IDApCi0jZWxzZQotI2RlZmluZSBIRUFERVJfT0ZGU0VUKGYpIDAKLSNlbmRpZgotCi0jZGVmaW5lIEhFQURFUl9TRUVLKGYpIChmc2VlayAoKGYpLCBIRUFERVJfT0ZGU0VUKChmKSksIDEpKQotDAotLyogRGVzY3JpYmUgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgQlNEIGhlYWRlcgotICAgdGhhdCBhcHBlYXJzIGluc2lkZSB0aGUgZW5jYXBzdWxhdGlvbi4gICovCi0KLS8qIEVuY2Fwc3VsYXRlZCBjb2ZmIGZpbGVzIHRoYXQgYXJlIGxpbmtlZCBaTUFHSUMgaGF2ZSBhIHRleHQgc2VnbWVudAotICAgb2Zmc2V0IGp1c3QgcGFzdCB0aGUgaGVhZGVyIChhbmQgYSBtYXRjaGluZyBUWFRBRERSKSwgZXhjbHVkaW5nCi0gICB0aGUgaGVhZGVycyBmcm9tIHRoZSB0ZXh0IHNlZ21lbnQgcHJvcGVyIGJ1dCBrZWVwaW5nIHRoZSBwaHlzaWNhbAotICAgbGF5b3V0IGFuZCB0aGUgdmlydHVhbCBtZW1vcnkgbGF5b3V0IHBhZ2UtYWxpZ25lZC4KLQotICAgTm9uLWVuY2Fwc3VsYXRlZCBhLm91dCBmaWxlcyB0aGF0IGFyZSBsaW5rZWQgWk1BR0lDIGhhdmUgYSB0ZXh0Ci0gICBzZWdtZW50IHRoYXQgc3RhcnRzIGF0IDAgYW5kIGFuIE5fVFhUQURSIHNpbWlsYXJseSBvZmZzZXQgdG8gMC4KLSAgIFRoZXkgdG9vIGFyZSBwYWdlLWFsaWduZWQgd2l0aCBlYWNoIG90aGVyLCBidXQgdGhleSBpbmNsdWRlIHRoZQotICAgYS5vdXQgaGVhZGVyIGFzIHBhcnQgb2YgdGhlIHRleHQuIAotCi0gICBUaGUgX05fSERST0ZGIGdldHMgc2l6ZW9mIHN0cnVjdCBleGVjIGFkZGVkIHRvIGl0LCBzbyB3ZSBoYXZlCi0gICB0byBjb21wZW5zYXRlIGhlcmUuICBTZWUgPGEub3V0LmdudS5oPi4gICovCi0KLSN1bmRlZiBfTl9IRFJPRkYKLSN1bmRlZiBOX1RYVEFERFIKLSN1bmRlZiBOX0RBVEFERFIKLQotI2RlZmluZSBfTl9IRFJPRkYoeCkgKChOX0ZMQUdTKHgpICYgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFKSA/IFwKLQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZmhlYWRlcikgOiAwKQotCi0vKiBBZGRyZXNzIG9mIHRleHQgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLQkoKE5fRkxBR1MoeCkgJiBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUpID8gXAotCSBzaXplb2YgKHN0cnVjdCBjb2ZmaGVhZGVyKSArIHNpemVvZiAoc3RydWN0IGV4ZWMpIDogMCkKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4NDAwMDAwCi0KLSNkZWZpbmUgTl9EQVRBRERSKHgpIFwKLQkoKE5fRkxBR1MoeCkgJiBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUpID8gXAotCSAoU0VHTUVOVF9TSVpFICsgKChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dC0xKSAmIH4oU0VHTUVOVF9TSVpFLTEpKSkgOiBcCi0JIChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvaG9zdC5oIGIvaW5jbHVkZS9hb3V0L2hvc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzNjIxMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvaG9zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogUGFyYW1ldGVycyBhYm91dCB0aGUgYS5vdXQgZm9ybWF0LCBiYXNlZCBvbiB0aGUgaG9zdCBzeXN0ZW0gb24gd2hpY2gKLSAgIHRoZSBwcm9ncmFtIGlzIGNvbXBpbGVkLiAgKi8KLQotLyogQWRkcmVzcyBvZiBkYXRhIHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4KLSAgIEl0IGlzIHVwIHRvIHlvdSB0byBkZWZpbmUgU0VHTUVOVF9TSVpFCi0gICBvbiBtYWNoaW5lcyBub3QgbGlzdGVkIGhlcmUuICAqLwotI2lmbmRlZiBTRUdNRU5UX1NJWkUKLSNpZiBkZWZpbmVkKGhwMzAwKSB8fCBkZWZpbmVkKHB5cikKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIHBhZ2Vfc2l6ZQotI2VuZGlmCi0jaWZkZWYJc29ueQotI2RlZmluZQlTRUdNRU5UX1NJWkUJMHgxMDAwCi0jZW5kaWYJLyogU29ueS4gICovCi0jaWZkZWYgaXM2OGsKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4MjAwMDAKLSNlbmRpZgotI2lmIGRlZmluZWQobTY4aykgJiYgZGVmaW5lZChQT1JUQVIpCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMHg0MDAKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNlbmRpZgotI2VuZGlmIC8qIWRlZmluZWQoU0VHTUVOVF9TSVpFKSovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9ocC5oIGIvaW5jbHVkZS9hb3V0L2hwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMmY0OWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2hwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKiBTcGVjaWFsIHZlcnNpb24gb2YgPGEub3V0Lmg+IGZvciB1c2UgdW5kZXIgaHAtdXguCi0gICBDb3B5cmlnaHQgMTk4OCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVEhJUyBGSUxFIElTIE9CU09MRVRFLiAgSXQgbmVlZHMgdG8gYmUgcmV2aXNlZCBhcyBhIHZhcmlhbnQgImV4dGVybmFsIgotICAgYS5vdXQgZm9ybWF0IGZvciB1c2Ugd2l0aCBCRkQuICAqLwotCi0vKiBUaGUgYGV4ZWMnIHN0cnVjdHVyZSBhbmQgb3ZlcmFsbCBsYXlvdXQgbXVzdCBiZSBjbG9zZSB0byBIUCdzIHdoZW4KLSAgIHdlIGFyZSBydW5uaW5nIG9uIGFuIEhQIHN5c3RlbSwgb3RoZXJ3aXNlIHdlIHdpbGwgbm90IGJlIGFibGUgdG8KLSAgIGV4ZWN1dGUgdGhlIHJlc3VsdGluZyBmaWxlLiAqLwotCi0vKiBBbGxvdyB0aGlzIGZpbGUgdG8gYmUgaW5jbHVkZWQgdHdpY2UuICovCi0jaWZuZGVmIF9fR05VX0VYRUNfTUFDUk9TX18KLQotc3RydWN0IGV4ZWMKLXsKLSAgdW5zaWduZWQgc2hvcnQgYV9tYWNodHlwZTsJLyogbWFjaGluZSB0eXBlICovCi0gIHVuc2lnbmVkIHNob3J0IGFfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUxOwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUyOwotICB1bnNpZ25lZCBsb25nIGFfdGV4dDsJCS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfZGF0YTsJCS8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfYnNzOwkJLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGZvciBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfdHJzaXplOwkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfZHJzaXplOwkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUzOwkvKiBIUCA9IHBhc2NhbCBpbnRlcmZhY2Ugc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU0OwkvKiBIUCA9IHN5bWJvbCB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTU7CS8qIEhQID0gZGVidWcgbmFtZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcgYV9lbnRyeTsJLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU2OwkvKiBIUCA9IHNvdXJjZSBsaW5lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNzsJLyogSFAgPSB2YWx1ZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zeW1zOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTg7Ci19OwotCi0vKiBUZWxsIGEub3V0LmdudS5oIG5vdCB0byBkZWZpbmUgYHN0cnVjdCBleGVjJy4gICovCi0jZGVmaW5lIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXwotCi0jaW5jbHVkZSAiLi4vYS5vdXQuZ251LmgiCi0KLSN1bmRlZiBOX01BR0lDCi0jdW5kZWYgTl9NQUNIVFlQRQotI3VuZGVmIE5fRkxBR1MKLSN1bmRlZiBOX1NFVF9JTkZPCi0jdW5kZWYgTl9TRVRfTUFHSUMKLSN1bmRlZiBOX1NFVF9NQUNIVFlQRQotI3VuZGVmIE5fU0VUX0ZMQUdTCi0KLSNkZWZpbmUgTl9NQUdJQyhleGVjKSAoKGV4ZWMpIC4gYV9tYWdpYykKLSNkZWZpbmUgTl9NQUNIVFlQRShleGVjKSAoKGV4ZWMpIC4gYV9tYWNodHlwZSkKLSNkZWZpbmUgTl9TRVRfTUFHSUMoZXhlYywgbWFnaWMpICgoKGV4ZWMpIC4gYV9tYWdpYykgPSAobWFnaWMpKQotI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgKCgoZXhlYykgLiBhX21hY2h0eXBlKSA9IChtYWNodHlwZSkpCi0KLSN1bmRlZiBOX0JBRE1BRwotI2RlZmluZSBOX0JBRE1BRyh4KSAoKF9OX0JBRE1BRyAoeCkpIHx8IChfTl9CQURNQUNIICh4KSkpCi0KLSNkZWZpbmUgX05fQkFETUFDSCh4KQkJCQkJCQlcCi0oKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5MDAwUzIwMF9JRCkgJiYJCQkJCVwKLSAoKE5fTUFDSFRZUEUgKHgpKSAhPSBIUDk4eDZfSUQpKQotCi0jZGVmaW5lIEhQOTh4Nl9JRCAweDIwQQotI2RlZmluZSBIUDkwMDBTMjAwX0lEIDB4MjBDCi0KLSN1bmRlZiBfTl9IRFJPRkYKLSNkZWZpbmUgX05fSERST0ZGKHgpIChTRUdNRU5UX1NJWkUgLSAoc2l6ZW9mIChzdHJ1Y3QgZXhlYykpKQotCi0jZGVmaW5lIFNFR01FTlRfU0laRSAweDEwMDAKLQotI2VuZGlmIC8qIF9fR05VX0VYRUNfTUFDUk9TX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9ocDMwMGhwdXguaCBiL2luY2x1ZGUvYW91dC9ocDMwMGhwdXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkNTE5Ni4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvaHAzMDBocHV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyogU3BlY2lhbCB2ZXJzaW9uIG9mIDxhLm91dC5oPiBmb3IgdXNlIHVuZGVyIGhwLXV4LgotICAgQ29weXJpZ2h0IChDKSAxOTg4LDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICovCi0KLXN0cnVjdCBocDMwMGhwdXhfZXhlY19ieXRlcwotewotICB1bnNpZ25lZCBjaGFyIGVfaW5mb1s0XTsgICAvKiBhX21hY2h0eXBlL2FfbWFnaWMgKi8KLSAgdW5zaWduZWQgY2hhciBlX3NwYXJlMVs0XTsKLSAgdW5zaWduZWQgY2hhciBlX3NwYXJlMls0XTsKLSAgdW5zaWduZWQgY2hhciBlX3RleHRbNF07ICAgLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIgZV9kYXRhWzRdOyAgIC8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGVfYnNzWzRdOyAgICAvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGVfdHJzaXplWzRdOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyovCi0gIHVuc2lnbmVkIGNoYXIgZV9kcnNpemVbNF07IC8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzKi8KLSAgdW5zaWduZWQgY2hhciBlX3Bhc3NpemVbNF07LyogSFAgPSBwYXNjYWwgaW50ZXJmYWNlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX3N5bXNbNF07ICAgLyogSFAgPSBzeW1ib2wgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGVfc3BhcmU1WzRdOyAvKiBIUCA9IGRlYnVnIG5hbWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGVfZW50cnlbNF07ICAvKiBzdGFydCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIgZV9zcGFyZTZbNF07IC8qIEhQID0gc291cmNlIGxpbmUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGVfc3Vwc2l6ZVs0XTsvKiBIUCA9IHZhbHVlIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX2RyZWxvY3NbNF07Ci0gIHVuc2lnbmVkIGNoYXIgZV9leHRlbnNpb25bNF07IC8qIGZpbGUgb2Zmc2V0IG9mIGV4dGVuc2lvbiAqLwotfTsKLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCTY0Ci0KLXN0cnVjdCBocDMwMGhwdXhfbmxpc3RfYnl0ZXMKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgZV92YWx1ZVs0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGVfdHlwZVsxXTsKLSAgICB1bnNpZ25lZCBjaGFyIGVfbGVuZ3RoWzFdOwkvKiBsZW5ndGggb2YgYXNjaWkgc3ltYm9sIG5hbWUgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGVfYWxtb2RbMl07CS8qIGFsaWdubWVudCBtb2QgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGVfc2hsaWJbMl07ICAgLyogaW5mbyBhYm91dCBkeW5hbWljIGxpbmtpbmcgKi8KLSAgfTsKLSNkZWZpbmUgRVhURVJOQUxfTkxJU1RfU0laRSAxMAotCi1zdHJ1Y3QgaHAzMDBocHV4X3JlbG9jCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIHJfYWRkcmVzc1s0XTsvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAqLwotICAgIHVuc2lnbmVkIGNoYXIgcl9pbmRleFsyXTsgIC8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgICAgICAgICAqLwotICAgIHVuc2lnbmVkIGNoYXIgcl90eXBlWzFdOyAgIC8qIHJlbG9jYXRpb24gdHlwZSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHVuc2lnbmVkIGNoYXIgcl9sZW5ndGhbMV07IC8qIGxlbmd0aCBvZiBpdGVtIHRvIHJlbG9jICAgICAgICAgICAgICAqLwotICB9OwotCi1zdHJ1Y3QgaHAzMDBocHV4X2hlYWRlcl9leHRlbnNpb24KLXsKLSAgICB1bnNpZ25lZCBjaGFyIGVfc3ltc1s0XTsKLSAgICB1bnNpZ25lZCBjaGFyIHVuaXF1ZV9oZWFkZXJzWzEyKjRdOwotICAgIHVuc2lnbmVkIGNoYXIgZV9oZWFkZXJbMl07ICAgLyogdHlwZSBvZiBoZWFkZXIgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGVfdmVyc2lvblsyXTsgIC8qIHZlcnNpb24gICAgICAgICovCi0gICAgdW5zaWduZWQgY2hhciBlX3NpemVbNF07ICAgICAvKiBieXRlcyBmb2xsb3dpbmcqLwotICAgIHVuc2lnbmVkIGNoYXIgZV9leHRlbnNpb25bNF07LyogZmlsZSBvZmZzZXQgb2YgbmV4dCBleHRlbnNpb24gKi8KLX07Ci0jZGVmaW5lIEVYVEVSTkFMX0VYVEVOU0lPTl9IRUFERVJfU0laRSAoMTYqNCkKLQotLyogaHB1eCBzZXBhcmF0ZXMgb2JqZWN0IGZpbGVzICgweDEwNikgYW5kIGltcHVyZSBleGVjdXRhYmxlcyAoMHgxMDcpICAqLwotLyogYnV0IHRoZSBiZmQgY29kZSBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZW0uIFNpbmNlIHdlIHdhbnQgdG8qLwotLyogcmVhZCBocHV4IC5vIGZpbGVzLCB3ZSBhZGQgYW4gc3BlY2lhbCBkZWZpbmUgYW5kIHVzZSBpdCBiZWxvdyBpbiAgICAqLwotLyogb2Zmc2V0IGFuZCBhZGRyZXNzIGNhbGN1bGF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIEhQVVhfRE9UX09fTUFHSUMgMHgxMDYKLSNkZWZpbmUgT01BR0lDIDB4MTA3ICAgICAgIC8qIG9iamVjdCBmaWxlIG9yIGltcHVyZSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDB4MTA4ICAgICAgIC8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAgKi8KLSNkZWZpbmUgWk1BR0lDIDB4MTBCICAgICAgIC8qIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgICAgICAgICAgKi8KLQotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDAKLQotI2lmIDAgLyogbGliYW91dC5oIG9ubHkgdXNlcyB0aGUgbG93ZXIgOCBiaXRzICovCi0jZGVmaW5lIEhQOTh4Nl9JRCAweDIwQQotI2RlZmluZSBIUDkwMDBTMjAwX0lEIDB4MjBDCi0jZW5kaWYKLSNkZWZpbmUgSFA5OHg2X0lEIDB4MEEKLSNkZWZpbmUgSFA5MDAwUzIwMF9JRCAweDBDCi0KLSNkZWZpbmUgTl9CQURNQUcoeCkgKChfTl9CQURNQUcgKHgpKSB8fCAoX05fQkFETUFDSCAoeCkpKQotCi0jZGVmaW5lIE5fREFUQUREUih4KSBcCi0gICAgKChOX01BR0lDKHgpPT1PTUFHSUMgfHwgTl9NQUdJQyh4KT09SFBVWF9ET1RfT19NQUdJQykgPyBcCi0gICAgICAgIChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpKSBcCi0gICAgIDogIChOX1NFR1NJWkUoeCkgKyAoKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCktMSkgJiB+KE5fU0VHU0laRSh4KS0xKSkpKQotCi0jZGVmaW5lIF9OX0JBRE1BQ0goeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0oKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5MDAwUzIwMF9JRCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5OHg2X0lEKSkKLQotI2RlZmluZSBfTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBIUFVYX0RPVF9PX01BR0lDIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIE5fTUFHSUMoeCkgIT0gT01BR0lDCQlcCi0JCQkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAotICAJCQkmJiBOX01BR0lDKHgpICE9IFpNQUdJQyApCi0KLSN1bmRlZiBfTl9IRFJPRkYKLSNkZWZpbmUgX05fSERST0ZGKHgpIChTRUdNRU5UX1NJWkUgLSAoc2l6ZW9mIChzdHJ1Y3QgZXhlYykpKQotCi0jdW5kZWYgTl9EQVRPRkYKLSN1bmRlZiBOX1BBU09GRgotI3VuZGVmIE5fU1lNT0ZGCi0jdW5kZWYgTl9TVVBPRkYKLSN1bmRlZiBOX1RSRUxPRkYKLSN1bmRlZiBOX0RSRUxPRkYKLSN1bmRlZiBOX1NUUk9GRgotCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkgKQotI2RlZmluZSBOX1BBU09GRih4KSAgICAgKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEpCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9QQVNPRkYoeCkgICAvKiArICh4KS5hX3Bhc3NpemUqLyApCi0jZGVmaW5lIE5fU1VQT0ZGKHgpICAgICAoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0jZGVmaW5lIE5fVFJFTE9GRih4KQkoIE5fU1VQT0ZGKHgpICAgIC8qICsgMCAoeCkuYV9zdXBzaXplKi8gKQotI2RlZmluZSBOX0RSRUxPRkYoeCkJKCBOX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUgKQotI2RlZmluZSBOX0VYVEhPRkYoeCkgICAgKCBOX0RSRUxPRkYoeCkgICAvKiAgKyAwICh4KS5hX2Ryc2l6ZSAqLykKLSNkZWZpbmUgTl9TVFJPRkYoeCkJKCAwIC8qIG5vIHN0cmluZyB0YWJsZSAqLyApCi0KLS8qIHVzZSB0aGVzZSB3aGVuIHRoZSBmaWxlIGhhcyBnbnUgc3ltYm9sIHRhYmxlcyAqLwotI2RlZmluZSBOX0dOVV9UUkVMT0ZGKHgpIChOX0RBVE9GRih4KSArICh4KS5hX2RhdGEpCi0jZGVmaW5lIE5fR05VX0RSRUxPRkYoeCkgKE5fR05VX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUpCi0jZGVmaW5lIE5fR05VX1NZTU9GRih4KSAgKE5fR05VX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUpCi0KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDEwMDAKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4MTAwMAotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotCi0jdW5kZWYgTl9TSEFSRURfTElCCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAgKCAwIC8qIG5vIHNoYXJlZCBsaWJyYXJpZXMgKi8gKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2hwcGEuaCBiL2luY2x1ZGUvYW91dC9ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMTg1ZGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2hwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2luY2x1ZGUgImZpbGVoZHIuaCIKLSNpbmNsdWRlICJhb3V0aGRyLmgiCi0jaW5jbHVkZSAic2NuaGRyLmgiCi0jaW5jbHVkZSAic3BhY2VoZHIuaCIKLSNpbmNsdWRlICJzeW1zLmgiCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3JhbmxpYi5oIGIvaW5jbHVkZS9hb3V0L3JhbmxpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODI2MDA1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9yYW5saWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qIHJhbmxpYi5oIC0tIGFyY2hpdmUgbGlicmFyeSBpbmRleCBtZW1iZXIgZGVmaW5pdGlvbiBmb3IgR05VLgotICAgQ29weXJpZ2h0IDE5OTAtMTk5MSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBTeW1kZWYgbWVtYmVyIG9mIGFuIGFyY2hpdmUgY29udGFpbnMgdHdvIHRoaW5nczoKLSAgIGEgdGFibGUgdGhhdCBtYXBzIHN5bWJvbC1zdHJpbmcgb2Zmc2V0cyB0byBmaWxlIG9mZnNldHMsCi0gICBhbmQgYSBzeW1ib2wtc3RyaW5nIHRhYmxlLiAgQWxsIHRoZSBzeW1ib2wgbmFtZXMgYXJlCi0gICBydW4gdG9nZXRoZXIgKGVhY2ggd2l0aCB0cmFpbGluZyBudWxsKSBpbiB0aGUgc3ltYm9sLXN0cmluZwotICAgdGFibGUuICBUaGVyZSBpcyBhIHNpbmdsZSBsb25nd29yZCBieXRlY291bnQgb24gdGhlIGZyb250Ci0gICBvZiBlYWNoIG9mIHRoZXNlIHRhYmxlcy4gIFRodXMgaWYgd2UgaGF2ZSB0d28gc3ltYm9scywKLSAgICJmb28iIGFuZCAiX2JhciIsIHRoYXQgYXJlIGluIGFyY2hpdmUgbWVtYmVycyBhdCBvZmZzZXRzCi0gICAyMDAgYW5kIDkwMCwgaXQgd291bGQgbG9vayBsaWtlIHRoaXM6Ci0gICAgICAgIDE2CQk7IGJ5dGUgY291bnQgb2YgaW5kZXggdGFibGUKLSAgCTAJCTsgb2Zmc2V0IG9mICJmb28iIGluIHN0cmluZyB0YWJsZQotICAJMjAwCQk7IG9mZnNldCBvZiBmb28tbW9kdWxlIGluIGZpbGUKLSAgCTQJCTsgb2Zmc2V0IG9mICJiYXIiIGluIHN0cmluZyB0YWJsZQotICAJOTAwCQk7IG9mZnNldCBvZiBiYXItbW9kdWxlIGluIGZpbGUKLSAgCTkJCTsgYnl0ZSBjb3VudCBvZiBzdHJpbmcgdGFibGUKLSAgCSJmb29cMF9iYXJcMCIJOyBzdHJpbmcgdGFibGUgICovCi0KLSNkZWZpbmUJUkFOTElCTUFHCSJfXy5TWU1ERUYiCS8qIEFyY2hpdmUgZmlsZSBuYW1lIGNvbnRhaW5pbmcgaW5kZXggKi8KLSNkZWZpbmUJUkFOTElCU0tFVwkzCQkvKiBDcmVhdGlvbiB0aW1lIG9mZnNldCAqLwotCi0vKiBGb3JtYXQgb2YgX18uU1lNREVGOgotICAgRmlyc3QsIGEgbG9uZ3dvcmQgY29udGFpbmluZyB0aGUgc2l6ZSBvZiB0aGUgJ3N5bWRlZicgZGF0YSB0aGF0IGZvbGxvd3MuCi0gICBTZWNvbmQsIHplcm8gb3IgbW9yZSAnc3ltZGVmJyBzdHJ1Y3R1cmVzLgotICAgVGhpcmQsIGEgbG9uZ3dvcmQgY29udGFpbmluZyB0aGUgbGVuZ3RoIG9mIHN5bWJvbCBuYW1lIHN0cmluZ3MuCi0gICBGb3VydGgsIHplcm8gb3IgbW9yZSBzeW1ib2wgbmFtZSBzdHJpbmdzIChlYWNoIGZvbGxvd2VkIGJ5IGEgbnVsbCkuICAqLwotCi1zdHJ1Y3Qgc3ltZGVmCi0gIHsKLSAgICB1bmlvbgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgc3RyaW5nX29mZnNldDsJLyogSW4gdGhlIGZpbGUgKi8KLQljaGFyICpuYW1lOwkJCS8qIEluIG1lbW9yeSwgc29tZXRpbWVzICovCi0gICAgICB9IHM7Ci0gICAgLyogdGhpcyBwb2ludHMgdG8gdGhlIGZyb250IG9mIHRoZSBmaWxlIGhlYWRlciAoQUtBIG1lbWJlciBoZWFkZXIgLS0KLSAgICAgICBhIHN0cnVjdCBhcl9oZHIpLCBub3QgdG8gdGhlIGZyb250IG9mIHRoZSBmaWxlIG9yIGludG8gdGhlIGZpbGUpLgotICAgICAgIGluIG90aGVyIHdvcmRzIGl0IG9ubHkgdGVsbHMgeW91IHdoaWNoIGZpbGUgdG8gcmVhZCAqLyAgICAgICAKLSAgICB1bnNpZ25lZCBsb25nIGZpbGVfb2Zmc2V0OwotICB9OwotCi0vKiBDb21wYXRhYmlsaXR5IHdpdGggQlNEIGNvZGUgKi8KLQotI2RlZmluZQlyYW5saWIJc3ltZGVmCi0jZGVmaW5lCXJhbl91bglzCi0jZGVmaW5lCXJhbl9zdHJ4IHN0cmluZ19vZmZzZXQKLSNkZWZpbmUJcmFuX25hbWUgbmFtZQotI2RlZmluZQlyYW5fb2ZmCWZpbGVfb2Zmc2V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvcmVsb2MuaCBiL2luY2x1ZGUvYW91dC9yZWxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjNjNTUyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9yZWxvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogcmVsb2MuaCAtLSBIZWFkZXIgZmlsZSBmb3IgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAxOTg5LTE5OTEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBSZWxvY2F0aW9uIHR5cGVzIGZvciBhLm91dCBmaWxlcyB1c2luZyByZWxvY19pbmZvX2V4dGVuZGVkCi0gICAoU1BBUkMgYW5kIEFNRCAyOTAwMCkuICovCi0KLSNpZm5kZWYgX1JFTE9DX0hfUkVBRF8KLSNkZWZpbmUgX1JFTE9DX0hfUkVBRF8gMQotCi1lbnVtIHJlbG9jX3R5cGUKLSAgewotICAgIFJFTE9DXzgsICAgICAgICBSRUxPQ18xNiwgICAgICAgIFJFTE9DXzMyLCAvKiBzaW1wbGUgcmVsb2NhdGlvbnMgKi8KLSAgICBSRUxPQ19ESVNQOCwgICAgUkVMT0NfRElTUDE2LCAgICBSRUxPQ19ESVNQMzIsIC8qIHBjLXJlbCBkaXNwbGFjZW1lbnQgKi8KLSAgICBSRUxPQ19XRElTUDMwLCAgUkVMT0NfV0RJU1AyMiwKLSAgICBSRUxPQ19ISTIyLCAgICAgUkVMT0NfMjIsCi0gICAgUkVMT0NfMTMsICAgICAgIFJFTE9DX0xPMTAsCi0gICAgUkVMT0NfU0ZBX0JBU0UsIFJFTE9DX1NGQV9PRkYxMywKLSAgICBSRUxPQ19CQVNFMTAsICAgUkVMT0NfQkFTRTEzLCAgICBSRUxPQ19CQVNFMjIsIC8qIFAuSS5DLiAoYmFzZS1yZWxhdGl2ZSkgKi8KLSAgICBSRUxPQ19QQzEwLCAgICAgUkVMT0NfUEMyMiwJLyogZm9yIHNvbWUgc29ydCBvZiBwYy1yZWwgUC5JLkMuICg/KSAqLwotICAgIFJFTE9DX0pNUF9UQkwsCQkvKiBQLkkuQy4ganVtcCB0YWJsZSAqLwotICAgIFJFTE9DX1NFR09GRjE2LAkJLyogcmVwdXRlZGx5IGZvciBzaGFyZWQgbGlicmFyaWVzIHNvbWVob3cgKi8KLSAgICBSRUxPQ19HTE9CX0RBVCwgIFJFTE9DX0pNUF9TTE9ULCBSRUxPQ19SRUxBVElWRSwKLSAgICBSRUxPQ18xMSwKLSAgICBSRUxPQ19XRElTUDJfMTQsCi0gICAgUkVMT0NfV0RJU1AxOSwKLSAgICBSRUxPQ19ISEkyMiwKLSAgICBSRUxPQ19ITE8xMCwKLSAgICAKLSAgICAvKiAyOUsgcmVsb2NhdGlvbiB0eXBlcyAqLwotICAgIFJFTE9DX0pVTVBUQVJHLCBSRUxPQ19DT05TVCwgICAgIFJFTE9DX0NPTlNUSCwKLSAgICAKLSAgICBSRUxPQ19XRElTUDE0LCBSRUxPQ19XRElTUDIxLAotICAgIAotICAgIE5PX1JFTE9DCi0gICAgfTsKLQotI2RlZmluZQlSRUxPQ19UWVBFX05BTUVTIFwKLSI4IiwJCSIxNiIsCQkiMzIiLAkJIkRJU1A4IiwJXAotIkRJU1AxNiIsCSJESVNQMzIiLAkiV0RJU1AzMCIsCSJXRElTUDIyIiwJXAotIkhJMjIiLAkJIjIyIiwJCSIxMyIsCQkiTE8xMCIsCQlcCi0iU0ZBX0JBU0UiLAkiU0ZBT0ZGMTMiLAkiQkFTRTEwIiwJIkJBU0UxMyIsCVwKLSJCQVNFMjIiLAkiUEMxMCIsCQkiUEMyMiIsCQkiSk1QX1RCTCIsCVwKLSJTRUdPRkYxNiIsCSJHTE9CX0RBVCIsCSJKTVBfU0xPVCIsCSJSRUxBVElWRSIsCVwKLSIxMSIsCQkiV0RJU1AyXzE0IiwJIldESVNQMTkiLCAJIkhISTIyIiwJXAotIkhMTzEwIiwJCQkJCQkJXAotIkpVTVBUQVJHIiwJIkNPTlNUIiwJIkNPTlNUSCIsCSJXRElTUDE0IiwJXAotIldESVNQMjEiLAlcCi0iTk9fUkVMT0MiCi0KLSNlbmRpZiAvKiBfUkVMT0NfSF9SRUFEXyAqLwotCi0vKiBlbmQgb2YgcmVsb2MuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3N0YWIuZGVmIGIvaW5jbHVkZS9hb3V0L3N0YWIuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzJkMmRkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9zdGFiLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKiBUYWJsZSBvZiBEQlggc3ltYm9sIGNvZGVzIGZvciB0aGUgR05VIHN5c3RlbS4KLSAgIENvcHlyaWdodCAoQykgMTk4OCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0vKiBOZXcgc3RhYiBmcm9tIFNvbGFyaXMgMi4gIFRoaXMgdXNlcyBhbiBuX3R5cGUgb2YgMCwgd2hpY2ggaW4gYS5vdXQgZmlsZXMKLSAgIG92ZXJsYXBzIHRoZSBOX1VOREYgdXNlZCBmb3Igb3JkaW5hcnkgc3ltYm9scy4gIEluIEVMRiBmaWxlcywgdGhlCi0gICBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBpbiBhIGRpZmZlcmVudCBmaWxlIHNlY3Rpb24sIHNvIHRoZXJlIGlzIG5vIGNvbmZsaWN0LgotICAgVGhpcyBzeW1ib2wncyBuX3ZhbHVlIGdpdmVzIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgc2VjdGlvbiBhc3NvY2lhdGVkCi0gICB3aXRoIHRoaXMgZmlsZS4gIFRoZSBzeW1ib2wncyBuX3N0cnggKHJlbGF0aXZlIHRvIHRoZSBqdXN0LXVwZGF0ZWQKLSAgIHN0cmluZyBzZWN0aW9uIHN0YXJ0IGFkZHJlc3MpIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSwKLSAgIGUuZy4gImZvby5jIiwgd2l0aG91dCBhbnkgcGF0aCBpbmZvcm1hdGlvbi4gIFRoZSBzeW1ib2wncyBuX2Rlc2MgZ2l2ZXMKLSAgIHRoZSBjb3VudCBvZiB1cGNvbWluZyBzeW1ib2xzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbGUgKG5vdCBpbmNsdWRpbmcKLSAgIHRoaXMgb25lKS4gICovCi0vKiBfX2RlZmluZV9zdGFiIChOX1VOREYsIDB4MDAsICJVTkRGIikgICovCi0KLS8qIEdsb2JhbCB2YXJpYWJsZS4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuCi0gICBUbyBmaW5kIHRoZSBhZGRyZXNzLCBsb29rIGluIHRoZSBjb3JyZXNwb25kaW5nIGV4dGVybmFsIHN5bWJvbC4gICovCi1fX2RlZmluZV9zdGFiIChOX0dTWU0sIDB4MjAsICJHU1lNIikKLQotLyogRnVuY3Rpb24gbmFtZSBmb3IgQlNEIEZvcnRyYW4uICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgotICAgVG8gZmluZCB0aGUgYWRkcmVzcywgbG9vayBpbiB0aGUgY29ycmVzcG9uZGluZyBleHRlcm5hbCBzeW1ib2wuICAqLwotX19kZWZpbmVfc3RhYiAoTl9GTkFNRSwgMHgyMiwgIkZOQU1FIikKLQotLyogRnVuY3Rpb24gbmFtZSBvciB0ZXh0LXNlZ21lbnQgdmFyaWFibGUgZm9yIEMuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4KLSAgIERlc2MgaXMgc3VwcG9zZWRseSBzdGFydGluZyBsaW5lIG51bWJlciwgYnV0IEdDQyBkb2Vzbid0IHNldCBpdAotICAgYW5kIERCWCBzZWVtcyBub3QgdG8gbWlzcyBpdC4gICovCi1fX2RlZmluZV9zdGFiIChOX0ZVTiwgMHgyNCwgIkZVTiIpCi0KLS8qIERhdGEtc2VnbWVudCB2YXJpYWJsZSB3aXRoIGludGVybmFsIGxpbmthZ2UuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4KLSAgICJTdGF0aWMgU3ltIi4gICovCi1fX2RlZmluZV9zdGFiIChOX1NUU1lNLCAweDI2LCAiU1RTWU0iKQotCi0vKiBCU1Mtc2VnbWVudCB2YXJpYWJsZSB3aXRoIGludGVybmFsIGxpbmthZ2UuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0xDU1lNLCAweDI4LCAiTENTWU0iKQotCi0vKiBOYW1lIG9mIG1haW4gcm91dGluZS4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9NQUlOLCAweDJhLCAiTUFJTiIpCi0KLS8qIFNvbGFyaXMyOiAgUmVhZC1vbmx5IGRhdGEgc3ltYm9scy4gICovCi1fX2RlZmluZV9zdGFiIChOX1JPU1lNLCAweDJjLCAiUk9TWU0iKQotCi0vKiBHbG9iYWwgc3ltYm9sIGluIFBhc2NhbC4KLSAgIFN1cHBvc2VkbHkgdGhlIHZhbHVlIGlzIGl0cyBsaW5lIG51bWJlcjsgSSdtIHNrZXB0aWNhbC4gICovCi1fX2RlZmluZV9zdGFiIChOX1BDLCAweDMwLCAiUEMiKQotCi0vKiBOdW1iZXIgb2Ygc3ltYm9sczogIDAsIGZpbGVzLCxmdW5jcyxsaW5lcyBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICovCi1fX2RlZmluZV9zdGFiIChOX05TWU1TLCAweDMyLCAiTlNZTVMiKQotCi0vKiAiTm8gRFNUIG1hcCBmb3Igc3ltOiBuYW1lLCAsMCx0eXBlLGlnbm9yZWQiICBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICovCi1fX2RlZmluZV9zdGFiIChOX05PTUFQLCAweDM0LCAiTk9NQVAiKQotCi0vKiBOZXcgc3RhYiBmcm9tIFNvbGFyaXMgMi4gIExpa2UgTl9TTywgYnV0IGZvciB0aGUgb2JqZWN0IGZpbGUuICBUd28gaW4KLSAgIGEgcm93IHByb3ZpZGUgdGhlIGJ1aWxkIGRpcmVjdG9yeSBhbmQgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIC5vIGZyb20gaXQuCi0gICBTb2xhcmlzMiB1c2VzIHRoaXMgdG8gYXZvaWQgcHV0dGluZyB0aGUgc3RhYnMgaW5mbyBpbnRvIHRoZSBsaW5rZWQKLSAgIGV4ZWN1dGFibGU7IHRoaXMgc3RhYiBnb2VzIGludG8gdGhlICIuc3RhYi5pbmRleCIgc2VjdGlvbiwgYW5kIHRoZSBkZWJ1Z2dlcgotICAgcmVhZHMgdGhlIHJlYWwgc3RhYnMgZGlyZWN0bHkgZnJvbSB0aGUgLm8gZmlsZXMgaW5zdGVhZC4gICovCi1fX2RlZmluZV9zdGFiIChOX09CSiwgMHgzOCwgIk9CSiIpCi0KLS8qIE5ldyBzdGFiIGZyb20gU29sYXJpcyAyLiAgT3B0aW9ucyBmb3IgdGhlIGRlYnVnZ2VyLCByZWxhdGVkIHRvIHRoZQotICAgc291cmNlIGxhbmd1YWdlIGZvciB0aGlzIG1vZHVsZS4gIEUuZy4gd2hldGhlciB0byB1c2UgQU5TSQotICAgaW50ZWdyYWwgcHJvbW90aW9ucyBvciB0cmFkaXRpb25hbCBpbnRlZ3JhbCBwcm9tb3Rpb25zLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fT1BULCAweDNjLCAiT1BUIikKLQotLyogUmVnaXN0ZXIgdmFyaWFibGUuICBWYWx1ZSBpcyBudW1iZXIgb2YgcmVnaXN0ZXIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9SU1lNLCAweDQwLCAiUlNZTSIpCi0KLS8qIE1vZHVsYS0yIGNvbXBpbGF0aW9uIHVuaXQuICBDYW4gc29tZW9uZSBzYXkgd2hhdCBpbmZvIGl0IGNvbnRhaW5zPyAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fTTJDLCAweDQyLCAiTTJDIikKLQotLyogTGluZSBudW1iZXIgaW4gdGV4dCBzZWdtZW50LiAgRGVzYyBpcyB0aGUgbGluZSBudW1iZXI7Ci0gICB2YWx1ZSBpcyBjb3JyZXNwb25kaW5nIGFkZHJlc3MuICBPbiBTb2xhcmlzMiwgdGhlIGxpbmUgbnVtYmVyIGlzCi0gICByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotX19kZWZpbmVfc3RhYiAoTl9TTElORSwgMHg0NCwgIlNMSU5FIikKLQotLyogU2ltaWxhciwgZm9yIGRhdGEgc2VnbWVudC4gICovCi1fX2RlZmluZV9zdGFiIChOX0RTTElORSwgMHg0NiwgIkRTTElORSIpCi0KLS8qIFNpbWlsYXIsIGZvciBic3Mgc2VnbWVudC4gICovCi1fX2RlZmluZV9zdGFiIChOX0JTTElORSwgMHg0OCwgIkJTTElORSIpCi0KLS8qIFN1bidzIHNvdXJjZS1jb2RlIGJyb3dzZXIgc3RhYnMuICA/PyBEb24ndCBrbm93IHdoYXQgdGhlIGZpZWxkcyBhcmUuCi0gICBTdXBwb3NlZGx5IHRoZSBmaWVsZCBpcyAicGF0aCB0byBhc3NvY2lhdGVkIC5jYiBmaWxlIi4gIFRISVMgVkFMVUUKLSAgIE9WRVJMQVBTIFdJVEggTl9CU0xJTkUhICAqLwotX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUgKE5fQlJPV1MsIDB4NDgsICJCUk9XUyIpCi0KLS8qIEdOVSBNb2R1bGEtMiBkZWZpbml0aW9uIG1vZHVsZSBkZXBlbmRlbmN5LiAgVmFsdWUgaXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lCi0gICBvZiB0aGUgZGVmaW5pdGlvbiBmaWxlLiAgT3RoZXIgaXMgbm9uLXplcm8gaWYgaXQgaXMgaW1wb3J0ZWQgd2l0aCB0aGUKLSAgIEdOVSBNMiBrZXl3b3JkICVJTklUSUFMSVpFLiAgUGVyaGFwcyBOX00yQyBjYW4gYmUgdXNlZCBpZiB0aGVyZQotICAgYXJlIGVub3VnaCBlbXB0eSBmaWVsZHM/ICovCi1fX2RlZmluZV9zdGFiKE5fREVGRCwgMHg0YSwgIkRFRkQiKQotCi0vKiBOZXcgaW4gU29sYXJpczIuICBGdW5jdGlvbiBzdGFydC9ib2R5L2VuZCBsaW5lIG51bWJlcnMuICAqLwotX19kZWZpbmVfc3RhYihOX0ZMSU5FLCAweDRDLCAiRkxJTkUiKQotCi0vKiBUSEUgRk9MTE9XSU5HIFRXTyBTVEFCIFZBTFVFUyBDT05GTElDVC4gIEhhcHBpbHksIG9uZSBpcyBmb3IgTW9kdWxhLTIKLSAgIGFuZCBvbmUgaXMgZm9yIEMrKy4gICBTdGlsbCwuLi4gKi8KLS8qIEdOVSBDKysgZXhjZXB0aW9uIHZhcmlhYmxlLiAgTmFtZSBpcyB2YXJpYWJsZSBuYW1lLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRUhERUNMLCAweDUwLCAiRUhERUNMIikKLS8qIE1vZHVsYTIgaW5mbyAiZm9yIGltYyI6ICBuYW1lLCwwLDAsMCAgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAgKi8KLV9fZGVmaW5lX3N0YWJfZHVwbGljYXRlIChOX01PRDIsIDB4NTAsICJNT0QyIikKLQotLyogR05VIEMrKyBgY2F0Y2gnIGNsYXVzZS4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLiAgRGVzYyBpcyBub256ZXJvIGlmCi0gICB0aGlzIGVudHJ5IGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgQ0FVR0hUIHN0YWIgc2F5aW5nIHdoYXQgZXhjZXB0aW9uCi0gICB3YXMgY2F1Z2h0LiAgTXVsdGlwbGUgQ0FVR0hUIHN0YWJzIG1lYW5zIHRoYXQgbXVsdGlwbGUgZXhjZXB0aW9ucwotICAgY2FuIGJlIGNhdWdodCBoZXJlLiAgSWYgRGVzYyBpcyAwLCBpdCBtZWFucyBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0Ci0gICBoZXJlLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fQ0FUQ0gsIDB4NTQsICJDQVRDSCIpCi0KLS8qIFN0cnVjdHVyZSBvciB1bmlvbiBlbGVtZW50LiAgVmFsdWUgaXMgb2Zmc2V0IGluIHRoZSBzdHJ1Y3R1cmUuICAqLwotX19kZWZpbmVfc3RhYiAoTl9TU1lNLCAweDYwLCAiU1NZTSIpCi0KLS8qIFNvbGFyaXMyOiAgTGFzdCBzdGFiIGVtaXR0ZWQgZm9yIG1vZHVsZS4gICovCi1fX2RlZmluZV9zdGFiIChOX0VORE0sIDB4NjIsICJFTkRNIikKLQotLyogTmFtZSBvZiBtYWluIHNvdXJjZSBmaWxlLgotICAgVmFsdWUgaXMgc3RhcnRpbmcgdGV4dCBhZGRyZXNzIG9mIHRoZSBjb21waWxhdGlvbi4KLSAgIElmIG11bHRpcGxlIE5fU08ncyBhcHBlYXIsIHRoZSBmaXJzdCB0byBjb250YWluIGEgdHJhaWxpbmcgLyBpcyB0aGUKLSAgIGNvbXBpbGF0aW9uIGRpcmVjdG9yeS4gIFRoZSBmaXJzdCB0byBub3QgY29udGFpbiBhIHRyYWlsaW5nIC8gaXMgdGhlCi0gICBzb3VyY2UgZmlsZSBuYW1lLCByZWxhdGl2ZSB0byB0aGUgY29tcGlsYXRpb24gZGlyZWN0b3J5LiAgT3RoZXJzIChwZXJoYXBzCi0gICByZXN1bHRpbmcgZnJvbSBjZnJvbnQpIGFyZSBpZ25vcmVkLgotICAgT24gU29sYXJpczIsIHZhbHVlIGlzIHVuZGVmaW5lZCwgYnV0IGRlc2MgaXMgYSBzb3VyY2UtbGFuZ3VhZ2UgY29kZS4gICovCi0KLV9fZGVmaW5lX3N0YWIgKE5fU08sIDB4NjQsICJTTyIpCi0KLS8qIFN1blBybyBGNzc6ICBOYW1lIG9mIGFsaWFzLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fQUxJQVMsIDB4NmMsICJBTElBUyIpCi0KLS8qIEF1dG9tYXRpYyB2YXJpYWJsZSBpbiB0aGUgc3RhY2suICBWYWx1ZSBpcyBvZmZzZXQgZnJvbSBmcmFtZSBwb2ludGVyLgotICAgQWxzbyB1c2VkIGZvciB0eXBlIGRlc2NyaXB0aW9ucy4gICovCi1fX2RlZmluZV9zdGFiIChOX0xTWU0sIDB4ODAsICJMU1lNIikKLQotLyogQmVnaW5uaW5nIG9mIGFuIGluY2x1ZGUgZmlsZS4gIE9ubHkgU3VuIHVzZXMgdGhpcy4KLSAgIEluIGFuIG9iamVjdCBmaWxlLCBvbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgotICAgVGhlIFN1biBsaW5rZXIgcHV0cyBkYXRhIGludG8gc29tZSBvZiB0aGUgb3RoZXIgZmllbGRzLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fQklOQ0wsIDB4ODIsICJCSU5DTCIpCi0KLS8qIE5hbWUgb2Ygc3ViLXNvdXJjZSBmaWxlICgjaW5jbHVkZSBmaWxlKS4KLSAgIFZhbHVlIGlzIHN0YXJ0aW5nIHRleHQgYWRkcmVzcyBvZiB0aGUgY29tcGlsYXRpb24uICAqLwotX19kZWZpbmVfc3RhYiAoTl9TT0wsIDB4ODQsICJTT0wiKQotCi0vKiBQYXJhbWV0ZXIgdmFyaWFibGUuICBWYWx1ZSBpcyBvZmZzZXQgZnJvbSBhcmd1bWVudCBwb2ludGVyLgotICAgKE9uIG1vc3QgbWFjaGluZXMgdGhlIGFyZ3VtZW50IHBvaW50ZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGZyYW1lIHBvaW50ZXIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9QU1lNLCAweGEwLCAiUFNZTSIpCi0KLS8qIEVuZCBvZiBhbiBpbmNsdWRlIGZpbGUuICBObyBuYW1lLgotICAgVGhpcyBhbmQgTl9CSU5DTCBhY3QgYXMgYnJhY2tldHMgYXJvdW5kIHRoZSBmaWxlJ3Mgb3V0cHV0LgotICAgSW4gYW4gb2JqZWN0IGZpbGUsIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGRhdGEgaW4gdGhpcyBlbnRyeS4KLSAgIFRoZSBTdW4gbGlua2VyIHB1dHMgZGF0YSBpbnRvIHNvbWUgb2YgdGhlIGZpZWxkcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0VJTkNMLCAweGEyLCAiRUlOQ0wiKQotCi0vKiBBbHRlcm5hdGUgZW50cnkgcG9pbnQuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0VOVFJZLCAweGE0LCAiRU5UUlkiKQotCi0vKiBCZWdpbm5pbmcgb2YgbGV4aWNhbCBibG9jay4KLSAgIFRoZSBkZXNjIGlzIHRoZSBuZXN0aW5nIGxldmVsIGluIGxleGljYWwgYmxvY2tzLgotICAgVGhlIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBmb3IgdGhlIGJsb2NrLgotICAgVGhlIHZhcmlhYmxlcyBkZWNsYXJlZCBpbnNpZGUgdGhlIGJsb2NrICpwcmVjZWRlKiB0aGUgTl9MQlJBQyBzeW1ib2wuCi0gICBPbiBTb2xhcmlzMiwgdGhlIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi1fX2RlZmluZV9zdGFiIChOX0xCUkFDLCAweGMwLCAiTEJSQUMiKQotCi0vKiBQbGFjZSBob2xkZXIgZm9yIGRlbGV0ZWQgaW5jbHVkZSBmaWxlLiAgUmVwbGFjZXMgYSBOX0JJTkNMIGFuZCBldmVyeXRoaW5nCi0gICB1cCB0byB0aGUgY29ycmVzcG9uZGluZyBOX0VJTkNMLiAgVGhlIFN1biBsaW5rZXIgZ2VuZXJhdGVzIHRoZXNlIHdoZW4KLSAgIGl0IGZpbmRzIG11bHRpcGxlIGlkZW50aWNhbCBjb3BpZXMgb2YgdGhlIHN5bWJvbHMgZnJvbSBhbiBpbmNsdWRlIGZpbGUuCi0gICBUaGlzIGFwcGVhcnMgb25seSBpbiBvdXRwdXQgZnJvbSB0aGUgU3VuIGxpbmtlci4gICovCi1fX2RlZmluZV9zdGFiIChOX0VYQ0wsIDB4YzIsICJFWENMIikKLQotLyogTW9kdWxhLTIgc2NvcGUgaW5mb3JtYXRpb24uICBDYW4gc29tZW9uZSBzYXkgd2hhdCBpbmZvIGl0IGNvbnRhaW5zPyAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fU0NPUEUsIDB4YzQsICJTQ09QRSIpCi0KLS8qIEVuZCBvZiBhIGxleGljYWwgYmxvY2suICBEZXNjIG1hdGNoZXMgdGhlIE5fTEJSQUMncyBkZXNjLgotICAgVGhlIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIHRleHQgZm9yIHRoZSBibG9jay4KLSAgIE9uIFNvbGFyaXMyLCB0aGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fUkJSQUMsIDB4ZTAsICJSQlJBQyIpCi0KLS8qIEJlZ2luIG5hbWVkIGNvbW1vbiBibG9jay4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9CQ09NTSwgMHhlMiwgIkJDT01NIikKLQotLyogRW5kIG5hbWVkIGNvbW1vbiBibG9jay4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQKLSAgIChhbmQgaXQgc2hvdWxkIG1hdGNoIHRoZSBOX0JDT01NKS4gICovCi1fX2RlZmluZV9zdGFiIChOX0VDT01NLCAweGU0LCAiRUNPTU0iKQotCi0vKiBNZW1iZXIgb2YgYSBjb21tb24gYmxvY2s7IHZhbHVlIGlzIG9mZnNldCB3aXRoaW4gdGhlIGNvbW1vbiBibG9jay4KLSAgIFRoaXMgc2hvdWxkIG9jY3VyIHdpdGhpbiBhIEJDT01NL0VDT01NIHBhaXIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FQ09NTCwgMHhlOCwgIkVDT01MIikKLQotLyogU29sYXJpczI6IFBhc2NhbCAid2l0aCIgc3RhdGVtZW50OiB0eXBlLCwwLDAsb2Zmc2V0ICovCi1fX2RlZmluZV9zdGFiIChOX1dJVEgsIDB4ZWEsICJXSVRIIikKLQotLyogVGhlc2UgU1RBQidzIGFyZSB1c2VkIG9uIEdvdWxkIHN5c3RlbXMgZm9yIE5vbi1CYXNlIHJlZ2lzdGVyIHN5bWJvbHMKLSAgIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuICBGSVhNRS4gIEkgaGF2ZSBhc3NpZ25lZCB0aGUgdmFsdWVzIGF0IHJhbmRvbQotICAgc2luY2UgSSBkb24ndCBoYXZlIGEgR291bGQgaGVyZS4gIEZpeHVwcyBmcm9tIEdvdWxkIGZvbGsgd2VsY29tZS4uLiAqLwotX19kZWZpbmVfc3RhYiAoTl9OQlRFWFQsIDB4RjAsICJOQlRFWFQiKQotX19kZWZpbmVfc3RhYiAoTl9OQkRBVEEsIDB4RjIsICJOQkRBVEEiKQotX19kZWZpbmVfc3RhYiAoTl9OQkJTUywgIDB4RjQsICJOQkJTUyIpCi1fX2RlZmluZV9zdGFiIChOX05CU1RTLCAgMHhGNiwgIk5CU1RTIikKLV9fZGVmaW5lX3N0YWIgKE5fTkJMQ1MsICAweEY4LCAiTkJMQ1MiKQotCi0vKiBTZWNvbmQgc3ltYm9sIGVudHJ5IGNvbnRhaW5pbmcgYSBsZW5ndGgtdmFsdWUgZm9yIHRoZSBwcmVjZWRpbmcgZW50cnkuCi0gICBUaGUgdmFsdWUgaXMgdGhlIGxlbmd0aC4gICovCi1fX2RlZmluZV9zdGFiIChOX0xFTkcsIDB4ZmUsICJMRU5HIikKLQwKLS8qIFRoZSBhYm92ZSBpbmZvcm1hdGlvbiwgaW4gbWF0cml4IGZvcm1hdC4KLQotCQkJU1RBQiBNQVRSSVgKLQlfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0JfCAwMCAtIDFGIGFyZSBub3QgZGJ4IHN0YWIgc3ltYm9scwkJfAotCXwgSW4gbW9zdCBjYXNlcywgdGhlIGxvdyBiaXQgaXMgdGhlIEVYVGVybmFsIGJpdHwKLQotCXwgMDAgVU5ERUYgIHwgMDIgQUJTCXwgMDQgVEVYVCAgIHwgMDYgREFUQQl8Ci0JfCAwMSAgfEVYVCAgfCAwMyAgfEVYVAl8IDA1ICB8RVhUICB8IDA3ICB8RVhUCXwKLQotCXwgMDggQlNTICAgIHwgMEEgSU5EUgl8IDBDIEZOX1NFUSB8IDBFIFdFQUtBCXwKLQl8IDA5ICB8RVhUICB8IDBCIAl8IDBEIFdFQUtVICB8IDBGIFdFQUtUCXwKLQotCXwgMTAgV0VBS0QgIHwgMTIgQ09NTQl8IDE0IFNFVEEgICB8IDE2IFNFVFQJfAotCXwgMTEgV0VBS0IgIHwgMTMJfCAxNSAJICAgIHwgMTcJfAotCi0JfCAxOCBTRVREICAgfCAxQSBTRVRCCXwgMUMgU0VUViAgIHwgMUUgV0FSTklOR3wKLQl8IDE5CSAgICB8IDFCCXwgMUQgCSAgICB8IDFGIEZOCXwKLQotCXxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLQl8IERlYnVnIGVudHJpZXMgd2l0aCBiaXQgMDEgc2V0IGFyZSB1bnVzZWQuCXwKLQl8IDIwIEdTWU0gICB8IDIyIEZOQU1FCXwgMjQgRlVOICAgIHwgMjYgU1RTWU0JfAotCXwgMjggTENTWU0gIHwgMkEgTUFJTgl8IDJDIFJPU1lNICB8IDJFCXwKLQl8IDMwIFBDCSAgICB8IDMyIE5TWU1TCXwgMzQgTk9NQVAgIHwgMzYJfAotCXwgMzggT0JKICAgIHwgM0EJfCAzQyBPUFQgICAgfCAzRQl8Ci0JfCA0MCBSU1lNICAgfCA0MiBNMkMJfCA0NCBTTElORSAgfCA0NiBEU0xJTkUgfAotCXwgNDggQlNMSU5FKnwgNEEgREVGRAl8IDRDIEZMSU5FICB8IDRFCXwKLQl8IDUwIEVIREVDTCp8IDUyCXwgNTQgQ0FUQ0ggIHwgNTYgICAgICAgIHwKLQl8IDU4ICAgICAgICB8IDVBICAgICAgICB8IDVDICAgICAgICB8IDVFCXwKLQl8IDYwIFNTWU0gICB8IDYyIEVORE0JfCA2NCBTTwkgICAgfCA2NiAJfAotCXwgNjggCSAgICB8IDZBCXwgNkMgQUxJQVMgIHwgNkUJfAotCXwgNzAJICAgIHwgNzIJfCA3NAkgICAgfCA3Ngl8Ci0JfCA3OAkgICAgfCA3QQl8IDdDCSAgICB8IDdFCXwKLQl8IDgwIExTWU0gICB8IDgyIEJJTkNMCXwgODQgU09MICAgIHwgODYJfAotCXwgODgJICAgIHwgOEEJfCA4QwkgICAgfCA4RQl8Ci0JfCA5MAkgICAgfCA5Mgl8IDk0CSAgICB8IDk2CXwKLQl8IDk4CSAgICB8IDlBCXwgOUMJICAgIHwgOUUJfAotCXwgQTAgUFNZTSAgIHwgQTIgRUlOQ0wJfCBBNCBFTlRSWSAgfCBBNgl8Ci0JfCBBOAkgICAgfCBBQQl8IEFDCSAgICB8IEFFCXwKLQl8IEIwCSAgICB8IEIyCXwgQjQJICAgIHwgQjYJfAotCXwgQjgJICAgIHwgQkEJfCBCQwkgICAgfCBCRQl8Ci0JfCBDMCBMQlJBQyAgfCBDMiBFWENMCXwgQzQgU0NPUEUgIHwgQzYJfAotCXwgQzgJICAgIHwgQ0EJfCBDQwkgICAgfCBDRQl8Ci0JfCBEMAkgICAgfCBEMgl8IEQ0CSAgICB8IEQ2CXwKLQl8IEQ4CSAgICB8IERBCXwgREMJICAgIHwgREUJfAotCXwgRTAgUkJSQUMgIHwgRTIgQkNPTU0JfCBFNCBFQ09NTSAgfCBFNgl8Ci0JfCBFOCBFQ09NTCAgfCBFQSBXSVRICXwgRUMJICAgIHwgRUUJfAotCXwgRjAJICAgIHwgRjIJfCBGNAkgICAgfCBGNgl8Ci0JfCBGOAkgICAgfCBGQQl8IEZDCSAgICB8IEZFIExFTkcJfAotCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqIDUwIEVIREVDTCBpcyBhbHNvIE1PRDIuCi0gKiA0OCBCU0xJTkUgaXMgYWxzbyBCUk9XUy4KLSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3N0YWJfZ251LmggYi9pbmNsdWRlL2FvdXQvc3RhYl9nbnUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxOGUxNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvc3RhYl9nbnUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNpZm5kZWYgX19HTlVfU1RBQl9fCi0KLS8qIEluZGljYXRlIHRoZSBHTlUgc3RhYi5oIGlzIGluIHVzZS4gICovCi0KLSNkZWZpbmUgX19HTlVfU1RBQl9fCi0KLSNkZWZpbmUgX19kZWZpbmVfc3RhYihOQU1FLCBDT0RFLCBTVFJJTkcpIE5BTUU9Q09ERSwKLSNkZWZpbmUgX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUoTkFNRSwgQ09ERSwgU1RSSU5HKSBOQU1FPUNPREUsCi0KLWVudW0gX19zdGFiX2RlYnVnX2NvZGUKLXsKLSNpbmNsdWRlICJhb3V0L3N0YWIuZGVmIgotTEFTVF9VTlVTRURfU1RBQl9DT0RFCi19OwotCi0jdW5kZWYgX19kZWZpbmVfc3RhYgotCi0vKiBEZWZpbml0aW9ucyBvZiAiZGVzYyIgZmllbGQgZm9yIE5fU08gc3RhYnMgaW4gU29sYXJpczIuICAqLwotCi0jZGVmaW5lCU5fU09fQVMJCTEKLSNkZWZpbmUJTl9TT19DCQkyCi0jZGVmaW5lCU5fU09fQU5TSV9DCTMKLSNkZWZpbmUJTl9TT19DQwkJNAkvKiBDKysgKi8KLSNkZWZpbmUJTl9TT19GT1JUUkFOCTUKLSNkZWZpbmUJTl9TT19QQVNDQUwJNgotCi0vKiBTb2xhcmlzMjogRmxvYXRpbmcgcG9pbnQgdHlwZSB2YWx1ZXMgaW4gYmFzaWMgdHlwZXMuICAqLwotCi0jZGVmaW5lCU5GX05PTkUJCTAKLSNkZWZpbmUJTkZfU0lOR0xFCTEJLyogSUVFRSAzMi1iaXQgKi8KLSNkZWZpbmUJTkZfRE9VQkxFCTIJLyogSUVFRSA2NC1iaXQgKi8KLSNkZWZpbmUJTkZfQ09NUExFWAkzCS8qIEZvcnRyYW4gY29tcGxleCAqLwotI2RlZmluZQlORl9DT01QTEVYMTYJNAkvKiBGb3J0cmFuIGRvdWJsZSBjb21wbGV4ICovCi0jZGVmaW5lCU5GX0NPTVBMRVgzMgk1CS8qIEZvcnRyYW4gY29tcGxleCoxNiAqLwotI2RlZmluZQlORl9MRE9VQkxFCTYJLyogTG9uZyBkb3VibGUgKHdoYXRldmVyIHRoYXQgaXMpICovCi0KLSNlbmRpZiAvKiBfX0dOVV9TVEFCXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3N1bjQuaCBiL2luY2x1ZGUvYW91dC9zdW40LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MmEwZGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L3N1bjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKiBTUEFSQy1zcGVjaWZpYyB2YWx1ZXMgZm9yIGEub3V0IGZpbGVzICovCi0KLS8qIFNvbWUgc3lzdGVtcywgZS5nLiwgQUlYLCBtYXkgaGF2ZSBkZWZpbmVkIHRoaXMgaW4gaGVhZGVyIGZpbGVzIGFscmVhZHkKLSAgIGluY2x1ZGVkLiAgKi8KLSN1bmRlZiBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgyMDAwCQkvKiA4Sy4gIGFrYSBOQlBHIGluIDxzeXMvcGFyYW0uaD4gKi8KLS8qIE5vdGUgdGhhdCBzb21lIFNQQVJDcyBoYXZlIDRLIHBhZ2VzLCBzb21lIDhLLCBzb21lIG90aGVycy4gICovCi0KLSNkZWZpbmUgU0VHX1NJWkVfU1BBUkMJVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZQlTRUdfU0laRV9TVU4zCTB4MjAwMDAJCS8qIFJlc29sdXRpb24gb2Ygci93IHByb3RlY3Rpb24gaHcgKi8KLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJVEFSR0VUX1BBR0VfU0laRQkvKiBMb2NhdGlvbiAwIGlzIG5vdCBhY2Nlc3NpYmxlICovCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMQotCi0vKiBOb24tZGVmYXVsdCBkZWZpbml0aW9ucyBvZiB0aGUgYWNjZXNzb3IgbWFjcm9zLi4uICovCi0KLS8qIFNlZ21lbnQgc2l6ZSB2YXJpZXMgb24gU3VuLTMgdmVyc3VzIFN1bi00LiAgKi8KLQotI2RlZmluZSBOX1NFR1NJWkUoeCkJKE5fTUFDSFRZUEUoeCkgPT0gTV9TUEFSQz8JU0VHX1NJWkVfU1BBUkM6CVwKLQkJCSBOX01BQ0hUWVBFKHgpID09IE1fNjgwMjA/CVNFR19TSVpFX1NVTjM6CVwKLQkJCS8qIEd1ZXNzPyAqLwkJCVRBUkdFVF9QQUdFX1NJWkUpCi0KLS8qIFZpcnR1YWwgQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgZnJvbSB0aGUgYS5vdXQgZmlsZS4gIEZvciBPTUFHSUMsCi0gICAoYWxtb3N0IGFsd2F5cyAidW5saW5rZWQgLm8ncyIgdGhlc2UgZGF5cyksIHNob3VsZCBiZSB6ZXJvLgotICAgU3VuIGFkZGVkIGEga2x1ZGdlIHNvIHRoYXQgc2hhcmVkIGxpYnJhcmllcyBsaW5rZWQgWk1BR0lDIGdldAotICAgYW4gYWRkcmVzcyBvZiB6ZXJvIGlmIGFfZW50cnkgKCEhISkgaXMgbG93ZXIgdGhhbiB0aGUgb3RoZXJ3aXNlCi0gICBleHBlY3RlZCB0ZXh0IGFkZHJlc3MuICBUaGVzZSBrbHVkZ2VzIGhhdmUgZ290dGEgZ28hCi0gICBGb3IgbGlua2VkIGZpbGVzLCBzaG91bGQgcmVmbGVjdCByZWFsaXR5IGlmIHdlIGtub3cgaXQuICAqLwotCi0vKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdmVyc2lvbiBpbiBhb3V0NjQuaCAod2hpY2ggd2Ugb3ZlcnJpZGUgYnkgZGVmaW5pbmcKLSAgIGl0IGhlcmUpIG9ubHkgZm9yIE5NQUdJQyAod2UgcmV0dXJuIFRFWFRfU1RBUlRfQUREUitFWEVDX0JZVEVTX1NJWkU7Ci0gICB0aGV5IHJldHVybiAwKS4gICovCi0KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLSAgICAoTl9NQUdJQyh4KT09T01BR0lDPyAwIFwKLSAgICAgOiAoTl9NQUdJQyh4KSA9PSBaTUFHSUMgJiYgKHgpLmFfZW50cnkgPCBURVhUX1NUQVJUX0FERFIpPyAwIFwKLSAgICAgOiBURVhUX1NUQVJUX0FERFIrRVhFQ19CWVRFU19TSVpFKQotCi0vKiBXaGVuIGEgZmlsZSBpcyBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IG9uIFN1bk9TIDQsIHRoZQotICAgZHluYW1pYyBiaXQgaW4gdGhlIGV4ZWMgaGVhZGVyIGlzIHNldCwgYW5kIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlCi0gICBzeW1ib2wgdGFibGUgaXMgX19EWU5BTUlDLiAgSXRzIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgZm9sbG93aW5nIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWMKLXsKLSAgLyogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUuICBTdW5PUyA0LjEueCBjcmVhdGVzIGZpbGVzCi0gICAgIHdpdGggdmVyc2lvbiBudW1iZXIgMywgd2hpY2ggaXMgd2hhdCB0aGlzIHN0cnVjdHVyZSBpcyBiYXNlZCBvbi4KLSAgICAgQWNjb3JkaW5nIHRvIGdkYiwgdmVyc2lvbiAyIGlzIHNpbWlsYXIuICBJIGJlbGlldmUgdGhhdCB2ZXJzaW9uIDIKLSAgICAgdXNlZCBhIGRpZmZlcmVudCB0eXBlIG9mIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBhbmQgdGhlcmUgbWF5Ci0gICAgIGhhdmUgYmVlbiBvdGhlciBkaWZmZXJlbmNlcy4gICovCi0gIGJmZF9ieXRlIGxkX3ZlcnNpb25bNF07Ci0gIC8qIFRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgYSAyOCBieXRlIHN0cnVjdHVyZSB1c2VkIGluIGRlYnVnZ2luZy4KLSAgICAgVGhlIGNvbnRlbnRzIGFyZSBmaWxsZWQgaW4gYXQgcnVuIHRpbWUgYnkgbGQuc28uICAqLwotICBiZmRfYnl0ZSBsZGRbNF07Ci0gIC8qIFRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgYW5vdGhlciBzdHJ1Y3R1cmUgd2l0aCBpbmZvcm1hdGlvbiBhYm91dAotICAgICBob3cgdG8gcmVsb2NhdGUgdGhlIGV4ZWN1dGFibGUgYXQgcnVuIHRpbWUuICAqLwotICBiZmRfYnl0ZSBsZFs0XTsKLX07Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBkZWJ1Z2dpbmcgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIGRlYnVnZ2VyCi0gICBmaWVsZCBvZiBfX0RZTkFNSUMuICAqLwotI2RlZmluZSBFWFRFUk5BTF9TVU40X0RZTkFNSUNfREVCVUdHRVJfU0laRSAoMjQpCi0KLS8qIFRoZSBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgbGlua2VyIGZpZWxkIG9mIF9fRFlOQU1JQy4gIEFzIGZhcgotICAgYXMgSSBjYW4gdGVsbCwgbW9zdCBvZiB0aGUgYWRkcmVzc2VzIGluIHRoaXMgc3RydWN0dXJlIGFyZSBvZmZzZXRzCi0gICB3aXRoaW4gdGhlIGZpbGUsIGJ1dCBzb21lIGFyZSBhY3R1YWxseSB2aXJ0dWFsIGFkZHJlc3Nlcy4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9zdW40X2R5bmFtaWNfbGluawotewotICAvKiBMaW5rZWQgbGlzdCBvZiBsb2FkZWQgb2JqZWN0cy4gIFRoaXMgaXMgZmlsbGVkIGluIGF0IHJ1bnRpbWUgYnkKLSAgICAgbGQuc28gYW5kIHByb2JhYmx5IGJ5IGRsb3Blbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfbG9hZGVkOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBsaXN0IG9mIG5hbWVzIG9mIHNoYXJlZCBvYmplY3RzIHdoaWNoIG11c3QgYmUKLSAgICAgaW5jbHVkZWQgYXQgcnVudGltZS4gIEVhY2ggZW50cnkgaW4gdGhlIGxpc3QgaXMgMTYgYnl0ZXM6IHRoZSA0Ci0gICAgIGJ5dGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nIG5hbWluZyB0aGUgb2JqZWN0IChlLmcuLCBmb3IgLWxjIHRoaXMKLSAgICAgaXMgImMiKTsgNCBieXRlcyBvZiBmbGFncy0tdGhlIGhpZ2ggYml0IGlzIHdoZXRoZXIgdG8gc2VhcmNoIGZvcgotICAgICB0aGUgb2JqZWN0IHVzaW5nIHRoZSBsaWJyYXJ5IHBhdGg7IHRoZSAyIGJ5dGUgbWFqb3IgdmVyc2lvbgotICAgICBudW1iZXI7IHRoZSAyIGJ5dGUgbWlub3IgdmVyc2lvbiBudW1iZXI7IHRoZSA0IGJ5dGUgYWRkcmVzcyBvZgotICAgICB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgbGlzdCAoemVybyBpZiB0aGlzIGlzIHRoZSBsYXN0IGVudHJ5KS4gIFRoZQotICAgICB2ZXJzaW9uIG51bWJlcnMgc2VlbSB0byBvbmx5IGJlIG5vbi16ZXJvIHdoZW4gZG9pbmcgbGlicmFyeQotICAgICBzZWFyY2hpbmcuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX25lZWQ7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHBhdGggdG8gc2VhcmNoIGZvciB0aGUgc2hhcmVkIG9iamVjdHMgd2hpY2gKLSAgICAgbXVzdCBiZSBpbmNsdWRlZC4gIFRoaXMgcG9pbnRzIHRvIGEgc3RyaW5nIGluIFBBVEggZm9ybWF0IHdoaWNoCi0gICAgIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSAtTCBhcmd1bWVudHMgdG8gdGhlIGxpbmtlci4gIEFjY29yZGluZyB0bwotICAgICB0aGUgbWFuIHBhZ2UsIGxkLnNvIGltcGxpY2l0bHkgYWRkcyAke0xEX0xJQlJBUllfUEFUSH0gdG8gdGhlCi0gICAgIGJlZ2lubmluZyBvZiB0aGlzIHN0cmluZyBhbmQgL2xpYjovdXNyL2xpYjovdXNyL2xvY2FsL2xpYiB0byB0aGUKLSAgICAgZW5kLiAgVGhlIHN0cmluZyBpcyB0ZXJtaW5hdGVkIGJ5IGEgbnVsbCBieXRlLiAgVGhpcyBmaWVsZCBpcwotICAgICB6ZXJvIGlmIHRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgcGF0aC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfcnVsZXM7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBUaGlzIGFwcGVhcnMgdG8gYmUgYQotICAgICB2aXJ0dWFsIGFkZHJlc3MsIG5vdCBhIGZpbGUgb2Zmc2V0LiAgVGhlIGZpcnN0IGVudHJ5IGluIHRoZQotICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlIHNlZW1zIHRvIGJlIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHN1bjRfZHluYW1pYyBzdHJ1Y3R1cmUgKHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBfX0RZTkFNSUMgc3ltYm9sKS4KLSAgICAgVGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgaXMgdXNlZCBmb3IgUElDIGNvZGUgdG8gaG9sZCB0aGUKLSAgICAgYWRkcmVzc2VzIG9mIHZhcmlhYmxlcy4gIEEgZHluYW1pY2FsbHkgbGlua2VkIGZpbGUgd2hpY2ggZG9lcyBub3QKLSAgICAgaXRzZWxmIGNvbnRhaW4gUElDIGNvZGUgaGFzIGEgZm91ciBieXRlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX2dvdDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBUaGlzIGFwcGVhcnMgdG8gYmUgYQotICAgICB2aXJ0dWFsIGFkZHJlc3MsIG5vdCBhIGZpbGUgb2Zmc2V0LgotCi0gICAgIE9uIGEgU1BBUkMsIHRoZSB0YWJsZSBpcyBjb21wb3NlZCBvZiAxMiBieXRlIGVudHJpZXMsIGVhY2ggb2YKLSAgICAgd2hpY2ggY29uc2lzdHMgb2YgdGhyZWUgaW5zdHJ1Y3Rpb25zLiAgVGhlIGZpcnN0IGVudHJ5IGlzCi0gICAgICAgICBzZXRoaSAlaGkoMCksJWcxCi0JIGptcCAlZzEKLQkgbm9wCi0gICAgIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgY2hhbmdlZCBieSBsZC5zbyBpbnRvIGEganVtcCBkaXJlY3RseSBpbnRvCi0gICAgIGxkLnNvIGl0c2VsZi4gIEVhY2ggc3Vic2VxdWVudCBlbnRyeSBpcwotICAgICAgICAgc2F2ZSAlc3AsIC05NiwgJXNwCi0JIGNhbGwgPGFkZHJlc3Mgb2YgZmlyc3QgZW50cnkgaW4gcHJvY2VkdXJlIGxpbmthZ2UgdGFibGU+Ci0JIDxyZWxvY19udW1iZXIgfCAweDAxMDAwMDAwPgotICAgICBUaGUgcmVsb2NfbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgdGhlIHJlbG9jIHRvIHVzZSB0byByZXNvbHZlCi0gICAgIHRoaXMgZW50cnkuICBUaGUgcmVsb2Mgd2lsbCBiZSBhIEpNUF9TTE9UIHJlbG9jIGFnYWluc3Qgc29tZQotICAgICBzeW1ib2wgdGhhdCBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIG9iamVjdCBmaWxlIGJ1dCBzaG91bGQgYmUKLSAgICAgZGVmaW5lZCBpbiBhIHNoYXJlZCBvYmplY3QgKGlmIGl0IGlzIG5vdCwgbGQuc28gd2lsbCByZXBvcnQgYQotICAgICBydW50aW1lIGVycm9yIGFuZCBleGl0KS4gIFRoZSBjb25zdGFudCAweDAxMDAwMDAwMCB0dXJucyB0aGUKLSAgICAgcmVsb2MgbnVtYmVyIGludG8gYSBzZXRoaSBvZiAlZzAsIHdoaWNoIGRvZXMgbm90aGluZyBzaW5jZSAlZzAgaXMKLSAgICAgaGFyZHdpcmVkIHRvIHplcm8uCi0KLSAgICAgV2hlbiBvbmUgb2YgdGhlc2UgZW50cmllcyBpcyBleGVjdXRlZCwgaXQgd2luZHMgdXAgY2FsbGluZyBpbnRvCi0gICAgIGxkLnNvLiAgbGQuc28gbG9va3MgYXQgdGhlIHJlbG9jIG51bWJlciwgYXZhaWxhYmxlIHZpYSB0aGUgcmV0dXJuCi0gICAgIGFkZHJlc3MsIHRvIGRldGVybWluZSB3aGljaCBlbnRyeSB0aGlzIGlzLiAgSXQgdGhlbiBsb29rcyBhdCB0aGUKLSAgICAgcmVsb2MgYW5kIHBhdGNoZXMgdXAgdGhlIGVudHJ5IGluIHRoZSB0YWJsZSBpbnRvIGEgc2V0aGkgYW5kIGptcAotICAgICB0byB0aGUgcmVhbCBhZGRyZXNzIGZvbGxvd2VkIGJ5IGEgbm9wLiAgVGhpcyBtZWFucyB0aGF0IHRoZSByZWxvYwotICAgICBsb29rdXAgb25seSBoYXMgdG8gaGFwcGVuIG9uY2UsIGFuZCBpdCBhbHNvIG1lYW5zIHRoYXQgdGhlCi0gICAgIHJlbG9jYXRpb24gb25seSBuZWVkcyB0byBiZSBkb25lIGlmIHRoZSBmdW5jdGlvbiBpcyBhY3R1YWxseQotICAgICBjYWxsZWQuICBUaGUgcmVsb2NhdGlvbiBpcyBleHBlbnNpdmUgYmVjYXVzZSBsZC5zbyBtdXN0IGxvb2sgdXAKLSAgICAgdGhlIHN5bWJvbCBieSBuYW1lLgotCi0gICAgIFRoZSBzaXplIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBpcyBnaXZlbiBieSB0aGUgbGRfcGx0X3N6Ci0gICAgIGZpZWxkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9wbHQ7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jcy4gIFRoZXNlIGFyZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMKLSAgICAgb3JkaW5hcnkgcmVsb2NzLiAgU3ltYm9sIGluZGV4IG51bWJlcnMgcmVmZXIgdG8gdGhlIHN5bWJvbHMKLSAgICAgcG9pbnRlZCB0byBieSBsZF9zdGFiLiAgSSB0aGluayB0aGUgb25seSB3YXkgdG8gZGV0ZXJtaW5lIHRoZQotICAgICBudW1iZXIgb2YgcmVsb2NzIGlzIHRvIGFzc3VtZSB0aGF0IGFsbCB0aGUgYnl0ZXMgZnJvbSBsZF9yZWwgdG8KLSAgICAgbGRfaGFzaCBjb250YWluIHJlbG9jIGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3JlbDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scy4gIFRoZSBoYXNoIHRhYmxlIGhhcwotICAgICByb3VnaGx5IHRoZSBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGFzIHRoZXJlIGFyZSBkeW5hbWljIHN5bWJvbHM7Ci0gICAgIEkgdGhpbmsgdGhlIG9ubHkgd2F5IHRvIGdldCB0aGUgZXhhY3Qgc2l6ZSBpcyB0byBhc3N1bWUgdGhhdAotICAgICBldmVyeSBieXRlIGZyb20gbGRfaGFzaCB0byBsZF9zdGFiIGlzIGRldm90ZWQgdG8gdGhlIGhhc2ggdGFibGUuCi0KLSAgICAgRWFjaCBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSBpcyBlaWdodCBieXRlcy4gIFRoZSBmaXJzdCBmb3VyCi0gICAgIGJ5dGVzIGFyZSBhIHN5bWJvbCBpbmRleCBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbHMuICBUaGUgc2Vjb25kCi0gICAgIGZvdXIgYnl0ZXMgYXJlIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBoYXNoIHRhYmxlIGVudHJ5IGluIHRoZQotICAgICBidWNrZXQuICBUaGUgbGRfYnVja2V0cyBmaWVsZCBnaXZlcyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMsIHNheSBCLgotICAgICBUaGUgZmlyc3QgQiBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlIGVhY2ggc3RhcnQgYSBidWNrZXQgd2hpY2gKLSAgICAgaXMgY2hhaW5lZCB0aHJvdWdoIHRoZSBzZWNvbmQgZm91ciBieXRlcyBvZiBlYWNoIGVudHJ5LiAgQSB2YWx1ZQotICAgICBvZiB6ZXJvIGVuZHMgdGhlIGNoYWluLgotCi0gICAgIFRoZSBoYXNoIGZ1bmN0aW9uIGlzIHNpbXBseQotICAgICAgICAgaCA9IDA7Ci0gICAgICAgICB3aGlsZSAoKnN0cmluZyAhPSAnXDAnKQotCSAgIGggPSAoaCA8PCAxKSArICpzdHJpbmcrKzsKLQkgaCAmPSAweDdmZmZmZmZmOwotCi0gICAgIFRvIGxvb2sgdXAgYSBzeW1ib2wsIGNvbXB1dGUgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIG5hbWUuICBUYWtlCi0gICAgIHRoZSBtb2R1bG9zIG9mIGhhc2ggdmFsdWUgYW5kIHRoZSBudW1iZXIgb2YgYnVja2V0cy4gIFN0YXJ0IGF0Ci0gICAgIHRoYXQgZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuICBTZWUgaWYgdGhlIHN5bWJvbCAoZnJvbSB0aGUgZmlyc3QKLSAgICAgZm91ciBieXRlcyBvZiB0aGUgaGFzaCB0YWJsZSBlbnRyeSkgaGFzIHRoZSBuYW1lIHlvdSBhcmUgbG9va2luZwotICAgICBmb3IuICBJZiBub3QsIHVzZSB0aGUgY2hhaW4gZmllbGQgKHRoZSBzZWNvbmQgZm91ciBieXRlcyBvZiB0aGUKLSAgICAgaGFzaCB0YWJsZSBlbnRyeSkgdG8gbW92ZSBvbiB0byB0aGUgbmV4dCBlbnRyeSBpbiB0aGlzIGJ1Y2tldC4KLSAgICAgSWYgdGhlIGNoYWluIGZpZWxkIGlzIHplcm8geW91IGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZQotICAgICBidWNrZXQsIGFuZCB0aGUgc3ltYm9sIGlzIG5vdCBpbiB0aGUgaGFzaCB0YWJsZS4gICovIAotICB1bnNpZ25lZCBsb25nIGxkX2hhc2g7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgYSBsaXN0IG9mCi0gICAgIGV4dGVybmFsX25saXN0IHN0cnVjdHVyZXMuICBUaGUgc3RyaW5nIGluZGljZXMgYXJlIHJlbGF0aXZlIHRvCi0gICAgIHRoZSBsZF9zeW1ib2xzIGZpZWxkLiAgSSB0aGluayB0aGUgb25seSB3YXkgdG8gZGV0ZXJtaW5lIHRoZQotICAgICBudW1iZXIgb2Ygc3ltYm9scyBpcyB0byBhc3N1bWUgdGhhdCBhbGwgdGhlIGJ5dGVzIGJldHdlZW4gbGRfc3RhYgotICAgICBhbmQgbGRfc3ltYm9scyBhcmUgZXh0ZXJuYWxfbmxpc3Qgc3RydWN0dXJlcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfc3RhYjsKLQotICAvKiBJIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzIGZvci4gIEl0IHNlZW1zIHRvIGFsd2F5cyBiZSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9zdGFiX2hhc2g7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9idWNrZXRzOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgVGhlIGZpcnN0IHN0cmluZyBpbiB0aGlzCi0gICAgIHN0cmluZyB0YWJsZSBuZWVkIG5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9zeW1ib2xzOwotCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9zeW1iX3NpemU7Ci0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHRleHQgc2VnbWVudC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfdGV4dDsKLQotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3BsdF9zejsKLX07Ci0KLS8qIFRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsKLXsKLSAgYmZkX2J5dGUgbGRfbG9hZGVkWzRdOwotICBiZmRfYnl0ZSBsZF9uZWVkWzRdOwotICBiZmRfYnl0ZSBsZF9ydWxlc1s0XTsKLSAgYmZkX2J5dGUgbGRfZ290WzRdOwotICBiZmRfYnl0ZSBsZF9wbHRbNF07Ci0gIGJmZF9ieXRlIGxkX3JlbFs0XTsKLSAgYmZkX2J5dGUgbGRfaGFzaFs0XTsKLSAgYmZkX2J5dGUgbGRfc3RhYls0XTsKLSAgYmZkX2J5dGUgbGRfc3RhYl9oYXNoWzRdOwotICBiZmRfYnl0ZSBsZF9idWNrZXRzWzRdOwotICBiZmRfYnl0ZSBsZF9zeW1ib2xzWzRdOwotICBiZmRfYnl0ZSBsZF9zeW1iX3NpemVbNF07Ci0gIGJmZF9ieXRlIGxkX3RleHRbNF07Ci0gIGJmZF9ieXRlIGxkX3BsdF9zels0XTsKLX07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JmZGxpbmsuaCBiL2luY2x1ZGUvYmZkbGluay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2YxMTNjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYmZkbGluay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLS8qIGJmZGxpbmsuaCAtLSBoZWFkZXIgZmlsZSBmb3IgQkZEIGxpbmsgcm91dGluZXMKLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgQkZETElOS19ICi0jZGVmaW5lIEJGRExJTktfSAotCi0vKiBXaGljaCBzeW1ib2xzIHRvIHN0cmlwIGR1cmluZyBhIGxpbmsuICAqLwotZW51bSBiZmRfbGlua19zdHJpcAotewotICBzdHJpcF9ub25lLAkJLyogRG9uJ3Qgc3RyaXAgYW55IHN5bWJvbHMuICAqLwotICBzdHJpcF9kZWJ1Z2dlciwJLyogU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMuICAqLwotICBzdHJpcF9zb21lLAkJLyoga2VlcF9oYXNoIGlzIHRoZSBsaXN0IG9mIHN5bWJvbHMgdG8ga2VlcC4gICovCi0gIHN0cmlwX2FsbAkJLyogU3RyaXAgYWxsIHN5bWJvbHMuICAqLwotfTsKLQotLyogV2hpY2ggbG9jYWwgc3ltYm9scyB0byBkaXNjYXJkIGR1cmluZyBhIGxpbmsuICBUaGlzIGlzIGlycmVsZXZhbnQKLSAgIGlmIHN0cmlwX2FsbCBpcyB1c2VkLiAgKi8KLWVudW0gYmZkX2xpbmtfZGlzY2FyZAotewotICBkaXNjYXJkX25vbmUsCQkvKiBEb24ndCBkaXNjYXJkIGFueSBsb2NhbHMuICAqLwotICBkaXNjYXJkX2wsCQkvKiBEaXNjYXJkIGxvY2FsIHRlbXBvcmFyeSBzeW1ib2xzLiAgKi8KLSAgZGlzY2FyZF9hbGwJCS8qIERpc2NhcmQgYWxsIGxvY2Fscy4gICovCi19OwotDAotLyogVGhlc2UgYXJlIHRoZSBwb3NzaWJsZSB0eXBlcyBvZiBhbiBlbnRyeSBpbiB0aGUgQkZEIGxpbmsgaGFzaAotICAgdGFibGUuICAqLwotCi1lbnVtIGJmZF9saW5rX2hhc2hfdHlwZQotewotICBiZmRfbGlua19oYXNoX25ldywJCS8qIFN5bWJvbCBpcyBuZXcuICAqLwotICBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCwJLyogU3ltYm9sIHNlZW4gYmVmb3JlLCBidXQgdW5kZWZpbmVkLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF91bmRlZndlYWssCS8qIFN5bWJvbCBpcyB3ZWFrIGFuZCB1bmRlZmluZWQuICAqLwotICBiZmRfbGlua19oYXNoX2RlZmluZWQsCS8qIFN5bWJvbCBpcyBkZWZpbmVkLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLAkvKiBTeW1ib2wgaXMgd2VhayBhbmQgZGVmaW5lZC4gICovCi0gIGJmZF9saW5rX2hhc2hfY29tbW9uLAkJLyogU3ltYm9sIGlzIGNvbW1vbi4gICovCi0gIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QsCS8qIFN5bWJvbCBpcyBhbiBpbmRpcmVjdCBsaW5rLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF93YXJuaW5nCQkvKiBMaWtlIGluZGlyZWN0LCBidXQgd2FybiBpZiByZWZlcmVuY2VkLiAgKi8KLX07Ci0KLS8qIFRoZSBsaW5raW5nIHJvdXRpbmVzIHVzZSBhIGhhc2ggdGFibGUgd2hpY2ggdXNlcyB0aGlzIHN0cnVjdHVyZSBmb3IKLSAgIGl0cyBlbGVtZW50cy4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5Ci17Ci0gIC8qIEJhc2UgaGFzaCB0YWJsZSBlbnRyeSBzdHJ1Y3R1cmUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogVHlwZSBvZiB0aGlzIGVudHJ5LiAgKi8KLSAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgdHlwZTsKLQotICAvKiBVbmRlZmluZWQgYW5kIGNvbW1vbiBzeW1ib2xzIGFyZSBrZXB0IGluIGEgbGlua2VkIGxpc3QgdGhyb3VnaAotICAgICB0aGlzIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBub3QgaW4gdGhlIHVuaW9uIGJlY2F1c2UgdGhhdCB3b3VsZAotICAgICBmb3JjZSB1cyB0byByZW1vdmUgZW50cmllcyBmcm9tIHRoZSBsaXN0IHdoZW4gd2UgY2hhbmdlZCB0aGVpcgotICAgICB0eXBlLCB3aGljaCB3b3VsZCBmb3JjZSB0aGUgbGlzdCB0byBiZSBkb3VibHkgbGlua2VkLCB3aGljaCB3b3VsZAotICAgICB3YXN0ZSBtb3JlIG1lbW9yeS4gIFdoZW4gYW4gdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wgaXMKLSAgICAgY3JlYXRlZCwgaXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoaXMgbGlzdCwgdGhlIGhlYWQgb2Ygd2hpY2ggaXMgaW4KLSAgICAgdGhlIGxpbmsgaGFzaCB0YWJsZSBpdHNlbGYuICBBcyBzeW1ib2xzIGFyZSBkZWZpbmVkLCB0aGV5IG5lZWQKLSAgICAgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdDsgYW55dGhpbmcgd2hpY2ggcmVhZHMgdGhlIGxpc3QgbXVzdAotICAgICBkb3VibGVjaGVjayB0aGUgc3ltYm9sIHR5cGUuCi0KLSAgICAgV2VhayBzeW1ib2xzIGFyZSBub3Qga2VwdCBvbiB0aGlzIGxpc3QuCi0KLSAgICAgRGVmaW5lZCBhbmQgZGVmd2VhayBzeW1ib2xzIHVzZSB0aGlzIGZpZWxkIGFzIGEgcmVmZXJlbmNlIG1hcmtlci4KLSAgICAgSWYgdGhlIGZpZWxkIGlzIG5vdCBOVUxMLCBvciB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgdGFpbCBvZiB0aGUKLSAgICAgdW5kZWZpbmVkIHN5bWJvbCBsaXN0LCB0aGUgc3ltYm9sIGhhcyBiZWVuIHJlZmVyZW5jZWQuICBJZiB0aGUKLSAgICAgc3ltYm9sIGlzIHVuZGVmaW5lZCBhbmQgYmVjb21lcyBkZWZpbmVkLCB0aGlzIGZpZWxkIHdpbGwKLSAgICAgYXV0b21hdGljYWxseSBiZSBub24tTlVMTCBzaW5jZSB0aGUgc3ltYm9sIHdpbGwgaGF2ZSBiZWVuIG9uIHRoZQotICAgICB1bmRlZmluZWQgc3ltYm9sIGxpc3QuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqbmV4dDsKLSAgLyogQSB1bmlvbiBvZiBpbmZvcm1hdGlvbiBkZXBlbmRpbmcgdXBvbiB0aGUgdHlwZS4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogTm90aGluZyBpcyBrZXB0IGZvciBiZmRfaGFzaF9uZXcuICAqLwotICAgICAgLyogYmZkX2xpbmtfaGFzaF91bmRlZmluZWQsIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIGJmZCAqYWJmZDsJCS8qIEJGRCBzeW1ib2wgd2FzIGZvdW5kIGluLiAgKi8KLQl9IHVuZGVmOwotICAgICAgLyogYmZkX2xpbmtfaGFzaF9kZWZpbmVkLCBiZmRfbGlua19oYXNoX2RlZndlYWsuICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgYmZkX3ZtYSB2YWx1ZTsJLyogU3ltYm9sIHZhbHVlLiAgKi8KLQkgIGFzZWN0aW9uICpzZWN0aW9uOwkvKiBTeW1ib2wgc2VjdGlvbi4gICovCi0JfSBkZWY7Ci0gICAgICAvKiBiZmRfbGlua19oYXNoX2luZGlyZWN0LCBiZmRfbGlua19oYXNoX3dhcm5pbmcuICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmxpbms7CS8qIFJlYWwgc3ltYm9sLiAgKi8KLQkgIGNvbnN0IGNoYXIgKndhcm5pbmc7CS8qIFdhcm5pbmcgKGJmZF9saW5rX2hhc2hfd2FybmluZyBvbmx5KS4gICovCi0JfSBpOwotICAgICAgLyogYmZkX2xpbmtfaGFzaF9jb21tb24uICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgLyogVGhlIGxpbmtlciBuZWVkcyB0byBrbm93IHRocmVlIHRoaW5ncyBhYm91dCBjb21tb24KLSAgICAgICAgICAgICBzeW1ib2xzOiB0aGUgc2l6ZSwgdGhlIGFsaWdubWVudCwgYW5kIHRoZSBzZWN0aW9uIGluCi0gICAgICAgICAgICAgd2hpY2ggdGhlIHN5bWJvbCBzaG91bGQgYmUgcGxhY2VkLiAgV2Ugc3RvcmUgdGhlIHNpemUKLSAgICAgICAgICAgICBoZXJlLCBhbmQgd2UgYWxsb2NhdGUgYSBzbWFsbCBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIGFuZCB0aGUgYWxpZ25tZW50LiAgVGhlIGFsaWdubWVudCBpcyBzdG9yZWQgYXMgYQotICAgICAgICAgICAgIHBvd2VyIG9mIHR3by4gIFdlIGRvbid0IHN0b3JlIGFsbCB0aGUgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICBkaXJlY3RseSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YKLSAgICAgICAgICAgICB0aGUgdW5pb247IHRoaXMgc3RydWN0dXJlIGlzIGEgbWFqb3Igc3BhY2UgdXNlciBpbiB0aGUKLSAgICAgICAgICAgICBsaW5rZXIuICAqLwotCSAgYmZkX3NpemVfdHlwZSBzaXplOwkvKiBDb21tb24gc3ltYm9sIHNpemUuICAqLwotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5Ci0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwkvKiBBbGlnbm1lbnQuICAqLwotCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwkJLyogU3ltYm9sIHNlY3Rpb24uICAqLwotCSAgICB9ICpwOwotCX0gYzsKLSAgICB9IHU7Ci19OwotCi0vKiBUaGlzIGlzIHRoZSBsaW5rIGhhc2ggdGFibGUuICBJdCBpcyBhIGRlcml2ZWQgY2xhc3Mgb2YKLSAgIGJmZF9oYXNoX3RhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIGhhc2ggdGFibGUgaXRzZWxmLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHRhYmxlOwotICAvKiBUaGUgYmFjayBlbmQgd2hpY2ggY3JlYXRlZCB0aGlzIGhhc2ggdGFibGUuICBUaGlzIGluZGljYXRlcyB0aGUKLSAgICAgdHlwZSBvZiB0aGUgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSwgd2hpY2ggaXMgc29tZXRpbWVzCi0gICAgIGltcG9ydGFudCBpbmZvcm1hdGlvbiB3aGVuIGxpbmtpbmcgb2JqZWN0IGZpbGVzIG9mIGRpZmZlcmVudAotICAgICB0eXBlcyB0b2dldGhlci4gICovCi0gIGNvbnN0IGJmZF90YXJnZXQgKmNyZWF0b3I7Ci0gIC8qIEEgbGlua2VkIGxpc3Qgb2YgdW5kZWZpbmVkIGFuZCBjb21tb24gc3ltYm9scywgbGlua2VkIHRocm91Z2ggdGhlCi0gICAgIG5leHQgZmllbGQgaW4gdGhlIGJmZF9saW5rX2hhc2hfZW50cnkgc3RydWN0dXJlLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnVuZGVmczsKLSAgLyogRW50cmllcyBhcmUgYWRkZWQgdG8gdGhlIHRhaWwgb2YgdGhlIHVuZGVmcyBsaXN0LiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnVuZGVmc190YWlsOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIGxpbmsgaGFzaCB0YWJsZS4gIElmIEZPTExPVyBpcyB0cnVlLCB0aGlzCi0gICBmb2xsb3dzIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QgYW5kIGJmZF9saW5rX2hhc2hfd2FybmluZyBsaW5rcyB0bwotICAgdGhlIHJlYWwgc3ltYm9sLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqYmZkX2xpbmtfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqLCBib29sZWFuIGNyZWF0ZSwKLQkgICBib29sZWFuIGNvcHksIGJvb2xlYW4gZm9sbG93KSk7Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gdGhlIG1haW4gbGlua2VyIGhhc2ggdGFibGUgaWYgdGhlIHN5bWJvbCBtaWdodAotICAgYmUgd3JhcHBlZC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgcmVmZXJlbmNlcyB0byBhbgotICAgdW5kZWZpbmVkIHN5bWJvbCwgbm90IGZvciBkZWZpbml0aW9ucyBvZiBhIHN5bWJvbC4gICovCi0KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAotCSAgIGJvb2xlYW4pKTsKLQotLyogVHJhdmVyc2UgYSBsaW5rIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqLAotCSAgIGJvb2xlYW4gKCopIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpLAotCSAgIFBUUikpOwotCi0vKiBBZGQgYW4gZW50cnkgdG8gdGhlIHVuZGVmcyBsaXN0LiAgKi8KLWV4dGVybiB2b2lkIGJmZF9saW5rX2FkZF91bmRlZgotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0MCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBjb21tdW5pY2F0ZQotICAgYmV0d2VlbiBCRkQgYW5kIHRoZSBsaW5rZXIgd2hlbiBkb2luZyBhIGxpbmsuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaW5mbwotewotICAvKiBGdW5jdGlvbiBjYWxsYmFja3MuICAqLwotICBjb25zdCBzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzICpjYWxsYmFja3M7Ci0gIC8qIHRydWUgaWYgQkZEIHNob3VsZCBnZW5lcmF0ZSBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZS4gICovCi0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgZ2VuZXJhdGUgYSAidGFzayBsaW5rZWQiIG9iamVjdCBmaWxlLAotICAgICBzaW1pbGFyIHRvIHJlbG9jYXRhYmxlIGJ1dCBhbHNvIHdpdGggZ2xvYmFscyBjb252ZXJ0ZWQgdG8gc3RhdGljcy4gKi8KLSAgYm9vbGVhbiB0YXNrX2xpbms7Ci0gIC8qIHRydWUgaWYgQkZEIHNob3VsZCBnZW5lcmF0ZSBhIHNoYXJlZCBvYmplY3QuICAqLwotICBib29sZWFuIHNoYXJlZDsKLSAgLyogdHJ1ZSBpZiBCRkQgc2hvdWxkIHByZS1iaW5kIHN5bWJvbHMgaW4gYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiBzeW1ib2xpYzsKLSAgLyogdHJ1ZSBpZiBzaGFyZWQgb2JqZWN0cyBzaG91bGQgYmUgbGlua2VkIGRpcmVjdGx5LCBub3Qgc2hhcmVkLiAgKi8KLSAgYm9vbGVhbiBzdGF0aWNfbGluazsKLSAgLyogdHJ1ZSBpZiB0aGUgb3V0cHV0IGZpbGUgc2hvdWxkIGJlIGluIGEgdHJhZGl0aW9uYWwgZm9ybWF0LiAgVGhpcwotICAgICBpcyBlcXVpdmFsZW50IHRvIHRoZSBzZXR0aW5nIG9mIHRoZSBCRkRfVFJBRElUSU9OQUxfRk9STUFUIGZsYWcKLSAgICAgb24gdGhlIG91dHB1dCBmaWxlLCBidXQgbWF5IGJlIGNoZWNrZWQgd2hlbiByZWFkaW5nIHRoZSBpbnB1dAotICAgICBmaWxlcy4gICovCi0gIGJvb2xlYW4gdHJhZGl0aW9uYWxfZm9ybWF0OwotICAvKiB0cnVlIGlmIHdlIHdhbnQgdG8gcHJvZHVjZWQgb3B0aW1pemVkIG91dHB1dCBmaWxlcy4gIFRoaXMgbWlnaHQKLSAgICAgbmVlZCBtdWNoIG1vcmUgdGltZSBhbmQgdGhlcmVmb3JlIG11c3QgYmUgZXhwbGljaXRseSBzZWxlY3RlZC4gICovCi0gIGJvb2xlYW4gb3B0aW1pemU7Ci0gIC8qIHRydWUgaWYgQkZEIHNob3VsZCBnZW5lcmF0ZSBlcnJvcnMgZm9yIHVuZGVmaW5lZCBzeW1ib2xzCi0gICAgIGV2ZW4gaWYgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuICAqLwotICBib29sZWFuIG5vX3VuZGVmaW5lZDsKLSAgLyogV2hpY2ggc3ltYm9scyB0byBzdHJpcC4gICovCi0gIGVudW0gYmZkX2xpbmtfc3RyaXAgc3RyaXA7Ci0gIC8qIFdoaWNoIGxvY2FsIHN5bWJvbHMgdG8gZGlzY2FyZC4gICovCi0gIGVudW0gYmZkX2xpbmtfZGlzY2FyZCBkaXNjYXJkOwotICAvKiB0cnVlIGlmIHN5bWJvbHMgc2hvdWxkIGJlIHJldGFpbmVkIGluIG1lbW9yeSwgZmFsc2UgaWYgdGhleQotICAgICBzaG91bGQgYmUgZnJlZWQgYW5kIHJlcmVhZC4gICovCi0gIGJvb2xlYW4ga2VlcF9tZW1vcnk7Ci0gIC8qIFRoZSBsaXN0IG9mIGlucHV0IEJGRCdzIGludm9sdmVkIGluIHRoZSBsaW5rLiAgVGhlc2UgYXJlIGNoYWluZWQKLSAgICAgdG9nZXRoZXIgdmlhIHRoZSBsaW5rX25leHQgZmllbGQuICAqLwotICBiZmQgKmlucHV0X2JmZHM7Ci0gIC8qIElmIGEgc3ltYm9sIHNob3VsZCBiZSBjcmVhdGVkIGZvciBlYWNoIGlucHV0IEJGRCwgdGhpcyBpcyBzZWN0aW9uCi0gICAgIHdoZXJlIHRob3NlIHN5bWJvbHMgc2hvdWxkIGJlIHBsYWNlZC4gIEl0IG11c3QgYmUgYSBzZWN0aW9uIGluCi0gICAgIHRoZSBvdXRwdXQgQkZELiAgSXQgbWF5IGJlIE5VTEwsIGluIHdoaWNoIGNhc2Ugbm8gc3VjaCBzeW1ib2xzCi0gICAgIHdpbGwgYmUgY3JlYXRlZC4gIFRoaXMgaXMgdG8gc3VwcG9ydCBDUkVBVEVfT0JKRUNUX1NZTUJPTFMgaW4gdGhlCi0gICAgIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlLiAgKi8KLSAgYXNlY3Rpb24gKmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uOwotICAvKiBIYXNoIHRhYmxlIGhhbmRsZWQgYnkgQkZELiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmhhc2g7Ci0gIC8qIEhhc2ggdGFibGUgb2Ygc3ltYm9scyB0byBrZWVwLiAgVGhpcyBpcyBOVUxMIHVubGVzcyBzdHJpcCBpcwotICAgICBzdHJpcF9zb21lLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICprZWVwX2hhc2g7Ci0gIC8qIHRydWUgaWYgZXZlcnkgc3ltYm9sIHNob3VsZCBiZSByZXBvcnRlZCBiYWNrIHZpYSB0aGUgbm90aWNlCi0gICAgIGNhbGxiYWNrLiAgKi8KLSAgYm9vbGVhbiBub3RpY2VfYWxsOwotICAvKiBIYXNoIHRhYmxlIG9mIHN5bWJvbHMgdG8gcmVwb3J0IGJhY2sgdmlhIHRoZSBub3RpY2UgY2FsbGJhY2suICBJZgotICAgICB0aGlzIGlzIE5VTEwsIGFuZCBub3RpY2VfYWxsIGlzIGZhbHNlLCB0aGVuIG5vIHN5bWJvbHMgYXJlCi0gICAgIHJlcG9ydGVkIGJhY2suICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKm5vdGljZV9oYXNoOwotICAvKiBIYXNoIHRhYmxlIG9mIHN5bWJvbHMgd2hpY2ggYXJlIGJlaW5nIHdyYXBwZWQgKHRoZSAtLXdyYXAgbGlua2VyCi0gICAgIG9wdGlvbikuICBJZiB0aGlzIGlzIE5VTEwsIG5vIHN5bWJvbHMgYXJlIGJlaW5nIHdyYXBwZWQuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKndyYXBfaGFzaDsKLSAgLyogSWYgYSBiYXNlIG91dHB1dCBmaWxlIGlzIHdhbnRlZCwgdGhlbiB0aGlzIHBvaW50cyB0byBpdCAqLwotICBQVFIgYmFzZV9maWxlOwotCi0gIC8qIElmIG5vbi16ZXJvLCBzcGVjaWZpZXMgdGhhdCBicmFuY2hlcyB3aGljaCBhcmUgcHJvYmxlbWF0aWMgZm9yIHRoZQotICBNUEM4NjAgQzAgKG9yIGVhcmxpZXIpIHNob3VsZCBiZSBjaGVja2VkIGZvciBhbmQgbW9kaWZpZWQuICBJdCBnaXZlcyB0aGUKLSAgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHRleHQgcGFnZS4gKi8KLSAgaW50IG1wYzg2MGMwOwotCi0gIC8qIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCBpcwotICAgICBsb2FkZWQuICAqLwotICBjb25zdCBjaGFyICppbml0X2Z1bmN0aW9uOwotICAvKiBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QgaXMKLSAgICAgdW5sb2FkZWQuICAqLwotICBjb25zdCBjaGFyICpmaW5pX2Z1bmN0aW9uOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmVzIGhvbGRzIGEgc2V0IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucy4gIFRoZXNlIGFyZQotICAgY2FsbGVkIGJ5IHRoZSBCRkQgbGlua2VyIHJvdXRpbmVzLiAgVGhlIGZpcnN0IGFyZ3VtZW50IHRvIGVhY2gKLSAgIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHRoZSBiZmRfbGlua19pbmZvIHN0cnVjdHVyZSBiZWluZyB1c2VkLiAgRWFjaAotICAgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUuICBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwKLSAgIHRoZW4gdGhlIEJGRCBmdW5jdGlvbiB3aGljaCBjYWxsZWQgaXQgd2lsbCByZXR1cm4gd2l0aCBhIGZhaWx1cmUKLSAgIGluZGljYXRpb24uICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzCi17Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYW4gb2JqZWN0IGlzIGFkZGVkIGZyb20gYW4KLSAgICAgYXJjaGl2ZS4gIEFCRkQgaXMgdGhlIGFyY2hpdmUgZWxlbWVudCBiZWluZyBhZGRlZC4gIE5BTUUgaXMgdGhlCi0gICAgIG5hbWUgb2YgdGhlIHN5bWJvbCB3aGljaCBjYXVzZWQgdGhlIGFyY2hpdmUgZWxlbWVudCB0byBiZSBwdWxsZWQKLSAgICAgaW4uICAqLwotICBib29sZWFuICgqYWRkX2FyY2hpdmVfZWxlbWVudCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICBiZmQgKmFiZmQsCi0JCQkJCSAgY29uc3QgY2hhciAqbmFtZSkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgc3ltYm9sIGlzIGZvdW5kIHdpdGggbXVsdGlwbGUKLSAgICAgZGVmaW5pdGlvbnMuICBOQU1FIGlzIHRoZSBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBtdWx0aXBsZSB0aW1lcy4KLSAgICAgT0JGRCBpcyB0aGUgb2xkIEJGRCwgT1NFQyBpcyB0aGUgb2xkIHNlY3Rpb24sIE9WQUwgaXMgdGhlIG9sZAotICAgICB2YWx1ZSwgTkJGRCBpcyB0aGUgbmV3IEJGRCwgTlNFQyBpcyB0aGUgbmV3IHNlY3Rpb24sIGFuZCBOVkFMIGlzCi0gICAgIHRoZSBuZXcgdmFsdWUuICBPQkZEIG1heSBiZSBOVUxMLiAgT1NFQyBhbmQgTlNFQyBtYXkgYmUKLSAgICAgYmZkX2NvbV9zZWN0aW9uIG9yIGJmZF9pbmRfc2VjdGlvbi4gICovCi0gIGJvb2xlYW4gKCptdWx0aXBsZV9kZWZpbml0aW9uKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgYmZkICpvYmZkLAotCQkJCQkgIGFzZWN0aW9uICpvc2VjLAotCQkJCQkgIGJmZF92bWEgb3ZhbCwKLQkJCQkJICBiZmQgKm5iZmQsCi0JCQkJCSAgYXNlY3Rpb24gKm5zZWMsCi0JCQkJCSAgYmZkX3ZtYSBudmFsKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSBjb21tb24gc3ltYm9sIGlzIGRlZmluZWQKLSAgICAgbXVsdGlwbGUgdGltZXMuICBOQU1FIGlzIHRoZSBzeW1ib2wgYXBwZWFyaW5nIG11bHRpcGxlIHRpbWVzLgotICAgICBPQkZEIGlzIHRoZSBCRkQgb2YgdGhlIGV4aXN0aW5nIHN5bWJvbDsgaXQgbWF5IGJlIE5VTEwgaWYgdGhpcyBpcwotICAgICBub3Qga25vd24uICBPVFlQRSBpcyB0aGUgdHlwZSBvZiB0aGUgZXhpc3Rpbmcgc3ltYm9sLCB3aGljaCBtYXkKLSAgICAgYmUgYmZkX2xpbmtfaGFzaF9kZWZpbmVkLCBiZmRfbGlua19oYXNoX2RlZndlYWssCi0gICAgIGJmZF9saW5rX2hhc2hfY29tbW9uLCBvciBiZmRfbGlua19oYXNoX2luZGlyZWN0LiAgSWYgT1RZUEUgaXMKLSAgICAgYmZkX2xpbmtfaGFzaF9jb21tb24sIE9TSVpFIGlzIHRoZSBzaXplIG9mIHRoZSBleGlzdGluZyBzeW1ib2wuCi0gICAgIE5CRkQgaXMgdGhlIEJGRCBvZiB0aGUgbmV3IHN5bWJvbC4gIE5UWVBFIGlzIHRoZSB0eXBlIG9mIHRoZSBuZXcKLSAgICAgc3ltYm9sLCBvbmUgb2YgYmZkX2xpbmtfaGFzaF9kZWZpbmVkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgb3IKLSAgICAgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdC4gIElmIE5UWVBFIGlzIGJmZF9saW5rX2hhc2hfY29tbW9uLCBOU0laRQotICAgICBpcyB0aGUgc2l6ZSBvZiB0aGUgbmV3IHN5bWJvbC4gICovCi0gIGJvb2xlYW4gKCptdWx0aXBsZV9jb21tb24pIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICAgICBiZmQgKm9iZmQsCi0JCQkJICAgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgb3R5cGUsCi0JCQkJICAgICAgYmZkX3ZtYSBvc2l6ZSwKLQkJCQkgICAgICBiZmQgKm5iZmQsCi0JCQkJICAgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgbnR5cGUsCi0JCQkJICAgICAgYmZkX3ZtYSBuc2l6ZSkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB0byBhZGQgYSBzeW1ib2wgdG8gYSBzZXQuICBFTlRSWSBpcwotICAgICB0aGUgbGluayBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGUgc2V0IGl0c2VsZiAoZS5nLiwKLSAgICAgX19DVE9SX0xJU1RfXykuICBSRUxPQyBpcyB0aGUgcmVsb2NhdGlvbiB0byB1c2UgZm9yIGFuIGVudHJ5IGluCi0gICAgIHRoZSBzZXQgd2hlbiBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIGZpbGUsIGFuZCBpcyBhbHNvIHVzZWQgdG8KLSAgICAgZ2V0IHRoZSBzaXplIG9mIHRoZSBlbnRyeSB3aGVuIGdlbmVyYXRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlLgotICAgICBBQkZELCBTRUMgYW5kIFZBTFVFIGlkZW50aWZ5IHRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIHNldC4gICovCi0gIGJvb2xlYW4gKCphZGRfdG9fc2V0KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqZW50cnksCi0JCQkJIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYywKLQkJCQkgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBiZmRfdm1hIHZhbHVlKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIG5hbWUgb2YgYSBnKysgY29uc3RydWN0b3Igb3IKLSAgICAgZGVzdHJ1Y3RvciBpcyBmb3VuZC4gIFRoaXMgaXMgb25seSBjYWxsZWQgYnkgc29tZSBvYmplY3QgZmlsZQotICAgICBmb3JtYXRzLiAgQ09OU1RSVUNUT1IgaXMgdHJ1ZSBmb3IgYSBjb25zdHJ1Y3RvciwgZmFsc2UgZm9yIGEKLSAgICAgZGVzdHJ1Y3Rvci4gIFRoaXMgd2lsbCB1c2UgQkZEX1JFTE9DX0NUT1Igd2hlbiBnZW5lcmF0aW5nIGEKLSAgICAgcmVsb2NhdGVhYmxlIGZpbGUuICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgZm91bmQuICBBQkZELAotICAgICBTRUNUSU9OIGFuZCBWQUxVRSBhcmUgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICAqLwotICBib29sZWFuICgqY29uc3RydWN0b3IpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICBib29sZWFuIGNvbnN0cnVjdG9yLAotCQkJCSAgY29uc3QgY2hhciAqbmFtZSwgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLAotCQkJCSAgYmZkX3ZtYSB2YWx1ZSkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB0byBpc3N1ZSBhIGxpbmtlciB3YXJuaW5nLiAgRm9yCi0gICAgIGV4YW1wbGUsIHRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gYSB3YXJuaW5nCi0gICAgIHN5bWJvbC4gIFdBUk5JTkcgaXMgdGhlIHdhcm5pbmcgdG8gYmUgaXNzdWVkLiAgU1lNQk9MIGlzIHRoZSBuYW1lCi0gICAgIG9mIHRoZSBzeW1ib2wgd2hpY2ggdHJpZ2dlcmVkIHRoZSB3YXJuaW5nOyBpdCBtYXkgYmUgTlVMTCBpZgotICAgICB0aGVyZSBpcyBub25lLiAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUgbG9jYXRpb24KLSAgICAgd2hpY2ggdHJpZ2VycmVkIHRoZSB3YXJuaW5nOyBlaXRoZXIgQUJGRCBvciBTRUNUSU9OIG9yIGJvdGggbWF5Ci0gICAgIGJlIE5VTEwgaWYgdGhlIGxvY2F0aW9uIGlzIG5vdCBrbm93bi4gICovCi0gIGJvb2xlYW4gKCp3YXJuaW5nKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJICAgICAgY29uc3QgY2hhciAqd2FybmluZywgY29uc3QgY2hhciAqc3ltYm9sLAotCQkJICAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCSAgICAgIGJmZF92bWEgYWRkcmVzcykpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgcmVsb2NhdGlvbiBpcyBhdHRlbXB0ZWQgYWdhaW5zdAotICAgICBhbiB1bmRlZmluZWQgc3ltYm9sLiAgTkFNRSBpcyB0aGUgc3ltYm9sIHdoaWNoIGlzIHVuZGVmaW5lZC4KLSAgICAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUgbG9jYXRpb24gZnJvbSB3aGljaCB0aGUKLSAgICAgcmVmZXJlbmNlIGlzIG1hZGUuICBJbiBzb21lIGNhc2VzIFNFQ1RJT04gbWF5IGJlIE5VTEwuICAqLwotICBib29sZWFuICgqdW5kZWZpbmVkX3N5bWJvbCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgYmZkICphYmZkLAotCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwgYmZkX3ZtYSBhZGRyZXNzKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSByZWxvYyBvdmVyZmxvdyBvY2N1cnMuICBOQU1FIGlzCi0gICAgIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgb3Igc2VjdGlvbiB0aGUgcmVsb2MgaXMgYWdhaW5zdCwKLSAgICAgUkVMT0NfTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgcmVsb2NhdGlvbiwgYW5kIEFEREVORCBpcyBhbnkKLSAgICAgYWRkZW5kIHRoYXQgaXMgdXNlZC4gIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlCi0gICAgIGxvY2F0aW9uIGF0IHdoaWNoIHRoZSBvdmVyZmxvdyBvY2N1cnM7IGlmIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhCi0gICAgIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgb3IgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLCB0aGVuCi0gICAgIEFCRkQgd2lsbCBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKnJlbG9jX292ZXJmbG93KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKnJlbG9jX25hbWUsIGJmZF92bWEgYWRkZW5kLAotCQkJCSAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkgICAgIGJmZF92bWEgYWRkcmVzcykpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgZGFuZ2Vyb3VzIHJlbG9jIGlzIHBlcmZvcm1lZC4KLSAgICAgVGhlIGNhbm9uaWNhbCBleGFtcGxlIGlzIGFuIGEyOWsgSUhDT05TVCByZWxvYyB3aGljaCBkb2VzIG5vdAotICAgICBmb2xsb3cgYW4gSUhJSEFMRiByZWxvYy4gIE1FU1NBR0UgaXMgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZS4KLSAgICAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUgbG9jYXRpb24gYXQgd2hpY2ggdGhlCi0gICAgIHByb2JsZW0gb2NjdXJyZWQ7IGlmIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhCi0gICAgIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgb3IgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLCB0aGVuCi0gICAgIEFCRkQgd2lsbCBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKnJlbG9jX2Rhbmdlcm91cykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICBjb25zdCBjaGFyICptZXNzYWdlLAotCQkJCSAgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJICAgICAgYmZkX3ZtYSBhZGRyZXNzKSk7Ci0gIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSByZWxvYyBpcyBmb3VuZCB0byBiZSBhdHRhY2hlZAotICAgICB0byBhIHN5bWJvbCB3aGljaCBpcyBub3QgYmVpbmcgd3JpdHRlbiBvdXQuICBOQU1FIGlzIHRoZSBuYW1lIG9mCi0gICAgIHRoZSBzeW1ib2wuICBBQkZELCBTRUNUSU9OIGFuZCBBRERSRVNTIGlkZW50aWZ5IHRoZSBsb2NhdGlvbiBvZgotICAgICB0aGUgcmVsb2M7IGlmIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhCi0gICAgIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgb3IgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLCB0aGVuCi0gICAgIEFCRkQgd2lsbCBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKnVuYXR0YWNoZWRfcmVsb2MpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJICAgICAgIGJmZF92bWEgYWRkcmVzcykpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgc3ltYm9sIGluIG5vdGljZV9oYXNoIGlzCi0gICAgIGRlZmluZWQgb3IgcmVmZXJlbmNlZC4gIE5BTUUgaXMgdGhlIHN5bWJvbC4gIEFCRkQsIFNFQ1RJT04gYW5kCi0gICAgIEFERFJFU1MgYXJlIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgSWYgU0VDVElPTiBpcwotICAgICBiZmRfdW5kX3NlY3Rpb24sIHRoaXMgaXMgYSByZWZlcmVuY2UuICAqLwotICBib29sZWFuICgqbm90aWNlKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgICBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBiZmRfdm1hIGFkZHJlc3MpKTsKLX07Ci0MCi0vKiBUaGUgbGlua2VyIGJ1aWxkcyBsaW5rX29yZGVyIHN0cnVjdHVyZXMgd2hpY2ggdGVsbCB0aGUgY29kZSBob3cgdG8KLSAgIGluY2x1ZGUgaW5wdXQgZGF0YSBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi0vKiBUaGVzZSBhcmUgdGhlIHR5cGVzIG9mIGxpbmtfb3JkZXIgc3RydWN0dXJlcy4gICovCi0KLWVudW0gYmZkX2xpbmtfb3JkZXJfdHlwZQotewotICBiZmRfdW5kZWZpbmVkX2xpbmtfb3JkZXIsCS8qIFVuZGVmaW5lZC4gICovCi0gIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyLAkvKiBCdWlsdCBmcm9tIGEgc2VjdGlvbi4gICovCi0gIGJmZF9maWxsX2xpbmtfb3JkZXIsCQkvKiBGaWxsIHdpdGggYSAxNiBiaXQgY29uc3RhbnQuICAqLwotICBiZmRfZGF0YV9saW5rX29yZGVyLAkJLyogU2V0IHRvIGV4cGxpY2l0IGRhdGEuICAqLwotICBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyLAkvKiBSZWxvY2F0ZSBhZ2FpbnN0IGEgc2VjdGlvbi4gICovCi0gIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcgkvKiBSZWxvY2F0ZSBhZ2FpbnN0IGEgc3ltYm9sLiAgKi8KLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGxpbmtfb3JkZXIgc3RydWN0dXJlIGl0c2VsZi4gIFRoZXNlIGZvcm0gYSBjaGFpbgotICAgYXR0YWNoZWQgdG8gdGhlIHNlY3Rpb24gd2hvc2UgY29udGVudHMgdGhleSBhcmUgZGVzY3JpYmluZy4gICovCi0KLXN0cnVjdCBiZmRfbGlua19vcmRlciAKLXsKLSAgLyogTmV4dCBsaW5rX29yZGVyIGluIGNoYWluLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpuZXh0OwotICAvKiBUeXBlIG9mIGxpbmtfb3JkZXIuICAqLwotICBlbnVtIGJmZF9saW5rX29yZGVyX3R5cGUgdHlwZTsKLSAgLyogT2Zmc2V0IHdpdGhpbiBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGJmZF92bWEgb2Zmc2V0OyAgCi0gIC8qIFNpemUgd2l0aGluIG91dHB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICAvKiBUeXBlIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5pb24gCi0gICAgewotICAgICAgc3RydWN0IAotCXsKLQkgIC8qIFNlY3Rpb24gdG8gaW5jbHVkZS4gIElmIHRoaXMgaXMgdXNlZCwgdGhlbgotCSAgICAgc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gbXVzdCBiZSB0aGUgc2VjdGlvbiB0aGUKLQkgICAgIGxpbmtfb3JkZXIgaXMgYXR0YWNoZWQgdG8sIHNlY3Rpb24tPm91dHB1dF9vZmZzZXQgbXVzdAotCSAgICAgZXF1YWwgdGhlIGxpbmtfb3JkZXIgb2Zmc2V0IGZpZWxkLCBhbmQgc2VjdGlvbi0+X3Jhd19zaXplCi0JICAgICBtdXN0IGVxdWFsIHRoZSBsaW5rX29yZGVyIHNpemUgZmllbGQuICBNYXliZSB0aGVzZQotCSAgICAgcmVzdHJpY3Rpb25zIHNob3VsZCBiZSByZWxheGVkIHNvbWVkYXkuICAqLwotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0JfSBpbmRpcmVjdDsKLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIFZhbHVlIHRvIGZpbGwgd2l0aC4gICovCi0JICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci0JfSBmaWxsOwotICAgICAgc3RydWN0Ci0JewotCSAgLyogRGF0YSB0byBwdXQgaW50byBmaWxlLiAgVGhlIHNpemUgZmllbGQgZ2l2ZXMgdGhlIG51bWJlcgotCSAgICAgb2YgYnl0ZXMgd2hpY2ggdGhpcyBmaWVsZCBwb2ludHMgdG8uICAqLwotCSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotCX0gZGF0YTsKLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIERlc2NyaXB0aW9uIG9mIHJlbG9jIHRvIGdlbmVyYXRlLiAgVXNlZCBmb3IKLQkgICAgIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgYW5kCi0JICAgICBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIuICAqLwotCSAgc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jICpwOwotCX0gcmVsb2M7Ci0gICAgfSB1OwotfTsKLQotLyogQSBsaW5rZXIgb3JkZXIgb2YgdHlwZSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyIG9yCi0gICBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIgbWVhbnMgdG8gY3JlYXRlIGEgcmVsb2MgYWdhaW5zdCBhCi0gICBzZWN0aW9uIG9yIHN5bWJvbCwgcmVzcGVjdGl2ZWx5LiAgVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCAtVXIgdG8KLSAgIGdlbmVyYXRlIHJlbG9jcyBmb3IgdGhlIGNvbnN0cnVjdG9yIHRhYmxlcy4gIFRoZQotICAgYmZkX2xpbmtfb3JkZXJfcmVsb2Mgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcmVsb2MgdGhhdCBCRkQgc2hvdWxkCi0gICBjcmVhdGUuICBJdCBpcyBzaW1pbGFyIHRvIGEgYXJlbGVudCwgYnV0IEkgZGlkbid0IHVzZSBhcmVsZW50Ci0gICBiZWNhdXNlIHRoZSBsaW5rZXIgZG9lcyBub3Qga25vdyBhbnl0aGluZyBhYm91dCBtb3N0IHN5bWJvbHMsIGFuZAotICAgYW55IGFzeW1ib2wgc3RydWN0dXJlIGl0IGNyZWF0ZXMgd2lsbCBiZSBwYXJ0aWFsbHkgbWVhbmluZ2xlc3MuCi0gICBUaGlzIGluZm9ybWF0aW9uIGNvdWxkIGxvZ2ljYWxseSBiZSBpbiB0aGUgYmZkX2xpbmtfb3JkZXIgc3RydWN0LAotICAgYnV0IEkgZGlkbid0IHdhbnQgdG8gd2FzdGUgdGhlIHNwYWNlIHNpbmNlIHRoZXNlIHR5cGVzIG9mIHJlbG9jcwotICAgYXJlIHJlbGF0aXZlbHkgcmFyZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYwotewotICAvKiBSZWxvYyB0eXBlLiAgKi8KLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogRm9yIHR5cGUgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciwgdGhpcyBpcyB0aGUgc2VjdGlvbgotCSB0aGUgcmVsb2Mgc2hvdWxkIGJlIGFnYWluc3QuICBUaGlzIG11c3QgYmUgYSBzZWN0aW9uIGluIHRoZQotCSBvdXRwdXQgQkZELCBub3QgYW55IG9mIHRoZSBpbnB1dCBCRkRzLiAgKi8KLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgLyogRm9yIHR5cGUgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZQotCSBzeW1ib2wgdGhlIHJlbG9jIHNob3VsZCBiZSBhZ2FpbnN0LiAgKi8KLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgfSB1OwotCi0gIC8qIEFkZGVuZCB0byB1c2UuICBUaGUgb2JqZWN0IGZpbGUgc2hvdWxkIGNvbnRhaW4gemVyby4gIFRoZSBCRkQKLSAgICAgYmFja2VuZCBpcyByZXNwb25zaWJsZSBmb3IgZmlsbGluZyBpbiB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdAotICAgICBmaWxlIGNvcnJlY3RseS4gIEZvciBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgKGUuZy4sIENPRkYpIHRoZQotICAgICBhZGRlbmQgbXVzdCBiZSBzdG9yZWQgaW50byBpbiB0aGUgb2JqZWN0IGZpbGUsIGFuZCBmb3Igc29tZQotICAgICAoZS5nLiwgU1BBUkMgYS5vdXQpIGl0IGlzIGtlcHQgaW4gdGhlIHJlbG9jLiAgKi8KLSAgYmZkX3ZtYSBhZGRlbmQ7Ci19OwotCi0vKiBBbGxvY2F0ZSBhIG5ldyBsaW5rX29yZGVyIGZvciBhIHNlY3Rpb24uICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19vcmRlciAqYmZkX25ld19saW5rX29yZGVyIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0KLS8qIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHVzZWQgdG8gZGVzY3JpYmUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgdGhlCi0gICBFTEYgbGlua2VyLiAgVGhlc2Ugc3RydWN0dXJlcyBjb3VsZCBiZSBtYW5pcHVsYXRlZCBlbnRpcmVseSBpbnNpZGUKLSAgIEJGRCwgYnV0IGl0IHdvdWxkIGJlIGEgcGFpbi4gIEluc3RlYWQsIHRoZSByZWd1bGFyIGxpbmtlciBzZXRzIHVwCi0gICB0aGVzZSBzdHJ1Y3R1cmVzLCBhbmQgdGhlbiBwYXNzZXMgdGhlbSBpbnRvIEJGRC4gICovCi0KLS8qIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGEgdmVyc2lvbi4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwcgotewotICAvKiBOZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpuZXh0OwotICAvKiBSZWd1bGFyIGV4cHJlc3Npb24uICAqLwotICBjb25zdCBjaGFyICpwYXR0ZXJuOwotICAvKiBNYXRjaGluZyBmdW5jdGlvbi4gICovCi0gIGludCAoKm1hdGNoKSBQQVJBTVMoKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqLCBjb25zdCBjaGFyICopKTsKLX07Ci0KLS8qIFZlcnNpb24gZGVwZW5kZW5jaWVzLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzCi17Ci0gIC8qIE5leHQgZGVwZW5kZW5jeSBmb3IgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpuZXh0OwotICAvKiBUaGUgdmVyc2lvbiB3aGljaCB0aGlzIHZlcnNpb24gZGVwZW5kcyB1cG9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJzaW9uX25lZWRlZDsKLX07Ci0KLS8qIEEgbm9kZSBpbiB0aGUgdmVyc2lvbiB0cmVlLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlCi17Ci0gIC8qIE5leHQgdmVyc2lvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqbmV4dDsKLSAgLyogTmFtZSBvZiB0aGlzIHZlcnNpb24uICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBWZXJzaW9uIG51bWJlci4gICovCi0gIHVuc2lnbmVkIGludCB2ZXJudW07Ci0gIC8qIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGdsb2JhbCBzeW1ib2xzIGluIHRoaXMgdmVyc2lvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZ2xvYmFsczsKLSAgLyogUmVndWxhciBleHByZXNzaW9ucyBmb3IgbG9jYWwgc3ltYm9scyBpbiB0aGlzIHZlcnNpb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmxvY2FsczsKLSAgLyogTGlzdCBvZiB2ZXJzaW9ucyB3aGljaCB0aGlzIHZlcnNpb24gZGVwZW5kcyB1cG9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpkZXBzOwotICAvKiBJbmRleCBvZiB0aGUgdmVyc2lvbiBuYW1lLiAgVGhpcyBpcyB1c2VkIHdpdGhpbiBCRkQuICAqLwotICB1bnNpZ25lZCBpbnQgbmFtZV9pbmR4OwotICAvKiBXaGV0aGVyIHRoaXMgdmVyc2lvbiB0cmVlIHdhcyB1c2VkLiAgVGhpcyBpcyB1c2VkIHdpdGhpbiBCRkQuICAqLwotICBpbnQgdXNlZDsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib3V0LmggYi9pbmNsdWRlL2JvdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjMjhjYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JvdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiAnYS5vdXQuaCcuICBJdCBpcyB0byBiZSB1c2VkIGluIGFsbAotICogR05VIHRvb2xzIG1vZGlmaWVkIHRvIHN1cHBvcnQgdGhlIGk4MDk2MCAob3IgdG9vbHMgdGhhdCBvcGVyYXRlIG9uCi0gKiBvYmplY3QgZmlsZXMgY3JlYXRlZCBieSBzdWNoIHRvb2xzKS4KLSAqCi0gKiBBbGwgaTgwOTYwIGRldmVsb3BtZW50IGlzIGRvbmUgaW4gYSBDUk9TUy1ERVZFTE9QTUVOVCBlbnZpcm9ubWVudC4gIEkuZS4sCi0gKiBvYmplY3QgY29kZSBpcyBnZW5lcmF0ZWQgb24sIGFuZCBleGVjdXRlZCB1bmRlciB0aGUgZGlyZWN0aW9uIG9mIGEgc3ltYm9saWMKLSAqIGRlYnVnZ2VyIHJ1bm5pbmcgb24sIGEgaG9zdCBzeXN0ZW0uICBXZSBkbyBub3Qgd2FudCB0byBiZSBzdWJqZWN0IHRvIHRoZQotICogdmFnYXJpZXMgb2Ygd2hpY2ggaG9zdCBpdCBpcyBvciB3aGV0aGVyIGl0IHN1cHBvcnRzIENPRkYgb3IgYS5vdXQgZm9ybWF0LAotICogb3IgYW55dGhpbmcgZWxzZS4gIFdlIERPIHdhbnQgdG86Ci0gKgotICoJbyBhbHdheXMgZ2VuZXJhdGUgdGhlIHNhbWUgZm9ybWF0IG9iamVjdCBmaWxlcywgcmVnYXJkbGVzcyBvZiBob3N0LgotICoKLSAqCW8gaGF2ZSBhbiAnYS5vdXQnIGhlYWRlciB0aGF0IHdlIGNhbiBtb2RpZnkgZm9yIG91ciBvd24gcHVycG9zZXMKLSAqCSAgKHRoZSA4MDk2MCBpcyB0eXBpY2FsbHkgYW4gZW1iZWRkZWQgcHJvY2Vzc29yIGFuZCBtYXkgcmVxdWlyZQotICoJICBlbmhhbmNlZCBsaW5rZXIgc3VwcG9ydCB0aGF0IHRoZSBub3JtYWwgYS5vdXQuaCBoZWFkZXIgY2FuJ3QKLSAqCSAgYWNjb21tb2RhdGUpLgotICoKLSAqIEFzIGZvciBieXRlLW9yZGVyaW5nLCB0aGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5OgotICoKLSAqCW8gVGV4dCBhbmQgZGF0YSB0aGF0IGlzIGFjdHVhbGx5IGRvd25sb2FkZWQgdG8gdGhlIHRhcmdldCBpcyBhbHdheXMKLSAqCSAgaW4gaTgwOTYwIChsaXR0bGUtZW5kaWFuKSBvcmRlci4KLSAqCi0gKglvIEFsbCBvdGhlciBudW1iZXJzIChpbiB0aGUgaGVhZGVyLCBzeW1ib2xzLCByZWxvY2F0aW9uIGRpcmVjdGl2ZXMpCi0gKgkgIGFyZSBpbiBob3N0IGJ5dGUtb3JkZXI6ICBvYmplY3QgZmlsZXMgQ0FOTk9UIGJlIGxpZnRlZCBmcm9tIGEKLSAqCSAgbGl0dGxlLWVuZCBob3N0IGFuZCB1c2VkIG9uIGEgYmlnLWVuZGlhbiAob3IgdmljZSB2ZXJzYSkgd2l0aG91dAotICoJICBtb2RpZmljYXRpb24uCi0gKiA9PT4gVEhJUyBJUyBOTyBMT05HRVIgVFJVRSBVU0lORyBCRkQuICBXRSBDQU4gR0VORVJBVEUgQU5ZIEJZVEUgT1JERVIKLSAqICAgICBGT1IgVEhFIEhFQURFUiwgQU5EIFJFQUQgQU5ZIEJZVEUgT1JERVIuICBQUkVGRVJFTkNFIFdPVUxEIEJFIFRPCi0gKiAgICAgVVNFIExJVFRMRS1FTkRJQU4gQllURSBPUkRFUiBUSFJPVUdIT1VULCBSRUdBUkRMRVNTIE9GIEhPU1QuICA8PT0KLSAqCi0gKglvIFRoZSBkb3dubG9hZGVyICgnY29tbTk2MCcpIHRha2VzIGNhcmUgdG8gZ2VuZXJhdGUgYSBwc2V1ZG8taGVhZGVyCi0gKgkgIHdpdGggY29ycmVjdCAoaTgwOTYwKSBieXRlLW9yZGVyaW5nIGJlZm9yZSBzaGlwcGluZyB0ZXh0IGFuZCBkYXRhCi0gKgkgIG9mZiB0byB0aGUgTklORFkgbW9uaXRvciBpbiB0aGUgdGFyZ2V0IHN5c3RlbXMuICBTeW1ib2xzIGFuZAotICoJICByZWxvY2F0aW9uIGluZm8gYXJlIG5ldmVyIHNlbnQgdG8gdGhlIHRhcmdldC4KLSAqLwotCi0KLSNkZWZpbmUgQk1BR0lDCTA0MTUKLS8qIFdlIGRvbid0IGFjY2VwdCB0aGUgZm9sbG93aW5nIChzZWUgTl9CQURNQUcgbWFjcm8pLgotICogVGhleSdyZSBqdXN0IGhlcmUgc28gR05VIGNvZGUgd2lsbCBjb21waWxlLgotICovCi0jZGVmaW5lCU9NQUdJQwkwNDA3CQkvKiBvbGQgaW1wdXJlIGZvcm1hdCAqLwotI2RlZmluZQlOTUFHSUMJMDQxMAkJLyogcmVhZC1vbmx5IHRleHQgKi8KLSNkZWZpbmUJWk1BR0lDCTA0MTMJCS8qIGRlbWFuZCBsb2FkIGZvcm1hdCAqLwotCi0vKiBGSUxFIEhFQURFUgotICoJQWxsICdsZW5ndGhzJyBhcmUgZ2l2ZW4gYXMgYSBudW1iZXIgb2YgYnl0ZXMuCi0gKglBbGwgJ2FsaWdubWVudHMnIGFyZSBmb3IgcmVsaW5rYWJsZSBmaWxlcyBvbmx5OyAgYW4gYWxpZ25tZW50IG9mCi0gKgkJJ24nIGluZGljYXRlcyB0aGUgY29ycmVzcG9uZGluZyBzZWdtZW50IG11c3QgYmVnaW4gYXQgYW4KLSAqCQlhZGRyZXNzIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiAoMioqbikuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9leGVjIHsKLQkvKiBTdGFuZGFyZCBzdHVmZiAqLwotCXVuc2lnbmVkIGNoYXIgZV9pbmZvWzRdOwkvKiBJZGVudGlmaWVzIHRoaXMgYXMgYSBiLm91dCBmaWxlICovCi0JdW5zaWduZWQgY2hhciBlX3RleHRbNF07CS8qIExlbmd0aCBvZiB0ZXh0ICovCi0JdW5zaWduZWQgY2hhciBlX2RhdGFbNF07CS8qIExlbmd0aCBvZiBkYXRhICovCi0JdW5zaWduZWQgY2hhciBlX2Jzc1s0XTsJCS8qIExlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSAqLwotCXVuc2lnbmVkIGNoYXIgZV9zeW1zWzRdOwkvKiBMZW5ndGggb2Ygc3ltYm9sIHRhYmxlICovCi0JdW5zaWduZWQgY2hhciBlX2VudHJ5WzRdOwkvKiBSdW50aW1lIHN0YXJ0IGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBjaGFyIGVfdHJzaXplWzRdOwkvKiBMZW5ndGggb2YgdGV4dCByZWxvY2F0aW9uIGluZm8gKi8KLQl1bnNpZ25lZCBjaGFyIGVfZHJzaXplWzRdOwkvKiBMZW5ndGggb2YgZGF0YSByZWxvY2F0aW9uIGluZm8gKi8KLQotCS8qIEFkZGVkIGZvciBpOTYwICovCi0JdW5zaWduZWQgY2hhciBlX3Rsb2FkWzRdOwkvKiBUZXh0IHJ1bnRpbWUgbG9hZCBhZGRyZXNzICovCi0JdW5zaWduZWQgY2hhciBlX2Rsb2FkWzRdOwkvKiBEYXRhIHJ1bnRpbWUgbG9hZCBhZGRyZXNzICovCi0JdW5zaWduZWQgY2hhciBlX3RhbGlnblsxXTsJLyogQWxpZ25tZW50IG9mIHRleHQgc2VnbWVudCAqLwotCXVuc2lnbmVkIGNoYXIgZV9kYWxpZ25bMV07CS8qIEFsaWdubWVudCBvZiBkYXRhIHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBjaGFyIGVfYmFsaWduWzFdOwkvKiBBbGlnbm1lbnQgb2YgYnNzIHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBjaGFyIGVfcmVsYXhhYmxlWzFdOwkvKiBBc3NlbWJsZWQgd2l0aCBlbm91Z2ggaW5mbyB0byBhbGxvdyBsaW5rZXIgdG8gcmVsYXggKi8KLX07Ci0KLSNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCShzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9leGVjKSkKLQotLyogVGhlc2UgbWFjcm9zIHVzZSB0aGUgYV94eHggZmllbGQgbmFtZXMsIHNpbmNlIHRoZXkgb3BlcmF0ZSBvbiB0aGUgZXhlYwotICAgc3RydWN0dXJlIGFmdGVyIGl0J3MgYmVlbiBieXRlLXN3YXBwZWQgYW5kIHJlYWxpZ25lZCBvbiB0aGUgaG9zdCBtYWNoaW5lLiAqLwotI2RlZmluZSBOX0JBRE1BRyh4KQkoKCh4KS5hX2luZm8pIT1CTUFHSUMpCi0jZGVmaW5lIE5fVFhUT0ZGKHgpCUVYRUNfQllURVNfU0laRQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCApCi0jZGVmaW5lIE5fVFJPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2RlZmluZSBOX1RSRUxPRkYJTl9UUk9GRgotI2RlZmluZSBOX0RST0ZGKHgpCSggTl9UUk9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZGVmaW5lIE5fRFJFTE9GRglOX0RST0ZGCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9EUk9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLSNkZWZpbmUgTl9EQVRBRERSKHgpCSggKHgpLmFfZGxvYWQgKSAgICAKLQotLyogQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCi0jaWYgIWRlZmluZWQgKE5fVFhUQUREUikKLSNkZWZpbmUgTl9UWFRBRERSKHgpIDAKLSNlbmRpZgotCi0vKiBBIHNpbmdsZSBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlCi0gKi8KLXN0cnVjdCBubGlzdCB7Ci0JdW5pb24gewotCQljaGFyCSpuX25hbWU7Ci0JCXN0cnVjdCBubGlzdCAqbl9uZXh0OwotCQlsb25nCW5fc3RyeDsJCS8qIEluZGV4IGludG8gc3RyaW5nIHRhYmxlCSovCi0JfSBuX3VuOwotCXVuc2lnbmVkIGNoYXIgbl90eXBlOwkvKiBTZWUgYmVsb3cJCQkJKi8KLQljaGFyCW5fb3RoZXI7CS8qIFVzZWQgaW4gaTgwOTYwIHN1cHBvcnQgLS0gc2VlIGJlbG93CSovCi0Jc2hvcnQJbl9kZXNjOwotCXVuc2lnbmVkIGxvbmcgbl92YWx1ZTsKLX07Ci0KLQotLyogTGVnYWwgdmFsdWVzIG9mIG5fdHlwZQotICovCi0jZGVmaW5lIE5fVU5ERgkwCS8qIFVuZGVmaW5lZCBzeW1ib2wJKi8KLSNkZWZpbmUgTl9BQlMJMgkvKiBBYnNvbHV0ZSBzeW1ib2wJKi8KLSNkZWZpbmUgTl9URVhUCTQJLyogVGV4dCBzeW1ib2wJCSovCi0jZGVmaW5lIE5fREFUQQk2CS8qIERhdGEgc3ltYm9sCQkqLwotI2RlZmluZSBOX0JTUwk4CS8qIEJTUyBzeW1ib2wJCSovCi0jZGVmaW5lIE5fRk4JMzEJLyogRmlsZW5hbWUgc3ltYm9sCSovCi0KLSNkZWZpbmUgTl9FWFQJMQkvKiBFeHRlcm5hbCBzeW1ib2wgKE9SJ2QgaW4gd2l0aCBvbmUgb2YgYWJvdmUpCSovCi0jZGVmaW5lIE5fVFlQRQkwMzYJLyogTWFzayBmb3IgYWxsIHRoZSB0eXBlIGJpdHMJCQkqLwotI2RlZmluZSBOX1NUQUIJMDM0MAkvKiBNYXNrIGZvciBhbGwgYml0cyB1c2VkIGZvciBTREIgZW50cmllcyAJKi8KLQotLyogTUVBTklORyBPRiAnbl9vdGhlcicKLSAqCi0gKiBJZiBub24temVybywgdGhlICduX290aGVyJyBmaWVsZHMgaW5kaWNhdGVzIGVpdGhlciBhIGxlYWYgcHJvY2VkdXJlIG9yCi0gKiBhIHN5c3RlbSBwcm9jZWR1cmUsIGFzIGZvbGxvd3M6Ci0gKgotICoJMSA8PSBuX290aGVyIDw9IDMyIDoKLSAqCQlUaGUgc3ltYm9sIGlzIHRoZSBlbnRyeSBwb2ludCB0byBhIHN5c3RlbSBwcm9jZWR1cmUuCi0gKgkJJ25fdmFsdWUnIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSwgYXMgZm9yIGFueSBvdGhlcgotICoJCXByb2NlZHVyZS4gIFRoZSBzeXN0ZW0gcHJvY2VkdXJlIG51bWJlciAod2hpY2ggY2FuIGJlIHVzZWQgaW4KLSAqCQlhICdjYWxscycgaW5zdHJ1Y3Rpb24pIGlzIChuX290aGVyLTEpLiAgVGhlc2UgZW50cmllcyBjb21lIGZyb20KLSAqCQknLnN5c3Byb2MnIGRpcmVjdGl2ZXMuCi0gKgotICoJbl9vdGhlciA9PSBOX0NBTExOQU1FCi0gKgkJdGhlIHN5bWJvbCBpcyB0aGUgJ2NhbGwnIGVudHJ5IHBvaW50IHRvIGEgbGVhZiBwcm9jZWR1cmUuCi0gKgkJVGhlICpuZXh0KiBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSBtdXN0IGJlIHRoZSBjb3JyZXNwb25kaW5nCi0gKgkJJ2JhbCcgZW50cnkgcG9pbnQgdG8gdGhlIHByb2NlZHVyZSAoc2VlIGZvbGxvd2luZykuICBUaGVzZQotICoJCWVudHJpZXMgY29tZSBmcm9tICcubGVhZnByb2MnIGRpcmVjdGl2ZXMgaW4gd2hpY2ggdHdvIGRpZmZlcmVudAotICoJCXN5bWJvbHMgYXJlIHNwZWNpZmllZCAodGhlIGZpcnN0IG9uZSBpcyByZXByZXNlbnRlZCBoZXJlKS4KLSAqCQotICoKLSAqCW5fb3RoZXIgPT0gTl9CQUxOQU1FCi0gKgkJdGhlIHN5bWJvbCBpcyB0aGUgJ2JhbCcgZW50cnkgcG9pbnQgdG8gYSBsZWFmIHByb2NlZHVyZS4KLSAqCQlUaGVzZSBlbnRyaWVzIHJlc3VsdCBmcm9tICcubGVhZnByb2MnIGRpcmVjdGl2ZXMgaW4gd2hpY2ggb25seQotICoJCW9uZSBzeW1ib2wgaXMgc3BlY2lmaWVkLCBvciBpbiB3aGljaCB0aGUgc2FtZSBzeW1ib2wgaXMKLSAqCQlzcGVjaWZpZWQgdHdpY2UuCi0gKgotICogTm90ZSB0aGF0IGFuIE5fQ0FMTE5BTUUgZW50cnkgKm11c3QqIGhhdmUgYSBjb3JyZXNwb25kaW5nIE5fQkFMTkFNRSBlbnRyeSwKLSAqIGJ1dCBub3QgZXZlcnkgTl9CQUxOQU1FIGVudHJ5IG11c3QgaGF2ZSBhbiBOX0NBTExOQU1FIGVudHJ5LgotICovCi0jZGVmaW5lIE5fQ0FMTE5BTUUJKChjaGFyKS0xKQotI2RlZmluZSBOX0JBTE5BTUUJKChjaGFyKS0yKQotI2RlZmluZSBJU19DQUxMTkFNRSh4KQkoTl9DQUxMTkFNRSA9PSAoeCkpCi0jZGVmaW5lIElTX0JBTE5BTUUoeCkJKE5fQkFMTkFNRSA9PSAoeCkpCi0jZGVmaW5lIElTX09USEVSKHgpCSgoeCk+MCAmJiAoeCkgPD0zMikKLQotI2RlZmluZSBiX291dF9yZWxvY2F0aW9uX2luZm8gcmVsb2NhdGlvbl9pbmZvCi1zdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvIHsKLQlpbnQJIHJfYWRkcmVzczsJLyogRmlsZSBhZGRyZXNzIG9mIGl0ZW0gdG8gYmUgcmVsb2NhdGVkCSovCi0JdW5zaWduZWQKLSNkZWZpbmUgcl9pbmRleCByX3N5bWJvbG51bQotCQlyX3N5bWJvbG51bToyNCwvKiBJbmRleCBvZiBzeW1ib2wgb24gd2hpY2ggcmVsb2NhdGlvbiBpcyBiYXNlZCwKLQkJCQkqCWlmIHJfZXh0ZXJuIGlzIHNldC4gIE90aGVyd2lzZSBzZXQgdG8KLQkJCQkqCWVpdGhlciBOX1RFWFQsIE5fREFUQSwgb3IgTl9CU1MgdG8KLQkJCQkqCWluZGljYXRlIHNlY3Rpb24gb24gd2hpY2ggcmVsb2NhdGlvbiBpcwotCQkJCSoJYmFzZWQuCi0JCQkJKi8KLQkJcl9wY3JlbDoxLAkvKiAxID0+IHJlbG9jYXRlIFBDLXJlbGF0aXZlOyBlbHNlIGFic29sdXRlCi0JCQkJICoJT24gaTk2MCwgcGMtcmVsYXRpdmUgaW1wbGllcyAyNC1iaXQKLQkJCQkgKglhZGRyZXNzLCBhYnNvbHV0ZSBpbXBsaWVzIDMyLWJpdC4KLQkJCQkgKi8KLQkJcl9sZW5ndGg6MiwJLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHJlbG9jYXRlOgotCQkJCSAqCTAgPT4gMSBieXRlCi0JCQkJICoJMSA9PiAyIGJ5dGVzIC0tIHVzZWQgZm9yIDEzIGJpdCBwY3JlbAotCQkJCSAqCTIgPT4gNCBieXRlcyAKLQkJCQkgKi8KLQkJcl9leHRlcm46MSwKLQkJcl9ic3I6MSwJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotCQlyX2Rpc3A6MSwJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotCQlyX2NhbGxqOjEsCS8qIDEgaWYgcmVsb2NhdGlvbiB0YXJnZXQgaXMgYW4gaTk2MCAnY2FsbGonICovCi0JCXJfcmVsYXhhYmxlOjE7CS8qIDEgaWYgZW5vdWdoIGluZm8gaXMgbGVmdCB0byByZWxheAotCQkJCSAgIHRoZSBkYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYWxsYmFjay5oIGIvaW5jbHVkZS9jYWxsYmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDc1Mjg0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY2FsbGJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKiBSZW1vdGUgdGFyZ2V0IHN5c3RlbSBjYWxsIGNhbGxiYWNrIHN1cHBvcnQuCi0gICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBpbnRlcmZhY2UgaXNuJ3QgaW50ZW5kZWQgdG8gYmUgc3BlY2lmaWMgdG8gYW55IHBhcnRpY3VsYXIga2luZAotICAgb2YgcmVtb3RlIChoYXJkd2FyZSwgc2ltdWxhdG9yLCB3aGF0ZXZlcikuICBBcyBzdWNoLCBzdXBwb3J0IGZvciBpdAotICAgKGUuZy4gc2ltL2NvbW1vbi9jYWxsYmFjay5jKSBzaG91bGQgKm5vdCogbGl2ZSBpbiB0aGUgc2ltdWxhdG9yIHNvdXJjZQotICAgdHJlZSwgbm9yIHNob3VsZCBpdCBsaXZlIGluIHRoZSBnZGIgc291cmNlIHRyZWUuICAqLwotCi0vKiBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIGhhbmRsZSBzeXN0ZW0gY2FsbHM6Ci0KLSAgIDEpIEhhdmUgYSBzaW11bGF0b3IgaW50ZXJjZXB0IHRoZSBhcHByb3ByaWF0ZSB0cmFwIGluc3RydWN0aW9uIGFuZAotICAgZGlyZWN0bHkgcGVyZm9ybSB0aGUgc3lzdGVtIGNhbGwgb24gYmVoYWxmIG9mIHRoZSB0YXJnZXQgcHJvZ3JhbS4KLSAgIFRoaXMgaXMgdGhlIHR5cGljYWwgd2F5IG9mIGhhbmRsaW5nIHN5c3RlbSBjYWxscyBmb3IgZW1iZWRkZWQgdGFyZ2V0cy4KLSAgIFtIYW5kbGluZyBzeXN0ZW0gY2FsbHMgZm9yIGVtYmVkZGVkIHRhcmdldHMgaXNuJ3QgdGhhdCBtdWNoIG9mIGFuCi0gICBveHltb3JvbiBhcyBydW5uaW5nIGNvbXBpbGVyIHRlc3RzdWl0ZXMgbWFrZSB1c2Ugb2YgdGhlIGNhcGFiaWxpdHkuXQotCi0gICBUaGlzIG1ldGhvZCBvZiBzeXN0ZW0gY2FsbCBoYW5kbGluZyBpcyBkb25lIHdoZW4gU1RBVEVfRU5WSVJPTk1FTlQKLSAgIGlzIEVOVklST05NRU5UX1VTRVIuCi0KLSAgIDIpIEhhdmUgYSBzaW11bGF0b3IgZW11bGF0ZSB0aGUgaGFyZHdhcmUgYXMgbXVjaCBhcyBwb3NzaWJsZS4KLSAgIElmIHRoZSBwcm9ncmFtIHJ1bm5pbmcgb24gdGhlIHJlYWwgaGFyZHdhcmUgY29tbXVuaWNhdGVzIHdpdGggc29tZSBzb3J0Ci0gICBvZiB0YXJnZXQgbWFuYWdlciwgb25lIHdvdWxkIHdhbnQgdG8gYmUgYWJsZSB0byBydW4gdGhpcyBwcm9ncmFtIG9uIHRoZQotICAgc2ltdWxhdG9yIGFzIHdlbGwuCi0KLSAgIFRoaXMgbWV0aG9kIG9mIHN5c3RlbSBjYWxsIGhhbmRsaW5nIGlzIGRvbmUgd2hlbiBTVEFURV9FTlZJUk9OTUVOVAotICAgaXMgRU5WSVJPTk1FTlRfT1BFUkFUSU5HLgotKi8KLQotI2lmbmRlZiBDQUxMQkFDS19ICi0jZGVmaW5lIENBTExCQUNLX0gKLQotLyogPz8/IFRoZSByZWFzb24gd2h5IHdlIGNoZWNrIGZvciB2YV9zdGFydCBoZXJlIHNob3VsZCBiZSBkb2N1bWVudGVkLiAgKi8KLQotI2lmbmRlZiB2YV9zdGFydAotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0MCi0vKiBNYXBwaW5nIG9mIGhvc3QvdGFyZ2V0IHZhbHVlcy4gICovCi0vKiA/Pz8gRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgb25lIG1pZ2h0IHdhbnQgdG8gYWRkIGEgc3RyaW5nIG9mIHRoZQotICAgbmFtZSBvZiB0aGUgc3ltYm9sLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgaG9zdF92YWw7Ci0gIGludCB0YXJnZXRfdmFsOwotfSBDQl9UQVJHRVRfREVGU19NQVA7Ci0KLSNkZWZpbmUgTUFYX0NBTExCQUNLX0ZEUyAxMAotCi0vKiBGb3J3YXJkIGRlY2wgZm9yIHN0YXQvZnN0YXQuICAqLwotc3RydWN0IHN0YXQ7Ci0KLXR5cGVkZWYgc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0IGhvc3RfY2FsbGJhY2s7Ci0KLXN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAKLXsKLSAgaW50ICgqY2xvc2UpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKixpbnQpKTsKLSAgaW50ICgqZ2V0X2Vycm5vKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLSAgaW50ICgqaXNhdHR5KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotICBpbnQgKCpsc2VlaykgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQsIGxvbmcgLCBpbnQpKTsKLSAgaW50ICgqb3BlbikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyKiwgaW50IG1vZGUpKTsKLSAgaW50ICgqcmVhZCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLGludCwgIGNoYXIgKiwgaW50KSk7Ci0gIGludCAoKnJlYWRfc3RkaW4pIFBBUkFNUyAoKCBob3N0X2NhbGxiYWNrICosIGNoYXIgKiwgaW50KSk7Ci0gIGludCAoKnJlbmFtZSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotICBpbnQgKCpzeXN0ZW0pIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqKSk7Ci0gIGxvbmcgKCp0aW1lKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGxvbmcgKikpOwotICBpbnQgKCp1bmxpbmspIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqKSk7Ci0gIGludCAoKndyaXRlKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosaW50LCBjb25zdCBjaGFyICosIGludCkpOwotICBpbnQgKCp3cml0ZV9zdGRvdXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLSAgdm9pZCAoKmZsdXNoX3N0ZG91dCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0gIGludCAoKndyaXRlX3N0ZGVycikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIGludCkpOwotICB2b2lkICgqZmx1c2hfc3RkZXJyKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLSAgaW50ICgqc3RhdCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICopKTsKLSAgaW50ICgqZnN0YXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50LCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLSAgLyogV2hlbiBwcmVzZW50LCBjYWxsIHRvIHRoZSBjbGllbnQgdG8gZ2l2ZSBpdCB0aGUgb3BvcnR1bml0eSB0bwotICAgICBwb2xsIGFueSBpbyBkZXZpY2VzIGZvciBhIHJlcXVlc3QgdG8gcXVpdCAoaW5kaWNhdGVkIGJ5IGEgbm9uemVybwotICAgICByZXR1cm4gdmFsdWUpLiAqLwotICBpbnQgKCpwb2xsX3F1aXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOwotCi0gIC8qIFVzZWQgd2hlbiB0aGUgdGFyZ2V0IGhhcyBnb25lIGF3YXksIHNvIHdlIGNhbiBjbG9zZSBvcGVuCi0gICAgIGhhbmRsZXMgYW5kIGZyZWUgbWVtb3J5IGV0YyBldGMuICAqLwotICBpbnQgKCpzaHV0ZG93bikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0gIGludCAoKmluaXQpICAgICBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLQotICAvKiBkZXByZWNpYXRlZCwgdXNlIHZwcmludGZfZmlsdGVyZWQgLSBUYWxrIHRvIHRoZSB1c2VyIG9uIGEgY29uc29sZS4gICovCi0gIHZvaWQgKCpwcmludGZfZmlsdGVyZWQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLQotICAvKiBUYWxrIHRvIHRoZSB1c2VyIG9uIGEgY29uc29sZS4gICovCi0gIHZvaWQgKCp2cHJpbnRmX2ZpbHRlcmVkKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwotCi0gIC8qIFNhbWUgYXMgdnByaW50Zl9maWx0ZXJlZCBidXQgdG8gc3RkZXJyLiAgKi8KLSAgdm9pZCAoKmV2cHJpbnRmX2ZpbHRlcmVkKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwotCi0gIC8qIFByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kICJleGl0Ii4KLSAgICAgSW4gdGhlIGNhc2Ugb2YgZ2RiICJleGl0aW5nIiBtZWFucyBkb2luZyBhIGxvbmdqbXAgYmFjayB0byB0aGUgbWFpbgotICAgICBjb21tYW5kIGxvb3AuICAqLwotICB2b2lkICgqZXJyb3IpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLQotICBpbnQgbGFzdF9lcnJubzsJCS8qIGhvc3QgZm9ybWF0ICovCi0KLSAgaW50IGZkbWFwW01BWF9DQUxMQkFDS19GRFNdOwotICBjaGFyIGZkb3BlbltNQVhfQ0FMTEJBQ0tfRkRTXTsKLSAgY2hhciBhbHdheXNvcGVuW01BWF9DQUxMQkFDS19GRFNdOwotCi0gIC8qIFN5c3RlbSBjYWxsIG51bWJlcnMuICAqLwotICBDQl9UQVJHRVRfREVGU19NQVAgKnN5c2NhbGxfbWFwOwotICAvKiBFcnJubyB2YWx1ZXMuICAqLwotICBDQl9UQVJHRVRfREVGU19NQVAgKmVycm5vX21hcDsKLSAgLyogRmxhZ3MgdG8gdGhlIG9wZW4gc3lzdGVtIGNhbGwuICAqLwotICBDQl9UQVJHRVRfREVGU19NQVAgKm9wZW5fbWFwOwotICAvKiBTaWduYWwgbnVtYmVycy4gICovCi0gIENCX1RBUkdFVF9ERUZTX01BUCAqc2lnbmFsX21hcDsKLSAgLyogTGF5b3V0IG9mIGBzdGF0JyBzdHJ1Y3QuCi0gICAgIFRoZSBmb3JtYXQgaXMgYSBzZXJpZXMgb2YgIm5hbWUsbGVuZ3RoIiBwYWlycyBzZXBhcmF0ZWQgYnkgY29sb25zLgotICAgICBFbXB0eSBzcGFjZSBpcyBpbmRpY2F0ZWQgd2l0aCBhIGBuYW1lJyBvZiAic3BhY2UiLgotICAgICBBbGwgcGFkZGluZyBtdXN0IGJlIGV4cGxpY2l0bHkgbWVudGlvbmVkLgotICAgICBMZW5ndGhzIGFyZSBpbiBieXRlcy4gIElmIHRoaXMgbmVlZHMgdG8gYmUgZXh0ZW5kZWQgdG8gYml0cywKLSAgICAgdXNlICJuYW1lLmJpdHMiLgotICAgICBFeGFtcGxlOiAic3RfZGV2LDQ6c3RfaW5vLDQ6c3RfbW9kZSw0Oi4uLiIgICovCi0gIGNvbnN0IGNoYXIgKnN0YXRfbWFwOwotCi0gIC8qIE1hcmtlciBmb3IgdGhvc2Ugd2FudGluZyB0byBkbyBzYW5pdHkgY2hlY2tzLgotICAgICBUaGlzIHNob3VsZCByZW1haW4gdGhlIGxhc3QgbWVtYmVyIG9mIHRoaXMgc3RydWN0IHRvIGhlbHAgY2F0Y2gKLSAgICAgbWlzY29tcGlsYXRpb24gZXJyb3JzLiAqLwotI2RlZmluZSBIT1NUX0NBTExCQUNLX01BR0lDIDQ3MDUgLyogdGVkcyBjb25zdGFudCAqLwotICBpbnQgbWFnaWM7Ci19OwotCi1leHRlcm4gaG9zdF9jYWxsYmFjayBkZWZhdWx0X2NhbGxiYWNrOwotDAotLyogQ2Fub25pY2FsIHZlcnNpb25zIG9mIHN5c3RlbSBjYWxsIG51bWJlcnMuCi0gICBJdCdzIG5vdCBpbnRlbmRlZCB0byB3aWxseS1uaWxseSB0aHJvdyBldmVyeSBzeXN0ZW0gY2FsbCBldmVyIGhlYXJkCi0gICBvZiBpbiBoZXJlLiAgT25seSBpbmNsdWRlIHRob3NlIHRoYXQgaGF2ZSBhbiBpbXBvcnRhbnQgdXNlLgotICAgPz8/IE9uZSBjYW4gY2VydGFpbmx5IHN0YXJ0IGEgZGlzY3Vzc2lvbiBvdmVyIHRoZSBvbmVzIHRoYXQgYXJlIGN1cnJlbnRseQotICAgaGVyZSwgYnV0IHRoYXQgd2lsbCBhbHdheXMgYmUgdHJ1ZS4gICovCi0KLS8qIFRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBBTlNJIEMgc3VwcG9ydCBvZiBsaWJjLiAgKi8KLSNkZWZpbmUJQ0JfU1lTX2V4aXQJMQotI2RlZmluZQlDQl9TWVNfb3BlbgkyCi0jZGVmaW5lCUNCX1NZU19jbG9zZQkzCi0jZGVmaW5lCUNCX1NZU19yZWFkCTQKLSNkZWZpbmUJQ0JfU1lTX3dyaXRlCTUKLSNkZWZpbmUJQ0JfU1lTX2xzZWVrCTYKLSNkZWZpbmUJQ0JfU1lTX3VubGluawk3Ci0jZGVmaW5lCUNCX1NZU19nZXRwaWQJOAotI2RlZmluZQlDQl9TWVNfa2lsbAk5Ci0jZGVmaW5lIENCX1NZU19mc3RhdCAgICAxMAotLyojZGVmaW5lIENCX1NZU19zYnJrCTExIC0gbm90IGN1cnJlbnRseSBhIHN5c3RlbSBjYWxsLCBidXQgcmVzZXJ2ZWQuICAqLwotCi0vKiBBUkdWIHN1cHBvcnQuICAqLwotI2RlZmluZSBDQl9TWVNfYXJndmxlbgkxMgotI2RlZmluZSBDQl9TWVNfYXJndgkxMwotCi0vKiBUaGVzZSBhcmUgZXh0cmFzIGFkZGVkIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIuICAqLwotI2RlZmluZSBDQl9TWVNfY2hkaXIJMTQKLSNkZWZpbmUgQ0JfU1lTX3N0YXQJMTUKLSNkZWZpbmUgQ0JfU1lTX2NobW9kIAkxNgotI2RlZmluZSBDQl9TWVNfdXRpbWUgCTE3Ci0jZGVmaW5lIENCX1NZU190aW1lIAkxOAotDAotLyogU3RydWN0IHVzZSB0byBwYXNzIGFuZCByZXR1cm4gaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHBlcmZvcm0gYQotICAgc3lzdGVtIGNhbGwuICAqLwotLyogRklYTUU6IE5lZWQgdG8gY29uc2lkZXIgdGFyZ2V0IHdvcmQgc2l6ZS4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNiX3N5c2NhbGwgewotICAvKiBUaGUgdGFyZ2V0J3MgdmFsdWUgb2Ygd2hhdCBzeXN0ZW0gY2FsbCB0byBwZXJmb3JtLiAgKi8KLSAgaW50IGZ1bmM7Ci0gIC8qIFRoZSBhcmd1bWVudHMgdG8gdGhlIHN5c2NhbGwuICAqLwotICBsb25nIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQ7Ci0KLSAgLyogVGhlIHJlc3VsdC4gICovCi0gIGxvbmcgcmVzdWx0OwotICAvKiBTb21lIHN5c3RlbSBjYWxscyBoYXZlIHR3byByZXN1bHRzLiAgKi8KLSAgbG9uZyByZXN1bHQyOwotICAvKiBUaGUgdGFyZ2V0J3MgZXJybm8gdmFsdWUsIG9yIDAgaWYgc3VjY2Vzcy4KLSAgICAgVGhpcyBpcyBjb252ZXJ0ZWQgdG8gdGhlIHRhcmdldCdzIHZhbHVlIHdpdGggaG9zdF90b190YXJnZXRfZXJybm8uICAqLwotICBpbnQgZXJyY29kZTsKLQotICAvKiBXb3JraW5nIHNwYWNlIHRvIGJlIHVzZWQgYnkgbWVtb3J5IHJlYWQvd3JpdGUgY2FsbGJhY2tzLiAgKi8KLSAgUFRSIHAxOwotICBQVFIgcDI7Ci0gIGxvbmcgeDEseDI7Ci0KLSAgLyogQ2FsbGJhY2tzIGZvciByZWFkaW5nL3dyaXRpbmcgbWVtb3J5IChlLmcuIGZvciByZWFkL3dyaXRlIHN5c2NhbGxzKS4KLSAgICAgPz8/IGxvbmcgb3IgdW5zaWduZWQgbG9uZyBtaWdodCBiZSBiZXR0ZXIgdG8gdXNlIGZvciB0aGUgYGNvdW50JwotICAgICBhcmd1bWVudCBoZXJlLiAgV2UgbWltaWMgc2ltX3tyZWFkLHdyaXRlfSBmb3Igbm93LiAgQmUgY2FyZWZ1bCB0bwotICAgICB0ZXN0IGFueSBjaGFuZ2VzIHdpdGggLVdhbGwgLVdlcnJvciwgbWl4ZWQgc2lnbmVkIGNvbXBhcmlzb25zCi0gICAgIHdpbGwgZ2V0IHlvdS4gICovCi0gIGludCAoKnJlYWRfbWVtKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICogLypjYiovLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqIC8qc2MqLywKLQkJCSAgIHVuc2lnbmVkIGxvbmcgLyp0YWRkciovLCBjaGFyICogLypidWYqLywKLQkJCSAgIGludCAvKmJ5dGVzKi8pKTsKLSAgaW50ICgqd3JpdGVfbWVtKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICogLypjYiovLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqIC8qc2MqLywKLQkJCSAgICB1bnNpZ25lZCBsb25nIC8qdGFkZHIqLywgY29uc3QgY2hhciAqIC8qYnVmKi8sCi0JCQkgICAgaW50IC8qYnl0ZXMqLykpOwotCi0gIC8qIEZvciBzYW5pdHkgY2hlY2tpbmcsIHNob3VsZCBiZSBsYXN0IGVudHJ5LiAgKi8KLSAgaW50IG1hZ2ljOwotfSBDQl9TWVNDQUxMOwotCi0vKiBNYWdpYyBudW1iZXIgc2FuaXR5IGNoZWNrZXIuICAqLwotI2RlZmluZSBDQl9TWVNDQUxMX01BR0lDIDB4MTIzNDQzMjEKLQotLyogTWFjcm8gdG8gaW5pdGlhbGl6ZSBDQl9TWVNDQUxMLiAgQ2FsbGVkIGZpcnN0LCBiZWZvcmUgZmlsbGluZyBpbgotICAgYW55IGZpZWxkcy4gICovCi0jZGVmaW5lIENCX1NZU0NBTExfSU5JVChzYykgXAotZG8geyBcCi0gIG1lbXNldCAoKHNjKSwgMCwgc2l6ZW9mICgqKHNjKSkpOyBcCi0gIChzYyktPm1hZ2ljID0gQ0JfU1lTQ0FMTF9NQUdJQzsgXAotfSB3aGlsZSAoMCkKLQwKLS8qIFJldHVybiBjb2RlcyBmb3IgdmFyaW91cyBpbnRlcmZhY2Ugcm91dGluZXMuICAqLwotCi10eXBlZGVmIGVudW0gewotICBDQl9SQ19PSyA9IDAsCi0gIC8qIGdlbmVyaWMgZXJyb3IgKi8KLSAgQ0JfUkNfRVJSLAotICAvKiBlaXRoZXIgZmlsZSBub3QgZm91bmQgb3Igbm8gcmVhZCBhY2Nlc3MgKi8KLSAgQ0JfUkNfQUNDRVNTLAotICBDQl9SQ19OT19NRU0KLX0gQ0JfUkM7Ci0KLS8qIFJlYWQgaW4gdGFyZ2V0IHZhbHVlcyBmb3Igc3lzdGVtIGNhbGwgbnVtYmVycywgZXJybm8gdmFsdWVzLCBzaWduYWxzLiAgKi8KLUNCX1JDIGNiX3JlYWRfdGFyZ2V0X3N5c2NhbGxfbWFwcyBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBUcmFuc2xhdGUgdGFyZ2V0IHRvIGhvc3Qgc3lzY2FsbCBmdW5jdGlvbiBudW1iZXJzLiAgKi8KLWludCBjYl90YXJnZXRfdG9faG9zdF9zeXNjYWxsIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSBob3N0IHRvIHRhcmdldCBlcnJubyB2YWx1ZS4gICovCi1pbnQgY2JfaG9zdF90b190YXJnZXRfZXJybm8gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLQotLyogVHJhbnNsYXRlIHRhcmdldCB0byBob3N0IG9wZW4gZmxhZ3MuICAqLwotaW50IGNiX3RhcmdldF90b19ob3N0X29wZW4gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLQotLyogVHJhbnNsYXRlIHRhcmdldCBzaWduYWwgbnVtYmVyIHRvIGhvc3QuICAqLwotaW50IGNiX3RhcmdldF90b19ob3N0X3NpZ25hbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotCi0vKiBUcmFuc2xhdGUgaG9zdCBzaWduYWwgbnVtYmVyIHRvIHRhcmdldC4gICovCi1pbnQgY2JfaG9zdF90b190YXJnZXRfc2lnbmFsIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSBob3N0IHN0YXQgc3RydWN0IHRvIHRhcmdldC4KLSAgIElmIHN0YXQgc3RydWN0IHB0ciBpcyBOVUxMLCBqdXN0IGNvbXB1dGUgdGFyZ2V0IHN0YXQgc3RydWN0IHNpemUuCi0gICBSZXN1bHQgaXMgc2l6ZSBvZiB0YXJnZXQgc3RhdCBzdHJ1Y3Qgb3IgMCBpZiBlcnJvci4gICovCi1pbnQgY2JfaG9zdF90b190YXJnZXRfc3RhdCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IHN0cnVjdCBzdGF0ICosIFBUUikpOwotCi0vKiBQZXJmb3JtIGEgc3lzdGVtIGNhbGwuICAqLwotQ0JfUkMgY2Jfc3lzY2FsbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIENCX1NZU0NBTEwgKikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9DaGFuZ2VMb2cgYi9pbmNsdWRlL2NvZmYvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTgwOTNjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4MzEgKzAsMCBAQAotMTk5OS0wOS0yMCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpbnRlcm5hbC5oOiBEZWxldGUgYm9ndXMgUl9QQ0xPTkcsIGR1cGxpY2F0ZSBSX1JFTEJZVEUgYW5kCi0JUl9SRUxXT1JELCBhbmQgcmV3cml0ZSBzb21lIFJfKiBhcyBkZWNpbWFsLgotCi0xOTk5LTA5LTA2ICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogaW50ZXJuYWwuaCAoRFRZUEUpOiBEZWZpbmUuCi0JKiBwZS5oIChzdHJ1Y3QgZXh0ZXJuYWxfUEVJX2ZpbGVoZHIpOiBSZW5hbWUgZnJvbQotCWV4dGVybmFsX1BFX2ZpbGVoZHIuICBEZWZpbmUgZXZlbiBpZiBDT0ZGX0lNQUdFX1dJVEhfUEUgaXMgbm90Ci0JZGVmaW5lZC4KLQotMTk5OS0wNy0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLmggKEZfU09GVF9GTE9BVCk6IFJlbmFtZSBmcm9tIEZfU09GVEZMT0FULgotCi0xOTk5LTA2LTIxICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogYXJtLmggKEZfU09GVEZMT0FUKTogRGVmaW5lLgotCi0xOTk5LTA3LTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0uaCAoRl9BUk1fNSk6IERlZmluZS4KLQotV2VkIEp1biAgMiAxODowODoxOCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChCRU9TX0VYRV9JTUFHRV9CQVNFLCBCRU9TX0RMTF9JTUFHRV9CQVNFKTogTmV3LgotCi1Nb24gTWF5IDE3IDEzOjM1OjM1IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb2ZmL2FybS5oIChGX1BJQywgRl9BUk1fMiwgRl9BUk1fMmEsIEZfQVJNXzMsIEZfQVJNXzNNLAotCUZfQVJNXzQsIEZfQVJNXzRULCBGX0FQQ1MyNik6IENoYW5nZWQgdmFsdWVzIHRvIGRpc3Rpbmd1aXNoCi0JRl9BUk1fMmEsIEZfQVJNXzNNLCBGX0FSTV80VC4KLQotMTk5OS0wNS0xNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaCAoSU1BR0VfUkVMX01DT1JFX1JWQSk6IERlZmluZS4KLQotMTk5OS0wNC0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaCAoR0VUX0xJTkVOT19MTk5PKTogTmV3IG1hY3JvLgotCShQVVRfTElORU5PX0xOTk8pOiBOZXcgbWFjcm8uCi0KLTE5OTktMDQtMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLmg6IE5ldyBoZWFkZXIgZmlsZS4gIERlZmluZXMgZm9yIE1vdG9yb2xsYSdzIE1Db3JlCi0JcHJvY2Vzc29yLiAKLQotU3VuIERlYyAgNiAyMTozNjozNyAxOTk4ICBNYXJrIEVsYnJlY2h0ICA8c25vd2JhbGwzQHVzYS5uZXQ+Ci0KLQkqIGludGVybmFsLmggKENfV0VBS0VYVCk6IERlZmluZS4KLQotV2VkIEphbiAyNyAxMzozNTozNSAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogY29mZi9hcm0uaCAoRl9QSUNfSU5ULCBGX0FSTV8yLCBGX0FSTV8zLCBGX0FSTV80LCBGX0FQQ1MyNik6Ci0JQ2hhbmdlZCB2YWx1ZXMgdG8gYXZvaWQgY2xhc2hpbmcgd2l0aCBJTUFHRV9GSUxFXyogY29mZiBoZWFkZXIKLQlmbGFnIHZhbHVlcy4KLQkKLVdlZCBBcHIgIDEgMTY6MDY6MTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaDogRG9jdW1lbnQgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggVGh1bWIgc3ltYm9sCi0JdHlwZXMuIAotCi1GcmkgTWFyIDI3IDE3OjE2OjU3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoSVNQVFIsIElTRkNOLCBJU0FSWSk6IEFkZCBjYXN0cyB0byB1bnNpZ25lZCBsb25nLgotCi1Nb24gRmViICAyIDE3OjEwOjM4IDE5OTggIFN0ZXZlIEhhd29ydGggIDxzdGV2ZUBwbS5jc2Uucm1pdC5FRFUuQVU+Ci0KLQkqIHRpYzMwLmg6IE5ldyBmaWxlLgotCi1GcmkgRGVjIDEyIDExOjQ5OjA3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChSX01QUENSMTVXKTogTmV3IHJlbG9jYXRpb24gdHlwZSwgZm9yIDE1IGJpdCBQQyByZWxhdGl2ZQotCW9mZnNldHMuCi0KLVR1ZSBEZWMgIDIgMTA6MjE6NDAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLmggKENPRkZBUk0pOiBOZXcgZGVmaW5lLgotCi1TYXQgTm92IDIyIDE1OjEwOjE0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKENfVEhVTUJFWFRGVU5DLCBDX1RIVU1CU1RBVEZVTkMpOiBDb25zdGFudHMgdG8KLQlkZWZpbmUgc3RhdGljIGFuZCBleHRlcm5hbCBmdW5jdGlvbnMuCi0KLQkqIGFybS5oOiBBZGQgYml0cyB0byBzdXBwb3J0IFBJQyBhbmQgQVBDUy1GTE9BVCB0eXBlIGJpbmFyaWVzLAotCXdoZW4gaW1wbGVtZW50ZWQuCi0KLUZyaSBPY3QgIDMgMTQ6MjU6MTcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFJfUFBMMTZCKTogTWFrZSBjb25zdGFudCB1cHBlcmNhc2UgZm9yIGNvbnNpc3RlbmN5LgotCi1UdWUgSnVsIDIyIDE4OjE4OjU4IDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogZ28zMmV4ZS5oOiBOZXcgZmlsZS4KLQotVHVlIEp1bCAgOCAxMjoyMzo1NSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfVEFSR0VUX0lEKTogQWRkIGRlZmluZS4KLQkqIGludGVybmFsLmggKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyKTogQWRkIGZfdGFyZ2V0X2lkIGZpZWxkLgotCi1UdWUgSnVuICAzIDE2OjQ0OjE4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmg6IEFkZCBzdG9yYWdlIGNsYXNzZXMgZm9yIFRodW1iIHN5bWJvbHMKLQotTW9uIE1heSAyNiAxNDowNzo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFJfUFBMMTZCKTogQ29ycmVjdCB2YWx1ZS4KLQotU2F0IE1heSAgMyAwODoyNDo1OSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoQ19VRVhULCBDX1NUQVRMQUIsIENfRVhUTEFCLCBDX1NZU1RFTSk6Ci0JTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgVEljODAuCi0KLUZyaSBBcHIgMTggMTE6NTI6NTUgMTk5NyAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BhcHBsaS5zZT4KLQotCSogYWxwaGEuaCAoQUxQSEFfRUNPRkZfQkFETUFHKTogUmVjb2duaXplICpCU0QvYWxwaGEgbWFnaWMgdG9vLgotCShBTFBIQV9SX0xJVEVSQUxTTEVBWlkpOiBEZWZpbmUuCi0JKiBlY29mZi5oIChBTFBIQV9NQUdJQ19CU0QpOiBEZWZpbmUuCi0KLVdlZCBKYW4gMjkgMTE6MzE6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpOTYwLmggKFJfSVBSMTMsIFJfQUxJR04pOiBEZWZpbmUuCi0KLU1vbiBKYW4gMjcgMTM6MzQ6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChSX0lQUk1FRCwgUl9PUFRDQUxMLCBSX09QVENBTExYKTogTW92ZSBkZWZpbml0aW9ucwotCWZyb20gaGVyZS4uLgotCSogaTk2MC5oIChSX0lQUk1FRCwgUl9PUFRDQUxMLCBSX09QVENBTExYKTogLi4udG8gaGVyZS4KLQotV2VkIEphbiAyMiAyMDoxMDo0NyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBNQUdJQyk6IFJlbmFtZWQgdG8gVElDODBfQU9VVEhEUl9NQUdJQy4KLQotRnJpIERlYyAyNyAyMjowNTo0NSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaDogTmV3IGZpbGUgZm9yIFRJYzgwIHN1cHBvcnQuCi0KLVRodSBEZWMgMTkgMTY6MTg6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcm0uaCAoX0xJVCk6IERlZmluZS4KLQotRnJpIEp1biAyOCAxMjo1NDozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlLmggKEZJTEhTWik6IERlZmluZS4KLQotV2VkIEp1biAyNiAxNjoyNDoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIEFsbCBmaWxlczogRGVmaW5lIEZJTEhTWiwgQU9VVFNaLCBBT1VUSERSU1osIFNDTkhTWiwgU1lNRVNaLAotCUFVWEVTWiwgTElORVNaLCBSRUxTWiBhcyBudW1lcmljIGNvbnN0YW50cyByYXRoZXIgdGhhbiB1c2VzIG9mCi0Jc2l6ZW9mLiAgRGVmaW5lIEFPVVRIRFJTWiBpbiBhbGwgZmlsZXMuCi0JKiBwZS5oIChBT1VUU1opOiBEZWZpbmUgYnkgYWRkaW5nIHRvIEFPVVRIRFJTWi4KLQotRnJpIEp1biAyMSAxMToxNzo0NiAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEuaDogQWRkIGRlY2xhcmF0aW9ucyBmb3IgcmVsb2NhdGlvbiB0eXBlcyBhZGRlZCBmb3IgQWxwaGEKLSAJT1NGLzEgMy4wLgotCi1UdWUgSnVuIDE4IDE2OjA0OjI5IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBoODMwMC5oIChIODMwMFNNQUdJQyk6IERlZmluZS4KLQkoSDgzMDBTQkFETUFHKTogRGVmaW5lLgotCi1Nb24gSnVuIDEwIDExOjUzOjI4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoUl9CQ0NfSU5WLCBSX0pNUF9ERUwpOiBOZXcgcmVsb2NhdGlvbnMgZm9yCi0JcmVsYXhpbmcgaW4gdGhlIEg4LzMwMCBzZXJpZXMuCi0KLVRodSBNYXkgMTYgMTU6NDk6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzaC5oIChSX1NIX0NPREUsIFJfU0hfREFUQSwgUl9TSF9MQUJFTCk6IERlZmluZS4KLQotVHVlIE1heSAgNyAwMDozNjozOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKFJfSk1QTDIpOiBSZW5hbWVkIGZyb20gUl9KTVBMX0I4IHRvIGJlCi0JY29uc2lzdGVudCB3aXRoIG90aGVyIHNpbWlsYXIgcmVsb2NzLgotCi0JKiBpbnRlcm5hbC5oIChIOC8zMDAgc3BlY2lmaWMgcmVsb2NzKTogQWRkIGNvbW1lbnRzIGJldHRlcgotCWV4cGxhaW5pbmcgd2hhdCBlYWNoIHJlbG9jIGlzIHVzZWQgZm9yLgotCShSX01PVjE2QjEsIFJfTU9WMTZCMik6IFJlbmFtZWQgZnJvbSBSX01PVkIxIGFuZCBSX01PVkIyLgotCShSX01PVjI0QjEsIFJfTU9WMjRCMik6IFJlbmFtZWQgZnJvbSBSX01PVkxCMSBhbmQgUl9NT1ZMQjIuCi0JKFJfTU9WTDEsIFJfTU9WTDIpOiBOZXcgcmVsb2NzLgotCQotRnJpIE1heSAgMyAxMzowMToxMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKFJfUENSV09SRF9CKTogRGVmaW5lIGZvciB0aGUgaDgzMDAgcmVsYXhpbmcKLQlsaW5rZXIuCi0KLVdlZCBNYXkgIDEgMTk6MjE6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChTQ05OTUxFTik6IERlZmluZS4KLQkoc3RydWN0IGludGVybmFsX3Njbmhkcik6IFVzZSBTQ05OTUxFTiBmb3Igc19uYW1lIGZpZWxkLgotCi1GcmkgTWFyIDI5IDEzOjQxOjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGUuaDogRGVmaW5lIElNQUdFX0NPTURBVCBjb2Rlcy4KLQotV2VkIE1hciAyNyAxNzoyOTo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oICh1bmlvbiBleHRlcm5hbF9hdXhlbnQpOiBBZGQgeF9jaGVja3N1bSwgeF9hc3NvY2lhdGVkLCBhbmQKLQl4X2NvbWRhdCBmaWVsZHMgdG8geF9zY24gc3RydWN0LgotCSogaTM4Ni5oICh1bmlvbiBleHRlcm5hbF9hdXhlbnQpOiBMaWtld2lzZS4KLQkqIHBvd2VycGMuaCAodW5pb24gZXh0ZXJuYWxfYXV4ZW50KTogTGlrZXdpc2UuCi0JKiBpbnRlcm5hbC5oICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQpOiBMaWtld2lzZS4KLQotVGh1IE1hciAyMSAxNjoyNTo1NyAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBlY29mZi5oIChzdHJ1Y3QgZWNvZmZfZmluZF9saW5lKTogQWRkIGNhY2hpbmcgZmllbGRzLgotCi1UaHUgTWFyIDE0IDE1OjIyOjQ0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoUl9NRU1fSU5ESVJFQ1QpOiBOZXcgcmVsb2MgZm9yIHRoZSBoODMwMC4KLSAKLUZyaSBGZWIgIDkgMTA6NDQ6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhdXgtY29mZi5oOiBSZW5hbWUgZnJvbSBhdXguaCwgdG8gYXZvaWQgcHJvYmxlbXMgb24gaGFwbGVzcyBET1MKLQlzeXN0ZW1zIHdoaWNoIHRoaW5rIHRoYXQgYXV4IGlzIGEgY29tIHBvcnQuCi0KLU1vbiBGZWIgIDUgMTg6MzU6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpOTYwLmggKEZfSTk2MEhYKTogRGVmaW5lLgotCi1XZWQgSmFuIDMxIDEzOjExOjU0IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhdXguaDogTmV3IGZpbGUuCi0JKiBpbnRlcm5hbC5oLCBtNjhrLmg6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24uCi0KLVdlZCBOb3YgMjIgMTM6NDg6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5oIChfUkNPTlNULCBTVFlQX1JDT05TVCwgUkVMT0NfU0VDVElPTl9SQ09OU1QpOiBEZWZpbmUuCi0JKE5VTV9SRUxPQ19TRUNUSU9OUyk6IFVwZGF0ZS4KLQkqIHN5bWNvbnN0LmggKHNjUkNvbnN0KTogRGVmaW5lLgotCi1UdWUgTm92IDE0IDE4OjU0OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoQ19OVF9XRUFLKTogRGVmaW5lLgotCi1UaHUgTm92ICA5IDE0OjA4OjMwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcnM2MDAwLmggKFNUWVBfT1ZSRkxPKTogRGVmaW5lLgotCi1UdWUgTm92ICA3IDE0OjM4OjQ1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmL3Bvd2VycGMuaCAoSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDKTogQWRkZWQgZGVmaW5lLgotCSogY29mZi9wZS5oOiBBZGRlZCBkZWZpbmVzIGZvciBmaWxlIGxldmVsIGZsYWdzCi0KLU1vbiBOb3YgIDYgMTc6Mjg6MDEgMTk5NSAgSGFycnkgRG9sYW4gIDxkb2xhbkBzc2QuaW50ZWwuY29tPgotCi0JKiBpODYwLmg6IE5ldyBmaWxlLCBiYXNlZCBvbiBpMzg2LmguCi0KLVdlZCBOb3YgIDEgMTU6MjU6MTggMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIG02OGsuaCAoUEFHRU1BR0lDRVhFQ1NXQVBQRUQpOiBEZWZpbmUuCi0JKFBBR0VNQUdJQ1BFWEVDU1dBUFBFRCk6IERlZmluZS4KLQkoUEFHRU1BR0lDUEVYRUNUU0hMSUIpOiBEZWZpbmUuCi0JKFBBR0VNQUdJQ1BFWEVDUEFHRUQpOiBEZWZpbmUuCi0JKF9DT01NRU5UKTogREVGSU5FLgotCSogbTg4ay5oIChfQ09NTUVOVCk6IERlZmluZS4KLQotV2VkIE9jdCAxOCAxODozNjoxOSAxOTk1ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBzeW0uaDogI2lmIDAnZCBvdXQgcnVudGltZV9wZHIgc3RydWN0IGJlY2F1c2UgaXQgY2hva2VzIAotCVZpc3VhbCBDKysgYW5kIHRoZXJlIGFyZW4ndCBhbnkgcmVmZXJlbmNlcyB0byBpdCBlbHNld2hlcmUgaW4gZ2RiLgotCi1Nb24gT2N0IDE2IDExOjEyOjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcnM2MDAwLmggKFNNQUxMX0FPVVRTWik6IERlZmluZS4KLQotCSogaW50ZXJuYWwuaCAoWE1DX1REKTogRGVmaW5lLgotCi1UdWUgT2N0IDEwIDE4OjQxOjAzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX2FvdXRoZHIpOiBBZGQgb19jcHV0eXBlIGZpZWxkLgotCSogcnM2MDAwLmggKEFPVVRIRFIpOiBSZW5hbWUgb19yZXN2MSB0byBvX2NwdXR5cGUuCi0KLU1vbiBPY3QgIDkgMTQ6NDU6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByczYwMDAuaCAoQU9VVEhEUik6IEFkZCBvX21heGRhdGEgZmllbGQuICBBZGQgY29tbWVudHMuCi0JKF9QQUQsIF9MT0FERVIpOiBEZWZpbmUuCi0JKFNUWVBfTE9BREVSKTogRGVmaW5lLgotCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX2FvdXRoZHIpOiBBZGQgb19tYXhkYXRhIGZpZWxkLgotCi1UaHUgT2N0ICA1IDEwOjAyOjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuaDogRGVmaW5lIHNlY3Rpb24gbmFtZSBtYWNyb3MgYW5kIFNUWVAgbWFjcm9zIGZvciB2YXJpb3VzCi0JQWxwaGEgc2VjdGlvbnM6IC5nb3QsIC5oYXNoLCAuZHluc3ltLCAuZHluc3RyLCAucmVsLmR5biwgLmNvbmZsaWMsCi0JLmNvbW1lbnQsIC5saWJsaXN0LCAuZHluYW1pYy4KLQotV2VkIE9jdCAgNCAxMDo1NjozNSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogcGUuaDogTW92ZWQgRE9TTUFHSUMgYW5kIE5UX1NJR05BVFVSRSBkZWZpbmVzIGhlcmUKLQkqIHBvd2VycGMuaDogcmVtb3ZlZCBET1NNQUdJQywgTlRfU0lHTkFUVVJFLCBhbmQgREVGQVVMVF8qIGRlZmluZXMKLQlBbHNvIHJlbW92ZWQgb3RoZXIgdW51c2VkIGRlZmluZXMgKHZhcmlvdXMgTUFHSUMgb25lcykKLQkqIGkzODYuaDogcmVtb3ZlZCBET1NNQUdJQywgTlRfU0lHTkFUVVJFLCBhbmQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGFybS5oOiByZW1vdmVkIERPU01BR0lDLCBOVF9TSUdOQVRVUkUsIGFuZCBERUZBVUxUXyogZGVmaW5lcwotCSogYXBvbGxvLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBhbHBoYS5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogaDg1MDAuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGg4MzAwLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBpOTYwLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBtODhrLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiB3ZTMyay5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogcnM2MDAwLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBtaXBzLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBtNjhrLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiB6OGsuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHc2NS5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogc3BhcmMuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHNoLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0KLUZyaSBTZXAgMjkgMDg6NDA6MDggMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHBvd2VycGMuaDogUmVmb3JtYXR0ZWQgdG8gR05VIGNvZGluZyBjb252ZW50aW9ucy4KLQotV2VkIFNlcCAyNyAwNjo1MDo1MCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAbmVsbGllPgotCi0JKiBwZS5oOiBhZGRlZCBkZWZpbmVzIGZvciBtb3JlIHNlY3Rpb24gY2hhcmFjdGVyaXN0aWNzCi0JKiBwb3dlcnBjLmggKG5ldyBmaWxlKTogYmFzZSBjb2ZmIGRlZmluaXRpb25zIGZvciBwcGMgUEUKLQotVHVlIFNlcCAxMiAxMjowODoyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQpOiBDaGFuZ2Ugbl9udW1hdXggZmllbGQgZnJvbQotCWNoYXIgdG8gdW5zaWduZWQgY2hhci4KLQotRnJpIFNlcCAgMSAxNTozOTozNiAxOTk1ICBLYXp1bW90byBLb2ppbWEgIDxra29qaW1hQGluZm8ua2FuYWdhd2EtdS5hYy5qcD4KLQotCSogbWlwcy5oIChzdHJ1Y3QgcnBkcl9leHQpOiBEZWZpbmUuCi0KLVRodSBBdWcgMzEgMTY6NTE6NTAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoaW50ZXJuYWxfYW91dGhkciwgaW50ZXJuYWxfZmlsZWhkcik6Ci0JZG9uJ3QgaW5kaXJlY3QgdGhlIHBlIHN0dWZmLgotCi1UdWUgQXVnIDI5IDE0OjE2OjA3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGkzODYuaCAoTlRfREVGX1JFU0VSVkUsIE5UX0RFRl9DT01NSVQpOiBNYWtlIHRoZSBzYW1lCi0JYXMgJ3RoZSBvdGhlcicgY29tcGlsZXIuCi0JKiBpbnRlcm5hbC5oIChOVF9JTUFHRV9CQVNFKTogRGVsZXRlZC4KLQkoTlRfRVhFX0lNQUdFX0JBU0UsIE5UX0RMTF9JTUFHRV9CQVNFKTogTmV3LgotCShQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQsIFBFX0RFRl9GSUxFX0FMSUdOTUVOVCk6IE5ldy4KLQkoUl9JTUFHRUJBU0UpOiBOZXcuCi0KLU1vbiBBdWcgMjEgMTg6MTI6MTkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaDogKGludGVybmFsX2ZpbGVoZHIpOiBNb3ZlZCBQRSBzdHVmZiBpbnRvCi0JaW50ZXJuYWxfZXh0cmFfcGVfZmlsZWhkci4KLQkoaW50ZXJuYWxfYW91dGhkcik6IE1vdmVkIFBFIHN0dWZmIGludG8KLQlpbnRlcmFubF9leHRyYV9wZV9hb3V0aGRyLgotCi1Nb24gSnVsIDI0IDE0OjA1OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaDogTW92ZSBSX1NIXyogcmVsb2NzIGZyb20gaGVyZS4uLgotCSogc2guaDogLi4udG8gaGVyZS4KLQkoUl9TSF9TV0lUQ0gxNiwgUl9TSF9TV0lUQ0gzMik6IERlZmluZS4KLQkoUl9TSF9VU0VTLCBSX1NIX0NPVU5ULCBSX1NIX0FMSUdOKTogRGVmaW5lLgotCi1UaHUgSnVuIDI5IDAwOjA0OjI1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKE5UX0RFRl9SRVNFUlZFLCBOVF9ERUZfQ09NTUlUKTogSW5jcmVhc2UgYSBsb3QuCi0KLVR1ZSBNYXkgMTYgMTU6MDg6MjAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoTlRfc3Vic3lzdGVtLCBOVF9zdGFja19oZWFwKTogRGVsZXRlCi0KLVR1ZSBNYXkgMTYgMTU6MDg6MjAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoTlRfc3Vic3lzdGVtLCBOVF9zdGFja19oZWFwKTogTm93IGV4dGVybi4KLQotVHVlIEZlYiAxNCAxNzo1OTozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBlY29mZl9maW5kX2xpbmUpOiBEZWZpbmUuCi0KLVNhdCBGZWIgIDQgMTQ6Mzg6MDMgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1PgotCi0JKiBzeW0uaCAoc3RydWN0IHBkcik6IGZpZWxkICJwcm9mIiBhZGRlZC4KLQotCSogYWxwaGEuaCAoUERSX0JJVFMxX1BST0ZfKik6IGFkZGVkLCBtYWNyb3MgZm9yIFBEUl9CSVRTKl9SRVNFUlZFRF8qCi0JdXBkYXRlZCBhY2NvcmRpbmdseS4KLQotU3VuIEphbiAxNSAxODozODozMyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogdzY1Lmg6IE5ldyBmaWxlLgotCi1XZWQgTm92IDIzIDIyOjQzOjM4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIHNoLmggKFNIX0FSQ0hfTUFHSUNfQklHLCBTSF9BUkNIX01BR0lDX0xJVFRMRSk6IE5ldy4KLQkoU0hCQURNQUcpOiBDaGFuZ2VkIHRvIHN1aXQuCi0KLVR1ZSBKdWwgMjYgMTc6NDY6MDggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaTk2MC5oIChGX0k5NjBKWCk6IE5ldyBtYWNyby4KLQotV2VkIEp1bCAgNiAwMDo0ODo1NyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFscGhhLmg6ICBBZGQgZGVmaW5pdGlvbnMgZm9yIGFscGhhIGZpbGUgaGVhZGVyIGZsYWdzLCBlbmNvZGluZwotCXRoZSBvYmplY3QgdHlwZSBvZiB0aGUgZmlsZS4KLQotTW9uIEp1biAyMCAxMzo0NzowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKGVjb2ZmX3N3YXBfdGlyX2luKTogUmVtb3ZlIGRlY2xhcmF0aW9uLgotCShlY29mZl9zd2FwX3Rpcl9vdXQpOiBMaWtld2lzZS4KLQkoZWNvZmZfc3dhcF9ybmR4X2luLCBlY29mZl9zd2FwX3JuZHhfb3V0KTogTGlrZXdpc2UuCi0JKHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwKTogQWRkIG5ldyBmaWVsZHM6IHN3YXBfdGlyX2luLAotCXN3YXBfcm5keF9pbiwgc3dhcF90aXJfb3V0LCBzd2FwX3JuZHhfb3V0LCByZWFkX2RlYnVnX2luZm8uCi0KLVN1biBKdW4gMTIgMDM6NTE6NTIgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBzeW1jb25zdC5oOiAgUGljayB1cCBTR0kgZGVmaW5lIGZvciBzdEluZGlyZWN0LgotCi1GcmkgQXByIDIyIDEzOjA1OjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoUkVHSU5GTyk6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IGVjb2ZmX3JlZ2luZm8pOiBEb24ndCBkZWZpbmUuCi0KLQkqIHNoLmggKFNIX0FSQ0hfTUFHSUMpOiBSZW5hbWUgZnJvbSBTSE1BR0lDLiAgU0hNQUdJQyBpcyB1c2VkIGJ5Ci0Jc2V2ZXJhbCB0YXJnZXRzIHRvIG1lYW4gYSBzaGFyZWQgbGlicmFyeS4KLQkoU0hCQURNQUcpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotVGh1IEFwciAxNCAxMzowMDo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoUkVMT0NfQklUUzNfVFlQRV9CSUcpOiBDaGFuZ2VkIGZyb20gMHgxZSB0byAweDNlLgotCShSRUxPQ19CSVRTM19UWVBFSElfTElUVExFKTogRGVmaW5lLgotCShSRUxPQ19CSVRTM19UWVBFSElfU0hfTElUVExFKTogRGVmaW5lLgotCShNSVBTX1JfUENSRUwxNik6IENoYW5nZSB2YWx1ZSBmcm9tIDggdG8gMTIgdG8gbWF0Y2ggSXJpeCA0LgotCShNSVBTX1JfUkVMSEkpOiBEZWZpbmUuCi0JKE1JUFNfUl9SRUxMTyk6IERlZmluZS4KLQkoTUlQU19SX1NXSVRDSCk6IENoYW5nZSB2YWx1ZSBmcm9tIDkgdG8gMjIuCi0KLVRodSBBcHIgIDcgMTQ6MTk6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKE1JUFNfUl9TV0lUQ0gpOiBEZWZpbmUuCi0KLVRodSBNYXIgMzEgMTk6Mjg6MzMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoaW50ZXJuYWxfYW91dGhkcik6IEFkZGVkIGNvbW1lbnRzIGZvciBBcG9sbG8gZmllbGRzLgotCi1UaHUgTWFyIDMxIDE2OjI4OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoU1RZUF9FQ09GRl9MSUIpOiBEZWZpbmUgYXMgdXNlZCBvbiBJcml4IDQuCi0KLUZyaSBNYXIgMjUgMTc6MTY6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyk6IEFkZCBhZGp1c3QgZmllbGQuCi0JKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QpOiBEZWZpbmUuCi0KLVR1ZSBNYXIgMjIgMTM6MjI6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKE1JUFNfUl9QQ1JFTDE2KTogRGVmaW5lLgotCi1TYXQgRmViIDI2IDEwOjI2OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaDogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gU1ZSNCBjYy4KLQotTW9uIEZlYiAyMSAwOTo0ODo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogc3ltLmggKHN0cnVjdCBydW50aW1lX3Bkcik6IE1ha2UgZmllbGQgYWRyIGJmZF92bWEsIG5vdCB1bnNpZ25lZAotCWxvbmcuCi0JKFNZTVIpOiBNYWtlIGZpZWxkIHZhbHVlIGJmZF92bWEsIG5vdCBsb25nLgotCi1GcmkgRmViICA0IDIzOjM1OjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcnM2MDAwLmggKFNUWVBfREVCVUcpOiBEZWZpbmUuCi0KLVdlZCBGZWIgIDIgMTQ6MzE6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQpOiBDaGFuZ2UgeF9jc2VjdC54X3NjbmxlbiBpbnRvCi0JYSB1bmlvbiBvZiBhIGxvbmcgYW5kIGEgcG9pbnRlciB0byBhIHN5bWJvbC4gIFhDT0ZGIHNvbWV0aW1lcyB1c2VzCi0JdGhpcyBmaWVsZCBhcyBhIHN5bWJvbCBpbmRleC4KLQotTW9uIEphbiAxMCAyMzo1NDoyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKGVjb2ZmX2RlYnVnX2luZm8pOiBSZW1vdmUgZmllbGRzIGxpbmVfZW5kLAotCWV4dGVybmFsX2Rucl9lbmQsIGV4dGVybmFsX3Bkcl9lbmQsIGV4dGVybmFsX3N5bV9lbmQsCi0JZXh0ZXJuYWxfb3B0X2VuZCwgZXh0ZXJuYWxfYXV4X2VuZCwgc3NfZW5kLCBleHRlcm5hbF9mZHJfZW5kLgotCVJlcGxhY2UgaWZkYmFzZSB3aXRoIGlmZG1hcC4KLQotV2VkIEphbiAgNSAxNzowNTozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoU1RZUF9FWFRFTkRFU0MsIFNUWVBfQ09NTUVOVCwgU1RZUF9YREFUQSwgU1RZUF9QREFUQSk6Ci0JRGVmaW5lLgotCi1XZWQgSmFuICA1IDE2OjU4OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoTlVNX1JFTE9DX1NFQ1RJT05TKTogRGVmaW5lLgotCi1UdWUgRGVjIDIxIDA5OjI0OjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAoc3RydWN0IGV4dGVybmFsX3JlbG9jKTogUmVuYW1lIGZpZWxkIHJfYWRkZW5kIHRvCi0Jcl9vZmZzZXQuCi0KLVNhdCBEZWMgMTEgMTY6MTI6MzIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKFJfRElTUDcsIFJfU0hfSU1NMTYpOiBOZXcgcmVsb2MgdHlwZXMuCi0KLVR1ZSBOb3YgMjMgMTQ6MjM6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCk6IEFkZGVkICpfZW5kIGZpZWxkcyBmb3IgYWxsCi0JdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIHBvaW50ZXJzLgotCi0JKiBzeW0uaDogTmFtZWQgdGhlIEVYVFIgc3RydWN0dXJlIGVjb2ZmX2V4dHIuCi0KLUZyaSBOb3YgMTkgMDg6MjE6MTggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKFJFTFNaKTogVXNlIGNvcnJlY3Qgc2l6ZS4KLQotV2VkIE5vdiAxNyAxNzoxODoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8pOiBEZWZpbmUuCi0KLVR1ZSBOb3YgIDIgMTc6NTY6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCk6IERlZmluZS4KLQotVGh1IE9jdCAyOCAxNzowNzo1MCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAoSTM4NkxZTlhNQUdJQyk6IFJlbmFtZSB0byBMWU5YQ09GRk1BR0lDLgotCSogbTY4ay5oIChMWU5YQ09GRk1BR0lDKTogRGVmaW5lLgotCSogc3BhcmMuaDogTmV3IGZpbGUuCi0KLVR1ZSBPY3QgMTkgMTU6MzQ6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhbHBoYS5oIChleHRlcm5hbF9hb3V0aGRyKTogU3BsaXQgZm91ciBieXRlIHBhZGRpbmcgZmllbGQgaW50bwotCXR3byBieXRlIGJsZHJldiBmaWVsZCBhbmQgdHdvIGJ5dGUgcGFkZGluZyBmaWVsZC4KLQotCSogZWNvZmYuaCAoX0xJVEEsIF9QREFUQSwgX1hEQVRBLCBTVFlQX0xJVEEpOiBEZWZpbmVkLgotCi1XZWQgT2N0IDEzIDE1OjUyOjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JU3VuIE9jdCAxMCAxNzoyNzoxMCAxOTkzICBUcm95IFJvbGxvICh0cm95QGNibWUudW5zdy5lZHUuYXUpCi0KLQkqIGNvZmYvaW50ZXJuYWwuaDogQWRkZWQgb19zcmksIG9faW5saWIgYW5kIG9fdmlkIGZvciBBcG9sbG9zCi0JCQlhcyB3ZWxsIGFzIFJfRElSMTYuCi0KLQkqIGNvZmYvYXBvbGxvLmg6IE5ldyBmaWxlCi0KLU1vbiBPY3QgMTEgMTc6MTY6NDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChSRUdJTkZPLCBzdHJ1Y3QgZWNvZmZfcmVnaW5mbyk6IERlZmluZS4KLQotVHVlIE9jdCAgNSAxMDo1Mjo1MyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogcnM2MDAwLmg6IENoYW5nZSBub24tQVNDSUkgY2hhcmFjdGVycyBpbiBjb21tZW50IHRvIG9jdGFsCi0JZXNjYXBlcy4KLQotVHVlIFNlcCAyOCAwMzoyNzowNCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVjb2ZmLmggKF9GSU5JLCBTVFlQX0VDT0ZGX0ZJTkkpOiAgQWRkIHRvIHN1cHBvcnQgLmZpbmkgc2VjdGlvbi4KLQotRnJpIFNlcCAyNCAxMTo1Mzo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoQkFETUFHKTogUmVjb2duaXplIE1JUFNfTUFHSUNfTElUVExFMyBhbmQgTUlQU19NQUdJQ19CSUczLgotCSogZWNvZmYuaDogRGVmaW5lIE1JUFNfTUFHSUNfTElUVExFMyBhbmQgTUlQU19NQUdJQ19CSUczLgotCi1UaHUgU2VwIDIzIDIxOjA3OjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKEJBRE1BRyk6IFJlY29nbml6ZSBNSVBTX01BR0lDX0xJVFRMRTIgYW5kIE1JUFNfTUFHSUNfQklHMi4KLQkqIGVjb2ZmLmg6IERlZmluZSBNSVBTX01BR0lDX0xJVFRMRTIgYW5kIE1JUFNfTUFHSUNfQklHMi4KLQotVGh1IFNlcCAxNiAyMDoyNzoyMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHN5bS5oLCBzeW1jb25zdC5oOiBBZGQgY29tbWVudCBzdGF0aW5nIHRoZXNlIGZpbGVzIGFyZSBub3QgcGFydAotCW9mIEdEQiwgR0FTLCBldGMuICBJbiAxOTkxLCB3aGVuIHdlIGFza2VkIHJtcyB3aGV0aGVyIHdlIGNvdWxkCi0JaW5jbHVkZSB0aGVzZSBmaWxlcyBpbiBHREIgKGFsdGhvdWdoIHRoZXkgYXJlIGNvcHlyaWdodGVkIGJ5Ci0Jc29tZW9uZSBiZXNpZGVzIHRoZSBGU0YpLCBoZSBzYWlkIGl0IHdhcyBPSyBpZiB0aGV5IHdlcmUgbm90Ci0JY29uc2lkZXJlZCBwYXJ0IG9mIEdEQi4KLQotRnJpIFNlcCAxMCAxNzo0MDozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKEFVWF9QVVRfQU5ZKTogQ2FzdCB2YWwgYXJndW1lbnQgdG8gYmZkX3ZtYS4KLQotCSogYWxwaGEuYyAoZXh0ZXJuYWxfYW91dGhkcik6IE5lZWQgZm91ciBieXRlcyBvZiBwYWRkaW5nIGJldHdlZW4KLQl2c3RhbXAgYW5kIHRzaXplLgotCi1UdWUgU2VwICA3IDE0OjIwOjQzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoQVVYX0dFVF9BTlksIEFVWF9QVVRfQU5ZKTogQ2hhbmdlZCB0byByZWZsZWN0IGZ1cnRoZXIKLQljaGFuZ2UgaW4gYmZkIHN3YXBwaW5nIHJvdXRpbmUgbmFtZXMuCi0KLVR1ZSBTZXAgIDcgMTA6MTU6MTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKEFVWF9HRVRfQU5ZKTogQ2hhbmdlIG5hbWUgb2YgX2RvX2dldGIzMiB0byByZWZsZWN0IGJmZAotCWNoYW5nZXMuCi0KLUZyaSBBdWcgMTMgMTQ6MzA6MzIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChSRUxPQ19TRUNUSU9OX05PTkUpOiBEZWZpbmUuCi0KLVRodSBBdWcgMTIgMTE6MjQ6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhbHBoYS5oIChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MpOiBBZGQgcl9zeW1uZHggZmllbGQuCi0JKFJFTFNaKTogQ29ycmVjdC4KLQkoUkVMT0NfQklUUyopOiBDb3JyZWN0LgotCShBTFBIQV9SXyopOiBEZWZpbmUuCi0JKiBlY29mZi5oIChSRUxPQ19TRUNUSU9OX3tYREFUQSxQREFUQSxGSU5JLExJVEEsQUJTfSk6IERlZmluZS4KLQkocl9leHRlcm4pOiBVbmRlZmluZS4KLQkqIGludGVybmFsLmggKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyk6IE1ha2Ugcl92YWRkciBiZmRfdm1hIHJhdGhlcgotCXRoYW4gbG9uZy4gIEFkZCByX2V4dGVybiBmaWVsZC4KLQotCSogYWxwaGEuaCAoUERSX0JJVFMqKTogRGVmaW5lLgotCSogc3ltLmggKFBEUik6IEdpdmUgY29ycmVjdCBuYW1lcyB0byBuZXcgZmllbGRzLgotCi0JKiBlY29mZi5oOiBNb3ZlZCBNSVBTIHJlbG9jIGRlZmluaXRpb25zIGZyb20gaGVyZS4uLgotCSogbWlwcy5oOiB0byBoZXJlLgotCi1UdWUgQXVnICAzIDExOjE3OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYWxwaGEuaDogQ29ycmVjdGVkIGV4dGVybmFsIHN5bWJvbGljIGRlYnVnZ2luZyBzdHJ1Y3R1cmVzIHRvCi0JbWF0Y2ggYWN0dWFsIHVzYWdlLgotCSogaW50ZXJuYWwuaCAoaW50ZXJuYWxfZmlsZWhkciwgaW50ZXJuYWxfYW91dGhkciwKLQlpbnRlcm5hbF9zY25oZHIpOiBDaGFuZ2VkIHR5cGUgb2Ygc29tZSBmaWVsZHMgdG8gYmZkX3ZtYSBzbyB0aGV5Ci0JY2FuIGhvbGQgNjQgYml0cy4KLQkqIHN5bS5oIChIRFJSLCBGRFIsIFBEUiwgRVhUUik6IExpa2V3aXNlLgotCShQRFIpOiBBZGRlZCBuZXcgZmllbGRzIGZvdW5kIG9uIEFscGhhLgotCSogc3ltY29uc3QuaCAobWFnaWNTeW0yKTogRGVmaW5lOyBuZXcgdmFsdWUgZm91bmQgb24gQWxwaGEuCi0KLQkqIGVjb2ZmLmg6IE5ldyBmaWxlLgotCSogYWxwaGEuaCwgbWlwcy5oOiBNb3ZlZCBjb21tb24gaW5mb3JtYXRpb24gaW50byBlY29mZi5oLiAgTW92ZWQKLQlleHRlcm5hbCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgaW4gZnJvbSBlY29mZi1leHQuaC4KLQkqIGVjb2ZmLWV4dC5oOiBSZW1vdmVkOyBpbmZvcm1hdGlvbiBub3cgaW4gYWxwaGEuaCBhbmQgbWlwcy5oLgotCi1TdW4gSnVsIDE4IDIxOjQzOjU5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBSZWNvZ25pemUgSTM4NlBUWE1BR0lDLgotCi1GcmkgSnVsIDE2IDA5OjU0OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChNSVBTX0FPVVRfe09afU1BR0lDKTogUmVuYW1lZCBmcm9tIHtPWn1NQUdJQy4KLQotVGh1IEp1bCAxNSAxMjoyMzo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG04OGsuaCAodW5pb24gZXh0ZXJuYWxfYXV4ZW50KTogTW92ZSB4X2ZjbiBiYWNrIGluc2lkZSB4X2ZjbmFyeS4KLQkoe0dFVCxQVVR9X0ZDTl97TE5OT1BUUixFTkRORFh9KTogQWRqdXN0IGFjY29yZGluZ2x5LgotCi1TdW4gSnVsIDExIDE4OjAwOjE4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IERlZmluZSBNQzY4S0JDU01BR0lDLgotCi1UaHUgSnVuIDEwIDExOjQ2OjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChfSU5JVCwgU1RZUF9NSVBTX0lOSVQpOiBEZWZpbmUgKHVzZWQgb24gSXJpeDQpLgotCShTVFlQX09USEVSX0xPQUQpOiBEZWZpbmUgYXMgU1RZUF9NSVBTX0lOSVQuCi0KLVdlZCBKdW4gIDkgMTU6MDk6MDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKE9NQUdJQyk6IERlZmluZS4KLQotTW9uIEFwciAyNiAxODowNDo0NyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCwgc2guaDogU3VwcG9ydCBmb3IgU0guCi0KLVNhdCBBcHIgMjQgMjE6MzQ6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGEyOWsuaDogRGVmaW5lIF9MSVQuCi0KLUZyaSBBcHIgMjMgMTg6NDE6MjMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFscGhhLmg6IE5ldyBmaWxlLgotCi1UaHUgQXByICA4IDEyOjM2OjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoQ19TSEFET1csIENfVkVSU0lPTik6IENvcGllZCBpbiBmcm9tIG04OGsuaC4KLQkqIG04OGsuaCwgaTM4Ni5oLCB3ZTMyay5oOiBEb24ndCBkZWZpbmUgYWxsIHRoZSBzdG9yYWdlIGNsYXNzZXM7Ci0JdGhleSdyZSBhbHJlYWR5IGluIGludGVybmFsLmguCi0KLVdlZCBBcHIgIDcgMTE6NTE6MjQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENoYW5nZSBuX3NjbGFzcyB0byB1bnNpZ25lZCBjaGFyLgotCUNoYW5nZSBDX0VGQ04gdG8gMHhmZiwgY2hhbmdlIFJTLzYwMDAgZGJ4IHN5bWJvbHMKLQl0byBubyBsb25nZXIgYmUgc2lnbmVkLgotCi1GcmkgTWFyIDE5IDE0OjUyOjU2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBBZGQgSDgvNTAwIHJlbG9jIHR5cGVzLgotCi1XZWQgTWFyIDE3IDA5OjQ2OjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0LmggKEFVWF9QVVRfQU5ZKTogRG9uJ3QgdXNlIHZvaWQgdmFsdWVzIGluIGJyYW5jaGVzIG9mCi0JY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KLQotVGh1IE1hciAgNCAxNDoxMjowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oIChBVVhfR0VUXyopOiBSZXdyb3RlIHRvIHVzZSBuZXcgbWFjcm8gQVVYX0dFVF9BTlkuCi0JKEFVWF9QVVRfKik6IE5ldyBtYWNyb3MgY29ycmVzcG9uZGluZyB0byB0aGUgQVVYX0dFVCBtYWNyb3MuCi0JKGVjb2ZmX3N3YXBfdGlyX291dCk6IEFkZGVkIHByb3RvdHlwZS4KLQotCSogbWlwcy5oIChOX0JUTUFTSywgTl9UTUFTSywgTl9CVFNIRlQsIE5fVFNISUZUKTogRGVmaW5lOyB0aGVzZQotCWFyZSBuZWVkZWQgdG8gaW50ZXJwcmV0IGdjYyBkZWJ1Z2dpbmcgb3V0cHV0LgotCi1UdWUgRmViICA5IDA3OjQzOjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogd2UzMmsuaCAoQlRZUEUsIElTUFRSLCBJU0ZDTiwgSVNBUlksIERFQ1JFRik6IFJlbW92ZWQKLQltb3JlIGRlZmluaXRpb25zIGR1cGxpY2F0ZWQgaW4gaW50ZXJuYWwuaC4KLQotV2VkIEZlYiAgMyAwOToxODoyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoUkVMT0NfQklUUzNfVFlQRV8qKTogQ29ycmVjdCBmb3IgYmlnIGVuZGlhbiBtYWNoaW5lcy4KLQotTW9uIEphbiAyNSAxMTozNTo1MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKGludGVybmFsX2FvdXRoZHIpOiBBZGRlZCBhZGRpdGlvbmFsIGZpZWxkcyB1c2VkIG9ubHkKLQlieSBNSVBTIEVDT0ZGLgotCi1UaHUgSmFuIDIxIDEwOjI4OjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChBT1VUSERSKTogQWRkZWQgYWRkaXRpb25hbCBmaWVsZHMgdXNlZCBieSBFQ09GRi4KLQotVHVlIEphbiAxOSAxMjoyMToxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCwgd2UzMmsuaCAoTl8qLCBUXyosIERUXyopOiBSZW1vdmVkIHN0aWxsIG1vcmUgZGVmaW5pdGlvbnMKLQlkdXBsaWNhdGVkIGluIGludGVybmFsLmguCi0KLQkqIG1pcHMuaCAoUkVMT0NfU0VDVElPTl8qLCBFQ09GRl9SXyopOiBEZWZpbmVkIGNvbnN0YW50cyBmb3IgRUNPRkYKLQlyZWxvY3MuCi0KLUZyaSBKYW4gMTUgMTg6MTc6MDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi1leHQuaDogQWRkZWQgcHJvdG90eXBlcyBmb3IgbmV3IEVDT0ZGIHN3YXBwaW5nIGZ1bmN0aW9ucy4KLQkob3B0X2V4dCk6IE5ldyBzdHJ1Y3R1cmUuCi0JKiBtaXBzLmggKFpNQUdJQyk6IERlZmluZWQgdG8gYmUgMDQxMy4KLQkoX0xJQik6IERlZmluZWQgdG8gYmUgIi5saWIiCi0JKGV4dGVybmFsX3JlbG9jKTogTUlQUyBFQ09GRiByZWxvY3MgYXJlIG9ubHkgOCBieXRlcy4gIEFkZGVkCi0JbWFjcm9zIHRvIGFpZCBpbiBzd2FwcGluZy4KLQotRnJpIEphbiAgOCAxNjoxOToyNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oOiBBZGRlZCBwcm90b3R5cGVzIGZvciBFQ09GRiBzd2FwcGluZyBmdW5jdGlvbnMuCi0JKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9zY25oZHIpOiBBbHdheXMgcHJvdmlkZSBzX2FsaWduIGZpZWxkLCBub3QKLQlqdXN0IG9uIGk5NjAuCi0JKGludGVybmFsX3JlbG9jKTogQWx3YXlzIHByb3ZpZGUgcl9zaXplIGZpZWxkLCBub3QganVzdCBvbgotCVJTLzYwMDAuCi0JKiBtaXBzLmggKF9SREFUQSwgX1NEQVRBLCBfU0JTUywgX0xJVDQsIF9MSVQ4LCBTVFlQX1JEQVRBLAotCVNUWVBfU0RBVEEsIFNUWVBfU0JTUywgU1RZUF9MSVQ0LCBTVFlQX0xJVDgpOiBEZWZpbmVkLgotCShDT0RFX01BU0ssIE1JUFNfSVNfU1RBQiwgTUlQU19NQVJLX1NUQUIsIE1JUFNfVU5NQVJLX1NUQUIsCi0JU1RBQlNfU1lNQk9MKTogTW92ZWQgaW4gZnJvbSBnZGIvbWlwc3JlYWQuYy4KLQotV2VkIEphbiAgNiAxNDowMTo0NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCwgd2UzMmsuaDogcmVtb3ZlZCBTVFlQXyogZGVmaW5lcywgc2luY2UgdGhleSBkdXBsaWNhdGVkCi0JdGhvc2UgaW4gaW50ZXJuYWwuaC4KLQotVHVlIERlYyAyOSAxNTo0MDowNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogZGVmaW5lIEkzODZBSVhNQUdJQyBmb3IgRGFuYnVyeSBBSVggUFMvMiBjb21waWxlci4KLQotU2F0IERlYyAxMiAxNjowNzo1NyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogZG9uJ3QgZGVmaW5lIEJUWVBFLCBJU1BUUiwgSVNGQ04sIElTQVJZLCBERUNSRUY6IHRoZXkKLQlhcmUgZGVmaW5lZCBpbiBpbnRlcm5hbC5oLgotCi1UaHUgTm92IDEyIDA5OjUyOjAxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiAoaW50ZXJuYWxfcmVsb2MpOiByX29mZnNldCBpcyBub3cgYSBsb25nLgotCSogejhrLmg6IHNsaWdodCBjb21tZW50IGVuaGFuY2VtZW50Ci0KLVdlZCBTZXAgMzAgMDc6NDY6MDggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IGNoYW5nZWQgejhrIHJlbG9jIHR5cGVzCi0KLUZyaSBBdWcgMjggMTA6MTY6MzEgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCSogd2UzMmsuaDogbmV3IGZpbGUKLQotVGh1IEF1ZyAyNyAxMzowMDowMSAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiBzeW1jb25zdC5oOiBjb21tZW50IG91dCBjcnVmdCBhdCB0aGUgZW5kIG9mICNlbmRpZgotCi1UdWUgQXVnIDI1IDE1OjA2OjQ5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBhZGRlZCAjZGVmaW5lIGZvciBTVFlQX0xJVCwgcmVtb3ZlZCBmcm9tIGEyOWsgYW5kCi0JaDgzMDAuCi0KLQkqIHo4ay5oOiBhZGRlZCB6ODAwMCBzdXBwb3J0Ci0KLVRodSBKdWwgMTYgMTY6MzI6MDAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IGFkZGVkIFJfUkVMTE9OR19ORUcgcmVsb2MgdHlwZQotCi1GcmkgSnVuIDEyIDIwOjExOjA0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzeW1jb25zdC5oOiAgRml4IHVudGVybWluYXRlZCBjb21tZW50LgotCi1XZWQgSnVuIDEwIDA3OjU3OjQ5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IGEub3V0IG1hZ2ljIG51bWJlcnMgZnJvbQotCW1vaHJpbmdAaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZQotCi1Nb24gSnVuICA4IDIwOjEzOjMzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBlY29mZi1leHQuaCwgbWlwcy5oOiAgVXNlIHVuc2lnbmVkIGNoYXJzIGV2ZXJ5d2hlcmUuCi0JKFN1Z2dlc3RlZCBieSBBbnR0aSBNaWV0dGluZW4uKQotCi1UdWUgQXByIDE0IDE1OjE4OjQ0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzeW0uaDogIEFkZCBjb21tZW50cy4KLQkqIHN5bWNvbnN0Lmg6ICBNZXJnZSB3aXRoIEZyZWQncyBjaGFuZ2VzLgotCi1UdWUgQXByIDE0IDE0OjMwOjA1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBzeW1jb25zdC5oOiAgUGljayB1cCBTR0kgZGVmaW5lcyBmb3Igc3RTdHJ1Y3QsIHN0VW5pb24sIHN0RW51bSwKLQlsYW5nQ3BsdXNwbHVzLCBhbmQgbGFuZ0NwbHVzcGx1c1YyLgotCi1UaHUgQXByICAyIDE5OjQ3OjQzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzeW0uaCwgc3ltY29uc3QuaDogIE1JUFMgaGFzIHByb3ZpZGVkIHJlZGlzdHJpYnV0YWJsZSB2ZXJzaW9ucwotCW9mIHRoZXNlIGZpbGVzLiAgVGhhbmtzIQotCSogZWNvZmYtZXh0Lmg6ICBBZGQgd2Vha2V4dCBiaXQgdG8gbWF0Y2ggbmV3IHN5bS5oLgotCi1GcmkgTWFyICA2IDAwOjEwOjQ2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBlY29mZi1leHQuaDogIEFkZCByZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3JzLgotCi1UaHUgRmViIDI3IDExOjUzOjA0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBlY29mZi1leHQuaDogIE5ldyBmaWxlIGZvciBleHRlcm5hbCAoaW4tZmlsZSkgZm9ybSBvZiBlY29mZgotCXN5bWJvbCBzdHJ1Y3R1cmVzLgotCi1UaHUgRmViICA2IDExOjMzOjMyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiBtYWRlIHRoZSBleHRlcm5hbF9saW5lbm8gbF9sbm5vIGZpZWxkIDQgYnl0ZXMgd2lkZS4KLQlhbmRkZWQgR0VUL1BVVF9MSU5FTk9fTE5OTyBtYWNyb3MKLQotU2F0IE5vdiAzMCAyMDozODozNSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogQ2hhbmdlTG9nLCBhMjlrLmgsIGg4MzAwLmgsIGkzODYuaCwgaTk2MC5oLCBpbnRlcm5hbC5oLCBtNjhrLmgsCi0JbTg4ay5oLCBtaXBzLmgsIHJzNjAwMC5oOiBtb3ZlIGZyb20gYWJvdmUgY29mZi08Zm9vPi5oCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9hMjlrLmggYi9pbmNsdWRlL2NvZmYvYTI5ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzNhNjQ2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9hMjlrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyogQ09GRiBzcGVjIGZvciBBTUQgMjkwKjAgCi0gICBDb250cmlidXRlZCBieSBEYXZpZCBXb29kIEAgTmV3IFlvcmsgVW5pdmVyc2l0eS4KLSAqLwotIAotI2lmbmRlZiBBTUQKLSMgZGVmaW5lIEFNRAotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotKiogRmlsZSBIZWFkZXIgYW5kIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLSovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi17Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCSAqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCSAgICovCi0JY2hhciBmX3RpbWRhdFs0XTsgICAgICAgLyogdGltZSAmIGRhdGUgc3RhbXAJICAgICovCi0JY2hhciBmX3N5bXB0cls0XTsgICAgICAgLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYiAgICAgICAqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzICAgICAqLwotCWNoYXIgZl9vcHRoZHJbMl07ICAgICAgIC8qIHNpemVvZihvcHRpb25hbCBoZHIpCSAqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZSBGSUxIRFIgIHN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lIEZJTEhTWgkyMAotCi0vKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KLQotLyoKLSoqIE1hZ2ljIG51bWJlcnMgZm9yIEFtMjkwMDAgCi0qKgkoQVQmVCB3aWxsIGFzc2lnbiB0aGUgInJlYWwiIG1hZ2ljIG51bWJlcikgIAotKi8KLQotI2RlZmluZSBTSVBGQk9NQUdJQyAgICAgMDU3MiAgICAvKiBBbTI5MDAwIChCeXRlIDAgaXMgTVNCKSAqLwotI2RlZmluZSBTSVBSQk9NQUdJQyAgICAgMDU3MyAgICAvKiBBbTI5MDAwIChCeXRlIDAgaXMgTFNCKSAqLwotCi0KLSNkZWZpbmUgQTI5S19NQUdJQ19CSUcgCQlTSVBGQk9NQUdJQwkKLSNkZWZpbmUgQTI5S19NQUdJQ19MSVRUTEUJU0lQUkJPTUFHSUMJCi0jZGVmaW5lIEEyOUtCQURNQUcoeCkgCSgoKHgpLmZfbWFnaWMhPUEyOUtfTUFHSUNfQklHKSAmJiBcCi0JCQkgICgoeCkuZl9tYWdpYyE9QTI5S19NQUdJQ19MSVRUTEUpKQotCi0jZGVmaW5lIE9NQUdJQyBBMjlLX01BR0lDX0JJRwotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBGaWxlIGhlYWRlciBmbGFncyBjdXJyZW50bHkga25vd24gdG8gdXMuCi0qKgotKiogQW0yOTAwMCB3aWxsIHVzZSB0aGUgRl9BUjMyV1IgYW5kIEZfQVIzMlcgZmxhZ3MgdG8gaW5kaWNhdGUKLSoqIHRoZSBieXRlIG9yZGVyaW5nIGluIHRoZSBmaWxlLgotKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBPcHRpb25hbCAoYS5vdXQpIGhlYWRlciAKLSovCi0KLXR5cGVkZWYJc3RydWN0IGV4dGVybmFsX2FvdXRoZHIgCi17Ci0gIGNoYXIgIG1hZ2ljWzJdOwkgICAgICAgLyogdHlwZSBvZiBmaWxlCQkJICovCi0gIGNoYXIgIHZzdGFtcFsyXTsJICAgICAgLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIgIHRzaXplWzRdOwkgICAgICAgLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIgIGRzaXplWzRdOwkgICAgICAgLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyICBic2l6ZVs0XTsJICAgICAgIC8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkgICAgICovCi0gIGNoYXIgIGVudHJ5WzRdOwkgICAgICAgLyogZW50cnkgcHQuCQkJICAgICovCi0gIGNoYXIgIHRleHRfc3RhcnRbNF07CSAgLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyICBkYXRhX3N0YXJ0WzRdOwkgIC8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0gQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLS8qIGFvdXRoZHIgbWFnaWMgbnVtYmVycyAqLwotI2RlZmluZSBOTUFHSUMJCTA0MTAJLyogc2VwYXJhdGUgaS9kIGV4ZWN1dGFibGUgKi8KLSNkZWZpbmUgU0hNQUdJQwkwNDA2CQkvKiBOWVUvVWx0cmEzIHNoYXJlZCBkYXRhIGV4ZWN1dGFibGUgCi0JCQkJICAgKHdyaXRhYmxlIHRleHQpICovCi0KLSNkZWZpbmUgX0VURVhUICAgCSJfZXRleHQiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotKiogU2VjdGlvbiBoZWFkZXIgYW5kIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLSovCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgCi17Ci0JY2hhcgkgICAgc19uYW1lWzhdOyAgICAgIC8qIHNlY3Rpb24gbmFtZQkJICovCi0JY2hhcgkgICAgc19wYWRkcls0XTsgICAgIC8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkgICAgc192YWRkcls0XTsgICAgIC8qIHZpcnR1YWwgYWRkcmVzcwkgICAgICAqLwotCWNoYXIJICAgIHNfc2l6ZVs0XTsgICAgICAvKiBzZWN0aW9uIHNpemUJCSAqLwotCWNoYXIJICAgIHNfc2NucHRyWzRdOyAgICAvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJICAgIHNfcmVscHRyWzRdOyAgICAvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uICAgICAgICovCi0JY2hhcgkgICAgc19sbm5vcHRyWzRdOyAgIC8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycyAgICAgKi8KLQljaGFyCSAgICBzX25yZWxvY1syXTsgICAgLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcyAqLwotCWNoYXIJICAgIHNfbmxubm9bMl07ICAgICAvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkgICAgc19mbGFnc1s0XTsgICAgIC8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdAlleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVCAgICIudGV4dCIKLSNkZWZpbmUgX0RBVEEgICAiLmRhdGEiCi0jZGVmaW5lIF9CU1MgICAgIi5ic3MiCi0jZGVmaW5lIF9MSVQJIi5saXQiCi0KLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogU2VjdGlvbiB0eXBlcyAtIHdpdGggYWRkaXRpb25hbCBzZWN0aW9uIHR5cGUgZm9yIGdsb2JhbCAKLSoqIHJlZ2lzdGVycyB3aGljaCB3aWxsIGJlIHJlbG9jYXRhYmxlIGZvciB0aGUgQW0yOTAwMC4KLSoqCi0qKiBJbiBpbnN0YW5jZXMgd2hlcmUgaXQgaXMgbmVjZXNzYXJ5IGZvciBhIGxpbmtlciB0byBwcm9kdWNlIGFuCi0qKiBvdXRwdXQgZmlsZSB3aGljaCBjb250YWlucyB0ZXh0IG9yIGRhdGEgbm90IGJhc2VkIGF0IHZpcnR1YWwKLSoqIGFkZHJlc3MgMCwgZS5nLiBmb3IgYSBST00sIHRoZW4gdGhlIGxpbmtlciBzaG91bGQgYWNjZXB0Ci0qKiBhZGRyZXNzIGJhc2UgaW5mb3JtYXRpb24gYXMgY29tbWFuZCBpbnB1dCBhbmQgdXNlIFBBRCBzZWN0aW9ucwotKiogdG8gc2tpcCBvdmVyIHVudXNlZCBhZGRyZXNzZXMuCi0qLwotCi0jZGVmaW5lCVNUWVBfQlNTUkVHCTB4MTIwMAkvKiBHbG9iYWwgcmVnaXN0ZXIgYXJlYSAobGlrZSBTVFlQX0lORk8pICovCi0jZGVmaW5lIFNUWVBfRU5WSVIJMHgyMjAwCS8qIEVudmlyb25tZW50IChsaWtlIFNUWVBfSU5GTykgKi8KLSNkZWZpbmUgU1RZUF9BQlMJMHg0MDAwCS8qIEFic29sdXRlIChhbGxvY2F0ZWQsIG5vdCByZWxvYywgbG9hZGVkKSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIFJlbG9jYXRpb24gaW5mb3JtYXRpb24gZGVjbGFyYXRpb24gYW5kIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLSovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsJLyogKHZpcnR1YWwpIGFkZHJlc3Mgb2YgcmVmZXJlbmNlICovCi0gIGNoYXIgcl9zeW1uZHhbNF07CS8qIGluZGV4IGludG8gc3ltYm9sIHRhYmxlICovCi0gIGNoYXIgcl90eXBlWzJdOwkvKiByZWxvY2F0aW9uIHR5cGUgKi8KLX07Ci0KLSNkZWZpbmUJUkVMT0MJCXN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZQlSRUxTWgkJMTAJCS8qIHNpemVvZiAoUkVMT0MpICovIAotCi0vKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KLQotLyoKLSoqIFJlbG9jYXRpb24gdHlwZXMgZm9yIHRoZSBBbTI5MDAwIAotKi8KLQotI2RlZmluZQlSX0FCUwkJMAkvKiByZWZlcmVuY2UgaXMgYWJzb2x1dGUgKi8KLSAKLSNkZWZpbmUJUl9JUkVMCQkwMzAJLyogaW5zdHJ1Y3Rpb24gcmVsYXRpdmUgKGptcC9jYWxsKSAqLwotI2RlZmluZQlSX0lBQlMJCTAzMQkvKiBpbnN0cnVjdGlvbiBhYnNvbHV0ZSAoam1wL2NhbGwpICovCi0jZGVmaW5lCVJfSUxPSEFMRgkwMzIJLyogaW5zdHJ1Y3Rpb24gbG93IGhhbGYgIChjb25zdCkgICovCi0jZGVmaW5lCVJfSUhJSEFMRgkwMzMJLyogaW5zdHJ1Y3Rpb24gaGlnaCBoYWxmIChjb25zdGgpIHBhcnQgMSAqLwotI2RlZmluZQlSX0lIQ09OU1QJMDM0CS8qIGluc3RydWN0aW9uIGhpZ2ggaGFsZiAoY29uc3RoKSBwYXJ0IDIgKi8KLQkJCQkvKiBjb25zdGFudCBvZmZzZXQgb2YgUl9JSElIQUxGIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUJUl9CWVRFCQkwMzUJLyogcmVsb2NhdGFibGUgYnl0ZSB2YWx1ZSAqLwotI2RlZmluZSBSX0hXT1JECQkwMzYJLyogcmVsb2NhdGFibGUgaGFsZndvcmQgdmFsdWUgKi8KLSNkZWZpbmUgUl9XT1JECQkwMzcJLyogcmVsb2NhdGFibGUgd29yZCB2YWx1ZSAqLwotCi0jZGVmaW5lCVJfSUdMQkxSQwkwNDAJLyogaW5zdHJ1Y3Rpb24gZ2xvYmFsIHJlZ2lzdGVyIFJDICovCi0jZGVmaW5lCVJfSUdMQkxSQQkwNDEJLyogaW5zdHJ1Y3Rpb24gZ2xvYmFsIHJlZ2lzdGVyIFJBICovCi0jZGVmaW5lCVJfSUdMQkxSQgkwNDIJLyogaW5zdHJ1Y3Rpb24gZ2xvYmFsIHJlZ2lzdGVyIFJCICovCi0gCi0vKgotTk9URToKLUFsbCB0aGUgIkkiIGZvcm1zIHJlZmVyIHRvIDI5MDAwIGluc3RydWN0aW9uIGZvcm1hdHMuICBUaGUgbGlua2VyIGlzIAotZXhwZWN0ZWQgdG8ga25vdyBob3cgdGhlIG51bWVyaWMgaW5mb3JtYXRpb24gaXMgc3BsaXQgYW5kL29yIGFsaWduZWQKLXdpdGhpbiB0aGUgaW5zdHJ1Y3Rpb24gd29yZChzKS4gIFJfQllURSB3b3JrcyBmb3IgaW5zdHJ1Y3Rpb25zLCB0b28uCi0KLUlmIHRoZSBwYXJhbWV0ZXIgdG8gYSBDT05TVEggaW5zdHJ1Y3Rpb24gaXMgYSByZWxvY2F0YWJsZSB0eXBlLCB0d28gCi1yZWxvY2F0aW9uIHJlY29yZHMgYXJlIHdyaXR0ZW4uICBUaGUgZmlyc3QgaGFzIGFuIHJfdHlwZSBvZiBSX0lISUhBTEYgCi0oMzMgb2N0YWwpIGFuZCBhIG5vcm1hbCByX3ZhZGRyIGFuZCByX3N5bW5keC4gIFRoZSBzZWNvbmQgcmVsb2NhdGlvbiAKLXJlY29yZCBoYXMgYW4gcl90eXBlIG9mIFJfSUhDT05TVCAoMzQgb2N0YWwpLCBhIG5vcm1hbCByX3ZhZGRyICh3aGljaCAKLWlzIHJlZHVuZGFudCksIGFuZCBhbiByX3N5bW5keCBjb250YWluaW5nIHRoZSAzMi1iaXQgY29uc3RhbnQgb2Zmc2V0IAotdG8gdGhlIHJlbG9jYXRpb24gaW5zdGVhZCBvZiB0aGUgYWN0dWFsIHN5bWJvbCB0YWJsZSBpbmRleC4gIFRoaXMgCi1zZWNvbmQgcmVjb3JkIGlzIGFsd2F5cyB3cml0dGVuLCBldmVuIGlmIHRoZSBjb25zdGFudCBvZmZzZXQgaXMgemVyby4KLVRoZSBjb25zdGFudCBmaWVsZHMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSBzZXQgdG8gemVyby4KLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotKiogTGluZSBudW1iZXIgZW50cnkgZGVjbGFyYXRpb24gYW5kIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLSovCi0KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gCi17Ci0gICB1bmlvbiB7Ci0JIGNoYXIgbF9zeW1uZHhbNF07IC8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCSBjaGFyIGxfcGFkZHJbNF07ICAvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIgICAgKi8KLSAgIH0gbF9hZGRyOwotICAgY2hhciBsX2xubm9bMl07IAkvKiBsaW5lIG51bWJlcgkgICovCi19OwotCi0jZGVmaW5lCUxJTkVOTwkJc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJCTYJCS8qIHNpemVvZiAoTElORU5PKSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIFN5bWJvbCBlbnRyeSBkZWNsYXJhdGlvbiBhbmQgcmVsYXRlZCBkZWZpbml0aW9ucwotKi8KLQotI2RlZmluZQlFX1NZTU5NTEVOCTgJLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaIAkxOAotCi0vKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KLQotLyoKLSoqIFN0b3JhZ2UgY2xhc3MgZGVmaW5pdGlvbnMgLSBuZXcgY2xhc3NlcyBmb3IgZ2xvYmFsIHJlZ2lzdGVycy4KLSovCi0KLSNkZWZpbmUgQ19HTEJMUkVHCTE5CQkvKiBnbG9iYWwgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQ19FWFRSRUcJMjAJCS8qIGV4dGVybmFsIGdsb2JhbCByZWdpc3RlciAqLwotI2RlZmluZQlDX0RFRlJFRwkyMQkJLyogZXh0LiBkZWYuIG9mIGdsb2JhbCByZWdpc3RlciAqLwotCi0KLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogRGVyaXZlZCBzeW1ib2wgbWFzay9zaGlmdHMuCi0qLwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotKiogQXV4aWxpYXJ5IHN5bWJvbCB0YWJsZSBlbnRyeSBkZWNsYXJhdGlvbiBhbmQgcmVsYXRlZCAKLSoqIGRlZmluaXRpb25zLgotKi8KLQotI2RlZmluZSBFX0ZJTE5NTEVOCTE0ICAgICAgLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCSAgKi8KLSNkZWZpbmUgRV9ESU1OVU0gIAk0ICAgICAgIC8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOyAgICAgICAvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07ICAvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07ICAgLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkgICAgICAgLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsgICAgICAgLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsgICAgICAgLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsgICAgICAgLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOyAgICAgLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CSAvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi19OwotCi0jZGVmaW5lCUFVWEVOVAkJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkJMTgJCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYWxwaGEuaCBiL2luY2x1ZGUvY29mZi9hbHBoYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzZjYmNiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9hbHBoYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qIEVDT0ZGIHN1cHBvcnQgb24gQWxwaGEgbWFjaGluZXMuCi0gICBjb2ZmL2Vjb2ZmLmggbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgdGhpcyBmaWxlLiAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotICB1bnNpZ25lZCBjaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgdW5zaWduZWQgY2hhciBmX3N5bXB0cls4XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotICB1bnNpZ25lZCBjaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICB1bnNpZ25lZCBjaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgdW5zaWduZWQgY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKiBNYWdpYyBudW1iZXJzIGFyZSBkZWZpbmVkIGluIGNvZmYvZWNvZmYuaC4gICovCi0jZGVmaW5lIEFMUEhBX0VDT0ZGX0JBRE1BRyh4KSBcCi0gICgoeCkuZl9tYWdpYyAhPSBBTFBIQV9NQUdJQyAmJiAoeCkuZl9tYWdpYyAhPSBBTFBIQV9NQUdJQ19CU0QpCi0KLS8qIFRoZSBvYmplY3QgdHlwZSBpcyBlbmNvZGVkIGluIHRoZSBmX2ZsYWdzLiAgKi8KLSNkZWZpbmUgRl9BTFBIQV9PQkpFQ1RfVFlQRV9NQVNLCTB4MzAwMAotI2RlZmluZSBGX0FMUEhBX05PX1NIQVJFRAkJMHgxMDAwCi0jZGVmaW5lIEZfQUxQSEFfU0hBUkFCTEUJCTB4MjAwMAotI2RlZmluZSBGX0FMUEhBX0NBTExfU0hBUkVECQkweDMwMDAKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTI0Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCBleHRlcm5hbF9hb3V0aGRyCi17Ci0gIHVuc2lnbmVkIGNoYXIgbWFnaWNbMl07CS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICB1bnNpZ25lZCBjaGFyCXZzdGFtcFsyXTsJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIHVuc2lnbmVkIGNoYXIgYmxkcmV2WzJdOwkvKiA/PyAqLwotICB1bnNpZ25lZCBjaGFyIHBhZGRpbmdbMl07CS8qIHBhZCB0byBxdWFkd29yZCBib3VuZGFyeQkJKi8KLSAgdW5zaWduZWQgY2hhcgl0c2l6ZVs4XTsJLyogdGV4dCBzaXplIGluIGJ5dGVzCQkJKi8KLSAgdW5zaWduZWQgY2hhcglkc2l6ZVs4XTsJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICB1bnNpZ25lZCBjaGFyCWJzaXplWzhdOwkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIHVuc2lnbmVkIGNoYXIJZW50cnlbOF07CS8qIGVudHJ5IHB0LgkJCQkqLwotICB1bnNpZ25lZCBjaGFyIHRleHRfc3RhcnRbOF07CS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhciBkYXRhX3N0YXJ0WzhdOwkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgYnNzX3N0YXJ0WzhdOwkvKiBiYXNlIG9mIGJzcyB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhciBncHJtYXNrWzRdOwkvKiBiaXRtYXNrIG9mIGdlbmVyYWwgcmVnaXN0ZXJzIHVzZWQgKi8KLSAgdW5zaWduZWQgY2hhciBmcHJtYXNrWzRdOwkvKiBiaXRtYXNrIG9mIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyB1c2VkICovCi0gIHVuc2lnbmVkIGNoYXIgZ3BfdmFsdWVbOF07CS8qIHZhbHVlIGZvciBncCByZWdpc3RlciAqLwotfSBBT1VUSERSOwotCi0vKiBjb21wdXRlIHNpemUgb2YgYSBoZWFkZXIgKi8KLQotI2RlZmluZSBBT1VUU1ogODAKLSNkZWZpbmUgQU9VVEhEUlNaIDgwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotICB1bnNpZ25lZCBjaGFyCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLSAgdW5zaWduZWQgY2hhcglzX3BhZGRyWzhdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotICB1bnNpZ25lZCBjaGFyCXNfdmFkZHJbOF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLSAgdW5zaWduZWQgY2hhcglzX3NpemVbOF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19zY25wdHJbOF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc19yZWxwdHJbOF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLSAgdW5zaWduZWQgY2hhcglzX2xubm9wdHJbOF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotICB1bnNpZ25lZCBjaGFyCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0gIHVuc2lnbmVkIGNoYXIJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotICB1bnNpZ25lZCBjaGFyCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTY0Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICB1bnNpZ25lZCBjaGFyIHJfdmFkZHJbOF07Ci0gIHVuc2lnbmVkIGNoYXIgcl9zeW1uZHhbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzRdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQotLyogQ29uc3RhbnRzIHRvIHVucGFjayB0aGUgcl9iaXRzIGZpZWxkLiAgVGhlIEFscGhhIHNlZW1zIHRvIGFsd2F5cyBiZQotICAgbGl0dGxlIGVuZGlhbiwgc28gSSBoYXZlbid0IGJvdGhlcmVkIHRvIGRlZmluZSBiaWcgZW5kaWFuIHZhcmlhbnRzCi0gICBvZiB0aGVzZS4gICovCi0KLSNkZWZpbmUgUkVMT0NfQklUUzBfVFlQRV9MSVRUTEUJCQkweGZmCi0jZGVmaW5lIFJFTE9DX0JJVFMwX1RZUEVfU0hfTElUVExFCQkwCi0KLSNkZWZpbmUgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRQkJMHgwMQotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUJCTB4N2UKLSNkZWZpbmUgUkVMT0NfQklUUzFfT0ZGU0VUX1NIX0xJVFRMRQkJMQotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX1JFU0VSVkVEX0xJVFRMRQkJMHg4MAotI2RlZmluZSBSRUxPQ19CSVRTMV9SRVNFUlZFRF9TSF9MSVRUTEUJCTcKLSNkZWZpbmUgUkVMT0NfQklUUzJfUkVTRVJWRURfTElUVExFCQkweGZmCi0jZGVmaW5lIFJFTE9DX0JJVFMyX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFCTEKLSNkZWZpbmUgUkVMT0NfQklUUzNfUkVTRVJWRURfTElUVExFCQkweDAzCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFCTkKLQotI2RlZmluZSBSRUxPQ19CSVRTM19TSVpFX0xJVFRMRQkJCTB4ZmMKLSNkZWZpbmUgUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUJCTIKLQotLyogVGhlIHJfdHlwZSBmaWVsZCBpbiBhIHJlbG9jIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gICovCi0jZGVmaW5lIEFMUEhBX1JfSUdOT1JFCQkwCi0jZGVmaW5lIEFMUEhBX1JfUkVGTE9ORwkJMQotI2RlZmluZSBBTFBIQV9SX1JFRlFVQUQJCTIKLSNkZWZpbmUgQUxQSEFfUl9HUFJFTDMyCQkzCi0jZGVmaW5lIEFMUEhBX1JfTElURVJBTAkJNAotI2RlZmluZSBBTFBIQV9SX0xJVFVTRQkJNQotI2RlZmluZSBBTFBIQV9SX0dQRElTUAkJNgotI2RlZmluZSBBTFBIQV9SX0JSQUREUgkJNwotI2RlZmluZSBBTFBIQV9SX0hJTlQJCTgKLSNkZWZpbmUgQUxQSEFfUl9TUkVMMTYJCTkKLSNkZWZpbmUgQUxQSEFfUl9TUkVMMzIJICAgICAgIDEwCi0jZGVmaW5lIEFMUEhBX1JfU1JFTDY0CSAgICAgICAxMQotI2RlZmluZSBBTFBIQV9SX09QX1BVU0gJICAgICAgIDEyCi0jZGVmaW5lIEFMUEhBX1JfT1BfU1RPUkUgICAgICAgMTMKLSNkZWZpbmUgQUxQSEFfUl9PUF9QU1VCCSAgICAgICAxNAotI2RlZmluZSBBTFBIQV9SX09QX1BSU0hJRlQgICAgIDE1Ci0jZGVmaW5lIEFMUEhBX1JfR1BWQUxVRQkgICAgICAgMTYKLSNkZWZpbmUgQUxQSEFfUl9HUFJFTEhJR0ggICAgICAxNwotI2RlZmluZSBBTFBIQV9SX0dQUkVMTE9XICAgICAgIDE4Ci0jZGVmaW5lIEFMUEhBX1JfSU1NRUQgICAgICAgICAgMTkKLQotLyogT3ZlcmxvYWRlZCByZWxvYyB2YWx1ZSB1c2VkIGJ5IE5ldC0gYW5kIE9wZW5CU0QuICAqLwotI2RlZmluZSBBTFBIQV9SX0xJVEVSQUxTTEVBWlkgIDE3Ci0KLS8qIFdpdGggQUxQSEFfUl9MSVRVU0UsIHRoZSByX3NpemUgZmllbGQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9MVV9CQVNFICAgICAgICAgMQotI2RlZmluZSBBTFBIQV9SX0xVX0JZVE9GRiAgICAgICAyCi0jZGVmaW5lIEFMUEhBX1JfTFVfSlNSICAgICAgICAgIDMKLQotLyogV2l0aCBBTFBIQV9SX0lNTUVELCB0aGUgcl9zaXplIGZpZWxkIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gICovCi0jZGVmaW5lIEFMUEhBX1JfSU1NRURfR1BfMTYgICAgIDEKLSNkZWZpbmUgQUxQSEFfUl9JTU1FRF9HUF9ISTMyICAgMgotI2RlZmluZSBBTFBIQV9SX0lNTUVEX1NDTl9ISTMyICAzCi0jZGVmaW5lIEFMUEhBX1JfSU1NRURfQlJfSEkzMiAgIDQKLSNkZWZpbmUgQUxQSEFfUl9JTU1FRF9MTzMyICAgICAgNQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xJQyBJTkZPUk1BVElPTiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBXcml0dGVuIGJ5IEpvaG4gR2lsbW9yZS4gICovCi0KLS8qIEVDT0ZGIHVzZXMgQ09GRi1saWtlIHNlY3Rpb24gc3RydWN0dXJlcywgYnV0IGl0cyBvd24gc3ltYm9sIGZvcm1hdC4KLSAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzeW1ib2wgZm9ybWF0IGluIGZpZWxkcyB3aG9zZSBzaXplIGFuZCBhbGlnbm1lbnQKLSAgIHdpbGwgbm90IHZhcnkgb24gZGlmZmVyZW50IGhvc3Qgc3lzdGVtcy4gICovCi0KLS8qIEZpbGUgaGVhZGVyIGFzIGEgc2V0IG9mIGJ5dGVzICovCi0KLXN0cnVjdCBoZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyIAloX21hZ2ljWzJdOwotCXVuc2lnbmVkIGNoYXIJaF92c3RhbXBbMl07Ci0JdW5zaWduZWQgY2hhcgloX2lsaW5lTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pZG5NYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lwZE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXN5bU1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaW9wdE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWF1eE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXNzTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3NFeHRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lmZE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY3JmZFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWV4dE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JMaW5lWzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkxpbmVPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiRG5PZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiUGRPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiU3ltT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYk9wdE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JBdXhPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiU3NPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiU3NFeHRPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiRmRPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiUmZkT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkV4dE9mZnNldFs4XTsKLX07Ci0KLS8qIEZpbGUgZGVzY3JpcHRvciBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGZkcl9leHQgewotCXVuc2lnbmVkIGNoYXIJZl9hZHJbOF07Ci0JdW5zaWduZWQgY2hhcglmX2NiTGluZU9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JMaW5lWzhdOwotCXVuc2lnbmVkIGNoYXIJZl9jYlNzWzhdOwotCXVuc2lnbmVkIGNoYXIJZl9yc3NbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lzc0Jhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lzeW1CYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jc3ltWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pbGluZUJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NsaW5lWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pb3B0QmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY29wdFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXBkRmlyc3RbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NwZFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaWF1eEJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NhdXhbNF07Ci0JdW5zaWduZWQgY2hhcglmX3JmZEJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NyZmRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJZl9iaXRzMlszXTsKLQl1bnNpZ25lZCBjaGFyCWZfcGFkZGluZ1s0XTsKLX07Ci0KLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfQklHCQkweEY4Ci0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX1NIX0JJRwkJMwotI2RlZmluZQlGRFJfQklUUzFfTEFOR19MSVRUTEUJCTB4MUYKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfU0hfTElUVExFCTAKLQotI2RlZmluZQlGRFJfQklUUzFfRk1FUkdFX0JJRwkJMHgwNAotI2RlZmluZQlGRFJfQklUUzFfRk1FUkdFX0xJVFRMRQkJMHgyMAotCi0jZGVmaW5lCUZEUl9CSVRTMV9GUkVBRElOX0JJRwkJMHgwMgotI2RlZmluZQlGRFJfQklUUzFfRlJFQURJTl9MSVRUTEUJMHg0MAotCi0jZGVmaW5lCUZEUl9CSVRTMV9GQklHRU5ESUFOX0JJRwkweDAxCi0jZGVmaW5lCUZEUl9CSVRTMV9GQklHRU5ESUFOX0xJVFRMRQkweDgwCi0KLSNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9CSUcJCTB4QzAKLSNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9TSF9CSUcJCTYKLSNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9MSVRUTEUJCTB4MDMKLSNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9TSF9MSVRUTEUJMAotCi0vKiBXZSBpZ25vcmUgdGhlIGByZXNlcnZlZCcgZmllbGQgaW4gYml0czIuICovCi0KLS8qIFByb2NlZHVyZSBkZXNjcmlwdG9yIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgcGRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglwX2Fkcls4XTsKLQl1bnNpZ25lZCBjaGFyCXBfY2JMaW5lT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJcF9pc3ltWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9pbGluZVs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfcmVnbWFza1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfcmVnb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9pb3B0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmVnbWFza1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJlZ29mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJhbWVvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2xuTG93WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9sbkhpZ2hbNF07Ci0JdW5zaWduZWQgY2hhcglwX2dwX3Byb2xvZ3VlWzFdOwotCXVuc2lnbmVkIGNoYXIJcF9iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCXBfYml0czJbMV07Ci0JdW5zaWduZWQgY2hhcglwX2xvY2Fsb2ZmWzFdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZXJlZ1syXTsKLQl1bnNpZ25lZCBjaGFyCXBfcGNyZWdbMl07Ci19OwotCi0jZGVmaW5lIFBEUl9CSVRTMV9HUF9VU0VEX0JJRwkJMHg4MAotI2RlZmluZSBQRFJfQklUUzFfUkVHX0ZSQU1FX0JJRwkJMHg0MAotI2RlZmluZSBQRFJfQklUUzFfUFJPRl9CSUcJCTB4MjAKLSNkZWZpbmUgUERSX0JJVFMxX1JFU0VSVkVEX0JJRwkJMHgxZgotI2RlZmluZSBQRFJfQklUUzFfUkVTRVJWRURfU0hfTEVGVF9CSUcJOAotI2RlZmluZSBQRFJfQklUUzJfUkVTRVJWRURfQklHCQkweGZmCi0jZGVmaW5lIFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9CSUcJMAotCi0jZGVmaW5lIFBEUl9CSVRTMV9HUF9VU0VEX0xJVFRMRQkweDAxCi0jZGVmaW5lIFBEUl9CSVRTMV9SRUdfRlJBTUVfTElUVExFCTB4MDIKLSNkZWZpbmUgUERSX0JJVFMxX1BST0ZfTElUVExFCQkweDA0Ci0jZGVmaW5lIFBEUl9CSVRTMV9SRVNFUlZFRF9MSVRUTEUJMHhmOAotI2RlZmluZSBQRFJfQklUUzFfUkVTRVJWRURfU0hfTElUVExFCTMKLSNkZWZpbmUgUERSX0JJVFMyX1JFU0VSVkVEX0xJVFRMRQkweGZmCi0jZGVmaW5lIFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRSA1Ci0KLS8qIExpbmUgbnVtYmVycyAqLwotCi1zdHJ1Y3QgbGluZV9leHQgewotCXVuc2lnbmVkIGNoYXIJbF9saW5lWzRdOwotfTsKLQotLyogU3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3Qgc3ltX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglzX3ZhbHVlWzhdOwotCXVuc2lnbmVkIGNoYXIJc19pc3NbNF07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzMlsxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czNbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHM0WzFdOwotfTsKLQotI2RlZmluZQlTWU1fQklUUzFfU1RfQklHCQkweEZDCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9TSF9CSUcJCTIKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX0xJVFRMRQkJMHgzRgotI2RlZmluZQlTWU1fQklUUzFfU1RfU0hfTElUVExFCQkwCi0KLSNkZWZpbmUJU1lNX0JJVFMxX1NDX0JJRwkJMHgwMwotI2RlZmluZQlTWU1fQklUUzFfU0NfU0hfTEVGVF9CSUcJMwotI2RlZmluZQlTWU1fQklUUzFfU0NfTElUVExFCQkweEMwCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19TSF9MSVRUTEUJCTYKLQotI2RlZmluZQlTWU1fQklUUzJfU0NfQklHCQkweEUwCi0jZGVmaW5lCVNZTV9CSVRTMl9TQ19TSF9CSUcJCTUKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX0xJVFRMRQkJMHgwNwotI2RlZmluZQlTWU1fQklUUzJfU0NfU0hfTEVGVF9MSVRUTEUJMgotCi0jZGVmaW5lCVNZTV9CSVRTMl9SRVNFUlZFRF9CSUcJCTB4MTAKLSNkZWZpbmUJU1lNX0JJVFMyX1JFU0VSVkVEX0xJVFRMRQkweDA4Ci0KLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX0JJRwkJMHgwRgotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcJMTYKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX0xJVFRMRQkJMHhGMAotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfU0hfTElUVExFCTQKLQotI2RlZmluZQlTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9CSUcJOAotI2RlZmluZQlTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUJNAotCi0jZGVmaW5lCVNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0JJRwkwCi0jZGVmaW5lCVNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0xJVFRMRQkxMgotCi0vKiBFeHRlcm5hbCBzeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBleHRfZXh0IHsKLQlzdHJ1Y3QJc3ltX2V4dCBlc19hc3ltOwotCXVuc2lnbmVkIGNoYXIJZXNfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcgllc19iaXRzMlszXTsKLQl1bnNpZ25lZCBjaGFyCWVzX2lmZFs0XTsKLX07Ci0KLSNkZWZpbmUJRVhUX0JJVFMxX0pNUFRCTF9CSUcJCTB4ODAKLSNkZWZpbmUJRVhUX0JJVFMxX0pNUFRCTF9MSVRUTEUJCTB4MDEKLQotI2RlZmluZQlFWFRfQklUUzFfQ09CT0xfTUFJTl9CSUcJMHg0MAotI2RlZmluZQlFWFRfQklUUzFfQ09CT0xfTUFJTl9MSVRUTEUJMHgwMgotCi0jZGVmaW5lCUVYVF9CSVRTMV9XRUFLRVhUX0JJRwkJMHgyMAotI2RlZmluZQlFWFRfQklUUzFfV0VBS0VYVF9MSVRUTEUJMHgwNAotCi0vKiBEZW5zZSBudW1iZXJzIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZG5yX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglkX3JmZFs0XTsKLQl1bnNpZ25lZCBjaGFyCWRfaW5kZXhbNF07Ci19OwotCi0vKiBSZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3IgKi8KLQotc3RydWN0IHJmZF9leHQgewotICB1bnNpZ25lZCBjaGFyCXJmZFs0XTsKLX07Ci0KLS8qIE9wdGltaXplciBzeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBvcHRfZXh0IHsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMxWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czJbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzM1sxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHM0WzFdOwotICBzdHJ1Y3Qgcm5keF9leHQgb19ybmR4OwotICB1bnNpZ25lZCBjaGFyIG9fb2Zmc2V0WzRdOwotfTsKLQotI2RlZmluZSBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUcJMTYKLSNkZWZpbmUgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFCTAKLQotI2RlZmluZSBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9CSUcJOAotI2RlZmluZSBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9MSVRUTEUJOAotCi0jZGVmaW5lIE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0JJRwkwCi0jZGVmaW5lIE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0xJVFRMRQkxNgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2Fwb2xsby5oIGIvaW5jbHVkZS9jb2ZmL2Fwb2xsby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTM0N2YxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9hcG9sbG8uaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEFwb2xsbyBNNjhLICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLS8qIE1vdG9yb2xhIDY4MDAwLzY4MDA4LzY4MDEwLzY4MDIwICovCi0jZGVmaW5lCU1DNjhNQUdJQwkwNTIwCi0jZGVmaW5lIE1DNjhLV1JNQUdJQwkwNTIwCS8qIHdyaXRlYWJsZSB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lCU1DNjhUVk1BR0lDCTA1MjEKLSNkZWZpbmUgTUM2OEtST01BR0lDCTA1MjEJLyogcmVhZG9ubHkgc2hhcmVhYmxlIHRleHQgc2VnbWVudHMgKi8KLSNkZWZpbmUgTUM2OEtQR01BR0lDCTA1MjIJLyogZGVtYW5kIHBhZ2VkIHRleHQgc2VnbWVudHMgKi8KLSNkZWZpbmUJTTY4TUFHSUMJMDIxMAotI2RlZmluZQlNNjhUVk1BR0lDCTAyMTEKLQotLyogQXBvbGxvIDY4MDAwLWJhc2VkIG1hY2hpbmVzIGhhdmUgYSBkaWZmZXJlbnQgbWFnaWMgbnVtYmVyLiBUaGlzIGNvbWVzCi0gKiBmcm9tIC91c3IvaW5jbHVkZS9hcG9sbG8vZmlsZWhkci5oCi0gKi8KLSNkZWZpbmUgQVBPTExPTTY4S01BR0lDIDA2MjcKLQotI2RlZmluZSBPTUFHSUMgTTY4TUFHSUMKLSNkZWZpbmUgTTY4S0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1NQzY4TUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OEtXUk1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU1DNjhUVk1BR0lDKSAmJiBcCi0gICgoeCkuZl9tYWdpYyE9TUM2OEtST01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU1DNjhLUEdNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NNjhNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NNjhUVk1BR0lDKSAgJiYgXAotICAoKHgpLmZfbWFnaWMhPUFQT0xMT002OEtNQUdJQykgKQotCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyCW9fc3JpWzRdOwkJLyogQXBvbGxvIHNwZWNpZmljIC0gLnNyaSBkYXRhIHBvaW50ZXIgKi8KLSAgY2hhciAgb19pbmxpYls0XTsJCS8qIEFwb2xsbyBzcGVjaWZpYyAtIC5pbmxpYiBkYXRhIHBvaW50ZXIgKi8KLSAgY2hhcgl2aWRbOF07CQkJLyogQXBvbGxvIHNwZWNpZmljIC0gNjQgYml0IHZlcnNpb24gSUQgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUJQVBPTExPX0NPRkZfVkVSU0lPTl9OVU1CRVIgMSAvKiB0aGUgdmFsdWUgb2YgdGhlIGFvdXRoZHIgbWFnaWMgKi8KLSNkZWZpbmUJQU9VVEhEUlNaIDQ0Ci0jZGVmaW5lIEFPVVRTWiA0NAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JLyogQXBvbGxvIGFsbG93IGZvciBsYXJnZXIgc2VjdGlvbiBuYW1lcyBieSAgYWxsb3dpbmcgaXQgdG8gYmUgaW4KLQkgKiB0aGUgc3RyaW5nIHRhYmxlLgotCSAqLwotCWNoYXIJCXNfbmFtZVs4XTsKLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qIElmIHNfemVvcmVzIGlzIGFsbCB6ZXJvZXMsIHNfb2Zmc2V0IGdpdmVzIHRoZSByZWFsIGxvY2F0aW9uIG9mIHRoZSBuYW1lCi0gKiBpbiB0aGUgc3RyaW5nIHRhYmxlLgotICovCi0KLSNkZWZpbmUJc196ZXJvZXMgc2VjdGlvbl9uYW1lLnNfbmFtZQotI2RlZmluZQlzX29mZnNldCAoc2VjdGlvbl9uYW1lLnNfbmFtZSs0KQotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9UVgkiLnR2IgotI2RlZmluZSBfSU5JVAkiLmluaXQiCi0jZGVmaW5lIF9GSU5JCSIuZmluaSIKLSNkZWZpbmUJX0xJTkVTCSIubGluZXMiCi0jZGVmaW5lCV9CTE9DS1MJIi5ibG9ja3MiCi0jZGVmaW5lIF9TUkkgICAgIi5zcmkiICAgICAgICAgICAgICAgICAgLyogU3RhdGljIFJlc291cmNlIEluZm9ybWF0aW9uIChzeXN0eXBlLAotIGV0IGFsLikgKi8KLSNkZWZpbmUgX01JUiAgICAiLm1pciIgICAgICAgICAgICAgICAgICAvKiBNb2R1bGUgSW5mb3JtYXRpb24gUmVjb3JkcyAgKi8KLSNkZWZpbmUgX0FQVFYgICAiLmFwdHYiICAgICAgICAgICAgICAgICAvKiBBcG9sbG8tc3R5bGUgdHJhbnNmZXIgdmVjdG9ycy4gKi8KLSNkZWZpbmUgX0lOTElCICAiLmlubGliIiAgICAgICAgICAgICAgICAvKiBTaGFyZWQgTGlicmFyeSBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBfUldESSAgICIucndkaSIgICAgICAgICAvKiBSZWFkL3dyaXRlIGRhdGEgaW5pdGlhbGl6YXRpb24gZGlyZWN0aXZlcyBmb3IKLSBjb21wcmVzc2VkIHNlY3Rpb25zICovCi0jZGVmaW5lIF9VTldJTkQgIi51bndpbmQiICAgICAgICAgICAgICAgLyogU3RhY2sgdW53aW5kIGluZm9ybWF0aW9uICovCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0jaWZkZWYgTTY4S19DT0ZGX09GRlNFVAotICBjaGFyIHJfb2Zmc2V0WzRdOwotI2VuZGlmCi0KLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLQotI2lmZGVmIE02OEtfQ09GRl9PRkZTRVQKLSNkZWZpbmUgUkVMU1ogMTQKLSNlbHNlCi0jZGVmaW5lIFJFTFNaIDEwCi0jZW5kaWYKLQotLyogQXBvbGxvIHNwZWNpZmljIFNUWVAgZmxhZ3MgKi8KLQotI2RlZmluZSBTVFlQX1JFTE9DQVRFRF9OT1RfTE9BREVEIDB4MDAwMTAwMDAJLyogU2VjdGlvbiBpcyByZWxvY2F0ZWQgbm9ybWFsbHkgZHVyaW5nIGxpbmtpbmcsIGJ1dCBuZWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICBub3QgYmUgbG9hZGVkIGR1cmluZyBwcm9ncmFtIGV4ZWN1dGlvbiAqLwotI2RlZmluZSBTVFlQX0RFQlVHICAgICAgICAgICAgICAweDAwMDIwMDAwCS8qIGRlYnVnIHNlY3Rpb24gKi8KLSNkZWZpbmUgU1RZUF9PVkVSTEFZCQkweDAwMDQwMDAwCS8qIFNlY3Rpb24gaXMgb3ZlcmxheWVkICovCi0jZGVmaW5lIFNUWVBfSU5TVFJVQ1RJT04gICAgCTB4MDAyMDAwMDAJLyogU2VjdGlvbiBjb250YWlucyBleGVjdXRhYmxlIGNvZGUgKi8KLQotI2RlZmluZSBTVFlQX1pFUk8JCTB4MDA4MDAwMDAJLyogU2VjdGlvbiBpcyBpbml0aWFsaXplZCB0byB6ZXJvICovCi0jZGVmaW5lIFNUWVBfSU5TVEFMTEVECQkweDAyMDAwMDAwCS8qIFNlY3Rpb24gc2hvdWxkIGJlIGluc3RhbGxhYmxlIGluIEtHVCAqLwotI2RlZmluZSBTVFlQX0xPT0tfSU5TVEFMTEVECTB4MDQwMDAwMDAJLyogTG9vayBmb3Igc2VjdGlvbiBpbiBLR1QgKi8KLSNkZWZpbmUgU1RZUF9TRUNBTElHTjEJCTB4MDgwMDAwMDAJLyogU3BlY2lhbGx5IGFsaWduZWQgc2VjdGlvbiAqLwotI2RlZmluZSBTVFlQX1NFQ0FMSUdOMgkJMHgxMDAwMDAwMAkvKiAgICAgICIgICAgICAgIiAgICAgICAiICAgICovCi0jZGVmaW5lIFNUWVBfQ09NUFJFU1NFRAkJMHgyMDAwMDAwMAkvKiBObyBzZWN0aW9uIGRhdGEgcGVyIHNlIChzX3NjbnB0ciA9IDApLCBidXQgdGhlcmUgYXJlCi0JCQkJCQkgICBpbml0aWFsaXphdGlvbiBkaXJlY3RpdmVzIGZvciBpdCBpbiAucndkaSBzZWN0aW9uCi0JCQkJCQkgICAodXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNUWVBfQlNTKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2FybS5oIGIvaW5jbHVkZS9jb2ZmL2FybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTE2M2Y4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKiBBUk0gQ09GRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBDT0ZGQVJNIDEKLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLXsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqICAgICAgRl9JTlRFUldPUksgICAgIGZpbGUgc3VwcG9ydHMgc3dpdGNoaW5nIGJldHdlZW4gQVJNIGFuZCBUaHVtYiBpbnN0cnVjdGlvbiBzZXRzCi0gKiAgICAgIEZfSU5URVJXT1JLX1NFVCB0aGUgRl9JTlRFUldPUksgYml0IGlzIHZhbGlkCi0gKglGX0FQQ1NfRkxPQVQJY29kZSBwYXNzZXMgZmxvYXQgYXJndW1lbnRzIGluIGZsb2F0IHJlZ2lzdGVycwotICoJRl9QSUMJCWNvZGUgaXMgcmVlbnRyYW50L3Bvc2l0aW9uLWluZGVwZW5kZW50Ci0gKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKLSAqCUZfQVBDU18yNglmaWxlIHVzZXMgMjYgYml0IEFSTSBQcm9jZWR1cmUgQ2FsbGluZyBTdGFuZGFyZAotICoJRl9BUENTX1NFVAl0aGUgRl9BUENTXzI2LCBGX0FQQ1NfRkxPQVQgYW5kIEZfUElDIGJpdHMgaGF2ZSBiZWVuIGluaXRpYWxpc2VkCi0gKglGX1NPRlRfRkxPQVQJY29kZSBkb2VzIG5vdCB1c2UgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zCi0gKi8KLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKLSNkZWZpbmUgRl9JTlRFUldPUksJKDB4MDAxMCkKLSNkZWZpbmUgRl9JTlRFUldPUktfU0VUCSgweDAwMjApCi0jZGVmaW5lIEZfQVBDU19GTE9BVAkoMHgwMDQwKQotI3VuZGVmICBGX0FSMTZXUgotI2RlZmluZSBGX1BJQwkJKDB4MDA4MCkKLSNkZWZpbmUJRl9BUjMyV1IJKDB4MDEwMCkKLSNkZWZpbmUgRl9BUENTXzI2CSgweDA0MDApCi0jZGVmaW5lIEZfQVBDU19TRVQJKDB4MDgwMCkKLSNkZWZpbmUgRl9TT0ZUX0ZMT0FUCSgweDIwMDApCi0KLS8qIEJpdHMgc3RvcmVkIGluIGZsYWdzIGZpZWxkIG9mIHRoZSBpbnRlcm5hbF9mIHN0cnVjdHVyZSAqLwotCi0jZGVmaW5lIEZfSU5URVJXT1JLCSgweDAwMTApCi0jZGVmaW5lIEZfQVBDU19GTE9BVAkoMHgwMDQwKQotI2RlZmluZSBGX1BJQwkJKDB4MDA4MCkKLSNkZWZpbmUgRl9BUENTMjYJKDB4MTAwMCkKLSNkZWZpbmUgRl9BUk1fQVJDSElURUNUVVJFX01BU0sgKDB4NDAwMCsweDA4MDArMHgwNDAwKQotI2RlZmluZSBGX0FSTV8yCQkoMHgwNDAwKQotI2RlZmluZSBGX0FSTV8yYQkoMHgwODAwKQotI2RlZmluZSBGX0FSTV8zCQkoMHgwYzAwKQotI2RlZmluZSBGX0FSTV8zTQkoMHg0MDAwKQotI2RlZmluZSBGX0FSTV80CQkoMHg0NDAwKQotI2RlZmluZSBGX0FSTV80VAkoMHg0ODAwKQotI2RlZmluZSBGX0FSTV81CQkoMHg0YzAwKQotCi0vKgotICogQVJNTUFHSUMgb3VnaHQgdG8gZW5jb2RlZCB0aGUgcHJvY2Vzb3IgdHlwZSwKLSAqIGJ1dCBpdCBpcyB0b28gbGF0ZSB0byBjaGFuZ2UgaXQgbm93LCBpbnN0ZWFkCi0gKiB0aGUgZmxhZ3MgZmllbGQgb2YgdGhlIGludGVybmFsX2Ygc3RydWN0dXJlCi0gKiBpcyB1c2VkIGFzIHNob3duIGFib3ZlLgotICoKLSAqIFhYWCAtIE5DIDUvNi85NwotICovCi0KLSNkZWZpbmUJQVJNTUFHSUMJMHhhMDAgIC8qIEkganVzdCBtYWRlIHRoaXMgdXAgKi8gCi0KLSNkZWZpbmUgQVJNQkFETUFHKHgpICgoKHgpLmZfbWFnaWMgIT0gQVJNTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotI2RlZmluZSBPTUFHSUMgICAgICAgICAgMDQwNCAgICAvKiBvYmplY3QgZmlsZXMsIGVnIGFzIG91dHB1dCAqLwotI2RlZmluZSBaTUFHSUMgICAgICAgICAgMDQxMyAgICAvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KLSNkZWZpbmUgU1RNQUdJQwkJMDQwMQkvKiB0YXJnZXQgc2hsaWIgKi8KLSNkZWZpbmUgU0hNQUdJQwkJMDQ0MwkvKiBob3N0ICAgc2hsaWIgKi8KLQotCi0vKiBkZWZpbmUgc29tZSBOVCBkZWZhdWx0IHZhbHVlcyAqLwotLyogICNkZWZpbmUgTlRfSU1BR0VfQkFTRSAgICAgICAgMHg0MDAwMDAgbW92ZWQgdG8gaW50ZXJuYWwuaCAqLwotI2RlZmluZSBOVF9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKLSNkZWZpbmUgTlRfRklMRV9BTElHTk1FTlQgICAgMHgyMDAgIAotI2RlZmluZSBOVF9ERUZfUkVTRVJWRSAgICAgICAweDEwMDAwMAotI2RlZmluZSBOVF9ERUZfQ09NTUlUICAgICAgICAweDEwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLXsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyogV2UgdXNlIHRoZSAucmRhdGEgc2VjdGlvbiB0byBob2xkIHJlYWQgb25seSBkYXRhLiAgKi8KLSNkZWZpbmUgX0xJVAkiLnJkYXRhIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLXsKLQl1bmlvbgotCXsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQKLXsKLQlzdHJ1Y3QKLQl7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24KLQkJewotCQkJc3RydWN0Ci0JCQl7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbgotCQl7Ci0JCQlzdHJ1Y3QgCQkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQl7Ci0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IAkJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJewotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbgotCXsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QKLQkJewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0Ci0JewotCQljaGFyIHhfc2NubGVuWzRdOwkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCQljaGFyIHhfY2hlY2tzdW1bNF07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtICovCi0JCWNoYXIgeF9hc3NvY2lhdGVkWzJdOwkvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0JCWNoYXIgeF9jb21kYXRbMV07CS8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QKLQl7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotI2RlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBleHRlcm5hbF9yZWxvYwotewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9hdXgtY29mZi5oIGIvaW5jbHVkZS9jb2ZmL2F1eC1jb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OWMxMjQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2F1eC1jb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBNb2RpZmljYXRpb25zIG9mIGludGVybmFsLmggYW5kIG02OGsuaCBuZWVkZWQgYnkgQS9VWAotICAgU3VnZ2VzdGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPiAqLwotCi0jaWZuZGVmIEdOVV9DT0ZGX0FVWF9ICi0jZGVmaW5lIEdOVV9DT0ZGX0FVWF9IIDEKLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL202OGsuaCIKLQotLyogU2VjdGlvbiBjb250YWlucyA2NC1ieXRlIHBhZGRlZCBwYXRobmFtZXMgb2Ygc2hhcmVkIGxpYnJhcmllcyAqLwotI3VuZGVmIFNUWVBfTElCCi0jZGVmaW5lIFNUWVBfTElCIDB4MjAwCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgc2hhcmVkIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gY29kZSAqLwotI3VuZGVmIFNUWVBfSU5JVAotI2RlZmluZSBTVFlQX0lOSVQgMHg0MDAKLQotLyogU2VjdGlvbiBjb250YWlucyAuaWRlbnQgaW5mb3JtYXRpb24gKi8KLSN1bmRlZiBTVFlQX0lERU5UCi0jZGVmaW5lIFNUWVBfSURFTlQgMHg4MDAKLQotLyogU2VjdGlvbiB0eXBlcyB1c2VkIGJ5IGJmZCBhbmQgZ2FzIG5vdCBkZWZpbmVkIChkaXJlY3RseSkgYnkgQS9VWCAqLwotI3VuZGVmIFNUWVBfT1ZFUgotI2RlZmluZSBTVFlQX09WRVIgMAotI3VuZGVmIFNUWVBfSU5GTwotI2RlZmluZSBTVFlQX0lORk8gU1RZUF9JREVOVAotCi0vKiBUcmFkaXRpb25hbCBuYW1lIG9mIHRoZSBzZWN0aW9uIHRhZ2dlZCB3aXRoIFNUWVBfTElCICovCi0jZGVmaW5lIF9MSUIgIi5saWIiCi0KLSNlbmRpZiAvKiBHTlVfQ09GRl9BVVhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2Vjb2ZmLmggYi9pbmNsdWRlL2NvZmYvZWNvZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0MjAyZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvZWNvZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0jaWZuZGVmIEVDT0ZGX0gKLSNkZWZpbmUgRUNPRkZfSAotCi0vKiBHZW5lcmljIEVDT0ZGIHN1cHBvcnQuCi0gICBUaGlzIGRvZXMgbm90IGluY2x1ZGUgc3ltYm9sIGluZm9ybWF0aW9uLCBmb3VuZCBpbiBzeW0uaCBhbmQKLSAgIHN5bWNvbnN0LmguICAqLwotCi0vKiBNaXBzIG1hZ2ljIG51bWJlcnMgdXNlZCBpbiBmaWxlaGRyLiAgTUlQU19NQUdJQ19MSVRUTEUgaXMgdXNlZCBvbgotICAgbGl0dGxlIGVuZGlhbiBtYWNoaW5lcy4gIE1JUFNfTUFHSUNfQklHIGlzIHVzZWQgb24gYmlnIGVuZGlhbgotICAgbWFjaGluZXMuICBXaGVyZSBpcyBNSVBTX01BR0lDXzEgZnJvbT8gICovCi0jZGVmaW5lIE1JUFNfTUFHSUNfMSAweDAxODAKLSNkZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUgMHgwMTYyCi0jZGVmaW5lIE1JUFNfTUFHSUNfQklHIDB4MDE2MAotCi0vKiBUaGVzZSBhcmUgdGhlIG1hZ2ljIG51bWJlcnMgdXNlZCBmb3IgTUlQUyBjb2RlIGNvbXBpbGVkIGF0IElTQQotICAgbGV2ZWwgMi4gICovCi0jZGVmaW5lIE1JUFNfTUFHSUNfTElUVExFMiAweDAxNjYKLSNkZWZpbmUgTUlQU19NQUdJQ19CSUcyIDB4MDE2MwotCi0vKiBUaGVzZSBhcmUgdGhlIG1hZ2ljIG51bWJlcnMgdXNlZCBmb3IgTUlQUyBjb2RlIGNvbXBpbGVkIGF0IElTQQotICAgbGV2ZWwgMy4gICovCi0jZGVmaW5lIE1JUFNfTUFHSUNfTElUVExFMyAweDE0MgotI2RlZmluZSBNSVBTX01BR0lDX0JJRzMgMHgxNDAKLQotLyogQWxwaGEgbWFnaWMgbnVtYmVycyB1c2VkIGluIGZpbGVoZHIuICAqLwotI2RlZmluZSBBTFBIQV9NQUdJQyAweDE4MwotI2RlZmluZSBBTFBIQV9NQUdJQ19CU0QgMHgxODUKLQotLyogTWFnaWMgbnVtYmVycyB1c2VkIGluIGEub3V0IGhlYWRlci4gICovCi0jZGVmaW5lIEVDT0ZGX0FPVVRfT01BR0lDIDA0MDcJLyogbm90IGRlbWFuZCBwYWdlZCAobGQgLU4pLiAgKi8KLSNkZWZpbmUgRUNPRkZfQU9VVF9aTUFHSUMgMDQxMwkvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KLQotLyogTmFtZXMgb2Ygc3BlY2lhbCBzZWN0aW9ucy4gICovCi0jZGVmaW5lIF9URVhUICAgIi50ZXh0IgotI2RlZmluZSBfREFUQSAgICIuZGF0YSIKLSNkZWZpbmUgX0JTUyAgICAiLmJzcyIKLSNkZWZpbmUgX1JEQVRBCSIucmRhdGEiCi0jZGVmaW5lIF9TREFUQQkiLnNkYXRhIgotI2RlZmluZSBfU0JTUwkiLnNic3MiCi0jZGVmaW5lIF9MSVRBCSIubGl0YSIKLSNkZWZpbmUgX0xJVDQJIi5saXQ0IgotI2RlZmluZSBfTElUOAkiLmxpdDgiCi0jZGVmaW5lIF9MSUIJIi5saWIiCi0jZGVmaW5lIF9JTklUCSIuaW5pdCIKLSNkZWZpbmUgX0ZJTkkJIi5maW5pIgotI2RlZmluZSBfUERBVEEJIi5wZGF0YSIKLSNkZWZpbmUgX1hEQVRBCSIueGRhdGEiCi0jZGVmaW5lIF9HT1QJIi5nb3QiCi0jZGVmaW5lIF9IQVNICSIuaGFzaCIKLSNkZWZpbmUgX0RZTlNZTQkiLmR5bnN5bSIKLSNkZWZpbmUgX0RZTlNUUgkiLmR5bnN0ciIKLSNkZWZpbmUgX1JFTERZTgkiLnJlbC5keW4iCi0jZGVmaW5lIF9DT05GTElDICIuY29uZmxpYyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotI2RlZmluZSBfTElCTElTVCAiLmxpYmxpc3QiCi0jZGVmaW5lIF9EWU5BTUlDICIuZHluYW1pYyIKLSNkZWZpbmUgX1JDT05TVAkiLnJjb25zdCIKLQotLyogRUNPRkYgdXNlcyBzb21lIGFkZGl0aW9uYWwgc2VjdGlvbiBmbGFncy4gICovCi0jZGVmaW5lIFNUWVBfUkRBVEEJICAgICAweDEwMAotI2RlZmluZSBTVFlQX1NEQVRBCSAgICAgMHgyMDAKLSNkZWZpbmUgU1RZUF9TQlNTCSAgICAgMHg0MDAKLSNkZWZpbmUgU1RZUF9HT1QJICAgIDB4MTAwMAotI2RlZmluZSBTVFlQX0RZTkFNSUMJICAgIDB4MjAwMAotI2RlZmluZSBTVFlQX0RZTlNZTQkgICAgMHg0MDAwCi0jZGVmaW5lIFNUWVBfUkVMRFlOCSAgICAweDgwMDAKLSNkZWZpbmUgU1RZUF9EWU5TVFIJICAgMHgxMDAwMAotI2RlZmluZSBTVFlQX0hBU0gJICAgMHgyMDAwMAotI2RlZmluZSBTVFlQX0xJQkxJU1QJICAgMHg0MDAwMAotI2RlZmluZSBTVFlQX0NPTkZMSUMJICAweDEwMDAwMAotI2RlZmluZSBTVFlQX0VDT0ZGX0ZJTkkJIDB4MTAwMDAwMAotI2RlZmluZSBTVFlQX0VYVEVOREVTQwkgMHgyMDAwMDAwIC8qIDB4MDJGRkYwMDAgYml0cyA9PiBzY24gdHlwZSwgcmVzdCBjbHIgKi8KLSNkZWZpbmUgU1RZUF9MSVRBCSAweDQwMDAwMDAKLSNkZWZpbmUgU1RZUF9MSVQ4CSAweDgwMDAwMDAKLSNkZWZpbmUgU1RZUF9MSVQ0CTB4MTAwMDAwMDAKLSNkZWZpbmUgU1RZUF9FQ09GRl9MSUIJMHg0MDAwMDAwMAotI2RlZmluZSBTVFlQX0VDT0ZGX0lOSVQgMHg4MDAwMDAwMAotI2RlZmluZSBTVFlQX09USEVSX0xPQUQgKFNUWVBfRUNPRkZfSU5JVCB8IFNUWVBfRUNPRkZfRklOSSkKLQotLyogZXh0ZW5kZWQgc2VjdGlvbiB0eXBlcyAqLwotI2RlZmluZSBTVFlQX0NPTU1FTlQJIDB4MjEwMDAwMAotI2RlZmluZSBTVFlQX1JDT05TVAkgMHgyMjAwMDAwCi0jZGVmaW5lIFNUWVBfWERBVEEJIDB4MjQwMDAwMAotI2RlZmluZSBTVFlQX1BEQVRBCSAweDI4MDAwMDAKLQotLyogVGhlIGxpbmtlciBuZWVkcyBhIHNlY3Rpb24gdG8gaG9sZCBzbWFsbCBjb21tb24gdmFyaWFibGVzIHdoaWxlCi0gICBsaW5raW5nLiAgVGhlcmUgaXMgbm8gY29udmVuaWVudCB3YXkgdG8gY3JlYXRlIGl0IHdoZW4gdGhlIGxpbmtlcgotICAgbmVlZHMgaXQsIHNvIHdlIGFsd2F5cyBjcmVhdGUgb25lIGZvciBlYWNoIEJGRC4gIFdlIHRoZW4gYXZvaWQKLSAgIHdyaXRpbmcgaXQgb3V0LiAgKi8KLSNkZWZpbmUgU0NPTU1PTiAiLnNjb21tb24iCi0KLS8qIElmIHRoZSBleHRlcm4gYml0IGluIGEgcmVsb2MgaXMgMSwgdGhlbiByX3N5bW5keCBpcyBhbiBpbmRleCBpbnRvCi0gICB0aGUgZXh0ZXJuYWwgc3ltYm9sIHRhYmxlLiAgSWYgdGhlIGV4dGVybiBiaXQgaXMgMCwgdGhlbiByX3N5bW5keAotICAgaW5kaWNhdGVzIGEgc2VjdGlvbiwgYW5kIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gICovCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fTk9ORQkwCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fVEVYVAkxCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fUkRBVEEJMgotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0RBVEEJMwotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1NEQVRBCTQKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9TQlNTCTUKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9CU1MJNgotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0lOSVQJNwotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0xJVDgJOAotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0xJVDQJOQotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1hEQVRBICAgIDEwCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fUERBVEEgICAgMTEKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9GSU5JICAgICAxMgotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0xJVEEgICAgIDEzCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fQUJTICAgICAgMTQKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9SQ09OU1QgICAxNQotCi0jZGVmaW5lIE5VTV9SRUxPQ19TRUNUSU9OUyAgICAgMTYKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1RBQlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZ2NjIHVzZXMgbWlwcy10ZmlsZSB0byBvdXRwdXQgdHlwZSBpbmZvcm1hdGlvbiBpbiBzcGVjaWFsIHN0YWJzCi0gICBlbnRyaWVzLiAgVGhlc2UgbXVzdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyBkZWZpbml0aW9uIGluCi0gICBnY2MvY29uZmlnL21pcHMuaC4gIEF0IHNvbWUgcG9pbnQsIHRoZXNlIHNob3VsZCBwcm9iYWJseSBnbyBpbnRvIGEKLSAgIHNoYXJlZCBpbmNsdWRlIGZpbGUsIGJ1dCBjdXJyZW50bHkgZ2NjIGFuZCBnZGIgZG8gbm90IHNoYXJlIGFueQotICAgZGlyZWN0b3JpZXMuICovCi0jZGVmaW5lIENPREVfTUFTSyAweDhGMzAwCi0jZGVmaW5lIEVDT0ZGX0lTX1NUQUIoc3ltKSAoKChzeW0pLT5pbmRleCAmIDB4RkZGMDApID09IENPREVfTUFTSykKLSNkZWZpbmUgRUNPRkZfTUFSS19TVEFCKGNvZGUpICgoY29kZSkrQ09ERV9NQVNLKQotI2RlZmluZSBFQ09GRl9VTk1BUktfU1RBQihjb2RlKSAoKGNvZGUpLUNPREVfTUFTSykKLSNkZWZpbmUgU1RBQlNfU1lNQk9MICJAc3RhYnMiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIENPRkYgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZ2NjIGFsc28gdXNlcyBtaXBzLXRmaWxlIHRvIG91dHB1dCBDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIFRoZXNlIGFyZSB0aGUgdmFsdWVzIGl0IHVzZXMgd2hlbiBvdXRwdXR0aW5nIHRoZSAudHlwZSBkaXJlY3RpdmUuCi0gICBUaGVzZSBzaG91bGQgYWxzbyBiZSBpbiBhIHNoYXJlZCBpbmNsdWRlIGZpbGUuICAqLwotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFVWCAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgYXV4aWxpYXJ5IHR5cGUgaW5mb3JtYXRpb24gaXMgdGhlIHNhbWUgb24gYWxsIGtub3duIEVDT0ZGCi0gICB0YXJnZXRzLiAgSSBjYW4ndCBzZWUgYW55IHJlYXNvbiB0aGF0IGl0IHdvdWxkIGV2ZXIgY2hhbmdlLCBzbyBJIGFtCi0gICBnb2luZyB0byBnYW1ibGUgYW5kIGRlZmluZSB0aGUgZXh0ZXJuYWwgc3RydWN0dXJlcyBoZXJlLCBpbiB0aGUKLSAgIHRhcmdldCBpbmRlcGVuZGVudCBFQ09GRiBoZWFkZXIgZmlsZS4gIFRoZSBpbnRlcm5hbCBmb3JtcyBhcmUKLSAgIGRlZmluZWQgaW4gY29mZi9zeW0uaCwgd2hpY2ggd2FzIG9yaWdpbmFsbHkgZG9uYXRlZCBieSBNSVBTCi0gICBDb21wdXRlciBTeXN0ZW1zLiAgKi8KLQotLyogVHlwZSBpbmZvcm1hdGlvbiBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHRpcl9leHQgewotCXVuc2lnbmVkIGNoYXIJdF9iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCXRfdHE0NVsxXTsKLQl1bnNpZ25lZCBjaGFyCXRfdHEwMVsxXTsKLQl1bnNpZ25lZCBjaGFyCXRfdHEyM1sxXTsKLX07Ci0KLSNkZWZpbmUJVElSX0JJVFMxX0ZCSVRGSUVMRF9CSUcJCSgodW5zaWduZWQgaW50KSAweDgwKQotI2RlZmluZQlUSVJfQklUUzFfRkJJVEZJRUxEX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwMSkKLQotI2RlZmluZQlUSVJfQklUUzFfQ09OVElOVUVEX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4NDApCi0jZGVmaW5lCVRJUl9CSVRTMV9DT05USU5VRURfTElUVExFCSgodW5zaWduZWQgaW50KSAweDAyKQotCi0jZGVmaW5lCVRJUl9CSVRTMV9CVF9CSUcJCSgodW5zaWduZWQgaW50KSAweDNGKQotI2RlZmluZQlUSVJfQklUUzFfQlRfU0hfQklHCQkwCi0jZGVmaW5lCVRJUl9CSVRTMV9CVF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweEZDKQotI2RlZmluZQlUSVJfQklUUzFfQlRfU0hfTElUVExFCQkyCi0KLSNkZWZpbmUJVElSX0JJVFNfVFE0X0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRNF9TSF9CSUcJCTQKLSNkZWZpbmUJVElSX0JJVFNfVFE1X0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRNV9TSF9CSUcJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFE0X0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRNF9TSF9MSVRUTEUJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFE1X0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRNV9TSF9MSVRUTEUJCTQKLQotI2RlZmluZQlUSVJfQklUU19UUTBfQklHCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFEwX1NIX0JJRwkJNAotI2RlZmluZQlUSVJfQklUU19UUTFfQklHCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFExX1NIX0JJRwkJMAotI2RlZmluZQlUSVJfQklUU19UUTBfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFEwX1NIX0xJVFRMRQkJMAotI2RlZmluZQlUSVJfQklUU19UUTFfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFExX1NIX0xJVFRMRQkJNAotCi0jZGVmaW5lCVRJUl9CSVRTX1RRMl9CSUcJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTJfU0hfQklHCQk0Ci0jZGVmaW5lCVRJUl9CSVRTX1RRM19CSUcJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTNfU0hfQklHCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRMl9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTJfU0hfTElUVExFCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRM19MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTNfU0hfTElUVExFCQk0Ci0KLS8qIFJlbGF0aXZlIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHJuZHhfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXJfYml0c1s0XTsKLX07Ci0KLSNkZWZpbmUJUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9CSUcJNAotI2RlZmluZQlSTkRYX0JJVFMxX1JGRF9CSUcJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlSTkRYX0JJVFMxX1JGRF9TSF9CSUcJCTQKLQotI2RlZmluZQlSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0xJVFRMRQkwCi0jZGVmaW5lCVJORFhfQklUUzFfUkZEX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVJORFhfQklUUzFfUkZEX1NIX0xFRlRfTElUVExFCTgKLQotI2RlZmluZQlSTkRYX0JJVFMxX0lOREVYX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVJORFhfQklUUzFfSU5ERVhfU0hfTEVGVF9CSUcJMTYKLSNkZWZpbmUJUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRwk4Ci0jZGVmaW5lCVJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9CSUcJMAotCi0jZGVmaW5lCVJORFhfQklUUzFfSU5ERVhfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJUk5EWF9CSVRTMV9JTkRFWF9TSF9MSVRUTEUJNAotI2RlZmluZQlSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfTElUVExFCTQKLSNkZWZpbmUJUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRQkxMgotCi0vKiBBdXhpbGlhcnkgc3ltYm9sIGluZm9ybWF0aW9uIGV4dGVybmFsIHJlY29yZCAqLwotCi11bmlvbiBhdXhfZXh0IHsKLQlzdHJ1Y3QgdGlyX2V4dAlhX3RpOwotCXN0cnVjdCBybmR4X2V4dAlhX3JuZHg7Ci0JdW5zaWduZWQgY2hhcglhX2RuTG93WzRdOwotCXVuc2lnbmVkIGNoYXIJYV9kbkhpZ2hbNF07Ci0JdW5zaWduZWQgY2hhcglhX2lzeW1bNF07Ci0JdW5zaWduZWQgY2hhcglhX2lzc1s0XTsKLQl1bnNpZ25lZCBjaGFyCWFfd2lkdGhbNF07Ci0JdW5zaWduZWQgY2hhcglhX2NvdW50WzRdOwotfTsKLQotI2RlZmluZSBBVVhfR0VUX0FOWShiaWdlbmQsIGF4LCBmaWVsZCkgXAotICAoKGJpZ2VuZCkgPyBiZmRfZ2V0YjMyICgoYXgpLT5maWVsZCkgOiBiZmRfZ2V0bDMyICgoYXgpLT5maWVsZCkpCi0KLSNkZWZpbmUJQVVYX0dFVF9ETkxPVyhiaWdlbmQsIGF4KQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfZG5Mb3cpCi0jZGVmaW5lCUFVWF9HRVRfRE5ISUdIKGJpZ2VuZCwgYXgpCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV9kbkhpZ2gpCi0jZGVmaW5lCUFVWF9HRVRfSVNZTShiaWdlbmQsIGF4KQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfaXN5bSkKLSNkZWZpbmUgQVVYX0dFVF9JU1MoYmlnZW5kLCBheCkJCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV9pc3MpCi0jZGVmaW5lIEFVWF9HRVRfV0lEVEgoYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX3dpZHRoKQotI2RlZmluZSBBVVhfR0VUX0NPVU5UKGJpZ2VuZCwgYXgpCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV9jb3VudCkKLQotI2RlZmluZSBBVVhfUFVUX0FOWShiaWdlbmQsIHZhbCwgYXgsIGZpZWxkKSBcCi0gICgoYmlnZW5kKSBcCi0gICA/IChiZmRfcHV0YjMyICgoYmZkX3ZtYSkgKHZhbCksIChheCktPmZpZWxkKSwgMCkgXAotICAgOiAoYmZkX3B1dGwzMiAoKGJmZF92bWEpICh2YWwpLCAoYXgpLT5maWVsZCksIDApKQotCi0jZGVmaW5lIEFVWF9QVVRfRE5MT1coYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfZG5Mb3cpCi0jZGVmaW5lIEFVWF9QVVRfRE5ISUdIKGJpZ2VuZCwgdmFsLCBheCkgXAotICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX2RuSGlnaCkKLSNkZWZpbmUgQVVYX1BVVF9JU1lNKGJpZ2VuZCwgdmFsLCBheCkgXAotICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX2lzeW0pCi0jZGVmaW5lIEFVWF9QVVRfSVNTKGJpZ2VuZCwgdmFsLCBheCkgXAotICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX2lzcykKLSNkZWZpbmUgQVVYX1BVVF9XSURUSChiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV93aWR0aCkKLSNkZWZpbmUgQVVYX1BVVF9DT1VOVChiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9jb3VudCkKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBGb3IgZWZmaWNpZW5jeSwgZ2RiIGRlYWxzIGRpcmVjdGx5IHdpdGggdGhlIHVuc3dhcHBlZCBzeW1ib2xpYwotICAgaW5mb3JtYXRpb24gKHRoYXQgd2F5IGl0IG9ubHkgdGFrZXMgdGhlIHRpbWUgdG8gc3dhcCBpbmZvcm1hdGlvbgotICAgdGhhdCBpdCByZWFsbHkgbmVlZHMgdG8gcmVhZCkuICBnZGIgb3JpZ2luYWxseSByZXRyaWV2ZWQgdGhlCi0gICBpbmZvcm1hdGlvbiBkaXJlY3RseSBmcm9tIHRoZSBCRkQgYmFja2VuZCBpbmZvcm1hdGlvbiwgYnV0IHRoYXQKLSAgIHN0cmF0ZWd5LCBiZXNpZGVzIGJlaW5nIHNvcnQgb2YgdWdseSwgZG9lcyBub3Qgd29yayBmb3IgTUlQUyBFTEYsCi0gICB3aGljaCBhbHNvIHVzZXMgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBzdHJ1Y3R1cmUgaG9sZHMKLSAgIHBvaW50ZXJzIHRvIHRoZSAobW9zdGx5KSB1bnN3YXBwZWQgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbwotewotICAvKiBUaGUgc3dhcHBlZCBFQ09GRiBzeW1ib2xpYyBoZWFkZXIuICAqLwotICBIRFJSIHN5bWJvbGljX2hlYWRlcjsKLQotICAvKiBQb2ludGVycyB0byB0aGUgdW5zd2FwcGVkIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgTm90ZSB0aGF0IHRoZQotICAgICBwb2ludGVycyB0byBleHRlcm5hbCBzdHJ1Y3R1cmVzIHBvaW50IHRvIGRpZmZlcmVudCBzb3J0cyBvZgotICAgICBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgRUNPRkYgdGFyZ2V0cy4gIFRoZSBlY29mZl9kZWJ1Z19zd2FwCi0gICAgIHN0cnVjdHVyZSBwcm92aWRlcyB0aGUgc2l6ZXMgb2YgdGhlIHN0cnVjdHVyZXMgYW5kIHRoZSBmdW5jdGlvbnMKLSAgICAgbmVlZGVkIHRvIHN3YXAgdGhlIGluZm9ybWF0aW9uIGluIGFuZCBvdXQuICBUaGVzZSBwb2ludGVycyBhcmUKLSAgICAgYWxsIHBvaW50ZXJzIHRvIGFycmF5cywgbm90IHNpbmdsZSBzdHJ1Y3R1cmVzLiAgVGhleSB3aWxsIGJlIE5VTEwKLSAgICAgaWYgdGhlcmUgYXJlIG5vIGluc3RhbmNlcyBvZiB0aGUgcmVsZXZhbnQgc3RydWN0dXJlLiAgVGhlc2UKLSAgICAgZmllbGRzIGFyZSBhbHNvIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB0byBvdXRwdXQgRUNPRkYgZGVidWdnaW5nCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciAqbGluZTsKLSAgUFRSIGV4dGVybmFsX2RucjsJLyogc3RydWN0IGRucl9leHQgKi8KLSAgUFRSIGV4dGVybmFsX3BkcjsJLyogc3RydWN0IHBkcl9leHQgKi8KLSAgUFRSIGV4dGVybmFsX3N5bTsJLyogc3RydWN0IHN5bV9leHQgKi8KLSAgUFRSIGV4dGVybmFsX29wdDsJLyogc3RydWN0IG9wdF9leHQgKi8KLSAgdW5pb24gYXV4X2V4dCAqZXh0ZXJuYWxfYXV4OwotICBjaGFyICpzczsKLSAgY2hhciAqc3NleHQ7Ci0gIFBUUiBleHRlcm5hbF9mZHI7CS8qIHN0cnVjdCBmZHJfZXh0ICovCi0gIFBUUiBleHRlcm5hbF9yZmQ7CS8qIHN0cnVjdCByZmRfZXh0ICovCi0gIFBUUiBleHRlcm5hbF9leHQ7CS8qIHN0cnVjdCBleHRfZXh0ICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSB1c2VkIHdoZW4gbGlua2luZy4gIFRoZXkgbWF5IGRpc2FwcGVhciBhdCBzb21lCi0gICAgIHBvaW50LiAgKi8KLSAgY2hhciAqc3NleHRfZW5kOwotICBQVFIgZXh0ZXJuYWxfZXh0X2VuZDsKLQotICAvKiBXaGVuIGxpbmtpbmcsIHRoaXMgZmllbGQgaG9sZHMgYSBtYXBwaW5nIGZyb20gdGhlIGlucHV0IEZEUgotICAgICBudW1iZXJzIHRvIHRoZSBvdXRwdXQgbnVtYmVycywgYW5kIGlzIHVzZWQgd2hlbiB3cml0aW5nIG91dCB0aGUKLSAgICAgZXh0ZXJuYWwgc3ltYm9scy4gIEl0IGlzIE5VTEwgaWYgbm8gbWFwcGluZyBpcyByZXF1aXJlZC4gICovCi0gIFJGRFQgKmlmZG1hcDsKLQotICAvKiBUaGUgc3dhcHBlZCBGRFIgaW5mb3JtYXRpb24uICBDdXJyZW50bHkgdGhpcyBpcyBuZXZlciBOVUxMLCBidXQKLSAgICAgY29kZSB1c2luZyB0aGlzIHN0cnVjdHVyZSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIGluIGNhc2UKLSAgICAgdGhpcyBjaGFuZ2VzIGluIHRoZSBmdXR1cmUuICBUaGlzIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSwgbm90IGEKLSAgICAgc2luZ2xlIHN0cnVjdHVyZS4gICovCi0gIEZEUiAqZmRyOwotCi0gIC8qIFdoZW4gcmVsYXhpbmcgTUlQUyBlbWJlZGRlZCBQSUMgY29kZSwgd2UgbWF5IG5lZWQgdG8gYWRqdXN0Ci0gICAgIHN5bWJvbCB2YWx1ZXMgd2hlbiB0aGV5IGFyZSBvdXRwdXQuICBUaGlzIGlzIGEgbGlua2VkIGxpc3Qgb2YKLSAgICAgc3RydWN0dXJlcyBpbmRpY2F0aW5nIGhvdyB2YWx1ZXMgc2hvdWxkIGJlIGFkanVzdGVkLiAgVGhlcmUgaXMgbm8KLSAgICAgcmVxdWlyZW1lbnQgdGhhdCB0aGUgZW50cmllcyBiZSBpbiBhbnkgb3JkZXIsIG9yIHRoYXQgdGhleSBub3QKLSAgICAgb3ZlcmxhcC4gIFRoaXMgZmllbGQgaXMgbm9ybWFsbHkgTlVMTCwgaW4gd2hpY2ggY2FzZSBubwotICAgICBhZGp1c3RtZW50cyBuZWVkIHRvIGJlIG1hZGUuICAqLwotICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphZGp1c3Q7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgaG93IHRvIGFkanVzdCBzeW1ib2wgdmFsdWVzIHdoZW4KLSAgIG91dHB1dHRpbmcgTUlQUyBlbWJlZGRlZCBQSUMgY29kZS4gIFRoZXNlIGFkanVzdG1lbnRzIG9ubHkgYXBwbHkgdG8KLSAgIHRoZSBpbnRlcm5hbCBzeW1ib2xzLCBhcyB0aGUgZXh0ZXJuYWwgc3ltYm9sIHZhbHVlcyB3aWxsIGNvbWUgZnJvbQotICAgdGhlIGhhc2ggdGFibGUgYW5kIGhhdmUgYWxyZWFkeSBiZWVuIGFkanVzdGVkLiAgKi8KLQotc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdAotewotICAvKiBOZXh0IGVudHJ5IG9uIGFkanVzdG1lbnQgbGlzdC4gICovCi0gIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKm5leHQ7Ci0gIC8qIFN0YXJ0aW5nIFZNQSBvZiBhZGp1c3RtZW50LiAgVGhpcyBpcyB0aGUgVk1BIGluIHRoZSBFQ09GRiBmaWxlLAotICAgICBub3QgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbi4gIFRodXMgaXQgc2hvdWxkCi0gICAgIGluZGljYXRlIGEgcGFydGljdWxhciBzZWN0aW9uLiAgKi8KLSAgYmZkX3ZtYSBzdGFydDsKLSAgLyogRW5kaW5nIFZNQSBvZiBhZGp1c3RtZW50LiAgKi8KLSAgYmZkX3ZtYSBlbmQ7Ci0gIC8qIEFkanVzdG1lbnQuICBUaGlzIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCwgb3IKLSAgICAgRkRSLiAgVGhpcyBpcyB6ZXJvIGZvciB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgYXJyYXkuICAqLwotICBsb25nIGFkanVzdDsKLX07Ci0KLS8qIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHVzZWQgYnkgdGhlIEVDT0ZGIGZpbmRfbmVhcmVzdF9saW5lIGZ1bmN0aW9uLiAgKi8KLQotc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeQotewotICAvKiBCYXNlIGFkZHJlc3MgaW4gLnRleHQgb2YgdGhpcyBGRFIuICAqLwotICBiZmRfdm1hIGJhc2VfYWRkcjsKLSAgRkRSICpmZHI7Ci19OwotCi1zdHJ1Y3QgZWNvZmZfZmluZF9saW5lCi17Ci0gIC8qIEFsbG9jYXRlZCBtZW1vcnkgdG8gaG9sZCBmdW5jdGlvbiBhbmQgZmlsZSBuYW1lcy4gICovCi0gIGNoYXIgKmZpbmRfYnVmZmVyOwotCi0gIC8qIEZEUiB0YWJsZSwgc29ydGVkIGJ5IGFkZHJlc3M6ICovCi0gIGxvbmcgZmRydGFiX2xlbjsKLSAgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqZmRydGFiOwotCi0gIC8qIENhY2hlIGVudHJ5IGZvciBtb3N0IHJlY2VudGx5IGZvdW5kIGxpbmUgaW5mb3JtYXRpb24uICBUaGUgc2VjdAotICAgICBmaWVsZCBpcyBOVUxMIGlmIHRoaXMgY2FjaGUgZG9lcyBub3QgY29udGFpbiB2YWxpZCBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdAotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0OwotICAgICAgYmZkX3ZtYSBzdGFydDsKLSAgICAgIGJmZF92bWEgc3RvcDsKLSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25uYW1lOwotICAgICAgdW5zaWduZWQgaW50IGxpbmVfbnVtOwotICAgIH0gY2FjaGU7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTV0FQUElORyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZ2VuZXJpYyBFQ09GRiBjb2RlIG5lZWRzIHRvIGJlIGFibGUgdG8gc3dhcCBkZWJ1Z2dpbmcKLSAgIGluZm9ybWF0aW9uIGluIGFuZCBvdXQgaW4gdGhlIHNwZWNpZmljIGZvcm1hdCB1c2VkIGJ5IGEgcGFydGljdWxhcgotICAgRUNPRkYgaW1wbGVtZW50YXRpb24uICBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24KLSAgIG5lZWRlZCB0byBkbyB0aGlzLiAgKi8KLQotc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAKLXsKLSAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCi0gIGludCBzeW1fbWFnaWM7Ci0gIC8qIEFsaWdubWVudCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFLmcuLCA0LiAgKi8KLSAgYmZkX3NpemVfdHlwZSBkZWJ1Z19hbGlnbjsKLSAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2hkcl9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Rucl9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX29wdF9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JmZF9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplOwotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBpbiBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgdm9pZCAoKnN3YXBfaGRyX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBIRFJSICopKTsKLSAgdm9pZCAoKnN3YXBfZG5yX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBETlIgKikpOwotICB2b2lkICgqc3dhcF9wZHJfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBEUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX3N5bV9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgU1lNUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX29wdF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgT1BUUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX2Zkcl9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRkRSICopKTsKLSAgdm9pZCAoKnN3YXBfcmZkX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBSRkRUICopKTsKLSAgdm9pZCAoKnN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKTsKLSAgdm9pZCAoKnN3YXBfdGlyX2luKSBQQVJBTVMgKChpbnQsIGNvbnN0IHN0cnVjdCB0aXJfZXh0ICosIFRJUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX3JuZHhfaW4pIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHJuZHhfZXh0ICosIFJORFhSICopKTsKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgb3V0IGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICB2b2lkICgqc3dhcF9oZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgSERSUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfZG5yX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEROUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfcGRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFBEUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfc3ltX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFNZTVIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX29wdF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBPUFRSICosIFBUUikpOwotICB2b2lkICgqc3dhcF9mZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRkRSICosIFBUUikpOwotICB2b2lkICgqc3dhcF9yZmRfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUkZEVCAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfZXh0X291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEVYVFIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX3Rpcl9vdXQpIFBBUkFNUyAoKGludCwgY29uc3QgVElSICosIHN0cnVjdCB0aXJfZXh0ICopKTsKLSAgdm9pZCAoKnN3YXBfcm5keF9vdXQpIFBBUkFNUyAoKGludCwgY29uc3QgUk5EWFIgKiwgc3RydWN0IHJuZHhfZXh0ICopKTsKLSAgLyogRnVuY3Rpb24gdG8gcmVhZCBzeW1ib2wgZGF0YSBhbmQgc2V0IHVwIHBvaW50ZXJzIGluCi0gICAgIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLiAgVGhlIHNlY3Rpb24gYXJndW1lbnQgaXMgdXNlZCBmb3IKLSAgICAgRUxGLCBub3Qgc3RyYWlnaHQgRUNPRkYuICAqLwotICBib29sZWFuICgqcmVhZF9kZWJ1Z19pbmZvKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkgICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Ci19OwotCi0jZW5kaWYgLyogISBkZWZpbmVkIChFQ09GRl9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2dvMzJleGUuaCBiL2luY2x1ZGUvY29mZi9nbzMyZXhlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDI2YzEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2dvMzJleGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qIENPRkYgaW5mb3JtYXRpb24gZm9yIFBDIHJ1bm5pbmcgZ28zMi4gICovCi0KLSNkZWZpbmUgU1RVQlNJWkUgMjA0OAotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcl9nbzMyX2V4ZSB7Ci0JY2hhciBzdHViW1NUVUJTSVpFXTsJLyogdGhlIHN0dWIgdG8gbG9hZCB0aGUgaW1hZ2UJKi8KLQkvKiB0aGUgc3RhbmRhcmQgQ09GRiBoZWFkZXIgKi8KLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0jdW5kZWYgRklMSERSCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcl9nbzMyX2V4ZQotI3VuZGVmIEZJTEhTWgotI2RlZmluZQlGSUxIU1oJU1RVQlNJWkUrMjAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9oODMwMC5oIGIvaW5jbHVkZS9jb2ZmL2g4MzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjIzOTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2g4MzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBIaXRhY2hpIEg4LzMwMCBhbmQgSDgvMzAwLUggKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotCi0jZGVmaW5lCUg4MzAwTUFHSUMJMHg4MzAwCi0jZGVmaW5lCUg4MzAwSE1BR0lDCTB4ODMwMQotI2RlZmluZQlIODMwMFNNQUdJQwkweDgzMDIKLQotI2RlZmluZSBIODMwMEJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1IODMwME1BR0lDKSkKLSNkZWZpbmUgSDgzMDBIQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPUg4MzAwSE1BR0lDKSkKLSNkZWZpbmUgSDgzMDBTQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPUg4MzAwU01BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIGg4IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX29mZnNldFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zdHVmZlsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQotCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2g4NTAwLmggYi9pbmNsdWRlL2NvZmYvaDg1MDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwNWJmMmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2g4NTAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBIaXRhY2hpIEg4LzUwMCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0KLSNkZWZpbmUJSDg1MDBNQUdJQwkweDg1MDAKLQotCi0jZGVmaW5lIEg4NTAwQkFETUFHKHgpICgoMHhmZmZmICYmICgoeCkuZl9tYWdpYykhPUg4NTAwTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgaDggZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCi0KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaTM4Ni5oIGIvaW5jbHVkZS9jb2ZmL2kzODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWViZjRhMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaTM4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSW50ZWwgMzg2LzQ4Ni4gICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9BUjMyV1IJZmlsZSBoYXMgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZSAoZS5nLiB2YXgpCi0gKi8KLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKLQotCi0KLSNkZWZpbmUJSTM4Nk1BR0lDCTB4MTRjCi0jZGVmaW5lIEkzODZQVFhNQUdJQwkweDE1NAotI2RlZmluZSBJMzg2QUlYTUFHSUMJMHgxNzUKLQotLyogVGhpcyBpcyBMeW54J3MgYWxsLXBsYXRmb3JtIG1hZ2ljIG51bWJlciBmb3IgZXhlY3V0YWJsZXMuICovCi0KLSNkZWZpbmUgTFlOWENPRkZNQUdJQwkwNDE1Ci0KLSNkZWZpbmUgSTM4NkJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljICE9IEkzODZNQUdJQykgXAotCQkgICAgICAgJiYgKHgpLmZfbWFnaWMgIT0gSTM4NkFJWE1BR0lDIFwKLQkJICAgICAgICYmICh4KS5mX21hZ2ljICE9IEkzODZQVFhNQUdJQyBcCi0JCSAgICAgICAmJiAoeCkuZl9tYWdpYyAhPSBMWU5YQ09GRk1BR0lDKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotCi0KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLSNkZWZpbmUgT01BR0lDICAgICAgICAgIDA0MDQgICAgLyogb2JqZWN0IGZpbGVzLCBlZyBhcyBvdXRwdXQgKi8KLSNkZWZpbmUgWk1BR0lDICAgICAgICAgIDA0MTMgICAgLyogZGVtYW5kIGxvYWQgZm9ybWF0LCBlZyBub3JtYWwgbGQgb3V0cHV0ICovCi0jZGVmaW5lIFNUTUFHSUMJCTA0MDEJLyogdGFyZ2V0IHNobGliICovCi0jZGVmaW5lIFNITUFHSUMJCTA0NDMJLyogaG9zdCAgIHNobGliICovCi0KLQotLyogZGVmaW5lIHNvbWUgTlQgZGVmYXVsdCB2YWx1ZXMgKi8KLS8qICAjZGVmaW5lIE5UX0lNQUdFX0JBU0UgICAgICAgIDB4NDAwMDAwIG1vdmVkIHRvIGludGVybmFsLmggKi8KLSNkZWZpbmUgTlRfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCi0jZGVmaW5lIE5UX0ZJTEVfQUxJR05NRU5UICAgIDB4MjAwCi0jZGVmaW5lIE5UX0RFRl9SRVNFUlZFICAgICAgIDB4MTAwMDAwCi0jZGVmaW5lIE5UX0RFRl9DT01NSVQgICAgICAgIDB4MTAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotI2RlZmluZSBfTElCICIubGliIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQkJY2hhciB4X2NoZWNrc3VtWzRdOwkvKiBzZWN0aW9uIENPTURBVCBjaGVja3N1bSAqLwotCQljaGFyIHhfYXNzb2NpYXRlZFsyXTsJLyogQ09NREFUIGFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCAqLwotCQljaGFyIHhfY29tZGF0WzFdOwkvKiBDT01EQVQgc2VsZWN0aW9uIG51bWJlciAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0jCWRlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTAKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2k4NjAuaCBiL2luY2x1ZGUvY29mZi9pODYwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNjg2ZTkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2k4NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKiBUaGlzIGZpbGUgd2FzIGhhY2tlZCBmcm9tIGkzODYuaCAgIFtkb2xhbkBzc2QuaW50ZWwuY29tXSAqLwotCi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEludGVsIDg2MC4gICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotLyogQml0cyBmb3IgZl9mbGFnczoKLSAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCi0gKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKLSAqLwotCi0jZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCi0jZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikKLSNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQotI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQotCi0KLQotI2RlZmluZQlJODYwTUFHSUMJMHgxNGQKLQotI2RlZmluZSBJODYwQkFETUFHKHgpICAgKCh4KS5mX21hZ2ljICE9IEk4NjBNQUdJQykKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLS8qIEZJWE1FOiBXaGF0IGFyZSB0aGUgYS5vdXQgbWFnaWMgbnVtYmVycz8gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUIgIi5saWIiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLSMJZGVmaW5lIF9FVEVYVAkiZXRleHQiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2k5NjAuaCBiL2luY2x1ZGUvY29mZi9pOTYwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MzU4MzYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2k5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIDgwOTYwLiAgT3JpZ2luczogSW50ZWwgY29ycCwgbmF0Y2guICovCi0KLS8qIE5PVEU6IFRhZ2VudHJpZXMgKGNmIFRBR0JJVFMpIGFyZSBubyBsb25nZXIgdXNlZCBieSB0aGUgOTYwICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lIE9NQUdJQyAgICAgICgwNDA3KQkvKiBvbGQgaW1wdXJlIGZvcm1hdC4gZGF0YSBpbW1lZGlhdGVseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dzIHRleHQuIGJvdGggc2VjdGlvbnMgYXJlIHJ3LiAqLwotI2RlZmluZSBOTUFHSUMgICAgICAoMDQxMCkJLyogc3BsaXQgaSZkLCByZWFkLW9ubHkgdGV4dCAqLwotCi0vKgotKglJbnRlbCA4MDk2MCAoSTk2MCkgcHJvY2Vzc29yIGZsYWdzLgotKglGX0k5NjBUWVBFID09IG1hc2sgZm9yIHByb2Nlc3NvciB0eXBlIGZpZWxkLiAKLSovCi0KLSNkZWZpbmUJRl9JOTYwVFlQRQkoMHhmMDAwKQotI2RlZmluZQlGX0k5NjBDT1JFCSgweDEwMDApCi0jZGVmaW5lCUZfSTk2MEtCCSgweDIwMDApCi0jZGVmaW5lCUZfSTk2MFNCCSgweDIwMDApCi0jZGVmaW5lCUZfSTk2ME1DCSgweDMwMDApCi0jZGVmaW5lCUZfSTk2MFhBCSgweDQwMDApCi0jZGVmaW5lCUZfSTk2MENBCSgweDUwMDApCi0jZGVmaW5lCUZfSTk2MEtBCSgweDYwMDApCi0jZGVmaW5lCUZfSTk2MFNBCSgweDYwMDApCi0jZGVmaW5lIEZfSTk2MEpYCSgweDcwMDApCi0jZGVmaW5lIEZfSTk2MEhYCSgweDgwMDApCi0KLQotLyoqIGk4MDk2MCBNYWdpYyBOdW1iZXJzCi0qLwotCi0jZGVmaW5lIEk5NjBST01BR0lDCSgweDE2MCkJLyogcmVhZC1vbmx5IHRleHQgc2VnbWVudHMgKi8KLSNkZWZpbmUgSTk2MFJXTUFHSUMJKDB4MTYxKQkvKiByZWFkLXdyaXRlIHRleHQgc2VnbWVudHMgKi8KLQotI2RlZmluZSBJOTYwQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPUk5NjBST01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPUk5NjBSV01BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcJcGh5c19hZGRyOwotCXVuc2lnbmVkIGxvbmcJYml0YXJyYXk7Ci19IFRBR0JJVFM7Ci0KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIJdGFnZW50cmllc1s0XTsJCS8qIG51bWJlciBvZiB0YWcgZW50cmllcyB0byBmb2xsb3cgKi8KLX0KLUFPVVRIRFI7Ci0KLS8qIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHRhZyBiaXRzIGFycmF5ICovCi0KLSNkZWZpbmUgVEFHUFRSKGFvdXQpICgoVEFHQklUUyAqKSAoJihhb3V0LnRhZ2VudHJpZXMpKzEpKQotCi0vKiBjb21wdXRlIHNpemUgb2YgYSBoZWFkZXIgKi8KLQotLyojZGVmaW5lIEFPVVRTWihhb3V0KSAoc2l6ZW9mKEFPVVRIRFIpKyhhb3V0LnRhZ2VudHJpZXMqc2l6ZW9mKFRBR0JJVFMpKSkqLwotI2RlZmluZSBBT1VUU1ogMzIKLSNkZWZpbmUgQU9VVEhEUlNaIDMyCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi0JY2hhciAJCXNfYWxpZ25bNF07CS8qIHNlY3Rpb24gYWxpZ25tZW50CQkqLwotfTsKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0NAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQgICAiLnRleHQiCi0jZGVmaW5lIF9EQVRBICAgIi5kYXRhIgotI2RlZmluZSBfQlNTICAgICIuYnNzIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CQkvKiBsaW5lIG51bWJlcgkJKi8KLQljaGFyIHBhZGRpbmdbMl07CS8qIGZvcmNlIGFsaWdubWVudAkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfZmxhZ3NbMl07Ci0gIGNoYXIgZV90eXBlWzRdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotICBjaGFyIHBhZDJbMl07Ci19OwotCi0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgweDFmKQotI2RlZmluZSBOX1RNQVNLCQkoMHg2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDUpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqICBJOTYwLXNwZWNpZmljICoybmQqIGF1eC4gZW50cnkgZm9ybWF0cwotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0Jc3RydWN0IHsKLQkgIC8qIFRoaXMgaXMgYSB2ZXJ5IG9sZCB0eXBvIHRoYXQga2VlcHMgZ2V0dGluZyBwcm9wYWdhdGVkLiAqLwotI2RlZmluZSB4X3N0ZGluZHggeF9zdGluZHgKLQkJY2hhciB4X3N0aW5keFs0XTsJLyogc3lzLiB0YWJsZSBlbnRyeSAqLwotCX0geF9zYzsJLyogc3lzdGVtIGNhbGwgZW50cnkgKi8KLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9iYWxudHJ5WzRdOyAvKiBCQUwgZW50cnkgcG9pbnQgKi8KLQl9IHhfYmFsOyAvKiBCQUwtY2FsbGFibGUgZnVuY3Rpb24gKi8KLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdGltZXN0YW1wWzRdOwkgICAgICAgIC8qIHRpbWUgc3RhbXAgKi8KLQkJY2hhciAJeF9pZHN0cmluZ1syMF07CSAgICAgICAgLyogcHJvZHVjZXIgaWRlbnRpdHkgc3RyaW5nICovCi0JfSB4X2lkZW50OwkgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9kdWNlciBpZGVudCBpbmZvICovCi0KLX07Ci0KLQotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkyNAotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkyNAotCi0jCWRlZmluZSBfRVRFWFQJIl9ldGV4dCIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcGFkWzJdOwotfTsKLQotLyogcl90eXBlIHZhbHVlcyBmb3IgdGhlIGk5NjAuICAqLwotCi0vKiBUaGUgaTk2MCB1c2VzIFJfUkVMTE9ORywgd2hpY2ggaXMgZGVmaW5lZCBpbiBpbnRlcm5hbC5oIGFzIDB4MTEuCi0gICBJdCBpcyBhbiBhYnNvbHV0ZSAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0KLSNkZWZpbmUgUl9JUFJNRUQgCSgweDE5KQkvKiAyNC1iaXQgaXAtcmVsYXRpdmUgcmVsb2NhdGlvbiAqLwotI2RlZmluZSBSX09QVENBTEwJKDB4MWIpCS8qIDMyLWJpdCBvcHRpbWl6YWJsZSBjYWxsIChsZWFmcHJvYy9zeXNwcm9jKSAqLwotI2RlZmluZSBSX09QVENBTExYCSgweDFjKQkvKiA2NC1iaXQgb3B0aW1pemFibGUgY2FsbCAobGVhZnByb2Mvc3lzcHJvYykgKi8KLQotLyogVGhlIGZvbGxvd2luZyByZWxvY2F0aW9uIHR5cGVzIGFyZSBkZWZpbmVkIHVzZSBieSByZWxheGluZyBsaW5rZXJzLAotICAgd2hpY2ggY29udmVydCAzMiBiaXQgY2FsbHMgKHdoaWNoIHJlcXVpcmUgYSA2NCBiaXQgaW5zdHJ1Y3Rpb24pCi0gICBpbnRvIDI0IGJpdCBjYWxscyAod2hpY2ggcmVxdWlyZSBhIDMyIGJpdCBpbnN0cnVjdGlvbikgd2hlbgotICAgcG9zc2libGUuICBJdCB3aWxsIGJlIHBvc3NpYmxlIHdoZW5ldmVyIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwgaXMKLSAgIHdpdGhpbiBhIDI0IGJpdCByYW5nZSBvZiB0aGUgY2FsbCBpbnN0cnVjdGlvbi4KLQotICAgSXQgaXMgYWx3YXlzIHNhZmUgdG8gaWdub3JlIHRoZXNlIHJlbG9jYXRpb25zLiAgVGhleSBvbmx5IHNlcnZlIHRvCi0gICBtYXJrIHBvaW50cyB3aGljaCB0aGUgcmVsYXhpbmcgbGlua2VyIHdpbGwgaGF2ZSB0byBjb25zaWRlci4gIFRoZQotICAgYXNzZW1ibGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgY29kZSBpcyBnZW5lcmF0ZWQgZXZlbiBpZgotICAgdGhlIHJlbG9jYXRpb25zIGFyZSBpZ25vcmVkLiAgSW4gcGFydGljdWxhciwgdGhpcyBtZWFucyB0aGF0IHRoZQotICAgUl9JUFIxMyByZWxvY2F0aW9uIG1heSBub3QgYXBwZWFyIHdpdGggYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotI2RlZmluZSBSX0lQUjEzCQkoMHgxZCkJLyogMTMgYml0IGlwLXJlbGF0aXZlIGJyYW5jaCAqLwotI2RlZmluZSBSX0FMSUdOCQkoMHgxZSkgIC8qIGFsaWdubWVudCBtYXJrZXIuICBUaGlzIGhhcyBubwotCQkJCSAgIGFzc29jaWF0ZWQgc3ltYm9sLiAgSW5zdGVhZCwgdGhlCi0JCQkJICAgcl9zeW1uZHggZmllbGQgaW5kaWNhdGVzIHRoZQotCQkJCSAgIHJlcXVpcmUgYWxpZ25tZW50IGF0IHRoaXMgcG9pbnQgaW4KLQkJCQkgICB0aGUgZmlsZS4gIEl0IG11c3QgYmUgYSBwb3dlciBvZiAyLiAgKi8KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTIKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2ludGVybmFsLmggYi9pbmNsdWRlL2NvZmYvaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjMjRiZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyOCArMCwwIEBACi0vKiBJbnRlcm5hbCBmb3JtYXQgb2YgQ09GRiBvYmplY3QgZmlsZSBkYXRhIHN0cnVjdHVyZXMsIGZvciBHTlUgQkZELgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LiAgKi8KLQotI2lmbmRlZiBHTlVfQ09GRl9JTlRFUk5BTF9ICi0jZGVmaW5lIEdOVV9DT0ZGX0lOVEVSTkFMX0ggMQotCi0vKiBGaXJzdCwgbWFrZSAic2lnbmVkIGNoYXIiIHdvcmssIGV2ZW4gb24gb2xkIGNvbXBpbGVycy4gKi8KLSNpZm5kZWYgc2lnbmVkCi0jaWZuZGVmIF9fU1REQ19fCi0jZGVmaW5lCXNpZ25lZAkJCS8qKi8KLSNlbmRpZgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGV4dHJhIHN0dWZmIGluIGEgUEUgaGVhZGVyLiAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfZmlsZWhkcgotewotICAvKiBET1MgaGVhZGVyIGRhdGEgZm9sbG93cyBmb3IgUEUgc3R1ZmYgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9tYWdpYzsJLyogTWFnaWMgbnVtYmVyLCAweDVhNGQgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9jYmxwOwkvKiBCeXRlcyBvbiBsYXN0IHBhZ2Ugb2YgZmlsZSwgMHg5MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2NwOwkJLyogUGFnZXMgaW4gZmlsZSwgMHgzICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY3JsYzsJLyogUmVsb2NhdGlvbnMsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2NwYXJoZHI7CS8qIFNpemUgb2YgaGVhZGVyIGluIHBhcmFncmFwaHMsIDB4NCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX21pbmFsbG9jOwkvKiBNaW5pbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9tYXhhbGxvYzsJLyogTWF4aW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZCwgMHhGRkZGICovCi0gIHVuc2lnbmVkIHNob3J0IGVfc3M7CQkvKiBJbml0aWFsIChyZWxhdGl2ZSkgU1MgdmFsdWUsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX3NwOwkJLyogSW5pdGlhbCBTUCB2YWx1ZSwgMHhiOCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2NzdW07CS8qIENoZWNrc3VtLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9pcDsJCS8qIEluaXRpYWwgSVAgdmFsdWUsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2NzOwkJLyogSW5pdGlhbCAocmVsYXRpdmUpIENTIHZhbHVlLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9sZmFybGM7CS8qIEZpbGUgYWRkcmVzcyBvZiByZWxvY2F0aW9uIHRhYmxlLCAweDQwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfb3ZubzsJLyogT3ZlcmxheSBudW1iZXIsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX3Jlc1s0XTsJLyogUmVzZXJ2ZWQgd29yZHMsIGFsbCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9vZW1pZDsJLyogT0VNIGlkZW50aWZpZXIgKGZvciBlX29lbWluZm8pLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9vZW1pbmZvOwkvKiBPRU0gaW5mb3JtYXRpb247IGVfb2VtaWQgc3BlY2lmaWMsIDB4MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX3JlczJbMTBdOwkvKiBSZXNlcnZlZCB3b3JkcywgYWxsIDB4MCAqLwotICBiZmRfdm1hICBlX2xmYW5ldzsJCS8qIEZpbGUgYWRkcmVzcyBvZiBuZXcgZXhlIGhlYWRlciwgMHg4MCAqLwotICB1bnNpZ25lZCBsb25nIGRvc19tZXNzYWdlWzE2XTsgLyogdGV4dCB3aGljaCBhbHdheXMgZm9sbG93cyBkb3MgaGVhZGVyICovCi0gIGJmZF92bWEgIG50X3NpZ25hdHVyZTsgICAJLyogcmVxdWlyZWQgTlQgc2lnbmF0dXJlLCAweDQ1NTAgKi8gCi19OwotCi1zdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkcgotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfZmlsZWhkciBwZTsKLQotICAvKiBzdGFuZGFyZCBjb2ZmICBpbnRlcm5hbCBpbmZvICovCi0gIHVuc2lnbmVkIHNob3J0IGZfbWFnaWM7CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIHVuc2lnbmVkIHNob3J0IGZfbnNjbnM7CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgbG9uZyBmX3RpbWRhdDsJCS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICBiZmRfdm1hIGZfc3ltcHRyOwkJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotICBsb25nIGZfbnN5bXM7CQkJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIHVuc2lnbmVkIHNob3J0IGZfb3B0aGRyOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9mbGFnczsJLyogZmxhZ3MJCQkqLwotICB1bnNpZ25lZCBzaG9ydCBmX3RhcmdldF9pZDsJLyogKFRJYzgwIHNwZWNpZmljKQkJKi8KLX07Ci0KLQotLyogQml0cyBmb3IgZl9mbGFnczoKLSAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCi0gKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0FSMTZXUglmaWxlIGlzIDE2LWJpdCBsaXR0bGUtZW5kaWFuCi0gKglGX0FSMzJXUglmaWxlIGlzIDMyLWJpdCBsaXR0bGUtZW5kaWFuCi0gKglGX0FSMzJXCQlmaWxlIGlzIDMyLWJpdCBiaWctZW5kaWFuCi0gKglGX0RZTkxPQUQJcnMvNjAwMCBhaXg6IGR5bmFtaWNhbGx5IGxvYWRhYmxlIHcvaW1wb3J0cyAmIGV4cG9ydHMKLSAqCUZfU0hST0JKCXJzLzYwMDAgYWl4OiBmaWxlIGlzIGEgc2hhcmVkIG9iamVjdAotICogICAgICBGX0RMTCAgICAgICAgICAgUEUgZm9ybWF0IERMTAotICovCi0KLSNkZWZpbmUJRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUJRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZQlGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lCUZfTFNZTVMJCSgweDAwMDgpCi0jZGVmaW5lCUZfQVIxNldSCSgweDAwODApCi0jZGVmaW5lCUZfQVIzMldSCSgweDAxMDApCi0jZGVmaW5lCUZfQVIzMlcgICAgIAkoMHgwMjAwKQotI2RlZmluZQlGX0RZTkxPQUQJKDB4MTAwMCkKLSNkZWZpbmUJRl9TSFJPQkoJKDB4MjAwMCkKLSNkZWZpbmUgRl9ETEwgICAgICAgICAgICgweDIwMDApCi0KLS8qIGV4dHJhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGluIHRoZSBvcHRpb25hbCBoZWFkZXIgKi8KLXR5cGVkZWYgc3RydWN0IF9JTUFHRV9EQVRBX0RJUkVDVE9SWSAKLXsKLSAgYmZkX3ZtYSBWaXJ0dWFsQWRkcmVzczsKLSAgbG9uZyAgICBTaXplOwotfSAgSU1BR0VfREFUQV9ESVJFQ1RPUlk7Ci0jZGVmaW5lIElNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTICAxNgotCi0vKiBEZWZhdWx0IGltYWdlIGJhc2UgZm9yIE5ULiAgKi8KLSNkZWZpbmUgTlRfRVhFX0lNQUdFX0JBU0UgMHg0MDAwMDAKLSNkZWZpbmUgTlRfRExMX0lNQUdFX0JBU0UgMHgxMDAwMDAwMAotCi0vKiBEZWZhdWx0IGltYWdlIGJhc2UgZm9yIEJlT1MuICovCi0jZGVmaW5lIEJFT1NfRVhFX0lNQUdFX0JBU0UgMHg4MDAwMDAwMAotI2RlZmluZSBCRU9TX0RMTF9JTUFHRV9CQVNFIDB4MTAwMDAwMDAKLQotLyogRXh0cmEgc3R1ZmYgaW4gYSBQRSBhb3V0aGRyICovCi0KLSNkZWZpbmUgUEVfREVGX1NFQ1RJT05fQUxJR05NRU5UIDB4MTAwMAotI2RlZmluZSBQRV9ERUZfRklMRV9BTElHTk1FTlQgMHgyMDAKLQotc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgCi17Ci0gIC8qIFBFIHN0dWZmICAqLwotICBiZmRfdm1hIEltYWdlQmFzZTsJCS8qIGFkZHJlc3Mgb2Ygc3BlY2lmaWMgbG9jYXRpb24gaW4gbWVtb3J5IHRoYXQKLQkJCQkgICBmaWxlIGlzIGxvY2F0ZWQsIE5UIGRlZmF1bHQgMHgxMDAwMCAqLwotCi0gIGJmZF92bWEgU2VjdGlvbkFsaWdubWVudDsJLyogc2VjdGlvbiBhbGlnbm1lbnQgZGVmYXVsdCAweDEwMDAgKi8KLSAgYmZkX3ZtYSBGaWxlQWxpZ25tZW50OwkvKiBmaWxlIGFsaWdubWVudCBkZWZhdWx0IDB4MjAwICovCi0gIHNob3J0ICAgTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOyAvKiBtaW5pbXVtIHZlcnNpb24gb2YgdGhlIG9wZXJhdGluZyAqLwotICBzaG9ydCAgIE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsgLyogc3lzdGVtIHJlcSdkIGZvciBleGUsIGRlZmF1bHQgdG8gMSovCi0gIHNob3J0ICAgTWFqb3JJbWFnZVZlcnNpb247CS8qIHVzZXIgZGVmaW5lYWJsZSBmaWVsZCB0byBzdG9yZSB2ZXJzaW9uIG9mICovCi0gIHNob3J0ICAgTWlub3JJbWFnZVZlcnNpb247CS8qIGV4ZSBvciBkbGwgYmVpbmcgY3JlYXRlZCwgZGVmYXVsdCB0byAwICovIAotICBzaG9ydCAgIE1ham9yU3Vic3lzdGVtVmVyc2lvbjsgLyogbWluaW11bSBzdWJzeXN0ZW0gdmVyc2lvbiByZXF1aXJlZCB0byAqLwotICBzaG9ydCAgIE1pbm9yU3Vic3lzdGVtVmVyc2lvbjsgLyogcnVuIGV4ZTsgZGVmYXVsdCB0byAzLjEgKi8KLSAgbG9uZyAgICBSZXNlcnZlZDE7CQkvKiBzZWVtcyB0byBiZSAwICovCi0gIGxvbmcgICAgU2l6ZU9mSW1hZ2U7CQkvKiBzaXplIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSBmb3IgcHJvZyAqLwotICBsb25nICAgIFNpemVPZkhlYWRlcnM7CS8qIHNpemUgb2YgUEUgaGVhZGVyIGFuZCBzZWN0aW9uIHRhYmxlICovCi0gIGxvbmcgICAgQ2hlY2tTdW07CQkvKiBzZXQgdG8gMCAqLwotICBzaG9ydCAgIFN1YnN5c3RlbTsJCi0KLSAgLyogdHlwZSBvZiBzdWJzeXN0ZW0gZXhlIHVzZXMgZm9yIHVzZXIgaW50ZXJmYWNlLAotICAgICBwb3NzaWJsZSB2YWx1ZXM6Ci0gICAgIDEgLSBOQVRJVkUgICBEb2Vzbid0IHJlcXVpcmUgYSBzdWJzeXN0ZW0KLSAgICAgMiAtIFdJTkRPV1NfR1VJIHJ1bnMgaW4gV2luZG93cyBHVUkgc3Vic3lzdGVtCi0gICAgIDMgLSBXSU5ET1dTX0NVSSBydW5zIGluIFdpbmRvd3MgY2hhciBzdWIuIChjb25zb2xlIGFwcCkKLSAgICAgNSAtIE9TMl9DVUkgcnVucyBpbiBPUy8yIGNoYXJhY3RlciBzdWJzeXN0ZW0KLSAgICAgNyAtIFBPU0lYX0NVSSBydW5zIGluIFBvc2l4IGNoYXJhY3RlciBzdWJzeXN0ZW0gKi8KLSAgc2hvcnQgICBEbGxDaGFyYWN0ZXJpc3RpY3M7CS8qIGZsYWdzIGZvciBETEwgaW5pdCwgdXNlIDAgKi8KLSAgYmZkX3ZtYSBTaXplT2ZTdGFja1Jlc2VydmU7CS8qIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVzZXJ2ZSAgKi8KLSAgYmZkX3ZtYSBTaXplT2ZTdGFja0NvbW1pdDsJLyogYW1vdW50IG9mIG1lbW9yeSBpbml0aWFsbHkgY29tbWl0dGVkIGZvciAKLQkJCQkgICBpbml0aWFsIHRocmVhZCdzIHN0YWNrLCBkZWZhdWx0IGlzIDB4MTAwMCAqLwotICBiZmRfdm1hIFNpemVPZkhlYXBSZXNlcnZlOwkvKiBhbW91bnQgb2YgdmlydHVhbCBtZW1vcnkgdG8gcmVzZXJ2ZSBhbmQgKi8KLSAgYmZkX3ZtYSBTaXplT2ZIZWFwQ29tbWl0OwkvKiBjb21taXQsIGRvbid0IGtub3cgd2hhdCB0byBkZWZhdXQgaXQgdG8gKi8KLSAgbG9uZyAgICBMb2FkZXJGbGFnczsJCS8qIGNhbiBwcm9iYWJseSBzZXQgdG8gMCAqLwotICBsb25nICAgIE51bWJlck9mUnZhQW5kU2l6ZXM7CS8qIG51bWJlciBvZiBlbnRyaWVzIGluIG5leHQgZW50cnksIDE2ICovCi0gIElNQUdFX0RBVEFfRElSRUNUT1JZIERhdGFEaXJlY3RvcnlbSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVNdOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGludGVybmFsX2FvdXRoZHIKLXsKLSAgc2hvcnQgbWFnaWM7CQkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIHNob3J0IHZzdGFtcDsJCQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgYmZkX3ZtYSB0c2l6ZTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBiZmRfdm1hIGRzaXplOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBiZmRfdm1hIGJzaXplOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBiZmRfdm1hIGVudHJ5OwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGJmZF92bWEgdGV4dF9zdGFydDsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgYmZkX3ZtYSBkYXRhX3N0YXJ0OwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotCi0gIC8qIGk5NjAgc3R1ZmYgKi8KLSAgdW5zaWduZWQgbG9uZyB0YWdlbnRyaWVzOwkvKiBudW1iZXIgb2YgdGFnIGVudHJpZXMgdG8gZm9sbG93ICovCi0KLSAgLyogUlMvNjAwMCBzdHVmZiAqLwotICB1bnNpZ25lZCBsb25nIG9fdG9jOwkJLyogYWRkcmVzcyBvZiBUT0MJCQkqLwotICBzaG9ydCBvX3NuZW50cnk7CQkvKiBzZWN0aW9uIG51bWJlciBmb3IgZW50cnkgcG9pbnQgKi8KLSAgc2hvcnQgb19zbnRleHQ7CQkvKiBzZWN0aW9uIG51bWJlciBmb3IgdGV4dAkqLwotICBzaG9ydCBvX3NuZGF0YTsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciBkYXRhCSovCi0gIHNob3J0IG9fc250b2M7CQkvKiBzZWN0aW9uIG51bWJlciBmb3IgdG9jCSovCi0gIHNob3J0IG9fc25sb2FkZXI7CQkvKiBzZWN0aW9uIG51bWJlciBmb3IgbG9hZGVyIHNlY3Rpb24gKi8KLSAgc2hvcnQgb19zbmJzczsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciBic3MJKi8KLSAgc2hvcnQgb19hbGdudGV4dDsJCS8qIG1heCBhbGlnbm1lbnQgZm9yIHRleHQJKi8KLSAgc2hvcnQgb19hbGduZGF0YTsJCS8qIG1heCBhbGlnbm1lbnQgZm9yIGRhdGEJKi8KLSAgc2hvcnQgb19tb2R0eXBlOwkJLyogTW9kdWxlIHR5cGUgZmllbGQsIDFSLFJFLFJPCSovCi0gIHNob3J0IG9fY3B1dHlwZTsJCS8qIEVuY29kZWQgQ1BVIHR5cGUJCSovCi0gIHVuc2lnbmVkIGxvbmcgb19tYXhzdGFjazsJLyogbWF4IHN0YWNrIHNpemUgYWxsb3dlZC4JKi8KLSAgdW5zaWduZWQgbG9uZyBvX21heGRhdGE7CS8qIG1heCBkYXRhIHNpemUgYWxsb3dlZC4JKi8KLQotICAvKiBFQ09GRiBzdHVmZiAqLwotICBiZmRfdm1hIGJzc19zdGFydDsJCS8qIEJhc2Ugb2YgYnNzIHNlY3Rpb24uCQkqLwotICBiZmRfdm1hIGdwX3ZhbHVlOwkJLyogR1AgcmVnaXN0ZXIgdmFsdWUuCQkqLwotICB1bnNpZ25lZCBsb25nIGdwcm1hc2s7CS8qIEdlbmVyYWwgcmVnaXN0ZXJzIHVzZWQuCSovCi0gIHVuc2lnbmVkIGxvbmcgY3BybWFza1s0XTsJLyogQ29wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQuCSovCi0gIHVuc2lnbmVkIGxvbmcgZnBybWFzazsJLyogRmxvYXRpbmcgcG9pbnRlciByZWdpc3RlcnMgdXNlZC4gICovCi0KLSAgLyogQXBvbGxvIHN0dWZmICovCi0gIGxvbmcgb19pbmxpYjsJCQkvKiBpbmxpYiBkYXRhICovCi0gIGxvbmcgb19zcmk7CQkJLyogU3RhdGljIFJlc291cmNlIEluZm9ybWF0aW9uICovCi0gIGxvbmcgdmlkWzJdOwkJCS8qIFZlcnNpb24gaWQgKi8KLQotCi0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyIHBlOwotCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTVE9SQUdFIENMQVNTRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhpcyB1c2VkIHRvIGJlIGRlZmluZWQgYXMgLTEsIGJ1dCBub3cgbl9zY2xhc3MgaXMgdW5zaWduZWQuICAqLwotI2RlZmluZSBDX0VGQ04JCTB4ZmYJLyogcGh5c2ljYWwgZW5kIG9mIGZ1bmN0aW9uCSovCi0jZGVmaW5lIENfTlVMTAkJMAotI2RlZmluZSBDX0FVVE8JCTEJLyogYXV0b21hdGljIHZhcmlhYmxlCQkqLwotI2RlZmluZSBDX0VYVAkJMgkvKiBleHRlcm5hbCBzeW1ib2wJCSovCi0jZGVmaW5lIENfU1RBVAkJMwkvKiBzdGF0aWMJCQkqLwotI2RlZmluZSBDX1JFRwkJNAkvKiByZWdpc3RlciB2YXJpYWJsZQkJKi8KLSNkZWZpbmUgQ19FWFRERUYJNQkvKiBleHRlcm5hbCBkZWZpbml0aW9uCQkqLwotI2RlZmluZSBDX0xBQkVMCQk2CS8qIGxhYmVsCQkJKi8KLSNkZWZpbmUgQ19VTEFCRUwJNwkvKiB1bmRlZmluZWQgbGFiZWwJCSovCi0jZGVmaW5lIENfTU9TCQk4CS8qIG1lbWJlciBvZiBzdHJ1Y3R1cmUJCSovCi0jZGVmaW5lIENfQVJHCQk5CS8qIGZ1bmN0aW9uIGFyZ3VtZW50CQkqLwotI2RlZmluZSBDX1NUUlRBRwkxMAkvKiBzdHJ1Y3R1cmUgdGFnCQkqLwotI2RlZmluZSBDX01PVQkJMTEJLyogbWVtYmVyIG9mIHVuaW9uCQkqLwotI2RlZmluZSBDX1VOVEFHCQkxMgkvKiB1bmlvbiB0YWcJCQkqLwotI2RlZmluZSBDX1RQREVGCQkxMwkvKiB0eXBlIGRlZmluaXRpb24JCSovCi0jZGVmaW5lIENfVVNUQVRJQwkxNAkvKiB1bmRlZmluZWQgc3RhdGljCQkqLwotI2RlZmluZSBDX0VOVEFHCQkxNQkvKiBlbnVtZXJhdGlvbiB0YWcJCSovCi0jZGVmaW5lIENfTU9FCQkxNgkvKiBtZW1iZXIgb2YgZW51bWVyYXRpb24JKi8KLSNkZWZpbmUgQ19SRUdQQVJNCTE3CS8qIHJlZ2lzdGVyIHBhcmFtZXRlcgkJKi8KLSNkZWZpbmUgQ19GSUVMRAkJMTgJLyogYml0IGZpZWxkCQkJKi8KLSNkZWZpbmUgQ19BVVRPQVJHCTE5CS8qIGF1dG8gYXJndW1lbnQJCSovCi0jZGVmaW5lIENfTEFTVEVOVAkyMAkvKiBkdW1teSBlbnRyeSAoZW5kIG9mIGJsb2NrKQkqLwotI2RlZmluZSBDX0JMT0NLCQkxMDAJLyogIi5iYiIgb3IgIi5lYiIJCSovCi0jZGVmaW5lIENfRkNOCQkxMDEJLyogIi5iZiIgb3IgIi5lZiIJCSovCi0jZGVmaW5lIENfRU9TCQkxMDIJLyogZW5kIG9mIHN0cnVjdHVyZQkJKi8KLSNkZWZpbmUgQ19GSUxFCQkxMDMJLyogZmlsZSBuYW1lCQkJKi8KLSNkZWZpbmUgQ19MSU5FCQkxMDQJLyogbGluZSAjIHJlZm9ybWF0dGVkIGFzIHN5bWJvbCB0YWJsZSBlbnRyeSAqLwotI2RlZmluZSBDX0FMSUFTCSAJMTA1CS8qIGR1cGxpY2F0ZSB0YWcJCSovCi0jZGVmaW5lIENfSElEREVOCTEwNgkvKiBleHQgc3ltYm9sIGluIGRtZXJ0IHB1YmxpYyBsaWIgKi8KLQotI2RlZmluZSBDX1dFQUtFWFQJMTI3CS8qIHdlYWsgc3ltYm9sIC0tIEdOVSBleHRlbnNpb24gKi8KLQotLyogTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgVEljODAgKi8KLSNkZWZpbmUgQ19VRVhUCQkxOQkvKiBUZW50YXRpdmUgZXh0ZXJuYWwgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBDX1NUQVRMQUIJMjAJLyogU3RhdGljIGxvYWQgdGltZSBsYWJlbCAqLwotI2RlZmluZSBDX0VYVExBQgkyMQkvKiBFeHRlcm5hbCBsb2FkIHRpbWUgbGFiZWwgKi8KLSNkZWZpbmUgQ19TWVNURU0JMjMJLyogU3lzdGVtIFdpZGUgdmFyaWFibGUgKi8KLQotLyogTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgV0lORE9XU19OVCAgICovCi0jZGVmaW5lIENfU0VDVElPTiAgICAgICAxMDQgICAgIC8qIHNlY3Rpb24gbmFtZSAqLwotI2RlZmluZSBDX05UX1dFQUsJMTA1CS8qIHdlYWsgZXh0ZXJuYWwgKi8KLQotIC8qIE5ldyBzdG9yYWdlIGNsYXNzZXMgZm9yIDgwOTYwICovCi0KLS8qIENfTEVBRlBST0MgaXMgb2Jzb2xldGUuICBVc2UgQ19MRUFGRVhUIG9yIENfTEVBRlNUQVQgKi8KLSNkZWZpbmUgQ19MRUFGUFJPQwkxMDgJLyogTGVhZiBwcm9jZWR1cmUsICJjYWxsIiB2aWEgQkFMICovCi0KLSNkZWZpbmUgQ19TQ0FMTAkJMTA3CS8qIFByb2NlZHVyZSByZWFjaGFibGUgdmlhIHN5c3RlbSBjYWxsICovCi0jZGVmaW5lIENfTEVBRkVYVCAgICAgICAxMDgJLyogRXh0ZXJuYWwgbGVhZiAqLwotI2RlZmluZSBDX0xFQUZTVEFUICAgICAgMTEzCS8qIFN0YXRpYyBsZWFmICovCi0jZGVmaW5lIENfT1BUVkFSCTEwOQkvKiBPcHRpbWl6ZWQgdmFyaWFibGUJCSovCi0jZGVmaW5lIENfREVGSU5FCTExMAkvKiBQcmVwcm9jZXNzb3IgI2RlZmluZQkJKi8KLSNkZWZpbmUgQ19QUkFHTUEJMTExCS8qIEFkdmljZSB0byBjb21waWxlciBvciBsaW5rZXIJKi8KLSNkZWZpbmUgQ19TRUdNRU5UCTExMgkvKiA4MDk2MCBzZWdtZW50IG5hbWUJCSovCi0KLSAgLyogU3RvcmFnZSBjbGFzc2VzIGZvciBtODhrICovCi0jZGVmaW5lIENfU0hBRE9XICAgICAgICAxMDcgICAgIC8qIHNoYWRvdyBzeW1ib2wgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ19WRVJTSU9OICAgICAgIDEwOCAgICAgLyogY29mZiB2ZXJzaW9uIHN5bWJvbCAgICAgICAgICAqLwotCi0gLyogTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgUlMvNjAwMCAqLwotI2RlZmluZSBDX0hJREVYVCAgICAgICAgMTA3CS8qIFVuLW5hbWVkIGV4dGVybmFsIHN5bWJvbCAqLwotI2RlZmluZSBDX0JJTkNMICAgICAgICAgMTA4CS8qIE1hcmtzIGJlZ2lubmluZyBvZiBpbmNsdWRlIGZpbGUgKi8KLSNkZWZpbmUgQ19FSU5DTCAgICAgICAgIDEwOQkvKiBNYXJrcyBlbmRpbmcgb2YgaW5jbHVkZSBmaWxlICovCi0KLSAvKiBzdG9yYWdlIGNsYXNzZXMgZm9yIHN0YWIgc3ltYm9scyBmb3IgUlMvNjAwMCAqLwotI2RlZmluZSBDX0dTWU0gICAgICAgICAgKDB4ODApCi0jZGVmaW5lIENfTFNZTSAgICAgICAgICAoMHg4MSkKLSNkZWZpbmUgQ19QU1lNICAgICAgICAgICgweDgyKQotI2RlZmluZSBDX1JTWU0gICAgICAgICAgKDB4ODMpCi0jZGVmaW5lIENfUlBTWU0gICAgICAgICAoMHg4NCkKLSNkZWZpbmUgQ19TVFNZTSAgICAgICAgICgweDg1KQotI2RlZmluZSBDX1RDU1lNICAgICAgICAgKDB4ODYpCi0jZGVmaW5lIENfQkNPTU0gICAgICAgICAoMHg4NykKLSNkZWZpbmUgQ19FQ09NTCAgICAgICAgICgweDg4KQotI2RlZmluZSBDX0VDT01NICAgICAgICAgKDB4ODkpCi0jZGVmaW5lIENfREVDTCAgICAgICAgICAoMHg4YykKLSNkZWZpbmUgQ19FTlRSWSAgICAgICAgICgweDhkKQotI2RlZmluZSBDX0ZVTiAgICAgICAgICAgKDB4OGUpCi0jZGVmaW5lIENfQlNUQVQgICAgICAgICAoMHg4ZikKLSNkZWZpbmUgQ19FU1RBVCAgICAgICAgICgweDkwKQotCi0vKiBTdG9yYWdlIGNsYXNzZXMgZm9yIFRodW1iIHN5bWJvbHMgKi8KLSNkZWZpbmUgQ19USFVNQkVYVCAgICAgICgxMjggKyBDX0VYVCkJCS8qIDEzMCAqLwotI2RlZmluZSBDX1RIVU1CU1RBVCAgICAgKDEyOCArIENfU1RBVCkJCS8qIDEzMSAqLwotI2RlZmluZSBDX1RIVU1CTEFCRUwgICAgKDEyOCArIENfTEFCRUwpCQkvKiAxMzQgKi8KLSNkZWZpbmUgQ19USFVNQkVYVEZVTkMgIChDX1RIVU1CRVhUICArIDIwKQkvKiAxNTAgKi8KLSNkZWZpbmUgQ19USFVNQlNUQVRGVU5DIChDX1RIVU1CU1RBVCArIDIwKQkvKiAxNTEgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBTQ05OTUxFTiAoOCkKLQotc3RydWN0IGludGVybmFsX3NjbmhkcgotewotICBjaGFyIHNfbmFtZVtTQ05OTUxFTl07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0KLSAgLyogUGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIuCi0gICAgIEluIHRoZSBwZWkgZm9ybWF0LCB0aGlzIGZpZWxkIGlzIHRoZSB2aXJ0dWFsIHNlY3Rpb24gc2l6ZQotICAgICAodGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gYWZ0ZXIgYmVpbmcgbG9hZGVkIGludCBtZW1vcnkpLAotICAgICBOT1QgdGhlIHBoeXNpY2FsIGFkZHJlc3MuICAqLwotICBiZmRfdm1hIHNfcGFkZHI7Ci0KLSAgYmZkX3ZtYSBzX3ZhZGRyOwkJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICBiZmRfdm1hIHNfc2l6ZTsJCS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0gIGJmZF92bWEgc19zY25wdHI7CQkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICBiZmRfdm1hIHNfcmVscHRyOwkJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICBiZmRfdm1hIHNfbG5ub3B0cjsJCS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotICB1bnNpZ25lZCBsb25nIHNfbnJlbG9jOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0gIHVuc2lnbmVkIGxvbmcgc19ubG5ubzsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotICBsb25nIHNfZmxhZ3M7CQkJLyogZmxhZ3MJCQkqLwotICBsb25nIHNfYWxpZ247CQkJLyogdXNlZCBvbiBJOTYwCQkJKi8KLX07Ci0KLS8qCi0gKiBzX2ZsYWdzICJ0eXBlIgotICovCi0jZGVmaW5lIFNUWVBfUkVHCSAoMHgwMDAwKQkvKiAicmVndWxhciI6IGFsbG9jYXRlZCwgcmVsb2NhdGVkLCBsb2FkZWQgKi8KLSNkZWZpbmUgU1RZUF9EU0VDVAkgKDB4MDAwMSkJLyogImR1bW15IjogIHJlbG9jYXRlZCBvbmx5Ki8KLSNkZWZpbmUgU1RZUF9OT0xPQUQJICgweDAwMDIpCS8qICJub2xvYWQiOiBhbGxvY2F0ZWQsIHJlbG9jYXRlZCwgbm90IGxvYWRlZCAqLwotI2RlZmluZSBTVFlQX0dST1VQCSAoMHgwMDA0KQkvKiAiZ3JvdXBlZCI6IGZvcm1lZCBvZiBpbnB1dCBzZWN0aW9ucyAqLwotI2RlZmluZSBTVFlQX1BBRAkgKDB4MDAwOCkJLyogInBhZGRpbmciOiBub3QgYWxsb2NhdGVkLCBub3QgcmVsb2NhdGVkLCBsb2FkZWQgKi8KLSNkZWZpbmUgU1RZUF9DT1BZCSAoMHgwMDEwKQkvKiAiY29weSI6IGZvciBkZWNpc2lvbiBmdW5jdGlvbiB1c2VkIGJ5IGZpZWxkIHVwZGF0ZTsgIG5vdCBhbGxvY2F0ZWQsIG5vdCByZWxvY2F0ZWQsCi0JCQkJCQkJCQkgICAgIGxvYWRlZDsgcmVsb2MgJiBsaW5lbm8gZW50cmllcyBwcm9jZXNzZWQgbm9ybWFsbHkgKi8KLSNkZWZpbmUgU1RZUF9URVhUCSAoMHgwMDIwKQkvKiBzZWN0aW9uIGNvbnRhaW5zIHRleHQgb25seSAqLwotI2RlZmluZSBTX1NIUlNFRwkgKDB4MDAyMCkJLyogSW4gM2IgVXBkYXRlIGZpbGVzIChvdXRwdXQgb2Ygb2dlbiksIHNlY3Rpb25zIHdoaWNoIGFwcGVhciBpbiBTSEFSRUQgc2VnbWVudHMgb2YgdGhlIFBmaWxlCi0JCQkJCQkJCQkgICAgIHdpbGwgaGF2ZSB0aGUgU19TSFJTRUcgZmxhZyBzZXQgYnkgb2dlbiwgdG8gaW5mb3JtIGR1ZnIgdGhhdCB1cGRhdGluZyAxIGNvcHkgb2YgdGhlIHByb2MuIHdpbGwKLQkJCQkJCQkJCSAgICAgdXBkYXRlIGFsbCBwcm9jZXNzIGludm9jYXRpb25zLiAqLwotI2RlZmluZSBTVFlQX0RBVEEJICgweDAwNDApCS8qIHNlY3Rpb24gY29udGFpbnMgZGF0YSBvbmx5ICovCi0jZGVmaW5lIFNUWVBfQlNTCSAoMHgwMDgwKQkvKiBzZWN0aW9uIGNvbnRhaW5zIGJzcyBvbmx5ICovCi0jZGVmaW5lIFNfTkVXRkNOCSAoMHgwMTAwKQkvKiBJbiBhIG1pbmltYWwgZmlsZSBvciBhbiB1cGRhdGUgZmlsZSwgYSBuZXcgZnVuY3Rpb24gKGFzIGNvbXBhcmVkIHdpdGggYSByZXBsYWNlZCBmdW5jdGlvbikgKi8KLSNkZWZpbmUgU1RZUF9JTkZPCSAoMHgwMjAwKQkvKiBjb21tZW50OiBub3QgYWxsb2NhdGVkIG5vdCByZWxvY2F0ZWQsIG5vdCBsb2FkZWQgKi8KLSNkZWZpbmUgU1RZUF9PVkVSCSAoMHgwNDAwKQkvKiBvdmVybGF5OiByZWxvY2F0ZWQgbm90IGFsbG9jYXRlZCBvciBsb2FkZWQgKi8KLSNkZWZpbmUgU1RZUF9MSUIJICgweDA4MDApCS8qIGZvciAubGliOiBzYW1lIGFzIElORk8gKi8KLSNkZWZpbmUgU1RZUF9NRVJHRQkgKDB4MjAwMCkJLyogbWVyZ2Ugc2VjdGlvbiAtLSBjb21iaW5lcyB3aXRoIHRleHQsIGRhdGEgb3IgYnNzIHNlY3Rpb25zIG9ubHkgKi8KLSNkZWZpbmUgU1RZUF9SRVZFUlNFX1BBRCAoMHg0MDAwKQkvKiBzZWN0aW9uIHdpbGwgYmUgcGFkZGVkIHdpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zIHdoZXJldmVyIHBhZGRpbmcgaXMgbmVjZXNzYXJ5IGFuZCB0aGVyZSBpcyBhCi0JCQkJCQotCQkJCQkJCQkJICAgICB3b3JkIG9mIGNvbnRpZ3VvdXMgYnl0ZXMKLQkJCQkJCQkJCSAgICAgYmVnaW5uaW5nIG9uIGEgd29yZCBib3VuZGFyeS4gKi8KLQotI2RlZmluZSBTVFlQX0xJVAkweDgwMjAJLyogTGl0ZXJhbCBkYXRhIChsaWtlIFNUWVBfVEVYVCkgKi8KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfbGluZW5vCi17Ci0gIHVuaW9uCi0gIHsKLSAgICBsb25nIGxfc3ltbmR4OwkJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0gICAgbG9uZyBsX3BhZGRyOwkJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0gIH0gICAgIGxfYWRkcjsKLSAgdW5zaWduZWQgbG9uZyBsX2xubm87CQkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBTWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRElNTlVNCQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGludGVybmFsX3N5bWVudAotewotICB1bmlvbgotICB7Ci0gICAgY2hhciBfbl9uYW1lW1NZTU5NTEVOXTsJLyogb2xkIENPRkYgdmVyc2lvbgkqLwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIGxvbmcgX25femVyb2VzOwkJLyogbmV3ID09IDAJCSovCi0gICAgICBsb25nIF9uX29mZnNldDsJCS8qIG9mZnNldCBpbnRvIHN0cmluZyB0YWJsZSAqLwotICAgIH0gICAgICBfbl9uOwotICAgIGNoYXIgKl9uX25wdHJbMl07CQkvKiBhbGxvd3MgZm9yIG92ZXJsYXlpbmcJKi8KLSAgfSAgICAgX247Ci0gIGxvbmcgbl92YWx1ZTsJCQkvKiB2YWx1ZSBvZiBzeW1ib2wJCSovCi0gIHNob3J0IG5fc2NudW07CQkvKiBzZWN0aW9uIG51bWJlcgkJKi8KLSAgdW5zaWduZWQgc2hvcnQgbl9mbGFnczsJLyogY29weSBvZiBmbGFncyBmcm9tIGZpbGhkcgkqLwotICB1bnNpZ25lZCBzaG9ydCBuX3R5cGU7CS8qIHR5cGUgYW5kIGRlcml2ZWQgdHlwZQkqLwotICB1bnNpZ25lZCBjaGFyIG5fc2NsYXNzOwkvKiBzdG9yYWdlIGNsYXNzCQkqLwotICB1bnNpZ25lZCBjaGFyIG5fbnVtYXV4OwkvKiBudW1iZXIgb2YgYXV4LiBlbnRyaWVzCSovCi19OwotCi0jZGVmaW5lIG5fbmFtZQkJX24uX25fbmFtZQotI2RlZmluZSBuX3plcm9lcwlfbi5fbl9uLl9uX3plcm9lcwotI2RlZmluZSBuX29mZnNldAlfbi5fbl9uLl9uX29mZnNldAotCi0KLS8qIFJlbG9jYXRhYmxlIHN5bWJvbHMgaGF2ZSBudW1iZXIgb2YgdGhlIHNlY3Rpb24gaW4gd2hpY2ggdGhleSBhcmUgZGVmaW5lZCwKLSAgIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAqLwotCi0jZGVmaW5lIE5fVU5ERUYJKChzaG9ydCkwKQkvKiB1bmRlZmluZWQgc3ltYm9sICovCi0jZGVmaW5lIE5fQUJTCSgoc2hvcnQpLTEpCS8qIHZhbHVlIG9mIHN5bWJvbCBpcyBhYnNvbHV0ZSAqLwotI2RlZmluZSBOX0RFQlVHCSgoc2hvcnQpLTIpCS8qIGRlYnVnZ2luZyBzeW1ib2wgLS0gdmFsdWUgaXMgbWVhbmluZ2xlc3MgKi8KLSNkZWZpbmUgTl9UVgkoKHNob3J0KS0zKQkvKiBpbmRpY2F0ZXMgc3ltYm9sIG5lZWRzIHByZWxvYWQgdHJhbnNmZXIgdmVjdG9yICovCi0jZGVmaW5lIFBfVFYJKChzaG9ydCktNCkJLyogaW5kaWNhdGVzIHN5bWJvbCBuZWVkcyBwb3N0bG9hZCB0cmFuc2ZlciB2ZWN0b3IqLwotCi0vKgotICogVHlwZSBvZiBhIHN5bWJvbCwgaW4gbG93IE4gYml0cyBvZiB0aGUgd29yZAotICovCi0jZGVmaW5lIFRfTlVMTAkJMAotI2RlZmluZSBUX1ZPSUQJCTEJLyogZnVuY3Rpb24gYXJndW1lbnQgKG9ubHkgdXNlZCBieSBjb21waWxlcikgKi8KLSNkZWZpbmUgVF9DSEFSCQkyCS8qIGNoYXJhY3RlcgkJKi8KLSNkZWZpbmUgVF9TSE9SVAkJMwkvKiBzaG9ydCBpbnRlZ2VyCSovCi0jZGVmaW5lIFRfSU5UCQk0CS8qIGludGVnZXIJCSovCi0jZGVmaW5lIFRfTE9ORwkJNQkvKiBsb25nIGludGVnZXIJCSovCi0jZGVmaW5lIFRfRkxPQVQJCTYJLyogZmxvYXRpbmcgcG9pbnQJKi8KLSNkZWZpbmUgVF9ET1VCTEUJNwkvKiBkb3VibGUgd29yZAkJKi8KLSNkZWZpbmUgVF9TVFJVQ1QJOAkvKiBzdHJ1Y3R1cmUgCQkqLwotI2RlZmluZSBUX1VOSU9OCQk5CS8qIHVuaW9uIAkJKi8KLSNkZWZpbmUgVF9FTlVNCQkxMAkvKiBlbnVtZXJhdGlvbiAJCSovCi0jZGVmaW5lIFRfTU9FCQkxMQkvKiBtZW1iZXIgb2YgZW51bWVyYXRpb24qLwotI2RlZmluZSBUX1VDSEFSCQkxMgkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIJKi8KLSNkZWZpbmUgVF9VU0hPUlQJMTMJLyogdW5zaWduZWQgc2hvcnQJKi8KLSNkZWZpbmUgVF9VSU5UCQkxNAkvKiB1bnNpZ25lZCBpbnRlZ2VyCSovCi0jZGVmaW5lIFRfVUxPTkcJCTE1CS8qIHVuc2lnbmVkIGxvbmcJKi8KLSNkZWZpbmUgVF9MTkdEQkwJMTYJLyogbG9uZyBkb3VibGUJCSovCi0KLS8qCi0gKiBkZXJpdmVkIHR5cGVzLCBpbiBuX3R5cGUKLSovCi0jZGVmaW5lIERUX05PTgkJKDApCS8qIG5vIGRlcml2ZWQgdHlwZSAqLwotI2RlZmluZSBEVF9QVFIJCSgxKQkvKiBwb2ludGVyICovCi0jZGVmaW5lIERUX0ZDTgkJKDIpCS8qIGZ1bmN0aW9uICovCi0jZGVmaW5lIERUX0FSWQkJKDMpCS8qIGFycmF5ICovCi0KLSNkZWZpbmUgQlRZUEUoeCkJKCh4KSAmIE5fQlRNQVNLKQotI2RlZmluZSBEVFlQRSh4KQkoKCh4KSAmIE5fVE1BU0spID4+IE5fQlRTSEZUKQotCi0jZGVmaW5lIElTUFRSKHgpIFwKLSAgKCgodW5zaWduZWQgbG9uZykgKHgpICYgTl9UTUFTSykgPT0gKCh1bnNpZ25lZCBsb25nKSBEVF9QVFIgPDwgTl9CVFNIRlQpKQotI2RlZmluZSBJU0ZDTih4KSBcCi0gICgoKHVuc2lnbmVkIGxvbmcpICh4KSAmIE5fVE1BU0spID09ICgodW5zaWduZWQgbG9uZykgRFRfRkNOIDw8IE5fQlRTSEZUKSkKLSNkZWZpbmUgSVNBUlkoeCkgXAotICAoKCh1bnNpZ25lZCBsb25nKSAoeCkgJiBOX1RNQVNLKSA9PSAoKHVuc2lnbmVkIGxvbmcpIERUX0FSWSA8PCBOX0JUU0hGVCkpCi0jZGVmaW5lIElTVEFHKHgpIFwKLSAgKCh4KSA9PSBDX1NUUlRBRyB8fCAoeCkgPT0gQ19VTlRBRyB8fCAoeCkgPT0gQ19FTlRBRykKLSNkZWZpbmUgREVDUkVGKHgpIFwKLSAgKCgoKHgpID4+IE5fVFNISUZUKSAmIH4gTl9CVE1BU0spIHwgKCh4KSAmIE5fQlRNQVNLKSkKLQotdW5pb24gaW50ZXJuYWxfYXV4ZW50Ci17Ci0gIHN0cnVjdAotICB7Ci0KLSAgICB1bmlvbgotICAgIHsKLSAgICAgIGxvbmcgbDsJCQkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0gICAgICBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpwOwotICAgIH0gICAgIHhfdGFnbmR4OwotCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QKLSAgICAgIHsKLQl1bnNpZ25lZCBzaG9ydCB4X2xubm87CS8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JdW5zaWduZWQgc2hvcnQgeF9zaXplOwkvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotICAgICAgfSAgICAgIHhfbG5zejsKLSAgICAgIGxvbmcgeF9mc2l6ZTsJCS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLSAgICB9ICAgICB4X21pc2M7Ci0KLSAgICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdAotICAgICAgewkJCQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQlsb25nIHhfbG5ub3B0cjsJCS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JdW5pb24KLQl7CQkJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JICBsb25nIGw7Ci0JICBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpwOwotCX0gICAgIHhfZW5kbmR4OwotICAgICAgfSAgICAgIHhfZmNuOwotCi0gICAgICBzdHJ1Y3QKLSAgICAgIHsJCQkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JdW5zaWduZWQgc2hvcnQgeF9kaW1lbltESU1OVU1dOwotICAgICAgfSAgICAgIHhfYXJ5OwotICAgIH0gICAgIHhfZmNuYXJ5OwotCi0gICAgdW5zaWduZWQgc2hvcnQgeF90dm5keDsJLyogdHYgaW5kZXggKi8KLSAgfSAgICAgIHhfc3ltOwotCi0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIHhfZm5hbWVbRklMTk1MRU5dOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIGxvbmcgeF96ZXJvZXM7Ci0gICAgICBsb25nIHhfb2Zmc2V0OwotICAgIH0gICAgICB4X247Ci0gIH0gICAgIHhfZmlsZTsKLQotICBzdHJ1Y3QKLSAgewotICAgIGxvbmcgeF9zY25sZW47CQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotICAgIHVuc2lnbmVkIHNob3J0IHhfbnJlbG9jOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotICAgIHVuc2lnbmVkIHNob3J0IHhfbmxpbm5vOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotICAgIHVuc2lnbmVkIGxvbmcgeF9jaGVja3N1bTsJLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0gZm9yIFBFICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF9hc3NvY2lhdGVkOyAvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4IGZvciBQRSAqLwotICAgIHVuc2lnbmVkIGNoYXIgeF9jb21kYXQ7CS8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyIGZvciBQRSAqLwotICB9ICAgICAgeF9zY247Ci0KLSAgc3RydWN0Ci0gIHsKLSAgICBsb25nIHhfdHZmaWxsOwkJLyogdHYgZmlsbCB2YWx1ZSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHhfdHZsZW47CS8qIGxlbmd0aCBvZiAudHYgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X3R2cmFuWzJdOwkvKiB0diByYW5nZSAqLwotICB9ICAgICAgeF90djsJCQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKiBSUy82MDAwLXNwZWNpZmljIGF1eGVudCAtIGxhc3QgYXV4ZW50IGZvciBldmVyeSBleHRlcm5hbCBzeW1ib2wKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgc3RydWN0Ci0gIHsKLSAgICB1bmlvbgotICAgICAgewkJCQkvKiBjc2VjdCBsZW5ndGggb3IgZW5jbG9zaW5nIGNzZWN0ICovCi0JbG9uZyBsOwotCXN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnA7Ci0gICAgICB9IHhfc2NubGVuOwotICAgIGxvbmcgeF9wYXJtaGFzaDsJCS8qIHBhcm0gdHlwZSBoYXNoIGluZGV4ICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF9zbmhhc2g7CS8qIHNlY3QgbnVtIHdpdGggcGFybSBoYXNoICovCi0gICAgdW5zaWduZWQgY2hhciB4X3NtdHlwOwkvKiBzeW1ib2wgYWxpZ24gYW5kIHR5cGUgKi8KLSAgICAvKiAwLTQgLSBMb2cgMiBvZiBhbGlnbm1lbnQgKi8KLSAgICAvKiA1LTcgLSBzeW1ib2wgdHlwZSAqLwotICAgIHVuc2lnbmVkIGNoYXIgeF9zbWNsYXM7CS8qIHN0b3JhZ2UgbWFwcGluZyBjbGFzcyAqLwotICAgIGxvbmcgeF9zdGFiOwkJLyogZGJ4IHN0YWIgaW5mbyBpbmRleCAqLwotICAgIHVuc2lnbmVkIHNob3J0IHhfc25zdGFiOwkvKiBzZWN0IG51bSB3aXRoIGRieCBzdGFiICovCi0gIH0gICAgICB4X2NzZWN0OwkJLyogY3NlY3QgZGVmaW5pdGlvbiBpbmZvcm1hdGlvbiAqLwotCi0vKiB4X3NtdHlwIHZhbHVlczogICovCi0KLSNkZWZpbmUJU01UWVBfQUxJR04oeCkJKCh4KSA+PiAzKQkvKiBsb2cyIG9mIGFsaWdubWVudCAqLwotI2RlZmluZQlTTVRZUF9TTVRZUCh4KQkoKHgpICYgMHg3KQkvKiBzeW1ib2wgdHlwZSAqLwotLyogU3ltYm9sIHR5cGUgdmFsdWVzOiAgKi8KLSNkZWZpbmUJWFRZX0VSCTAJCS8qIEV4dGVybmFsIHJlZmVyZW5jZSAqLwotI2RlZmluZQlYVFlfU0QJMQkJLyogQ3NlY3QgZGVmaW5pdGlvbiAqLwotI2RlZmluZQlYVFlfTEQJMgkJLyogTGFiZWwgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBYVFlfQ00JMwkJLyogLkJTUyAqLwotI2RlZmluZQlYVFlfRU0JNAkJLyogRXJyb3IgbWVzc2FnZSAqLwotI2RlZmluZQlYVFlfVVMJNQkJLyogIlJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UiICovCi0KLS8qIHhfc21jbGFzIHZhbHVlczogICovCi0KLSNkZWZpbmUJWE1DX1BSCTAJCS8qIFJlYWQtb25seSBwcm9ncmFtIGNvZGUgKi8KLSNkZWZpbmUJWE1DX1JPCTEJCS8qIFJlYWQtb25seSBjb25zdGFudCAqLwotI2RlZmluZQlYTUNfREIJMgkJLyogUmVhZC1vbmx5IGRlYnVnIGRpY3Rpb25hcnkgdGFibGUgKi8KLSNkZWZpbmUJWE1DX1RDCTMJCS8qIFJlYWQtd3JpdGUgZ2VuZXJhbCBUT0MgZW50cnkgKi8KLSNkZWZpbmUJWE1DX1VBCTQJCS8qIFJlYWQtd3JpdGUgdW5jbGFzc2lmaWVkICovCi0jZGVmaW5lCVhNQ19SVwk1CQkvKiBSZWFkLXdyaXRlIGRhdGEgKi8KLSNkZWZpbmUJWE1DX0dMCTYJCS8qIFJlYWQtb25seSBnbG9iYWwgbGlua2FnZSAqLwotI2RlZmluZQlYTUNfWE8JNwkJLyogUmVhZC1vbmx5IGV4dGVuZGVkIG9wZXJhdGlvbiAqLwotI2RlZmluZQlYTUNfU1YJOAkJLyogUmVhZC1vbmx5IHN1cGVydmlzb3IgY2FsbCAqLwotI2RlZmluZQlYTUNfQlMJOQkJLyogUmVhZC13cml0ZSBCU1MgKi8KLSNkZWZpbmUJWE1DX0RTCTEwCQkvKiBSZWFkLXdyaXRlIGRlc2NyaXB0b3IgY3NlY3QgKi8KLSNkZWZpbmUJWE1DX1VDCTExCQkvKiBSZWFkLXdyaXRlIHVubmFtZWQgRm9ydHJhbiBjb21tb24gKi8KLSNkZWZpbmUJWE1DX1RJCTEyCQkvKiBSZWFkLW9ubHkgdHJhY2ViYWNrIGluZGV4IGNzZWN0ICovCi0jZGVmaW5lCVhNQ19UQgkxMwkJLyogUmVhZC1vbmx5IHRyYWNlYmFjayB0YWJsZSBjc2VjdCAqLwotLyogCQkxNAk/Pz8gKi8KLSNkZWZpbmUJWE1DX1RDMAkxNQkJLyogUmVhZC13cml0ZSBUT0MgYW5jaG9yICovCi0jZGVmaW5lIFhNQ19URAkxNgkJLyogUmVhZC13cml0ZSBkYXRhIGluIFRPQyAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogIEk5NjAtc3BlY2lmaWMgKjJuZCogYXV4LiBlbnRyeSBmb3JtYXRzCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIHN0cnVjdAotICB7Ci0gICAgLyogVGhpcyBpcyBhIHZlcnkgb2xkIHR5cG8gdGhhdCBrZWVwcyBnZXR0aW5nIHByb3BhZ2F0ZWQuICovCi0jZGVmaW5lIHhfc3RkaW5keCB4X3N0aW5keAotICAgIGxvbmcgeF9zdGluZHg7CQkvKiBzeXMuIHRhYmxlIGVudHJ5ICovCi0gIH0gICAgICB4X3NjOwkJCS8qIHN5c3RlbSBjYWxsIGVudHJ5ICovCi0KLSAgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBsb25nIHhfYmFsbnRyeTsJLyogQkFMIGVudHJ5IHBvaW50ICovCi0gIH0gICAgICB4X2JhbDsJCQkvKiBCQUwtY2FsbGFibGUgZnVuY3Rpb24gKi8KLQotICBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIGxvbmcgeF90aW1lc3RhbXA7CS8qIHRpbWUgc3RhbXAgKi8KLSAgICBjaGFyIHhfaWRzdHJpbmdbMjBdOwkvKiBwcm9kdWNlciBpZGVudGl0eSBzdHJpbmcgKi8KLSAgfSAgICAgIHhfaWRlbnQ7CQkvKiBQcm9kdWNlciBpZGVudCBpbmZvICovCi0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfcmVsb2MKLXsKLSAgYmZkX3ZtYSByX3ZhZGRyOwkJLyogVmlydHVhbCBhZGRyZXNzIG9mIHJlZmVyZW5jZSAqLwotICBsb25nIHJfc3ltbmR4OwkJLyogSW5kZXggaW50byBzeW1ib2wgdGFibGUJKi8KLSAgdW5zaWduZWQgc2hvcnQgcl90eXBlOwkvKiBSZWxvY2F0aW9uIHR5cGUJCSovCi0gIHVuc2lnbmVkIGNoYXIgcl9zaXplOwkJLyogVXNlZCBieSBSUy82MDAwIGFuZCBFQ09GRgkqLwotICB1bnNpZ25lZCBjaGFyIHJfZXh0ZXJuOwkvKiBVc2VkIGJ5IEVDT0ZGCQkqLwotICB1bnNpZ25lZCBsb25nIHJfb2Zmc2V0OwkvKiBVc2VkIGJ5IEFscGhhIEVDT0ZGLCBTUEFSQywgb3RoZXJzICovCi19OwotCi0jZGVmaW5lIFJfRElSMTYgCSAxCi0jZGVmaW5lIFJfRElSMzIgCSA2Ci0jZGVmaW5lIFJfSU1BR0VCQVNFCSA3Ci0jZGVmaW5lIFJfUkVMQllURQkxNQotI2RlZmluZSBSX1JFTFdPUkQJMTYKLSNkZWZpbmUgUl9SRUxMT05HCTE3Ci0jZGVmaW5lIFJfUENSQllURQkxOAotI2RlZmluZSBSX1BDUldPUkQJMTkKLSNkZWZpbmUgUl9QQ1JMT05HCTIwCi0jZGVmaW5lIFJfSVBSU0hPUlQJMjQKLSNkZWZpbmUgUl9JUFJMT05HCTI2Ci0jZGVmaW5lIFJfR0VUU0VHCTI5Ci0jZGVmaW5lIFJfR0VUUEEgCTMwCi0jZGVmaW5lIFJfVEFHV09SRAkzMQotI2RlZmluZSBSX0pVTVBUQVJHCTMyCS8qIHN0cmFuZ2UgMjlrIDAweHgwMHh4IHJlbG9jICovCi0KLSNkZWZpbmUgUl9QQ1IxNkwgICAgICAgMTI4Ci0jZGVmaW5lIFJfUENSMjZMICAgICAgIDEyOQotI2RlZmluZSBSX1ZSVDE2ICAgICAgICAxMzAKLSNkZWZpbmUgUl9IVlJUMTYgICAgICAgMTMxCi0jZGVmaW5lIFJfTFZSVDE2ICAgICAgIDEzMgotI2RlZmluZSBSX1ZSVDMyICAgICAgICAxMzMKLQotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgbW92LmIgaW5zdHJ1Y3Rpb25zIHdpdGggYSAxNmJpdCBhYnNvbHV0ZQotICAgYWRkcmVzcy4gIFRoZSBsaW5rZXIgdHJpZXMgdG8gdHVybiBpbnNucyB3aXRoIHRoaXMgcmVsb2MgaW50bwotICAgYW4gYWJzb2x1dGUgOC1iaXQgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfTU9WMTZCMSAgICAJMHg0MQotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgbW92LmIgaW5zdHJ1Y3Rpb25zIHdoaWNoIGhhZCBhIDE2Yml0Ci0gICBhYnNvbHV0ZSBhZGRyZXNzIHdoaWNoIGhhdmUgYmVlbiBzaG9ydGVuZWQgaW50byBhIDgtYml0Ci0gICBhYnNvbHV0ZSBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9NT1YxNkIyIAkweDQyCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBqbXAgaW5zbnMgd2l0aCBhIDE2Yml0IHRhcmdldCBhZGRyZXNzOwotICAgdGhlIGxpbmtlciB0cmllcyB0byB0dXJuIHRoZXNlIGluc25zIGludG8gYnJhIGluc25zIHdpdGgKLSAgIGFuIDhiaXQgcGMtcmVsYXRpdmUgdGFyZ2V0LiAgKi8KLSNkZWZpbmUgUl9KTVAxICAgICAJMHg0MwotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgYSBicmEgd2l0aCBhbiA4LWJpdCBwYy1yZWxhdGl2ZQotICAgdGFyZ2V0IHRoYXQgd2FzIGZvcm1lcmxseSBhIGptcCBpbnNuIHdpdGggYSAxNmJpdCB0YXJnZXQuICAqLwotI2RlZmluZSBSX0pNUDIgCQkweDQ0Ci0KLS8qID8/PyAqLwotI2RlZmluZSBSX1JFTExPTkdfTkVHICAJMHg0NQotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgam1wIGluc25zIHdpdGggYSAyNGJpdCB0YXJnZXQgYWRkcmVzczsKLSAgIHRoZSBsaW5rZXIgdHJpZXMgdG8gdHVybiB0aGVzZSBpbnNucyBpbnRvIGJyYSBpbnNucyB3aXRoCi0gICBhbiA4Yml0IHBjLXJlbGF0aXZlIHRhcmdldC4gICovCi0jZGVmaW5lIFJfSk1QTDEgICAgIAkweDQ2Ci0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIGJyYSB3aXRoIGFuIDgtYml0IHBjLXJlbGF0aXZlCi0gICB0YXJnZXQgdGhhdCB3YXMgZm9ybWVybGx5IGEgam1wIGluc24gd2l0aCBhIDI0Yml0IHRhcmdldC4gICovCi0jZGVmaW5lIFJfSk1QTDIJCTB4NDcKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5iIGluc3RydWN0aW9ucyB3aXRoIGEgMjRiaXQgYWJzb2x1dGUKLSAgIGFkZHJlc3MuICBUaGUgbGlua2VyIHRyaWVzIHRvIHR1cm4gaW5zbnMgd2l0aCB0aGlzIHJlbG9jIGludG8KLSAgIGFuIGFic29sdXRlIDgtYml0IGFkZHJlc3MuICAqLwotCi0jZGVmaW5lIFJfTU9WMjRCMSAgICAJMHg0OAotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgbW92LmIgaW5zdHJ1Y3Rpb25zIHdoaWNoIGhhZCBhIDI0Yml0Ci0gICBhYnNvbHV0ZSBhZGRyZXNzIHdoaWNoIGhhdmUgYmVlbiBzaG9ydGVuZWQgaW50byBhIDgtYml0Ci0gICBhYnNvbHV0ZSBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9NT1YyNEIyIAkweDQ5Ci0KLS8qIEFuIGg4MzAwIG1lbW9yeSBpbmRpcmVjdCBqdW1wL2NhbGwuICBGb3JjZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGp1bXAvY2FsbAotICAgdGFyZ2V0IGludG8gdGhlIGZ1bmN0aW9uIHZlY3RvciAoaW4gcGFnZSB6ZXJvKSwgYW5kIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgdmVjdG9yIGVudHJ5IHRvIGJlIHBsYWNlZCBpbiB0aGUganVtcC9jYWxsIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUl9NRU1fSU5ESVJFQ1QJMHg0YQotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgYSAxNmJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggdGFyZ2V0IHdoaWNoIHdhcwotICAgc2hvcnRlbmVkIGludG8gYW4gOGJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggdGFyZ2V0LiAgKi8KLSNkZWZpbmUgUl9QQ1JXT1JEX0IJMHg0YgotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgbW92Llt3bF0gaW5zdHJ1Y3Rpb25zIHdpdGggYSAzMi8yNCBiaXQKLSAgIGFic29sdXRlIGFkZHJlc3M7IHRoZSBsaW5rZXIgbWF5IHR1cm4gdGhpcyBpbnRvIGEgbW92Llt3bF0KLSAgIGluc24gd2l0aCBhIDE2Yml0IGFic29sdXRlIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX01PVkwxICAgIAkweDRjCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuW3dsXSBpbnNucyB3aGljaCBmb3JtZXJsbHkgaGFkCi0gICBhIDMyLzI0Yml0IGFic29sdXRlIGFkZHJlc3MgYW5kIGhvdyBoYXZlIGEgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfTU9WTDIgCTB4NGQKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGEgYkNDOjggd2hpY2ggd2lsbCBoYXZlIGl0J3MgY29uZGl0aW9uCi0gICBpbnZlcnRlZCBhbmQgaXRzIHRhcmdldCByZWRpcmVjdGVkIHRvIHRoZSB0YXJnZXQgb2YgdGhlIGJyYW5jaAotICAgaW4gdGhlIGZvbGxvd2luZyBpbnNuLiAgKi8KLSNkZWZpbmUgUl9CQ0NfSU5WCTB4NGUKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGEgam1wIGluc3RydWN0aW9uIHRoYXQgaGFzIGJlZW4gZGVsZXRlZC4gICovCi0jZGVmaW5lIFJfSk1QX0RFTAkweDRmCi0KLS8qIFo4ayBtb2RlcyAqLwotI2RlZmluZSBSX0lNTTE2ICAgMHgwMQkJLyogMTYgYml0IGFicyAqLwotI2RlZmluZSBSX0pSCSAgMHgwMgkJLyoganIgIDggYml0IGRpc3AgKi8KLSNkZWZpbmUgUl9JTU00TCAgIDB4MjMJCS8qIGxvdyBuaWJibGUgKi8KLSNkZWZpbmUgUl9JTU04ICAgIDB4MjIJCS8qIDggYml0IGFicyAqLwotI2RlZmluZSBSX0lNTTMyICAgUl9SRUxMT05HCS8qIDMyIGJpdCBhYnMgKi8KLSNkZWZpbmUgUl9DQUxMICAgIFJfREEJCS8qIEFic29sdXRlIGFkZHJlc3Mgd2hpY2ggY291bGQgYmUgYSBjYWxsciAqLwotI2RlZmluZSBSX0pQCSAgUl9EQQkJLyogQWJzb2x1dGUgYWRkcmVzcyB3aGljaCBjb3VsZCBiZSBhIGpwICovCi0jZGVmaW5lIFJfUkVMMTYgICAweDA0CQkvKiAxNiBiaXQgUEMgcmVsICovCi0jZGVmaW5lIFJfQ0FMTFIJICAweDA1CQkvKiBjYWxsciAxMiBiaXQgZGlzcCAqLwotI2RlZmluZSBSX1NFRyAgICAgMHgxMAkJLyogc2V0IGlmIGluIHNlZ21lbnRlZCBtb2RlICovCi0jZGVmaW5lIFJfSU1NNEggICAweDI0CQkvKiBoaWdoIG5pYmJsZSAqLwotI2RlZmluZSBSX0RJU1A3ICAgMHgyNSAgICAgICAgICAvKiBkam56IGRpc3BsYWNlbWVudCAqLwotCi0vKiBIODUwMCBtb2RlcyAqLwotCi0jZGVmaW5lIFJfSDg1MDBfSU1NOCAgCTEJCS8qICA4IGJpdCBpbW1lZGlhdGUgCSovCi0jZGVmaW5lIFJfSDg1MDBfSU1NMTYgCTIJCS8qIDE2IGJpdCBpbW1lZGlhdGUJKi8KLSNkZWZpbmUgUl9IODUwMF9QQ1JFTDggCTMJCS8qICA4IGJpdCBwY3JlbCAJKi8KLSNkZWZpbmUgUl9IODUwMF9QQ1JFTDE2IDQJCS8qIDE2IGJpdCBwY3JlbCAJKi8KLSNkZWZpbmUgUl9IODUwMF9ISUdIOCAgCTUJCS8qIGhpZ2ggOCBiaXRzIG9mIDI0IGJpdCBhZGRyZXNzICovCi0jZGVmaW5lIFJfSDg1MDBfTE9XMTYgCTcJCS8qIGxvdyAxNiBiaXRzIG9mIDI0IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9IODUwMF9JTU0yNAk2CQkvKiAyNCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfSDg1MDBfSU1NMzIgICA4ICAgICAgICAgICAgICAgLyogMzIgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX0g4NTAwX0hJR0gxNiAgOQkJLyogaGlnaCAxNiBiaXRzIG9mIDMyIGJpdCBpbW1lZGlhdGUgKi8KLQotLyogVzY1IG1vZGVzICovCi0KLSNkZWZpbmUgUl9XNjVfQUJTOAkxICAvKiBhZGRyICYgMHhmZiAJCSovCi0jZGVmaW5lIFJfVzY1X0FCUzE2CTIgIC8qIGFkZHIgJiAweGZmZmYgCQkqLwotI2RlZmluZSBSX1c2NV9BQlMyNAkzICAvKiBhZGRyICYgMHhmZmZmZmYgCQkqLwotCi0jZGVmaW5lIFJfVzY1X0FCUzhTOCAgICA0ICAvKiAoYWRkciA+PiA4KSAmIDB4ZmYgCSovCi0jZGVmaW5lIFJfVzY1X0FCUzhTMTYgICA1ICAvKiAoYWRkciA+PiAxNikgJiAweGZmIAkqLwotCi0jZGVmaW5lIFJfVzY1X0FCUzE2UzggICA2ICAvKiAoYWRkciA+PiA4KSAmIDBmZmZmIAkqLwotI2RlZmluZSBSX1c2NV9BQlMxNlMxNiAgNyAgLyogKGFkZHIgPj4gMTYpICYgMGZmZmYgCSovCi0KLSNkZWZpbmUgUl9XNjVfUENSOAk4Ci0jZGVmaW5lIFJfVzY1X1BDUjE2CTkKLQotI2RlZmluZSBSX1c2NV9EUCAgICAgICAxMCAgLyogZGlyZWN0IHBhZ2UgOCBiaXRzIG9ubHkgICAqLwotCi0jZW5kaWYgLyogR05VX0NPRkZfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL202OGsuaCBiL2luY2x1ZGUvY29mZi9tNjhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MTQ3ZWQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL202OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIE02OEsgKi8KLQotI2lmbmRlZiBHTlVfQ09GRl9NNjhLX0gKLSNkZWZpbmUgR05VX0NPRkZfTTY4S19IIDEKLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotLyogTW90b3JvbGEgNjgwMDAvNjgwMDgvNjgwMTAvNjgwMjAgKi8KLSNkZWZpbmUJTUM2OE1BR0lDCTA1MjAKLSNkZWZpbmUgTUM2OEtXUk1BR0lDCTA1MjAJLyogd3JpdGVhYmxlIHRleHQgc2VnbWVudHMgKi8KLSNkZWZpbmUJTUM2OFRWTUFHSUMJMDUyMQotI2RlZmluZSBNQzY4S1JPTUFHSUMJMDUyMQkvKiByZWFkb25seSBzaGFyZWFibGUgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZSBNQzY4S1BHTUFHSUMJMDUyMgkvKiBkZW1hbmQgcGFnZWQgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZQlNNjhNQUdJQwkwMjEwCi0jZGVmaW5lCU02OFRWTUFHSUMJMDIxMQotCi0vKiB0aGlzIGlzIHRoZSBtYWdpYyBvZiB0aGUgQnVsbCBkcHgvMiAqLwotI2RlZmluZSBNQzY4S0JDU01BR0lDCTA1MjYKLQotLyogVGhpcyBpcyBMeW54J3MgYWxsLXBsYXRmb3JtIG1hZ2ljIG51bWJlciBmb3IgZXhlY3V0YWJsZXMuICovCi0KLSNkZWZpbmUgTFlOWENPRkZNQUdJQwkwNDE1Ci0KLSNkZWZpbmUgT01BR0lDIE02OE1BR0lDCi0KLS8qIFRoaXMgaW50ZW50aW9uYWxseSBkb2VzIG5vdCBpbmNsdWRlIE1DNjhLQkNTTUFHSUM7IGl0IG9ubHkgaW5jbHVkZXMKLSAgIG1hZ2ljIG51bWJlcnMgd2hpY2ggaW1wbHkgdGhhdCBuYW1lcyBkbyBub3QgaGF2ZSB1bmRlcnNjb3Jlcy4gICovCi0jZGVmaW5lIE02OEtCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9TUM2OE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU1DNjhLV1JNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4VFZNQUdJQykgJiYgXAotICAoKHgpLmZfbWFnaWMhPU1DNjhLUk9NQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4S1BHTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TTY4TUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TTY4VFZNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1MWU5YQ09GRk1BR0lDKSApCi0KLS8qIE1hZ2ljIG51bWJlcnMgZm9yIHRoZSBhLm91dCBoZWFkZXIuICAqLwotCi0jZGVmaW5lIFBBR0VNQUdJQ0VYRUNTV0FQUEVEICAwNDA3IC8qIGV4ZWN1dGFibGUgKHN3YXBwZWQpICovCi0jZGVmaW5lIFBBR0VNQUdJQ1BFWEVDU1dBUFBFRCAwNDEwIC8qIHB1cmUgZXhlY3V0YWJsZSAoc3dhcHBlZCkgKi8KLSNkZWZpbmUgUEFHRU1BR0lDUEVYRUNUU0hMSUIgIDA0NDMgLyogcHVyZSBleGVjdXRhYmxlICh0YXJnZXQgc2hhcmVkIGxpYnJhcnkpICovCi0jZGVmaW5lIFBBR0VNQUdJQ1BFWEVDUEFHRUQgICAwNDEzIC8qIHB1cmUgZXhlY3V0YWJsZSAocGFnZWQpICovCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotI2lmZGVmIE02OEtfQ09GRl9PRkZTRVQKLSAgY2hhciByX29mZnNldFs0XTsKLSNlbmRpZgotCi19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0KLSNpZmRlZiBNNjhLX0NPRkZfT0ZGU0VUCi0jZGVmaW5lIFJFTFNaIDE0Ci0jZWxzZQotI2RlZmluZSBSRUxTWiAxMAotI2VuZGlmCi0KLSNlbmRpZiAvKiBHTlVfQ09GRl9NNjhLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9tODhrLmggYi9pbmNsdWRlL2NvZmYvbTg4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDZlYjQxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9tODhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciA4OGsgYmNzICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZSBNQzg4TUFHSUMgIDA1NDAgICAgICAgICAgIC8qIDg4ayBCQ1MgZXhlY3V0YWJsZSAqLwotI2RlZmluZSBNQzg4RE1BR0lDIDA1NDEgICAgICAgICAgIC8qIERHL1VYIGV4ZWN1dGFibGUgICAqLwotI2RlZmluZSBNQzg4T01BR0lDIDA1NTUJICAgICAgICAgIC8qIE9iamVjdCBmaWxlICAgICAgICAqLwotCi0jZGVmaW5lIE1DODhCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9TUM4OE1BR0lDKSAmJigoeCkuZl9tYWdpYyE9TUM4OERNQUdJQykgJiYgKCh4KS5mX21hZ2ljICE9IE1DODhPTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBQQUdFTUFHSUMzIDA0MTQgLyogU3BsaXQgaSZkLCB6ZXJvIG1hcHBlZCAqLwotI2RlZmluZSBQQUdFTUFHSUNCQ1MgMDQxMwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotLyogY29tcHV0ZSBzaXplIG9mIGEgaGVhZGVyICovCi0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciAKLXsKLSAgY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotICBjaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotICBjaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIGNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLSAgY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIGNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIGNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIGNoYXIJCXNfbnJlbG9jWzRdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0gIGNoYXIJCXNfbmxubm9bNF07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLSAgY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0NAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQgICAiLnRleHQiCi0jZGVmaW5lIF9EQVRBICAgIi5kYXRhIgotI2RlZmluZSBfQlNTICAgICIuYnNzIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVub3sKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCi0JY2hhciBsX2xubm9bNF07Ci0KLX07Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotICBjaGFyIHBhZDJbMl07Ci19OwotCi0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCTAxNwotI2RlZmluZSBOX1RNQVNLCQkwNjAKLSNkZWZpbmUgTl9CVFNIRlQJNAotI2RlZmluZSBOX1RTSElGVAkyCi0KLQotLyogTm90ZSB0aGF0IHRoaXMgaXNuJ3QgdGhlIHNhbWUgc2hhcGUgYXMgb3RoZXIgY29mZnMgKi8KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3RhZ25keFs0XTsJCS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLSAgICAvKiA0ICovCi0gICAgdW5pb24gewotICAgICAgY2hhciB4X2ZzaXplWzRdOwkJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotICAgICAgc3RydWN0IHsKLQljaGFyICB4X2xubm9bNF07CS8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JY2hhciAgeF9zaXplWzRdOwkvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotICAgICAgfSB4X2xuc3o7Ci0gICAgfSB4X21pc2M7Ci0gICAgCi0gICAgLyogMTIgKi8KLSAgICB1bmlvbiB7Ci0gICAgICBzdHJ1Y3QgewkJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCWNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCWNoYXIgeF9lbmRuZHhbNF07CQkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLSAgICAgIH0geF9mY247Ci0gICAgICBzdHJ1Y3QgewkJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCWNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0gICAgICB9IHhfYXJ5OwotICAgIH0geF9mY25hcnk7Ci0gICAgLyogMjAgKi8KLSAgICAKLSAgfSB4X3N5bTsKLSAgCi0gIHVuaW9uIHsKLSAgICBjaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgeF96ZXJvZXNbNF07Ci0gICAgICBjaGFyIHhfb2Zmc2V0WzRdOwotICAgIH0geF9uOwotICB9IHhfZmlsZTsKLSAgCi0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3Njbmxlbls0XTsJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0gICAgY2hhciB4X25yZWxvY1s0XTsJCS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0gICAgY2hhciB4X25saW5ub1s0XTsJCS8qICMgbGluZSBudW1iZXJzICovCi0gIH0geF9zY247Ci0gIAotICBzdHJ1Y3QgewotICAgIGNoYXIgeF90dmZpbGxbNF07CQkvKiB0diBmaWxsIHZhbHVlICovCi0gICAgY2hhciB4X3R2bGVuWzJdOwkJLyogbGVuZ3RoIG9mIC50diAqLwotICAgIGNoYXIgeF90dnJhblsyXVsyXTsJCS8qIHR2IHJhbmdlICovCi0gIH0geF90djsJCQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLX07Ci0KLSNkZWZpbmUgR0VUX0ZDTl9MTk5PUFRSKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQotI2RlZmluZSBHRVRfRkNOX0VORE5EWChhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNkZWZpbmUgUFVUX0ZDTl9MTk5PUFRSKGFiZmQsIGluLCBleHQpICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZGVmaW5lIFBVVF9GQ05fRU5ETkRYKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopICAgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNkZWZpbmUgR0VUX0xOU1pfU0laRShhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNkZWZpbmUgR0VUX0xOU1pfTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKLSNkZWZpbmUgUFVUX0xOU1pfTE5OTyhhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQotI2RlZmluZSBQVVRfTE5TWl9TSVpFKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0jZGVmaW5lIEdFVF9TQ05fU0NOTEVOKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2RlZmluZSBHRVRfU0NOX05SRUxPQyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X25yZWxvYykKLSNkZWZpbmUgR0VUX1NDTl9OTElOTk8oYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfbmxpbm5vKQotI2RlZmluZSBQVVRfU0NOX1NDTkxFTihhYmZkLGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZGVmaW5lIFBVVF9TQ05fTlJFTE9DKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQotI2RlZmluZSBQVVRfU0NOX05MSU5OTyhhYmZkLGluLCBleHQpICBiZmRfaF9wdXRfMzIoYWJmZCxpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9ubGlubm8pCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpCi0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSAgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0KLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMjAKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX29mZnNldFsyXTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaICAxMgotCi0jZGVmaW5lIE5PX1RWTkRYCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvbWNvcmUuaCBiL2luY2x1ZGUvY29mZi9tY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzE4OTQ3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9tY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qIE1vdG9yb2xsYSBNQ29yZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNQ29yZSBDT0ZGL1BFIEFCSS4gKi8KLQotI2lmbmRlZiBfQ09GRl9NT1JFX0gKLSNkZWZpbmUgX0NPRkZfTU9SRV9ICi0KLQotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfQUJTT0xVVEUgICAgICAgICAgCTB4MDAwMAotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfQUREUjMyICAgICAgICAgICAgCTB4MDAwMQotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NOEJZNAkJMHgwMDAyCi0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU0xMUJZMgkJMHgwMDAzCi0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU00QlkyCQkweDAwMDQKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1BDUkVMXzMyCQkweDAwMDUKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMgkweDAwMDYKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1JWQQkJCTB4MDAwNwotCi0jZGVmaW5lIFBFTUNPUkUKLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljICAgICAgWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wICAgICBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZSAgICAgIFs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplICAgICAgWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplICAgICAgWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5ICAgICAgWzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnQgWzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0IFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0jZGVmaW5lIE9NQUdJQyAgICAgICAgICAwNDA0ICAgIC8qIG9iamVjdCBmaWxlcywgZWcgYXMgb3V0cHV0ICovCi0jZGVmaW5lIFpNQUdJQyAgICAgICAgICAwNDEzICAgIC8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLwotI2RlZmluZSBTVE1BR0lDCQkwNDAxCS8qIHRhcmdldCBzaGxpYiAqLwotI2RlZmluZSBTSE1BR0lDCQkwNDQzCS8qIGhvc3QgICBzaGxpYiAqLwotCi0vKiBGcm9tIHdpbm50LmggKi8KLSNkZWZpbmUgSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDICAgICAgICAweDEwYgotCi0KLS8qIERlZmluZSBzb21lIE5UIGRlZmF1bHQgdmFsdWVzLiAqLwotI2RlZmluZSBOVF9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKLSNkZWZpbmUgTlRfRklMRV9BTElHTk1FTlQgICAgMHgyMDAgIAotI2RlZmluZSBOVF9ERUZfUkVTRVJWRSAgICAgICAweDEwMDAwMAotI2RlZmluZSBOVF9ERUZfQ09NTUlUICAgICAgICAweDEwMDAKLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLXsKLSAgY2hhciByX3ZhZGRyICBbNF07Ci0gIGNoYXIgcl9zeW1uZHggWzRdOwotICBjaGFyIHJfdHlwZSAgIFsyXTsKLSAgY2hhciByX29mZnNldCBbNF07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNAotCi0jZGVmaW5lCU1DT1JFTUFHSUMJMHhiMDAgIC8qIEkganVzdCBtYWRlIHRoaXMgdXAgKi8gCi0KLSNkZWZpbmUgTUNPUkVCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9IE1DT1JFTUFHSUMpKQotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotewotICBjaGFyIGZfbWFnaWMgIFsyXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgY2hhciBmX25zY25zICBbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgY2hhciBmX3RpbWRhdCBbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotICBjaGFyIGZfc3ltcHRyIFs0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotICBjaGFyIGZfbnN5bXMgIFs0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIGNoYXIgZl9vcHRoZHIgWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgY2hhciBmX2ZsYWdzICBbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24KLSAgewotICAgIGNoYXIgZV9uYW1lIFtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBjaGFyIGVfemVyb2VzIFs0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXQgWzRdOwotICAgIH0gZTsKLSAgfSBlOwotICAKLSAgY2hhciBlX3ZhbHVlICBbNF07Ci0gIGNoYXIgZV9zY251bSAgWzJdOwotICBjaGFyIGVfdHlwZSAgIFsyXTsKLSAgY2hhciBlX3NjbGFzcyBbMV07Ci0gIGNoYXIgZV9udW1hdXggWzFdOwotfTsKLQotI2RlZmluZSBOX0JUTUFTSwkweGYKLSNkZWZpbmUgTl9UTUFTSwkJMHgzMAotI2RlZmluZSBOX0JUU0hGVAk0Ci0jZGVmaW5lIE5fVFNISUZUCTIKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci17Ci0gIHN0cnVjdAotICB7Ci0gICAgY2hhciB4X3RhZ25keCBbNF07CQkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0gICAgCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QKLSAgICAgIHsKLQljaGFyICB4X2xubm8gWzJdOyAJLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQljaGFyICB4X3NpemUgWzJdOyAJLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLSAgICAgIH0geF9sbnN6OwotCi0gICAgICBjaGFyIHhfZnNpemUgWzRdOwkJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCi0gICAgfSB4X21pc2M7Ci0KLSAgICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdCAJCQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLSAgICAgIHsKLQljaGFyIHhfbG5ub3B0ciBbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JY2hhciB4X2VuZG5keCAgWzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLSAgICAgIH0geF9mY247Ci0KLSAgICAgIHN0cnVjdCAJCQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLSAgICAgIHsKLQljaGFyIHhfZGltZW4gW0VfRElNTlVNXVsyXTsKLSAgICAgIH0geF9hcnk7Ci0gICAgICAKLSAgICB9IHhfZmNuYXJ5OwotCi0gICAgY2hhciB4X3R2bmR4IFsyXTsJCS8qIHR2IGluZGV4ICovCi0KLSAgfSB4X3N5bTsKLQotICB1bmlvbgotICB7Ci0gICAgY2hhciB4X2ZuYW1lIFtFX0ZJTE5NTEVOXTsKLSAgICAKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBjaGFyIHhfemVyb2VzIFs0XTsKLSAgICAgIGNoYXIgeF9vZmZzZXQgWzRdOwotICAgIH0geF9uOwotICAgIAotICB9IHhfZmlsZTsKLQotICBzdHJ1Y3QKLSAgewotICAgIGNoYXIgeF9zY25sZW4gICAgIFs0XTsJLyogc2VjdGlvbiBsZW5ndGggKi8KLSAgICBjaGFyIHhfbnJlbG9jICAgICBbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0gICAgY2hhciB4X25saW5ubyAgICAgWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotICAgIGNoYXIgeF9jaGVja3N1bSAgIFs0XTsJLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0gKi8KLSAgICBjaGFyIHhfYXNzb2NpYXRlZCBbMl07CS8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLSAgICBjaGFyIHhfY29tZGF0ICAgICBbMV07CS8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyICovCi0gIH0geF9zY247Ci0KLSAgc3RydWN0Ci0gIHsKLSAgICBjaGFyIHhfdHZmaWxsIFs0XTsJCS8qIHR2IGZpbGwgdmFsdWUgKi8KLSAgICBjaGFyIHhfdHZsZW4gIFsyXTsJCS8qIGxlbmd0aCBvZiAudHYgKi8KLSAgICBjaGFyIHhfdHZyYW4gIFsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLSAgfSB4X3R2OwkJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAgIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICAgZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAgIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4gICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi17Ci0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIGxfc3ltbmR4IFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0gICAgY2hhciBsX3BhZGRyICBbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotICB9IGxfYWRkcjsKLQotICBjaGFyIGxfbG5ubyBbMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpICAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMiAoYWJmZCwgdmFsLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLXsKLSAgY2hhcglzX25hbWUgICAgWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotICBjaGFyCXNfcGFkZHIgICBbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIGNoYXIJc192YWRkciAgIFs0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICBjaGFyCXNfc2l6ZSAgICBbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0gIGNoYXIJc19zY25wdHIgIFs0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgY2hhcglzX3JlbHB0ciAgWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIGNoYXIJc19sbm5vcHRyIFs0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0gIGNoYXIJc19ucmVsb2MgIFsyXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICBjaGFyCXNfbmxubm8gICBbMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLSAgY2hhcglzX2ZsYWdzICAgWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKiBOYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMuICAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0KLSNlbmRpZiAvKiBfX0NPRkZfTUNPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL21pcHMuaCBiL2luY2x1ZGUvY29mZi9taXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NjY1YjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL21pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKiBFQ09GRiBzdXBwb3J0IG9uIE1JUFMgbWFjaGluZXMuCi0gICBjb2ZmL2Vjb2ZmLmggbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgdGhpcyBmaWxlLiAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotICB1bnNpZ25lZCBjaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgdW5zaWduZWQgY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotICB1bnNpZ25lZCBjaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICB1bnNpZ25lZCBjaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgdW5zaWduZWQgY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKiBNYWdpYyBudW1iZXJzIGFyZSBkZWZpbmVkIGluIGNvZmYvZWNvZmYuaC4gICovCi0jZGVmaW5lIE1JUFNfRUNPRkZfQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfMSkgJiYgXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0xJVFRMRSkgJiZcCi0JCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfQklHKSAmJiBcCi0JCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfTElUVExFMikgJiYgXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0JJRzIpICYmIFwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19MSVRUTEUzKSAmJiBcCi0JCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfQklHMykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgZXh0ZXJuYWxfYW91dGhkcgotewotICB1bnNpZ25lZCBjaGFyIG1hZ2ljWzJdOwkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgdW5zaWduZWQgY2hhcgl2c3RhbXBbMl07CS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICB1bnNpZ25lZCBjaGFyCXRzaXplWzRdOwkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgdW5zaWduZWQgY2hhcglkc2l6ZVs0XTsJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICB1bnNpZ25lZCBjaGFyCWJzaXplWzRdOwkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIHVuc2lnbmVkIGNoYXIJZW50cnlbNF07CS8qIGVudHJ5IHB0LgkJCQkqLwotICB1bnNpZ25lZCBjaGFyIHRleHRfc3RhcnRbNF07CS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhciBkYXRhX3N0YXJ0WzRdOwkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgYnNzX3N0YXJ0WzRdOwkvKiBiYXNlIG9mIGJzcyB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhciBncHJtYXNrWzRdOwkvKiA/PyAqLwotICB1bnNpZ25lZCBjaGFyIGNwcm1hc2tbNF1bNF07CS8qID8/ICovCi0gIHVuc2lnbmVkIGNoYXIgZ3BfdmFsdWVbNF07CS8qIHZhbHVlIGZvciBncCByZWdpc3RlciAqLwotfSBBT1VUSERSOwotCi0vKiBjb21wdXRlIHNpemUgb2YgYSBoZWFkZXIgKi8KLQotI2RlZmluZSBBT1VUU1ogNTYKLSNkZWZpbmUgQU9VVEhEUlNaIDU2Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotICB1bnNpZ25lZCBjaGFyCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLSAgdW5zaWduZWQgY2hhcglzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotICB1bnNpZ25lZCBjaGFyCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLSAgdW5zaWduZWQgY2hhcglzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLSAgdW5zaWduZWQgY2hhcglzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotICB1bnNpZ25lZCBjaGFyCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0gIHVuc2lnbmVkIGNoYXIJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotICB1bnNpZ25lZCBjaGFyCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICB1bnNpZ25lZCBjaGFyIHJfdmFkZHJbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzRdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogOAotCi0vKiBNSVBTIEVDT0ZGIHVzZXMgYSBwYWNrZWQgOCBieXRlIGZvcm1hdCBmb3IgcmVsb2NzLiAgVGhlc2UgY29uc3RhbnRzCi0gICBhcmUgdXNlZCB0byB1bnBhY2sgdGhlIHJfYml0cyBmaWVsZC4gICovCi0KLSNkZWZpbmUgUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfQklHCQkxNgotI2RlZmluZSBSRUxPQ19CSVRTMF9TWU1ORFhfU0hfTEVGVF9MSVRUTEUJMAotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX1NZTU5EWF9TSF9MRUZUX0JJRwkJOAotI2RlZmluZSBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9MSVRUTEUJOAotCi0jZGVmaW5lIFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0JJRwkJMAotI2RlZmluZSBSRUxPQ19CSVRTMl9TWU1ORFhfU0hfTEVGVF9MSVRUTEUJMTYKLQotLyogT3JpZ2luYWxseSwgRUNPRkYgdXNlZCBmb3VyIGJpdHMgZm9yIHRoZSByZWxvYyB0eXBlIGFuZCBoYWQgdGhyZWUKLSAgIHJlc2VydmVkIGJpdHMuICBJcml4IDQgYWRkZWQgYW5vdGhlciBiaXQgZm9yIHRoZSByZWxvYyB0eXBlLCB3aGljaAotICAgd2FzIGVhc3kgYmVjYXVzZSBpdCB3YXMgYmlnIGVuZGlhbiBhbmQgb25lIG9mIHRoZSBzcGFyZSBiaXRzIGJlY2FtZQotICAgdGhlIG5ldyBtb3N0IHNpZ25pZmljYW50IGJpdC4gIFRvIG1ha2UgdGhpcyBhbHNvIHdvcmsgZm9yIGxpdHRsZQotICAgZW5kaWFuIEVDT0ZGLCB3ZSBuZWVkIHRvIHdyYXAgb25lIG9mIHRoZSByZXNlcnZlZCBiaXRzIGFyb3VuZCB0bwotICAgYmVjb21lIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgcmVsb2MgdHlwZS4gICovCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVfQklHCQkJMHgzRQotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFX1NIX0JJRwkJCTEKLSNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRV9MSVRUTEUJCQkweDc4Ci0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVfU0hfTElUVExFCQkzCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVISV9MSVRUTEUJCTB4MDQKLSNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRUhJX1NIX0xJVFRMRQkJMgotCi0jZGVmaW5lIFJFTE9DX0JJVFMzX0VYVEVSTl9CSUcJCQkweDAxCi0jZGVmaW5lIFJFTE9DX0JJVFMzX0VYVEVSTl9MSVRUTEUJCTB4ODAKLQotLyogVGhlIHJfdHlwZSBmaWVsZCBpbiBhIHJlbG9jIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gIEkKLSAgIGRvbid0IGtub3cgaWYgYW55IG90aGVyIHZhbHVlcyBjYW4gYXBwZWFyLiAgVGhlc2Ugc2VlbSB0byBiZSBhbGwKLSAgIHRoYXQgb2NjdXIgaW4gdGhlIFVsdHJpeCA0LjIgbGlicmFyaWVzLiAgKi8KLSNkZWZpbmUgTUlQU19SX0lHTk9SRQkwCi0jZGVmaW5lIE1JUFNfUl9SRUZIQUxGCTEKLSNkZWZpbmUgTUlQU19SX1JFRldPUkQJMgotI2RlZmluZSBNSVBTX1JfSk1QQUREUgkzCi0jZGVmaW5lIE1JUFNfUl9SRUZISQk0Ci0jZGVmaW5lIE1JUFNfUl9SRUZMTwk1Ci0jZGVmaW5lIE1JUFNfUl9HUFJFTAk2Ci0jZGVmaW5lIE1JUFNfUl9MSVRFUkFMCTcKLQotLyogVGhlc2UgcmVsb2MgdHlwZXMgYXJlIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZwotICAgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIFRoZSBudW1iZXJzIGFyZQotICAgdGFrZW4gZnJvbSBJcml4IDQsIGJ1dCBhdCBsZWFzdCBmb3IgaW50ZXJuYWwgcmVsb2NzIElyaXggNSBkb2VzIG5vdAotICAgZ2l2ZSB0aGVtIHRoZSBzYW1lIG1lYW5pbmcuICBGb3IgYW4gaW50ZXJuYWwgcmVsb2MgdGhlIHN5bWJvbCBpbmRleAotICAgb2YgUkVMSEkgYW5kIFJFTExPIGlzIG1vZGlmaWVkIGFzIGRlc2NyaWJlZCBiZWxvdyBmb3IKLSAgIE1JUFNfUl9TV0lUQ0guICAqLwotI2RlZmluZSBNSVBTX1JfUENSRUwxNgkxMgotI2RlZmluZSBNSVBTX1JfUkVMSEkJMTMKLSNkZWZpbmUgTUlQU19SX1JFTExPCTE0Ci0KLS8qIFRoaXMgcmVsb2MgdHlwZSBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KLSAgIGluZGVwZW5kZW50IGNvZGUgZm9yIGVtYmVkZGVkIHN5c3RlbXMuICBJdCBpcyB1c2VkIGZvciBhbiBlbnRyeSBpbgotICAgYSBzd2l0Y2ggdGFibGUsIHdoaWNoIGxvb2tzIGxpa2UgdGhpczoKLSAgICAgLndvcmQgJEwzLSRMUzEyCi0gICBUaGUgb2JqZWN0IGZpbGUgd2lsbCBjb250YWluIHRoZSBjb3JyZWN0IGRpZmZlcmVuY2UsIGFuZCBkb2VzIG5vdAotICAgcmVxdWlyZSBhZGp1c3RtZW50LiAgSG93ZXZlciwgd2hlbiB0aGUgbGlua2VyIGlzIHJlbGF4aW5nIFBDCi0gICByZWxhdGl2ZSBjYWxscywgaXQgaXMgcG9zc2libGUgZm9yICRMMyB0byBtb3ZlIGZhcnRoZXIgYXdheS4gIFRoaXMKLSAgIHJlbG9jIGFsd2F5cyBhcHBlYXJzIGluIHRoZSAudGV4dCBzZWN0aW9uLCBhbmQgaXMgYWx3YXlzIGFnYWluc3QKLSAgIHRoZSAudGV4dCBzZWN0aW9uLiAgSG93ZXZlciwgdGhlIHN5bWJvbCBpbmRleCBpcyBub3QKLSAgIFJFTE9DX1NFQ1RJT05fVEVYVC4gIEl0IGlzLCBpbnN0ZWFkLCB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzCi0gICBzd2l0Y2ggdGFibGUgZW50cnkgYW5kICRMUzEyLiAgVGh1cywgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMMTIgaXMKLSAgICAgdmFkZHIgLSBzeW1uZHgKLSAgIGFuZCB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgJEwzIGlzCi0gICAgIHZhZGRyIC0gc3ltbmR4ICsgYWRkZW5kCi0gICB3aGVyZSBhZGRlbmQgaXMgdGhlIHZhbHVlIGluIHRoZSBvYmplY3QgZmlsZS4gIEtub3dpbmcgdGhpcywgdGhlCi0gICBsaW5rZXIgY2FuIGtub3cgd2hldGhlciB0aGUgYWRkZW5kIGluIHRoZSBvYmplY3QgZmlsZSBtdXN0IGJlCi0gICBhZGp1c3RlZC4gICovCi0jZGVmaW5lIE1JUFNfUl9TV0lUQ0gJMjIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1RBQlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNSVBTX0lTX1NUQUIgRUNPRkZfSVNfU1RBQgotI2RlZmluZSBNSVBTX01BUktfU1RBQiBFQ09GRl9NQVJLX1NUQUIKLSNkZWZpbmUgTUlQU19VTk1BUktfU1RBQiBFQ09GRl9VTk1BUktfU1RBQgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xJQyBJTkZPUk1BVElPTiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBXcml0dGVuIGJ5IEpvaG4gR2lsbW9yZS4gICovCi0KLS8qIEVDT0ZGIHVzZXMgQ09GRi1saWtlIHNlY3Rpb24gc3RydWN0dXJlcywgYnV0IGl0cyBvd24gc3ltYm9sIGZvcm1hdC4KLSAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzeW1ib2wgZm9ybWF0IGluIGZpZWxkcyB3aG9zZSBzaXplIGFuZCBhbGlnbm1lbnQKLSAgIHdpbGwgbm90IHZhcnkgb24gZGlmZmVyZW50IGhvc3Qgc3lzdGVtcy4gICovCi0KLS8qIEZpbGUgaGVhZGVyIGFzIGEgc2V0IG9mIGJ5dGVzICovCi0KLXN0cnVjdCBoZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyIAloX21hZ2ljWzJdOwotCXVuc2lnbmVkIGNoYXIJaF92c3RhbXBbMl07Ci0JdW5zaWduZWQgY2hhcgloX2lsaW5lTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkxpbmVbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiTGluZU9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWRuTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkRuT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pcGRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiUGRPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzeW1NYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiU3ltT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pb3B0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYk9wdE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWF1eE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JBdXhPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzc01heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTc09mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXNzRXh0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlNzRXh0T2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pZmRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiRmRPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NyZmRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiUmZkT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pZXh0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkV4dE9mZnNldFs0XTsKLX07Ci0KLS8qIEZpbGUgZGVzY3JpcHRvciBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGZkcl9leHQgewotCXVuc2lnbmVkIGNoYXIJZl9hZHJbNF07Ci0JdW5zaWduZWQgY2hhcglmX3Jzc1s0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXNzQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JTc1s0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXN5bUJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NzeW1bNF07Ci0JdW5zaWduZWQgY2hhcglmX2lsaW5lQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2xpbmVbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lvcHRCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jb3B0WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pcGRGaXJzdFsyXTsKLQl1bnNpZ25lZCBjaGFyCWZfY3BkWzJdOwotCXVuc2lnbmVkIGNoYXIJZl9pYXV4QmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2F1eFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfcmZkQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY3JmZFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcglmX2JpdHMyWzNdOwotCXVuc2lnbmVkIGNoYXIJZl9jYkxpbmVPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NiTGluZVs0XTsKLX07Ci0KLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfQklHCQkweEY4Ci0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX1NIX0JJRwkJMwotI2RlZmluZQlGRFJfQklUUzFfTEFOR19MSVRUTEUJCTB4MUYKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfU0hfTElUVExFCTAKLQotI2RlZmluZQlGRFJfQklUUzFfRk1FUkdFX0JJRwkJMHgwNAotI2RlZmluZQlGRFJfQklUUzFfRk1FUkdFX0xJVFRMRQkJMHgyMAotCi0jZGVmaW5lCUZEUl9CSVRTMV9GUkVBRElOX0JJRwkJMHgwMgotI2RlZmluZQlGRFJfQklUUzFfRlJFQURJTl9MSVRUTEUJMHg0MAotCi0jZGVmaW5lCUZEUl9CSVRTMV9GQklHRU5ESUFOX0JJRwkweDAxCi0jZGVmaW5lCUZEUl9CSVRTMV9GQklHRU5ESUFOX0xJVFRMRQkweDgwCi0KLSNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9CSUcJCTB4QzAKLSNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9TSF9CSUcJCTYKLSNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9MSVRUTEUJCTB4MDMKLSNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9TSF9MSVRUTEUJMAotCi0vKiBXZSBpZ25vcmUgdGhlIGByZXNlcnZlZCcgZmllbGQgaW4gYml0czIuICovCi0KLS8qIFByb2NlZHVyZSBkZXNjcmlwdG9yIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgcGRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglwX2Fkcls0XTsKLQl1bnNpZ25lZCBjaGFyCXBfaXN5bVs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfaWxpbmVbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ29mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfaW9wdFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZXJlZ1syXTsKLQl1bnNpZ25lZCBjaGFyCXBfcGNyZWdbMl07Ci0JdW5zaWduZWQgY2hhcglwX2xuTG93WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9sbkhpZ2hbNF07Ci0JdW5zaWduZWQgY2hhcglwX2NiTGluZU9mZnNldFs0XTsKLX07Ci0KLS8qIFJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlICovCi0KLXN0cnVjdCBycGRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglwX2Fkcls0XTsKLQl1bnNpZ25lZCBjaGFyCXBfcmVnbWFza1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfcmVnb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmVnbWFza1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJlZ29mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJhbWVvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lcmVnWzJdOwotCXVuc2lnbmVkIGNoYXIJcF9wY3JlZ1syXTsKLQl1bnNpZ25lZCBjaGFyCXBfaXJwc3NbNF07Ci0JdW5zaWduZWQgY2hhcglwX3Jlc2VydmVkWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9leGNlcHRpb25faW5mb1s0XTsKLX07Ci0KLS8qIExpbmUgbnVtYmVycyAqLwotCi1zdHJ1Y3QgbGluZV9leHQgewotCXVuc2lnbmVkIGNoYXIJbF9saW5lWzRdOwotfTsKLQotLyogU3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3Qgc3ltX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglzX2lzc1s0XTsKLQl1bnNpZ25lZCBjaGFyCXNfdmFsdWVbNF07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzMlsxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czNbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHM0WzFdOwotfTsKLQotI2RlZmluZQlTWU1fQklUUzFfU1RfQklHCQkweEZDCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9TSF9CSUcJCTIKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX0xJVFRMRQkJMHgzRgotI2RlZmluZQlTWU1fQklUUzFfU1RfU0hfTElUVExFCQkwCi0KLSNkZWZpbmUJU1lNX0JJVFMxX1NDX0JJRwkJMHgwMwotI2RlZmluZQlTWU1fQklUUzFfU0NfU0hfTEVGVF9CSUcJMwotI2RlZmluZQlTWU1fQklUUzFfU0NfTElUVExFCQkweEMwCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19TSF9MSVRUTEUJCTYKLQotI2RlZmluZQlTWU1fQklUUzJfU0NfQklHCQkweEUwCi0jZGVmaW5lCVNZTV9CSVRTMl9TQ19TSF9CSUcJCTUKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX0xJVFRMRQkJMHgwNwotI2RlZmluZQlTWU1fQklUUzJfU0NfU0hfTEVGVF9MSVRUTEUJMgotCi0jZGVmaW5lCVNZTV9CSVRTMl9SRVNFUlZFRF9CSUcJCTB4MTAKLSNkZWZpbmUJU1lNX0JJVFMyX1JFU0VSVkVEX0xJVFRMRQkweDA4Ci0KLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX0JJRwkJMHgwRgotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcJMTYKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX0xJVFRMRQkJMHhGMAotI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfU0hfTElUVExFCTQKLQotI2RlZmluZQlTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9CSUcJOAotI2RlZmluZQlTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUJNAotCi0jZGVmaW5lCVNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0JJRwkwCi0jZGVmaW5lCVNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0xJVFRMRQkxMgotCi0vKiBFeHRlcm5hbCBzeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBleHRfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWVzX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJZXNfYml0czJbMV07Ci0JdW5zaWduZWQgY2hhcgllc19pZmRbMl07Ci0Jc3RydWN0CXN5bV9leHQgZXNfYXN5bTsKLX07Ci0KLSNkZWZpbmUJRVhUX0JJVFMxX0pNUFRCTF9CSUcJCTB4ODAKLSNkZWZpbmUJRVhUX0JJVFMxX0pNUFRCTF9MSVRUTEUJCTB4MDEKLQotI2RlZmluZQlFWFRfQklUUzFfQ09CT0xfTUFJTl9CSUcJMHg0MAotI2RlZmluZQlFWFRfQklUUzFfQ09CT0xfTUFJTl9MSVRUTEUJMHgwMgotCi0jZGVmaW5lCUVYVF9CSVRTMV9XRUFLRVhUX0JJRwkJMHgyMAotI2RlZmluZQlFWFRfQklUUzFfV0VBS0VYVF9MSVRUTEUJMHgwNAotCi0vKiBEZW5zZSBudW1iZXJzIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZG5yX2V4dCB7Ci0JdW5zaWduZWQgY2hhcglkX3JmZFs0XTsKLQl1bnNpZ25lZCBjaGFyCWRfaW5kZXhbNF07Ci19OwotCi0vKiBSZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3IgKi8KLQotc3RydWN0IHJmZF9leHQgewotICB1bnNpZ25lZCBjaGFyCXJmZFs0XTsKLX07Ci0KLS8qIE9wdGltaXplciBzeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBvcHRfZXh0IHsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMxWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czJbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzM1sxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHM0WzFdOwotICBzdHJ1Y3Qgcm5keF9leHQgb19ybmR4OwotICB1bnNpZ25lZCBjaGFyIG9fb2Zmc2V0WzRdOwotfTsKLQotI2RlZmluZSBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUcJMTYKLSNkZWZpbmUgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFCTAKLQotI2RlZmluZSBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9CSUcJOAotI2RlZmluZSBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9MSVRUTEUJOAotCi0jZGVmaW5lIE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0JJRwkwCi0jZGVmaW5lIE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0xJVFRMRQkxNgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3BlLmggYi9pbmNsdWRlL2NvZmYvcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VhMWY2Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKiBQRSBDT0ZGIGhlYWRlciBpbmZvcm1hdGlvbiAqLwotCi0jaWZuZGVmIF9QRV9ICi0jZGVmaW5lIF9QRV9ICi0KLS8qIE5UIHNwZWNpZmljIGZpbGUgYXR0cmlidXRlcyAqLwotI2RlZmluZSBJTUFHRV9GSUxFX1JFTE9DU19TVFJJUFBFRCAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIElNQUdFX0ZJTEVfRVhFQ1VUQUJMRV9JTUFHRSAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgSU1BR0VfRklMRV9MSU5FX05VTVNfU1RSSVBQRUQgICAgICAgIDB4MDAwNAotI2RlZmluZSBJTUFHRV9GSUxFX0xPQ0FMX1NZTVNfU1RSSVBQRUQgICAgICAgMHgwMDA4Ci0jZGVmaW5lIElNQUdFX0ZJTEVfQllURVNfUkVWRVJTRURfTE8gICAgICAgICAweDAwODAKLSNkZWZpbmUgSU1BR0VfRklMRV8zMkJJVF9NQUNISU5FICAgICAgICAgICAgIDB4MDEwMAotI2RlZmluZSBJTUFHRV9GSUxFX0RFQlVHX1NUUklQUEVEICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfU1lTVEVNICAgICAgICAgICAgICAgICAgICAweDEwMDAKLSNkZWZpbmUgSU1BR0VfRklMRV9ETEwgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAotI2RlZmluZSBJTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0hJICAgICAgICAgMHg4MDAwCi0KLS8qIGFkZGl0aW9uYWwgZmxhZ3MgdG8gYmUgc2V0IGZvciBzZWN0aW9uIGhlYWRlcnMgdG8gYWxsb3cgdGhlIE5UIGxvYWRlciB0bwotICAgcmVhZCBhbmQgd3JpdGUgdG8gdGhlIHNlY3Rpb24gZGF0YSAodG8gcmVwbGFjZSB0aGUgYWRkcmVzc2VzIG9mIGRhdGEgaW4KLSAgIGRsbHMgZm9yIG9uZSB0aGluZyk7IGFsc28gdG8gZXhlY3V0ZSB0aGUgc2VjdGlvbiBpbiAudGV4dCdzIGNhc2UgKi8KLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9ESVNDQVJEQUJMRSAweDAyMDAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fRVhFQ1VURSAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNX1JFQUQgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9XUklURSAgICAgICAweDgwMDAwMDAwCi0KLS8qCi0gKiBTZWN0aW9uIGNoYXJhY3RlcmlzdGljcyBhZGRlZCBmb3IgcHBjLW50Ci0gKi8KLQotI2RlZmluZSBJTUFHRV9TQ05fVFlQRV9OT19QQUQgICAgICAgICAgICAgICAgMHgwMDAwMDAwOCAgLyogUmVzZXJ2ZWQuICovCi0KLSNkZWZpbmUgSU1BR0VfU0NOX0NOVF9DT0RFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAgIC8qIFNlY3Rpb24gY29udGFpbnMgY29kZS4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX0NOVF9JTklUSUFMSVpFRF9EQVRBICAgICAgIDB4MDAwMDAwNDAgIC8qIFNlY3Rpb24gY29udGFpbnMgaW5pdGlhbGl6ZWQgZGF0YS4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEgICAgIDB4MDAwMDAwODAgIC8qIFNlY3Rpb24gY29udGFpbnMgdW5pbml0aWFsaXplZCBkYXRhLiAqLwotCi0jZGVmaW5lIElNQUdFX1NDTl9MTktfT1RIRVIgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwICAvKiBSZXNlcnZlZC4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX0xOS19JTkZPICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAgIC8qIFNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgb3Igc29tZSBvdGhlciB0eXBlIG9mIGluZm9ybWF0aW9uLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fTE5LX1JFTU9WRSAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMCAgLyogU2VjdGlvbiBjb250ZW50cyB3aWxsIG5vdCBiZWNvbWUgcGFydCBvZiBpbWFnZS4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX0xOS19DT01EQVQgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAgIC8qIFNlY3Rpb24gY29udGVudHMgY29tZGF0LiAqLwotCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fRkFSREFUQSAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0KLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9QVVJHRUFCTEUgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV8xNkJJVCAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9MT0NLRUQgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9QUkVMT0FEICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKLQotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMUJZVEVTICAgICAgICAgICAgICAgMHgwMDEwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMkJZVEVTICAgICAgICAgICAgICAgMHgwMDIwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fNEJZVEVTICAgICAgICAgICAgICAgMHgwMDMwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fOEJZVEVTICAgICAgICAgICAgICAgMHgwMDQwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMTZCWVRFUyAgICAgICAgICAgICAgMHgwMDUwMDAwMCAgLyogRGVmYXVsdCBhbGlnbm1lbnQgaWYgbm8gb3RoZXJzIGFyZSBzcGVjaWZpZWQuICovCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl8zMkJZVEVTICAgICAgICAgICAgICAweDAwNjAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9BTElHTl82NEJZVEVTICAgICAgICAgICAgICAweDAwNzAwMDAwCi0KLQotI2RlZmluZSBJTUFHRV9TQ05fTE5LX05SRUxPQ19PVkZMICAgICAgICAgICAgMHgwMTAwMDAwMCAgLyogU2VjdGlvbiBjb250YWlucyBleHRlbmRlZCByZWxvY2F0aW9ucy4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9OT1RfQ0FDSEVEICAgICAgICAgICAgIDB4MDQwMDAwMDAgIC8qIFNlY3Rpb24gaXMgbm90IGNhY2hhYmxlLiAgICAgICAgICAgICAgICovCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fTk9UX1BBR0VEICAgICAgICAgICAgICAweDA4MDAwMDAwICAvKiBTZWN0aW9uIGlzIG5vdCBwYWdlYWJsZS4gICAgICAgICAgICAgICAqLwotI2RlZmluZSBJTUFHRV9TQ05fTUVNX1NIQVJFRCAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMCAgLyogU2VjdGlvbiBpcyBzaGFyZWFibGUuICAgICAgICAgICAgICAgICAgKi8KLQotLyogQ09NREFUIHNlbGVjdGlvbiBjb2Rlcy4gICovCi0KLSNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9OT0RVUExJQ0FURVMgICAgICgxKSAvKiBXYXJuIGlmIGR1cGxpY2F0ZXMuICAqLwotI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWQkJICAgICAoMikgLyogTm8gd2FybmluZy4gICovCi0jZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfU0FNRV9TSVpFCSAgICAgKDMpIC8qIFdhcm4gaWYgZGlmZmVyZW50IHNpemUuICAqLwotI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENICSAgICAgKDQpIC8qIFdhcm4gaWYgZGlmZmVyZW50LiAgKi8KLSNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9BU1NPQ0lBVElWRQkgICAgICg1KSAvKiBCYXNlIG9uIG90aGVyIHNlY3Rpb24uICAqLwotCi0vKiBNYWdpYyB2YWx1ZXMgdGhhdCBhcmUgdHJ1ZSBmb3IgYWxsIGRvcy9udCBpbXBsZW1lbnRhdGlvbnMgKi8KLSNkZWZpbmUgRE9TTUFHSUMgICAgICAgMHg1YTRkICAKLSNkZWZpbmUgTlRfU0lHTkFUVVJFICAgMHgwMDAwNDU1MAotCi0gIC8qIE5UIGFsbG93cyBsb25nIGZpbGVuYW1lcywgd2Ugd2FudCB0byBhY2NvbW1vZGF0ZSB0aGlzLiAgVGhpcyBtYXkgYnJlYWsKLSAgICAgc29tZSBvZiB0aGUgYmZkIGZ1bmN0aW9ucyAqLwotI3VuZGVmICBGSUxOTUxFTgotI2RlZmluZSBGSUxOTUxFTgkxOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0KLXN0cnVjdCBleHRlcm5hbF9QRUlfZmlsZWhkcgotewotICAvKiBET1MgaGVhZGVyIGZpZWxkcyAqLwotICBjaGFyIGVfbWFnaWNbMl07CQkvKiBNYWdpYyBudW1iZXIsIDB4NWE0ZCAqLwotICBjaGFyIGVfY2JscFsyXTsJCS8qIEJ5dGVzIG9uIGxhc3QgcGFnZSBvZiBmaWxlLCAweDkwICovCi0gIGNoYXIgZV9jcFsyXTsJCQkvKiBQYWdlcyBpbiBmaWxlLCAweDMgKi8KLSAgY2hhciBlX2NybGNbMl07CQkvKiBSZWxvY2F0aW9ucywgMHgwICovCi0gIGNoYXIgZV9jcGFyaGRyWzJdOwkJLyogU2l6ZSBvZiBoZWFkZXIgaW4gcGFyYWdyYXBocywgMHg0ICovCi0gIGNoYXIgZV9taW5hbGxvY1syXTsJCS8qIE1pbmltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQsIDB4MCAqLwotICBjaGFyIGVfbWF4YWxsb2NbMl07CQkvKiBNYXhpbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkLCAweEZGRkYgKi8KLSAgY2hhciBlX3NzWzJdOwkJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBTUyB2YWx1ZSwgMHgwICovCi0gIGNoYXIgZV9zcFsyXTsJCQkvKiBJbml0aWFsIFNQIHZhbHVlLCAweGI4ICovCi0gIGNoYXIgZV9jc3VtWzJdOwkJLyogQ2hlY2tzdW0sIDB4MCAqLwotICBjaGFyIGVfaXBbMl07CQkJLyogSW5pdGlhbCBJUCB2YWx1ZSwgMHgwICovCi0gIGNoYXIgZV9jc1syXTsJCQkvKiBJbml0aWFsIChyZWxhdGl2ZSkgQ1MgdmFsdWUsIDB4MCAqLwotICBjaGFyIGVfbGZhcmxjWzJdOwkJLyogRmlsZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUsIDB4NDAgKi8KLSAgY2hhciBlX292bm9bMl07CQkvKiBPdmVybGF5IG51bWJlciwgMHgwICovCi0gIGNoYXIgZV9yZXNbNF1bMl07CQkvKiBSZXNlcnZlZCB3b3JkcywgYWxsIDB4MCAqLwotICBjaGFyIGVfb2VtaWRbMl07CQkvKiBPRU0gaWRlbnRpZmllciAoZm9yIGVfb2VtaW5mbyksIDB4MCAqLwotICBjaGFyIGVfb2VtaW5mb1syXTsJCS8qIE9FTSBpbmZvcm1hdGlvbjsgZV9vZW1pZCBzcGVjaWZpYywgMHgwICovCi0gIGNoYXIgZV9yZXMyWzEwXVsyXTsJCS8qIFJlc2VydmVkIHdvcmRzLCBhbGwgMHgwICovCi0gIGNoYXIgZV9sZmFuZXdbNF07CQkvKiBGaWxlIGFkZHJlc3Mgb2YgbmV3IGV4ZSBoZWFkZXIsIDB4ODAgKi8KLSAgY2hhciBkb3NfbWVzc2FnZVsxNl1bNF07CS8qIG90aGVyIHN0dWZmLCBhbHdheXMgZm9sbG93IERPUyBoZWFkZXIgKi8KLSAgY2hhciBudF9zaWduYXR1cmVbNF07CQkvKiByZXF1aXJlZCBOVCBzaWduYXR1cmUsIDB4NDU1MCAqLyAKLQotICAvKiBGcm9tIHN0YW5kYXJkIGhlYWRlciAqLyAgCi0KLQotICBjaGFyIGZfbWFnaWNbMl07CQkvKiBtYWdpYyBudW1iZXIJCQkqLwotICBjaGFyIGZfbnNjbnNbMl07CQkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGNoYXIgZl90aW1kYXRbNF07CQkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgY2hhciBmX3N5bXB0cls0XTsJCS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgY2hhciBmX25zeW1zWzRdOwkJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIGNoYXIgZl9vcHRoZHJbMl07CQkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgY2hhciBmX2ZsYWdzWzJdOwkJLyogZmxhZ3MJCQkqLwotCi19OwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLS8qIFRoZSBmaWxlaGRyIGlzIG9ubHkgd2VpcmQgaW4gaW1hZ2VzICovCi0KLSN1bmRlZiBGSUxIRFIKLSNkZWZpbmUgRklMSERSIHN0cnVjdCBleHRlcm5hbF9QRUlfZmlsZWhkcgotI3VuZGVmIEZJTEhTWgotI2RlZmluZSBGSUxIU1ogMTUyCi0KLSNlbmRpZiAvKiBDT0ZGX0lNQUdFX1dJVEhfUEUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIEFPVVRIRFIgc3RhbmRhcmQ7Ci0KLSAgLyogTlQgZXh0cmEgZmllbGRzOyBzZWUgaW50ZXJuYWwuaCBmb3IgZGVzY3JpcHRpb25zICovCi0gIGNoYXIgIEltYWdlQmFzZVs0XTsKLSAgY2hhciAgU2VjdGlvbkFsaWdubWVudFs0XTsKLSAgY2hhciAgRmlsZUFsaWdubWVudFs0XTsKLSAgY2hhciAgTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uWzJdOwotICBjaGFyICBNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb25bMl07Ci0gIGNoYXIgIE1ham9ySW1hZ2VWZXJzaW9uWzJdOwotICBjaGFyICBNaW5vckltYWdlVmVyc2lvblsyXTsKLSAgY2hhciAgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uWzJdOwotICBjaGFyICBNaW5vclN1YnN5c3RlbVZlcnNpb25bMl07Ci0gIGNoYXIgIFJlc2VydmVkMVs0XTsKLSAgY2hhciAgU2l6ZU9mSW1hZ2VbNF07Ci0gIGNoYXIgIFNpemVPZkhlYWRlcnNbNF07Ci0gIGNoYXIgIENoZWNrU3VtWzRdOwotICBjaGFyICBTdWJzeXN0ZW1bMl07Ci0gIGNoYXIgIERsbENoYXJhY3RlcmlzdGljc1syXTsKLSAgY2hhciAgU2l6ZU9mU3RhY2tSZXNlcnZlWzRdOwotICBjaGFyICBTaXplT2ZTdGFja0NvbW1pdFs0XTsKLSAgY2hhciAgU2l6ZU9mSGVhcFJlc2VydmVbNF07Ci0gIGNoYXIgIFNpemVPZkhlYXBDb21taXRbNF07Ci0gIGNoYXIgIExvYWRlckZsYWdzWzRdOwotICBjaGFyICBOdW1iZXJPZlJ2YUFuZFNpemVzWzRdOwotICAvKiBJTUFHRV9EQVRBX0RJUkVDVE9SWSBEYXRhRGlyZWN0b3J5W0lNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTXTsgKi8KLSAgY2hhciAgRGF0YURpcmVjdG9yeVsxNl1bMl1bNF07IC8qIDE2IGVudHJpZXMsIDIgZWxlbWVudHMvZW50cnksIDQgY2hhcnMgKi8KLQotfSBQRUFPVVRIRFI7Ci0KLQotI3VuZGVmIEFPVVRTWgotI2RlZmluZSBBT1VUU1ogKEFPVVRIRFJTWiArIDE5NikKLQotI3VuZGVmICBFX0ZJTE5NTEVOCi0jZGVmaW5lIEVfRklMTk1MRU4JMTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2VuZGlmCi0KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvcG93ZXJwYy5oIGIvaW5jbHVkZS9jb2ZmL3Bvd2VycGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1MmNmOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvcG93ZXJwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qIEJhc2ljIGNvZmYgaW5mb3JtYXRpb24gZm9yIHRoZSBQb3dlclBDCi0gKgotICogQmFzZWQgb24gY29mZi9yczYwMDAuaCwgY29mZi9pMzg2LmggYW5kIG90aGVycy4KLSAqCi0gKiBJbml0aWFsIHJlbGVhc2U6IEtpbSBLbnV0dGlsYSAoa3JrQGN5Z251cy5jb20pCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotICBjaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIGNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICBjaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotICBjaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICBjaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotLyogQml0cyBmb3IgZl9mbGFnczoKLSAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCi0gKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKLSAqLwotCi0jZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCi0jZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikKLSNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQotI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQotCi0vKiBleHRyYSBOVCBkZWZpbmVzICovCi0jZGVmaW5lIFBQQ01BR0lDICAgICAgIDA3NjAgICAgICAgICAvKiBwZWVrZWQgb24gYWEgUG93ZXJQQyBXaW5kb3dzIE5UIGJveCAqLwotI2RlZmluZSBET1NNQUdJQyAgICAgICAweDVhNGQgICAgICAgLyogZnJvbSBhcm0uaCwgaTM4Ni5oICovCi0jZGVmaW5lIE5UX1NJR05BVFVSRSAgIDB4MDAwMDQ1NTAgICAvKiBmcm9tIGFybS5oLCBpMzg2LmggKi8KLQotLyogZnJvbSB3aW5udC5oICovCi0jZGVmaW5lIElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyAgICAgICAgMHgxMGIKLQotI2RlZmluZSBQUENCQURNQUcoeCkgKCh4KS5mX21hZ2ljICE9IFBQQ01BR0lDKSAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0gIGNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJICAgICovCi0gIGNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIGNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkgICAgICAgICAgICAqLwotICBjaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSAgICAqLwotICBjaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JICAgICovCi0gIGNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSAgICAqLwotICBjaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkgICAgKi8KLSAgY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMgICAgKi8KLSAgY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkgICAgKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotI2RlZmluZSBfTElCICIubGliIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotICB1bmlvbiB7Ci0gICAgY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCAqLwotICAgIGNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSAgICAgICAqLwotICB9IGxfYWRkcjsKLSAgY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkgICAgICAgICAgICAgICAgICAgICAgICovCi19OwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTggICAgIC8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lICAgICAgICovCi0KLS8qIEFsbG93IHRoZSBmaWxlIG5hbWUgbGVuZ3RoIHRvIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGluY2x1ZGluZyBmaWxlICAgKi8KLSNpZm5kZWYgRV9GSUxOTUxFTgotI2RlZmluZSBFX0ZJTE5NTEVOCTE0Ci0jZW5kaWYKLQotI2RlZmluZSBFX0RJTU5VTQk0ICAgICAvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfdGFnbmR4WzRdOwkgICAgICAgICAgIC8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggICAgICAgKi8KLSAgICB1bmlvbiB7Ci0gICAgICBzdHJ1Y3QgewotCWNoYXIgIHhfbG5ub1syXTsgICAgICAgICAgIC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICAgICAgICAgKi8KLQljaGFyICB4X3NpemVbMl07ICAgICAgICAgICAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAgICAgICAgICAgICovCi0gICAgICB9IHhfbG5zejsKLSAgICAgIGNoYXIgeF9mc2l6ZVs0XTsJICAgICAgICAgICAvKiBzaXplIG9mIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCi0gICAgfSB4X21pc2M7Ci0gICAgdW5pb24gewotICAgICAgc3RydWN0IHsJCSAgICAgICAgICAgLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICAgICAgICAgICAqLwotCWNoYXIgeF9sbm5vcHRyWzRdOyAgICAgICAgIC8qIHB0ciB0byBmY24gbGluZSAjICAgICAgICAgICAgICAgKi8KLQljaGFyIHhfZW5kbmR4WzRdOwkgICAvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgICAgICAgICovCi0gICAgICB9IHhfZmNuOwotICAgICAgc3RydWN0IHsJCSAgICAgICAgICAgLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICAgICAgICAqLwotCWNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0gICAgICB9IHhfYXJ5OwotICAgIH0geF9mY25hcnk7Ci0gICAgY2hhciB4X3R2bmR4WzJdOwkJICAgLyogdHYgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAqLwotICB9IHhfc3ltOwotICAKLSAgdW5pb24gewotICAgIGNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciB4X3plcm9lc1s0XTsKLSAgICAgIGNoYXIgeF9vZmZzZXRbNF07Ci0gICAgfSB4X247Ci0gIH0geF9maWxlOwotICAKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfc2NubGVuWzRdOwkgICAgICAgICAgIC8qIHNlY3Rpb24gbGVuZ3RoICAgICAgICAgICAgICAgICAgKi8KLSAgICBjaGFyIHhfbnJlbG9jWzJdOwkgICAgICAgICAgIC8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICAgICAgICAgICAgKi8KLSAgICBjaGFyIHhfbmxpbm5vWzJdOwkgICAgICAgICAgIC8qICMgbGluZSBudW1iZXJzICAgICAgICAgICAgICAgICAgKi8KLSAgICBjaGFyIHhfY2hlY2tzdW1bNF07CQkgICAvKiBzZWN0aW9uIENPTURBVCBjaGVja3N1bQkgICAgICAqLwotICAgIGNoYXIgeF9hc3NvY2lhdGVkWzJdOwkgICAvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0gICAgY2hhciB4X2NvbWRhdFsxXTsJCSAgIC8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyCSAgICAgICovCi0gIH0geF9zY247Ci19OwotCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLSNkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvcnM2MDAwLmggYi9pbmNsdWRlL2NvZmYvcnM2MDAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZWYxZDkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3JzNjAwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qIElCTSBSUy82MDAwICJYQ09GRiIgZmlsZSBkZWZpbml0aW9ucyBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgRklYTUU6IENhbiBzb21lb25lIHByb3ZpZGUgYSB0cmFuc2xpdGVyYXRpb24gb2YgdGhpcyBuYW1lIGludG8gQVNDSUk/Ci0gICBVc2luZyB0aGUgZm9sbG93aW5nIGNoYXJzIGNhdXNlZCBhIGNvbXBpbGVyIHdhcm5pbmcgb24gSElVWCAoc28gSSByZXBsYWNlZAotICAgdGhlbSB3aXRoIG9jdGFsIGVzY2FwZXMpLCBhbmQgaXNuJ3QgdXNlZnVsIHdpdGhvdXQgYW4gdW5kZXJzdGFuZGluZyBvZiB3aGF0Ci0gICBjaGFyYWN0ZXIgc2V0IGl0IGlzLgotICAgV3JpdHRlbiBieSBNaW1pIFBoXDM3M1wzNjRuZy1UaFwzNDVvIFZcMzY1IG9mIElCTQotICAgYW5kIEpvaG4gR2lsbW9yZSBvZiBDeWdudXMgU3VwcG9ydC4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0gICAgICAgIC8qIElCTSBSUy82MDAwICovCi0jZGVmaW5lIFU4MDJXUk1BR0lDICAgICAwNzMwICAgIC8qIHdyaXRlYWJsZSB0ZXh0IHNlZ21lbnRzICoqY2hoKiogICAgICAqLwotI2RlZmluZSBVODAyUk9NQUdJQyAgICAgMDczNSAgICAvKiByZWFkb25seSBzaGFyYWJsZSB0ZXh0IHNlZ21lbnRzICAgICAgKi8KLSNkZWZpbmUgVTgwMlRPQ01BR0lDICAgIDA3MzcgICAgLyogcmVhZG9ubHkgdGV4dCBzZWdtZW50cyBhbmQgVE9DICAgICAgICovCi0KLSNkZWZpbmUgQkFETUFHKHgpCVwKLQkoKHgpLmZfbWFnaWMgIT0gVTgwMlJPTUFHSUMgJiYgKHgpLmZfbWFnaWMgIT0gVTgwMldSTUFHSUMgJiYgXAotCSAoeCkuZl9tYWdpYyAhPSBVODAyVE9DTUFHSUMpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgdW5zaWduZWQgY2hhcgltYWdpY1syXTsJLyogdHlwZSBvZiBmaWxlCQkJKi8KLSAgdW5zaWduZWQgY2hhcgl2c3RhbXBbMl07CS8qIHZlcnNpb24gc3RhbXAJCSovCi0gIHVuc2lnbmVkIGNoYXIJdHNpemVbNF07CS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkgKi8KLSAgdW5zaWduZWQgY2hhcglkc2l6ZVs0XTsJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCSovCi0gIHVuc2lnbmVkIGNoYXIJYnNpemVbNF07CS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkqLwotICB1bnNpZ25lZCBjaGFyCWVudHJ5WzRdOwkvKiBlbnRyeSBwdC4JCQkqLwotICB1bnNpZ25lZCBjaGFyCXRleHRfc3RhcnRbNF07CS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhcglkYXRhX3N0YXJ0WzRdOwkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIJb190b2NbNF07CS8qIGFkZHJlc3Mgb2YgVE9DICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbmVudHJ5WzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiBlbnRyeSBwb2ludCAqLwotICB1bnNpZ25lZCBjaGFyCW9fc250ZXh0WzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiAudGV4dCBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbmRhdGFbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC5kYXRhIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglvX3NudG9jWzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiBUT0MgKi8KLSAgdW5zaWduZWQgY2hhcglvX3NubG9hZGVyWzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiAubG9hZGVyIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglvX3NuYnNzWzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiAuYnNzIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglvX2FsZ250ZXh0WzJdOwkvKiAudGV4dCBhbGlnbm1lbnQgKi8KLSAgdW5zaWduZWQgY2hhcglvX2FsZ25kYXRhWzJdOwkvKiAuZGF0YSBhbGlnbm1lbnQgKi8KLSAgdW5zaWduZWQgY2hhcglvX21vZHR5cGVbMl07CS8qIG1vZHVsZSB0eXBlICg/PykgKi8KLSAgdW5zaWduZWQgY2hhciBvX2NwdXR5cGVbMl07CS8qIGNwdSB0eXBlICovCi0gIHVuc2lnbmVkIGNoYXIJb19tYXhzdGFja1s0XTsJLyogbWF4IHN0YWNrIHNpemUgKD8/KSAqLwotICB1bnNpZ25lZCBjaGFyIG9fbWF4ZGF0YVs0XTsJLyogbWF4IGRhdGEgc2l6ZSAoPz8pICovCi0gIHVuc2lnbmVkIGNoYXIJb19yZXN2MlsxMl07CS8qIHJlc2VydmVkICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiA3MgotI2RlZmluZSBTTUFMTF9BT1VUU1ogKDI4KQotI2RlZmluZSBBT1VUSERSU1ogNzIKLQotI2RlZmluZQlSUzZLX0FPVVRIRFJfT01BR0lDCTB4MDEwNwkvKiBvbGQ6IHRleHQgJiBkYXRhIHdyaXRlYWJsZSAqLwotI2RlZmluZQlSUzZLX0FPVVRIRFJfTk1BR0lDCTB4MDEwOAkvKiBuZXc6IHRleHQgci9vLCBkYXRhIHIvdyAqLwotI2RlZmluZQlSUzZLX0FPVVRIRFJfWk1BR0lDCTB4MDEwQgkvKiBwYWdlZDogdGV4dCByL28sIGJvdGggcGFnZS1hbGlnbmVkICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9QQUQJIi5wYWQiCi0jZGVmaW5lIF9MT0FERVIJIi5sb2FkZXIiCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qIFhDT0ZGIHVzZXMgYSBzcGVjaWFsIC5sb2FkZXIgc2VjdGlvbiB3aXRoIHR5cGUgU1RZUF9MT0FERVIuICAqLwotI2RlZmluZSBTVFlQX0xPQURFUiAweDEwMDAKLQotLyogWENPRkYgdXNlcyBhIHNwZWNpYWwgLmRlYnVnIHNlY3Rpb24gd2l0aCB0eXBlIFNUWVBfREVCVUcuICAqLwotI2RlZmluZSBTVFlQX0RFQlVHIDB4MjAwMAotCi0vKiBYQ09GRiBoYW5kbGVzIGxpbmUgbnVtYmVyIG9yIHJlbG9jYXRpb24gb3ZlcmZsb3cgYnkgY3JlYXRpbmcKLSAgIGFub3RoZXIgc2VjdGlvbiBoZWFkZXIgd2l0aCBTVFlQX09WUkZMTyBzZXQuICAqLwotI2RlZmluZSBTVFlQX09WUkZMTyAweDgwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGNoYXIgeF9zY25sZW5bNF07Ci0JCXVuc2lnbmVkIGNoYXIgeF9wYXJtaGFzaFs0XTsKLQkJdW5zaWduZWQgY2hhciB4X3NuaGFzaFsyXTsKLQkJdW5zaWduZWQgY2hhciB4X3NtdHlwWzFdOwotCQl1bnNpZ25lZCBjaGFyIHhfc21jbGFzWzFdOwotCQl1bnNpZ25lZCBjaGFyIHhfc3RhYls0XTsKLQkJdW5zaWduZWQgY2hhciB4X3Nuc3RhYlsyXTsKLQl9IHhfY3NlY3Q7Ci0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotI2RlZmluZSBEQlhNQVNLIDB4ODAJCS8qIGZvciBkYnggc3RvcmFnZSBtYXNrICovCi0jZGVmaW5lIFNZTU5BTUVfSU5fREVCVUcoc3ltcHRyKSAoKHN5bXB0ciktPm5fc2NsYXNzICYgREJYTUFTSykKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3NpemVbMV07Ci0gIGNoYXIgcl90eXBlWzFdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxMAotCi0jZGVmaW5lIERFRkFVTFRfREFUQV9TRUNUSU9OX0FMSUdOTUVOVCA0Ci0jZGVmaW5lIERFRkFVTFRfQlNTX1NFQ1RJT05fQUxJR05NRU5UIDQKLSNkZWZpbmUgREVGQVVMVF9URVhUX1NFQ1RJT05fQUxJR05NRU5UIDQKLS8qIEZvciBuZXcgc2VjdGlvbnMgd2UgaGF2bid0IGhlYXJkIG9mIGJlZm9yZSAqLwotI2RlZmluZSBERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UIDQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9zaC5oIGIvaW5jbHVkZS9jb2ZmL3NoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTU3ZGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3NoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBIaXRhY2hpIFNIICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLQotI2RlZmluZQlTSF9BUkNIX01BR0lDX0JJRwkweDA1MDAKLSNkZWZpbmUJU0hfQVJDSF9NQUdJQ19MSVRUTEUJMHgwNTUwICAvKiBMaXR0bGUgZW5kaWFuIFNIICovCi0KLQotI2RlZmluZSBTSEJBRE1BRyh4KSBcCi0gKCgoeCkuZl9tYWdpYyE9U0hfQVJDSF9NQUdJQ19CSUcpICYmIFwKLSAgKCh4KS5mX21hZ2ljIT1TSF9BUkNIX01BR0lDX0xJVFRMRSkpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSBoOCBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLS8qIFNIIHJlbG9jYXRpb24gdHlwZXMuICBOb3QgYWxsIG9mIHRoZXNlIGFyZSBhY3R1YWxseSB1c2VkLiAgKi8KLQotI2RlZmluZSBSX1NIX1VOVVNFRAkwCQkvKiBvbmx5IHVzZWQgaW50ZXJuYWxseSAqLwotI2RlZmluZSBSX1NIX1BDUkVMOCAJMwkJLyogIDggYml0IHBjcmVsIAkqLwotI2RlZmluZSBSX1NIX1BDUkVMMTYgCTQJCS8qIDE2IGJpdCBwY3JlbCAJKi8KLSNkZWZpbmUgUl9TSF9ISUdIOCAgCTUJCS8qIGhpZ2ggOCBiaXRzIG9mIDI0IGJpdCBhZGRyZXNzICovCi0jZGVmaW5lIFJfU0hfTE9XMTYgCTcJCS8qIGxvdyAxNiBiaXRzIG9mIDI0IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9TSF9JTU0yNAk2CQkvKiAyNCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfUENESVNQOEJZNAk5ICAJCS8qIFBDIHJlbCA4IGJpdHMgKjQgK3ZlICovCi0jZGVmaW5lIFJfU0hfUENESVNQOEJZMgkxMCAgCQkvKiBQQyByZWwgOCBiaXRzICoyICt2ZSAqLwotI2RlZmluZSBSX1NIX1BDRElTUDggICAgMTEgIAkJLyogOCBiaXQgYnJhbmNoICovCi0jZGVmaW5lIFJfU0hfUENESVNQICAgICAxMiAgCQkvKiAxMiBiaXQgYnJhbmNoICovCi0jZGVmaW5lIFJfU0hfSU1NMzIgICAgICAxNCAgICAJCS8qIDMyIGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9TSF9JTU04ICAgCTE2CQkvKiA4IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9TSF9JTU04QlkyICAgIDE3CQkvKiA4IGJpdCBpbW1lZGlhdGUgKjIgKi8KLSNkZWZpbmUgUl9TSF9JTU04Qlk0ICAgIDE4CQkvKiA4IGJpdCBpbW1lZGlhdGUgKjQgKi8KLSNkZWZpbmUgUl9TSF9JTU00ICAgCTE5CQkvKiA0IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9TSF9JTU00QlkyICAgIDIwCQkvKiA0IGJpdCBpbW1lZGlhdGUgKjIgKi8KLSNkZWZpbmUgUl9TSF9JTU00Qlk0ICAgIDIxCQkvKiA0IGJpdCBpbW1lZGlhdGUgKjQgKi8KLSNkZWZpbmUgUl9TSF9QQ1JFTElNTThCWTIgICAyMgkJLyogUEMgcmVsIDggYml0cyAqMiB1bnNpZ25lZCAqLwotI2RlZmluZSBSX1NIX1BDUkVMSU1NOEJZNCAgIDIzCQkvKiBQQyByZWwgOCBiaXRzICo0IHVuc2lnbmVkICovCi0jZGVmaW5lIFJfU0hfSU1NMTYgICAgICAyNCAgICAJCS8qIDE2IGJpdCBpbW1lZGlhdGUgKi8KLQotLyogVGhlIHN3aXRjaCB0YWJsZSByZWxvYyB0eXBlcyBhcmUgdXNlZCBmb3IgcmVsYXhpbmcuICBUaGV5IGFyZQotICAgZ2VuZXJhdGVkIGZvciBleHByZXNzaW9ucyBzdWNoIGFzCi0gICAgIC53b3JkIEwxIC0gTDIKLSAgIFRoZSByX29mZnNldCBmaWVsZCBob2xkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYyBhZGRyZXNzCi0gICBhbmQgTDIuICAqLwotI2RlZmluZSBSX1NIX1NXSVRDSDgJMzMJCS8qIDggYml0IHN3aXRjaCB0YWJsZSBlbnRyeSAqLwotI2RlZmluZSBSX1NIX1NXSVRDSDE2CTI1CQkvKiAxNiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5ICovCi0jZGVmaW5lIFJfU0hfU1dJVENIMzIJMjYJCS8qIDMyIGJpdCBzd2l0Y2ggdGFibGUgZW50cnkgKi8KLQotLyogVGhlIFVTRVMgcmVsb2MgdHlwZSBpcyB1c2VkIGZvciByZWxheGluZy4gIFRoZSBjb21waWxlciB3aWxsCi0gICBnZW5lcmF0ZSAudXNlcyBwc2V1ZG8tb3BzIHdoZW4gaXQgZmluZHMgYSBmdW5jdGlvbiBjYWxsIHdoaWNoIGl0Ci0gICBjYW4gcmVsYXguICBUaGUgcl9vZmZzZXQgZmllbGQgb2YgdGhlIFVTRVMgcmVsb2MgaG9sZHMgdGhlIFBDCi0gICByZWxhdGl2ZSBvZmZzZXQgdG8gdGhlIGluc3RydWN0aW9uIHdoaWNoIGxvYWRzIHRoZSByZWdpc3RlciB1c2VkIGluCi0gICB0aGUgZnVuY3Rpb24gY2FsbC4gICovCi0jZGVmaW5lIFJfU0hfVVNFUwkyNwkJLyogLnVzZXMgcHNldWRvLW9wICovCi0KLS8qIFRoZSBDT1VOVCByZWxvYyB0eXBlIGlzIHVzZWQgZm9yIHJlbGF4aW5nLiAgVGhlIGFzc2VtYmxlciB3aWxsCi0gICBnZW5lcmF0ZSBDT1VOVCByZWxvY3MgZm9yIGFkZHJlc3NlcyByZWZlcnJlZCB0byBieSB0aGUgcmVnaXN0ZXIKLSAgIGxvYWRzIGFzc29jaWF0ZWQgd2l0aCBVU0VTIHJlbG9jcy4gIFRoZSByX29mZnNldCBmaWVsZCBvZiB0aGUgQ09VTlQKLSAgIHJlbG9jIGhvbGRzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFkZHJlc3MgaXMgcmVmZXJlbmNlZCBpbiB0aGUKLSAgIG9iamVjdCBmaWxlLiAgKi8KLSNkZWZpbmUgUl9TSF9DT1VOVAkyOAkJLyogQ291bnQgb2YgY29uc3RhbnQgcG9vbCB1c2VzICovCi0KLS8qIFRoZSBBTElHTiByZWxvYyB0eXBlIGlzIHVzZWQgZm9yIHJlbGF4aW5nLiAgVGhlIHJfb2Zmc2V0IGZpZWxkIGlzCi0gICB0aGUgcG93ZXIgb2YgdHdvIHRvIHdoaWNoIHN1YnNlcXVlbnQgcG9ydGlvbnMgb2YgdGhlIG9iamVjdCBmaWxlCi0gICBtdXN0IGJlIGFsaWduZWQuICAqLwotI2RlZmluZSBSX1NIX0FMSUdOCTI5CQkvKiAuYWxpZ24gcHNldWRvLW9wICovCi0KLS8qIFRoZSBDT0RFIGFuZCBEQVRBIHJlbG9jIHR5cGVzIGFyZSB1c2VkIGZvciBhbGlnbmluZyBsb2FkIGFuZCBzdG9yZQotICAgaW5zdHJ1Y3Rpb25zLiAgVGhlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIGEgQ09ERSByZWxvYyBiZWZvcmUgYQotICAgYmxvY2sgb2YgaW5zdHJ1Y3Rpb25zLiAgSXQgd2lsbCBnZW5lcmF0ZSBhIERBVEEgcmVsb2MgYmVmb3JlIGRhdGEuCi0gICBBIHNlY3Rpb24gc2hvdWxkIGJlIHByb2Nlc3NlZCBhc3N1bWluZyBpdCBjb250YWlucyBkYXRhLCB1bmxlc3MgYQotICAgQ09ERSByZWxvYyBpcyBzZWVuLiAgVGhlIG9ubHkgcmVsZXZhbnQgcGllY2VzIG9mIGluZm9ybWF0aW9uIGluIHRoZQotICAgQ09ERSBhbmQgREFUQSByZWxvY3MgYXJlIHRoZSBzZWN0aW9uIGFuZCB0aGUgYWRkcmVzcy4gIFRoZSBzeW1ib2wKLSAgIGFuZCBvZmZzZXQgYXJlIG1lYW5pbmdsZXNzLiAgKi8KLSNkZWZpbmUgUl9TSF9DT0RFCTMwCQkvKiBzdGFydCBvZiBjb2RlICovCi0jZGVmaW5lIFJfU0hfREFUQQkzMQkJLyogc3RhcnQgb2YgZGF0YSAqLwotCi0vKiBUaGUgTEFCRUwgcmVsb2MgdHlwZSBpcyB1c2VkIGZvciBhbGlnbmluZyBsb2FkIGFuZCBzdG9yZQotICAgaW5zdHJ1Y3Rpb25zLiAgVGhlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIGEgTEFCRUwgcmVsb2MgZm9yIGVhY2gKLSAgIGxhYmVsIHdpdGhpbiBhIGJsb2NrIG9mIGluc3RydWN0aW9ucy4gIFRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHRvCi0gICBhdm9pZCBzd2FwcGluZyBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIHRoZSB0YXJnZXRzIG9mIGJyYW5jaGVzLiAgKi8KLSNkZWZpbmUgUl9TSF9MQUJFTAkzMgkJLyogbGFiZWwgKi8KLQotLyogTkI6IFJfU0hfU1dJVENIOCBpcyAzMyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3NwYXJjLmggYi9pbmNsdWRlL2NvZmYvc3BhcmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhMjRmMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvc3BhcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFNwYXJjLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGFuIGFtYWxnYW1hdGlvbiBvZiBzZXZlcmFsIHN0YW5kYXJkIGluY2x1ZGUgZmlsZXMgdGhhdAotICAgZGVmaW5lIGNvZmYgZm9ybWF0LCBzdWNoIGFzIGZpbGVoZHIuaCwgYW91dGhkci5oLCBhbmQgc28gZm9ydGguICBJbgotICAgYWRkaXRpb24sIGFsbCBkYXRhdHlwZXMgaGF2ZSBiZWVuIHRyYW5zbGF0ZWQgaW50byBjaGFyYWN0ZXIgYXJyYXlzIG9mCi0gICAocHJlc3VtZWQpIGVxdWl2YWxlbnQgc2l6ZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgdGhpcyBmaWxlIGNhbgotICAgYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBzeXN0ZW1zIHdoaWxlIHN0aWxsIHlpZWxkaW5nIHRoZSBzYW1lIHJlc3VsdHMuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotewotICBjaGFyIGZfbWFnaWNbMl07CQkvKiBtYWdpYyBudW1iZXIJCQkqLwotICBjaGFyIGZfbnNjbnNbMl07CQkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGNoYXIgZl90aW1kYXRbNF07CQkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgY2hhciBmX3N5bXB0cls0XTsJCS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgY2hhciBmX25zeW1zWzRdOwkJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIGNoYXIgZl9vcHRoZHJbMl07CQkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgY2hhciBmX2ZsYWdzWzJdOwkJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQkvKiByZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgKi8KLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQkvKiBmaWxlIGlzIGV4ZWN1dGFibGUgKi8KLSNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQkvKiBsaW5lIG51bWJlcnMgc3RyaXBwZWQgKi8KLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkJLyogbG9jYWwgc3ltYm9scyBzdHJpcHBlZCAqLwotCi0jZGVmaW5lIFNQQVJDTUFHSUMJKDA1NDApCi0KLS8qIFRoaXMgaXMgTHlueCdzIGFsbC1wbGF0Zm9ybSBtYWdpYyBudW1iZXIgZm9yIGV4ZWN1dGFibGVzLiAqLwotCi0jZGVmaW5lIExZTlhDT0ZGTUFHSUMJKDA0MTUpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIG1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIgdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIgdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhciBkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhciBic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhciBlbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIHRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0jZGVmaW5lIE9NQUdJQyAgICAgICAgICAwNDA0ICAgIC8qIG9iamVjdCBmaWxlcywgZWcgYXMgb3V0cHV0ICovCi0jZGVmaW5lIFpNQUdJQyAgICAgICAgICAwNDEzICAgIC8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLwotI2RlZmluZSBTVE1BR0lDCQkwNDAxCS8qIHRhcmdldCBzaGxpYiAqLwotI2RlZmluZSBTSE1BR0lDCQkwNDQzCS8qIGhvc3QgICBzaGxpYiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi17Ci0gIGNoYXIgc19uYW1lWzhdOwkJLyogc2VjdGlvbiBuYW1lCQkJKi8KLSAgY2hhciBzX3BhZGRyWzRdOwkJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgY2hhciBzX3ZhZGRyWzRdOwkJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICBjaGFyIHNfc2l6ZVs0XTsJCS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0gIGNoYXIgc19zY25wdHJbNF07CQkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICBjaGFyIHNfcmVscHRyWzRdOwkJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICBjaGFyIHNfbG5ub3B0cls0XTsJCS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotICBjaGFyIHNfbnJlbG9jWzJdOwkJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICBjaGFyIHNfbmxubm9bMl07CQkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIGNoYXIgc19mbGFnc1s0XTsJCS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qIE5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucy4gKi8KLQotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX1RWCSIudHYiCi0jZGVmaW5lIF9JTklUCSIuaW5pdCIKLSNkZWZpbmUgX0ZJTkkJIi5maW5pIgotI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCi0jZGVmaW5lIF9MSUIgIi5saWIiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAgIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICAgZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAgIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4gKi8KLQotc3RydWN0IGV4dGVybmFsX2xpbmVubwotewotICB1bmlvbiB7Ci0gICAgY2hhciBsX3N5bW5keFs0XTsJCS8qIGZuIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAgKi8KLSAgICBjaGFyIGxfcGFkZHJbNF07CQkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIgKi8KLSAgfSBsX2FkZHI7Ci0gIGNoYXIgbF9sbm5vWzJdOwkJLyogbGluZSBudW1iZXIgKi8KLX07Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCSg2KQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgkoOCkJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkoMTQpCS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JKDQpCS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0jaWYgMCAvKiBvZiBkb3VidGZ1bCB2YWx1ZSAqLwotICAgIGNoYXIgZV9ucHRyWzJdWzRdOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfbGVhZGluZ196ZXJvWzFdOwotICAgICAgY2hhciBlX2RieF90eXBlWzFdOwotICAgICAgY2hhciBlX2RieF9kZXNjWzJdOwotICAgIH0gZV9kYng7Ci0jZW5kaWYKLSAgfSBlOwotCi0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLSAgY2hhciBwYWRkaW5nWzJdOwotfTsKLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLXVuaW9uIGV4dGVybmFsX2F1eGVudAotewotICBzdHJ1Y3QgewotICAgIGNoYXIgeF90YWduZHhbNF07CQkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0gICAgdW5pb24gewotICAgICAgc3RydWN0IHsKLQljaGFyICB4X2xubm9bMl07CS8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JY2hhciAgeF9zaXplWzJdOwkvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotICAgICAgfSB4X2xuc3o7Ci0gICAgICBjaGFyIHhfZnNpemVbNF07CQkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0gICAgfSB4X21pc2M7Ci0gICAgdW5pb24gewotICAgICAgc3RydWN0IHsJCQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQljaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQljaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLSAgICAgIH0geF9mY247Ci0gICAgICBzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLSAgICAgIH0geF9hcnk7Ci0gICAgfSB4X2ZjbmFyeTsKLSAgICBjaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotICB9IHhfc3ltOwotICAKLSAgdW5pb24gewotICAgIGNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciB4X3plcm9lc1s0XTsKLSAgICAgIGNoYXIgeF9vZmZzZXRbNF07Ci0gICAgfSB4X247Ci0gIH0geF9maWxlOwotICAKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfc2NubGVuWzRdOwkJLyogc2VjdGlvbiBsZW5ndGggKi8KLSAgICBjaGFyIHhfbnJlbG9jWzJdOwkJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLSAgICBjaGFyIHhfbmxpbm5vWzJdOwkJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgfSB4X3NjbjsKLSAgCi0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3R2ZmlsbFs0XTsJCS8qIHR2IGZpbGwgdmFsdWUgKi8KLSAgICBjaGFyIHhfdHZsZW5bMl07CQkvKiBsZW5ndGggb2YgLnR2ICovCi0gICAgY2hhciB4X3R2cmFuWzJdWzJdOwkJLyogdHYgcmFuZ2UgKi8KLSAgfSB4X3R2OwkJCS8qIC50diBzZWN0aW9uIGluZm8gKGluIGF1eGVudCBvZiBzeW0gLnR2KSkgKi8KLQotICBjaGFyIHhfZmlsbFsyMF07CQkvKiBmb3JjZXMgdG8gMjAtYnl0ZSBzaXplICovCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkyMAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMjAKLQotI2RlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3NwYXJlWzJdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3N5bS5oIGIvaW5jbHVkZS9jb2ZmL3N5bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjIwNGFmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9zeW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0vKiBEZWNsYXJhdGlvbnMgb2YgaW50ZXJuYWwgZm9ybWF0IG9mIE1JUFMgRUNPRkYgc3ltYm9scy4KLSAgIE9yaWdpbmFsbHkgY29udHJpYnV0ZWQgYnkgTUlQUyBDb21wdXRlciBTeXN0ZW1zIGFuZCBUaGlyZCBFeWUgU29mdHdhcmUuCi0gICBDaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0IGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4gIAotCi0gICBUaGlzIGZpbGUgaXMganVzdCBhZ2dyZWdhdGVkIHdpdGggdGhlIGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUgR05VCi0gICByZWxlYXNlOyBpdCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIEdBUywgR0RCLCBvciBvdGhlciBHTlUKLSAgIHByb2dyYW1zLiAgKi8KLQotLyoKLSAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqIHwgQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkxLCAxOTkwIE1JUFMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLnwKLSAqIHwgTUlQUyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuIGdyYW50cyByZXByb2R1Y3Rpb24gYW5kIHVzZSAgIHwKLSAqIHwgcmlnaHRzIHRvIGFsbCBwYXJ0aWVzLCBQUk9WSURFRCB0aGF0IHRoaXMgY29tbWVudCBpcyAgICAgIHwKLSAqIHwgbWFpbnRhaW5lZCBpbiB0aGUgY29weS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqLwotI2lmbmRlZiBfU1lNX0gKLSNkZWZpbmUgX1NZTV9ICi0KLS8qIChDKSBDb3B5cmlnaHQgMTk4NCBieSBUaGlyZCBFeWUgU29mdHdhcmUsIEluYy4KLSAqCi0gKiBUaGlyZCBFeWUgU29mdHdhcmUsIEluYy4gZ3JhbnRzIHJlcHJvZHVjdGlvbiBhbmQgdXNlIHJpZ2h0cyB0bwotICogYWxsIHBhcnRpZXMsIFBST1ZJREVEIHRoYXQgdGhpcyBjb21tZW50IGlzIG1haW50YWluZWQgaW4gdGhlIGNvcHkuCi0gKgotICogVGhpcmQgRXllIG1ha2VzIG5vIGNsYWltcyBhYm91dCB0aGUgYXBwbGljYWJpbGl0eSBvZiB0aGlzCi0gKiBzeW1ib2wgdGFibGUgdG8gYSBwYXJ0aWN1bGFyIHVzZS4KLSAqLwotCi0vKiAKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgVGhpcmQgRXllIFN5bWJvbCBUYWJsZS4KLSAqCi0gKiBTeW1ib2xzIGFyZSBhc3N1bWVkIHRvIGJlIGluICdlbmNvdW50ZXIgb3JkZXInIC0gaS5lLiB0aGUgb3JkZXIgdGhhdAotICogdGhlIHRoaW5ncyB0aGV5IHJlcHJlc2VudCB3ZXJlIGVuY291bnRlcmVkIGJ5IHRoZSBjb21waWxlci9hc3NlbWJsZXIvbG9hZGVyLgotICogRVhDRVBUIGZvciBnbG9iYWxzIQlUaGVzZSBhcmUgYXNzdW1lZCB0byBiZSBidW5jaGVkIHRvZ2V0aGVyLAotICogcHJvYmFibHkgcmlnaHQgYWZ0ZXIgdGhlIGxhc3QgJ25vcm1hbCcgc3ltYm9sLiAgR2xvYmFscyBBUkUgc29ydGVkCi0gKiBpbiBhc2NlbmRpbmcgb3JkZXIuCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEEgYnJpZWYgd29yZCBhYm91dCBUaGlyZCBFeWUgbmFtaW5nL3VzZSBjb252ZW50aW9uczoKLSAqCi0gKiBBbGwgYXJyYXlzIGFuZCBpbmRleCdzIGFyZSAwIGJhc2VkLgotICogQWxsICJpZm9vTWF4IiB2YWx1ZXMgYXJlIHRoZSBoaWdoZXN0IGxlZ2FsIHZhbHVlIFBMVVMgT05FLiBUaGlzIG1ha2VzCi0gKiB0aGVtIGdvb2QgZm9yIGFsbG9jYXRpbmcgYXJyYXlzLCBldGMuIEFsbCBjaGVja3MgYXJlICJpZm9vIDwgaWZvb01heCIuCi0gKgotICogImlzeW0iCUluZGV4IGludG8gdGhlIFNZTWJvbCB0YWJsZS4KLSAqICJpcGQiCUluZGV4IGludG8gdGhlIFByb2NlZHVyZSBEZXNjcmlwdG9yIGFycmF5LgotICogImlmZCIJSW5kZXggaW50byB0aGUgRmlsZSBEZXNjcmlwdG9yIGFycmF5LgotICogImlzcyIJSW5kZXggaW50byBTdHJpbmcgU3BhY2UuCi0gKiAiY2IiCQlDb3VudCBvZiBCeXRlcy4KLSAqICJyZ1BkIglhcnJheSB3aG9zZSBkb21haW4gaXMgIjAuLmlwZE1heC0xIiBhbmQgUmFuR2UgaXMgUERSLgotICogInJnRmQiCWFycmF5IHdob3NlIGRvbWFpbiBpcyAiMC4uaWZkTWF4LTEiIGFuZCBSYW5HZSBpcyBGRFIuCi0gKi8KLQotCi0vKiAKLSAqIFN5bWJvbGljIEhlYWRlciAoSERSKSBzdHJ1Y3R1cmUuCi0gKiBBcyBsb25nIGFzIGFsbCB0aGUgcG9pbnRlcnMgYXJlIHNldCBjb3JyZWN0bHksCi0gKiB3ZSBkb24ndCBjYXJlIFdIQVQgb3JkZXIgdGhlIHZhcmlvdXMgc2VjdGlvbnMgY29tZSBvdXQgaW4hCi0gKgotICogQSBmaWxlIHByb2R1Y2VkIHNvbGVseSBmb3IgdGhlIHVzZSBvZiBDREIgd2lsbCBwcm9iYWJseSBOT1QgaGF2ZQotICogYW55IGluc3RydWN0aW9ucyBvciBkYXRhIGFyZWFzIGluIGl0LCBhcyB0aGVzZSBhcmUgYXZhaWxhYmxlCi0gKiBpbiB0aGUgb3JpZ2luYWwuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXNob3J0CW1hZ2ljOwkJLyogdG8gdmVyaWZ5IHZhbGlkaXR5IG9mIHRoZSB0YWJsZSAqLwotCXNob3J0CXZzdGFtcDsJCS8qIHZlcnNpb24gc3RhbXAgKi8KLQlsb25nCWlsaW5lTWF4OwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyAqLwotCWJmZF92bWEJY2JMaW5lOwkJLyogbnVtYmVyIG9mIGJ5dGVzIGZvciBsaW5lIG51bWJlciBlbnRyaWVzICovCi0JYmZkX3ZtYQljYkxpbmVPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQlsb25nCWlkbk1heDsJCS8qIG1heCBpbmRleCBpbnRvIGRlbnNlIG51bWJlciB0YWJsZSAqLwotCWJmZF92bWEJY2JEbk9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IGRlbnNlIG51bWJlciB0YWJsZSAqLwotCWxvbmcJaXBkTWF4OwkJLyogbnVtYmVyIG9mIHByb2NlZHVyZXMgKi8KLQliZmRfdm1hCWNiUGRPZmZzZXQ7CS8qIG9mZnNldCB0byBwcm9jZWR1cmUgZGVzY3JpcHRvciB0YWJsZSAqLwotCWxvbmcJaXN5bU1heDsJLyogbnVtYmVyIG9mIGxvY2FsIHN5bWJvbHMgKi8KLQliZmRfdm1hCWNiU3ltT2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgbG9jYWwgc3ltYm9scyovCi0JbG9uZwlpb3B0TWF4OwkvKiBtYXggaW5kZXggaW50byBvcHRpbWl6YXRpb24gc3ltYm9sIGVudHJpZXMgKi8KLQliZmRfdm1hCWNiT3B0T2Zmc2V0OwkvKiBvZmZzZXQgdG8gb3B0aW1pemF0aW9uIHN5bWJvbCBlbnRyaWVzICovCi0JbG9uZwlpYXV4TWF4OwkvKiBudW1iZXIgb2YgYXV4aWxsYXJ5IHN5bWJvbCBlbnRyaWVzICovCi0JYmZkX3ZtYQljYkF1eE9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGF1eGlsbGFyeSBzeW1ib2wgZW50cmllcyovCi0JbG9uZwlpc3NNYXg7CQkvKiBtYXggaW5kZXggaW50byBsb2NhbCBzdHJpbmdzICovCi0JYmZkX3ZtYQljYlNzT2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgbG9jYWwgc3RyaW5ncyAqLwotCWxvbmcJaXNzRXh0TWF4OwkvKiBtYXggaW5kZXggaW50byBleHRlcm5hbCBzdHJpbmdzICovCi0JYmZkX3ZtYQljYlNzRXh0T2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgZXh0ZXJuYWwgc3RyaW5ncyAqLwotCWxvbmcJaWZkTWF4OwkJLyogbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvciBlbnRyaWVzICovCi0JYmZkX3ZtYQljYkZkT2Zmc2V0OwkvKiBvZmZzZXQgdG8gZmlsZSBkZXNjcmlwdG9yIHRhYmxlICovCi0JbG9uZwljcmZkOwkJLyogbnVtYmVyIG9mIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvciBlbnRyaWVzICovCi0JYmZkX3ZtYQljYlJmZE9mZnNldDsJLyogb2Zmc2V0IHRvIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvciB0YWJsZSAqLwotCWxvbmcJaWV4dE1heDsJLyogbWF4IGluZGV4IGludG8gZXh0ZXJuYWwgc3ltYm9scyAqLwotCWJmZF92bWEJY2JFeHRPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBleHRlcm5hbCBzeW1ib2wgZW50cmllcyovCi0JLyogSWYgeW91IGFkZCBtYWNoaW5lIGRlcGVuZGVudCBmaWVsZHMsIGFkZCB0aGVtIGhlcmUgKi8KLQl9IEhEUlIsICpwSERSUjsgCi0jZGVmaW5lIGNiSERSUiBzaXplb2YoSERSUikKLSNkZWZpbmUgaGRyTmlsICgocEhEUlIpMCkKLQotLyoKLSAqIFRoZSBGRFIgYW5kIFBEUiBzdHJ1Y3R1cmVzIHNwZWVkIG1hcHBpbmcgb2YgYWRkcmVzcyA8LT4gbmFtZS4KLSAqIFRoZXkgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgbWVtb3J5IG9yZGVyIGFuZCBhcmUga2VwdCBpbgotICogbWVtb3J5IGJ5IENEQiBhdCBydW50aW1lLgotICovCi0KLS8qIAotICogRmlsZSBEZXNjcmlwdG9yCi0gKgotICogVGhlcmUgaXMgb25lIG9mIHRoZXNlIGZvciBFVkVSWSBGSUxFLCB3aGV0aGVyIGNvbXBpbGVkIHdpdGgKLSAqIGZ1bGwgZGVidWdnaW5nIHN5bWJvbHMgb3Igbm90LiAgVGhlIG5hbWUgb2YgYSBmaWxlIHNob3VsZCBiZQotICogdGhlIHBhdGggbmFtZSBnaXZlbiB0byB0aGUgY29tcGlsZXIuCSBUaGlzIGFsbG93cyB0aGUgdXNlcgotICogdG8gc2ltcGx5IHNwZWNpZnkgdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB3aGVyZSB0aGUgQ09NUElMRVMKLSAqIHdlcmUgZG9uZSwgYW5kIHdlIHdpbGwgYmUgYWJsZSB0byBmaW5kIHRoZWlyIGZpbGVzLgotICogQSBmaWVsZCB3aG9zZSBjb21tZW50IHN0YXJ0cyB3aXRoICJSIC0gIiBpbmRpY2F0ZXMgdGhhdCBpdCB3aWxsIGJlCi0gKiBzZXR1cCBhdCBydW50aW1lLgotICovCi10eXBlZGVmIHN0cnVjdCBmZHIgewotCWJmZF92bWEJYWRyOwkJLyogbWVtb3J5IGFkZHJlc3Mgb2YgYmVnaW5uaW5nIG9mIGZpbGUgKi8KLQlsb25nCXJzczsJCS8qIGZpbGUgbmFtZSAob2Ygc291cmNlLCBpZiBrbm93bikgKi8KLQlsb25nCWlzc0Jhc2U7CS8qIGZpbGUncyBzdHJpbmcgc3BhY2UgKi8KLQliZmRfdm1hCWNiU3M7CQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNzICovCi0JbG9uZwlpc3ltQmFzZTsJLyogYmVnaW5uaW5nIG9mIHN5bWJvbHMgKi8KLQlsb25nCWNzeW07CQkvKiBjb3VudCBmaWxlJ3Mgb2Ygc3ltYm9scyAqLwotCWxvbmcJaWxpbmVCYXNlOwkvKiBmaWxlJ3MgbGluZSBzeW1ib2xzICovCi0JbG9uZwljbGluZTsJCS8qIGNvdW50IG9mIGZpbGUncyBsaW5lIHN5bWJvbHMgKi8KLQlsb25nCWlvcHRCYXNlOwkvKiBmaWxlJ3Mgb3B0aW1pemF0aW9uIGVudHJpZXMgKi8KLQlsb25nCWNvcHQ7CQkvKiBjb3VudCBvZiBmaWxlJ3Mgb3B0aW1pemF0aW9uIGVudHJpZXMgKi8KLQl1bnNpZ25lZCBzaG9ydCBpcGRGaXJzdDsvKiBzdGFydCBvZiBwcm9jZWR1cmVzIGZvciB0aGlzIGZpbGUgKi8KLQlzaG9ydAljcGQ7CQkvKiBjb3VudCBvZiBwcm9jZWR1cmVzIGZvciB0aGlzIGZpbGUgKi8KLQlsb25nCWlhdXhCYXNlOwkvKiBmaWxlJ3MgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLQlsb25nCWNhdXg7CQkvKiBjb3VudCBvZiBmaWxlJ3MgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLQlsb25nCXJmZEJhc2U7CS8qIGluZGV4IGludG8gdGhlIGZpbGUgaW5kaXJlY3QgdGFibGUgKi8KLQlsb25nCWNyZmQ7CQkvKiBjb3VudCBmaWxlIGluZGlyZWN0IGVudHJpZXMgKi8KLQl1bnNpZ25lZCBsYW5nOiA1OwkvKiBsYW5ndWFnZSBmb3IgdGhpcyBmaWxlICovCi0JdW5zaWduZWQgZk1lcmdlIDogMTsJLyogd2hldGhlciB0aGlzIGZpbGUgY2FuIGJlIG1lcmdlZCAqLwotCXVuc2lnbmVkIGZSZWFkaW4gOiAxOwkvKiB0cnVlIGlmIGl0IHdhcyByZWFkIGluIChub3QganVzdCBjcmVhdGVkKSAqLwotCXVuc2lnbmVkIGZCaWdlbmRpYW4gOiAxOy8qIGlmIHNldCwgd2FzIGNvbXBpbGVkIG9uIGJpZyBlbmRpYW4gbWFjaGluZSAqLwotCQkJCS8qCWF1eCdzIHdpbGwgYmUgaW4gY29tcGlsZSBob3N0J3Mgc2V4ICovCi0JdW5zaWduZWQgZ2xldmVsIDogMjsJLyogbGV2ZWwgdGhpcyBmaWxlIHdhcyBjb21waWxlZCB3aXRoICovCi0JdW5zaWduZWQgcmVzZXJ2ZWQgOiAyMjsgIC8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0JYmZkX3ZtYQljYkxpbmVPZmZzZXQ7CS8qIGJ5dGUgb2Zmc2V0IGZyb20gaGVhZGVyIGZvciB0aGlzIGZpbGUgbG4ncyAqLwotCWJmZF92bWEJY2JMaW5lOwkJLyogc2l6ZSBvZiBsaW5lcyBmb3IgdGhpcyBmaWxlICovCi0JfSBGRFIsICpwRkRSOwotI2RlZmluZSBjYkZEUiBzaXplb2YoRkRSKQotI2RlZmluZSBmZE5pbCAoKHBGRFIpMCkKLSNkZWZpbmUgaWZkTmlsIC0xCi0jZGVmaW5lIGlmZFRlbXAgMAotI2RlZmluZSBpbG5OaWwgLTEKLQotCi0vKiAKLSAqIFByb2NlZHVyZSBEZXNjcmlwdG9yCi0gKgotICogVGhlcmUgaXMgb25lIG9mIHRoZXNlIGZvciBFVkVSWSBURVhUIExBQkVMLgotICogSWYgYSBwcm9jZWR1cmUgaXMgaW4gYSBmaWxlIHdpdGggZnVsbCBzeW1ib2xzLCB0aGVuIGlzeW0KLSAqIHdpbGwgcG9pbnQgdG8gdGhlIFBST0Mgc3ltYm9scywgZWxzZSBpdCB3aWxsIHBvaW50IHRvIHRoZQotICogZ2xvYmFsIHN5bWJvbCBmb3IgdGhlIGxhYmVsLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHBkciB7Ci0JYmZkX3ZtYQlhZHI7CQkvKiBtZW1vcnkgYWRkcmVzcyBvZiBzdGFydCBvZiBwcm9jZWR1cmUgKi8KLQlsb25nCWlzeW07CQkvKiBzdGFydCBvZiBsb2NhbCBzeW1ib2wgZW50cmllcyAqLwotCWxvbmcJaWxpbmU7CQkvKiBzdGFydCBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQlsb25nCXJlZ21hc2s7CS8qIHNhdmUgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJcmVnb2Zmc2V0OwkvKiBzYXZlIHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJaW9wdDsJCS8qIHN0YXJ0IG9mIG9wdGltaXphdGlvbiBzeW1ib2wgZW50cmllcyovCi0JbG9uZwlmcmVnbWFzazsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBtYXNrICovCi0JbG9uZwlmcmVnb2Zmc2V0OwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJhbWVvZmZzZXQ7CS8qIGZyYW1lIHNpemUgKi8KLQlzaG9ydAlmcmFtZXJlZzsJLyogZnJhbWUgcG9pbnRlciByZWdpc3RlciAqLwotCXNob3J0CXBjcmVnOwkJLyogb2Zmc2V0IG9yIHJlZyBvZiByZXR1cm4gcGMgKi8KLQlsb25nCWxuTG93OwkJLyogbG93ZXN0IGxpbmUgaW4gdGhlIHByb2NlZHVyZSAqLwotCWxvbmcJbG5IaWdoOwkJLyogaGlnaGVzdCBsaW5lIGluIHRoZSBwcm9jZWR1cmUgKi8KLQliZmRfdm1hCWNiTGluZU9mZnNldDsJLyogYnl0ZSBvZmZzZXQgZm9yIHRoaXMgcHJvY2VkdXJlIGZyb20gdGhlIGZkIGJhc2UgKi8KLQkvKiBUaGVzZSBmaWVsZHMgYXJlIG5ldyBmb3IgNjQgYml0IEVDT0ZGLiAgKi8KLQl1bnNpZ25lZCBncF9wcm9sb2d1ZSA6IDg7IC8qIGJ5dGUgc2l6ZSBvZiBHUCBwcm9sb2d1ZSAqLwotCXVuc2lnbmVkIGdwX3VzZWQgOiAxOwkvKiB0cnVlIGlmIHRoZSBwcm9jZWR1cmUgdXNlcyBHUCAqLwotCXVuc2lnbmVkIHJlZ19mcmFtZSA6IDE7CS8qIHRydWUgaWYgcmVnaXN0ZXIgZnJhbWUgcHJvY2VkdXJlICovCi0JdW5zaWduZWQgcHJvZiA6IDE7CS8qIHRydWUgaWYgY29tcGlsZWQgd2l0aCAtcGcgKi8KLQl1bnNpZ25lZCByZXNlcnZlZCA6IDEzOwkvKiByZXNlcnZlZDogbXVzdCBiZSB6ZXJvICovCi0JdW5zaWduZWQgbG9jYWxvZmYgOiA4OwkvKiBvZmZzZXQgb2YgbG9jYWwgdmFyaWFibGVzIGZyb20gdmZwICovCi0JfSBQRFIsICpwUERSOwotI2RlZmluZSBjYlBEUiBzaXplb2YoUERSKQotI2RlZmluZSBwZE5pbCAoKHBQRFIpIDApCi0jZGVmaW5lIGlwZE5pbAktMQotCi0vKgotICogVGhlIHN0cnVjdHVyZSBvZiB0aGUgcnVudGltZSBwcm9jZWR1cmUgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IHRoZSBsb2FkZXIKLSAqIGZvciB1c2UgYnkgdGhlIHN0YXRpYyBleGNlcHRpb24gc3lzdGVtLgotICovCi0vKgotICogSWYgMCdkIG91dCBiZWNhdXNlIGV4Y2VwdGlvbl9pbmZvIGNob2tlcyBWaXN1YWwgQysrIGFuZCBiZWNhdXNlIHRoZXJlCi0gKiBkb24ndCBzZWVtIHRvIGJlIGFueSByZWZlcmVuY2VzIHRvIHRoaXMgc3RydWN0dXJlIGVsc2V3aGVyZSBpbiBnZGIuCi0gKi8KLSNpZiAwCi10eXBlZGVmIHN0cnVjdCBydW50aW1lX3BkciB7Ci0JYmZkX3ZtYQlhZHI7CQkvKiBtZW1vcnkgYWRkcmVzcyBvZiBzdGFydCBvZiBwcm9jZWR1cmUgKi8KLQlsb25nCXJlZ21hc2s7CS8qIHNhdmUgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJcmVnb2Zmc2V0OwkvKiBzYXZlIHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJlZ21hc2s7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJZnJlZ29mZnNldDsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBvZmZzZXQgKi8KLQlsb25nCWZyYW1lb2Zmc2V0OwkvKiBmcmFtZSBzaXplICovCi0Jc2hvcnQJZnJhbWVyZWc7CS8qIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgKi8KLQlzaG9ydAlwY3JlZzsJCS8qIG9mZnNldCBvciByZWcgb2YgcmV0dXJuIHBjICovCi0JbG9uZwlpcnBzczsJCS8qIGluZGV4IGludG8gdGhlIHJ1bnRpbWUgc3RyaW5nIHRhYmxlICovCi0JbG9uZwlyZXNlcnZlZDsKLQlzdHJ1Y3QgZXhjZXB0aW9uX2luZm8gKmV4Y2VwdGlvbl9pbmZvOy8qIHBvaW50ZXIgdG8gZXhjZXB0aW9uIGFycmF5ICovCi19IFJQRFIsICpwUlBEUjsKLSNkZWZpbmUgY2JSUERSIHNpemVvZihSUERSKQotI2RlZmluZSBycGROaWwgKChwUlBEUikgMCkKLSNlbmRpZgotCi0vKgotICogTGluZSBOdW1iZXJzCi0gKgotICogTGluZSBOdW1iZXJzIGFyZSBzZWdyZWdhdGVkIGZyb20gdGhlIG5vcm1hbCBzeW1ib2xzIGJlY2F1c2UgdGhleQotICogYXJlIFsxXSBzbWFsbGVyICwgWzJdIGFyZSBvZiBubyBpbnRlcmVzdCB0byB5b3VyCi0gKiBhdmVyYWdlIGxvYWRlciwgYW5kIFszXSBhcmUgbmV2ZXIgbmVlZGVkIGluIHRoZSBtaWRkbGUgb2Ygbm9ybWFsCi0gKiBzY2FubmluZyBhbmQgdGhlcmVmb3JlIHNsb3cgdGhpbmdzIGRvd24uCi0gKgotICogQnkgZGVmaW5pdGlvbiwgdGhlIGZpcnN0IExJTkVSIGZvciBhbnkgZ2l2ZW4gcHJvY2VkdXJlIHdpbGwgaGF2ZQotICogdGhlIGZpcnN0IGxpbmUgb2YgYSBwcm9jZWR1cmUgYW5kIHJlcHJlc2VudCB0aGUgZmlyc3QgYWRkcmVzcy4KLSAqLwotCi10eXBlZGVmCWxvbmcgTElORVIsICpwTElORVI7Ci0jZGVmaW5lIGxpbmVOaWwgKChwTElORVIpMCkKLSNkZWZpbmUgY2JMSU5FUiBzaXplb2YoTElORVIpCi0jZGVmaW5lIGlsaW5lTmlsCS0xCi0KLQotCi0vKgotICogVGhlIFN5bWJvbCBTdHJ1Y3R1cmUJCShHRlcsIHRvIHRob3NlIHdobyBLbm93ISkKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JbG9uZwlpc3M7CQkvKiBpbmRleCBpbnRvIFN0cmluZyBTcGFjZSBvZiBuYW1lICovCi0JYmZkX3ZtYQl2YWx1ZTsJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotCXVuc2lnbmVkIHN0IDogNjsJLyogc3ltYm9sIHR5cGUgKi8KLQl1bnNpZ25lZCBzYyAgOiA1OwkvKiBzdG9yYWdlIGNsYXNzIC0gdGV4dCwgZGF0YSwgZXRjICovCi0JdW5zaWduZWQgcmVzZXJ2ZWQgOiAxOwkvKiByZXNlcnZlZCAqLwotCXVuc2lnbmVkIGluZGV4IDogMjA7CS8qIGluZGV4IGludG8gc3ltL2F1eCB0YWJsZSAqLwotCX0gU1lNUiwgKnBTWU1SOwotI2RlZmluZSBzeW1OaWwgKChwU1lNUikwKQotI2RlZmluZSBjYlNZTVIgc2l6ZW9mKFNZTVIpCi0jZGVmaW5lIGlzeW1OaWwgLTEKLSNkZWZpbmUgaW5kZXhOaWwgMHhmZmZmZgotI2RlZmluZSBpc3NOaWwgLTEKLSNkZWZpbmUgaXNzTnVsbCAwCi0KLQotLyogVGhlIGZvbGxvd2luZyBjb252ZXJ0cyBhIG1lbW9yeSByZXNpZGVudCBzdHJpbmcgdG8gYW4gaXNzLgotICogVGhpcyBoYWNrIGlzIHJlY29nbml6ZWQgaW4gU2JGSXNzLCBpbiBzeW0uYyBvZiB0aGUgZGVidWdnZXIuCi0gKi8KLSNkZWZpbmUgSXNzRlNiKHNiKSAoMHg4MDAwMDAwMCB8ICgodW5zaWduZWQgbG9uZykoc2IpKSkKLQotLyogRSBYIFQgRSBSIE4gQSBMICAgUyBZIE0gQiBPIEwgIFIgRSBDIE8gUiBECi0gKgotICoJU2FtZSBhcyB0aGUgU1lNUiBleGNlcHQgaXQgY29udGFpbnMgZmlsZSBjb250ZXh0IHRvIGRldGVybWluZSB3aGVyZQotICoJdGhlIGluZGV4IGlzLgotICovCi10eXBlZGVmIHN0cnVjdCBlY29mZl9leHRyIHsKLQl1bnNpZ25lZCBqbXB0Ymw6MTsJLyogc3ltYm9sIGlzIGEganVtcCB0YWJsZSBlbnRyeSBmb3Igc2hsaWJzICovCi0JdW5zaWduZWQgY29ib2xfbWFpbjoxOwkvKiBzeW1ib2wgaXMgYSBjb2JvbCBtYWluIHByb2NlZHVyZSAqLwotCXVuc2lnbmVkIHdlYWtleHQ6MTsJLyogc3ltYm9sIGlzIHdlYWsgZXh0ZXJuYWwgKi8KLQl1bnNpZ25lZCByZXNlcnZlZDoxMzsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLQlpbnQJaWZkOwkJLyogd2hlcmUgdGhlIGlzcyBhbmQgaW5kZXggZmllbGRzIHBvaW50IGludG8gKi8KLQlTWU1SCWFzeW07CQkvKiBzeW1ib2wgZm9yIHRoZSBleHRlcm5hbCAqLwotCX0gRVhUUiwgKnBFWFRSOwotI2RlZmluZSBleHROaWwgKChwRVhUUikwKQotI2RlZmluZSBjYkVYVFIgc2l6ZW9mKEVYVFIpCi0KLQotLyogQSBVIFggSSBMIEwgQSBSIFkgICBUIFkgUCBFCSBJIE4gRiBPIFIgTSBBIFQgSSBPIE4gKi8KLQotLyoKLSAqIFR5cGUgSW5mb3JtYXRpb24gUmVjb3JkCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBmQml0ZmllbGQgOiAxOyAvKiBzZXQgaWYgYml0IHdpZHRoIGlzIHNwZWNpZmllZCAqLwotCXVuc2lnbmVkIGNvbnRpbnVlZCA6IDE7IC8qIGluZGljYXRlcyBhZGRpdGlvbmFsIFRRIGluZm8gaW4gbmV4dCBBVVggKi8KLQl1bnNpZ25lZCBidCAgOiA2OwkvKiBiYXNpYyB0eXBlICovCi0JdW5zaWduZWQgdHE0IDogNDsKLQl1bnNpZ25lZCB0cTUgOiA0OwotCS8qIC0tLS0gMTYgYml0IGJvdW5kYXJ5IC0tLS0gKi8KLQl1bnNpZ25lZCB0cTAgOiA0OwotCXVuc2lnbmVkIHRxMSA6IDQ7CS8qIDYgdHlwZSBxdWFsaWZpZXJzIC0gdHFQdHIsIGV0Yy4gKi8KLQl1bnNpZ25lZCB0cTIgOiA0OwotCXVuc2lnbmVkIHRxMyA6IDQ7Ci0JfSBUSVIsICpwVElSOwotI2RlZmluZSBjYlRJUiBzaXplb2YoVElSKQotI2RlZmluZSB0aU5pbCAoKHBUSVIpMCkKLSNkZWZpbmUgaXRxTWF4IDYKLQotLyoKLSAqIFJlbGF0aXZlIHN5bWJvbCByZWNvcmQKLSAqCi0gKiBJZiB0aGUgcmZkIGZpZWxkIGlzIDQwOTUsIHRoZSBpbmRleCBmaWVsZCBpbmRleGVzIGludG8gdGhlIGdsb2JhbCBzeW1ib2wKLSAqCXRhYmxlLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZAlyZmQgOiAxMjsgICAgLyogaW5kZXggaW50byB0aGUgZmlsZSBpbmRpcmVjdCB0YWJsZSAqLwotCXVuc2lnbmVkCWluZGV4IDogMjA7IC8qIGluZGV4IGludCBzeW0vYXV4L2lzcyB0YWJsZXMgKi8KLQl9IFJORFhSLCAqcFJORFhSOwotI2RlZmluZSBjYlJORFhSIHNpemVvZihSTkRYUikKLSNkZWZpbmUgcm5keE5pbCAoKHBSTkRYUikwKQotCi0vKiBkZW5zZSBudW1iZXJzIG9yIHNvbWV0aW1lcyBjYWxsZWQgYmxvY2sgbnVtYmVycyBhcmUgc3RvcmVkIGluIHRoaXMgdHlwZSwKLSAqCWEgcmZkIG9mIDB4ZmZmZmZmZmYgaXMgYW4gaW5kZXggaW50byB0aGUgZ2xvYmFsIHRhYmxlLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZwlyZmQ7ICAgIC8qIGluZGV4IGludG8gdGhlIGZpbGUgdGFibGUgKi8KLQl1bnNpZ25lZCBsb25nCWluZGV4OyAJLyogaW5kZXggaW50IHN5bS9hdXgvaXNzIHRhYmxlcyAqLwotCX0gRE5SLCAqcEROUjsKLSNkZWZpbmUgY2JETlIgc2l6ZW9mKEROUikKLSNkZWZpbmUgZG5OaWwgKChwRE5SKTApCi0KLQotCi0vKgotICogQXV4aWxsYXJ5IGluZm9ybWF0aW9uIG9jY3VycyBvbmx5IGlmIG5lZWRlZC4KLSAqIEl0IEFMV0FZUyBvY2N1cnMgaW4gdGhpcyBvcmRlciB3aGVuIHByZXNlbnQuCi0KLQkgICAgaXN5bU1hYwkJdXNlZCBieSBzdFByb2Mgb25seQotCSAgICBUSVIJCQl0eXBlIGluZm8KLQkgICAgVElSCQkJYWRkaXRpb25hbCBUUSBpbmZvIChpZiBmaXJzdCBUSVIgd2FzIG5vdCBlbm91Z2gpCi0JICAgIHJuZHgJCWlmIChidCA9PSBidFN0cnVjdCxidFVuaW9uLGJ0RW51bSxidFNldCxidFJhbmdlLAotCQkJCSAgICBidFR5cGVkZWYpOgotCQkJCSAgICByc3ltLmluZGV4ID09IGlhdXggZm9yIGJ0U2V0IG9yIGJ0UmFuZ2UKLQkJCQkgICAgZWxzZSByc3ltLmluZGV4ID09IGlzeW0KLQkgICAgZGltTG93CQlidFJhbmdlLCBidFNldAotCSAgICBkaW1NYWMJCWJ0UmFuZ2UsIGJ0U2V0Ci0JICAgIHJuZHgwCQlBcyBtYW55IGFzIHRoZXJlIGFyZSB0cSBhcnJheXMKLQkgICAgZGltTG93MAotCSAgICBkaW1IaWdoMAotCSAgICAuLi4KLQkgICAgcm5keE1heC0xCi0JICAgIGRpbUxvd01heC0xCi0JICAgIGRpbUhpZ2hNYXgtMQotCSAgICB3aWR0aCBpbiBiaXRzCWlmIChiaXQgZmllbGQpLCB3aWR0aCBpbiBiaXRzLgotICovCi0jZGVmaW5lIGNBdXhNYXggKDYgKyAoaWRpbU1heCozKSkKLQotLyogYSB1bmlvbiBvZiBhbGwgcG9zc2libGUgaW5mbyBpbiB0aGUgQVVYIHVuaXZlcnNlICovCi10eXBlZGVmIHVuaW9uIHsKLQlUSVIJdGk7CQkvKiB0eXBlIGluZm9ybWF0aW9uIHJlY29yZCAqLwotCVJORFhSCXJuZHg7CQkvKiByZWxhdGl2ZSBpbmRleCBpbnRvIHN5bWJvbCB0YWJsZSAqLwotCWxvbmcJZG5Mb3c7CQkvKiBsb3cgZGltZW5zaW9uICovCi0JbG9uZwlkbkhpZ2g7CQkvKiBoaWdoIGRpbWVuc2lvbiAqLwotCWxvbmcJaXN5bTsJCS8qIHN5bWJvbCB0YWJsZSBpbmRleCAoZW5kIG9mIHByb2MpICovCi0JbG9uZwlpc3M7CQkvKiBpbmRleCBpbnRvIHN0cmluZyBzcGFjZSAobm90IHVzZWQpICovCi0JbG9uZwl3aWR0aDsJCS8qIHdpZHRoIGZvciBub24tZGVmYXVsdCBzaXplZCBzdHJ1YyBmaWVsZHMgKi8KLQlsb25nCWNvdW50OwkJLyogY291bnQgb2YgcmFuZ2VzIGZvciB2YXJpYW50IGFybSAqLwotCX0gQVVYVSwgKnBBVVhVOwotI2RlZmluZSBjYkFVWFUgc2l6ZW9mKEFVWFUpCi0jZGVmaW5lIGF1eE5pbCAoKHBBVVhVKTApCi0jZGVmaW5lIGlhdXhOaWwgLTEKLQotCi0vKgotICogT3B0aW1pemF0aW9uIHN5bWJvbHMKLSAqCi0gKiBPcHRpbWl6YXRpb24gc3ltYm9scyBjb250YWluIHNvbWUgb3ZlcmxhcCBpbmZvcm1hdGlvbiB3aXRoIHRoZSBub3JtYWwKLSAqIHN5bWJvbCB0YWJsZS4gSW4gcGFydGljdWxhciwgdGhlIHByb2MgaW5mb3JtYXRpb24KLSAqIGlzIHNvbWV3aGF0IHJlZHVuZGFudCBidXQgbmVjZXNzYXJ5IHRvIGVhc2lseSBmaW5kIHRoZSBvdGhlciBpbmZvcm1hdGlvbgotICogcHJlc2VudC4gCi0gKgotICogQWxsIG9mIHRoZSBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsYXN0IG90UHJvYwotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBvdDogODsJCS8qIG9wdGltaXphdGlvbiB0eXBlICovCi0JdW5zaWduZWQgdmFsdWU6IDI0OwkvKiBhZGRyZXNzIHdoZXJlIHdlIGFyZSBtb3ZpbmcgaXQgdG8gKi8KLQlSTkRYUglybmR4OwkJLyogcG9pbnRzIHRvIGEgc3ltYm9sIG9yIG9wdCBlbnRyeSAqLwotCXVuc2lnbmVkIGxvbmcJb2Zmc2V0OwkvKiByZWxhdGl2ZSBvZmZzZXQgdGhpcyBvY2N1cmVkICovCi0JfSBPUFRSLCAqcE9QVFI7Ci0jZGVmaW5lIG9wdE5pbAkoKHBPUFRSKSAwKQotI2RlZmluZSBjYk9QVFIgc2l6ZW9mKE9QVFIpCi0jZGVmaW5lIGlvcHROaWwgLTEKLQotLyoKLSAqIEZpbGUgSW5kaXJlY3QKLSAqCi0gKiBXaGVuIGEgc3ltYm9sIGlzIHJlZmVyZW5jZWQgYWNyb3NzIGZpbGVzIHRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIGlzIHVzZWQ6Ci0gKgkxKSB1c2UgdGhlIGZpbGUgaW5kZXggdG8gZ2V0IHRoZSBGaWxlIGluZGlyZWN0IGVudHJ5LgotICoJMikgdXNlIHRoZSBmaWxlIGluZGlyZWN0IGVudHJ5IHRvIGdldCB0aGUgRmlsZSBkZXNjcmlwdG9yLgotICoJMykgYWRkIHRoZSBzeW0gaW5kZXggdG8gdGhlIGJhc2Ugb2YgdGhhdCBmaWxlJ3Mgc3ltIHRhYmxlCi0gKgotICovCi0KLXR5cGVkZWYgbG9uZyBSRkRULCAqcFJGRFQ7Ci0jZGVmaW5lIGNiUkZEVCBzaXplb2YoUkZEVCkKLSNkZWZpbmUgcmZkTmlsCS0xCi0KLS8qCi0gKiBUaGUgZmlsZSBpbmRpcmVjdCB0YWJsZSBpbiB0aGUgbWlwcyBsb2FkZXIgaXMga25vd24gYXMgYW4gYXJyYXkgb2YgRklUcy4KLSAqIFRoaXMgaXMgZG9uZSB0byBrZWVwIHRoZSBjb2RlIGluIHRoZSBsb2FkZXIgcmVhZGFibGUgaW4gdGhlIGFyZWEgd2hlcmUKLSAqIHRoZXNlIHRhYmxlcyBhcmUgbWVyZ2VkLiAgTm90ZSB0aGlzIGlzIG9ubHkgYSBuYW1lIGNoYW5nZS4KLSAqLwotdHlwZWRlZiBsb25nIEZJVCwgKnBGSVQ7Ci0jZGVmaW5lIGNiRklUCXNpemVvZihGSVQpCi0jZGVmaW5lIGlmaU5pbAktMQotI2RlZmluZSBmaU5pbAkoKHBGSVQpIDApCi0KLSNpZmRlZiBfTEFOR1VBR0VfUEFTQ0FMCi0jZGVmaW5lIGlmZE5pbCAtMQotI2RlZmluZSBpbG5OaWwgLTEKLSNkZWZpbmUgaXBkTmlsIC0xCi0jZGVmaW5lIGlsaW5lTmlsIC0xCi0jZGVmaW5lIGlzeW1OaWwgLTEKLSNkZWZpbmUgaW5kZXhOaWwgMTYjZmZmZmYKLSNkZWZpbmUgaXNzTmlsIC0xCi0jZGVmaW5lIGlzc051bGwgMAotI2RlZmluZSBpdHFNYXggNgotI2RlZmluZSBpYXV4TmlsIC0xCi0jZGVmaW5lIGlvcHROaWwgLTEKLSNkZWZpbmUgcmZkTmlsIC0xCi0jZGVmaW5lIGlmaU5pbCAtMQotI2VuZGlmCS8qIF9MQU5HVUFHRV9QQVNDQUwgKi8KLQotCi0vKiBEZW5zZSBudW1iZXJzCi0gKgotICogUmF0aGVyIHRoYW4gdXNlIGZpbGUgaW5kZXgsIHN5bWJvbCBpbmRleCBwYWlycyB0byByZXByZXNlbnQgc3ltYm9scwotICoJYW5kIGdsb2JhbHMsIHdlIHVzZSBkZW5zZSBudW1iZXIgc28gdGhhdCB0aGV5IGNhbiBiZSBlYXNpbHkgZW1iZWRlZAotICoJaW4gaW50ZXJtZWRpYXRlIGNvZGUgYW5kIHRoZSBwcm9ncmFtcyB0aGF0IHByb2Nlc3MgdGhlbSBjYW4KLSAqCXVzZSBkaXJlY3QgYWNjZXNzIHRhYmxzIGluc3RlYWQgb2YgaGFzaCB0YWJsZSAod2hpY2ggd291bGQgYmUKLSAqCW5lY2VzYXJ5IG90aGVyd2lzZSBiZWNhdXNlIG9mIHRoZSBzcGFyc2UgbmFtZSBzcGFjZSBjYXVzZWQgYnkKLSAqCWZpbGUgaW5kZXgsIHN5bWJvbCBpbmRleCBwYWlycy4gRGVuc2UgbnVtYmVyIGFyZSByZXByZXNlbnRlZAotICoJYnkgUk5EWFJzLgotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIHRhYmxlIGRlZmluZXMgdGhlIG1lYW5pbmcgb2YgZWFjaCBTWU0gZmllbGQgYXMKLSAqIGEgZnVuY3Rpb24gb2YgdGhlICJzdCIuIChzY0QvQiA9PSBzY0RhdGEgT1Igc2NCc3MpCi0gKgotICogTm90ZTogdGhlIHZhbHVlICJpc3ltTWFjIiBpcyB1c2VkIGJ5IHN5bWJvbHMgdGhhdCBoYXZlIHRoZSBjb25jZXB0Ci0gKiBvZiBlbmNsb3NpbmcgYSBibG9jayBvZiByZWxhdGVkIGluZm9ybWF0aW9uLgkgVGhpcyB2YWx1ZSBpcyB0aGUKLSAqIGlzeW0gb2YgdGhlIGZpcnN0IHN5bWJvbCBBRlRFUiB0aGUgZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeQotICogc3ltYm9sLiBGb3IgZXhhbXBsZSBpZiBhIHByb2NlZHVyZSB3YXMgYXQgaXN5bT09OTAgYW5kIGhhZCBhbgotICogaXN5bU1hYz09MTU1LCB0aGUgYXNzb2NpYXRlZCBlbmQgd291bGQgYmUgYXQgaXN5bT09MTU0LCBhbmQgdGhlCi0gKiBzeW1ib2wgYXQgMTU1IHdvdWxkIHByb2JhYmx5IChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkpIGJlIHRoZQotICogc3ltYm9sIGZvciB0aGUgbmV4dCBwcm9jZWR1cmUuICBUaGlzIGFsbG93cyByYXBpZCBza2lwcGluZyBvdmVyCi0gKiBpbnRlcm5hbCBpbmZvcm1hdGlvbiBvZiB2YXJpb3VzIHNvcnRzLiAic3RFbmQicyBBTFdBWVMgaGF2ZSB0aGUKLSAqIGlzeW0gb2YgdGhlIHByaW1hcnkgc3ltYm9sIHRoYXQgc3RhcnRlZCB0aGUgYmxvY2suCi0gKiAKLQotU1QJCVNDCVZBTFVFCQlJTkRFWAotLS0tLS0tLS0JLS0tLS0tCS0tLS0tLS0tCS0tLS0tLQotc3RGaWxlCQlzY1RleHQJYWRkcmVzcwkJaXN5bU1hYwotc3RMYWJlbAkJc2NUZXh0CWFkZHJlc3MJCS0tLQotc3RHbG9iYWwJc2NEL0IJYWRkcmVzcwkJaWF1eAotc3RTdGF0aWMJc2NEL0IJYWRkcmVzcwkJaWF1eAotc3RQYXJhbQkJc2NBYnMJb2Zmc2V0CQlpYXV4Ci1zdExvY2FsCQlzY0FicwlvZmZzZXQJCWlhdXgKLXN0UHJvYwkJc2NUZXh0CWFkZHJlc3MJCWlhdXgJKGlzeW1NYWMgaXMgZmlyc3QgQVVYKQotc3RTdGF0aWNQcm9jCXNjVGV4dAlhZGRyZXNzCQlpYXV4CShpc3ltTWFjIGlzIGZpcnN0IEFVWCkKLQotc3RNZW1iZXIJc2NOaWwJb3JkaW5hbAkJLS0tCShpZiBtZW1iZXIgb2YgZW51bSkKLQkobWlwc3JlYWQgdGhpbmtzIHRoZSBjYXNlIGJlbG93IGhhcyBhIGJpdCwgbm90IGJ5dGUsIG9mZnNldC4pCi1zdE1lbWJlcglzY05pbAlieXRlIG9mZnNldAlpYXV4CShpZiBtZW1iZXIgb2Ygc3RydWN0L3VuaW9uKQotc3RNZW1iZXIJc2NCaXRzCWJpdCBvZmZzZXQJaWF1eAkoYml0IGZpZWxkIHNwZWMpCi0KLXN0QmxvY2sJCXNjVGV4dAlhZGRyZXNzCQlpc3ltTWFjICh0ZXh0IGJsb2NrKQotCSh0aGUgY29kZSBzZWVtcyB0byB0aGluayB0aGF0IHJhdGhlciB0aGFuIHNjTmlsLCB3ZSBzZWUgc2NJbmZvIGZvcgotCSB0aGUgdHdvIGNhc2VzIGJlbG93LikKLXN0QmxvY2sJCXNjTmlsCWNiCQlpc3ltTWFjIChzdHJ1Y3QvdW5pb24gbWVtYmVyIGRlZmluZSkKLXN0QmxvY2sJCXNjTmlsCWNNZW1iZXJzCWlzeW1NYWMgKGVudW0gbWVtYmVyIGRlZmluZSkKLQotCShOZXcgdHlwZXMgYWRkZWQgYnkgU0dJIHRvIHNpbXBsaWZ5IHRoaW5nczopCi1zdFN0cnVjdAlzY0luZm8JY2IJCWlzeW1NYWMgKHN0cnVjdCB0eXBlIGRlZmluZSkKLXN0VW5pb24JCXNjSW5mbwljYgkJaXN5bU1hYyAodW5pb24gIHR5cGUgZGVmaW5lKQotc3RFbnVtCQlzY0luZm8JY01lbWJlcnMJaXN5bU1hYyAoZW51bSAgIHR5cGUgZGVmaW5lKQotCi1zdEVuZAkJc2NUZXh0CWFkZHJlc3MJCWlzeW1TdGFydAotc3RFbmQJCXNjTmlsCS0tLS0tLS0JCWlzeW1TdGFydCAoc3RydWN0L3VuaW9uL2VudW0pCi0KLXN0VHlwZWRlZglzY05pbAktLS0tLS0tCQlpYXV4Ci1zdFJlZ1JlbG9jCXNjPz8/CXZhbHVlCQlvbGQgcmVnaXN0ZXIgbnVtYmVyCi1zdEZvcndhcmQJc2M/Pz8JbmV3IGFkZHJlc3MJaXN5bSB0byBvcmlnaW5hbCBzeW1ib2wKLQotc3RDb25zdGFudAlzY0luZm8JdmFsdWUJCS0tLSAoc2NhbGFyKQotc3RDb25zdGFudAlzY0luZm8JaXNzCQktLS0gKGNvbXBsZXgsIGUuZy4gc3RyaW5nKQotCi0gKgotICovCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9zeW1jb25zdC5oIGIvaW5jbHVkZS9jb2ZmL3N5bWNvbnN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MGVlZjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3N5bWNvbnN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIG9mIGNvbnN0YW50cyBmb3IgaW50ZXJuYWwgZm9ybWF0IG9mIE1JUFMgRUNPRkYgc3ltYm9scy4KLSAgIE9yaWdpbmFsbHkgY29udHJpYnV0ZWQgYnkgTUlQUyBDb21wdXRlciBTeXN0ZW1zIGFuZCBUaGlyZCBFeWUgU29mdHdhcmUuCi0gICBDaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0IGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KLQotICAgVGhpcyBmaWxlIGlzIGp1c3QgYWdncmVnYXRlZCB3aXRoIHRoZSBmaWxlcyB0aGF0IG1ha2UgdXAgdGhlIEdOVQotICAgcmVsZWFzZTsgaXQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiBHQVMsIEdEQiwgb3Igb3RoZXIgR05VCi0gICBwcm9ncmFtcy4gICovCi0KLS8qCi0gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gKiB8IENvcHlyaWdodCAoYykgMTk5MiwgMTk5MSwgMTk5MCBNSVBTIENvbXB1dGVyIFN5c3RlbXMsIEluYy58Ci0gKiB8IE1JUFMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLiBncmFudHMgcmVwcm9kdWN0aW9uIGFuZCB1c2UgICB8Ci0gKiB8IHJpZ2h0cyB0byBhbGwgcGFydGllcywgUFJPVklERUQgdGhhdCB0aGlzIGNvbW1lbnQgaXMgICAgICB8Ci0gKiB8IG1haW50YWluZWQgaW4gdGhlIGNvcHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gKi8KLQotLyogKEMpIENvcHlyaWdodCAxOTg0IGJ5IFRoaXJkIEV5ZSBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIFRoaXJkIEV5ZSBTb2Z0d2FyZSwgSW5jLiBncmFudHMgcmVwcm9kdWN0aW9uIGFuZCB1c2UgcmlnaHRzIHRvCi0gKiBhbGwgcGFydGllcywgUFJPVklERUQgdGhhdCB0aGlzIGNvbW1lbnQgaXMgbWFpbnRhaW5lZCBpbiB0aGUgY29weS4KLSAqCi0gKiBUaGlyZCBFeWUgbWFrZXMgbm8gY2xhaW1zIGFib3V0IHRoZSBhcHBsaWNhYmlsaXR5IG9mIHRoaXMKLSAqIHN5bWJvbCB0YWJsZSB0byBhIHBhcnRpY3VsYXIgdXNlLgotICovCi0KLS8qIGdsZXZlbHMgZm9yIGZpZWxkIGluIEZEUiAqLwotI2RlZmluZSBHTEVWRUxfMAkyCi0jZGVmaW5lIEdMRVZFTF8xCTEKLSNkZWZpbmUgR0xFVkVMXzIJMAkvKiBmb3IgdXB3YXJkIGNvbXBhdCByZWFzb25zLiAqLwotI2RlZmluZSBHTEVWRUxfMwkzCi0KLS8qIG1hZ2ljIG51bWJlciBmbyBzeW1oZWFkZXIgKi8KLSNkZWZpbmUgbWFnaWNTeW0JMHg3MDA5Ci0vKiBUaGUgQWxwaGEgdXNlcyB0aGlzIHZhbHVlIGluc3RlYWQsIGZvciBzb21lIHJlYXNvbi4gICovCi0jZGVmaW5lIG1hZ2ljU3ltMgkweDE5OTIKLQotLyogTGFuZ3VhZ2UgY29kZXMgKi8KLSNkZWZpbmUgbGFuZ0MJCTAJCi0jZGVmaW5lIGxhbmdQYXNjYWwJMQotI2RlZmluZSBsYW5nRm9ydHJhbgkyCi0jZGVmaW5lCWxhbmdBc3NlbWJsZXIJMwkvKiBvbmUgQXNzZW1ibGV5IGluc3QgbWlnaHQgbWFwIHRvIG1hbnkgbWFjaCAqLwotI2RlZmluZSBsYW5nTWFjaGluZQk0Ci0jZGVmaW5lIGxhbmdOaWwJCTUKLSNkZWZpbmUgbGFuZ0FkYQkJNgotI2RlZmluZSBsYW5nUGwxCQk3Ci0jZGVmaW5lIGxhbmdDb2JvbAk4Ci0jZGVmaW5lIGxhbmdTdGRjCTkJLyogRklYTUU6IENvbGxpZGVzIHdpdGggU0dJIGxhbmdDcGx1c3BsdXMgKi8KLSNkZWZpbmUgbGFuZ0NwbHVzcGx1cwk5CS8qIEZJWE1FOiBDb2xsaWRlcyB3aXRoIGxhbmdTdGRjICovCi0jZGVmaW5lIGxhbmdDcGx1c3BsdXNWMgkxMAkvKiBTR0kgYWRkaXRpb24gKi8KLSNkZWZpbmUgbGFuZ01heAkJMTEJLyogbWF4aW11biBhbGxvd2VkIDMyIC0tIDUgYml0cyAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSB2YWx1ZSBkZWZpbml0aW9ucyBmb3IgdGhlIGZpZWxkcyBpbiB0aGUgU1lNUiAqLwotCi0vKgotICogU3RvcmFnZSBDbGFzc2VzCi0gKi8KLQotI2RlZmluZSBzY05pbAkJMAotI2RlZmluZSBzY1RleHQJCTEJLyogdGV4dCBzeW1ib2wgKi8KLSNkZWZpbmUgc2NEYXRhCQkyCS8qIGluaXRpYWxpemVkIGRhdGEgc3ltYm9sICovCi0jZGVmaW5lIHNjQnNzCQkzCS8qIHVuLWluaXRpYWxpemVkIGRhdGEgc3ltYm9sICovCi0jZGVmaW5lIHNjUmVnaXN0ZXIJNAkvKiB2YWx1ZSBvZiBzeW1ib2wgaXMgcmVnaXN0ZXIgbnVtYmVyICovCi0jZGVmaW5lIHNjQWJzCQk1CS8qIHZhbHVlIG9mIHN5bWJvbCBpcyBhYnNvbHV0ZSAqLwotI2RlZmluZSBzY1VuZGVmaW5lZAk2CS8qIHdobyBrbm93cz8gKi8KLSNkZWZpbmUgc2NDZGJMb2NhbAk3CS8qIHZhcmlhYmxlJ3MgdmFsdWUgaXMgSU4gc2UtPnZhLj8/ICovCi0jZGVmaW5lIHNjQml0cwkJOAkvKiB0aGlzIGlzIGEgYml0IGZpZWxkICovCi0jZGVmaW5lIHNjQ2RiU3lzdGVtCTkJLyogdmFyaWFibGUncyB2YWx1ZSBpcyBJTiBDREIncyBhZGRyZXNzIHNwYWNlICovCi0jZGVmaW5lIHNjRGJ4CQk5CS8qIG92ZXJsYXAgZGJ4IGludGVybmFsIHVzZSAqLwotI2RlZmluZSBzY1JlZ0ltYWdlCTEwCS8qIHJlZ2lzdGVyIHZhbHVlIHNhdmVkIG9uIHN0YWNrICovCi0jZGVmaW5lIHNjSW5mbwkJMTEJLyogc3ltYm9sIGNvbnRhaW5zIGRlYnVnZ2VyIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIHNjVXNlclN0cnVjdAkxMgkvKiBhZGRyZXNzIGluIHN0cnVjdCB1c2VyIGZvciBjdXJyZW50IHByb2Nlc3MgKi8KLSNkZWZpbmUgc2NTRGF0YQkJMTMJLyogbG9hZCB0aW1lIG9ubHkgc21hbGwgZGF0YSAqLwotI2RlZmluZSBzY1NCc3MJCTE0CS8qIGxvYWQgdGltZSBvbmx5IHNtYWxsIGNvbW1vbiAqLwotI2RlZmluZSBzY1JEYXRhCQkxNQkvKiBsb2FkIHRpbWUgb25seSByZWFkIG9ubHkgZGF0YSAqLwotI2RlZmluZSBzY1ZhcgkJMTYJLyogVmFyIHBhcmFtZXRlciAoZm9ydHJhbixwYXNjYWwpICovCi0jZGVmaW5lIHNjQ29tbW9uCTE3CS8qIGNvbW1vbiB2YXJpYWJsZSAqLwotI2RlZmluZSBzY1NDb21tb24JMTgJLyogc21hbGwgY29tbW9uICovCi0jZGVmaW5lIHNjVmFyUmVnaXN0ZXIJMTkJLyogVmFyIHBhcmFtZXRlciBpbiBhIHJlZ2lzdGVyICovCi0jZGVmaW5lIHNjVmFyaWFudAkyMAkvKiBWYXJpYW50IHJlY29yZCAqLwotI2RlZmluZSBzY1NVbmRlZmluZWQJMjEJLyogc21hbGwgdW5kZWZpbmVkKGV4dGVybmFsKSBkYXRhICovCi0jZGVmaW5lIHNjSW5pdAkJMjIJLyogLmluaXQgc2VjdGlvbiBzeW1ib2wgKi8KLSNkZWZpbmUgc2NCYXNlZFZhcgkyMwkvKiBGb3J0cmFuIG9yIFBMLzEgcHRyIGJhc2VkIHZhciAqLyAKLSNkZWZpbmUgc2NYRGF0YSAgICAgICAgIDI0ICAgICAgLyogZXhjZXB0aW9uIGhhbmRsaW5nIGRhdGEgKi8KLSNkZWZpbmUgc2NQRGF0YSAgICAgICAgIDI1ICAgICAgLyogUHJvY2VkdXJlIHNlY3Rpb24gKi8KLSNkZWZpbmUgc2NGaW5pICAgICAgICAgIDI2ICAgICAgLyogLmZpbmkgc2VjdGlvbiAqLwotI2RlZmluZSBzY1JDb25zdAkyNwkvKiAucmNvbnN0IHNlY3Rpb24gKi8KLSNkZWZpbmUgc2NNYXgJCTMyCi0KLQotLyoKLSAqICAgU3ltYm9sIFR5cGVzCi0gKi8KLQotI2RlZmluZSBzdE5pbAkJMAkvKiBOdXRoaW4nIHNwZWNpYWwgKi8KLSNkZWZpbmUgc3RHbG9iYWwJMQkvKiBleHRlcm5hbCBzeW1ib2wgKi8KLSNkZWZpbmUgc3RTdGF0aWMJMgkvKiBzdGF0aWMgKi8KLSNkZWZpbmUgc3RQYXJhbQkJMwkvKiBwcm9jZWR1cmUgYXJndW1lbnQgKi8KLSNkZWZpbmUgc3RMb2NhbAkJNAkvKiBsb2NhbCB2YXJpYWJsZSAqLwotI2RlZmluZSBzdExhYmVsCQk1CS8qIGxhYmVsICovCi0jZGVmaW5lIHN0UHJvYwkJNgkvKiAgICAgIiAgICAgICIJIFByb2NlZHVyZSAqLwotI2RlZmluZSBzdEJsb2NrCQk3CS8qIGJlZ2lubm5pbmcgb2YgYmxvY2sgKi8KLSNkZWZpbmUgc3RFbmQJCTgJLyogZW5kIChvZiBhbnl0aGluZykgKi8KLSNkZWZpbmUgc3RNZW1iZXIJOQkvKiBtZW1iZXIgKG9mIGFueXRoaW5nCS0gc3RydWN0L3VuaW9uL2VudW0gKi8KLSNkZWZpbmUgc3RUeXBlZGVmCTEwCS8qIHR5cGUgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBzdEZpbGUJCTExCS8qIGZpbGUgbmFtZSAqLwotI2RlZmluZSBzdFJlZ1JlbG9jCTEyCS8qIHJlZ2lzdGVyIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgc3RGb3J3YXJkCTEzCS8qIGZvcndhcmRpbmcgYWRkcmVzcyAqLwotI2RlZmluZSBzdFN0YXRpY1Byb2MJMTQJLyogbG9hZCB0aW1lIG9ubHkgc3RhdGljIHByb2NzICovCi0jZGVmaW5lIHN0Q29uc3RhbnQJMTUJLyogY29uc3QgKi8KLSNkZWZpbmUgc3RTdGFQYXJhbQkxNgkvKiBGb3J0cmFuIHN0YXRpYyBwYXJhbWV0ZXJzICovCi0gICAgLyogVGhlc2UgbmV3IHN5bWJvbCB0eXBlcyBoYXZlIGJlZW4gcmVjZW50bHkgYWRkZWQgdG8gU0dJIG1hY2hpbmVzLiAqLwotI2RlZmluZSBzdFN0cnVjdAkyNgkvKiBCZWdpbm5pbmcgb2YgYmxvY2sgZGVmaW5pbmcgYSBzdHJ1Y3QgdHlwZSAqLwotI2RlZmluZSBzdFVuaW9uCQkyNwkvKiBCZWdpbm5pbmcgb2YgYmxvY2sgZGVmaW5pbmcgYSB1bmlvbiB0eXBlICovCi0jZGVmaW5lIHN0RW51bQkJMjgJLyogQmVnaW5uaW5nIG9mIGJsb2NrIGRlZmluaW5nIGFuIGVudW0gdHlwZSAqLwotI2RlZmluZSBzdEluZGlyZWN0CTM0CS8qIEluZGlyZWN0IHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotICAgIC8qIFBzZXVkby1zeW1ib2xzIC0gaW50ZXJuYWwgdG8gZGVidWdnZXIgKi8KLSNkZWZpbmUgc3RTdHIJCTYwCS8qIHN0cmluZyAqLwotI2RlZmluZSBzdE51bWJlcgk2MQkvKiBwdXJlIG51bWJlciAoaWUuIDQgTk9SIDIrMikgKi8KLSNkZWZpbmUgc3RFeHByCQk2MgkvKiAyKzIgdnMuIDQgKi8KLSNkZWZpbmUgc3RUeXBlCQk2MwkvKiBwb3N0LWNvZXJzaW9uIFNFUiAqLwotI2RlZmluZSBzdE1heAkJNjQKLQotLyogZGVmaW5pdGlvbnMgZm9yIGZpZWxkcyBpbiBUSVIgKi8KLQotLyogdHlwZSBxdWFsaWZpZXJzIGZvciB0aS50cTAgLT4gdGkuKGl0cU1heC0xKSAqLwotI2RlZmluZSB0cU5pbAkwCS8qIGJ0IGlzIHdoYXQgeW91IHNlZSAqLwotI2RlZmluZSB0cVB0cgkxCS8qIHBvaW50ZXIgKi8KLSNkZWZpbmUgdHFQcm9jCTIJLyogcHJvY2VkdXJlICovCi0jZGVmaW5lIHRxQXJyYXkgMwkvKiBkdWggKi8KLSNkZWZpbmUgdHFGYXIJNAkvKiBsb25nZXIgYWRkcmVzc2luZyAtIDgwODYvOCBsYW5kICovCi0jZGVmaW5lIHRxVm9sCTUJLyogdm9sYXRpbGUgKi8KLSNkZWZpbmUgdHFDb25zdCA2CS8qIGNvbnN0ICovCi0jZGVmaW5lIHRxTWF4CTgKLQotLyogYmFzaWMgdHlwZXMgYXMgc2VlbiBpbiB0aS5idCAqLwotI2RlZmluZSBidE5pbAkJMAkvKiB1bmRlZmluZWQgKGFsc28sIGVudW0gbWVtYmVycykgKi8KLSNkZWZpbmUgYnRBZHIJCTEJLyogYWRkcmVzcyAtIGludGVnZXIgc2FtZSBzaXplIGFzIHBvaW50ZXIgKi8KLSNkZWZpbmUgYnRDaGFyCQkyCS8qIGNoYXJhY3RlciAqLwotI2RlZmluZSBidFVDaGFyCQkzCS8qIHVuc2lnbmVkIGNoYXJhY3RlciAqLwotI2RlZmluZSBidFNob3J0CQk0CS8qIHNob3J0ICovCi0jZGVmaW5lIGJ0VVNob3J0CTUJLyogdW5zaWduZWQgc2hvcnQgKi8KLSNkZWZpbmUgYnRJbnQJCTYJLyogaW50ICovCi0jZGVmaW5lIGJ0VUludAkJNwkvKiB1bnNpZ25lZCBpbnQgKi8KLSNkZWZpbmUgYnRMb25nCQk4CS8qIGxvbmcgKi8KLSNkZWZpbmUgYnRVTG9uZwkJOQkvKiB1bnNpZ25lZCBsb25nICovCi0jZGVmaW5lIGJ0RmxvYXQJCTEwCS8qIGZsb2F0IChyZWFsKSAqLwotI2RlZmluZSBidERvdWJsZQkxMQkvKiBEb3VibGUgKHJlYWwpICovCi0jZGVmaW5lIGJ0U3RydWN0CTEyCS8qIFN0cnVjdHVyZSAoUmVjb3JkKSAqLwotI2RlZmluZSBidFVuaW9uCQkxMwkvKiBVbmlvbiAodmFyaWFudCkgKi8KLSNkZWZpbmUgYnRFbnVtCQkxNAkvKiBFbnVtZXJhdGVkICovCi0jZGVmaW5lIGJ0VHlwZWRlZgkxNQkvKiBkZWZpbmVkIHZpYSBhIHR5cGVkZWYsIGlzeW1SZWYgcG9pbnRzICovCi0jZGVmaW5lIGJ0UmFuZ2UJCTE2CS8qIHN1YnJhbmdlIG9mIGludCAqLwotI2RlZmluZSBidFNldAkJMTcJLyogcGFzY2FsIHNldHMgKi8KLSNkZWZpbmUgYnRDb21wbGV4CTE4CS8qIGZvcnRyYW4gY29tcGxleCAqLwotI2RlZmluZSBidERDb21wbGV4CTE5CS8qIGZvcnRyYW4gZG91YmxlIGNvbXBsZXggKi8KLSNkZWZpbmUgYnRJbmRpcmVjdAkyMAkvKiBmb3J3YXJkIG9yIHVubmFtZWQgdHlwZWRlZiAqLwotI2RlZmluZSBidEZpeGVkRGVjCTIxCS8qIEZpeGVkIERlY2ltYWwgKi8KLSNkZWZpbmUgYnRGbG9hdERlYwkyMgkvKiBGbG9hdCBEZWNpbWFsICovCi0jZGVmaW5lIGJ0U3RyaW5nCTIzCS8qIFZhcnlpbmcgTGVuZ3RoIENoYXJhY3RlciBTdHJpbmcgKi8KLSNkZWZpbmUgYnRCaXQJCTI0CS8qIEFsaWduZWQgQml0IFN0cmluZyAqLwotI2RlZmluZSBidFBpY3R1cmUJMjUJLyogUGljdHVyZSAqLwotI2RlZmluZSBidFZvaWQJCTI2CS8qIHZvaWQgKi8KLSNkZWZpbmUgYnRMb25nTG9uZwkyNwkvKiBsb25nIGxvbmcgKi8KLSNkZWZpbmUgYnRVTG9uZ0xvbmcJMjgJLyogdW5zaWduZWQgbG9uZyBsb25nICovCi0jZGVmaW5lIGJ0TWF4CQk2NAotCi0jaWYgKF9NRkcgPT0gX01JUFMpCi0vKiBvcHRpbWl6YXRpb24gdHlwZSBjb2RlcyAqLwotI2RlZmluZSBvdE5pbAkJMAotI2RlZmluZSBvdFJlZwkJMQkvKiBtb3ZlIHZhciB0byByZWcgKi8KLSNkZWZpbmUgb3RCbG9jawkJMgkvKiBiZWdpbiBiYXNpYyBibG9jayAqLwotI2RlZmluZQlvdFByb2MJCTMJLyogcHJvY2VkdXJlICovCi0jZGVmaW5lIG90SW5saW5lCTQJLyogaW5saW5lIHByb2NlZHVyZSAqLwotI2RlZmluZSBvdEVuZAkJNQkvKiB3aGF0ZXZlciB5b3Ugc3RhcnRlZCAqLwotI2RlZmluZSBvdE1heAkJNgkvKiBLRUVQIFVQIFRPIERBVEUgKi8KLSNlbmRpZiAvKiAoX01GRyA9PSBfTUlQUykgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi90aWMzMC5oIGIvaW5jbHVkZS9jb2ZmL3RpYzMwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjAyNmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3RpYzMwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDM1ggKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotI2RlZmluZQlUSUMzME1BR0lDCTB4QzAwMAotCi0jZGVmaW5lIFRJQzMwQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPVRJQzMwTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0gIHN0cnVjdCB7Ci0JY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCXVuaW9uIHsKLQkgIHN0cnVjdCB7Ci0JCWNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCSAgfSB4X2xuc3o7Ci0JICBjaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQl9IHhfbWlzYzsKLQl1bmlvbiB7Ci0JICBzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCWNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQljaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkgIH0geF9mY247Ci0JICBzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCWNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JICB9IHhfYXJ5OwotCX0geF9mY25hcnk7Ci0JY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLSAgfSB4X3N5bTsKLSAgCi0gIHVuaW9uIHsKLQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0Jc3RydWN0IHsKLQkgIGNoYXIgeF96ZXJvZXNbNF07Ci0JICBjaGFyIHhfb2Zmc2V0WzRdOwotCX0geF9uOwotICB9IHhfZmlsZTsKLSAgCi0gIHN0cnVjdCB7Ci0JY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgfSB4X3NjbjsKLSAgCi0gIHN0cnVjdCB7Ci0JY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLSAgfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotICAKLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSB6OGsgZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgd2l0aCBzZWdtZW50cyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLS8qIFRNUzMyMEMzMCByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLQotI2RlZmluZSBSX1RJQzMwX0FCUzE2IDB4MTAwICAvKiAxNiBiaXQgYWJzb2x1dGUuICovCi0jZGVmaW5lIFJfVElDMzBfQUJTMjQgMHgxMDEgIC8qIDI0IGJpdCBhYnNvbHV0ZS4gKi8KLSNkZWZpbmUgUl9USUMzMF9BQlMzMiAweDEwMiAgLyogMzIgYml0IGFic29sdXRlLiAqLwotI2RlZmluZSBSX1RJQzMwX0xEUCAgIDB4MTAzICAvKiBMRFAgYml0cyAyMy0xNiB0byA3LTAuICovCi0jZGVmaW5lIFJfVElDMzBfUEMxNiAgMHgxMDQgIC8qIDE2IGJpdCBwYyByZWxhdGl2ZS4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi90aWM4MC5oIGIvaW5jbHVkZS9jb2ZmL3RpYzgwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTM4ZjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3RpYzgwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBUSSBUTVMzMjBDODAgKE1WUCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLQljaGFyIGZfdGFyZ2V0X2lkWzJdOwkvKiB0YXJnZXQgaWQgKFRJYzgwIHNwZWNpZmljKQkqLwotfTsKLQotI2RlZmluZQlUSUM4MF9BUkNIX01BR0lDCTB4MEMxCS8qIEdvZXMgaW4gdGhlIGZpbGUgaGVhZGVyIG1hZ2ljIG51bWJlciBmaWVsZCAqLwotI2RlZmluZSBUSUM4MF9UQVJHRVRfSUQJCTB4OTUJLyogR29lcyBpbiB0aGUgdGFyZ2V0IGlkIGZpZWxkICovCi0KLSNkZWZpbmUgVElDODBCQURNQUcoeCkgKCh4KS5mX21hZ2ljICE9IFRJQzgwX0FSQ0hfTUFHSUMpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIFRJQzgwX0FPVVRIRFJfTUFHSUMJMHgxMDgJLyogR29lcyBpbiB0aGUgb3B0aW9uYWwgZmlsZSBoZWFkZXIgbWFnaWMgbnVtYmVyIGZpZWxkICovCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLQljaGFyCQlzX3Jlc2VydmVkWzFdOwkvKiByZXNlcnZlZCAoVEljODAgc3BlY2lmaWMpCSovCi0JY2hhcgkJc19tZW1wYWdlWzFdOwkvKiBtZW1vcnkgcGFnZSBudW1iZXIgKFRJYzgwKQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfQ0lOSVQJIi5jaW5pdCIKLSNkZWZpbmUgX0NPTlNUCSIuY29uc3QiCi0jZGVmaW5lIF9TV0lUQ0gJIi5zd2l0Y2giCi0jZGVmaW5lIF9TVEFDSwkiLnN0YWNrIgotI2RlZmluZSBfU1lTTUVNCSIuc3lzbWVtIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkJCS8qIGxpbmUgbnVtYmVyCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLS8qIEZJWE1FIC0gbmVlZCB0byBjb3JyZWxhdGUgd2l0aCBUSWM4MCBDb2RlIEdlbmVyYXRpb24gVG9vbHMgVXNlcidzIEd1aWRlLCBDRzpBLTI1ICovCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIGg4IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3Jlc2VydmVkWzJdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTIKLQotLyogVEljODAgcmVsb2NhdGlvbiB0eXBlcy4gKi8KLQotI2RlZmluZSBSX0FCUwkJMHgwMAkJLyogQWJzb2x1dGUgYWRkcmVzcyAtIG5vIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgUl9SRUxMT05HWAkweDExCQkvKiBQUDogMzIgYml0cywgZGlyZWN0ICovCi0jZGVmaW5lIFJfUFBCQVNFCTB4MzQJCS8qIFBQOiBHbG9iYWwgYmFzZSBhZGRyZXNzIHR5cGUgKi8KLSNkZWZpbmUgUl9QUExCQVNFCTB4MzUJCS8qIFBQOiBMb2NhbCBiYXNlIGFkZHJlc3MgdHlwZSAqLwotI2RlZmluZSBSX1BQMTUJCTB4MzgJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG9mZnNldCAqLwotI2RlZmluZSBSX1BQMTVXCQkweDM5CQkvKiBQUDogR2xvYmFsIDE1IGJpdCBvZmZzZXQgZGl2aWRlZCBieSA0ICovCi0jZGVmaW5lIFJfUFAxNUgJCTB4M0EJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG9mZnNldCBkaXZpZGVkIGJ5IDIgKi8KLSNkZWZpbmUgUl9QUDE2QgkJMHgzQgkJLyogUFA6IEdsb2JhbCAxNiBiaXQgb2Zmc2V0IGZvciBieXRlcyAqLwotI2RlZmluZSBSX1BQTDE1CQkweDNDCQkvKiBQUDogTG9jYWwgMTUgYml0IG9mZnNldCAqLwotI2RlZmluZSBSX1BQTDE1VwkweDNECQkvKiBQUDogTG9jYWwgMTUgYml0IG9mZnNldCBkaXZpZGVkIGJ5IDQgKi8KLSNkZWZpbmUgUl9QUEwxNUgJMHgzRQkJLyogUFA6IExvY2FsIDE1IGJpdCBvZmZzZXQgZGl2aWRlZCBieSAyICovCi0jZGVmaW5lIFJfUFBMMTZCCTB4M0YJCS8qIFBQOiBMb2NhbCAxNiBiaXQgb2Zmc2V0IGZvciBieXRlcyAqLwotI2RlZmluZSBSX1BQTjE1CQkweDQwCQkvKiBQUDogR2xvYmFsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgKi8KLSNkZWZpbmUgUl9QUE4xNVcJMHg0MQkJLyogUFA6IEdsb2JhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0IGRpdmlkZWQgYnkgNCAqLwotI2RlZmluZSBSX1BQTjE1SAkweDQyCQkvKiBQUDogR2xvYmFsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgZGl2aWRlZCBieSAyICovCi0jZGVmaW5lIFJfUFBOMTZCCTB4NDMJCS8qIFBQOiBHbG9iYWwgMTYgYml0IG5lZ2F0aXZlIGJ5dGUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfUFBMTjE1CTB4NDQJCS8qIFBQOiBMb2NhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfUFBMTjE1VwkweDQ1CQkvKiBQUDogTG9jYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCBkaXZpZGVkIGJ5IDQgKi8KLSNkZWZpbmUgUl9QUExOMTVICTB4NDYJCS8qIFBQOiBMb2NhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0IGRpdmlkZWQgYnkgMiAqLwotI2RlZmluZSBSX1BQTE4xNkIJMHg0NwkJLyogUFA6IExvY2FsIDE2IGJpdCBuZWdhdGl2ZSBieXRlIG9mZnNldCAqLwotI2RlZmluZSBSX01QUENSMTVXCTB4NEUJCS8qIE1QOiAxNSBiaXQgUEMtcmVsYXRpdmUgZGl2aWRlZCBieSA0ICovCi0jZGVmaW5lIFJfTVBQQ1IJCTB4NEYJCS8qIE1QOiAzMiBiaXQgUEMtcmVsYXRpdmUgZGl2aWRlZCBieSA0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvdzY1LmggYi9pbmNsdWRlL2NvZmYvdzY1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNzhjMjMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3c2NS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgV0RDIDY1ODE2ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLQotI2RlZmluZQlXNjVNQUdJQwkweDY1MDAKLQotCi0jZGVmaW5lIFc2NUJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1XNjVNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSB3NjUgZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCi0KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvd2UzMmsuaCBiL2luY2x1ZGUvY29mZi93ZTMyay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTNmYTM1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi93ZTMyay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3Igd2UzMmsgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotLyogQml0cyBmb3IgZl9mbGFnczoKLSAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCi0gKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKLSAqLwotCi0jZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCi0jZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikKLSNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQotI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQotI2RlZmluZQlGX0JNMzJCCQkoMDAyMDAwMCkKLSNkZWZpbmUJRl9CTTMyTUFVCSgwMDQwMDAwKQotCi0jZGVmaW5lCVdFMzJLTUFHSUMJMHgxNzAJLyogd2UzMmsgc2FucyB0cmFuc2ZlciB2ZWN0b3IgKi8KLSNkZWZpbmUgRkJPTUFHSUMJMHgxNzAJLyogd2UzMmsgc2FucyB0cmFuc2ZlciB2ZWN0b3IgKi8KLSNkZWZpbmUgTVRWTUFHSUMJMHgxNzEJLyogd2UzMmsgd2l0aCB0cmFuc2ZlciB2ZWN0b3IgKi8KLSNkZWZpbmUgUkJPTUFHSUMJMHgxNzIJLyogcmVzZXJ2ZWQgKi8KLSNkZWZpbmUgV0UzMktCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyAhPSBXRTMyS01BR0lDKSBcCi0JCQkmJiAoKHgpLmZfbWFnaWMgIT0gRkJPTUFHSUMpIFwKLQkJCSYmICgoeCkuZl9tYWdpYyAhPSBSQk9NQUdJQykgXAotCQkJJiYgKCh4KS5mX21hZ2ljICE9IE1UVk1BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX1RWCSIudHYiCi0jZGVmaW5lIF9JTklUCSIuaW5pdCIKLSNkZWZpbmUgX0ZJTkkJIi5maW5pIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0jCWRlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTAKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3o4ay5oIGIvaW5jbHVkZS9jb2ZmL3o4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWI4NDZjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi96OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFppbG9nIFo4MDBOICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLS8qIFR5cGUgb2YgY3B1IGlzIHN0b3JlZCBpbiBmbGFncyAqLwotI2RlZmluZSBGX1o4MDAxICAgIDB4MTAwMAotI2RlZmluZSBGX1o4MDAyICAgIDB4MjAwMAotI2RlZmluZSBGX01BQ0hNQVNLIDB4ZjAwMAotCi0jZGVmaW5lCVo4S01BR0lDCTB4ODAwMAotCi0jZGVmaW5lIFo4S0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1aOEtNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSB6OGsgZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgd2l0aCBzZWdtZW50cyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVtYW5nbGUuaCBiL2luY2x1ZGUvZGVtYW5nbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNmZTVlMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2RlbWFuZ2xlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiBEZWZzIGZvciBpbnRlcmZhY2UgdG8gZGVtYW5nbGVycy4KLSAgIENvcHlyaWdodCAxOTkyLCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaWYgIWRlZmluZWQgKERFTUFOR0xFX0gpCi0jZGVmaW5lIERFTUFOR0xFX0gKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLS8qIE9wdGlvbnMgcGFzc2VkIHRvIGNwbHVzX2RlbWFuZ2xlIChpbiAybmQgcGFyYW1ldGVyKS4gKi8KLQotI2RlZmluZSBETUdMX05PX09QVFMJMAkJLyogRm9yIHJlYWRhYmlsaXR5Li4uICovCi0jZGVmaW5lIERNR0xfUEFSQU1TCSgxIDw8IDApCS8qIEluY2x1ZGUgZnVuY3Rpb24gYXJncyAqLwotI2RlZmluZSBETUdMX0FOU0kJKDEgPDwgMSkJLyogSW5jbHVkZSBjb25zdCwgdm9sYXRpbGUsIGV0YyAqLwotI2RlZmluZSBETUdMX0pBVkEJKDEgPDwgMikJLyogRGVtYW5nbGUgYXMgSmF2YSByYXRoZXIgdGhhbiBDKysuICovCi0KLSNkZWZpbmUgRE1HTF9BVVRPCSgxIDw8IDgpCi0jZGVmaW5lIERNR0xfR05VCSgxIDw8IDkpCi0jZGVmaW5lIERNR0xfTFVDSUQJKDEgPDwgMTApCi0jZGVmaW5lIERNR0xfQVJNCSgxIDw8IDExKQotI2RlZmluZSBETUdMX0hQIAkoMSA8PCAxMikgICAgICAgLyogRm9yIHRoZSBIUCBhQ0MgY29tcGlsZXI7IHNhbWUgYXMgQVJNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGZvciB0ZW1wbGF0ZSBhcmd1bWVudHMsIGV0Yy4gKi8KLSNkZWZpbmUgRE1HTF9FREcJKDEgPDwgMTMpCi0KLS8qIElmIG5vbmUgb2YgdGhlc2UgYXJlIHNldCwgdXNlICdjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUnIGFzIHRoZSBkZWZhdWx0LiAqLwotI2RlZmluZSBETUdMX1NUWUxFX01BU0sgKERNR0xfQVVUT3xETUdMX0dOVXxETUdMX0xVQ0lEfERNR0xfQVJNfERNR0xfSFB8RE1HTF9FREcpCi0KLS8qIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGRlbWFuZ2xpbmcgc3R5bGVzLgotCi0gICBMdWNpZCBhbmQgQVJNIHN0eWxlcyBhcmUgc3RpbGwga2VwdCBsb2dpY2FsbHkgZGlzdGluY3QsIGV2ZW4gdGhvdWdoCi0gICB0aGV5IG5vdyBib3RoIGJlaGF2ZSBpZGVudGljYWxseS4gIFRoZSByZXN1bHRpbmcgc3R5bGUgaXMgYWN0dWFsIHRoZQotICAgdW5pb24gb2YgYm90aC4gIEkuRS4gZWl0aGVyIHN0eWxlIHJlY29nbml6ZXMgYm90aCAiX19wdF9fIiBhbmQgIl9fcmZfXyIKLSAgIGZvciBvcGVyYXRvciAiLT4iLCBldmVuIHRob3VnaCB0aGUgZmlyc3QgaXMgbHVjaWQgc3R5bGUgYW5kIHRoZSBzZWNvbmQKLSAgIGlzIEFSTSBzdHlsZS4gKEZJWE1FPykgKi8KLQotZXh0ZXJuIGVudW0gZGVtYW5nbGluZ19zdHlsZXMKLXsKLSAgdW5rbm93bl9kZW1hbmdsaW5nID0gMCwKLSAgYXV0b19kZW1hbmdsaW5nID0gRE1HTF9BVVRPLAotICBnbnVfZGVtYW5nbGluZyA9IERNR0xfR05VLAotICBsdWNpZF9kZW1hbmdsaW5nID0gRE1HTF9MVUNJRCwKLSAgYXJtX2RlbWFuZ2xpbmcgPSBETUdMX0FSTSwKLSAgaHBfZGVtYW5nbGluZyA9IERNR0xfSFAsCi0gIGVkZ19kZW1hbmdsaW5nID0gRE1HTF9FREcKLX0gY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlOwotCi0vKiBEZWZpbmUgc3RyaW5nIG5hbWVzIGZvciB0aGUgdmFyaW91cyBkZW1hbmdsaW5nIHN0eWxlcy4gKi8KLQotI2RlZmluZSBBVVRPX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJhdXRvIgotI2RlZmluZSBHTlVfREVNQU5HTElOR19TVFlMRV9TVFJJTkcJImdudSIKLSNkZWZpbmUgTFVDSURfREVNQU5HTElOR19TVFlMRV9TVFJJTkcJImx1Y2lkIgotI2RlZmluZSBBUk1fREVNQU5HTElOR19TVFlMRV9TVFJJTkcJImFybSIKLSNkZWZpbmUgSFBfREVNQU5HTElOR19TVFlMRV9TVFJJTkcJImhwIgotI2RlZmluZSBFREdfREVNQU5HTElOR19TVFlMRV9TVFJJTkcJImVkZyIKLQotLyogU29tZSBtYWNyb3MgdG8gdGVzdCB3aGF0IGRlbWFuZ2xpbmcgc3R5bGUgaXMgYWN0aXZlLiAqLwotCi0jZGVmaW5lIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUKLSNkZWZpbmUgQVVUT19ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfQVVUTykKLSNkZWZpbmUgR05VX0RFTUFOR0xJTkcgKCgoaW50KSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUpICYgRE1HTF9HTlUpCi0jZGVmaW5lIExVQ0lEX0RFTUFOR0xJTkcgKCgoaW50KSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUpICYgRE1HTF9MVUNJRCkKLSNkZWZpbmUgQVJNX0RFTUFOR0xJTkcgKCgoaW50KSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUpICYgRE1HTF9BUk0pCi0jZGVmaW5lIEhQX0RFTUFOR0xJTkcgKCgoaW50KSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUpICYgRE1HTF9IUCkKLSNkZWZpbmUgRURHX0RFTUFOR0xJTkcgKCgoaW50KSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUpICYgRE1HTF9FREcpCi0KLWV4dGVybiBjaGFyICoKLWNwbHVzX2RlbWFuZ2xlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm1hbmdsZWQsIGludCBvcHRpb25zKSk7Ci0KLWV4dGVybiBpbnQKLWNwbHVzX2RlbWFuZ2xlX29wbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICpvcG5hbWUsIGNoYXIgKnJlc3VsdCwgaW50IG9wdGlvbnMpKTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKgotY3BsdXNfbWFuZ2xlX29wbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICpvcG5hbWUsIGludCBvcHRpb25zKSk7Ci0KLS8qIE5vdGU6IFRoaXMgc2V0cyBnbG9iYWwgc3RhdGUuICBGSVhNRSBpZiB5b3UgY2FyZSBhYm91dCBtdWx0aS10aHJlYWRpbmcuICovCi0KLWV4dGVybiB2b2lkCi1zZXRfY3BsdXNfbWFya2VyX2Zvcl9kZW1hbmdsaW5nIFBBUkFNUyAoKGludCBjaCkpOwotCi0jZW5kaWYJLyogREVNQU5HTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kaXMtYXNtLmggYi9pbmNsdWRlL2Rpcy1hc20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0MDA3OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2Rpcy1hc20uaAorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKiBJbnRlcmZhY2UgYmV0d2VlbiB0aGUgb3Bjb2RlIGxpYnJhcnkgYW5kIGl0cyBjYWxsZXJzLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydCwgMTk5My4KLQotICAgVGhlIG9wY29kZSBsaWJyYXJ5IChsaWJvcGNvZGVzLmEpIHByb3ZpZGVzIGluc3RydWN0aW9uIGRlY29kZXJzIGZvcgotICAgYSBsYXJnZSB2YXJpZXR5IG9mIGluc3RydWN0aW9uIHNldHMsIGNhbGxhYmxlIHdpdGggYW4gaWRlbnRpY2FsCi0gICBpbnRlcmZhY2UsIGZvciBtYWtpbmcgaW5zdHJ1Y3Rpb24tcHJvY2Vzc2luZyBwcm9ncmFtcyBtb3JlIGluZGVwZW5kZW50Ci0gICBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGJlaW5nIHByb2Nlc3NlZC4gICovCi0KLSNpZm5kZWYgRElTX0FTTV9ICi0jZGVmaW5lIERJU19BU01fSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJiZmQuaCIKLQotdHlwZWRlZiBpbnQgKCpmcHJpbnRmX2Z0eXBlKSBQQVJBTVMoKFBUUiwgY29uc3QgY2hhciosIC4uLikpOwotCi1lbnVtIGRpc19pbnNuX3R5cGUgewotICBkaXNfbm9uaW5zbiwJCQkvKiBOb3QgYSB2YWxpZCBpbnN0cnVjdGlvbiAqLwotICBkaXNfbm9uYnJhbmNoLAkJLyogTm90IGEgYnJhbmNoIGluc3RydWN0aW9uICovCi0gIGRpc19icmFuY2gsCQkJLyogVW5jb25kaXRpb25hbCBicmFuY2ggKi8KLSAgZGlzX2NvbmRicmFuY2gsCQkvKiBDb25kaXRpb25hbCBicmFuY2ggKi8KLSAgZGlzX2pzciwJCQkvKiBKdW1wIHRvIHN1YnJvdXRpbmUgKi8KLSAgZGlzX2NvbmRqc3IsCQkJLyogQ29uZGl0aW9uYWwganVtcCB0byBzdWJyb3V0aW5lICovCi0gIGRpc19kcmVmLAkJCS8qIERhdGEgcmVmZXJlbmNlIGluc3RydWN0aW9uICovCi0gIGRpc19kcmVmMgkJCS8qIFR3byBkYXRhIHJlZmVyZW5jZXMgaW4gaW5zdHJ1Y3Rpb24gKi8KLX07Ci0KLS8qIFRoaXMgc3RydWN0IGlzIHBhc3NlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGluZyByb3V0aW5lLCAKLSAgIGFuZCBpcyBwYXNzZWQgYmFjayBvdXQgaW50byBlYWNoIGNhbGxiYWNrLiAgVGhlIHZhcmlvdXMgZmllbGRzIGFyZSB1c2VkCi0gICBmb3IgY29udmV5aW5nIGluZm9ybWF0aW9uIGZyb20geW91ciBtYWluIHJvdXRpbmUgaW50byB5b3VyIGNhbGxiYWNrcywKLSAgIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uIGludG8gdGhlIGluc3RydWN0aW9uIGRlY29kZXJzIChzdWNoIGFzIHRoZQotICAgYWRkcmVzc2VzIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMpLCBvciBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbgotICAgYmFjayBmcm9tIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVycyB0byB0aGVpciBjYWxsZXJzLgotCi0gICBJdCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBpdCBpcyBmaXJzdCBwYXNzZWQ7IHRoaXMgY2FuIGJlIGRvbmUKLSAgIGJ5IGhhbmQsIG9yIHVzaW5nIG9uZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gbWFjcm9zIGJlbG93LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyB7Ci0gIGZwcmludGZfZnR5cGUgZnByaW50Zl9mdW5jOwotICBQVFIgc3RyZWFtOwotICBQVFIgYXBwbGljYXRpb25fZGF0YTsKLQotICAvKiBUYXJnZXQgZGVzY3JpcHRpb24uICBXZSBjb3VsZCByZXBsYWNlIHRoaXMgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGJmZCwKLSAgICAgYnV0IHRoYXQgd291bGQgcmVxdWlyZSBvbmUuICBUaGVyZSBjdXJyZW50bHkgaXNuJ3QgYW55IHN1Y2ggcmVxdWlyZW1lbnQKLSAgICAgc28gdG8gYXZvaWQgaW50cm9kdWNpbmcgb25lIHdlIHJlY29yZCB0aGVzZSBleHBsaWNpdGx5LiAgKi8KLSAgLyogVGhlIGJmZF9mbGF2b3VyLiAgVGhpcyBjYW4gYmUgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIuICAqLwotICBlbnVtIGJmZF9mbGF2b3VyIGZsYXZvdXI7Ci0gIC8qIFRoZSBiZmRfYXJjaCB2YWx1ZS4gICovCi0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAvKiBUaGUgYmZkX21hY2ggdmFsdWUuICAqLwotICB1bnNpZ25lZCBsb25nIG1hY2g7Ci0gIC8qIEVuZGlhbm5lc3MgKGZvciBiaS1lbmRpYW4gY3B1cykuICBNb25vLWVuZGlhbiBjcHVzIGNhbiBpZ25vcmUgdGhpcy4gICovCi0gIGVudW0gYmZkX2VuZGlhbiBlbmRpYW47Ci0KLSAgLyogQW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gc3ltYm9scyBlaXRoZXIgYXQgdGhlIGxvY2F0aW9uIGJlaW5nIGRpc2Fzc2VtYmxlZAotICAgICBvciBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGRpc2Fzc2VtYmxlZC4gIFRoZSBhcnJheSBpcyBzb3J0ZWQKLSAgICAgc28gdGhhdCB0aGUgZmlyc3Qgc3ltYm9sIGlzIGludGVuZGVkIHRvIGJlIHRoZSBvbmUgdXNlZC4gIFRoZSBvdGhlcnMgYXJlCi0gICAgIHByZXNlbnQgZm9yIGFueSBtaXNjLiBwdXJwb3Nlcy4gIFRoaXMgaXMgbm90IHNldCByZWxpYWJseSwgYnV0IGlmIGl0IGlzCi0gICAgIG5vdCBOVUxMLCBpdCBpcyBjb3JyZWN0LiAgKi8KLSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gIC8qIE51bWJlciBvZiBzeW1ib2xzIGluIGFycmF5LiAgKi8KLSAgaW50IG51bV9zeW1ib2xzOwotCi0gIC8qIEZvciB1c2UgYnkgdGhlIGRpc2Fzc2VtYmxlci4KLSAgICAgVGhlIHRvcCAxNiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgcHVibGljIHVzZSAoYW5kIGFyZSBkb2N1bWVudGVkIGhlcmUpLgotICAgICBUaGUgYm90dG9tIDE2IGJpdHMgYXJlIGZvciB0aGUgaW50ZXJuYWwgdXNlIG9mIHRoZSBkaXNhc3NlbWJsZXIuICAqLwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotI2RlZmluZSBJTlNOX0hBU19SRUxPQwkweDgwMDAwMDAwCi0gIFBUUiBwcml2YXRlX2RhdGE7Ci0KLSAgLyogRnVuY3Rpb24gdXNlZCB0byBnZXQgYnl0ZXMgdG8gZGlzYXNzZW1ibGUuICBNRU1BRERSIGlzIHRoZQotICAgICBhZGRyZXNzIG9mIHRoZSBzdHVmZiB0byBiZSBkaXNhc3NlbWJsZWQsIE1ZQUREUiBpcyB0aGUgYWRkcmVzcyB0bwotICAgICBwdXQgdGhlIGJ5dGVzIGluLCBhbmQgTEVOR1RIIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KLSAgICAgSU5GTyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QuCi0gICAgIFJldHVybnMgYW4gZXJybm8gdmFsdWUgb3IgMCBmb3Igc3VjY2Vzcy4gICovCi0gIGludCAoKnJlYWRfbWVtb3J5X2Z1bmMpCi0gICAgUEFSQU1TICgoYmZkX3ZtYSBtZW1hZGRyLCBiZmRfYnl0ZSAqbXlhZGRyLCBpbnQgbGVuZ3RoLAotCSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKLQotICAvKiBGdW5jdGlvbiB3aGljaCBzaG91bGQgYmUgY2FsbGVkIGlmIHdlIGdldCBhbiBlcnJvciB0aGF0IHdlIGNhbid0Ci0gICAgIHJlY292ZXIgZnJvbS4gIFNUQVRVUyBpcyB0aGUgZXJybm8gdmFsdWUgZnJvbSByZWFkX21lbW9yeV9mdW5jIGFuZAotICAgICBNRU1BRERSIGlzIHRoZSBhZGRyZXNzIHRoYXQgd2Ugd2VyZSB0cnlpbmcgdG8gcmVhZC4gIElORk8gaXMgYQotICAgICBwb2ludGVyIHRvIHRoaXMgc3RydWN0LiAgKi8KLSAgdm9pZCAoKm1lbW9yeV9lcnJvcl9mdW5jKQotICAgIFBBUkFNUyAoKGludCBzdGF0dXMsIGJmZF92bWEgbWVtYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKLQotICAvKiBGdW5jdGlvbiBjYWxsZWQgdG8gcHJpbnQgQUREUi4gICovCi0gIHZvaWQgKCpwcmludF9hZGRyZXNzX2Z1bmMpCi0gICAgUEFSQU1TICgoYmZkX3ZtYSBhZGRyLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOwotCi0gIC8qIEZ1bmN0aW9uIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBzeW1ib2wgYXQgdGhlIGdpdmVuIEFERFIuCi0gICAgIElmIHRoZXJlIGlzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAxLCBvdGhlcndpc2UgaXQgcmV0dXJucyAwLgotICAgICBUaGlzIGlzIHVzZWQgYnkgcG9ydHMgd2hpY2ggc3VwcG9ydCBhbiBvdmVybGF5IG1hbmFnZXIgd2hlcmUKLSAgICAgdGhlIG92ZXJsYXkgbnVtYmVyIGlzIGhlbGQgaW4gdGhlIHRvcCBwYXJ0IG9mIGFuIGFkZHJlc3MuICBJbgotICAgICBzb21lIGNpcmN1bXN0YW5jZXMgd2Ugd2FudCB0byBpbmNsdWRlIHRoZSBvdmVybGF5IG51bWJlciBpbiB0aGUKLSAgICAgYWRkcmVzcywgKG5vcm1hbGx5IGJlY2F1c2UgdGhlcmUgaXMgYSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoCi0gICAgIHRoYXQgYWRkcmVzcyksIGJ1dCBzb21ldGltZXMgd2Ugd2FudCB0byBtYXNrIG91dCB0aGUgb3ZlcmxheSBiaXRzLiAgKi8KLSAgaW50ICgqIHN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMpCi0gICAgUEFSQU1TICgoYmZkX3ZtYSBhZGRyLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm8pKTsKLQotICAvKiBUaGVzZSBhcmUgZm9yIGJ1ZmZlcl9yZWFkX21lbW9yeS4gICovCi0gIGJmZF9ieXRlICpidWZmZXI7Ci0gIGJmZF92bWEgYnVmZmVyX3ZtYTsKLSAgaW50IGJ1ZmZlcl9sZW5ndGg7Ci0KLSAgLyogVGhpcyB2YXJpYWJsZSBtYXkgYmUgc2V0IGJ5IHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVyLiAgSXQgc3VnZ2VzdHMKLSAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2JqZHVtcCBzaG91bGQgZGlzcGxheSBvbiBhIHNpbmdsZSBsaW5lLiAgSWYKLSAgICAgIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVyIHNldHMgdGhpcywgaXQgc2hvdWxkIGFsd2F5cyBzZXQgaXQgdG8KLSAgICAgIHRoZSBzYW1lIHZhbHVlIGluIG9yZGVyIHRvIGdldCByZWFzb25hYmxlIGxvb2tpbmcgb3V0cHV0LiAgKi8KLSAgaW50IGJ5dGVzX3Blcl9saW5lOwotCi0gIC8qIHRoZSBuZXh0IHR3byB2YXJpYWJsZXMgY29udHJvbCB0aGUgd2F5IG9iamR1bXAgZGlzcGxheXMgdGhlIHJhdyBkYXRhICovCi0gIC8qIEZvciBleGFtcGxlLCBpZiBieXRlc19wZXJfbGluZSBpcyA4IGFuZCBieXRlc19wZXJfY2h1bmsgaXMgNCwgdGhlICovCi0gIC8qIG91dHB1dCB3aWxsIGxvb2sgbGlrZSB0aGlzOgotICAgICAwMDogICAwMDAwMDAwMCAwMDAwMDAwMAotICAgICB3aXRoIHRoZSBjaHVua3MgZGlzcGxheWVkIGFjY29yZGluZyB0byAiZGlzcGxheV9lbmRpYW4iLiAqLwotICBpbnQgYnl0ZXNfcGVyX2NodW5rOwotICBlbnVtIGJmZF9lbmRpYW4gZGlzcGxheV9lbmRpYW47Ci0KLSAgLyogUmVzdWx0cyBmcm9tIGluc3RydWN0aW9uIGRlY29kZXJzLiAgTm90IGFsbCBkZWNvZGVycyB5ZXQgc3VwcG9ydAotICAgICB0aGlzIGluZm9ybWF0aW9uLiAgVGhpcyBpbmZvIGlzIHNldCBlYWNoIHRpbWUgYW4gaW5zdHJ1Y3Rpb24gaXMKLSAgICAgZGVjb2RlZCwgYW5kIGlzIG9ubHkgdmFsaWQgZm9yIHRoZSBsYXN0IHN1Y2ggaW5zdHJ1Y3Rpb24uCi0KLSAgICAgVG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBkZWNvZGVyIHN1cHBvcnRzIHRoaXMgaW5mb3JtYXRpb24sIHNldAotICAgICBpbnNuX2luZm9fdmFsaWQgdG8gMCwgZGVjb2RlIGFuIGluc3RydWN0aW9uLCB0aGVuIGNoZWNrIGl0LiAgKi8KLQotICBjaGFyIGluc25faW5mb192YWxpZDsJCS8qIEJyYW5jaCBpbmZvIGhhcyBiZWVuIHNldC4gKi8KLSAgY2hhciBicmFuY2hfZGVsYXlfaW5zbnM7CS8qIEhvdyBtYW55IHNlcXVlbnRpYWwgaW5zbidzIHdpbGwgcnVuIGJlZm9yZQotCQkJCSAgIGEgYnJhbmNoIHRha2VzIGVmZmVjdC4gICgwID0gbm9ybWFsKSAqLwotICBjaGFyIGRhdGFfc2l6ZTsJCS8qIFNpemUgb2YgZGF0YSByZWZlcmVuY2UgaW4gaW5zbiwgaW4gYnl0ZXMgKi8KLSAgZW51bSBkaXNfaW5zbl90eXBlIGluc25fdHlwZTsJLyogVHlwZSBvZiBpbnN0cnVjdGlvbiAqLwotICBiZmRfdm1hIHRhcmdldDsJCS8qIFRhcmdldCBhZGRyZXNzIG9mIGJyYW5jaCBvciBkcmVmLCBpZiBrbm93bjsKLQkJCQkgICB6ZXJvIGlmIHVua25vd24uICAqLwotICBiZmRfdm1hIHRhcmdldDI7CQkvKiBTZWNvbmQgdGFyZ2V0IGFkZHJlc3MgZm9yIGRyZWYyICovCi0KLSAgLyogQ29tbWFuZCBsaW5lIG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhlIHRhcmdldCBkaXNhc3NlbWJsZXIuICAqLwotICBjaGFyICogZGlzYXNzZW1ibGVyX29wdGlvbnM7Ci0KLX0gZGlzYXNzZW1ibGVfaW5mbzsKLQotDAotLyogU3RhbmRhcmQgZGlzYXNzZW1ibGVycy4gIERpc2Fzc2VtYmxlIG9uZSBpbnN0cnVjdGlvbiBhdCB0aGUgZ2l2ZW4KLSAgIHRhcmdldCBhZGRyZXNzLiAgUmV0dXJuIG51bWJlciBvZiBieXRlcyBwcm9jZXNzZWQuICAqLwotdHlwZWRlZiBpbnQgKCpkaXNhc3NlbWJsZXJfZnR5cGUpCi0gICAgIFBBUkFNUygoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9iaWdfbWlwcwkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9saXR0bGVfbWlwcwlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2kzODZfYXR0CQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2kzODZfaW50ZWwJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tNjhrCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3o4MDAxCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3o4MDAyCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2g4MzAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2g4MzAwaAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9oODMwMHMJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faDg1MDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fYWxwaGEJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gZGlzYXNzZW1ibGVyX2Z0eXBlIGFyY19nZXRfZGlzYXNzZW1ibGVyIFBBUkFNUyAoKGludCwgaW50KSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fYmlnX2FybQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9saXR0bGVfYXJtCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fc3BhcmMJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fYmlnX2EyOWsJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbGl0dGxlX2EyOWsJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9pOTYwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3NoCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3NobAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9ocHBhCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2ZyMzAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbTMycgkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tODhrCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX21jb3JlCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX21uMTAyMDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbW4xMDMwMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9uczMyawkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9iaWdfcG93ZXJwYwlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2xpdHRsZV9wb3dlcnBjCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fcnM2MDAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3c2NQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9kMTB2CQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2QzMHYJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fdjg1MAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl90aWMzMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl92YXgJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fdGljODAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fcGoJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci0KLWV4dGVybiBpbnQgYXJtX3RvZ2dsZV9yZWduYW1lcyAgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEZldGNoIHRoZSBkaXNhc3NlbWJsZXIgZm9yIGEgZ2l2ZW4gQkZELCBpZiB0aGF0IHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAgKi8KLWV4dGVybiBkaXNhc3NlbWJsZXJfZnR5cGUgZGlzYXNzZW1ibGVyCVBBUkFNUyAoKGJmZCAqKSk7Ci0KLQwKLS8qIFRoaXMgYmxvY2sgb2YgZGVmaW5pdGlvbnMgaXMgZm9yIHBhcnRpY3VsYXIgY2FsbGVycyB3aG8gcmVhZCBpbnN0cnVjdGlvbnMKLSAgIGludG8gYSBidWZmZXIgYmVmb3JlIGNhbGxpbmcgdGhlIGluc3RydWN0aW9uIGRlY29kZXIuICAqLwotCi0vKiBIZXJlIGlzIGEgZnVuY3Rpb24gd2hpY2ggY2FsbGVycyBtYXkgd2lzaCB0byB1c2UgZm9yIHJlYWRfbWVtb3J5X2Z1bmMuCi0gICBJdCBnZXRzIGJ5dGVzIGZyb20gYSBidWZmZXIuICAqLwotZXh0ZXJuIGludCBidWZmZXJfcmVhZF9tZW1vcnkKLSAgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKiwgaW50LCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gZ29lcyB3aXRoIGJ1ZmZlcl9yZWFkX21lbW9yeS4KLSAgIEl0IHByaW50cyBhIG1lc3NhZ2UgdXNpbmcgaW5mby0+ZnByaW50Zl9mdW5jIGFuZCBpbmZvLT5zdHJlYW0uICAqLwotZXh0ZXJuIHZvaWQgcGVycm9yX21lbW9yeSBQQVJBTVMgKChpbnQsIGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotCi0vKiBKdXN0IHByaW50IHRoZSBhZGRyZXNzIGluIGhleC4gIFRoaXMgaXMgaW5jbHVkZWQgZm9yIGNvbXBsZXRlbmVzcyBldmVuCi0gICB0aG91Z2ggYm90aCBHREIgYW5kIG9iamR1bXAgcHJvdmlkZSB0aGVpciBvd24gKHRvIHByaW50IHN5bWJvbGljCi0gICBhZGRyZXNzZXMpLiAgKi8KLWV4dGVybiB2b2lkIGdlbmVyaWNfcHJpbnRfYWRkcmVzcwotICBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLS8qIEFsd2F5cyB0cnVlLiAgKi8KLWV4dGVybiBpbnQgZ2VuZXJpY19zeW1ib2xfYXRfYWRkcmVzcwotICBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLS8qIE1hY3JvIHRvIGluaXRpYWxpemUgYSBkaXNhc3NlbWJsZV9pbmZvIHN0cnVjdC4gIFRoaXMgc2hvdWxkIGJlIGNhbGxlZAotICAgYnkgYWxsIGFwcGxpY2F0aW9ucyBjcmVhdGluZyBzdWNoIGEgc3RydWN0LiAgKi8KLSNkZWZpbmUgSU5JVF9ESVNBU1NFTUJMRV9JTkZPKElORk8sIFNUUkVBTSwgRlBSSU5URl9GVU5DKSBcCi0gIChJTkZPKS5mbGF2b3VyID0gYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsIFwKLSAgKElORk8pLmFyY2ggPSBiZmRfYXJjaF91bmtub3duLCBcCi0gIChJTkZPKS5tYWNoID0gMCwgXAotICAoSU5GTykuZW5kaWFuID0gQkZEX0VORElBTl9VTktOT1dOLCBcCi0gIElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKElORk8sIFNUUkVBTSwgRlBSSU5URl9GVU5DKQotCi0vKiBDYWxsIHRoaXMgbWFjcm8gdG8gaW5pdGlhbGl6ZSBvbmx5IHRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgZm9yIHRoZQotICAgZGlzYXNzZW1ibGVyLiAgQXJjaGl0ZWN0dXJlIGRlcGVuZGVudCB0aGluZ3Mgc3VjaCBhcyBieXRlIG9yZGVyLCBvciBtYWNoaW5lCi0gICB2YXJpYW50IGFyZSBub3QgdG91Y2hlZCBieSB0aGlzIG1hY3JvLiAgVGhpcyBtYWtlcyB0aGluZ3MgbXVjaCBlYXNpZXIgZm9yCi0gICBHREIgd2hpY2ggbXVzdCBpbml0aWFsaXplIHRoZXNlIHRoaW5ncyBzZXBlcmF0bHkuICAqLwotCi0jZGVmaW5lIElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKElORk8sIFNUUkVBTSwgRlBSSU5URl9GVU5DKSBcCi0gIChJTkZPKS5mcHJpbnRmX2Z1bmMgPSAoZnByaW50Zl9mdHlwZSkoRlBSSU5URl9GVU5DKSwgXAotICAoSU5GTykuc3RyZWFtID0gKFBUUikoU1RSRUFNKSwgXAotICAoSU5GTykuc3ltYm9scyA9IE5VTEwsIFwKLSAgKElORk8pLm51bV9zeW1ib2xzID0gMCwgXAotICAoSU5GTykuYnVmZmVyID0gTlVMTCwgXAotICAoSU5GTykuYnVmZmVyX3ZtYSA9IDAsIFwKLSAgKElORk8pLmJ1ZmZlcl9sZW5ndGggPSAwLCBcCi0gIChJTkZPKS5yZWFkX21lbW9yeV9mdW5jID0gYnVmZmVyX3JlYWRfbWVtb3J5LCBcCi0gIChJTkZPKS5tZW1vcnlfZXJyb3JfZnVuYyA9IHBlcnJvcl9tZW1vcnksIFwKLSAgKElORk8pLnByaW50X2FkZHJlc3NfZnVuYyA9IGdlbmVyaWNfcHJpbnRfYWRkcmVzcywgXAotICAoSU5GTykuc3ltYm9sX2F0X2FkZHJlc3NfZnVuYyA9IGdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MsIFwKLSAgKElORk8pLmZsYWdzID0gMCwgXAotICAoSU5GTykuYnl0ZXNfcGVyX2xpbmUgPSAwLCBcCi0gIChJTkZPKS5ieXRlc19wZXJfY2h1bmsgPSAwLCBcCi0gIChJTkZPKS5kaXNwbGF5X2VuZGlhbiA9IEJGRF9FTkRJQU5fVU5LTk9XTiwgXAotICAoSU5GTykuaW5zbl9pbmZvX3ZhbGlkID0gMAotCi0jZW5kaWYgLyogISBkZWZpbmVkIChESVNfQVNNX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9DaGFuZ2VMb2cgYi9pbmNsdWRlL2VsZi9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZWNkMjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsODM3ICswLDAgQEAKLTE5OTktMTItMDkgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBpOTYwLmggKHJlbG9jLW1hY3Jvcy5oKTogIEluY2x1ZGUgdXNpbmcgcmVsYXRpdmUgZGlyIGVsZi8uCi0JKiBpMzg2LmggKHJlbG9jLW1hY3Jvcy5oKTogIEluY2x1ZGUgdXNpbmcgcmVsYXRpdmUgZGlyIGVsZi8uCi0JKiBocHBhLmggKHJlbG9jLW1hY3Jvcy5oKTogIEluY2x1ZGUgdXNpbmcgcmVsYXRpdmUgZGlyIGVsZi8uCi0JCi0xOTk5LTEyLTA3ICBKaW0gQmxhbmR5ICA8amltYkBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoTlRfUFJYRlBSRUcpOiBOZXcgZGVmaW5pdGlvbi4KLQotV2VkIERlYyAgMSAwMzowMjoxNSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoRV9NTjEwMzAwX01BQ0hfQU0zMyk6IERlZmluZS4KLQotTW9uIE9jdCAxMSAyMjo0MjozNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoUEZfSFBfUEFHRV9TSVpFKTogRGVmaW5lLgotCShQRl9IUF9GQVJfU0hBUkVELCBQRl9IUF9ORUFSX1NIQVJFRCwgUEZfSFBfQ09ERSk6IExpa2V3aXNlLgotCShQRl9IUF9NT0RJRlksIFBGX0hQX0xBWllTV0FQLCBQRl9IUF9TQlApOiBMaWtld2lzZS4KLQotTW9uIE9jdCAgNCAxNzo0MjozOCAxOTk5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLmggKEVfTTMyUlhfQVJDSCk6IERlZmluZS4KLQotMTk5OS0wOS0xNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGhwcGEuaDogQWRkIERUX0hQX0dTVF9TSVpFLCBEVF9IUF9HU1RfVkVSU0lPTiwgYW5kIERUX0hQX0dTVF9IQVNIVkFMLgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIHBqLmg6IE5ldyBmaWxlLgotCSogY29tbW9uLmggKEVNX1BKKTogRGVmaW5lLgotCi0xOTk5LTA5LTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaHBwYS5oOiBBZGQgSFBVWCBzcGVjaWZpYyBzeW1ib2wgdHlwZSBkZWZpbml0aW9ucy4KLQotCSogaHBwYS5oOiBBZGQgSFBVWCBzcGVjaWZpYyBkeW5hbWljIGFuZCBwcm9ncmFtIGhlYWRlciB0YWJsZQotCXNwZWNpZmljIGRlZmluaXRpb25zLgotCi0xOTk5LTA4LTMxICBTY290dCBCYW1icm91Z2ggPHNjb3R0YkBuZXR3aW5kZXIub3JnPgotCi0JKiBjb21tb24uaCAoTlRfVEFTS1NUUlVDVCk6IERlZmluZS4KLQotMTk5OS0wNy0xNiAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBzcGFyYy5oIChFRl9TUEFSQ19TVU5fVVMzKTogRGVmaW5lIGluIENoZWV0YWggZXh0ZW5zaW9ucwotCWZsYWcgKGFzIHBlciBTQ0QyLjQuMSkuCi0KLTE5OTktMDctMTYgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogc3BhcmMuaCAoRUxGNjRfUl9UWVBFX0RBVEEpOiBPbmx5IHVzZSBFTEY2NF9SX1RZUEUgYml0cywgbm90Ci0JRUxGNjRfUl9TWU0gYml0cy4KLQotMTk5OS0wNi0yMSAgUGhpbGlwIEJsdW5kZWxsICA8cGJAbmV4dXMuY28udWs+Ci0KLQkqIGFybS5oIChFRl9TT0ZUX0ZMT0FULCBGX1NPRlRfRkxPQVQpOiBEZWZpbmUuCi0KLTE5OTktMDctMTMgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+Ci0KLQkqIG02OGsuaCAoRUZfQ1BVMzIpOiBNb3ZlIGRlZmluaXRpb24gaW5zaWRlIG11bHRpcGxlIGluY2x1c2lvbgotCWd1YXJkLgotCi0xOTk5LTA3LTA4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChFTEY2NF9SX1RZUEVfREFUQSk6IFNpZ24gZXh0ZW5kIHRoZSB2YWx1ZS4KLQkoRUxGNjRfUl9UWVBFX0lORk8pOiBNYXNrIG91dCBhbGwgYnV0IGxvdyAyNCBiaXRzIG9mIGRhdGEuCi0JKERUX1NQQVJDX1BMVEZNVCk6IERlbGV0ZS4KLQlCYXNlZCBvbiBhIHBhdGNoIGZyb20gSmFrdWIgSmVsaW5lay4KLQotTW9uIEp1biAyMSAxNjozNjowMiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoZWxmX2hwcGFfcmVsb2NfdHlwZSk6IFJlbmFtZWQgZnJvbSBlbGYzMl9ocHBhX3JlbG9jX3R5cGUuCi0KLTE5OTktMDYtMTAgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogc3BhcmMuaCAoUl9TUEFSQ19tYXhfc3RkKTogRGVmaW5lLgotCi1XZWQgSnVuICA5IDE1OjE2OjM0IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oOiBVcGRhdGUgd2l0aCB2YXJpb3VzIGNoYW5nZXMgZnJvbSBuZXdlc3QgUEEgRUxGCi0Jc3BlY2lmaWNhdGlvbnMuCi0KLTE5OTktMDYtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb21tb24uaCAoRU1fUFBDNjQpOiBEZWZpbmUuCi0KLTE5OTktMDYtMDIgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgotCi0JKiBkd2FyZi5oOiBBZGQgTEFOR19KQVZBLgotCSogZHdhcmYyLmg6IEFkZCBEV19MQU5HX0phdmEuCi0KLTE5OTktMDUtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTEZPU0FCSV9BUk0pOiBEZWZpbmUuCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLW1hY3Jvcy5oOiBVcGRhdGUgY29tbWVudC4KLQotMTk5OS0wNS0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGk5NjAuaDogTmV3IGZpbGUuCi0KLTE5OTktMDUtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLmggKFJfTUNPUkVfQ09QWSk6IERlZmluZS4KLQkoUl9NQ09SRV9HTE9CX0RBVCk6IERlZmluZS4KLQkoUl9NQ09SRV9KVU1QX1NMT1QpOiBEZWZpbmUuCi0KLTE5OTktMDUtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLmggKFJfTUNPUkVfUkVMQVRJVkUpOiBEZWZpbmUuCi0KLTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBtNjhrLmggKEVGX0NQVTMyKTogRGVmaW5lLgotCi0xOTk5LTA0LTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy1tYWNyb3MuaCAoU1RBUlRfUkVMT0NfTlVNQkVSUyk6IFByZXBlbmQgYW4gdW5kZXJzY29yZSB0bwotCWZha2UgcmVsb2MgZW50cnkgbmFtZSAoaWYgcG9zc2libGUpLCBpbiBvcmRlciB0byBhdm9pZCBjb25mbGljdHMKLQl3aXRoIHR5cGVkZWZzIG9mIHRoZSBzYW1lIG5hbWUuCi0KLTE5OTktMDQtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVGX01JUFNfMzJCSVRNT0RFKTogTmV3LgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS5oOiBOZXcgaGVhZGVyIGZpbGUuICBEZWZpbmVzIGZvciBNb3Rvcm9sbGEncyBNQ29yZQotCXByb2Nlc3Nvci4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IEFkZCBuZXcgY29uc3RhbnRzIGRlZmluZWQgaW46ICJTeXN0ZW0gViBBcHBsaWNhdGlvbgotCUJpbmFyeSBJbnRlcmZhY2UgLSBEUkFGVCAtIEFwcmlsIDI5LCAxOTk4IiBmb3VuZCBhdCB0aGUgd2ViIHNpdGU6Ci0JaHR0cDovL3d3dy5zY28uY29tL2RldmVsb3Blci9nYWJpL2NvbnRlbnRzLmh0bWwKLQotCShFTV9NTUEpOiBSZW1vdmVkLiAgUmVwbGFjZWQgd2l0aCBFTV9NQ09SRSBhcyBNb3Rvcm9sbGEgb3duIHRoaXMKLQl2YWx1ZS4KLQotMTk5OS0wMy0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MtbWFjcm9zLmg6IEZpeGVkIHRvIG5vdCBnZW5lcmF0ZSBhbiBlbnVtIHdpdGggYSB0cmFpbGluZwotCWNvbW1hLgotCi0xOTk5LTAzLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFX01JUFNfTUFDSF81MDAwKTogTmV3LgotCi0xOTk5LTAzLTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IEFkZCBkZWZpbml0aW9ucyBmb3IgYSBmZXcgbW9yZSBTb2xhcmlzIEVMRiBleHRlbnNpb25zLgotCi1UaHUgRmViIDE4IDE4OjU4OjI2IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXh0ZXJuYWwuaDogT25seSB1c2UgYXR0cmlidXRlIGlmIF9fR05VQ19fIGlzIGRlZmluZWQuCi0KLTE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlQYXRjaCBzdWJtaXR0ZWQgYnk6IFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQGNvcmVsY29tcHV0ZXIuY29tPgotCi0JKiBlbGYvZXh0ZXJuYWwuaDogc3RydWN0IEVsZl9FeHRlcm5hbF9WZXJzeW0gbXVzdCBiZSBwYWNrZWQgb24KLQlBUk0uICBDb2RlIHVzZXMgc2l6ZW9mKEVsZl9FeHRlcm5hbF9WZXJzeW0pIGFuZCBhc3N1bWVzIGl0IGlzCi0JZXF1YWwgdG8gc2l6ZW9mKGNoYXJbMl0pLiAgUmVwb3J0ZWQgYnkgSmltIFBpY2sgPGppbUBqaW1waWNrLmNvbT4KLQotMTk5OS0wMi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmggKERXQVJGMl9FeHRlcm5hbF9BUmFuZ2UpOiBOZXcgc3RydWN0dXJlLgotCShEV0FSRjJfSW50ZXJuYWxfQVJhbmdlKTogTmV3IHN0cnVjdHVyZS4KLQotTW9uIEZlYiAgMSAxMTozMzo1NiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGFybS5oOiAgUmVudW1iZXIgcmVsb2NzIHRvIGNvbmZvcm0gdG8gc3RhbmRhcmQuCi0gICAgICAgIChFRl9ORVdfQUJJKTogIERlZmluZS4KLSAgICAgICAgKEVGX09MRF9BQkkpOiAgRGVmaW5lLgotICAgICAgICAqIGFybS1vYWJpLmg6ICBOZXcgZmlsZS4KLQotMTk5OS0wMS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZnIzMC5oOiBBZGQgUl9GUjMwX0dOVV9WVHtJTkhFUklULEVOVFJZfSByZWxvY3MuCi0KLTE5OTktMDEtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMi5oOiBBZGQgdHlwZWRlZnMgZm9yIHN0cnVjdHVyZXMgZm91bmQgaW4gZHdhcmYyIHNlY3Rpb25zLgotCi0xOTk4LTEyLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFX01JUFNfTUFDSF80MTExKTogTmV3LgotCi0xOTk4LTEyLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTX0FCSSxFX01JUFNfQUJJX08zMixFX01JUFNfQUJJX082NCwKLQlFX01JUFNfQUJJX0VBQkkzMixFX01JUFNfQUJJX0VBQkk2NCk6Ci0KLTE5OTgtMTItMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGZyMzAuaDogQWRkIFJfRlIzMF80OCByZWxvYy4KLQotMTk5OC0xMi0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIGV4dGVybmFsIGRhdGEgdHlwZSBmb3IgY29uZmxpY3Qgc2VjdGlvbi4KLQotCSogbWlwcy5oOiBBZGQgbW9yZSBMTF8qIG9wdGlvbnMgZnJvbSBJcml4IDYuNS4KLQotCSogbWlwcy5oOiBBZGQgUl9NSVBTX0pBTFIgYW5kIGFkanVzdCBSX01JUFNfbWF4IGFwcHJvcHJpYXRlbHkuCi0KLVR1ZSBOb3YgMTAgMTU6MTI6MjggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19GUjMwKTogUmVkdWNlIHRvIGEgMTYgYml0IHZhbHVlLgotCi1UdWUgTm92IDEwIDE1OjE3OjI4IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZDEwdi5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLVdlZCBOb3YgIDQgMTU6NTY6NTAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19GUjMwKTogTmV3IG1hY2hpbmUgbnVtYmVyLgotCi0JKiBmcjMwLmg6IE5ldyBmaWxlOiBEZWZpbml0aW9ucyBmb3IgdGhlIEZSMzAuCi0KLUZyaSBPY3QgMzAgMTE6NTQ6MTUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgRnJvbSBQaGlsaXAgQmx1bmRlbGwgPHBiQG5leHVzLmNvLnVrPjoKLSAgICAgICAgKiBhcm0uaCAoUl9BUk1fQ09QWSwgZXQgYWwuKTogTmV3IHJlbG9jcywgdXNlZCBieSBMaW51eCBmb3IgUElDLgotICAgICAgICAoRUZfQUxJR044KTogTmV3IGZsYWcuCi0KLVR1ZSBPY3QgMjAgMTE6MTk6NTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoTlRfTFdQU1RBVFVTKTogQ2xvc2UgY29tbWVudCBhY2NpZGVudGFsbHkgbGVmdCBvcGVuLgotCi1Nb24gT2N0IDE5IDIwOjI0OjExIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogc2guaDogIEFkZCB2dGFibGUgcmVsb2NzLgotCi1Nb24gT2N0IDE5IDAxOjQ0OjQyIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKE5UX1BTVEFUVVMsIE5UX0ZQUkVHUywgTlRfUFNJTkZPLAotIAlOVF9MV1BTVEFUVVMsTlRfTFdQU0lORk8pOiBhZGRlZC4KLQkqIGludGVybmFsLmggKEVsZl9JbnRlcm5hbF9Ob3RlKTogbmV3IHN0cnVjdHVyZSBtZW1iZXJzLgotCi1GcmkgT2N0IDE2IDE0OjExOjI1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogbTMyci5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLVR1ZSBPY3QgIDYgMDk6MjI6MjIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzcGFyYy5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLU1vbiBPY3QgIDUgMDk6Mzk6MjIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiB2ODUwLmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotU3VuIE9jdCAgNCAyMToxNzo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaCAoUl8zODZfbWF4KTogQ2hhbmdlIGZyb20gMjUyIHRvIDI0LgotCi1Nb24gU2VwIDIxIDEyOjI0OjQ0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogaTM4Ni5oOiAgQ2hhbmdlIHZ0YWJsZSByZWxvYyBudW1iZXJzLgotCi1TdW4gU2VwIDIwIDAwOjU0OjIyIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLmg6IEFkZCB2dGFibGUgcmVsb2NzIGFuZCBSXzY4S19tYXguCi0KLVR1ZSBTZXAgMTUgMDk6NTY6NDkgQ0RUIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBhcm0uaDogIEFkZCB2dGFibGUgcmVsb2NzLgotCi1Nb24gQXVnIDMxIDExOjI1OjI3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6ICBEZWZpbmUgU1RUX0FSTV9URlVOQy4gIFJlbW92ZSBTVF9USFVNQl94eHh4Ci0gICAgICAgIGRlZmluaXRpb25zLgotCi1TYXQgQXVnIDI5IDIyOjI1OjUxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQWRkIHZ0YWJsZSByZWxvY3MuCi0KLTE5OTgtMDgtMjUgMTY6NDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIFNZTUlORk9fKiBtYWNyb3MgdG8gYWNjZXNzIEVsZipfU3ltaW5mbyBpbmZvcm1hdGlvbi4KLQotCSogZXh0ZXJuYWwuaDogQWRkIEVsZl9FeHRlcm5hbF9TeW1pbmZvIGRlZmluaXRpb24uCi0KLQkqIGludGVybmFsLmg6IEFkZCBFbGZfSW50ZXJuYWxfU3ltaW5mbywgRWxmMzJfSW50ZXJuYWxfU3ltaW5mbywKLQlhbmQgRWxmNjRfU3ltaW5mbyBkZWZpbml0aW9ucy4KLQotU3VuIEF1ZyAgOSAyMDoyNjo0OSBDRFQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGFybS5oOiAgQWRkIFNUX1RIVU1CIGRlZmluaXRpb25zLgotCi1XZWQgQXVnICA1IDE1OjUyOjM1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oOiBBZGQgRUxGIGhlYWRlciBmbGFncyB0byBzcGVjaWZ5IGNvbXBpbGUgdGltZSBvcHRpbnM6Ci0JRUZfSU5URVJXT1JLOiBOZXcgZmxhZy4KLQlFRl9BUENTXzI2OiBOZXcgZmxhZy4KLQlFRl9BUENTX0ZMT0FUOiBOZXcgZmxhZy4KLQlFRl9QSUM6IE5ldyBmbGFnLgotCi0xOTk4LTA3LTMxIDIxOjI4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgbWlzc2luZyBSSEZfKiBjb25zdGFudHMuCi0KLUZyaSBKdWwgMzEgMTA6MDE6NDAgMTk5OCBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGFybS5oOiBBZGQgUl9BUk1fVEhNX1BDOSByZWxvY2F0aW9uLgotCi0xOTk4LTA3LTMwIDE2OjI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IEFkZCBuZXcgRFRfKiBlbnRyaWVzIGFuZCB0aGVyZSBmbGFnIG1hY3JvcyBmcm9tIFNvbGFyaXMuCi0KLVR1ZSBKdWwgMjggMTg6MTQ6MDcgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaDogKFJfU1BBUkNfUkVWMzIpOiBBZGRlZCBmb3IgbGl0dGxlIGVuZGlhbiBkYXRhIGUuZy4gc3BhcmMgODZ4LgotCi1GcmkgSnVsIDI0IDExOjIyOjA2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oOiBBZGQgUl9NTjEwMzAwXzI0IHJlbG9jYXRpb24uCi0KLTE5OTgtMDctMjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZCBNSVBTNjQgcmVsb2NhdGlvbiBuYW1lcyBhbmQgdmFsdWVzLgotCi1XZWQgSnVsIDIyIDE5OjI5OjAwIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6IFJlbmFtZSByZWxvY2F0aW9ucy4KLQotMTk5OC0wNy0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHBwYy5oOiBEZWZpbmUgZW51bSBhcyBlbGZfcHBjX3JlbG9jX3R5cGUuCi0KLVdlZCBKdWwgMjIgMTY6MjI6MTEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MtbWFjcm9zLmg6IE5ldyBmaWxlLiAgUHJvdmlkZXMgcmVsb2NhdGlvbiBtYWNyb3M6Ci0JU1RBUlRfUkVMT0NfTlVNQkVSUywgUkVMT0NfTlVNQkVSLCBGQUtFX1JFTE9DLCBFTVBUWV9SRUxPQyBhbmQKLQlFTkRfUkVMT0NfTlVNQkVSUyB1c2VkIGJ5IG90aGVyIGVsZiBoZWFkZXIgZmlsZXMuCi0KLQkqIGFscGhhLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGFyYy5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBhcm0uaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogZDEwdi5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBkMzB2Lmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGhwcGEuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogaTM4Ni5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBtMzJyLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG02OGsuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogbWlwcy5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBtbjEwMjAwLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG1uMTAzMDAuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogcHBjLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIHNoLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIHNwYXJjLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIHY4NTAuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCi0xOTk4LTA3LTIyIDEzOjA3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbW4xMDMwMC5oOiBSZXdyaXRlIHJlbG9jYXRpb24gZGVmaW5pdGlvbiB1c2luZyBtYWNyb3MuCi0JKiBtaXBzLmg6IExpa2V3aXNlLgotCSogcHBjLmg6IExpa2V3aXNlLgotCSogYWxwaGEuaDogTGlrZXdpc2UuCi0JKiBhcm0uaDogTGlrZXdpc2UuCi0JKiBkMTB2Lmg6IExpa2V3aXNlLgotCSogZDMwdi5oOiBMaWtld2lzZS4KLQkqIG0zMnIuaDogTGlrZXdpc2UuCi0JKiBtNjhrLmg6IExpa2V3aXNlLgotCSogbW4xMDIwMC5oOiBMaWtld2lzZS4KLQkqIHNoLmg6IExpa2V3aXNlLgotCSogc3BhcmMuaDogTGlrZXdpc2UuCi0KLTE5OTgtMDctMjEgMTM6MDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBhcm0uaDogTmV3IGZpbGUuCi0JKiBkMTB2Lmg6IE5ldyBmaWxlLgotCSogZDMwdi5oOiBOZXcgZmlsZS4KLQkqIGkzODYuaDogTmV3IGZpbGUuCi0JKiBtNjhrLmg6IE5ldyBmaWxlLgotCSogbW4xMDIwMC5oOiBOZXcgZmlsZS4KLQkqIHNoLmg6IE5ldyBmaWxlLgotCi0JKiBtaXBzLmg6IEFkZCBSX01JUFNfKiBhbmQgU0hUX01JUFNfKiBlbnRyaWVzLgotCi0JKiBtbjEwMzAwLmg6IEFkZCBSX01OMTAzMDBfKiBlbnRyaWVzLgotCi0JKiBwcGMuaDogQWRkIFJfUFBDXyogZW50cmllcy4KLQotMTk5OC0wNy0yMCAwNzoxMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIE9ES18qLCBPRVhfKiwgT1BBRF8qLCBPSFdfKiwgYW5kIE9HUF8qIGNvbnN0YW50cy4KLQlEZWZpbmUgRWxmMzJfRXh0ZXJuYWxfTGliLgotCi0xOTk4LTA3LTE5IDE1OjI0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChQVF9NSVBTX09QVElPTlMpOiBOZXcgc3ltYm9sLgotCUFkZCBsb3RzIG9mIERUX01JUFNfKiBzeW1ib2xzLgotCi1GcmkgSnVuIDI2IDEwOjQ2OjM1IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oOiBOZXcgZmlsZS4KLQotVGh1IEp1biAxOCAxOToyNzo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fOTYwLCBFTV9WODAwLCBFTV9GUjIwLCBFTV9SSDMyLCBFTV9NTUEsCi0JRU1fT0xEX0FMUEhBKTogQWRkIHRoZXNlIGNvbnN0YW50cy4KLQotVGh1IEp1biAxMSAxNzo1OTowMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fNDg2LCBFTV9TMzcwKTogQWRkIHRoZXNlIGNvbnN0YW50cy4KLQotVHVlIEp1biAgOSAwOTozNToyOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQVJNKTogQWRkIHRoaXMgY29uc3RhbnQuCi0KLVdlZCBNYXkgIDYgMDk6NDU6MzAgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoRUZfTUlQU19NQUNILEVfTUlQU19NQUNIXyopOiBBZGRlZC4KLQotU2F0IEFwciAyNSAxODozNTowNiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS5oIChTVE9fQUxQSEFfTk9QViwgU1RPX0FMUEhBX1NURF9HUExPQUQpOiBOZXcuCi0KLVdlZCBBcHIgMTUgMTU6NDI6NDUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX1NQQVJDNjQpOiBNb3ZlIGFuZCByZW5hbWUgdG8gRU1fT0xEX1NQQVJDVjkuCi0JKEVNX1NQQVJDVjkpOiBOZXcuICBUaGlzIGlzIHRoZSBvZmZpY2lhbCBBQkkgbmFtZSBhbmQgbnVtYmVyLgotCi1TYXQgRmViIDI4IDE3OjA0OjQxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLmggKEVGX0FMUEhBXzMyQklULCBFRl9BTFBIQV9DQU5SRUxBWCk6IE5ldy4KLQotTW9uIERlYyAxNSAxNTowNzo0OSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtMzJyLmggKEVGX00zMlJfQVJDSCwgRV9NMzJSX0FSQ0gpOiBOZXcgZmxhZ3MgdG8KLQlzcGVjaWZ5IG1hY2hpbmUgYXJjaGl0ZWN0dXJlLgotCi1GcmkgRGVjICA1IDExOjIwOjA4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaDogTmV3IGNvbnN0YW50czogU0hOX1Y4NTBfU0NPTU1PTiwgU0hOX1Y4NTBfVENPTU1PTiwKLQlTSE5fVjg1MF9aQ09NTU9OLCBTSFRfVjg1MF9TQ09NTU9OLCBTSFRfVjg1MF9UQ09NTU9OLAotCVNIVF9WODUwX1pDT01NT04gdG8gaGFuZGxlIHY4NTAgY29tbW9uIHNlY3Rpb25zLgotCWVudW0gcmVsb2NfdHlwZSByZW5hbWVkIHRvIHY4NTBfcmVsb2NfdHlwZSB0byBhdm9pZCBuYW1lCi0JY29uZmxpY3QuCi0KLVRodSBPY3QgMjMgMTM6NTU6MjQgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoZW51bSBlbGZfc3BhcmNfcmVsb2NfdHlwZSk6IEFkZCBVQTY0ICYgVUExNi4KLQotVGh1IE9jdCAyMyAwMDo0MjowNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoRFRfU1BBUkNfUkVHSVNURVIpOiBOZXcgbWFjcm8uCi0JKERUX1NQQVJDX1BMVEZNVCk6IEluIHN1cHBvcnQgb2Ygb2xkIHNwYXJjNjQtbGludXggLnBsdHM7IHdpbGwKLQlnbyBhd2F5IHNvb24uCi0KLVR1ZSBTZXAgMzAgMTM6MjY6NTggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoRUZfU1BBUkNfSEFMX1IxLCBFRl9TUEFSQ19FWFRfTUFTSyk6IE5ldyBtYWNyb3MuCi0JKEVGX1NQQVJDVjlfe01NLFRTTyxQU08sUk1PfSk6IE5ldyBtYWNyb3MuCi0JKFNITl9CRUZPUkUsU0hOX0FGVEVSKTogTmV3IG1hY3Jvcy4KLQkoU0hGX0VYQ0xVREUsU0hGX09SREVSRUQpOiBOZXcgbWFjcm9zLgotCShTVFRfUkVHSVNURVIpOiBOZXcgbWFjcm8uCi0JKFJfU1BBUkNfR0xPQl9KTVApOiBEZWxldGVkLCBidXQgc2xvdCByZXNlcnZlZC4KLQkoUl9TUEFSQ197RElTUDY0LFBMVDY0LEhJWDIyLExPWDEwfSk6IE5ldyByZWxvY2F0aW9ucy4KLQkoUl9TUEFSQ197SDQ0LE00NCxMNDQsUkVHSVNURVJ9KTogTmV3IHJlbG9jYXRpb25zLgotCShFTEY2NF9SX1RZUEVfe0RBVEEsSUQsSU5GT30pOiBOZXcgbWFjcm9zLgotCi1XZWQgU2VwIDE3IDE2OjQxOjQyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaDogQWRkIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUIGFuZCBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULgotCi1UdWUgU2VwIDE2IDE0OjE2OjE3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAocmVsb2NfdHlwZSk6IEFkZCBSX1Y4NTBfVERBXzE2XzE2X09GRlNFVC4KLQotV2VkIFNlcCAgMyAxNToxMToxNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IENvcnJlY3QgdHlwbyBpbiBjb21tZW50LgotCi1XZWQgU2VwICAzIDExOjI1OjU3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAocmVsb2NfdHlwZSk6IFJlbW92ZSBSX1Y4NTBfMTZfUENSRUwuCi0KLVR1ZSBTZXAgIDIgMTc6NDE6MDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IFJlbW92ZSBtYWdpYyBudW1iZXIgZm9yIFY4NTBFLgotCSogY29tbW9uLmg6IFJlbW92ZSBtYWdpYyBudW1iZXIgZm9yIFY4NTBFQS4KLQkqIHY4NTAuaDogQWRkIG5ldyBmbGFncyBmb3IgZV9mbGFncyBmaWVsZCBpbiBlbGYgaGVhZGVyLgotCi1Nb24gQXVnIDI1IDE2OjA2OjQ3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfVjg1MEUpOiBiYWNrZW5kIG1hZ2ljIG51bWJlciBmb3Igdjg1MGUuCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX1Y4NTBFQSk6IGJhY2tlbmQgbWFnaWMgbnVtYmVyIGZvciB2ODUwZWEuCi0KLU1vbiBBdWcgMTggMTE6MDU6MjMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChyZWxvY190eXBlKTogQWRkIDE2IGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLgotCi1GcmkgQXVnIDE1IDA1OjEwOjA5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFyYy5oIChlbnVtIHJlbG9jKTogTW92ZSBoZXJlIGZyb20gZWxmMzItYXJjLmMuCi0KLUZyaSBBdWcgIDggMTc6MDU6MjkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJjLmg6IE5ldyBmaWxlLgotCSogY29tbW9uLmggKEVNX0NZR05VU19BUkMpOiBEZWZpbmUuCi0KLU1vbiBKdW4gMTYgMTQ6NDY6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZXJuYWxfRWhkcik6IENoYW5nZSBlX3Bob2ZmIGFuZCBlX3Nob2ZmIGZyb20KLQliZmRfc2lnbmVkX3ZtYSB0byBiZmRfc2l6ZV90eXBlLCBhcyB0aGV5IGFyZSBub3Qgc2lnbmVkLgotCi1XZWQgTWFyICA1IDE1OjM1OjI2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLmggKFNIRl9NMzJSX0NBTl9SRUxBWCk6IERlZmluZS4KLQotTW9uIEZlYiAyNCAxNzo0OTowMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4dGVybmFsLmg6IER1bXAgdGhlIDMyLzY0IGJpdCBzcGVjaWZpYyBmb3JtcyBvZiB0aGUgdmVyc2lvbgotCXN0cnVjdHVyZXMsIGFuZCBqdXN0IGRlZmluZSB0aGVtIGFzIHNpemUgaW5kZXBlbmRlbnQuCi0KLQkqIGNvbW1vbi5oIChWRVJTWU1fSElEREVOLCBWRVJTWU1fVkVSU0lPTik6IERlZmluZS4KLQotRnJpIEZlYiAyMSAxMzowMDozNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLmggKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX00zMlJfU0RBMTYuCi0JKFNITl9NMzJSX1NDT01NT04pOiBEZWZpbmUuCi0KLVdlZCBGZWIgMTkgMTU6MzU6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogZXh0ZXJuYWwuaCwgaW50ZXJuYWwuaCwgY29tbW9uLmg6IEFkZGVkIG5ldyBzdHJ1Y3R1cmVzIGFuZAotCWRlZmluaXRpb25zIGZvciBFTEYgdmVyc2lvbnMuCi0KLVR1ZSBGZWIgMTggMTc6NDA6MzYgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfRDMwVik6IERlZmluZS4KLQotTW9uIEphbiAyNyAxMTo1NDo0NCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci5oIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgUl9NMzJSX0hJMTZfW1NVXUxPLFJfTTMyUl9MTzE2LgotCi1GcmkgSmFuICAzIDExOjMyOjUxIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChWODUwX09USEVSX3tUREFfQllURSxFUlJPUn0pOiBOZXcgYml0cyBmb3IgdGhlIHN0X290aGVyCi0JZmllbGQuCi0JKFNITl9WODUwXyopOiBSZW1vdmUgdjg1MCBzcGVjaWZpYyBzZWN0aW9uIGluZGV4ZXMsIHdoaWNoIGFyZSBub3QKLQluZWVkZWQuCi0JKGVudW0gcmVsb2NfdHlwZSk6IE1vdmUgdGhlIHY4NTAgcmVsb2NhdGlvbnMgaGVyZSBmcm9tCi0JZWxmMzItdjg1MC5jCi0KLVRodSBKYW4gIDIgMTk6MzA6MjMgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB2ODUwLmg6IE5ldyBmaWxlLCBwcm92aWRlIFY4NTAgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCi0KLVR1ZSBEZWMgMzEgMTQ6NDQ6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRFRfQVVYSUxJQVJZKTogRGVmaW5lLgotCShEVF9GSUxURVIpOiBEZWZpbmUuCi0KLVdlZCBEZWMgIDQgMDU6MDM6MzcgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBkd2FyZjIuaDogVXBkYXRlLgotCi1UdWUgTm92IDI2IDEwOjQ0OjQ3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChTVE9fTUlQUzE2KTogRGVmaW5lLgotCi1UdWUgTm92IDEyIDE1OjQ1OjQyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2Lmg6IFJlbW92ZSBlbXB0eSBmaWxlLgotCi1UdWUgT2N0ICA4IDExOjMxOjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTX0FCSTIpOiBEZWZpbmUuCi0KLVRodSBPY3QgIDMgMTA6MDE6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb21tb24uaDogQnJlYWsgbW4xMHgwMCBzdXBwb3J0IGludG8gbW4xMDIwMCBhbmQgbW4xMDMwMC4KLQotV2VkIE9jdCAgMiAyMToyNjo0MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfTU4xMHgwMCk6IERlZmluZS4KLQotTW9uIFNlcCAyMyAwOToxODowNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci5oOiBOZXcgZmlsZS4KLQotRnJpIEF1ZyAzMCAxNzowNjoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9TSCk6IERlZmluZS4KLQotVHVlIEF1ZyAyMCAxNDo0Nzo1NCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19WODUwKTogRGVmaW5lLgotCi1Nb24gQXVnIDE5IDEwOjU5OjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfTTMyUik6IERlZmluZS4KLQotTW9uIEp1bCAyMiAxODo1OTo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoU0hUX01JUFNfSUZBQ0UsIFNIVF9NSVBTX0NPTlRFTlQpOiBEZWZpbmUuCi0JKFNIVF9NSVBTX1NZTUJPTF9MSUIpOiBEZWZpbmUuCi0JKFNIRl9NSVBTX01FUkdFLCBTSEZfTUlQU19BRERSMzIsIFNIRl9NSVBTX0FERFI2NCk6IERlZmluZS4KLQkoU0hGX01JUFNfTk9TVFJJUCwgU0hGX01JUFNfTE9DQUwsIFNIRl9NSVBTX05BTUVTKTogRGVmaW5lLgotCi1UaHUgSnVsIDE4IDE5OjEyOjE1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmg6IE5ldyBmaWxlLgotCi1KdWwgMTggMTM6MjA6MzkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfRDEwVik6IERlZmluZS4KLQkqIGQxMHYuaDogTmV3IGZpbGUuCi0KLUZyaSBKdW4gMjEgMTI6MzM6MjQgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLmg6IE5ldyBmaWxlLgotCSogY29tbW9uLmggKEVNX0FMUEhBKTogRGVmaW5lLgotCi1GcmkgTWF5IDMxIDE3OjI4OjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFbGZfRXh0ZXJuYWxfT3B0aW9ucywgRWxmX0ludGVybmFsX09wdGlvbnMpOiBEZWZpbmUuCi0JKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4pOiBEZWNsYXJlLgotCShiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX291dCk6IERlY2xhcmUuCi0JKE9ES18qKTogRGVmaW5lLgotCShFbGY2NF9FeHRlcm5hbF9SZWdJbmZvLCBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvKTogRGVmaW5lLgotCShiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9faW4pOiBEZWNsYXJlLgotCShiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9fb3V0KTogRGVjbGFyZS4KLQotVGh1IE1heSAzMCAxMjozNTo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoRV9NSVBTX0FSQ0hfNCk6IERlZmluZS4KLQotV2VkIE1heSAyOSAxNTozNTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwpOiBEZWZpbmUuCi0JKEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsKTogRGVmaW5lLgotCShFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEsIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSk6IERlZmluZS4KLQkoUlNTXyopOiBEZWZpbmUuCi0KLU1vbiBBcHIgMjIgMTg6MjY6MzAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoUl9TUEFSQ19bNTZdKTogQWx3YXlzIGRlZmluZS4KLQotTW9uIEZlYiAxOSAwMTo1NTo1NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoUl9TUEFSQ197UExUMzIsSElQTFQyMixMT1BMVDEwLFBDUExUMzIsUENQTFQyMiwKLQlQQ1BMVDEwLDUsNn0pOiBEb24ndCBkZWZpbmUgaWZkZWYgU1BBUkM2NF9PTERfUkVMT0NTLgotCi1UdWUgRmViICA2IDExOjMzOjU4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChlbnVtIHNwYXJjX2VsZl9yZWxvY190eXBlKTogRGVmaW5lLgotCi1XZWQgSmFuIDE3IDA5OjA5OjE2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oOiBEZWZpbmUgRU1fU1BBUkMzMlBMVVMuCi0JKiBzcGFyYy5oOiBOZXcgZmlsZS4KLQotVGh1IEphbiAxMSAxNjoyNzozNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy5oIChTSEZfRVhDTFVERSwgU0hUX09SREVSRUQpOiBOZXcgZmllbGRzIGZyb20gdGhlIGFiaS4KLQotVGh1IE5vdiAzMCAxNjo0NzoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApOiBBZGQgaW5jbHVkZXNfZmlsZWhkciBhbmQKLQlpbmNsdWRlc19waGRycyBmaWVsZHMuCi0KLVR1ZSBOb3YgMjggMTY6NTg6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKTogRGVmaW5lLgotCi1UdWUgT2N0IDMxIDE1OjE5OjM2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCwgZHdhcmYuaCwgZXh0ZXJuYWwuaCwgaHBwYS5oLCBpbnRlcm5hbC5oLAotCW1pcHMuaCwgcHBjLmg6ICBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQotVGh1IFNlcCAyMSAxMzo1MTo1OCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy5oIChFRl9QUENfUkVMT0NBVEFCTEVfTElCKTogQWRkIG5ldyBmbGFnIGJpdC4KLQotRnJpIFNlcCAgMSAxNTozMjoxNyAxOTk1ICBLYXp1bW90byBLb2ppbWEgIDxra29qaW1hQGluZm8ua2FuYWdhd2EtdS5hYy5qcD4KLQotCSogbWlwcy5oOiBBZGQgc29tZSBkZWZpbml0aW9ucyB1c2VkIG9uIElyaXggNS4KLQotVHVlIEp1biAyMCAxMDoxODoyOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oIChDUFVfUEFfUklTQzFfMCk6IFByb3RlY3QgZnJvbSByZWRlZmluaXRpb25zLgotCShDUFVfUEFfUklTQzFfMSk6IExpa2V3aXNlLgotCi1XZWQgTWFyICA4IDE4OjE0OjM3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLmg6IE5ldyBmaWxlIGZvciBQb3dlclBDIHN1cHBvcnQuCi0KLVR1ZSBGZWIgMTQgMTM6NTk6MTMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fUFBDKTogVXNlIG9mZmljYWwgdmFsdWUgb2YgMjAsIG5vdCAxNy4KLQkoRU1fUFBDX09MRCk6IERlZmluZSB0aGlzIHRvIGJlIHRoZSBvbGQgdmFsdWUgb2YgRU1fUFBDLgotCi1UdWUgSmFuIDI0IDA5OjQwOjU5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX1BQQyk6IE5ldyBtYWNybywgUG93ZXJQQyBtYWNoaW5lIGlkLgotCi1UdWUgSmFuIDE3IDEwOjUxOjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChTSFRfTUlQU19NU1lNLCBTSFRfTUlQU19EV0FSRiwgU0hUX01JUFNfRVZFTlRTKTogRGVmaW5lLgotCi1Nb24gT2N0IDE3IDEzOjQzOjU5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoRWxmX0ludGVybmFsX1NoZHIpOiBSZW1vdmUgcmF3ZGF0YSBhbmQgc2l6ZSBmaWVsZHMuCi0JQWRkIGJmZF9zZWN0aW9uIGZpZWxkLgotCi1UdWUgTWF5IDI0IDE2OjExOjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChFbGYzMl9FeHRlcm5hbF9ncHRhYik6IERlZmluZS4KLQotTW9uIE1heSAxNiAxMzoyMjowNCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29tbW9uLmggKEVNX0hQUEEpOiBEZWxldGUuCi0JKEVNX1BBUklTQyk6IEFkZC4KLQkqIGhwcGEuaDogTmV3IGZpbGUuCi0KLU1vbiBNYXkgIDkgMTM6Mjc6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoU0hOX0xPUkVTRVJWRSk6IFJlbmFtZSBmcm9tIFNITl9MT1JFU0VSVi4KLQkoRUxGMzJfUl9UWVBFLCBFTEYzMl9SX0lORk8pOiBEb24ndCByZWx5IG9uIHNpemUgb2YgdW5zaWduZWQgY2hhci4KLQkoRUxGNjRfUl9UWVBFKTogRG9uJ3QgcmVseSBvbiBzaXplIG9mIHVuc2lnbmVkIGxvbmcuCi0KLU1vbiBBcHIgMjUgMTU6NTM6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZXJuYWxfU2hkcik6IFVzZSBQVFIsIG5vdCB2b2lkICouCi0KLUZyaSBNYXIgMTEgMDA6MzQ6NTkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBtaXBzLmggKFNITl9NSVBTX1RFWFQsIFNITl9NSVBTX0RBVEEpOiAgRGVmaW5lLgotCi1TYXQgTWFyICA1IDE0OjA4OjU0IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaW50ZXJuYWwuaDogIFJlbW92ZSBFbGYzMl8qLCBFbGY2NF8qIHR5cGVkZWZzLiAgVGhlc2UgbmFtZXMKLQljYXVzZSBjb25mbGljdHMgd2l0aCBzeXN0ZW0gaGVhZGVycywgZS5nLiBsaW5rLmggaW4gZ2RiL3NvbGliLmMuCi0JQ29tYmluZSAzMi0gYW5kIDY0LWJpdCB2ZXJzaW9ucyBvZiAqX0ludGVybmFsX0R5bi4KLQkqIGNvbW1vbi5oOiAgUmVwbGFjZSB1c2VzIG9mIEVsZjY0X1dvcmQsIEVsZjY0X1h3b3JkIHR5cGVkZWZzCi0JYnkgdGhlaXIgZXhwYW5zaW9uLgotCSogbWlwcy5oOiAgUmVwbGFjZSB1c2VzIG9mIEVsZjMyX1dvcmQsIEVsZjMyX1N3b3JkLCBFbGYzMl9BZGRyCi0JdHlwZWRlZnMgYnkgdGhlaXIgZXhwYW5zaW9uLiBBZGQgRFRfTUlQU19STERfTUFQIGRlZmluaXRpb24uCi0KLUZyaSBGZWIgMTggMTA6Mzk6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX1BPV0VSUEMpOiBEZWZpbmUuICBUaGlzIG1heSBiZSB0ZW1wb3JhcnksCi0JZGVwZW5kaW5nIHVwb24gaG93IHF1aWNrbHkgSSBjYW4gZmluZCBhIHJlYWwgUG93ZXJQQyBBQkkuCi0KLU1vbiBGZWIgIDcgMDg6Mjc6MTMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENoYW5nZSBIT1NUXzY0X0JJVCB0byBCRkRfSE9TVF82NF9CSVQuCi0KLVdlZCBGZWIgIDIgMTQ6MTI6MTggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oOiBBZGQgY29tbWVudHMgcmVnYXJkaW5nIHZhbHVlIG9mIEVNX0hQUEEgYW5kIGhvdyB0bwotCXBpY2sgYW4gdW5vZmZpY2lhbCB2YWx1ZS4KLQotV2VkIE5vdiAxNyAxNzoxNDoyNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoU0hUX01JUFNfT1BUSU9OUyk6IERlZmluZS4KLQotTW9uIE5vdiAgOCAxNzo1NzowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogQWRkZWQgc29tZSBtb3JlIE1JUFMgQUJJIG1hY3JvIGRlZmluaXRpb25zLgotCi1XZWQgTm92ICAzIDIyOjA3OjE3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmggKEVNX01JUFNfUlM0X0JFKTogTmV3IG1hY3JvLgotCi1UdWUgT2N0IDEyIDA3OjI4OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBOZXcgZmlsZS4gIE1JUFMgQUJJIHNwZWNpZmljIGluZm9ybWF0aW9uLgotCi1Nb24gSnVuIDIxIDEzOjEzOjQzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBDb21iaW5lZCAzMi0gYW5kIDY0LWJpdCB2ZXJzaW9ucyBvZiBhbGwgc3RydWN0dXJlcwotCWV4Y2VwdCAqX0ludGVybmFsX0R5bi4gIFRoaXMgd2lsbCBzaW1wbHkgdGhlIGFzc2VtYmxlciBpbnRlcmZhY2UsCi0JYW5kIHNvbWUgYmZkIGNvZGUuCi0KLVR1ZSBNYXkgMjUgMDI6MDA6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBleHRlcm5hbC5oLCBpbnRlcm5hbC5oLCBjb21tb24uaDogQWRkZWQgNjQtYml0IHZlcnNpb25zIG9mIHNvbWUKLQlzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MuICBSZW5hbWVkIG9sZCB2ZXJzaW9ucyB0byBwdXQgIjMyIiBpbiB0aGUKLQluYW1lLiAgU29tZSBhcmUgdW5jaGFuZ2VkLgotCi1UaHUgQXByIDI5IDEyOjEyOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoRU1fSFBQQSwgTlRfVkVSU0lPTiwgU1ROX1VOREVGLCBEVF8qKTogTmV3IG1hY3Jvcy4KLQkqIGV4dGVybmFsLmggKEVsZl9FeHRlcm5hbF9EeW4pOiBOZXcgdHlwZS4KLQotCSogaW50ZXJuYWwuaCAoRWxmX0ludGVucmFsX1NoZHIpOiBOZXcgZmllbGQgYHNpemUnLgotCShFbGZfSW50ZXJuYWxfRHluKTogTmV3IHR5cGUuCi0KLVR1ZSBBcHIgMjAgMTY6MDM6NDUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGR3YXJmLmggKExBTkdfQ0hJTEwpOiAgQ2hhbmdlIHZhbHVlIHRvIG9uZSByYW5kb21seSBwaWNrZWQgaW4KLQl0aGUgdXNlciBkZWZpbmVkIHJhbmdlLCB0byByZWR1Y2UgcHJvYmFiaWxpdHkgb2YgY29sbGlzaW9ucy4KLQotU3VuIE5vdiAxNSAwOTozNDowMiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaCAoQVRfc3JjX2Nvb3Jkcyk6ICBXaGl0ZXNwYWNlIGNoYW5nZSBvbmx5LgotCSogZHdhcmYuaCAoQVRfYm9keV9iZWdpbiwgQVRfYm9keV9lbmQsIExBTkdfTU9EVUxBMik6Ci0JQWRkIGZyb20gbGF0ZXN0IGdjYy4KLQkqIGR3YXJmLmggKExBTkdfQ0hJTEwpOiAgQWRkIGFzIEdOVSBleHRlbnNpb24uCi0KLVNhdCBBdWcgIDEgMTM6NDY6NTMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGR3YXJmLmg6ICBSZXBsYWNlIHdpdGggY3VycmVudCB2ZXJzaW9uIGZyb20gZ2NjIGRpc3RyaWJ1dGlvbi4KLQotRnJpIEp1biAxOSAxOTowNTowOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogIEFkZCByZWFsIHN0cnVjdCB0YWdzIHRvIGFsbCB0aGUgVHlwZV9EZWZzLCBzbyB0aGV5Ci0JY2FuIGJlIHVzZWQgaW4gcHJvdG90eXBlcyB3aGVyZSB0aGUgVHlwZV9EZWZzIGFyZSBub3Qga25vd24uCi0KLUZyaSBBcHIgIDMgMjA6NTg6NTggMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmg6IGFkZGVkIEVMRl9SX3tTWU0sVFlQRSxJTkZPfSBmb3IgaGFuZGxpbmcgcmVsb2NhdGlvbgotCWluZm8KLQlhZGRlZCBFTV9NSVBTLCBhbmQgY29ycmVjdGVkIHZhbHVlIG9mIEVNXzg2MCBiYXNlZCBvbiBTeXN0ZW0gViBBQkkKLQltYW51YWwuCi0KLQkqIGV4dGVybmFsLmg6IGFkZGVkIEVsZl9FeHRlcm5hbF97UmVsLFJlbGF9LgotCi0JKiBpbnRlcm5hbC5oOiBhZGRlZCBFbGZfSW50ZXJuYWxfe1JlbCxSZWxhfS4KLQlhZGRlZCByYXdkYXRhIHRvIEVsZl9JbnRlcm5hbF9TaGRyLgotCi1TYXQgTm92IDMwIDIwOjQzOjU5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCwgZHdhcmYuaCwgZXh0ZXJuYWwuaCwgaW50ZXJuYWwuaCwgQ2hhbmdlTG9nOyBtb3ZlZCBmcm9tCi0JLi4vZWxmLTxmb28+Ci0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FscGhhLmggYi9pbmNsdWRlL2VsZi9hbHBoYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWU5ZDVlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2FscGhhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyogQUxQSEEgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQnkgRXJpYyBZb3VuZ2RhbGUsIDxlcmljQGFpYi5jb20+LiAgTm8gcHJvY2Vzc29yIHN1cHBsZW1lbnQgYXZhaWxhYmxlCi0gICBmb3IgdGhpcyBwbGF0Zm9ybS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEFMUEhBIEVMRiBBQkkuICBOb3RlCi0gICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KLQotI2lmbmRlZiBfRUxGX0FMUEhBX0gKLSNkZWZpbmUgX0VMRl9BTFBIQV9ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIEFsbCBhZGRyZXNzZXMgbXVzdCBiZSBiZWxvdyAyR0IuICAqLwotI2RlZmluZSBFRl9BTFBIQV8zMkJJVAkJMHgwMDAwMDAwMQotCi0vKiBBbGwgcmVsb2NhdGlvbnMgbmVlZGVkIGZvciByZWxheGF0aW9uIHdpdGggY29kZSBtb3ZlbWVudCBhcmUgcHJlc2VudC4gICovCi0jZGVmaW5lIEVGX0FMUEhBX0NBTlJFTEFYCTB4MDAwMDAwMDIKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gZmxhZ3MuICAqLwotCi0vKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgZ2xvYmFsIGRhdGEgYXJlYS4gICovCi0jZGVmaW5lIFNIRl9BTFBIQV9HUFJFTAkJMHgxMDAwMDAwMAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHNvbWUgc29ydCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGUgZXhhY3QKLSAgIGZvcm1hdCBpcyB1bnNwZWNpZmllZC4gIEl0J3MgcHJvYmFibHkgRUNPRkYgc3ltYm9scy4gICovCi0jZGVmaW5lIFNIVF9BTFBIQV9ERUJVRwkJMHg3MDAwMDAwMQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHJlZ2lzdGVyIHVzYWdlIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX0FMUEhBX1JFR0lORk8JMHg3MDAwMDAwMgotCi0vKiBBIHNlY3Rpb24gb2YgdHlwZSBTSFRfTUlQU19SRUdJTkZPIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKLSAgIHN0cnVjdHVyZS4gICovCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBNYXNrIG9mIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfZ3BybWFzazsKLSAgLyogTWFzayBvZiBjby1wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBsb25nIHJpX2Nwcm1hc2tbNF07Ci0gIC8qIEdQIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgbG9uZyByaV9ncF92YWx1ZTsKLX0gRWxmNjRfUmVnSW5mbzsKLQotLyogU3BlY2lhbCB2YWx1ZXMgZm9yIHRoZSBzdF9vdGhlciBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotI2RlZmluZSBTVE9fQUxQSEFfTk9QVgkJMHg4MAotI2RlZmluZSBTVE9fQUxQSEFfU1REX0dQTE9BRAkweDg4Ci0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIEFscGhhIHJlbG9jcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfYWxwaGFfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX05PTkUsIDApCS8qIE5vIHJlbG9jICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9SRUZMT05HLCAxKQkvKiBEaXJlY3QgMzIgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9SRUZRVUFELCAyKQkvKiBEaXJlY3QgNjQgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFJFTDMyLCAzKQkvKiBHUCByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0xJVEVSQUwsIDQpCS8qIEdQIHJlbGF0aXZlIDE2IGJpdCB3L29wdGltaXphdGlvbiAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfTElUVVNFLCA1KQkvKiBPcHRpbWl6YXRpb24gaGludCBmb3IgTElURVJBTCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR1BESVNQLCA2KQkvKiBBZGQgZGlzcGxhY2VtZW50IHRvIEdQICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9CUkFERFIsIDcpCS8qIFBDKzQgcmVsYXRpdmUgMjMgYml0IHNoaWZ0ZWQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0hJTlQsIDgpCS8qIFBDKzQgcmVsYXRpdmUgMTYgYml0IHNoaWZ0ZWQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1NSRUwxNiwgOSkJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9TUkVMMzIsIDEwKQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1NSRUw2NCwgMTEpCS8qIFBDIHJlbGF0aXZlIDY0IGJpdCAqLwotCi0vKiBJbmhlcml0ZWQgdGhlc2UgZnJvbSBFQ09GRiwgYnV0IHRoZXkgYXJlIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsCi0gICBhbmQgYXJlIGRlcHJlY2lhdGVkLiAgQW5kIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgQkZELCBidHcuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfT1BfUFVTSCwgMTIpCS8qIE9QIHN0YWNrIHB1c2ggKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX09QX1NUT1JFLCAxMykJLyogT1Agc3RhY2sgcG9wIGFuZCBzdG9yZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfT1BfUFNVQiwgMTQpCS8qIE9QIHN0YWNrIHN1YnRyYWN0ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9PUF9QUlNISUZULCAxNSkJLyogT1Agc3RhY2sgcmlnaHQgc2hpZnQgKi8KLQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR1BWQUxVRSwgMTYpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFJFTEhJR0gsIDE3KQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR1BSRUxMT1csIDE4KQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSU1NRURfR1BfMTYsIDE5KQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSU1NRURfR1BfSEkzMiwgMjApCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9TQ05fSEkzMiwgMjEpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9CUl9ISTMyLCAyMikKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0lNTUVEX0xPMzIsIDIzKQotCi0vKiBUaGVzZSByZWxvY2F0aW9ucyBhcmUgc3BlY2lmaWMgdG8gc2hhcmVkIGxpYnJhcmllcy4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9DT1BZLCAyNCkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR0xPQl9EQVQsIDI1KQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9KTVBfU0xPVCwgMjYpCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1JFTEFUSVZFLCAyNykJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotCi0gIEVNUFRZX1JFTE9DICAoUl9BTFBIQV9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYgLyogX0VMRl9BTFBIQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9hcmMuaCBiL2luY2x1ZGUvZWxmL2FyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzRiNTVmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2FyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQVJDIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zLCAoZGplQGN5Z251cy5jb20pCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBBUkMgRUxGIEFCSS4gICovCi0KLSNpZm5kZWYgX0VMRl9BUkNfSAotI2RlZmluZSBfRUxGX0FSQ19ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9hcmNfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSQ19OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDXzMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDX0IyNiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX0FSQ19CMjJfUENSRUwsIDMpCi0gIEVNUFRZX1JFTE9DICAoUl9BUkNfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotLyogRm91ciBiaXQgQVJDIG1hY2hpbmUgdHlwZSBmaWVsZC4gICovCi0jZGVmaW5lIEVGX0FSQ19NQUNICQkweDAwMDAwMDBmCi0KLS8qIFZhcmlvdXMgQ1BVIHR5cGVzLiAgKi8KLSNkZWZpbmUgRV9BUkNfTUFDSF9CQVNFCQkweDAwMDAwMDAwCi0jZGVmaW5lIEVfQVJDX01BQ0hfVU5VU0VEMQkweDAwMDAwMDAxCi0jZGVmaW5lIEVfQVJDX01BQ0hfVU5VU0VEMgkweDAwMDAwMDAyCi0jZGVmaW5lIEVfQVJDX01BQ0hfVU5VU0VENAkweDAwMDAwMDAzCi0KLS8qIExlYXZlIGJpdHMgMHhmMCBhbG9uZSBpbiBjYXNlIHdlIGV2ZXIgaGF2ZSBtb3JlIHRoYW4gMTYgY3B1IHR5cGVzLgotICAgSGlnaGx5IHVubGlrZWx5LCBidXQgd2hhdCB0aGUgaGVjay4gICovCi0KLS8qIEZpbGUgY29udGFpbnMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4gICovCi0jZGVmaW5lIEVGX0FSQ19QSUMJCTB4MDAwMDAxMDAKLQotI2VuZGlmIC8qIF9FTEZfQVJDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FybS1vYWJpLmggYi9pbmNsdWRlL2VsZi9hcm0tb2FiaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTA5ODQyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2FybS1vYWJpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKiBBUk0gRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfQVJNX0gKLSNkZWZpbmUgX0VMRl9BUk1fSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotI2RlZmluZSBFRl9BUk1fUkVMRVhFQyAgICAgMHgwMQotI2RlZmluZSBFRl9BUk1fSEFTRU5UUlkgICAgMHgwMgotI2RlZmluZSBFRl9JTlRFUldPUksgICAgICAgMHgwNAotI2RlZmluZSBFRl9BUENTXzI2ICAgICAgICAgMHgwOAotI2RlZmluZSBFRl9BUENTX0ZMT0FUICAgICAgMHgxMAotI2RlZmluZSBFRl9QSUMgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBFRl9BTElHTjgJICAgMHg0MAkJLyogOC1iaXQgc3RydWN0dXJlIGFsaWdubWVudCBpcyBpbiB1c2UgKi8KLSNkZWZpbmUgRUZfTkVXX0FCSSAgICAgICAgIDB4ODAKLSNkZWZpbmUgRUZfT0xEX0FCSSAgICAgICAgIDB4MTAwCi0KLS8qIExvY2FsIGFsaWFzZXMgZm9yIHNvbWUgZmxhZ3MgdG8gbWF0Y2ggbmFtZXMgdXNlZCBieSBDT0ZGIHBvcnQuICAqLwotI2RlZmluZSBGX0lOVEVSV09SSwkgICBFRl9JTlRFUldPUksKLSNkZWZpbmUgRl9BUENTMjYJICAgRUZfQVBDU18yNgotI2RlZmluZSBGX0FQQ1NfRkxPQVQJICAgRUZfQVBDU19GTE9BVAotI2RlZmluZSBGX1BJQyAgICAgICAgICAgICAgRUZfUElDCi0KLS8qIEFkZGl0aW9uYWwgc3ltYm9sIHR5cGVzIGZvciBUaHVtYiAqLwotI2RlZmluZSBTVFRfQVJNX1RGVU5DICAgICAweGQKLQotLyogQVJNLXNwZWNpZmljIHZhbHVlcyBmb3Igc2hfZmxhZ3MgKi8KLSNkZWZpbmUgU0hGX0VOVFJZU0VDVCAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWN0aW9uIGNvbnRhaW5zIGFuIGVudHJ5IHBvaW50ICovCi0jZGVmaW5lIFNIRl9DT01ERUYgICAgICAgICAweDgwMDAwMDAwICAgLyogU2VjdGlvbiBtYXkgYmUgbXVsdGlwbHkgZGVmaW5lZCBpbiB0aGUgaW5wdXQgdG8gYSBsaW5rIHN0ZXAgKi8KLQotLyogQVJNLXNwZWNpZmljIHByb2dyYW0gaGVhZGVyIGZsYWdzICovCi0jZGVmaW5lIFBGX0FSTV9TQiAgICAgICAgICAweDEwMDAwMDAwICAgLyogU2VnbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gYWRkcmVzc2VkIGJ5IHRoZSBzdGF0aWMgYmFzZSAqLwotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9hcm1fcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9OT05FLCAgICAgICAgIDApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUEMyNCwgICAgICAgICAxKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzMyLCAgICAgICAgMikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SRUwzMiwgICAgICAgIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTOCwgICAgICAgICA0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzE2LCAgICAgICAgNSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlMxMiwgICAgICAgIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX0FCUzUsICAgICA3KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9QQzIyLCAgICAgOCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9TQlJFTDMyLCAgICAgIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQU1QX1ZDQUxMOSwgIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9QQzExLCAgICAxMSkgICAgICAgLyogY3lnbnVzIGV4dGVuc2lvbiB0byBhYmk6IHRodW1iIHVuY29uZGl0aW9uYWwgYnJhbmNoICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDOSwgICAgIDEyKSAgICAgICAvKiBjeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogdGh1bWIgY29uZGl0aW9uYWwgYnJhbmNoICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR05VX1ZUSU5IRVJJVCwgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR05VX1ZURU5UUlksIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0NPUFksICAgICAgICAyMCkgICAgICAgLyogY29weSBzeW1ib2wgYXQgcnVudGltZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dMT0JfREFULCAgICAyMSkgICAgICAgLyogY3JlYXRlIEdPVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0pVTVBfU0xPVCwgICAyMikgICAgICAgLyogY3JlYXRlIFBMVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JFTEFUSVZFLCAgICAyMykgICAgICAgLyogYWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVE9GRiwgICAgICAyNCkgICAgICAgLyogMzIgYml0IG9mZnNldCB0byBHT1QgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1RQQywgICAgICAgMjUpICAgICAgIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gR09UICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR09UMzIsICAgICAgIDI2KSAgICAgICAvKiAzMiBiaXQgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUExUMzIsICAgICAgIDI3KSAgICAgICAvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KLSAgRkFLRV9SRUxPQyAgIChGSVJTVF9JTlZBTElEX1JFTE9DLCAyOCkKLSAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MsICAyNDkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlNCUkVMMzIsICAgMjUwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9SUEMyMiwgIDI1MSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SUkVMMzIsICAgICAyNTIpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkFCUzMyLCAgICAgMjUzKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JQQzI0LCAgICAgIDI1NCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQkFTRSwgICAgICAyNTUpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FybS5oIGIvaW5jbHVkZS9lbGYvYXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzE2OTguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKiBBUk0gRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfQVJNX0gKLSNkZWZpbmUgX0VMRl9BUk1fSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotI2RlZmluZSBFRl9BUk1fUkVMRVhFQyAgICAgMHgwMQotI2RlZmluZSBFRl9BUk1fSEFTRU5UUlkgICAgMHgwMgotI2RlZmluZSBFRl9JTlRFUldPUksgICAgICAgMHgwNAotI2RlZmluZSBFRl9BUENTXzI2ICAgICAgICAgMHgwOAotI2RlZmluZSBFRl9BUENTX0ZMT0FUICAgICAgMHgxMAotI2RlZmluZSBFRl9QSUMgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBFRl9BTElHTjgJICAgMHg0MAkJLyogOC1iaXQgc3RydWN0dXJlIGFsaWdubWVudCBpcyBpbiB1c2UgKi8KLSNkZWZpbmUgRUZfTkVXX0FCSSAgICAgICAgIDB4ODAKLSNkZWZpbmUgRUZfT0xEX0FCSSAgICAgICAgIDB4MTAwCi0jZGVmaW5lIEVGX1NPRlRfRkxPQVQgICAgICAweDIwMAotCi0vKiBMb2NhbCBhbGlhc2VzIGZvciBzb21lIGZsYWdzIHRvIG1hdGNoIG5hbWVzIHVzZWQgYnkgQ09GRiBwb3J0LiAgKi8KLSNkZWZpbmUgRl9JTlRFUldPUksJICAgRUZfSU5URVJXT1JLCi0jZGVmaW5lIEZfQVBDUzI2CSAgIEVGX0FQQ1NfMjYKLSNkZWZpbmUgRl9BUENTX0ZMT0FUCSAgIEVGX0FQQ1NfRkxPQVQKLSNkZWZpbmUgRl9QSUMgICAgICAgICAgICAgIEVGX1BJQwotI2RlZmluZSBGX1NPRlRfRkxPQVQJICAgRUZfU09GVF9GTE9BVAotCi0vKiBBZGRpdGlvbmFsIHN5bWJvbCB0eXBlcyBmb3IgVGh1bWIgKi8KLSNkZWZpbmUgU1RUX0FSTV9URlVOQyAgICAgMHhkCi0KLS8qIEFSTS1zcGVjaWZpYyB2YWx1ZXMgZm9yIHNoX2ZsYWdzICovCi0jZGVmaW5lIFNIRl9FTlRSWVNFQ1QgICAgICAweDEwMDAwMDAwICAgLyogU2VjdGlvbiBjb250YWlucyBhbiBlbnRyeSBwb2ludCAqLwotI2RlZmluZSBTSEZfQ09NREVGICAgICAgICAgMHg4MDAwMDAwMCAgIC8qIFNlY3Rpb24gbWF5IGJlIG11bHRpcGx5IGRlZmluZWQgaW4gdGhlIGlucHV0IHRvIGEgbGluayBzdGVwICovCi0KLS8qIEFSTS1zcGVjaWZpYyBwcm9ncmFtIGhlYWRlciBmbGFncyAqLwotI2RlZmluZSBQRl9BUk1fU0IgICAgICAgICAgMHgxMDAwMDAwMCAgIC8qIFNlZ21lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIGFkZHJlc3NlZCBieSB0aGUgc3RhdGljIGJhc2UgKi8KLQotLyogUmVsb2NhdGlvbiB0eXBlcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfYXJtX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fTk9ORSwgICAgICAgICAwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1BDMjQsICAgICAgICAgMSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlMzMiwgICAgICAgIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkVMMzIsICAgICAgICAzKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1BDMTMsICAgICAgICAgNCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlMxNiwgICAgICAgIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMTIsICAgICAgICA2KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9BQlM1LCAgICAgNykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlM4LCAgICAgICAgIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fU0JSRUwzMiwgICAgICA5KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9QQzIyLCAgICAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEM4LCAgICAgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQU1QX1ZDQUxMOSwgIDEyKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1NXSTI0LCAgICAgICAxMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fU1dJOCwgICAgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fWFBDMjUsICAgICAgIDE1KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9YUEMyMiwgICAxNikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9DT1BZLCAgICAgICAgMjApICAgICAgIC8qIGNvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTE9CX0RBVCwgICAgMjEpICAgICAgIC8qIGNyZWF0ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9KVU1QX1NMT1QsICAgMjIpICAgICAgIC8qIGNyZWF0ZSBQTFQgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SRUxBVElWRSwgICAgMjMpICAgICAgIC8qIGFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1RPRkYsICAgICAgMjQpICAgICAgIC8qIDMyIGJpdCBvZmZzZXQgdG8gR09UICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR09UUEMsICAgICAgIDI1KSAgICAgICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIEdPVCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVDMyLCAgICAgICAyNikgICAgICAgLyogMzIgYml0IEdPVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1BMVDMyLCAgICAgICAyNykgICAgICAgLyogMzIgYml0IFBMVCBhZGRyZXNzICovCi0gIEZBS0VfUkVMT0MgICAoRklSU1RfSU5WQUxJRF9SRUxPQzEsIDI4KQotICBGQUtFX1JFTE9DICAgKExBU1RfSU5WQUxJRF9SRUxPQzEsICA5OSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRFTlRSWSwgMTAwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dOVV9WVElOSEVSSVQsIDEwMSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEMxMSwgICAgMTAyKSAgICAgICAvKiBjeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogdGh1bWIgdW5jb25kaXRpb25hbCBicmFuY2ggKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEM5LCAgICAgMTAzKSAgICAgICAvKiBjeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogdGh1bWIgY29uZGl0aW9uYWwgYnJhbmNoICovCi0gIEZBS0VfUkVMT0MgICAoRklSU1RfSU5WQUxJRF9SRUxPQzIsIDEwNCkKLSAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MyLCAgMjQ4KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JYUEMyNSwgICAgIDI0OSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SU0JSRUwzMiwgICAyNTApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1JQQzIyLCAgMjUxKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JSRUwzMiwgICAgIDI1MikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQUJTMzIsICAgICAyNTMpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlBDMjQsICAgICAgMjU0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JCQVNFLCAgICAgIDI1NSkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvY29tbW9uLmggYi9pbmNsdWRlL2VsZi9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFiNjI3NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi0vKiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCi0gICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCi0gICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVMRiBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLgotICAgRm9yIGV4YW1wbGUsIEVMRk1BRzAgaXMgdGhlIGJ5dGUgMHg3RiBpbiBib3RoIHRoZSBpbnRlcm5hbCAoaW4tbWVtb3J5KQotICAgYW5kIGV4dGVybmFsIChpbi1maWxlKSByZXByZXNlbnRhdGlvbnMuICovCi0KLSNpZm5kZWYgX0VMRl9DT01NT05fSAotI2RlZmluZSBfRUxGX0NPTU1PTl9ICi0KLS8qIEZpZWxkcyBpbiBlX2lkZW50W10gKi8KLQotI2RlZmluZSBFSV9NQUcwCQkwCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAwIGluZGV4ICovCi0jZGVmaW5lIEVMRk1BRzAJCTB4N0YJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMCAqLwotCi0jZGVmaW5lIEVJX01BRzEJCTEJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDEgaW5kZXggKi8KLSNkZWZpbmUgRUxGTUFHMQkJJ0UnCS8qIE1hZ2ljIG51bWJlciBieXRlIDEgKi8KLQotI2RlZmluZSBFSV9NQUcyCQkyCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAyIGluZGV4ICovCi0jZGVmaW5lIEVMRk1BRzIJCSdMJwkvKiBNYWdpYyBudW1iZXIgYnl0ZSAyICovCi0KLSNkZWZpbmUgRUlfTUFHMwkJMwkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMyBpbmRleCAqLwotI2RlZmluZSBFTEZNQUczCQknRicJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMyAqLwotCi0jZGVmaW5lIEVJX0NMQVNTCTQJLyogRmlsZSBjbGFzcyAqLwotI2RlZmluZSBFTEZDTEFTU05PTkUJMAkvKiBJbnZhbGlkIGNsYXNzICovCi0jZGVmaW5lIEVMRkNMQVNTMzIJMQkvKiAzMi1iaXQgb2JqZWN0cyAqLwotI2RlZmluZSBFTEZDTEFTUzY0CTIJLyogNjQtYml0IG9iamVjdHMgKi8KLQotI2RlZmluZSBFSV9EQVRBCQk1CS8qIERhdGEgZW5jb2RpbmcgKi8KLSNkZWZpbmUgRUxGREFUQU5PTkUJMAkvKiBJbnZhbGlkIGRhdGEgZW5jb2RpbmcgKi8KLSNkZWZpbmUgRUxGREFUQTJMU0IJMQkvKiAyJ3MgY29tcGxlbWVudCwgbGl0dGxlIGVuZGlhbiAqLwotI2RlZmluZSBFTEZEQVRBMk1TQgkyCS8qIDIncyBjb21wbGVtZW50LCBiaWcgZW5kaWFuICovCi0KLSNkZWZpbmUgRUlfVkVSU0lPTgk2CS8qIEZpbGUgdmVyc2lvbiAqLwotCi0jZGVmaW5lIEVJX09TQUJJICAgICAgICA3ICAgICAgIC8qIE9wZXJhdGluZyBTeXN0ZW0vQUJJIGluZGljYXRpb24gKi8KLSNkZWZpbmUgRUxGT1NBQklfU1lTViAgIDAgICAgICAgLyogVU5JWCBTeXN0ZW0gViBBQkkgKi8KLSNkZWZpbmUgRUxGT1NBQklfSFBVWCAgIDEgICAgICAgLyogSFAtVVggb3BlcmF0aW5nIHN5c3RlbSAqLwotI2RlZmluZSBFTEZPU0FCSV9TVEFOREFMT05FIDI1NSAvKiBTdGFuZGFsb25lIChlbWJlZGRlZCkgYXBwbGljYXRpb24gKi8KLSNkZWZpbmUgRUxGT1NBQklfQVJNICAgOTcJCS8qIEFSTSAqLwotCi0jZGVmaW5lIEVJX0FCSVZFUlNJT04gICA4ICAgICAgIC8qIEFCSSB2ZXJzaW9uICovCi0KLSNkZWZpbmUgRUlfUEFECQk5CS8qIFN0YXJ0IG9mIHBhZGRpbmcgYnl0ZXMgKi8KLQotCi0vKiBWYWx1ZXMgZm9yIGVfdHlwZSwgd2hpY2ggaWRlbnRpZmllcyB0aGUgb2JqZWN0IGZpbGUgdHlwZSAqLwotCi0jZGVmaW5lIEVUX05PTkUJCTAJLyogTm8gZmlsZSB0eXBlICovCi0jZGVmaW5lIEVUX1JFTAkJMQkvKiBSZWxvY2F0YWJsZSBmaWxlICovCi0jZGVmaW5lIEVUX0VYRUMJCTIJLyogRXhlY3V0YWJsZSBmaWxlICovCi0jZGVmaW5lIEVUX0RZTgkJMwkvKiBTaGFyZWQgb2JqZWN0IGZpbGUgKi8KLSNkZWZpbmUgRVRfQ09SRQkJNAkvKiBDb3JlIGZpbGUgKi8KLSNkZWZpbmUgRVRfTE9PUyAgICAgICAgIDB4RkUwMAkvKiBPcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljICovCi0jZGVmaW5lIEVUX0hJT1MgICAgICAgICAweEZFRkYgIC8qIE9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgKi8KLSNkZWZpbmUgRVRfTE9QUk9DCTB4RkYwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgKi8KLSNkZWZpbmUgRVRfSElQUk9DCTB4RkZGRgkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgKi8KLQotLyogVmFsdWVzIGZvciBlX21hY2hpbmUsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGFyY2hpdGVjdHVyZSAqLwotCi0jZGVmaW5lIEVNX05PTkUJCTAJLyogTm8gbWFjaGluZSAqLwotI2RlZmluZSBFTV9NMzIJCTEJLyogQVQmVCBXRSAzMjEwMCAqLwotI2RlZmluZSBFTV9TUEFSQwkyCS8qIFNVTiBTUEFSQyAqLwotI2RlZmluZSBFTV8zODYJCTMJLyogSW50ZWwgODAzODYgKi8KLSNkZWZpbmUgRU1fNjhLCQk0CS8qIE1vdG9yb2xhIG02OGsgZmFtaWx5ICovCi0jZGVmaW5lIEVNXzg4SwkJNQkvKiBNb3Rvcm9sYSBtODhrIGZhbWlseSAqLwotI2RlZmluZSBFTV80ODYJCTYJLyogSW50ZWwgODA0ODYgKi8KLSNkZWZpbmUgRU1fODYwCQk3CS8qIEludGVsIDgwODYwICovCi0jZGVmaW5lIEVNX01JUFMJCTgJLyogTUlQUyBSMzAwMCAob2ZmaWNpYWxseSwgYmlnLWVuZGlhbiBvbmx5KSAqLwotI2RlZmluZSBFTV9TMzcwCQk5CS8qIEFtZGFobCAqLwotI2RlZmluZSBFTV9NSVBTX1JTNF9CRSAxMAkvKiBNSVBTIFI0MDAwIGJpZy1lbmRpYW4gKi8KLQotI2RlZmluZSBFTV9QQVJJU0MgICAgICAxNQkvKiBIUFBBICovCi0jZGVmaW5lIEVNX1ZQUDU1MCAgICAgIDE3ICAgICAgIC8qIEZ1aml0c3UgVlBQNTAwICovCi0jZGVmaW5lIEVNX1NQQVJDMzJQTFVTIDE4CS8qIFN1bidzICJ2OHBsdXMiICovCi0jZGVmaW5lIEVNXzk2MCAgICAgICAgIDE5ICAgICAgIC8qIEludGVsIDgwOTYwICovCi0jZGVmaW5lIEVNX1BQQwkgICAgICAgMjAJLyogUG93ZXJQQyAqLwotI2RlZmluZSBFTV9QUEM2NCAgICAgICAyMQkvKiA2NC1iaXQgUG93ZXJQQyAqLwotCi0jZGVmaW5lIEVNX1Y4MDAgICAgICAgIDM2CS8qIE5FQyBWODAwIHNlcmllcyAqLwotI2RlZmluZSBFTV9GUjIwCSAgICAgICAzNwkvKiBGdWppdHN1IEZSMjAgKi8KLSNkZWZpbmUgRU1fUkgzMgkgICAgICAgMzggICAgICAgLyogVFJXIFJIMzIgKi8KLSNkZWZpbmUgRU1fTUNPUkUgICAgICAgMzkgICAgICAgLyogTW90b3JvbGxhIE1Db3JlICovIC8qIE1heSBhbHNvIGJlIHRha2VuIGJ5IEZ1aml0c3UgTU1BICovCi0jZGVmaW5lIEVNX0FSTQkgICAgICAgNDAJLyogQVJNICovCi0jZGVmaW5lIEVNX09MRF9BTFBIQSAgIDQxCS8qIERpZ2l0YWwgQWxwaGEgKi8KLSNkZWZpbmUgRU1fU0gJICAgICAgIDQyCS8qIEhpdGFjaGkgU0ggKi8KLSNkZWZpbmUgRU1fU1BBUkNWOSAgICAgNDMJLyogU1BBUkMgdjkgNjQtYml0ICovCi0jZGVmaW5lIEVNX1RSSUNPUkUgICAgIDQ0ICAgICAgIC8qIFNpZW1lbnMgVHJpY29yZSBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KLSNkZWZpbmUgRU1fQVJDICAgICAgICAgNDUgICAgICAgLyogQXJnb25hdXQgUklTQyBDb3JlLCBBcmdvbmF1dCBUZWNobm9sb2dpZXMgSW5jLiAqLwotI2RlZmluZSBFTV9IOF8zMDAgICAgICA0NiAgICAgICAvKiBIaXRhY2hpIEg4LzMwMCAqLwotI2RlZmluZSBFTV9IOF8zMDBIICAgICA0NyAgICAgICAvKiBIaXRhY2hpIEg4LzMwMEggKi8KLSNkZWZpbmUgRU1fSDhTICAgICAgICAgNDggICAgICAgLyogSGl0YWNoaSBIOFMgKi8KLSNkZWZpbmUgRU1fSDhfNTAwICAgICAgNDkgICAgICAgLyogSGl0YWNoaSBIOC81MDAgKi8KLSNkZWZpbmUgRU1fSUFfNjQgICAgICAgNTAgICAgICAgLyogSW50ZWwgTWVyY2VkVE0gUHJvY2Vzc29yICovCi0jZGVmaW5lIEVNX01JUFNfWCAgICAgIDUxICAgICAgIC8qIFN0YW5mb3JkIE1JUFMtWCAqLwotI2RlZmluZSBFTV9DT0xERklSRSAgICA1MiAgICAgICAvKiBNb3Rvcm9sYSBDb2xkZmlyZSAqLwotI2RlZmluZSBFTV82OEhDMTIgICAgICA1MyAgICAgICAvKiBNb3Rvcm9sYSBNNjhIQzEyICovCi0KLSNkZWZpbmUgRU1fUEogICAgICAgICAgOTkgICAgICAgLyogcGljb0phdmEgKi8KLQotLyogSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGFzc2lnbiBuZXcgdW5vZmZpY2lhbCBFTV8qIHZhbHVlcywgcGxlYXNlIHBpY2sgbGFyZ2UKLSAgIHJhbmRvbSBudW1iZXJzICgweDg1MjMsIDB4YTdmMiwgZXRjLikgdG8gbWluaW1pemUgdGhlIGNoYW5jZXMgb2YgY29sbGlzaW9uCi0gICB3aXRoIG9mZmljaWFsIG9yIG5vbi1HTlUgdW5vZmZpY2lhbCB2YWx1ZXMuCi0KLSAgIE5PVEU6IERvIG5vdCBqdXN0IGluY3JlbWVudCB0aGUgbW9zdCByZWNlbnQgbnVtYmVyIGJ5IG9uZS4KLSAgIFNvbWVib2R5IGVsc2Ugc29tZXdoZXJlIHdpbGwgZG8gZXhhY3RseSB0aGUgc2FtZSB0aGluZywgYW5kIHlvdQotICAgd2lsbCBoYXZlIGEgY29sbGlzaW9uLiAgSW5zdGVhZCwgcGljayBhIHJhbmRvbSBudW1iZXIuICAqLwotCi0vKiBDeWdudXMgUG93ZXJQQyBFTEYgYmFja2VuZC4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX1BPV0VSUEMgMHg5MDI1Ci0KLS8qIE9sZCB2ZXJzaW9uIG9mIFNwYXJjIHY5LCBmcm9tIGJlZm9yZSB0aGUgQUJJOyB0aGlzIHNob3VsZCBiZQotICAgcmVtb3ZlZCBzaG9ydGx5LiAgKi8KLSNkZWZpbmUgRU1fT0xEX1NQQVJDVjkJMTEKLQotLyogT2xkIHZlcnNpb24gb2YgUG93ZXJQQywgdGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBzaG9ydGx5LiAqLwotI2RlZmluZSBFTV9QUENfT0xECTE3Ci0KLS8qIEN5Z251cyBBUkMgRUxGIGJhY2tlbmQuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19BUkMgMHg5MDQwCi0KLS8qIEN5Z251cyBNMzJSIEVMRiBiYWNrZW5kLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfTTMyUiAweDkwNDEKLQotLyogQWxwaGEgYmFja2VuZCBtYWdpYyBudW1iZXIuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0FMUEhBCTB4OTAyNgotCi0vKiBEMTBWIGJhY2tlbmQgbWFnaWMgbnVtYmVyLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfRDEwVgkweDc2NTAKLQotLyogRDMwViBiYWNrZW5kIG1hZ2ljIG51bWJlci4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX0QzMFYJMHg3Njc2Ci0KLS8qIFY4NTAgYmFja2VuZCBtYWdpYyBudW1iZXIuICBXcml0dGVuIGluIHRoZSBhYnNlbnNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19WODUwCTB4OTA4MAotCi0vKiBtbjEwMjAwIGFuZCBtbjEwMzAwIGJhY2tlbmQgbWFnaWMgbnVtYmVycy4KLSAgIFdyaXR0ZW4gaW4gdGhlIGFic2Vuc2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX01OMTAyMDAJMHhkZWFkCi0jZGVmaW5lIEVNX0NZR05VU19NTjEwMzAwCTB4YmVlZgotCi0vKiBGUjMwIG1hZ2ljIG51bWJlciAtIG5vIEVBQkkgYXZhaWxhYmxlLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX0ZSMzAJCTB4MzMzMAotCi0vKiBTZWUgdGhlIGFib3ZlIGNvbW1lbnQgYmVmb3JlIHlvdSBhZGQgYSBuZXcgRU1fKiB2YWx1ZSBoZXJlLiAgKi8KLQotLyogVmFsdWVzIGZvciBlX3ZlcnNpb24gKi8KLQotI2RlZmluZSBFVl9OT05FCQkwCQkvKiBJbnZhbGlkIEVMRiB2ZXJzaW9uICovCi0jZGVmaW5lIEVWX0NVUlJFTlQJMQkJLyogQ3VycmVudCB2ZXJzaW9uICovCi0KLS8qIFZhbHVlcyBmb3IgcHJvZ3JhbSBoZWFkZXIsIHBfdHlwZSBmaWVsZCAqLwotCi0jZGVmaW5lCVBUX05VTEwJCTAJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHVudXNlZCAqLwotI2RlZmluZSBQVF9MT0FECQkxCQkvKiBMb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQgKi8KLSNkZWZpbmUgUFRfRFlOQU1JQwkyCQkvKiBEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgUFRfSU5URVJQCTMJCS8qIFByb2dyYW0gaW50ZXJwcmV0ZXIgKi8KLSNkZWZpbmUgUFRfTk9URQkJNAkJLyogQXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCi0jZGVmaW5lIFBUX1NITElCCTUJCS8qIFJlc2VydmVkLCB1bnNwZWNpZmllZCBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgUFRfUEhEUgkJNgkJLyogRW50cnkgZm9yIGhlYWRlciB0YWJsZSBpdHNlbGYgKi8KLSNkZWZpbmUgUFRfTE9PUyAgICAgICAgIDB4NjAwMDAwMDAJLyogT1Mtc3BlY2lmaWMgKi8KLSNkZWZpbmUgUFRfSElPUyAgICAgICAgIDB4NmZmZmZmZmYJLyogT1Mtc3BlY2lmaWMgKi8KLSNkZWZpbmUgUFRfTE9QUk9DCTB4NzAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0jZGVmaW5lIFBUX0hJUFJPQwkweDdGRkZGRkZGCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyAqLwotCi0vKiBQcm9ncmFtIHNlZ21lbnQgcGVybWlzc2lvbnMsIGluIHByb2dyYW0gaGVhZGVyIHBfZmxhZ3MgZmllbGQgKi8KLQotI2RlZmluZSBQRl9YCQkoMSA8PCAwKQkvKiBTZWdtZW50IGlzIGV4ZWN1dGFibGUgKi8KLSNkZWZpbmUgUEZfVwkJKDEgPDwgMSkJLyogU2VnbWVudCBpcyB3cml0YWJsZSAqLwotI2RlZmluZSBQRl9SCQkoMSA8PCAyKQkvKiBTZWdtZW50IGlzIHJlYWRhYmxlICovCi0jZGVmaW5lIFBGX01BU0tPUwkweDBGMDAwMDAwCS8qIE9TLXNwZWNpZmljIHJlc2VydmVkIGJpdHMgKi8KLSNkZWZpbmUgUEZfTUFTS1BST0MJMHhGMDAwMDAwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgcmVzZXJ2ZWQgYml0cyAqLwotCi0vKiBWYWx1ZXMgZm9yIHNlY3Rpb24gaGVhZGVyLCBzaF90eXBlIGZpZWxkICovCi0KLSNkZWZpbmUgU0hUX05VTEwJMAkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgdW51c2VkICovCi0jZGVmaW5lIFNIVF9QUk9HQklUUwkxCQkvKiBQcm9ncmFtIHNwZWNpZmljIChwcml2YXRlKSBkYXRhICovCi0jZGVmaW5lIFNIVF9TWU1UQUIJMgkJLyogTGluayBlZGl0aW5nIHN5bWJvbCB0YWJsZSAqLwotI2RlZmluZSBTSFRfU1RSVEFCCTMJCS8qIEEgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNIVF9SRUxBCTQJCS8qIFJlbG9jYXRpb24gZW50cmllcyB3aXRoIGFkZGVuZHMgKi8KLSNkZWZpbmUgU0hUX0hBU0gJNQkJLyogQSBzeW1ib2wgaGFzaCB0YWJsZSAqLwotI2RlZmluZSBTSFRfRFlOQU1JQwk2CQkvKiBJbmZvcm1hdGlvbiBmb3IgZHluYW1pYyBsaW5raW5nICovCi0jZGVmaW5lIFNIVF9OT1RFCTcJCS8qIEluZm9ybWF0aW9uIHRoYXQgbWFya3MgZmlsZSAqLwotI2RlZmluZSBTSFRfTk9CSVRTCTgJCS8qIFNlY3Rpb24gb2NjdXBpZXMgbm8gc3BhY2UgaW4gZmlsZSAqLwotI2RlZmluZSBTSFRfUkVMCQk5CQkvKiBSZWxvY2F0aW9uIGVudHJpZXMsIG5vIGFkZGVuZHMgKi8KLSNkZWZpbmUgU0hUX1NITElCCTEwCQkvKiBSZXNlcnZlZCwgdW5zcGVjaWZpZWQgc2VtYW50aWNzICovCi0jZGVmaW5lIFNIVF9EWU5TWU0JMTEJCS8qIER5bmFtaWMgbGlua2luZyBzeW1ib2wgdGFibGUgKi8KLQotI2RlZmluZSBTSFRfTE9PUyAgICAgICAgMHg2MDAwMDAwMCAgICAgIC8qIE9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWMgc2VtYW50aWNzLCBsbyAqLwotI2RlZmluZSBTSFRfSElPUyAgICAgICAgMHg2ZmZmZmZmZiAgICAgIC8qIE9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWMgc2VtYW50aWNzLCBoaSAqLwotCi0vKiBUaGUgbmV4dCB0aHJlZSBzZWN0aW9uIHR5cGVzIGFyZSBkZWZpbmVkIGJ5IFNvbGFyaXMsIGFuZCBhcmUgbmFtZWQKLSAgIFNIVF9TVU5XKi4gIFdlIHVzZSB0aGVtIGluIEdOVSBjb2RlLCBzbyB3ZSBhbHNvIGRlZmluZSBTSFRfR05VKgotICAgdmVyc2lvbnMuICAqLwotI2RlZmluZSBTSFRfU1VOV192ZXJkZWYJMHg2ZmZmZmZmZAkvKiBWZXJzaW9ucyBkZWZpbmVkIGJ5IGZpbGUgKi8KLSNkZWZpbmUgU0hUX1NVTldfdmVybmVlZCAweDZmZmZmZmZlCS8qIFZlcnNpb25zIG5lZWRlZCBieSBmaWxlICovCi0jZGVmaW5lIFNIVF9TVU5XX3ZlcnN5bQkweDZmZmZmZmZmCS8qIFN5bWJvbCB2ZXJzaW9ucyAqLwotCi0jZGVmaW5lIFNIVF9HTlVfdmVyZGVmCVNIVF9TVU5XX3ZlcmRlZgotI2RlZmluZSBTSFRfR05VX3Zlcm5lZWQJU0hUX1NVTldfdmVybmVlZAotI2RlZmluZSBTSFRfR05VX3ZlcnN5bQlTSFRfU1VOV192ZXJzeW0KLQotI2RlZmluZSBTSFRfTE9QUk9DCTB4NzAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljIHNlbWFudGljcywgbG8gKi8KLSNkZWZpbmUgU0hUX0hJUFJPQwkweDdGRkZGRkZGCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBzZW1hbnRpY3MsIGhpICovCi0jZGVmaW5lIFNIVF9MT1VTRVIJMHg4MDAwMDAwMAkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU0hUX0hJVVNFUgkweDhGRkZGRkZGCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotCi0vKiBWYWx1ZXMgZm9yIHNlY3Rpb24gaGVhZGVyLCBzaF9mbGFncyBmaWVsZCAqLwotCi0jZGVmaW5lIFNIRl9XUklURQkoMSA8PCAwKQkvKiBXcml0YWJsZSBkYXRhIGR1cmluZyBleGVjdXRpb24gKi8KLSNkZWZpbmUgU0hGX0FMTE9DCSgxIDw8IDEpCS8qIE9jY3VwaWVzIG1lbW9yeSBkdXJpbmcgZXhlY3V0aW9uICovCi0jZGVmaW5lIFNIRl9FWEVDSU5TVFIJKDEgPDwgMikJLyogRXhlY3V0YWJsZSBtYWNoaW5lIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBTSEZfTUFTS09TCTB4MEYwMDAwMDAJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNIRl9NQVNLUFJPQwkweEYwMDAwMDAwCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLQotLyogVmFsdWVzIG9mIG5vdGUgc2VnbWVudCBkZXNjcmlwdG9yIHR5cGVzIGZvciBjb3JlIGZpbGVzLiAqLwotCi0jZGVmaW5lIE5UX1BSU1RBVFVTCTEJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJzdGF0dXMgc3RydWN0ICovCi0jZGVmaW5lIE5UX0ZQUkVHU0VUCTIJCS8qIENvbnRhaW5zIGNvcHkgb2YgZnByZWdzZXQgc3RydWN0ICovCi0jZGVmaW5lIE5UX1BSUFNJTkZPCTMJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJwc2luZm8gc3RydWN0ICovCi0jZGVmaW5lIE5UX1RBU0tTVFJVQ1QJNAkJLyogQ29udGFpbnMgY29weSBvZiB0YXNrIHN0cnVjdCAqLwotI2RlZmluZSBOVF9QUlhGUFJFRyAgICAgMHg0NmU2MmI3ZgkvKiBDb250YWlucyBhIHVzZXJfeGZwcmVnc19zdHJ1Y3Q7Ci0JCQkJCSAgIG5vdGUgbmFtZSBtdXN0IGJlICJMSU5VWCIuICAqLwotCi0vKiBOb3RlIHNlZ21lbnRzIGZvciBjb3JlIGZpbGVzIG9uIGRpci1zdHlsZSBwcm9jZnMgc3lzdGVtcy4gKi8KLQotI2RlZmluZSBOVF9QU1RBVFVTCTEwCQkvKiBIYXMgYSBzdHJ1Y3QgcHN0YXR1cyAqLwotI2RlZmluZSBOVF9GUFJFR1MJMTIJCS8qIEhhcyBhIHN0cnVjdCBmcHJlZ3NldCAqLwotI2RlZmluZSBOVF9QU0lORk8JMTMJCS8qIEhhcyBhIHN0cnVjdCBwc2luZm8gKi8KLSNkZWZpbmUgTlRfTFdQU1RBVFVTCTE2CQkvKiBIYXMgYSBzdHJ1Y3QgbHdwc3RhdHVzX3QgKi8KLSNkZWZpbmUgTlRfTFdQU0lORk8JMTcJCS8qIEhhcyBhIHN0cnVjdCBsd3BzaW5mb190ICovCi0KLS8qIFZhbHVlcyBvZiBub3RlIHNlZ21lbnQgZGVzY3JpcHRvciB0eXBlcyBmb3Igb2JqZWN0IGZpbGVzLiAgKi8KLS8qIChPbmx5IGZvciBocHBhIHJpZ2h0IG5vdy4gIFNob3VsZCB0aGlzIGJlIG1vdmVkIGVsc2V3aGVyZT8pICAqLwotCi0jZGVmaW5lIE5UX1ZFUlNJT04JMQkJLyogQ29udGFpbnMgYSB2ZXJzaW9uIHN0cmluZy4gICovCi0KLS8qIFRoZXNlIHRocmVlIG1hY3JvcyBkaXNhc3NlbWJsZSBhbmQgYXNzZW1ibGUgYSBzeW1ib2wgdGFibGUgc3RfaW5mbyBmaWVsZCwKLSAgIHdoaWNoIGNvbnRhaW5zIHRoZSBzeW1ib2wgYmluZGluZyBhbmQgc3ltYm9sIHR5cGUuICBUaGUgU1RCXyBhbmQgU1RUXwotICAgZGVmaW5lcyBpZGVudGlmeSB0aGUgYmluZGluZyBhbmQgdHlwZS4gKi8KLQotI2RlZmluZSBFTEZfU1RfQklORCh2YWwpCQkoKCh1bnNpZ25lZCBpbnQpKHZhbCkpID4+IDQpCi0jZGVmaW5lIEVMRl9TVF9UWVBFKHZhbCkJCSgodmFsKSAmIDB4RikKLSNkZWZpbmUgRUxGX1NUX0lORk8oYmluZCx0eXBlKQkJKCgoYmluZCkgPDwgNCkgKyAoKHR5cGUpICYgMHhGKSkKLQotI2RlZmluZSBTVE5fVU5ERUYJMAkJLyogdW5kZWZpbmVkIHN5bWJvbCBpbmRleCAqLwotCi0jZGVmaW5lIFNUQl9MT0NBTAkwCQkvKiBTeW1ib2wgbm90IHZpc2libGUgb3V0c2lkZSBvYmogKi8KLSNkZWZpbmUgU1RCX0dMT0JBTAkxCQkvKiBTeW1ib2wgdmlzaWJsZSBvdXRzaWRlIG9iaiAqLwotI2RlZmluZSBTVEJfV0VBSwkyCQkvKiBMaWtlIGdsb2JhbHMsIGxvd2VyIHByZWNlZGVuY2UgKi8KLSNkZWZpbmUgU1RCX0xPT1MgICAgICAgIDEwCQkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RCX0hJT1MgICAgICAgIDEyCQkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RCX0xPUFJPQwkxMwkJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUQl9ISVBST0MJMTUJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotCi0jZGVmaW5lIFNUVF9OT1RZUEUJMAkJLyogU3ltYm9sIHR5cGUgaXMgdW5zcGVjaWZpZWQgKi8KLSNkZWZpbmUgU1RUX09CSkVDVAkxCQkvKiBTeW1ib2wgaXMgYSBkYXRhIG9iamVjdCAqLwotI2RlZmluZSBTVFRfRlVOQwkyCQkvKiBTeW1ib2wgaXMgYSBjb2RlIG9iamVjdCAqLwotI2RlZmluZSBTVFRfU0VDVElPTgkzCQkvKiBTeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgc2VjdGlvbiAqLwotI2RlZmluZSBTVFRfRklMRQk0CQkvKiBTeW1ib2wgZ2l2ZXMgYSBmaWxlIG5hbWUgKi8KLSNkZWZpbmUgU1RUX0xPT1MgICAgICAgIDEwCQkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RUX0hJT1MgICAgICAgIDEyCQkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU1RUX0xPUFJPQwkxMwkJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUVF9ISVBST0MJMTUJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotCi0vKiBTcGVjaWFsIHNlY3Rpb24gaW5kaWNlcywgd2hpY2ggbWF5IHNob3cgdXAgaW4gc3Rfc2huZHggZmllbGRzLCBhbW9uZwotICAgb3RoZXIgcGxhY2VzLiAqLwotCi0jZGVmaW5lIFNITl9VTkRFRgkwCQkvKiBVbmRlZmluZWQgc2VjdGlvbiByZWZlcmVuY2UgKi8KLSNkZWZpbmUgU0hOX0xPUkVTRVJWRQkweEZGMDAJCS8qIEJlZ2luIHJhbmdlIG9mIHJlc2VydmVkIGluZGljZXMgKi8KLSNkZWZpbmUgU0hOX0xPUFJPQwkweEZGMDAJCS8qIEJlZ2luIHJhbmdlIG9mIGFwcGwtc3BlY2lmaWMgKi8KLSNkZWZpbmUgU0hOX0hJUFJPQwkweEZGMUYJCS8qIEVuZCByYW5nZSBvZiBhcHBsLXNwZWNpZmljICovCi0jZGVmaW5lIFNITl9MT09TICAgICAgICAweEZGMjAJCS8qIE9TIHNwZWNpZmljIHNlbWFudGljcywgbG8gKi8KLSNkZWZpbmUgU0hOX0hJT1MgICAgICAgIDB4RkYzRgkJLyogT1Mgc3BlY2lmaWMgc2VtYW50aWNzLCBoaSAqLwotI2RlZmluZSBTSE5fQUJTCQkweEZGRjEJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIGlzIGFic29sdXRlICovCi0jZGVmaW5lIFNITl9DT01NT04JMHhGRkYyCQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBpcyBpbiBjb21tb24gKi8KLSNkZWZpbmUgU0hOX0hJUkVTRVJWRQkweEZGRkYJCS8qIEVuZCByYW5nZSBvZiByZXNlcnZlZCBpbmRpY2VzICovCi0KLS8qIHJlbG9jYXRpb24gaW5mbyBoYW5kbGluZyBtYWNyb3MgKi8KLQotI2RlZmluZSBFTEYzMl9SX1NZTShpKQkJKChpKSA+PiA4KQotI2RlZmluZSBFTEYzMl9SX1RZUEUoaSkJCSgoaSkgJiAweGZmKQotI2RlZmluZSBFTEYzMl9SX0lORk8ocyx0KQkoKChzKSA8PCA4KSArICgodCkgJiAweGZmKSkKLQotI2RlZmluZSBFTEY2NF9SX1NZTShpKQkJKChpKSA+PiAzMikKLSNkZWZpbmUgRUxGNjRfUl9UWVBFKGkpCQkoKGkpICYgMHhmZmZmZmZmZikKLSNkZWZpbmUgRUxGNjRfUl9JTkZPKHMsdCkJKCgoYmZkX3ZtYSkgKHMpIDw8IDMyKSArIChiZmRfdm1hKSAodCkpCi0KLS8qIER5bmFtaWMgc2VjdGlvbiB0YWdzICovCi0KLSNkZWZpbmUgRFRfTlVMTAkJMAotI2RlZmluZSBEVF9ORUVERUQJMQotI2RlZmluZSBEVF9QTFRSRUxTWgkyCi0jZGVmaW5lIERUX1BMVEdPVAkzCi0jZGVmaW5lIERUX0hBU0gJCTQKLSNkZWZpbmUgRFRfU1RSVEFCCTUKLSNkZWZpbmUgRFRfU1lNVEFCCTYKLSNkZWZpbmUgRFRfUkVMQQkJNwotI2RlZmluZSBEVF9SRUxBU1oJOAotI2RlZmluZSBEVF9SRUxBRU5UCTkKLSNkZWZpbmUgRFRfU1RSU1oJMTAKLSNkZWZpbmUgRFRfU1lNRU5UCTExCi0jZGVmaW5lIERUX0lOSVQJCTEyCi0jZGVmaW5lIERUX0ZJTkkJCTEzCi0jZGVmaW5lIERUX1NPTkFNRQkxNAotI2RlZmluZSBEVF9SUEFUSAkxNQotI2RlZmluZSBEVF9TWU1CT0xJQwkxNgotI2RlZmluZSBEVF9SRUwJCTE3Ci0jZGVmaW5lIERUX1JFTFNaCTE4Ci0jZGVmaW5lIERUX1JFTEVOVAkxOQotI2RlZmluZSBEVF9QTFRSRUwJMjAKLSNkZWZpbmUgRFRfREVCVUcJMjEKLSNkZWZpbmUgRFRfVEVYVFJFTAkyMgotI2RlZmluZSBEVF9KTVBSRUwJMjMKLSNkZWZpbmUgRFRfQklORF9OT1cgICAgIDI0Ci0jZGVmaW5lIERUX0lOSVRfQVJSQVkgICAyNQotI2RlZmluZSBEVF9GSU5JX0FSUkFZICAgMjYKLSNkZWZpbmUgRFRfSU5JVF9BUlJBWVNaIDI3Ci0jZGVmaW5lIERUX0ZJTklfQVJSQVlTWiAyOAotCi0jZGVmaW5lIERUX0xPT1MgICAgICAgICAweDYwMDAwMDAwCi0jZGVmaW5lIERUX0hJT1MgICAgICAgICAweDZmZmZmZmZmCi0KLS8qIFRoZSBuZXh0IGZvdXIgZHluYW1pYyB0YWdzIGFyZSB1c2VkIG9uIFNvbGFyaXMuICBXZSBzdXBwb3J0IHRoZW0KLSAgIGV2ZXJ5d2hlcmUuICAqLwotI2RlZmluZSBEVF9WQUxSTkdMTwkweDZmZmZmZDAwCi0jZGVmaW5lIERUX1BMVFBBRFNaCTB4NmZmZmZkZjkKLSNkZWZpbmUgRFRfTU9WRUVOVAkweDZmZmZmZGZhCi0jZGVmaW5lIERUX01PVkVTWgkweDZmZmZmZGZiCi0jZGVmaW5lIERUX0ZFQVRVUkVfMQkweDZmZmZmZGZjCi0jZGVmaW5lIERUX1BPU0ZMQUdfMQkweDZmZmZmZGZkCi0jZGVmaW5lIERUX1NZTUlOU1oJMHg2ZmZmZmRmZQotI2RlZmluZSBEVF9TWU1JTkVOVAkweDZmZmZmZGZmCi0jZGVmaW5lIERUX1ZBTFJOR0hJCTB4NmZmZmZkZmYKLQotI2RlZmluZSBEVF9BRERSUk5HTE8JMHg2ZmZmZmUwMAotI2RlZmluZSBEVF9TWU1JTkZPCTB4NmZmZmZlZmYKLSNkZWZpbmUgRFRfQUREUlJOR0hJCTB4NmZmZmZlZmYKLQotI2RlZmluZSBEVF9SRUxBQ09VTlQJMHg2ZmZmZmZmOQotI2RlZmluZSBEVF9SRUxDT1VOVAkweDZmZmZmZmZhCi0jZGVmaW5lIERUX0ZMQUdTXzEJMHg2ZmZmZmZmYgotI2RlZmluZSBEVF9WRVJERUYJMHg2ZmZmZmZmYwotI2RlZmluZSBEVF9WRVJERUZOVU0JMHg2ZmZmZmZmZAotI2RlZmluZSBEVF9WRVJORUVECTB4NmZmZmZmZmUKLSNkZWZpbmUgRFRfVkVSTkVFRE5VTQkweDZmZmZmZmZmCi0KLS8qIFRoaXMgdGFnIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU29sYXJpcyB2ZXJzaW9uIHNjaGVtZS4gICovCi0jZGVmaW5lIERUX1ZFUlNZTQkweDZmZmZmZmYwCi0KLSNkZWZpbmUgRFRfTE9QUk9DCTB4NzAwMDAwMDAKLSNkZWZpbmUgRFRfSElQUk9DCTB4N2ZmZmZmZmYKLQotLyogVGhlc2Ugc2VjdGlvbiB0YWdzIGFyZSB1c2VkIG9uIFNvbGFyaXMuICBXZSBzdXBwb3J0IHRoZW0KLSAgIGV2ZXJ5d2hlcmUsIGFuZCBob3BlIHRoZXkgZG8gbm90IGNvbmZsaWN0LiAgKi8KLQotI2RlZmluZSBEVF9BVVhJTElBUlkJMHg3ZmZmZmZmZAotI2RlZmluZSBEVF9VU0VECQkweDdmZmZmZmZlCi0jZGVmaW5lIERUX0ZJTFRFUgkweDdmZmZmZmZmCi0KLS8qIFZhbHVlcyB1c2VkIGluIERUX0ZFQVRVUkVfMSAuZHluYW1pYyBlbnRyeS4gICovCi0jZGVmaW5lIERURl8xX1BBUklOSVQJMHgwMDAwMDAwMQotCi0vKiBGbGFnIHZhbHVlcyB1c2VkIGluIHRoZSBEVF9QT1NGTEFHXzEgLmR5bmFtaWMgZW50cnkuICAqLwotI2RlZmluZSBERl9QMV9MQVpZTE9BRAkweDAwMDAwMDAxCi0jZGVmaW5lIERGX1AxX0dST1VQUEVSTQkweDAwMDAwMDAyCi0KLS8qIEZsYWcgdmFsdWUgaW4gaW4gdGhlIERUXzFfRkxBR1MgLmR5bmFtaWMgZW50cnkuICAqLwotI2RlZmluZSBERl8xX05PVwkweDAwMDAwMDAxCi0jZGVmaW5lIERGXzFfR0xPQkFMCTB4MDAwMDAwMDIKLSNkZWZpbmUgREZfMV9HUk9VUAkweDAwMDAwMDA0Ci0jZGVmaW5lIERGXzFfTk9ERUxFVEUJMHgwMDAwMDAwOAotI2RlZmluZSBERl8xX0xPQURGTFRSCTB4MDAwMDAwMTAKLSNkZWZpbmUgREZfMV9JTklURklSU1QJMHgwMDAwMDAyMAotI2RlZmluZSBERl8xX05PT1BFTgkweDAwMDAwMDQwCi0jZGVmaW5lIERGXzFfT1JJR0lOCTB4MDAwMDAwODAKLSNkZWZpbmUgREZfMV9ESVJFQ1QJMHgwMDAwMDEwMAotI2RlZmluZSBERl8xX1RSQU5TCTB4MDAwMDAyMDAKLSNkZWZpbmUgREZfMV9JTlRFUlBPU0UJMHgwMDAwMDQwMAotCi0vKiBUaGVzZSBjb25zdGFudHMgYXJlIHVzZWQgZm9yIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBhIEVsZjMyX1ZlcmRlZgotICAgc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBWRVJfREVGX05PTkUJCTAKLSNkZWZpbmUgVkVSX0RFRl9DVVJSRU5UCQkxCi0KLS8qIFRoZXNlIGNvbnN0YW50cyBhcHBlYXIgaW4gdGhlIHZkX2ZsYWdzIGZpZWxkIG9mIGEgRWxmMzJfVmVyZGVmCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIFZFUl9GTEdfQkFTRQkJMHgxCi0jZGVmaW5lIFZFUl9GTEdfV0VBSwkJMHgyCi0KLS8qIFRoZXNlIHNwZWNpYWwgY29uc3RhbnRzIGNhbiBiZSBmb3VuZCBpbiBhbiBFbGYzMl9WZXJzeW0gZmllbGQuICAqLwotCi0jZGVmaW5lIFZFUl9ORFhfTE9DQUwJCTAKLSNkZWZpbmUgVkVSX05EWF9HTE9CQUwJCTEKLQotLyogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgb2YgYSBFbGYzMl9WZXJuZWVkCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIFZFUl9ORUVEX05PTkUJCTAKLSNkZWZpbmUgVkVSX05FRURfQ1VSUkVOVAkxCi0KLS8qIFRoaXMgZmxhZyBhcHBlYXJzIGluIGEgVmVyc3ltIHN0cnVjdHVyZS4gIEl0IG1lYW5zIHRoYXQgdGhlIHN5bWJvbAotICAgaXMgaGlkZGVuLCBhbmQgaXMgb25seSB2aXNpYmxlIHdpdGggYW4gZXhwbGljaXQgdmVyc2lvbiBudW1iZXIuCi0gICBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4gICovCi0KLSNkZWZpbmUgVkVSU1lNX0hJRERFTgkJMHg4MDAwCi0KLS8qIFRoaXMgaXMgdGhlIG1hc2sgZm9yIHRoZSByZXN0IG9mIHRoZSBWZXJzeW0gaW5mb3JtYXRpb24uICAqLwotCi0jZGVmaW5lIFZFUlNZTV9WRVJTSU9OCQkweDdmZmYKLQotLyogVGhpcyBpcyBhIHNwZWNpYWwgdG9rZW4gd2hpY2ggYXBwZWFycyBhcyBwYXJ0IG9mIGEgc3ltYm9sIG5hbWUuICBJdAotICAgaW5kaWN0ZXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUgbmFtZSBpcyBhY3R1YWxseSB0aGUgbmFtZSBvZiBhCi0gICB2ZXJzaW9uIG5vZGUsIGFuZCBpcyBub3QgcGFydCBvZiB0aGUgYWN0dWFsIG5hbWUuICBUaGlzIGlzIGEgR05VCi0gICBleHRlbnNpb24uICBGb3IgZXhhbXBsZSwgdGhlIHN5bWJvbCBuYW1lIGBzdGF0QHZlcjInIGlzIHRha2VuIHRvCi0gICBtZWFuIHRoZSBzeW1ib2wgYHN0YXQnIGluIHZlcnNpb24gYHZlcjInLiAgKi8KLQotI2RlZmluZSBFTEZfVkVSX0NIUgknQCcKLQotLyogUG9zc2libGUgdmFsdWVzIGZvciBzaV9ib3VuZHRvLiAgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9TRUxGCQkweGZmZmYJLyogU3ltYm9sIGJvdW5kIHRvIHNlbGYgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9QQVJFTlQJMHhmZmZlCS8qIFN5bWJvbCBib3VuZCB0byBwYXJlbnQgKi8KLSNkZWZpbmUgU1lNSU5GT19CVF9MT1dSRVNFUlZFCTB4ZmYwMAkvKiBCZWdpbm5pbmcgb2YgcmVzZXJ2ZWQgZW50cmllcyAqLwotCi0vKiBQb3NzaWJsZSBiaXRtYXNrcyBmb3Igc2lfZmxhZ3MuICAqLwotI2RlZmluZSBTWU1JTkZPX0ZMR19ESVJFQ1QJMHgwMDAxCS8qIERpcmVjdCBib3VuZCBzeW1ib2wgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfUEFTU1RIUlUJMHgwMDAyCS8qIFBhc3MtdGhydSBzeW1ib2wgZm9yIHRyYW5zbGF0b3IgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfQ09QWQkweDAwMDQJLyogU3ltYm9sIGlzIGEgY29weS1yZWxvYyAqLwotI2RlZmluZSBTWU1JTkZPX0ZMR19MQVpZTE9BRAkweDAwMDgJLyogU3ltYm9sIGJvdW5kIHRvIG9iamVjdCB0byBiZSBsYXp5Ci0JCQkJCSAgIGxvYWRlZCAqLwotLyogU3ltaW5mbyB2ZXJzaW9uIHZhbHVlcy4gICovCi0jZGVmaW5lIFNZTUlORk9fTk9ORQkJMAotI2RlZmluZSBTWU1JTkZPX0NVUlJFTlQJCTEKLSNkZWZpbmUgU1lNSU5GT19OVU0JCTIKLQotI2VuZGlmIC8qIF9FTEZfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2QxMHYuaCBiL2luY2x1ZGUvZWxmL2QxMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiNzljOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9kMTB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBkMTB2IEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0QxMFZfSAotI2RlZmluZSBfRUxGX0QxMFZfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9kMTB2X3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzEwX1BDUkVMX1IsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzEwX1BDUkVMX0wsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzE2LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8xOCwgNCkKLSAgUkVMT0NfTlVNQkVSIChSX0QxMFZfMThfUENSRUwsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzMyLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9HTlVfVlRJTkhFUklULCA3KQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9HTlVfVlRFTlRSWSwgOCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZDMwdi5oIGIvaW5jbHVkZS9lbGYvZDMwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGJhZDE5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2QzMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGQzMHYgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfRDMwVl9ICi0jZGVmaW5lIF9FTEZfRDMwVl9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9kMzB2X3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzYsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzlfUENSRUwsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzlfUENSRUxfUiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMTUsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzE1X1BDUkVMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8xNV9QQ1JFTF9SLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8yMSwgNykKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMjFfUENSRUwsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzIxX1BDUkVMX1IsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzMyLCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMzJfUENSRUwsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8zMl9OT1JNQUwsIDEyKQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9kd2FyZi5oIGIvaW5jbHVkZS9lbGYvZHdhcmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3MmNkNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9kd2FyZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qIERlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgb2YgY29kZXMgcmVsYXRpbmcgdG8gdGhlIERXQVJGIHN5bWJvbGljCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9ybWF0LgotCi0gICBXcml0dGVuIGJ5IFJvbiBHdWlsbWV0dGUgKHJmZ0BuY2QuY29tKQotCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLQotR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBEV0FSRiBzcGVjaWZpY2F0aW9uIChhIHB1YmxpYyBkb2N1bWVudCkKLSAgIFJldmlzaW9uIDEuMC4xIChBcHJpbCA4LCAxOTkyKSBkZXZlbG9wZWQgYnkgdGhlIFVOSVggSW50ZXJuYXRpb25hbAotICAgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzIFNwZWNpYWwgSW50ZXJlc3QgR3JvdXAgKFVJL1BMU0lHKSBhbmQgZGlzdHJpYnV0ZWQKLSAgIGJ5IFVOSVggSW50ZXJuYXRpb25hbC4gIENvcGllcyBvZiB0aGlzIHNwZWNpZmljYXRpb24gYXJlIGF2YWlsYWJsZSBmcm9tCi0gICBVTklYIEludGVybmF0aW9uYWwsIDIwIFdhdGVydmlldyBCb3VsZXZhcmQsIFBhcnNpcHBhbnksIE5KLCAwNzA1NC4KLSovCi0KLSNpZm5kZWYgX0VMRl9EV0FSRl9ICi0jZGVmaW5lIF9FTEZfRFdBUkZfSAotCi0vKiBUYWcgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl90YWcgewotICAgIFRBR19wYWRkaW5nCQkJPSAweDAwMDAsCi0gICAgVEFHX2FycmF5X3R5cGUJCT0gMHgwMDAxLAotICAgIFRBR19jbGFzc190eXBlCQk9IDB4MDAwMiwKLSAgICBUQUdfZW50cnlfcG9pbnQJCT0gMHgwMDAzLAotICAgIFRBR19lbnVtZXJhdGlvbl90eXBlCT0gMHgwMDA0LAotICAgIFRBR19mb3JtYWxfcGFyYW1ldGVyCT0gMHgwMDA1LAotICAgIFRBR19nbG9iYWxfc3Vicm91dGluZQk9IDB4MDAwNiwKLSAgICBUQUdfZ2xvYmFsX3ZhcmlhYmxlCQk9IDB4MDAwNywKLSAgICAJCQkJLyogMHgwMDA4IC0tIHJlc2VydmVkICovCi0JCQkJLyogMHgwMDA5IC0tIHJlc2VydmVkICovCi0gICAgVEFHX2xhYmVsCQkJPSAweDAwMGEsCi0gICAgVEFHX2xleGljYWxfYmxvY2sJCT0gMHgwMDBiLAotICAgIFRBR19sb2NhbF92YXJpYWJsZQkJPSAweDAwMGMsCi0gICAgVEFHX21lbWJlcgkJCT0gMHgwMDBkLAotCQkJCS8qIDB4MDAwZSAtLSByZXNlcnZlZCAqLwotICAgIFRBR19wb2ludGVyX3R5cGUJCT0gMHgwMDBmLAotICAgIFRBR19yZWZlcmVuY2VfdHlwZQkJPSAweDAwMTAsCi0gICAgVEFHX2NvbXBpbGVfdW5pdAkJPSAweDAwMTEsCi0gICAgVEFHX3N0cmluZ190eXBlCQk9IDB4MDAxMiwKLSAgICBUQUdfc3RydWN0dXJlX3R5cGUJCT0gMHgwMDEzLAotICAgIFRBR19zdWJyb3V0aW5lCQk9IDB4MDAxNCwKLSAgICBUQUdfc3Vicm91dGluZV90eXBlCQk9IDB4MDAxNSwKLSAgICBUQUdfdHlwZWRlZgkJCT0gMHgwMDE2LAotICAgIFRBR191bmlvbl90eXBlCQk9IDB4MDAxNywKLSAgICBUQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVycwk9IDB4MDAxOCwKLSAgICBUQUdfdmFyaWFudAkJCT0gMHgwMDE5LAotICAgIFRBR19jb21tb25fYmxvY2sJCT0gMHgwMDFhLAotICAgIFRBR19jb21tb25faW5jbHVzaW9uCT0gMHgwMDFiLAotICAgIFRBR19pbmhlcml0YW5jZQkJPSAweDAwMWMsCi0gICAgVEFHX2lubGluZWRfc3Vicm91dGluZQk9IDB4MDAxZCwKLSAgICBUQUdfbW9kdWxlCQkJPSAweDAwMWUsCi0gICAgVEFHX3B0cl90b19tZW1iZXJfdHlwZQk9IDB4MDAxZiwKLSAgICBUQUdfc2V0X3R5cGUJCT0gMHgwMDIwLAotICAgIFRBR19zdWJyYW5nZV90eXBlCQk9IDB4MDAyMSwKLSAgICBUQUdfd2l0aF9zdG10CQk9IDB4MDAyMiwKLQotICAgIC8qIEdOVSBleHRlbnNpb25zICovCi0KLSAgICBUQUdfZm9ybWF0X2xhYmVsCQk9IDB4ODAwMCwgIC8qIGZvciBGT1JUUkFOIDc3IGFuZCBGb3J0cmFuIDkwICovCi0gICAgVEFHX25hbWVsaXN0CQk9IDB4ODAwMSwgIC8qIEZvciBGb3J0cmFuIDkwICovCi0gICAgVEFHX2Z1bmN0aW9uX3RlbXBsYXRlCT0gMHg4MDAyLCAgLyogZm9yIEMrKyAqLwotICAgIFRBR19jbGFzc190ZW1wbGF0ZQkJPSAweDgwMDMgICAvKiBmb3IgQysrICovCi19OwotCi0jZGVmaW5lIFRBR19sb191c2VyCTB4ODAwMCAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBUQUdfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0jZGVmaW5lIFRBR19zb3VyY2VfZmlsZSBUQUdfY29tcGlsZV91bml0ICAvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotCi0vKiBGb3JtIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfZm9ybSB7Ci0gICAgRk9STV9BRERSCT0gMHgxLAotICAgIEZPUk1fUkVGCT0gMHgyLAotICAgIEZPUk1fQkxPQ0syCT0gMHgzLAotICAgIEZPUk1fQkxPQ0s0CT0gMHg0LAotICAgIEZPUk1fREFUQTIJPSAweDUsCi0gICAgRk9STV9EQVRBNAk9IDB4NiwKLSAgICBGT1JNX0RBVEE4CT0gMHg3LAotICAgIEZPUk1fU1RSSU5HCT0gMHg4Ci19OwotCi0vKiBBdHRyaWJ1dGUgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9hdHRyaWJ1dGUgewotICAgIEFUX3NpYmxpbmcJCQk9ICgweDAwMTB8Rk9STV9SRUYpLAotICAgIEFUX2xvY2F0aW9uCQkJPSAoMHgwMDIwfEZPUk1fQkxPQ0syKSwKLSAgICBBVF9uYW1lCQkJPSAoMHgwMDMwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9mdW5kX3R5cGUJCT0gKDB4MDA1MHxGT1JNX0RBVEEyKSwKLSAgICBBVF9tb2RfZnVuZF90eXBlCQk9ICgweDAwNjB8Rk9STV9CTE9DSzIpLAotICAgIEFUX3VzZXJfZGVmX3R5cGUJCT0gKDB4MDA3MHxGT1JNX1JFRiksCi0gICAgQVRfbW9kX3VfZF90eXBlCQk9ICgweDAwODB8Rk9STV9CTE9DSzIpLAotICAgIEFUX29yZGVyaW5nCQkJPSAoMHgwMDkwfEZPUk1fREFUQTIpLAotICAgIEFUX3N1YnNjcl9kYXRhCQk9ICgweDAwYTB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2J5dGVfc2l6ZQkJPSAoMHgwMGIwfEZPUk1fREFUQTQpLAotICAgIEFUX2JpdF9vZmZzZXQJCT0gKDB4MDBjMHxGT1JNX0RBVEEyKSwKLSAgICBBVF9iaXRfc2l6ZQkJCT0gKDB4MDBkMHxGT1JNX0RBVEE0KSwKLQkJCQkvKiAoMHgwMGUwfEZPUk1feHh4eCkgLS0gcmVzZXJ2ZWQgKi8KLSAgICBBVF9lbGVtZW50X2xpc3QJCT0gKDB4MDBmMHxGT1JNX0JMT0NLNCksCi0gICAgQVRfc3RtdF9saXN0CQk9ICgweDAxMDB8Rk9STV9EQVRBNCksCi0gICAgQVRfbG93X3BjCQkJPSAoMHgwMTEwfEZPUk1fQUREUiksCi0gICAgQVRfaGlnaF9wYwkJCT0gKDB4MDEyMHxGT1JNX0FERFIpLAotICAgIEFUX2xhbmd1YWdlCQkJPSAoMHgwMTMwfEZPUk1fREFUQTQpLAotICAgIEFUX21lbWJlcgkJCT0gKDB4MDE0MHxGT1JNX1JFRiksCi0gICAgQVRfZGlzY3IJCQk9ICgweDAxNTB8Rk9STV9SRUYpLAotICAgIEFUX2Rpc2NyX3ZhbHVlCQk9ICgweDAxNjB8Rk9STV9CTE9DSzIpLAotCQkJCS8qICgweDAxNzB8Rk9STV94eHh4KSAtLSByZXNlcnZlZCAqLwotCQkJCS8qICgweDAxODB8Rk9STV94eHh4KSAtLSByZXNlcnZlZCAqLwotICAgIEFUX3N0cmluZ19sZW5ndGgJCT0gKDB4MDE5MHxGT1JNX0JMT0NLMiksCi0gICAgQVRfY29tbW9uX3JlZmVyZW5jZQkJPSAoMHgwMWEwfEZPUk1fUkVGKSwKLSAgICBBVF9jb21wX2RpcgkJCT0gKDB4MDFiMHxGT1JNX1NUUklORyksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX3N0cmluZwk9ICgweDAxYzB8Rk9STV9TVFJJTkcpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9kYXRhMgk9ICgweDAxYzB8Rk9STV9EQVRBMiksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX2RhdGE0CT0gKDB4MDFjMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfZGF0YTgJPSAoMHgwMWMwfEZPUk1fREFUQTgpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9ibG9jazIJPSAoMHgwMWMwfEZPUk1fQkxPQ0syKSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfYmxvY2s0CT0gKDB4MDFjMHxGT1JNX0JMT0NLNCksCi0gICAgQVRfY29udGFpbmluZ190eXBlCQk9ICgweDAxZDB8Rk9STV9SRUYpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX2FkZHIJPSAoMHgwMWUwfEZPUk1fQUREUiksCi0gICAgICAgIEFUX2RlZmF1bHRfdmFsdWVfZGF0YTIJPSAoMHgwMWUwfEZPUk1fREFUQTIpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX2RhdGE0CT0gKDB4MDFlMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfZGVmYXVsdF92YWx1ZV9kYXRhOAk9ICgweDAxZTB8Rk9STV9EQVRBOCksCi0gICAgICAgIEFUX2RlZmF1bHRfdmFsdWVfc3RyaW5nCT0gKDB4MDFlMHxGT1JNX1NUUklORyksCi0gICAgQVRfZnJpZW5kcwkJCT0gKDB4MDFmMHxGT1JNX0JMT0NLMiksCi0gICAgQVRfaW5saW5lCQkJPSAoMHgwMjAwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9pc19vcHRpb25hbAkJPSAoMHgwMjEwfEZPUk1fU1RSSU5HKSwKLSAgICAgICAgQVRfbG93ZXJfYm91bmRfcmVmCT0gKDB4MDIyMHxGT1JNX1JFRiksCi0gICAgICAgIEFUX2xvd2VyX2JvdW5kX2RhdGEyCT0gKDB4MDIyMHxGT1JNX0RBVEEyKSwKLSAgICAgICAgQVRfbG93ZXJfYm91bmRfZGF0YTQJPSAoMHgwMjIwfEZPUk1fREFUQTQpLAotICAgICAgICBBVF9sb3dlcl9ib3VuZF9kYXRhOAk9ICgweDAyMjB8Rk9STV9EQVRBOCksCi0gICAgQVRfcHJpdmF0ZQkJCT0gKDB4MDI0MHxGT1JNX1NUUklORyksCi0gICAgQVRfcHJvZHVjZXIJCQk9ICgweDAyNTB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3Byb2dyYW0JCQk9ICgweDAyMzB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3Byb3RlY3RlZAkJPSAoMHgwMjYwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9wcm90b3R5cGVkCQk9ICgweDAyNzB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3B1YmxpYwkJCT0gKDB4MDI4MHxGT1JNX1NUUklORyksCi0gICAgQVRfcHVyZV92aXJ0dWFsCQk9ICgweDAyOTB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3JldHVybl9hZGRyCQk9ICgweDAyYTB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2Fic3RyYWN0X29yaWdpbgkJPSAoMHgwMmIwfEZPUk1fUkVGKSwKLSAgICBBVF9zdGFydF9zY29wZQkJPSAoMHgwMmMwfEZPUk1fREFUQTQpLAotICAgIEFUX3N0cmlkZV9zaXplCQk9ICgweDAyZTB8Rk9STV9EQVRBNCksCi0gICAgICAgIEFUX3VwcGVyX2JvdW5kX3JlZgk9ICgweDAyZjB8Rk9STV9SRUYpLAotICAgICAgICBBVF91cHBlcl9ib3VuZF9kYXRhMgk9ICgweDAyZjB8Rk9STV9EQVRBMiksCi0gICAgICAgIEFUX3VwcGVyX2JvdW5kX2RhdGE0CT0gKDB4MDJmMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfdXBwZXJfYm91bmRfZGF0YTgJPSAoMHgwMmYwfEZPUk1fREFUQTgpLAotICAgIEFUX3ZpcnR1YWwJCQk9ICgweDAzMDB8Rk9STV9TVFJJTkcpLAotCi0gICAgLyogR05VIGV4dGVuc2lvbnMuICAqLwotCi0gICAgQVRfc2ZfbmFtZXMJCQk9ICgweDgwMDB8Rk9STV9EQVRBNCksCi0gICAgQVRfc3JjX2luZm8JCQk9ICgweDgwMTB8Rk9STV9EQVRBNCksCi0gICAgQVRfbWFjX2luZm8JCQk9ICgweDgwMjB8Rk9STV9EQVRBNCksCi0gICAgQVRfc3JjX2Nvb3JkcwkJPSAoMHg4MDMwfEZPUk1fREFUQTQpLAotICAgIEFUX2JvZHlfYmVnaW4JCT0gKDB4ODA0MHxGT1JNX0FERFIpLAotICAgIEFUX2JvZHlfZW5kCQkJPSAoMHg4MDUwfEZPUk1fQUREUikKLX07Ci0KLSNkZWZpbmUgQVRfbG9fdXNlcgkweDgwMDAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgQVRfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIExvY2F0aW9uIGF0b20gbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9sb2NhdGlvbl9hdG9tIHsKLSAgICBPUF9SRUcJPSAweDAxLAotICAgIE9QX0JBU0VSRUcJPSAweDAyLAotICAgIE9QX0FERFIJPSAweDAzLAotICAgIE9QX0NPTlNUCT0gMHgwNCwKLSAgICBPUF9ERVJFRjIJPSAweDA1LAotICAgIE9QX0RFUkVGNAk9IDB4MDYsCi0gICAgT1BfQURECT0gMHgwNwotfTsKLQotI2RlZmluZSBPUF9MT19VU0VSCTB4ODAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgT1BfSElfVVNFUgkweGZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBGdW5kYW1lbnRhbCB0eXBlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSB7Ci0gICAgRlRfY2hhcgkJPSAweDAwMDEsCi0gICAgRlRfc2lnbmVkX2NoYXIJPSAweDAwMDIsCi0gICAgRlRfdW5zaWduZWRfY2hhcgk9IDB4MDAwMywKLSAgICBGVF9zaG9ydAkJPSAweDAwMDQsCi0gICAgRlRfc2lnbmVkX3Nob3J0CT0gMHgwMDA1LAotICAgIEZUX3Vuc2lnbmVkX3Nob3J0CT0gMHgwMDA2LAotICAgIEZUX2ludGVnZXIJCT0gMHgwMDA3LAotICAgIEZUX3NpZ25lZF9pbnRlZ2VyCT0gMHgwMDA4LAotICAgIEZUX3Vuc2lnbmVkX2ludGVnZXIJPSAweDAwMDksCi0gICAgRlRfbG9uZwkJPSAweDAwMGEsCi0gICAgRlRfc2lnbmVkX2xvbmcJPSAweDAwMGIsCi0gICAgRlRfdW5zaWduZWRfbG9uZwk9IDB4MDAwYywKLSAgICBGVF9wb2ludGVyCQk9IDB4MDAwZCwgIC8qIGFuIGFsaWFzIGZvciAodm9pZCAqKSAqLwotICAgIEZUX2Zsb2F0CQk9IDB4MDAwZSwKLSAgICBGVF9kYmxfcHJlY19mbG9hdAk9IDB4MDAwZiwKLSAgICBGVF9leHRfcHJlY19mbG9hdAk9IDB4MDAxMCwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9jb21wbGV4CQk9IDB4MDAxMSwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9kYmxfcHJlY19jb21wbGV4CT0gMHgwMDEyLCAgLyogYnJlYWtzICJjbGFzc2ljIiBzdnI0IFNEQiAqLwotCQkJLyogMHgwMDEzIC0tIHJlc2VydmVkICovCi0gICAgRlRfdm9pZAkJPSAweDAwMTQsCi0gICAgRlRfYm9vbGVhbgkJPSAweDAwMTUsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCi0gICAgRlRfZXh0X3ByZWNfY29tcGxleAk9IDB4MDAxNiwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLSAgICBGVF9sYWJlbAkJPSAweDAwMTcsCi0gIAotICAgIC8qIEdOVSBleHRlbnNpb25zCi0gICAgICAgVGhlIGxvdyBvcmRlciBieXRlIG11c3QgaW5kaWNhdGUgdGhlIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIHR5cGUuCi0gICAgICAgQWxsIG9mIHRoZXNlIHR5cGVzIHdpbGwgcHJvYmFibHkgYnJlYWsgImNsYXNzaWMiIHN2cjQgU0RCICovCi0KLSAgICBGVF9sb25nX2xvbmcJPSAweDgwMDgsCi0gICAgRlRfc2lnbmVkX2xvbmdfbG9uZwk9IDB4ODEwOCwKLSAgICBGVF91bnNpZ25lZF9sb25nX2xvbmcgPSAweDgyMDgsCi0KLSAgICBGVF9pbnQ4CQk9IDB4OTAwMSwKLSAgICBGVF9zaWduZWRfaW50OAk9IDB4OTEwMSwKLSAgICBGVF91bnNpZ25lZF9pbnQ4CT0gMHg5MjAxLAotICAgIEZUX2ludDE2CQk9IDB4OTMwMiwKLSAgICBGVF9zaWduZWRfaW50MTYJPSAweDk0MDIsCi0gICAgRlRfdW5zaWduZWRfaW50MTYJPSAweDk1MDIsCi0gICAgRlRfaW50MzIJCT0gMHg5NjA0LAotICAgIEZUX3NpZ25lZF9pbnQzMgk9IDB4OTcwNCwKLSAgICBGVF91bnNpZ25lZF9pbnQzMgk9IDB4OTgwNCwKLSAgICBGVF9pbnQ2NAkJPSAweDk5MDgsCi0gICAgRlRfc2lnbmVkX2ludDY0CT0gMHg5YTA4LAotICAgIEZUX3Vuc2lnbmVkX2ludDY0CT0gMHg5YjA4LAotCi0gICAgRlRfcmVhbDMyCQk9IDB4YTAwNCwKLSAgICBGVF9yZWFsNjQJCT0gMHhhMTA4LAotICAgIEZUX3JlYWw5NgkJPSAweGEyMGMsCi0gICAgRlRfcmVhbDEyOAkJPSAweGEzMTAKLX07Ci0KLSNkZWZpbmUgRlRfbG9fdXNlcgkweDgwMDAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgRlRfaGlfdXNlcgkweGZmZmYgIC8qIGltcGxlbWVudGF0aW9uIGRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIFR5cGUgbW9kaWZpZXIgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl90eXBlX21vZGlmaWVyIHsKLSAgICBNT0RfcG9pbnRlcl90bwk9IDB4MDEsCi0gICAgTU9EX3JlZmVyZW5jZV90bwk9IDB4MDIsCi0gICAgTU9EX2NvbnN0CQk9IDB4MDMsCi0gICAgTU9EX3ZvbGF0aWxlCT0gMHgwNAotfTsKLQotI2RlZmluZSBNT0RfbG9fdXNlcgkweDgwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIE1PRF9oaV91c2VyCTB4ZmYgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2UgZW5kICovCi0KLS8qIEFycmF5IG9yZGVyaW5nIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfYXJyYXlfZGltX29yZGVyaW5nIHsKLSAgICBPUkRfcm93X21ham9yCT0gMCwKLSAgICBPUkRfY29sX21ham9yCT0gMQotfTsKLQotLyogQXJyYXkgc3Vic2NyaXB0IGZvcm1hdCBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX3N1YnNjcl9kYXRhX2Zvcm1hdHMgewotICAgIEZNVF9GVF9DX0MJPSAweDAsCi0gICAgRk1UX0ZUX0NfWAk9IDB4MSwKLSAgICBGTVRfRlRfWF9DCT0gMHgyLAotICAgIEZNVF9GVF9YX1gJPSAweDMsCi0gICAgRk1UX1VUX0NfQwk9IDB4NCwKLSAgICBGTVRfVVRfQ19YCT0gMHg1LAotICAgIEZNVF9VVF9YX0MJPSAweDYsCi0gICAgRk1UX1VUX1hfWAk9IDB4NywKLSAgICBGTVRfRVQJPSAweDgKLX07Ci0KLS8qIERlcml2ZWQgZnJvbSBhYm92ZSBmb3IgZWFzZSBvZiB1c2UuICAqLwotCi0jZGVmaW5lIEZNVF9DT0RFKF9GVU5EQU1FTlRBTF9UWVBFX1AsIF9VQl9DT05TVF9QLCBfTEJfQ09OU1RfUCkgXAotICgoKF9GVU5EQU1FTlRBTF9UWVBFX1ApID8gMCA6IDQpCVwKLSAgfCAoKF9VQl9DT05TVF9QKSA/IDAgOiAyKQkJXAotICB8ICgoX0xCX0NPTlNUX1ApID8gMCA6IDEpKQotCi0vKiBTb3VyY2UgbGFuZ3VhZ2UgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9zb3VyY2VfbGFuZ3VhZ2UgewotICAgIExBTkdfQzg5CQk9IDB4MDAwMDAwMDEsCi0gICAgTEFOR19DCQk9IDB4MDAwMDAwMDIsCi0gICAgTEFOR19BREE4MwkJPSAweDAwMDAwMDAzLAotICAgIExBTkdfQ19QTFVTX1BMVVMJPSAweDAwMDAwMDA0LAotICAgIExBTkdfQ09CT0w3NAk9IDB4MDAwMDAwMDUsCi0gICAgTEFOR19DT0JPTDg1CT0gMHgwMDAwMDAwNiwKLSAgICBMQU5HX0ZPUlRSQU43Nwk9IDB4MDAwMDAwMDcsCi0gICAgTEFOR19GT1JUUkFOOTAJPSAweDAwMDAwMDA4LAotICAgIExBTkdfUEFTQ0FMODMJPSAweDAwMDAwMDA5LAotICAgIExBTkdfTU9EVUxBMgk9IDB4MDAwMDAwMGEsCi0KLSAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLwotCi0gICAgTEFOR19DSElMTAkJPSAweDAwMDA5YWYzLAkvKiByYW5kb20gdmFsdWUgZm9yIEdOVSBDaGlsbCAqLwotICAgIExBTkdfSkFWQQkJPSAweDAwMDA5YWY0ICAgIC8qIHJhbmRvbSB2YWx1ZSArIDEgZm9yIEdOVSBKYXZhICovCi19OwotCi0jZGVmaW5lIExBTkdfbG9fdXNlcgkweDAwMDA4MDAwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIExBTkdfaGlfdXNlcgkweDAwMDBmZmZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBOYW1lcyBhbmQgY29kZXMgZm9yIEdOVSAibWFjaW5mbyIgZXh0ZW5zaW9uLiAgKi8KLQotZW51bSBkd2FyZl9tYWNpbmZvX3JlY29yZF90eXBlIHsKLSAgICBNQUNJTkZPX3N0YXJ0CT0gJ3MnLAotICAgIE1BQ0lORk9fcmVzdW1lCT0gJ3InLAotICAgIE1BQ0lORk9fZGVmaW5lCT0gJ2QnLAotICAgIE1BQ0lORk9fdW5kZWYJPSAndScKLX07Ci0KLSNlbmRpZiAvKiBfRUxGX0RXQVJGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2R3YXJmMi5oIGIvaW5jbHVkZS9lbGYvZHdhcmYyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZDRmYTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvZHdhcmYyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzggKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucyBvZiBjb2RlcyByZWxhdGluZyB0byB0aGUgRFdBUkYgc3ltYm9saWMKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTUsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgR2FyeSBGdW5jayAoZ2FyeUBpbnRyZXBpZC5jb20pIFRoZSBBZGEgSm9pbnQgUHJvZ3JhbQotICAgT2ZmaWNlIChBSlBPKSwgRmxvcmlkYSBTdGF0ZSBVbnZpdmVyc2l0eSBhbmQgU2lsaWNvbiBHcmFwaGljcyBJbmMuCi0gICBwcm92aWRlZCBzdXBwb3J0IGZvciB0aGlzIGVmZm9ydCAtLSBKdW5lIDIxLCAxOTk1LgotCi0gICBEZXJpdmVkIGZyb20gdGhlIERXQVJGIDEgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBieSBSb24gR3VpbG1ldHRlCi0gICAocmZnQG5ldGNvbS5jb20pLCBOb3ZlbWJlciAxOTkwLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0KLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgRFdBUkYgc3BlY2lmaWNhdGlvbiAoYSBwdWJsaWMgZG9jdW1lbnQpCi0gICBSZXZpc2lvbiAyLjAuMCAoSnVseSAyNywgMTk5MykgZGV2ZWxvcGVkIGJ5IHRoZSBVTklYIEludGVybmF0aW9uYWwKLSAgIFByb2dyYW1taW5nIExhbmd1YWdlcyBTcGVjaWFsIEludGVyZXN0IEdyb3VwIChVSS9QTFNJRykgYW5kIGRpc3RyaWJ1dGVkCi0gICBieSBVTklYIEludGVybmF0aW9uYWwuICBDb3BpZXMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGFyZSBhdmFpbGFibGUgZnJvbQotICAgVU5JWCBJbnRlcm5hdGlvbmFsLCAyMCBXYXRlcnZpZXcgQm91bGV2YXJkLCBQYXJzaXBwYW55LCBOSiwgMDcwNTQuICAqLwotCi0jaWZuZGVmIF9FTEZfRFdBUkYyX0gKLSNkZWZpbmUgX0VMRl9EV0FSRjJfSAotCi0vKiBTdHJ1Y3R1cmUgZm91bmQgaW4gdGhlIC5kZWJ1Z19saW5lIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciBsaV9sZW5ndGggICAgICAgICAgWzRdOwotICB1bnNpZ25lZCBjaGFyIGxpX3ZlcnNpb24gICAgICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfcHJvbG9ndWVfbGVuZ3RoIFs0XTsKLSAgdW5zaWduZWQgY2hhciBsaV9taW5faW5zbl9sZW5ndGggWzFdOwotICB1bnNpZ25lZCBjaGFyIGxpX2RlZmF1bHRfaXNfc3RtdCBbMV07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfbGluZV9iYXNlICAgICAgIFsxXTsKLSAgdW5zaWduZWQgY2hhciBsaV9saW5lX3JhbmdlICAgICAgWzFdOwotICB1bnNpZ25lZCBjaGFyIGxpX29wY29kZV9iYXNlICAgICBbMV07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfTGluZUluZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIGxpX2xlbmd0aDsKLSAgdW5zaWduZWQgc2hvcnQgbGlfdmVyc2lvbjsKLSAgdW5zaWduZWQgaW50ICAgbGlfcHJvbG9ndWVfbGVuZ3RoOwotICB1bnNpZ25lZCBjaGFyICBsaV9taW5faW5zbl9sZW5ndGg7Ci0gIHVuc2lnbmVkIGNoYXIgIGxpX2RlZmF1bHRfaXNfc3RtdDsKLSAgaW50ICAgICAgICAgICAgbGlfbGluZV9iYXNlOwotICB1bnNpZ25lZCBjaGFyICBsaV9saW5lX3JhbmdlOwotICB1bnNpZ25lZCBjaGFyICBsaV9vcGNvZGVfYmFzZTsKLX0KLURXQVJGMl9JbnRlcm5hbF9MaW5lSW5mbzsKLQotLyogU3RydWN0dXJlIGZvdW5kIGluIC5kZWJ1Z19wdWJuYW1lcyBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgcG5fbGVuZ3RoICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fdmVyc2lvbiBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fb2Zmc2V0ICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgcG5fc2l6ZSAgICBbNF07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfUHViTmFtZXM7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIHBuX2xlbmd0aDsKLSAgdW5zaWduZWQgc2hvcnQgcG5fdmVyc2lvbjsKLSAgdW5zaWduZWQgbG9uZyAgcG5fb2Zmc2V0OwotICB1bnNpZ25lZCBsb25nICBwbl9zaXplOwotfQotRFdBUkYyX0ludGVybmFsX1B1Yk5hbWVzOwotCi0vKiBTdHJjdXR1cmUgZm91bmQgaW4gLmRlYnVnX2luZm8gc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyICBjdV9sZW5ndGggICAgICAgIFs0XTsKLSAgdW5zaWduZWQgY2hhciAgY3VfdmVyc2lvbiAgICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgIGN1X2FiYnJldl9vZmZzZXQgWzRdOwotICB1bnNpZ25lZCBjaGFyICBjdV9wb2ludGVyX3NpemUgIFsxXTsKLX0KLURXQVJGMl9FeHRlcm5hbF9Db21wVW5pdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgbG9uZyAgY3VfbGVuZ3RoOwotICB1bnNpZ25lZCBzaG9ydCBjdV92ZXJzaW9uOwotICB1bnNpZ25lZCBsb25nICBjdV9hYmJyZXZfb2Zmc2V0OwotICB1bnNpZ25lZCBjaGFyICBjdV9wb2ludGVyX3NpemU7Ci19Ci1EV0FSRjJfSW50ZXJuYWxfQ29tcFVuaXQ7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX2xlbmd0aCAgICAgICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3ZlcnNpb24gICAgICBbMl07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX2luZm9fb2Zmc2V0ICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3BvaW50ZXJfc2l6ZSBbMV07Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3NlZ21lbnRfc2l6ZSBbMV07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfQVJhbmdlOwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nICBhcl9sZW5ndGg7Ci0gIHVuc2lnbmVkIHNob3J0IGFyX3ZlcnNpb247Ci0gIHVuc2lnbmVkIGxvbmcgIGFyX2luZm9fb2Zmc2V0OwotICB1bnNpZ25lZCBjaGFyICBhcl9wb2ludGVyX3NpemU7Ci0gIHVuc2lnbmVkIGNoYXIgIGFyX3NlZ21lbnRfc2l6ZTsKLX0KLURXQVJGMl9JbnRlcm5hbF9BUmFuZ2U7Ci0KLQotLyogVGFnIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfdGFnCi0gIHsKLSAgICBEV19UQUdfcGFkZGluZyA9IDB4MDAsCi0gICAgRFdfVEFHX2FycmF5X3R5cGUgPSAweDAxLAotICAgIERXX1RBR19jbGFzc190eXBlID0gMHgwMiwKLSAgICBEV19UQUdfZW50cnlfcG9pbnQgPSAweDAzLAotICAgIERXX1RBR19lbnVtZXJhdGlvbl90eXBlID0gMHgwNCwKLSAgICBEV19UQUdfZm9ybWFsX3BhcmFtZXRlciA9IDB4MDUsCi0gICAgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uID0gMHgwOCwKLSAgICBEV19UQUdfbGFiZWwgPSAweDBhLAotICAgIERXX1RBR19sZXhpY2FsX2Jsb2NrID0gMHgwYiwKLSAgICBEV19UQUdfbWVtYmVyID0gMHgwZCwKLSAgICBEV19UQUdfcG9pbnRlcl90eXBlID0gMHgwZiwKLSAgICBEV19UQUdfcmVmZXJlbmNlX3R5cGUgPSAweDEwLAotICAgIERXX1RBR19jb21waWxlX3VuaXQgPSAweDExLAotICAgIERXX1RBR19zdHJpbmdfdHlwZSA9IDB4MTIsCi0gICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlID0gMHgxMywKLSAgICBEV19UQUdfc3Vicm91dGluZV90eXBlID0gMHgxNSwKLSAgICBEV19UQUdfdHlwZWRlZiA9IDB4MTYsCi0gICAgRFdfVEFHX3VuaW9uX3R5cGUgPSAweDE3LAotICAgIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzID0gMHgxOCwKLSAgICBEV19UQUdfdmFyaWFudCA9IDB4MTksCi0gICAgRFdfVEFHX2NvbW1vbl9ibG9jayA9IDB4MWEsCi0gICAgRFdfVEFHX2NvbW1vbl9pbmNsdXNpb24gPSAweDFiLAotICAgIERXX1RBR19pbmhlcml0YW5jZSA9IDB4MWMsCi0gICAgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSA9IDB4MWQsCi0gICAgRFdfVEFHX21vZHVsZSA9IDB4MWUsCi0gICAgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSA9IDB4MWYsCi0gICAgRFdfVEFHX3NldF90eXBlID0gMHgyMCwKLSAgICBEV19UQUdfc3VicmFuZ2VfdHlwZSA9IDB4MjEsCi0gICAgRFdfVEFHX3dpdGhfc3RtdCA9IDB4MjIsCi0gICAgRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbiA9IDB4MjMsCi0gICAgRFdfVEFHX2Jhc2VfdHlwZSA9IDB4MjQsCi0gICAgRFdfVEFHX2NhdGNoX2Jsb2NrID0gMHgyNSwKLSAgICBEV19UQUdfY29uc3RfdHlwZSA9IDB4MjYsCi0gICAgRFdfVEFHX2NvbnN0YW50ID0gMHgyNywKLSAgICBEV19UQUdfZW51bWVyYXRvciA9IDB4MjgsCi0gICAgRFdfVEFHX2ZpbGVfdHlwZSA9IDB4MjksCi0gICAgRFdfVEFHX2ZyaWVuZCA9IDB4MmEsCi0gICAgRFdfVEFHX25hbWVsaXN0ID0gMHgyYiwKLSAgICBEV19UQUdfbmFtZWxpc3RfaXRlbSA9IDB4MmMsCi0gICAgRFdfVEFHX3BhY2tlZF90eXBlID0gMHgyZCwKLSAgICBEV19UQUdfc3VicHJvZ3JhbSA9IDB4MmUsCi0gICAgRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW0gPSAweDJmLAotICAgIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbSA9IDB4MzAsCi0gICAgRFdfVEFHX3Rocm93bl90eXBlID0gMHgzMSwKLSAgICBEV19UQUdfdHJ5X2Jsb2NrID0gMHgzMiwKLSAgICBEV19UQUdfdmFyaWFudF9wYXJ0ID0gMHgzMywKLSAgICBEV19UQUdfdmFyaWFibGUgPSAweDM0LAotICAgIERXX1RBR192b2xhdGlsZV90eXBlID0gMHgzNSwKLSAgICAvKiBTR0kvTUlQUyBFeHRlbnNpb25zICovCi0gICAgRFdfVEFHX01JUFNfbG9vcCA9IDB4NDA4MSwKLSAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLwotICAgIERXX1RBR19mb3JtYXRfbGFiZWwgPSAweDQxMDEsCS8qIGZvciBGT1JUUkFOIDc3IGFuZCBGb3J0cmFuIDkwICovCi0gICAgRFdfVEFHX2Z1bmN0aW9uX3RlbXBsYXRlID0gMHg0MTAyLAkvKiBmb3IgQysrICovCi0gICAgRFdfVEFHX2NsYXNzX3RlbXBsYXRlID0gMHg0MTAzCS8qIGZvciBDKysgKi8KLSAgfTsKLQotI2RlZmluZSBEV19UQUdfbG9fdXNlcgkweDQwODAKLSNkZWZpbmUgRFdfVEFHX2hpX3VzZXIJMHhmZmZmCi0KLS8qIGZsYWcgdGhhdCB0ZWxscyB3aGV0aGVyIGVudHJ5IGhhcyBhIGNoaWxkIG9yIG5vdCAqLwotI2RlZmluZSBEV19jaGlsZHJlbl9ubyAgIDAKLSNkZWZpbmUJRFdfY2hpbGRyZW5feWVzICAxCi0KLS8qIEZvcm0gbmFtZXMgYW5kIGNvZGVzLiAgKi8KLWVudW0gZHdhcmZfZm9ybQotICB7Ci0gICAgRFdfRk9STV9hZGRyID0gMHgwMSwKLSAgICBEV19GT1JNX2Jsb2NrMiA9IDB4MDMsCi0gICAgRFdfRk9STV9ibG9jazQgPSAweDA0LAotICAgIERXX0ZPUk1fZGF0YTIgPSAweDA1LAotICAgIERXX0ZPUk1fZGF0YTQgPSAweDA2LAotICAgIERXX0ZPUk1fZGF0YTggPSAweDA3LAotICAgIERXX0ZPUk1fc3RyaW5nID0gMHgwOCwKLSAgICBEV19GT1JNX2Jsb2NrID0gMHgwOSwKLSAgICBEV19GT1JNX2Jsb2NrMSA9IDB4MGEsCi0gICAgRFdfRk9STV9kYXRhMSA9IDB4MGIsCi0gICAgRFdfRk9STV9mbGFnID0gMHgwYywKLSAgICBEV19GT1JNX3NkYXRhID0gMHgwZCwKLSAgICBEV19GT1JNX3N0cnAgPSAweDBlLAotICAgIERXX0ZPUk1fdWRhdGEgPSAweDBmLAotICAgIERXX0ZPUk1fcmVmX2FkZHIgPSAweDEwLAotICAgIERXX0ZPUk1fcmVmMSA9IDB4MTEsCi0gICAgRFdfRk9STV9yZWYyID0gMHgxMiwKLSAgICBEV19GT1JNX3JlZjQgPSAweDEzLAotICAgIERXX0ZPUk1fcmVmOCA9IDB4MTQsCi0gICAgRFdfRk9STV9yZWZfdWRhdGEgPSAweDE1LAotICAgIERXX0ZPUk1faW5kaXJlY3QgPSAweDE2Ci0gIH07Ci0KLS8qIEF0dHJpYnV0ZSBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX2F0dHJpYnV0ZQotICB7Ci0gICAgRFdfQVRfc2libGluZyA9IDB4MDEsCi0gICAgRFdfQVRfbG9jYXRpb24gPSAweDAyLAotICAgIERXX0FUX25hbWUgPSAweDAzLAotICAgIERXX0FUX29yZGVyaW5nID0gMHgwOSwKLSAgICBEV19BVF9zdWJzY3JfZGF0YSA9IDB4MGEsCi0gICAgRFdfQVRfYnl0ZV9zaXplID0gMHgwYiwKLSAgICBEV19BVF9iaXRfb2Zmc2V0ID0gMHgwYywKLSAgICBEV19BVF9iaXRfc2l6ZSA9IDB4MGQsCi0gICAgRFdfQVRfZWxlbWVudF9saXN0ID0gMHgwZiwKLSAgICBEV19BVF9zdG10X2xpc3QgPSAweDEwLAotICAgIERXX0FUX2xvd19wYyA9IDB4MTEsCi0gICAgRFdfQVRfaGlnaF9wYyA9IDB4MTIsCi0gICAgRFdfQVRfbGFuZ3VhZ2UgPSAweDEzLAotICAgIERXX0FUX21lbWJlciA9IDB4MTQsCi0gICAgRFdfQVRfZGlzY3IgPSAweDE1LAotICAgIERXX0FUX2Rpc2NyX3ZhbHVlID0gMHgxNiwKLSAgICBEV19BVF92aXNpYmlsaXR5ID0gMHgxNywKLSAgICBEV19BVF9pbXBvcnQgPSAweDE4LAotICAgIERXX0FUX3N0cmluZ19sZW5ndGggPSAweDE5LAotICAgIERXX0FUX2NvbW1vbl9yZWZlcmVuY2UgPSAweDFhLAotICAgIERXX0FUX2NvbXBfZGlyID0gMHgxYiwKLSAgICBEV19BVF9jb25zdF92YWx1ZSA9IDB4MWMsCi0gICAgRFdfQVRfY29udGFpbmluZ190eXBlID0gMHgxZCwKLSAgICBEV19BVF9kZWZhdWx0X3ZhbHVlID0gMHgxZSwKLSAgICBEV19BVF9pbmxpbmUgPSAweDIwLAotICAgIERXX0FUX2lzX29wdGlvbmFsID0gMHgyMSwKLSAgICBEV19BVF9sb3dlcl9ib3VuZCA9IDB4MjIsCi0gICAgRFdfQVRfcHJvZHVjZXIgPSAweDI1LAotICAgIERXX0FUX3Byb3RvdHlwZWQgPSAweDI3LAotICAgIERXX0FUX3JldHVybl9hZGRyID0gMHgyYSwKLSAgICBEV19BVF9zdGFydF9zY29wZSA9IDB4MmMsCi0gICAgRFdfQVRfc3RyaWRlX3NpemUgPSAweDJlLAotICAgIERXX0FUX3VwcGVyX2JvdW5kID0gMHgyZiwKLSAgICBEV19BVF9hYnN0cmFjdF9vcmlnaW4gPSAweDMxLAotICAgIERXX0FUX2FjY2Vzc2liaWxpdHkgPSAweDMyLAotICAgIERXX0FUX2FkZHJlc3NfY2xhc3MgPSAweDMzLAotICAgIERXX0FUX2FydGlmaWNpYWwgPSAweDM0LAotICAgIERXX0FUX2Jhc2VfdHlwZXMgPSAweDM1LAotICAgIERXX0FUX2NhbGxpbmdfY29udmVudGlvbiA9IDB4MzYsCi0gICAgRFdfQVRfY291bnQgPSAweDM3LAotICAgIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uID0gMHgzOCwKLSAgICBEV19BVF9kZWNsX2NvbHVtbiA9IDB4MzksCi0gICAgRFdfQVRfZGVjbF9maWxlID0gMHgzYSwKLSAgICBEV19BVF9kZWNsX2xpbmUgPSAweDNiLAotICAgIERXX0FUX2RlY2xhcmF0aW9uID0gMHgzYywKLSAgICBEV19BVF9kaXNjcl9saXN0ID0gMHgzZCwKLSAgICBEV19BVF9lbmNvZGluZyA9IDB4M2UsCi0gICAgRFdfQVRfZXh0ZXJuYWwgPSAweDNmLAotICAgIERXX0FUX2ZyYW1lX2Jhc2UgPSAweDQwLAotICAgIERXX0FUX2ZyaWVuZCA9IDB4NDEsCi0gICAgRFdfQVRfaWRlbnRpZmllcl9jYXNlID0gMHg0MiwKLSAgICBEV19BVF9tYWNyb19pbmZvID0gMHg0MywKLSAgICBEV19BVF9uYW1lbGlzdF9pdGVtcyA9IDB4NDQsCi0gICAgRFdfQVRfcHJpb3JpdHkgPSAweDQ1LAotICAgIERXX0FUX3NlZ21lbnQgPSAweDQ2LAotICAgIERXX0FUX3NwZWNpZmljYXRpb24gPSAweDQ3LAotICAgIERXX0FUX3N0YXRpY19saW5rID0gMHg0OCwKLSAgICBEV19BVF90eXBlID0gMHg0OSwKLSAgICBEV19BVF91c2VfbG9jYXRpb24gPSAweDRhLAotICAgIERXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlciA9IDB4NGIsCi0gICAgRFdfQVRfdmlydHVhbGl0eSA9IDB4NGMsCi0gICAgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb24gPSAweDRkLAotICAgIC8qIFNHSS9NSVBTIEV4dGVuc2lvbnMgKi8KLSAgICBEV19BVF9NSVBTX2ZkZSA9IDB4MjAwMSwKLSAgICBEV19BVF9NSVBTX2xvb3BfYmVnaW4gPSAweDIwMDIsCi0gICAgRFdfQVRfTUlQU190YWlsX2xvb3BfYmVnaW4gPSAweDIwMDMsCi0gICAgRFdfQVRfTUlQU19lcGlsb2dfYmVnaW4gPSAweDIwMDQsCi0gICAgRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3IgPSAweDIwMDUsCi0gICAgRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aCA9IDB4MjAwNiwKLSAgICBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSA9IDB4MjAwNywKLSAgICBEV19BVF9NSVBTX3N0cmlkZSA9IDB4MjAwOCwKLSAgICBEV19BVF9NSVBTX2Fic3RyYWN0X25hbWUgPSAweDIwMDksCi0gICAgRFdfQVRfTUlQU19jbG9uZV9vcmlnaW4gPSAweDIwMGEsCi0gICAgRFdfQVRfTUlQU19oYXNfaW5saW5lcyA9IDB4MjAwYiwKLSAgICAvKiBHTlUgZXh0ZW5zaW9ucy4gICovCi0gICAgRFdfQVRfc2ZfbmFtZXMgPSAweDIxMDEsCi0gICAgRFdfQVRfc3JjX2luZm8gPSAweDIxMDIsCi0gICAgRFdfQVRfbWFjX2luZm8gPSAweDIxMDMsCi0gICAgRFdfQVRfc3JjX2Nvb3JkcyA9IDB4MjEwNCwKLSAgICBEV19BVF9ib2R5X2JlZ2luID0gMHgyMTA1LAotICAgIERXX0FUX2JvZHlfZW5kID0gMHgyMTA2Ci0gIH07Ci0KLSNkZWZpbmUgRFdfQVRfbG9fdXNlcgkweDIwMDAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBEV19BVF9oaV91c2VyCTB4M2ZmMAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBMb2NhdGlvbiBhdG9tIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfbG9jYXRpb25fYXRvbQotICB7Ci0gICAgRFdfT1BfYWRkciA9IDB4MDMsCi0gICAgRFdfT1BfZGVyZWYgPSAweDA2LAotICAgIERXX09QX2NvbnN0MXUgPSAweDA4LAotICAgIERXX09QX2NvbnN0MXMgPSAweDA5LAotICAgIERXX09QX2NvbnN0MnUgPSAweDBhLAotICAgIERXX09QX2NvbnN0MnMgPSAweDBiLAotICAgIERXX09QX2NvbnN0NHUgPSAweDBjLAotICAgIERXX09QX2NvbnN0NHMgPSAweDBkLAotICAgIERXX09QX2NvbnN0OHUgPSAweDBlLAotICAgIERXX09QX2NvbnN0OHMgPSAweDBmLAotICAgIERXX09QX2NvbnN0dSA9IDB4MTAsCi0gICAgRFdfT1BfY29uc3RzID0gMHgxMSwKLSAgICBEV19PUF9kdXAgPSAweDEyLAotICAgIERXX09QX2Ryb3AgPSAweDEzLAotICAgIERXX09QX292ZXIgPSAweDE0LAotICAgIERXX09QX3BpY2sgPSAweDE1LAotICAgIERXX09QX3N3YXAgPSAweDE2LAotICAgIERXX09QX3JvdCA9IDB4MTcsCi0gICAgRFdfT1BfeGRlcmVmID0gMHgxOCwKLSAgICBEV19PUF9hYnMgPSAweDE5LAotICAgIERXX09QX2FuZCA9IDB4MWEsCi0gICAgRFdfT1BfZGl2ID0gMHgxYiwKLSAgICBEV19PUF9taW51cyA9IDB4MWMsCi0gICAgRFdfT1BfbW9kID0gMHgxZCwKLSAgICBEV19PUF9tdWwgPSAweDFlLAotICAgIERXX09QX25lZyA9IDB4MWYsCi0gICAgRFdfT1Bfbm90ID0gMHgyMCwKLSAgICBEV19PUF9vciA9IDB4MjEsCi0gICAgRFdfT1BfcGx1cyA9IDB4MjIsCi0gICAgRFdfT1BfcGx1c191Y29uc3QgPSAweDIzLAotICAgIERXX09QX3NobCA9IDB4MjQsCi0gICAgRFdfT1Bfc2hyID0gMHgyNSwKLSAgICBEV19PUF9zaHJhID0gMHgyNiwKLSAgICBEV19PUF94b3IgPSAweDI3LAotICAgIERXX09QX2JyYSA9IDB4MjgsCi0gICAgRFdfT1BfZXEgPSAweDI5LAotICAgIERXX09QX2dlID0gMHgyYSwKLSAgICBEV19PUF9ndCA9IDB4MmIsCi0gICAgRFdfT1BfbGUgPSAweDJjLAotICAgIERXX09QX2x0ID0gMHgyZCwKLSAgICBEV19PUF9uZSA9IDB4MmUsCi0gICAgRFdfT1Bfc2tpcCA9IDB4MmYsCi0gICAgRFdfT1BfbGl0MCA9IDB4MzAsCi0gICAgRFdfT1BfbGl0MSA9IDB4MzEsCi0gICAgRFdfT1BfbGl0MiA9IDB4MzIsCi0gICAgRFdfT1BfbGl0MyA9IDB4MzMsCi0gICAgRFdfT1BfbGl0NCA9IDB4MzQsCi0gICAgRFdfT1BfbGl0NSA9IDB4MzUsCi0gICAgRFdfT1BfbGl0NiA9IDB4MzYsCi0gICAgRFdfT1BfbGl0NyA9IDB4MzcsCi0gICAgRFdfT1BfbGl0OCA9IDB4MzgsCi0gICAgRFdfT1BfbGl0OSA9IDB4MzksCi0gICAgRFdfT1BfbGl0MTAgPSAweDNhLAotICAgIERXX09QX2xpdDExID0gMHgzYiwKLSAgICBEV19PUF9saXQxMiA9IDB4M2MsCi0gICAgRFdfT1BfbGl0MTMgPSAweDNkLAotICAgIERXX09QX2xpdDE0ID0gMHgzZSwKLSAgICBEV19PUF9saXQxNSA9IDB4M2YsCi0gICAgRFdfT1BfbGl0MTYgPSAweDQwLAotICAgIERXX09QX2xpdDE3ID0gMHg0MSwKLSAgICBEV19PUF9saXQxOCA9IDB4NDIsCi0gICAgRFdfT1BfbGl0MTkgPSAweDQzLAotICAgIERXX09QX2xpdDIwID0gMHg0NCwKLSAgICBEV19PUF9saXQyMSA9IDB4NDUsCi0gICAgRFdfT1BfbGl0MjIgPSAweDQ2LAotICAgIERXX09QX2xpdDIzID0gMHg0NywKLSAgICBEV19PUF9saXQyNCA9IDB4NDgsCi0gICAgRFdfT1BfbGl0MjUgPSAweDQ5LAotICAgIERXX09QX2xpdDI2ID0gMHg0YSwKLSAgICBEV19PUF9saXQyNyA9IDB4NGIsCi0gICAgRFdfT1BfbGl0MjggPSAweDRjLAotICAgIERXX09QX2xpdDI5ID0gMHg0ZCwKLSAgICBEV19PUF9saXQzMCA9IDB4NGUsCi0gICAgRFdfT1BfbGl0MzEgPSAweDRmLAotICAgIERXX09QX3JlZzAgPSAweDUwLAotICAgIERXX09QX3JlZzEgPSAweDUxLAotICAgIERXX09QX3JlZzIgPSAweDUyLAotICAgIERXX09QX3JlZzMgPSAweDUzLAotICAgIERXX09QX3JlZzQgPSAweDU0LAotICAgIERXX09QX3JlZzUgPSAweDU1LAotICAgIERXX09QX3JlZzYgPSAweDU2LAotICAgIERXX09QX3JlZzcgPSAweDU3LAotICAgIERXX09QX3JlZzggPSAweDU4LAotICAgIERXX09QX3JlZzkgPSAweDU5LAotICAgIERXX09QX3JlZzEwID0gMHg1YSwKLSAgICBEV19PUF9yZWcxMSA9IDB4NWIsCi0gICAgRFdfT1BfcmVnMTIgPSAweDVjLAotICAgIERXX09QX3JlZzEzID0gMHg1ZCwKLSAgICBEV19PUF9yZWcxNCA9IDB4NWUsCi0gICAgRFdfT1BfcmVnMTUgPSAweDVmLAotICAgIERXX09QX3JlZzE2ID0gMHg2MCwKLSAgICBEV19PUF9yZWcxNyA9IDB4NjEsCi0gICAgRFdfT1BfcmVnMTggPSAweDYyLAotICAgIERXX09QX3JlZzE5ID0gMHg2MywKLSAgICBEV19PUF9yZWcyMCA9IDB4NjQsCi0gICAgRFdfT1BfcmVnMjEgPSAweDY1LAotICAgIERXX09QX3JlZzIyID0gMHg2NiwKLSAgICBEV19PUF9yZWcyMyA9IDB4NjcsCi0gICAgRFdfT1BfcmVnMjQgPSAweDY4LAotICAgIERXX09QX3JlZzI1ID0gMHg2OSwKLSAgICBEV19PUF9yZWcyNiA9IDB4NmEsCi0gICAgRFdfT1BfcmVnMjcgPSAweDZiLAotICAgIERXX09QX3JlZzI4ID0gMHg2YywKLSAgICBEV19PUF9yZWcyOSA9IDB4NmQsCi0gICAgRFdfT1BfcmVnMzAgPSAweDZlLAotICAgIERXX09QX3JlZzMxID0gMHg2ZiwKLSAgICBEV19PUF9icmVnMCA9IDB4NzAsCi0gICAgRFdfT1BfYnJlZzEgPSAweDcxLAotICAgIERXX09QX2JyZWcyID0gMHg3MiwKLSAgICBEV19PUF9icmVnMyA9IDB4NzMsCi0gICAgRFdfT1BfYnJlZzQgPSAweDc0LAotICAgIERXX09QX2JyZWc1ID0gMHg3NSwKLSAgICBEV19PUF9icmVnNiA9IDB4NzYsCi0gICAgRFdfT1BfYnJlZzcgPSAweDc3LAotICAgIERXX09QX2JyZWc4ID0gMHg3OCwKLSAgICBEV19PUF9icmVnOSA9IDB4NzksCi0gICAgRFdfT1BfYnJlZzEwID0gMHg3YSwKLSAgICBEV19PUF9icmVnMTEgPSAweDdiLAotICAgIERXX09QX2JyZWcxMiA9IDB4N2MsCi0gICAgRFdfT1BfYnJlZzEzID0gMHg3ZCwKLSAgICBEV19PUF9icmVnMTQgPSAweDdlLAotICAgIERXX09QX2JyZWcxNSA9IDB4N2YsCi0gICAgRFdfT1BfYnJlZzE2ID0gMHg4MCwKLSAgICBEV19PUF9icmVnMTcgPSAweDgxLAotICAgIERXX09QX2JyZWcxOCA9IDB4ODIsCi0gICAgRFdfT1BfYnJlZzE5ID0gMHg4MywKLSAgICBEV19PUF9icmVnMjAgPSAweDg0LAotICAgIERXX09QX2JyZWcyMSA9IDB4ODUsCi0gICAgRFdfT1BfYnJlZzIyID0gMHg4NiwKLSAgICBEV19PUF9icmVnMjMgPSAweDg3LAotICAgIERXX09QX2JyZWcyNCA9IDB4ODgsCi0gICAgRFdfT1BfYnJlZzI1ID0gMHg4OSwKLSAgICBEV19PUF9icmVnMjYgPSAweDhhLAotICAgIERXX09QX2JyZWcyNyA9IDB4OGIsCi0gICAgRFdfT1BfYnJlZzI4ID0gMHg4YywKLSAgICBEV19PUF9icmVnMjkgPSAweDhkLAotICAgIERXX09QX2JyZWczMCA9IDB4OGUsCi0gICAgRFdfT1BfYnJlZzMxID0gMHg4ZiwKLSAgICBEV19PUF9yZWd4ID0gMHg5MCwKLSAgICBEV19PUF9mYnJlZyA9IDB4OTEsCi0gICAgRFdfT1BfYnJlZ3ggPSAweDkyLAotICAgIERXX09QX3BpZWNlID0gMHg5MywKLSAgICBEV19PUF9kZXJlZl9zaXplID0gMHg5NCwKLSAgICBEV19PUF94ZGVyZWZfc2l6ZSA9IDB4OTUsCi0gICAgRFdfT1Bfbm9wID0gMHg5NgotICB9OwotCi0jZGVmaW5lIERXX09QX2xvX3VzZXIJMHg4MAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIERXX09QX2hpX3VzZXIJMHhmZgkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBUeXBlIGVuY29kaW5ncy4gICovCi0KLWVudW0gZHdhcmZfdHlwZQotICB7Ci0gICAgRFdfQVRFX3ZvaWQgPSAweDAsCi0gICAgRFdfQVRFX2FkZHJlc3MgPSAweDEsCi0gICAgRFdfQVRFX2Jvb2xlYW4gPSAweDIsCi0gICAgRFdfQVRFX2NvbXBsZXhfZmxvYXQgPSAweDMsCi0gICAgRFdfQVRFX2Zsb2F0ID0gMHg0LAotICAgIERXX0FURV9zaWduZWQgPSAweDUsCi0gICAgRFdfQVRFX3NpZ25lZF9jaGFyID0gMHg2LAotICAgIERXX0FURV91bnNpZ25lZCA9IDB4NywKLSAgICBEV19BVEVfdW5zaWduZWRfY2hhciA9IDB4OAotICB9OwotCi0jZGVmaW5lCURXX0FURV9sb191c2VyIDB4ODAKLSNkZWZpbmUJRFdfQVRFX2hpX3VzZXIgMHhmZgotCi0vKiBBcnJheSBvcmRlcmluZyBuYW1lcyBhbmQgY29kZXMuICAqLwotZW51bSBkd2FyZl9hcnJheV9kaW1fb3JkZXJpbmcKLSAgewotICAgIERXX09SRF9yb3dfbWFqb3IgPSAwLAotICAgIERXX09SRF9jb2xfbWFqb3IgPSAxCi0gIH07Ci0KLS8qIGFjY2VzcyBhdHRyaWJ1dGUgKi8KLWVudW0gZHdhcmZfYWNjZXNzX2F0dHJpYnV0ZQotICB7Ci0gICAgRFdfQUNDRVNTX3B1YmxpYyA9IDEsCi0gICAgRFdfQUNDRVNTX3Byb3RlY3RlZCA9IDIsCi0gICAgRFdfQUNDRVNTX3ByaXZhdGUgPSAzCi0gIH07Ci0KLS8qIHZpc2liaWxpdHkgKi8KLWVudW0gZHdhcmZfdmlzaWJpbGl0eV9hdHRyaWJ1dGUKLSAgewotICAgIERXX1ZJU19sb2NhbCA9IDEsCi0gICAgRFdfVklTX2V4cG9ydGVkID0gMiwKLSAgICBEV19WSVNfcXVhbGlmaWVkID0gMwotICB9OwotCi0vKiB2aXJ0dWFsaXR5ICovCi1lbnVtIGR3YXJmX3ZpcnR1YWxpdHlfYXR0cmlidXRlCi0gIHsKLSAgICBEV19WSVJUVUFMSVRZX25vbmUgPSAwLAotICAgIERXX1ZJUlRVQUxJVFlfdmlydHVhbCA9IDEsCi0gICAgRFdfVklSVFVBTElUWV9wdXJlX3ZpcnR1YWwgPSAyCi0gIH07Ci0KLS8qIGNhc2Ugc2Vuc2l0aXZpdHkgKi8KLWVudW0gZHdhcmZfaWRfY2FzZQotICB7Ci0gICAgRFdfSURfY2FzZV9zZW5zaXRpdmUgPSAwLAotICAgIERXX0lEX3VwX2Nhc2UgPSAxLAotICAgIERXX0lEX2Rvd25fY2FzZSA9IDIsCi0gICAgRFdfSURfY2FzZV9pbnNlbnNpdGl2ZSA9IDMKLSAgfTsKLQotLyogY2FsbGluZyBjb252ZW50aW9uICovCi1lbnVtIGR3YXJmX2NhbGxpbmdfY29udmVudGlvbgotICB7Ci0gICAgRFdfQ0Nfbm9ybWFsID0gMHgxLAotICAgIERXX0NDX3Byb2dyYW0gPSAweDIsCi0gICAgRFdfQ0Nfbm9jYWxsID0gMHgzCi0gIH07Ci0KLSNkZWZpbmUgRFdfQ0NfbG9fdXNlciAweDQwCi0jZGVmaW5lIERXX0NDX2hpX3VzZXIgMHhmZgotCi0vKiBpbmxpbmUgYXR0cmlidXRlICovCi1lbnVtIGR3YXJmX2lubGluZV9hdHRyaWJ1dGUKLSAgewotICAgIERXX0lOTF9ub3RfaW5saW5lZCA9IDAsCi0gICAgRFdfSU5MX2lubGluZWQgPSAxLAotICAgIERXX0lOTF9kZWNsYXJlZF9ub3RfaW5saW5lZCA9IDIsCi0gICAgRFdfSU5MX2RlY2xhcmVkX2lubGluZWQgPSAzCi0gIH07Ci0KLS8qIGRlc2NyaW1pbmFudCBsaXN0cyAqLwotZW51bSBkd2FyZl9kZXNjcmltX2xpc3QKLSAgewotICAgIERXX0RTQ19sYWJlbCA9IDAsCi0gICAgRFdfRFNDX3JhbmdlID0gMQotICB9OwotCi0vKiBsaW5lIG51bWJlciBvcGNvZGVzICovCi1lbnVtIGR3YXJmX2xpbmVfbnVtYmVyX29wcwotICB7Ci0gICAgRFdfTE5TX2V4dGVuZGVkX29wID0gMCwKLSAgICBEV19MTlNfY29weSA9IDEsCi0gICAgRFdfTE5TX2FkdmFuY2VfcGMgPSAyLAotICAgIERXX0xOU19hZHZhbmNlX2xpbmUgPSAzLAotICAgIERXX0xOU19zZXRfZmlsZSA9IDQsCi0gICAgRFdfTE5TX3NldF9jb2x1bW4gPSA1LAotICAgIERXX0xOU19uZWdhdGVfc3RtdCA9IDYsCi0gICAgRFdfTE5TX3NldF9iYXNpY19ibG9jayA9IDcsCi0gICAgRFdfTE5TX2NvbnN0X2FkZF9wYyA9IDgsCi0gICAgRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGMgPSA5Ci0gIH07Ci0KLS8qIGxpbmUgbnVtYmVyIGV4dGVuZGVkIG9wY29kZXMgKi8KLWVudW0gZHdhcmZfbGluZV9udW1iZXJfeF9vcHMKLSAgewotICAgIERXX0xORV9lbmRfc2VxdWVuY2UgPSAxLAotICAgIERXX0xORV9zZXRfYWRkcmVzcyA9IDIsCi0gICAgRFdfTE5FX2RlZmluZV9maWxlID0gMwotICB9OwotCi0vKiBjYWxsIGZyYW1lIGluZm9ybWF0aW9uICovCi1lbnVtIGR3YXJmX2NhbGxfZnJhbWVfaW5mbwotICB7Ci0gICAgRFdfQ0ZBX2FkdmFuY2VfbG9jID0gMHg0MCwKLSAgICBEV19DRkFfb2Zmc2V0ID0gMHg4MCwKLSAgICBEV19DRkFfcmVzdG9yZSA9IDB4YzAsCi0gICAgRFdfQ0ZBX25vcCA9IDB4MDAsCi0gICAgRFdfQ0ZBX3NldF9sb2MgPSAweDAxLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzEgPSAweDAyLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzIgPSAweDAzLAotICAgIERXX0NGQV9hZHZhbmNlX2xvYzQgPSAweDA0LAotICAgIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWQgPSAweDA1LAotICAgIERXX0NGQV9yZXN0b3JlX2V4dGVuZGVkID0gMHgwNiwKLSAgICBEV19DRkFfdW5kZWZpbmVkID0gMHgwNywKLSAgICBEV19DRkFfc2FtZV92YWx1ZSA9IDB4MDgsCi0gICAgRFdfQ0ZBX3JlZ2lzdGVyID0gMHgwOSwKLSAgICBEV19DRkFfcmVtZW1iZXJfc3RhdGUgPSAweDBhLAotICAgIERXX0NGQV9yZXN0b3JlX3N0YXRlID0gMHgwYiwKLSAgICBEV19DRkFfZGVmX2NmYSA9IDB4MGMsCi0gICAgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgPSAweDBkLAotICAgIERXX0NGQV9kZWZfY2ZhX29mZnNldCA9IDB4MGUsCi0gICAgLyogU0dJL01JUFMgc3BlY2lmaWMgKi8KLSAgICBEV19DRkFfTUlQU19hZHZhbmNlX2xvYzggPSAweDFkCi0gIH07Ci0KLSNkZWZpbmUgRFdfQ0lFX0lECSAgMHhmZmZmZmZmZgotI2RlZmluZSBEV19DSUVfVkVSU0lPTgkgIDEKLQotI2RlZmluZSBEV19DRkFfZXh0ZW5kZWQgICAwCi0jZGVmaW5lIERXX0NGQV9sb3dfdXNlciAgIDB4MWMKLSNkZWZpbmUgRFdfQ0ZBX2hpZ2hfdXNlciAgMHgzZgotCi0jZGVmaW5lIERXX0NISUxEUkVOX25vCQkgICAgIDB4MDAKLSNkZWZpbmUgRFdfQ0hJTERSRU5feWVzCQkgICAgIDB4MDEKLQotI2RlZmluZSBEV19BRERSX25vbmUJCTAKLQotLyogU291cmNlIGxhbmd1YWdlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfc291cmNlX2xhbmd1YWdlCi0gIHsKLSAgICBEV19MQU5HX0M4OSA9IDB4MDAwMSwKLSAgICBEV19MQU5HX0MgPSAweDAwMDIsCi0gICAgRFdfTEFOR19BZGE4MyA9IDB4MDAwMywKLSAgICBEV19MQU5HX0NfcGx1c19wbHVzID0gMHgwMDA0LAotICAgIERXX0xBTkdfQ29ib2w3NCA9IDB4MDAwNSwKLSAgICBEV19MQU5HX0NvYm9sODUgPSAweDAwMDYsCi0gICAgRFdfTEFOR19Gb3J0cmFuNzcgPSAweDAwMDcsCi0gICAgRFdfTEFOR19Gb3J0cmFuOTAgPSAweDAwMDgsCi0gICAgRFdfTEFOR19QYXNjYWw4MyA9IDB4MDAwOSwKLSAgICBEV19MQU5HX01vZHVsYTIgPSAweDAwMGEsCi0gICAgRFdfTEFOR19KYXZhID0gMHg5YWY0LAotICAgIERXX0xBTkdfTWlwc19Bc3NlbWJsZXIgPSAweDgwMDEKLSAgfTsKLQotCi0jZGVmaW5lIERXX0xBTkdfbG9fdXNlciAweDgwMDAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBEV19MQU5HX2hpX3VzZXIgMHhmZmZmCS8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLQotLyogTmFtZXMgYW5kIGNvZGVzIGZvciBtYWNybyBpbmZvcm1hdGlvbi4gICovCi0KLWVudW0gZHdhcmZfbWFjaW5mb19yZWNvcmRfdHlwZQotICB7Ci0gICAgRFdfTUFDSU5GT19kZWZpbmUgPSAxLAotICAgIERXX01BQ0lORk9fdW5kZWYgPSAyLAotICAgIERXX01BQ0lORk9fc3RhcnRfZmlsZSA9IDMsCi0gICAgRFdfTUFDSU5GT19lbmRfZmlsZSA9IDQsCi0gICAgRFdfTUFDSU5GT192ZW5kb3JfZXh0ID0gMjU1Ci0gIH07Ci0KLSNlbmRpZiAvKiBfRUxGX0RXQVJGMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9leHRlcm5hbC5oIGIvaW5jbHVkZS9lbGYvZXh0ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhYjc3ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9leHRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTUsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgZnJvbSBpbmZvcm1hdGlvbiBwdWJsaXNoZWQKLSAgIGluICJVTklYIFN5c3RlbSBWIFJlbGVhc2UgNCwgUHJvZ3JhbW1lcnMgR3VpZGU6IEFOU0kgQyBhbmQKLSAgIFByb2dyYW1taW5nIFN1cHBvcnQgVG9vbHMiLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRUxGIHN1cHBvcnQgZm9yIEJGRCwgYW5kIGNvbnRhaW5zIHRoZSBwb3J0aW9ucwotICAgdGhhdCBkZXNjcmliZSBob3cgRUxGIGlzIHJlcHJlc2VudGVkIGV4dGVybmFsbHkgYnkgdGhlIEJGRCBsaWJyYXJ5LgotICAgSS5FLiBpdCBkZXNjcmliZXMgdGhlIGluLWZpbGUgcmVwcmVzZW50YXRpb24gb2YgRUxGLiAgSXQgcmVxdWlyZXMKLSAgIHRoZSBlbGYtY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCi0gICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLwotCi0vKiBUaGUgNjQtYml0IHN0dWZmIGlzIGtpbmQgb2YgcmFuZG9tLiAgUGVyaGFwcyBzb21lb25lIHdpbGwgcHVibGlzaCBhCi0gICBzcGVjIHNvbWVkYXkuICAqLwotCi0jaWZuZGVmIF9FTEZfRVhURVJOQUxfSAotI2RlZmluZSBfRUxGX0VYVEVSTkFMX0gKLQotLyogRUxGIEhlYWRlciAoMzItYml0IGltcGxlbWVudGF0aW9ucykgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCWVfaWRlbnRbMTZdOwkJLyogRUxGICJtYWdpYyBudW1iZXIiICovCi0gIHVuc2lnbmVkIGNoYXIJZV90eXBlWzJdOwkJLyogSWRlbnRpZmllcyBvYmplY3QgZmlsZSB0eXBlICovCi0gIHVuc2lnbmVkIGNoYXIJZV9tYWNoaW5lWzJdOwkJLyogU3BlY2lmaWVzIHJlcXVpcmVkIGFyY2hpdGVjdHVyZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfdmVyc2lvbls0XTsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdmVyc2lvbiAqLwotICB1bnNpZ25lZCBjaGFyCWVfZW50cnlbNF07CQkvKiBFbnRyeSBwb2ludCB2aXJ0dWFsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Bob2ZmWzRdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Nob2ZmWzRdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgllX2ZsYWdzWzRdOwkJLyogUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9laHNpemVbMl07CQkvKiBFTEYgaGVhZGVyIHNpemUgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcgllX3BoZW50c2l6ZVsyXTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3BobnVtWzJdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3NoZW50c2l6ZVsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3NobnVtWzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgY2hhcgllX3Noc3RybmR4WzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4ICovCi19IEVsZjMyX0V4dGVybmFsX0VoZHI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgllX2lkZW50WzE2XTsJCS8qIEVMRiAibWFnaWMgbnVtYmVyIiAqLwotICB1bnNpZ25lZCBjaGFyCWVfdHlwZVsyXTsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfbWFjaGluZVsyXTsJCS8qIFNwZWNpZmllcyByZXF1aXJlZCBhcmNoaXRlY3R1cmUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3ZlcnNpb25bNF07CQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHZlcnNpb24gKi8KLSAgdW5zaWduZWQgY2hhcgllX2VudHJ5WzhdOwkJLyogRW50cnkgcG9pbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waG9mZls4XTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaG9mZls4XTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9mbGFnc1s0XTsJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBmbGFncyAqLwotICB1bnNpZ25lZCBjaGFyCWVfZWhzaXplWzJdOwkJLyogRUxGIGhlYWRlciBzaXplIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waGVudHNpemVbMl07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waG51bVsyXTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaGVudHNpemVbMl07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaG51bVsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaHN0cm5keFsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLwotfSBFbGY2NF9FeHRlcm5hbF9FaGRyOwotCi0vKiBQcm9ncmFtIGhlYWRlciAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJcF90eXBlWzRdOwkJLyogSWRlbnRpZmllcyBwcm9ncmFtIHNlZ21lbnQgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCXBfb2Zmc2V0WzRdOwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCXBfdmFkZHJbNF07CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCXBfcGFkZHJbNF07CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcglwX2ZpbGVzels0XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIJcF9tZW1zels0XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KLSAgdW5zaWduZWQgY2hhcglwX2ZsYWdzWzRdOwkJLyogU2VnbWVudCBmbGFncyAqLwotICB1bnNpZ25lZCBjaGFyCXBfYWxpZ25bNF07CQkvKiBTZWdtZW50IGFsaWdubWVudCwgZmlsZSAmIG1lbW9yeSAqLwotfSBFbGYzMl9FeHRlcm5hbF9QaGRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJcF90eXBlWzRdOwkJLyogSWRlbnRpZmllcyBwcm9ncmFtIHNlZ21lbnQgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCXBfZmxhZ3NbNF07CQkvKiBTZWdtZW50IGZsYWdzICovCi0gIHVuc2lnbmVkIGNoYXIJcF9vZmZzZXRbOF07CQkvKiBTZWdtZW50IGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJcF92YWRkcls4XTsJCS8qIFNlZ21lbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJcF9wYWRkcls4XTsJCS8qIFNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCXBfZmlsZXN6WzhdOwkJLyogU2VnbWVudCBzaXplIGluIGZpbGUgKi8KLSAgdW5zaWduZWQgY2hhcglwX21lbXN6WzhdOwkJLyogU2VnbWVudCBzaXplIGluIG1lbW9yeSAqLwotICB1bnNpZ25lZCBjaGFyCXBfYWxpZ25bOF07CQkvKiBTZWdtZW50IGFsaWdubWVudCwgZmlsZSAmIG1lbW9yeSAqLwotfSBFbGY2NF9FeHRlcm5hbF9QaGRyOwotCi0vKiBTZWN0aW9uIGhlYWRlciAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJc2hfbmFtZVs0XTsJCS8qIFNlY3Rpb24gbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX3R5cGVbNF07CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9mbGFnc1s0XTsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfYWRkcls0XTsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX29mZnNldFs0XTsJCS8qIFNlY3Rpb24gZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9zaXplWzRdOwkJLyogU2l6ZSBvZiBzZWN0aW9uIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfbGlua1s0XTsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2luZm9bNF07CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9hZGRyYWxpZ25bNF07CS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfZW50c2l6ZVs0XTsJCS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLwotfSBFbGYzMl9FeHRlcm5hbF9TaGRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJc2hfbmFtZVs0XTsJCS8qIFNlY3Rpb24gbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX3R5cGVbNF07CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9mbGFnc1s4XTsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfYWRkcls4XTsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX29mZnNldFs4XTsJCS8qIFNlY3Rpb24gZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcglzaF9zaXplWzhdOwkJLyogU2l6ZSBvZiBzZWN0aW9uIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfbGlua1s0XTsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2luZm9bNF07CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9hZGRyYWxpZ25bOF07CS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfZW50c2l6ZVs4XTsJCS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLwotfSBFbGY2NF9FeHRlcm5hbF9TaGRyOwotCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXN0X25hbWVbNF07CQkvKiBTeW1ib2wgbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3ZhbHVlWzRdOwkJLyogVmFsdWUgb2YgdGhlIHN5bWJvbCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3NpemVbNF07CQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfaW5mb1sxXTsJCS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXN0X290aGVyWzFdOwkJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfc2huZHhbMl07CQkvKiBBc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLX0gRWxmMzJfRXh0ZXJuYWxfU3ltOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJc3RfbmFtZVs0XTsJCS8qIFN5bWJvbCBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfaW5mb1sxXTsJCS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXN0X290aGVyWzFdOwkJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfc2huZHhbMl07CQkvKiBBc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLSAgdW5zaWduZWQgY2hhcglzdF92YWx1ZVs4XTsJCS8qIFZhbHVlIG9mIHRoZSBzeW1ib2wgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9zaXplWzhdOwkJLyogQXNzb2NpYXRlZCBzeW1ib2wgc2l6ZSAqLwotfSBFbGY2NF9FeHRlcm5hbF9TeW07Ci0KLS8qIE5vdGUgc2VnbWVudHMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCW5hbWVzels0XTsJCS8qIFNpemUgb2YgZW50cnkncyBvd25lciBzdHJpbmcgKi8KLSAgdW5zaWduZWQgY2hhcglkZXNjc3pbNF07CQkvKiBTaXplIG9mIHRoZSBub3RlIGRlc2NyaXB0b3IgKi8KLSAgdW5zaWduZWQgY2hhcgl0eXBlWzRdOwkJLyogSW50ZXJwcmV0YXRpb24gb2YgdGhlIGRlc2NyaXB0b3IgKi8KLSAgY2hhcgkJbmFtZVsxXTsJCS8qIFN0YXJ0IG9mIHRoZSBuYW1lK2Rlc2MgZGF0YSAqLwotfSBFbGZfRXh0ZXJuYWxfTm90ZTsKLQotLyogUmVsb2NhdGlvbiBFbnRyaWVzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbNF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bNF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLX0gRWxmMzJfRXh0ZXJuYWxfUmVsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbNF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bNF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2FkZGVuZFs0XTsJLyogQ29uc3RhbnQgYWRkZW5kIHVzZWQgdG8gY29tcHV0ZSB2YWx1ZSAqLwotfSBFbGYzMl9FeHRlcm5hbF9SZWxhOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbOF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bOF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLX0gRWxmNjRfRXh0ZXJuYWxfUmVsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgcl9vZmZzZXRbOF07CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2luZm9bOF07CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglyX2FkZGVuZFs4XTsJLyogQ29uc3RhbnQgYWRkZW5kIHVzZWQgdG8gY29tcHV0ZSB2YWx1ZSAqLwotfSBFbGY2NF9FeHRlcm5hbF9SZWxhOwotCi0vKiBkeW5hbWljIHNlY3Rpb24gc3RydWN0dXJlICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcglkX3RhZ1s0XTsJCS8qIGVudHJ5IHRhZyB2YWx1ZSAqLwotICB1bmlvbiB7Ci0gICAgdW5zaWduZWQgY2hhcglkX3ZhbFs0XTsKLSAgICB1bnNpZ25lZCBjaGFyCWRfcHRyWzRdOwotICB9IGRfdW47Ci19IEVsZjMyX0V4dGVybmFsX0R5bjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCWRfdGFnWzhdOwkJLyogZW50cnkgdGFnIHZhbHVlICovCi0gIHVuaW9uIHsKLSAgICB1bnNpZ25lZCBjaGFyCWRfdmFsWzhdOwotICAgIHVuc2lnbmVkIGNoYXIJZF9wdHJbOF07Ci0gIH0gZF91bjsKLX0gRWxmNjRfRXh0ZXJuYWxfRHluOwotCi0vKiBUaGUgdmVyc2lvbiBzdHJ1Y3R1cmVzIGFyZSBjdXJyZW50bHkgc2l6ZSBpbmRlcGVuZGVudC4gIFRoZXkgYXJlCi0gICBuYW1lZCB3aXRob3V0IGEgMzIgb3IgNjQuICBJZiB0aGF0IGV2ZXIgY2hhbmdlcywgdGhlc2Ugc3RydWN0dXJlcwotICAgd2lsbCBuZWVkIHRvIGJlIHJlbmFtZWQuICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJkZWYgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgkJdmRfdmVyc2lvblsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfZmxhZ3NbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX25keFsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfY250WzJdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9oYXNoWzRdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9hdXhbNF07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX25leHRbNF07Ci19IEVsZl9FeHRlcm5hbF9WZXJkZWY7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcmRlZiBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2ZGFfbmFtZVs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdmRhX25leHRbNF07Ci19IEVsZl9FeHRlcm5hbF9WZXJkYXV4OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJuZWVkIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJCXZuX3ZlcnNpb25bMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuX2NudFsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdm5fZmlsZVs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdm5fYXV4WzRdOwotICB1bnNpZ25lZCBjaGFyCQl2bl9uZXh0WzRdOwotfSBFbGZfRXh0ZXJuYWxfVmVybmVlZDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVybmVlZCBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2bmFfaGFzaFs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdm5hX2ZsYWdzWzJdOwotICB1bnNpZ25lZCBjaGFyCQl2bmFfb3RoZXJbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuYV9uYW1lWzRdOwotICB1bnNpZ25lZCBjaGFyCQl2bmFfbmV4dFs0XTsKLX0gRWxmX0V4dGVybmFsX1Zlcm5hdXg7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcnN5bSBzZWN0aW9uLiAgVGhpcyBpcyBub3QgYQotICAgc3RhbmRhcmQgRUxGIHN0cnVjdHVyZTsgRUxGIGp1c3QgdXNlcyBFbGYzMl9IYWxmLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2c192ZXJzWzJdOwotfQotI2lmZGVmIF9fR05VQ19fCi0gIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQotI2VuZGlmCi0gIEVsZl9FeHRlcm5hbF9WZXJzeW07Ci0KLS8qIFN0cnVjdHVyZSBmb3Igc3ltaW5mbyBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIJCXNpX2JvdW5kdG9bMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXNpX2ZsYWdzWzJdOwotfSBFbGZfRXh0ZXJuYWxfU3ltaW5mbzsKLQotI2VuZGlmIC8qIF9FTEZfRVhURVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZnIzMC5oIGIvaW5jbHVkZS9lbGYvZnIzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjNiMDUyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2ZyMzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIEZSMzAgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfRlIzMF9ICi0jZGVmaW5lIF9FTEZfRlIzMF9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9mcjMwX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzgsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzIwLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF8zMiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfNDgsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzZfSU5fNCwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfOF9JTl84LCA2KQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF85X0lOXzgsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzEwX0lOXzgsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzlfUENSRUwsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzEyX1BDUkVMLCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfR05VX1ZUSU5IRVJJVCwgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwX0dOVV9WVEVOVFJZLCAxMikKLSAgRU1QVFlfUkVMT0MgIChSX0ZSMzBfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmIC8qIF9FTEZfRlIzMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9ocHBhLmggYi9pbmNsdWRlL2VsZi9ocHBhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDVkNzQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qIEhQUEEgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEhQUEEgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfSFBQQV9ICi0jZGVmaW5lIF9FTEZfSFBQQV9ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIFRyYXAgbnVsbCBhZGRyZXNzIGRlcmVmZXJlbmNlcy4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19UUkFQTklMCTB4MDAwMTAwMDAKLQotLyogLlBBUklTQy5hcmNoZXh0IHNlY3Rpb24gaXMgcHJlc2VudC4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19FWFQJCTB4MDAwMjAwMDAKLQotLyogUHJvZ3JhbSBleHBlY3RzIGxpdHRsZS1lbmRpYW4gbW9kZS4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19MU0IJCTB4MDAwNDAwMDAKLQotLyogUHJvZ3JhbSBleHBlY3RzIHdpZGUgbW9kZS4gICovCi0jZGVmaW5lIEVGX1BBUklTQ19XSURFCQkweDAwMDgwMDAwCi0KLS8qIERvIG5vdCBhbGxvdyBrZXJuZWwtYXNzaXN0ZWQgYnJhbmNoIHByZWRpY3Rpb24uICAqLwotI2RlZmluZSBFRl9QQVJJU0NfTk9fS0FCUAkweDAwMTAwMDAwCi0KLS8qIEFsbG93IGxhenkgc3dhcCBmb3IgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHByb2dyYW0gc2VnbWVudHMuICAqLwotI2RlZmluZSBFRl9QQVJJU0NfTEFaWVNXQVAJMHgwMDQwMDAwMAotCi0vKiBBcmNoaXRlY3R1cmUgdmVyc2lvbiAqLwotI2RlZmluZSBFRl9QQVJJU0NfQVJDSAkJMHgwMDAwZmZmZgotCi0jZGVmaW5lIEVGQV9QQVJJU0NfMV8wCQkJMHgwMjBiCi0jZGVmaW5lIEVGQV9QQVJJU0NfMV8xCQkJMHgwMjEwCi0jZGVmaW5lIEVGQV9QQVJJU0NfMl8wCQkJMHgwMjE0Ci0KLS8qIFNwZWNpYWwgc2VjdGlvbiBpbmRpY2VzLiAgKi8KLS8qIEEgc3ltYm9sIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgYXMgYSB0ZW50YXRpdmUgZGVmaW5pdGlvbiBpbiBhbiBBTlNJIEMKLSAgIGNvbXBpbGF0aW9uLiAgKi8KLSNkZWZpbmUgU0hOX1BBUklTQ19BTlNJX0NPTU1PTiAJMHhmZjAwCi0KLS8qIEEgc3ltYm9sIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgYXMgYSBjb21tb24gYmxvY2sgdXNpbmcgdGhlCi0gICBodWdlIG1lbW9yeSBtb2RlbC4gICovCi0jZGVmaW5lIFNITl9QQVJJU0NfSFVHRV9DT01NT04JMHhmZjAxCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgKi8KLQotLyogU2VjdGlvbiBjb250YWlucyBwcm9kdWN0IHNwZWNpZmljIGV4dGVuc2lvbiBiaXRzLiAgKi8KLSNkZWZpbmUgU0hUX1BBUklTQ19FWFQJCTB4NzAwMDAwMDAKLQotLyogU2VjdGlvbiBjb250YWlucyB1bndpbmQgdGFibGUgZW50cmllcy4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfVU5XSU5ECTB4NzAwMDAwMDEKLQotLyogU2VjdGlvbiBjb250YWlucyBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3Igb3B0aW1pemVkIGNvZGUuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX0RPQwkJMHg3MDAwMDAwMgotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIGNvZGUgYW5ub3RhdGlvbnMuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX0FOTk9UCTB4NzAwMDAwMDMKLQotLyogVGhlc2UgYXJlIHN0cmljdGx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZGVyIGVsZjMyLWhwcGEKLSAgIGltcGxlbWVudGF0aW9uLiAgSG9wZWZ1bGx5IHdlIGNhbiBlbGltaW5hdGUgdGhlbSBpbiB0aGUgZnV0dXJlLiAgKi8KLS8qIE9wdGlvbmFsIHNlY3Rpb24gaG9sZGluZyBhcmd1bWVudCBsb2NhdGlvbi9yZWxvY2F0aW9uIGluZm8uICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX1NZTUVYVE4gICAgU0hUX0xPUFJPQys4Ci0KLS8qIE9wdGlvbiBzZWN0aW9uIGZvciBsaW5rZXIgc3R1YnMuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX1NUVUJTICAgICAgU0hUX0xPUFJPQys5Ci0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLiAgKi8KLQotLyogU2VjdGlvbiBjb250YWlucyBjb2RlIGNvbXBpbGVkIGZvciBzdGF0aWMgYnJhbmNoIHByZWRpY3Rpb24uICAqLwotI2RlZmluZSBTSEZfUEFSSVNDX1NCUAkJMHg4MDAwMDAwMAotCi0vKiBTZWN0aW9uIHNob3VsZCBiZSBhbGxvY2F0ZWQgZnJvbSBmcm9tIEdQLiAgKi8KLSNkZWZpbmUgU0hGX1BBUklTQ19IVUdFCQkweDQwMDAwMDAwCi0KLS8qIFNlY3Rpb24gc2hvdWxkIGdvIG5lYXIgR1AuICAqLwotI2RlZmluZSBTSEZfUEFSSVNDX1NIT1JUCTB4MjAwMDAwMDAKLQotCi0vKiBJZGVudGlmaWVzIHRoZSBlbnRyeSBwb2ludCBvZiBhIG1pbGxpY29kZSByb3V0aW5lLiAgKi8KLSNkZWZpbmUgU1RUX1BBUklTQ19NSUxMSQkxMwotCi0vKiBFTEYvSFBQQSByZWxvY2F0aW9uIHR5cGVzICovCi0KLS8qIE5vdGU6IFBBLUVMRiBpcyBkZWZpbmVkIHRvIHVzZSBvbmx5IFJFTEEgcmVsb2NhdGlvbnMuICAqLwotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2hwcGFfcmVsb2NfdHlwZSkKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19OT05FLCAgICAgIDApCS8qIE5vIHJlbG9jICovCi0KLSAgICAgLyogVGhlc2UgcmVsb2NhdGlvbiB0eXBlcyBkbyBzaW1wbGUgYmFzZSArIG9mZnNldCByZWxvY2F0aW9ucy4gICovCi0KLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIzMiwgIDEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMjFMLCAyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE3UiwgMykKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxN0YsIDQpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTRSLCA2KQotCi0gICAgLyogUEMtcmVsYXRpdmUgcmVsb2NhdGlvbiB0eXBlcwotICAgICAgIFR5cGljYWxseSB1c2VkIGZvciBjYWxscy4KLSAgICAgICBOb3RlIFBDUkVMMTdDIGFuZCBQQ1JFTDE3RiBkaWZmZXIgb25seSBpbiBvdmVyZmxvdyBoYW5kbGluZy4KLSAgICAgICBQQ1JFTDE3QyBuZXZlciByZXBvcnRzIGEgcmVsb2NhdGlvbiBlcnJvci4KLQotICAgICAgIFdoZW4gc3VwcG9ydGluZyBhcmd1bWVudCByZWxvY2F0aW9ucywgZnVuY3Rpb24gY2FsbHMgbXVzdCBiZQotICAgICAgIGFjY29tcGFuaWVkIGJ5IHBhcmFtZXRlciByZWxvY2F0aW9uIGluZm9ybWF0aW9uLiAgVGhpcyBpbmZvcm1hdGlvbiBpcwotICAgICAgIGNhcnJpZWQgaW4gdGhlIHRlbiBoaWdoLW9yZGVyIGJpdHMgb2YgdGhlIGFkZGVuZCBmaWVsZC4gIFRoZSByZW1haW5pbmcKLSAgICAgICAyMiBiaXRzIG9mIG9mIHRoZSBhZGRlbmQgZmllbGQgYXJlIHNpZ24tZXh0ZW5kZWQgdG8gZm9ybSB0aGUgQWRkZW5kLgotCi0gICAgICAgTm90ZSB0aGUgY29kZSB0byBidWlsZCBhcmd1bWVudCByZWxvY2F0aW9ucyBkZXBlbmRzIG9uIHRoZQotICAgICAgIGFkZGVuZCBiZWluZyB6ZXJvLiAgQSBjb25zZXF1ZW5jZSBvZiB0aGlzIGxpbWl0YXRpb24gaXMgR0FTCi0gICAgICAgY2FuIG5vdCBwZXJmb3JtIHJlbG9jYXRpb24gcmVkdWN0aW9ucyBmb3IgZnVuY3Rpb24gc3ltYm9scy4gICovCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMzIsIDkpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDIxTCwgMTApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE3UiwgMTEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE3RiwgMTIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE3QywgMTMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE0UiwgMTQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE0RiwgMTUpCi0KLSAgICAvKiBEUC1yZWxhdGl2ZSByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RQUkVMMjFMLCAxOCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RQUkVMMTRXUiwgMTkpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19EUFJFTDE0RFIsIDIwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwxNFIsIDIyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwxNEYsIDIzKQotCi0gICAgLyogRGF0YSBsaW5rYWdlIHRhYmxlIChETFQpIHJlbG9jYXRpb24gdHlwZXMKLQotICAgICAgIFNPTSBETFRfUkVMIGZpeHVwIHJlcXVlc3RzIGFyZSB1c2VkIHRvIGZvciBzdGF0aWMgZGF0YSByZWZlcmVuY2VzCi0gICAgICAgZnJvbSBwb3NpdGlvbi1pbmRlcGVuZGVudCBjb2RlIHdpdGhpbiBzaGFyZWQgbGlicmFyaWVzLiAgVGhleSBhcmUKLSAgICAgICBzaW1pbGFyIHRvIHRoZSBHT1QgcmVsb2NhdGlvbiB0eXBlcyBpbiBzb21lIFNWUjQgaW1wbGVtZW50YXRpb25zLiAgKi8KLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUUkVMMjFMLCAyNikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVFJFTDE0UiwgMzApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRSRUwxNEYsIDMxKQotCi0gICAgLyogRExUIGluZGlyZWN0IHJlbG9jYXRpb24gdHlwZXMgICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRJTkQyMUwsIDM0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUSU5EMTRSLCAzOCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVElORDE0RiwgMzkpCi0KLSAgICAvKiBCYXNlIHJlbGF0aXZlIHJlbG9jYXRpb24gdHlwZXMuICBVZ2guICBUaGVzZSBpbXBseSBsb3RzIG9mIHN0YXRlICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRVRCQVNFLCA0MCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1NFQ1JFTDMyLCA0MSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwyMUwsIDQyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE3UiwgNDMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTdGLCA0NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxNFIsIDQ2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE0RiwgNDcpCi0KLSAgICAvKiBTZWdtZW50IHJlbGF0aXZlIHJlbG9jYXRpb24gdHlwZXMuICAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfU0VHQkFTRSwgNDgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRUdSRUwzMiwgNDkpCi0KLSAgICAvKiBPZmZzZXRzIGZyb20gdGhlIFBMVC4gICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYyMUwsIDUwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMTRSLCA1NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE0RiwgNTUpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIzMiwgNTcpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMjFMLCA1OCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIsIDYyKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19GUFRSNjQsIDY0KQotCi0gICAgLyogUGxhYmVsIHJlbG9jYXRpb24gdHlwZXMuICAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExBQkVMMzIsIDY1KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExBQkVMMjFMLCA2NikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMQUJFTDE0UiwgNzApCi0KLSAgICAvKiBQQ1JFTCByZWxvY2F0aW9ucy4gICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDY0LCA3MikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMjJDLCA3MykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMjJGLCA3NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTRXUiwgNzUpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE0RFIsIDc2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNkYsIDc3KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNldGLCA3OCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTZERiwgNzkpCi0KLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSNjQsIDgwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSNjRXUiwgODEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVI2NERSLCA4MikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE0V1IsIDgzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTREUiwgODQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxNkYsIDg1KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTZXRiwgODYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxNkRGLCA4NykKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfR1BSRUw2NCwgODgpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVFJFTDE0V1IsIDkxKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUUkVMMTREUiwgOTIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19HUFJFTDE2RiwgOTMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19HUFJFTDE2V0YsIDk0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfR1BSRUwxNkRGLCA5NSkKLQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRjY0LCA5NikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVElORDE0V1IsIDk5KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUSU5EMTREUiwgMTAwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkYxNkYsIDEwMSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGMTZXRiwgMTAyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkYxNkRGLCAxMDMpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1NFQ1JFTDY0LCAxMDQpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxNFdSLCAxMDcpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTREUiwgMTA4KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRUdSRUw2NCwgMTEyKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNFdSLCAxMTUpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNERSLCAxMTYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNkYsIDExNykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE2V0YsIDExOCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE2REYsIDExOSkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjY0LCAxMjApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMTRXUiwgMTIzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFIsIDEyNCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNkYsIDEyNSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNldGLCAxMjYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMTZERiwgMTI3KQotCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0NPUFksIDEyOCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0lQTFQsIDEyOSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0VQTFQsIDEzMCkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwzMiwgMTUzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwyMUwsIDE1NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTRSLCAxNTgpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMjFMLCAxNjIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE0UiwgMTY2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNEYsIDE2NykKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUw2NCwgMjE2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwxNFdSLCAyMTkpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDE0RFIsIDIyMCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTZGLCAyMjEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDE2V0YsIDIyMikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTZERiwgMjIzKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDY0LCAyMjQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE0V1IsIDIyNykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMTREUiwgMjI4KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNkYsIDIyOSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMTZXRiwgMjMwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNkRGLCAyMzEpCi0gICAgRU1QVFlfUkVMT0MgKFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jaWZuZGVmIFJFTE9DX01BQ1JPU19HRU5fRlVOQwotdHlwZWRlZiBlbnVtIGVsZl9ocHBhX3JlbG9jX3R5cGUgZWxmX2hwcGFfcmVsb2NfdHlwZTsKLSNlbmRpZgotCi0jZGVmaW5lIFBUX1BBUklTQ19BUkNIRVhUCTB4NzAwMDAwMDAKLSNkZWZpbmUgUFRfUEFSSVNDX1VOV0lORAkweDcwMDAwMDAxCi0jZGVmaW5lIFBGX1BBUklTQ19TQlAJCTB4MDgwMDAwMDAKLSNkZWZpbmUgUEZfSFBfUEFHRV9TSVpFCQkweDAwMTAwMDAwCi0jZGVmaW5lIFBGX0hQX0ZBUl9TSEFSRUQJMHgwMDIwMDAwMAotI2RlZmluZSBQRl9IUF9ORUFSX1NIQVJFRAkweDAwNDAwMDAwCi0jZGVmaW5lIFBGX0hQX0NPREUJCTB4MDEwMDAwMDAKLSNkZWZpbmUgUEZfSFBfTU9ESUZZCQkweDAyMDAwMDAwCi0jZGVmaW5lIFBGX0hQX0xBWllTV0FQCQkweDA0MDAwMDAwCi0jZGVmaW5lIFBGX0hQX1NCUAkJMHgwODAwMDAwMAotCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZHluYW1pYyBhcnJheSB0YWdzLiAgKi8KLQotI2RlZmluZSBEVF9IUF9MT0FEX01BUAkJKERUX0xPT1MgKyAweDApCi0jZGVmaW5lIERUX0hQX0RMRF9GTEFHUwkJKERUX0xPT1MgKyAweDEpCi0jZGVmaW5lIERUX0hQX0RMRF9IT09LCQkoRFRfTE9PUyArIDB4MikKLSNkZWZpbmUgRFRfSFBfVVgxMF9JTklUCQkoRFRfTE9PUyArIDB4MykKLSNkZWZpbmUgRFRfSFBfVVgxMF9JTklUU1oJKERUX0xPT1MgKyAweDQpCi0jZGVmaW5lIERUX0hQX1BSRUlOSVQJCShEVF9MT09TICsgMHg1KQotI2RlZmluZSBEVF9IUF9QUkVJTklUU1oJCShEVF9MT09TICsgMHg2KQotI2RlZmluZSBEVF9IUF9ORUVERUQJCShEVF9MT09TICsgMHg3KQotI2RlZmluZSBEVF9IUF9USU1FX1NUQU1QCShEVF9MT09TICsgMHg4KQotI2RlZmluZSBEVF9IUF9DSEVDS1NVTQkJKERUX0xPT1MgKyAweDkpCi0jZGVmaW5lIERUX0hQX0dTVF9TSVpFCQkoRFRfTE9PUyArIDB4YSkKLSNkZWZpbmUgRFRfSFBfR1NUX1ZFUlNJT04JKERUX0xPT1MgKyAweGIpCi0jZGVmaW5lIERUX0hQX0dTVF9IQVNIVkFMCShEVF9MT09TICsgMHhjKQotCi0vKiBWYWx1ZXMgZm9yIERUX0hQX0RMRF9GTEFHUy4gICovCi0jZGVmaW5lIERUX0hQX0RFQlVHX1BSSVZBVEUJCTB4MDAwMSAvKiBNYXAgdGV4dCBwcml2YXRlICovCi0jZGVmaW5lIERUX0hQX0RFQlVHX0NBTExCQUNLCQkweDAwMDIgLyogQ2FsbGJhY2sgKi8KLSNkZWZpbmUgRFRfSFBfREVCVUdfQ0FMTEJBQ0tfQk9SCTB4MDAwNCAvKiBCT1IgY2FsbGJhY2sgKi8KLSNkZWZpbmUgRFRfSFBfTk9fRU5WVkFSCQkJMHgwMDA4IC8qIE5vIGVudiB2YXIgKi8KLSNkZWZpbmUgRFRfSFBfQklORF9OT1cJCQkweDAwMTAgLyogQmluZCBub3cgKi8KLSNkZWZpbmUgRFRfSFBfQklORF9OT05GQVRBTAkJMHgwMDIwIC8qIEJpbmQgbm9uLWZhdGFsICovCi0jZGVmaW5lIERUX0hQX0JJTkRfVkVSQk9TRQkJMHgwMDQwIC8qIEJpbmQgdmVyYm9zZSAqLwotI2RlZmluZSBEVF9IUF9CSU5EX1JFU1RSSUNURUQJCTB4MDA4MCAvKiBCaW5kIHJlc3RyaWN0ZWQgKi8KLSNkZWZpbmUgRFRfSFBfQklORF9TWU1CT0xJQwkJMHgwMTAwIC8qIEJpbmQgc3ltYm9saWMgKi8KLSNkZWZpbmUgRFRfSFBfUlBBVEhfRklSU1QJCTB4MDIwMCAvKiBSUEFUSCBmaXJzdCAqLwotI2RlZmluZSBEVF9IUF9CSU5EX0RFUFRIX0ZJUlNUCQkweDA0MDAgLyogQmluZCBkZXB0aC1maXJzdCAqLwotCi0vKiBQcm9ncmFtIGhlYWRlciBleHRlbnNpb25zLiAgKi8KLSNkZWZpbmUgUFRfSFBfVExTCQkoUFRfTE9PUyArIDB4MCkKLSNkZWZpbmUgUFRfSFBfQ09SRV9OT05FCQkoUFRfTE9PUyArIDB4MSkKLSNkZWZpbmUgUFRfSFBfQ09SRV9WRVJTSU9OCShQVF9MT09TICsgMHgyKQotI2RlZmluZSBQVF9IUF9DT1JFX0tFUk5FTAkoUFRfTE9PUyArIDB4MykKLSNkZWZpbmUgUFRfSFBfQ09SRV9DT01NCQkoUFRfTE9PUyArIDB4NCkKLSNkZWZpbmUgUFRfSFBfQ09SRV9QUk9DCQkoUFRfTE9PUyArIDB4NSkKLSNkZWZpbmUgUFRfSFBfQ09SRV9MT0FEQUJMRQkoUFRfTE9PUyArIDB4NikKLSNkZWZpbmUgUFRfSFBfQ09SRV9TVEFDSwkoUFRfTE9PUyArIDB4NykKLSNkZWZpbmUgUFRfSFBfQ09SRV9TSE0JCShQVF9MT09TICsgMHg4KQotI2RlZmluZSBQVF9IUF9DT1JFX01NRgkJKFBUX0xPT1MgKyAweDkpCi0jZGVmaW5lIFBUX0hQX1BBUkFMTEVMCQkoUFRfTE9PUyArIDB4MTApCi0jZGVmaW5lIFBUX0hQX0ZBU1RCSU5ECQkoUFRfTE9PUyArIDB4MTEpCi0KLS8qIEFkZGl0aW9uYWwgc3ltYm9sIHR5cGVzLiAgKi8KLSNkZWZpbmUgU1RUX0hQX09QQVFVRQkJKFNUVF9MT09TICsgMHgxKQotI2RlZmluZSBTVFRfSFBfU1RVQgkJKFNUVF9MT09TICsgMHgyKQotCi0jZW5kaWYgLyogX0VMRl9IUFBBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2kzODYuaCBiL2luY2x1ZGUvZWxmL2kzODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4NjY2MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9pMzg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBpeDg2IEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0kzODZfSAotI2RlZmluZSBfRUxGX0kzODZfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfaTM4Nl9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X05PTkUsICAgICAgMCkJLyogTm8gcmVsb2MgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl8zMiwgICAgICAgIDEpCS8qIERpcmVjdCAzMiBiaXQgICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUEMzMiwgICAgICAyKQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HT1QzMiwgICAgIDMpCS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9QTFQzMiwJICAgIDQpCS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0NPUFksCSAgICA1KQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR0xPQl9EQVQsICA2KQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfSlVNUF9TTE9ULCA3KQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUkVMQVRJVkUsICA4KQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR09UT0ZGLCAgICA5KQkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0dPVFBDLCAgICAxMCkJLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSAgICAgRkFLRV9SRUxPQyAgIChGSVJTVF9JTlZBTElEX1JFTE9DLCAxMSkKLSAgICAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MsICAxOSkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl8xNiwgICAgICAgMjApCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUEMxNiwgICAgIDIxKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2XzgsCSAgIDIyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X1BDOCwgICAgICAyMykKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9tYXgsCSAgIDI0KQotICAgICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HTlVfVlRJTkhFUklULCAyNTApCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR05VX1ZURU5UUlksIDI1MSkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvaTk2MC5oIGIvaW5jbHVkZS9lbGYvaTk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTYwMjg5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2k5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEludGVsIDk2MCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9JOTYwX0gKLSNkZWZpbmUgX0VMRl9JOTYwX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfaTk2MF9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwX05PTkUsCSAgICAwKQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwXzEyLAkgICAgMSkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzk2MF8zMiwJICAgIDIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfSVAyNCwJICAgIDMpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfU1VCLAkgICAgNCkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzk2MF9PUFRDQUxMLCAgIDUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfT1BUQ0FMTFgsICA2KQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwX09QVENBTExYQSwgNykKLSAgICAgRU1QVFlfUkVMT0MgKFJfOTYwX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX0k5NjBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvaW50ZXJuYWwuaCBiL2luY2x1ZGUvZWxmL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjgxYTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCi0gICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCi0gICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVMRiBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgZGVzY3JpYmUgaG93IEVMRiBpcyByZXByZXNlbnRlZCBpbnRlcm5hbGx5IGluIHRoZSBCRkQgbGlicmFyeS4KLSAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgRUxGLiAgSXQgcmVxdWlyZXMKLSAgIHRoZSBlbGYtY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCi0gICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLwotCi0KLS8qIE5PVEUgdGhhdCB0aGVzZSBzdHJ1Y3R1cmVzIGFyZSBub3Qga2VwdCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFwcGVhcgotICAgaW4gdGhlIG9iamVjdCBmaWxlLiAgSW4gc29tZSBjYXNlcyB0aGV5J3ZlIGJlZW4gcmVvcmRlcmVkIGZvciBtb3JlIG9wdGltYWwKLSAgIHBhY2tpbmcgdW5kZXIgdmFyaW91cyBjaXJjdW1zdGFuY2VzLiAgKi8KLQotI2lmbmRlZiBfRUxGX0lOVEVSTkFMX0gKLSNkZWZpbmUgX0VMRl9JTlRFUk5BTF9ICi0KLS8qIEVMRiBIZWFkZXIgKi8KLQotI2RlZmluZSBFSV9OSURFTlQJMTYJCS8qIFNpemUgb2YgZV9pZGVudFtdICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9laGRyIHsKLSAgdW5zaWduZWQgY2hhcgkJZV9pZGVudFtFSV9OSURFTlRdOwkvKiBFTEYgIm1hZ2ljIG51bWJlciIgKi8KLSAgYmZkX3ZtYQkJZV9lbnRyeTsJCS8qIEVudHJ5IHBvaW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICBiZmRfc2l6ZV90eXBlCQllX3Bob2ZmOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgYmZkX3NpemVfdHlwZQkJZV9zaG9mZjsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGxvbmcJCWVfdmVyc2lvbjsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdmVyc2lvbiAqLwotICB1bnNpZ25lZCBsb25nCQllX2ZsYWdzOwkJLyogUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzICovCi0gIHVuc2lnbmVkIHNob3J0CWVfdHlwZTsJCQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHR5cGUgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9tYWNoaW5lOwkJLyogU3BlY2lmaWVzIHJlcXVpcmVkIGFyY2hpdGVjdHVyZSAqLwotICB1bnNpZ25lZCBzaG9ydAllX2Voc2l6ZTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBzaG9ydAllX3BoZW50c2l6ZTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9waG51bTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIHNob3J0CWVfc2hlbnRzaXplOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICB1bnNpZ25lZCBzaG9ydAllX3NobnVtOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9zaHN0cm5keDsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLwotfSBFbGZfSW50ZXJuYWxfRWhkcjsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9laGRyIGVsZl9pbnRlcm5hbF9laGRyCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX0VoZHIgRWxmX0ludGVybmFsX0VoZHIKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfZWhkciBlbGZfaW50ZXJuYWxfZWhkcgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9FaGRyIEVsZl9JbnRlcm5hbF9FaGRyCi0KLS8qIFByb2dyYW0gaGVhZGVyICovCi0KLXN0cnVjdCBlbGZfaW50ZXJuYWxfcGhkciB7Ci0gIHVuc2lnbmVkIGxvbmcJcF90eXBlOwkJCS8qIElkZW50aWZpZXMgcHJvZ3JhbSBzZWdtZW50IHR5cGUgKi8KLSAgdW5zaWduZWQgbG9uZwlwX2ZsYWdzOwkJLyogU2VnbWVudCBmbGFncyAqLwotICBiZmRfdm1hCXBfb2Zmc2V0OwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLwotICBiZmRfdm1hCXBfdmFkZHI7CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICBiZmRfdm1hCXBfcGFkZHI7CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KLSAgYmZkX3ZtYQlwX2ZpbGVzejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCi0gIGJmZF92bWEJcF9tZW1zejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KLSAgYmZkX3ZtYQlwX2FsaWduOwkJLyogU2VnbWVudCBhbGlnbm1lbnQsIGZpbGUgJiBtZW1vcnkgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9waGRyIEVsZl9JbnRlcm5hbF9QaGRyOwotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9waGRyIGVsZl9pbnRlcm5hbF9waGRyCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1BoZHIgRWxmX0ludGVybmFsX1BoZHIKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfcGhkciBlbGZfaW50ZXJuYWxfcGhkcgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9QaGRyIEVsZl9JbnRlcm5hbF9QaGRyCi0KLS8qIFNlY3Rpb24gaGVhZGVyICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyIHsKLSAgdW5zaWduZWQgaW50CXNoX25hbWU7CQkvKiBTZWN0aW9uIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KLSAgdW5zaWduZWQgaW50CXNoX3R5cGU7CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KLSAgYmZkX3ZtYQlzaF9mbGFnczsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0gIGJmZF92bWEJc2hfYWRkcjsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLwotICBiZmRfc2l6ZV90eXBlCXNoX3NpemU7CQkvKiBTaXplIG9mIHNlY3Rpb24gaW4gYnl0ZXMgKi8KLSAgYmZkX3NpemVfdHlwZQlzaF9lbnRzaXplOwkJLyogRW50cnkgc2l6ZSBpZiBzZWN0aW9uIGhvbGRzIHRhYmxlICovCi0gIHVuc2lnbmVkIGxvbmcJc2hfbGluazsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBsb25nCXNoX2luZm87CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KLSAgZmlsZV9wdHIJc2hfb2Zmc2V0OwkJLyogU2VjdGlvbiBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBpbnQJc2hfYWRkcmFsaWduOwkJLyogU2VjdGlvbiBhbGlnbm1lbnQgKi8KLQotICAvKiBUaGUgaW50ZXJuYWwgcmVwIGFsc28gaGFzIHNvbWUgY2FjaGVkIGluZm8gYXNzb2NpYXRlZCB3aXRoIGl0LiAqLwotICBhc2VjdGlvbiAqCWJmZF9zZWN0aW9uOwkJLyogQXNzb2NpYXRlZCBCRkQgc2VjdGlvbi4gICovCi0gIFBUUgkJY29udGVudHM7CQkvKiBTZWN0aW9uIGNvbnRlbnRzLiAgKi8KLX0gRWxmX0ludGVybmFsX1NoZHI7Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfc2hkciBlbGZfaW50ZXJuYWxfc2hkcgotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9TaGRyIEVsZl9JbnRlcm5hbF9TaGRyCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3NoZHIgZWxmX2ludGVybmFsX3NoZHIKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfU2hkciBFbGZfSW50ZXJuYWxfU2hkcgotCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgKi8KLQotc3RydWN0IGVsZl9pbnRlcm5hbF9zeW0gewotICBiZmRfdm1hCXN0X3ZhbHVlOwkJLyogVmFsdWUgb2YgdGhlIHN5bWJvbCAqLwotICBiZmRfdm1hCXN0X3NpemU7CQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcJc3RfbmFtZTsJCS8qIFN5bWJvbCBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfaW5mbzsJCS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXN0X290aGVyOwkJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCi0gIHVuc2lnbmVkIHNob3J0IHN0X3NobmR4OwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfc3ltIEVsZl9JbnRlcm5hbF9TeW07Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfc3ltIGVsZl9pbnRlcm5hbF9zeW0KLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfc3ltIGVsZl9pbnRlcm5hbF9zeW0KLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfU3ltIEVsZl9JbnRlcm5hbF9TeW0KLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfU3ltIEVsZl9JbnRlcm5hbF9TeW0KLQotLyogTm90ZSBzZWdtZW50cyAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfbm90ZSB7Ci0gIHVuc2lnbmVkIGxvbmcJbmFtZXN6OwkJCS8qIFNpemUgb2YgZW50cnkncyBvd25lciBzdHJpbmcgKi8KLSAgdW5zaWduZWQgbG9uZwlkZXNjc3o7CQkJLyogU2l6ZSBvZiB0aGUgbm90ZSBkZXNjcmlwdG9yICovCi0gIHVuc2lnbmVkIGxvbmcJdHlwZTsJCQkvKiBJbnRlcnByZXRhdGlvbiBvZiB0aGUgZGVzY3JpcHRvciAqLwotICBjaGFyICoJbmFtZWRhdGE7CQkvKiBTdGFydCBvZiB0aGUgbmFtZStkZXNjIGRhdGEgKi8KLSAgY2hhciAqCWRlc2NkYXRhOwkJLyogU3RhcnQgb2YgdGhlIGRlc2MgZGF0YSAqLwotICBiZmRfdm1hCWRlc2Nwb3M7CQkvKiBGaWxlIG9mZnNldCBvZiB0aGUgZGVzY2RhdGEgKi8KLX0gRWxmX0ludGVybmFsX05vdGU7Ci0jZGVmaW5lIEVsZjMyX0ludGVybmFsX05vdGUJRWxmX0ludGVybmFsX05vdGUKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfbm90ZQllbGZfaW50ZXJuYWxfbm90ZQotCi0vKiBSZWxvY2F0aW9uIEVudHJpZXMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3JlbCB7Ci0gIGJmZF92bWEJcl9vZmZzZXQ7CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgLyogVGhpcyBuZWVkcyB0byBzdXBwb3J0IDY0LWJpdCB2YWx1ZXMgaW4gZWxmNjQuICAqLwotICBiZmRfdm1hCXJfaW5mbzsJCS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLX0gRWxmX0ludGVybmFsX1JlbDsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9yZWwgZWxmX2ludGVybmFsX3JlbAotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9SZWwgRWxmX0ludGVybmFsX1JlbAotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9yZWwgZWxmX2ludGVybmFsX3JlbAotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9SZWwgRWxmX0ludGVybmFsX1JlbAotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfcmVsYSB7Ci0gIGJmZF92bWEJcl9vZmZzZXQ7CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgYmZkX3ZtYQlyX2luZm87CQkvKiBJbmRleCBhbmQgVHlwZSBvZiByZWxvY2F0aW9uICovCi0gIGJmZF9zaWduZWRfdm1hIHJfYWRkZW5kOwkvKiBDb25zdGFudCBhZGRlbmQgdXNlZCB0byBjb21wdXRlIHZhbHVlICovCi19IEVsZl9JbnRlcm5hbF9SZWxhOwotCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3JlbGEgZWxmX2ludGVybmFsX3JlbGEKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfcmVsYSBlbGZfaW50ZXJuYWxfcmVsYQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9SZWxhIEVsZl9JbnRlcm5hbF9SZWxhCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1JlbGEgRWxmX0ludGVybmFsX1JlbGEKLQotLyogZHluYW1pYyBzZWN0aW9uIHN0cnVjdHVyZSAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfZHluIHsKLSAgLyogVGhpcyBuZWVkcyB0byBzdXBwb3J0IDY0LWJpdCB2YWx1ZXMgaW4gZWxmNjQuICAqLwotICBiZmRfdm1hIGRfdGFnOwkJLyogZW50cnkgdGFnIHZhbHVlICovCi0gIHVuaW9uIHsKLSAgICAvKiBUaGlzIG5lZWRzIHRvIHN1cHBvcnQgNjQtYml0IHZhbHVlcyBpbiBlbGY2NC4gICovCi0gICAgYmZkX3ZtYQlkX3ZhbDsKLSAgICBiZmRfdm1hCWRfcHRyOwotICB9IGRfdW47Ci19IEVsZl9JbnRlcm5hbF9EeW47Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfZHluIGVsZl9pbnRlcm5hbF9keW4KLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfZHluIGVsZl9pbnRlcm5hbF9keW4KLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfRHluIEVsZl9JbnRlcm5hbF9EeW4KLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfRHluIEVsZl9JbnRlcm5hbF9EeW4KLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyZGVmIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyZGVmIHsKLSAgdW5zaWduZWQgc2hvcnQgdmRfdmVyc2lvbjsJLyogVmVyc2lvbiBudW1iZXIgb2Ygc3RydWN0dXJlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmRfZmxhZ3M7CS8qIEZsYWdzIChWRVJfRkxHXyopLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmRfbmR4OwkvKiBWZXJzaW9uIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmRfY250OwkvKiBOdW1iZXIgb2YgdmVyZGF1eCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdmRfaGFzaDsJLyogSGFzaCBvZiBuYW1lLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdmRfYXV4OwkvKiBPZmZzZXQgdG8gdmVyZGF1eCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdmRfbmV4dDsJLyogT2Zmc2V0IHRvIG5leHQgdmVyZGVmLiAgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6Ci0gICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KLSAgYmZkCQkJICAgICAgKnZkX2JmZDsJCS8qIEJGRC4gICovCi0gIGNvbnN0IGNoYXIJCSAgICAgICp2ZF9ub2RlbmFtZTsJLyogVmVyc2lvbiBuYW1lLiAgKi8KLSAgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJkZWYgICp2ZF9uZXh0ZGVmOwkvKiB2ZF9uZXh0IGFzIHBvaW50ZXIuICAqLwotICBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggKnZkX2F1eHB0cjsJLyogdmRfYXV4IGFzIHBvaW50ZXIuICAqLwotICB1bnNpZ25lZCBpbnQJCSAgICAgICB2ZF9leHBfcmVmbm87CS8qIFVzZWQgYnkgdGhlIGxpbmtlci4gICovCi19IEVsZl9JbnRlcm5hbF9WZXJkZWY7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcmRlZiBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggewotICB1bnNpZ25lZCBsb25nIHZkYV9uYW1lOwkvKiBTdHJpbmcgdGFibGUgb2Zmc2V0IG9mIG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nIHZkYV9uZXh0OwkvKiBPZmZzZXQgdG8gbmV4dCB2ZXJkYXV4LiAgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6Ci0gICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KLSAgY29uc3QgY2hhciAqdmRhX25vZGVuYW1lOwkJCS8qIHZkYV9uYW1lIGFzIHBvaW50ZXIuICAqLwotICBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggKnZkYV9uZXh0cHRyOwkvKiB2ZGFfbmV4dCBhcyBwb2ludGVyLiAgKi8KLX0gRWxmX0ludGVybmFsX1ZlcmRhdXg7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuZWVkIHsKLSAgdW5zaWduZWQgc2hvcnQgdm5fdmVyc2lvbjsJLyogVmVyc2lvbiBudW1iZXIgb2Ygc3RydWN0dXJlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdm5fY250OwkvKiBOdW1iZXIgb2YgdmVybmF1eCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5fZmlsZTsJLyogU3RyaW5nIHRhYmxlIG9mZnNldCBvZiBsaWJyYXJ5IG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bl9hdXg7CS8qIE9mZnNldCB0byB2ZXJuYXV4IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bl9uZXh0OwkvKiBPZmZzZXQgdG8gbmV4dCB2ZXJuZWVkLiAgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6Ci0gICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KLSAgYmZkCQkJICAgICAgKnZuX2JmZDsJCS8qIEJGRC4gICovCi0gIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqdm5fZmlsZW5hbWU7CS8qIHZuX2ZpbGUgYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmF1eCAqdm5fYXV4cHRyOwkvKiB2bl9hdXggYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmVlZCAqdm5fbmV4dHJlZjsJLyogdm5fbmV4dHJlZiBhcyBwb2ludGVyLiAgKi8KLX0gRWxmX0ludGVybmFsX1Zlcm5lZWQ7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuYXV4IHsKLSAgdW5zaWduZWQgbG9uZwkgdm5hX2hhc2g7CS8qIEhhc2ggb2YgZGVwZW5kZW5jeSBuYW1lLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdm5hX2ZsYWdzOwkvKiBGbGFncyAoVkVSX0ZMR18qKS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHZuYV9vdGhlcjsJLyogVW51c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5hX25hbWU7CS8qIFN0cmluZyB0YWJsZSBvZmZzZXQgdG8gdmVyc2lvbiBuYW1lLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5hX25leHQ7CS8qIE9mZnNldCB0byBuZXh0IHZlcm5hdXguICAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgc2V0IHVwIHdoZW4gQkZEIHJlYWRzIGluIHRoZSBzdHJ1Y3R1cmUuICBGSVhNRToKLSAgICAgSXQgd291bGQgYmUgY2xlYW5lciB0byBzdG9yZSB0aGVzZSBpbiBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuICAqLwotICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnZuYV9ub2RlbmFtZTsJLyogdm5hX25hbWUgYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmF1eCAqdm5hX25leHRwdHI7CS8qIHZuYV9uZXh0IGFzIHBvaW50ZXIuICAqLwotfSBFbGZfSW50ZXJuYWxfVmVybmF1eDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyc3ltIHNlY3Rpb24uICBUaGlzIGlzIG5vdCBhCi0gICBzdGFuZGFyZCBFTEYgc3RydWN0dXJlOyBFTEYganVzdCB1c2VzIEVsZjMyX0hhbGYuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyc3ltIHsKLSAgdW5zaWduZWQgc2hvcnQgdnNfdmVyczsKLX0gRWxmX0ludGVybmFsX1ZlcnN5bTsKLQotLyogU3RydWN0dXJlIGZvciBzeW1pbmZvIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgc2hvcnQgaW50IAlzaV9ib3VuZHRvOwotICB1bnNpZ25lZCBzaG9ydCBpbnQJc2lfZmxhZ3M7Ci19IEVsZl9JbnRlcm5hbF9TeW1pbmZvOwotCi0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyZGVmIGVsZl9pbnRlcm5hbF92ZXJkZWYKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVyZGVmIGVsZl9pbnRlcm5hbF92ZXJkZWYKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyZGF1eCBlbGZfaW50ZXJuYWxfdmVyZGF1eAotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF92ZXJkYXV4IGVsZl9pbnRlcm5hbF92ZXJkYXV4Ci0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3Zlcm5lZWQgZWxmX2ludGVybmFsX3Zlcm5lZWQKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVybmVlZCBlbGZfaW50ZXJuYWxfdmVybmVlZAotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF92ZXJuYXV4IGVsZl9pbnRlcm5hbF92ZXJuYXV4Ci0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3Zlcm5hdXggZWxmX2ludGVybmFsX3Zlcm5hdXgKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyc3ltIGVsZl9pbnRlcm5hbF92ZXJzeW0KLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVyc3ltIGVsZl9pbnRlcm5hbF92ZXJzeW0KLQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJkZWYgRWxmX0ludGVybmFsX1ZlcmRlZgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJkZWYgRWxmX0ludGVybmFsX1ZlcmRlZgotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJkYXV4IEVsZl9JbnRlcm5hbF9WZXJkYXV4Ci0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1ZlcmRhdXggRWxmX0ludGVybmFsX1ZlcmRhdXgKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfVmVybmVlZCBFbGZfSW50ZXJuYWxfVmVybmVlZAotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJuZWVkIEVsZl9JbnRlcm5hbF9WZXJuZWVkCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1Zlcm5hdXggRWxmX0ludGVybmFsX1Zlcm5hdXgKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfVmVybmF1eCBFbGZfSW50ZXJuYWxfVmVybmF1eAotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJzeW0gRWxmX0ludGVybmFsX1ZlcnN5bQotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJzeW0gRWxmX0ludGVybmFsX1ZlcnN5bQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9TeW1pbmZvIEVsZl9JbnRlcm5hbF9TeW1pbmZvCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1N5bWluZm8gRWxmX0ludGVybmFsX1N5bWluZm8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSBob3cgc2VjdGlvbnMgc2hvdWxkIGJlIGFzc2lnbmVkCi0gICB0byBwcm9ncmFtIHNlZ21lbnRzLiAgKi8KLQotc3RydWN0IGVsZl9zZWdtZW50X21hcAotewotICAvKiBOZXh0IHByb2dyYW0gc2VnbWVudC4gICovCi0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm5leHQ7Ci0gIC8qIFByb2dyYW0gc2VnbWVudCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBwX3R5cGU7Ci0gIC8qIFByb2dyYW0gc2VnbWVudCBmbGFncy4gICovCi0gIHVuc2lnbmVkIGxvbmcgcF9mbGFnczsKLSAgLyogUHJvZ3JhbSBzZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MuICAqLwotICBiZmRfdm1hIHBfcGFkZHI7Ci0gIC8qIFdoZXRoZXIgdGhlIHBfZmxhZ3MgZmllbGQgaXMgdmFsaWQ7IGlmIG5vdCwgdGhlIGZsYWdzIGFyZSBiYXNlZAotICAgICBvbiB0aGUgc2VjdGlvbiBmbGFncy4gICovCi0gIHVuc2lnbmVkIGludCBwX2ZsYWdzX3ZhbGlkIDogMTsKLSAgLyogV2hldGhlciB0aGUgcF9wYWRkciBmaWVsZCBpcyB2YWxpZDsgaWYgbm90LCB0aGUgcGh5c2ljYWwgYWRkcmVzcwotICAgICBpcyBiYXNlZCBvbiB0aGUgc2VjdGlvbiBsbWEgdmFsdWVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHBfcGFkZHJfdmFsaWQgOiAxOwotICAvKiBXaGV0aGVyIHRoaXMgc2VnbWVudCBpbmNsdWRlcyB0aGUgZmlsZSBoZWFkZXIuICAqLwotICB1bnNpZ25lZCBpbnQgaW5jbHVkZXNfZmlsZWhkciA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhpcyBzZWdtZW50IGluY2x1ZGVzIHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotICB1bnNpZ25lZCBpbnQgaW5jbHVkZXNfcGhkcnMgOiAxOwotICAvKiBOdW1iZXIgb2Ygc2VjdGlvbnMgKG1heSBiZSAwKS4gICovCi0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgLyogU2VjdGlvbnMuICBBY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGlzIGluIGNvdW50IGZpZWxkLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb25zWzFdOwotfTsKLQotI2VuZGlmIC8qIF9FTEZfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbTMyci5oIGIvaW5jbHVkZS9lbGYvbTMyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTJhZTE2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL20zMnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qIE0zMlIgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfTTMyUl9ICi0jZGVmaW5lIF9FTEZfTTMyUl9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tMzJyX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzE2LCAxKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8zMiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMjQsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzEwX1BDUkVMLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8xOF9QQ1JFTCwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMjZfUENSRUwsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX0hJMTZfVUxPLCA3KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9ISTE2X1NMTywgOCkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfTE8xNiwgOSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfU0RBMTYsIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9HTlVfVlRJTkhFUklULCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfR05VX1ZURU5UUlksIDEyKQotICBFTVBUWV9SRUxPQyAgKFJfTTMyUl9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBpbmRpY2VzLiAgVGhlc2Ugc2VjdGlvbnMgZG8gbm90IGFjdHVhbGx5Ci0gICBleGlzdC4gIFN5bWJvbHMgd2l0aCBhIHN0X3NobmR4IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZXNlCi0gICB2YWx1ZXMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZy4gICovCi0KLS8qIFNtYWxsIGNvbW1vbiBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fTTMyUl9TQ09NTU9OCTB4ZmYwMAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncy4gICovCi0KLS8qIFRoaXMgc2VjdGlvbiBjb250YWlucyBzdWZmaWNpZW50IHJlbG9jcyB0byBiZSByZWxheGVkLgotICAgV2hlbiByZWxheGluZywgZXZlbiByZWxvY3Mgb2YgYnJhbmNoIGluc3RydWN0aW9ucyB0aGUgYXNzZW1ibGVyIGNvdWxkCi0gICBjb21wbGV0ZSBtdXN0IGJlIHByZXNlbnQgYmVjYXVzZSByZWxheGluZyBtYXkgY2F1c2UgdGhlIGJyYW5jaCB0YXJnZXQgdG8KLSAgIG1vdmUuICAqLwotI2RlZmluZSBTSEZfTTMyUl9DQU5fUkVMQVgJMHgxMDAwMDAwMAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBUd28gYml0IG0zMnIgYXJjaGl0ZWN0dXJlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfTTMyUl9BUkNICQkweDMwMDAwMDAwCi0KLS8qIG0zMnIgY29kZS4gICovCi0jZGVmaW5lIEVfTTMyUl9BUkNICQkweDAwMDAwMDAwCi0vKiBtMzJyeCBjb2RlLiAgKi8KLSNkZWZpbmUgRV9NMzJSWF9BUkNICQkweDEwMDAwMDAwCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbTY4ay5oIGIvaW5jbHVkZS9lbGYvbTY4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmQ1MWVmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL202OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qIE1DNjhrIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX002OEtfSAotI2RlZmluZSBfRUxGX002OEtfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tNjhrX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfTk9ORSwgMCkJCS8qIE5vIHJlbG9jICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfMzIsIDEpCQkvKiBEaXJlY3QgMzIgYml0ICAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLXzE2LCAyKQkJLyogRGlyZWN0IDE2IGJpdCAgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S184LCAzKQkJLyogRGlyZWN0IDggYml0ICAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BDMzIsIDQpCQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QQzE2LCA1KQkJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUEM4LCA2KQkJLyogUEMgcmVsYXRpdmUgOCBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QzMiwgNykJCS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QxNiwgOCkJCS8qIDE2IGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1Q4LCA5KQkJLyogOCBiaXQgUEMgcmVsYXRpdmUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR09UMzJPLCAxMCkJLyogMzIgYml0IEdPVCBvZmZzZXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QxNk8sIDExKQkvKiAxNiBiaXQgR09UIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDhPLCAxMikJLyogOCBiaXQgR09UIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDMyLCAxMykJLyogMzIgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUMTYsIDE0KQkvKiAxNiBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQ4LCAxNSkJCS8qIDggYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUMzJPLCAxNikJLyogMzIgYml0IFBMVCBvZmZzZXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQxNk8sIDE3KQkvKiAxNiBiaXQgUExUIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDhPLCAxOCkJLyogOCBiaXQgUExUIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0NPUFksIDE5KQkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dMT0JfREFULCAyMCkJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0pNUF9TTE9ULCAyMSkJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1JFTEFUSVZFLCAyMikJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HTlVfVlRJTkhFUklULCAyMykKLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HTlVfVlRFTlRSWSwgMjQpCi0gIEVNUFRZX1JFTE9DICAoUl82OEtfbWF4KSAgIAotRU5EX1JFTE9DX05VTUJFUlMKLQotI2RlZmluZSBFRl9DUFUzMiAgICAweDAwODEwMDAwCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbWNvcmUuaCBiL2luY2x1ZGUvZWxmL21jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGE5M2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbWNvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qIE1vdG9yb2xsYSBNQ29yZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNQ29yZSBFTEYgQUJJLiAqLwotI2lmbmRlZiBfRUxGX01PUkVfSAotI2RlZmluZSBfRUxGX01PUkVfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfbWNvcmVfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9BRERSMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTElNTThCWTQsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTElNTTExQlkyLCAzKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUxJTU00QlkyLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUwzMiwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfR05VX1ZUSU5IRVJJVCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0dOVV9WVEVOVFJZLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUkVMQVRJVkUsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9DT1BZLCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0dMT0JfREFULCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0pVTVBfU0xPVCwgMTIpCi0gIEVNUFRZX1JFTE9DICAoUl9NQ09SRV9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBTZWN0aW9uIEF0dHJpYnV0ZXMuICAqLwotI2RlZmluZSBTSEZfTUNPUkVfTk9SRUFECTB4ODAwMDAwMDAKLQotI2VuZGlmIC8qIF9FTEZfTUNPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbWlwcy5oIGIvaW5jbHVkZS9lbGYvbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDNhY2JlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL21pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5NCArMCwwIEBACi0vKiBNSVBTIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCA8aWFuQGN5Z251cy5jb20+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+IDgpCi0jZGVmaW5lIEVMRjMyX01TX0ZMQUdTKGkpICAgICAoaSkgJiAweGZmKQotI2RlZmluZSBFTEYzMl9NU19JTkZPKHIsIGYpICAgKCgocikgPDwgOCkgKyAoKGYpICYgMHhmZikpCi0KLS8qIE1JUFMgRUxGIHJlZ2luZm8gc3dhcHBpbmcgcm91dGluZXMuICAqLwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICosIEVsZjY0X0ludGVybmFsX1JlZ0luZm8gKikpOwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyAqLCBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICopKTsKLQotLyogTWFza3MgZm9yIHRoZSBpbmZvIHdvcmsgb2YgYW4gT0RLX0VYQ0VQVElPTlMgZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIE9FWF9GUFVfTUlOCTB4MWYJLyogRlBFcyB3aGljaCBtdXN0IGJlIGVuYWJsZWQuICAqLwotI2RlZmluZSBPRVhfRlBVX01BWAkweDFmMDAJLyogRlBFcyB3aGljaCBtYXkgYmUgZW5hYmxlZC4gICovCi0jZGVmaW5lIE9FWF9QQUdFMAkweDEwMDAwCS8qIFBhZ2UgemVybyBtdXN0IGJlIG1hcHBlZC4gICovCi0jZGVmaW5lIE9FWF9TTU0JCTB4MjAwMDAJLyogRm9yY2Ugc2VxdWVudGlhbCBtZW1vcnkgbW9kZS4gICovCi0jZGVmaW5lIE9FWF9GUERCVUcJMHg0MDAwMAkvKiBGb3JjZSBmbG9hdGluZy1wb2ludCBkZWJ1ZyBtb2RlLiAgKi8KLSNkZWZpbmUgT0VYX0RJU01JU1MJMHg4MDAwMAkvKiBEaXNtaXNzIGludmFsaWQgYWRkcmVzcyBmYXVsdHMuICAqLwotCi0vKiBNYXNrcyBvZiB0aGUgRlAgZXhjZXB0aW9ucyBmb3IgT0VYX0ZQVV9NSU4gYW5kIE9FWF9GUFVfTUFYLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9JTlZBTAkweDEwCS8qIEludmFsaWQgb3BlcmF0aW9uIGV4Y2VwdGlvbi4gICovCi0jZGVmaW5lIE9FWF9GUFVfRElWMAkweDA4CS8qIERpdmlzaW9uIGJ5IHplcm8gZXhjZXB0aW9uLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9PRkxPCTB4MDQJLyogT3ZlcmZsb3cgZXhjZXB0aW9uLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9VRkxPCTB4MDIJLyogVW5kZXJmbG93IGV4Y2VwdGlvbi4gICovCi0jZGVmaW5lIE9FWF9GUFVfSU5FWAkweDAxCS8qIEluZXhhY3QgZXhjZXB0aW9uLiAgKi8KLQotLyogTWFza3MgZm9yIHRoZSBpbmZvIHdvcmQgb2YgYW4gT0RLX1BBRCBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgT1BBRF9QUkVGSVgJMHgwMQotI2RlZmluZSBPUEFEX1BPU1RGSVgJMHgwMgotI2RlZmluZSBPUEFEX1NZTUJPTAkweDA0Ci0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JkIG9mIGFuIE9ES19IV1BBVENIIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBPSFdfUjRLRU9QCTB4MDEJLyogUjQwMDAgZW5kLW9mLXBhZ2UgcGF0Y2guICAqLwotI2RlZmluZSBPSFdfUjhLUEZFVENICTB4MDIJLyogTWF5IG5lZWQgUjgwMDAgcHJlZmV0Y2ggcGF0Y2guICAqLwotI2RlZmluZSBPSFdfUjVLRU9QCTB4MDQJLyogUjUwMDAgZW5kLW9mLXBhZ2UgcGF0Y2guICAqLwotI2RlZmluZSBPSFdfUjVLQ1ZUTAkweDA4CS8qIFI1MDAwIGN2dC5bZHNdLmwgYnVnIChjbGVhbiA9PSAxKS4gICovCi0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JkIG9mIGFuIE9ES19JREVOVC9PREtfR1BfR1JPVVAgZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIE9HUF9HUk9VUAkweDAwMDBmZmZmCS8qIEdQIGdyb3VwIG51bWJlci4gICovCi0jZGVmaW5lIE9HUF9TRUxGCTB4ZmZmZjAwMDAJLyogU2VsZi1jb250YWluZWQgR1AgZ3JvdXBzLiAgKi8KLQotLyogTWFza3MgZm9yIHRoZSBpbmZvIHdvcmQgb2YgYW4gT0RLX0hXQU5EL09ES19IV09SIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBPSFdBMF9SNEtFT1BfQ0hFQ0tFRAkweDAwMDAwMDAxCi0jZGVmaW5lIE9IV0EwX1I0S0VPUF9DTEVBTgkweDAwMDAwMDAyCi0MCi0KLSNlbmRpZiAvKiBfRUxGX01JUFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbW4xMDIwMC5oIGIvaW5jbHVkZS9lbGYvbW4xMDIwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTI5ZTBhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL21uMTAyMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIE1OMTAyMDAgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1OMTAyMDAgRUxGIEFCSS4gKi8KLQotI2lmbmRlZiBfRUxGX01OMTAyMDBfSAotI2RlZmluZSBfRUxGX01OMTAyMDBfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfbW4xMDIwMF9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF8zMiwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfMTYsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwXzgsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwXzI0LCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9QQ1JFTDgsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwX1BDUkVMMTYsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwX1BDUkVMMjQsIDcpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYgLyogX0VMRl9NTjEwMjAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL21uMTAzMDAuaCBiL2luY2x1ZGUvZWxmL21uMTAzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5MGExMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9tbjEwMzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBNTjEwMzAwIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNTjEwMzAwIEVMRiBBQkkuICovCi0KLSNpZm5kZWYgX0VMRl9NTjEwMzAwX0gKLSNkZWZpbmUgX0VMRl9NTjEwMzAwX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX21uMTAzMDBfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwXzE2LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF84LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9QQ1JFTDMyLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9QQ1JFTDE2LCA1KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9QQ1JFTDgsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX0dOVV9WVEVOVFJZLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF8yNCwgOSkKLSAgRU1QVFlfUkVMT0MgIChSX01OMTAzMDBfTUFYKQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogTWFjaGluZSB2YXJpYW50IGlmIHdlIGtub3cgaXQuICBUaGlzIGZpZWxkIHdhcyBpbnZlbnRlZCBhdCBDeWdudXMsCi0gICBidXQgaXQgaXMgaG9wZWQgdGhhdCBvdGhlciB2ZW5kb3JzIHdpbGwgYWRvcHQgaXQuICBJZiBzb21lIHN0YW5kYXJkCi0gICBpcyBkZXZlbG9wZWQsIHRoaXMgY29kZSBzaG91bGQgYmUgY2hhbmdlZCB0byBmb2xsb3cgaXQuICovCi0KLSNkZWZpbmUgRUZfTU4xMDMwMF9NQUNICQkweDAwRkYwMDAwCi0KLS8qIEN5Z251cyBpcyBjaG9vc2luZyB2YWx1ZXMgYmV0d2VlbiA4MCBhbmQgOUY7Ci0gICAwMCAtIDdGIHNob3VsZCBiZSBsZWZ0IGZvciBhIGZ1dHVyZSBzdGFuZGFyZDsKLSAgIHRoZSByZXN0IGFyZSBvcGVuLiAqLwotCi0jZGVmaW5lIEVfTU4xMDMwMF9NQUNIX01OMTAzMDAJMHgwMDgxMDAwMAotI2RlZmluZSBFX01OMTAzMDBfTUFDSF9BTTMzCTB4MDA4MjAwMDAKLSNlbmRpZiAvKiBfRUxGX01OMTAzMDBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvcGouaCBiL2luY2x1ZGUvZWxmL3BqLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjgzMDYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvcGouaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qIHBpY29KYXZhIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX1BKX0gKLSNkZWZpbmUgX0VMRl9QSl9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLQotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX3BqX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9QSl9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfUEpfREFUQV9ESVIzMiwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX1BKX0NPREVfUkVMMzIsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9QSl9DT0RFX1JFTDE2LCAzKSAKLSAgUkVMT0NfTlVNQkVSIChSX1BKX0NPREVfRElSMzIsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9QSl9DT0RFX0RJUjE2LCA3KSAgCi0gIFJFTE9DX05VTUJFUiAoUl9QSl9DT0RFX0xPMTYsIDEzKQotICBSRUxPQ19OVU1CRVIgKFJfUEpfQ09ERV9ISTE2LCAxNCkKLSAgUkVMT0NfTlVNQkVSIChSX1BKX0dOVV9WVElOSEVSSVQsIDE1KQotICBSRUxPQ19OVU1CRVIgKFJfUEpfR05VX1ZURU5UUlksIDE2KQotICBFTVBUWV9SRUxPQyAoUl9QSl9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZGVmaW5lIEVGX1BJQ09KQVZBX0FSQ0ggICAgIDB4MDAwMDAwMGYKLSNkZWZpbmUgRUZfUElDT0pBVkFfTkVXQ0FMTFMgMHgwMDAwMDAxMAotI2RlZmluZSBFRl9QSUNPSkFWQV9HTlVDQUxMUyAweDAwMDAwMDIwICAvKiBUaGUgKGN1cnJlbnRseSkgbm9uIHN0YW5kYXJkIEdOVSBjYWxsaW5nIGNvbnZlbnRpb24gKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9wcGMuaCBiL2luY2x1ZGUvZWxmL3BwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzExNmQ4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3BwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qIFBQQyBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBCeSBNaWNoYWVsIE1laXNzbmVyLCBDeWdudXMgU3VwcG9ydCwgPG1laXNzbmVyQGN5Z251cy5jb20+LCBmcm9tIGluZm9ybWF0aW9uCi0gICBpbiB0aGUgU3lzdGVtIFYgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSwgUG93ZXJQQyBQcm9jZXNzb3IgU3VwcGxlbWVudAotICAgYW5kIHRoZSBQb3dlclBDIEVtYmVkZGVkIEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UgKGVhYmkpLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgUFBDIEVMRiBBQkkuICBOb3RlCi0gICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KLQotI2lmbmRlZiBfRUxGX1BQQ19ICi0jZGVmaW5lIF9FTEZfUFBDX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX3BwY19yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIyNCwgMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTYsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE2X0xPLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNl9ISSwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTZfSEEsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE0LCA3KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNF9CUlRBS0VOLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNF9CUk5UQUtFTiwgOSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUwyNCwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMMTQsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDE0X0JSVEFLRU4sIDEyKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDE0X0JSTlRBS0VOLCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HT1QxNiwgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR09UMTZfTE8sIDE1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dPVDE2X0hJLCAxNikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HT1QxNl9IQSwgMTcpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUUkVMMjQsIDE4KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0NPUFksIDE5KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dMT0JfREFULCAyMCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19KTVBfU0xPVCwgMjEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMQVRJVkUsIDIyKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0xPQ0FMMjRQQywgMjMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfVUFERFIzMiwgMjQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfVUFERFIxNiwgMjUpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMMzIsIDI2KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVDMyLCAyNykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFRSRUwzMiwgMjgpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUMTZfTE8sIDI5KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVDE2X0hJLCAzMCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFQxNl9IQSwgMzEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfU0RBUkVMMTYsIDMyKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NFQ1RPRkYsIDMzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NFQ1RPRkZfTE8sIDM0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NFQ1RPRkZfSEksIDM1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NFQ1RPRkZfSEEsIDM2KQotCi0vKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgZnJvbSB0aGUgRW1iZWRkZWQgRUxGIEFCSSwgYW5kIGFyZSBub3QKLSAgIGluIHRoZSBTVlI0IEVMRiBBQkkuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjMyLCAxMDEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX05BRERSMTYsIDEwMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTkFERFIxNl9MTywgMTAzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjE2X0hJLCAxMDQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX05BRERSMTZfSEEsIDEwNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfU0RBSTE2LCAxMDYpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1NEQTJJMTYsIDEwNykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfU0RBMlJFTCwgMTA4KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9TREEyMSwgMTA5KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9NUktSRUYsIDExMCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU0VDMTYsIDExMSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU1RfTE8sIDExMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU1RfSEksIDExMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU1RfSEEsIDExNCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfQklUX0ZMRCwgMTE1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9SRUxTREEsIDExNikKLQotICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HTlVfVlRJTkhFUklULCAyNTMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR05VX1ZURU5UUlksIDI1NCkKLQotLyogVGhpcyBpcyBhIHBob255IHJlbG9jIHRvIGhhbmRsZSBhbnkgb2xkIGZhc2hpb25lZCBUT0MxNiByZWZlcmVuY2VzCi0gICB0aGF0IG1heSBzdGlsbCBiZSBpbiBvYmplY3QgZmlsZXMuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1RPQzE2LCAyNTUpCi0KLSAgRU1QVFlfUkVMT0MgKFJfUFBDX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotI2RlZmluZQlFRl9QUENfRU1CCQkweDgwMDAwMDAwCS8qIFBvd2VyUEMgZW1iZWRkZWQgZmxhZyAgKi8KLQotCQkJCQkJLyogQ1lHTlVTIGxvY2FsIGJpdHMgYmVsb3cgKi8KLSNkZWZpbmUJRUZfUFBDX1JFTE9DQVRBQkxFCTB4MDAwMTAwMDAJLyogUG93ZXJQQyAtbXJlbG9jYXRhYmxlIGZsYWcgKi8KLSNkZWZpbmUJRUZfUFBDX1JFTE9DQVRBQkxFX0xJQgkweDAwMDA4MDAwCS8qIFBvd2VyUEMgLW1yZWxvY2F0YWJsZS1saWIgZmxhZyAqLwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBoZWFkZXJzLCBzaF90eXBlIGZpZWxkICovCi0KLSNkZWZpbmUgU0hUX09SREVSRUQJCVNIVF9ISVBST0MJLyogTGluayBlZGl0b3IgaXMgdG8gc29ydCB0aGUgXAotCQkJCQkJICAgZW50cmllcyBpbiB0aGlzIHNlY3Rpb24gXAotCQkJCQkJICAgYmFzZWQgb24gdGhlIGFkZHJlc3MgXAotCQkJCQkJICAgc3BlY2lmaWVkIGluIHRoZSBhc3NvY2lhdGVkIFwKLQkJCQkJCSAgIHN5bWJvbCB0YWJsZSBlbnRyeS4gICovCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLCBzaF9mbGFncyBmaWVsZCAqLwotCi0jZGVmaW5lIFNIRl9FWENMVURFCQkweDgwMDAwMDAwCS8qIExpbmsgZWRpdG9yIGlzIHRvIGV4Y2x1ZGUgXAotCQkJCQkJICAgdGhpcyBzZWN0aW9uIGZyb20gZXhlY3V0YWJsZSBcCi0JCQkJCQkgICBhbmQgc2hhcmVkIG9iamVjdHMgdGhhdCBpdCBcCi0JCQkJCQkgICBidWlsZHMgd2hlbiB0aG9zZSBvYmplY3RzIFwKLQkJCQkJCSAgIGFyZSBub3QgdG8gYmUgZnVyaHRlciBcCi0JCQkJCQkgICByZWxvY2F0ZWQuICAqLwotI2VuZGlmIC8qIF9FTEZfUFBDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3JlbG9jLW1hY3Jvcy5oIGIvaW5jbHVkZS9lbGYvcmVsb2MtbWFjcm9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTc0Y2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvcmVsb2MtbWFjcm9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogR2VuZXJpYyByZWxvY2F0aW9uIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgYnkgdGhlIHZhcmlvdXMgKi5oIHRhcmdldCBzcGVjaWZpYyBoZWFkZXIKLSAgIGZpbGVzIHRvIGVpdGhlciBnZW5lcmF0ZSBhbiBlbnVtIGNvbnRhaW5pbmcgYWxsIHRoZSBrbm93biByZWxvY2F0aW9ucwotICAgZm9yIHRoYXQgdGFyZ2V0LCBvciBpZiBSRUxPQ19NQUNST1NfR0VOX0ZVTkMgaXMgZGVmaW5lZCwgYSByZWNvZ25pdGlvbgotICAgZnVuY3Rpb24gaXMgZ2VuZXJhdGVkIGluc3RlYWQuICAoVGhpcyBpcyB1c2VkIGJ5IGJpbnV0aWxzL3JlYWRlbGYuYykKLQotICAgR2l2ZW4gYSBoZWFkZXIgZmlsZSBsaWtlIHRoaXM6Ci0KLSAgIAlTVEFSVF9SRUxPQ19OVU1CRVJTIChmb28pCi0gICAJICAgIFJFTE9DX05VTUJFUiAoUl9mb29fTk9ORSwgICAgMCkKLSAgIAkgICAgUkVMT0NfTlVNQkVSIChSX2Zvb18zMiwgICAgICAxKQotICAgCSAgICBGQUtFX1JFTE9DICAgKFJfZm9vX2lsbGVnYWwsIDIpCi0gICAJICAgIEVNUFRZX1JFTE9DICAoUl9mb29fbWF4KQotICAgCUVORF9SRUxPQ19OVU1CRVJTCi0KLSAgIFRoZW4gdGhlIGZvbGxvd2luZyB3aWxsIGJlIHByb2R1Y2VkIGJ5IGRlZmF1bHQgKGllIGlmCi0gICBSRUxPQ19NQUNST1NfR0VOX0ZVTkMgaXMgKm5vdCogZGVmaW5lZCkuCi0KLSAgIAllbnVtIGZvbwotCXsKLQkgIGZvbyA9IC0xLAotICAgCSAgUl9mb29fTk9ORSA9IDAsCi0gICAJICBSX2Zvb18zMiA9IDEsCi0gICAJICBSX2Zvb19pbGxlZ2FsID0gMiwKLSAgIAkgIFJfZm9vX21heAotICAgCX07Ci0KLSAgIElmIFJFTE9DX01BQ1JPU19HRU5fRlVOQyAqaXMqIGRlZmluZWQsIHRoZW4gaW5zdGVhZCB0aGUKLSAgIGZvbGxvd2luZyBmdW5jdGlvbiB3aWxsIGJlIGdlbmVyYXRlZDoKLQotICAgCXN0YXRpYyBjb25zdCBjaGFyICogZm9vIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgcnR5cGUpKTsKLSAgIAlzdGF0aWMgY29uc3QgY2hhciAqCi0gICAJZm9vIChydHlwZSkKLSAgIAkgICAgdW5zaWduZWQgbG9uZyBydHlwZTsKLSAgIAl7Ci0gICAJICAgc3dpdGNoIChydHlwZSkKLSAgIAkgICB7Ci0gICAJICAgY2FzZSAwOiByZXR1cm4gIlJfZm9vX05PTkUiOwotICAgCSAgIGNhc2UgMTogcmV0dXJuICJSX2Zvb18zMiI7Ci0gICAJICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7Ci0gICAJICAgfQotICAgCX0KLSAgICovCi0gICAKLSNpZm5kZWYgX1JFTE9DX01BQ1JPU19ICi0jZGVmaW5lIF9SRUxPQ19NQUNST1NfSAotCi0jaWZkZWYgUkVMT0NfTUFDUk9TX0dFTl9GVU5DCi0KLS8qIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHJlbG9jYXRpb24gbnVtYmVyIGFuZCByZXR1cm5zIHRoZQotICAgc3RyaW5nIHZlcnNpb24gbmFtZSBvZiB0aGUgbmFtZSBvZiB0aGF0IHJlbG9jYXRpb24uICBJZgotICAgdGhlIHJlbG9jYXRpb24gaXMgbm90IHJlY29nbmlzZWQsIE5VTEwgaXMgcmV0dXJuZWQuICAqLwotCi0jZGVmaW5lIFNUQVJUX1JFTE9DX05VTUJFUlMobmFtZSkgICAJCQkJXAotc3RhdGljIGNvbnN0IGNoYXIgKiBuYW1lICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgcnR5cGUpKTsgCVwKLXN0YXRpYyBjb25zdCBjaGFyICoJCQkJCQlcCi1uYW1lIChydHlwZSkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgcnR5cGU7CQkJCQlcCi17CQkJCQkJCQlcCi0gIHN3aXRjaCAocnR5cGUpCQkJCQkJXAotICB7Ci0KLSNpZmRlZiBfX1NURENfXwkJCQkJICAKLSNkZWZpbmUgUkVMT0NfTlVNQkVSKG5hbWUsIG51bWJlcikgIGNhc2UgbnVtYmVyIDogcmV0dXJuICNuYW1lIDsKLSNlbHNlCi0jZGVmaW5lIFJFTE9DX05VTUJFUihuYW1lLCBudW1iZXIpICBjYXNlIG51bWJlciA6IHJldHVybiAibmFtZSIgOwotI2VuZGlmCi0KLSNkZWZpbmUgRkFLRV9SRUxPQyhuYW1lLCBudW1iZXIpICAgIAotI2RlZmluZSBFTVBUWV9SRUxPQyhuYW1lKQotCQkJCQkgIAotI2RlZmluZSBFTkRfUkVMT0NfTlVNQkVSUwlcCi0gICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CVwKLSAgfQkJCQlcCi19Ci0KLQotI2Vsc2UgLyogRGVmYXVsdCB0byBnZW5lcmF0aW5nIGVudW0uICAqLwotCi0vKiBTb21lIGNvbXBpbGVycyBjYW5ub3QgY29wZSB3aXRoIGFuIGVudW0gdGhhdCBlbmRzIHdpdGggYSB0cmFpbGluZwotICAgY29tbWEsIHNvIFNUQVJUX1JFTE9DX05VTUJFUlMgY3JlYXRlcyBhIGZha2UgcmVsb2MgZW50cnksIChpbml0aWFsaXNlZAotICAgdG8gLTEgc28gdGhhdCB0aGUgZmlyc3QgcmVhbCBlbnRyeSB3aWxsIHN0aWxsIGRlZmF1bHQgdG8gMCkuICBGdXJ0aGVyCi0gICBlbnRyaWVzIHRoZW4gcHJlcGVuZCBhIGNvbW1hIHRvIHRoZWlyIGRlZmluaXRpb25zLCBjcmVhdGluZyBhIGxpc3QKLSAgIG9mIGVudW1lcmF0b3IgZW50cmllcyB0aGF0IHdpbGwgc2F0aXNmeSB0aGVzZSBjb21waWxlcnMuICAqLwotI2lmZGVmIF9fU1REQ19fCi0jZGVmaW5lIFNUQVJUX1JFTE9DX05VTUJFUlMobmFtZSkgICBlbnVtIG5hbWUgeyBfIyNuYW1lID0gLTEKLSNlbHNlCi0jZGVmaW5lIFNUQVJUX1JFTE9DX05VTUJFUlMobmFtZSkgICBlbnVtIG5hbWUgeyBuYW1lID0gLTEKLSNlbmRpZgotCQkJCQkJCi0jZGVmaW5lIFJFTE9DX05VTUJFUihuYW1lLCBudW1iZXIpICAsIG5hbWUgPSBudW1iZXIKLSNkZWZpbmUgRkFLRV9SRUxPQyhuYW1lLCBudW1iZXIpICAgICwgbmFtZSA9IG51bWJlciAKLSNkZWZpbmUgRU1QVFlfUkVMT0MobmFtZSkgICAgICAgICAgICwgbmFtZSAKLSNkZWZpbmUgRU5EX1JFTE9DX05VTUJFUlMgICAgICAgICAgIH07Ci0KLSNlbmRpZgotCi0jZW5kaWYgLyogUkVMT0NfTUFDUk9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3NoLmggYi9pbmNsdWRlL2VsZi9zaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTQ3NjY3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3NoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBTSCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9TSF9ICi0jZGVmaW5lIF9FTEZfU0hfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi0vKiBSZWxvY2F0aW9ucyAyNWZmIGFyZSBHTlUgZXh0ZW5zaW9ucy4KLSAgIDI1Li4zMyBhcmUgdXNlZCBmb3IgcmVsYXhhdGlvbiBhbmQgdXNlIHRoZSBzYW1lIGNvbnN0YW50cyBhcyBDT0ZGIHVzZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX3NoX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9SRUwzMiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXUE4sIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9JTkQxMlcsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9ESVI4V1BMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOFdQWiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhCUCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOEwsIDkpCi0gIEZBS0VfUkVMT0MgKFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQywgMTApCi0gIEZBS0VfUkVMT0MgKFJfU0hfTEFTVF9JTlZBTElEX1JFTE9DLCAyNCkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDE2LCAyNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDMyLCAyNikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1VTRVMsIDI3KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQ09VTlQsIDI4KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQUxJR04sIDI5KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQ09ERSwgMzApCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9EQVRBLCAzMSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0xBQkVMLCAzMikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDgsIDMzKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfR05VX1ZUSU5IRVJJVCwgMzQpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9HTlVfVlRFTlRSWSwgMzUpCi0gIEVNUFRZX1JFTE9DIChSX1NIX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvc3BhcmMuaCBiL2luY2x1ZGUvZWxmL3NwYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MGU0YTguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvc3BhcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKiBTUEFSQyBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQnkgRG91ZyBFdmFucywgQ3lnbnVzIFN1cHBvcnQsIDxkamVAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX1NQQVJDX0gKLSNkZWZpbmUgX0VMRl9TUEFSQ19ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIFRoZXNlIGFyZSBkZWZpbmVkIGJ5IFN1bi4gICovCi0KLSNkZWZpbmUgRUZfU1BBUkNfMzJQTFVTX01BU0sJMHhmZmZmMDAJLyogYml0cyBpbmRpY2F0aW5nIFY4KyB0eXBlICovCi0jZGVmaW5lIEVGX1NQQVJDXzMyUExVUwkJMHgwMDAxMDAJLyogZ2VuZXJpYyBWOCsgZmVhdHVyZXMgKi8KLSNkZWZpbmUgRUZfU1BBUkNfU1VOX1VTMQkweDAwMDIwMAkvKiBTdW4gVWx0cmFTUEFSQzEgZXh0ZW5zaW9ucyAqLwotI2RlZmluZSBFRl9TUEFSQ19IQUxfUjEJCTB4MDAwNDAwCS8qIEhBTCBSMSBleHRlbnNpb25zICovCi0jZGVmaW5lIEVGX1NQQVJDX1NVTl9VUzMJMHgwMDA4MDAJLyogU3VuIFVsdHJhU1BBUkNJSUkgZXh0ZW5zaW9ucyAqLwotCi0jZGVmaW5lIEVGX1NQQVJDX0xFREFUQSAgICAgICAgIDB4ODAwMDAwCS8qIGxpdHRsZSBlbmRpYW4gZGF0YSAqLwotCi0vKiBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUgVjkgQUJJLiAgKi8KLSNkZWZpbmUgRUZfU1BBUkNfRVhUX01BU0sJMHhmZmZmMDAJLyogcmVzZXJ2ZWQgZm9yIHZlbmRvciBleHRlbnNpb25zICovCi0KLS8qIFY5IG1lbW9yeSBtb2RlbHMgKi8KLSNkZWZpbmUgRUZfU1BBUkNWOV9NTQkJMHgzCQkvKiBtZW1vcnkgbW9kZWwgbWFzayAqLwotI2RlZmluZSBFRl9TUEFSQ1Y5X1RTTwkJMHgwCQkvKiB0b3RhbCBzdG9yZSBvcmRlcmluZyAqLwotI2RlZmluZSBFRl9TUEFSQ1Y5X1BTTwkJMHgxCQkvKiBwYXJ0aWFsIHN0b3JlIG9yZGVyaW5nICovCi0jZGVmaW5lIEVGX1NQQVJDVjlfUk1PCQkweDIJCS8qIHJlbGF4ZWQgc3RvcmUgb3JkZXJpbmcgKi8KLQotLyogU2VjdGlvbiBpbmRpY2VzLiAgKi8KLQotI2RlZmluZSBTSE5fQkVGT1JFCQkweGZmMDAJCS8qIHVzZWQgd2l0aCBTSEZfT1JERVJFRCAqLwotI2RlZmluZSBTSE5fQUZURVIJCTB4ZmYwMQkJLyogdXNlZCB3aXRoIFNIRl9PUkRFUkVEICovCi0KLS8qIFNlY3Rpb24gZmxhZ3MuICAqLwotCi0jZGVmaW5lIFNIRl9FWENMVURFCQkweDgwMDAwMDAwCS8qIGV4Y2x1ZGUgZnJvbSBsaW5raW5nICovCi0jZGVmaW5lIFNIRl9PUkRFUkVECQkweDQwMDAwMDAwCS8qIHRyZWF0IHNoX2xpbmssc2hfaW5mbyBzcGVjaWFsbHkgKi8KLQotLyogU3ltYm9sIHR5cGVzLiAgKi8KLQotI2RlZmluZSBTVFRfUkVHSVNURVIJCTEzCQkvKiBnbG9iYWwgcmVnIHJlc2VydmVkIHRvIGFwcC4gKi8KLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbiB0eXBlcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfc3BhcmNfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ184LCAxKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMTYsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18zMiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0RJU1A4LCA0KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfRElTUDE2LCA1KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfRElTUDMyLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV0RJU1AzMCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1dESVNQMjIsIDgpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ISTIyLCA5KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMjIsIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMTMsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTE8xMCwgMTIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HT1QxMCwgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HT1QxMywgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HT1QyMiwgMTUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQzEwLCAxNikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDMjIsIDE3KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV1BMVDMwLCAxOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0NPUFksIDE5KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR0xPQl9EQVQsIDIwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSk1QX1NMT1QsIDIxKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUkVMQVRJVkUsIDIyKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfVUEzMiwgMjMpCi0KLSAgLyogPz8/IFRoZXNlIDYgcmVsb2NzIGFyZSBuZXcgYnV0IG5vdCBjdXJyZW50bHkgdXNlZC4gIEZvciBiaW5hcnkKLSAgICAgY29tcGF0aWxpdHkgaW4gdGhlIHNwYXJjNjQtZWxmIHRvb2xjaGFpbiwgd2UgbGVhdmUgdGhlbSBvdXQuCi0gICAgIEEgbm9uLWJpbmFyeSB1cHdhcmQgY29tcGF0aWJsZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgZm9yIHNwYXJjNjQtZWxmLiAgKi8KLSNpZm5kZWYgU1BBUkM2NF9PTERfUkVMT0NTCi0gIC8qID8/PyBOZXcgcmVsb2NzIG9uIHRoZSBVbHRyYVNQQVJDLiAgTm90IHN1cmUgd2hhdCB0aGV5J3JlIGZvciB5ZXQuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUExUMzIsIDI0KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSElQTFQyMiwgMjUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MT1BMVDEwLCAyNikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDUExUMzIsIDI3KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENQTFQyMiwgMjgpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ1BMVDEwLCAyOSkKLSNlbmRpZgotCi0gIC8qIHY5IHJlbG9jcyAqLwotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMTAsIDMwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMTEsIDMxKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfNjQsIDMyKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfT0xPMTAsIDMzKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSEgyMiwgMzQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ITTEwLCAzNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0xNMjIsIDM2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENfSEgyMiwgMzcpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ19ITTEwLCAzOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDX0xNMjIsIDM5KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV0RJU1AxNiwgNDApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XRElTUDE5LCA0MSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1VOVVNFRF80MiwgNDIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ183LCA0MykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzUsIDQ0KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfNiwgNDUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ESVNQNjQsIDQ2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUExUNjQsIDQ3KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSElYMjIsIDQ4KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTE9YMTAsIDQ5KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSDQ0LCA1MCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX000NCwgNTEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MNDQsIDUyKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUkVHSVNURVIsIDUzKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfVUE2NCwgNTQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19VQTE2LCA1NSkKLQotICAvKiBsaXR0bGUgZW5kaWFuIGRhdGEgcmVsb2NzICovCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19SRVYzMiwgNTYpCi0KLSAgRU1QVFlfUkVMT0MgIChSX1NQQVJDX21heF9zdGQpCi0KLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dOVV9WVElOSEVSSVQsIDI1MCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dOVV9WVEVOVFJZLCAyNTEpCi0KLSAgRU1QVFlfUkVMT0MgIChSX1NQQVJDX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLS8qIFJlbG9jYXRpb24gbWFjcm9zLiAgKi8KLQotI2RlZmluZSBFTEY2NF9SX1RZUEVfREFUQShpbmZvKSBcCi0gICgoKGJmZF9zaWduZWRfdm1hKShFTEY2NF9SX1RZUEUoaW5mbykgPj4gOCkgXiAweDgwMDAwMCkgLSAweDgwMDAwMCkKLSNkZWZpbmUgRUxGNjRfUl9UWVBFX0lEKGluZm8pIFwKLSAgKChpbmZvKSAmIDB4ZmYpCi0jZGVmaW5lIEVMRjY0X1JfVFlQRV9JTkZPKGRhdGEsIHR5cGUpIFwKLSAgKCgoYmZkX3ZtYSkgKChkYXRhKSAmIDB4ZmZmZmZmKSA8PCA4KSB8IChiZmRfdm1hKSAodHlwZSkpCi0KLS8qIFZhbHVlcyBmb3IgRWxmNjRfRHluLmRfdGFnLiAgKi8KLQotI2RlZmluZSBEVF9TUEFSQ19SRUdJU1RFUgkweDcwMDAwMDAxCi0KLSNlbmRpZiAvKiBfRUxGX1NQQVJDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3Y4NTAuaCBiL2luY2x1ZGUvZWxmL3Y4NTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0M2I3Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi92ODUwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogVjg1MCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ3JlYXRlZCBieSBNaWNoYWVsIE1laXNzbmVyLCBDeWdudXMgU3VwcG9ydCA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1JUFMgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfVjg1MF9ICi0jZGVmaW5lIF9FTEZfVjg1MF9ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIEZvdXIgYml0IFY4NTAgYXJjaGl0ZWN0dXJlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfVjg1MF9BUkNICQkweGYwMDAwMDAwCi0KLS8qIHY4NTAgY29kZS4gICovCi0jZGVmaW5lIEVfVjg1MF9BUkNICQkweDAwMDAwMDAwCi0KLS8qIHY4NTBlIGNvZGUuICAqLwotI2RlZmluZSBFX1Y4NTBFX0FSQ0gJCTB4MTAwMDAwMDAKLQotLyogdjg1MGVhIGNvZGUuICAqLwotI2RlZmluZSBFX1Y4NTBFQV9BUkNICQkweDIwMDAwMDAwCi0KLQotLyogRmxhZ3MgZm9yIHRoZSBzdF9vdGhlciBmaWVsZCAqLwotI2RlZmluZSBWODUwX09USEVSX1NEQQkJMHgwMQkvKiBzeW1ib2wgaGFkIFNEQSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX1pEQQkJMHgwMgkvKiBzeW1ib2wgaGFkIFpEQSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX1REQQkJMHgwNAkvKiBzeW1ib2wgaGFkIFREQSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX1REQV9CWVRFCTB4MDgJLyogc3ltYm9sIGhhZCBUREEgYnl0ZSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX0VSUk9SCTB4ODAJLyogc3ltYm9sIGhhZCBhbiBlcnJvciByZXBvcnRlZCAqLwotCi0vKiBWODUwIHJlbG9jYXRpb25zICovCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi1TVEFSVF9SRUxPQ19OVU1CRVJTICh2ODUwX3JlbG9jX3R5cGUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX05PTkUsIDApCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzlfUENSRUwsIDEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzIyX1BDUkVMLCAyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9ISTE2X1MsIDMpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0hJMTYsIDQpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0xPMTYsIDUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzMyLCA2KQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF8xNiwgNykKLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfOCwgOCkKLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCwgOSkJCS8qIEZvciBsZC5iLCBzdC5iLCBzZXQxLCBjbHIxLCBub3QxLCB0c3QxLCBtb3ZlYSwgbW92aGkgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCwgMTApCQkvKiBGb3IgbGQudywgbGQuaCwgbGQuaHUsIHN0LncsIHN0LmggKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCwgMTEpCQkvKiBGb3IgbGQuYiwgc3QuYiwgc2V0MSwgY2xyMSwgbm90MSwgdHN0MSwgbW92ZWEsIG1vdmhpICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQsIDEyKQkJLyogRm9yIGxkLncsIGxkLmgsIGxkLmh1LCBzdC53LCBzdC5oICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV82XzhfT0ZGU0VULCAxMykJCS8qIEZvciBzc3Qudywgc2xkLncgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfVERBXzdfOF9PRkZTRVQsIDE0KQkJLyogRm9yIHNzdC5oLCBzbGQuaCAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9UREFfN183X09GRlNFVCwgMTUpCQkvKiBGb3Igc3N0LmIsIHNsZC5iICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV8xNl8xNl9PRkZTRVQsIDE2KQkJLyogRm9yIHNldDEsIGNscjEsIG5vdDEsIHRzdDEsIG1vdmVhLCBtb3ZoaSAqLwotLyogQ1lHTlVTIExPQ0FMIHY4NTBlICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV80XzVfT0ZGU0VULCAxNykJCS8qIEZvciBzbGQuaHUgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfVERBXzRfNF9PRkZTRVQsIDE4KQkJLyogRm9yIHNsZC5idSAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VULCAxOSkJLyogRm9yIGxkLmJ1ICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQsIDIwKQkvKiBGb3IgbGQuYnUgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCwgMjEpCQkvKiBGb3IgY2FsbHQgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULCAyMikJLyogRm9yIGNhbGx0ICovCi0vKiBFTkQgQ1lHTlVTIExPQ0FMICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0dOVV9WVElOSEVSSVQsIDIzKQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9HTlVfVlRFTlRSWSwgMjQpCi0KLSAgICAgRU1QVFlfUkVMT0MgKFJfVjg1MF9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBpbmRpY2VzLiAgVGhlc2Ugc2VjdGlvbnMgZG8gbm90IGFjdHVhbGx5Ci0gICBleGlzdC4gIFN5bWJvbHMgd2l0aCBhIHN0X3NobmR4IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZXNlCi0gICB2YWx1ZXMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZy4gICovCi0KLS8qIFNtYWxsIGRhdGEgYXJlYSBjb21tb24gc3ltYm9sLiAgKi8KLSNkZWZpbmUgU0hOX1Y4NTBfU0NPTU1PTgkweGZmMDAKLQotLyogVGlueSBkYXRhIGFyZWEgY29tbW9uIHN5bWJvbC4gICovCi0jZGVmaW5lIFNITl9WODUwX1RDT01NT04JMHhmZjAxCi0KLS8qIFplcm8gZGF0YSBhcmVhIGNvbW1vbiBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fVjg1MF9aQ09NTU9OCTB4ZmYwMgotCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gICovCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgdGhlIC5zY29tbW9uIGRhdGEuICAqLwotI2RlZmluZSBTSFRfVjg1MF9TQ09NTU9OCTB4NzAwMDAwMDAKLQotLyogU2VjdGlvbiBjb250YWlucyB0aGUgLnNjb21tb24gZGF0YS4gICovCi0jZGVmaW5lIFNIVF9WODUwX1RDT01NT04JMHg3MDAwMDAwMQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHRoZSAuc2NvbW1vbiBkYXRhLiAgKi8KLSNkZWZpbmUgU0hUX1Y4NTBfWkNPTU1PTgkweDcwMDAwMDAyCi0KLQotI2VuZGlmIC8qIF9FTEZfVjg1MF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Zsb2F0Zm9ybWF0LmggYi9pbmNsdWRlL2Zsb2F0Zm9ybWF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZGFjYTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mbG9hdGZvcm1hdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIElFRUUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBkZWNsYXJhdGlvbnMsIGZvciBHREIsIHRoZSBHTlUgRGVidWdnZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkIChGTE9BVEZPUk1BVF9IKQotI2RlZmluZSBGTE9BVEZPUk1BVF9IIDEKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIEEgZmxvYXRmb3JtYXQgY29uc2lzdHMgb2YgYSBzaWduIGJpdCwgYW4gZXhwb25lbnQgYW5kIGEgbWFudGlzc2EuICBPbmNlIHRoZQotICAgYnl0ZXMgYXJlIGNvbmNhdGVuYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGJ5dGVvcmRlciBmbGFnLCB0aGVuIGVhY2ggb2YgdGhvc2UKLSAgIGZpZWxkcyBpcyBjb250aWd1b3VzLiAgV2UgbnVtYmVyIHRoZSBiaXRzIHdpdGggMCBiZWluZyB0aGUgbW9zdCBzaWduaWZpY2FudAotICAgKGkuZS4gQklUU19CSUdfRU5ESUFOIHR5cGUgbnVtYmVyaW5nKSwgYW5kIHNwZWNpZnkgd2hpY2ggYml0cyBlYWNoIGZpZWxkCi0gICBjb250YWlucyB3aXRoIHRoZSAqX3N0YXJ0IGFuZCAqX2xlbiBmaWVsZHMuICAqLwotCi0vKiBXaGF0IGlzIHRoZSBvcmRlciBvZiB0aGUgYnl0ZXMuICovCi0KLWVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyB7Ci0KLSAgLyogU3RhbmRhcmQgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyLgotICAgICBFWDogMS4yMzQ1Njc4ZTEwID0+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+Y2h1bmspLCAwKSkpCi0jIGVuZGlmCi0KLSNlbmRpZiAvKiBub3QgX19HTlVDX18gb3Igbm90IF9fU1REQ19fICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQkvKiBDKysgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogb2JzdGFjay5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9DaGFuZ2VMb2cgYi9pbmNsdWRlL29wY29kZS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDM4ZGMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMjEwNyArMCwwIEBACi1XZWQgRGVjICAxIDAzOjA1OjI1IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oOiBBZGQgbmV3IG9wZXJhbmQgdHlwZXMuICBBZGQgbmV3IGluc3RydWN0aW9uIGZvcm1hdHMuCi0KLVdlZCBOb3YgMjQgMjA6Mjg6NTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBDb3JyZWN0bHkgaGFuZGxlIGltbWVkaWF0ZSBmb3IgUEEyLjAgImJiIgotCWluc3RydWN0aW9uLgotCi0xOTk5LTExLTE4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChJTlNOX0lTQTUpOiBOZXcuCi0KLTE5OTktMTEtMDEgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKE9QQ09ERV9JU19NRU1CRVIpOiBOZXcuCi0KLTE5OTktMTAtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoU0hPUlRfQVIpOiBEZWZpbmUuCi0KLTE5OTktMTAtMTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBhbHBoYS5oIChhbHBoYV9udW1fb3Bjb2Rlcyk6IENvbnZlcnQgdG8gdW5zaWduZWQuCi0JKGFscGhhX251bV9vcGVyYW5kcyk6IERpdHRvLgotCi1TdW4gT2N0IDEwIDAxOjQ2OjU2IDE5OTkgIEplcnJ5IFF1aW5uIDxqZXJyeS5xdWlubi5hZHY5MUBhbHVtLmRhcnRtb3V0aC5vcmc+Ci0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6ICBBZGQgbG9hZCBhbmQgc3RvcmUgY2FjaGUgY29udHJvbCB0bwotCWluc3RydWN0aW9ucy4gIEFkZCBvcmRlcmVkIGFjY2VzcyBsb2FkIGFuZCBzdG9yZS4KLQotCSogaHBwYS5oIChwYV9vcGNvZGUpOiBBZGQgbmV3IGVudHJpZXMgZm9yIGFkZGIgYW5kIGFkZGliLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBGaXggY21wYiBhbmQgY21waWIgZW50cmllcy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogIEFkZCBlbnRyaWVzIGZvciBjbXBiIGFuZCBjbXBpYi4KLQotVGh1IE9jdCAgNyAwMDoxMjoyNSBNRFQgMTk5OQlEaWVnbyBOb3ZpbGxvIDxkbm92aWxsb0BjeWdudXMuY29tPgotCi0JKiBkMTB2Lmg6IEFkZCBmbGFnIFJFU1RSSUNURURfTlVNMyBmb3IgaW1tMyBvcGVyYW5kcy4KLQotVGh1IFNlcCAyMyAwNzowODozOCAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkICJjYWxsIiBhbmQgInJldCIuICBDbGVhbiB1cCAiYiIsICJidmUiCi0JYW5kICJiZSIgdXNpbmcgY29tcGxldGVyIHByZWZpeGVzLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgaW5pdGlhbGl6ZXJzIHRvIHNpbGVuY2UgY29tcGlsZXIuCi0KLQkqIGhwcGEuaDogVXBkYXRlIGNvbW1lbnRzIGFib3V0IGNoYXJhY3RlciB1c2FnZS4KLQotTW9uIFNlcCAyMCAwMzo1NTozMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEZpeCBtaW5vciB0aGlua29zIGludHJvZHVjZWQgd2hpbGUgY2xlYW5pbmcKLQl1cCB0aGUgbmV3IGZzdHcgJiBidmUgaW5zdHJ1Y3Rpb25zLgotCi1TdW4gU2VwIDE5IDEwOjQwOjU5IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIHJlbWFpbmluZyBQQTIuMCBpbnRlZ2VyIGxvYWQvc3RvcmUKLQlpbnN0cnVjdGlvbnMuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCByZW1haW5pbmcgUEEyLjAgRlAgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBsb25nIG9mZnNldCBkb3VibGUgd29yZCBsb2FkL3N0b3JlCi0JaW5zdHJ1Y3Rpb25zLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgRkxBR19TVFJJQ1QgdmFyaWFudHMgb2YgRlAgbG9hZHMgYW5kCi0Jc3RvcmVzLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBIYW5kbGUgUEEyLjAgZmNudiwgZmNtcCBhbmQgZnRlc3QgaW5zbnMuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEZpbmlzaCBzdXBwb3J0IGZvciBQQTIuMCAiYiIgaW5zdHJ1Y3Rpb25zLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBIYW5kbGUgUEEyLjAgImJ2ZSIgaW5zdHJ1Y3Rpb25zLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgbmV3IHN5bnRheCAiYmUiIGluc3RydWN0aW9ucy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogTm90ZSB1c2Ugb2YgJ00nIGFuZCAnTCcuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBzdXBwb3J0IGZvciAiYixsIi4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIHN1cHBvcnQgZm9yICJiLGdhdGUiLgotCi1TYXQgU2VwIDE4IDExOjQxOjE2IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogVXNlICdmWCcgZm9yIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQKLQlpbiB4bXB5dS4gIAotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBGaXggbWFzayBmb3IgcHJvYmUgYW5kIHByb2JlaS4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogRml4IG1hc2sgZm9yIGRlcHdpLgotCi1UdWUgU2VwICA3IDEzOjQ0OjI1IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkICJhZGRpbCIgdmFyaWFudCB3aGljaCBoYXMgdGhlICVyMSBhcwotCWFuIGV4cGxpY2l0IG91dHB1dCBhcmd1bWVudC4KLQotTW9uIFNlcCAgNiAwNDo0MTo0MiAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogQWRkIHN0cmljdCB2YXJpYW50cyBvZiBQQTEuMC9QQTEuMSBsb2FkcyBhbmQgc3RvcmVzLgotCUFkZCBhIGZldyBQQTIuMCBsb2FkcyBhbmQgc3RvcmUgdmFyaWFudHMuCi0KLTE5OTktMDktMDQgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogcGouaDogTmV3IGZpbGUuCi0KLTE5OTktMDgtMjkgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChpMzg2X3JlZ3RhYik6IE1vdmUgJXN0IHRvIHRvcCBvZiB0YWJsZSwgYW5kIHNwbGl0IG9mZgotCW90aGVyIGZwIHJlZyBlbnRyaWVzLgotCShpMzg2X2Zsb2F0X3JlZ3RhYik6IFRvIGhlcmUuCi0KLVNhdCBBdWcgMjggMDA6MjU6MjUgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IFJlcGxhY2UgJ2YnIGJ5ICd2Jy4gIFByZWZpeCBmbG9hdCByZWdpc3RlciBhcmdzCi0JYnkgJ2YnLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgZXh0cmQsIGV4dHJ3LCBkZXBkLCBkZXBkaSwgZGVwdywgZGVwd2kuCi0JQWRkIHN1cHBvcnRpbmcgYXJncy4KLQotCSogaHBwYS5oOiAgRG9jdW1lbnQgbmV3IGNvbXBsZXRlcnMgYW5kIGFyZ3MuCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiAgQWRkIDY0IGJpdCBwYXR0ZXJucyBhbmQgcGEyLjAgc3ludGF4IGZvciB1eG9yLAotCXVhZGRjbSwgZGNvciwgYWRkaSwgYWRkLCBzdWIsIHN1YmksIHNobGFkZCwgcmZpLCBhbmQgcHJvYmUuICBBZGQgcGEyLjAKLQlleHRlbnNpb25zIGZvciBzc20sIHJzbSwgcGR0bGIsIHBpdGxiLiAgQWRkIHBlcmZvcm1hbmNlIGluc3RydWN0aW9ucwotCXBtZW5iIGFuZCBwbWRpcy4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogIEFkZCBwYTIuMCBpbnN0cnVjdGlvbnMgaGFkZCwgaHNobCwKLQloc2hyLCBoc3ViLCBtaXhoLCBtaXh3LCBwZXJtaC4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQ2hhbmdlIGNvbXBsZXRlcnMgaW4gaW5zdHJ1Y3Rpb25zIHRvCi0JdXNlICdjJyBwcmVmaXguCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6ICBBZGQgcG9wYnRzLCBuZXcgZm9ybXMgb2YgYmIsIGhhdmcsCi0JaHNobGFkZCwgaHNocmFkZCwgc2hycGQsIGFuZCBzaHJwdyBpbnN0cnVjdGlvbnMuICBVcGRhdGUgYXJnIGNvbW1lbnRzLgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiAgQ2hhbmdlIGZtcHlmYWRkLCBmbXB5bmZhZGQsIGZuZWcsCi0JZm5lZ2FicyB0byB1c2UgJ0knIGluc3RlYWQgb2YgJ0YnLgotCi0xOTk5LTA4LTIxICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaDogQWRkIEFNRCBhdGhsb24gaW5zdHJ1Y3Rpb25zLCBwZm5hY2MsIHBmcG5hY2MsIHBzd2FwZC4KLQlEb2N1bWVudCBwZjJpdyBhbmQgcGkyZncgYXMgYXRobG9uIGluc25zLiAgUmVtb3ZlIHBzd2Fwdy4KLQlBbHBoYWJldGljYWxseSBzb3J0IFBJSUkgaW5zbnMuCi0KLVdlZCBBdWcgMTggMTg6MTQ6NDAgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0lOU05fTUFDSF9IQVNfUCk6IE5ldyBtYWNyby4KLQotRnJpIEF1ZyAgNiAwOTo0NjozNSAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIDY0IGJpdCB2ZXJzaW9ucyBvZiBvciwgeG9yLCBhbmQsCi0JYW5kIGFuZGNtLiAgQWRkIDMyIGFuZCA2NCBiaXQgdmVyc2lvbiBvZiBjbXBjbHIsIGNtcGljbHIuCi0KLQkqIGhwcGEuaDogIERvY3VtZW50IDY0IGJpdCBjb25kaXRpb24gY29tcGxldGVycy4KLQotVGh1IEF1ZyAgNSAxNjo1NjowNyAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQ2hhbmdlIGNvbmRpdGlvbiBhcmdzIHRvIHVzZSAnPycgcHJlZml4LgotCi0xOTk5LTA4LTA0ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IEFkZCBEZWZhdWx0U2l6ZSBtb2RpZmllciB0byBhbGwgaW5zbnMKLQl0aGF0IGltcGxpY2l0bHkgbW9kaWZ5ICVlc3AuICAjdW5kZWYgZF9TdWYsIHhfc3VmLCBzbGRfc3VmLAotCXNsZHhfc3VmLCBid2xkX1N1ZiwgZF9GUCwgeF9GUCwgc2xkX0ZQLCBzbGR4X0ZQIGF0IGVuZCBvZiB0YWJsZS4KLQotV2VkIEp1bCAyOCAwMjowNDoyNCAxOTk5ICBKZXJyeSBRdWlubiA8anF1aW5uQG5vcnRlbG5ldHdvcmtzLmNvbT4KLQkJCSAgSmVmZiBMYXcgPGxhd0BjeWdudXMuY29tPgotCi0JKiBocHBhLmggKHBhX29wY29kZXMpOiBBZGQgInB1c2hub20iIGFuZCAicHVzaGJ0cyIuCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IE1hcmsgYWxsIFBBMi4wIG9wY29kZXMgd2l0aCBGTEFHX1NUUklDVC4KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogIENoYW5nZSB4bXB5dSwgZm1weWZhZGQsIAotCWFuZCBmbXB5bmZhZGQgdG8gdXNlICdKJyBhbmQgJ0snIGluc3RlYWQgb2YgJ0UnIGFuZCAnWCcuCi0KLTE5OTktMDctMTMgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiBBZGQgInVuZG9jdW1lbnRlZCIgQU1EIDNETm93ISBwZjJpdywgcGkyZncsIHBzd2FwdyBpbnNucy4KLQotVGh1IEp1bCAgMSAwMDoxNzoyNCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoc3RydWN0IHBhX29wY29kZSk6IEFkZCBuZXcgZmllbGQgImZsYWdzIi4KLQkoRkxBR1NfU1RSSUNUKTogRGVmaW5lLgotCi1GcmkgSnVuIDI1IDA0OjIyOjA0IDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCQkJICBKZWZmIExhdyA8bGF3QGN5Z251cy5jb20+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+LgotCi1UaHUgSmFuIDMwIDA3OjMxOjQ0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiB0dXJuZWQgb3BfdHlwZSBlbnVtIGludG8gI2RlZmluZSBsaXN0Ci0KLVRodSBKYW4gMzAgMDE6MDc6MjQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6ICBSZW1vdmUgImN5cHJlc3MiIGFyY2hpdGVjdHVyZS4gIFJlbW92ZSAiZml0b3giIGFuZAotCXNpbWlsYXIgaW5zdHJ1Y3Rpb25zIC0tIHRoZXkndmUgYmVlbiByZW5hbWVkIHRvICJmaXRvcSIsIGV0Yy4KLQlSRUFMTFkgZml4IHRzdWJjY3R2LiAgRml4ICJmY21wZXEiIGFuZCAiZmNtcHEiIHdoaWNoIGhhZCB3cm9uZwotCW51bWJlciBvZiBhcmd1bWVudHMuCi0JKiBoODMwMC5oOiAgUmVtb3ZlIGV4dHJhIDsgd2hpY2ggcHJvZHVjZXMgY29tcGlsZXIgd2FybmluZy4KLQotVHVlIEphbiAyOCAyMjo1OToyMiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiAgZml4IG9wY29kZSBmb3IgdHN1YmNjdHYuCi0KLVR1ZSBKYW4gIDcgMTc6MTk6MzkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IGZiYSBhbmQgY2JhIGFyZSBub3cgYWxpYXNlcyBmb3IgZmIgYW5kIGNiIHJlc3BlY3RpdmVseS4KLQotRnJpIERlYyAyNyAxMDo1NTo1MCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAobm9wKTogIE1hZGUgdGhlICdsb3NlJyBmaWVsZCBiZSBldmVuIHRpZ2h0ZXIsCi0Jc28gb25seSBhIHN0YW5kYXJkICdub3AnIGlzIGRpc2Fzc2VtYmxlZCBhcyBhIG5vcC4KLQotU3VuIERlYyAyMiAxMjoxODoxOCAxOTkxICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uIGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKG5vcCk6IEFkZCBSRF9HTyB0byBgbG9zZScgc28gdGhhdCBvbmx5ICVnMCBpbiBkZXN0IGlzCi0JZGlzYXNzZW1ibGVkIGFzIGEgbm9wLgotCi1UdWUgRGVjIDEwIDAwOjIyOjIwIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogZml4IGEgdHlwby4KLQotU2F0IE5vdiAzMCAyMDo0MDo1MSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYTI5ay5oLCBhcm0uaCwgaDgzMDAuaCwgIGkzODYuaCwgIGk4NjAuaCwgaTk2MC5oICwgbTY4ay5oLAotCW04OGsuaCwgbWlwcy5oICwgbnAxLmgsIG5zMzJrLmgsIHBuLmgsIHB5ci5oLCBzcGFyYy5oLCB0YWhvZS5oLAotCXZheC5oLCBDaGFuZ2VMb2c6IHJlbmFtZWQgZnJvbSAuLi88Zm9vPi1vcGNvZGUuaAotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9hMjlrLmggYi9pbmNsdWRlL29wY29kZS9hMjlrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMmUxMjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvYTI5ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBBTUQgMjkwMDAgZmFtaWx5LgotICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgR0FTLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1zdHJ1Y3QgYTI5a19vcGNvZGUgewotICAvKiBOYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgLyogT3Bjb2RlIHdvcmQgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgLyogQSBzdHJpbmcgb2YgY2hhcmFjdGVycyB3aGljaCBkZXNjcmliZSB0aGUgb3BlcmFuZHMuCi0gICAgIFZhbGlkIGNoYXJhY3RlcnMgYXJlOgotICAgICAsICAgICAgICBJdHNlbGYuICBUaGUgY2hhcmFjdGVyIGFwcGVhcnMgaW4gdGhlIGFzc2VtYmx5IGNvZGUuCi0gICAgIGEgICAgICAgIFJBLiAgVGhlIHJlZ2lzdGVyIG51bWJlciBpcyBpbiBiaXRzIDgtMTUgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBiICAgICAgICBSQi4gIFRoZSByZWdpc3RlciBudW1iZXIgaXMgaW4gYml0cyAwLTcgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBjICAgICAgICBSQy4gIFRoZSByZWdpc3RlciBudW1iZXIgaXMgaW4gYml0cyAxNi0yMyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIGkgICAgICAgIEFuIGltbWVkaWF0ZSBvcGVyYW5kIGlzIGluIGJpdHMgMC03IG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgeCAgICAgICAgQml0cyAwLTcgYW5kIDE2LTIzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgYml0cyAwLTcgYW5kIDgtMTUKLSAgICAgICAgICAgICAgKHJlc3BlY3RpdmVseSkgb2YgdGhlIGltbWVkaWF0ZSBvcGVyYW5kLgotICAgICBoICAgICAgICBTYW1lIGFzIHggYnV0IHRoZSBpbnN0cnVjdGlvbiBjb250YWlucyBiaXRzIDE2LTMxIG9mIHRoZQotICAgICAgICAgICAgICBpbW1lZGlhdGUgb3BlcmFuZC4KLSAgICAgWCAgICAgICAgU2FtZSBhcyB4IGJ1dCBiaXRzIDE2LTMxIG9mIHRoZSBzaWduZWQgaW1tZWRpYXRlIG9wZXJhbmQKLSAgICAgICAgICAgICAgYXJlIHNldCB0byAxICh0aHVzIHRoZSBvcGVyYW5kIGlzIGFsd2F5cyBuZWdhdGl2ZSkuCi0gICAgIFAsQSAgICAgIEJpdHMgMC03IGFuZCAxNi0yMyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIGJpdHMgMi05IGFuZCAxMC0xNwotICAgICAgICAgICAgICAocmVzcGVjdGl2ZWx5KSBvZiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQuCi0JICAgICAgUD1QQy1yZWxhdGl2ZSwgc2lnbi1leHRlbmRlZCB0byAzMiBiaXRzLgotCSAgICAgIEE9QWJzb2x1dGUsIHplcm8tZXh0ZW5kZWQgdG8gMzIgYml0cy4KLSAgICAgZSAgICAgICAgQ0UgYml0IChiaXQgMjMpIGZvciBhIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24uCi0gICAgIG4gICAgICAgIENvbnRyb2wgZmllbGQgKGJpdHMgMTYtMjIpIGZvciBhIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24uCi0gICAgIHYgICAgICAgIEltbWVkaWF0ZSBvcGVyYW5kIGluIGJpdHMgMTYtMjMgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICAgICAgICAgICAodXNlZCBmb3IgdHJhcCBudW1iZXJzKS4KLSAgICAgcyAgICAgICAgU0EuICBTcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbnVtYmVyIGluIGJpdHMgOC0xNQotICAgICAgICAgICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIHUgICAgICAgIFVJLS1iaXQgNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIHIgICAgICAgIFJORC0tYml0cyA0LTYgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBkICAgICAgICBGRC0tYml0cyAyLTMgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBmICAgICAgICBGUy0tYml0cyAwLTEgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBJCSAgICAgIElELS1iaXRzIDE2LTE3IG9mIHRoZSBpbnN0cnVjdGlvbi4KLQotICAgICBFeHRlbnNpb25zIGZvciAyOTA1MDoKLQotICAgICBkCSAgICAgIEZNVC0tYml0cyAyLTMgb2YgdGhlIGluc3RydWN0aW9uIChub3QgcmVhbGx5IG5ldykuCi0gICAgIGYJICAgICAgQUNOLS1iaXRzIDAtMSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCByZWFsbHkgbmV3KS4KLSAgICAgRgkgICAgICBGVU5DLS1TcGVjaWFsIGZ1bmN0aW9uIGluIGJpdHMgMTgtMjEgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBDCSAgICAgIEFDTi0tYml0cyAxNi0xNyBzcGVjaWZ5aW5nIHRoZSBhY2N1bWxhdG9yIHJlZ2lzdGVyLiAgKi8KLSAgY2hhciAqYXJnczsKLX07Ci0KLSNpZm5kZWYgQ09OU1QKLSNkZWZpbmUgQ09OU1QKLSNlbmRpZiAvKiBDT05TVCAqLwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGEyOWtfb3Bjb2RlIGEyOWtfb3Bjb2Rlc1tdID0KLXsKLQoteyAiYWRkIiwgMHgxNDAwMDAwMCwgImMsYSxiIiB9LAoteyAiYWRkIiwgMHgxNTAwMDAwMCwgImMsYSxpIiB9LAoteyAiYWRkYyIsIDB4MWMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZGMiLCAweDFkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhZGRjcyIsIDB4MTgwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZGNzIiwgMHgxOTAwMDAwMCwgImMsYSxpIiB9LAoteyAiYWRkY3UiLCAweDFhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGRjdSIsIDB4MWIwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFkZHMiLCAweDEwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGRzIiwgMHgxMTAwMDAwMCwgImMsYSxpIiB9LAoteyAiYWRkdSIsIDB4MTIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZHUiLCAweDEzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhbmQiLCAweDkwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhbmQiLCAweDkxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhbmRuIiwgMHg5YzAwMDAwMCwgImMsYSxiIiB9LAoteyAiYW5kbiIsIDB4OWQwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFzZXEiLCAweDcwMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2VxIiwgMHg3MTAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNnZSIsIDB4NWMwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZ2UiLCAweDVkMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2dldSIsIDB4NWUwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZ2V1IiwgMHg1ZjAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNndCIsIDB4NTgwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZ3QiLCAweDU5MDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2d0dSIsIDB4NWEwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZ3R1IiwgMHg1YjAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNsZSIsIDB4NTQwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbGUiLCAweDU1MDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2xldSIsIDB4NTYwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbGV1IiwgMHg1NzAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNsdCIsIDB4NTAwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbHQiLCAweDUxMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2x0dSIsIDB4NTIwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbHR1IiwgMHg1MzAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNuZXEiLCAweDcyMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc25lcSIsIDB4NzMwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImNhbGwiLCAweGE4MDAwMDAwLCAiYSxQIiB9LAoteyAiY2FsbCIsIDB4YTkwMDAwMDAsICJhLEEiIH0sCi17ICJjYWxsaSIsIDB4YzgwMDAwMDAsICJhLGIiIH0sCi17ICJjbGFzcyIsIDB4ZTYwMDAwMDAsICJjLGEsZiIgfSwKLXsgImNseiIsIDB4MDgwMDAwMDAsICJjLGIiIH0sCi17ICJjbHoiLCAweDA5MDAwMDAwLCAiYyxpIiB9LAoteyAiY29uc3QiLCAweDAzMDAwMDAwLCAiYSx4IiB9LAoteyAiY29uc3RoIiwgMHgwMjAwMDAwMCwgImEsaCIgfSwKLXsgImNvbnN0aHoiLCAweDA1MDAwMDAwLCAiYSxoIiB9LAoteyAiY29uc3RuIiwgMHgwMTAwMDAwMCwgImEsWCIgfSwKLXsgImNvbnZlcnQiLCAweGU0MDAwMDAwLCAiYyxhLHUscixkLGYiIH0sCi17ICJjcGJ5dGUiLCAweDJlMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGJ5dGUiLCAweDJmMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGVxIiwgMHg2MDAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BlcSIsIDB4NjEwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwZ2UiLCAweDRjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGdlIiwgMHg0ZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BnZXUiLCAweDRlMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGdldSIsIDB4NGYwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwZ3QiLCAweDQ4MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGd0IiwgMHg0OTAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BndHUiLCAweDRhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGd0dSIsIDB4NGIwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwbGUiLCAweDQ0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGxlIiwgMHg0NTAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BsZXUiLCAweDQ2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGxldSIsIDB4NDcwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwbHQiLCAweDQwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGx0IiwgMHg0MTAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BsdHUiLCAweDQyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGx0dSIsIDB4NDMwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwbmVxIiwgMHg2MjAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BuZXEiLCAweDYzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJkYWRkIiwgMHhmMTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGRpdiIsIDB4ZjcwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRlcSIsIDB4ZWIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRnZSIsIDB4ZWYwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRndCIsIDB4ZWQwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdiIsIDB4NmEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdiIsIDB4NmIwMDAwMDAsICJjLGEsaSIgfSwKLXsgImRpdjAiLCAweDY4MDAwMDAwLCAiYyxiIiB9LAoteyAiZGl2MCIsIDB4NjkwMDAwMDAsICJjLGkiIH0sCi17ICJkaXZpZGUiLCAweGUxMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXZpZHUiLCAweGUzMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXZsIiwgMHg2YzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGl2bCIsIDB4NmQwMDAwMDAsICJjLGEsaSIgfSwKLXsgImRpdnJlbSIsIDB4NmUwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdnJlbSIsIDB4NmYwMDAwMDAsICJjLGEsaSIgfSwKLXsgImRtYWMiLCAweGQ5MDAwMDAwLCAiRixDLGEsYiIgfSwKLXsgImRtc20iLCAweGRiMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkbXVsIiwgMHhmNTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZHN1YiIsIDB4ZjMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImVtdWxhdGUiLCAweGQ3MDAwMDAwLCAidixhLGIiIH0sCi17ICJleGJ5dGUiLCAweDBhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJleGJ5dGUiLCAweDBiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJleGh3IiwgMHg3YzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZXhodyIsIDB4N2QwMDAwMDAsICJjLGEsaSIgfSwKLXsgImV4aHdzIiwgMHg3ZTAwMDAwMCwgImMsYSIgfSwKLXsgImV4dHJhY3QiLCAweDdhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJleHRyYWN0IiwgMHg3YjAwMDAwMCwgImMsYSxpIiB9LAoteyAiZmFkZCIsIDB4ZjAwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZkaXYiLCAweGY2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmZG11bCIsIDB4ZjkwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZlcSIsIDB4ZWEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZnZSIsIDB4ZWUwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZndCIsIDB4ZWMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZtYWMiLCAweGQ4MDAwMDAwLCAiRixDLGEsYiIgfSwKLXsgImZtc20iLCAweGRhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmbXVsIiwgMHhmNDAwMDAwMCwgImMsYSxiIiB9LAoteyAiZnN1YiIsIDB4ZjIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImhhbHQiLCAweDg5MDAwMDAwLCAiIiB9LAoteyAiaW5ieXRlIiwgMHgwYzAwMDAwMCwgImMsYSxiIiB9LAoteyAiaW5ieXRlIiwgMHgwZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiaW5odyIsIDB4NzgwMDAwMDAsICJjLGEsYiIgfSwKLXsgImluaHciLCAweDc5MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJpbnYiLCAweDlmMDAwMDAwLCAiSSIgfSwKLXsgImlyZXQiLCAweDg4MDAwMDAwLCAiIiB9LAoteyAiaXJldGludiIsIDB4OGMwMDAwMDAsICJJIiB9LAoteyAiam1wIiwgMHhhMDAwMDAwMCwgIlAiIH0sCi17ICJqbXAiLCAweGExMDAwMDAwLCAiQSIgfSwKLXsgImptcGYiLCAweGE0MDAwMDAwLCAiYSxQIiB9LAoteyAiam1wZiIsIDB4YTUwMDAwMDAsICJhLEEiIH0sCi17ICJqbXBmZGVjIiwgMHhiNDAwMDAwMCwgImEsUCIgfSwKLXsgImptcGZkZWMiLCAweGI1MDAwMDAwLCAiYSxBIiB9LAoteyAiam1wZmkiLCAweGM0MDAwMDAwLCAiYSxiIiB9LAoteyAiam1waSIsIDB4YzAwMDAwMDAsICJiIiB9LAoteyAiam1wdCIsIDB4YWMwMDAwMDAsICJhLFAiIH0sCi17ICJqbXB0IiwgMHhhZDAwMDAwMCwgImEsQSIgfSwKLXsgImptcHRpIiwgMHhjYzAwMDAwMCwgImEsYiIgfSwKLXsgImxvYWQiLCAweDE2MDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgImxvYWQiLCAweDE3MDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgImxvYWRsIiwgMHgwNjAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJsb2FkbCIsIDB4MDcwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAibG9hZG0iLCAweDM2MDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgImxvYWRtIiwgMHgzNzAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJsb2Fkc2V0IiwgMHgyNjAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJsb2Fkc2V0IiwgMHgyNzAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJtZmFjYyIsIDB4ZTkwMDAxMDAsICJjLGQsZiIgfSwKLXsgIm1mc3IiLCAweGM2MDAwMDAwLCAiYyxzIiB9LAoteyAibWZ0bGIiLCAweGI2MDAwMDAwLCAiYyxhIiB9LAoteyAibXRhY2MiLCAweGU4MDEwMDAwLCAiYSxkLGYiIH0sCi17ICJtdHNyIiwgMHhjZTAwMDAwMCwgInMsYiIgfSwKLXsgIm10c3JpbSIsIDB4MDQwMDAwMDAsICJzLHgiIH0sCi17ICJtdHRsYiIsIDB4YmUwMDAwMDAsICJhLGIiIH0sCi17ICJtdWwiLCAweDY0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWwiLCAweDY1MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJtdWxsIiwgMHg2NjAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsbCIsIDB4NjcwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm11bHRpcGx1IiwgMHhlMjAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsdGlwbHkiLCAweGUwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWx0bSIsIDB4ZGUwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bHRtdSIsIDB4ZGYwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bHUiLCAweDc0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWx1IiwgMHg3NTAwMDAwMCwgImMsYSxpIiB9LAoteyAibmFuZCIsIDB4OWEwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm5hbmQiLCAweDliMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJub3AiLCAweDcwNDAwMTAxLCAiIiB9LAoteyAibm9yIiwgMHg5ODAwMDAwMCwgImMsYSxiIiB9LAoteyAibm9yIiwgMHg5OTAwMDAwMCwgImMsYSxpIiB9LAoteyAib3IiLCAweDkyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJvciIsIDB4OTMwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm9ybiIsIDB4YWEwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm9ybiIsIDB4YWIwMDAwMDAsICJjLGEsaSIgfSwKLQotLyogVGhlIGRlc2NyaXB0aW9uIG9mICJzZXRpcCIgaW4gQ2hhcHRlciA4ICgiaW5zdHJ1Y3Rpb24gc2V0Iikgb2YgdGhlIHVzZXIncwotICAgbWFudWFsIGNsYWltcyB0aGF0IHRoZXNlIGFyZSBhYnNvbHV0ZSByZWdpc3RlciBudW1iZXJzLiAgQnV0IHNlY3Rpb24KLSAgIDcuMi4xIGV4cGxhaW5zIHRoYXQgdGhleSBhcmUgbm90LiAgVGhlIGxhdHRlciBpcyBjb3JyZWN0LCBzbyBwcmludAotICAgdGhlc2Ugbm9ybWFsbHkgKCJscjAiLCAibHI1IiwgZXRjLikuICAqLwoteyAic2V0aXAiLCAweDllMDAwMDAwLCAiYyxhLGIiIH0sCi0KLXsgInNsbCIsIDB4ODAwMDAwMDAsICJjLGEsYiIgfSwKLXsgInNsbCIsIDB4ODEwMDAwMDAsICJjLGEsaSIgfSwKLXsgInNxcnQiLCAweGU1MDAwMDAwLCAiYyxhLGYiIH0sCi17ICJzcmEiLCAweDg2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzcmEiLCAweDg3MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzcmwiLCAweDgyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzcmwiLCAweDgzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdG9yZSIsIDB4MWUwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAic3RvcmUiLCAweDFmMDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgInN0b3JlbCIsIDB4MGUwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAic3RvcmVsIiwgMHgwZjAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJzdG9yZW0iLCAweDNlMDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgInN0b3JlbSIsIDB4M2YwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAic3ViIiwgMHgyNDAwMDAwMCwgImMsYSxiIiB9LAoteyAic3ViIiwgMHgyNTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3ViYyIsIDB4MmMwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YmMiLCAweDJkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJjcyIsIDB4MjgwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YmNzIiwgMHgyOTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3ViY3UiLCAweDJhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJjdSIsIDB4MmIwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnIiLCAweDM0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJyIiwgMHgzNTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicmMiLCAweDNjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJyYyIsIDB4M2QwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnJjcyIsIDB4MzgwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnJjcyIsIDB4MzkwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnJjdSIsIDB4M2EwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnJjdSIsIDB4M2IwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnJzIiwgMHgzMDAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VicnMiLCAweDMxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJydSIsIDB4MzIwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnJ1IiwgMHgzMzAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicyIsIDB4MjAwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnMiLCAweDIxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJ1IiwgMHgyMjAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VidSIsIDB4MjMwMDAwMDAsICJjLGEsaSIgfSwKLXsgInhub3IiLCAweDk2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJ4bm9yIiwgMHg5NzAwMDAwMCwgImMsYSxpIiB9LAoteyAieG9yIiwgMHg5NDAwMDAwMCwgImMsYSxiIiB9LAoteyAieG9yIiwgMHg5NTAwMDAwMCwgImMsYSxpIiB9LAotCi17ICIiLCAweDAsICIiIH0JCS8qIER1bW15IGVudHJ5LCBub3QgaW5jbHVkZWQgaW4gTlVNX09QQ09ERVMuICBUaGlzCi0JCQkgICBsZXRzIGNvZGUgZXhhbWluZSBlbnRyeSBpKzEgd2l0aG91dCBjaGVja2luZwotCQkJICAgaWYgd2UndmUgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZSB0YWJsZS4gICovCi19OwotCi1DT05TVCB1bnNpZ25lZCBpbnQgbnVtX29wY29kZXMgPSAoKChzaXplb2YgYTI5a19vcGNvZGVzKSAvIChzaXplb2YgYTI5a19vcGNvZGVzWzBdKSkgLSAxKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2FscGhhLmggYi9pbmNsdWRlL29wY29kZS9hbHBoYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjMxZTlhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2FscGhhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyogYWxwaGEuaCAtLSBIZWFkZXIgZmlsZSBmb3IgQWxwaGEgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LAotICAgcGF0dGVybmVkIGFmdGVyIHRoZSBQUEMgb3Bjb2RlIHRhYmxlIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvci4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBPUENPREVfQUxQSEFfSAotI2RlZmluZSBPUENPREVfQUxQSEFfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBhbHBoYV9vcGNvZGUuICAqLwotCi1zdHJ1Y3QgYWxwaGFfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLSAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCi0gIHVuc2lnbmVkIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBtYXNrOwotCi0gIC8qIE9uZSBiaXQgZmxhZ3MgZm9yIHRoZSBvcGNvZGUuICBUaGVzZSBhcmUgcHJpbWFyaWx5IHVzZWQgdG8KLSAgICAgaW5kaWNhdGUgc3BlY2lmaWMgcHJvY2Vzc29ycyBhbmQgZW52aXJvbm1lbnRzIHN1cHBvcnQgdGhlCi0gICAgIGluc3RydWN0aW9ucy4gIFRoZSBkZWZpbmVkIHZhbHVlcyBhcmUgbGlzdGVkIGJlbG93LiAqLwotICB1bnNpZ25lZCBmbGFnczsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCi0gICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKLSAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzRdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQotICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCi0gICBpbnN0cnVjdGlvbnMuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgYWxwaGFfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGFscGhhX251bV9vcGNvZGVzOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IGFscGhhX29wY29kZS4gICovCi0KLS8qIENQVSBBdmFpbGFiaWxpdHkgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9CQVNFICAweDAwMDEgIC8qIEJhc2UgYXJjaGl0ZWN0dXJlIC0tIGFsbCBjcHVzLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9FVjQgICAweDAwMDIgIC8qIEVWNCBzcGVjaWZpYyBQQUxjb2RlIGluc25zLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9FVjUgICAweDAwMDQgIC8qIEVWNSBzcGVjaWZpYyBQQUxjb2RlIGluc25zLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9FVjYgICAweDAwMDggIC8qIEVWNiBzcGVjaWZpYyBQQUxjb2RlIGluc25zLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9CV1ggICAweDAxMDAgIC8qIEJ5dGUvd29yZCBleHRlbnNpb24gKGFtYXNrIGJpdCAwKS4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfQ0lYICAgMHgwMjAwICAvKiAiQ291bnQiIGV4dGVuc2lvbiAoYW1hc2sgYml0IDEpLiAgKi8KLSNkZWZpbmUgQVhQX09QQ09ERV9NQVggICAweDA0MDAgIC8qIE11bHRpbWVkaWEgZXh0ZW5zaW9uIChhbWFzayBiaXQgOCkuICAqLwotCi0jZGVmaW5lIEFYUF9PUENPREVfTk9QQUwgKH4oQVhQX09QQ09ERV9FVjR8QVhQX09QQ09ERV9FVjV8QVhQX09QQ09ERV9FVjYpKQotCi0vKiBBIG1hY3JvIHRvIGV4dHJhY3QgdGhlIG1ham9yIG9wY29kZSBmcm9tIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQVhQX09QKGkpCSgoKGkpID4+IDI2KSAmIDB4M0YpCi0KLS8qIFRoZSB0b3RhbCBudW1iZXIgb2YgbWFqb3Igb3Bjb2Rlcy4gKi8KLSNkZWZpbmUgQVhQX05PUFMJMHg0MAotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGFscGhhX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgYWxwaGFfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogVGhlIGRlZmF1bHQgcmVsb2NhdGlvbiB0eXBlIGZvciB0aGlzIG9wZXJhbmQuICAqLwotICBpbnQgZGVmYXVsdF9yZWxvYzsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIHVuc2lnbmVkIGZsYWdzOwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0gIHVuc2lnbmVkICgqaW5zZXJ0KSBQQVJBTVMgKCh1bnNpZ25lZCBpbnN0cnVjdGlvbiwgaW50IG9wLAotCQkJICAgICAgY29uc3QgY2hhciAqKmVycm1zZykpOwotCi0gIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCi0gICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCi0gICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmICgoby0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9TSUdORUQpICE9IDAKLQkgICAgICYmIChvcCAmICgxIDw8IChvLT5iaXRzIC0gMSkpKSAhPSAwKQotCSAgIG9wIC09IDEgPDwgby0+Yml0czsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uLCBvIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wCi0gICAgIGlzIHRoZSByZXN1bHQ7IHRoaXMgYXNzdW1lcyB0d29zIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZC4gIElmCi0gICAgIHRoZSBJTlZBTElEIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqSU5WQUxJRCB3aWxsIGJlIHNldCB0bwotICAgICBub24temVybyBpZiB0aGlzIG9wZXJhbmQgdHlwZSBjYW4gbm90IGFjdHVhbGx5IGJlIGV4dHJhY3RlZCBmcm9tCi0gICAgIHRoaXMgb3BlcmFuZCAoaS5lLiwgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoKS4gIElmIHRoZQotICAgICBvcGVyYW5kIGlzIHZhbGlkLCAqSU5WQUxJRCB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAgKi8KLSAgaW50ICgqZXh0cmFjdCkgUEFSQU1TICgodW5zaWduZWQgaW5zdHJ1Y3Rpb24sIGludCAqaW52YWxpZCkpOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSBhbHBoYV9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kIGFscGhhX29wZXJhbmRzW107Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgYWxwaGFfbnVtX29wZXJhbmRzOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IGFscGhhX29wZXJhbmQuICAqLwotCi0vKiBNYXNrIGZvciBzZWxlY3RpbmcgdGhlIHR5cGUgZm9yIHR5cGVjaGVjayBwdXJwb3NlcyAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9UWVBFQ0hFQ0tfTUFTSwkJCQkJXAotICAoQVhQX09QRVJBTkRfUEFSRU5TIHwgQVhQX09QRVJBTkRfQ09NTUEgfCBBWFBfT1BFUkFORF9JUiB8CQlcCi0gICBBWFBfT1BFUkFORF9GUFIgfCBBWFBfT1BFUkFORF9SRUxBVElWRSB8IEFYUF9PUEVSQU5EX1NJR05FRCB8IAlcCi0gICBBWFBfT1BFUkFORF9VTlNJR05FRCkKLQotLyogVGhpcyBvcGVyYW5kIGRvZXMgbm90IGFjdHVhbGx5IGV4aXN0IGluIHRoZSBhc3NlbWJsZXIgaW5wdXQuICBUaGlzCi0gICBpcyB1c2VkIHRvIHN1cHBvcnQgZXh0ZW5kZWQgbW5lbW9uaWNzLCBmb3Igd2hpY2ggdHdvIG9wZXJhbmRzIGZpZWxkcwotICAgYXJlIGlkZW50aWNhbC4gIFRoZSBhc3NlbWJsZXIgc2hvdWxkIGNhbGwgdGhlIGluc2VydCBmdW5jdGlvbiB3aXRoCi0gICBhbnkgb3AgdmFsdWUuICBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjYWxsIHRoZSBleHRyYWN0IGZ1bmN0aW9uLAotICAgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUsIGFuZCBjaGVjayB0aGUgdmFsdWUgcGxhY2VkIGluIHRoZSBpbnZhbGlkCi0gICBhcmd1bWVudC4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0ZBS0UJMDEKLQotLyogVGhlIG9wZXJhbmQgc2hvdWxkIGJlIHdyYXBwZWQgaW4gcGFyZW50aGVzZXMgcmF0aGVyIHRoYW4gc2VwYXJhdGVkCi0gICBmcm9tIHRoZSBwcmV2aW91cyBieSBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciB0aGUgbG9hZCBhbmQgc3RvcmUKLSAgIGluc3RydWN0aW9ucyB3aGljaCB3YW50IHRoZWlyIG9wZXJhbmRzIHRvIGxvb2sgbGlrZSAiUmEsZGlzcChSYikiLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfUEFSRU5TCTAyCi0KLS8qIFVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBQQVJFTlMsIHRoaXMgc3VwcmVzc2VzIHRoZSBzdXByZXNzaW9uIG9mCi0gICB0aGUgY29tbWEuICBUaGlzIGlzIHVzZWQgZm9yICJqbXAgUmEsKFJiKSxoaW50Ii4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0NPTU1BCTA0Ci0KLS8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhbiBpbnRlZ2VyIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfSVIJCTAxMAotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0ZQUgkJMDIwCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIHJlbGF0aXZlIGJyYW5jaCBkaXNwbGFjZW1lbnQuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfUkVMQVRJVkUJMDQwCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfU0lHTkVECTAxMDAKLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHVuc2lnbmVkIHZhbHVlcy4gIFRoaXMgZXhpc3RzIHByaW1hcmlseSBzbyB0aGF0Ci0gICBhIGZsYWdzIHZhbHVlIG9mIDAgY2FuIGJlIHRyZWF0ZWQgYXMgZW5kLW9mLWFyZ3VtZW50cy4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1VOU0lHTkVECTAyMDAKLQotLyogU3VwcmVzcyBvdmVyZmxvdyBkZXRlY3Rpb24gb24gdGhpcyBmaWVsZC4gIFRoaXMgaXMgdXNlZCBmb3IgaGludHMuICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX05PT1ZFUkZMT1cJMDQwMAotCi0vKiBNYXNrIGZvciBvcHRpb25hbCBhcmd1bWVudCBkZWZhdWx0IHZhbHVlLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfT1BUSU9OQUxfTUFTSyAwNzAwMAotCi0vKiBUaGlzIG9wZXJhbmQgZGVmYXVsdHMgdG8gemVyby4gIFRoaXMgaXMgdXNlZCBmb3IganVtcCBoaW50cy4gICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX0RFRkFVTFRfWkVSTyAwMTAwMAotCi0vKiBUaGlzIG9wZXJhbmQgc2hvdWxkIGRlZmF1bHQgdG8gdGhlIGZpcnN0IChyZWFsKSBvcGVyYW5kIGFuZCBpcyB1c2VkCi0gICBpbiBjb25qdW5jdGlvbiB3aXRoIEFYUF9PUEVSQU5EX09QVElPTkFMLiAgVGhpcyBhbGxvd3MKLSAgICJhbmQgJDAsMywkMCIgdG8gYmUgd3JpdHRlbiBhcyAiYW5kICQwLDMiLCBldGMuICBJIGRvbid0IGxpa2UKLSAgIGl0LCBidXQgaXQncyB3aGF0IERFQyBkb2VzLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfREVGQVVMVF9GSVJTVCAwMjAwMAotCi0vKiBTaW1pbGFybHksIHRoaXMgb3BlcmFuZCBzaG91bGQgZGVmYXVsdCB0byB0aGUgc2Vjb25kIChyZWFsKSBvcGVyYW5kLgotICAgVGhpcyBhbGxvd3MgIm5lZ2wgJDAiIGluc3RlYWQgb2YgIm5lZ2wgJDAsJDAiLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfREVGQVVMVF9TRUNPTkQgMDQwMDAKLQotDAotLyogUmVnaXN0ZXIgY29tbW9uIG5hbWVzICovCi0KLSNkZWZpbmUgQVhQX1JFR19WMAkwCi0jZGVmaW5lIEFYUF9SRUdfVDAJMQotI2RlZmluZSBBWFBfUkVHX1QxCTIKLSNkZWZpbmUgQVhQX1JFR19UMgkzCi0jZGVmaW5lIEFYUF9SRUdfVDMJNAotI2RlZmluZSBBWFBfUkVHX1Q0CTUKLSNkZWZpbmUgQVhQX1JFR19UNQk2Ci0jZGVmaW5lIEFYUF9SRUdfVDYJNwotI2RlZmluZSBBWFBfUkVHX1Q3CTgKLSNkZWZpbmUgQVhQX1JFR19TMAk5Ci0jZGVmaW5lIEFYUF9SRUdfUzEJMTAKLSNkZWZpbmUgQVhQX1JFR19TMgkxMQotI2RlZmluZSBBWFBfUkVHX1MzCTEyCi0jZGVmaW5lIEFYUF9SRUdfUzQJMTMKLSNkZWZpbmUgQVhQX1JFR19TNQkxNAotI2RlZmluZSBBWFBfUkVHX0ZQCTE1Ci0jZGVmaW5lIEFYUF9SRUdfQTAJMTYKLSNkZWZpbmUgQVhQX1JFR19BMQkxNwotI2RlZmluZSBBWFBfUkVHX0EyCTE4Ci0jZGVmaW5lIEFYUF9SRUdfQTMJMTkKLSNkZWZpbmUgQVhQX1JFR19BNAkyMAotI2RlZmluZSBBWFBfUkVHX0E1CTIxCi0jZGVmaW5lIEFYUF9SRUdfVDgJMjIKLSNkZWZpbmUgQVhQX1JFR19UOQkyMwotI2RlZmluZSBBWFBfUkVHX1QxMAkyNAotI2RlZmluZSBBWFBfUkVHX1QxMQkyNQotI2RlZmluZSBBWFBfUkVHX1JBCTI2Ci0jZGVmaW5lIEFYUF9SRUdfUFYJMjcKLSNkZWZpbmUgQVhQX1JFR19UMTIJMjcKLSNkZWZpbmUgQVhQX1JFR19BVAkyOAotI2RlZmluZSBBWFBfUkVHX0dQCTI5Ci0jZGVmaW5lIEFYUF9SRUdfU1AJMzAKLSNkZWZpbmUgQVhQX1JFR19aRVJPCTMxCi0KLSNlbmRpZiAvKiBPUENPREVfQUxQSEFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvYXJjLmggYi9pbmNsdWRlL29wY29kZS9hcmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlMGNhMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9hcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIHRoZSBBUkMuCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLCBhbmQKLXRoZSBHTlUgQmludXRpbHMuCi0KLUdBUy9HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMvR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVMgb3IgR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4JSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBMaXN0IG9mIHRoZSB2YXJpb3VzIGNwdSB0eXBlcy4KLSAgIFRoZSB0YWJsZXMgY3VycmVudGx5IHVzZSBiaXQgbWFza3MgdG8gc2F5IHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIG9yCi0gICB3aGF0ZXZlciBpcyBzdXBwb3J0ZWQgYnkgYSBwYXJ0aWN1bGFyIGNwdS4gIFRoaXMgbGV0cyB1cyBoYXZlIG9uZSBlbnRyeQotICAgYXBwbHkgdG8gc2V2ZXJhbCBjcHVzLgotCi0gICBUaGlzIGR1cGxpY2F0ZXMgYmZkX21hY2hfYXJjX3h4eC4gIEZvciBub3cgSSB3aXNoIHRvIGlzb2xhdGUgdGhpcyBmcm9tIGJmZAotICAgYW5kIGJmZCBmcm9tIHRoaXMuICBBbHNvIG5vdGUgdGhhdCB0aGVzZSBudW1iZXJzIGFyZSBiaXQgdmFsdWVzIGFzIHdlIHdhbnQKLSAgIHRvIGFsbG93IGZvciB0aGluZ3MgYXZhaWxhYmxlIG9uIG1vcmUgdGhhbiBvbmUgQVJDIChidXQgbm90IG5lY2Vzc2FyaWx5IGFsbAotICAgQVJDcykuICAqLwotCi0vKiBUaGUgYGJhc2UnIGNwdSBtdXN0IGJlIDAgKHRhYmxlIGVudHJpZXMgYXJlIG9taXR0ZWQgZm9yIHRoZSBiYXNlIGNwdSkuCi0gICBUaGUgY3B1IHR5cGUgaXMgdHJlYXRlZCBpbmRlcGVuZGVudGx5IG9mIGVuZGlhbm5lc3MuCi0gICBUaGUgY29tcGxldGUgYG1hY2gnIG51bWJlciBpbmNsdWRlcyBlbmRpYW5uZXNzLgotICAgVGhlc2UgdmFsdWVzIGFyZSBpbnRlcm5hbCB0byBvcGNvZGVzL2JmZC9iaW51dGlscy9nYXMuICAqLwotI2RlZmluZSBBUkNfTUFDSF9CQVNFIDAKLSNkZWZpbmUgQVJDX01BQ0hfVU5VU0VEMSAxCi0jZGVmaW5lIEFSQ19NQUNIX1VOVVNFRDIgMgotI2RlZmluZSBBUkNfTUFDSF9VTlVTRUQ0IDQKLS8qIEFkZGl0aW9uYWwgY3B1IHZhbHVlcyBjYW4gYmUgaW5zZXJ0ZWQgaGVyZSBhbmQgQVJDX01BQ0hfQklHIG1vdmVkIGRvd24uICAqLwotI2RlZmluZSBBUkNfTUFDSF9CSUcgOAotCi0vKiBNYXNrIG9mIG51bWJlciBvZiBiaXRzIG5lY2Vzc2FyeSB0byByZWNvcmQgY3B1IHR5cGUuICAqLwotI2RlZmluZSBBUkNfTUFDSF9DUFVfTUFTSyA3Ci0vKiBNYXNrIG9mIG51bWJlciBvZiBiaXRzIG5lY2Vzc2FyeSB0byByZWNvcmQgY3B1IHR5cGUgKyBlbmRpYW5uZXNzLiAgKi8KLSNkZWZpbmUgQVJDX01BQ0hfTUFTSyAxNQotCi0vKiBUeXBlIHRvIGRlbm90ZSBhbiBBUkMgaW5zdHJ1Y3Rpb24gKGF0IGxlYXN0IGEgMzIgYml0IHVuc2lnbmVkIGludCkuICAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgYXJjX2luc247Ci0KLXN0cnVjdCBhcmNfb3Bjb2RlIHsKLSAgY2hhciAqc3ludGF4OwkJCS8qIHN5bnRheCBvZiBpbnNuICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzaywgdmFsdWU7CS8qIHJlY29nbml6ZSBpbnNuIGlmIChvcCZtYXNrKT09dmFsdWUgKi8KLSAgaW50IGZsYWdzOwkJCS8qIHZhcmlvdXMgZmxhZyBiaXRzICovCi0KLS8qIFZhbHVlcyBmb3IgYGZsYWdzJy4gICovCi0KLS8qIFJldHVybiBDUFUgbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLwotI2RlZmluZSBBUkNfT1BDT0RFX0NQVShiaXRzKSAoKGJpdHMpICYgQVJDX01BQ0hfQ1BVX01BU0spCi0vKiBSZXR1cm4gTUFDSCBudW1iZXIsIGdpdmVuIGZsYWcgYml0cy4gICovCi0jZGVmaW5lIEFSQ19PUENPREVfTUFDSChiaXRzKSAoKGJpdHMpICYgQVJDX01BQ0hfTUFTSykKLS8qIEZpcnN0IG9wY29kZSBmbGFnIGJpdCBhdmFpbGFibGUgYWZ0ZXIgbWFjaGluZSBtYXNrLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9GTEFHX1NUQVJUICgoQVJDX01BQ0hfTUFTSyArIDEpIDw8IDApCi0vKiBUaGlzIGluc24gaXMgYSBjb25kaXRpb25hbCBicmFuY2guICAqLwotI2RlZmluZSBBUkNfT1BDT0RFX0NPTkRfQlJBTkNIIChBUkNfT1BDT0RFX0ZMQUdfU1RBUlQpCi0KLSAgLyogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIG9wdGltaXplIGFzc2VtYmx5IGFuZCBkaXNhc3NlbWJseS4gIEVhY2ggaW5zbiBpcwotICAgICBvbiBhIGxpc3Qgb2YgcmVsYXRlZCBpbnNucyAoc2FtZSBmaXJzdCBsZXR0ZXIgZm9yIGFzc2VtYmx5LCBzYW1lIGluc24gY29kZQotICAgICBmb3IgZGlzYXNzZW1ibHkpLiAgKi8KLSAgc3RydWN0IGFyY19vcGNvZGUgKm5leHRfYXNtOwkvKiBOZXh0IGluc3RydWN0aW9uIHRvIHRyeSBkdXJpbmcgYXNzZW1ibHkuICAqLwotICBzdHJ1Y3QgYXJjX29wY29kZSAqbmV4dF9kaXM7CS8qIE5leHQgaW5zdHJ1Y3Rpb24gdG8gdHJ5IGR1cmluZyBkaXNhc3NlbWJseS4gICovCi0KLSAgLyogTWFjcm9zIHRvIGNyZWF0ZSB0aGUgaGFzaCB2YWx1ZXMgZm9yIHRoZSBsaXN0cy4gICovCi0jZGVmaW5lIEFSQ19IQVNIX09QQ09ERShzdHJpbmcpIFwKLSAgKChzdHJpbmcpWzBdID49ICdhJyAmJiAoc3RyaW5nKVswXSA8PSAneicgPyAoc3RyaW5nKVswXSAtICdhJyA6IDI2KQotI2RlZmluZSBBUkNfSEFTSF9JQ09ERShpbnNuKSBcCi0gICgodW5zaWduZWQgaW50KSAoaW5zbikgPj4gMjcpCi0KLSAgLyogTWFjcm9zIHRvIGFjY2VzcyBgbmV4dF9hc20nLCBgbmV4dF9kaXMnIHNvIHVzZXJzIG5lZWRuJ3QgY2FyZSBhYm91dCB0aGUKLSAgICAgdW5kZXJseWluZyBtZWNoYW5pc20uICAqLwotI2RlZmluZSBBUkNfT1BDT0RFX05FWFRfQVNNKG9wKSAoKG9wKS0+bmV4dF9hc20pCi0jZGVmaW5lIEFSQ19PUENPREVfTkVYVF9ESVMob3ApICgob3ApLT5uZXh0X2RpcykKLX07Ci0KLXN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSB7Ci0gIGNoYXIgKm5hbWU7CQkJLyogZWc6ICJlcSIgKi8KLSAgc2hvcnQgdmFsdWU7CQkJLyogZWc6IDEgKi8KLSAgdW5zaWduZWQgY2hhciB0eXBlOwkJLyogaW5kZXggaW50byBgYXJjX29wZXJhbmRzJyAqLwotICB1bnNpZ25lZCBjaGFyIGZsYWdzOwkJLyogdmFyaW91cyBmbGFnIGJpdHMgKi8KLQotLyogVmFsdWVzIGZvciBgZmxhZ3MnLiAgKi8KLQotLyogUmV0dXJuIENQVSBudW1iZXIsIGdpdmVuIGZsYWcgYml0cy4gICovCi0jZGVmaW5lIEFSQ19PUFZBTF9DUFUoYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX0NQVV9NQVNLKQotLyogUmV0dXJuIE1BQ0ggbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLwotI2RlZmluZSBBUkNfT1BWQUxfTUFDSChiaXRzKSAoKGJpdHMpICYgQVJDX01BQ0hfTUFTSykKLX07Ci0KLXN0cnVjdCBhcmNfb3BlcmFuZCB7Ci0gIC8qIE9uZSBvZiB0aGUgaW5zbiBmb3JtYXQgY2hhcnMuICAqLwotICB1bnNpZ25lZCBjaGFyIGZtdDsKLQotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQgKG1heSBiZSB1bnVzZWQgZm9yIGEgbW9kaWZpZXIpLiAgKi8KLSAgdW5zaWduZWQgY2hhciBiaXRzOwotCi0gIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbiwgb3IKLSAgICAgdGhlIG1vZGlmaWVyJ3MgZmxhZyBiaXQgKG1heSBiZSB1bnVzZWQgZm9yIGEgbW9kaWZpZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIHNoaWZ0OwotCi0gIC8qIFZhcmlvdXMgZmxhZyBiaXRzLiAgKi8KLSAgaW50IGZsYWdzOwotCi0vKiBWYWx1ZXMgZm9yIGBmbGFncycuICAqLwotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBzdWZmaXggdG8gdGhlIG9wY29kZS4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX1NVRkZJWCAxCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIHJlbGF0aXZlIGJyYW5jaCBkaXNwbGFjZW1lbnQuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfUkVMQVRJVkVfQlJBTkNIIDIKLQotLyogVGhpcyBvcGVyYW5kIGlzIGFuIGFic29sdXRlIGJyYW5jaCBhZGRyZXNzLiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX0FCU09MVVRFX0JSQU5DSCA0Ci0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhbiBhZGRyZXNzLiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX0FERFJFU1MgOAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBsb25nIGltbWVkaWF0ZSB2YWx1ZS4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX0xJTU0gMHgxMAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcy4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX1NJR05FRCAweDIwCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzLCBidXQgYWxzbyBhY2NlcHRzIGEgZnVsbCBwb3NpdGl2ZQotICAgcmFuZ2Ugb2YgdmFsdWVzLiAgVGhhdCBpcywgaWYgYml0cyBpcyAxNiwgaXQgdGFrZXMgYW55IHZhbHVlIGZyb20KLSAgIC0weDgwMDAgdG8gMHhmZmZmLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfU0lHTk9QVCAweDQwCi0KLS8qIFRoaXMgb3BlcmFuZCBzaG91bGQgYmUgcmVnYXJkZWQgYXMgYSBuZWdhdGl2ZSBudW1iZXIgZm9yIHRoZQotICAgcHVycG9zZXMgb2Ygb3ZlcmZsb3cgY2hlY2tpbmcgKGkuZS4sIHRoZSBub3JtYWwgbW9zdCBuZWdhdGl2ZQotICAgbnVtYmVyIGlzIGRpc2FsbG93ZWQgYW5kIG9uZSBtb3JlIHRoYW4gdGhlIG5vcm1hbCBtb3N0IHBvc2l0aXZlCi0gICBudW1iZXIgaXMgYWxsb3dlZCkuICBUaGlzIGZsYWcgd2lsbCBvbmx5IGJlIHNldCBmb3IgYSBzaWduZWQKLSAgIG9wZXJhbmQuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9ORUdBVElWRSAweDgwCi0KLS8qIFRoaXMgb3BlcmFuZCBkb2Vzbid0IHJlYWxseSBleGlzdC4gIFRoZSBwcm9ncmFtIHVzZXMgdGhlc2Ugb3BlcmFuZHMKLSAgIGluIHNwZWNpYWwgd2F5cy4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX0ZBS0UgMHgxMDAKLQotLyogTW9kaWZpZXIgdmFsdWVzLiAgKi8KLS8qIEEgZG90IGlzIHJlcXVpcmVkIGJlZm9yZSBhIHN1ZmZpeC4gIEVnOiAubGUgICovCi0jZGVmaW5lIEFSQ19NT0RfRE9UIDB4MTAwMAotCi0vKiBBIG5vcm1hbCByZWdpc3RlciBpcyBhbGxvd2VkIChub3QgdXNlZCwgYnV0IGhlcmUgZm9yIGNvbXBsZXRlbmVzcykuICAqLwotI2RlZmluZSBBUkNfTU9EX1JFRyAweDIwMDAKLQotLyogQW4gYXV4aWxpYXJ5IHJlZ2lzdGVyIG5hbWUgaXMgZXhwZWN0ZWQuICAqLwotI2RlZmluZSBBUkNfTU9EX0FVWFJFRyAweDQwMDAKLQotLyogU3VtIG9mIGFsbCBBUkNfTU9EX1hYWCBiaXRzLiAgKi8KLSNkZWZpbmUgQVJDX01PRF9CSVRTIDB4NzAwMAotCi0vKiBOb24temVybyBpZiB0aGUgb3BlcmFuZCB0eXBlIGlzIHJlYWxseSBhIG1vZGlmaWVyLiAgKi8KLSNkZWZpbmUgQVJDX01PRF9QKFgpICgoWCkgJiBBUkNfTU9EX0JJVFMpCi0KLSAgLyogSW5zZXJ0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICBUbyBpbnNlcnQgYW4KLSAgICAgb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGV4ZWN1dGUKLSAgICAgICAgIGkgfD0gKHAgJiAoKDEgPDwgby0+Yml0cykgLSAxKSkgPDwgby0+c2hpZnQ7Ci0gICAgIChJIGlzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3ZSBhcmUgZmlsbGluZyBpbiwgTyBpcyBhIHBvaW50ZXIgdG8KLSAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBPUCBpcyB0aGUgb3Bjb2RlIHZhbHVlOyB0aGlzIGFzc3VtZXMgdHdvcwotICAgICBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQotICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCi0gICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCi0gICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZC4KLQotICAgICBSRUcgaXMgbm9uLU5VTEwgd2hlbiBpbnNlcnRpbmcgYSByZWdpc3RlciB2YWx1ZS4gICovCi0KLSAgYXJjX2luc24gKCppbnNlcnQpIFBBUkFNUyAoKGFyY19pbnNuIGluc24sCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQsIGludCBtb2RzLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWcsIGxvbmcgdmFsdWUsCi0JCQkgICAgICBjb25zdCBjaGFyICoqZXJybXNnKSk7Ci0KLSAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KLSAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKLSAgICAgICAgIG9wID0gKChpKSA+PiBvLT5zaGlmdCkgJiAoKDEgPDwgby0+Yml0cykgLSAxKTsKLQkgaWYgKChvLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NJR05FRCkgIT0gMAotCSAgICAgJiYgKG9wICYgKDEgPDwgKG8tPmJpdHMgLSAxKSkpICE9IDApCi0JICAgb3AgLT0gMSA8PCBvLT5iaXRzOwotICAgICAoSSBpcyB0aGUgaW5zdHJ1Y3Rpb24sIE8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLCBhbmQgT1AKLSAgICAgaXMgdGhlIHJlc3VsdDsgdGhpcyBhc3N1bWVzIHR3b3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLiAgSWYKLSAgICAgdGhlIElOVkFMSUQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpJTlZBTElEIHdpbGwgYmUgc2V0IHRvCi0gICAgIG5vbi16ZXJvIGlmIHRoaXMgb3BlcmFuZCB0eXBlIGNhbiBub3QgYWN0dWFsbHkgYmUgZXh0cmFjdGVkIGZyb20KLSAgICAgdGhpcyBvcGVyYW5kIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2gpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgaXMgdmFsaWQsICpJTlZBTElEIHdpbGwgbm90IGJlIGNoYW5nZWQuCi0KLSAgICAgSU5TTiBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdHdvIGBhcmNfaW5zbidzLiAgVGhlIGZpcnN0IGVsZW1lbnQgaXMKLSAgICAgdGhlIGluc24sIHRoZSBzZWNvbmQgaXMgdGhlIGxpbW0gaWYgcHJlc2VudC4KLQotICAgICBPcGVyYW5kcyB0aGF0IGhhdmUgYSBwcmludGFibGUgZm9ybSBsaWtlIHJlZ2lzdGVycyBhbmQgc3VmZml4ZXMgaGF2ZQotICAgICB0aGVpciBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgcG9pbnRlciBzdG9yZWQgaW4gT1BWQUwuICAqLwotCi0gIGxvbmcgKCpleHRyYWN0KSBQQVJBTVMgKChhcmNfaW5zbiAqaW5zbiwKLQkJCSAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZCwKLQkJCSAgIGludCBtb2RzLCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKipvcHZhbCwKLQkJCSAgIGludCAqaW52YWxpZCkpOwotfTsKLQotLyogQml0cyB0aGF0IHNheSB3aGF0IHZlcnNpb24gb2YgY3B1IHdlIGhhdmUuCi0gICBUaGVzZSBzaG91bGQgYmUgcGFzc2VkIHRvIGFyY19pbml0X29wY29kZV90YWJsZXMuCi0gICBBdCBwcmVzZW50LCBhbGwgdGhlcmUgaXMgaXMgdGhlIGNwdSB0eXBlLiAgKi8KLQotLyogQ1BVIG51bWJlciwgZ2l2ZW4gdmFsdWUgcGFzc2VkIHRvIGBhcmNfaW5pdF9vcGNvZGVfdGFibGVzJy4gICovCi0jZGVmaW5lIEFSQ19IQVZFX0NQVShiaXRzKSAoKGJpdHMpICYgQVJDX01BQ0hfQ1BVX01BU0spCi0vKiBNQUNIIG51bWJlciwgZ2l2ZW4gdmFsdWUgcGFzc2VkIHRvIGBhcmNfaW5pdF9vcGNvZGVfdGFibGVzJy4gICovCi0jZGVmaW5lIEFSQ19IQVZFX01BQ0goYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX01BU0spCi0KLS8qIFNwZWNpYWwgcmVnaXN0ZXIgdmFsdWVzOiAgKi8KLSNkZWZpbmUgQVJDX1JFR19TSElNTV9VUERBVEUgNjEKLSNkZWZpbmUgQVJDX1JFR19TSElNTSA2MwotI2RlZmluZSBBUkNfUkVHX0xJTU0gNjIKLQotLyogTm9uLXplcm8gaWYgUkVHIGlzIGEgY29uc3RhbnQgbWFya2VyLiAgKi8KLSNkZWZpbmUgQVJDX1JFR19DT05TVEFOVF9QKFJFRykgKChSRUcpID49IDYxKQotCi0vKiBQb3NpdGlvbnMgYW5kIG1hc2tzIG9mIHZhcmlvdXMgZmllbGRzOiAgKi8KLSNkZWZpbmUgQVJDX1NISUZUX1JFR0EgMjEKLSNkZWZpbmUgQVJDX1NISUZUX1JFR0IgMTUKLSNkZWZpbmUgQVJDX1NISUZUX1JFR0MgOQotI2RlZmluZSBBUkNfTUFTS19SRUcgNjMKLQotLyogRGVsYXkgc2xvdCB0eXBlcy4gICovCi0jZGVmaW5lIEFSQ19ERUxBWV9OT05FIDAJLyogbm8gZGVsYXkgc2xvdCAqLwotI2RlZmluZSBBUkNfREVMQVlfTk9STUFMIDEJLyogZGVsYXkgc2xvdCBpbiBib3RoIGNhc2VzICovCi0jZGVmaW5lIEFSQ19ERUxBWV9KVU1QIDIJLyogZGVsYXkgc2xvdCBvbmx5IGlmIGJyYW5jaCB0YWtlbiAqLwotCi0vKiBOb24temVybyBpZiBYIHdpbGwgZml0IGluIGEgc2lnbmVkIDkgYml0IGZpZWxkLiAgKi8KLSNkZWZpbmUgQVJDX1NISU1NX0NPTlNUX1AoeCkgKChsb25nKSAoeCkgPj0gLTI1NiAmJiAobG9uZykgKHgpIDw9IDI1NSkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCBhcmNfb3BlcmFuZHNbXTsKLWV4dGVybiBjb25zdCBpbnQgYXJjX29wZXJhbmRfY291bnQ7Ci1leHRlcm4gLypjb25zdCovIHN0cnVjdCBhcmNfb3Bjb2RlIGFyY19vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IGFyY19vcGNvZGVzX2NvdW50OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSBhcmNfc3VmZml4ZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgYXJjX3N1ZmZpeGVzX2NvdW50OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSBhcmNfcmVnX25hbWVzW107Ci1leHRlcm4gY29uc3QgaW50IGFyY19yZWdfbmFtZXNfY291bnQ7Ci1leHRlcm4gdW5zaWduZWQgY2hhciBhcmNfb3BlcmFuZF9tYXBbXTsKLQotLyogVXRpbGl0eSBmbnMgaW4gYXJjLW9wYy5jLiAgKi8KLWludCBhcmNfZ2V0X29wY29kZV9tYWNoIFBBUkFNUyAoKGludCwgaW50KSk7Ci0vKiBgYXJjX29wY29kZV9pbml0X3RhYmxlcycgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGBhcmNfeHh4X3N1cHBvcnRlZCcuICAqLwotdm9pZCBhcmNfb3Bjb2RlX2luaXRfdGFibGVzIFBBUkFNUyAoKGludCkpOwotdm9pZCBhcmNfb3Bjb2RlX2luaXRfaW5zZXJ0IFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgYXJjX29wY29kZV9pbml0X2V4dHJhY3QgUEFSQU1TICgodm9pZCkpOwotY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKmFyY19vcGNvZGVfbG9va3VwX2FzbSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWNvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICphcmNfb3Bjb2RlX2xvb2t1cF9kaXMgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1pbnQgYXJjX29wY29kZV9saW1tX3AgUEFSQU1TICgobG9uZyAqKSk7Ci1jb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKmFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKnR5cGUsIGludCB2YWx1ZSkpOwotaW50IGFyY19vcGNvZGVfc3VwcG9ydGVkIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICopKTsKLWludCBhcmNfb3B2YWxfc3VwcG9ydGVkIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9hcm0uaCBiL2luY2x1ZGUvb3Bjb2RlL2FybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzA4N2ViLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2FybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qIEFSTSBvcGNvZGUgbGlzdC4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgR0FTLgotCi1HREIgYW5kIEdBUyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIgYW5kIEdBUyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHREIgb3IgR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiB0eXBlcyBvZiBpbnN0cnVjdGlvbiAoZW5jb2RlZCBpbiBiaXRzIDI2IGFuZCAyNyBvZiB0aGUgaW5zdHJ1Y3Rpb24pICovCi0KLSNkZWZpbmUgVFlQRV9BUklUSE1FVElDCQkwCi0jZGVmaW5lIFRZUEVfTERSX1NUUgkJMQotI2RlZmluZSBUWVBFX0JMT0NLX0JSQU5DSAkyCi0jZGVmaW5lIFRZUEVfU1dJCQkzCi0KLS8qIGJpdCAyNSBkZWNpZGVzIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gaXMgYSBibG9jayBtb3ZlIG9yIGEgYnJhbmNoICovCi0jZGVmaW5lIFNVQlRZUEVfQkxPQ0sJCTAKLSNkZWZpbmUgU1VCVFlQRV9CUkFOQ0gJCTEKLQotLyogY29kZXMgdG8gZGlzdGluZ3Vpc2ggdGhlIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zICovCi0KLSNkZWZpbmUgT1BDT0RFX0FORAkwCi0jZGVmaW5lIE9QQ09ERV9FT1IJMQotI2RlZmluZSBPUENPREVfU1VCCTIKLSNkZWZpbmUgT1BDT0RFX1JTQgkzCi0jZGVmaW5lIE9QQ09ERV9BREQJNAotI2RlZmluZSBPUENPREVfQURDCTUKLSNkZWZpbmUgT1BDT0RFX1NCQwk2Ci0jZGVmaW5lIE9QQ09ERV9SU0MJNwotI2RlZmluZSBPUENPREVfVFNUCTgKLSNkZWZpbmUgT1BDT0RFX1RFUQk5Ci0jZGVmaW5lIE9QQ09ERV9DTVAJMTAKLSNkZWZpbmUgT1BDT0RFX0NNTgkxMQotI2RlZmluZSBPUENPREVfT1JSCTEyCi0jZGVmaW5lIE9QQ09ERV9NT1YJMTMKLSNkZWZpbmUgT1BDT0RFX0JJQwkxNAotI2RlZmluZSBPUENPREVfTVZOCTE1Ci0KLS8qIGNvbmRpdGlvbiBjb2RlcyAqLwotCi0jZGVmaW5lIENPTkRfRVEJCTAKLSNkZWZpbmUgQ09ORF9ORQkJMQotI2RlZmluZSBDT05EX0NTCQkyCi0jZGVmaW5lIENPTkRfQ0MJCTMKLSNkZWZpbmUgQ09ORF9NSQkJNAotI2RlZmluZSBDT05EX1BMCQk1Ci0jZGVmaW5lIENPTkRfVlMJCTYKLSNkZWZpbmUgQ09ORF9WQwkJNwotI2RlZmluZSBDT05EX0hJCQk4Ci0jZGVmaW5lIENPTkRfTFMJCTkKLSNkZWZpbmUgQ09ORF9HRQkJMTAKLSNkZWZpbmUgQ09ORF9MVAkJMTEKLSNkZWZpbmUgQ09ORF9HVAkJMTIKLSNkZWZpbmUgQ09ORF9MRQkJMTMKLSNkZWZpbmUgQ09ORF9BTAkJMTQKLSNkZWZpbmUgQ09ORF9OVgkJMTUKLQotLyogRGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgYW4gQVJNIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gKi8KLQotc3RydWN0IGdlbmVyaWNfZm10IHsKLSAgICB1bnNpZ25lZCByZXN0CToyNTsJLyogdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9uICovCi0gICAgdW5zaWduZWQgc3VidHlwZQk6MTsJLyogdXNlZCB0byBkZWNpZGUgYmV0d2VlbiBibG9jayBhbmQgYnJhbmNoICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogb25lIG9mIFRZUEVfKiAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLwotfTsKLQotc3RydWN0IGFyaXRoX2ZtdCB7Ci0gICAgdW5zaWduZWQgb3BlcmFuZDIJOjEyOwkvKiAjbm4gb3Igcm4gb3Igcm4gc2hpZnQgI20gb3Igcm4gc2hpZnQgcm0gKi8KLSAgICB1bnNpZ25lZCBkZXN0CTo0OwkvKiBwbGFjZSB3aGVyZSB0aGUgYW5zd2VyIGdvZXMgKi8KLSAgICB1bnNpZ25lZCBvcGVyYW5kMQk6NDsJLyogZmlyc3Qgb3BlcmFuZCB0byBpbnN0cnVjdGlvbiAqLwotICAgIHVuc2lnbmVkIHNldAk6MTsJLyogPT0gMSBtZWFucyBzZXQgcHJvY2Vzc29yIGZsYWdzICovCi0gICAgdW5zaWduZWQgb3Bjb2RlCTo0OwkvKiBvbmUgb2YgT1BDT0RFXyogZGVmaW5lZCBhYm92ZSAqLwotICAgIHVuc2lnbmVkIGltbWVkCToxOwkvKiBvcGVyYW5kMiBpcyBhbiBpbW1lZGlhdGUgdmFsdWUgKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX0FSSVRITUVUSUMgKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLXN0cnVjdCBsZHJfc3RyX2ZtdCB7Ci0gICAgdW5zaWduZWQgb2Zmc2V0CToxMjsJLyogI25uIG9yIHJuIG9yIHJuIHNoaWZ0ICNtICovCi0gICAgdW5zaWduZWQgcmVnCTo0OwkvKiBkZXN0aW5hdGlvbiBmb3IgTERSLCBzb3VyY2UgZm9yIFNUUiAqLwotICAgIHVuc2lnbmVkIGJhc2UJOjQ7CS8qIGJhc2UgcmVnaXN0ZXIgKi8KLSAgICB1bnNpZ25lZCBpc19sb2FkCToxOwkvKiA9PSAxIGZvciBMRFIgKi8KLSAgICB1bnNpZ25lZCB3cml0ZWJhY2sJOjE7CS8qID09IDEgbWVhbnMgd3JpdGUgYmFjayAoYmFzZStvZmZzZXQpIGludG8gYmFzZSAqLwotICAgIHVuc2lnbmVkIGJ5dGUJOjE7CS8qID09IDEgbWVhbnMgYnl0ZSBhY2Nlc3MgZWxzZSB3b3JkICovCi0gICAgdW5zaWduZWQgdXAJCToxOwkvKiA9PSAxIG1lYW5zIGFkZCBvZmZzZXQgZWxzZSBzdWJ0cmFjdCBpdCAqLwotICAgIHVuc2lnbmVkIHByZV9pbmRleAk6MTsJLyogPT0gMSBtZWFucyBbYSxiXSBmb3JtIGVsc2UgW2FdLGIgZm9ybSAqLwotICAgIHVuc2lnbmVkIGltbWVkCToxOwkvKiA9PSAwIG1lYW5zIGltbWVkaWF0ZSBvZmZzZXQgKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX0xEUl9TVFIgKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLXN0cnVjdCBibG9ja19mbXQgewotICAgIHVuc2lnbmVkIG1hc2sJOjE2OwkvKiByZWdpc3RlciBtYXNrICovCi0gICAgdW5zaWduZWQgYmFzZQk6NDsJLyogcmVnaXN0ZXIgdXNlZCBhcyBiYXNlIG9mIG1vdmUgKi8KLSAgICB1bnNpZ25lZCBpc19sb2FkCToxOwkvKiA9PSAxIGZvciBMRE0gKi8KLSAgICB1bnNpZ25lZCB3cml0ZWJhY2sJOjE7CS8qID09IDEgbWVhbnMgdXBkYXRlIGJhc2UgYWZ0ZXIgbW92ZSAqLwotICAgIHVuc2lnbmVkIHNldAk6MTsJLyogPT0gMSBtZWFucyBzZXQgZmxhZ3MgaW4gcGMgaWYgaW5jbHVkZWQgaW4gbWFzayAqLwotICAgIHVuc2lnbmVkIGluY3JlbWVudAk6MTsJLyogPT0gMSBtZWFucyBpbmNyZW1lbnQgYmFzZSByZWdpc3RlciAqLwotICAgIHVuc2lnbmVkIGJlZm9yZQk6MTsJLyogPT0gMSBtZWFucyBpbmMvZGVjIGJlZm9yZSBlYWNoIG1vdmUgKi8KLSAgICB1bnNpZ25lZCBpc19ibG9jawk6MTsJLyogPT0gU1VCVFlQRV9CTE9DSyAqLwotICAgIHVuc2lnbmVkIHR5cGUJOjI7CS8qID09IFRZUEVfQkxPQ0tfQlJBTkNIICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCi19OwotCi1zdHJ1Y3QgYnJhbmNoX2ZtdCB7Ci0gICAgdW5zaWduZWQgZGVzdAk6MjQ7CS8qIGRlc3RpbmF0aW9uIG9mIHRoZSBicmFuY2ggKi8KLSAgICB1bnNpZ25lZCBsaW5rCToxOwkvKiBicmFuY2ggd2l0aCBsaW5rIChmdW5jdGlvbiBjYWxsKSAqLwotICAgIHVuc2lnbmVkIGlzX2JyYW5jaAk6MTsJLyogPT0gU1VCVFlQRV9CUkFOQ0ggKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX0JMT0NLX0JSQU5DSCAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLwotfTsKLQotI2RlZmluZSBST1VORF9OCQkwCi0jZGVmaW5lIFJPVU5EX1AJCTEKLSNkZWZpbmUgUk9VTkRfTQkJMgotI2RlZmluZSBST1VORF9aCQkzCi0KLSNkZWZpbmUgRkxPQVQyX01WRgkwCi0jZGVmaW5lIEZMT0FUMl9NTkYJMQotI2RlZmluZSBGTE9BVDJfQUJTCTIKLSNkZWZpbmUgRkxPQVQyX1JORAkzCi0jZGVmaW5lIEZMT0FUMl9TUVQJNAotI2RlZmluZSBGTE9BVDJfTE9HCTUKLSNkZWZpbmUgRkxPQVQyX0xHTgk2Ci0jZGVmaW5lIEZMT0FUMl9FWFAJNwotI2RlZmluZSBGTE9BVDJfU0lOCTgKLSNkZWZpbmUgRkxPQVQyX0NPUwk5Ci0jZGVmaW5lIEZMT0FUMl9UQU4JMTAKLSNkZWZpbmUgRkxPQVQyX0FTTgkxMQotI2RlZmluZSBGTE9BVDJfQUNTCTEyCi0jZGVmaW5lIEZMT0FUMl9BVE4JMTMKLQotI2RlZmluZSBGTE9BVDNfQURGCTAKLSNkZWZpbmUgRkxPQVQzX01VRgkxCi0jZGVmaW5lIEZMT0FUM19TVUYJMgotI2RlZmluZSBGTE9BVDNfUlNGCTMKLSNkZWZpbmUgRkxPQVQzX0RWRgk0Ci0jZGVmaW5lIEZMT0FUM19SREYJNQotI2RlZmluZSBGTE9BVDNfUE9XCTYKLSNkZWZpbmUgRkxPQVQzX1JQVwk3Ci0jZGVmaW5lIEZMT0FUM19STUYJOAotI2RlZmluZSBGTE9BVDNfRk1MCTkKLSNkZWZpbmUgRkxPQVQzX0ZEVgkxMAotI2RlZmluZSBGTE9BVDNfRlJECTExCi0jZGVmaW5lIEZMT0FUM19QT0wJMTIKLQotc3RydWN0IGZsb2F0Ml9mbXQgewotICAgIHVuc2lnbmVkIG9wZXJhbmQyCTozOwkvKiBzZWNvbmQgb3BlcmFuZCAqLwotICAgIHVuc2lnbmVkIGltbWVkCToxOwkvKiA9PSAxIGlmIHNlY29uZCBvcGVyYW5kIGlzIGEgY29uc3RhbnQgKi8KLSAgICB1bnNpZ25lZCBwYWQxCToxOwkvKiA9PSAwICovCi0gICAgdW5zaWduZWQgcm91bmRpbmcJOjI7CS8qIFJPVU5EXyogKi8KLSAgICB1bnNpZ25lZCBpc19kb3VibGUJOjE7CS8qID09IDEgaWYgcHJlY2lzaW9uIGlzIGRvdWJsZSAob25seSBpZiBub3QgZXh0ZW5kZWQpICovCi0gICAgdW5zaWduZWQgcGFkMgk6NDsJLyogPT0gMSAqLwotICAgIHVuc2lnbmVkIGRlc3QJOjM7CS8qIGRlc3RpbmF0aW9uICovCi0gICAgdW5zaWduZWQgaXNfMl9vcAk6MTsJLyogPT0gMSBpZiAyIG9wZXJhbmQgaW5zICovCi0gICAgdW5zaWduZWQgb3BlcmFuZDEJOjM7CS8qIGZpcnN0IG9wZXJhbmQgKG9ubHkgb2YgaXNfMl9vcCA9PSAwKSAqLwotICAgIHVuc2lnbmVkIGlzX2V4dGVuZGVkIDoxOwkvKiA9PSAxIGlmIHByZWNpc2lvbiBpcyBleHRlbmRlZCAqLwotICAgIHVuc2lnbmVkIG9wY29kZQk6NDsJLyogRkxPQVQyXyogb3IgRkxPQVQzXyogZGVwZW5kaW5nIG9uIGlzXzJfb3AgKi8KLSAgICB1bnNpZ25lZCBtdXN0X2JlXzIJOjI7CS8qID09IDIgKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX1NXSSAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIENPTkRfKiAqLwotfTsKLQotc3RydWN0IHN3aV9mbXQgewotICAgIHVuc2lnbmVkIGFyZ3VtZW50CToyNDsJLyogYXJndW1lbnQgdG8gU1dJIChzeXNjYWxsIG51bWJlcikgKi8KLSAgICB1bnNpZ25lZCBtdXN0X2JlXzMJOjI7CS8qID09IDMgKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX1NXSSAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLwotfTsKLQotdW5pb24gaW5zbl9mbXQgewotICAgIHN0cnVjdCBnZW5lcmljX2ZtdAlnZW5lcmljOwotICAgIHN0cnVjdCBhcml0aF9mbXQJYXJpdGg7Ci0gICAgc3RydWN0IGxkcl9zdHJfZm10CWxkcl9zdHI7Ci0gICAgc3RydWN0IGJsb2NrX2ZtdAlibG9jazsKLSAgICBzdHJ1Y3QgYnJhbmNoX2ZtdAlicmFuY2g7Ci0gICAgc3RydWN0IHN3aV9mbXQJc3dpOwotICAgIHVuc2lnbmVkIGxvbmcJaW5zOwotfTsKLQotc3RydWN0IG9wY29kZSB7Ci0gICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgbWFzazsJLyogcmVjb2duaXNlIGluc3RydWN0aW9uIGlmIChvcCZtYXNrKT09dmFsdWUgKi8KLSAgICBjaGFyICphc3NlbWJsZXI7CQkvKiBob3cgdG8gZGlzYXNzZW1ibGUgdGhpcyBpbnN0cnVjdGlvbiAqLwotfTsKLQotLyogZm9ybWF0IG9mIHRoZSBhc3NlbWJsZXIgc3RyaW5nIDoKLSAgIAotICAgJSUJCQklCi0gICAlPGJpdGZpZWxkPmQJCXByaW50IHRoZSBiaXRmaWVsZCBpbiBkZWNpbWFsCi0gICAlPGJpdGZpZWxkPngJCXByaW50IHRoZSBiaXRmaWVsZCBpbiBoZXgKLSAgICU8Yml0ZmllbGQ+cgkJcHJpbnQgYXMgYW4gQVJNIHJlZ2lzdGVyCi0gICAlPGJpdGZpZWxkPmYJCXByaW50IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaWYgPjcgZWxzZSBhbiBmcCByZWdpc3RlcgotICAgJWMJCQlwcmludCBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgMjgtMzEpCi0gICAlUAkJCXByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBhcml0aG1ldGljIGluc24KLSAgICVRCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGxkZi9zdGYgaW5zbgotICAgJVIJCQlwcmludCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBtb2RlCi0gICAlPGJpdG51bT4nYwkJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdCBpcyBvbmUKLSAgICU8Yml0bnVtPmBjCQlwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0IGlzIHplcm8KLSAgICU8Yml0bnVtPj9hYgkJcHJpbnQgYSBpZiBiaXQgaXMgb25lIGVsc2UgcHJpbnQgYgotICAgJXAJCQlwcmludCAncCcgaWZmIGJpdHMgMTItMTUgYXJlIDE1Ci0gICAlbwkJCXByaW50IG9wZXJhbmQyIChpbW1lZGlhdGUgb3IgcmVnaXN0ZXIgKyBzaGlmdCkKLSAgICVhCQkJcHJpbnQgYWRkcmVzcyBmb3IgbGRyL3N0ciBpbnN0cnVjdGlvbgotICAgJWIJCQlwcmludCBicmFuY2ggZGVzdGluYXRpb24KLSAgICVBCQkJcHJpbnQgYWRkcmVzcyBmb3IgbGRjL3N0Yy9sZGYvc3RmIGluc3RydWN0aW9uCi0gICAlbQkJCXByaW50IHJlZ2lzdGVyIG1hc2sgZm9yIGxkbS9zdG0gaW5zdHJ1Y3Rpb24KLSovCi0KLXN0YXRpYyBzdHJ1Y3Qgb3Bjb2RlIG9wY29kZXNbXSA9IHsKLSAgICAvKiBBUk0gaW5zdHJ1Y3Rpb25zICovCi0gICAgMHgwMDAwMDA5MCwgMHgwZmUwMDBmMCwgIm11bCUyMCdzICUxMi0xNXIsICUxNi0xOXIsICUwLTNyIiwKLSAgICAweDAwMjAwMDkwLCAweDBmZTAwMGYwLCAibWxhJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsICU4LTExciIsCi0gICAgMHgwMDAwMDAwMCwgMHgwZGUwMDAwMCwgImFuZCVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDAyMDAwMDAsIDB4MGRlMDAwMDAsICJlb3IlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwNDAwMDAwLCAweDBkZTAwMDAwLCAic3ViJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMDYwMDAwMCwgMHgwZGUwMDAwMCwgInJzYiVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDA4MDAwMDAsIDB4MGRlMDAwMDAsICJhZGQlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwYTAwMDAwLCAweDBkZTAwMDAwLCAiYWRjJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMGMwMDAwMCwgMHgwZGUwMDAwMCwgInNiYyVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDBlMDAwMDAsIDB4MGRlMDAwMDAsICJyc2MlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAxMDAwMDAwLCAweDBkZTAwMDAwLCAidHN0JWMlcCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMTIwMDAwMCwgMHgwZGUwMDAwMCwgInRlcSVjJXAgJTE2LTE5ciwgJW8iLAotICAgIDB4MDE0MDAwMDAsIDB4MGRlMDAwMDAsICJjbXAlYyVwICUxNi0xOXIsICVvIiwKLSAgICAweDAxNjAwMDAwLCAweDBkZTAwMDAwLCAiY21uJWMlcCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMTgwMDAwMCwgMHgwZGUwMDAwMCwgIm9yciVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDFhMDAwMDAsIDB4MGRlMDAwMDAsICJtb3YlYyUyMCdzICUxMi0xNXIsICVvIiwKLSAgICAweDAxYzAwMDAwLCAweDBkZTAwMDAwLCAiYmljJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMWUwMDAwMCwgMHgwZGUwMDAwMCwgIm12biVjJTIwJ3MgJTEyLTE1ciwgJW8iLAotICAgIDB4MDQwMDAwMDAsIDB4MGMxMDAwMDAsICJzdHIlYyUyMidiICUxMi0xNXIsICVhIiwKLSAgICAweDA0MTAwMDAwLCAweDBjMTAwMDAwLCAibGRyJWMlMjInYiAlMTItMTVyLCAlYSIsCi0gICAgMHgwODAwMDAwMCwgMHgwZTEwMDAwMCwgInN0bSVjJTIzP2lkJTI0P2JhICUxNi0xOXIlMjJgISwgJW0iLAotICAgIDB4MDgxMDAwMDAsIDB4MGUxMDAwMDAsICJsZG0lYyUyMz9pZCUyND9iYSAlMTYtMTlyJTIyYCEsICVtJTIyJ14iLAotICAgIDB4MGEwMDAwMDAsIDB4MGUwMDAwMDAsICJiJWMlMjQnbCAlYiIsCi0gICAgMHgwZjAwMDAwMCwgMHgwZjAwMDAwMCwgInN3aSVjICUwLTIzeCIsCi0gICAgLyogRmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCi0gICAgMHgwZTAwMDEwMCwgMHgwZmYwOGYxMCwgImFkZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTEwMDEwMCwgMHgwZmYwOGYxMCwgIm11ZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTIwMDEwMCwgMHgwZmYwOGYxMCwgInN1ZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTMwMDEwMCwgMHgwZmYwOGYxMCwgInJzZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTQwMDEwMCwgMHgwZmYwOGYxMCwgImR2ZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTUwMDEwMCwgMHgwZmYwOGYxMCwgInJkZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTYwMDEwMCwgMHgwZmYwOGYxMCwgInBvdyVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTcwMDEwMCwgMHgwZmYwOGYxMCwgInJwdyVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTgwMDEwMCwgMHgwZmYwOGYxMCwgInJtZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTkwMDEwMCwgMHgwZmYwOGYxMCwgImZtbCVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWEwMDEwMCwgMHgwZmYwOGYxMCwgImZkdiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWIwMDEwMCwgMHgwZmYwOGYxMCwgImZyZCVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWMwMDEwMCwgMHgwZmYwOGYxMCwgInBvbCVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZTAwODEwMCwgMHgwZmYwOGYxMCwgIm12ZiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTEwODEwMCwgMHgwZmYwOGYxMCwgIm1uZiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTIwODEwMCwgMHgwZmYwOGYxMCwgImFicyVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTMwODEwMCwgMHgwZmYwOGYxMCwgInJuZCVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTQwODEwMCwgMHgwZmYwOGYxMCwgInNxdCVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTUwODEwMCwgMHgwZmYwOGYxMCwgImxvZyVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTYwODEwMCwgMHgwZmYwOGYxMCwgImxnbiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTcwODEwMCwgMHgwZmYwOGYxMCwgImV4cCVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTgwODEwMCwgMHgwZmYwOGYxMCwgInNpbiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTkwODEwMCwgMHgwZmYwOGYxMCwgImNvcyVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZWEwODEwMCwgMHgwZmYwOGYxMCwgInRhbiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZWIwODEwMCwgMHgwZmYwOGYxMCwgImFzbiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZWMwODEwMCwgMHgwZmYwOGYxMCwgImFjcyVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZWQwODEwMCwgMHgwZmYwOGYxMCwgImF0biVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCi0gICAgMHgwZTAwMDExMCwgMHgwZmYwMGYxZiwgImZsdCVjJVAlUiAlMTYtMThmLCAlMTItMTVyIiwKLSAgICAweDBlMTAwMTEwLCAweDBmZmYwZjk4LCAiZml4JWMlUiAlMTItMTVyLCAlMC0yZiIsCi0gICAgMHgwZTIwMDExMCwgMHgwZmZmMGZmZiwgIndmcyVjICUxMi0xNXIiLAotICAgIDB4MGUzMDAxMTAsIDB4MGZmZjBmZmYsICJyZnMlYyAlMTItMTVyIiwKLSAgICAweDBlNDAwMTEwLCAweDBmZmYwZmZmLCAid2ZjJWMgJTEyLTE1ciIsCi0gICAgMHgwZTUwMDExMCwgMHgwZmZmMGZmZiwgInJmYyVjICUxMi0xNXIiLAotICAgIDB4MGU5MGYxMTAsIDB4MGZmOGZmZjAsICJjbWYlYyAlMTYtMThmLCAlMC0zZiIsCi0gICAgMHgwZWIwZjExMCwgMHgwZmY4ZmZmMCwgImNuZiVjICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlZDBmMTEwLCAweDBmZjhmZmYwLCAiY21mZSVjICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlZjBmMTEwLCAweDBmZjhmZmYwLCAiY25mZSVjICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBjMDAwMTAwLCAweDBlMTAwZjAwLCAic3RmJWMlUSAlMTItMTRmLCAlQSIsCi0gICAgMHgwYzEwMDEwMCwgMHgwZTEwMGYwMCwgImxkZiVjJVEgJTEyLTE0ZiwgJUEiLAotICAgIC8qIEdlbmVyaWMgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCi0gICAgMHgwZTAwMDAwMCwgMHgwZjAwMDAxMCwgImNkcCVjICU4LTExZCwgJTIwLTIzZCwgY3IlMTItMTVkLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0iLAotICAgIDB4MGUwMDAwMTAsIDB4MGYxMDAwMTAsICJtcmMlYyAlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSIsCi0gICAgMHgwZTEwMDAxMCwgMHgwZjEwMDAxMCwgIm1jciVjICU4LTExZCwgJTIxLTIzZCwgJTEyLTE1ciwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9IiwKLSAgICAweDBjMDAwMDAwLCAweDBlMTAwMDAwLCAic3RjJWMlMjJgbCAlOC0xMWQsIGNyJTEyLTE1ZCwgJUEiLAotICAgIDB4MGMxMDAwMDAsIDB4MGUxMDAwMDAsICJsZGMlYyUyMmBsICU4LTExZCwgY3IlMTItMTVkLCAlQSIsCi0gICAgLyogdGhlIHJlc3QgKi8KLSAgICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAidW5kZWZpbmVkIGluc3RydWN0aW9uICUwLTMxeCIsCi19OwotI2RlZmluZSBOX09QQ09ERVMJKHNpemVvZiBvcGNvZGVzIC8gc2l6ZW9mIG9wY29kZXNbMF0pCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9jZ2VuLmggYi9pbmNsdWRlL29wY29kZS9jZ2VuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNWZkMGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvY2dlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM4NiArMCwwIEBACi0vKiBIZWFkZXIgZmlsZSBmb3IgdGFyZ2V0cyB1c2luZyBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlciwgYW5kIHRoZSBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgQ0dFTl9ICi0jZGVmaW5lIENHRU5fSAotCi0vKiA/Pz8gVGhpcyBmaWxlIHJlcXVpcmVzIGJmZC5oIGJ1dCBvbmx5IHRvIGdldCBiZmRfdm1hLgotICAgU2VlbXMgbGlrZSBhbiBhd2Z1bCBsb3QgdG8gcmVxdWlyZSBqdXN0IHRvIGdldCBzdWNoIGEgZnVuZGFtZW50YWwgdHlwZS4KLSAgIFBlcmhhcHMgdGhlIGRlZmluaXRpb24gb2YgYmZkX3ZtYSBjYW4gYmUgbW92ZWQgb3V0c2lkZSBvZiBiZmQuaC4KLSAgIE9yIHBlcmhhcHMgb25lIGNvdWxkIGR1cGxpY2F0ZSBpdHMgZGVmaW5pdGlvbiBpbiBhbm90aGVyIGZpbGUuCi0gICBVbnRpbCBzdWNoIHRpbWUsIHRoaXMgZmlsZSBjb25kaXRpb25hbGx5IGNvbXBpbGVzIGRlZmluaXRpb25zIHRoYXQgcmVxdWlyZQotICAgYmZkX3ZtYSB1c2luZyBCRkRfVkVSU0lPTi4gICovCi0KLS8qIEVudW1zIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgdGhleSBjYW4gYmUgdXNlZC4KLSAgIEFsbG93IHRoZW0gdG8gYmUgdXNlZCBpbiBzdHJ1Y3QgZGVmaW5pdGlvbnMsIGV2ZW4gdGhvdWdoIHRoZSBlbnVtIG11c3QKLSAgIGJlIGRlZmluZWQgZWxzZXdoZXJlLgotICAgSWYgQ0dFTl9BUkNIIGlzbid0IGRlZmluZWQsIHRoaXMgZmlsZSBpcyBiZWluZyBpbmNsdWRlZCBieSBzb21ldGhpbmcgb3RoZXIKLSAgIHRoYW4gPGFyY2g+LWRlc2MuaC4gICovCi0KLS8qIFByZXBlbmQgdGhlIGFyY2ggbmFtZSwgZGVmaW5lZCBpbiA8YXJjaD4tZGVzYy5oLCBhbmQgX2NnZW5fIHRvIHN5bWJvbCBTLgotICAgVGhlIGxhY2sgb2Ygc3BhY2VzIGluIHRoZSBhcmcgbGlzdCBpcyBpbXBvcnRhbnQgZm9yIG5vbi1zdGRjIHN5c3RlbXMuCi0gICBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgPGFyY2g+LWRlc2MuaC4KLSAgIEl0IGNhbiBiZSBpbmNsdWRlZCBpbmRlcGVuZGVudGx5IG9mIDxhcmNoPi1kZXNjLmgsIGluIHdoaWNoIGNhc2UgdGhlIGFyY2gKLSAgIGRlcGVuZGVudCBwb3J0aW9ucyB3aWxsIGJlIGRlY2xhcmVkIGFzICJ1bmtub3duX2NnZW5fZm9vIi4gICovCi0KLSNpZm5kZWYgQ0dFTl9TWU0KLSNkZWZpbmUgQ0dFTl9TWU0ocykgQ09OQ0FUMyAodW5rbm93bixfY2dlbl8scykKLSNlbmRpZgotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0YXRpYyAodW5jaGFuZ2luZykgcGllY2VzIGFuZCBhcyBtdWNoIG90aGVyIHN0dWZmCi0gICBhcyB3ZSBjYW4gcmVhc29uYWJseSBwdXQgaGVyZS4gIEl0J3MgZ2VuZXJhbGx5IGNsZWFuZXIgdG8gcHV0IHN0dWZmIGhlcmUKLSAgIHJhdGhlciB0aGFuIGhhdmluZyBpdCBtYWNoaW5lIGdlbmVyYXRlZCBpZiBwb3NzaWJsZS4gICovCi0KLS8qIFRoZSBhc3NlbWJsZXIgc3ludGF4IGlzIG1hZGUgdXAgb2YgZXhwcmVzc2lvbnMgKGR1aC4uLikuCi0gICBBdCB0aGUgbG93ZXN0IGxldmVsIHRoZSB2YWx1ZXMgYXJlIG1uZW1vbmljcywgcmVnaXN0ZXIgbmFtZXMsIG51bWJlcnMsIGV0Yy4KLSAgIEFib3ZlIHRoYXQgYXJlIHN1YmV4cHJlc3Npb25zLCBpZiBhbnkgKGFuIGV4YW1wbGUgbWlnaHQgYmUgdGhlCi0gICAiZWZmZWN0aXZlIGFkZHJlc3MiIGluIG02OGsgY3B1cykuICBTdWJleHByZXNzaW9ucyBhcmUgd2lwLgotICAgQXQgdGhlIHNlY29uZCBoaWdoZXN0IGxldmVsIGFyZSB0aGUgaW5zbnMgdGhlbXNlbHZlcy4gIEFib3ZlIHRoYXQgYXJlCi0gICBwc2V1ZG8taW5zbnMsIHN5bnRoZXRpYyBpbnNucywgYW5kIG1hY3JvcywgaWYgYW55LiAgKi8KLQwKLS8qIExvdHMgb2YgY3B1J3MgaGF2ZSBhIGZpeGVkIGluc24gc2l6ZSwgb3Igb25lIHdoaWNoIHJhcmVseSBjaGFuZ2VzLAotICAgYW5kIGl0J3MgZ2VuZXJhbGx5IGVhc2llciB0byBoYW5kbGUgdGhlc2UgYnkgdHJlYXRpbmcgdGhlIGluc24gYXMgYW4KLSAgIGludGVnZXIgdHlwZSwgcmF0aGVyIHRoYW4gYW4gYXJyYXkgb2YgY2hhcmFjdGVycy4gIFNvIHdlIGFsbG93IHRhcmdldHMKLSAgIHRvIGNvbnRyb2wgdGhpcy4gIFdoZW4gYW4gaW50ZWdlciB0eXBlIHRoZSB2YWx1ZSBpcyBpbiBob3N0IGJ5dGUgb3JkZXIsCi0gICB3aGVuIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMgdGhlIHZhbHVlIGlzIGluIHRhcmdldCBieXRlIG9yZGVyLiAgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgQ0dFTl9JTlNOX0lOVDsKLSNpZiBDR0VOX0lOVF9JTlNOX1AKLXR5cGVkZWYgQ0dFTl9JTlNOX0lOVCBDR0VOX0lOU05fQllURVM7Ci10eXBlZGVmIENHRU5fSU5TTl9JTlQgKkNHRU5fSU5TTl9CWVRFU19QVFI7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICpDR0VOX0lOU05fQllURVM7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgKkNHRU5fSU5TTl9CWVRFU19QVFI7Ci0jZW5kaWYKLQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIENHRU5fSU5MSU5FIF9faW5saW5lX18KLSNlbHNlCi0jZGVmaW5lIENHRU5fSU5MSU5FCi0jZW5kaWYKLQotZW51bSBjZ2VuX2VuZGlhbgotewotICBDR0VOX0VORElBTl9VTktOT1dOLAotICBDR0VOX0VORElBTl9MSVRUTEUsCi0gIENHRU5fRU5ESUFOX0JJRwotfTsKLQotLyogRm9yd2FyZCBkZWNsLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9pbnNuIENHRU5fSU5TTjsKLQotLyogT3BhcXVlIHBvaW50ZXIgdmVyc2lvbiBmb3IgdXNlIGJ5IGV4dGVybmFsIHdvcmxkLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9jcHVfZGVzYyAqQ0dFTl9DUFVfREVTQzsKLQwKLS8qIEF0dHJpYnV0ZXMuCi0gICBBdHRyaWJ1dGVzIGFyZSB1c2VkIHRvIGRlc2NyaWJlIHZhcmlvdXMgcmFuZG9tIHRoaW5ncyBhc3NvY2lhdGVkIHdpdGgKLSAgIGFuIG9iamVjdCAoaWZpZWxkLCBoYXJkd2FyZSwgb3BlcmFuZCwgaW5zbiwgd2hhdGV2ZXIpIGFuZCBhcmUgc3BlY2lmaWVkCi0gICBhcyBuYW1lL3ZhbHVlIHBhaXJzLgotICAgSW50ZWdlciBhdHRyaWJ1dGVzIGNvbXB1dGVkIGF0IGNvbXBpbGUgdGltZSBhcmUgY3VycmVudGx5IGFsbCB0aGF0J3MKLSAgIHN1cHBvcnRlZCwgdGhvdWdoIGFkZGluZyBzdHJpbmcgYXR0cmlidXRlcyBhbmQgcnVuLXRpbWUgY29tcHV0YXRpb24gaXMKLSAgIHN0cmFpZ2h0Zm9yd2FyZC4gIEludGVnZXIgYXR0cmlidXRlIHZhbHVlcyBhcmUgYWx3YXlzIGhvc3QgaW50J3MKLSAgIChzaWduZWQgb3IgdW5zaWduZWQpLiAgRm9yIHBvcnRhYmlsaXR5LCB0aGlzIG1lYW5zIDMyIGJpdHMuCi0gICBJbnRlZ2VyIGF0dHJpYnV0ZXMgYXJlIGZ1cnRoZXIgY2F0ZWdvcml6ZWQgYXMgYm9vbGVhbiwgYml0c2V0LCBpbnRlZ2VyLAotICAgYW5kIGVudW0gdHlwZXMuICBCb29sZWFuIGF0dHJpYnV0ZXMgYXBwZWFyIGZyZXF1ZW50bHkgZW5vdWdoIHRoYXQgdGhleSdyZQotICAgcmVjb3JkZWQgaW4gb25lIGhvc3QgaW50LiAgVGhpcyBsaW1pdHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJvb2xlYW4KLSAgIGF0dHJpYnV0ZXMgdG8gMzIsIHRob3VnaCB0aGF0J3MgYSAqbG90KiBvZiBhdHRyaWJ1dGVzLiAgKi8KLQotLyogVHlwZSBvZiBhdHRyaWJ1dGUgdmFsdWVzLiAgKi8KLQotdHlwZWRlZiBpbnQgQ0dFTl9BVFRSX1ZBTFVFX1RZUEU7Ci0KLS8qIFN0cnVjdCB0byByZWNvcmQgYXR0cmlidXRlIGluZm9ybWF0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQm9vbGVhbiBhdHRyaWJ1dGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IGJvb2w7Ci0gIC8qIE5vbi1ib29sZWFuIGludGVnZXIgYXR0cmlidXRlcy4gICovCi0gIENHRU5fQVRUUl9WQUxVRV9UWVBFIG5vbmJvb2xbMV07Ci19IENHRU5fQVRUUjsKLQotLyogRGVmaW5lIGEgc3RydWN0dXJlIG1lbWJlciBmb3IgYXR0cmlidXRlcyB3aXRoIE4gbm9uLWJvb2xlYW4gZW50cmllcy4KLSAgIFRoZXJlIGlzIG5vIG1heGltdW0gbnVtYmVyIG9mIG5vbi1ib29sZWFuIGF0dHJpYnV0ZXMuCi0gICBUaGVyZSBpcyBhIG1heGltdW0gb2YgMzIgYm9vbGVhbiBhdHRyaWJ1dGVzIChzaW5jZSB0aGV5IGFyZSBhbGwgcmVjb3JkZWQKLSAgIGluIG9uZSBob3N0IGludCkuICAqLwotCi0jZGVmaW5lIENHRU5fQVRUUl9UWVBFKG4pIFwKLXN0cnVjdCB7IHVuc2lnbmVkIGludCBib29sOyBcCi0JIENHRU5fQVRUUl9WQUxVRV9UWVBFIG5vbmJvb2xbKG4pID8gKG4pIDogMV07IH0KLQotLyogUmV0dXJuIHRoZSBib29sZWFuIGF0dHJpYnV0ZXMuICAqLwotCi0jZGVmaW5lIENHRU5fQVRUUl9CT09MUyhhKSAoKGEpLT5ib29sKQotCi0vKiBOb24tYm9vbGVhbiBhdHRyaWJ1dGUgbnVtYmVycyBhcmUgb2Zmc2V0IGJ5IHRoaXMgbXVjaC4gICovCi0KLSNkZWZpbmUgQ0dFTl9BVFRSX05CT09MX09GRlNFVCAzMgotCi0vKiBHaXZlbiBhIGJvb2xlYW4gYXR0cmlidXRlIG51bWJlciwgcmV0dXJuIGl0cyBtYXNrLiAgKi8KLQotI2RlZmluZSBDR0VOX0FUVFJfTUFTSyhhdHRyKSAoMSA8PCAoYXR0cikpCi0KLS8qIFJldHVybiB0aGUgdmFsdWUgb2YgYm9vbGVhbiBhdHRyaWJ1dGUgQVRUUiBpbiBBVFRSUy4gICovCi0KLSNkZWZpbmUgQ0dFTl9CT09MX0FUVFIoYXR0cnMsIGF0dHIpICgoQ0dFTl9BVFRSX01BU0sgKGF0dHIpICYgKGF0dHJzKSkgIT0gMCkKLQotLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIEFUVFJfVEFCTEUgZm9yIE9CSi4KLSAgIE9CSiBpcyBhIHBvaW50ZXIgdG8gdGhlIGVudGl0eSB0aGF0IGhhcyB0aGUgYXR0cmlidXRlcwotICAgKD8/PyBub3QgdXNlZCBhdCBwcmVzZW50IGJ1dCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHB1cnBvc2VzIC0gZXZlbnR1YWxseQotICAgdGhlIGdvYWwgaXMgdG8gYWxsb3cgcmVjb3JkaW5nIGF0dHJpYnV0ZXMgaW4gc291cmNlIGZvcm0gYW5kIGNvbXB1dGluZwotICAgdGhlbSBsYXppbHkgYXQgcnVudGltZSwgbm90IHN1cmUgb2YgdGhlIGRldGFpbHMgeWV0KS4gICovCi0KLSNkZWZpbmUgQ0dFTl9BVFRSX1ZBTFVFKG9iaiwgYXR0cl90YWJsZSwgYXR0cikgXAotKCh1bnNpZ25lZCBpbnQpIChhdHRyKSA8IENHRU5fQVRUUl9OQk9PTF9PRkZTRVQgXAotID8gKChDR0VOX0FUVFJfQk9PTFMgKGF0dHJfdGFibGUpICYgQ0dFTl9BVFRSX01BU0sgKGF0dHIpKSAhPSAwKSBcCi0gOiAoKGF0dHJfdGFibGUpLT5ub25ib29sWyhhdHRyKSAtIENHRU5fQVRUUl9OQk9PTF9PRkZTRVRdKSkKLQotLyogQXR0cmlidXRlIG5hbWUvdmFsdWUgdGFibGVzLgotICAgVGhlc2UgYXJlIHVzZWQgdG8gYXNzaXN0IHBhcnNpbmcgb2YgZGVzY3JpcHRpb25zIGF0IHJ1bi10aW1lLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY29uc3QgY2hhciAqIG5hbWU7Ci0gIENHRU5fQVRUUl9WQUxVRV9UWVBFIHZhbHVlOwotfSBDR0VOX0FUVFJfRU5UUlk7Ci0KLS8qIEZvciBlYWNoIGRvbWFpbiAoaWZsZCxodyxvcGVyYW5kLGluc24pLCBsaXN0IG9mIGF0dHJpYnV0ZXMuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBjb25zdCBjaGFyICogbmFtZTsKLSAgY29uc3QgQ0dFTl9BVFRSX0VOVFJZICogZGZhdWx0OwotICBjb25zdCBDR0VOX0FUVFJfRU5UUlkgKiB2YWxzOwotfSBDR0VOX0FUVFJfVEFCTEU7Ci0MCi0vKiBJbnN0cnVjdGlvbiBzZXQgdmFyaWFudHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogRGVmYXVsdCBpbnN0cnVjdGlvbiBzaXplIChpbiBiaXRzKS4KLSAgICAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgd2hlbiBpdCBlbmNvdW50ZXJzIGFuIHVua25vd24gaW5zbi4gICovCi0gIHVuc2lnbmVkIGludCBkZWZhdWx0X2luc25fYml0c2l6ZTsKLQotICAvKiBCYXNlIGluc3RydWN0aW9uIHNpemUgKGluIGJpdHMpLgotICAgICBGb3Igbm9uLUxJVyBjcHVzIHRoaXMgaXMgZ2VuZXJhbGx5IHRoZSBsZW5ndGggb2YgdGhlIHNtYWxsZXN0IGluc24uCi0gICAgIEZvciBMSVcgY3B1cyBpdHMgd2lwICh3b3JrLWluLXByb2dyZXNzKS4gIEZvciB0aGUgbTMyciBpdHMgMzIuICAqLwotICB1bnNpZ25lZCBpbnQgYmFzZV9pbnNuX2JpdHNpemU7Ci0KLSAgLyogTWluaW11bS9tYXhpbXVtIGluc3RydWN0aW9uIHNpemUgKGluIGJpdHMpLiAgKi8KLSAgdW5zaWduZWQgaW50IG1pbl9pbnNuX2JpdHNpemU7Ci0gIHVuc2lnbmVkIGludCBtYXhfaW5zbl9iaXRzaXplOwotfSBDR0VOX0lTQTsKLQotLyogTWFjaGluZSB2YXJpYW50cy4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVGhlIGFyZ3VtZW50IHRvIGJmZF9hcmNoX2luZm8tPnNjYW4uICAqLwotICBjb25zdCBjaGFyICpiZmRfbmFtZTsKLSAgLyogb25lIG9mIGVudW0gbWFjaF9hdHRyICovCi0gIGludCBudW07Ci19IENHRU5fTUFDSDsKLQwKLS8qIFBhcnNlIHJlc3VsdCAoYWxzbyBleHRyYWN0aW9uIHJlc3VsdCkuCi0KLSAgIFRoZSByZXN1bHQgb2YgcGFyc2luZyBhbiBpbnNuIGlzIHN0b3JlZCBoZXJlLgotICAgVG8gZ2VuZXJhdGUgdGhlIGFjdHVhbCBpbnNuLCB0aGlzIGlzIHBhc3NlZCB0byB0aGUgaW5zZXJ0IGhhbmRsZXIuCi0gICBXaGVuIHByaW50aW5nIGFuIGluc24sIHRoZSByZXN1bHQgb2YgZXh0cmFjdGlvbiBpcyBzdG9yZWQgaGVyZS4KLSAgIFRvIHByaW50IHRoZSBpbnNuLCB0aGlzIGlzIHBhc3NlZCB0byB0aGUgcHJpbnQgaGFuZGxlci4KLQotICAgSXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgc28gd2UgZG9uJ3QgZGVmaW5lIGl0IGhlcmUsCi0gICBidXQgd2UgZG8gbmVlZCBhIGZvcndhcmQgZGVjbCBmb3IgdGhlIGhhbmRsZXIgZm5zLgotCi0gICBUaGVyZSBpcyBvbmUgbWVtYmVyIGZvciBlYWNoIHBvc3NpYmxlIGZpZWxkIGluIHRoZSBpbnNuLgotICAgVGhlIHR5cGUgZGVwZW5kcyBvbiB0aGUgZmllbGQuCi0gICBBbHNvIHJlY29yZGVkIGhlcmUgaXMgdGhlIGNvbXB1dGVkIGxlbmd0aCBvZiB0aGUgaW5zbiBmb3IgYXJjaGl0ZWN0dXJlcwotICAgd2hlcmUgaXQgdmFyaWVzLgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9maWVsZHMgQ0dFTl9GSUVMRFM7Ci0KLS8qIFRvdGFsIGxlbmd0aCBvZiB0aGUgaW5zbiwgYXMgcmVjb3JkZWQgaW4gdGhlIGBmaWVsZHMnIHN0cnVjdC4gICovCi0vKiA/Pz8gVGhlIGZpZWxkIGluc2VydCBoYW5kbGVyIGhhcyBsb3RzIG9mIG9wcG9ydHVuaXRpZXMgZm9yIG9wdGltaXphdGlvbgotICAgaWYgaXQgZXZlciBnZXRzIGlubGluZWQuICBPbiBhcmNoaXRlY3R1cmVzIHdoZXJlIGluc25zIGFsbCBoYXZlIHRoZSBzYW1lCi0gICBzaXplLCBtYXkgd2lzaCB0byBkZXRlY3QgdGhhdCBhbmQgbWFrZSB0aGlzIG1hY3JvIGEgY29uc3RhbnQgLSB0byBhbGxvdwotICAgZnVydGhlciBvcHRpbWl6YXRpb25zLiAgKi8KLQotI2RlZmluZSBDR0VOX0ZJRUxEU19CSVRTSVpFKGZpZWxkcykgKChmaWVsZHMpLT5sZW5ndGgpCi0MCi0vKiBFeHRyYWN0aW9uIHN1cHBvcnQgZm9yIHZhcmlhYmxlIGxlbmd0aCBpbnNuIHNldHMuICAqLwotCi0vKiBXaGVuIGRpc2Fzc2VtYmxpbmcgd2UgZG9uJ3Qga25vdyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgYXQgdGhlIHN0YXJ0LgotICAgU28gdGhlIGZpcnN0IENHRU5fQkFTRV9JTlNOX1NJWkUgYnl0ZXMgYXJlIHJlYWQgYXQgdGhlIHN0YXJ0IGFuZCB0aGUgcmVzdAotICAgYXJlIHJlYWQgd2hlbiBuZWVkZWQuICBUaGlzIHN0cnVjdCBjb250cm9scyB0aGlzLiAgSXQgaXMgYmFzaWNhbGx5IHRoZQotICAgZGlzYXNzZW1ibGVfaW5mbyBzdHVmZiwgZXhjZXB0IHRoYXQgd2UgcHJvdmlkZSBhIGNhY2hlIGZvciB2YWx1ZXMgYWxyZWFkeQotICAgcmVhZCAoc2luY2UgYnl0ZXMgY2FuIHR5cGljYWxseSBiZSByZWFkIHNldmVyYWwgdGltZXMgdG8gZmV0Y2ggbXVsdGlwbGUKLSAgIG9wZXJhbmRzIHRoYXQgbWF5IGJlIGluIHRoZW0pLCBhbmQgdGhhdCBleHRyYWN0aW9uIG9mIGZpZWxkcyBpcyBuZWVkZWQKLSAgIGluIGNvbnRleHRzIG90aGVyIHRoYW4gZGlzYXNzZW1ibHkuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIEEgcG9pbnRlciB0byB0aGUgZGlzYXNzZW1ibGVfaW5mbyBzdHJ1Y3QuCi0gICAgIFdlIGRvbid0IHJlcXVpcmUgZGlzLWFzbS5oIHNvIHdlIHVzZSBQVFIgZm9yIHRoZSB0eXBlIGhlcmUuCi0gICAgIElmIE5VTEwsIEJZVEVTIGlzIGZ1bGwgb2YgdmFsaWQgZGF0YSAoVkFMSUQgPT0gLTEpLiAgKi8KLSAgUFRSIGRpc19pbmZvOwotICAvKiBQb2ludHMgdG8gYSB3b3JraW5nIGJ1ZmZlciBvZiBzdWZmaWNpZW50IHNpemUuICAqLwotICB1bnNpZ25lZCBjaGFyICppbnNuX2J5dGVzOwotICAvKiBNYXNrIG9mIGJ5dGVzIHRoYXQgYXJlIHZhbGlkIGluIElOU05fQllURVMuICAqLwotICB1bnNpZ25lZCBpbnQgdmFsaWQ7Ci19IENHRU5fRVhUUkFDVF9JTkZPOwotDAotLyogQXNzb2NpYXRlZCB3aXRoIGVhY2ggaW5zbiBvciBleHByZXNzaW9uIGlzIGEgc2V0IG9mICJoYW5kbGVycyIgZm9yCi0gICBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgbGlrZSBwYXJzaW5nLCBwcmludGluZywgZXRjLiAgVGhlc2UgcmVxdWlyZSBhIGJmZF92bWEKLSAgIHZhbHVlIHRvIGJlIHBhc3NlZCBhcm91bmQgYnV0IHdlIGRvbid0IHdhbnQgYWxsIGFwcGxpY2F0aW9ucyB0byBuZWVkIGJmZC5oLgotICAgU28gdGhpcyBzdHVmZiBpcyBvbmx5IHByb3ZpZGVkIGlmIGJmZC5oIGhhcyBiZWVuIGluY2x1ZGVkLiAgKi8KLQotLyogUGFyc2UgaGFuZGxlci4KLSAgIENEIGlzIGEgY3B1IHRhYmxlIGRlc2NyaXB0b3IuCi0gICBJTlNOIGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCBkZXNjcmliaW5nIHRoZSBpbnNuIGJlaW5nIHBhcnNlZC4KLSAgIFNUUlAgaXMgYSBwb2ludGVyIHRvIGEgcG9pbnRlciB0byB0aGUgdGV4dCBiZWluZyBwYXJzZWQuCi0gICBGSUVMRFMgaXMgYSBwb2ludGVyIHRvIGEgY2dlbl9maWVsZHMgc3RydWN0IGluIHdoaWNoIHRoZSByZXN1bHRzIGFyZSBwbGFjZWQuCi0gICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBzdWNjZXNzZnVsbHkgcGFyc2VkLCAqU1RSUCBpcyB1cGRhdGVkLgotICAgSWYgbm90IGl0IGlzIGxlZnQgYWxvbmUuCi0gICBUaGUgcmVzdWx0IGlzIE5VTEwgaWYgc3VjY2VzcyBvciBhbiBlcnJvciBtZXNzYWdlLiAgKi8KLXR5cGVkZWYgY29uc3QgY2hhciAqIChjZ2VuX3BhcnNlX2ZuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKmluc25fLAotCSAgICAgIGNvbnN0IGNoYXIgKipzdHJwXywgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKLQotLyogSW5zZXJ0IGhhbmRsZXIuCi0gICBDRCBpcyBhIGNwdSB0YWJsZSBkZXNjcmlwdG9yLgotICAgSU5TTiBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgaW5zbiBiZWluZyBwYXJzZWQuCi0gICBGSUVMRFMgaXMgYSBwb2ludGVyIHRvIGEgY2dlbl9maWVsZHMgc3RydWN0IGZyb20gd2hpY2ggdGhlIHZhbHVlcwotICAgYXJlIGZldGNoZWQuCi0gICBJTlNOUCBpcyBhIHBvaW50ZXIgdG8gYSBidWZmZXIgaW4gd2hpY2ggdG8gcGxhY2UgdGhlIGluc24uCi0gICBQQyBpcyB0aGUgcGMgdmFsdWUgb2YgdGhlIGluc24uCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpZiBzdWNjZXNzLiAgKi8KLQotI2lmZGVmIEJGRF9WRVJTSU9OCi10eXBlZGVmIGNvbnN0IGNoYXIgKiAoY2dlbl9pbnNlcnRfZm4pCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqaW5zbl8sCi0JICAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIENHRU5fSU5TTl9CWVRFU19QVFIgaW5zbnBfLAotCSAgICAgIGJmZF92bWEgcGNfKSk7Ci0jZWxzZQotdHlwZWRlZiBjb25zdCBjaGFyICogKGNnZW5faW5zZXJ0X2ZuKSAoKTsKLSNlbmRpZgotCi0vKiBFeHRyYWN0IGhhbmRsZXIuCi0gICBDRCBpcyBhIGNwdSB0YWJsZSBkZXNjcmlwdG9yLgotICAgSU5TTiBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgaW5zbiBiZWluZyBwYXJzZWQuCi0gICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCBjb250cm9sbGluZyBleHRyYWN0aW9uCi0gICAob25seSB1c2VkIGZvciB2YXJpYWJsZSBsZW5ndGggaW5zbnMpLgotICAgRVhfSU5GTyBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZm9yIGNvbnRyb2xsaW5nIHJlYWRpbmcgb2YgZnVydGhlcgotICAgYnl0ZXMgZm9yIHRoZSBpbnNuLgotICAgQkFTRV9JTlNOIGlzIHRoZSBmaXJzdCBDR0VOX0JBU0VfSU5TTl9TSVpFIGJ5dGVzIChob3N0IG9yZGVyKS4KLSAgIEZJRUxEUyBpcyBhIHBvaW50ZXIgdG8gYSBjZ2VuX2ZpZWxkcyBzdHJ1Y3QgaW4gd2hpY2ggdGhlIHJlc3VsdHMgYXJlIHBsYWNlZC4KLSAgIFBDIGlzIHRoZSBwYyB2YWx1ZSBvZiB0aGUgaW5zbi4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzIG9yIHplcm8gaWYgbm90IHJlY29nbml6ZWQuICAqLwotCi0jaWZkZWYgQkZEX1ZFUlNJT04KLXR5cGVkZWYgaW50IChjZ2VuX2V4dHJhY3RfZm4pCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqaW5zbl8sCi0JICAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm9fLCBDR0VOX0lOU05fSU5UIGJhc2VfaW5zbl8sCi0JICAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGJmZF92bWEgcGNfKSk7Ci0jZWxzZQotdHlwZWRlZiBpbnQgKGNnZW5fZXh0cmFjdF9mbikgKCk7Ci0jZW5kaWYKLQotLyogUHJpbnQgaGFuZGxlci4KLSAgIENEIGlzIGEgY3B1IHRhYmxlIGRlc2NyaXB0b3IuCi0gICBJTkZPIGlzIGEgcG9pbnRlciB0byB0aGUgZGlzYXNzZW1ibHkgaW5mby4KLSAgIEVnOiBkaXNhc3NlbWJsZV9pbmZvLiAgSXQncyBkZWZpbmVkIGFzIGBQVFInIHNvIHRoaXMgZmlsZSBjYW4gYmUgaW5jbHVkZWQKLSAgIHdpdGhvdXQgZGlzLWFzbS5oLgotICAgSU5TTiBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZGVzY3JpYmluZyB0aGUgaW5zbiBiZWluZyBwcmludGVkLgotICAgRklFTERTIGlzIGEgcG9pbnRlciB0byBhIGNnZW5fZmllbGRzIHN0cnVjdC4KLSAgIFBDIGlzIHRoZSBwYyB2YWx1ZSBvZiB0aGUgaW5zbi4KLSAgIExFTiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBpbnNuLCBpbiBiaXRzLiAgKi8KLQotI2lmZGVmIEJGRF9WRVJTSU9OCi10eXBlZGVmIHZvaWQgKGNnZW5fcHJpbnRfZm4pCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiBpbmZvXywgY29uc3QgQ0dFTl9JTlNOICppbnNuXywKLQkgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzXywgYmZkX3ZtYSBwY18sIGludCBsZW5fKSk7Ci0jZWxzZQotdHlwZWRlZiB2b2lkIChjZ2VuX3ByaW50X2ZuKSAoKTsKLSNlbmRpZgotCi0vKiBQYXJzZS9pbnNlcnQvZXh0cmFjdC9wcmludCBoYW5kbGVycy4KLQotICAgSW5kaWNlcyBpbnRvIHRoZSBoYW5kbGVyIHRhYmxlcy4KLSAgIFdlIGNvdWxkIHVzZSBwb2ludGVycyBoZXJlIGluc3RlYWQsIGJ1dCA5MCUgb2YgdGhlbSBhcmUgZ2VuZXJhbGx5IGlkZW50aWNhbAotICAgYW5kIHRoYXQncyBhIGxvdCBvZiByZWR1bmRhbnQgZGF0YS4gIE1ha2luZyB0aGVzZSB1bnNpZ25lZCBjaGFyIGluZGljZXMKLSAgIGludG8gdGFibGVzIG9mIHBvaW50ZXJzIHNhdmVzIGEgYml0IG9mIHNwYWNlLgotICAgVXNpbmcgaW5kaWNlcyBhbHNvIGtlZXBzIGFzc2VtYmxlciBjb2RlIG91dCBvZiB0aGUgZGlzYXNzZW1ibGVyIGFuZAotICAgdmljZSB2ZXJzYS4gICovCi0KLXN0cnVjdCBjZ2VuX29wY29kZV9oYW5kbGVyCi17Ci0gIHVuc2lnbmVkIGNoYXIgcGFyc2UsIGluc2VydCwgZXh0cmFjdCwgcHJpbnQ7Ci19OwotDAotLyogQXNzZW1ibGVyIGludGVyZmFjZS4KLQotICAgVGhlIGludGVyZmFjZSB0byB0aGUgYXNzZW1ibGVyIGlzIGludGVuZGVkIHRvIGJlIGNsZWFuIGluIHRoZSBzZW5zZSB0aGF0Ci0gICBsaWJvcGNvZGVzLmEgaXMgYSBzdGFuZGFsb25lIGVudGl0eSBhbmQgY291bGQgYmUgdXNlZCB3aXRoIGFueSBhc3NlbWJsZXIuCi0gICBOb3QgdGhhdCBvbmUgd291bGQgbmVjZXNzYXJpbHkgd2FudCB0byBkbyB0aGF0IGJ1dCByYXRoZXIgdGhhdCBpdCBoZWxwcwotICAga2VlcCBhIGNsZWFuIGludGVyZmFjZS4gIFRoZSBpbnRlcmZhY2Ugd2lsbCBvYnZpb3VzbHkgYmUgc2xhbnRlZCB0b3dhcmRzCi0gICBHQVMsIGJ1dCBhdCBsZWFzdCBpdCdzIGEgc3RhcnQuCi0gICA/Pz8gTm90ZSB0aGF0IG9uZSBwb3NzaWJsZSB1c2VyIG9mIHRoZSBhc3NlbWJsZXIgYmVzaWRlcyBHQVMgaXMgR0RCLgotCi0gICBQYXJzaW5nIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGFzc2VtYmxlciB3aGljaCBjYWxscwotICAgQ0dFTl9TWU0gKGFzc2VtYmxlX2luc24pLiAgSWYgaXQgY2FuIHBhcnNlIGFuZCBidWlsZCB0aGUgZW50aXJlIGluc24KLSAgIGl0IGRvZXNuJ3QgY2FsbCBiYWNrIHRvIHRoZSBhc3NlbWJsZXIuICBJZiBpdCBuZWVkcy93YW50cyB0byBjYWxsIGJhY2sKLSAgIHRvIHRoZSBhc3NlbWJsZXIsIGNnZW5fcGFyc2Vfb3BlcmFuZF9mbiBpcyBjYWxsZWQgd2hpY2ggY2FuIGVpdGhlcgotCi0gICAtIHJldHVybiBhIG51bWJlciB0byBiZSBpbnNlcnRlZCBpbiB0aGUgaW5zbgotICAgLSByZXR1cm4gYSAicmVnaXN0ZXIiIHZhbHVlIHRvIGJlIGluc2VydGVkCi0gICAgICh0aGUgcmVnaXN0ZXIgbWlnaHQgbm90IGJlIGEgcmVnaXN0ZXIgcGVyIHBlKQotICAgLSBxdWV1ZSB0aGUgYXJndW1lbnQgYW5kIHJldHVybiBhIG1hcmtlciBzYXlpbmcgdGhlIGV4cHJlc3Npb24gaGFzIGJlZW4KLSAgICAgcXVldWVkIChlZzogYSBmaXgtdXApCi0gICAtIHJldHVybiBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhlIGV4cHJlc3Npb24gd2Fzbid0IHJlY29nbml6YWJsZQotCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBmb3Igc3VjY2Vzcy4KLSAgIFRoZSBwYXJzZWQgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBiZmRfdm1hICouICAqLwotCi0vKiBWYWx1ZXMgZm9yIGluZGljYXRpbmcgd2hhdCB0aGUgY2FsbGVyIHdhbnRzLiAgKi8KLQotZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfdHlwZQotewotICBDR0VOX1BBUlNFX09QRVJBTkRfSU5JVCwKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOVEVHRVIsCi0gIENHRU5fUEFSU0VfT1BFUkFORF9BRERSRVNTCi19OwotCi0vKiBWYWx1ZXMgZm9yIGluZGljYXRpbmcgd2hhdCB3YXMgcGFyc2VkLiAgKi8KLQotZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0Ci17Ci0gIENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSLAotICBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX1JFR0lTVEVSLAotICBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX1FVRVVFRCwKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9FUlJPUgotfTsKLQotI2lmZGVmIEJGRF9WRVJTSU9OIC8qIERvbid0IHJlcXVpcmUgYmZkLmggdW5uZWNlc3NhcmlseS4gICovCi10eXBlZGVmIGNvbnN0IGNoYXIgKiAoY2dlbl9wYXJzZV9vcGVyYW5kX2ZuKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLAotCSAgICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3R5cGUsIGNvbnN0IGNoYXIgKiosIGludCwgaW50LAotCSAgICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqLCBiZmRfdm1hICopKTsKLSNlbHNlCi10eXBlZGVmIGNvbnN0IGNoYXIgKiAoY2dlbl9wYXJzZV9vcGVyYW5kX2ZuKSAoKTsKLSNlbmRpZgotCi0vKiBTZXQgdGhlIGNnZW5fcGFyc2Vfb3BlcmFuZF9mbiBjYWxsYmFjay4gICovCi0KLWV4dGVybiB2b2lkIGNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuKSk7Ci0KLS8qIENhbGxlZCBiZWZvcmUgdHJ5aW5nIHRvIG1hdGNoIGEgdGFibGUgZW50cnkgd2l0aCB0aGUgaW5zbi4gICovCi0KLWV4dGVybiB2b2lkIGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLQwKLS8qIE9wZXJhbmQgdmFsdWVzIChrZXl3b3JkcywgaW50ZWdlcnMsIHN5bWJvbHMsIGV0Yy4pICAqLwotCi0vKiBUeXBlcyBvZiBhc3NlbWJsZXIgZWxlbWVudHMuICAqLwotCi1lbnVtIGNnZW5fYXNtX3R5cGUKLXsKLSAgQ0dFTl9BU01fTk9ORSwgQ0dFTl9BU01fS0VZV09SRCwgQ0dFTl9BU01fTUFYCi19OwotCi0jaWZuZGVmIENHRU5fQVJDSAotZW51bSBjZ2VuX2h3X3R5cGUgeyBDR0VOX0hXX01BWCB9OwotI2VuZGlmCi0KLS8qIExpc3Qgb2YgaGFyZHdhcmUgZWxlbWVudHMuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBjaGFyICpuYW1lOwotICBlbnVtIGNnZW5faHdfdHlwZSB0eXBlOwotICAvKiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gZXhhbXBsZSB3aGVyZSBib3RoIGluZGV4IHNwZWNzIGFuZCB2YWx1ZSBzcGVjcwotICAgICBhcmUgcmVxdWlyZWQsIHNvIGZvciBub3cgYm90aCBhcmUgY2x1bXBlZCB1bmRlciAiYXNtX2RhdGEiLiAgKi8KLSAgZW51bSBjZ2VuX2FzbV90eXBlIGFzbV90eXBlOwotICBQVFIgYXNtX2RhdGE7Ci0jaWZuZGVmIENHRU5fSFdfTkJPT0xfQVRUUlMKLSNkZWZpbmUgQ0dFTl9IV19OQk9PTF9BVFRSUyAxCi0jZW5kaWYKLSAgQ0dFTl9BVFRSX1RZUEUgKENHRU5fSFdfTkJPT0xfQVRUUlMpIGF0dHJzOwotI2RlZmluZSBDR0VOX0hXX0FUVFJTKGh3KSAoJihodyktPmF0dHJzKQotfSBDR0VOX0hXX0VOVFJZOwotCi0vKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gSFcuICAqLwotCi0jZGVmaW5lIENHRU5fSFdfQVRUUl9WQUxVRShodywgYXR0cikgXAotQ0dFTl9BVFRSX1ZBTFVFICgoaHcpLCBDR0VOX0hXX0FUVFJTIChodyksIChhdHRyKSkKLQotLyogVGFibGUgb2YgaGFyZHdhcmUgZWxlbWVudHMgZm9yIHNlbGVjdGVkIG1hY2gsIGNvbXB1dGVkIGF0IHJ1bnRpbWUuCi0gICBlbnVtIGNnZW5faHdfdHlwZSBpcyBhbiBpbmRleCBpbnRvIHRoaXMgdGFibGUgKHNwZWNpZmljYWxseSBgZW50cmllcycpLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBQb2ludGVyIHRvIG51bGwgdGVybWluYXRlZCB0YWJsZSBvZiBhbGwgY29tcGlsZWQgaW4gZW50cmllcy4gICovCi0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKmluaXRfZW50cmllczsKLSAgdW5zaWduZWQgaW50IGVudHJ5X3NpemU7IC8qIHNpbmNlIHRoZSBhdHRyaWJ1dGUgbWVtYmVyIGlzIHZhcmlhYmxlIHNpemVkICovCi0gIC8qIEFycmF5IG9mIGFsbCBlbnRyaWVzLCBpbml0aWFsIGFuZCBydW4tdGltZSBhZGRlZC4gICovCi0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKiplbnRyaWVzOwotICAvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYGVudHJpZXMnLiAgKi8KLSAgdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOwotICAvKiBGb3Igbm93LCB4cmVhbGxvYyBpcyBjYWxsZWQgZWFjaCB0aW1lIGEgbmV3IGVudHJ5IGlzIGFkZGVkIGF0IHJ1bnRpbWUuCi0gICAgID8/PyBNYXkgd2lzaCB0byBrZWVwIHRyYWNrIG9mIHNvbWUgc2xvcCB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBjYWxscyB0bwotICAgICB4cmVhbGxvYywgZXhjZXB0IHRoYXQgdGhlcmUncyB1bmxpa2VseSB0byBiZSBtYW55IGFuZCBub3QgZXhwZWN0ZWQgdG8gYmUKLSAgICAgaW4gc3BlZWQgY3JpdGljYWwgY29kZS4gICovCi19IENHRU5fSFdfVEFCTEU7Ci0KLWV4dGVybiBjb25zdCBDR0VOX0hXX0VOVFJZICogY2dlbl9od19sb29rdXBfYnlfbmFtZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBDR0VOX0hXX0VOVFJZICogY2dlbl9od19sb29rdXBfYnlfbnVtCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCkpOwotCi0vKiBUaGlzIHN0cnVjdCBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoaW5ncyBsaWtlIHJlZ2lzdGVyIG5hbWVzLCBldGMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2tleXdvcmRfZW50cnkKLXsKLSAgLyogTmFtZSAoYXMgaW4gcmVnaXN0ZXIgbmFtZSkuICAqLwotICBjaGFyICogbmFtZTsKLQotICAvKiBWYWx1ZSAoYXMgaW4gcmVnaXN0ZXIgbnVtYmVyKS4KLSAgICAgVGhlIHZhbHVlIGNhbm5vdCBiZSAtMSBhcyB0aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgIm5vdCBmb3VuZCIuCi0gICAgIElERUE6IEhhdmUgIkZVTkNUSU9OIiBhdHRyaWJ1dGU/IFtmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZmV0Y2ggdmFsdWVdLiAgKi8KLSAgaW50IHZhbHVlOwotCi0gIC8qIEF0dHJpYnV0ZXMuCi0gICAgIFRoaXMgc2hvdWxkLCBidXQgdGVjaG5pY2FsbHkgbmVlZG4ndCwgYXBwZWFyIGxhc3QuICBJdCBpcyBhIHZhcmlhYmxlIHNpemVkCi0gICAgIGFycmF5IGluIHRoYXQgb25lIGFyY2hpdGVjdHVyZSBtYXkgaGF2ZSAxIG5vbmJvb2wgYXR0cmlidXRlIGFuZCBhbm90aGVyCi0gICAgIG1heSBoYXZlIG1vcmUuICBIYXZpbmcgdGhpcyBsYXN0IG1lYW5zIHRoZSBub24tYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvZGUKLSAgICAgbmVlZG4ndCBjYXJlLiAgVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZWNvcmQKLSAgICAgYXR0cmlidXRlcyBpbiB0aGVpciByYXcgZm9ybSwgZXZhbHVhdGUgdGhlbSBhdCBydW4tdGltZSwgYW5kIGNhY2hlIHRoZQotICAgICB2YWx1ZXMsIHNvIHRoaXMgd29ycnkgd2lsbCBnbyBhd2F5IGFueXdheS4gICovCi0gIC8qID8/PyBNb3ZpbmcgdGhpcyBsYXN0IHNob3VsZCBiZSBkb25lIGJ5IHRyZWF0aW5nIGtleXdvcmRzIGxpa2UgaW5zbiBsaXN0cwotICAgICBhbmQgbW92aW5nIHRoZSBgbmV4dCcgZmllbGRzIGludG8gYSBDR0VOX0tFWVdPUkRfTElTVCBzdHJ1Y3QuICAqLwotICAvKiBGSVhNRTogTm90IHVzZWQgeWV0LiAgKi8KLSNpZm5kZWYgQ0dFTl9LRVlXT1JEX05CT09MX0FUVFJTCi0jZGVmaW5lIENHRU5fS0VZV09SRF9OQk9PTF9BVFRSUyAxCi0jZW5kaWYKLSAgQ0dFTl9BVFRSX1RZUEUgKENHRU5fS0VZV09SRF9OQk9PTF9BVFRSUykgYXR0cnM7Ci0KLSAgLyogPz8/IFB1dHRpbmcgdGhlc2UgaGVyZSBtZWFucyBjb21waWxlZCBpbiBlbnRyaWVzIGNhbid0IGJlIGNvbnN0LgotICAgICBOb3QgYSByZWFsbHkgYmlnIGRlYWwsIGJ1dCBzb21ldGhpbmcgdG8gY29uc2lkZXIuICAqLwotICAvKiBOZXh0IG5hbWUgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBjZ2VuX2tleXdvcmRfZW50cnkgKm5leHRfbmFtZTsKLSAgLyogTmV4dCB2YWx1ZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgc3RydWN0IGNnZW5fa2V5d29yZF9lbnRyeSAqbmV4dF92YWx1ZTsKLX0gQ0dFTl9LRVlXT1JEX0VOVFJZOwotCi0vKiBUb3AgbGV2ZWwgc3RydWN0IGZvciBkZXNjcmliaW5nIGEgc2V0IG9mIHJlbGF0ZWQga2V5d29yZHMKLSAgIChlLmcuIHJlZ2lzdGVyIG5hbWVzKS4KLQotICAgVGhpcyBzdHJ1Y3Qgc3VwcG9ydHMgcnVuLXRpbWUgZW50cnkgb2YgbmV3IHZhbHVlcywgYW5kIGhhc2hlZCBsb29rdXBzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9rZXl3b3JkCi17Ci0gIC8qIFBvaW50ZXIgdG8gaW5pdGlhbCBbY29tcGlsZWQgaW5dIHZhbHVlcy4gICovCi0gIENHRU5fS0VZV09SRF9FTlRSWSAqaW5pdF9lbnRyaWVzOwotICAKLSAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gYGluaXRfZW50cmllcycuICAqLwotICB1bnNpZ25lZCBpbnQgbnVtX2luaXRfZW50cmllczsKLSAgCi0gIC8qIEhhc2ggdGFibGUgdXNlZCBmb3IgbmFtZSBsb29rdXAuICAqLwotICBDR0VOX0tFWVdPUkRfRU5UUlkgKipuYW1lX2hhc2hfdGFibGU7Ci0gIAotICAvKiBIYXNoIHRhYmxlIHVzZWQgZm9yIHZhbHVlIGxvb2t1cC4gICovCi0gIENHRU5fS0VZV09SRF9FTlRSWSAqKnZhbHVlX2hhc2hfdGFibGU7Ci0gIAotICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaGFzaF90YWJsZXMuICAqLwotICB1bnNpZ25lZCBpbnQgaGFzaF90YWJsZV9zaXplOwotICAKLSAgLyogUG9pbnRlciB0byBudWxsIGtleXdvcmQgIiIgZW50cnkgaWYgcHJlc2VudC4gICovCi0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqbnVsbF9lbnRyeTsKLX0gQ0dFTl9LRVlXT1JEOwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCBmb3Igc2VhcmNoaW5nLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVGFibGUgYmVpbmcgc2VhcmNoZWQuICAqLwotICBjb25zdCBDR0VOX0tFWVdPUkQgKnRhYmxlOwotICAKLSAgLyogU3BlY2lmaWNhdGlvbiBvZiB3aGF0IGlzIGJlaW5nIHNlYXJjaGVkIGZvci4gICovCi0gIGNvbnN0IGNoYXIgKnNwZWM7Ci0gIAotICAvKiBDdXJyZW50IGluZGV4IGluIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgY3VycmVudF9oYXNoOwotICAKLSAgLyogQ3VycmVudCBlbGVtZW50IGluIGN1cnJlbnQgaGFzaCBjaGFpbi4gICovCi0gIENHRU5fS0VZV09SRF9FTlRSWSAqY3VycmVudF9lbnRyeTsKLX0gQ0dFTl9LRVlXT1JEX1NFQVJDSDsKLQotLyogTG9va3VwIGEga2V5d29yZCBmcm9tIGl0cyBuYW1lLiAgKi8KLQotY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICpjZ2VuX2tleXdvcmRfbG9va3VwX25hbWUKLSAgUEFSQU1TICgoQ0dFTl9LRVlXT1JEICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBMb29rdXAgYSBrZXl3b3JkIGZyb20gaXRzIHZhbHVlLiAgKi8KLQotY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICpjZ2VuX2tleXdvcmRfbG9va3VwX3ZhbHVlCi0gIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqLCBpbnQpKTsKLQotLyogQWRkIGEga2V5d29yZC4gICovCi0KLXZvaWQgY2dlbl9rZXl3b3JkX2FkZCBQQVJBTVMgKChDR0VOX0tFWVdPUkQgKiwgQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKLQotLyogS2V5d29yZCBzZWFyY2hpbmcuCi0gICBUaGlzIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGV2ZXJ5IGtleXdvcmQsIG9yIGEgc3Vic2V0LiAgKi8KLQotQ0dFTl9LRVlXT1JEX1NFQVJDSCBjZ2VuX2tleXdvcmRfc2VhcmNoX2luaXQKLSAgUEFSQU1TICgoQ0dFTl9LRVlXT1JEICosIGNvbnN0IGNoYXIgKikpOwotY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICpjZ2VuX2tleXdvcmRfc2VhcmNoX25leHQKLSAgUEFSQU1TICgoQ0dFTl9LRVlXT1JEX1NFQVJDSCAqKSk7Ci0KLS8qIE9wZXJhbmQgdmFsdWUgc3VwcG9ydCByb3V0aW5lcy4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpjZ2VuX3BhcnNlX2tleXdvcmQKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKiwgQ0dFTl9LRVlXT1JEICosIGxvbmcgKikpOwotI2lmZGVmIEJGRF9WRVJTSU9OIC8qIERvbid0IHJlcXVpcmUgYmZkLmggdW5uZWNlc3NhcmlseS4gICovCi1leHRlcm4gY29uc3QgY2hhciAqY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlcgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICoqLCBpbnQsIGxvbmcgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlcgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICoqLCBpbnQsIHVuc2lnbmVkIGxvbmcgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fcGFyc2VfYWRkcmVzcwotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICoqLCBpbnQsIGludCwKLQkgICAgICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiwgYmZkX3ZtYSAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqY2dlbl92YWxpZGF0ZV9zaWduZWRfaW50ZWdlcgotICAgICBQQVJBTVMgKChsb25nLCBsb25nLCBsb25nKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqY2dlbl92YWxpZGF0ZV91bnNpZ25lZF9pbnRlZ2VyCi0gICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLSNlbmRpZgotDAotLyogT3BlcmFuZCBtb2Rlcy4gICovCi0KLS8qID8/PyBUaGlzIGR1cGxpY2F0ZXMgdGhlIHZhbHVlcyBpbiBhcmNoLmguICBSZXZpc2l0LgotICAgVGhlc2UgaG93ZXZlciBuZWVkIHRoZSBDR0VOXyBwcmVmaXggW2FzIGRvZXMgZXZlcnl0aGluZyBpbiB0aGlzIGZpbGVdLiAgKi8KLS8qID8/PyBUYXJnZXRzIG1heSBuZWVkIHRvIGFkZCB0aGVpciBvd24gbW9kZXMgc28gd2UgbWF5IHdpc2ggdG8gbW92ZSB0aGlzCi0gICB0byA8YXJjaD4tb3BjLmgsIG9yIGFkZCBhIGhvb2suICAqLwotCi1lbnVtIGNnZW5fbW9kZSB7Ci0gIENHRU5fTU9ERV9WT0lELCAvKiA/Pz8gcmVuYW1lIHNpbXVsYXRvcidzIFZNIHRvIFZPSUQ/ICovCi0gIENHRU5fTU9ERV9CSSwgQ0dFTl9NT0RFX1FJLCBDR0VOX01PREVfSEksIENHRU5fTU9ERV9TSSwgQ0dFTl9NT0RFX0RJLAotICBDR0VOX01PREVfVUJJLCBDR0VOX01PREVfVVFJLCBDR0VOX01PREVfVUhJLCBDR0VOX01PREVfVVNJLCBDR0VOX01PREVfVURJLAotICBDR0VOX01PREVfU0YsIENHRU5fTU9ERV9ERiwgQ0dFTl9NT0RFX1hGLCBDR0VOX01PREVfVEYsCi0gIENHRU5fTU9ERV9UQVJHRVRfTUFYLAotICBDR0VOX01PREVfSU5ULCBDR0VOX01PREVfVUlOVCwKLSAgQ0dFTl9NT0RFX01BWAotfTsKLQotLyogRklYTUU6IFVudGlsIHNpbXVsYXRvciBpcyB1cGRhdGVkLiAgKi8KLQotI2RlZmluZSBDR0VOX01PREVfVk0gQ0dFTl9NT0RFX1ZPSUQKLQwKLS8qIE9wZXJhbmRzLiAgKi8KLQotI2lmbmRlZiBDR0VOX0FSQ0gKLWVudW0gY2dlbl9vcGVyYW5kX3R5cGUgeyBDR0VOX09QRVJBTkRfTUFYIH07Ci0jZW5kaWYKLQotLyogIm5pbCIgaW5kaWNhdG9yIGZvciB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZSAqLwotI2RlZmluZSBDR0VOX09QRVJBTkRfTklMIENHRU5fT1BFUkFORF9NQVgKLQotLyogVGhpcyBzdHJ1Y3QgZGVmaW5lcyBlYWNoIGVudHJ5IGluIHRoZSBvcGVyYW5kIHRhYmxlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogTmFtZSBhcyBpdCBhcHBlYXJzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KLSAgY2hhciAqbmFtZTsKLQotICAvKiBPcGVyYW5kIHR5cGUuICAqLwotICBlbnVtIGNnZW5fb3BlcmFuZF90eXBlIHR5cGU7Ci0KLSAgLyogVGhlIGhhcmR3YXJlIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3BlcmFuZC4gICovCi0gIGVudW0gY2dlbl9od190eXBlIGh3X3R5cGU7Ci0KLSAgLyogRklYTUU6IFdlIGRvbid0IHlldCByZWNvcmQgaWZpZWxkIGRlZmluaXRpb25zLCB3aGljaCB3ZSBzaG91bGQuCi0gICAgIFdoZW4gd2UgZG8gaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBkZWxldGUgc3RhcnQvbGVuZ3RoIChzaW5jZSB0aGV5IHdpbGwKLSAgICAgYmUgZHVwbGljYXRlZCBpbiB0aGUgaWZpZWxkJ3MgZGVmaW5pdGlvbikgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIGEKLSAgICAgcG9pbnRlciB0byB0aGUgaWZpZWxkIGVudHJ5LiAgKi8KLQotICAvKiBCaXQgcG9zaXRpb24uCi0gICAgIFRoaXMgaXMganVzdCBhIGhpbnQsIGFuZCBtYXkgYmUgdW51c2VkIGluIG1vcmUgY29tcGxleCBvcGVyYW5kcy4KLSAgICAgTWF5IGJlIHVudXNlZCBmb3IgYSBtb2RpZmllci4gICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhcnQ7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLgotICAgICBUaGlzIGlzIGp1c3QgYSBoaW50LCBhbmQgbWF5IGJlIHVudXNlZCBpbiBtb3JlIGNvbXBsZXggb3BlcmFuZHMuCi0gICAgIE1heSBiZSB1bnVzZWQgZm9yIGEgbW9kaWZpZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIGxlbmd0aDsKLQotI2lmIDAgLyogPz8/IEludGVyZXN0aW5nIGlkZWEgYnV0IHJlbG9jcyB0ZW5kIHRvIGdldCB0b28gY29tcGxpY2F0ZWQsCi0JIGFuZCBBQkkgZGVwZW5kZW50LCBmb3Igc2ltcGxlIHRhYmxlIGxvb2t1cHMgdG8gd29yay4gICovCi0gIC8qIElkZWFsbHkgdGhpcyB3b3VsZCBiZSB0aGUgaW50ZXJuYWwgKGV4dGVybmFsPykgcmVsb2MgdHlwZS4gICovCi0gIGludCByZWxvY190eXBlOwotI2VuZGlmCi0KLSAgLyogQXR0cmlidXRlcy4KLSAgICAgVGhpcyBzaG91bGQsIGJ1dCB0ZWNobmljYWxseSBuZWVkbid0LCBhcHBlYXIgbGFzdC4gIEl0IGlzIGEgdmFyaWFibGUgc2l6ZWQKLSAgICAgYXJyYXkgaW4gdGhhdCBvbmUgYXJjaGl0ZWN0dXJlIG1heSBoYXZlIDEgbm9uYm9vbCBhdHRyaWJ1dGUgYW5kIGFub3RoZXIKLSAgICAgbWF5IGhhdmUgbW9yZS4gIEhhdmluZyB0aGlzIGxhc3QgbWVhbnMgdGhlIG5vbi1hcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29kZQotICAgICBuZWVkbid0IGNhcmUsIG5vdyBvciB0b21vcnJvdy4gIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVjb3JkCi0gICAgIGF0dHJpYnV0ZXMgaW4gdGhlaXIgcmF3IGZvcm0sIGV2YWx1YXRlIHRoZW0gYXQgcnVuLXRpbWUsIGFuZCBjYWNoZSB0aGUKLSAgICAgdmFsdWVzLCBzbyB0aGlzIHdvcnJ5IHdpbGwgZ28gYXdheSBhbnl3YXkuICAqLwotI2lmbmRlZiBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMKLSNkZWZpbmUgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTIDEKLSNlbmRpZgotICBDR0VOX0FUVFJfVFlQRSAoQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTKSBhdHRyczsKLSNkZWZpbmUgQ0dFTl9PUEVSQU5EX0FUVFJTKG9wZXJhbmQpICgmKG9wZXJhbmQpLT5hdHRycykKLX0gQ0dFTl9PUEVSQU5EOwotCi0vKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gT1BFUkFORC4gICovCi0KLSNkZWZpbmUgQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUob3BlcmFuZCwgYXR0cikgXAotQ0dFTl9BVFRSX1ZBTFVFICgob3BlcmFuZCksIENHRU5fT1BFUkFORF9BVFRSUyAob3BlcmFuZCksIChhdHRyKSkKLQotLyogVGFibGUgb2Ygb3BlcmFuZHMgZm9yIHNlbGVjdGVkIG1hY2gvaXNhLCBjb21wdXRlZCBhdCBydW50aW1lLgotICAgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSBpcyBhbiBpbmRleCBpbnRvIHRoaXMgdGFibGUgKHNwZWNpZmljYWxseQotICAgYGVudHJpZXMnKS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogUG9pbnRlciB0byBudWxsIHRlcm1pbmF0ZWQgdGFibGUgb2YgYWxsIGNvbXBpbGVkIGluIGVudHJpZXMuICAqLwotICBjb25zdCBDR0VOX09QRVJBTkQgKmluaXRfZW50cmllczsKLSAgdW5zaWduZWQgaW50IGVudHJ5X3NpemU7IC8qIHNpbmNlIHRoZSBhdHRyaWJ1dGUgbWVtYmVyIGlzIHZhcmlhYmxlIHNpemVkICovCi0gIC8qIEFycmF5IG9mIGFsbCBlbnRyaWVzLCBpbml0aWFsIGFuZCBydW4tdGltZSBhZGRlZC4gICovCi0gIGNvbnN0IENHRU5fT1BFUkFORCAqKmVudHJpZXM7Ci0gIC8qIE51bWJlciBvZiBlbGVtZW50cyBpbiBgZW50cmllcycuICAqLwotICB1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7Ci0gIC8qIEZvciBub3csIHhyZWFsbG9jIGlzIGNhbGxlZCBlYWNoIHRpbWUgYSBuZXcgZW50cnkgaXMgYWRkZWQgYXQgcnVudGltZS4KLSAgICAgPz8/IE1heSB3aXNoIHRvIGtlZXAgdHJhY2sgb2Ygc29tZSBzbG9wIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvCi0gICAgIHhyZWFsbG9jLCBleGNlcHQgdGhhdCB0aGVyZSdzIHVubGlrZWx5IHRvIGJlIG1hbnkgYW5kIG5vdCBleHBlY3RlZCB0byBiZQotICAgICBpbiBzcGVlZCBjcml0aWNhbCBjb2RlLiAgKi8KLX0gQ0dFTl9PUEVSQU5EX1RBQkxFOwotCi1leHRlcm4gY29uc3QgQ0dFTl9PUEVSQU5EICogY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9uYW1lCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IENHRU5fT1BFUkFORCAqIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCkpOwotDAotLyogSW5zdHJ1Y3Rpb24gb3BlcmFuZCBpbnN0YW5jZXMuCi0KLSAgIEZvciBlYWNoIGluc3RydWN0aW9uLCBhIGxpc3Qgb2YgdGhlIGhhcmR3YXJlIGVsZW1lbnRzIHRoYXQgYXJlIHJlYWQgYW5kCi0gICB3cml0dGVuIGFyZSByZWNvcmRlZC4gICovCi0KLS8qIFRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZS4gICovCi0KLWVudW0gY2dlbl9vcGluc3RfdHlwZSB7Ci0gIC8qIEVuZCBvZiB0YWJsZSBtYXJrZXIuICAqLwotICBDR0VOX09QSU5TVF9FTkQgPSAwLAotICBDR0VOX09QSU5TVF9JTlBVVCwgQ0dFTl9PUElOU1RfT1VUUFVUCi19OwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBJbnB1dCBvciBvdXRwdXQgaW5kaWNhdG9yLiAgKi8KLSAgZW51bSBjZ2VuX29waW5zdF90eXBlIHR5cGU7Ci0KLSAgLyogTmFtZSBvZiBvcGVyYW5kLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgaGFyZHdhcmUgZWxlbWVudCByZWZlcmVuY2VkLiAgKi8KLSAgZW51bSBjZ2VuX2h3X3R5cGUgaHdfdHlwZTsKLQotICAvKiBUaGUgbW9kZSBpbiB3aGljaCB0aGUgb3BlcmFuZCBpcyBiZWluZyB1c2VkLiAgKi8KLSAgZW51bSBjZ2VuX21vZGUgbW9kZTsKLQotICAvKiBUaGUgb3BlcmFuZCB0YWJsZSBlbnRyeSBDR0VOX09QRVJBTkRfTklMIGlmIHRoZXJlIGlzIG5vbmUKLSAgICAgKGkuZS4gYW4gZXhwbGljaXQgaGFyZHdhcmUgcmVmZXJlbmNlKS4gICovCi0gIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgb3BfdHlwZTsKLQotICAvKiBJZiBgb3BlcmFuZCcgaXMgIm5pbCIsIHRoZSBpbmRleCAoZS5nLiBpbnRvIGFycmF5IG9mIHJlZ2lzdGVycykuICAqLwotICBpbnQgaW5kZXg7Ci0KLSAgLyogQXR0cmlidXRlcy4KLSAgICAgPz8/IFRoaXMgcGVyaGFwcyBzaG91bGQgYmUgYSByZWFsIGF0dHJpYnV0ZSBzdHJ1Y3QgYnV0IHRoZXJlJ3MKLSAgICAgbm8gY3VycmVudCBuZWVkLCBzbyB3ZSBzYXZlIGEgYml0IG9mIHNwYWNlIGFuZCBqdXN0IGhhdmUgYSBzZXQgb2YKLSAgICAgZmxhZ3MuICBUaGUgaW50ZXJmYWNlIGlzIHN1Y2ggdGhhdCB0aGlzIGNhbiBlYXNpbHkgYmUgbWFkZSBhdHRyaWJ1dGVzCi0gICAgIHNob3VsZCBpdCBwcm92ZSB1c2VmdWwuICAqLwotICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0jZGVmaW5lIENHRU5fT1BJTlNUX0FUVFJTKG9waW5zdCkgKChvcGluc3QpLT5hdHRycykKLS8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBPUElOU1QuICAqLwotI2RlZmluZSBDR0VOX09QSU5TVF9BVFRSKG9waW5zdCwgYXR0cikgXAotKChDR0VOX09QSU5TVF9BVFRSUyAob3BpbnN0KSAmIChhdHRyKSkgIT0gMCkKLS8qIE9wZXJhbmQgaXMgY29uZGl0aW9uYWxseSByZWZlcmVuY2VkIChyZWFkL3dyaXR0ZW4pLiAgKi8KLSNkZWZpbmUgQ0dFTl9PUElOU1RfQ09ORF9SRUYgMQotfSBDR0VOX09QSU5TVDsKLQwKLS8qIFN5bnRheCBzdHJpbmcuCi0KLSAgIEVhY2ggaW5zbiBmb3JtYXQgYW5kIHN1YmV4cHJlc3Npb24gaGFzIG9uZSBvZiB0aGVzZS4KLQotICAgVGhlIHN5bnRheCAic3RyaW5nIiBjb25zaXN0cyBvZiBjaGFyYWN0ZXJzIChuID4gMCAmJiBuIDwgMTI4KSwgYW5kIG9wZXJhbmQKLSAgIHZhbHVlcyAobiA+PSAxMjgpLCBhbmQgaXMgdGVybWluYXRlZCBieSAwLiAgT3BlcmFuZCB2YWx1ZXMgYXJlIDEyOCArIGluZGV4Ci0gICBpbnRvIHRoZSBvcGVyYW5kIHRhYmxlLiAgVGhlIG9wZXJhbmQgdGFibGUgZG9lc24ndCBleGlzdCBpbiBDLCBwZXIgc2UsIGFzCi0gICB0aGUgZGF0YSBpcyByZWNvcmRlZCBpbiB0aGUgcGFyc2UvaW5zZXJ0L2V4dHJhY3QvcHJpbnQgc3dpdGNoIHN0YXRlbWVudHMuICovCi0KLSNpZm5kZWYgQ0dFTl9NQVhfU1lOVEFYX0JZVEVTCi0jZGVmaW5lIENHRU5fTUFYX1NZTlRBWF9CWVRFUyAxNgotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgc3ludGF4W0NHRU5fTUFYX1NZTlRBWF9CWVRFU107Ci19IENHRU5fU1lOVEFYOwotCi0jZGVmaW5lIENHRU5fU1lOVEFYX1NUUklORyhzeW4pIChzeW4tPnN5bnRheCkKLSNkZWZpbmUgQ0dFTl9TWU5UQVhfQ0hBUl9QKGMpICgoYykgPCAxMjgpCi0jZGVmaW5lIENHRU5fU1lOVEFYX0NIQVIoYykgKGMpCi0jZGVmaW5lIENHRU5fU1lOVEFYX0ZJRUxEKGMpICgoYykgLSAxMjgpCi0jZGVmaW5lIENHRU5fU1lOVEFYX01BS0VfRklFTEQoYykgKChjKSArIDEyOCkKLQotLyogPz8/IEkgY2FuJ3QgY3VycmVudGx5IHRoaW5rIG9mIGFueSBjYXNlIHdoZXJlIHRoZSBtbmVtb25pYyBkb2Vzbid0IGNvbWUKLSAgIGZpcnN0IFthbmQgaWYgb25lIGV2ZXIgZG9lc24ndCBidWlsZGluZyB0aGUgaGFzaCB0YWJsZXMgd2lsbCBiZSB0cmlja3ldLgotICAgSG93ZXZlciwgd2UgdHJlYXQgbW5lbW9uaWNzIGFzIGp1c3QgYW5vdGhlciBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgIEEgdmFsdWUgb2YgMSBtZWFucyAidGhpcyBpcyB3aGVyZSB0aGUgbW5lbW9uaWMgYXBwZWFycyIuICAxIGlzbid0Ci0gICBzcGVjaWFsIG90aGVyIHRoYW4gaXQncyBhIG5vbi1wcmludGFibGUgQVNDSUkgY2hhci4gICovCi0KLSNkZWZpbmUgQ0dFTl9TWU5UQVhfTU5FTU9OSUMgICAgICAgMQotI2RlZmluZSBDR0VOX1NZTlRBWF9NTkVNT05JQ19QKGNoKSAoKGNoKSA9PSBDR0VOX1NZTlRBWF9NTkVNT05JQykKLQwKLS8qIEluc3RydWN0aW9uIGZpZWxkcy4KLQotICAgPz8/IFdlIGN1cnJlbnRseSBkb24ndCBhbGxvdyBhZGRpbmcgZmllbGRzIGF0IHJ1bi10aW1lLgotICAgRWFzeSB0byBmaXggd2hlbiBuZWVkZWQuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2lmbGQgewotICAvKiBFbnVtIG9mIGlmaWVsZC4gICovCi0gIGludCBudW07Ci0jZGVmaW5lIENHRU5fSUZMRF9OVU0oZikgKChmKS0+bnVtKQotCi0gIC8qIE5hbWUgb2YgdGhlIGZpZWxkLCBkaXN0aW5ndWlzaGVzIGl0IGZyb20gYWxsIG90aGVyIGZpZWxkcy4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0jZGVmaW5lIENHRU5fSUZMRF9OQU1FKGYpICgoZiktPm5hbWUpCi0KLSAgLyogRGVmYXVsdCBvZmZzZXQsIGluIGJpdHMsIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIHRvIHRoZSB3b3JkCi0gICAgIGNvbnRhaW5pbmcgdGhlIGZpZWxkLiAgKi8KLSAgaW50IHdvcmRfb2Zmc2V0OwotI2RlZmluZSBDR0VOX0lGTERfV09SRF9PRkZTRVQoZikgKChmKS0+d29yZF9vZmZzZXQpCi0KLSAgLyogRGVmYXVsdCBsZW5ndGggb2YgdGhlIHdvcmQgY29udGFpbmluZyB0aGUgZmllbGQuICAqLwotICBpbnQgd29yZF9zaXplOwotI2RlZmluZSBDR0VOX0lGTERfV09SRF9TSVpFKGYpICgoZiktPndvcmRfc2l6ZSkKLQotICAvKiBEZWZhdWx0IHN0YXJ0aW5nIGJpdCBudW1iZXIuCi0gICAgIFdoZXRoZXIgbHNiPTAgb3IgbXNiPTAgaXMgZGV0ZXJtaW5lZCBieSBDR0VOX0lOU05fTFNCMF9QLiAgKi8KLSAgaW50IHN0YXJ0OwotI2RlZmluZSBDR0VOX0lGTERfU1RBUlQoZikgKChmKS0+c3RhcnQpCi0KLSAgLyogTGVuZ3RoIG9mIHRoZSBmaWVsZCwgaW4gYml0cy4gICovCi0gIGludCBsZW5ndGg7Ci0jZGVmaW5lIENHRU5fSUZMRF9MRU5HVEgoZikgKChmKS0+bGVuZ3RoKQotCi0jaWZuZGVmIENHRU5fSUZMRF9OQk9PTF9BVFRSUwotI2RlZmluZSBDR0VOX0lGTERfTkJPT0xfQVRUUlMgMQotI2VuZGlmCi0gIENHRU5fQVRUUl9UWVBFIChDR0VOX0lGTERfTkJPT0xfQVRUUlMpIGF0dHJzOwotI2RlZmluZSBDR0VOX0lGTERfQVRUUlMoZikgKCYoZiktPmF0dHJzKQotfSBDR0VOX0lGTEQ7Ci0KLS8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBJRkxELiAgKi8KLSNkZWZpbmUgQ0dFTl9JRkxEX0FUVFJfVkFMVUUoaWZsZCwgYXR0cikgXAotQ0dFTl9BVFRSX1ZBTFVFICgoaWZsZCksIENHRU5fSUZMRF9BVFRSUyAoaWZsZCksIChhdHRyKSkKLQwKLS8qIEluc3RydWN0aW9uIGRhdGEuICAqLwotCi0vKiBJbnN0cnVjdGlvbiBmb3JtYXRzLgotCi0gICBJbnN0cnVjdGlvbnMgYXJlIGdyb3VwZWQgYnkgZm9ybWF0LiAgQXNzb2NpYXRlZCB3aXRoIGFuIGluc3RydWN0aW9uIGlzIGl0cwotICAgZm9ybWF0LiAgRWFjaCBpbnNuJ3Mgb3Bjb2RlIHRhYmxlIGVudHJ5IGNvbnRhaW5zIGEgZm9ybWF0IHRhYmxlIGVudHJ5LgotICAgPz8/IFRoZXJlIGlzIHVzdWFsbHkgdmVyeSBmZXcgZm9ybWF0cyBjb21wYXJlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5zbnMsCi0gICBzbyBvbmUgY2FuIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgb3Bjb2RlIHRhYmxlIGJ5IHJlY29yZGluZyB0aGUgZm9ybWF0IHRhYmxlCi0gICBhcyBhIHNlcGFyYXRlIGVudGl0eS4gIEdpdmVuIHRoYXQgd2UgY3VycmVudGx5IGRvbid0LCBmb3JtYXQgdGFibGUgZW50cmllcwotICAgYXJlIGFsc28gZGlzdGluZ3Vpc2hlZCBieSB0aGVpciBvcGVyYW5kcy4gIFRoaXMgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZQotICAgdGFibGUsIGJ1dCByZWR1Y2VzIHRoZSBudW1iZXIgb2YgdGFibGVzLiAgSXQncyBhbGwgbWludXRpYWUgYW55d2F5IHNvIGl0Ci0gICBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgW2F0IHRoaXMgcG9pbnQgaW4gdGltZV0uCi0KLSAgID8/PyBTdXBwb3J0IGZvciB2YXJpYWJsZSBsZW5ndGggSVNBJ3MgaXMgd2lwLiAgKi8KLQotLyogQWNjb21wYW55aW5nIGVhY2ggaWZvcm1hdCBkZXNjcmlwdGlvbiBpcyBhIGxpc3Qgb2YgaXRzIGZpZWxkcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgQ0dFTl9JRkxEICppZmxkOwotI2RlZmluZSBDR0VOX0lGTVRfSUZMRF9JRkxEKGlpKSAoKGlpKS0+aWZsZCkKLX0gQ0dFTl9JRk1UX0lGTEQ7Ci0KLSNpZm5kZWYgQ0dFTl9NQVhfSUZNVF9PUEVSQU5EUwotI2RlZmluZSBDR0VOX01BWF9JRk1UX09QRVJBTkRTIDEKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBMZW5ndGggdGhhdCBNQVNLIGFuZCBWQUxVRSBoYXZlIGJlZW4gY2FsY3VsYXRlZCB0bwotICAgICBbVkFMVUUgaXMgcmVjb3JkZWQgZWxzZXdoZXJlXS4KLSAgICAgTm9ybWFsbHkgaXQgaXMgYmFzZV9pbnNuX2JpdHNpemUuICBPbiBbVl1MSVcgYXJjaGl0ZWN0dXJlcyB3aGVyZSB0aGUgYmFzZQotICAgICBpbnNuIHNpemUgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIGFuIGluc24sIHRoaXMgZmllbGQgaXMgbGVzcyB0aGFuCi0gICAgIGJhc2VfaW5zbl9iaXRzaXplLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtYXNrX2xlbmd0aDsKLSNkZWZpbmUgQ0dFTl9JRk1UX01BU0tfTEVOR1RIKGlmbXQpICgoaWZtdCktPm1hc2tfbGVuZ3RoKQotCi0gIC8qIFRvdGFsIGxlbmd0aCBvZiBpbnN0cnVjdGlvbiwgaW4gYml0cy4gICovCi0gIHVuc2lnbmVkIGNoYXIgbGVuZ3RoOwotI2RlZmluZSBDR0VOX0lGTVRfTEVOR1RIKGlmbXQpICgoaWZtdCktPmxlbmd0aCkKLQotICAvKiBNYXNrIHRvIGFwcGx5IHRvIHRoZSBmaXJzdCBNQVNLX0xFTkdUSCBiaXRzLgotICAgICBFYWNoIGluc24ncyB2YWx1ZSBpcyBzdG9yZWQgd2l0aCB0aGUgaW5zbi4KLSAgICAgVGhlIGZpcnN0IHN0ZXAgaW4gcmVjb2duaXppbmcgYW4gaW5zbiBmb3IgZGlzYXNzZW1ibHkgaXMKLSAgICAgKG9wY29kZSAmIG1hc2spID09IHZhbHVlLiAgKi8KLSAgQ0dFTl9JTlNOX0lOVCBtYXNrOwotI2RlZmluZSBDR0VOX0lGTVRfTUFTSyhpZm10KSAoKGlmbXQpLT5tYXNrKQotCi0gIC8qIEluc3RydWN0aW9uIGZpZWxkcy4KLSAgICAgKzEgZm9yIHRyYWlsaW5nIE5VTEwuICAqLwotICBDR0VOX0lGTVRfSUZMRCBpZmxkc1tDR0VOX01BWF9JRk1UX09QRVJBTkRTICsgMV07Ci0jZGVmaW5lIENHRU5fSUZNVF9JRkxEUyhpZm10KSAoKGlmbXQpLT5pZmxkcykKLX0gQ0dFTl9JRk1UOwotCi0vKiBJbnN0cnVjdGlvbiB2YWx1ZXMuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUaGUgb3Bjb2RlIHBvcnRpb24gb2YgdGhlIGJhc2UgaW5zbi4gICovCi0gIENHRU5fSU5TTl9JTlQgYmFzZV92YWx1ZTsKLQotI2lmZGVmIENHRU5fTUFYX0VYVFJBX09QQ09ERV9PUEVSQU5EUwotICAvKiBFeHRyYSBvcGNvZGUgdmFsdWVzIGJleW9uZCBiYXNlX3ZhbHVlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBpZmllbGRfdmFsdWVzW0NHRU5fTUFYX0VYVFJBX09QQ09ERV9PUEVSQU5EU107Ci0jZW5kaWYKLX0gQ0dFTl9JVkFMVUU7Ci0KLS8qIEluc3RydWN0aW9uIG9wY29kZSB0YWJsZS4KLSAgIFRoaXMgY29udGFpbnMgdGhlIHN5bnRheCBhbmQgZm9ybWF0IGRhdGEgb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi0vKiA/Pz8gU29tZSBwb3J0cyBhbHJlYWR5IGhhdmUgYW4gb3Bjb2RlIHRhYmxlIHlldCBzdGlsbCBuZWVkIHRvIHVzZSB0aGUgcmVzdAotICAgb2Ygd2hhdCBjZ2VuX2luc24gaGFzLiAgUGx1cyBrZWVwaW5nIHRoZSBvcGNvZGUgZGF0YSB3aXRoIHRoZSBvcGVyYW5kCi0gICBpbnN0YW5jZSBkYXRhIGNhbiBjcmVhdGUgYSBwcmV0dHkgYmlnIGZpbGUuICBTbyB3ZSBrZWVwIHRoZW0gc2VwYXJhdGVseS4KLSAgIE5vdCBzdXJlIHRoaXMgaXMgYSBnb29kIGlkZWEgaW4gdGhlIGxvbmcgcnVuLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogSW5kaWNlcyBpbnRvIHBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGhhbmRsZXIgdGFibGVzLiAgKi8KLSAgc3RydWN0IGNnZW5fb3Bjb2RlX2hhbmRsZXIgaGFuZGxlcnM7Ci0jZGVmaW5lIENHRU5fT1BDT0RFX0hBTkRMRVJTKG9wYykgKCYgKG9wYyktPmhhbmRsZXJzKQotCi0gIC8qIFN5bnRheCBzdHJpbmcuICAqLwotICBDR0VOX1NZTlRBWCBzeW50YXg7Ci0jZGVmaW5lIENHRU5fT1BDT0RFX1NZTlRBWChvcGMpICgmIChvcGMpLT5zeW50YXgpCi0KLSAgLyogRm9ybWF0IGVudHJ5LiAgKi8KLSAgY29uc3QgQ0dFTl9JRk1UICpmb3JtYXQ7Ci0jZGVmaW5lIENHRU5fT1BDT0RFX0ZPUk1BVChvcGMpICgob3BjKS0+Zm9ybWF0KQotI2RlZmluZSBDR0VOX09QQ09ERV9NQVNLX0JJVFNJWkUob3BjKSBDR0VOX0lGTVRfTUFTS19MRU5HVEggKENHRU5fT1BDT0RFX0ZPUk1BVCAob3BjKSkKLSNkZWZpbmUgQ0dFTl9PUENPREVfQklUU0laRShvcGMpIENHRU5fSUZNVF9MRU5HVEggKENHRU5fT1BDT0RFX0ZPUk1BVCAob3BjKSkKLSNkZWZpbmUgQ0dFTl9PUENPREVfSUZMRFMob3BjKSBDR0VOX0lGTVRfSUZMRFMgKENHRU5fT1BDT0RFX0ZPUk1BVCAob3BjKSkKLQotICAvKiBJbnN0cnVjdGlvbiBvcGNvZGUgdmFsdWUuICAqLwotICBDR0VOX0lWQUxVRSB2YWx1ZTsKLSNkZWZpbmUgQ0dFTl9PUENPREVfVkFMVUUob3BjKSAoJiAob3BjKS0+dmFsdWUpCi0jZGVmaW5lIENHRU5fT1BDT0RFX0JBU0VfVkFMVUUob3BjKSAoQ0dFTl9PUENPREVfVkFMVUUgKG9wYyktPmJhc2VfdmFsdWUpCi0jZGVmaW5lIENHRU5fT1BDT0RFX0JBU0VfTUFTSyhvcGMpIENHRU5fSUZNVF9NQVNLIChDR0VOX09QQ09ERV9GT1JNQVQgKG9wYykpCi19IENHRU5fT1BDT0RFOwotCi0vKiBJbnN0cnVjdGlvbiBhdHRyaWJ1dGVzLgotICAgVGhpcyBpcyBtYWRlIGEgcHVibGlzaGVkIHR5cGUgYXMgYXBwbGljYXRpb25zIGNhbiBjYWNoZSBhIHBvaW50ZXIgdG8KLSAgIHRoZSBhdHRyaWJ1dGVzIGZvciBzcGVlZC4gICovCi0KLSNpZm5kZWYgQ0dFTl9JTlNOX05CT09MX0FUVFJTCi0jZGVmaW5lIENHRU5fSU5TTl9OQk9PTF9BVFRSUyAxCi0jZW5kaWYKLXR5cGVkZWYgQ0dFTl9BVFRSX1RZUEUgKENHRU5fSU5TTl9OQk9PTF9BVFRSUykgQ0dFTl9JTlNOX0FUVFJfVFlQRTsKLQotLyogRW51bSBvZiBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgYXR0cmlidXRlcy4gICovCi0KLSNpZm5kZWYgQ0dFTl9BUkNICi0vKiA/Pz8gTnVtYmVycyBoZXJlIGFyZSByZWNvcmRlZCBpbiB0d28gcGxhY2VzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2luc25fYXR0ciB7Ci0gIENHRU5fSU5TTl9BTElBUyA9IDAKLX0gQ0dFTl9JTlNOX0FUVFI7Ci0jZW5kaWYKLQotLyogVGhpcyBzdHJ1Y3QgZGVmaW5lcyBlYWNoIGVudHJ5IGluIHRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEVhY2ggcmVhbCBpbnN0cnVjdGlvbiBpcyBlbnVtZXJhdGVkLiAgKi8KLSAgLyogPz8/IFRoaXMgbWF5IGdvIGF3YXkgaW4gdGltZS4gICovCi0gIGludCBudW07Ci0jZGVmaW5lIENHRU5fSU5TTl9OVU0oaW5zbikgKChpbnNuKS0+YmFzZS0+bnVtKQotCi0gIC8qIE5hbWUgb2YgZW50cnkgKHRoYXQgZGlzdGluZ3Vpc2hlcyBpdCBmcm9tIGFsbCBvdGhlciBlbnRyaWVzKS4gICovCi0gIC8qID8/PyBJZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcywgdHJ5IHRvIHByaW50IGZ1bGwgbW5lbW9uaWMuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotI2RlZmluZSBDR0VOX0lOU05fTkFNRShpbnNuKSAoKGluc24pLT5iYXNlLT5uYW1lKQotCi0gIC8qIE1uZW1vbmljLiAgVGhpcyBpcyB1c2VkIHdoZW4gcGFyc2luZyBhbmQgcHJpbnRpbmcgdGhlIGluc24uCi0gICAgIEluIHRoZSBjYXNlIG9mIGluc25zIHRoYXQgaGF2ZSBvcGVyYW5kcyBvbiB0aGUgbW5lbW9uaWNzLCB0aGlzIGlzCi0gICAgIG9ubHkgdGhlIGNvbnN0YW50IHBhcnQuICBFLmcuIGZvciBjb25kaXRpb25hbCBleGVjdXRpb24gb2YgYW4gYGFkZCcgaW5zbiwKLSAgICAgd2hlcmUgdGhlIGZ1bGwgbW5lbW9uaWMgaXMgYWRkZXEsIGFkZG5lLCBldGMuLCBhbmQgdGhlIGNvbmRpdGlvbiBpcwotICAgICB0cmVhdGVkIGFzIGFuIG9wZXJhbmQsIHRoaXMgaXMgb25seSAiYWRkIi4gICovCi0gIGNvbnN0IGNoYXIgKm1uZW1vbmljOwotI2RlZmluZSBDR0VOX0lOU05fTU5FTU9OSUMoaW5zbikgKChpbnNuKS0+YmFzZS0+bW5lbW9uaWMpCi0KLSAgLyogVG90YWwgbGVuZ3RoIG9mIGluc3RydWN0aW9uLCBpbiBiaXRzLiAgKi8KLSAgaW50IGJpdHNpemU7Ci0jZGVmaW5lIENHRU5fSU5TTl9CSVRTSVpFKGluc24pICgoaW5zbiktPmJhc2UtPmJpdHNpemUpCi0KLSNpZiAwIC8qID8/PyBEaXNhYmxlZCBmb3Igbm93IGFzIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIGVtYmVkZGVkIG5ld2xpbmVzCi0JIGFuZCB0aGUgdGFibGUgaXMgYWxyZWFkeSBwcmV0dHkgYmlnLiAgU2hvdWxkIHBlcmhhcHMgYmUgbW92ZWQKLQkgdG8gYSBmaWxlIG9mIGl0cyBvd24uICAqLwotICAvKiBTZW1hbnRpY3MsIGFzIFJUTC4gICovCi0gIC8qID8/PyBQbGFpbiB0ZXh0IG9yIGJ5dGVjb2Rlcz8gICovCi0gIC8qID8/PyBOb3RlIHRoYXQgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUgY291bGQgYmUgY29tcHV0ZWQgYXQgcnVuLXRpbWUKLSAgICAgaWYgd2UgcGFyc2UgdGhpcyBhbmQgY2FjaGUgdGhlIHJlc3VsdHMuICBTb21ldGhpbmcgdG8gZXZlbnR1YWxseSBkby4gICovCi0gIGNvbnN0IGNoYXIgKnJ0eDsKLSNkZWZpbmUgQ0dFTl9JTlNOX1JUWChpbnNuKSAoKGluc24pLT5iYXNlLT5ydHgpCi0jZW5kaWYKLQotICAvKiBBdHRyaWJ1dGVzLgotICAgICBUaGlzIG11c3QgYXBwZWFyIGxhc3QuICBJdCBpcyBhIHZhcmlhYmxlIHNpemVkIGFycmF5IGluIHRoYXQgb25lCi0gICAgIGFyY2hpdGVjdHVyZSBtYXkgaGF2ZSAxIG5vbmJvb2wgYXR0cmlidXRlIGFuZCBhbm90aGVyIG1heSBoYXZlIG1vcmUuCi0gICAgIEhhdmluZyB0aGlzIGxhc3QgbWVhbnMgdGhlIG5vbi1hcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29kZSBuZWVkbid0Ci0gICAgIGNhcmUuICBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlY29yZCBhdHRyaWJ1dGVzIGluIHRoZWlyIHJhdyBmb3JtLAotICAgICBldmFsdWF0ZSB0aGVtIGF0IHJ1bi10aW1lLCBhbmQgY2FjaGUgdGhlIHZhbHVlcywgc28gdGhpcyB3b3JyeSB3aWxsIGdvCi0gICAgIGF3YXkgYW55d2F5LiAgKi8KLSAgQ0dFTl9JTlNOX0FUVFJfVFlQRSBhdHRyczsKLSNkZWZpbmUgQ0dFTl9JTlNOX0FUVFJTKGluc24pICgmKGluc24pLT5iYXNlLT5hdHRycykKLS8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBJTlNOLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0FUVFJfVkFMVUUoaW5zbiwgYXR0cikgXAotQ0dFTl9BVFRSX1ZBTFVFICgoaW5zbiksIENHRU5fSU5TTl9BVFRSUyAoaW5zbiksIChhdHRyKSkKLX0gQ0dFTl9JQkFTRTsKLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIElOU04gaXMgdGhlICJpbnZhbGlkIiBpbnNuIG1hcmtlci4gICovCi0KLSNkZWZpbmUgQ0dFTl9JTlNOX0lOVkFMSURfUChpbnNuKSAoQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSA9PSAwKQotCi0vKiBNYWluIHN0cnVjdCBjb250YWluIGluc3RydWN0aW9uIGluZm9ybWF0aW9uLgotICAgQkFTRSBpcyBhbHdheXMgcHJlc2VudCwgdGhlIHJlc3QgaXMgcHJlc2VudCBvbmx5IGlmIGFza2VkIGZvci4gICovCi0KLXN0cnVjdCBjZ2VuX2luc24KLXsKLSAgLyogPz8/IE1heSBiZSBvZiB1c2UgdG8gcHV0IGEgdHlwZSBpbmRpY2F0b3IgaGVyZS4KLSAgICAgVGhlbiB0aGlzIHN0cnVjdCBjb3VsZCBkaWZmZXJlbnQgaW5mbyBmb3IgZGlmZmVyZW50IGNsYXNzZXMgb2YgaW5zbnMuICAqLwotICAvKiA/Pz8gQSBzcGVlZHVwIGNhbiBiZSBoYWQgYnkgbW92aW5nIGBiYXNlJyBpbnRvIHRoaXMgc3RydWN0LgotICAgICBNYXliZSBsYXRlci4gICovCi0gIGNvbnN0IENHRU5fSUJBU0UgKmJhc2U7Ci0gIGNvbnN0IENHRU5fT1BDT0RFICpvcGNvZGU7Ci0gIGNvbnN0IENHRU5fT1BJTlNUICpvcGluc3Q7Ci19OwotCi0vKiBJbnN0cnVjdGlvbiBsaXN0cy4KLSAgIFRoaXMgaXMgdXNlZCBmb3IgYWRkaW5nIG5ldyBlbnRyaWVzIGFuZCBmb3IgY3JlYXRpbmcgdGhlIGhhc2ggbGlzdHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2luc25fbGlzdAotewotICBzdHJ1Y3QgY2dlbl9pbnNuX2xpc3QgKm5leHQ7Ci0gIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLX0gQ0dFTl9JTlNOX0xJU1Q7Ci0KLS8qIFRhYmxlIG9mIGluc3RydWN0aW9ucy4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IENHRU5fSU5TTiAqaW5pdF9lbnRyaWVzOwotICB1bnNpZ25lZCBpbnQgZW50cnlfc2l6ZTsgLyogc2luY2UgdGhlIGF0dHJpYnV0ZSBtZW1iZXIgaXMgdmFyaWFibGUgc2l6ZWQgKi8KLSAgdW5zaWduZWQgaW50IG51bV9pbml0X2VudHJpZXM7Ci0gIENHRU5fSU5TTl9MSVNUICpuZXdfZW50cmllczsKLX0gQ0dFTl9JTlNOX1RBQkxFOwotCi0vKiBSZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucy4gIFRoaXMgaW5jbHVkZXMgYW55IGFkZGVkIGF0IHJ1bi10aW1lLiAgKi8KLQotZXh0ZXJuIGludCBjZ2VuX2luc25fY291bnQgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotZXh0ZXJuIGludCBjZ2VuX21hY3JvX2luc25fY291bnQgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotCi0vKiBNYWNyb3MgdG8gYWNjZXNzIHRoZSBvdGhlciBpbnNuIGVsZW1lbnRzIG5vdCByZWNvcmRlZCBpbiBDR0VOX0lCQVNFLiAgKi8KLQotLyogRmV0Y2ggSU5TTidzIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUuICAqLwotLyogPz8/IERvZXNuJ3QgaGFuZGxlIGluc25zIGFkZGVkIGF0IHJ1bnRpbWUuICAqLwotI2RlZmluZSBDR0VOX0lOU05fT1BFUkFORFMoaW5zbikgKChpbnNuKS0+b3BpbnN0KQotCi0vKiBSZXR1cm4gSU5TTidzIG9wY29kZSB0YWJsZSBlbnRyeS4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9PUENPREUoaW5zbikgKChpbnNuKS0+b3Bjb2RlKQotCi0vKiBSZXR1cm4gSU5TTidzIGhhbmRsZXIgZGF0YS4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9IQU5ETEVSUyhpbnNuKSBDR0VOX09QQ09ERV9IQU5ETEVSUyAoQ0dFTl9JTlNOX09QQ09ERSAoaW5zbikpCi0KLS8qIFJldHVybiBJTlNOJ3Mgc3ludGF4LiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX1NZTlRBWChpbnNuKSBDR0VOX09QQ09ERV9TWU5UQVggKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBSZXR1cm4gc2l6ZSBvZiBiYXNlIG1hc2sgaW4gYml0cy4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9NQVNLX0JJVFNJWkUoaW5zbikgXAotICBDR0VOX09QQ09ERV9NQVNLX0JJVFNJWkUgKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBSZXR1cm4gbWFzayBvZiBiYXNlIHBhcnQgb2YgSU5TTi4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9CQVNFX01BU0soaW5zbikgXAotICBDR0VOX09QQ09ERV9CQVNFX01BU0sgKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBSZXR1cm4gdmFsdWUgb2YgYmFzZSBwYXJ0IG9mIElOU04uICAqLwotI2RlZmluZSBDR0VOX0lOU05fQkFTRV9WQUxVRShpbnNuKSBcCi0gIENHRU5fT1BDT0RFX0JBU0VfVkFMVUUgKENHRU5fSU5TTl9PUENPREUgKGluc24pKQotCi0vKiBTdGFuZGFyZCB3YXkgdG8gdGVzdCB3aGV0aGVyIElOU04gaXMgc3VwcG9ydGVkIGJ5IE1BQ0guCi0gICBNQUNIIGlzIG9uZSBvZiBlbnVtIG1hY2hfYXR0ci4KLSAgIFRoZSAifDEiIGlzIGJlY2F1c2UgdGhlIGJhc2UgbWFjaCBpcyBhbHdheXMgc2VsZWN0ZWQuICAqLwotI2RlZmluZSBDR0VOX0lOU05fTUFDSF9IQVNfUChpbnNuLCBtYWNoKSBcCi0oKENHRU5fSU5TTl9BVFRSX1ZBTFVFICgoaW5zbiksIENHRU5fSU5TTl9NQUNIKSAmICgoMSA8PCAobWFjaCkpIHwgMSkpICE9IDApCi0MCi0vKiBNYWNybyBpbnN0cnVjdGlvbnMuCi0gICBNYWNybyBpbnNucyBhcmVuJ3QgcmVhbCBpbnNucywgdGhleSBtYXAgdG8gb25lIG9yIG1vcmUgcmVhbCBpbnNucy4KLSAgIEUuZy4gQW4gYXJjaGl0ZWN0dXJlJ3MgIm5vcCIgaW5zbiBtYXkgYWN0dWFsbHkgYmUgYW4gIm12IHIwLHIwIiBvcgotICAgc29tZSBzdWNoLgotCi0gICBNYWNybyBpbnNucyBjYW4gZXhwYW5kIHRvIG5vdGhpbmcgKGUuZy4gYSBub3AgdGhhdCBpcyBvcHRpbWl6ZWQgYXdheSkuCi0gICBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS1pbnNuIG1hY3JvcyB0aGF0IGJ1aWxkIGEgY29uc3RhbnQgaW4gYSByZWdpc3Rlci4KLSAgIE9mIGNvdXJzZSB0aGlzIGlzbid0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQuCi0KLSAgIEFzc2VtYmx5IG9mIG1hY3JvLWluc25zIGlzIHJlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkLiAgRGlzYXNzZW1ibHkgaXNuJ3QuCi0gICBIb3dldmVyLCBkaXNhc3NlbWJseSBvZiBhdCBsZWFzdCBzb21lIGtpbmRzIG9mIG1hY3JvIGluc25zIGlzIGltcG9ydGFudAotICAgaW4gb3JkZXIgdGhhdCB0aGUgZGlzYXNzZW1ibGVkIGNvZGUgcHJlc2VydmUgdGhlIHJlYWRhYmlsaXR5IG9mIHRoZSBvcmlnaW5hbAotICAgaW5zbi4gIFdoYXQgaXMgYXR0ZW1wdGVkIGhlcmUgaXMgdG8gZGlzYXNzZW1ibGUgYWxsICJzaW1wbGUiIG1hY3JvLWluc25zLAotICAgd2hlcmUgInNpbXBsZSIgaXMgY3VycmVudGx5IGRlZmluZWQgdG8gbWVhbiAiZXhwYW5kcyB0byBvbmUgcmVhbCBpbnNuIi4KLQotICAgU2ltcGxlIG1hY3JvLWluc25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseS4gIFRoZXkgYXJlIGVtaXR0ZWQgYXMgQUxJQVMncwotICAgb2YgcmVhbCBpbnNucy4gIFRoaXMgc2ltcGxpZmllcyB0aGVpciBoYW5kbGluZyBzaW5jZSB0aGVyZSdzIHVzdWFsbHkgbW9yZQotICAgb2YgdGhlbSB0aGFuIGFueSBvdGhlciBraW5kIG9mIG1hY3JvLWluc24sIGFuZCBwcm9wZXIgZGlzYXNzZW1ibHkgb2YgdGhlbQotICAgZmFsbHMgb3V0IGZvciBmcmVlLiAgKi8KLQotLyogRm9yIGVhY2ggbWFjcm8taW5zbiB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgZXhwYW5zaW9uIHBvc3NpYmlsaXRpZXMsCi0gICBkZXBlbmRpbmcgb24gdGhlIGFyZ3VtZW50cy4gIFRoaXMgc3RydWN0dXJlIGlzIGFjY2Vzc2VkIHZpYSB0aGUgYGRhdGEnCi0gICBtZW1iZXIgb2YgQ0dFTl9JTlNOLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9taW5zbl9leHBhbnNpb24gewotICAvKiBGdW5jdGlvbiB0byBkbyB0aGUgZXhwYW5zaW9uLgotICAgICBJZiB0aGUgZXhwYW5zaW9uIGZhaWxzIChlLmcuICJubyBtYXRjaCIpIE5VTEwgaXMgcmV0dXJuZWQuCi0gICAgIFNwYWNlIGZvciB0aGUgZXhwYW5zaW9uIGlzIG9idGFpbmVkIHdpdGggbWFsbG9jLgotICAgICBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGZyZWUgaXQuICAqLwotICBjb25zdCBjaGFyICogKCogZm4pIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBjZ2VuX21pbnNuX2V4cGFuc2lvbiAqLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgaW50ICosCi0JCQkgICAgICAgQ0dFTl9PUEVSQU5EICoqKSk7Ci0jZGVmaW5lIENHRU5fTUlFWFBOX0ZOKGV4KSAoKGV4KS0+Zm4pCi0KLSAgLyogSW5zdHJ1Y3Rpb24ocykgdGhlIG1hY3JvIGV4cGFuZHMgdG8uCi0gICAgIFRoZSBmb3JtYXQgb2YgU1RSIGlzIGRlZmluZWQgYnkgRk4uCi0gICAgIEl0IGlzIHR5cGljYWxseSB0aGUgYXNzZW1ibHkgY29kZSBvZiB0aGUgcmVhbCBpbnNuLCBidXQgaXQgY291bGQgYWxzbyBiZQotICAgICB0aGUgb3JpZ2luYWwgU2NoZW1lIGV4cHJlc3Npb24gb3IgYSB0b2tlbml6ZWQgZm9ybSBvZiBpdCAod2l0aCBGTiBiZWluZwotICAgICBhbiBhcHByb3ByaWF0ZSBpbnRlcnByZXRlcikuICAqLwotICBjb25zdCBjaGFyICogc3RyOwotI2RlZmluZSBDR0VOX01JRVhQTl9TVFIoZXgpICgoZXgpLT5zdHIpCi19IENHRU5fTUlOU05fRVhQQU5TSU9OOwotCi0vKiBOb3JtYWwgZXhwYW5kZXIuCi0gICBXaGVuIHN1cHBvcnRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgdGhlIGlucHV0IHN0cmluZyB0byBhbm90aGVyCi0gICBzdHJpbmcgYW5kIHRoZSBwYXJzZXIgd2lsbCBiZSBpbnZva2VkIHJlY3Vyc2l2ZWx5LiAgVGhlIG91dHB1dCBzdHJpbmcKLSAgIG1heSBjb250YWluIGZ1cnRoZXIgbWFjcm8gaW52b2NhdGlvbnMuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqIGNnZW5fZXhwYW5kX21hY3JvX2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3Qgc3RydWN0IGNnZW5fbWluc25fZXhwYW5zaW9uICosCi0JICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLCBpbnQgKiwgQ0dFTl9PUEVSQU5EICoqKSk7Ci0MCi0vKiBUaGUgYXNzZW1ibGVyIGluc24gdGFibGUgaXMgaGFzaGVkIGJhc2VkIG9uIHNvbWUgZnVuY3Rpb24gb2YgdGhlIG1uZW1vbmljCi0gICAodGhlIGFjdHVhbGx5IGhhc2hpbmcgZG9uZSBpcyB1cCB0byB0aGUgdGFyZ2V0LCBidXQgd2UgcHJvdmlkZSBhIGZldwotICAgZXhhbXBsZXMgbGlrZSB0aGUgZmlyc3QgbGV0dGVyIG9yIGEgZnVuY3Rpb24gb2YgdGhlIGVudGlyZSBtbmVtb25pYykuICAqLwotCi1leHRlcm4gQ0dFTl9JTlNOX0xJU1QgKiBjZ2VuX2FzbV9sb29rdXBfaW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICopKTsKLSNkZWZpbmUgQ0dFTl9BU01fTE9PS1VQX0lOU04oY2QsIHN0cmluZykgY2dlbl9hc21fbG9va3VwX2luc24gKChjZCksIChzdHJpbmcpKQotI2RlZmluZSBDR0VOX0FTTV9ORVhUX0lOU04oaW5zbikgKChpbnNuKS0+bmV4dCkKLQotLyogVGhlIGRpc2Fzc2VtYmxlciBpbnNuIHRhYmxlIGlzIGhhc2hlZCBiYXNlZCBvbiBzb21lIGZ1bmN0aW9uIG9mIG1hY2hpbmUKLSAgIGluc3RydWN0aW9uICh0aGUgYWN0dWFsbHkgaGFzaGluZyBkb25lIGlzIHVwIHRvIHRoZSB0YXJnZXQpLiAgKi8KLQotZXh0ZXJuIENHRU5fSU5TTl9MSVNUICogY2dlbl9kaXNfbG9va3VwX2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqLCBDR0VOX0lOU05fSU5UKSk7Ci0vKiBGSVhNRTogZGVsZXRlIHRoZXNlIHR3byAqLwotI2RlZmluZSBDR0VOX0RJU19MT09LVVBfSU5TTihjZCwgYnVmLCB2YWx1ZSkgY2dlbl9kaXNfbG9va3VwX2luc24gKChjZCksIChidWYpLCAodmFsdWUpKQotI2RlZmluZSBDR0VOX0RJU19ORVhUX0lOU04oaW5zbikgKChpbnNuKS0+bmV4dCkKLQwKLS8qIFRoZSBDUFUgZGVzY3JpcHRpb24uCi0gICBBIGNvcHkgb2YgdGhpcyBpcyBjcmVhdGVkIHdoZW4gdGhlIGNwdSB0YWJsZSBpcyAib3BlbmVkIi4KLSAgIEFsbCBnbG9iYWwgc3RhdGUgaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgaGVyZS4KLSAgIEFjY2VzcyBtYWNyb3MgYXJlIHByb3ZpZGVkIGZvciAicHVibGljIiBtZW1iZXJzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9jcHVfZGVzYwotewotICAvKiBCaXRtYXAgb2Ygc2VsZWN0ZWQgbWFjaGluZShzKSAoYSBsYSBCRkQgbWFjaGluZSBudW1iZXIpLiAgKi8KLSAgaW50IG1hY2hzOwotCi0gIC8qIEJpdG1hcCBvZiBzZWxlY3RlZCBpc2EocykuCi0gICAgID8/PyBTaW11bHRhbmVvdXMgbXVsdGlwbGUgaXNhcyBtaWdodCBub3QgbWFrZSBzZW5zZSwgYnV0IGl0J3Mgbm90ICh5ZXQpCi0gICAgIHByZWNsdWRlZC4gICovCi0gIGludCBpc2FzOwotCi0gIC8qIEN1cnJlbnQgZW5kaWFuLiAgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW47Ci0jZGVmaW5lIENHRU5fQ1BVX0VORElBTihjZCkgKChjZCktPmVuZGlhbikKLQotICAvKiBDdXJyZW50IGluc24gZW5kaWFuLiAgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBpbnNuX2VuZGlhbjsKLSNkZWZpbmUgQ0dFTl9DUFVfSU5TTl9FTkRJQU4oY2QpICgoY2QpLT5pbnNuX2VuZGlhbikKLQotICAvKiBXb3JkIHNpemUgKGluIGJpdHMpLiAgKi8KLSAgLyogPz8/IE9yIG1heWJlIG1heGltdW0gd29yZCBzaXplIC0gbWlnaHQgd2UgZXZlciBuZWVkIHRvIGFsbG93IGEgY3B1IHRhYmxlCi0gICAgIHRvIGJlIG9wZW5lZCBmb3IgYm90aCBzcGFyYzMyL3NwYXJjNjQ/Ci0gICAgID8/PyBBbm90aGVyIGFsdGVybmF0aXZlIGlzIHRvIGNyZWF0ZSBhIHRhYmxlIG9mIHNlbGVjdGVkIG1hY2hzIGFuZAotICAgICBsYXppbHkgZmV0Y2ggdGhlIGRhdGEgZnJvbSB0aGVyZS4gICovCi0gIHVuc2lnbmVkIGludCB3b3JkX2JpdHNpemU7Ci0KLSAgLyogSW5kaWNhdG9yIGlmIHNpemVzIGFyZSB1bmtub3duLgotICAgICBUaGlzIGlzIHVzZWQgYnkgZGVmYXVsdF9pbnNuX2JpdHNpemUsYmFzZV9pbnNuX2JpdHNpemUgaWYgdGhlcmUgaXMgYQotICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNlbGVjdGVkIGlzYSdzLiAgKi8KLSNkZWZpbmUgQ0dFTl9TSVpFX1VOS05PV04gNjU1MzUKLQotICAvKiBEZWZhdWx0IGluc3RydWN0aW9uIHNpemUgKGluIGJpdHMpLgotICAgICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB3aGVuIGl0IGVuY291bnRlcnMgYW4gdW5rbm93biBpbnNuLiAgKi8KLSAgdW5zaWduZWQgaW50IGRlZmF1bHRfaW5zbl9iaXRzaXplOwotCi0gIC8qIEJhc2UgaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuCi0gICAgIEZvciBub24tTElXIGNwdXMgdGhpcyBpcyBnZW5lcmFsbHkgdGhlIGxlbmd0aCBvZiB0aGUgc21hbGxlc3QgaW5zbi4KLSAgICAgRm9yIExJVyBjcHVzIGl0cyB3aXAgKHdvcmstaW4tcHJvZ3Jlc3MpLiAgRm9yIHRoZSBtMzJyIGl0cyAzMi4gICovCi0gIHVuc2lnbmVkIGludCBiYXNlX2luc25fYml0c2l6ZTsKLQotICAvKiBNaW5pbXVtL21heGltdW0gaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuICAqLwotICB1bnNpZ25lZCBpbnQgbWluX2luc25fYml0c2l6ZTsKLSAgdW5zaWduZWQgaW50IG1heF9pbnNuX2JpdHNpemU7Ci0KLSAgLyogSW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KLSAgY29uc3QgQ0dFTl9JU0EgKmlzYV90YWJsZTsKLQotICAvKiBNYWNoaW5lIHZhcmlhbnRzLiAgKi8KLSAgY29uc3QgQ0dFTl9NQUNIICptYWNoX3RhYmxlOwotCi0gIC8qIEhhcmR3YXJlIGVsZW1lbnRzLiAgKi8KLSAgQ0dFTl9IV19UQUJMRSBod190YWJsZTsKLQotICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLwotICBjb25zdCBDR0VOX0lGTEQgKmlmbGRfdGFibGU7Ci0KLSAgLyogT3BlcmFuZHMuICAqLwotICBDR0VOX09QRVJBTkRfVEFCTEUgb3BlcmFuZF90YWJsZTsKLQotICAvKiBNYWluIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLSAgQ0dFTl9JTlNOX1RBQkxFIGluc25fdGFibGU7Ci0jZGVmaW5lIENHRU5fQ1BVX0lOU05fVEFCTEUoY2QpICgmIChjZCktPmluc25fdGFibGUpCi0KLSAgLyogTWFjcm8gaW5zdHJ1Y3Rpb25zIGFyZSBkZWZpbmVkIHNlcGFyYXRlbHkgYW5kIGFyZSBjb21iaW5lZCB3aXRoIHJlYWwKLSAgICAgaW5zbnMgZHVyaW5nIGhhc2ggdGFibGUgY29tcHV0YXRpb24uICAqLwotICBDR0VOX0lOU05fVEFCTEUgbWFjcm9faW5zbl90YWJsZTsKLQotICAvKiBDb3B5IG9mIENHRU5fSU5UX0lOU05fUC4gICovCi0gIGludCBpbnRfaW5zbl9wOwotCi0gIC8qIENhbGxlZCB0byByZWJ1aWxkIHRoZSB0YWJsZXMgYWZ0ZXIgc29tZXRoaW5nIGhhcyBjaGFuZ2VkLiAgKi8KLSAgdm9pZCAoKnJlYnVpbGRfdGFibGVzKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0KLSAgLyogT3BlcmFuZCBwYXJzZXIgY2FsbGJhY2suICAqLwotICBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gKiBwYXJzZV9vcGVyYW5kX2ZuOwotCi0gIC8qIFBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGNvdmVyIGZucyBmb3Igb3BlcmFuZHMuICAqLwotICBjb25zdCBjaGFyICogKCpwYXJzZV9vcGVyYW5kKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIGNvbnN0IGNoYXIgKiosCi0JICAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKLSNpZmRlZiBCRkRfVkVSU0lPTgotICBjb25zdCBjaGFyICogKCppbnNlcnRfb3BlcmFuZCkKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywKLQkgICAgICBDR0VOX0lOU05fQllURVNfUFRSLCBiZmRfdm1hIHBjXykpOwotICBpbnQgKCpleHRyYWN0X29wZXJhbmQpCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgQ0dFTl9FWFRSQUNUX0lORk8gKiwgQ0dFTl9JTlNOX0lOVCwKLQkgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzXywgYmZkX3ZtYSBwY18pKTsKLSAgdm9pZCAoKnByaW50X29wZXJhbmQpCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgUFRSIGluZm9fLCBDR0VOX0ZJRUxEUyAqIGZpZWxkc18sCi0JICAgICAgdm9pZCBjb25zdCAqYXR0cnNfLCBiZmRfdm1hIHBjXywgaW50IGxlbmd0aF8pKTsKLSNlbHNlCi0gIGNvbnN0IGNoYXIgKiAoKmluc2VydF9vcGVyYW5kKSAoKTsKLSAgaW50ICgqZXh0cmFjdF9vcGVyYW5kKSAoKTsKLSAgdm9pZCAoKnByaW50X29wZXJhbmQpICgpOwotI2VuZGlmCi0jZGVmaW5lIENHRU5fQ1BVX1BBUlNFX09QRVJBTkQoY2QpICgoY2QpLT5wYXJzZV9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9JTlNFUlRfT1BFUkFORChjZCkgKChjZCktPmluc2VydF9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9FWFRSQUNUX09QRVJBTkQoY2QpICgoY2QpLT5leHRyYWN0X29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX1BSSU5UX09QRVJBTkQoY2QpICgoY2QpLT5wcmludF9vcGVyYW5kKQotCi0gIC8qIFNpemUgb2YgQ0dFTl9GSUVMRFMgc3RydWN0LiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemVvZl9maWVsZHM7Ci0jZGVmaW5lIENHRU5fQ1BVX1NJWkVPRl9GSUVMRFMoY2QpICgoY2QpLT5zaXplb2ZfZmllbGRzKQotCi0gIC8qIFNldCB0aGUgYml0c2l6ZSBmaWVsZC4gICovCi0gIHZvaWQgKCpzZXRfZmllbGRzX2JpdHNpemUpIFBBUkFNUyAoKENHRU5fRklFTERTICpmaWVsZHNfLCBpbnQgc2l6ZV8pKTsKLSNkZWZpbmUgQ0dFTl9DUFVfU0VUX0ZJRUxEU19CSVRTSVpFKGNkKSAoKGNkKS0+c2V0X2ZpZWxkc19iaXRzaXplKQotCi0gIC8qIENHRU5fRklFTERTIGFjY2Vzc29ycy4gICovCi0gIGludCAoKmdldF9pbnRfb3BlcmFuZCkKLSAgICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHNfKSk7Ci0gIHZvaWQgKCpzZXRfaW50X29wZXJhbmQpCi0gICAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgaW50IHZhbHVlXykpOwotI2lmZGVmIEJGRF9WRVJTSU9OCi0gIGJmZF92bWEgKCpnZXRfdm1hX29wZXJhbmQpCi0gICAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBjb25zdCBDR0VOX0ZJRUxEUyAqZmllbGRzXykpOwotICB2b2lkICgqc2V0X3ZtYV9vcGVyYW5kKQotICAgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGJmZF92bWEgdmFsdWVfKSk7Ci0jZWxzZQotICBsb25nICgqZ2V0X3ZtYV9vcGVyYW5kKSAoKTsKLSAgdm9pZCAoKnNldF92bWFfb3BlcmFuZCkgKCk7Ci0jZW5kaWYKLSNkZWZpbmUgQ0dFTl9DUFVfR0VUX0lOVF9PUEVSQU5EKGNkKSAoKGNkKS0+Z2V0X2ludF9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9TRVRfSU5UX09QRVJBTkQoY2QpICgoY2QpLT5zZXRfaW50X29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX0dFVF9WTUFfT1BFUkFORChjZCkgKChjZCktPmdldF92bWFfb3BlcmFuZCkKLSNkZWZpbmUgQ0dFTl9DUFVfU0VUX1ZNQV9PUEVSQU5EKGNkKSAoKGNkKS0+c2V0X3ZtYV9vcGVyYW5kKQotCi0gIC8qIEluc3RydWN0aW9uIHBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGhhbmRsZXJzLiAgKi8KLSAgLyogRklYTUU6IG1ha2UgdGhlc2UgdHlwZXMgdXBwZXJjYXNlLiAgKi8KLSAgY2dlbl9wYXJzZV9mbiAqIGNvbnN0ICpwYXJzZV9oYW5kbGVyczsKLSAgY2dlbl9pbnNlcnRfZm4gKiBjb25zdCAqaW5zZXJ0X2hhbmRsZXJzOwotICBjZ2VuX2V4dHJhY3RfZm4gKiBjb25zdCAqZXh0cmFjdF9oYW5kbGVyczsKLSAgY2dlbl9wcmludF9mbiAqIGNvbnN0ICpwcmludF9oYW5kbGVyczsKLSNkZWZpbmUgQ0dFTl9QQVJTRV9GTihjZCwgaW5zbikgICAoY2QtPnBhcnNlX2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5wYXJzZV0pCi0jZGVmaW5lIENHRU5fSU5TRVJUX0ZOKGNkLCBpbnNuKSAgKGNkLT5pbnNlcnRfaGFuZGxlcnNbKGluc24pLT5vcGNvZGUtPmhhbmRsZXJzLmluc2VydF0pCi0jZGVmaW5lIENHRU5fRVhUUkFDVF9GTihjZCwgaW5zbikgKGNkLT5leHRyYWN0X2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5leHRyYWN0XSkKLSNkZWZpbmUgQ0dFTl9QUklOVF9GTihjZCwgaW5zbikgICAoY2QtPnByaW50X2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5wcmludF0pCi0KLSAgLyogUmV0dXJuIG5vbi16ZXJvIGlmIGluc24gc2hvdWxkIGJlIGFkZGVkIHRvIGhhc2ggdGFibGUuICAqLwotICBpbnQgKCogYXNtX2hhc2hfcCkgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLQotICAvKiBBc3NlbWJsZXIgaGFzaCBmdW5jdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCAoKiBhc21faGFzaCkgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gYXNzZW1ibGVyIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgYXNtX2hhc2hfc2l6ZTsKLQotICAvKiBSZXR1cm4gbm9uLXplcm8gaWYgaW5zbiBzaG91bGQgYmUgYWRkZWQgdG8gaGFzaCB0YWJsZS4gICovCi0gIGludCAoKiBkaXNfaGFzaF9wKSBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotCi0gIC8qIERpc2Fzc2VtYmxlciBoYXNoIGZ1bmN0aW9uLiAgKi8KLSAgdW5zaWduZWQgaW50ICgqIGRpc19oYXNoKSBQQVJBTVMgKChjb25zdCBjaGFyICosIENHRU5fSU5TTl9JTlQpKTsKLQotICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBkaXNhc3NlbWJsZXIgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBkaXNfaGFzaF9zaXplOwotCi0gIC8qIEFzc2VtYmxlciBpbnN0cnVjdGlvbiBoYXNoIHRhYmxlLiAgKi8KLSAgQ0dFTl9JTlNOX0xJU1QgKiphc21faGFzaF90YWJsZTsKLSAgQ0dFTl9JTlNOX0xJU1QgKmFzbV9oYXNoX3RhYmxlX2VudHJpZXM7Ci0KLSAgLyogRGlzYXNzZW1ibGVyIGluc3RydWN0aW9uIGhhc2ggdGFibGUuICAqLwotICBDR0VOX0lOU05fTElTVCAqKmRpc19oYXNoX3RhYmxlOwotICBDR0VOX0lOU05fTElTVCAqZGlzX2hhc2hfdGFibGVfZW50cmllczsKLX0gQ0dFTl9DUFVfVEFCTEU7Ci0KLS8qIHdpcCAqLwotI2lmbmRlZiBDR0VOX1dPUkRfRU5ESUFOCi0jZGVmaW5lIENHRU5fV09SRF9FTkRJQU4oY2QpIENHRU5fQ1BVX0VORElBTiAoY2QpCi0jZW5kaWYKLSNpZm5kZWYgQ0dFTl9JTlNOX1dPUkRfRU5ESUFOCi0jZGVmaW5lIENHRU5fSU5TTl9XT1JEX0VORElBTihjZCkgQ0dFTl9DUFVfSU5TTl9FTkRJQU4gKGNkKQotI2VuZGlmCi0MCi0vKiBQcm90b3R5cGVzIG9mIG1ham9yIGZ1bmN0aW9ucy4gICovCi0vKiBGSVhNRTogTW92ZSBtb3JlIENHRU5fU1lNLWRlZmluZWQgZnVuY3Rpb25zIGludG8gQ0dFTl9DUFVfREVTQy4KLSAgIE5vdCB0aGUgaW5pdCBmbnMgdGhvdWdoLCBhcyB0aGF0IHdvdWxkIGRyYWcgaW4gdGhpbmdzIHRoYXQgbWlnaHRuJ3QgYmUKLSAgIHVzZWQgYW5kIG1pZ2h0IG5vdCBldmVuIGV4aXN0LiAgKi8KLQotLyogQXJndW1lbnQgdHlwZXMgdG8gY3B1X29wZW4uICAqLwotCi1lbnVtIGNnZW5fY3B1X29wZW5fYXJnIHsKLSAgQ0dFTl9DUFVfT1BFTl9FTkQsCi0gIC8qIFNlbGVjdCBpbnN0cnVjdGlvbiBzZXQocyksIGFyZyBpcyBiaXRtYXAgb3IgMCBtZWFuaW5nICJ1bnNwZWNpZmllZCIuICAqLwotICBDR0VOX0NQVV9PUEVOX0lTQVMsCi0gIC8qIFNlbGVjdCBtYWNoaW5lKHMpLCBhcmcgaXMgYml0bWFwIG9yIDAgbWVhbmluZyAidW5zcGVjaWZpZWQiLiAgKi8KLSAgQ0dFTl9DUFVfT1BFTl9NQUNIUywKLSAgLyogU2VsZWN0IG1hY2hpbmUsIGFyZyBpcyBtYWNoJ3MgYmZkIG5hbWUuCi0gICAgIE11bHRpcGxlIG1hY2hpbmVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgcmVwZWF0ZWQgdXNlLiAgKi8KLSAgQ0dFTl9DUFVfT1BFTl9CRkRNQUNILAotICAvKiBTZWxlY3QgZW5kaWFuLCBhcmcgaXMgQ0dFTl9FTkRJQU5fKi4gICovCi0gIENHRU5fQ1BVX09QRU5fRU5ESUFOCi19OwotCi0vKiBPcGVuIGEgY3B1IGRlc2NyaXB0b3IgdGFibGUgZm9yIHVzZS4KLSAgID8/PyBXZSBvbmx5IHN1cHBvcnQgSVNPIEMgc3RkYXJncyBoZXJlLCBub3QgSyZSLgotICAgTGF6aW5lc3MsIHBsdXMgZXhwZXJpbWVudCB0byBzZWUgaWYgYW55dGhpbmcgcmVxdWlyZXMgSyZSIC0gZXZlbnR1YWxseQotICAgSyZSIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCAtIGUuZy4gR0RCIGlzIGN1cnJlbnRseSB0cnlpbmcgdGhpcy4gICovCi0KLWV4dGVybiBDR0VOX0NQVV9ERVNDIENHRU5fU1lNIChjcHVfb3BlbikgKGVudW0gY2dlbl9jcHVfb3Blbl9hcmcsIC4uLik7Ci0KLS8qIENvdmVyIGZuIHRvIGhhbmRsZSBzaW1wbGUgY2FzZS4gICovCi0KLWV4dGVybiBDR0VOX0NQVV9ERVNDIENHRU5fU1lNIChjcHVfb3Blbl8xKSBQQVJBTVMgKChjb25zdCBjaGFyICptYWNoX25hbWVfLAotCQkJCQkJICAgIGVudW0gY2dlbl9lbmRpYW4gZW5kaWFuXykpOwotCi0vKiBDbG9zZSBpdC4gICovCi0KLWV4dGVybiB2b2lkIENHRU5fU1lNIChjcHVfY2xvc2UpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLQotLyogSW5pdGlhbGl6ZSB0aGUgb3Bjb2RlIHRhYmxlIGZvciB1c2UuCi0gICBDYWxsZWQgYnkgaW5pdF9hc20vaW5pdF9kaXMuICAqLwotCi1leHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9vcGNvZGVfdGFibGUpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MgY2RfKSk7Ci0KLS8qIEluaXRpYWxpemUgdGhlIGlibGQgdGFibGUgZm9yIHVzZS4KLSAgIENhbGxlZCBieSBpbml0X2FzbS9pbml0X2Rpcy4gICovCi0KLWV4dGVybiB2b2lkIENHRU5fU1lNIChpbml0X2libGRfdGFibGUpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MgY2RfKSk7Ci0KLS8qIEluaXRpYWxpemUgYW4gY3B1IHRhYmxlIGZvciBhc3NlbWJsZXIgb3IgZGlzYXNzZW1ibGVyIHVzZS4KLSAgIFRoZXNlIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGNwdV9vcGVuLiAgKi8KLQotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGluaXRfYXNtKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci1leHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9kaXMpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLQotLyogSW5pdGlhbGl6ZSB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZSBmb3IgdXNlLiAgKi8KLQotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGluaXRfb3BpbnN0X3RhYmxlKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDIGNkXykpOwotCi0vKiBBc3NlbWJsZSBhbiBpbnN0cnVjdGlvbi4gICovCi0KLWV4dGVybiBjb25zdCBDR0VOX0lOU04gKiBDR0VOX1NZTSAoYXNzZW1ibGVfaW5zbikKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqLCBDR0VOX0ZJRUxEUyAqLAotCSAgICAgIENHRU5fSU5TTl9CWVRFU19QVFIsIGNoYXIgKiopKTsKLQotZXh0ZXJuIGNvbnN0IENHRU5fS0VZV09SRCBDR0VOX1NZTSAob3BlcmFuZF9tYWNoKTsKLWV4dGVybiBpbnQgQ0dFTl9TWU0gKGdldF9tYWNoKSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyogT3BlcmFuZCBpbmRleCBjb21wdXRhdGlvbi4gICovCi1leHRlcm4gY29uc3QgQ0dFTl9JTlNOICogY2dlbl9sb29rdXBfaW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiBpbnNuXywKLQkgICAgICBDR0VOX0lOU05fSU5UIGludF92YWx1ZV8sIHVuc2lnbmVkIGNoYXIgKmJ5dGVzX3ZhbHVlXywKLQkgICAgICBpbnQgbGVuZ3RoXywgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGludCBhbGlhc19wXykpOwotZXh0ZXJuIHZvaWQgY2dlbl9nZXRfaW5zbl9vcGVyYW5kcwotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiBpbnNuXywKLQkgICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgaW50ICppbmRpY2VzXykpOwotZXh0ZXJuIGNvbnN0IENHRU5fSU5TTiAqIGNnZW5fbG9va3VwX2dldF9pbnNuX29wZXJhbmRzCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqaW5zbl8sCi0JICAgICAgQ0dFTl9JTlNOX0lOVCBpbnRfdmFsdWVfLCB1bnNpZ25lZCBjaGFyICpieXRlc192YWx1ZV8sCi0JICAgICAgaW50IGxlbmd0aF8sIGludCAqaW5kaWNlc18sIENHRU5fRklFTERTICpmaWVsZHNfKSk7Ci0KLS8qIENvdmVyIGZucyB0byBiZmRfZ2V0L3NldC4gICovCi0KLWV4dGVybiBDR0VOX0lOU05fSU5UIGNnZW5fZ2V0X2luc25fdmFsdWUKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgdW5zaWduZWQgY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGNnZW5fcHV0X2luc25fdmFsdWUKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgdW5zaWduZWQgY2hhciAqLCBpbnQsIENHRU5fSU5TTl9JTlQpKTsKLQotLyogUmVhZCBpbiBhIGNwdSBkZXNjcmlwdGlvbiBmaWxlLgotICAgPz8/IEZvciBmdXR1cmUgY29uY2VybnMsIGluY2x1ZGluZyBhZGRpbmcgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBhc3NlbWJsZXIvCi0gICBkaXNhc3NlbWJsZXIgYXQgcnVuLXRpbWUuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqIGNnZW5fcmVhZF9jcHVfZmlsZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICogZmlsZW5hbWVfKSk7Ci0KLSNlbmRpZiAvKiBDR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2NvbnZleC5oIGIvaW5jbHVkZS9vcGNvZGUvY29udmV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYWVlYmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvY29udmV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzExICswLDAgQEAKLS8qIEluZm9ybWF0aW9uIGZvciBpbnN0cnVjdGlvbiBkaXNhc3NlbWJseSBvbiB0aGUgQ29udmV4LgotICAgQ29weXJpZ2h0IDE5ODksIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZglDT05TVAotI2RlZmluZQlDT05TVAotI2VuZGlmCS8qIENPTlNUICovCi0KLSNkZWZpbmUgeHh4IDAKLSNkZWZpbmUgcnJyIDEKLSNkZWZpbmUgcnIgMgotI2RlZmluZSByeHIgMwotI2RlZmluZSByIDQKLSNkZWZpbmUgbm9wcyA1Ci0jZGVmaW5lIG5yIDYKLSNkZWZpbmUgcGNyZWwgNwotI2RlZmluZSBsciA4Ci0jZGVmaW5lIHJ4bCA5Ci0jZGVmaW5lIHJsciAxMAotI2RlZmluZSBycmwgMTEKLSNkZWZpbmUgaW1sIDEyCi0jZGVmaW5lIGltciAxMwotI2RlZmluZSBhMXIgMTQKLSNkZWZpbmUgYTFsIDE1Ci0jZGVmaW5lIGEyciAxNgotI2RlZmluZSBhMmwgMTcKLSNkZWZpbmUgYTMgMTgKLSNkZWZpbmUgYTQgMTkKLSNkZWZpbmUgYTUgMjAKLSNkZWZpbmUgViAxCi0jZGVmaW5lIFMgMgotI2RlZmluZSBWTSAzCi0jZGVmaW5lIEEgNAotI2RlZmluZSBWTCA1Ci0jZGVmaW5lIFZTIDYKLSNkZWZpbmUgVkxTIDcKLSNkZWZpbmUgUFNXIDgKLS8qIFByZXZlbnQgYW4gZXJyb3IgZHVyaW5nICJtYWtlIGRlcGVuZCIuICAqLwotI2lmICFkZWZpbmVkIChQQykKLSNkZWZpbmUgUEMgOQotI2VuZGlmCi0jZGVmaW5lIElUUiAxMAotI2RlZmluZSBWViAxMQotI2RlZmluZSBJVFNSIDEyCi0jZGVmaW5lIFRPQyAxMwotI2RlZmluZSBDSVIgMTQKLSNkZWZpbmUgVFRSIDE1Ci0jZGVmaW5lIFZNVSAxNgotI2RlZmluZSBWTUwgMTcKLSNkZWZpbmUgSUNSIDE4Ci0jZGVmaW5lIFRDUFUgMTkKLSNkZWZpbmUgQ1BVSUQgMjAKLSNkZWZpbmUgVElEIDIxCi0KLUNPTlNUIGNoYXIgKm9wW10gPSB7Ci0gICIiLAotICAidjBcMHYxXDB2MlwwdjNcMHY0XDB2NVwwdjZcMHY3IiwKLSAgInMwXDBzMVwwczJcMHMzXDBzNFwwczVcMHM2XDBzNyIsCi0gICJ2bSIsCi0gICJzcFwwYTFcMGEyXDBhM1wwYTRcMGE1XDBhcFwwZnAiLAotICAidmwiLAotICAidnMiLAotICAidmxzIiwKLSAgInBzdyIsCi0gICJwYyIsCi0gICJpdHIiLAotICAidnYiLAotICAiaXRzciIsCi0gICJ0b2MiLAotICAiY2lyIiwKLSAgInR0ciIsCi0gICJ2bXUiLAotICAidm1sIiwKLSAgImljciIsCi0gICJ0Y3B1IiwKLSAgImNwdWlkIiwKLSAgInRpZCIsCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQwW10gPSB7Ci0gIHswLDAscnJyLFYsUyxTfSwJLyogbW92ICovCi0gIHswLDAscnJyLFMsUyxWfSwJLyogbW92ICovCi0gIHsxLDEscnJyLFYsVixWfSwJLyogbWVyZy50ICovCi0gIHsyLDEscnJyLFYsVixWfSwJLyogbWFzay50ICovCi0gIHsxLDIscnJyLFYsUyxWfSwJLyogbWVyZy5mICovCi0gIHsyLDIscnJyLFYsUyxWfSwJLyogbWFzay5mICovCi0gIHsxLDEscnJyLFYsUyxWfSwJLyogbWVyZy50ICovCi0gIHsyLDEscnJyLFYsUyxWfSwJLyogbWFzay50ICovCi0gIHszLDMscnJyLFYsVixWfSwJLyogbXVsLnMgKi8KLSAgezMsNCxycnIsVixWLFZ9LAkvKiBtdWwuZCAqLwotICB7NCwzLHJycixWLFYsVn0sCS8qIGRpdi5zICovCi0gIHs0LDQscnJyLFYsVixWfSwJLyogZGl2LmQgKi8KLSAgezMsMyxycnIsVixTLFZ9LAkvKiBtdWwucyAqLwotICB7Myw0LHJycixWLFMsVn0sCS8qIG11bC5kICovCi0gIHs0LDMscnJyLFYsUyxWfSwJLyogZGl2LnMgKi8KLSAgezQsNCxycnIsVixTLFZ9LAkvKiBkaXYuZCAqLwotICB7NSwwLHJycixWLFYsVn0sCS8qIGFuZCAqLwotICB7NiwwLHJycixWLFYsVn0sCS8qIG9yICovCi0gIHs3LDAscnJyLFYsVixWfSwJLyogeG9yICovCi0gIHs4LDAscnJyLFYsVixWfSwJLyogc2hmICovCi0gIHs1LDAscnJyLFYsUyxWfSwJLyogYW5kICovCi0gIHs2LDAscnJyLFYsUyxWfSwJLyogb3IgKi8KLSAgezcsMCxycnIsVixTLFZ9LAkvKiB4b3IgKi8KLSAgezgsMCxycnIsVixTLFZ9LAkvKiBzaGYgKi8KLSAgezksMyxycnIsVixWLFZ9LAkvKiBhZGQucyAqLwotICB7OSw0LHJycixWLFYsVn0sCS8qIGFkZC5kICovCi0gIHsxMCwzLHJycixWLFYsVn0sCS8qIHN1Yi5zICovCi0gIHsxMCw0LHJycixWLFYsVn0sCS8qIHN1Yi5kICovCi0gIHs5LDMscnJyLFYsUyxWfSwJLyogYWRkLnMgKi8KLSAgezksNCxycnIsVixTLFZ9LAkvKiBhZGQuZCAqLwotICB7MTAsMyxycnIsVixTLFZ9LAkvKiBzdWIucyAqLwotICB7MTAsNCxycnIsVixTLFZ9LAkvKiBzdWIuZCAqLwotICB7OSw1LHJycixWLFYsVn0sCS8qIGFkZC5iICovCi0gIHs5LDYscnJyLFYsVixWfSwJLyogYWRkLmggKi8KLSAgezksNyxycnIsVixWLFZ9LAkvKiBhZGQudyAqLwotICB7OSw4LHJycixWLFYsVn0sCS8qIGFkZC5sICovCi0gIHs5LDUscnJyLFYsUyxWfSwJLyogYWRkLmIgKi8KLSAgezksNixycnIsVixTLFZ9LAkvKiBhZGQuaCAqLwotICB7OSw3LHJycixWLFMsVn0sCS8qIGFkZC53ICovCi0gIHs5LDgscnJyLFYsUyxWfSwJLyogYWRkLmwgKi8KLSAgezEwLDUscnJyLFYsVixWfSwJLyogc3ViLmIgKi8KLSAgezEwLDYscnJyLFYsVixWfSwJLyogc3ViLmggKi8KLSAgezEwLDcscnJyLFYsVixWfSwJLyogc3ViLncgKi8KLSAgezEwLDgscnJyLFYsVixWfSwJLyogc3ViLmwgKi8KLSAgezEwLDUscnJyLFYsUyxWfSwJLyogc3ViLmIgKi8KLSAgezEwLDYscnJyLFYsUyxWfSwJLyogc3ViLmggKi8KLSAgezEwLDcscnJyLFYsUyxWfSwJLyogc3ViLncgKi8KLSAgezEwLDgscnJyLFYsUyxWfSwJLyogc3ViLmwgKi8KLSAgezMsNSxycnIsVixWLFZ9LAkvKiBtdWwuYiAqLwotICB7Myw2LHJycixWLFYsVn0sCS8qIG11bC5oICovCi0gIHszLDcscnJyLFYsVixWfSwJLyogbXVsLncgKi8KLSAgezMsOCxycnIsVixWLFZ9LAkvKiBtdWwubCAqLwotICB7Myw1LHJycixWLFMsVn0sCS8qIG11bC5iICovCi0gIHszLDYscnJyLFYsUyxWfSwJLyogbXVsLmggKi8KLSAgezMsNyxycnIsVixTLFZ9LAkvKiBtdWwudyAqLwotICB7Myw4LHJycixWLFMsVn0sCS8qIG11bC5sICovCi0gIHs0LDUscnJyLFYsVixWfSwJLyogZGl2LmIgKi8KLSAgezQsNixycnIsVixWLFZ9LAkvKiBkaXYuaCAqLwotICB7NCw3LHJycixWLFYsVn0sCS8qIGRpdi53ICovCi0gIHs0LDgscnJyLFYsVixWfSwJLyogZGl2LmwgKi8KLSAgezQsNSxycnIsVixTLFZ9LAkvKiBkaXYuYiAqLwotICB7NCw2LHJycixWLFMsVn0sCS8qIGRpdi5oICovCi0gIHs0LDcscnJyLFYsUyxWfSwJLyogZGl2LncgKi8KLSAgezQsOCxycnIsVixTLFZ9LAkvKiBkaXYubCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0MVtdID0gewotICB7MTEsMCx4eHgsMCwwLDB9LAkvKiBleGl0ICovCi0gIHsxMiwwLGEzLDAsMCwwfSwJLyogam1wICovCi0gIHsxMywyLGEzLDAsMCwwfSwJLyogam1waS5mICovCi0gIHsxMywxLGEzLDAsMCwwfSwJLyogam1waS50ICovCi0gIHsxNCwyLGEzLDAsMCwwfSwJLyogam1wYS5mICovCi0gIHsxNCwxLGEzLDAsMCwwfSwJLyogam1wYS50ICovCi0gIHsxNSwyLGEzLDAsMCwwfSwJLyogam1wcy5mICovCi0gIHsxNSwxLGEzLDAsMCwwfSwJLyogam1wcy50ICovCi0gIHsxNiwwLGEzLDAsMCwwfSwJLyogdGFjICovCi0gIHsxNywwLGExcixBLDAsMH0sCS8qIGxkZWEgKi8KLSAgezE4LDgsYTFsLFZMUywwLDB9LAkvKiBsZC5sICovCi0gIHsxOCw5LGExbCxWTSwwLDB9LAkvKiBsZC54ICovCi0gIHsxOSwwLGEzLDAsMCwwfSwJLyogdGFzICovCi0gIHsyMCwwLGEzLDAsMCwwfSwJLyogcHNoZWEgKi8KLSAgezIxLDgsYTJsLFZMUywwLDB9LAkvKiBzdC5sICovCi0gIHsyMSw5LGEybCxWTSwwLDB9LAkvKiBzdC54ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsyMiwwLGEzLDAsMCwwfSwJLyogY2FsbCAqLwotICB7MjMsMCxhMywwLDAsMH0sCS8qIGNhbGxzICovCi0gIHsyNCwwLGEzLDAsMCwwfSwJLyogY2FsbHEgKi8KLSAgezI1LDAsYTFyLEEsMCwwfSwJLyogcGZvcmsgKi8KLSAgezI2LDUsYTJyLFMsMCwwfSwJLyogc3RlLmIgKi8KLSAgezI2LDYsYTJyLFMsMCwwfSwJLyogc3RlLmggKi8KLSAgezI2LDcsYTJyLFMsMCwwfSwJLyogc3RlLncgKi8KLSAgezI2LDgsYTJyLFMsMCwwfSwJLyogc3RlLmwgKi8KLSAgezE4LDUsYTFyLEEsMCwwfSwJLyogbGQuYiAqLwotICB7MTgsNixhMXIsQSwwLDB9LAkvKiBsZC5oICovCi0gIHsxOCw3LGExcixBLDAsMH0sCS8qIGxkLncgKi8KLSAgezI3LDcsYTFyLEEsMCwwfSwJLyogaW5jci53ICovCi0gIHsyMSw1LGEycixBLDAsMH0sCS8qIHN0LmIgKi8KLSAgezIxLDYsYTJyLEEsMCwwfSwJLyogc3QuaCAqLwotICB7MjEsNyxhMnIsQSwwLDB9LAkvKiBzdC53ICovCi0gIHsyNyw4LGExcixTLDAsMH0sCS8qIGluY3IubCAqLwotICB7MTgsNSxhMXIsUywwLDB9LAkvKiBsZC5iICovCi0gIHsxOCw2LGExcixTLDAsMH0sCS8qIGxkLmggKi8KLSAgezE4LDcsYTFyLFMsMCwwfSwJLyogbGQudyAqLwotICB7MTgsOCxhMXIsUywwLDB9LAkvKiBsZC5sICovCi0gIHsyMSw1LGEycixTLDAsMH0sCS8qIHN0LmIgKi8KLSAgezIxLDYsYTJyLFMsMCwwfSwJLyogc3QuaCAqLwotICB7MjEsNyxhMnIsUywwLDB9LAkvKiBzdC53ICovCi0gIHsyMSw4LGEycixTLDAsMH0sCS8qIHN0LmwgKi8KLSAgezE4LDUsYTFyLFYsMCwwfSwJLyogbGQuYiAqLwotICB7MTgsNixhMXIsViwwLDB9LAkvKiBsZC5oICovCi0gIHsxOCw3LGExcixWLDAsMH0sCS8qIGxkLncgKi8KLSAgezE4LDgsYTFyLFYsMCwwfSwJLyogbGQubCAqLwotICB7MjEsNSxhMnIsViwwLDB9LAkvKiBzdC5iICovCi0gIHsyMSw2LGEycixWLDAsMH0sCS8qIHN0LmggKi8KLSAgezIxLDcsYTJyLFYsMCwwfSwJLyogc3QudyAqLwotICB7MjEsOCxhMnIsViwwLDB9LAkvKiBzdC5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQyW10gPSB7Ci0gIHsyOCw1LHJyLEEsQSwwfSwJLyogY3Z0dy5iICovCi0gIHsyOCw2LHJyLEEsQSwwfSwJLyogY3Z0dy5oICovCi0gIHsyOSw3LHJyLEEsQSwwfSwJLyogY3Z0Yi53ICovCi0gIHszMCw3LHJyLEEsQSwwfSwJLyogY3Z0aC53ICovCi0gIHsyOCw1LHJyLFMsUywwfSwJLyogY3Z0dy5iICovCi0gIHsyOCw2LHJyLFMsUywwfSwJLyogY3Z0dy5oICovCi0gIHsyOSw3LHJyLFMsUywwfSwJLyogY3Z0Yi53ICovCi0gIHszMCw3LHJyLFMsUywwfSwJLyogY3Z0aC53ICovCi0gIHsyOCwzLHJyLFMsUywwfSwJLyogY3Z0dy5zICovCi0gIHszMSw3LHJyLFMsUywwfSwJLyogY3Z0cy53ICovCi0gIHszMiwzLHJyLFMsUywwfSwJLyogY3Z0ZC5zICovCi0gIHszMSw0LHJyLFMsUywwfSwJLyogY3Z0cy5kICovCi0gIHszMSw4LHJyLFMsUywwfSwJLyogY3Z0cy5sICovCi0gIHszMiw4LHJyLFMsUywwfSwJLyogY3Z0ZC5sICovCi0gIHszMywzLHJyLFMsUywwfSwJLyogY3Z0bC5zICovCi0gIHszMyw0LHJyLFMsUywwfSwJLyogY3Z0bC5kICovCi0gIHszNCwwLHJyLEEsQSwwfSwJLyogbGRwYSAqLwotICB7OCwwLG5yLEEsMCwwfSwJLyogc2hmICovCi0gIHsxOCw2LG5yLEEsMCwwfSwJLyogbGQuaCAqLwotICB7MTgsNyxucixBLDAsMH0sCS8qIGxkLncgKi8KLSAgezMzLDcscnIsUyxTLDB9LAkvKiBjdnRsLncgKi8KLSAgezI4LDgscnIsUyxTLDB9LAkvKiBjdnR3LmwgKi8KLSAgezM1LDEscnIsUyxTLDB9LAkvKiBwbGMudCAqLwotICB7MzYsMCxycixTLFMsMH0sCS8qIHR6YyAqLwotICB7MzcsNixycixBLEEsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcscnIsQSxBLDB9LAkvKiBlcS53ICovCi0gIHszNyw2LG5yLEEsMCwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxucixBLDAsMH0sCS8qIGVxLncgKi8KLSAgezM3LDUscnIsUyxTLDB9LAkvKiBlcS5iICovCi0gIHszNyw2LHJyLFMsUywwfSwJLyogZXEuaCAqLwotICB7MzcsNyxycixTLFMsMH0sCS8qIGVxLncgKi8KLSAgezM3LDgscnIsUyxTLDB9LAkvKiBlcS5sICovCi0gIHszOCw2LHJyLEEsQSwwfSwJLyogbGV1LmggKi8KLSAgezM4LDcscnIsQSxBLDB9LAkvKiBsZXUudyAqLwotICB7MzgsNixucixBLDAsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LG5yLEEsMCwwfSwJLyogbGV1LncgKi8KLSAgezM4LDUscnIsUyxTLDB9LAkvKiBsZXUuYiAqLwotICB7MzgsNixycixTLFMsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LHJyLFMsUywwfSwJLyogbGV1LncgKi8KLSAgezM4LDgscnIsUyxTLDB9LAkvKiBsZXUubCAqLwotICB7MzksNixycixBLEEsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LHJyLEEsQSwwfSwJLyogbHR1LncgKi8KLSAgezM5LDYsbnIsQSwwLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxucixBLDAsMH0sCS8qIGx0dS53ICovCi0gIHszOSw1LHJyLFMsUywwfSwJLyogbHR1LmIgKi8KLSAgezM5LDYscnIsUyxTLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxycixTLFMsMH0sCS8qIGx0dS53ICovCi0gIHszOSw4LHJyLFMsUywwfSwJLyogbHR1LmwgKi8KLSAgezQwLDYscnIsQSxBLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LHJyLEEsQSwwfSwJLyogbGUudyAqLwotICB7NDAsNixucixBLDAsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcsbnIsQSwwLDB9LAkvKiBsZS53ICovCi0gIHs0MCw1LHJyLFMsUywwfSwJLyogbGUuYiAqLwotICB7NDAsNixycixTLFMsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcscnIsUyxTLDB9LAkvKiBsZS53ICovCi0gIHs0MCw4LHJyLFMsUywwfSwJLyogbGUubCAqLwotICB7NDEsNixycixBLEEsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcscnIsQSxBLDB9LAkvKiBsdC53ICovCi0gIHs0MSw2LG5yLEEsMCwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxucixBLDAsMH0sCS8qIGx0LncgKi8KLSAgezQxLDUscnIsUyxTLDB9LAkvKiBsdC5iICovCi0gIHs0MSw2LHJyLFMsUywwfSwJLyogbHQuaCAqLwotICB7NDEsNyxycixTLFMsMH0sCS8qIGx0LncgKi8KLSAgezQxLDgscnIsUyxTLDB9LAkvKiBsdC5sICovCi0gIHs5LDcscnIsUyxBLDB9LAkvKiBhZGQudyAqLwotICB7OCwwLHJyLEEsQSwwfSwJLyogc2hmICovCi0gIHswLDAscnIsQSxBLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxycixTLEEsMH0sCS8qIG1vdiAqLwotICB7MCw3LHJyLFMsUywwfSwJLyogbW92LncgKi8KLSAgezgsMCxycixTLFMsMH0sCS8qIHNoZiAqLwotICB7MCwwLHJyLFMsUywwfSwJLyogbW92ICovCi0gIHswLDAscnIsQSxTLDB9LAkvKiBtb3YgKi8KLSAgezUsMCxycixBLEEsMH0sCS8qIGFuZCAqLwotICB7NiwwLHJyLEEsQSwwfSwJLyogb3IgKi8KLSAgezcsMCxycixBLEEsMH0sCS8qIHhvciAqLwotICB7NDIsMCxycixBLEEsMH0sCS8qIG5vdCAqLwotICB7NSwwLHJyLFMsUywwfSwJLyogYW5kICovCi0gIHs2LDAscnIsUyxTLDB9LAkvKiBvciAqLwotICB7NywwLHJyLFMsUywwfSwJLyogeG9yICovCi0gIHs0MiwwLHJyLFMsUywwfSwJLyogbm90ICovCi0gIHs0MCwzLHJyLFMsUywwfSwJLyogbGUucyAqLwotICB7NDAsNCxycixTLFMsMH0sCS8qIGxlLmQgKi8KLSAgezQxLDMscnIsUyxTLDB9LAkvKiBsdC5zICovCi0gIHs0MSw0LHJyLFMsUywwfSwJLyogbHQuZCAqLwotICB7OSwzLHJyLFMsUywwfSwJLyogYWRkLnMgKi8KLSAgezksNCxycixTLFMsMH0sCS8qIGFkZC5kICovCi0gIHsxMCwzLHJyLFMsUywwfSwJLyogc3ViLnMgKi8KLSAgezEwLDQscnIsUyxTLDB9LAkvKiBzdWIuZCAqLwotICB7MzcsMyxycixTLFMsMH0sCS8qIGVxLnMgKi8KLSAgezM3LDQscnIsUyxTLDB9LAkvKiBlcS5kICovCi0gIHs0Myw2LHJyLEEsQSwwfSwJLyogbmVnLmggKi8KLSAgezQzLDcscnIsQSxBLDB9LAkvKiBuZWcudyAqLwotICB7MywzLHJyLFMsUywwfSwJLyogbXVsLnMgKi8KLSAgezMsNCxycixTLFMsMH0sCS8qIG11bC5kICovCi0gIHs0LDMscnIsUyxTLDB9LAkvKiBkaXYucyAqLwotICB7NCw0LHJyLFMsUywwfSwJLyogZGl2LmQgKi8KLSAgezksNixycixBLEEsMH0sCS8qIGFkZC5oICovCi0gIHs5LDcscnIsQSxBLDB9LAkvKiBhZGQudyAqLwotICB7OSw2LG5yLEEsMCwwfSwJLyogYWRkLmggKi8KLSAgezksNyxucixBLDAsMH0sCS8qIGFkZC53ICovCi0gIHs5LDUscnIsUyxTLDB9LAkvKiBhZGQuYiAqLwotICB7OSw2LHJyLFMsUywwfSwJLyogYWRkLmggKi8KLSAgezksNyxycixTLFMsMH0sCS8qIGFkZC53ICovCi0gIHs5LDgscnIsUyxTLDB9LAkvKiBhZGQubCAqLwotICB7MTAsNixycixBLEEsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LHJyLEEsQSwwfSwJLyogc3ViLncgKi8KLSAgezEwLDYsbnIsQSwwLDB9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxucixBLDAsMH0sCS8qIHN1Yi53ICovCi0gIHsxMCw1LHJyLFMsUywwfSwJLyogc3ViLmIgKi8KLSAgezEwLDYscnIsUyxTLDB9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxycixTLFMsMH0sCS8qIHN1Yi53ICovCi0gIHsxMCw4LHJyLFMsUywwfSwJLyogc3ViLmwgKi8KLSAgezMsNixycixBLEEsMH0sCS8qIG11bC5oICovCi0gIHszLDcscnIsQSxBLDB9LAkvKiBtdWwudyAqLwotICB7Myw2LG5yLEEsMCwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxucixBLDAsMH0sCS8qIG11bC53ICovCi0gIHszLDUscnIsUyxTLDB9LAkvKiBtdWwuYiAqLwotICB7Myw2LHJyLFMsUywwfSwJLyogbXVsLmggKi8KLSAgezMsNyxycixTLFMsMH0sCS8qIG11bC53ICovCi0gIHszLDgscnIsUyxTLDB9LAkvKiBtdWwubCAqLwotICB7NCw2LHJyLEEsQSwwfSwJLyogZGl2LmggKi8KLSAgezQsNyxycixBLEEsMH0sCS8qIGRpdi53ICovCi0gIHs0LDYsbnIsQSwwLDB9LAkvKiBkaXYuaCAqLwotICB7NCw3LG5yLEEsMCwwfSwJLyogZGl2LncgKi8KLSAgezQsNSxycixTLFMsMH0sCS8qIGRpdi5iICovCi0gIHs0LDYscnIsUyxTLDB9LAkvKiBkaXYuaCAqLwotICB7NCw3LHJyLFMsUywwfSwJLyogZGl2LncgKi8KLSAgezQsOCxycixTLFMsMH0sCS8qIGRpdi5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQzW10gPSB7Ci0gIHszMiwzLHJyLFYsViwwfSwJLyogY3Z0ZC5zICovCi0gIHszMSw0LHJyLFYsViwwfSwJLyogY3Z0cy5kICovCi0gIHszMyw0LHJyLFYsViwwfSwJLyogY3Z0bC5kICovCi0gIHszMiw4LHJyLFYsViwwfSwJLyogY3Z0ZC5sICovCi0gIHswLDAscnJsLFMsUyxWTX0sCS8qIG1vdiAqLwotICB7MCwwLHJscixTLFZNLFN9LAkvKiBtb3YgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezQ0LDAscnIsUyxTLDB9LAkvKiBsb3AgKi8KLSAgezM2LDAscnIsVixWLDB9LAkvKiB0emMgKi8KLSAgezQ0LDAscnIsVixWLDB9LAkvKiBsb3AgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezQyLDAscnIsVixWLDB9LAkvKiBub3QgKi8KLSAgezgsMCxycixTLFYsMH0sCS8qIHNoZiAqLwotICB7MzUsMSxycixWLFYsMH0sCS8qIHBsYy50ICovCi0gIHs0NSwyLHJyLFYsViwwfSwJLyogY3Bycy5mICovCi0gIHs0NSwxLHJyLFYsViwwfSwJLyogY3Bycy50ICovCi0gIHszNywzLHJyLFYsViwwfSwJLyogZXEucyAqLwotICB7MzcsNCxycixWLFYsMH0sCS8qIGVxLmQgKi8KLSAgezQzLDMscnIsVixWLDB9LAkvKiBuZWcucyAqLwotICB7NDMsNCxycixWLFYsMH0sCS8qIG5lZy5kICovCi0gIHszNywzLHJyLFMsViwwfSwJLyogZXEucyAqLwotICB7MzcsNCxycixTLFYsMH0sCS8qIGVxLmQgKi8KLSAgezQzLDMscnIsUyxTLDB9LAkvKiBuZWcucyAqLwotICB7NDMsNCxycixTLFMsMH0sCS8qIG5lZy5kICovCi0gIHs0MCwzLHJyLFYsViwwfSwJLyogbGUucyAqLwotICB7NDAsNCxycixWLFYsMH0sCS8qIGxlLmQgKi8KLSAgezQxLDMscnIsVixWLDB9LAkvKiBsdC5zICovCi0gIHs0MSw0LHJyLFYsViwwfSwJLyogbHQuZCAqLwotICB7NDAsMyxycixTLFYsMH0sCS8qIGxlLnMgKi8KLSAgezQwLDQscnIsUyxWLDB9LAkvKiBsZS5kICovCi0gIHs0MSwzLHJyLFMsViwwfSwJLyogbHQucyAqLwotICB7NDEsNCxycixTLFYsMH0sCS8qIGx0LmQgKi8KLSAgezM3LDUscnIsVixWLDB9LAkvKiBlcS5iICovCi0gIHszNyw2LHJyLFYsViwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxycixWLFYsMH0sCS8qIGVxLncgKi8KLSAgezM3LDgscnIsVixWLDB9LAkvKiBlcS5sICovCi0gIHszNyw1LHJyLFMsViwwfSwJLyogZXEuYiAqLwotICB7MzcsNixycixTLFYsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcscnIsUyxWLDB9LAkvKiBlcS53ICovCi0gIHszNyw4LHJyLFMsViwwfSwJLyogZXEubCAqLwotICB7NDAsNSxycixWLFYsMH0sCS8qIGxlLmIgKi8KLSAgezQwLDYscnIsVixWLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LHJyLFYsViwwfSwJLyogbGUudyAqLwotICB7NDAsOCxycixWLFYsMH0sCS8qIGxlLmwgKi8KLSAgezQwLDUscnIsUyxWLDB9LAkvKiBsZS5iICovCi0gIHs0MCw2LHJyLFMsViwwfSwJLyogbGUuaCAqLwotICB7NDAsNyxycixTLFYsMH0sCS8qIGxlLncgKi8KLSAgezQwLDgscnIsUyxWLDB9LAkvKiBsZS5sICovCi0gIHs0MSw1LHJyLFYsViwwfSwJLyogbHQuYiAqLwotICB7NDEsNixycixWLFYsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcscnIsVixWLDB9LAkvKiBsdC53ICovCi0gIHs0MSw4LHJyLFYsViwwfSwJLyogbHQubCAqLwotICB7NDEsNSxycixTLFYsMH0sCS8qIGx0LmIgKi8KLSAgezQxLDYscnIsUyxWLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LHJyLFMsViwwfSwJLyogbHQudyAqLwotICB7NDEsOCxycixTLFYsMH0sCS8qIGx0LmwgKi8KLSAgezQzLDUscnIsVixWLDB9LAkvKiBuZWcuYiAqLwotICB7NDMsNixycixWLFYsMH0sCS8qIG5lZy5oICovCi0gIHs0Myw3LHJyLFYsViwwfSwJLyogbmVnLncgKi8KLSAgezQzLDgscnIsVixWLDB9LAkvKiBuZWcubCAqLwotICB7NDMsNSxycixTLFMsMH0sCS8qIG5lZy5iICovCi0gIHs0Myw2LHJyLFMsUywwfSwJLyogbmVnLmggKi8KLSAgezQzLDcscnIsUyxTLDB9LAkvKiBuZWcudyAqLwotICB7NDMsOCxycixTLFMsMH0sCS8qIG5lZy5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ0W10gPSB7Ci0gIHs0NiwwLG5vcHMsMCwwLDB9LAkvKiBub3AgKi8KLSAgezQ3LDAscGNyZWwsMCwwLDB9LAkvKiBiciAqLwotICB7NDgsMixwY3JlbCwwLDAsMH0sCS8qIGJyaS5mICovCi0gIHs0OCwxLHBjcmVsLDAsMCwwfSwJLyogYnJpLnQgKi8KLSAgezQ5LDIscGNyZWwsMCwwLDB9LAkvKiBicmEuZiAqLwotICB7NDksMSxwY3JlbCwwLDAsMH0sCS8qIGJyYS50ICovCi0gIHs1MCwyLHBjcmVsLDAsMCwwfSwJLyogYnJzLmYgKi8KLSAgezUwLDEscGNyZWwsMCwwLDB9LAkvKiBicnMudCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0NVtdID0gewotICB7NTEsNSxycixWLFYsMH0sCS8qIGxkdmkuYiAqLwotICB7NTEsNixycixWLFYsMH0sCS8qIGxkdmkuaCAqLwotICB7NTEsNyxycixWLFYsMH0sCS8qIGxkdmkudyAqLwotICB7NTEsOCxycixWLFYsMH0sCS8qIGxkdmkubCAqLwotICB7MjgsMyxycixWLFYsMH0sCS8qIGN2dHcucyAqLwotICB7MzEsNyxycixWLFYsMH0sCS8qIGN2dHMudyAqLwotICB7MjgsOCxycixWLFYsMH0sCS8qIGN2dHcubCAqLwotICB7MzMsNyxycixWLFYsMH0sCS8qIGN2dGwudyAqLwotICB7NTIsNSxyeHIsVixWLDB9LAkvKiBzdHZpLmIgKi8KLSAgezUyLDYscnhyLFYsViwwfSwJLyogc3R2aS5oICovCi0gIHs1Miw3LHJ4cixWLFYsMH0sCS8qIHN0dmkudyAqLwotICB7NTIsOCxyeHIsVixWLDB9LAkvKiBzdHZpLmwgKi8KLSAgezUyLDUscnhyLFMsViwwfSwJLyogc3R2aS5iICovCi0gIHs1Miw2LHJ4cixTLFYsMH0sCS8qIHN0dmkuaCAqLwotICB7NTIsNyxyeHIsUyxWLDB9LAkvKiBzdHZpLncgKi8KLSAgezUyLDgscnhyLFMsViwwfSwJLyogc3R2aS5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ2W10gPSB7Ci0gIHs1MywwLHIsQSwwLDB9LAkvKiBsZHNkciAqLwotICB7NTQsMCxyLEEsMCwwfSwJLyogbGRrZHIgKi8KLSAgezU1LDMscixTLDAsMH0sCS8qIGxuLnMgKi8KLSAgezU1LDQscixTLDAsMH0sCS8qIGxuLmQgKi8KLSAgezU2LDAsbm9wcywwLDAsMH0sCS8qIHBhdHUgKi8KLSAgezU3LDAscixBLDAsMH0sCS8qIHBhdGUgKi8KLSAgezU4LDAsbm9wcywwLDAsMH0sCS8qIHBpY2ggKi8KLSAgezU5LDAsbm9wcywwLDAsMH0sCS8qIHBsY2ggKi8KLSAgezAsMCxscixQU1csQSwwfSwJLyogbW92ICovCi0gIHswLDAscnhsLEEsUFNXLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixQQyxBLDB9LAkvKiBtb3YgKi8KLSAgezYwLDAscixTLDAsMH0sCS8qIGlkbGUgKi8KLSAgezAsMCxscixJVFIsUywwfSwJLyogbW92ICovCi0gIHswLDAscnhsLFMsSVRSLDB9LAkvKiBtb3YgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCxyeGwsUyxJVFNSLDB9LAkvKiBtb3YgKi8KLSAgezYxLDAsbm9wcywwLDAsMH0sCS8qIHJ0bnEgKi8KLSAgezYyLDAsbm9wcywwLDAsMH0sCS8qIGNmb3JrICovCi0gIHs2MywwLG5vcHMsMCwwLDB9LAkvKiBydG4gKi8KLSAgezY0LDAsbm9wcywwLDAsMH0sCS8qIHdmb3JrICovCi0gIHs2NSwwLG5vcHMsMCwwLDB9LAkvKiBqb2luICovCi0gIHs2NiwwLG5vcHMsMCwwLDB9LAkvKiBydG5jICovCi0gIHs2NywzLHIsUywwLDB9LAkvKiBleHAucyAqLwotICB7NjcsNCxyLFMsMCwwfSwJLyogZXhwLmQgKi8KLSAgezY4LDMscixTLDAsMH0sCS8qIHNpbi5zICovCi0gIHs2OCw0LHIsUywwLDB9LAkvKiBzaW4uZCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7NjksMyxyLFMsMCwwfSwJLyogY29zLnMgKi8KLSAgezY5LDQscixTLDAsMH0sCS8qIGNvcy5kICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs3MCw3LHIsQSwwLDB9LAkvKiBwc2gudyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7NzEsNyxyLEEsMCwwfSwJLyogcG9wLncgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezcwLDcscixTLDAsMH0sCS8qIHBzaC53ICovCi0gIHs3MCw4LHIsUywwLDB9LAkvKiBwc2gubCAqLwotICB7NzEsNyxyLFMsMCwwfSwJLyogcG9wLncgKi8KLSAgezcxLDgscixTLDAsMH0sCS8qIHBvcC5sICovCi0gIHs3MiwwLG5vcHMsMCwwLDB9LAkvKiBlbmkgKi8KLSAgezczLDAsbm9wcywwLDAsMH0sCS8qIGRzaSAqLwotICB7NzQsMCxub3BzLDAsMCwwfSwJLyogYmtwdCAqLwotICB7NzUsMCxub3BzLDAsMCwwfSwJLyogbXN5bmMgKi8KLSAgezc2LDAscixTLDAsMH0sCS8qIG1za2kgKi8KLSAgezc3LDAscixTLDAsMH0sCS8qIHhtdGkgKi8KLSAgezAsMCxyeGwsUyxWViwwfSwJLyogbW92ICovCi0gIHs3OCwwLG5vcHMsMCwwLDB9LAkvKiB0c3R2diAqLwotICB7MCwwLGxyLFZTLEEsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxBLFZTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixWTCxBLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsQSxWTCwwfSwJLyogbW92ICovCi0gIHswLDcsbHIsVlMsUywwfSwJLyogbW92LncgKi8KLSAgezAsNyxyeGwsUyxWUywwfSwJLyogbW92LncgKi8KLSAgezAsNyxscixWTCxTLDB9LAkvKiBtb3YudyAqLwotICB7MCw3LHJ4bCxTLFZMLDB9LAkvKiBtb3YudyAqLwotICB7NzksMCxyLEEsMCwwfSwJLyogZGlhZyAqLwotICB7ODAsMCxub3BzLDAsMCwwfSwJLyogcGJrcHQgKi8KLSAgezgxLDMscixTLDAsMH0sCS8qIHNxcnQucyAqLwotICB7ODEsNCxyLFMsMCwwfSwJLyogc3FydC5kICovCi0gIHs4MiwwLG5vcHMsMCwwLDB9LAkvKiBjYXNyICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MywzLHIsUywwLDB9LAkvKiBhdGFuLnMgKi8KLSAgezgzLDQscixTLDAsMH0sCS8qIGF0YW4uZCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0N1tdID0gewotICB7ODQsNSxyLFYsMCwwfSwJLyogc3VtLmIgKi8KLSAgezg0LDYscixWLDAsMH0sCS8qIHN1bS5oICovCi0gIHs4NCw3LHIsViwwLDB9LAkvKiBzdW0udyAqLwotICB7ODQsOCxyLFYsMCwwfSwJLyogc3VtLmwgKi8KLSAgezg1LDAscixWLDAsMH0sCS8qIGFsbCAqLwotICB7ODYsMCxyLFYsMCwwfSwJLyogYW55ICovCi0gIHs4NywwLHIsViwwLDB9LAkvKiBwYXJpdHkgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezg4LDUscixWLDAsMH0sCS8qIG1heC5iICovCi0gIHs4OCw2LHIsViwwLDB9LAkvKiBtYXguaCAqLwotICB7ODgsNyxyLFYsMCwwfSwJLyogbWF4LncgKi8KLSAgezg4LDgscixWLDAsMH0sCS8qIG1heC5sICovCi0gIHs4OSw1LHIsViwwLDB9LAkvKiBtaW4uYiAqLwotICB7ODksNixyLFYsMCwwfSwJLyogbWluLmggKi8KLSAgezg5LDcscixWLDAsMH0sCS8qIG1pbi53ICovCi0gIHs4OSw4LHIsViwwLDB9LAkvKiBtaW4ubCAqLwotICB7ODQsMyxyLFYsMCwwfSwJLyogc3VtLnMgKi8KLSAgezg0LDQscixWLDAsMH0sCS8qIHN1bS5kICovCi0gIHs5MCwzLHIsViwwLDB9LAkvKiBwcm9kLnMgKi8KLSAgezkwLDQscixWLDAsMH0sCS8qIHByb2QuZCAqLwotICB7ODgsMyxyLFYsMCwwfSwJLyogbWF4LnMgKi8KLSAgezg4LDQscixWLDAsMH0sCS8qIG1heC5kICovCi0gIHs4OSwzLHIsViwwLDB9LAkvKiBtaW4ucyAqLwotICB7ODksNCxyLFYsMCwwfSwJLyogbWluLmQgKi8KLSAgezkwLDUscixWLDAsMH0sCS8qIHByb2QuYiAqLwotICB7OTAsNixyLFYsMCwwfSwJLyogcHJvZC5oICovCi0gIHs5MCw3LHIsViwwLDB9LAkvKiBwcm9kLncgKi8KLSAgezkwLDgscixWLDAsMH0sCS8qIHByb2QubCAqLwotICB7MzUsMixscixWTSxTLDB9LAkvKiBwbGMuZiAqLwotICB7MzUsMSxscixWTSxTLDB9LAkvKiBwbGMudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0eFtdID0gewotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0MWFbXSA9IHsKLSAgezkxLDAsaW1yLEEsMCwwfSwJLyogaGFsdCAqLwotICB7OTIsMCxhNCwwLDAsMH0sCS8qIHN5c2MgKi8KLSAgezE4LDYsaW1yLEEsMCwwfSwJLyogbGQuaCAqLwotICB7MTgsNyxpbXIsQSwwLDB9LAkvKiBsZC53ICovCi0gIHs1LDAsaW1yLEEsMCwwfSwJLyogYW5kICovCi0gIHs2LDAsaW1yLEEsMCwwfSwJLyogb3IgKi8KLSAgezcsMCxpbXIsQSwwLDB9LAkvKiB4b3IgKi8KLSAgezgsMCxpbXIsQSwwLDB9LAkvKiBzaGYgKi8KLSAgezksNixpbXIsQSwwLDB9LAkvKiBhZGQuaCAqLwotICB7OSw3LGltcixBLDAsMH0sCS8qIGFkZC53ICovCi0gIHsxMCw2LGltcixBLDAsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LGltcixBLDAsMH0sCS8qIHN1Yi53ICovCi0gIHszLDYsaW1yLEEsMCwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxpbXIsQSwwLDB9LAkvKiBtdWwudyAqLwotICB7NCw2LGltcixBLDAsMH0sCS8qIGRpdi5oICovCi0gIHs0LDcsaW1yLEEsMCwwfSwJLyogZGl2LncgKi8KLSAgezE4LDcsaW1sLFZMLDAsMH0sCS8qIGxkLncgKi8KLSAgezE4LDcsaW1sLFZTLDAsMH0sCS8qIGxkLncgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezgsNyxpbXIsUywwLDB9LAkvKiBzaGYudyAqLwotICB7OTMsMCxhNSwwLDAsMH0sCS8qIHRyYXAgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezM3LDYsaW1yLEEsMCwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxpbXIsQSwwLDB9LAkvKiBlcS53ICovCi0gIHszOCw2LGltcixBLDAsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LGltcixBLDAsMH0sCS8qIGxldS53ICovCi0gIHszOSw2LGltcixBLDAsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LGltcixBLDAsMH0sCS8qIGx0dS53ICovCi0gIHs0MCw2LGltcixBLDAsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcsaW1yLEEsMCwwfSwJLyogbGUudyAqLwotICB7NDEsNixpbXIsQSwwLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LGltcixBLDAsMH0sCS8qIGx0LncgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDFiW10gPSB7Ci0gIHsxOCw0LGltcixTLDAsMH0sCS8qIGxkLmQgKi8KLSAgezE4LDEwLGltcixTLDAsMH0sCS8qIGxkLnUgKi8KLSAgezE4LDgsaW1yLFMsMCwwfSwJLyogbGQubCAqLwotICB7MTgsNyxpbXIsUywwLDB9LAkvKiBsZC53ICovCi0gIHs1LDAsaW1yLFMsMCwwfSwJLyogYW5kICovCi0gIHs2LDAsaW1yLFMsMCwwfSwJLyogb3IgKi8KLSAgezcsMCxpbXIsUywwLDB9LAkvKiB4b3IgKi8KLSAgezgsMCxpbXIsUywwLDB9LAkvKiBzaGYgKi8KLSAgezksNixpbXIsUywwLDB9LAkvKiBhZGQuaCAqLwotICB7OSw3LGltcixTLDAsMH0sCS8qIGFkZC53ICovCi0gIHsxMCw2LGltcixTLDAsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LGltcixTLDAsMH0sCS8qIHN1Yi53ICovCi0gIHszLDYsaW1yLFMsMCwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxpbXIsUywwLDB9LAkvKiBtdWwudyAqLwotICB7NCw2LGltcixTLDAsMH0sCS8qIGRpdi5oICovCi0gIHs0LDcsaW1yLFMsMCwwfSwJLyogZGl2LncgKi8KLSAgezksMyxpbXIsUywwLDB9LAkvKiBhZGQucyAqLwotICB7MTAsMyxpbXIsUywwLDB9LAkvKiBzdWIucyAqLwotICB7MywzLGltcixTLDAsMH0sCS8qIG11bC5zICovCi0gIHs0LDMsaW1yLFMsMCwwfSwJLyogZGl2LnMgKi8KLSAgezQwLDMsaW1yLFMsMCwwfSwJLyogbGUucyAqLwotICB7NDEsMyxpbXIsUywwLDB9LAkvKiBsdC5zICovCi0gIHszNyw2LGltcixTLDAsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcsaW1yLFMsMCwwfSwJLyogZXEudyAqLwotICB7MzgsNixpbXIsUywwLDB9LAkvKiBsZXUuaCAqLwotICB7MzgsNyxpbXIsUywwLDB9LAkvKiBsZXUudyAqLwotICB7MzksNixpbXIsUywwLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxpbXIsUywwLDB9LAkvKiBsdHUudyAqLwotICB7NDAsNixpbXIsUywwLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LGltcixTLDAsMH0sCS8qIGxlLncgKi8KLSAgezQxLDYsaW1yLFMsMCwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxpbXIsUywwLDB9LAkvKiBsdC53ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQwW10gPSB7Ci0gIHsxMCwzLHJycixTLFYsVn0sCS8qIHN1Yi5zICovCi0gIHsxMCw0LHJycixTLFYsVn0sCS8qIHN1Yi5kICovCi0gIHs0LDMscnJyLFMsVixWfSwJLyogZGl2LnMgKi8KLSAgezQsNCxycnIsUyxWLFZ9LAkvKiBkaXYuZCAqLwotICB7MTAsMTEscnJyLFMsVixWfSwJLyogc3ViLnMuZiAqLwotICB7MTAsMTIscnJyLFMsVixWfSwJLyogc3ViLmQuZiAqLwotICB7NCwxMSxycnIsUyxWLFZ9LAkvKiBkaXYucy5mICovCi0gIHs0LDEyLHJycixTLFYsVn0sCS8qIGRpdi5kLmYgKi8KLSAgezMsMTEscnJyLFYsVixWfSwJLyogbXVsLnMuZiAqLwotICB7MywxMixycnIsVixWLFZ9LAkvKiBtdWwuZC5mICovCi0gIHs0LDExLHJycixWLFYsVn0sCS8qIGRpdi5zLmYgKi8KLSAgezQsMTIscnJyLFYsVixWfSwJLyogZGl2LmQuZiAqLwotICB7MywxMSxycnIsVixTLFZ9LAkvKiBtdWwucy5mICovCi0gIHszLDEyLHJycixWLFMsVn0sCS8qIG11bC5kLmYgKi8KLSAgezQsMTEscnJyLFYsUyxWfSwJLyogZGl2LnMuZiAqLwotICB7NCwxMixycnIsVixTLFZ9LAkvKiBkaXYuZC5mICovCi0gIHs1LDIscnJyLFYsVixWfSwJLyogYW5kLmYgKi8KLSAgezYsMixycnIsVixWLFZ9LAkvKiBvci5mICovCi0gIHs3LDIscnJyLFYsVixWfSwJLyogeG9yLmYgKi8KLSAgezgsMixycnIsVixWLFZ9LAkvKiBzaGYuZiAqLwotICB7NSwyLHJycixWLFMsVn0sCS8qIGFuZC5mICovCi0gIHs2LDIscnJyLFYsUyxWfSwJLyogb3IuZiAqLwotICB7NywyLHJycixWLFMsVn0sCS8qIHhvci5mICovCi0gIHs4LDIscnJyLFYsUyxWfSwJLyogc2hmLmYgKi8KLSAgezksMTEscnJyLFYsVixWfSwJLyogYWRkLnMuZiAqLwotICB7OSwxMixycnIsVixWLFZ9LAkvKiBhZGQuZC5mICovCi0gIHsxMCwxMSxycnIsVixWLFZ9LAkvKiBzdWIucy5mICovCi0gIHsxMCwxMixycnIsVixWLFZ9LAkvKiBzdWIuZC5mICovCi0gIHs5LDExLHJycixWLFMsVn0sCS8qIGFkZC5zLmYgKi8KLSAgezksMTIscnJyLFYsUyxWfSwJLyogYWRkLmQuZiAqLwotICB7MTAsMTEscnJyLFYsUyxWfSwJLyogc3ViLnMuZiAqLwotICB7MTAsMTIscnJyLFYsUyxWfSwJLyogc3ViLmQuZiAqLwotICB7OSwxMyxycnIsVixWLFZ9LAkvKiBhZGQuYi5mICovCi0gIHs5LDE0LHJycixWLFYsVn0sCS8qIGFkZC5oLmYgKi8KLSAgezksMTUscnJyLFYsVixWfSwJLyogYWRkLncuZiAqLwotICB7OSwxNixycnIsVixWLFZ9LAkvKiBhZGQubC5mICovCi0gIHs5LDEzLHJycixWLFMsVn0sCS8qIGFkZC5iLmYgKi8KLSAgezksMTQscnJyLFYsUyxWfSwJLyogYWRkLmguZiAqLwotICB7OSwxNSxycnIsVixTLFZ9LAkvKiBhZGQudy5mICovCi0gIHs5LDE2LHJycixWLFMsVn0sCS8qIGFkZC5sLmYgKi8KLSAgezEwLDEzLHJycixWLFYsVn0sCS8qIHN1Yi5iLmYgKi8KLSAgezEwLDE0LHJycixWLFYsVn0sCS8qIHN1Yi5oLmYgKi8KLSAgezEwLDE1LHJycixWLFYsVn0sCS8qIHN1Yi53LmYgKi8KLSAgezEwLDE2LHJycixWLFYsVn0sCS8qIHN1Yi5sLmYgKi8KLSAgezEwLDEzLHJycixWLFMsVn0sCS8qIHN1Yi5iLmYgKi8KLSAgezEwLDE0LHJycixWLFMsVn0sCS8qIHN1Yi5oLmYgKi8KLSAgezEwLDE1LHJycixWLFMsVn0sCS8qIHN1Yi53LmYgKi8KLSAgezEwLDE2LHJycixWLFMsVn0sCS8qIHN1Yi5sLmYgKi8KLSAgezMsMTMscnJyLFYsVixWfSwJLyogbXVsLmIuZiAqLwotICB7MywxNCxycnIsVixWLFZ9LAkvKiBtdWwuaC5mICovCi0gIHszLDE1LHJycixWLFYsVn0sCS8qIG11bC53LmYgKi8KLSAgezMsMTYscnJyLFYsVixWfSwJLyogbXVsLmwuZiAqLwotICB7MywxMyxycnIsVixTLFZ9LAkvKiBtdWwuYi5mICovCi0gIHszLDE0LHJycixWLFMsVn0sCS8qIG11bC5oLmYgKi8KLSAgezMsMTUscnJyLFYsUyxWfSwJLyogbXVsLncuZiAqLwotICB7MywxNixycnIsVixTLFZ9LAkvKiBtdWwubC5mICovCi0gIHs0LDEzLHJycixWLFYsVn0sCS8qIGRpdi5iLmYgKi8KLSAgezQsMTQscnJyLFYsVixWfSwJLyogZGl2LmguZiAqLwotICB7NCwxNSxycnIsVixWLFZ9LAkvKiBkaXYudy5mICovCi0gIHs0LDE2LHJycixWLFYsVn0sCS8qIGRpdi5sLmYgKi8KLSAgezQsMTMscnJyLFYsUyxWfSwJLyogZGl2LmIuZiAqLwotICB7NCwxNCxycnIsVixTLFZ9LAkvKiBkaXYuaC5mICovCi0gIHs0LDE1LHJycixWLFMsVn0sCS8qIGRpdi53LmYgKi8KLSAgezQsMTYscnJyLFYsUyxWfSwJLyogZGl2LmwuZiAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0MVtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7OTQsMCxhMywwLDAsMH0sCS8qIHRzdCAqLwotICB7OTUsMCxhMywwLDAsMH0sCS8qIGxjayAqLwotICB7OTYsMCxhMywwLDAsMH0sCS8qIHVsayAqLwotICB7MTcsMCxhMXIsUywwLDB9LAkvKiBsZGVhICovCi0gIHs5NywwLGExcixBLDAsMH0sCS8qIHNwYXduICovCi0gIHs5OCwwLGExcixBLDAsMH0sCS8qIGxkY21yICovCi0gIHs5OSwwLGEycixBLDAsMH0sCS8qIHN0Y21yICovCi0gIHsxMDAsMCxhMXIsQSwwLDB9LAkvKiBwb3ByICovCi0gIHsxMDEsMCxhMnIsQSwwLDB9LAkvKiBwc2hyICovCi0gIHsxMDIsNyxhMXIsQSwwLDB9LAkvKiByY3ZyLncgKi8KLSAgezEwMyw3LGEycixBLDAsMH0sCS8qIG1hdG0udyAqLwotICB7MTA0LDcsYTJyLEEsMCwwfSwJLyogc25kci53ICovCi0gIHsxMDQsOCxhMnIsUywwLDB9LAkvKiBzbmRyLmwgKi8KLSAgezEwMiw4LGExcixTLDAsMH0sCS8qIHJjdnIubCAqLwotICB7MTAzLDgsYTJyLFMsMCwwfSwJLyogbWF0bS5sICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMDUsNyxhMnIsQSwwLDB9LAkvKiBwdXRyLncgKi8KLSAgezEwNSw4LGEycixTLDAsMH0sCS8qIHB1dHIubCAqLwotICB7MTA2LDcsYTFyLEEsMCwwfSwJLyogZ2V0ci53ICovCi0gIHsxMDYsOCxhMXIsUywwLDB9LAkvKiBnZXRyLmwgKi8KLSAgezI2LDEzLGEycixTLDAsMH0sCS8qIHN0ZS5iLmYgKi8KLSAgezI2LDE0LGEycixTLDAsMH0sCS8qIHN0ZS5oLmYgKi8KLSAgezI2LDE1LGEycixTLDAsMH0sCS8qIHN0ZS53LmYgKi8KLSAgezI2LDE2LGEycixTLDAsMH0sCS8qIHN0ZS5sLmYgKi8KLSAgezEwNyw3LGEycixBLDAsMH0sCS8qIG1hdHIudyAqLwotICB7MTA4LDcsYTJyLEEsMCwwfSwJLyogbWF0LncgKi8KLSAgezEwOSw3LGExcixBLDAsMH0sCS8qIGdldC53ICovCi0gIHsxMTAsNyxhMXIsQSwwLDB9LAkvKiByY3YudyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MTExLDcsYTFyLEEsMCwwfSwJLyogaW5jLncgKi8KLSAgezExMiw3LGEycixBLDAsMH0sCS8qIHB1dC53ICovCi0gIHsxMTMsNyxhMnIsQSwwLDB9LAkvKiBzbmQudyAqLwotICB7MTA3LDgsYTJyLFMsMCwwfSwJLyogbWF0ci5sICovCi0gIHsxMDgsOCxhMnIsUywwLDB9LAkvKiBtYXQubCAqLwotICB7MTA5LDgsYTFyLFMsMCwwfSwJLyogZ2V0LmwgKi8KLSAgezExMCw4LGExcixTLDAsMH0sCS8qIHJjdi5sICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTEsOCxhMXIsUywwLDB9LAkvKiBpbmMubCAqLwotICB7MTEyLDgsYTJyLFMsMCwwfSwJLyogcHV0LmwgKi8KLSAgezExMyw4LGEycixTLDAsMH0sCS8qIHNuZC5sICovCi0gIHsxOCwxMyxhMXIsViwwLDB9LAkvKiBsZC5iLmYgKi8KLSAgezE4LDE0LGExcixWLDAsMH0sCS8qIGxkLmguZiAqLwotICB7MTgsMTUsYTFyLFYsMCwwfSwJLyogbGQudy5mICovCi0gIHsxOCwxNixhMXIsViwwLDB9LAkvKiBsZC5sLmYgKi8KLSAgezIxLDEzLGEycixWLDAsMH0sCS8qIHN0LmIuZiAqLwotICB7MjEsMTQsYTJyLFYsMCwwfSwJLyogc3QuaC5mICovCi0gIHsyMSwxNSxhMnIsViwwLDB9LAkvKiBzdC53LmYgKi8KLSAgezIxLDE2LGEycixWLDAsMH0sCS8qIHN0LmwuZiAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0MltdID0gewotICB7MjgsNSxycixWLFYsMH0sCS8qIGN2dHcuYiAqLwotICB7MjgsNixycixWLFYsMH0sCS8qIGN2dHcuaCAqLwotICB7MjksNyxycixWLFYsMH0sCS8qIGN2dGIudyAqLwotICB7MzAsNyxycixWLFYsMH0sCS8qIGN2dGgudyAqLwotICB7MjgsMTMscnIsVixWLDB9LAkvKiBjdnR3LmIuZiAqLwotICB7MjgsMTQscnIsVixWLDB9LAkvKiBjdnR3LmguZiAqLwotICB7MjksMTUscnIsVixWLDB9LAkvKiBjdnRiLncuZiAqLwotICB7MzAsMTUscnIsVixWLDB9LAkvKiBjdnRoLncuZiAqLwotICB7MzEsOCxycixWLFYsMH0sCS8qIGN2dHMubCAqLwotICB7MzIsNyxycixWLFYsMH0sCS8qIGN2dGQudyAqLwotICB7MzMsMyxycixWLFYsMH0sCS8qIGN2dGwucyAqLwotICB7MjgsNCxycixWLFYsMH0sCS8qIGN2dHcuZCAqLwotICB7MzEsMTYscnIsVixWLDB9LAkvKiBjdnRzLmwuZiAqLwotICB7MzIsMTUscnIsVixWLDB9LAkvKiBjdnRkLncuZiAqLwotICB7MzMsMTEscnIsVixWLDB9LAkvKiBjdnRsLnMuZiAqLwotICB7MjgsMTIscnIsVixWLDB9LAkvKiBjdnR3LmQuZiAqLwotICB7MTE0LDAscnIsUyxTLDB9LAkvKiBlbmFsICovCi0gIHs4LDcscnIsUyxTLDB9LAkvKiBzaGYudyAqLwotICB7MTE1LDAscnIsUyxTLDB9LAkvKiBlbmFnICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsyOCw0LHJyLFMsUywwfSwJLyogY3Z0dy5kICovCi0gIHszMiw3LHJyLFMsUywwfSwJLyogY3Z0ZC53ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTYsMyxycixTLFMsMH0sCS8qIGZyaW50LnMgKi8KLSAgezExNiw0LHJyLFMsUywwfSwJLyogZnJpbnQuZCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTE2LDMscnIsVixWLDB9LAkvKiBmcmludC5zICovCi0gIHsxMTYsNCxycixWLFYsMH0sCS8qIGZyaW50LmQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezExNiwxMSxycixWLFYsMH0sCS8qIGZyaW50LnMuZiAqLwotICB7MTE2LDEyLHJyLFYsViwwfSwJLyogZnJpbnQuZC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MSwzLHJyLFYsViwwfSwJLyogc3FydC5zICovCi0gIHs4MSw0LHJyLFYsViwwfSwJLyogc3FydC5kICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MSwxMSxycixWLFYsMH0sCS8qIHNxcnQucy5mICovCi0gIHs4MSwxMixycixWLFYsMH0sCS8qIHNxcnQuZC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQzW10gPSB7Ci0gIHszMiwxMSxycixWLFYsMH0sCS8qIGN2dGQucy5mICovCi0gIHszMSwxMixycixWLFYsMH0sCS8qIGN2dHMuZC5mICovCi0gIHszMywxMixycixWLFYsMH0sCS8qIGN2dGwuZC5mICovCi0gIHszMiwxNixycixWLFYsMH0sCS8qIGN2dGQubC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszNiwyLHJyLFYsViwwfSwJLyogdHpjLmYgKi8KLSAgezQ0LDIscnIsVixWLDB9LAkvKiBsb3AuZiAqLwotICB7MTE3LDIscnIsVixWLDB9LAkvKiB4cG5kLmYgKi8KLSAgezQyLDIscnIsVixWLDB9LAkvKiBub3QuZiAqLwotICB7OCwyLHJyLFMsViwwfSwJLyogc2hmLmYgKi8KLSAgezM1LDE3LHJyLFYsViwwfSwJLyogcGxjLnQuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MzcsMTEscnIsVixWLDB9LAkvKiBlcS5zLmYgKi8KLSAgezM3LDEyLHJyLFYsViwwfSwJLyogZXEuZC5mICovCi0gIHs0MywxMSxycixWLFYsMH0sCS8qIG5lZy5zLmYgKi8KLSAgezQzLDEyLHJyLFYsViwwfSwJLyogbmVnLmQuZiAqLwotICB7MzcsMTEscnIsUyxWLDB9LAkvKiBlcS5zLmYgKi8KLSAgezM3LDEyLHJyLFMsViwwfSwJLyogZXEuZC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs0MCwxMSxycixWLFYsMH0sCS8qIGxlLnMuZiAqLwotICB7NDAsMTIscnIsVixWLDB9LAkvKiBsZS5kLmYgKi8KLSAgezQxLDExLHJyLFYsViwwfSwJLyogbHQucy5mICovCi0gIHs0MSwxMixycixWLFYsMH0sCS8qIGx0LmQuZiAqLwotICB7NDAsMTEscnIsUyxWLDB9LAkvKiBsZS5zLmYgKi8KLSAgezQwLDEyLHJyLFMsViwwfSwJLyogbGUuZC5mICovCi0gIHs0MSwxMSxycixTLFYsMH0sCS8qIGx0LnMuZiAqLwotICB7NDEsMTIscnIsUyxWLDB9LAkvKiBsdC5kLmYgKi8KLSAgezM3LDEzLHJyLFYsViwwfSwJLyogZXEuYi5mICovCi0gIHszNywxNCxycixWLFYsMH0sCS8qIGVxLmguZiAqLwotICB7MzcsMTUscnIsVixWLDB9LAkvKiBlcS53LmYgKi8KLSAgezM3LDE2LHJyLFYsViwwfSwJLyogZXEubC5mICovCi0gIHszNywxMyxycixTLFYsMH0sCS8qIGVxLmIuZiAqLwotICB7MzcsMTQscnIsUyxWLDB9LAkvKiBlcS5oLmYgKi8KLSAgezM3LDE1LHJyLFMsViwwfSwJLyogZXEudy5mICovCi0gIHszNywxNixycixTLFYsMH0sCS8qIGVxLmwuZiAqLwotICB7NDAsMTMscnIsVixWLDB9LAkvKiBsZS5iLmYgKi8KLSAgezQwLDE0LHJyLFYsViwwfSwJLyogbGUuaC5mICovCi0gIHs0MCwxNSxycixWLFYsMH0sCS8qIGxlLncuZiAqLwotICB7NDAsMTYscnIsVixWLDB9LAkvKiBsZS5sLmYgKi8KLSAgezQwLDEzLHJyLFMsViwwfSwJLyogbGUuYi5mICovCi0gIHs0MCwxNCxycixTLFYsMH0sCS8qIGxlLmguZiAqLwotICB7NDAsMTUscnIsUyxWLDB9LAkvKiBsZS53LmYgKi8KLSAgezQwLDE2LHJyLFMsViwwfSwJLyogbGUubC5mICovCi0gIHs0MSwxMyxycixWLFYsMH0sCS8qIGx0LmIuZiAqLwotICB7NDEsMTQscnIsVixWLDB9LAkvKiBsdC5oLmYgKi8KLSAgezQxLDE1LHJyLFYsViwwfSwJLyogbHQudy5mICovCi0gIHs0MSwxNixycixWLFYsMH0sCS8qIGx0LmwuZiAqLwotICB7NDEsMTMscnIsUyxWLDB9LAkvKiBsdC5iLmYgKi8KLSAgezQxLDE0LHJyLFMsViwwfSwJLyogbHQuaC5mICovCi0gIHs0MSwxNSxycixTLFYsMH0sCS8qIGx0LncuZiAqLwotICB7NDEsMTYscnIsUyxWLDB9LAkvKiBsdC5sLmYgKi8KLSAgezQzLDEzLHJyLFYsViwwfSwJLyogbmVnLmIuZiAqLwotICB7NDMsMTQscnIsVixWLDB9LAkvKiBuZWcuaC5mICovCi0gIHs0MywxNSxycixWLFYsMH0sCS8qIG5lZy53LmYgKi8KLSAgezQzLDE2LHJyLFYsViwwfSwJLyogbmVnLmwuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0NFtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0NVtdID0gewotICB7NTEsMTMscnIsVixWLDB9LAkvKiBsZHZpLmIuZiAqLwotICB7NTEsMTQscnIsVixWLDB9LAkvKiBsZHZpLmguZiAqLwotICB7NTEsMTUscnIsVixWLDB9LAkvKiBsZHZpLncuZiAqLwotICB7NTEsMTYscnIsVixWLDB9LAkvKiBsZHZpLmwuZiAqLwotICB7MjgsMTEscnIsVixWLDB9LAkvKiBjdnR3LnMuZiAqLwotICB7MzEsMTUscnIsVixWLDB9LAkvKiBjdnRzLncuZiAqLwotICB7MjgsMTYscnIsVixWLDB9LAkvKiBjdnR3LmwuZiAqLwotICB7MzMsMTUscnIsVixWLDB9LAkvKiBjdnRsLncuZiAqLwotICB7NTIsMTMscnhyLFYsViwwfSwJLyogc3R2aS5iLmYgKi8KLSAgezUyLDE0LHJ4cixWLFYsMH0sCS8qIHN0dmkuaC5mICovCi0gIHs1MiwxNSxyeHIsVixWLDB9LAkvKiBzdHZpLncuZiAqLwotICB7NTIsMTYscnhyLFYsViwwfSwJLyogc3R2aS5sLmYgKi8KLSAgezUyLDEzLHJ4cixTLFYsMH0sCS8qIHN0dmkuYi5mICovCi0gIHs1MiwxNCxyeHIsUyxWLDB9LAkvKiBzdHZpLmguZiAqLwotICB7NTIsMTUscnhyLFMsViwwfSwJLyogc3R2aS53LmYgKi8KLSAgezUyLDE2LHJ4cixTLFYsMH0sCS8qIHN0dmkubC5mICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQ2W10gPSB7Ci0gIHswLDAscnhsLFMsQ0lSLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixDSVIsUywwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVE9DLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLENQVUlELFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxTLFRUUiwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVFRSLFMsMH0sCS8qIG1vdiAqLwotICB7MTE4LDAsbm9wcywwLDAsMH0sCS8qIGN0cnNsICovCi0gIHsxMTksMCxub3BzLDAsMCwwfSwJLyogY3Ryc2cgKi8KLSAgezAsMCxyeGwsUyxWTVUsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFZNVSxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxWTUwsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFZNTCxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxJQ1IsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLElDUixTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxUQ1BVLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixUQ1BVLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTIwLDAsbm9wcywwLDAsMH0sCS8qIHN0b3AgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCxyeGwsUyxUSUQsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFRJRCxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDdbXSA9IHsKLSAgezg0LDEzLHIsViwwLDB9LAkvKiBzdW0uYi5mICovCi0gIHs4NCwxNCxyLFYsMCwwfSwJLyogc3VtLmguZiAqLwotICB7ODQsMTUscixWLDAsMH0sCS8qIHN1bS53LmYgKi8KLSAgezg0LDE2LHIsViwwLDB9LAkvKiBzdW0ubC5mICovCi0gIHs4NSwyLHIsViwwLDB9LAkvKiBhbGwuZiAqLwotICB7ODYsMixyLFYsMCwwfSwJLyogYW55LmYgKi8KLSAgezg3LDIscixWLDAsMH0sCS8qIHBhcml0eS5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4OCwxMyxyLFYsMCwwfSwJLyogbWF4LmIuZiAqLwotICB7ODgsMTQscixWLDAsMH0sCS8qIG1heC5oLmYgKi8KLSAgezg4LDE1LHIsViwwLDB9LAkvKiBtYXgudy5mICovCi0gIHs4OCwxNixyLFYsMCwwfSwJLyogbWF4LmwuZiAqLwotICB7ODksMTMscixWLDAsMH0sCS8qIG1pbi5iLmYgKi8KLSAgezg5LDE0LHIsViwwLDB9LAkvKiBtaW4uaC5mICovCi0gIHs4OSwxNSxyLFYsMCwwfSwJLyogbWluLncuZiAqLwotICB7ODksMTYscixWLDAsMH0sCS8qIG1pbi5sLmYgKi8KLSAgezg0LDExLHIsViwwLDB9LAkvKiBzdW0ucy5mICovCi0gIHs4NCwxMixyLFYsMCwwfSwJLyogc3VtLmQuZiAqLwotICB7OTAsMTEscixWLDAsMH0sCS8qIHByb2Qucy5mICovCi0gIHs5MCwxMixyLFYsMCwwfSwJLyogcHJvZC5kLmYgKi8KLSAgezg4LDExLHIsViwwLDB9LAkvKiBtYXgucy5mICovCi0gIHs4OCwxMixyLFYsMCwwfSwJLyogbWF4LmQuZiAqLwotICB7ODksMTEscixWLDAsMH0sCS8qIG1pbi5zLmYgKi8KLSAgezg5LDEyLHIsViwwLDB9LAkvKiBtaW4uZC5mICovCi0gIHs5MCwxMyxyLFYsMCwwfSwJLyogcHJvZC5iLmYgKi8KLSAgezkwLDE0LHIsViwwLDB9LAkvKiBwcm9kLmguZiAqLwotICB7OTAsMTUscixWLDAsMH0sCS8qIHByb2Qudy5mICovCi0gIHs5MCwxNixyLFYsMCwwfSwJLyogcHJvZC5sLmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDBbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezEwLDE4LHJycixTLFYsVn0sCS8qIHN1Yi5zLnQgKi8KLSAgezEwLDE5LHJycixTLFYsVn0sCS8qIHN1Yi5kLnQgKi8KLSAgezQsMTgscnJyLFMsVixWfSwJLyogZGl2LnMudCAqLwotICB7NCwxOSxycnIsUyxWLFZ9LAkvKiBkaXYuZC50ICovCi0gIHszLDE4LHJycixWLFYsVn0sCS8qIG11bC5zLnQgKi8KLSAgezMsMTkscnJyLFYsVixWfSwJLyogbXVsLmQudCAqLwotICB7NCwxOCxycnIsVixWLFZ9LAkvKiBkaXYucy50ICovCi0gIHs0LDE5LHJycixWLFYsVn0sCS8qIGRpdi5kLnQgKi8KLSAgezMsMTgscnJyLFYsUyxWfSwJLyogbXVsLnMudCAqLwotICB7MywxOSxycnIsVixTLFZ9LAkvKiBtdWwuZC50ICovCi0gIHs0LDE4LHJycixWLFMsVn0sCS8qIGRpdi5zLnQgKi8KLSAgezQsMTkscnJyLFYsUyxWfSwJLyogZGl2LmQudCAqLwotICB7NSwxLHJycixWLFYsVn0sCS8qIGFuZC50ICovCi0gIHs2LDEscnJyLFYsVixWfSwJLyogb3IudCAqLwotICB7NywxLHJycixWLFYsVn0sCS8qIHhvci50ICovCi0gIHs4LDEscnJyLFYsVixWfSwJLyogc2hmLnQgKi8KLSAgezUsMSxycnIsVixTLFZ9LAkvKiBhbmQudCAqLwotICB7NiwxLHJycixWLFMsVn0sCS8qIG9yLnQgKi8KLSAgezcsMSxycnIsVixTLFZ9LAkvKiB4b3IudCAqLwotICB7OCwxLHJycixWLFMsVn0sCS8qIHNoZi50ICovCi0gIHs5LDE4LHJycixWLFYsVn0sCS8qIGFkZC5zLnQgKi8KLSAgezksMTkscnJyLFYsVixWfSwJLyogYWRkLmQudCAqLwotICB7MTAsMTgscnJyLFYsVixWfSwJLyogc3ViLnMudCAqLwotICB7MTAsMTkscnJyLFYsVixWfSwJLyogc3ViLmQudCAqLwotICB7OSwxOCxycnIsVixTLFZ9LAkvKiBhZGQucy50ICovCi0gIHs5LDE5LHJycixWLFMsVn0sCS8qIGFkZC5kLnQgKi8KLSAgezEwLDE4LHJycixWLFMsVn0sCS8qIHN1Yi5zLnQgKi8KLSAgezEwLDE5LHJycixWLFMsVn0sCS8qIHN1Yi5kLnQgKi8KLSAgezksMjAscnJyLFYsVixWfSwJLyogYWRkLmIudCAqLwotICB7OSwyMSxycnIsVixWLFZ9LAkvKiBhZGQuaC50ICovCi0gIHs5LDIyLHJycixWLFYsVn0sCS8qIGFkZC53LnQgKi8KLSAgezksMjMscnJyLFYsVixWfSwJLyogYWRkLmwudCAqLwotICB7OSwyMCxycnIsVixTLFZ9LAkvKiBhZGQuYi50ICovCi0gIHs5LDIxLHJycixWLFMsVn0sCS8qIGFkZC5oLnQgKi8KLSAgezksMjIscnJyLFYsUyxWfSwJLyogYWRkLncudCAqLwotICB7OSwyMyxycnIsVixTLFZ9LAkvKiBhZGQubC50ICovCi0gIHsxMCwyMCxycnIsVixWLFZ9LAkvKiBzdWIuYi50ICovCi0gIHsxMCwyMSxycnIsVixWLFZ9LAkvKiBzdWIuaC50ICovCi0gIHsxMCwyMixycnIsVixWLFZ9LAkvKiBzdWIudy50ICovCi0gIHsxMCwyMyxycnIsVixWLFZ9LAkvKiBzdWIubC50ICovCi0gIHsxMCwyMCxycnIsVixTLFZ9LAkvKiBzdWIuYi50ICovCi0gIHsxMCwyMSxycnIsVixTLFZ9LAkvKiBzdWIuaC50ICovCi0gIHsxMCwyMixycnIsVixTLFZ9LAkvKiBzdWIudy50ICovCi0gIHsxMCwyMyxycnIsVixTLFZ9LAkvKiBzdWIubC50ICovCi0gIHszLDIwLHJycixWLFYsVn0sCS8qIG11bC5iLnQgKi8KLSAgezMsMjEscnJyLFYsVixWfSwJLyogbXVsLmgudCAqLwotICB7MywyMixycnIsVixWLFZ9LAkvKiBtdWwudy50ICovCi0gIHszLDIzLHJycixWLFYsVn0sCS8qIG11bC5sLnQgKi8KLSAgezMsMjAscnJyLFYsUyxWfSwJLyogbXVsLmIudCAqLwotICB7MywyMSxycnIsVixTLFZ9LAkvKiBtdWwuaC50ICovCi0gIHszLDIyLHJycixWLFMsVn0sCS8qIG11bC53LnQgKi8KLSAgezMsMjMscnJyLFYsUyxWfSwJLyogbXVsLmwudCAqLwotICB7NCwyMCxycnIsVixWLFZ9LAkvKiBkaXYuYi50ICovCi0gIHs0LDIxLHJycixWLFYsVn0sCS8qIGRpdi5oLnQgKi8KLSAgezQsMjIscnJyLFYsVixWfSwJLyogZGl2LncudCAqLwotICB7NCwyMyxycnIsVixWLFZ9LAkvKiBkaXYubC50ICovCi0gIHs0LDIwLHJycixWLFMsVn0sCS8qIGRpdi5iLnQgKi8KLSAgezQsMjEscnJyLFYsUyxWfSwJLyogZGl2LmgudCAqLwotICB7NCwyMixycnIsVixTLFZ9LAkvKiBkaXYudy50ICovCi0gIHs0LDIzLHJycixWLFMsVn0sCS8qIGRpdi5sLnQgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDFbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezI2LDIwLGEycixTLDAsMH0sCS8qIHN0ZS5iLnQgKi8KLSAgezI2LDIxLGEycixTLDAsMH0sCS8qIHN0ZS5oLnQgKi8KLSAgezI2LDIyLGEycixTLDAsMH0sCS8qIHN0ZS53LnQgKi8KLSAgezI2LDIzLGEycixTLDAsMH0sCS8qIHN0ZS5sLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezE4LDIwLGExcixWLDAsMH0sCS8qIGxkLmIudCAqLwotICB7MTgsMjEsYTFyLFYsMCwwfSwJLyogbGQuaC50ICovCi0gIHsxOCwyMixhMXIsViwwLDB9LAkvKiBsZC53LnQgKi8KLSAgezE4LDIzLGExcixWLDAsMH0sCS8qIGxkLmwudCAqLwotICB7MjEsMjAsYTJyLFYsMCwwfSwJLyogc3QuYi50ICovCi0gIHsyMSwyMSxhMnIsViwwLDB9LAkvKiBzdC5oLnQgKi8KLSAgezIxLDIyLGEycixWLDAsMH0sCS8qIHN0LncudCAqLwotICB7MjEsMjMsYTJyLFYsMCwwfSwJLyogc3QubC50ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQyW10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsyOCwyMCxycixWLFYsMH0sCS8qIGN2dHcuYi50ICovCi0gIHsyOCwyMSxycixWLFYsMH0sCS8qIGN2dHcuaC50ICovCi0gIHsyOSwyMixycixWLFYsMH0sCS8qIGN2dGIudy50ICovCi0gIHszMCwyMixycixWLFYsMH0sCS8qIGN2dGgudy50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszMSwyMyxycixWLFYsMH0sCS8qIGN2dHMubC50ICovCi0gIHszMiwyMixycixWLFYsMH0sCS8qIGN2dGQudy50ICovCi0gIHszMywxOCxycixWLFYsMH0sCS8qIGN2dGwucy50ICovCi0gIHsyOCwxOSxycixWLFYsMH0sCS8qIGN2dHcuZC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTYsMTgscnIsVixWLDB9LAkvKiBmcmludC5zLnQgKi8KLSAgezExNiwxOSxycixWLFYsMH0sCS8qIGZyaW50LmQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7ODEsMTgscnIsVixWLDB9LAkvKiBzcXJ0LnMudCAqLwotICB7ODEsMTkscnIsVixWLDB9LAkvKiBzcXJ0LmQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0M1tdID0gewotICB7MzIsMTgscnIsVixWLDB9LAkvKiBjdnRkLnMudCAqLwotICB7MzEsMTkscnIsVixWLDB9LAkvKiBjdnRzLmQudCAqLwotICB7MzMsMTkscnIsVixWLDB9LAkvKiBjdnRsLmQudCAqLwotICB7MzIsMjMscnIsVixWLDB9LAkvKiBjdnRkLmwudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MzYsMSxycixWLFYsMH0sCS8qIHR6Yy50ICovCi0gIHs0NCwxLHJyLFYsViwwfSwJLyogbG9wLnQgKi8KLSAgezExNywxLHJyLFYsViwwfSwJLyogeHBuZC50ICovCi0gIHs0MiwxLHJyLFYsViwwfSwJLyogbm90LnQgKi8KLSAgezgsMSxycixTLFYsMH0sCS8qIHNoZi50ICovCi0gIHszNSwyNCxycixWLFYsMH0sCS8qIHBsYy50LnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezM3LDE4LHJyLFYsViwwfSwJLyogZXEucy50ICovCi0gIHszNywxOSxycixWLFYsMH0sCS8qIGVxLmQudCAqLwotICB7NDMsMTgscnIsVixWLDB9LAkvKiBuZWcucy50ICovCi0gIHs0MywxOSxycixWLFYsMH0sCS8qIG5lZy5kLnQgKi8KLSAgezM3LDE4LHJyLFMsViwwfSwJLyogZXEucy50ICovCi0gIHszNywxOSxycixTLFYsMH0sCS8qIGVxLmQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7NDAsMTgscnIsVixWLDB9LAkvKiBsZS5zLnQgKi8KLSAgezQwLDE5LHJyLFYsViwwfSwJLyogbGUuZC50ICovCi0gIHs0MSwxOCxycixWLFYsMH0sCS8qIGx0LnMudCAqLwotICB7NDEsMTkscnIsVixWLDB9LAkvKiBsdC5kLnQgKi8KLSAgezQwLDE4LHJyLFMsViwwfSwJLyogbGUucy50ICovCi0gIHs0MCwxOSxycixTLFYsMH0sCS8qIGxlLmQudCAqLwotICB7NDEsMTgscnIsUyxWLDB9LAkvKiBsdC5zLnQgKi8KLSAgezQxLDE5LHJyLFMsViwwfSwJLyogbHQuZC50ICovCi0gIHszNywyMCxycixWLFYsMH0sCS8qIGVxLmIudCAqLwotICB7MzcsMjEscnIsVixWLDB9LAkvKiBlcS5oLnQgKi8KLSAgezM3LDIyLHJyLFYsViwwfSwJLyogZXEudy50ICovCi0gIHszNywyMyxycixWLFYsMH0sCS8qIGVxLmwudCAqLwotICB7MzcsMjAscnIsUyxWLDB9LAkvKiBlcS5iLnQgKi8KLSAgezM3LDIxLHJyLFMsViwwfSwJLyogZXEuaC50ICovCi0gIHszNywyMixycixTLFYsMH0sCS8qIGVxLncudCAqLwotICB7MzcsMjMscnIsUyxWLDB9LAkvKiBlcS5sLnQgKi8KLSAgezQwLDIwLHJyLFYsViwwfSwJLyogbGUuYi50ICovCi0gIHs0MCwyMSxycixWLFYsMH0sCS8qIGxlLmgudCAqLwotICB7NDAsMjIscnIsVixWLDB9LAkvKiBsZS53LnQgKi8KLSAgezQwLDIzLHJyLFYsViwwfSwJLyogbGUubC50ICovCi0gIHs0MCwyMCxycixTLFYsMH0sCS8qIGxlLmIudCAqLwotICB7NDAsMjEscnIsUyxWLDB9LAkvKiBsZS5oLnQgKi8KLSAgezQwLDIyLHJyLFMsViwwfSwJLyogbGUudy50ICovCi0gIHs0MCwyMyxycixTLFYsMH0sCS8qIGxlLmwudCAqLwotICB7NDEsMjAscnIsVixWLDB9LAkvKiBsdC5iLnQgKi8KLSAgezQxLDIxLHJyLFYsViwwfSwJLyogbHQuaC50ICovCi0gIHs0MSwyMixycixWLFYsMH0sCS8qIGx0LncudCAqLwotICB7NDEsMjMscnIsVixWLDB9LAkvKiBsdC5sLnQgKi8KLSAgezQxLDIwLHJyLFMsViwwfSwJLyogbHQuYi50ICovCi0gIHs0MSwyMSxycixTLFYsMH0sCS8qIGx0LmgudCAqLwotICB7NDEsMjIscnIsUyxWLDB9LAkvKiBsdC53LnQgKi8KLSAgezQxLDIzLHJyLFMsViwwfSwJLyogbHQubC50ICovCi0gIHs0MywyMCxycixWLFYsMH0sCS8qIG5lZy5iLnQgKi8KLSAgezQzLDIxLHJyLFYsViwwfSwJLyogbmVnLmgudCAqLwotICB7NDMsMjIscnIsVixWLDB9LAkvKiBuZWcudy50ICovCi0gIHs0MywyMyxycixWLFYsMH0sCS8qIG5lZy5sLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDRbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDVbXSA9IHsKLSAgezUxLDIwLHJyLFYsViwwfSwJLyogbGR2aS5iLnQgKi8KLSAgezUxLDIxLHJyLFYsViwwfSwJLyogbGR2aS5oLnQgKi8KLSAgezUxLDIyLHJyLFYsViwwfSwJLyogbGR2aS53LnQgKi8KLSAgezUxLDIzLHJyLFYsViwwfSwJLyogbGR2aS5sLnQgKi8KLSAgezI4LDE4LHJyLFYsViwwfSwJLyogY3Z0dy5zLnQgKi8KLSAgezMxLDIyLHJyLFYsViwwfSwJLyogY3Z0cy53LnQgKi8KLSAgezI4LDIzLHJyLFYsViwwfSwJLyogY3Z0dy5sLnQgKi8KLSAgezMzLDIyLHJyLFYsViwwfSwJLyogY3Z0bC53LnQgKi8KLSAgezUyLDIwLHJ4cixWLFYsMH0sCS8qIHN0dmkuYi50ICovCi0gIHs1MiwyMSxyeHIsVixWLDB9LAkvKiBzdHZpLmgudCAqLwotICB7NTIsMjIscnhyLFYsViwwfSwJLyogc3R2aS53LnQgKi8KLSAgezUyLDIzLHJ4cixWLFYsMH0sCS8qIHN0dmkubC50ICovCi0gIHs1MiwyMCxyeHIsUyxWLDB9LAkvKiBzdHZpLmIudCAqLwotICB7NTIsMjEscnhyLFMsViwwfSwJLyogc3R2aS5oLnQgKi8KLSAgezUyLDIyLHJ4cixTLFYsMH0sCS8qIHN0dmkudy50ICovCi0gIHs1MiwyMyxyeHIsUyxWLDB9LAkvKiBzdHZpLmwudCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0NltdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0N1tdID0gewotICB7ODQsMjAscixWLDAsMH0sCS8qIHN1bS5iLnQgKi8KLSAgezg0LDIxLHIsViwwLDB9LAkvKiBzdW0uaC50ICovCi0gIHs4NCwyMixyLFYsMCwwfSwJLyogc3VtLncudCAqLwotICB7ODQsMjMscixWLDAsMH0sCS8qIHN1bS5sLnQgKi8KLSAgezg1LDEscixWLDAsMH0sCS8qIGFsbC50ICovCi0gIHs4NiwxLHIsViwwLDB9LAkvKiBhbnkudCAqLwotICB7ODcsMSxyLFYsMCwwfSwJLyogcGFyaXR5LnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezg4LDIwLHIsViwwLDB9LAkvKiBtYXguYi50ICovCi0gIHs4OCwyMSxyLFYsMCwwfSwJLyogbWF4LmgudCAqLwotICB7ODgsMjIscixWLDAsMH0sCS8qIG1heC53LnQgKi8KLSAgezg4LDIzLHIsViwwLDB9LAkvKiBtYXgubC50ICovCi0gIHs4OSwyMCxyLFYsMCwwfSwJLyogbWluLmIudCAqLwotICB7ODksMjEscixWLDAsMH0sCS8qIG1pbi5oLnQgKi8KLSAgezg5LDIyLHIsViwwLDB9LAkvKiBtaW4udy50ICovCi0gIHs4OSwyMyxyLFYsMCwwfSwJLyogbWluLmwudCAqLwotICB7ODQsMTgscixWLDAsMH0sCS8qIHN1bS5zLnQgKi8KLSAgezg0LDE5LHIsViwwLDB9LAkvKiBzdW0uZC50ICovCi0gIHs5MCwxOCxyLFYsMCwwfSwJLyogcHJvZC5zLnQgKi8KLSAgezkwLDE5LHIsViwwLDB9LAkvKiBwcm9kLmQudCAqLwotICB7ODgsMTgscixWLDAsMH0sCS8qIG1heC5zLnQgKi8KLSAgezg4LDE5LHIsViwwLDB9LAkvKiBtYXguZC50ICovCi0gIHs4OSwxOCxyLFYsMCwwfSwJLyogbWluLnMudCAqLwotICB7ODksMTkscixWLDAsMH0sCS8qIG1pbi5kLnQgKi8KLSAgezkwLDIwLHIsViwwLDB9LAkvKiBwcm9kLmIudCAqLwotICB7OTAsMjEscixWLDAsMH0sCS8qIHByb2QuaC50ICovCi0gIHs5MCwyMixyLFYsMCwwfSwJLyogcHJvZC53LnQgKi8KLSAgezkwLDIzLHIsViwwLDB9LAkvKiBwcm9kLmwudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotY2hhciAqbG9wW10gPSB7Ci0gICJtb3YiLAkvKiAwICovCi0gICJtZXJnIiwJLyogMSAqLwotICAibWFzayIsCS8qIDIgKi8KLSAgIm11bCIsCS8qIDMgKi8KLSAgImRpdiIsCS8qIDQgKi8KLSAgImFuZCIsCS8qIDUgKi8KLSAgIm9yIiwJLyogNiAqLwotICAieG9yIiwJLyogNyAqLwotICAic2hmIiwJLyogOCAqLwotICAiYWRkIiwJLyogOSAqLwotICAic3ViIiwJLyogMTAgKi8KLSAgImV4aXQiLAkvKiAxMSAqLwotICAiam1wIiwJLyogMTIgKi8KLSAgImptcGkiLAkvKiAxMyAqLwotICAiam1wYSIsCS8qIDE0ICovCi0gICJqbXBzIiwJLyogMTUgKi8KLSAgInRhYyIsCS8qIDE2ICovCi0gICJsZGVhIiwJLyogMTcgKi8KLSAgImxkIiwJLyogMTggKi8KLSAgInRhcyIsCS8qIDE5ICovCi0gICJwc2hlYSIsCS8qIDIwICovCi0gICJzdCIsCS8qIDIxICovCi0gICJjYWxsIiwJLyogMjIgKi8KLSAgImNhbGxzIiwJLyogMjMgKi8KLSAgImNhbGxxIiwJLyogMjQgKi8KLSAgInBmb3JrIiwJLyogMjUgKi8KLSAgInN0ZSIsCS8qIDI2ICovCi0gICJpbmNyIiwJLyogMjcgKi8KLSAgImN2dHciLAkvKiAyOCAqLwotICAiY3Z0YiIsCS8qIDI5ICovCi0gICJjdnRoIiwJLyogMzAgKi8KLSAgImN2dHMiLAkvKiAzMSAqLwotICAiY3Z0ZCIsCS8qIDMyICovCi0gICJjdnRsIiwJLyogMzMgKi8KLSAgImxkcGEiLAkvKiAzNCAqLwotICAicGxjIiwJLyogMzUgKi8KLSAgInR6YyIsCS8qIDM2ICovCi0gICJlcSIsCS8qIDM3ICovCi0gICJsZXUiLAkvKiAzOCAqLwotICAibHR1IiwJLyogMzkgKi8KLSAgImxlIiwJLyogNDAgKi8KLSAgImx0IiwJLyogNDEgKi8KLSAgIm5vdCIsCS8qIDQyICovCi0gICJuZWciLAkvKiA0MyAqLwotICAibG9wIiwJLyogNDQgKi8KLSAgImNwcnMiLAkvKiA0NSAqLwotICAibm9wIiwJLyogNDYgKi8KLSAgImJyIiwJLyogNDcgKi8KLSAgImJyaSIsCS8qIDQ4ICovCi0gICJicmEiLAkvKiA0OSAqLwotICAiYnJzIiwJLyogNTAgKi8KLSAgImxkdmkiLAkvKiA1MSAqLwotICAic3R2aSIsCS8qIDUyICovCi0gICJsZHNkciIsCS8qIDUzICovCi0gICJsZGtkciIsCS8qIDU0ICovCi0gICJsbiIsCS8qIDU1ICovCi0gICJwYXR1IiwJLyogNTYgKi8KLSAgInBhdGUiLAkvKiA1NyAqLwotICAicGljaCIsCS8qIDU4ICovCi0gICJwbGNoIiwJLyogNTkgKi8KLSAgImlkbGUiLAkvKiA2MCAqLwotICAicnRucSIsCS8qIDYxICovCi0gICJjZm9yayIsCS8qIDYyICovCi0gICJydG4iLAkvKiA2MyAqLwotICAid2ZvcmsiLAkvKiA2NCAqLwotICAiam9pbiIsCS8qIDY1ICovCi0gICJydG5jIiwJLyogNjYgKi8KLSAgImV4cCIsCS8qIDY3ICovCi0gICJzaW4iLAkvKiA2OCAqLwotICAiY29zIiwJLyogNjkgKi8KLSAgInBzaCIsCS8qIDcwICovCi0gICJwb3AiLAkvKiA3MSAqLwotICAiZW5pIiwJLyogNzIgKi8KLSAgImRzaSIsCS8qIDczICovCi0gICJia3B0IiwJLyogNzQgKi8KLSAgIm1zeW5jIiwJLyogNzUgKi8KLSAgIm1za2kiLAkvKiA3NiAqLwotICAieG10aSIsCS8qIDc3ICovCi0gICJ0c3R2diIsCS8qIDc4ICovCi0gICJkaWFnIiwJLyogNzkgKi8KLSAgInBia3B0IiwJLyogODAgKi8KLSAgInNxcnQiLAkvKiA4MSAqLwotICAiY2FzciIsCS8qIDgyICovCi0gICJhdGFuIiwJLyogODMgKi8KLSAgInN1bSIsCS8qIDg0ICovCi0gICJhbGwiLAkvKiA4NSAqLwotICAiYW55IiwJLyogODYgKi8KLSAgInBhcml0eSIsCS8qIDg3ICovCi0gICJtYXgiLAkvKiA4OCAqLwotICAibWluIiwJLyogODkgKi8KLSAgInByb2QiLAkvKiA5MCAqLwotICAiaGFsdCIsCS8qIDkxICovCi0gICJzeXNjIiwJLyogOTIgKi8KLSAgInRyYXAiLAkvKiA5MyAqLwotICAidHN0IiwJLyogOTQgKi8KLSAgImxjayIsCS8qIDk1ICovCi0gICJ1bGsiLAkvKiA5NiAqLwotICAic3Bhd24iLAkvKiA5NyAqLwotICAibGRjbXIiLAkvKiA5OCAqLwotICAic3RjbXIiLAkvKiA5OSAqLwotICAicG9wciIsCS8qIDEwMCAqLwotICAicHNociIsCS8qIDEwMSAqLwotICAicmN2ciIsCS8qIDEwMiAqLwotICAibWF0bSIsCS8qIDEwMyAqLwotICAic25kciIsCS8qIDEwNCAqLwotICAicHV0ciIsCS8qIDEwNSAqLwotICAiZ2V0ciIsCS8qIDEwNiAqLwotICAibWF0ciIsCS8qIDEwNyAqLwotICAibWF0IiwJLyogMTA4ICovCi0gICJnZXQiLAkvKiAxMDkgKi8KLSAgInJjdiIsCS8qIDExMCAqLwotICAiaW5jIiwJLyogMTExICovCi0gICJwdXQiLAkvKiAxMTIgKi8KLSAgInNuZCIsCS8qIDExMyAqLwotICAiZW5hbCIsCS8qIDExNCAqLwotICAiZW5hZyIsCS8qIDExNSAqLwotICAiZnJpbnQiLAkvKiAxMTYgKi8KLSAgInhwbmQiLAkvKiAxMTcgKi8KLSAgImN0cnNsIiwJLyogMTE4ICovCi0gICJjdHJzZyIsCS8qIDExOSAqLwotICAic3RvcCIsCS8qIDEyMCAqLwotfTsKLQotY2hhciAqcm9wW10gPSB7Ci0gICIiLAkvKiAwICovCi0gICIudCIsCS8qIDEgKi8KLSAgIi5mIiwJLyogMiAqLwotICAiLnMiLAkvKiAzICovCi0gICIuZCIsCS8qIDQgKi8KLSAgIi5iIiwJLyogNSAqLwotICAiLmgiLAkvKiA2ICovCi0gICIudyIsCS8qIDcgKi8KLSAgIi5sIiwJLyogOCAqLwotICAiLngiLAkvKiA5ICovCi0gICIudSIsCS8qIDEwICovCi0gICIucy5mIiwJLyogMTEgKi8KLSAgIi5kLmYiLAkvKiAxMiAqLwotICAiLmIuZiIsCS8qIDEzICovCi0gICIuaC5mIiwJLyogMTQgKi8KLSAgIi53LmYiLAkvKiAxNSAqLwotICAiLmwuZiIsCS8qIDE2ICovCi0gICIudC5mIiwJLyogMTcgKi8KLSAgIi5zLnQiLAkvKiAxOCAqLwotICAiLmQudCIsCS8qIDE5ICovCi0gICIuYi50IiwJLyogMjAgKi8KLSAgIi5oLnQiLAkvKiAyMSAqLwotICAiLncudCIsCS8qIDIyICovCi0gICIubC50IiwJLyogMjMgKi8KLSAgIi50LnQiLAkvKiAyNCAqLwotfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2QxMHYuaCBiL2luY2x1ZGUvb3Bjb2RlL2QxMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2ZDMyZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9kMTB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyogZDEwdi5oIC0tIEhlYWRlciBmaWxlIGZvciBEMTBWIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEQxMFZfSAotI2RlZmluZSBEMTBWX0gKLQotLyogRm9ybWF0IFNwZWNpZmllciAqLwotI2RlZmluZSBGTTAwCTAKLSNkZWZpbmUgRk0wMQkweDQwMDAwMDAwCi0jZGVmaW5lIEZNMTAJMHg4MDAwMDAwMAotI2RlZmluZSBGTTExCTB4QzAwMDAwMDAKLQotI2RlZmluZSBOT1AgMHg1ZTAwCi0jZGVmaW5lIE9QQ09ERV9ESVZTCTB4MTQwMDI4MDAKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDEwdl9vcGNvZGUuICAqLwotCi1zdHJ1Y3QgZDEwdl9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiB0aGUgb3Bjb2RlIGZvcm1hdCAqLwotICBpbnQgZm9ybWF0OwotCi0gIC8qIFRoZXNlIG51bWJlcnMgd2VyZSBwaWNrZWQgc28gd2UgY2FuIGRvIGlmKCBpICYgU0hPUlRfT1BDT0RFKSAqLwotI2RlZmluZSBTSE9SVF9PUENPREUgMQotI2RlZmluZSBMT05HX09QQ09ERSAgOAotI2RlZmluZSBTSE9SVF8yCSAgICAgMQkJLyogc2hvcnQgd2l0aCAyIG9wZXJhbmRzICovCi0jZGVmaW5lIFNIT1JUX0IJICAgICAzCQkvKiBzaG9ydCB3aXRoIDgtYml0IGJyYW5jaCAqLwotI2RlZmluZSBMT05HX0IJICAgICA4CQkvKiBsb25nIHdpdGggMTYtYml0IGJyYW5jaCAqLwotI2RlZmluZSBMT05HX0wgICAgICAgMTAJCS8qIGxvbmcgd2l0aCAzIG9wZXJhbmRzICovCi0jZGVmaW5lIExPTkdfUiAgICAgICAxMgkJLyogcmVzZXJ2ZWQgKi8KLQotICAvKiBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIHZhcmlhYmxlLWxlbmd0aCBpbnN0cnVjdGlvbnMgKi8KLSAgLyogZm9yIGV4YW1wbGUsICJicmEiIHdpbGwgYmUgYSBmYWtlIGZvciAiYnJhLnMiIGFuZCBicmEubCIgKi8KLSAgLyogd2hpY2ggd2lsbCBpbW1lZGlhdGVseSBmb2xsb3cgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0jZGVmaW5lIE9QQ09ERV9GQUtFICAzMgotCi0gIC8qIHRoZSBudW1iZXIgb2YgY3ljbGVzICovCi0gIGludCBjeWNsZXM7Ci0KLSAgLyogdGhlIGV4ZWN1dGlvbiB1bml0KHMpIHVzZWQgKi8KLSAgaW50IHVuaXQ7Ci0jZGVmaW5lIEVJVEhFUgkwCi0jZGVmaW5lIElVCTEKLSNkZWZpbmUgTVUJMgotI2RlZmluZSBCT1RICTMKLQotICAvKiBleGVjdXRpb24gdHlwZTsgcGFyYWxsZWwgb3Igc2VxdWVudGlhbCAqLwotICAvKiB0aGlzIGZpZWxkIGlzIHVzZWQgdG8gZGVjaWRlIGlmIHR3byBpbnN0cnVjdGlvbnMgKi8KLSAgLyogY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsICovCi0gIGludCBleGVjX3R5cGU7Ci0jZGVmaW5lIFBBUk9OTFkgMQkvKiBwYXJhbGxlbCBvbmx5ICovCi0jZGVmaW5lIFNFUQkyCS8qIG11c3QgYmUgc2VxdWVudGlhbCAqLwotI2RlZmluZSBQQVIJNAkvKiBtYXkgYmUgcGFyYWxsZWwgKi8KLSNkZWZpbmUgQlJBTkNIX0xJTksgOAkvKiBzdWJyb3V0aW5lIGNhbGwuICBtdXN0IGJlIGFsaWduZWQgKi8KLSNkZWZpbmUgUk1FTSAgICAgMTYJLyogcmVhZHMgbWVtb3J5ICovCi0jZGVmaW5lIFdNRU0gICAgIDMyCS8qIHdyaXRlcyBtZW1vcnkgKi8KLSNkZWZpbmUgUkYwICAgICAgNjQJLyogcmVhZHMgZjAgKi8KLSNkZWZpbmUgV0YwICAgICAxMjgJLyogbW9kaWZpZXMgZjAgKi8KLSNkZWZpbmUgV0NBUiAgICAyNTYJLyogd3JpdGUgQ2FycnkgKi8KLSNkZWZpbmUgQlJBTkNIICA1MTIJLyogYnJhbmNoLCBubyBsaW5rICovCi0KLSAgLyogdGhlIG9wY29kZSAqLwotICBsb25nIG9wY29kZTsKLQotICAvKiBtYXNrLiAgaWYoIChpICYgbWFzaykgPT0gb3Bjb2RlICkgdGhlbiBtYXRjaCAqLwotICBsb25nIG1hc2s7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s2XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZDEwdl9vcGNvZGUgZDEwdl9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IGQxMHZfbnVtX29wY29kZXM7Ci0KLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDEwdl9vcGVyYW5kLiAgKi8KLXN0cnVjdCBkMTB2X29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgaW50IGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSBkMTB2X29wY29kZXMgdGFibGUuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGQxMHZfb3BlcmFuZCBkMTB2X29wZXJhbmRzW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgZDEwdl9vcGVyYW5kLiAgKi8KLQotLyogdGhlIG9wZXJhbmQgbXVzdCBiZSBhbiBldmVuIG51bWJlciAqLwotI2RlZmluZSBPUEVSQU5EX0VWRU4JKDEpCi0KLS8qIHRoZSBvcGVyYW5kIG11c3QgYmUgYW4gb2RkIG51bWJlciAqLwotI2RlZmluZSBPUEVSQU5EX09ERAkoMikJCi0KLS8qIHRoaXMgaXMgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyOyBpdCB3aWxsIGJlIG1vZGlmaWVkICovCi0vKiB0aGlzIGlzIHVzZWQgYnkgdGhlIG9wdGltaXplciAqLwotI2RlZmluZSBPUEVSQU5EX0RFU1QJKDQpCi0KLS8qIG51bWJlciBvciBzeW1ib2wgKi8KLSNkZWZpbmUgT1BFUkFORF9OVU0JKDgpCi0KLS8qIGFkZHJlc3Mgb3IgbGFiZWwgKi8KLSNkZWZpbmUgT1BFUkFORF9BRERSCSgweDEwKQotCi0vKiByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX1JFRwkoMHgyMCkKLQotLyogcG9zdGluY3JlbWVudCArICAqLwotI2RlZmluZSBPUEVSQU5EX1BMVVMJKDB4NDApCi0KLS8qIHBvc3RkZWNyZW1lbnQgLSAgKi8KLSNkZWZpbmUgT1BFUkFORF9NSU5VUwkoMHg4MCkKLQotLyogQCAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVFNJR04JKDB4MTAwKQotCi0vKiBAKCAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVFBBUgkoMHgyMDApCi0KLS8qIGFjY3VtdWxhdG9yIDAgKi8KLSNkZWZpbmUgT1BFUkFORF9BQ0MwCSgweDQwMCkKLQotLyogYWNjdW11bGF0b3IgMSAqLwotI2RlZmluZSBPUEVSQU5EX0FDQzEJKDB4ODAwKQotCi0vKiBmMCAvIGYxIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9GRkxBRwkoMHgxMDAwKQotCi0vKiBjIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9DRkxBRwkoMHgyMDAwKQotCi0vKiBjb250cm9sIHJlZ2lzdGVyICAqLwotI2RlZmluZSBPUEVSQU5EX0NPTlRST0wJKDB4NDAwMCkKLQotLyogcHJlZGVjcmVtZW50IG1vZGUgJ0Atc3AnICAqLwotI2RlZmluZSBPUEVSQU5EX0FUTUlOVVMJKDB4ODAwMCkKLQotLyogc2lnbmVkIG51bWJlciAqLwotI2RlZmluZSBPUEVSQU5EX1NJR05FRAkoMHgxMDAwMCkKLQotLyogc3BlY2lhbCBhY2N1bXVsYXRvciBzaGlmdHMgbmVlZCBhIDQtYml0IG51bWJlciAqLwotLyogMSA8PSB4IDw9IDE2ICovCi0jZGVmaW5lIE9QRVJBTkRfU0hJRlQJKDB4MjAwMDApCi0KLS8qIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX0dQUgkoMHg0MDAwMCkKLQotLyogc3BlY2lhbCBpbW0zIHZhbHVlcyB3aXRoIHJhbmdlIHJlc3RyaWN0ZWQgdG8gLTIgPD0gaW1tMyA8PSAzICovCi0vKiBuZWVkZWQgZm9yIHJhYy9yYWNoaSAqLwotI2RlZmluZSBSRVNUUklDVEVEX05VTTMJKDB4ODAwMDApCi0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCBwZF9yZWcKLXsKLSAgY2hhciAqbmFtZTsJCS8qIG5hbWUgdG8gcmVjb2duaXplICovCi0gIGNoYXIgKnBuYW1lOwkJLyogbmFtZSB0byBwcmludCBmb3IgdGhpcyByZWdpc3RlciAqLwotICBpbnQgdmFsdWU7Ci19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHBkX3JlZyBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW107Ci1pbnQgZDEwdl9yZWdfbmFtZV9jbnQoKTsKLQotLyogYW4gZXhwcmVzc2lvblMgb25seSBoYXMgb25lIHJlZ2lzdGVyIHR5cGUsIHNvIHdlIGZha2UgaXQgKi8KLS8qIGJ5IHNldHRpbmcgaGlnaCBiaXRzIHRvIGluZGljYXRlIHR5cGUgKi8KLSNkZWZpbmUgUkVHSVNURVJfTUFTSwkweEZGCi0KLSNlbmRpZiAvKiBEMTBWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2QzMHYuaCBiL2luY2x1ZGUvb3Bjb2RlL2QzMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjN2MzNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9kMzB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyogZDMwdi5oIC0tIEhlYWRlciBmaWxlIGZvciBEMzBWIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLCBDeWdudXMgU29sdXRpb25zCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgRDMwVl9ICi0jZGVmaW5lIEQzMFZfSAotCi0jZGVmaW5lIE5PUCAweDAwRjAwMDAwCi0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCBwZF9yZWcKLXsKLSAgY2hhciAqbmFtZTsJCS8qIG5hbWUgdG8gcmVjb2duaXplICovCi0gIGNoYXIgKnBuYW1lOwkJLyogbmFtZSB0byBwcmludCBmb3IgdGhpcyByZWdpc3RlciAqLwotICBpbnQgdmFsdWU7Ci19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHBkX3JlZyBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbXTsKLWludCByZWdfbmFtZV9jbnQoKTsKLQotLyogdGhlIG51bWJlciBvZiBjb250cm9sIHJlZ2lzdGVycyAqLwotI2RlZmluZSBNQVhfQ09OVFJPTF9SRUcJNjQKLQotLyogZGVmaW5lIHRoZSBmb3JtYXQgc3BlY2lmaWVycyAqLwotI2RlZmluZSBGTTAwCTAKLSNkZWZpbmUgRk0wMQkweDgwMDAwMDAwCi0jZGVmaW5lIEZNMTAJMHg4MDAwMDAwMDAwMDAwMDAwTEwKLSNkZWZpbmUgRk0xMQkweDgwMDAwMDAwODAwMDAwMDBMTAotCi0vKiBkZWZpbmUgdGhlIG9wY29kZSBjbGFzc2VzICovCi0jZGVmaW5lIEJSQQkwCi0jZGVmaW5lIExPR0lDCTEKLSNkZWZpbmUgSU1FTQkyCi0jZGVmaW5lIElBTFUxCTQKLSNkZWZpbmUgSUFMVTIJNQotCi0vKiBkZWZpbmUgdGhlIGV4ZWN1dGlvbiBjb25kaXRpb24gY29kZXMgKi8KLSNkZWZpbmUgRUNDX0FMCTAJLyogQUx3YXlzIChkZWZhdWx0KSAqLwotI2RlZmluZSBFQ0NfVFgJMQkvKiBGMD1UcnVlLCBGMT1Eb24ndCBjYXJlICovCi0jZGVmaW5lIEVDQ19GWAkyCS8qIEYwPUZhbHNlLCBGMT1Eb24ndCBjYXJlICovCi0jZGVmaW5lIEVDQ19YVAkzCS8qIEYwPURvbid0IGNhcmUsIEYxPVRydWUgKi8KLSNkZWZpbmUgRUNDX1hGCTQJLyogRjA9RG9uJ3QgY2FyZSwgRjE9RmFsc2UgKi8KLSNkZWZpbmUgRUNDX1RUCTUJLyogRjA9VHJ1ZSwgRjE9VHJ1ZSAqLwotI2RlZmluZSBFQ0NfVEYJNgkvKiBGMD1UcnVlLCBGMT1GYWxzZSAqLwotI2RlZmluZSBFQ0NfUkVTRVJWRUQJNwkvKiByZXNlcnZlZCAqLwotI2RlZmluZSBFQ0NfTUFYCUVDQ19SRVNFUlZFRAotCi1leHRlcm4gY29uc3QgY2hhciAqZDMwdl9lY2NfbmFtZXNbXTsKLQotLyogY29uZGl0aW9uIGNvZGUgdGFibGUgZm9yIENNUCBhbmQgQ01QVSAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmQzMHZfY2NfbmFtZXNbXTsKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDMwdl9vcGNvZGUuICAqLwotc3RydWN0IGQzMHZfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogdGhlIG9wY29kZSAqLwotICBpbnQgb3AxOwkvKiBmaXJzdCBwYXJ0LCAiSUFMVTEiIGZvciBleGFtcGxlICovCi0gIGludCBvcDI7CS8qIHRoZSByZXN0IG9mIHRoZSBvcGNvZGUgKi8KLQotICAvKiBvcGNvZGUgZm9ybWF0KHMpLiAgVGhlc2UgbnVtYmVycyBjb3JyZXNwb25kIHRvIGVudHJpZXMgKi8KLSAgLyogaW4gdGhlIGQzMHZfZm9ybWF0X3RhYmxlICovCi0gIHVuc2lnbmVkIGNoYXIgZm9ybWF0WzRdOwotCi0jZGVmaW5lIFNIT1JUX00JCTEKLSNkZWZpbmUgU0hPUlRfTTIJNQkvKiBmb3IgbGQydyBhbmQgc3QydyAqLwotI2RlZmluZSBTSE9SVF9BCQk5Ci0jZGVmaW5lIFNIT1JUX0IxCTExCi0jZGVmaW5lIFNIT1JUX0IyCTEyCi0jZGVmaW5lIFNIT1JUX0IzCTEzCi0jZGVmaW5lIFNIT1JUX0IzYgkxNQotI2RlZmluZSBTSE9SVF9EMQkxNwotI2RlZmluZSBTSE9SVF9EMgkxOQotI2RlZmluZSBTSE9SVF9EMkIJMjEKLSNkZWZpbmUgU0hPUlRfVQkJMjMJLyogdW5hcnkgU0hPUlRfQS4gIEFCUyBmb3IgZXhhbXBsZSAqLwotI2RlZmluZSBTSE9SVF9GCQkyNQkvKiBTSE9SVF9BIHdpdGggZmxhZyByZWdpc3RlcnMgKi8KLSNkZWZpbmUgU0hPUlRfQUYJMjcJLyogU0hPUlRfQSB3aXRoIG9ubHkgdGhlIGZpcnN0IHJlZ2lzdGVyIGEgZmxhZyByZWdpc3RlciAqLwotI2RlZmluZSBTSE9SVF9UCQkyOQkvKiBmb3IgdHJhcCBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBTSE9SVF9BNQkzMAkvKiBTSE9SVF9BIHdpdGggYSA1LWJpdCBpbW1lZGlhdGUgaW5zdGVhZCBvZiA2ICovCi0jZGVmaW5lIFNIT1JUX0NNUAkzMgkvKiBzcGVjaWFsIGZvcm0gZm9yIENNUGNjICovCi0jZGVmaW5lIFNIT1JUX0NNUFUJMzQJLyogc3BlY2lhbCBmb3JtIGZvciBDTVBVY2MgKi8KLSNkZWZpbmUgU0hPUlRfQTEJMzYJLyogc3BlY2lhbCBmb3JtIG9mIFNIT1JUX0EgZm9yIE1BQ2Egb3Bjb2RlcyB3aGVyZSBhPTEgKi8KLSNkZWZpbmUgU0hPUlRfQUEJMzgJLyogU0hPUlRfQSB3aXRoIHRoZSBmaXJzdCByZWdpc3RlciBhbiBhY2N1bXVsYXRvciAqLwotI2RlZmluZSBTSE9SVF9SQQk0MAkvKiBTSE9SVF9BIHdpdGggdGhlIHNlY29uZCByZWdpc3RlciBhbiBhY2N1bXVsYXRvciAqLwotI2RlZmluZSBTSE9SVF9NT0RJTkMJNDIJCi0jZGVmaW5lIFNIT1JUX01PRERFQwk0MwotI2RlZmluZSBTSE9SVF9DMQk0NAotI2RlZmluZSBTSE9SVF9DMgk0NQotI2RlZmluZSBTSE9SVF9VRgk0NgotI2RlZmluZSBTSE9SVF9BMgk0NwotI2RlZmluZSBTSE9SVF9BNVMJNDkKLSNkZWZpbmUgU0hPUlRfTk9ORQk1MQkvKiBubyBvcGVyYW5kcyAqLwotI2RlZmluZSBMT05HCQk1MgotI2RlZmluZSBMT05HX1UJCTUzCS8qIHVuYXJ5IExPTkcgKi8KLSNkZWZpbmUgTE9OR19BRgkJNTQJLyogTE9ORyB3aXRoIHRoZSBmaXJzdCByZWdpc3RlciBhIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTE9OR19DTVAJNTUJLyogc3BlY2lhbCBmb3JtIGZvciBDTVBjYyBhbmQgQ01QVWNjICovCi0jZGVmaW5lIExPTkdfTQkJNTYJLyogTWVtb3J5IGxvbmcgZm9yIGxkYiwgc3RiICovCi0jZGVmaW5lIExPTkdfTTIJCTU3CS8qIE1lbW9yeSBsb25nIGZvciBsZDJ3LCBzdDJ3ICovCi0jZGVmaW5lIExPTkdfMgkJNTgJLyogTE9ORyB3aXRoIDIgb3BlcmFuZHM7IGJyYXRueiAqLwotI2RlZmluZSBMT05HXzJiCQk1OQkvKiBMT05HXzIgd2l0aCBtb2RpZmllciBvZiAzICovCi0jZGVmaW5lIExPTkdfRAkJNjAJLyogZm9yIERCUkFJKi8KLSNkZWZpbmUgTE9OR19EYgkJNjEJLyogZm9yIHJlcGVhdGkqLwotI2RlZmluZSBTSE9SVF9BUgk2MgkvKiBsaWtlIFNIT1JUX0FBIGJ1dCBvbmx5IGFjY2VwdCByZWdpc3RlciBhcyB0aGlyZCBwYXJhbWV0ZXIgICovCi0KLSAgLyogdGhlIGV4ZWN1dGlvbiB1bml0KHMpIHVzZWQgKi8KLSAgaW50IHVuaXQ7Ci0jZGVmaW5lIEVJVEhFUgkwCi0jZGVmaW5lIElVCTEKLSNkZWZpbmUgTVUJMgotI2RlZmluZSBFSVRIRVJfQlVUX1BSRUZFUl9NVSAzCi0KLSAgLyogdGhpcyBmaWVsZCBpcyB1c2VkIHRvIGRlY2lkZSBpZiB0d28gaW5zdHJ1Y3Rpb25zICovCi0gIC8qIGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCAqLwotICBsb25nIGZsYWdzX3VzZWQ7Ci0gIGxvbmcgZmxhZ3Nfc2V0OwotI2RlZmluZSBGTEFHXzAJCSgxTDw8MCkKLSNkZWZpbmUgRkxBR18xCQkoMUw8PDEpCi0jZGVmaW5lIEZMQUdfMgkJKDFMPDwyKQotI2RlZmluZSBGTEFHXzMJCSgxTDw8MykKLSNkZWZpbmUgRkxBR180CQkoMUw8PDQpCQkvKiBTIChzYXR1cmF0aW9uKSAqLwotI2RlZmluZSBGTEFHXzUJCSgxTDw8NSkJCS8qIFYgKG92ZXJmbG93KSAqLwotI2RlZmluZSBGTEFHXzYJCSgxTDw8NikJCS8qIFZBIChhY2N1bXVsYXRlZCBvdmVyZmxvdykgKi8KLSNkZWZpbmUgRkxBR183CQkoMUw8PDcpCQkvKiBDIChjYXJyeS9ib3Jyb3cpICovCi0jZGVmaW5lIEZMQUdfU00JCSgxTDw8OCkJCS8qIFNNIChzdGFjayBtb2RlKSAqLwotI2RlZmluZSBGTEFHX1JQCQkoMUw8PDkpCQkvKiBSUCAocmVwZWF0IGVuYWJsZSkgKi8KLSNkZWZpbmUgRkxBR19DT05UUk9MCSgxTDw8MTApCS8qIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0jZGVmaW5lIEZMQUdfQTAJCSgxTDw8MTEpCS8qIEEwICovCi0jZGVmaW5lIEZMQUdfQTEJCSgxTDw8MTIpCS8qIEExICovCi0jZGVmaW5lIEZMQUdfSk1QCSgxTDw8MTMpCS8qIGluc3RydWN0aW9uIGlzIGEgYnJhbmNoICovCi0jZGVmaW5lIEZMQUdfSlNSCSgxTDw8MTQpCS8qIHN1YnJvdXRpbmUgY2FsbC4gIG11c3QgYmUgYWxpZ25lZCAqLwotI2RlZmluZSBGTEFHX01FTQkoMUw8PDE1KQkvKiByZWFkcy93cml0ZXMgbWVtb3J5ICovCi0jZGVmaW5lIEZMQUdfMldPUkQJKDFMPDwxNikJLyogMiB3b3JkLzQgYnl0ZSBvcGVyYXRpb24gKi8KLSNkZWZpbmUgRkxBR19NVUwxNgkoMUw8PDE3KQkvKiAxNiBiaXQgbXVsdGlwbHkgKi8KLSNkZWZpbmUgRkxBR19NVUwzMgkoMUw8PDE4KQkvKiAzMiBiaXQgbXVsdGlwbHkgKi8KLSNkZWZpbmUgRkxBR19BRERTVUJwcHAJKDFMPDwxOSkJLyogQUREcHBwIG9yIFNVQnBwcCAqLwotI2RlZmluZSBGTEFHX0RFTEFZCSgxTDw8MjApCS8qIFRoaXMgaXMgYSBkZWxheWVkIGJyYW5jaCBvciBqdW1wICovCi0jZGVmaW5lIEZMQUdfTEtSCSgxTDw8MjEpCS8qIGluc24gaW4gbGVmdCBzbG90IGtpbGxzIHJpZ2h0IHNsb3QgKi8KLSNkZWZpbmUgRkxBR19DVlZBCShGTEFHXzV8RkxBR182fEZMQUdfNykKLSNkZWZpbmUgRkxBR19DCQlGTEFHXzcKLSNkZWZpbmUgRkxBR19BTEwJKEZMQUdfMCB8IFwKLQkJCSBGTEFHXzEgfCBcCi0JCQkgRkxBR18yIHwgXAotCQkJIEZMQUdfMyB8IFwKLQkJCSBGTEFHXzQgfCBcCi0JCQkgRkxBR181IHwgXAotCQkJIEZMQUdfNiB8IFwKLQkJCSBGTEFHXzcgfCBcCi0JCQkgRkxBR19TTSB8IFwKLQkJCSBGTEFHX1JQIHwgXAotCQkJIEZMQUdfQ09OVFJPTCkKLQotICBpbnQgcmVsb2NfZmxhZzsKLSNkZWZpbmUgUkVMT0NfUENSRUwJMQotI2RlZmluZSBSRUxPQ19BQlMJMgotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMzB2X29wY29kZSBkMzB2X29wY29kZV90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IGludCBkMzB2X251bV9vcGNvZGVzOwotCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQzMHZfb3BlcmFuZC4gICovCi1zdHJ1Y3QgZDMwdl9vcGVyYW5kCi17Ci0gIC8qIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkICovCi0gIGludCBsZW5ndGg7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogcG9zaXRpb24gcmVsYXRpdmUgdG8gUmEgKi8KLSAgaW50IHBvc2l0aW9uOwotCi0gIC8qIHN5bnRheCBmbGFncy4gICovCi0gIGxvbmcgZmxhZ3M7Ci19OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMzB2X29wZXJhbmQgZDMwdl9vcGVyYW5kX3RhYmxlW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgZDMwdl9vcGVyYW5kLiAgKi8KLQotLyogdGhpcyBpcyB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXI7IGl0IHdpbGwgYmUgbW9kaWZpZWQgKi8KLS8qIHRoaXMgaXMgdXNlZCBieSB0aGUgb3B0aW1pemVyICovCi0jZGVmaW5lIE9QRVJBTkRfREVTVAkoMSkKLQotLyogbnVtYmVyIG9yIHN5bWJvbCAqLwotI2RlZmluZSBPUEVSQU5EX05VTQkoMikKLQotLyogYWRkcmVzcyBvciBsYWJlbCAqLwotI2RlZmluZSBPUEVSQU5EX0FERFIJKDQpCi0KLS8qIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfUkVHCSg4KQotCi0vKiBwb3N0aW5jcmVtZW50ICsgICovCi0jZGVmaW5lIE9QRVJBTkRfUExVUwkoMHgxMCkKLQotLyogcG9zdGRlY3JlbWVudCAtICAqLwotI2RlZmluZSBPUEVSQU5EX01JTlVTCSgweDIwKQotCi0vKiBzaWduZWQgbnVtYmVyICovCi0jZGVmaW5lIE9QRVJBTkRfU0lHTkVECSgweDQwKQotCi0vKiB0aGlzIG9wZXJhbmQgbXVzdCBiZSBzaGlmdGVkIGxlZnQgYnkgMyAqLwotI2RlZmluZSBPUEVSQU5EX1NISUZUCSgweDgwKQotCi0vKiBmbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfRkxBRwkoMHgxMDApCi0KLS8qIGNvbnRyb2wgcmVnaXN0ZXIgICovCi0jZGVmaW5lIE9QRVJBTkRfQ09OVFJPTAkoMHgyMDApCi0KLS8qIGFjY3VtdWxhdG9yICovCi0jZGVmaW5lIE9QRVJBTkRfQUNDCSgweDQwMCkKLQotLyogQCAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVFNJR04JKDB4ODAwKQotCi0vKiBAKCAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVFBBUgkoMHgxMDAwKQotCi0vKiBwcmVkZWNyZW1lbnQgbW9kZSAnQC1zcCcgICovCi0jZGVmaW5lIE9QRVJBTkRfQVRNSU5VUwkoMHgyMDAwKQotCi0vKiB0aGlzIG9wZXJhbmQgY2hhbmdlcyB0aGUgaW5zdHJ1Y3Rpb24gbmFtZSAqLwotLyogZm9yIGV4YW1wbGUsIENQTWNjLCBDTVBVY2MgKi8KLSNkZWZpbmUgT1BFUkFORF9OQU1FCSgweDQwMDApCi0KLS8qIGZha2Ugb3BlcmFuZCBmb3IgbXZ0c3lzIGFuZCBtdmZzeXMgKi8KLSNkZWZpbmUgT1BFUkFORF9TUEVDSUFMCSgweDgwMDApCi0KLS8qIGxldCB0aGUgb3B0aW1pemVyIGtub3cgdGhhdCB0d28gcmVnaXN0ZXJzIGFyZSBhZmZlY3RlZCAqLwotI2RlZmluZSBPUEVSQU5EXzJSRUcJKDB4MTAwMDApCi0KLS8qIFRoZSBmb3JtYXQgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQzMHZfZm9ybWF0LiAgKi8KLXN0cnVjdCBkMzB2X2Zvcm1hdAotewotICBpbnQJZm9ybTsJCS8qIFNIT1JUX0EsIExPTkcsIGV0YyAqLwotICBpbnQJbW9kaWZpZXI7CS8qIHR3byBiaXQgbW9kaWZpZXIgZm9sbG93aW5nIG9wY29kZSAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzVdOwotfTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZDMwdl9mb3JtYXQgZDMwdl9mb3JtYXRfdGFibGVbXTsKLQotCi0vKiBhbiBpbnN0cnVjdGlvbiBpcyBkZWZpbmVkIGJ5IGFuIG9wY29kZSBhbmQgYSBmb3JtYXQgKi8KLS8qIGZvciBleGFtcGxlLCAiYWRkIiBoYXMgb25lIG9wY29kZSwgYnV0IHRocmVlIGRpZmZlcmVudCAqLwotLyogZm9ybWF0cywgMiBTSE9SVF9BIGZvcm1zIGFuZCBhIExPTkcgZm9ybS4gKi8KLXN0cnVjdCBkMzB2X2luc24KLXsKLSAgc3RydWN0IGQzMHZfb3Bjb2RlICpvcDsJLyogcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlICovCi0gIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZm9ybTsJLyogcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgZm9ybWF0IHRhYmxlICovCi0gIGludCBlY2M7CQkJLyogZXhlY3V0aW9uIGNvbmRpdGlvbiBjb2RlICovCi19OwotCi0vKiBhbiBleHByZXNzaW9uUyBvbmx5IGhhcyBvbmUgcmVnaXN0ZXIgdHlwZSwgc28gd2UgZmFrZSBpdCAqLwotLyogYnkgc2V0dGluZyBoaWdoIGJpdHMgdG8gaW5kaWNhdGUgdHlwZSAqLwotI2RlZmluZSBSRUdJU1RFUl9NQVNLCTB4RkYKLQotI2VuZGlmIC8qIEQzMFZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaDgzMDAuaCBiL2luY2x1ZGUvb3Bjb2RlL2g4MzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMDVlNGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvaDgzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwNCArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIHRoZSBIOC0zMDAKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIHNhY0BjeWdudXMuY29tLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgRGVidWdnZXIgYW5kIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBJbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBhcyBhIHNlcXVlbmNlIG9mIG5pYmJsZXMuCi0gICBJZiB0aGUgbmliYmxlIGhhcyB2YWx1ZSAxNSBvciBsZXNzIHRoZW4gdGhlIHJlcHJlc2VudGF0aW9uIGlzIGNvbXBsZXRlLgotICAgT3RoZXJ3aXNlLCB3ZSByZWNvcmQgd2hhdCBpdCBjb250YWlucyB3aXRoIHNldmVyYWwgZmxhZ3MuICAqLwotCi10eXBlZGVmIGludCBvcF90eXBlOwotCi0jZGVmaW5lIEhleDAJMAotI2RlZmluZSBIZXgxIAkxCi0jZGVmaW5lIEhleDIgCTIKLSNkZWZpbmUgSGV4MyAJMwotI2RlZmluZSBIZXg0IAk0Ci0jZGVmaW5lIEhleDUgCTUKLSNkZWZpbmUgSGV4NiAJNgotI2RlZmluZSBIZXg3IAk3Ci0jZGVmaW5lIEhleDggCTgKLSNkZWZpbmUgSGV4OSAJOQotI2RlZmluZSBIZXhBIAkxMAotI2RlZmluZSBIZXhCIAkxMQotI2RlZmluZSBIZXhDIAkxMgotI2RlZmluZSBIZXhEIAkxMwotI2RlZmluZSBIZXhFIAkxNAotI2RlZmluZSBIZXhGIAkxNQotCi0jZGVmaW5lIExfOAkJMHgwMQotI2RlZmluZSBMXzE2CQkweDAyCi0jZGVmaW5lIExfMzIJCTB4MDQKLSNkZWZpbmUgTF9QICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgTF8yNAkJMHgxMAotI2RlZmluZSBNRU1SRUxBWCAJMHgyMAkJCS8qIG1vdmUgaW5zbiB3aGljaCBtYXkgcmVsYXggKi8gCi0jZGVmaW5lIFNSQyAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIERTVCAgICAgICAgICAgICAweDgwCi0KLSNkZWZpbmUgUkVHCQkweDEwMAotI2RlZmluZSBFWFIJCTB4MjAwCi0jZGVmaW5lIE1BQ1JFRwkJMHg4MDAKLSNkZWZpbmUgU1JDX0lOX0RTVAkweDQwMAotI2RlZmluZSBJTU0JCTB4MTAwMAotI2RlZmluZSBESVNQCQkweDIwMDAKLSNkZWZpbmUgSU5ECQkweDQwMDAKLSNkZWZpbmUgSU5DCQkweDgwMDAKLSNkZWZpbmUgREVDCQkweDEwMDAwCi0jZGVmaW5lIExfMwkJMHgyMDAwMAotI2RlZmluZSBLQklUIAkJMHg0MDAwMAotI2RlZmluZSBEQklUICAgICAgICAgICAgMHg4MDAwMAotI2RlZmluZSBESVNQUkVHICAgICAgICAgMHgxMDAwMDAKLSNkZWZpbmUgSUdOT1JFIAkJMHgyMDAwMDAKLSNkZWZpbmUgRSAgICAgIAkJMHg0MDAwMDAJCS8qIEZJWE1FOiBlbmQgb2YgbmliYmxlIHNlcXVlbmNlPyAqLwotI2RlZmluZSBMXzIJCTB4ODAwMDAwCi0jZGVmaW5lIEIzMCAgCQkweDEwMDAwMDAgCQkvKiBiaXQgMyBtdXN0IGJlIGxvdyAqLwotI2RlZmluZSBCMzEgIAkJMHgyMDAwMDAwCQkvKiBiaXQgMyBtdXN0IGJlIGhpZ2ggKi8KLSNkZWZpbmUgQ0NSCQkweDQwMDAwMDAKLSNkZWZpbmUgQUJTICAgICAgICAgICAgIDB4ODAwMDAwMAotI2RlZmluZSBBQlNKTVAJCTB4MTAwMDAwMDAgIAotI2RlZmluZSBBQlM4TUVNICAgICAgICAgMHgyMDAwMDAwMAkKLSNkZWZpbmUgUENSRUwgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgTUVNSU5EICAgICAgICAgIDB4ODAwMDAwMDAKLQotI2RlZmluZSBJTU0zIAkJSU1NfExfMwotI2RlZmluZSBJTU0yIAkJSU1NfExfMgotCi0jZGVmaW5lIFNJWkUJCShMXzJ8TF8zfExfOHxMXzE2fExfMzJ8TF9QfExfMjQpCi0jZGVmaW5lIE1PREUJCShSRUd8SU1NfERJU1B8SU5EfElOQ3xERUN8Q0NSfEFCU3xNRU1JTkR8RVhSKQotCi0jZGVmaW5lIFJEOCAJCShEU1R8TF84fFJFRykKLSNkZWZpbmUgUkQxNiAJCShEU1R8TF8xNnxSRUcpCi0jZGVmaW5lIFJEMzIgCQkoRFNUfExfMzJ8UkVHKQotI2RlZmluZSBSUzggCQkoU1JDfExfOHxSRUcpCi0jZGVmaW5lIFJTMTYgCQkoU1JDfExfMTZ8UkVHKQotI2RlZmluZSBSUzMyCQkoU1JDfExfMzJ8UkVHKQotCi0jZGVmaW5lIFJTUCAJCShTUkN8TF9QfFJFRykKLSNkZWZpbmUgUkRQIAkJKERTVHxMX1B8UkVHKQotCi0jZGVmaW5lIElNTTggCQkoSU1NfFNSQ3xMXzgpCi0jZGVmaW5lIElNTTE2IAkJKElNTXxTUkN8TF8xNikKLSNkZWZpbmUgSU1NMzIgCQkoSU1NfFNSQ3xMXzMyKQotCi0jZGVmaW5lIEFCUzhTUkMgCShTUkN8QUJTfExfOHxBQlM4TUVNKQotI2RlZmluZSBBQlM4RFNUCQkoRFNUfEFCU3xMXzh8QUJTOE1FTSkKLQotI2RlZmluZSBESVNQOCAJCShQQ1JFTHxMXzgpCi0jZGVmaW5lIERJU1AxNiAJCShQQ1JFTHxMXzE2KQotCi0jZGVmaW5lIERJU1A4U1JDCShESVNQfExfOHxTUkMpCi0jZGVmaW5lIERJU1AxNlNSQwkoRElTUHxMXzE2fFNSQykKLQotI2RlZmluZSBESVNQOERTVAkoRElTUHxMXzh8RFNUKQotI2RlZmluZSBESVNQMTZEU1QJKERJU1B8TF8xNnxEU1QpCi0KLSNkZWZpbmUgQUJTMTZTUkMgCShTUkN8QUJTfExfMTYpCi0jZGVmaW5lIEFCUzE2RFNUIAkoRFNUfEFCU3xMXzE2KQotI2RlZmluZSBBQlMyNFNSQyAJKFNSQ3xBQlN8TF8yNCkKLSNkZWZpbmUgQUJTMjREU1QgCShEU1R8QUJTfExfMjQpCi0jZGVmaW5lIEFCUzMyU1JDIAkoU1JDfEFCU3xMXzMyKQotI2RlZmluZSBBQlMzMkRTVCAJKERTVHxBQlN8TF8zMikKLQotI2RlZmluZSBSRERFQyAJCShEU1R8REVDKQotI2RlZmluZSBSU0lOQyAJCShTUkN8SU5DKQotI2RlZmluZSBSRElOQwkJKERTVHxJTkMpCi0KLSNkZWZpbmUgUkRJTkQgCQkoRFNUfElORCkKLSNkZWZpbmUgUlNJTkQgCQkoU1JDfElORCkKLQotI2lmIDEKLSNkZWZpbmUgT1I4IFJTOAkJLyogPz8/IE9SIGFzIGluIE9uZSBSZWdpc3Rlcj8gKi8KLSNkZWZpbmUgT1IxNiBSUzE2Ci0jZGVmaW5lIE9SMzIgUlMzMgotI2Vsc2UKLSNkZWZpbmUgT1I4IFJEOAotI2RlZmluZSBPUjE2IFJEMTYKLSNkZWZpbmUgT1IzMiBSRDMyCi0jZW5kaWYKLQotc3RydWN0IGNvZGUgCi17Ci0gIG9wX3R5cGUgbmliWzMwXTsKLX07Ci0KLXN0cnVjdCBhcmcgCi17Ci0gIG9wX3R5cGUgbmliWzNdOwotfTsKLQotc3RydWN0IGg4X29wY29kZSAKLXsKLSAgaW50IGhvdzsKLSAgaW50IGluYmFzZTsKLSAgaW50IHRpbWU7Ci0gIGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBhcmcgYXJnczsKLSAgc3RydWN0IGNvZGUgZGF0YTsKLSAgaW50IGxlbmd0aDsKLSAgaW50IG5vcGVyYW5kczsKLSAgaW50IGlkeDsKLSAgaW50IHNpemU7Ci19OwotCi0jaWZkZWYgREVGSU5FX1RBQkxFCi0KLSNkZWZpbmUgQklUT1AoY29kZSwgaW1tLCBuYW1lLCBvcDAwLCBvcDAxLG9wMTAsb3AxMSwgb3AyMCxvcDIxLG9wMzApXAoteyBjb2RlLCAxLCAyLCBuYW1lLAl7e2ltbSxSRDgsRX19LAl7e29wMDAsIG9wMDEsIGltbSwgUkQ4LCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LFwKLXsgY29kZSwgMSwgNiwgbmFtZSwJe3tpbW0sUkRJTkQsRX19LHt7b3AxMCwgb3AxMSwgQjMwfFJESU5ELCAwLCBvcDAwLG9wMDEsIGltbSwgMCwgRX19LCAwLCAwLCAwLCAwfSxcCi17IGNvZGUsIDEsIDYsIG5hbWUsCXt7aW1tLEFCUzhEU1QsRX19LHt7b3AyMCwgb3AyMSwgQUJTOERTVCwgSUdOT1JFLCBvcDAwLG9wMDEsIGltbSwgMCxFfX0sIDAsIDAsIDAsIDB9XAotLHsgY29kZSwgMCwgNiwgbmFtZSwJe3tpbW0sQUJTMTZEU1QsRX19LHt7MHg2LDB4YSwweDEsb3AzMCxBQlMxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSwgb3AwMCxvcDAxLCBpbW0sIDAsRX19LCAwLCAwLCAwLCAwfSxcCi17IGNvZGUsIDAsIDYsIG5hbWUsCXt7aW1tLEFCUzMyRFNULEV9fSx7ezB4NiwweGEsMHgzLG9wMzAsQUJTMzJEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLCBvcDAwLG9wMDEsIGltbSwgMCxFfX0sIDAsIDAsIDAsIDB9Ci0KLQotI2RlZmluZSBFQklUT1AoY29kZSwgaW1tLCBuYW1lLCBvcDAwLCBvcDAxLG9wMTAsb3AxMSwgb3AyMCxvcDIxLG9wMzApXAotICAgQklUT1AoY29kZSxpbW0sIG5hbWUsIG9wMDArMSwgb3AwMSwgb3AxMCxvcDExLCBvcDIwLG9wMjEsb3AzMCksXAotICAgQklUT1AoY29kZSxSUzgsICBuYW1lLCBvcDAwLCBvcDAxLCBvcDEwLG9wMTEsIG9wMjAsb3AyMSxvcDMwKQotCi0jZGVmaW5lIFdUV09QKGNvZGUsbmFtZSwgb3AxLCBvcDIpIFwKLXsgY29kZSwgMSwgMiwgbmFtZSwge3tSUzE2LCBSRDE2LCBFfX0sIHt7IG9wMSwgb3AyLCBSUzE2LCBSRDE2LCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9Ci0KLSNkZWZpbmUgQlJBTkNIKGNvZGUsIG5hbWUsIG9wKSBcCi17IGNvZGUsIDEsIDQsbmFtZSx7e0RJU1A4LEUsMH19LCB7eyAweDQsIG9wLCBESVNQOCwgSUdOT1JFLCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LCBcCi17IGNvZGUsIDAsIDYsbmFtZSx7e0RJU1AxNixFLDB9fSwge3sgMHg1LCAweDgsIG9wLCAweDAsIERJU1AxNiwgSUdOT1JFLCBJR05PUkUsIElHTk9SRSwgRSwwfX0sIDAsIDAsIDAsIDB9IAotCi0jZGVmaW5lIFNPUChjb2RlLCB4LG5hbWUpIFwKLXtjb2RlLCAxLCB4LCAgbmFtZSAKLQotI2RlZmluZSBORVdfU09QKGNvZGUsIGluLHgsbmFtZSkgXAote2NvZGUsIGluLCB4LCAgbmFtZSAKLSNkZWZpbmUgRU9QICAsMCwwLDAgfQotCi0jZGVmaW5lIFRXT09QKGNvZGUsIG5hbWUsIG9wMSwgb3AyLG9wMykgXAoteyBjb2RlLDEsIDIsbmFtZSwge3tJTU04LCBSRDgsIEV9fSwJe3sgb3AxLCBSRDgsIElNTTgsIElHTk9SRSwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSxcCi17IGNvZGUsIDEsIDIsbmFtZSwge3tSUzgsIFJEOCwgRX19LAl7eyBvcDIsIG9wMywgUlM4LCBSRDgsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0gCi0KLSNkZWZpbmUgVU5PUChjb2RlLG5hbWUsIG9wMSwgb3AyKSBcCi17IGNvZGUsIDEsIDIsIG5hbWUsIHt7T1I4LCBFLCAwfX0sIHt7IG9wMSwgb3AyLCAwLCBPUjgsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0KLQotI2RlZmluZSBVTk9QMyhjb2RlLCBuYW1lLCBvcDEsIG9wMiwgb3AzKSBcCi17IE8oY29kZSxTQiksIDEsIDIsIG5hbWUsIHt7T1I4LCAgRSwgMH19LCB7e29wMSwgb3AyLCBvcDMrMCwgT1I4LCAgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoteyBPKGNvZGUsU1cpLCAwLCAyLCBuYW1lLCB7e09SMTYsIEUsIDB9fSwge3tvcDEsIG9wMiwgb3AzKzEsIE9SMTYsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKLXsgTyhjb2RlLFNMKSwgMCwgMiwgbmFtZSwge3tPUjMyLCBFLCAwfX0sIHt7b3AxLCBvcDIsIG9wMyszLCBPUjMyfEIzMCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSBcCi0seyBPKGNvZGUsU0IpLCAxLCAyLCBuYW1lLCB7e0lNTSwgT1I4IHwgU1JDX0lOX0RTVCwgIEV9fSwge3tvcDEsIG9wMiwgb3AzKzQsIE9SOCB8IFNSQ19JTl9EU1QsICBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LCBcCi17IE8oY29kZSxTVyksIDAsIDIsIG5hbWUsIHt7SU1NLCBPUjE2IHwgU1JDX0lOX0RTVCwgRX19LCB7e29wMSwgb3AyLCBvcDMrNSwgT1IxNiB8IFNSQ19JTl9EU1QsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKLXsgTyhjb2RlLFNMKSwgMCwgMiwgbmFtZSwge3tJTU0sIE9SMzIgfCBTUkNfSU5fRFNULCBFfX0sIHt7b3AxLCBvcDIsIG9wMys3LCBPUjMyIHwgU1JDX0lOX0RTVHxCMzAgLCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9Ci0KLQotI2RlZmluZSBJTU0zMkxJU1QgSU1NMzIsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIElNTTI0TElTVCBJTU0yNCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIElNTTE2TElTVCBJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBMTZMSVNUIExfMTYsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgRElTUDI0TElTVCBESVNQfExfMjQsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBESVNQMzJMSVNUIERJU1B8TF8zMixJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgQUJTMjRMSVNUIEFCU3xMXzI0LElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgQUJTMzJMSVNUIEFCU3xMXzMyLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBMjRMSVNUIExfMjQsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBMzJMSVNUIExfMzIsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIFBSRUZJWDMyIDB4MCwweDEsMHgwLDB4MAotI2RlZmluZSBQUkVGSVhMREMgMHgwLDB4MSwweDQsMHgwCi0KLQotI2RlZmluZSBPKG9wLCBzaXplKSAob3AqNCtzaXplKQotCi0jZGVmaW5lIE9fUkVDT01QSUxFIDAKLSNkZWZpbmUgT19BREQgIDEKLSNkZWZpbmUgT19BRERYIDIKLSNkZWZpbmUgT19BTkQgIDMKLSNkZWZpbmUgT19CQU5EIDQKLSNkZWZpbmUgT19CUkEgIDUKLSNkZWZpbmUgT19CUk4gIDYKLSNkZWZpbmUgT19CSEkgIDcKLSNkZWZpbmUgT19CTFMgIDgKLSNkZWZpbmUgT19CQ0MgIDkKLSNkZWZpbmUgT19CQ1MgIDEwCi0jZGVmaW5lIE9fQk5FICAxMSAgCi0jZGVmaW5lIE9fQlZDICAxMgotI2RlZmluZSBPX0JWUyAgMTMKLSNkZWZpbmUgT19CUEwgIDE0Ci0jZGVmaW5lIE9fQk1JICAxNQotI2RlZmluZSBPX0JHRSAgMTYKLSNkZWZpbmUgT19CTFQgIDE3Ci0jZGVmaW5lIE9fQkdUICAxOAotI2RlZmluZSBPX0JMRSAgMTkKLSNkZWZpbmUgT19BTkRDIDIwCi0jZGVmaW5lIE9fQkVRIDIxCi0jZGVmaW5lIE9fQkNMUiAyMgotI2RlZmluZSBPX0JJQU5EIDIzCi0jZGVmaW5lIE9fQklMRCAyNAotI2RlZmluZSBPX0JJT1IgMjUKLSNkZWZpbmUgT19CSVhPUiAyNgotI2RlZmluZSBPX0JJU1QgMjcKLSNkZWZpbmUgT19CTEQgMjgKLSNkZWZpbmUgT19CTk9UIDI5Ci0jZGVmaW5lIE9fQlNFVCAzMAotI2RlZmluZSBPX0JTUiAzMQotI2RlZmluZSBPX0JYT1IgMzIKLSNkZWZpbmUgT19DTVAgMzMKLSNkZWZpbmUgT19EQUEgMzQKLSNkZWZpbmUgT19EQVMgMzUKLSNkZWZpbmUgT19ERUMgMzYKLSNkZWZpbmUgT19ESVZVIDM3Ci0jZGVmaW5lIE9fRElWUyAzOAotI2RlZmluZSBPX0lOQyAzOQotI2RlZmluZSBPX0xEQyA0MAotI2RlZmluZSBPX01PVl9UT19NRU0gNDEKLSNkZWZpbmUgT19PUiA0MgotI2RlZmluZSBPX1JPVEwgNDMKLSNkZWZpbmUgT19ST1RSIDQ0Ci0jZGVmaW5lIE9fUk9UWEwgNDUKLSNkZWZpbmUgT19ST1RYUiA0NgotI2RlZmluZSBPX0JQVCA0NwotI2RlZmluZSBPX1NIQUwgNDgKLSNkZWZpbmUgT19TSEFSIDQ5Ci0jZGVmaW5lIE9fU0hMTCA1MAotI2RlZmluZSBPX1NITFIgNTEKLSNkZWZpbmUgT19TVUIgIDUyCi0jZGVmaW5lIE9fU1VCUyA1MwotI2RlZmluZSBPX1RSQVBBIDU0Ci0jZGVmaW5lIE9fWE9SIDU1Ci0jZGVmaW5lIE9fWE9SQyA1NgotI2RlZmluZSBPX0JPUiA1NwotI2RlZmluZSBPX0JTVCA1OAotI2RlZmluZSBPX0JUU1QgNTkKLSNkZWZpbmUgT19FRVBNT1YgNjAKLSNkZWZpbmUgT19FWFRTIDYxCi0jZGVmaW5lIE9fRVhUVSA2MgotI2RlZmluZSBPX0pNUCA2MwotI2RlZmluZSBPX0pTUiA2NAotI2RlZmluZSBPX01VTFUgNjUKLSNkZWZpbmUgT19NVUxTIDY2Ci0jZGVmaW5lIE9fTk9QIDY3Ci0jZGVmaW5lIE9fTk9UIDY4Ci0jZGVmaW5lIE9fT1JDIDY5Ci0jZGVmaW5lIE9fUlRFIDcwCi0jZGVmaW5lIE9fU1RDIDcxCi0jZGVmaW5lIE9fU1VCWCA3MgotI2RlZmluZSBPX05FRyA3MwotI2RlZmluZSBPX1JUUyA3NAotI2RlZmluZSBPX1NMRUVQIDc1Ci0jZGVmaW5lIE9fSUxMIDc2Ci0jZGVmaW5lIE9fQUREUyA3NwotI2RlZmluZSBPX1NZU0NBTEwgNzgKLSNkZWZpbmUgT19NT1ZfVE9fUkVHIDc5Ci0jZGVmaW5lIE9fVEFTIDgwCi0jZGVmaW5lIE9fQ0xSTUFDIDgyCi0jZGVmaW5lIE9fTERNQUMgODMKLSNkZWZpbmUgT19NQUMgODQKLSNkZWZpbmUgT19MRE0gODUKLSNkZWZpbmUgT19TVE0gODYKLSNkZWZpbmUgT19TVE1BQyA4NwotI2RlZmluZSBPX0xBU1QgODgKLSNkZWZpbmUgU0IgMAotI2RlZmluZSBTVyAxCi0jZGVmaW5lIFNMIDIKLSNkZWZpbmUgU04gMwotCi0KLS8qIEZJWE1FOiBMb3RzIG9mIGluc25zIGhhdmUgIkUsIDAsIDAsIDAsIDAiIGluIHRoZSBuaWJibGUgY29kZSBzZXF1ZW5jZXMuCi0gICBNZXRoaW5rcyB0aGUgemVyb2VzIGFyZW4ndCBuZWNlc3NhcnkuICBPbmNlIGNvbmZpcm1lZCwgbnVrZSAnZW0uICAqLwotCi1zdHJ1Y3QgaDhfb3Bjb2RlIGg4X29wY29kZXNbXSA9IAotewotICBUV09PUChPKE9fQURELFNCKSwiYWRkLmIiLCAweDgsIDB4MCwweDgpLAotICAKLSAgTkVXX1NPUChPKE9fQURELFNXKSwxLDIsImFkZC53Iikse3tSUzE2LFJEMTYsRX19LHt7MHgwLDB4OSxSUzE2LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQURELFNXKSwwLDQsImFkZC53Iikse3tJTU0xNixSRDE2LEV9fSx7ezB4NywweDksMHgxLFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQURELFNMKSwwLDIsImFkZC5sIikse3tSUzMyLFJEMzIsRSB9fSwge3sweDAsMHhBLEIzMXxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0FERCxTTCksMCw2LCJhZGQubCIpLHt7SU1NMzIsUkQzMixFIH19LHt7MHg3LDB4QSwweDEsQjMwfFJEMzIsSU1NMzJMSVNULEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0FERFMsU0wpLDEsMiwiYWRkcyIpLCB7e0tCSVQsUkRQLEV9fSwgICB7ezB4MCwweEIsS0JJVCxSRFAsRSwwLDAsMCwwfX0gRU9QLAotCi0gIFRXT09QKE8oT19BRERYLFNCKSwiYWRkeCIsMHg5LDB4MCwweEUpLAotICBUV09PUChPKE9fQU5ELFNCKSwgImFuZC5iIiwweEUsMHgxLDB4NiksCi0KLSAgTkVXX1NPUChPKE9fQU5ELFNXKSwwLDIsImFuZC53Iikse3tSUzE2LFJEMTYsRSB9fSx7ezB4NiwweDYsUlMxNixSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0FORCxTVyksMCw0LCJhbmQudyIpLHt7SU1NMTYsUkQxNixFIH19LHt7MHg3LDB4OSwweDYsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotICAKLSAgTkVXX1NPUChPKE9fQU5ELFNMKSwwLDYsImFuZC5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4NixCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQU5ELFNMKSwwLDIsImFuZC5sIikgLHt7UlMzMixSRDMyLEUgfX0se3sweDAsMHgxLDB4RiwweDAsMHg2LDB4NixCMzB8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX0FOREMsU0IpLDEsMiwiYW5kYyIpLCB7e0lNTTgsQ0NSLEV9fSx7eyAweDAsMHg2LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19IEVPUCwKLSAgTkVXX1NPUChPKE9fQU5EQyxTQiksMSwyLCJhbmRjIiksIHt7SU1NOCxFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDAsMHg2LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19IEVPUCwKLQotICBCSVRPUChPKE9fQkFORCxTQiksIElNTTN8QjMwLCJiYW5kIiwweDcsMHg2LDB4NywweEMsMHg3LDB4RSwweDApLAotICBCUkFOQ0goTyhPX0JSQSxTQiksImJyYSIsMHgwKSwKLSAgQlJBTkNIKE8oT19CUkEsU0IpLCJidCIsMHgwKSwKLSAgQlJBTkNIKE8oT19CUk4sU0IpLCJicm4iLDB4MSksCi0gIEJSQU5DSChPKE9fQlJOLFNCKSwiYmYiLDB4MSksCi0gIEJSQU5DSChPKE9fQkhJLFNCKSwiYmhpIiwweDIpLAotICBCUkFOQ0goTyhPX0JMUyxTQiksImJscyIsMHgzKSwKLSAgQlJBTkNIKE8oT19CQ0MsU0IpLCJiY2MiLDB4NCksCi0gIEJSQU5DSChPKE9fQkNDLFNCKSwiYmhzIiwweDQpLAotICBCUkFOQ0goTyhPX0JDUyxTQiksImJjcyIsMHg1KSwKLSAgQlJBTkNIKE8oT19CQ1MsU0IpLCJibG8iLDB4NSksCi0gIEJSQU5DSChPKE9fQk5FLFNCKSwiYm5lIiwweDYpLAotICBCUkFOQ0goTyhPX0JFUSxTQiksImJlcSIsMHg3KSwKLSAgQlJBTkNIKE8oT19CVkMsU0IpLCJidmMiLDB4OCksCi0gIEJSQU5DSChPKE9fQlZTLFNCKSwiYnZzIiwweDkpLAotICBCUkFOQ0goTyhPX0JQTCxTQiksImJwbCIsMHhBKSwKLSAgQlJBTkNIKE8oT19CTUksU0IpLCJibWkiLDB4QiksCi0gIEJSQU5DSChPKE9fQkdFLFNCKSwiYmdlIiwweEMpLAotICBCUkFOQ0goTyhPX0JMVCxTQiksImJsdCIsMHhEKSwKLSAgQlJBTkNIKE8oT19CR1QsU0IpLCJiZ3QiLDB4RSksCi0gIEJSQU5DSChPKE9fQkxFLFNCKSwiYmxlIiwweEYpLAotCi0gIEVCSVRPUChPKE9fQkNMUixTQiksSU1NM3xCMzAsImJjbHIiLCAweDYsMHgyLDB4NywweEQsMHg3LDB4RiwweDgpLAotICBCSVRPUChPKE9fQklBTkQsU0IpLElNTTN8QjMxLCJiaWFuZCIsMHg3LDB4NiwweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQklUT1AoTyhPX0JJTEQsU0IpLCBJTU0zfEIzMSwiYmlsZCIsIDB4NywweDcsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJJVE9QKE8oT19CSU9SLFNCKSwgSU1NM3xCMzEsImJpb3IiLCAweDcsMHg0LDB4NywweEMsMHg3LDB4RSwweDApLAotICBCSVRPUChPKE9fQklTVCxTQiksIElNTTN8QjMxLCJiaXN0IiwgMHg2LDB4NywweDcsMHhELDB4NywweEYsMHg4KSwKLSAgQklUT1AoTyhPX0JJWE9SLFNCKSxJTU0zfEIzMSwiYml4b3IiLDB4NywweDUsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJJVE9QKE8oT19CTEQsU0IpLCAgSU1NM3xCMzAsImJsZCIsICAweDcsMHg3LDB4NywweEMsMHg3LDB4RSwweDApLAotICBFQklUT1AoTyhPX0JOT1QsU0IpLElNTTN8QjMwLCJibm90IiwgMHg2LDB4MSwweDcsMHhELDB4NywweEYsMHg4KSwKLSAgQklUT1AoTyhPX0JPUixTQiksICBJTU0zfEIzMCwiYm9yIiwgIDB4NywweDQsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEVCSVRPUChPKE9fQlNFVCxTQiksSU1NM3xCMzAsImJzZXQiLCAweDYsMHgwLDB4NywweEQsMHg3LDB4RiwweDgpLAotCi0gIFNPUChPKE9fQlNSLFNCKSw2LCJic3IiKSx7e0RJU1A4LEUsMH19LHt7IDB4NSwweDUsRElTUDgsSUdOT1JFLEUsMCwwLDAsMH19IEVPUCwKLSAgU09QKE8oT19CU1IsU0IpLDYsImJzciIpLHt7RElTUDE2LEUsMH19LHt7IDB4NSwweEMsMHgwLDB4MCxESVNQMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAotICBCSVRPUChPKE9fQlNULFNCKSwgSU1NM3xCMzAsImJzdCIsMHg2LDB4NywweDcsMHhELDB4NywweEYsMHg4KSwKLSAgRUJJVE9QKE8oT19CVFNULFNCKSwgSU1NM3xCMzAsImJ0c3QiLDB4NiwweDMsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJJVE9QKE8oT19CWE9SLFNCKSwgSU1NM3xCMzAsImJ4b3IiLDB4NywweDUsMHg3LDB4QywweDcsMHhFLDB4MCksCi0KLSAgVFdPT1AoTyhPX0NNUCxTQiksICJjbXAuYiIsMHhBLDB4MSwweEMpLAotICBXVFdPUChPKE9fQ01QLFNXKSwgImNtcC53IiwweDEsMHhEKSwKLQotICBORVdfU09QKE8oT19DTVAsU1cpLDEsMiwiY21wLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHgxLDB4RCxSUzE2LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQ01QLFNXKSwwLDQsImNtcC53Iikse3tJTU0xNixSRDE2LEUgfX0se3sweDcsMHg5LDB4MixSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fQ01QLFNMKSwwLDYsImNtcC5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4MixCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQ01QLFNMKSwwLDIsImNtcC5sIikgLHt7UlMzMixSRDMyLEUgfX0se3sweDEsMHhGLEIzMXxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0KLSAgVU5PUChPKE9fREFBLFNCKSwgImRhYSIsMHgwLDB4RiksCi0gIFVOT1AoTyhPX0RBUyxTQiksICJkYXMiLDB4MSwweEYpLAotICBVTk9QKE8oT19ERUMsU0IpLCAiZGVjLmIiLDB4MSwweEEpLAotCi0gIE5FV19TT1AoTyhPX0RFQywgU1cpLDAsMiwiZGVjLnciKSAse3tEQklULFJEMTYsRSB9fSx7ezB4MSwweEIsMHg1fERCSVQsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19ERUMsIFNMKSwwLDIsImRlYy5sIikgLHt7REJJVCxSRDMyLEUgfX0se3sweDEsMHhCLDB4N3xEQklULFJEMzJ8QjMwLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fRElWVSxTQiksMSw2LCJkaXZ4dS5iIiksIHt7UlM4LFJEMTYsRX19LCB7ezB4NSwweDEsUlM4LFJEMTYsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0RJVlUsU1cpLDAsMjAsImRpdnh1LnciKSx7e1JTMTYsUkQzMixFfX0se3sweDUsMHgzLFJTMTYsQjMwfFJEMzIsRX19RU9QLAotICAgIAotICBORVdfU09QKE8oT19ESVZTLFNCKSwwLDIwLCJkaXZ4cy5iIikgLHt7UlM4LFJEMTYsRSB9fSx7ezB4MCwweDEsMHhELDB4MCwweDUsMHgxLFJTOCxSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0RJVlMsU1cpLDAsMDIsImRpdnhzLnciKSAse3tSUzE2LFJEMzIsRSB9fSx7ezB4MCwweDEsMHhELDB4MCwweDUsMHgzLFJTMTYsQjMwfFJEMzIsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19FRVBNT1YsU0IpLDEsNTAsImVlcG1vdi5iIikse3tFLDAsMH19LHt7MHg3LDB4QiwweDUsMHhDLDB4NSwweDksMHg4LDB4RixFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0VFUE1PVixTVyksMCw1MCwiZWVwbW92LnciKSx7e0UsMCwwfX0se3sweDcsMHhCLDB4RCwweDQsMHg1LDB4OSwweDgsMHhGLEV9fSBFT1AsCi0gICAgCi0gIE5FV19TT1AoTyhPX0VYVFMsU1cpLDAsMiwiZXh0cy53Iikse3tPUjE2LEUsMH19LHt7MHgxLDB4NywweEQsT1IxNixFICAgfX1FT1AsCi0gIE5FV19TT1AoTyhPX0VYVFMsU0wpLDAsMiwiZXh0cy5sIikse3tPUjMyLEUsMH19LHt7MHgxLDB4NywweEYsT1IzMnxCMzAsRSAgIH19RU9QLAotCi0gIE5FV19TT1AoTyhPX0VYVFUsU1cpLDAsMiwiZXh0dS53Iikse3tPUjE2LEUsMH19LHt7MHgxLDB4NywweDUsT1IxNixFICAgfX1FT1AsCi0gIE5FV19TT1AoTyhPX0VYVFUsU0wpLDAsMiwiZXh0dS5sIikse3tPUjMyLEUsMH19LHt7MHgxLDB4NywweDcsT1IzMnxCMzAsRSAgIH19RU9QLAotICAgIAotICBVTk9QKE8oT19JTkMsU0IpLCAiaW5jIiwweDAsMHhBKSwKLQotICBORVdfU09QKE8oT19JTkMsU1cpLDAsMiwiaW5jLnciKSAse3tEQklULFJEMTYsRSB9fSx7ezB4MCwweEIsMHg1fERCSVQsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19JTkMsU0wpLDAsMiwiaW5jLmwiKSAse3tEQklULFJEMzIsRSB9fSx7ezB4MCwweEIsMHg3fERCSVQsUkQzMnxCMzAsRX19IEVPUCwKLQotICBTT1AoTyhPX0pNUCxTQiksNCwiam1wIikse3tSU0lORCxFLDB9fSx7ezB4NSwweDksQjMwfFJTSU5ELDB4MCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19KTVAsU0IpLDYsImptcCIpLHt7U1JDfEFCU0pNUCxFLDB9fSx7ezB4NSwweEEsU1JDfEFCU0pNUCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19KTVAsU0IpLDgsImptcCIpLHt7U1JDfE1FTUlORCxFLDB9fSx7ezB4NSwweEIsU1JDfE1FTUlORCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgU09QKE8oT19KU1IsU0IpLDYsImpzciIpLHt7U1JDfFJTSU5ELEUsMH19LCB7ezB4NSwweEQsQjMwfFJTSU5ELDB4MCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19KU1IsU0IpLDgsImpzciIpLHt7U1JDfEFCU0pNUCxFLDB9fSx7ezB4NSwweEUsU1JDfEFCU0pNUCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19KU1IsU0IpLDgsImpzciIpLHt7U1JDfE1FTUlORCxFLDB9fSx7ezB4NSwweEYsU1JDfE1FTUlORCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fTERDLFNCKSwxLDIsImxkYyIpLHt7SU1NOCxDQ1IsRX19LCAgICAgICAgIHt7IDB4MCwweDcsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMSwyLCJsZGMiKSx7e09SOCxDQ1IsRX19LCAgICAgICAgICB7eyAweDAsMHgzLDB4MCxPUjgsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0FCUzE2U1JDLENDUixFfX0sICAgICB7e1BSRUZJWExEQywweDYsMHhCLDB4MCwweDAsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tBQlMzMlNSQyxDQ1IsRX19LCAgICAge3tQUkVGSVhMREMsMHg2LDB4QiwweDIsMHgwLFNSQ3xBQlMzMkxJU1QsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tESVNQfFNSQ3xMXzE2LENDUixFfX0se3tQUkVGSVhMREMsMHg2LDB4RixCMzB8RElTUFJFRywwLERJU1B8TF8xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0RJU1B8U1JDfExfMzIsQ0NSLEV9fSx7e1BSRUZJWExEQywweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweDIsMHgwLFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkMsQ0NSLEV9fSwgICAgICAgIHt7UFJFRklYTERDLDB4NiwweEQsQjMwfFJTSU5DLDB4MCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e1JTSU5ELENDUixFfX0sICAgICAgICB7e1BSRUZJWExEQywweDYsMHg5LEIzMHxSRElORCwweDAsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19MREMsU0IpLDEsMiwibGRjIikse3tJTU04LEVYUixFfX0sICAgICAgICAge3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDcsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMSwyLCJsZGMiKSx7e09SOCxFWFIsRX19LCAgICAgICAgICB7eyAweDAsMHgzLDB4MSxPUjgsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0FCUzE2U1JDLEVYUixFfX0sICAgICB7eyAweDAsMHgxLDB4NCwweDEsMHg2LDB4YiwweDAsMHgwLEFCUzE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7QUJTMzJTUkMsRVhSLEV9fSwgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhiLDB4MiwweDAsU1JDfEFCUzMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0RJU1B8U1JDfExfMTYsRVhSLEV9fSx7eyAweDAsMHgxLDB4NCwweDEsMHg2LDB4ZixCMzB8RElTUFJFRywwLERJU1B8TF8xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0RJU1B8U1JDfExfMzIsRVhSLEV9fSx7eyAweDAsMHgxLDB4NCwweDEsMHg3LDB4OCxCMzB8RElTUFJFRywwLDB4NiwweEIsMHgyLDB4MCxTUkN8RElTUDMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e1JTSU5DLEVYUixFfX0sICAgICAgICB7eyAweDAsMHgxLDB4NCwweDEsMHg2LDB4ZCxCMzB8UlNJTkMsMHgwLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkQsRVhSLEV9fSwgICAgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHg5LEIzMHxSRElORCwweDAsRX19IEVPUCwKLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDQsIm1vdi5iIikse3tBQlN8U1JDfExfMTZ8TUVNUkVMQVgsUkQ4LEV9fSwgIHt7IDB4NiwweEEsMHgwLFJEOCxTUkN8QUJTfE1FTVJFTEFYfEExNkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDYsIm1vdi5iIikse3tBQlN8U1JDfExfMzJ8TUVNUkVMQVgsUkQ4LEUgfX0sIHt7IDB4NiwweEEsMHgyLFJEOCxTUkN8QUJTfE1FTVJFTEFYfEEzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw0LCJtb3YuYiIpLHt7UlM4LEFCU3xMXzE2fE1FTVJFTEFYfERTVCxFfX0sICAgICB7eyAweDYsMHhBLDB4OCxSUzgsRFNUfEFCU3xNRU1SRUxBWHxBMTZMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LEFCU3xEU1R8TF8zMnxNRU1SRUxBWCxFIH19LCAgICB7eyAweDYsMHhBLDB4QSxSUzgsRFNUfEFCU3xNRU1SRUxBWHxBMzJMSVNULEUgfX1FT1AsCi0gICAgCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNiwibW92LmIiKSx7e0RJU1B8TF8zMnxTUkMsUkQ4LEV9fSwgIHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEEsMHgyLFJEOCxTUkN8RElTUDMyTElTVCxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNiwibW92LmIiKSx7e1JTOCxESVNQfExfMzJ8RFNULEV9fSwgIHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEEsMHhBLFJTOCxEU1R8RElTUDMyTElTVCxFfX1FT1AsCi0KLQotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksMiwibW92LmIiKSx7e1JTOCxSRDgsRX19LAkgICAge3sgMHgwLDB4QyxSUzgsUkQ4LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDIsIm1vdi5iIikse3tJTU04LFJEOCxFfX0sICAgICAgICAgICB7eyAweEYsUkQ4LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDQsIm1vdi5iIikse3tSU0lORCxSRDgsRX19LCAgICAgICAgICB7eyAweDYsMHg4LEIzMHxSU0lORCxSRDgsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNiwibW92LmIiKSx7e0RJU1AxNlNSQyxSRDgsRX19LCAgICAgIHt7IDB4NiwweEUsQjMwfERJU1BSRUcsUkQ4LERJU1AxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNiwibW92LmIiKSx7e1JTSU5DLFJEOCxFfX0sICAgICAgICAgIHt7IDB4NiwweEMsQjMwfFJTSU5DLFJEOCxFLDAsMCwwLDB9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDQsIm1vdi5iIikse3tBQlM4U1JDLFJEOCxFfX0sICAgICAgICB7eyAweDIsUkQ4LEFCUzhTUkMsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDQsIm1vdi5iIikse3tSUzgsUkRJTkQsRX19LCAgICAgICAgICB7eyAweDYsMHg4LFJESU5EfEIzMSxSUzgsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNiwibW92LmIiKSx7e1JTOCxESVNQMTZEU1QsRX19LCAgICAgIHt7IDB4NiwweEUsRElTUFJFR3xCMzEsUlM4LERJU1AxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNiwibW92LmIiKSx7e1JTOCxSRERFQ3xCMzEsRX19LCAgICAgIHt7IDB4NiwweEMsUkRERUN8QjMxLFJTOCxFLDAsMCwwLDB9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDQsIm1vdi5iIikse3tSUzgsQUJTOERTVCxFfX0sICAgICAgICB7eyAweDMsUlM4LEFCUzhEU1QsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTVyksNiwibW92LnciKSx7e1JTMTYsUkRJTkQsRX19LCAgICAgICAge3sgMHg2LDB4OSxSRElORHxCMzEsUlMxNixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw2LCJtb3YudyIpLHt7RElTUHxMXzMyfFNSQyxSRDE2LEV9fSx7eyAweDcsMHg4LEIzMHxESVNQUkVHLDB4MCwweDYsMHhCLDB4MixSRDE2LFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixESVNQfExfMzJ8RFNULEV9fSx7eyAweDcsMHg4LEIzMHxESVNQUkVHLDB4MCwweDYsMHhCLDB4QSxSUzE2LERTVHxESVNQMzJMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw2LCJtb3YudyIpLHt7QUJTfExfMzJ8TUVNUkVMQVh8U1JDLFJEMTYsRSB9fSx7eyAweDYsMHhCLDB4MixSRDE2LFNSQ3xNRU1SRUxBWHxBQlMzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixBQlN8TF8zMnxNRU1SRUxBWHxEU1QsRSB9fSx7eyAweDYsMHhCLDB4QSxSUzE2LERTVHxNRU1SRUxBWHxBQlMzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSwyLCJtb3YudyIpLHt7UlMxNixSRDE2LEV9fSwgICAgICAgICB7eyAweDAsMHhELFJTMTYsIFJEMTYsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNCwibW92LnciKSx7e0lNTTE2LFJEMTYsRX19LCAgICAgICAge3sgMHg3LDB4OSwweDAsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNCwibW92LnciKSx7e1JTSU5ELFJEMTYsRX19LCAgICAgICAge3sgMHg2LDB4OSxCMzB8UlNJTkQsUkQxNixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw2LCJtb3YudyIpLHt7RElTUDE2U1JDLFJEMTYsRX19LCAgICB7eyAweDYsMHhGLEIzMHxESVNQUkVHLFJEMTYsRElTUDE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw2LCJtb3YudyIpLHt7UlNJTkMsUkQxNixFfX0sICAgICAgICB7eyAweDYsMHhELEIzMHxSU0lOQyxSRDE2LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tBQlMxNlNSQyxSRDE2LEV9fSwgICAgIHt7IDB4NiwweEIsMHgwLFJEMTYsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTVyksNiwibW92LnciKSx7e1JTMTYsRElTUDE2RFNULEV9fSwgICAge3sgMHg2LDB4RixESVNQUkVHfEIzMSxSUzE2LERJU1AxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTVyksNiwibW92LnciKSx7e1JTMTYsUkRERUMsRX19LCAgICAgICAge3sgMHg2LDB4RCxSRERFQ3xCMzEsUlMxNixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixBQlMxNkRTVCxFfX0sICAgICB7eyAweDYsMHhCLDB4OCxSUzE2LEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDQsIm1vdi5sIikse3tJTU0zMixSRDMyLEV9fSwgICAgICAgIHt7IDB4NywweEEsMHgwLEIzMHxSRDMyLElNTTMyTElTVCxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksMiwibW92LmwiKSx7e1JTMzIsUkQzMixFfX0sICAgICAgICAge3sgMHgwLDB4RixCMzF8UlMzMixCMzB8UkQzMixFLDAsMCwwLDB9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDQsIm1vdi5sIikse3tSU0lORCxSRDMyLEV9fSwgICAgICAgIHt7IFBSRUZJWDMyLDB4NiwweDksUlNJTkR8QjMwLEIzMHxSRDMyLEUsMCwwLDAsMCB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw2LCJtb3YubCIpLHt7RElTUDE2U1JDLFJEMzIsRX19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhGLERJU1BSRUd8QjMwLEIzMHxSRDMyLERJU1AxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDYsIm1vdi5sIikse3tESVNQfExfMzJ8U1JDLFJEMzIsRX19LHt7IFBSRUZJWDMyLDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEIsMHgyLEIzMHxSRDMyLFNSQ3xESVNQMzJMSVNULEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e1JTSU5DLFJEMzIsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4RCxCMzB8UlNJTkMsQjMwfFJEMzIsRSwwLDAsMCwwIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDYsIm1vdi5sIikse3tBQlMxNlNSQyxSRDMyLEV9fSwgICAgIHt7IFBSRUZJWDMyLDB4NiwweEIsMHgwLEIzMHxSRDMyLEFCUzE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e0FCUzMyU1JDfE1FTVJFTEFYLFJEMzIsRSB9fSwgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweDIsQjMwfFJEMzIsU1JDfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLFJESU5ELEV9fSwgICAgICAgIHt7IFBSRUZJWDMyLDB4NiwweDksUkRJTkR8QjMxLEIzMHxSUzMyLEUsMCwwLDAsMCB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixESVNQMTZEU1QsRX19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhGLERJU1BSRUd8QjMxLEIzMHxSUzMyLERJU1AxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLERJU1B8TF8zMnxEU1QsRX19LHt7IFBSRUZJWDMyLDB4NywweDgsQjMxfERJU1BSRUcsMHgwLDB4NiwweEIsMHhBLEIzMHxSUzMyLERTVHxESVNQMzJMSVNULEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsUkRERUMsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4RCxSRERFQ3xCMzEsQjMwfFJTMzIsRSwwLDAsMCwwIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLEFCUzE2RFNULEV9fSwgICAgIHt7IFBSRUZJWDMyLDB4NiwweEIsMHg4LEIzMHxSUzMyLEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsQUJTMzJEU1R8TUVNUkVMQVgsRSB9fSwgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweEEsQjMwfFJTMzIsRFNUfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksMTAsIm1vdmZwZSIpLHt7QUJTMTZTUkMsUkQ4LEV9fSx7eyAweDYsMHhBLDB4NCxSRDgsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDEwLCJtb3Z0cGUiKSx7e1JTOCxBQlMxNkRTVCxFfX0se3sgMHg2LDB4QSwweEMsUlM4LEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLQotICBORVdfU09QKE8oT19NVUxVLFNCKSwxLDE0LCJtdWx4dS5iIikse3tSUzgsUkQxNixFfX0sIHt7IDB4NSwweDAsUlM4LFJEMTYsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX01VTFUsU1cpLDAsMTQsIm11bHh1LnciKSx7e1JTMTYsUkQzMixFfX0se3sgMHg1LDB4MixSUzE2LEIzMHxSRDMyLEUsMCwwLDAsMH19RU9QLAotCi0gIE5FV19TT1AoTyhPX01VTFMsU0IpLDAsMjAsIm11bHhzLmIiKSx7e1JTOCxSRDE2LEV9fSwge3sgMHgwLDB4MSwweGMsMHgwLDB4NSwweDAsUlM4LFJEMTYsRX19RU9QLAotICBORVdfU09QKE8oT19NVUxTLFNXKSwwLDIwLCJtdWx4cy53Iikse3tSUzE2LFJEMzIsRX19LHt7IDB4MCwweDEsMHhjLDB4MCwweDUsMHgyLFJTMTYsQjMwfFJEMzIsRX19RU9QLAotICAKLSAgLyogPz8/IFRoaXMgY2FuIHVzZSBVTk9QMy4gICovCi0gIE5FV19TT1AoTyhPX05FRyxTQiksMSwyLCJuZWcuYiIpLHt7IE9SOCxFLCAwfX0se3sgMHgxLDB4NywweDgsT1I4LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19ORUcsU1cpLDAsMiwibmVnLnciKSx7eyBPUjE2LEUsMH19LHt7IDB4MSwweDcsMHg5LE9SMTYsRX19RU9QLAotICBORVdfU09QKE8oT19ORUcsU0wpLDAsMiwibmVnLmwiKSx7eyBPUjMyLEUsMH19LHt7IDB4MSwweDcsMHhCLEIzMHxPUjMyLEV9fUVPUCwKLSAgICAKLSAgTkVXX1NPUChPKE9fTk9QLFNOKSwxLDIsIm5vcCIpLHt7RSwwLDB9fSx7eyAweDAsMHgwLDB4MCwweDAsRSwwLDAsMCwwfX1FT1AsCi0KLSAgLyogPz8/IFRoaXMgY2FuIHVzZSBVTk9QMy4gICovCi0gIE5FV19TT1AoTyhPX05PVCxTQiksMSwyLCJub3QuYiIpLHt7IE9SOCxFLCAwfX0se3sgMHgxLDB4NywweDAsT1I4LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19OT1QsU1cpLDAsMiwibm90LnciKSx7eyBPUjE2LEUsMH19LHt7IDB4MSwweDcsMHgxLE9SMTYsRX19RU9QLAotICBORVdfU09QKE8oT19OT1QsU0wpLDAsMiwibm90LmwiKSx7eyBPUjMyLEUsMH19LHt7IDB4MSwweDcsMHgzLEIzMHxPUjMyLEV9fUVPUCwKLQotICBUV09PUChPKE9fT1IsIFNCKSwib3IuYiIsMHhDLDB4MSwweDQpLAotICBORVdfU09QKE8oT19PUixTVyksMCw0LCJvci53Iikse3tJTU0xNixSRDE2LEUgfX0se3sweDcsMHg5LDB4NCxSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX09SLFNXKSwwLDIsIm9yLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHg2LDB4NCxSUzE2LFJEMTYsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19PUixTTCksMCw2LCJvci5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4NCxCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fT1IsU0wpLDAsMiwib3IubCIpLHt7UlMzMixSRDMyLEUgfX0se3sweDAsMHgxLDB4RiwweDAsMHg2LDB4NCxCMzB8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX09SQyxTQiksMSwyLCJvcmMiKSx7e0lNTTgsQ0NSLEV9fSx7eyAweDAsMHg0LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19PUkMsU0IpLDEsMiwib3JjIikse3tJTU04LEVYUixFfX0se3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDQsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fTU9WX1RPX1JFRyxTVyksMSw2LCJwb3AudyIpLHt7T1IxNixFLDB9fSx7eyAweDYsMHhELDB4NyxPUjE2LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19NT1ZfVE9fUkVHLFNMKSwwLDYsInBvcC5sIikse3tPUjMyLEUsMH19LHt7IFBSRUZJWDMyLDB4NiwweEQsMHg3LE9SMzJ8QjMwLEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19NT1ZfVE9fTUVNLFNXKSwxLDYsInB1c2gudyIpLHt7T1IxNixFLDB9fSx7eyAweDYsMHhELDB4RixPUjE2LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19NT1ZfVE9fTUVNLFNMKSwwLDYsInB1c2gubCIpLHt7T1IzMixFLDB9fSx7eyBQUkVGSVgzMiwweDYsMHhELDB4RixPUjMyfEIzMCxFLDAsMCwwLDB9fUVPUCwKLQotICBVTk9QMyhPX1JPVEwsICAicm90bCIsIDB4MSwweDIsMHg4KSwKLSAgVU5PUDMoT19ST1RSLCAgInJvdHIiLCAweDEsMHgzLDB4OCksCi0gIFVOT1AzKE9fUk9UWEwsICJyb3R4bCIsMHgxLDB4MiwweDApLAotICBVTk9QMyhPX1JPVFhSLCAicm90eHIiLDB4MSwweDMsMHgwKSwKLQotICBTT1AoTyhPX0JQVCxTTiksICAxMCwiYnB0Iikse3tFLDAsMH19LHt7IDB4NywweEEsMHhGLDB4RixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19SVEUsU04pLCAgMTAsInJ0ZSIpLHt7RSwwLDB9fSx7eyAweDUsMHg2LDB4NywweDAsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fUlRTLFNOKSwgICA4LCJydHMiKSx7e0UsMCwwfX0se3sgMHg1LDB4NCwweDcsMHgwLEUsMCwwLDAsMH19RU9QLAotCi0gIFVOT1AzKE9fU0hBTCwgICJzaGFsIiwweDEsMHgwLDB4OCksCi0gIFVOT1AzKE9fU0hBUiwgICJzaGFyIiwweDEsMHgxLDB4OCksCi0gIFVOT1AzKE9fU0hMTCwgICJzaGxsIiwweDEsMHgwLDB4MCksCi0gIFVOT1AzKE9fU0hMUiwgICJzaGxyIiwweDEsMHgxLDB4MCksCi0KLSAgU09QKE8oT19TTEVFUCxTTiksMiwic2xlZXAiKSx7e0UsMCwwfX0se3sgMHgwLDB4MSwweDgsMHgwLEUsMCwwLDAsMH19IEVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLCAxLDIsInN0YyIpLHt7Q0NSLFJEOCxFfX0se3sgMHgwLDB4MiwweDAsUkQ4LEUsMCwwLDAsMH19IEVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsUlNJTkQsRX19LCAgICAgICAge3tQUkVGSVhMREMsMHg2LDB4OSxCMzF8UkRJTkQsMHgwLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixESVNQfERTVHxMXzE2LEV9fSx7e1BSRUZJWExEQywweDYsMHhGLEIzMXxESVNQUkVHLDAsRFNUfERJU1B8TF8xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixESVNQfERTVHxMXzMyLEV9fSx7e1BSRUZJWExEQywweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweEEsMHgwLERTVHxESVNQMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLFJEREVDLEV9fSwgICAgICAgIHt7UFJFRklYTERDLDB4NiwweEQsQjMxfFJEREVDLDB4MCxFfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLEFCUzE2U1JDLEV9fSwgICAgIHt7UFJFRklYTERDLDB4NiwweEIsMHg4LDB4MCxBQlMxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixBQlMzMlNSQyxFfX0sICAgICB7e1BSRUZJWExEQywweDYsMHhCLDB4QSwweDAsRFNUfEFCUzMyTElTVCxFfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwgMSwyLCJzdGMiKSx7e0VYUixSRDgsRX19LHt7IDB4MCwweDIsMHgxLFJEOCxFLDAsMCwwLDB9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLFJTSU5ELEV9fSwgICAgICAgIHt7MHgwLDB4MSwweDQsMHgxLDB4NiwweDksQjMxfFJESU5ELDB4MCxFfX0gRU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsRElTUHxEU1R8TF8xNixFfX0se3sweDAsMHgxLDB4NCwweDEsMHg2LDB4RixCMzF8RElTUFJFRywwLERTVHxESVNQfExfMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsRElTUHxEU1R8TF8zMixFfX0se3sweDAsMHgxLDB4NCwweDEsMHg3LDB4OCxCMzB8RElTUFJFRywwLDB4NiwweEIsMHhBLDB4MCxEU1R8RElTUDMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixSRERFQyxFfX0sICAgICAgICB7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhELEIzMXxSRERFQywweDAsRX19RU9QLAotCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixBQlMxNlNSQyxFfX0sICAgICB7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhCLDB4OCwweDAsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsQUJTMzJTUkMsRX19LCAgICAge3sweDAsMHgxLDB4NCwweDEsMHg2LDB4QiwweEEsMHgwLERTVHxBQlMzMkxJU1QsRX19RU9QLAotCi0gIFNPUChPKE9fU1VCLFNCKSwyLCJzdWIuYiIpLHt7UlM4LFJEOCxFfX0se3sgMHgxLDB4OCxSUzgsUkQ4LEUsMCwwLDAsMH19RU9QLAotCi0gIE5FV19TT1AoTyhPX1NVQixTVyksMSwyLCJzdWIudyIpLHt7UlMxNixSRDE2LEUgfX0sICB7ezB4MSwweDksUlMxNixSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NVQixTVyksMCw0LCJzdWIudyIpLHt7SU1NMTYsUkQxNixFIH19LCB7ezB4NywweDksMHgzLFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1VCLFNMKSwwLDIsInN1Yi5sIikgLHt7UlMzMixSRDMyLEUgfX0sIHt7MHgxLDB4QSxCMzF8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotICBORVdfU09QKE8oT19TVUIsU0wpLDAsNiwic3ViLmwiKSwge3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4MyxCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLQotICBTT1AoTyhPX1NVQlMsU0wpLDIsInN1YnMiKSx7e0tCSVQsUkRQLEV9fSx7eyAweDEsMHhCLEtCSVQsUkRQLEUsMCwwLDAsMH19RU9QLAotICBUV09PUChPKE9fU1VCWCxTQiksInN1YngiLDB4QiwweDEsMHhFKSwKLQotICBORVdfU09QKE8oT19UUkFQQSxTQiksMCwyLCJ0cmFwYSIpLHt7IElNTTIsRX19LCAge3sweDUsMHg3LElNTTIsSUdOT1JFLEUgIH19RU9QLAotICBORVdfU09QKE8oT19UQVMsU0IpLDAsMiwidGFzIikse3tSU0lORCxFfX0sICB7ezB4MCwweDEsMHhlLDB4MCwweDcsMHhiLEIzMHxSU0lORCwweGMsRSAgfX1FT1AsCi0KLSAgVFdPT1AoTyhPX1hPUiwgU0IpLCJ4b3IiLDB4RCwweDEsMHg1KSwKLQotICBORVdfU09QKE8oT19YT1IsU1cpLDAsNCwieG9yLnciKSx7e0lNTTE2LFJEMTYsRSB9fSx7ezB4NywweDksMHg1LFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fWE9SLFNXKSwwLDIsInhvci53Iikse3tSUzE2LFJEMTYsRSB9fSx7ezB4NiwweDUsUlMxNixSRDE2LEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fWE9SLFNMKSwwLDYsInhvci5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4NSxCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fWE9SLFNMKSwwLDIsInhvci5sIikgLHt7UlMzMixSRDMyLEUgfX0se3sweDAsMHgxLDB4RiwweDAsMHg2LDB4NSxCMzB8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotCi0gIFNPUChPKE9fWE9SQyxTQiksMiwieG9yYyIpLHt7SU1NOCxDQ1IsRX19LHt7IDB4MCwweDUsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fWE9SQyxTQiksMiwieG9yYyIpLHt7SU1NOCxFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDAsMHg1LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotCi0gIE5FV19TT1AoTyhPX0NMUk1BQyxTTiksMSwyLCJjbHJtYWMiKSx7e0UsIDAsIDB9fSx7ezB4MCwweDEsMHhhLDB4MCxFfX0gRU9QLAotICBORVdfU09QKE8oT19NQUMsU0wpLDEsMiwibWFjIikse3tSU0lOQyxSRElOQyxFfX0se3sweDAsMHgxLDB4NiwweDAsMHg2LDB4ZCxCMzB8UlNJTkMsQjMwfFJESU5DLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0xETUFDLFNMKSwxLDIsImxkbWFjIikse3tSUzMyLE1BQ1JFRyxFfX0se3sweDAsMHgzLE1BQ1JFRyxSUzMyLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NUTUFDLFNMKSwxLDIsInN0bWFjIikse3tNQUNSRUcsUkQzMixFfX0se3sweDAsMHgyLE1BQ1JFRyxSRDMyLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0xETSxTTCksMCw2LCJsZG0ubCIpLHt7UlNJTkMsIFJTMzIsIEV9fSx7eyAweDAsMHgxLElHTk9SRSwweDAsMHg2LDB4RCwweDcsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RNLFNMKSwwLDYsInN0bS5sIikse3tSUzMyLCBSRERFQywgRX19LHt7MHgwLDB4MSxJR05PUkUsMHgwLDB4NiwweEQsMHhGLElHTk9SRSxFfX1FT1AsCi0gIHsgMCB9Ci19OwotI2Vsc2UKLWV4dGVybiBzdHJ1Y3QgaDhfb3Bjb2RlIGg4X29wY29kZXNbXSA7Ci0jZW5kaWYKLQotCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaHBwYS5oIGIvaW5jbHVkZS9vcGNvZGUvaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQxZmYwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2hwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0MSArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgUEEtUklTQy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLCBhbmQgR0RCLCB0aGUgR05VIGRpc2Fzc2VtYmxlci4KLQotR0FTL0dEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUy9HREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVMgb3IgR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgIWRlZmluZWQoX19TVERDX18pICYmICFkZWZpbmVkKGNvbnN0KQotI2RlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qCi0gKiBTdHJ1Y3R1cmUgb2YgYW4gb3Bjb2RlIHRhYmxlIGVudHJ5LgotICovCi0KLS8qIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgZGVsYXkgc2xvdCBudWxsaWZpY2F0aW9uOiBub3JtYWwgd2hpY2ggaXMKLSAqIGNvbnRyb2xlZCBieSB0aGUgbnVsbGlmaWNhdGlvbiBiaXQsIGFuZCBjb25kaXRpb25hbCwgd2hpY2ggZGVwZW5kcwotICogb24gdGhlIGRpcmVjdGlvbiBvZiB0aGUgYnJhbmNoIGFuZCBpdHMgc3VjY2VzcyBvciBmYWlsdXJlLgotICoKLSAqIE5PTkUgaXMgdW5mb3J0dW5hdGVseSAjZGVmaW5lZCBpbiB0aGUgaGl1eCBzeXN0ZW0gaW5jbHVkZSBmaWxlcy4gIAotICogI3VuZGVmIGl0IGF3YXkuCi0gKi8KLSN1bmRlZiBOT05FCi1zdHJ1Y3QgcGFfb3Bjb2RlCi17Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICB1bnNpZ25lZCBsb25nIGludCBtYXRjaDsJLyogQml0cyB0aGF0IG11c3QgYmUgc2V0Li4uICAqLwotICAgIHVuc2lnbmVkIGxvbmcgaW50IG1hc2s7CS8qIC4uLiBpbiB0aGVzZSBiaXRzLiAqLwotICAgIGNoYXIgKmFyZ3M7Ci0gICAgZW51bSBwYV9hcmNoIGFyY2g7Ci0gICAgY2hhciBmbGFnczsKLX07Ci0KLS8qIEVuYWJsZS9kaXNhYmxlIHN0cmljdCBzeW50YXggY2hlY2tpbmcuICBOb3QgY3VycmVudGx5IHVzZWQsIGJ1dCB3aWxsCi0gICBiZSBuZWNlc3NhcnkgZm9yIFBBMi4wIHN1cHBvcnQgaW4gdGhlIGZ1dHVyZS4gICovCi0jZGVmaW5lIEZMQUdfU1RSSUNUIDB4MQotCi0vKgotICAgQWxsIGhwcGEgb3Bjb2RlcyBhcmUgMzIgYml0cy4KLQotICAgVGhlIG1hdGNoIGNvbXBvbmVudCBpcyBhIG1hc2sgc2F5aW5nIHdoaWNoIGJpdHMgbXVzdCBtYXRjaCBhCi0gICBwYXJ0aWN1bGFyIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2UKLSAgIG9mIHRoYXQgb3Bjb2RlLgotCi0gICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgY2hhcmFjdGVyIGZvciBlYWNoIG9wZXJhbmQgb2YKLSAgIHRoZSBpbnN0cnVjdGlvbi4gIENoYXJhY3RlcnMgdXNlZCBhcyBhIHByZWZpeCBhbGxvdyBhbnkgc2Vjb25kIGNoYXJhY3RlciB0bwotICAgYmUgdXNlZCB3aXRob3V0IGNvbmZsaWN0aW5nIHdpdGggdGhlIG1haW4gb3BlcmFuZCBjaGFyYWN0ZXJzLgotCi0gICBCaXQgcG9zaXRpb25zIGluIHRoaXMgZGVzY3JpcHRpb24gZm9sbG93IEhQIHVzYWdlIG9mIGxzYiA9IDMxLAotICAgImF0IiBpcyBsc2Igb2YgZmllbGQuCi0KLSAgIEluIHRoZSBhcmdzIGZpZWxkLCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgbXVzdCBtYXRjaCBleGFjdGx5OgotCi0JJyssKCkgJwotCi0gICBJbiB0aGUgYXJncyBmaWVsZCwgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSB1bnVzZWQ6Ci0KLQknICAiICAgJiAgICAgLSAgLyAgIDM0IDY3ODk6OzwgPiBAJwotCScgIEMgICAgICAgICBNICAgICAgICAgICAgIFtcXSAgJwotCScgICAgZSBnICAgIGwgICAgICAgICAgICB5ICAgfSAnCi0KLSAgIEhlcmUgYXJlIGFsbCB0aGUgY2hhcmFjdGVyczoKLQotCScgISIjJCUmJygpKistLC4vMDEyMzQ1Njc4OTo7PD0+P0AnCi0JJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl8nCi0JJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9ficKLQotS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICB4ICAgIGludGVnZXIgcmVnaXN0ZXIgZmllbGQgYXQgMTUuCi0gICBiICAgIGludGVnZXIgcmVnaXN0ZXIgZmllbGQgYXQgMTAuCi0gICB0ICAgIGludGVnZXIgcmVnaXN0ZXIgZmllbGQgYXQgMzEuCi0gICBhCWludGVnZXIgcmVnaXN0ZXIgZmllbGQgYXQgMTAgYW5kIDE1IChmb3IgUEVSTUgpCi0gICA1ICAgIDUgYml0IGltbWVkaWF0ZSBhdCAxNS4KLSAgIHMgICAgMiBiaXQgc3BhY2Ugc3BlY2lmaWVyIGF0IDE3LgotICAgUyAgICAzIGJpdCBzcGFjZSBzcGVjaWZpZXIgYXQgMTguCi0gICBWICAgIDUgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAzMQotICAgaSAgICAxMSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxCi0gICBqICAgIDE0IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMzEKLSAgIGsgICAgMjEgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAzMQotICAgbgludWxsaWZpY2F0aW9uIGZvciBicmFuY2ggaW5zdHJ1Y3Rpb25zCi0gICBOCW51bGxpZmljYXRpb24gZm9yIHNwb3AgYW5kIGNvcHIgaW5zdHJ1Y3Rpb25zCi0gICB3ICAgIDEyIGJpdCBicmFuY2ggZGlzcGxhY2VtZW50Ci0gICBXICAgIDE3IGJpdCBicmFuY2ggZGlzcGxhY2VtZW50IChQQyByZWxhdGl2ZSkKLSAgIFggICAgMjIgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQgKFBDIHJlbGF0aXZlKQotICAgeiAgICAxNyBiaXQgYnJhbmNoIGRpc3BsYWNlbWVudCAoanVzdCBhIG51bWJlciwgbm90IGFuIGFkZHJlc3MpCi0KLUFsc28gdGhlc2U6Ci0KLSAgIC4gICAgMiBiaXQgc2hpZnQgYW1vdW50IGF0IDI1Ci0gICAqICAgIDQgYml0IHNoaWZ0IGFtb3VudCBhdCAyNQotICAgcCAgICA1IGJpdCBzaGlmdCBjb3VudCBhdCAyNiAodG8gc3VwcG9ydCB0aGUgU0hEIGluc3RydWN0aW9uKSBlbmNvZGVkIGFzCi0gICAgICAgIDMxLXAKLSAgIH4gICAgNiBiaXQgc2hpZnQgY291bnQgYXQgMjAsMjI6MjYgZW5jb2RlZCBhcyA2My1+LgotICAgUCAgICA1IGJpdCBiaXQgcG9zaXRpb24gYXQgMjYKLSAgIHEgICAgNiBiaXQgYml0IHBvc2l0aW9uIGF0IDIwLDIyOjI2Ci0gICBUICAgIDUgYml0IGZpZWxkIGxlbmd0aCBhdCAzMSAoZW5jb2RlZCBhcyAzMi1UKQotICAgJQk2IGJpdCBmaWVsZCBsZW5ndGggYXQgMjMsMjc6MzEgKHZhcmlhYmxlIGV4dHJhY3QvZGVwb3NpdCkKLSAgIHwJNiBiaXQgZmllbGQgbGVuZ3RoIGF0IDE5LDI3OjMxIChmaXhlZCBleHRyYWN0L2RlcG9zaXQpCi0gICBBICAgIDEzIGJpdCBpbW1lZGlhdGUgYXQgMTggKHRvIHN1cHBvcnQgdGhlIEJSRUFLIGluc3RydWN0aW9uKQotICAgXglsaWtlIGIsIGJ1dCBkZXNjcmliZXMgYSBjb250cm9sIHJlZ2lzdGVyCi0gICAhICAgIHNhciAoY3IxMSkgcmVnaXN0ZXIKLSAgIEQgICAgMjYgYml0IGltbWVkaWF0ZSBhdCAzMSAodG8gc3VwcG9ydCB0aGUgRElBRyBpbnN0cnVjdGlvbikKLSAgICQgICAgOSBiaXQgaW1tZWRpYXRlIGF0IDI4ICh0byBzdXBwb3J0IFBPUEJUUykKLQotICAgdiAgICAzIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgaWRlbnRpZmllciBhdCAyNQotICAgTyAgICAyMCBiaXQgU3BlY2lhbCBGdW5jdGlvbiBVbml0IG9wZXJhdGlvbiBzcGxpdCBiZXR3ZWVuIDE1IGJpdHMgYXQgMjAKLSAgICAgICAgYW5kIDUgYml0cyBhdCAzMQotICAgbyAgICAxNSBiaXQgU3BlY2lhbCBGdW5jdGlvbiBVbml0IG9wZXJhdGlvbiBhdCAyMAotICAgMiAgICAyMiBiaXQgU3BlY2lhbCBGdW5jdGlvbiBVbml0IG9wZXJhdGlvbiBzcGxpdCBiZXR3ZWVuIDE3IGJpdHMgYXQgMjAKLSAgICAgICAgYW5kIDUgYml0cyBhdCAzMQotICAgMSAgICAxNSBiaXQgU3BlY2lhbCBGdW5jdGlvbiBVbml0IG9wZXJhdGlvbiBzcGxpdCBiZXR3ZWVuIDEwIGJpdHMgYXQgMjAKLSAgICAgICAgYW5kIDUgYml0cyBhdCAzMQotICAgMCAgICAxMCBiaXQgU3BlY2lhbCBGdW5jdGlvbiBVbml0IG9wZXJhdGlvbiBzcGxpdCBiZXR3ZWVuIDUgYml0cyBhdCAyMAotICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCi0gICB1ICAgIDMgYml0IGNvcHJvY2Vzc29yIHVuaXQgaWRlbnRpZmllciBhdCAyNQotICAgRiAgICBTb3VyY2UgRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQgQ29tcGxldGVyIGVuY29kZWQgMiBiaXRzIGF0IDIwCi0gICBJICAgIFNvdXJjZSBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdCBDb21wbGV0ZXIgZW5jb2RlZCAxIGJpdHMgYXQgMjAKLQkoZm9yIDB4ZSBmb3JtYXQgRlAgaW5zdHJ1Y3Rpb25zKQotICAgRyAgICBEZXN0aW5hdGlvbiBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdCBDb21wbGV0ZXIgZW5jb2RlZCAyIGJpdHMgYXQgMTgKLSAgIEggICAgRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQgYXQgMjYgZm9yICdmbXB5YWRkJyBhbmQgJ2ZtcHlzdWInCi0gICAgICAgICh2ZXJ5IHNpbWlsYXIgdG8gJ0YnKQotCi0gICByCTUgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAzMSAoZm9yIHRoZSBicmVhayBpbnN0cnVjdGlvbikKLQkodmVyeSBzaW1pbGFyIHRvIFYgYWJvdmUsIGV4Y2VwdCB0aGUgdmFsdWUgaXMgdW5zaWduZWQgaW5zdGVhZCBvZgotCWxvd19zaWduX2V4dCkKLSAgIFIJNSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDE1IChmb3IgdGhlIHNzbSwgcnNtLCBwcm9iZWkgaW5zdHJ1Y3Rpb25zKQotCShzYW1lIGFzIHIgYWJvdmUsIGV4Y2VwdCB0aGUgdmFsdWUgaXMgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24pCi0gICBVCTEwIGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMTUgKGZvciBTU00sIFJTTSBvbiBwYTIuMCkKLSAgIFEJNSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDEwIChhIGJpdCBwb3NpdGlvbiBzcGVjaWZpZWQgaW4KLQl0aGUgYmIgaW5zdHJ1Y3Rpb24uIEl0J3MgdGhlIHNhbWUgYXMgciBhYm92ZSwgZXhjZXB0IHRoZQotICAgICAgICB2YWx1ZSBpcyBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbikKLSAgIEIJNSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDEwIChhIGJpdCBwb3NpdGlvbiBzcGVjaWZpZWQgaW4KLQl0aGUgYmIgaW5zdHJ1Y3Rpb24uIFNpbWlsYXIgdG8gUSwgYnV0IDY0Yml0IGhhbmRsaW5nIGlzCi0JZGlmZmVyZW50LgotICAgWiAgICAlcjEgLS0gaW1wbGljaXQgdGFyZ2V0IG9mIGFkZGlsIGluc3RydWN0aW9uLgotICAgTCAgICAsJXIyIGNvbXBsZXRlciBmb3IgbmV3IHN5bnRheCBicmFuY2gKLSAgIHsgICAgU291cmNlIGZvcm1hdCBjb21wbGV0ZXIgZm9yIGZjbnYKLSAgIF8gICAgRGVzdGluYXRpb24gZm9ybWF0IGNvbXBsZXRlciBmb3IgZmNudgotICAgaCAgICBjYml0IGZvciBmY21wCi0gICA9ICAgIGdmeCB0ZXN0cyBmb3IgZnRlc3QKLSAgIGQgICAgMTRiaXQgb2Zmc2V0IGZvciBzaW5nbGUgcHJlY2lzaW9uIEZQIGxvbmcgbG9hZC9zdG9yZS4KLSAgICMgICAgMTRiaXQgb2Zmc2V0IGZvciBkb3VibGUgcHJlY2lzaW9uIEZQIGxvYWQgbG9uZy9zdG9yZS4KLSAgIEogICAgWWV0IGFub3RoZXIgMTRiaXQgb2Zmc2V0IHdpdGggYW4gdW51c3VhbCBlbmNvZGluZy4KLSAgIEsgICAgWWV0IGFub3RoZXIgMTRiaXQgb2Zmc2V0IHdpdGggYW4gdW51c3VhbCBlbmNvZGluZy4KLSAgIFkgICAgJXNyMCwlcjMxIC0tIGltcGxpY2l0IHRhcmdldCBvZiBiZSxsIGluc3RydWN0aW9uLgotICAgQAlpbXBsaWNpdCBpbW1lZGlhdGUgdmFsdWUgb2YgMAotCi1Db21wbGV0ZXIgb3BlcmFuZHMgYWxsIGhhdmUgJ2MnIGFzIHRoZSBwcmVmaXg6Ci0KLSAgIGN4ICAgaW5kZXhlZCBsb2FkIGNvbXBsZXRlci4KLSAgIGNtICAgc2hvcnQgbG9hZCBhbmQgc3RvcmUgY29tcGxldGVyLgotICAgY3EgICBsb25nIGxvYWQgYW5kIHN0b3JlIGNvbXBsZXRlciAobGlrZSBjbSwgYnV0IGluc2VydGVkIGludG8gYQotCWRpZmZlcmVudCBsb2NhdGlvbiBpbiB0aGUgdGFyZ2V0IGluc3RydWN0aW9uKS4KLSAgIGNzICAgc3RvcmUgYnl0ZXMgc2hvcnQgY29tcGxldGVyLgotICAgY2UgICBsb25nIGxvYWQvc3RvcmUgY29tcGxldGVyIGZvciBMRFcvU1RXIHdpdGggYSBkaWZmZXJlbnQgZW5jb2RpbmcgdGhhbiB0aGUKLQlvdGhlcnMKLSAgIGNjICAgbG9hZCBjYWNoZSBjb250cm9sIGhpbnQKLSAgIGNkICAgbG9hZCBhbmQgY2xlYXIgY2FjaGUgY29udHJvbCBoaW50Ci0gICBjQyAgIHN0b3JlIGNhY2hlIGNvbnRyb2wgaGludAotICAgY28Jb3JkZXJlZCBhY2Nlc3MKLQotICAgY3AJYnJhbmNoIGxpbmsgYW5kIHB1c2ggY29tcGxldGVyCi0gICBjUAlicmFuY2ggcG9wIGNvbXBsZXRlcgotICAgY2wJYnJhbmNoIGxpbmsgY29tcGxldGVyCi0gICBjZwlicmFuY2ggZ2F0ZSBjb21wbGV0ZXIKLQotICAgY3cJcmVhZC93cml0ZSBjb21wbGV0ZXIgZm9yIFBST0JFCi0gICBjVwl3aWRlIGNvbXBsZXRlciBmb3IgTUZDVEwKLSAgIGNMCWxvY2FsIHByb2Nlc3NvciBjb21wbGV0ZXIgZm9yIGNhY2hlIGNvbnRyb2wKLSAgIGNaICAgU3lzdGVtIENvbnRyb2wgQ29tcGxldGVyICh0byBzdXBwb3J0IExQQSwgTEhBLCBldGMuKQotCi0gICBjaQljb3JyZWN0aW9uIGNvbXBsZXRlciBmb3IgRENPUgotICAgY2EJYWRkIGNvbXBsZXRlcgotICAgY3kJMzIgYml0IGFkZCBjYXJyeSBjb21wbGV0ZXIKLSAgIGNZCTY0IGJpdCBhZGQgY2FycnkgY29tcGxldGVyCi0gICBjdglzaWduZWQgb3ZlcmZsb3cgdHJhcCBjb21wbGV0ZXIKLSAgIGN0CXRyYXAgb24gY29uZGl0aW9uIGNvbXBsZXRlciBmb3IgQURESSwgU1VCCi0gICBjVAl0cmFwIG9uIGNvbmRpdGlvbiBjb21wbGV0ZXIgZm9yIFVBRERDTQotICAgY2IJMzIgYml0IGJvcnJvdyBjb21wbGV0ZXIgZm9yIFNVQgotICAgY0IJNjQgYml0IGJvcnJvdyBjb21wbGV0ZXIgZm9yIFNVQgotCi0gICBjaAlsZWZ0L3JpZ2h0IGhhbGYgY29tcGxldGVyCi0gICBjSAlzaWduZWQvdW5zaWduZWQgc2F0dXJhdGlvbiBjb21wbGV0ZXIKLSAgIGNTCXNpZ25lZC91bnNpZ25lZCBjb21wbGV0ZXIgYXQgMjEKLSAgIGMqCXBlcm11dGF0aW9uIGNvbXBsZXRlcgotCi1Db25kaXRpb24gb3BlcmFuZHMgYWxsIGhhdmUgJz8nIGFzIHRoZSBwcmVmaXg6Ci0KLSAgID9mICAgRmxvYXRpbmcgcG9pbnQgY29tcGFyZSBjb25kaXRpb25zIChlbmNvZGVkIGFzIDUgYml0cyBhdCAzMSkKLQotICAgP2EJYWRkIGNvbmRpdGlvbnMKLSAgID9BCTY0IGJpdCBhZGQgY29uZGl0aW9ucwotICAgP0AgICBhZGQgYnJhbmNoIGNvbmRpdGlvbnMgZm9sbG93ZWQgYnkgbnVsbGlmeQotICAgP2QJbm9uLW5lZ2F0ZWQgYWRkIGJyYW5jaCBjb25kaXRpb25zCi0gICA/RAluZWdhdGVkIGFkZCBicmFuY2ggY29uZGl0aW9ucwotICAgP3cJd2lkZSBtb2RlIG5vbi1uZWdhdGVkIGFkZCBicmFuY2ggY29uZGl0aW9ucwotICAgP1cJd2lkZSBtb2RlIG5lZ2F0ZWQgYWRkIGJyYW5jaCBjb25kaXRpb25zCi0KLSAgID9zICAgY29tcGFyZS9zdWJ0cmFjdCBjb25kaXRpb25zCi0gICA/Uwk2NCBiaXQgY29tcGFyZS9zdWJ0cmFjdCBjb25kaXRpb25zCi0gICA/dCAgIG5vbi1uZWdhdGVkIGNvbXBhcmUgYW5kIGJyYW5jaCBjb25kaXRpb25zCi0gICA/biAgIDMyIGJpdCBjb21wYXJlIGFuZCBicmFuY2ggY29uZGl0aW9ucyBmb2xsb3dlZCBieSBudWxsaWZ5Ci0gICA/TiAgIDY0IGJpdCBjb21wYXJlIGFuZCBicmFuY2ggY29uZGl0aW9ucyBmb2xsb3dlZCBieSBudWxsaWZ5Ci0gICA/UQk2NCBiaXQgY29tcGFyZSBhbmQgYnJhbmNoIGNvbmRpdGlvbnMgZm9yIENNUElCIGluc3RydWN0aW9uCi0KLSAgID9sICAgbG9naWNhbCBjb25kaXRpb25zCi0gICA/TAk2NCBiaXQgbG9naWNhbCBjb25kaXRpb25zCi0KLSAgID9iICAgYnJhbmNoIG9uIGJpdCBjb25kaXRpb25zCi0gICA/Qgk2NCBiaXQgYnJhbmNoIG9uIGJpdCBjb25kaXRpb25zCi0KLSAgID94ICAgc2hpZnQvZXh0cmFjdC9kZXBvc2l0IGNvbmRpdGlvbnMKLSAgID9YCTY0IGJpdCBzaGlmdC9leHRyYWN0L2RlcG9zaXQgY29uZGl0aW9ucwotICAgP3kgICBzaGlmdC9leHRyYWN0L2RlcG9zaXQgY29uZGl0aW9ucyBmb2xsb3dlZCBieSBudWxsaWZ5IGZvciBjb25kaXRpb25hbAotICAgICAgICBicmFuY2hlcwotCi0gICA/dSAgIHVuaXQgY29uZGl0aW9ucwotICAgP1UgICA2NCBiaXQgdW5pdCBjb25kaXRpb25zCi0KLUZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBhbGwgaGF2ZSAnZicgYXMgYSBwcmVmaXg6Ci0KLSAgIGZ0CXRhcmdldCByZWdpc3RlciBhdCAzMQotICAgZlQJdGFyZ2V0IHJlZ2lzdGVyIHdpdGggTC9SIGhhbHZlcyBhdCAzMQotICAgZmEJb3BlcmFuZCAxIHJlZ2lzdGVyIGF0IDEwCi0gICBmQSAgIG9wZXJhbmQgMSByZWdpc3RlciB3aXRoIEwvUiBoYWx2ZXMgYXQgMTAKLSAgIGZYICAgU2FtZSBhcyBmQSwgZXhjZXB0IHByaW50cyBhIHNwYWNlIGJlZm9yZSByZWdpc3RlciBkdXJpbmcgZGlzYXNtCi0gICBmYglvcGVyYW5kIDIgcmVnaXN0ZXIgYXQgMTUKLSAgIGZCICAgb3BlcmFuZCAyIHJlZ2lzdGVyIHdpdGggTC9SIGhhbHZlcyBhdCAxNQotICAgZkMgICBvcGVyYW5kIDMgcmVnaXN0ZXIgd2l0aCBML1IgaGFsdmVzIGF0IDE2OjE4LDIxOjIzCi0gICBmZSAgIExpa2UgZlQsIGJ1dCBlbmNvZGluZyBpcyBkaWZmZXJlbnQuCi0KLUZsb2F0IHJlZ2lzdGVycyBmb3IgZm1weWFkZCBhbmQgZm1weXN1YjoKLQotICAgZmkJbXVsdCBvcGVyYW5kIDEgcmVnaXN0ZXIgYXQgMTAKLSAgIGZqCW11bHQgb3BlcmFuZCAyIHJlZ2lzdGVyIGF0IDE1Ci0gICBmawltdWx0IHRhcmdldCByZWdpc3RlciBhdCAyMAotICAgZmwJYWRkL3N1YiBvcGVyYW5kIHJlZ2lzdGVyIGF0IDI1Ci0gICBmbQlhZGQvc3ViIHRhcmdldCByZWdpc3RlciBhdCAzMQotCi0qLwotCi0KLS8qIExpc3Qgb2YgY2hhcmFjdGVycyBub3QgdG8gcHV0IGEgc3BhY2UgYWZ0ZXIuICBOb3RlIHRoYXQKLSAgICIsIiBpcyBpbmNsdWRlZCwgYXMgdGhlICJzcG9wTiIgb3BlcmF0aW9ucyB1c2UgbGl0ZXJhbAotICAgY29tbWFzIGluIHRoZWlyIGNvbXBsZXRlciBzZWN0aW9ucy4gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb21wbGV0ZXJfY2hhcnMgPSAiLENjWTw+PyFAKyZVfkZmR0hJTm5Pb1pNYWR1fC89MDEyMyVlJG19IjsKLQotLyogVGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzIGluIHRoaXMgdGFibGUgaXMgc2lnbmlmaWNhbnQ6Ci0KLSAgICogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZQotICAgY29uc2VjdXRpdmUuICBJZiB0aGV5IGFyZW4ndCwgdGhlIGFzc2VtYmxlciB3aWxsIGJvbWIgYXQgcnVudGltZS4KLQotICAgKiBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBub3QgY2FyZSBhYm91dCB0aGUgb3JkZXIgb2YgdGhlIG9wY29kZXMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBhX29wY29kZSBwYV9vcGNvZGVzW10gPQotewotCi0vKiBwc2V1ZG8taW5zdHJ1Y3Rpb25zICovCi0KLXsgImxkaSIsCTB4MzQwMDAwMDAsIDB4ZmZlMGMwMDAsICJqLHgiLCBwYTEwLCAwfSwvKiBsZG8gdmFsKHIwKSxyICovCi0KLXsgImNhbGwiLAkweGU4MDBmMDAwLCAweGZjMWZmZmZkLCAibihiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImNhbGwiLAkweGU4MDBhMDAwLCAweGZmZTBlMDAwLCAiblciLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJyZXQiLAkweGU4NDBkMDAwLCAweGZmZmZmZmZkLCAibiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLQoteyAiY21waWIiLCAJMHhlYzAwMDAwMCwgMHhmYzAwMDAwMCwgIj9RbjUsYix3IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiY21waWIiLCAJMHg4NDAwMDAwMCwgMHhmNDAwMDAwMCwgIj9ubjUsYix3IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY29taWIiLCAJMHg4NDAwMDAwMCwgMHhmYzAwMDAwMCwgIj9ubjUsYix3IiwgcGExMCwgMH0sIC8qIGNvbWlie3RmfSovCi0vKiBUaGlzIGVudHJ5IGlzIGZvciB0aGUgZGlzYXNzZW1ibGVyIG9ubHkuICBJdCB3aWxsIG5ldmVyIGJlIHVzZWQgYnkKLSAgIGFzc2VtYmxlci4gICovCi17ICJjb21pYiIsIAkweDhjMDAwMDAwLCAweGZjMDAwMDAwLCAiP25uNSxiLHciLCBwYTEwLCAwfSwgLyogY29taWJ7dGZ9Ki8KLXsgImNtcGIiLAkweDljMDAwMDAwLCAweGRjMDAwMDAwLCAiP05ueCxiLHciLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJjbXBiIiwJMHg4MDAwMDAwMCwgMHhmNDAwMDAwMCwgIj9ubngsYix3IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY29tYiIsCTB4ODAwMDAwMDAsIDB4ZmMwMDAwMDAsICI/bm54LGIsdyIsIHBhMTAsIDB9LCAvKiBjb21ie3RmfSAqLwotLyogVGhpcyBlbnRyeSBpcyBmb3IgdGhlIGRpc2Fzc2VtYmxlciBvbmx5LiAgSXQgd2lsbCBuZXZlciBiZSB1c2VkIGJ5Ci0gICBhc3NlbWJsZXIuICAqLwoteyAiY29tYiIsCTB4ODgwMDAwMDAsIDB4ZmMwMDAwMDAsICI/bm54LGIsdyIsIHBhMTAsIDB9LCAvKiBjb21ie3RmfSAqLwoteyAiYWRkYiIsCTB4YTAwMDAwMDAsIDB4ZjQwMDAwMDAsICI/V254LGIsdyIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImFkZGIiLAkweGEwMDAwMDAwLCAweGZjMDAwMDAwLCAiP0BueCxiLHciLCBwYTEwLCAwfSwgLyogYWRkYnt0Zn0gKi8KLS8qIFRoaXMgZW50cnkgaXMgZm9yIHRoZSBkaXNhc3NlbWJsZXIgb25seS4gIEl0IHdpbGwgbmV2ZXIgYmUgdXNlZCBieQotICAgYXNzZW1ibGVyLiAgKi8KLXsgImFkZGIiLAkweGE4MDAwMDAwLCAweGZjMDAwMDAwLCAiP0BueCxiLHciLCBwYTEwLCAwfSwKLXsgImFkZGliIiwJMHhhNDAwMDAwMCwgMHhmNDAwMDAwMCwgIj9XbjUsYix3IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYWRkaWIiLAkweGE0MDAwMDAwLCAweGZjMDAwMDAwLCAiP0BuNSxiLHciLCBwYTEwLCAwfSwgLyogYWRkaWJ7dGZ9Ki8KLS8qIFRoaXMgZW50cnkgaXMgZm9yIHRoZSBkaXNhc3NlbWJsZXIgb25seS4gIEl0IHdpbGwgbmV2ZXIgYmUgdXNlZCBieQotICAgYXNzZW1ibGVyLiAgKi8KLXsgImFkZGliIiwJMHhhYzAwMDAwMCwgMHhmYzAwMDAwMCwgIj9AbjUsYix3IiwgcGExMCwgMH0sIC8qIGFkZGlie3RmfSovCi17ICJub3AiLCAgICAgICAgMHgwODAwMDI0MCwgMHhmZmZmZmZmZiwgIiIsIHBhMTAsIDB9LCAgICAgIC8qIG9yIDAsMCwwICovCi17ICJjb3B5IiwgICAgICAgMHgwODAwMDI0MCwgMHhmZmUwZmZlMCwgIngsdCIsIHBhMTAsIDB9LCAgIC8qIG9yIHIsMCx0ICovCi17ICJtdHNhciIsICAgICAgMHgwMTYwMTg0MCwgMHhmZmUwZmZmZiwgIngiLCBwYTEwLCAwfSwgLyogbXRjdGwgcixjcjExICovCi0KLS8qIExvYWRzIGFuZCBTdG9yZXMgZm9yIGludGVnZXIgcmVnaXN0ZXJzLiAgKi8KLQoteyAibGRkIiwJMHgwYzAwMTBlMCwgMHhmYzFmMzNlMCwgImNvY2NAKHMsYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZCIsCTB4MGMwMDEwZTAsIDB4ZmMxZjMzZTAsICJjb2NjQChiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRkIiwgICAgICAgIDB4MGMwMDAwYzAsIDB4ZmMwMDEzYzAsICJjeGNjeChzLGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGQiLCAgICAgICAgMHgwYzAwMDBjMCwgMHhmYzAwMTNjMCwgImN4Y2N4KGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGQiLAkweDBjMDAxMGMwLCAweGZjMDAxM2MwLCAiY21jYzUocyxiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRkIiwJMHgwYzAwMTBjMCwgMHhmYzAwMTNjMCwgImNtY2M1KGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGQiLCAgICAgICAgMHg1MDAwMDAwMCwgMHhmYzAwMDAwMiwgImNxIyhzLGIpLHgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGQiLCAgICAgICAgMHg1MDAwMDAwMCwgMHhmYzAwMDAwMiwgImNxIyhiKSx4IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwgICAgICAgIDB4MGMwMDAwODAsIDB4ZmMwMDEzYzAsICJjeGNjeChzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZHciLCAgICAgICAgMHgwYzAwMDA4MCwgMHhmYzAwMTNjMCwgImN4Y2N4KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZHciLAkweDBjMDAxMGEwLCAweGZjMWYzM2UwLCAiY29jY0AocyxiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwJMHgwYzAwMTBhMCwgMHhmYzFmMzNlMCwgImNvY2NAKGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZHciLAkweDBjMDAxMDgwLCAweGZjMDAxM2MwLCAiY21jYzUocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwJMHgwYzAwMTA4MCwgMHhmYzAwMTNjMCwgImNtY2M1KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZHciLCAgICAgICAgMHg0YzAwMDAwMCwgMHhmYzAwMDAwMCwgImNlSihzLGIpLHgiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZHciLCAgICAgICAgMHg0YzAwMDAwMCwgMHhmYzAwMDAwMCwgImNlSihiKSx4IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwgICAgICAgIDB4NWMwMDAwMDQsIDB4ZmMwMDAwMDYsICJjZUsocyxiKSx4IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3IiwgICAgICAgIDB4NWMwMDAwMDQsIDB4ZmMwMDAwMDYsICJjZUsoYikseCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkdyIsICAgICAgICAweDQ4MDAwMDAwLCAweGZjMDAwMDAwLCAiaihzLGIpLHgiLCBwYTEwLCAwfSwKLXsgImxkdyIsICAgICAgICAweDQ4MDAwMDAwLCAweGZjMDAwMDAwLCAiaihzLGIpLHgiLCBwYTEwLCAwfSwKLXsgImxkdyIsICAgICAgICAweDQ4MDAwMDAwLCAweGZjMDAwMDAwLCAiaihiKSx4IiwgcGExMCwgMH0sCi17ICJsZGgiLCAgICAgICAgMHgwYzAwMDA0MCwgMHhmYzAwMTNjMCwgImN4Y2N4KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkaCIsICAgICAgICAweDBjMDAwMDQwLCAweGZjMDAxM2MwLCAiY3hjY3goYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkaCIsCTB4MGMwMDEwNjAsIDB4ZmMxZjMzZTAsICJjb2NjQChzLGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGgiLAkweDBjMDAxMDYwLCAweGZjMWYzM2UwLCAiY29jY0AoYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkaCIsCTB4MGMwMDEwNDAsIDB4ZmMwMDEzYzAsICJjbWNjNShzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGgiLAkweDBjMDAxMDQwLCAweGZjMDAxM2MwLCAiY21jYzUoYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkaCIsICAgICAgICAweDQ0MDAwMDAwLCAweGZjMDAwMDAwLCAiaihzLGIpLHgiLCBwYTEwLCAwfSwKLXsgImxkaCIsICAgICAgICAweDQ0MDAwMDAwLCAweGZjMDAwMDAwLCAiaihiKSx4IiwgcGExMCwgMH0sCi17ICJsZGIiLCAgICAgICAgMHgwYzAwMDAwMCwgMHhmYzAwMTNjMCwgImN4Y2N4KHMsYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkYiIsICAgICAgICAweDBjMDAwMDAwLCAweGZjMDAxM2MwLCAiY3hjY3goYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkYiIsCTB4MGMwMDEwMjAsIDB4ZmMxZjMzZTAsICJjb2NjQChzLGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGIiLAkweDBjMDAxMDIwLCAweGZjMWYzM2UwLCAiY29jY0AoYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkYiIsCTB4MGMwMDEwMDAsIDB4ZmMwMDEzYzAsICJjbWNjNShzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGIiLAkweDBjMDAxMDAwLCAweGZjMDAxM2MwLCAiY21jYzUoYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkYiIsICAgICAgICAweDQwMDAwMDAwLCAweGZjMDAwMDAwLCAiaihzLGIpLHgiLCBwYTEwLCAwfSwKLXsgImxkYiIsICAgICAgICAweDQwMDAwMDAwLCAweGZjMDAwMDAwLCAiaihiKSx4IiwgcGExMCwgMH0sCi17ICJzdGQiLAkweDBjMDAxMmUwLCAweGZjMDAzM2ZmLCAiY29jQ3gsQChzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RkIiwJMHgwYzAwMTJlMCwgMHhmYzAwMzNmZiwgImNvY0N4LEAoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGQiLAkweDBjMDAxMmMwLCAweGZjMDAxM2MwLCAiY21jQ3gsVihzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RkIiwJMHgwYzAwMTJjMCwgMHhmYzAwMTNjMCwgImNtY0N4LFYoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGQiLCAgICAgICAgMHg3MDAwMDAwMCwgMHhmYzAwMDAwMiwgImNxeCwjKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGQiLCAgICAgICAgMHg3MDAwMDAwMCwgMHhmYzAwMDAwMiwgImNxeCwjKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwJMHgwYzAwMTJhMCwgMHhmYzAwMTNmZiwgImNvY0N4LEAocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0dyIsCTB4MGMwMDEyYTAsIDB4ZmMwMDEzZmYsICJjb2NDeCxAKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwJMHgwYzAwMTI4MCwgMHhmYzAwMTNjMCwgImNtY0N4LFYocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0dyIsCTB4MGMwMDEyODAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwgICAgICAgIDB4NmMwMDAwMDAsIDB4ZmMwMDAwMDAsICJjZXgsSihzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3R3IiwgICAgICAgIDB4NmMwMDAwMDAsIDB4ZmMwMDAwMDAsICJjZXgsSihiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0dyIsICAgICAgICAweDdjMDAwMDA0LCAweGZjMDAwMDA2LCAiY2V4LEsocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0dyIsICAgICAgICAweDdjMDAwMDA0LCAweGZjMDAwMDA2LCAiY2V4LEsoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdHciLCAgICAgICAgMHg2ODAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihzLGIpIiwgcGExMCwgMH0sCi17ICJzdHciLCAgICAgICAgMHg2ODAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihiKSIsIHBhMTAsIDB9LAoteyAic3RoIiwJMHgwYzAwMTI2MCwgMHhmYzAwMzNmZiwgImNvY0N4LEAocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0aCIsCTB4MGMwMDEyNjAsIDB4ZmMwMDMzZmYsICJjb2NDeCxAKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RoIiwJMHgwYzAwMTI0MCwgMHhmYzAwMTNjMCwgImNtY0N4LFYocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0aCIsCTB4MGMwMDEyNDAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3RoIiwgICAgICAgIDB4NjQwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGoocyxiKSIsIHBhMTAsIDB9LAoteyAic3RoIiwgICAgICAgIDB4NjQwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGooYikiLCBwYTEwLCAwfSwKLXsgInN0YiIsCTB4MGMwMDEyMjAsIDB4ZmMwMDMzZmYsICJjb2NDeCxAKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGIiLAkweDBjMDAxMjIwLCAweGZjMDAzM2ZmLCAiY29jQ3gsQChiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0YiIsCTB4MGMwMDEyMDAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdGIiLAkweDBjMDAxMjAwLCAweGZjMDAxM2MwLCAiY21jQ3gsVihiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0YiIsICAgICAgICAweDYwMDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKHMsYikiLCBwYTEwLCAwfSwKLXsgInN0YiIsICAgICAgICAweDYwMDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKGIpIiwgcGExMCwgMH0sCi17ICJsZHdtIiwgICAgICAgMHg0YzAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMCwgMH0sCi17ICJsZHdtIiwgICAgICAgMHg0YzAwMDAwMCwgMHhmYzAwMDAwMCwgImooYikseCIsIHBhMTAsIDB9LAoteyAic3R3bSIsICAgICAgIDB4NmMwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGoocyxiKSIsIHBhMTAsIDB9LAoteyAic3R3bSIsICAgICAgIDB4NmMwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGooYikiLCBwYTEwLCAwfSwKLXsgImxkd3giLCAgICAgICAweDBjMDAwMDgwLCAweGZjMDAxZmMwLCAiY3h4KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGR3eCIsICAgICAgIDB4MGMwMDAwODAsIDB4ZmMwMDFmYzAsICJjeHgoYiksdCIsIHBhMTAsIDB9LAoteyAibGRoeCIsICAgICAgIDB4MGMwMDAwNDAsIDB4ZmMwMDFmYzAsICJjeHgocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsZGh4IiwgICAgICAgMHgwYzAwMDA0MCwgMHhmYzAwMWZjMCwgImN4eChiKSx0IiwgcGExMCwgMH0sCi17ICJsZGJ4IiwgICAgICAgMHgwYzAwMDAwMCwgMHhmYzAwMWZjMCwgImN4eChzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkYngiLCAgICAgICAweDBjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3h4KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkd2EiLCAgICAgICAweDBjMDAwMTgwLCAweGZjMDBkM2MwLCAiY3hjY3goYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkd2EiLAkweDBjMDAxMTgwLCAweGZjMDBkM2MwLCAiY21jYzUoYiksdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkY3ciLCAgICAgICAweDBjMDAwMWMwLCAweGZjMDAxM2MwLCAiY3hjZHgocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRjdyIsICAgICAgIDB4MGMwMDAxYzAsIDB4ZmMwMDEzYzAsICJjeGNkeChiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAibGRjdyIsCTB4MGMwMDExYzAsIDB4ZmMwMDEzYzAsICJjbWNkNShzLGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJsZGN3IiwJMHgwYzAwMTFjMCwgMHhmYzAwMTNjMCwgImNtY2Q1KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdHdhIiwJMHgwYzAwMTNhMCwgMHhmYzAwZDNmZiwgImNvY0N4LEAoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdHdhIiwJMHgwYzAwMTM4MCwgMHhmYzAwZDNjMCwgImNtY0N4LFYoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdGJ5IiwJMHgwYzAwMTMwMCwgMHhmYzAwMTNjMCwgImNzY0N4LFYocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN0YnkiLAkweDBjMDAxMzAwLCAweGZjMDAxM2MwLCAiY3NjQ3gsVihiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZGEiLCAgICAgICAweDBjMDAwMTAwLCAweGZjMDBkM2MwLCAiY3hjY3goYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkZGEiLAkweDBjMDAxMTAwLCAweGZjMDBkM2MwLCAiY21jYzUoYiksdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImxkY2QiLCAgICAgICAweDBjMDAwMTQwLCAweGZjMDAxM2MwLCAiY3hjZHgocyxiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRjZCIsICAgICAgIDB4MGMwMDAxNDAsIDB4ZmMwMDEzYzAsICJjeGNkeChiKSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGRjZCIsCTB4MGMwMDExNDAsIDB4ZmMwMDEzYzAsICJjbWNkNShzLGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJsZGNkIiwJMHgwYzAwMTE0MCwgMHhmYzAwMTNjMCwgImNtY2Q1KGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGRhIiwJMHgwYzAwMTNlMCwgMHhmYzAwMzNmZiwgImNvY0N4LEAocyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZGEiLAkweDBjMDAxM2UwLCAweGZjMDAzM2ZmLCAiY29jQ3gsQChiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN0ZGEiLAkweDBjMDAxM2MwLCAweGZjMDAxM2MwLCAiY21jQ3gsVihzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RkYSIsCTB4MGMwMDEzYzAsIDB4ZmMwMDEzYzAsICJjbWNDeCxWKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibGR3YXgiLCAgICAgIDB4MGMwMDAxODAsIDB4ZmMwMGRmYzAsICJjeHgoYiksdCIsIHBhMTAsIDB9LAoteyAibGRjd3giLCAgICAgIDB4MGMwMDAxYzAsIDB4ZmMwMDFmYzAsICJjeHgocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsZGN3eCIsICAgICAgMHgwYzAwMDFjMCwgMHhmYzAwMWZjMCwgImN4eChiKSx0IiwgcGExMCwgMH0sCi17ICJsZHdzIiwJMHgwYzAwMTA4MCwgMHhmYzAwMWZjMCwgImNtNShzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkd3MiLAkweDBjMDAxMDgwLCAweGZjMDAxZmMwLCAiY201KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxkaHMiLAkweDBjMDAxMDQwLCAweGZjMDAxZmMwLCAiY201KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGRocyIsCTB4MGMwMDEwNDAsIDB4ZmMwMDFmYzAsICJjbTUoYiksdCIsIHBhMTAsIDB9LAoteyAibGRicyIsCTB4MGMwMDEwMDAsIDB4ZmMwMDFmYzAsICJjbTUocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsZGJzIiwJMHgwYzAwMTAwMCwgMHhmYzAwMWZjMCwgImNtNShiKSx0IiwgcGExMCwgMH0sCi17ICJsZHdhcyIsCTB4MGMwMDExODAsIDB4ZmMwMGRmYzAsICJjbTUoYiksdCIsIHBhMTAsIDB9LAoteyAibGRjd3MiLAkweDBjMDAxMWMwLCAweGZjMDAxZmMwLCAiY201KHMsYiksdCIsIHBhMTAsIDB9LAoteyAibGRjd3MiLAkweDBjMDAxMWMwLCAweGZjMDAxZmMwLCAiY201KGIpLHQiLCBwYTEwLCAwfSwKLXsgInN0d3MiLAkweDBjMDAxMjgwLCAweGZjMDAxZmMwLCAiY214LFYocyxiKSIsIHBhMTAsIDB9LAoteyAic3R3cyIsCTB4MGMwMDEyODAsIDB4ZmMwMDFmYzAsICJjbXgsVihiKSIsIHBhMTAsIDB9LAoteyAic3RocyIsCTB4MGMwMDEyNDAsIDB4ZmMwMDFmYzAsICJjbXgsVihzLGIpIiwgcGExMCwgMH0sCi17ICJzdGhzIiwJMHgwYzAwMTI0MCwgMHhmYzAwMWZjMCwgImNteCxWKGIpIiwgcGExMCwgMH0sCi17ICJzdGJzIiwJMHgwYzAwMTIwMCwgMHhmYzAwMWZjMCwgImNteCxWKHMsYikiLCBwYTEwLCAwfSwKLXsgInN0YnMiLAkweDBjMDAxMjAwLCAweGZjMDAxZmMwLCAiY214LFYoYikiLCBwYTEwLCAwfSwKLXsgInN0d2FzIiwJMHgwYzAwMTM4MCwgMHhmYzAwZGZjMCwgImNteCxWKGIpIiwgcGExMCwgMH0sCi17ICJzdGRieSIsCTB4MGMwMDEzNDAsIDB4ZmMwMDEzYzAsICJjc2NDeCxWKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdGRieSIsCTB4MGMwMDEzNDAsIDB4ZmMwMDEzYzAsICJjc2NDeCxWKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3RieXMiLAkweDBjMDAxMzAwLCAweGZjMDAxZmMwLCAiY3N4LFYocyxiKSIsIHBhMTAsIDB9LAoteyAic3RieXMiLAkweDBjMDAxMzAwLCAweGZjMDAxZmMwLCAiY3N4LFYoYikiLCBwYTEwLCAwfSwKLQotLyogSW1tZWRpYXRlIGluc3RydWN0aW9ucy4gICovCi17ICJsZG8iLAkweDM0MDAwMDAwLCAweGZjMDBjMDAwLCAiaihiKSx4IiwgcGExMCwgMH0sCi17ICJsZGlsIiwJMHgyMDAwMDAwMCwgMHhmYzAwMDAwMCwgImssYiIsIHBhMTAsIDB9LAoteyAiYWRkaWwiLAkweDI4MDAwMDAwLCAweGZjMDAwMDAwLCAiayxiLFoiLCBwYTEwLCAwfSwKLXsgImFkZGlsIiwJMHgyODAwMDAwMCwgMHhmYzAwMDAwMCwgImssYiIsIHBhMTAsIDB9LAotCi0vKiBCcmFuY2hpbmcgaW5zdHJ1Y3Rpb25zLiAqLwoteyAiYiIsCQkweGU4MDA4MDAwLCAweGZjMDBlMDAwLCAiY3BuWEwiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJiIiwJCTB4ZTgwMGEwMDAsIDB4ZmMwMGUwMDAsICJjbG5YTCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImIiLAkJMHhlODAwMDAwMCwgMHhmYzAwZTAwMCwgImNsblcsYiIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImIiLAkJMHhlODAwMjAwMCwgMHhmYzAwZTAwMCwgImNnblcsYiIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImIiLAkJMHhlODAwMDAwMCwgMHhmZmUwZTAwMCwgIm5XIiwgcGExMCwgMH0sICAvKiBiLGwgZm9vLHIwICovCi17ICJibCIsCQkweGU4MDAwMDAwLCAweGZjMDBlMDAwLCAiblcsYiIsIHBhMTAsIDB9LAoteyAiZ2F0ZSIsCTB4ZTgwMDIwMDAsIDB4ZmMwMGUwMDAsICJuVyxiIiwgcGExMCwgMH0sCi17ICJibHIiLAkweGU4MDA0MDAwLCAweGZjMDBlMDAxLCAibngsYiIsIHBhMTAsIDB9LAoteyAiYnYiLAkJMHhlODAwYzAwMCwgMHhmYzAwZmZmZCwgIm54KGIpIiwgcGExMCwgMH0sCi17ICJidiIsCQkweGU4MDBjMDAwLCAweGZjMDBmZmZkLCAibihiKSIsIHBhMTAsIDB9LAoteyAiYnZlIiwJMHhlODAwZjAwMSwgMHhmYzFmZmZmZCwgImNwbihiKUwiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJidmUiLAkweGU4MDBmMDAwLCAweGZjMWZmZmZkLCAiY2xuKGIpTCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImJ2ZSIsCTB4ZTgwMGQwMDEsIDB4ZmMxZmZmZmQsICJjUG4oYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJidmUiLAkweGU4MDBkMDAwLCAweGZjMWZmZmZkLCAibihiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImJlIiwJCTB4ZTQwMDAwMDAsIDB4ZmMwMDAwMDAsICJjbG56KFMsYiksWSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImJlIiwJCTB4ZTQwMDAwMDAsIDB4ZmMwMDAwMDAsICJjbG56KGIpLFkiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJiZSIsCQkweGUwMDAwMDAwLCAweGZjMDAwMDAwLCAibnooUyxiKSIsIHBhMTAsIDB9LAoteyAiYmUiLAkJMHhlMDAwMDAwMCwgMHhmYzAwMDAwMCwgIm56KGIpIiwgcGExMCwgMH0sCi17ICJibGUiLAkweGU0MDAwMDAwLCAweGZjMDAwMDAwLCAibnooUyxiKSIsIHBhMTAsIDB9LAoteyAibW92YiIsCTB4YzgwMDAwMDAsIDB4ZmMwMDAwMDAsICI/eW54LGIsdyIsIHBhMTAsIDB9LAoteyAibW92aWIiLAkweGNjMDAwMDAwLCAweGZjMDAwMDAwLCAiP3luNSxiLHciLCBwYTEwLCAwfSwKLXsgImNvbWJ0IiwJMHg4MDAwMDAwMCwgMHhmYzAwMDAwMCwgIj90bngsYix3IiwgcGExMCwgMH0sCi17ICJjb21iZiIsCTB4ODgwMDAwMDAsIDB4ZmMwMDAwMDAsICI/dG54LGIsdyIsIHBhMTAsIDB9LAoteyAiY29taWJ0IiwJMHg4NDAwMDAwMCwgMHhmYzAwMDAwMCwgIj90bjUsYix3IiwgcGExMCwgMH0sCi17ICJjb21pYmYiLAkweDhjMDAwMDAwLCAweGZjMDAwMDAwLCAiP3RuNSxiLHciLCBwYTEwLCAwfSwKLXsgImFkZGJ0IiwJMHhhMDAwMDAwMCwgMHhmYzAwMDAwMCwgIj9kbngsYix3IiwgcGExMCwgMH0sCi17ICJhZGRiZiIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsICI/ZG54LGIsdyIsIHBhMTAsIDB9LAoteyAiYWRkaWJ0IiwJMHhhNDAwMDAwMCwgMHhmYzAwMDAwMCwgIj9kbjUsYix3IiwgcGExMCwgMH0sCi17ICJhZGRpYmYiLAkweGFjMDAwMDAwLCAweGZjMDAwMDAwLCAiP2RuNSxiLHciLCBwYTEwLCAwfSwKLXsgImJiIiwJCTB4YzAwMDYwMDAsIDB4ZmZlMDYwMDAsICI/Qm54LCEsdyIsIHBhMjAsIEZMQUdfU1RSSUNUfSwgCi17ICJiYiIsCQkweGM0MDA0MDAwLCAweGZjMDA0MDAwLCAiP0JueCxCLHciLCBwYTIwLCBGTEFHX1NUUklDVH0sIAoteyAiYmIiLAkJMHhjMDAwNDAwMCwgMHhmZmUwNjAwMCwgIj9ibngsISx3IiwgcGExMCwgRkxBR19TVFJJQ1R9LCAKLXsgImJiIiwJCTB4YzQwMDQwMDAsIDB4ZmMwMDQwMDAsICI/Ym54LFEsdyIsIHBhMTAsIDB9LCAKLXsgImJ2YiIsCTB4YzAwMDQwMDAsIDB4ZmZlMDQwMDAsICI/Ym54LHciLCBwYTEwLCAwfSwKLXsgImNscmJ0cyIsCTB4ZTgwMDQwMDUsIDB4ZmZmZmZmZmYsICIiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJwb3BidHMiLAkweGU4MDA0MDA1LCAweGZmZmZmMDA3LCAiJCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInB1c2hub20iLAkweGU4MDA0MDAxLCAweGZmZmZmZmZmLCAiIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAicHVzaGJ0cyIsCTB4ZTgwMDQwMDEsIDB4ZmZlMGZmZmYsICJ4IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAotCi0vKiBDb21wdXRhdGlvbiBJbnN0cnVjdGlvbnMgKi8KLQoteyAiY21wY2xyIiwgICAgIDB4MDgwMDA4YTAsIDB4ZmMwMDBmZTAsICI/U3gsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiY21wY2xyIiwgICAgIDB4MDgwMDA4ODAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY29tY2xyIiwgICAgIDB4MDgwMDA4ODAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgMH0sCi17ICJvciIsICAgICAgICAgMHgwODAwMDI2MCwgMHhmYzAwMGZlMCwgIj9MeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJvciIsICAgICAgICAgMHgwODAwMDI0MCwgMHhmYzAwMGZlMCwgIj9seCxiLHQiLCBwYTEwLCAwfSwKLXsgInhvciIsICAgICAgICAweDA4MDAwMmEwLCAweGZjMDAwZmUwLCAiP0x4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInhvciIsICAgICAgICAweDA4MDAwMjgwLCAweGZjMDAwZmUwLCAiP2x4LGIsdCIsIHBhMTAsIDB9LAoteyAiYW5kIiwgICAgICAgIDB4MDgwMDAyMjAsIDB4ZmMwMDBmZTAsICI/THgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYW5kIiwgICAgICAgIDB4MDgwMDAyMDAsIDB4ZmMwMDBmZTAsICI/bHgsYix0IiwgcGExMCwgMH0sCi17ICJhbmRjbSIsICAgICAgMHgwODAwMDAyMCwgMHhmYzAwMGZlMCwgIj9MeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJhbmRjbSIsICAgICAgMHgwODAwMDAwMCwgMHhmYzAwMGZlMCwgIj9seCxiLHQiLCBwYTEwLCAwfSwKLXsgInV4b3IiLCAgICAgICAweDA4MDAwM2EwLCAweGZjMDAwZmUwLCAiP1V4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInV4b3IiLCAgICAgICAweDA4MDAwMzgwLCAweGZjMDAwZmUwLCAiP3V4LGIsdCIsIHBhMTAsIDB9LAoteyAidWFkZGNtIiwgICAgIDB4MDgwMDA5YTAsIDB4ZmMwMDBmYTAsICJjVD9VeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJ1YWRkY20iLCAgICAgMHgwODAwMDk4MCwgMHhmYzAwMGZhMCwgImNUP3V4LGIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInVhZGRjbSIsICAgICAweDA4MDAwOTgwLCAweGZjMDAwZmUwLCAiP3V4LGIsdCIsIHBhMTAsIDB9LAoteyAidWFkZGNtdCIsICAgIDB4MDgwMDA5YzAsIDB4ZmMwMDBmZTAsICI/dXgsYix0IiwgcGExMCwgMH0sCi17ICJkY29yIiwgICAgICAgMHgwODAwMGJhMCwgMHhmYzFmMGZhMCwgImNpP1ViLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJkY29yIiwgICAgICAgMHgwODAwMGI4MCwgMHhmYzFmMGZhMCwgImNpP3ViLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJkY29yIiwgICAgICAgMHgwODAwMGI4MCwgMHhmYzFmMGZlMCwgIj91Yix0IiwgICBwYTEwLCAwfSwKLXsgImlkY29yIiwgICAgICAweDA4MDAwYmMwLCAweGZjMWYwZmUwLCAiP3ViLHQiLCAgIHBhMTAsIDB9LAoteyAiYWRkaSIsICAgICAgIDB4YjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJjdD9haSxiLHgiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJhZGRpIiwgICAgICAgMHhiNDAwMDAwMCwgMHhmYzAwMDAwMCwgImN2P2FpLGIseCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImFkZGkiLCAgICAgICAweGI0MDAwMDAwLCAweGZjMDAwODAwLCAiP2FpLGIseCIsIHBhMTAsIDB9LAoteyAiYWRkaW8iLCAgICAgIDB4YjQwMDA4MDAsIDB4ZmMwMDA4MDAsICI/YWksYix4IiwgcGExMCwgMH0sCi17ICJhZGRpdCIsICAgICAgMHhiMDAwMDAwMCwgMHhmYzAwMDgwMCwgIj9haSxiLHgiLCBwYTEwLCAwfSwKLXsgImFkZGl0byIsICAgICAweGIwMDAwODAwLCAweGZjMDAwODAwLCAiP2FpLGIseCIsIHBhMTAsIDB9LAoteyAiYWRkIiwgICAgICAgIDB4MDgwMDA3MjAsIDB4ZmMwMDA3ZTAsICJjWT9BeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJhZGQiLCAgICAgICAgMHgwODAwMDcwMCwgMHhmYzAwMDdlMCwgImN5P2F4LGIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImFkZCIsICAgICAgICAweDA4MDAwMjIwLCAweGZjMDAwM2UwLCAiY2E/QXgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiYWRkIiwgICAgICAgIDB4MDgwMDAyMDAsIDB4ZmMwMDAzZTAsICJjYT9heCxiLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJhZGQiLCAgICAgICAgMHgwODAwMDYwMCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgImFkZGwiLCAgICAgICAweDA4MDAwYTAwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAiYWRkbyIsICAgICAgIDB4MDgwMDBlMDAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJhZGRjIiwgICAgICAgMHgwODAwMDcwMCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgImFkZGNvIiwgICAgICAweDA4MDAwZjAwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAic3ViIiwgICAgICAgIDB4MDgwMDA0ZTAsIDB4ZmMwMDA3ZTAsICJjdD9TeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzdWIiLCAgICAgICAgMHgwODAwMDRjMCwgMHhmYzAwMDdlMCwgImN0P3N4LGIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN1YiIsICAgICAgICAweDA4MDAwNTIwLCAweGZjMDAwN2UwLCAiY0I/U3gsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3ViIiwgICAgICAgIDB4MDgwMDA1MDAsIDB4ZmMwMDA3ZTAsICJjYj9zeCxiLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJzdWIiLCAgICAgICAgMHgwODAwMDQyMCwgMHhmYzAwMDdlMCwgImN2P1N4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInN1YiIsICAgICAgICAweDA4MDAwNDAwLCAweGZjMDAwN2UwLCAiY3Y/c3gsYix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic3ViIiwgICAgICAgIDB4MDgwMDA0MDAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgMH0sCi17ICJzdWJvIiwgICAgICAgMHgwODAwMGMwMCwgMHhmYzAwMGZlMCwgIj9zeCxiLHQiLCBwYTEwLCAwfSwKLXsgInN1YmIiLCAgICAgICAweDA4MDAwNTAwLCAweGZjMDAwZmUwLCAiP3N4LGIsdCIsIHBhMTAsIDB9LAoteyAic3ViYm8iLCAgICAgIDB4MDgwMDBkMDAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgMH0sCi17ICJzdWJ0IiwgICAgICAgMHgwODAwMDRjMCwgMHhmYzAwMGZlMCwgIj9zeCxiLHQiLCBwYTEwLCAwfSwKLXsgInN1YnRvIiwgICAgICAweDA4MDAwY2MwLCAweGZjMDAwZmUwLCAiP3N4LGIsdCIsIHBhMTAsIDB9LAoteyAiZHMiLCAgICAgICAgIDB4MDgwMDA0NDAsIDB4ZmMwMDBmZTAsICI/c3gsYix0IiwgcGExMCwgMH0sCi17ICJzdWJpIiwgICAgICAgMHg5NDAwMDAwMCwgMHhmYzAwMDAwMCwgImN2P3NpLGIseCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInN1YmkiLCAgICAgICAweDk0MDAwMDAwLCAweGZjMDAwODAwLCAiP3NpLGIseCIsIHBhMTAsIDB9LAoteyAic3ViaW8iLCAgICAgIDB4OTQwMDA4MDAsIDB4ZmMwMDA4MDAsICI/c2ksYix4IiwgcGExMCwgMH0sCi17ICJjbXBpY2xyIiwgICAgMHg5MDAwMDgwMCwgMHhmYzAwMDgwMCwgIj9TaSxiLHgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJjbXBpY2xyIiwgICAgMHg5MDAwMDAwMCwgMHhmYzAwMDgwMCwgIj9zaSxiLHgiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjb21pY2xyIiwgICAgMHg5MDAwMDAwMCwgMHhmYzAwMDgwMCwgIj9zaSxiLHgiLCBwYTEwLCAwfSwKLXsgInNobGFkZCIsICAgICAweDA4MDAwMjIwLCAweGZjMDAwMzIwLCAiY2E/QXgsLixiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzaGxhZGQiLCAgICAgMHgwODAwMDIwMCwgMHhmYzAwMDMyMCwgImNhP2F4LC4sYix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAic2gxYWRkIiwgICAgIDB4MDgwMDA2NDAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJzaDFhZGRsIiwgICAgMHgwODAwMGE0MCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgInNoMWFkZG8iLCAgICAweDA4MDAwZTQwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAic2gyYWRkIiwgICAgIDB4MDgwMDA2ODAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJzaDJhZGRsIiwgICAgMHgwODAwMGE4MCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgInNoMmFkZG8iLCAgICAweDA4MDAwZTgwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAoteyAic2gzYWRkIiwgICAgIDB4MDgwMDA2YzAsIDB4ZmMwMDBmZTAsICI/YXgsYix0IiwgcGExMCwgMH0sCi17ICJzaDNhZGRsIiwgICAgMHgwODAwMGFjMCwgMHhmYzAwMGZlMCwgIj9heCxiLHQiLCBwYTEwLCAwfSwKLXsgInNoM2FkZG8iLCAgICAweDA4MDAwZWMwLCAweGZjMDAwZmUwLCAiP2F4LGIsdCIsIHBhMTAsIDB9LAotCi0vKiBTdWJ3b3JkIE9wZXJhdGlvbiBJbnN0cnVjdGlvbnMgKi8KLQoteyAiaGFkZCIsICAgICAgIDB4MDgwMDAzMDAsIDB4ZmMwMGZmMjAsICJjSHgsYix0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiaGF2ZyIsICAgICAgIDB4MDgwMDAyYzAsIDB4ZmMwMGZmZTAsICJ4LGIsdCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImhzaGwiLCAgICAgICAweGY4MDA4ODAwLCAweGZmZTBmYzIwLCAieCwqLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJoc2hsYWRkIiwgICAgMHgwODAwMDcwMCwgMHhmYzAwZmYyMCwgIngsLixiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJoc2hyIiwgICAgICAgMHhmODAwYzgwMCwgMHhmYzFmZjgyMCwgImNTYiwqLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJoc2hyYWRkIiwgICAgMHgwODAwMDUwMCwgMHhmYzAwZmYyMCwgIngsLixiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJoc3ViIiwgICAgICAgMHgwODAwMDEwMCwgMHhmYzAwZmYyMCwgImNIeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJtaXhoIiwgICAgICAgMHhmODAwODQwMCwgMHhmYzAwOWZlMCwgImNoeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJtaXh3IiwgICAgICAgMHhmODAwODAwMCwgMHhmYzAwOWZlMCwgImNoeCxiLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJwZXJtaCIsICAgICAgMHhmODAwMDAwMCwgMHhmYzAwOTAyMCwgImMqYSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAotCi0KLS8qIEV4dHJhY3QgYW5kIERlcG9zaXQgSW5zdHJ1Y3Rpb25zICovCi0KLXsgInNocnBkIiwgICAgICAweGQwMDAwMjAwLCAweGZjMDAxZmUwLCAiP1h4LGIsISx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic2hycGQiLCAgICAgIDB4ZDAwMDA0MDAsIDB4ZmMwMDE0MDAsICI/WHgsYix+LHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJzaHJwdyIsICAgICAgMHhkMDAwMDAwMCwgMHhmYzAwMWZlMCwgIj94eCxiLCEsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInNocnB3IiwgICAgICAweGQwMDAwODAwLCAweGZjMDAxYzAwLCAiP3h4LGIscCx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAidnNoZCIsICAgICAgIDB4ZDAwMDAwMDAsIDB4ZmMwMDFmZTAsICI/eHgsYix0IiwgcGExMCwgMH0sCi17ICJzaGQiLCAgICAgICAgMHhkMDAwMDgwMCwgMHhmYzAwMWMwMCwgIj94eCxiLHAsdCIsIHBhMTAsIDB9LAoteyAiZXh0cmQiLCAgICAgIDB4ZDAwMDEyMDAsIDB4ZmMwMDFhZTAsICJjUz9YYiwhLCUseCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImV4dHJkIiwgICAgICAweGQ4MDAwMDAwLCAweGZjMDAwMDAwLCAiY1M/WGIscSx8LHgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJleHRydyIsICAgICAgMHhkMDAwMTAwMCwgMHhmYzAwMWJlMCwgImNTP3hiLCEsVCx4IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZXh0cnciLCAgICAgIDB4ZDAwMDE4MDAsIDB4ZmMwMDE4MDAsICJjUz94YixQLFQseCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInZleHRydSIsICAgICAweGQwMDAxMDAwLCAweGZjMDAxZmUwLCAiP3hiLFQseCIsIHBhMTAsIDB9LAoteyAidmV4dHJzIiwgICAgIDB4ZDAwMDE0MDAsIDB4ZmMwMDFmZTAsICI/eGIsVCx4IiwgcGExMCwgMH0sCi17ICJleHRydSIsICAgICAgMHhkMDAwMTgwMCwgMHhmYzAwMWMwMCwgIj94YixQLFQseCIsIHBhMTAsIDB9LAoteyAiZXh0cnMiLCAgICAgIDB4ZDAwMDFjMDAsIDB4ZmMwMDFjMDAsICI/eGIsUCxULHgiLCBwYTEwLCAwfSwKLXsgImRlcGQiLCAgICAgICAweGQ0MDAwMjAwLCAweGZjMDAxYWUwLCAiY3o/WHgsISwlLGIiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJkZXBkIiwgICAgICAgMHhmMDAwMDAwMCwgMHhmYzAwMDAwMCwgImN6P1h4LH4sfCxiIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZGVwZGkiLCAgICAgIDB4ZDQwMDEyMDAsIDB4ZmMwMDFhZTAsICJjej9YNSwhLCUsYiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImRlcGRpIiwgICAgICAweGY0MDAwMDAwLCAweGZjMDAwMDAwLCAiY3o/WDUsfix8LGIiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJkZXB3IiwgICAgICAgMHhkNDAwMDAwMCwgMHhmYzAwMWJlMCwgImN6P3h4LCEsVCxiIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZGVwdyIsICAgICAgIDB4ZDQwMDA4MDAsIDB4ZmMwMDE4MDAsICJjej94eCxwLFQsYiIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImRlcHdpIiwgICAgICAweGQ0MDAxMDAwLCAweGZjMDAxYmUwLCAiY3o/eDUsISxULGIiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJkZXB3aSIsICAgICAgMHhkNDAwMTgwMCwgMHhmYzAwMTgwMCwgImN6P3g1LHAsVCxiIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAienZkZXAiLCAgICAgIDB4ZDQwMDAwMDAsIDB4ZmMwMDFmZTAsICI/eHgsVCxiIiwgcGExMCwgMH0sCi17ICJ2ZGVwIiwgICAgICAgMHhkNDAwMDQwMCwgMHhmYzAwMWZlMCwgIj94eCxULGIiLCBwYTEwLCAwfSwKLXsgInpkZXAiLCAgICAgICAweGQ0MDAwODAwLCAweGZjMDAxYzAwLCAiP3h4LHAsVCxiIiwgcGExMCwgMH0sCi17ICJkZXAiLCAgICAgICAgMHhkNDAwMGMwMCwgMHhmYzAwMWMwMCwgIj94eCxwLFQsYiIsIHBhMTAsIDB9LAoteyAienZkZXBpIiwgICAgIDB4ZDQwMDEwMDAsIDB4ZmMwMDFmZTAsICI/eDUsVCxiIiwgcGExMCwgMH0sCi17ICJ2ZGVwaSIsICAgICAgMHhkNDAwMTQwMCwgMHhmYzAwMWZlMCwgIj94NSxULGIiLCBwYTEwLCAwfSwKLXsgInpkZXBpIiwgICAgICAweGQ0MDAxODAwLCAweGZjMDAxYzAwLCAiP3g1LHAsVCxiIiwgcGExMCwgMH0sCi17ICJkZXBpIiwgICAgICAgMHhkNDAwMWMwMCwgMHhmYzAwMWMwMCwgIj94NSxwLFQsYiIsIHBhMTAsIDB9LAotCi0vKiBTeXN0ZW0gQ29udHJvbCBJbnN0cnVjdGlvbnMgKi8KLQoteyAiYnJlYWsiLCAgICAgIDB4MDAwMDAwMDAsIDB4ZmMwMDFmZTAsICJyLEEiLCBwYTEwLCAwfSwKLXsgInJmaSIsICAgICAgICAweDAwMDAwYzAwLCAweGZmZmZmZjFmLCAiY3IiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJyZmkiLCAgICAgICAgMHgwMDAwMGMwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTAsIDB9LAoteyAicmZpciIsICAgICAgIDB4MDAwMDBjYTAsIDB4ZmZmZmZmZmYsICIiLCBwYTExLCAwfSwKLXsgInNzbSIsICAgICAgICAweDAwMDAwZDYwLCAweGZjMDBmZmUwLCAiVSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAic3NtIiwgICAgICAgIDB4MDAwMDBkNjAsIDB4ZmZlMGZmZTAsICJSLHQiLCBwYTEwLCAwfSwKLXsgInJzbSIsICAgICAgICAweDAwMDAwZTYwLCAweGZjMDBmZmUwLCAiVSx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAicnNtIiwgICAgICAgIDB4MDAwMDBlNjAsIDB4ZmZlMGZmZTAsICJSLHQiLCBwYTEwLCAwfSwKLXsgIm10c20iLCAgICAgICAweDAwMDAxODYwLCAweGZmZTBmZmZmLCAieCIsIHBhMTAsIDB9LAoteyAibGRzaWQiLCAgICAgIDB4MDAwMDEwYTAsIDB4ZmMxZjNmZTAsICIocyxiKSx0IiwgcGExMCwgMH0sCi17ICJsZHNpZCIsICAgICAgMHgwMDAwMTBhMCwgMHhmYzFmM2ZlMCwgIihiKSx0IiwgcGExMCwgMH0sCi17ICJtdHNwIiwgICAgICAgMHgwMDAwMTgyMCwgMHhmZmUwMWZmZiwgIngsUyIsIHBhMTAsIDB9LAoteyAibXRjdGwiLCAgICAgIDB4MDAwMDE4NDAsIDB4ZmMwMGZmZmYsICJ4LF4iLCBwYTEwLCAwfSwKLXsgIm10c2FyY20iLCAgICAweDAxNjAxOEMwLCAweGZmZTBmZmZmLCAieCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgIm1maWEiLCAgICAgICAweDAwMDAxNEEwLCAweGZmZmZmZmUwLCAidCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgIm1mc3AiLCAgICAgICAweDAwMDAwNGEwLCAweGZmZmYxZmUwLCAiUyx0IiwgcGExMCwgMH0sCi17ICJtZmN0bCIsICAgICAgMHgwMTYwNDhhMCwgMHhmZmZmZmZlMCwgImNXISx0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAibWZjdGwiLCAgICAgIDB4MDAwMDA4YTAsIDB4ZmMxZmZmZTAsICJeLHQiLCBwYTEwLCAwfSwKLXsgInN5bmMiLCAgICAgICAweDAwMDAwNDAwLCAweGZmZmZmZmZmLCAiIiwgcGExMCwgMH0sCi17ICJzeW5jZG1hIiwgICAgMHgwMDEwMDQwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTAsIDB9LAoteyAicHJvYmUiLCAgICAgIDB4MDQwMDExODAsIDB4ZmMwMDNmYTAsICJjdyhzLGIpLHgsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInByb2JlIiwgICAgICAweDA0MDAxMTgwLCAweGZjMDAzZmEwLCAiY3coYikseCx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAicHJvYmVpIiwgICAgIDB4MDQwMDMxODAsIDB4ZmMwMDNmYTAsICJjdyhzLGIpLFIsdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgInByb2JlaSIsICAgICAweDA0MDAzMTgwLCAweGZjMDAzZmEwLCAiY3coYiksUix0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAicHJvYmVyIiwgICAgIDB4MDQwMDExODAsIDB4ZmMwMDNmZTAsICIocyxiKSx4LHQiLCBwYTEwLCAwfSwKLXsgInByb2JlciIsICAgICAweDA0MDAxMTgwLCAweGZjMDAzZmUwLCAiKGIpLHgsdCIsIHBhMTAsIDB9LAoteyAicHJvYmVyaSIsICAgIDB4MDQwMDMxODAsIDB4ZmMwMDNmZTAsICIocyxiKSxSLHQiLCBwYTEwLCAwfSwKLXsgInByb2JlcmkiLCAgICAweDA0MDAzMTgwLCAweGZjMDAzZmUwLCAiKGIpLFIsdCIsIHBhMTAsIDB9LAoteyAicHJvYmV3IiwgICAgIDB4MDQwMDExYzAsIDB4ZmMwMDNmZTAsICIocyxiKSx4LHQiLCBwYTEwLCAwfSwKLXsgInByb2JldyIsICAgICAweDA0MDAxMWMwLCAweGZjMDAzZmUwLCAiKGIpLHgsdCIsIHBhMTAsIDB9LAoteyAicHJvYmV3aSIsICAgIDB4MDQwMDMxYzAsIDB4ZmMwMDNmZTAsICIocyxiKSxSLHQiLCBwYTEwLCAwfSwKLXsgInByb2Jld2kiLCAgICAweDA0MDAzMWMwLCAweGZjMDAzZmUwLCAiKGIpLFIsdCIsIHBhMTAsIDB9LAoteyAibHBhIiwgICAgICAgIDB4MDQwMDEzNDAsIDB4ZmMwMDNmYzAsICJjWngocyxiKSx0IiwgcGExMCwgMH0sCi17ICJscGEiLCAgICAgICAgMHgwNDAwMTM0MCwgMHhmYzAwM2ZjMCwgImNaeChiKSx0IiwgcGExMCwgMH0sCi17ICJsaGEiLCAgICAgICAgMHgwNDAwMTMwMCwgMHhmYzAwM2ZjMCwgImNaeChzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxoYSIsICAgICAgICAweDA0MDAxMzAwLCAweGZjMDAzZmMwLCAiY1p4KGIpLHQiLCBwYTEwLCAwfSwKLXsgImxjaSIsICAgICAgICAweDA0MDAxMzAwLCAweGZjMDAzZmUwLCAieChzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImxjaSIsICAgICAgICAweDA0MDAxMzAwLCAweGZjMDAzZmUwLCAieChiKSx0IiwgcGExMCwgMH0sCi17ICJwZHRsYiIsICAgICAgMHgwNDAwMTYwMCwgMHhmYzAwM2ZkZiwgImNMY1p4KHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJwZHRsYiIsICAgICAgMHgwNDAwMTYwMCwgMHhmYzAwM2ZkZiwgImNMY1p4KGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAicGR0bGIiLCAgICAgIDB4MDQwMDEyMDAsIDB4ZmMwMDNmZGYsICJjWngocyxiKSIsIHBhMTAsIDB9LAoteyAicGR0bGIiLCAgICAgIDB4MDQwMDEyMDAsIDB4ZmMwMDNmZGYsICJjWngoYikiLCBwYTEwLCAwfSwKLXsgInBpdGxiIiwgICAgICAweDA0MDAwNjAwLCAweGZjMDAxZmRmLCAiY0xjWngoUyxiKSIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgInBpdGxiIiwgICAgICAweDA0MDAwNjAwLCAweGZjMDAxZmRmLCAiY0xjWngoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJwaXRsYiIsICAgICAgMHgwNDAwMDIwMCwgMHhmYzAwMWZkZiwgImNaeChTLGIpIiwgcGExMCwgMH0sCi17ICJwaXRsYiIsICAgICAgMHgwNDAwMDIwMCwgMHhmYzAwMWZkZiwgImNaeChiKSIsIHBhMTAsIDB9LAoteyAicGR0bGJlIiwgICAgIDB4MDQwMDEyNDAsIDB4ZmMwMDNmZGYsICJjWngocyxiKSIsIHBhMTAsIDB9LAoteyAicGR0bGJlIiwgICAgIDB4MDQwMDEyNDAsIDB4ZmMwMDNmZGYsICJjWngoYikiLCBwYTEwLCAwfSwKLXsgInBpdGxiZSIsICAgICAweDA0MDAwMjQwLCAweGZjMDAxZmRmLCAiY1p4KFMsYikiLCBwYTEwLCAwfSwKLXsgInBpdGxiZSIsICAgICAweDA0MDAwMjQwLCAweGZjMDAxZmRmLCAiY1p4KGIpIiwgcGExMCwgMH0sCi17ICJpZHRsYmEiLCAgICAgMHgwNDAwMTA0MCwgMHhmYzAwM2ZmZiwgIngsKHMsYikiLCBwYTEwLCAwfSwKLXsgImlkdGxiYSIsICAgICAweDA0MDAxMDQwLCAweGZjMDAzZmZmLCAieCwoYikiLCBwYTEwLCAwfSwKLXsgImlpdGxiYSIsICAgICAweDA0MDAwMDQwLCAweGZjMDAxZmZmLCAieCwoUyxiKSIsIHBhMTAsIDB9LAoteyAiaWl0bGJhIiwgICAgIDB4MDQwMDAwNDAsIDB4ZmMwMDFmZmYsICJ4LChiKSIsIHBhMTAsIDB9LAoteyAiaWR0bGJwIiwgICAgIDB4MDQwMDEwMDAsIDB4ZmMwMDNmZmYsICJ4LChzLGIpIiwgcGExMCwgMH0sCi17ICJpZHRsYnAiLCAgICAgMHgwNDAwMTAwMCwgMHhmYzAwM2ZmZiwgIngsKGIpIiwgcGExMCwgMH0sCi17ICJpaXRsYnAiLCAgICAgMHgwNDAwMDAwMCwgMHhmYzAwMWZmZiwgIngsKFMsYikiLCBwYTEwLCAwfSwKLXsgImlpdGxicCIsICAgICAweDA0MDAwMDAwLCAweGZjMDAxZmZmLCAieCwoYikiLCBwYTEwLCAwfSwKLXsgInBkYyIsICAgICAgICAweDA0MDAxMzgwLCAweGZjMDAzZmRmLCAiY1p4KHMsYikiLCBwYTEwLCAwfSwKLXsgInBkYyIsICAgICAgICAweDA0MDAxMzgwLCAweGZjMDAzZmRmLCAiY1p4KGIpIiwgcGExMCwgMH0sCi17ICJmZGMiLCAgICAgICAgMHgwNDAwMTI4MCwgMHhmYzAwM2ZkZiwgImNaeChzLGIpIiwgcGExMCwgMH0sCi17ICJmZGMiLCAgICAgICAgMHgwNDAwMTI4MCwgMHhmYzAwM2ZkZiwgImNaeChiKSIsIHBhMTAsIDB9LAoteyAiZmljIiwgICAgICAgIDB4MDQwMDAyODAsIDB4ZmMwMDFmZGYsICJjWngoUyxiKSIsIHBhMTAsIDB9LAoteyAiZmljIiwgICAgICAgIDB4MDQwMDAyODAsIDB4ZmMwMDFmZGYsICJjWngoYikiLCBwYTEwLCAwfSwKLXsgImZkY2UiLCAgICAgICAweDA0MDAxMmMwLCAweGZjMDAzZmRmLCAiY1p4KHMsYikiLCBwYTEwLCAwfSwKLXsgImZkY2UiLCAgICAgICAweDA0MDAxMmMwLCAweGZjMDAzZmRmLCAiY1p4KGIpIiwgcGExMCwgMH0sCi17ICJmaWNlIiwgICAgICAgMHgwNDAwMDJjMCwgMHhmYzAwMWZkZiwgImNaeChTLGIpIiwgcGExMCwgMH0sCi17ICJmaWNlIiwgICAgICAgMHgwNDAwMDJjMCwgMHhmYzAwMWZkZiwgImNaeChiKSIsIHBhMTAsIDB9LAoteyAiZGlhZyIsICAgICAgIDB4MTQwMDAwMDAsIDB4ZmMwMDAwMDAsICJEIiwgcGExMCwgMH0sCi17ICJpZHRsYnQiLCAgICAgMHgwNDAwMTgwMCwgMHhmYzAwZmZmZiwgIngsYiIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImlpdGxidCIsICAgICAweDA0MDAwODAwLCAweGZjMDBmZmZmLCAieCxiIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAotCi0vKiBUaGVzZSBtYXkgYmUgc3BlY2lmaWMgdG8gY2VydGFpbiB2ZXJzaW9ucyBvZiB0aGUgUEEuICBKb2VsIGNsYWltZWQKLSAgIHRoZXkgd2VyZSA3MjAwMCAoNzIwMD8pIHNwZWNpZmljLiAgSG93ZXZlciwgSSdtIGFsbW9zdCBjZXJ0YWluIHRoZQotICAgbXRjcHUvbWZjcHUgd2VyZSB1bmRvY3VtZW50ZWQsIGJ1dCBhdmFpbGFibGUgaW4gdGhlIG9sZGVyIDcwMCBtYWNoaW5lcy4gICovCi17ICJtdGNwdSIsICAgICAgMHgxNDAwMTYwMCwgMHhmYzAwZmZmZiwgIngsXiIsIHBhMTAsIDB9LAoteyAibWZjcHUiLCAgICAgIDB4MTQwMDFBMDAsIDB4ZmMwMGZmZmYsICJeLHgiLCBwYTEwLCAwfSwKLXsgInRvY2VuIiwgICAgICAweDE0NDAzNjAwLCAweGZmZmZmZmZmLCAiIiwgcGExMCwgMH0sCi17ICJ0b2NkaXMiLCAgICAgMHgxNDQwMTYyMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTAsIDB9LAoteyAic2hkd2dyIiwgICAgIDB4MTQ0MDI2MDAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwLCAwfSwKLXsgImdyc2hkdyIsICAgICAweDE0NDAwNjIwLCAweGZmZmZmZmZmLCAiIiwgcGExMCwgMH0sCi0KLS8qIGdmdyBhbmQgZ2ZyIGFyZSBub3QgaW4gdGhlIEhQIFBBIDEuMSBtYW51YWwsIGJ1dCB0aGV5IGFyZSBpbiBlaXRoZXIKLSAgIHRoZSBUaW1leCBGUFUgb3IgdGhlIE11c3RhbmcgRVJTIChub3Qgc3VyZSB3aGljaCkgbWFudWFsLiAgKi8KLXsgImdmdyIsCTB4MDQwMDE2ODAsIDB4ZmMwMDNmZGYsICJjWngocyxiKSIsIHBhMTEsIDB9LAoteyAiZ2Z3IiwJMHgwNDAwMTY4MCwgMHhmYzAwM2ZkZiwgImNaeChiKSIsIHBhMTEsIDB9LAoteyAiZ2ZyIiwJMHgwNDAwMWE4MCwgMHhmYzAwM2ZkZiwgImNaeChzLGIpIiwgcGExMSwgMH0sCi17ICJnZnIiLAkweDA0MDAxYTgwLCAweGZjMDAzZmRmLCAiY1p4KGIpIiwgcGExMSwgMH0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IENvcHJvY2Vzc29yIEluc3RydWN0aW9ucyAqLwotIAoteyAiZmxkdyIsICAgICAgIDB4MjQwMDEwMjAsIDB4ZmMxZjMzYTAsICJjb2NjQChzLGIpLGZUIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4MjQwMDEwMjAsIDB4ZmMxZjMzYTAsICJjb2NjQChiKSxmVCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZHciLCAgICAgICAweDI0MDAwMDAwLCAweGZjMDAxMzgwLCAiY3hjY3gocyxiKSxmVCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZHciLCAgICAgICAweDI0MDAwMDAwLCAweGZjMDAxMzgwLCAiY3hjY3goYiksZlQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmbGR3IiwgICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMTM4MCwgImNtY2M1KHMsYiksZlQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmbGR3IiwgICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMTM4MCwgImNtY2M1KGIpLGZUIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4NWMwMDAwMDAsIDB4ZmMwMDAwMDQsICJkKHMsYiksZmUiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbGR3IiwgICAgICAgMHg1YzAwMDAwMCwgMHhmYzAwMDAwNCwgImQoYiksZmUiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbGR3IiwgICAgICAgMHg1ODAwMDAwMCwgMHhmYzAwMDAwNCwgImNKZChzLGIpLGZlIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkdyIsICAgICAgIDB4NTgwMDAwMDAsIDB4ZmMwMDAwMDQsICJjSmQoYiksZmUiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbGRkIiwgICAgICAgMHgyYzAwMTAyMCwgMHhmYzFmMzNlMCwgImNvY2NAKHMsYiksZnQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbGRkIiwgICAgICAgMHgyYzAwMTAyMCwgMHhmYzFmMzNlMCwgImNvY2NAKGIpLGZ0IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkZCIsICAgICAgIDB4MmMwMDAwMDAsIDB4ZmMwMDEzYzAsICJjeGNjeChzLGIpLGZ0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkZCIsICAgICAgIDB4MmMwMDAwMDAsIDB4ZmMwMDEzYzAsICJjeGNjeChiKSxmdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZGQiLCAgICAgICAweDJjMDAxMDAwLCAweGZjMDAxM2MwLCAiY21jYzUocyxiKSxmdCIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZsZGQiLCAgICAgICAweDJjMDAxMDAwLCAweGZjMDAxM2MwLCAiY21jYzUoYiksZnQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmbGRkIiwgICAgICAgMHg1MDAwMDAwMiwgMHhmYzAwMDAwMiwgImNxIyhzLGIpLHgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbGRkIiwgICAgICAgMHg1MDAwMDAwMiwgMHhmYzAwMDAwMiwgImNxIyhiKSx4IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0dyIsICAgICAgIDB4MjQwMDEyMjAsIDB4ZmMxZjMzYTAsICJjb2NDZlQsQChzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0dyIsICAgICAgIDB4MjQwMDEyMjAsIDB4ZmMxZjMzYTAsICJjb2NDZlQsQChiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdHciLCAgICAgICAweDI0MDAwMjAwLCAweGZjMDAxMzgwLCAiY3hjQ2ZULHgocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdHciLCAgICAgICAweDI0MDAwMjAwLCAweGZjMDAxMzgwLCAiY3hjQ2ZULHgoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMTM4MCwgImNtY0NmVCw1KHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMTM4MCwgImNtY0NmVCw1KGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0dyIsICAgICAgIDB4N2MwMDAwMDAsIDB4ZmMwMDAwMDQsICJmZSxkKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHg3YzAwMDAwMCwgMHhmYzAwMDAwNCwgImZlLGQoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmc3R3IiwgICAgICAgMHg3ODAwMDAwMCwgMHhmYzAwMDAwNCwgImNKZmUsZChzLGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0dyIsICAgICAgIDB4NzgwMDAwMDAsIDB4ZmMwMDAwMDQsICJjSmZlLGQoYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmc3RkIiwgICAgICAgMHgyYzAwMTIyMCwgMHhmYzFmMzNlMCwgImNvY0NmdCxAKHMsYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3RkIiwgICAgICAgMHgyYzAwMTIyMCwgMHhmYzFmMzNlMCwgImNvY0NmdCxAKGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0ZCIsICAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDEzYzAsICJjeGNDZnQseChzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiZnN0ZCIsICAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDEzYzAsICJjeGNDZnQseChiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdGQiLCAgICAgICAweDJjMDAxMjAwLCAweGZjMDAxM2MwLCAiY21jQ2Z0LDUocyxiKSIsIHBhMTAsIEZMQUdfU1RSSUNUfSwKLXsgImZzdGQiLCAgICAgICAweDJjMDAxMjAwLCAweGZjMDAxM2MwLCAiY21jQ2Z0LDUoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJmc3RkIiwgICAgICAgMHg3MDAwMDAwMiwgMHhmYzAwMDAwMiwgImNxeCwjKHMsYikiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmc3RkIiwgICAgICAgMHg3MDAwMDAwMiwgMHhmYzAwMDAwMiwgImNxeCwjKGIpIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZmxkd3giLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDFmODAsICJjeHgocyxiKSxmVCIsIHBhMTAsIDB9LAoteyAiZmxkd3giLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDFmODAsICJjeHgoYiksZlQiLCBwYTEwLCAwfSwKLXsgImZsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3h4KHMsYiksZnQiLCBwYTEwLCAwfSwKLXsgImZsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3h4KGIpLGZ0IiwgcGExMCwgMH0sCi17ICJmc3R3eCIsICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMWY4MCwgImN4ZlQseChzLGIpIiwgcGExMCwgMH0sCi17ICJmc3R3eCIsICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMWY4MCwgImN4ZlQseChiKSIsIHBhMTAsIDB9LAoteyAiZnN0ZHgiLCAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDFmYzAsICJjeGZ0LHgocyxiKSIsIHBhMTAsIDB9LAoteyAiZnN0ZHgiLCAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDFmYzAsICJjeGZ0LHgoYikiLCBwYTEwLCAwfSwKLXsgImZzdHF4IiwgICAgICAweDNjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3hmdCx4KHMsYikiLCBwYTEwLCAwfSwKLXsgImZzdHF4IiwgICAgICAweDNjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3hmdCx4KGIpIiwgcGExMCwgMH0sCi17ICJmbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWY4MCwgImNtNShzLGIpLGZUIiwgcGExMCwgMH0sCi17ICJmbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWY4MCwgImNtNShiKSxmVCIsIHBhMTAsIDB9LAoteyAiZmxkZHMiLCAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFmYzAsICJjbTUocyxiKSxmdCIsIHBhMTAsIDB9LAoteyAiZmxkZHMiLCAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFmYzAsICJjbTUoYiksZnQiLCBwYTEwLCAwfSwKLXsgImZzdHdzIiwgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZjgwLCAiY21mVCw1KHMsYikiLCBwYTEwLCAwfSwKLXsgImZzdHdzIiwgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZjgwLCAiY21mVCw1KGIpIiwgcGExMCwgMH0sCi17ICJmc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWZjMCwgImNtZnQsNShzLGIpIiwgcGExMCwgMH0sCi17ICJmc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWZjMCwgImNtZnQsNShiKSIsIHBhMTAsIDB9LAoteyAiZnN0cXMiLCAgICAgIDB4M2MwMDEyMDAsIDB4ZmMwMDFmYzAsICJjbWZ0LDUocyxiKSIsIHBhMTAsIDB9LAoteyAiZnN0cXMiLCAgICAgIDB4M2MwMDEyMDAsIDB4ZmMwMDFmYzAsICJjbWZ0LDUoYikiLCBwYTEwLCAwfSwKLXsgImZhZGQiLCAgICAgICAweDMwMDAwNjAwLCAweGZjMDBlN2UwLCAiRmZhLGZiLGZUIiwgcGExMCwgMH0sCi17ICJmYWRkIiwgICAgICAgMHgzODAwMDYwMCwgMHhmYzAwZTcyMCwgIklmQSxmQixmVCIsIHBhMTAsIDB9LAoteyAiZnN1YiIsICAgICAgIDB4MzAwMDI2MDAsIDB4ZmMwMGU3ZTAsICJGZmEsZmIsZlQiLCBwYTEwLCAwfSwKLXsgImZzdWIiLCAgICAgICAweDM4MDAyNjAwLCAweGZjMDBlNzIwLCAiSWZBLGZCLGZUIiwgcGExMCwgMH0sCi17ICJmbXB5IiwgICAgICAgMHgzMDAwNDYwMCwgMHhmYzAwZTdlMCwgIkZmYSxmYixmVCIsIHBhMTAsIDB9LAoteyAiZm1weSIsICAgICAgIDB4MzgwMDQ2MDAsIDB4ZmMwMGU3MjAsICJJZkEsZkIsZlQiLCBwYTEwLCAwfSwKLXsgImZkaXYiLCAgICAgICAweDMwMDA2NjAwLCAweGZjMDBlN2UwLCAiRmZhLGZiLGZUIiwgcGExMCwgMH0sCi17ICJmZGl2IiwgICAgICAgMHgzODAwNjYwMCwgMHhmYzAwZTcyMCwgIklmQSxmQixmVCIsIHBhMTAsIDB9LAoteyAiZnNxcnQiLCAgICAgIDB4MzAwMDgwMDAsIDB4ZmMxZmU3ZTAsICJGZmEsZlQiLCBwYTEwLCAwfSwKLXsgImZzcXJ0IiwgICAgICAweDM4MDA4MDAwLCAweGZjMWZlNzIwLCAiRmZBLGZUIiwgcGExMCwgMH0sCi17ICJmYWJzIiwgICAgICAgMHgzMDAwNjAwMCwgMHhmYzFmZTdlMCwgIkZmYSxmVCIsIHBhMTAsIDB9LAoteyAiZmFicyIsICAgICAgIDB4MzgwMDYwMDAsIDB4ZmMxZmU3MjAsICJGZkEsZlQiLCBwYTEwLCAwfSwKLXsgImZyZW0iLCAgICAgICAweDMwMDA4NjAwLCAweGZjMDBlN2UwLCAiRmZhLGZiLGZUIiwgcGExMCwgMH0sCi17ICJmcmVtIiwgICAgICAgMHgzODAwODYwMCwgMHhmYzAwZTcyMCwgIkZmQSxmQixmVCIsIHBhMTAsIDB9LAoteyAiZnJuZCIsICAgICAgIDB4MzAwMGEwMDAsIDB4ZmMxZmU3ZTAsICJGZmEsZlQiLCBwYTEwLCAwfSwKLXsgImZybmQiLCAgICAgICAweDM4MDBhMDAwLCAweGZjMWZlNzIwLCAiRmZBLGZUIiwgcGExMCwgMH0sCi17ICJmY3B5IiwgICAgICAgMHgzMDAwNDAwMCwgMHhmYzFmZTdlMCwgIkZmYSxmVCIsIHBhMTAsIDB9LAoteyAiZmNweSIsICAgICAgIDB4MzgwMDQwMDAsIDB4ZmMxZmU3MjAsICJGZkEsZlQiLCBwYTEwLCAwfSwKLXsgImZjbnZmZiIsICAgICAweDMwMDAwMjAwLCAweGZjMWY4N2UwLCAiRkdmYSxmVCIsIHBhMTAsIDB9LAoteyAiZmNudmZmIiwgICAgIDB4MzgwMDAyMDAsIDB4ZmMxZjg3MjAsICJGR2ZBLGZUIiwgcGExMCwgMH0sCi17ICJmY252eGYiLCAgICAgMHgzMDAwODIwMCwgMHhmYzFmODdlMCwgIkZHZmEsZlQiLCBwYTEwLCAwfSwKLXsgImZjbnZ4ZiIsICAgICAweDM4MDA4MjAwLCAweGZjMWY4NzIwLCAiRkdmQSxmVCIsIHBhMTAsIDB9LAoteyAiZmNudmZ4IiwgICAgIDB4MzAwMTAyMDAsIDB4ZmMxZjg3ZTAsICJGR2ZhLGZUIiwgcGExMCwgMH0sCi17ICJmY252ZngiLCAgICAgMHgzODAxMDIwMCwgMHhmYzFmODcyMCwgIkZHZkEsZlQiLCBwYTEwLCAwfSwKLXsgImZjbnZmeHQiLCAgICAweDMwMDE4MjAwLCAweGZjMWY4N2UwLCAiRkdmYSxmVCIsIHBhMTAsIDB9LAoteyAiZmNudmZ4dCIsICAgIDB4MzgwMTgyMDAsIDB4ZmMxZjg3MjAsICJGR2ZBLGZUIiwgcGExMCwgMH0sCi17ICJmbXB5ZmFkZCIsICAgMHhiODAwMDAwMCwgMHhmYzAwMDAyMCwgIklmQSxmQixmQyxmVCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZtcHluZmFkZCIsICAweGI4MDAwMDIwLCAweGZjMDAwMDIwLCAiSWZBLGZCLGZDLGZUIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZm5lZyIsICAgICAgIDB4MzAwMGMwMDAsIDB4ZmMxZmU3ZTAsICJGZmEsZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmbmVnIiwgICAgICAgMHgzODAwYzAwMCwgMHhmYzFmZTcyMCwgIklmQSxmVCIsIHBhMjAsIEZMQUdfU1RSSUNUfSwKLXsgImZuZWdhYnMiLCAgICAweDMwMDBlMDAwLCAweGZjMWZlN2UwLCAiRmZhLGZUIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZm5lZ2FicyIsICAgIDB4MzgwMGUwMDAsIDB4ZmMxZmU3MjAsICJJZkEsZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmY252IiwgICAgICAgMHgzMDAwMDIwMCwgMHhmYzFjMDcyMCwgIntfZmEsZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmY252IiwgICAgICAgMHgzODAwMDIwMCwgMHhmYzFjMDcyMCwgIkZHZkEsZlQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmY21wIiwgICAgICAgMHgzMDAwMDQwMCwgMHhmYzAwMDdlMCwgIkY/ZmZhLGZiLGgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmY21wIiwgICAgICAgMHgzODAwMDQwMCwgMHhmYzAwMDcyMCwgIkk/ZmZBLGZCLGgiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJmY21wIiwgICAgICAgMHgzMDAwMDQwMCwgMHhmYzAwZTdlMCwgIkY/ZmZhLGZiIiwgcGExMCwgMH0sCi17ICJmY21wIiwgICAgICAgMHgzODAwMDQwMCwgMHhmYzAwZTcyMCwgIkk/ZmZBLGZCIiwgcGExMCwgMH0sCi17ICJ4bXB5dSIsCTB4MzgwMDQ3MDAsIDB4ZmMwMGU3MjAsICJmWCxmQixmVCIsIHBhMTEsIDB9LAoteyAiZm1weWFkZCIsCTB4MTgwMDAwMDAsIDB4ZmMwMDAwMDAsICJIZmksZmosZmssZmwsZm0iLCBwYTExLCAwfSwKLXsgImZtcHlzdWIiLAkweDk4MDAwMDAwLCAweGZjMDAwMDAwLCAiSGZpLGZqLGZrLGZsLGZtIiwgcGExMSwgMH0sCi17ICJmdGVzdCIsICAgICAgMHgzMDAwMjQyMCwgMHhmZmZmZmZlMCwgIiw9IiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZnRlc3QiLCAgICAgIDB4MzAwMDA0MjAsIDB4ZmZmZjFmZmYsICJtIiwgcGEyMCwgRkxBR19TVFJJQ1R9LAoteyAiZnRlc3QiLCAgICAgIDB4MzAwMDI0MjAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwLCAwfSwKLXsgImZpZCIsICAgICAgICAweDMwMDAwMDAwLCAweGZmZmZmZmZmLCAiIiwgcGExMSwgMH0sCi0KLS8qIFBlcmZvcm1hbmNlIE1vbml0b3IgSW5zdHJ1Y3Rpb25zICovCi0KLXsgInBtZGlzIiwJMHgzMDAwMDI4MCwgMHhmZmZmZmZkZiwgIk4iLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJwbWVuYiIsCTB4MzAwMDA2ODAsIDB4ZmZmZmZmZmYsICIiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi0KLS8qIEFzc2lzdCBJbnN0cnVjdGlvbnMgKi8KLQoteyAic3BvcDAiLCAgICAgIDB4MTAwMDAwMDAsIDB4ZmMwMDA2MDAsICJ2LE9OIiwgcGExMCwgMH0sCi17ICJzcG9wMSIsICAgICAgMHgxMDAwMDIwMCwgMHhmYzAwMDYwMCwgInYsb050IiwgcGExMCwgMH0sCi17ICJzcG9wMiIsICAgICAgMHgxMDAwMDQwMCwgMHhmYzAwMDYwMCwgInYsMU5iIiwgcGExMCwgMH0sCi17ICJzcG9wMyIsICAgICAgMHgxMDAwMDYwMCwgMHhmYzAwMDYwMCwgInYsME54LGIiLCBwYTEwLCAwfSwKLXsgImNvcHIiLCAgICAgICAweDMwMDAwMDAwLCAweGZjMDAwMDAwLCAidSwyTiIsIHBhMTAsIDB9LAoteyAiY2xkd3giLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3h4KHMsYiksdCIsIHBhMTAsIDB9LAoteyAiY2xkd3giLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3h4KGIpLHQiLCBwYTEwLCAwfSwKLXsgImNsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZTAwLCAidWN4eChzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImNsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZTAwLCAidWN4eChiKSx0IiwgcGExMCwgMH0sCi17ICJjc3R3eCIsICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMWUwMCwgInVjeHQseChzLGIpIiwgcGExMCwgMH0sCi17ICJjc3R3eCIsICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMWUwMCwgInVjeHQseChiKSIsIHBhMTAsIDB9LAoteyAiY3N0ZHgiLCAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3h0LHgocyxiKSIsIHBhMTAsIDB9LAoteyAiY3N0ZHgiLCAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3h0LHgoYikiLCBwYTEwLCAwfSwKLXsgImNsZHdzIiwgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZTAwLCAidWNtNShzLGIpLHQiLCBwYTEwLCAwfSwKLXsgImNsZHdzIiwgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZTAwLCAidWNtNShiKSx0IiwgcGExMCwgMH0sCi17ICJjbGRkcyIsICAgICAgMHgyYzAwMTAwMCwgMHhmYzAwMWUwMCwgInVjbTUocyxiKSx0IiwgcGExMCwgMH0sCi17ICJjbGRkcyIsICAgICAgMHgyYzAwMTAwMCwgMHhmYzAwMWUwMCwgInVjbTUoYiksdCIsIHBhMTAsIDB9LAoteyAiY3N0d3MiLCAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Y210LDUocyxiKSIsIHBhMTAsIDB9LAoteyAiY3N0d3MiLCAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Y210LDUoYikiLCBwYTEwLCAwfSwKLXsgImNzdGRzIiwgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZTAwLCAidWNtdCw1KHMsYikiLCBwYTEwLCAwfSwKLXsgImNzdGRzIiwgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZTAwLCAidWNtdCw1KGIpIiwgcGExMCwgMH0sCi17ICJjbGR3IiwgICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeHgocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY2xkdyIsICAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3h4KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjbGR3IiwgICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWUwMCwgInVjbTUocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY2xkdyIsICAgICAgIDB4MjQwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1Y201KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjbGRkIiwgICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeHgocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY2xkZCIsICAgICAgIDB4MmMwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3h4KGIpLHQiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjbGRkIiwgICAgICAgMHgyYzAwMTAwMCwgMHhmYzAwMWUwMCwgInVjbTUocyxiKSx0IiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY2xkZCIsICAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1Y201KGIpLHQiLCBwYTIwLCBGTEFHX1NUUklDVH0sCi17ICJjc3R3IiwgICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMWUwMCwgInVjeHQseChzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY3N0dyIsICAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3h0LHgoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjc3R3IiwgICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMWUwMCwgInVjbXQsNShzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY3N0dyIsICAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Y210LDUoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjc3RkIiwgICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMWUwMCwgInVjeHQseChzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY3N0ZCIsICAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3h0LHgoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi17ICJjc3RkIiwgICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWUwMCwgInVjbXQsNShzLGIpIiwgcGExMCwgRkxBR19TVFJJQ1R9LAoteyAiY3N0ZCIsICAgICAgIDB4MmMwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Y210LDUoYikiLCBwYTEwLCBGTEFHX1NUUklDVH0sCi19OwotCi0jZGVmaW5lIE5VTU9QQ09ERVMgKChzaXplb2YgcGFfb3Bjb2RlcykvKHNpemVvZiBwYV9vcGNvZGVzWzBdKSkKLQotLyogU0tWIDEyLzE4LzkyLiBBZGRlZCBzb21lIGRlbm90YXRpb25zIGZvciB2YXJpb3VzIG9wZXJhbmRzLiAqLwotCi0jZGVmaW5lIFBBX0lNTTExX0FUXzMxICdpJwotI2RlZmluZSBQQV9JTU0xNF9BVF8zMSAnaicKLSNkZWZpbmUgUEFfSU1NMjFfQVRfMzEgJ2snCi0jZGVmaW5lIFBBX0RJU1AxMiAndycKLSNkZWZpbmUgUEFfRElTUDE3ICdXJwotCi0jZGVmaW5lIE5fSFBQQV9PUEVSQU5EX0ZPUk1BVFMgNQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaTM4Ni5oIGIvaW5jbHVkZS9vcGNvZGUvaTM4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTNhNTY0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2kzODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNzUgKzAsMCBAQAotLyogb3Bjb2RlL2kzODYuaCAtLSBJbnRlbCA4MDM4NiBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLCBhbmQgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGUgVW5peFdhcmUgYXNzZW1ibGVyLCBhbmQgcHJvYmFibHkgb3RoZXIgQVQmVCBkZXJpdmVkIGl4ODYgVW5peAotICAgYXNzZW1ibGVycywgZ2VuZXJhdGUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIHdpdGggcmV2ZXJzZWQKLSAgIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcmVnaXN0ZXJzIGluIGNlcnRhaW4gY2FzZXMuICBVbmZvcnR1bmF0ZWx5LAotICAgZ2NjIGFuZCBwb3NzaWJseSBtYW55IG90aGVyIHByb2dyYW1zIHVzZSB0aGlzIHJldmVyc2VkIHN5bnRheCwgc28KLSAgIHdlJ3JlIHN0dWNrIHdpdGggaXQuCi0KLSAgIGVnLiBgZnN1YiAlc3QoMyksJXN0JyByZXN1bHRzIGluIHN0IDwtIHN0IC0gc3QoMykgYXMgZXhwZWN0ZWQsIGJ1dAotICAgYGZzdWIgJXN0LCVzdCgzKScgcmVzdWx0cyBpbiBzdCgzKSA8LSBzdCAtIHN0KDMpLCByYXRoZXIgdGhhbgotICAgdGhlIGV4cGVjdGVkIHN0KDMpIDwtIHN0KDMpIC0gc3QgIQotCi0gICBUaGlzIGhhcHBlbnMgd2l0aCBhbGwgdGhlIG5vbi1jb21tdXRhdGl2ZSBhcml0aG1ldGljIGZsb2F0aW5nIHBvaW50Ci0gICBvcGVyYXRpb25zIHdpdGggdHdvIHJlZ2lzdGVyIG9wZXJhbmRzLCB3aGVyZSB0aGUgc291cmNlIHJlZ2lzdGVyIGlzCi0gICAlc3QsIGFuZCBkZXN0aW5hdGlvbiByZWdpc3RlciBpcyAlc3QoaSkuICBMb29rIGZvciBGbG9hdERSIGJlbG93LiAgKi8KLQotI2lmbmRlZiBVTklYV0FSRV9DT01QQVQKLS8qIFNldCBub24temVybyBmb3IgYnJva2VuLCBjb21wYXRpYmxlIGluc3RydWN0aW9ucy4gIFNldCB0byB6ZXJvIGZvcgotICAgbm9uLWJyb2tlbiBvcGNvZGVzIGF0IHlvdXIgcGVyaWwuICBnY2MgZ2VuZXJhdGVzIFVuaXhXYXJlCi0gICBjb21wYXRpYmxlIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIFVOSVhXQVJFX0NPTVBBVCAxCi0jZW5kaWYKLQotCi1zdGF0aWMgY29uc3QgdGVtcGxhdGUgaTM4Nl9vcHRhYltdID0gewotCi0jZGVmaW5lIFggTm9uZQotI2RlZmluZSBOb1N1ZiAoTm9fYlN1ZnxOb193U3VmfE5vX2xTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIGJfU3VmIChOb193U3VmfE5vX2xTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIHdfU3VmIChOb19iU3VmfE5vX2xTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIGxfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIGRfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fc1N1ZnxOb19sU3VmfE5vX3hTdWYpCi0jZGVmaW5lIHhfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fc1N1ZnxOb19sU3VmfE5vX2RTdWYpCi0jZGVmaW5lIGJ3X1N1ZiAoTm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgYmxfU3VmIChOb193U3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSB3bF9TdWYgKE5vX2JTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIHNsX1N1ZiAoTm9fYlN1ZnxOb193U3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgc2xkX1N1ZiAoTm9fYlN1ZnxOb193U3VmfE5vX3hTdWYpCi0jZGVmaW5lIHNsZHhfU3VmIChOb19iU3VmfE5vX3dTdWYpCi0jZGVmaW5lIGJ3bF9TdWYgKE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBid2xkX1N1ZiAoTm9fc1N1ZnxOb194U3VmKQotI2RlZmluZSBGUCAoTm9TdWZ8SWdub3JlU2l6ZSkKLSNkZWZpbmUgbF9GUCAobF9TdWZ8SWdub3JlU2l6ZSkKLSNkZWZpbmUgZF9GUCAoZF9TdWZ8SWdub3JlU2l6ZSkKLSNkZWZpbmUgeF9GUCAoeF9TdWZ8SWdub3JlU2l6ZSkKLSNkZWZpbmUgc2xfRlAgKHNsX1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSBzbGRfRlAgKHNsZF9TdWZ8SWdub3JlU2l6ZSkKLSNkZWZpbmUgc2xkeF9GUCAoc2xkeF9TdWZ8SWdub3JlU2l6ZSkKLSNpZiBVTklYV0FSRV9DT01QQVQKLSNkZWZpbmUgRmxvYXREUiBGbG9hdEQKLSNlbHNlCi0jZGVmaW5lIEZsb2F0RFIgKEZsb2F0RHxGbG9hdFIpCi0jZW5kaWYKLQotLyogbW92ZSBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTU9WX0FYX0RJU1AzMiAweGEwCi17ICJtb3YiLCAgIDIsCTB4YTAsIFgsIGJ3bF9TdWZ8RHxXLAkJCXsgRGlzcDE2fERpc3AzMiwgQWNjLCAwIH0gfSwKLXsgIm1vdiIsICAgMiwJMHg4OCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCQl7IFJlZywgUmVnfEFueU1lbSwgMCB9IH0sCi17ICJtb3YiLCAgIDIsCTB4YjAsIFgsIGJ3bF9TdWZ8V3xTaG9ydEZvcm0sCQl7IEltbSwgUmVnLCAwIH0gfSwKLXsgIm1vdiIsICAgMiwJMHhjNiwgWCwgYndsX1N1ZnxXfE1vZHJtLAkJeyBJbW0sIFJlZ3xBbnlNZW0sIDAgfSB9LAotLyogVGhlIG5leHQgdHdvIGluc3RydWN0aW9ucyBhY2NlcHQgV29yZFJlZyBzbyB0aGF0IGEgc2VnbWVudCByZWdpc3RlcgotICAgY2FuIGJlIGNvcGllZCB0byBhIDMyIGJpdCByZWdpc3RlciwgYW5kIHZpY2UgdmVyc2EsIHdpdGhvdXQgdXNpbmcgYQotICAgc2l6ZSBwcmVmaXguICBXaGVuIG1vdmluZyB0byBhIDMyIGJpdCByZWdpc3RlciwgdGhlIHVwcGVyIDE2IGJpdHMKLSAgIGFyZSBzZXQgdG8gYW4gaW1wbGVtZW50YXRpb24gZGVmaW5lZCB2YWx1ZSAob24gdGhlIFBlbnRpdW0gUHJvLAotICAgdGhlIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdmFsdWUgaXMgemVybykuICAqLwoteyAibW92IiwgICAyLAkweDhjLCBYLCB3bF9TdWZ8TW9kcm0sCQkJeyBTUmVnM3xTUmVnMiwgV29yZFJlZ3xXb3JkTWVtLCAwIH0gfSwKLXsgIm1vdiIsICAgMiwJMHg4ZSwgWCwgd2xfU3VmfE1vZHJtfElnbm9yZVNpemUsCXsgV29yZFJlZ3xXb3JkTWVtLCBTUmVnM3xTUmVnMiwgMCB9IH0sCi0vKiBtb3ZlIHRvL2Zyb20gY29udHJvbCBkZWJ1ZyByZWdpc3RlcnMgKi8KLXsgIm1vdiIsICAgMiwgMHgwZjIwLCBYLCBsX1N1ZnxEfE1vZHJtfElnbm9yZVNpemUsCXsgQ29udHJvbCwgUmVnMzJ8SW52TWVtLCAwfSB9LAoteyAibW92IiwgICAyLCAweDBmMjEsIFgsIGxfU3VmfER8TW9kcm18SWdub3JlU2l6ZSwJeyBEZWJ1ZywgUmVnMzJ8SW52TWVtLCAwfSB9LAoteyAibW92IiwgICAyLCAweDBmMjQsIFgsIGxfU3VmfER8TW9kcm18SWdub3JlU2l6ZSwJeyBUZXN0LCBSZWczMnxJbnZNZW0sIDB9IH0sCi0KLS8qIG1vdmUgd2l0aCBzaWduIGV4dGVuZCAqLwotLyogIm1vdnNibCIgJiAibW92c2J3IiBtdXN0IG5vdCBiZSB1bmlmaWVkIGludG8gIm1vdnNiIiB0byBhdm9pZAotICAgY29uZmxpY3Qgd2l0aCB0aGUgIm1vdnMiIHN0cmluZyBtb3ZlIGluc3RydWN0aW9uLiAgKi8KLXsibW92c2JsIiwgMiwgMHgwZmJlLCBYLCBOb1N1ZnxNb2RybSwJCQl7IFJlZzh8Qnl0ZU1lbSwgUmVnMzIsIDB9IH0sCi17Im1vdnNidyIsIDIsIDB4MGZiZSwgWCwgTm9TdWZ8TW9kcm0sCQkJeyBSZWc4fEJ5dGVNZW0sIFJlZzE2LCAwfSB9LAoteyJtb3Zzd2wiLCAyLCAweDBmYmYsIFgsIE5vU3VmfE1vZHJtLAkJCXsgUmVnMTZ8U2hvcnRNZW0sIFJlZzMyLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17Im1vdnN4IiwgIDIsIDB4MGZiZiwgWCwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSwJeyBSZWcxNnxTaG9ydE1lbSwgUmVnMzIsIDB9IH0sCi17Im1vdnN4IiwgIDIsIDB4MGZiZSwgWCwgYl9TdWZ8TW9kcm0sCQkJeyBSZWc4fEJ5dGVNZW0sIFdvcmRSZWcsIDB9IH0sCi0KLS8qIG1vdmUgd2l0aCB6ZXJvIGV4dGVuZCAqLwoteyJtb3Z6YiIsICAyLCAweDBmYjYsIFgsIHdsX1N1ZnxNb2RybSwJCQl7IFJlZzh8Qnl0ZU1lbSwgV29yZFJlZywgMH0gfSwKLXsibW92endsIiwgMiwgMHgwZmI3LCBYLCBOb1N1ZnxNb2RybSwJCQl7IFJlZzE2fFNob3J0TWVtLCBSZWczMiwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJtb3Z6eCIsICAyLCAweDBmYjcsIFgsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUsCXsgUmVnMTZ8U2hvcnRNZW0sIFJlZzMyLCAwfSB9LAoteyJtb3Z6eCIsICAyLCAweDBmYjYsIFgsIGJfU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBXb3JkUmVnLCAwfSB9LAotCi0vKiBwdXNoIGluc3RydWN0aW9ucyAqLwoteyJwdXNoIiwgICAxLAkweDUwLCBYLCB3bF9TdWZ8U2hvcnRGb3JtfERlZmF1bHRTaXplLAl7IFdvcmRSZWcsIDAsIDAgfSB9LAoteyJwdXNoIiwgICAxLAkweGZmLCA2LCB3bF9TdWZ8TW9kcm18RGVmYXVsdFNpemUsCXsgV29yZFJlZ3xXb3JkTWVtLCAwLCAwIH0gfSwKLXsicHVzaCIsICAgMSwJMHg2YSwgWCwgd2xfU3VmfERlZmF1bHRTaXplLAkJeyBJbW04UywgMCwgMH0gfSwKLXsicHVzaCIsICAgMSwJMHg2OCwgWCwgd2xfU3VmfERlZmF1bHRTaXplLAkJeyBJbW0xNnxJbW0zMiwgMCwgMH0gfSwKLXsicHVzaCIsICAgMSwJMHgwNiwgWCwgd2xfU3VmfFNlZzJTaG9ydEZvcm18RGVmYXVsdFNpemUsIHsgU1JlZzIsIDAsIDAgfSB9LAoteyJwdXNoIiwgICAxLCAweDBmYTAsIFgsIHdsX1N1ZnxTZWczU2hvcnRGb3JtfERlZmF1bHRTaXplLCB7IFNSZWczLCAwLCAwIH0gfSwKLS8qIHB1c2ggYWxsICovCi17InB1c2hhIiwgIDAsCTB4NjAsIFgsIHdsX1N1ZnxEZWZhdWx0U2l6ZSwJCXsgMCwgMCwgMCB9IH0sCi0KLS8qIHBvcCBpbnN0cnVjdGlvbnMgKi8KLXsicG9wIiwJICAgMSwJMHg1OCwgWCwgd2xfU3VmfFNob3J0Rm9ybXxEZWZhdWx0U2l6ZSwJeyBXb3JkUmVnLCAwLCAwIH0gfSwKLXsicG9wIiwJICAgMSwJMHg4ZiwgMCwgd2xfU3VmfE1vZHJtfERlZmF1bHRTaXplLAl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMCB9IH0sCi0jZGVmaW5lIFBPUF9TRUdfU0hPUlQgMHgwNwoteyJwb3AiLAkgICAxLAkweDA3LCBYLCB3bF9TdWZ8U2VnMlNob3J0Rm9ybXxEZWZhdWx0U2l6ZSwgeyBTUmVnMiwgMCwgMCB9IH0sCi17InBvcCIsCSAgIDEsIDB4MGZhMSwgWCwgd2xfU3VmfFNlZzNTaG9ydEZvcm18RGVmYXVsdFNpemUsIHsgU1JlZzMsIDAsIDAgfSB9LAotLyogcG9wIGFsbCAqLwoteyJwb3BhIiwgICAwLAkweDYxLCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCQl7IDAsIDAsIDAgfSB9LAotCi0vKiB4Y2hnIGV4Y2hhbmdlIGluc3RydWN0aW9ucwotICAgeGNoZyBjb21tdXRlczogIHdlIGFsbG93IGJvdGggb3BlcmFuZCBvcmRlcnMgKi8KLXsieGNoZyIsICAgMiwJMHg5MCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBXb3JkUmVnLCBBY2MsIDAgfSB9LAoteyJ4Y2hnIiwgICAyLAkweDkwLCBYLCB3bF9TdWZ8U2hvcnRGb3JtLAl7IEFjYywgV29yZFJlZywgMCB9IH0sCi17InhjaGciLCAgIDIsCTB4ODYsIFgsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDAgfSB9LAoteyJ4Y2hnIiwgICAyLAkweDg2LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgUmVnLCAwIH0gfSwKLQotLyogaW4vb3V0IGZyb20gcG9ydHMgKi8KLXsiaW4iLAkgICAyLAkweGU0LCBYLCBid2xfU3VmfFcsCQl7IEltbTgsIEFjYywgMCB9IH0sCi17ImluIiwJICAgMiwJMHhlYywgWCwgYndsX1N1ZnxXLAkJeyBJbk91dFBvcnRSZWcsIEFjYywgMCB9IH0sCi17ImluIiwJICAgMSwJMHhlNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW04LCAwLCAwIH0gfSwKLXsiaW4iLAkgICAxLAkweGVjLCBYLCBid2xfU3VmfFcsCQl7IEluT3V0UG9ydFJlZywgMCwgMCB9IH0sCi17Im91dCIsCSAgIDIsCTB4ZTYsIFgsIGJ3bF9TdWZ8VywJCXsgQWNjLCBJbW04LCAwIH0gfSwKLXsib3V0IiwJICAgMiwJMHhlZSwgWCwgYndsX1N1ZnxXLAkJeyBBY2MsIEluT3V0UG9ydFJlZywgMCB9IH0sCi17Im91dCIsCSAgIDEsCTB4ZTYsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tOCwgMCwgMCB9IH0sCi17Im91dCIsCSAgIDEsCTB4ZWUsIFgsIGJ3bF9TdWZ8VywJCXsgSW5PdXRQb3J0UmVnLCAwLCAwIH0gfSwKLQotLyogbG9hZCBlZmZlY3RpdmUgYWRkcmVzcyAqLwoteyJsZWEiLAkgICAyLCAweDhkLCAgIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMCB9IH0sCi0KLS8qIGxvYWQgc2VnbWVudCByZWdpc3RlcnMgZnJvbSBtZW1vcnkgKi8KLXsibGRzIiwJICAgMiwJMHhjNSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJsZXMiLAkgICAyLAkweGM0LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImxmcyIsCSAgIDIsIDB4MGZiNCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJsZ3MiLAkgICAyLCAweDBmYjUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibHNzIiwJICAgMiwgMHgwZmIyLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi0KLS8qIGZsYWdzIHJlZ2lzdGVyIGluc3RydWN0aW9ucyAqLwoteyJjbGMiLAkgICAwLAkweGY4LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNsZCIsCSAgIDAsCTB4ZmMsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiY2xpIiwJICAgMCwJMHhmYSwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJjbHRzIiwgICAwLCAweDBmMDYsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiY21jIiwJICAgMCwJMHhmNSwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJsYWhmIiwgICAwLAkweDlmLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InNhaGYiLCAgIDAsCTB4OWUsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsicHVzaGYiLCAgMCwJMHg5YywgWCwgd2xfU3VmfERlZmF1bHRTaXplLAl7IDAsIDAsIDB9IH0sCi17InBvcGYiLCAgIDAsCTB4OWQsIFgsIHdsX1N1ZnxEZWZhdWx0U2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJzdGMiLAkgICAwLAkweGY5LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InN0ZCIsCSAgIDAsCTB4ZmQsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsic3RpIiwJICAgMCwJMHhmYiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAotCi0vKiBhcml0aG1ldGljICovCi17ImFkZCIsCSAgIDIsCTB4MDAsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsiYWRkIiwJICAgMiwJMHg4MywgMCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJhZGQiLAkgICAyLAkweDA0LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJhZGQiLAkgICAyLAkweDgwLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17ImluYyIsCSAgIDEsCTB4NDAsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywgMCwgMH0gfSwKLXsiaW5jIiwJICAgMSwJMHhmZSwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic3ViIiwJICAgMiwJMHgyOCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJzdWIiLAkgICAyLAkweDgzLCA1LCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17InN1YiIsCSAgIDIsCTB4MmMsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17InN1YiIsCSAgIDIsCTB4ODAsIDUsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsiZGVjIiwJICAgMSwJMHg0OCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBXb3JkUmVnLCAwLCAwfSB9LAoteyJkZWMiLAkgICAxLAkweGZlLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzYmIiLAkgICAyLAkweDE4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNiYiIsCSAgIDIsCTB4ODMsIDMsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsic2JiIiwJICAgMiwJMHgxYywgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsic2JiIiwJICAgMiwJMHg4MCwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJjbXAiLAkgICAyLAkweDM4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17ImNtcCIsCSAgIDIsCTB4ODMsIDcsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiY21wIiwJICAgMiwJMHgzYywgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsiY21wIiwJICAgMiwJMHg4MCwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJ0ZXN0IiwgICAyLAkweDg0LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgUmVnLCAwfSB9LAoteyJ0ZXN0IiwgICAyLAkweDg0LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJ0ZXN0IiwgICAyLAkweGE4LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJ0ZXN0IiwgICAyLAkweGY2LCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17ImFuZCIsCSAgIDIsCTB4MjAsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsiYW5kIiwJICAgMiwJMHg4MywgNCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJhbmQiLAkgICAyLAkweDI0LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJhbmQiLAkgICAyLAkweDgwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17Im9yIiwJICAgMiwJMHgwOCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJvciIsCSAgIDIsCTB4ODMsIDEsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsib3IiLAkgICAyLAkweDBjLCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJvciIsCSAgIDIsCTB4ODAsIDEsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsieG9yIiwJICAgMiwJMHgzMCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJ4b3IiLAkgICAyLAkweDgzLCA2LCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17InhvciIsCSAgIDIsCTB4MzQsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17InhvciIsCSAgIDIsCTB4ODAsIDYsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLS8qIGljbHIgd2l0aCAxIG9wZXJhbmQgaXMgcmVhbGx5IHhvciB3aXRoIDIgb3BlcmFuZHMuICovCi17ImNsciIsCSAgIDEsCTB4MzAsIFgsIGJ3bF9TdWZ8V3xNb2RybXxyZWdLbHVkZ2UsCXsgUmVnLCAwLCAwIH0gfSwKLQoteyJhZGMiLAkgICAyLAkweDEwLCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17ImFkYyIsCSAgIDIsCTB4ODMsIDIsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYWRjIiwJICAgMiwJMHgxNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsiYWRjIiwJICAgMiwJMHg4MCwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJuZWciLAkgICAxLAkweGY2LCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsibm90IiwJICAgMSwJMHhmNiwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsiYWFhIiwJICAgMCwJMHgzNywgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJhYXMiLAkgICAwLAkweDNmLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImRhYSIsCSAgIDAsCTB4MjcsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiZGFzIiwJICAgMCwJMHgyZiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJhYWQiLAkgICAwLCAweGQ1MGEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiYWFkIiwJICAgMSwgICAweGQ1LCBYLCBOb1N1ZiwJCQl7IEltbThTLCAwLCAwfSB9LAoteyJhYW0iLAkgICAwLCAweGQ0MGEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiYWFtIiwJICAgMSwgICAweGQ0LCBYLCBOb1N1ZiwJCQl7IEltbThTLCAwLCAwfSB9LAotCi0vKiBjb252ZXJzaW9uIGluc25zICovCi0vKiBjb252ZXJzaW9uOglpbnRlbCBuYW1pbmcgKi8KLXsiY2J3IiwJICAgMCwJMHg5OCwgWCwgTm9TdWZ8U2l6ZTE2LAkJeyAwLCAwLCAwfSB9LAoteyJjd2RlIiwgICAwLAkweDk4LCBYLCBOb1N1ZnxTaXplMzIsCQl7IDAsIDAsIDB9IH0sCi17ImN3ZCIsCSAgIDAsCTB4OTksIFgsIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKLXsiY2RxIiwJICAgMCwJMHg5OSwgWCwgTm9TdWZ8U2l6ZTMyLAkJeyAwLCAwLCAwfSB9LAotLyogIGF0dCBuYW1pbmcgKi8KLXsiY2J0dyIsICAgMCwJMHg5OCwgWCwgTm9TdWZ8U2l6ZTE2LAkJeyAwLCAwLCAwfSB9LAoteyJjd3RsIiwgICAwLAkweDk4LCBYLCBOb1N1ZnxTaXplMzIsCQl7IDAsIDAsIDB9IH0sCi17ImN3dGQiLCAgIDAsCTB4OTksIFgsIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKLXsiY2x0ZCIsICAgMCwJMHg5OSwgWCwgTm9TdWZ8U2l6ZTMyLAkJeyAwLCAwLCAwfSB9LAotCi0vKiBXYXJuaW5nISB0aGUgbXVsL2ltdWwgKG9wY29kZSAweGY2KSBtdXN0IG9ubHkgaGF2ZSAxIG9wZXJhbmQhICBUaGV5IGFyZQotICAgZXhwYW5kaW5nIDY0LWJpdCBtdWx0aXBsaWVzLCBhbmQgKmNhbm5vdCogYmUgc2VsZWN0ZWQgdG8gYWNjb21wbGlzaAotICAgJ2ltdWwgJWVieCwgJWVheCcgKG9wY29kZSAweDBmYWYgbXVzdCBiZSB1c2VkIGluIHRoaXMgY2FzZSkKLSAgIFRoZXNlIG11bHRpcGxpZXMgY2FuIG9ubHkgYmUgc2VsZWN0ZWQgd2l0aCBzaW5nbGUgb3BlcmFuZCBmb3Jtcy4gICovCi17Im11bCIsCSAgIDEsCTB4ZjYsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJpbXVsIiwgICAxLAkweGY2LCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsiaW11bCIsICAgMiwgMHgwZmFmLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiaW11bCIsICAgMywJMHg2YiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnfSB9LAoteyJpbXVsIiwgICAzLAkweDY5LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IEltbTE2fEltbTMyLCBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWd9IH0sCi0vKiBpbXVsIHdpdGggMiBvcGVyYW5kcyBtaW1pY3MgaW11bCB3aXRoIDMgYnkgcHV0dGluZyB0aGUgcmVnaXN0ZXIgaW4KLSAgIGJvdGggaS5ybS5yZWcgJiBpLnJtLnJlZ21lbSBmaWVsZHMuICByZWdLbHVkZ2UgZW5hYmxlcyB0aGlzCi0gICB0cmFuc2Zvcm1hdGlvbi4gICovCi17ImltdWwiLCAgIDIsCTB4NmIsIFgsIHdsX1N1ZnxNb2RybXxyZWdLbHVkZ2UseyBJbW04UywgV29yZFJlZywgMH0gfSwKLXsiaW11bCIsICAgMiwJMHg2OSwgWCwgd2xfU3VmfE1vZHJtfHJlZ0tsdWRnZSx7IEltbTE2fEltbTMyLCBXb3JkUmVnLCAwfSB9LAotCi17ImRpdiIsCSAgIDEsCTB4ZjYsIDYsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJkaXYiLAkgICAyLAkweGY2LCA2LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgQWNjLCAwfSB9LAoteyJpZGl2IiwgICAxLAkweGY2LCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsiaWRpdiIsICAgMiwJMHhmNiwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIEFjYywgMH0gfSwKLQoteyJyb2wiLAkgICAyLAkweGQwLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9sIiwJICAgMiwJMHhjMCwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvbCIsCSAgIDIsCTB4ZDIsIDAsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyb2wiLAkgICAxLAkweGQwLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJyb3IiLAkgICAyLAkweGQwLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9yIiwJICAgMiwJMHhjMCwgMSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvciIsCSAgIDIsCTB4ZDIsIDEsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyb3IiLAkgICAxLAkweGQwLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJyY2wiLAkgICAyLAkweGQwLCAyLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicmNsIiwJICAgMiwJMHhjMCwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjbCIsCSAgIDIsCTB4ZDIsIDIsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY2wiLAkgICAxLAkweGQwLCAyLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJyY3IiLAkgICAyLAkweGQwLCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicmNyIiwJICAgMiwJMHhjMCwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjciIsCSAgIDIsCTB4ZDIsIDMsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY3IiLAkgICAxLAkweGQwLCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzYWwiLAkgICAyLAkweGQwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FsIiwJICAgMiwJMHhjMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNhbCIsCSAgIDIsCTB4ZDIsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYWwiLAkgICAxLAkweGQwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsic2hsIiwJICAgMiwJMHhkMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNobCIsCSAgIDIsCTB4YzAsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaGwiLAkgICAyLAkweGQyLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2hsIiwJICAgMSwJMHhkMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic2hsZCIsICAgMywgMHgwZmE0LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbX0gfSwKLXsic2hsZCIsICAgMywgMHgwZmE1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFNoaWZ0Q291bnQsIFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbX0gfSwKLXsic2hsZCIsICAgMiwgMHgwZmE1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLQoteyJzaHIiLAkgICAyLAkweGQwLCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2hyIiwJICAgMiwJMHhjMCwgNSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNociIsCSAgIDIsCTB4ZDIsIDUsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaHIiLAkgICAxLAkweGQwLCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzaHJkIiwgICAzLCAweDBmYWMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtfSB9LAoteyJzaHJkIiwgICAzLCAweDBmYWQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgU2hpZnRDb3VudCwgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtfSB9LAoteyJzaHJkIiwgICAyLCAweDBmYWQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAotCi17InNhciIsCSAgIDIsCTB4ZDAsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYXIiLAkgICAyLAkweGMwLCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FyIiwJICAgMiwJMHhkMiwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNhciIsCSAgIDEsCTB4ZDAsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi0vKiBjb250cm9sIHRyYW5zZmVyIGluc3RydWN0aW9ucyAqLwoteyJjYWxsIiwgICAxLAkweGU4LCBYLCB3bF9TdWZ8SnVtcER3b3JkfERlZmF1bHRTaXplLAl7IERpc3AxNnxEaXNwMzIsIDAsIDB9IH0sCi17ImNhbGwiLCAgIDEsCTB4ZmYsIDIsIHdsX1N1ZnxNb2RybXxEZWZhdWx0U2l6ZSwJeyBXb3JkUmVnfFdvcmRNZW18SnVtcEFic29sdXRlLCAwLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17ImNhbGwiLCAgIDIsCTB4OWEsIFgsIHdsX1N1ZnxKdW1wSW50ZXJTZWdtZW50fERlZmF1bHRTaXplLCB7IEltbTE2LCBJbW0xNnxJbW0zMiwgMH0gfSwKLXsibGNhbGwiLCAgMiwJMHg5YSwgWCwgd2xfU3VmfEp1bXBJbnRlclNlZ21lbnR8RGVmYXVsdFNpemUsIHsgSW1tMTYsIEltbTE2fEltbTMyLCAwfSB9LAoteyJsY2FsbCIsICAxLAkweGZmLCAzLCB3bF9TdWZ8TW9kcm18RGVmYXVsdFNpemUsCXsgV29yZE1lbSwgMCwgMH0gfSwKLQotI2RlZmluZSBKVU1QX1BDX1JFTEFUSVZFIDB4ZWIKLXsiam1wIiwJICAgMSwJMHhlYiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam1wIiwJICAgMSwJMHhmZiwgNCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW18SnVtcEFic29sdXRlLCAwLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17ImptcCIsICAgIDIsCTB4ZWEsIFgsIHdsX1N1ZnxKdW1wSW50ZXJTZWdtZW50LCB7IEltbTE2LCBJbW0xNnxJbW0zMiwgMH0gfSwKLXsiam1wIiwgICAgMSwJMHhmZiwgNSwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJsam1wIiwgICAyLAkweGVhLCBYLCB3bF9TdWZ8SnVtcEludGVyU2VnbWVudCwgeyBJbW0xNiwgSW1tMTZ8SW1tMzIsIDB9IH0sCi17ImxqbXAiLCAgIDEsCTB4ZmYsIDUsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLQoteyJyZXQiLAkgICAwLAkweGMzLCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCXsgMCwgMCwgMH0gfSwKLXsicmV0IiwJICAgMSwJMHhjMiwgWCwgd2xfU3VmfERlZmF1bHRTaXplLAl7IEltbTE2LCAwLCAwfSB9LAoteyJscmV0IiwgICAwLAkweGNiLCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCXsgMCwgMCwgMH0gfSwKLXsibHJldCIsICAgMSwJMHhjYSwgWCwgd2xfU3VmfERlZmF1bHRTaXplLAl7IEltbTE2LCAwLCAwfSB9LAoteyJlbnRlciIsICAyLAkweGM4LCBYLCB3bF9TdWZ8RGVmYXVsdFNpemUsCXsgSW1tMTYsIEltbTgsIDB9IH0sCi17ImxlYXZlIiwgIDAsCTB4YzksIFgsIHdsX1N1ZnxEZWZhdWx0U2l6ZSwJeyAwLCAwLCAwfSB9LAotCi0vKiBjb25kaXRpb25hbCBqdW1wcyAqLwoteyJqbyIsCSAgIDEsCTB4NzAsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpubyIsCSAgIDEsCTB4NzEsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpiIiwJICAgMSwJMHg3MiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamMiLAkgICAxLAkweDcyLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmFlIiwgICAxLAkweDcyLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmIiLAkgICAxLAkweDczLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmMiLAkgICAxLAkweDczLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYWUiLAkgICAxLAkweDczLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqZSIsCSAgIDEsCTB4NzQsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17Imp6IiwJICAgMSwJMHg3NCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5lIiwJICAgMSwJMHg3NSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam56IiwJICAgMSwJMHg3NSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamJlIiwJICAgMSwJMHg3NiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5hIiwJICAgMSwJMHg3NiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5iZSIsICAgMSwJMHg3NywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamEiLAkgICAxLAkweDc3LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqcyIsCSAgIDEsCTB4NzgsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpucyIsCSAgIDEsCTB4NzksIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpwIiwJICAgMSwJMHg3YSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianBlIiwJICAgMSwJMHg3YSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5wIiwJICAgMSwJMHg3YiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianBvIiwJICAgMSwJMHg3YiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamwiLAkgICAxLAkweDdjLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmdlIiwgICAxLAkweDdjLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmwiLAkgICAxLAkweDdkLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqZ2UiLAkgICAxLAkweDdkLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbGUiLAkgICAxLAkweDdlLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmciLAkgICAxLAkweDdlLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmxlIiwgICAxLAkweDdmLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqZyIsCSAgIDEsCTB4N2YsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi0KLS8qIGpjeHogdnMuIGplY3h6IGlzIGNob3NlbiBvbiB0aGUgYmFzaXMgb2YgdGhlIGFkZHJlc3Mgc2l6ZSBwcmVmaXguICAqLwoteyJqY3h6IiwgICAxLAkweGUzLCBYLCBOb1N1ZnxKdW1wQnl0ZXxTaXplMTYsIHsgRGlzcCwgMCwgMH0gfSwKLXsiamVjeHoiLCAgMSwJMHhlMywgWCwgTm9TdWZ8SnVtcEJ5dGV8U2l6ZTMyLCB7IERpc3AsIDAsIDB9IH0sCi0KLS8qIFRoZSBsb29wIGluc3RydWN0aW9ucyBhbHNvIHVzZSB0aGUgYWRkcmVzcyBzaXplIHByZWZpeCB0byBzZWxlY3QKLSAgICVjeCByYXRoZXIgdGhhbiAlZWN4IGZvciB0aGUgbG9vcCBjb3VudCwgc28gdGhlIGB3JyBmb3JtIG9mIHRoZXNlCi0gICBpbnN0cnVjdGlvbnMgZW1pdCBhbiBhZGRyZXNzIHNpemUgcHJlZml4IHJhdGhlciB0aGFuIGEgZGF0YSBzaXplCi0gICBwcmVmaXguICAqLwoteyJsb29wIiwgICAxLAkweGUyLCBYLCB3bF9TdWZ8SnVtcEJ5dGUsCXsgRGlzcCwgMCwgMH0gfSwKLXsibG9vcHoiLCAgMSwJMHhlMSwgWCwgd2xfU3VmfEp1bXBCeXRlLAl7IERpc3AsIDAsIDB9IH0sCi17Imxvb3BlIiwgIDEsCTB4ZTEsIFgsIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAoteyJsb29wbnoiLCAxLAkweGUwLCBYLCB3bF9TdWZ8SnVtcEJ5dGUsCXsgRGlzcCwgMCwgMH0gfSwKLXsibG9vcG5lIiwgMSwJMHhlMCwgWCwgd2xfU3VmfEp1bXBCeXRlLAl7IERpc3AsIDAsIDB9IH0sCi0KLS8qIHNldCBieXRlIG9uIGZsYWcgaW5zdHJ1Y3Rpb25zICovCi17InNldG8iLCAgIDEsIDB4MGY5MCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bm8iLCAgMSwgMHgwZjkxLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRiIiwgICAxLCAweDBmOTIsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGMiLCAgIDEsIDB4MGY5MiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmFlIiwgMSwgMHgwZjkyLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuYiIsICAxLCAweDBmOTMsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5jIiwgIDEsIDB4MGY5MywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0YWUiLCAgMSwgMHgwZjkzLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRlIiwgICAxLCAweDBmOTQsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldHoiLCAgIDEsIDB4MGY5NCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmUiLCAgMSwgMHgwZjk1LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRueiIsICAxLCAweDBmOTUsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGJlIiwgIDEsIDB4MGY5NiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmEiLCAgMSwgMHgwZjk2LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuYmUiLCAxLCAweDBmOTcsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGEiLCAgIDEsIDB4MGY5NywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0cyIsICAgMSwgMHgwZjk4LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRucyIsICAxLCAweDBmOTksIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldHAiLCAgIDEsIDB4MGY5YSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0cGUiLCAgMSwgMHgwZjlhLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRucCIsICAxLCAweDBmOWIsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldHBvIiwgIDEsIDB4MGY5YiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bCIsICAgMSwgMHgwZjljLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuZ2UiLCAxLCAweDBmOWMsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5sIiwgIDEsIDB4MGY5ZCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0Z2UiLCAgMSwgMHgwZjlkLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRsZSIsICAxLCAweDBmOWUsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5nIiwgIDEsIDB4MGY5ZSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmxlIiwgMSwgMHgwZjlmLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRnIiwgICAxLCAweDBmOWYsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi0KLS8qIHN0cmluZyBtYW5pcHVsYXRpb24gKi8KLXsiY21wcyIsICAgMCwJMHhhNiwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJjbXBzIiwgICAyLAkweGE2LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgQW55TWVtLCAwfSB9LAoteyJzY21wIiwgICAwLAkweGE2LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNjbXAiLCAgIDIsCTB4YTYsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCBBbnlNZW0sIDB9IH0sCi17ImlucyIsCSAgIDAsCTB4NmMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsiaW5zIiwJICAgMiwJMHg2YywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBJbk91dFBvcnRSZWcsIEFueU1lbXxFc1NlZywgMH0gfSwKLXsib3V0cyIsICAgMCwJMHg2ZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJvdXRzIiwgICAyLAkweDZlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgSW5PdXRQb3J0UmVnLCAwfSB9LAoteyJsb2RzIiwgICAwLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17ImxvZHMiLCAgIDEsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCAwLCAwfSB9LAoteyJsb2RzIiwgICAyLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgQWNjLCAwfSB9LAoteyJzbG9kIiwgICAwLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNsb2QiLCAgIDEsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCAwLCAwfSB9LAoteyJzbG9kIiwgICAyLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgQWNjLCAwfSB9LAoteyJtb3ZzIiwgICAwLAkweGE0LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17Im1vdnMiLCAgIDIsCTB4YTQsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCBBbnlNZW18RXNTZWcsIDB9IH0sCi17InNtb3YiLCAgIDAsCTB4YTQsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsic21vdiIsICAgMiwJMHhhNCwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEFueU1lbXxFc1NlZywgMH0gfSwKLXsic2NhcyIsICAgMCwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzY2FzIiwgICAxLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgMCwgMH0gfSwKLXsic2NhcyIsICAgMiwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIEFjYywgMH0gfSwKLXsic3NjYSIsICAgMCwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzc2NhIiwgICAxLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgMCwgMH0gfSwKLXsic3NjYSIsICAgMiwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIEFjYywgMH0gfSwKLXsic3RvcyIsICAgMCwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzdG9zIiwgICAxLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgMCwgMH0gfSwKLXsic3RvcyIsICAgMiwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBY2MsIEFueU1lbXxFc1NlZywgMH0gfSwKLXsic3N0byIsICAgMCwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzc3RvIiwgICAxLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgMCwgMH0gfSwKLXsic3N0byIsICAgMiwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBY2MsIEFueU1lbXxFc1NlZywgMH0gfSwKLXsieGxhdCIsICAgMCwJMHhkNywgWCwgYl9TdWZ8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsieGxhdCIsICAgMSwJMHhkNywgWCwgYl9TdWZ8SXNTdHJpbmcsCXsgQW55TWVtLCAwLCAwfSB9LAotCi0vKiBiaXQgbWFuaXB1bGF0aW9uICovCi17ImJzZiIsCSAgIDIsIDB4MGZiYywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImJzciIsCSAgIDIsIDB4MGZiZCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImJ0IiwJICAgMiwgMHgwZmEzLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYnQiLAkgICAyLCAweDBmYmEsIDQsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidGMiLAkgICAyLCAweDBmYmIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidGMiLAkgICAyLCAweDBmYmEsIDcsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidHIiLAkgICAyLCAweDBmYjMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidHIiLAkgICAyLCAweDBmYmEsIDYsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidHMiLAkgICAyLCAweDBmYWIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidHMiLAkgICAyLCAweDBmYmEsIDUsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAotCi0vKiBpbnRlcnJ1cHRzICYgb3AuIHN5cyBpbnNucyAqLwotLyogU2VlIGdhcy9jb25maWcvdGMtaTM4Ni5jIGZvciBjb252ZXJzaW9uIG9mICdpbnQgJDMnIGludG8gdGhlIHNwZWNpYWwKLSAgIGludCAzIGluc24uICovCi0jZGVmaW5lIElOVF9PUENPREUgMHhjZAotI2RlZmluZSBJTlQzX09QQ09ERSAweGNjCi17ImludCIsCSAgIDEsCTB4Y2QsIFgsIE5vU3VmLAkJCXsgSW1tOCwgMCwgMH0gfSwKLXsiaW50MyIsICAgMCwJMHhjYywgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJpbnRvIiwgICAwLAkweGNlLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImlyZXQiLCAgIDAsCTB4Y2YsIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMH0gfSwKLS8qIGkzODZzbCwgaTQ4NnNsLCBsYXRlciA0ODYsIGFuZCBQZW50aXVtICovCi17InJzbSIsCSAgIDAsIDB4MGZhYSwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAotCi17ImJvdW5kIiwgIDIsCTB4NjIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZE1lbSwgMH0gfSwKLQoteyJobHQiLAkgICAwLAkweGY0LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi0vKiBub3AgaXMgYWN0dWFsbHkgJ3hjaGdsICVlYXgsICVlYXgnICovCi17Im5vcCIsCSAgIDAsCTB4OTAsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLQotLyogcHJvdGVjdGlvbiBjb250cm9sICovCi17ImFycGwiLCAgIDIsCTB4NjMsIFgsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNiwgUmVnMTZ8U2hvcnRNZW0sIDB9IH0sCi17ImxhciIsCSAgIDIsIDB4MGYwMiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImxnZHQiLCAgIDEsIDB4MGYwMSwgMiwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJsaWR0IiwgICAxLCAweDBmMDEsIDMsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLXsibGxkdCIsICAgMSwgMHgwZjAwLCAyLCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi17Imxtc3ciLCAgIDEsIDB4MGYwMSwgNiwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAoteyJsc2wiLAkgICAyLCAweDBmMDMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJsdHIiLAkgICAxLCAweDBmMDAsIDMsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKLQoteyJzZ2R0IiwgICAxLCAweDBmMDEsIDAsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLXsic2lkdCIsICAgMSwgMHgwZjAxLCAxLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCi17InNsZHQiLCAgIDEsIDB4MGYwMCwgMCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIDAsIDB9IH0sCi17InNtc3ciLCAgIDEsIDB4MGYwMSwgNCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIDAsIDB9IH0sCi17InN0ciIsCSAgIDEsIDB4MGYwMCwgMSwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAotCi17InZlcnIiLCAgIDEsIDB4MGYwMCwgNCwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAoteyJ2ZXJ3IiwgICAxLCAweDBmMDAsIDUsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKLQotLyogZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0KLS8qIGxvYWQgKi8KLXsiZmxkIiwJICAgMSwgMHhkOWMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LCAvKiByZWdpc3RlciAqLwoteyJmbGQiLAkgICAxLAkweGQ5LCAwLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gZmxvYXQvZG91YmxlICovCi17ImZsZCIsCSAgIDEsIDB4ZDljMCwgWCwgbF9GUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17ImZsZCIsICAgIDEsCTB4ZGIsIDUsIHhfRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gZWZsb2F0ICovCi17ImZpbGQiLCAgIDEsCTB4ZGYsIDAsIHNsX1N1ZnxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSB3b3JkKDE2KS9kd29yZCgzMikgKi8KLS8qIEludGVsIFN5bnRheCAqLwoteyJmaWxkIiwgIDEsCTB4ZGYsIDUsIGRfU3VmfElnbm9yZVNpemV8TW9kcm0seyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIHF3b3JkICg2NCkgKi8KLXsiZmlsZHEiLCAgMSwJMHhkZiwgNSwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gcXdvcmQgKDY0KSAqLwoteyJmaWxkbGwiLCAxLAkweGRmLCA1LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBxd29yZCAoNjQpICovCi17ImZsZHQiLCAgIDEsCTB4ZGIsIDUsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIGVmbG9hdCAqLwoteyJmYmxkIiwgICAxLAkweGRmLCA0LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBiY2QgKi8KLQotLyogc3RvcmUgKG5vIHBvcCkgKi8KLXsiZnN0IiwJICAgMSwgMHhkZGQwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LCAvKiByZWdpc3RlciAqLwoteyJmc3QiLAkgICAxLAkweGQ5LCAyLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gZmxvYXQvZG91YmxlICovCi17ImZzdCIsCSAgIDEsIDB4ZGRkMCwgWCwgbF9GUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmaXN0IiwgICAxLAkweGRmLCAyLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gd29yZCgxNikvZHdvcmQoMzIpICovCi0KLS8qIHN0b3JlICh3aXRoIHBvcCkgKi8KLXsiZnN0cCIsICAgMSwgMHhkZGQ4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LCAvKiByZWdpc3RlciAqLwoteyJmc3RwIiwgICAxLAkweGQ5LCAzLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gZmxvYXQvZG91YmxlICovCi17ImZzdHAiLCAgIDEsIDB4ZGRkOCwgWCwgbF9GUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17ImZzdHAiLCAgIDEsCTB4ZGIsIDcsIHhfRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gZWZsb2F0ICovCi17ImZpc3RwIiwgIDEsCTB4ZGYsIDMsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIHdvcmQoMTYpL2R3b3JkKDMyKSAqLwotLyogSW50ZWwgU3ludGF4ICovCi17ImZpc3RwIiwgMSwJMHhkZiwgNywgZF9GUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBxd29yZCAoNjQpICovCi17ImZpc3RwcSIsIDEsCTB4ZGYsIDcsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIHF3b3JkICg2NCkgKi8KLXsiZmlzdHBsbCIsMSwJMHhkZiwgNywgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gcXdvcmQgKDY0KSAqLwoteyJmc3RwdCIsICAxLAkweGRiLCA3LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBlZmxvYXQgKi8KLXsiZmJzdHAiLCAgMSwJMHhkZiwgNiwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gYmNkICovCi0KLS8qIGV4Y2hhbmdlICVzdDxuPiB3aXRoICVzdDAgKi8KLXsiZnhjaCIsICAgMSwgMHhkOWM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmeGNoIiwgICAwLCAweGQ5YzksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZnhjaCAlc3QoMSkgKi8KLQotLyogY29tcGFyaXNvbiAod2l0aG91dCBwb3ApICovCi17ImZjb20iLCAgIDEsIDB4ZDhkMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmNvbSIsICAgMCwgMHhkOGQxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZjb20gJXN0KDEpICovCi17ImZjb20iLCAgIDEsCTB4ZDgsIDIsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sIC8qIGNvbXBhcmUgJXN0MCwgbWVtIGZsb2F0L2RvdWJsZSAqLwoteyJmY29tIiwgICAxLCAweGQ4ZDAsIFgsIGxfRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmljb20iLCAgMSwJMHhkZSwgMiwgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LCAvKiBjb21wYXJlICVzdDAsIG1lbSB3b3JkL2R3b3JkICovCi0KLS8qIGNvbXBhcmlzb24gKHdpdGggcG9wKSAqLwoteyJmY29tcCIsICAxLCAweGQ4ZDgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZjb21wIiwgIDAsIDB4ZDhkOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmY29tcCAlc3QoMSkgKi8KLXsiZmNvbXAiLCAgMSwJMHhkOCwgMywgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwgLyogY29tcGFyZSAlc3QwLCBtZW0gZmxvYXQvZG91YmxlICovCi17ImZjb21wIiwgIDEsIDB4ZDhkOCwgWCwgbF9GUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmaWNvbXAiLCAxLAkweGRlLCAzLCBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sIC8qIGNvbXBhcmUgJXN0MCwgbWVtIHdvcmQvZHdvcmQgKi8KLXsiZmNvbXBwIiwgMCwgMHhkZWQ5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogY29tcGFyZSAlc3QwLCAlc3QxICYgcG9wIDIgKi8KLQotLyogdW5vcmRlcmVkIGNvbXBhcmlzb24gKHdpdGggcG9wKSAqLwoteyJmdWNvbSIsICAxLCAweGRkZTAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZ1Y29tIiwgIDAsIDB4ZGRlMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmdWNvbSAlc3QoMSkgKi8KLXsiZnVjb21wIiwgMSwgMHhkZGU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmdWNvbXAiLCAwLCAweGRkZTksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZnVjb21wICVzdCgxKSAqLwoteyJmdWNvbXBwIiwwLCAweGRhZTksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiB1Y29tcGFyZSAlc3QwLCAlc3QxICYgcG9wIHR3aWNlICovCi0KLXsiZnRzdCIsICAgMCwgMHhkOWU0LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogdGVzdCAlc3QwICovCi17ImZ4YW0iLCAgIDAsIDB4ZDllNSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGV4YW1pbmUgJXN0MCAqLwotCi0vKiBsb2FkIGNvbnN0YW50cyBpbnRvICVzdDAgKi8KLXsiZmxkMSIsICAgMCwgMHhkOWU4LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gMS4wICovCi17ImZsZGwydCIsIDAsIDB4ZDllOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIGxvZzIoMTApICovCi17ImZsZGwyZSIsIDAsIDB4ZDllYSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIGxvZzIoZSkgKi8KLXsiZmxkcGkiLCAgMCwgMHhkOWViLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gcGkgKi8KLXsiZmxkbGcyIiwgMCwgMHhkOWVjLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gbG9nMTAoMikgKi8KLXsiZmxkbG4yIiwgMCwgMHhkOWVkLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gbG4oMikgKi8KLXsiZmxkeiIsICAgMCwgMHhkOWVlLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gMC4wICovCi0KLS8qIGFyaXRobWV0aWMgKi8KLQotLyogYWRkICovCi17ImZhZGQiLCAgIDIsIDB4ZDhjMCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZhZGQiLCAgIDEsIDB4ZDhjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwgLyogYWxpYXMgZm9yIGZhZGQgJXN0KGkpLCAlc3QgKi8KLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZmFkZCIsICAgMCwgMHhkZWMxLCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZhZGRwICovCi0jZW5kaWYKLXsiZmFkZCIsICAgMSwJMHhkOCwgMCwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlhZGQiLCAgMSwJMHhkZSwgMCwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQoteyJmYWRkcCIsICAyLCAweGRlYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmYWRkcCIsICAxLCAweGRlYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZhZGRwIiwgIDAsIDB4ZGVjMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmYWRkcCAlc3QsICVzdCgxKSAqLwoteyJmYWRkcCIsICAyLCAweGRlYzAsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotCi0vKiBzdWJ0cmFjdCAqLwoteyJmc3ViIiwgICAyLCAweGQ4ZTAsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdERSLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZnN1YiIsICAgMSwgMHhkOGUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmc3ViIiwgICAwLCAweGRlZTEsIFgsIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZnN1YnAgKi8KLSNlbmRpZgoteyJmc3ViIiwgICAxLAkweGQ4LCA0LCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaXN1YiIsICAxLAkweGRlLCA0LCBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCi0KLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZnN1YnAiLCAgMiwgMHhkZWUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZnN1YnAiLCAgMSwgMHhkZWUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmc3VicCIsICAwLCAweGRlZTEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnN1YnAiLCAgMiwgMHhkZWUwLCBYLCBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLSNlbHNlCi17ImZzdWJwIiwgIDIsIDB4ZGVlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZzdWJwIiwgIDEsIDB4ZGVlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnN1YnAiLCAgMCwgMHhkZWU5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jZW5kaWYKLQotLyogc3VidHJhY3QgcmV2ZXJzZSAqLwoteyJmc3ViciIsICAyLCAweGQ4ZTgsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdERSLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZnN1YnIiLCAgMSwgMHhkOGU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmc3ViciIsICAwLCAweGRlZTksIFgsIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZnN1YnJwICovCi0jZW5kaWYKLXsiZnN1YnIiLCAgMSwJMHhkOCwgNSwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlzdWJyIiwgMSwJMHhkZSwgNSwgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZzdWJycCIsIDIsIDB4ZGVlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZzdWJycCIsIDEsIDB4ZGVlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnN1YnJwIiwgMCwgMHhkZWU5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzdWJycCIsIDIsIDB4ZGVlOCwgWCwgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0jZWxzZQoteyJmc3VicnAiLCAyLCAweGRlZTAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmc3VicnAiLCAxLCAweGRlZTAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZzdWJycCIsIDAsIDB4ZGVlMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2VuZGlmCi0KLS8qIG11bHRpcGx5ICovCi17ImZtdWwiLCAgIDIsIDB4ZDhjOCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZtdWwiLCAgIDEsIDB4ZDhjOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZm11bCIsICAgMCwgMHhkZWM5LCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZtdWxwICovCi0jZW5kaWYKLXsiZm11bCIsICAgMSwJMHhkOCwgMSwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmltdWwiLCAgMSwJMHhkZSwgMSwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQoteyJmbXVscCIsICAyLCAweGRlYzgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmbXVscCIsICAxLCAweGRlYzgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZtdWxwIiwgIDAsIDB4ZGVjOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmbXVscCIsICAyLCAweGRlYzgsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotCi0vKiBkaXZpZGUgKi8KLXsiZmRpdiIsICAgMiwgMHhkOGYwLCBYLCBGUHxTaG9ydEZvcm18RmxvYXREUiwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZkaXYiLCAgIDEsIDB4ZDhmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZmRpdiIsICAgMCwgMHhkZWYxLCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZkaXZwICovCi0jZW5kaWYKLXsiZmRpdiIsICAgMSwJMHhkOCwgNiwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlkaXYiLCAgMSwJMHhkZSwgNiwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmZGl2cCIsICAyLCAweGRlZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmZGl2cCIsICAxLCAweGRlZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZkaXZwIiwgIDAsIDB4ZGVmMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmZGl2cCIsICAyLCAweGRlZjAsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotI2Vsc2UKLXsiZmRpdnAiLCAgMiwgMHhkZWY4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZmRpdnAiLCAgMSwgMHhkZWY4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmZGl2cCIsICAwLCAweGRlZjksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLSNlbmRpZgotCi0vKiBkaXZpZGUgcmV2ZXJzZSAqLwoteyJmZGl2ciIsICAyLCAweGQ4ZjgsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdERSLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmRpdnIiLCAgMSwgMHhkOGY4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmZGl2ciIsICAwLCAweGRlZjksIFgsIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZmRpdnJwICovCi0jZW5kaWYKLXsiZmRpdnIiLCAgMSwJMHhkOCwgNywgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZmlkaXZyIiwgMSwJMHhkZSwgNywgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZkaXZycCIsIDIsIDB4ZGVmOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZkaXZycCIsIDEsIDB4ZGVmOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmRpdnJwIiwgMCwgMHhkZWY5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZkaXZycCIsIDIsIDB4ZGVmOCwgWCwgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0jZWxzZQoteyJmZGl2cnAiLCAyLCAweGRlZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmZGl2cnAiLCAxLCAweGRlZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZkaXZycCIsIDAsIDB4ZGVmMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2VuZGlmCi0KLXsiZjJ4bTEiLCAgMCwgMHhkOWYwLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZ5bDJ4IiwgIDAsIDB4ZDlmMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcHRhbiIsICAwLCAweGQ5ZjIsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnBhdGFuIiwgMCwgMHhkOWYzLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZ4dHJhY3QiLDAsIDB4ZDlmNCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcHJlbTEiLCAwLCAweGQ5ZjUsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmRlY3N0cCIsMCwgMHhkOWY2LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZpbmNzdHAiLDAsIDB4ZDlmNywgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcHJlbSIsICAwLCAweGQ5ZjgsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnlsMnhwMSIsMCwgMHhkOWY5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzcXJ0IiwgIDAsIDB4ZDlmYSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc2luY29zIiwwLCAweGQ5ZmIsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnJuZGludCIsMCwgMHhkOWZjLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzY2FsZSIsIDAsIDB4ZDlmZCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc2luIiwgICAwLCAweGQ5ZmUsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmNvcyIsICAgMCwgMHhkOWZmLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZjaHMiLCAgIDAsIDB4ZDllMCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmYWJzIiwgICAwLCAweGQ5ZTEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLQotLyogcHJvY2Vzc29yIGNvbnRyb2wgKi8KLXsiZm5pbml0IiwgMCwgMHhkYmUzLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZpbml0IiwgIDAsIDB4ZGJlMywgWCwgRlB8RldhaXQsCQl7IDAsIDAsIDB9IH0sCi17ImZsZGN3IiwgIDEsCTB4ZDksIDUsIEZQfE1vZHJtLAkJeyBTaG9ydE1lbSwgMCwgMH0gfSwKLXsiZm5zdGN3IiwgMSwJMHhkOSwgNywgRlB8TW9kcm0sCQl7IFNob3J0TWVtLCAwLCAwfSB9LAoteyJmc3RjdyIsICAxLAkweGQ5LCA3LCBGUHxGV2FpdHxNb2RybSwJeyBTaG9ydE1lbSwgMCwgMH0gfSwKLXsiZm5zdHN3IiwgMSwgMHhkZmUwLCBYLCBGUCwJCQl7IEFjYywgMCwgMH0gfSwKLXsiZm5zdHN3IiwgMSwJMHhkZCwgNywgRlB8TW9kcm0sCQl7IFNob3J0TWVtLCAwLCAwfSB9LAoteyJmbnN0c3ciLCAwLCAweGRmZTAsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnN0c3ciLCAgMSwgMHhkZmUwLCBYLCBGUHxGV2FpdCwJCXsgQWNjLCAwLCAwfSB9LAoteyJmc3RzdyIsICAxLAkweGRkLCA3LCBGUHxGV2FpdHxNb2RybSwJeyBTaG9ydE1lbSwgMCwgMH0gfSwKLXsiZnN0c3ciLCAgMCwgMHhkZmUwLCBYLCBGUHxGV2FpdCwJCXsgMCwgMCwgMH0gfSwKLXsiZm5jbGV4IiwgMCwgMHhkYmUyLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZjbGV4IiwgIDAsIDB4ZGJlMiwgWCwgRlB8RldhaXQsCQl7IDAsIDAsIDB9IH0sCi0vKiBTaG9ydCBmb3JtcyBvZiBmbGRlbnYsIGZzdGVudiB1c2UgZGF0YSBzaXplIHByZWZpeC4KLSAgIEZJWE1FOiBBcmUgdGhlc2UgdGhlIHJpZ2h0IHN1ZmZpeGVzPyAgKi8KLXsiZm5zdGVudiIsMSwJMHhkOSwgNiwgc2xfU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZnN0ZW52IiwgMSwJMHhkOSwgNiwgc2xfU3VmfEZXYWl0fE1vZHJtLAl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmbGRlbnYiLCAxLAkweGQ5LCA0LCBzbF9TdWZ8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmbnNhdmUiLCAxLAkweGRkLCA2LCBzbF9TdWZ8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmc2F2ZSIsICAxLAkweGRkLCA2LCBzbF9TdWZ8RldhaXR8TW9kcm0sCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZyc3RvciIsIDEsCTB4ZGQsIDQsIHNsX1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi0KLXsiZmZyZWUiLCAgMSwgMHhkZGMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotLyogUDY6ZnJlZSBzdChpKSwgcG9wIHN0ICovCi17ImZmcmVlcCIsIDEsIDB4ZGZjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZm5vcCIsICAgMCwgMHhkOWQwLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIEZXQUlUX09QQ09ERSAweDliCi17ImZ3YWl0IiwgIDAsCTB4OWIsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLQotLyoKLSAgb3Bjb2RlIHByZWZpeGVzOyB3ZSBhbGxvdyB0aGVtIGFzIHNlcGVyYXRlIGluc25zIHRvbwotKi8KLSNkZWZpbmUgQUREUl9QUkVGSVhfT1BDT0RFIDB4NjcKLXsiYWRkcjE2IiwgMCwJMHg2NywgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTE2fElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsiYWRkcjMyIiwgMCwJMHg2NywgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTMyfElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsiYXdvcmQiLCAgMCwJMHg2NywgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTE2fElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsiYWR3b3JkIiwgMCwJMHg2NywgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTMyfElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgREFUQV9QUkVGSVhfT1BDT0RFIDB4NjYKLXsiZGF0YTE2IiwgMCwJMHg2NiwgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTE2fElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsiZGF0YTMyIiwgMCwJMHg2NiwgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTMyfElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsid29yZCIsICAgMCwJMHg2NiwgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTE2fElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLXsiZHdvcmQiLCAgMCwJMHg2NiwgWCwgTm9TdWZ8SXNQcmVmaXh8U2l6ZTMyfElnbm9yZVNpemUsCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgTE9DS19QUkVGSVhfT1BDT0RFIDB4ZjAKLXsibG9jayIsICAgMCwJMHhmMCwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLXsid2FpdCIsICAgMCwgICAweDliLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBDU19QUkVGSVhfT1BDT0RFIDB4MmUKLXsiY3MiLAkgICAwLAkweDJlLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBEU19QUkVGSVhfT1BDT0RFIDB4M2UKLXsiZHMiLAkgICAwLAkweDNlLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBFU19QUkVGSVhfT1BDT0RFIDB4MjYKLXsiZXMiLAkgICAwLAkweDI2LCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBGU19QUkVGSVhfT1BDT0RFIDB4NjQKLXsiZnMiLAkgICAwLAkweDY0LCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBHU19QUkVGSVhfT1BDT0RFIDB4NjUKLXsiZ3MiLAkgICAwLAkweDY1LCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBTU19QUkVGSVhfT1BDT0RFIDB4MzYKLXsic3MiLAkgICAwLAkweDM2LCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBSRVBORV9QUkVGSVhfT1BDT0RFIDB4ZjIKLSNkZWZpbmUgUkVQRV9QUkVGSVhfT1BDT0RFICAweGYzCi17InJlcCIsCSAgIDAsCTB4ZjMsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi17InJlcGUiLCAgIDAsCTB4ZjMsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi17InJlcHoiLCAgIDAsCTB4ZjMsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi17InJlcG5lIiwgIDAsCTB4ZjIsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi17InJlcG56IiwgIDAsCTB4ZjIsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0KLS8qIDQ4NiBleHRlbnNpb25zICovCi0KLXsiYnN3YXAiLCAgIDEsIDB4MGZjOCwgWCwgbF9TdWZ8U2hvcnRGb3JtLAl7IFJlZzMyLCAwLCAwIH0gfSwKLXsieGFkZCIsICAgIDIsIDB4MGZjMCwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMCB9IH0sCi17ImNtcHhjaGciLCAyLCAweDBmYjAsIFgsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDAgfSB9LAoteyJpbnZkIiwgICAgMCwgMHgwZjA4LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsid2JpbnZkIiwgIDAsIDB4MGYwOSwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17ImludmxwZyIsICAxLCAweDBmMDEsIDcsIE5vU3VmfE1vZHJtLAkJeyBBbnlNZW0sIDAsIDB9IH0sCi0KLS8qIDU4NiBhbmQgbGF0ZSA0ODYgZXh0ZW5zaW9ucyAqLwoteyJjcHVpZCIsICAgMCwgMHgwZmEyLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLQotLyogUGVudGl1bSBleHRlbnNpb25zICovCi17IndybXNyIiwgICAwLCAweDBmMzAsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJyZHRzYyIsICAgMCwgMHgwZjMxLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsicmRtc3IiLCAgIDAsIDB4MGYzMiwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17ImNtcHhjaGc4YiIsMSwweDBmYzcsIDEsIE5vU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsic3lzZW50ZXIiLDAsIDB4MGYzNCwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17InN5c2V4aXQiLCAwLCAweDBmMzUsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJmeHNhdmUiLCAgMSwgMHgwZmFlLCAwLCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZ4cnN0b3IiLCAxLCAweDBmYWUsIDEsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLQotLyogUGVudGl1bSBQcm8gZXh0ZW5zaW9ucyAqLwoteyJyZHBtYyIsICAgMCwgMHgwZjMzLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLQoteyJ1ZDIiLAkgICAgMCwgMHgwZjBiLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogb2ZmaWNpYWwgdW5kZWZpbmVkIGluc3RyLiAqLwoteyJ1ZDJhIiwgICAgMCwgMHgwZjBiLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogYWxpYXMgZm9yIHVkMiAqLwoteyJ1ZDJiIiwgICAgMCwgMHgwZmI5LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogMm5kLiBvZmZpY2lhbCB1bmRlZmluZWQgaW5zdHIuICovCi0KLXsiY21vdm8iLCAgIDIsIDB4MGY0MCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZubyIsICAyLCAweDBmNDEsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YiIsICAgMiwgMHgwZjQyLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmMiLCAgIDIsIDB4MGY0MiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYWUiLCAyLCAweDBmNDIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YWUiLCAgMiwgMHgwZjQzLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5jIiwgIDIsIDB4MGY0MywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYiIsICAyLCAweDBmNDMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92ZSIsICAgMiwgMHgwZjQ0LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdnoiLCAgIDIsIDB4MGY0NCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuZSIsICAyLCAweDBmNDUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bnoiLCAgMiwgMHgwZjQ1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmJlIiwgIDIsIDB4MGY0NiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYSIsICAyLCAweDBmNDYsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YSIsICAgMiwgMHgwZjQ3LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5iZSIsIDIsIDB4MGY0NywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZzIiwgICAyLCAweDBmNDgsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bnMiLCAgMiwgMHgwZjQ5LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdnAiLCAgIDIsIDB4MGY0YSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZucCIsICAyLCAweDBmNGIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bCIsICAgMiwgMHgwZjRjLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5nZSIsIDIsIDB4MGY0YywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZnZSIsICAyLCAweDBmNGQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bmwiLCAgMiwgMHgwZjRkLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmxlIiwgIDIsIDB4MGY0ZSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuZyIsICAyLCAweDBmNGUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92ZyIsICAgMiwgMHgwZjRmLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5sZSIsIDIsIDB4MGY0ZiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi0KLXsiZmNtb3ZiIiwgIDIsIDB4ZGFjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmFlIiwyLCAweGRhYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdmUiLCAgMiwgMHhkYWM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZiZSIsIDIsIDB4ZGFkMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmEiLCAyLCAweGRhZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdnUiLCAgMiwgMHhkYWQ4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZhZSIsIDIsIDB4ZGJjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmIiLCAyLCAweGRiYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm5lIiwgMiwgMHhkYmM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZhIiwgIDIsIDB4ZGJkMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmJlIiwyLCAweGRiZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm51IiwgMiwgMHhkYmQ4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLQoteyJmY29taSIsICAgMiwgMHhkYmYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNvbWkiLCAgIDAsIDB4ZGJmMSwgWCwgRlB8U2hvcnRGb3JtLAkJeyAwLCAwLCAwfSB9LAoteyJmY29taSIsICAgMSwgMHhkYmYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmdWNvbWkiLCAgMiwgMHhkYmU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZnVjb21pIiwgIDAsIDB4ZGJlOSwgWCwgRlB8U2hvcnRGb3JtLAkJeyAwLCAwLCAwfSB9LAoteyJmdWNvbWkiLCAgMSwgMHhkYmU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmY29taXAiLCAgMiwgMHhkZmYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNvbXBpIiwgIDIsIDB4ZGZmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjb21waSIsICAwLCAweGRmZjEsIFgsIEZQfFNob3J0Rm9ybSwJCXsgMCwgMCwgMH0gfSwKLXsiZmNvbXBpIiwgIDEsIDB4ZGZmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnVjb21pcCIsIDIsIDB4ZGZlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZ1Y29tcGkiLCAyLCAweGRmZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmdWNvbXBpIiwgMCwgMHhkZmU5LCBYLCBGUHxTaG9ydEZvcm0sCQl7IDAsIDAsIDB9IH0sCi17ImZ1Y29tcGkiLCAxLCAweGRmZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0KLS8qIE1NWCBpbnN0cnVjdGlvbnMuICAqLwotCi17ImVtbXMiLCAgICAgMCwgMHgwZjc3LCBYLCBGUCwJCQl7IDAsIDAsIDAgfSB9LAoteyJtb3ZkIiwgICAgIDIsIDB4MGY2ZSwgWCwgRlB8TW9kcm0sCQl7IFJlZzMyfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17Im1vdmQiLCAgICAgMiwgMHgwZjdlLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YLCBSZWczMnxMb25nTWVtLCAwIH0gfSwKLXsibW92cSIsICAgICAyLCAweDBmNmYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsibW92cSIsICAgICAyLCAweDBmN2YsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVgsIFJlZ01NWHxMb25nTWVtLCAwIH0gfSwKLXsicGFja3NzZHciLCAyLCAweDBmNmIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFja3Nzd2IiLCAyLCAweDBmNjMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFja3Vzd2IiLCAyLCAweDBmNjcsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZGIiLCAgICAyLCAweDBmZmMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHciLCAgICAyLCAweDBmZmQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZGQiLCAgICAyLCAweDBmZmUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHNiIiwgICAyLCAweDBmZWMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHN3IiwgICAyLCAweDBmZWQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHVzYiIsICAyLCAweDBmZGMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHVzdyIsICAyLCAweDBmZGQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFuZCIsICAgICAyLCAweDBmZGIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFuZG4iLCAgICAyLCAweDBmZGYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxYiIsICAyLCAweDBmNzQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxdyIsICAyLCAweDBmNzUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxZCIsICAyLCAweDBmNzYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0YiIsICAyLCAweDBmNjQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0dyIsICAyLCAweDBmNjUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0ZCIsICAyLCAweDBmNjYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG1hZGR3ZCIsICAyLCAweDBmZjUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG11bGh3IiwgICAyLCAweDBmZTUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG11bGx3IiwgICAyLCAweDBmZDUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG9yIiwJICAgICAyLCAweDBmZWIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbHciLCAgICAyLCAweDBmZjEsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbHciLCAgICAyLCAweDBmNzEsIDYsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc2xsZCIsICAgIDIsIDB4MGZmMiwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc2xsZCIsICAgIDIsIDB4MGY3MiwgNiwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzbGxxIiwgICAgMiwgMHgwZmYzLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzbGxxIiwgICAgMiwgMHgwZjczLCA2LCBGUHxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYXciLCAgICAyLCAweDBmZTEsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYXciLCAgICAyLCAweDBmNzEsIDQsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc3JhZCIsICAgIDIsIDB4MGZlMiwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3JhZCIsICAgIDIsIDB4MGY3MiwgNCwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzcmx3IiwgICAgMiwgMHgwZmQxLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzcmx3IiwgICAgMiwgMHgwZjcxLCAyLCBGUHxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKLXsicHNybGQiLCAgICAyLCAweDBmZDIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNybGQiLCAgICAyLCAweDBmNzIsIDIsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc3JscSIsICAgIDIsIDB4MGZkMywgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3JscSIsICAgIDIsIDB4MGY3MywgMiwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzdWJiIiwgICAgMiwgMHgwZmY4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ3IiwgICAgMiwgMHgwZmY5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJkIiwgICAgMiwgMHgwZmZhLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJzYiIsICAgMiwgMHgwZmU4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJzdyIsICAgMiwgMHgwZmU5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ1c2IiLCAgMiwgMHgwZmQ4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ1c3ciLCAgMiwgMHgwZmQ5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2hidyIsMiwgMHgwZjY4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2h3ZCIsMiwgMHgwZjY5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2hkcSIsMiwgMHgwZjZhLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2xidyIsMiwgMHgwZjYwLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2x3ZCIsMiwgMHgwZjYxLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2xkcSIsMiwgMHgwZjYyLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB4b3IiLCAgICAgMiwgMHgwZmVmLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi0KLQotLyogUElJSSBLYXRtYWkgTmV3IEluc3RydWN0aW9ucyAvIFNJTUQgaW5zdHJ1Y3Rpb25zICovCi0KLXsiYWRkcHMiLCAgICAgMiwgMHgwZjU4LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImFkZHNzIiwgICAgIDIsIDB4ZjMwZjU4LCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImFuZG5wcyIsICAgIDIsIDB4MGY1NSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJhbmRwcyIsICAgICAyLCAweDBmNTQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBlcXBzIiwgICAyLCAweDBmYzIsICAgIDAsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcGVxc3MiLCAgIDIsIDB4ZjMwZmMyLCAgMCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBsZXBzIiwgICAyLCAweDBmYzIsICAgIDIsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcGxlc3MiLCAgIDIsIDB4ZjMwZmMyLCAgMiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBsdHBzIiwgICAyLCAweDBmYzIsICAgIDEsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcGx0c3MiLCAgIDIsIDB4ZjMwZmMyLCAgMSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBuZXFwcyIsICAyLCAweDBmYzIsICAgIDQsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcG5lcXNzIiwgIDIsIDB4ZjMwZmMyLCAgNCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBubGVwcyIsICAyLCAweDBmYzIsICAgIDYsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcG5sZXNzIiwgIDIsIDB4ZjMwZmMyLCAgNiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBubHRwcyIsICAyLCAweDBmYzIsICAgIDUsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcG5sdHNzIiwgIDIsIDB4ZjMwZmMyLCAgNSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBvcmRwcyIsICAyLCAweDBmYzIsICAgIDcsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcG9yZHNzIiwgIDIsIDB4ZjMwZmMyLCAgNywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXB1bm9yZHBzIiwyLCAweDBmYzIsICAgIDMsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImNtcHVub3Jkc3MiLDIsIDB4ZjMwZmMyLCAgMywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBwcyIsICAgICAzLCAweDBmYzIsICAgIFgsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NIH0gfSwKLXsiY21wc3MiLCAgICAgMywgMHhmMzBmYzIsICBYLCBGUHxNb2RybSwJeyBJbW04LCBSZWdYTU18V29yZE1lbSwgUmVnWE1NIH0gfSwKLXsiY29taXNzIiwgICAgMiwgMHgwZjJmLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY3Z0cGkycHMiLCAgMiwgMHgwZjJhLCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImN2dHBzMnBpIiwgIDIsIDB4MGYyZCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJjdnRzaTJzcyIsICAyLCAweGYzMGYyYSwgIFgsIEZQfE1vZHJtLAl7IFJlZzMyfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImN2dHNzMnNpIiwgIDIsIDB4ZjMwZjJkLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZzMyLCAwIH0gfSwKLXsiY3Z0dHBzMnBpIiwgMiwgMHgwZjJjLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17ImN2dHRzczJzaSIsIDIsIDB4ZjMwZjJjLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZzMyLCAwIH0gfSwKLXsiZGl2cHMiLCAgICAgMiwgMHgwZjVlLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImRpdnNzIiwgICAgIDIsIDB4ZjMwZjVlLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImxkbXhjc3IiLCAgIDEsIDB4MGZhZSwgICAgMiwgRlB8TW9kcm0sIAl7IFdvcmRNZW0sIDAsIDAgfSB9LAoteyJtYXNrbW92cSIsICAyLCAweDBmZjcsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxJbnZNZW0sIFJlZ01NWCwgMCB9IH0sCi17Im1heHBzIiwgICAgIDIsIDB4MGY1ZiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtYXhzcyIsICAgICAyLCAweGYzMGY1ZiwgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtaW5wcyIsICAgICAyLCAweDBmNWQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibWluc3MiLCAgICAgMiwgMHhmMzBmNWQsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92YXBzIiwgICAgMiwgMHgwZjI4LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmFwcyIsICAgIDIsIDB4MGYyOSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NLCBSZWdYTU18TExvbmdNZW0sIDAgfSB9LAoteyJtb3ZobHBzIiwgICAyLCAweDBmMTIsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxJbnZNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmhwcyIsICAgIDIsIDB4MGYxNiwgICAgWCwgRlB8TW9kcm0sCXsgTExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmhwcyIsICAgIDIsIDB4MGYxNywgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NLCBMTG9uZ01lbSwgMCB9IH0sCi17Im1vdmxocHMiLCAgIDIsIDB4MGYxNiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfEludk1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92bHBzIiwgICAgMiwgMHgwZjEyLCAgICBYLCBGUHxNb2RybSwJeyBMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92bHBzIiwgICAgMiwgMHgwZjEzLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU0sIExMb25nTWVtLCAwIH0gfSwKLXsibW92bXNrcHMiLCAgMiwgMHgwZjUwLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18SW52TWVtLCBSZWczMiwgMCB9IH0sCi17Im1vdm50cHMiLCAgIDIsIDB4MGYyYiwgICAgWCwgRlB8TW9kcm0sIAl7IFJlZ1hNTSwgTExvbmdNZW0sIDAgfSB9LAoteyJtb3ZudHEiLCAgICAyLCAweDBmZTcsICAgIFgsIEZQfE1vZHJtLCAJeyBSZWdNTVgsIExMb25nTWVtLCAwIH0gfSwKLXsibW92c3MiLCAgICAgMiwgMHhmMzBmMTAsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92c3MiLCAgICAgMiwgMHhmMzBmMTEsICBYLCBGUHxNb2RybSwJeyBSZWdYTU0sIFJlZ1hNTXxXb3JkTWVtLCAwIH0gfSwKLXsibW92dXBzIiwgICAgMiwgMHgwZjEwLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdnVwcyIsICAgIDIsIDB4MGYxMSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NLCBSZWdYTU18TExvbmdNZW0sIDAgfSB9LAoteyJtdWxwcyIsICAgICAyLCAweDBmNTksICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibXVsc3MiLCAgICAgMiwgMHhmMzBmNTksICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsib3JwcyIsICAgICAgMiwgMHgwZjU2LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InBhdmdiIiwgICAgIDIsIDB4MGZlMCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwYXZndyIsICAgICAyLCAweDBmZTMsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGV4dHJ3IiwgICAgMywgMHgwZmM1LCAgICBYLCBGUHxNb2RybSwJeyBJbW04LCBSZWdNTVgsIFJlZzMyfEludk1lbSB9IH0sCi17InBpbnNydyIsICAgIDMsIDB4MGZjNCwgICAgWCwgRlB8TW9kcm0sCXsgSW1tOCwgUmVnMzJ8U2hvcnRNZW0sIFJlZ01NWCB9IH0sCi17InBtYXhzdyIsICAgIDIsIDB4MGZlZSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbWF4dWIiLCAgICAyLCAweDBmZGUsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG1pbnN3IiwgICAgMiwgMHgwZmVhLCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBtaW51YiIsICAgIDIsIDB4MGZkYSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbW92bXNrYiIsICAyLCAweDBmZDcsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWCwgUmVnMzJ8SW52TWVtLCAwIH0gfSwKLXsicG11bGh1dyIsICAgMiwgMHgwZmU0LCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InByZWZldGNobnRhIiwgMSwgMHgwZjE4LCAgMCwgRlB8TW9kcm0sIAl7IExMb25nTWVtLCAwLCAwIH0gfSwKLXsicHJlZmV0Y2h0MCIsICAxLCAweDBmMTgsICAxLCBGUHxNb2RybSwgCXsgTExvbmdNZW0sIDAsIDAgfSB9LAoteyJwcmVmZXRjaHQxIiwgIDEsIDB4MGYxOCwgIDIsIEZQfE1vZHJtLCAJeyBMTG9uZ01lbSwgMCwgMCB9IH0sCi17InByZWZldGNodDIiLCAgMSwgMHgwZjE4LCAgMywgRlB8TW9kcm0sIAl7IExMb25nTWVtLCAwLCAwIH0gfSwKLXsicHNhZGJ3IiwgICAgMiwgMHgwZmY2LCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzaHVmdyIsICAgIDMsIDB4MGY3MCwgICAgWCwgRlB8TW9kcm0sCXsgSW1tOCwgUmVnTU1YfExMb25nTWVtLCBSZWdNTVggfSB9LAoteyJyY3BwcyIsICAgICAyLCAweDBmNTMsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsicmNwc3MiLCAgICAgMiwgMHhmMzBmNTMsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsicnNxcnRwcyIsICAgMiwgMHgwZjUyLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InJzcXJ0c3MiLCAgIDIsIDB4ZjMwZjUyLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InNmZW5jZSIsICAgIDAsIDB4MGZhZWY4LCAgWCwgRlAsCQl7IDAsIDAsIDAgfSB9LAoteyJzaHVmcHMiLCAgICAzLCAweDBmYzYsICAgIFgsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NIH0gfSwKLXsic3FydHBzIiwgICAgMiwgMHgwZjUxLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InNxcnRzcyIsICAgIDIsIDB4ZjMwZjUxLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InN0bXhjc3IiLCAgIDEsIDB4MGZhZSwgICAgMywgRlB8TW9kcm0sIAl7IFdvcmRNZW0sIDAsIDAgfSB9LAoteyJzdWJwcyIsICAgICAyLCAweDBmNWMsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsic3Vic3MiLCAgICAgMiwgMHhmMzBmNWMsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsidWNvbWlzcyIsICAgMiwgMHgwZjJlLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsidW5wY2tocHMiLCAgMiwgMHgwZjE1LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InVucGNrbHBzIiwgIDIsIDB4MGYxNCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJ4b3JwcyIsICAgICAyLCAweDBmNTcsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLQotLyogQU1EIDNETm93ISBpbnN0cnVjdGlvbnMgKi8KLQoteyJwcmVmZXRjaCIsIDEsIDB4MGYwZCwJICAgMCwgRlB8TW9kcm0sCQl7IEJ5dGVNZW0sIDAsIDAgfSB9LAoteyJwcmVmZXRjaHciLDEsIDB4MGYwZCwJICAgMSwgRlB8TW9kcm0sCQl7IEJ5dGVNZW0sIDAsIDAgfSB9LAoteyJmZW1tcyIsICAgIDAsIDB4MGYwZSwJICAgWCwgRlAsCQl7IDAsIDAsIDAgfSB9LAoteyJwYXZndXNiIiwgIDIsIDB4MGYwZiwgMHhiZiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZjJpZCIsICAgIDIsIDB4MGYwZiwgMHgxZCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZjJpdyIsICAgIDIsIDB4MGYwZiwgMHgxYywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LCAvKiBBdGhsb24gKi8KLXsicGZhY2MiLCAgICAyLCAweDBmMGYsIDB4YWUsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZhZGQiLCAgICAyLCAweDBmMGYsIDB4OWUsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZjbXBlcSIsICAyLCAweDBmMGYsIDB4YjAsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZjbXBnZSIsICAyLCAweDBmMGYsIDB4OTAsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZjbXBndCIsICAyLCAweDBmMGYsIDB4YTAsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZtYXgiLCAgICAyLCAweDBmMGYsIDB4YTQsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZtaW4iLCAgICAyLCAweDBmMGYsIDB4OTQsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZtdWwiLCAgICAyLCAweDBmMGYsIDB4YjQsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGZuYWNjIiwgICAyLCAweDBmMGYsIDB4OGEsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwgLyogQXRobG9uICovCi17InBmcG5hY2MiLCAgMiwgMHgwZjBmLCAweDhlLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sIC8qIEF0aGxvbiAqLwoteyJwZnJjcCIsICAgIDIsIDB4MGYwZiwgMHg5NiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJjcGl0MSIsIDIsIDB4MGYwZiwgMHhhNiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJjcGl0MiIsIDIsIDB4MGYwZiwgMHhiNiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJzcWl0MSIsIDIsIDB4MGYwZiwgMHhhNywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJzcXJ0IiwgIDIsIDB4MGYwZiwgMHg5NywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnN1YiIsICAgIDIsIDB4MGYwZiwgMHg5YSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnN1YnIiLCAgIDIsIDB4MGYwZiwgMHhhYSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwaTJmZCIsICAgIDIsIDB4MGYwZiwgMHgwZCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwaTJmdyIsICAgIDIsIDB4MGYwZiwgMHgwYywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LCAvKiBBdGhsb24gKi8KLXsicG11bGhydyIsICAyLCAweDBmMGYsIDB4YjcsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHN3YXBkIiwgICAyLCAweDBmMGYsIDB4YmIsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwgLyogQXRobG9uICovCi0KLXtOVUxMLCAwLCAwLCAwLCAwLCB7IDAsIDAsIDB9IH0JLyogc2VudGluZWwgKi8KLX07Ci0jdW5kZWYgWAotI3VuZGVmIE5vU3VmCi0jdW5kZWYgYl9TdWYKLSN1bmRlZiB3X1N1ZgotI3VuZGVmIGxfU3VmCi0jdW5kZWYgZF9TdWYKLSN1bmRlZiB4X1N1ZgotI3VuZGVmIGJ3X1N1ZgotI3VuZGVmIGJsX1N1ZgotI3VuZGVmIHdsX1N1ZgotI3VuZGVmIHNsX1N1ZgotI3VuZGVmIHNsZF9TdWYKLSN1bmRlZiBzbGR4X1N1ZgotI3VuZGVmIGJ3bF9TdWYKLSN1bmRlZiBid2xkX1N1ZgotI3VuZGVmIEZQCi0jdW5kZWYgbF9GUAotI3VuZGVmIGRfRlAKLSN1bmRlZiB4X0ZQCi0jdW5kZWYgc2xfRlAKLSN1bmRlZiBzbGRfRlAKLSN1bmRlZiBzbGR4X0ZQCi0KLSNkZWZpbmUgTUFYX01ORU1fU0laRSAxNgkvKiBmb3IgcGFyc2luZyBpbnNuIG1uZW1vbmljcyBmcm9tIGlucHV0ICovCi0KLQotLyogMzg2IHJlZ2lzdGVyIHRhYmxlICovCi0KLXN0YXRpYyBjb25zdCByZWdfZW50cnkgaTM4Nl9yZWd0YWJbXSA9IHsKLSAgLyogbWFrZSAlc3QgZmlyc3QgYXMgd2UgdGVzdCBmb3IgaXQgKi8KLSAgeyJzdCIsIEZsb2F0UmVnfEZsb2F0QWNjLCAwfSwKLSAgLyogOCBiaXQgcmVncyAqLwotICB7ImFsIiwgUmVnOHxBY2MsIDB9LAotICB7ImNsIiwgUmVnOHxTaGlmdENvdW50LCAxfSwKLSAgeyJkbCIsIFJlZzgsIDJ9LAotICB7ImJsIiwgUmVnOCwgM30sCi0gIHsiYWgiLCBSZWc4LCA0fSwKLSAgeyJjaCIsIFJlZzgsIDV9LAotICB7ImRoIiwgUmVnOCwgNn0sCi0gIHsiYmgiLCBSZWc4LCA3fSwKLSAgLyogMTYgYml0IHJlZ3MgKi8KLSAgeyJheCIsIFJlZzE2fEFjYywgMH0sCi0gIHsiY3giLCBSZWcxNiwgMX0sCi0gIHsiZHgiLCBSZWcxNnxJbk91dFBvcnRSZWcsIDJ9LAotICB7ImJ4IiwgUmVnMTZ8QmFzZUluZGV4LCAzfSwKLSAgeyJzcCIsIFJlZzE2LCA0fSwKLSAgeyJicCIsIFJlZzE2fEJhc2VJbmRleCwgNX0sCi0gIHsic2kiLCBSZWcxNnxCYXNlSW5kZXgsIDZ9LAotICB7ImRpIiwgUmVnMTZ8QmFzZUluZGV4LCA3fSwKLSAgLyogMzIgYml0IHJlZ3MgKi8KLSAgeyJlYXgiLCBSZWczMnxCYXNlSW5kZXh8QWNjLCAwfSwKLSAgeyJlY3giLCBSZWczMnxCYXNlSW5kZXgsIDF9LAotICB7ImVkeCIsIFJlZzMyfEJhc2VJbmRleCwgMn0sCi0gIHsiZWJ4IiwgUmVnMzJ8QmFzZUluZGV4LCAzfSwKLSAgeyJlc3AiLCBSZWczMiwgNH0sCi0gIHsiZWJwIiwgUmVnMzJ8QmFzZUluZGV4LCA1fSwKLSAgeyJlc2kiLCBSZWczMnxCYXNlSW5kZXgsIDZ9LAotICB7ImVkaSIsIFJlZzMyfEJhc2VJbmRleCwgN30sCi0gIC8qIHNlZ21lbnQgcmVnaXN0ZXJzICovCi0gIHsiZXMiLCBTUmVnMiwgMH0sCi0gIHsiY3MiLCBTUmVnMiwgMX0sCi0gIHsic3MiLCBTUmVnMiwgMn0sCi0gIHsiZHMiLCBTUmVnMiwgM30sCi0gIHsiZnMiLCBTUmVnMywgNH0sCi0gIHsiZ3MiLCBTUmVnMywgNX0sCi0gIC8qIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0gIHsiY3IwIiwgQ29udHJvbCwgMH0sCi0gIHsiY3IxIiwgQ29udHJvbCwgMX0sCi0gIHsiY3IyIiwgQ29udHJvbCwgMn0sCi0gIHsiY3IzIiwgQ29udHJvbCwgM30sCi0gIHsiY3I0IiwgQ29udHJvbCwgNH0sCi0gIHsiY3I1IiwgQ29udHJvbCwgNX0sCi0gIHsiY3I2IiwgQ29udHJvbCwgNn0sCi0gIHsiY3I3IiwgQ29udHJvbCwgN30sCi0gIC8qIGRlYnVnIHJlZ2lzdGVycyAqLwotICB7ImRiMCIsIERlYnVnLCAwfSwKLSAgeyJkYjEiLCBEZWJ1ZywgMX0sCi0gIHsiZGIyIiwgRGVidWcsIDJ9LAotICB7ImRiMyIsIERlYnVnLCAzfSwKLSAgeyJkYjQiLCBEZWJ1ZywgNH0sCi0gIHsiZGI1IiwgRGVidWcsIDV9LAotICB7ImRiNiIsIERlYnVnLCA2fSwKLSAgeyJkYjciLCBEZWJ1ZywgN30sCi0gIHsiZHIwIiwgRGVidWcsIDB9LAotICB7ImRyMSIsIERlYnVnLCAxfSwKLSAgeyJkcjIiLCBEZWJ1ZywgMn0sCi0gIHsiZHIzIiwgRGVidWcsIDN9LAotICB7ImRyNCIsIERlYnVnLCA0fSwKLSAgeyJkcjUiLCBEZWJ1ZywgNX0sCi0gIHsiZHI2IiwgRGVidWcsIDZ9LAotICB7ImRyNyIsIERlYnVnLCA3fSwKLSAgLyogdGVzdCByZWdpc3RlcnMgKi8KLSAgeyJ0cjAiLCBUZXN0LCAwfSwKLSAgeyJ0cjEiLCBUZXN0LCAxfSwKLSAgeyJ0cjIiLCBUZXN0LCAyfSwKLSAgeyJ0cjMiLCBUZXN0LCAzfSwKLSAgeyJ0cjQiLCBUZXN0LCA0fSwKLSAgeyJ0cjUiLCBUZXN0LCA1fSwKLSAgeyJ0cjYiLCBUZXN0LCA2fSwKLSAgeyJ0cjciLCBUZXN0LCA3fSwKLSAgLyogbW14IGFuZCBzaW1kIHJlZ2lzdGVycyAqLwotICB7Im1tMCIsIFJlZ01NWCwgMH0sCi0gIHsibW0xIiwgUmVnTU1YLCAxfSwKLSAgeyJtbTIiLCBSZWdNTVgsIDJ9LAotICB7Im1tMyIsIFJlZ01NWCwgM30sCi0gIHsibW00IiwgUmVnTU1YLCA0fSwKLSAgeyJtbTUiLCBSZWdNTVgsIDV9LAotICB7Im1tNiIsIFJlZ01NWCwgNn0sCi0gIHsibW03IiwgUmVnTU1YLCA3fSwKLSAgeyJ4bW0wIiwgUmVnWE1NLCAwfSwKLSAgeyJ4bW0xIiwgUmVnWE1NLCAxfSwKLSAgeyJ4bW0yIiwgUmVnWE1NLCAyfSwKLSAgeyJ4bW0zIiwgUmVnWE1NLCAzfSwKLSAgeyJ4bW00IiwgUmVnWE1NLCA0fSwKLSAgeyJ4bW01IiwgUmVnWE1NLCA1fSwKLSAgeyJ4bW02IiwgUmVnWE1NLCA2fSwKLSAgeyJ4bW03IiwgUmVnWE1NLCA3fQotfTsKLQotc3RhdGljIGNvbnN0IHJlZ19lbnRyeSBpMzg2X2Zsb2F0X3JlZ3RhYltdID0gewotICB7InN0KDApIiwgRmxvYXRSZWd8RmxvYXRBY2MsIDB9LAotICB7InN0KDEpIiwgRmxvYXRSZWcsIDF9LAotICB7InN0KDIpIiwgRmxvYXRSZWcsIDJ9LAotICB7InN0KDMpIiwgRmxvYXRSZWcsIDN9LAotICB7InN0KDQpIiwgRmxvYXRSZWcsIDR9LAotICB7InN0KDUpIiwgRmxvYXRSZWcsIDV9LAotICB7InN0KDYpIiwgRmxvYXRSZWcsIDZ9LAotICB7InN0KDcpIiwgRmxvYXRSZWcsIDd9Ci19OwotCi0jZGVmaW5lIE1BWF9SRUdfTkFNRV9TSVpFIDgJLyogZm9yIHBhcnNpbmcgcmVnaXN0ZXIgbmFtZXMgZnJvbSBpbnB1dCAqLwotCi0vKiBzZWdtZW50IHN0dWZmICovCi1zdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGNzID0geyAiY3MiLCAweDJlIH07Ci1zdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGRzID0geyAiZHMiLCAweDNlIH07Ci1zdGF0aWMgY29uc3Qgc2VnX2VudHJ5IHNzID0geyAic3MiLCAweDM2IH07Ci1zdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGVzID0geyAiZXMiLCAweDI2IH07Ci1zdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGZzID0geyAiZnMiLCAweDY0IH07Ci1zdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGdzID0geyAiZ3MiLCAweDY1IH07Ci0KLS8qIGVuZCBvZiBvcGNvZGUvaTM4Ni5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9pODYwLmggYi9pbmNsdWRlL29wY29kZS9pODYwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZWJkMjUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvaTg2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkxICswLDAgQEAKLS8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBpODYwLgotICAgQ29weXJpZ2h0IChDKSAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLCBhbmQgR0RCLCB0aGUgR05VIGRpc2Fzc2VtYmxlci4KLQotR0FTL0dEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUy9HREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVMgb3IgR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgIWRlZmluZWQoX19TVERDX18pICYmICFkZWZpbmVkKGNvbnN0KQotI2RlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qCi0gKiBTdHJ1Y3R1cmUgb2YgYW4gb3Bjb2RlIHRhYmxlIGVudHJ5LgotICovCi1zdHJ1Y3QgaTg2MF9vcGNvZGUKLXsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIHVuc2lnbmVkIGxvbmcgbWF0Y2g7CS8qIEJpdHMgdGhhdCBtdXN0IGJlIHNldC4gICovCi0gICAgdW5zaWduZWQgbG9uZyBsb3NlOwkvKiBCaXRzIHRoYXQgbXVzdCBub3QgYmUgc2V0LiAgKi8KLSAgICBjb25zdCBjaGFyICphcmdzOwotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBpcyBhIHBvc3NpYmxlIGV4cGFuZC1pbnN0cnVjdGlvbi4gICovCi0gICAgY2hhciBleHBhbmQ7Ci19OwotCi1lbnVtIGV4cGFuZF90eXBlCi17Ci0gICAgRV9NT1YgPSAxLCBFX0FERFIsIEVfVTMyLCBFX0FORCwgRV9TMzIsIEVfREVMQVkKLX07Ci0KLS8qCi0gICBBbGwgaTg2MCBvcGNvZGVzIGFyZSAzMiBiaXRzLCBleGNlcHQgZm9yIHRoZSBwc2V1ZG9pbnN0cnVjdGlvbnMKLSAgIGFuZCB0aGUgb3BlcmF0aW9ucyB1dGlsaXppbmcgYSAzMi1iaXQgYWRkcmVzcyBleHByZXNzaW9uLCBhbgotICAgdW5zaWduZWQgMzItYml0IGNvbnN0YW50LCBvciBhIHNpZ25lZCAzMi1iaXQgY29uc3RhbnQuCi0gICBUaGVzZSBvcGNvZGVzIGFyZSBleHBhbmRlZCBpbnRvIGEgdHdvLWluc3RydWN0aW9uIHNlcXVlbmNlIGZvcgotICAgYW55IHNpdHVhdGlvbiB3aGVyZSB0aGUgaW1tZWRpYXRlIG9wZXJhbmQgZG9lcyBub3QgZml0IGluIDMyIGJpdHMuCi0gICBJbiB0aGUgY2FzZSBvZiB0aGUgYWRkIGFuZCBzdWJ0cmFjdCBvcGVyYXRpb25zIHRoZSBleHBhbnNpb24gaXMKLSAgIHRvIGEgdGhyZWUtaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgKGV4OiBvcmgsIG9yLCBhZGRzKS4gIEluIGNhc2VzCi0gICB3aGVyZSB0aGUgYWRkcmVzcyBpcyB0byBiZSByZWxvY2F0ZWQsIHRoZSBpbnN0cnVjdGlvbiBpcwotICAgZXhwYW5kZWQgdG8gaGFuZGxlIHRoZSB3b3JzZSBjYXNlLCB0aGlzIGNvdWxkIGJlIG9wdGltaXplZCBhdAotICAgdGhlIGZpbmFsIGxpbmsgaWYgdGhlIGFjdHVhbCBhZGRyZXNzIHdlcmUga25vd24uCi0KLSAgIFRoZSBwc2V1ZG9pbnN0cnVjdGlvbnMgYXJlOiAgbW92LCBmbW92LCBwbW92LCBub3AsIGFuZCBmbm9wLgotICAgVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBhcyBhIG9uZSBvciB0d28gaW5zdHJ1Y3Rpb24KLSAgIHNlcXVlbmNlIG9mIG90aGVyIG9wZXJhdGlvbnMuCi0KLSAgIFRoZSBtYXRjaCBjb21wb25lbnQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2ggYQotICAgcGFydGljdWxhciBvcGNvZGUgaW4gb3JkZXIgZm9yIGFuIGluc3RydWN0aW9uIHRvIGJlIGFuIGluc3RhbmNlCi0gICBvZiB0aGF0IG9wY29kZS4KLQotICAgVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGNoYXJhY3RlcgotICAgZm9yIGVhY2ggb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLUtpbmRzIG9mIG9wZXJhbmRzOgotICAgIyAgICBOdW1iZXIgdXNlZCBieSBvcHRpbWl6ZXIuICBJdCBpcyBpZ25vcmVkLgotICAgMSAgICBzcmMxIGludGVnZXIgcmVnaXN0ZXIuCi0gICAyICAgIHNyYzIgaW50ZWdlciByZWdpc3Rlci4KLSAgIGQgICAgZGVzdCByZWdpc3Rlci4KLSAgIGMJY3RybHJlZyBjb250cm9sIHJlZ2lzdGVyLgotICAgaSAgICAxNiBiaXQgaW1tZWRpYXRlLgotICAgSSAgICAxNiBiaXQgaW1tZWRpYXRlLCBhbGlnbmVkLgotICAgNSAgICA1IGJpdCBpbW1lZGlhdGUuCi0gICBsICAgIGxicm9mZiAyNiBiaXQgUEMgcmVsYXRpdmUgaW1tZWRpYXRlLgotICAgciAgICBzYnJvZmYgMTYgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4KLSAgIHMJc3BsaXQgMTYgYml0IGltbWVkaWF0ZS4KLSAgIFMJc3BsaXQgMTYgYml0IGltbWVkaWF0ZSwgYWxpZ25lZC4KLSAgIGUgICAgc3JjMSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KLSAgIGYgICAgc3JjMiBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KLSAgIGcgICAgZGVzdCBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KLQotKi8KLQotLyogVGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzIGluIHRoaXMgdGFibGUgaXMgc2lnbmlmaWNhbnQ6Ci0gICAKLSAgICogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZQotICAgY29uc2VjdXRpdmUuICBJZiB0aGV5IGFyZW4ndCwgdGhlIGFzc2VtYmxlciB3aWxsIGJvbWIgYXQgcnVudGltZS4KLQotICAgKiBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBub3QgY2FyZSBhYm91dCB0aGUgb3JkZXIgb2YgdGhlIG9wY29kZXMuICAqLwotCi1zdGF0aWMgc3RydWN0IGk4NjBfb3Bjb2RlIGk4NjBfb3Bjb2Rlc1tdID0KLXsKLQotLyogUkVHLUZvcm1hdCBJbnN0cnVjdGlvbnMgKi8KLXsgImxkLmMiLAkweDMwMDAwMDAwLCAweGNjMDAwMDAwLCAiYyxkIiwgMCB9LAkvKiBsZC5jIGNzcmMyLGlkZXN0ICovCi17ICJsZC5iIiwJMHgwMDAwMDAwMCwgMHhmYzAwMDAwMCwgIjEoMiksZCIsIDAgfSwJLyogbGQuYiBpc3JjMShpc3JjMiksaWRlc3QgKi8KLXsgImxkLmIiLAkweDA0MDAwMDAwLCAweGY4MDAwMDAwLCAiSSgyKSxkIiwgRV9BRERSIH0sCS8qIGxkLmIgI2NvbnN0KGlzcmMyKSxpZGVzdCAqLwoteyAibGQucyIsCTB4MTAwMDAwMDAsIDB4ZWMwMDAwMDEsICIxKDIpLGQiLCAwIH0sCS8qIGxkLnMgaXNyYzEoaXNyYzIpLGlkZXN0ICovCi17ICJsZC5zIiwJMHgxNDAwMDAwMSwgMHhlODAwMDAwMCwgIkkoMiksZCIsIEVfQUREUiB9LAkvKiBsZC5zICNjb25zdChpc3JjMiksaWRlc3QgKi8KLXsgImxkLmwiLAkweDEwMDAwMDAxLCAweGVjMDAwMDAwLCAiMSgyKSxkIiwgMCB9LAkvKiBsZC5sIGlzcmMxKGlzcmMyKSxpZGVzdCAqLwoteyAibGQubCIsCTB4MTQwMDAwMDEsIDB4ZTgwMDAwMDAsICJJKDIpLGQiLCBFX0FERFIgfSwJLyogbGQubCAjY29uc3QoaXNyYzIpLGlkZXN0ICovCi0KLXsgInN0LmMiLAkweDM4MDAwMDAwLCAweGM0MDAwMDAwLCAiMSxjIiwgMCB9LAkvKiBzdC5jIGlzcmMxbmksY3NyYzIgKi8KLXsgInN0LmIiLAkweDBjMDAwMDAwLCAweGYwMDAwMDAwLCAiMSxTKDIpIiwgRV9BRERSIH0sCS8qIHN0LmIgaXNyYzFuaSwjY29uc3QoaXNyYzIpICovCi17ICJzdC5zIiwJMHgxYzAwMDAwMCwgMHhlMDAwMDAwMCwgIjEsUygyKSIsIEVfQUREUiB9LAkvKiBzdC5zIGlzcmMxbmksI2NvbnN0KGlzcmMyKSAqLwoteyAic3QubCIsCTB4MWMwMDAwMDEsIDB4ZTAwMDAwMDAsICIxLFMoMikiLCBFX0FERFIgfSwJLyogc3QubCBpc3JjMW5pLCNjb25zdChpc3JjMikgKi8KLQoteyAiaXhmciIsCTB4MDgwMDAwMDAsIDB4ZjQwMDAwMDAsICIxLGciLCAwIH0sCS8qIGl4ZnIgaXNyYzFuaSxmZGVzdCAqLwotCi17ICJmbGQubCIsCTB4MjAwMDAwMDIsIDB4ZGMwMDAwMDEsICIxKDIpLGciLCAwIH0sCS8qIGZsZC5sIGlzcmMxKGlzcmMyKSxmZGVzdCAqLwoteyAiZmxkLmwiLAkweDI0MDAwMDAyLCAweGQ4MDAwMDAxLCAiaSgyKSxnIiwgRV9BRERSIH0sCS8qIGZsZC5sICNjb25zdChpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5sIiwJMHgyMDAwMDAwMywgMHhkYzAwMDAwMCwgIjEoMikrKyxnIiwgMCB9LAkvKiBmbGQubCBpc3JjMShpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLmwiLAkweDI0MDAwMDAzLCAweGQ4MDAwMDAwLCAiaSgyKSsrLGciLCBFX0FERFIgfSwJLyogZmxkLmwgI2NvbnN0KGlzcmMyKSsrLGZkZXN0ICovCi17ICJmbGQuZCIsCTB4MjAwMDAwMDAsIDB4ZGMwMDAwMDcsICIxKDIpLGciLCAwIH0sCS8qIGZsZC5kIGlzcmMxKGlzcmMyKSxmZGVzdCAqLwoteyAiZmxkLmQiLAkweDI0MDAwMDAwLCAweGQ4MDAwMDA3LCAiaSgyKSxnIiwgRV9BRERSIH0sCS8qIGZsZC5kICNjb25zdChpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5kIiwJMHgyMDAwMDAwMSwgMHhkYzAwMDAwNiwgIjEoMikrKyxnIiwgMCB9LAkvKiBmbGQuZCBpc3JjMShpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLmQiLAkweDI0MDAwMDAxLCAweGQ4MDAwMDA2LCAiaSgyKSsrLGciLCBFX0FERFIgfSwJLyogZmxkLmQgI2NvbnN0KGlzcmMyKSsrLGZkZXN0ICovCi17ICJmbGQucSIsCTB4MjAwMDAwMDQsIDB4ZGMwMDAwMDMsICIxKDIpLGciLCAwIH0sCS8qIGZsZC5xIGlzcmMxKGlzcmMyKSxmZGVzdCAqLwoteyAiZmxkLnEiLAkweDI0MDAwMDA0LCAweGQ4MDAwMDAzLCAiaSgyKSxnIiwgRV9BRERSIH0sCS8qIGZsZC5xICNjb25zdChpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5xIiwJMHgyMDAwMDAwNSwgMHhkYzAwMDAwMiwgIjEoMikrKyxnIiwgMCB9LAkvKiBmbGQucSBpc3JjMShpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLnEiLAkweDI0MDAwMDA1LCAweGQ4MDAwMDAyLCAiaSgyKSsrLGciLCBFX0FERFIgfSwJLyogZmxkLnEgI2NvbnN0KGlzcmMyKSsrLGZkZXN0ICovCi0KLXsgInBmbGQubCIsCTB4NjAwMDAwMDAsIDB4OWMwMDAwMDMsICIxKDIpLGciLCAwIH0sCS8qIHBmbGQubCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgInBmbGQubCIsCTB4NjQwMDAwMDAsIDB4OTgwMDAwMDMsICJpKDIpLGciLCBFX0FERFIgfSwJLyogcGZsZC5sICNjb25zdChpc3JjMiksZmRlc3QgKi8KLXsgInBmbGQubCIsCTB4NjAwMDAwMDEsIDB4OWMwMDAwMDIsICIxKDIpKyssZyIsIDAgfSwJLyogcGZsZC5sIGlzcmMxKGlzcmMyKSsrLGZkZXN0ICovCi17ICJwZmxkLmwiLAkweDY0MDAwMDAxLCAweDk4MDAwMDAyLCAiaSgyKSsrLGciLCBFX0FERFIgfSwJLyogcGZsZC5sICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwoteyAicGZsZC5kIiwJMHg2MDAwMDAwMCwgMHg5YzAwMDAwNywgIjEoMiksZyIsIDAgfSwJLyogcGZsZC5kIGlzcmMxKGlzcmMyKSxmZGVzdCAqLwoteyAicGZsZC5kIiwJMHg2NDAwMDAwMCwgMHg5ODAwMDAwNywgImkoMiksZyIsIEVfQUREUiB9LAkvKiBwZmxkLmQgI2NvbnN0KGlzcmMyKSxmZGVzdCAqLwoteyAicGZsZC5kIiwJMHg2MDAwMDAwMSwgMHg5YzAwMDAwNiwgIjEoMikrKyxnIiwgMCB9LAkvKiBwZmxkLmQgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjQwMDAwMDEsIDB4OTgwMDAwMDYsICJpKDIpKyssZyIsIEVfQUREUiB9LAkvKiBwZmxkLmQgI2NvbnN0KGlzcmMyKSsrLGZkZXN0ICovCi0KLXsgImZzdC5sIiwJMHgyODAwMDAwMiwgMHhkNDAwMDAwMSwgImcsMSgyKSIsIDAgfSwJLyogZnN0LmwgZmRlc3QsaXNyYzEoaXNyYzIpICovCi17ICJmc3QubCIsCTB4MmMwMDAwMDIsIDB4ZDAwMDAwMDEsICJnLGkoMikiLCBFX0FERFIgfSwJLyogZnN0LmwgZmRlc3QsI2NvbnN0KGlzcmMyKSAqLwoteyAiZnN0LmwiLAkweDI4MDAwMDAzLCAweGQ0MDAwMDAwLCAiZywxKDIpKysiLCAwIH0sCS8qIGZzdC5sIGZkZXN0LGlzcmMxKGlzcmMyKSsrICovCi17ICJmc3QubCIsCTB4MmMwMDAwMDMsIDB4ZDAwMDAwMDAsICJnLGkoMikrKyIsIEVfQUREUiB9LAkvKiBmc3QubCBmZGVzdCwjY29uc3QoaXNyYzIpKysgKi8KLXsgImZzdC5kIiwJMHgyODAwMDAwMCwgMHhkNDAwMDAwNywgImcsMSgyKSIsIDAgfSwJLyogZnN0LmQgZmRlc3QsaXNyYzEoaXNyYzIpICovCi17ICJmc3QuZCIsCTB4MmMwMDAwMDAsIDB4ZDAwMDAwMDcsICJnLGkoMikiLCBFX0FERFIgfSwJLyogZnN0LmQgZmRlc3QsI2NvbnN0KGlzcmMyKSAqLwoteyAiZnN0LmQiLAkweDI4MDAwMDAxLCAweGQ0MDAwMDA2LCAiZywxKDIpKysiLCAwIH0sCS8qIGZzdC5kIGZkZXN0LGlzcmMxKGlzcmMyKSsrICovCi17ICJmc3QuZCIsCTB4MmMwMDAwMDEsIDB4ZDAwMDAwMDYsICJnLGkoMikrKyIsIEVfQUREUiB9LAkvKiBmc3QuZCBmZGVzdCwjY29uc3QoaXNyYzIpKysgKi8KLQoteyAicHN0LmQiLAkweDNjMDAwMDAwLCAweGMwMDAwMDA3LCAiZyxpKDIpIiwgRV9BRERSIH0sCS8qIHBzdC5kIGZkZXN0LCNjb25zdChpc3JjMikgKi8KLXsgInBzdC5kIiwJMHgzYzAwMDAwMSwgMHhjMDAwMDAwNiwgImcsaSgyKSsrIiwgRV9BRERSIH0sCS8qIHBzdC5kIGZkZXN0LCNjb25zdChpc3JjMikrKyAqLwotCi17ICJhZGR1IiwJMHg4MDAwMDAwMCwgMHg3YzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhZGR1IGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJhZGR1IiwJMHg4NDAwMDAwMCwgMHg3ODAwMDAwMCwgImksMixkIiwgRV9TMzIgfSwJLyogYWRkdSAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgImFkZHMiLAkweDkwMDAwMDAwLCAweDZjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFkZHMgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgImFkZHMiLAkweDk0MDAwMDAwLCAweDY4MDAwMDAwLCAiaSwyLGQiLCBFX1MzMiB9LAkvKiBhZGRzICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAic3VidSIsCTB4ODgwMDAwMDAsIDB4NzQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc3VidSBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAic3VidSIsCTB4OGMwMDAwMDAsIDB4NzAwMDAwMDAsICJpLDIsZCIsIEVfUzMyIH0sCS8qIHN1YnUgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJzdWJzIiwJMHg5ODAwMDAwMCwgMHg2NDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBzdWJzIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJzdWJzIiwJMHg5YzAwMDAwMCwgMHg2MDAwMDAwMCwgImksMixkIiwgRV9TMzIgfSwJLyogc3VicyAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLQoteyAic2hsIiwJMHhhMDAwMDAwMCwgMHg1YzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBzaGwgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInNobCIsCTB4YTQwMDAwMDAsIDB4NTgwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogc2hsICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAic2hyIiwJMHhhODAwMDAwMCwgMHg1NDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBzaHIgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInNociIsCTB4YWMwMDAwMDAsIDB4NTAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogc2hyICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAic2hyZCIsCTB4YjAwMDAwMDAsIDB4NGMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc2hyZCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAic2hyYSIsCTB4YjgwMDAwMDAsIDB4NDQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc2hyYSBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAic2hyYSIsCTB4YmMwMDAwMDAsIDB4NDAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogc2hyYSAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLQoteyAibW92IiwJMHhhMDAwMDAwMCwgMHg1YzAwZjgwMCwgIjIsZCIsIDAgfSwJLyogc2hsIHIwLGlzcmMyLGlkZXN0ICovCi17ICJtb3YiLAkweDk0MDAwMDAwLCAweDY5ZTAwMDAwLCAiaSxkIiwgRV9NT1YgfSwJLyogYWRkcyAjY29uc3QscjAsaWRlc3QgKi8KLXsgIm5vcCIsCTB4YTAwMDAwMDAsIDB4NWZmZmY4MDAsICIiLCAwIH0sCS8qIHNobCByMCxyMCxyMCAqLwoteyAiZm5vcCIsCTB4YjAwMDAwMDAsIDB4NGZmZmY4MDAsICIiLCAwIH0sCS8qIHNocmQgcjAscjAscjAgKi8KLQoteyAidHJhcCIsCTB4NDQwMDAwMDAsIDB4YjgwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogdHJhcCBpc3JjMW5pLGlzcmMyLGlkZXN0ICovCi0KLXsgImZsdXNoIiwJMHgzNDAwMDAwMCwgMHhjODFmMDAwMSwgImkoMikiLCBFX0FERFIgfSwJLyogZmx1c2ggI2NvbnN0KGlzcmMyKSAqLwoteyAiZmx1c2giLAkweDM0MDAwMDAxLCAweGM4MWYwMDAwLCAiaSgyKSsrIiwgRV9BRERSIH0sCS8qIGZsdXNoICNjb25zdChpc3JjMikrKyAqLwotCi17ICJhbmQiLAkweGMwMDAwMDAwLCAweDNjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFuZCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYW5kIiwJMHhjNDAwMDAwMCwgMHgzODAwMDAwMCwgImksMixkIiwgRV9BTkQgfSwJLyogYW5kICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAiYW5kaCIsCTB4YzgwMDAwMDAsIDB4MzQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYW5kaCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYW5kaCIsCTB4Y2MwMDAwMDAsIDB4MzAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogYW5kaCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgImFuZG5vdCIsCTB4ZDAwMDAwMDAsIDB4MmMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYW5kbm90IGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJhbmRub3QiLAkweGQ0MDAwMDAwLCAweDI4MDAwMDAwLCAiaSwyLGQiLCBFX1UzMiB9LAkvKiBhbmRub3QgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJhbmRub3RoIiwJMHhkODAwMDAwMCwgMHgyNDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhbmRub3RoIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJhbmRub3RoIiwJMHhkYzAwMDAwMCwgMHgyMDAwMDAwMCwgImksMixkIiwgMCB9LAkvKiBhbmRub3RoICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAib3IiLAkJMHhlMDAwMDAwMCwgMHgxYzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBvciBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAib3IiLAkJMHhlNDAwMDAwMCwgMHgxODAwMDAwMCwgImksMixkIiwgRV9VMzIgfSwJLyogb3IgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJvcmgiLAkweGU4MDAwMDAwLCAweDE0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIG9yaCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAib3JoIiwJMHhlYzAwMDAwMCwgMHgxMDAwMDAwMCwgImksMixkIiwgMCB9LAkvKiBvcmggI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJ4b3IiLAkweGYwMDAwMDAwLCAweDBjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHhvciBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAieG9yIiwJMHhmNDAwMDAwMCwgMHgwODAwMDAwMCwgImksMixkIiwgRV9VMzIgfSwJLyogeG9yICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAieG9yaCIsCTB4ZjgwMDAwMDAsIDB4MDQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogeG9yaCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAieG9yaCIsCTB4ZmMwMDAwMDAsIDB4MDAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogeG9yaCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLQoteyAiYnRlIiwJMHg1ODAwMDAwMCwgMHhhNDAwMDAwMCwgIjEsMixzIiwgMCB9LAkvKiBidGUgaXNyYzFzLGlzcmMyLHNicm9mZiAqLwoteyAiYnRlIiwJMHg1YzAwMDAwMCwgMHhhMDAwMDAwMCwgIjUsMixzIiwgMCB9LAkvKiBidGUgI2NvbnN0NSxpc3JjMixzYnJvZmYgKi8KLXsgImJ0bmUiLAkweDUwMDAwMDAwLCAweGFjMDAwMDAwLCAiMSwyLHMiLCAwIH0sCS8qIGJ0bmUgaXNyYzFzLGlzcmMyLHNicm9mZiAqLwoteyAiYnRuZSIsCTB4NTQwMDAwMDAsIDB4YTgwMDAwMDAsICI1LDIscyIsIDAgfSwJLyogYnRuZSAjY29uc3Q1LGlzcmMyLHNicm9mZiAqLwoteyAiYmxhIiwJMHhiNDAwMDAwMCwgMHg0ODAwMDAwMCwgIjEsMixzIiwgRV9ERUxBWSB9LAkvKiBibGEgaXNyYzFzLGlzcmMyLHNicm9mZiAqLwoteyAiYnJpIiwJMHg0MDAwMDAwMCwgMHhiYzAwMDAwMCwgIjEiLCBFX0RFTEFZIH0sCS8qIGJyaSBpc3JjMW5pICovCi0KLS8qIENvcmUgRXNjYXBlIEluc3RydWN0aW9uIEZvcm1hdCAqLwoteyAibG9jayIsCTB4NGMwMDAwMDEsIDB4YjAwMDAwMWUsICIiLCAwIH0sCS8qIGxvY2sgc2V0IEJMIGluIGRpcmJhc2UgKi8KLXsgImNhbGxpIiwJMHg0YzAwMDAwMiwgMHhiMDAwMDAxZCwgIjEiLCBFX0RFTEFZIH0sCS8qIGNhbGxpIGlzcmMxbmkgKi8KLXsgImludG92ciIsCTB4NGMwMDAwMDQsIDB4YjAwMDAwMWIsICIiLCAwIH0sCS8qIGludG92ciB0cmFwIG9uIGludGVnZXIgb3ZlcmZsb3cgKi8KLXsgInVubG9jayIsCTB4NGMwMDAwMDcsIDB4YjAwMDAwMTgsICIiLCAwIH0sCS8qIHVubG9jayBjbGVhciBCTCBpbiBkaXJiYXNlICovCi0KLS8qIENUUkwtRm9ybWF0IEluc3RydWN0aW9ucyAqLwoteyAiYnIiLAkJMHg2ODAwMDAwMCwgMHg5NDAwMDAwMCwgImwiLCBFX0RFTEFZIH0sCS8qIGJyIGxicm9mZiAqLwoteyAiY2FsbCIsCTB4NmMwMDAwMDAsIDB4OTAwMDAwMDAsICJsIiwgRV9ERUxBWSB9LAkvKiBjYWxsIGxicm9mZiAqLwoteyAiYmMiLAkJMHg3MDAwMDAwMCwgMHg4YzAwMDAwMCwgImwiLCAwIH0sCS8qIGJjIGxicm9mZiAqLwoteyAiYmMudCIsCTB4NzQwMDAwMDAsIDB4ODgwMDAwMDAsICJsIiwgRV9ERUxBWSB9LAkvKiBiYy50IGxicm9mZiAqLwoteyAiYm5jIiwJMHg3ODAwMDAwMCwgMHg4NDAwMDAwMCwgImwiLCAwIH0sCS8qIGJuYyBsYnJvZmYgKi8KLXsgImJuYy50IiwJMHg3YzAwMDAwMCwgMHg4MDAwMDAwMCwgImwiLCBFX0RFTEFZIH0sCS8qIGJuYy50IGxicm9mZiAqLwotCi0vKiBGbG9hdGluZyBQb2ludCBFc2NhcGUgSW5zdHJ1Y3Rpb24gRm9ybWF0IC0gcGZhbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJyMnAxLnNzIiwJMHg0ODAwMDQwMCwgMHhiNDAwMDNmZiwgImUsZixnIiwgMCB9LAoteyAicjJwMS5zZCIsCTB4NDgwMDA0ODAsIDB4YjQwMDAzN2YsICJlLGYsZyIsIDAgfSwKLXsgInIycDEuZGQiLAkweDQ4MDAwNTgwLCAweGI0MDAwMjdmLCAiZSxmLGciLCAwIH0sCi17ICJyMnB0LnNzIiwJMHg0ODAwMDQwMSwgMHhiNDAwMDNmZSwgImUsZixnIiwgMCB9LAoteyAicjJwdC5zZCIsCTB4NDgwMDA0ODEsIDB4YjQwMDAzN2UsICJlLGYsZyIsIDAgfSwKLXsgInIycHQuZGQiLAkweDQ4MDAwNTgxLCAweGI0MDAwMjdlLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwMS5zcyIsCTB4NDgwMDA0MDIsIDB4YjQwMDAzZmQsICJlLGYsZyIsIDAgfSwKLXsgInIyYXAxLnNkIiwJMHg0ODAwMDQ4MiwgMHhiNDAwMDM3ZCwgImUsZixnIiwgMCB9LAoteyAicjJhcDEuZGQiLAkweDQ4MDAwNTgyLCAweGI0MDAwMjdkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwdC5zcyIsCTB4NDgwMDA0MDMsIDB4YjQwMDAzZmMsICJlLGYsZyIsIDAgfSwKLXsgInIyYXB0LnNkIiwJMHg0ODAwMDQ4MywgMHhiNDAwMDM3YywgImUsZixnIiwgMCB9LAoteyAicjJhcHQuZGQiLAkweDQ4MDAwNTgzLCAweGI0MDAwMjdjLCAiZSxmLGciLCAwIH0sCi17ICJpMnAxLnNzIiwJMHg0ODAwMDQwNCwgMHhiNDAwMDNmYiwgImUsZixnIiwgMCB9LAoteyAiaTJwMS5zZCIsCTB4NDgwMDA0ODQsIDB4YjQwMDAzN2IsICJlLGYsZyIsIDAgfSwKLXsgImkycDEuZGQiLAkweDQ4MDAwNTg0LCAweGI0MDAwMjdiLCAiZSxmLGciLCAwIH0sCi17ICJpMnB0LnNzIiwJMHg0ODAwMDQwNSwgMHhiNDAwMDNmYSwgImUsZixnIiwgMCB9LAoteyAiaTJwdC5zZCIsCTB4NDgwMDA0ODUsIDB4YjQwMDAzN2EsICJlLGYsZyIsIDAgfSwKLXsgImkycHQuZGQiLAkweDQ4MDAwNTg1LCAweGI0MDAwMjdhLCAiZSxmLGciLCAwIH0sCi17ICJpMmFwMS5zcyIsCTB4NDgwMDA0MDYsIDB4YjQwMDAzZjksICJlLGYsZyIsIDAgfSwKLXsgImkyYXAxLnNkIiwJMHg0ODAwMDQ4NiwgMHhiNDAwMDM3OSwgImUsZixnIiwgMCB9LAoteyAiaTJhcDEuZGQiLAkweDQ4MDAwNTg2LCAweGI0MDAwMjc5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFwdC5zcyIsCTB4NDgwMDA0MDcsIDB4YjQwMDAzZjgsICJlLGYsZyIsIDAgfSwKLXsgImkyYXB0LnNkIiwJMHg0ODAwMDQ4NywgMHhiNDAwMDM3OCwgImUsZixnIiwgMCB9LAoteyAiaTJhcHQuZGQiLAkweDQ4MDAwNTg3LCAweGI0MDAwMjc4LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxcDIuc3MiLAkweDQ4MDAwNDA4LCAweGI0MDAwM2Y3LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxcDIuc2QiLAkweDQ4MDAwNDg4LCAweGI0MDAwMzc3LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxcDIuZGQiLAkweDQ4MDAwNTg4LCAweGI0MDAwMjc3LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhcG0uc3MiLAkweDQ4MDAwNDA5LCAweGI0MDAwM2Y2LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhcG0uc2QiLAkweDQ4MDAwNDg5LCAweGI0MDAwMzc2LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhcG0uZGQiLAkweDQ4MDAwNTg5LCAweGI0MDAwMjc2LCAiZSxmLGciLCAwIH0sCi17ICJyYTFwMi5zcyIsCTB4NDgwMDA0MGEsIDB4YjQwMDAzZjUsICJlLGYsZyIsIDAgfSwKLXsgInJhMXAyLnNkIiwJMHg0ODAwMDQ4YSwgMHhiNDAwMDM3NSwgImUsZixnIiwgMCB9LAoteyAicmExcDIuZGQiLAkweDQ4MDAwNThhLCAweGI0MDAwMjc1LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHBhLnNzIiwJMHg0ODAwMDQwYiwgMHhiNDAwMDNmNCwgImUsZixnIiwgMCB9LAoteyAibTEydHRwYS5zZCIsCTB4NDgwMDA0OGIsIDB4YjQwMDAzNzQsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0cGEuZGQiLAkweDQ4MDAwNThiLCAweGI0MDAwMjc0LCAiZSxmLGciLCAwIH0sCi17ICJpYXQxcDIuc3MiLAkweDQ4MDAwNDBjLCAweGI0MDAwM2YzLCAiZSxmLGciLCAwIH0sCi17ICJpYXQxcDIuc2QiLAkweDQ4MDAwNDhjLCAweGI0MDAwMzczLCAiZSxmLGciLCAwIH0sCi17ICJpYXQxcDIuZGQiLAkweDQ4MDAwNThjLCAweGI0MDAwMjczLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0cG0uc3MiLAkweDQ4MDAwNDBkLCAweGI0MDAwM2YyLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0cG0uc2QiLAkweDQ4MDAwNDhkLCAweGI0MDAwMzcyLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0cG0uZGQiLAkweDQ4MDAwNThkLCAweGI0MDAwMjcyLCAiZSxmLGciLCAwIH0sCi17ICJpYTFwMi5zcyIsCTB4NDgwMDA0MGUsIDB4YjQwMDAzZjEsICJlLGYsZyIsIDAgfSwKLXsgImlhMXAyLnNkIiwJMHg0ODAwMDQ4ZSwgMHhiNDAwMDM3MSwgImUsZixnIiwgMCB9LAoteyAiaWExcDIuZGQiLAkweDQ4MDAwNThlLCAweGI0MDAwMjcxLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0cGEuc3MiLAkweDQ4MDAwNDBmLCAweGI0MDAwM2YwLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0cGEuc2QiLAkweDQ4MDAwNDhmLCAweGI0MDAwMzcwLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0cGEuZGQiLAkweDQ4MDAwNThmLCAweGI0MDAwMjcwLCAiZSxmLGciLCAwIH0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgLSBwZnNtLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInIyczEuc3MiLAkweDQ4MDAwNDEwLCAweGI0MDAwM2VmLCAiZSxmLGciLCAwIH0sCi17ICJyMnMxLnNkIiwJMHg0ODAwMDQ5MCwgMHhiNDAwMDM2ZiwgImUsZixnIiwgMCB9LAoteyAicjJzMS5kZCIsCTB4NDgwMDA1OTAsIDB4YjQwMDAyNmYsICJlLGYsZyIsIDAgfSwKLXsgInIyc3Quc3MiLAkweDQ4MDAwNDExLCAweGI0MDAwM2VlLCAiZSxmLGciLCAwIH0sCi17ICJyMnN0LnNkIiwJMHg0ODAwMDQ5MSwgMHhiNDAwMDM2ZSwgImUsZixnIiwgMCB9LAoteyAicjJzdC5kZCIsCTB4NDgwMDA1OTEsIDB4YjQwMDAyNmUsICJlLGYsZyIsIDAgfSwKLXsgInIyYXMxLnNzIiwJMHg0ODAwMDQxMiwgMHhiNDAwMDNlZCwgImUsZixnIiwgMCB9LAoteyAicjJhczEuc2QiLAkweDQ4MDAwNDkyLCAweGI0MDAwMzZkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzMS5kZCIsCTB4NDgwMDA1OTIsIDB4YjQwMDAyNmQsICJlLGYsZyIsIDAgfSwKLXsgInIyYXN0LnNzIiwJMHg0ODAwMDQxMywgMHhiNDAwMDNlYywgImUsZixnIiwgMCB9LAoteyAicjJhc3Quc2QiLAkweDQ4MDAwNDkzLCAweGI0MDAwMzZjLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzdC5kZCIsCTB4NDgwMDA1OTMsIDB4YjQwMDAyNmMsICJlLGYsZyIsIDAgfSwKLXsgImkyczEuc3MiLAkweDQ4MDAwNDE0LCAweGI0MDAwM2ViLCAiZSxmLGciLCAwIH0sCi17ICJpMnMxLnNkIiwJMHg0ODAwMDQ5NCwgMHhiNDAwMDM2YiwgImUsZixnIiwgMCB9LAoteyAiaTJzMS5kZCIsCTB4NDgwMDA1OTQsIDB4YjQwMDAyNmIsICJlLGYsZyIsIDAgfSwKLXsgImkyc3Quc3MiLAkweDQ4MDAwNDE1LCAweGI0MDAwM2VhLCAiZSxmLGciLCAwIH0sCi17ICJpMnN0LnNkIiwJMHg0ODAwMDQ5NSwgMHhiNDAwMDM2YSwgImUsZixnIiwgMCB9LAoteyAiaTJzdC5kZCIsCTB4NDgwMDA1OTUsIDB4YjQwMDAyNmEsICJlLGYsZyIsIDAgfSwKLXsgImkyYXMxLnNzIiwJMHg0ODAwMDQxNiwgMHhiNDAwMDNlOSwgImUsZixnIiwgMCB9LAoteyAiaTJhczEuc2QiLAkweDQ4MDAwNDk2LCAweGI0MDAwMzY5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFzMS5kZCIsCTB4NDgwMDA1OTYsIDB4YjQwMDAyNjksICJlLGYsZyIsIDAgfSwKLXsgImkyYXN0LnNzIiwJMHg0ODAwMDQxNywgMHhiNDAwMDNlOCwgImUsZixnIiwgMCB9LAoteyAiaTJhc3Quc2QiLAkweDQ4MDAwNDk3LCAweGI0MDAwMzY4LCAiZSxmLGciLCAwIH0sCi17ICJpMmFzdC5kZCIsCTB4NDgwMDA1OTcsIDB4YjQwMDAyNjgsICJlLGYsZyIsIDAgfSwKLXsgInJhdDFzMi5zcyIsCTB4NDgwMDA0MTgsIDB4YjQwMDAzZTcsICJlLGYsZyIsIDAgfSwKLXsgInJhdDFzMi5zZCIsCTB4NDgwMDA0OTgsIDB4YjQwMDAzNjcsICJlLGYsZyIsIDAgfSwKLXsgInJhdDFzMi5kZCIsCTB4NDgwMDA1OTgsIDB4YjQwMDAyNjcsICJlLGYsZyIsIDAgfSwKLXsgIm0xMmFzbS5zcyIsCTB4NDgwMDA0MTksIDB4YjQwMDAzZTYsICJlLGYsZyIsIDAgfSwKLXsgIm0xMmFzbS5zZCIsCTB4NDgwMDA0OTksIDB4YjQwMDAzNjYsICJlLGYsZyIsIDAgfSwKLXsgIm0xMmFzbS5kZCIsCTB4NDgwMDA1OTksIDB4YjQwMDAyNjYsICJlLGYsZyIsIDAgfSwKLXsgInJhMXMyLnNzIiwJMHg0ODAwMDQxYSwgMHhiNDAwMDNlNSwgImUsZixnIiwgMCB9LAoteyAicmExczIuc2QiLAkweDQ4MDAwNDlhLCAweGI0MDAwMzY1LCAiZSxmLGciLCAwIH0sCi17ICJyYTFzMi5kZCIsCTB4NDgwMDA1OWEsIDB4YjQwMDAyNjUsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0c2Euc3MiLAkweDQ4MDAwNDFiLCAweGI0MDAwM2U0LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHNhLnNkIiwJMHg0ODAwMDQ5YiwgMHhiNDAwMDM2NCwgImUsZixnIiwgMCB9LAoteyAibTEydHRzYS5kZCIsCTB4NDgwMDA1OWIsIDB4YjQwMDAyNjQsICJlLGYsZyIsIDAgfSwKLXsgImlhdDFzMi5zcyIsCTB4NDgwMDA0MWMsIDB4YjQwMDAzZTMsICJlLGYsZyIsIDAgfSwKLXsgImlhdDFzMi5zZCIsCTB4NDgwMDA0OWMsIDB4YjQwMDAzNjMsICJlLGYsZyIsIDAgfSwKLXsgImlhdDFzMi5kZCIsCTB4NDgwMDA1OWMsIDB4YjQwMDAyNjMsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRzbS5zcyIsCTB4NDgwMDA0MWQsIDB4YjQwMDAzZTIsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRzbS5zZCIsCTB4NDgwMDA0OWQsIDB4YjQwMDAzNjIsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRzbS5kZCIsCTB4NDgwMDA1OWQsIDB4YjQwMDAyNjIsICJlLGYsZyIsIDAgfSwKLXsgImlhMXMyLnNzIiwJMHg0ODAwMDQxZSwgMHhiNDAwMDNlMSwgImUsZixnIiwgMCB9LAoteyAiaWExczIuc2QiLAkweDQ4MDAwNDllLCAweGI0MDAwMzYxLCAiZSxmLGciLCAwIH0sCi17ICJpYTFzMi5kZCIsCTB4NDgwMDA1OWUsIDB4YjQwMDAyNjEsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRzYS5zcyIsCTB4NDgwMDA0MWYsIDB4YjQwMDAzZTAsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRzYS5zZCIsCTB4NDgwMDA0OWYsIDB4YjQwMDAzNjAsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnRzYS5kZCIsCTB4NDgwMDA1OWYsIDB4YjQwMDAyNjAsICJlLGYsZyIsIDAgfSwKLQotLyogRmxvYXRpbmcgUG9pbnQgRXNjYXBlIEluc3RydWN0aW9uIEZvcm1hdCAtIHBmbWFtLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgIm1yMnAxLnNzIiwJMHg0ODAwMDAwMCwgMHhiNDAwMDdmZiwgImUsZixnIiwgMCB9LAoteyAibXIycDEuc2QiLAkweDQ4MDAwMDgwLCAweGI0MDAwNzdmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJwMS5kZCIsCTB4NDgwMDAxODAsIDB4YjQwMDA2N2YsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnB0LnNzIiwJMHg0ODAwMDAwMSwgMHhiNDAwMDdmZSwgImUsZixnIiwgMCB9LAoteyAibXIycHQuc2QiLAkweDQ4MDAwMDgxLCAweGI0MDAwNzdlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJwdC5kZCIsCTB4NDgwMDAxODEsIDB4YjQwMDA2N2UsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1wMS5zcyIsCTB4NDgwMDAwMDIsIDB4YjQwMDA3ZmQsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1wMS5zZCIsCTB4NDgwMDAwODIsIDB4YjQwMDA3N2QsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1wMS5kZCIsCTB4NDgwMDAxODIsIDB4YjQwMDA2N2QsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1wdC5zcyIsCTB4NDgwMDAwMDMsIDB4YjQwMDA3ZmMsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1wdC5zZCIsCTB4NDgwMDAwODMsIDB4YjQwMDA3N2MsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1wdC5kZCIsCTB4NDgwMDAxODMsIDB4YjQwMDA2N2MsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnAxLnNzIiwJMHg0ODAwMDAwNCwgMHhiNDAwMDdmYiwgImUsZixnIiwgMCB9LAoteyAibWkycDEuc2QiLAkweDQ4MDAwMDg0LCAweGI0MDAwNzdiLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwMS5kZCIsCTB4NDgwMDAxODQsIDB4YjQwMDA2N2IsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnB0LnNzIiwJMHg0ODAwMDAwNSwgMHhiNDAwMDdmYSwgImUsZixnIiwgMCB9LAoteyAibWkycHQuc2QiLAkweDQ4MDAwMDg1LCAweGI0MDAwNzdhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwdC5kZCIsCTB4NDgwMDAxODUsIDB4YjQwMDA2N2EsICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1wMS5zcyIsCTB4NDgwMDAwMDYsIDB4YjQwMDA3ZjksICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1wMS5zZCIsCTB4NDgwMDAwODYsIDB4YjQwMDA3NzksICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1wMS5kZCIsCTB4NDgwMDAxODYsIDB4YjQwMDA2NzksICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1wdC5zcyIsCTB4NDgwMDAwMDcsIDB4YjQwMDA3ZjgsICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1wdC5zZCIsCTB4NDgwMDAwODcsIDB4YjQwMDA3NzgsICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1wdC5kZCIsCTB4NDgwMDAxODcsIDB4YjQwMDA2NzgsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxcDIuc3MiLAkweDQ4MDAwMDA4LCAweGI0MDAwN2Y3LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXAyLnNkIiwJMHg0ODAwMDA4OCwgMHhiNDAwMDc3NywgImUsZixnIiwgMCB9LAoteyAibXJtdDFwMi5kZCIsCTB4NDgwMDAxODgsIDB4YjQwMDA2NzcsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtcG0uc3MiLAkweDQ4MDAwMDA5LCAweGI0MDAwN2Y2LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXBtLnNkIiwJMHg0ODAwMDA4OSwgMHhiNDAwMDc3NiwgImUsZixnIiwgMCB9LAoteyAibW0xMm1wbS5kZCIsCTB4NDgwMDAxODksIDB4YjQwMDA2NzYsICJlLGYsZyIsIDAgfSwKLXsgIm1ybTFwMi5zcyIsCTB4NDgwMDAwMGEsIDB4YjQwMDA3ZjUsICJlLGYsZyIsIDAgfSwKLXsgIm1ybTFwMi5zZCIsCTB4NDgwMDAwOGEsIDB4YjQwMDA3NzUsICJlLGYsZyIsIDAgfSwKLXsgIm1ybTFwMi5kZCIsCTB4NDgwMDAxOGEsIDB4YjQwMDA2NzUsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHBtLnNzIiwweDQ4MDAwMDBiLCAweGI0MDAwN2Y0LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRwbS5zZCIsMHg0ODAwMDA4YiwgMHhiNDAwMDc3NCwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0cG0uZGQiLDB4NDgwMDAxOGIsIDB4YjQwMDA2NzQsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxcDIuc3MiLAkweDQ4MDAwMDBjLCAweGI0MDAwN2YzLCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXAyLnNkIiwJMHg0ODAwMDA4YywgMHhiNDAwMDc3MywgImUsZixnIiwgMCB9LAoteyAibWltdDFwMi5kZCIsCTB4NDgwMDAxOGMsIDB4YjQwMDA2NzMsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0cG0uc3MiLAkweDQ4MDAwMDBkLCAweGI0MDAwN2YyLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHBtLnNkIiwJMHg0ODAwMDA4ZCwgMHhiNDAwMDc3MiwgImUsZixnIiwgMCB9LAoteyAibW0xMnRwbS5kZCIsCTB4NDgwMDAxOGQsIDB4YjQwMDA2NzIsICJlLGYsZyIsIDAgfSwKLXsgIm1pbTFwMi5zcyIsCTB4NDgwMDAwMGUsIDB4YjQwMDA3ZjEsICJlLGYsZyIsIDAgfSwKLXsgIm1pbTFwMi5zZCIsCTB4NDgwMDAwOGUsIDB4YjQwMDA3NzEsICJlLGYsZyIsIDAgfSwKLXsgIm1pbTFwMi5kZCIsCTB4NDgwMDAxOGUsIDB4YjQwMDA2NzEsICJlLGYsZyIsIDAgfSwKLQotLyogRmxvYXRpbmcgUG9pbnQgRXNjYXBlIEluc3RydWN0aW9uIEZvcm1hdCAtIHBmbXNtLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgIm1yMnMxLnNzIiwJMHg0ODAwMDAxMCwgMHhiNDAwMDdlZiwgImUsZixnIiwgMCB9LAoteyAibXIyczEuc2QiLAkweDQ4MDAwMDkwLCAweGI0MDAwNzZmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJzMS5kZCIsCTB4NDgwMDAxOTAsIDB4YjQwMDA2NmYsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnN0LnNzIiwJMHg0ODAwMDAxMSwgMHhiNDAwMDdlZSwgImUsZixnIiwgMCB9LAoteyAibXIyc3Quc2QiLAkweDQ4MDAwMDkxLCAweGI0MDAwNzZlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJzdC5kZCIsCTB4NDgwMDAxOTEsIDB4YjQwMDA2NmUsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1zMS5zcyIsCTB4NDgwMDAwMTIsIDB4YjQwMDA3ZWQsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1zMS5zZCIsCTB4NDgwMDAwOTIsIDB4YjQwMDA3NmQsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1zMS5kZCIsCTB4NDgwMDAxOTIsIDB4YjQwMDA2NmQsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1zdC5zcyIsCTB4NDgwMDAwMTMsIDB4YjQwMDA3ZWMsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1zdC5zZCIsCTB4NDgwMDAwOTMsIDB4YjQwMDA3NmMsICJlLGYsZyIsIDAgfSwKLXsgIm1yMm1zdC5kZCIsCTB4NDgwMDAxOTMsIDB4YjQwMDA2NmMsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnMxLnNzIiwJMHg0ODAwMDAxNCwgMHhiNDAwMDdlYiwgImUsZixnIiwgMCB9LAoteyAibWkyczEuc2QiLAkweDQ4MDAwMDk0LCAweGI0MDAwNzZiLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzMS5kZCIsCTB4NDgwMDAxOTQsIDB4YjQwMDA2NmIsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnN0LnNzIiwJMHg0ODAwMDAxNSwgMHhiNDAwMDdlYSwgImUsZixnIiwgMCB9LAoteyAibWkyc3Quc2QiLAkweDQ4MDAwMDk1LCAweGI0MDAwNzZhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzdC5kZCIsCTB4NDgwMDAxOTUsIDB4YjQwMDA2NmEsICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1zMS5zcyIsCTB4NDgwMDAwMTYsIDB4YjQwMDA3ZTksICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1zMS5zZCIsCTB4NDgwMDAwOTYsIDB4YjQwMDA3NjksICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1zMS5kZCIsCTB4NDgwMDAxOTYsIDB4YjQwMDA2NjksICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1zdC5zcyIsCTB4NDgwMDAwMTcsIDB4YjQwMDA3ZTgsICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1zdC5zZCIsCTB4NDgwMDAwOTcsIDB4YjQwMDA3NjgsICJlLGYsZyIsIDAgfSwKLXsgIm1pMm1zdC5kZCIsCTB4NDgwMDAxOTcsIDB4YjQwMDA2NjgsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxczIuc3MiLAkweDQ4MDAwMDE4LCAweGI0MDAwN2U3LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXMyLnNkIiwJMHg0ODAwMDA5OCwgMHhiNDAwMDc2NywgImUsZixnIiwgMCB9LAoteyAibXJtdDFzMi5kZCIsCTB4NDgwMDAxOTgsIDB4YjQwMDA2NjcsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtc20uc3MiLAkweDQ4MDAwMDE5LCAweGI0MDAwN2U2LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXNtLnNkIiwJMHg0ODAwMDA5OSwgMHhiNDAwMDc2NiwgImUsZixnIiwgMCB9LAoteyAibW0xMm1zbS5kZCIsCTB4NDgwMDAxOTksIDB4YjQwMDA2NjYsICJlLGYsZyIsIDAgfSwKLXsgIm1ybTFzMi5zcyIsCTB4NDgwMDAwMWEsIDB4YjQwMDA3ZTUsICJlLGYsZyIsIDAgfSwKLXsgIm1ybTFzMi5zZCIsCTB4NDgwMDAwOWEsIDB4YjQwMDA3NjUsICJlLGYsZyIsIDAgfSwKLXsgIm1ybTFzMi5kZCIsCTB4NDgwMDAxOWEsIDB4YjQwMDA2NjUsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHNtLnNzIiwweDQ4MDAwMDFiLCAweGI0MDAwN2U0LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRzbS5zZCIsMHg0ODAwMDA5YiwgMHhiNDAwMDc2NCwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0c20uZGQiLDB4NDgwMDAxOWIsIDB4YjQwMDA2NjQsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxczIuc3MiLAkweDQ4MDAwMDFjLCAweGI0MDAwN2UzLCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXMyLnNkIiwJMHg0ODAwMDA5YywgMHhiNDAwMDc2MywgImUsZixnIiwgMCB9LAoteyAibWltdDFzMi5kZCIsCTB4NDgwMDAxOWMsIDB4YjQwMDA2NjMsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0c20uc3MiLAkweDQ4MDAwMDFkLCAweGI0MDAwN2UyLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHNtLnNkIiwJMHg0ODAwMDA5ZCwgMHhiNDAwMDc2MiwgImUsZixnIiwgMCB9LAoteyAibW0xMnRzbS5kZCIsCTB4NDgwMDAxOWQsIDB4YjQwMDA2NjIsICJlLGYsZyIsIDAgfSwKLXsgIm1pbTFzMi5zcyIsCTB4NDgwMDAwMWUsIDB4YjQwMDA3ZTEsICJlLGYsZyIsIDAgfSwKLXsgIm1pbTFzMi5zZCIsCTB4NDgwMDAwOWUsIDB4YjQwMDA3NjEsICJlLGYsZyIsIDAgfSwKLXsgIm1pbTFzMi5kZCIsCTB4NDgwMDAxOWUsIDB4YjQwMDA2NjEsICJlLGYsZyIsIDAgfSwKLQotCi17ICJmbXVsLnNzIiwJMHg0ODAwMDAyMCwgMHhiNDAwMDdkZiwgImUsZixnIiwgMCB9LAkvKiBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZtdWwuc2QiLAkweDQ4MDAwMGEwLCAweGI0MDAwNzVmLCAiZSxmLGciLCAwIH0sCS8qIGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZm11bC5kZCIsCTB4NDgwMDAxYTAsIDB4YjQwMDA2NWYsICJlLGYsZyIsIDAgfSwJLyogZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZm11bC5zcyIsCTB4NDgwMDA0MjAsIDB4YjQwMDAzZGYsICJlLGYsZyIsIDAgfSwJLyogcGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZtdWwuc2QiLAkweDQ4MDAwNGEwLCAweGI0MDAwMzVmLCAiZSxmLGciLCAwIH0sCS8qIHBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbXVsLmRkIiwJMHg0ODAwMDVhMCwgMHhiNDAwMDI1ZiwgImUsZixnIiwgMCB9LAkvKiBwZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZm11bDMuZGQiLAkweDQ4MDAwNWE0LCAweGI0MDAwMjViLCAiZSxmLGciLCAwIH0sCS8qIHBmbXVsMy5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmbWxvdy5kZCIsCTB4NDgwMDAxYTEsIDB4YjQwMDA2NWUsICJlLGYsZyIsIDAgfSwJLyogZm1sb3cuZGQgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZyY3Auc3MiLAkweDQ4MDAwMDIyLCAweGI0MDAwN2RkLCAiZixnIiwgMCB9LAkvKiBmcmNwLnAgZnNyYzIsZmRlc3QgKi8KLXsgImZyY3Auc2QiLAkweDQ4MDAwMGEyLCAweGI0MDAwNzVkLCAiZixnIiwgMCB9LAkvKiBmcmNwLnAgZnNyYzIsZmRlc3QgKi8KLXsgImZyY3AuZGQiLAkweDQ4MDAwMWEyLCAweGI0MDAwNjVkLCAiZixnIiwgMCB9LAkvKiBmcmNwLnAgZnNyYzIsZmRlc3QgKi8KLXsgImZyc3FyLnNzIiwJMHg0ODAwMDAyMywgMHhiNDAwMDdkYywgImYsZyIsIDAgfSwJLyogZnJzcXIucCBmc3JjMixmZGVzdCAqLwoteyAiZnJzcXIuc2QiLAkweDQ4MDAwMGEzLCAweGI0MDAwNzVjLCAiZixnIiwgMCB9LAkvKiBmcnNxci5wIGZzcmMyLGZkZXN0ICovCi17ICJmcnNxci5kZCIsCTB4NDgwMDAxYTMsIDB4YjQwMDA2NWMsICJmLGciLCAwIH0sCS8qIGZyc3FyLnAgZnNyYzIsZmRlc3QgKi8KLXsgImZhZGQuc3MiLAkweDQ4MDAwMDMwLCAweGI0MDAwN2NmLCAiZSxmLGciLCAwIH0sCS8qIGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmFkZC5zZCIsCTB4NDgwMDAwYjAsIDB4YjQwMDA3NGYsICJlLGYsZyIsIDAgfSwJLyogZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmYWRkLmRkIiwJMHg0ODAwMDFiMCwgMHhiNDAwMDY0ZiwgImUsZixnIiwgMCB9LAkvKiBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmYWRkLnNzIiwJMHg0ODAwMDQzMCwgMHhiNDAwMDNjZiwgImUsZixnIiwgMCB9LAkvKiBwZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmFkZC5zZCIsCTB4NDgwMDA0YjAsIDB4YjQwMDAzNGYsICJlLGYsZyIsIDAgfSwJLyogcGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGQuZGQiLAkweDQ4MDAwNWIwLCAweGI0MDAwMjRmLCAiZSxmLGciLCAwIH0sCS8qIHBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZzdWIuc3MiLAkweDQ4MDAwMDMxLCAweGI0MDAwN2NlLCAiZSxmLGciLCAwIH0sCS8qIGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnN1Yi5zZCIsCTB4NDgwMDAwYjEsIDB4YjQwMDA3NGUsICJlLGYsZyIsIDAgfSwJLyogZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmc3ViLmRkIiwJMHg0ODAwMDFiMSwgMHhiNDAwMDY0ZSwgImUsZixnIiwgMCB9LAkvKiBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmc3ViLnNzIiwJMHg0ODAwMDQzMSwgMHhiNDAwMDNjZSwgImUsZixnIiwgMCB9LAkvKiBwZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZnN1Yi5zZCIsCTB4NDgwMDA0YjEsIDB4YjQwMDAzNGUsICJlLGYsZyIsIDAgfSwJLyogcGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZzdWIuZGQiLAkweDQ4MDAwNWIxLCAweGI0MDAwMjRlLCAiZSxmLGciLCAwIH0sCS8qIHBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZpeC5zcyIsCTB4NDgwMDAwMzIsIDB4YjQwMDA3Y2QsICJlLGciLCAwIH0sCS8qIGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJmaXguc2QiLAkweDQ4MDAwMGIyLCAweGI0MDAwNzRkLCAiZSxnIiwgMCB9LAkvKiBmaXgucCBmc3JjMSxmZGVzdCAqLwoteyAiZml4LmRkIiwJMHg0ODAwMDFiMiwgMHhiNDAwMDY0ZCwgImUsZyIsIDAgfSwJLyogZml4LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmaXguc3MiLAkweDQ4MDAwNDMyLCAweGI0MDAwM2NkLCAiZSxnIiwgMCB9LAkvKiBwZml4LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmaXguc2QiLAkweDQ4MDAwNGIyLCAweGI0MDAwMzRkLCAiZSxnIiwgMCB9LAkvKiBwZml4LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmaXguZGQiLAkweDQ4MDAwNWIyLCAweGI0MDAwMjRkLCAiZSxnIiwgMCB9LAkvKiBwZml4LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZhbW92LnNzIiwJMHg0ODAwMDAzMywgMHhiNDAwMDdjYywgImUsZyIsIDAgfSwJLyogZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAiZmFtb3YuZHMiLAkweDQ4MDAwMTMzLCAweGI0MDAwNmNjLCAiZSxnIiwgMCB9LAkvKiBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJmYW1vdi5zZCIsCTB4NDgwMDAwYjMsIDB4YjQwMDA3NGMsICJlLGciLCAwIH0sCS8qIGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZhbW92LmRkIiwJMHg0ODAwMDFiMywgMHhiNDAwMDY0YywgImUsZyIsIDAgfSwJLyogZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAicGZhbW92LnNzIiwJMHg0ODAwMDQzMywgMHhiNDAwMDNjYywgImUsZyIsIDAgfSwJLyogcGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmYW1vdi5kcyIsCTB4NDgwMDA1MzMsIDB4YjQwMDAyY2MsICJlLGciLCAwIH0sCS8qIHBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJwZmFtb3Yuc2QiLAkweDQ4MDAwNGIzLCAweGI0MDAwMzRjLCAiZSxnIiwgMCB9LAkvKiBwZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAicGZhbW92LmRkIiwJMHg0ODAwMDViMywgMHhiNDAwMDI0YywgImUsZyIsIDAgfSwJLyogcGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLS8qIHBmZ3QgaGFzIFIgYml0IGNsZWFyZWQ7IHBmbGUgaGFzIFIgYml0IHNldCAqLwoteyAicGZndC5zcyIsCTB4NDgwMDA0MzQsIDB4YjQwMDAzY2IsICJlLGYsZyIsIDAgfSwJLyogcGZndC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmd0LnNkIiwJMHg0ODAwMDQzNCwgMHhiNDAwMDNjYiwgImUsZixnIiwgMCB9LAkvKiBwZmd0LnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmZ3QuZGQiLAkweDQ4MDAwNTM0LCAweGI0MDAwMmNiLCAiZSxmLGciLCAwIH0sCS8qIHBmZ3QucCBmc3JjMSxmc3JjMixmZGVzdCAqLwotLyogcGZndCBoYXMgUiBiaXQgY2xlYXJlZDsgcGZsZSBoYXMgUiBiaXQgc2V0ICovCi17ICJwZmxlLnNzIiwJMHg0ODAwMDRiNCwgMHhiNDAwMDM0YiwgImUsZixnIiwgMCB9LAkvKiBwZmxlLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbGUuc2QiLAkweDQ4MDAwNGI0LCAweGI0MDAwMzRiLCAiZSxmLGciLCAwIH0sCS8qIHBmbGUucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZsZS5kZCIsCTB4NDgwMDA1YjQsIDB4YjQwMDAyNGIsICJlLGYsZyIsIDAgfSwJLyogcGZsZS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmdHJ1bmMuc3MiLAkweDQ4MDAwMDNhLCAweGI0MDAwN2M1LCAiZSxnIiwgMCB9LAkvKiBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAiZnRydW5jLnNkIiwJMHg0ODAwMDBiYSwgMHhiNDAwMDc0NSwgImUsZyIsIDAgfSwJLyogZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KLXsgImZ0cnVuYy5kZCIsCTB4NDgwMDAxYmEsIDB4YjQwMDA2NDUsICJlLGciLCAwIH0sCS8qIGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCi17ICJwZnRydW5jLnNzIiwJMHg0ODAwMDQzYSwgMHhiNDAwMDNjNSwgImUsZyIsIDAgfSwJLyogcGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCi17ICJwZnRydW5jLnNkIiwJMHg0ODAwMDRiYSwgMHhiNDAwMDM0NSwgImUsZyIsIDAgfSwJLyogcGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCi17ICJwZnRydW5jLmRkIiwJMHg0ODAwMDViYSwgMHhiNDAwMDI0NSwgImUsZyIsIDAgfSwJLyogcGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCi17ICJmeGZyIiwJMHg0ODAwMDA0MCwgMHhiNDAwMDdiZiwgImUsZCIsIDAgfSwJLyogZnhmciBmc3JjMSxpZGVzdCAqLwoteyAiZmlhZGQuc3MiLAkweDQ4MDAwMDQ5LCAweGI0MDAwN2I2LCAiZSxmLGciLCAwIH0sCS8qIGZpYWRkLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZpYWRkLmRkIiwJMHg0ODAwMDFjOSwgMHhiNDAwMDYzNiwgImUsZixnIiwgMCB9LAkvKiBmaWFkZC53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmlhZGQuc3MiLAkweDQ4MDAwNDQ5LCAweGI0MDAwM2I2LCAiZSxmLGciLCAwIH0sCS8qIHBmaWFkZC53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmlhZGQuZGQiLAkweDQ4MDAwNWM5LCAweGI0MDAwMjM2LCAiZSxmLGciLCAwIH0sCS8qIHBmaWFkZC53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmaXN1Yi5zcyIsCTB4NDgwMDAwNGQsIDB4YjQwMDA3YjIsICJlLGYsZyIsIDAgfSwJLyogZmlzdWIudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmlzdWIuZGQiLAkweDQ4MDAwMWNkLCAweGI0MDAwNjMyLCAiZSxmLGciLCAwIH0sCS8qIGZpc3ViLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmaXN1Yi5zcyIsCTB4NDgwMDA0NGQsIDB4YjQwMDAzYjIsICJlLGYsZyIsIDAgfSwJLyogcGZpc3ViLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmaXN1Yi5kZCIsCTB4NDgwMDA1Y2QsIDB4YjQwMDAyMzIsICJlLGYsZyIsIDAgfSwJLyogcGZpc3ViLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZ6Y2hrbCIsCTB4NDgwMDAwNTcsIDB4YjQwMDA3YTgsICJlLGYsZyIsIDAgfSwJLyogZnpjaGtsIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZnpjaGtsIiwJMHg0ODAwMDQ1NywgMHhiNDAwMDNhOCwgImUsZixnIiwgMCB9LAkvKiBwZnpjaGtsIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmemNoa3MiLAkweDQ4MDAwMDVmLCAweGI0MDAwN2EwLCAiZSxmLGciLCAwIH0sCS8qIGZ6Y2hrcyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZ6Y2hrcyIsCTB4NDgwMDA0NWYsIDB4YjQwMDAzYTAsICJlLGYsZyIsIDAgfSwJLyogcGZ6Y2hrcyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmFkZHAiLAkweDQ4MDAwMDUwLCAweGI0MDAwN2FmLCAiZSxmLGciLCAwIH0sCS8qIGZhZGRwIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmFkZHAiLAkweDQ4MDAwNDUwLCAweGI0MDAwM2FmLCAiZSxmLGciLCAwIH0sCS8qIHBmYWRkcCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmFkZHoiLAkweDQ4MDAwMDUxLCAweGI0MDAwN2FlLCAiZSxmLGciLCAwIH0sCS8qIGZhZGR6IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmFkZHoiLAkweDQ4MDAwNDUxLCAweGI0MDAwM2FlLCAiZSxmLGciLCAwIH0sCS8qIHBmYWRkeiBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZm9ybSIsCTB4NDgwMDAwNWEsIDB4YjQwMDA3YTUsICJlLGciLCAwIH0sCS8qIGZvcm0gZnNyYzEsZmRlc3QgKi8KLXsgInBmb3JtIiwJMHg0ODAwMDQ1YSwgMHhiNDAwMDNhNSwgImUsZyIsIDAgfSwJLyogcGZvcm0gZnNyYzEsZmRlc3QgKi8KLQotLyogRmxvYXRpbmcgcG9pbnQgcHNldWRvLWluc3RydWN0aW9ucyAqLwoteyAiZm1vdi5zcyIsCTB4NDgwMDAwNDksIDB4YjdlMDA3YjYsICJlLGciLCAwIH0sCS8qIGZpYWRkLnNzIGZzcmMxLGYwLGZkZXN0ICovCi17ICJmbW92LmRkIiwJMHg0ODAwMDFjOSwgMHhiN2UwMDYzNiwgImUsZyIsIDAgfSwJLyogZmlhZGQuZGQgZnNyYzEsZjAsZmRlc3QgKi8KLXsgImZtb3Yuc2QiLAkweDQ4MDAwMGIwLCAweGI3ZTAwNzRmLCAiZSxnIiwgMCB9LAkvKiBmYWRkLnNkIGZzcmMxLGYwLGZkZXN0ICovCi17ICJmbW92LmRzIiwJMHg0ODAwMDEzMCwgMHhiN2UwMDZjZiwgImUsZyIsIDAgfSwJLyogZmFkZC5kcyBmc3JjMSxmMCxmZGVzdCAqLwoteyAicGZtb3YuZHMiLAkweDQ4MDAwNTMwLCAweGI3MzAwMmNmLCAiZSxnIiwgMCB9LAkvKiBwZmFkZC5kcyBmc3JjMSxmMCxmZGVzdCAqLwoteyAicGZtb3YuZGQiLAkweDQ4MDAwNWM5LCAweGI3ZTAwMjM2LCAiZSxnIiwgMCB9LAkvKiBwZmlhZGQuZGQgZnNyYzEsZjAsZmRlc3QgKi8KLQotCi19OwotCi0jZGVmaW5lIE5VTU9QQ09ERVMgKChzaXplb2YgaTg2MF9vcGNvZGVzKS8oc2l6ZW9mIGk4NjBfb3Bjb2Rlc1swXSkpCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaTk2MC5oIGIvaW5jbHVkZS9vcGNvZGUvaTk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTJmYzMzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2k5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi0vKiBCYXNpYyA4MDk2MCBpbnN0cnVjdGlvbiBmb3JtYXRzLgotICoKLSAqIFRoZSAnQ09KJyBpbnN0cnVjdGlvbnMgYXJlIGFjdHVhbGx5IENPQlIgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlICdiJyBpbgotICogdGhlIG1uZW1vbmljIHJlcGxhY2VkIGJ5IGEgJ2onOyAgdGhleSBhcmUgQUxXQVlTICJkZS1vcHRpbWl6ZWQiIGlmIG5lY2Vzc2FyeToKLSAqIGlmIHRoZSBkaXNwbGFjZW1lbnQgd2lsbCBub3QgZml0IGluIDEzIGJpdHMsIHRoZSBhc3NlbWJsZXIgd2lsbCByZXBsYWNlIHRoZW0KLSAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29tcGFyZSBhbmQgYnJhbmNoIGluc3RydWN0aW9ucy4KLSAqCi0gKiBBbGwgb2YgdGhlICdNRU1uJyBpbnN0cnVjdGlvbnMgYXJlIHRoZSBzYW1lIGZvcm1hdDsgdGhlICduJyBpbiB0aGUgbmFtZQotICogaW5kaWNhdGVzIHRoZSBkZWZhdWx0IGluZGV4IHNjYWxlIGZhY3RvciAodGhlIHNpemUgb2YgdGhlIGRhdHVtIG9wZXJhdGVkIG9uKS4KLSAqCi0gKiBUaGUgRkJSQSBmb3JtYXRzIGFyZSBub3QgYWN0dWFsbHkgYW4gaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgVGhleSBhcmUgdGhlCi0gKiAiY29udmVuaWVuY2UgZGlyZWN0aXZlcyIgZm9yIGJyYW5jaGluZyBvbiBmbG9hdGluZy1wb2ludCBjb21wYXJpc29ucywKLSAqIGVhY2ggb2Ygd2hpY2ggZ2VuZXJhdGVzIDIgaW5zdHJ1Y3Rpb25zIChhICdibm8nIGFuZCBvbmUgb3RoZXIgYnJhbmNoKS4KLSAqCi0gKiBUaGUgQ0FMTEogZm9ybWF0IGlzIG5vdCBhY3R1YWxseSBhbiBpbnN0cnVjdGlvbiBmb3JtYXQuICBJdCBpbmRpY2F0ZXMgdGhhdAotICogdGhlIGluc3RydWN0aW9uIGdlbmVyYXRlZCAoYSBDVFJMLWZvcm1hdCAnY2FsbCcpIHNob3VsZCBoYXZlIGl0cyByZWxvY2F0aW9uCi0gKiBzcGVjaWFsbHkgZmxhZ2dlZCBmb3IgbGluay10aW1lIHJlcGxhY2VtZW50IHdpdGggYSAnYmFsJyBvciAnY2FsbHMnIGlmCi0gKiBhcHByb3ByaWF0ZS4KLSAqLyAKLQotI2RlZmluZSBDVFJMCTAKLSNkZWZpbmUgQ09CUgkxCi0jZGVmaW5lIENPSgkyCi0jZGVmaW5lIFJFRwkzCi0jZGVmaW5lIE1FTTEJNAotI2RlZmluZSBNRU0yCTUKLSNkZWZpbmUgTUVNNAk2Ci0jZGVmaW5lIE1FTTgJNwotI2RlZmluZSBNRU0xMgk4Ci0jZGVmaW5lIE1FTTE2CTkKLSNkZWZpbmUgRkJSQQkxMAotI2RlZmluZSBDQUxMSgkxMQotCi0vKiBNYXNrcyBmb3IgdGhlIG1vZGUgYml0cyBpbiBSRUcgZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBNMQkJMHgwODAwCi0jZGVmaW5lIE0yCQkweDEwMDAKLSNkZWZpbmUgTTMJCTB4MjAwMAotCi0vKiBHZW5lcmF0ZSB0aGUgMTItYml0IG9wY29kZSBmb3IgYSBSRUcgZm9ybWF0IGluc3RydWN0aW9uIGJ5IHBsYWNpbmcgdGhlIAotICogaGlnaCA4IGJpdHMgaW4gaW5zdHJ1Y3Rpb24gYml0cyAyNC0zMSwgdGhlIGxvdyA0IGJpdHMgaW4gaW5zdHJ1Y3Rpb24gYml0cwotICogNy0xMC4KLSAqLwotCi0jZGVmaW5lIFJFR19PUEMob3BjKQkoKG9wYyAmIDB4ZmYwKSA8PCAyMCkgfCAoKG9wYyAmIDB4ZikgPDwgNykKLQotLyogR2VuZXJhdGUgYSB0ZW1wbGF0ZSBmb3IgYSBSRUcgZm9ybWF0IGluc3RydWN0aW9uOiAgcGxhY2UgdGhlIG9wY29kZSBiaXRzCi0gKiBpbiB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGFuZCBPUiBpbiBtb2RlIGJpdHMgZm9yIHRoZSBvcGVyYW5kcyB0aGF0IHdpbGwgbm90Ci0gKiBiZSB1c2VkLiAgSS5lLiwKLSAqCQlzZXQgbTE9MSwgaWYgc3JjMSB3aWxsIG5vdCBiZSB1c2VkCi0gKgkJc2V0IG0yPTEsIGlmIHNyYzIgd2lsbCBub3QgYmUgdXNlZAotICoJCXNldCBtMz0xLCBpZiBkc3QgIHdpbGwgbm90IGJlIHVzZWQKLSAqCi0gKiBTZXR0aW5nIHRoZSAidW51c2VkIiBtb2RlIGJpdHMgdG8gMSBzcGVlZHMgdXAgaW5zdHJ1Y3Rpb24gZXhlY3V0aW9uKCEpLgotICogVGhlIGluZm9ybWF0aW9uIGlzIGFsc28gdXNlZnVsIHRvIHVzIGJlY2F1c2Ugc29tZSAxLW9wZXJhbmQgUkVHIGluc3RydWN0aW9ucwotICogdXNlIHRoZSBzcmMxIGZpZWxkLCBvdGhlcnMgdGhlIGRzdCBmaWVsZDsgYW5kIHNvbWUgMi1vcGVyYW5kIFJFRyBpbnN0cnVjdGlvbnMKLSAqIHVzZSBzcmMxL3NyYzIsIG90aGVycyBzcmMxL2RzdC4gIFRoZSBzZXQgbW9kZSBiaXRzIGVuYWJsZSB1cyB0byBkaXN0aW5ndWlzaC4KLSAqLwotI2RlZmluZSBSXzAob3BjKQkoIFJFR19PUEMob3BjKSB8IE0xIHwgTTIgfCBNMyApCS8qIE5vIG9wZXJhbmRzICAgICAgKi8KLSNkZWZpbmUgUl8xKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMiB8IE0zICkJLyogMSBvcGVyYW5kOiBzcmMxICAqLwotI2RlZmluZSBSXzFEKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMSB8IE0yICkJLyogMSBvcGVyYW5kOiBkc3QgICAqLwotI2RlZmluZSBSXzIob3BjKQkoIFJFR19PUEMob3BjKSB8IE0zICkJCS8qIDIgb3BzOiBzcmMxL3NyYzIgKi8KLSNkZWZpbmUgUl8yRChvcGMpCSggUkVHX09QQyhvcGMpIHwgTTIgKQkJLyogMiBvcHM6IHNyYzEvZHN0ICAqLwotI2RlZmluZSBSXzMob3BjKQkoIFJFR19PUEMob3BjKSApCQkvKiAzIG9wZXJhbmRzICAgICAgICovCi0KLS8qIERFU0NSSVBUT1IgQllURVMgRk9SIFJFR0lTVEVSIE9QRVJBTkRTCi0gKgotICogSW50ZXJwcmV0IG5hbWVzIGFzIGZvbGxvd3M6Ci0gKglSOiAgIGdsb2JhbCBvciBsb2NhbCByZWdpc3RlciBvbmx5Ci0gKglSUzogIGdsb2JhbCwgbG9jYWwsIG9yIChpZiB0YXJnZXQgYWxsb3dzKSBzcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVyIG9ubHkKLSAqCVJMOiAgZ2xvYmFsIG9yIGxvY2FsIHJlZ2lzdGVyLCBvciBpbnRlZ2VyIGxpdGVyYWwKLSAqCVJTTDogZ2xvYmFsLCBsb2NhbCwgb3IgKGlmIHRhcmdldCBhbGxvd3MpIHNwZWNpYWwtZnVuY3Rpb24gcmVnaXN0ZXI7Ci0gKgkJb3IgaW50ZWdlciBsaXRlcmFsCi0gKglGOiAgIGdsb2JhbCwgbG9jYWwsIG9yIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyCi0gKglGTDogIGdsb2JhbCwgbG9jYWwsIG9yIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyOyBvciBsaXRlcmFsIChpbmNsdWRpbmcKLSAqCQlmbG9hdGluZyBwb2ludCkKLSAqCi0gKiBBIG51bWJlciBhcHBlbmRlZCB0byBhIG5hbWUgaW5kaWNhdGVzIHRoYXQgcmVnaXN0ZXJzIG11c3QgYmUgYWxpZ25lZCwKLSAqIGFzIGZvbGxvd3M6Ci0gKgkyOiByZWdpc3RlciBudW1iZXIgbXVzdCBiZSBtdWx0aXBsZSBvZiAyCi0gKgk0OiByZWdpc3RlciBudW1iZXIgbXVzdCBiZSBtdWx0aXBsZSBvZiA0Ci0gKi8KLQotI2RlZmluZSBTRlIJMHgxMAkJLyogTWFzayBmb3IgdGhlICJzZnItT0siIGJpdCAqLwotI2RlZmluZSBMSVQJMHgwOAkJLyogTWFzayBmb3IgdGhlICJsaXRlcmFsLU9LIiBiaXQgKi8KLSNkZWZpbmUgRlAJMHgwNAkJLyogTWFzayBmb3IgImZsb2F0aW5nLXBvaW50LU9LIiBiaXQgKi8KLQotLyogVGhpcyBtYWNybyBvcnMgdGhlIGJpdHMgdG9nZXRoZXIuICBOb3RlIHRoYXQgJ2FsaWduJyBpcyBhIG1hc2sKLSAqIGZvciB0aGUgbG93IDAsIDEsIG9yIDIgYml0cyBvZiB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhcyBhcHByb3ByaWF0ZS4KLSAqLwotI2RlZmluZSBPUChhbGlnbixsaXQsZnAsc2ZyKQkoIGFsaWduIHwgbGl0IHwgZnAgfCBzZnIgKQotCi0jZGVmaW5lIFIJT1AoIDAsIDAsICAgMCwgIDAgICApCi0jZGVmaW5lIFJTCU9QKCAwLCAwLCAgIDAsICBTRlIgKQotI2RlZmluZSBSTAlPUCggMCwgTElULCAwLCAgMCAgICkKLSNkZWZpbmUgUlNMCU9QKCAwLCBMSVQsIDAsICBTRlIgKQotI2RlZmluZSBGCU9QKCAwLCAwLCAgIEZQLCAwICAgKQotI2RlZmluZSBGTAlPUCggMCwgTElULCBGUCwgMCAgICkKLSNkZWZpbmUgUjIJT1AoIDEsIDAsICAgMCwgIDAgICApCi0jZGVmaW5lIFJMMglPUCggMSwgTElULCAwLCAgMCAgICkKLSNkZWZpbmUgRjIJT1AoIDEsIDAsICAgRlAsIDAgICApCi0jZGVmaW5lIEZMMglPUCggMSwgTElULCBGUCwgMCAgICkKLSNkZWZpbmUgUjQJT1AoIDMsIDAsICAgMCwgIDAgICApCi0jZGVmaW5lIFJMNAlPUCggMywgTElULCAwLCAgMCAgICkKLSNkZWZpbmUgRjQJT1AoIDMsIDAsICAgRlAsIDAgICApCi0jZGVmaW5lIEZMNAlPUCggMywgTElULCBGUCwgMCAgICkKLQotI2RlZmluZSBNCTB4N2YJLyogTWVtb3J5IG9wZXJhbmQgKE1FTUEgJiBNRU1CIGZvcm1hdCBpbnN0cnVjdGlvbnMpICovCi0KLS8qIE1hY3JvcyB0byBleHRyYWN0IGluZm8gZnJvbSB0aGUgcmVnaXN0ZXIgb3BlcmFuZCBkZXNjcmlwdG9yIGJ5dGUgJ29kJy4KLSAqLwotI2RlZmluZSBTRlJfT0sob2QpCShvZCAmIFNGUikJLyogVFJVRSBpZiBzZnIgb3BlcmFuZCBhbGxvd2VkICovCi0jZGVmaW5lIExJVF9PSyhvZCkJKG9kICYgTElUKQkvKiBUUlVFIGlmIGxpdGVyYWwgb3BlcmFuZCBhbGxvd2VkICovCi0jZGVmaW5lIEZQX09LKG9kKQkob2QgJiBGUCkJLyogVFJVRSBpZiBmbG9hdGluZy1wb2ludCBvcCBhbGxvd2VkICovCi0jZGVmaW5lIFJFR19BTElHTihvZCxuKQkoKG9kICYgMHgzICYgbikgPT0gMCkKLQkJCQkJLyogVFJVRSBpZiByZWcgI24gaXMgcHJvcGVybHkgYWxpZ25lZCAqLwotI2RlZmluZSBNRU1PUChvZCkJKG9kID09IE0pCS8qIFRSVUUgaWYgb3BlcmFuZCBpcyBhIG1lbW9yeSBvcGVyYW5kKi8KLQotLyogRGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgaTgwOTYwIGluc3RydWN0aW9uICovCi1zdHJ1Y3QgaTk2MF9vcGNvZGUgewotCWxvbmcgb3Bjb2RlOwkvKiAzMiBiaXRzLCBjb25zdGFudCBmaWVsZHMgZmlsbGVkIGluLCByZXN0IHplcm9lZCAqLwotCWNoYXIgKm5hbWU7CS8qIEFzc2VtYmxlciBtbmVtb25pYwkJCQkgICAqLwotCXNob3J0IGljbGFzczsJLyogQ2xhc3M6IHNlZSAjZGVmaW5lcyBiZWxvdwkJCSAgICovCi0JY2hhciBmb3JtYXQ7CS8qIFJFRywgQ09CUiwgQ1RSTCwgTUVNbiwgQ09KLCBGQlJBLCBvciBDQUxMSgkgICAqLwotCWNoYXIgbnVtX29wczsJLyogTnVtYmVyIG9mIG9wZXJhbmRzCQkJCSAgICovCi0JY2hhciBvcGVyYW5kWzNdOy8qIE9wZXJhbmQgZGVzY3JpcHRvcnM7IHNhbWUgb3JkZXIgYXMgYXNzZW1ibGVyIGluc3RyICovCi19OwotCi0vKiBDbGFzc2VzIG9mIDk2MCBpbnRydWN0aW9uczoKLSAqCS0gZWFjaCBpbnN0cnVjdGlvbiBmYWxscyBpbnRvIG9uZSBjbGFzcy4KLSAqCS0gZWFjaCB0YXJnZXQgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIG9uZSBvciBtb3JlIGNsYXNzZXMuCi0gKgotICogRUFDSCBDT05TVEFOVCBNVVNUIENPTlRBSU4gMSBBTkQgT05MWSAxIFNFVCBCSVQhOiAgc2VlIHRhcmdfaGFzX2ljbGFzcygpLgotICovCi0jZGVmaW5lIElfQkFTRQkweDAxCS8qIDgwOTYwIGJhc2UgaW5zdHJ1Y3Rpb24gc2V0CSovCi0jZGVmaW5lIElfQ1gJMHgwMgkvKiA4MDk2MEN4IGluc3RydWN0aW9uCQkqLwotI2RlZmluZSBJX0RFQwkweDA0CS8qIERlY2ltYWwgaW5zdHJ1Y3Rpb24JCSovCi0jZGVmaW5lIElfRlAJMHgwOAkvKiBGbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbgkqLwotI2RlZmluZSBJX0tYCTB4MTAJLyogODA5NjBLeCBpbnN0cnVjdGlvbgkJKi8KLSNkZWZpbmUgSV9NSUwJMHgyMAkvKiBNaWxpdGFyeSBpbnN0cnVjdGlvbgkJKi8KLSNkZWZpbmUgSV9DQVNJTQkweDQwCS8qIENBIHNpbXVsYXRvciBpbnN0cnVjdGlvbgkqLwotI2RlZmluZSBJX0NYMgkweDgwCS8qIEN4L0p4L0h4IGluc3RydWN0aW9ucwkqLwotI2RlZmluZSBJX0pYCTB4MTAwCS8qIEp4L0h4IGluc3RydWN0aW9uCQkqLwotI2RlZmluZSBJX0hYCTB4MjAwCS8qIEh4IGluc3RydWN0aW9ucwkJKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCQlUQUJMRSBPRiBpOTYwIElOU1RSVUNUSU9OIERFU0NSSVBUSU9OUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWNvbnN0IHN0cnVjdCBpOTYwX29wY29kZSBpOTYwX29wY29kZXNbXSA9IHsKLQotCS8qIGlmIGEgQ1RSTCBpbnN0cnVjdGlvbiBoYXMgYW4gb3BlcmFuZCwgaXQncyBhbHdheXMgYSBkaXNwbGFjZW1lbnQgKi8KLQotCS8qIGNhbGxqIGRlZmF1bHQ9PSdjYWxsJyAqLwotCXsgMHgwOTAwMDAwMCwJImNhbGxqIiwJSV9CQVNFLAlDQUxMSiwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDA4MDAwMDAwLAkiYiIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgwOTAwMDAwMCwJImNhbGwiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MGEwMDAwMDAsCSJyZXQiLAkJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MGIwMDAwMDAsCSJiYWwiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTAwMDAwMDAsCSJibm8iLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBiZiBzYW1lIGFzIGJubyAqLwotCXsgMHgxMDAwMDAwMCwJImJmIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJ1IHNhbWUgYXMgYm5vICovCi0JeyAweDEwMDAwMDAwLAkiYnJ1IiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDExMDAwMDAwLAkiYmciLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicmcgc2FtZSBhcyBiZyAqLwotCXsgMHgxMTAwMDAwMCwJImJyZyIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxMjAwMDAwMCwJImJlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJlIHNhbWUgYXMgYmUgKi8KLQl7IDB4MTIwMDAwMDAsCSJicmUiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTMwMDAwMDAsCSJiZ2UiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicmdlIHNhbWUgYXMgYmdlICovCi0JeyAweDEzMDAwMDAwLAkiYnJnZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxNDAwMDAwMCwJImJsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJsIHNhbWUgYXMgYmwgKi8KLQl7IDB4MTQwMDAwMDAsCSJicmwiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTUwMDAwMDAsCSJibmUiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicmxnIHNhbWUgYXMgYm5lICovCi0JeyAweDE1MDAwMDAwLAkiYnJsZyIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxNjAwMDAwMCwJImJsZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJybGUgc2FtZSBhcyBibGUgKi8KLQl7IDB4MTYwMDAwMDAsCSJicmxlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDE3MDAwMDAwLAkiYm8iLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBidCBzYW1lIGFzIGJvICovCi0JeyAweDE3MDAwMDAwLAkiYnQiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicm8gc2FtZSBhcyBibyAqLwotCXsgMHgxNzAwMDAwMCwJImJybyIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxODAwMDAwMCwJImZhdWx0bm8iLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCS8qIGZhdWx0ZiBzYW1lIGFzIGZhdWx0bm8gKi8KLQl7IDB4MTgwMDAwMDAsCSJmYXVsdGYiLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxOTAwMDAwMCwJImZhdWx0ZyIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDFhMDAwMDAwLAkiZmF1bHRlIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWIwMDAwMDAsCSJmYXVsdGdlIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWMwMDAwMDAsCSJmYXVsdGwiLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxZDAwMDAwMCwJImZhdWx0bmUiLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxZTAwMDAwMCwJImZhdWx0bGUiLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxZjAwMDAwMCwJImZhdWx0byIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JLyogZmF1bHR0IHN5biBmb3IgZmF1bHRvICovCi0JeyAweDFmMDAwMDAwLAkiZmF1bHR0IiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQotCXsgMHgwMTAwMDAwMCwJInN5c2NhbGwiLAlJX0NBU0lNLENUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCi0JLyogSWYgYSBDT0JSIChvciBDT0opIGhhcyAzIG9wZXJhbmRzLCB0aGUgbGFzdCBvbmUgaXMgYWx3YXlzIGEKLQkgKiBkaXNwbGFjZW1lbnQgYW5kIGRvZXMgbm90IGFwcGVhciBleHBsaWNpdGx5IGluIHRoZSB0YWJsZS4KLQkgKi8KLQotCXsgMHgyMDAwMDAwMCwJInRlc3RubyIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjEwMDAwMDAsCSJ0ZXN0ZyIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjIwMDAwMDAsCSJ0ZXN0ZSIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjMwMDAwMDAsCSJ0ZXN0Z2UiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDI0MDAwMDAwLAkidGVzdGwiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDI1MDAwMDAwLAkidGVzdG5lIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyNjAwMDAwMCwJInRlc3RsZSIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjcwMDAwMDAsCSJ0ZXN0byIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MzAwMDAwMDAsCSJiYmMiLAkJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDMxMDAwMDAwLAkiY21wb2JnIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDMyMDAwMDAwLAkiY21wb2JlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDMzMDAwMDAwLAkiY21wb2JnZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNDAwMDAwMCwJImNtcG9ibCIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNTAwMDAwMCwJImNtcG9ibmUiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzYwMDAwMDAsCSJjbXBvYmxlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM3MDAwMDAwLAkiYmJzIiwJCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzODAwMDAwMCwJImNtcGlibm8iLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzkwMDAwMDAsCSJjbXBpYmciLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2EwMDAwMDAsCSJjbXBpYmUiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2IwMDAwMDAsCSJjbXBpYmdlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNjMDAwMDAwLAkiY21waWJsIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNkMDAwMDAwLAkiY21waWJuZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzZTAwMDAwMCwJImNtcGlibGUiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2YwMDAwMDAsCSJjbXBpYm8iLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzEwMDAwMDAsCSJjbXBvamciLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMjAwMDAwMCwJImNtcG9qZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDMzMDAwMDAwLAkiY21wb2pnZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM0MDAwMDAwLAkiY21wb2psIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzUwMDAwMDAsCSJjbXBvam5lIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzYwMDAwMDAsCSJjbXBvamxlIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzgwMDAwMDAsCSJjbXBpam5vIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzkwMDAwMDAsCSJjbXBpamciLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYTAwMDAwMCwJImNtcGlqZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNiMDAwMDAwLAkiY21waWpnZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNjMDAwMDAwLAkiY21waWpsIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2QwMDAwMDAsCSJjbXBpam5lIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2UwMDAwMDAsCSJjbXBpamxlIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2YwMDAwMDAsCSJjbXBpam8iLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCi0JeyAweDgwMDAwMDAwLAkibGRvYiIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4ODIwMDAwMDAsCSJzdG9iIiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCXsgMHg4NDAwMDAwMCwJImJ4IiwJCUlfQkFTRSwJTUVNMSwJMSwgeyBNLCAgMCwgIDAgfSB9LAotCXsgMHg4NTAwMDAwMCwJImJhbHgiLAkJSV9CQVNFLAlNRU0xLAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweDg2MDAwMDAwLAkiY2FsbHgiLAlJX0JBU0UsCU1FTTEsCTEsIHsgTSwgIDAsICAwIH0gfSwKLQl7IDB4ODgwMDAwMDAsCSJsZG9zIiwJCUlfQkFTRSwJTUVNMiwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHg4YTAwMDAwMCwJInN0b3MiLAkJSV9CQVNFLAlNRU0yLAkyLCB7IFIsICBNLCAgMCB9IH0sCi0JeyAweDhjMDAwMDAwLAkibGRhIiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHg5MDAwMDAwMCwJImxkIiwJCUlfQkFTRSwJTUVNNCwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHg5MjAwMDAwMCwJInN0IiwJCUlfQkFTRSwJTUVNNCwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCXsgMHg5ODAwMDAwMCwJImxkbCIsCQlJX0JBU0UsCU1FTTgsCTIsIHsgTSwgIFIyLCAwIH0gfSwKLQl7IDB4OWEwMDAwMDAsCSJzdGwiLAkJSV9CQVNFLAlNRU04LAkyLCB7IFIyLCBNLCAgMCB9IH0sCi0JeyAweGEwMDAwMDAwLAkibGR0IiwJCUlfQkFTRSwJTUVNMTIsCTIsIHsgTSwgIFI0LCAwIH0gfSwKLQl7IDB4YTIwMDAwMDAsCSJzdHQiLAkJSV9CQVNFLAlNRU0xMiwJMiwgeyBSNCwgTSwgIDAgfSB9LAotCXsgMHhiMDAwMDAwMCwJImxkcSIsCQlJX0JBU0UsCU1FTTE2LAkyLCB7IE0sICBSNCwgMCB9IH0sCi0JeyAweGIyMDAwMDAwLAkic3RxIiwJCUlfQkFTRSwJTUVNMTYsCTIsIHsgUjQsIE0sICAwIH0gfSwKLQl7IDB4YzAwMDAwMDAsCSJsZGliIiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHhjMjAwMDAwMCwJInN0aWIiLAkJSV9CQVNFLAlNRU0xLAkyLCB7IFIsICBNLCAgMCB9IH0sCi0JeyAweGM4MDAwMDAwLAkibGRpcyIsCQlJX0JBU0UsCU1FTTIsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4Y2EwMDAwMDAsCSJzdGlzIiwJCUlfQkFTRSwJTUVNMiwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCi0JeyBSXzMoMHg1ODApLAkibm90Yml0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODEpLAkiYW5kIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTgyKSwJImFuZG5vdCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTgzKSwJInNldGJpdCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTg0KSwJIm5vdGFuZCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTg2KSwJInhvciIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4NyksCSJvciIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4OCksCSJub3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODkpLAkieG5vciIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMkQoMHg1OGEpLAkibm90IiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCi0JeyBSXzMoMHg1OGIpLAkib3Jub3QiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4YyksCSJjbHJiaXQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4ZCksCSJub3RvciIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NThlKSwJIm5hbmQiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OGYpLAkiYWx0ZXJiaXQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5MCksCSJhZGRvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTkxKSwJImFkZGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OTIpLAkic3VibyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5MyksCSJzdWJpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTk4KSwJInNocm8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OWEpLAkic2hyZGkiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5YiksCSJzaHJpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTljKSwJInNobG8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OWQpLAkicm90YXRlIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OWUpLAkic2hsaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMigweDVhMCksCSJjbXBvIiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NWExKSwJImNtcGkiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1YTIpLAkiY29uY21wbyIsCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NWEzKSwJImNvbmNtcGkiLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMygweDVhNCksCSJjbXBpbmNvIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1YTUpLAkiY21waW5jaSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NWE2KSwJImNtcGRlY28iLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDVhNyksCSJjbXBkZWNpIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzIoMHg1YWMpLAkic2NhbmJ5dGUiLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDVhZSksCSJjaGtiaXQiLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMygweDViMCksCSJhZGRjIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NWIyKSwJInN1YmMiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzJEKDB4NWNjKSwJIm1vdiIsCQlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAotCXsgUl8yRCgweDVkYyksCSJtb3ZsIiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJMMixSMiwgMCB9IH0sCi0JeyBSXzJEKDB4NWVjKSwJIm1vdnQiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUkw0LFI0LCAwIH0gfSwKLQl7IFJfMkQoMHg1ZmMpLAkibW92cSIsCQlJX0JBU0UsCVJFRywJMiwgeyBSTDQsUjQsIDAgfSB9LAotCXsgUl8zKDB4NjEwKSwJImF0bW9kIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlMsIFJTTCxSIH0gfSwKLQl7IFJfMygweDYxMiksCSJhdGFkZCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTLCBSU0wsUlMgfSB9LAotCXsgUl8yRCgweDY0MCksCSJzcGFuYml0IiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTLCAwIH0gfSwKLQl7IFJfMkQoMHg2NDEpLAkic2NhbmJpdCIsCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCi0JeyBSXzMoMHg2NDUpLAkibW9kYWMiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDY1MCksCSJtb2RpZnkiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFIgfSB9LAotCXsgUl8zKDB4NjUxKSwJImV4dHJhY3QiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFIgfSB9LAotCXsgUl8zKDB4NjU0KSwJIm1vZHRjIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg2NTUpLAkibW9kcGMiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFIgfSB9LAotCXsgUl8xKDB4NjYwKSwJImNhbGxzIiwJSV9CQVNFLAlSRUcsCTEsIHsgUlNMLCAwLCAwIH0gfSwKLQl7IFJfMCgweDY2YiksCSJtYXJrIiwJCUlfQkFTRSwJUkVHLAkwLCB7IDAsIDAsIDAgfQl9LAotCXsgUl8wKDB4NjZjKSwJImZtYXJrIiwJSV9CQVNFLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCi0JeyBSXzAoMHg2NmQpLAkiZmx1c2hyZWciLAlJX0JBU0UsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMCgweDY2ZiksCSJzeW5jZiIsCUlfQkFTRSwJUkVHLAkwLCB7IDAsIDAsIDAgfQl9LAotCXsgUl8zKDB4NjcwKSwJImVtdWwiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSMiB9IH0sCi0JeyBSXzMoMHg2NzEpLAkiZWRpdiIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUkwyLFJTIH0gfSwKLQl7IFJfMkQoMHg2NzIpLAkiY3Z0YWRyIiwJSV9DQVNJTSxSRUcsIAkyLCB7IFJMLCBSMiwgMCB9IH0sCi0JeyBSXzMoMHg3MDEpLAkibXVsbyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDcwOCksCSJyZW1vIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzBiKSwJImRpdm8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3NDEpLAkibXVsaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc0OCksCSJyZW1pIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzQ5KSwJIm1vZGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3NGIpLAkiZGl2aSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQotCS8qIEZsb2F0aW5nLXBvaW50IGluc3RydWN0aW9ucyAqLwotCi0JeyBSXzJEKDB4Njc0KSwJImN2dGlyIiwJSV9GUCwJUkVHLAkyLCB7IFJMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2NzUpLAkiY3Z0aWxyIiwJSV9GUCwJUkVHLAkyLCB7IFJMLCBGLCAwIH0gfSwKLQl7IFJfMygweDY3NiksCSJzY2FsZXJsIiwJSV9GUCwJUkVHLAkzLCB7IFJMLCBGTDIsRjIgfSB9LAotCXsgUl8zKDB4Njc3KSwJInNjYWxlciIsCUlfRlAsCVJFRywJMywgeyBSTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NjgwKSwJImF0YW5yIiwJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg2ODEpLAkibG9nZXByIiwJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg2ODIpLAkibG9nciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDY4MyksCSJyZW1yIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8yKDB4Njg0KSwJImNtcG9yIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBGTCwgMCB9IH0sCi0JeyBSXzIoMHg2ODUpLAkiY21wciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEZMLCAwIH0gfSwKLQl7IFJfMkQoMHg2ODgpLAkic3FydHIiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4OSksCSJleHByIiwJCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4NjhhKSwJImxvZ2JuciIsCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4NjhiKSwJInJvdW5kciIsCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4NjhjKSwJInNpbnIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2OGQpLAkiY29zciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4ZSksCSJ0YW5yIiwJCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzEoMHg2OGYpLAkiY2xhc3NyIiwJSV9GUCwJUkVHLAkxLCB7IEZMLCAwLCAwIH0JfSwKLQl7IFJfMygweDY5MCksCSJhdGFucmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg2OTEpLAkibG9nZXBybCIsCUlfRlAsCVJFRywJMywgeyBGTDIsRkwyLEYyIH0gfSwKLQl7IFJfMygweDY5MiksCSJsb2dybCIsCUlfRlAsCVJFRywJMywgeyBGTDIsRkwyLEYyIH0gfSwKLQl7IFJfMygweDY5MyksCSJyZW1ybCIsCUlfRlAsCVJFRywJMywgeyBGTDIsRkwyLEYyIH0gfSwKLQl7IFJfMigweDY5NCksCSJjbXBvcmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEZMMiwgMCB9IH0sCi0JeyBSXzIoMHg2OTUpLAkiY21wcmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEZMMiwgMCB9IH0sCi0JeyBSXzJEKDB4Njk4KSwJInNxcnRybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8yRCgweDY5OSksCSJleHBybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8yRCgweDY5YSksCSJsb2dibnJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjliKSwJInJvdW5kcmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OWMpLAkic2lucmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OWQpLAkiY29zcmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OWUpLAkidGFucmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMSgweDY5ZiksCSJjbGFzc3JsIiwJSV9GUCwJUkVHLAkxLCB7IEZMMiwgMCwgMCB9IH0sCi0JeyBSXzJEKDB4NmMwKSwJImN2dHJpIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBSLCAwIH0gfSwKLQl7IFJfMkQoMHg2YzEpLAkiY3Z0cmlsIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBSMiwgMCB9IH0sCi0JeyBSXzJEKDB4NmMyKSwJImN2dHpyaSIsCUlfRlAsCVJFRywJMiwgeyBGTCwgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NmMzKSwJImN2dHpyaWwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIFIyLCAwIH0gfSwKLQl7IFJfMkQoMHg2YzkpLAkibW92ciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDZkOSksCSJtb3ZybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8yRCgweDZlMSksCSJtb3ZyZSIsCUlfRlAsCVJFRywJMiwgeyBGTDQsRjQsIDAgfSB9LAotCXsgUl8zKDB4NmUyKSwJImNweXNyZSIsCUlfRlAsCVJFRywJMywgeyBGTDQsRkw0LEY0IH0gfSwKLQl7IFJfMygweDZlMyksCSJjcHlyc3JlIiwJSV9GUCwJUkVHLAkzLCB7IEZMNCxGTDQsRjQgfSB9LAotCXsgUl8zKDB4NzhiKSwJImRpdnIiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg3OGMpLAkibXVsciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDc4ZCksCSJzdWJyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NzhmKSwJImFkZHIiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg3OWIpLAkiZGl2cmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg3OWMpLAkibXVscmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg3OWQpLAkic3VicmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg3OWYpLAkiYWRkcmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0KLQkvKiBUaGVzZSBhcmUgdGhlIGZsb2F0aW5nIHBvaW50IGJyYW5jaCBpbnN0cnVjdGlvbnMuICBFYWNoIGFjdHVhbGx5Ci0JICogZ2VuZXJhdGVzIDIgYnJhbmNoIGluc3RydWN0aW9uczogIHRoZSBmaXJzdCBhIENUUkwgaW5zdHJ1Y3Rpb24gd2l0aAotCSAqIHRoZSBpbmRpY2F0ZWQgb3Bjb2RlLCBhbmQgdGhlIHNlY29uZCBhICdibm8nLgotCSAqLwotCi0JeyAweDEyMDAwMDAwLAkiYnJ1ZSIsCQlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQl7IDB4MTEwMDAwMDAsCSJicnVnIiwJCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCXsgMHgxMzAwMDAwMCwJImJydWdlIiwJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0JeyAweDE0MDAwMDAwLAkiYnJ1bCIsCQlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQl7IDB4MTYwMDAwMDAsCSJicnVsZSIsCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCXsgMHgxNTAwMDAwMCwJImJydWxnIiwJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0KLQotCS8qIERlY2ltYWwgaW5zdHJ1Y3Rpb25zICovCi0KLQl7IFJfMygweDY0MiksCSJkYWRkYyIsCUlfREVDLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg2NDMpLAkiZHN1YmMiLAlJX0RFQywJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8yRCgweDY0NCksCSJkbW92dCIsCUlfREVDLAlSRUcsCTIsIHsgUlNMLFJTLCAwIH0gfSwKLQotCi0JLyogS1ggZXh0ZW5zaW9ucyAqLwotCi0JeyBSXzIoMHg2MDApLAkic3lubW92IiwJSV9LWCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMigweDYwMSksCSJzeW5tb3ZsIiwJSV9LWCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMigweDYwMiksCSJzeW5tb3ZxIiwJSV9LWCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMkQoMHg2MTUpLAkic3lubGQiLAlJX0tYLAlSRUcsCTIsIHsgUiwgIFIsIDAgfSB9LAotCi0KLQkvKiBNQyBleHRlbnNpb25zICovCi0KLQl7IFJfMygweDYwMyksCSJjbXBzdHIiLAlJX01JTCwJUkVHLAkzLCB7IFIsICBSLCAgUkwgfSB9LAotCXsgUl8zKDB4NjA0KSwJIm1vdnFzdHIiLAlJX01JTCwJUkVHLAkzLCB7IFIsICBSLCAgUkwgfSB9LAotCXsgUl8zKDB4NjA1KSwJIm1vdnN0ciIsCUlfTUlMLAlSRUcsCTMsIHsgUiwgIFIsICBSTCB9IH0sCi0JeyBSXzJEKDB4NjEzKSwJImluc3BhY2MiLAlJX01JTCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMkQoMHg2MTQpLAkibGRwaHkiLAlJX01JTCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMygweDYxNyksCSJmaWxsIiwJCUlfTUlMLAlSRUcsCTMsIHsgUiwgIFJMLCBSTCB9IH0sCi0JeyBSXzJEKDB4NjQ2KSwJImNvbmRyZWMiLAlJX01JTCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMkQoMHg2NTYpLAkicmVjZWl2ZSIsCUlfTUlMLAlSRUcsCTIsIHsgUiwgIFIsIDAgfSB9LAotCXsgUl8zKDB4NjYyKSwJInNlbmQiLAkJSV9NSUwsCVJFRywJMywgeyBSLCAgUkwsIFIgfSB9LAotCXsgUl8xKDB4NjYzKSwJInNlbmRzZXJ2IiwJSV9NSUwsCVJFRywJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IFJfMSgweDY2NCksCSJyZXN1bXByY3MiLAlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgUl8xKDB4NjY1KSwJInNjaGVkcHJjcyIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzAoMHg2NjYpLAkic2F2ZXByY3MiLAlJX01JTCwJUkVHLAkwLCB7IDAsIDAsIDAgfQl9LAotCXsgUl8xKDB4NjY4KSwJImNvbmR3YWl0IiwJSV9NSUwsCVJFRywJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IFJfMSgweDY2OSksCSJ3YWl0IiwJCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzEoMHg2NmEpLAkic2lnbmFsIiwJSV9NSUwsCVJFRywJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IFJfMUQoMHg2NzMpLAkibGR0aW1lIiwJSV9NSUwsCVJFRywJMSwgeyBSMiwgMCwgMCB9CX0sCi0KLQotCS8qIENYIGV4dGVuc2lvbnMgKi8KLQotCXsgUl8zKDB4NWQ4KSwJImVzaHJvIiwJSV9DWDIsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDYzMCksCSJzZG1hIiwJCUlfQ1gsCVJFRywJMywgeyBSU0wsUlNMLFJMIH0gfSwKLQl7IFJfMygweDYzMSksCSJ1ZG1hIiwJCUlfQ1gsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMygweDY1OSksCSJzeXNjdGwiLAlJX0NYMiwJUkVHLAkzLCB7IFJTTCxSU0wsUkwgfSB9LAotCi0KLQkvKiBKeCBleHRlbnNpb25zLiAgKi8KLQl7IFJfMygweDc4MCksCSJhZGRvbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3OTApLAkiYWRkb2ciLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YTApLAkiYWRkb2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YjApLAkiYWRkb2dlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2MwKSwJImFkZG9sIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2QwKSwJImFkZG9uZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdlMCksCSJhZGRvbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZjApLAkiYWRkb28iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ODEpLAkiYWRkaW5vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzkxKSwJImFkZGlnIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2ExKSwJImFkZGllIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2IxKSwJImFkZGlnZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdjMSksCSJhZGRpbCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdkMSksCSJhZGRpbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTEpLAkiYWRkaWxlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2YxKSwJImFkZGlvIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCi0JeyBSXzJEKDB4NWFkKSwJImJzd2FwIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCwgUlMsIDAgfSB9LAotCi0JeyBSXzIoMHg1OTQpLAkiY21wb2IiLAlJX0pYLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1OTUpLAkiY21waWIiLAlJX0pYLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1OTYpLAkiY21wb3MiLAlJX0pYLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1OTcpLAkiY21waXMiLAlJX0pYLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0KLQl7IFJfMygweDc4NCksCSJzZWxubyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc5NCksCSJzZWxnIiwJCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdhNCksCSJzZWxlIiwJCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdiNCksCSJzZWxnZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdjNCksCSJzZWxsIiwJCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdkNCksCSJzZWxuZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdlNCksCSJzZWxsZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdmNCksCSJzZWxvIiwJCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQotCXsgUl8zKDB4NzgyKSwJInN1Ym9ubyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc5MiksCSJzdWJvZyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdhMiksCSJzdWJvZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdiMiksCSJzdWJvZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YzIpLAkic3Vib2wiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZDIpLAkic3Vib25lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2UyKSwJInN1Ym9sZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdmMiksCSJzdWJvbyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc4MyksCSJzdWJpbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3OTMpLAkic3ViaWciLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YTMpLAkic3ViaWUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YjMpLAkic3ViaWdlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2MzKSwJInN1YmlsIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2QzKSwJInN1YmluZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdlMyksCSJzdWJpbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZjMpLAkic3ViaW8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0KLQl7IFJfMygweDY1YyksCSJkY2N0bCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJMIH0gfSwKLQl7IFJfMygweDY1YiksCSJpY2N0bCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMkQoMHg2NTgpLAkiaW50Y3RsIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCwgUlMsIDAgfSB9LAotCXsgUl8wKDB4NWI0KSwJImludGRpcyIsCUlfSlgsCVJFRywJMCwgeyAgIDAsICAwLCAwIH0gfSwKLQl7IFJfMCgweDViNSksCSJpbnRlbiIsCUlfSlgsCVJFRywJMCwgeyAgIDAsICAwLCAwIH0gfSwKLQl7IFJfMCgweDY1ZCksCSJoYWx0IiwJCUlfSlgsCVJFRywJMSwgeyBSU0wsICAwLCAwIH0gfSwKLQotCS8qIEh4IGV4dGVuc2lvbnMuICAqLwotCXsgMHhhYzAwMDAwMCwJImRjaW52YSIsCUlfSFgsCU1FTTEsCTEsIHsgICBNLCAgMCwgMCB9IH0sCi0KLQkvKiBFTkQgT0YgVEFCTEUgKi8KLQotCXsgMCwJCU5VTEwsCQkwLAkwLAkwLCB7IDAsIDAsIDAgfQl9Ci19OwotCi0gLyogZW5kIG9mIGk5NjAtb3Bjb2RlLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL202OGsuaCBiL2luY2x1ZGUvb3Bjb2RlL202OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwOGI3Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9tNjhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGhlYWRlciBmb3IgbTY4MFswMTIzNF0wL202ODg4WzEyXS9tNjg4NTEuCi0gICBDb3B5cmlnaHQgMTk4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlc2UgYXJlIHVzZWQgYXMgYml0IGZsYWdzIGZvciB0aGUgYXJjaCBmaWVsZCBpbiB0aGUgbTY4a19vcGNvZGUKLSAgIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lCV9tNjhrX3VuZGVmICAwCi0jZGVmaW5lCW02ODAwMCAgMHgwMDEKLSNkZWZpbmUJbTY4MDA4ICBtNjgwMDAgLyogc3lub255bSBmb3IgLW02ODAwMC4gIG90aGVyd2lzZSB1bnVzZWQuICovCi0jZGVmaW5lCW02ODAxMCAgMHgwMDIKLSNkZWZpbmUJbTY4MDIwICAweDAwNAotI2RlZmluZQltNjgwMzAgIDB4MDA4Ci0jZGVmaW5lIG02OGVjMDMwIG02ODAzMCAvKiBzaW1pbGFyIGVub3VnaCB0byAtbTY4MDMwIHRvIGlnbm9yZSBkaWZmZXJlbmNlczsKLQkJCSAgIGdhcyB3aWxsIGRlYWwgd2l0aCB0aGUgZmV3IGRpZmZlcmVuY2VzLiAgKi8KLSNkZWZpbmUJbTY4MDQwICAweDAxMAotLyogdGhlcmUgaXMgbm8gNjgwNTAgKi8KLSNkZWZpbmUgbTY4MDYwICAweDAyMAotI2RlZmluZQltNjg4ODEgIDB4MDQwCi0jZGVmaW5lCW02ODg4MiAgbTY4ODgxIC8qIHN5bm9ueW0gZm9yIC1tNjg4ODEuICBvdGhlcndpc2UgdW51c2VkLiAqLwotI2RlZmluZQltNjg4NTEgIDB4MDgwCi0jZGVmaW5lIGNwdTMyCTB4MTAwCS8qIGUuZy4sIDY4MzMyICovCi0jZGVmaW5lIG1jZjUyMDAgMHgyMDAKLSNkZWZpbmUgbWNmNTIwNmUgMHg0MDAKLSNkZWZpbmUgbWNmNTMwNyAweDgwMAotCi0gLyogaGFuZHkgYWxpYXNlcyAqLwotI2RlZmluZQltNjgwNDB1cCAgKG02ODA0MCB8IG02ODA2MCkKLSNkZWZpbmUJbTY4MDMwdXAgIChtNjgwMzAgfCBtNjgwNDB1cCkKLSNkZWZpbmUJbTY4MDIwdXAgIChtNjgwMjAgfCBtNjgwMzB1cCkKLSNkZWZpbmUJbTY4MDEwdXAgIChtNjgwMTAgfCBjcHUzMiB8IG02ODAyMHVwKQotI2RlZmluZQltNjgwMDB1cCAgKG02ODAwMCB8IG02ODAxMHVwKQotI2RlZmluZSBtY2YgICAgICAgKG1jZjUyMDAgfCBtY2Y1MjA2ZSB8IG1jZjUzMDcpCi0KLSNkZWZpbmUJbWZsb2F0ICAobTY4ODgxIHwgbTY4ODgyIHwgbTY4MDQwIHwgbTY4MDYwKQotI2RlZmluZQltbW11ICAgIChtNjg4NTEgfCBtNjgwMzAgfCBtNjgwNDAgfCBtNjgwNjApCi0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGZvciBhbiBvcGNvZGUuICAqLwotCi1zdHJ1Y3QgbTY4a19vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgLyogVGhlIG1hc2sgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXRjaDsKLSAgLyogVGhlIGFyZ3VtZW50cy4gICovCi0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIC8qIFRoZSBhcmNoaXRlY3R1cmVzIHdoaWNoIHN1cHBvcnQgdGhpcyBvcGNvZGUuICAqLwotICB1bnNpZ25lZCBpbnQgYXJjaDsKLX07Ci0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGZvciBhbiBvcGNvZGUgYWxpYXMuICAqLwotCi1zdHJ1Y3QgbTY4a19vcGNvZGVfYWxpYXMKLXsKLSAgLyogVGhlIGFsaWFzIG5hbWUuICAqLwotICBjb25zdCBjaGFyICphbGlhczsKLSAgLyogVGhlIGluc3RydWN0aW9uIGZvciB3aGljaCB0aGlzIGlzIGFuIGFsaWFzLiAgKi8KLSAgY29uc3QgY2hhciAqcHJpbWFyeTsKLX07Ci0KLS8qIFdlIHN0b3JlIGZvdXIgYnl0ZXMgb2Ygb3Bjb2RlIGZvciBhbGwgb3Bjb2RlcyBiZWNhdXNlIHRoYXQgaXMgdGhlCi0gICBtb3N0IGFueSBvZiB0aGVtIG5lZWQuICBUaGUgYWN0dWFsIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbiBpcwotICAgYWx3YXlzIGF0IGxlYXN0IDIgYnl0ZXMsIGFuZCBpcyBhcyBtdWNoIGxvbmdlciBhcyBuZWNlc3NhcnkgdG8gaG9sZAotICAgdGhlIG9wZXJhbmRzIGl0IGhhcy4KLQotICAgVGhlIG1hdGNoIGZpZWxkIGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoIHBhcnRpY3VsYXIKLSAgIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2Ugb2YgdGhhdAotICAgb3Bjb2RlLgotCi0gICBUaGUgYXJncyBmaWVsZCBpcyBhIHN0cmluZyBjb250YWluaW5nIHR3byBjaGFyYWN0ZXJzIGZvciBlYWNoCi0gICBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSBmaXJzdCBzcGVjaWZpZXMgdGhlIGtpbmQgb2YKLSAgIG9wZXJhbmQ7IHRoZSBzZWNvbmQsIHRoZSBwbGFjZSBpdCBpcyBzdG9yZWQuICAqLwotCi0vKiBLaW5kcyBvZiBvcGVyYW5kczoKLSAgIENoYXJhY3RlcnMgdXNlZDogQWFCQ2NEZEVGZkdISUprTGxNbW5Pb3BRcVJyU3NUdFUgVnZXWFlaMDEyM3wqfiU7QCEmJD8vPD4jXistCi0KLSAgIEQgIGRhdGEgcmVnaXN0ZXIgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMuCi0gICBBICBhZGRyZXNzIHJlZ2lzdGVyIG9ubHkuICBTdG9yZWQgYXMgMyBiaXRzLgotICAgYSAgYWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCBvbmx5LiAgU3RvcmVkIGFzIDMgYml0cy4KLSAgIFIgIGVpdGhlciBraW5kIG9mIHJlZ2lzdGVyLiAgU3RvcmVkIGFzIDQgYml0cy4KLSAgIHIgIGVpdGhlciBraW5kIG9mIHJlZ2lzdGVyIGluZGlyZWN0IG9ubHkuICBTdG9yZWQgYXMgNCBiaXRzLgotICAgICAgQXQgdGhlIG1vbWVudCwgdXNlZCBvbmx5IGZvciBjYXMyIGluc3RydWN0aW9uLgotICAgRiAgZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgcmVnaXN0ZXIgb25seS4gICBTdG9yZWQgYXMgMyBiaXRzLgotICAgTyAgYW4gb2Zmc2V0IChvciB3aWR0aCk6IGltbWVkaWF0ZSBkYXRhIDAtMzEgb3IgZGF0YSByZWdpc3Rlci4KLSAgICAgIFN0b3JlZCBhcyA2IGJpdHMgaW4gc3BlY2lhbCBmb3JtYXQgZm9yIEJGLi4uIGluc25zLgotICAgKyAgYXV0b2luY3JlbWVudCBvbmx5LiAgU3RvcmVkIGFzIDMgYml0cyAobnVtYmVyIG9mIHRoZSBhZGRyZXNzIHJlZ2lzdGVyKS4KLSAgIC0gIGF1dG9kZWNyZW1lbnQgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMgKG51bWJlciBvZiB0aGUgYWRkcmVzcyByZWdpc3RlcikuCi0gICBRICBxdWljayBpbW1lZGlhdGUgZGF0YS4gIFN0b3JlZCBhcyAzIGJpdHMuCi0gICAgICBUaGlzIG1hdGNoZXMgYW4gaW1tZWRpYXRlIG9wZXJhbmQgb25seSB3aGVuIHZhbHVlIGlzIGluIHJhbmdlIDEgLi4gOC4KLSAgIE0gIG1vdmVxIGltbWVkaWF0ZSBkYXRhLiAgU3RvcmVkIGFzIDggYml0cy4KLSAgICAgIFRoaXMgbWF0Y2hlcyBhbiBpbW1lZGlhdGUgb3BlcmFuZCBvbmx5IHdoZW4gdmFsdWUgaXMgaW4gcmFuZ2UgLTEyOC4uMTI3Ci0gICBUICB0cmFwIHZlY3RvciBpbW1lZGlhdGUgZGF0YS4gIFN0b3JlZCBhcyA0IGJpdHMuCi0KLSAgIGsgIEstZmFjdG9yIGZvciBmbW92ZS5wIGluc3RydWN0aW9uLiAgIFN0b3JlZCBhcyBhIDctYml0IGNvbnN0YW50IG9yCi0gICAgICBhIHRocmVlIGJpdCByZWdpc3RlciBvZmZzZXQsIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZS4KLQotICAgIyAgaW1tZWRpYXRlIGRhdGEuICBTdG9yZWQgaW4gc3BlY2lhbCBwbGFjZXMgKGIsIHcgb3IgbCkKLSAgICAgIHdoaWNoIHNheSBob3cgbWFueSBiaXRzIHRvIHN0b3JlLgotICAgXiAgaW1tZWRpYXRlIGRhdGEgZm9yIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4gICBTcGVjaWFsIHBsYWNlcwotICAgICAgYXJlIG9mZnNldCBieSAyIGJ5dGVzIGZyb20gJyMnLi4uCi0gICBCICBwYy1yZWxhdGl2ZSBhZGRyZXNzLCBjb252ZXJ0ZWQgdG8gYW4gb2Zmc2V0Ci0gICAgICB0aGF0IGlzIHRyZWF0ZWQgYXMgaW1tZWRpYXRlIGRhdGEuCi0gICBkICBkaXNwbGFjZW1lbnQgYW5kIHJlZ2lzdGVyLiAgU3RvcmVzIHRoZSByZWdpc3RlciBhcyAzIGJpdHMKLSAgICAgIGFuZCBzdG9yZXMgdGhlIGRpc3BsYWNlbWVudCBpbiB0aGUgZW50aXJlIHNlY29uZCB3b3JkLgotCi0gICBDICB0aGUgQ0NSLiAgTm8gbmVlZCB0byBzdG9yZSBpdDsgdGhpcyBpcyBqdXN0IGZvciBmaWx0ZXJpbmcgdmFsaWRpdHkuCi0gICBTICB0aGUgU1IuICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgotICAgVSAgdGhlIFVTUC4gIE5vIG5lZWQgdG8gc3RvcmUsIGp1c3QgYXMgd2l0aCBDQ1IuCi0gICBFICB0aGUgQUNDLiAgTm8gbmVlZCB0byBzdG9yZSwganVzdCBhcyB3aXRoIENDUi4KLSAgIEcgIHRoZSBNQUNTUi4gIE5vIG5lZWQgdG8gc3RvcmUsIGp1c3QgYXMgd2l0aCBDQ1IuCi0gICBIICB0aGUgTUFTSy4gIE5vIG5lZWQgdG8gc3RvcmUsIGp1c3QgYXMgd2l0aCBDQ1IuCi0KLSAgIEkgIENvcHJvY2Vzc29yIElELiAgIE5vdCBwcmludGVkIGlmIDEuICAgVGhlIENvcHJvY2Vzc29yIElEIGlzIGFsd2F5cwotICAgICAgZXh0cmFjdGVkIGZyb20gdGhlICdkJyBmaWVsZCBvZiB3b3JkIG9uZSwgd2hpY2ggbWVhbnMgdGhhdCBhbiBleHRlbmRlZAotICAgICAgY29wcm9jZXNzb3Igb3Bjb2RlIGNhbiBiZSBza2lwcGVkIHVzaW5nIHRoZSAnaScgcGxhY2UsIGlmIG5lZWRlZC4KLQotICAgcyAgU3lzdGVtIENvbnRyb2wgcmVnaXN0ZXIgZm9yIHRoZSBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3Nvci4KLQotICAgSiAgTWlzYyByZWdpc3RlciBmb3IgbW92ZWMgaW5zdHJ1Y3Rpb24sIHN0b3JlZCBpbiAnaicgZm9ybWF0LgotCVBvc3NpYmxlIHZhbHVlczoKLQkweDAwMAlTRkMJU291cmNlIEZ1bmN0aW9uIENvZGUgcmVnCVs2MCwgNDAsIDMwLCAyMCwgMTBdCi0JMHgwMDEJREZDCURhdGEgRnVuY3Rpb24gQ29kZSByZWcJCVs2MCwgNDAsIDMwLCAyMCwgMTBdCi0JMHgwMDIJQ0FDUglDYWNoZSBDb250cm9sIFJlZ2lzdGVyCQlbNjAsIDQwLCAzMCwgMjBdCi0JMHgwMDMJVEMJTU1VIFRyYW5zbGF0aW9uIENvbnRyb2wJCVs2MCwgNDBdCi0JMHgwMDQJSVRUMAlJbnN0cnVjdGlvbiBUcmFuc3BhcmVudAotCQkJCVRyYW5zbGF0aW9uIHJlZyAwCVs2MCwgNDBdCi0JMHgwMDUJSVRUMQlJbnN0cnVjdGlvbiBUcmFuc3BhcmVudAotCQkJCVRyYW5zbGF0aW9uIHJlZyAxCVs2MCwgNDBdCi0JMHgwMDYJRFRUMAlEYXRhIFRyYW5zcGFyZW50Ci0JCQkJVHJhbnNsYXRpb24gcmVnIDAJWzYwLCA0MF0KLQkweDAwNwlEVFQxCURhdGEgVHJhbnNwYXJlbnQKLQkJCQlUcmFuc2xhdGlvbiByZWcgMQlbNjAsIDQwXQotCTB4MDA4CUJVU0NSCUJ1cyBDb250cm9sIFJlZ2lzdGVyCQlbNjBdCi0JMHg4MDAJVVNQCVVzZXIgU3RhY2sgUG9pbnRlcgkJWzYwLCA0MCwgMzAsIDIwLCAxMF0KLQkweDgwMQlWQlIJVmVjdG9yIEJhc2UgcmVnCQkJWzYwLCA0MCwgMzAsIDIwLCAxMF0KLQkweDgwMglDQUFSCUNhY2hlIEFkZHJlc3MgUmVnaXN0ZXIJCVsgICAgICAgIDMwLCAyMF0KLQkweDgwMwlNU1AJTWFzdGVyIFN0YWNrIFBvaW50ZXIJCVsgICAgNDAsIDMwLCAyMF0KLQkweDgwNAlJU1AJSW50ZXJydXB0IFN0YWNrIFBvaW50ZXIJCVsgICAgNDAsIDMwLCAyMF0KLQkweDgwNQlNTVVTUglNTVUgU3RhdHVzIHJlZwkJCVsgICAgNDBdCi0JMHg4MDYJVVJQCVVzZXIgUm9vdCBQb2ludGVyCQlbNjAsIDQwXQotCTB4ODA3CVNSUAlTdXBlcnZpc29yIFJvb3QgUG9pbnRlcgkJWzYwLCA0MF0KLQkweDgwOAlQQ1IJUHJvY2Vzc29yIENvbmZpZ3VyYXRpb24gcmVnCVs2MF0KLQkweEMwMAlST01CQVIJUk9NIEJhc2UgQWRkcmVzcyBSZWdpc3RlcglbNTIwWF0KLQkweEMwNAlSQU1CQVIwCVJBTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMAlbNTIwWF0KLQkweEMwNQlSQU1CQVIxCVJBTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMAlbNTIwWF0KLQkweEMwRglNQkFSMAlSQU0gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDAJWzUyMFhdCi0KLSAgICBMICBSZWdpc3RlciBsaXN0IG9mIHRoZSB0eXBlIGQwLWQ3L2EwLWE3IGV0Yy4KLSAgICAgICAoTmV3ISAgSW1wcm92ZWQhICBDYW4gYWxzbyBob2xkIGZwMC1mcDcsIGFzIHdlbGwhKQotICAgICAgIFRoZSBhc3NlbWJsZXIgdHJpZXMgdG8gc2VlIGlmIHRoZSByZWdpc3RlcnMgbWF0Y2ggdGhlIGluc24gYnkKLSAgICAgICBsb29raW5nIGF0IHdoZXJlIHRoZSBpbnNuIHdhbnRzIHRoZW0gc3RvcmVkLgotCi0gICAgbCAgUmVnaXN0ZXIgbGlzdCBsaWtlIEwsIGJ1dCB3aXRoIGFsbCB0aGUgYml0cyByZXZlcnNlZC4KLSAgICAgICBVc2VkIGZvciBnb2luZyB0aGUgb3RoZXIgd2F5LiAuIC4KLQotICAgIGMgIGNhY2hlIGlkZW50aWZpZXIgd2hpY2ggbWF5IGJlICJuYyIgZm9yIG5vIGNhY2hlLCAiaWMiCi0gICAgICAgZm9yIGluc3RydWN0aW9uIGNhY2hlLCAiZGMiIGZvciBkYXRhIGNhY2hlLCBvciAiYmMiCi0gICAgICAgZm9yIGJvdGggY2FjaGVzLiAgVXNlZCBpbiBjaW52IGFuZCBjcHVzaC4gIEFsd2F5cwotICAgICAgIHN0b3JlZCBpbiBwb3NpdGlvbiAiZCIuCi0KLSAgICB1ICBBbnkgcmVnaXN0ZXIsIHdpdGggYGB1cHBlcicnIG9yIGBgbG93ZXInJyBzcGVjaWZpY2F0aW9uLiAgVXNlZAotICAgICAgIGluIHRoZSBtYWMgaW5zdHJ1Y3Rpb25zIHdpdGggc2l6ZSB3b3JkLgotCi0gVGhlIHJlbWFpbmRlciBhcmUgYWxsIHN0b3JlZCBhcyA2IGJpdHMgdXNpbmcgYW4gYWRkcmVzcyBtb2RlIGFuZCBhCi0gcmVnaXN0ZXIgbnVtYmVyOyB0aGV5IGRpZmZlciBpbiB3aGljaCBhZGRyZXNzaW5nIG1vZGVzIHRoZXkgbWF0Y2guCi0KLSAgICogIGFsbAkJCQkJKG1vZGVzIDAtNiw3LjAtNCkKLSAgIH4gIGFsdGVyYWJsZSBtZW1vcnkJCQkJKG1vZGVzIDItNiw3LjAsNy4xKQotICAgCQkJCQkJKG5vdCAwLDEsNy4yLTQpCi0gICAlICBhbHRlcmFibGUJCQkJCShtb2RlcyAwLTYsNy4wLDcuMSkKLQkJCQkJCShub3QgNy4yLTQpCi0gICA7ICBkYXRhCQkJCQkobW9kZXMgMCwyLTYsNy4wLTQpCi0JCQkJCQkobm90IDEpCi0gICBAICBkYXRhLCBidXQgbm90IGltbWVkaWF0ZQkJCShtb2RlcyAwLDItNiw3LjAtMykKLQkJCQkJCShub3QgMSw3LjQpCi0gICAhICBjb250cm9sCQkJCQkobW9kZXMgMiw1LDYsNy4wLTMpCi0JCQkJCQkobm90IDAsMSwzLDQsNy40KQotICAgJiAgYWx0ZXJhYmxlIGNvbnRyb2wJCQkJKG1vZGVzIDIsNSw2LDcuMCw3LjEpCi0JCQkJCQkobm90IDAsMSw3LjItNCkKLSAgICQgIGFsdGVyYWJsZSBkYXRhCQkJCShtb2RlcyAwLDItNiw3LjAsNy4xKQotCQkJCQkJKG5vdCAxLDcuMi00KQotICAgPyAgYWx0ZXJhYmxlIGNvbnRyb2wsIG9yIGRhdGEgcmVnaXN0ZXIJKG1vZGVzIDAsMiw1LDYsNy4wLDcuMSkKLQkJCQkJCShub3QgMSwzLDQsNy4yLTQpCi0gICAvICBjb250cm9sLCBvciBkYXRhIHJlZ2lzdGVyCQkJKG1vZGVzIDAsMiw1LDYsNy4wLTMpCi0JCQkJCQkobm90IDEsMyw0LDcuNCkKLSAgID4gICpzYXZlIG9wZXJhbmRzCQkJCShtb2RlcyAyLDQsNSw2LDcuMCw3LjEpCi0JCQkJCQkobm90IDAsMSwzLDcuMi00KQotICAgPCAgKnJlc3RvcmUgb3BlcmFuZHMJCQkJKG1vZGVzIDIsMyw1LDYsNy4wLTMpCi0JCQkJCQkobm90IDAsMSw0LDcuNCkKLQotICAgY29sZGZpcmUgbW92ZSBvcGVyYW5kczoKLSAgIG0gIAkJCQkJCShtb2RlcyAwLTQpCi0gICBuCQkJCQkJKG1vZGVzIDUsNy4yKQotICAgbwkJCQkJCShtb2RlcyA2LDcuMCw3LjEsNy4zLDcuNCkKLSAgIHAJCQkJCQkobW9kZXMgMC01KQotCi0gICBjb2xkZmlyZSBic2V0L2JjbHIvYnRzdC9tdWxzbC9tdWx1bCBvcGVyYW5kczoKLSAgIHEJCQkJCQkobW9kZXMgMCwyLTUpCi0gICB2CQkJCQkJKG1vZGVzIDAsMi01LDcuMCw3LjEpCi0qLwotCi0vKiBGb3IgdGhlIDY4ODUxOiAqLwotLyoKLSAgIEkgZGlkbid0IHVzZSBtdWNoIGltYWdpbmF0aW9uIGluIGNob29zaW5nIHRoZSAKLSAgIGZvbGxvd2luZyBjb2Rlcywgc28gbWFueSBvZiB0aGVtIGFyZW4ndCB2ZXJ5Ci0gICBtbmVtb25pYy4gLXJhYgotCi0gICAwICAzMiBiaXQgcG1tdSByZWdpc3RlcgotCVBvc3NpYmxlIHZhbHVlczoKLQkwMDAJVEMJVHJhbnNsYXRpb24gQ29udHJvbCBSZWdpc3RlciAoNjgwMzAsIDY4ODUxKQotCi0gICAxICAxNiBiaXQgcG1tdSByZWdpc3RlcgotCTExMQlBQwlBY2Nlc3MgQ29udHJvbCAoNjg4NTEpCi0KLSAgIDIgIDggYml0IHBtbXUgcmVnaXN0ZXIKLQkxMDAJQ0FMCUN1cnJlbnQgQWNjZXNzIExldmVsICg2ODg1MSkKLQkxMDEJVkFMCVZhbGlkYXRlIEFjY2VzcyBMZXZlbCAoNjg4NTEpCi0JMTEwCVNDQwlTdGFjayBDaGFuZ2UgQ29udHJvbCAoNjg4NTEpCi0KLSAgIDMgIDY4MDMwLW9ubHkgcG1tdSByZWdpc3RlcnMgKDMyIGJpdCkKLQkwMTAJVFQwCVRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIHJlZyAwCi0JCQkoYWthIEFjY2VzcyBDb250cm9sIHJlZyAwIC0tIEFDMCAtLSBvbiA2OGVjMDMwKQotCTAxMQlUVDEJVHJhbnNwYXJlbnQgVHJhbnNsYXRpb24gcmVnIDEKLQkJCShha2EgQWNjZXNzIENvbnRyb2wgcmVnIDEgLS0gQUMxIC0tIG9uIDY4ZWMwMzApCi0KLSAgIFcgIHdpZGUgcG1tdSByZWdpc3RlcnMKLQlQb3NzaWJsZSB2YWx1ZXM6Ci0JMDAxCURSUAlEbWEgUm9vdCBQb2ludGVyICg2ODg1MSkKLQkwMTAJU1JQCVN1cGVydmlzb3IgUm9vdCBQb2ludGVyICg2ODAzMCwgNjg4NTEpCi0JMDExCUNSUAlDcHUgUm9vdCBQb2ludGVyICg2ODAzMCwgNjg4NTEpCi0KLSAgIGYJZnVuY3Rpb24gY29kZSByZWdpc3RlciAoNjgwMzAsIDY4ODUxKQotCTAJU0ZDCi0JMQlERkMKLQotICAgVglWQUwgcmVnaXN0ZXIgb25seSAoNjg4NTEpCi0KLSAgIFgJQkFEeCwgQkFDeCAoMTYgYml0KQotCTEwMAlCQUQJQnJlYWtwb2ludCBBY2tub3dsZWRnZSBEYXRhICg2ODg1MSkKLQkxMDEJQkFDCUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgQ29udHJvbCAoNjg4NTEpCi0KLSAgIFkJUFNSICg2ODg1MSkgKE1NVVNSIG9uIDY4MDMwKSAoQUNVU1Igb24gNjhlYzAzMCkKLSAgIFoJUENTUiAoNjg4NTEpCi0KLSAgIHwJbWVtb3J5IAkJKG1vZGVzIDItNiwgNy4qKQotCi0gICB0ICBhZGRyZXNzIHRlc3QgbGV2ZWwgKDY4MDMwIG9ubHkpCi0gICAgICBTdG9yZWQgYXMgMyBiaXRzLCByYW5nZSAwLTcuCi0gICAgICBBbHNvIHVzZWQgZm9yIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gbm93LgotCi0qLwotCi0vKiBQbGFjZXMgdG8gcHV0IGFuIG9wZXJhbmQsIGZvciBub24tZ2VuZXJhbCBvcGVyYW5kczoKLSAgIENoYXJhY3RlcnMgdXNlZDogQmJDY0RkZ2hpamtMbE1tTm5vc3RXdzEyMzQ1Njc4OQotCi0gICBzICBzb3VyY2UsIGxvdyBiaXRzIG9mIGZpcnN0IHdvcmQuCi0gICBkICBkZXN0LCBzaGlmdGVkIDkgaW4gZmlyc3Qgd29yZAotICAgMSAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgMTIKLSAgIDIgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDYKLSAgIDMgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDAKLSAgIDQgIHRoaXJkIHdvcmQsIHNoaWZ0ZWQgMTIKLSAgIDUgIHRoaXJkIHdvcmQsIHNoaWZ0ZWQgNgotICAgNiAgdGhpcmQgd29yZCwgc2hpZnRlZCAwCi0gICA3ICBzZWNvbmQgd29yZCwgc2hpZnRlZCA3Ci0gICA4ICBzZWNvbmQgd29yZCwgc2hpZnRlZCAxMAotICAgOSAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgNQotICAgRCAgc3RvcmUgaW4gYm90aCBwbGFjZSAxIGFuZCBwbGFjZSAzOyBmb3IgZGl2dWwgYW5kIGRpdnNsLgotICAgQiAgZmlyc3Qgd29yZCwgbG93IGJ5dGUsIGZvciBicmFuY2ggZGlzcGxhY2VtZW50cwotICAgVyAgc2Vjb25kIHdvcmQgKGVudGlyZSksIGZvciBicmFuY2ggZGlzcGxhY2VtZW50cwotICAgTCAgc2Vjb25kIGFuZCB0aGlyZCB3b3JkcyAoZW50aXJlKSwgZm9yIGJyYW5jaCBkaXNwbGFjZW1lbnRzCi0gICAgICAoYWxzbyBvdmVybG9hZGVkIGZvciBtb3ZlMTYpCi0gICBiICBzZWNvbmQgd29yZCwgbG93IGJ5dGUKLSAgIHcgIHNlY29uZCB3b3JkIChlbnRpcmUpIFt2YXJpYWJsZSB3b3JkL2xvbmcgYnJhbmNoIG9mZnNldCBmb3IgZGJyYV0KLSAgIFcgIHNlY29uZCB3b3JkIChlbnRpcmUpIChtdXN0IGJlIHNpZ25lZCAxNiBiaXQgdmFsdWUpCi0gICBsICBzZWNvbmQgYW5kIHRoaXJkIHdvcmQgKGVudGlyZSkKLSAgIGcgIHZhcmlhYmxlIGJyYW5jaCBvZmZzZXQgZm9yIGJyYSBhbmQgc2ltaWxhciBpbnN0cnVjdGlvbnMuCi0gICAgICBUaGUgcGxhY2UgdG8gc3RvcmUgZGVwZW5kcyBvbiB0aGUgbWFnbml0dWRlIG9mIG9mZnNldC4KLSAgIHQgIHN0b3JlIGluIGJvdGggcGxhY2UgNyBhbmQgcGxhY2UgODsgZm9yIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMKLSAgIGMgIGJyYW5jaCBvZmZzZXQgZm9yIGNwQmNjIG9wZXJhdGlvbnMuCi0gICAgICBUaGUgcGxhY2UgdG8gc3RvcmUgaXMgd29yZCB0d28gaWYgYml0IHNpeCBvZiB3b3JkIG9uZSBpcyB6ZXJvLAotICAgICAgYW5kIHdvcmRzIHR3byBhbmQgdGhyZWUgaWYgYml0IHNpeCBvZiB3b3JkIG9uZSBpcyBvbmUuCi0gICBpICBJbmNyZW1lbnQgYnkgdHdvLCB0byBza2lwIG92ZXIgY29wcm9jZXNzb3IgZXh0ZW5kZWQgb3BlcmFuZHMuICAgT25seQotICAgICAgd29ya3Mgd2l0aCB0aGUgJ0knIGZvcm1hdC4KLSAgIGsgIER5bmFtaWMgSy1mYWN0b3IgZmllbGQuICAgQml0cyA2LTQgb2Ygd29yZCAyLCB1c2VkIGFzIGEgcmVnaXN0ZXIgbnVtYmVyLgotICAgICAgQWxzbyB1c2VkIGZvciBkeW5hbWljIGZtb3ZlbSBpbnN0cnVjdGlvbi4KLSAgIEMgIGZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIGNvbnN0YW50IC0gNyBiaXRzLiAgQWxzbyB1c2VkIGZvciBzdGF0aWMKLSAgICAgIEstZmFjdG9ycy4uLgotICAgaiAgTW92ZWMgcmVnaXN0ZXIgIywgc3RvcmVkIGluIDEyIGxvdyBiaXRzIG9mIHNlY29uZCB3b3JkLgotICAgbSAgRm9yIE1bU11BQ3g7IDQgYml0cyBzcGxpdCB3aXRoIE1TQiBzaGlmdGVkIDYgYml0cyBpbiBmaXJzdCB3b3JkCi0gICAgICBhbmQgcmVtYWluaW5nIDMgYml0cyBvZiByZWdpc3RlciBzaGlmdGVkIDkgYml0cyBpbiBmaXJzdCB3b3JkLgotICAgICAgSW5kaWNhdGUgdXBwZXIvbG93ZXIgaW4gMSBiaXQgc2hpZnRlZCA3IGJpdHMgaW4gc2Vjb25kIHdvcmQuCi0gICAgICBVc2Ugd2l0aCBgUicgb3IgYHUnIGZvcm1hdC4KLSAgIG4gIGBtJyB3aXRob3V0aCB1cHBlci9sb3dlciBpbmRpY2F0aW9uLiAoRm9yIE1bU11BQ3g7IDQgYml0cyBzcGxpdAotICAgICAgd2l0aCBNU0Igc2hpZnRlZCA2IGJpdHMgaW4gZmlyc3Qgd29yZCBhbmQgcmVtYWluaW5nIDMgYml0cyBvZgotICAgICAgcmVnaXN0ZXIgc2hpZnRlZCA5IGJpdHMgaW4gZmlyc3Qgd29yZC4gIE5vIHVwcGVyL2xvd2VyCi0gICAgICBpbmRpY2F0aW9uIGlzIGRvbmUuKSAgVXNlIHdpdGggYFInIG9yIGB1JyBmb3JtYXQuCi0gICBvICBGb3IgTVtTXUFDdzsgNCBiaXRzIHNoaWZ0ZWQgMTIgaW4gc2Vjb25kIHdvcmQgKGxpa2UgYDEnKS4KLSAgICAgIEluZGljYXRlIHVwcGVyL2xvd2VyIGluIDEgYml0IHNoaWZ0ZWQgNyBiaXRzIGluIHNlY29uZCB3b3JkLgotICAgICAgVXNlIHdpdGggYFInIG9yIGB1JyBmb3JtYXQuCi0gICBNICBGb3IgTVtTXUFDdzsgNCBiaXRzIGluIGxvdyBiaXRzIG9mIGZpcnN0IHdvcmQuICBJbmRpY2F0ZQotICAgICAgdXBwZXIvbG93ZXIgaW4gMSBiaXQgc2hpZnRlZCA2IGJpdHMgaW4gc2Vjb25kIHdvcmQuICBVc2Ugd2l0aAotICAgICAgYFInIG9yIGB1JyBmb3JtYXQuCi0gICBOICBGb3IgTVtTXUFDdzsgNCBiaXRzIGluIGxvdyBiaXRzIG9mIHNlY29uZCB3b3JkLiAgSW5kaWNhdGUKLSAgICAgIHVwcGVyL2xvd2VyIGluIDEgYml0IHNoaWZ0ZWQgNiBiaXRzIGluIHNlY29uZCB3b3JkLiAgVXNlIHdpdGgKLSAgICAgIGBSJyBvciBgdScgZm9ybWF0LgotICAgaCAgc2hpZnQgaW5kaWNhdG9yIChzY2FsZSBmYWN0b3IpLCAxIGJpdCBzaGlmdGVkIDEwIGluIHNlY29uZCB3b3JkCi0KLSBQbGFjZXMgdG8gcHV0IG9wZXJhbmQsIGZvciBnZW5lcmFsIG9wZXJhbmRzOgotICAgZCAgZGVzdGluYXRpb24sIHNoaWZ0ZWQgNiBiaXRzIGluIGZpcnN0IHdvcmQKLSAgIGIgIHNvdXJjZSwgYXQgbG93IGJpdCBvZiBmaXJzdCB3b3JkLCBhbmQgaW1tZWRpYXRlIHVzZXMgb25lIGJ5dGUKLSAgIHcgIHNvdXJjZSwgYXQgbG93IGJpdCBvZiBmaXJzdCB3b3JkLCBhbmQgaW1tZWRpYXRlIHVzZXMgdHdvIGJ5dGVzCi0gICBsICBzb3VyY2UsIGF0IGxvdyBiaXQgb2YgZmlyc3Qgd29yZCwgYW5kIGltbWVkaWF0ZSB1c2VzIGZvdXIgYnl0ZXMKLSAgIHMgIHNvdXJjZSwgYXQgbG93IGJpdCBvZiBmaXJzdCB3b3JkLgotICAgICAgVXNlZCBzb21ldGltZXMgaW4gY29udGV4dHMgd2hlcmUgaW1tZWRpYXRlIGlzIG5vdCBhbGxvd2VkIGFueXdheS4KLSAgIGYgIHNpbmdsZSBwcmVjaXNpb24gZmxvYXQsIGxvdyBiaXQgb2YgMXN0IHdvcmQsIGltbWVkaWF0ZSB1c2VzIDQgYnl0ZXMKLSAgIEYgIGRvdWJsZSBwcmVjaXNpb24gZmxvYXQsIGxvdyBiaXQgb2YgMXN0IHdvcmQsIGltbWVkaWF0ZSB1c2VzIDggYnl0ZXMKLSAgIHggIGV4dGVuZGVkIHByZWNpc2lvbiBmbG9hdCwgbG93IGJpdCBvZiAxc3Qgd29yZCwgaW1tZWRpYXRlIHVzZXMgMTIgYnl0ZXMKLSAgIHAgIHBhY2tlZCBmbG9hdCwgbG93IGJpdCBvZiAxc3Qgd29yZCwgaW1tZWRpYXRlIHVzZXMgMTIgYnl0ZXMKLSovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgbTY4a19vcGNvZGVzW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzIG02OGtfb3Bjb2RlX2FsaWFzZXNbXTsKLQotZXh0ZXJuIGNvbnN0IGludCBtNjhrX251bW9wY29kZXMsIG02OGtfbnVtYWxpYXNlczsKLQotLyogZW5kIG9mIG02OGstb3Bjb2RlLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL204OGsuaCBiL2luY2x1ZGUvb3Bjb2RlL204OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3ZmEwMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9tODhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MjMgKzAsMCBAQAotLyogVGFibGUgb2Ygb3Bjb2RlcyBmb3IgdGhlIG1vdG9yb2xhIDg4ayBmYW1pbHkuCi0gICBDb3B5cmlnaHQgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCIGFuZCBHQVMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKgkJCURpc2Fzc2VtYmxlciBJbnN0cnVjdGlvbiBUYWJsZQotICoKLSAqCVRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgdGFibGUgaXMgdGhlIG9wY29kZSBmaWVsZC4gSWYgYW4gb3Bjb2RlCi0gKglpcyBzcGVjaWZpZWQgd2hpY2ggaGFzIGFueSBub24tb3Bjb2RlIGJpdHMgb24sIGEgc3lzdGVtIGVycm9yCi0gKgl3aWxsIG9jY3VyIHdoZW4gdGhlIHN5c3RlbSBhdHRlbXB0cyB0aGUgaW5zdGFsbCBpdCBpbnRvIHRoZQotICoJaW5zdHJ1Y3Rpb24gdGFibGUuICBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlCi0gKglpbnN0cnVjdGlvbiBtbmVtb25pYy4gRWFjaCBvcGVyYW5kIGlzIHNwZWNpZmllZCBieSBvZmZzZXQsIHdpZHRoLAotICoJYW5kIHR5cGUuIFRoZSBvZmZzZXQgaXMgdGhlIGJpdCBudW1iZXIgb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50Ci0gKgliaXQgb2YgdGhlIG9wZXJhbmQgd2l0aCBiaXQgMCBiZWluZyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mCi0gKgl0aGUgaW5zdHJ1Y3Rpb24uIFRoZSB3aWR0aCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCB0byBzcGVjaWZ5Ci0gKgl0aGUgb3BlcmFuZC4gVGhlIHR5cGUgc3BlY2lmaWVzIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGJlIHVzZWQgZm9yCi0gKgl0aGUgb3BlcmFuZC4gVGhlIHZhbGlkIGZvcm1hdHMgYXJlOiByZWdpc3RlciwgcmVnaXN0ZXIgaW5kaXJlY3QsCi0gKgloZXggY29uc3RhbnQsIGFuZCBiaXQgZmllbGQgc3BlY2lmaWNhdGlvbi4gIFRoZSBsYXN0IGZpZWxkIGlzIGEKLSAqCXBvaW50ZXIgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaW4gdGhlIGxpbmtlZCBsaXN0LiAgVGhlc2UgcG9pbnRlcnMKLSAqCWFyZSBpbml0aWFsaXplZCBieSBpbml0X2Rpc2FzbSgpLgotICoKLSAqCQkJCVN0cnVjdHVyZSBGb3JtYXQKLSAqCi0gKiAgICAgICBzdHJ1Y3QgSU5TVEFCIHsKLSAqICAgICAgICAgIFVQSU5UIG9wY29kZTsKLSAqICAgICAgICAgIGNoYXIgKm1uZW1vbmljOwotICogICAgICAgICAgc3RydWN0IE9QU1BFQyBvcDEsb3AyLG9wMzsKLSAqICAgICAgICAgIHN0cnVjdCBTSU1fRkxBR1MgZmxnczsKLSAqICAgICAgICAgIHN0cnVjdCBJTlNUQUIgKm5leHQ7Ci0gKiAgICAgICB9Ci0gKgotICogICAgICAgc3RydWN0IE9QU1BFQyB7Ci0gKiAgICAgICAgICBVUElOVCBvZmZzZXQ6NTsKLSAqICAgICAgICAgIFVQSU5UIHdpZHRoOjY7Ci0gKiAgICAgICAgICBVUElOVCB0eXBlOjU7Ci0gKiAgICAgICB9Ci0gKgotICoJCQkJUmV2aXNpb24gSGlzdG9yeQotICoKLSAqCVJldmlzaW9uIDEuMAkxMS8wOC84NQlDcmVhdGlvbiBkYXRlCi0gKgkJIDEuMQkwMi8wNS84NglVcGRhdGVkIGluc3RydWN0aW9uIG1uZW1vbmljIHRhYmxlIE1ECi0gKgkJIDEuMgkwNi8xNi84NglVcGRhdGVkIFNJTV9GTEFHUyBmb3IgZmxvYXRpbmcgcG9pbnQKLSAqCQkgMS4zCTA5LzIwLzg2CVVwZGF0ZWQgZm9yIG5ldyBlbmNvZGluZwotICoJCSAJMDUvMTEvODkJUi4gVHJhd2ljayBhZGFwdGVkIGZyb20gTW90b3JvbGEgZGlzYXNzZW1ibGVyCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLQotLyoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzIG5lZWRlZCB0byBidWlsZCB0aGUgTTg4MDAwCi0gKiBzaW11bGF0b3IuICBJdCBpcyB0aGUgbWFpbiBpbmNsdWRlIGZpbGUsIGNvbnRhaW5pbmcgYWxsIHRoZQotICogc3RydWN0dXJlcywgbWFjcm9zIGFuZCBkZWZpbml0aW9ucyBleGNlcHQgZm9yIHRoZSBmbG9hdGluZyBwb2ludAotICogaW5zdHJ1Y3Rpb24gc2V0LgotICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGZsYWcgaW5mb3JtcyB0aGUgU2ltdWxhdG9yIGFzIHRvIHdoYXQgdHlwZSBvZiBieXRlIG9yZGVyaW5nCi0gKiB3aWxsIGJlIHVzZWQuIEZvciBpbnN0YW5jZSwgYSBCT0ZMQUcgPSAxIGluZGljYXRlcyBhIERFQyBWQVggYW5kIElCTSB0eXBlCi0gKiBvZiBvcmRlcmluZyBzaGFsbCBiZSB1c2VkLgotKi8KLQotLyogIyBkZWZpbmUgICAgIEJPRkxBRyAgIDEgKi8gICAgICAgICAgICAgICAgICAgICAgIC8qIEJZVEUgT1JERVJJTkcgRkxBRyAqLwotCi0vKiBkZWZpbmUgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBwcmltYXJ5IG9wY29kZSBmaWVsZCBvZiB0aGUgaW5zdHJ1Y3Rpb24sCi0gKiB0aGUgZGVzdGluYXRpb24gZmllbGQsIHRoZSBzb3VyY2UgMSBhbmQgc291cmNlIDIgZmllbGRzLgotICovCi0jIGRlZmluZSAgICBPUCAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBvcGNvZGUgZmllbGQgKi8KLSMgZGVmaW5lICAgIERFU1QgICAgIDYgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIGRlc3RpbmF0aW9uICAqLwotIyBkZWZpbmUgICAgU09VUkNFMSAgNiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygc291cmNlMSAgICAgICovCi0jIGRlZmluZSAgICBTT1VSQ0UyICA2ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBzb3VyY2UyICAgICAgKi8KLQotIyBkZWZpbmUgICAgUkVHcyAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZWdpc3RlcnMgICovCi0KLSMgZGVmaW5lICAgIFdPUkQgICAgbG9uZwotIyBkZWZpbmUgICAgRkxBRyAgICB1bnNpZ25lZAotIyBkZWZpbmUgICAgU1RBVEUgICBzaG9ydAotCi0jIGRlZmluZSAgICBUUlVFICAgICAxCi0jIGRlZmluZSAgICBGQUxTRSAgICAwCi0KLSMgZGVmaW5lICAgIFJFQUQgICAgIDAKLSMgZGVmaW5lICAgIFdSSVRFICAgIDEKLQotLyogVGhlIG5leHQgZm91ciBlcXVhdGVzIGRlZmluZSB0aGUgcHJpb3JpdGllcyB0aGF0IHRoZSB2YXJpb3VzIGNsYXNzZXMKLSAqIG9mIGluc3RydWN0aW9ucyBoYXZlIHJlZ2FyZGluZyB3cml0aW5nIHJlc3VsdHMgYmFjayBpbnRvIHJlZ2lzdGVycyBhbmQKLSAqIHNpZ25hbGxpbmcgZXhjZXB0aW9ucy4KLSAqLwotLyogUE1FTSBpcyBhbHNvIGRlZmluZWQgaW4gPHN5cy9wYXJhbS5oPiBvbiBEZWx0YSA4OCdzLiAgU2lnaCEgICovCi0jdW5kZWYgUE1FTQotCi0jIGRlZmluZSAgICBQSU5UICAwICAgLyogSW50ZWdlciBQcmlvcml0eSAqLwotIyBkZWZpbmUgICAgUEZMVCAgMSAgIC8qIEZsb2F0aW5nIFBvaW50IFByaW9yaXR5ICovCi0jIGRlZmluZSAgICBQTUVNICAyICAgLyogTWVtb3J5IFByaW9yaXR5ICovCi0jIGRlZmluZSAgICBOQSAgICAzICAgLyogTm90IEFwcGxpY2FibGUsIGluc3RydWN0aW9uIGRvZXNudCB3cml0ZSB0byByZWdzICovCi0jIGRlZmluZSAgICBISVBSSSAzICAgLyogaGlnaGVzdCBvZiB0aGVzZSBwcmlvcml0aWVzICovCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiByZWdpc3RlcnMgYXJlIGFuIGFydGlmaWNpYWwgbWVjaGFuaXNtIHRvIHNwZWVkIHVwCi0gKiBzaW11bGF0b3IgZXhlY3V0aW9uLiAgSW4gdGhlIHJlYWwgcHJvY2Vzc29yLCBhbiBpbnN0cnVjdGlvbiByZWdpc3RlcgotICogaXMgMzIgYml0cyB3aWRlLiAgSW4gdGhlIHNpbXVsYXRvciwgdGhlIDMyIGJpdCBpbnN0cnVjdGlvbiBpcyBrZXB0IGluCi0gKiBhIHN0cnVjdHVyZSBmaWVsZCBjYWxsZWQgcmF3b3AsIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gaXMgcGFydGlhbGx5IGRlY29kZWQsCi0gKiBhbmQgc3BsaXQgaW50byB2YXJpb3VzIGZpZWxkcyBhbmQgZmxhZ3Mgd2hpY2ggbWFrZSB1cCB0aGUgb3RoZXIgZmllbGRzCi0gKiBvZiB0aGUgc3RydWN0dXJlLgotICogVGhlIHBhcnRpYWwgZGVjb2RlIGlzIGRvbmUgd2hlbiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBpbml0aWFsbHkgbG9hZGVkCi0gKiBpbnRvIHNpbXVsYXRvciBtZW1vcnkuICBUaGUgc2ltdWxhdG9yIGNvZGUgbWVtb3J5IGlzIG5vdCBhbiBhcnJheSBvZgotICogMzIgYml0IHdvcmRzLCBidXQgaXMgYW4gYXJyYXkgb2YgaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIgc3RydWN0dXJlcy4KLSAqIFllcyB0aGlzIHdhc3RlcyBtZW1vcnksIGJ1dCBpdCBleGVjdXRlcyBtdWNoIHF1aWNrZXIuCi0gKi8KLQotc3RydWN0IElSX0ZJRUxEUyB7Ci0JCSAgICB1bnNpZ25lZCAgICAgICAgb3A6T1AsCi0JCQkJICAgIGRlc3Q6IERFU1QsCi0JCQkJICAgIHNyYzE6IFNPVVJDRTEsCi0JCQkJICAgIHNyYzI6IFNPVVJDRTI7Ci0JCQkgICAgICBpbnQgICBsdG5jeSwKLQkJCQkgICAgZXh0aW1lLAotCQkJCSAgICB3Yl9wcmk7ICAgICAvKiB3cml0ZWJhY2sgcHJpb3JpdHkgICAgICovCi0JCSAgICB1bnNpZ25lZCAgICAgICAgaW1tX2ZsYWdzOjIsLyogaW1tZWRpYXRlIHNpemUgICAgICAgICAqLwotCQkJCSAgICByczFfdXNlZDoxLCAvKiByZWdpc3RlciBzb3VyY2UgMSB1c2VkICovCi0JCQkJICAgIHJzMl91c2VkOjEsIC8qIHJlZ2lzdGVyIHNvdXJjZSAyIHVzZWQgKi8KLQkJCQkgICAgcnNkX3VzZWQ6MSwgLyogcmVnaXN0ZXIgc291cmNlL2Rlc3QuIHVzZWQgKi8KLQkJCQkgICAgY19mbGFnOjEsICAgLyogY29tcGxlbWVudCAgICAgICovCi0JCQkJICAgIHVfZmxhZzoxLCAgIC8qIHVwcGVyIGhhbGYgd29yZCAqLwotCQkJCSAgICBuX2ZsYWc6MSwgICAvKiBleGVjdXRlIG5leHQgICAgKi8KLQkJCQkgICAgd2JfZmxhZzoxLCAgLyogdXNlcyB3cml0ZWJhY2sgc2xvdCAqLwotCQkJCSAgICBkZXN0XzY0OjEsICAvKiBkZXN0IHNpemUgICAgICAgKi8KLQkJCQkgICAgczFfNjQ6MSwgICAgLyogc291cmNlIDEgc2l6ZSAgICovCi0JCQkJICAgIHMyXzY0OjEsICAgIC8qIHNvdXJjZSAyIHNpemUgICAqLwotCQkJCSAgICBzY2FsZV9mbGFnOjEsIC8qIHNjYWxlZCByZWdpc3RlciAqLwotCQkJCSAgICBicmtfZmxnOjE7Ci0gICAgICAgICAgICAgICAgIH07Ci0KLXN0cnVjdAltZW1fc2VncyB7Ci0Jc3RydWN0IG1lbV93cmQgKnNlZzsJCQkvKiBwb2ludGVyIChyZXR1cm5lZCBieSBjYWxsb2MpIHRvIHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBsb25nIGJhc2VhZGRyOwkJCS8qIGJhc2UgbG9hZCBhZGRyZXNzIGZyb20gZmlsZSBoZWFkZXJzICovCi0JdW5zaWduZWQgbG9uZyBlbmRhZGRyOwkJCS8qIEVuZGluZyBhZGRyZXNzIG9mIHNlZ21lbnQgKi8KLQlpbnQJICAgICAgZmxhZ3M7CQkJLyogc2VnbWVudCBjb250cm9sIGZsYWdzIChub25lIGRlZmluZWQgMTIvNS84NikgKi8KLX07Ci0KLSNkZWZpbmUJTUFYU0VHUwkJKDEwKQkJCS8qIG1heCBudW1iZXIgb2Ygc2VnbWVudCBhbGxvd2VkICovCi0jZGVmaW5lCU1FTVNFR1NJWkUJKHNpemVvZihzdHJ1Y3QgbWVtX3NlZ3MpKS8qIHNpemUgb2YgbWVtX3NlZ3Mgc3RydWN0dXJlICovCi0KLQotI2RlZmluZSBCUktfUkQJCSgweDAxKQkJCS8qIGJyZWFrIG9uIG1lbW9yeSByZWFkICovCi0jZGVmaW5lIEJSS19XUgkJKDB4MDIpCQkJLyogYnJlYWsgb24gbWVtb3J5IHdyaXRlICovCi0jZGVmaW5lIEJSS19FWEVDCSgweDA0KQkJCS8qIGJyZWFrIG9uIGV4ZWN1dGlvbiAqLwotI2RlZmluZQlCUktfQ05UCQkoMHgwOCkJCQkvKiBicmVhayBvbiB0ZXJtaW5hbCBjb3VudCAqLwotCi0KLXN0cnVjdAltZW1fd3JkIHsKLQlzdHJ1Y3QgSVJfRklFTERTIG9wY29kZTsJCS8qIHNpbXVsYXRvciBpbnN0cnVjdGlvbiBicmVhayBkb3duICovCi0JdW5pb24gewotCQl1bnNpZ25lZCBsb25nICBsOwkJLyogbWVtb3J5IGVsZW1lbnQgYnJlYWsgZG93biAqLwotCQl1bnNpZ25lZCBzaG9ydCBzWzJdOwotCQl1bnNpZ25lZCBjaGFyICBjWzRdOwotCX0gbWVtOwotfTsKLQotI2RlZmluZQlNRU1XUkRTSVpFCShzaXplb2Yoc3RydWN0IG1lbV93cmQpKQkvKiBzaXplIG9mIGVhY2ggMzIgYml0IG1lbW9yeSBtb2RlbCAqLwotCi0vKiBFeHRlcm5hbCBkZWNsYXJhdGlvbnMgKi8KLQotZXh0ZXJuCXN0cnVjdCBtZW1fc2VncyBtZW1vcnlbXTsKLWV4dGVybglzdHJ1Y3QgUFJPQ0VTU09SIG03ODAwMDsKLQotc3RydWN0ICBQUk9DRVNTT1IgICB7Ci0JICAgICB1bnNpZ25lZCBXT1JECi0JCQkgICAgaXAsICAgICAgICAgIC8qIGV4ZWN1dGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciAqLwotCQkJICAgIHZiciwgICAgICAgICAvKiB2ZWN0b3IgYmFzZSByZWdpc3RlciAqLwotCQkJICAgIHBzcjsgICAgICAgICAvKiBwcm9jZXNzb3Igc3RhdHVzIHJlZ2lzdGVyICovCi0KLQkJICAgIFdPUkQgICAgUzFidXMsIC8qIHNvdXJjZSAxICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUzJidXMsIC8qIHNvdXJjZSAyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGJ1cywgIC8qIGRlc3RpbmF0aW9uICovCi0JCQkgICAgREFidXMsIC8qIGRhdGEgYWRkcmVzcyBidXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFUsCi0JCQkgICAgUmVnc1tSRUdzXSwgICAgICAgLyogZGF0YSByZWdpc3RlcnMgKi8KLQkJCSAgICB0aW1lX2xlZnRbUkVHc10sICAvKiBtYXggY2xvY2tzIGJlZm9yZSByZWcgaXMgYXZhaWxhYmxlICovCi0JCQkgICAgd2JfcHJpW1JFR3NdLCAgICAgLyogd3JpdGViYWNrIHByaW9yaXR5IG9mIHJlZyAqLwotCQkJICAgIFNGVTBfcmVnc1tSRUdzXSwgIC8qIGludGVnZXIgdW5pdCBjb250cm9sIHJlZ3MgKi8KLQkJCSAgICBTRlUxX3JlZ3NbUkVHc10sICAvKiBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ3MgKi8KLQkJCSAgICBTY29yZWJvYXJkW1JFR3NdLAotCQkJICAgIFZicjsKLQkgICAgdW5zaWduZWQgV09SRCAgIHNjb3JlYm9hcmQsCi0JCQkgICAgUHN3LAotCQkJICAgIFRwc3c7Ci0JCSAgICBGTEFHICAganVtcF9wZW5kaW5nOjE7ICAgLyogd2FpdGluZyBmb3IgYSBqdW1wIGluc3RyLiAqLwotICAgICAgICAgICAgICAgICAgICB9OwotCi0jIGRlZmluZSAgICBpMjZiaXQgICAgICAxICAgIC8qIHNpemUgb2YgaW1tZWRpYXRlIGZpZWxkICovCi0jIGRlZmluZSAgICBpMTZiaXQgICAgICAyCi0jIGRlZmluZSAgICBpMTBiaXQgICAgICAzCi0KLS8qIERlZmluaXRpb25zIGZvciBmaWVsZHMgaW4gcHNyICovCi0KLSMgZGVmaW5lIG1vZGUgIDMxCi0jIGRlZmluZSByYm8gICAzMAotIyBkZWZpbmUgc2VyICAgMjkKLSMgZGVmaW5lIGNhcnJ5IDI4Ci0jIGRlZmluZSBzZjdtICAxMQotIyBkZWZpbmUgc2Y2bSAgMTAKLSMgZGVmaW5lIHNmNW0gICA5Ci0jIGRlZmluZSBzZjRtICAgOAotIyBkZWZpbmUgc2YzbSAgIDcKLSMgZGVmaW5lIHNmMm0gICA2Ci0jIGRlZmluZSBzZjFtICAgNQotIyBkZWZpbmUgbWFtICAgIDQKLSMgZGVmaW5lIGlubSAgICAzCi0jIGRlZmluZSBleG0gICAgMgotIyBkZWZpbmUgdHJtICAgIDEKLSMgZGVmaW5lIG92Zm0gICAwCi0KLSNkZWZpbmUJICAgIE1PREVNQVNLICAgKDE8PChtb2RlLTEpKQotIyBkZWZpbmUgICAgU0lMRU5UICAgICAwICAgLyogc2ltdWxhdGUgd2l0aG91dCBvdXRwdXQgdG8gY3J0ICovCi0jIGRlZmluZSAgICBWRVJCT1NFICAgIDEgICAvKiBzaW11bGF0ZSBpbiB2ZXJib3NlIG1vZGUgKi8KLSMgZGVmaW5lICAgIFBSX0lOU1RSICAgMiAgIC8qIG9ubHkgcHJpbnQgaW5zdHJ1Y3Rpb25zICovCi0KLSMgZGVmaW5lICAgIFJFU0VUICAgICAgMTYgLyogcmVzZXQgcGhhc2UgKi8KLQotIyBkZWZpbmUgICAgUEhBU0UxICAgICAwICAvKiBkYXRhIHBhdGggcGhhc2VzICovCi0jIGRlZmluZSAgICBQSEFTRTIgICAgIDEKLQotLyogdGhlIDEgY2xvY2sgb3BlcmF0aW9ucyAqLwotCi0jIGRlZmluZSAgICBBRERVICAgICAgICAxCi0jIGRlZmluZSAgICBBRERDICAgICAgICAyCi0jIGRlZmluZSAgICBBRERVQyAgICAgICAzCi0jIGRlZmluZSAgICBBREQgICAgICAgICA0Ci0KLSMgZGVmaW5lICAgIFNVQlUgICAgQUREKzEKLSMgZGVmaW5lICAgIFNVQkIgICAgQUREKzIKLSMgZGVmaW5lICAgIFNVQlVCICAgQUREKzMKLSMgZGVmaW5lICAgIFNVQiAgICAgQUREKzQKLQotIyBkZWZpbmUgICAgQU5EXyAgICBBREQrNQotIyBkZWZpbmUgICAgT1IgICAgICBBREQrNgotIyBkZWZpbmUgICAgWE9SICAgICBBREQrNwotIyBkZWZpbmUgICAgQ01QICAgICBBREQrOAotCi0vKiB0aGUgTE9BRFMgKi8KLQotIyBkZWZpbmUgICAgTERBQiAgICBDTVArMQotIyBkZWZpbmUgICAgTERBSCAgICBDTVArMgotIyBkZWZpbmUgICAgTERBICAgICBDTVArMwotIyBkZWZpbmUgICAgTERBRCAgICBDTVArNAotCi0jIGRlZmluZSAgICBMREIgICBMREFEKzEKLSMgZGVmaW5lICAgIExESCAgIExEQUQrMgotIyBkZWZpbmUgICAgTEQgICAgTERBRCszCi0jIGRlZmluZSAgICBMREQgICBMREFEKzQKLSMgZGVmaW5lICAgIExEQlUgIExEQUQrNQotIyBkZWZpbmUgICAgTERIVSAgTERBRCs2Ci0KLS8qIHRoZSBTVE9SRVMgKi8KLQotIyBkZWZpbmUgICAgU1RCICAgIExESFUrMQotIyBkZWZpbmUgICAgU1RIICAgIExESFUrMgotIyBkZWZpbmUgICAgU1QgICAgIExESFUrMwotIyBkZWZpbmUgICAgU1REICAgIExESFUrNAotCi0vKiB0aGUgZXhjaGFuZ2UgKi8KLQotIyBkZWZpbmUgICAgWE1FTUJVIExESFUrNQotIyBkZWZpbmUgICAgWE1FTSAgIExESFUrNgotCi0vKiB0aGUgYnJhbmNoZXMgKi8KLSMgZGVmaW5lICAgIEpTUiAgICBTVEQrMQotIyBkZWZpbmUgICAgQlNSICAgIFNURCsyCi0jIGRlZmluZSAgICBCUiAgICAgU1REKzMKLSMgZGVmaW5lICAgIEpNUCAgICBTVEQrNAotIyBkZWZpbmUgICAgQkIxICAgIFNURCs1Ci0jIGRlZmluZSAgICBCQjAgICAgU1REKzYKLSMgZGVmaW5lICAgIFJUTiAgICBTVEQrNwotIyBkZWZpbmUgICAgQkNORCAgIFNURCs4Ci0KLS8qIHRoZSBUUkFQUyAqLwotIyBkZWZpbmUgICAgVEIxICAgIEJDTkQrMQotIyBkZWZpbmUgICAgVEIwICAgIEJDTkQrMgotIyBkZWZpbmUgICAgVENORCAgIEJDTkQrMwotIyBkZWZpbmUgICAgUlRFICAgIEJDTkQrNAotIyBkZWZpbmUgICAgVEJORCAgIEJDTkQrNQotCi0vKiB0aGUgTUlTQyBpbnN0cnVjdGlvbnMgKi8KLSMgZGVmaW5lICAgIE1VTCAgICAgVEJORCArIDEKLSMgZGVmaW5lICAgIERJViAgICAgTVVMICArMgotIyBkZWZpbmUgICAgRElWVSAgICBNVUwgICszCi0jIGRlZmluZSAgICBNQVNLICAgIE1VTCAgKzQKLSMgZGVmaW5lICAgIEZGMCAgICAgTVVMICArNQotIyBkZWZpbmUgICAgRkYxICAgICBNVUwgICs2Ci0jIGRlZmluZSAgICBDTFIgICAgIE1VTCAgKzcKLSMgZGVmaW5lICAgIFNFVCAgICAgTVVMICArOAotIyBkZWZpbmUgICAgRVhUICAgICBNVUwgICs5Ci0jIGRlZmluZSAgICBFWFRVICAgIE1VTCAgKzEwCi0jIGRlZmluZSAgICBNQUsgICAgIE1VTCAgKzExCi0jIGRlZmluZSAgICBST1QgICAgIE1VTCAgKzEyCi0KLS8qIGNvbnRyb2wgcmVnaXN0ZXIgbWFuaXB1bGF0aW9ucyAqLwotCi0jIGRlZmluZSAgICBMRENSICAgIFJPVCAgKzEKLSMgZGVmaW5lICAgIFNUQ1IgICAgUk9UICArMgotIyBkZWZpbmUgICAgWENSICAgICBST1QgICszCi0KLSMgZGVmaW5lICAgIEZMRENSICAgIFJPVCAgKzQKLSMgZGVmaW5lICAgIEZTVENSICAgIFJPVCAgKzUKLSMgZGVmaW5lICAgIEZYQ1IgICAgIFJPVCAgKzYKLQotCi0jIGRlZmluZSAgICBOT1AgICAgIFhDUiArMQotCi0vKiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KLQotIyBkZWZpbmUgICAgRkFERCAgICBOT1AgKzEKLSMgZGVmaW5lICAgIEZTVUIgICAgTk9QICsyCi0jIGRlZmluZSAgICBGTVVMICAgIE5PUCArMwotIyBkZWZpbmUgICAgRkRJViAgICBOT1AgKzQKLSMgZGVmaW5lICAgIEZTUVJUICAgTk9QICs1Ci0jIGRlZmluZSAgICBGQ01QICAgIE5PUCArNgotIyBkZWZpbmUgICAgRklQICAgICBOT1AgKzcKLSMgZGVmaW5lICAgIEZMVCAgICAgTk9QICs4Ci0jIGRlZmluZSAgICBJTlQgICAgIE5PUCArOQotIyBkZWZpbmUgICAgTklOVCAgICBOT1AgKzEwCi0jIGRlZmluZSAgICBUUk5DICAgIE5PUCArMTEKLSMgZGVmaW5lICAgIEZMREMgICBOT1AgKzEyCi0jIGRlZmluZSAgICBGU1RDICAgTk9QICsxMwotIyBkZWZpbmUgICAgRlhDICAgIE5PUCArMTQKLQotIyBkZWZpbmUgVUVYVChzcmMsb2ZmLHdpZCkgKCgoKHVuc2lnbmVkIGludCkoc3JjKSk+PihvZmYpKSAmICgoMTw8KHdpZCkpIC0gMSkpCi0jIGRlZmluZSBTRVhUKHNyYyxvZmYsd2lkKSAoKCgoKGludCkoc3JjKSk8PCgzMi0oKG9mZikrKHdpZCkpKSkgPj4oMzItKHdpZCkpKSApCi0jIGRlZmluZSBNQUtFKHNyYyxvZmYsd2lkKSBcCi0gICgoKCh1bnNpZ25lZCBpbnQpKHNyYykpICYgKCgxPDwod2lkKSkgLSAxKSkgPDwgKG9mZikpCi0KLSMgZGVmaW5lIG9wd29yZChuKSAodW5zaWduZWQgbG9uZykgKG1lbWFkZHItPm1lbS5sKQotCi0vKiAgQ29uc3RhbnRzIGFuZCBNYXNrcyAqLwotCi0jZGVmaW5lIFNGVTAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBTRlUxICAgICAgIDB4ODQwMDAwMDAKLSNkZWZpbmUgU0ZVNyAgICAgICAweDljMDAwMDAwCi0jZGVmaW5lIFJSSTEwICAgICAgMHhmMDAwMDAwMAotI2RlZmluZSBSUlIgICAgICAgIDB4ZjQwMDAwMDAKLSNkZWZpbmUgU0ZVTUFTSyAgICAweGZjMDBmZmUwCi0jZGVmaW5lIFJSUk1BU0sgICAgMHhmYzAwZmZlMAotI2RlZmluZSBSUkkxME1BU0sgIDB4ZmMwMGZjMDAKLSNkZWZpbmUgREVGTUFTSyAgICAweGZjMDAwMDAwCi0jZGVmaW5lIENUUkwgICAgICAgMHgwMDAwZjAwMAotI2RlZmluZSBDVFJMTUFTSyAgIDB4ZmMwMGY4MDAKLQotLyogT3BlcmFuZHMgdHlwZXMgKi8KLQotZW51bSBvcGVyYW5kX3R5cGUgewotICBIRVggPSAxLAotICBSRUcgPSAyLAotICBDT05UID0gMywKLSAgSU5EID0gMywKLSAgQkYgPSA0LAotICBSRUdTQyA9IDUgICAgLyogc2NhbGVkIHJlZ2lzdGVyICovLAotICBDUlJFRyA9IDYgICAgLyogY29udHJvbCByZWdpc3RlciAqLywKLSAgRkNSUkVHID0gNyAgICAvKiBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVyICovLAotICBQQ1JFTCA9IDgsCi0gIENPTkRNQVNLID0gOSwKLSAgWFJFRyA9IDEwLCAvKiBleHRlbmRlZCByZWdpc3RlciAqLwotICBERUMgPSAxMSwgLyogZGVjaW1hbCAqLwotfTsKLQotLyogSGFzaGluZyBTcGVjaWZpY2F0aW9uICovCi0KLSNkZWZpbmUgSEFTSFZBTCAgICAgNzkKLQotLyogVHlwZSBkZWZpbml0aW9ucyAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UOwotCi0vKiBTdHJ1Y3R1cmUgdGVtcGxhdGVzICovCi0KLSNpZiBuZXZlcgotdHlwZWRlZiBzdHJ1Y3QgewotICAgdW5zaWduZWQgaW50IG9mZnNldDo1OwotICAgdW5zaWduZWQgaW50IHdpZHRoOjY7Ci0gICB1bnNpZ25lZCBpbnQgdHlwZTo1OwotfSBPUFNQRUM7Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgdW5zaWduZWQgaW50IG9mZnNldDsKLSAgIHVuc2lnbmVkIGludCB3aWR0aDsKLSAgIGVudW0gb3BlcmFuZF90eXBlIHR5cGU7Ci19IE9QU1BFQzsKLQotCXN0cnVjdCBTSU1fRkxBR1MgewotCSAgICAgIGludCAgbHRuY3ksICAgLyogbGF0ZW5jeSAobWF4IG51bWJlciBvZiBjbG9ja3MgbmVlZGVkIHRvIGV4ZWN1dGUpICovCi0JCSAgZXh0aW1lLCAgIC8qIGV4ZWN1dGlvbiB0aW1lIChtaW4gbnVtYmVyIG9mIGNsb2NrcyBuZWVkZWQgdG8gZXhlY3V0ZSkgKi8KLQkJICB3Yl9wcmk7ICAgLyogd3JpdGViYWNrIHNsb3QgcHJpb3JpdHkgKi8KLSAgIHVuc2lnbmVkICAgICAgICAgb3A6T1AsICAgLyogc2ltdWxhdG9yIHZlcnNpb24gb2Ygb3Bjb2RlICovCi0JICAgICBpbW1fZmxhZ3M6MiwgICAvKiAxMCwxNiBvciAyNiBiaXQgaW1tZWRpYXRlIGZsYWdzICovCi0JICAgICAgcnMxX3VzZWQ6MSwgICAvKiByZWdpc3RlciBzb3VyY2UgMSB1c2VkICovCi0JICAgICAgcnMyX3VzZWQ6MSwgICAvKiByZWdpc3RlciBzb3VyY2UgMiB1c2VkICovCi0JICAgICAgcnNkX3VzZWQ6MSwgICAvKiByZWdpc3RlciBzb3VyY2UvZGVzdCB1c2VkICovCi0JCWNfZmxhZzoxLCAgIC8qIGNvbXBsZW1lbnQgKi8KLQkJdV9mbGFnOjEsICAgLyogdXBwZXIgaGFsZiB3b3JkICovCi0JCW5fZmxhZzoxLCAgIC8qIGV4ZWN1dGUgbmV4dCAqLwotCSAgICAgICB3Yl9mbGFnOjEsICAgLyogdXNlcyB3cml0ZWJhY2sgc2xvdCAqLwotCSAgICAgICBkZXN0XzY0OjEsICAgLyogZG91YmxlIHByZWNpc2lvbiBkZXN0ICovCi0JCSBzMV82NDoxLCAgIC8qIGRvdWJsZSBwcmVjaXNpb24gc291cmNlIDEgKi8KLQkJIHMyXzY0OjEsICAgLyogZG91YmxlIHByZWNpc2lvbiBzb3VyY2UgMiAqLwotCSAgICBzY2FsZV9mbGFnOjE7ICAgLyogcmVnaXN0ZXIgaXMgc2NhbGVkICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBJTlNUUlVDVEFCIHsKLSAgIHVuc2lnbmVkIGludCAgb3Bjb2RlOwotICAgY2hhciAgICAgICAgICAqbW5lbW9uaWM7Ci0gICBPUFNQRUMgICAgICAgIG9wMSxvcDIsb3AzOwotICAgc3RydWN0IFNJTV9GTEFHUyBmbGdzOwotICAgc3RydWN0IElOU1RSVUNUQUIgICAgKm5leHQ7Ci19IElOU1RBQjsKLQwKLQotI2RlZmluZSBOT19PUEVSQU5EIHswLDAsMH0KLQotLyogT3Bjb2RlICAgICBNbmVtb25pYyAgICAgICBPcCAxIFNwZWMgICAgIE9wIDIgU3BlYyAgICBPcCAzIFNwZWMgICAgICAgICBTaW1mbGFncyAgICAgICAgICAgICBOZXh0ICAqLwotCi1zdGF0aWMgSU5TVEFCICBpbnN0cnVjdGlvbnNbXSA9IHsKLSAgezB4ZjQwMGM4MDAsImpzciAgICAgICAgICIsezAsNSxSRUd9ICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxKU1IgLCAgICAgICAgICAwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGNjMDAsImpzci5uICAgICAgICIsezAsNSxSRUd9ICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezEsMSxOQSxKU1IgLCAgICAgICAgICAwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGMwMDAsImptcCAgICAgICAgICIsezAsNSxSRUd9ICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxKTVAgLCAgICAgICAgICAwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGM0MDAsImptcC5uICAgICAgICIsezAsNSxSRUd9ICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezEsMSxOQSxKTVAgLCAgICAgICAgICAwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4YzgwMDAwMDAsImJzciAgICAgICAgICIsezAsMjYsUENSRUx9LE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxCU1IgLCAgICAgaTI2Yml0LDAsMCwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4Y2MwMDAwMDAsImJzci5uICAgICAgICIsezAsMjYsUENSRUx9LE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezEsMSxOQSxCU1IgLCAgICAgaTI2Yml0LDAsMCwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4YzAwMDAwMDAsImJyICAgICAgICAgICIsezAsMjYsUENSRUx9LE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxCUiAgLCAgICAgaTI2Yml0LDAsMCwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4YzQwMDAwMDAsImJyLm4gICAgICAgICIsezAsMjYsUENSRUx9LE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezEsMSxOQSxCUiAgLCAgICAgaTI2Yml0LDAsMCwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZDAwMDAwMDAsImJiMCAgICAgICAgICIsezIxLDUsSEVYfSAgLHsxNiw1LFJFR30gICAsezAsMTYsUENSRUx9LHsyLDIsTkEsQkIwLCAgICAgaTE2Yml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZDQwMDAwMDAsImJiMC5uICAgICAgICIsezIxLDUsSEVYfSAgLHsxNiw1LFJFR30gICAsezAsMTYsUENSRUx9LHsxLDEsTkEsQkIwLCAgICAgaTE2Yml0LDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZDgwMDAwMDAsImJiMSAgICAgICAgICIsezIxLDUsSEVYfSx7MTYsNSxSRUd9ICAgICAsezAsMTYsUENSRUx9LHsyLDIsTkEsQkIxLCAgICAgaTE2Yml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZGMwMDAwMDAsImJiMS5uICAgICAgICIsezIxLDUsSEVYfSx7MTYsNSxSRUd9ICAgICAsezAsMTYsUENSRUx9LHsxLDEsTkEsQkIxLCAgICAgaTE2Yml0LDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMGQwMDAsInRiMCAgICAgICAgICIsezIxLDUsSEVYfSAgLHsxNiw1LFJFR30gICAsezAsMTAsSEVYfSwgezIsMixOQSxUQjAgLCAgICAgaTEwYml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMGQ4MDAsInRiMSAgICAgICAgICIsezIxLDUsSEVYfSAgLHsxNiw1LFJFR30gICAsezAsMTAsSEVYfSwgezIsMixOQSxUQjEgLCAgICAgaTEwYml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZTgwMDAwMDAsImJjbmQgICAgICAgICIsezIxLDUsQ09ORE1BU0t9LHsxNiw1LFJFR30sezAsMTYsUENSRUx9LHsyLDIsTkEsQkNORCwgICAgaTE2Yml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZWMwMDAwMDAsImJjbmQubiAgICAgICIsezIxLDUsQ09ORE1BU0t9LHsxNiw1LFJFR30sezAsMTYsUENSRUx9LHsxLDEsTkEsQkNORCwgICAgaTE2Yml0LDAsMSwwLDAsMCwxLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMGU4MDAsInRjbmQgICAgICAgICIsezIxLDUsQ09ORE1BU0t9LHsxNiw1LFJFR30sezAsMTAsSEVYfSwgezIsMixOQSxUQ05ELCAgICAgaTEwYml0LDAsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjgwMDAwMDAsInRibmQgICAgICAgICIsezE2LDUsUkVHfSAgLHswLDE2LEhFWH0gICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxUQk5ELCAgICAgaTEwYml0LDEsMCwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGY4MDAsInRibmQgICAgICAgICIsezE2LDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxUQk5ELCAgICAgICAgICAwLDEsMSwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMGZjMDAsInJ0ZSAgICAgICAgICIsTk9fT1BFUkFORCAgICAgLE5PX09QRVJBTkQgICAgICAsTk9fT1BFUkFORCAgICwgezIsMixOQSxSVEUgLCAgICAgICAgICAwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MWMwMDAwMDAsImxkLmIgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExEQiAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDFjMDAsImxkLmIgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExEQiAgICAgLCAgICAwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MGMwMDAwMDAsImxkLmJ1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExEQlUsICAgaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDBjMDAsImxkLmJ1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExEQlUgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MTgwMDAwMDAsImxkLmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExESCAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDE4MDAsImxkLmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExESCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDFhMDAsImxkLmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExESCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MDgwMDAwMDAsImxkLmh1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExESFUsICAgaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDA4MDAsImxkLmh1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExESFUgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDBhMDAsImxkLmh1ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExESFUgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MTQwMDAwMDAsImxkICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExEICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDE0MDAsImxkICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExEICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDE2MDAsImxkICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExEICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MTAwMDAwMDAsImxkLmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLExERCAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDEwMDAsImxkLmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExERCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDEyMDAsImxkLmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExERCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4ZjQwMDE1MDAsImxkLnVzciAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLExEICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDE3MDAsImxkLnVzciAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLExEICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MmMwMDAwMDAsInN0LmIgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxOQSxTVEIgICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDJjMDAsInN0LmIgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxOQSxTVEIgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MjgwMDAwMDAsInN0LmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxOQSxTVEggICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI4MDAsInN0LmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxOQSxTVEggICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDJhMDAsInN0LmggICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVEggICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0sIE5VTEwgfSwKLSAgezB4MjQwMDAwMDAsInN0ICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxOQSxTVCAgICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDEsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI0MDAsInN0ICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxOQSxTVCAgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwMjYwMCwic3QgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLE5BLFNUICAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweDIwMDAwMDAwLCJzdC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1REICAgICAgLGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDIwMDAsInN0LmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxOQSxTVEQgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwMjIwMCwic3QuZCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLE5BLFNURCAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweGY0MDAyNTAwLCJzdC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1QgICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDI3MDAsInN0LnVzciAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVCAgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotLyogIG04ODEwMCBvbmx5OgotICB7MHgwMDAwMDAwMCwieG1lbS5idSAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MywxLFBNRU0sWE1FTUJVICxpMTZiaXQsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gKi8KLSAgezB4ZjQwMDAwMDAsInhtZW0uYnUgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotLyogIG04ODEwMCBvbmx5OgotICB7MHgwNDAwMDAwMCwieG1lbSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MywxLFBNRU0sWE1FTSAgICxpMTZiaXQsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gKi8KLSAgezB4ZjQwMDA0MDAsInhtZW0gICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwMDYwMCwieG1lbSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MywxLFBNRU0sWE1FTSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweGY0MDAwNTAwLCJ4bWVtLnVzciAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDA3MDAsInhtZW0udXNyICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotLyogbTg4MTAwIG9ubHk6Ci0gIHsweGY0MDAzZTAwLCJsZGEuYiAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsUElOVCxMREFILCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDF9ICAgLE5VTEwgfSwKLSAqLwotICB7MHhmNDAwM2UwMCwibGRhLnggICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBSCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweGY0MDAzYTAwLCJsZGEuaCAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsUElOVCxMREFILCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDF9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDM2MDAsImxkYSAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxQSU5ULExEQSAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHhmNDAwMzIwMCwibGRhLmQgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBRCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCi0KLSAgezB4ODAwMDQwMDAsImxkY3IgICAgICAgICIsezIxLDUsUkVHfSAgLHs1LDYsQ1JSRUd9ICAsTk9fT1BFUkFORCAgICAsezEsMSxQSU5ULExEQ1IsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4MDAwODAwMCwic3RjciAgICAgICAgIix7MTYsNSxSRUd9ICAsezUsNixDUlJFR30gICxOT19PUEVSQU5EICAgICx7MSwxLFBJTlQsU1RDUiwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDgwMDBjMDAwLCJ4Y3IgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHs1LDYsQ1JSRUd9LHsxLDEsUElOVCxYQ1IsICAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHhmNDAwNjAwMCwiYWRkdSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2MjAwLCJhZGR1LmNpICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBRERVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDYxMDAsImFkZHUuY28gICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERFUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjMwMCwiYWRkdS5jaW8gICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2NDAwLCJzdWJ1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUJVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDY2MDAsInN1YnUuY2kgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQlUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjUwMCwic3VidS5jbyAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2NzAwLCJzdWJ1LmNpbyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUJVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDY4MDAsImRpdnUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMyLDMyLFBJTlQsRElWVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2OTAwLCJkaXZ1LmQgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLH0sIE5VTEwgfSwKLSAgezB4ZjQwMDZlMDAsIm11bHMgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsfSwgTlVMTCB9LAotICB7MHhmNDAwNmMwMCwibXVsdSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSw0LFBJTlQsTVVMLCAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3MDAwLCJhZGQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBREQgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDcyMDAsImFkZC5jaSAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERCAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzEwMCwiYWRkLmNvICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3MzAwLCJhZGQuY2lvICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBREQgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDc0MDAsInN1YiAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQiAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzYwMCwic3ViLmNpICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3NTAwLCJzdWIuY28gICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUIgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDc3MDAsInN1Yi5jaW8gICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQiAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzgwMCwiZGl2cyAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MzIsMzIsUElOVCxESVYgLCAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3YzAwLCJjbXAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxDTVAsICAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHg2MDAwMDAwMCwiYWRkdSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsQUREVSwgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDY0MDAwMDAwLCJzdWJ1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxTVUJVLCAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHg2ODAwMDAwMCwiZGl2dSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MzIsMzIsUElOVCxESVZVLCBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDZjMDAwMDAwLCJtdWx1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHs0LDEsUElOVCxNVUwsICAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NzAwMDAwMDAsImFkZCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULEFERCwgICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg3NDAwMDAwMCwic3ViICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsU1VCLCAgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDc4MDAwMDAwLCJkaXZzICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszMiwzMixQSU5ULERJViwgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4N2MwMDAwMDAsImNtcCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULENNUCwgICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotCi0gIHsweGY0MDA0MDAwLCJhbmQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBTkRfICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDQ0MDAsImFuZC5jICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFORF8gICAgICAgICwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNTgwMCwib3IgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsT1IgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA1YzAwLCJvci5jICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxPUiAgICAgICAgICAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDUwMDAsInhvciAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFhPUiAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNTQwMCwieG9yLmMgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsWE9SICAgICAgICAgLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDQwMDAwMDAwLCJhbmQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxBTkRfICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NDQwMDAwMDAsImFuZC51ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULEFORF8gICAsaTE2Yml0LDEsMCwxLDAsMSwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg1ODAwMDAwMCwib3IgICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsT1IgICAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDVjMDAwMDAwLCJvci51ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxPUiAgICAgLGkxNmJpdCwxLDAsMSwwLDEsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NTAwMDAwMDAsInhvciAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULFhPUiAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg1NDAwMDAwMCwieG9yLnUgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsWE9SICAgICxpMTZiaXQsMSwwLDEsMCwxLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDQ4MDAwMDAwLCJtYXNrICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxNQVNLICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NGMwMDAwMDAsIm1hc2sudSAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULE1BU0sgICAsaTE2Yml0LDEsMCwxLDAsMSwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwZWMwMCwiZmYwICAgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7MSwxLFBJTlQsRkYwICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDBlODAwLCJmZjEgICAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHsxLDEsUElOVCxGRjEgICAgICAgICAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMDgwMDAsImNsciAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULENMUiAgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwODgwMCwic2V0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsU0VUICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDA5MDAwLCJleHQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxFWFQgICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMDk4MDAsImV4dHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULEVYVFUgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwYTAwMCwibWFrICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsTUFLICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDBhODAwLCJyb3QgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxST1QgICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDgwMDAsImNsciAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULENMUiAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwODgwMCwic2V0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU0VUICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA5MDAwLCJleHQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxFWFQgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDk4MDAsImV4dHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEVYVFUgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwYTAwMCwibWFrICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsTUFLICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDBhODAwLCJyb3QgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxST1QgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHg4NDAwMjgwMCwiZmFkZC5zc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NSwxLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyODgwLCJmYWRkLnNzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDJhMDAsImZhZGQuc2RzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMmE4MCwiZmFkZC5zZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyODIwLCJmYWRkLmRzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDI4YTAsImZhZGQuZHNkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMmEyMCwiZmFkZC5kZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyYWEwLCJmYWRkLmRkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMwMDAsImZzdWIuc3NzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezUsMSxQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzA4MCwiZnN1Yi5zc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMjAwLCJmc3ViLnNkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMyODAsImZzdWIuc2RkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzAyMCwiZnN1Yi5kc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMGEwLCJmc3ViLmRzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMyMjAsImZzdWIuZGRzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzJhMCwiZnN1Yi5kZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMDAwLCJmbXVsLnNzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDEsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAwODAsImZtdWwuc3NkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDIwMCwiZm11bC5zZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMjgwLCJmbXVsLnNkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAwMjAsImZtdWwuZHNzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDBhMCwiZm11bC5kc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMjIwLCJmbXVsLmRkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAyYTAsImZtdWwuZGRkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzAwMCwiZmRpdi5zc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MzAsMzAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MDgwLCJmZGl2LnNzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcyMDAsImZkaXYuc2RzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzI4MCwiZmRpdi5zZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MDIwLCJmZGl2LmRzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcwYTAsImZkaXYuZHNkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzIyMCwiZmRpdi5kZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MmEwLCJmZGl2LmRkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDc4MDAsImZzcXJ0LnNzICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzgyMCwiZnNxcnQuc2QgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3ODgwLCJmc3FydC5kcyAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDc4YTAsImZzcXJ0LmRkICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzgwMCwiZmNtcC5zcyAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NSwxLFBGTFQsRkNNUCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzODgwLCJmY21wLnNkICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDEsUEZMVCxGQ01QICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDNhMDAsImZjbXAuZHMgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMSxQRkxULEZDTVAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwM2E4MCwiZmNtcC5kZCAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwxLFBGTFQsRkNNUCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyMDAwLCJmbHQucyAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDIwMjAsImZsdC5kICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNDgwMCwiaW50LnMgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsSU5UICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA0ODgwLCJpbnQuZCAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxJTlQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDUwMDAsIm5pbnQucyAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULElOVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNTA4MCwibmludC5kICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NiwxLFBGTFQsSU5UICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA1ODAwLCJ0cm5jLnMgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxUUk5DICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDU4ODAsInRybmMuZCAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULFRSTkMgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotCi0gIHsweDgwMDA0ODAwLCJmbGRjciAgICAgICAiLHsyMSw1LFJFR30gICx7NSw2LEZDUlJFR30gLE5PX09QRVJBTkQgICAsIHsxLDEsUEZMVCxGTERDICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODAwMDg4MDAsImZzdGNyICAgICAgICIsezE2LDUsUkVHfSAgLHs1LDYsRkNSUkVHfSAsTk9fT1BFUkFORCAgICwgezEsMSxQRkxULEZTVEMgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4MDAwYzgwMCwiZnhjciAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7NSw2LEZDUlJFR30gLCB7MSwxLFBGTFQsRlhDICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIG5ldyBmb3IgdGhlIDg4MTEwLiAqLwotCi0gIHsweDg0MDBhYWEwLCJmYWRkLmRkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWE4MCwiZmFkZC5kZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFhYzAsImZhZGQuZGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYTIwLCJmYWRkLmRzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWEwMCwiZmFkZC5kc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFhNDAsImZhZGQuZHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYjIwLCJmYWRkLmR4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWIwMCwiZmFkZC5keHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFiNDAsImZhZGQuZHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhOGEwLCJmYWRkLnNkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTg4MCwiZmFkZC5zZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4YzAsImZhZGQuc2R4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhODIwLCJmYWRkLnNzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTgwMCwiZmFkZC5zc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4NDAsImZhZGQuc3N4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhOTIwLCJmYWRkLnN4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTkwMCwiZmFkZC5zeHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE5NDAsImZhZGQuc3h4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhY2EwLCJmYWRkLnhkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWM4MCwiZmFkZC54ZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjYzAsImZhZGQueGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYzIwLCJmYWRkLnhzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWMwMCwiZmFkZC54c3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjNDAsImZhZGQueHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhZDIwLCJmYWRkLnh4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWQwMCwiZmFkZC54eHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFkNDAsImZhZGQueHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGJhODAsImZjbXAuc2RkICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJhMDAsImZjbXAuc2RzICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJiMDAsImZjbXAuc2R4ICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI4ODAsImZjbXAuc3NkICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI4MDAsImZjbXAuc3NzICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI5MDAsImZjbXAuc3N4ICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJjODAsImZjbXAuc3hkICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJjMDAsImZjbXAuc3hzICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJkMDAsImZjbXAuc3h4ICAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwYmFhMCwiZmNtcHUuc2RkICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmEyMCwiZmNtcHUuc2RzICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmIyMCwiZmNtcHUuc2R4ICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjhhMCwiZmNtcHUuc3NkICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjgyMCwiZmNtcHUuc3NzICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjkyMCwiZmNtcHUuc3N4ICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmNhMCwiZmNtcHUuc3hkICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmMyMCwiZmNtcHUuc3hzICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYmQyMCwiZmNtcHUuc3h4ICAgIix7MjEsNSxSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDAwODIwLCJmY3Z0LnNkICAgICAiLHsyMSw1LFJFR30gLHswLDUsUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwMDg4MCwiZmN2dC5kcyAgICAgIix7MjEsNSxSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwODg4MCwiZmN2dC5kcyAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODhjMCwiZmN2dC5keCAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODgyMCwiZmN2dC5zZCAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODg0MCwiZmN2dC5zeCAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODkyMCwiZmN2dC54ZCAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODkwMCwiZmN2dC54cyAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxYUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBmMmEwLCJmZGl2LmRkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjI4MCwiZmRpdi5kZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYyYzAsImZkaXYuZGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMjIwLCJmZGl2LmRzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjIwMCwiZmRpdi5kc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYyNDAsImZkaXYuZHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMzIwLCJmZGl2LmR4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjMwMCwiZmRpdi5keHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYzNDAsImZkaXYuZHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMGEwLCJmZGl2LnNkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjA4MCwiZmRpdi5zZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwYzAsImZkaXYuc2R4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMDIwLCJmZGl2LnNzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjAwMCwiZmRpdi5zc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwNDAsImZkaXYuc3N4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMTIwLCJmZGl2LnN4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjEwMCwiZmRpdi5zeHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYxNDAsImZkaXYuc3h4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNGEwLCJmZGl2LnhkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjQ4MCwiZmRpdi54ZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0YzAsImZkaXYueGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNDIwLCJmZGl2LnhzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjQwMCwiZmRpdi54c3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0NDAsImZkaXYueHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNTIwLCJmZGl2Lnh4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjUwMCwiZmRpdi54eHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY1NDAsImZkaXYueHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMDIyMjAsImZsdC5kcyAgICAgICIsezIxLDUsWFJFR30gLHswLDUsUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwMjIwMCwiZmx0LnNzICAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDAyMjQwLCJmbHQueHMgICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwODJhMCwiZm11bC5kZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgyODAsImZtdWwuZGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MmMwLCJmbXVsLmRkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODIyMCwiZm11bC5kc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgyMDAsImZtdWwuZHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MjQwLCJmbXVsLmRzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODMyMCwiZm11bC5keGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgzMDAsImZtdWwuZHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MzQwLCJmbXVsLmR4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODBhMCwiZm11bC5zZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwODAsImZtdWwuc2RzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MGMwLCJmbXVsLnNkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODAyMCwiZm11bC5zc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwMDAsImZtdWwuc3NzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MDQwLCJmbXVsLnNzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODEyMCwiZm11bC5zeGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgxMDAsImZtdWwuc3hzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MTQwLCJmbXVsLnN4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODRhMCwiZm11bC54ZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0ODAsImZtdWwueGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NGMwLCJmbXVsLnhkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODQyMCwiZm11bC54c2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0MDAsImZtdWwueHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NDQwLCJmbXVsLnhzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODUyMCwiZm11bC54eGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg1MDAsImZtdWwueHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NTQwLCJmbXVsLnh4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBmOGEwLCJmc3FydC5kZCAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY4ODAsImZzcXJ0LmRzICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjhjMCwiZnNxcnQuZHggICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmODIwLCJmc3FydC5zZCAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY4MDAsImZzcXJ0LnNzICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjg0MCwiZnNxcnQuc3ggICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmOTIwLCJmc3FydC54ZCAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY5MDAsImZzcXJ0LnhzICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjk0MCwiZnNxcnQueHggICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGIyYTAsImZzdWIuZGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMjgwLCJmc3ViLmRkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjJjMCwiZnN1Yi5kZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIyMjAsImZzdWIuZHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMjAwLCJmc3ViLmRzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjI0MCwiZnN1Yi5kc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIzMjAsImZzdWIuZHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMzAwLCJmc3ViLmR4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjM0MCwiZnN1Yi5keHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwYTAsImZzdWIuc2RkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMDgwLCJmc3ViLnNkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjBjMCwiZnN1Yi5zZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwMjAsImZzdWIuc3NkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMDAwLCJmc3ViLnNzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjA0MCwiZnN1Yi5zc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIxMjAsImZzdWIuc3hkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMTAwLCJmc3ViLnN4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjE0MCwiZnN1Yi5zeHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0YTAsImZzdWIueGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNDgwLCJmc3ViLnhkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjRjMCwiZnN1Yi54ZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0MjAsImZzdWIueHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNDAwLCJmc3ViLnhzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjQ0MCwiZnN1Yi54c3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI1MjAsImZzdWIueHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNTAwLCJmc3ViLnh4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjU0MCwiZnN1Yi54eHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZmMwMCwiaWxsb3AiLCB7MCwyLERFQ30sIE5PX09QRVJBTkQsIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBjODAwLCJpbnQuc3MgICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGM4ODAsImludC5zZCAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYzkwMCwiaW50LnN4ICAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4MDQwMDAwMDAsImxkICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MDAwMDAwMDAsImxkLmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4M2MwMDAwMDAsImxkLnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmMDAwMTQwMCwibGQgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxMDAwLCJsZC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDE4MDAsImxkLnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTUwMCwibGQudXNyICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxMTAwLCJsZC5kLnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDE5MDAsImxkLngudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGYwMDAxNjAwLCJsZCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTIwMCwibGQuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDFhMDAsImxkLnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxNzAwLCJsZC51c3IgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTMwMCwibGQuZC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDFiMDAsImxkLngudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGMwMDAsIm1vdi5zICAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYzA4MCwibW92LmQgICAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA0MjAwLCJtb3YucyAgICAgICAiLCB7MjEsNSxYUkVHfSwgezAsNSxSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDQyODAsIm1vdi5kICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MCw1LFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYzMwMCwibW92ICAgICAgICAgIiwgezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGY0MDA2ZDAwLCJtdWx1LmQgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBkMDgwLCJuaW50LnNkICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGQwMDAsIm5pbnQuc3MgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZDEwMCwibmludC5zeCAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDIwMjAsInBhZGQuYiAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMDQwLCJwYWRkLmggICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjA2MCwicGFkZCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMjFlMCwicGFkZHMucyAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIxYTAsInBhZGRzLnMuYiAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMWMwLCJwYWRkcy5zLmggICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjBlMCwicGFkZHMudSAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIwYTAsInBhZGRzLnUuYiAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMGMwLCJwYWRkcy51LmggICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjE2MCwicGFkZHMudXMgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIxMjAsInBhZGRzLnVzLmIgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMTQwLCJwYWRkcy51cy5oICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAzODYwLCJwY21wICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAwMDAwLCJwbXVsICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDA2MjYwLCJwcGFjay4xNiAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjI0MCwicHBhY2suMTYuaCAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDY0NjAsInBwYWNrLjMyICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2NDIwLCJwcGFjay4zMi5iICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjQ0MCwicHBhY2suMzIuaCAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDYxNjAsInBwYWNrLjggICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDcyMDAsInByb3QgICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHs1LDYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA3ODAwLCJwcm90ICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAzMDIwLCJwc3ViLmIgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzA0MCwicHN1Yi5oICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMwNjAsInBzdWIgICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDMxZTAsInBzdWJzLnMgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMWEwLCJwc3Vicy5zLmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzFjMCwicHN1YnMucy5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMwZTAsInBzdWJzLnUgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMGEwLCJwc3Vicy51LmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzBjMCwicHN1YnMudS5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMxNjAsInBzdWJzLnVzICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMTIwLCJwc3Vicy51cy5iICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzE0MCwicHN1YnMudXMuaCAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwNjgwMCwicHVucGsubiAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2ODIwLCJwdW5way5iICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHgzNDAwMDAwMCwic3QgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDE2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHgzMDAwMDAwMCwic3QuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDE2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHgzODAwMDAwMCwic3QueCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDE2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGY0MDAyYzgwLCJzdC5iLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjg4MCwic3QuaC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI0ODAsInN0Lnd0ICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyMDgwLCJzdC5kLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmQ4MCwic3QuYi51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI5ODAsInN0LmgudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNTgwLCJzdC51c3Iud3QgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjE4MCwic3QuZC51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmMDAwMjQwMCwic3QgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMDAwLCJzdC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIxMDAsInN0LmQudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjE4MCwic3QuZC51c3Iud3QgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMDgwLCJzdC5kLnd0ICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI1MDAsInN0LnVzciAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjU4MCwic3QudXNyLnd0ICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNDgwLCJzdC53dCAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI4MDAsInN0LnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjkwMCwic3QueC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyOTgwLCJzdC54LnVzci53dCAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI4ODAsInN0Lngud3QgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGY0MDAyZjgwLCJzdC5iLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyZTgwLCJzdC5iLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyMzgwLCJzdC5kLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyMjgwLCJzdC5kLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyYjgwLCJzdC5oLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyYTgwLCJzdC5oLnd0ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNzgwLCJzdC51c3Iud3QgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNjgwLCJzdC53dCAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ZjAwMDI2MDAsInN0ICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMjAwLCJzdC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjMwMCwic3QuZC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIzODAsInN0LmQudXNyLnd0ICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMjgwLCJzdC5kLnd0ICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjcwMCwic3QudXNyICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI3ODAsInN0LnVzci53dCAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNjgwLCJzdC53dCAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMmEwMCwic3QueCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDJiMDAsInN0LngudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyYjgwLCJzdC54LnVzci53dCAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMmE4MCwic3QueC53dCAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZDg4MCwidHJuYy5zZCAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBkODAwLCJ0cm5jLnNzICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGQ5MDAsInRybmMuc3ggICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi19OwotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9taXBzLmggYi9pbmNsdWRlL29wY29kZS9taXBzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOTNkMWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbWlwcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQyICswLDAgQEAKLS8qIG1pcHMuaC4gIE1pcHMgb3Bjb2RlIGxpc3QgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmFscGggQ2FtcGJlbGwgYW5kIE9TRgotICAgQ29tbWVudGVkIGFuZCBtb2RpZmllZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9NSVBTX0hfCi0jZGVmaW5lIF9NSVBTX0hfCi0KLS8qIFRoZXNlIGFyZSBiaXQgbWFza3MgYW5kIHNoaWZ0IGNvdW50cyB0byB1c2UgdG8gYWNjZXNzIHRoZSB2YXJpb3VzCi0gICBmaWVsZHMgb2YgYW4gaW5zdHJ1Y3Rpb24uICBUbyByZXRyaWV2ZSB0aGUgWCBmaWVsZCBvZiBhbgotICAgaW5zdHJ1Y3Rpb24sIHVzZSB0aGUgZXhwcmVzc2lvbgotCShpID4+IE9QX1NIX1gpICYgT1BfTUFTS19YCi0gICBUbyBzZXQgdGhlIHNhbWUgZmllbGQgKHRvIGopLCB1c2UKLQlpID0gKGkgJn4gKE9QX01BU0tfWCA8PCBPUF9TSF9YKSkgfCAoaiA8PCBPUF9TSF9YKQotCi0gICBNYWtlIHN1cmUgeW91IHVzZSBmaWVsZHMgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnN0cnVjdGlvbiwKLSAgIG9mIGNvdXJzZS4gIAotCi0gICBUaGUgJ2knIGZvcm1hdCB1c2VzIE9QLCBSUywgUlQgYW5kIElNTUVESUFURS4gIAotCi0gICBUaGUgJ2onIGZvcm1hdCB1c2VzIE9QIGFuZCBUQVJHRVQuCi0KLSAgIFRoZSAncicgZm9ybWF0IHVzZXMgT1AsIFJTLCBSVCwgUkQsIFNIQU1UIGFuZCBGVU5DVC4KLQotICAgVGhlICdiJyBmb3JtYXQgdXNlcyBPUCwgUlMsIFJUIGFuZCBERUxUQS4KLQotICAgVGhlIGZsb2F0aW5nIHBvaW50ICdpJyBmb3JtYXQgdXNlcyBPUCwgUlMsIFJUIGFuZCBJTU1FRElBVEUuCi0KLSAgIFRoZSBmbG9hdGluZyBwb2ludCAncicgZm9ybWF0IHVzZXMgT1AsIEZNVCwgRlQsIEZTLCBGRCBhbmQgRlVOQ1QuCi0KLSAgIEEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiB1c2VzIE9QLCBDT0RFIGFuZCBTUEVDICgxMCBiaXRzIG9mIHRoZQotICAgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiBhcmUgbm90IGRlZmluZWQ7IEthbmUgc2F5cyB0aGUgYnJlYWtwb2ludAotICAgY29kZSBmaWVsZCBpbiBCUkVBSyBpcyAyMCBiaXRzOyB5ZXQgTUlQUyBhc3NlbWJsZXJzIGFuZCBkZWJ1Z2dlcnMKLSAgIG9ubHkgdXNlIHRlbiBiaXRzKS4gIEFuIG9wdGlvbmFsIHR3by1vcGVyYW5kIGZvcm0gb2YgYnJlYWsvc2RiYnAKLSAgIGFsbG93cyB0aGUgbG93ZXIgdGVuIGJpdHMgdG8gYmUgc2V0IHRvby4KLQotICAgVGhlIHN5c2NhbGwgaW5zdHJ1Y3Rpb24gdXNlcyBTWVNDQUxMLgotCi0gICBUaGUgZ2VuZXJhbCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgdXNlIENPUFouICAqLwotCi0jZGVmaW5lIE9QX01BU0tfT1AJCTB4M2YKLSNkZWZpbmUgT1BfU0hfT1AJCTI2Ci0jZGVmaW5lIE9QX01BU0tfUlMJCTB4MWYKLSNkZWZpbmUgT1BfU0hfUlMJCTIxCi0jZGVmaW5lIE9QX01BU0tfRlIJCTB4MWYKLSNkZWZpbmUgT1BfU0hfRlIJCTIxCi0jZGVmaW5lIE9QX01BU0tfRk1UCQkweDFmCi0jZGVmaW5lIE9QX1NIX0ZNVAkJMjEKLSNkZWZpbmUgT1BfTUFTS19CQ0MJCTB4NwotI2RlZmluZSBPUF9TSF9CQ0MJCTE4Ci0jZGVmaW5lIE9QX01BU0tfQ09ERQkJMHgzZmYKLSNkZWZpbmUgT1BfU0hfQ09ERQkJMTYKLSNkZWZpbmUgT1BfTUFTS19DT0RFMgkJMHgzZmYKLSNkZWZpbmUgT1BfU0hfQ09ERTIJCTYKLSNkZWZpbmUgT1BfTUFTS19SVAkJMHgxZgotI2RlZmluZSBPUF9TSF9SVAkJMTYKLSNkZWZpbmUgT1BfTUFTS19GVAkJMHgxZgotI2RlZmluZSBPUF9TSF9GVAkJMTYKLSNkZWZpbmUgT1BfTUFTS19DQUNIRQkJMHgxZgotI2RlZmluZSBPUF9TSF9DQUNIRQkJMTYKLSNkZWZpbmUgT1BfTUFTS19SRAkJMHgxZgotI2RlZmluZSBPUF9TSF9SRAkJMTEKLSNkZWZpbmUgT1BfTUFTS19GUwkJMHgxZgotI2RlZmluZSBPUF9TSF9GUwkJMTEKLSNkZWZpbmUgT1BfTUFTS19QUkVGWAkJMHgxZgotI2RlZmluZSBPUF9TSF9QUkVGWAkJMTEKLSNkZWZpbmUgT1BfTUFTS19DQ0MJCTB4NwotI2RlZmluZSBPUF9TSF9DQ0MJCTgKLSNkZWZpbmUgT1BfTUFTS19TWVNDQUxMCQkweGZmZmZmCi0jZGVmaW5lIE9QX1NIX1NZU0NBTEwJCTYKLSNkZWZpbmUgT1BfTUFTS19TSEFNVAkJMHgxZgotI2RlZmluZSBPUF9TSF9TSEFNVAkJNgotI2RlZmluZSBPUF9NQVNLX0ZECQkweDFmCi0jZGVmaW5lIE9QX1NIX0ZECQk2Ci0jZGVmaW5lIE9QX01BU0tfVEFSR0VUCQkweDNmZmZmZmYKLSNkZWZpbmUgT1BfU0hfVEFSR0VUCQkwCi0jZGVmaW5lIE9QX01BU0tfQ09QWgkJMHgxZmZmZmZmCi0jZGVmaW5lIE9QX1NIX0NPUFoJCTAKLSNkZWZpbmUgT1BfTUFTS19JTU1FRElBVEUJMHhmZmZmCi0jZGVmaW5lIE9QX1NIX0lNTUVESUFURQkJMAotI2RlZmluZSBPUF9NQVNLX0RFTFRBCQkweGZmZmYKLSNkZWZpbmUgT1BfU0hfREVMVEEJCTAKLSNkZWZpbmUgT1BfTUFTS19GVU5DVAkJMHgzZgotI2RlZmluZSBPUF9TSF9GVU5DVAkJMAotI2RlZmluZSBPUF9NQVNLX1NQRUMJCTB4M2YKLSNkZWZpbmUgT1BfU0hfU1BFQwkJMAotI2RlZmluZSBPUF9TSF9MT0NDICAgICAgICAgICAgICA4ICAgICAgIC8qIEZQIGNvbmRpdGlvbiBjb2RlICovCi0jZGVmaW5lIE9QX1NIX0hJQ0MgICAgICAgICAgICAgIDE4ICAgICAgLyogRlAgY29uZGl0aW9uIGNvZGUgKi8KLSNkZWZpbmUgT1BfTUFTS19DQyAgICAgICAgICAgICAgMHg3Ci0jZGVmaW5lIE9QX1NIX0NPUDFOT1JNICAgICAgICAgIDI1ICAgICAgLyogTm9ybWFsIENPUDEgZW5jb2RpbmcgKi8KLSNkZWZpbmUgT1BfTUFTS19DT1AxTk9STSAgICAgICAgMHgxICAgICAvKiBhIHNpbmdsZSBiaXQgKi8KLSNkZWZpbmUgT1BfU0hfQ09QMVNQRUMgICAgICAgICAgMjEgICAgICAvKiBDT1AxIGVuY29kaW5ncyAqLwotI2RlZmluZSBPUF9NQVNLX0NPUDFTUEVDICAgICAgICAweGYKLSNkZWZpbmUgT1BfTUFTS19DT1AxU0NMUiAgICAgICAgMHg0Ci0jZGVmaW5lIE9QX01BU0tfQ09QMUNNUCAgICAgICAgIDB4MwotI2RlZmluZSBPUF9TSF9DT1AxQ01QICAgICAgICAgICA0Ci0jZGVmaW5lIE9QX1NIX0ZPUk1BVCAgICAgICAgICAgIDIxICAgICAgLyogRlAgc2hvcnQgZm9ybWF0IGZpZWxkICovCi0jZGVmaW5lIE9QX01BU0tfRk9STUFUICAgICAgICAgIDB4NwotI2RlZmluZSBPUF9TSF9UUlVFICAgICAgICAgICAgICAxNgotI2RlZmluZSBPUF9NQVNLX1RSVUUgICAgICAgICAgICAweDEKLSNkZWZpbmUgT1BfU0hfR0UgICAgICAgICAgICAgICAgMTcKLSNkZWZpbmUgT1BfTUFTS19HRSAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBPUF9TSF9VTlNJR05FRCAgICAgICAgICAxNgotI2RlZmluZSBPUF9NQVNLX1VOU0lHTkVEICAgICAgICAweDEKLSNkZWZpbmUgT1BfU0hfSElOVCAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgT1BfTUFTS19ISU5UICAgICAgICAgICAgMHgxZgotI2RlZmluZSBPUF9TSF9NTUkgICAgICAgICAgICAgICAwICAgICAgIC8qIE11bHRpbWVkaWEgKHBhcmFsbGVsKSBvcCAqLwotI2RlZmluZSBPUF9NQVNLX01NSSAgICAgICAgICAgICAweDNmIAotI2RlZmluZSBPUF9TSF9NTUlTVUIgICAgICAgICAgICA2Ci0jZGVmaW5lIE9QX01BU0tfTU1JU1VCICAgICAgICAgIDB4MWYKLSNkZWZpbmUgT1BfTUFTS19QRVJGUkVHCQkweDFmCS8qIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgKi8KLSNkZWZpbmUgT1BfU0hfUEVSRlJFRwkJMQotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGluc3RydWN0aW9uLiAgKi8KLQotc3RydWN0IG1pcHNfb3Bjb2RlCi17Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGFyZ3VtZW50cyBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIC8qIFRoZSBiYXNpYyBvcGNvZGUgZm9yIHRoZSBpbnN0cnVjdGlvbi4gIFdoZW4gYXNzZW1ibGluZywgdGhpcwotICAgICBvcGNvZGUgaXMgbW9kaWZpZWQgYnkgdGhlIGFyZ3VtZW50cyB0byBwcm9kdWNlIHRoZSBhY3R1YWwgb3Bjb2RlCi0gICAgIHRoYXQgaXMgdXNlZC4gIElmIHBpbmZvIGlzIElOU05fTUFDUk8sIHRoZW4gdGhpcyBpcyAwLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXRjaDsKLSAgLyogSWYgcGluZm8gaXMgbm90IElOU05fTUFDUk8sIHRoZW4gdGhpcyBpcyBhIGJpdCBtYXNrIGZvciB0aGUKLSAgICAgcmVsZXZhbnQgcG9ydGlvbnMgb2YgdGhlIG9wY29kZSB3aGVuIGRpc2Fzc2VtYmxpbmcuICBJZiB0aGUKLSAgICAgYWN0dWFsIG9wY29kZSBhbmRlZCB3aXRoIHRoZSBtYXRjaCBmaWVsZCBlcXVhbHMgdGhlIG9wY29kZSBmaWVsZCwKLSAgICAgdGhlbiB3ZSBoYXZlIGZvdW5kIHRoZSBjb3JyZWN0IGluc3RydWN0aW9uLiAgSWYgcGluZm8gaXMKLSAgICAgSU5TTl9NQUNSTywgdGhlbiB0aGlzIGZpZWxkIGlzIHRoZSBtYWNybyBpZGVudGlmaWVyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICAvKiBGb3IgYSBtYWNybywgdGhpcyBpcyBJTlNOX01BQ1JPLiAgT3RoZXJ3aXNlLCBpdCBpcyBhIGNvbGxlY3Rpb24KLSAgICAgb2YgYml0cyBkZXNjcmliaW5nIHRoZSBpbnN0cnVjdGlvbiwgbm90YWJseSBhbnkgcmVsZXZhbnQgaGF6YXJkCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBwaW5mbzsKLSAgLyogQSBjb2xsZWN0aW9uIG9mIGJpdHMgZGVzY3JpYmluZyB0aGUgaW5zdHJ1Y3Rpb24gc2V0cyBvZiB3aGljaCB0aGlzCi0gICAgIGluc3RydWN0aW9uIG9yIG1hY3JvIGlzIGEgbWVtYmVyLiAqLwotICB1bnNpZ25lZCBsb25nIG1lbWJlcnNoaXA7Ci19OwotCi0vKiBUaGVzZSBhcmUgdGhlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGFwcGVhcnMgaW4gdGhlIGFyZ3MgZmllbGQgb2YgYW4KLSAgIGluc3RydWN0aW9uLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmaWVsZHMgYXBwZWFyCi0gICB3aGVuIHRoZSBpbnN0cnVjdGlvbiBpcyB1c2VkLiAgQ29tbWFzIGFuZCBwYXJlbnRoZXNlcyBpbiB0aGUgYXJncwotICAgc3RyaW5nIGFyZSBpZ25vcmVkIHdoZW4gYXNzZW1ibGluZywgYW5kIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0Ci0gICB3aGVuIGRpc2Fzc2VtYmxpbmcuCi0KLSAgIEVhY2ggb2YgdGhlc2UgY2hhcmFjdGVycyBjb3JyZXNwb25kcyB0byBhIG1hc2sgZmllbGQgZGVmaW5lZCBhYm92ZS4KLQotICAgIjwiIDUgYml0IHNoaWZ0IGFtb3VudCAoT1BfKl9TSEFNVCkKLSAgICI+IiBzaGlmdCBhbW91bnQgYmV0d2VlbiAzMiBhbmQgNjMsIHN0b3JlZCBhZnRlciBzdWJ0cmFjdGluZyAzMiAoT1BfKl9TSEFNVCkKLSAgICJhIiAyNiBiaXQgdGFyZ2V0IGFkZHJlc3MgKE9QXypfVEFSR0VUKQotICAgImIiIDUgYml0IGJhc2UgcmVnaXN0ZXIgKE9QXypfUlMpCi0gICAiYyIgMTAgYml0IGJyZWFrcG9pbnQgY29kZSAoT1BfKl9DT0RFKQotICAgImQiIDUgYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyIHNwZWNpZmllciAoT1BfKl9SRCkKLSAgICJoIiA1IGJpdCBwcmVmeCBoaW50IChPUF8qX1BSRUZYKQotICAgImkiIDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKE9QXypfSU1NRURJQVRFKQotICAgImoiIDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlIChPUF8qX0RFTFRBKQotICAgImsiIDUgYml0IGNhY2hlIG9wY29kZSBpbiB0YXJnZXQgcmVnaXN0ZXIgcG9zaXRpb24gKE9QXypfQ0FDSEUpCi0gICAibyIgMTYgYml0IHNpZ25lZCBvZmZzZXQgKE9QXypfREVMVEEpCi0gICAicCIgMTYgYml0IFBDIHJlbGF0aXZlIGJyYW5jaCB0YXJnZXQgYWRkcmVzcyAoT1BfKl9ERUxUQSkKLSAgICJxIiAxMCBiaXQgZXh0cmEgYnJlYWtwb2ludCBjb2RlIChPUF8qX0NPREUyKQotICAgInIiIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBib3RoIHNvdXJjZSBhbmQgdGFyZ2V0IChPUF8qX1JTKQotICAgInMiIDUgYml0IHNvdXJjZSByZWdpc3RlciBzcGVjaWZpZXIgKE9QXypfUlMpCi0gICAidCIgNSBiaXQgdGFyZ2V0IHJlZ2lzdGVyIChPUF8qX1JUKQotICAgInUiIDE2IGJpdCB1cHBlciAxNiBiaXRzIG9mIGFkZHJlc3MgKE9QXypfSU1NRURJQVRFKQotICAgInYiIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE9QXypfUlMpCi0gICAidyIgNSBiaXQgc2FtZSByZWdpc3RlciB1c2VkIGFzIGJvdGggdGFyZ2V0IGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9SVCkKLSAgICJDIiAyNSBiaXQgY29wcm9jZXNzb3IgZnVuY3Rpb24gY29kZSAoT1BfKl9DT1BaKQotICAgIkIiIDIwIGJpdCBzeXNjYWxsIGZ1bmN0aW9uIGNvZGUgKE9QXypfU1lTQ0FMTCkKLSAgICJ4IiBhY2NlcHQgYW5kIGlnbm9yZSByZWdpc3RlciBuYW1lCi0gICAieiIgbXVzdCBiZSB6ZXJvIHJlZ2lzdGVyCi0KLSAgIEZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uczoKLSAgICJEIiA1IGJpdCBkZXN0aW5hdGlvbiByZWdpc3RlciAoT1BfKl9GRCkKLSAgICJNIiAzIGJpdCBjb21wYXJlIGNvbmRpdGlvbiBjb2RlIChPUF8qX0NDQykgKG9ubHkgdXNlZCBmb3IgbWlwczQgYW5kIHVwKQotICAgIk4iIDMgYml0IGJyYW5jaCBjb25kaXRpb24gY29kZSAoT1BfKl9CQ0MpIChvbmx5IHVzZWQgZm9yIG1pcHM0IGFuZCB1cCkKLSAgICJTIiA1IGJpdCBmcyBzb3VyY2UgMSByZWdpc3RlciAoT1BfKl9GUykKLSAgICJUIiA1IGJpdCBmdCBzb3VyY2UgMiByZWdpc3RlciAoT1BfKl9GVCkKLSAgICJSIiA1IGJpdCBmciBzb3VyY2UgMyByZWdpc3RlciAoT1BfKl9GUikKLSAgICJWIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgZmxvYXRpbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9GUykKLSAgICJXIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgZmxvYXRpbmcgdGFyZ2V0IGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9GVCkKLQotICAgQ29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zOgotICAgIkUiIDUgYml0IHRhcmdldCByZWdpc3RlciAoT1BfKl9SVCkKLSAgICJHIiA1IGJpdCBkZXN0aW5hdGlvbiByZWdpc3RlciAoT1BfKl9SRCkKLSAgICJQIiA1IGJpdCBwZXJmb3JtYW5jZS1tb25pdG9yIHJlZ2lzdGVyIChPUF8qX1BFUkZSRUcpCi0KLSAgIE1hY3JvIGluc3RydWN0aW9uczoKLSAgICJBIiBHZW5lcmFsIDMyIGJpdCBleHByZXNzaW9uCi0gICAiSSIgMzIgYml0IGltbWVkaWF0ZQotICAgIkYiIDY0IGJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudCBpbiAucmRhdGEKLSAgICJMIiA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaW4gLmxpdDgKLSAgICJmIiAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgICJsIiAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaW4gLmxpdDQKLQotICAgT3RoZXI6Ci0gICAiKCkiIHBhcmVucyBzdXJyb3VuZGluZyBvcHRpb25hbCB2YWx1ZQotICAgIiwiICBzZXBhcmF0ZXMgb3BlcmFuZHMKLQotICAgQ2hhcmFjdGVycyB1c2VkIHNvIGZhciwgZm9yIHF1aWNrIHJlZmVyZW5jZSB3aGVuIGFkZGluZyBtb3JlOgotICAgIjw+KCksIgotICAgIkFCQ0RFRkdJTE1OU1RSVlciCi0gICAiYWJjZGZoaWprbG9wcXJzdHV2d3h6IgotKi8KLQotLyogVGhlc2UgYXJlIHRoZSBiaXRzIHdoaWNoIG1heSBiZSBzZXQgaW4gdGhlIHBpbmZvIGZpZWxkIG9mIGFuCi0gICBpbnN0cnVjdGlvbnMsIGlmIGl0IGlzIG5vdCBlcXVhbCB0byBJTlNOX01BQ1JPLiAgKi8KLQotLyogTW9kaWZpZXMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBPUF8qX1JELiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9HUFJfRCAgICAgICAgICAgIDB4MDAwMDAwMDEKLS8qIE1vZGlmaWVzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SVC4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfR1BSX1QgICAgICAgICAgICAweDAwMDAwMDAyCi0vKiBNb2RpZmllcyBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgMzEuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0dQUl8zMSAgICAgICAgICAgMHgwMDAwMDAwNAotLyogTW9kaWZpZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRkQuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0ZQUl9EICAgICAgICAgICAgMHgwMDAwMDAwOAotLyogTW9kaWZpZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlMuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0ZQUl9TICAgICAgICAgICAgMHgwMDAwMDAxMAotLyogTW9kaWZpZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlQuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0ZQUl9UICAgICAgICAgICAgMHgwMDAwMDAyMAotLyogUmVhZHMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBPUF8qX1JTLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0dQUl9TICAgICAgICAgICAgIDB4MDAwMDAwNDAKLS8qIFJlYWRzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SVC4gICovCi0jZGVmaW5lIElOU05fUkVBRF9HUFJfVCAgICAgICAgICAgICAweDAwMDAwMDgwCi0vKiBSZWFkcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GUy4gICovCi0jZGVmaW5lIElOU05fUkVBRF9GUFJfUyAgICAgICAgICAgICAweDAwMDAwMTAwCi0vKiBSZWFkcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GVC4gICovCi0jZGVmaW5lIElOU05fUkVBRF9GUFJfVCAgICAgICAgICAgICAweDAwMDAwMjAwCi0vKiBSZWFkcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GUi4gICovCi0jZGVmaW5lIElOU05fUkVBRF9GUFJfUgkJICAgIDB4MDAwMDA0MDAKLS8qIE1vZGlmaWVzIGNvcHJvY2Vzc29yIGNvbmRpdGlvbiBjb2RlLiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9DT05EX0NPREUgICAgICAgIDB4MDAwMDA4MDAKLS8qIFJlYWRzIGNvcHJvY2Vzc29yIGNvbmRpdGlvbiBjb2RlLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0NPTkRfQ09ERSAgICAgICAgIDB4MDAwMDEwMDAKLS8qIFRMQiBvcGVyYXRpb24uICAqLwotI2RlZmluZSBJTlNOX1RMQiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotLyogUmVhZHMgY29wcm9jZXNzb3IgcmVnaXN0ZXIgb3RoZXIgdGhhbiBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fQ09QICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0vKiBJbnN0cnVjdGlvbiBsb2FkcyB2YWx1ZSBmcm9tIG1lbW9yeSwgcmVxdWlyaW5nIGRlbGF5LiAgKi8KLSNkZWZpbmUgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSAgICAgIDB4MDAwMDgwMDAKLS8qIEluc3RydWN0aW9uIGxvYWRzIHZhbHVlIGZyb20gY29wcm9jZXNzb3IsIHJlcXVpcmluZyBkZWxheS4gICovCi0jZGVmaW5lIElOU05fTE9BRF9DT1BST0NfREVMQVkJICAgIDB4MDAwMTAwMDAKLS8qIEluc3RydWN0aW9uIGhhcyB1bmNvbmRpdGlvbmFsIGJyYW5jaCBkZWxheSBzbG90LiAgKi8KLSNkZWZpbmUgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZICAgIDB4MDAwMjAwMDAKLS8qIEluc3RydWN0aW9uIGhhcyBjb25kaXRpb25hbCBicmFuY2ggZGVsYXkgc2xvdC4gICovCi0jZGVmaW5lIElOU05fQ09ORF9CUkFOQ0hfREVMQVkgICAgICAweDAwMDQwMDAwCi0vKiBDb25kaXRpb25hbCBicmFuY2ggbGlrZWx5OiBpZiBicmFuY2ggbm90IHRha2VuLCBpbnNuIG51bGxpZmllZC4gICovCi0jZGVmaW5lIElOU05fQ09ORF9CUkFOQ0hfTElLRUxZCSAgICAweDAwMDgwMDAwCi0vKiBNb3ZlcyB0byBjb3Byb2Nlc3NvciByZWdpc3RlciwgcmVxdWlyaW5nIGRlbGF5LiAgKi8KLSNkZWZpbmUgSU5TTl9DT1BST0NfTU9WRV9ERUxBWSAgICAgIDB4MDAxMDAwMDAKLS8qIExvYWRzIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIGZyb20gbWVtb3J5LCByZXF1aXJpbmcgZGVsYXkuICAqLwotI2RlZmluZSBJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkgICAgMHgwMDIwMDAwMAotLyogUmVhZHMgdGhlIEhJIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0hJCQkgICAgMHgwMDQwMDAwMAotLyogUmVhZHMgdGhlIExPIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9SRUFEX0xPCQkgICAgMHgwMDgwMDAwMAotLyogTW9kaWZpZXMgdGhlIEhJIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9ISQkJICAgIDB4MDEwMDAwMDAKLS8qIE1vZGlmaWVzIHRoZSBMTyByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfTE8JCSAgICAweDAyMDAwMDAwCi0vKiBUYWtlcyBhIHRyYXAgKGVhc2llciB0byBrZWVwIG91dCBvZiBkZWxheSBzbG90KS4gICovCi0jZGVmaW5lIElOU05fVFJBUCAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCi0vKiBJbnN0cnVjdGlvbiBzdG9yZXMgdmFsdWUgaW50byBtZW1vcnkuICAqLwotI2RlZmluZSBJTlNOX1NUT1JFX01FTU9SWQkgICAgMHgwODAwMDAwMAotLyogSW5zdHJ1Y3Rpb24gdXNlcyBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LiAgKi8KLSNkZWZpbmUgRlBfUwkJCSAgICAweDEwMDAwMDAwCi0vKiBJbnN0cnVjdGlvbiB1c2VzIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQuICAqLwotI2RlZmluZSBGUF9ECQkJICAgIDB4MjAwMDAwMDAKLS8qIEluc3RydWN0aW9uIGlzIHBhcnQgb2YgdGhlIHR4MzkncyBpbnRlZ2VyIG11bHRpcGx5IGZhbWlseS4gICAgKi8KLSNkZWZpbmUgSU5TTl9NVUxUICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLS8qIEluc3RydWN0aW9uIHN5bmNocm9uaXplIHNoYXJlZCBtZW1vcnkuICAqLwotI2RlZmluZSBJTlNOX1NZTkMJCSAgICAweDgwMDAwMDAwCi0KLS8qIEluc3RydWN0aW9uIGlzIGFjdHVhbGx5IGEgbWFjcm8uICBJdCBzaG91bGQgYmUgaWdub3JlZCBieSB0aGUKLSAgIGRpc2Fzc2VtYmxlciwgYW5kIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IGJ5IHRoZSBhc3NlbWJsZXIuICAqLwotI2RlZmluZSBJTlNOX01BQ1JPICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgotCi0KLQotCi0KLS8qIE1JUFMgSVNBIGZpZWxkLS1DUFUgbGV2ZWwgYXQgd2hpY2ggaW5zbiBpcyBzdXBwb3J0ZWQuICAqLwotI2RlZmluZSBJTlNOX0lTQQkJICAgIDB4MDAwMDAwMEYKLS8qIEFuIGluc3RydWN0aW9uIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIGFueSBiYXNpYyBNSVBTIElTQS4KLSAgIChpZSBpdCBpcyBhIGNoaXAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24pICAqLwotI2RlZmluZSBJTlNOX05PX0lTQQkJICAgIDB4MDAwMDAwMDAKLS8qIE1JUFMgSVNBIDEgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBJTlNOX0lTQTEJCSAgICAweDAwMDAwMDAxCi0vKiBNSVBTIElTQSAyIGluc3RydWN0aW9uIChSNjAwMCBvciBSNDAwMCkuICAqLwotI2RlZmluZSBJTlNOX0lTQTIJCSAgICAweDAwMDAwMDAyCi0vKiBNSVBTIElTQSAzIGluc3RydWN0aW9uIChSNDAwMCkuICAqLwotI2RlZmluZSBJTlNOX0lTQTMJCSAgICAweDAwMDAwMDAzCi0vKiBNSVBTIElTQSA0IGluc3RydWN0aW9uIChSODAwMCkuICAqLwotI2RlZmluZSBJTlNOX0lTQTQJCSAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIElOU05fSVNBNQkJICAgIDB4MDAwMDAwMDUKLQotLyogQ2hpcCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMuICBUaGVzZSBhcmUgYml0bWFza3MuICAqLwotLyogTUlQUyBSNDY1MCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIElOU05fNDY1MAkJICAgIDB4MDAwMDAwMTAKLS8qIExTSSBSNDAxMCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIElOU05fNDAxMAkJICAgIDB4MDAwMDAwMjAKLS8qIE5FQyBWUjQxMDAgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIElOU05fNDEwMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0vKiBUb3NoaWJhIFIzOTAwIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl8zOTAwICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLQotLyogVGVzdCBmb3IgbWVtYmVyc2hpcCBpbiBhbiBJU0EgaW5jbHVkaW5nIGNoaXAgc3BlY2lmaWMgSVNBcy4KLSAgIElOU04gaXMgcG9pbnRlciB0byBhbiBlbGVtZW50IG9mIHRoZSBvcGNvZGUgdGFibGU7IElTQSBpcyB0aGUKLSAgIHNwZWNpZmllZCBJU0EgdG8gdGVzdCBhZ2FpbnN0OyBhbmQgQ1BVIGlzIHRoZSBDUFUgc3BlY2lmaWMgSVNBCi0gICB0byB0ZXN0LCBvciB6ZXJvIGlmIG5vIENQVSBzcGVjaWZpYyBJU0EgdGVzdCBpcyBkZXNpcmVkLiAqLyAKLQotI2RlZmluZSBPUENPREVfSVNfTUVNQkVSKGluc24saXNhLGNwdSkgCQkJCVwKLSAgICAoKCgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgIT0gMAkJCVwKLSAgICAgICYmICgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPD0gaXNhKQkJXAotICAgICB8fCAoY3B1ID09IDQ2NTAJCQkJCQlcCi0JICYmICgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOXzQ2NTApICE9IDApCQlcCi0gICAgIHx8IChjcHUgPT0gNDAxMAkJCQkJCVwKLQkgJiYgKChpbnNuKS0+bWVtYmVyc2hpcCAmIElOU05fNDAxMCkgIT0gMCkJCVwKLSAgICAgfHwgKChjcHUgPT0gNDEwMAkJCQkJCVwKLQkgIHx8IGNwdSA9PSA0MTExCQkJCQlcCi0JICApCQkJCQkJCVwKLQkgJiYgKChpbnNuKS0+bWVtYmVyc2hpcCAmIElOU05fNDEwMCkgIT0gMCkJCVwKLSAgICAgfHwgKGNwdSA9PSAzOTAwCQkJCQkJXAotCSAmJiAoKGluc24pLT5tZW1iZXJzaGlwICYgSU5TTl8zOTAwKSAhPSAwKSkKLQotLyogVGhpcyBpcyBhIGxpc3Qgb2YgbWFjcm8gZXhwYW5kZWQgaW5zdHJ1Y3Rpb25zLgotICoKLSAqIF9JIGFwcGVuZGVkIG1lYW5zIGltbWVkaWF0ZQotICogX0EgYXBwZW5kZWQgbWVhbnMgYWRkcmVzcwotICogX0FCIGFwcGVuZGVkIG1lYW5zIGFkZHJlc3Mgd2l0aCBiYXNlIHJlZ2lzdGVyCi0gKiBfRCBhcHBlbmRlZCBtZWFucyA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAqIF9TIGFwcGVuZGVkIG1lYW5zIDMyIGJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudAotICovCi1lbnVtIHsKLSAgICBNX0FCUywKLSAgICBNX0FERF9JLAotICAgIE1fQUREVV9JLAotICAgIE1fQU5EX0ksCi0gICAgTV9CRVEsCi0gICAgTV9CRVFfSSwKLSAgICBNX0JFUUxfSSwKLSAgICBNX0JHRSwKLSAgICBNX0JHRUwsCi0gICAgTV9CR0VfSSwKLSAgICBNX0JHRUxfSSwKLSAgICBNX0JHRVUsCi0gICAgTV9CR0VVTCwKLSAgICBNX0JHRVVfSSwKLSAgICBNX0JHRVVMX0ksCi0gICAgTV9CR1QsCi0gICAgTV9CR1RMLAotICAgIE1fQkdUX0ksCi0gICAgTV9CR1RMX0ksCi0gICAgTV9CR1RVLAotICAgIE1fQkdUVUwsCi0gICAgTV9CR1RVX0ksCi0gICAgTV9CR1RVTF9JLAotICAgIE1fQkxFLAotICAgIE1fQkxFTCwKLSAgICBNX0JMRV9JLAotICAgIE1fQkxFTF9JLAotICAgIE1fQkxFVSwKLSAgICBNX0JMRVVMLAotICAgIE1fQkxFVV9JLAotICAgIE1fQkxFVUxfSSwKLSAgICBNX0JMVCwKLSAgICBNX0JMVEwsCi0gICAgTV9CTFRfSSwKLSAgICBNX0JMVExfSSwKLSAgICBNX0JMVFUsCi0gICAgTV9CTFRVTCwKLSAgICBNX0JMVFVfSSwKLSAgICBNX0JMVFVMX0ksCi0gICAgTV9CTkUsCi0gICAgTV9CTkVfSSwKLSAgICBNX0JORUxfSSwKLSAgICBNX0RBQlMsCi0gICAgTV9EQUREX0ksCi0gICAgTV9EQUREVV9JLAotICAgIE1fRERJVl8zLAotICAgIE1fRERJVl8zSSwKLSAgICBNX0RESVZVXzMsCi0gICAgTV9ERElWVV8zSSwKLSAgICBNX0RJVl8zLAotICAgIE1fRElWXzNJLAotICAgIE1fRElWVV8zLAotICAgIE1fRElWVV8zSSwKLSAgICBNX0RMQV9BQiwKLSAgICBNX0RMSSwKLSAgICBNX0RNVUwsCi0gICAgTV9ETVVMX0ksIAotICAgIE1fRE1VTE8sCi0gICAgTV9ETVVMT19JLCAKLSAgICBNX0RNVUxPVSwKLSAgICBNX0RNVUxPVV9JLCAKLSAgICBNX0RSRU1fMywKLSAgICBNX0RSRU1fM0ksCi0gICAgTV9EUkVNVV8zLAotICAgIE1fRFJFTVVfM0ksCi0gICAgTV9EU1VCX0ksCi0gICAgTV9EU1VCVV9JLAotICAgIE1fRFNVQlVfSV8yLAotICAgIE1fSl9BLAotICAgIE1fSkFMXzEsCi0gICAgTV9KQUxfMiwKLSAgICBNX0pBTF9BLAotICAgIE1fTF9ET0IsCi0gICAgTV9MX0RBQiwKLSAgICBNX0xBX0FCLAotICAgIE1fTEJfQSwKLSAgICBNX0xCX0FCLAotICAgIE1fTEJVX0EsCi0gICAgTV9MQlVfQUIsCi0gICAgTV9MRF9BLAotICAgIE1fTERfT0IsCi0gICAgTV9MRF9BQiwKLSAgICBNX0xEQzFfQUIsCi0gICAgTV9MREMyX0FCLAotICAgIE1fTERDM19BQiwKLSAgICBNX0xETF9BQiwKLSAgICBNX0xEUl9BQiwKLSAgICBNX0xIX0EsCi0gICAgTV9MSF9BQiwKLSAgICBNX0xIVV9BLAotICAgIE1fTEhVX0FCLAotICAgIE1fTEksCi0gICAgTV9MSV9ELAotICAgIE1fTElfREQsCi0gICAgTV9MSV9TLAotICAgIE1fTElfU1MsCi0gICAgTV9MTF9BQiwKLSAgICBNX0xMRF9BQiwKLSAgICBNX0xTX0EsCi0gICAgTV9MV19BLAotICAgIE1fTFdfQUIsCi0gICAgTV9MV0MwX0EsCi0gICAgTV9MV0MwX0FCLAotICAgIE1fTFdDMV9BLAotICAgIE1fTFdDMV9BQiwKLSAgICBNX0xXQzJfQSwKLSAgICBNX0xXQzJfQUIsCi0gICAgTV9MV0MzX0EsCi0gICAgTV9MV0MzX0FCLAotICAgIE1fTFdMX0EsCi0gICAgTV9MV0xfQUIsCi0gICAgTV9MV1JfQSwKLSAgICBNX0xXUl9BQiwKLSAgICBNX0xXVV9BQiwKLSAgICBNX01VTCwKLSAgICBNX01VTF9JLCAKLSAgICBNX01VTE8sCi0gICAgTV9NVUxPX0ksIAotICAgIE1fTVVMT1UsCi0gICAgTV9NVUxPVV9JLCAKLSAgICBNX05PUl9JLAotICAgIE1fT1JfSSwKLSAgICBNX1JFTV8zLAotICAgIE1fUkVNXzNJLAotICAgIE1fUkVNVV8zLAotICAgIE1fUkVNVV8zSSwKLSAgICBNX1JPTCwKLSAgICBNX1JPTF9JLAotICAgIE1fUk9SLAotICAgIE1fUk9SX0ksCi0gICAgTV9TX0RBLAotICAgIE1fU19ET0IsCi0gICAgTV9TX0RBQiwKLSAgICBNX1NfUywKLSAgICBNX1NDX0FCLAotICAgIE1fU0NEX0FCLAotICAgIE1fU0RfQSwKLSAgICBNX1NEX09CLAotICAgIE1fU0RfQUIsCi0gICAgTV9TREMxX0FCLAotICAgIE1fU0RDMl9BQiwKLSAgICBNX1NEQzNfQUIsCi0gICAgTV9TRExfQUIsCi0gICAgTV9TRFJfQUIsCi0gICAgTV9TRVEsCi0gICAgTV9TRVFfSSwKLSAgICBNX1NHRSwKLSAgICBNX1NHRV9JLAotICAgIE1fU0dFVSwKLSAgICBNX1NHRVVfSSwKLSAgICBNX1NHVCwKLSAgICBNX1NHVF9JLAotICAgIE1fU0dUVSwKLSAgICBNX1NHVFVfSSwKLSAgICBNX1NMRSwKLSAgICBNX1NMRV9JLAotICAgIE1fU0xFVSwKLSAgICBNX1NMRVVfSSwKLSAgICBNX1NMVF9JLAotICAgIE1fU0xUVV9JLAotICAgIE1fU05FLAotICAgIE1fU05FX0ksCi0gICAgTV9TQl9BLAotICAgIE1fU0JfQUIsCi0gICAgTV9TSF9BLAotICAgIE1fU0hfQUIsCi0gICAgTV9TV19BLAotICAgIE1fU1dfQUIsCi0gICAgTV9TV0MwX0EsCi0gICAgTV9TV0MwX0FCLAotICAgIE1fU1dDMV9BLAotICAgIE1fU1dDMV9BQiwKLSAgICBNX1NXQzJfQSwKLSAgICBNX1NXQzJfQUIsCi0gICAgTV9TV0MzX0EsCi0gICAgTV9TV0MzX0FCLAotICAgIE1fU1dMX0EsCi0gICAgTV9TV0xfQUIsCi0gICAgTV9TV1JfQSwKLSAgICBNX1NXUl9BQiwKLSAgICBNX1NVQl9JLAotICAgIE1fU1VCVV9JLAotICAgIE1fU1VCVV9JXzIsCi0gICAgTV9URVFfSSwKLSAgICBNX1RHRV9JLAotICAgIE1fVEdFVV9JLAotICAgIE1fVExUX0ksCi0gICAgTV9UTFRVX0ksCi0gICAgTV9UTkVfSSwKLSAgICBNX1RSVU5DV0QsCi0gICAgTV9UUlVOQ1dTLAotICAgIE1fVUxELAotICAgIE1fVUxEX0EsCi0gICAgTV9VTEgsCi0gICAgTV9VTEhfQSwKLSAgICBNX1VMSFUsCi0gICAgTV9VTEhVX0EsCi0gICAgTV9VTFcsCi0gICAgTV9VTFdfQSwKLSAgICBNX1VTSCwKLSAgICBNX1VTSF9BLAotICAgIE1fVVNXLAotICAgIE1fVVNXX0EsCi0gICAgTV9VU0QsCi0gICAgTV9VU0RfQSwKLSAgICBNX1hPUl9JLAotICAgIE1fQ09QMCwKLSAgICBNX0NPUDEsCi0gICAgTV9DT1AyLAotICAgIE1fQ09QMywKLSAgICBNX05VTV9NQUNST1MKLX07Ci0KLQotLyogVGhlIG9yZGVyIG9mIG92ZXJsb2FkZWQgaW5zdHJ1Y3Rpb25zIG1hdHRlcnMuICBMYWJlbCBhcmd1bWVudHMgYW5kCi0gICByZWdpc3RlciBhcmd1bWVudHMgbG9vayB0aGUgc2FtZS4gSW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGhhdmUgZWl0aGVyCi0gICBmb3IgYXJndW1lbnRzIG11c3QgYXBlYXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgaW4gdGhpcyB0YWJsZSBmb3IgdGhlCi0gICBhc3NlbWJsZXIgdG8gcGljayB0aGUgcmlnaHQgb25lLiBJbiBvdGhlciB3b3JkcywgZW50cmllcyB3aXRoCi0gICBpbW1lZGlhdGUgb3BlcmFuZHMgbXVzdCBhcGVhciBhZnRlciB0aGUgc2FtZSBpbnN0cnVjdGlvbiB3aXRoCi0gICByZWdpc3RlcnMuCi0KLSAgIE1hbnkgaW5zdHJ1Y3Rpb25zIGFyZSBzaG9ydCBoYW5kIGZvciBvdGhlciBpbnN0cnVjdGlvbnMgKGkuZS4sIFRoZQotICAgamFsIDxyZWdpc3Rlcj4gaW5zdHJ1Y3Rpb24gaXMgc2hvcnQgZm9yIGphbHIgPHJlZ2lzdGVyPikuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHNfYnVpbHRpbl9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IGJmZF9taXBzX251bV9idWlsdGluX29wY29kZXM7Ci1leHRlcm4gc3RydWN0IG1pcHNfb3Bjb2RlICptaXBzX29wY29kZXM7Ci1leHRlcm4gaW50IGJmZF9taXBzX251bV9vcGNvZGVzOwotI2RlZmluZSBOVU1PUENPREVTIGJmZF9taXBzX251bV9vcGNvZGVzCi0KLQwKLS8qIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBhZGRzIGRlZmluaXRpb25zIGZvciB0aGUgbWlwczE2IFRpbnlSSVNDCi0gICBwcm9jZXNzb3IuICAqLwotCi0vKiBUaGVzZSBhcmUgdGhlIGJpdG1hc2tzIGFuZCBzaGlmdCBjb3VudHMgdXNlZCBmb3IgdGhlIGRpZmZlcmVudAotICAgZmllbGRzIGluIHRoZSBpbnN0cnVjdGlvbiBmb3JtYXRzLiAgT3RoZXIgdGhhbiBPUCwgbm8gbWFza3MgYXJlCi0gICBwcm92aWRlZCBmb3IgdGhlIGZpeGVkIHBvcnRpb25zIG9mIGFuIGluc3RydWN0aW9uLCBzaW5jZSB0aGV5IGFyZQotICAgbm90IG5lZWRlZC4KLQotICAgVGhlIEkgZm9ybWF0IHVzZXMgSU1NMTEuCi0KLSAgIFRoZSBSSSBmb3JtYXQgdXNlcyBSWCBhbmQgSU1NOC4KLQotICAgVGhlIFJSIGZvcm1hdCB1c2VzIFJYLCBhbmQgUlkuCi0KLSAgIFRoZSBSUkkgZm9ybWF0IHVzZXMgUlgsIFJZLCBhbmQgSU1NNS4KLQotICAgVGhlIFJSUiBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBSWi4KLQotICAgVGhlIFJSSV9BIGZvcm1hdCB1c2VzIFJYLCBSWSwgYW5kIElNTTQuCi0KLSAgIFRoZSBTSElGVCBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBTSEFNVC4KLQotICAgVGhlIEk4IGZvcm1hdCB1c2VzIElNTTguCi0KLSAgIFRoZSBJOF9NT1ZSMzIgZm9ybWF0IHVzZXMgUlkgYW5kIFJFR1IzMi4KLQotICAgVGhlIElSX01PVjMyUiBmb3JtYXQgdXNlcyBSRUczMlIgYW5kIE1PVjMyWi4KLQotICAgVGhlIEk2NCBmb3JtYXQgdXNlcyBJTU04LgotCi0gICBUaGUgUkk2NCBmb3JtYXQgdXNlcyBSWSBhbmQgSU1NNS4KLSAgICovCi0KLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19PUAkweDFmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX09QCQkxMQotI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTExCTB4N2ZmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTExCTAKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19SWAkweDcKLSNkZWZpbmUgTUlQUzE2T1BfU0hfUlgJCTgKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19JTU04CTB4ZmYKLSNkZWZpbmUgTUlQUzE2T1BfU0hfSU1NOAkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfUlkJMHg3Ci0jZGVmaW5lIE1JUFMxNk9QX1NIX1JZCQk1Ci0jZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NNQkweDFmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTUJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JaCTB4NwotI2RlZmluZSBNSVBTMTZPUF9TSF9SWgkJMgotI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTQJMHhmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTQJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JFR1IzMgkweDFmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX1JFR1IzMgkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfUkVHMzJSCTB4MWYKLSNkZWZpbmUgTUlQUzE2T1BfU0hfUkVHMzJSCTMKLSNkZWZpbmUgTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIoaSkgKCgoKGkpID4+IDUpICYgNykgfCAoKGkpICYgMHgxOCkpCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfTU9WRTMyWgkweDcKLSNkZWZpbmUgTUlQUzE2T1BfU0hfTU9WRTMyWgkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NNgkweDNmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTYJNQotCi0vKiBUaGVzZSBhcmUgdGhlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGFwcGVhcnMgaW4gdGhlIGFyZ3MgZmllbGQgb2YgYW4KLSAgIGluc3RydWN0aW9uLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmaWVsZHMgYXBwZWFyCi0gICB3aGVuIHRoZSBpbnN0cnVjdGlvbiBpcyB1c2VkLiAgQ29tbWFzIGFuZCBwYXJlbnRoZXNlcyBpbiB0aGUgYXJncwotICAgc3RyaW5nIGFyZSBpZ25vcmVkIHdoZW4gYXNzZW1ibGluZywgYW5kIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0Ci0gICB3aGVuIGRpc2Fzc2VtYmxpbmcuCi0KLSAgICJ5IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWSkKLSAgICJ4IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWCkKLSAgICJ6IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWikKLSAgICJaIiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9NT1ZFMzJaKQotICAgInYiIDMgYml0IHNhbWUgcmVnaXN0ZXIgYXMgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAoTUlQUzE2T1BfKl9SWCkKLSAgICJ3IiAzIGJpdCBzYW1lIHJlZ2lzdGVyIGFzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE1JUFMxNk9QXypfUlkpCi0gICAiMCIgemVybyByZWdpc3RlciAoJDApCi0gICAiUyIgc3RhY2sgcG9pbnRlciAoJHNwIG9yICQyOSkKLSAgICJQIiBwcm9ncmFtIGNvdW50ZXIKLSAgICJSIiByZXR1cm4gYWRkcmVzcyByZWdpc3RlciAoJHJhIG9yICQzMSkKLSAgICJYIiA1IGJpdCBNSVBTIHJlZ2lzdGVyIChNSVBTMTZPUF8qX1JFR1IzMikKLSAgICJZIiA1IGJpdCBNSVBTIHJlZ2lzdGVyIChNSVBTMTZPUF8qX1JFRzMyUikKLSAgICI2IiA2IGJpdCB1bnNpZ25lZCBicmVhayBjb2RlIChNSVBTMTZPUF8qX0lNTTYpCi0gICAiYSIgMjYgYml0IGp1bXAgYWRkcmVzcwotICAgImUiIDExIGJpdCBleHRlbnNpb24gdmFsdWUKLSAgICJsIiByZWdpc3RlciBsaXN0IGZvciBlbnRyeSBpbnN0cnVjdGlvbgotICAgIkwiIHJlZ2lzdGVyIGxpc3QgZm9yIGV4aXQgaW5zdHJ1Y3Rpb24KLQotICAgVGhlIHJlbWFpbmluZyBjb2RlcyBtYXkgYmUgZXh0ZW5kZWQuICBFeGNlcHQgYXMgb3RoZXJ3aXNlIG5vdGVkLAotICAgdGhlIGZ1bGwgZXh0ZW5kZWQgb3BlcmFuZCBpcyBhIDE2IGJpdCBzaWduZWQgdmFsdWUuCi0gICAiPCIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JaKSAoZnVsbCA1IGJpdCB1bnNpZ25lZCkKLSAgICI+IiAzIGJpdCB1bnNpZ25lZCBzaGlmdCBjb3VudCAqIDAgKE1JUFMxNk9QXypfUlgpIChmdWxsIDUgYml0IHVuc2lnbmVkKQotICAgIlsiIDMgYml0IHVuc2lnbmVkIHNoaWZ0IGNvdW50ICogMCAoTUlQUzE2T1BfKl9SWikgKGZ1bGwgNiBiaXQgdW5zaWduZWQpCi0gICAiXSIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JYKSAoZnVsbCA2IGJpdCB1bnNpZ25lZCkKLSAgICI0IiA0IGJpdCBzaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU00KSAoZnVsbCAxNSBiaXQgc2lnbmVkKQotICAgIjUiIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NNSkKLSAgICJIIiA1IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAyIChNSVBTMTZPUF8qX0lNTTUpCi0gICAiVyIgNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogNCAoTUlQUzE2T1BfKl9JTU01KQotICAgIkQiIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDggKE1JUFMxNk9QXypfSU1NNSkKLSAgICJqIiA1IGJpdCBzaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU01KQotICAgIjgiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NOCkKLSAgICJWIiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiA0IChNSVBTMTZPUF8qX0lNTTgpCi0gICAiQyIgOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogOCAoTUlQUzE2T1BfKl9JTU04KQotICAgIlUiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NOCkgKGZ1bGwgMTYgYml0IHVuc2lnbmVkKQotICAgImsiIDggYml0IHNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTgpCi0gICAiSyIgOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqIDggKE1JUFMxNk9QXypfSU1NOCkKLSAgICJwIiA4IGJpdCBjb25kaXRpb25hbCBicmFuY2ggYWRkcmVzcyAoTUlQUzE2T1BfKl9JTU04KQotICAgInEiIDExIGJpdCBicmFuY2ggYWRkcmVzcyAoTUlQUzE2T1BfKl9JTU0xMSkKLSAgICJBIiA4IGJpdCBQQyByZWxhdGl2ZSBhZGRyZXNzICogNCAoTUlQUzE2T1BfKl9JTU04KQotICAgIkIiIDUgYml0IFBDIHJlbGF0aXZlIGFkZHJlc3MgKiA4IChNSVBTMTZPUF8qX0lNTTUpCi0gICAiRSIgNSBiaXQgUEMgcmVsYXRpdmUgYWRkcmVzcyAqIDQgKE1JUFMxNk9QXypfSU1NNSkKLSAgICovCi0KLS8qIEZvciB0aGUgbWlwczE2LCB3ZSB1c2UgdGhlIHNhbWUgb3Bjb2RlIHRhYmxlIGZvcm1hdCBhbmQgYSBmZXcgb2YKLSAgIHRoZSBzYW1lIGZsYWdzLiAgSG93ZXZlciwgbW9zdCBvZiB0aGUgZmxhZ3MgYXJlIGRpZmZlcmVudC4gICovCi0KLS8qIE1vZGlmaWVzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JYLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfWAkJICAgIDB4MDAwMDAwMDEKLS8qIE1vZGlmaWVzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JZLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfWQkJICAgIDB4MDAwMDAwMDIKLS8qIE1vZGlmaWVzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JaLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfWgkJICAgIDB4MDAwMDAwMDQKLS8qIE1vZGlmaWVzIHRoZSBUICgkMjQpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfVAkJICAgIDB4MDAwMDAwMDgKLS8qIE1vZGlmaWVzIHRoZSBTUCAoJDI5KSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1NQCQkgICAgMHgwMDAwMDAxMAotLyogTW9kaWZpZXMgdGhlIFJBICgkMzEpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfMzEJCSAgICAweDAwMDAwMDIwCi0vKiBNb2RpZmllcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUkVHMzJSLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfR1BSX1kJCSAgICAweDAwMDAwMDQwCi0vKiBSZWFkcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWC4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfWAkJICAgIDB4MDAwMDAwODAKLS8qIFJlYWRzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JZLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9ZCQkgICAgMHgwMDAwMDEwMAotLyogUmVhZHMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfTU9WRTMyWi4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfWgkJICAgIDB4MDAwMDAyMDAKLS8qIFJlYWRzIHRoZSBUICgkMjQpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9UCQkgICAgMHgwMDAwMDQwMAotLyogUmVhZHMgdGhlIFNQICgkMjkpIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9TUAkJICAgIDB4MDAwMDA4MDAKLS8qIFJlYWRzIHRoZSBSQSAoJDMxKSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfMzEJCSAgICAweDAwMDAxMDAwCi0vKiBSZWFkcyB0aGUgcHJvZ3JhbSBjb3VudGVyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9QQwkJICAgIDB4MDAwMDIwMDAKLS8qIFJlYWRzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SRUdSMzIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX0dQUl9YCQkgICAgMHgwMDAwNDAwMAotLyogSXMgYSBicmFuY2ggaW5zbi4gKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fQlJBTkNIICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotCi0vKiBUaGUgZm9sbG93aW5nIGZsYWdzIGhhdmUgdGhlIHNhbWUgdmFsdWUgZm9yIHRoZSBtaXBzMTYgb3Bjb2RlCi0gICB0YWJsZToKLSAgIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQotICAgSU5TTl9DT05EX0JSQU5DSF9ERUxBWQotICAgSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkgKG5ldmVyIHVzZWQpCi0gICBJTlNOX1JFQURfSEkKLSAgIElOU05fUkVBRF9MTwotICAgSU5TTl9XUklURV9ISQotICAgSU5TTl9XUklURV9MTwotICAgSU5TTl9UUkFQCi0gICBJTlNOX0lTQTMKLSAgICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgbWlwczE2X29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgYmZkX21pcHMxNl9udW1fb3Bjb2RlczsKLQotI2VuZGlmIC8qIF9NSVBTX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tbjEwMjAwLmggYi9pbmNsdWRlL29wY29kZS9tbjEwMjAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZmE5NGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbW4xMDIwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qIG1uMTAyMDAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgTWF0c3VzaGl0YSAxMDIwMCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKZWZmIExhdywgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBNTjEwMjAwX0gKLSNkZWZpbmUgTU4xMDIwMF9ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IG1uMTAyMDBfb3Bjb2RlLiAgKi8KLQotc3RydWN0IG1uMTAyMDBfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLSAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhCi0gICAgIG1hc2sgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZQotICAgICBvcGNvZGUgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90Ci0gICAgIG1hdGNoIChhbmQgYXJlIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLQotICAvKiBUaGUgZm9ybWF0IG9mIHRoaXMgb3Bjb2RlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBmb3JtYXQ7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s4XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgbW4xMDIwMF9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IG1uMTAyMDBfbnVtX29wY29kZXM7Ci0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kLiAgKi8KLQotc3RydWN0IG1uMTAyMDBfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLwotICBpbnQgZmxhZ3M7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIG1uMTAyMDBfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kIG1uMTAyMDBfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBtbjEwMjAwX29wZXJhbmQuICAqLwotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfRFJFRyAweDEKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfQVJFRyAweDIKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUFNXIDB4NAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9NRFIgMHg4Ci0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCAweDEwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1BST01PVEUgMHgyMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9QQVJFTiAweDQwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1JFUEVBVEVEIDB4ODAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfRVhURU5ERUQgMHgxMDAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfTk9DSEVDSyAweDIwMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9QQ1JFTCAweDQwMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9NRU1BRERSIDB4ODAwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1JFTEFYIDB4MTAwMAotCi0jZGVmaW5lIEZNVF8xIDEKLSNkZWZpbmUgRk1UXzIgMgotI2RlZmluZSBGTVRfMyAzCi0jZGVmaW5lIEZNVF80IDQKLSNkZWZpbmUgRk1UXzUgNQotI2RlZmluZSBGTVRfNiA2Ci0jZGVmaW5lIEZNVF83IDcKLSNlbmRpZiAvKiBNTjEwMjAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL21uMTAzMDAuaCBiL2luY2x1ZGUvb3Bjb2RlL21uMTAzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmMDM2Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9tbjEwMzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyogbW4xMDMwMC5oIC0tIEhlYWRlciBmaWxlIGZvciBNYXRzdXNoaXRhIDEwMzAwIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEplZmYgTGF3LCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIE1OMTAzMDBfSAotI2RlZmluZSBNTjEwMzAwX0gKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUuICAqLwotCi0jZGVmaW5lIE1OMTAzMDBfTUFYX09QRVJBTkRTIDgKLXN0cnVjdCBtbjEwMzAwX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogQSBiaXRtYXNrLiAgRm9yIGVhY2ggb3BlcmFuZCwgbm9uemVybyBpZiBpdCBtdXN0IG5vdCBoYXZlIHRoZSBzYW1lCi0gICAgIHJlZ2lzdGVyIHNwZWNpZmljYXRpb24gYXMgYWxsIG90aGVyIG9wZXJhbmRzIHdpdGggYSBub256ZXJvIGJpdCBpbgotICAgICB0aGlzIGZsYWcuICBpZSAweDgxIHdvdWxkIGluZGljYXRlIHRoYXQgb3BlcmFuZHMgNyBhbmQgMCBtdXN0IG5vdAotICAgICBtYXRjaC4gIE5vdGUgdGhhdCB3ZSBjb3VudCBvcGVyYW5kcyBmcm9tIGxlZnQgdG8gcmlnaHQgYXMgdGhleSBhcHBlYXIKLSAgICAgaW4gdGhlIG9wZXJhbmRzIHNwZWNpZmljYXRpb24gYmVsb3cuICAqLwotICB1bnNpZ25lZCBpbnQgbm9fbWF0Y2hfb3BlcmFuZHM7Ci0KLSAgLyogVGhlIGZvcm1hdCBvZiB0aGlzIG9wY29kZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgZm9ybWF0OwotCi0gIC8qIEJpdG1hc2sgaW5kaWNhdGluZyB3aGF0IGNwdSB2YXJpYW50cyB0aGlzIG9wY29kZSBpcyBhdmFpbGFibGUgb24uCi0gICAgIFdlIGFzc3VtZSBtbjEwMzAwIGJhc2Ugb3Bjb2RlcyBhcmUgYXZhaWxhYmxlIGV2ZXJ5d2hlcmUsIHNvIHdlIG9ubHkKLSAgICAgaGF2ZSB0byBub3RlIG9wY29kZXMgd2hpY2ggYXJlIGF2YWlsYWJsZSBvbiBvdGhlciB2YXJpYW50cy4gICovCi0gIHVuc2lnbmVkIGludCBtYWNoaW5lOwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbTU4xMDMwMF9NQVhfT1BFUkFORFNdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQotICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCi0gICBpbnN0cnVjdGlvbnMuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wY29kZSBtbjEwMzAwX29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgbW4xMDMwMF9udW1fb3Bjb2RlczsKLQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBtbjEwMzAwX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kCi17Ci0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCi0gIGludCBiaXRzOwotCi0gIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGludCBzaGlmdDsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIGludCBmbGFnczsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgbW4xMDMwMF9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgbW4xMDMwMF9vcGVyYW5kc1tdOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IG1uMTAzMDBfb3BlcmFuZC4gICovCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9EUkVHIDB4MQotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9BUkVHIDB4MgotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9TUCAweDQKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUFNXIDB4OAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9NRFIgMHgxMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgMHgyMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFIDB4NDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUEFSRU4gMHg4MAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRCAweDEwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9FWFRFTkRFRCAweDIwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9TUExJVCAweDQwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVCAweDgwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCAweDEwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfTUVNQUREUiAweDIwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUkVMQVggMHg0MDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1VTUCAweDgwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU1NQIDB4MTAwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfTVNQIDB4MjAwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUEMgMHg0MDAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9FUFNXIDB4ODAwMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUlJFRyAweDEwMDAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9YUlJFRyAweDIwMDAwMAotCi0jZGVmaW5lIE1OMTAzMDBfT1BFUkFORF9QTFVTIDB4NDAwMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EXzI0QklUIDB4ODAwMDAwCi0KLS8qIE9wY29kZSBGb3JtYXRzLiAgKi8KLSNkZWZpbmUgRk1UX1MwIDEKLSNkZWZpbmUgRk1UX1MxIDIKLSNkZWZpbmUgRk1UX1MyIDMKLSNkZWZpbmUgRk1UX1M0IDQKLSNkZWZpbmUgRk1UX1M2IDUKLSNkZWZpbmUgRk1UX0QwIDYKLSNkZWZpbmUgRk1UX0QxIDcKLSNkZWZpbmUgRk1UX0QyIDgKLSNkZWZpbmUgRk1UX0Q0IDkKLSNkZWZpbmUgRk1UX0Q1IDEwCi0jZGVmaW5lIEZNVF9ENiAxMQotI2RlZmluZSBGTVRfRDcgMTIKLSNkZWZpbmUgRk1UX0Q4IDEzCi0jZGVmaW5lIEZNVF9EOSAxNAotI2RlZmluZSBGTVRfRDEwIDE1Ci0KLS8qIFZhcmlhbnRzIG9mIHRoZSBtbjEwMzAwIHdoaWNoIGhhdmUgYWRkaXRpb25hbCBvcGNvZGVzLiAgKi8KLSNkZWZpbmUgTU4xMDMgMzAwCi0jZGVmaW5lIEFNMzAgIDMwMAotCi0jZGVmaW5lIEFNMzMgMzMwCi0KLSNlbmRpZiAvKiBNTjEwMzAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL25wMS5oIGIvaW5jbHVkZS9vcGNvZGUvbnAxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyM2FkYzcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbnAxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyogUHJpbnQgR09VTEQgTlBMIGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLUdEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotc3RydWN0IGdsZF9vcGNvZGUKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgY2hhciAqYXJnczsKLSAgaW50IGxlbmd0aDsKLX07Ci0KLS8qIFdlIHN0b3JlIGZvdXIgYnl0ZXMgb2Ygb3Bjb2RlIGZvciBhbGwgb3Bjb2RlcyBiZWNhdXNlIHRoYXQKLSAgIGlzIHRoZSBtb3N0IGFueSBvZiB0aGVtIG5lZWQuICBUaGUgYWN0dWFsIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbgotICAgaXMgYWx3YXlzIGF0IGxlYXN0IDIgYnl0ZXMsIGFuZCBhdCBtb3N0IGZvdXIuICBUaGUgbGVuZ3RoIG9mIHRoZQotICAgaW5zdHJ1Y3Rpb24gaXMgYmFzZWQgb24gdGhlIG9wY29kZS4KLQotICAgVGhlIG1hc2sgY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoCi0gICBwYXJ0aWN1bGFyIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2UKLSAgIG9mIHRoYXQgb3Bjb2RlLgotCi0gICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzCi0gICB0aGF0IGFyZSB1c2VkIHRvIGZvcm1hdCB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbnN0cnVjdGlvbi4gKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICByICBSZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgUiAgUmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCi0gICBiICBCYXNlIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBCICBCYXNlIHJlZ2lzdGVyIGluIHNlY29uZCBmaWVsZAotICAgdiAgVmVjdG9yIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBWICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIEEgIE9wdGlvbmFsIGFkZHJlc3MgcmVnaXN0ZXIgKGJhc2UgcmVnaXN0ZXIpCi0gICBYICBPcHRpb25hbCBpbmRleCByZWdpc3RlcgotICAgSSAgSW1tZWRpYXRlIGRhdGEgKDE2Yml0cyBzaWduZWQpCi0gICBPICBPZmZzZXQgZmllbGQgKDE2Yml0cyBzaWduZWQpCi0gICBoICBPZmZzZXQgZmllbGQgKDE1Yml0cyBzaWduZWQpCi0gICBkICBPZmZzZXQgZmllbGQgKDE0Yml0cyBzaWduZWQpCi0gICBTICBTaGlmdCBjb3VudCBmaWVsZAotCi0gICBhbnkgb3RoZXIgY2hhcmFjdGVycyBhcmUgcHJpbnRlZCBhcyBpcy4uLgotKi8KLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHRoaXMgYXJyYXkgYmUgc29ydGVkIGFzIGZvbGxvd3M6Ci0gICBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gICBBbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzCi0gICBtdXN0IGJlIGNvbnNlY3V0aXZlLgotICovCi1zdHJ1Y3QgZ2xkX29wY29kZSBnbGRfb3Bjb2Rlc1tdID0KLXsKLXsgImxiIiwJCTB4YjQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5iIiwJMHhiODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsYnMiLAkweGVjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxoIiwJCTB4YjQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5oIiwJMHhiODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsdyIsCQkweGI0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxudyIsCTB4YjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGQiLAkJMHhiNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsbmQiLAkweGI4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxpIiwJCTB4ZjgwMDAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAibHBhIiwJMHg1MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsYSIsCQkweDUwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxhYnIiLAkweDU4MDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxicCIsCTB4OTAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGhwIiwJMHg5MDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsd3AiLAkweDkwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxkcCIsCTB4OTAwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VhYnIiLAkweDU4MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxmIiwJCTB4YmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGZiciIsCTB4YmMwODAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAibHdiciIsCTB4NWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAic3RiIiwJMHhkNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGgiLAkweGQ0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN0dyIsCTB4ZDQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RkIiwJMHhkNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdGYiLAkweGRjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZmJyIiwJMHhkYzA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJzdHdiciIsCTB4NTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAiem1iIiwJMHhkODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6bWgiLAkweGQ4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInptdyIsCTB4ZDgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiem1kIiwJMHhkODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdGJwIiwJMHg5NDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGhwIiwJMHg5NDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJzdHdwIiwJMHg5NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGRwIiwJMHg5NDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsaWwiLAkweGY4MGIwMDAwLAkweGZjN2YwMDAwLAkicixEIiwJCTQgfSwKLXsgImx3c2wxIiwJMHhlYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsd3NsMiIsCTB4ZmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibHdzbDMiLAkweGZjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLQoteyAibHZiIiwJMHhiMDA4MDAwMCwJMHhmYzA4MDAwMCwJInYseE9BLFgiLAk0IH0sCi17ICJsdmgiLAkweGIwMDAwMDAxLAkweGZjMDgwMDAxLAkidix4T0EsWCIsCTQgfSwKLXsgImx2dyIsCTB4YjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ2LHhPQSxYIiwJNCB9LAoteyAibHZkIiwJMHhiMDAwMDAwMiwJMHhmYzA4MDAwMiwJInYseE9BLFgiLAk0IH0sCi17ICJsaXYiLAkweDNjMDQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImxpdmYiLAkweDNjMDgwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN0dmIiLAkweGQwMDgwMDAwLAkweGZjMDgwMDAwLAkidix4T0EsWCIsCTQgfSwKLXsgInN0dmgiLAkweGQwMDAwMDAxLAkweGZjMDgwMDAxLAkidix4T0EsWCIsCTQgfSwKLXsgInN0dnciLAkweGQwMDAwMDAwLAkweGZjMDgwMDAwLAkidix4T0EsWCIsCTQgfSwKLXsgInN0dmQiLAkweGQwMDAwMDAyLAkweGZjMDgwMDAyLAkidix4T0EsWCIsCTQgfSwKLQoteyAidHJyIiwJMHgyYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cm4iLAkweDJjMDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRybmQiLAkweDJjMGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyYWJzIiwJMHgyYzAxMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cmFic2QiLAkweDJjMDkwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyYyIsCTB4MmMwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNyIiwJMHgyODA0MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJjeGNyIiwJMHgyYzA2MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJjeGNyZCIsCTB4MmMwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidGJyciIsCTB4MmMwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLEIiLAkJMiB9LAoteyAidHJiciIsCTB4MjgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJiLFIiLAkJMiB9LAoteyAieGNiciIsCTB4MjgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJiLEIiLAkJMiB9LAoteyAidGJyYnIiLAkweDI4MDEwMDAwLAkweGZjMGYwMDAwLAkiYixCIiwJCTIgfSwKLQoteyAidHJ2diIsCTB4MjgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAidHJ2dm4iLAkweDJjMDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInRydnZuZCIsCTB4MmMwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAidHJ2YWIiLAkweDJjMDcwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInRydmFiZCIsCTB4MmMwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiY21wdiIsCTB4MTQwNjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiZXhwdiIsCTB4MTQwNzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dmx0IiwJMHgxMDAzMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2bGUiLAkweDEwMDQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZndCIsCTB4MTQwMzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dmdlIiwJMHgxNDA0MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2ZXEiLAkweDEwMDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZuZSIsCTB4MTAwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2cmx0IiwJMHgxMDBkMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcnZybGUiLAkweDEwMGUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1ydnJndCIsCTB4MTQwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXJ2cmdlIiwJMHgxNDBlMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcnZyZXEiLAkweDEwMGYwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1ydnJuZSIsCTB4MTQwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAidHJ2ciIsCTB4MTQwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAidHJydiIsCTB4MTQwYzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJidSIsCQkweDQwMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibnMiLAkweDcwMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibmNvIiwJMHg3MDg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmdlIiwJMHg3MTA4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYm5lIiwJMHg3MTg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnVuZ2UiLAkweDcyMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJidW5sZSIsCTB4NzI4ODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJndCIsCTB4NzMwODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJuYW55IiwJMHg3Mzg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnMiCSwJMHg3MDAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmNvIiwJMHg3MDgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmx0IiwJMHg3MTAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmVxIiwJMHg3MTgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnVnZSIsCTB4NzIwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJ1bHQiLAkweDcyODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibGUiLAkweDczMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiYW55IiwJMHg3MzgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnJsbmsiLAkweDQ0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpYiIsCTB4NDgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYmloIiwJMHg0ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaXciLAkweDRjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpZCIsCTB4NGMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2YiIsCTB4NjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2aCIsCTB4NjAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2dyIsCTB4NjQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2ZCIsCTB4NjQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzYiIsCTB4NjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzaCIsCTB4NjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzdyIsCTB4NmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzZCIsCTB4NmMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAotCi17ICJjYW1iIiwJMHg4MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1oIiwJMHg4MDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJjYW13IiwJMHg4MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1kIiwJMHg4MDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJjYXIiLAkweDEwMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNhcmQiLAkweDE0MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNpIiwJCTB4ZjgwNTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiY2hrYm5kIiwJMHg1YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi0KLXsgImNhdnYiLAkweDEwMDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImNhdnIiLAkweDEwMDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImNhdnZkIiwJMHgxMDA5MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJjYXZyZCIsCTB4MTAwYjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJhbm1iIiwJMHg4NDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhbm1oIiwJMHg4NDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhbm13IiwJMHg4NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhbm1kIiwJMHg4NDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhbnIiLAkweDA0MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFuaSIsCTB4ZjgwODAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAib3JtYiIsCTB4YjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtaCIsCTB4YjgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtdyIsCTB4YjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtZCIsCTB4YjgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JyIiwJMHgwODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJvaSIsCQkweGY4MDkwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgImVvbWIiLAkweDhjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbWgiLAkweDhjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbXciLAkweDhjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbWQiLAkweDhjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImVvciIsCTB4MGMwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZW9pIiwJMHhmODBhMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi0KLXsgImFudnYiLAkweDA0MDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImFudnIiLAkweDA0MDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm9ydnYiLAkweDA4MDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm9ydnIiLAkweDA4MDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImVvdnYiLAkweDBjMDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImVvdnIiLAkweDBjMDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLQoteyAic2FjeiIsCTB4MTAwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2xhIiwJMHgxYzQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGwiLAkweDFjNjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsYyIsCTB4MjQ0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xhZCIsCTB4MjA0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xsZCIsCTB4MjA2MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JhIiwJMHgxYzAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmwiLAkweDFjMjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNyYyIsCTB4MjQwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JhZCIsCTB4MjAwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JsZCIsCTB4MjAyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2RhIiwJMHgzYzAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzZGwiLAkweDNjMDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNkYyIsCTB4M2MwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2RhZCIsCTB4M2MwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2RsZCIsCTB4M2MwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotCi17ICJzdmRhIiwJMHgzYzA3MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRsIiwJMHgzYzA2MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRjIiwJMHgzYzA1MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRhZCIsCTB4M2MwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3ZkbGQiLAkweDNjMGQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLQoteyAic2JtIiwJMHhhYzA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ6Ym0iLAkweGFjMDAwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInRibSIsCTB4YTgwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAiaW5jbWIiLAkweGEwMDAwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJpbmNtaCIsCTB4YTAwODAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImluY213IiwJMHhhNDAwMDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiaW5jbWQiLAkweGE0MDgwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJzYm1kIiwJMHg3YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6Ym1kIiwJMHg3YzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ0Ym1kIiwJMHg3ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi0KLXsgInNzbSIsCTB4OWMwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAienNtIiwJMHg5YzAwMDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ0c20iLAkweDk4MDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLQoteyAiYWRtYiIsCTB4YzgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtaCIsCTB4YzgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtdyIsCTB4YzgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtZCIsCTB4YzgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRyIiwJMHgzODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhcm1iIiwJMHhlODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1oIiwJMHhlODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhcm13IiwJMHhlODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1kIiwJMHhlODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZGkiLAkweGY4MDEwMDAwLAkweGZjMGYwMDAwLAkicixJIiwJCTQgfSwKLXsgInN1bWIiLAkweGNjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWgiLAkweGNjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bXciLAkweGNjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWQiLAkweGNjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN1ciIsCTB4M2MwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3VpIiwJMHhmODAyMDAwMCwJMHhmYzBmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJtcG1iIiwJMHhjMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcG1oIiwJMHhjMDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJtcG13IiwJMHhjMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcHIiLAkweDM4MDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1wcmQiLAkweDNjMGYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1waSIsCTB4ZjgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiZHZtYiIsCTB4YzQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtaCIsCTB4YzQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtdyIsCTB4YzQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZyIiwJMHgzODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJkdmkiLAkweGY4MDQwMDAwLAkweGZjMGYwMDAwLAkicixJIiwJCTQgfSwKLXsgImV4cyIsCTB4MzgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotCi17ICJhZHZ2IiwJMHgzMDAwMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJhZHZ2ZCIsCTB4MzAwODAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiYWRydiIsCTB4MzQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAiYWRydmQiLAkweDM0MDgwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN1dnYiLAkweDMwMDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInN1dnZkIiwJMHgzMDA5MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJzdXJ2IiwJMHgzNDAxMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdXJ2ZCIsCTB4MzQwOTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXB2diIsCTB4MzAwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXBydiIsCTB4MzQwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJhZGZ3IiwJMHhlMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZGZkIiwJMHhlMDA4MDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZHJmdyIsCTB4MzgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWRyZmQiLAkweDM4MDkwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN1cmZ3IiwJMHhlMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdXJmZCIsCTB4ZTAwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VyZnciLAkweDM4MDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN1cmZkIiwJMHgzODBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcGZ3IiwJMHhlNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcGZkIiwJMHhlNDA4MDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJtcHJmdyIsCTB4MzgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibXByZmQiLAkweDM4MGUwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInJmdyIsCTB4ZTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAicmZkIiwJMHhlNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJycmZ3IiwJMHgwYzBlMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAicnJmZCIsCTB4MGMwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLQoteyAiYWR2dmZ3IiwJMHgzMDA0MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJhZHZ2ZmQiLAkweDMwMGMwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImFkcnZmdyIsCTB4MzQwNDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAiYWRydmZkIiwJMHgzNDBjMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdXZ2ZnciLAkweDMwMDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInN1dnZmZCIsCTB4MzAwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAic3VydmZ3IiwJMHgzNDA1MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdXJ2ZmQiLAkweDM0MGQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1wdnZmdyIsCTB4MzAwNjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXB2dmZkIiwJMHgzMDBlMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcHJ2ZnciLAkweDM0MDYwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1wcnZmZCIsCTB4MzQwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAicnZmdyIsCTB4MzAwNzAwMDAsCTB4ZmMwZjAwMDAsCSJ2IiwJCTIgfSwKLXsgInJ2ZmQiLAkweDMwMGYwMDAwLAkweGZjMGYwMDAwLAkidiIsCQkyIH0sCi0KLXsgImZsdHciLAkweDM4MDcwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZsdGQiLAkweDM4MGYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZpeHciLAkweDM4MDUwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZpeGQiLAkweDM4MGQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNmcGRzIiwJMHgzYzA5MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi0KLXsgImZsdHZ3IiwJMHgwODBkMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJmbHR2ZCIsCTB4MDgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiZml4dnciLAkweDA4MGMwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImZpeHZkIiwJMHgwODBlMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJjZnB2ZHMiLAkweDBjMGQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLQoteyAib3J2cm4iLAkweDAwMGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgImFuZHZybiIsCTB4MDAwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAiZnJzdGVxIiwJMHgwNDA5MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJzaWdtYSIsCTB4MGMwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAic2lnbWFkIiwJMHgwYzBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJzaWdtZiIsCTB4MDgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAic2lnbWZkIiwJMHgwODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJwcm9kZiIsCTB4MDQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAicHJvZGZkIiwJMHgwNDBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJtYXh2IiwJMHgxMDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJtYXh2ZCIsCTB4MTAwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAibWludiIsCTB4MTQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAibWludmQiLAkweDE0MGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLQoteyAibHBzZCIsCTB4ZjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImxkYyIsCTB4ZjAwODAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgInNwbSIsCTB4MDQwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJwbSIsCTB4MDQwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRyaXRyIiwJMHgwMDA3MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHJyaXQiLAkweDAwMDYwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJycHN3dCIsCTB4MDQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImV4ciIsCTB4ZjgwNzAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJNCB9LAoteyAiaGFsdCIsCTB4MDAwMDAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAid2FpdCIsCTB4MDAwMTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAibm9wIiwJMHgwMDAyMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJlaWFlIiwJMHgwMDAzMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJlZmFlIiwJMHgwMDBkMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJkaWFlIiwJMHgwMDBlMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJkZmFlIiwJMHgwMDBmMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJzcHZjIiwJMHhmODA2MDAwMCwJMHhmYzBmMDAwMCwJInIsVCxOIiwJNCB9LAoteyAicmRzdHMiLAkweDAwMDkwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJzZXRjcHUiLAkweDAwMGMwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJjbWMiLAkweDAwMGIwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJ0cnJjdSIsCTB4MDAwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImF0dG5pbyIsCTB4MDAwNTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiZnVkaXQiLAkweDI4MDgwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImJyZWFrIiwJMHgyODA5MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJmcnpzcyIsCTB4MjgwYTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAicmlwaSIsCTB4MDQwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNwIiwJMHgwNDA1MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiYmxvY2siLAkweDA0MDYwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgInVuYmxvY2siLAkweDA0MDcwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgInRyc2MiLAkweDA4MDYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRzY3IiLAkweDA4MDcwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZxIiwJCTB4MDQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImZsdXB0ZSIsCTB4MmMwODAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJ2aXUiLAkweDA0MGYwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImxkZWwiLAkweDI4MGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImxkdSIsCTB4MjgwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3RkZWNjIiwJMHgyODBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnBjIiwJMHgwODA0MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHBjciIsCTB4MDgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImdoYWx0IiwJMHgwYzA1MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiZ3J1biIsCTB4MGMwNDAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAidG1wciIsCTB4MmMwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJtcCIsCTB4MmMwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotCi17ICJ0cnJ2ZSIsCTB4MjgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRydmVyIiwJMHgyODA3MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHJ2bHIiLAkweDI4MGYwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi0KLXsgImxpbmtmbCIsCTB4MTgwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibGlua2JsIiwJMHgxODAyMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJsaW5rZnAiLAkweDE4MDEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImxpbmticCIsCTB4MTgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibGlua3BsIiwJMHgxODA0MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ1bGlua2wiLAkweDE4MDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInVsaW5rcCIsCTB4MTgwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWxpbmt0bCIsCTB4MTgwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWxpbmt0cCIsCTB4MTgwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotfTsKLQotaW50IG51bW9wY29kZXMgPSBzaXplb2YoZ2xkX29wY29kZXMpIC8gc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKLQotc3RydWN0IGdsZF9vcGNvZGUgKmVuZG9wID0gZ2xkX29wY29kZXMgKyBzaXplb2YoZ2xkX29wY29kZXMpIC8KLQkJIAkJc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL25zMzJrLmggYi9pbmNsdWRlL29wY29kZS9uczMyay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmJiOGI4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL25zMzJrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotLyogbnMzMmstb3Bjb2RlLmggLS0gT3Bjb2RlIHRhYmxlIGZvciBOYXRpb25hbCBTZW1pIDMyayBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAoQykgMTk4NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpZmRlZiBTRVFVRU5UX0NPTVBBVEFCSUxJVFkKLSNkZWZpbmUgREVGX01PREVDIDIwCi0jZGVmaW5lIERFRl9NT0RFTCAyMQotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVDCi0jZGVmaW5lIERFRl9NT0RFQyAyMAotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVMCi0jZGVmaW5lIERFRl9NT0RFTCAyMAotI2VuZGlmCi0vKgotICAgQWZ0ZXIgZGVjaWRpbmcgdGhlIGluc3RydWN0aW9uIGVudHJ5ICh2aWEgaGFzaC5jKSB0aGUgaW5zdHJ1Y3Rpb24gcGFyc2VyCi0gICB3aWxsIHRyeSB0byBtYXRjaCB0aGUgb3BlcmFuZHMgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIHRvIHRoZSByZXF1aXJlZCBzZXQKLSAgIGdpdmVuIGluIHRoZSBlbnRyeSBvcGVyYW5kZmllbGQuIEV2ZXJ5IG9wZXJhbmQgd2lsbCByZXN1bHQgaW4gYSBjaGFuZ2UgaW4KLSAgIHRoZSBvcGNvZGUgb3IgdGhlIGFkZGl0aW9uIG9mIGRhdGEgdG8gdGhlIG9wY29kZS4KLSAgIFRoZSBvcGVyYW5kcyBpbiB0aGUgc291cmNlIGluc3RydWN0aW9uIGFyZSBjaGVja2VkIGZvciBpbmNvbnNpc3RlbnQKLSAgIHNlbWFudGljcy4KLSAKLQlGIDogMzIgYml0IGZsb2F0CWdlbmVyYWwgZm9ybQotCUwgOiA2NCBiaXQgZmxvYXQJICAgICIKLQlCIDogYnl0ZQkJICAgICIKLQlXIDogd29yZAkJICAgICIKLQlEIDogZG91YmxlLXdvcmQJCSAgICAiCi0JQSA6IGRvdWJsZS13b3JkCQlnZW4tYWRkcmVzcy1mb3JtIGllIG5vIHJlZ3MsIG5vIGltbWVkaWF0ZQotCUkgOiBpbnRlZ2VyIHdyaXRlYWJsZSAgIGdlbiBpbnQgZXhjZXB0IGltbWVkaWF0ZSAoQSArIHJlZykKLQlaIDogZmxvYXRpbmcgd3JpdGVhYmxlCWdlbiBmbG9hdCBleGNlcHQgaW1tZWRpYXRlIChaICsgZnJlZykKLQlkIDogZGlzcGxhY2VtZW50Ci0JYiA6IGRpc3BsYWNlbWVudCAtIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcgIGFjYgotCXAgOiBkaXNwbGFjZW1lbnQgLSBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nICBiciBiY29uZCBic3IgY3hwCi0JcSA6IHF1aWNrCi0JaSA6IGltbWVkaWF0ZSAoOCBiaXRzKQotCSAgICBUaGlzIGlzIG5vdCBhIHN0YW5kYXJkIG5zMzJrIG9wZXJhbmR0eXBlLCBpdCBpcyB1c2VkIHRvIGJ1aWxkCi0JICAgIGluc3RydWN0aW9ucyBsaWtlICAgIHN2YyBhcmcxLGFyZzIKLQkgICAgU3ZjIGlzIHRoZSBpbnN0cnVjdGlvbiBTdXBlclZpc29yQ2FsbCBhbmQgaXMgc29tZXRpbWVzIHVzZWQgdG8KLQkgICAgY2FsbCBPUy1yb3V0aW5lcyBmcm9tIHVzZXJtb2RlLiBTb21lIGFyZ3MgbWlnaHQgYmUgaGFuZHkhCi0JciA6IHJlZ2lzdGVyIG51bWJlciAoMyBiaXRzKQotCU8gOiBzZXRjZmcgaW5zdHJ1Y3Rpb24gb3B0aW9uc2xpc3QKLQlDIDogY2ludiBpbnN0cnVjdGlvbiBvcHRpb25zbGlzdAotCVMgOiBzdHJpbmdpbnN0cnVjdGlvbiBvcHRpb25zbGlzdAotCVUgOiByZWdpc3Rlcmxpc3QJc2F2ZSxlbnRlcgotCXUgOiByZWdpc3Rlcmxpc3QJcmVzdG9yZSxleGl0Ci0JTSA6IG1tdSByZWdpc3RlcgotCVAgOiBjcHUgcmVnaXN0ZXIKLQlnIDogMzpyZCBvcGVyYW5kIG9mIGluc3Mgb3IgZXh0cyBpbnN0cnVjdGlvbgotCUcgOiA0OnRoIG9wZXJhbmQgb2YgaW5zcyBvciBleHRzIGluc3RydWN0aW9uCi0JICAgIFRob3NlIG9wZXJhbmRzIGFyZSBlbmNvZGVkIGluIHRoZSBzYW1lIGJ5dGUuCi0JICAgIFRoaXMgYnl0ZSBpcyBwbGFjZWQgbGFzdCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi0JZiA6IG9wZXJhbmQgb2Ygc2ZzcgotCUggOiBzZXF1ZW50LWhhY2sgZm9yIGJzciAoV2FybmluZykKLQotY29sdW1uCTEgCWluc3RydWN0aW9ucwotCTIgCW51bWJlciBvZiBiaXRzIGluIG9wY29kZS4KLQkzIAludW1iZXIgb2YgYml0cyBpbiBvcGNvZGUgZXhwbGljaXRseQotCQlkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0cnVjdGlvbiB0eXBlLgotCTQgCW9wY29kZXNlZWQsIHRoZSBudW1iZXIgd2UgYnVpbGQgb3VyIG9wY29kZQotCQlmcm9tLgotCTUgCW9wZXJhbmR0eXBlcywgdXNlZCBieSBvcGVyYW5kcGFyc2VyLgotCTYgCXNpemUgaW4gYnl0ZXMgb2YgaW1tZWRpYXRlCi0qLwotc3RydWN0IG5zMzJrX29wY29kZSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlX2lkX3NpemU7IC8qIG5vdCB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgKi8KLSAgdW5zaWduZWQgY2hhciBvcGNvZGVfc2l6ZTsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGVfc2VlZDsKLSAgY2hhciAqb3BlcmFuZHM7Ci0gIHVuc2lnbmVkIGNoYXIgaW1fc2l6ZTsJLyogbm90IHVzZWQgYnkgZGlzc2Fzc2VtYmxlciAqLwotICBjaGFyICpkZWZhdWx0X2FyZ3M7CQkvKiBkZWZhdWx0IHRvIHRob3NlIGFyZ3Mgd2hlbiBub25lIGdpdmVuICovCi0gIGNoYXIgZGVmYXVsdF9tb2RlYzsJCS8qIGRlZmF1bHQgdG8gdGhpcyBhZGRyLW1vZGUgd2hlbiBhbWJpZ291cwotCQkJCSAgIGllIHdoZW4gdGhlIGFyZ3VtZW50IG9mIGEgZ2VuZXJhbCBhZGRyLW1vZGUKLQkJCQkgICBpcyBhIHBsYWluIGNvbnN0YW50ICovCi0gIGNoYXIgZGVmYXVsdF9tb2RlbDsJCS8qIGlzIGEgcGxhaW4gbGFiZWwgKi8KLX07Ci0KLSNpZmRlZiBjb21tZW50Ci0vKiBUaGlzIHNlY3Rpb24gd2FzIGZyb20gdGhlIGdkYiB2ZXJzaW9uIG9mIHRoaXMgZmlsZS4gKi8KLQotI2lmbmRlZiBuczMya19vcGNvZGVUCi0jZGVmaW5lIG5zMzJrX29wY29kZVQgaW50Ci0jZW5kaWYgLyogbm8gbnMzMmtfb3Bjb2RlVCAqLwotCi1zdHJ1Y3Qgbm90X3dvdAkJCS8qIG5zMzJrIG9wY29kZSB0YWJsZTogd290IHRvIGRvIHdpdGggdGhpcyAqLwotCQkJCS8qIHBhcnRpY3VsYXIgb3Bjb2RlICovCi17Ci0gIGludCBvYml0czsJCS8qIG51bWJlciBvZiBvcGNvZGUgYml0cyAqLwotICBpbnQgaWJpdHM7CQkvKiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb24gYml0cyAqLwotICBuczMya19vcGNvZGVUCWNvZGU7CS8qIG9wLWNvZGUgKG1heSBiZSA+IDggYml0cyEpICovCi0gIGNoYXIgKmFyZ3M7CQkvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLwotfTsKLQotc3RydWN0IG5vdAkJCS8qIG5zMzJrIG9wY29kZSB0ZXh0ICovCi17Ci0gIGNoYXIgKiAgICAgICAgICAgIG5hbWU7CS8qIG9wY29kZSBuYW1lOiBsb3dlcmNhc2Ugc3RyaW5nICBba2V5XSAgKi8KLSAgc3RydWN0IG5vdF93b3QgICAgZGV0YWlsOwkvKiByZXN0IG9mIG9wY29kZSB0YWJsZSAgICAgICAgICBbZGF0dW1dICovCi19OwotCi0vKiBJbnN0cnVjdGlvbnMgbG9vayBsaWtlIHRoaXM6Ci0gICAgCi0gICBiYXNpYyBpbnN0cnVjdGlvbi0tMSwgMiwgb3IgMyBieXRlcwotICAgaW5kZXggYnl0ZSBmb3Igb3BlcmFuZCBBLCBpZiBvcGVyYW5kIEEgaXMgaW5kZXhlZC0tMSBieXRlCi0gICBpbmRleCBieXRlIGZvciBvcGVyYW5kIEIsIGlmIG9wZXJhbmQgQiBpcyBpbmRleGVkLS0xIGJ5dGUKLSAgIGFkZHJlc3NpbmcgZXh0ZW5zaW9uIGZvciBvcGVyYW5kIEEKLSAgIGFkZHJlc3NpbmcgZXh0ZW5zaW9uIGZvciBvcGVyYW5kIEIKLSAgIGltcGxpZWQgb3BlcmFuZHMKLQotICAgT3BlcmFuZCBBIGlzIHRoZSBvcGVyYW5kIGxpc3RlZCBmaXJzdCBpbiB0aGUgZm9sbG93aW5nIG9wY29kZSB0YWJsZS4KLSAgIE9wZXJhbmQgQiBpcyB0aGUgb3BlcmFuZCBsaXN0ZWQgc2Vjb25kIGluIHRoZSBmb2xsb3dpbmcgb3Bjb2RlIHRhYmxlLgotICAgQWxsIGluc3RydWN0aW9ucyBoYXZlIGF0IG1vc3QgMiBnZW5lcmFsIG9wZXJhbmRzLCBzbyB0aGlzIGlzIGVub3VnaC4KLSAgIFRoZSBpbXBsaWVkIG9wZXJhbmRzIGFyZSBhc3NvY2lhdGVkIHdpdGggb3BlcmFuZHMgb3RoZXIgdGhhbiBBIGFuZCBCLgotCi0gICBFYWNoIG9wZXJhbmQgaGFzIGEgZGlnaXQgYW5kIGEgbGV0dGVyLgotICAgCi0gICBUaGUgZGlnaXQgZ2l2ZXMgdGhlIHBvc2l0aW9uIGluIHRoZSBhc3NlbWJseSBsYW5ndWFnZS4gIFRoZSBsZXR0ZXIsCi0gICBvbmUgb2YgdGhlIGZvbGxvd2luZywgdGVsbHMgdXMgd2hhdCBraW5kIG9mIG9wZXJhbmQgaXQgaXMuICAqLwotCi0vKiBGIDogMzIgYml0IGZsb2F0Ci0gKiBMIDogNjQgYml0IGZsb2F0Ci0gKiBCIDogYnl0ZQotICogVyA6IHdvcmQKLSAqIEQgOiBkb3VibGUtd29yZAotICogSSA6IGludGVnZXIgbm90IGltbWVkaWF0ZQotICogWiA6IGZsb2F0aW5nIG5vdCBpbW1lZGlhdGUKLSAqIGQgOiBkaXNwbGFjZW1lbnQKLSAqIHEgOiBxdWljawotICogaSA6IGltbWVkaWF0ZSAoOCBiaXRzKQotICogciA6IHJlZ2lzdGVyIG51bWJlciAoMyBiaXRzKQotICogcCA6IGRpc3BsYWNlbWVudCAtIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLSovCi0KLQotI2VuZGlmIC8qIGNvbW1lbnQgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcGNvZGUgbnMzMmtfb3Bjb2Rlc1tdPQotewotICB7ICJhYnNmIiwJMTQsMjQsCTB4MzViZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWJzbCIsCTE0LDI0LAkweDM0YmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFic2IiLAkxNCwyNCwJMHgzMDRlLCAiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhYnN3IiwJMTQsMjQsCTB4MzE0ZSwgIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWJzZCIsCTE0LDI0LAkweDMzNGUsICIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFjYmIiLAkgNywxNiwJMHg0YywJIjJJMXEzcCIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFjYnciLAkgNywxNiwJMHg0ZCwJIjJJMXEzcCIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFjYmQiLAkgNywxNiwJMHg0ZiwJIjJJMXEzcCIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGYiLAkxNCwyNCwJMHgwMWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRsIiwJMTQsMjQsCTB4MDBiZSwgIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkYiIsCSA2LDE2LAkweDAwLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGR3IiwJIDYsMTYsCTB4MDEsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGQiLAkgNiwxNiwJMHgwMywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkY2IiLAkgNiwxNiwJMHgxMCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkY3ciLAkgNiwxNiwJMHgxMSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkY2QiLAkgNiwxNiwJMHgxMywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcGIiLAkxNCwyNCwJMHgzYzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRwdyIsCTE0LDI0LAkweDNkNGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZHBkIiwJMTQsMjQsCTB4M2Y0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcWIiLAkgNywxNiwJMHgwYywJIjJJMXEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcXciLAkgNywxNiwJMHgwZCwJIjJJMXEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcWQiLAkgNywxNiwJMHgwZiwJIjJJMXEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkciIsCSA2LDE2LAkweDI3LAkiMUEySSIsCQk0LAkiIiwJMjEsMjEJfSwKLSAgeyAiYWRqc3BiIiwJMTEsMTYsCTB4MDU3YywJIjFCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkanNwdyIsCTExLDE2LAkweDA1N2QsCSIxVyIsIAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRqc3BkIiwJMTEsMTYsCTB4MDU3ZiwJIjFEIiwgCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhbmRiIiwJIDYsMTYsCTB4MjgsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFuZHciLAkgNiwxNiwJMHgyOSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYW5kZCIsCSA2LDE2LAkweDJiLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhc2hiIiwJMTQsMjQsCTB4MDQ0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYXNodyIsCTE0LDI0LAkweDA1NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFzaGQiLAkxNCwyNCwJMHgwNzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiZXEiLAkgOCw4LAkweDBhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJuZSIsCSA4LDgsCTB4MWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmNzIiwJIDgsOCwJMHgyYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiY2MiLAkgOCw4LAkweDNhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJoaSIsCSA4LDgsCTB4NGEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmxzIiwJIDgsOCwJMHg1YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiZ3QiLAkgOCw4LAkweDZhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJsZSIsCSA4LDgsCTB4N2EsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmZzIiwJIDgsOCwJMHg4YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiZmMiLAkgOCw4LAkweDlhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJsbyIsCSA4LDgsCTB4YWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmhzIiwJIDgsOCwJMHhiYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJibHQiLAkgOCw4LAkweGNhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJnZSIsCSA4LDgsCTB4ZGEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYnV0IiwJIDgsOCwJMHhlYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJidWYiLAkgOCw4LAkweGZhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJpY2IiLAkgNiwxNiwJMHgwOCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmljdyIsCSA2LDE2LAkweDA5LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaWNkIiwJIDYsMTYsCTB4MGIsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpY3BzcmIiLAkxMSwxNiwJMHgxN2MsCSIxQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaWNwc3J3IiwJMTEsMTYsCTB4MTdkLAkiMVciLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmlzcHNyYiIsCTExLDE2LAkweDM3YywJIjFCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpc3BzcnciLAkxMSwxNiwJMHgzN2QsCSIxVyIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJicHQiLAkgOCw4LAkweGYyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJyIiwJIDgsOCwJMHhlYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotICB7ICJic3IiLAkgOCw4LAkweDAyLAkiMUgiLAkJMCwJIiIsCTIxLDIxCX0sCi0jZWxzZQotICB7ICJic3IiLAkgOCw4LAkweDAyLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0jZW5kaWYKLSAgeyAiY2FzZWIiLAkxMSwxNiwJMHg3N2MsCSIxQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYXNldyIsCTExLDE2LAkweDc3ZCwJIjFXIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNhc2VkIiwJMTEsMTYsCTB4NzdmLAkiMUQiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGIiLAkxNCwyNCwJMHgwODRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYml0dyIsCTE0LDI0LAkweDA5NGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNiaXRkIiwJMTQsMjQsCTB4MGI0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGliIiwJMTQsMjQsCTB4MGM0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGl3IiwJMTQsMjQsCTB4MGQ0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGlkIiwJMTQsMjQsCTB4MGY0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2hlY2tiIiwJMTEsMjQsCTB4MGVlLAkiMkEzQjFyIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2hlY2t3IiwJMTEsMjQsCTB4MWVlLAkiMkEzVzFyIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2hlY2tkIiwJMTEsMjQsCTB4M2VlLAkiMkEzRDFyIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2ludiIsCTE0LDI0LAkweDI3MWUsCSIyRDFDIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcGYiLAkxNCwyNCwJMHgwOWJlLAkiMUYyRiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBsIiwJMTQsMjQsCTB4MDhiZSwJIjFMMkwiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wYiIsCSA2LDE2LAkweDA0LAkiMUIyQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXB3IiwJIDYsMTYsCTB4MDUsCSIxVzJXIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcGQiLAkgNiwxNiwJMHgwNywJIjFEMkQiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wbWIiLAkxNCwyNCwJMHgwNGNlLAkiMUEyQTNiIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wbXciLAkxNCwyNCwJMHgwNWNlLAkiMUEyQTNiIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wbWQiLAkxNCwyNCwJMHgwN2NlLAkiMUEyQTNiIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wcWIiLAkgNywxNiwJMHgxYywJIjJCMXEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wcXciLAkgNywxNiwJMHgxZCwJIjJXMXEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wcWQiLAkgNywxNiwJMHgxZiwJIjJEMXEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wc2IiLAkxNiwyNCwJMHgwNDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBzdyIsCTE2LDI0LAkweDA1MGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcHNkIiwJMTYsMjQsCTB4MDcwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wc3QiLAkxNiwyNCwJMHg4NDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjb21iIiwJMTQsMjQsCTB4MzQ0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY29tdyIsCTE0LDI0LAkweDM1NGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNvbWQiLAkxNCwyNCwJMHgzNzRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjdnRwIiwJMTEsMjQsCTB4MDM2ZSwJIjJBM0QxciIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImN4cCIsCSA4LDgsCTB4MjIsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiY3hwZCIsCTExLDE2LAkweDA3ZiwJIjFBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRlaWIiLAkxNCwyNCwJMHgyY2NlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkZWl3IiwJMTQsMjQsCTB4MmRjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGVpZCIsCTE0LDI0LAkweDJmY2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpYSIsCSA4LDgsCTB4YzIsCSIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGl2ZiIsCTE0LDI0LAkweDIxYmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpdmwiLAkxNCwyNCwJMHgyMGJlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkaXZiIiwJMTQsMjQsCTB4M2NjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGl2dyIsCTE0LDI0LAkweDNkY2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpdmQiLAkxNCwyNCwJMHgzZmNlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJlbnRlciIsCSA4LDgsCTB4ODIsCSIxVTJkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4aXQiLAkgOCw4LAkweDkyLAkiMXUiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0YiIsCTExLDI0LAkweDAyZSwJIjJJM0IxcjRkIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0dyIsCTExLDI0LAkweDEyZSwJIjJJM1cxcjRkIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0ZCIsCTExLDI0LAkweDMyZSwJIjJJM0QxcjRkIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0c2IiLAkxNCwyNCwJMHgwY2NlLAkiMUkySTRHM2ciLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleHRzdyIsCTE0LDI0LAkweDBkY2UsCSIxSTJJNEczZyIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4dHNkIiwJMTQsMjQsCTB4MGZjZSwJIjFJMkk0RzNnIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmZzYiIsCTE0LDI0LAkweDA0NmUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZmc3ciLAkxNCwyNCwJMHgwNTZlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmZnNkIiwJMTQsMjQsCTB4MDc2ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxhZyIsCSA4LDgsCTB4ZDIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JmYiIsCTE0LDI0LAkweDNjM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29yZnciLAkxNCwyNCwJMHgzZDNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmZkIiwJMTQsMjQsCTB4M2YzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JsYiIsCTE0LDI0LAkweDM4M2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29ybHciLAkxNCwyNCwJMHgzOTNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmxkIiwJMTQsMjQsCTB4M2IzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaWJpdGIiLAkxNCwyNCwJMHgzODRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpYml0dyIsCTE0LDI0LAkweDM5NGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImliaXRkIiwJMTQsMjQsCTB4M2I0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5kZXhiIiwJMTEsMjQsCTB4NDJlLAkiMkIzQjFyIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5kZXh3IiwJMTEsMjQsCTB4NTJlLAkiMlczVzFyIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5kZXhkIiwJMTEsMjQsCTB4NzJlLAkiMkQzRDFyIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zYiIsCTExLDI0LAkweDBhZSwJIjJCM0kxcjRkIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zdyIsCTExLDI0LAkweDFhZSwJIjJXM0kxcjRkIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zZCIsCTExLDI0LAkweDNhZSwJIjJEM0kxcjRkIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zc2IiLAkxNCwyNCwJMHgwOGNlLAkiMUIySTRHM2ciLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbnNzdyIsCTE0LDI0LAkweDA5Y2UsCSIxVzJJNEczZyIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImluc3NkIiwJMTQsMjQsCTB4MGJjZSwJIjFEMkk0RzNnIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAianNyIiwJMTEsMTYsCTB4NjdmLAkiMUEiLAkJNCwJIiIsCTIxLDIxCX0sCi0gIHsgImp1bXAiLAkxMSwxNiwJMHgyN2YsCSIxQSIsCQk0LAkiIiwJMjEsMjEJfSwKLSAgeyAibGZzciIsCTE5LDI0LAkweDAwZjNlLCIxRCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsbXIiLAkxNSwyNCwJMHgwYjFlLAkiMkQxTSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJscHJiIiwJIDcsMTYsCTB4NmMsCSIyQjFQIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxwcnciLAkgNywxNiwJMHg2ZCwJIjJXMVAiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHByZCIsCSA3LDE2LAkweDZmLAkiMkQxUCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsc2hiIiwJMTQsMjQsCTB4MTQ0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHNodyIsCTE0LDI0LAkweDE1NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxzaGQiLAkxNCwyNCwJMHgxNzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtZWliIiwJMTQsMjQsCTB4MjRjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibWVpdyIsCTE0LDI0LAkweDI1Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1laWQiLAkxNCwyNCwJMHgyN2NlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb2RiIiwJMTQsMjQsCTB4MzhjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW9kdyIsCTE0LDI0LAkweDM5Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vZGQiLAkxNCwyNCwJMHgzYmNlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZmIiwJMTQsMjQsCTB4MDViZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92bCIsCTE0LDI0LAkweDA0YmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmIiLAkgNiwxNiwJMHgxNCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92dyIsCSA2LDE2LAkweDE1LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZkIiwJIDYsMTYsCTB4MTcsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmJmIiwJMTQsMjQsCTB4MDQzZSwJIjFCMloiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92d2YiLAkxNCwyNCwJMHgwNTNlLAkiMVcyWiIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZkZiIsCTE0LDI0LAkweDA3M2UsCSIxRDJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmJsIiwJMTQsMjQsCTB4MDAzZSwJIjFCMloiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92d2wiLAkxNCwyNCwJMHgwMTNlLAkiMVcyWiIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZkbCIsCTE0LDI0LAkweDAzM2UsCSIxRDJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmZsIiwJMTQsMjQsCTB4MWIzZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92bGYiLAkxNCwyNCwJMHgxNjNlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZtYiIsCTE0LDI0LAkweDAwY2UsCSIxQTJBM2IiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZtdyIsCTE0LDI0LAkweDAxY2UsCSIxQTJBM2IiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZtZCIsCTE0LDI0LAkweDAzY2UsCSIxQTJBM2IiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZxYiIsCSA3LDE2LAkweDVjLAkiMkkxcSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZxdyIsCSA3LDE2LAkweDVkLAkiMkkxcSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZxZCIsCSA3LDE2LAkweDVmLAkiMkkxcSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzYiIsCTE2LDI0LAkweDAwMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN3IiwJMTYsMjQsCTB4MDEwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c2QiLAkxNiwyNCwJMHgwMzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzdCIsCTE2LDI0LAkweDgwMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN1YiIsCTE0LDI0LAkweDBjYWUsCSIxQTJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN1dyIsCTE0LDI0LAkweDBkYWUsCSIxQTJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN1ZCIsCTE0LDI0LAkweDBmYWUsCSIxQTJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnVzYiIsCTE0LDI0LAkweDFjYWUsCSIxQTJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnVzdyIsCTE0LDI0LAkweDFkYWUsCSIxQTJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnVzZCIsCTE0LDI0LAkweDFmYWUsCSIxQTJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnhiZCIsCTE0LDI0LAkweDFjY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnh3ZCIsCTE0LDI0LAkweDFkY2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnhidyIsCTE0LDI0LAkweDEwY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnpiZCIsCTE0LDI0LAkweDE4Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnp3ZCIsCTE0LDI0LAkweDE5Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnpidyIsCTE0LDI0LAkweDE0Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm11bGYiLAkxNCwyNCwJMHgzMWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtdWxsIiwJMTQsMjQsCTB4MzBiZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibXVsYiIsCTE0LDI0LAkweDIwY2UsICIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm11bHciLAkxNCwyNCwJMHgyMWNlLCAiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtdWxkIiwJMTQsMjQsCTB4MjNjZSwgIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibmVnZiIsCTE0LDI0LAkweDE1YmUsICIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5lZ2wiLAkxNCwyNCwJMHgxNGJlLCAiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJuZWdiIiwJMTQsMjQsCTB4MjA0ZSwgIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibmVndyIsCTE0LDI0LAkweDIxNGUsICIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5lZ2QiLAkxNCwyNCwJMHgyMzRlLCAiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJub3AiLAkgOCw4LAkweGEyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5vdGIiLAkxNCwyNCwJMHgyNDRlLCAiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJub3R3IiwJMTQsMjQsCTB4MjU0ZSwgIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibm90ZCIsCTE0LDI0LAkweDI3NGUsICIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm9yYiIsCSA2LDE2LAkweDE4LAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJvcnciLAkgNiwxNiwJMHgxOSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAib3JkIiwJIDYsMTYsCTB4MWIsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInF1b2IiLAkxNCwyNCwJMHgzMGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJxdW93IiwJMTQsMjQsCTB4MzFjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicXVvZCIsCTE0LDI0LAkweDMzY2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJkdmFsIiwJMTksMjQsCTB4MDAzMWUsIjFBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJlbWIiLAkxNCwyNCwJMHgzNGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyZW13IiwJMTQsMjQsCTB4MzVjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmVtZCIsCTE0LDI0LAkweDM3Y2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJlc3RvcmUiLAkgOCw4LAkweDcyLAkiMXUiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmV0IiwJIDgsOCwJMHgxMiwJIjFkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJldGkiLAkgOCw4LAkweDUyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJldHQiLAkgOCw4LAkweDQyLAkiMWQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm90YiIsCTE0LDI0LAkweDAwNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdHciLAkxNCwyNCwJMHgwMTRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3RkIiwJMTQsMjQsCTB4MDM0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRmYiIsCTE0LDI0LAkweDI0M2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kZnciLAkxNCwyNCwJMHgyNTNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGZkIiwJMTQsMjQsCTB4MjczZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRsYiIsCTE0LDI0LAkweDIwM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kbHciLAkxNCwyNCwJMHgyMTNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGxkIiwJMTQsMjQsCTB4MjMzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicnhwIiwJIDgsOCwJMHgzMiwJIjFkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNlcWIiLAkxMSwxNiwJMHgzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNlcXciLAkxMSwxNiwJMHgzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNlcWQiLAkxMSwxNiwJMHgzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNuZWIiLAkxMSwxNiwJMHhiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNuZXciLAkxMSwxNiwJMHhiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNuZWQiLAkxMSwxNiwJMHhiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjc2IiLAkxMSwxNiwJMHgxM2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY3N3IiwJMTEsMTYsCTB4MTNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NzZCIsCTExLDE2LAkweDEzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjY2IiLAkxMSwxNiwJMHgxYmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY2N3IiwJMTEsMTYsCTB4MWJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NjZCIsCTExLDE2LAkweDFiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoaWIiLAkxMSwxNiwJMHgyM2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaGl3IiwJMTEsMTYsCTB4MjNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hpZCIsCTExLDE2LAkweDIzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsc2IiLAkxMSwxNiwJMHgyYmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHN3IiwJMTEsMTYsCTB4MmJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xzZCIsCTExLDE2LAkweDJiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNndGIiLAkxMSwxNiwJMHgzM2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ3R3IiwJMTEsMTYsCTB4MzNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2d0ZCIsCTExLDE2LAkweDMzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsZWIiLAkxMSwxNiwJMHgzYmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbGV3IiwJMTEsMTYsCTB4M2JkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xlZCIsCTExLDE2LAkweDNiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmc2IiLAkxMSwxNiwJMHg0M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZnN3IiwJMTEsMTYsCTB4NDNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZzZCIsCTExLDE2LAkweDQzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmY2IiLAkxMSwxNiwJMHg0YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZmN3IiwJMTEsMTYsCTB4NGJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZjZCIsCTExLDE2LAkweDRiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsb2IiLAkxMSwxNiwJMHg1M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbG93IiwJMTEsMTYsCTB4NTNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xvZCIsCTExLDE2LAkweDUzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoc2IiLAkxMSwxNiwJMHg1YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaHN3IiwJMTEsMTYsCTB4NWJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hzZCIsCTExLDE2LAkweDViZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsdGIiLAkxMSwxNiwJMHg2M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHR3IiwJMTEsMTYsCTB4NjNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2x0ZCIsCTExLDE2LAkweDYzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNnZWIiLAkxMSwxNiwJMHg2YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ2V3IiwJMTEsMTYsCTB4NmJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2dlZCIsCTExLDE2LAkweDZiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1dGIiLAkxMSwxNiwJMHg3M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdXR3IiwJMTEsMTYsCTB4NzNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3V0ZCIsCTExLDE2LAkweDczZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1ZmIiLAkxMSwxNiwJMHg3YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWZ3IiwJMTEsMTYsCTB4N2JkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VmZCIsCTExLDE2LAkweDdiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNhdmUiLAkgOCw4LAkweDYyLAkiMVUiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGIiLCAgICAxNCwyNCwJMHgxODRlLAkiMUIyQSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYml0dyIsCTE0LDI0LAkweDE5NGUsCSIxVzJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNiaXRkIiwJMTQsMjQsCTB4MWI0ZSwJIjFEMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGliIiwJMTQsMjQsCTB4MWM0ZSwJIjFCMkEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGl3IiwJMTQsMjQsCTB4MWQ0ZSwJIjFXMkEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGlkIiwJMTQsMjQsCTB4MWY0ZSwJIjFEMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2V0Y2ZnIiwJMTUsMjQsCTB4MGIwZSwJIjFPIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmc3IiLAkxNCwyNCwJMHgzNzNlLAkiMWYiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2twc2IiLAkxNiwyNCwJMHgwYzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJza3BzdyIsCTE2LDI0LAkweDBkMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNrcHNkIiwJMTYsMjQsCTB4MGYwZSwgIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2twc3QiLAkxNiwyNCwJMHg4YzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbXIiLAkxNSwyNCwJMHgwZjFlLAkiMkkxTSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzcHJiIiwJIDcsMTYsCTB4MmMsCSIySTFQIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNwcnciLAkgNywxNiwJMHgyZCwJIjJJMVAiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ByZCIsCSA3LDE2LAkweDJmLAkiMkkxUCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJmIiwJMTQsMjQsCTB4MTFiZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VibCIsCTE0LDI0LAkweDEwYmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmIiLAkgNiwxNiwJMHgyMCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VidyIsCSA2LDE2LAkweDIxLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJkIiwJIDYsMTYsCTB4MjMsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmNiIiwJIDYsMTYsCTB4MzAsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmN3IiwJIDYsMTYsCTB4MzEsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmNkIiwJIDYsMTYsCTB4MzMsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YnBiIiwJMTQsMjQsCTB4MmM0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VicHciLAkxNCwyNCwJMHgyZDRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJwZCIsCTE0LDI0LAkweDJmNGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0jaWZkZWYgTlMzMktfU1ZDX0lNTUVEX09QRVJBTkRTCi0gIHsgInN2YyIsCSA4LDgsCTB4ZTIsCSIyaTFpIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sIC8qIG5vdCByZWFsbHksIGJ1dCBzb21lIHVuaXggdXNlcyBpdCAqLwotI2Vsc2UKLSAgeyAic3ZjIiwJIDgsOCwJMHhlMiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotI2VuZGlmCi0gIHsgInRiaXRiIiwJIDYsMTYsCTB4MzQsCSIxQjJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRiaXR3IiwJIDYsMTYsCTB4MzUsCSIxVzJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRiaXRkIiwJIDYsMTYsCTB4MzcsCSIxRDJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jZmIiLAkxNCwyNCwJMHgyYzNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2Z3IiwJMTQsMjQsCTB4MmQzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNmZCIsCTE0LDI0LAkweDJmM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jbGIiLAkxNCwyNCwJMHgyODNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2x3IiwJMTQsMjQsCTB4MjkzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNsZCIsCTE0LDI0LAkweDJiM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIndhaXQiLAkgOCw4LAkweGIyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIndydmFsIiwJMTksMjQsCTB4MDA3MWUsIjFBIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInhvcmIiLAkgNiwxNiwJMHgzOCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAieG9ydyIsCSA2LDE2LAkweDM5LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ4b3JkIiwJIDYsMTYsCTB4M2IsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRvdGYiLAkxNCwyNCwgIDB4MGRmZSwgIjFGMkYiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZG90bCIsCTE0LDI0LCAgMHgwY2ZlLCAiMUwyTCIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsb2diZiIsCTE0LDI0LCAgMHgxNWZlLCAiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsb2dibCIsCTE0LDI0LCAgMHgxNGZlLCAiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJwb2x5ZiIsCTE0LDI0LCAgMHgwOWZlLCAiMUYyRiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJwb2x5bCIsCTE0LDI0LCAgMHgwOGZlLCAiMUwyTCIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY2FsYmYiLAkxNCwyNCwgIDB4MTFmZSwgIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NhbGJsIiwJMTQsMjQsICAweDEwZmUsICIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50IG51bW9wY29kZXM9c2l6ZW9mKG5zMzJrX29wY29kZXMpL3NpemVvZihuczMya19vcGNvZGVzWzBdKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcGNvZGUgKmNvbnN0IGVuZG9wID0gbnMzMmtfb3Bjb2RlcytzaXplb2YobnMzMmtfb3Bjb2Rlcykvc2l6ZW9mKG5zMzJrX29wY29kZXNbMF0pOwotCi0jZGVmaW5lIE1BWF9BUkdTIDQKLSNkZWZpbmUgQVJHX0xFTiA1MAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9wai5oIGIvaW5jbHVkZS9vcGNvZGUvcGouaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1OWI2Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9wai5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIGRlY29kaW5nIHRoZSBwaWNvSmF2YSBvcGNvZGUgdGFibGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBUcmFuc21ldGEgKHNhY0Bwb2JveC5jb20pLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIE5hbWVzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHR5cGUgb2YgaW5zdHJ1Y3Rpb24gYXJndW1lbnRzLCB1c2VkIGJ5Ci0gICB0aGUgYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIuICBBdHRyaWJ1dGVzIGFyZSBlbmNvZGVkIGluIHZhcmlvdXMgZmllbGRzLiAqLwotCi0vKiAgICAgICAgICAgIHJlbG9jICBzaXplIHBjcmVsICAgIHVucyAqLwotI2RlZmluZSBPX04gICAgMAotI2RlZmluZSBPXzE2ICAoMTw8NCB8IDIgfCAoMDw8NikgfCAoMDw8MykpCi0jZGVmaW5lIE9fVTE2ICgxPDw0IHwgMiB8ICgwPDw2KSB8ICgxPDwzKSkKLSNkZWZpbmUgT19SMTYgKDI8PDQgfCAyIHwgKDE8PDYpIHwgKDA8PDMpKQotI2RlZmluZSBPXzggICAoMzw8NCB8IDEgfCAoMDw8NikgfCAoMDw8MykpCi0jZGVmaW5lIE9fVTggICgzPDw0IHwgMSB8ICgwPDw2KSB8ICgxPDwzKSkKLSNkZWZpbmUgT19SOCAgKDQ8PDQgfCAxIHwgKDA8PDYpIHwgKDA8PDMpKQotI2RlZmluZSBPX1IzMiAoNTw8NCB8IDQgfCAoMTw8NikgfCAoMDw8MykpCi0jZGVmaW5lIE9fMzIgICg2PDw0IHwgNCB8ICgwPDw2KSB8ICgwPDwzKSkKLQotI2RlZmluZSBBU0laRSh4KSAgKCh4KSAmIDB4NykKLSNkZWZpbmUgUENSRUwoeCkgICghISgoeCkgJiAoMTw8NikpKQotI2RlZmluZSBVTlMoeCkgICAgKCEhKCh4KSAmICgxPDwzKSkpCi0KLSAgICAgICAgICAgICAgICAgIAotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIHNob3J0IG9wY29kZTsKLSAgc2hvcnQgb3Bjb2RlX25leHQ7Ci0gIGNoYXIgbGVuOwotICB1bnNpZ25lZCBjaGFyIGFyZ1syXTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX0gcGpfb3BjX2luZm9fdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3BuLmggYi9pbmNsdWRlL29wY29kZS9wbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjU5YTJhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3BuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyogUHJpbnQgR09VTEQgUE4gKFBvd2VyTm9kZSkgaW5zdHJ1Y3Rpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1zdHJ1Y3QgZ2xkX29wY29kZQotewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICBjaGFyICphcmdzOwotICBpbnQgbGVuZ3RoOwotfTsKLQotLyogV2Ugc3RvcmUgZm91ciBieXRlcyBvZiBvcGNvZGUgZm9yIGFsbCBvcGNvZGVzIGJlY2F1c2UgdGhhdAotICAgaXMgdGhlIG1vc3QgYW55IG9mIHRoZW0gbmVlZC4gIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uCi0gICBpcyBhbHdheXMgYXQgbGVhc3QgMiBieXRlcywgYW5kIGF0IG1vc3QgZm91ci4gIFRoZSBsZW5ndGggb2YgdGhlCi0gICBpbnN0cnVjdGlvbiBpcyBiYXNlZCBvbiB0aGUgb3Bjb2RlLgotCi0gICBUaGUgbWFzayBjb21wb25lbnQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2gKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZQotICAgb2YgdGhhdCBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGNvbXBvbmVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMKLSAgIHRoYXQgYXJlIHVzZWQgdG8gZm9ybWF0IHRoZSBhcmd1bWVudHMgdG8gdGhlIGluc3RydWN0aW9uLiAqLwotCi0vKiBLaW5kcyBvZiBvcGVyYW5kczoKLSAgIHIgIFJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBSICBSZWdpc3RlciBpbiBzZWNvbmQgZmllbGQKLSAgIGIgIEJhc2UgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIEIgIEJhc2UgcmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCi0gICB2ICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIFYgIFZlY3RvciByZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgQSAgT3B0aW9uYWwgYWRkcmVzcyByZWdpc3RlciAoYmFzZSByZWdpc3RlcikKLSAgIFggIE9wdGlvbmFsIGluZGV4IHJlZ2lzdGVyCi0gICBJICBJbW1lZGlhdGUgZGF0YSAoMTZiaXRzIHNpZ25lZCkKLSAgIE8gIE9mZnNldCBmaWVsZCAoMTZiaXRzIHNpZ25lZCkKLSAgIGggIE9mZnNldCBmaWVsZCAoMTViaXRzIHNpZ25lZCkKLSAgIGQgIE9mZnNldCBmaWVsZCAoMTRiaXRzIHNpZ25lZCkKLSAgIFMgIFNoaWZ0IGNvdW50IGZpZWxkCi0KLSAgIGFueSBvdGhlciBjaGFyYWN0ZXJzIGFyZSBwcmludGVkIGFzIGlzLi4uCi0qLwotCi0vKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgdGhpcyBhcnJheSBiZSBzb3J0ZWQgYXMgZm9sbG93czoKLSAgIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZSBjb25zZWN1dGl2ZS4KLSAgIEFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb3BlcmFuZHMKLSAgIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gKi8KLXN0cnVjdCBnbGRfb3Bjb2RlIGdsZF9vcGNvZGVzW10gPQotewoteyAiYWJtIiwJMHhhMDA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJhYnIiLAkweDE4MDgwMDAwLAkweGZjMGMwMDAwLAkicixmIiwJCTIgfSwKLXsgImFjaSIsCTB4ZmM3NzAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAiYWRmZCIsCTB4ZTAwODAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRmdyIsCTB4ZTAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRpIiwJMHhjODAxMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJhZG1iIiwJMHhiODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZG1kIiwJMHhiODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZG1oIiwJMHhiODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhZG13IiwJMHhiODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZHIiLAkweDM4MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFkcmZkIiwJMHgzODA5MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhZHJmdyIsCTB4MzgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWRybSIsCTB4MzgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWkiLCAJMHhmYzAzMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoteyAiYW5tYiIsCTB4ODQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5tZCIsCTB4ODQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5taCIsCTB4ODQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5tdyIsCTB4ODQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYW5yIiwJMHgwNDAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhcm1iIiwJMHhlODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1kIiwJMHhlODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1oIiwJMHhlODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhcm13IiwJMHhlODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiY2YiLAkweGYwMDAwMDAwLAkweGZjMDgwMDAwLAkiSSx4T0EsWCIsCTQgfSwKLXsgImJjdCIsCTB4ZWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJJLHhPQSxYIiwJNCB9LAoteyAiYmVpIiwJMHgwMDA2MDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJiZnQiLAkweGYwMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiaWIiLAkweGY0MDAwMDAwLAkweGZjNzgwMDAwLAkicix4T0EiLAk0IH0sCi17ICJiaWQiLAkweGY0NjAwMDAwLAkweGZjNzgwMDAwLAkicix4T0EiLAk0IH0sCi17ICJiaWgiLAkweGY0MjAwMDAwLAkweGZjNzgwMDAwLAkicix4T0EiLAk0IH0sCi17ICJiaXciLAkweGY0NDAwMDAwLAkweGZjNzgwMDAwLAkicix4T0EiLAk0IH0sCi17ICJibCIsIAkweGY4ODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJic3ViIiwJMHg1YzA4MDAwMCwJMHhmZjhmMDAwMCwJIiIsCQkyIH0sCi17ICJic3VibSIsCTB4MjgwODAwMDAsCTB4ZmMwODAwMDAsCSIiLAkJNCB9LAoteyAiYnUiLCAJMHhlYzAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiY2FsbCIsCTB4MjgwODAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiY2FsbG0iLAkweDVjMDgwMDAwLAkweGZmODgwMDAwLAkiIiwJCTQgfSwKLXsgImNhbWIiLAkweDkwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbWQiLAkweDkwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbWgiLAkweDkwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImNhbXciLAkweDkwMDAwMDAwLAkweGZjMDgwMDAwLAkici54T0EsWCIsCTQgfSwKLXsgImNhciIsCTB4MTAwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiY2QiLCAJMHhmYzA2MDAwMCwJMHhmYzA3MDAwMCwJInIsZiIsCQk0IH0sCi17ICJjZWEiLAkweDAwMGYwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgImNpIiwgCTB4YzgwNTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiY21jIiwJMHgwNDBhMDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAiY21tYiIsCTB4OTQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiY21tZCIsCTB4OTQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiY21taCIsCTB4OTQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiY21tdyIsCTB4OTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiY21yIiwJMHgxNDAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJkYWNpIiwJMHhmYzdmMDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJkYWUiLAkweDAwMGUwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgImRhaSIsCTB4ZmMwNDAwMDAsCTB4ZmMwN2ZmZmYsCSJJIiwJCTQgfSwKLXsgImRjaSIsCTB4ZmM2ZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAiZGkiLCAJMHhmYzAxMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoteyAiZHZmZCIsCTB4ZTQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZmdyIsCTB4ZTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZpIiwJMHhjODA0MDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJkdm1iIiwJMHhjNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJkdm1oIiwJMHhjNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJkdm13IiwJMHhjNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJkdnIiLAkweDM4MGEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImR2cmZkIiwJMHgzODBjMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQk0IH0sCi17ICJkdnJmdyIsCTB4MzgwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZWFlIiwJMHgwMDA4MDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJlY2kiLAkweGZjNjcwMDAwLAkweGZjN2Y4MDgwLAkicixJIiwJCTQgfSwKLXsgImVjd2NzIiwJMHhmYzRmMDAwMCwJMHhmYzdmODAwMCwJIiIsCQk0IH0sCi17ICJlaSIsIAkweGZjMDAwMDAwLAkweGZjMDdmZmZmLAkiSSIsCQk0IH0sCi17ICJlb21iIiwJMHg4YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJlb21kIiwJMHg4YzAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJlb21oIiwJMHg4YzAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJlb213IiwJMHg4YzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJlb3IiLAkweDBjMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImVvcm0iLAkweDBjMDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImVzIiwgCTB4MDAwNDAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImV4bSIsCTB4YTgwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImV4ciIsCTB4YzgwNzAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImV4cnIiLAkweGM4MDcwMDAyLAkweGZjN2YwMDAyLAkiciIsCQkyIH0sCi17ICJmaXhkIiwJMHgzODBkMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJmaXh3IiwJMHgzODA1MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJmbHRkIiwJMHgzODBmMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJmbHR3IiwJMHgzODA3MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJncmlvIiwJMHhmYzNmMDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJoYWx0IiwJMHgwMDAwMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJoaW8iLAkweGZjMzcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgImp3Y3MiLAkweGZhMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJsYSIsIAkweDUwMDAwMDAwLAkweGZjMDAwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxhYnIiLAkweDU4MDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxiIiwgCTB4YWMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGNzIiwgCTB4MDAwMzAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImxkIiwgCTB4YWMwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibGVhciIsIAkweDgwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxmIiwgCTB4Y2MwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGZiciIsIAkweGNjMDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxoIiwgCTB4YWMwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibGkiLCAJMHhjODAwMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJsbWFwIiwJMHgyYzA3MDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAibG1iIiwJMHhiMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsbWQiLAkweGIwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxtaCIsCTB4YjAwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibG13IiwJMHhiMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsbmIiLAkweGI0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxuZCIsCTB4YjQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5oIiwJMHhiNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsbnciLAkweGI0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxwc2QiLAkweGY5ODAwMDAwLAkweGZmODgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxwc2RjbSIsCTB4ZmE4MDAwMDAsCTB4ZmY4ODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibHciLCAJMHhhYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsd2JyIiwgCTB4NWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAibXBmZCIsCTB4ZTQwODAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBmdyIsCTB4ZTQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBpIiwJMHhjODAzMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJtcG1iIiwJMHhjMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcG1oIiwJMHhjMDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJtcG13IiwJMHhjMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcHIiLAkweDM4MDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1wcmZkIiwJMHgzODBlMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcHJmdyIsCTB4MzgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibm9wIiwJMHgwMDAyMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJvcm1iIiwJMHg4ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJvcm1kIiwJMHg4ODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJvcm1oIiwJMHg4ODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJvcm13IiwJMHg4ODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJvcnIiLAkweDA4MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm9ycm0iLAkweDA4MDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInJkc3RzIiwJMHgwMDA5MDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAicmV0dXJuIiwJMHgyODBlMDAwMCwJMHhmYzdmMDAwMCwJIiIsCQkyIH0sCi17ICJyaSIsIAkweGZjMDIwMDAwLAkweGZjMDdmZmZmLAkiSSIsCQk0IH0sCi17ICJybmQiLAkweDAwMDUwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJycHN3dCIsCTB4MDQwYjAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJzY2hubCIsCTB4ZmMyZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAicnNjdGwiLAkweGZjNDcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgInJ3Y3MiLAkweDAwMGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNhY3oiLAkweDEwMDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNibSIsCTB4OTgwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAic2JyIiwJMHgxODAwMDAwMCwJMHhmYzBjMDAwMCwJInIsZiIsCQk0IH0sCi17ICJzZWEiLAkweDAwMGQwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgInNldGNwdSIsCTB4MmMwOTAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInNpbyIsCTB4ZmMxNzAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAic2lwdSIsCTB4MDAwYTAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAic2xhIiwJMHgxYzQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGFkIiwJMHgyMDQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGMiLAkweDI0NDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsbCIsCTB4MWM2MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xsZCIsCTB4MjA2MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic21jIiwJMHgwNDA3MDAwMCwJMHhmYzA3MDAwMCwJIiIsCQkyIH0sCi17ICJzcmEiLAkweDFjMDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNyYWQiLAkweDIwMDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNyYyIsCTB4MjQwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JsIiwJMHgxYzIwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmxkIiwJMHgyMDIwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzdGIiLAkweGQ0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZCIsCTB4ZDQwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RmIiwJMHhkYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGZiciIsCTB4NTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAic3RoIiwJMHhkNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJzdG1iIiwJMHhkODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdG1kIiwJMHhkODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdG1oIiwJMHhkODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJzdG13IiwJMHhkODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdHBpbyIsCTB4ZmMyNzAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAic3R3IiwJMHhkNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdHdiciIsCTB4NTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAic3VhYnIiLAkweDU4MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgInN1ZmQiLAkweGUwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN1ZnciLAkweGUwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1aSIsCTB4YzgwMjAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAic3VtYiIsCTB4YmMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtZCIsCTB4YmMwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtaCIsCTB4YmMwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VtdyIsCTB4YmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VyIiwJMHgzYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdXJmZCIsCTB4MzgwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VyZnciLAkweDM4MDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN1cm0iLAkweDNjMDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN2YyIsCTB4YzgwNjAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJNCB9LAoteyAidGJtIiwJMHhhNDA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ0YnIiLAkweDE4MGMwMDAwLAkweGZjMGMwMDAwLAkicixmIiwJCTIgfSwKLXsgInRicnIiLAkweDJjMDIwMDAwLAkweGZjMGYwMDAwLAkicixCIiwJCTIgfSwKLXsgInRjY3IiLAkweDI4MDQwMDAwLAkweGZjN2YwMDAwLAkiIiwJCTIgfSwKLXsgInRkIiwgCTB4ZmMwNTAwMDAsCTB4ZmMwNzAwMDAsCSJyLGYiLAkJNCB9LAoteyAidGlvIiwJMHhmYzFmMDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJ0bWFwciIsCTB4MmMwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHBjYnIiLAkweDI4MGMwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJ0cmJyIiwJMHgyYzAxMDAwMCwJMHhmYzBmMDAwMCwJImIsUiIsCQkyIH0sCi17ICJ0cmMiLAkweDJjMDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyY2MiLAkweDI4MDUwMDAwLAkweGZjN2YwMDAwLAkiIiwJCTIgfSwKLXsgInRyY20iLAkweDJjMGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRybiIsCTB4MmMwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJubSIsCTB4MmMwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJyIiwJMHgyYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnJtIiwJMHgyYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnNjIiwJMHgyYzBlMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnN3IiwJMHgyODAwMDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAidHNjciIsCTB4MmMwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWVpIiwJMHgwMDA3MDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJ3YWl0IiwJMHgwMDAxMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJ3Y3djcyIsCTB4ZmM1ZjAwMDAsCTB4ZmM3ZjgwMDAsCSIiLAkJNCB9LAoteyAid3djcyIsCTB4MDAwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNiciIsCTB4MjgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJiLEIiLAkJMiB9LAoteyAieGNyIiwJMHgyYzA1MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ4Y3JtIiwJMHgyYzBkMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ6Ym0iLAkweDljMDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInpiciIsCTB4MTgwNDAwMDAsCTB4ZmMwYzAwMDAsCSJyLGYiLAkJMiB9LAoteyAiem1iIiwJMHhmODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6bWQiLAkweGY4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInptaCIsCTB4ZjgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiem13IiwJMHhmODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6ciIsIAkweDBjMDAwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi19OwotCi1pbnQgbnVtb3Bjb2RlcyA9IHNpemVvZihnbGRfb3Bjb2RlcykgLyBzaXplb2YoZ2xkX29wY29kZXNbMF0pOwotCi1zdHJ1Y3QgZ2xkX29wY29kZSAqZW5kb3AgPSBnbGRfb3Bjb2RlcyArIHNpemVvZihnbGRfb3Bjb2RlcykgLwotCQlzaXplb2YoZ2xkX29wY29kZXNbMF0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvcHBjLmggYi9pbmNsdWRlL29wY29kZS9wcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0ZjBkZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9wcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKiBwcGMuaCAtLSBIZWFkZXIgZmlsZSBmb3IgUG93ZXJQQyBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFBQQ19ICi0jZGVmaW5lIFBQQ19ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHBvd2VycGNfb3Bjb2RlLiAgKi8KLQotc3RydWN0IHBvd2VycGNfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLSAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhCi0gICAgIG1hc2sgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZQotICAgICBvcGNvZGUgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90Ci0gICAgIG1hdGNoIChhbmQgYXJlIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLQotICAvKiBPbmUgYml0IGZsYWdzIGZvciB0aGUgb3Bjb2RlLiAgVGhlc2UgYXJlIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2gKLSAgICAgc3BlY2lmaWMgcHJvY2Vzc29ycyBzdXBwb3J0IHRoZSBpbnN0cnVjdGlvbnMuICBUaGUgZGVmaW5lZCB2YWx1ZXMKLSAgICAgYXJlIGxpc3RlZCBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s4XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgcG93ZXJwY19vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IHBvd2VycGNfbnVtX29wY29kZXM7Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUuICAqLwotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIFBvd2VyUEMgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV9QUEMgKDAxKQotCi0vKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIFBPV0VSIChSUy82MDAwKSBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBQUENfT1BDT0RFX1BPV0VSICgwMikKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBQT1dFUjIgKFJpb3MgMikgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV9QT1dFUjIgKDA0KQotCi0vKiBPcGNvZGUgaXMgb25seSBkZWZpbmVkIG9uIDMyIGJpdCBhcmNoaXRlY3R1cmVzLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV8zMiAoMDEwKQotCi0vKiBPcGNvZGUgaXMgb25seSBkZWZpbmVkIG9uIDY0IGJpdCBhcmNoaXRlY3R1cmVzLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV82NCAoMDIwKQotCi0vKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBNb3Rvcm9sYSBQb3dlclBDIDYwMSBwcm9jZXNzb3IuICBUaGUgNjAxCi0gICBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgYWxsIFBvd2VyUEMgKFBQQ19PUENPREVfUFBDKSBpbnN0cnVjdGlvbnMsCi0gICBidXQgaXQgYWxzbyBzdXBwb3J0cyBtYW55IGFkZGl0aW9uYWwgUE9XRVIgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV82MDEgKDA0MCkKLQotLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBpbiBib3RoIHRoZSBQb3dlciBhbmQgUG93ZXJQQyBhcmNoaXRlY3R1cmVzCi0gICAoaWUsIGNvbXBpbGVyJ3MgLW1jcHU9Y29tbW9uIG9yIGFzc2VtYmxlcidzIC1tY29tKS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfQ09NTU9OICgwMTAwKQotCi0vKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGZvciBhbnkgUG93ZXIgb3IgUG93ZXJQQyBwbGF0Zm9ybSAodGhpcyBpcwotICAgZm9yIHRoZSBhc3NlbWJsZXIncyAtbWFueSBvcHRpb24sIGFuZCBpdCBlbGltaW5hdGVzIGR1cGxpY2F0ZXMpLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV9BTlkgKDAyMDApCi0KLS8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgYXMgcGFydCBvZiB0aGUgNjQtYml0IGJyaWRnZS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfNjRfQlJJREdFICgwNDAwKQotCi0vKiBBIG1hY3JvIHRvIGV4dHJhY3QgdGhlIG1ham9yIG9wY29kZSBmcm9tIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUFBDX09QKGkpICgoKGkpID4+IDI2KSAmIDB4M2YpCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHBvd2VycGNfb3BlcmFuZC4gICovCi0KLXN0cnVjdCBwb3dlcnBjX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0gIHVuc2lnbmVkIGxvbmcgKCppbnNlcnQpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGxvbmcgb3AsCi0JCQkJICAgY29uc3QgY2hhciAqKmVycm1zZykpOwotCi0gIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCi0gICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCi0gICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmICgoby0+ZmxhZ3MgJiBQUENfT1BFUkFORF9TSUdORUQpICE9IDAKLQkgICAgICYmIChvcCAmICgxIDw8IChvLT5iaXRzIC0gMSkpKSAhPSAwKQotCSAgIG9wIC09IDEgPDwgby0+Yml0czsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uLCBvIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wCi0gICAgIGlzIHRoZSByZXN1bHQ7IHRoaXMgYXNzdW1lcyB0d29zIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZC4gIElmCi0gICAgIHRoZSBJTlZBTElEIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqSU5WQUxJRCB3aWxsIGJlIHNldCB0bwotICAgICBub24temVybyBpZiB0aGlzIG9wZXJhbmQgdHlwZSBjYW4gbm90IGFjdHVhbGx5IGJlIGV4dHJhY3RlZCBmcm9tCi0gICAgIHRoaXMgb3BlcmFuZCAoaS5lLiwgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoKS4gIElmIHRoZQotICAgICBvcGVyYW5kIGlzIHZhbGlkLCAqSU5WQUxJRCB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAgKi8KLSAgbG9uZyAoKmV4dHJhY3QpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGludCAqaW52YWxpZCkpOwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgcG93ZXJwY19vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgcG93ZXJwY19vcGVyYW5kc1tdOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHBvd2VycGNfb3BlcmFuZC4gICovCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfU0lHTkVEICgwMSkKLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMsIGJ1dCBhbHNvIGFjY2VwdHMgYSBmdWxsIHBvc2l0aXZlCi0gICByYW5nZSBvZiB2YWx1ZXMgd2hlbiBydW5uaW5nIGluIDMyIGJpdCBtb2RlLiAgVGhhdCBpcywgaWYgYml0cyBpcwotICAgMTYsIGl0IHRha2VzIGFueSB2YWx1ZSBmcm9tIC0weDgwMDAgdG8gMHhmZmZmLiAgSW4gNjQgYml0IG1vZGUsCi0gICB0aGlzIGZsYWcgaXMgaWdub3JlZC4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX1NJR05PUFQgKDAyKQotCi0vKiBUaGlzIG9wZXJhbmQgZG9lcyBub3QgYWN0dWFsbHkgZXhpc3QgaW4gdGhlIGFzc2VtYmxlciBpbnB1dC4gIFRoaXMKLSAgIGlzIHVzZWQgdG8gc3VwcG9ydCBleHRlbmRlZCBtbmVtb25pY3Mgc3VjaCBhcyBtciwgZm9yIHdoaWNoIHR3bwotICAgb3BlcmFuZHMgZmllbGRzIGFyZSBpZGVudGljYWwuICBUaGUgYXNzZW1ibGVyIHNob3VsZCBjYWxsIHRoZQotICAgaW5zZXJ0IGZ1bmN0aW9uIHdpdGggYW55IG9wIHZhbHVlLiAgVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY2FsbAotICAgdGhlIGV4dHJhY3QgZnVuY3Rpb24sIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLCBhbmQgY2hlY2sgdGhlIHZhbHVlCi0gICBwbGFjZWQgaW4gdGhlIHZhbGlkIGFyZ3VtZW50LiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfRkFLRSAoMDQpCi0KLS8qIFRoZSBuZXh0IG9wZXJhbmQgc2hvdWxkIGJlIHdyYXBwZWQgaW4gcGFyZW50aGVzZXMgcmF0aGVyIHRoYW4KLSAgIHNlcGFyYXRlZCBmcm9tIHRoaXMgb25lIGJ5IGEgY29tbWEuICBUaGlzIGlzIHVzZWQgZm9yIHRoZSBsb2FkIGFuZAotICAgc3RvcmUgaW5zdHJ1Y3Rpb25zIHdoaWNoIHdhbnQgdGhlaXIgb3BlcmFuZHMgdG8gbG9vayBsaWtlCi0gICAgICAgcmVnLGRpc3BsYWNlbWVudChyZWcpCi0gICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9QQVJFTlMgKDAxMCkKLQotLyogVGhpcyBvcGVyYW5kIG1heSB1c2UgdGhlIHN5bWJvbGljIG5hbWVzIGZvciB0aGUgQ1IgZmllbGRzLCB3aGljaAotICAgYXJlCi0gICAgICAgbHQgIDAJZ3QgIDEJZXEgIDIJc28gIDMJdW4gIDMKLSAgICAgICBjcjAgMAljcjEgMQljcjIgMgljcjMgMwotICAgICAgIGNyNCA0CWNyNSA1CWNyNiA2CWNyNyA3Ci0gICBUaGVzZSBtYXkgYmUgY29tYmluZWQgYXJpdGhtZXRpY2FsbHksIGFzIGluIGNyMio0K2d0LiAgVGhlc2UgYXJlCi0gICBvbmx5IHN1cHBvcnRlZCBvbiB0aGUgUG93ZXJQQywgbm90IHRoZSBQT1dFUi4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX0NSICgwMjApCi0KLS8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIHJlZ2lzdGVyLiAgVGhlIGRpc2Fzc2VtYmxlciB1c2VzIHRoaXMgdG8gcHJpbnQKLSAgIHJlZ2lzdGVyIG5hbWVzIHdpdGggYSBsZWFkaW5nICdyJy4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX0dQUiAoMDQwKQotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSB3aXRoIGEgbGVhZGluZyAnZicuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9GUFIgKDAxMDApCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIHJlbGF0aXZlIGJyYW5jaCBkaXNwbGFjZW1lbnQuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfUkVMQVRJVkUgKDAyMDApCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9BQlNPTFVURSAoMDQwMCkKLQotLyogVGhpcyBvcGVyYW5kIGlzIG9wdGlvbmFsLCBhbmQgaXMgemVybyBpZiBvbWl0dGVkLiAgVGhpcyBpcyB1c2VkIGZvcgotICAgdGhlIG9wdGlvbmFsIEJGIGFuZCBMIGZpZWxkcyBpbiB0aGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMuICBUaGUKLSAgIGFzc2VtYmxlciBtdXN0IGNvdW50IHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgcmVtYWluaW5nIG9uIHRoZSBsaW5lLAotICAgYW5kIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgcmVtYWluaW5nIGZvciB0aGUgb3Bjb2RlLCBhbmQgZGVjaWRlCi0gICB3aGV0aGVyIHRoaXMgb3BlcmFuZCBpcyBwcmVzZW50IG9yIG5vdC4gIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkCi0gICBwcmludCB0aGlzIG9wZXJhbmQgb3V0IG9ubHkgaWYgaXQgaXMgbm90IHplcm8uICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9PUFRJT05BTCAoMDEwMDApCi0KLS8qIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWQgd2l0aCBQUENfT1BFUkFORF9PUFRJT05BTC4gIElmIHRoaXMgb3BlcmFuZAotICAgaXMgb21pdHRlZCwgdGhlbiBmb3IgdGhlIG5leHQgb3BlcmFuZCB1c2UgdGhpcyBvcGVyYW5kIHZhbHVlIHBsdXMKLSAgIDEsIGlnbm9yaW5nIHRoZSBuZXh0IG9wZXJhbmQgZmllbGQgZm9yIHRoZSBvcGNvZGUuICBUaGlzIHdyZXRjaGVkCi0gICBoYWNrIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBQb3dlciByb3RhdGUgaW5zdHJ1Y3Rpb25zIGNhbiB0YWtlCi0gICBlaXRoZXIgNCBvciA1IG9wZXJhbmRzLiAgVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgcHJpbnQgdGhpcyBvcGVyYW5kCi0gICBvdXQgcmVnYXJkbGVzcyBvZiB0aGUgUFBDX09QRVJBTkRfT1BUSU9OQUwgZmllbGQuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9ORVhUICgwMjAwMCkKLQotLyogVGhpcyBvcGVyYW5kIHNob3VsZCBiZSByZWdhcmRlZCBhcyBhIG5lZ2F0aXZlIG51bWJlciBmb3IgdGhlCi0gICBwdXJwb3NlcyBvZiBvdmVyZmxvdyBjaGVja2luZyAoaS5lLiwgdGhlIG5vcm1hbCBtb3N0IG5lZ2F0aXZlCi0gICBudW1iZXIgaXMgZGlzYWxsb3dlZCBhbmQgb25lIG1vcmUgdGhhbiB0aGUgbm9ybWFsIG1vc3QgcG9zaXRpdmUKLSAgIG51bWJlciBpcyBhbGxvd2VkKS4gIFRoaXMgZmxhZyB3aWxsIG9ubHkgYmUgc2V0IGZvciBhIHNpZ25lZAotICAgb3BlcmFuZC4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX05FR0FUSVZFICgwNDAwMCkKLQwKLS8qIFRoZSBQT1dFUiBhbmQgUG93ZXJQQyBhc3NlbWJsZXJzIHVzZSBhIGZldyBtYWNyb3MuICBXZSBrZWVwIHRoZW0KLSAgIHdpdGggdGhlIG9wZXJhbmRzIHRhYmxlIGZvciBzaW1wbGljaXR5LiAgVGhlIG1hY3JvIHRhYmxlIGlzIGFuCi0gICBhcnJheSBvZiBzdHJ1Y3QgcG93ZXJwY19tYWNyby4gICovCi0KLXN0cnVjdCBwb3dlcnBjX21hY3JvCi17Ci0gIC8qIFRoZSBtYWNybyBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG9wZXJhbmRzIHRoZSBtYWNybyB0YWtlcy4gICovCi0gIHVuc2lnbmVkIGludCBvcGVyYW5kczsKLQotICAvKiBPbmUgYml0IGZsYWdzIGZvciB0aGUgb3Bjb2RlLiAgVGhlc2UgYXJlIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2gKLSAgICAgc3BlY2lmaWMgcHJvY2Vzc29ycyBzdXBwb3J0IHRoZSBpbnN0cnVjdGlvbnMuICBUaGUgdmFsdWVzIGFyZSB0aGUKLSAgICAgc2FtZSBhcyB0aG9zZSBmb3IgdGhlIHN0cnVjdCBwb3dlcnBjX29wY29kZSBmbGFncyBmaWVsZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgLyogQSBmb3JtYXQgc3RyaW5nIHRvIHR1cm4gdGhlIG1hY3JvIGludG8gYSBub3JtYWwgaW5zdHJ1Y3Rpb24uCi0gICAgIEVhY2ggJU4gaW4gdGhlIHN0cmluZyBpcyByZXBsYWNlZCB3aXRoIG9wZXJhbmQgbnVtYmVyIE4gKHplcm8KLSAgICAgYmFzZWQpLiAgKi8KLSAgY29uc3QgY2hhciAqZm9ybWF0OwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvIHBvd2VycGNfbWFjcm9zW107Ci1leHRlcm4gY29uc3QgaW50IHBvd2VycGNfbnVtX21hY3JvczsKLQotI2VuZGlmIC8qIFBQQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9weXIuaCBiL2luY2x1ZGUvb3Bjb2RlL3B5ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjYzMmI4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3B5ci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qIHB5cmFtaWQub3Bjb2RlLmggLS0gZ2RiIGluaXRpYWwgYXR0ZW1wdC4gKi8KLQotLyogcHlyYW1pZCBvcGNvZGUgdGFibGU6IHdvdCB0byBkbyB3aXRoIHRoaXMKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlICovCi0KLXN0cnVjdCBweXJfZGF0dW0KLXsKLSAgY2hhciAgICAgICAgICAgICAgbmFyZ3M7Ci0gIGNoYXIgKiAgICAgICAgICAgIGFyZ3M7CS8qIGhvdyB0byBjb21waWxlIHNhaWQgb3Bjb2RlICovCi0gIHVuc2lnbmVkIGxvbmcgICAgIG1hc2s7CS8qIEJpdCB2ZWN0b3I6IHdoaWNoIG9wZXJhbmQgbW9kZXMgYXJlIHZhbGlkCi0JCQkJICAgZm9yIHRoaXMgb3Bjb2RlICovCi0gIHVuc2lnbmVkIGNoYXIgICAgIGNvZGU7CS8qIG9wLWNvZGUgKGFsd2F5cyA2KD8pIGJpdHMgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IHB5cl9pbnNuX2Zvcm1hdCB7Ci0gICAgdW5zaWduZWQgaW50IG1vZGUgOjQ7Ci0gICAgdW5zaWduZWQgaW50IG9wZXJhdG9yIDo4OwotICAgIHVuc2lnbmVkIGludCBpbmRleF9zY2FsZSA6MjsKLSAgICB1bnNpZ25lZCBpbnQgaW5kZXhfcmVnIDo2OwotICAgIHVuc2lnbmVkIGludCBvcGVyYW5kXzEgOjY7Ci0gICAgdW5zaWduZWQgaW50IG9wZXJhbmRfMjo2OwotfSBweXJfaW5zbl9mb3JtYXQ7Ci0JCi0KLS8qIFdlIHN0b3JlIGZvdXIgYnl0ZXMgb2Ygb3Bjb2RlIGZvciBhbGwgb3Bjb2Rlcy4KLSAgIFB5cmFtaWQgaXMgc3VmZmljaWVudGx5IFJJU0N5IHRoYXQ6Ci0gICAgICAtIGluc25zIGFyZSBhbHdheXMgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIHdvcmRzOwotICAgICAgLSB0aGUgbGVuZ3RoIG9mIGFueSBpbnNuIGNhbiBiZSB0b2xkIGZyb20gdGhlIGZpcnN0IHdvcmQgb2YKLSAgICAgICAgdGhlIGluc24uIChpZSwgaWYgdGhlcmUgYXJlIHplcm8sIG9uZSwgb3IgdHdvIHdvcmRzIG9mCi0JaW1tZWRpYXRlIG9wZXJhbmQvb2Zmc2V0KS4KLQotICAgCi0gICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0d28gY2hhcmFjdGVycyBmb3IgZWFjaAotICAgb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgZmlyc3Qgc3BlY2lmaWVzIHRoZSBraW5kIG9mIG9wZXJhbmQ7Ci0gICB0aGUgc2Vjb25kLCB0aGUgcGxhY2UgaXQgaXMgc3RvcmVkLiAqLwotCi0vKiBLaW5kcyBvZiBvcGVyYW5kczoKLSAgIG1hc2sJIGFzc2VtYmxlciBzeW50YXgJZGVzY3JpcHRpb24KLSAgIDB4MDAwMTogIG1vdncgUm4sUm4JCXJlZ2lzdGVyIHRvIHJlZ2lzdGVyCi0gICAweDAwMDI6ICBtb3Z3IEssUm4JCXF1aWNrIGltbWVkaWF0ZSB0byByZWdpc3RlcgotICAgMHgwMDA0OiAgbW92dyBJLFJuCQlsb25nIGltbWVkaWF0ZSB0byByZWdpc3RlcgotICAgMHgwMDA4OiAgbW92dyAoUm4pLFJuCXJlZ2lzdGVyIGluZGlyZWN0IHRvIHJlZ2lzdGVyCi0gICAJICAgIG1vdncgKFJuKVt4XSxSbglyZWdpc3RlciBpbmRpcmVjdCB0byByZWdpc3RlcgotICAgMHgwMDEwOiAgbW92dyBJKFJuKSxSbglvZmZzZXQgcmVnaXN0ZXIgaW5kaXJlY3QgdG8gcmVnaXN0ZXIKLSAgIAkgICAgbW92dyBJKFJuKVt4XSxSbglvZmZzZXQgcmVnaXN0ZXIgaW5kaXJlY3QsIGluZGV4ZWQsIHRvIHJlZ2lzdGVyCi0KLSAgIDB4MDAyMDogIG1vdncgUm4sKFJuKQlyZWdpc3RlciB0byByZWdpc3RlciBpbmRpcmVjdCAgICAgICAgICAgICAgICAKLSAgIDB4MDA0MDogIG1vdncgSywoUm4pCQlxdWljayBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgICAKLSAgIDB4MDA4MDogIG1vdncgSSwoUm4pCQlsb25nIGltbWVkaWF0ZSB0byByZWdpc3RlciBpbmRpcmVjdCAgICAgICAgICAKLSAgIDB4MDEwMDogIG1vdncgKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0IHRvLXJlZ2lzdGVyIGluZGlyZWN0ICAgICAgIAotICAgMHgwMTAwOiAgbW92dyAoUm4pLChSbikJcmVnaXN0ZXIgaW5kaXJlY3QgdG8tcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgCi0gICAweDAyMDA6ICBtb3Z3IEkoUm4pLChSbikJcmVnaXN0ZXIgaW5kaXJlY3Qrb2Zmc2V0IHRvIHJlZ2lzdGVyIGluZGlyZWN0Ci0gICAweDAyMDA6ICBtb3Z3IEkoUm4pLChSbikJcmVnaXN0ZXIgaW5kaXJlY3Qrb2Zmc2V0IHRvIHJlZ2lzdGVyIGluZGlyZWN0Ci0KLSAgIDB4MDQwMDogIG1vdncgUm4sSShSbikJcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgaW5kaXJlY3Qrb2Zmc2V0Ci0gICAweDA4MDA6ICBtb3Z3IEssSShSbikJcXVpY2sgaW1tZWRpYXRlIHRvIHJlZ2lzdGVyIGluZGlyZWN0K29mZnNldAotICAgMHgxMDAwOiAgbW92dyBJLEkoUm4pCWxvbmcgaW1tZWRpYXRlIHRvIHJlZ2lzdGVyIGluZGlyZWN0K29mZnNldAotICAgMHgxMDAwOiAgbW92dyAoUm4pLEkoUm4pCXJlZ2lzdGVyIGluZGlyZWN0IHRvLXJlZ2lzdGVyIGluZGlyZWN0K29mZnNldAotICAgMHgxMDAwOiAgbW92dyBJKFJuKSxJKFJuKQlyZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQgdG8gcmVnaXN0ZXIgaW5kaXJlY3QKLSAgIAkJCQkJK29mZnNldAotICAgMHgwMDAwOiAgKGlycmVndWxhcikJCT8/PwotICAgCi0KLSAgIEVhY2ggaW5zbiBoYXMgYSBmb3VyLWJpdCBmaWVsZCBlbmNvZGluZyB0aGUgdHlwZShzKSBvZiBpdHMgb3BlcmFuZHMuCi0qLwotCi0vKiBTb21lIGNvbW1vbiBjb21iaW5hdGlvbnMKLSAgICovCi0KLS8qIHRoZSBmaXJzdCA1LCgweDF8MHgyfDB4NHwweDh8MHgxMCkgaWUgKDF8Mnw0fDh8MTYpLCBpZSAoIDMyIC0xKSovCi0jZGVmaW5lIEdFTl9UT19SRUcgKDMxKQotCi0jZGVmaW5lCVVOS05PV04gKCh1bnNpZ25lZCBsb25nKS0xKQotI2RlZmluZSBBTlkgKEdFTl9UT19SRUcgfCAoR0VOX1RPX1JFRyA8PCA1KSB8IChHRU5fVE9fUkVHIDw8IDE1KSkKLQotI2RlZmluZSBDT05WRVJUICgxfDh8MHgxMHwweDIwfDB4MjAwKQotCi0jZGVmaW5lIEtfVE9fUkVHICgyKQotI2RlZmluZSBJX1RPX1JFRyAoNCkKLSNkZWZpbmUgTk9US19UT19SRUcgKEdFTl9UT19SRUcgJiB+S19UT19SRUcpCi0jZGVmaW5lIE5PVElfVE9fUkVHIChHRU5fVE9fUkVHICYgfklfVE9fUkVHKQotCi0vKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgdGhpcyBhcnJheSBiZSBzb3J0ZWQgYXMgZm9sbG93czoKLSAgIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZSBjb25zZWN1dGl2ZS4KLSAgIEFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb3BlcmFuZHMKLSAgIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gKi8KLQotc3RydWN0IHB5cl9vcGNvZGUJCS8qIHB5ciBvcGNvZGUgdGV4dCAqLwotewotICBjaGFyICogICAgICAgICAgICBuYW1lOwkvKiBvcGNvZGUgbmFtZTogbG93ZXJjYXNlIHN0cmluZyAgW2tleV0gICovCi0gIHN0cnVjdCBweXJfZGF0dW0gIGRhdHVtOwkvKiByZXN0IG9mIG9wY29kZSB0YWJsZSAgICAgICAgICBbZGF0dW1dICovCi19OwotCi0jZGVmaW5lIHB5cl9ob3cgYXJncwotI2RlZmluZSBweXJfbmFyZ3MgbmFyZ3MKLSNkZWZpbmUgcHlyX21hc2sgbWFzawotI2RlZmluZSBweXJfbmFtZSBuYW1lCi0KLXN0cnVjdCBweXJfb3Bjb2RlIHB5cl9vcGNvZGVzW10gPQotewotICB7Im1vdmIiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgxMX0sIH0sCi0gIHsibW92aCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDEyfSB9LAotICB7Im1vdnciLAl7IDIsICIiLCBBTlksCQkJMHgxMH0gfSwKLSAgeyJtb3ZsIiwJeyAyLCAiIiwgQU5ZLAkJCTB4MTN9IH0sCi0gIHsibW5lZ3ciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxNH0gfSwKLSAgeyJtbmVnZiIsCXsgMiwgIiIsIDB4MSwJCQkweDE1fSB9LAotICB7Im1uZWdkIiwJeyAyLCAiIiwgMHgxLAkJCTB4MTZ9IH0sCi0gIHsibWNvbXciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxN30gfSwKLSAgeyJtYWJzdyIsCXsgMiwgIiIsICgweDF8MHg4fDB4MTApLAkweDE4fSB9LAotICB7Im1hYnNmIiwJeyAyLCAiIiwgMHgxLAkJCTB4MTl9IH0sCi0gIHsibWFic2QiLAl7IDIsICIiLCAweDEsCQkJMHgxYX0gfSwKLSAgeyJtdHN0dyIsCXsgMiwgIiIsICgweDF8MHg4fDB4MTApLAkweDFjfSB9LAotICB7Im10c3RmIiwJeyAyLCAiIiwgMHgxLAkJCTB4MWR9IH0sCi0gIHsibXRzdGQiLAl7IDIsICIiLCAweDEsCQkJMHgxZX0gfSwKLSAgeyJtb3ZhIiwJeyAyLCAiIiwgMHg4fDB4MTAsCQkweDFmfSB9LAotICB7Im1vdnpidyIsCXsgMiwgIiIsICgweDF8MHg4fDB4MTApLAkweDIwfSB9LAotICB7Im1vdnpodyIsCXsgMiwgIiIsICgweDF8MHg4fDB4MTApLAkweDIxfSB9LAotCQkJCS8qIDIgaW5zbnMgb3V0IG9mIG9yZGVyIGhlcmUgKi8KLSAgeyJtb3ZibCIsCXsgMiwgIiIsIDEsCQkJMHg0Zn0gfSwKLSAgeyJmaWxibCIsCXsgMiwgIiIsIDEsCQkJMHg0ZX0gfSwKLQotICB7ImN2dGJ3IiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjJ9IH0sCi0gIHsiY3Z0aHciLAl7IDIsICIiLCBDT05WRVJULAkJMHgyM30gfSwKLSAgeyJjdnR3YiIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI0fSB9LAotICB7ImN2dHdoIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjV9IH0sCi0gIHsiY3Z0d2YiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyNn0gfSwKLSAgeyJjdnR3ZCIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI3fSB9LAotICB7ImN2dGZ3IiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4Mjh9IH0sCi0gIHsiY3Z0ZmQiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyOX0gfSwKLSAgeyJjdnRkdyIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDJhfSB9LAotICB7ImN2dGRmIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MmJ9IH0sCi0KLSAgeyJhZGR3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDB9IH0sCi0gIHsiYWRkd2MiLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0MX0gfSwKLSAgeyJzdWJ3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDJ9IH0sCi0gIHsic3Vid2IiLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0M30gfSwKLSAgeyJyc3VidyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQ0fSB9LAotICB7Im11bHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0NX0gfSwKLSAgeyJlbXVsIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDd9IH0sCi0gIHsidW11bHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0Nn0gfSwKLSAgeyJkaXZ3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDh9IH0sCi0gIHsiZWRpdiIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDRhfSB9LAotICB7InJkaXZ3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NGJ9IH0sCi0gIHsidWRpdnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0OX0gfSwKLSAgeyJtb2R3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NGN9IH0sCi0gIHsidW1vZHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0ZH0gfSwKLQotCi0gIHsiYWRkZiIsCXsgMiwgIiIsIDEsCQkJMHg1MH0gfSwKLSAgeyJhZGRkIiwJeyAyLCAiIiwgMSwJCQkweDUxfSB9LAotICB7InN1YmYiLAl7IDIsICIiLCAxLAkJCTB4NTJ9IH0sCi0gIHsic3ViZCIsCXsgMiwgIiIsIDEsCQkJMHg1M30gfSwKLSAgeyJtdWxmIiwJeyAyLCAiIiwgMSwJCQkweDU2fSB9LAotICB7Im11bGQiLAl7IDIsICIiLCAxLAkJCTB4NTd9IH0sCi0gIHsiZGl2ZiIsCXsgMiwgIiIsIDEsCQkJMHg1OH0gfSwKLSAgeyJkaXZkIiwJeyAyLCAiIiwgMSwJCQkweDU5fSB9LAotCi0KLSAgeyJjbXBiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4NjF9IH0sCi0gIHsiY21waCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDYyfSB9LAotICB7ImNtcHciLAl7IDIsICIiLCBVTktOT1dOLAkJMHg2MH0gfSwKLSAgeyJ1Y21wYiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDY2fSB9LAotICAvKiBXSFkgbm8gInVjbXBoIj8/PyAqLwotICB7InVjbXB3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4NjV9IH0sCi0gIHsieGNodyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDBmfSB9LAotCi0KLSAgeyJhbmR3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4MzB9IH0sCi0gIHsib3J3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4MzF9IH0sCi0gIHsieG9ydyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDMyfSB9LAotICB7ImJpY3ciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzM30gfSwKLSAgeyJsc2hsdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDM4fSB9LAotICB7ImFzaGx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2F9IH0sCi0gIHsiYXNobGwiLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzY30gfSwKLSAgeyJhc2hydyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNifSB9LAotICB7ImFzaHJsIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2R9IH0sCi0gIHsicm90bHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzZX0gfSwKLSAgeyJyb3RydyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNmfSB9LAotCi0gIC8qIHB1c2ggYW5kIHBvcCBpbnNucyBhcmUgImdvaW5nIGF3YXkgbmV4dCByZWxlYXNlIi4gKi8KLSAgeyJwdXNodyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDBjfSB9LAotICB7InBvcHciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgwZH0gfSwKLSAgeyJwdXNoYSIsCXsgMiwgIiIsICgweDh8MHgxMCksCQkweDBlfSB9LAotCi0gIHsiYml0c3ciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgzNX0gfSwKLSAgeyJiaXRjdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDM2fSB9LAotICAvKiBzb21lIGtpbmQgb2YgaWJyYS9kYnJhIGluc25zPz8qLwotICB7ImljbXB3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4Njd9IH0sCi0gIHsiZGNtcHciLAl7IDIsICIiLCAoMXw0fDB4MjB8MHg4MHwweDQwMHwweDEwMDApLAkweDY5fSB9LC8qRklYTUUqLwotICB7ImFjbXB3IiwJeyAyLCAiIiwgMSwJCQkweDZifSB9LAotCi0gIC8qIENhbGwgaXMgd3JpdHRlbiBhcyBhIDEtb3AgaW5zbiwgYnV0IGlzIGFsd2F5cyAoZGlzKWFzc2VtYmxlZCBhcyBhIDItb3AKLSAgICAgaW5zbiB3aXRoIGEgMm5kIG9wIG9mIHRyMTQuICAgVGhlIGFzc2VtYmxlciB3aWxsIGhhdmUgdG8gZ3JvayB0aGlzLiAgKi8KLSAgeyJjYWxsIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4MDR9IH0sCi0gIHsiY2FsbCIsCXsgMSwgIiIsIEdFTl9UT19SRUcsCQkweDA0fSB9LAotCi0gIHsiY2FsbGsiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwNn0gfSwvKiBzeXN0ZW0gY2FsbD8qLwotICAvKiBSZXQgaXMgdXN1YWxseSB3cml0dGVuIGFzIGEgMC1vcCBpbnNuLCBidXQgZ2V0cyBkaXNhc3NlbWJsZWQgYXMgYQotICAgICAxLW9wIGluc24uIFRoZSBvcGVyYW5kIGlzIGFsd2F5cyB0cjE1LiAqLwotICB7InJldCIsCXsgMCwgIiIsIFVOS05PV04sCQkweDA5fSB9LAotICB7InJldCIsCXsgMSwgIiIsIFVOS05PV04sCQkweDA5fSB9LAotICB7ImFkc2YiLAl7IDIsICIiLCAoMXwyfDQpLAkJMHgwOH0gfSwKLSAgeyJyZXRkIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MGF9IH0sCi0gIHsiYnRjIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDF9IH0sCi0gIHsiYmZjIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDJ9IH0sCi0gIC8qIENhcmVmdWw6IGhhbHQgaXMgMHgwMDAwMDAwMC4gSnVtcCBtdXN0IGhhdmUgc29tZSBvdGhlciAobW9kZT8pYml0IHNldD8/ICovCi0gIHsianVtcCIsCXsgMSwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImJ0cCIsCXsgMiwgIiIsIFVOS05PV04sCQkweGYwMH0gfSwKLSAgLyogcmVhZCBjb250cm9sLXN0YWNrIHBvaW50ZXIgaXMgYW5vdGhlciAxLW9yLTIgb3BlcmFuZCBpbnNuLiAqLwotICB7InJjc3AiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMWZ9IH0sCi0gIHsicmNzcCIsCXsgMSwgIiIsIFVOS05PV04sCQkweDAxZn0gfQotfTsKLQotLyogZW5kOiBweXJhbWlkLm9wY29kZS5oICovCi0vKiBPbmUgZGF5IEkgd2lsbCBoYXZlIHRvIHRha2UgdGhlIHRpbWUgdG8gZmluZCBvdXQgd2hhdCBvcGVyYW5kcwotICAgYXJlIHZhbGlkIGZvciB0aGVzZSBpbnNucywgYW5kIGd1ZXNzIGF0IHdoYXQgdGhleSBtZWFuLgotCi0gICBJIGNhbid0IGltYWdpbmUgd2hhdCB0aGUgIkk/Pz8iIGluc25zIChpZ2xvYiwgZXRjKSBkby4KLQotICAgdGhlIGFyaXRobWV0aWMtc291bmRpbmcgaW5zbnMgZW5kaW5nIGluICJwIiBzb3VuZCBhd2Z1bGx5IGxpa2UgQkNECi0gICBhcml0aG1ldGljIGluc25zOgotICAgCWRzaGxwIC0+IERlY2ltYWwgU0hpZnQgTGVmdCBQYWNrZWQKLQlkc2hycCAtPiBEZWNpbWFsIFNIaWZ0IFJpZ2h0IFBhY2tlZAotICAgYW5kIGN2dGxwIHdvdWxkIGJlIGNvbnZlcnQgbG9uZyB0byBwYWNrZWQuCi0gICBJIGhhdmUgbm8gaWRlYSBob3cgdGhlIG9wZXJhbmRzIGFyZSBpbnRlcnByZXRlZDsgYnV0IGhhdmluZyB0aGVtIGJlCi0gICBhIGxvbmcgcmVnaXN0ZXIgd2l0aCAoYWRkcmVzcywgbGVuZ3RoKSBvZiBhbiBpbi1tZW1vcnkgcGFja2VkIEJDRCBvcGVyYW5kCi0gICB3b3VsZCBub3QgYmUgc3VycHJpc2luZy4KLSAgIFRoZXkgYXJlIHVubGlrZWx5IHRvIGJlIGEgcGFja2VkIGJjZCBzdHJpbmc6IDY0IGJpdHMgb2YgbG9uZyBnaXZlCi0gICBpcyBvbmx5IDE1IGRpZ2l0cytzaWduLCB3aGljaCBpc24ndCBlbm91Z2ggZm9yIENPQk9MLgotICovIAotI2lmIDAKLSAgeyJ3Y3NwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qd3JpdGUgY3NwPyovCi0gIC8qIFRoZSBPU3ggT3BlcmF0aW5nIFN5c3RlbSBQb3J0aW5nIEd1aWRlIGNsYWltcyBTU0wgZG9lcyB0aGluZ3MKLSAgICAgd2l0aCB0cjEyIChhIHJlZ2lzdGVyIHJlc2VydmVkIHRvIGl0KSB0byBkbyB3aXRoIHN0YXRpYyBibG9jay1zdHJ1Y3R1cmUKLSAgICAgcmVmZXJlbmNlcy4gIFNTTD1TZXQgU3RhdGljIExpbms/ICBJdCdzICJHb2luZyBhd2F5IG5leHQgcmVsZWFzZSIuICovCi0gIHsic3NsIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiY2NtcHMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJsY2QiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJ1ZW11bCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKnVuc2lnbmVkIGVtdWwqLwotICB7InNyZiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKkdpZGdldCB0aW1lPz8/Ki8KLSAgeyJtbmVncCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvbW92ZS1uZWcgcGh5cz8qLwotICB7ImxkcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKmxvYWQgcGh5cz8qLwotICB7ImxkdGkiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJsZGIiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJzdHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJzdHRpIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsic3RiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsic3R1IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiYWRkcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InN1YnAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJtdWxwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiZGl2cCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImRzaGxwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sICAvKiBkZWMgc2hsIHBhY2tlZD8gKi8KLSAgeyJkc2hycCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBkZWMgc2hyIHBhY2tlZD8gKi8KLSAgeyJtb3ZzIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qbW92ZSAoc3RyaW5nPyk/Ki8KLSAgeyJjbXBwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGNtcCBwaHlzPyovCi0gIHsiY21wcyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjbXAgKHN0cmluZz8pPyovCi0gIHsiY3Z0bHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY3Z0IGxvbmcgdG8gcD8/Ki8KLSAgeyJjdnRwbCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjdnQgcCB0byBsPz8qLwotICB7ImRpbnRyIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qID8/IGludHIgPyovCi0gIHsicnBoeXN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIHJlYWQgcGh5cyB3b3JkPyovCi0gIHsid3BoeXN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIHdyaXRlIHBoeXMgd29yZD8qLwotICB7ImNtb3ZzIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsicnN1YnciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJiaWNwc3ciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY2xyIGJpdCBpbiBwc3c/ICovCi0gIHsiYmlzcHN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIHNldCBiaXQgaW4gcHN3PyAqLwotICB7ImVpbyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiA/PyA/aW8gPyAqLwotICB7ImNhbGxwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGNhbGwgcGh5cz8qLwotICB7ImNhbGxyIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibHBjeHQiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypsb2FkIHByb2MgY29udGV4dCovCi0gIHsicmVpIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qcmV0IGZyb20gaW50cnB0Ki8KLSAgeyJycG9ydCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKnJlYWQtcG9ydD8qLwotICB7InJ0b2QiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypyZWFkLXRpbWUtb2YtZGF5PyovCi0gIHsic3NpIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsidnRwYSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKnZpcnQtdG8tcGh5cy1hZGRyPyovCi0gIHsid2ljbCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiB3cml0ZSBpY2wgPyAqLwotICB7Indwb3J0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qd3JpdGUtcG9ydD8qLwotICB7Ind0b2QiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyp3cml0ZS10aW1lLW9mLWRheT8qLwotICB7ImZsaWMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJpZ2xvYiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBJIGdsb2JhbD8gKi8KLSAgeyJpcGh5cyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBJIHBoeXNpY2FsPyAqLwotICB7ImlwaWQiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSBwaWQ/ICovCi0gIHsiaXZlY3QiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSB2ZWN0b3I/ICovCi0gIHsibGFtc3QiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJ0aW8iLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvc3BhcmMuaCBiL2luY2x1ZGUvb3Bjb2RlL3NwYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMTU5YmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvc3BhcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKiBEZWZpbml0aW9ucyBmb3Igb3Bjb2RlIHRhYmxlIGZvciB0aGUgc3BhcmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLCBHREIsIHRoZSBHTlUgZGVidWdnZXIsIGFuZAotdGhlIEdOVSBCaW51dGlscy4KLQotR0FTL0dEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUy9HREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUyBvciBHREI7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLglJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBUaGUgU1BBUkMgb3Bjb2RlIHRhYmxlIChhbmQgb3RoZXIgcmVsYXRlZCBkYXRhKSBpcyBkZWZpbmVkIGluCi0gICB0aGUgb3Bjb2RlcyBsaWJyYXJ5IGluIHNwYXJjLW9wYy5jLiAgSWYgeW91IGNoYW5nZSBhbnl0aGluZyBoZXJlLCBtYWtlCi0gICBzdXJlIHlvdSBmaXggdXAgdGhhdCBmaWxlLCBhbmQgdmljZSB2ZXJzYS4gICovCi0KLSAvKiBGSVhNRS1zb21lZGF5OiBwZXJoYXBzIHRoZSAsYSdzIGFuZCBzdWNoIHNob3VsZCBiZSBlbWJlZGRlZCBpbiB0aGUKLSAgICBpbnN0cnVjdGlvbidzIG5hbWUgcmF0aGVyIHRoYW4gdGhlIGFyZ3MuICBUaGlzIHdvdWxkIG1ha2UgZ2FzIGZhc3RlciwgcGluc24KLSAgICBzbG93ZXIsIGJ1dCB3b3VsZCBtZXNzIHVwIHNvbWUgbWFjcm9zIGEgYml0LiAgeG94b3JpY2guICovCi0KLS8qIExpc3Qgb2YgaW5zdHJ1Y3Rpb24gc2V0cyB2YXJpYXRpb25zLgotICAgVGhlc2UgdmFsdWVzIGFyZSBzdWNoIHRoYXQgZWFjaCBlbGVtZW50IGlzIGVpdGhlciBhIHN1cGVyc2V0IG9mIGEKLSAgIHByZWNlZGluZyBlYWNoIG9uZSBvciB0aGV5IGNvbmZsaWN0IGluIHdoaWNoIGNhc2UgU1BBUkNfT1BDT0RFX0NPTkZMSUNUX1AKLSAgIHJldHVybnMgbm9uLXplcm8uCi0gICBUaGUgdmFsdWVzIGFyZSBpbmRpY2VzIGludG8gYHNwYXJjX29wY29kZV9hcmNocycgZGVmaW5lZCBpbiBzcGFyYy1vcGMuYy4KLSAgIERvbid0IGNoYW5nZSB0aGlzIHdpdGhvdXQgdXBkYXRpbmcgc3BhcmMtb3BjLmMuICAqLwotCi1lbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCB7Ci0gIFNQQVJDX09QQ09ERV9BUkNIX1Y2ID0gMCwKLSAgU1BBUkNfT1BDT0RFX0FSQ0hfVjcsCi0gIFNQQVJDX09QQ09ERV9BUkNIX1Y4LAotICBTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xFVCwKLSAgU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMSVRFLAotICAvKiB2OSB2YXJpYW50cyBtdXN0IGFwcGVhciBsYXN0ICovCi0gIFNQQVJDX09QQ09ERV9BUkNIX1Y5LAotICBTUEFSQ19PUENPREVfQVJDSF9WOUEsIC8qIHY5IHdpdGggdWx0cmFzcGFyYyBhZGRpdGlvbnMgKi8KLSAgU1BBUkNfT1BDT0RFX0FSQ0hfQkFEIC8qIGVycm9yIHJldHVybiBmcm9tIHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCAqLwotfTsKLQotLyogVGhlIGhpZ2hlc3QgYXJjaGl0ZWN0dXJlIGluIHRoZSB0YWJsZS4gICovCi0jZGVmaW5lIFNQQVJDX09QQ09ERV9BUkNIX01BWCAoU1BBUkNfT1BDT0RFX0FSQ0hfQkFEIC0gMSkKLQotLyogR2l2ZW4gYW4gZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwsIHJldHVybiB0aGUgYml0bWFzayB0byB1c2UgaW4KLSAgIGluc24gZW5jb2RpbmcvZGVjb2RpbmcuICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfQVJDSF9NQVNLKGFyY2gpICgxIDw8IChhcmNoKSkKLQotLyogR2l2ZW4gYSB2YWxpZCBzcGFyY19vcGNvZGVfYXJjaF92YWwsIHJldHVybiBub24temVybyBpZiBpdCdzIHY5LiAgKi8KLSNkZWZpbmUgU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUChhcmNoKSAoKGFyY2gpID49IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotCi0vKiBUYWJsZSBvZiBjcHUgdmFyaWFudHMuICAqLwotCi1zdHJ1Y3Qgc3BhcmNfb3Bjb2RlX2FyY2ggewotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBNYXNrIG9mIHNwYXJjX29wY29kZV9hcmNoX3ZhbCdzIHN1cHBvcnRlZC4KLSAgICAgRUc6IEZvciB2NyB0aGlzIHdvdWxkIGJlCi0gICAgIChTUEFSQ19PUENPREVfQVJDSF9NQVNLICguLi5fVjYpIHwgU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoLi4uX1Y3KSkuCi0gICAgIFRoZXNlIGFyZSBzaG9ydCdzIGJlY2F1c2Ugc3BhcmNfb3Bjb2RlLmFyY2hpdGVjdHVyZSBpcy4gICovCi0gIHNob3J0IHN1cHBvcnRlZDsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlX2FyY2ggc3BhcmNfb3Bjb2RlX2FyY2hzW107Ci0KLS8qIEdpdmVuIGFyY2hpdGVjdHVyZSBuYW1lLCBsb29rIHVwIGl0J3Mgc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIHZhbHVlLiAgKi8KLWV4dGVybiBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2gKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIFJldHVybiB0aGUgYml0bWFzayBvZiBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlcyBmb3IgQVJDSC4gICovCi0jZGVmaW5lIFNQQVJDX09QQ09ERV9TVVBQT1JURUQoQVJDSCkgKHNwYXJjX29wY29kZV9hcmNoc1tBUkNIXS5zdXBwb3J0ZWQpCi0KLS8qIE5vbi16ZXJvIGlmIEFSQ0gxIGNvbmZsaWN0cyB3aXRoIEFSQ0gyLgotICAgSUU6IEFSQ0gxIGFzIGEgc3VwcG9ydGVkIGJpdCBzZXQgdGhhdCBBUkNIMiBkb2Vzbid0LCBhbmQgdmljZSB2ZXJzYS4gICovCi0jZGVmaW5lIFNQQVJDX09QQ09ERV9DT05GTElDVF9QKEFSQ0gxLCBBUkNIMikgXAotKCgoU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoQVJDSDEpICYgU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoQVJDSDIpKSBcCi0gICE9IFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gxKSkgXAotICYmICgoU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoQVJDSDEpICYgU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoQVJDSDIpKSBcCi0gICAgICE9IFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gyKSkpCi0KLS8qIFN0cnVjdHVyZSBvZiBhbiBvcGNvZGUgdGFibGUgZW50cnkuICAqLwotCi1zdHJ1Y3Qgc3BhcmNfb3Bjb2RlIHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBtYXRjaDsJLyogQml0cyB0aGF0IG11c3QgYmUgc2V0LiAqLwotICB1bnNpZ25lZCBsb25nIGxvc2U7CS8qIEJpdHMgdGhhdCBtdXN0IG5vdCBiZSBzZXQuICovCi0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIC8qIFRoaXMgd2FzIGNhbGxlZCAiZGVsYXllZCIgaW4gdmVyc2lvbnMgYmVmb3JlIHRoZSBmbGFncy4gKi8KLSAgY2hhciBmbGFnczsKLSAgc2hvcnQgYXJjaGl0ZWN0dXJlOwkvKiBCaXRtYXNrIG9mIHNwYXJjX29wY29kZV9hcmNoX3ZhbCdzLiAgKi8KLX07Ci0KLSNkZWZpbmUJRl9ERUxBWUVECTEJLyogRGVsYXllZCBicmFuY2ggKi8KLSNkZWZpbmUJRl9BTElBUwkJMgkvKiBBbGlhcyBmb3IgYSAicmVhbCIgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUJRl9VTkJSCQk0CS8qIFVuY29uZGl0aW9uYWwgYnJhbmNoICovCi0jZGVmaW5lCUZfQ09OREJSCTgJLyogQ29uZGl0aW9uYWwgYnJhbmNoICovCi0jZGVmaW5lCUZfSlNSCQkxNgkvKiBTdWJyb3V0aW5lIGNhbGwgKi8KLSNkZWZpbmUgRl9GTE9BVAkJMzIJLyogRmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24gKG5vdCBhIGJyYW5jaCkgKi8KLSNkZWZpbmUgRl9GQlIJCTY0CS8qIEZsb2F0aW5nIHBvaW50IGJyYW5jaCAqLwotLyogRklYTUU6IEFkZCBGX0FOQUNIUk9OSVNUSUMgZmxhZyBmb3IgdjkuICAqLwotCi0vKgotCi1BbGwgc3BhcmMgb3Bjb2RlcyBhcmUgMzIgYml0cywgZXhjZXB0IGZvciB0aGUgYHNldCcgaW5zdHJ1Y3Rpb24gKHJlYWxseSBhCi1tYWNybyksIHdoaWNoIGlzIDY0IGJpdHMuIEl0IGlzIGhhbmRsZWQgYXMgYSBzcGVjaWFsIGNhc2UuCi0KLVRoZSBtYXRjaCBjb21wb25lbnQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2ggYSBwYXJ0aWN1bGFyCi1vcGNvZGUgaW4gb3JkZXIgZm9yIGFuIGluc3RydWN0aW9uIHRvIGJlIGFuIGluc3RhbmNlIG9mIHRoYXQgb3Bjb2RlLgotCi1UaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgY2hhcmFjdGVyIGZvciBlYWNoIG9wZXJhbmQgb2YgdGhlCi1pbnN0cnVjdGlvbi4KLQotS2luZHMgb2Ygb3BlcmFuZHM6Ci0JIwlOdW1iZXIgdXNlZCBieSBvcHRpbWl6ZXIuCUl0IGlzIGlnbm9yZWQuCi0JMQlyczEgcmVnaXN0ZXIuCi0JMglyczIgcmVnaXN0ZXIuCi0JZAlyZCByZWdpc3Rlci4KLQllCWZyczEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0JdglmcnMxIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChkb3VibGUvZXZlbikuCi0JVglmcnMxIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChxdWFkL211bHRpcGxlIG9mIDQpLgotCWYJZnJzMiBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KLQlCCWZyczIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKGRvdWJsZS9ldmVuKS4KLQlSCWZyczIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKHF1YWQvbXVsdGlwbGUgb2YgNCkuCi0JZwlmcnNkIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLgotCUgJZnJzZCBmbG9hdGluZyBwb2ludCByZWdpc3RlciAoZG91YmxlL2V2ZW4pLgotCUoJZnJzZCBmbG9hdGluZyBwb2ludCByZWdpc3RlciAocXVhZC9tdWx0aXBsZSBvZiA0KS4KLQliCWNyczEgY29wcm9jZXNzb3IgcmVnaXN0ZXIKLQljCWNyczIgY29wcm9jZXNzb3IgcmVnaXN0ZXIKLQlECWNyc2QgY29wcm9jZXNzb3IgcmVnaXN0ZXIKLQltCWFsdGVybmF0ZSBzcGFjZSByZWdpc3RlciAoYXNyKSBpbiByZAotCU0JYWx0ZXJuYXRlIHNwYWNlIHJlZ2lzdGVyIChhc3IpIGluIHJzMQotCWgJMjIgaGlnaCBiaXRzLgotCVgJNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlCi0JWQk2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUKLQlLCU1FTUJBUiBtYXNrICg3IGJpdHMpLiAodjkpCi0JagkxMCBiaXQgSW1tZWRpYXRlLiAodjkpCi0JSQkxMSBiaXQgSW1tZWRpYXRlLiAodjkpCi0JaQkxMyBiaXQgSW1tZWRpYXRlLgotCW4JMjIgYml0IGltbWVkaWF0ZS4KLQlrCTIrMTQgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4gKHY5KQotCUcJMTkgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4gKHY5KQotCWwJMjIgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4KLQlMCTMwIGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuCi0JYQlBbm51bC4JVGhlIGFubnVsIGJpdCBpcyBzZXQuCi0JQQlBbHRlcm5hdGUgYWRkcmVzcyBzcGFjZS4gU3RvcmVkIGFzIDggYml0cy4KLQlDCUNvcHJvY2Vzc29yIHN0YXRlIHJlZ2lzdGVyLgotCUYJZmxvYXRpbmcgcG9pbnQgc3RhdGUgcmVnaXN0ZXIuCi0JcAlQcm9jZXNzb3Igc3RhdGUgcmVnaXN0ZXIuCi0JTglCcmFuY2ggcHJlZGljdCBjbGVhciAiLHBuIiAodjkpCi0JVAlCcmFuY2ggcHJlZGljdCBzZXQgIixwdCIgKHY5KQotCXoJJWljYy4gKHY5KQotCVoJJXhjYy4gKHY5KQotCXEJRmxvYXRpbmcgcG9pbnQgcXVldWUuCi0JcglTaW5nbGUgcmVnaXN0ZXIgdGhhdCBpcyBib3RoIHJzMSBhbmQgcmQuCi0JTwlTaW5nbGUgcmVnaXN0ZXIgdGhhdCBpcyBib3RoIHJzMiBhbmQgcmQuCi0JUQlDb3Byb2Nlc3NvciBxdWV1ZS4KLQlTCVNwZWNpYWwgY2FzZS4KLQl0CVRyYXAgYmFzZSByZWdpc3Rlci4KLQl3CVdpbmRvdyBpbnZhbGlkIG1hc2sgcmVnaXN0ZXIuCi0JeQlZIHJlZ2lzdGVyLgotCXUJc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzIGluIHJkIHBvc2l0aW9uCi0JVQlzcGFyY2xldCBjb3Byb2Nlc3NvciByZWdpc3RlcnMgaW4gcnMxIHBvc2l0aW9uCi0JRQklY2NyLiAodjkpCi0JcwklZnBycy4gKHY5KQotCVAJJXBjLiAgKHY5KQotCVcJJXRpY2suCSh2OSkKLQlvCSVhc2kuICh2OSkKLQk2CSVmY2MwLiAodjkpCi0JNwklZmNjMS4gKHY5KQotCTgJJWZjYzIuICh2OSkKLQk5CSVmY2MzLiAodjkpCi0JIQlQcml2aWxlZ2VkIFJlZ2lzdGVyIGluIHJkICh2OSkKLQk/CVByaXZpbGVnZWQgUmVnaXN0ZXIgaW4gcnMxICh2OSkKLQkqCVByZWZldGNoIGZ1bmN0aW9uIGNvbnN0YW50LiAodjkpCi0JeAlPUEYgZmllbGQgKHY5IGltcGRlcCkuCi0JMAkzMi82NCBiaXQgaW1tZWRpYXRlIGZvciBzZXQgb3Igc2V0eCAodjkpIGluc25zCi0JXwlBbmNpbGxhcnkgc3RhdGUgcmVnaXN0ZXIgaW4gcmQgKHY5YSkKLQkvCUFuY2lsbGFyeSBzdGF0ZSByZWdpc3RlciBpbiByczEgKHY5YSkKLQotVGhlIGZvbGxvd2luZyBjaGFycyBhcmUgdW51c2VkOiAobm90ZTogLFtdIGFyZSB1c2VkIGFzIHB1bmN0dWF0aW9uKQotWzM0NV0KLQotKi8KLQotI2RlZmluZSBPUDIoeCkJCSgoKHgpJjB4NykgPDwgMjIpIC8qIG9wMiBmaWVsZCBvZiBmb3JtYXQyIGluc25zICovCi0jZGVmaW5lIE9QMyh4KQkJKCgoeCkmMHgzZikgPDwgMTkpIC8qIG9wMyBmaWVsZCBvZiBmb3JtYXQzIGluc25zICovCi0jZGVmaW5lIE9QKHgpCQkoKHVuc2lnbmVkKSgoeCkmMHgzKSA8PCAzMCkgLyogb3AgZmllbGQgb2YgYWxsIGluc25zICovCi0jZGVmaW5lIE9QRih4KQkJKCgoeCkmMHgxZmYpIDw8IDUpIC8qIG9wZiBmaWVsZCBvZiBmbG9hdCBpbnNucyAqLwotI2RlZmluZSBPUEZfTE9XNSh4KQlPUEYoKHgpJjB4MWYpIC8qIHY5ICovCi0jZGVmaW5lIEYzRih4LCB5LCB6KQkoT1AoeCkgfCBPUDMoeSkgfCBPUEYoeikpIC8qIGZvcm1hdDMgZmxvYXQgaW5zbnMgKi8KLSNkZWZpbmUgRjNJKHgpCQkoKCh4KSYweDEpIDw8IDEzKSAvKiBpbW1lZGlhdGUgZmllbGQgb2YgZm9ybWF0IDMgaW5zbnMgKi8KLSNkZWZpbmUgRjIoeCwgeSkJKE9QKHgpIHwgT1AyKHkpKSAvKiBmb3JtYXQgMiBpbnNucyAqLwotI2RlZmluZSBGMyh4LCB5LCB6KQkoT1AoeCkgfCBPUDMoeSkgfCBGM0koeikpIC8qIGZvcm1hdDMgaW5zbnMgKi8KLSNkZWZpbmUgRjEoeCkJCShPUCh4KSkKLSNkZWZpbmUgRElTUDMwKHgpCSgoeCkmMHgzZmZmZmZmZikKLSNkZWZpbmUgQVNJKHgpCQkoKCh4KSYweGZmKSA8PCA1KSAvKiBhc2kgZmllbGQgb2YgZm9ybWF0MyBpbnNucyAqLwotI2RlZmluZSBSUzIoeCkJCSgoeCkmMHgxZikgLyogcnMyIGZpZWxkICovCi0jZGVmaW5lIFNJTU0xMyh4KQkoKHgpJjB4MWZmZikgLyogc2ltbTEzIGZpZWxkICovCi0jZGVmaW5lIFJEKHgpCQkoKCh4KSYweDFmKSA8PCAyNSkgLyogZGVzdGluYXRpb24gcmVnaXN0ZXIgZmllbGQgKi8KLSNkZWZpbmUgUlMxKHgpCQkoKCh4KSYweDFmKSA8PCAxNCkgLyogcnMxIGZpZWxkICovCi0jZGVmaW5lIEFTSV9SUzIoeCkJKFNJTU0xMyh4KSkKLSNkZWZpbmUgTUVNQkFSKHgpCSgoeCkmMHg3ZikKLSNkZWZpbmUgU0xDUE9QKHgpCSgoKHgpJjB4N2YpIDw8IDYpIC8qIHNwYXJjbGV0IGNwb3AgKi8KLQotI2RlZmluZSBBTk5VTAkoMTw8MjkpCi0jZGVmaW5lIEJQUkVECSgxPDwxOSkJLyogdjkgKi8KLSNkZWZpbmUJSU1NRUQJRjNJKDEpCi0jZGVmaW5lIFJEX0cwCVJEKH4wKQotI2RlZmluZQlSUzFfRzAJUlMxKH4wKQotI2RlZmluZQlSUzJfRzAJUlMyKH4wKQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSBzcGFyY19vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IHNwYXJjX251bV9vcGNvZGVzOwotCi1leHRlcm4gaW50IHNwYXJjX2VuY29kZV9hc2kgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZGVjb2RlX2FzaSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBpbnQgc3BhcmNfZW5jb2RlX21lbWJhciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpzcGFyY19kZWNvZGVfbWVtYmFyIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIGludCBzcGFyY19lbmNvZGVfcHJlZmV0Y2ggUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZGVjb2RlX3ByZWZldGNoIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIGludCBzcGFyY19lbmNvZGVfc3BhcmNsZXRfY3ByZWcgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZGVjb2RlX3NwYXJjbGV0X2NwcmVnIFBBUkFNUyAoKGludCkpOwotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogZmlsbC1jb2x1bW46IDEzMQotICogY29tbWVudC1jb2x1bW46IDAKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2Ygc3BhcmMuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvdGFob2UuaCBiL2luY2x1ZGUvb3Bjb2RlL3RhaG9lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1Y2VlMjQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvdGFob2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogUG9ydGVkIGJ5IHRoZSBTdGF0ZSBVbml2ZXJzaXR5IG9mIE5ldyBZb3JrIGF0IEJ1ZmZhbG8gYnkgdGhlIERpc3RyaWJ1dGVkCi0gKiBDb21wdXRlciBTeXN0ZW1zIExhYiwgRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlLCAxOTkxLgotICovCi0KLSNpZm5kZWYgdGFob2Vfb3Bjb2RlVAotI2RlZmluZSB0YWhvZV9vcGNvZGVUIGludAotI2VuZGlmIC8qIG5vIHRhaG9lX29wY29kZVQgKi8KLQotc3RydWN0IHZvdF93b3QgICAgICAgICAgICAgICAgICAvKiB0YWhvZSBvcGNvZGUgdGFibGU6IHdvdCB0byBkbyB3aXRoIHRoaXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFydGljdWxhciBvcGNvZGUgKi8KLXsKLSAgY2hhciAqICAgICAgICAgICAgYXJnczsgICAgICAgLyogaG93IHRvIGNvbXBpbGUgc2FpZCBvcGNvZGUgKi8KLSAgdGFob2Vfb3Bjb2RlVCAgICAgICBjb2RlOyAgICAgLyogb3AtY29kZSAobWF5IGJlID4gOCBiaXRzISkgKi8KLX07Ci0KLXN0cnVjdCB2b3QgICAgICAgICAgICAgICAgICAgICAgLyogdGFob2Ugb3Bjb2RlIHRleHQgKi8KLXsKLSAgY2hhciAqICAgICAgICAgICAgbmFtZTsgICAgICAgLyogb3Bjb2RlIG5hbWU6IGxvd2VyY2FzZSBzdHJpbmcgIFtrZXldICAqLwotICBzdHJ1Y3Qgdm90X3dvdCAgICBkZXRhaWw7ICAgICAvKiByZXN0IG9mIG9wY29kZSB0YWJsZSAgICAgICAgICBbZGF0dW1dICovCi19OwotCi0jZGVmaW5lIHZvdF9ob3cgYXJncwotI2RlZmluZSB2b3RfY29kZSBjb2RlCi0jZGVmaW5lIHZvdF9kZXRhaWwgZGV0YWlsCi0jZGVmaW5lIHZvdF9uYW1lIG5hbWUKLQotc3RhdGljIHN0cnVjdCB2b3QKLXZvdHN0cnNbXSA9Ci17Ci17ICAgICJoYWx0IiwJeyIiLAkJCTB4MDAJfSB9LAoteyAgICAic2luZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4MDUgICAgfSB9LAoteyAgICAibGRmIiwgICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4MDYgICAgfSB9LAoteyAgICAibGRkIiwgICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4MDcgICAgfSB9LAoteyAgICAiYWRkYjIiLAl7InJibWIiLAkJMHgwOAl9IH0sCi17ICAgICJtb3ZiIiwJeyJyYndiIiwJCTB4MDkJfSB9LAoteyAgICAiYWRkdzIiLAl7InJ3bXciLAkJMHgwYQl9IH0sCi17ICAgICJtb3Z3IiwJeyJyd3d3IiwJCTB4MGIJfSB9LAoteyAgICAiYWRkbDIiLAl7InJsbWwiLAkJMHgwYwl9IH0sCi17ICAgICJtb3ZsIiwJeyJybHdsIiwJCTB4MGQJfSB9LAoteyAgICAiYmJzIiwJeyJybHZsYnciLAkJMHgwZQl9IH0sCi17ICAgICJub3AiLCAgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHgxMCAgICB9IH0sCi17ICAgICJicmIiLAl7ImJiIiwJCQkweDExCX0gfSwKLXsgICAgImJydyIsCXsiYnciLAkJCTB4MTMJfSB9LAoteyAgICAiY29zZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4MTUgICAgfSB9LAoteyAgICAibG5mIiwgICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4MTYgICAgfSB9LAoteyAgICAibG5kIiwgICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4MTcgICAgfSB9LAoteyAgICAiYWRkYjMiLAl7InJicmJ3YiIsCQkweDE4CX0gfSwKLXsgICAgImNtcGIiLAl7InJid2IiLAkJMHgxOQl9IH0sIAoteyAgICAiYWRkdzMiLAl7InJ3cnd3dyIsCQkweDFhCX0gfSwKLXsgICAgImNtcHciLAl7InJ3d3ciLAkJMHgxYgl9IH0sCi17ICAgICJhZGRsMyIsCXsicmxybHdsIiwJCTB4MWMJfSB9LAoteyAgICAiY21wbCIsCXsicmx3bCIsCQkweDFkCX0gfSwKLXsgICAgImJiYyIsCXsicmx2bGJ3IiwJCTB4MWUJfSB9LAoteyAgICAicmVpIiwJeyIiLAkJCTB4MjAJfSB9LAoteyAgICAiYm5lcSIsCXsiYmIiLAkJCTB4MjEJfSB9LAoteyAgICAiYm5lcXUiLAl7ImJiIiwJCQkweDIxCX0gfSwKLXsgICAgImN2dHdsIiwJeyJyd3dsIiwJCTB4MjMJfSB9LAoteyAgICAic3RmIiwgICAgIHsid2wiLCAgICAgICAgICAgICAgICAgIDB4MjYgICAgfSB9LAoteyAgICAic3RkIiwgICAgIHsid3EiLCAgICAgICAgICAgICAgICAgIDB4MjcgICAgfSB9LAoteyAgICAic3ViYjIiLAl7InJibWIiLAkJMHgyOAl9IH0sCi17ICAgICJtY29tYiIsCXsicmJ3YiIsCQkweDI5CX0gfSwKLXsgICAgInN1YncyIiwJeyJyd213IiwJCTB4MmEJfSB9LAoteyAgICAibWNvbXciLAl7InJ3d3ciLAkJMHgyYgl9IH0sCi17ICAgICJzdWJsMiIsICAgeyJybG1sIiwgICAgICAgICAgICAgICAgMHgyYyAgICB9IH0sCi17ICAgICJtY29tbCIsICAgeyJybHdsIiwgICAgICAgICAgICAgICAgMHgyZCAgICB9IH0sCi17ICAgICJlbXVsIiwJeyJybHJscmx3cSIsCQkweDJlCX0gfSwKLXsgICAgImFvYmxzcyIsCXsicmxtbGJ3IiwJCTB4MmYJfSB9LAoteyAgICAiYnB0IiwJeyIiLAkJCTB4MzAJfSB9LAoteyAgICAiYmVxbCIsCXsiYmIiLAkJCTB4MzEJfSB9LAoteyAgICAiYmVxbHUiLAl7ImJiIiwJCQkweDMxCX0gfSwKLXsgICAgImN2dHdiIiwJeyJyd3diIiwJCTB4MzMJfSB9LAoteyAgICAibG9nZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4MzUgICAgfSB9LAoteyAgICAiY21wZiIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4MzYgICAgfSB9LAoteyAgICAiY21wZCIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4MzcgICAgfSB9LAoteyAgICAic3ViYjMiLAl7InJicmJ3YiIsCQkweDM4CX0gfSwKLXsgICAgImJpdGIiLAl7InJicmIiLAkJMHgzOQl9IH0sCi17ICAgICJzdWJ3MyIsCXsicndyd3d3IiwJCTB4M2EJfSB9LAoteyAgICAiYml0dyIsCXsicndydyIsCQkweDNiCX0gfSwKLXsgICAgInN1YmwzIiwJeyJybHJsd2wiLAkJMHgzYwl9IH0sCi17ICAgICJiaXRsIiwJeyJybHJsIiwJCTB4M2QJfSB9LAoteyAgICAiZWRpdiIsCXsicmxycXdsd2wiLAkJMHgzZQl9IH0sCi17ICAgICJhb2JsZXEiLAl7InJsbWxidyIsCQkweDNmCX0gfSwKLXsgICAgInJldCIsCXsiIiwJCQkweDQwCX0gfSwKLXsgICAgImJndHIiLAl7ImJiIiwJCQkweDQxCX0gfSwKLXsgICAgInNxcnRmIiwgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDQ1ICAgIH0gfSwKLXsgICAgImNtcGYyIiwgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDQ2ICAgIH0gfSwKLXsgICAgImNtcGQyIiwgICB7InJxcnEiLCAgICAgICAgICAgICAgICAweDQ3ICAgIH0gfSwKLXsgICAgInNobGwiLCAgICB7InJicmx3bCIsICAgICAgICAgICAgICAweDQ4ICAgIH0gfSwKLXsgICAgImNscmIiLAl7IndiIiwJCQkweDQ5CX0gfSwKLXsgICAgInNobHEiLAl7InJicnF3cSIsCQkweDRhCX0gfSwKLXsgICAgImNscnciLAl7Ind3IiwJCQkweDRiCX0gfSwKLXsgICAgIm11bGwyIiwJeyJybG1sIiwJCTB4NGMJfSB9LAoteyAgICAiY2xybCIsCXsid2wiLAkJCTB4NGQJfSB9LAoteyAgICAic2hhbCIsICAgIHsicmJybHdsIiwJCTB4NGUJfSB9LAoteyAgICAiYmxlcSIsCXsiYmIiLAkJCTB4NTEJfSB9LAoteyAgICAiZXhwZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4NTUgICAgfSB9LAoteyAgICAidHN0ZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4NTYgICAgfSB9LAoteyAgICAidHN0ZCIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4NTcgICAgfSB9LAoteyAgICAic2hybCIsICAgIHsicmJybHdsIiwJCTB4NTgJfSB9LAoteyAgICAidHN0YiIsCXsicmIiLAkJCTB4NTkJfSB9LAoteyAgICAic2hycSIsICAgIHsicmJycXdxIiwJCTB4NWEJfSB9LAoteyAgICAidHN0dyIsCXsicnciLAkJCTB4NWIJfSB9LAoteyAgICAibXVsbDMiLAl7InJscmx3bCIsCQkweDVjCX0gfSwKLXsgICAgInRzdGwiLAl7InJsIiwJCQkweDVkCX0gfSwKLXsgICAgInNoYXIiLAl7InJicmx3bCIsCQkweDVlCX0gfSwKLXsgICAgImJic3NpIiwJeyJybG1sYnciLAkJMHg1Zgl9IH0sCi17ICAgICJsZHBjdHgiLAl7IiIsCQkJMHg2MAl9IH0sCi17ICAgICJwdXNoZCIsICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHg2NyAgICB9IH0sCi17ICAgICJpbmNiIiwJeyJtYiIsCQkJMHg2OQl9IH0sCi17ICAgICJpbmN3IiwJeyJtdyIsCQkJMHg2Ygl9IH0sCi17ICAgICJkaXZsMiIsCXsicmxtbCIsCQkweDZjCX0gfSwKLXsgICAgImluY2wiLAl7Im1sIiwJCQkweDZkCX0gfSwKLXsgICAgImN2dGxiIiwJeyJybHdiIiwJCTB4NmYJfSB9LAoteyAgICAic3ZwY3R4IiwJeyIiLAkJCTB4NzAJfSB9LAoteyAgICAiam1wIiwJeyJhYiIsCQkJMHg3MQl9IH0sCi17ICAgICJjdmxmIiwgICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHg3NiAgICB9IH0sCi17ICAgICJjdmxkIiwgICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHg3NyAgICB9IH0sCi17ICAgICJkZWNiIiwJeyJtYiIsCQkJMHg3OQl9IH0sCi17ICAgICJkZWN3IiwJeyJtdyIsCQkJMHg3Ygl9IH0sCi17ICAgICJkaXZsMyIsCXsicmxybHdsIiwJCTB4N2MJfSB9LAoteyAgICAiZGVjbCIsCXsibWwiLAkJCTB4N2QJfSB9LAoteyAgICAiY3Z0bHciLAl7InJsd3ciLAkJMHg3Zgl9IH0sCi17ICAgICJiZ2VxIiwJeyJiYiIsCQkJMHg4MQl9IH0sCi17ICAgICJtb3ZzMiIsCXsiYWJhYiIsCQkweDgyCX0gfSwKLXsgICAgImN2ZmwiLCAgICB7IndsIiwgICAgICAgICAgICAgICAgICAweDg2ICAgIH0gfSwKLXsgICAgImN2ZGwiLCAgICB7IndsIiwgICAgICAgICAgICAgICAgICAweDg3ICAgIH0gfSwKLXsgICAgIm9yYjIiLAl7InJibWIiLAkJMHg4OAl9IH0sCi17ICAgICJjdnRibCIsCXsicmJ3bCIsCQkweDg5CX0gfSwKLXsgICAgIm9ydzIiLAl7InJ3bXciLAkJMHg4YQl9IH0sCi17ICAgICJiaXNwc3ciLAl7InJ3IiwJCQkweDhiCX0gfSwKLXsgICAgIm9ybDIiLCAgICB7InJsbWwiLCAgICAgICAgICAgICAgICAweDhjICAgIH0gfSwKLXsgICAgImFkd2MiLAl7InJsbWwiLAkJMHg4ZAl9IH0sCi17ICAgICJhZGRhIiwgCXsicmxtbCIsCQkweDhlCX0gfSwKLXsgICAgImJsc3MiLAl7ImJiIiwJCQkweDkxCX0gfSwKLXsgICAgImNtcHMyIiwgICB7ImFiYWIiLAkJMHg5Mgl9IH0sCi17ICAgICJsZGZkIiwgICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHg5NyAgICB9IH0sCi17ICAgICJvcmIzIiwJeyJyYnJid2IiLAkJMHg5OAl9IH0sCi17ICAgICJjdnRidyIsCXsicmJ3dyIsCQkweDk5CX0gfSwKLXsgICAgIm9ydzMiLCAgIAl7InJ3cnd3dyIsCQkweDlhCX0gfSwKLXsgICAgImJpY3BzdyIsCXsicnciLAkJCTB4OWIJfSB9LAoteyAgICAib3JsMyIsICAgIHsicmxybHdsIiwgICAgICAgICAgICAgIDB4OWMgICAgfSB9LAoteyAgICAic2J3YyIsCXsicmxtbCIsCQkweDlkCX0gfSwKLXsgICAgInN1YmEiLCAgICB7InJsbWwiLCAgICAgICAgICAgICAgICAweDllICAgIH0gfSwKLXsgICAgImJndHJ1IiwJeyJiYiIsCQkJMHhhMQl9IH0sCi17ICAgICJjdmRmIiwgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHhhNiAgICB9IH0sCi17ICAgICJhbmRiMiIsICAgeyJyYm1iIiwJCTB4YTggICAgfSB9LAoteyAgICAibW92emJsIiwJeyJyYndsIiwJCTB4YTkJfSB9LAoteyAgICAiYW5kdzIiLCAgIHsicndtdyIsCQkweGFhICAgIH0gfSwKLXsgICAgImxvYWRyIiwgICB7InJ3YWwiLAkJMHhhYgl9IH0sCi17ICAgICJhbmRsMiIsICAgeyJybG1sIiwJCTB4YWMgICAgfSB9LAoteyAgICAibXRwciIsCXsicmxybCIsCQkweGFkCX0gfSwKLXsgICAgImZmcyIsCXsicmx3bCIsCQkweGFlCX0gfSwKLXsgICAgImJsZXF1IiwJeyJiYiIsCQkJMHhiMQl9IH0sCi17ICAgICJuZWdmIiwgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHhiNiAgICB9IH0sCi17ICAgICJuZWdkIiwgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHhiNyAgICB9IH0sCi17ICAgICJhbmRiMyIsICAgeyJyYnJid2IiLCAgICAgICAgICAgICAgMHhiOCAgICB9IH0sCi17ICAgICJtb3Z6YnciLAl7InJid3ciLAkJMHhiOQl9IH0sCi17ICAgICJhbmR3MyIsICAgeyJyd3J3d3ciLAkJMHhiYSAgICB9IH0sCi17ICAgICJzdG9yZXIiLCAgeyJyd2FsIiwgICAgICAgICAgICAgICAgMHhiYiAgICB9IH0sCi17ICAgICJhbmRsMyIsICAgeyJybHJsd2wiLAkJMHhiYyAgICB9IH0sCi17ICAgICJtZnByIiwJeyJybHdsIiwJCTB4YmQJfSB9LAoteyAgICAiZmZjIiwJeyJybHdsIiwJCTB4YmUJfSB9LAoteyAgICAiY2FsbHMiLAl7InJiYWIiLAkJMHhiZgl9IH0sCi17ICAgICJwcm9iZXIiLAl7InJiYWJybCIsCQkweGMwCX0gfSwKLXsgICAgImJ2YyIsCXsiYmIiLAkJCTB4YzEJfSB9LAoteyAgICAibW92czMiLAl7ImFiYWJydyIsCQkweGMyCX0gfSwKLXsgICAgIm1vdnp3bCIsCXsicnd3bCIsCQkweGMzCX0gfSwKLXsgICAgImFkZGYiLCAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweGM2ICAgIH0gfSwKLXsgICAgImFkZGQiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweGM3ICAgIH0gfSwKLXsgICAgInhvcmIyIiwgICB7InJibWIiLCAgICAgICAgICAgICAgICAweGM4ICAgIH0gfSwKLXsgICAgIm1vdm9iIiwgICB7InJid2IiLCAgICAgICAgICAgICAgICAweGM5ICAgIH0gfSwKLXsgICAgInhvcncyIiwgICB7InJ3bXciLCAgICAgICAgICAgICAgICAweGNhICAgIH0gfSwKLXsgICAgIm1vdm93IiwgICB7InJ3d3ciLCAgICAgICAgICAgICAgICAweGNiCX0gfSwKLXsgICAgInhvcmwyIiwJeyJybG1sIiwgICAgICAgICAgICAgICAgMHhjYyAgICB9IH0sCi17ICAgICJtb3Zwc2wiLCAgeyJ3bCIsICAgICAgICAgICAgICAgICAgMHhjZCAgICB9IH0sCi17ICAgICJrY2FsbCIsICAgeyJydyIsCQkJMHhjZgl9IH0sCi17ICAgICJwcm9iZXciLCAgeyJyYmFicmwiLAkJMHhkMAl9IH0sCi17ICAgICJidnMiLCAgICAgeyJiYiIsCQkJMHhkMQl9IH0sCi17ICAgICJjbXBzMyIsICAgeyJhYmFicnciLAkJMHhkMgl9IH0sCi17ICAgICJzdWJmIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhkNiAgICB9IH0sCi17ICAgICJzdWJkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhkNyAgICB9IH0sCi17ICAgICJ4b3JiMyIsCXsicmJyYndiIiwJCTB4ZDgJfSB9LAoteyAgICAicHVzaGIiLCAgIHsicmIiLAkJCTB4ZDkJfSB9LAoteyAgICAieG9ydzMiLAl7InJ3cnd3dyIsCQkweGRhCX0gfSwKLXsgICAgInB1c2h3IiwgICB7InJ3IiwgCQkJMHhkYgl9IH0sCi17ICAgICJ4b3JsMyIsCXsicmxybHdsIiwJCTB4ZGMJfSB9LAoteyAgICAicHVzaGwiLAl7InJsIiwJCQkweGRkCX0gfSwKLXsgICAgImluc3F1ZSIsCXsiYWJhYiIsCQkweGUwCX0gfSwKLXsgICAgImJjcyIsCXsiYmIiLAkJCTB4ZTEJfSB9LAoteyAgICAiYmdlcXUiLAl7ImJiIiwJCQkweGUxCX0gfSwKLXsgICAgIm11bGYiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweGU2ICAgIH0gfSwKLXsgICAgIm11bGQiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweGU3ICAgIH0gfSwKLXsgICAgIm1uZWdiIiwJeyJyYndiIiwJCTB4ZTgJfSB9LAoteyAgICAibW92YWIiLAl7ImFid2wiLAkJMHhlOQl9IH0sCi17ICAgICJtbmVndyIsCXsicnd3dyIsCQkweGVhCX0gfSwKLXsgICAgIm1vdmF3IiwJeyJhd3dsIiwJCTB4ZWIJfSB9LAoteyAgICAibW5lZ2wiLAl7InJsd2wiLAkJMHhlYwl9IH0sCi17ICAgICJtb3ZhbCIsCXsiYWx3bCIsCQkweGVkCX0gfSwKLXsgICAgInJlbXF1ZSIsCXsiYWIiLCAgCQkweGYwCX0gfSwKLXsgICAgImJjYyIsCXsiYmIiLAkJCTB4ZjEJfSB9LAoteyAgICAiYmxzc3UiLAl7ImJiIiwJCQkweGYxCX0gfSwKLXsgICAgImRpdmYiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweGY2ICAgIH0gfSwKLXsgICAgImRpdmQiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweGY3ICAgIH0gfSwKLXsgICAgIm1vdmJsayIsICB7ImFsYWxydyIsICAgICAgICAgICAgICAweGY4CX0gfSwKLXsgICAgInB1c2hhYiIsCXsiYWIiLAkJCTB4ZjkJfSB9LAoteyAgICAicHVzaGF3IiwJeyJhdyIsCQkJMHhmYgl9IH0sCi17ICAgICJjYXNlbCIsCXsicmxybHJsIiwJCTB4ZmMJfSB9LAoteyAgICAicHVzaGFsIiwJeyJhbCIsCQkJMHhmZAl9IH0sCi17ICAgICJjYWxsZiIsCXsicmJhYiIsCQkweGZlCX0gfSwKLXsgICAgICAiIiAgICAgICAsICAgIiIgICAgICAgICAgfSAvKiBlbXB0eSBpcyBlbmQgc2VudGluZWwgKi8KLQotfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3RpYzMwLmggYi9pbmNsdWRlL29wY29kZS90aWMzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzAwMjc1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3RpYzMwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OTEgKzAsMCBAQAotLyogdGljMzAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVEkgVE1TMzIwQzMwIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRklYTUU6IFRoZSBvcGNvZGUgdGFibGUgc2hvdWxkIGJlIGluIG9wY29kZXMvdGljMzAtb3BjLmMsIG5vdCBpbiBhCi0gICBoZWFkZXIgZmlsZS4gICovCi0KLSNpZm5kZWYgX1RNUzMyMF9IXwotI2RlZmluZSBfVE1TMzIwX0hfCi0KLXN0cnVjdCBfcmVnaXN0ZXIKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgY2hhciBvcGNvZGU7Ci0gIHVuc2lnbmVkIGNoYXIgcmVndHlwZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IF9yZWdpc3RlciByZWc7Ci0KLSNkZWZpbmUgUkVHX1JuICAgIDB4MDEKLSNkZWZpbmUgUkVHX0FSbiAgIDB4MDIKLSNkZWZpbmUgUkVHX0RQICAgIDB4MDMKLSNkZWZpbmUgUkVHX09USEVSIDB4MDQKLQotc3RhdGljIGNvbnN0IHJlZyB0aWMzMF9yZWd0YWJbXSA9IHsKLSAgeyAicjAiLCAweDAwLCBSRUdfUm4gfSwKLSAgeyAicjEiLCAweDAxLCBSRUdfUm4gfSwKLSAgeyAicjIiLCAweDAyLCBSRUdfUm4gfSwKLSAgeyAicjMiLCAweDAzLCBSRUdfUm4gfSwKLSAgeyAicjQiLCAweDA0LCBSRUdfUm4gfSwKLSAgeyAicjUiLCAweDA1LCBSRUdfUm4gfSwKLSAgeyAicjYiLCAweDA2LCBSRUdfUm4gfSwKLSAgeyAicjciLCAweDA3LCBSRUdfUm4gfSwKLSAgeyAiYXIwIiwweDA4LCBSRUdfQVJuIH0sCi0gIHsgImFyMSIsMHgwOSwgUkVHX0FSbiB9LAotICB7ICJhcjIiLDB4MEEsIFJFR19BUm4gfSwKLSAgeyAiYXIzIiwweDBCLCBSRUdfQVJuIH0sCi0gIHsgImFyNCIsMHgwQywgUkVHX0FSbiB9LAotICB7ICJhcjUiLDB4MEQsIFJFR19BUm4gfSwKLSAgeyAiYXI2IiwweDBFLCBSRUdfQVJuIH0sCi0gIHsgImFyNyIsMHgwRiwgUkVHX0FSbiB9LAotICB7ICJkcCIsIDB4MTAsIFJFR19EUCB9LAotICB7ICJpcjAiLDB4MTEsIFJFR19PVEhFUiB9LAotICB7ICJpcjEiLDB4MTIsIFJFR19PVEhFUiB9LAotICB7ICJiayIsIDB4MTMsIFJFR19PVEhFUiB9LAotICB7ICJzcCIsIDB4MTQsIFJFR19PVEhFUiB9LAotICB7ICJzdCIsIDB4MTUsIFJFR19PVEhFUiB9LAotICB7ICJpZSIsIDB4MTYsIFJFR19PVEhFUiB9LAotICB7ICJpZiIsIDB4MTcsIFJFR19PVEhFUiB9LAotICB7ICJpb2YiLDB4MTgsIFJFR19PVEhFUiB9LAotICB7ICJycyIsIDB4MTksIFJFR19PVEhFUiB9LAotICB7ICJyZSIsIDB4MUEsIFJFR19PVEhFUiB9LAotICB7ICJyYyIsIDB4MUIsIFJFR19PVEhFUiB9LAotICB7ICJSMCIsIDB4MDAsIFJFR19SbiB9LAotICB7ICJSMSIsIDB4MDEsIFJFR19SbiB9LAotICB7ICJSMiIsIDB4MDIsIFJFR19SbiB9LAotICB7ICJSMyIsIDB4MDMsIFJFR19SbiB9LAotICB7ICJSNCIsIDB4MDQsIFJFR19SbiB9LAotICB7ICJSNSIsIDB4MDUsIFJFR19SbiB9LAotICB7ICJSNiIsIDB4MDYsIFJFR19SbiB9LAotICB7ICJSNyIsIDB4MDcsIFJFR19SbiB9LAotICB7ICJBUjAiLDB4MDgsIFJFR19BUm4gfSwKLSAgeyAiQVIxIiwweDA5LCBSRUdfQVJuIH0sCi0gIHsgIkFSMiIsMHgwQSwgUkVHX0FSbiB9LAotICB7ICJBUjMiLDB4MEIsIFJFR19BUm4gfSwKLSAgeyAiQVI0IiwweDBDLCBSRUdfQVJuIH0sCi0gIHsgIkFSNSIsMHgwRCwgUkVHX0FSbiB9LAotICB7ICJBUjYiLDB4MEUsIFJFR19BUm4gfSwKLSAgeyAiQVI3IiwweDBGLCBSRUdfQVJuIH0sCi0gIHsgIkRQIiwgMHgxMCwgUkVHX0RQIH0sCi0gIHsgIklSMCIsMHgxMSwgUkVHX09USEVSIH0sCi0gIHsgIklSMSIsMHgxMiwgUkVHX09USEVSIH0sCi0gIHsgIkJLIiwgMHgxMywgUkVHX09USEVSIH0sCi0gIHsgIlNQIiwgMHgxNCwgUkVHX09USEVSIH0sCi0gIHsgIlNUIiwgMHgxNSwgUkVHX09USEVSIH0sCi0gIHsgIklFIiwgMHgxNiwgUkVHX09USEVSIH0sCi0gIHsgIklGIiwgMHgxNywgUkVHX09USEVSIH0sCi0gIHsgIklPRiIsMHgxOCwgUkVHX09USEVSIH0sCi0gIHsgIlJTIiwgMHgxOSwgUkVHX09USEVSIH0sCi0gIHsgIlJFIiwgMHgxQSwgUkVHX09USEVSIH0sCi0gIHsgIlJDIiwgMHgxQiwgUkVHX09USEVSIH0sCi0gIHsgIiIsICAgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgcmVnICpjb25zdCB0aWMzMF9yZWd0YWJfZW5kCi0gID0gdGljMzBfcmVndGFiICsgc2l6ZW9mKHRpYzMwX3JlZ3RhYikvc2l6ZW9mKHRpYzMwX3JlZ3RhYlswXSk7Ci0KLS8qIEluZGlyZWN0IEFkZHJlc3NpbmcgTW9kZXMgTW9kaWZpY2F0aW9uIEZpZWxkcyAqLwotLyogSW5kaXJlY3QgQWRkcmVzc2luZyB3aXRoIERpc3BsYWNlbWVudCAqLwotI2RlZmluZSBQcmVEaXNwX0FkZCAgICAgICAgMHgwMAotI2RlZmluZSBQcmVEaXNwX1N1YiAgICAgICAgMHgwMQotI2RlZmluZSBQcmVEaXNwX0FkZF9Nb2QgICAgMHgwMgotI2RlZmluZSBQcmVEaXNwX1N1Yl9Nb2QgICAgMHgwMwotI2RlZmluZSBQb3N0RGlzcF9BZGRfTW9kICAgMHgwNAotI2RlZmluZSBQb3N0RGlzcF9TdWJfTW9kICAgMHgwNQotI2RlZmluZSBQb3N0RGlzcF9BZGRfQ2lyYyAgMHgwNgotI2RlZmluZSBQb3N0RGlzcF9TdWJfQ2lyYyAgMHgwNwotLyogSW5kaXJlY3QgQWRkcmVzc2luZyB3aXRoIEluZGV4IFJlZ2lzdGVyIElSMCAqLwotI2RlZmluZSBQcmVJUjBfQWRkICAgICAgICAgMHgwOAotI2RlZmluZSBQcmVJUjBfU3ViICAgICAgICAgMHgwOQotI2RlZmluZSBQcmVJUjBfQWRkX01vZCAgICAgMHgwQQotI2RlZmluZSBQcmVJUjBfU3ViX01vZCAgICAgMHgwQgotI2RlZmluZSBQb3N0SVIwX0FkZF9Nb2QgICAgMHgwQwotI2RlZmluZSBQb3N0SVIwX1N1Yl9Nb2QgICAgMHgwRAotI2RlZmluZSBQb3N0SVIwX0FkZF9DaXJjICAgMHgwRQotI2RlZmluZSBQb3N0SVIwX1N1Yl9DaXJjICAgMHgwRgotLyogSW5kaXJlY3QgQWRkcmVzc2luZyB3aXRoIEluZGV4IFJlZ2lzdGVyIElSMSAqLwotI2RlZmluZSBQcmVJUjFfQWRkICAgICAgICAgMHgxMAotI2RlZmluZSBQcmVJUjFfU3ViICAgICAgICAgMHgxMQotI2RlZmluZSBQcmVJUjFfQWRkX01vZCAgICAgMHgxMgotI2RlZmluZSBQcmVJUjFfU3ViX01vZCAgICAgMHgxMwotI2RlZmluZSBQb3N0SVIxX0FkZF9Nb2QgICAgMHgxNAotI2RlZmluZSBQb3N0SVIxX1N1Yl9Nb2QgICAgMHgxNQotI2RlZmluZSBQb3N0SVIxX0FkZF9DaXJjICAgMHgxNgotI2RlZmluZSBQb3N0SVIxX1N1Yl9DaXJjICAgMHgxNwotLyogSW5kaXJlY3QgQWRkcmVzc2luZyAoU3BlY2lhbCBDYXNlcykgKi8KLSNkZWZpbmUgSW5kaXJlY3RPbmx5ICAgICAgIDB4MTgKLSNkZWZpbmUgUG9zdElSMF9BZGRfQml0UmV2IDB4MTkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICpzeW50YXg7Ci0gIHVuc2lnbmVkIGNoYXIgbW9kZmllbGQ7Ci0gIHVuc2lnbmVkIGNoYXIgZGlzcGxhY2VtZW50OwotfSBpbmRfYWRkcl90eXBlOwotCi0jZGVmaW5lIElNUExJRURfRElTUCAgMHgwMQotI2RlZmluZSBESVNQX1JFUVVJUkVEIDB4MDIKLSNkZWZpbmUgTk9fRElTUCAgICAgICAweDAzCi0KLXN0YXRpYyBjb25zdCBpbmRfYWRkcl90eXBlIHRpYzMwX2luZGFkZHJfdGFiW10gPSB7Ci0gIHsgIiorYXIiLCAgICAgICBQcmVEaXNwX0FkZCwgICAgICAgIElNUExJRURfRElTUCB9LAotICB7ICIqLWFyIiwgICAgICAgUHJlRGlzcF9TdWIsICAgICAgICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKisrYXIiLCAgICAgIFByZURpc3BfQWRkX01vZCwgICAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiotLWFyIiwgICAgICBQcmVEaXNwX1N1Yl9Nb2QsICAgIElNUExJRURfRElTUCB9LAotICB7ICIqYXIrKyIsICAgICAgUG9zdERpc3BfQWRkX01vZCwgICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKmFyLS0iLCAgICAgIFBvc3REaXNwX1N1Yl9Nb2QsICAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiphcisrJSIsICAgICBQb3N0RGlzcF9BZGRfQ2lyYywgIElNUExJRURfRElTUCB9LAotICB7ICIqYXItLSUiLCAgICAgUG9zdERpc3BfU3ViX0NpcmMsICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKithcigpIiwgICAgIFByZURpc3BfQWRkLCAgICAgICAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqLWFyKCkiLCAgICAgUHJlRGlzcF9TdWIsICAgICAgICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiorK2FyKCkiLCAgICBQcmVEaXNwX0FkZF9Nb2QsICAgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKi0tYXIoKSIsICAgIFByZURpc3BfU3ViX01vZCwgICAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqYXIrKygpIiwgICAgUG9zdERpc3BfQWRkX01vZCwgICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiphci0tKCkiLCAgICBQb3N0RGlzcF9TdWJfTW9kLCAgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKmFyKysoKSUiLCAgIFBvc3REaXNwX0FkZF9DaXJjLCAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqYXItLSgpJSIsICAgUG9zdERpc3BfU3ViX0NpcmMsICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiorYXIoaXIwKSIsICBQcmVJUjBfQWRkLCAgICAgICAgIE5PX0RJU1AgfSwKLSAgeyAiKi1hcihpcjApIiwgIFByZUlSMF9TdWIsICAgICAgICAgTk9fRElTUCB9LAotICB7ICIqKythcihpcjApIiwgUHJlSVIwX0FkZF9Nb2QsICAgICBOT19ESVNQIH0sCi0gIHsgIiotLWFyKGlyMCkiLCBQcmVJUjBfU3ViX01vZCwgICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyKysoaXIwKSIsIFBvc3RJUjBfQWRkX01vZCwgICAgTk9fRElTUCB9LAotICB7ICIqYXItLShpcjApIiwgUG9zdElSMF9TdWJfTW9kLCAgICBOT19ESVNQIH0sCi0gIHsgIiphcisrKGlyMCklIixQb3N0SVIwX0FkZF9DaXJjLCAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyLS0oaXIwKSUiLFBvc3RJUjBfU3ViX0NpcmMsICAgTk9fRElTUCB9LAotICB7ICIqK2FyKGlyMSkiLCAgUHJlSVIxX0FkZCwgICAgICAgICBOT19ESVNQIH0sCi0gIHsgIiotYXIoaXIxKSIsICBQcmVJUjFfU3ViLCAgICAgICAgIE5PX0RJU1AgfSwKLSAgeyAiKisrYXIoaXIxKSIsIFByZUlSMV9BZGRfTW9kLCAgICAgTk9fRElTUCB9LAotICB7ICIqLS1hcihpcjEpIiwgUHJlSVIxX1N1Yl9Nb2QsICAgICBOT19ESVNQIH0sCi0gIHsgIiphcisrKGlyMSkiLCBQb3N0SVIxX0FkZF9Nb2QsICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyLS0oaXIxKSIsIFBvc3RJUjFfU3ViX01vZCwgICAgTk9fRElTUCB9LAotICB7ICIqYXIrKyhpcjEpJSIsUG9zdElSMV9BZGRfQ2lyYywgICBOT19ESVNQIH0sCi0gIHsgIiphci0tKGlyMSklIixQb3N0SVIxX1N1Yl9DaXJjLCAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyIiwgICAgICAgIEluZGlyZWN0T25seSwgICAgICAgTk9fRElTUCB9LAotICB7ICIqYXIrKyhpcjApYiIsUG9zdElSMF9BZGRfQml0UmV2LCBOT19ESVNQIH0sCi0gIHsgIiIsICAgICAgICAgICAwLDAgfQotfTsKLQotc3RhdGljIGNvbnN0IGluZF9hZGRyX3R5cGUgKmNvbnN0IHRpYzMwX2luZGFkZHJ0YWJfZW5kCi0gID0gdGljMzBfaW5kYWRkcl90YWIgKyBzaXplb2YodGljMzBfaW5kYWRkcl90YWIpL3NpemVvZih0aWMzMF9pbmRhZGRyX3RhYlswXSk7Ci0KLS8qIFBvc3NpYmxlIG9wZXJhbmQgdHlwZXMgKi8KLS8qIFJlZ2lzdGVyIHR5cGVzICovCi0jZGVmaW5lIFJuICAgICAgIDB4MDAwMQotI2RlZmluZSBBUm4gICAgICAweDAwMDIKLSNkZWZpbmUgRFBSZWcgICAgMHgwMDA0Ci0jZGVmaW5lIE90aGVyUmVnIDB4MDAwOAotLyogQWRkcmVzc2luZyBtb2RlIHR5cGVzICovCi0jZGVmaW5lIERpcmVjdCAgIDB4MDAxMAotI2RlZmluZSBJbmRpcmVjdCAweDAwMjAKLSNkZWZpbmUgSW1tMTYgICAgMHgwMDQwCi0jZGVmaW5lIERpc3AgICAgIDB4MDA4MAotI2RlZmluZSBJbW0yNCAgICAweDAxMDAKLSNkZWZpbmUgQWJzMjQgICAgMHgwMjAwCi0vKiAzIG9wZXJhbmQgYWRkcmVzc2luZyBtb2RlIHR5cGVzICovCi0jZGVmaW5lIG9wM1QxICAgIDB4MDQwMAotI2RlZmluZSBvcDNUMiAgICAweDA4MDAKLS8qIEludGVycnVwdCB2ZWN0b3IgKi8KLSNkZWZpbmUgSVZlY3RvciAgMHgxMDAwCi0vKiBOb3QgcmVxdWlyZWQgKi8KLSNkZWZpbmUgTm90UmVxICAgMHgyMDAwCi0KLSNkZWZpbmUgR0FkZHIxICAgUm4gfCBEaXJlY3QgfCBJbmRpcmVjdCB8IEltbTE2Ci0jZGVmaW5lIEdBZGRyMiAgIEdBZGRyMSB8IEFsbFJlZwotI2RlZmluZSBUQWRkcjEgICBvcDNUMSB8IFJuIHwgSW5kaXJlY3QKLSNkZWZpbmUgVEFkZHIyICAgb3AzVDIgfCBSbiB8IEluZGlyZWN0Ci0jZGVmaW5lIFJlZyAgICAgIFJuIHwgQVJuCi0jZGVmaW5lIEFsbFJlZyAgIFJlZyB8IERQUmVnIHwgT3RoZXJSZWcKLQotdHlwZWRlZiBzdHJ1Y3QgX3RlbXBsYXRlCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGludCBvcGVyYW5kczsgLyogaG93IG1hbnkgb3BlcmFuZHMgKi8KLSAgdW5zaWduZWQgaW50IGJhc2Vfb3Bjb2RlOyAvKiBiYXNlX29wY29kZSBpcyB0aGUgZnVuZGFtZW50YWwgb3Bjb2RlIGJ5dGUgKi8KLSAgLyogdGhlIGJpdHMgaW4gb3Bjb2RlX21vZGlmaWVyIGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBmaW5hbCBvcGNvZGUgZnJvbQotICAgICB0aGUgYmFzZV9vcGNvZGUuICBUaGVzZSBiaXRzIGFsc28gYXJlIHVzZWQgdG8gZGV0ZWN0IGFsdGVybmF0ZSBmb3JtcyBvZgotICAgICB0aGUgc2FtZSBpbnN0cnVjdGlvbiAqLwotICB1bnNpZ25lZCBpbnQgb3Bjb2RlX21vZGlmaWVyOwotCi0gIC8qIG9wY29kZV9tb2RpZmllciBiaXRzOiAqLwotI2RlZmluZSBBZGRyZXNzTW9kZSAweDAwNjAwMDAwCi0jZGVmaW5lIFBDUmVsICAgICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgU3RhY2tPcCAgICAgMHgwMDFGMDAwMAotI2RlZmluZSBSb3RhdGUgICAgICBTdGFja09wCi0gIAotICAvKiBvcGVyYW5kX3R5cGVzW2ldIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBvcGVyYW5kIGkuICBUaGlzIGlzIG1hZGUKLSAgICAgYnkgT1InaW5nIHRvZ2V0aGVyIGFsbCBvZiB0aGUgcG9zc2libGUgdHlwZSBtYXNrcy4gIChlLmcuCi0gICAgICdvcGVyYW5kX3R5cGVzW2ldID0gUmVnfEltbScgc3BlY2lmaWVzIHRoYXQgb3BlcmFuZCBpIGNhbiBiZQotICAgICBlaXRoZXIgYSByZWdpc3RlciBvciBhbiBpbW1lZGlhdGUgb3BlcmFuZCAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZF90eXBlc1szXTsKLSAgLyogVGhpcyBkZWZpbmVzIHRoZSBudW1iZXIgdHlwZSBvZiBhbiBpbW1lZGlhdGUgYXJndW1lbnQgdG8gYW4gaW5zdHJ1Y3Rpb24uICovCi0gIGludCBpbW1fYXJnX3R5cGU7Ci0jZGVmaW5lIEltbV9Ob25lICAwCi0jZGVmaW5lIEltbV9GbG9hdCAxCi0jZGVmaW5lIEltbV9TSW50ICAyCi0jZGVmaW5lIEltbV9VSW50ICAzCi19Ci10ZW1wbGF0ZTsKLQotc3RhdGljIGNvbnN0IHRlbXBsYXRlIHRpYzMwX29wdGFiW10gPSB7Ci0gIHsgImFic2YiICAgLDIsMHgwMDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJhYnNpIiAgICwyLDB4MDA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAiYWRkYyIgICAsMiwweDAxMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImFkZGMzIiAgLDMsMHgyMDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAiYWRkZiIgICAsMiwweDAxODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImFkZGYzIiAgLDMsMHgyMDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgUm4gfSwgSW1tX05vbmUgfSwKLSAgeyAiYWRkaSIgICAsMiwweDAyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImFkZGkzIiAgLDMsMHgyMTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAiYW5kIiAgICAsMiwweDAyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImFuZDMiICAgLDMsMHgyMTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAiYW5kbiIgICAsMiwweDAzMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImFuZG4zIiAgLDMsMHgyMjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAiYXNoIiAgICAsMiwweDAzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImFzaDMiICAgLDMsMHgyMjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAiYiIgICAgICAsMSwweDY4MDAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ1IiAgICAgLDEsMHg2ODAwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibG8iICAgICwxLDB4NjgwMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmxzIiAgICAsMSwweDY4MDIwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJoaSIgICAgLDEsMHg2ODAzMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiaHMiICAgICwxLDB4NjgwNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmVxIiAgICAsMSwweDY4MDUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuZSIgICAgLDEsMHg2ODA2MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibHQiICAgICwxLDB4NjgwNzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmxlIiAgICAsMSwweDY4MDgwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJndCIgICAgLDEsMHg2ODA5MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZ2UiICAgICwxLDB4NjgwQTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnoiICAgICAsMSwweDY4MDUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJueiIgICAgLDEsMHg2ODA2MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJicCIgICAgICwxLDB4NjgwOTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm4iICAgICAsMSwweDY4MDcwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJubiIgICAgLDEsMHg2ODBBMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnYiICAgICwxLDB4NjgwQzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnYiICAgICAsMSwweDY4MEQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJudWYiICAgLDEsMHg2ODBFMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJidWYiICAgICwxLDB4NjgwRjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5jIiAgICAsMSwweDY4MDQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJjIiAgICAgLDEsMHg2ODAxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmx2IiAgICwxLDB4NjgxMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx2IiAgICAsMSwweDY4MTEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJubHVmIiAgLDEsMHg2ODEyMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibHVmIiAgICwxLDB4NjgxMzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnp1ZiIgICAsMSwweDY4MTQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJkIiAgICAgLDEsMHg2ODIwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJidWQiICAgICwxLDB4NjgyMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmxvZCIgICAsMSwweDY4MjEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsc2QiICAgLDEsMHg2ODIyMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiaGlkIiAgICwxLDB4NjgyMzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmhzZCIgICAsMSwweDY4MjQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJlcWQiICAgLDEsMHg2ODI1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmVkIiAgICwxLDB4NjgyNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx0ZCIgICAsMSwweDY4MjcwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsZWQiICAgLDEsMHg2ODI4MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZ3RkIiAgICwxLDB4NjgyOTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmdlZCIgICAsMSwweDY4MkEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ6ZCIgICAgLDEsMHg2ODI1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnpkIiAgICwxLDB4NjgyNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnBkIiAgICAsMSwweDY4MjkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuZCIgICAgLDEsMHg2ODI3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibm5kIiAgICwxLDB4NjgyQTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm52ZCIgICAsMSwweDY4MkMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ2ZCIgICAgLDEsMHg2ODJEMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnVmZCIgICwxLDB4NjgyRTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnVmZCIgICAsMSwweDY4MkYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuY2QiICAgLDEsMHg2ODI0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiY2QiICAgICwxLDB4NjgyMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5sdmQiICAsMSwweDY4MzAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdmQiICAgLDEsMHg2ODMxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmx1ZmQiICwxLDB4NjgzMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx1ZmQiICAsMSwweDY4MzMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ6dWZkIiAgLDEsMHg2ODM0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiciIgICAgICwxLDB4NjAwMDAwMDAsMCwgICAgICAgICAgIHsgSW1tMjQsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiYnJkIiAgICAsMSwweDYxMDAwMDAwLDAsICAgICAgICAgICB7IEltbTI0LCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGwiICAgLDEsMHg2MjAwMDAwMCwwLCAgICAgICAgICAgeyBJbW0yNCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsdSIgICwxLDB4NzAwMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGxvIiAsMSwweDcwMDEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxscyIgLDEsMHg3MDAyMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsaGkiICwxLDB4NzAwMzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGhzIiAsMSwweDcwMDQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxlcSIgLDEsMHg3MDA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbmUiICwxLDB4NzAwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGx0IiAsMSwweDcwMDcwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsZSIgLDEsMHg3MDA4MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsZ3QiICwxLDB4NzAwOTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGdlIiAsMSwweDcwMEEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGx6IiAgLDEsMHg3MDA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbnoiICwxLDB4NzAwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbHAiICAsMSwweDcwMDkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxuIiAgLDEsMHg3MDA3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbm4iICwxLDB4NzAwQTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG52IiAsMSwweDcwMEMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGx2IiAgLDEsMHg3MDBEMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbnVmIiwxLDB4NzAwRTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbHVmIiAsMSwweDcwMEYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxuYyIgLDEsMHg3MDA0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsYyIgICwxLDB4NzAwMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5sdiIsMSwweDcwMTAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsdiIgLDEsMHg3MDExMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbmx1ZiIsMSwweDcwMTIwMDAwLFBDUmVsLCAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGx1ZiIsMSwweDcwMTMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGx6dWYiLDEsMHg3MDE0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjbXBmIiAgICwyLDB4MDQwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAiY21wZjMiICAsMiwweDIzMDAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMSwgVEFkZHIyLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImNtcGkiICAgLDIsMHgwNDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJjbXBpMyIgICwyLDB4MjM4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYiIgICAgICwyLDB4NkMwMDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnUiICAgICwyLDB4NkMwMDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmxvIiAgICwyLDB4NkMwMTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmxzIiAgICwyLDB4NkMwMjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmhpIiAgICwyLDB4NkMwMzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmhzIiAgICwyLDB4NkMwNDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmVxIiAgICwyLDB4NkMwNTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5lIiAgICwyLDB4NkMwNjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmx0IiAgICwyLDB4NkMwNzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmxlIiAgICwyLDB4NkMwODAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmd0IiAgICwyLDB4NkMwOTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmdlIiAgICwyLDB4NkMwQTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnoiICAgICwyLDB4NkMwNTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm56IiAgICwyLDB4NkMwNjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnAiICAgICwyLDB4NkMwOTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm4iICAgICwyLDB4NkMwNzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5uIiAgICwyLDB4NkMwQTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm52IiAgICwyLDB4NkMwQzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnYiICAgICwyLDB4NkMwRDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm51ZiIgICwyLDB4NkMwRTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnVmIiAgICwyLDB4NkMwRjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5jIiAgICwyLDB4NkMwNDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmMiICAgICwyLDB4NkMwMTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5sdiIgICwyLDB4NkMxMDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmx2IiAgICwyLDB4NkMxMTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5sdWYiICwyLDB4NkMxMjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmx1ZiIgICwyLDB4NkMxMzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnp1ZiIgICwyLDB4NkMxNDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmQiICAgICwyLDB4NkMyMDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnVkIiAgICwyLDB4NkMyMDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmxvZCIgICwyLDB4NkMyMTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmxzZCIgICwyLDB4NkMyMjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmhpZCIgICwyLDB4NkMyMzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmhzZCIgICwyLDB4NkMyNDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmVxZCIgICwyLDB4NkMyNTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5lZCIgICwyLDB4NkMyNjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmx0ZCIgICwyLDB4NkMyNzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmxlZCIgICwyLDB4NkMyODAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmd0ZCIgICwyLDB4NkMyOTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmdlZCIgICwyLDB4NkMyQTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnpkIiAgICwyLDB4NkMyNTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm56ZCIgICwyLDB4NkMyNjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnBkIiAgICwyLDB4NkMyOTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5kIiAgICwyLDB4NkMyNzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5uZCIgICwyLDB4NkMyQTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm52ZCIgICwyLDB4NkMyQzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnZkIiAgICwyLDB4NkMyRDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm51ZmQiICwyLDB4NkMyRTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnVmZCIgICwyLDB4NkMyRjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5jZCIgICwyLDB4NkMyNDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmNkIiAgICwyLDB4NkMyMTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5sdmQiICwyLDB4NkMzMDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmx2ZCIgICwyLDB4NkMzMTAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYm5sdWZkIiwyLDB4NkMzMjAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYmx1ZmQiICwyLDB4NkMzMzAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJkYnp1ZmQiICwyLDB4NkMzNDAwMDAsUENSZWwsICAgICAgIHsgQVJuLCBBbGxSZWd8RGlzcCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJmaXgiICAgICwyLDB4MDUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBBbGxSZWcsIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImZsb2F0IiAgLDIsMHgwNTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIFJuLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImlhY2siICAgLDEsMHgxQjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBEaXJlY3R8SW5kaXJlY3QsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiaWRsZSIgICAsMCwweDA2MDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiaWRsZTIiICAsMCwweDA2MDAwMDAxLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwgLyogTEMzMSBPbmx5ICovCi0gIHsgImxkZSIgICAgLDIsMHgwNjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGYiICAgICwyLDB4MDcwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmdSIgICAsMiwweDQwMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmxvIiAgLDIsMHg0MDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZscyIgICwyLDB4NDEwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmaGkiICAsMiwweDQxODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmhzIiAgLDIsMHg0MjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZlcSIgICwyLDB4NDI4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbmUiICAsMiwweDQzMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmx0IiAgLDIsMHg0MzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsZSIgICwyLDB4NDQwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmZ3QiICAsMiwweDQ0ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmdlIiAgLDIsMHg0NTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZ6IiAgICwyLDB4NDI4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbnoiICAsMiwweDQzMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZnAiICAgLDIsMHg0NDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZuIiAgICwyLDB4NDM4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbm4iICAsMiwweDQ1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm52IiAgLDIsMHg0NjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZ2IiAgICwyLDB4NDY4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbnVmIiAsMiwweDQ3MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZnVmIiAgLDIsMHg0NzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZuYyIgICwyLDB4NDIwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmYyIgICAsMiwweDQwODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5sdiIgLDIsMHg0ODAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsdiIgICwyLDB4NDg4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbmx1ZiIsMiwweDQ5MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmx1ZiIgLDIsMHg0OTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZ6dWYiICwyLDB4NEEwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmaSIgICAsMiwweDA3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IERpcmVjdHxJbmRpcmVjdCwgUm4sIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAibGRpIiAgICAsMiwweDA4MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXUiICAgLDIsMHg1MDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlsbyIgICwyLDB4NTA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbHMiICAsMiwweDUxMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWhpIiAgLDIsMHg1MTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlocyIgICwyLDB4NTIwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpZXEiICAsMiwweDUyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW5lIiAgLDIsMHg1MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlsdCIgICwyLDB4NTM4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbGUiICAsMiwweDU0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWd0IiAgLDIsMHg1NDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlnZSIgICwyLDB4NTUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpeiIgICAsMiwweDUyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW56IiAgLDIsMHg1MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlwIiAgICwyLDB4NTQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbiIgICAsMiwweDUzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW5uIiAgLDIsMHg1NTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGludiIgICwyLDB4NTYwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpdiIgICAsMiwweDU2ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW51ZiIgLDIsMHg1NzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGl1ZiIgICwyLDB4NTc4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbmMiICAsMiwweDUyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWMiICAgLDIsMHg1MDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlubHYiICwyLDB4NTgwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbHYiICAsMiwweDU4ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW5sdWYiLDIsMHg1OTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlsdWYiICwyLDB4NTk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpenVmIiAsMiwweDVBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWkiICAgLDIsMHgwODgwMDAwMCxBZGRyZXNzTW9kZSwgeyBEaXJlY3R8SW5kaXJlY3QsIEFsbFJlZywgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJsZG0iICAgICwyLDB4MDkwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRwIiAgICAsMiwweDA4NzAwMDAwLDAsICAgICAgICAgICB7IEFiczI0fERpcmVjdCwgRFBSZWd8Tm90UmVxLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImxvcG93ZXIiLDAsMHgxMDgwMDAwMSwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sIC8qIExDMzEgT25seSAqLwotICB7ICJsc2giICAgICwyLDB4MDk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAibHNoMyIgICAsMywweDI0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIEFsbFJlZyB9LCBJbW1fTm9uZSB9LAotICB7ICJtYXhzcGVlZCIsMCwweDEwODAwMDAwLDAsICAgICAgICAgIHsgMCwgMCwgMCB9LCBJbW1fTm9uZSB9LCAvKiBMQzMxIE9ubHkgKi8KLSAgeyAibXB5ZiIgICAsMiwweDBBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgIm1weWYzIiAgLDMsMHgyNDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgUm4gfSwgSW1tX05vbmUgfSwKLSAgeyAibXB5aSIgICAsMiwweDBBODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgIm1weWkzIiAgLDMsMHgyNTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAibmVnYiIgICAsMiwweDBCMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgIm5lZ2YiICAgLDIsMHgwQjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJuZWdpIiAgICwyLDB4MEMwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibm9wIiAgICAsMSwweDBDODAwMDAwLEFkZHJlc3NNb2RlLCB7IEFsbFJlZ3xJbmRpcmVjdHxOb3RSZXEsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAibm9ybSIgICAsMiwweDBEMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sIC8qQ2hlY2sgYW5vdGhlciBzb3VyY2UqLwotICB7ICJub3QiICAgICwyLDB4MEQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAib3IiICAgICAsMiwweDEwMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgIm9yMyIgICAgLDMsMHgyNTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAicG9wIiAgICAsMSwweDBFMjAwMDAwLFN0YWNrT3AsICAgICB7IEFsbFJlZywgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJwb3BmIiAgICwxLDB4MEVBMDAwMDAsU3RhY2tPcCwgICAgIHsgUm4sIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicHVzaCIgICAsMSwweDBGMjAwMDAwLFN0YWNrT3AsICAgICB7IEFsbFJlZywgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJwdXNoZiIgICwxLDB4MEZBMDAwMDAsU3RhY2tPcCwgICAgIHsgUm4sIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aSIgICAsMCwweDc4MDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aXUiICAsMCwweDc4MDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWxvIiAsMCwweDc4MDEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWxzIiAsMCwweDc4MDIwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWhpIiAsMCwweDc4MDMwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWhzIiAsMCwweDc4MDQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWVxIiAsMCwweDc4MDUwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW5lIiAsMCwweDc4MDYwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWx0IiAsMCwweDc4MDcwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWxlIiAsMCwweDc4MDgwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWd0IiAsMCwweDc4MDkwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWdlIiAsMCwweDc4MEEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aXoiICAsMCwweDc4MDUwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW56IiAsMCwweDc4MDYwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aXAiICAsMCwweDc4MDkwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW4iICAsMCwweDc4MDcwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW5uIiAsMCwweDc4MEEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW52IiAsMCwweDc4MEMwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aXYiICAsMCwweDc4MEQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW51ZiIsMCwweDc4MEUwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aXVmIiAsMCwweDc4MEYwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW5jIiAsMCwweDc4MDQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWMiICAsMCwweDc4MDEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW5sdiIsMCwweDc4MTAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWx2IiAsMCwweDc4MTEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aW5sdWYiLDAsMHg3ODEyMDAwMCwwLCAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aWx1ZiIsMCwweDc4MTMwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0aXp1ZiIsMCwweDc4MTQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0cyIgICAsMCwweDc4ODAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c3UiICAsMCwweDc4ODAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2xvIiAsMCwweDc4ODEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2xzIiAsMCwweDc4ODIwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2hpIiAsMCwweDc4ODMwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2hzIiAsMCwweDc4ODQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2VxIiAsMCwweDc4ODUwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c25lIiAsMCwweDc4ODYwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2x0IiAsMCwweDc4ODcwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2xlIiAsMCwweDc4ODgwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2d0IiAsMCwweDc4ODkwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2dlIiAsMCwweDc4OEEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c3oiICAsMCwweDc4ODUwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c256IiAsMCwweDc4ODYwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c3AiICAsMCwweDc4ODkwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c24iICAsMCwweDc4ODcwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c25uIiAsMCwweDc4OEEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c252IiAsMCwweDc4OEMwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c3YiICAsMCwweDc4OEQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c251ZiIsMCwweDc4OEUwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c3VmIiAsMCwweDc4OEYwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c25jIiAsMCwweDc4ODQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2MiICAsMCwweDc4ODEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c25sdiIsMCwweDc4OTAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2x2IiAsMCwweDc4OTEwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c25sdWYiLDAsMHg3ODkyMDAwMCwwLCAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c2x1ZiIsMCwweDc4OTMwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicmV0c3p1ZiIsMCwweDc4OTQwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicm5kIiAgICAsMiwweDExMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgInJvbCIgICAgLDEsMHgxMUUwMDAwMSxSb3RhdGUsICAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicm9sYyIgICAsMSwweDEyNjAwMDAxLFJvdGF0ZSwgICAgICB7IEFsbFJlZywgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJyb3IiICAgICwxLDB4MTJFMEZGRkYsUm90YXRlLCAgICAgIHsgQWxsUmVnLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJvcmMiICAgLDEsMHgxMzYwRkZGRixSb3RhdGUsICAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicnB0YiIgICAsMSwweDY0MDAwMDAwLDAsICAgICAgICAgICB7IEltbTI0LCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgInJwdHMiICAgLDEsMHgxMzlCMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAic2lnaSIgICAsMCwweDE2MDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAic3RmIiAgICAsMiwweDE0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IFJuLCBEaXJlY3R8SW5kaXJlY3QsIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgInN0ZmkiICAgLDIsMHgxNDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBSbiwgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJzdGkiICAgICwyLDB4MTUwMDAwMDAsQWRkcmVzc01vZGUsIHsgQWxsUmVnLCBEaXJlY3R8SW5kaXJlY3QsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3RpaSIgICAsMiwweDE1ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEFsbFJlZywgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN1YmIiICAgLDIsMHgxNjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJzdWJiMyIgICwzLDB4MjYwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgInN1YmMiICAgLDIsMHgxNzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJzdWJmIiAgICwyLDB4MTc4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAic3ViZjMiICAsMywweDI2ODAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMSwgVEFkZHIyLCBSbiB9LCBJbW1fTm9uZSB9LAotICB7ICJzdWJpIiAgICwyLDB4MTgwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3ViaTMiICAsMywweDI3MDAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIEFsbFJlZyB9LCBJbW1fTm9uZSB9LAotICB7ICJzdWJyYiIgICwyLDB4MTg4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3VicmYiICAsMiwweDE5MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgInN1YnJpIiAgLDIsMHgxOTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJzd2kiICAgICwwLDB4NjYwMDAwMDAsMCwgICAgICAgICAgIHsgMCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwIiAgICwxLDB4NzQ4MDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwdSIgICwxLDB4NzQ4MDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbG8iICwxLDB4NzQ4MTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbHMiICwxLDB4NzQ4MjAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwaGkiICwxLDB4NzQ4MzAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwaHMiICwxLDB4NzQ4NDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwZXEiICwxLDB4NzQ4NTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbmUiICwxLDB4NzQ4NjAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbHQiICwxLDB4NzQ4NzAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbGUiICwxLDB4NzQ4ODAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwZ3QiICwxLDB4NzQ4OTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwZ2UiICwxLDB4NzQ4QTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFweiIgICwxLDB4NzQ4NTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbnoiICwxLDB4NzQ4NjAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwcCIgICwxLDB4NzQ4OTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbiIgICwxLDB4NzQ4NzAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbm4iICwxLDB4NzQ4QTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbnYiICwxLDB4NzQ4QzAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwdiIgICwxLDB4NzQ4RDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbnVmIiwxLDB4NzQ4RTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwdWYiICwxLDB4NzQ4RjAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbmMiICwxLDB4NzQ4NDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwYyIgICwxLDB4NzQ4MTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbmx2IiwxLDB4NzQ5MDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbHYiICwxLDB4NzQ5MTAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbmx1ZiIsMSwweDc0OTIwMDIwLDAsICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwbHVmIiwxLDB4NzQ5MzAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0cmFwenVmIiwxLDB4NzQ5NDAwMjAsMCwgICAgICAgICAgIHsgSVZlY3RvciwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJ0c3RiIiAgICwyLDB4MUEwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAidHN0YjMiICAsMiwweDI3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAieG9yIiAgICAsMiwweDFBODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgInhvcjMiICAgLDMsMHgyODAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAiIiAgICAgICAsMCwweDAwMDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgdGVtcGxhdGUgKmNvbnN0IHRpYzMwX29wdGFiX2VuZCA9Ci0gIHRpYzMwX29wdGFiICsgc2l6ZW9mKHRpYzMwX29wdGFiKS9zaXplb2YodGljMzBfb3B0YWJbMF0pOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGludCBvcGVyYW5kc18xOwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHNfMjsKLSAgdW5zaWduZWQgaW50IGJhc2Vfb3Bjb2RlOwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZF90eXBlc1syXVszXTsKLSAgLyogV2hpY2ggb3BlcmFuZCBmaXRzIGludG8gd2hpY2ggcGFydCBvZiB0aGUgZmluYWwgb3Bjb2RlIHdvcmQuICovCi0gIGludCBvcG9yZGVyOwotfSBwYXJ0ZW1wbGF0ZTsKLQotLyogb3BvcmRlciBkZWZpbmVzIC0gbm90IHZlcnkgZGVzY3JpcHRpdmUuICovCi0jZGVmaW5lIE9PXzRvcDEgICAwCi0jZGVmaW5lIE9PXzRvcDIgICAxCi0jZGVmaW5lIE9PXzRvcDMgICAyCi0jZGVmaW5lIE9PXzVvcDEgICAzCi0jZGVmaW5lIE9PXzVvcDIgICA0Ci0jZGVmaW5lIE9PX1BGaWVsZCA1Ci0KLXN0YXRpYyBjb25zdCBwYXJ0ZW1wbGF0ZSB0aWMzMF9wYXJvcHRhYltdID0gewotICB7ICJxX2Fic2Zfc3RmIiwgICAyLDIsMHhDODAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX2Fic2lfc3RpIiwgICAyLDIsMHhDQTAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX2FkZGYzX3N0ZiIsICAzLDIsMHhDQzAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAicV9hZGRpM19zdGkiLCAgMywyLDB4Q0UwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AxIH0sCi0gIHsgInFfYW5kM19zdGkiLCAgIDMsMiwweEQwMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICJxX2FzaDNfc3RpIiwgICAzLDIsMHhEMjAwMDAwMCwgeyB7IFJuLCBJbmRpcmVjdCwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDIgfSwKLSAgeyAicV9maXhfc3RpIiwgICAgMiwyLDB4RDQwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9mbG9hdF9zdGYiLCAgMiwyLDB4RDYwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9sZGZfbGRmIiwgICAgMiwyLDB4QzQwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBJbmRpcmVjdCwgUm4sIDAgfSB9LAotCU9PXzRvcDIgfSwKLSAgeyAicV9sZGZfc3RmIiwgICAgMiwyLDB4RDgwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9sZGlfbGRpIiwgICAgMiwyLDB4QzYwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBJbmRpcmVjdCwgUm4sIDAgfSB9LAotCU9PXzRvcDIgfSwKLSAgeyAicV9sZGlfc3RpIiwgICAgMiwyLDB4REEwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9sc2gzX3N0aSIsICAgMywyLDB4REMwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AyIH0sCi0gIHsgInFfbXB5ZjNfYWRkZjMiLDMsMywweDgwMDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKLSAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBSbiB8IEluZGlyZWN0LCBSbiB8IEluZGlyZWN0LCBSbiB9IH0sIE9PX1BGaWVsZCB9LAotICB7ICJxX21weWYzX3N0ZiIsICAzLDIsMHhERTAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAicV9tcHlmM19zdWJmMyIsMywzLDB4ODQwMDAwMDAsIHsgeyBSbiB8IEluZGlyZWN0LCBSbiB8IEluZGlyZWN0LCBSbiB9LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSB9LCBPT19QRmllbGQgfSwKLSAgeyAicV9tcHlpM19hZGRpMyIsMywzLDB4ODgwMDAwMDAsIHsgeyBSbiB8IEluZGlyZWN0LCBSbiB8IEluZGlyZWN0LCBSbiB9LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSB9LCBPT19QRmllbGQgfSwKLSAgeyAicV9tcHlpM19zdGkiLCAgMywyLDB4RTAwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AxIH0sCi0gIHsgInFfbXB5aTNfc3ViaTMiLDMsMywweDhDMDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0gfSwgT09fUEZpZWxkIH0sCi0gIHsgInFfbmVnZl9zdGYiLCAgIDIsMiwweEUyMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbmVnaV9zdGkiLCAgIDIsMiwweEU0MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbm90X3N0aSIsICAgIDIsMiwweEU2MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfb3IzX3N0aSIsICAgIDMsMiwweEU4MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICJxX3N0Zl9zdGYiLCAgICAyLDIsMHhDMDAwMDAwMCwgeyB7IFJuLCBJbmRpcmVjdCwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMyB9LAotICB7ICJxX3N0aV9zdGkiLCAgICAyLDIsMHhDMjAwMDAwMCwgeyB7IFJuLCBJbmRpcmVjdCwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMyB9LAotICB7ICJxX3N1YmYzX3N0ZiIsICAzLDIsMHhFQTAwMDAwMCwgeyB7IFJuLCBJbmRpcmVjdCwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDIgfSwKLSAgeyAicV9zdWJpM19zdGkiLCAgMywyLDB4RUMwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AyIH0sCi0gIHsgInFfeG9yM19zdGkiLCAgIDMsMiwweEVFMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICIiLCAgICAgICAgICAgICAwLDAsMHgwMDAwMDAwMCwgeyB7IDAsIDAsIDAgfSwgeyAwLCAwLCAwIH0gfSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgcGFydGVtcGxhdGUgKmNvbnN0IHRpYzMwX3Bhcm9wdGFiX2VuZCA9Ci0gIHRpYzMwX3Bhcm9wdGFiICsgc2l6ZW9mKHRpYzMwX3Bhcm9wdGFiKS9zaXplb2YodGljMzBfcGFyb3B0YWJbMF0pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3RpYzgwLmggYi9pbmNsdWRlL29wY29kZS90aWM4MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTliYzMwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3RpYzgwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyogdGljODAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVEkgVE1TMzIwQzgwIChNVikgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSksIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVElDODBfSAotI2RlZmluZSBUSUM4MF9ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHRpYzgwX29wY29kZS4gICovCi0KLXN0cnVjdCB0aWM4MF9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLQotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIG9wZXJhbmRzCi0gICAgIGFyZSB6ZXJvZXMuICAqLwotCi0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotCi0gIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhIG1hc2sKLSAgICAgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZSBvcGNvZGUKLSAgICAgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90IG1hdGNoIChhbmQgYXJlCi0gICAgIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCi0KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIFNwZWNpYWwgcHVycG9zZSBmbGFncyBmb3IgdGhpcyBvcGNvZGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBmbGFnczsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlIG9wZXJhbmQKLSAgICAgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QgYXBwZWFyIGluCi0gICAgIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICBGSVhNRTogQWRqdXN0IHNpemUgdG8KLSAgICAgbWF0Y2ggYWN0dWFsIHJlcXVpcmVtZW50cyB3aGVuIFRJYzgwIHN1cHBvcnQgaXMgY29tcGxldGUgKi8KLQotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzhdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZSBpbgotICAgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyIGluc3RydWN0aW9ucy4KLSAgIEZJWE1FOiBUaGlzIGlzbid0IGN1cnJlbnRseSB0cnVlLiAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSB0aWM4MF9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IHRpYzgwX251bV9vcGNvZGVzOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHRpYzgwX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgdGljODBfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotCi0gIGludCBiaXRzOwotCi0gIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLSAgaW50IHNoaWZ0OwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0KLSAgdW5zaWduZWQgbG9uZyAoKmluc2VydCkgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbiwgbG9uZyBvcCwKLQkJCQkgICBjb25zdCBjaGFyICoqZXJybXNnKSk7Ci0KLSAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KLSAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKLSAgICAgICAgIG9wID0gKChpKSA+PiBvLT5zaGlmdCkgJiAoKDEgPDwgby0+Yml0cykgLSAxKTsKLQkgaWYgKChvLT5mbGFncyAmIFRJQzgwX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JICAgICAmJiAob3AgJiAoMSA8PCAoby0+Yml0cyAtIDEpKSkgIT0gMCkKLQkgICBvcCAtPSAxIDw8IG8tPmJpdHM7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAotICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgotICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KLSAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQotICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCi0KLSAgbG9uZyAoKmV4dHJhY3QpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGludCAqaW52YWxpZCkpOwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLQotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSB0aWM4MF9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGVyYW5kIHRpYzgwX29wZXJhbmRzW107Ci0KLQwKLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgdGljODBfb3BlcmFuZC4KLQotICAgTm90ZSB0aGF0IGZsYWdzIGZvciBhbGwgcHJlZGVmaW5lZCBzeW1ib2xzLCBzdWNoIGFzIHRoZSBnZW5lcmFsIHB1cnBvc2UKLSAgIHJlZ2lzdGVycyAoZXg6IHIxMCksIGNvbnRyb2wgcmVnaXN0ZXJzIChleDogRlBTVCksIGNvbmRpdGlvbiBjb2RlcyAoZXg6Ci0gICBlcTAuYiksIGJpdCBudW1iZXJzIChleDogZ3QuYiksIGV0YyBhcmUgbGFyZ2UgZW5vdWdoIHRoYXQgdGhleSBjYW4gYmUKLSAgIG9yJ2QgaW50byBhbiBpbnQgd2hlcmUgdGhlIGxvd2VyIGJpdHMgY29udGFpbiB0aGUgYWN0dWFsIG51bWVyaWMgdmFsdWUKLSAgIHRoYXQgY29ycmVwb25kcyB0byB0aGlzIHByZWRlZmluZWQgc3ltYm9sLiAgVGhpcyB3YXkgYSBzaW5nbGUgaW50IGNhbgotICAgY29udGFpbiBib3RoIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCBpdCdzIHR5cGUuCi0gKi8KLQotLyogVGhpcyBvcGVyYW5kIG11c3QgYmUgYW4gZXZlbiByZWdpc3RlciBudW1iZXIuICBGbG9hdGluZyBwb2ludCBudW1iZXJzCi0gICBmb3IgZXhhbXBsZSBhcmUgc3RvcmVkIGluIGV2ZW4vb2RkIHJlZ2lzdGVyIHBhaXJzLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfRVZFTgkoMSA8PCAwKQotCi0vKiBUaGlzIG9wZXJhbmQgbXVzdCBiZSBhbiBvZGQgcmVnaXN0ZXIgbnVtYmVyIGFuZCBtdXN0IGJlIG9uZSBncmVhdGVyIHRoYW4KLSAgIHRoZSByZWdpc3RlciBudW1iZXIgb2YgdGhlIHByZXZpb3VzIG9wZXJhbmQuICBJLkUuIHRoZSBzZWNvbmQgcmVnaXN0ZXIgaW4KLSAgIGFuIGV2ZW4vb2RkIHJlZ2lzdGVyIHBhaXIuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9PREQJKDEgPDwgMSkKLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMuICAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfU0lHTkVECSgxIDw8IDIpCi0KLS8qIFRoaXMgb3BlcmFuZCBtYXkgYmUgZWl0aGVyIGEgcHJlZGVmaW5lZCBjb25zdGFudCBuYW1lIG9yIGEgbnVtZXJpYyB2YWx1ZS4KLSAgIEFuIGV4YW1wbGUgd291bGQgYmUgYSBjb25kaXRpb24gY29kZSBsaWtlICJlcTAuYiIgd2hpY2ggaGFzIHRoZSBudW1lcmljCi0gICB2YWx1ZSAweDIuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9OVU0JKDEgPDwgMykKLQotLyogVGhpcyBvcGVyYW5kIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuIHNlcGFyYXRlZAotICAgZnJvbSB0aGUgcHJldmlvdXMgb25lIGJ5IGEgY29tbWEuICBUaGlzIGlzIHVzZWQgZm9yIHZhcmlvdXMKLSAgIGluc3RydWN0aW9ucywgbGlrZSB0aGUgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLCB3aGljaCB3YW50Ci0gICB0aGVpciBvcGVyYW5kcyB0byBsb29rIGxpa2UgImRpc3BsYWNlbWVudChyZWcpIiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfUEFSRU5TCSgxIDw8IDQpCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIFBDIHJlbGF0aXZlIGJyYW5jaCBvZmZzZXQuICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cwotICAgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgTm90ZSB0aGF0IHRoZSBvZmZzZXRzIGFyZSB0YWtlbiBhcyB3b3JkCi0gICBvZmZzZXRzLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfUENSRUwJKDEgPDwgNSkKLQotLyogVGhpcyBmbGFnIGlzIGEgaGludCB0byB0aGUgZGlzYXNzZW1ibGVyIGZvciB1c2luZyBoZXggYXMgdGhlIHByZWZlcmVkCi0gICBwcmludGluZyBmb3JtYXQsIGV2ZW4gZm9yIHNtYWxsIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGltbWVkaWF0ZSB2YWx1ZXMuCi0gICBOb3JtYWxseSB2YWx1ZXMgaW4gdGhlIHJhbmdlIC05OTkgdG8gOTk5IGFyZSBwcmludGVkIGFzIHNpZ25lZCBkZWNpbWFsCi0gICB2YWx1ZXMgYW5kIG90aGVyIHZhbHVlcyBhcmUgcHJpbnRlZCBpbiBoZXguICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9CSVRGSUVMRAkoMSA8PCA2KQotCi0vKiBUaGlzIG9wZXJhbmQgbWF5IGhhdmUgYSAiOm0iIG1vZGlmaWVyIHNwZWNpZmllZCBieSBiaXQgMTcgaW4gYSBzaG9ydAotICAgaW1tZWRpYXRlIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9NX1NJCSgxIDw8IDcpCi0KLS8qIFRoaXMgb3BlcmFuZCBtYXkgaGF2ZSBhICI6bSIgbW9kaWZpZXIgc3BlY2lmaWVkIGJ5IGJpdCAxNSBpbiBhIGxvbmcKLSAgIGltbWVkaWF0ZSBvciByZWdpc3RlciBmb3JtIGluc3RydWN0aW9uLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfTV9MSQkoMSA8PCA4KQotCi0vKiBUaGlzIG9wZXJhbmQgbWF5IGhhdmUgYSAiOnMiIG1vZGlmaWVyIHNwZWNpZmllZCBpbiBiaXQgMTEgaW4gYSBsb25nCi0gICBpbW1lZGlhdGUgb3IgcmVnaXN0ZXIgZm9ybSBpbnN0cnVjdGlvbi4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX1NDQUxFRAkoMSA8PCA5KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfRkxPQVQJKDEgPDwgMTApCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhbiBieXRlIG9mZnNldCBmcm9tIGEgYmFzZSByZWxvY2F0aW9uLiBUaGUgbG93ZXIKLSB0d28gYml0cyBvZiB0aGUgZmluYWwgcmVsb2NhdGVkIGFkZHJlc3MgYXJlIGlnbm9yZWQgd2hlbiB0aGUgdmFsdWUgaXMKLSB3cml0dGVuIHRvIHRoZSBwcm9ncmFtIGNvdW50ZXIuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9CQVNFUkVMCSgxIDw8IDExKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gImVuZG1hc2siIGZpZWxkIGZvciBhIHNoaWZ0IGluc3RydWN0aW9uLgotICAgSXQgaXMgdHJlYXRlZCBzcGVjaWFsIGluIHRoYXQgaXQgY2FuIGhhdmUgdmFsdWVzIG9mIDAtMzIsCi0gICB3aGVyZSAwIGFuZCAzMiByZXN1bHQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGUgYXNzZW1ibGVyCi0gICBtdXN0IGJlIGFibGUgdG8gYWNjZXB0IGJvdGggZW5kbWFzayB2YWx1ZXMuICBUaGlzIGRpc2Fzc2VtYmxlcgotICAgaGFzIG5vIHdheSBvZiBrbm93aW5nIGZyb20gdGhlIGluc3RydWN0aW9uIHdoaWNoIHZhbHVlIHdhcyAKLSAgIGdpdmVuIGF0IGFzc2VtYmx5IHRpbWUsIHNvIGl0IGp1c3QgdXNlcyAnMCcuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9FTkRNQVNLCSgxIDw8IDEyKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgb25lIG9mIHRoZSAzMiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLgotICAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMgdGhlc2Ugd2l0aCBhIGxlYWRpbmcgJ3InLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfR1BSCSgxIDw8IDI3KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCBhY2N1bXVsYXRvciByZWdpc3Rlci4KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHdpdGggYSBsZWFkaW5nICdhJy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0ZQQQkoIDEgPDwgMjgpCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIGNvbnRyb2wgcmVnaXN0ZXIgbnVtYmVyLCBlaXRoZXIgbnVtZXJpYyBvcgotICAgc3ltYm9saWMgKGxpa2UgIkVJRiIsICJFUEMiLCBldGMpLgotICAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5LiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfQ1IJKDEgPDwgMjkpCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIGNvbmRpdGlvbiBjb2RlLCBlaXRoZXIgbnVtZXJpYyBvcgotICAgc3ltYm9saWMgKGxpa2UgImVxMC5iIiwgIm5lMC53IiwgZXRjKS4KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseS4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0NDCSgxIDw8IDMwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBiaXQgbnVtYmVyLCBlaXRoZXIgbnVtZXJpYyBvcgotICAgc3ltYm9saWMgKGxpa2UgImVxLmIiLCAib3IuZiIsIGV0YykuCi0gICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkuCi0gICBOb3RlIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIGluc3RydWN0aW9uIGluIDEncyBjb21wbGVtZW50IHJlbGF0aXZlCi0gICB0byB0aGUgdmFsdWVzIGdpdmVuIGluIHRoZSBtYW51YWwuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9CSVROVU0JKDEgPDwgMzEpCi0KLS8qIFRoaXMgbWFzayBpcyB1c2VkIHRvIHN0cmlwIG9wZXJhbmQgYml0cyBmcm9tIGFuIGludCB0aGF0IGNvbnRhaW5zCi0gICBib3RoIG9wZXJhbmQgYml0cyBhbmQgYSBudW1lcmljIHZhbHVlIGluIHRoZSBsc2JzLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfTUFTSwkoVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX0ZQQSB8IFRJQzgwX09QRVJBTkRfQ1IgfCBUSUM4MF9PUEVSQU5EX0NDIHwgVElDODBfT1BFUkFORF9CSVROVU0pCi0KLQwKLS8qIEZsYWcgYml0cyBmb3IgdGhlIHN0cnVjdCB0aWM4MF9vcGNvZGUgZmxhZ3MgZmllbGQuICovCi0KLSNkZWZpbmUgVElDODBfVkVDVE9SCQkwMQkvKiBJcyBhIHZlY3RvciBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBUSUM4MF9OT19SMF9ERVNUCTAyCS8qIFJlZ2lzdGVyIHIwIGNhbm5vdCBiZSBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0KLQwKLS8qIFRoZSBvcGNvZGVzIGxpYnJhcnkgY29udGFpbnMgYSB0YWJsZSB0aGF0IGFsbG93cyB0cmFuc2xhdGlvbiBmcm9tIHByZWRlZmluZWQKLSAgIHN5bWJvbCBuYW1lcyB0byBudW1lcmljIHZhbHVlcywgYW5kIHZpY2UgdmVyc2EuICovCi0KLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgc3ltYm9scy4gICovCi0KLXN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbAotewotICBjaGFyICpuYW1lOwkJLyogbmFtZSB0byByZWNvZ25pemUgKi8KLSAgaW50IHZhbHVlOwotfTsKLQotI2RlZmluZSBQRFNfTkFNRShwZHNwKSAoKHBkc3ApIC0+IG5hbWUpCi0jZGVmaW5lIFBEU19WQUxVRShwZHNwKSAoKHBkc3ApIC0+IHZhbHVlKQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sIHRpYzgwX3ByZWRlZmluZWRfc3ltYm9sc1tdOwkvKiBUcmFuc2xhdGlvbiBhcnJheSAqLwotZXh0ZXJuIGNvbnN0IGludCB0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzOwkJCQkvKiBIb3cgbWFueSBtZW1iZXJzIGluIHRoZSBhcnJheSAqLwotCi1jb25zdCBjaGFyICp0aWM4MF92YWx1ZV90b19zeW1ib2wgUEFSQU1TICgoaW50IHZhbCwgaW50IGNsYXNzKSk7CS8qIFRyYW5zbGF0ZSB2YWx1ZSB0byBzeW1ib2xpYyBuYW1lICovCi1pbnQgdGljODBfc3ltYm9sX3RvX3ZhbHVlIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGludCBjbGFzcykpOwkJLyogVHJhbnNsYXRlIHN5bWJvbGljIG5hbWUgdG8gdmFsdWUgKi8KLQotY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICoKLXRpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICopKTsKLQotI2VuZGlmIC8qIFRJQzgwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3Y4NTAuaCBiL2luY2x1ZGUvb3Bjb2RlL3Y4NTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5MTZmMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS92ODUwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogdjg1MC5oIC0tIEhlYWRlciBmaWxlIGZvciBORUMgVjg1MCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKLlQuIENvbmtsaW4sIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVjg1MF9ICi0jZGVmaW5lIFY4NTBfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCB2ODUwX29wY29kZS4gICovCi0KLXN0cnVjdCB2ODUwX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s4XTsKLQotICAvKiBXaGljaCAoaWYgYW55KSBvcGVyYW5kIGlzIGEgbWVtb3J5IG9wZXJhbmQuICAqLwotICB1bnNpZ25lZCBpbnQgbWVtb3A7Ci0KLSAgLyogVGFyZ2V0IHByb2Nlc3NvcihzKS4gIEEgYml0IGZpZWxkIG9mIHByb2Nlc3NvcnMgd2hpY2ggc3VwcG9ydAotICAgICB0aGlzIGluc3RydWN0aW9uLiAgTm90ZSBhIGJpdCBmaWVsZCBpcyB1c2VkIGFzIHNvbWUgaW5zdHJ1Y3Rpb25zCi0gICAgIGFyZSBhdmFpbGFibGUgb24gbXVsdGlwbGUsIGRpZmZlcmVudCBwcm9jZXNzb3IgdHlwZXMsIHdoZXJlYXMKLSAgICAgb3RoZXIgaW5zdHJ1Y3Rpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBvbmUgc3BlY2lmaWMgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBwcm9jZXNzb3JzOwotfTsKLQotLyogVmFsdWVzIGZvciB0aGUgcHJvY2Vzc29ycyBmaWVsZCBpbiB0aGUgdjg1MF9vcGNvZGUgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgUFJPQ0VTU09SX1Y4NTAJCSgxIDw8IDApCQkvKiBKdXN0IHRoZSBWODUwLiAgKi8KLSNkZWZpbmUgUFJPQ0VTU09SX0FMTAkJLTEJCQkvKiBBbnkgcHJvY2Vzc29yLiAgKi8KLSNkZWZpbmUgUFJPQ0VTU09SX1Y4NTBFCQkoMSA8PCAxKQkJLyogSnVzdCB0aGUgVjg1MEUuICovCi0jZGVmaW5lIFBST0NFU1NPUl9OT1RfVjg1MAkofiBQUk9DRVNTT1JfVjg1MCkJLyogQW55IHByb2Nlc3NvciBleGNlcHQgdGhlIFY4NTAuICAqLwotI2RlZmluZSBQUk9DRVNTT1JfVjg1MEVBCSgxIDw8IDIpCQkvKiBKdXN0IHRoZSBWODUwRUEuICovCi0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGNvZGUgdjg1MF9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IHY4NTBfbnVtX29wY29kZXM7Ci0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3Qgdjg1MF9vcGVyYW5kLiAgKi8KLQotc3RydWN0IHY4NTBfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICAvKiBJZiB0aGlzIHZhbHVlIGlzIC0xIHRoZW4gdGhlIG9wZXJhbmQncyBiaXRzIGFyZSBpbiBhIGRpc2NvbnRpbm91cyBkaXN0cmlidXRpb24gaW4gdGhlIGluc3RydWN0aW9uLiAqLwotICBpbnQgYml0czsKLQotICAvKiAoYml0cyA+PSAwKTogIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIC8qIChiaXRzID09IC0xKTogQml0IG1hc2sgb2YgdGhlIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogSW5zZXJ0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICBUbyBpbnNlcnQgYW4KLSAgICAgb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGV4ZWN1dGUKLSAgICAgICAgIGkgfD0gKG9wICYgKCgxIDw8IG8tPmJpdHMpIC0gMSkpIDw8IG8tPnNoaWZ0OwotICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggd2UgYXJlIGZpbGxpbmcgaW4sIG8gaXMgYSBwb2ludGVyIHRvCi0gICAgIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AgaXMgdGhlIG9wY29kZSB2YWx1ZTsgdGhpcyBhc3N1bWVzIHR3b3MKLSAgICAgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIGFuZCB0aGUgb3BlcmFuZCB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSBuZXcgdmFsdWUKLSAgICAgb2YgdGhlIGluc3RydWN0aW9uLiAgSWYgdGhlIEVSUk1TRyBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlbiBpZgotICAgICB0aGUgb3BlcmFuZCB2YWx1ZSBpcyBpbGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgc2V0IHRvIGEgd2FybmluZwotICAgICBzdHJpbmcgKHRoZSBvcGVyYW5kIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gYW55IGNhc2UpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgdmFsdWUgaXMgbGVnYWwsICpFUlJNU0cgd2lsbCBiZSB1bmNoYW5nZWQgKG1vc3Qgb3BlcmFuZHMKLSAgICAgY2FuIGFjY2VwdCBhbnkgdmFsdWUpLiAgKi8KLSAgdW5zaWduZWQgbG9uZyAoKiBpbnNlcnQpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGxvbmcgb3AsCi0JCQkJICAgY29uc3QgY2hhciAqKiBlcnJtc2cpKTsKLQotICAvKiBFeHRyYWN0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUbwotICAgICBleHRyYWN0IHRoaXMgb3BlcmFuZCB0eXBlIGZyb20gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgY29tcHV0ZQotICAgICAgICAgb3AgPSBvLT5iaXRzID09IC0xID8gKChpKSAmIG8tPnNoaWZ0KSA6ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmIChvLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCi0JICAgICBvcCA9IChvcCA8PCAoMzIgLSBvLT5iaXRzKSkgPj4gKDMyIC0gby0+Yml0cyk7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAotICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgotICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KLSAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQotICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgKCogZXh0cmFjdCkgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbiwgaW50ICogaW52YWxpZCkpOwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgaW50IGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSB2ODUwX29wY29kZXMgdGFibGUuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCB2ODUwX29wZXJhbmRzW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3Qgdjg1MF9vcGVyYW5kLiAgKi8KLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9SRUcJMHgwMQotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSBzeXN0ZW0gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX1NSRwkweDAyCi0KLS8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIGNvbmRpdGlvbiBjb2RlIHVzZWQgaW4gdGhlIHNldGYgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX0NDCQkweDA0Ci0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9TSUdORUQJMHgwOAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgdGhlIGVwIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX0VQCQkweDEwCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIFBDIGRpc3BsYWNlbWVudCAqLwotI2RlZmluZSBWODUwX09QRVJBTkRfRElTUAkweDIwCi0KLS8qIFRoaXMgaXMgYSByZWxheGFibGUgb3BlcmFuZC4gICBPbmx5IHVzZWQgZm9yIEQ5LT5EMjIgYnJhbmNoIHJlbGF4aW5nCi0gICByaWdodCBub3cuICBXZSBtYXkgbmVlZCBvdGhlcnMgaW4gdGhlIGZ1dHVyZSAob3IgbWF5YmUgaGFuZGxlIHRoZW0gbGlrZQotICAgcHJvbW90ZWQgb3BlcmFuZHMgb24gdGhlIG1uMTAzMDA/KSAgKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX1JFTEFYCTB4NDAKLQotLyogVGhlIHJlZ2lzdGVyIHNwZWNpZmllZCBtdXN0IG5vdCBiZSByMCAqLwotI2RlZmluZSBWODUwX05PVF9SMAkgICAgICAgIDB4ODAKLQotLyogQ1lHTlVTIExPQ0FMIHY4NTBlICovCi0vKiBwdXNoL3BvcCB0eXBlIGluc3RydWN0aW9uLCBWODUwRSBzcGVjaWZpYy4gICovCi0jZGVmaW5lIFY4NTBFX1BVU0hfUE9QCQkweDEwMAotCi0vKiAxNiBiaXQgaW1tZWRpYXRlIGZvbGxvd3MgaW5zdHJ1Y3Rpb24sIFY4NTBFIHNwZWNpZmljLiAgKi8KLSNkZWZpbmUgVjg1MEVfSU1NRURJQVRFMTYJMHgyMDAKLQotLyogMzIgYml0IGltbWVkaWF0ZSBmb2xsb3dzIGluc3RydWN0aW9uLCBWODUwRSBzcGVjaWZpYy4gICovCi0jZGVmaW5lIFY4NTBFX0lNTUVESUFURTMyCTB4NDAwCi0KLSNlbmRpZiAvKiBWODUwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3ZheC5oIGIvaW5jbHVkZS9vcGNvZGUvdmF4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYWZlYmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvdmF4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyogVmF4IG9wY2RlIGxpc3QuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgR0FTLgotCi1HREIgYW5kIEdBUyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIgYW5kIEdBUyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHREIgb3IgR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIHZheF9vcGNvZGVUCi0jZGVmaW5lIHZheF9vcGNvZGVUIGludAotI2VuZGlmIC8qIG5vIHZheF9vcGNvZGVUICovCi0KLXN0cnVjdCB2b3Rfd290CQkJLyogdmF4IG9wY29kZSB0YWJsZTogd290IHRvIGRvIHdpdGggdGhpcyAqLwotCQkJCS8qIHBhcnRpY3VsYXIgb3Bjb2RlICovCi17Ci0gIGNvbnN0IGNoYXIgICAgICAgKmFyZ3M7CS8qIGhvdyB0byBjb21waWxlIHNhaWQgb3Bjb2RlICovCi0gIHZheF9vcGNvZGVUICAgICAgIGNvZGU7CS8qIG9wLWNvZGUgKG1heSBiZSA+IDggYml0cyEpICovCi19OwotCi1zdHJ1Y3Qgdm90CQkJLyogdmF4IG9wY29kZSB0ZXh0ICovCi17Ci0gIGNvbnN0IGNoYXIgICAgICAgKm5hbWU7CS8qIG9wY29kZSBuYW1lOiBsb3dlcmNhc2Ugc3RyaW5nICBba2V5XSAgKi8KLSAgc3RydWN0IHZvdF93b3QgICAgZGV0YWlsOwkvKiByZXN0IG9mIG9wY29kZSB0YWJsZSAgICAgICAgICBbZGF0dW1dICovCi19OwotCi0jZGVmaW5lIHZvdF9ob3cgYXJncwotI2RlZmluZSB2b3RfY29kZSBjb2RlCi0jZGVmaW5lIHZvdF9kZXRhaWwgZGV0YWlsCi0jZGVmaW5lIHZvdF9uYW1lIG5hbWUKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2b3QKLXZvdHN0cnNbXSA9Ci17Ci17ICAgICJoYWx0IiwJeyIiLAkJCTB4MDAJfSB9LAoteyAgICAibm9wIiwJeyIiLAkJCTB4MDEJfSB9LAoteyAgICAicmVpIiwJeyIiLAkJCTB4MDIJfSB9LAoteyAgICAiYnB0IiwJeyIiLAkJCTB4MDMJfSB9LAoteyAgICAicmV0IiwJeyIiLAkJCTB4MDQJfSB9LAoteyAgICAicnNiIiwJeyIiLAkJCTB4MDUJfSB9LAoteyAgICAibGRwY3R4IiwJeyIiLAkJCTB4MDYJfSB9LAoteyAgICAic3ZwY3R4IiwJeyIiLAkJCTB4MDcJfSB9LAoteyAgICAiY3Z0cHMiLAl7InJ3YWJyd2FiIiwJCTB4MDgJfSB9LAoteyAgICAiY3Z0c3AiLAl7InJ3YWJyd2FiIiwJCTB4MDkJfSB9LAoteyAgICAiaW5kZXgiLAl7InJscmxybHJscmx3bCIsCTB4MGEJfSB9LAoteyAgICAiY3JjIiwJeyJhYnJscndhYiIsCQkweDBiCX0gfSwKLXsgICAgInByb2JlciIsCXsicmJyd2FiIiwJCTB4MGMJfSB9LAoteyAgICAicHJvYmV3IiwJeyJyYnJ3YWIiLAkgICAgICAgIDB4MGQJfSB9LAoteyAgICAiaW5zcXVlIiwJeyJhYmFiIiwJCTB4MGUJfSB9LAoteyAgICAicmVtcXVlIiwJeyJhYndsIiwJCTB4MGYJfSB9LAoteyAgICAiYnNiYiIsCXsiYmIiLAkJCTB4MTAJfSB9LAoteyAgICAiYnJiIiwJeyJiYiIsCQkJMHgxMQl9IH0sCi17ICAgICJibmVxIiwJeyJiYiIsCQkJMHgxMgl9IH0sCi17ICAgICJibmVxdSIsCXsiYmIiLAkJCTB4MTIJfSB9LAoteyAgICAiYmVxbCIsCXsiYmIiLAkJCTB4MTMJfSB9LAoteyAgICAiYmVxbHUiLAl7ImJiIiwJCQkweDEzCX0gfSwKLXsgICAgImJndHIiLAl7ImJiIiwJCQkweDE0CX0gfSwKLXsgICAgImJsZXEiLAl7ImJiIiwJCQkweDE1CX0gfSwKLXsgICAgImpzYiIsCXsiYWIiLAkJCTB4MTYJfSB9LAoteyAgICAiam1wIiwJeyJhYiIsCQkJMHgxNwl9IH0sCi17ICAgICJiZ2VxIiwJeyJiYiIsCQkJMHgxOAl9IH0sCi17ICAgICJibHNzIiwJeyJiYiIsCQkJMHgxOQl9IH0sCi17ICAgICJiZ3RydSIsCXsiYmIiLAkJCTB4MWEJfSB9LAoteyAgICAiYmxlcXUiLAl7ImJiIiwJCQkweDFiCX0gfSwKLXsgICAgImJ2YyIsCXsiYmIiLAkJCTB4MWMJfSB9LAoteyAgICAiYnZzIiwJeyJiYiIsCQkJMHgxZAl9IH0sCi17ICAgICJiY2MiLAl7ImJiIiwJCQkweDFlCX0gfSwKLXsgICAgImJnZXF1IiwJeyJiYiIsCQkJMHgxZQl9IH0sCi17ICAgICJibHNzdSIsCXsiYmIiLAkJCTB4MWYJfSB9LAoteyAgICAiYmNzIiwJeyJiYiIsCQkJMHgxZgl9IH0sCi17ICAgICJhZGRwNCIsCXsicndhYnJ3YWIiLAkJMHgyMAl9IH0sCi17ICAgICJhZGRwNiIsCXsicndhYnJ3YWJyd2FiIiwJMHgyMQl9IH0sCi17ICAgICJzdWJwNCIsCXsicndhYnJ3YWIiLAkJMHgyMgl9IH0sCi17ICAgICJzdWJwNiIsCXsicndhYnJ3YWJyd2FiIiwJMHgyMwl9IH0sCi17ICAgICJjdnRwdCIsCXsicndhYmFicndhYiIsCQkweDI0CX0gfSwKLXsgICAgIm11bHAiLAl7InJ3YWJyd2FicndhYiIsCTB4MjUJfSB9LAoteyAgICAiY3Z0dHAiLAl7InJ3YWJhYnJ3YWIiLAkJMHgyNgl9IH0sCi17ICAgICJkaXZwIiwJeyJyd2FicndhYnJ3YWIiLAkweDI3CX0gfSwKLXsgICAgIm1vdmMzIiwJeyJyd2FiYWIiLAkJMHgyOAl9IH0sCi17ICAgICJjbXBjMyIsCXsicndhYmFiIiwJCTB4MjkJfSB9LAoteyAgICAic2NhbmMiLAl7InJ3YWJhYnJiIiwJCTB4MmEJfSB9LAoteyAgICAic3BhbmMiLAl7InJ3YWJhYnJiIiwJCTB4MmIJfSB9LAoteyAgICAibW92YzUiLAl7InJ3YWJyYnJ3YWIiLAkJMHgyYwl9IH0sCi17ICAgICJjbXBjNSIsCXsicndhYnJicndhYiIsCQkweDJkCX0gfSwKLXsgICAgIm1vdnRjIiwJeyJyd2FicmJhYnJ3YWIiLAkweDJlCX0gfSwKLXsgICAgIm1vdnR1YyIsCXsicndhYnJiYWJyd2FiIiwJMHgyZgl9IH0sCi17ICAgICJic2J3IiwJeyJidyIsCQkJMHgzMAl9IH0sCi17ICAgICJicnciLAl7ImJ3IiwJCQkweDMxCX0gfSwKLXsgICAgImN2dHdsIiwJeyJyd3dsIiwJCTB4MzIJfSB9LAoteyAgICAiY3Z0d2IiLAl7InJ3d2IiLAkJMHgzMwl9IH0sCi17ICAgICJtb3ZwIiwJeyJyd2FiYWIiLAkJMHgzNAl9IH0sCi17ICAgICJjbXBwMyIsCXsicndhYmFiIiwJCTB4MzUJfSB9LAoteyAgICAiY3Z0cGwiLAl7InJ3YWJ3bCIsCQkweDM2CX0gfSwKLXsgICAgImNtcHA0IiwJeyJyd2FicndhYiIsCQkweDM3CX0gfSwKLXsgICAgImVkaXRwYyIsCXsicndhYmFiYWIiLAkJMHgzOAl9IH0sCi17ICAgICJtYXRjaGMiLAl7InJ3YWJyd2FiIiwJCTB4MzkJfSB9LAoteyAgICAibG9jYyIsCXsicmJyd2FiIiwJCTB4M2EJfSB9LAoteyAgICAic2twYyIsCXsicmJyd2FiIiwJCTB4M2IJfSB9LAoteyAgICAibW92endsIiwJeyJyd3dsIiwJCTB4M2MJfSB9LAoteyAgICAiYWNidyIsCXsicndyd213YnciLAkJMHgzZAl9IH0sCi17ICAgICJtb3ZhdyIsCXsiYXd3bCIsCQkweDNlCX0gfSwKLXsgICAgInB1c2hhdyIsCXsiYXciLAkJCTB4M2YJfSB9LAoteyAgICAiYWRkZjIiLAl7InJmbWYiLAkJMHg0MAl9IH0sCi17ICAgICJhZGRmMyIsCXsicmZyZndmIiwJCTB4NDEJfSB9LAoteyAgICAic3ViZjIiLAl7InJmbWYiLAkJMHg0Mgl9IH0sCi17ICAgICJzdWJmMyIsCXsicmZyZndmIiwJCTB4NDMJfSB9LAoteyAgICAibXVsZjIiLAl7InJmbWYiLAkJMHg0NAl9IH0sCi17ICAgICJtdWxmMyIsCXsicmZyZndmIiwJCTB4NDUJfSB9LAoteyAgICAiZGl2ZjIiLAl7InJmbWYiLAkJMHg0Ngl9IH0sCi17ICAgICJkaXZmMyIsCXsicmZyZndmIiwJCTB4NDcJfSB9LAoteyAgICAiY3Z0ZmIiLAl7InJmd2IiLAkJMHg0OAl9IH0sCi17ICAgICJjdnRmdyIsCXsicmZ3dyIsCQkweDQ5CX0gfSwKLXsgICAgImN2dGZsIiwJeyJyZndsIiwJCTB4NGEJfSB9LAoteyAgICAiY3Z0cmZsIiwJeyJyZndsIiwJCTB4NGIJfSB9LAoteyAgICAiY3Z0YmYiLAl7InJid2YiLAkJMHg0Ywl9IH0sCi17ICAgICJjdnR3ZiIsCXsicnd3ZiIsCQkweDRkCX0gfSwKLXsgICAgImN2dGxmIiwJeyJybHdmIiwJCTB4NGUJfSB9LAoteyAgICAiYWNiZiIsCXsicmZyZm1mYnciLAkJMHg0Zgl9IH0sCi17ICAgICJtb3ZmIiwJeyJyZndmIiwJCTB4NTAJfSB9LAoteyAgICAiY21wZiIsCXsicmZyZiIsCQkweDUxCX0gfSwKLXsgICAgIm1uZWdmIiwJeyJyZndmIiwJCTB4NTIJfSB9LAoteyAgICAidHN0ZiIsCXsicmYiLAkJCTB4NTMJfSB9LAoteyAgICAiZW1vZGYiLAl7InJmcmJyZndsd2YiLAkJMHg1NAl9IH0sCi17ICAgICJwb2x5ZiIsCXsicmZyd2FiIiwJCTB4NTUJfSB9LAoteyAgICAiY3Z0ZmQiLAl7InJmd2QiLAkJMHg1Ngl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDU3IGlzIG5vdCBkZWZpbmVkIHlldCAqLwoteyAgICAiYWRhd2kiLAl7InJ3bXciLAkJMHg1OAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDU5IGlzIG5vdCBkZWZpbmVkIHlldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wY29kZSA1YSBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGNvZGUgNWIgaXMgbm90IGRlZmluZWQgeWV0ICovCi17ICAgICJpbnNxaGkiLAl7ImFiYXEiLAkJMHg1Ywl9IH0sCi17ICAgICJpbnNxdGkiLAl7ImFiYXEiLAkJMHg1ZAl9IH0sCi17ICAgICJyZW1xaGkiLAl7ImFxd2wiLAkJMHg1ZQl9IH0sCi17ICAgICJyZW1xdGkiLAl7ImFxd2wiLAkJMHg1Zgl9IH0sCi17ICAgICJhZGRkMiIsCXsicmRtZCIsCQkweDYwCX0gfSwKLXsgICAgImFkZGQzIiwJeyJyZHJkd2QiLAkJMHg2MQl9IH0sCi17ICAgICJzdWJkMiIsCXsicmRtZCIsCQkweDYyCX0gfSwKLXsgICAgInN1YmQzIiwJeyJyZHJkd2QiLAkJMHg2Mwl9IH0sCi17ICAgICJtdWxkMiIsCXsicmRtZCIsCQkweDY0CX0gfSwKLXsgICAgIm11bGQzIiwJeyJyZHJkd2QiLAkJMHg2NQl9IH0sCi17ICAgICJkaXZkMiIsCXsicmRtZCIsCQkweDY2CX0gfSwKLXsgICAgImRpdmQzIiwJeyJyZHJkd2QiLAkJMHg2Nwl9IH0sCi17ICAgICJjdnRkYiIsCXsicmR3YiIsCQkweDY4CX0gfSwKLXsgICAgImN2dGR3IiwJeyJyZHd3IiwJCTB4NjkJfSB9LAoteyAgICAiY3Z0ZGwiLAl7InJkd2wiLAkJMHg2YQl9IH0sCi17ICAgICJjdnRyZGwiLAl7InJkd2wiLAkJMHg2Ygl9IH0sCi17ICAgICJjdnRiZCIsCXsicmJ3ZCIsCQkweDZjCX0gfSwKLXsgICAgImN2dHdkIiwJeyJyd3dkIiwJCTB4NmQJfSB9LAoteyAgICAiY3Z0bGQiLAl7InJsd2QiLAkJMHg2ZQl9IH0sCi17ICAgICJhY2JkIiwJeyJyZHJkbWRidyIsCQkweDZmCX0gfSwKLXsgICAgIm1vdmQiLAl7InJkd2QiLAkJMHg3MAl9IH0sCi17ICAgICJjbXBkIiwJeyJyZHJkIiwJCTB4NzEJfSB9LAoteyAgICAibW5lZ2QiLAl7InJkd2QiLAkJMHg3Mgl9IH0sCi17ICAgICJ0c3RkIiwJeyJyZCIsCQkJMHg3Mwl9IH0sCi17ICAgICJlbW9kZCIsCXsicmRyYnJkd2x3ZCIsCQkweDc0CX0gfSwKLXsgICAgInBvbHlkIiwJeyJyZHJ3YWIiLAkJMHg3NQl9IH0sCi17ICAgICJjdnRkZiIsCXsicmR3ZiIsCQkweDc2CX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGNvZGUgNzcgaXMgbm90IGRlZmluZWQgeWV0ICovCi17ICAgICJhc2hsIiwJeyJyYnJsd2wiLAkJMHg3OAl9IH0sCi17ICAgICJhc2hxIiwJeyJyYnJxd3EiLAkJMHg3OQl9IH0sCi17ICAgICJlbXVsIiwJeyJybHJscmx3cSIsCQkweDdhCX0gfSwKLXsgICAgImVkaXYiLAl7InJscnF3bHdsIiwJCTB4N2IJfSB9LAoteyAgICAiY2xyZCIsCXsid2QiLAkJCTB4N2MJfSB9LAoteyAgICAiY2xyZyIsCXsid2ciLAkJCTB4N2MJfSB9LAoteyAgICAiY2xycSIsCXsid2QiLAkJCTB4N2MJfSB9LAoteyAgICAibW92cSIsCXsicnF3cSIsCQkweDdkCX0gfSwKLXsgICAgIm1vdmFxIiwJeyJhcXdsIiwJCTB4N2UJfSB9LAoteyAgICAibW92YWQiLAl7ImFkd2wiLAkJMHg3ZQl9IH0sCi17ICAgICJwdXNoYXEiLAl7ImFxIiwJCQkweDdmCX0gfSwKLXsgICAgInB1c2hhZCIsCXsiYWQiLAkJCTB4N2YJfSB9LAoteyAgICAiYWRkYjIiLAl7InJibWIiLAkJMHg4MAl9IH0sCi17ICAgICJhZGRiMyIsCXsicmJyYndiIiwJCTB4ODEJfSB9LAoteyAgICAic3ViYjIiLAl7InJibWIiLAkJMHg4Mgl9IH0sCi17ICAgICJzdWJiMyIsCXsicmJyYndiIiwJCTB4ODMJfSB9LAoteyAgICAibXVsYjIiLAl7InJibWIiLAkJMHg4NAl9IH0sCi17ICAgICJtdWxiMyIsCXsicmJyYndiIiwJCTB4ODUJfSB9LAoteyAgICAiZGl2YjIiLAl7InJibWIiLAkJMHg4Ngl9IH0sCi17ICAgICJkaXZiMyIsCXsicmJyYndiIiwJCTB4ODcJfSB9LAoteyAgICAiYmlzYjIiLAl7InJibWIiLAkJMHg4OAl9IH0sCi17ICAgICJiaXNiMyIsCXsicmJyYndiIiwJCTB4ODkJfSB9LAoteyAgICAiYmljYjIiLAl7InJibWIiLAkJMHg4YQl9IH0sCi17ICAgICJiaWNiMyIsCXsicmJyYndiIiwJCTB4OGIJfSB9LAoteyAgICAieG9yYjIiLAl7InJibWIiLAkJMHg4Ywl9IH0sCi17ICAgICJ4b3JiMyIsCXsicmJyYndiIiwJCTB4OGQJfSB9LAoteyAgICAibW5lZ2IiLAl7InJid2IiLAkJMHg4ZQl9IH0sCi17ICAgICJjYXNlYiIsCXsicmJyYnJiIiwJCTB4OGYJfSB9LAoteyAgICAibW92YiIsCXsicmJ3YiIsCQkweDkwCX0gfSwKLXsgICAgImNtcGIiLAl7InJicmIiLAkJMHg5MQl9IH0sCi17ICAgICJtY29tYiIsCXsicmJ3YiIsCQkweDkyCX0gfSwKLXsgICAgImJpdGIiLAl7InJicmIiLAkJMHg5Mwl9IH0sCi17ICAgICJjbHJiIiwJeyJ3YiIsCQkJMHg5NAl9IH0sCi17ICAgICJ0c3RiIiwJeyJyYiIsCQkJMHg5NQl9IH0sCi17ICAgICJpbmNiIiwJeyJtYiIsCQkJMHg5Ngl9IH0sCi17ICAgICJkZWNiIiwJeyJtYiIsCQkJMHg5Nwl9IH0sCi17ICAgICJjdnRibCIsCXsicmJ3bCIsCQkweDk4CX0gfSwKLXsgICAgImN2dGJ3IiwJeyJyYnd3IiwJCTB4OTkJfSB9LAoteyAgICAibW92emJsIiwJeyJyYndsIiwJCTB4OWEJfSB9LAoteyAgICAibW92emJ3IiwJeyJyYnd3IiwJCTB4OWIJfSB9LAoteyAgICAicm90bCIsCXsicmJybHdsIiwJCTB4OWMJfSB9LAoteyAgICAiYWNiYiIsCXsicmJyYm1iYnciLAkJMHg5ZAl9IH0sCi17ICAgICJtb3ZhYiIsCXsiYWJ3bCIsCQkweDllCX0gfSwKLXsgICAgInB1c2hhYiIsCXsiYWIiLAkJCTB4OWYJfSB9LAoteyAgICAiYWRkdzIiLAl7InJ3bXciLAkJMHhhMAl9IH0sCi17ICAgICJhZGR3MyIsCXsicndyd3d3IiwJCTB4YTEJfSB9LAoteyAgICAic3VidzIiLAl7InJ3bXciLAkJMHhhMgl9IH0sCi17ICAgICJzdWJ3MyIsCXsicndyd3d3IiwJCTB4YTMJfSB9LAoteyAgICAibXVsdzIiLAl7InJ3bXciLAkJMHhhNAl9IH0sCi17ICAgICJtdWx3MyIsCXsicndyd3d3IiwJCTB4YTUJfSB9LAoteyAgICAiZGl2dzIiLAl7InJ3bXciLAkJMHhhNgl9IH0sCi17ICAgICJkaXZ3MyIsCXsicndyd3d3IiwJCTB4YTcJfSB9LAoteyAgICAiYmlzdzIiLAl7InJ3bXciLAkJMHhhOAl9IH0sCi17ICAgICJiaXN3MyIsCXsicndyd3d3IiwJCTB4YTkJfSB9LAoteyAgICAiYmljdzIiLAl7InJ3bXciLAkJMHhhYQl9IH0sCi17ICAgICJiaWN3MyIsCXsicndyd3d3IiwJCTB4YWIJfSB9LAoteyAgICAieG9ydzIiLAl7InJ3bXciLAkJMHhhYwl9IH0sCi17ICAgICJ4b3J3MyIsCXsicndyd3d3IiwJCTB4YWQJfSB9LAoteyAgICAibW5lZ3ciLAl7InJ3d3ciLAkJMHhhZQl9IH0sCi17ICAgICJjYXNldyIsCXsicndyd3J3IiwJCTB4YWYJfSB9LAoteyAgICAibW92dyIsCXsicnd3dyIsCQkweGIwCX0gfSwKLXsgICAgImNtcHciLAl7InJ3cnciLAkJMHhiMQl9IH0sCi17ICAgICJtY29tdyIsCXsicnd3dyIsCQkweGIyCX0gfSwKLXsgICAgImJpdHciLAl7InJ3cnciLAkJMHhiMwl9IH0sCi17ICAgICJjbHJ3IiwJeyJ3dyIsCQkJMHhiNAl9IH0sCi17ICAgICJ0c3R3IiwJeyJydyIsCQkJMHhiNQl9IH0sCi17ICAgICJpbmN3IiwJeyJtdyIsCQkJMHhiNgl9IH0sCi17ICAgICJkZWN3IiwJeyJtdyIsCQkJMHhiNwl9IH0sCi17ICAgICJiaXNwc3ciLAl7InJ3IiwJCQkweGI4CX0gfSwKLXsgICAgImJpY3BzdyIsCXsicnciLAkJCTB4YjkJfSB9LAoteyAgICAicG9wciIsCXsicnciLAkJCTB4YmEJfSB9LAoteyAgICAicHVzaHIiLAl7InJ3IiwJCQkweGJiCX0gfSwKLXsgICAgImNobWsiLAl7InJ3IiwJCQkweGJjCX0gfSwKLXsgICAgImNobWUiLAl7InJ3IiwJCQkweGJkCX0gfSwKLXsgICAgImNobXMiLAl7InJ3IiwJCQkweGJlCX0gfSwKLXsgICAgImNobXUiLAl7InJ3IiwJCQkweGJmCX0gfSwKLXsgICAgImFkZGwyIiwJeyJybG1sIiwJCTB4YzAJfSB9LAoteyAgICAiYWRkbDMiLAl7InJscmx3bCIsCQkweGMxCX0gfSwKLXsgICAgInN1YmwyIiwJeyJybG1sIiwJCTB4YzIJfSB9LAoteyAgICAic3VibDMiLAl7InJscmx3bCIsCQkweGMzCX0gfSwKLXsgICAgIm11bGwyIiwJeyJybG1sIiwJCTB4YzQJfSB9LAoteyAgICAibXVsbDMiLAl7InJscmx3bCIsCQkweGM1CX0gfSwKLXsgICAgImRpdmwyIiwJeyJybG1sIiwJCTB4YzYJfSB9LAoteyAgICAiZGl2bDMiLAl7InJscmx3bCIsCQkweGM3CX0gfSwKLXsgICAgImJpc2wyIiwJeyJybG1sIiwJCTB4YzgJfSB9LAoteyAgICAiYmlzbDMiLAl7InJscmx3bCIsCQkweGM5CX0gfSwKLXsgICAgImJpY2wyIiwJeyJybG1sIiwJCTB4Y2EJfSB9LAoteyAgICAiYmljbDMiLAl7InJscmx3bCIsCQkweGNiCX0gfSwKLXsgICAgInhvcmwyIiwJeyJybG1sIiwJCTB4Y2MJfSB9LAoteyAgICAieG9ybDMiLAl7InJscmx3bCIsCQkweGNkCX0gfSwKLXsgICAgIm1uZWdsIiwJeyJybHdsIiwJCTB4Y2UJfSB9LAoteyAgICAiY2FzZWwiLAl7InJscmxybCIsCQkweGNmCX0gfSwKLXsgICAgIm1vdmwiLAl7InJsd2wiLAkJMHhkMAl9IH0sCi17ICAgICJjbXBsIiwJeyJybHJsIiwJCTB4ZDEJfSB9LAoteyAgICAibWNvbWwiLAl7InJsd2wiLAkJMHhkMgl9IH0sCi17ICAgICJiaXRsIiwJeyJybHJsIiwJCTB4ZDMJfSB9LAoteyAgICAiY2xyZiIsCXsid2YiLAkJCTB4ZDQJfSB9LAoteyAgICAiY2xybCIsCXsid2wiLAkJCTB4ZDQJfSB9LAoteyAgICAidHN0bCIsCXsicmwiLAkJCTB4ZDUJfSB9LAoteyAgICAiaW5jbCIsCXsibWwiLAkJCTB4ZDYJfSB9LAoteyAgICAiZGVjbCIsCXsibWwiLAkJCTB4ZDcJfSB9LAoteyAgICAiYWR3YyIsCXsicmxtbCIsCQkweGQ4CX0gfSwKLXsgICAgInNid2MiLAl7InJsbWwiLAkJMHhkOQl9IH0sCi17ICAgICJtdHByIiwJeyJybHJsIiwJCTB4ZGEJfSB9LAoteyAgICAibWZwciIsCXsicmx3bCIsCQkweGRiCX0gfSwKLXsgICAgIm1vdnBzbCIsCXsid2wiLAkJCTB4ZGMJfSB9LAoteyAgICAicHVzaGwiLAl7InJsIiwJCQkweGRkCX0gfSwKLXsgICAgIm1vdmFsIiwJeyJhbHdsIiwJCTB4ZGUJfSB9LAoteyAgICAibW92YWYiLAl7ImFmd2wiLAkJMHhkZQl9IH0sCi17ICAgICJwdXNoYWwiLAl7ImFsIiwJCQkweGRmCX0gfSwKLXsgICAgInB1c2hhZiIsCXsiYWYiLAkJCTB4ZGYJfSB9LAoteyAgICAiYmJzIiwJeyJybHZiYmIiLAkJMHhlMAl9IH0sCi17ICAgICJiYmMiLAl7InJsdmJiYiIsCQkweGUxCX0gfSwKLXsgICAgImJic3MiLAl7InJsdmJiYiIsCQkweGUyCX0gfSwKLXsgICAgImJiY3MiLAl7InJsdmJiYiIsCQkweGUzCX0gfSwKLXsgICAgImJic2MiLAl7InJsdmJiYiIsCQkweGU0CX0gfSwKLXsgICAgImJiY2MiLAl7InJsdmJiYiIsCQkweGU1CX0gfSwKLXsgICAgImJic3NpIiwJeyJybHZiYmIiLAkJMHhlNgl9IH0sCi17ICAgICJiYmNjaSIsCXsicmx2YmJiIiwJCTB4ZTcJfSB9LAoteyAgICAiYmxicyIsCXsicmxiYiIsCQkweGU4CX0gfSwKLXsgICAgImJsYmMiLAl7InJsYmIiLAkJMHhlOQl9IH0sCi17ICAgICJmZnMiLAl7InJscmJ2YndsIiwJCTB4ZWEJfSB9LAoteyAgICAiZmZjIiwJeyJybHJidmJ3bCIsCQkweGViCX0gfSwKLXsgICAgImNtcHYiLAl7InJscmJ2YnJsIiwJCTB4ZWMJfSB9LAoteyAgICAiY21wenYiLAl7InJscmJ2YnJsIiwJCTB4ZWQJfSB9LAoteyAgICAiZXh0diIsCXsicmxyYnZid2wiLAkJMHhlZQl9IH0sCi17ICAgICJleHR6diIsCXsicmxyYnZid2wiLAkJMHhlZgl9IH0sCi17ICAgICJpbnN2IiwJeyJybHJscmJ2YiIsCQkweGYwCX0gfSwKLXsgICAgImFjYmwiLAl7InJscmxtbGJ3IiwJCTB4ZjEJfSB9LAoteyAgICAiYW9ibHNzIiwJeyJybG1sYmIiLAkJMHhmMgl9IH0sCi17ICAgICJhb2JsZXEiLAl7InJsbWxiYiIsCQkweGYzCX0gfSwKLXsgICAgInNvYmdlcSIsCXsibWxiYiIsCQkweGY0CX0gfSwKLXsgICAgInNvYmd0ciIsCXsibWxiYiIsCQkweGY1CX0gfSwKLXsgICAgImN2dGxiIiwJeyJybHdiIiwJCTB4ZjYJfSB9LAoteyAgICAiY3Z0bHciLAl7InJsd3ciLAkJMHhmNwl9IH0sCi17ICAgICJhc2hwIiwJeyJyYnJ3YWJyYnJ3YWIiLAkweGY4CX0gfSwKLXsgICAgImN2dGxwIiwJeyJybHJ3YWIiLAkJMHhmOQl9IH0sCi17ICAgICJjYWxsZyIsCXsiYWJhYiIsCQkweGZhCX0gfSwKLXsgICAgImNhbGxzIiwJeyJybGFiIiwJCTB4ZmIJfSB9LAoteyAgICAieGZjIiwJeyIiLAkJCTB4ZmMJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZGVmaW5lZCBvcGNvZGVzIGhlcmUgKi8KLXsgICAgImN2dGRoIiwJeyJyZHdoIiwJCTB4MzJmZAl9IH0sCi17ICAgICJjdnRnZiIsCXsicmd3aCIsCQkweDMzZmQJfSB9LAoteyAgICAiYWRkZzIiLAl7InJnbWciLAkJMHg0MGZkCX0gfSwKLXsgICAgImFkZGczIiwJeyJyZ3Jnd2ciLAkJMHg0MWZkCX0gfSwKLXsgICAgInN1YmcyIiwJeyJyZ21nIiwJCTB4NDJmZAl9IH0sCi17ICAgICJzdWJnMyIsCXsicmdyZ3dnIiwJCTB4NDNmZAl9IH0sCi17ICAgICJtdWxnMiIsCXsicmdtZyIsCQkweDQ0ZmQJfSB9LAoteyAgICAibXVsZzMiLAl7InJncmd3ZyIsCQkweDQ1ZmQJfSB9LAoteyAgICAiZGl2ZzIiLAl7InJnbWciLAkJMHg0NmZkCX0gfSwKLXsgICAgImRpdmczIiwJeyJyZ3Jnd2ciLAkJMHg0N2ZkCX0gfSwKLXsgICAgImN2dGdiIiwJeyJyZ3diIiwJCTB4NDhmZAl9IH0sCi17ICAgICJjdnRndyIsCXsicmd3dyIsCQkweDQ5ZmQJfSB9LAoteyAgICAiY3Z0Z2wiLAl7InJnd2wiLAkJMHg0YWZkCX0gfSwKLXsgICAgImN2dHJnbCIsCXsicmd3bCIsCQkweDRiZmQJfSB9LAoteyAgICAiY3Z0YmciLAl7InJid2ciLAkJMHg0Y2ZkCX0gfSwKLXsgICAgImN2dHdnIiwJeyJyd3dnIiwJCTB4NGRmZAl9IH0sCi17ICAgICJjdnRsZyIsCXsicmx3ZyIsCQkweDRlZmQJfSB9LAoteyAgICAiYWNiZyIsCXsicmdyZ21nYnciLAkJMHg0ZmZkCX0gfSwKLXsgICAgIm1vdmciLAl7InJnd2ciLAkJMHg1MGZkCX0gfSwKLXsgICAgImNtcGciLAl7InJncmciLAkJMHg1MWZkCX0gfSwKLXsgICAgIm1uZWdnIiwJeyJyZ3dnIiwJCTB4NTJmZAl9IH0sCi17ICAgICJ0c3RnIiwJeyJyZyIsCQkJMHg1M2ZkCX0gfSwKLXsgICAgImVtb2RnIiwJeyJyZ3J3cmd3bHdnIiwJCTB4NTRmZAl9IH0sCi17ICAgICJwb2x5ZyIsCXsicmdyd2FiIiwJCTB4NTVmZAl9IH0sCi17ICAgICJjdnRnaCIsCXsicmd3aCIsCQkweDU2ZmQJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZGVmaW5lZCBvcGNvZGVzIGhlcmUgKi8KLXsgICAgImFkZGgyIiwJeyJyaG1oIiwJCTB4NjBmZAl9IH0sCi17ICAgICJhZGRoMyIsCXsicmhyaHdoIiwJCTB4NjFmZAl9IH0sCi17ICAgICJzdWJoMiIsCXsicmhtaCIsCQkweDYyZmQJfSB9LAoteyAgICAic3ViaDMiLAl7InJocmh3aCIsCQkweDYzZmQJfSB9LAoteyAgICAibXVsaDIiLAl7InJobWgiLAkJMHg2NGZkCX0gfSwKLXsgICAgIm11bGgzIiwJeyJyaHJod2giLAkJMHg2NWZkCX0gfSwKLXsgICAgImRpdmgyIiwJeyJyaG1oIiwJCTB4NjZmZAl9IH0sCi17ICAgICJkaXZoMyIsCXsicmhyaHdoIiwJCTB4NjdmZAl9IH0sCi17ICAgICJjdnRoYiIsCXsicmh3YiIsCQkweDY4ZmQJfSB9LAoteyAgICAiY3Z0aHciLAl7InJod3ciLAkJMHg2OWZkCX0gfSwKLXsgICAgImN2dGhsIiwJeyJyaHdsIiwJCTB4NmFmZAl9IH0sCi17ICAgICJjdnRyaGwiLAl7InJod2wiLAkJMHg2YmZkCX0gfSwKLXsgICAgImN2dGJoIiwJeyJyYndoIiwJCTB4NmNmZAl9IH0sCi17ICAgICJjdnR3aCIsCXsicnd3aCIsCQkweDZkZmQJfSB9LAoteyAgICAiY3Z0bGgiLAl7InJsd2giLAkJMHg2ZWZkCX0gfSwKLXsgICAgImFjYmgiLAl7InJocmhtaGJ3IiwJCTB4NmZmZAl9IH0sCi17ICAgICJtb3ZoIiwJeyJyaHdoIiwJCTB4NzBmZAl9IH0sCi17ICAgICJjbXBoIiwJeyJyaHJoIiwJCTB4NzFmZAl9IH0sCi17ICAgICJtbmVnaCIsCXsicmh3aCIsCQkweDcyZmQJfSB9LAoteyAgICAidHN0aCIsCXsicmgiLAkJCTB4NzNmZAl9IH0sCi17ICAgICJlbW9kaCIsCXsicmhyd3Jod2x3aCIsCQkweDc0ZmQJfSB9LAoteyAgICAicG9seWgiLAl7InJocndhYiIsCQkweDc1ZmQJfSB9LAoteyAgICAiY3Z0aGciLAl7InJod2ciLAkJMHg3NmZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjbHJoIiwJeyJ3aCIsCQkJMHg3Y2ZkCX0gfSwKLXsgICAgImNscm8iLAl7IndvIiwJCQkweDdjZmQJfSB9LAoteyAgICAibW92byIsCXsicm93byIsCQkweDdkZmQJfSB9LAoteyAgICAibW92YWgiLAl7ImFod2wiLAkJMHg3ZWZkCX0gfSwKLXsgICAgIm1vdmFvIiwJeyJhb3dsIiwJCTB4N2VmZAl9IH0sCi17ICAgICJwdXNoYWgiLAl7ImFoIiwJCQkweDdmZmQJfSB9LAoteyAgICAicHVzaGFvIiwJeyJhbyIsCQkJMHg3ZmZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjdnRmaCIsCXsicmZ3aCIsCQkweDk4ZmQJfSB9LAoteyAgICAiY3Z0ZmciLAl7InJmd2ciLAkJMHg5OWZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjdnRoZiIsCXsicmh3ZiIsCQkweGY2ZmQJfSB9LAoteyAgICAiY3Z0aGQiLAl7InJod2QiLAkJMHhmN2ZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJidWdsIiwJeyJybCIsCQkJMHhmZGZmCX0gfSwKLXsgICAgImJ1Z3ciLAl7InJ3IiwJCQkweGZlZmYJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZGVmaW5lZCBvcGNvZGVzIGhlcmUgKi8KLQoteyAgICAgICIiLAl7IiIsIDB9IH0JCS8qIGVtcHR5IGlzIGVuZCBzZW50aW5lbCAqLwotCi19OwkJCQkvKiB2b3RzdHJzICovCi0KLS8qIGVuZDogdmF4Lm9wY29kZS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zOWsuaCBiL2luY2x1ZGUvb3M5ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjJlZWQyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3M5ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLSNpZiAhZGVmaW5lZChfTU9EVUxFX0gpCi0jZGVmaW5lIF9NT0RVTEVfSAotCi0vKiBPUy05MDAwIGkzODYgbW9kdWxlIGhlYWRlciBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBfTVBGMzg2Ci0KLS8qIHNpemVvZiBjb21tb24gaGVhZGVyIGxlc3MgcGFyaXR5IGZpZWxkICovCi0jZGVmaW5lIE5fTV9QQVJJVFkgIChzaXplb2YobWhfY29tKS1zaXplb2YodW5pc2duZWQgc2hvcnQpKQotI2RlZmluZSBPTERfTV9QQVJJVFkgNDYKLSNkZWZpbmUgTV9QQVJJVFkgTl9NX1BBUklUWQotCi0jaWZkZWYgX01QRjY4SwotI2RlZmluZSBNT0RTWU5DIDB4NGFmZCAgICAgIC8qIG1vZHVsZSBoZWFkZXIgc3luYyBjb2RlIGZvciA2ODB4MCBwcm9jZXNzb3JzICovCi0jZW5kaWYKLQotI2lmZGVmIF9NUEYzODYKLSNkZWZpbmUgTU9EU1lOQyAweDRhZmMgICAgICAvKiBtb2R1bGUgaGVhZGVyIHN5bmMgY29kZSBmb3IgODAzODYgcHJvY2Vzc29ycyAqLwotI2VuZGlmCi0KLSNkZWZpbmUgTU9EUkVWCTEJCQkvKiBtb2R1bGUgZm9ybWF0IHJldmlzaW9uIDEgKi8KLSNkZWZpbmUgQ1JDQ09OCTB4ODAwZmUzCS8qIGNyYyBwb2x5bm9taWFsIGNvbnN0YW50ICovCi0KLS8qIE1vZHVsZSBhY2Nlc3MgcGVybWlzc2lvbiB2YWx1ZXMgKi8KLSNkZWZpbmUgTVBfT1dORVJfUkVBRAkweDAwMDEKLSNkZWZpbmUgTVBfT1dORVJfV1JJVEUJMHgwMDAyCi0jZGVmaW5lIE1QX09XTkVSX0VYRUMJMHgwMDA0Ci0jZGVmaW5lIE1QX0dST1VQX1JFQUQJMHgwMDEwCi0jZGVmaW5lIE1QX0dST1VQX1dSSVRFCTB4MDAyMAotI2RlZmluZSBNUF9HUk9VUF9FWEVDCTB4MDA0MAotI2RlZmluZSBNUF9XT1JMRF9SRUFECTB4MDEwMAotI2RlZmluZSBNUF9XT1JMRF9XUklURQkweDAyMDAKLSNkZWZpbmUgTVBfV09STERfRVhFQwkweDA0MDAKLSNkZWZpbmUgTVBfV09STERfQUNDRVNTCTB4MDc3NwotI2RlZmluZSBNUF9PV05FUl9NQVNLCTB4MDAwZgotI2RlZmluZSBNUF9HUk9VUF9NQVNLCTB4MDBmMAotI2RlZmluZSBNUF9XT1JMRF9NQVNLCTB4MGYwMAotI2RlZmluZSBNUF9TWVNUTV9NQVNLCTB4ZjAwMAotCi0vKiBNb2R1bGUgVHlwZS9MYW5ndWFnZSB2YWx1ZXMgKi8KLSNkZWZpbmUgTVRfQU5ZCQkwCi0jZGVmaW5lIE1UX1BST0dSQU0JMHgwMDAxCi0jZGVmaW5lIE1UX1NVQlJPVVQJMHgwMDAyCi0jZGVmaW5lIE1UX01VTFRJCTB4MDAwMwotI2RlZmluZSBNVF9EQVRBCQkweDAwMDQKLSNkZWZpbmUgTVRfVFJBUExJQgkweDAwMGIKLSNkZWZpbmUgTVRfU1lTVEVNCTB4MDAwYwotI2RlZmluZSBNVF9GSUxFTUFOCTB4MDAwZAotI2RlZmluZSBNVF9ERVZEUlZSCTB4MDAwZSAKLSNkZWZpbmUgTVRfREVWREVTQwkweDAwMGYKLSNkZWZpbmUgTVRfTUFTSwkJMHhmZjAwCi0KLSNkZWZpbmUgTUxfQU5ZCQkwCi0jZGVmaW5lIE1MX09CSkVDVAkxCi0jZGVmaW5lIE1MX0lDT0RFCTIKLSNkZWZpbmUgTUxfUENPREUJMwotI2RlZmluZSBNTF9DQ09ERQk0Ci0jZGVmaW5lIE1MX0NCTENPREUJNQotI2RlZmluZSBNTF9GUlROQ09ERQk2Ci0jZGVmaW5lIE1MX01BU0sJCTB4MDBmZgotCi0jZGVmaW5lIG1rdHlwZWxhbmcodHlwZSxsYW5nKQkoKCh0eXBlKTw8OCl8KGxhbmcpKQotCi0vKiBNb2R1bGUgQXR0cmlidXRlIHZhbHVlcyAqLwotI2RlZmluZSBNQV9SRUVOVAkweDgwCi0jZGVmaW5lIE1BX0dIT1NUCTB4NDAKLSNkZWZpbmUgTUFfU1VQRVIJMHgyMAotI2RlZmluZSBNQV9NQVNLCQkweGZmMDAKLSNkZWZpbmUgTVJfTUFTSwkJMHgwMGZmCi0KLSNkZWZpbmUgbWthdHRyZXZzKGF0dHIsIHJldnMpCSgoKGF0dHIpPDw4KXwocmV2cykpCi0KLSNkZWZpbmUgbV91c2VyIG1fb3duZXIuZ3JwX3Vzci51c3IKLSNkZWZpbmUgbV9ncm91cCBtX293bmVyLmdycF91c3IuZ3JwCi0jZGVmaW5lIG1fZ3JvdXBfdXNlciBtX293bmVyLmdyb3VwX3VzZXIKLQotLyogbWFjcm8gZGVmaW5pdGlvbnMgZm9yIGFjY2Vzc2luZyBtb2R1bGUgaGVhZGVyIGZpZWxkcyAqLwotI2RlZmluZSBNT0ROQU1FKG1vZCkgKCh1X2NoYXIqKSgodV9jaGFyKiltb2QgKyAoKE1oX2NvbSltb2QpLT5tX25hbWUpKQotI2lmIDAKLS8qIEFwcGVhcnMgbm90IHRvIGJlIHVzZWQsIGFuZCB0aGUgdV9pbnQzMiB0eXBlZGVmIGlzIGdvbmUgKGJlY2F1c2UgaXQKLSAgIGNvbmZsaWN0ZWQgd2l0aCBhIE1hY2ggaGVhZGVyLiAgKi8KLSNkZWZpbmUgTU9EU0laRShtb2QpICgodV9pbnQzMikoKE1oX2NvbSltb2QpLT5tX3NpemUpCi0jZW5kaWYgLyogMCAqLwotI2RlZmluZSBNSENPTV9CWVRFU19TSVpFIDgwCi0jZGVmaW5lIE5fQkFETUFHKGEpICgoKGEpLmFfaW5mbykgIT0gTU9EU1lOQykKLQotdHlwZWRlZiBzdHJ1Y3QgbWhfY29tIHsKLSAgLyogc3luYyBieXRlcyAoJDRhZmMpLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtX3N5bmNbMl07Ci0gIHVuc2lnbmVkIGNoYXIgbV9zeXNyZXZbMl07CQkvKiBzeXN0ZW0gcmV2aXNpb24gY2hlY2sgdmFsdWUgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fc2l6ZVs0XTsJCQkvKiBtb2R1bGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyCi0gICAgbV9vd25lcls0XTsJCS8qIGdyb3VwL3VzZXIgaWQgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fbmFtZVs0XTsJCQkvKiBvZmZzZXQgdG8gbW9kdWxlIG5hbWUgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fYWNjZXNzWzJdLAkJLyogYWNjZXNzIHBlcm1pc3Npb25zICovCi0gICAgbV90eWxhblsyXSwJCS8qIHR5cGUvbGFuZyAqLwotICAgIG1fYXR0cmV2WzJdLAkJLyogcmV2L2F0dHIgKi8KLSAgICBtX2VkaXRbMl07CQkJLyogZWRpdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCi0gICAgbV9uZWVkc1s0XSwJCS8qIG1vZHVsZSBoYXJkd2FyZSByZXF1aXJlbWVudHMgZmxhZ3MuIChyZXNlcnZlZCkgKi8KLSAgICBtX3VzYWdlWzRdLAkJLyogY29tbWVudCBzdHJpbmcgb2Zmc2V0ICovCi0gICAgbV9zeW1ib2xbNF0sCQkvKiBzeW1ib2wgdGFibGUgb2Zmc2V0ICovCi0gICAgbV9leGVjWzRdLAkJCS8qIG9mZnNldCB0byBleGVjdXRpb24gZW50cnkgcG9pbnQgKi8KLSAgICBtX2V4Y3B0WzRdLAkJLyogb2Zmc2V0IHRvIGV4Y2VwdGlvbiBlbnRyeSBwb2ludCAqLwotICAgIG1fZGF0YVs0XSwJCQkvKiBkYXRhIHN0b3JhZ2UgcmVxdWlyZW1lbnQgKi8KLSAgICBtX3N0YWNrWzRdLAkJLyogc3RhY2sgc2l6ZSAqLwotICAgIG1faWRhdGFbNF0sCQkvKiBvZmZzZXQgdG8gaW5pdGlhbGl6ZWQgZGF0YSAqLwotICAgIG1faWRyZWZbNF0sCQkvKiBvZmZzZXQgdG8gZGF0YSByZWZlcmVuY2UgbGlzdHMgKi8KLSAgICBtX2luaXRbNF0sCQkJLyogaW5pdGlhbGl6YXRpb24gcm91dGluZSBvZmZzZXQgKi8KLSAgICBtX3Rlcm1bNF07CQkJLyogdGVybWluYXRpb24gcm91dGluZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1faWRlbnRbMl07CQkvKiBpZGVudCBjb2RlIGZvciBpZGVudCBwcm9ncmFtICovCi0gIGNoYXIKLSAgICBtX3NwYXJlWzhdOwkvKiByZXNlcnZlZCBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCi0gICAgbV9wYXJpdHlbMl07IAkJLyogaGVhZGVyIHBhcml0eSAqLwotfSBtaF9jb20sKk1oX2NvbTsKLQotLyogRXhlY3V0YWJsZSBtZW1vcnkgbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfZXhlYyxtaF9leGVjOwotCi0vKiBEYXRhIG1lbW9yeSBtb2R1bGUgKi8KLXR5cGVkZWYgbWhfY29tICpNaF9kYXRhLG1oX2RhdGE7Ci0KLS8qIEZpbGUgbWFuYWdlciBtZW1vcnkgbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfZm1hbixtaF9mbWFuOwotCi0vKiBkZXZpY2UgZHJpdmVyIG1vZHVsZSAqLwotdHlwZWRlZiBtaF9jb20gKk1oX2RydnIsbWhfZHJ2cjsKLQotLyogdHJhcCBoYW5kbGVyIG1vZHVsZSAqLwotdHlwZWRlZgltaF9jb20gbWhfdHJhcCwgKk1oX3RyYXA7Ci0KLS8qIERldmljZSBkZXNjcmlwdG9yIG1vZHVsZSAqLwotdHlwZWRlZgltaF9jb20gKk1oX2RldixtaF9kZXY7Ci0KLS8qIENvbmZpZ3VyYXRpb24gbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfY29uZmlnLCBtaF9jb25maWc7Ci0KLSNpZiAwIAotCi0jaWYgIWRlZmluZWQoX01PRERJUl9IKQotLyogZ28gZ2V0IF9vc19mbW9kIChhbmQgb3RoZXJzKSAqLwotI2luY2x1ZGUgPG1vZGRpci5oPgotI2VuZGlmCi0KLWVycm9yX2NvZGUgX29zX2NyYyh2b2lkICosIHVfaW50MzIsIGludCAqKTsKLWVycm9yX2NvZGUgX29zX2RhdG1vZChjaGFyICosIHVfaW50MzIsIHVfaW50MTYgKiwgdV9pbnQxNiAqLCB1X2ludDMyLCB2b2lkICoqLCBtaF9kYXRhICoqKTsKLWVycm9yX2NvZGUgX29zX2dldF9tb2RkaXIodm9pZCAqLCB1X2ludDMyICopOwotZXJyb3JfY29kZSBfb3NfaW5pdGRhdGEobWhfY29tICosIHZvaWQgKik7Ci1lcnJvcl9jb2RlIF9vc19saW5rKGNoYXIgKiosIG1oX2NvbSAqKiwgdm9pZCAqKiwgdV9pbnQxNiAqLCB1X2ludDE2ICopOwotZXJyb3JfY29kZSBfb3NfbGlua20obWhfY29tICosIHZvaWQgKiosIHVfaW50MTYgKiwgdV9pbnQxNiAqKTsKLWVycm9yX2NvZGUgX29zX2xvYWQoY2hhciAqLCBtaF9jb20gKiosIHZvaWQgKiosIHVfaW50MzIsIHVfaW50MTYgKiwgdV9pbnQxNiAqLCB1X2ludDMyKTsKLWVycm9yX2NvZGUgX29zX21rbW9kdWxlKGNoYXIgKiwgdV9pbnQzMiwgdV9pbnQxNiAqLCB1X2ludDE2ICosIHVfaW50MzIsIHZvaWQgKiosIG1oX2NvbSAqKiwgdV9pbnQzMik7Ci1lcnJvcl9jb2RlIF9vc19tb2RhZGRyKHZvaWQgKiwgbWhfY29tICoqKTsKLWVycm9yX2NvZGUgX29zX3NldGNyYyhtaF9jb20gKik7Ci1lcnJvcl9jb2RlIF9vc19zbGluayh1X2ludDMyLCBjaGFyICosIHZvaWQgKiosIHZvaWQgKiosIG1oX2NvbSAqKik7Ci1lcnJvcl9jb2RlIF9vc19zbGlua20odV9pbnQzMiwgbWhfY29tICosIHZvaWQgKiosIHZvaWQgKiopOwotZXJyb3JfY29kZSBfb3NfdW5saW5rKG1oX2NvbSAqKTsKLWVycm9yX2NvZGUgX29zX3VubG9hZChjaGFyICosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfdGxpbmsodV9pbnQzMiwgY2hhciAqLCB2b2lkICoqLCBtaF90cmFwICoqLCB2b2lkICosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfdGxpbmttKHVfaW50MzIsIG1oX2NvbSAqLCB2b2lkICoqLCB2b2lkICosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfaW9kZWwobWhfY29tICopOwotZXJyb3JfY29kZSBfb3Nfdm1vZHVsKG1oX2NvbSAqLCBtaF9jb20gKiwgdV9pbnQzMik7Ci0jZW5kaWYgLyogMCAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJvZ3Jlc3MuaCBiL2luY2x1ZGUvcHJvZ3Jlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4MzE4YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3Byb2dyZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBEZWZhdWx0IGRlZmluaXRpb25zIGZvciBwcm9ncmVzcyBtYWNyb3MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBkZWZhdWx0IGRlZmluaXRpb25zIGJlbG93IGFyZSBpbnRlbmRlZCB0byBiZSByZXBsYWNlZCBieSByZWFsCi0gICBkZWZpbml0aW9ucywgaWYgYnVpbGRpbmcgdGhlIHRvb2xzIGZvciBhbiBpbnRlcmFjdGl2ZSBwcm9ncmFtbWluZwotICAgZW52aXJvbm1lbnQuICAqLwotCi0jaWZuZGVmIF9QUk9HUkVTU19ICi0jZGVmaW5lIF9QUk9HUkVTU19ICi0KLSNpZm5kZWYgU1RBUlRfUFJPR1JFU1MKLSNkZWZpbmUgU1RBUlRfUFJPR1JFU1MoU1RSLE4pCi0jZW5kaWYKLQotI2lmbmRlZiBQUk9HUkVTUwotI2RlZmluZSBQUk9HUkVTUyhYKQotI2VuZGlmCi0KLSNpZm5kZWYgRU5EX1BST0dSRVNTCi0jZGVmaW5lIEVORF9QUk9HUkVTUyhTVFIpCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9QUk9HUkVTU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JlZ3MvQ2hhbmdlTG9nIGIvaW5jbHVkZS9yZWdzL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JlZ3MvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmVtb3RlLXNpbS5oIGIvaW5jbHVkZS9yZW1vdGUtc2ltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NDgwYjQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yZW1vdGUtc2ltLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLyogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBzaW11bGF0b3IgYW5kIGdkYi4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgIWRlZmluZWQgKFJFTU9URV9TSU1fSCkKLSNkZWZpbmUgUkVNT1RFX1NJTV9IIDEKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBUaGlzIGZpbGUgaXMgdXNlZCB3aGVuIGJ1aWxkaW5nIHN0YW5kLWFsb25lIHNpbXVsYXRvcnMsIHNvIGlzb2xhdGUgdGhpcwotICAgZmlsZSBmcm9tIGdkYi4gICovCi0KLS8qIFBpY2sgdXAgQ09SRV9BRERSX1RZUEUgaWYgZGVmaW5lZCAoZnJvbSBnZGIpLCBvdGhlcndpc2UgdXNlIHNhbWUgdmFsdWUgYXMKLSAgIGdkYiBkb2VzICh1bnNpZ25lZCBpbnQgLSBmcm9tIGRlZnMuaCkuICAqLwotCi0jaWZuZGVmIENPUkVfQUREUl9UWVBFCi10eXBlZGVmIHVuc2lnbmVkIGludCBTSU1fQUREUjsKLSNlbHNlCi10eXBlZGVmIENPUkVfQUREUl9UWVBFIFNJTV9BRERSOwotI2VuZGlmCi0KLQotLyogU2VtaS1vcGFxdWUgdHlwZSB1c2VkIGFzIHJlc3VsdCBvZiBzaW1fb3BlbiBhbmQgcGFzc2VkIGJhY2sgdG8gYWxsCi0gICBvdGhlciByb3V0aW5lcy4gICJkZXNjIiBpcyBzaG9ydCBmb3IgImRlc2NyaXB0b3IiLgotICAgSXQgaXMgdXAgdG8gZWFjaCBzaW11bGF0b3IgdG8gZGVmaW5lIGBzaW1fc3RhdGUnLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgc2ltX3N0YXRlICpTSU1fREVTQzsKLQotCi0vKiBWYWx1ZXMgZm9yIGBraW5kJyBhcmcgdG8gc2ltX29wZW4uICAqLwotCi10eXBlZGVmIGVudW0gewotICBTSU1fT1BFTl9TVEFOREFMT05FLCAvKiBzaW11bGF0b3IgdXNlZCBzdGFuZGFsb25lIChydW4uYykgKi8KLSAgU0lNX09QRU5fREVCVUcgICAgICAgLyogc2ltdWxhdG9yIHVzZWQgYnkgZGVidWdnZXIgKGdkYikgKi8KLX0gU0lNX09QRU5fS0lORDsKLQotCi0vKiBSZXR1cm4gY29kZXMgZnJvbSB2YXJpb3VzIGZ1bmN0aW9ucy4gICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIFNJTV9SQ19GQUlMID0gMCwKLSAgU0lNX1JDX09LID0gMSwKLSAgU0lNX1JDX1VOS05PV05fQlJFQUtQT0lOVCA9IDIsCi0gIFNJTV9SQ19JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTID0gMywKLSAgU0lNX1JDX0RVUExJQ0FURV9CUkVBS1BPSU5UID0gNAotfSBTSU1fUkM7Ci0KLQotLyogVGhlIGJmZCBzdHJ1Y3QsIGFzIGFuIG9wYXF1ZSB0eXBlLiAgKi8KLQotc3RydWN0IF9iZmQ7Ci0KLQotLyogTWFpbiBzaW11bGF0b3IgZW50cnkgcG9pbnRzLiAgKi8KLQotCi0vKiBDcmVhdGUgYSBmdWxseSBpbml0aWFsaXplZCBzaW11bGF0b3IgaW5zdGFuY2UuCi0KLSAgIChUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBzaW11bGF0b3IgaXMgc2VsZWN0ZWQgZnJvbSB0aGUKLSAgIGdkYiBjb21tYW5kIGxpbmUuKQotCi0gICBLSU5EIHNwZWNpZmllcyBob3cgdGhlIHNpbXVsYXRvciBzaGFsbCBiZSB1c2VkLiAgQ3VycmVudGx5IHRoZXJlCi0gICBhcmUgb25seSB0d28ga2luZHM6IHN0YW5kLWFsb25lIGFuZCBkZWJ1Zy4KLQotICAgQ0FMTEJBQ0sgc3BlY2lmaWVzIGEgc3RhbmRhcmQgaG9zdCBjYWxsYmFjayAoZGVmaW5lZCBpbiBjYWxsYmFjay5oKS4KLQotICAgQUJGRCwgd2hlbiBub24gTlVMTCwgZGVzaWduYXRlcyBhIHRhcmdldCBwcm9ncmFtLiAgVGhlIHByb2dyYW0gaXMKLSAgIG5vdCBsb2FkZWQuCi0KLSAgIEFSR1YgaXMgYSBzdGFuZGFyZCBBUkdWIHBvaW50ZXIgc3VjaCBhcyB0aGF0IHBhc3NlZCBmcm9tIHRoZQotICAgY29tbWFuZCBsaW5lLiAgVGhlIHN5bnRheCBvZiB0aGUgYXJndW1lbnQgbGlzdCBpcyBpcyBhc3N1bWVkIHRvIGJlCi0gICBgYFNJTS1QUk9HIHsgU0lNLU9QVElPTiB9IFsgVEFSR0VULVBST0dSQU0geyBUQVJHRVQtT1BUSU9OIH0gXScnLgotICAgVGhlIHRyYWlsaW5nIFRBUkdFVC1QUk9HUkFNIGFuZCBhcmdzIGFyZSBvbmx5IHZhbGlkIGZvciBhCi0gICBzdGFuZC1hbG9uZSBzaW11bGF0b3IuCi0KLSAgIE9uIHN1Y2Nlc3MsIHRoZSByZXN1bHQgaXMgYSBub24gTlVMTCBkZXNjcmlwdG9yIHRoYXQgc2hhbGwgYmUKLSAgIHBhc3NlZCB0byB0aGUgb3RoZXIgc2ltX2ZvbyBmdW5jdGlvbnMuICBXaGlsZSB0aGUgc2ltdWxhdG9yCi0gICBjb25maWd1cmF0aW9uIGNhbiBiZSBwYXJhbWV0ZXJpemVkIGJ5IChpbiBkZWNyZWFzaW5nIHByZWNlZGVuY2UpCi0gICBBUkdWJ3MgU0lNLU9QVElPTiwgQVJHVidzIFRBUkdFVC1QUk9HUkFNIGFuZCB0aGUgQUJGRCBhcmd1bWVudCwgdGhlCi0gICBzdWNjZXNzZnVsIGNyZWF0aW9uIG9mIHRoZSBzaW11bGF0b3Igc2hhbGwgbm90IGRlcGVuZGVudCBvbiB0aGUKLSAgIHByZXNlbmNlIG9mIGFueSBvZiB0aGVzZSBhcmd1bWVudHMvb3B0aW9ucy4KLQotICAgSGFyZHdhcmUgc2ltdWxhdG9yOiBUaGUgY3JlYXRlZCBzaW11bGF0b3Igc2hhbGwgYmUgc3VmZmljaWVudGx5Ci0gICBpbml0aWFsaXplZCB0byBoYW5kbGUsIHdpdGggb3V0IHJlc3RyaWN0aW9ucyBhbnkgY2xpZW50IHJlcXVlc3RzCi0gICAoaW5jbHVkaW5nIG1lbW9yeSByZWFkcy93cml0ZXMsIHJlZ2lzdGVyIGZldGNoL3N0b3JlcyBhbmQgYQotICAgcmVzdW1lKS4KLQotICAgUHJvY2VzcyBzaW11bGF0b3I6IHRoYXQgcHJvY2VzcyBpcyBub3QgY3JlYXRlZCB1bnRpbCBhIGNhbGwgdG8KLSAgIHNpbV9jcmVhdGVfaW5mZXJpb3IuICBGSVhNRTogV2hhdCBzaG91bGQgdGhlIHN0YXRlIG9mIHRoZSBzaW11bGF0b3IKLSAgIGJlPyAqLwotCi1TSU1fREVTQyBzaW1fb3BlbiBQQVJBTVMgKChTSU1fT1BFTl9LSU5EIGtpbmQsIHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAqY2FsbGJhY2ssIHN0cnVjdCBfYmZkICphYmZkLCBjaGFyICoqYXJndikpOwotCi0KLS8qIERlc3RvcnkgYSBzaW11bGF0b3IgaW5zdGFuY2UuCi0KLSAgIFFVSVRUSU5HIGlzIG5vbi16ZXJvIGlmIHdlIGNhbm5vdCBoYW5nIG9uIGVycm9ycy4KLQotICAgVGhpcyBtYXkgaW52b2x2ZSBmcmVlaW5nIHRhcmdldCBtZW1vcnkgYW5kIGNsb3NpbmcgYW55IG9wZW4gZmlsZXMKLSAgIGFuZCBtbWFwJ2QgYXJlYXMuICBZb3UgY2Fubm90IGFzc3VtZSBzaW1fa2lsbCBoYXMgYWxyZWFkeSBiZWVuCi0gICBjYWxsZWQuICovCi0KLXZvaWQgc2ltX2Nsb3NlIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgcXVpdHRpbmcpKTsKLQotCi0vKiBMb2FkIHByb2dyYW0gUFJPRyBpbnRvIHRoZSBzaW11bGF0b3JzIG1lbW9yeS4KLQotICAgSWYgQUJGRCBpcyBub24tTlVMTCwgdGhlIGJmZCBmb3IgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBvcGVuZWQuCi0gICBUaGUgcmVzdWx0IGlzIGEgcmV0dXJuIGNvZGUgaW5kaWNhdGluZyBzdWNjZXNzLgotCi0gICBIYXJkd2FyZSBzaW11bGF0b3I6IE5vcm1hbGx5LCBlYWNoIHByb2dyYW0gc2VjdGlvbiBpcyB3cml0dGVuIGludG8KLSAgIG1lbW9yeSBhY2NvcmRpbmcgdG8gdGhhdCBzZWN0aW9ucyBMTUEgdXNpbmcgcGh5c2ljYWwgKGRpcmVjdCkKLSAgIGFkZHJlc3NpbmcuICBUaGUgZXhjZXB0aW9uIGJlaW5nIHN5c3RlbXMsIHN1Y2ggYXMgUFBDL0NIUlAsIHdoaWNoCi0gICBzdXBwb3J0IG1vcmUgY29tcGxpY2F0ZWQgcHJvZ3JhbSBsb2FkZXJzLiAgQSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24KLSAgIHNob3VsZCBub3QgZWZmZWN0IHRoZSBzdGF0ZSBvZiB0aGUgcHJvY2Vzc29yIHJlZ2lzdGVycy4gIE11bHRpcGxlCi0gICBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGFyZSBwZXJtaXR0ZWQgYW5kIGhhdmUgYW4gYWNjdW11bGF0aXZlCi0gICBlZmZlY3QuCi0KLSAgIFByb2Nlc3Mgc2ltdWxhdG9yOiBDYWxscyB0byB0aGlzIGZ1bmN0aW9uIG1heSBiZSBpZ25vcmVkLgotCi0gICBGSVhNRTogTW9zdCBoYXJkd2FyZSBzaW11bGF0b3JzIGxvYWQgdGhlIGltYWdlIGF0IHRoZSBWTUEgdXNpbmcKLSAgIHZpcnR1YWwgYWRkcmVzc2luZy4KLQotICAgRklYTUU6IEZvciBzb21lIGhhcmR3YXJlIHRhcmdldHMsIGJlZm9yZSBhIGxvYWRlZCBwcm9ncmFtIGNhbiBiZQotICAgZXhlY3V0ZWQsIGl0IHJlcXVpcmVzIHRoZSBtYW5pcHVsYXRpb24gb2YgVk0gcmVnaXN0ZXJzIGFuZCB0YWJsZXMuCi0gICBTdWNoIG1hbmlwdWxhdGlvbiBzaG91bGQgcHJvYmFibHkgKD8pIG9jY3VyZSBpbgotICAgc2ltX2NyZWF0ZV9pbmZlcmlvci4gKi8KLQotU0lNX1JDIHNpbV9sb2FkIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBjaGFyICpwcm9nLCBzdHJ1Y3QgX2JmZCAqYWJmZCwgaW50IGZyb21fdHR5KSk7Ci0KLQotLyogUHJlcGFyZSB0byBydW4gdGhlIHNpbXVsYXRlZCBwcm9ncmFtLgotCi0gICBBQkZELCBpZiBub3QgTlVMTCwgcHJvdmlkZXMgaW5pdGlhbCBwcm9jZXNzb3Igc3RhdGUgaW5mb3JtYXRpb24uCi0gICBBUkdWIGFuZCBFTlYsIGlmIG5vbiBOVUxMLCBhcmUgTlVMTCB0ZXJtaW5hdGVkIGxpc3RzIG9mIHBvaW50ZXJzLgotCi0gICBIYXJkd2FyZSBzaW11bGF0b3I6IFRoaXMgZnVuY3Rpb24gc2hhbGwgaW5pdGlhbGl6ZSB0aGUgcHJvY2Vzc29yCi0gICByZWdpc3RlcnMgdG8gYSBrbm93biB2YWx1ZS4gIFRoZSBwcm9ncmFtIGNvdW50ZXIgYW5kIHBvc3NpYmx5IHN0YWNrCi0gICBwb2ludGVyIHNoYWxsIGJlIHNldCB1c2luZyBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIEFCRkQgKG9yCi0gICBoYXJkd2FyZSByZXNldCBkZWZhdWx0cykuICBBUkdWIGFuZCBFTlYsIGRlcGVuZGFudCBvbiB0aGUgdGFyZ2V0Ci0gICBBQkksIG1heSBiZSB3cml0dGVuIHRvIG1lbW9yeS4KLQotICAgUHJvY2VzcyBzaW11bGF0b3I6IEFmdGVyIGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLCBhIG5ldyBwcm9jZXNzCi0gICBpbnN0YW5jZSBzaGFsbCBleGlzdC4gVGhlIFRFWFQsIERBVEEsIEJTUyBhbmQgc3RhY2sgcmVnaW9ucyBzaGFsbAotICAgYWxsIGJlIGluaXRpYWxpemVkLCBBUkdWIGFuZCBFTlYgc2hhbGwgYmUgd3JpdHRlbiB0byBwcm9jZXNzCi0gICBhZGRyZXNzIHNwYWNlIChhY2NvcmRpbmcgdG8gdGhlIGFwcGxpY2FibGUgQUJJKSBhbmQgdGhlIHByb2dyYW0KLSAgIGNvdW50ZXIgYW5kIHN0YWNrIHBvaW50ZXIgc2V0IGFjY29yZGluZ2x5LiAqLwotCi1TSU1fUkMgc2ltX2NyZWF0ZV9pbmZlcmlvciBQQVJBTVMgKChTSU1fREVTQyBzZCwgc3RydWN0IF9iZmQgKmFiZmQsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52KSk7Ci0KLQotLyogRmV0Y2ggTEVOR1RIIGJ5dGVzIG9mIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbSdzIG1lbW9yeS4gIFN0YXJ0IGZldGNoCi0gICBhdCB2aXJ0dWFsIGFkZHJlc3MgTUVNIGFuZCBzdG9yZSBpbiBCVUYuICBSZXN1bHQgaXMgbnVtYmVyIG9mIGJ5dGVzCi0gICByZWFkLCBvciB6ZXJvIGlmIGVycm9yLiAgKi8KLQotaW50IHNpbV9yZWFkIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBtZW0sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkpOwotCi0KLS8qIFN0b3JlIExFTkdUSCBieXRlcyBmcm9tIEJVRiBpbnRvIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbSdzCi0gICBtZW1vcnkuIFN0b3JlIGJ5dGVzIHN0YXJ0aW5nIGF0IHZpcnR1YWwgYWRkcmVzcyBNRU0uIFJlc3VsdCBpcwotICAgbnVtYmVyIG9mIGJ5dGVzIHdyaXRlLCBvciB6ZXJvIGlmIGVycm9yLiAgKi8KLQotaW50IHNpbV93cml0ZSBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgbWVtLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpKTsKLQotCi0vKiBGZXRjaCByZWdpc3RlciBSRUdOTyBzdG9yaW5nIGl0cyByYXcgKHRhcmdldCBlbmRpYW4pIHZhbHVlIGluIHRoZQotICAgTEVOR1RIIGJ5dGUgYnVmZmVyIEJVRi4gIFJldHVybiB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHJlZ2lzdGVyIG9yCi0gICB6ZXJvIGlmIFJFR05PIGlzIG5vdCBhcHBsaWNhYmxlLgotCi0gICBMZWdhY3kgaW1wbGVtZW50YXRpb25zIGlnbm9yZSBMRU5HVEggYW5kIGFsd2F5cyByZXR1cm4gLTEuCi0KLSAgIElmIExFTkdUSCBkb2VzIG5vdCBtYXRjaCB0aGUgc2l6ZSBvZiBSRUdOTyBubyBkYXRhIGlzIHRyYW5zZmVyZWQKLSAgICh0aGUgYWN0dWFsIHJlZ2lzdGVyIHNpemUgaXMgc3RpbGwgcmV0dXJuZWQpLiAqLwotCi1pbnQgc2ltX2ZldGNoX3JlZ2lzdGVyIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgcmVnbm8sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkpOwotCi0KLS8qIFN0b3JlIHJlZ2lzdGVyIFJFR05PIGZyb20gdGhlIHJhdyAodGFyZ2V0IGVuZGlhbikgdmFsdWUgaW4gQlVGLgotICAgUmV0dXJuIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgcmVnaXN0ZXIgb3IgemVybyBpZiBSRUdOTyBpcyBub3QKLSAgIGFwcGxpY2FibGUuCi0KLSAgIExlZ2FjeSBpbXBsZW1lbnRhdGlvbnMgaWdub3JlIExFTkdUSCBhbmQgYWx3YXlzIHJldHVybiAtMS4KLQotICAgSWYgTEVOR1RIIGRvZXMgbm90IG1hdGNoIHRoZSBzaXplIG9mIFJFR05PIG5vIGRhdGEgaXMgdHJhbnNmZXJlZAotICAgKHRoZSBhY3R1YWwgcmVnaXN0ZXIgc2l6ZSBpcyBzdGlsbCByZXR1cm5lZCkuICovCi0KLWludCBzaW1fc3RvcmVfcmVnaXN0ZXIgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGludCByZWdubywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKSk7Ci0KLQotLyogUHJpbnQgd2hhdGV2ZXIgc3RhdGlzdGljcyB0aGUgc2ltdWxhdG9yIGhhcyBjb2xsZWN0ZWQuCi0KLSAgIFZFUkJPU0UgaXMgY3VycmVudGx5IHVudXNlZCBhbmQgbXVzdCBhbHdheXMgYmUgemVyby4gICovCi0KLXZvaWQgc2ltX2luZm8gUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGludCB2ZXJib3NlKSk7Ci0KLQotLyogUnVuIChvciByZXN1bWUpIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbS4gICovCi0KLXZvaWQgc2ltX3Jlc3VtZSBQQVJBTVMgKChTSU1fREVTQyBzZCwgaW50IHN0ZXAsIGludCBzaWdnbmFsKSk7Ci0KLQotLyogQXN5bmNocm9ub3VzIHJlcXVlc3QgdG8gc3RvcCB0aGUgc2ltdWxhdGlvbi4KLSAgIEEgbm9uemVybyByZXR1cm4gaW5kaWNhdGVzIHRoYXQgdGhlIHNpbXVsYXRvciBpcyBhYmxlIHRvIGhhbmRsZQotICAgdGhlIHJlcXVlc3QgKi8KLQotaW50IHNpbV9zdG9wIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLQotLyogRmV0Y2ggdGhlIFJFQVNPTiB3aHkgdGhlIHByb2dyYW0gc3RvcHBlZC4KLQotICAgU0lNX0VYSVRFRDogVGhlIHByb2dyYW0gaGFzIHRlcm1pbmF0ZWQuIFNJR1JDIGluZGljYXRlcyB0aGUgdGFyZ2V0Ci0gICBkZXBlbmRhbnQgZXhpdCBzdGF0dXMuCi0KLSAgIFNJTV9TVE9QUEVEOiBUaGUgcHJvZ3JhbSBoYXMgc3RvcHBlZC4gIFNJR1JDIHVzZXMgdGhlIGhvc3QncyBzaWduYWwKLSAgIG51bWJlcmluZyBhcyBhIHdheSBvZiBpZGVudGlmeWluZyB0aGUgcmVhb246IHByb2dyYW0gaW50ZXJydXB0ZWQgYnkKLSAgIHVzZXIgdmlhIGEgc2ltX3N0b3AgcmVxdWVzdCAoU0lHSU5UKTsgYSBicmVha3BvaW50IGluc3RydWN0aW9uCi0gICAoU0lHVFJBUCk7IGEgY29tcGxldGVkIHNpbmdsZSBzdGVwIChTSUdUUkFQKTsgYW4gaW50ZXJuYWwgZXJyb3IKLSAgIGNvbmRpdGlvbiAoU0lHQUJSVCk7IGFuIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKFNJR0lMTCk7IEFjY2VzcyB0byBhbgotICAgdW5kZWZpbmVkIG1lbW9yeSByZWdpb24gKFNJR1NFR1YpOyBNaXMtYWxpZ25lZCBtZW1vcnkgYWNjZXNzCi0gICAoU0lHQlVTKS4KLQotICAgU0lNX1NJR05BTExFRDogVGhlIHByb2dyYW0gaGFzIHN0b3BwZWQuIFRoZSBzaW11bGF0b3IgaGFzCi0gICBlbmNvdW50ZXJlZCB0YXJnZXQgY29kZSB0aGF0IHJlcXVpcmVzIHRoZSAoSE9TVCkgc2lnbmFsIFNJR1JDIHRvIGJlCi0gICBkZWxpdmVyZWQgdG8gdGhlIHNpbXVsYXRlZCBwcm9ncmFtLiAgRXg6IGBraWxsIChnZXRwaWQgKCksCi0gICBUQVJHRVRfU0lHeHh4KScuICBXaGVyZSBUQVJHRVRfU0lHeHh4IGhhcyBiZWVuIHRyYW5zbGF0ZWQgaW50byBhCi0gICBob3N0IHNpZ25hbC4gIEZJWE1FOiBUaGlzIGlzIG5vdCBhbHdheXMgcG9zc2libGUuLgotCi0gICBTSU1fUlVOTklORywgU0lNX1BPTExJTkc6IFRoZSByZXR1cm4gb2Ygb25lIG9mIHRoZXNlIHZhbHVlcwotICAgaW5kaWNhdGVzIGEgcHJvYmxlbSBpbnRlcm5hbCB0byB0aGUgc2ltdWxhdG9yLiAqLwotCi1lbnVtIHNpbV9zdG9wIHsgc2ltX3J1bm5pbmcsIHNpbV9wb2xsaW5nLCBzaW1fZXhpdGVkLCBzaW1fc3RvcHBlZCwgc2ltX3NpZ25hbGxlZCB9OwotCi12b2lkIHNpbV9zdG9wX3JlYXNvbiBQQVJBTVMgKChTSU1fREVTQyBzZCwgZW51bSBzaW1fc3RvcCAqcmVhc29uLCBpbnQgKnNpZ3JjKSk7Ci0KLQotLyogUGFzc3RocnUgZm9yIG90aGVyIGNvbW1hbmRzIHRoYXQgdGhlIHNpbXVsYXRvciBtaWdodCBzdXBwb3J0LgotICAgU2ltdWxhdG9ycyBzaG91bGQgYmUgcHJlcGFyZWQgdG8gZGVhbCB3aXRoIGFueSBjb21iaW5hdGlvbiBvZiBOVUxMCi0gICBvciBlbXB0eSBDTUQuICovCi0KLXZvaWQgc2ltX2RvX2NvbW1hbmQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGNoYXIgKmNtZCkpOwotCi0vKiBDYWxsIHRoZXNlIGZ1bmN0aW9ucyB0byBzZXQgYW5kIGNsZWFyIGJyZWFrcG9pbnRzIGF0IEFERFIuICovCi0KLVNJTV9SQyBzaW1fc2V0X2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIGFkZHIpKTsKLVNJTV9SQyBzaW1fY2xlYXJfYnJlYWtwb2ludCBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgYWRkcikpOwotU0lNX1JDIHNpbV9jbGVhcl9hbGxfYnJlYWtwb2ludHMgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKLQotLyogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBicmVha3BvaW50cy4gKi8KLQotU0lNX1JDIHNpbV9lbmFibGVfYnJlYWtwb2ludCBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgYWRkcikpOwotU0lNX1JDIHNpbV9kaXNhYmxlX2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIGFkZHIpKTsKLVNJTV9SQyBzaW1fZW5hYmxlX2FsbF9icmVha3BvaW50cyBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotU0lNX1JDIHNpbV9kaXNhYmxlX2FsbF9icmVha3BvaW50cyBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotDAotCi0vKiBQcm92aWRlIHNpbXVsYXRvciB3aXRoIGEgZGVmYXVsdCAoZ2xvYmFsKSBob3N0X2NhbGxiYWNrX3N0cnVjdC4KLSAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgotICAgR0RCIGFuZCBOUlVOIGRvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UuCi0gICBUaGlzIHByb2NlZHVyZSBkb2VzIG5vdCB0YWtlIGEgU0lNX0RFU0MgYXJndW1lbnQgYXMgaXQgaXMKLSAgIHVzZWQgYmVmb3JlIHNpbV9vcGVuLiAqLwotCi12b2lkIHNpbV9zZXRfY2FsbGJhY2tzIFBBUkFNUyAoKHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAqKSk7Ci0KLQotLyogU2V0IHRoZSBzaXplIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5IGFycmF5LgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIGRvZXMgbm90IHRha2UgYSBTSU1fREVTQyBhcmd1bWVudCBhcyBpdCBpcwotICAgdXNlZCBiZWZvcmUgc2ltX29wZW4uICovCi0KLXZvaWQgc2ltX3NpemUgUEFSQU1TICgoaW50IGkpKTsKLQotCi0vKiBSdW4gYSBzaW11bGF0aW9uIHdpdGggdHJhY2luZyBlbmFibGVkLgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIGRvZXMgbm90IHRha2UgYSBTSU1fREVTQyBhcmd1bWVudCBhcyBpdCBpcwotICAgdXNlZCBiZWZvcmUgc2ltX29wZW4uICovCi0KLWludCBzaW1fdHJhY2UgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKLQotCi0vKiBDb25maWd1cmUgdGhlIHNpemUgb2YgdGhlIHByb2ZpbGUgYnVmZmVyLgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIGRvZXMgbm90IHRha2UgYSBTSU1fREVTQyBhcmd1bWVudCBhcyBpdCBpcwotICAgdXNlZCBiZWZvcmUgc2ltX29wZW4uICovCi0KLXZvaWQgc2ltX3NldF9wcm9maWxlX3NpemUgUEFSQU1TICgoaW50IG4pKTsKLQotCi0vKiBLaWxsIHRoZSBydW5uaW5nIHByb2dyYW0uCi0gICBUSElTIFBST0NFRFVSRSBJUyBERVBSRUNJQVRFRC4KLSAgIEdEQiBhbmQgTlJVTiBkbyBub3QgdXNlIHRoaXMgaW50ZXJmYWNlLgotICAgVGhpcyBwcm9jZWR1cmUgd2lsbCBiZSByZXBsYWNlZCBhcyBwYXJ0IG9mIHRoZSBpbnRyb2R1Y3Rpb24gb2YKLSAgIG11bHRpLWNwdSBzaW11bGF0b3JzLiAqLwotCi12b2lkIHNpbV9raWxsIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhZGVmaW5lZCAoUkVNT1RFX1NJTV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zaW0tZDEwdi5oIGIvaW5jbHVkZS9zaW0tZDEwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGVhYjJhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvc2ltLWQxMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIGQxMHYgc2ltdWxhdG9yIGFuZCBnZGIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkIChTSU1fRDEwVl9IKQotI2RlZmluZSBTSU1fRDEwVl9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IC8vIH0KLSNlbmRpZgotCi0vKiBHREIgaW50ZXJwcmV0cyBhZGRyZXNzZXMgYXM6Ci0KLSAgIDB4MDB4eHh4eHg6IFBoeXNpY2FsIHVuaWZpZWQgbWVtb3J5IHNlZ21lbnQgICAgIChVbmlmaWVkIG1lbW9yeSkKLSAgIDB4MDF4eHh4eHg6IFBoeXNpY2FsIGluc3RydWN0aW9uIG1lbW9yeSBzZWdtZW50IChPbi1jaGlwIGluc24gbWVtb3J5KQotICAgMHgwMnh4eHh4eDogUGh5c2ljYWwgZGF0YSBtZW1vcnkgc2VnbWVudCAgICAgICAgKE9uLWNoaXAgZGF0YSBtZW1vcnkpCi0gICAweDEweHh4eHh4OiBMb2dpY2FsIGRhdGEgYWRkcmVzcyBzZWdtZW50ICAgICAgICAoRE1BUCB0cmFuc2xhdGVkIG1lbW9yeSkKLSAgIDB4MTF4eHh4eHg6IExvZ2ljYWwgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBzZWdtZW50IChJTUFQIHRyYW5zbGF0ZWQgbWVtb3J5KQotCi0gICBUaGUgcmVtb3RlIGQxMHYgYm9hcmQgaW50ZXJwcmV0cyBhZGRyZXNzZXMgYXM6Ci0KLSAgIDB4MDB4eHh4eHg6IFBoeXNpY2FsIHVuaWZpZWQgbWVtb3J5IHNlZ21lbnQgICAgIChVbmlmaWVkIG1lbW9yeSkKLSAgIDB4MDF4eHh4eHg6IFBoeXNpY2FsIGluc3RydWN0aW9uIG1lbW9yeSBzZWdtZW50IChPbi1jaGlwIGluc24gbWVtb3J5KQotICAgMHgwMnh4eHh4eDogUGh5c2ljYWwgZGF0YSBtZW1vcnkgc2VnbWVudCAgICAgICAgKE9uLWNoaXAgZGF0YSBtZW1vcnkpCi0KLSAgIFRoZSBmb2xsb3dpbmcgdHJhbnNsYXRlIGEgdmlydHVhbCBETUFQL0lNQVAgb2Zmc2V0IGludG8gYSBwaHlzaWNhbAotICAgbWVtb3J5IHNlZ21lbnQgYXNzaWduaW5nIHRoZSB0cmFuc2xhdGVkIGFkZHJlc3MgdG8gUEhZUy4gIFNpbmNlIGEKLSAgIG1lbW9yeSBhY2Nlc3MgbWF5IGNyb3NzIGEgcGFnZSBib3VuZHJhcnkgdGhlIG51bWJlciBvZiBieXRlcyBmb3IKLSAgIHdoaWNoIHRoZSB0cmFuc2xhdGlvbiBpcyBhcHBsaWNhYmxlIChvciAwIGZvciBhbiBpbnZhbGlkIHZpcnR1YWwKLSAgIG9mZnNldCkgaXMgcmV0dXJuZWQuICovCi0KLWVudW0KLSAgewotICAgIFNJTV9EMTBWX01FTU9SWV9VTklGSUVEID0gMHgwMDAwMDAwMCwKLSAgICBTSU1fRDEwVl9NRU1PUllfSU5TTiA9IDB4MDEwMDAwMDAsCi0gICAgU0lNX0QxMFZfTUVNT1JZX0RBVEEgPSAweDAyMDAwMDAwLAotICAgIFNJTV9EMTBWX01FTU9SWV9ETUFQID0gMHgxMDAwMDAwMCwKLSAgICBTSU1fRDEwVl9NRU1PUllfSU1BUCA9IDB4MTEwMDAwMDAKLSAgfTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2ltX2QxMHZfdHJhbnNsYXRlX2RtYXBfYWRkcgotICAodW5zaWduZWQgbG9uZyBvZmZzZXQsCi0gICBpbnQgbnJfYnl0ZXMsCi0gICB1bnNpZ25lZCBsb25nICpwaHlzLAotICAgdW5zaWduZWQgbG9uZyAoKmRtYXBfcmVnaXN0ZXIpIChpbnQgcmVnX25yKSk7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIHNpbV9kMTB2X3RyYW5zbGF0ZV9pbWFwX2FkZHIKLSAgKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotICAgaW50IG5yX2J5dGVzLAotICAgdW5zaWduZWQgbG9uZyAqcGh5cywKLSAgIHVuc2lnbmVkIGxvbmcgKCppbWFwX3JlZ2lzdGVyKSAoaW50IHJlZ19ucikpOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBzaW1fZDEwdl90cmFuc2xhdGVfYWRkcgotICAodW5zaWduZWQgbG9uZyB2YWRkciwKLSAgIGludCBucl9ieXRlcywKLSAgIHVuc2lnbmVkIGxvbmcgKnBoeXMsCi0gICB1bnNpZ25lZCBsb25nICgqZG1hcF9yZWdpc3RlcikgKGludCByZWdfbnIpLAotICAgdW5zaWduZWQgbG9uZyAoKmltYXBfcmVnaXN0ZXIpIChpbnQgcmVnX25yKSk7Ci0KLQotLyogVGhlIHNpbXVsYXRvciBtYWtlcyB1c2Ugb2YgdGhlIGZvbGxvd2luZyByZWdpc3RlciBpbmZvcm1hdGlvbi4gKi8KLQotZW51bQotICB7Ci0gICAgU0lNX0QxMFZfUjBfUkVHTlVNID0gMCwKLSAgICBTSU1fRDEwVl9DUjBfUkVHTlVNID0gMTYsCi0gICAgU0lNX0QxMFZfQTBfUkVHTlVNID0gMzIsCi0gICAgU0lNX0QxMFZfU1BJX1JFR05VTSA9IDM0LAotICAgIFNJTV9EMTBWX1NQVV9SRUdOVU0gPSAzNSwKLSAgICBTSU1fRDEwVl9JTUFQMF9SRUdOVU0gPSAzNiwKLSAgICBTSU1fRDEwVl9ETUFQMF9SRUdOVU0gPSAzOCwKLSAgICBTSU1fRDEwVl9UUzJfRE1BUF9SRUdOVU0gPSA0MAotICB9OwotCi1lbnVtCi0gIHsKLSAgICBTSU1fRDEwVl9OUl9SX1JFR1MgPSAxNiwKLSAgICBTSU1fRDEwVl9OUl9BX1JFR1MgPSAyLAotICAgIFNJTV9EMTBWX05SX0lNQVBfUkVHUyA9IDIsCi0gICAgU0lNX0QxMFZfTlJfRE1BUF9SRUdTID0gNCwKLSAgICBTSU1fRDEwVl9OUl9DUl9SRUdTID0gMTYKLSAgfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NwbGF5LXRyZWUuaCBiL2luY2x1ZGUvc3BsYXktdHJlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODI4ZmU3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvc3BsYXktdHJlZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qIEEgc3BsYXktdHJlZSBkYXRhdHlwZS4gIAotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFyayBNaXRjaGVsbCAobWFya0BtYXJrbWl0Y2hlbGwuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgotICAgCi1HTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBGb3IgYW4gZWFzaWx5IHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHNwbGF5LXRyZWVzLCBzZWU6Ci0KLSAgICAgTGV3aXMsIEhhcnJ5IFIuIGFuZCBEZW5lbmJlcmcsIExhcnJ5LiAgRGF0YSBTdHJ1Y3R1cmVzIGFuZCBUaGVpcgotICAgICBBbGdvcml0aG1zLiAgSGFycGVyLUNvbGxpbnMsIEluYy4gIDE5OTEuICAKLQotICAgVGhlIG1ham9yIGZlYXR1cmUgb2Ygc3BsYXkgdHJlZXMgaXMgdGhhdCBhbGwgYmFzaWMgdHJlZSBvcGVyYXRpb25zCi0gICBhcmUgYW1vcnRpemVkIE8obG9nIG4pIHRpbWUgZm9yIGEgdHJlZSB3aXRoIG4gbm9kZXMuICAqLwotCi0jaWZuZGVmIF9TUExBWV9UUkVFX0gKLSNkZWZpbmUgX1NQTEFZX1RSRUVfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBVc2UgdHlwZWRlZnMgZm9yIHRoZSBrZXkgYW5kIGRhdGEgdHlwZXMgdG8gZmFjaWxpdGF0ZSBjaGFuZ2luZwotICAgdGhlc2UgdHlwZXMsIGlmIG5lY2Vzc2FyeS4gIFRoZXNlIHR5cGVzIHNob3VsZCBiZSBzdWZmaWNpZW50bHkgd2lkZQotICAgdGhhdCBhbnkgcG9pbnRlciBvciBzY2FsYXIgY2FuIGJlIGNhc3QgdG8gdGhlc2UgdHlwZXMsIGFuZCB0aGVuCi0gICBjYXN0IGJhY2ssIHdpdGhvdXQgbG9zcyBvZiBwcmVjaXNpb24uICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBzcGxheV90cmVlX2tleTsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgc3BsYXlfdHJlZV92YWx1ZTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgYSBub2RlIGluIHRoZSB0cmVlLiAgKi8KLXR5cGVkZWYgc3RydWN0IHNwbGF5X3RyZWVfbm9kZSAqc3BsYXlfdHJlZV9ub2RlOwotCi0vKiBUaGUgdHlwZSBvZiBhIGZ1bmN0aW9uIHdoaWNoIGNvbXBhcmVzIHR3byBzcGxheS10cmVlIGtleXMuICBUaGUKLSAgIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdmFsdWVzIGFzIGZvciBxc29ydC4gICovCi10eXBlZGVmIGludCAoKnNwbGF5X3RyZWVfY29tcGFyZV9mbikgUEFSQU1TKChzcGxheV90cmVlX2tleSwgc3BsYXlfdHJlZV9rZXkpKTsKLQotLyogVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiB1c2VkIHRvIGRlYWxsb2NhdGUgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkCi0gICB3aXRoIHRoZSBrZXkuICAqLwotdHlwZWRlZiB2b2lkICgqc3BsYXlfdHJlZV9kZWxldGVfa2V5X2ZuKSBQQVJBTVMoKHNwbGF5X3RyZWVfa2V5KSk7Ci0KLS8qIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gdXNlZCB0byBkZWFsbG9jYXRlIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZAotICAgd2l0aCB0aGUgdmFsdWUuICAqLwotdHlwZWRlZiB2b2lkICgqc3BsYXlfdHJlZV9kZWxldGVfdmFsdWVfZm4pIFBBUkFNUygoc3BsYXlfdHJlZV92YWx1ZSkpOwotCi0vKiBUaGUgdHlwZSBvZiBhIGZ1bmN0aW9uIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSB0cmVlLiAgKi8KLXR5cGVkZWYgaW50ICgqc3BsYXlfdHJlZV9mb3JlYWNoX2ZuKSBQQVJBTVMoKHNwbGF5X3RyZWVfbm9kZSwgdm9pZCopKTsKLQotLyogVGhlIG5vZGVzIGluIHRoZSBzcGxheSB0cmVlLiAgKi8KLXN0cnVjdCBzcGxheV90cmVlX25vZGUKLXsKLSAgLyogVGhlIGtleS4gICovCi0gIHNwbGF5X3RyZWVfa2V5IGtleTsKLQotICAvKiBUaGUgdmFsdWUuICAqLwotICBzcGxheV90cmVlX3ZhbHVlIHZhbHVlOwotCi0gIC8qIFRoZSBsZWZ0IGFuZCByaWdodCBjaGlsZHJlbiwgcmVzcGVjdGl2ZWx5LiAgKi8KLSAgc3BsYXlfdHJlZV9ub2RlIGxlZnQ7Ci0gIHNwbGF5X3RyZWVfbm9kZSByaWdodDsKLX07Ci0KLS8qIFRoZSBzcGxheSB0cmVlIGl0c2VsZi4gICovCi10eXBlZGVmIHN0cnVjdCBzcGxheV90cmVlCi17Ci0gIC8qIFRoZSByb290IG9mIHRoZSB0cmVlLiAgKi8KLSAgc3BsYXlfdHJlZV9ub2RlIHJvb3Q7Ci0KLSAgLyogVGhlIGNvbXBhcmlzaW9uIGZ1bmN0aW9uLiAgKi8KLSAgc3BsYXlfdHJlZV9jb21wYXJlX2ZuIGNvbXA7Ci0KLSAgLyogVGhlIGRlYWxsb2NhdGUta2V5IGZ1bmN0aW9uLiAgTlVMTCBpZiBubyBjbGVhbnVwIGlzIG5lY2Vzc2FyeS4gICovCi0gIHNwbGF5X3RyZWVfZGVsZXRlX2tleV9mbiBkZWxldGVfa2V5OwotCi0gIC8qIFRoZSBkZWFsbG9jYXRlLXZhbHVlIGZ1bmN0aW9uLiAgTlVMTCBpZiBubyBjbGVhbnVwIGlzIG5lY2Vzc2FyeS4gICovCi0gIHNwbGF5X3RyZWVfZGVsZXRlX3ZhbHVlX2ZuIGRlbGV0ZV92YWx1ZTsKLX0gKnNwbGF5X3RyZWU7Ci0KLWV4dGVybiBzcGxheV90cmVlIHNwbGF5X3RyZWVfbmV3ICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWVfY29tcGFyZV9mbiwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX2RlbGV0ZV9rZXlfZm4sCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9kZWxldGVfdmFsdWVfZm4pKTsKLWV4dGVybiB2b2lkIHNwbGF5X3RyZWVfZGVsZXRlICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUpKTsKLWV4dGVybiB2b2lkIHNwbGF5X3RyZWVfaW5zZXJ0ICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV9rZXksCi0JCQkJCSAgICAgICAgc3BsYXlfdHJlZV92YWx1ZSkpOwotZXh0ZXJuIHNwbGF5X3RyZWVfbm9kZSBzcGxheV90cmVlX2xvb2t1cCAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX2tleSkpOwotZXh0ZXJuIGludCBzcGxheV90cmVlX2ZvcmVhY2ggICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX2ZvcmVhY2hfZm4sCi0JCQkJCSAgICAgICAgdm9pZCopKTsKLWV4dGVybiBpbnQgc3BsYXlfdHJlZV9jb21wYXJlX2ludHMgICAgICBQQVJBTVMoKHNwbGF5X3RyZWVfa2V5LAotCQkJCQkJc3BsYXlfdHJlZV9rZXkpKTsKLWV4dGVybiBpbnQgc3BsYXlfdHJlZV9jb21wYXJlX3BvaW50ZXJzICBQQVJBTVMoKHNwbGF5X3RyZWVfa2V5LAotCQkJCQkJc3BsYXlfdHJlZV9rZXkpKTsKLQkJCQkJICAgICAgIAotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9TUExBWV9UUkVFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3ltY2F0LmggYi9pbmNsdWRlL3N5bWNhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWVmYWRhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvc3ltY2F0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBTeW1ib2wgY29uY2F0ZW5hdGlvbiB1dGlsaXRpZXMuCi0KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFNZTV9DQVRfSAotI2RlZmluZSBTWU1fQ0FUX0gKLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChBTE1PU1RfU1REQykKLSNkZWZpbmUgQ09OQ0FUMihhLGIpCSBhIyNiCi0jZGVmaW5lIENPTkNBVDMoYSxiLGMpCSBhIyNiIyNjCi0jZGVmaW5lIENPTkNBVDQoYSxiLGMsZCkgYSMjYiMjYyMjZAotI2RlZmluZSBTVFJJTkdYKHMpICNzCi0jZWxzZQotI2RlZmluZSBDT05DQVQyKGEsYikJIGEvKiovYgotI2RlZmluZSBDT05DQVQzKGEsYixjKQkgYS8qKi9iLyoqL2MKLSNkZWZpbmUgQ09OQ0FUNChhLGIsYyxkKSBhLyoqL2IvKiovYy8qKi9kCi0jZGVmaW5lIFNUUklOR1gocykgIj8iCi0jZW5kaWYKLQotI2RlZmluZSBYQ09OQ0FUMihhLGIpICAgICBDT05DQVQyKGEsYikKLSNkZWZpbmUgWENPTkNBVDMoYSxiLGMpICAgQ09OQ0FUMyhhLGIsYykKLSNkZWZpbmUgWENPTkNBVDQoYSxiLGMsZCkgQ09OQ0FUNChhLGIsYyxkKQotCi0jZGVmaW5lIFhTVFJJTkcocykgU1RSSU5HWChzKSAKLQotI2VuZGlmIFNZTV9DQVRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS93YWl0LmggYi9pbmNsdWRlL3dhaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzYzljYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3dhaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIERlZmluZSBob3cgdG8gYWNjZXNzIHRoZSBpbnQgdGhhdCB0aGUgd2FpdCBzeXN0ZW0gY2FsbCBzdG9yZXMuCi0gICBUaGlzIGhhcyBiZWVuIGNvbXBhdGlibGUgaW4gYWxsIFVuaXggc3lzdGVtcyBzaW5jZSB0aW1lIGltbWVtb3JpYWwsCi0gICBidXQgdmFyaW91cyB3ZWxsLW1lYW5pbmcgcGVvcGxlIGhhdmUgZGVmaW5lZCB2YXJpb3VzIGRpZmZlcmVudAotICAgd29yZHMgZm9yIHRoZSBzYW1lIG9sZCBiaXRzIGluIHRoZSBzYW1lIG9sZCBpbnQgKHNvbWV0aW1lcyBjbGFpbWVkCi0gICB0byBiZSBhIHN0cnVjdCkuICBXZSBqdXN0IGtub3cgaXQncyBhbiBpbnQgYW5kIHdlIHVzZSB0aGVzZSBtYWNyb3MKLSAgIHRvIGFjY2VzcyB0aGUgYml0cy4gICovCi0KLS8qIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBkZWZpbmVkIGVxdWl2YWxlbnRseSB0byB0aGVpciBkZWZpbml0aW9ucwotICAgaW4gUE9TSVguMS4gIFdlIGZhaWwgdG8gZGVmaW5lIFdOT0hBTkcgYW5kIFdVTlRSQUNFRCwgd2hpY2ggUE9TSVguMQotICAgPHN5cy93YWl0Lmg+IGRlZmluZXMsIHNpbmNlIG91ciBjb2RlIGRvZXMgbm90IHVzZSB3YWl0cGlkKCkuICBXZQotICAgYWxzbyBmYWlsIHRvIGRlY2xhcmUgd2FpdCgpIGFuZCB3YWl0cGlkKCkuICAqLyAgIAotCi0jaWZuZGVmCVdJRkVYSVRFRAotI2RlZmluZSBXSUZFWElURUQodykJKCgodykmMDM3NykgPT0gMCkKLSNlbmRpZgotCi0jaWZuZGVmCVdJRlNJR05BTEVECi0jZGVmaW5lIFdJRlNJR05BTEVEKHcpCSgoKHcpJjAzNzcpICE9IDAxNzcgJiYgKCh3KSZ+MDM3NykgPT0gMCkKLSNlbmRpZgotCi0jaWZuZGVmCVdJRlNUT1BQRUQKLSNpZmRlZiBJQk02MDAwCi0KLS8qIFVuZm9ydHVuYXRlbHksIHRoZSBhYm92ZSBjb21tZW50IChhYm91dCBiZWluZyBjb21wYXRpYmxlIGluIGFsbCBVbml4IAotICAgc3lzdGVtcykgaXMgbm90IHF1aXRlIGNvcnJlY3QgZm9yIEFJWCwgc2lnaC4gIEFuZCBBSVggMy4yIGNhbiBnZW5lcmF0ZQotICAgc3RhdHVzIHdvcmRzIGxpa2UgMHg1N2MgKHNpZ3RyYXAgcmVjZWl2ZWQgYWZ0ZXIgbG9hZCksIGFuZCBnZGIgd291bGQKLSAgIGNob2tlIG9uIGl0LiAqLwotCi0jZGVmaW5lIFdJRlNUT1BQRUQodykJKCh3KSYweDQwKQotCi0jZWxzZQotI2RlZmluZSBXSUZTVE9QUEVEKHcpCSgoKHcpJjAzNzcpID09IDAxNzcpCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmCVdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpID4+IDgpICYgMDM3NykgLyogc2FtZSBhcyBXUkVUQ09ERSAqLwotI2VuZGlmCi0KLSNpZm5kZWYJV1RFUk1TSUcKLSNkZWZpbmUgV1RFUk1TSUcodykJKCh3KSAmIDAxNzcpCi0jZW5kaWYKLQotI2lmbmRlZglXU1RPUFNJRwotI2RlZmluZSBXU1RPUFNJRwlXRVhJVFNUQVRVUwotI2VuZGlmCi0KLS8qIFRoZXNlIGFyZSBub3QgZGVmaW5lZCBpbiBQT1NJWCwgYnV0IGFyZSB1c2VkIGJ5IG91ciBwcm9ncmFtcy4gICovCi0KLSNkZWZpbmUgV0FJVFRZUEUJaW50Ci0KLSNpZm5kZWYJV0NPUkVEVU1QCi0jZGVmaW5lIFdDT1JFRFVNUCh3KQkoKCh3KSYwMjAwKSAhPSAwKQotI2VuZGlmCi0KLSNpZm5kZWYJV1NFVEVYSVQKLSNkZWZpbmUgV1NFVEVYSVQodyxzdGF0dXMpICgodykgPSAoMCB8ICgoc3RhdHVzKSA8PCA4KSkpCi0jZW5kaWYKLQotI2lmbmRlZglXU0VUU1RPUAotI2RlZmluZSBXU0VUU1RPUCh3LHNpZykJICAgKCh3KSA9ICgwMTc3IHwgKChzaWcpIDw8IDgpKSkKLSNlbmRpZgotCmRpZmYgLS1naXQgYS9pbnN0YWxsLXNoIGIvaW5zdGFsbC1zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTlkZTIzOC4uMDAwMDAwMAotLS0gYS9pbnN0YWxsLXNoCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKLSMgVGhpcyBjb21lcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLgotIwotIyBDb3B5cmlnaHQgMTk5MSBieSB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQotIwotIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSMgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0jIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSMgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCi0jIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKLSMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKLSMgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCi0jIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotIwotIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAotIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAotIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgotIwotIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCi0jIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCi0jIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgotCi0KLSMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAotCi0jIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCi1kb2l0PSIke0RPSVRQUk9HLX0iCi0KLQotIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCi0KLW12cHJvZz0iJHtNVlBST0ctbXZ9IgotY3Bwcm9nPSIke0NQUFJPRy1jcH0iCi1jaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKLWNob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgotY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCi1zdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKLXJtcHJvZz0iJHtSTVBST0ctcm19IgotbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCi0KLXRyYW5zZm9ybWJhc2VuYW1lPSIiCi10cmFuc2Zvcm1fYXJnPSIiCi1pbnN0Y21kPSIkbXZwcm9nIgotY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKLWNob3duY21kPSIiCi1jaGdycGNtZD0iIgotc3RyaXBjbWQ9IiIKLXJtY21kPSIkcm1wcm9nIC1mIgotbXZjbWQ9IiRtdnByb2ciCi1zcmM9IiIKLWRzdD0iIgotZGlyX2FyZz0iIgotCi13aGlsZSBbIHgiJDEiICE9IHggXTsgZG8KLSAgICBjYXNlICQxIGluCi0JLWMpIGluc3RjbWQ9IiRjcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1kKSBkaXJfYXJnPXRydWUKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLW0pIGNobW9kY21kPSIkY2htb2Rwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLXMpIHN0cmlwY21kPSIkc3RyaXBwcm9nIgotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktdD0qKSB0cmFuc2Zvcm1hcmc9YGVjaG8gJDEgfCBzZWQgJ3MvLXQ9Ly8nYAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktYj0qKSB0cmFuc2Zvcm1iYXNlbmFtZT1gZWNobyAkMSB8IHNlZCAncy8tYj0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCSopICBpZiBbIHgiJHNyYyIgPSB4IF0KLQkgICAgdGhlbgotCQlzcmM9JDEKLQkgICAgZWxzZQotCQkjIHRoaXMgY29sb24gaXMgdG8gd29yayBhcm91bmQgYSAzODZCU0QgL2Jpbi9zaCBidWcKLQkJOgotCQlkc3Q9JDEKLQkgICAgZmkKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotICAgIGVzYWMKLWRvbmUKLQotaWYgWyB4IiRzcmMiID0geCBdCi10aGVuCi0JZWNobyAiaW5zdGFsbDoJbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiCi0JZXhpdCAxCi1lbHNlCi0JdHJ1ZQotZmkKLQotaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF07IHRoZW4KLQlkc3Q9JHNyYwotCXNyYz0iIgotCQotCWlmIFsgLWQgJGRzdCBdOyB0aGVuCi0JCWluc3RjbWQ9OgotCQljaG1vZGNtZD0iIgotCWVsc2UKLQkJaW5zdGNtZD1ta2RpcgotCWZpCi1lbHNlCi0KLSMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZAotIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZCAKLSMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgotCi0JaWYgWyAtZiAkc3JjIC1vIC1kICRzcmMgXQotCXRoZW4KLQkJdHJ1ZQotCWVsc2UKLQkJZWNobyAiaW5zdGFsbDogICRzcmMgZG9lcyBub3QgZXhpc3QiCi0JCWV4aXQgMQotCWZpCi0JCi0JaWYgWyB4IiRkc3QiID0geCBdCi0JdGhlbgotCQllY2hvICJpbnN0YWxsOglubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiCi0JCWV4aXQgMQotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLSMgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIGFwcGVuZCB0aGUgaW5wdXQgZmlsZW5hbWU7IGlmIHlvdXIgc3lzdGVtCi0jIGRvZXMgbm90IGxpa2UgZG91YmxlIHNsYXNoZXMgaW4gZmlsZW5hbWVzLCB5b3UgbWF5IG5lZWQgdG8gYWRkIHNvbWUgbG9naWMKLQotCWlmIFsgLWQgJGRzdCBdCi0JdGhlbgotCQlkc3Q9IiRkc3QiL2BiYXNlbmFtZSAkc3JjYAotCWVsc2UKLQkJdHJ1ZQotCWZpCi1maQotCi0jIyB0aGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQKLWRzdGRpcj1gZWNobyAkZHN0IHwgc2VkIC1lICdzLFteL10qJCwsO3MsLyQsLDtzLF4kLC4sJ2AKLQotIyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0cy4KLSMgIHRoaXMgcGFydCBpcyB0YWtlbiBmcm9tIE5vYWggRnJpZWRtYW4ncyBta2luc3RhbGxkaXJzIHNjcmlwdAotCi0jIFNraXAgbG90cyBvZiBzdGF0IGNhbGxzIGluIHRoZSB1c3VhbCBjYXNlLgotaWYgWyAhIC1kICIkZHN0ZGlyIiBdOyB0aGVuCi1kZWZhdWx0SUZTPScJCi0nCi1JRlM9IiR7SUZTLSR7ZGVmYXVsdElGU319IgotCi1vSUZTPSIke0lGU30iCi0jIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgotSUZTPSclJwotc2V0IC0gYGVjaG8gJHtkc3RkaXJ9IHwgc2VkIC1lICdzQC9AJUBnJyAtZSAnc0BeJUAvQCdgCi1JRlM9IiR7b0lGU30iCi0KLXBhdGhjb21wPScnCi0KLXdoaWxlIFsgJCMgLW5lIDAgXSA7IGRvCi0JcGF0aGNvbXA9IiR7cGF0aGNvbXB9JHsxfSIKLQlzaGlmdAotCi0JaWYgWyAhIC1kICIke3BhdGhjb21wfSIgXSA7Ci0gICAgICAgIHRoZW4KLQkJJG1rZGlycHJvZyAiJHtwYXRoY29tcH0iCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotCXBhdGhjb21wPSIke3BhdGhjb21wfS8iCi1kb25lCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXQotdGhlbgotCSRkb2l0ICRpbnN0Y21kICRkc3QgJiYKLQotCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkKLWVsc2UKLQotIyBJZiB3ZSdyZSBnb2luZyB0byByZW5hbWUgdGhlIGZpbmFsIGV4ZWN1dGFibGUsIGRldGVybWluZSB0aGUgbmFtZSBub3cuCi0KLQlpZiBbIHgiJHRyYW5zZm9ybWFyZyIgPSB4IF0gCi0JdGhlbgotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAotCWVsc2UKLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdCAkdHJhbnNmb3JtYmFzZW5hbWUgfCAKLQkJCXNlZCAkdHJhbnNmb3JtYXJnYCR0cmFuc2Zvcm1iYXNlbmFtZQotCWZpCi0KLSMgZG9uJ3QgYWxsb3cgdGhlIHNlZCBjb21tYW5kIHRvIGNvbXBsZXRlbHkgZWxpbWluYXRlIHRoZSBmaWxlbmFtZQotCi0JaWYgWyB4IiRkc3RmaWxlIiA9IHggXSAKLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotIyBNYWtlIGEgdGVtcCBmaWxlIG5hbWUgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCi0KLQlkc3R0bXA9JGRzdGRpci8jaW5zdC4kJCMKLQotIyBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCi0KLQkkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAgJiYKLQotCXRyYXAgInJtIC1mICR7ZHN0dG1wfSIgMCAmJgotCi0jIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMKLQotIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bwotIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCi0jIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgotCi0JaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQotIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotCi0JJGRvaXQgJHJtY21kIC1mICRkc3RkaXIvJGRzdGZpbGUgJiYKLQkkZG9pdCAkbXZjbWQgJGRzdHRtcCAkZHN0ZGlyLyRkc3RmaWxlIAotCi1maSAmJgotCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvaW50bC9DaGFuZ2VMb2cgYi9pbnRsL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmZjZmNi4uMDAwMDAwMAotLS0gYS9pbnRsL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDEwMjIgKzAsMCBAQAotMTk5Ny0wOS0wNiAwMjoxMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGludGxoLmluc3QuaW46IFJlZm9ybWF0IGNvcHlyaWdodC4KLQotMTk5Ny0wOC0xOSAxNToyMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGRjZ2V0dGV4dC5jIChEQ0dFVFRFWFQpOiBSZW1vdmUgd3JvbmcgY29tbWVudC4KLQotMTk5Ny0wOC0xNiAwMDoxMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWRhdGEpOiBEb24ndCBjaGFuZ2UgZGlyZWN0b3J5IHRvIGluc3RhbGwuCi0KLTE5OTctMDgtMDEgMTQ6MzAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjYXQtY29tcGF0LmM6IEZpeCBjb3B5cmlnaHQuCi0KLQkqIGxvY2FsZWFsaWFzLmM6IERvbid0IGRlZmluZSBzdHJjaHIgdW5sZXNzICFIQVZFX1NUUkNIUi4KLQotCSogbG9hZG1zZ2NhdC5jOiBVcGRhdGUgY29weXJpZ2h0LiAgRml4IHR5cG9zLgotCi0JKiBsMTBuZmxpc3QuYzogRG9uJ3QgZGVmaW5lIHN0cmNociB1bmxlc3MgIUhBVkVfU1RSQ0hSLgotCShfbmxfbWFrZV9sMTBuZmxpc3QpOiBIYW5kbGUgc3BvbnNvciBhbmQgcmV2aXNpb24gY29ycmVjdGx5LgotCi0JKiBnZXR0ZXh0LmM6IFVwZGF0ZSBjb3B5cmlnaHQuCi0JKiBnZXR0ZXh0Lmg6IExpa2V3aXNlLgotCSogaGFzaC1zdHJpbmcuaDogTGlrZXdpc2UuCi0KLQkqIGZpbmRkb21haW4uYzogUmVtb2F2ZSBkZWFkIGNvZGUuICBEZWZpbmUgc3RyY2hyIG9ubHkgaWYKLQkhSEFWRV9TVFJDSFIuCi0KLQkqIGV4cGxvZGVuYW1lLmM6IEluY2x1ZGUgPHN5cy90eXBlcy5oPi4KLQotCSogZXhwbG9kZW5hbWUuYzogUmVmb3JtYXQgY29weXJpZ2h0IHRleHQuCi0JKF9ubF9leHBsb2RlX25hbWUpOiBGaXggdHlwby4KLQotCSogZGNnZXR0ZXh0LmM6IERlZmluZSBhbmQgdXNlIF9fc2V0X2Vycm5vLgotCShndWVzc19jYXRlZ29yeV92YWx1ZSk6IERvbid0IHVzZSBzZXRsb2NhbGUgaWYgSEFWRV9MQ19NRVNTQUdFUyBpcwotCW5vdCBkZWZpbmVkLgotCi0JKiBiaW5kdGV4dGRvbS5jOiBQcmV0dHkgcHJpbnRpbmcuCi0KLTE5OTctMDUtMDEgMDI6MjUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBkY2dldHRleHQuYyAoZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUpOiBEb24ndCBkZXBlbmQgb24KLQlIQVZFX0xDX01FU1NBR0VTLiAgV2UgZG9uJ3QgbmVlZCB0aGUgbWFjcm8gaGVyZS4KLQlQYXRjaCBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBpbG9nLmZyPi4KLQotCSogY2F0LWNvbXBhdC5jICh0ZXh0ZG9tYWluKTogRG9OJ3QgcmVmZXIgdG8gSEFWRV9TRVRMT0NBTEVfTlVMTAotCW1hY3JvLiAgSW5zdGVhZCB1c2UgSEFWRV9MT0NBTEVfTlVMTCBhbmQgZGVmaW5lIGl0IHdoZW4gdXNpbmcKLQlnbGliYywgYXMgaW4gZGNnZXR0ZXh0LmMuCi0JUGF0Y2ggYnkgQnJ1bm8gSGFpYmxlIDxoYWlibGVAaWxvZy5mcj4uCi0KLQkqIE1ha2VmaWxlLmluIChDUFBGTEFHUyk6IE5ldyB2YXJpYWJsZS4gIFJlcG9ydGVkIGJ5IEZyYW5jLG9pcwotCVBpbmFyZC4KLQotTW9uIE1hciAxMCAwNjo1MToxNyAxOTk3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEltcGxlbWVudCBoYW5kbGluZyBvZiBsaWJ0b29sLgotCi0JKiBnZXR0ZXh0UC5oOiBDaGFuZ2UgZGF0YSBzdHJ1Y3R1cmVzIGZvciB1c2Ugb2YgZ2VuZXJpYyBsb3dsZXZlbAotCWkxOG4gZmlsZSBoYW5kbGluZy4KLQotV2VkIERlYyAgNCAyMDoyMToxOCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogdGV4dGRvbWFpbi5jOiBQdXQgcGFyZW50aGVzZXMgYXJvdW5kIGFyZ3VtZW50cyBvZiBtZW1jcHkgbWFjcm8KLQlkZWZpbml0aW9uLgotCSogbG9jYWxlYWxpYXMuYzogTGlrZXdpc2UuCi0JKiBsMTBuZmxpc3QuYzogTGlrZXdpc2UuCi0JKiBmaW5kZG9tYWluLmM6IExpa2V3aXNlLgotCSogYmluZHRleHRkb20uYzogTGlrZXdpc2UuCi0JUmVwb3J0ZWQgYnkgVGhvbWFzIEVza2VuLgotCi1Nb24gTm92IDI1IDIyOjU3OjUxIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiB0ZXh0ZG9tYWluLmM6IE1vdmUgZGVmaW5pdGlvbiBvZiBgbWVtY3B5YCBtYWNybyB0byByaWdodAotCXBvc2l0aW9uLgotCi1GcmkgTm92IDIyIDA0OjAxOjU4IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBmaW5kZG9tYWluLmMgWyFIQVZFX1NUUklOR19IICYmICFfTElCQ106IERlZmluZSBtZW1jcHkgdXNpbmcKLSAJYmNvcHkgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4gIFJlcG9ydGVkIGJ5IFRob21hcyBFc2tlbi4KLQkqIGJpbmR0ZXh0ZG9tLmM6IExpa2V3aXNlLgotCSogbDEwbmZsaXN0LmM6IExpa2V3aXNlLgotCSogbG9jYWxlYWxpYXMuYzogTGlrZXdpc2UuCi0JKiB0ZXh0ZG9tYWluLmM6IExpa2V3aXNlLgotCi1UdWUgT2N0IDI5IDExOjEwOjI3IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobGliZGlyKTogQ2hhbmdlIHRvIHVzZSBleGVjX3ByZWZpeCBpbnN0ZWFkIG9mCi0gCXByZWZpeC4gIFJlcG9ydGVkIGJ5IEtudXQtSOV2YXJkQWtzbmVzIDxldG9rbmFAZXRvLmVyaWNzc29uLnNlPi4KLQotU2F0IEF1ZyAzMSAwMzowNzowOSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbDEwbmZsaXN0LmMgKF9ubF9ub3JtYWxpemVfY29kZXNldCk6IFdlIGNvbnZlcnQgdG8gbG93ZXIgY2FzZSwKLQlzbyBkb24ndCBwcmVwZW5kIHVwcGVyY2FzZSBgSVNPJyBmb3Igb25seSBudW1lcmljIGFyZy4KLQotRnJpIEp1bCAxOSAwMDoxNTo0NiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbDEwbmZsaXN0LmM6IE1vdmUgaW5jbHVzaW9uIG9mIGFyZ3ouaCwgY3R5cGUuaCwgc3RkbGliLmggYWZ0ZXIKLQlkZWZpbml0aW9uIG9mIF9HTlVfU09VUkNFLiAgUGF0Y2ggYnkgUm9sYW5kIE1jR3JhdGguCi0KLQkqIE1ha2VmaWxlLmluICh1bmluc3RhbGwpOiBGaXggYW5vdGhlciBidWcgd2l0aCBgZm9yJyBsb29wIGFuZAotCWVtcHR5IGFyZ3VtZW50cy4gIFBhdGNoIGJ5IEppbSBNZXllcmluZy4gIENvcnJlY3QgbmFtZSBvcwotCXVuaW5zdGFsbGVkIGZpbGVzOiBubyBpbnRsLSBwcmVmaXggYW55bW9yZS4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZGF0YSk6IEFnYWluIHdvcmsgYXJvdW5kIHNoZWxscyB3aGljaAotCWNhbm5vdCBoYW5kbGUgbXB0eSBmb3IgbGlzdC4gIFJlcG9ydGVkIGJ5IEppbSBNZXllcmluZy4KLQotU2F0IEp1bCAxMyAxODoxMTozNSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBTcGxpdCBnb2FsLiAgTm93IGRlcGVuZCBvbiBpbnN0YWxsLWV4ZWMKLSAgICAgICAgYW5kIGluc3RhbGwtZGF0YS4KLQkoaW5zdGFsbC1leGVjLCBpbnN0YWxsLWRhdGEpOiBOZXcgZ29hbHMuICBDcmVhdGVkIGZyb20gZm9ybWVyCi0JaW5zdGFsbCBnb2FsLgotCVJlcG9ydGVkIGJ5IEthcmwgQmVycnkuCi0KLVNhdCBKdW4gMjIgMDQ6NTg6MTQgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChNS0lOU1RBTExESVJTKTogTmV3IHZhcmlhYmxlLiAgUGF0aCB0bwotICAgICAgICBta2luc3RhbGxkaXJzIHNjcmlwdC4KLQkoaW5zdGFsbCk6IHVzZSBNS0lOU1RBTExESVJTIHZhcmlhYmxlIG9yIGlmIHRoZSBzY3JpcHQgaXMgbm90IHByZXNlbnQKLQl0cnkgdG8gZmluZCBpdCBpbiB0aGUgJHRvcF9zY3JkaXIpLgotCi1XZWQgSnVuIDE5IDAyOjU2OjU2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsMTBuZmxpc3QuYzogTGludXggbGliYyAqcGFydGx5KiBpbmNsdWRlcyB0aGUgYXJnel8qIGZ1bmN0aW9ucy4KLQlHcnIuICBXb3JrIGFyb3VuZCBieSByZW5hbWluZyB0aGUgc3RhdGljIHZlcnNpb24gYW5kIHVzZSBtYWNyb3MKLQlmb3IgcmVuYW1pbmcuCi0KLVR1ZSBKdW4gMTggMjA6MTE6MTcgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGwxMG5mbGlzdC5jOiBDb3JyZWN0IHByZXNlbmNlIHRlc3QgbWFjcm9zIG9mIF9fYXJnel8qIGZ1bmN0aW9ucy4KLQotCSogbDEwbmZsaXN0LmM6IEluY2x1ZGUgPGFyZ3ouaD4gYmFzZWQgb24gdGVzdCBvZiBpdCBpbnN0ZWFkIHdoZW4KLQlfX2FyZ3pfKiBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZS4KLQlSZXBvcnRlZCBieSBBbmRyZWFzIFNjaHdhYi4KLQotVGh1IEp1biAxMyAxNToxNzo0NCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZXhwbG9kZW5hbWUuYywgbDEwbmZsaXN0LmM6IERlZmluZSBOVUxMIGZvciBkdW1iIHN5c3RlbXMuCi0KLVR1ZSBKdW4gMTEgMTc6MDU6MTMgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGludGxoLmluc3QuaW4sIGxpYmdldHRleHQuaCAoZGNnZXR0ZXh0KTogUmVuYW1lIGxvY2FsIHZhcmlhYmxlCi0JcmVzdWx0IHRvIF9fcmVzdWx0IHRvIHByZXZlbnQgbmFtZSBjbGFzaC4KLQotCSogbDEwbmZsaXN0LmMsIGxvY2FsZWFsaWFzLmMsIGRjZ2V0dGV4dC5jOiBEZWZpbmUgX0dOVV9TT1VSQ0UgdG8KLSAgICAgICAgZ2V0IHByb3RvdHlwZSBmb3Igc3RwY3B5IGFuZCBzdHJjYXNlY21wLgotCi0JKiBpbnRsaC5pbnN0LmluLCBsaWJnZXR0ZXh0Lmg6IE1vdmUgZGVjbGFyYXRpb24gb2YKLQlgX25sX21zZ19jYXRfY250cicgb3V0c2lkZSBfX2V4dGVuc2lvbl9fIGJsb2NrIHRvIHByZXZlbnQgd2FybmluZwotCWZyb20gZ2NjJ3MgLVduZXN0ZWQtZXh0ZXJuIG9wdGlvbi4KLQotRnJpIEp1biAgNyAwMTo1ODowMCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZW1vdmUgY29tbWVudC4KLQotVGh1IEp1biAgNiAxNzoyODoxNyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBXb3JrIGFyb3VuZCBmb3IgYW5vdGhlciBCdWdsaXggc3R1cGlkaXR5LgotCUFsd2F5cyB1c2UgYW4gYGVsc2UnIGNsb3NlIGZvciBgaWYncy4gIFJlcG9ydGVkIGJ5IE5lbHNvbiBCZWViZS4KLQotCSogTWFrZWZpbGUuaW4gKGludGxoLmluc3QpOiBDb3JyZWN0IHR5cG8gaW4gcGhvbnkgcnVsZS4KLQlSZXBvcnRlZCBieSBOZWxzb24gQmVlYmUuCi0KLVRodSBKdW4gIDYgMDE6NDk6NTIgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGRjZ2V0dGV4dC5jIChyZWFkX2FsaWFzX2ZpbGUpOiBSZW5hbWUgdmFyaWFibGUgYWxsb2NhX2xpc3QgdG8KLQlibG9ja19saXN0IGFzIHRoZSBtYWNybyBjYWxscyBhc3N1bWUuCi0JUGF0Y2ggYnkgRXJpYyBCYWNrdXMuCi0KLQkqIGxvY2FsZWFsaWFzLmMgWyFIQVZFX0FMTE9DQV06IERlZmluZSBhbGxvY2EgYXMgbWFjcm8gdXNpbmcKLSAgICAgICAgbWFsbG9jLgotCShyZWFkX2FsaWFzX2ZpbGUpOiBSZW5hbWUgdmFycmlhYmUgYWxsb2NhX2xpc3QgdG8gYmxvY2tfbGlzdCBhcyB0aGUKLQltYWNybyBjYWxscyBhc3N1bWUuCi0JUGF0Y2ggYnkgRXJpYyBCYWNrdXMuCi0KLQkqIGwxMG5mbGlzdC5jOiBDb3JyZWN0IGNvbmRpdGlvbmFsIGZvciA8YXJnei5oPiBpbmNsdXNpb24uCi0JUmVwb3J0ZWQgYnkgUm9sYW5kIE1jR3JhdGguCi0KLQkqIE1ha2VmaWxlLmluIChhbGwpOiBEZXBlbmQgb24gYWxsLUBVU0VfSU5DTFVERURfTElCSU5UTEAsIG5vdAotICAgICAgICBhbGwtQFVTRV9OTFNALgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGludGxoLmluc3QgY29tZXMgZnJvbSBsb2NhbCBkaXIsIG5vdAotICAgICAgICAkKHNyY2RpcikuCi0KLQkqIE1ha2VmaWxlLmluIChpbnRsaC5pbnN0KTogU3BlY2lhbCBoYW5kbGluZyBvZiB0aGlzIGdvYWwuICBJZgotCXVzZWQgaW4gZ2V0dGV4dCwgdGhpcyBpcyByZWFsbHkgYSBydWwgdG8gY29uc3RydWN0IHRoaXMgZmlsZS4gIElmCi0JdXNlZCBpbiBhbnkgb3RoZXIgcGFja2FnZSBpdCBpcyBkZWZpbmVkIGFzIGEgLlBIT05ZIHJ1bGUgd2l0aAotCWVtcHR5IGJvZHkuCi0KLQkqIGZpbmRkb21haW4uYzogRXh0cmFjdCBsb2NhbGUgZmlsZSBpbmZvcm1hdGlvbiBoYW5kbGluZyBpbnRvCi0JbDEwbmZpbGUuYy4gIFJlbmFtZSBsb2NhbCBzdHBjcHlfXyBmdW5jdGlvbiB0byBzdHBjcHkuCi0KLQkqIGRjZ2V0dGV4dC5jIChzdHBjcHkpOiBBZGQgbG9jYWwgZGVmaW5pdGlvbi4KLQotCSogbDEwbmZsaXN0LmM6IFNvbHZlIHNvbWUgcG9ydGFiaWxpdHkgcHJvYmxlbXMuICBQYXRjaGVzIHBhcnRseSBieQotCVRob21hcyBFc2tlbi4gIEFkZCBsb2NhbCBkZWZpbml0aW9uIG9mIHN0cGNweS4KLQotVHVlIEp1biAgNCAwMjo0Nzo0OSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaW50bGguaW5zdC5pbjogRG9uJ3QgZGVwZW5kIGluY2x1ZGluZyA8bG9jYWxlLmg+IG9uCi0JSEFWRV9MT0NBTEVfSC4gIEluc3RlYWQgY29uZmlndXJlIG11c3QgcmV3cml0ZSB0aGlzIGZpaWxlCi0JZGVwZW5kaW5nIG9uIHRoZSByZXN1bHQgb2YgdGhlIGNvbmZpZ3VyZSBydW4uCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogbGliaW50bC5pbnN0IGlzIG5vdyBjYWxsZWQgaW50bGguaW5zdC4KLQlBZGQgcnVsZXMgZm9yIHVwZGF0aW5nIGludGxoLmluc3QgZnJvbSBpbnRsaC5pbnN0LmluLgotCi0JKiBsaWJpbnRsLmluc3Q6IFJlbmFtZWQgdG8gaW50bGguaW5zdC5pbi4KLQotCSogbG9jYWxlYWxpYXMuYywgZGNnZXR0ZXh0LmMgW19fR05VQ19fXTogRGVmaW5lIEhBVkVfQUxMT0NBIHRvIDEKLSAgICAgICAgYmVjYXVzZSBnY2MgaGFzIF9fYnVpdGxpbl9hbGxvY2EuCi0JUmVwb3J0ZWQgYnkgUm9sYW5kIE1jR3JhdGguCi0KLU1vbiBKdW4gIDMgMDA6MzI6MTYgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsY2hlY2spOiBOZXcgZ29hbCB0byBmdWxmaWxsIG5lZWRzIG9mCi0gICAgICAgIGF1dG9tYWtlJ3MgZGlzdGNoZWNrLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlb3JkZXIgY29tbWFuZHMgc28gdGhhdCBWRVJTSU9OIGlzCi0gICAgICAgIGZvdW5kLgotCi0JKiBNYWtlZmlsZS5pbiAoZ2V0dGV4dHNyY2Rpcik6IE5vdyB1c2Ugc3ViZGlyZWN0b3J5IGludGwvIGluCi0gICAgICAgIEBkYXRhZGlyQC9nZXR0ZXh0LgotCShDT01TUkNTKTogQWRkIGwxMG5maWxlLmMuCi0JKE9CSkVDVFMpOiBBZGQgbDEwbmZpbGUuby4KLQkoRElTVEZJTEVTKTogUmVuYW1lIHRvIERJU1RGSUxFLm5vcm1hbC4gIFJlbW92ZSAkKERJU1RGSUxFUy5jb21tb24pLgotCShESVNURklMRS5nZXR0ZXh0KTogUmVtb3ZlICQoRElTVEZJTEVTLmNvbW1vbikuCi0JKGFsbC1nZXR0ZXh0KTogUmVtb3ZlIGdvYWwuCi0JKGluc3RhbGwpOiBJZiAkKFBBQ0tBR0UpID0gZ2V0dGV4dCBpbnN0YWxsLCBvdGhlcndvc2UgZG8gbm90aGluZy4gIE5vCi0JcGFja2FnZSBidXQgZ2V0dGV4dCBpdHNlbGYgc2hvdWxkIGluc3RhbGwgbGliaW50bC5oICsgaGVhZGVycy4KLQkoZGlzdCk6IEV4dGVuZCBnb2FsIHRvIHdvcmsgZm9yIGdldHRleHQsIHRvby4KLQkoZGlzdC1nZXR0ZXh0KTogUmVtb3ZlIGdvYWwuCi0KLQkqIGRjZ2V0dGV4dC5jIFshSEFWRV9BTExPQ0FdOiBEZWZpbmUgbWFjcm8gYWxsb2NhIGJ5IHVzaW5nIG1hbGxvYy4KLQotU3VuIEp1biAgMiAxNzozMzowNiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbG9hZG1zZ2NhdC5jIChfbmxfbG9hZF9kb21haW4pOiBQYXJhbWV0ZXIgaXMgbm93IGNvbWVzIGZyb20KLSAgICAgICAgZmluZF9sMTBuZmlsZS4KLQotU2F0IEp1biAgMSAwMjoyMzowMyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbDEwbmZsaXN0LmMgKF9fYXJnel9uZXh0KTogQWRkIGRlZmluaXRpb24uCi0KLQkqIGRjZ2V0dGV4dC5jIFshSEFWRV9BTExPQ0FdOiBBZGQgY29kZSBmb3IgaGFuZGxpbmcgbWlzc2luZyBhbGxvY2EKLQljb2RlLiAgVXNlIG5ldyBsMTBuZmlsZSBoYW5kbGluZy4KLQotCSogbG9jYWxlYWxpYXMuYyBbIUhBVkVfQUxMT0NBXTogQWRkIGNvZGUgZm9yIGhhbmRsaW5nIG1pc3NpbmcKLSAgICAgICAgYWxsb2NhIGNvZGUuCi0KLQkqIGwxMG5mbGlzdC5jOiBJbml0aWFsIHJldmlzaW9uLgotCi1UdWUgQXByICAyIDE4OjUxOjE4IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2V0dGV4dCk6IE5ldyBnb2FsLiAgU2FtZSBhcyBhbGwteWVzLgotCi1UaHUgTWFyIDI4IDIzOjAxOjIyIDE5OTYgIEthcmwgRWljaHdhbGRlciAgPGtlQGtlLmNlbnRyYWwuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChnZXR0ZXh0c3JjZGlyKTogRGVmaW5lIHVzaW5nIEBkYXRhZGlyQC4KLQotVHVlIE1hciAyNiAxMjozOToxNCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmM6IEluY2x1ZGUgPGN0eXBlLmg+LiAgUmVwb3J0ZWQgYnkgUm9sYW5kIE1jR3JhdGguCi0KLVNhdCBNYXIgMjMgMDI6MDA6MzUgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChzdHBjcHkpOiBSZW5hbWUgdG8gc3RwY3B5X18gdG8gcHJldmVudCBjbGFzaGluZwotICAgICAgICB3aXRoIGV4dGVybmFsIGRlY2xhcmF0aW9uLgotCi1TYXQgTWFyICAyIDAwOjQ3OjA5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtbm8pOiBSZW5hbWUgZnJvbSBhbGxfbm8uCi0KLVNhdCBGZWIgMTcgMDA6MjU6NTkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZ2V0dGV4dFAuaCBbbG9hZGVkX2RvbWFpbl06IEFycmF5IGBzdWNjZXNzb3InIG11c3Qgbm93IGNvbnRhaW4gdXAKLSAgICAgICAgdG8gNjMgZWxlbWVudHMgKGJlY2F1c2Ugb2YgY29kZXNldCBuYW1lIG5vcm1hbGl6YXRpb24pLgotCi0JKiBmaW5kZG9tYWluLmM6IEltcGxlbWVudCBjb2Rlc2V0IG5hbWUgbm9ybWFsaXphdGlvbi4KLQotVGh1IEZlYiAxNSAwNDozOTowOSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsKTogRGVmaW5lIHRvIGBhbGwtQFVTRV9OTFNAJy4KLQkoYWxsLXllcywgYWxsX25vKTogTmV3IGdvYWxzLiAgYGFsbC1ubycgaXMgbm9vcCwgYGFsbC15ZXMnCi0JaXMgZm9ybWVyIGFsbC4KLQotTW9uIEphbiAxNSAyMTo0NjowMSAxOTk2ICBIb3dhcmQgR2F5bGUgIDxob3dhcmRAaGFsLmNvbT4KLQotCSogbG9jYWxlYWxpYXMuYyAoYWxpYXNfY29tcGFyZSk6IEluY3JlbWVudCBzdHJpbmcgcG9pbnRlcnMgaW4gbG9vcAotICAgICAgICBvZiBzdHJjYXNlY21wIHJlcGxhY2VtZW50LgotCi1GcmkgRGVjIDI5IDIxOjE2OjM0IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6IFdobyBjb21tZW50ZWQgdGhpcyBnb2FsIG91dCA/IDotKQotCi1GcmkgRGVjIDI5IDE1OjA4OjE2IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGRjZ2V0dGV4dC5jIChEQ0dFVFRFWFQpOiBTYXZlIGBlcnJubycuICBGYWlsaW5nIHN5c3RlbSBjYWxscwotCXNob3VsZCBub3QgZWZmZWN0IGl0IGJlY2F1c2UgYSBtaXNzaW5nIGNhdGFsb2cgaXMgbm8gZXJyb3IuCi0JUmVwb3J0ZWQgYnkgSGFyYWxkIEs8bzo+bmlnIDxrb2VuaWdAdGF0LnBoeXNpay51bmktdHVlYmluZ2VuLmRlPi4KLQotVHVlIERlYyAxOSAyMjowOToxMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBFeHBsaWNpdGx5IHVzZSAkKFNIRUxMKSBmb3IgcnVubmluZwotICAgICAgICBzaGVsbCBzY3JpcHRzLgotCi1GcmkgRGVjIDE1IDE3OjM0OjU5IDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1zcmMpOiBPbmx5IGluc3RhbGwgbGlicmFyeSBhbmQgaGVhZGVyIHdoZW4KLQl3ZSB1c2UgdGhlIG93biBpbXBsZW1lbnRhdGlvbi4gIERvbid0IGRvIGl0IHdoZW4gdXNpbmcgdGhlCi0Jc3lzdGVtJ3MgZ2V0dGV4dCBvciBjYXRnZXRzIGZ1bmN0aW9ucy4KLQotCSogZGNnZXR0ZXh0LmMgKGZpbmRfbXNnKTogTXVzdCBub3Qgc3dhcCBkb21haW4tPmhhc2hfc2l6ZSBoZXJlLgotCi1TYXQgRGVjICA5IDE2OjI0OjM3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvY2FsZWFsaWFzLmMsIGxpYmludGwuaW5zdCwgbGliZ2V0dGV4dC5oLCBoYXNoLXN0cmluZy5oLAotCWdldHRleHRQLmgsIGZpbmRkb21haW4uYywgZGNnZXR0ZXh0LmMsIGNhdC1jb21wYXQuYzoKLQlVc2UgUEFSQU1TIGluc3RlYWQgb2YgX19QLiAgU3VnZ2VzdGVkIGJ5IFJvbGFuZCBNY0dyYXRoLgotCi1UdWUgRGVjICA1IDExOjM5OjE0IDE5OTUgIExhcnJ5IFNjaHdpbW1lciAgPHJvc2VidWRAY3ljbG9uZS5zdGFuZm9yZC5lZHU+Ci0KLQkqIGxpYmdldHRleHQuaDogVXNlIGAjaWYgIWRlZmluZWQgKF9MSUJJTlRMX0gpJyBpbnN0ZWFkIG9mIGAjaWYKLQkhX0xJQklOVExfSCcgYmVjYXVzZSBTb2xhcmlzIGRlZmluZXMgX0xJQklOVExfSCBhcyBlbXB0eS4KLQotTW9uIERlYyAgNCAxNTo0MjowNyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1zcmMpOgotCUluc3RhbGwgbGliaW50bC5pbnN0IGluc3RlYWQgb2YgbGliaW50bC5oLmluc3RhbGwuCi0KLVNhdCBEZWMgIDIgMjI6NTE6MzggMTk5NSAgTWFyY3VzIERhbmllbHMgIDxtYXJjdXNAc3lzYy5wZHguZWR1PgotCi0JKiBjYXQtY29tcGF0LmMgKHRleHRkb21haW4pOgotCVJldmVyc2Ugb3JkZXIgaW4gd2hpY2ggZmlsZXMgYXJlIHRyaWVkIHlvdSBsb2FkLiAgRmlyc3QKLQl0cnkgbG9jYWwgZmlsZSwgd2hlbiB0aGlzIGZhaWxlZCBhYnNvbHV0ZSBwYXRoLgotCi1XZWQgTm92IDI5IDAyOjAzOjUzIDE5OTUgIE5lbHNvbiBILiBGLiBCZWViZSAgPGJlZWJlQG1hdGgudXRhaC5lZHU+Ci0KLQkqIGNhdC1jb21wYXQuYyAoYmluZHRleHRkb21haW4pOiBBZGQgbWlzc2luZyB7IH0uCi0KLVN1biBOb3YgMjYgMTg6MjE6NDEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbGliaW50bC5pbnN0OiBBZGQgbWlzc2luZyBfX1AgZGVmaW5pdGlvbi4gIFJlcG9ydGVkIGJ5IE5lbHNvbiBCZWViZS4KLQotCSogTWFrZWZpbGUuaW46Ci0JQWRkIGR1bW15IGBhbGwnIGFuZCBgZHZpJyBnb2Fscy4gIFJlcG9ydGVkIGJ5IFRvbSBUcm9tZXkuCi0KLVNhdCBOb3YgMjUgMTY6MTI6MDEgMTk5NSAgRnJhbmMsb2lzIFBpbmFyZCAgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPgotCi0JKiBoYXNoLXN0cmluZy5oOiBDYXBpdGFsaXplIGFyZ3VtZW50cyBvZiBtYWNyb3MuCi0KLVNhdCBOb3YgMjUgMTI6MDE6MzYgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6IFByZXZlbnQgZmlsZXMgbmFtZXMgbG9uZ2VyIHRoYW4gMTMKLQljaGFyYWN0ZXJzLiAgbGliaW50bC5oLmdsaWJjLT5saWJpbnRsLmdsaWJjLAotCWxpYmludGwuaC5pbnN0YWxsLT5saWJpbnRsLmluc3QuICBSZXBvcnRlZCBieSBKb3NodWEgUi4gUG91bHNvbi4KLQotU2F0IE5vdiAyNSAxMTozMToxMiAxOTk1ICBFcmljIEJhY2t1cyAgPGVyaWNiQGxzaWQuaHAuY29tPgotCi0JKiBkY2dldHRleHQuYzogRml4IGJ1ZyBpbiBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzLgotCi1TYXQgTm92IDI1IDAyOjM1OjI3IDE5OTUgIE5lbHNvbiBILiBGLiBCZWViZSAgPGJlZWJlQG1hdGgudXRhaC5lZHU+Ci0KLQkqIGxpYmdldHRleHQuaDogU29sYXJpcyBjYyBkb2VzIG5vdCB1bmRlcnN0YW5kCi0JICNpZiAhU1lNQk9MMSAmJiAhU1lNQk9MMi4gIFNhZAlidXQgdHJ1ZS4KLQotVGh1IE5vdiAyMyAxNjoyMjoxNCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBoYXNoLXN0cmluZy5oIChoYXNoX3N0cmluZyk6Ci0JRml4IGZvciBtYWNoaW5lIHdpdGggPjMyIGJpdCBgdW5zaWduZWQgbG9uZydzLgotCi0JKiBkY2dldHRleHQuYyAoRENHRVRURVhUKToKLQlGaXggaG9ycmlibGUgYnVnIGluIGxvb3AgZm9yIGFsdGVybmF0aXZlIHRyYW5zbGF0aW9uLgotCi1UaHUgTm92IDIzIDAxOjQ1OjI5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHBvMnRibC5zZWQuaW4sIGxpbnV4LW1zZy5zZWQsIHhvcGVuLW1zZy5zZWQ6Ci0JU29tZSBmdXJ0aGVyIHNpbXBsaWZpY2F0aW9ucyBpbiBtZXNzYWdlIG51bWJlciBnZW5lcmF0aW9uLgotCi1Nb24gTm92IDIwIDIxOjA4OjQzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxpYmludGwuaC5nbGliYzogVXNlIF9fY29uc3QgaW5zdGVhZCBvZiBjb25zdCBpbiBwcm90b3R5cGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1zcmMpOgotCUluc3RhbGwgbGliaW50bC5oLmluc3RhbGwgaW5zdGVhZCBvZiBsaWJpbnRsLmguICBUaGlzCi0JaXMgYSBzdHJpcHBlZC1kb3duIHZlcnNpb24uICBTdWdnZXN0ZWQgYnkgUGV0ZXIgTWlsbGVyLgotCi0JKiBsaWJpbnRsLmguaW5zdGFsbCwgbGliaW50bC5oLmdsaWJjOiBJbml0aWFsIHJldmlzaW9uLgotCi0JKiBsb2NhbGVhbGlhcy5jIChfbmxfZXhwYW5kX2FsaWFzLCByZWFkX2FsaWFzX2ZpbGUpOgotCVByb3RlY3QgcHJvdG90eXBlcyBpbiB0eXBlIGNhc3RzIGJ5IF9fUC4KLQotVHVlIE5vdiAxNCAxNjo0Mzo1OCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBoYXNoLXN0cmluZy5oOiBDb3JyZWN0IHByb3RvdHlwZSBmb3IgaGFzaF9zdHJpbmcuCi0KLVN1biBOb3YgMTIgMTI6NDI6MzAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogaGFzaC1zdHJpbmcuaCAoaGFzaF9zdHJpbmcpOiBBZGQgcHJvdG90eXBlLgotCi0JKiBnZXR0ZXh0UC5oOiBGaXggY29weXJpZ2h0LgotCShTV0FQKTogQWRkIHByb3RvdHlwZS4KLQotV2VkIE5vdiAgOCAyMjo1NjozMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOiBGb3Jnb3Qgc2l6ZW9mLgotCUF2b2lkIGNhbGxpbmcgKnByaW50ZiBmdW5jdGlvbi4gIFRoaXMgaW50cm9kdWNlcyBhIGJpZyBvdmVyaGVhZC4KLQlQYXRjaCBieSBSb2xhbmQgTWNHcmF0aC4KLQotVHVlIE5vdiAgNyAxNDoyMTowOCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMsIGNhdC1jb21wYXQuYzogV3JvbmcgaW5kZW50YXRpb24gaW4gI2lmIGZvciBzdHBjcHkuCi0KLQkqIGZpbmRkb21haW4uYyAoc3RwY3B5KToKLQlEZWZpbmUgc3Vic3RpdHV0aW9uIGZ1bmN0aW9uIGxvY2FsLiAgVGhlIG1hY3JvIHdhcyB0byBmbGFreS4KLQotCSogY2F0LWNvbXBhdC5jOiBGaXggdHlwby4KLQotCSogeG9wZW4tbXNnLnNlZCwgbGludXgtbXNnLnNlZDoKLQlXaGlsZSBicmluZ2luZyBtZXNzYWdlIG51bWJlciB0byByaWdodCBwbGFjZSBvbmx5IGFjY2VwdCBkaWdpdHMuCi0KLQkqIGxpbnV4LW1zZy5zZWQsIHhvcGVuLW1zZy5zZWQ6IE5vdyB0aGF0IHRoZSBjb3VudGVyIGRvZXMgbm90IGhhdmUKLQlsZWFkaW5nIDBzIHdlIGRvbid0IG5lZWQgdG8gcmVtb3ZlIHRoZW0uICBSZXBvcnRlZCBieSBNYXJjdXMKLQlEYW5pZWxzLgotCi0JKiBNYWtlZmlsZS5pbiAoLi4vcG8vY2F0LWlkLXRibC5vKTogVXNlICQodG9wX3NyZGlyKSBpbgotCWRlcGVuZGVuY3kuICBSZXBvcnRlZCBieSBNYXJjdXMgRGFuaWVscy4KLQotCSogY2F0LWNvbXBhdC5jOiAoc3RwY3B5KSBbIV9MSUJDICYmICFIQVZFX1NUUENQWV06IERlZmluZSByZXBsYWNlbWVudC4KLQlHZW5lcmFsbHkgY2xlYW51cCB1c2luZyAjaWYgaW5zdGVhZCBvZiAjaWZuZGVmLgotCi0JKiBNYWtlZmlsZS5pbjogQ29ycmVjdCB0eXBvcyBpbiBjb21tZW50LiAgQnkgRnJhbmMsb2lzIFBpbmFyZC4KLQotTW9uIE5vdiAgNiAwMDoyNzowMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1zcmMpOiBEb24ndCBpbnN0YWxsIGxpYmludGwuaCBhbmQgbGliaW50bC5hCi0JaWYgd2UgdXNlIGFuIGF2YWlsYWJsZSBnZXR0ZXh0IGltcGxlbWVudGF0aW9uLgotCi1TdW4gTm92ICA1IDIyOjAyOjA4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxpYmdldHRleHQuaDogRml4IHR5cG86IEhBVkVfQ0FUR0VUVFMgLT4gSEFWRV9DQVRHRVRTLiAgUmVwb3J0ZWQKLQlieSBGcmFuYyxvaXMgUGluYXJkLgotCi0JKiBsaWJnZXR0ZXh0Lmg6IFVzZSAjaWYgaW5zdGVhZCBvZiAjaWZkZWYvI2lmbmRlZi4KLQotCSogZmluZGRvbWFpbi5jOgotCUNvbW1lbnRzIGRlc2NyaWJpbmcgd2hhdCBoYXMgdG8gYmUgZG9uZSBzaG91bGQgc3RhcnQgd2l0aCBGSVhNRS4KLQotU3VuIE5vdiAgNSAxOTozODowMSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogU3BsaXQuICBVc2UgRElTVEZJTEVTIHdpdGggbm9ybWFsIG1lYW5pbmcuCi0JRElTVEZJTEVTLmNvbW1vbiBuYW1lcyB0aGUgZmlsZXMgY29tbW9uIHRvIGJvdGggZGlzdCBnb2Fscy4KLQlESVNURklMRVMuZ2V0dGV4dCBhcmUgdGhlIGZpbGVzIG9ubHkgZGlzdHJpYnV0ZWQgaW4gR05VIGdldHRleHQuCi0KLVN1biBOb3YgIDUgMTc6MzI6NTQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZGNnZXR0ZXh0LmMgKERDR0VUVEVYVCk6IENvcnJlY3Qgc2VhcmNoaW5nIGluIGRlcml2ZWQgbG9jYWxlcy4KLQlUaGlzIHdhcyBuZWNlc3Nhcnkgc2luY2UgYSBjaGFuZ2UgaW4gX25sX2ZpbmRfbXNnIHNldmVyYWwgd2Vla3MKLQlhZ28uICBJIHJlYWxseSBkb24ndCBrbm93IHRoaXMgaXMgc3RpbGwgbm90IGZpeGVkLgotCi1TdW4gTm92ICA1IDEyOjQzOjEyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvYWRtc2djYXQuYyAoX25sX2xvYWRfZG9tYWluKTogVGVzdCBmb3IgRklMRU5BTUUgPT0gTlVMTC4gIFRoaXMKLQltaWdodCBtYXJrIGEgc3BlY2lhbCBjb25kaXRpb24uCi0KLQkqIGZpbmRkb21haW4uYyAobWFrZV9lbnRyeV9yZWMpOiBEb24ndCBtYWtlIGlsbGVnYWwgZW50cnkgYXMgZGVjaWRlZC4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3QpOiBTdXBwcmVzcyBlcnJvciBtZXNzYWdlIHdoZW4gbG4gZmFpbGVkLgotCUdldCBmaWxlcyBmcm9tICQoc3JjZGlyKSBleHBsaWNpdGx5LgotCi0JKiBsaWJnZXR0ZXh0LmggKGdldHRleHRfY29uc3QpOiBSZW5hbWUgdG8gZ2V0dGV4dF9ub29wLgotCi1GcmkgTm92ICAzIDA3OjM2OjUwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAobWFrZV9lbnRyeV9yZWMpOgotCVByb3RlY3QgYWdhaW5zdCB3cm9uZyBsb2NhbGUgbmFtZXMgYnkgdGVzdGluZyBtYXNrLgotCi0JKiBsaWJnZXR0ZXh0LmggKGdldHRleHRfY29uc3QpOiBBZGQgbWFjcm8gZGVmaW5pdGlvbi4KLQlDYXBpdGFsaXplIG1hY3JvIGFyZ3VtZW50cy4KLQotVGh1IE5vdiAgMiAyMzoxNTo1MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6Ci0JVGVzdCBmb3IgcG9pbnRlciAhPSBOVUxMIGJlZm9yZSBhY2Nlc3NpbmcgdmFsdWUuCi0JUmVwb3J0ZWQgYnkgVG9tIFRyb21leS4KLQotCSogZ2V0dGV4dC5jIChOVUxMKToKLQlEZWZpbmUgYXMgKHZvaWQqKTAgaW5zdGFkIG9mIDAuICBSZXBvcnRlZCBieSBGcmFuYyxvaXMgUGluYXJkLgotCi1Nb24gT2N0IDMwIDIxOjI4OjUyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHBvMnRibC5zZWQuaW46IFNlcmlvdXMgdHlwbyBidWcgZml4ZWQgYnkgSmltIE1leWVyaW5nLgotCi1TYXQgT2N0IDI4IDIzOjIwOjQ3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxpYmdldHRleHQuaDogRGlzYWJsZSBkY2dldHRleHQgb3B0aW1pemF0aW9uIGZvciBTb2xhcmlzIDIuMy4KLQotCSogbG9jYWxlYWxpYXMuYyAoYWxpYXNfY29tcGFyZSk6Ci0JUGV0ZXIgTWlsbGVyIHJlcG9ydGVkIHRoYXQgdG9sb3dlciBpbiBzb21lIHN5c3RlbXMgaXMKLQlldmVuIGR1bWJlciB0aGFuIEkgdGhvdWdodC4gIFByb3RlY3QgY2FsbCBieSBgaXN1cHBlcicuCi0KLUZyaSBPY3QgMjcgMjI6MjI6NTEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGxpYmRpciwgaW5jbHVkZWRpcik6IE5ldyB2YXJpYWJsZXMuCi0JKGluc3RhbGwtc3JjKTogSW5zdGFsbCBsaWJpbnRsLmEgYW5kIGxpYmludGwuaCBpbiBjb3JyZWN0IGRpcnMuCi0KLUZyaSBPY3QgMjcgMjI6MDc6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKFNPVVJDRVMpOiBGaXggdHlwbzogaW50cmwuY29tcGF0LmMgLT4gaW50bC1jb21wYXQuYy4KLQotCSogcG8ydGJsLnNlZC5pbjogUGF0Y2ggZm9yIGJ1Z2d5IFNFRHMgYnkgQ2hyaXN0aWFuIHZvbiBSb3F1ZXMuCi0KLQkqIGxvY2FsZWFsaWFzLmM6Ci0JRml4IHR5cG8gYW5kIHN1cGVyZmxvdXMgdGVzdC4gIFJlcG9ydGVkIGJ5IENocmlzdGlhbiB2b24gUm9xdWVzLgotCi1GcmkgT2N0ICA2IDExOjUyOjA1IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKLQlDb3JyZWN0IHNvbWUgcmVtYWluZGVyIGZyb20gdGhlIHByZS1DRU4gc3ludGF4LiAgTm93Ci0Jd2UgZG9uJ3QgaGF2ZSBhIGNvbnN0YW50IG51bWJlciBvZiBzdWNjZXNzb3JzIGFueW1vcmUuCi0KLVdlZCBTZXAgMjcgMjE6NDE6MTMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6IEFkZCBsaWJpbnRsLmguZ2xpYmMuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0LWxpYmMpOiBBZGQgZ29hbCBmb3IgcGFja2luZyBzb3VyY2VzIGZvciBnbGliYy4KLQkoQ09NU1JDUywgQ09NSERSUyk6IFNwbGl0dGVkIHRvIHNlcGFyYXRlIHNvdXJjZXMgc2hhcmVkIHdpdGggZ2xpYmMuCi0KLQkqIGxvYWRtc2djYXQuYzogRm9yZ2V0IHRvIGNvbnRpbnVlICNpZiBsaW5lLgotCi0JKiBsb2NhbGVhbGlhcy5jOgotCVtfTElCQ106IFJlbmFtZSBzdHJjYXNlY21wIHRvIF9fc3RyY2FzZWNtcCB0byBrZWVwIEFOU0kgQyBuYW1lCi0Jc3BhY2UgY2xlYW4uCi0KLQkqIGRjZ2V0dGV4dC5jLCBmaW5kZG9tYWluLmM6IEJldHRlciBjb21tZW50IHRvIGxhc3QgY2hhbmdlLgotCi0JKiBsb2FkbXNnY2F0LmM6Ci0JW19MSUJDXTogUmVuYW1lIGZzdGF0LCBvcGVuLCBjbG9zZSwgcmVhZCwgbW1hcCwgYW5kIG11bm1hcCB0bwotCV9fZnN0YXQsIF9fb3BlbiwgX19jbG9zZSwgX19yZWFkLCBfX21tYXAsIGFuZCBfX211bm1hcCByZXNwCi0JdG8ga2VlcCBBTlNJIEMgbmFtZSBzcGFjZSBjbGVhbi4KLQotCSogZmluZGRvbWFpbi5jOgotCVtfTElCQ106IFJlbmFtZSBzdHBjcHkgdG8gX19zdHBjcHkgdG8ga2VlcCBBTlNJIEMgbmFtZSBzcGFjZSBjbGVhbi4KLQotCSogZGNnZXR0ZXh0LmM6Ci0JW19MSUJDXTogUmVuYW1lIGdldGNlZCBhbmQgc3RwY3B5IHRvIF9fZ2V0Y3dkIGFuZCBfX3N0cGNweSByZXNwIHRvCi0Ja2VlcCBBTlNJIEMgbmFtZSBzcGFjZSBjbGVhbi4KLQotCSogbGliZ2V0dGV4dC5oOgotCUluY2x1ZGUgc3lzL3R5cGVzLmggZm9yIHRob3NlIG9sZCBTeXNWIHN5c3RlbXMgb3V0IHRoZXJlLgotCVJlcG9ydGVkIGJ5IEZyYW5jZXNjbyBQb3RvcnRpYC4KLQotCSogbG9hZG1zZ2NhdC5jICh1c2VfbW1hcCk6IERlZmluZSBpZiBjb21waWxlZCBmb3IgZ2xpYmMuCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6IEluY2x1ZGUgYWxsIHRob3NlIHN0YW5kYXJkIGhlYWRlcnMKLQl1bmNvbmRpdGlvbmFsbHkgaWYgX0xJQkMgaXMgZGVmaW5lZC4KLQotCSogZmluZGRvbWFpbi5jOiBGaXggMiB0aW1lcyBkZWZpZW5kIC0+IGRlZmluZWQuCi0KLQkqIHRleHRkb21haW4uYzogSW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZiBsaWJnZXR0ZXh0Lmggd2hlbgotCWNvbXBpbGluZyBmb3IgZ2xpYmMuICBJbmNsdWRlIGFsbCB0aG9zZSBzdGFuZGFyZCBoZWFkZXJzCi0JdW5jb25kaXRpb25hbGx5IGlmIF9MSUJDIGlzIGRlZmluZWQuCi0KLQkqIGxvY2FsZWFsaWFzLmMsIGxvYWRtc2djYXQuYzogUHJlcGFyZSB0byBiZSBjb21waWxlZCBpbiBnbGliYy4KLQotCSogZ2V0dGV4dC5jOgotCUluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YgbGliZ2V0dGV4dC5oIHdoZW4gY29tcGlsaW5nIGZvciBnbGliYy4KLQlHZXQgTlVMTCBmcm9tIHN0ZGRlZi5oIGlmIHdlIGNvbXBpbGUgZm9yIGdsaWJjLgotCi0JKiBmaW5kZG9tYWluLmM6IEluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YgbGliZ2V0dGV4dC5oIHdoZW4KLQljb21waWxpbmcgZm9yIGdsaWJjLiAgSW5jbHVkZSBhbGwgdGhvc2Ugc3RhbmRhcmQgaGVhZGVycwotCXVuY29uZGl0aW9uYWxseSBpZiBfTElCQyBpcyBkZWZpbmVkLgotCi0JKiBkY2dldHRleHQuYzogSW5jbHVkZSBhbGwgdGhvc2Ugc3RhbmRhcmQgaGVhZGVycyB1bmNvbmRpdGlvbmFsbHkKLQlpZiBfTElCQyBpcyBkZWZpbmVkLgotCi0JKiBkZ2V0dGV4dC5jOiBJZiBjb21waWxlZCBpbiBnbGliYyBpbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mCi0JbGliZ2V0dGV4dC5oLgotCShsb2NhbGUuaCk6IERvbid0IHJlbHkgb24gSEFWRV9MT0NBTEVfSCB3aGVuIGNvbXBpbGluZyBmb3IgZ2xpYmMuCi0KLQkqIGRjZ2V0dGV4dC5jOiBJZiBjb21waWxlZCBpbiBnbGliYyBpbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mCi0JbGliZ2V0dGV4dC5oLgotCShnZXRjd2QpOiBEb24ndCByZWx5IG9uIEhBVkVfR0VUQ1dEIHdoZW4gY29tcGlsaW5nIGZvciBnbGliYy4KLQotCSogYmluZHRleHRkb20uYzoKLQlJZiBjb21waWxlZCBpbiBnbGliYyBpbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mIGxpYmdldHRleHQuaC4KLQotTW9uIFNlcCAyNSAyMjoyMzowNiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2NhbGVhbGlhcy5jIChfbmxfZXhwYW5kX2FsaWFzKTogRG9uJ3QgY2FsbCBic2VhcmNoIGlmIE5NQVAgPD0gMC4KLQlSZXBvcnRlZCBieSBNYXJjdXMgRGFuaWVscy4KLQotCSogY2F0LWNvbXBhdC5jIChiaW5kdGV4dGRvbWFpbik6Ci0JU3RyaW5nIHVzZWQgaW4gcHV0ZW52IG11c3Qgbm90IGJlIHJlY3ljbGVkLgotCVJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgotCi0JKiBsaWJnZXR0ZXh0LmggKF9fVVNFX0dOVV9HRVRURVhUKToKLQlBZGRpdGlvbmFsIHN5bWJvbCB0byBzaWduYWwgdGhhdCB3ZSB1c2UgR05VIGdldHRleHQKLQlsaWJyYXJ5LgotCi0JKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKToKLQlGaXggYnVnIHdpdGggdGhlIHN0cmFuZ2Ugc3RwY3B5IHJlcGxhY2VtZW50LgotCVJlcG9ydGVkIGJ5IE5lbHNvbiBCZWViZS4KLQotU2F0IFNlcCAyMyAwODoyMzo1MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBjYXQtY29tcGF0LmM6IEluY2x1ZGUgPHN0cmluZy5oPiBmb3Igc3RwY3B5IHByb3RvdHlwZS4KLQotCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKToKLQlXaGlsZSBleHBhbmQgc3RyZHVwIGNvZGUgdGVtcG9yYXJ5IHZhcmlhYmxlIGBjcCcgaGlkZWQKLQloaWdoZXIgbGV2ZWwgdmFyaWFibGUgd2l0aCBzYW1lIG5hbWUuICBSZW5hbWUgdG8gYHRwJy4KLQotCSogdGV4dGRvbWFpbi5jICh0ZXh0ZG9tYWluKToKLQlBdm9pZCB3YXJuaW5nIGJ5IHVzaW5nIHRlbXBvcmFyeSB2YXJpYWJsZSBpbiBzdHJkdXAgY29kZS4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGBhcHBsaWNhdGlvbicuCi0KLVRodSBTZXAgMjEgMTU6NTE6NDQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9jYWxlYWxpYXMuYyAoYWxpYXNfY29tcGFyZSk6Ci0JVXNlIHN0cmNhc2VjbXAoKSBvbmx5IGlmIGF2YWlsYWJsZS4gIEVsc2UgdXNlCi0JaW1wbGVtZW50YXRpb24gaW4gcGxhY2UuCi0KLQkqIGludGwtY29tcGF0LmM6Ci0JV3JhcHBlciBmdW5jdGlvbnMgbm93IGNhbGwgKl9fIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIF9fKi4KLQotCSogbGliZ2V0dGV4dC5oOiBEZWNsYXJlIHByb3RvdHlwZXMgZm9yICpfXyBmdW5jdGlvbnMgaW5zdGVhZCBmb3IgX18qLgotCi0JKiBjYXQtY29tcGF0LmMsIGxvYWRtc2djYXQuYzoKLQlEb24ndCB1c2UgeG1hbGxvYywgeHN0cmR1cCwgYW5kIHN0cGNweS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQKLQlvZiB0aGUgc3RhbmRhcmQgbGliYyBhbmQgc28gcHJldmVudCBsaWJpbnRsLmEgZnJvbSBiZWluZyB1c2VkCi0Jc3RhbmRhbG9uZS4KLQotCSogYmluZHRleHRkb20uYzoKLQlEb24ndCB1c2UgeG1hbGxvYywgeHN0cmR1cCwgYW5kIHN0cGNweS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQKLQlvZiB0aGUgc3RhbmRhcmQgbGliYyBhbmQgc28gcHJldmVudCBsaWJpbnRsLmEgZnJvbSBiZWluZyB1c2VkCi0Jc3RhbmRhbG9uZS4KLQlSZW5hbWUgdG8gYmluZHRleHRkb21haW5fXyBpZiBub3QgdXNlZCBpbiBHTlUgQyBMaWJyYXJ5LgotCi0JKiBkZ2V0dGV4dC5jOgotCVJlbmFtZSBmdW5jdGlvbiB0byBkZ2V0dGV4dF9fIGlmIG5vdCB1c2VkIGluIEdOVSBDIExpYnJhcnkuCi0KLQkqIGdldHRleHQuYzoKLQlEb24ndCB1c2UgeG1hbGxvYywgeHN0cmR1cCwgYW5kIHN0cGNweS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQKLQlvZiB0aGUgc3RhbmRhcmQgbGliYyBhbmQgc28gcHJldmVudCBsaWJpbnRsLmEgZnJvbSBiZWluZyB1c2VkCi0Jc3RhbmRhbG9uZS4KLQlGdW5jdGlvbnMgbm93IGNhbGxlZCBnZXR0ZXh0X18gaWYgbm90IHVzZWQgaW4gR05VIEMgTGlicmFyeS4KLQotCSogZGNnZXR0ZXh0LmMsIGxvY2FsZWFsaWFzLmMsIHRleHRkb21haW4uYywgZmluZGRvbWFpbi5jOgotCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAotCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKLQlzdGFuZGFsb25lLgotCi1TdW4gU2VwIDE3IDIzOjE0OjQ5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYzogQ29ycmVjdCBzb21lIGJ1Z3MgaW4gaGFuZGxpbmcgb2YgQ0VOIHN0YW5kYXJkCi0gCWxvY2FsZSBkZWZpbml0aW9ucy4KLQotVGh1IFNlcCAgNyAwMTo0OToyOCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmM6IEltcGxlbWVudCBDRU4gc3ludGF4LgotCi0JKiBnZXR0ZXh0UC5oIChsb2FkZWRfZG9tYWluKTogRXh0ZW5kIG51bWJlciBvZiBzdWNjZXNzb3JzIHRvIDMxLgotCi1TYXQgQXVnIDE5IDE5OjI1OjI5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGlhc3BhdGgpOiBSZW1vdmUgcGF0aCB0byBYMTEgbG9jYWxlIGRpci4KLQotCSogTWFrZWZpbGUuaW46IE1ha2UgaW5zdGFsbC1zcmMgZGVwZW5kIG9uIGluc3RhbGwuICBUaGlzIGhlbHBzCi0gCWdldHRleHQgdG8gaW5zdGFsbCB0aGUgc291cmNlcyBhbmQgb3RoZXIgcGFja2FnZXMgY2FuIHVzZSB0aGUKLSAJaW5zdGFsbCBnb2FsLgotCi1TYXQgQXVnIDE5IDE1OjE5OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluICh1bmluc3RhbGwpOiBSZW1vdmUgc3R1ZmYgaW5zdGFsbGVkIGJ5IGluc3RhbGwtc3JjLgotCi1UdWUgQXVnIDE1IDEzOjEzOjUzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIFZFUlNJT04uaW46IEluaXRpYWwgcmV2aXNpb24uCi0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOgotCUFkZCBWRVJTSU9OIGZpbGUuICBUaGlzIGlzIG5vdCBuZWNlc3NhcnkgZm9yIGdldHRleHQsIGJ1dAotCWZvciBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGlzIGxpYnJhcnkuCi0KLVR1ZSBBdWcgMTUgMDY6MTY6NDQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZ2V0dGV4dFAuaCAoX25sX2ZpbmRfZG9tYWluKToKLQlOZXcgcHJvdG90eXBlIGFmdGVyIGNoYW5naW5nIHNlYXJjaCBzdHJhdGVneS4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgotCVdlIG5vdyB0cnkgb25seSB0byBmaW5kIGEgc3BlY2lmaWVkIGNhdGFsb2cuICBGYWxsIGJhY2sgdG8gb3RoZXIKLQljYXRhbG9ncyBsaXN0ZWQgaW4gdGhlIGxvY2FsZSBsaXN0IGlzIG5vdyBkb25lIGluIF9fZGNnZXR0ZXh0LgotCi0JKiBkY2dldHRleHQuYyAoX19kY2dldHRleHQpOgotCU5vdyB3ZSBwcm92aWRlIG1lc3NhZ2UgZmFsbCBiYWNrIGV2ZW4gdG8gZGlmZmVyZW50IGxhbmd1YWdlcy4KLQlJLmUuIGlmIGEgbWVzc2FnZSBpcyBub3QgYXZhaWxhYmxlIGluIG9uZSBsYW5ndWFnZSBhbGwgdGhlIG90aGVyCi0gCWluIHRoZSBsb2NhbGUgbGlzdCBhIHRyaWVkLiAgRm9ybWVybHkgZmFsbCBiYWNrIHdhcyBvbmx5IHBvc3NpYmxlCi0gCXdpdGhpbiBvbmUgbGFuZ3VhZ2UuICBJbXBsZW1lbnRlZCBieSBtb3Zpbmcgb25lIGxvb3AgZnJvbQotIAlfbmxfZmluZF9kb21haW4gdG8gaGVyZS4KLQotTW9uIEF1ZyAxNCAyMzo0NTo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoZ2V0dGV4dHNyY2Rpcik6Ci0JRGlyZWN0b3J5IHdoZXJlIHNvdXJjZSBvZiBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGFyZSBtYWRlCi0JYXZhaWxhYmxlLgotCShJTlNUQUxMLCBJTlNUQUxMX0RBVEEpOiBQcm9ncmFtcyB1c2VkIGZvciBpbnN0YWxsaW5nIHNvdXJjZXMuCi0JKGdldHRleHQtc3JjKTogTmV3LiAgUnVsZSB0byBpbnN0YWxsIEdOVSBnZXR0ZXh0IHNvdXJjZXMgZm9yIHVzZSBpbgotCWdldHRleHRpemUgc2hlbGwgc2NyaXB0LgotCi1TdW4gQXVnIDEzIDE0OjQwOjQ4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvYWRtc2djYXQuYyAoX25sX2xvYWRfZG9tYWluKToKLQlVc2UgbW1hcCBmb3IgbG9hZGluZyBvbmx5IHdoZW4gbXVubWFwIGZ1bmN0aW9uIGlzCi0JYWxzbyBhdmFpbGFibGUuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRGVwZW5kIG9uIGBhbGwnIGdvYWwuCi0KLVdlZCBBdWcgIDkgMTE6MDQ6MzMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKToKLQlEbyBub3Qgb3ZlcndyaXRlICdcbicgd2hlbiB0ZXJtaW5hdGluZyBhbGlhcyB2YWx1ZSBzdHJpbmcuCi0KLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6Ci0JSGFuZGxlIGxvbmcgbGluZXMuICBJZ25vcmUgdGhlIHJlc3Qgbm90IGZpdHRpbmcgaW4KLQl0aGUgYnVmZmVyIGFmdGVyIHRoZSBpbml0aWFsIGBmZ2V0cycgY2FsbC4KLQotV2VkIEF1ZyAgOSAwMDo1NDoyOSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBnZXR0ZXh0UC5oIChfbmxfbG9hZF9kb21haW4pOgotCUFkZCBwcm90b3R5cGUsIHJlcGxhY2luZyBwcm90b3R5cGUgZm9yIF9ubF9sb2FkX21zZ19jYXQuCi0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKLQlSZW1vdmUgdW5uZWVkZWQgdmFyaWFibGUgZmlsZW5hbWUgYW5kIGZpbGVuYW1lX2xlbi4KLQkoZXhwYW5kX2FsaWFzKTogUmVtb3ZlIHByb3RvdHlwZSBiZWNhdXNlIGZ1bmN0aW9ucyBkb2VzIG5vdAotIAlleGlzdCBhbnltb3JlLgotCi0JKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOgotCUNoYW5nZSB0eXBlIG9mIGZuYW1lX2xlbiBwYXJhbWV0ZXIgdG8gaW50LgotCSh4bWFsbG9jKTogQWRkIHByb3RvdHlwZS4KLQotCSogbG9hZG1zZ2NhdC5jOiBCZXR0ZXIgcHJvdG90eXBlcyBmb3IgeG1hbGxvYy4KLQotVHVlIEF1ZyAgOCAyMjozMDozOSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6Ci0JQWxsb3cgYWxpYXMgbmFtZSB0byBiZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBmb3VyIGNvbXBvbmVudHMuCi0KLQkqIE1ha2VmaWxlLmluIChhbGlhc3BhdGgpOiBOZXcgdmFyaWFibGUuICBTZXQgdG8gcHJlbGltaW5hcnkgdmFsdWUuCi0JKFNPVVJDRVMpOiBBZGQgbG9jYWxlYWxpYXMuYy4KLQkoT0JKRUNUUyk6IEFkZCBsb2NhbGVhbGlhcy5vLgotCi0JKiBnZXR0ZXh0UC5oOiBBZGQgcHJvdG90eXBlIGZvciBfbmxfZXhwYW5kX2FsaWFzLgotCi0JKiBmaW5kZG9tYWluLmM6IEFsaWFzaW5nIGhhbmRsZWQgaW4gaW50bC9sb2NhbGVhbGlhcy5jLgotCi0JKiBsb2NhbGVhbGlhcy5jOiBBbGlhc2luZyBmb3IgbG9jYWxlIG5hbWVzLgotCi0JKiBiaW5kdGV4dGRvbS5jOiBCZXR0ZXIgcHJvdG90eXBlcyBmb3IgeG1hbGxvYyBhbmQgeHN0cmR1cC4KLQotTW9uIEF1ZyAgNyAyMzo0Nzo0MiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogZ2V0dGV4dC5wZXJsIGlzIG5vdyBmb3VuZCBpbiBtaXNjLy4KLQotCSogY2F0LWNvbXBhdC5jIChiaW5kdGV4dGRvbWFpbik6Ci0JQ29ycmVjdCBpbXBsZW1lbnRhdGlvbi4gIGRpcm5hbWUgcGFyYW1ldGVyIHdhcyBub3QgdXNlZC4KLQlSZXBvcnRlZCBieSBNYXJjdXMgRGFuaWVscy4KLQotCSogZ2V0dGV4dFAuaCAobG9hZGVkX2RvbWFpbik6Ci0JTmV3IGZpZWxkcyBgc3VjY2Vzc29yJyBhbmQgYGRlY2lkZWQnIGZvciBvbywgbGF6eQotCW1lc3NhZ2UgaGFuZGxpbmcgaW1wbGVtZW50YXRpb24uCi0KLQkqIGRjZ2V0dGV4dC5jOgotCUFkb3B0IGZvciBvbywgbGF6eSBtZXNzYWdlIGhhbmRsaWluZy4KLSAgCU5vdyB3ZSBjYW4gaW5oZXJpdCB0cmFuc2xhdGlvbnMgZnJvbSBsZXNzIHNwZWNpZmljIGxvY2FsZXMuCi0JKGZpbmRfbXNnKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBsb2FkbXNnY2F0LmMsIGZpbmRkb21haW4uYzoKLQlDb21wbGV0ZSByZXdyaXRlLiAgSW1wbGVtZW50IG9vLCBsYXp5IG1lc3NhZ2UgaGFuZGxpbmcgOi0pLgotICAJV2Ugbm93IGhhdmUgYW4gYWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZSBgTEFOR1VBR0UnIHdpdGgKLSAJYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiBMQ19BTEwgZm9yIHRoZSBMQ19NRVNTQUdFIGxvY2FsZS4KLSAgCUhlcmUgd2UgY2FuIHNldCBhIGNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIHNwZWNpZmljYXRpb25zIGVhY2gKLSAJb2YgdGhlIGZvcm0gYGxhbmd1YWdlW190ZXJyaXRvcnlbLmNvZGVzZXRdXVtAbW9kaWZpZXJdJy4KLQotU2F0IEF1ZyAgNSAwOTo1NTo0MiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKHVuaXN0ZC5oKToKLQlJbmNsdWRlIHRvIGdldCBfUENfUEFUSF9NQVggZGVmaW5lZCBvbiBzeXN0ZW0gaGF2aW5nIGl0LgotCi1GcmkgQXVnICA0IDIyOjQyOjAwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAoc3RwY3B5KTogSW5jbHVkZSBwcm90b3R5cGUuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0KTogUmVtb3ZlIGBjb3B5aW5nIGluc3RlYWQnIG1lc3NhZ2UuCi0KLVdlZCBBdWcgIDIgMTg6NTI6MDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKElELCBUQUdTKTogRG8gbm90IHVzZSAkXi4KLQotVHVlIEF1ZyAgMSAyMDowNzoxMSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoVEFHUywgSUQpOiBVc2UgJF4gYXMgY29tbWFuZCBhcmd1bWVudC4KLQkoVEFHUyk6IEdpdmUgZXRhZ3MgLW8gb3B0aW9uIHQgd3JpdGUgdG8gY3VycmVudCBkaXJlY3RvcnksCi0gCW5vdCAkKHNyY2RpcikuCi0JKElEKTogVXNlICQoc3JjZGlyKSBpbnN0ZWFkIG9zICQodG9wX3NyY2Rpcikvc3JjLgotCShkaXN0Y2xlYW4pOiBSZW1vdmUgSUQuCi0KLVN1biBKdWwgMzAgMTE6NTE6NDYgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGdudWxvY2FsZWRpcik6Ci0JTmV3IHZhcmlhYmxlLCBhbHdheXMgdXNpbmcgc2hhcmUvIGZvciBkYXRhIGRpcmVjdG9yeS4KLQkoREVGUyk6IEFkZCBHTlVMT0NBTEVESVIsIHVzZWQgaW4gZmluZGRvbWFpbi5jLgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOgotCVNldCB0byBHTlVMT0NBTEVESVIsIGJlY2F1c2UgaXQgYWx3YXlzIGhhcyB0byBwb2ludAotCXRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgR05VIGdldHRleHQgTGlicmFyeSB3cml0ZXMgaXQgdG8uCi0KLQkqIGludGwtY29tcGF0LmMgKHRleHRkb21haW4sIGJpbmR0ZXh0ZG9tYWluKToKLQlVbmRlZmluZSBtYWNyb3MgYmVmb3JlIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0KLVNhdCBKdWwgMjIgMDE6MTA6MDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbGliZ2V0dGV4dC5oIChfTElCSU5UTF9IKToKLQlQcm90ZWN0IGRlZmluaXRpb24gaW4gY2FzZSB3aGVyZSB0aGlzIGZpbGUgaXMgaW5jbHVkZWQgYXMKLQlsaWJnZXR0ZXh0Lmggb24gU29sYXJpcyBtYWNoaW5lcy4gIEFkZCBjb21tZW50IGFib3V0IHRoaXMuCi0KLVdlZCBKdWwgMTkgMDI6MzY6NDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogaW50bC1jb21wYXQuYyAodGV4dGRvbWFpbik6IENvcnJlY3QgdHlwby4KLQotV2VkIEp1bCAxOSAwMTo1MTozNSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBkY2dldHRleHQuYyAoZGNnZXR0ZXh0KTogRnVuY3Rpb24gbm93IGNhbGxlZCBfX2RjZ2V0dGV4dC4KLQotCSogZGdldHRleHQuYyAoZGdldHRleHQpOiBOb3cgY2FsbGVkIF9fZGdldHRleHQgYW5kIGNhbGxzCi0gCV9fZGNnZXR0ZXh0LgotCi0JKiBnZXR0ZXh0LmMgKGdldHRleHQpOgotCUZ1bmN0aW9uIG5vdyBjYWxsZWQgX19nZXR0ZXh0IGFuZCBjYWxscyBfX2RnZXR0ZXh0LgotCi0JKiB0ZXh0ZG9tYWluLmMgKHRleHRkb21haW4pOiBGdW5jdGlvbiBub3cgY2FsbGVkIF9fdGV4dGRvbWFpbi4KLQotCSogYmluZHRleHRkb20uYyAoYmluZHRleHRkb21haW4pOiBGdW5jdGlvbiBub3cgY2FsbGVkCi0gCV9fYmluZHRleHRkb21haW4uCi0KLQkqIGludGwtY29tcGF0LmM6IEluaXRpYWwgcmV2aXNpb24uCi0KLQkqIE1ha2VmaWxlLmluIChTT1VSQ0VTKTogQWRkIGludGwtY29tcGF0LmMuCi0JKE9CSkVDVFMpOiBXZSBhbHdheXMgY29tcGlsZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBmdW5jdGlvbnMuCi0gIAlPQkpFQ1RTIGNvbnRhaW5zIGFsbCBvYmplY3RzIGJ1dCBjYXQtY29tcGF0Lm8sIC4uL3BvL2NhdC1pZi10YmwubywKLSAJYW5kIGludGwtY29tcGF0Lm8uCi0gIAkoR0VUVE9CSlMpOiBDb250YWlucyBub3cgb25seSBpbnRsLWNvbXBhdC5vLgotCi0JKiBsaWJnZXR0ZXh0Lmg6Ci0JUmUtaW5jbHVkZSBwcm90ZWN0aW9uIG1hdGNoZXMgZHVhbGlzdGljIGNoYXJhY3RlciBvZiBsaWJnZXR0ZXh0LmguCi0JRm9yIGFsbCBmdW5jdGlvbnMgaW4gR05VIGdldHRleHQgbGlicmFyeSBkZWZpbmUgX18gY291bnRlciBwYXJ0LgotCi0JKiBmaW5kZG9tYWluLmMgKHN0cmNocik6IERlZmluZSBhcyBpbmRleCBpZiBub3QgZm91bmQgaW4gQyBsaWJyYXJ5LgotCShfbmxfZmluZF9kb21haW4pOiBGb3IgcmVsYXRpdmUgcGF0aHMgcGFzdGUgLyBpbiBiZXR3ZWVuLgotCi1UdWUgSnVsIDE4IDE2OjM3OjQ1IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvYWRtc2djYXQuYywgZmluZGRvbWFpbi5jOiBBZGQgaW5jbHVzaW9uIG9mIHN5cy90eXBlcy5oLgotCi0JKiB4b3Blbi1tc2cuc2VkOiBGaXggYnVnIHdpdGggYG1zZ3N0ciAiIicgbGluZXMuCi0JQSBsaXR0bGUgYml0IGJldHRlciBjb21tZW50cy4KLQotVHVlIEp1bCAxOCAwMToxODoyNyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbjoKLQlwby1tb2RlLmVsLCBtYWtlbGlua3MsIGNvbWJpbmUtc2ggYXJlIG5vdyBmb3VuZCBpbiAuLi9taXNjLgotCi0JKiBwby1tb2RlLmVsLCBtYWtlbGlua3MsIGNvbWJpbmUtc2gsIGVsaXNwLWNvbXA6Ci0JTW92ZWQgdG8gLi4vbWlzYy8uCi0KLQkqIGxpYmdldHRleHQuaCwgZ2V0dGV4dFAuaCwgZ2V0dGV4dC5oOiBVbmlmb3JtIHRlc3QgZm9yIF9fU1REQ19fLgotCi1TdW4gSnVsIDE2IDIyOjMzOjAyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMLCBJTlNUQUxMX0RBVEEpOiBOZXcgdmFyaWFibGVzLgotCShpbnN0YWxsLWRhdGEsIHVuaW5zdGFsbCk6IEluc3RhbGwvdW5pbnN0YWxsIC5lbGMgZmlsZS4KLQotCSogcG8tbW9kZS5lbCAoSW5zdGFsbGF0aW9uIGNvbW1lbnQpOgotCUFkZCAucG94IGFzIHBvc3NpYmxlIGV4dGVuc2lvbiBvZiAucG8gZmlsZXMuCi0KLVN1biBKdWwgMTYgMTM6MjM6MjcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZWxpc3AtY29tcDogQ29tcGxldGUgbmV3IHZlcnNpb24gYnkgRnJhbmMsb2lzOiBUaGlzIGRvZXMgbm90Ci0gCWZhaWwgd2hlbiBub3QgY29tcGlsaW5nIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgotCi1TdW4gSnVsIDE2IDAwOjEyOjE3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluICguLi9wby9jYXQtaWQtdGJsLm8pOgotCVVzZSAkKE1BS0UpIGluc3RlYWQgb2YgbWFrZSBmb3IgcmVjdXJzaXZlIG1ha2UuCi0KLQkqIE1ha2VmaWxlLmluICguZWwuZWxjKTogVXNlICQoU0hFTEwpIGluc3RlYWQgb2YgL2Jpbi9zaC4KLQkoaW5zdGFsbC1leGVjKTogQWRkIG1pc3NpbmcgZHVtbXkgZ29hbC4KLQkoaW5zdGFsbC1kYXRhLCB1bmluc3RhbGwpOiBAIGluIG11bHRpLWxpbmUgc2hlbGwgY29tbWFuZCBhdAotIAliZWdpbm5pbmcsIG5vdCBpbiBmcm9udCBvZiBlY2hvLiAgUmVwb3J0ZWQgYnkgRXJpYyBCYWNrdXMuCi0KLVNhdCBKdWwgMTUgMDA6MjE6MjggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6Ci0JUmVuYW1lIGxpYmdldHRleHQucGVybCB0byBnZXR0ZXh0LnBlcmwgdG8gZml0IGluIDE0IGNoYXJzCi0JZmlsZSBzeXN0ZW1zLgotCi0JKiBnZXR0ZXh0LnBlcmw6Ci0gCVJlbmFtZSB0byBnZXR0ZXh0LnBlcmwgdG8gZml0IGluIDE0IGNoYXJzIGZpbGUgc3lzdGVtcy4KLQotVGh1IEp1bCAxMyAyMzoxNzoyMCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBjYXQtY29tcGF0LmM6IElmICFTVERDX0hFQURFUlMgdHJ5IHRvIGluY2x1ZGUgbWFsbG9jLmguCi0KLVRodSBKdWwgMTMgMjA6NTU6MDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogcG8ydGJsLnNlZC5pbjogUHJldHR5IHByaW50aW5nLgotCi0JKiBsaW51eC1tc2cuc2VkLCB4b3Blbi1tc2cuc2VkOgotCUNvcnJlY3QgYnVncyB3aXRoIGhhbmRsaW5nIHN1YnN0aXR1dGUgZmxhZ3MgaW4gYnJhbmNoZXMuCi0KLQkqIGhhc2gtc3RyaW5nLmggKGhhc2hfc3RyaW5nKToKLQlPbGQgSyZSIGNvbXBpbGVycyBkb24ndCB1bmRlciBzdGFuZCBgdW5zaWduZWQgY2hhcicuCi0KLQkqIGdldHRleHQuaCAobmxzX3VpbnQzMik6Ci0JU29tZSBvbGQgSyZSIGNvbXBpbGVycyAoZWcgSFApIGRvbid0IHVuZGVyc3RhbmQgYHVuc2lnbmVkIGludCcuCi0KLQkqIGNhdC1jb21wYXQuYyAobXNnX3RvX2NhdF9pZCk6IERlLUFOU0ktZnkgcHJvdG90eXBlcy4KLQotVGh1IEp1bCAxMyAwMTozNDozMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRUxDRklMRVMpOiBOZXcgdmFyaWFibGUuCi0JKERJU1RGSUxFUyk6IEFkZCBlbGlzcC1jb21wLgotCUFkZCBpbXBsaWNpdCBydWxlIGZvciAuZWwgLT4gLmVsYyBjb21waWxhdGlvbi4KLQkoaW5zdGFsbC1kYXRhKTogaW5zdGFsbCAkRUxDRklMRVMKLQkoY2xlYW4pOiByZW5hbWVkIHBvLXRvLXRibCBhbmQgcG8tdG8tbXNnIHRvIHBvMnRibCBhbmQgcG8ybXNnIHJlc3AuCi0KLQkqIGVsaXNwLWNvbXA6IEluaXRpYWwgcmV2aXNpb24KLQotV2VkIEp1bCAxMiAxNjoxNDo1MiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbjoKLQljYXQtaWQtdGJsLmMgaXMgbm93IGZvdW5kIGluIHBvLy4gIFRoaXMgZW5hYmxlcyB1cyB0byB1c2UgYW4gaWRlbnRpY2FsCi0JaW50bC8gZGlyZWN0b3J5IGluIGFsbCBwYWNrYWdlcy4KLQotCSogZGNnZXR0ZXh0LmMgKGRjZ2V0dGV4dCk6IGhhc2hpbmcgZG9lcyBub3Qgd29yayBmb3IgdGFibGUgc2l6ZSA8PSAyLgotCi0JKiB0ZXh0ZG9tYWluLmM6IGZpeCB0eXBvICgjaWYgZGVmIC0+ICNpZiBkZWZpbmVkKQotCi1UdWUgSnVsIDExIDE4OjQ0OjQzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1jYXQtaWQpOiB1c2UgdG9wX3NyY2RpciB0byBhZGRyZXNzIHNvdXJjZSBmaWxlcwotCShESVNURklMRVMsZGlzdGNsZWFuKTogbW92ZSB0dXBkYXRlLnBlcmwgdG8gc3JjLwotCi0JKiBwby10by10Ymwuc2VkLmluOgotCWFkZCBhZGRpdGlvbmFsIGp1bXAgdG8gY2xlYXIgY2hhbmdlIGZsYWcgdG8gcmVjb2duaXplIG11bHRpbGluZSBzdHJpbmdzCi0KLVR1ZSBKdWwgMTEgMDE6MzI6NTAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogdGV4dGRvbWFpbi5jOiBQcm90ZWN0IGluY2x1c2lvbiBvZiBzdGRsaWIuaCBhbmQgc3RyaW5nLmguCi0KLQkqIGxvYWRtc2djYXQuYzogUHJvdGVjdCBpbmNsdXNpb24gb2Ygc3RkbGliLmguCi0KLQkqIGxpYmdldHRleHQuaDogUHJvdGVjdCBpbmNsdXNpb24gb2YgbG9jYWxlLmguCi0JQWxsb3cgdXNlIGluIEMrKyBwcm9ncmFtcy4KLQlEZWZpbmUgTlVMTCBpcyBub3QgaGFwcGVuZWQgYWxyZWFkeS4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6IHNoaXAgcG8tdG8tdGJsLnNlZC5pbiBpbnN0ZWFkIG9mCi0JcG8tdG8tdGJsLnNlZC4KLQkoZGlzdGNsZWFuKTogcmVtb3ZlIHBvLXRvLXRibC5zZWQgYW5kIHR1cGRhdGUucGVybC4KLQotCSogdHVwZGF0ZS5wZXJsLmluOiBTdWJzdGl0dXRlIFBlcmwgcGF0aCBldmVuIGluIGV4ZWMgbGluZS4KLQlEb24ndCBpbmNsdWRlIGVudHJpZXMgd2l0aG91dCB0cmFuc2xhdGlvbiBmcm9tIG9sZCAucG8gZmlsZS4KLQotVHVlIEp1bCAgNCAwMDo0MTo1MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiB0dXBkYXRlLnBlcmwuaW46IHVzZSAiVXBkYXRlZDogIiBpbiBtc2dpZCAiIi4KLQotCSogY2F0LWNvbXBhdC5jOiBGaXggdHlwbyAoTE9DQUxESVIgLT4gTE9DQUxFRElSKS4KLSAJRGVmaW5lIGdldGVudiBpZiAhX19TVERDX18uCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6IFByb3RlY3Qgc3RkbGliLmggYW5kIHN0cmluZy5oIGluY2x1c2lvbi4KLSAJRGVmaW5lIGZyZWUgaWYgIV9fU1REQ19fLgotCi0JKiBmaW5kZG9tYWluLmM6IENoYW5nZSBERUZfTVNHX0RPTV9ESVIgdG8gTE9DQUxFRElSLgotIAlEZWZpbmUgZnJlZSBpZiAhX19TVERDX18uCi0KLQkqIGNhdC1jb21wYXQuYzogQ2hhbmdlIERFRl9NU0dfRE9NX0RJUiB0byBMT0NBTEVESVIuCi0KLU1vbiBKdWwgIDMgMjM6NTY6MzAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW46IFVzZSBMT0NBTEVESVIgaW5zdGVhZCBvZiBERUZfTVNHX0RPTV9ESVIuCi0JUmVtb3ZlIHVubmVlZGVkICQoc3JjZGlyKSBmcm9tIE1ha2VmaWxlLmluIGRlcGVuZGVuY3kuCi0KLQkqIG1ha2VsaW5rczogQWRkIGNvcHlyaWdodCBhbmQgc2hvcnQgZGVzY3JpcHRpb24uCi0KLQkqIHBvLW1vZGUuZWw6IExhc3QgdmVyc2lvbiBmb3IgMC43LgotCi0JKiB0dXBkYXRlLnBlcmwuaW46IEZpeCBkaWUgbWVzc2FnZS4KLQotCSogZGNnZXR0ZXh0LmM6IFByb3RlY3QgaW5jbHVkZSBvZiBzdHJpbmcuaC4KLQotCSogZ2V0dGV4dC5jOiBQcm90ZWN0IGluY2x1ZGUgb2Ygc3RkbGliLmggYW5kIGZ1cnRoZXIgdHJpZXMgdG8gZ2V0IE5VTEwuCi0KLQkqIGZpbmRkb21haW4uYzogU29tZSBjb3JyZWN0aW9ucyBpbiBpbmNsdWRlcy4KLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogUHJ1bmUgbGlzdCBjb3JyZWN0IHBhdGggdG8gTWFrZWZpbGUuaW4uCi0KLQkqIHBvLXRvLXRibC5zZWQ6IEFkb3B0IGZvciBuZXcgLnBvIGZpbGUgZm9ybWF0LgotCi0JKiBsaW51eC1tc2cuc2VkLCB4b3Blbi1tc2cuc2VkOiBBZG9wdCBmb3IgbmV3IC5wbyBmaWxlIGZvcm1hdC4KLQotU3VuIEp1bCAgMiAyMzo1NTowMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiB0dXBkYXRlLnBlcmwuaW46IENvbXBsZXRlIHJld3JpdGUgZm9yIG5ldyAucG8gZmlsZSBmb3JtYXQuCi0KLVN1biBKdWwgIDIgMDI6MDY6NTAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogRmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZS4gIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGFsbCB0aGUgY29kZQotCW5lZWRlZCB0byBpbnRlcm5hdGlvbmFsaXplIG93biBwYWNrYWdlcy4gIEl0IHByb3ZpZGVzIGZ1bmN0aW9ucwotCXdoaWNoIGFsbG93IHRvIHVzZSB0aGUgWC9PcGVuIGNhdGdldHMgZnVuY3Rpb24gd2l0aCBhbiBpbnRlcmZhY2UKLQlsaWtlIHRoZSBVbmlmb3J1bSBnZXR0ZXh0IGZ1bmN0aW9uLiAgRm9yIHN5c3RlbSB3aGljaCBkb2VzIG5vdAotCWhhdmUgbmVpdGhlciBvZiB0aG9zZSBhIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkLgpkaWZmIC0tZ2l0IGEvaW50bC9NYWtlZmlsZS5pbiBiL2ludGwvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjQ3ZGUuLjAwMDAwMDAKLS0tIGEvaW50bC9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBkaXJlY3Rvcnkgd2l0aCBtZXNzYWdlIGNhdGFsb2cgaGFuZGxpbmcgaW4gR05VIE5MUyBVdGlsaXRpZXMuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLXRvcF9idWlsZGRpciA9IC4uCi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotbGliZGlyID0gJChleGVjX3ByZWZpeCkvbGliCi1pbmNsdWRlZGlyID0gJChwcmVmaXgpL2luY2x1ZGUKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSBAZGF0YWRpckAvZ2V0dGV4dC9pbnRsCi1hbGlhc3BhdGggPSAkKGxvY2FsZWRpcik6Lgotc3ViZGlyID0gaW50bAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1sID0gQGxACi0KLUFSID0gYXIKLUNDID0gQENDQAotTElCVE9PTCA9IEBMSUJUT09MQAotUkFOTElCID0gQFJBTkxJQkAKLQotREVGUyA9IC1ETE9DQUxFRElSPVwiJChsb2NhbGVkaXIpXCIgLURHTlVMT0NBTEVESVI9XCIkKGdudWxvY2FsZWRpcilcIiBcCi0tRExPQ0FMRV9BTElBU19QQVRIPVwiJChhbGlhc3BhdGgpXCIgQERFRlNACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLUhFQURFUlMgPSAkKENPTUhEUlMpIGxpYmdldHRleHQuaCBsb2FkaW5mby5oCi1DT01IRFJTID0gZ2V0dGV4dC5oIGdldHRleHRQLmggaGFzaC1zdHJpbmcuaAotU09VUkNFUyA9ICQoQ09NU1JDUykgaW50bC1jb21wYXQuYyBjYXQtY29tcGF0LmMKLUNPTVNSQ1MgPSBiaW5kdGV4dGRvbS5jIGRjZ2V0dGV4dC5jIGRnZXR0ZXh0LmMgZ2V0dGV4dC5jIFwKLWZpbmRkb21haW4uYyBsb2FkbXNnY2F0LmMgbG9jYWxlYWxpYXMuYyB0ZXh0ZG9tYWluLmMgbDEwbmZsaXN0LmMgXAotZXhwbG9kZW5hbWUuYwotT0JKRUNUUyA9IEBJTlRMT0JKU0AgYmluZHRleHRkb20uJGxvIGRjZ2V0dGV4dC4kbG8gZGdldHRleHQuJGxvIGdldHRleHQuJGxvIFwKLWZpbmRkb21haW4uJGxvIGxvYWRtc2djYXQuJGxvIGxvY2FsZWFsaWFzLiRsbyB0ZXh0ZG9tYWluLiRsbyBsMTBuZmxpc3QuJGxvIFwKLWV4cGxvZGVuYW1lLiRsbwotQ0FUT0JKUyA9IGNhdC1jb21wYXQuJGxvIC4uL3BvL2NhdC1pZC10YmwuJGxvCi1HRVRUT0JKUyA9IGludGwtY29tcGF0LiRsbwotRElTVEZJTEVTLmNvbW1vbiA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbiBsaW51eC1tc2cuc2VkIHBvMnRibC5zZWQuaW4gXAoteG9wZW4tbXNnLnNlZCAkKEhFQURFUlMpICQoU09VUkNFUykKLURJU1RGSUxFUy5ub3JtYWwgPSBWRVJTSU9OCi1ESVNURklMRVMuZ2V0dGV4dCA9IGxpYmludGwuZ2xpYmMgaW50bGguaW5zdC5pbgotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5sbwotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJDwKLQotSU5DTFVERVMgPSAtSS4gLUkkKHNyY2RpcikKLQotYWxsOiBhbGwtQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotCi1hbGwteWVzOiBsaWJpbnRsLiRsYSBpbnRsaC5pbnN0Ci1hbGwtbm86Ci1pbnN0YWxsLWluZm86Ci0KLWxpYmludGwuYTogJChPQkpFQ1RTKQotCXJtIC1mICRACi0JJChBUikgY3J1ICRAICQoT0JKRUNUUykKLQkkKFJBTkxJQikgJEAKLQotbGliaW50bC5sYTogJChPQkpFQ1RTKQotCSQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQykgJChMREZMQUdTKSAtbyAkQCAkKE9CSkVDVFMpIFwKLQkJICAgLXZlcnNpb24taW5mbyAxOjAgLXJwYXRoICQobGliZGlyKQotCi0uLi9wby9jYXQtaWQtdGJsLiRsbzogLi4vcG8vY2F0LWlkLXRibC5jICQodG9wX3NyY2RpcikvcG8vJChQQUNLQUdFKS5wb3QKLQljZCAuLi9wbyAmJiAkKE1BS0UpIGNhdC1pZC10YmwuJGxvCi0KLWNoZWNrOiBhbGwKLQotIyBUaGlzIGluc3RhbGxhdGlvbiBnb2FsIGlzIG9ubHkgdXNlZCBpbiBHTlUgZ2V0dGV4dC4gIFBhY2thZ2VzIHdoaWNoCi0jIG9ubHkgdXNlIHRoZSBsaWJyYXJ5IHNob3VsZCB1c2UgaW5zdGFsbCBpbnN0ZWFkLgotCi0jIFdlIG11c3Qgbm90IGluc3RhbGwgdGhlIGxpYmludGwuaC9saWJpbnRsLmEgZmlsZXMgaWYgd2UgYXJlIG9uIGEKLSMgc3lzdGVtIHdoaWNoIGhhcyB0aGUgZ2V0dGV4dCgpIGZ1bmN0aW9uIGluIGl0cyBDIGxpYnJhcnkgb3IgaW4gYQotIyBzZXBhcmF0ZSBsaWJyYXJ5IG9yIHVzZSB0aGUgY2F0Z2V0cyBpbnRlcmZhY2UuICBBIHNwZWNpYWwgY2FzZSBpcwotIyB3aGVyZSBjb25maWd1cmUgZm91bmQgYSBwcmV2aW91c2x5IGluc3RhbGxlZCBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotIyBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIG9uZSB3aGljaCBjb21lcyB3aXRoIHRoaXMgdmVyc2lvbiBvZiB0aGUKLSMgcGFja2FnZSwgeW91IGhhdmUgdG8gdXNlIGBjb25maWd1cmUgLS13aXRoLWluY2x1ZGVkLWdldHRleHQnLgotaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQotaW5zdGFsbC1leGVjOiBhbGwKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IiBcCi0JICAgJiYgdGVzdCAnQElOVExPQkpTQCcgPSAnJChHRVRUT0JKUyknOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChsaWJkaXIpICQoaW5jbHVkZWRpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChsaWJkaXIpICQoaW5jbHVkZWRpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgaW50bGguaW5zdCAkKGluY2x1ZGVkaXIpL2xpYmludGwuaDsgXAotCSAgJChJTlNUQUxMX0RBVEEpIGxpYmludGwuYSAkKGxpYmRpcikvbGliaW50bC5hOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi1pbnN0YWxsLWRhdGE6IGFsbAotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpIFZFUlNJT04gJChnZXR0ZXh0c3JjZGlyKS9WRVJTSU9OOyBcCi0JICBkaXN0cz0iJChESVNURklMRVMuY29tbW9uKSI7IFwKLQkgIGZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGZpbGUgJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JZGlzdHM9IiQoRElTVEZJTEVTLmNvbW1vbikiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKLQlkb25lCi0KLWluZm8gZHZpOgotCi0kKE9CSkVDVFMpOiBjb25maWcuaCBsaWJnZXR0ZXh0LmgKLWJpbmR0ZXh0ZG9tLiRsbyBmaW5kZG9tYWluLiRsbyBsb2FkbXNnY2F0LiRsbzogZ2V0dGV4dFAuaCBnZXR0ZXh0LmggbG9hZGluZm8uaAotZGNnZXR0ZXh0LiRsbzogZ2V0dGV4dFAuaCBnZXR0ZXh0LmggaGFzaC1zdHJpbmcuaCBsb2FkaW5mby5oCi0KLXRhZ3M6IFRBR1MKLQotVEFHUzogJChIRUFERVJTKSAkKFNPVVJDRVMpCi0JaGVyZT1gcHdkYDsgY2QgJChzcmNkaXIpICYmIGV0YWdzIC1vICQkaGVyZS9UQUdTICQoSEVBREVSUykgJChTT1VSQ0VTKQotCi1pZDogSUQKLQotSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKQotCWhlcmU9YHB3ZGA7IGNkICQoc3JjZGlyKSAmJiBta2lkIC1mJCRoZXJlL0lEICQoSEVBREVSUykgJChTT1VSQ0VTKQotCi0KLW1vc3RseWNsZWFuOgotCXJtIC1mICouYSAqLm8gKi5sbyBjb3JlIGNvcmUuKgotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIElEIFRBR1MgcG8ybXNnLnNlZCBwbzJ0Ymwuc2VkIGxpYmludGwuaCBjb25maWcubG9nCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi0KLSMgR05VIGdldHRleHQgbmVlZHMgbm90IGNvbnRhaW4gdGhlIGZpbGUgYFZFUlNJT04nIGJ1dCBjb250YWlucyBzb21lCi0jIG90aGVyIGZpbGVzIHdoaWNoIHNob3VsZCBub3QgYmUgZGlzdHJpYnV0ZWQgaW4gb3RoZXIgcGFja2FnZXMuCi1kaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQotZGlzdCBkaXN0ZGlyOiBNYWtlZmlsZSAkKERJU1RGSUxFUykKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9IGdldHRleHQ7IHRoZW4gXAotCSAgYWRkaXRpb25hbD0iJChESVNURklMRVMuZ2V0dGV4dCkiOyBcCi0JZWxzZSBcCi0JICBhZGRpdGlvbmFsPSIkKERJU1RGSUxFUy5ub3JtYWwpIjsgXAotCWZpOyBcCi0JZm9yIGZpbGUgaW4gJChESVNURklMRVMuY29tbW9uKSAkJGFkZGl0aW9uYWw7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLWRpc3QtbGliYzoKLQl0YXIgemN2ZiBpbnRsLWdsaWJjLnRhci5neiAkKENPTVNSQ1MpICQoQ09NSERSUykgbGliaW50bC5oLmdsaWJjCi0KLU1ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCi0JQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUaGUgZGVwZW5kZW5jeSBmb3IgaW50bGguaW5zdCBpcyBkaWZmZXJlbnQgaW4gZ2V0dGV4dCBhbmQgYWxsIG90aGVyCi0jIHBhY2thZ2VzLiAgQmVjYXVzZSB3ZSBjYW5ub3QgeW91IEdOVSBtYWtlIGZlYXR1cmVzIHdlIGhhdmUgdG8gc29sdmUKLSMgdGhlIHByb2JsZW0gd2hpbGUgcmV3cml0aW5nIE1ha2VmaWxlLmluLgotQEdUX1lFU0BpbnRsaC5pbnN0OiBpbnRsaC5pbnN0LmluIC4uL2NvbmZpZy5zdGF0dXMKLUBHVF9ZRVNACWNkIC4uIFwKLUBHVF9ZRVNACSYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9IFwKLUBHVF9ZRVNACSAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi1AR1RfTk9ALlBIT05ZOiBpbnRsaC5pbnN0Ci1AR1RfTk9AaW50bGguaW5zdDoKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvaW50bC9hY2NvbmZpZy5oIGIvaW50bC9hY2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGY4MWY4Li4wMDAwMDAwCi0tLSBhL2ludGwvYWNjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfQ0FUR0VUUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKZGlmZiAtLWdpdCBhL2ludGwvYWNsb2NhbC5tNCBiL2ludGwvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1NDM5Zi4uMDAwMDAwMAotLS0gYS9pbnRsL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjMKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci1kbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgotCi1BQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAotW0FDX1BSRVJFUShbMi4xMl0pCi1BQ19DT05GSUdfSEVBREVSKFskMV0pCi1kbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLWRubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLWRubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCi1kbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCi1BQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCi1pZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCi08PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAotPDxhbV9pbmR4PTEKLWZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KLSAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgotICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgotICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4Ci0gICAgOzsKLSAgZXNhYwotICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKLWRvbmU8PD4+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9QUk9HX0lOU1RBTEwsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLUFDX1NVQlNUKElOU1RBTExfU0NSSVBUKWRubAotXSkKLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotQUNfREVGVU4oQ1lfV0lUSF9OTFMsCi0gIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKLSAgICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAotICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKLSAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICAgIEFDX1NVQlNUKFVTRV9OTFMpCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUykKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhUKQotCSAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JCVt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbm8pZG5sCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlBQ19DSEVDS19GVU5DUyhkY2dldHRleHQpCi0JCUFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotCQlBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0JCUFDX1RSWV9MSU5LKCwgW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cl0sCi0JCSAgW0NBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlXSwKLQkJICBbQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWJdKQotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JXSkKLQotCWRubCBJbiB0aGUgc3RhbmRhcmQgZ2V0dGV4dCwgd2Ugd291bGQgbm93IGNoZWNrIGZvciBjYXRnZXRzLgotICAgICAgICBkbmwgSG93ZXZlciwgd2UgbmV2ZXIgd2FudCB0byB1c2UgY2F0Z2V0cyBmb3Igb3VyIHJlbGVhc2VzLgotCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICBkbmwgTmVpdGhlciBnZXR0ZXh0IG5vciBjYXRnZXRzIGluIGluY2x1ZGVkIGluIHRoZSBDIGxpYnJhcnkuCi0JICBkbmwgRmFsbCBiYWNrIG9uIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0JICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KLSAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbXNnZm10KQotICAgICAgICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0gICAgICAgIEFDX1NVQlNUKE1TR0ZNVCkKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCi0gICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCWRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKLQlkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgotCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIEFDX01TR19SRVNVTFQoCi0JICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICBkbmwgVGhlc2UgcnVsZXMgYXJlIHNvbGVseSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBnb2FsLiAgV2hpbGUgZG9pbmcgdGhpcwotICAgIGRubCB3ZSBvbmx5IGhhdmUgdG8ga2VlcCBleGFjdGx5IG9uZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgY2F0YWxvZ3MKLSAgICBkbmwgaW4gY29uZmlndXJlLmluLgotICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCi0gICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCi0gICAgQUNfU1VCU1QoQ0FUQUxPR1MpCi0gICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQotICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQotICAgIEFDX1NVQlNUKEdNT0ZJTEVTKQotICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCi0gICAgQUNfU1VCU1QoSU5UTERFUFMpCi0gICAgQUNfU1VCU1QoSU5UTExJQlMpCi0gICAgQUNfU1VCU1QoSU5UTE9CSlMpCi0gICAgQUNfU1VCU1QoUE9GSUxFUykKLSAgICBBQ19TVUJTVChQT1NVQikKLSAgXSkKLQotQUNfREVGVU4oQ1lfR05VX0dFVFRFWFQsCi0gIFtBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX01NQVBdKWRubAotCi0gICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaF0pCi0gICBBQ19DSEVDS19GVU5DUyhbZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dF0pCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5KQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIEFDX0RFRklORShIQVZFX1NUUENQWSkKLSAgIGZpCi0KLSAgIEFNX0xDX01FU1NBR0VTCi0gICBDWV9XSVRIX05MUwotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkKQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgQUNfTVNHX1JFU1VMVCgkTElOR1VBUykKLSAgICAgZmkKLQotICAgICBkbmwgQ29uc3RydWN0IGxpc3Qgb2YgbmFtZXMgb2YgY2F0YWxvZyBmaWxlcyB0byBiZSBjb25zdHJ1Y3RlZC4KLSAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgZG5sIFRoZSByZWZlcmVuY2UgdG8gPGxvY2FsZS5oPiBpbiB0aGUgaW5zdGFsbGVkIDxsaWJpbnRsLmg+IGZpbGUKLSAgIGRubCBtdXN0IGJlIHJlc29sdmVkIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdCB0aGUgdXNlcnMgb2YgdGhpcwotICAgZG5sIHRvIGRlZmluZSBIQVZFX0xPQ0FMRV9ILgotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICBBQ19TVUJTVChJTkNMVURFX0xPQ0FMRV9IKQotCi0gICBkbmwgRGV0ZXJtaW5lIHdoaWNoIGNhdGFsb2cgZm9ybWF0IHdlIGhhdmUgKGlmIGFueSBpcyBuZWVkZWQpCi0gICBkbmwgRm9yIG5vdyB3ZSBrbm93IGFib3V0IHR3byBkaWZmZXJlbnQgZm9ybWF0czoKLSAgIGRubCAgIExpbnV4IGxpYmMtNSBhbmQgdGhlIG5vcm1hbCBYL09wZW4gZm9ybWF0Ci0gICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgbXNnZm9ybWF0PWxpbnV4LCBtc2dmb3JtYXQ9eG9wZW4pCi0KLQkgZG5sIFRyYW5zZm9ybSB0aGUgU0VEIHNjcmlwdHMgd2hpbGUgY29weWluZyBiZWNhdXNlIHNvbWUgZHVtYiBTRURzCi0gICAgICAgICBkbmwgY2Fubm90IGhhbmRsZSBjb21tZW50cy4KLQkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgZG5sIHBvMnRibC5zZWQgaXMgYWx3YXlzIG5lZWRlZC4KLSAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICBkbmwgSW4gdGhlIGludGwvTWFrZWZpbGUuaW4gd2UgaGF2ZSBhIHNwZWNpYWwgZGVwZW5kZW5jeSB3aGljaCBtYWtlcwotICAgZG5sIG9ubHkgc2Vuc2UgZm9yIGdldHRleHQuICBXZSBjb21tZW50IHRoaXMgb3V0IGZvciBub24tZ2V0dGV4dAotICAgZG5sIHBhY2thZ2VzLgotICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIEFDX1NVQlNUKEdUX05PKQotICAgQUNfU1VCU1QoR1RfWUVTKQotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQotCi0gICBkbmwgKioqIEZvciBub3cgdGhlIGxpYnRvb2wgc3VwcG9ydCBpbiBpbnRsL01ha2VmaWxlIGlzIG5vdCBmb3IgcmVhbC4KLSAgIGw9Ci0gICBBQ19TVUJTVChsKQotCi0gICBkbmwgR2VuZXJhdGUgbGlzdCBvZiBmaWxlcyB0byBiZSBwcm9jZXNzZWQgYnkgeGdldHRleHQgd2hpY2ggd2lsbAotICAgZG5sIGJlIGluY2x1ZGVkIGluIHBvL01ha2VmaWxlLiAgQnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgcG8gZGlyZWN0b3J5Ci0gICBkbmwgZXhpc3RzIGluIHNyY2Rpci4KLSAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICBdKQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1kbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCi1kbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCi1BQ19ERUZVTihBTV9QQVRIX1BST0dfV0lUSF9URVNULAotWyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKLUFDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAotW2Nhc2UgIlskXSQxIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgWyQzXTsgdGhlbgotCWFjX2N2X3BhdGhfJDE9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWRubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCi1kbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KLWlmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCi1dKWRubAotICA7OwotZXNhY10pZG5sCi0kMT0iJGFjX2N2X3BhdGhfJDEiCi1pZiB0ZXN0IC1uICJbJF0kMSI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVChbJF0kMSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1BQ19TVUJTVCgkMSlkbmwKLV0pCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTENfTUVTU0FHRVMsCi0gIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAotICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCi0gICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCi0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUykKLSAgICBmaQotICBmaV0pCi0KZGlmZiAtLWdpdCBhL2ludGwvYmluZHRleHRkb20uYyBiL2ludGwvYmluZHRleHRkb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZjYjhkOS4uMDAwMDAwMAotLS0gYS9pbnRsL2JpbmR0ZXh0ZG9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGJpbmR0ZXh0ZG9tYWluKDMpIGZ1bmN0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLXZvaWQgZnJlZSAoKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKLSNlbmRpZgotI2luY2x1ZGUgImdldHRleHQuaCIKLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXTsKLQotLyogTGlzdCB3aXRoIGJpbmRpbmdzIG9mIHNwZWNpZmljIGRvbWFpbnMuICAqLwotZXh0ZXJuIHN0cnVjdCBiaW5kaW5nICpfbmxfZG9tYWluX2JpbmRpbmdzOwotCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgQklORFRFWFRET01BSU4gX19iaW5kdGV4dGRvbWFpbgotIyBkZWZpbmUgc3RyZHVwKHN0cikgX19zdHJkdXAgKHN0cikKLSNlbHNlCi0jIGRlZmluZSBCSU5EVEVYVERPTUFJTiBiaW5kdGV4dGRvbWFpbl9fCi0jZW5kaWYKLQotLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCi0gICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCi1jaGFyICoKLUJJTkRURVhURE9NQUlOIChkb21haW5uYW1lLCBkaXJuYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICpkaXJuYW1lOwotewotICBzdHJ1Y3QgYmluZGluZyAqYmluZGluZzsKLQotICAvKiBTb21lIHNhbml0eSBjaGVja3MuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMIHx8IGRvbWFpbm5hbWVbMF0gPT0gJ1wwJykKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKLSAgICAgIGlmIChjb21wYXJlID09IDApCi0JLyogV2UgZm91bmQgaXQhICAqLwotCWJyZWFrOwotICAgICAgaWYgKGNvbXBhcmUgPCAwKQotCXsKLQkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0JICBiaW5kaW5nID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGRpcm5hbWUgPT0gTlVMTCkKLSAgICAvKiBUaGUgY3VycmVudCBiaW5kaW5nIGhhcyBiZSB0byByZXR1cm5lZC4gICovCi0gICAgcmV0dXJuIGJpbmRpbmcgPT0gTlVMTCA/IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWUgOiBiaW5kaW5nLT5kaXJuYW1lOwotCi0gIGlmIChiaW5kaW5nICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhlIGRvbWFpbiBpcyBhbHJlYWR5IGJvdW5kLiAgSWYgdGhlIG5ldyB2YWx1ZSBhbmQgdGhlIG9sZAotCSBvbmUgYXJlIGVxdWFsIHdlIHNpbXBseSBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlIHJlcGxhY2UgdGhlCi0JIG9sZCBiaW5kaW5nLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGRpcm5hbWUsIGJpbmRpbmctPmRpcm5hbWUpICE9IDApCi0JewotCSAgY2hhciAqbmV3X2Rpcm5hbWU7Ci0KLQkgIGlmIChzdHJjbXAgKGRpcm5hbWUsIF9ubF9kZWZhdWx0X2Rpcm5hbWUpID09IDApCi0JICAgIG5ld19kaXJuYW1lID0gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZTsKLQkgIGVsc2UKLQkgICAgewotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotCSAgICAgIG5ld19kaXJuYW1lID0gc3RyZHVwIChkaXJuYW1lKTsKLQkgICAgICBpZiAobmV3X2Rpcm5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0jZWxzZQotCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKLQkgICAgICBuZXdfZGlybmFtZSA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLQkgICAgICBpZiAobmV3X2Rpcm5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkgICAgICBtZW1jcHkgKG5ld19kaXJuYW1lLCBkaXJuYW1lLCBsZW4pOwotI2VuZGlmCi0JICAgIH0KLQotCSAgaWYgKGJpbmRpbmctPmRpcm5hbWUgIT0gX25sX2RlZmF1bHRfZGlybmFtZSkKLQkgICAgZnJlZSAoYmluZGluZy0+ZGlybmFtZSk7Ci0KLQkgIGJpbmRpbmctPmRpcm5hbWUgPSBuZXdfZGlybmFtZTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgYmluZGluZy4gICovCi0gICAgICBzaXplX3QgbGVuOwotICAgICAgc3RydWN0IGJpbmRpbmcgKm5ld19iaW5kaW5nID0KLQkoc3RydWN0IGJpbmRpbmcgKikgbWFsbG9jIChzaXplb2YgKCpuZXdfYmluZGluZykpOwotCi0gICAgICBpZiAobmV3X2JpbmRpbmcgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotICAgICAgbmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPSBzdHJkdXAgKGRvbWFpbm5hbWUpOwotICAgICAgaWYgKG5ld19iaW5kaW5nLT5kb21haW5uYW1lID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0jZWxzZQotICAgICAgbGVuID0gc3RybGVuIChkb21haW5uYW1lKSArIDE7Ci0gICAgICBuZXdfYmluZGluZy0+ZG9tYWlubmFtZSA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLSAgICAgIGlmIChuZXdfYmluZGluZy0+ZG9tYWlubmFtZSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgICAgbWVtY3B5IChuZXdfYmluZGluZy0+ZG9tYWlubmFtZSwgZG9tYWlubmFtZSwgbGVuKTsKLSNlbmRpZgotCi0gICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCBfbmxfZGVmYXVsdF9kaXJuYW1lKSA9PSAwKQotCW5ld19iaW5kaW5nLT5kaXJuYW1lID0gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0JICBuZXdfYmluZGluZy0+ZGlybmFtZSA9IHN0cmR1cCAoZGlybmFtZSk7Ci0JICBpZiAobmV3X2JpbmRpbmctPmRpcm5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0jZWxzZQotCSAgbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7Ci0JICBuZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLQkgIGlmIChuZXdfYmluZGluZy0+ZGlybmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQkgIG1lbWNweSAobmV3X2JpbmRpbmctPmRpcm5hbWUsIGRpcm5hbWUsIGxlbik7Ci0jZW5kaWYKLQl9Ci0KLSAgICAgIC8qIE5vdyBlbnF1ZXVlIGl0LiAgKi8KLSAgICAgIGlmIChfbmxfZG9tYWluX2JpbmRpbmdzID09IE5VTEwKLQkgIHx8IHN0cmNtcCAoZG9tYWlubmFtZSwgX25sX2RvbWFpbl9iaW5kaW5ncy0+ZG9tYWlubmFtZSkgPCAwKQotCXsKLQkgIG5ld19iaW5kaW5nLT5uZXh0ID0gX25sX2RvbWFpbl9iaW5kaW5nczsKLQkgIF9ubF9kb21haW5fYmluZGluZ3MgPSBuZXdfYmluZGluZzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7Ci0JICB3aGlsZSAoYmluZGluZy0+bmV4dCAhPSBOVUxMCi0JCSAmJiBzdHJjbXAgKGRvbWFpbm5hbWUsIGJpbmRpbmctPm5leHQtPmRvbWFpbm5hbWUpID4gMCkKLQkgICAgYmluZGluZyA9IGJpbmRpbmctPm5leHQ7Ci0KLQkgIG5ld19iaW5kaW5nLT5uZXh0ID0gYmluZGluZy0+bmV4dDsKLQkgIGJpbmRpbmctPm5leHQgPSBuZXdfYmluZGluZzsKLQl9Ci0KLSAgICAgIGJpbmRpbmcgPSBuZXdfYmluZGluZzsKLSAgICB9Ci0KLSAgcmV0dXJuIGJpbmRpbmctPmRpcm5hbWU7Ci19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX2JpbmR0ZXh0ZG9tYWluLCBiaW5kdGV4dGRvbWFpbik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvY2F0LWNvbXBhdC5jIGIvaW50bC9jYXQtY29tcGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2N2Q5MDEuLjAwMDAwMDAKLS0tIGEvaW50bC9jYXQtY29tcGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyogQ29tcGF0aWJpbGl0eSBjb2RlIGZvciBnZXR0ZXh0LXVzaW5nLWNhdGdldHMgaW50ZXJmYWNlLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFNURENfSEVBREVSUwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotY2hhciAqZ2V0ZW52ICgpOwotIyBpZmRlZiBIQVZFX01BTExPQ19ICi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9OTF9UWVBFU19ICi0jIGluY2x1ZGUgPG5sX3R5cGVzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmdldHRleHQuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBYUEczIGRlZmluZXMgdGhlIHJlc3VsdCBvZiBgc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCknIGFzOgotICAgYGBEaXJlY3RzIGBzZXRsb2NhbGUoKScgdG8gcXVlcnkgYGNhdGVnb3J5JyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50Ci0gICAgIHNldHRpbmcgb2YgYGxvY2FsJy4nJwotICAgSG93ZXZlciBpdCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBleGFjdCBmb3JtYXQuICBBbmQgZXZlbiB3b3JzZTogUE9TSVgKLSAgIGRlZmluZXMgdGhpcyBub3QgYXQgYWxsLiAgU28gd2UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgb25seSBvbiBzZWxlY3RlZAotICAgc3lzdGVtIChlLmcuIHRob3NlIHVzaW5nIEdOVSBDIExpYnJhcnkpLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgSEFWRV9MT0NBTEVfTlVMTAotI2VuZGlmCi0KLS8qIFRoZSBjYXRhbG9nIGRlc2NyaXB0b3IuICAqLwotc3RhdGljIG5sX2NhdGQgY2F0YWxvZyA9IChubF9jYXRkKSAtMTsKLQotLyogTmFtZSBvZiB0aGUgZGVmYXVsdCBjYXRhbG9nLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyIGRlZmF1bHRfY2F0YWxvZ19uYW1lW10gPSAibWVzc2FnZXMiOwotCi0vKiBOYW1lIG9mIGN1cnJlbnRseSB1c2VkIGNhdGFsb2cuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmNhdGFsb2dfbmFtZSA9IGRlZmF1bHRfY2F0YWxvZ19uYW1lOwotCi0vKiBHZXQgSUQgZm9yIGdpdmVuIHN0cmluZy4gIElmIG5vdCBmb3VuZCByZXR1cm4gLTEuICAqLwotc3RhdGljIGludCBtc2dfdG9fY2F0X2lkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm1zZykpOwotCi0vKiBTdWJzdGl0dXRpb24gZm9yIHN5c3RlbXMgbGFja2luZyB0aGlzIGZ1bmN0aW9uIGluIHRoZWlyIEMgbGlicmFyeS4gICovCi0jaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKnN0cGNweSBQQVJBTVMgKChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpKTsKLSNlbmRpZgotCi0KLS8qIFNldCBjdXJyZW50bHkgdXNlZCBkb21haW4vY2F0YWxvZy4gICovCi1jaGFyICoKLXRleHRkb21haW4gKGRvbWFpbm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci17Ci0gIG5sX2NhdGQgbmV3X2NhdGFsb2c7Ci0gIGNoYXIgKm5ld19uYW1lOwotICBzaXplX3QgbmV3X25hbWVfbGVuOwotICBjaGFyICpsYW5nOwotCi0jaWYgZGVmaW5lZCBIQVZFX1NFVExPQ0FMRSAmJiBkZWZpbmVkIEhBVkVfTENfTUVTU0FHRVMgXAotICAgICYmIGRlZmluZWQgSEFWRV9MT0NBTEVfTlVMTAotICBsYW5nID0gc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgTlVMTCk7Ci0jZWxzZQotICBsYW5nID0gZ2V0ZW52ICgiTENfQUxMIik7Ci0gIGlmIChsYW5nID09IE5VTEwgfHwgbGFuZ1swXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIGxhbmcgPSBnZXRlbnYgKCJMQ19NRVNTQUdFUyIpOwotICAgICAgaWYgKGxhbmcgPT0gTlVMTCB8fCBsYW5nWzBdID09ICdcMCcpCi0JbGFuZyA9IGdldGVudiAoIkxBTkciKTsKLSAgICB9Ci0jZW5kaWYKLSAgaWYgKGxhbmcgPT0gTlVMTCB8fCBsYW5nWzBdID09ICdcMCcpCi0gICAgbGFuZyA9ICJDIjsKLQotICAvKiBTZWUgd2hldGhlciBuYW1lIG9mIGN1cnJlbnRseSB1c2VkIGRvbWFpbiBpcyBhc2tlZC4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIChjaGFyICopIGNhdGFsb2dfbmFtZTsKLQotICBpZiAoZG9tYWlubmFtZVswXSA9PSAnXDAnKQotICAgIGRvbWFpbm5hbWUgPSBkZWZhdWx0X2NhdGFsb2dfbmFtZTsKLQotICAvKiBDb21wdXRlIGxlbmd0aCBvZiBhZGRlZCBwYXRoIGVsZW1lbnQuICAqLwotICBuZXdfbmFtZV9sZW4gPSBzaXplb2YgKExPQ0FMRURJUikgLSAxICsgMSArIHN0cmxlbiAobGFuZykKLQkJICsgc2l6ZW9mICgiL0xDX01FU1NBR0VTLyIpIC0gMSArIHNpemVvZiAoUEFDS0FHRSkgLSAxCi0JCSArIHNpemVvZiAoIi5jYXQiKTsKLQotICBuZXdfbmFtZSA9IChjaGFyICopIG1hbGxvYyAobmV3X25hbWVfbGVuKTsKLSAgaWYgKG5ld19uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RyY3B5IChuZXdfbmFtZSwgUEFDS0FHRSk7Ci0gIG5ld19jYXRhbG9nID0gY2F0b3BlbiAobmV3X25hbWUsIDApOwotCi0gIGlmIChuZXdfY2F0YWxvZyA9PSAobmxfY2F0ZCkgLTEpCi0gICAgewotICAgICAgLyogTkxTUEFUSCBzZWFyY2ggZGlkbid0IHdvcmssIHRyeSBhYnNvbHV0ZSBwYXRoICovCi0gICAgICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzLyVzL0xDX01FU1NBR0VTLyVzLmNhdCIsIExPQ0FMRURJUiwgbGFuZywKLQkgICAgICAgUEFDS0FHRSk7Ci0gICAgICBuZXdfY2F0YWxvZyA9IGNhdG9wZW4gKG5ld19uYW1lLCAwKTsKLQotICAgICAgaWYgKG5ld19jYXRhbG9nID09IChubF9jYXRkKSAtMSkKLQl7Ci0JICBmcmVlIChuZXdfbmFtZSk7Ci0JICByZXR1cm4gKGNoYXIgKikgY2F0YWxvZ19uYW1lOwotCX0KLSAgICB9Ci0KLSAgLyogQ2xvc2Ugb2xkIGNhdGFsb2cuICAqLwotICBpZiAoY2F0YWxvZyAhPSAobmxfY2F0ZCkgLTEpCi0gICAgY2F0Y2xvc2UgKGNhdGFsb2cpOwotICBpZiAoY2F0YWxvZ19uYW1lICE9IGRlZmF1bHRfY2F0YWxvZ19uYW1lKQotICAgIGZyZWUgKChjaGFyICopIGNhdGFsb2dfbmFtZSk7Ci0KLSAgY2F0YWxvZyA9IG5ld19jYXRhbG9nOwotICBjYXRhbG9nX25hbWUgPSBuZXdfbmFtZTsKLQotICByZXR1cm4gKGNoYXIgKikgY2F0YWxvZ19uYW1lOwotfQotCi1jaGFyICoKLWJpbmR0ZXh0ZG9tYWluIChkb21haW5uYW1lLCBkaXJuYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICpkaXJuYW1lOwotewotI2lmIEhBVkVfU0VURU5WIHx8IEhBVkVfUFVURU5WCi0gIGNoYXIgKm9sZF92YWwsICpuZXdfdmFsLCAqY3A7Ci0gIHNpemVfdCBuZXdfdmFsX2xlbjsKLQotICAvKiBUaGlzIGRvZXMgbm90IG1ha2UgbXVjaCBzZW5zZSBoZXJlIGJ1dCB0byBiZSBjb21wYXRpYmxlIGRvIGl0LiAgKi8KLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDb21wdXRlIGxlbmd0aCBvZiBhZGRlZCBwYXRoIGVsZW1lbnQuICBJZiB3ZSB1c2Ugc2V0ZW52IHdlIGRvbid0IG5lZWQKLSAgICAgdGhlIGZpcnN0IGJ5dHMgZm9yIE5MU1BBVEg9LCBidXQgd2h5IGNvbXBsaWNhdGUgdGhlIGNvZGUgZm9yIHRoaXMKLSAgICAgcGVhbnV0cy4gICovCi0gIG5ld192YWxfbGVuID0gc2l6ZW9mICgiTkxTUEFUSD0iKSAtIDEgKyBzdHJsZW4gKGRpcm5hbWUpCi0JCSsgc2l6ZW9mICgiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOwotCi0gIG9sZF92YWwgPSBnZXRlbnYgKCJOTFNQQVRIIik7Ci0gIGlmIChvbGRfdmFsID09IE5VTEwgfHwgb2xkX3ZhbFswXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIG9sZF92YWwgPSBOVUxMOwotICAgICAgbmV3X3ZhbF9sZW4gKz0gMSArIHNpemVvZiAoTE9DQUxFRElSKSAtIDEKLQkgICAgICAgICAgICAgKyBzaXplb2YgKCIvJUwvTENfTUVTU0FHRVMvJU4uY2F0Iik7Ci0gICAgfQotICBlbHNlCi0gICAgbmV3X3ZhbF9sZW4gKz0gc3RybGVuIChvbGRfdmFsKTsKLQotICBuZXdfdmFsID0gKGNoYXIgKikgbWFsbG9jIChuZXdfdmFsX2xlbik7Ci0gIGlmIChuZXdfdmFsID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSMgaWYgSEFWRV9TRVRFTlYKLSAgY3AgPSBuZXdfdmFsOwotIyBlbHNlCi0gIGNwID0gc3RwY3B5IChuZXdfdmFsLCAiTkxTUEFUSD0iKTsKLSMgZW5kaWYKLQotICBjcCA9IHN0cGNweSAoY3AsIGRpcm5hbWUpOwotICBjcCA9IHN0cGNweSAoY3AsICIvJUwvTENfTUVTU0FHRVMvJU4uY2F0OiIpOwotCi0gIGlmIChvbGRfdmFsID09IE5VTEwpCi0gICAgewotIyBpZiBfX1NURENfXwotICAgICAgc3RwY3B5IChjcCwgTE9DQUxFRElSICIvJUwvTENfTUVTU0FHRVMvJU4uY2F0Iik7Ci0jIGVsc2UKLQotICAgICAgY3AgPSBzdHBjcHkgKGNwLCBMT0NBTEVESVIpOwotICAgICAgc3RwY3B5IChjcCwgIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQiKTsKLSMgZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICBzdHBjcHkgKGNwLCBvbGRfdmFsKTsKLQotIyBpZiBIQVZFX1NFVEVOVgotICBzZXRlbnYgKCJOTFNQQVRIIiwgbmV3X3ZhbCwgMSk7Ci0gIGZyZWUgKG5ld192YWwpOwotIyBlbHNlCi0gIHB1dGVudiAobmV3X3ZhbCk7Ci0gIC8qIERvICpub3QqIGZyZWUgdGhlIGVudmlyb25tZW50IGVudHJ5IHdlIGp1c3QgZW50ZXJlZC4gIEl0IGlzIHVzZWQKLSAgICAgZnJvbSBub3cgb24uICAgKi8KLSMgZW5kaWYKLQotI2VuZGlmCi0KLSAgcmV0dXJuIChjaGFyICopIGRvbWFpbm5hbWU7Ci19Ci0KLSN1bmRlZiBnZXR0ZXh0Ci1jaGFyICoKLWdldHRleHQgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBpbnQgbXNnaWQ7Ci0KLSAgaWYgKG1zZyA9PSBOVUxMIHx8IGNhdGFsb2cgPT0gKG5sX2NhdGQpIC0xKQotICAgIHJldHVybiAoY2hhciAqKSBtc2c7Ci0KLSAgLyogR2V0IHRoZSBtZXNzYWdlIGZyb20gdGhlIGNhdGFsb2cuICBXZSBhbHdheXMgdXNlIHNldCBudW1iZXIgMS4KLSAgICAgVGhlIG1lc3NhZ2UgSUQgaXMgY29tcHV0ZWQgYnkgdGhlIGZ1bmN0aW9uIGBtc2dfdG9fY2F0X2lkJwotICAgICB3aGljaCB3b3JrcyBvbiB0aGUgdGFibGUgZ2VuZXJhdGVkIGJ5IGBwby10by10YmwnLiAgKi8KLSAgbXNnaWQgPSBtc2dfdG9fY2F0X2lkIChtc2cpOwotICBpZiAobXNnaWQgPT0gLTEpCi0gICAgcmV0dXJuIChjaGFyICopIG1zZzsKLQotICByZXR1cm4gY2F0Z2V0cyAoY2F0YWxvZywgMSwgbXNnaWQsIChjaGFyICopIG1zZyk7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgdGFibGUgYF9tc2dfdGJsJyB3aGljaCBoYXMgYF9tc2dfdGJsX2xlbmd0aCcgZW50cmllcwotICAgZm9yIHRoZSBvbmUgZXF1YWwgdG8gbXNnLiAgSWYgaXQgaXMgZm91bmQgcmV0dXJuIHRoZSBJRC4gIEluIGNhc2Ugd2hlbgotICAgdGhlIHN0cmluZyBpcyBub3QgZm91bmQgcmV0dXJuIC0xLiAgKi8KLXN0YXRpYyBpbnQKLW1zZ190b19jYXRfaWQgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBpbnQgY250OwotCi0gIGZvciAoY250ID0gMDsgY250IDwgX21zZ190YmxfbGVuZ3RoOyArK2NudCkKLSAgICBpZiAoc3RyY21wIChtc2csIF9tc2dfdGJsW2NudF0uX21zZykgPT0gMCkKLSAgICAgIHJldHVybiBfbXNnX3RibFtjbnRdLl9tc2dfbnVtYmVyOwotCi0gIHJldHVybiAtMTsKLX0KLQotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotLyogV2UgZG9uJ3Qgd2FudCBsaWJpbnRsLmEgdG8gZGVwZW5kIG9uIGFueSBvdGhlciBsaWJyYXJ5LiAgU28gd2UKLSAgIGF2b2lkIHRoZSBub24tc3RhbmRhcmQgZnVuY3Rpb24gc3RwY3B5LiAgSW4gR05VIEMgTGlicmFyeSB0aGlzCi0gICBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRob3VnaC4gIEFsc28gYWxsb3cgdGhlIHN5bWJvbCBIQVZFX1NUUENQWQotICAgdG8gYmUgZGVmaW5lZC4gICovCi0jaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKgotc3RwY3B5IChkZXN0LCBzcmMpCi0gICAgIGNoYXIgKmRlc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKnNyYzsKLXsKLSAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQotICAgIC8qIERvIG5vdGhpbmcuICovIDsKLSAgcmV0dXJuIGRlc3QgLSAxOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2NvbmZpZy5pbiBiL2ludGwvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTkwNDliLi4wMDAwMDAwCi0tLSBhL2ludGwvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9DQVRHRVRTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpIGxpYnJhcnkgKC1saSkuICAqLwotI3VuZGVmIEhBVkVfTElCSQpkaWZmIC0tZ2l0IGEvaW50bC9jb25maWd1cmUgYi9pbnRsL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQxZWVhMC4uMDAwMDAwMAotLS0gYS9pbnRsL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDI5NTAgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPWRnZXR0ZXh0LmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGZpCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NjI6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYxNjogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjYzNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2NDggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjY1NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3NzogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcwNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzM1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc4MzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzkzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc5NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgxNzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyMjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODMxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi0gIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPQotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg0NjogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotICBpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0gIGVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1PMiIKLSAgZmkKLWVsc2UKLSAgR0NDPQotICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1nIgotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTAzOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MjQ6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDkyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6OTM3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTU0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDI4OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwMzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTA4MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTAzOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTE3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE0MzogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE0OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAib2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE3NjogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTgxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIxMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNDQ6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmIEhBVkVfQUxMT0NBX0gKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjcyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLm8KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMDQ6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMzNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTMzOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzODk6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzk3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ0MTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0NDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjE0NTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDgwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1MzM6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1NDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2ODE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzA5OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTcxNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTcxOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc0OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTc1NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzc3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODA2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4MzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg2ODogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODczICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg4MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDE6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkyMTogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQwOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjE5NTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5Njc6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTk1OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjAwMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwMTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMzA6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjAzNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDcwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTA0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNTk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxOTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNjY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzAwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzM1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDI1OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDUzOiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDU4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0NjM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgotICAgIGV4aXQgMCA7OwotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKLSAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Ci0gICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKLSAgZXNhYwotZG9uZQotCi1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgotYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCi0KLXRyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQENDQCUkQ0MlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotYWNfc291cmNlcz0iJG5sc19jdl9oZWFkZXJfbGliZ3QiCi1hY19kZXN0cz0iJG5sc19jdl9oZWFkZXJfaW50bCIKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1zcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgotd2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbwotICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKLSAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCi0KLSAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCi0KLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mICRhY19kZXN0Ci0KLSAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkc3JjZGlyIiBpbgotICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKLSAgZXNhYwotCi0gICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCi0gIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8Ci0gICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1kb25lCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2ludGwvY29uZmlndXJlLmluIGIvaW50bC9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTljMjQuLjAwMDAwMDAKLS0tIGEvaW50bC9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLQotQUNfSU5JVChkZ2V0dGV4dC5jKQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi0KLUFNX1BST0dfSU5TVEFMTAotQ1lfR05VX0dFVFRFWFQKLUFDX0xJTktfRklMRVMoJG5sc19jdl9oZWFkZXJfbGliZ3QsICRubHNfY3ZfaGVhZGVyX2ludGwpCi0KLUFDX09VVFBVVChNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL2ludGwvZGNnZXR0ZXh0LmMgYi9pbnRsL2RjZ2V0dGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzE2YmZkLi4wMDAwMDAwCi0tLSBhL2ludGwvZGNnZXR0ZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTMgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRjZ2V0dGV4dCgzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKLSNlbHNlCi0jIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCi0jICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgZWxzZQotIyAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICBlbHNlCi0jICAgaWZuZGVmIGFsbG9jYQotY2hhciAqYWxsb2NhICgpOwotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmbmRlZiBlcnJubwotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotI2lmbmRlZiBfX3NldF9lcnJubwotIyBkZWZpbmUgX19zZXRfZXJybm8odmFsKSBlcnJubyA9ICh2YWwpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotY2hhciAqZ2V0ZW52ICgpOwotIyBpZmRlZiBIQVZFX01BTExPQ19ICi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZWxzZQotdm9pZCBmcmVlICgpOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgX0dOVV9TT1VSQ0UKLSMgIGRlZmluZSBfR05VX1NPVVJDRQkxCi0jIGVuZGlmCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jaWYgIUhBVkVfU1RSQ0hSICYmICFkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBzdHJjaHIKLSMgIGRlZmluZSBzdHJjaHIgaW5kZXgKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1VOSVNURF9IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImdldHRleHQuaCIKLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKLSNlbmRpZgotI2luY2x1ZGUgImhhc2gtc3RyaW5nLmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmZGVmIF9MSUJDCi0vKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLSAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgZGVmaW5lIGdldGN3ZCBfX2dldGN3ZAotIyBkZWZpbmUgc3RwY3B5IF9fc3RwY3B5Ci0jZWxzZQotIyBpZiAhZGVmaW5lZCBIQVZFX0dFVENXRAotY2hhciAqZ2V0d2QgKCk7Ci0jICBkZWZpbmUgZ2V0Y3dkKGJ1ZiwgbWF4KSBnZXR3ZCAoYnVmKQotIyBlbHNlCi1jaGFyICpnZXRjd2QgKCk7Ci0jIGVuZGlmCi0jIGlmbmRlZiBIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKnN0cGNweSBQQVJBTVMgKChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBBbW91bnQgdG8gaW5jcmVhc2UgYnVmZmVyIHNpemUgYnkgaW4gZWFjaCB0cnkuICAqLwotI2RlZmluZSBQQVRIX0lOQ1IgMzIKLQotLyogVGhlIGZvbGxvd2luZyBpcyBmcm9tIHBhdGhtYXguaC4gICovCi0vKiBOb24tUE9TSVggQlNEIHN5c3RlbXMgbWlnaHQgaGF2ZSBnY2MncyBsaW1pdHMuaCwgd2hpY2ggZG9lc24ndCBkZWZpbmUKLSAgIFBBVEhfTUFYIGJ1dCBtaWdodCBjYXVzZSByZWRlZmluaXRpb24gd2FybmluZ3Mgd2hlbiBzeXMvcGFyYW0uaCBpcwotICAgbGF0ZXIgaW5jbHVkZWQgKGFzIG9uIE1PUkUvQlNEIDQuMykuICAqLwotI2lmIGRlZmluZWQoX1BPU0lYX1ZFUlNJT04pIHx8IChkZWZpbmVkKEhBVkVfTElNSVRTX0gpICYmICFkZWZpbmVkKF9fR05VQ19fKSkKLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfUE9TSVhfUEFUSF9NQVgKLSMgZGVmaW5lIF9QT1NJWF9QQVRIX01BWCAyNTUKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUEFUSF9NQVgpICYmIGRlZmluZWQoX1BDX1BBVEhfTUFYKQotIyBkZWZpbmUgUEFUSF9NQVggKHBhdGhjb25mICgiLyIsIF9QQ19QQVRIX01BWCkgPCAxID8gMTAyNCA6IHBhdGhjb25mICgiLyIsIF9QQ19QQVRIX01BWCkpCi0jZW5kaWYKLQotLyogRG9uJ3QgaW5jbHVkZSBzeXMvcGFyYW0uaCBpZiBpdCBhbHJlYWR5IGhhcyBiZWVuLiAgKi8KLSNpZiBkZWZpbmVkKEhBVkVfU1lTX1BBUkFNX0gpICYmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiAhZGVmaW5lZChNQVhQQVRITEVOKQotIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUEFUSF9NQVgpICYmIGRlZmluZWQoTUFYUEFUSExFTikKLSMgZGVmaW5lIFBBVEhfTUFYIE1BWFBBVEhMRU4KLSNlbmRpZgotCi0jaWZuZGVmIFBBVEhfTUFYCi0jIGRlZmluZSBQQVRIX01BWCBfUE9TSVhfUEFUSF9NQVgKLSNlbmRpZgotCi0vKiBYUEczIGRlZmluZXMgdGhlIHJlc3VsdCBvZiBgc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCknIGFzOgotICAgYGBEaXJlY3RzIGBzZXRsb2NhbGUoKScgdG8gcXVlcnkgYGNhdGVnb3J5JyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50Ci0gICAgIHNldHRpbmcgb2YgYGxvY2FsJy4nJwotICAgSG93ZXZlciBpdCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBleGFjdCBmb3JtYXQuICBBbmQgZXZlbiB3b3JzZTogUE9TSVgKLSAgIGRlZmluZXMgdGhpcyBub3QgYXQgYWxsLiAgU28gd2UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgb25seSBvbiBzZWxlY3RlZAotICAgc3lzdGVtIChlLmcuIHRob3NlIHVzaW5nIEdOVSBDIExpYnJhcnkpLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgSEFWRV9MT0NBTEVfTlVMTAotI2VuZGlmCi0KLS8qIE5hbWUgb2YgdGhlIGRlZmF1bHQgZG9tYWluIHVzZWQgZm9yIGdldHRleHQoMykgcHJpb3IgYW55IGNhbGwgdG8KLSAgIHRleHRkb21haW4oMykuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBpcyAibWVzc2FnZXMiLiAgKi8KLWNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW5bXSA9ICJtZXNzYWdlcyI7Ci0KLS8qIFZhbHVlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZG9tYWluIGZvciBnZXR0ZXh0KDMpLiAgKi8KLWNvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW47Ci0KLS8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KLWNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdID0gR05VTE9DQUxFRElSOwotCi0vKiBMaXN0IHdpdGggYmluZGluZ3Mgb2Ygc3BlY2lmaWMgZG9tYWlucyBjcmVhdGVkIGJ5IGJpbmR0ZXh0ZG9tYWluKCkKLSAgIGNhbGxzLiAgKi8KLXN0cnVjdCBiaW5kaW5nICpfbmxfZG9tYWluX2JpbmRpbmdzOwotCi0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGNoYXIgKmZpbmRfbXNnIFBBUkFNUyAoKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKm1zZ2lkKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqY2F0ZWdvcnlfdG9fbmFtZSBQQVJBTVMgKChpbnQgY2F0ZWdvcnkpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpndWVzc19jYXRlZ29yeV92YWx1ZSBQQVJBTVMgKChpbnQgY2F0ZWdvcnksCi0JCQkJCQkgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKSk7Ci0KLQotLyogRm9yIHRob3NlIGxvb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCi0gICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLwotI2lmZGVmIEhBVkVfQUxMT0NBCi0vKiBOb3RoaW5nIGhhcyB0byBiZSBkb25lLiAgKi8KLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyZXNzKSAvKiBub3RoaW5nICovCi0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KSAvKiBub3RoaW5nICovCi0jZWxzZQotc3RydWN0IGJsb2NrX2xpc3QKLXsKLSAgdm9pZCAqYWRkcmVzczsKLSAgc3RydWN0IGJsb2NrX2xpc3QgKm5leHQ7Ci19OwotIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHIpCQkJCQkJICAgICAgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIHN0cnVjdCBibG9ja19saXN0ICpuZXdwID0gKHN0cnVjdCBibG9ja19saXN0ICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOyAgXAotICAgIC8qIElmIHdlIGNhbm5vdCBnZXQgYSBmcmVlIGJsb2NrIHdlIGNhbm5vdCBhZGQgdGhlIG5ldyBlbGVtZW50IHRvCSAgICAgIFwKLSAgICAgICB0aGUgbGlzdC4gICovCQkJCQkJCSAgICAgIFwKLSAgICBpZiAobmV3cCAhPSBOVUxMKSB7CQkJCQkJCSAgICAgIFwKLSAgICAgIG5ld3AtPmFkZHJlc3MgPSAoYWRkcik7CQkJCQkJICAgICAgXAotICAgICAgbmV3cC0+bmV4dCA9IChsaXN0KTsJCQkJCQkgICAgICBcCi0gICAgICAobGlzdCkgPSBuZXdwOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpCQkJCQkJICAgICAgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsJCQkJCQkgICAgICBcCi0gICAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqb2xkID0gbGlzdDsJCQkJCSAgICAgIFwKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwkJCQkJCSAgICAgIFwKLSAgICAgIGZyZWUgKG9sZCk7CQkJCQkJCSAgICAgIFwKLSAgICB9CQkJCQkJCQkJICAgICAgXAotICB9IHdoaWxlICgwKQotIyB1bmRlZiBhbGxvY2EKLSMgZGVmaW5lIGFsbG9jYShzaXplKSAobWFsbG9jIChzaXplKSkKLSNlbmRpZgkvKiBoYXZlIGFsbG9jYSAqLwotCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgRENHRVRURVhUIF9fZGNnZXR0ZXh0Ci0jZWxzZQotIyBkZWZpbmUgRENHRVRURVhUIGRjZ2V0dGV4dF9fCi0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotY2hhciAqCi1EQ0dFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci0gICAgIGludCBjYXRlZ29yeTsKLXsKLSNpZm5kZWYgSEFWRV9BTExPQ0EKLSAgc3RydWN0IGJsb2NrX2xpc3QgKmJsb2NrX2xpc3QgPSBOVUxMOwotI2VuZGlmCi0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbjsKLSAgc3RydWN0IGJpbmRpbmcgKmJpbmRpbmc7Ci0gIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZTsKLSAgY29uc3QgY2hhciAqY2F0ZWdvcnl2YWx1ZTsKLSAgY2hhciAqZGlybmFtZSwgKnhkb21haW5uYW1lOwotICBjaGFyICpzaW5nbGVfbG9jYWxlOwotICBjaGFyICpyZXR2YWw7Ci0gIGludCBzYXZlZF9lcnJubyA9IGVycm5vOwotCi0gIC8qIElmIG5vIHJlYWwgTVNHSUQgaXMgZ2l2ZW4gcmV0dXJuIE5VTEwuICAqLwotICBpZiAobXNnaWQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBJZiBET01BSU5OQU1FIGlzIE5VTEwsIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBkZWZhdWx0IGRvbWFpbi4gIElmCi0gICAgIENBVEVHT1JZIGlzIG5vdCBMQ19NRVNTQUdFUyB0aGlzIG1pZ2h0IG5vdCBtYWtlIG11Y2ggc2Vuc2UgYnV0IHRoZQotICAgICBkZWZpbnRpb24gbGVmdCB0aGlzIHVuZGVmaW5lZC4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0gICAgZG9tYWlubmFtZSA9IF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotCi0gIC8qIEZpcnN0IGZpbmQgbWF0Y2hpbmcgYmluZGluZy4gICovCi0gIGZvciAoYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7IGJpbmRpbmcgIT0gTlVMTDsgYmluZGluZyA9IGJpbmRpbmctPm5leHQpCi0gICAgewotICAgICAgaW50IGNvbXBhcmUgPSBzdHJjbXAgKGRvbWFpbm5hbWUsIGJpbmRpbmctPmRvbWFpbm5hbWUpOwotICAgICAgaWYgKGNvbXBhcmUgPT0gMCkKLQkvKiBXZSBmb3VuZCBpdCEgICovCi0JYnJlYWs7Ci0gICAgICBpZiAoY29tcGFyZSA8IDApCi0JewotCSAgLyogSXQgaXMgbm90IGluIHRoZSBsaXN0LiAgKi8KLQkgIGJpbmRpbmcgPSBOVUxMOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoYmluZGluZyA9PSBOVUxMKQotICAgIGRpcm5hbWUgPSAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lOwotICBlbHNlIGlmIChiaW5kaW5nLT5kaXJuYW1lWzBdID09ICcvJykKLSAgICBkaXJuYW1lID0gYmluZGluZy0+ZGlybmFtZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLiAgTWFrZSBpdCBhYnNvbHV0ZSBub3cuICAqLwotICAgICAgc2l6ZV90IGRpcm5hbWVfbGVuID0gc3RybGVuIChiaW5kaW5nLT5kaXJuYW1lKSArIDE7Ci0gICAgICBzaXplX3QgcGF0aF9tYXg7Ci0gICAgICBjaGFyICpyZXQ7Ci0KLSAgICAgIHBhdGhfbWF4ID0gKHVuc2lnbmVkKSBQQVRIX01BWDsKLSAgICAgIHBhdGhfbWF4ICs9IDI7CQkvKiBUaGUgZ2V0Y3dkIGRvY3Mgc2F5IHRvIGRvIHRoaXMuICAqLwotCi0gICAgICBkaXJuYW1lID0gKGNoYXIgKikgYWxsb2NhIChwYXRoX21heCArIGRpcm5hbWVfbGVuKTsKLSAgICAgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZGlybmFtZSk7Ci0KLSAgICAgIF9fc2V0X2Vycm5vICgwKTsKLSAgICAgIHdoaWxlICgocmV0ID0gZ2V0Y3dkIChkaXJuYW1lLCBwYXRoX21heCkpID09IE5VTEwgJiYgZXJybm8gPT0gRVJBTkdFKQotCXsKLQkgIHBhdGhfbWF4ICs9IFBBVEhfSU5DUjsKLQkgIGRpcm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHBhdGhfbWF4ICsgZGlybmFtZV9sZW4pOwotCSAgQUREX0JMT0NLIChibG9ja19saXN0LCBkaXJuYW1lKTsKLQkgIF9fc2V0X2Vycm5vICgwKTsKLQl9Ci0KLSAgICAgIGlmIChyZXQgPT0gTlVMTCkKLQl7Ci0JICAvKiBXZSBjYW5ub3QgZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgRG9uJ3Qgc2lnbmFsIGFuCi0JICAgICBlcnJvciBidXQgc2ltcGx5IHJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcuICAqLwotCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCSAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKLQkgIHJldHVybiAoY2hhciAqKSBtc2dpZDsKLQl9Ci0KLSAgICAgIHN0cGNweSAoc3RwY3B5IChzdHJjaHIgKGRpcm5hbWUsICdcMCcpLCAiLyIpLCBiaW5kaW5nLT5kaXJuYW1lKTsKLSAgICB9Ci0KLSAgLyogTm93IGRldGVybWluZSB0aGUgc3ltYm9saWMgbmFtZSBvZiBDQVRFR09SWSBhbmQgaXRzIHZhbHVlLiAgKi8KLSAgY2F0ZWdvcnluYW1lID0gY2F0ZWdvcnlfdG9fbmFtZSAoY2F0ZWdvcnkpOwotICBjYXRlZ29yeXZhbHVlID0gZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpOwotCi0gIHhkb21haW5uYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGNhdGVnb3J5bmFtZSkKLQkJCQkgKyBzdHJsZW4gKGRvbWFpbm5hbWUpICsgNSk7Ci0gIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgeGRvbWFpbm5hbWUpOwotCi0gIHN0cGNweSAoc3RwY3B5IChzdHBjcHkgKHN0cGNweSAoeGRvbWFpbm5hbWUsIGNhdGVnb3J5bmFtZSksICIvIiksCi0JCSAgZG9tYWlubmFtZSksCi0JICAiLm1vIik7Ci0KLSAgLyogQ3JlYXRpbmcgd29ya2luZyBhcmVhLiAgKi8KLSAgc2luZ2xlX2xvY2FsZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChjYXRlZ29yeXZhbHVlKSArIDEpOwotICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHNpbmdsZV9sb2NhbGUpOwotCi0KLSAgLyogU2VhcmNoIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLiAgVGhpcyBpcyBhIGxvb3AgYmVjYXVzZSB3ZSBwZXJoYXBzCi0gICAgIGdvdCBhbiBvcmRlcmVkIGxpc3Qgb2YgbGFuZ3VhZ2VzIHRvIGNvbnNpZGVyIGZvciB0aCB0cmFuc2xhdGlvbi4gICovCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIC8qIE1ha2UgQ0FURUdPUllWQUxVRSBwb2ludCB0byB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0LiAgKi8KLSAgICAgIHdoaWxlIChjYXRlZ29yeXZhbHVlWzBdICE9ICdcMCcgJiYgY2F0ZWdvcnl2YWx1ZVswXSA9PSAnOicpCi0JKytjYXRlZ29yeXZhbHVlOwotICAgICAgaWYgKGNhdGVnb3J5dmFsdWVbMF0gPT0gJ1wwJykKLQl7Ci0JICAvKiBUaGUgd2hvbGUgY29udGVudHMgb2YgQ0FURUdPUllWQUxVRSBoYXMgYmVlbiBzZWFyY2hlZCBidXQKLQkgICAgIG5vIHZhbGlkIGVudHJ5IGhhcyBiZWVuIGZvdW5kLiAgV2Ugc29sdmUgdGhpcyBzaXR1YXRpb24KLQkgICAgIGJ5IGltcGxpY2l0bHkgYXBwZW5kaW5nIGEgIkMiIGVudHJ5LCBpLmUuIG5vIHRyYW5zbGF0aW9uCi0JICAgICB3aWxsIHRha2UgcGxhY2UuICAqLwotCSAgc2luZ2xlX2xvY2FsZVswXSA9ICdDJzsKLQkgIHNpbmdsZV9sb2NhbGVbMV0gPSAnXDAnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpjcCA9IHNpbmdsZV9sb2NhbGU7Ci0JICB3aGlsZSAoY2F0ZWdvcnl2YWx1ZVswXSAhPSAnXDAnICYmIGNhdGVnb3J5dmFsdWVbMF0gIT0gJzonKQotCSAgICAqY3ArKyA9ICpjYXRlZ29yeXZhbHVlKys7Ci0JICAqY3AgPSAnXDAnOwotCX0KLQotICAgICAgLyogSWYgdGhlIGN1cnJlbnQgbG9jYWxlIHZhbHVlIGlzIEMgKG9yIFBPU0lYKSB3ZSBkb24ndCBsb2FkIGEKLQkgZG9tYWluLiAgUmV0dXJuIHRoZSBNU0dJRC4gICovCi0gICAgICBpZiAoc3RyY21wIChzaW5nbGVfbG9jYWxlLCAiQyIpID09IDAKLQkgIHx8IHN0cmNtcCAoc2luZ2xlX2xvY2FsZSwgIlBPU0lYIikgPT0gMCkKLQl7Ci0JICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0JICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOwotCSAgcmV0dXJuIChjaGFyICopIG1zZ2lkOwotCX0KLQotCi0gICAgICAvKiBGaW5kIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGNhdGFsb2cgbWF0Y2hpbmcgdGhlCi0JIERPTUFJTk5BTUUgYW5kIENBVEVHT1JZLiAgKi8KLSAgICAgIGRvbWFpbiA9IF9ubF9maW5kX2RvbWFpbiAoZGlybmFtZSwgc2luZ2xlX2xvY2FsZSwgeGRvbWFpbm5hbWUpOwotCi0gICAgICBpZiAoZG9tYWluICE9IE5VTEwpCi0JewotCSAgcmV0dmFsID0gZmluZF9tc2cgKGRvbWFpbiwgbXNnaWQpOwotCi0JICBpZiAocmV0dmFsID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpbnQgY250OwotCi0JICAgICAgZm9yIChjbnQgPSAwOyBkb21haW4tPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQotCQl7Ci0JCSAgcmV0dmFsID0gZmluZF9tc2cgKGRvbWFpbi0+c3VjY2Vzc29yW2NudF0sIG1zZ2lkKTsKLQotCQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKHJldHZhbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCSAgICAgIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7Ci0JICAgICAgcmV0dXJuIHJldHZhbDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fZGNnZXR0ZXh0LCBkY2dldHRleHQpOwotI2VuZGlmCi0KLQotc3RhdGljIGNoYXIgKgotZmluZF9tc2cgKGRvbWFpbl9maWxlLCBtc2dpZCkKLSAgICAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotewotICBzaXplX3QgdG9wLCBhY3QsIGJvdHRvbTsKLSAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbjsKLQotICBpZiAoZG9tYWluX2ZpbGUtPmRlY2lkZWQgPT0gMCkKLSAgICBfbmxfbG9hZF9kb21haW4gKGRvbWFpbl9maWxlKTsKLQotICBpZiAoZG9tYWluX2ZpbGUtPmRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBkb21haW4gPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgZG9tYWluX2ZpbGUtPmRhdGE7Ci0KLSAgLyogTG9jYXRlIHRoZSBNU0dJRCBhbmQgaXRzIHRyYW5zbGF0aW9uLiAgKi8KLSAgaWYgKGRvbWFpbi0+aGFzaF9zaXplID4gMiAmJiBkb21haW4tPmhhc2hfdGFiICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVXNlIHRoZSBoYXNoaW5nIHRhYmxlLiAgKi8KLSAgICAgIG5sc191aW50MzIgbGVuID0gc3RybGVuIChtc2dpZCk7Ci0gICAgICBubHNfdWludDMyIGhhc2hfdmFsID0gaGFzaF9zdHJpbmcgKG1zZ2lkKTsKLSAgICAgIG5sc191aW50MzIgaWR4ID0gaGFzaF92YWwgJSBkb21haW4tPmhhc2hfc2l6ZTsKLSAgICAgIG5sc191aW50MzIgaW5jciA9IDEgKyAoaGFzaF92YWwgJSAoZG9tYWluLT5oYXNoX3NpemUgLSAyKSk7Ci0gICAgICBubHNfdWludDMyIG5zdHIgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5oYXNoX3RhYltpZHhdKTsKLQotICAgICAgaWYgKG5zdHIgPT0gMCkKLQkvKiBIYXNoIHRhYmxlIGVudHJ5IGlzIGVtcHR5LiAgKi8KLQlyZXR1cm4gTlVMTDsKLQotICAgICAgaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPm9yaWdfdGFiW25zdHIgLSAxXS5sZW5ndGgpID09IGxlbgotCSAgJiYgc3RyY21wIChtc2dpZCwKLQkJICAgICBkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkgICAgICAgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ub2Zmc2V0KSkgPT0gMCkKLQlyZXR1cm4gKGNoYXIgKikgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJCSAgZG9tYWluLT50cmFuc190YWJbbnN0ciAtIDFdLm9mZnNldCk7Ci0KLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIGlmIChpZHggPj0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyKQotCSAgICBpZHggLT0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyOwotCSAgZWxzZQotCSAgICBpZHggKz0gaW5jcjsKLQotCSAgbnN0ciA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPmhhc2hfdGFiW2lkeF0pOwotCSAgaWYgKG5zdHIgPT0gMCkKLQkgICAgLyogSGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eS4gICovCi0JICAgIHJldHVybiBOVUxMOwotCi0JICBpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+b3JpZ190YWJbbnN0ciAtIDFdLmxlbmd0aCkgPT0gbGVuCi0JICAgICAgJiYgc3RyY21wIChtc2dpZCwKLQkJCSBkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkJICAgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ub2Zmc2V0KSkKLQkgICAgICAgICA9PSAwKQotCSAgICByZXR1cm4gKGNoYXIgKikgZG9tYWluLT5kYXRhCi0JICAgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT50cmFuc190YWJbbnN0ciAtIDFdLm9mZnNldCk7Ci0JfQotICAgICAgLyogTk9UUkVBQ0hFRCAqLwotICAgIH0KLQotICAvKiBOb3cgd2UgdHJ5IHRoZSBkZWZhdWx0IG1ldGhvZDogIGJpbmFyeSBzZWFyY2ggaW4gdGhlIHNvcnRlZAotICAgICBhcnJheSBvZiBtZXNzYWdlcy4gICovCi0gIGJvdHRvbSA9IDA7Ci0gIHRvcCA9IGRvbWFpbi0+bnN0cmluZ3M7Ci0gIHdoaWxlIChib3R0b20gPCB0b3ApCi0gICAgewotICAgICAgaW50IGNtcF92YWw7Ci0KLSAgICAgIGFjdCA9IChib3R0b20gKyB0b3ApIC8gMjsKLSAgICAgIGNtcF92YWwgPSBzdHJjbXAgKG1zZ2lkLCBkb21haW4tPmRhdGEKLQkJCSAgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCSAgICBkb21haW4tPm9yaWdfdGFiW2FjdF0ub2Zmc2V0KSk7Ci0gICAgICBpZiAoY21wX3ZhbCA8IDApCi0JdG9wID0gYWN0OwotICAgICAgZWxzZSBpZiAoY21wX3ZhbCA+IDApCi0JYm90dG9tID0gYWN0ICsgMTsKLSAgICAgIGVsc2UKLQlicmVhazsKLSAgICB9Ci0KLSAgLyogSWYgYW4gdHJhbnNsYXRpb24gaXMgZm91bmQgcmV0dXJuIHRoaXMuICAqLwotICByZXR1cm4gYm90dG9tID49IHRvcCA/IE5VTEwgOiAoY2hhciAqKSBkb21haW4tPmRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkgICAgIGRvbWFpbi0+dHJhbnNfdGFiW2FjdF0ub2Zmc2V0KTsKLX0KLQotCi0vKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGxvY2FsZSBDQVRFR09SWS4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1jYXRlZ29yeV90b19uYW1lIChjYXRlZ29yeSkKLSAgICAgaW50IGNhdGVnb3J5OwotewotICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLSAgc3dpdGNoIChjYXRlZ29yeSkKLSAgewotI2lmZGVmIExDX0NPTExBVEUKLSAgY2FzZSBMQ19DT0xMQVRFOgotICAgIHJldHZhbCA9ICJMQ19DT0xMQVRFIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX0NUWVBFCi0gIGNhc2UgTENfQ1RZUEU6Ci0gICAgcmV0dmFsID0gIkxDX0NUWVBFIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX01PTkVUQVJZCi0gIGNhc2UgTENfTU9ORVRBUlk6Ci0gICAgcmV0dmFsID0gIkxDX01PTkVUQVJZIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX05VTUVSSUMKLSAgY2FzZSBMQ19OVU1FUklDOgotICAgIHJldHZhbCA9ICJMQ19OVU1FUklDIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX1RJTUUKLSAgY2FzZSBMQ19USU1FOgotICAgIHJldHZhbCA9ICJMQ19USU1FIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX01FU1NBR0VTCi0gIGNhc2UgTENfTUVTU0FHRVM6Ci0gICAgcmV0dmFsID0gIkxDX01FU1NBR0VTIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX1JFU1BPTlNFCi0gIGNhc2UgTENfUkVTUE9OU0U6Ci0gICAgcmV0dmFsID0gIkxDX1JFU1BPTlNFIjsKLSAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIExDX0FMTAotICBjYXNlIExDX0FMTDoKLSAgICAvKiBUaGlzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlIGJ1dCBpcyBwZXJoYXBzIGJldHRlciB0aGFuIGFueSBvdGhlcgotICAgICAgIHZhbHVlLiAgKi8KLSAgICByZXR2YWwgPSAiTENfQUxMIjsKLSAgICBicmVhazsKLSNlbmRpZgotICBkZWZhdWx0OgotICAgIC8qIElmIHlvdSBoYXZlIGEgYmV0dGVyIGlkZWEgZm9yIGEgZGVmYXVsdCB2YWx1ZSBsZXQgbWUga25vdy4gICovCi0gICAgcmV0dmFsID0gIkxDX1hYWCI7Ci0gIH0KLQotICByZXR1cm4gcmV0dmFsOwotfQotCi0vKiBHdWVzcyB2YWx1ZSBvZiBjdXJyZW50IGxvY2FsZSBmcm9tIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpCi0gICAgIGludCBjYXRlZ29yeTsKLSAgICAgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lOwotewotICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLSAgLyogVGhlIGhpZ2hlc3QgcHJpb3JpdHkgdmFsdWUgaXMgdGhlIGBMQU5HVUFHRScgZW52aXJvbm1lbnQKLSAgICAgdmFyaWFibGUuICBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4gICovCi0gIHJldHZhbCA9IGdldGVudiAoIkxBTkdVQUdFIik7Ci0gIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKLSAgICByZXR1cm4gcmV0dmFsOwotCi0gIC8qIGBMQU5HVUFHRScgaXMgbm90IHNldC4gIFNvIHdlIGhhdmUgdG8gcHJvY2VlZCB3aXRoIHRoZSBQT1NJWAotICAgICBtZXRob2RzIG9mIGxvb2tpbmcgdG8gYExDX0FMTCcsIGBMQ194eHgnLCBhbmQgYExBTkcnLiAgT24gc29tZQotICAgICBzeXN0ZW1zIHRoaXMgY2FuIGJlIGRvbmUgYnkgdGhlIGBzZXRsb2NhbGUnIGZ1bmN0aW9uIGl0c2VsZi4gICovCi0jaWYgZGVmaW5lZCBIQVZFX1NFVExPQ0FMRSAmJiBkZWZpbmVkIEhBVkVfTENfTUVTU0FHRVMgJiYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9OVUxMCi0gIHJldHVybiBzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKTsKLSNlbHNlCi0gIC8qIFNldHRpbmcgb2YgTENfQUxMIG92ZXJ3cml0ZXMgYWxsIG90aGVyLiAgKi8KLSAgcmV0dmFsID0gZ2V0ZW52ICgiTENfQUxMIik7Ci0gIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKLSAgICByZXR1cm4gcmV0dmFsOwotCi0gIC8qIE5leHQgY29tZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgY2F0ZWdvcnkuICAqLwotICByZXR2YWwgPSBnZXRlbnYgKGNhdGVnb3J5bmFtZSk7Ci0gIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKLSAgICByZXR1cm4gcmV0dmFsOwotCi0gIC8qIExhc3QgcG9zc2liaWxpdHkgaXMgdGhlIExBTkcgZW52aXJvbm1lbnQgdmFyaWFibGUuICAqLwotICByZXR2YWwgPSBnZXRlbnYgKCJMQU5HIik7Ci0gIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKLSAgICByZXR1cm4gcmV0dmFsOwotCi0gIC8qIFdlIHVzZSBDIGFzIHRoZSBkZWZhdWx0IGRvbWFpbi4gIFBPU0lYIHNheXMgdGhpcyBpcyBpbXBsZW1lbnRhdGlvbgotICAgICBkZWZpbmVkLiAgKi8KLSAgcmV0dXJuICJDIjsKLSNlbmRpZgotfQotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotLyogV2UgZG9uJ3Qgd2FudCBsaWJpbnRsLmEgdG8gZGVwZW5kIG9uIGFueSBvdGhlciBsaWJyYXJ5LiAgU28gd2UKLSAgIGF2b2lkIHRoZSBub24tc3RhbmRhcmQgZnVuY3Rpb24gc3RwY3B5LiAgSW4gR05VIEMgTGlicmFyeSB0aGlzCi0gICBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRob3VnaC4gIEFsc28gYWxsb3cgdGhlIHN5bWJvbCBIQVZFX1NUUENQWQotICAgdG8gYmUgZGVmaW5lZC4gICovCi0jaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKgotc3RwY3B5IChkZXN0LCBzcmMpCi0gICAgIGNoYXIgKmRlc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKnNyYzsKLXsKLSAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQotICAgIC8qIERvIG5vdGhpbmcuICovIDsKLSAgcmV0dXJuIGRlc3QgLSAxOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2RnZXR0ZXh0LmMgYi9pbnRsL2RnZXR0ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZGU2NzcuLjAwMDAwMDAKLS0tIGEvaW50bC9kZ2V0dGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogZGdldHRleHQuYyAtLSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGdldHRleHQoMykgZnVuY3Rpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfTE9DQUxFX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBER0VUVEVYVCBfX2RnZXR0ZXh0Ci0jIGRlZmluZSBEQ0dFVFRFWFQgX19kY2dldHRleHQKLSNlbHNlCi0jIGRlZmluZSBER0VUVEVYVCBkZ2V0dGV4dF9fCi0jIGRlZmluZSBEQ0dFVFRFWFQgZGNnZXR0ZXh0X18KLSNlbmRpZgotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBvZiB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KLWNoYXIgKgotREdFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICptc2dpZDsKLXsKLSAgcmV0dXJuIERDR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQsIExDX01FU1NBR0VTKTsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fZGdldHRleHQsIGRnZXR0ZXh0KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9leHBsb2RlbmFtZS5jIGIvaW50bC9leHBsb2RlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2M0NmU5Li4wMDAwMDAwCi0tLSBhL2ludGwvZXhwbG9kZW5hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgImxvYWRpbmZvLmgiCi0KLS8qIE9uIHNvbWUgc3RyYW5nZSBzeXN0ZW1zIHN0aWxsIG5vIGRlZmluaXRpb24gb2YgTlVMTCBpcyBmb3VuZC4gIFNpZ2ghICAqLwotI2lmbmRlZiBOVUxMCi0jIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLSMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQotIyBlbHNlCi0jICBkZWZpbmUgTlVMTCAwCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi1pbnQKLV9ubF9leHBsb2RlX25hbWUgKG5hbWUsIGxhbmd1YWdlLCBtb2RpZmllciwgdGVycml0b3J5LCBjb2Rlc2V0LAotCQkgIG5vcm1hbGl6ZWRfY29kZXNldCwgc3BlY2lhbCwgc3BvbnNvciwgcmV2aXNpb24pCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKipsYW5ndWFnZTsKLSAgICAgY29uc3QgY2hhciAqKm1vZGlmaWVyOwotICAgICBjb25zdCBjaGFyICoqdGVycml0b3J5OwotICAgICBjb25zdCBjaGFyICoqY29kZXNldDsKLSAgICAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldDsKLSAgICAgY29uc3QgY2hhciAqKnNwZWNpYWw7Ci0gICAgIGNvbnN0IGNoYXIgKipzcG9uc29yOwotICAgICBjb25zdCBjaGFyICoqcmV2aXNpb247Ci17Ci0gIGVudW0geyB1bmRlY2lkZWQsIHhwZywgY2VuIH0gc3ludGF4OwotICBjaGFyICpjcDsKLSAgaW50IG1hc2s7Ci0KLSAgKm1vZGlmaWVyID0gTlVMTDsKLSAgKnRlcnJpdG9yeSA9IE5VTEw7Ci0gICpjb2Rlc2V0ID0gTlVMTDsKLSAgKm5vcm1hbGl6ZWRfY29kZXNldCA9IE5VTEw7Ci0gICpzcGVjaWFsID0gTlVMTDsKLSAgKnNwb25zb3IgPSBOVUxMOwotICAqcmV2aXNpb24gPSBOVUxMOwotCi0gIC8qIE5vdyB3ZSBkZXRlcm1pbmUgdGhlIHNpbmdsZSBwYXJ0cyBvZiB0aGUgbG9jYWxlIG5hbWUuICBGaXJzdAotICAgICBsb29rIGZvciB0aGUgbGFuZ3VhZ2UuICBUZXJtaW5hdGlvbiBzeW1ib2xzIGFyZSBgXycgYW5kIGBAJyBpZgotICAgICB3ZSB1c2UgWFBHNCBzdHlsZSwgYW5kIGBfJywgYCsnLCBhbmQgYCwnIGlmIHdlIHVzZSBDRU4gc3ludGF4LiAgKi8KLSAgbWFzayA9IDA7Ci0gIHN5bnRheCA9IHVuZGVjaWRlZDsKLSAgKmxhbmd1YWdlID0gY3AgPSBuYW1lOwotICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnXycgJiYgY3BbMF0gIT0gJ0AnCi0JICYmIGNwWzBdICE9ICcrJyAmJiBjcFswXSAhPSAnLCcpCi0gICAgKytjcDsKLQotICBpZiAoKmxhbmd1YWdlID09IGNwKQotICAgIC8qIFRoaXMgZG9lcyBub3QgbWFrZSBzZW5zZTogbGFuZ3VhZ2UgaGFzIHRvIGJlIHNwZWNpZmllZC4gIFVzZQotICAgICAgIHRoaXMgZW50cnkgYXMgaXQgaXMgd2l0aG91dCBleHBsb2RpbmcuICBQZXJoYXBzIGl0IGlzIGFuIGFsaWFzLiAgKi8KLSAgICBjcCA9IHN0cmNociAoKmxhbmd1YWdlLCAnXDAnKTsKLSAgZWxzZSBpZiAoY3BbMF0gPT0gJ18nKQotICAgIHsKLSAgICAgIC8qIE5leHQgaXMgdGhlIHRlcnJpdG9yeS4gICovCi0gICAgICBjcFswXSA9ICdcMCc7Ci0gICAgICAqdGVycml0b3J5ID0gKytjcDsKLQotICAgICAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJy4nICYmIGNwWzBdICE9ICdAJwotCSAgICAgJiYgY3BbMF0gIT0gJysnICYmIGNwWzBdICE9ICcsJyAmJiBjcFswXSAhPSAnXycpCi0JKytjcDsKLQotICAgICAgbWFzayB8PSBURVJSSVRPUlk7Ci0KLSAgICAgIGlmIChjcFswXSA9PSAnLicpCi0JewotCSAgLyogTmV4dCBpcyB0aGUgY29kZXNldC4gICovCi0JICBzeW50YXggPSB4cGc7Ci0JICBjcFswXSA9ICdcMCc7Ci0JICAqY29kZXNldCA9ICsrY3A7Ci0KLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICdAJykKLQkgICAgKytjcDsKLQotCSAgbWFzayB8PSBYUEdfQ09ERVNFVDsKLQotCSAgaWYgKCpjb2Rlc2V0ICE9IGNwICYmICgqY29kZXNldClbMF0gIT0gJ1wwJykKLQkgICAgewotCSAgICAgICpub3JtYWxpemVkX2NvZGVzZXQgPSBfbmxfbm9ybWFsaXplX2NvZGVzZXQgKCpjb2Rlc2V0LAotCQkJCQkJCSAgIGNwIC0gKmNvZGVzZXQpOwotCSAgICAgIGlmIChzdHJjbXAgKCpjb2Rlc2V0LCAqbm9ybWFsaXplZF9jb2Rlc2V0KSA9PSAwKQotCQlmcmVlICgoY2hhciAqKSAqbm9ybWFsaXplZF9jb2Rlc2V0KTsKLQkgICAgICBlbHNlCi0JCW1hc2sgfD0gWFBHX05PUk1fQ09ERVNFVDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGNwWzBdID09ICdAJyB8fCAoc3ludGF4ICE9IHhwZyAmJiBjcFswXSA9PSAnKycpKQotICAgIHsKLSAgICAgIC8qIE5leHQgaXMgdGhlIG1vZGlmaWVyLiAgKi8KLSAgICAgIHN5bnRheCA9IGNwWzBdID09ICdAJyA/IHhwZyA6IGNlbjsKLSAgICAgIGNwWzBdID0gJ1wwJzsKLSAgICAgICptb2RpZmllciA9ICsrY3A7Ci0KLSAgICAgIHdoaWxlIChzeW50YXggPT0gY2VuICYmIGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJysnCi0JICAgICAmJiBjcFswXSAhPSAnLCcgJiYgY3BbMF0gIT0gJ18nKQotCSsrY3A7Ci0KLSAgICAgIG1hc2sgfD0gWFBHX01PRElGSUVSIHwgQ0VOX0FVRElFTkNFOwotICAgIH0KLQotICBpZiAoc3ludGF4ICE9IHhwZyAmJiAoY3BbMF0gPT0gJysnIHx8IGNwWzBdID09ICcsJyB8fCBjcFswXSA9PSAnXycpKQotICAgIHsKLSAgICAgIHN5bnRheCA9IGNlbjsKLQotICAgICAgaWYgKGNwWzBdID09ICcrJykKLQl7Ci0gCSAgLyogTmV4dCBpcyBzcGVjaWFsIGFwcGxpY2F0aW9uIChDRU4gc3ludGF4KS4gICovCi0JICBjcFswXSA9ICdcMCc7Ci0JICAqc3BlY2lhbCA9ICsrY3A7Ci0KLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcsJyAmJiBjcFswXSAhPSAnXycpCi0JICAgICsrY3A7Ci0KLQkgIG1hc2sgfD0gQ0VOX1NQRUNJQUw7Ci0JfQotCi0gICAgICBpZiAoY3BbMF0gPT0gJywnKQotCXsKLSAJICAvKiBOZXh0IGlzIHNwb25zb3IgKENFTiBzeW50YXgpLiAgKi8KLQkgIGNwWzBdID0gJ1wwJzsKLQkgICpzcG9uc29yID0gKytjcDsKLQotCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJ18nKQotCSAgICArK2NwOwotCi0JICBtYXNrIHw9IENFTl9TUE9OU09SOwotCX0KLQotICAgICAgaWYgKGNwWzBdID09ICdfJykKLQl7Ci0gCSAgLyogTmV4dCBpcyByZXZpc2lvbiAoQ0VOIHN5bnRheCkuICAqLwotCSAgY3BbMF0gPSAnXDAnOwotCSAgKnJldmlzaW9uID0gKytjcDsKLQotCSAgbWFzayB8PSBDRU5fUkVWSVNJT047Ci0JfQotICAgIH0KLQotICAvKiBGb3IgQ0VOIHN5bnRheCB2YWx1ZXMgaXQgbWlnaHQgYmUgaW1wb3J0YW50IHRvIGhhdmUgdGhlCi0gICAgIHNlcGFyYXRvciBjaGFyYWN0ZXIgaW4gdGhlIGZpbGUgbmFtZSwgbm90IGZvciBYUEcgc3ludGF4LiAgKi8KLSAgaWYgKHN5bnRheCA9PSB4cGcpCi0gICAgewotICAgICAgaWYgKCp0ZXJyaXRvcnkgIT0gTlVMTCAmJiAoKnRlcnJpdG9yeSlbMF0gPT0gJ1wwJykKLQltYXNrICY9IH5URVJSSVRPUlk7Ci0KLSAgICAgIGlmICgqY29kZXNldCAhPSBOVUxMICYmICgqY29kZXNldClbMF0gPT0gJ1wwJykKLQltYXNrICY9IH5YUEdfQ09ERVNFVDsKLQotICAgICAgaWYgKCptb2RpZmllciAhPSBOVUxMICYmICgqbW9kaWZpZXIpWzBdID09ICdcMCcpCi0JbWFzayAmPSB+WFBHX01PRElGSUVSOwotICAgIH0KLQotICByZXR1cm4gbWFzazsKLX0KZGlmZiAtLWdpdCBhL2ludGwvZmluZGRvbWFpbi5jIGIvaW50bC9maW5kZG9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODVkNGQuLjAwMDAwMDAKLS0tIGEvaW50bC9maW5kZG9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyogSGFuZGxlIGxpc3Qgb2YgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLXZvaWQgZnJlZSAoKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLSNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIHN0cmNocgotIyAgZGVmaW5lIHN0cmNociBpbmRleAotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgotI2luY2x1ZGUgImdldHRleHRQLmgiCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLS8qIExpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgZG9tYWlucy4gICovCi1zdGF0aWMgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2xvYWRlZF9kb21haW5zOwotCi0KLS8qIFJldHVybiBhIGRhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBkZXNjcmliZWQgYnkKLSAgIHRoZSBET01BSU5OQU1FIGFuZCBDQVRFR09SWSBwYXJhbWV0ZXJzIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudGx5Ci0gICBlc3RhYmxpc2hlZCBiaW5kaW5ncy4gICovCi1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKLV9ubF9maW5kX2RvbWFpbiAoZGlybmFtZSwgbG9jYWxlLCBkb21haW5uYW1lKQotICAgICBjb25zdCBjaGFyICpkaXJuYW1lOwotICAgICBjaGFyICpsb2NhbGU7Ci0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci17Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJldHZhbDsKLSAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7Ci0gIGNvbnN0IGNoYXIgKm1vZGlmaWVyOwotICBjb25zdCBjaGFyICp0ZXJyaXRvcnk7Ci0gIGNvbnN0IGNoYXIgKmNvZGVzZXQ7Ci0gIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldDsKLSAgY29uc3QgY2hhciAqc3BlY2lhbDsKLSAgY29uc3QgY2hhciAqc3BvbnNvcjsKLSAgY29uc3QgY2hhciAqcmV2aXNpb247Ci0gIGNvbnN0IGNoYXIgKmFsaWFzX3ZhbHVlOwotICBpbnQgbWFzazsKLQotICAvKiBMT0NBTEUgY2FuIGNvbnNpc3Qgb2YgdXAgdG8gZm91ciByZWNvZ25pemVkIHBhcnRzIGZvciB0aGUgWFBHIHN5bnRheDoKLQotCQlsYW5ndWFnZVtfdGVycml0b3J5Wy5jb2Rlc2V0XV1bQG1vZGlmaWVyXQotCi0gICAgIGFuZCBzaXggcGFydHMgZm9yIHRoZSBDRU4gc3ludGF4OgotCi0JbGFuZ3VhZ2VbX3RlcnJpdG9yeV1bK2F1ZGllbmNlXVsrc3BlY2lhbF1bLFtzcG9uc29yXVtfcmV2aXNpb25dXQotCi0gICAgIEJlc2lkZSB0aGUgZmlyc3QgYWxsIG9mIHRoZW0gYXJlIGFsbG93ZWQgdG8gYmUgbWlzc2luZy4gIElmIHRoZQotICAgICBmdWxsIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLCB0aGUgbGVzcyBzcGVjaWZpYyBvbmUgYXJlCi0gICAgIGxvb2tlZCBmb3IuICBUaGUgdmFyaW91cyBwYXJ0IHdpbGwgYmUgc3RyaXBwZWQgb2YgYWNjb3JkaW5nIHRvCi0gICAgIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0JCSgxKSByZXZpc2lvbgotCQkoMikgc3BvbnNvcgotCQkoMykgc3BlY2lhbAotCQkoNCkgY29kZXNldAotCQkoNSkgbm9ybWFsaXplZCBjb2Rlc2V0Ci0JCSg2KSB0ZXJyaXRvcnkKLQkJKDcpIGF1ZGllbmNlL21vZGlmaWVyCi0gICAqLwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSB0ZXN0ZWQgZm9yIHRoaXMgbG9jYWxlIGVudHJ5IHRoZXJlIGhhcyB0bwotICAgICBiZSBvbmUgZGF0YSBzZXQgaW4gdGhlIGxpc3Qgb2YgbG9hZGVkIGRvbWFpbnMuICAqLwotICByZXR2YWwgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKCZfbmxfbG9hZGVkX2RvbWFpbnMsIGRpcm5hbWUsCi0JCQkgICAgICAgc3RybGVuIChkaXJuYW1lKSArIDEsIDAsIGxvY2FsZSwgTlVMTCwgTlVMTCwKLQkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBkb21haW5uYW1lLCAwKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGtub3cgc29tZXRoaW5nIGFib3V0IHRoaXMgbG9jYWxlLiAgKi8KLSAgICAgIGludCBjbnQ7Ci0KLSAgICAgIGlmIChyZXR2YWwtPmRlY2lkZWQgPT0gMCkKLQlfbmxfbG9hZF9kb21haW4gKHJldHZhbCk7Ci0KLSAgICAgIGlmIChyZXR2YWwtPmRhdGEgIT0gTlVMTCkKLQlyZXR1cm4gcmV0dmFsOwotCi0gICAgICBmb3IgKGNudCA9IDA7IHJldHZhbC0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCi0JewotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRlY2lkZWQgPT0gMCkKLQkgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdKTsKLQotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgcmV0dXJuIGNudCA+PSAwID8gcmV0dmFsIDogTlVMTDsKLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICB9Ci0KLSAgLyogU2VlIHdoZXRoZXIgdGhlIGxvY2FsZSB2YWx1ZSBpcyBhbiBhbGlhcy4gIElmIHllcyBpdHMgdmFsdWUKLSAgICAgKm92ZXJ3cml0ZXMqIHRoZSBhbGlhcyBuYW1lLiAgTm8gdGVzdCBmb3IgdGhlIG9yaWdpbmFsIHZhbHVlIGlzCi0gICAgIGRvbmUuICAqLwotICBhbGlhc192YWx1ZSA9IF9ubF9leHBhbmRfYWxpYXMgKGxvY2FsZSk7Ci0gIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFsaWFzX3ZhbHVlKSArIDE7Ci0gICAgICBsb2NhbGUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAobG9jYWxlID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIG1lbWNweSAobG9jYWxlLCBhbGlhc192YWx1ZSwgbGVuKTsKLSAgICB9Ci0KLSAgLyogTm93IHdlIGRldGVybWluZSB0aGUgc2luZ2xlIHBhcnRzIG9mIHRoZSBsb2NhbGUgbmFtZS4gIEZpcnN0Ci0gICAgIGxvb2sgZm9yIHRoZSBsYW5ndWFnZS4gIFRlcm1pbmF0aW9uIHN5bWJvbHMgYXJlIGBfJyBhbmQgYEAnIGlmCi0gICAgIHdlIHVzZSBYUEc0IHN0eWxlLCBhbmQgYF8nLCBgKycsIGFuZCBgLCcgaWYgd2UgdXNlIENFTiBzeW50YXguICAqLwotICBtYXNrID0gX25sX2V4cGxvZGVfbmFtZSAobG9jYWxlLCAmbGFuZ3VhZ2UsICZtb2RpZmllciwgJnRlcnJpdG9yeSwKLQkJCSAgICZjb2Rlc2V0LCAmbm9ybWFsaXplZF9jb2Rlc2V0LCAmc3BlY2lhbCwKLQkJCSAgICZzcG9uc29yLCAmcmV2aXNpb24pOwotCi0gIC8qIENyZWF0ZSBhbGwgcG9zc2libGUgbG9jYWxlIGVudHJpZXMgd2hpY2ggbWlnaHQgYmUgaW50ZXJlc3RlZCBpbgotICAgICBnZW5lcmFsaXphdGlvbi4gICovCi0gIHJldHZhbCA9IF9ubF9tYWtlX2wxMG5mbGlzdCAoJl9ubF9sb2FkZWRfZG9tYWlucywgZGlybmFtZSwKLQkJCSAgICAgICBzdHJsZW4gKGRpcm5hbWUpICsgMSwgbWFzaywgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwKLQkJCSAgICAgICBjb2Rlc2V0LCBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBzcGVjaWFsLAotCQkJICAgICAgIHNwb25zb3IsIHJldmlzaW9uLCBkb21haW5uYW1lLCAxKTsKLSAgaWYgKHJldHZhbCA9PSBOVUxMKQotICAgIC8qIFRoaXMgbWVhbnMgd2UgYXJlIG91dCBvZiBjb3JlLiAgKi8KLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAocmV0dmFsLT5kZWNpZGVkID09IDApCi0gICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwpOwotICBpZiAocmV0dmFsLT5kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgaW50IGNudDsKLSAgICAgIGZvciAoY250ID0gMDsgcmV0dmFsLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKLQl7Ci0JICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGVjaWRlZCA9PSAwKQotCSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbC0+c3VjY2Vzc29yW2NudF0pOwotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgcm9vbSBmb3IgYW4gYWxpYXMgd2FzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gIEZyZWUgaXQgbm93LiAgKi8KLSAgaWYgKGFsaWFzX3ZhbHVlICE9IE5VTEwpCi0gICAgZnJlZSAobG9jYWxlKTsKLQotICByZXR1cm4gcmV0dmFsOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9nZXR0ZXh0LmMgYi9pbnRsL2dldHRleHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzNmQyMS4uMDAwMDAwMAotLS0gYS9pbnRsL2dldHRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIGdldHRleHQoMykgZnVuY3Rpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBfX25lZWRfTlVMTAotIyBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jIGlmZGVmIFNURENfSEVBREVSUwotIyAgaW5jbHVkZSA8c3RkbGliLmg+CQkvKiBKdXN0IGZvciBOVUxMLiAgKi8KLSMgZWxzZQotIyAgaWZkZWYgSEFWRV9TVFJJTkdfSAotIyAgIGluY2x1ZGUgPHN0cmluZy5oPgotIyAgZWxzZQotIyAgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBHRVRURVhUIF9fZ2V0dGV4dAotIyBkZWZpbmUgREdFVFRFWFQgX19kZ2V0dGV4dAotI2Vsc2UKLSMgZGVmaW5lIEdFVFRFWFQgZ2V0dGV4dF9fCi0jIGRlZmluZSBER0VUVEVYVCBkZ2V0dGV4dF9fCi0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0gICB0ZXh0KS4gICovCi1jaGFyICoKLUdFVFRFWFQgKG1zZ2lkKQotICAgICBjb25zdCBjaGFyICptc2dpZDsKLXsKLSAgcmV0dXJuIERHRVRURVhUIChOVUxMLCBtc2dpZCk7Ci19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX2dldHRleHQsIGdldHRleHQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2dldHRleHQuaCBiL2ludGwvZ2V0dGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjRiOWUzLi4wMDAwMDAwCi0tLSBhL2ludGwvZ2V0dGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qIEludGVybmFsIGhlYWRlciBmb3IgR05VIGdldHRleHQgaW50ZXJuYXRpb25hbGl6YXRpb24gZnVuY3Rpb25zCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfR0VUVEVYVF9ICi0jZGVmaW5lIF9HRVRURVhUX0ggMQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmIEhBVkVfTElNSVRTX0ggfHwgX0xJQkMKLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBUaGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBHTlUgbWVzc2FnZSBjYXRhbG9nIGZvcm1hdC4gICovCi0jZGVmaW5lIF9NQUdJQyAweDk1MDQxMmRlCi0jZGVmaW5lIF9NQUdJQ19TV0FQUEVEIDB4ZGUxMjA0OTUKLQotLyogUmV2aXNpb24gbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgdXNlZCAubW8gKGJpbmFyeSkgZmlsZSBmb3JtYXQuICAqLwotI2RlZmluZSBNT19SRVZJU0lPTl9OVU1CRVIgMAotCi0vKiBUaGUgZm9sbG93aW5nIGNvbnRvcnRpb25zIGFyZSBhbiBhdHRlbXB0IHRvIHVzZSB0aGUgQyBwcmVwcm9jZXNzb3IKLSAgIHRvIGRldGVybWluZSBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIHRoYXQgaXMgMzIgYml0cyB3aWRlLiAgQW4KLSAgIGFsdGVybmF0aXZlIGFwcHJvYWNoIGlzIHRvIHVzZSBhdXRvY29uZidzIEFDX0NIRUNLX1NJWkVPRiBtYWNybywgYnV0Ci0gICBkb2luZyB0aGF0IHdvdWxkIHJlcXVpcmUgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBjb21waWxlIGFuZCAqcnVuKgotICAgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlLiAgTG9jYWxseSBydW5uaW5nIGNyb3NzLWNvbXBpbGVkIGV4ZWN1dGFibGVzCi0gICBpcyB1c3VhbGx5IG5vdCBwb3NzaWJsZS4gICovCi0KLSNpZiBfX1NURENfXwotIyBkZWZpbmUgVUlOVF9NQVhfMzJfQklUUyA0Mjk0OTY3Mjk1VQotI2Vsc2UKLSMgZGVmaW5lIFVJTlRfTUFYXzMyX0JJVFMgMHhGRkZGRkZGRgotI2VuZGlmCi0KLS8qIElmIFVJTlRfTUFYIGlzbid0IGRlZmluZWQsIGFzc3VtZSBpdCdzIGEgMzItYml0IHR5cGUuCi0gICBUaGlzIHNob3VsZCBiZSB2YWxpZCBmb3IgYWxsIHN5c3RlbXMgR05VIGNhcmVzIGFib3V0IGJlY2F1c2UKLSAgIHRoYXQgZG9lc24ndCBpbmNsdWRlIDE2LWJpdCBzeXN0ZW1zLCBhbmQgb25seSBtb2Rlcm4gc3lzdGVtcwotICAgKHRoYXQgY2VydGFpbmx5IGhhdmUgPGxpbWl0cy5oPikgaGF2ZSA2NCstYml0IGludGVncmFsIHR5cGVzLiAgKi8KLQotI2lmbmRlZiBVSU5UX01BWAotIyBkZWZpbmUgVUlOVF9NQVggVUlOVF9NQVhfMzJfQklUUwotI2VuZGlmCi0KLSNpZiBVSU5UX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCi10eXBlZGVmIHVuc2lnbmVkIG5sc191aW50MzI7Ci0jZWxzZQotIyBpZiBVU0hSVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBubHNfdWludDMyOwotIyBlbHNlCi0jICBpZiBVTE9OR19NQVggPT0gVUlOVF9NQVhfMzJfQklUUwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIG5sc191aW50MzI7Ci0jICBlbHNlCi0gIC8qIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBpbnRlbmRlZCB0byB0aHJvdyBhbiBlcnJvci4gIFVzaW5nICNlcnJvciBpcwotICAgICBub3QgcG9ydGFibGUgZW5vdWdoLiAgKi8KLSAgIkNhbm5vdCBkZXRlcm1pbmUgdW5zaWduZWQgMzItYml0IGRhdGEgdHlwZS4iCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLQotLyogSGVhZGVyIGZvciBiaW5hcnkgLm1vIGZpbGUgZm9ybWF0LiAgKi8KLXN0cnVjdCBtb19maWxlX2hlYWRlcgotewotICAvKiBUaGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgbmxzX3VpbnQzMiBtYWdpYzsKLSAgLyogVGhlIHJldmlzaW9uIG51bWJlciBvZiB0aGUgZmlsZSBmb3JtYXQuICAqLwotICBubHNfdWludDMyIHJldmlzaW9uOwotICAvKiBUaGUgbnVtYmVyIG9mIHN0cmluZ3MgcGFpcnMuICAqLwotICBubHNfdWludDMyIG5zdHJpbmdzOwotICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIG9yaWdpbmFsIHN0cmluZ3MuICAqLwotICBubHNfdWludDMyIG9yaWdfdGFiX29mZnNldDsKLSAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiB0cmFuc2xhdGlvbiBzdHJpbmdzLiAgKi8KLSAgbmxzX3VpbnQzMiB0cmFuc190YWJfb2Zmc2V0OwotICAvKiBTaXplIG9mIGhhc2hpbmcgdGFibGUuICAqLwotICBubHNfdWludDMyIGhhc2hfdGFiX3NpemU7Ci0gIC8qIE9mZnNldCBvZiBmaXJzdCBoYXNoaW5nIGVudHJ5LiAgKi8KLSAgbmxzX3VpbnQzMiBoYXNoX3RhYl9vZmZzZXQ7Ci19OwotCi1zdHJ1Y3Qgc3RyaW5nX2Rlc2MKLXsKLSAgLyogTGVuZ3RoIG9mIGFkZHJlc3NlZCBzdHJpbmcuICAqLwotICBubHNfdWludDMyIGxlbmd0aDsKLSAgLyogT2Zmc2V0IG9mIHN0cmluZyBpbiBmaWxlLiAgKi8KLSAgbmxzX3VpbnQzMiBvZmZzZXQ7Ci19OwotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotI2VuZGlmCS8qIGdldHRleHQuaCAgKi8KZGlmZiAtLWdpdCBhL2ludGwvZ2V0dGV4dFAuaCBiL2ludGwvZ2V0dGV4dFAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4ZDU1Mi4uMDAwMDAwMAotLS0gYS9pbnRsL2dldHRleHRQLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBIZWFkZXIgZGVzY3JpYmluZyBpbnRlcm5hbHMgb2YgZ2V0dGV4dCBsaWJyYXJ5Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0dFVFRFWFRQX0gKLSNkZWZpbmUgX0dFVFRFWFRQX0gKLQotI2luY2x1ZGUgImxvYWRpbmZvLmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmbmRlZiBQQVJBTVMKLSMgaWYgX19TVERDX18KLSMgIGRlZmluZSBQQVJBTVMoYXJncykgYXJncwotIyBlbHNlCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpICgpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBXCi0jIGRlZmluZSBXKGZsYWcsIGRhdGEpICgoZmxhZykgPyBTV0FQIChkYXRhKSA6IChkYXRhKSkKLSNlbmRpZgotCi0KLXN0YXRpYyBubHNfdWludDMyIFNXQVAgUEFSQU1TICgobmxzX3VpbnQzMiBpKSk7Ci0KLXN0YXRpYyBpbmxpbmUgbmxzX3VpbnQzMgotU1dBUCAoaSkKLSAgICAgbmxzX3VpbnQzMiBpOwotewotICByZXR1cm4gKGkgPDwgMjQpIHwgKChpICYgMHhmZjAwKSA8PCA4KSB8ICgoaSA+PiA4KSAmIDB4ZmYwMCkgfCAoaSA+PiAyNCk7Ci19Ci0KLQotc3RydWN0IGxvYWRlZF9kb21haW4KLXsKLSAgY29uc3QgY2hhciAqZGF0YTsKLSAgaW50IG11c3Rfc3dhcDsKLSAgbmxzX3VpbnQzMiBuc3RyaW5nczsKLSAgc3RydWN0IHN0cmluZ19kZXNjICpvcmlnX3RhYjsKLSAgc3RydWN0IHN0cmluZ19kZXNjICp0cmFuc190YWI7Ci0gIG5sc191aW50MzIgaGFzaF9zaXplOwotICBubHNfdWludDMyICpoYXNoX3RhYjsKLX07Ci0KLXN0cnVjdCBiaW5kaW5nCi17Ci0gIHN0cnVjdCBiaW5kaW5nICpuZXh0OwotICBjaGFyICpkb21haW5uYW1lOwotICBjaGFyICpkaXJuYW1lOwotfTsKLQotc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2ZpbmRfZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZGlybmFtZSwKLQkJCQkJCSBjaGFyICpfX2xvY2FsZSwKLQkJCQkJCSBjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKLXZvaWQgX25sX2xvYWRfZG9tYWluIFBBUkFNUyAoKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9fZG9tYWluKSk7Ci0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0jZW5kaWYgLyogZ2V0dGV4dFAuaCAgKi8KZGlmZiAtLWdpdCBhL2ludGwvaGFzaC1zdHJpbmcuaCBiL2ludGwvaGFzaC1zdHJpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2ZTg0MS4uMDAwMDAwMAotLS0gYS9pbnRsL2hhc2gtc3RyaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKiBJbXBsZW1lbnRzIGEgc3RyaW5nIGhhc2hpbmcgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfVkFMVUVTX0gKLSMgaW5jbHVkZSA8dmFsdWVzLmg+Ci0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhBcmdzKSBBcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoQXJncykgKCkKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBhc3N1bWUgdG8gaGF2ZSBgdW5zaWduZWQgbG9uZyBpbnQnIHZhbHVlIHdpdGggYXQgbGVhc3QgMzIgYml0cy4gICovCi0jZGVmaW5lIEhBU0hXT1JEQklUUyAzMgotCi0KLS8qIERlZmluZXMgdGhlIHNvIGNhbGxlZCBgaGFzaHBqdycgZnVuY3Rpb24gYnkgUC5KLiBXZWluYmVyZ2VyCi0gICBbc2VlIEFoby9TZXRoaS9VbGxtYW4sIENPTVBJTEVSUzogUHJpbmNpcGxlcywgVGVjaG5pcXVlcyBhbmQgVG9vbHMsCi0gICAxOTg2LCAxOTg3IEJlbGwgVGVsZXBob25lIExhYm9yYXRvcmllcywgSW5jLl0gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBoYXNoX3N0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICpfX3N0cl9wYXJhbSkpOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLWhhc2hfc3RyaW5nIChzdHJfcGFyYW0pCi0gICAgIGNvbnN0IGNoYXIgKnN0cl9wYXJhbTsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnQgaHZhbCwgZzsKLSAgY29uc3QgY2hhciAqc3RyID0gc3RyX3BhcmFtOwotCi0gIC8qIENvbXB1dGUgdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBnaXZlbiBzdHJpbmcuICAqLwotICBodmFsID0gMDsKLSAgd2hpbGUgKCpzdHIgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBodmFsIDw8PSA0OwotICAgICAgaHZhbCArPSAodW5zaWduZWQgbG9uZykgKnN0cisrOwotICAgICAgZyA9IGh2YWwgJiAoKHVuc2lnbmVkIGxvbmcpIDB4ZiA8PCAoSEFTSFdPUkRCSVRTIC0gNCkpOwotICAgICAgaWYgKGcgIT0gMCkKLQl7Ci0JICBodmFsIF49IGcgPj4gKEhBU0hXT1JEQklUUyAtIDgpOwotCSAgaHZhbCBePSBnOwotCX0KLSAgICB9Ci0gIHJldHVybiBodmFsOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9pbnRsLWNvbXBhdC5jIGIvaW50bC9pbnRsLWNvbXBhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDNlZmEwLi4wMDAwMDAwCi0tLSBhL2ludGwvaW50bC1jb21wYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qIGludGwtY29tcGF0LmMgLSBTdHViIGZ1bmN0aW9ucyB0byBjYWxsIGdldHRleHQgZnVuY3Rpb25zIGZyb20gR05VIGdldHRleHQKLSAgIExpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLQotI3VuZGVmIGdldHRleHQKLSN1bmRlZiBkZ2V0dGV4dAotI3VuZGVmIGRjZ2V0dGV4dAotI3VuZGVmIHRleHRkb21haW4KLSN1bmRlZiBiaW5kdGV4dGRvbWFpbgotCi0KLWNoYXIgKgotYmluZHRleHRkb21haW4gKGRvbWFpbm5hbWUsIGRpcm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7Ci17Ci0gIHJldHVybiBiaW5kdGV4dGRvbWFpbl9fIChkb21haW5uYW1lLCBkaXJuYW1lKTsKLX0KLQotCi1jaGFyICoKLWRjZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICptc2dpZDsKLSAgICAgaW50IGNhdGVnb3J5OwotewotICByZXR1cm4gZGNnZXR0ZXh0X18gKGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSk7Ci19Ci0KLQotY2hhciAqCi1kZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotewotICByZXR1cm4gZGdldHRleHRfXyAoZG9tYWlubmFtZSwgbXNnaWQpOwotfQotCi0KLWNoYXIgKgotZ2V0dGV4dCAobXNnaWQpCi0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotewotICByZXR1cm4gZ2V0dGV4dF9fIChtc2dpZCk7Ci19Ci0KLQotY2hhciAqCi10ZXh0ZG9tYWluIChkb21haW5uYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotewotICByZXR1cm4gdGV4dGRvbWFpbl9fIChkb21haW5uYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2ludGwvaW50bGguaW5zdC5pbiBiL2ludGwvaW50bGguaW5zdC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkMzIzYy4uMDAwMDAwMAotLS0gYS9pbnRsL2ludGxoLmluc3QuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0jaWZuZGVmIF9MSUJJTlRMX0gKLSNkZWZpbmUgX0xJQklOVExfSAkxCi0KLUBJTkNMVURFX0xPQ0FMRV9IQAotCi0vKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKLSAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLwotI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCi0KLSNpZm5kZWYgUEFSQU1TCi0jIGlmIF9fU1REQ19fCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKLSMgZWxzZQotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0gICB0ZXh0KS4gICovCi1leHRlcm4gY2hhciAqZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KLWV4dGVybiBjaGFyICpkZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCi0JCQkJaW50IF9fY2F0ZWdvcnkpKTsKLQotCi0vKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KLSAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCi0gICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KLWV4dGVybiBjaGFyICp0ZXh0ZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotCi0vKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKLQotCi0vKiBPcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLiAgKi8KLSNpZiBkZWZpbmVkIF9fT1BUSU1JWkVECi0vKiBUaGVzZSBtdXN0IGJlIGEgbWFjcm8uICBJbmxpbmVkIGZ1bmN0aW9ucyBhcmUgdXNlbGVzcyBiZWNhdXNlIHRoZQotICAgYF9fYnVpbHRpbl9jb25zdGFudF9wJyBwcmVkaWNhdGUgaW4gZGNnZXR0ZXh0IHdvdWxkIGFsd2F5cyByZXR1cm4KLSAgIGZhbHNlLiAgKi8KLQotIyBkZWZpbmUgZ2V0dGV4dChtc2dpZCkgZGdldHRleHQgKChjaGFyICopIDAsIG1zZ2lkKQotCi0jIGRlZmluZSBkZ2V0dGV4dChkb21haW5uYW1lLCBtc2dpZCkJCQkJCSAgICAgIFwKLSAgZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgTENfTUVTU0FHRVMpCi0KLSMgaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDcpCi0vKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIGxvYWRtc2djYXQuYy4gIFdlIG5lZWQgYSBzaWduLAotICAgd2hldGhlciBhIG5ldyBjYXRhbG9nIHdhcyBsb2FkZWQsIHdoaWNoIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYWxsCi0gICB0cmFuc2xhdGlvbnMuICAqLwotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCi0jICBkZWZpbmUgZGNnZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSkJCQkgICAgICBcCi0gIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKLSAgICh7CQkJCQkJCQkJICAgICAgXAotICAgICBjaGFyICpfX3Jlc3VsdDsJCQkJCQkJICAgICAgXAotICAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKG1zZ2lkKSkJCQkJCSAgICAgIFwKLSAgICAgICB7CQkJCQkJCQkgICAgICBcCi0JIHN0YXRpYyBjaGFyICpfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0JIHN0YXRpYyBpbnQgX19jYXRhbG9nX2NvdW50ZXJfXzsJCQkJICAgICAgXAotCSBpZiAoISBfX3RyYW5zbGF0aW9uX18gfHwgX19jYXRhbG9nX2NvdW50ZXJfXyAhPSBfbmxfbXNnX2NhdF9jbnRyKSAgICBcCi0JICAgewkJCQkJCQkJICAgICAgXAotCSAgICAgX190cmFuc2xhdGlvbl9fID0JCQkJCQkgICAgICBcCi0JICAgICAgIChkY2dldHRleHQpICgoZG9tYWlubmFtZSksIChtc2dpZCksIChjYXRlZ29yeSkpOwkJICAgICAgXAotCSAgICAgX19jYXRhbG9nX2NvdW50ZXJfXyA9IF9ubF9tc2dfY2F0X2NudHI7CQkJICAgICAgXAotCSAgIH0JCQkJCQkJCSAgICAgIFwKLQkgX19yZXN1bHQgPSBfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0gICAgICAgfQkJCQkJCQkJICAgICAgXAotICAgICBlbHNlCQkJCQkJCQkgICAgICBcCi0gICAgICAgX19yZXN1bHQgPSAoZGNnZXR0ZXh0KSAoKGRvbWFpbm5hbWUpLCAobXNnaWQpLCAoY2F0ZWdvcnkpKTsJICAgICAgXAotICAgICBfX3Jlc3VsdDsJCQkJCQkJCSAgICAgIFwKLSAgICB9KSkKLSMgZW5kaWYKLSNlbmRpZiAvKiBPcHRpbWl6aW5nLiAqLwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBsaWJpbnRsLmggKi8KZGlmZiAtLWdpdCBhL2ludGwvbDEwbmZsaXN0LmMgYi9pbnRsL2wxMG5mbGlzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTJiYzEzLi4wMDAwMDAwCi0tLSBhL2ludGwvbDEwbmZsaXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyogSGFuZGxlIGxpc3Qgb2YgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0KLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgX0dOVV9TT1VSQ0UKLSMgIGRlZmluZSBfR05VX1NPVVJDRQkxCi0jIGVuZGlmCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBpZm5kZWYgbWVtY3B5Ci0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQotIyBlbmRpZgotI2VuZGlmCi0jaWYgIUhBVkVfU1RSQ0hSICYmICFkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBzdHJjaHIKLSMgIGRlZmluZSBzdHJjaHIgaW5kZXgKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfQVJHWl9ICi0jIGluY2x1ZGUgPGFyZ3ouaD4KLSNlbmRpZgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsb2FkaW5mby5oIgotCi0vKiBPbiBzb21lIHN0cmFuZ2Ugc3lzdGVtcyBzdGlsbCBubyBkZWZpbml0aW9uIG9mIE5VTEwgaXMgZm91bmQuICBTaWdoISAgKi8KLSNpZm5kZWYgTlVMTAotIyBpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi0jICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLSMgZWxzZQotIyAgZGVmaW5lIE5VTEwgMAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmZGVmIF9MSUJDCi0vKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLSAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgZGVmaW5lIHN0cGNweShkZXN0LCBzcmMpIF9fc3RwY3B5KGRlc3QsIHNyYykKLSNlbHNlCi0jIGlmbmRlZiBIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKnN0cGNweSBQQVJBTVMgKChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBEZWZpbmUgZnVuY3Rpb24gd2hpY2ggYXJlIHVzdWFsbHkgbm90IGF2YWlsYWJsZS4gICovCi0KLSNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9DT1VOVAotLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gQVJHWi4gICovCi1zdGF0aWMgc2l6ZV90IGFyZ3pfY291bnRfXyBQQVJBTVMgKChjb25zdCBjaGFyICphcmd6LCBzaXplX3QgbGVuKSk7Ci0KLXN0YXRpYyBzaXplX3QKLWFyZ3pfY291bnRfXyAoYXJneiwgbGVuKQotICAgICBjb25zdCBjaGFyICphcmd6OwotICAgICBzaXplX3QgbGVuOwotewotICBzaXplX3QgY291bnQgPSAwOwotICB3aGlsZSAobGVuID4gMCkKLSAgICB7Ci0gICAgICBzaXplX3QgcGFydF9sZW4gPSBzdHJsZW4gKGFyZ3opOwotICAgICAgYXJneiArPSBwYXJ0X2xlbiArIDE7Ci0gICAgICBsZW4gLT0gcGFydF9sZW4gKyAxOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0gIHJldHVybiBjb3VudDsKLX0KLSMgdW5kZWYgX19hcmd6X2NvdW50Ci0jIGRlZmluZSBfX2FyZ3pfY291bnQoYXJneiwgbGVuKSBhcmd6X2NvdW50X18gKGFyZ3osIGxlbikKLSNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfX19BUkdaX0NPVU5UICovCi0KLSNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLS8qIE1ha2UgJ1wwJyBzZXBhcmF0ZWQgYXJnIHZlY3RvciBBUkdaIHByaW50YWJsZSBieSBjb252ZXJ0aW5nIGFsbCB0aGUgJ1wwJ3MKLSAgIGV4Y2VwdCB0aGUgbGFzdCBpbnRvIHRoZSBjaGFyYWN0ZXIgU0VQLiAgKi8KLXN0YXRpYyB2b2lkIGFyZ3pfc3RyaW5naWZ5X18gUEFSQU1TICgoY2hhciAqYXJneiwgc2l6ZV90IGxlbiwgaW50IHNlcCkpOwotCi1zdGF0aWMgdm9pZAotYXJnel9zdHJpbmdpZnlfXyAoYXJneiwgbGVuLCBzZXApCi0gICAgIGNoYXIgKmFyZ3o7Ci0gICAgIHNpemVfdCBsZW47Ci0gICAgIGludCBzZXA7Ci17Ci0gIHdoaWxlIChsZW4gPiAwKQotICAgIHsKLSAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7Ci0gICAgICBhcmd6ICs9IHBhcnRfbGVuOwotICAgICAgbGVuIC09IHBhcnRfbGVuICsgMTsKLSAgICAgIGlmIChsZW4gPiAwKQotCSphcmd6KysgPSBzZXA7Ci0gICAgfQotfQotIyB1bmRlZiBfX2FyZ3pfc3RyaW5naWZ5Ci0jIGRlZmluZSBfX2FyZ3pfc3RyaW5naWZ5KGFyZ3osIGxlbiwgc2VwKSBhcmd6X3N0cmluZ2lmeV9fIChhcmd6LCBsZW4sIHNlcCkKLSNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfX19BUkdaX1NUUklOR0lGWSAqLwotCi0jaWYgIWRlZmluZWQgX0xJQkMgJiYgIWRlZmluZWQgSEFWRV9fX0FSR1pfTkVYVAotc3RhdGljIGNoYXIgKmFyZ3pfbmV4dF9fIFBBUkFNUyAoKGNoYXIgKmFyZ3osIHNpemVfdCBhcmd6X2xlbiwKLQkJCQkgIGNvbnN0IGNoYXIgKmVudHJ5KSk7Ci0KLXN0YXRpYyBjaGFyICoKLWFyZ3pfbmV4dF9fIChhcmd6LCBhcmd6X2xlbiwgZW50cnkpCi0gICAgIGNoYXIgKmFyZ3o7Ci0gICAgIHNpemVfdCBhcmd6X2xlbjsKLSAgICAgY29uc3QgY2hhciAqZW50cnk7Ci17Ci0gIGlmIChlbnRyeSkKLSAgICB7Ci0gICAgICBpZiAoZW50cnkgPCBhcmd6ICsgYXJnel9sZW4pCi0gICAgICAgIGVudHJ5ID0gc3RyY2hyIChlbnRyeSwgJ1wwJykgKyAxOwotCi0gICAgICByZXR1cm4gZW50cnkgPj0gYXJneiArIGFyZ3pfbGVuID8gTlVMTCA6IChjaGFyICopIGVudHJ5OwotICAgIH0KLSAgZWxzZQotICAgIGlmIChhcmd6X2xlbiA+IDApCi0gICAgICByZXR1cm4gYXJnejsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLX0KLSMgdW5kZWYgX19hcmd6X25leHQKLSMgZGVmaW5lIF9fYXJnel9uZXh0KGFyZ3osIGxlbiwgZW50cnkpIGFyZ3pfbmV4dF9fIChhcmd6LCBsZW4sIGVudHJ5KQotI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfTkVYVCAqLwotCi0KLS8qIFJldHVybiBudW1iZXIgb2YgYml0cyBzZXQgaW4gWC4gICovCi1zdGF0aWMgaW50IHBvcCBQQVJBTVMgKChpbnQgeCkpOwotCi1zdGF0aWMgaW5saW5lIGludAotcG9wICh4KQotICAgICBpbnQgeDsKLXsKLSAgLyogV2UgYXNzdW1lIHRoYXQgbm8gbW9yZSB0aGFuIDE2IGJpdHMgYXJlIHVzZWQuICAqLwotICB4ID0gKCh4ICYgfjB4NTU1NSkgPj4gMSkgKyAoeCAmIDB4NTU1NSk7Ci0gIHggPSAoKHggJiB+MHgzMzMzKSA+PiAyKSArICh4ICYgMHgzMzMzKTsKLSAgeCA9ICgoeCA+PiA0KSArIHgpICYgMHgwZjBmOwotICB4ID0gKCh4ID4+IDgpICsgeCkgJiAweGZmOwotCi0gIHJldHVybiB4OwotfQotCi0MCi1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKLV9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlybGlzdCwgZGlybGlzdF9sZW4sIG1hc2ssIGxhbmd1YWdlLAotCQkgICAgdGVycml0b3J5LCBjb2Rlc2V0LCBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBzcGVjaWFsLAotCQkgICAgc3BvbnNvciwgcmV2aXNpb24sIGZpbGVuYW1lLCBkb19hbGxvY2F0ZSkKLSAgICAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKmwxMG5maWxlX2xpc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKmRpcmxpc3Q7Ci0gICAgIHNpemVfdCBkaXJsaXN0X2xlbjsKLSAgICAgaW50IG1hc2s7Ci0gICAgIGNvbnN0IGNoYXIgKmxhbmd1YWdlOwotICAgICBjb25zdCBjaGFyICp0ZXJyaXRvcnk7Ci0gICAgIGNvbnN0IGNoYXIgKmNvZGVzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldDsKLSAgICAgY29uc3QgY2hhciAqbW9kaWZpZXI7Ci0gICAgIGNvbnN0IGNoYXIgKnNwZWNpYWw7Ci0gICAgIGNvbnN0IGNoYXIgKnNwb25zb3I7Ci0gICAgIGNvbnN0IGNoYXIgKnJldmlzaW9uOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgaW50IGRvX2FsbG9jYXRlOwotewotICBjaGFyICphYnNfZmlsZW5hbWU7Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmxhc3QgPSBOVUxMOwotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpyZXR2YWw7Ci0gIGNoYXIgKmNwOwotICBzaXplX3QgZW50cmllczsKLSAgaW50IGNudDsKLQotICAvKiBBbGxvY2F0ZSByb29tIGZvciB0aGUgZnVsbCBmaWxlIG5hbWUuICAqLwotICBhYnNfZmlsZW5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGRpcmxpc3RfbGVuCi0JCQkJICArIHN0cmxlbiAobGFuZ3VhZ2UpCi0JCQkJICArICgobWFzayAmIFRFUlJJVE9SWSkgIT0gMAotCQkJCSAgICAgPyBzdHJsZW4gKHRlcnJpdG9yeSkgKyAxIDogMCkKLQkJCQkgICsgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDAKLQkJCQkgICAgID8gc3RybGVuIChjb2Rlc2V0KSArIDEgOiAwKQotCQkJCSAgKyAoKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwCi0JCQkJICAgICA/IHN0cmxlbiAobm9ybWFsaXplZF9jb2Rlc2V0KSArIDEgOiAwKQotCQkJCSAgKyAoKChtYXNrICYgWFBHX01PRElGSUVSKSAhPSAwCi0JCQkJICAgICAgfHwgKG1hc2sgJiBDRU5fQVVESUVOQ0UpICE9IDApCi0JCQkJICAgICA/IHN0cmxlbiAobW9kaWZpZXIpICsgMSA6IDApCi0JCQkJICArICgobWFzayAmIENFTl9TUEVDSUFMKSAhPSAwCi0JCQkJICAgICA/IHN0cmxlbiAoc3BlY2lhbCkgKyAxIDogMCkKLQkJCQkgICsgKCgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwCi0JCQkJICAgICAgfHwgKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDApCi0JCQkJICAgICA/ICgxICsgKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDAKLQkJCQkJICAgICA/IHN0cmxlbiAoc3BvbnNvcikgKyAxIDogMCkKLQkJCQkJKyAoKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDAKLQkJCQkJICAgPyBzdHJsZW4gKHJldmlzaW9uKSArIDEgOiAwKSkgOiAwKQotCQkJCSAgKyAxICsgc3RybGVuIChmaWxlbmFtZSkgKyAxKTsKLQotICBpZiAoYWJzX2ZpbGVuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dmFsID0gTlVMTDsKLSAgbGFzdCA9IE5VTEw7Ci0KLSAgLyogQ29uc3RydWN0IGZpbGUgbmFtZS4gICovCi0gIG1lbWNweSAoYWJzX2ZpbGVuYW1lLCBkaXJsaXN0LCBkaXJsaXN0X2xlbik7Ci0gIF9fYXJnel9zdHJpbmdpZnkgKGFic19maWxlbmFtZSwgZGlybGlzdF9sZW4sICc6Jyk7Ci0gIGNwID0gYWJzX2ZpbGVuYW1lICsgKGRpcmxpc3RfbGVuIC0gMSk7Ci0gICpjcCsrID0gJy8nOwotICBjcCA9IHN0cGNweSAoY3AsIGxhbmd1YWdlKTsKLQotICBpZiAoKG1hc2sgJiBURVJSSVRPUlkpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnXyc7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIHRlcnJpdG9yeSk7Ci0gICAgfQotICBpZiAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICcuJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgY29kZXNldCk7Ci0gICAgfQotICBpZiAoKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwKQotICAgIHsKLSAgICAgICpjcCsrID0gJy4nOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLCBub3JtYWxpemVkX2NvZGVzZXQpOwotICAgIH0KLSAgaWYgKChtYXNrICYgKFhQR19NT0RJRklFUiB8IENFTl9BVURJRU5DRSkpICE9IDApCi0gICAgewotICAgICAgLyogVGhpcyBjb21wb25lbnQgY2FuIGJlIHBhcnQgb2YgYm90aCBzeW50YWNlcyBidXQgaGFzIGRpZmZlcmVudAotCSBsZWFkaW5nIGNoYXJhY3RlcnMuICBGb3IgQ0VOIHdlIHVzZSBgKycsIGVsc2UgYEAnLiAgKi8KLSAgICAgICpjcCsrID0gKG1hc2sgJiBDRU5fQVVESUVOQ0UpICE9IDAgPyAnKycgOiAnQCc7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIG1vZGlmaWVyKTsKLSAgICB9Ci0gIGlmICgobWFzayAmIENFTl9TUEVDSUFMKSAhPSAwKQotICAgIHsKLSAgICAgICpjcCsrID0gJysnOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLCBzcGVjaWFsKTsKLSAgICB9Ci0gIGlmICgobWFzayAmIChDRU5fU1BPTlNPUiB8IENFTl9SRVZJU0lPTikpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnLCc7Ci0gICAgICBpZiAoKG1hc2sgJiBDRU5fU1BPTlNPUikgIT0gMCkKLQljcCA9IHN0cGNweSAoY3AsIHNwb25zb3IpOwotICAgICAgaWYgKChtYXNrICYgQ0VOX1JFVklTSU9OKSAhPSAwKQotCXsKLQkgICpjcCsrID0gJ18nOwotCSAgY3AgPSBzdHBjcHkgKGNwLCByZXZpc2lvbik7Ci0JfQotICAgIH0KLQotICAqY3ArKyA9ICcvJzsKLSAgc3RwY3B5IChjcCwgZmlsZW5hbWUpOwotCi0gIC8qIExvb2sgaW4gbGlzdCBvZiBhbHJlYWR5IGxvYWRlZCBkb21haW5zIHdoZXRoZXIgaXQgaXMgYWxyZWFkeQotICAgICBhdmFpbGFibGUuICAqLwotICBsYXN0ID0gTlVMTDsKLSAgZm9yIChyZXR2YWwgPSAqbDEwbmZpbGVfbGlzdDsgcmV0dmFsICE9IE5VTEw7IHJldHZhbCA9IHJldHZhbC0+bmV4dCkKLSAgICBpZiAocmV0dmFsLT5maWxlbmFtZSAhPSBOVUxMKQotICAgICAgewotCWludCBjb21wYXJlID0gc3RyY21wIChyZXR2YWwtPmZpbGVuYW1lLCBhYnNfZmlsZW5hbWUpOwotCWlmIChjb21wYXJlID09IDApCi0JICAvKiBXZSBmb3VuZCBpdCEgICovCi0JICBicmVhazsKLQlpZiAoY29tcGFyZSA8IDApCi0JICB7Ci0JICAgIC8qIEl0J3Mgbm90IGluIHRoZSBsaXN0LiAgKi8KLQkgICAgcmV0dmFsID0gTlVMTDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQlsYXN0ID0gcmV0dmFsOwotICAgICAgfQotCi0gIGlmIChyZXR2YWwgIT0gTlVMTCB8fCBkb19hbGxvY2F0ZSA9PSAwKQotICAgIHsKLSAgICAgIGZyZWUgKGFic19maWxlbmFtZSk7Ci0gICAgICByZXR1cm4gcmV0dmFsOwotICAgIH0KLQotICByZXR2YWwgPSAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKQotICAgIG1hbGxvYyAoc2l6ZW9mICgqcmV0dmFsKSArIChfX2FyZ3pfY291bnQgKGRpcmxpc3QsIGRpcmxpc3RfbGVuKQotCQkJCSogKDEgPDwgcG9wIChtYXNrKSkKLQkJCQkqIHNpemVvZiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKSkpOwotICBpZiAocmV0dmFsID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dmFsLT5maWxlbmFtZSA9IGFic19maWxlbmFtZTsKLSAgcmV0dmFsLT5kZWNpZGVkID0gKF9fYXJnel9jb3VudCAoZGlybGlzdCwgZGlybGlzdF9sZW4pICE9IDEKLQkJICAgICB8fCAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMAotCQkJICYmIChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkpOwotICByZXR2YWwtPmRhdGEgPSBOVUxMOwotCi0gIGlmIChsYXN0ID09IE5VTEwpCi0gICAgewotICAgICAgcmV0dmFsLT5uZXh0ID0gKmwxMG5maWxlX2xpc3Q7Ci0gICAgICAqbDEwbmZpbGVfbGlzdCA9IHJldHZhbDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXR2YWwtPm5leHQgPSBsYXN0LT5uZXh0OwotICAgICAgbGFzdC0+bmV4dCA9IHJldHZhbDsKLSAgICB9Ci0KLSAgZW50cmllcyA9IDA7Ci0gIC8qIElmIHRoZSBESVJMSVNUIGlzIGEgcmVhbCBsaXN0IHRoZSBSRVRWQUwgZW50cnkgY29ycmVzcG9uZHMgbm90IHRvCi0gICAgIGEgcmVhbCBmaWxlLiAgU28gd2UgaGF2ZSB0byB1c2UgdGhlIERJUkxJU1Qgc2VwYXJhdGlvbiBtZWNoYW5pc20KLSAgICAgb2YgdGhlIGlubmVyIGxvb3AuICAqLwotICBjbnQgPSBfX2FyZ3pfY291bnQgKGRpcmxpc3QsIGRpcmxpc3RfbGVuKSA9PSAxID8gbWFzayAtIDEgOiBtYXNrOwotICBmb3IgKDsgY250ID49IDA7IC0tY250KQotICAgIGlmICgoY250ICYgfm1hc2spID09IDAKLQkmJiAoKGNudCAmIENFTl9TUEVDSUZJQykgPT0gMCB8fCAoY250ICYgWFBHX1NQRUNJRklDKSA9PSAwKQotCSYmICgoY250ICYgWFBHX0NPREVTRVQpID09IDAgfHwgKGNudCAmIFhQR19OT1JNX0NPREVTRVQpID09IDApKQotICAgICAgewotCS8qIEl0ZXJhdGUgb3ZlciBhbGwgZWxlbWVudHMgb2YgdGhlIERJUkxJU1QuICAqLwotCWNoYXIgKmRpciA9IE5VTEw7Ci0KLQl3aGlsZSAoKGRpciA9IF9fYXJnel9uZXh0ICgoY2hhciAqKSBkaXJsaXN0LCBkaXJsaXN0X2xlbiwgZGlyKSkKLQkgICAgICAgIT0gTlVMTCkKLQkgIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXMrK10KLQkgICAgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpciwgc3RybGVuIChkaXIpICsgMSwgY250LAotCQkJCSAgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwgY29kZXNldCwKLQkJCQkgIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIHNwZWNpYWwsCi0JCQkJICBzcG9uc29yLCByZXZpc2lvbiwgZmlsZW5hbWUsIDEpOwotICAgICAgfQotICByZXR2YWwtPnN1Y2Nlc3NvcltlbnRyaWVzXSA9IE5VTEw7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQwKLS8qIE5vcm1hbGl6ZSBjb2Rlc2V0IG5hbWUuICBUaGVyZSBpcyBubyBzdGFuZGFyZCBmb3IgdGhlIGNvZGVzZXQKLSAgIG5hbWVzLiAgTm9ybWFsaXphdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gdXNlIGFueSBvZiB0aGUgY29tbW9uCi0gICBuYW1lcy4gICovCi1jb25zdCBjaGFyICoKLV9ubF9ub3JtYWxpemVfY29kZXNldCAoY29kZXNldCwgbmFtZV9sZW4pCi0gICAgIGNvbnN0IGNoYXIgKmNvZGVzZXQ7Ci0gICAgIHNpemVfdCBuYW1lX2xlbjsKLXsKLSAgaW50IGxlbiA9IDA7Ci0gIGludCBvbmx5X2RpZ2l0ID0gMTsKLSAgY2hhciAqcmV0dmFsOwotICBjaGFyICp3cDsKLSAgc2l6ZV90IGNudDsKLQotICBmb3IgKGNudCA9IDA7IGNudCA8IG5hbWVfbGVuOyArK2NudCkKLSAgICBpZiAoaXNhbG51bSAoY29kZXNldFtjbnRdKSkKLSAgICAgIHsKLQkrK2xlbjsKLQotCWlmIChpc2FscGhhIChjb2Rlc2V0W2NudF0pKQotCSAgb25seV9kaWdpdCA9IDA7Ci0gICAgICB9Ci0KLSAgcmV0dmFsID0gKGNoYXIgKikgbWFsbG9jICgob25seV9kaWdpdCA/IDMgOiAwKSArIGxlbiArIDEpOwotCi0gIGlmIChyZXR2YWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAob25seV9kaWdpdCkKLQl3cCA9IHN0cGNweSAocmV0dmFsLCAiaXNvIik7Ci0gICAgICBlbHNlCi0Jd3AgPSByZXR2YWw7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgY250IDwgbmFtZV9sZW47ICsrY250KQotCWlmIChpc2FscGhhIChjb2Rlc2V0W2NudF0pKQotCSAgKndwKysgPSB0b2xvd2VyIChjb2Rlc2V0W2NudF0pOwotCWVsc2UgaWYgKGlzZGlnaXQgKGNvZGVzZXRbY250XSkpCi0JICAqd3ArKyA9IGNvZGVzZXRbY250XTsKLQotICAgICAgKndwID0gJ1wwJzsKLSAgICB9Ci0KLSAgcmV0dXJuIChjb25zdCBjaGFyICopIHJldHZhbDsKLX0KLQotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotLyogV2UgZG9uJ3Qgd2FudCBsaWJpbnRsLmEgdG8gZGVwZW5kIG9uIGFueSBvdGhlciBsaWJyYXJ5LiAgU28gd2UKLSAgIGF2b2lkIHRoZSBub24tc3RhbmRhcmQgZnVuY3Rpb24gc3RwY3B5LiAgSW4gR05VIEMgTGlicmFyeSB0aGlzCi0gICBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRob3VnaC4gIEFsc28gYWxsb3cgdGhlIHN5bWJvbCBIQVZFX1NUUENQWQotICAgdG8gYmUgZGVmaW5lZC4gICovCi0jaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKgotc3RwY3B5IChkZXN0LCBzcmMpCi0gICAgIGNoYXIgKmRlc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKnNyYzsKLXsKLSAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQotICAgIC8qIERvIG5vdGhpbmcuICovIDsKLSAgcmV0dXJuIGRlc3QgLSAxOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2xpYmdldHRleHQuaCBiL2ludGwvbGliZ2V0dGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDRkZTRkLi4wMDAwMDAwCi0tLSBhL2ludGwvbGliZ2V0dGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qIE1lc3NhZ2UgY2F0YWxvZ3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBCZWNhdXNlIG9uIHNvbWUgc3lzdGVtcyAoZS5nLiBTb2xhcmlzKSB3ZSBzb21ldGltZXMgaGF2ZSB0byBpbmNsdWRlCi0gICB0aGUgc3lzdGVtcyBsaWJpbnRsLmggYXMgd2VsbCBhcyB0aGlzIGZpbGUgd2UgaGF2ZSBtb3JlIGNvbXBsZXgKLSAgIGluY2x1ZGUgcHJvdGVjdGlvbiBhYm92ZS4gIEJ1dCB0aGUgc3lzdGVtcyBoZWFkZXIgbWlnaHQgcGVyaGFwcyBhbHNvCi0gICBkZWZpbmUgX0xJQklOVExfSCBhbmQgdGhlcmVmb3JlIHdlIGhhdmUgdG8gcHJvdGVjdCB0aGUgZGVmaW5pdGlvbiBoZXJlLiAgKi8KLQotI2lmICFkZWZpbmVkIChfTElCSU5UTF9IKSB8fCAhZGVmaW5lZCAoX0xJQkdFVFRFWFRfSCkKLSNpZiAhZGVmaW5lZCAoX0xJQklOVExfSCkKLSMgZGVmaW5lIF9MSUJJTlRMX0gJMQotI2VuZGlmCi0jZGVmaW5lIF9MSUJHRVRURVhUX0gJMQotCi0vKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKLSAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLwotI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIEhBVkVfTE9DQUxFX0gKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmbmRlZiBQQVJBTVMKLSMgaWYgX19TVERDX18KLSMgIGRlZmluZSBQQVJBTVMoYXJncykgYXJncwotIyBlbHNlCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpICgpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBOVUxMCi0jIGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX19HTlVDX18KLSMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQotIyBlbHNlCi0jICBkZWZpbmUgTlVMTCAoMCkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgIUhBVkVfTENfTUVTU0FHRVMKLS8qIFRoaXMgdmFsdWUgZGV0ZXJtaW5lcyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBnZXR0ZXh0KCkgYW5kIGRnZXR0ZXh0KCkKLSAgIGZ1bmN0aW9uLiAgQnV0IHNvbWUgc3lzdGVtIGRvZXMgbm90IGhhdmUgdGhpcyBkZWZpbmVkLiAgRGVmaW5lIGl0Ci0gICB0byBhIGRlZmF1bHQgdmFsdWUuICAqLwotIyBkZWZpbmUgTENfTUVTU0FHRVMgKC0xKQotI2VuZGlmCi0KLQotLyogRGVjbGFyYXRpb25zIGZvciBnZXR0ZXh0LXVzaW5nLWNhdGdldHMgaW50ZXJmYWNlLiAgRGVyaXZlZCBmcm9tCi0gICBKaW0gTWV5ZXJpbmcncyBsaWJpbnRsLmguICAqLwotc3RydWN0IF9tc2dfZW50Ci17Ci0gIGNvbnN0IGNoYXIgKl9tc2c7Ci0gIGludCBfbXNnX251bWJlcjsKLX07Ci0KLQotI2lmIEhBVkVfQ0FUR0VUUwotLyogVGhlc2UgdHdvIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCBpbiB0aGUgYXV0b21hdGljYWxseSBieSBwby10by10Ymwuc2VkCi0gICBnZW5lcmF0ZWQgZmlsZSBgY2F0LWlkLXRibC5jJy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IF9tc2dfZW50IF9tc2dfdGJsW107Ci1leHRlcm4gaW50IF9tc2dfdGJsX2xlbmd0aDsKLSNlbmRpZgotCi0KLS8qIEZvciBhdXRvbWF0aWNhbCBleHRyYWN0aW9uIG9mIG1lc3NhZ2VzIHNvbWV0aW1lcyBubyByZWFsCi0gICB0cmFuc2xhdGlvbiBpcyBuZWVkZWQuICBJbnN0ZWFkIHRoZSBzdHJpbmcgaXRzZWxmIGlzIHRoZSByZXN1bHQuICAqLwotI2RlZmluZSBnZXR0ZXh0X25vb3AoU3RyKSAoU3RyKQotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLSAgIHRleHQpLiAgKi8KLWV4dGVybiBjaGFyICpnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLWV4dGVybiBjaGFyICpnZXR0ZXh0X18gUEFSQU1TICgoY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGdldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci1leHRlcm4gY2hhciAqZGdldHRleHRfXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJIGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCi0JCQkJaW50IF9fY2F0ZWdvcnkpKTsKLWV4dGVybiBjaGFyICpkY2dldHRleHRfXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICBjb25zdCBjaGFyICpfX21zZ2lkLCBpbnQgX19jYXRlZ29yeSkpOwotCi0KLS8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgotICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLSAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLwotZXh0ZXJuIGNoYXIgKnRleHRkb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci1leHRlcm4gY2hhciAqdGV4dGRvbWFpbl9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotCi0vKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbl9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgICAgY29uc3QgY2hhciAqX19kaXJuYW1lKSk7Ci0KLSNpZiBFTkFCTEVfTkxTCi0KLS8qIFNvbGFyaXMgMi4zIGhhcyB0aGUgZ2V0dGV4dCBmdW5jdGlvbiBidXQgZGNnZXR0ZXh0IGlzIG1pc3NpbmcuCi0gICBTbyB3ZSBvbWl0IHRoaXMgb3B0aW1pemF0aW9uIGZvciBTb2xhcmlzIDIuMy4gIEJUVywgU29sYXJpcyAyLjQKLSAgIGhhcyBkY2dldHRleHQuICAqLwotIyBpZiAhSEFWRV9DQVRHRVRTICYmICghSEFWRV9HRVRURVhUIHx8IEhBVkVfRENHRVRURVhUKQotCi0jICBkZWZpbmUgZ2V0dGV4dChNc2dpZCkJCQkJCQkgICAgICBcCi0gICAgIGRnZXR0ZXh0IChOVUxMLCBNc2dpZCkKLQotIyAgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkKQkJCQkJICAgICAgXAotICAgICBkY2dldHRleHQgKERvbWFpbm5hbWUsIE1zZ2lkLCBMQ19NRVNTQUdFUykKLQotIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDcKLS8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gbG9hZG1zZ2NhdC5jLiAgV2UgbmVlZCBhIHNpZ24sCi0gICB3aGV0aGVyIGEgbmV3IGNhdGFsb2cgd2FzIGxvYWRlZCwgd2hpY2ggY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwKLSAgIHRyYW5zbGF0aW9ucy4gICovCi1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0KLSMgICBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSkJCQkgICAgICBcCi0gIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKLSAgICh7CQkJCQkJCQkJICAgICAgXAotICAgICBjaGFyICpfX3Jlc3VsdDsJCQkJCQkJICAgICAgXAotICAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKE1zZ2lkKSkJCQkJCSAgICAgIFwKLSAgICAgICB7CQkJCQkJCQkgICAgICBcCi0JIHN0YXRpYyBjaGFyICpfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0JIHN0YXRpYyBpbnQgX19jYXRhbG9nX2NvdW50ZXJfXzsJCQkJICAgICAgXAotCSBpZiAoISBfX3RyYW5zbGF0aW9uX18gfHwgX19jYXRhbG9nX2NvdW50ZXJfXyAhPSBfbmxfbXNnX2NhdF9jbnRyKSAgICBcCi0JICAgewkJCQkJCQkJICAgICAgXAotCSAgICAgX190cmFuc2xhdGlvbl9fID0JCQkJCQkgICAgICBcCi0JICAgICAgIGRjZ2V0dGV4dF9fIChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpOwkJICAgICAgXAotCSAgICAgX19jYXRhbG9nX2NvdW50ZXJfXyA9IF9ubF9tc2dfY2F0X2NudHI7CQkJICAgICAgXAotCSAgIH0JCQkJCQkJCSAgICAgIFwKLQkgX19yZXN1bHQgPSBfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0gICAgICAgfQkJCQkJCQkJICAgICAgXAotICAgICBlbHNlCQkJCQkJCQkgICAgICBcCi0gICAgICAgX19yZXN1bHQgPSBkY2dldHRleHRfXyAoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KTsJCSAgICAgIFwKLSAgICAgX19yZXN1bHQ7CQkJCQkJCQkgICAgICBcCi0gICAgfSkpCi0jICBlbmRpZgotIyBlbmRpZgotCi0jZWxzZQotCi0jIGRlZmluZSBnZXR0ZXh0KE1zZ2lkKSAoTXNnaWQpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCkgKE1zZ2lkKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSkgKE1zZ2lkKQotIyBkZWZpbmUgdGV4dGRvbWFpbihEb21haW5uYW1lKSB3aGlsZSAoMCkgLyogbm90aGluZyAqLwotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWlubmFtZSwgRGlybmFtZSkgd2hpbGUgKDApIC8qIG5vdGhpbmcgKi8KLQotI2VuZGlmCi0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvbGliaW50bC5nbGliYyBiL2ludGwvbGliaW50bC5nbGliYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU1YjhmOS4uMDAwMDAwMAotLS0gYS9pbnRsL2xpYmludGwuZ2xpYmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogbGliZ2V0dGV4dC5oIC0tIE1lc3NhZ2UgY2F0YWxvZ3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgotQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCi1Db250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlci4KLVRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gdGhlIGZpbGUgbGliZ2V0dGV4dC5oIGluIHRoZSBHTlUgZ2V0dGV4dCBwYWNrYWdlLgotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfTElCSU5UTF9ICi0jZGVmaW5lIF9MSUJJTlRMX0gJMQotI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLQotI2RlZmluZSBfX25lZWRfTlVMTAotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0vKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKLSAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLwotI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCi0KLV9fQkVHSU5fREVDTFMKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0gICB0ZXh0KS4gICovCi1leHRlcm4gY2hhciAqZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLWV4dGVybiBjaGFyICpfX2dldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX21zZ2lkKSk7Ci0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KLWV4dGVybiBjaGFyICpkZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCSAgICBfX2NvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLWV4dGVybiBjaGFyICpfX2RnZXR0ZXh0IF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJICAgICAgX19jb25zdCBjaGFyICpfX21zZ2lkKSk7Ci0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQotICAgbG9jYWxlLiAgKi8KLWV4dGVybiBjaGFyICpkY2dldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkgICAgIF9fY29uc3QgY2hhciAqX19tc2dpZCwgaW50IF9fY2F0ZWdvcnkpKTsKLWV4dGVybiBjaGFyICpfX2RjZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fbXNnaWQsIGludCBfX2NhdGVnb3J5KSk7Ci0KLQotLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCi0gICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgotICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCi1leHRlcm4gY2hhciAqdGV4dGRvbWFpbiBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotZXh0ZXJuIGNoYXIgKl9fdGV4dGRvbWFpbiBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotCi0vKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgIF9fY29uc3QgY2hhciAqX19kaXJuYW1lKSk7Ci1leHRlcm4gY2hhciAqX19iaW5kdGV4dGRvbWFpbiBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgICAgX19jb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKLQotCi0vKiBPcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gYWJvdmUuICAqLwotI2lmIGRlZmluZWQgX19PUFRJTUlaRUQKLS8qIFRoZXNlIG11c3QgYmUgYSBtYWNyby4gIElubGluZWQgZnVuY3Rpb25zIGFyZSB1c2VsZXNzIGJlY2F1c2UgdGhlCi0gICBgX19idWlsdGluX2NvbnN0YW50X3AnIHByZWRpY2F0ZSBpbiBkY2dldHRleHQgd291bGQgYWx3YXlzIHJldHVybgotICAgZmFsc2UuICAqLwotCi0jIGRlZmluZSBnZXR0ZXh0KG1zZ2lkKSBkZ2V0dGV4dCAoTlVMTCwgbXNnaWQpCi0KLSMgZGVmaW5lIGRnZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkKQkJCQkJICAgICAgXAotICBkY2dldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBMQ19NRVNTQUdFUykKLQotIyBpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gNykKLSMgIGRlZmluZSBkY2dldHRleHQoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KQkJCSAgICAgIFwKLSAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAotICAgKHsJCQkJCQkJCQkgICAgICBcCi0gICAgIGNoYXIgKnJlc3VsdDsJCQkJCQkJICAgICAgXAotICAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKG1zZ2lkKSkJCQkJCSAgICAgIFwKLSAgICAgICB7CQkJCQkJCQkgICAgICBcCi0JIGV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsJCQkJCSAgICAgIFwKLQkgc3RhdGljIGNoYXIgKl9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKLQkgc3RhdGljIGludCBfX2NhdGFsb2dfY291bnRlcl9fOwkJCQkgICAgICBcCi0JIGlmICghIF9fdHJhbnNsYXRpb25fXyB8fCBfX2NhdGFsb2dfY291bnRlcl9fICE9IF9ubF9tc2dfY2F0X2NudHIpICAgIFwKLQkgICB7CQkJCQkJCQkgICAgICBcCi0JICAgICBfX3RyYW5zbGF0aW9uX18gPQkJCQkJCSAgICAgIFwKLQkgICAgICAgX19kY2dldHRleHQgKChkb21haW5uYW1lKSwgKG1zZ2lkKSwgKGNhdGVnb3J5KSk7CQkgICAgICBcCi0JICAgICBfX2NhdGFsb2dfY291bnRlcl9fID0gX25sX21zZ19jYXRfY250cjsJCQkgICAgICBcCi0JICAgfQkJCQkJCQkJICAgICAgXAotCSByZXN1bHQgPSBfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0gICAgICAgfQkJCQkJCQkJICAgICAgXAotICAgICBlbHNlCQkJCQkJCQkgICAgICBcCi0gICAgICAgcmVzdWx0ID0gX19kY2dldHRleHQgKChkb21haW5uYW1lKSwgKG1zZ2lkKSwgKGNhdGVnb3J5KSk7CSAgICAgIFwKLSAgICAgcmVzdWx0OwkJCQkJCQkJICAgICAgXAotICAgIH0pKQotIyBlbmRpZgotI2VuZGlmIC8qIE9wdGltaXppbmcuICovCi0KLQotX19FTkRfREVDTFMKLQotI2VuZGlmIC8qIGxpYmludGwuaCAqLwpkaWZmIC0tZ2l0IGEvaW50bC9saW51eC1tc2cuc2VkIGIvaW50bC9saW51eC1tc2cuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTE4ZTcyLi4wMDAwMDAwCi0tLSBhL2ludGwvbGludXgtbXNnLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0jIHBvMm1zZy5zZWQgLSBDb252ZXJ0IFVuaWZvcnVtIHN0eWxlIC5wbyBmaWxlIHRvIExpbnV4IHN0eWxlIC5tc2cgZmlsZQotIyBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMKLSMgVGhlIGZpcnN0IGRpcmVjdGl2ZSBpbiB0aGUgLm1zZyBzaG91bGQgYmUgdGhlIGRlZmluaXRpb24gb2YgdGhlCi0jIG1lc3NhZ2Ugc2V0IG51bWJlci4gIFdlIHVzZSBhbHdheXMgc2V0IG51bWJlciAxLgotIwotMSB7Ci0gIGlcCi0kc2V0IDEgIyBBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgcG8ybXNnLnNlZAotICBoCi0gIHMvLiovMC8KLSAgeAotfQotIwotIyBNaXRjaCdzIG9sZCBjYXRhbG9nIGZvcm1hdCBkb2VzIG5vdCBhbGxvdyBjb21tZW50cy4KLSMKLSMgV2UgY29weSB0aGUgb3JpZ2luYWwgbWVzc2FnZSBhcyBhIGNvbW1lbnQgaW50byB0aGUgLm1zZyBmaWxlLgotIwotL15tc2dpZC8gewotICBzL21zZ2lkWyAJXSoiLy8KLSMKLSMgVGhpcyBkb2VzIG5vdCB3b3JrIG5vdyB3aXRoIHRoZSBuZXcgZm9ybWF0LgotIyAvIiQvISB7Ci0jICAgcy9cXCQvLwotIyAgIHMvJC8gLi4uIChtb3JlIGxpbmVzIGZvbGxvd2luZykiLwotIyB9Ci0gIHgKLSMgVGhlIGZvbGxvd2luZyBuaWNlIHNvbHV0aW9uIGlzIGJ5Ci0jIEJydW5vIDxIYWlibGVAbWEyczIubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgotICB0ZAotIyBJbmNyZW1lbnQgYSBkZWNpbWFsIG51bWJlciBpbiBwYXR0ZXJuIHNwYWNlLgotIyBGaXJzdCBoaWRlIHRyYWlsaW5nIGA5JyBkaWdpdHMuCi0gIDpkCi0gIHMvOVwoXypcKSQvX1wxLwotICB0ZAotIyBBc3N1cmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGlzIGF2YWlsYWJsZS4KLSAgcy9eXChfKlwpJC8wXDEvCi0jIEluY3JlbWVudCB0aGUgbGFzdCBkaWdpdC4KLSAgcy84XChfKlwpJC85XDEvCi0gIHMvN1woXypcKSQvOFwxLwotICBzLzZcKF8qXCkkLzdcMS8KLSAgcy81XChfKlwpJC82XDEvCi0gIHMvNFwoXypcKSQvNVwxLwotICBzLzNcKF8qXCkkLzRcMS8KLSAgcy8yXChfKlwpJC8zXDEvCi0gIHMvMVwoXypcKSQvMlwxLwotICBzLzBcKF8qXCkkLzFcMS8KLSMgQ29udmVydCB0aGUgaGlkZGVuIGA5JyBkaWdpdHMgdG8gYDAncy4KLSAgcy9fLzAvZwotICB4Ci0gIEcKLSAgcy9cKC4qXCkiXG5cKFswLTldKlwpLyQgI1wyIE9yaWdpbmFsIE1lc3NhZ2U6KFwxKS9wCi19Ci0jCi0jIFRoZSAubXNnIGZpbGUgY29udGFpbnMsIG90aGVyIHRoZW4gdGhlIC5wbyBmaWxlLCBvbmx5IHRoZSB0cmFuc2xhdGlvbnMKLSMgYnV0IGVhY2ggZ2l2ZW4gYSB1bmlxdWUgSUQuICBTdGFydGluZyBmcm9tIDEgYW5kIGluY3JlbWVudGluZyBieSAxIGZvcgotIyBlYWNoIG1lc3NhZ2Ugd2UgYXNzaWduIHRoZW0gdG8gdGhlIG1lc3NhZ2VzLgotIyBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgLnBvIGZpbGUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2F0LWlkLXRibC5jIGZpbGUKLSMgKHdpdGggcG8tdG8tdGJsKSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHVzZWQgaGVyZS4gIChBdCBsZWFzdCB0aGUgb3JkZXIKLSMgb2YgZGVjbGFyYXRpb25zIG11c3Qgbm90IGJlIGNoYW5nZWQuKQotIwotL15tc2dzdHIvIHsKLSAgcy9tc2dzdHJbIAldKiJcKC4qXCkiLyMgXDEvCi0jIENsZWFyIHN1YnN0aXR1dGlvbiBmbGFnLgotICB0YgotIyBBcHBlbmQgdGhlIG5leHQgbGluZS4KLSAgOmIKLSAgTgotIyBMb29rIHdoZXRoZXIgc2Vjb25kIHBhcnQgaXMgY29udGludWF0aW9uIGxpbmUuCi0gIHMvXCguKlxuXCkiXCguKlwpIi9cMVwyLwotIyBZZXMsIHRoZW4gYnJhbmNoLgotICB0YQotICBQCi0gIEQKLSMgTm90ZSB0aGF0IEQgaW5jbHVkZXMgYSBqdW1wIHRvIHRoZSBzdGFydCEhCi0jIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCi0gIDphCi0gIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLwotICBQCi0jIFdlIGNhbm5vdCB1c2UgRCBoZXJlLgotICBzLy4qXG5cKC4qXCkvXDEvCi0gIHRiCi19Ci1kCmRpZmYgLS1naXQgYS9pbnRsL2xvYWRpbmZvLmggYi9pbnRsL2xvYWRpbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2N2MyZWIuLjAwMDAwMDAKLS0tIGEvaW50bC9sb2FkaW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotI2lmbmRlZiBQQVJBTVMKLSMgaWYgX19TVERDX18KLSMgIGRlZmluZSBQQVJBTVMoYXJncykgYXJncwotIyBlbHNlCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpICgpCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogRW5jb2Rpbmcgb2YgbG9jYWxlIG5hbWUgcGFydHMuICAqLwotI2RlZmluZSBDRU5fUkVWSVNJT04JCTEKLSNkZWZpbmUgQ0VOX1NQT05TT1IJCTIKLSNkZWZpbmUgQ0VOX1NQRUNJQUwJCTQKLSNkZWZpbmUgWFBHX05PUk1fQ09ERVNFVAk4Ci0jZGVmaW5lIFhQR19DT0RFU0VUCQkxNgotI2RlZmluZSBURVJSSVRPUlkJCTMyCi0jZGVmaW5lIENFTl9BVURJRU5DRQkJNjQKLSNkZWZpbmUgWFBHX01PRElGSUVSCQkxMjgKLQotI2RlZmluZSBDRU5fU1BFQ0lGSUMJKENFTl9SRVZJU0lPTnxDRU5fU1BPTlNPUnxDRU5fU1BFQ0lBTHxDRU5fQVVESUVOQ0UpCi0jZGVmaW5lIFhQR19TUEVDSUZJQwkoWFBHX0NPREVTRVR8WFBHX05PUk1fQ09ERVNFVHxYUEdfTU9ESUZJRVIpCi0KLQotc3RydWN0IGxvYWRlZF9sMTBuZmlsZQotewotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgaW50IGRlY2lkZWQ7Ci0KLSAgY29uc3Qgdm9pZCAqZGF0YTsKLQotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpuZXh0OwotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpzdWNjZXNzb3JbMV07Ci19OwotCi0KLWV4dGVybiBjb25zdCBjaGFyICpfbmxfbm9ybWFsaXplX2NvZGVzZXQgUEFSQU1TICgoY29uc3QgY2hhciAqY29kZXNldCwKLQkJCQkJCSAgc2l6ZV90IG5hbWVfbGVuKSk7Ci0KLWV4dGVybiBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKLV9ubF9tYWtlX2wxMG5mbGlzdCBQQVJBTVMgKChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdCwKLQkJCSAgICBjb25zdCBjaGFyICpkaXJsaXN0LCBzaXplX3QgZGlybGlzdF9sZW4sIGludCBtYXNrLAotCQkJICAgIGNvbnN0IGNoYXIgKmxhbmd1YWdlLCBjb25zdCBjaGFyICp0ZXJyaXRvcnksCi0JCQkgICAgY29uc3QgY2hhciAqY29kZXNldCwKLQkJCSAgICBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQsCi0JCQkgICAgY29uc3QgY2hhciAqbW9kaWZpZXIsIGNvbnN0IGNoYXIgKnNwZWNpYWwsCi0JCQkgICAgY29uc3QgY2hhciAqc3BvbnNvciwgY29uc3QgY2hhciAqcmV2aXNpb24sCi0JCQkgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBkb19hbGxvY2F0ZSkpOwotCi0KLWV4dGVybiBjb25zdCBjaGFyICpfbmxfZXhwYW5kX2FsaWFzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLQotZXh0ZXJuIGludCBfbmxfZXhwbG9kZV9uYW1lIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipsYW5ndWFnZSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKiptb2RpZmllciwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnksCi0JCQkJICAgICBjb25zdCBjaGFyICoqY29kZXNldCwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQsCi0JCQkJICAgICBjb25zdCBjaGFyICoqc3BlY2lhbCwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipzcG9uc29yLAotCQkJCSAgICAgY29uc3QgY2hhciAqKnJldmlzaW9uKSk7CmRpZmYgLS1naXQgYS9pbnRsL2xvYWRtc2djYXQuYyBiL2ludGwvbG9hZG1zZ2NhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2U5MGE5Li4wMDAwMDAwCi0tLSBhL2ludGwvbG9hZG1zZ2NhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qIExvYWQgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCkgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZkZWYgX0xJQkMKLS8qIFJlbmFtZSB0aGUgbm9uIElTTyBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgSVNPIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgZGVmaW5lIGZzdGF0ICBfX2ZzdGF0Ci0jIGRlZmluZSBvcGVuICAgX19vcGVuCi0jIGRlZmluZSBjbG9zZSAgX19jbG9zZQotIyBkZWZpbmUgcmVhZCAgIF9fcmVhZAotIyBkZWZpbmUgbW1hcCAgIF9fbW1hcAotIyBkZWZpbmUgbXVubWFwIF9fbXVubWFwCi0jZW5kaWYKLQotLyogV2UgbmVlZCBhIHNpZ24sIHdoZXRoZXIgYSBuZXcgY2F0YWxvZyB3YXMgbG9hZGVkLCB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZAotICAgd2l0aCBhbGwgdHJhbnNsYXRpb25zLiAgVGhpcyBpcyBpbXBvcnRhbnQgaWYgdGhlIHRyYW5zbGF0aW9ucyBhcmUKLSAgIGNhY2hlZCBieSBvbmUgb2YgR0NDJ3MgZmVhdHVyZXMuICAqLwotaW50IF9ubF9tc2dfY2F0X2NudHIgPSAwOwotCi0KLS8qIExvYWQgdGhlIG1lc3NhZ2UgY2F0YWxvZ3Mgc3BlY2lmaWVkIGJ5IEZJTEVOQU1FLiAgSWYgaXQgaXMgbm8gdmFsaWQKLSAgIG1lc3NhZ2UgY2F0YWxvZyBkbyBub3RoaW5nLiAgKi8KLXZvaWQKLV9ubF9sb2FkX2RvbWFpbiAoZG9tYWluX2ZpbGUpCi0gICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlOwotewotICBpbnQgZmQ7Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKmRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xOwotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKLSAgICB8fCBkZWZpbmVkIF9MSUJDCi0gIGludCB1c2VfbW1hcCA9IDA7Ci0jZW5kaWYKLSAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbjsKLQotICBkb21haW5fZmlsZS0+ZGVjaWRlZCA9IDE7Ci0gIGRvbWFpbl9maWxlLT5kYXRhID0gTlVMTDsKLQotICAvKiBJZiB0aGUgcmVjb3JkIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGxvY2FsZSB0aGUgRklMRU5BTUUKLSAgICAgbWlnaHQgYmUgTlVMTC4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KLSAgICAgc3BlY2lmaWNhdGlvbiB0aGUgbG9jYWxlIGZpbGUgbmFtZSBpcyBkaWZmZXJlbnQgZm9yIFhQRyBhbmQgQ0VOCi0gICAgIHN5bnRheC4gICovCi0gIGlmIChkb21haW5fZmlsZS0+ZmlsZW5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogVHJ5IHRvIG9wZW4gdGhlIGFkZHJlc3NlZCBmaWxlLiAgKi8KLSAgZmQgPSBvcGVuIChkb21haW5fZmlsZS0+ZmlsZW5hbWUsIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHJldHVybjsKLQotICAvKiBXZSBtdXN0IGtub3cgYWJvdXQgdGhlIHNpemUgb2YgdGhlIGZpbGUuICAqLwotICBpZiAoZnN0YXQgKGZkLCAmc3QpICE9IDAKLSAgICAgICYmIHN0LnN0X3NpemUgPCAob2ZmX3QpIHNpemVvZiAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyKSkKLSAgICB7Ci0gICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gICovCi0gICAgICBjbG9zZSAoZmQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKLSAgICB8fCBkZWZpbmVkIF9MSUJDCi0gIC8qIE5vdyB3ZSBhcmUgcmVhZHkgdG8gbG9hZCB0aGUgZmlsZS4gIElmIG1tYXAoKSBpcyBhdmFpbGFibGUgd2UgdHJ5Ci0gICAgIHRoaXMgZmlyc3QuICBJZiBub3QgYXZhaWxhYmxlIG9yIGl0IGZhaWxlZCB3ZSB0cnkgdG8gbG9hZCBpdC4gICovCi0gIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1tYXAgKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwKLQkJCQkJIE1BUF9QUklWQVRFLCBmZCwgMCk7Ci0KLSAgaWYgKGRhdGEgIT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKLSAgICB7Ci0gICAgICAvKiBtbWFwKCkgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4gICovCi0gICAgICBjbG9zZSAoZmQpOwotICAgICAgdXNlX21tYXAgPSAxOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIElmIHRoZSBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIChpLmUuIG1tYXAnZWQpIHdlIHRyeSB0byBsb2FkCi0gICAgIGl0IG1hbnVhbGx5LiAgKi8KLSAgaWYgKGRhdGEgPT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKLSAgICB7Ci0gICAgICBvZmZfdCB0b19yZWFkOwotICAgICAgY2hhciAqcmVhZF9wdHI7Ci0KLSAgICAgIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1hbGxvYyAoc3Quc3Rfc2l6ZSk7Ci0gICAgICBpZiAoZGF0YSA9PSBOVUxMKQotCXJldHVybjsKLQotICAgICAgdG9fcmVhZCA9IHN0LnN0X3NpemU7Ci0gICAgICByZWFkX3B0ciA9IChjaGFyICopIGRhdGE7Ci0gICAgICBkbwotCXsKLQkgIGxvbmcgaW50IG5iID0gKGxvbmcgaW50KSByZWFkIChmZCwgcmVhZF9wdHIsIHRvX3JlYWQpOwotCSAgaWYgKG5iID09IC0xKQotCSAgICB7Ci0JICAgICAgY2xvc2UgKGZkKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgcmVhZF9wdHIgKz0gbmI7Ci0JICB0b19yZWFkIC09IG5iOwotCX0KLSAgICAgIHdoaWxlICh0b19yZWFkID4gMCk7Ci0KLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgfQotCi0gIC8qIFVzaW5nIHRoZSBtYWdpYyBudW1iZXIgd2UgY2FuIHRlc3Qgd2hldGhlciBpdCByZWFsbHkgaXMgYSBtZXNzYWdlCi0gICAgIGNhdGFsb2cgZmlsZS4gICovCi0gIGlmIChkYXRhLT5tYWdpYyAhPSBfTUFHSUMgJiYgZGF0YS0+bWFnaWMgIT0gX01BR0lDX1NXQVBQRUQpCi0gICAgewotICAgICAgLyogVGhlIG1hZ2ljIG51bWJlciBpcyB3cm9uZzogbm90IGEgbWVzc2FnZSBjYXRhbG9nIGZpbGUuICAqLwotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKLSAgICB8fCBkZWZpbmVkIF9MSUJDCi0gICAgICBpZiAodXNlX21tYXApCi0JbXVubWFwICgoY2FkZHJfdCkgZGF0YSwgc3Quc3Rfc2l6ZSk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlmcmVlIChkYXRhKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZG9tYWluX2ZpbGUtPmRhdGEKLSAgICA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxvYWRlZF9kb21haW4pKTsKLSAgaWYgKGRvbWFpbl9maWxlLT5kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBkb21haW5fZmlsZS0+ZGF0YTsKLSAgZG9tYWluLT5kYXRhID0gKGNoYXIgKikgZGF0YTsKLSAgZG9tYWluLT5tdXN0X3N3YXAgPSBkYXRhLT5tYWdpYyAhPSBfTUFHSUM7Ci0KLSAgLyogRmlsbCBpbiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF2YWlsYWJsZSB0YWJsZXMuICAqLwotICBzd2l0Y2ggKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5yZXZpc2lvbikpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGRvbWFpbi0+bnN0cmluZ3MgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bnN0cmluZ3MpOwotICAgICAgZG9tYWluLT5vcmlnX3RhYiA9IChzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKLQkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5vcmlnX3RhYl9vZmZzZXQpKTsKLSAgICAgIGRvbWFpbi0+dHJhbnNfdGFiID0gKHN0cnVjdCBzdHJpbmdfZGVzYyAqKQotCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnRyYW5zX3RhYl9vZmZzZXQpKTsKLSAgICAgIGRvbWFpbi0+aGFzaF9zaXplID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX3NpemUpOwotICAgICAgZG9tYWluLT5oYXNoX3RhYiA9IChubHNfdWludDMyICopCi0JKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+aGFzaF90YWJfb2Zmc2V0KSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogVGhpcyBpcyBhbiBpbGxlZ2FsIHJldmlzaW9uLiAgKi8KLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCi0gICAgfHwgZGVmaW5lZCBfTElCQwotICAgICAgaWYgKHVzZV9tbWFwKQotCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHN0LnN0X3NpemUpOwotICAgICAgZWxzZQotI2VuZGlmCi0JZnJlZSAoZGF0YSk7Ci0gICAgICBmcmVlIChkb21haW4pOwotICAgICAgZG9tYWluX2ZpbGUtPmRhdGEgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBTaG93IHRoYXQgb25lIGRvbWFpbiBpcyBjaGFuZ2VkLiAgVGhpcyBtaWdodCBtYWtlIHNvbWUgY2FjaGVkCi0gICAgIHRyYW5zbGF0aW9ucyBpbnZhbGlkLiAgKi8KLSAgKytfbmxfbXNnX2NhdF9jbnRyOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9sb2NhbGVhbGlhcy5jIGIvaW50bC9sb2NhbGVhbGlhcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGQ5MTk0Li4wMDAwMDAwCi0tLSBhL2ludGwvbG9jYWxlYWxpYXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKiBIYW5kbGUgYWxpYXNlcyBmb3IgbG9jYWxlIG5hbWVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQotI2Vsc2UKLSMgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotY2hhciAqZ2V0ZW52ICgpOwotIyBpZmRlZiBIQVZFX01BTExPQ19ICi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZWxzZQotdm9pZCBmcmVlICgpOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgX0dOVV9TT1VSQ0UKLSMgIGRlZmluZSBfR05VX1NPVVJDRQkxCi0jIGVuZGlmCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBpZm5kZWYgbWVtY3B5Ci0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQotIyBlbmRpZgotI2VuZGlmCi0jaWYgIUhBVkVfU1RSQ0hSICYmICFkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBzdHJjaHIKLSMgIGRlZmluZSBzdHJjaHIgaW5kZXgKLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgotI2luY2x1ZGUgImdldHRleHRQLmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmZGVmIF9MSUJDCi0vKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLSAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgZGVmaW5lIHN0cmNhc2VjbXAgX19zdHJjYXNlY21wCi0jZW5kaWYKLQotCi0vKiBGb3IgdGhvc2UgbG9vc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKLSAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCi0jaWZkZWYgSEFWRV9BTExPQ0EKLS8qIE5vdGhpbmcgaGFzIHRvIGJlIGRvbmUuICAqLwotIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHJlc3MpIC8qIG5vdGhpbmcgKi8KLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpIC8qIG5vdGhpbmcgKi8KLSNlbHNlCi1zdHJ1Y3QgYmxvY2tfbGlzdAotewotICB2b2lkICphZGRyZXNzOwotICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV4dDsKLX07Ci0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcikJCQkJCQkgICAgICBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgc3RydWN0IGJsb2NrX2xpc3QgKm5ld3AgPSAoc3RydWN0IGJsb2NrX2xpc3QgKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7ICBcCi0gICAgLyogSWYgd2UgY2Fubm90IGdldCBhIGZyZWUgYmxvY2sgd2UgY2Fubm90IGFkZCB0aGUgbmV3IGVsZW1lbnQgdG8JICAgICAgXAotICAgICAgIHRoZSBsaXN0LiAgKi8JCQkJCQkJICAgICAgXAotICAgIGlmIChuZXdwICE9IE5VTEwpIHsJCQkJCQkJICAgICAgXAotICAgICAgbmV3cC0+YWRkcmVzcyA9IChhZGRyKTsJCQkJCQkgICAgICBcCi0gICAgICBuZXdwLT5uZXh0ID0gKGxpc3QpOwkJCQkJCSAgICAgIFwKLSAgICAgIChsaXN0KSA9IG5ld3A7CQkJCQkJCSAgICAgIFwKLSAgICB9CQkJCQkJCQkJICAgICAgXAotICB9IHdoaWxlICgwKQotIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkJCQkJCQkgICAgICBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgewkJCQkJCSAgICAgIFwKLSAgICAgIHN0cnVjdCBibG9ja19saXN0ICpvbGQgPSBsaXN0OwkJCQkJICAgICAgXAotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CQkJCQkJICAgICAgXAotICAgICAgZnJlZSAob2xkKTsJCQkJCQkJICAgICAgXAotICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jIHVuZGVmIGFsbG9jYQotIyBkZWZpbmUgYWxsb2NhKHNpemUpIChtYWxsb2MgKHNpemUpKQotI2VuZGlmCS8qIGhhdmUgYWxsb2NhICovCi0KLQotc3RydWN0IGFsaWFzX21hcAotewotICBjb25zdCBjaGFyICphbGlhczsKLSAgY29uc3QgY2hhciAqdmFsdWU7Ci19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgYWxpYXNfbWFwICptYXA7Ci1zdGF0aWMgc2l6ZV90IG5tYXAgPSAwOwotc3RhdGljIHNpemVfdCBtYXhtYXAgPSAwOwotCi0KLS8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgc2l6ZV90IHJlYWRfYWxpYXNfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZuYW1lX2xlbikpOwotc3RhdGljIHZvaWQgZXh0ZW5kX2FsaWFzX3RhYmxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgYWxpYXNfY29tcGFyZSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAxLAotCQkJCSAgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMikpOwotCi0KLWNvbnN0IGNoYXIgKgotX25sX2V4cGFuZF9hbGlhcyAobmFtZSkKLSAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdGF0aWMgY29uc3QgY2hhciAqbG9jYWxlX2FsaWFzX3BhdGggPSBMT0NBTEVfQUxJQVNfUEFUSDsKLSAgc3RydWN0IGFsaWFzX21hcCAqcmV0dmFsOwotICBzaXplX3QgYWRkZWQ7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxpYXNfbWFwIGl0ZW07Ci0KLSAgICAgIGl0ZW0uYWxpYXMgPSBuYW1lOwotCi0gICAgICBpZiAobm1hcCA+IDApCi0JcmV0dmFsID0gKHN0cnVjdCBhbGlhc19tYXAgKikgYnNlYXJjaCAoJml0ZW0sIG1hcCwgbm1hcCwKLQkJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCksCi0JCQkJCSAgICAgICAoaW50ICgqKSBQQVJBTVMgKChjb25zdCB2b2lkICosCi0JCQkJCQkJCSBjb25zdCB2b2lkICopKQotCQkJCQkJKSBhbGlhc19jb21wYXJlKTsKLSAgICAgIGVsc2UKLQlyZXR2YWwgPSBOVUxMOwotCi0gICAgICAvKiBXZSByZWFsbHkgZm91bmQgYW4gYWxpYXMuICBSZXR1cm4gdGhlIHZhbHVlLiAgKi8KLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQlyZXR1cm4gcmV0dmFsLT52YWx1ZTsKLQotICAgICAgLyogUGVyaGFwcyB3ZSBjYW4gZmluZCBhbm90aGVyIGFsaWFzIGZpbGUuICAqLwotICAgICAgYWRkZWQgPSAwOwotICAgICAgd2hpbGUgKGFkZGVkID09IDAgJiYgbG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gJ1wwJykKLQl7Ci0JICBjb25zdCBjaGFyICpzdGFydDsKLQotCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdID09ICc6JykKLQkgICAgKytsb2NhbGVfYWxpYXNfcGF0aDsKLQkgIHN0YXJ0ID0gbG9jYWxlX2FsaWFzX3BhdGg7Ci0KLQkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnICYmIGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICc6JykKLQkgICAgKytsb2NhbGVfYWxpYXNfcGF0aDsKLQotCSAgaWYgKHN0YXJ0IDwgbG9jYWxlX2FsaWFzX3BhdGgpCi0JICAgIGFkZGVkID0gcmVhZF9hbGlhc19maWxlIChzdGFydCwgbG9jYWxlX2FsaWFzX3BhdGggLSBzdGFydCk7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGFkZGVkICE9IDApOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBzaXplX3QKLXJlYWRfYWxpYXNfZmlsZSAoZm5hbWUsIGZuYW1lX2xlbikKLSAgICAgY29uc3QgY2hhciAqZm5hbWU7Ci0gICAgIGludCBmbmFtZV9sZW47Ci17Ci0jaWZuZGVmIEhBVkVfQUxMT0NBCi0gIHN0cnVjdCBibG9ja19saXN0ICpibG9ja19saXN0ID0gTlVMTDsKLSNlbmRpZgotICBGSUxFICpmcDsKLSAgY2hhciAqZnVsbF9mbmFtZTsKLSAgc2l6ZV90IGFkZGVkOwotICBzdGF0aWMgY29uc3QgY2hhciBhbGlhc2ZpbGVbXSA9ICIvbG9jYWxlLmFsaWFzIjsKLQotICBmdWxsX2ZuYW1lID0gKGNoYXIgKikgYWxsb2NhIChmbmFtZV9sZW4gKyBzaXplb2YgYWxpYXNmaWxlKTsKLSAgQUREX0JMT0NLIChibG9ja19saXN0LCBmdWxsX2ZuYW1lKTsKLSAgbWVtY3B5IChmdWxsX2ZuYW1lLCBmbmFtZSwgZm5hbWVfbGVuKTsKLSAgbWVtY3B5ICgmZnVsbF9mbmFtZVtmbmFtZV9sZW5dLCBhbGlhc2ZpbGUsIHNpemVvZiBhbGlhc2ZpbGUpOwotCi0gIGZwID0gZm9wZW4gKGZ1bGxfZm5hbWUsICJyIik7Ci0gIGlmIChmcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBhZGRlZCA9IDA7Ci0gIHdoaWxlICghZmVvZiAoZnApKQotICAgIHsKLSAgICAgIC8qIEl0IGlzIGEgcmVhc29uYWJsZSBhcHByb2FjaCB0byB1c2UgYSBmaXggYnVmZmVyIGhlcmUgYmVjYXVzZQotCSBhKSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBmaXJzdCB0d28gZmllbGRzCi0JIGIpIHRoZXNlIGZpZWxkcyBtdXN0IGJlIHVzYWJsZSBhcyBmaWxlIG5hbWVzIGFuZCBzbyBtdXN0IG5vdAotCSAgICBiZSB0aGF0IGxvbmcKLSAgICAgICAqLwotICAgICAgY2hhciBidWZbQlVGU0laXTsKLSAgICAgIGNoYXIgKmFsaWFzOwotICAgICAgY2hhciAqdmFsdWU7Ci0gICAgICBjaGFyICpjcDsKLQotICAgICAgaWYgKGZnZXRzIChidWYsIEJVRlNJWiwgZnApID09IE5VTEwpCi0JLyogRU9GIHJlYWNoZWQuICAqLwotCWJyZWFrOwotCi0gICAgICBjcCA9IGJ1ZjsKLSAgICAgIC8qIElnbm9yZSBsZWFkaW5nIHdoaXRlIHNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlIChjcFswXSkpCi0JKytjcDsKLQotICAgICAgLyogQSBsZWFkaW5nICcjJyBzaWduYWxzIGEgY29tbWVudCBsaW5lLiAgKi8KLSAgICAgIGlmIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcjJykKLQl7Ci0JICBhbGlhcyA9IGNwKys7Ci0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiAhaXNzcGFjZSAoY3BbMF0pKQotCSAgICArK2NwOwotCSAgLyogVGVybWluYXRlIGFsaWFzIG5hbWUuICAqLwotCSAgaWYgKGNwWzBdICE9ICdcMCcpCi0JICAgICpjcCsrID0gJ1wwJzsKLQotCSAgLyogTm93IGxvb2sgZm9yIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZhbHVlLiAgKi8KLQkgIHdoaWxlIChpc3NwYWNlIChjcFswXSkpCi0JICAgICsrY3A7Ci0KLQkgIGlmIChjcFswXSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgY2hhciAqdHA7Ci0JICAgICAgc2l6ZV90IGxlbjsKLQotCSAgICAgIHZhbHVlID0gY3ArKzsKLQkgICAgICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiAhaXNzcGFjZSAoY3BbMF0pKQotCQkrK2NwOwotCSAgICAgIC8qIFRlcm1pbmF0ZSB2YWx1ZS4gICovCi0JICAgICAgaWYgKGNwWzBdID09ICdcbicpCi0JCXsKLQkJICAvKiBUaGlzIGhhcyB0byBiZSBkb25lIHRvIG1ha2UgdGhlIGZvbGxvd2luZyB0ZXN0Ci0JCSAgICAgZm9yIHRoZSBlbmQgb2YgbGluZSBwb3NzaWJsZS4gIFdlIGFyZSBsb29raW5nIGZvcgotCQkgICAgIHRoZSB0ZXJtaW5hdGluZyAnXG4nIHdoaWNoIGRvIG5vdCBvdmVyd3JpdGUgaGVyZS4gICovCi0JCSAgKmNwKysgPSAnXDAnOwotCQkgICpjcCA9ICdcbic7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChjcFswXSAhPSAnXDAnKQotCQkqY3ArKyA9ICdcMCc7Ci0KLQkgICAgICBpZiAobm1hcCA+PSBtYXhtYXApCi0JCWV4dGVuZF9hbGlhc190YWJsZSAoKTsKLQotCSAgICAgIC8qIFdlIGNhbm5vdCBkZXBlbmQgb24gc3RyZHVwIGF2YWlsYWJsZSBpbiB0aGUgbGliYy4gIFNpZ2ghICAqLwotCSAgICAgIGxlbiA9IHN0cmxlbiAoYWxpYXMpICsgMTsKLQkgICAgICB0cCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLQkgICAgICBpZiAodHAgPT0gTlVMTCkKLQkJewotCQkgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkJICByZXR1cm4gYWRkZWQ7Ci0JCX0KLQkgICAgICBtZW1jcHkgKHRwLCBhbGlhcywgbGVuKTsKLQkgICAgICBtYXBbbm1hcF0uYWxpYXMgPSB0cDsKLQotCSAgICAgIGxlbiA9IHN0cmxlbiAodmFsdWUpICsgMTsKLQkgICAgICB0cCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLQkgICAgICBpZiAodHAgPT0gTlVMTCkKLQkJewotCQkgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkJICByZXR1cm4gYWRkZWQ7Ci0JCX0KLQkgICAgICBtZW1jcHkgKHRwLCB2YWx1ZSwgbGVuKTsKLQkgICAgICBtYXBbbm1hcF0udmFsdWUgPSB0cDsKLQotCSAgICAgICsrbm1hcDsKLQkgICAgICArK2FkZGVkOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBQb3NzaWJseSBub3QgdGhlIHdob2xlIGxpbmUgZml0cyBpbnRvIHRoZSBidWZmZXIuICBJZ25vcmUKLQkgdGhlIHJlc3Qgb2YgdGhlIGxpbmUuICAqLwotICAgICAgd2hpbGUgKHN0cmNociAoY3AsICdcbicpID09IE5VTEwpCi0JewotCSAgY3AgPSBidWY7Ci0JICBpZiAoZmdldHMgKGJ1ZiwgQlVGU0laLCBmcCkgPT0gTlVMTCkKLQkgICAgLyogTWFrZSBzdXJlIHRoZSBpbm5lciBsb29wIHdpbGwgYmUgbGVmdC4gIFRoZSBvdXRlciBsb29wCi0JICAgICAgIHdpbGwgZXhpdCBhdCB0aGUgYGZlb2YnIHRlc3QuICAqLwotCSAgICAqY3AgPSAnXG4nOwotCX0KLSAgICB9Ci0KLSAgLyogU2hvdWxkIHdlIHRlc3QgZm9yIGZlcnJvcigpPyAgSSB0aGluayB3ZSBoYXZlIHRvIHNpbGVudGx5IGlnbm9yZQotICAgICBlcnJvcnMuICAtLWRyZXBwZXIgICovCi0gIGZjbG9zZSAoZnApOwotCi0gIGlmIChhZGRlZCA+IDApCi0gICAgcXNvcnQgKG1hcCwgbm1hcCwgc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSwKLQkgICAoaW50ICgqKSBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpKSBhbGlhc19jb21wYXJlKTsKLQotICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0gIHJldHVybiBhZGRlZDsKLX0KLQotCi1zdGF0aWMgdm9pZAotZXh0ZW5kX2FsaWFzX3RhYmxlICgpCi17Ci0gIHNpemVfdCBuZXdfc2l6ZTsKLSAgc3RydWN0IGFsaWFzX21hcCAqbmV3X21hcDsKLQotICBuZXdfc2l6ZSA9IG1heG1hcCA9PSAwID8gMTAwIDogMiAqIG1heG1hcDsKLSAgbmV3X21hcCA9IChzdHJ1Y3QgYWxpYXNfbWFwICopIG1hbGxvYyAobmV3X3NpemUKLQkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSk7Ci0gIGlmIChuZXdfbWFwID09IE5VTEwpCi0gICAgLyogU2ltcGx5IGRvbid0IGV4dGVuZDogd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBjb3JlLiAgKi8KLSAgICByZXR1cm47Ci0KLSAgbWVtY3B5IChuZXdfbWFwLCBtYXAsIG5tYXAgKiBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApKTsKLQotICBpZiAobWF4bWFwICE9IDApCi0gICAgZnJlZSAobWFwKTsKLQotICBtYXAgPSBuZXdfbWFwOwotICBtYXhtYXAgPSBuZXdfc2l6ZTsKLX0KLQotCi1zdGF0aWMgaW50Ci1hbGlhc19jb21wYXJlIChtYXAxLCBtYXAyKQotICAgICBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAxOwotICAgICBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAyOwotewotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkNBU0VDTVAKLSAgcmV0dXJuIHN0cmNhc2VjbXAgKG1hcDEtPmFsaWFzLCBtYXAyLT5hbGlhcyk7Ci0jZWxzZQotICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1hcDEtPmFsaWFzOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1hcDItPmFsaWFzOwotICB1bnNpZ25lZCBjaGFyIGMxLCBjMjsKLQotICBpZiAocDEgPT0gcDIpCi0gICAgcmV0dXJuIDA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICAvKiBJIGtub3cgdGhpcyBzZWVtcyB0byBiZSBvZGQgYnV0IHRoZSB0b2xvd2VyKCkgZnVuY3Rpb24gaW4KLQkgc29tZSBzeXN0ZW1zIGxpYmMgY2Fubm90IGhhbmRsZSBub25hbHBoYSBjaGFyYWN0ZXJzLiAgKi8KLSAgICAgIGMxID0gaXN1cHBlciAoKnAxKSA/IHRvbG93ZXIgKCpwMSkgOiAqcDE7Ci0gICAgICBjMiA9IGlzdXBwZXIgKCpwMikgPyB0b2xvd2VyICgqcDIpIDogKnAyOwotICAgICAgaWYgKGMxID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICArK3AxOwotICAgICAgKytwMjsKLSAgICB9Ci0gIHdoaWxlIChjMSA9PSBjMik7Ci0KLSAgcmV0dXJuIGMxIC0gYzI7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2ludGwvcG8ydGJsLnNlZC5pbiBiL2ludGwvcG8ydGJsLnNlZC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiY2NhNC4uMDAwMDAwMAotLS0gYS9pbnRsL3BvMnRibC5zZWQuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotIyBwbzJ0Ymwuc2VkIC0gQ29udmVydCBVbmlmb3J1bSBzdHlsZSAucG8gZmlsZSB0byBsb29rdXAgdGFibGUgZm9yIGNhdGdldHMKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0xIHsKLSAgaVwKLS8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHBvMnRibC5zZWQgZnJvbSBAUEFDS0FHRSBOQU1FQC5wb3QuICAqL1wKLVwKLSNpZiBIQVZFX0NPTkZJR19IXAotIyBpbmNsdWRlIDxjb25maWcuaD5cCi0jZW5kaWZcCi1cCi0jaW5jbHVkZSAibGliZ2V0dGV4dC5oIlwKLVwKLWNvbnN0IHN0cnVjdCBfbXNnX2VudCBfbXNnX3RibFtdID0gewotICBoCi0gIHMvLiovMC8KLSAgeAotfQotIwotIyBXcml0ZSBtc2dpZCBlbnRyaWVzIGluIEMgYXJyYXkgZm9ybS4KLSMKLS9ebXNnaWQvIHsKLSAgcy9tc2dpZFsgCV0qXCgiLioiXCkvICB7XDEvCi0gIHRiCi0jIEFwcGVuZCB0aGUgbmV4dCBsaW5lCi0gIDpiCi0gIE4KLSMgTG9vayB3aGV0aGVyIHNlY29uZCBwYXJ0IGlzIGNvbnRpbnVhdGlvbiBsaW5lLgotICBzL1woLipcKSJcKFxuXCkiXCguKiJcKS9cMVwyXDMvCi0jIFllcywgdGhlbiBicmFuY2guCi0gIHRhCi0jIEJlY2F1c2Ugd2UgYXNzdW1lIHRoYXQgdGhlIGlucHV0IGZpbGUgY29ycmVjdGx5IGZvcm1lZCB0aGUgbGluZQotIyBqdXN0IHJlYWQgY2Fubm90IGJlIGFnYWluIGJlIGEgbXNnaWQgbGluZS4gIFNvIGl0J3Mgc2FmZSB0byBpZ25vcmUKLSMgaXQuCi0gIHMvXCguKlwpXG4uKi9cMS8KLSAgYmMKLSMgV2UgZm91bmQgYSBjb250aW51YXRpb24gbGluZS4gIEJ1dCBiZWZvcmUgcHJpbnRpbmcgaW5zZXJ0ICdcJy4KLSAgOmEKLSAgcy9cKC4qXClcKFxuLipcKS9cMVxcXDIvCi0gIFAKLSMgV2UgY2Fubm90IHVzZSBEIGhlcmUuCi0gIHMvLipcblwoLipcKS9cMS8KLSMgU29tZSBidWdneSBzZWRzIGRvIG5vdCBjbGVhciB0aGUgYHN1Y2Nlc3NmdWwgc3Vic3RpdHV0aW9uIHNpbmNlIGxhc3QgYGB0JycnCi0jIGZsYWcgb24gYE4nLCBzbyB3ZSBkbyBhIGB0JyBoZXJlIHRvIGNsZWFyIGl0LgotICB0YgotIyBOb3QgcmVhY2hlZAotICA6YwotICB4Ci0jIFRoZSBmb2xsb3dpbmcgbmljZSBzb2x1dGlvbiBpcyBieQotIyBCcnVubyA8SGFpYmxlQG1hMnMyLm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZT4KLSAgdGQKLSMgSW5jcmVtZW50IGEgZGVjaW1hbCBudW1iZXIgaW4gcGF0dGVybiBzcGFjZS4KLSMgRmlyc3QgaGlkZSB0cmFpbGluZyBgOScgZGlnaXRzLgotICA6ZAotICBzLzlcKF8qXCkkL19cMS8KLSAgdGQKLSMgQXNzdXJlIGF0IGxlYXN0IG9uZSBkaWdpdCBpcyBhdmFpbGFibGUuCi0gIHMvXlwoXypcKSQvMFwxLwotIyBJbmNyZW1lbnQgdGhlIGxhc3QgZGlnaXQuCi0gIHMvOFwoXypcKSQvOVwxLwotICBzLzdcKF8qXCkkLzhcMS8KLSAgcy82XChfKlwpJC83XDEvCi0gIHMvNVwoXypcKSQvNlwxLwotICBzLzRcKF8qXCkkLzVcMS8KLSAgcy8zXChfKlwpJC80XDEvCi0gIHMvMlwoXypcKSQvM1wxLwotICBzLzFcKF8qXCkkLzJcMS8KLSAgcy8wXChfKlwpJC8xXDEvCi0jIENvbnZlcnQgdGhlIGhpZGRlbiBgOScgZGlnaXRzIHRvIGAwJ3MuCi0gIHMvXy8wL2cKLSAgeAotICBHCi0gIHMvXCguKlwpXG5cKFswLTldKlwpL1wxLCBcMn0sLwotICBzL1woLipcKSIkL1wxLwotICBwCi19Ci0jCi0jIExhc3QgbGluZS4KLSMKLSQgewotICBpXAotfTtcCi0KLSAgZwotICBzLzAqXCguKlwpL2ludCBfbXNnX3RibF9sZW5ndGggPSBcMTsvcAotfQotZApkaWZmIC0tZ2l0IGEvaW50bC90ZXh0ZG9tYWluLmMgYi9pbnRsL3RleHRkb21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkOTM0MC4uMDAwMDAwMAotLS0gYS9pbnRsL3RleHRkb21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGV4dGRvbWFpbigzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgaWZuZGVmIG1lbWNweQotIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogTmFtZSBvZiB0aGUgZGVmYXVsdCB0ZXh0IGRvbWFpbi4gICovCi1leHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbltdOwotCi0vKiBEZWZhdWx0IHRleHQgZG9tYWluIGluIHdoaWNoIGVudHJpZXMgZm9yIGdldHRleHQoMykgYXJlIHRvIGJlIGZvdW5kLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICpfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLQotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIFRFWFRET01BSU4gX190ZXh0ZG9tYWluCi0jIGRlZmluZSBzdHJkdXAoc3RyKSBfX3N0cmR1cCAoc3RyKQotI2Vsc2UKLSMgZGVmaW5lIFRFWFRET01BSU4gdGV4dGRvbWFpbl9fCi0jZW5kaWYKLQotLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCi0gICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgotICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCi1jaGFyICoKLVRFWFRET01BSU4gKGRvbWFpbm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci17Ci0gIGNoYXIgKm9sZDsKLQotICAvKiBBIE5VTEwgcG9pbnRlciByZXF1ZXN0cyB0aGUgY3VycmVudCBzZXR0aW5nLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci0KLSAgb2xkID0gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci0KLSAgLyogSWYgZG9tYWluIG5hbWUgaXMgdGhlIG51bGwgc3RyaW5nIHNldCB0byBkZWZhdWx0IGRvbWFpbiAibWVzc2FnZXMiLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWVbMF0gPT0gJ1wwJwotICAgICAgfHwgc3RyY21wIChkb21haW5uYW1lLCBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikgPT0gMCkKLSAgICBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluOwotICBlbHNlCi0gICAgewotICAgICAgLyogSWYgdGhlIGZvbGxvd2luZyBtYWxsb2MgZmFpbHMgYF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluJwotCSB3aWxsIGJlIE5VTEwuICBUaGlzIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHNvIHNpZ25hbHMgd2UKLQkgYXJlIG91dCBvZiBjb3JlLiAgKi8KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLSAgICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gc3RyZHVwIChkb21haW5uYW1lKTsKLSNlbHNlCi0gICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkb21haW5uYW1lKSArIDE7Ci0gICAgICBjaGFyICpjcCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLSAgICAgIGlmIChjcCAhPSBOVUxMKQotCW1lbWNweSAoY3AsIGRvbWFpbm5hbWUsIGxlbik7Ci0gICAgICBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IGNwOwotI2VuZGlmCi0gICAgfQotCi0gIGlmIChvbGQgIT0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4pCi0gICAgZnJlZSAob2xkKTsKLQotICByZXR1cm4gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX3RleHRkb21haW4sIHRleHRkb21haW4pOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL3hvcGVuLW1zZy5zZWQgYi9pbnRsL3hvcGVuLW1zZy5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOWMwYmIuLjAwMDAwMDAKLS0tIGEvaW50bC94b3Blbi1tc2cuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLSMgcG8ybXNnLnNlZCAtIENvbnZlcnQgVW5pZm9ydW0gc3R5bGUgLnBvIGZpbGUgdG8gWC9PcGVuIHN0eWxlIC5tc2cgZmlsZQotIyBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMKLSMgVGhlIGZpcnN0IGRpcmVjdGl2ZSBpbiB0aGUgLm1zZyBzaG91bGQgYmUgdGhlIGRlZmluaXRpb24gb2YgdGhlCi0jIG1lc3NhZ2Ugc2V0IG51bWJlci4gIFdlIHVzZSBhbHdheXMgc2V0IG51bWJlciAxLgotIwotMSB7Ci0gIGlcCi0kc2V0IDEgIyBBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgcG8ybXNnLnNlZAotICBoCi0gIHMvLiovMC8KLSAgeAotfQotIwotIyBXZSBjb3B5IGFsbCBjb21tZW50cyBpbnRvIHRoZSAubXNnIGZpbGUuICBQZXJoYXBzIHRoZXkgY2FuIGhlbHAuCi0jCi0vXiMvIHMvXiNbIAldKi8kIC9wCi0jCi0jIFdlIGNvcHkgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgYXMgYSBjb21tZW50IGludG8gdGhlIC5tc2cgZmlsZS4KLSMKLS9ebXNnaWQvIHsKLSMgRG9lcyBub3Qgd29yayBub3cKLSMgIC8iJC8hIHsKLSMgICAgcy9cXCQvLwotIyAgICBzLyQvIC4uLiAobW9yZSBsaW5lcyBmb2xsb3dpbmcpIi8KLSMgIH0KLSAgcy9ebXNnaWRbIAldKiJcKC4qXCkiJC8kIE9yaWdpbmFsIE1lc3NhZ2U6IFwxLwotICBwCi19Ci0jCi0jIFRoZSAubXNnIGZpbGUgY29udGFpbnMsIG90aGVyIHRoZW4gdGhlIC5wbyBmaWxlLCBvbmx5IHRoZSB0cmFuc2xhdGlvbnMKLSMgYnV0IGVhY2ggZ2l2ZW4gYSB1bmlxdWUgSUQuICBTdGFydGluZyBmcm9tIDEgYW5kIGluY3JlbWVudGluZyBieSAxIGZvcgotIyBlYWNoIG1lc3NhZ2Ugd2UgYXNzaWduIHRoZW0gdG8gdGhlIG1lc3NhZ2VzLgotIyBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgLnBvIGZpbGUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2F0LWlkLXRibC5jIGZpbGUKLSMgKHdpdGggcG8tdG8tdGJsKSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHVzZWQgaGVyZS4gIChBdCBsZWFzdCB0aGUgb3JkZXIKLSMgb2YgZGVjbGFyYXRpb25zIG11c3Qgbm90IGJlIGNoYW5nZWQuKQotIwotL15tc2dzdHIvIHsKLSAgcy9tc2dzdHJbIAldKiJcKC4qXCkiL1wxLwotICB4Ci0jIFRoZSBmb2xsb3dpbmcgbmljZSBzb2x1dGlvbiBpcyBieQotIyBCcnVubyA8SGFpYmxlQG1hMnMyLm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZT4KLSAgdGQKLSMgSW5jcmVtZW50IGEgZGVjaW1hbCBudW1iZXIgaW4gcGF0dGVybiBzcGFjZS4KLSMgRmlyc3QgaGlkZSB0cmFpbGluZyBgOScgZGlnaXRzLgotICA6ZAotICBzLzlcKF8qXCkkL19cMS8KLSAgdGQKLSMgQXNzdXJlIGF0IGxlYXN0IG9uZSBkaWdpdCBpcyBhdmFpbGFibGUuCi0gIHMvXlwoXypcKSQvMFwxLwotIyBJbmNyZW1lbnQgdGhlIGxhc3QgZGlnaXQuCi0gIHMvOFwoXypcKSQvOVwxLwotICBzLzdcKF8qXCkkLzhcMS8KLSAgcy82XChfKlwpJC83XDEvCi0gIHMvNVwoXypcKSQvNlwxLwotICBzLzRcKF8qXCkkLzVcMS8KLSAgcy8zXChfKlwpJC80XDEvCi0gIHMvMlwoXypcKSQvM1wxLwotICBzLzFcKF8qXCkkLzJcMS8KLSAgcy8wXChfKlwpJC8xXDEvCi0jIENvbnZlcnQgdGhlIGhpZGRlbiBgOScgZGlnaXRzIHRvIGAwJ3MuCi0gIHMvXy8wL2cKLSAgeAotIyBCcmluZyB0aGUgbGluZSBpbiB0aGUgZm9ybWF0IGA8bnVtYmVyPiA8bWVzc2FnZT4nCi0gIEcKLSAgcy9eW15cbl0qJC8mIC8KLSAgcy9cKC4qXClcblwoWzAtOV0qXCkvXDIgXDEvCi0jIENsZWFyIGZsYWcgZnJvbSBsYXN0IHN1YnN0aXR1dGlvbi4KLSAgdGIKLSMgQXBwZW5kIHRoZSBuZXh0IGxpbmUuCi0gIDpiCi0gIE4KLSMgTG9vayB3aGV0aGVyIHNlY29uZCBwYXJ0IGlzIGEgY29udGludWF0aW9uIGxpbmUuCi0gIHMvXCguKlxuXCkiXCguKlwpIi9cMVwyLwotIyBZZXMsIHRoZW4gYnJhbmNoLgotICB0YQotICBQCi0gIEQKLSMgTm90ZSB0aGF0IGBEJyBpbmNsdWRlcyBhIGp1bXAgdG8gdGhlIHN0YXJ0ISEKLSMgV2UgZm91bmQgYSBjb250aW51YXRpb24gbGluZS4gIEJ1dCBiZWZvcmUgcHJpbnRpbmcgaW5zZXJ0ICdcJy4KLSAgOmEKLSAgcy9cKC4qXClcKFxuLipcKS9cMVxcXDIvCi0gIFAKLSMgV2UgY2Fubm90IHVzZSB0aGUgc2VkIGNvbW1hbmQgYEQnIGhlcmUKLSAgcy8uKlxuXCguKlwpL1wxLwotICB0YgotfQotZApkaWZmIC0tZ2l0IGEvbGQvQ2hhbmdlTG9nIGIvbGQvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzI2Y2UwLi4wMDAwMDAwCi0tLSBhL2xkL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDk2NzUgKzAsMCBAQAotMTk5OS0xMi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEZpeCBhcm0tZXBvYy1wZSBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkKLQkqIGVtdWxwYXJhbXMvYXJtX2Vwb2NfcGUuc2ggKFNDUklQVF9OQU1FKTogU2V0IHRvIGVwb2NwZS4KLQotCSogc2NyaXB0dGVtcGwvZXBvY3BlLnNjOiBOZXcgZmlsZTogY29weSBvZiBwZS5zYywgY3VzdG9taXNlZCBmb3IKLQlFUE9DIGJ5IHBsYWNpbmcgLnJkYXRhIGludG8gLnRleHQuCi0KLTE5OTktMTEtMjYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUHV0IEFDX01TR19DSEVDS0lORy9BQ19NU0dfUkVTVUxUIGFyb3VuZCBjaGVjayBmb3IKLQlTVFJJTkdJRlkuICBVc2UgeWVzL25vIGluc3RlYWQgb2YgdHJ1ZS9mYWxzZSBhcyB2YWx1ZSBmb3IgY2FjaGUKLQl2YXJpYWJsZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotMTk5OS0xMS0yNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKElHTk9SRV9TRUNUSU9OKTogU2VjdGlvbiBtdXN0IGhhdmUgYm90aCBBTExPQyBhbmQgTE9BRAotCWF0dHJpYnV0ZXMgaW4gb3JkZXIgdG8gYmUgY2hlY2tlZC4KLQotMTk5OS0xMS0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMpOiBGaXggdGVzdCB0byBkZXRlcm1pbmUKLQlpZiBhIHNlY3Rpb24gc2hvdWxkIGJlIHRlc3RlZC4KLQkoSUdOT1JFX1NFQ1RJT04pOiBOZXcgbWFjcm8uCi0KLVdlZCBOb3YgIDMgMjM6MzE6MTkgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlKToKLQlDbGVhbiB1cCBjb2RlIHRvIHVzZSBFWFRSQV9TSExJQl9FWFRFTlNJT04uCi0KLTE5OTktMTEtMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJtY29yZS5zaCAoT1VUUFVUX0ZPUk1BVCk6IENoYW5nZSB0byBsaXR0bGUgZW5kaWFuLgotCSogZW11bHBhcmFtcy9tY29yZXBlLnNoIChPVVRQVVRfRk9STUFUKTogQ2hhbmdlIHRvIGxpdHRsZSBlbmRpYW4uCi0KLTE5OTktMTEtMDEgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHBvYm94LmNvbT4KLQotCSogbGRsYW5nLmMgKHNlY3Rpb25fYWxyZWFkeV9saW5rZWQpOiBSZXdvcmsgdG8gdXNlIGhhc2ggdGFibGUuCi0JKGFscmVhZHlfbGlua2VkX25ld2Z1bmMpOiBOZXcgZnVuY3Rpb24uCi0JKGFscmVhZHlfbGlua2VkX3RhYmxlX2luaXQpOiBOZXcgZnVuY3Rpb24uCi0JKGFscmVhZHlfbGlua2VkX3RhYmxlX2ZyZWUpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfcHJvY2Vzcyk6IEluaXRpYWxpemUgYW5kIGZyZWUgdGhlIGFscmVhZHlfbGlua2VkIGhhc2ggdGFibGUuCi0KLTE5OTktMTAtMjcgIEFuZHJlYXMgSmFlZ2VyICA8YWpAc3VzZS5kZT4KLQotCSogbGQvY29uZmlndXJlLmhvc3Q6IEFkZGVkIEhPU1RJTkdfQ1JUMCwgSE9TVElOR19MSUJTIGZvciAKLQl0YXJnZXQgIm1pcHMqLSotbGludXgtZ251KiIuCi0KLTE5OTktMTAtMjcgIFNjb3R0IEJhbWJyb3VnaCAgPHNjb3R0YkBuZXR3aW5kZXIub3JnPgotCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtOiBJbmNsdWRlIGN0eXBlLmggdG8gcHJldmVudCBjb21waWxlIHRpbWUKLQl3YXJuaW5ncy4gCi0KLTE5OTktMTAtMjYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtIChnbGR7fV9maW5pc2gpOiBSZW1vdmUgZXh0cmFuZW91cwotCXVuZGVyc2NvcmUgZnJvbSBwcm90b3R5cGUuCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtIChnbGR7fV9maW5pc2gpOiBSZW1vdmUgZXh0cmFuZW91cwotCXVuZGVyc2NvcmUgZnJvbSBwcm90b3R5cGUuCi0KLTE5OTktMTAtMDcgIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjICgucmVsLnNkYXRhKTogQ29tYmluZSBhbGwgdGhlIHNkYXRhIHJlbG9jcwotCWJlaW5nIC5yZWwuc2RhdGEsIC5yZWwuc2RhdGEuKiwgLnJlbC5nbnUubGlua29uY2UucyouCi0JKC5yZWxhLnNkYXRhKTogTGlrZXdpc2UgZm9yIC5yZWxhLnNkYXRhLiogYW5kIC5yZWxhLmdudS5saW5rb25jZS5zKi4KLQkoLnJlbC5zYnNzKTogTWFrZSBsaWtlIC5yZWwuYnNzLgotCSgucmVsYS5zYnNzKTogTWFrZSBsaWtlIC5yZWwuYnNzLgotCSguc2RhdGEpOiBEb24ndCBpbmNsdWRlIC5nbnUubGlua29uY2Uucy4qIG9yIC5zZGF0YS4qIHdoZW4KLQlsZCAtci4KLQkoLnNic3MpOiBEbyB0aGUgc2FtZSB0aGluZ3MgYXMgZm9yIC5ic3M6IGluY2x1ZGUgU0RBVEFfU1RBUlRfU1lNQk9MUywKLQkuZHluc2Jzcy4KLQotMTk5OS0wOS0yOSAgQW5kcmV3IEhhbGV5ICA8YXBoQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IERlZmVyCi0JbWVyZ2luZyBzZWN0aW9ucyB3aGVuIG5vdCByZWxvY2F0aW5nLgotCi0xOTk5LTA5LTI4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogcGUtZGxsLmMgKHByb2Nlc3NfZGVmX2ZpbGUpOiBNb3ZlIHRoZSBvZmZzZXQgbG9va3VwIGZyb20gaGVyZSB0bwotCShmaWxsX2V4cG9ydGVkX29mZnNldHMpOiBoZXJlLiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShmaWxsX2VkYXRhKTogVXNlLgotCQotMTk5OS0wOS0yOCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGRlZmZpbGVwLnkgKHRva2Vucyk6IEFkZCB1cHBlciBhbmQgbG93ZXIgY2FzZSB2ZXJzaW9ucyBvZiBEQVRBLAotCUNPTlNUQU5ULCBOT05BTUUgYW5kIFBSSVZBVEUgdG9rZW5zLgotCShjb21tYW5kKTogVXNlIERBVEFVLgotCShleHBsaW5lKTogQWxsb3cgZm9yIGRyZWN0dmUgc3ludGF4IGFzIHdlbGwuCi0JKGV4cF9vcHRfbGlzdCk6IExpa2V3aXNlLgotCShleHBfb3B0KTogTGlrZXdpc2UuCi0JKiBwZS1kbGwuYyAobWFrZV9vbmUpOiBPbmx5IGdlbmVyYXRlIHRoZSBpZGF0YSBlbnRyaWVzIGZvciBkYXRhCi0Jc3ltYm9scy4KLQotMTk5OS0wOS0yOCAgR2VvZmZyZXkgS2VhdGluZyAgPGdlb2Zma0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2MgKC5zZGF0YSk6IEluY2x1ZGUgLmdudS5saW5rb25jZS5zLiogc2VjdGlvbnMKLQlpbiAuc2RhdGEgdG9vLgotCi0xOTk5LTA5LTI2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2MgKC5ic3MpOiBBY2NlcHQgc2VjdGlvbnMgbmFtZWQgLmJzcy4qCi0JKC5zYnNzKTogQWNjZXB0IHNlY3Rpb25zIG5hbWVzIC5zYnNzLioKLQotMTk5OS0wOS0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBlYXJtX2Vwb2NfcGUuYyBidWlsZCB0YXJnZXQuIAotCi1TYXQgU2VwIDE4IDA3OjU3OjEwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5zaCAoT1RIRVJfUkVBRE9OTFlfU1lNQk9MUyk6IFJlbW92ZSAiLnN0dWJzIiwKLQl0aGV5J3ZlIGJlZW4gcmVuYW1lZCB0byAiLnN0dWIiLCB3aGljaCBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkKLQlieSBlbGYuc2MuCi0KLUZyaSBTZXAgMTcgMTE6MDA6MzMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLnNoIChURVhUX1NUQVJUX1NZTUJPTFMpOiBLaWxsIGNvbXBsZXRlbHkuCi0JKERBVEFfU1RBUlRfU1lNQk9MUyk6IEtpbGwgX19ocF9sb2FkX21hcCBkZWZpbml0aW9uCi0KLVRodSBTZXAgMTYgMTA6NTk6NTYgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlKToKLQlVc2UgdGhlIHNhbWUgZmlsZW5hbWUgZXh0ZW5zaW9uIGZvciB0aGUgYmZkX2VsZl9kdF9uZWVkZWRfbmFtZSBjYWxsCi0JYXMgd2UgZGlkIGZvciBmaW5kaW5nIHRoZSBsaWJyYXJ5LgotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLnNoIChEQVRBX1NUQVJUX1NZTUJPTFMpOiBEZWZpbmUuCi0JKE9USEVSX1JFQURXUklURV9TRUNUSU9OUyk6IE5vIGxvbmdlciBkZWZpbmUgX19ocF9sb2FkX21hcC4KLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5zaCAoVEVYVF9TVEFSVF9TWU1CT0xTKTogRGVmaW5lLgotCi1XZWQgU2VwIDE1IDAyOjQ3OjQzIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5zaCAoU0hMSUJfVEVYVF9TVEFSVF9BRERSKTogRGVmaW5lLgotCShTSExJQl9EQVRBX0FERFIpOiBMaWtld2lzZS4KLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5zaCAoVEVYVF9EWU5BTUlDKTogRGVmaW5lLgotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLmggKE9USEVSX1JFQURXUklURV9TRUNUSU9OUyk6ICBObyBsb25nZXIgY29tYmluZQotCXRoZSAucGx0LCAuZGx0LCAub3BkICBpbnRvIGEgc2luZ2xlIG91dHB1dCBzZWN0aW9uLiAgUHJvdmlkZSB2YWx1ZXMKLQlmb3IgX19ncCBhbmQgX19ocF9sb2FkX21hcC4KLQotMTk5OS0wOS0xNCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQ2Fub25pY2FsaXphdGlvbiBvZiB0YXJnZXQgbmFtZXMpOiBSZW1vdmUgYWRkaW5nCi0JJHtDT05GSUdfU0hFTEx9IGluIGZyb250IG9mICRhY19jb25maWdfc3ViLCBzaW5jZSBhdXRvY29uZmlnIDIuMTQKLQlnZW5lcmF0ZXMgJGFjX2NvbmZpZ19zdWIgd2l0aCBhICR7Q09ORklHX1NIRUxMfSBhbHJlYWR5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0xOTk5LTA5LTE0ICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IGFsbG93IGZvciAKLQl0ZXJtaW5hdGluZyBudWxsLgotCi0xOTk5LTA5LTE0ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEZWZpbmUgRVhUUkFfU0hMSUJfRVhURU5TSU9OIHRvICIuc2wiIGZvciBIUCB0YXJnZXQuCi0JKiBjb25maWcuaW46IEFkZCBFWFRSQV9TSExJQl9FWFRFTlNJT04uCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUpOgotCVNlYXJjaCBmb3Igc2Vjb25kIHNoYXJlZCBsaWIgZXh0ZW5zaW9uIG9ubHkgaWYgRVhUUkFfU0hMSUJfRVhURU5TSU9OCi0JaXMgZGVmaW5lZC4KLQotMTk5OS0wOS0xNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBlYXJtX2Vwb2NfcGUuYyBidWlsZCB0YXJnZXQuCi0KLVR1ZSBTZXAgMTQgMDU6MjY6MzQgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLnNoIChPVEhFUl9HT1RfUkVMT0NfU0VDVElPTlMpOiBBZGQgLnJlbGEuZGx0LgotCi0xOTk5LTA5LTEzICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtOiBSZW1vdmUgdGhlIG91dHB1dCBmaWxlIGF0IHRoZSBzdGFydCwgaW4gY2FzZSBpdAotCWlzIG5vdCB3cml0YWJsZS4KLQotTW9uIFNlcCAxMyAwMDoxNzoxOCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUpOgotCVNlYXJjaCBmb3IgZmlsZSB3aXRoIC5zbCBleHRlbnNpb24gaWYgbm8gZmlsZSB3aXRoIGEgLnNvIGV4dGVuc2lvbgotCWlzIGZvdW5kLgotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLnNoIChPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMpOiBQdXQgLnBsdAotCWF0IHRoZSBzdGFydCBvZiB0aGUgLmRsdCBvdXRwdXQgc2VjdGlvbi4KLQotMTk5OS0wOS0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHBlLmVtOiBEb24ndCBpbmNsdWRlICIuLi9iZmQvbGliYmZkLmgiLgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IFVzZSB4bWFsbG9jIHJhdGhlciB0aGFuCi0JYmZkX2FsbG9jLgotCi0JKiBwZS1kbGwuaDogTmV3IGZpbGUuCi0JKiBwZS1kbGwuYzogSW5jbHVkZSAicGUtZGxsLmgiLiAgTWFyayB1bnVzZWQgYXJndW1lbnRzIGFzIG5lZWRlZAotCXRvIGF2b2lkIHdhcm5pbmdzLgotCShlZGF0YV9zeiwgcmVsb2Nfc3opOiBDaGFuZ2UgZnJvbSBpbnQgdG8gc2l6ZV90LgotCShwZV9kZXRhaWxzX3R5cGUpOiBDaGFuZ2UgdHlwZSBvZiBpbWFnZWJhc2VfcmVsb2MgZnJvbSBpbnQgdG8KLQl1bnNpZ25lZCBpbnQuCi0JKHBlX2RldGFpbF9saXN0KTogRnVsbHkgaW5pdGlhbGl6ZSBsYXN0IGVudHJ5LgotCShwZV9kbGxfaWRfdGFyZ2V0KTogQ2hhbmdlIHBhcmFtZXRlciB0byBjb25zdC4KLQkocGVfZGxsX2dlbmVyYXRlX2RlZl9maWxlKTogTGlrZXdpc2UuCi0JKHBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIpOiBMaWtld2lzZS4KLQkocGVfaW1wbGllZF9pbXBvcnRfZGxsKTogTGlrZXdpc2UuICBDaGFuZ2UgZGxsX25hbWUgdG8gY29uc3QuCi0JKiBlbXVsdGVtcGwvcGUuZW06IEluY2x1ZGUgInBlLWRsbC5oIi4gIFJlbW92ZSBkZWNsYXJhdGlvbnMgbm93IGluCi0JcGUtZGxsLmguCi0JKGluaXQpOiBGdWxseSBpbml0aWFsaXplIF9fZGxsX18gZW50cnkuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMKLQlzZXF1ZW5jZSwgZWx0LCBhbmQgaS4KLQkqIGRlZmZpbGUuaDogQWRkIHByZXByb2Nlc3NvciBndWFyZC4KLQkqIGRlZmZpbGVwLnkgKGRlZl9kZWJ1Zyk6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoSEZJTEVTKTogQWRkIHBlLWRsbC5oLgotCi0xOTk5LTA5LTEyICBEb25uIFRlcnJ5ICA8ZG9ubkBpbnRlcml4LmNvbT4KLQotCSogbGQuaCAobGRfYWJvcnQpOiBEZWNsYXJlLgotCShhYm9ydCk6IERlZmluZS4KLQkqIGxkbWlzYy5jIChsZF9hYm9ydCk6IERlZmluZS4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFVzZSAke0VOVFJZfSByYXRoZXIgdGhhbiBfbWFpbkNSVFN0YXJ0dXAuCi0JTW92ZSAuYnNzIHNlY3Rpb24gYWZ0ZXIgLnJkYXRhLiAgTW92ZSAucmVsb2Mgc2VjdGlvbiBhZnRlciAucnNyYy4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBVc2Ugc3RydG91bCBmb3IgLS1zcGxpdC1ieS1yZWxvYwotCWFyZ3VtZW50LgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IElmIHdlIGdldCBhbiB1bnJlY29nbml6ZWQgYXJndW1lbnQsCi0JbWVudGlvbiAtLWhlbHAuCi0KLQkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogVXNlIGNvbWRhdCBpbmZvcm1hdGlvbiBpZiBpdAotCWlzIGF2YWlsYWJsZS4KLQotCSogZW11bHRlbXBsL3BlLmVtIChQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQpOiBJZgotCU9WRVJSSURFX1NFQ1RJT05fQUxJR05NRU5UIGlzIGRlZmluZWQsIGNoYW5nZSB0byB0aGF0LgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKTogVXNlIEVYRUNVVEFCTEVfTkFNRSBpZiBpdCBpcwotCWRlZmluZWQsIHJhdGhlciB0aGFuIGEuZXhlLgotCShpbml0KTogRGVmaW5lIF9fc3Vic3lzdGVtX18gYXMgJHtTVUJTWVNURU19LgotCShzZXRfcGVfc3Vic3lzdGVtKTogQWRkICR7SU5JVElBTF9TWU1CT0xfQ0hBUn0gYmVmb3JlIGVudHJ5IHN5bWJvbAotCW5hbWUuCi0KLTE5OTktMDktMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZGxhbmcuYyAob3Blbl9vdXRwdXQpOiBDaGFuZ2UgbG9jYWwgdmFyaWFibGUgZGVzaXJlZF9lbmRpYW4KLQlmcm9tIGludCB0byBlbnVtIGJmZF9lbmRpYW4uCi0KLQkqIGVtdWxwYXJhbXMvYXJtX2Vwb2NfcGUuc2g6IERlZmluZSBFTlRSWSwgU1VCU1lTVEVNIGFuZAotCUlOSVRJQUxfU1lNQk9MX0NIQVIuCi0JKiBlbXVscGFyYW1zL2FybXBlLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvbW9yZXBlLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvcHBjcGUuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9pMzg2cGUuc2ggKEVOVFJZKTogRGVmaW5lIGFzIF9tYWluQ1JUU3RhcnR1cC4KLQkoU1VCU1lTVEVNKTogRGVmaW5lIGFzIFBFX0RFRl9TVUJTWVNURU0uCi0KLUZyaSBTZXAgMTAgMDA6MjI6NTAgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLnNoIChMSUJfUEFUSCk6IERlZmluZS4KLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5zaCAoT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMpOiBQdXQgc3R1YnMgYmVmb3JlCi0JdW53aW5kZXJzIHNvIHRoYXQgdGhleSBhcmUgY2xvc2VyIHRvIHRoZSB0ZXh0IHNlY3Rpb24uCi0JKE9USEVSX0JTU19TRUNUSU9OUyk6IERlZmluZS4KLQkoRVhFQ1VUQUJMRV9TWU1CT0xTKTogUHJvdmlkZSBfX1NZU1RFTV9JRCBhbmQgX0ZQVV9TVEFUVVMuCi0JKElOSVRfU1RBUlQsIElOSVRfRU5EKTogRGVmaW5lLgotCShGSU5JX1NUQVJULCBGSU5JX0VORCk6IERlZmluZS4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIHN1cHBvcnQgZm9yIElOSVRfU1RBUlQsIElOSVRfRU5ELAotCUZJTklfU1RBUlQsIEZJTklfRU5EIGFuZCBPVEhFUl9CU1NfU0VDVElPTlMuCi0KLVRodSBTZXAgIDkgMjE6NDM6NTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLnNoIChURVhUX1NUQVJUX0FERFIpOiBNb3ZlIHVwIG9uZSBwYWdlLgotCShEQVRBX0FERFIpOiBEZWZpbmUuCi0KLTE5OTktMDktMDkgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoIChSRUFET05MWV9TVEFSVF9BRERSKTogU2V0IHRvIDB4MjAwMDAwNC4KLQotMTk5OS0wOS0wOSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KLQotCSogbGQudGV4aW5mbzogRml4IGFyZ3VtZW50cyBvZiBAdmFyIHRvIG5vdCBjb250YWluIHB1bmN0dWF0aW9uLgotCi1UaHUgU2VwICA5IDA1OjUyOjM0IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL2VsZjY0aHBwYS5zaCAoT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TKTogRGVmaW5lLgotCi0xOTk5LTA5LTA4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGY2NGhwcGEuc2ggKEVMRlNJWkUpOiBOZXcuICBTZXQgdG8gNjQuCi0KLVdlZCBTZXAgIDggMDA6MDc6MzkgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvZWxmNjRocHBhLnNoIChFTlRSWSk6IERlZmluZSB0byBtYWluLgotCi0xOTk5LTA5LTAzICBTY290dCBCYW1icm91Z2ggIDxzY290dGJAbmV0d2luZGVyLm9yZz4KLQotCSogbGQvY29uZmlndXJlLmhvc3Q6IEFkZGVkIEhPU1RJTkdfQ1JUMCwgSE9TVElOR19MSUJTIGZvciAKLQl0YXJnZXQgImFybSotKi1saW51eC1nbnUqIgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHBqbC0qLSosIHBqLSotKik6IE5ldyB0YXJnZXRzLgotCSogZW11bHBhcmFtcy9wamVsZi5zaDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL3BqbGVsZi5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9wai5zYzogTmV3IGZpbGUuCQotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVwamVsZi5vIGFuZCBlcGpsZWxmLm8uCi0JKGVwamVsZi5vLCBlcGpsZWxmLm8pOiBOZXcgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgU2VwICAzIDIwOjE3OjA4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9lbGY2NGhwcGEuc2ggKE1BWFBBR0VTSVpFKTogRGVmaW5lLgotCShPVEhFUl9SRUFET05MWV9TRUNUSU9OUywgREFUQV9QTFQpOiBMaWtld2lzZS4KLQotVGh1IFNlcCAgMiAxNDozMjowMyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvZWxmNjRocHBhLnNoOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS50Z3QgKGhwcGEqdy0qLSopOiBVc2UgZWxmNjRocHBhIGVtdWxhdGlvbi4KLQkqIE1ha2VmaWxlLmFtIChBTExfNjRfRU1VTEFUSU9OUyk6IEFkZCBlZWxmNjRocHBhLm8KLQkoZWVsZjY0aHBwYS5jKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgotCi0xOTk5LTA4LTI1ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogZW11bHBhcmFtcy9hcm1lbGYuc2ggKE9USEVSX0JTU19TWU1CT0xTKTogQWRkIF9fZW5kX18uCi0JKiBlbXVscGFyYW1zL2FybWVsZl9saW51eC5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoOiBMaWtld2lzZS4KLQotMTk5OS0wOC0yNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCUZyb20gYSBwYXRjaCBzdWJtaXR0ZWQgYnkgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAYmFhbHBlcmF6aW0uZnJvYi5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGFybS0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVhcm1uYnNkLm8uCi0JKGVhcm1uYnNkLmMpOiBOZXcgcnVsZSB3aXRoIGRlcHMuCi0JKiBNYWtlZmlsZS5vbjogUmVnZW5lcmF0ZS4KLQkqIGVtdWxwYXJhbXMvYXJtbmJzZC5zaDogTmV3IGZpbGUuCi0KLTE5OTktMDgtMjMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJtY29yZS5zaCAoUEFSU0VfQU5EX0xJU1RfQVJHUyk6IERlZmluZS4KLQlJbXBsZW1lbnQgLS1iYXNlLWZpbGUgY29tbWFuZCBsaW5lIHN3aXRjaC4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBBZGQgYWJpbGl0eSBmb3IgaW5kaXZpZHVhbCB0YXJnZXRzIHRvIGhhdmUKLQl0aGVpciBvd24gY29tbWFuZCBsaW5lIHN3aXRjaGVzIGJ5IGRlZmluaW5nIFBBUlNFX0FORF9MSVNUX0FSR1MuCi0KLTE5OTktMDgtMTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQHN1c2UuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgJHtDQ30gaW5zdGVhZCBvZiBnY2MgZm9yIGZpbmRpbmcgY29tcGlsZXIKLQlyZWxhdGVkIGZpbGVzLgotCi0xOTk5LTA4LTExICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9tY29yZXBlLnNjIChPVVRQVVRfRk9STUFUKTogRml4IHR5cG8uCi0KLTE5OTktMDgtMDkgIE1hcmsgRWxicmVjaHQgIDxzbm93YmFsbDNAYmlnZm9vdC5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2kzODZnbzMyLnNjOiBIYW5kbGUgZysrIGV4Y2VwdGlvbiBzZWN0aW9ucy4KLQotMTk5OS0wOC0wOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIFdhbGx5IElpbXVyYSA8aWltdXJhQG1pY3JvdW5pdHkuY29tPjoKLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBXaGVuIGNoZWNraW5nIHdoZXRoZXIgYW4gYWRkcmVzcwotCWlzIHdpdGhpbiBhIHJlZ2lvbiwgZG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5IHdyYXBwaW5nIGFyb3VuZCBhdCB0aGUKLQllbmQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UuCi0KLTE5OTktMDgtMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogVXBkYXRlIGZvciByZW5hbWluZyBvZiBTRUNfU0hPUlQgdG8KLQlTRUNfU01BTExfREFUQS4KLQotCSogTWFrZWZpbGUuYW06IFJlbmFtZSAuZGVwKiBmaWxlcyB0byBERVAqLiAgQ2hhbmdlIERFUCB2YXJpYWJsZSB0bwotCU1LREVQLiAgUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wOC0wOCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBjb25maWd1cmUuaG9zdCAoc3BhcmMtKi1saW51eC1nbnUqKTogTmV3IGhvc3QuCi0JKHNwYXJjNjQtKi1saW51eC1nbnUqKTogTmV3IGhvc3QuCi0KLTE5OTktMDgtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZXhzdXAuYyAoaXNfbnVtKTogUmVpbmRlbnQuCi0JKHBhcnNlX2FyZ3MpOiBNZW50aW9uIHByb2dyYW0gbmFtZSBpbiBlcnJvciBtZXNzYWdlLgotCi0JKiBlbXVsdGVtcGwvb3N0cmluZy5zZWQ6IFJlbmFtZSBmcm9tIHN0cmluZ2lmeS5zZWQuCi0JKiBlbXVsdGVtcGwvYXN0cmluZy5zZWQ6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKHN0cmluZ2lmeS5zZWQpOiBOZXcgdGFyZ2V0LgotCShHRU5fREVQRU5EUyk6IENoYW5nZSAkKHNyY2RpcikvZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQgdG8KLQlzdHJpbmdpZnkuc2VkLgotCSogY29uZmlndXJlLmluOiBEZWZpbmUgYW5kIHN1YnN0aXR1dGUgU1RSSU5HSUZZLgotCSogZW11bHRlbXBsLyouZW06IFVzZSBzdHJpbmdpZnkuc2VkIGZyb20gYnVpbGQgZGlyZWN0b3J5IHJhdGhlcgotCXRoYW4gc291cmNlIGRpcmVjdG9yeS4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogVXNlIHN0cmluZ2lmeS5zZWQgcmF0aGVyIHRoYW4gaW5saW5lIHNlZAotCXNjcmlwdC4KLQkqIGVtdWx0ZW1wbC9nbGQ5NjAuZW0sIGVtdWx0ZW1wbC9nbGQ5NjBjLmVtOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtLCBlbXVsdGVtcGwvbGludXguZW06IExpa2V3aXNlLgotCSogZW11bHRlbXBsL2xuazk2MC5lbSwgZW11bHRlbXBsL3N1bm9zLmVtOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDgtMDUgIERvbm4gVGVycnkgIDxkb25uQGludGVyaXguY29tPgotCi0JKiBlbXVscGFyYW1zL2kzODZwZS5zaDogRGVmaW5lIEVOVFJZLCBTVUJTWVNURU0sIGFuZAotCUlOSVRJQUxfU1lNQk9MX0NIQVIuCi0JKiBlbXVscGFyYW1zL2kzODZwZV9wb3NpeC5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoWUFDQyk6IElmIGJpc29uIGlzIG5vdCBpbiB0aGUgc291cmNlIHRyZWUsIHVzZQotCUBZQUNDQCByYXRoZXIgdGhhbiBiaXNvbiAteS4KLQkoTEVYKTogSWYgZmxleCBpcyBub3QgaW4gdGhlIHNvdXJjZSB0cmVlLCB1c2UgQExFWEAgcmF0aGVyIHRoYW4KLQlmbGV4LgotCShBTExfRU1VTEFUSU9OUyk6IEFkZCBlaTM4NnBlX3Bvc2l4Lm8uCi0JKGVpMzg2cGVfcG9zaXguYyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1pbnRlcml4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNDU2XTg2LXBjLWludGVyaXgqKTogTmV3IGhvc3QuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wOC0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2ggKE1BWFBBR0VTSVpFKTogQ2hhbmdlIHRvIDB4MTAwMDAuCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjbGludXguc2ggKE1BWFBBR0VTSVpFKTogTGlrZXdpc2UuCi0KLTE5OTktMDgtMDMgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogUmVtb3ZlIGVnbzMyLm8uCi0JKGVnbzMyLmMpOiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wNy0yMiAgUGhpbGlwIEJsdW5kZWxsICA8cGJAbmV4dXMuY28udWs+Ci0KLQkqIGVtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2ggKERBVEFfU1RBUlRfU1lNQk9MUyk6IERlZmluZS4KLQkoT1RIRVJfQlNTX1NZTUJPTFMsIE9USEVSX0JTU19FTkRfU1lNQk9MUyk6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2ggKERBVEFfU1RBUlRfU1lNQk9MUyk6IERlZmluZS4KLQotCSogY29uZmlndXJlLnRndCAoYXJtKi0qLXVjbGludXgqLCB0aHVtYi0qLXVjbGludXgqLAotCXRodW1iLSotbGludXgtZ251Kik6IE5ldyB0YXJnZXRzLgotCi0xOTk5LTA3LTIxICBNYXJrIEVsYnJlY2h0ICA8c25vd2JhbGwzQGJpZ2Zvb3QuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYzogQWRkIGhhbmRsaW5nIG9mIGxpbmtvbmNlIHNlY3Rpb25zLgotCi0JKiBjb25maWd1cmUuYmF0OiBSZW1vdmU7IG9ic29sZXRlLgotCSogZW11bHBhcmFtcy9nbzMyLnNoOiBSZW1vdmU7IG9ic29sZXRlLgotCSogc2NyaXB0dGVtcGwvZ28zMmNvZmYuc2M6IFJlbW92ZTsgb2Jzb2xldGUuCi0KLTE5OTktMDctMjEgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyplbC0qLXZ4d29ya3MqKTogTmV3IHRhcmdldC4KLQotMTk5OS0wNy0yMSAgQnJhZCBNLiBHYXJjaWEgIDxiZ2FyY2lhQGZvcmUuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi12eHdvcmtzKik6IE5ldyB0YXJnZXQuCi0KLVR1ZSBKdWwgMjAgMTU6MTg6NDYgMTk5OSAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2djX3NlY3Rpb25zKTogT25seSBoYW5kbGUgdGhlIHN0YXJ0IHN5bWJvbAotCXNwZWNpYWxseSBpZiB0aGVyZSBpcyBvbmUuCi0KLU1vbiBKdWwgMTkgMTQ6MTk6MTQgMTk5OSAgTWFyayBQLiBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGYzMmJtaXBuMzIuc2ggKE9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMpOiBBZGQKLQkuTUlQUy5ldmVudHMgYW5kIC5NSVBTLmNvbnRlbnQgaGFuZGxpbmcuCi0JKiBlbXVscGFyYW1zL2VsZjY0Ym1pcC5zaCAoT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyk6IExpa2V3aXNlLgotCi0xOTk5LTA3LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAoZ2V0X3RhcmdldCk6IE5ldyBmdW5jdGlvbjogUmV0dXJuIHRydWUgaWZmIHRoZQotCWdpdmVuIHRhcmdldCBpcyB0aGUgdGFyZ2V0IGJlaW5nIHNvdWdodC4KLQkoc3RyaWNweSk6IE5ldyBmdW5jdGlvbjogIExpa2Ugc3RyY3B5IGJ1dCBjb252ZXJ0IHRvIGxvd2VyCi0JY2FzZSBhcyB3ZWxsLgotCShzdHJjdXQpOiBOZXcgZnVuY3Rpb246ICBMaWtlIHN0cnN0ciBidXQgcmVtb3ZlIHRoZSBsb2NhdGVkCi0Jc3Vic3RyaW5nIGFzIHdlbGwuCi0JKG5hbWVfY29tcGFyZSk6IE5ldyBmdW5jdGlvbjogQ29tcHV0ZSBhIGNvbXBhdGFiaWxpdHkgcmF0aW5nCi0JZm9yIHR3byB0YXJnZXQgbmFtZXMuCi0JKHdpbm5lcik6IE5ldyB2YXJpYWJsZTogQmVzdCB0YXJnZXQgZm91bmQgYnkKLQljbG9zZXN0X3RhcmdldF9tYXRjaCgpIHNvIGZhci4KLQkoY2xvc2VzdF90YXJnZXRfbWF0Y2gpOiBOZXcgZnVuY3Rpb246IEZpbmQgdGhlIHRhcmdldCB3aGljaCBpcwotCXRoZSBjbG9zZXN0IG1hdGNoIHRvIHRoZSBvcmlnaW5hbCB0YXJnZXQuCi0JKGdldF9maXJzdF9pbnB1dF90YXJnZXQpOiBOZXcgZnVuY3Rpb246IEZpbmQgdGhlIHRhcmdldCBmb3JtYXQKLQlvZiB0aGUgZmlyc3Qgb2YgdGhlIGxpbmtlcidzIGlucHV0IGZpbGUuCi0JKG9wZW5fb3V0cHV0KTogQmUgbW9yZSBjbGV2ZXIgYWJvdXQgZGVjaWRpbmcgdGhlIG91dHB1dCB0YXJnZXQKLQlmb3JtYXQuIAotCi0xOTk5LTA3LTE2ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2g6IEFkZCA2NC1iaXQgZGlyZWN0b3JpZXMgdG8gbmF0aXZlIExJQl9QQVRILgotCi1UaHUgSnVsIDE1IDE1OjU1OjE1IDE5OTkgIE1hcmsgUC4gTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgdXAgSE9TVElOR19DUlQwIGFuZCBIT1NUSU5HX0xJQlMgZm9yIElSSVg2LgotCi0xOTk5LTA3LTE1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlndXJlLmluOiBCdW1wIHZlcnNpb24gbnVtYmVyIHRvIDIuOS41LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA3LTE0ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogQ29weSBTRUNfU0hPUlQgdG8gb3V0cHV0IHNlY3Rpb24uCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUmUtb3JkZXIgLnJlbFthXS5mb28gb3V0cHV0cyB0byB0aGUKLQlzYW1lIG9yZGVyIHNlZW4gZm9yIHRoZSBtYWluIHNlY3Rpb25zLiAgQWRkCi0JT1RIRVJfUkVBRE9OTFlfUkVMT0NfU0VDVElPTlMgYW5kIE9USEVSX0dPVF9SRUxPQ19TRUNUSU9OUy4KLQotMTk5OS0wNy0xMiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAc3VzZS5kZT4KLQotCSogZW11bHRlbXBsL2xpbnV4LmVtIChsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBGaWxsIGluCi0Jc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucy4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBBZGQgbWlzc2luZwotCWNvbW1hIGluIGluaXRpYWxpemVyLgotCi0xOTk5LTA3LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFueSBmaWxlczogQ2hhbmdlcyB0byBhdm9pZCBnY2Mgd2FybmluZ3M6IEFkZCBBVFRSSUJVVEVfVU5VU0VECi0JYXMgYXBwcm9wcmlhdGUuICBGaWxsIGluIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMuCi0KLTE5OTktMDctMTAgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZGZpbGUuYzogUmV2ZXJ0IHBhdGNoIG9mIDE5OTktMDctMDguCi0JKGxkZmlsZV90cnlfb3Blbl9iZmQpOiBJZiB3ZSBhcmUgc2VhcmNoaW5nIGZvciB0aGUgZmlsZSwgc2tpcAotCWZpbGVzIHdpdGggYW4gaW5jb21wYXRpYmxlIGFyY2hpdGVjdHVyZS4KLQotMTk5OS0wNy0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYyAoT1VUUFVUX0ZPUk1BVCk6IEluY2x1ZGUgYmlnIGVuZGlhbiBhbmQKLQlsaXR0bGUgZW5kaWFuIGZvcm1hdHMuCi0KLTE5OTktMDctMDggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvbWNvcmVwZS5zYzogZml4IHF1b3RpbmcgcHJvYmxlbSwgZm9yIGJhc2ggMi54Ci0KLTE5OTktMDctMDggIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoKTogU2tpcCBsaWJyYXJpZXMgbWFkZSBmb3IKLQlpbmNvbXBhdGlibGUgYXJjaGl0ZWN0dXJlcyBpbiB0aGUgc2VhcmNoIHBhdGguIExldCB0aGUgdXNlciBrbm93Ci0JYWJvdXQgYW55IHN1Y2ggc2tpcHMuCi0KLVRodSBKdWwgIDggMTI6MzI6MjMgMTk5OSAgSm9obiBEYXZpZCBBbmdsaW4gPGRhdmVAaGlhdWx5MS5oaWEubnJjLmNhPgotCi0gICAgICAgICogY29uZmlndXJlLnRndCAoaHBwYSotbGludXgtZ251Kik6IE5ldyB0YXJnZXQuCi0KLTE5OTktMDctMDcgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTExfNjRfRU1VTEFUSU9OUyk6IEFkZCBlZWxmNjRibWlwLgotCShlZWxmNjRibWlwKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMtc2dpLWlyaXg2Kik6IEFkZCA2NC1iaXQgZW11bGF0aW9uLgotCSogZW11bHBhcmFtcy9lbGY2NGJtaXAuc2g6IE5ldyBmaWxlLgotCi0xOTk5LTA3LTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGFmdGVyX29wZW4pOiBBYm9ydCBpZiBpbnB1dCBmb3JtYXQgaXMgQVJNIGFuZAotCW91dHB1dCBmb3JtYXQgaXMgbm90LiAKLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtIChhZnRlcl9vcGVuKTogQWJvcnQgaWYgaW5wdXQgZm9ybWF0IGlzIEFSTQotCWFuZCBvdXRwdXQgZm9ybWF0IGlzIG5vdC4gCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtIChhZnRlcl9vcGVuKTogQWJvcnQgaWYgaW5wdXQgZm9ybWF0IGlzIEFSTQotCWFuZCBvdXRwdXQgZm9ybWF0IGlzIG5vdC4gCi0KLTE5OTktMDctMDIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZGxhbmcuYzogUmV2ZXJ0IGNoYW5nZSBvZiAxOTk5LTA2LTIzLgotCi0xOTk5LTA2LTMwICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMyYm1pcG4zMi5vLgotCShlZWxmMzJibWlwbjMyLmMpOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCSogY29uZmlndXJlLnRndCAobWlwcy1zZ2ktaXJpeDYqKTogTWFrZSBuMzIgdGhlIGRlZmF1bHQKLQllbXVsYXRpb24uCi0JKiBlbXVscGFyYW1zL2VsZjMyYm1pcG4zMi5zaDogTmV3IGZpbGUuCi0JCi0xOTk5LTA2LTI4ICBKaW0gUGljayA8amltQGppbXBpY2suY29tPgotCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtOiBBZGRlZCBjb2RlIHNvIHRoYXQgLnhzIGxpbmtlciBzY3JpcHRzIGFyZQotCWNhbGxlZCBzbyB0aGF0IEFSTSBzaGFyZWQgbGlicmFyaWVzIGFyZSBidWlsdCBjb3JyZWN0bHkuCi0KLTE5OTktMDYtMjIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBsaW5rX2luZm8uaW5pdF9mdW5jdGlvbiBhbmQKLQlsaW5rX2luZm8uZmluaV9mdW5jdGlvbi4KLQkqIGxleHN1cC5jIChPUFRJT05fSU5JVCk6IE5ldyBtYWNyby4KLQkoT1BUSU9OX0ZJTkkpOiBMaWtld2lzZS4KLQkobGRfb3B0aW9ucyk6IEFkZCBkZXNjcmlwdGlvbnMgZm9yIHRoZW0uCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgdGhlbS4KLQotMTk5OS0wNi0yMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogT25seSBkaXNjYXJkIGxpbmsgb25jZQotCXNlY3Rpb25zIGlmIHdlIGFyZSBidWlsZGluZyBjb25zdHJ1Y3RvcnMuCi0KLTE5OTktMDYtMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKExvY2F0aW9uIENvdW50ZXIpOiBEZXNjcmliZSBiZWhhdmlvdXIgb2YKLQlsb2NhdGlvbiBjb3VudGVyIGluc2lkZSBzZWN0aW9uIHN0YXRlbWVudHMuCi0KLTE5OTktMDYtMjAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYyAoV1JJVEFCTEVfUk9EQVRBKTogTmV3IHZhcmlhYmxlIGZvcgotCWNvbnRyb2xsaW5nIHdoZXRoZXIgb3Igbm90IC5yb2RhdGEgaXMgaW4gdGhlIGRhdGEgc2VnbWVudCBvciB0aGUKLQl0ZXh0IHNlZ21lbnQuCi0KLTE5OTktMDYtMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogQWRkIG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoIC0tdGh1bWItZW50cnkuCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtOiBBZGQgbmV3IGNvbW1hbmQgbGluZSBzd2l0Y2ggLS10aHVtYi1lbnRyeS4KLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOiBBZGQgbmV3IGNvbW1hbmQgbGluZSBzd2l0Y2ggLS10aHVtYi1lbnRyeS4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IG5ldyBBUk0gY29tbWFuZCBsaW5lIHN3aXRjaDogLS10aHVtYi1lbnRyeS4JCi0xOTk5LTA2LTIwICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxsX2xpYnBhdGgpOiBBY2N1bXVsYXRlIGFjcm9zcyBhbGwgZW5hYmxlZCB0YXJnZXRzLgotCi1TdW4gSnVuIDIwIDE0OjEwOjMzIDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9hcm1lbGYuZW06IFdhdGNoIEVNVUxBVElPTl9MSUJQQVRIIGluc3RlYWQgb2YKLQlERUZBVUxUX0VNVUxBVElPTi4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IExpa2V3aXNlLgotCi1GcmkgSnVuIDE4IDE1OjI0OjQ4IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChHRU5TQ1JJUFRTKTogUGFzcyBFTVVMQVRJT05fTElCUEFUSCwgbm90IEVNVUwuCi0JKiBjb25maWd1cmUuaW4gKGFsbF9lbXVscyk6IEFkZCB0YXJnX2V4dHJhX2xpYnBhdGguCi0JKGFsbF9saWJwYXRoLCBFTVVMQVRJT05fTElCUEFUSCk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZS50Z3QgKHBvd2VycGMtKi1saW51eC1nbnUqKTogRGVmaW5lIHRhcmdfZXh0cmFfbGlicGF0aC4KLQkqIGdlbnNjcmlwdHMuc2ggKExJQl9QQVRIKTogRGVmaW5lIGlmIGVtdWxhdGlvbiBpbiBFTVVMQVRJT05fTElCUEFUSC4KLQotTW9uIEp1biAxNCAxMDozODozNiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkLnRleGluZm86IEZpeCB1c2Ugb2YgQGl0ZW0gdnMuIEBpdGVteC4KLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIFRob21hcyBaZW5rZXIgPHRoekBsZW5uYXJ0ei1lbGVjdHJvbmljLmRlPjoKLQkqIGxkZ3JhbS55IChhdHRyaWJ1dGVzX29wdCk6IFVzZSBhdHRyaWJ1dGVzX2xpc3QgaW5zdGVhZCBvZiBOQU1FLgotCShhdHRyaWJ1dGVzX2xpc3QsIGF0dHJpYnV0ZXNfc3RyaW5nKTogTmV3IG5vbnRlcm1pbmFscy4KLQkqIGxkbGFuZy5jIChsYW5nX3NldF9mbGFncyk6IEFkZCBpbnZlcnQgcGFyYW1ldGVyLiAgRG9uJ3QgaGFuZGxlCi0JJyEnLgotCSogbGRsYW5nLmMgKGxhbmdfc2V0X2ZsYWdzKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UpOiBEb24ndCBhZGQKLQllbnRyeV9zeW1ib2wgYXMgYW4gdW5kZWZpbmVkIHN5bWJvbCB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlCi0JbGluay4gIEZyb20gPGplZmZkYkBnb29kbmV0LmNvbT4uCi0KLTE5OTktMDYtMTIgIERhdmlkIE8nQnJpZW4gIDxvYnJpZW5AZnJlZWJzZC5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IChpWzM0NTZdODYtKi1mcmVlYnNkKik6IE5vdyBkZWZhdWx0cyB0byBFTEYuCi0KLTE5OTktMDYtMDkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChoZWxwKTogUmVzdG9yZSBwcmV2aW91cyBmb3JtYXQgb2Ygb3V0cHV0LgotCi0xOTk5LTA2LTA0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IElmIGNvbXBpbGluZyBmb3IgYXJtX2Vwb2NfcGUgcmVuYW1lCi0JaW50ZXJ3b3JraW5nIGZ1bmN0aW9ucyB0byBhdm9pZCBhIG5hbWUgc3BhY2UgY2xhc2guCi0KLTE5OTktMDYtMDIgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogQWRkIGluaXRwIHN1cHBvcnQuCi0KLTE5OTktMDYtMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogUmVuYW1lIGdsb2JhbCBhcm0gaW50ZXJ3b3JraW5nIGZ1bmN0aW9ucyB0bwotCWF2b2lkIG5hbWUgY29sbGlzaW9uIHdoZW4gYWxsIHRhcmdldHMgQkZEIGlzIGJ1aWx0LgotCi0xOTk5LTA1LTMwICBDb3J0IERvdWdhbiAgPGNvcnRAYXR0aXMuY3Mubm10LmVkdT4KLQotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVlbGYzMnBwY2xpbnV4Lm8uCi0JKiBjb25maWd1cmUudGd0IChwb3dlcnBjLSotbGludXgtZ251KTogVXNlIGl0LgotCSogZW11bHBhcmFtcy9lbGYzMnBwY2xpbnV4LnNoOiBOZXcgZmlsZS4KLQotMTk5OS0wNS0yOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBDbGFyaWZ5IHRoYXQgb3B0aW9ucyB3aGljaCByZWZlciB0byBmaWxlcwotCW11c3QgYmUgcHJvcGVybHkgb3JkZXJlZC4KLQotMTk5OS0wNS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FybWVsZi5lbSAoLi4uX3BhcnNlX2FyZ3MpOiBOZXcgZnVuY3Rpb246IFBhcnNlCi0JY29tbWFuZCBsaW5lIG9wdGlvbi4gIEFjY2VwdCBhcm0tZWxmIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb24KLQknLXAnIG9yICctLW5vLXBpcGVsaW5lLWtub3dsZWRnZScuCi0JKC4uLl9saXN0X29wdGlvbnMpOiBOZXcgZnVuY3Rpb246IERlc2NyaWJlIHRoZSBuZXcgY29tbWFuZCBsaW5lCi0Jb3B0aW9uLgotCSguLi5fYmVmb3JlX2FsbG9jYXRpb24pOiBQYXNzIHRoZSB2YWx1ZSBvZiB0aGUgbmV3IHZhcmlhYmxlCi0Jbm9fcGlwZWxpbmVfa25vd2xlZGdlIHRvIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbi4KLQkKLQkqIGVtdWx0ZW1wL2FybWVsZl9vYWJpLmVtICguLi5fYmVmb3JlX2FsbG9jYXRpb24pOiBQYXNzIHplcm8gYXMKLQl0aGUgdGhpcmQgcGFyYW1ldGVyIHRvIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbi4KLQotMTk5OS0wNS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKGhlbHApOiBNaW5vciBmb3JtYXR0aW5nIGNoYW5nZXMuCi0KLTE5OTktMDUtMjggIE1hcnRpbiBEb3JleSAgPG1kb3JleUBtYWRnZS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGk5NjAtKi1lbGYqKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJfaTk2MC5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMyX2k5NjAuby4KLQkoZWVsZjMyX2k5NjAuYyk6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wNS0yNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaCAoVEVNUExBVEVfTkFNRSk6IFNldCB0byBhcm1lbGZfb2FiaS4gCi0KLTE5OTktMDUtMjQgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGVtdWx0ZW1wbC9hcm1lbGYuZW0gKGJlZm9yZV9wYXJzZSk6IFNldCBjb25maWcuZHluYW1pY19saW5rIGFuZAotIAljb25maWcuaGFzX3NoYXJlZC4KLQkqIGVtdWxwYXJhbXMvYXJtZWxmLnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUuCi0JKiBlbXVscGFyYW1zL2FybWVsZl9saW51eC5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogTGlrZXdpc2UuCi0KLTE5OTktMDQtMTMgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGVtdWx0ZW1wbC9hcm1lbGYuZW06IEFkZCBkZWZpbml0aW9ucyByZWxhdGVkIHRvIHNoYXJlZCBvYmplY3RzCi0JKGNvcGllZCBmcm9tIGVsZjMyLmVtKS4KLQotV2VkIE1heSAxOSAxMjo0NDoyNiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IFJlbW92ZSBlYXJtbGludXgubyBhbmQKLQllYXJtMjZsaW51eC5vLCBhZGQgZWFybWVsZl9saW51eC5vIGFuZCBlYXJtZWxmX2xpbnV4MjYuby4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQotMTk5OS0wNS0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUuCi0JKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUuCi0KLVRodSBNYXkgMTMgMDk6NDg6MDkgMTk5OSAgSm9lbCBTaGVycmlsbCAoam9lbEBPQVJjb3JwLmNvbSkKLQotCSogY29uZmlndXJlLnRndCAoaTM4Ni0qLXJ0ZW1zZWxmKiwgc2gtKi1ydGVtc2VsZiopOiBOZXcgdGFyZ2V0cy4KLQkobWlwcyplbC0qLXJ0ZW1zKiwgcG93ZXJwY2xlLSotcnRlbXMqKTogTmV3IHRhcmdldHMuCi0KLTE5OTktMDUtMTAgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogU3BlY2lmeSB0aGUgb3V0cHV0IGFyY2gsIHdoaWNoIElhbiBzYXlzIGlzCi0JdGhlIFJpZ2h0IFRoaW5nIHRvIGRvLgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IHZhcmlvdXMgY2hhbmdlcyB0byBwYXJhbWV0ZXJpemUgdGhlCi0JdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uLgotCShnbGRfaTM4NnBlX2FmdGVyX29wZW4pOiBEZXRlY3QgYW5kIGZpeCBNUyBpbXBvcnQgbGlicmFyaWVzCi0JYnkgcmVuYW1pbmcgdGhlIG1lbWJlciBvYmplY3RzICh3aGljaCBhcmUgYWxsIG5hbWVkIHRoZSBzYW1lKS4KLQotCSogcGUtZGxsLmM6IHZhcmlvdXMgY2hhbmdlcyB0byBwYXJhbWV0ZXJpemUgdGhlIHRhcmdldC1zcGVjaWZpYwotCWluZm9ybWF0aW9uLgotCShnZW5lcmF0ZV9yZWxvYyk6IHN1cHBvcnQgcmVsb2NzIG1vcmUgZ2VuZXJpY2FsbHkgdG8gYWxsb3cgZm9yCi0JZXhwYW5zaW9uLgotCShwZV9leGVfYnVpbGRfc2VjdGlvbnMpOiBuZXc7IHVzZWQgdG8gYWRkIC5yZWxvY3MgdG8gLmV4ZXMKLQkocGVfZXhlX2ZpbGxfc2VjdGlvbnMpOiBkaXR0bwotCi0xOTk5LTA1LTEwICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6Ci0JQ2hlY2sgZm9yIFRBUkdFVF9JU19hcm1fZXBvY19wZS4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogTGlrZXdpc2UuCi0KLTE5OTktMDUtMTIgIEFudGhvbnkgR3JlZW4gIDxncmVlbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAod2Fsa193aWxkLCB3YWxrX3dpbGRfZmlsZSwgd2Fsa193aWxkX3NlY3Rpb24sCi0Jb3V0cHV0X3NlY3Rpb25fY2FsbGJhY2ssIGdjX3NlY3Rpb25fY2FsbGJhY2spOiBOZXcgZnVuY3Rpb25zIGZvcgotCWdlbmVyaWMgc2VjdGlvbiB3YWxrcy4KLQkod2lsZCwgbGFuZ19nY193aWxkKTogVXNlIHdhbGtfd2lsZC4KLQkod2lsZF9maWxlLCBsYW5nX2djX3dpbGRfZmlsZSk6IERlbGV0ZWQuIENvbW1vbiBsb2dpYyBtb3ZlZCB0bwotCXdhbGtfd2lsZF9maWxlLgotCSh3aWxkX3NlY3Rpb24sIGxhbmdfZ2Nfd2lsZF9zZWN0aW9uKTogRGVsZXRlZC4gQ29tbW9uIGxvZ2ljIG1vdmVkCi0JdG8gd2Fsa19maWxkX3NlY3Rpb24uICBVbmlxdWUgbG9naWMgbW92ZWQgaW50byBjYWxsYmFja3MKLQlvdXRwdXRfc2VjdGlvbl9jYWxsYmFjayBhbmQgZ2Nfc2VjdGlvbl9jYWxsYmFjay4KLQotMTk5OS0wNC0yNiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFVwZGF0ZWQgZm9yIG5ldyB2ZXJzaW9uIG9mIGxpYnRvb2wuCi0KLTE5OTktMDQtMTIgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBlbXVscGFyYW1zL2FybWVsZl9saW51eC5zaDogTmV3IGZpbGUuICBTdXBwb3J0IGZvciBBUk0gCi0JR05VL0xpbnV4IEVMRiBBQkkuCi0JKiBlbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoOiBOZXcgZmlsZS4gQVBDUy0yNiB2ZXJzaW9uIG9mIGFib3ZlLgotCSogY29uZmlndXJlLnRndDogRm9yIGFybSotKi1saW51eC1nbnUqLCBzZXQgZGVmYXVsdCBlbXVsYXRpb24gdG8KLQlgYXJtZWxmX2xpbnV4JywgYW5kIGFsc28gaW5jbHVkZSBgYXJtZWxmX2xpbnV4MjYnIGFuZCBgYXJtZWxmJy4KLQkqIE1ha2VmaWxlLmFtOiBBZGQgcnVsZXMgdG8gbWFrZSBlYXJtbGludXguYyBhbmQgZWFybWxpbnV4MjYuYy4KLQkoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFybWxpbnV4Lm8gYW5kIGVhcm1saW51eDI2Lm8uCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVsZl9pMzg2X2JlLm8uCi0JKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1iZW9zKik6IFVzZSBpdC4KLQkqIGVtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoZW52aXJvbik6IERldGVjdCBkZWNsYXJhdGlvbi4KLQkqIGxkbWFpbi5jIChtYWluKTogRG9uJ3QgZGVjbGFyZSBlbnZpcm9uLgotCSogc3lzZGVwLmggKGVudmlyb24pOiBEZWNsYXJlIGlmIG5lZWRlZC4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAobGRncmFtX3ZlcnNfY3VycmVudF9sYW5nKTogTmV3LgotCSh2ZXJzX2RlZm5zKTogQWNjZXB0IGBleHRlcm4gImxhbmciIHsgfScgc3ludGF4LgotCSogbGRsZXgubCAodmVyc19ub2RlX25lc3RpbmcpOiBOZXcuCi0JKFZfSURFTlRJRklFUik6IEFjY2VwdCAuIGFuZCAkIGluIHN5bWJvbHMuCi0JKFZFUlNfTk9ERSk6IEFjY2VwdCBgZXh0ZXJuICJsYW5nIiB7IH0nIHRva2Vucy4gIE5lc3QgVkVSU19OT0RFIHN0YXRlcy4KLQkqIGxkbGFuZy5jIChsYW5nX25ld192ZXJzX3JlZ2V4KTogTmV3IGBsYW5nJyBhcmd1bWVudC4gIFVwZGF0ZSBjYWxsZXJzLgotCShsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jcGx1c3BsdXMpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfdmVyc19tYXRjaF9sYW5nX2phdmEpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24pOiBGaXggaXRlcmF0aW9uLiAgRG9uJ3QgZnJlZQotCXNlY3Rpb24gY29udGVudHMsIGFzIGl0IGlzIHN0aWxsIGluIHVzZSBieSB0aGUgcGF0dGVybnMuCi0KLTE5OTktMDQtMTAgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdCBsaW5rX2luZm8ubm9fdW5kZWZpbmVkLgotCSogbGV4c3VwLmM6IEFkZCBjb21tYW5kLWxpbmUgb3B0aW9uIC0tbm8tdW5kZWZpbmVkLgotCi0xOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGQuaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCi0JKiBsZG1haW4uYyAobWFpbik6IERvbid0IHBhc3MgTENfTUVTU0FHRVMgdG8gc2V0bG9jYWxlIGlmIHRoZQotCXN5c3RlbSBkb2VzIG5vdCBkZWZpbmUgaXQuCi0KLTE5OTktMDQtMDYgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogbGRtYWluLmggKGRlbWFuZ2xpbmcpOiBEZWNsYXJlLgotCSogbGRtYWluLmMgKGRlbWFuZ2xpbmcpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShtYWluKTogSW5pdGlhbGl6ZSBkZW1hbmdsaW5nLgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IERvbid0IGRlbWFuZ2xlIHN5bWJvbCBpZiAhIGRlbWFuZ2xpbmcuCi0JKiBsZXhzdXAuYyAobGRfb3B0aW9ucywgcGFyc2VfYXJncyk6IEhhbmRsZSAtLWRlbWFuZ2xlIGFuZAotCS0tbm8tZGVtYW5nbGUuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLWRlbWFuZ2xlLy0tbm8tZGVtYW5nbGUuCi0KLQkqIGxkbGV4LmwgKFZfSURFTlRJRklFUik6IEFsbG93ICcuJyBpbiBzeW1ib2wuCi0KLTE5OTktMDQtMDUgIENocmlzIFRvcmVrICA8dG9yZWtAQlNESS5DT00+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpcik6IENoZWNrIHRoYXQKLQlhIHNoYXJlZCBsaWJyYXJ5IHJlYWxseSBleGlzdHMsIGF2b2lkaW5nIGJyb2tlbiBzeW1saW5rcy4KLQotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2ZpbGUpOiBHZW5lcmF0ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlIGlmCi0Jd2UgY2FuJ3QgZmluZCBhIC1sIGZpbGUuCi0KLTE5OTktMDQtMDUgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpMzg2LSotcGUpOiBhZGQgdGFyZ19leHRyYV9vZmlsZXMgZm9yIG90aGVyIFBFCi0JdGFyZ2V0cyAoaTM4Ni1wZSBhbmQgaTM4Ni13aW5udCkKLQotMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGRlZmZpbGVwLnk6IEluY2x1ZGUgInN5c2RlcC5oIiBhbmQgImxkbWlzYy5oIi4KLQkoZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byB2b2lkLiAgUmVtb3ZlCi0JdW51c2VkIGxvY2FscyBzaF9yZXNlcnZlLCBzaF9jb21taXQsIGFuZCBqLgotCShkZWZfdW5nZXRjKTogQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCShkZWZfbGV4KTogQ29ycmVjdCBwYXJlbnRoZXNpemF0aW9uIG9mIHx8IHdpdGhpbiAmJi4KLQkqIGRlZmZpbGUuaCAoZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIHBlLWRsbC5jOiBJbmNsdWRlIDx0aW1lLmg+LCA8Y3R5cGUuaD4sIGFuZCAibGRlbXVsLmgiLgotCShnZW5lcmF0ZV9lZGF0YSk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgaS4KLQkocXVvdGVwdXQpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCShwZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUpOiBGaXggdHlwZSBpbiBmb3JtYXQgc3RyaW5nLgotCShxdWlja19zeW1ib2wpOiBSZW1vdmUgdW51c2VkIGxvY2FsIGJsaGUuCi0JKHBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCShwZV9wcm9jZXNzX2ltcG9ydF9kZWZzKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgYXJfaGVhZCwgYXJfdGFpbCwKLQlhbmQgbi4KLQkocGVfYXMxNik6IENvbW1lbnQgb3V0LgotCi0xOTk5LTA0LTA0ICBEb24gQm93bWFuIDxkb25AcGl4c2NpLmNvbT4KLQotCSogY29uZmlndXJlLnRndDogQWRkIG1pcHMqLSotdnh3b3JrcyogdGFyZ2V0LgotCi0xOTk5LTAzLTMxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFybV9lcG9jX3BlLm8KLQlBZGQgYnVpbGQgcnVsZSBhbmQgZGVwZW5kZW5jaWVzIGZvciBlYXJtX2Vwb2NfcGUuYy4KLQotCSogZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaDogTmV3IGZpbGUuCi0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCAndGFyZ19leHRyYV9vZmlsZXMnIGZvciBBUk0gYmFzZWQgUEUKLQl0YXJnZXRzLiAKLQotMTk5OS0wMy0zMSAgUGhpbGlwIEJsdW5kZWxsICA8cGJAbmV4dXMuY28udWs+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IE1hdGNoIGBhcm0qLSotbGludXgtZ251Kicgbm90Ci0gCWBhcm12Ki0qLWxpbnV4LWdudScuCi0KLTE5OTktMDMtMjYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBQdXQgdGhlIC5laF9mcmFtZSBhbmQgLmdjY19leGNlcHRfdGFibGUKLQlzZWN0aW9ucyBpbiB0aGUgZGF0YSBzZWdtZW50LgotCi1GcmkgTWFyIDI2IDEyOjA1OjUxIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBsZC5oICh3aWxkY2FyZF9zcGVjKTogQWRkIGV4Y2x1ZGVfbmFtZS4KLSAgICAgICAgKiBsZGdyYW0ueSAoRVhDTFVERV9GSUxFKTogTmV3IHRva2VuLgotCSh3aWxkY2FyZF9zcGVjKTogU2V0IGV4Y2x1ZGVfbmFtZS4KLQkoZmlsZV9OQU1FX2xpc3QpOiBSZWNvZ25pemUgRVhDTFVERV9GSUxFLgotICAgICAgICAqIGxkbGFuZy5jICh3aWxkX3NlY3Rpb24pOiBDaGVjayBmb3IgZXhjbHVkZWQgZmlsZXMuCi0JKHByaW50X3dpbGRfc3RhdGVtZW50KTogUHJpbnQgZXhjbHVkZWQgZmlsZXMuCi0JKGxhbmdfYWRkX3dpbGQpOiBOZXcgYXJndW1lbnQgZXhjbHVkZV9maWxlbmFtZS4KLQlTZXQgZXhjbHVkZV9maWxlbmFtZS4KLQkqIGxkbGFuZy5oIChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUpOiAgQWRkIGV4Y2x1ZGVfZmlsZW5hbWUuCi0JKiBsZGxleC5sOiBOZXcgdG9rZW4gRVhDTFVERV9GSUxFLgotCSogbXJpLmMgKG1yaV9kcmF3X3RyZWUpOiAgQWRkIGFyZ3VtZW50IHRvIGxhbmdfYWRkX3dpbGQuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2MgKENUT1IsIERUT1IpOiAgRXhjbHVkZSBjcnRlbmQubyBmcm9tIGN0b3Igd2lsZGNhcmQuCi0JUmVvcmRlciBzb3J0ZWQgYW5kIHVuc29ydGVkIGN0b3JzLgotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYyAoQ1RPUiwgRFRPUik6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAoQ1RPUiwgRFRPUik6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjIChDVE9SLCBEVE9SKTogTGlrZXdpc2UuCi0JCi0xOTk5LTAzLTI2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19nY19zZWN0aW9ucyk6IElmIGVudHJ5X3N5bWJvbCBpcyBub3QgZGVmaW5lZCwKLQlkZWZhdWx0IHRvICJzdGFydCIuCi0KLTE5OTktMDMtMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIGV4cGxpY2l0IHBsYWNlbWVudHMgZm9yIHRoZSAuZWhfZnJhbWUKLQlhbmQgLmdjY19leGNlcHRfdGFibGUgc2VjdGlvbnMuIAotCi1XZWQgTWFyICAzIDA5OjEzOjM0IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY2xtPgotIAotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZi5zYzogUmVtb3ZlIC5lbmQuY3RvcnMgYW5kIC5lbmQuZHRvcnMKLSAgICAgICAgc2VjdGlvbnMuICBSZW9yZGVyIC5jdG9ycyBzZWN0aW9uIGVudHJpZXMuCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogTGlrZXdpc2UuCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogTGlrZXdpc2UuCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBMaWtld2lzZS4KLQotMTk5OS0wMi0yNiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogV3JvbmcgZXJyb3IgbXNnIGZvciAtciBhbmQgLS1tcGM4NjBjMC4KLQotMTk5OS0wMi0yNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMpOiBSZW1vdmUgZXh0cmFuZW91cwotCWJhY2tzbGFzaC4gCi0KLVRodSBGZWIgMjUgMTU6MDc6MjQgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRG9uJ3QgZ2F0aGVyIC5jdG9yIGFuZCAuZHRvciBzZWN0aW9ucwotICAgICAgICBmb3IgcmVsb2NhdGVhYmxlIGxpbmtzLgotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTGlrZXdpc2UuCi0gICAgICAgIAotMTk5OS0wMi0yMiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+Ci0KLQkqIGxkaW50LnRleGluZm86IHJlbW92ZSBleHRyYW5lb3VzIHJpZ2h0IGJyYWNlLgotCSogbGRtYWluLmMgKG1haW4pOiBpbml0aWFsaXplIGFuZCBjaGVjayBvcHRpb24gIm1wYzg2MGMwIi4KLQkqIGxleHN1cC5jIChsZF9vcHRpb25zLCBwYXJzZV9hcmdzKTogYWRkIG9wdGlvbiAibXBjODYwYzAiLgotCi1XZWQgRmViIDE3IDEyOjEwOjA2IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBtcHctZWxmbWlwcy5jIChnbGRlbGYzMmVibWlwX2JlZm9yZV9hbGxvY2F0aW9uKTogUmVtb3ZlIHNwZWNpYWwKLQkucmVnaW5mbyBzZWN0aW9uIGhhbmRsaW5nLiAKLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaCAoSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUyk6IFJlbW92ZWQKLQkqIGVtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaCAoSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUyk6IFJlbW92ZWQKLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVBhdGNoIGZyb206IFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQGNvcmVsY29tcHV0ZXIuY29tPgotCQotCSogY29uZmlndXJlLnRndDogQWRkZWQgYXJtdiotKi1saW51eC1nbnUgdG8gJHRhcmdfZW11bAotCXJlY29nbml0aW9uLiAKLQotV2VkIEZlYiAxNyBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0gCi0gICAgICAgICogZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtCi0gICAgICAgIChiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucywKLSAgICAgICAgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCi0gICAgICAgIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IERlZmluZSB0aGVtIHRvIHVzZSB0aGUKLSAgICAgICAgb2xkIEFCSSB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zLgotCi1UdWUgRmViIDE2IDE2OjQ4OjE5IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgQUNfUFJFUkVRIHRvIDIuMTMuICBDaGFuZ2UgQU1fUFJPR19JTlNUQUxMCi0JdG8gQUNfUFJPR19JTlNUQUxMLiAgQ2hhbmdlIEFNX0VYRUVYVCB0byBBQ19FWEVFWFQuCi0JKiBNYWtlZmlsZS5hbSAoZWFybWVsZl9vYWJpLmMpOiBDaGFuZ2VzIHNwYWNlcyB0byB0YWIuCi0JKiBhY2NvbmZpZy5oOiBSZW1vdmUuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBGZWIgMTUgMTg6MjE6NDggMTk5OSAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIGxkZXhwLmggKHN0cnVjdCBldHJlZV92YWx1ZV90eXBlKTogQ2hhbmdlIHZhbGlkIG9udG8gdmFsaWRfcC4KLQotCSogbGRleHAuYyAobmV3X2Ficyk6IERpdHRvLgotCShuZXdfcmVsLCBuZXdfcmVsX2Zyb21fc2VjdGlvbiwgZm9sZF9iaW5hcnksIGludmFsaWQsIGZvbGRfbmFtZSwKLSAJZXhwX2ZvbGRfdHJlZSwgZXhwX2Jpbm9wLCBleHBfdHJpbm9wLCBzdGF0X2FsbG9jLAotIAlleHBfZ2V0X2Fic19pbnQpOiBEaXR0bwotCi0JKiBsZGxhbmcuYyAocHJpbnRfYXNzaWdubWVudCwgbGFuZ19zaXplX3NlY3Rpb25zLAotCWxhbmdfZG9fYXNzaWdubWVudHMpOiBEaXR0by4KLQkKLTE5OTktMDItMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzKTogTmV3IGZ1bmN0aW9uOiBDaGVjawotCWFkZHJlc3NlcyBhc3NpZ25lZCB0byBzZWN0aW9uIGZvciBvdmVybGFwcy4KLQkobGFuZ19wcm9jZXNzKTogQ2FsbCBsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzIGlmIHN1aXRhYmxlLgotCi0JKiBsZC5oOiBBZGQgbmV3IGJvb2xlYW4gZmllbGQgdG8gYXJnc190eXBlIHN0cnVjdHVyZToKLQknY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMnLgotCi0JKiBsZG1haW4uYzogSW5pdGlhbGlzZSBjaGVja19zZWN0aW9uX2FkZHJlc3NlcyBmaWVsZCB0byB0cnVlLgotCi0JKiBsZXhzdXAuYzogQWRkIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyAnLS1uby1jaGVjay1zZWN0aW9ucycgYW5kCi0JJy0tY2hlY2stc2VjdGlvbnMnLgotCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgJy0tY2hlY2stc2VjdGlvbnMnCi0JYW5kICctLW5vLWNoZWNrLXNlY3Rpb25zJy4KLQotMTk5OS0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndDogQWRkIHN1cHBvcnQgZm9yIFN0cm9uZ0FSTSB0YXJnZXQuCi0KLVdlZCBGZWIgIDMgMTk6NDE6MDEgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBKdXN0IHNldCBTRUNfS0VFUCBvbmNlLiAgQ2hlY2sgZm9yCi0JYW4gb3duZXIgb2YgYSBzZWN0aW9uIGJlZm9yZSB1c2luZyBpdCB0byBsb29rIHVwIGEgcmVsb2MgdHlwZS4KLQlEb24ndCBzZXQgU0VDX0tFRVAgZm9yIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCi1Nb24gRmViICAxIDExOjM5OjQ2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogTWFrZWZpbGUuYW0gKGVhcm1lbGZfb2FiaS5vKTogIE5ldy4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCi0gICAgICAgICogY29uZmlndXJlLnRndCAoYXJtLSotb2FiaSk6ICBOZXcuCi0gICAgICAgICh0aHVtYi0qLW9hYmkpOiAgTmV3LgotICAgICAgICAqIGVtdWxwYXJhbXMvYXJtZWxmX29hYmkuc2g6ICBOZXcuCi0gICAgICAgICogZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtOiAgTmV3LgotCi0xOTk5LTAxLTMxIDE3OjU3OjMxIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IEFkZCBzdXBwb3J0IGZvciAtZmxlYWRpbmctdW5kZXJzY29yZXMKLQlzd2l0Y2ggaW4gYWxsIGxpbmtlciBnZW5lcmF0ZWQgc3ltYm9scy4KLQotCSogY29uZmlndXJlLnRndCAocG93ZXJwY3ssbGV9Ki0qLXZ4d29ya3MpOiBBZGQgYXMgYWxpYXNlcyBmb3IKLQlwb3dlcnBjeyxsZX0tKi1lYWJpLgotCi1XZWQgSmFuIDIwIDE3OjAxOjQ4IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotc29sYXJpczIqKTogTmV3IHRhcmdldC4gIEZyb20gUGF2ZWwKLQlSb3NraW4gPHBhdmVsX3Jvc2tpbkBnZW9jaXRpZXMuY29tPi4KLQotMTk5OS0wMS0xOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENvdW50IGxvYWRhYmxlIHNlY3Rpb25zIGFzCi0gICAgICAgICAgY29udHJpYnV0aW5nIHRvIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHNlZ21lbnQuCi0KLTE5OTktMDEtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBPbmx5IHVwZGF0ZSB0aGUgY3VycmVudAotICAgICAgICAgIGFkZHJlc3Mgb2YgYSByZWdpb24gaWYgdGhlIHNlY3Rpb24ganVzdCBwbGFjZWQgaW50byBpdCBpcyBhbgotICAgICAgICAgIGFsbG9jYXRlZCBzZWN0aW9uLgotCi0xOTk5LTAxLTEyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVwbGFjZSBlZnIzMC5vIHdpdGggZWVsZjMyZnIzMC5vLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLQkqIGNvbmZpZ3VyZS50Z3Q6IFJlcGxhY2UgZnIzMCB3aXRoIGVsZjMyZnIzMC4KLQotCSogZW11bHBhcmFtcy9lbGYzMmZyMzAuc2g6IE5ldyBmaWxlOiBSZXBsYWNlcyBmcjMwLnNoLCBhbmQgdXNlcwotCWdlbmVyaWMgZWxmLnNjIHNjcmlwdC4gIEFsc28gcmVwbGFjZXMgdGhlIC5zdGFjayBzZWN0aW9uIHdpdGggYQotCXVzZXIgZGVmaW5hYmxlIHN5bWJvbCBfX3N0YWNrLgotCi0xOTk5LTAxLTExICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9mcjMwLnNjOiBGaWxsIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB3aXRoIE5PUAotCXBhdHRlcm4uIAotCi0xOTk5LTAxLTAzICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZWNrLURFSkFHTlUpOiBObyBsb25nZXIgcHJvdmlkZSBIT1NUSU5HX0VNVSwKLQlIT1NUSU5HX0NSVDAsIEhPU1RJTkdfTElCUzsgdGhlIHRlc3Qgc3VpdGUgY2FuIGV4dHJhY3QgdGhlbSBmcm9tCi0JY29uZmlndXJlLmhvc3QgYW5kIGNvbmZpZ3VyZS50Z3Qgbm93LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTgtMTItMjcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncywgY2FzZSBPUFRJT05fUlBBVEgpOiBBdm9pZCBhZGRpbmcgZHVwbGljYXRlCi0JZWxlbWVudHMgdG8gcnBhdGguCi0KLVRodSBEZWMgMTAgMTE6MTI6MjggMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBSZW1vdmUgcGUtZGxsLm8gYW5kIGRlZmZpbGVwLm8uCi0JKEFMTF9FTVVMX0VYVFJBX09GSUxFUyk6IE5ldyB2YXJpYWJsZS4gIFB1dCB0aGVtIGhlcmUgaW5zdGVhZC4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEVNVUxfRVhUUkFfT0ZJTEVTIHRvICQoQUxMX0VNVUxfRVhUUkFfT0ZJTEVTKQotCWlmIGNvbmZpZ3VyaW5nIHdpdGggYWxsIHRhcmdldHMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwKTogTWFrZSBzdGF0aWMuCi0JKHBlX2RsbF9kb19kZWZhdWx0X2V4Y2x1ZGVzKTogUmVtb3ZlZCwgdW51c2VkLgotCShwZV9kZWZfZmlsZSwgcGVfZGxsX2V4cG9ydF9ldmVyeXRoaW5nLCBwZV9kbGxfa2lsbF9hdHMsCi0JcGVfZGxsX3N0ZGNhbGxfYWxpYXNlcyk6IERvbid0IGluaXRpYWxpemUgdGhlbSwgdGhpcyBmaWxlIG1heSBiZQotCWNvbXBpbGVkIG1vcmUgdGhhbiBvbmNlLgotCSogcGUtZGxsLmMgKHBlX2RlZl9maWxlLCBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmcsCi0JcGVfZGxsX2RvX2RlZmF1bHRfZXhjbHVkZXMsIHBlX2RsbF9raWxsX2F0cywKLQlwZV9kbGxfc3RkY2FsbF9hbGlhc2VzKTogRGVmaW5lIGFuZCBpbml0aWFsaXplIHRoZW0gaGVyZSBpbnN0ZWFkLgotCShnZW5lcmF0ZV9yZWxvYyk6IEZpeCBhbGxvY2F0aW9uIG9mIHJlbG9jX2FkZHJlc3NlcyBhcnJheSB0byB1c2UKLQliZmRfdm1hIGluc3RlYWQgb2YgdW5zaWduZWQgbG9uZy4gIEZpeCBlbGVtZW50IHNpemUgaW4gcXNvcnQgY2FsbC4KLQkocmVsb2Nfc29ydCk6IENvbXBhcmUgcG9pbnRlcnMgdG8gYmZkX3ZtYSBpbnN0ZWFkIG9mIHVuc2lnbmVkCi0JbG9uZy4KLQotTW9uIERlYyAgNyAyMToxMDowOSAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiAgPGouai52YW5kZXJoZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KLQotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotbWluZ3czMiopOiBBZGQgY3lnd2luIHRhcmdldCBzcGVjaWZpYwotCWZpbGVzLgotCi1TdW4gRGVjICA2IDE2OjMzOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAobTY4Ki0qLWdudSopOiBOZXcgdGFyZ2V0LiAgRnJvbSBBeW1lcmljIFZpbmNlbnQKLQk8YXltZXJpYy52aW5jZW50QGVtaS51LWJvcmRlYXV4LmZyPi4KLQotMTk5OC0xMi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9mcjMwLnNoIChURVhUX1NUQVJUX0FERFIpOiBDaGFuZ2UgVEVYVF9TVEFSVF9BRERSCi0JZnJvbSAweDEwMDAwMCB0byAweDEwMDAwIHNvIHRoYXQgaXQgZml0cyBpbiAyMCBiaXRzLgotCi1TYXQgTm92IDI4IDIyOjMyOjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmggKGxkZW11bF9yZWNvZ25pemVkX2ZpbGUpOiBEZWNsYXJlLgotCi1TYXQgTm92IDI4IDIyOjMwOjU1IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGRsYW5nLmMgKGxhbmdfYWRkX3dpbGQpOiBEb24ndCBwcmV0ZW5kIHRoYXQgdGhlcmUgaXMgYW4gaW5wdXQKLQlmaWxlIGlmIHRoZSBmaWxlbmFtZSBpcyBhIHdpbGRjYXJkIHBhdHRlcm4uCi0KLTE5OTgtMTEtMjUgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBsZGVtdWwuaCAobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogbmV3IGhvb2sgInJlY29nbml6ZWRfZmlsZSIKLQkqIGxkZW11bC5jIChsZGVtdWxfcmVjb2duaXplZF9maWxlKTogbmV3IGZ1bmN0aW9uLCBuZXcgaG9vawotCSogbGRpbnQudGV4aW5mbzogZG9jdW1lbnQgbmV3IGhvb2suCi0JKiBsZGxhbmcuYyAobG9hZF9zeW1ib2xzKTogY2FsbCByZWNvZ25pemVkX2hvb2sgZm9yIGFsbCBvYmplY3RzIHdlCi0JZG8gcmVjb2duaXplLCBpbiBjYXNlIHRoZSBlbXVsYXRpb24gbmVlZHMgdG8gaGFuZGxlIHRoZW0KLQlzcGVjaWFsbHkuICBQRSBETExzIHVzZSB0aGlzLgotCSogcGUtZGxsLmMgKHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSk6IHRha2Ugb3V0IGhhY2sgYW5kIGRlYnVnCi0JcHJpbnRmcwotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfaTM4Nl9yZWNvZ25pemVkX2ZpbGUpOiBuZXcgZnVuY3Rpb24KLQkoZ2xkX2k0ODZfdW5yZWNvZ25pemVkX2ZpbGUpOiB0YWtlIG91dCBoYWNrCi0KLTE5OTgtMTEtMjMgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZS1kbGwuYyAoZmlsbF9lZGF0YSk6IGZpbGwgaW4gdGltZXN0YW1wCi0JKG1ha2VfaGVhZCk6IG5hbWUgb2JqZWN0IGZpbGVzIHNlcXVlbnRpYWxseSB0byBlbnN1cmUKLQl0aGV5IGxpbmsgaW4gdGhlIHJpZ2h0IG9yZGVyLgotCShtYWtlX3RhaWwpOiBzYW1lIGhlcmUKLQkocGVfcHJvY2Vzc19pbXBvcnRfZGVmcyk6IHVzZSBzZXF1ZW50aWFsIG5hbWVzIGZvciBiZmRzIHRvIGVuc3VyZQotCXByb3BlciBsaW5rIG9yZGVyLgotCShwZV9pbXBsaWVkX2ltcG9ydF9kbGwpOiBuZXcgZnVuY3Rpb247IGhhbmRsZXMgbGlua2luZyBkaXJlY3RseQotCWFnYWluc3QgRExMcyBieSBzaW11bGF0aW5nIElNUE9SVFMgZGlyZWN0aXZlcy4gICogZW11bHRlbXBsL3BlLmVtCi0JKGdsZF9pMzg2cGVfYmVmb3JlX3BhcnNlKTogaGFjayBiZmQgdG8gbm90IHJlY29nbml6ZSAuZGxsIGZpbGVzCi0JdmlhIGJmZF9wZV9kbGxfbm90X3JlY29nbml6ZWRfaGFjawotCi0xOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfaTM4NnBlX3BhcnNlX2FyZ3MpOiBDb25kaXRpb25hbGl6ZSBjYWxsIHRvCi0JcGVfZGxsX2FkZF9leGNsdWRlcwotCi1Nb24gTm92IDIzIDE0OjM2OjE4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoYWZ0ZXJfcGFyc2UpOiBPbmx5IGNyZWF0ZSBhbiB1bmRlZmluZWQgZW50cnkKLQlzeW1ib2wgaWYgb25lIGhhcyBiZWVuIHNwZWNpZmllZC4KLQotMTk5OC0xMS0yMyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZwZV9hZnRlcl9vcGVuKTogY2FsbAotCXBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMKLQkqIHBlLWRsbC5jIChwZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUpOiBjYWxjdWxhdGUgQkFTRSBmcm9tCi0JcGVfZGF0YSwgb25seSBwcmludCBpZiBhY3R1YWxseSBzZXQuICBQcmludCB2ZXJzaW9uIG9ubHkgaWYKLQlzZXQuCi0JKHNhdmVfcmVsb2NzKTogc2F2ZSByZWxvY3MgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dC4KLQkobWFrZV9vbmUpOiBzdXBwb3J0IGludGVybmFsL2V4dGVybmFsIGRpZmZlcmVudCBuYW1lcy4KLQkocGVfZGxsX2dlbmVyYXRlX2ltcGxpYik6IHN1cHBvcnQgbmV3IG1ha2Vfb25lCi0JKHBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMpOiBuZXcgZnVuY3Rpb247IGhhbmRsZXMgSU1QT1JUCi0JZGlyZWN0aXZlcyBpbiAuZGVmIGZpbGVzLgotCi1GcmkgTm92IDIwIDEzOjA2OjQ5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBDb3BlIHdpdGggZW1wdHkgc3ltYm9sIG5hbWVzLgotCi1UaHUgTm92IDE5IDEzOjMxOjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBBZGQgcHJvdmlzaW9uIG9mICdfZW5kJyBzeW1ib2wuCi0KLVdlZCBOb3YgMTggMTg6MTg6NDMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndDogY2hhbmdlIHJlZnMgZnJvbSBjeWd3aW4zMiogdG8gY3lnd2luKi4KLQkqIGFjbG9jYWwubTQ6IHJlZ2VuZXJhdGUKLQkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgbmVlZCB0byBjYWxsIEFNX0NZR1dJTjMyLgotCSogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLU1vbiBOb3YgMTYgMjI6MTQ6MDcgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZfZmluaXNoKTogZ2VuZXJhdGUgaW1wb3J0IGxpYnJhcnkKLQkqIGRlZmZpbGUuaDogYWRkIGhpbnQgbWVtYmVyLgotCSogcGUtZGxsLmMgKHBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIpOiBOZXcgZnVuY3Rpb24gd2l0aCBoZWxwZXJzOwotIAlnZW5lcmF0ZXMgdGhlIGltcG9ydCBsaWJyYXJ5IGRpcmVjdGx5IGZyb20gdGhlIGV4cG9ydCB0YWJsZS4KLQkoZmlsbF9lZGF0YSk6IHJlbWVtYmVyIHRoZSBhY3R1YWwgaGludCBmb3IgdGhlIGltcG9ydCBsaWJyYXJ5LgotCi1TYXQgTm92IDE0IDE0OjM2OjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuMTogU29tZSBjbGVhbnVwcyBmcm9tIE5PS1VCSSBIaXJvdGFrYSA8aG5va3ViaUB5eXkub3IuanA+LgotCi1UaHUgTm92IDEyIDE5OjIxOjU3IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vbGQucG90OiBSZWdlbmVyYXRlZC4KLQkqIHBvL1BPVEZJTEVTLmluOiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBhY2xvY2FsLm00OiBSZWdlbmVyYXRlZC4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQotV2VkIE5vdiAxMSAxODoxMDoxNSAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogcGUtZGxsLmMgKGdlbmVyYXRlX3JlbG9jKTogZG9uJ3Qgb3V0cHV0IFBFIHJlbG9jcyBmb3Igc2VjdGlvbnMKLSAJdGhhdCB3b24ndCBiZSBsb2FkZWQuCi0KLVdlZCBOb3YgMTEgMTM6NDQ6NTQgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHBlLWRsbC5jIChmaWxsX2VkYXRhKTogZG9uJ3Qgc3RyaXAgdW5kZXJzY29yZXMKLQotVHVlIE5vdiAxMCAyMToyODoxOSAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbzogYWRkZWQgaTM4NnBlIG9wdGlvbiBzdW1tYXJ5Ci0KLVR1ZSBOb3YgMTAgMTc6NTM6MTcgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHBlLWRsbC5jIChwcm9jZXNzX2RlZl9maWxlKTogcHJvcGVybHkgbm90ZSB1bmRlZmluZWQgZXhwb3J0ZWQKLSAJc3ltYm9scywgY2xlYW4gdXAgb2xkIGNvZGUuCi0JKHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSk6IGRvbid0IGNyYXNoIGlmIHBlX2RlZl9maWxlIGlzIE5VTEwKLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZfcGFyc2VfYXJncyk6IGFkZAotIAkoZW4vZGlzKWFibGUtc3RkY2FsbC1maXh1cHMKLQkocGVfZml4dXBfc3RkY2FsbHMpOiB3YXJuIGFib3V0IHN0ZGNhbGwgZml4dXBzCi0JKGdsZF9pMzg2X3VucmVjb2duaXplZF9maWxlKTogbWFrZSBleHBvcnRlZCBzeW1ib2xzIHVuZGVmcyBzbyB0aGF0Ci0gCWFyY2hpdmUgbWVtYmVycyBnZXQgcHVsbGVkIGluCi0KLVR1ZSBOb3YgMTAgMTQ6NTA6NTEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBBZGQgS0VFUCBhdHRyaWJ1dGUgdG8gLmluaXQsCi0gICAgICAgIC5maW5pLCAuZHRvcnMgYW5kIC5jdG9ycy4gIEFkZCAuZGF0YSBhbmQgLnRleHQKLSAgICAgICAgd2lsZGNhcmRzIHRvIHN1cHBvcnQgc2VjdGlvbiBnYXJiYWdlIGNvbGxlY3Rpb24uCi0KLU1vbiBOb3YgIDkgMjI6NTI6NTAgMTk5OCAgREogRGVsb3JpZSAgPGRqQGluZHkuZGVsb3JpZS5jb20+Ci0KLQkqIGRlZmZpbGVwLnk6IHByb3Blcmx5IGhhbmRsZSByZWxvY3Mgd2l0aCBtdWx0aXBsZSBkZWZfZmlsZXMsCi0JY2FjaGUgaW1wb3J0IG1vZHVsZSBuYW1lcwotCi1Nb24gTm92ICA5IDIyOjQ0OjU4IDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZS1kbGwuYyAocHJvY2Vzc19kZWZfZmlsZSk6IGRvbid0IGFzc3VtZSBleHBvcnRzIHdvbid0IG1vdmUKLQlkdXJpbmcgYSByZWFsbG9jCi0KLU1vbiBOb3YgIDkgMTY6NDE6MzAgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHBlLWRsbC5jOiBOZXcgZmlsZTsgZGlyZWN0IHN1cHBvcnQgZm9yIFBFIERMTHMKLQkqIGRlZmZpbGUuaDogTmV3IGZpbGU7IGRpcmVjdCBzdXBwb3J0IGZvciBQRSBETExzCi0JKiBkZWZmaWxlcC55OiBOZXcgZmlsZTsgZGlyZWN0IHN1cHBvcnQgZm9yIFBFIERMTHMKLQkqIGVtdWx0ZW1wbC9wZS5lbTogYWRkIGRpcmVjdCBzdXBwb3J0IGZvciBQRSBETExzCi0JKiBjb25maWd1cmUudGd0OiBhbGxvdyB0YXJnZXQtc3BlY2lmaWMgZXh0cmEgZmlsZXMKLQkqIGNvbmZpZ3VyZS5pbjogYWxsb3cgdGFyZ2V0LXNwZWNpZmljIGV4dHJhIGZpbGVzCi0JKiBsZGxhbmcuYyAobGFuZ19hZGRfYXNzaWdubWVudCk6IHJldHVybiB0aGUgYXNzaWdubWVudCBzbyB0aGF0Ci0gCW9uZSBjYW4gY2hhbmdlIHRoZSB2YWx1ZSBsYXRlciBiYXNlZCBvbiB0aGUgb2JqZWN0IGZpbGVzIChwZS1kbGwKLSAJREVGIGZpbGVzIGRvIHRoaXMpCi0JKiBsZGludC50ZXhpbmZvOiBhZGQgc2VjdGlvbiBmb3IgZW11bGF0aW9uIHdhbGt0aHJvdWdoCi0JKiBNYWtlZmlsZS5hbTogYWRkIG5ldyBmaWxlcyBhbmQgdGFyZ2V0LXNwZWNpZmljIGV4dHJhIGZpbGVzCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF9pMzg2X2xpc3Rfb3B0aW9ucyk6IGxpc3QgZGxsLXNwZWNpZmljCi0Jb3B0aW9ucy4KLQkqIHBlLWRsbC5jIChwcm9jZXNzX2RlZl9maWxlKTogYXV0by1leHBvcnQgZXZlcnl0aGluZyBpZgotCW5vdGhpbmcgaXMgb3RoZXJ3aXNlIGV4cG9ydGVkLgotCQotV2VkIE5vdiAgNCAxNjozOToxOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIHN1cHBvcnQgZm9yIEZSMzAgdGFyZ2V0LgotCSogY29uZmlndXJlLnRndDogQWRkIHN1cHBvcnQgZm9yIEZSMzAgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBlbXVscGFyYW1zL2ZyMzAuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcC9mcjMwLnNjOiBOZXcgZmlsZS4KLQkKLU1vbiBOb3YgIDIgMTQ6NDc6MTUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBsZG1haW4uYyAobWFpbik6ICBEb24ndCByZXBvcnQgZXJyb3IgZm9yIGR5bmFtaWMgbGlua3MgYW5kCi0gICAgICAgIC0tZ2Mtc2VjdGlvbnMuCi0KLTE5OTgtMTAtMjYgMTY6MDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAobGRfb3B0aW9ucyk6IENoYW5nZSB0ZXh0IG9mIC1PIHRvIE9wdGltaXplIG91dHB1dCBmaWxlIi4KLQkocGFyc2VfYXJncyk6IFNldCBsaW5rX2luZm8ub3B0aW1pemUgYmFzZWQgb24gLU8gYXJndW1lbnQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbGlua19pbmZvLm9wdGltemUgdG8gZmFsc2UuCi0JKiBsZC50ZXhpbmZvOiBEZXNjcmliZSAtTyBvcHRpb24uCi0JKiBsZC4xOiBMaWtld2lzZS4KLQotTW9uIE9jdCAxMiAxNDoyOTo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBNb3ZlIC5zYnNzIGFuZCAuc2NvbW1vbiBzZWN0aW9ucyBpbnRvIHRoZWlyCi0Jb3duIHNlZ21lbnQsIHNvIHRoYXQgdGhleSBjYW4gYmUgbmV4dCB0byB0aGUgLmJzcyBzZWN0aW9uIGFuZCBzbwotCWluaXRpYWxpc2VkIGJ5IHRoZSBzYW1lIHBpZWNlIG9mIGNvZGUuCi0KLUZyaSBPY3QgIDkgMTU6NTk6NTIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGYuc2M6ICBNZXJnZSAuc2RhdGEuKiBldGMgc2VjdGlvbnMuCi0gICAgICAgICogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogIFNldCBTRUNfS0VFUCBmb3IKLSAgICAgICAgY3RvciBzZWN0aW9ucy4KLQotTW9uIE9jdCAgNSAwOTo0MDo0MyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGxkbWFpbi5jIChtYWluKTogIEVycm9yIGlmIC0tZ2Mtc2VjdGlvbnMgYW5kCi0gICAgICAgIGR5YW5taWMgbGlua2luZy4KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiAgQWRkIEtFRVAgYXR0cmlidXRlIHRvIC5pbml0LAotICAgICAgICAuZmluaSwgLmR0b3JzIGFuZCAuY3RvcnMuICBBZGQgLmRhdGEgYW5kIC50ZXh0Ci0gICAgICAgIHdpbGRjYXJkcyB0byBzdXBwb3J0IHNlY3Rpb24gZ2FyYmFnZSBjb2xsZWN0aW9uLgotCi1XZWQgU2VwIDMwIDExOjE5OjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IFJlbmFtZSAuY2FsbF90YWJsZSBzZWN0aW9uIHRvCi0JLmNhbGxfdGFibGVfZGF0YSBhbmQgY3JlYXRlIGEgbmV3IHNlY3Rpb24gY2FsbGVkCi0JLmNhbGxfdGFibGVfdGV4dC4KLQotU3VuIFNlcCAyMCAwMDo0MzoyNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIGFsaWdubWVudCBhdCB0aGUgZW5kIG9mIHRoZSAuYnNzCi0Jc2VjdGlvbiwgc28gdGhhdCBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgbWVtc2l6ZSBvZiB0aGUgc2VnbWVudC4KLQotRnJpIFNlcCAxOCAxMzo0Mjo0MiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkX3BsYWNlX29ycGhhbik6IERvbid0IHByb2Nlc3MgZm9yCi0gICAgICAgIHNlY3Rpb25zIHdpdGggU0VDX0VYQ0xVREUgZmxhZy4KLQotRnJpIFNlcCAgNCAwOToyNDowMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QzMHZlbGYuc2ggKFRFWFRfU0laRSk6IEluY3JlYXNlZCB0byAyMDAwSy4KLQkoREFUQV9TSVpFKTogSW5jcmVhc2VkIHRvIDIwMDBLLgotCi1UaHUgU2VwICAzIDE3OjMwOjU4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoVEVNUExBVEVfTkFNRSk6IFVzZSBlbGYzMi4KLQotTW9uIEF1ZyAzMSAwMTowNjowMCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmFtOiAgQ2hhbmdlIGFybWVsZi5zYyB0byBlbGYuc2MKLSAgICAgICAgKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCi0KLU1vbiBBdWcgMzEgMTE6MTI6MDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbXVscGFyYW1zL2FybWVsZi5zaDogIENoYW5nZSBTQ1JJUFRfTkFNRSB0bwotICAgICAgICBlbGYuICBDaGFuZ2UgVEVYVF9TVEFSVF9BRERSIHRvIDB4ODAwMC4gIERlZmluZQotICAgICAgICBPVEhFUl9URVhUX1NFQ1RJT05TLCBPVEhFUl9CU1NfU1lNQk9MUyBhbmQKLSAgICAgICAgT1RIRVJfQlNTX0VORF9TWU1CT0xTLgotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZi5zYzogIE1vZGlmeSB0byB1c2UKLSAgICAgICAgT1RIRVJfQlNTX0VORF9TWU1CT0xTLgotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmFybS5zYzogIFJlbW92ZSBmaWxlLgotCi1UdWUgQXVnIDE4IDEyOjA1OjM0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZW11bHRlbXBsL2FybWVsZi5lbSAoZ2xkX2FybWVsZl9iZWZvcmVfYWxsb2NhdGlvbik6Ci0gICAgICAgIEFkZCBiZmRfIHByZWZpeCB0byBlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICAgICAgICBhbmQgZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucy4KLSAgICAgICAgKGdsZF9hcm1lbGZfYWZ0ZXJfb3Blbik6IEFkZCBiZmRfIHByZWZpeCB0bwotICAgICAgICBlbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nLgotCi1GcmkgQXVnIDE0IDE1OjM0OjI5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGxkZ3JhbS55OiBJbmNsdWRlICJsZGN0b3IuaCIuCi0JKHN0YXRlbWVudCk6IEFjY2VwdCBTT1JUIGFyb3VuZCBDT05TVFJVQ1RPUlMuCi0JKiBsZGN0b3IuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGNvbnN0cnVjdG9yc19zb3J0ZWQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShjdG9yX3ByaW8sIGN0b3JfY21wKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGxkY3Rvcl9idWlsZF9zZXRzKTogU29ydCBjb25zdHJ1Y3RvcnMgaWYgcmVxdWVzdGVkLgotCSogbGRjdG9yLmggKGNvbnN0cnVjdG9yc19zb3J0ZWQpOiBEZWNsYXJlLgotCSogbGRsYW5nLmMgKHByaW50X3N0YXRlbWVudCk6IFByaW50IHNvcnRlZCBDT05TVFJVQ1RPUlMKLQljb3JyZWN0bHkuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBzb3J0IGFyb3VuZCBDT05TVFJVQ1RPUlMuCi0JKiBsZC50ZXhpbmZvIChPdXRwdXQgU2VjdGlvbiBLZXl3b3Jkcyk6IERvY3VtZW50IFNPUlQKLSAJKENPTlNUUlVDVE9SUykuCi0KLVRodSBBdWcgMTMgMTI6MjA6MzkgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGVtdWxwYXJhbXMvYXJtZWxmLnNoOiAgRGVmaW5lIFRFTVBMQVRFX05BTUUgdG8gYXJtZWxmLgotICAgICAgICogc2NyaXB0dGVtcGwvZWxmYXJtLnNjOiAgSW5jbHVkZSAuZ2x1ZV83dCBhbmQgLmdsdWU3Ci0gICAgICAgc2VjdGlvbnMuCi0gICAgICAgKiBlbXVsdGVtcGwvYXJtZWxmLmVtOiBOZXcgZmlsZS4KLQotVGh1IEF1ZyAxMyAxMjo1Mjo0NSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIE1ha2VmaWxlLmFtIChsZC5kdmkpOiBVc2UgIiBpbnN0ZWFkIG9mICcgZm9yIE1BS0VJTkZPLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBBdWcgMTEgMTY6MTc6MDEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZhcm0uc2M6ICBDaGFuZ2UgdGV4dCBzdGFydCBhZGRyZXNzCi0gICAgICAgIGJhY2sgdG8gemVyby4KLQotVHVlIEF1ZyAxMSAxMDowMToxMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9tbjEwMjAwLnNoIChNQVhfUEFHRVNJWkUpOiBEZWZpbmUgdG8gMS4KLQkqIGVtdWxwYXJtcy9tbjEwMzAwLnNoIChNQVhfUEFHRVNJWkUpOiBEZWZpbmUgdG8gMS4KLQotU3VuIEF1ZyAgOSAyMDozMToyNyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmFybS5zYzogIFNldCB0ZXh0IHN0YXJ0IGFkZHJlc3MgdG8KLSAgICAgICAgMHg4MDAwLiAgQWRkIF9fYnNzX2VuZCBkZWZpbml0aW9uLgotCi1TYXQgQXVnICAxIDExOjQ3OjM3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmYXJtLnNjOiAgTmV3IGZpbGUuCi0gICAgICAgICogZW11bHBhcmFtcy9hcm1lbGYuc2g6IFNldCBTQ1JJUFRfTkFNRSB0byBlbGZhcm0uCi0KLUZyaSBKdWwgMzEgMTU6NTY6MTYgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbXVscGFyYW1zL2FybWVsZi5zaDogTmV3IGZpbGUuCi0gICAgICAgICogY29uZmlndXJlLnRndDogIFJlY29nbml6ZSB0aHVtYi1lbGYgYW5kIGFybS1lbGYuCi0gICAgICAgICogTWFrZWZpbGUuYW0gKGVhcm1lbGYubyk6IE5ldy4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEp1bCAyNCAxMjowMDo1NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCByZW1vdmUgdGhlIGZpbGUgYmVmb3JlCi0JY2hlY2tpbmcgd2hldGhlciAkKGJpbmRpcikgPT0gJCh0b29sZGlyKS9iaW4uICBGcm9tIE1hY2llagotCVcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS50Z3Q6IFJlY29nbml6ZSBoOFszNV0wMCotY29mZiogYXMgd2VsbCBhcyAtaG1zKi4KLQotVGh1IEp1bCAyMyAxMToxNToxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IElmIEFMSUdOTUVOVCBpcyBkZWZpbmVkLCB1c2UgaXQgdG8gc2V0Ci0JYWxpZ25tZW50IG9mIGVuZCBzeW1ib2wuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9zdW40LnNoIChBTElHTk1FTlQpOiBEZWZpbmUuCi0JKiBlbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIChBTElHTk1FTlQpOiBEZWZpbmUuCi0JKiBsZGludC50ZXhpbmZvIChlbXVsYXRpb24gcGFyYW1ldGVycyk6IERvY3VtZW50IEFMSUdOTUVOVC4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgbWlzc2luZyBicmVhayBzdGF0ZW1lbnQuCi0KLQkqIGxkbGFuZy5jIChsYW5nX2djX3NlY3Rpb25zXzEpOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaCB0bwotCWF2b2lkIHdhcm5pbmdzLgotCi1UdWUgSnVsIDE0IDE1OjQyOjE3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGk/ODYtKi1iZW9ze3BlLGVsZix9Kik6IFJlY29nbml6ZS4KLQkqIE1ha2VmaWxlLmFtIChlaTM4NmJlb3Mubyk6IE5ldy4KLQkqIGVtdWxwYXJhbXMvaTM4NmJlb3Muc2g6IE5ldyBmaWxlLgotCSogZW11bHRlbXBsL2Jlb3MuZW0sIHNjcmlwdHRlbXBsL2kzODZiZW9zLnNjOiBOZXcgZmlsZS4KLQotVHVlIEp1bCAxNCAxNTozNTo0MiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYzogTmV3IG9wdGlvbiAtLXZlcnNpb24tZXhwb3J0cy1zZWN0aW9uLgotCSogbGQuaCAoc3RydWN0IGFyZ3NfdHlwZSk6IEFkZCB2ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbi4KLQkqIGxkbGFuZy5jIChsYW5nX2RvX3ZlcnNpb25fZXhwb3J0c19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX3Byb2Nlc3MpOiBDYWxsIGl0LgotCi1Nb24gSnVsIDEzIDEzOjIwOjIzIDE5OTggIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHRyYW5zbWV0YS5jb20+Ci0KLQkqIGxkbGV4Lmw6IEFjY2VwdCBBU1NFUlQuCi0JKiBsZGdyYW0ueSAoZXhwKTogQWRkIEFTU0VSVF9LIGNhc2UuCi0JKiBsZGV4cC5oIChub2RlX3R5cGUpOiBBZGQgZXRyZWVfYXNzZXJ0IHRvIG5vZGVfY2xhc3MgZW51bS4KLQkoZXRyZWVfdHlwZSk6IEFkZCBhc3NlcnRfcyBmaWVsZC4KLQkoZXhwX2Fzc2VydCk6IERlY2xhcmUuCi0JKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogSGFuZGxlIGV0cmVlX2Fzc2VydC4KLQkoZXhwX2Fzc2VydCk6IE5ldyBmdW5jdGlvbi4KLQkoZXhwX3ByaW50X3RyZWUpOiBIYW5kbGUgZXRyZWVfYXNzZXJ0LgotCSogbGQudGV4aW5mbyAoTWlzY2VsbGFuZW91cyBDb21tYW5kcyk6IERvY3VtZW50IEFTU0VSVC4KLQotV2VkIEp1bCAgOCAxNDowMzoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55OiBDaGFuZ2UgTUFYIHRvIE1BWF9LIGFuZCBNSU4gdG8gTUlOX0ssIHRvIGF2b2lkCi0JY29uZmxpY3RzIHdpdGggc3lzdGVtIGhlYWRlciBmaWxlcy4gIENoYW5nZSBhbGwgdXNlcy4KLQotCSogTWFrZWZpbGUuYW0gKE1BSU5UQUlORVJDTEVBTkZJTEVTKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBKdWwgIDcgMTg6MDM6MjIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGR2ZXIudGV4aSk6IE5ldyB0YXJnZXQuCi0JKGxkLmluZm8sIGxkLmR2aSk6IERlcGVuZCB1cG9uIGxkdmVyLnRleGkuCi0JKiBsZC50ZXhpbmZvOiBJbmNsdWRlIGxkdmVyLnRleGkuICBNZW50aW9uIHZlcnNpb24gbnVtYmVyIG9uIHRpdGxlCi0JcGFnZSBhbmQgaW4gdG9wIG5vZGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEp1bCAgNiAxNDo1NToxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLXNvbGFyaXMqKTogTmV3IHRhcmdldC4KLQotRnJpIEp1bCAgMyAxNDoxOTowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkX3NlY3Rpb24pOiBEb24ndCBnZXQgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaWYgdGhlCi0Jc2VjdGlvbiBpcyBkaXNjYXJkZWQuCi0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBVc2UgU09SVCB0byBzb3J0IHNlY3Rpb25zIGFwcHJvcHJpYXRlbHkuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNvcnRfYnlfZmlsZV9uYW1lKTogUmVtb3ZlLgotCShzb3J0X2J5X3NlY3Rpb25fbmFtZSk6IFJlbW92ZS4KLQkoc29ydF9zZWN0aW9uc18xLCBzb3J0X3NlY3Rpb25zKTogUmVtb3ZlLgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBEb24ndCBjYWxsCi0Jc29ydF9zZWN0aW9ucy4KLQkoaG9sZF9zZWN0aW9uLCBob2xkX3NlY3Rpb25fbmFtZSk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShob2xkX3VzZSwgaG9sZF90ZXh0LCBob2xkX3JkYXRhLCBob2xkX2RhdGEsIGhvbGRfYnNzKTogTGlrZXdpc2UuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSZXdyaXRlLiAgTG9vayBmb3IgYSBnb29kCi0JcGxhY2UgdG8gcHV0IHRoZSBzZWN0aW9uLiAgQWxpZ24gdGhlIHNlY3Rpb24uICBTb3J0IHRoZSBpbnB1dAotCXNlY3Rpb25zIGJ5IG5hbWUuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogbGRsYW5nLmMgKHdpbGRfc29ydCk6IFdoZW4gc29ydGluZyBieSBmaWxlIG5hbWUsIHNvcnQgYnkgYXJjaGl2ZQotCW5hbWUgZmlyc3QuCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc2V0X3BlX3N1YnN5c3RlbSk6IERvbid0IGNhbGwKLQlsZGxhbmdfYWRkX3VuZGVmLgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBVc2UgbmV3IGFmdGVyX3BhcnNlIGZ1bmN0aW9uCi0JcmF0aGVyIHRoYW4gYWZ0ZXJfcGFyc2VfZGVmYXVsdC4KLQotCSogbGRncmFtLnkgKGV4dGVybl9uYW1lX2xpc3QpOiBEbyBub3QgcmVxdWlyZSBzeW1ib2xzIHRvIGJlCi0Jc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLQkoaWZpbGVfcDEpOiBBZGQgRVhURVJOLgotCSogbGRsZXgubDogQWNjZXB0IEVYVEVSTiBpbiBCT1RIIGFuZCBTQ1JJUFQgbW9kZSBhcyB3ZWxsIGFzIE1SSQotCW1vZGUuCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogTWVudGlvbiB0aGF0IEVYVEVSTiBpcyBlcXVpdmFsZW50IHRvIC11LgotCShNaXNjZWxsYW5lb3VzIENvbW1hbmRzKTogRG9jdW1lbnQgRVhURVJOLgotCi1XZWQgSnVsICAxIDE5OjQwOjM0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGdjX3NlY3Rpb25zLgotCSogbGRncmFtLnkgKGxkZ3JhbV9oYWRfa2VlcCwgS0VFUCk6IE5ldy4KLQkoaW5wdXRfc2VjdGlvbl9zcGVjX25vX2tlZXApOiBSZW5hbWUgZnJvbSBvbGQgaW5wdXRfc2VjdGlvbl9zcGVjLgotCShpbnB1dF9zZWN0aW9uX3NwZWMpOiBOZXcuICBSZWNvZ25pemUgS0VFUC4KLQkqIGxkbGFuZy5jICh3aWxkX3NlY3Rpb24pOiBIYW5kbGUga2VlcCBzZWN0aW9ucy4KLQkobGFuZ19nY193aWxkX3NlY3Rpb24sIGxhbmdfZ2Nfd2lsZF9maWxlLCBsYW5nX2djX3dpbGQpOiBOZXcuCi0JKGxhbmdfZ2Nfc2VjdGlvbnNfMSwgbGFuZ19nY19zZWN0aW9ucyk6IE5ldy4KLQkobGFuZ19wcm9jZXNzKTogSW52b2tlIGxhbmdfZ2Nfc2VjdGlvbnMuCi0JKGxhbmdfYWRkX3dpbGQpOiBBZGQga2VlcCBhcmd1bWVudC4gIFVwZGF0ZSBhbGwgY2FsbGVycy4KLQkqIGxkbGFuZy5oIChsYW5nX3dpbGRfc3RhdGVtZW50X3N0cnVjdCk6IEFkZCBrZWVwX3NlY3Rpb25zLgotCSogbGRsZXgubCAoS0VFUCk6IE1hdGNoIGl0LgotCSogbGRtYWluLmMgKG1haW4pOiBFcnJvciBvbiAtciBhbmQgLS1nYy1zZWN0aW9ucy4KLQkqIGxleHN1cC5jOiBBZGQgLS1nYy1zZWN0aW9ucy4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBNZXJnZSAudGV4dC4qIGV0YyBzZWN0aW9ucyBhcHByb3ByaWF0ZWx5LgotCU1hcmsgc3RhcnR1cCBzZWN0aW9ucyB3aXRoIEtFRVAuCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IExpa2V3aXNlLgotCi0JKiBsZC50ZXhpbmZvOiBVcGRhdGUgZm9yIC0tZ2Mtc2VjdGlvbnMgYW5kIEtFRVAuCi0KLVdlZCBKdWwgIDEgMTU6MjE6MjAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBQZXRlciBKb3JkYW4gPHBqb3JkYW5AY2hsYS51c2MuZWR1PjoKLQkqIHNjcmlwdHRlbXBsL2kzODZnbzMyLnNjOiBDb3JyZWN0IGNvbnN0cnVjdG9yIGhhbmRsaW5nIGZvciAtdS4KLQotVHVlIEp1biAyMyAxNToxNzoyNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWRhdGEtbG9jYWwpOiBNYWtlIGxkc2NyaXB0cyBzdWJkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEp1biAyMyAxNToxNzowNCAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCBsZXQgRVhFRVhUIGludGVyZmVyZQotCXdpdGggdGhlIHByb2dyYW0gdHJhbnNmb3JtIG5hbWUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotU3VuIEp1biAyMSAyMzo1NToxNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxkLnRleGluZm86IE5vdGUgdGhhdCAtcmVsYXggbWF5IG1ha2Ugc3ltYm9saWMgZGVidWdnaW5nCi0JaW1wb3NzaWJsZSBvbiBzb21lIHBsYXRmb3Jtcy4KLQotVHVlIEp1biAxNiAxMjo1MToxMyAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBNYWtlZmlsZS5hbSAoTWFrZWZpbGUpOiBSZW1vdmUgdGFyZ2V0LgotCShjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaG9zdCAocG93ZXJwYyotKi1saW51eC1nbnUqKTogTmV3IGhvc3QuCi0KLUZyaSBKdW4gMTIgMTc6Mzg6MDcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYyAoSU5QVVRfRklMRVMpOiBPcHRpb25hbCBJTlBVVCBzcGVjLgotCi0JKiBlbXVscGFyYW1zL20zMnJlbGYuc2ggKE9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMpOiBDaGFuZ2UgdG9wIG9mCi0Jc3RhY2sgdG8gOE1CLgotCi1GcmkgSnVuIDEyIDE5OjMzOjE3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEhGSUxFUyk6IFJlbW92ZSBjb25maWcuaC4KLQkoRU1VTEFUSU9OX09GSUxFUywgUE9URklMRVMpOiBNb3ZlIHBhdGNoIG9mIE1heSAxNCBmcm9tCi0JTWFrZWZpbGUuaW4gdG8gTWFrZWZpbGUuYW0uCi0JKGVhcm1jb2ZmLmMpOiBEZXBlbmQgdXBvbiBhcm1jb2ZmLmVtLCBub3QgZ2VuZXJpYy5lbS4KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBDb3JyZWN0IG1pc3NwZWxsaW5nIGluICQoUEFDS0FHRSkuCi0JKCQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCk6IFBhc3MgLUMgdG8gJChYR0VUVEVYVCkuCi0JKiBNYWtlZmlsZS5pbiwgcG8vUE9URklMRVMuaW4sIHBvL2xkLnBvdDogUmVidWlsZC4KLQotRnJpIEp1biAxMiAxMzo0MzoxNyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBJZiBtYWludGFpbmVyIG1vZGUsIGRlcGVuZCBvbiAucG90IGZpbGUuCi0JKCQoUEFDS0FHRSkucG90KTogVW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBQT1RGSUxFUy4KLQotVHVlIEp1biAgOSAwOTozNjo0OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19maW5pc2gpOiBBZGQgQ09OU1QgdHlwZSBtb2RpZmllciB0byBkZWNsYXJhdGlvbgotCW9mICdzZW5kJy4KLQotRnJpIEp1biAgNSAxODoxOTo1OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6IFNldAotCWNvbmZpZy5oYXNfc2hhcmVkIHRvIHRydWUuCi0JKiBlbXVsdGVtcGwvbGludXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6Ci0JTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6Ci0JTGlrZXdpc2UuCi0KLVR1ZSBKdW4gIDIgMTI6NTU6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19maW5pc2gpOiBJZiB0aGUgZW50cnkgc3ltYm9sIGlzIG5vdCBmb3VuZCwgdHJ5Ci0JcGFyc2luZyBpdCBhcyBhIG51bWJlci4KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBEb2N1bWVudCB0aGlzLgotCi1Nb24gSnVuICAxIDE0OjAxOjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoSW5wdXQgU2VjdGlvbiBXaWxkY2FyZHMpOiBEb2N1bWVudCBTT1JUIGtleXdvcmQuCi0KLU1vbiBNYXkgMTggMTI6NDI6NTMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBOZXcgbWVtYmVyIGhhc19zaGFyZWQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgaXQuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6IFNldCBpdC4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVHJlYXQgLXNoYXJlZCBhcyBlcnJvciBpZiBub3Qgc3VwcG9ydGVkLgotCi1Nb24gTWF5IDE4IDEzOjE0OjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gSmFzb24gTWVycmlsbCA8amFzb25AY3lnbnVzLmNvbT46Ci0JKiBsZGxhbmcuYyAod2lsZF9zb3J0KTogQ29ycmVjdCBvcmRlciBvZiBzb3J0LgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBQdXQgKmNydGJlZ2luLm8gYmVmb3JlIG90aGVyIC5jdG9ycyBhbmQKLQkuZHRvcnMuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBMaWtld2lzZS4KLQotRnJpIE1heSAxNSAwMDoyMjozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBrZXl3b3JkIFNPUlQuCi0JKiBsZGdyYW0ueSAoY3VycmVudF9maWxlKTogQ2hhbmdlIHRvIHN0cnVjdCB3aWxkY2FyZF9zcGVjLgotCSgldW5pb24pOiBBZGQgbmV3IGZpZWxkcyBjbmFtZSBhbmQgd2lsZGNhcmQuCi0JKHdpbGRjYXJkX25hbWUsIHdpbGRjYXJkX3NwZWMpOiBOZXcgbm9udGVybWluYWxzLgotCShmaWxlX05BTUVfbGlzdCk6IFVzZSB3aWxkY2FyZF9zcGVjLgotCShpbnB1dF9zZWN0aW9uX3NwZWMpOiBDaGFuZ2UgY3VycmVudF9maWxlIHVzYWdlLgotCSogbGQuaCAoc3RydWN0IHdpbGRjYXJkX3NwZWMpOiBEZWZpbmUuCi0JKiBsZGxhbmcuaCAobGFuZ193aWxkX3N0YXRlbWVudF9zdHJ1Y3QpOiBBZGQgbmV3IGZpZWxkcwotCXNlY3Rpb25zX3NvcnRlZCBhbmQgZmlsZW5hbWVzX3NvcnRlZC4KLQkobGFuZ19hZGRfd2lsZCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGxkbGFuZy5jICh3aWxkX3NvcnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh3aWxkX3NlY3Rpb24pOiBVc2Ugd2lsZF9zb3J0LgotCShwcmludF93aWxkX3N0YXRlbWVudCk6IFByaW50IHNvcnRpbmcgaW5mb3JtYXRpb24uCi0JKGxhbmdfYWRkX3dpbGQpOiBBZGQgbmV3IHBhcmFtZXRlcnMgc2VjdGlvbnNfc29ydGVkIGFuZAotCWZpbGVuYW1lc19zb3J0ZWQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKiBtcmkuYyAobXJpX2RyYXdfdHJlZSk6IFVwZGF0ZSBjYWxscyB0byBsYW5nX2FkZF93aWxkLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBTb3J0IC5jdG9ycy4qIGFuZCAuZHRvcnMuKiBieSBzZWN0aW9uIG5hbWUuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBMaWtld2lzZS4KLQotVGh1IE1heSAxNCAxODozOToxNiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL20zMnJlbGYuc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUuCi0KLVRodSBNYXkgMTQgMTQ6NTE6MjQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmg6IEFkZCBuZXcgcHJvdG90eXBlOiBsZGVtdWxfbGlzdF9lbXVsYXRpb25fb3B0aW9ucy4KLQkobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogQWRkIG5ldyBmaWVsZDogbGlzdF9vcHRpb25zLgotCSogbGRlbXVsLmMgKGxkZW11bF9saXN0X29wdGlvbnMpOiBOZXcgZnVuY3Rpb24uICBDYWxsIHRoZQotCWxpc3Rfb3B0aW9ucyBmaWVsZCBvZiB0aGUgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGZvciBlYWNoCi0Jc3VwcG9ydGVkIGVtdWxhdGlvbiwgaWYgc3VjaCBhIGZ1bmN0aW9uIGlzIHByZXNlbnQuCi0JKiBsZXhzdXAuYyAoaGVscCk6IENhbGwgbGRlbXVsX2xpc3RfZW11bGF0aW9uX29wdGlvbnMuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF88Pl9saXN0X29wdGlvbnMpOiBOZXcgZnVuY3Rpb24uICBEZXNjcmliZQotCXRoZSBwZSBlbXVsYXRpb24gc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbSAoZ2xkPD5fbGlzdF9vcHRpb25zKTogTmV3IGZ1bmN0aW9uLgotCURlc2NyaWJlICB0aGUgYXJtY29mZiBlbXVsYXRpb24gc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogQWRkIGEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb246Ci0JLS1zdXBwb3J0LW9sZC1jb2RlLgotCSogZW11bHRlbXBsL2FybWNvZmYuZW06IERpdHRvLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgdGhlIC0tc3VwcG9ydC1vbGQtY29kZSBvcHRpb24uCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZW11bGF0aW9uIGZpbGVzIGZvciBQT1RGSUxFUy5pbiB0YXJnZXQuCi0JKiBlbXVsdGVtcGwvcGUuZW06IEludGVybmF0aW9uYWxpc2Ugc3VpdGFibGUgc3RyaW5ncy4KLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOiBJbnRlcm5hdGlvbmFsaXNlIHN1aXRhYmxlIHN0cmluZ3MuCi0JKiBwby9QT1RGSUxFUy5pbjogUmVidWlsdC4KLQotU3VuIE1heSAxMCAyMjozNjozMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBwby9NYWtlLWluIChpbnN0YWxsLWluZm8pOiBOZXcgdGFyZ2V0LgotCi1UdWUgQXByIDI4IDE5OjE4OjMwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBDb25kaXRpb25hbGx5IGNhbGwgc2V0bG9jYWxlLgotCSogbGQuaDogSW5jbHVkZSA8bG9jYWxlLmg+IGlmIEhBVkVfTE9DQUxFX0guCi0JKExDX01FU1NBR0VTKTogTm93IGNhbiBiZSBkZWZpbmVkIGV2ZW4gd2hlbiBFTkFCTEVfTkxTLgotCi1Nb24gQXByIDI3IDExOjU2OjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucykgWy1ycGF0aC1saW5rXTogTWVudGlvbiBsZC5zby5jb25mLgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsb2JhbF92ZXJjaGVja19uZWVkZWQpOiBOZXcgZmlsZSBzdGF0aWMKLQl2YXJpYWJsZS4KLQkoZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IENoZWNrIGZvciBzaGFyZWQgbGlicmFyaWVzCi0JdHdpY2UsIG9uY2Ugd2l0aCBmb3JjZSBzZXQgdG8gMCBhbmQgb25jZSB3aXRoIGl0IHNldCB0byAxLgotIAkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZik6IEFkZCBmb3JjZSBwYXJhbWV0ZXIuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkKTogTGlrZXdpc2UuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQpOiBMaWtld2lzZS4gIElmIG5vdCBmb3JjZSwgY2hlY2sKLQl3aGV0aGVyIHRoZSBsaWJyYXJpZXMgbmVlZHMgYW55IGluY29tcGF0aWJsZSB2ZXJzaW9ucy4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1XZWQgQXByIDIyIDE2OjAxOjM1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KLQotV2VkIEFwciAyMiAxMjo0MDo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVjay1ERUpBR05VKTogQWRkICQoSU5UTExJQlMpIHRvIExJQklCRVJUWSB3aGVuCi0JaW52b2tpbmcgcnVudGVzdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IENoYW5nZSAtbCBvcHRpb25zIGludG8gLS1saWJyYXJ5IG9wdGlvbnMKLQl0byBhdm9pZCBjb25mdXNpb24gYmV0d2VlbiAtbGkgYW5kIC1saWJyYXJ5LgotCi0JKiBsZC50ZXhpbmZvIChNRU1PUlkpOiBDbGFyaWZ5IHVzZSBvZiA+UkVHSU9OLgotCi1UdWUgQXByIDIxIDIzOjEyOjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQotCXN0cmluZ3MuCi0JKiBsZC5oOiBBZGRlZCBnZXR0ZXh0LXJlbGF0ZWQgaW5jbHVkZXMgYW5kIGRlZmluZXMuCi0JKiBsZG1haW4uYzogQ2FsbCBzZXRsb2NhbGUsIGJpbmR0ZXh0ZG9tYWluLCB0ZXh0ZG9tYWluLgotCSogYWNjb25maWcuaCAoRU5BQkxFX05MUywgSEFWRV9DQVRHRVRTLCBIQVZFX0dFVFRFWFQsIEhBVkVfU1RQQ1BZLAotCUhBVkVfTENfTUVTU0FHRVMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQ1lfR05VX0dFVFRFWFQuICBDcmVhdGUgcG8vTWFrZWZpbGUuaW4gYW5kCi0JcG8vTWFrZWZpbGUuICBVc2UgQU1fUFJPR19MRVguCi0JKFRESVJTKTogQUNfU1VCU1QgZWFybHkgb24sIHRvIGF2b2lkIGhhdmluZyB2YWx1ZSBzcGxpdCB3aGVuIGl0Ci0JaGFwcGVucyB0byBjcm9zcyBsaW5lIDkwIG9mIHRoZSBnZW5lcmF0ZWQgc2VkIHNjcmlwdC4KLQkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogTmV3IG1hY3JvLgotCShQT1RGSUxFUyk6IExpa2V3aXNlLgotCShwby9QT1RGSUxFUy5pbik6IE5ldyB0YXJnZXQuCi0JKGxkX25ld19MREFERCk6IEFkZGVkIElOVExMSUJTLgotCShsZF9uZXdfREVQRU5ERU5DSUVTKTogQWRkZWQgSU5UTERFUFMuCi0JKiBwby9NYWtlLWluLCBwby9QT1RGSUxFUy5pbiwgcG8vZ2FzLnBvdDogTmV3IGZpbGVzLgotCi1UdWUgQXByIDIxIDIzOjA3OjA3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoU2ltcGxlIEV4YW1wbGUpOiBSZXdyaXRlIGEgZmV3IHRoaW5ncyBhcyBzdWdnZXN0ZWQKLQlieSBOaWNrIENsaWZ0b24gPG5pY2tjQGN5Z251cy5jb20+LgotCShQUk9WSURFKTogTGlrZXdpc2UuCi0KLVR1ZSBBcHIgMjEgMDk6NTU6MDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtOiBSZW5hbWUgZXh0ZXJuYWwgYXJtIGludGVyd29ya2luZyBmdW5jdGlvbnMKLQl0byBjb25mb3JtIHRvIEJGRCBuYW1pbmcgY29udmVudGlvbnMuICBBZGQgY29kZSB0byBfYWZ0ZXJfb3BlbigpCi0JZnVuY3Rpb24gdG8gb2J0YWluIGEgYmZkIGZvciB1c2UgYnkgdGhlIGludGVyd29ya2luZyBjb2RlLgotCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbTogUmVuYW1lIGV4dGVybmFsIGFybSBpbnRlcndvcmtpbmcgZnVuY3Rpb25zCi0JdG8gY29uZm9ybSB0byBCRkQgbmFtaW5nIGNvbnZlbnRpb25zLiAgQWRkIG5ldyBfYWZ0ZXJfb3BlbigpCi0JZnVuY3Rpb24gdG8gb2J0YWluIGEgYmZkIGZvciB1c2UgYnkgdGhlIGludGVyd29ya2luZyBjb2RlLgotCi1TdW4gQXByIDE5IDE5OjIzOjA5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpIFtjYXNlIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bV06Ci0JVXBkYXRlIGRvdCBhbmQgdGhlIGRlZmF1bHQgbWVtb3J5IHNlY3Rpb24gZXZlbiB3aGVuIHJlbGF4aW5nLgotCi1TYXQgQXByIDE4IDE4OjQxOjEyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX29uZV9jb21tb24pOiBNYW5pcHVsYXRlIHRoZSBzZWN0aW9uJ3MgY29va2VkIHNpemUKLQlyYXRoZXIgdGhhbiBpdHMgcmF3IHNpemUuCi0KLVR1ZSBBcHIgIDcgMTM6MzU6MjkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb25maWd1cmUuaW4gKFRFU1RCRkRMSUIpOiBOZXcuICBEZWZpbmVkIGFuZCBzdWJzdGl0dXRlZC4KLQkqIE1ha2VmaWxlLmFtIChURVNUQkZETElCKTogQ2hhbmdlZCB0byBAVEVTVEJGRExJQkAuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gQXByICA2IDE1OjMzOjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxkLmluZm8pOiBJbnZva2UgbWFrZWluZm8gd2l0aCAtSSBvcHRpb25zIGRpcmVjdGx5Ci0JcmF0aGVyIHRoYW4gcmVseWluZyBvbiBkZWZhdWx0IHJ1bGUuICBEb24ndCBkZXBlbmQgdXBvbgotCWJmZHN1bW0udGV4aS4KLQkobGQuZHZpKTogTGlrZXdpc2UuCi0JKGJmZHN1bW0udGV4aSk6IFJlbW92ZSB0YXJnZXQuCi0JKENMRUFORklMRVMpOiBUYWtlIGJmZHN1bW0udGV4aSBvdXQgb2YgdmFsdWUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotU3VuIEFwciAgNSAxMzowNzo1NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBVc2Ugc2hlbGwgdmFyaWFibGVzIHRvIGF2b2lkIGRlcGVuZGluZyB1cG9uCi0JaG93ICQgaXMgaGFuZGxlZCB3aGVuIGV4cGFuZGluZyBhIHNoZWxsIHN1YnN0aXR1dGlvbi4KLQotRnJpIEFwciAgMyAwMDo1Njo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChNT1NUTFlDTEVBTkZJTEVTKTogQWRkIGxkLmxvZyBhbmQgbGQuc3VtLgotCShESVNUQ0xFQU5GSUxFUyk6IEFkZCBzaXRlLmV4cCBhbmQgc2l0ZS5iYWsuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmluOiBQdXQgdGhlIHRkaXJzIGluIGEgZmlsZSBhbmQgdXNlIEFDX1NVQlNUX0ZJTEUsCi0JcmF0aGVyIHRoYW4gaW4gYSBzaGVsbCB2YXJpYWJsZSBhbmQgdXNpbmcgQUNfU1VCU1QuCi0JKiBNYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBSZW1vdmUgbGRzY3JpcHRzLiAgQWRkIHRkaXJzLgotIAkoZGlzdGNsZWFuLWxvY2FsKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGxkLnRleGluZm86IENvbXBsZXRlbHkgcmV3cml0ZSBsaW5rZXIgc2NyaXB0IGRvY3VtZW50YXRpb24uCi0KLU1vbiBNYXIgMzAgMTI6NDc6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCB2ZXJzaW9uIHRvIDIuOS4xLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjkuCi0KLVNhdCBNYXIgMjggMTY6NDg6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoTU9TVExZQ0xFQU5GSUxFUyk6IFJlbW92ZSB0bXBkaXIuCi0JKG1vc3RseWNsZWFuLWxvY2FsKTogTmV3IHRhcmdldCB0byByZW1vdmUgdG1wZGlyLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBsZGNyZWYuYyAob3V0cHV0X2NyZWYpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBsZGZpbGUuYyAobGRmaWxlX2FkZF9hcmNoKTogTGlrZXdpc2UuCi0JKiBsZGxhbmcuYyAobGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGxleHN1cC5jIChPUFRJT05fQ09VTlQpOiBMaWtld2lzZS4KLQkocGFyc2VfYXJncyk6IExpa2V3aXNlLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOgotCUxpa2V3aXNlLgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyKTogTGlrZXdpc2UuCi0JKiBsZGxhbmcuYyAobGFuZ19jaGVjayk6IEluaXRpYWxpemUgdmFyaWFibGVzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0KLQkqIE1ha2VmaWxlLmFtIChNT1NUTFlDTEVBTkZJTEVTKTogQ29ycmVjdCBuYW1lICh3YXMKLQlNT1NUQ0xFQU5GSUxFUykuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIE1hciAyNyAxNjozOToyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogUHV0Ci0JQVJNIGNvZGUgaW5zaWRlIGlmZGVmIFRBUkdFVF9JU19hcm1wZS4KLQotV2VkIE1hciAyNSAxMTozNDoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEguSi4gTHUgIDxoamxAZ251Lm9yZz46Ci0JKiBNYWtlZmlsZS5hbSAoTERESVNUU1RVRkYpOiBOZXcgdmFyaWFibGUuCi0JKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IE9ubHkgaW5jbHVkZSAuaWRhdGFcJFswLTddIGluIC5pZGF0YSB3aGVuCi0JcmVsb2NhdGluZy4KLQotVHVlIE1hciAyNCAxNTo1OToyOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYyAoLnRleHQpOiBBZGQgLmdsdWVfNyBhbmQgLmdsdWVfN3Qgc2VjdGlvbnMgdG8KLQlob2xkIEFybS9UaHVtYiBzdHVicy4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfcGVfYmVmb3JlX2FsbG9jYXRpb24pOiBDYWxsCi0JYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGZvciBBUk0vVGh1bWIgdGFyZ2V0cykgaW4gb3JkZXIgdG8KLQlnYXRoZXIgaW50ZXJ3b3JraW5nIHN0YiBpbmZvcm1hdGlvbi4KLQotTW9uIE1hciAyMyAxODo1NDoxNSAxOTk4ICBKb2VsIFNoZXJyaWxsICA8am9lbEBPQVJjb3JwLmNvbT4KLQotCSogY29uZmlndXJlLnRndDogKHNoKi0qLXJ0ZW1zKik6IFN3aXRjaGVkIGZyb20gRUxGIHRvIENPRkYuCi0KLUZyaSBNYXIgMjAgMTk6MTc6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KLQotVGh1IE1hciAxOSAxNDo1NDo0NSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogVGhlIEN5Z3dpbjMyIGxpYnJhcnkgdXNlcyBhIC5kYXRhJG5vY29weQotCXNlY3Rpb24gdG8gYXZvaWQgY29weWluZyBjZXJ0YWluIGRhdGEgb24gZm9yay4gIFRoZSBsaW5rZXIgdXNlZCB0bwotCWluY2x1ZGUgdGhpcyBiZXR3ZWVuIF9fZGF0YV9zdGFydF9fIGFuZCBfX2RhdGFfZW5kX18sIGJ1dCB0aGF0Ci0JYnJlYWtzIGJ1aWxkaW5nIHRoZSBjeWd3aW4zMiBkbGwuICBUaGUgZml4IGlzIHRvIHJlbmFtZSB0aGUKLQlzZWN0aW9uCSIuZGF0YV9jeWd3aW5fbm9jb3B5IiBhbmQgZXhwbGljdGx5IGluY2x1ZGUgaXQgYWZ0ZXIKLQlfX2RhdGFfZW5kX18uCi0KLVdlZCBNYXIgMTggMDk6NDI6MjQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEFkZCB0aHVtYi1wZSB0YXJnZXQuCi0KLVN1biBNYXIgIDggMjM6MzQ6MTQgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoc3BhcmNsaXRlKi0qLWVsZik6IEFkZGVkLgotCi1Nb24gTWFyICAyIDE5OjI0OjA4IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogSWYgdGhlIGRlZmF1bHQgbWVtb3J5IHJlZ2lvbiBpcwotCSpkZWZhdWx0Kiwgc2VlIGlmIHRoZXJlIGlzIGEgbWVtb3J5IHJlZ2lvbiB0aGF0IGNvdWxkIGJlIHVzZWQuCi0KLVRodSBGZWIgMjYgMTc6MDk6NTMgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IEFkZCBzdXBwb3J0IGZvciAuZWl0X3Ygc2VjdGlvbiBhbmQgcHV0Ci0JaXQgYXQgMHhmZmZmZjAyMC4KLQkqIGVtdWxwYXJhbXMvZDMwdntlbGYsX28sX2V9LnNoOiBEaXR0by4KLQotTW9uIEZlYiAyMyAxNzo0Njo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc29ydF9zZWN0aW9ucyk6IFBlcm1pdCB0aGUgd2lsZGNhcmQgdG8gaW5jbHVkZQotCWEgdHJhaWxpbmcgJyonIHdoZW4gc29ydGluZyBncm91cGVkIHNlY3Rpb25zLgotCSogc2NyaXB0dGVtcGwvcGUuc2M6IEluY2x1ZGUgZ3JvdXBlZCBzZWN0aW9ucyB1c2luZyBOQU1FXCQqLiAgT25seQotCWluY2x1ZGUgdGhlbSB3aGVuIHJlbG9jYXRpbmcuCi0KLVdlZCBGZWIgMTggMjM6Mzk6NDYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IEluc3RhbGwgcHJvcGVybHkgd2hlbiBsbgotCWZhaWxzIG9yIHRvb2xkaXIgPT0gcHJlZml4LgotCi1GcmkgRmViIDEzIDE1OjI0OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KLQotVGh1IEZlYiAxMiAxNDoxMDo0NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWxpZ24gdGhlIF9lbmQgc3ltYm9sIGFjY29yZGluZyB0byB0aGUgRUxGCi0gCWZvcm1hdCBzaXplLiAgRnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT4uCi0KLQlOZXRCU0QgcGF0Y2hlcyBmcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKLQkqIGNvbmZpZ3VyZS5ob3N0IChhbHBoYSotKi1uZXRic2QqKTogTmV3IGhvc3QuCi0JKiBjb25maWd1cmUudGd0IChhbHBoYSotKi1uZXRic2QqLCBwb3dlcnBjLSotbmV0YnNkKik6IE5ldwotCXRhcmdldHMuCi0KLQkqIGxleHN1cC5jIChoZWxwKTogVXBkYXRlIGJ1Zy1nbnUtdXRpbHMgYWRkcmVzcy4KLQkqIGxkLnRleGluZm8gKEJ1ZyBSZXBvcnRpbmcpOiBMaWtld2lzZS4KLQotVHVlIEZlYiAxMCAxODowNTo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBXYXJuIGlmIHNvbWUgbWVtb3J5IHJlZ2lvbnMgd2VyZQotCWRlZmluZWQsIGJ1dCBhIGxvYWRhYmxlIHNlY3Rpb24gaXMgZ29pbmcgaW50byB0aGUgZGVmYXVsdCBtZW1vcnkKLQlyZWdpb24uCi0KLVR1ZSBGZWIgMTAgMTY6MTc6MjAgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBsZGxleC5sIChWX0lERU5USUZJRVIpOiBBbGxvdyAnLicgYXMgc3ltYm9sIHByZWZpeC4KLQotVHVlIEZlYiAxMCAxNTowOTo0NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChNYWtlZmlsZSk6IEFkZCB0YXJnZXQsIGZvciBkZXBlbmRlbmNpZXMgb24KLQljb25maWd1cmUuaG9zdCBhbmQgY29uZmlndXJlLnRndC4KLQkqIGNvbmZpZ3VyZS5ob3N0LCBjb25maWd1cmUudGd0OiBDaGFuZ2UgLWxpbnV4KiB0byAtbGludXgtZ251Ki4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gRmViICA5IDEzOjQ0OjQwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYyAoLnN0YWNrKTogTW92ZSBzdGFjayB0byAweDAwLi43RkZFLgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFJFQURPTkxZX1NUQVJUX0FERFIpOiBSZWFkIG9ubHkgc2VjdGlvbgotIAltb3ZlZCB0byAweDAwLi4uLi40LgotCi1TYXQgRmViICA3IDE1OjQxOjI2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVRodSBGZWIgIDUgMTI6MTY6MTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogUmVtb3ZlICR7UkVMT0NBVElORy0wfSBmcm9tIGFsbCBzZWN0aW9ucy4KLQlGcm9tIFRob21hcyBkZSBMZWxsaXMgPHRkZWxAd3JzLmNvbT4uCi0KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotV2VkIEZlYiAgNCAxMzowMjozMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsZF9uZXdfTERBREQpOiBSZW1vdmUgQExFWExJQkAuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEZlYiAgMiAxOTozNDo1NCAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JQWRkIHRtczMyMGMzMCBzdXBwb3J0OgotCSogY29uZmlndXJlLnRndCAodGljMzAtKi0qYW91dCosIHRpYzMwLSotKmNvZmYqKTogTmV3IHRhcmdldHMuCi0JKiBlbXVscGFyYW1zL3RpYzMwYW91dC5zaDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL3RpYzMwY29mZi5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2M6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IEFkZCBldGljMzBhb3V0Lm8gYW5kCi0JZXRpYzMwY29mZi5vLgotCShldGljMzBhb3V0LmMsIGV0aWMzMGNvZmYuYyk6IE5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBGZWIgIDIgMTQ6MTA6NTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogQ29ycmVjdCBIT1NUSU5HX0NSVDAgaW4gYWxwaGEqLSotbGludXgqIGNhc2UgdG8KLQlhY2NlcHQgZWl0aGVyIGxkLnNvIG9yIGxkLWxpbnV4LnNvLgotCi1GcmkgSmFuIDMwIDE5OjE2OjI4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtICh7Q0MsQ1hYfV9GT1JfVEFSR0VUKTogQ2hhbmdlIHByb2dyYW1fdHJhbnNmb3JtX25hbWUKLQl0byB0cmFuc2Zvcm0uCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotRnJpIEphbiAzMCAxOToxNToxNyAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IFB1dCAuZHluc2JzcyBpbiAuc2Jzcy4KLQotRnJpIEphbiAzMCAxMTo0Mzo0OSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBNYWtlZmlsZS5hbSAoZWVsZjMyYnNtaXAuYywgZWVsZjMybHNtaXAuYyk6IE5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBKYW4gMjkgMTY6MDQ6MjEgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGxkZmlsZS5jIChzbGFzaCk6IFNldCB0byBiYWNrc2xhc2ggaWYgX1dJTjMyIGJ1dCBub3QKLQlfX0NZR1dJTjMyX18uCi0JKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoKTogSWYgX19NU0RPU19fIG9yIF9XSU4zMiwgYWNjZXB0IGEKLQlsZWFkaW5nIGJhY2tzbGFzaCBvciBhIGxlYWRpbmcgeDogYXMgYW4gYWJzb2x1dGUgcGF0aC4KLQkobGRmaWxlX2ZpbmRfY29tbWFuZF9maWxlKTogVXNlIHNsYXNoIHJhdGhlciB0aGFuIC8gd2hlbgotCWdlbmVyYXRpbmcgbmFtZSB0byB0cnkuCi0JKiBsZXhzdXAuYyAoUEFUSF9TRVBBUkFUT1IpOiBEZWZpbmUuCi0JKHNldF9kZWZhdWx0X2Rpcmxpc3QpOiBVc2UgUEFUSF9TRVBBUkFUT1IgcmF0aGVyIHRoYW4gJzonLgotCi1XZWQgSmFuIDI4IDE0OjA2OjMwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggKEVMRlNJWkUpOiA2NAotCShURVhUX1NUQVJUX0FERFIpOiBSb3VuZCBvZmYsIHNpbmNlIFNJWkVPRl9IRUFERVJTIGlzIGFkZGVkIGxhdGVyLgotCShEQVRBX1BMVCk6IE5lZWRlZCBieSB2OSBhYmkuCi0KLVdlZCBKYW4gMjggMTY6Mzc6MjcgMTk5OCAgSi5KLiB2YW4gZGVyIEhlaWpkZW4gIDxKLkoudmFuZGVySGVpamRlbkBzdHVkZW50LnV0d2VudGUubmw+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKTogTmV3IGVudHJ5LgotCi1XZWQgSmFuIDI4IDE1OjUxOjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBPbmx5IGluY2x1ZGUgbGlua29uY2Ugc2VjdGlvbnMgaW4gZmluYWwKLQlzZWN0aW9ucyB3aGVuIHJlbG9jYXRpbmcuCi0KLVdlZCBKYW4gMjggMTQ6MTA6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogQWRkIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHR5cGVzIG9mCi0JaW5mb3JtYXRpb24gaW5jbHVkZWQgaW4gYSBsaW5rIG1hcC4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IE1lbnRpb24gTERFTVVMQVRJT04gaW4gZGVzY3JpcHRpb24gb2YgLW0uCi0JKEVudmlyb25tZW50KTogTWVudGlvbiBMREVNVUxBVElPTi4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IENsYXJpZnkgLS1leHBvcnQtZHluYW1pYyBhIGJpdC4KLQotVGh1IEphbiAyMiAxNjowNzoyMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZGxleC5sICg8U0NSSVBUPntXSUxEQ0hBUn0qKTogVGFrZSBjYXJlIGZvciB0aGUgY29tbWVudHMgdGhpcwotCXBhdHRlcm4gY291bGQgbWF0Y2guCi0KLVdlZCBKYW4gMjEgMjI6MjY6NDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyk6IFdoZW4gZG9pbmcKLQlhIHJlbG9jYXRlYWJsZSBsaW5rLCBzZXQgdGhlIGltYWdlIGJhc2UgdG8gMCwgYW5kIGRvbid0IGRlZmluZSB0aGUKLQl2YXJpb3VzIHN5bWJvbHMuCi0JKiBlbXVscGFyYW1zL2kzODZwZS5zaCAoUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQpOiBEZWZpbmUuCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogU3dhcCB0aGUgLmRhdGEgYW5kIC5ic3Mgc2VjdGlvbnMgc28gdGhhdAotCS5kYXRhIGNvbWVzIGZpcnN0LiAgSWYgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdXNlCi0JUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQgaWYgaXQgaXMgZGVmaW5lZCwgYW5kIHN0YXJ0IHRoZQotCXNlY3Rpb25zIGF0IDAsIGFuZCBkb24ndCBkZWZpbmUgYW55IHN5bWJvbHMuCi0KLQkqIGxkbGFuZy5jIChsYW5nX21lbW9yeV9kZWZhdWx0KTogQ29ycmVjdCBwYXJlbnRoaXNpemF0aW9uIG9mCi0JZXhwcmVzc2lvbi4KLQotV2VkIEphbiAyMSAyMToyMDozMiAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogRG9uJ3QgaW5jbHVkZSBzeXMvdHlwZXMuaCBhbmQgc3lzL3N0YXQuaAotCWhlcmU7IHRoZXkgYXJlIGluY2x1ZGVkIGFscmVhZHkgdmlhIHN5c2RlcC5oLgotCi1UdWUgSmFuICA2IDEzOjQwOjAyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2k5NjAuc2M6IERvbid0IGV4cGxpY2l0bHkgc2V0IC5kYXRhIGFuZCAuYnNzIHN0YXJ0LgotCi1GcmkgSmFuICAyIDIwOjE1OjM3IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAoYXR0cmlidXRlc19vcHQpOiBQYXNzIHJlZ2lvbiBwb2ludGVyIHRvCi0JbGFuZ19zZXRfZmxhZ3MsIG5vdCAmcmVnaW9uLT5mbGFncy4KLQotCSogbGRsYW5nLmMgKGxhbmdfbWVtb3J5X2RlZmF1bHQpOiBOZXcgZnVuY3Rpb24gdG8gZmlndXJlIG91dCBhCi0JZGVmYXVsdCBtZW1vcnkgcmVnaW9uIGZvciBhIHNlY3Rpb24gaWYgaXQgd2FzIG5vdCBzcGVjaWZpZWQuCi0JKGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXApOiBaZXJvIGZsYWdzLCBub3RfZmxhZ3MgZmllbGQuCi0JKGxhbmdfbWFweyxfZmxhZ3N9KTogUHJpbnQgYXR0cmlidXRlIGZsYWdzIGluIG1lbW9yeSBtYXAuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENhbGwgbGFuZ19tZW1vcnlfZGVmYXVsdCB0byBnZXQgZGVmYXVsdAotCW1lbW9yeSByZWdpb24uCi0JKGxhbmdfc2V0X2ZsYWdzKTogSW1wbGVtZW50IGF0dHJpYnV0ZSBmbGFncyBmb3IgcmVhbC4gIFRha2UgbmV3Ci0JYXJndW1lbnQgdG8gZ2l2ZSB0aGUgZmxhZ3Mgd2UgYXJlIHRvIHNraXAgZm9yIHRoaXMgcmVnaW9uLgotCi0JKiBsZGxhbmcuaCAobWVtb3J5X3JlZ2lvbl9zdHJ1Y3QpOiBBZGQgbm90X2ZsYWdzIGZpZWxkLCBtYWtlIGJvdGgKLQlmbGFncyBmaWVsZHMgZmxhZ3dvcmQgdHlwZS4KLQkobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZSk6IE1ha2UgZmxhZ3MgZmllbGQgZmxhZ3dvcmQgdHlwZS4KLQkobGFuZ19zZXRfZmxhZ3MpOiBVcGRhdGUgcHJvdG90eXBlIHRvIG1hdGNoIG5ldyBjYWxsaW5nIHNlcXVlbmNlLgotCShsYW5nX21lbW9yeV9yZWdpb25fZGVmYXVsdCk6IEFkZCBwcm90b3R5cGUuCi0KLQkqIGVtdWxwYXJhbXMvZDMwdntfZSxfbyxlbGZ9LnNoICh7VEVYVCxEQVRBLEVNRU19X0RFRl9TRUNUSU9OKToKLQlEZWZpbmUgd2hldGhlciBvciBub3QgdGhlIHJlZ2lvbiBnZXRzIGRlZmF1bHQgc2VjdGlvbnMsIGFuZCBpZiBzbywKLQl3aGF0IHNlY3Rpb25zLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjIChNRU1PUlkpOiBTZXQgdXAgd2hpY2ggb2YgdGhlIHJlZ2lvbnMgZ2V0Ci0JZGVmYXVsdCBzZWN0aW9ucy4KLQotVGh1IEphbiAgMSAyMjo1ODowNCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAoLmVoX2ZyYW1lKTogTGluayBpbnRvIHRoZSBkYXRhIHNlY3Rpb24uCi0KLVRodSBKYW4gIDEgMTg6MDQ6NTEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IEZpeCB0eXBvLgotCSogc2NyaXB0dGVtcGwvaDgzMDBzLnNjOiBMaWtld2lzZS4KLQotU3VuIERlYyAyMSAxMjo1MTo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZXhwLmMgKGZvbGRfbmFtZSk6IERvbid0IGNyYXNoIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhCi0Jc2VjdGlvbiB3aXRoIG5vIG91dHB1dCBzZWN0aW9uLCBzdWNoIGFzIGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4KLQotV2VkIERlYyAxNyAxMjoxNDoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogS2VlcCB0cmFjayBvZiB3aGVyZSB3ZSBhcmUgaW4gdGhlIG9wdGlvbgotCXBhcnNpbmcgYmVmb3JlIGNhbGxpbmcgbGRlbXVsX3BhcnNlX2FyZ3MsIHNvIHRoYXQgd2UgZG9uJ3QgY2FsbCBpdAotCW11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGFyZ3VtZW50IGFuZCBjb25mdXNlIHRoZSBnZXRvcHQKLQlpbnRlcm5hbHMuCi0KLVRodSBEZWMgMTEgMDk6MDA6MTUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGQzMHYtZWxmLSopOiBSZW5hbWUgZDMwdmVsZl9lIHRvIGQzMHZfZSBhbmQKLQlkMzB2ZWxmX28gdG8gZDMwdl9vIHRvIHdvcmsgaW4gRE9TIGVudmlyb25tZW50cy4KLQkqIE1ha2VmaWxlLnthbSxpbn06IERpdHRvLgotCi0JKiBlbXVscGFyYW1zL2QzMHZfe28sZX06IFJlbmFtZSBmcm9tIGQzMHZlbGZfe28sZX0uCi0JKiBlbXVscGFyYW1zL2QzMHZlbGZfe28sZX06IERlbGV0ZWQuCi0KLVdlZCBEZWMgMTAgMTc6NDA6MDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogQWRkIGdsdWUgc2VjdGlvbnMgKGNvZGUgdGFrZW4gZnJvbSBBcm0KLQlicmFuY2gpLgotCi0JKiBlbXVscGFyYW1zL2FybWNvZmYuc2ggKFRFTVBMQVRFX05BTUUpOiBTZXQgdG8gYXJtY29mZi4KLQotCSogZW11bHRlbXBsL2FybWNvZmYuZW06IE5ldyBmaWxlLCBpbXBvcnRlZCBmcm9tIEFybSBicmFuY2guCi0KLVdlZCBEZWMgMTAgMTQ6MTA6NDQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IEFkZCAucmVsIGFuZCAucmVsYSBzZWN0aW9ucyBmb3IgYWxsCi0JZGVmaW5lZCBzZWN0aW9ucy4gIFNldCB1cCBfX3tELEN9VE9SX3tMSVNULEVORH1fXy4gIEFkZCBvbmNoaXAgYW5kCi0JZXh0ZXJuYWwgbWVtb3J5IHNlY3Rpb25zIGZvciByb2RhdGEuICBEZWxldGUgLnN0cmluZywgLnJvZGF0YTEsCi0JYW5kIC5kYXRhMSBzZWN0aW9ucy4KLQotVHVlIERlYyAgOSAxNToyODoxNyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBPY3QgMjMgY2hhbmdlcyB0byBNYWtlZmlsZS5pbiBoZXJlLgotCi0JKiBNYWtlZmlsZS57YW0saW59OiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWQxMHZlbGYuby4KLQotCSogTWFrZWZpbGUue2FtLGlufTogKEFMTF9FTVVMQVRJT05TKTogQWRkIGV0aWM4MGNvZmYuby4KLQotCSogTWFrZWZpbGUue2FtLGlufTogKEFMTF9FTVVMQVRJT05TKTogQWRkIGVkMzB2ZWxmeyxfZSxfb30uby4KLQkoZWQzMHZlbGZfZS5jKTogTGlrZSBkMzB2ZWxmLCBleGNlcHQgLnRleHQvLmRhdGEvZXRjIGFsd2F5cyBnbyBpbgotCWV4dGVybmFsIG1lbW9yeS4KLQkoZWQzMHZlbGZfby5jKTogTGlrZSBkMzB2ZWxmLCBleGNlcHQgLnRleHQvLmRhdGEvZXRjIGFsd2F5cyBnbyBpbgotCW9uY2hpcCBtZW1vcnkuCi0KLQkqIGVtdWxwYXJhbXMvZDMwdmVsZi5zaCAoU1RBQ0tfU1RBUlRfQUREUik6IFRvcCBvZiBkZWZhdWx0Ci0Jc3RhY2suCi0JKHtURVhULERBVEEsRU1FTX1fU0laRSk6IFNpemVzIG9mIHRoZSAzIG1lbW9yeSBhcmVhcy4KLQkoe1RFWFQsREFUQSxCU1N9X01FTU9SWSk6IFdoaWNoIG1lbW9yeSByZWdpb24gLnRleHQsIC5kYXRhLCBhbmQKLQkuYnNzIHNob3VsZCBnbyBpbi4KLQotCSogZW11bHBhcmFtcy9kMzB2ZWxmX3tlLG99LnNoOiBOZXcgZmlsZXMgdG8gYmUgZXhwbGljaXQgd2hldGhlcgotCS50ZXh0LCAuZGF0YSwgZXRjIGdvIGluIGV4dGVybmFsIG1lbW9yeSBvciBvbmNoaXAgbWVtb3J5LgotCi0JKiBjb25maWd1cmUudGd0IChkMzB2LSotKmV4dCopOiBOZXcgY29uZmlndXJhdGlvbiB0byBkZWZhdWx0Ci0JLnRleHQsIC5kYXRhLCBldGMuIGluIGV4dGVybmFsIG1lbW9yeS4KLQkoZDMwdi0qLSpvbmNoaXAqKTogTmV3IGNvbmZpZ3VyYXRpb24gdG8gZGVmYXVsdCAudGV4dCwgLmRhdGEsCi0JZXRjLiBpbiBvbmNoaXAgbWVtb3J5LgotCShkMzB2LSotKik6IEFkZCBkMzB2ZWxmX3tlLG99IGVtdWxhdGlvbnMuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IEFsbG93IC50ZXh0LCAuZGF0YSwgLmJzcyB0byBiZSBwdXQgaW4KLQllaXRoZXIgdGhlIG9uY2hpcCB0ZXh0L2RhdGEgYXJlYXMgb3IgdGhlIGV4dGVybmFsIG1lbW9yeSBhcmVhLgotCShNRU1PUlkpOiBHZXQgc2l6ZXMgZnJvbSBkMzB2ZWxmLnNoLgotCSguZXtkYXRhLHRleHQsYnNzfSk6IFB1dCBzZWN0aW9ucyBpbiB0aGUgZXh0ZXJuYWwgbWVtb3J5IHJlZ2lvbi4KLQkoLnN0ZXh0KTogUHV0IHNlY3Rpb24gaW4gdGhlIG9uY2hpcCB0ZXh0IHJlZ2lvbi4KLQkoLnN7ZGF0YSxic3N9KTogUHV0IHNlY3Rpb25zIGluIHRoZSBvbmNoaXAgZGF0YSByZWdpb24uCi0JKF9fc3RhY2spOiBBc3NpZ24gZnJvbSAke1NUQUNLX1NUQVJUX0FERFJ9LgotCSgudGV4dCk6IFB1dCBpbiAke1RFWFRfTUVNT1JZfSBtZW1vcnkgcmVnaW9uLgotCSguZGF0YXssMX0vLnN0cmluZ3MvLnJvZGF0YXssMX0pOiBQdXQgaW4gJHtEQVRBX01FTU9SWX0gbWVtb3J5Ci0JcmVnaW9uLgotCSguYnNzKTogUHV0IGluICR7QlNTX01FTU9SWX0gbWVtb3J5IHJlZ2lvbi4KLQotVHVlIERlYyAgMiAxMDoxNDo0NyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkIHN1cHBvcnQgZm9yIFRodW1iIHRhcmdldC4KLQotU2F0IE5vdiAyMiAxNToyMzoxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGV4Lmw6IERvbid0IGRlZmluZSBoZXhfbW9kZS4gIENvcnJlY3QgbnVtYmVyIHJlZ2V4cCB0byBub3QKLQlhY2NlcHQgaGV4IGRpZ2l0cyB3aXRob3V0IGEgbGVhZGluZyAkIG9yIDB4LiAgSGFuZGxlIGxlYWRpbmcgJAotCWNvcnJlY3RseS4gIFBhc3MgMCByYXRoZXIgdGhhbiBoZXhfbW9kZSB0byBiZmRfc2Nhbl92bWEuCi0JKiBsZGxleC5oIChoZXhfbW9kZSk6IERvbid0IGRlY2xhcmUuCi0KLVN1biBOb3YgMTYgMjA6MTY6NDUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZDMwdmVsZi5zaCAoe0RBVEEsRU1FTX1fU1RBUlRfQUREUik6IERlZmluZSBhcyBzdGFydAotCW9mIGludGVybmFsIGRhdGEgYXJlYSBhbmQgZXh0ZXJuYWwgbWVtb3J5IG9uIGNoaXAuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IERlZmluZSBhIE1FTU9SWSByZWdpb24gdGhhdCBkZXNjcmliZXMKLQl0aGUgMyByZWdpb25zIG9mIG1lbW9yeSBvbiB0aGUgY2hpcC4gIFB1dCAudGV4dC8uaW5pdC8uZmluaSBpbnRvCi0JdGhlIHRleHQgbWVtb3J5IHJlZ2lvbiwgcHV0IG90aGVyIHNlZ21lbnRzIGludG8gdGhlIGRhdGEgbWVtb3J5Ci0JcmVnaW9uLiAgQWRkIG1vcmUgb2YgdGhlIHN0YW5kYXJkIGVsZiBzZWN0aW9ucy4gIERlZmF1bHQgX19zdGFjawotCXRvIGJlIDB4MjAwMDgwMDAsIHdoaWNoIGlzIDEgYnl0ZSBiZXlvbmQgZW5kIG9mIHRoZSBpbnRlcm5hbCBkYXRhCi0JcmVnaW9uLgotCi1UaHUgTm92IDEzIDEzOjQ1OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IE1ha2UgRnJlZUJTRCBhIGkzODZic2QKLSAJdmFyaWFudC4KLQotU3VuIE5vdiAgMiAxNDo1MTozNiAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWd1cmUuaG9zdCAoYWxwaGEqLSotbGludXgqKTogQ29ycmVjdCBIT1NUSU5HX0NSVDAuICBTZXQKLQlIT1NUSU5HX0xJQlMuCi0KLVRodSBPY3QgMzAgMTI6MjU6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgd2Fybl9taXNtYXRjaCBmaWVsZC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSB3YXJuX21pc21hdGNoIGZpZWxkLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1uby13YXJuLW1pc21hdGNoIG9wdGlvbi4KLQkqIGxkbGFuZy5jIChpZ25vcmVfYmZkX2Vycm9yKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobGFuZ19jaGVjayk6IElmIHdhcm5fbWlzbWF0Y2ggaXMgZmFsc2UsIGRvbid0IHdhcm4gYWJvdXQKLQltaXNtYXRjaGVkIGlucHV0IGZpbGVzLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgbmV3IG9wdGlvbi4KLQotVGh1IE9jdCAyMyAxNDozODoxOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBSZW5hbWUgbGlua2VyIHN5bWJvbCAnX3N0YWNrJyB0byAnX19zdGFjaycKLQl0byBhdm9pZCBjb25mbGljdHMgd2l0aCBDIGNvZGUgd2hpY2ggaXMgZGVmaW5pbmcgYSB2YXJpYWJsZSBjYWxsZWQKLQknc3RhY2snLgotCi1UaHUgT2N0IDIzIDAwOjU3OjQ1IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBNb3ZlIGVlbGY2NF9zcGFyYy5vIC4uLgotCShBTExfNjRfRU1VTEFUSU9OUyk6IC4uLiBoZXJlLgotCShlZWxmNjRfc3BhcmMuYyk6IFRlbXBsYXRlIHNob3VsZCBiZSBlbGYzMiBub3QgZ2VuZXJpYy4KLQkqIGVtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggKFRFTVBMQVRFX05BTUUpOiBOZXcgZGVmaW5pdGlvbi4KLQotVGh1IE9jdCAyMyAwMDo0NDoyMCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndDogQWRkIHNwYXJjNjQtKi1saW51eCouCi0JKiBlbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQsIE5PUCk6IE5ldy4KLQotV2VkIE9jdCAyMiAxMToyOToyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBQdXQgLmVoX2ZyYW1lIGluIC5yZGF0YS4KLQotRnJpIE9jdCAxNyAwMDowMDoxMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUpOiBPbmx5IGNoZWNrIGdsb2JhbHM8PT5sb2NhbHMsCi0Jc2luY2Ugd2UgbmVlZCB0byBiZSBhYmxlIHRvIGV4cG9ydCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUKLQlzeW1ib2wuCi0KLVdlZCBPY3QgMTUgMTQ6NTI6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogUHV0IC5zdGFiIGFuZCAuc3RhYnN0ciBzZWN0aW9ucyBhdCBlbmQuCi0KLVdlZCBPY3QgIDggMTI6Mzc6MDUgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCwgY29uZmlndXJlLmhvc3Q6IENoYW5nZSBhbHBoYS0qLSogdG8gYWxwaGEqLSotKjsKLQljb25maWcuZ3Vlc3Mgbm93IHJlY29nbml6ZXMgYWxwaGFldjUgZXRjLgotCi1GcmkgT2N0ICAzIDE0OjIzOjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IERvbid0IHRyZWF0Ci0JLXMgYW5kIC11IGFzIC1zdGF0aWMgYW5kIC11bml4LgotCi1UaHUgT2N0ICAyIDE4OjQwOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IFJld3JpdGUgZmxhZyBoYW5kbGluZyBmb3IgY2xhcml0eS4gIElmIHdlCi0gCWFyZSBub3QgYWRkaW5nIHRoZSBmaXJzdCBpbnB1dCBzZWN0aW9uLCBhbmQgU0VDX1JFQURPTkxZIGlzIGNsZWFyCi0gCW9uIHRoZSBvdXRwdXQgc2VjdGlvbiwgdGhlbiBkb24ndCBjb3B5IGl0IGZyb20gdGhlIGlucHV0IHNlY3Rpb24uCi0gIAlJZiBTRUNfUkVBRE9OTFkgaXMgbm90IHNldCBvbiB0aGUgaW5wdXQgc2VjdGlvbiwgdGhlbiBjbGVhciBpdCBvbgotIAl0aGUgb3V0cHV0IHNlY3Rpb24uCi0KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMqLXNnaS1pcml4WzU2XSopOiBVc2UgZWxmMzJic21pcCByYXRoZXIgdGhhbgotCWVsZjMyYm1pcC4KLQkobWlwcyplbC0qLWxpbnV4Kik6IENoYW5nZSBlbGYzMmxtaXAgdG8gZWxmMzJsc21pcCBhbmQgZWxmMzJibWlwCi0JdG8gZWxmMzJic21pcC4KLQkobWlwcyotKi1saW51eCopOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJic21pcC5zaDogTmV3IGZpbGU7IGp1c3QgbGlrZSBlbGYzMmJtaXAuc2gsIGJ1dAotCXNldHRpbmcgRU5UUlkgdG8gX19zdGFydC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsc21pcC5zaDogTmV3IGZpbGU7IGp1c3QgbGlrZSBlbGYzMmxtaXAuc2gsIGJ1dAotCXNldHRpbmcgRU5UUlkgdG8gX19zdGFydC4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWx3YXlzIHNldCBFTlRSWSB0byBfc3RhcnQgaWYgaXQgd2FzIG5vdAotCWFscmVhZHkgc2V0LgotCi1XZWQgT2N0ICAxIDE2OjQxOjAwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvdjg1MC5zaCAoUk9aREFUQV9TVEFSVF9BRERSLCBST1NEQVRBX1NUQVJUX0FERFIpOiBOZXcKLQlWYXJpYWJsZXMuCi0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IE1vdmUgcmVhZCBvbmx5IGFyZWFzIG91dCBvZiB6ZXJvIGFuZCBzbWFsbAotCWRhdGEgc2VjdGlvbnMgYW5kIGludG8gdGhlaXIgb3duIHNlY3Rpb25zLgotCi1XZWQgU2VwIDI0IDE2OjU5OjE1IDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLnRndCAoc2gqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBzaC0qLWVsZiouCi0KLVdlZCBTZXAgMjQgMTE6MzM6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChTZWN0aW9uIE9wdGlvbnMpOiBJbXByb3ZlIGRvY3VtZW50YXRpb24gb2YgTk9MT0FECi0JZGlyZWN0aXZlLgotCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBTZXAgMjIgMTc6MjQ6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogUmV2ZXJ0IHBhdGNoIG9mIFNlcHRlbWJlciAzLgotCi1XZWQgU2VwIDE3IDE2OjQ1OjM0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtLCBNYWtlZmlsZS5pbjogQWRkIHJ1bGUgZm9yIGV2ODUwLmMKLQkqIGNvbmZpZ3VyZS50Z3QgKHRhcmdfZXh0cmFfZW11bHMpOiBBZGQgdjg1MCB0YXJnZXQuCi0KLVdlZCBTZXAgMTcgMTY6NDM6MzkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy92ODUwLnNoIChDQUxMX1RBQkxFX1NUQVJUX0FERFIpOiBOZXcgZW50cnkuCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBBZGQgY2FsbCB0YWJsZSBkYXRhIGFyZWEKLQotTW9uIFNlcCAxNSAxMToyOToxMyAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1lcmdlIGNoYW5nZSBmcm9tIE1hcnRpbiBIdW50OgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBQdXQgLnJvZGF0YSBpbiB0aGUgLnRleHQgc2VjdGlvbi4KLQotVHVlIFNlcCAgOSAwNzo0OTo1NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXApOiBSZW1vdmUgZXh0cmFuZW91cwotCWluaXRpYWxpemF0aW9uIG9mIHAuCi0KLVRodSBTZXAgIDQgMDk6MDM6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogSW4KLQlleHByZXNzaW9uIHByb2R1Y2VkIGZvciAtYnBUIGFuZCAtYnBEIG9wdGlvbnMsIGFsaWduIHRvIGEgMzIgYnl0ZQotCWJvdW5kYXJ5IHJhdGhlciB0aGFuIGFuIDggYnl0ZSBib3VuZGFyeS4KLQkqIHNjcmlwdHRlbXBsL2FpeC5zYzogUHV0IC50b2Nic3MgYXQgc3RhcnQgb2YgLmJzcyBzZWN0aW9uLgotCi0JKiBsZG1pc2MuaCwgbGRtaXNjLmMsIGxkY3JlZi5jOiBSZW5hbWUgZmluZm8gdG8gbGZpbmZvLCB0byBhdm9pZAotCWZ1bmN0aW9uIG5hbWUgY29uZmxpY3Qgd2l0aCBBSVggNC4yIHVuaXN0ZC5oIGhlYWRlciBmaWxlLgotCi1XZWQgU2VwICAzIDE1OjEyOjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IENsZWFyIFNFQ19IQVNfQ09OVEVOVFMgZnJvbSBhCi0Jbm9sb2FkX3NlY3Rpb24uCi0KLUZyaSBBdWcgMjkgMDA6MzI6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGRfbmV3X0RFUEVOREVOQ0lFUyk6IFJlbW92ZSBATEVYTElCQC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgQXVnIDI4IDEwOjEyOjEwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGFyYy0qLWVsZiopOiBSZWNvZ25pemUuCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFyY2VsZi5vLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0JKiBlbXVscGFyYW1zL2FyY2VsZi5zaDogTmV3IGZpbGUuCi0KLVdlZCBBdWcgMjAgMTE6MTQ6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAod2lsZGNhcmRwKTogRG9uJ3QgbGV0IGEgYmFja3NsYXNoIGJ5IGl0c2VsZiBjYXVzZSBhCi0JcGF0dGVybiB0byBiZSB0cmVhdGVkIGFzIGEgd2lsZGNhcmQgcGF0dGVybi4KLQotCSogbGRncmFtLnkgKGF0eXBlKTogQWNjZXB0IHBhcmVudGhlc2VzIHdpdGggbm8gdHlwZS4KLQotCSogbGQudGV4aW5mbyAoU2VjdGlvbiBEZWZpbml0aW9uKTogQ2xhcmlmeSB1c2Ugb2Ygd2hpdGVzcGFjZS4KLQkoU2VjdGlvbiBQbGFjZW1lbnQpOiBMaWtld2lzZS4KLQotTW9uIEF1ZyAxOCAxMToxMjowMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotTW9uIEF1ZyAxOCAxMToxMjowMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotU2F0IEF1ZyAgOSAwMDo0MjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsZC5pbmZvKTogQ2hhbmdlIGRlcGVuZGVuY3kgZnJvbQotCSQoQkZERElSKS9kb2MvYmZkc3VtbS50ZXhpIHRvIGJmZHN1bW0udGV4aS4KLQkobGQuZHZpKTogTGlrZXdpc2UuCi0JKGJmZHN1bW0udGV4aSk6IE5ldyB0YXJnZXQuCi0JKENMRUFORklMRVMpOiBBZGQgYmZkc3VtbS50ZXhpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIE1ha2VmaWxlLmluLgotCSogYWNpbmNsdWRlLm00OiBOZXcgZmlsZSwgZnJvbSBvbGQgYWNsb2NhbC5tNC4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9JTklUX0FVVE9NQUtFIGFuZCBBTV9QUk9HX0xJQlRPT0wuICBSZW1vdmUKLQlzaGFyZWQgbGlicmFyeSBoYW5kbGluZzsgbm93IGhhbmRsZWQgYnkgbGlidG9vbC4gIFJlcGxhY2UKLQlBQ19DT05GSUdfSEVBREVSIHdpdGggQU1fQ09ORklHX0hFQURFUi4gIENhbGwgQUNfUFJPR19ZQUNDLAotCUFDX1BST0dfTEVYLCBhbmQgQUNfREVDTF9ZWVRFWFQuICBDYWxsIEFNX01BSU5UQUlORVJfTU9ERSwKLQlBTV9DWUdXSU4zMiwgYW5kIEFNX0VYRUVYVC4gIERvbid0IGNhbGwgQ1lfQ1lHV0lOMzIgb3IgQ1lfRVhFRVhULgotCSogY29uZmlndXJlLmhvc3Q6IERvbid0IHNldCBITERGTEFHUywgSExERU5WLCBvciBSUEFUSF9FTlZWQVIuCi0JKiBhY2NvbmZpZy5oOiBNZW50aW9uIFBBQ0tBR0UgYW5kIFZFUlNJT04uCi0JKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KLQkqIGxkdmVyLmMgKGxkX3Byb2dyYW1fdmVyc2lvbik6IFNldCBsZF9wcm9ncmFtX3ZlcnNpb24gZnJvbQotCVZFUlNJT04uCi0JKiBsZGdyYW0ueSwgbGRsZXgubDogUmVwbGFjZSBWRVJTSU9OIHdpdGggVkVSU0lPTksuCi0JKiBNYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBOb3cgYnVpbHQgd2l0aCBhY2xvY2FsLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLU1vbiBKdWwgMjggMTk6MDQ6NTAgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogVXNlIENZR1dJTiBhbmQgRVhFRVhUIGF1dG9jb25mIG1hY3JvIHRvIGxvb2sgZm9yCi0gICAgICAgIHdpbjMyIGRlcGVuZGVuY2llcy4KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4xMi4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogQWRkICQoRVhFRVhUKSB0byBleGVjdXRhYmxlLgotCi1UdWUgSnVsIDIyIDE4OjUwOjM4IDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KLQotCSogZW11bHBhcmFtcy9pMzg2Z28zMi5zaCAoT1VUUFVUX0ZPUk1BVCk6IFNldCB0byAiY29mZi1nbzMyIi4KLQkoU0VHTUVOVF9TSVpFKTogU2V0IHRvIDB4MjAwLgotCSogc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2M6IFJld3JpdGUuCi0JKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKik6IE5ldyB0YXJnZXQuCi0KLU1vbiBKdWwgIDcgMTI6Mzk6NDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBNYW5mcmVkIEhvbGxzdGVpbiA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT46Ci0JKiBjb25maWd1cmUuaG9zdCAoaVszNDU2XTg2LSotbGludXgqbGliYzEqKTogUmVuYW1lZCBmcm9tCi0JaVszNDU2XTg2LSotbGludXgqLgotCShpWzM0NTZdODYtKi1saW51eCopOiBOZXcgaG9zdC4KLQotVGh1IEp1biAyNiAxMzo1NDowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBQdXQgLnJzcmMgYWZ0ZXIgLnJlbG9jLiAgUHV0IGlucHV0IC5yc3JjCi0Jc2VjdGlvbnMgaW4gdGhlIG91dHB1dCAucnNyYyBzZWN0aW9uLgotCi1XZWQgSnVuIDI1IDEyOjQ4OjQxIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWd1cmUuaG9zdCAobTY4Ki0qLWxpbnV4KmxpYmMxKik6IFJlbmFtZWQgZnJvbQotCWBtNjgqLSotbGludXgqJy4KLQkobTY4Ki0qLWxpbnV4Kik6IE5ldyBjb25maWd1cmF0aW9uIGZvciB1c2Ugd2l0aCBHTlUgbGliYyAyLgotCi1Nb24gSnVuIDE2IDE5OjE4OjIxIDE5OTcgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogQ29ycmVjdCAucmVsYS5zZGF0YSBlbnRyaWVzLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IFB1dCB0aGUgUExUIGJldHdlZW4gdGhlIHNtYWxsIGFuZCBsYXJnZQotCUJTUyBzZWdtZW50cy4KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2ggKFRFWFRfU1RBUlRfQUREUik6IFRoZSBBQkkgc2F5cyBgQQotCXByb2dyYW0gYmFzZSBvZiAweDAyMDAwMDAwIGlzIHJlY29tbWVuZGVkLi4uJyBiZWNhdXNlIG90aGVyd2lzZQotCXNoYXJlZCBsaWJyYXJpZXMgYXJlIGxlc3MgZWZmaWNpZW50LiAgV2UgdXNlIDB4MDE4MDAwMDAgYmVjYXVzZQotCW90aGVyd2lzZSBpdCdzIGltcG9zc2libGUgdG8gYnJhbmNoIHRvIGxvY2F0aW9uIDAsIGZvciBpbnN0YW5jZSBpZgotCXlvdSBoYXZlIGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KLQotTW9uIEp1biAxNiAxMjo0OTozNiAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBsZGxhbmcuYyAobGFuZ19wbGFjZV91bmRlZmluZWRzKTogQWRkIFxuIGluIGVpbmZvIGNhbGwuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogbGRsZXgubDogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUpOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9taXBzZWNvZmYuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOgotCUxpa2V3aXNlLgotCShjaGVja19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9hbGxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8kJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCUxpa2V3aXNlLgotCSogbXB3LWVwcGNtYWMuYyAoZ2xkcHBjbWFjb3NfcmVhZF9maWxlKTogTGlrZXdpc2UuCi0JKiBtcHctaWR0bWlwcy5jIChnbGRtaXBzaWR0X2FmdGVyX29wZW4pOiBMaWtld2lzZS4KLQkoY2hlY2tfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZ2xkbWlwc2lkdF9hZnRlcl9hbGxvY2F0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGxkZW11bC5jIChsZGVtdWxfY2hvb3NlX21vZGUpOiBSZW1vdmUgdW51c2VkIGVpbmZvIGFyZ3VtZW50LgotCi1GcmkgSnVuICA2IDIzOjQ3OjQyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IEFkZCB6ZXJvZXMgYWZ0ZXIgLmlkYXRhJDMgdG8gbWFyayB0aGUgZW5kIG9mCi0JdGhlIGltcG9ydCBsaXN0LgotCi1UaHUgTWF5IDI5IDEzOjEzOjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogRG9uJ3QKLQljcmFzaCBpZiBhbiBvdXRwdXQgc2VjdGlvbiBoYXMgbm8gQkZEIHNlY3Rpb24uCi0KLUZyaSBNYXkgMjMgMTU6MjM6MjUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChsZF9vcHRpb25zKTogQWRkIGVudHJ5IGZvciB0aGUgbmV3ICJ0YXNrLWxpbmsiIG9wdGlvbi4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSB0aGUgInRhc2stbGluayIgb3B0aW9uLgotCShPUFRJT05fVEFTS19MSU5LKTogQWRkIGRlZmluZS4KLQotV2VkIE1heSAyMSAxNzo0NDoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogQ29ycmVjdCBjaGVjayBvZiBmY2xvc2UgcmV0dXJuIHZhbHVlIHdoZW4KLQloYW5kbGluZyAtLWZvcmNlLWV4ZS1zdWZmaXguCi0KLVRodSBNYXkgMTUgMTE6MzU6MjkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2spOiBBZGQgdGVzdCBvZiB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlCi0JY2FsbCB0byBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSgpLgotCi1Nb24gTWF5IDEyIDIzOjIyOjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogUmVtb3ZlLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBTZXQgRU5UUlkgYmFzZWQgb24gdGFyZ2V0LiAgUGVybWl0Ci0JVEVYVF9EWU5BTUlDIHRvIGNvbnRyb2wgLmR5bmFtaWMgc2VnbWVudC4gIFBlcm1pdAotCVNITElCX1RFWFRfU1RBUlRfQUREUiB0byBzZXQgc3RhcnQgb2Ygc2hhcmVkIG9iamVjdC4gIFN1cHBvcnQKLQlJTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TLiAgUHV0IC5zdHViIGluIC50ZXh0LiAgT25seSBwdXQKLQkuZ251LmxpbmtvbmNlLnQqIGluIC50ZXh0IHdoZW4gcmVsb2NhdGluZy4gIFN1cHBvcnQKLQlPVEhFUl9URVhUX1NFQ1RJT05TLiAgU3VwcG9ydCBTSExJQl9EQVRBX0FERFIgYXMgd2VsbCBhcwotCURBVEFfQUREUi4gIFN1cHBvcnQgT1RIRVJfR09UX1NZTUJPTFMgYW5kIE9USEVSX0dPVF9TRUNUSU9OUy4KLQkqIGVtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaCAoU0NSSVBUX05BTUUpOiBTZXQgdG8gZWxmLgotCShEQVRBX0FERFIpOiBEb24ndCBzZXQuCi0JKElOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlMpOiBSZW5hbWUgZnJvbSBPVEhFUl9SRUFET05MWV9TRUNUSU9OUy4KLQkoT1RIRVJfVEVYVF9TRUNUSU9OUyk6IFNldC4KLQkoT1RIRVJfR09UX1NFQ1RJT05TKTogUmVuYW1lIGZyb20gT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TLgotCShNQUNISU5FKTogU2V0IHRvIGVtcHR5IHN0cmluZy4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2VsZjMyZWJtaXAuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJibWlwLnNoOiBMaWtld2lzZS4gIEFsc286Ci0JKFRFWFRfRFlOQU1JQyk6IFNldC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsbWlwcy5zaDogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbiAoZWVsZjMyYm1pcHMuYyk6IERlcGVuZCB1cG9uIGVsZi5zYyByYXRoZXIgdGhhbgotCWVsZm1pcHMuc2MuCi0JKGVlbGYzMmVibWlwcy5jLCBlZWxmMzJlbG1pcHMuYywgZWVsZjMybG1pcC5jKTogTGlrZXdpc2UuCi0KLU1vbiBNYXkgMTIgMTE6MTE6MDYgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRG9uJ3QgYWxpZ24gdGhlIGRhdGEgc2VnbWVudCBvbiB0aGUgbmV4dCA4Ci0JYnl0ZSBib3VuZGFyeSwgaW5zdGVhZCBsZXQgdGhlIGxpbmtlciB1c2Ugd2hhdGV2ZXIgdGhlIGluZGl2aWR1YWwKLQlzZWN0aW9ucyByZXF1aXJlLgotCi1GcmkgTWF5ICA5IDE3OjQ1OjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotZ251Kik6IERvbid0IGluY2x1ZGUgTWFjaCBzdXBwb3J0LgotCi1UdWUgTWF5ICA2IDEzOjIxOjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gU2VhbiBNY05laWwgPHNlYW5AbWNuZWlsLmNvbT46Ci0JKiBlbXVsdGVtcGwvcGUuZW0gKHNvcnRfYnlfZmlsZV9uYW1lKTogU29ydCBieSBhcmNoaXZlIG5hbWUKLQlmaXJzdC4KLQkoc29ydF9zZWN0aW9ucyk6IFNvcnQgYWxsIHNlY3Rpb25zLCBub3QganVzdCBzZWN0aW9ucyBpbiB0aGUgc2FtZQotCWFyY2hpdmUuCi0KLU1vbiBNYXkgIDUgMTg6MTk6NTUgMTk5NyAgUGhpbGlwIEJsdW5kZWxsICA8cGpiMjdAY2FtLmFjLnVrPgotCi0JKiBjb25maWd1cmUudGd0LCBjb25maWd1cmUuaG9zdDogY29wZSB3aXRoICcqLSotbGludXgtZ251YW91dCcKLQl0YXJnZXRzLgotCi1GcmkgTWF5ICAyIDE1OjU0OjI4IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MgKC50ZXh0KTogQWRkIGEgbGVhZGluZyB1bmRlcnNjb3JlIHRvCi0JX197RCxDfVRPUl97TElTVCxFTkR9X18gZGVmaW5hdGlvbnMuICBSZWFycmFuZ2UgdGhlIG9yZGVyIG9mIGl0ZW1zCi0JaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBNb3ZlIC5jb25zdCwgLmN0b3JzLCAuZHRvcnMgaW50byBzZXBhcmF0ZQotCXNlY3Rpb25zLgotCi1XZWQgQXByIDMwIDEyOjIzOjIxIDE5OTcgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYyAoX18uaW5pdHAuZW5kLCBfZXRleHQpOiBBZGRlZCB3aGl0ZXNwYWNlCi0JYXJvdW5kIGFzc2lnbm1lbnQgb2YgY3VycmVudCBsb2NhdGlvbiBwb2ludGVyLgotCi1UaHUgQXByIDE3IDEzOjA3OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogTWFrZSBzdXJlIHRoZSBzZXQgaXMgYWxpZ25lZAotCWFwcHJvcHJpYXRlbHkuCi0KLVR1ZSBBcHIgMTUgMTM6MTk6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgotCShpbnN0YWxsKTogRGVwZW5kIHVwb24gbGQubmV3IGFuZCBpbnN0YWxsZGlycy4gIFVzZQotCSQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkgZGlyZWN0bHksIHJhdGhlciB0aGFuIHVzaW5nCi0JJChJTlNUQUxMX1hGT1JNKSBhbmQgJChJTlNUQUxMX1hGT1JNMSkuCi0JKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbC1pbmZvKTogUnVuIG1raW5zdGFsbGRpcnMuCi0KLU1vbiBBcHIgMTQgMTI6MDY6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IENoYW5nZSBpbnN0YWxsLnNoIHRvIGluc3RhbGwtc2guCi0KLQlGcm9tIFRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT46Ci0JKiBjb25maWd1cmUuaW46IFVzZSAke0NPTkZJR19TSEVMTH0gd2hlbiBydW5uaW5nICRhY19jb25maWdfc3ViLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByICA0IDExOjQyOjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCi0JKHNvcnRfc2VjdGlvbnNfMSk6IFVzZSB4bWFsbG9jIHJhdGhlciB0aGFuIGFsbG9jYS4KLQotCSogbGRsZXgubDogUmVjb2duaXplIFNRVUFELgotCSogbGRncmFtLnkgKGxlbmd0aCk6IEFkZCBTUVVBRC4KLQkqIGxkY3Rvci5jIChsZGN0b3JfYnVpbGRfc2V0cyk6IFVzZSBTUVVBRCBmb3IgYSBzaWduZWQgOCBieXRlCi0JcmVsb2MuCi0JKiBsZGxhbmcuYyAocHJpbnRfZGF0YV9zdGF0ZW1lbnQpOiBIYW5kbGUgU1FVQUQuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucywgbGFuZ19kb19hc3NpZ25tZW50cyk6IExpa2V3aXNlLgotCSogbGRleHAuYyAoZXhwX3ByaW50X3Rva2VuKTogQWRkIFNRVUFEIHRvIHRhYmxlLgotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogSGFuZGxlIFNRVUFELgotCSogbGQudGV4aW5mbyAoU2VjdGlvbiBEYXRhIEV4cHJlc3Npb25zKTogRG9jdW1lbnQgU1FVQUQuCi0KLVRodSBBcHIgIDMgMTM6MTk6NDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZHZlci5jIChsZF9wcm9ncmFtX3ZlcnNpb24pOiBTZXQgdG8gMi44LjEuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOC4KLQotV2VkIEFwciAgMiAxMTo1NToyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1wdy1pZHRtaXBzLmM6IFJlbmFtZSBmcm9tIG1wdy1lbWlwc2lkdC5jLgotCSogbXB3LWVsZm1pcHMuYzogUmVuYW1lIGZyb20gbXB3LWVtaXBzZWxmLmMuCi0JKiBtcHctY29uZmlnLmluOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBDYWxsIGxhbmdfY2hlY2sgaW1tZWRpYXRlbHkgYWZ0ZXIKLQlvcGVuaW5nIHRoZSBpbnB1dCBmaWxlcywgcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgbGluay4KLQotTW9uIE1hciAzMSAyMzo0NDowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoaW5pdCk6IEZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6ZXIuCi0JKHNldF9wZV9zdGFja19oZWFwKTogUmVtb3ZlIGxvY2FscyBiZWdpbl9jb21taXQgYW5kIGVuZC4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBSZW1vdmUgdW51c2VkIGxvY2FsIGkuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJlbW92ZSB1bnVzZWQgbG9jYWwgcHRyLgotCi1Nb24gTWFyIDMxIDE2OjM1OjUxIDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLnRndCAoaHBwYSotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIGhwcGEtKi0qZWxmKi4KLQotRnJpIE1hciAyOCAxNToyOToyMyAxOTk3ICBILkouIEx1IDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQlDb250cmlidXRlZCBieSBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGNhaXAucnV0Z2Vycy5lZHU+OgotCSogY29uZmlndXJlLnRndCAoc3BhcmMqLSotbGludXhhb3V0Kik6IE5ldyB0YXJnZXQuCi0JKHNwYXJjKi0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL3NwYXJjbGludXguc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVzcGFyY2xpbnV4Lm8uCi0JKGVzcGFyY2xpbnV4LmMpOiBOZXcgdGFyZ2V0LgotCi1GcmkgTWFyIDI4IDE0OjMwOjEyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gUmFsZiBCYWVjaGxlIDxyYWxmQGdudS5haS5taXQuZWR1PjoKLQkqIGNvbmZpZ3VyZS50Z3Q6IFNldCB0YXJnX2V4dHJhX2VtdWxzIGZvciBtaXBzKmVsLSotbGludXgqIGFuZAotCW1pcHMqLSotbGludXgqLiAgVXNlIGVsZjMyYm1pcCBhbmQgZWxmMzJsbWlwLCBub3QgZWxmMzJlYm1pcCBhbmQKLQllbGYzMmVsbWlwLgotCi1UaHUgTWFyIDI3IDE3OjE0OjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBVcGRhdGUgY29weXJpZ2h0IGRhdGUgaW4gdmVyc2lvbgotCW1lc3NhZ2UuCi0KLUZyaSBNYXIgMjEgMTI6Mjg6NDEgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogZW11bHBhcmFtcy9kZWx0YTY4LnNoIChPVVRQVVRfRk9STUFUKTogU2V0IHRvICJjb2ZmLW02OGstc3lzdiIuCi0KLVR1ZSBNYXIgMTggMTE6MTY6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVtdWx0ZW1wbC9haXguZW06IEluY2x1ZGUgIm9ic3RhY2suaCIuCi0KLU1vbiBNYXIgMTcgMTk6MjY6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYzogSW5jbHVkZSAib2JzdGFjay5oIi4KLQotU2F0IE1hciAxNSAyMzoyMzo0NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAocG93ZXJwYy0qLWJlb3MqKTogVXNlIGFpeHBwYyBmb3IgdGFyZ19lbXVsLgotCi1TYXQgTWFyIDE1IDE4OjEwOjM4IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBsZGVtdWwuaCAobGRlbXVsX2xpc3RfZW11bGF0aW9ucyk6IFVzZSBmdWxsIHByb3RvdHlwZS4KLQkqIGxkbGFuZy5jIChwcmludF9vbmVfc3ltYm9sKTogQWRkIGRlY2xhcmF0aW9uLgotCSogbGRsYW5nLmggKGRwcmludF9zdGF0ZW1lbnRzKTogRGVjbGFyZS4KLQkqIGxkbWFpbi5jIChyZW1vdmVfb3V0cHV0KTogRGVjbGFyZS4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBEZWNsYXJlLgotCSogbGR3cml0ZS5jIChjbG9uZV9zZWN0aW9uKTogRGVjbGFyZS4KLQkoc3BsaXRfc2VjdGlvbnMpOiBNYWtlIHN0YXRpYy4gIERlY2xhcmUuCi0JKiBtcmkuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoc3RyZHVwKTogRG9uJ3QgZGVjbGFyZS4KLQkobXJpX2FsaWFzKTogVXNlIHhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgotCi1GcmkgTWFyIDE0IDIxOjMwOjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogQ2hhbmdlIGhhbmRsaW5nIG9mIGRhdGEgYXJlYSB3aGVuCi0JZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5IHRvIG5vdCBza2lwIGEgbGFyZ2UgYmxvY2sgb2YgbWVtb3J5LgotCUZyb20gUGVyIEZvZ2Vsc3Ryb20gPHBlZm9AY3ZzLm9wZW5ic2Qub3JnPi4KLQotV2VkIE1hciAxMiAyMTozMzowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtdWx0aXBsZV9kZWZpbml0aW9uKTogT25seSBza2lwIHRoZSB3YXJuaW5nIGlmIHRoZQotCW91dHB1dCBzZWN0aW9uIGlzIGFic29sdXRlIHdoZW4gdGhlIGlucHV0IHNlY3Rpb24gaXMgbm90Ci0JYWJzb2x1dGUuCi0KLQkqIGxkbGV4Lmw6IEFjY2VwdCB3aGl0ZXNwYWNlIGluIFZFUlNfU1RBUlQgc3RhdGUuICBXYXJuIGFib3V0Ci0JaW52YWxpZCBjaGFyYWN0ZXJzIGluIFZFUlNfKiBzdGF0ZXMuCi0KLVR1ZSBNYXIgMTEgMTM6NTE6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUpOiBEb24ndCBsZXQgYQotCXRyYWlsaW5nIHNwYWNlIGxlYWQgdXMgdG8gdGhpbmsgdGhhdCB0aGVyZSBpcyBhIHplcm8gYWRkcmVzcy4KLQotU3VuIE1hciAgOSAyMzowNjozNSAxOTk3ICBFcmljIFlvdW5nZGFsZSAgPGVyaWNAYW5kYW50ZS5qaWMuY29tPgotCi0JKiBsZGdyYW0ueSAodmVyc19ub2RlKTogQ29ycmVjdCB0eXBvIG9mICcoJyAgZm9yICd7Jy4KLQotRnJpIE1hciAgNyAxODo0MDoxMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjIChFTlRSWSk6IEVudHJ5IHN5bWJvbCBpcyBfX3N0YXJ0Ci0JcmF0aGVyIHRoYW4gX3N0YXJ0LgotCShfX2VkYXRhKTogRGVmaW5lIHRoaXMgcmF0aGVyIHRoYW4gImVkYXRhIi4KLQkoX19lbmQpOiBEZWZpbmUgdGhpcyByYXRoZXIgdGhhbiAiZW5kIi4KLQotVHVlIE1hciAgNCAxNzoxODozNSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAodGljODAtKi0qKTogQWxsb3cgZHJvcHBpbmcgb2YgLWNvZmYuCi0KLVN1biBNYXIgIDIgMjI6NTk6NDkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChsZC5kdmkpOiBTZXQgTUFLRUlORk8gZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgd2VsbAotCWFzIFRFWElOUFVUUy4gIE5lZWRlZCBmb3IgYnVpbGRpbmcgaW4gc2VwYXJhdGUgYnVpbGQgZGlyLgotCSogbGRpbnQudGV4aW5mbyAoU0NSSVBUX05BTUUpOiBGaXggdHlwby4KLQkqIGVtdWxwYXJhbXMvdGljODBjb2ZmLnNoOiBSZXdyaXRlIHRvIGluY2x1ZGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbgotCWFib3V0IGVhY2ggc2hlbGwgdmFyaWFibGUgdGhhdCBpcyBzZXQgKG9yIG5vdCBzZXQpLgotCSogc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjOiBDb21wbGV0ZSByZXdyaXRlLgotCi1GcmkgRmViIDI4IDE3OjQyOjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBDYWxsIGJmZF9zZXRfZGVmYXVsdF90YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAobGRtYWluLm8pOiBEZWZpbmUgVEFSR0VUIHdoZW4gY29tcGlsaW5nLgotCi1UaHUgRmViIDI3IDExOjQxOjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBEb24ndCBpbml0aWFsaXplIGxpbmtfaW5mby5scHJlZml4IG9yCi0JbGlua19pbmZvLmxwcmVmaXhfbGVuLgotCSogZW11bHRlbXBsL2hwcGFlbGYuZW0gKGhwcGFlbGZfYmVmb3JlX3BhcnNlKTogTGlrZXdpc2UuCi0KLQkqIGVtdWx0ZW1wbC9tODhrYmNzLmVtOiBSZW1vdmUuCi0JKiBlbXVscGFyYW1zL204OGtiY3Muc2ggKFRFTVBMQVRFX05BTUUpOiBEb24ndCBzZXQuCi0JKiBNYWtlZmlsZS5pbiAoZW04OGtiY3MuYyk6IERlcGVuZCB1cG9uIGdlbmVyaWMuZW0gcmF0aGVyIHRoYW4KLQltODhrYmNzLmVtLgotCi0JKiBtcmkuYyAobXJpX2RyYXdfdHJlZSk6IFBhc3Mgbm9sb2FkX3NlY3Rpb24sIG5vdCBTRUNfTkVWRVJfTE9BRCwKLQl0byBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudC4gIEZyb20gTWFyayBSYXNpbgotCTxtYXJrLnJhc2luQHRlbHJhZC5jby5pbD4uCi0KLVdlZCBGZWIgMjYgMTE6NTE6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogQ2xlYXIgU0VDX0lTX0NPTU1PTiBmcm9tIGNvbW1vbgotCXNlY3Rpb24uCi0KLVR1ZSBGZWIgMjUgMjA6Mzg6MTEgMTk5NyAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKi0qLWxuZXdzKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAoZW1pcHNsbmV3cy5jKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvbWlwc2xuZXdzLnNoOiBOZXcgZmlsZS4KLQotVHVlIEZlYiAyNSAxNjowNDowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoaG9sZF9pbnRlcnApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBQdXQgbG9hZGFibGUgLm5vdGUgc2VjdGlvbnMKLQlhZnRlciBob2xkX2ludGVycC4gIENob29zZSBhIHVuaXF1ZSBvdXRwdXQgc2VjdGlvbiBuYW1lLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogRG9uJ3Qgc2V0IGhvbGRfdXNlIGlmIHRoZQotCVNFQ19MT0FEIG9yIFNFQ19BTExPQyBmbGFncyBkaWZmZXIuICBTZXQgaG9sZF9pbnRlcnAuCi0KLU1vbiBGZWIgMjQgMTg6MTY6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogbGRsZXgubCAoVl9UQUcsIFZfSURFTlRJRklFUik6IE5ldyBtYWNyb3MuCi0JKFZFUlNfU1RBUlQsIFZFUlNfU0NSSVBULCBWRVJTX05PREUpOiBOZXcgc3RhdGVzIHRvIHBhcnNlIHZlcnNpb24KLQlpbmZvcm1hdGlvbi4KLQkobGRsZXhfdmVyc2lvbl9zY3JpcHQsIGxkbGV4X3ZlcnNpb25fZmlsZSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBsZGxleC5oIChlbnVtIGlucHV0X2VudW0pOiBBZGQgaW5wdXRfdmVyc2lvbl9zY3JpcHQuCi0JKGxkbGV4X3ZlcnNpb25fc2NyaXB0KTogRGVjbGFyZS4KLQkobGRsZXhfdmVyc2lvbl9maWxlKTogRGVjbGFyZS4KLQkqIGxkZ3JhbS55ICgldW5pb24pOiBBZGQgZGVmbGlzdCwgdmVyc3ltcywgYW5kIHZlcnNub2RlLgotCShWRVJTX1RBRywgVkVSU19JREVOVElGSUVSKTogTmV3IHRlcm1pbmFscy4KLQkoR0xPQkFMLCBMT0NBTCwgVkVSU0lPTiwgSU5QVVRfVkVSU0lPTl9TQ1JJUFQpOiBOZXcgdGVybWluYWxzLgotCShmaWxlKTogQWNjZXB0IElOUFVUX1ZFUlNJT05fU0NSSVBULgotCShpZmlsZV9wMSk6IEFjY2VwdCB2ZXJzaW9uLgotCSh2ZXJzaW9uX3NjcmlwdF9maWxlKTogTmV3IG5vbnRlcm1pbmFsLgotCSh2ZXJzaW9uLCB2ZXJzX25vZGVzLCB2ZXJzX25vZGUpOiBMaWtld2lzZS4KLQkodmVyZGVwLCB2ZXJzX3RhZywgdmVyX2RlZm5zKTogTGlrZXdpc2UuCi0JKiBsZGxhbmcuYyAobGFuZ19lbGZfdmVyc2lvbl9pbmZvKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkobGFuZ19uZXdfdmVyc19yZWdleCk6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ19uZXdfdmVyc19ub2RlKTogTmV3IGZ1bmN0aW9uLgotCSh2ZXJzaW9uX2luZGV4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfYWRkX3ZlcnNfZGVwZW5kKTogTmV3IGZ1bmN0aW9uLgotCSogbGRsYW5nLmggKGxhbmdfZWxmX3ZlcnNpb25faW5mbyk6IERlY2xhcmUuCi0JKGxhbmdfbmV3X3ZlcnNfcmVnZXgsIGxhbmdfbmV3X3ZlcnNfbm9kZSk6IERlY2xhcmUuCi0JKGxhbmdfYWRkX3ZlcnNfZGVwZW5kLCBsYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZSk6IERlY2xhcmUuCi0JKiBsZXhzdXAuYyAoT1BUSU9OX1ZFUlNJT05fU0NSSVBUKTogRGVmaW5lLgotCShsZF9vcHRpb25zKTogQWRkICJ2ZXJzaW9uLXNjcmlwdCIuCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgT1BUSU9OX1ZFUlNJT05fU0NSSVBULgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JUGFzcyBsYW5nX2VsZl92ZXJzaW9uX2luZm8gdG8gc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgLmdudS52ZXJzaW9uIHNlY3Rpb25zLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgc3ltYm9sIHZlcnNpb25pbmcuCi0KLUZyaSBGZWIgMjEgMTc6Mzc6NTEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChlZDMwdmVsZi5jKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS50Z3QgKGQzMHYtKi0qKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvZDMwdmVsZi5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBOZXcgZmlsZS4KLQotRnJpIEZlYiAxNCAxODoyODozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKE9wdGlvbiBDb21tYW5kcyk6IERvY3VtZW50IHRoZSBJTkNMVURFIGNvbW1hbmQuCi0KLVRodSBGZWIgMTMgMjA6MzE6MzcgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEJGRF9ORUVEX0RFQ0xBUkFUSU9OIG9uIGdldGVudi4KLQkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fR0VURU5WKTogTmV3IG1hY3JvLgotCSogc3lzZGVwLmggKGdldGVudik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYuCi0JKiBsZGVtdWwuYyAobGRfZW11bF9kZWZhdWx0X3RhcmdldCk6IERvIG5vdCBjYXN0IGdldGVudiByZXR1cm4KLQl2YWx1ZS4KLQkqIGxkbWFpbi5jIChnZXRfZW11bGF0aW9uKTogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotVHVlIEZlYiAxMSAxNTozNDoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IFdoZW4gcmVsb2NhdGluZywgcHV0IC5taXBzMTYuZm4uKiBhbmQKLQkubWlwczE2LmNhbGwuKiBpbiAudGV4dC4KLQotU3VuIEZlYiAgOSAxODowOToxMyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy90aWM4MGNvZmYuc2g6IE5ldyAoZHVtbXkpIGZpbGUgZm9yIFRJYzgwLgotCSogc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjOiBOZXcgKGR1bW15KSBmaWxlIGZvciBUSWM4MC4KLQkqIE1ha2VmaWxlLmluIChldGljODBjb2ZmLmMpOiBBZGQgdGFyZ2V0IGFuZCBydWxlIHRvIGJ1aWxkIGl0LgotCSogY29uZmlndXJlLnRndCAodGljODAtKi1jb2ZmKTogU2V0IHRhcmdfZW11bCB0byB0aWM4MGNvZmYuCi0KLUZyaSBKYW4gMzEgMTM6MTY6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBTZWFyY2ggZm9yCi0JIi5zbyIgaW4gdGhlIG5hbWUsIG5vdCAiLnNvLiIuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIpOiBBY2NlcHQgYSBwbGFpbiAuc28gZmlsZS4KLQotCSogTWFrZWZpbGUuaW4gKGxkLmluZm8pOiBBZGQgLUkkKHNyY2RpcikuICBGcm9tIEFsYW4gTW9kcmEKLQk8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+LgotCi1UaHUgSmFuIDMwIDExOjMxOjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IFNraXAgdGhlIGRpcmVjdG9yeSBuYW1lIHdoZW4KLQlzZWFyY2hpbmcgZm9yICIuc28uIi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpcik6IE1ha2Ugc3VyZSB0aGF0IHRoZSBsaWJyYXJ5IG5hbWUKLQloYXMgYSB2ZXJzaW9uIG51bWJlciwgYW5kIHRoYXQgb25seSB2ZXJzaW9uIG51bWJlcnMgZm9sbG93IC5zby4KLQotV2VkIEphbiAyOSAxODoxNTowMCAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzoKLQkqIHNjcmlwdHRlbXBsL3BwY3BlLnNjOiBhZGQgKiguZ2NjX2V4Y2VwdF90YWJsZSkgdG8gdGhlIHRleHQKLQlzZWN0aW9uIHNvIFdpbjMyIGV4ZWN1dGFibGVzIGFyZSB2YWxpZC4KLQotTW9uIEphbiAyNyAxMjoyODo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUHV0IGxpbmtvbmNlIHJlbG9jIHNlY3Rpb24gaW4gb3RoZXIKLSAJYXBwcm9wcmlhdGUgcmVsb2Mgc2VjdGlvbnMuCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBBZGQgbGlua29uY2Ugc3VwcG9ydC4KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTGlrZXdpc2UuCi0KLUZyaSBKYW4gMjQgMTA6NDQ6MDkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvbW4xMDIwMC5zaCAoT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyk6IE1vdmUgdGhlCi0Jc3RhY2sgdXAgdG8gMHg4MDAwMC4KLQkqIGVtdWxwYXJtcy9tbjEwMzAwLnNoIChPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TKTogTGlrZXdpc2UuCi0KLVR1ZSBKYW4gMjEgMTI6MTE6MTAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvbTMycmVsZi5zaCAoT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyk6IFVzZSBQUk9WSURFCi0JdG8gZGVmaW5lIGBfc3RhY2snLgotCi1UaHUgSmFuIDE2IDE3OjA3OjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoYXJnc190eXBlKTogUmVuYW1lIGF1eGlsaWFyeV9maWx0ZXJfc2hsaWIgdG8KLQlhdXhpbGlhcnlfZmlsdGVycywgYW5kIG1ha2UgaXQgY2hhciAqKi4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC1mIGJ5IHNldHRpbmcgdXAgYW4gYXJyYXkuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogVXNlCi0JbmV3IG5hbWUgb2YgYXV4aWxpYXJ5X2ZpbHRlcnMuCi0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBJbXByb3ZlIGRvY3VtZW50YXRpb24gb2YgLS1maWx0ZXIgYW5kCi0JLS1hdXhpbGlhcnkuCi0KLVR1ZSBKYW4gMTQgMTU6NDQ6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogQ2xhcmlmeSB0aGF0IHRoZSBub3JtYWwgdXNhZ2UgaXMgLVQuCi0JKENvbW1hbmRzKTogTGlrZXdpc2UuCi0KLVRodSBKYW4gIDkgMTE6MjY6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjOiBDb3JyZWN0IG1hc2sgdXNlZCBmb3IgLmRhdGEgYWRkcmVzcy4KLQotV2VkIEphbiAgOCAxNToxNDo1OSAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IG1ha2UgZGVmYXVsdCBleGVjdXRhYmxlIGEuZXhlIGluc3RlYWQgb2YKLQlhLm91dAotCi1GcmkgSmFuICAzIDE3OjMzOjM0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IE1vdmUgLmdvdCBjbG9zZXIgdG8gLnNkYXRhIGFuZCAuc2JzcyBieQotCXNoaWZ0aW5nIC5wbHQgYmFjay4gIFJ1bW91ciBoYXMgaXQgdGhhdCB0aGUgTmV0QlNEIGxkLnNvIGRlcGVuZHMKLQlvbiAuZHluYW1pYyBiZWluZyBhZnRlciAuZ290LCBzbyB3ZSBsZWF2ZSB0aGF0LgotCi1GcmkgSmFuICAzIDE0OjA0OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogRG9uJ3QgcmVtb3ZlIGNvbmZpZ2RvYy50ZXhpLgotIAkobWFpbnRhaW5lci1jbGVhbik6IERvIHJlbW92ZSBjb25maWdkb2MudGV4aS4KLQotCSogbGQudGV4aW5mbyAoT3BlcmF0b3JzKTogUmVtb3ZlICdAJyBmcm9tIEBzbWFsbGV4bXBsZSBpbiBjb21tZW50Ci0JdG8gYXZvaWQgY29uZnVzaW5nIHRleGkycm9mZi4KLQotRnJpIEphbiAgMyAxMToyNzowMiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2MgKC56ZGF0YSk6IEFkZCAuemNvbW1vbiBzZWN0aW9uLgotCSgudGRhdGEpOiBBZGQgLnRjb21tb24gYW5kIC50Y29tbW9uX2J5dGUgc2VjdGlvbnMuCi0KLVRodSBKYW4gIDIgMTg6MTQ6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKmVsLSotbGludXgqLCBtaXBzKi0qLWxpbnV4Kik6IE5ldyB0YXJnZXRzLgotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogVXNlIF9fc3RhcnQgYXMgdGhlIGVudHJ5IGFkZHJlc3MgZm9yCi0JbWlwcyotKi1saW51eCouCi0KLVR1ZSBEZWMgMzEgMTQ6NDg6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IEFkZCAtRF9HTlVfU09VUkNFLgotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgZmlsdGVyX3NobGliIGFuZCBhdXhpbGlhcnlfZmlsdGVyX3NobGliCi0JZmllbGRzLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBSZWNvZ25pemUgLS1hdXhpbGlhcnkvLWYgYW5kCi0JLS1maWx0ZXIvLUYuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlQYXNzIGZpbHRlcl9zaGxpYiBhbmQgYXV4aWxpYXJ5X2ZpbHRlcl9zaGxpYiB0bwotCXNpemVfZHluYW1pY19zZWN0aW9ucy4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0tZmlsdGVyLy1GIGFuZCAtLWF1eGlsaWFyeS8tZi4KLQotTW9uIERlYyAzMCAxMzo1NTo1NyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2MgKC50ZGF0YSkgQWRkIC50YnNzIGFuZCAudGJ5dGUgc2VjdGlvbnMuCi0KLVdlZCBEZWMgMTggMjI6NTc6MzUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IFVzZSBOZXdGb2xkZXJSZWN1cnNpdmUgZm9yIGluc3RhbGxhdGlvbi4KLQotRnJpIERlYyAxMyAxNDowODo1MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IE1ha2Ugc3VyZSBfX3tlLGd9cCBzdGFydCByZWxhdGl2ZSB0byB0aGUKLQl7cyx0fWRhdGEgc2VjdGlvbnMuICBEbyBub3QgZW1pdCBhbnkgbGlua2VyIGdlbmVyYXRlZCBzeW1ib2xzIGlmCi0JLXIuICBVc2Uge1RFWFQse1osUyxUfURBVEF9X1NUQVJUX0FERFIgdmFyaWFibGVzIHRvIGluaXRpYWxpemUKLQl3aGVyZSB0aGUgZGlmZmVyZW50IHNlY3Rpb25zIGdvLiAgQ2hhbmdlIHNvbWUgd2hpdGVzcGFjZS4KLQotCSogZW11bHBhcmFtcy92ODUwLnNoICh7VEVYVCx7WixTLFR9REFUQX1fU1RBUlRfQUREUik6IERlZmluZQotCWFwcHJvcHJpYXRlbHkuICBSZW1vdmUgY3J1ZCBub3QgdXNlZCBhbnltb3JlLgotCi1GcmkgRGVjIDEzIDEwOjE5OjU3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVtbjEwMjAwLmMpOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogY29uZmlndXJlLnRndDogSGFuZGxlIG1uMTAyMDAuCi0JKiBlbXVscGFybXMvbW4xMDIwMC5zaDogTmV3IGZpbGUuCi0KLVRodSBEZWMgMTIgMTc6MDQ6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZ2xkOTYwYy5lbTogSW5jbHVkZSA8Y3R5cGUuaD4uCi0gCShnbGQ5NjBfc2V0X291dHB1dF9hcmNoKTogR2V0IHRoZSBtYWNoaW5lIHR5cGUgZnJvbSB0aGUgLUEgb3B0aW9uCi0JaWYgdGhlcmUgaXMgb25lLCByYXRoZXIgdGhhbiBhbHdheXMgdXNpbmcgY29yZS4KLQotU2F0IERlYyAgNyAxMDowNzo1MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9tbjEwMzAwLnNoOiBIYW5kbGUgbGVhZGluZyB1bmRlcnNjb3Jlcy4KLQotVGh1IERlYyAgNSAxMzo0NTo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IE9ubHkKLQlzZXQgaG9sZF9yZWwgaWYgU0VDX0FMTE9DIGlzIHNldC4KLQotVHVlIERlYyAgMyAxMToyOToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogU2V0IHRoZSBvdXRwdXRfb2Zmc2V0IGFzIHdlbGwKLQlhcyB0aGUgb3V0cHV0X3NlY3Rpb24gd2hlbiBvbmx5IHJlYWRpbmcgc3ltYm9scyBmcm9tIGEgZmlsZS4KLQotTW9uIERlYyAgMiAxMTo0Mzo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvKi5zaDogTWFrZSBzdXJlIHRoYXQgZWFjaCBzZXQgb2YgcGFyYW1ldGVycyB3aGljaAotCXVzZXMgdGhlIGVsZi5zYyBzY3JpcHQgc2V0cyBNQUNISU5FLgotCi1XZWQgTm92IDI3IDAzOjIyOjA1IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmeyxtaXBzLHBwY30uc2M6IEFkZCB0aGUgcmVtYWluaW5nIERXQVJGIHNlY3Rpb25zLgotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBMaWtld2lzZS4KLQotVHVlIE5vdiAyNiAxNjo1ODozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0KLU1vbiBOb3YgMjUgMTI6MTc6NTUgMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyk6IEFkZCBjYXNlCi0JZm9yIGJmZF92bWEgdG8gaW5pdCBsb29wLgotCi1Nb24gTm92IDI1IDA5OjU1OjA3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL21uMTAzMDAuc2g6IFJlbW92ZSBib2d1cyAnXycgcHJlZml4IGZvcgotCWVudHJ5IHN5bWJvbCBhbmQgY3Rvci9kdG9yIHN0dWZmLgotCi1GcmkgTm92IDE1IDEzOjAwOjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVtbjEwMzAwLmMpOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogY29uZmlndXJlLnRndDogSGFuZGxlIG1uMTAzMDAuCi0JKiBlbXVscGFybXMvbW4xMDMwMC5zaDogTmV3IGZpbGUuCi0KLVR1ZSBOb3YgIDUgMTA6NTc6NTAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoUkVBRE9OTFlfU1RBUlRfQUREUik6IENoYW5nZWQgdG8gMHgyMDAwMDA0LgotCShFTUJFRERFRCk6IERlZmluZS4KLQotRnJpIE5vdiAgMSAxMDowMToyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm86IEFkZCBzZWN0aW9uIG9uIHJlcG9ydGluZyBidWdzLgotCi0JKiBzY3JpcHR0ZW1wbC9tNjhrY29mZi5zYzogTWFrZSBzdXJlIHRoZSBldGV4dCBhbmQgX19DVE9SX0xJU1RfXwotCXN5bWJvbHMgYXJlIGNvcnJlY3RseSBhbGlnbmVkLgotCi1UaHUgT2N0IDMxIDA5OjI4OjU5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0ZW1wbC92ODUwLnNjICh6ZGF0YSk6IEhhbmRsZSByZXN6ZGF0YSwgcm9temRhdGEgYW5kCi0Jcm9temJzcyB0b28uCi0KLVR1ZSBPY3QgMjkgMTI6MzM6MDUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaDogQ2hhbmdlcyBuZWVkZWQgZm9yIEQxMFYtRVZBIGJvYXJkLgotCVNldCBURVhUX1NUQVJUX0FERFIgdG8gMHgxMDAwMDAwLiBTZXQgUkVBRE9OTFlfU1RBUlRfQUREUiB0bwotCTB4MjAwMDAwMC4KLQotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogIEZpeCBjYWxjdWxhdGlvbiBvZiAudGV4dC4gIENoYW5nZQotCS5zdGFjayB0byBzdGFydCBhdCAweDIwMDdmZmUuCi0KLU1vbiBPY3QgMjggMTU6Mzc6MDAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoc3BhcmNsZXQqLSotYW91dCopOiBEZWxldGUsIHVzZSBzcGFyYyotKi1hb3V0Ki4KLQotV2VkIE9jdCAyMyAxNjoxNzoyMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdGVtcGwvdjg1MC5zYyAoemRhdGEpOiBGaXggdHlwbyAienJvZGF0YSIgLT4gInJvemRhdGEiLgotCi0JKiBzY3JpcHRlbXBsL3Y4NTAuc2MgKHpkYXRhKTogTWFrZSBzdXJlIHRoaXMgc3RheXMKLQlpbiBsby1tZW1vcnkuCi0KLVR1ZSBPY3QgMjIgMTE6MzY6NDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjIChfX2VwKTogUHV0IGl0IGF0IHRoZSBzdGFydAotCW9mIHRoZSB0ZGEgc2VjdGlvbi4KLQotCSogc2NyaXB0ZW1wbC92ODUwLnNjOiBNb3ZlIGFsbCAibm9ybWFsIiBzZWN0aW9ucyBpbnRvCi0JdGhlIGV4dGVybmFsIG1lbW9yeSByZWdpb24gKDB4MTAwMDAwIC0gMHgyMDAwMDApLgotCi1Nb24gT2N0IDIxIDE3OjE2OjU5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6IENsb25lIGZyb20gZWxmLnNjLCBtb3ZlIC50ZXh0IHRvCi0JMHgxMDAwMCwgc28gdGhhdCBpcyBtb3JlIHJvb20gZm9yIGRhdGEuCi0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoVEVYVF9TVEFSVF9BRERSKTogTm93IDB4MTAwMDAwLgotCShSRUFET05MWV9TVEFSVF9BRERSKTogTm93IDB4MC4KLQkoU0NSSVBUX05BTUUpOiBOb3cgZWxmZDEwdi4KLQotCSogTWFrZWZpbGUuaW4gKGVkMTB2ZWxmLmMpOiBEZXBlbmQgb24gZWxmZDEwdi5zYywgbm90IGVsZi5zYy4KLQotRnJpIE9jdCAxOCAyMjoxMjo0OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL20zMnJlbGYuc2gJKFRFWFRfU1RBUlRfQUREUik6IENoYW5nZSBmcm9tIDAgdG8gMHgxMDAuCi0KLUZyaSBPY3QgMTggMTU6NDM6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBSZW1vdmUgZWVsZjY0YWxwaGEuby4KLQkoQUxMXzY0X0VNVUxBVElPTlMpOiBOZXcgdmFyaWFibGUuCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCAtLWVuYWJsZS02NC1iaXQtYmZkIG9wdGlvbi4gIElmIGl0IGlzIHNldAotCXdpdGggLS1lbmFibGUtdGFyZ2V0cz1hbGwsIGluY2x1ZGUgQUxMXzY0X0VNVUxBVElPTlMgaW4KLQlFTVVMQVRJT05fT0ZJTEVTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgT2N0IDE4IDEyOjU4OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYyAoX19ncCwgX19lcCk6IERlZmluZS4KLQotVGh1IE9jdCAxNyAxODoxNDowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm86IFRyeSB0byBjb25zaXN0ZW50bHkgdXNlIGEgc2luZ2xlIG9yIGEgZG91YmxlIGRhc2gKLQlmb3IgZWFjaCBvcHRpb24uCi0KLVRodSBPY3QgMTcgMTA6MTc6MjAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9tMzJyZWxmLnNoIChFTUJFRERFRCk6IERlZmluZS4KLQotVGh1IE9jdCAxNyAxMDo1Njo0OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2MgKC56ZGF0YSk6IEFkZCB0aGlzIGJlZm9yZSAudGV4dC4KLQkoLnNkYXRhKTogQWxzbyBpbmNsdWRlIC5yb3NkYXRhIGFzIHBhcnQgb2YgdGhlIC5zZGF0YS4KLQkoLnRkYXRhKTogSW5jbHVkZSB0aGlzIGp1c3QgYmVmb3JlIC5zZGF0YS4KLQotCSogZW11bHBhcm1zL3Y4NTAuc2ggKFNDUklQVF9OQU1FKTogVXNlICJ2ODUwIiBub3QgImVsZiIuCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBXcmFwIHNjcmlwdCB3aXRoIGEgImNhdCA8PCBFT0YiLgotCi1XZWQgT2N0IDE2IDIzOjEwOjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogTmV3IGxpbmtlciBzY3JpcHQgZm9yIHRoZSBWODUwLgotCSogTWFrZWZpbGUuaW46IFVzZSBpdC4KLQotVGh1IE9jdCAxMCAxNzo1NzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaDogRGVmaW5lIF9ncCBpbiBPVEhFUl9HT1RfU1lNQk9MUywgbm90Ci0JT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TLgotCSogZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoOiBMaWtld2lzZS4KLQotV2VkIE9jdCAgOSAxNDozNjoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIHdhcm5fc2VjdGlvbl9hbGlnbiBmaWVsZC4KLQkqIGxleHN1cC5jIChPUFRJT05fV0FSTl9TRUNUSU9OX0FMSUdOKTogRGVmaW5lLgotCShsZF9vcHRpb25zKTogQWRkIC0td2Fybi1zZWN0aW9uLWFsaWduLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIC0td2Fybi1zZWN0aW9uLWFsaWduLgotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIHdhcm5fc2VjdGlvbl9hbGlnbiwgd2FybiBpZgotCXRoZSBzdGFydCBvZiBhIHNlY3Rpb24gY2hhbmdlcyBkdWUgdG8gYWxpZ25tZW50LgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS13YXJuLXNlY3Rpb24tYWxpZ24uCi0JKiBsZC50ZXhpbmZvOiBDaGFuZ2Ugc29tZSBzaW5nbGUgZGFzaGVzIHRvIGRvdWJsZSBkYXNoZXMuCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc2V0X3BlX3N1YnN5c3RlbSk6IFJlY29yZCBlbnRyeSBzeW1ib2wgZm9yIGVhY2gKLQlzdWJzeXN0ZW0gdHlwZS4gIElmZGVmIG91dCBvczIgdHlwZS4gIFJlY29nbml6ZSBhIHZlcnNpb24gbnVtYmVyLgotCi1UdWUgT2N0ICA4IDEyOjA3OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChzZXRfcGVfc3Vic3lzdGVtKTogV2hlbiBzZXR0aW5nIHRoZSBzdWJzeXN0ZW0KLQl0byB3aW5kb3dzLCBzZXQgdGhlIGVudHJ5IHBvaW50LgotCi0JKiBNYWtlZmlsZS5pbiAobGRsZXguYyk6IERvbid0IHBhc3MgYW55IG9wdGlvbnMgdG8gJChMRVgpLgotCi1Nb24gT2N0ICA3IDE3OjI5OjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IE1lbnRpb24gLnNvIGV4dGVuc2lvbnMgZm9yIHNoYXJlZAotCWxpYnJhcmllcy4KLQotU3VuIE9jdCAgNiAyMjozNTozNiAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnssbWlwcyxwcGN9LnNjOiBBZGQgRFdBUkYgMiBzZWN0aW9ucy4KLQotRnJpIE9jdCAgNCAxODo0OTozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBPbmx5IHNldCB0aGUgYWRkcmVzcyBvZiAudGV4dCBpZgotCVJFTE9DQVRJTkcuCi0KLUZyaSBPY3QgIDQgMTA6NTk6NTIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9zcGFyY2FvdXQuc2ggKHtCSUcsTElUVExFfV9PVVRQVVRfRk9STUFUKTogRGVmaW5lLgotCSogc2NyaXB0dGVtcGwvYW91dC5zYyAoe0JJRyxMSVRUTEV9X09VVFBVVF9GT1JNQVQpOiBQcm92aWRlIGRlZmF1bHQuCi0JKE9VVFBVVF9GT1JNQVQpOiBTdXBwb3J0IGJpLWVuZGlhbiB0YXJnZXRzLgotCi1UaHUgT2N0ICAzIDEzOjUyOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm5tYXRjaC5oLCBmbm1hdGNoLmM6IFJlbW92ZSAobm93IGluIGxpYmliZXJ0eSkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IFJlbW92ZSBmbm1hdGNoLmMuCi0JKEhGSUxFUyk6IFJlbW92ZSBmbm1hdGNoLmguCi0JKE9GSUxFUyk6IFJlbW92ZSBmbm1hdGNoLm8uCi0KLVRodSBPY3QgIDMgMTU6NDE6MjQgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogTW92ZSBjb25maWcubG9nIHRvIGRpc3RjbGVhbi4KLQotV2VkIE9jdCAgMiAyMzo0NToyNSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogZW11bHRtcGwvcGUuZW06IGluY3JlYXNlIHNpemUgb2Ygc3RhY2sgcmVzZXJ2ZSB0byAweDIwMDAwMDAKLSAgICAgICAgKG5lY2Vzc2FyeSBpbiBvcmRlciB0byBjb21waWxlIHBhcnNlLmMgaW4gZ2NjIHNvdXJjZXMgdW5kZXIgTlQpCi0KLVdlZCBPY3QgIDIgMTQ6NDk6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAobGRfb3B0aW9ucyk6IEZpeCB0eXBvIGluIC0tcnBhdGgtbGluayBkZXNjcmlwdGlvbi4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IFN1Z2dlc3QKLQktLXJwYXRoIGlmIGEgbmVlZGVkIGxpYnJhcnkgaXMgbm90IGZvdW5kLgotCi1UdWUgT2N0ICAxIDE2OjE3OjMzIDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgbWlwcyotKi1lbGYqLgotCi1UdWUgT2N0ICAxIDE1OjUwOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IEdpdmUgbW9yZSBkZXRhaWwgb24gLWwgb3B0aW9uLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBIYW5kbGUgQ1JFQVRFX1NITElCIHRoZSBzYW1lIHdheSB0aGF0Ci0JZWxmLnNjIGRvZXMsIHNvIHRoYXQgZ2xpYmMgd29ya3MgYmV0dGVyLgotCi0JKiBsZHZlci5jIChsZF9wcm9ncmFtX3ZlcnNpb24pOiBOZXcgdmFyaWFibGUuCi0JKGxkdmVyc2lvbik6IFVzZSBpdC4KLQkqIGxkdmVyLmggKGxkX3Byb2dyYW1fdmVyc2lvbik6IERlY2xhcmUuCi0JKiBsZXhzdXAuYyAobGRfb3B0aW9ucyk6IEhhbmRsZSAtLWRsbC12ZXJib3NlIGxpa2UgLS12ZXJib3NlLCBub3QKLQktLXZlcnNpb24uICBDaGFuZ2UgLS12ZXJzaW9uIGhhbmRsaW5nIHRvIG1hdGNoIGN1cnJlbnQgR05VCi0Jc3RhbmRhcmRzLgotCShoZWxwKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCi1Nb24gU2VwIDMwIDEyOjE0OjQzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChlbTMycmVsZi5jKTogQWRkIHJ1bGUgZm9yLgotCSogY29uZmlndXJlLnRndCAobTMyci0qLSopOiBSZWNvZ25pemUuCi0JKiBlbXVscGFyYW1zL20zMnJlbGYuc2g6IE5ldyBmaWxlLgotCi1UaHUgU2VwIDI2IDEzOjU4OjQ3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBBZGQgc3ltYm9saWMgZG91YmxlcXVvdGluZyB0byBsZG1haW4gY29tcGlsZSBlZGl0LgotCSogbXB3LWNvbmZpZy5pbjogQWRkIG1pcHMtKi0qIGNhc2UgYXMgbWlwcy1lbGYsIGFuZCB1c2UgbW9yZQotCXdpbGRjYXJkcyBpbiBtYXRjaGluZy4KLQkqIG1wdy1lbWlwc2VsZi5jOiBOZXcgZmlsZSwgcHJlZ2VuZXJhdGVkIG1pcHMgZWxmIGVtdWxhdGlvbi4KLQotVHVlIFNlcCAxNyAxMjoxODoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkaW50LnRleGluZm86IFJld3JvdGUuCi0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBjYXNlcyBmb3IgTUlQUyA1MDAwIGxpa2UgTUlQUyA0MzAwLgotCi1Nb24gU2VwIDE2IDE3OjU1OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogT25seSBkZWZpbmUgc3ltYm9scyBpZiBSRUxPQ0FUSU5HLiAgRml4Ci0Jc3ludGF4IGVycm9yIG9uIF9fZW5kX18gbGluZS4KLQotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogRm9yIC1OIG9yIC1uLCBkb24ndCBhbGlnbiAuZGF0YS4gIEZyb20KLSAJQ2hyaXMgSGFkbGV5IDxDaHJpc3RvcGhlci5IYWRsZXlAY2wuY2FtLmFjLnVrPgotCi1TdW4gU2VwIDE1IDIyOjA5OjU2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL3Y4NTAuc2g6IEZpeCBPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TLgotCi1TdW4gU2VwIDE1IDEwOjM4OjE2IDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcm1zL2QxMHYuc2g6IFNldCBPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TIHRvIHB1dAotCXN0YWNrIGF0IHRvcCBvZiBzaW11bGF0b3IgbWVtb3J5LgotCi1GcmkgU2VwIDEzIDE1OjQ5OjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsZXgubCAoU1lNQk9MQ0hBUk4pOiBBZGQgJCwgXywgYW5kIH4uCi0KLVdlZCBTZXAgMTEgMjM6MzA6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAoZ2V0X2VtdWxhdGlvbik6IENoZWNrIGZvciAtbWlwczQgbGlrZSAtbWlwczEsIGV0LiBhbC4KLQotVGh1IFNlcCAgNSAxNToyNDoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogQWNjZXB0IGEgbGFuZ19pbnB1dF9zdGF0ZW1lbnQKLQlhcyB0aGUgUFRSIGFyZ3VtZW50LiAgSWYgdGhlIGZpbGUgaXMgc3ltYm9scyBvbmx5LCBkaXNjYXJkIGFsbAotCWlucHV0IHNlY3Rpb25zLgotCShsZGxhbmdfYWRkX2ZpbGUpOiBQYXNzIGVudHJ5IHRvIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4KLQotV2VkIFNlcCAgNCAxNTo1Mzo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGFscGhhLSotZ251Kik6IE5ldyB0YXJnZXQuICBGcm9tIEZpbGEgS29sb2RueQotCTxmaWxhQGliaS5jb20+LgotCi1UdWUgU2VwICAzIDAwOjUyOjU0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL3Y4NTAuc2g6IFNldCBPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TCi0KLVN1biBTZXAgIDEgMjE6NDg6NTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvdjg1MC5zaDogU2V0IEVNQkVEREVELgotCi1GcmkgQXVnIDMwIDIyOjMwOjMwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL3Y4NTAuc2g6IEVudHJ5IHN5bWJvbCBpcyAiX3N0YXJ0IiwgdHdlYWsKLQljdG9yL2R0b3Igc3VwcG9ydC4KLQotRnJpIEF1ZyAzMCAxODozMjozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHNoLSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL3NoZWxmLnNoOiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvc2hsZWxmLnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlc2hlbGYubyBhbmQgZXNobGVsZi5vLgotCShlc2hlbGYuYywgZXNobGVsZi5jKTogTmV3IHRhcmdldHMuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IElmIEVNQkVEREVEIGlzIGRlZmluZWQsIHRoZW4gZG9uJ3QgYWRkCi0JU0laRU9GX0hFQURFUlMgdG8gVEVYVF9TVEFSVF9BRERSLiAgRXhwYW5kIENUT1JfU1RBUlQgYW5kIENUT1JfRU5ECi0JYXJvdW5kIC5jdG9ycywgYW5kIERUT1JfU1RBUlQgYW5kIERUT1JfRU5EIGFyb3VuZCAuZHRvcnMuICBFeHBhbmQKLQlPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TIGlmIFJFTE9DQVRJTkcuCi0KLVRodSBBdWcgMjkgMTY6NTc6NDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUue2hvc3QsdGd0fSAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0KLQlwcm8uCi0KLU1vbiBBdWcgMjYgMTI6NTg6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAoc2VjdGlvbik6IEFkZCBvcHRfbm9jcm9zc3JlZnM7IHBhc3MgdmFsdWUgdG8KLQlsYW5nX2VudGVyX292ZXJsYXkuCi0JKG9wdF9ub2Nyb3NzcmVmcyk6IE5ldyBub250ZXJtaW5hbC4KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBOT0NST1NTUkVGUyBrZXl3b3JkIGluIEVYUFJFU1NJT04gbW9kZS4KLQkqIGxkbGFuZy5jIChvdmVybGF5X25vY3Jvc3NyZWZzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobGFuZ19lbnRlcl9vdmVybGF5KTogQWRkIG5vY3Jvc3NyZWZzIHBhcmFtZXRlci4KLQkobGFuZ19sZWF2ZV9vdmVybGF5KTogT25seSBhZGQgbm9jcm9zc3JlZnMgaWYgb3ZlcmxheV9ub2Nyb3NzcmVmcwotCWlzIHNldC4gIEluaXRpYWxpemUgb3ZlcmxheV9ub2Nyb3NzcmVmcy4KLQkqIGxkbGFuZy5oIChsYW5nX2VudGVyX292ZXJsYXkpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBsZC50ZXhpbmZvIChPdmVybGF5cyk6IFVwZGF0ZSBkb2N1bWVudGF0aW9uLgotCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBQcmludCBHTlUgbGQgaW4gdGhlIHZlcnNpb24gbWVzc2FnZS4KLQotVGh1IEF1ZyAyMiAxNzoxMDo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSExERU5WLgotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIEhMREVOVi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChITERFTlYpOiBOZXcgdmFyaWFibGUuCi0JKCQoTERfUFJPRykpOiBVc2UgJChITERFTlYpLgotCi1UaHUgQXVnIDIyIDE2OjI5OjI4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGV2ODUwLmMpOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLnRndCAodjg1MC0qLSopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy92ODUwLnNoOiBOZXcgZmlsZS4KLQotVGh1IEF1ZyAyMiAxMToxNjowMiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIEBEQVNIX0NfRkxBR0AgdG8gY29tcGlsZXIgZWRpdC4KLQotV2VkIEF1ZyAyMSAxMToyNjozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUHV0IC5nbnUubGlua29uY2UqIHNlY3Rpb25zIGluIGFwcHJvcHJpYXRlCi0JY29udGFpbmluZyBzZWN0aW9ucy4KLQotTW9uIEF1ZyAxOSAxMzowMTo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZubWF0Y2guYzogSW5jbHVkZSBzeXNkZXAuaC4KLQotTW9uIEF1ZyAxOSAxMToyODoyOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGdlbnNjcmlwdHMuc2g6IFVuZG8gOC8xNiBjaGFuZ2UuCi0KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoTUFDSElORSk6IEV4cGxpY2l0bHkgc2V0IHRvIG5vdGhpbmcuCi0KLUZyaSBBdWcgMTYgMTk6MTg6MDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBnZW5zY3JpcHRzLnNoOiBFeHBsaWNpdGx5IHJlc2V0IGFueSBzaGVsbCB2YXJpYWJsZXMgc2V0IG9yIHVzZWQKLQlieSB0aGUgdmFyaW91cyAuc2Mgc2NyaXB0cyB0byBhbGxvdyBpbmFkdmVydGFudCB1c2Ugb2YgdGhlc2UKLQluYW1lcyBhcyBub3JtYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJ5IHRoZSBwZXJzb24gcnVubmluZwotCWNvbmZpZ3VyZS4KLQotCSogTWFrZWZpbGUuaW4gKGVkMTB2ZWxmLmMpOiBVc2UgdGRpcl9kMTB2LCBub3QgdGRpcl9hcmNlbGYuCi0KLUZyaSBBdWcgMTYgMTQ6MTU6NDEgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjIChfX2Jzc19zdGFydF9fLCBfX2Jzc19lbmRfXywKLSAJX19kYXRhX3N0YXJ0X18sIF9fZGF0YV9lbmRfXyk6IEFkZGVkIHRvIGtlZXAgaW4gc3luYy4gd2l0aCB0aGUKLSAJZGVmYXVsdCBBUk0gY3J0MC5zLiBBZGRlZCBfX0NUT1JfTElTVF9fIGFuZCBfX0RUT1JfTElTVF9fIHN1cHBvcnQuCi0KLVRodSBBdWcgIDggMTQ6MjQ6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGNyZWYuYyAoY2hlY2tfcmVsb2NfcmVmcyk6IElmIGluZm8tPnNhbWUsIGxvb2sgZm9yIGFueSBzeW1ib2wKLQlkZWZpbmVkIGluIGluZm8tPmRlZnNlYywgbm90IGp1c3QgdGhlIHNlY3Rpb24gc3ltYm9sLgotCi1XZWQgQXVnICA3IDE0OjQwOjQ4IDE5OTYgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBCRkRfTkVFRF9ERUNMQVJBVElPTiBvbiBzdHJzdHIgYW5kIHNicmsuCi0JKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUik6IE5ldyBtYWNyby4KLQkoTkVFRF9ERUNMQVJBVElPTl9TQlJLKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBzeXNkZXAuaCAoc3Ryc3RyKTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUi4KLQkqIGxkbWFpbi5jIChzYnJrKTogRGVjbGFyZSBpZiBIQVZFX1NCUksgYW5kCi0JTkVFRF9ERUNMQVJBVElPTl9TQlJLLgotCi0JKiBsZGxhbmcuYyAobGFuZ19yZWNvcmRfcGhkcnMpOiBDYXN0IHhtYWxsb2MgYW5kIHhyZWFsbG9jIHJldHVybi4KLQotTW9uIEF1ZyAgNSAxNjoyNjoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBPVkVSTEFZLgotCSogbGRncmFtLnk6IEFkZCBzZWN0aW9uX3BoZHIgZmllbGQgdG8gJXVuaW9uLgotCShzZWN0aW9uKTogSGFuZGxlIHBoZHJfb3B0IHJlc3VsdC4gIEFkZCBPVkVSTEFZIGNhc2UuCi0JKG9wdF9leHBfd2l0aG91dF90eXBlKTogTmV3IG5vbnRlcm1pbmFsLgotCShwaGRyX29wdCk6IFJldHVybiBsaXN0IG9mIHBoZHJzLgotCShvdmVybGF5X3NlY3Rpb24pOiBOZXcgbm9udGVybWluYWwuCi0JKiBsZGxhbmcuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogQWRkIHBoZHJzIHBhcmFtZXRlci4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGxhbmdfc2VjdGlvbl9pbl9waGRyKTogUmVtb3ZlLgotCShvdmVybGF5X3ZtYSwgb3ZlcmxheV9sbW4sIG92ZXJsYXlfbWF4KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHN0cnVjdCBvdmVybGF5X2xpc3QpOiBEZWZpbmUuCi0JKG92ZXJsYXlfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxhbmdfZW50ZXJfb3ZlcmxheSwgbGFuZ19lbnRlcl9vdmVybGF5X3NlY3Rpb24pOiBOZXcgZnVuY3Rpb25zLgotCShsYW5nX2xlYXZlX292ZXJsYXlfc2VjdGlvbiwgbGFuZ19sZWF2ZV9vdmVybGF5KTogTmV3IGZ1bmN0aW9ucy4KLQkqIGxkbGFuZy5oIChsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IFVwZGF0ZQotCWRlY2xhcmF0aW9uIGZvciBuZXcgcGFyYW1ldGVyLgotCShsYW5nX3NlY3Rpb25faW5fcGhkcik6IERvbid0IGRlY2xhcmUuCi0JKGxhbmdfZW50ZXJfb3ZlcmxheSwgbGFuZ19lbnRlcl9vdmVybGF5X3NlY3Rpb24pOiBEZWNsYXJlLgotCShsYW5nX2xlYXZlX292ZXJsYXlfc2VjdGlvbiwgbGFuZ19sZWF2ZV9vdmVybGF5KTogRGVjbGFyZS4KLQkqIGxkLnRleGluZm8gKE92ZXJsYXlzKTogTmV3IG5vZGUgdW5kZXIgU0VDVElPTlMsIGRvY3VtZW50aW5nCi0Jb3ZlcmxheXMuCi0KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBNQVggYW5kIE1JTi4KLQkqIGxkZ3JhbS55IChNQVgsIE1JTik6IE5ldyB0ZXJtaW5hbHMuCi0JKGV4cCk6IFJlY29nbml6ZSBNQVggYW5kIE1JTi4KLQkqIGxkZXhwLmMgKGZvbGRfYmluYXJ5KTogSGFuZGxlIE1BWCBhbmQgTUlOLgotCSogbGQudGV4aW5mbyAoQXJpdGhtZXRpYyBGdW5jdGlvbnMpOiBEb2N1bWVudCBNQVggYW5kIE1JTi4KLQotCSogbGQudGV4aW5mbyAoUEhEUlMpOiBVc2UgQGNpbmRleCwgbm90IEBraW5kZXgsIGZvciBwcm9ncmFtIGhlYWRlcgotCWluZGV4IGVudHJpZXMuCi0KLQkqIGxkZ3JhbS55IChTSVpFT0YsIEFERFIpOiBEbyBub3Qgc3BlY2lmeSB0eXBlLgotCi0JKiBsZGNyZWYuYyAoY2hlY2tfbm9jcm9zc3JlZik6IFNraXAgc3ltYm9scyB3aXRoIG5vIG91dHB1dAotCXNlY3Rpb25zLgotCi1GcmkgQXVnICAyIDE0OjU3OjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnkgKExPQURBRERSKTogTmV3IHRlcm1pbmFsLgotCShleHApOiBIYW5kbGUgTE9BREFERFIuCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgTE9BREFERFIuCi0JKiBsZGV4cC5jIChleHBfcHJpbnRfdG9rZW4pOiBBZGQgTE9BREFERFIuCi0JKGZvbGRfbmFtZSk6IEltcGxlbWVudCBMT0FEQUREUi4KLQkqIGxkbGFuZy5jIChleHBfaW5pdF9vcyk6IFRyZWF0IExPQURBRERSIGxpa2UgQUREUi4KLQkqIGxkLnRleGluZm8gKEFyaXRobWV0aWMgRnVuY3Rpb25zKTogRG9jdW1lbnQgTE9BREFERFIuCi0KLVRodSBBdWcgIDEgMTI6NTI6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChjaGVja19ub2Nyb3NzcmVmcyk6IERlY2xhcmUuCi0JKiBsZGxhbmcuaCAoc3RydWN0IGxhbmdfbm9jcm9zc3JlZik6IERlZmluZS4KLQkoc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMpOiBEZWZpbmUuCi0JKG5vY3Jvc3NyZWZfbGlzdCk6IERlY2xhcmUuCi0JKGxhbmdfYWRkX25vY3Jvc3NyZWYpOiBEZWNsYXJlLgotCSogbGRsZXgubDogUmVjb2duaXplIE5PQ1JPU1NSRUZTIGtleXdvcmQuCi0JKiBsZGdyYW0ueSAoJXVuaW9uKTogQWRkIG5vY3Jvc3NyZWYgZmllbGQuCi0JKE5PQ1JPU1NSRUZTKTogTmV3IHRlcm1pbmFsLgotCShpZmlsZV9wMSk6IFJlY29nbml6ZSBOT0NST1NTUkVGUy4KLQkobm9jcm9zc3JlZl9saXN0KTogTmV3IG5vbnRlcm1pbmFsLgotCSogbGRsYW5nLmMgKG5vY3Jvc3NyZWZfbGlzdCk6IERlZmluZS4KLQkobGFuZ19hZGRfbm9jcm9zc3JlZik6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbWFpbi5jIChtYWluKTogSWYgbm9jcm9zc3JlZl9saXN0IGlzIG5vdCBOVUxMLCBjYWxsCi0JY2hlY2tfbm9jcm9zc3JlZnMuCi0JKHdhcm5pbmdfY2FsbGJhY2spOiBGcmVlIHN5bWJvbHMgaWYgdGhlcmUgaXMgbm8gcGxhY2UgdG8gc3RvcmUKLQl0aGVtLgotCShub3RpY2UpOiBDYWxsIGFkZF9jcmVmIGlmIG5vY3Jvc3NyZWZfbGlzdCBpcyBub3QgTlVMTC4KLQkqIGxkY3JlZi5jOiBJbmNsdWRlICJsZGV4cC5oIiBhbmQgImxkbGFuZy5oIi4KLQkoY2hlY2tfbm9jcm9zc3JlZnMpOiBOZXcgZnVuY3Rpb24uCi0JKGNoZWNrX25vY3Jvc3NyZWYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdHJ1Y3QgY2hlY2tfcmVmc19pbmZvKTogRGVmaW5lLgotCShjaGVja19yZWZzLCBjaGVja19yZWxvY19yZWZzKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBsZC50ZXhpbmZvIChPcHRpb24gQ29tbWFuZHMpOiBEb2N1bWVudCBOT0NST1NTUkVGUy4KLQotCSogbGQudGV4aW5mbyAoU2VjdGlvbiBQbGFjZW1lbnQpOiBJbXByb3ZlIHRoZSB3b3JkaW5nIG9mIHRoZQotCXdpbGRjYXJkIGRvY3VtZW50YXRpb24uICBNZW50aW9uIHRoYXQgd2lsZGNhcmRzIGFyZSBvbmx5IHNlYXJjaGVkCi0JZm9yIG9uIHRoZSBjb21tYW5kIGxpbmUsIG5vdCBpbiB0aGUgZmlsZSBzeXN0ZW0uCi0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IE1vdmUKLQlkZWZpbml0aW9uIG9mIGxpYl9wYXRoIGluc2lkZSBjb25kaXRpb24gd2hlcmUgaXQgaXMgdXNlZC4KLQotV2VkIEp1bCAzMSAxMzoxNzoxMCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotIAkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaDogTm93IHdvcmtzIHdpdGggZWxmLnNjLgotCi1XZWQgSnVsIDMxIDExOjUyOjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFNDUklQVF9OQU1FKTogQ2hhbmdlIHRvIHZhbmlsbGEuCi0KLVR1ZSBKdWwgMzAgMTQ6NDY6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQWRkIHRoZSBzZWN0aW9uIFZNQSB0byB0aGUgcmVzdWx0Ci0JdmFsdWUgd2hlbiBjb21wdXRpbmcgdGhlIGFkZHJlc3Mgb2YgYSBzZWN0aW9uLgotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgY3JlZiBmaWVsZC4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogU2V0IGNvbW1hbmRfbGluZS5jcmVmLgotCSogbGRtYWluLmMgKG1haW4pOiBDaGVjayBjb21tYW5kX2xpbmUuY3JlZiByYXRoZXIgdGhhbgotCWxpbmtfaW5mby5ub3RpY2VfYWxsLgotCShub3RpY2UpOiBMaWtld2lzZS4KLQotCSogbGRjcmVmLmMgKG91dHB1dF9vbmVfY3JlZik6IERvbid0IGNyYXNoIGlmIGEgc3ltYm9sIGlzIGRlZmluZWQKLQlpbiBhIHNlY3Rpb24gd2l0aG91dCBhbiBvd25lci4KLQotTW9uIEp1bCAyOSAxNzoyMzozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZubWF0Y2guaCwgZm5tYXRjaC5jOiBOZXcgZmlsZXMuCi0JKiBsZGxleC5sOiBSZW1vdmUgdW51c2VkIGRlZmluaXRpb24gb2YgRklMRU5BTUUuICBBZGQgZGVmaW5pdGlvbgotCW9mIFdJTERDSEFSLiAgSW4gU0NSSVBUIG1vZGUsIGFjY2VwdCBhbnkgc2VxdWVuY2Ugb2YgV0lMRENIQVIgYXMgYQotCU5BTUUuCi0JKiBsZGdyYW0ueSAoZmlsZV9OQU1FX2xpc3QpOiBBY2NlcHQgJyonIGFuZCAnPycgc3BlY2lhbGx5LgotCShpbnB1dF9zZWN0aW9uX3NwZWMpOiBBY2NlcHQgJz8nIHNwZWNpYWxseS4KLQkoc3RhdGVtZW50KTogQ2hhbmdlIGV4cCB0byBtdXN0YmVfZXhwIGluIGxlbmd0aCBhbmQgRklMTCBjYXNlcy4KLQkoc2VjdGlvbik6IENhbGwgbGRsZXhfc2NyaXB0IGJlZm9yZSBzZWN0aW9uIHN0YXRlbWVudHMsIGFuZCBjYWxsCi0JbGRsZXhfcG9wc3RhdGUgYWZ0ZXIgdGhlbS4KLQkqIGxkbGFuZy5jOiBJbmNsdWRlICJmbm1hdGNoLmgiLgotCSh3aWxkY2FyZHApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh3aWxkX3NlY3Rpb24pOiBQZXJtaXQgdGhlIHNlY3Rpb24gbmFtZSB0byBiZSBhIHdpbGRjYXJkLgotCSh3aWxkX2ZpbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIHdpbGQuCi0JKHdpbGQpOiBDYWxsIHdpbGRfZmlsZS4gIFBlcm1pdCB0aGUgZmlsZSBuYW1lIHRvIGJlIGEgd2lsZGNhcmQuCi0JKG9wZW5faW5wdXRfYmZkcyk6IERvbid0IGNhbGwgbG9va3VwX25hbWUgZm9yIGEgd2lsZGNhcmQgcGF0dGVybi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKENGSUxFUyk6IEFkZCBmbm1hdGNoLmMuCi0JKEhGSUxFUyk6IEFkZCBmbm1hdGNoLmguCi0JKE9GSUxFUyk6IEFkZCBmbm1hdGNoLm8uCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCB0aGF0IGZpbGUgYW5kIHNlY3Rpb24gbmFtZXMgY2FuIG5vdyBiZQotCXdpbGRjYXJkIHBhdHRlcm5zLgotCi0JKiBsZGxhbmcuYyAobGFuZ19wbGFjZV9vcnBoYW5zKTogQ29ycmVjdCBjb25kaXRpb246IHBsYWNlIGEgY29tbW9uCi0Jc2VjdGlvbiBpZiBub3QgcmVsb2NhdGVhYmxlIG9yIGlmIGNvbW1vbiBkZWZpbml0aW9ucyBhcmUgZm9yY2VkLgotCi1XZWQgSnVsIDI0IDEyOjE2OjM4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFNDUklQVF9OQU1FKTogQ2hhbmdlIHRvIGVsZi4KLQotV2VkIEp1bCAyNCAxMzozODoyMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBjb25maWd1cmUudGd0IChkMTB2LSotKik6IERvbid0IHJlcXVpcmUgdGhlIC1lbGYsIGFsbG93IHBsYWluIGQxMHYuCi0KLVR1ZSBKdWwgMjMgMTA6MzY6MTkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChlZDEwdmVsZi5jKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS50Z3QgKGQxMHYtKi1lbGYqKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaDogTmV3IGZpbGUuCi0KLVRodSBKdWwgMTggMTY6MjU6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChzcGFyYyotKi1zeXN2NCopOiBOZXcgdGFyZ2V0LiAgRnJvbSBBbmRyZXcgR2llcnRoCi0JPEFORFJFV0dAbWljcm9saXNlLmNvLnVrPi4KLQotCSogY29uZmlndXJlLmhvc3Q6IENoYW5nZSBpcml4NSB0byBpcml4WzU2XSouCi0JKiBjb25maWd1cmUudGd0OiBMaWtld2lzZS4KLQotV2VkIEp1bCAxNyAxMDo1Mjo0NiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChzb3J0X3NlY3Rpb25zKTogUGF5IGF0dGVudGlvbiB0byByZXR1cm4gY29kZS4KLQotCSogbGRtaXNjLmMgKGRlbWFuZ2xlKTogUmVtb3ZlIGFsbCBwcmVmaXggJy4ncyBmcm9tIGEgbmFtZS4KLQotTW9uIEp1bCAxNSAxMTo0OTo0OSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSb3VuZAotIAl0aGUgdmFsdWUgb2YgX19zdGFydF9TRUNOQU1FIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgYnkgdGhlCi0gCXNlY3Rpb24gdG8gYmUgcGxhY2VkLgotCi1UdWUgSnVsICA5IDEyOjA5OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyplbC0qLWVsZiopOiBVc2UgZWxmMzJlbG1pcC4KLQkobWlwcyotKi1lbGYqKTogVXNlIGVsZjMyZWJtaXAuCi0JKiBlbXVscGFyYW1zL2VsZjMyYm1pcC5zaCAoRU1CRURERUQpOiBEb24ndCBkZWZpbmUuCi0JKiBlbXVscGFyYW1zL2VsZjMybG1pcC5zaCAoRU1CRURERUQpOiBEb24ndCBkZWZpbmUuCi0JKiBlbXVscGFyYW1zL2VsZjMyZWxtaXAuc2g6IE5ldyBmaWxlOyBjb3B5IG9mIGVsZjMybG1pcC5zaCB3aXRoCi0JRU1CRURERUQgZGVmaW5lZC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaDogTmV3IGZpbGU7IGNvcHkgb2YgZWxmMzJibWlwLnNoIHdpdGgKLQlFTUJFRERFRCBkZWZpbmVkLgotCSogZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoIChFTUJFRERFRCk6IERlZmluZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaCAoRU1CRURERUQpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMyZWJtaXAubyBlZWxmMzJlbG1pcC5vLgotCShlZWxmMzJlYm1pcC5jLCBlZWxmMzJlbG1pcC5jKTogTmV3IHRhcmdldHMuCi0KLVRodSBKdWwgIDQgMTI6MDE6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBTZXQgdmVyc2lvbiB0byBjeWdudXMtMi43LjEuCi0KLQkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KLQotCSogZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoOiBSZW5hbWUgZnJvbSBwYzUzMm1hY2hhb3V0LnNoIHRvIGF2b2lkCi0JU3lzdGVtIFYgZmlsZSBuYW1lIGxpbWl0YXRpb25zLgotCSogY29uZmlndXJlLnRndCAobmMzMmstcGM1MzItbWFjaCosIG5zMzJrLXBjNTMyLXV4Kik6IFVzZQotCXBjNTMybWFjaGEgcmF0aGVyIHRoYW4gcGM1MzJtYWNoYW91dC4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IENoYW5nZSBlcGM1MzJtYWNoYW91dC5vIHRvCi0JZXBjNTMybWFjaGEuby4KLQkoZXBjNTMybWFjaGEuYyk6IFJlbmFtZSB0YXJnZXQgZnJvbSBlcGM1MzJtYWNoYW91dC5jLgotCi1XZWQgSnVsICAzIDExOjQwOjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHByaW50X3BhZGRpbmdfc3RhdGVtZW50KTogVXNlICV1LCBub3QgJXgsIHRvIHByaW50Ci0JZmlsbCB2YWx1ZS4KLQotU3VuIEp1biAzMCAxMToxNjo0MyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1lcHBjbWFjLmM6IFVwZGF0ZSB0byByZWZsZWN0IE1heSAyMyBjaGFuZ2UgdG8gYWl4LmVtLgotCi1UaHUgSnVuIDI3IDE0OjAzOjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogUHV0IHRoZSAuc2EKLQlmaWxlIGp1c3QgYmVmb3JlIHRoZSAuc28gZmlsZSwgcmF0aGVyIHRoYW4ganVzdCBhZnRlci4KLQotCSogY29uZmlndXJlLmhvc3Q6IFVzZSAtcHJpbnQtZmlsZS1uYW1lPUZJTEUgcmF0aGVyIHRoYW4gcGlwaW5nCi0JLXByaW50LWxpYmdjYy1maWxlLW5hbWUgdGhyb3VnaCBzZWQuCi0JKGlbMzQ1XTg2Ki0qLXNjbyosIGlbMzQ1XTg2LSotaXNjKik6IENyZWF0ZSBjcnRiZWdpbi5vIGFuZAotCWNydGVuZC5vIGZpbGVzLCBpbiBjYXNlIGdjYyBkb2Vzbid0IHVzZSB0aGVtLgotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIGNydGJlZ2luLm8gYW5kIGNydGVuZC5vLgotCi1XZWQgSnVuIDI2IDE1OjU3OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyotZGVjLW9zZiopOiBOZXcgdGFyZ2V0LgotCi1UdWUgSnVuIDI1IDIyOjE1OjI5IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLAotCUlOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0JKGRvY2Rpcik6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCi0JKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gSnVuIDI0IDE4OjQ4OjE2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjIChfR0xPQkFMX09GRlNFVF9UQUJMRV8pOiBEb24ndCBkbyBhCi0JUFJPVklERSBvZiBfR0xPQkFMX09GRlNFVF9UQUJMRV8sIHNpbmNlIGl0IG5lZWRzIHRvIGJlIGF0IGEKLQlub24tZml4ZWQgbG9jYXRpb24uCi0KLU1vbiBKdW4gMjQgMTc6NTU6MzEgMTk5NiAgSm91a2UgTnVtYW4gIDxqbnVtYW5AYmF6aXMubmw+Ci0KLQkqIGxkbGFuZy5oIChlbnVtIHNlY3Rpb25fdHlwZSk6IERlZmluZS4KLQkobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSk6IFJlbW92ZSBsb2FkYWJsZSBmaWVsZC4gIEFkZAotCXNlY3R5cGUgZmllbGQuCi0JKGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogQ2hhbmdlIGZsYWdzIHBhcmFtZXRlciBpbgotCXByb3RvdHlwZSB0byBzZWN0eXBlLgotCSogbGRncmFtLnkgKHR5cGViaXRzKTogUmVtb3ZlLgotCShzZWN0eXBlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkob3B0X2F0KTogVXNlIHNlY3R5cGUgcmF0aGVyIHRoYW4gdHlwZWJpdHMuCi0JKHR5cGUpOiBTZXQgc2VjdHlwZSByYXRoZXIgdGhhbiB0eXBlYml0cy4KLQkoYXR5cGUpOiBMaWtld2lzZS4KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBEU0VDVCwgQ09QWSwgSU5GTywgYW5kIE9WRVJMQVkgaW4KLQlFWFBSRVNTSU9OIG1vZGUuCi0JKiBsZGxhbmcuYyAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwKTogU2V0IHNlY3R5cGUKLQlmaWVsZCByYXRoZXIgdGhhbiBsb2FkYWJsZSBmaWVsZC4KLQkod2lsZF9kb2l0KTogQ2hlY2sgc2VjdHlwZSByYXRoZXIgdGhhbiBsb2FkYWJsZS4KLQkobGFuZ19yZWNvcmRfcGhkcnMpOiBMaWtld2lzZS4KLQkobGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBSZW5hbWUgZmxhZ3MgcGFyYW1ldGVyIHRvCi0Jc2VjdHlwZS4gIFNldCBzZWN0eXBlIGZpZWxkIHJhdGhlciB0aGFuIGxvYWRhYmxlIGZpZWxkLiAgU2V0IGZsYWdzCi0JZmllbGQgYmFzZWQgb24gc2VjdHlwZS4KLQotTW9uIEp1biAyNCAxMjowMDozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRm9yY2UgLnN0YWIqIGFuZCAuY29tbWVudCBzZWN0aW9ucyB0byBzdGFydAotCWF0IDAuCi0KLQkqIGNvbmZpZ3VyZS5pbjogT24gYWxwaGEqLSotb3NmKiwgbGluayBhZ2FpbnN0IGxpYmJmZC5hIGlmIG5vdAotCXVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgotCi1GcmkgSnVuIDIxIDE3OjQwOjU2IDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG1lcmxpbi5nY3MucmVkc3RvbmUuYXJteS5taWw+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBzdXBwb3J0IGZvciAqLSotcnRlbXMqIGNvbmZpZ3VyYXRpb25zLgotCi1GcmkgSnVuIDIxIDEzOjA1OjUxIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWd1cmUudGd0IChhbHBoYS0qLWxpbnV4ZWNvZmYqKTogTmV3IHRhcmdldC4KLQkoYWxwaGEtKi1saW51eCopOiBVc2UgZWxmNjRhbHBoYS4KLQkqIGVtdWxwYXJhbXMvZWxmNjRhbHBoYS5zaDogTmV3IGZpbGUuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IElmIEVMRlNJWkUgaXMgbm90IHNldCwgc2V0IGl0IHRvIDMyLiAgVXNlCi0JJHtFTEZTSVpFfSByYXRoZXIgdGhhbiAzMiB3aGVuIGNhbGxpbmcgQkZEIHJvdXRpbmVzLgotCShob2xkX3JvZGF0YSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFVzZSBob2xkX3JvZGF0YSBmb3IgYQotCXJlYWRvbmx5IHNlY3Rpb24gdGhhdCBpcyBub3QgY29kZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IFNldCBob2xkX3JvZGF0YS4gIERvbid0IHVzZQotCWEgLnJlbCBzZWN0aW9uIHVubGVzcyBpdHMgYmZkX3NlY3Rpb24gZmllbGQgaXMgbm90IE5VTEwuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjY0YWxwaGEuby4KLQkoZWVsZjY0YWxwaGEuYyk6IE5ldyB0YXJnZXQuCi0KLUZyaSBKdW4gMjEgMTI6NDU6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogQ29ycmVjdCBoYW5kbGluZyBvZiAwIGluICVXIGNhc2UuCi0KLVRodSBKdW4gMjAgMTM6NTU6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIGVub3VnaCBzdXBwb3J0IHRvIHVuZGVyc3RhbmQgdGhlIGdjYyBzdnIzLmlmaWxlIHNjcmlwdDoKLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBCTE9DSyBhbmQgR1JPVVAgaW4gRVhQUkVTU0lPTiBjb250ZXh0LiAgQWRkCi0JQklORCBrZXl3b3JkLgotCSogbGRncmFtLnk6IEFkZCBCSU5EIHRva2VuLgotCShzZWN0aW9uKTogUmVjb2duaXplIEdST1VQLgotCShvcHRfZXh0X3dpdGhfdHlwZSk6IFJlY29nbml6ZSBhIGNvdXBsZSBvZiBjYXNlcyBvZiBCSU5ELgotCSogbGRsYW5nLmMgKGluaXRfb3MpOiBEb24ndCBkbyBhbnl0aGluZyBpZiBzZWN0aW9uIGlzIGFscmVhZHkKLQlpbml0aWFsaXplZC4gIENhbGwgZXhwX2luaXRfb3Mgb24gYWRkcl90cmVlIGZpZWxkLgotCShleHBfaW5pdF9vcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMpOiBDYWxsIGV4cF9pbml0X29zIG9uIGFzc2lnbm1lbnQKLQlleHByZXNzaW9uLgotCShsYW5nX3BsYWNlX29ycGhhbnMpOiBDaGVjayBmb3IgY29tbW9uIHNlY3Rpb25zIGJ5IG5hbWUgQ09NTU9OCi0JcmF0aGVyIHRoYW4gYnkgY29tbW9uX3NlY3Rpb24gZmllbGQuICBEb24ndCB3YXJuIGFib3V0IGFic2VuY2Ugb2YKLQlbQ09NTU9OXSBjb21tYW5kLgotCi0JKiBsZGxhbmcuaCAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSk6IFJlbW92ZSB1c2VsZXNzIGZpZWxkcwotCWNvbW1vbl9zZWN0aW9uLCBjb21tb25fb3V0cHV0X3NlY3Rpb24sIGFuZCBjb21wbGFpbmVkLCBhcyB3ZWxsIGFzCi0JYWxsIHJlZmVyZW5jZXMgdG8gdGhlbS4KLQotCSogbGRleHAuYzogUmVpbmRlbnQgYSBsb3Qgb2YgY29kZS4KLQkoZXhwX2ZvbGRfdHJlZSk6IENhbGwgRkFJTCByYXRoZXIgdGhhbiBlaW5mbyBpbiBkZWZhdWx0IGNhc2UuCi0KLVdlZCBKdW4gMTkgMTE6NDA6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdCAobTg4Ki0qLWRndXgqKTogUXVvdGUgSE9TVElOR19DUlQwLiAgRnJvbQotCTxyYW5kYWxsLmhyb25AbWVkYXBoaXMuY29tPi4KLQotVHVlIEp1biAxOCAxNTo1MzowOSAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvaDgzMDBzLnNjOiBOZXcgZmlsZSBmb3IgSDgvUy4KLQkqIGVtdWxwYXJhcm1zL2g4MzAwcy5zaDogTmV3IGZpbGUgZm9yIEg4L1MuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgSDgvUy4KLQkoZV9oODMwMHMuYyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0JKiBjb25maWd1cmUudGd0OiBBZGQgSDgvUyB0byB0YXJnX2V4dHJhX2VtdWxzLgotCi1UdWUgSnVuIDE4IDE3OjU1OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaVszNDVdODYqLSotaXNjKik6IE5ldyB0YXJnZXQuICBGcm9tCi0JPHVkZGVib3JnQGNhcm1lbi5zZT4uCi0KLVdlZCBKdW4gMTIgMTI6NDY6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotIAkocGFyc2VfYXJncyk6IENvcHkgdGhlIC1ZIGFyZ3VtZW50IGludG8gbWVtb3J5LgotIAkoc2V0X2RlZmF1bHRfZGlybGlzdCk6IERvbid0IHB1dCB0aGUgJzonIGJhY2sgaW50byB0aGUgZGlyZWN0b3J5Ci0JbGlzdC4KLQotRnJpIEp1biAgNyAxMToyNzo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIHRvIGFkZAotCUxEX0xJQlJBUllfUEFUSCB0byB0aGUgbGlzdCBvZiBzZWFyY2ggZGlyZWN0b3JpZXMuCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IEFkZCBuZXcgc2V0X3N5bWJvbHMgcm91dGluZS4KLQotVGh1IEp1biAgNiAxMTo1MDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJibWlwLnNoIChPVEhFUl9HT1RfU1lNQk9MUyk6IFVzZSBBTElHTigxNikKLQlyYXRoZXIgdGhhbiAuIHdoZW4gY29tcHV0aW5nIF9ncCB2YWx1ZS4gIEZyb20gUGVyIEZvZ2Vsc3Ryb20uCi0JKiBlbXVscGFyYW1zL2VsZjMybG1pcC5zaCAoT1RIRVJfR09UX1NZTUJPTFMpOiBMaWtld2lzZS4KLQotCSogbGRtYWluLmMgKG1haW4pOiBEb24ndCBjbG9zZSBhbmQgdW5saW5rIHRoZSBmaWxlIG9uIGVycm9yLCBzaW5jZQotCXJlbW92ZV9vdXRwdXQgd2lsbCBkbyBpdCBhbnlob3cuCi0JKiBsZGxhbmcuYyAob3Blbl9vdXRwdXQpOiBTZXQgYm9vbGVhbiB2YXJpYWJsZSB0byB0cnVlLCBub3QgMS4KLQotV2VkIEp1biAgNSAxODozNDoxNCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGVtdWxwYXJhbXMve2VsZjMyYjQzMDAuc2gsZWxmMzJsNDMwMC5zaH0gKFNDUklQVF9OQU1FKTogVXNlCi0JZWxmbWlwcyBpbnN0ZWFkIG9mIGVsZi4KLQotVHVlIEp1biAgNCAxODo0MzowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkY3JlZi5jOiBOZXcgZmlsZS4KLQkqIGxkLmggKGFkZF9jcmVmLCBvdXRwdXRfY3JlZik6IERlY2xhcmUuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbm90aWNlX2FsbCBmaWVsZC4gIElmIGl0IGlzIHNldCBhdAotCWVuZCBvZiBsaW5rLCBjYWxsIG91dHB1dF9jcmVmLgotCShub3RpY2UpOiBSZW5hbWUgZnJvbSBub3RpY2VfeXN5bS4gIENoZWNrIG5vdGljZV9hbGwuCi0JKiBsZG1pc2MuYyAoZmluZm8pOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKiBsZG1pc2MuaCAoZmluZm8pOiBEZWNsYXJlLgotCSogbGV4c3VwLmMgKE9QVElPTl9DUkVGKTogRGVmaW5lLgotCShsZF9vcHRpb25zKTogQWRkICJjcmVmIi4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSBPUFRJT05fQ1JFRi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIGxkY3JlZi5jLgotCShPRklMRVMpOiBBZGQgbGRjcmVmLm8uCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLWNyZWYuCi0KLVR1ZSBKdW4gIDQgMTI6MTI6MjUgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjc2szLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogTWFrZSAkKHRvb2xkaXIpIGFuZCAkKHRvb2xkaXIpL2Jpbi4KLQotRnJpIE1heSAzMSAxMjo0MDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc29ydF9zZWN0aW9ucyk6IERvbid0IGFzc3VtZSB0aGF0IGEKLQl3aWxkX3N0YXRlbWVudCBoYXMgYSBzZWN0aW9uIG5hbWUuCi0KLVdlZCBNYXkgMjkgMTM6MTM6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBRdW90ZSB0ZXN0IC16IGFyZ3VtZW50LgotCi0JKiBsZC50ZXhpbmZvOiBDbGFyaWZ5IHRoZSBDT05TVFJVQ1RPUlMgY29tbWFuZC4KLQotVGh1IE1heSAyMyAxNjowNzo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSk6IEluaXRpYWxpemUKLQlmaWxlLCBub3QgaW1wZmlsZS4KLQotV2VkIE1heSAyMiAxMTozMTozMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IERvbid0IGNvcHkgb3ZlciBTRUNfTElOS197T05DRSxEVVBMSUNBVEVTfQotCWlmIGZpbmFsIGxpbmsuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNmdW5jKTogUmVuYW1lZCB0byBzb3J0X2J5X2ZpbGVfbmFtZS4KLQkoc29ydF9ieV9zZWN0aW9uX25hbWUsIHNvcnRfc2VjdGlvbnNfMSk6IE5ldyBmdW5jdGlvbnMuCi0JKHNvcnRfc2VjdGlvbnMpOiBPbmx5IHNvcnQgYnkgZmlsZSBuYW1lIHNlY3Rpb25zIGluIC5pZGF0YS4KLQlBZGQgIkdyb3VwZWQgU2VjdGlvbnMiIHN1cHBvcnQuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJld3JpdGUgdG8gc3VwcG9ydCBHcm91cGVkCi0JU2VjdGlvbnMuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBEZWxldGUuCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYyAoLnRleHQsLmRhdGEsLnJkYXRhKTogQWRkICooLmZvb1wkKS4KLQkoLkNSVCwucnNyYyk6IFJld3JpdGUgdG8gdXNlIEdyb3VwZWQgU2VjdGlvbiBzdXBwb3J0LgotCi1UdWUgTWF5IDIxIDE0OjMxOjQ4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWVwcGNtYWMuYzogVXBkYXRlIHRvIHJlZmxlY3QgY2hhbmdlcyB0byBhaXguZW0uCi0KLVN1biBNYXkgMTkgMTY6NTk6NDQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChkcHJpbnRfc3RhdGVtZW50KTogU3RvcCBwcmludGluZyBhdCBlbmQgb2YgbGlzdC4KLQotU2F0IE1heSAxOCAxMzoxMjowNSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JU3VwcG9ydCBmb3IgLS1mb3JjZS1leGUtc3VmZml4Ci0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgZm9yY2VfZXhlX3N1ZmZpeC4KLQkqIGxkLnRleGluZm86IEFkZCBkb2N1bWVudGF0aW9uLgotCSogbGRtYWluLmMgKG1haW4pOiAgQWRkIHN1cHBvcnQgZm9yIG9wdGlvbi4KLQkqIGxleHN1cC5jIChPUFRJT05fRk9SQ0VfRVhFX1NVRkZJWCk6IE5ldy4KLQkobGRfb3B0aW9ucywgcGFyc2VfYXJncyk6ICBBZGQgc3VwcG9ydCBmb3Igb3B0aW9uLgotCi1XZWQgTWF5IDE1IDEyOjUwOjI1IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChzZXRfcGVfdmFsdWUpOiBQYXNzIDAgbm90IDE2IHRvIHN0cnRvdWwgY2FsbC4KLQotRnJpIE1heSAxMCAxNjoyODo0NCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoX19zdGFjayk6IE1ha2UgX19zdGFjayAwIGlmIGl0IHdhcwotCXJlZmVyZW5jZWQgYnV0IG5vdCBkZWZpbmVkLgotCi1UaHUgTWF5ICA5IDA4OjUyOjIzIDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMve2VsZjMyYm1pcC5zaCxlbGYzMmxtaXAuc2gsbWlwc2lkdC5zaCxtaXBzaWR0bC5zaH06Ci0JU2V0IGEgbmV3IHZhcmlhYmxlIHRvIHNpZ25pZnkgaWYgdGhlIGZpbmFsIHRhcmdldCBpcyBhbiBlbWJlZGRlZAotCXN5c3RlbS4KLQkqIHNjcmlwdHRlbXBsL3ttaXBzLnNjLGVsZm1pcHMuc2N9OiBEb24ndCBhZGQgU0laRU9GX0hFQURFUlMgdG8KLQkudGV4dCBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtLgotCi1UdWUgTWF5ICA3IDEwOjU2OjExIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBOZXcgZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGhvbGRfe3NlY3Rpb24sdXNlLHRleHQscmRhdGEsZGF0YX0pOiBOZXcgc3RhdGljIGxvY2Fscy4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogVXBkYXRlIG9ycGhhbiBmaWVsZC4KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBXaGl0ZXNwYWNlIGNsZWFudXAuICBTZW1pY29sb24gdXNhZ2UgY2xlYW51cC4KLQkoSU5JVCxGSU5JKTogRGVsZXRlLCB1bnVzZWQuCi0JKC50ZXh0KTogRG9jdW1lbnQgb3JwaGFuIC50ZXh0LmZvbyBzZWN0aW9ucy4KLQkoLnJkYXRhKTogRG9jdW1lbnQgb3JwaGFuIC5yZGF0YS5mb28gc2VjdGlvbnMuCi0JKC5kYXRhKTogRG9jdW1lbnQgb3JwaGFuIC5kYXRhLmZvbyBzZWN0aW9ucy4KLQotVHVlIE1heSAgNyAxMTozNTo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBQbGFjZSAiLnRpbnkiIHNlY3Rpb25zIHJpZ2h0Ci0JYWZ0ZXIgIi5kYXRhIiBzZWN0aW9ucy4KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogUGxhY2UgIi50aW55IiBzZWN0aW9ucyBpbnRvCi0JdGhlICJ0aW55IiBtZW1vcnkgcmVnaW9uLCAweGZmODAwMCB0aHJvdWdoIDB4ZmZmZjAwLgotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogU2V0IHRoZSBlbnRyeSBwb2ludCB0byB0aGUgdmFsdWUgb2YKLQkiX3N0YXJ0IiByYXRoZXIgdGhhbiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VnbWVudC4KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogTGlrZXdpc2UuCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBQbGFjZSAucm9kYXRhIHNlY3Rpb25zIGJlZm9yZSAudGV4dAotCXNlY3Rpb25zIGluIG1haW4gcmFtLgotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBMaWtld2lzZS4KLQotTW9uIE1heSAgNiAyMzozMjozMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogVXNlICJlaWdodCIsIG5vdCAiZWlnaHRiaXQiIGZvciB0aGUKLQk4LWJpdCByZWdpb24gYW5kIDgtYml0IHNlY3Rpb25zLgotCi1XZWQgTWF5ICAxIDE3OjUwOjA2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogRml4IHR5cG9zLgotCi1Nb24gQXByIDI5IDIwOjMxOjA2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjICguZW5kanVuayk6IERlZmluZSBfX2VuZF9fLgotCi1Nb24gQXByIDI5IDE3OjA1OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxvbmdlc3Rfc2VjdGlvbl9uYW1lKTogUmVtb3ZlLgotCShTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCk6IERlZmluZS4KLQkocHJpbnRfc2l6ZSwgcHJpbnRfYWxpZ25tZW50LCBwcmludF9maWxsLCBwcmludF9zZWN0aW9uKTogUmVtb3ZlLgotCShwcmludF9mbGFncyk6IFJlbW92ZS4KLQkobGFuZ19tYXApOiBSZXdyaXRlLgotCShwcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBSZXdyaXRlLgotCShwcmludF9hc3NpZ25tZW50KTogUmV3cml0ZS4KLQkocHJpbnRfb25lX3N5bWJvbCk6IFJld3JpdGUuCi0JKHByaW50X2lucHV0X3NlY3Rpb24pOiBSZXdyaXRlLgotCShwcmludF9maWxsX3N0YXRlbWVudCk6IFJld3JpdGUuCi0JKHByaW50X2RhdGFfc3RhdGVtZW50KTogUmV3cml0ZS4KLQkocHJpbnRfYWRkcmVzc19zdGF0ZW1lbnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcmludF9yZWxvY19zdGF0ZW1lbnQpOiBSZXdyaXRlLgotCShwcmludF9wYWRkaW5nX3N0YXRlbWVudCk6IFJld3JpdGUuCi0JKHByaW50X3dpbGRfc3RhdGVtZW50KTogUmV3cml0ZS4KLQkocHJpbnRfc3RhdGVtZW50X2xpc3QpOiBDbGVhbiB1cC4KLQkocHJpbnRfc3RhdGVtZW50KTogQ2xlYW4gdXAuICBTb21lIG1pbm9yIG91dHB1dCBjaGFuZ2VzLgotCShwcmludF9zdGF0ZW1lbnRzKTogQ2xlYW4gdXAuCi0JKGxvYWRfc3ltYm9scyk6IFB1dCBhbm90aGVyIC0gYmVmb3JlIC13aG9sZS1hcmNoaXZlLgotCSogbGRleHAuYyAoZXhwX3ByaW50X3RyZWUpOiBDaGFuZ2UgZXRyZWVfdmFsdWUgYW5kIGV0cmVlX3JlbCB0bwotCXByaW50IDB4IGFuZCB0byBvbWl0IGxlYWRpbmcgemVyb2VzLiAgRm9yIGV0cmVlX3JlbCwgdXNlICVCIHRvCi0JcHJpbnQgdGhlIEJGRC4gIEZvciBldHJlZV9hc3NpZ24sIHJlbW92ZSB0aGUgc3BhY2UgYWZ0ZXIgdGhlCi0JZGVzdGluYXRpb24gbmFtZS4KLQkqIGxkd3JpdGUuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotCShjbG9uZV9zZWN0aW9uKTogQ2FsbCB4c3RyZHVwLCBub3Qgc3RyZHVwLgotCShsZHdyaXRlKTogRG9uJ3QgcHJpbnQgYW55IG1hcCBpbmZvcm1hdGlvbi4KLQkocHJpbnRfc3ltYm9sX3RhYmxlLCBwcmludF9maWxlX3N0dWZmLCBwcmludF9zeW1ib2wpOiBSZW1vdmUuCi0JKiBsZG1haW4uYyAobWFpbik6IENhbGwgbGFuZ19tYXAgd2hlbiBhcHByb3ByaWF0ZS4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBBZGQgc3VwcG9ydCBmb3IgJVcuCi0JKHByaW50X2FkZHJlc3MpOiBSZW1vdmUuCi0JKiBsZG1pc2MuaCAocHJpbnRfYWRkcmVzcyk6IERvbid0IGRlY2xhcmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLU1vbiBBcHIgMjkgMTA6Mjk6MDcgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtNjgqLSotbGludXgqKTogQWRkIC1keW5hbWljLWxpbmtlciB0bwotIAlIT1NUSU5HX0NSVDAuICBTZWFyY2ggLWxnY2MgYm90aCBiZWZvcmUgYW5kIGFmdGVyIC1sYyBpbgotIAlIT1NUSU5HX0xJQlMuICBMb29rIGZvciBjcnR7YmVnaW4sZW5kfS5vIGluIHRoZSBjb21waWxlciBkaXJlY3RvcnkKLSAJYXQgZmlyc3QuCi0JKGlbMzQ1XTg2LSotbGludXgqKTogTG9vayBmb3IgY3J0e2JlZ2luLGVuZH0ubyBpbiB0aGUgY29tcGlsZXIKLQlkaXJlY3RvcnkgYXQgZmlyc3QuCi0KLUZyaSBBcHIgMjYgMTQ6NDI6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1pc2MuaCAoZGVtYW5nbGUpOiBEZWNsYXJlLgotCSogbGRtaXNjLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4gIEluY2x1ZGUgZGVtYW5nbGUuaCB3aXRoICIiLAotIAlub3QgPD4uCi0JKGRlbWFuZ2xlKTogTWFrZSBub24tc3RhdGljLiAgUmVtb3ZlIHJlbW92ZV91bmRlcnNjb3JlIHBhcmFtdGVyLgotCUFsd2F5cyByZXR1cm4gYW4gYWxsb2NhdGVkIHN0cmluZy4KLQkodmZpbmZvKTogRnJlZSByZXN1bHQgb2YgZGVtYW5nbGUuICBBZGQgY2FzZSAnRycuICBVc2UgJVQgdG8gcHJpbnQKLQlmdW5jdGlvbm5hbWUsIHJhdGhlciB0aGFuIGNhbGxpbmcgZGVtYW5nbGUuICBQcmludCBhIGNvbG9uIGJldHdlZW4KLQl0aGUgQkZEKHNlY3Rpb24rb2Zmc2V0KSBhbmQgdGhlIGxpbmUgbnVtYmVyLgotCSogbGRtYWluLmMgKGFkZF9hcmNoaXZlX2VsZW1lbnQpOiBJbXByb3ZlIGZvcm1hdCBvZiBhcmNoaXZlCi0JaW5mb3JtYXRpb24gaW4gbWFwIGZpbGUuCi0JKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogRG9uJ3QgcHJpbnQgYW55dGhpbmcgdG8gdGhlIG1hcCBmaWxlLgotCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IEltcHJvdmUgZm9ybWF0IG9mIGNvbW1vbiBzeW1ib2wKLQlpbmZvcm1hdGlvbiBpbiBtYXAgZmlsZS4KLQkqIGxkY3Rvci5jIChsZGN0b3JfYnVpbGRfc2V0cyk6IElmIHByb2R1Y2luZyBhIG1hcCBmaWxlLCBwcmludCBzZXQKLQlpbmZvcm1hdGlvbi4KLQkqIGxkd3JpdGUuYyAocHJpbnRfc3ltYm9sX3RhYmxlKTogUHJpbnQgYSBuZXdsaW5lIGJlZm9yZSB0aGUKLQloZWFkZXIgaW4gdGhlIG1hcCBmaWxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogUmVpbmRlbnQuCi0KLU1vbiBBcHIgMjIgMTI6MDc6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogSWYgX2Nvb2tlZF9zaXplIGlzIG5vdCAwLCB0aGVuCi0JZG9uJ3QgY2xvYmJlciBpdCB3aGVuIG5vdCByZWxheGluZy4KLQotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBSZW1vdmUgdHJhZGl0aW9uYWxfZm9ybWF0IGZpZWxkLgotCSogbGRtYWluLmMgKG1haW4pOiBVc2UgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCByYXRoZXIgdGhhbgotCWNvbmZpZy50cmFkaXRpb25hbF9mb3JtYXQuCi0JKiBsZGxhbmcuYyAobGRsYW5nX29wZW5fb3V0cHV0KTogTGlrZXdpc2UuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IExpa2V3aXNlLgotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IExpa2V3aXNlLgotCSogbXB3LWVwcGNtYWMuYyAoZ2xkcHBjbWFjb3NfcGFyc2VfYXJncyk6IExpa2V3aXNlLgotCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogRGlzY2FyZCBkZWJ1Z2dpbmcgc2VjdGlvbnMgaWYgd2UgYXJlCi0Jc3RyaXBwaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQotCSogZW11bHBhcmFtcy96ODAwMi5zaCAoQVJDSCk6IFNldCB0byB6ODAwMiwgbm90IHo4ay4KLQotVHVlIEFwciAxNiAxNjozODozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZXhwLmMgKGZvbGRfYmluYXJ5KTogQ29ycmVjdCBoYW5kbGluZyBvZiBzdWJ0cmFjdGlvbiB3aXRoCi0JYWJzb2x1dGUgdmFsdWVzLgotCShmb2xkX25hbWUpOiBQZXJtaXQgc3ltYm9scyBpbiBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bS4KLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogT25seSBQUk9WSURFIF9fc3RhY2sgd2hlbiBSRUxPQ0FUSU5HLiAgVW5kbwotCWFjY2lkZW50YWwgY2hhbmdlcyBpbiBsYXN0IHBhdGNoLgotCi1UdWUgQXByIDE2IDEwOjI1OjQyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAocG93ZXJwYyotKi17c3lzdixsaW51eH0pOiBBZGQgYWxpYXNlcy4KLQkocG93ZXJwY2xlKi0qLXtzeXN2LHNvbGFyaXN9KTogRGl0dG8uCi0KLU1vbiBBcHIgMTUgMTQ6NTA6NTYgMTk5NiAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogQWRkIFBST1ZJREUgKF9fc3RhY2sgPSAwKSBzbyBJIGNhbiB1c2UgaXQKLQlpbiBtNjhrL2NydDAuUyB3aXRob3V0IHRoaW5ncyBibG93aW5nIHVwLgotCi1GcmkgQXByIDEyIDE2OjQwOjU2IDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBSZW1vdmUgZGVmYXVsdCBhZGRyZXNzIGZvciAuZGF0YSBzbwotCS50ZXh0LCAuZGF0YSwgYW5kIC5ic3MgYXJlIGFsbCBzZXF1ZW50aWFsLgotCi1UaHUgQXByIDExIDEyOjA1OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2M6IFJlbW92ZSByZWdpb25zIGFuZCBzaW1wbGlmeS4KLQotV2VkIEFwciAxMCAxNDo0MTo1MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBBZGQgdGhlICI4LWJpdCBhcmVhIiBpbiB0aGUgdXBwZXIgMjU2Ci0JYnl0ZXMgb2YgdGhlIGFkZHJlc3Mgc3BhY2UuICBQdXQgZGF0YSBmcm9tIHRoZSAiLmVpZ2h0IiBzZWN0aW9ucwotCWludG8gdGhlIDgtYml0IGFyZWEuCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IExpa2V3aXNlLgotCi1UdWUgQXByICA5IDE0OjEwOjQyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9nZW5lcmljLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOgotCVBhc3MgJEFSQ0ggdG8gbGRmaWxlX3NldF9vdXRwdXRfYXJjaCBpbnN0ZWFkIG9mIHNldHRpbmcKLQlsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSBkaXJlY3RseS4KLQotVHVlIEFwciAgOSAxNDoyMjoxNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoLmluaXQsLmZpbmkpOiBQdXQgLmluaXQsIC5maW5pIHNlY3Rpb24KLQluZXh0IHRvIC50ZXh0LiAgUHV0IF9ldGV4dCBhZnRlciAudGV4dCwgLmluaXQsIC5maW5pLCBhbmQKLQkucm9kYXRheywyfSBzZWN0aW9ucy4KLQotVHVlIEFwciAgOSAxMjoxODo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm86IFJlYXJyYW5nZSBvcHRpb24gZG9jdW1lbnRhdGlvbi4KLQotCSogbGV4c3VwLmMgKGxkX29wdGlvbnMpOiBOZXcgc3RhdGljIGFycmF5LgotCShwYXJzZV9hcmdzKTogQnVpbGQgc2hvcnRvcHRzIGFuZCBsb25nb3B0cyBmcm9tIGxkX29wdGlvbnMgYXJyYXkuCi0JKGhlbHApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogbGR2ZXIuaCAoaGVscCk6IERvbid0IGRlY2xhcmUuCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBSZWluZGVudC4KLQkoaGVscCk6IFJlbW92ZS4KLQotCSogbGQudGV4aW5mbywgbGQuMTogTWVudGlvbiAtRSBhcyBhIHN5bm9ueW0gZm9yIC1leHBvcnQtZHluYW1pYy4KLQotTW9uIEFwciAgOCAxMTo1NjoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogV2hlbiBjaGVja2luZyBmb3IgYSBuYXRpdmUgZW11bGF0aW9uLCBjaGVjawotCXRoYXQgdGhlIGN1cnJlbnQgZW11bGF0aW9uIGlzIHRoZSBkZWZhdWx0IGVtdWxhdGlvbi4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgotCWRpcmVjdG9yaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFkZCAtRSBhcyBhIHN5bm9ueW0gZm9yIC1leHBvcnQtZHluYW1pYywKLQlmb3IgSFAvVVggY29tcGF0aWJpbGl0eS4KLQotRnJpIEFwciAgNSAxNDozMDoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZik6IE5ldwotCXN0YXRpYyBmdW5jdGlvbiwgaWYgJHtob3N0fSA9ICR7dGFyZ2V0fS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IENhbGwgY2hlY2tfbGRfc29fY29uZiB0byBmaW5kIGEKLQluZWVkZWQgc2hhcmVkIGxpYnJhcnkgaWYgJHtob3N0fSA9ICRbdGFyZ2V0fS4KLQotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LSotbGludXgqKTogQWRkIC1keW5hbWljLWxpbmtlciB0bwotCUhPU1RJTkdfQ1JUMC4gIFNlYXJjaCAtbGdjYyBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgLWxjIGluCi0JSE9TVElOR19MSUJTLgotCi0JKiBjb25maWd1cmUudGd0OiBBZGQgaVszNDVdODYtKi1mcmVlYnNkZWxmKiB0YXJnZXQ7IGZyb20gSm9obgotCVBvbHN0cmEgPGpkcEBwb2xzdHJhLmNvbT4uCi0KLUZyaSBBcHIgIDUgMTg6MTE6MjUgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBlbXVscGFyYW1zL2VsZjMye2IsbH00MzAwLnNoIChNQUNISU5FKTogQWRkIGV4cGxpY2l0Ci0gCWFyY2hpdGVjdHVyZSBudW1iZXIuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFVzZSAkTUFDSElORSBkZWZpbml0aW9uIGlmIHByZXNlbnQuCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogRm9yY2UgNDEwMCBidWlsZCB0byB1c2Ugc2FtZQotIAl0ZW1wbGF0ZSBhcyA0MzAwLgotCi1Nb24gQXByICAxIDE3OjM1OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENoYW5nZSByZWdpb24gY2hlY2sgdG8gaGFuZGxlCi0JcmVnaW9ucyB3aGljaCBlbmQgYXQgdGhlIGhpZ2hlc3QgcG9zc2libGUgYWRkcmVzcyBjb3JyZWN0bHkuCi0JRnJvbSBSb2xhbmQgV2ViZXIgPHJvd2ViZXJAaXJhLnVrYS5kZT4uCi0KLQkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkod2lsZF9kb2l0KTogRGlzY2FyZCBzZWN0aW9ucyB3aXRoIFNFQ19FWENMVURFIHNldCBpZiBub3QgZG9pbmcgYQotCXJlbG9jYXRlYWJsZSBsaW5rLiAgRG9uJ3Qgd29ycnkgYWJvdXQgc2VjdGlvbiBiZWluZyBOVUxMLCBzaW5jZSBpdAotCW5ldmVyIHNob3VsZCBiZS4gIERvbid0IGNhbGwgaW5pdF9vcyB1bmxlc3MgdGhlIHNlY3Rpb24gaXMgZ29pbmcKLQl0byBiZSBhZGRlZC4KLQkobGRsYW5nX2FkZF9maWxlKTogQ2FsbCBzZWN0aW9uX2FscmVhZHlfbGlua2VkIGZvciBlYWNoIHNlY3Rpb24uCi0JKiBsZG1haW4uYyAobXVsdGlwbGVfZGVmaW5pdGlvbik6IERvbid0IHdhcm4gYWJvdXQgbXVsdGlwbGUKLQlkZWZpbml0aW9ucyBpbiBzZWN0aW9ucyB3aGljaCBhcmUgYmVpbmcgZGlzY2FyZGVkLgotCi1TdW4gTWFyIDMxIDAwOjMwOjQ3IDE5OTYgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3twcGNwZS5zYywgcGUuc2N9ICguanVuayk6IFJlbW92ZSBhbmQgdXNlIC9ESVNDQVJELy4KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoaW5pdCk6IFJlbW92ZSBzcGVjaWFsIGNhc2UgUFBDIGNvZGUuCi0KLUZyaSBNYXIgMjkgMDA6MDE6MjkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogTWFrZSB2ZWN0b3JzIHNlY3Rpb24gMHhjNCBieXRlcyBsb25nCi0Jc28gYXMgbm90IHRvIG92ZXJ3cml0ZSB0aGUgbWFnaWMgc3lzY2FsbCBlbnRyeSBhdCAweGM0LgotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBMaWtld2lzZS4KLQotVGh1IE1hciAyOCAxMTowNTo0NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChzcGFyYzY0LSotc29sYXJpczIqKTogRGVsZXRlLgotCVN0aWNrIHdpdGggc3BhcmMtKi1zb2xhcmlzMiouCi0KLVdlZCBNYXIgMjcgMTI6MzM6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChESVNDQVJEX1NFQ1RJT05fTkFNRSk6IERlZmluZSB0byAiL0RJU0NBUkQvIi4KLQkqIGxkbGFuZy5jIChpbml0X29zKTogRmFpbCBvbiBhbiBhdHRlbXB0IHRvIGluaXRpYWxpemUgYW55IHNlY3Rpb24KLQluYW1lZCBESVNDQVJEX1NFQ1RJT05fTkFNRS4KLQkod2lsZF9kb2l0KTogRGlzY2FyZCBpbnB1dCBzZWN0aW9ucyBhc3NpZ25lZCB0byBhbiBvdXRwdXQgc2VjdGlvbgotCW5hbWVkIERJU0NBUkRfU0VDVElPTl9OQU1FLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgdXNlIG9mIC9ESVNDQVJELy4KLQotCSogbGRsYW5nLmM6IEZpeCBzb21lIGluZGVudGF0aW9uIGFuZCBjb21tZW50cy4KLQotVHVlIE1hciAyNiAxODoxNDo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogQ2FsbCBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZS4KLQotVGh1IE1hciAyMSAxMzoxNzozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm86IEZpeCBhIGNvdXBsZSBvZiBpbmRleGluZyBlbnRyaWVzLiAgTWVudGlvbiB0aGF0Ci0JLS12ZXJib3NlIGRpc3BsYXlzIGJ1aWx0aW4gbGlua2VyIHNjcmlwdHMuCi0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBjYXNlICdJJzogSWYgdGhlIGZpbGUgaXMgbm90IGluIGFuIGFyY2hpdmUsCi0JYW5kIHRoZSBsb2NhbCBzeW1ib2wgbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsZW5hbWUsIHByaW50IHRoZQotCWZpbGVuYW1lIGFzIHdlbGwuCi0KLQlQYXRjaGVzIGZyb20gSm9obiBQb2xzdHJhIDxqZHBAcG9sc3RyYS5jb20+IGZvciBGcmVlQlNEIEVMRjoKLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogLUJzaGFyZWFibGUgaXMgYSBzeW5vbnltIGZvciAtc2hhcmVkLgotCSogZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCAoTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogTWFrZSB0aGUgc2FtZQotCWFzIFRFWFRfU1RBUlRfQUREUi4KLQotV2VkIE1hciAyMCAxODoxODoyNSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGQudGV4aW5mbzogRml4IHR5cG9zLiAgVXNlIEBweHJlZiBvbmx5IGluc2lkZSBwYXJlbnRoZXNlcy4KLQotV2VkIE1hciAyMCAxNjo1NjoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChhZGRfd3JhcCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbWFpbi5oIChhZGRfd3JhcCk6IERlY2xhcmUuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IENhbGwgYWRkX3dyYXAuCi0KLVR1ZSBNYXIgMTkgMTY6NDQ6MjAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3QgKHNwYXJjKi0qLXNvbGFyaXMyKiBob3N0KTogQWNjZXB0IGFueSBzcGFyYyB2YXJpYW50LgotCi1XZWQgTWFyIDEzIDE3OjQ3OjMxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IENoYW5nZSBuYW1lIG9mIHBhZ2UgemVybyBtZW1vcnkKLQlmcm9tICJudWxsIiB0byAidmVjdG9ycyIuICBDcmVhdGUgYW4gb3V0cHV0IHNlY3Rpb24gZm9yCi0JdmVjdG9ycy4gIEFkZCBjb21tZW50cyBvbiBob3cgdG8gZXhwbGljaXRseSBwbGFjZSBpdGVtcwotCWluIHRoZSB2ZWN0b3IgdGFibGUuCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IExpa2V3aXNlLgotCi1XZWQgTWFyIDEzIDEyOjQwOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2xuazk2MC5lbSAobWFjaGluZV90YWJsZSk6IEFkZCBqeCBhbmQgaHguCi0KLQkqIGdlbnNjcmlwdHMuc2g6IERvbid0IHVzZSAkezk6LXh4fSwgc2luY2UgVWx0cml4IC9iaW4vc2ggZG9lc24ndAotCXN1cHBvcnQgaXQuCi0KLVR1ZSBNYXIgMTIgMTI6NDM6NTkgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1Aa29hbGEuYXpzdGFybmV0LmNvbT4KLQotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBBZGQgd2Fybl9tdWx0aXBsZV9ncCBmaWVsZC4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC0td2Fybi1tdWx0aXBsZS1ncC4KLQkqIGxkbWFpbi5jICh3YXJuaW5nX2NhbGxiYWNrKTogU3VwcHJlc3MgbXVsdGlwbGUgZ3AgdmFsdWVzIHdhcm5pbmcKLQlpZiAtLXdhcm5fbXVsdGlwbGVfZ3Agd2FzIG5vdCB1c2VkLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS13YXJuLW11bHRpcGxlLWdwLgotCi1UdWUgTWFyIDEyIDEyOjAyOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS13cmFwLgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGxpbmtfaW5mby53cmFwX2hhc2guCi0JKiBsZGV4cC5jIChmb2xkX25hbWUpOiBVc2UgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCBpbiBERUZJTkVECi0JYW5kIE5BTUUgY2FzZXMuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLXdyYXAuCi0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KLQotCURvbid0IGRvIFN1bk9TIHN0eWxlIGR5bmFtaWMgbGlua2luZyBmb3Igc3BhcmMtYW91dDoKLQkqIGNvbmZpZ3VyZS50Z3QgKHNwYXJjNjQtKi1hb3V0Kik6IFVzZSBzcGFyY2FvdXQsIG5vdCBzdW40LgotCShzcGFyY2xpdGUqLWZ1aml0c3UtKiwgc3BhcmMqLSotYW91dCk6IExpa2V3aXNlLgotCShzcGFyYyotd3JzLXZ4d29ya3MqKTogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL3NwYXJjYW91dC5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZXNwYXJjYW91dC5vLgotCShlc3BhcmNhb3V0LmMpOiBOZXcgdGFyZ2V0LgotCi1XZWQgTWFyICA2IDE2OjA2OjUyIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjICguc2RhdGEyLCAuc2JzczIpOiBJbXBsZW1lbnQgRmViIDIgY2hhbmdlCi0gCWluIGEgZGlmZmVyZW50IG1hbm5lciB0byB3b3JrIGFyb3VuZCBkaWZmZXJlbmNlcyBpbiBzaGVsbCB2YXJpYWJsZQotIAlleHBhbnNpb24uCi0KLVdlZCBNYXIgIDYgMTg6MDg6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGVtdWwuaCAobGRlbXVsX3VucmVjb2duaXplZF9maWxlKTogRGVjbGFyZS4KLQkobGRlbXVsYXRpb25feGZlcl90eXBlKTogQWRkIHVucmVjb2duaXplZF9maWxlIGZpZWxkLgotCSogbGRlbXVsLmMgKGxkZW11bF91bnJlY29nbml6ZWRfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbGFuZy5jIChsb2FkX3N5bWJvbHMpOiBJZiBhIGZpbGUgY2FuIG5vdCBiZSByZWNvZ25pemVkLCBjYWxsCi0JbGRlbXVsX3VucmVjb2duaXplZF9maWxlIGJlZm9yZSB0cnlpbmcgaXQgYXMgYSBsaW5rZXIgc2NyaXB0LgotCSogYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV91bnJlY29nbml6ZWRfZmlsZSk6IE5ldyBzdGF0aWMKLQlmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlKTogVXNlIEZPUEVOX1JULCBub3QgInIiLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBJbml0aWFsaXplIHVucmVjb2duaXplZF9maWxlLgotCi1Nb24gTWFyICA0IDE0OjExOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGQpOiBIYW5kbGUgZm9vLmEoLnRleHQpIGJ5IG1hcHBpbmcgZWFjaCBpbmNsdWRlZAotCW1lbWJlciBvZiBmb28uYSBzZXBhcmF0ZWx5LiAgRnJvbSBKb3VrZSBOdW1hbiA8am51bWFuQGJhemlzLm5sPi4KLQotRnJpIE1hciAgMSAxMDoyNDo1OSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50KToKLQlTZWFyY2ggdHJpbmFyeS5jb25kIHJhdGhlciB0aGFuIHNlYXJjaGluZyB0cmluYXJ5LmxocyB0d2ljZS4KLQotVHVlIEZlYiAyNyAxNTowODo0MyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBvdXQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4KLQkoQFRESVJTQCk6IEVkaXQgb3V0LCBjYW4ndCB1c2UgZ2Vuc2NyaXB0cy4KLQotVHVlIEZlYiAyNyAxNTowOToyMSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLnRndCAobTY4ay0qLWxpbnV4YW91dCosIG02OGstKi1saW51eCopOiBOZXcgdGFyZ2V0cy4KLQkqIGVtdWxwYXJhbXMvbTY4a2xpbnV4LnNoOiBOZXcgZmlsZS4KLQkqIGVtdWx0ZW1wbC9saW51eC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCUNhbGwgYmZkXyR7RU1VTEFUSU9OX05BTUV9X3NpemVfZHluYW1pY19zZWN0aW9ucyBpbnN0ZWFkIG9mCi0JYmZkX2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucy4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbTY4a2xpbnV4Lm8uCi0JKGVtNjhrbGludXguYyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdCAobTY4Ki0qLWxpbnV4YW91dCosIG02OCotKi1saW51eCopOiBOZXcgaG9zdHMuCi0KLVR1ZSBGZWIgMjcgMTI6NTU6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBTb3J0IGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLgotCUZpbGwgaW4gbWlzc2luZyBlbnRyaWVzLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFJlY29nbml6ZSAtLW5vLXdob2xlLWFyY2hpdmUuCi0JKiBsZGxhbmcuaCAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSk6IEFkZCB3aG9sZV9hcmNoaXZlIGZpZWxkLgotCSogbGRsYW5nLmMgKG5ld19hZmlsZSk6IFNldCB3aG9sZV9hcmNoaXZlIGZpZWxkLgotCShsb2FkX3N5bWJvbHMpOiBDaGVjayBpbnB1dCBmaWxlIHNwZWNpZmljIHdob2xlX2FyY2hpdmUgZmllbGQKLQlyYXRoZXIgdGhhbiBnbG9iYWwgdmFyaWFibGUuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLW5vLXdob2xlLWFyY2hpdmUuCi0KLVR1ZSBGZWIgMjAgMTY6MDc6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0OiBDb3JyZWN0IGdsZGk5NjAgdG8gZ2xkOTYwLgotCi1Nb24gRmViIDE5IDExOjE2OjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQpOiBDaGVjawotCXRoZSBTT05BTUUgaWYgaXQgaXMgYXZhaWxhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk6IFVzZSB0aGUgU09OQU1FLCBub3QgdGhlCi0JZmlsZW5hbWUsIHdoZW4gY2hlY2tpbmcgZm9yIGNvbmZsaWN0aW5nIGxpYnJhcnkgdmVyc2lvbnMuICBEb24ndAotCWFzc3VtZSB0aGF0IHRoZSBzdWZmaXggaXMgb25seSBudW1iZXJzIGFuZCBkb3RzLgotCi0JKiBsZC50ZXhpbmZvOiBNZW50aW9uIHRoYXQgLVIgY2FuIGJlIHVzZWQgZm9yIC1ycGF0aC4KLQotU3VuIEZlYiAxOCAxNTowNToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBDaGVjayBmb3IgJ2RvIG5vdCBtaXgnIGZyb20gbmF0aXZlIGxpbmtlciBiZWZvcmUKLQl0cnlpbmcgdG8gdXNlIC1ycGF0aC4KLQotVGh1IEZlYiAxNSAxMzo1ODowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGV4cGxpY2l0IHN1YnN0aXR1dGlvbiBvZiBDRkxBR1M7IGF1dG9jb25mCi0JZG9lcyBpdCBhbnlob3cuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoTERGTEFHUyk6IFNldCB0byBATERGTEFHU0AuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19QUk9HX0NDIGJlZm9yZSBjb25maWd1cmUuaG9zdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZW1vdmUgZ28zMiBob3N0LCBzaW5jZSBpdCBzaG91bGQgbm8gbG9uZ2VyIGJlCi0JbmVjZXNzYXJ5LiAgRG9uJ3Qgc2V0IENDIGZvciByb21wIGhvc3QuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRG9uJ3Qgc2tpcCBhIHBhZ2UgaW4gdmlydHVhbCBtZW1vcnkgc3BhY2UgaWYKLQl0aGUgdGV4dCBzZWdtZW50IGVuZHMgZXhhY3RseSBvbiBhIHBhZ2UgYm91bmRhcnkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBSUEFUSF9FTlZWQVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IFJQQVRIX0VOVlZBUi4KLQkqIE1ha2VmaWxlLmluIChSUEFUSF9FTlZWQVIpOiBOZXcgdmFyaWFibGUuCi0JKGNoZWNrKTogVXNlICQoUlBBVEhfRU5WVkFSKSByYXRoZXIgdGhhbiBMRF9MSUJSQVJZX1BBVEguCi0KLVdlZCBGZWIgMTQgMTg6NDk6MDEgMTk5NiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWd1cmUuaW46IFJlZG8gZW11bGF0aW9uIGhhbmRsaW5nIHNvIHRoYXQgZWFjaCBlbXVsYXRpb24KLQlzZWFyY2hlcyB0aGUgY29ycmVjdCB0b29sIGRpcmVjdG9yeSwgYmFzZWQgb24gdGhlIHRhcmdldCBhbGlhcy4KLQlGb3IgZXhhbXBsZSwgImNvbmZpZ3VyZSAtLWVuYWJsZS10YXJnZXRzPW02OGstY29mZiBpMzg2LWxpbnV4IgotCXdpbGwgc2VhcmNoIC91c3IvbG9jYWwvaTM4Ni1saW51eC9saWIgZm9yIGxpbnV4IGFuZAotCS91c3IvbG9jYWwvbTY4ay1jb2ZmL2xpYiBmb3IgbTY4ay1jb2ZmLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLnRndDogQWRkIHNwZWNpYWwgdGRpciBzZXR0aW5ncyBmb3IgTGludXguCi0JKiBNYWtlZmlsZS5pbjogQWRkIEBURElSU0AuICBQYXNzICIkKHRkaXJfRU1VTCkiIHRvICR7R0VOU0NSSVBUU30KLQlmb3IgZWFjaCBlRU1VTC5jIHRhcmdldC4KLQkqIGdlbnNjcmlwdHMuc2g6IEFjY2VwdCBzcGVjaWZpYyBhbGlhcyBhcyA5dGggYXJndW1lbnQsIGFuZCB1c2UgaXQKLQlpbiBMSUJfUEFUSC4KLQotV2VkIEZlYiAxNCAxNjozODozNiAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zZXRfc3RhcnRvZik6IERvbid0IGRvIGFueXRoaW5nIGZvciBhCi0JcmVsb2NhdGVhYmxlIGxpbmsuCi0KLQkqIGxkZ3JhbS55IChtcmlfc2NyaXB0X2ZpbGUpOiBDYWxsIG1yaV9kcmF3X3RyZWUuCi0JKiBtcmkuYyAobXJpX2RyYXdfdHJlZSk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIERvbid0IGJvdGhlciB0bwotCWNyZWF0ZSBtZW1vcnkgcmVnaW9ucy4KLQkobXJpX2xvYWQpOiBEb24ndCBjYWxsIG1yaV9kcmF3X3RyZWUuCi0JKiBtcmkuaCAobXJpX2RyYXdfdHJlZSk6IERlY2xhcmUuCi0KLQkqIGNvbmZpZ3VyZS50Z3QgKG02OCotKi1wc29zKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvbTY4a3Bzb3Muc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvcHNvcy5zYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZW02OGtwc29zLm8uCi0JKGVtNjhrcHNvcy5jKTogTmV3IHRhcmdldC4KLQotV2VkIEZlYiAxNCAxMTowOToyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKCotKi1pZWVlKik6IE5ldyB0YXJnZXQ7IHVzZSB2YW5pbGxhLgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6IFN0cmlwCi0JYDpmb28nIGZyb20gJHtBUkNIfS4KLQotVHVlIEZlYiAxMyAxNTo1ODo1OCAxOTk2ICBCcnlhbiBGb3JkICA8YmFmb3JkQHNuYWtlLmNzLnV0YWguZWR1PgotCi0JKiBzY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2M6IERvbid0IHBhZCB0aGUgLnRleHQgc2VjdGlvbi4gIFB1dAotCS5yb2RhdGEgaW4gLmRhdGEuCi0KLVR1ZSBGZWIgMTMgMTQ6MDQ6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IEhETEZMQUdTIGZvciAqLSotaHB1eCB3aXRoIC0tZW5hYmxlLXNoYXJlZC4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk6IFdhcm4gaWYKLQlpdCBsb29rcyBsaWtlIHdlIG1pZ2h0IGJlIGxpbmtpbmcgaW4gdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUKLQlzYW1lIHNoYXJlZCBsaWJyYXJ5LiAgQmFzZWQgb24gYSBwYXRjaCBmcm9tIEggSiBMdSA8aGpsQHpvb20uY29tPi4KLQotVGh1IEZlYiAgOCAxOToyNTo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB3aGVuIGEKLQlwYWRkaW5nIHN0YXRlbWVudCBpcyBlbmNvdW50ZXJlZC4KLQotV2VkIEZlYiAgNyAxNDowMTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogTG9vayBmb3IgLS1lbmFibGUtc2hhcmVkLiAgQ2hhbmdlIHRoZSB2YWx1ZSBvZgotCUJGRExJQiB3aGVuIGxpbmtpbmcgYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IG9uIFN1bk9TLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IElmIHVzaW5nIGEgc2hhcmVkIEJGRCBsaWJyYXJ5LCB0cnkgdG8gcGFzcyBhCi0JcmVhc29uYWJsZSAtcnBhdGggb3B0aW9uIHdoZW4gbGlua2luZy4KLQkqIE1ha2VmaWxlLmluIChCRkRMSUIpOiBTZXQgdG8gQEJGRExJQkAuCi0KLVR1ZSBGZWIgIDYgMTI6Mjk6MTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggKEFSQ0gpOiBDaGFuZ2UgdG8gYHNwYXJjOnY5Jy4KLQkqIGVtdWx0ZW1wbC9nZW5lcmljLmVtOiBTdHJpcCBgOmZvbycgZnJvbSAke0FSQ0h9LgotCi1Nb24gRmViICA1IDE2OjI1OjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIGJ1aWxkaW5nIGJmZCBhbmQgb3Bjb2RlcyBhcyBzaGFyZWQgbGlicmFyaWVzLCBiYXNlZCBvbgotCXBhdGNoZXMgZnJvbSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBjb25maWd1cmUuaW4gKEhMREZMQUdTKTogTmV3IHN1YnN0aXR1dGlvbi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSExERkxBR1Mgb24gU3VuT1MuCi0JKiBNYWtlZmlsZS5pbiAoSExERkxBR1MpOiBOZXcgdmFyaWFibGUuCi0JKEJGRERFUCk6IE5ldyB2YXJpYWJsZS4KLQkoQkZETElCKTogQ2hhbmdlIHRvIC1MLi4vYmZkIC1sYmZkLgotCSgkKExEX1BST0cpKTogRGVwZW5kIHVwb24gJChCRkRERVApIHJhdGhlcm4gdGhhbiAkKEJGRExJQikuICBVc2UKLQkkKEhMREZMQUdTKSBpbiBsaW5rLgotCShjaGVjayk6IFNldCBMRF9MSUJSQVJZX1BBVEggaW4gdGhlIGVudmlyb25tZW50LgotCi1GcmkgRmViICAyIDE5OjI2OjI1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoLnNkYXRhMiwgLnNic3MyKTogUHV0IC5zZGF0YTIgYW5kIC5zYnNzCi0JaW4gdGhlIHJlYWQtb25seSBzZWN0aW9uLCBub3QgcmVhZC93cml0ZSB1bmxlc3Mgd2UgYXJlIG1ha2luZyBhCi0Jc2hhcmVkIGxpYnJhcnkuCi0JKC5kZWJ1ZyopOiBBZGQgZHdhcmYgZGVidWcgc2VjdGlvbnMuCi0JKC5yZWxhLntzZGF0YSosc2Jzcyp9KTogQWRkIHNlY3Rpb25zLgotCi1GcmkgRmViICAyIDE2OjUwOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1UaHUgRmViICAxIDEwOjUwOjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCAoVEVYVF9TVEFSVF9BRERSKTogQ2hhbmdlIHRvIDB4ODA0ODAwMCwKLQlmb3IgU1ZSNCBjb21wYXRpYmlsaXR5LgotCi0JKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogQ29ycmVjdCBoYW5kbGluZyBvZiBBQlNPTFVURS4KLQotV2VkIEphbiAzMSAxNzozMDoxOSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpWzM0NV04Ni0qLWN5Z3dpbjMyLCBwb3dlcnBjbGUtKi1jeWd3aW4zMik6IE5ldy4KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZGVmaW5mbyBpbml0KTogTWFrZSB0aGUgZGVmYXVsdCBzdGFjayByZXNlcnZlCi0Jb2YgYSBQUEMgbGFyZ2VyLgotCi1XZWQgSmFuIDMxIDE0OjM0OjIzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWd1cmUudGd0IChtNjgqLWFwcGxlLWF1eCopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9tNjhrYXV4LnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL202OGthdXguc2M6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtNjhrYXV4Lm8uCi0JKGVtNjhrYXV4LmMpOiBOZXcgdGFyZ2V0LgotCi1UdWUgSmFuIDMwIDEzOjE4OjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IElnbm9yZQotCS1ibm9lbnRyeSwgc2luY2UgdGhlIHJpZ2h0IHRoaW5nIHRlbmRzIHRvIGhhcHBlbiBhbnlob3cuCi0KLU1vbiBKYW4gMjkgMTI6Mjk6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtZXhwb3J0LWR5bmFtaWMuCi0KLUZyaSBKYW4gMjYgMTE6MTE6NTUgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogQ2hlY2sgZm9yIG5hdGl2ZSBjb21waWxlIGJ5IGNvbXBhcmluZwotCSR7dGFyZ2V0fSBhbmQgJHtob3N0fS4KLQotVGh1IEphbiAyNSAxNjo0Njo1OCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGVtdWxwYXJhbXMve2VsZjMyYjQzMDAuc2gsIGVsZjMybDQzMDAuc2h9OiBDaGFuZ2VkCi0gCVRFWFRfU1RBUlRfQUREUiB0byBhbGxvdyB1c2Ugb24gSURUIGFuZCBQTU9OIHN5c3RlbXMuCi0KLVdlZCBKYW4gMjQgMjA6NTk6NDAgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6Ci0JY29ycmVjdCBzcGVsbGluZy4KLQotV2VkIEphbiAyNCAxNjo1OToxOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoc3BhcmM2NC0qLXNvbGFyaXMyKik6IE5ldyBjb25maWd1cmF0aW9uLgotCShzcGFyYzY0LSotYW91dCopOiBSZW5hbWVkIGZyb20gc3BhcmM2NCouCi0KLU1vbiBKYW4gMjIgMTM6MDE6MzUgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChHRU5TQ1JJUFRTKTogUGFzcyBAaG9zdEAgQHRhcmdldEAgQHRhcmdldF9hbGlhc0AuCi0JKiBnZW5zY3JpcHRzLnNoOiBTZXQgaG9zdCwgdGFyZ2V0IGFuZCB0YXJnZXRfYWxpYXMgdmFyaWFibGVzLgotCUNoZWNrIGZvciBuYXRpdmUgY29tcGlsZSBieSBjb21wYXJpbmcgJHt0YXJnZXR9IGFuZCAke2hvc3R9LgotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IFRlc3QgJHt0YXJnZXR9LCBub3QgJHt0YXJnZXRfYWxpYXN9LgotCi1Nb24gSmFuIDIyIDExOjAzOjIzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBSZWZpbmUgZWFiaSBzdXBwb3J0IHRvIGJldHRlciBzdXBwb3J0Ci0JLnNkYXRhLCAuc2RhdGEyLCAuc2JzcywgZXRjLiBzZWN0aW9ucy4KLQotVHVlIEphbiAxNiAxNToxNjo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55ICgldW5pb24pOiBBZGQgcGhkciBmaWVsZC4KLQkocGhkcik6IFVzZSBwaGRyX3F1YWxpZmllcnMgcmF0aGVyIHRoYW4gb3B0X2hkcnMgYW5kIG9wdF9hdC4KLQkocGhkcl9xdWFsaWZpZXJzKTogTmV3IG5vbnRlcm1pbmFsLiAgQWRkIHN1cHBvcnQgZm9yIEZMQUdTLgotCShvcHRfaGRycywgaGRyKTogUmVtb3ZlLgotCShwaGRyX3ZhbCk6IE5ldyBub250ZXJtaW5hbC4KLQkqIGxkbGFuZy5jIChsYW5nX25ld19waGRyKTogUmVwbGFjZSBoZHJzIHBhcmFtZXRlciB3aXRoIGZpbGVoZHIKLQlhbmQgcGhkcnMgcGFyYW1ldGVycy4gIEFkZCBmbGFncyBwYXJhbWV0ZXIuCi0JKGxhbmdfcmVjb3JkX3BoZHJzKTogVXBkYXRlIGZvciBjaGFuZ2VzIHRvIGxhbmdfcGhkci4gIFBhc3MgZmxhZ3MKLQl0byBiZmRfcmVjb3JkX3BoZHIuCi0JKiBsZGxhbmcuaCAoc3RydWN0IGxhbmdfcGhkcik6IFJlcGxhY2UgaGRycyBmaWVsZCB3aXRoIGZpbGVoZHIgYW5kCi0JcGhkcnMgZmllbGRzLiAgQWRkIGZsYWdzIGZpZWxkLgotCShMQU5HX1BIRFJfRklMRUhEUiwgTEFOR19QSERSX1BIRFJTKTogUmVtb3ZlLgotCShsYW5nX25ld19waGRyKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgRkxBR1MuCi0KLU1vbiBKYW4gMTUgMTU6MDc6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlEb24ndCBtYWtlIGEgc2hhcmVkIGxpYnJhcnkgYmVjYXVzZSBvZiBhbiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvCi0JX19HTE9CQUxfT0ZGU0VUX1RBQkxFXy4KLQotCUFkZCBzb21lIElyaXggNSBzdXBwb3J0LCBtb3N0bHkgZnJvbSBLYXp1bW90byBLb2ppbWEKLSAgICAgICAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPjoKLQkqIGVtdWxwYXJhbXMvZWxmMzJibWlwLnNoIChTQ1JJUFRfTkFNRSk6IENoYW5nZSB0byBlbGZtaXBzLgotCShTSExJQl9URVhUX1NUQVJUX0FERFIpOiBEZWZpbmUuCi0JKE9USEVSX0dPVF9TWU1CT0xTKTogRGVmaW5lLgotCShPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMpOiBSZW1vdmUgaW5pdGlhbGl6YXRpb24gb2YgX2dwLgotCShFWEVDVVRBQkxFX1NZTUJPTFMpOiBEb24ndCBkZWZpbmUuCi0JKERZTkFNSUNfTElOSyk6IERvbid0IGRlZmluZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsbWlwLnNoOiBTYW1lIGNoYW5nZXMgYXMgZWxmMzJibWlwLnNoLgotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaG9zdCAobWlwcyotZGVjLWJzZCopOiBDaGFuZ2UgbWlwcyB0byBtaXBzKi4KLQkobWlwcyotc2dpLWlyaXg0Kik6IExpa2V3aXNlLgotCShtaXBzKi1zZ2ktaXJpeDUqKTogTmV3IGVudHJ5LgotCSogTWFrZWZpbGUuaW4gKGVlbGYzMmJtaXAuYyk6IERlcGVuZCB1cG9uIGVsZm1pcHMuc2MgcmF0aGVyIHRoYW4KLQllbGYuc2MuCi0JKGVlbGYzMmxtaXAuYyk6IExpa2V3aXNlLgotCi1TYXQgSmFuIDEzIDA5OjQxOjQzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBSZW1vdmUgc3VwcG9ydCBmb3IgLnJlbC4qIHNlY3Rpb25zLiAgQWRkCi0JLnJlbGEuZ290Lm5lZyBzZWN0aW9uLgotCi1GcmkgSmFuIDEyIDE0OjU2OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvc2guc2M6IE9ubHkgYnVpbGQgY29uc3RydWN0b3JzIHdoZW4gQ09OU1RSVUNUSU5HLgotCi0JKiBsZG1pc2MuYzogSW5jbHVkZSA8c3RkYXJnLmg+IHJhdGhlciB0aGFuIDx2YXJhcmdzLmg+IGlmCi0JQU5TSV9QUk9UT1RZUEVTIGlzIGRlZmluZWQuICBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZgotCVdJTkRPV1NfTlQuICBWYXJpb3VzIGluZGVuZGF0aW9uIGZpeGVzLgotCSh2ZmluZm8pOiBDaGFuZ2UgZm10IHBhcmFtZXRlciB0byBjb25zdCBjaGFyICouCi0JKGluZm9fbXNnKTogV3JpdGUgPHN0ZGFyZy5oPiB2ZXJzaW9uLgotCShlaW5mbywgbWluZm8sIGZpbmZvKTogTGlrZXdpc2UuCi0JKGluZm9fYXNzZXJ0KTogQ2hhbmdlIGZpbGUgcGFyYW1ldGVyIHRvIGNvbnN0IGNoYXIgKi4KLQkqIGxkbWlzYy5oIChlaW5mbywgbWluZm8sIGluZm9fbXNnKTogSWYgQU5TSV9QUk9UT1RZUEVTIGlzCi0JZGVmaW5lZCwgdXNlIGEgcmVhbCBwcm90b3R5cGUuCi0JKGluZm9fYXNzZXJ0KTogQ2hhbmdlIGZpcnN0IHBhcmFtZXRlciB0byBiZSBjb25zdCBjaGFyICouCi0KLUZyaSBKYW4gMTIgMTM6Mjk6NTUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IEFkZCBzdXBwb3J0IGZvciAuc2RhdGEyLy5zYnNzMiwgZXRjLiAgQWRkCi0JaW4gb2xkIHN1cHBvcnQgdGhhdCAyLjcuMiBuZWVkcywgYnV0IHRoZSBjdXJyZW50IGNvbXBpbGVyIGRvZXMKLQlub3QuCi0KLQkqIE1ha2VmaWxlLmluIChlZWxmMzJ7LGx9cHBjLmMpOiBGaXggdXAgZGVwZW5kZW5jaWVzIHRvIHVzZSB0aGUKLQljb3JyZWN0IExpbmtlciBzY3JpcHQgdGVtcGxhdGUuCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJ7LGx9cHBjLnNoIChURVhUX1NUQVJUX0FERFIpOiBTZXQgdG8gMHg0MDAwMCwKLQlub3QgMHg0MDAwMDAuCi0JKERBVEFfQUREUixOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBEZWxldGUuCi0KLVR1ZSBKYW4gIDkgMTU6NTM6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogUHV0IC5yY29uc3QgcmlnaHQgYWZ0ZXIgLnJkYXRhLgotCi1GcmkgSmFuICA1IDE0OjA3OjQ1IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlzb3J0IHVzaW5nIHJpZ2h0IHBvaW50ZXIuCi0KLUZyaSBKYW4gIDUgMTI6MjU6NDcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IFJlbW92ZSBzdXBwb3J0IGZvciBjcmVhdGluZyBzcGVjaWFsCi0JbGFiZWxzIGZvciBlYWJpIHNlY3Rpb24gYmVnaW4vZW5kIGhlcmUuICBUaGUgY29tcGlsZXIgbm93IHVzZXMKLQljcnR7aSxufS5vIHRvIGNyZWF0ZSB0aGVzZSBzeW1ib2xzLgotCi1UaHUgSmFuICA0IDE3OjA4OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IENoYW5nZSBleGlzdGluZyBMaW51eCBIT1NUSU5HX0NSVDAgdG8gYmUgdXNlZAotCWZvciBhLm91dCBvbmx5LCBhbmQgcHV0IGluIGFwcHJvcHJpYXRlIEhPU1RJTkdfQ1JUMCBhbmQKLQlIT1NUSU5HX0xJQlMgdmFsdWVzIGZvciBMaW51eCBFTEYuCi0KLVRodSBKYW4gIDQgMTI6MDI6MDUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IFVzZSBhbGwgNjRLIGZvciByYW0uCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IERlZmluZSAyNTZLIHJhbSBzaXplLgotCi1UaHUgRGVjIDIxIDE1OjU3OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBQYXNzCi0JZXhwb3J0X2RlZmluZXMgYXMgdHJ1ZSB0byBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIGlmIC11bml4Ci0Jd2FzIHVzZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciAtYkUgd2FzIHVzZWQuCi0KLVR1ZSBEZWMgMTkgMTc6MzU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogT25seSBzZXQKLQlyZWxvY2F0ZWFibGUgYmVmb3JlIGNhbGxpbmcgbGRjdG9yX2J1aWxkX3NldHMgaWYgdGhlIG91dHB1dCBmaWxlCi0JaXMgaW4gYW4gWENPRkYgZm9ybWF0LgotCi1GcmkgRGVjIDE1IDE2OjM0OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogV2hlbiBoYW5kbGluZyBhIGRhdGEgc3RhdGVtZW50LCBpZgotCXRoZSBlbmRpYW5uZXNzIG9mIHRoZSBvdXRwdXQgZmlsZSBpcyB1bmtub3duLCB1c2UgdGhlIGVuZGlhbm5lc3MKLQlvZiB0aGUgaW5wdXQgZmlsZS4KLQotVHVlIERlYyAxMiAxMzo1NTo0MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IFJlY29nbml6ZSBtaXBzLSotKiBhcyBlcXVpdmFsZW50IHRvCi0JbWlwcy1pZHQtZWNvZmYuCi0JKiBtcHctZXBwY21hY29zLmM6IFJlbmFtZSB0byBzaG9ydGVyIG1wdy1lcHBjbWFjLmMuCi0JKiBtcHctbGQucjogQWRkIHZlcnNpb24gcmVzb3VyY2VzLgotCShjZnJnKTogVXNlIHN5bWJvbGljIGluc3RlYWQgb2YgbGl0ZXJhbCBuYW1lIGZvciBleGVjdXRhYmxlLgotCi1Nb24gRGVjIDExIDE1OjEzOjQxIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wcGNwZS5zYyAoRklOSSk6IE1vdmVkIHRoZSAucmVsb2Mgc2VjdGlvbi4KLQotV2VkIERlYyAgNiAxNDozMzo1MCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAocHJpbnRfc3RhdGVtZW50eyxzfSk6IERlbGV0ZSBkdXBsaWNhdGUgcHJvdG90eXBlLgotCShwcmludF9zdGF0ZW1lbnRfbGlzdCk6IFJlbmFtZWQgZnJvbSBwcmludF9zdGF0ZW1lbnQuICBBbGwgY2FsbGVycwotCXVwZGF0ZWQuCi0JKHByaW50X3N0YXRlbWVudCk6IE5ldyBmdW5jdGlvbiB0byBwcmludCBqdXN0IG9uZSBzdGF0ZW1lbnQuCi0JKHByaW50X3tkYXRhLHJlbG9jLHBhZGRpbmd9X3N0YXRlbWVudCk6IERvbid0IGNyYXNoIGlmCi0Jb3V0cHV0X3NlY3Rpb24gPT0gTlVMTC4KLQkoZHByaW50X3N0YXRlbWVudCk6IE5ldyBmdW5jdGlvbi4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBGaXgKLQljYWxsIHRvIHNvcnRfc2VjdGlvbnMuCi0KLVdlZCBEZWMgIDYgMTQ6NTk6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtICh1bml4X2xkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IEhhbmRsZSAtdW5peC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBJZiB1bml4X2xkLCBwYXNzCi0JZ2MgYXMgZmFsc2UgYW5kIGV4cG9ydF9kZWZpbmVkcyBhcyB0cnVlIHRvIHNpemVfZHluYW1pY19zZWN0aW9ucy4KLQotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IFBlcm1pdCBhc3NpZ25tZW50cyB0byBkb3QgaW4gdGhlIGZpbmFsCi0JcGhhc2UgaWYgdGhlIGN1cnJlbnQgc2VjdGlvbiBpcyBhYnNfb3V0cHV0X3NlY3Rpb24uCi0KLQotVHVlIERlYyAgNSAwOTo0OTozOSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IEZpeCBjYWxsCi0JdG8gc29ydF9zZWN0aW9ucy4KLQotRnJpIERlYyAgMSAxNjo0ODozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55IChQSERSUyk6IE5ldyB0b2tlbi4KLQkoaWZpbGVfcDEpOiBBY2NlcHQgcGhkcnMuCi0JKHNlY3Rpb24pOiBBY2NlcHQgcGhkcl9vcHQgYXQgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbiBkZWZpbml0aW9uLgotCShwaGRyX29wKTogTmV3IG5vbnRlcm1pbmFsLgotCShwaGRycywgcGhkcl9saXN0LCBwaGRyLCBwaGRyX3R5cGUsIG9wdF9oZHJzLCBoZHIpOiBMaWtld2lzZS4KLQkqIGxkbGV4Lmw6IEFjY2VwdCBQSERSUy4KLQkqIGxkbGFuZy5oIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QpOiBEZWZpbmUuCi0JKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUpOiBBZGQgcGhkcnMgZmllbGQuCi0JKHN0cnVjdCBsYW5nX3BoZHIpOiBEZWZpbmUuCi0JKExBTkdfUEhEUl9GSUxFSERSLCBMQU5HX1BIRFJfUEhEUlMpOiBEZWZpbmUuCi0JKGxhbmdfbmV3X3BoZHIpOiBEZWNsYXJlLgotCSogbGRsYW5nLmMgKGxhbmdfcGhkcl9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwKTogSW5pdGlhbGl6ZSBwaGRycyBmaWVsZC4KLQkobGFuZ19wcm9jZXNzKTogQ2FsbCBsYW5nX3JlY29yZF9waGRycy4KLQkobGFuZ19uZXdfcGhkcik6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ19zZWN0aW9uX2luX3BoZHIpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfcmVjb3JkX3BoZHJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IFBIRFJTLgotCi1UaHUgTm92IDMwIDEzOjE0OjMwIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wcGNwZS5zYzogTW92ZWQgLmVkYXRhIGludG8gaXRzIG93biBzZWN0aW9uIHRvCi0JZXhwb3NlIGl0LgotCi1UaHUgTm92IDMwIDExOjMyOjM0IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBjb25maWd1cmUuaG9zdCAobTY4Ki1tb3Rvcm9sYS1zeXN2KTogRGVmaW5lIEhPU1RJTkdfQ1JUMCBhbmQKLQlIT1NUSU5HX0xJQlMgZm9yIHRlc3RpbmcuCi0JKG04OCotbW90b3JvbGEtc3lzdjMpOiBEZWZpbmUgSE9TVElOR19DUlQwIGFuZCBIT1NUSU5HX0xJQlMgZm9yCi0JdGVzdGluZy4KLQotVHVlIE5vdiAyOCAxMjoxNDo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogU2V0IGNvbmZpZy5keW5hbWljX2xpbmsgdG8gZmFsc2UgZm9yIC1OCi0JYW5kIC1uLgotCi1Nb24gTm92IDI3IDEzOjEyOjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi43LgotCi1GcmkgTm92IDI0IDE4OjM1OjM1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBUd28gLmp1bmsncyBpcyB0b28gbXVjaCBqdW5rLgotCi1UdWUgTm92IDIxIDE2OjE0OjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgQkZEX05FRURfREVDTEFSQVRJT04uCi0JKiBhY2NvbmZpZy5oOiBQdXQgTkVFRF9ERUNMQVJBVElPTl9GUkVFIGluIEBUT1BAIHNlY3Rpb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNi4KLQotCSogbGRtYWluLmMgKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogRG9uJ3Qgd2FybiBhYm91dCBCRkRfUkVMT0NfQ1RPUgotCWJlaW5nIHVuc3VwcG9ydGVkIGlmIHRoaXMgaXMgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmsgYW5kIHRoZSBpbnB1dAotCUJGRCBzdXBwb3J0cyBpdCwgc2luY2UgbGRjdG9yX2J1aWxkX3NldHMgY2FuIGNvcGUgd2l0aCB0aGF0IGNhc2UuCi0KLUZyaSBOb3YgMTcgMTY6MjM6MTUgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChwb3dlcnBjLSotbWFjb3MqKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvcHBjbWFjb3Muc2g6IE5ldyBmaWxlLCBQb3dlck1hYyBlbXVsYXRpb24uCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZXBwY21hY29zLm8uCi0JKGVwcGNtYWNvcy5jKTogTmV3IHRhcmdldC4KLQkqIG1wdy1lcHBjbWFjb3MuYzogVXBkYXRlLgotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IG91dCBhdHRlbXB0cyB0byB1c2Uge0dFTlNDUklQVFN9LgotCi1GcmkgTm92IDE3IDEwOjM3OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBVc2UgQGhvc3RAIGFuZCBAdGFyZ2V0QCwgbm90Ci0JJChob3N0X2Nhbm9uaWNhbCkgYW5kICQodGFyZ2V0X2Nhbm9uaWNhbCkuCi0JKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCi0KLVRodSBOb3YgMTYgMTE6MjM6NDIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2MgKC5lbmRqdW5rKTogTW92ZSBkZWZpbml0aW9uIG9mIGBlbmQnIHRvIGhlcmUKLQlzbyB0aGUgbWFsbG9jIGhlYXAgYmVnaW5zIGF0IGEgc2FuZSBwbGFjZS4KLQotVGh1IE5vdiAxNiAwMzowOTozMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCVZlcnNpb24gMi42IHJlbGVhc2VkLgotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogVXBkYXRlIHRvIDIuNi4KLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogRGVsZXRlIGxkZW11bC1saXN0LmggaGVyZSwgYnV0IG5vdAotCSQoR0VORVJBVEVEXypGSUxFUyksIHNpbmNlIHRoZXkgbmVlZCB0byBiZSByZXRhaW5lZCBieSBkaXN0Y2xlYW4uCi0JKG1haW50YWluZXItY2xlYW4sIHJlYWxjbGVhbik6IERlbGV0ZSB0aGVtIGhlcmUuCi0KLVR1ZSBOb3YgMTQgMTc6MDg6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogT3BlbiB0aGUKLQliYXNlIGZpbGUgd2l0aCBGT1BFTl9XQiwgbm90ICJ3Ii4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogVXNlIHRoZQotCWVudmlyb25tZW50IHZhcmlhYmxlIExEX1JVTl9QQVRIIGlmIG5laXRoZXIgLXJwYXRoIG5vciAtcnBhdGgtbGluawotCXdlcmUgdXNlZC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBVc2UgdGhlIGVudmlyb25tZW50Ci0JdmFyaWFibGUgTERfUlVOX1BBVEggaWYgLXJwYXRoIHdhcyBub3QgdXNlZC4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IExEX1JVTl9QQVRILgotCi1UaHUgTm92ICA5IDEzOjA5OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IFJlY29nbml6ZQotCS1ibCBhbmQgLWJsb2FkbWFwIG9wdGlvbnMuCi0KLQkqIGxkZmlsZS5jIChsZGZpbGVfdHJ5X29wZW5fYmZkKTogSWYgYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0LAotCXJlcG9ydCBhIGJldHRlciBlcnJvci4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBBZGQKLQluZXcgbG9jYWwgdmFyaWFibGUgc3BlY2lhbF9zZWN0aW9ucywgYW5kIHBhc3MgaXQgdG8KLQlzaXplX2R5bmFtaWNfc2VjdGlvbnMuICBMb29rIHRocm91Z2ggdGhlIHJlc3VsdHMsIGFuZCBtb3ZlIHRoZQotCXNlY3Rpb25zIGFyb3VuZCBpbiB0aGUgbWFwcGluZyBzbyB0aGF0IHRoZXkgYXJlIGRlZmluZWQgY29ycmVjdGx5LgotCi1XZWQgTm92ICA4IDExOjQwOjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmMgKGxkZW11bF9kZWZhdWx0X3RhcmdldCk6IENhc3QgZ2V0ZW52IHJldHVybiB2YWx1ZS4KLQotVHVlIE5vdiAgNyAxMToxNTozNiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9wcGNwZS5zaCAoQVJDSCk6IE5ldyBmaWxlIGZvciBQb3dlclBDIFBvcnRhYmxlCi0JRXhlY3V0YWJsZSBzdXBwb3J0LgotCSogc2NyaXB0dGVtcGwvcHBjcGUuc2M6IE5ldyBmaWxlIGZvciBQb3dlclBDIFBvcnRhYmxlIEV4ZWN1dGFibGUKLQlzdXBwb3J0LgotCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkZWQgcG93ZXJwY2xlLXBlIHRhcmdldC4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVwcGNwZS5vIHRhcmdldC4KLQotCSogZW11bHRlbXBsL3BlLmVtIChUQVJHRVRfSVNfcHBjcGUpOiBmaWxlIHRhaWxvcmluZyBtYWNybwotCShnbGRfJF9iZWZvcmVfYWxsb2NhdGlvbik6IGFkZGVkIGhvb2tzIGZvciB0b2MgY29uc3RydWN0aW9uIGJhc2VkCi0Jb24gdGhlIGFib3ZlIG1hY3JvLgotCi1UdWUgTm92ICA3IDExOjQ3OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbzogVGhlIGxpbmtlciBkb2VzIG5vdCB1c2UgX21haW4gYXMgYW4gZW50cnkgcG9pbnQuCi0KLVR1ZSBOb3YgIDcgMTE6NDY6MTEgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIHNjcmlwdHRlbXBsL204OGtiY3Muc2MgKC5kYXRhKTogQ2FsY3VsYXRlIG5leHQgYm91bmRhcnkgbW9kdWxvCi0JMHgyMDAwIG5vdCAweDIwMC4KLQotTW9uIE5vdiAgNiAxMDo1OToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHRlc3QgZm9yIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkLgotCSogc3lzZGVwLmg6IERlY2xhcmUgZnJlZSBpZiBuZWNlc3NhcnkuICBJbmNsdWRlICJhbnNpZGVjbC5oIi4KLQkqIGFjY29uZmlnLmg6IEV4cGxhaW4gTkVFRF9ERUNMQVJBVElPTl9GUkVFLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVGFrZSBCOjogb3V0IG9mIHNob3J0b3B0cy4KLQotU3VuIE5vdiAgNSAwMzowODoyOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9pMzg2bmJzZC5zaCAoRVhFQ1VUQUJMRV9TWU1CT0xTKTogU2V0IF9fRFlOQU1JQyB0byAwCi0JZm9yIG5vdywgYXMgd2l0aCBtNjhrNGtic2QsIHVudGlsIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgZ2V0cwotCWRvbmUuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBGb3IgaTM4NiBCU0QgdmFyaWFudHMsIGNydDAubyBsaXZlcyBpbgotCS91c3IvbGliLiAgKFRydWUgZm9yIE5ldEJTRCBhdCBsZWFzdCwgdW5jb25maXJtZWQgZm9yIG90aGVycy4pCi0KLVdlZCBOb3YgIDEgMTU6NDI6NDUgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZGVsdGE2OC5vLgotCShlZGVsdGE2OC5jKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS50Z3QgKG02OCotbW90b3JvbGEtc3lzdiopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9kZWx0YTY4LnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2RlbHRhNjguc2M6IE5ldyBmaWxlLgotCi0JKiBzY3JpcHR0ZW1wbC9tODhrYmNzLnNjOiBIYW5kbGUgLmluaXQgYW5kIC5maW5pLiAgQ2hhbmdlIHNlY3Rpb24KLQlhZGRyZXNzZXMuCi0KLVdlZCBOb3YgIDEgMTE6NDE6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAobXJpX3NjcmlwdF9jb21tYW5kKTogQWNjZXB0ICcsJyBhcyB3ZWxsIGFzICc9JyBpbgotCUFMSUdOIGFuZCBBTElHTk1PRCBzdGF0ZW1lbnRzLgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtOiBJbmNsdWRlIGxkZ3JhbS5oLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogSGFuZGxlIC1wRCBhbmQgLXBULCBhcyB1c2VkIG9uCi0JQUlYIDQuMS4KLQkqIE1ha2VmaWxlLmluICgkKEVNVUxBVElPTl9PRklMRVMpKTogRGVwZW5kIHVwb24gbGRncmFtLmguCi0KLVR1ZSBPY3QgMzEgMTg6MjI6MjQgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogY29uZmlndXJlLmhvc3QgKGFscGhhLSotbGludXgqKTogTmV3IGhvc3QuCi0JKiBjb25maWd1cmUudGd0IChhbHBoYS0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCi0KLVR1ZSBPY3QgMzEgMTI6MzY6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChleHBvcnRfZmlsZXMpOiBSZW1vdmUuCi0JKGltcG9ydF9maWxlcyk6IE1ha2Ugc3RhdGljLgotCShzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0KTogRGVmaW5lLgotCShleHBvcnRfc3ltYm9scyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBIYW5kbGUgYW4gaW5pdGlhbCAtYiBvcHRpb24KLQljb3JyZWN0bHkuICBDYWxsIHJlYWRfZmlsZSBmb3IgYW4gZXhwb3J0IGZpbGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogQ2FsbAotCWJmZF94Y29mZl9leHBvcnRfc3ltYm9sIGZvciBlYWNoIGV4cG9ydCBzeW1ib2wsIHJhdGhlciB0aGFuCi0JY2FsbGluZyByZWFkX2ZpbGUgZm9yIGVhY2ggZXhwb3J0IGZpbGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSk6IEZvciBhbiBleHBvcnQgZmlsZSwgbWFrZSB0aGUKLQlleHBvcnRlZCBzeW1ib2xzIHVuZGVmaW5lZCwgYW5kIHN0b3JlIHRoZW0gb24gdGhlIGV4cG9ydF9zeW1ib2xzCi0JbGlzdC4KLQotU2F0IE9jdCAyOCAwMDoxMDowMyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKToKLQlEb24ndCBoYW5nIGlmIGxhc3Qgb3B0aW9uIGlzIHVucmVjb2duaXNlZC4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzKTogSW5zZXJ0IGNyZWF0ZWQKLQlzeW1ib2xzIGludG8gQUJTIG91dHB1dCBzZWN0aW9uLgotCi1GcmkgT2N0IDI3IDE4OjAzOjE3IDE5OTUgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqICBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBzdXBwb3J0IGZvciB0aGUgTmV0QlNECi0JbTY4azRrIGFyY2guCi0JKGVtNjhrNGtuYnNkLmMpOiBOZXcgcnVsZS4KLQotCSogY29uZmlndXJlLnRndDogQWRkZWQgc3VwcG9ydCBmb3IgdGhlIE5ldEJTRCBtNjhrNGsgYXJjaC4KLQotCSogZ2Vuc2NyaXB0cy5zaCwgbGRpbnQudGV4aW5mbywKLQllbXVscGFyYW1zL3thMjlrLGFybWFvdXRiLGFybWFvdXRsLGNvZmZfc3BhcmMsZWJtb24yOWssZ2xkOTYwLAotCWdsZDk2MGNvZmYsZ28zMixoODMwMCxoODMwMGgsaDg1MDAsaDg1MDBiLGg4NTAwYyxoODUwMG0saDg1MDBzLAotCWhwMzAwYnNkLGhwM2hwdXgsaHBwYWVsZi5zaCxpMzg2YW91dCxpMzg2YnNkLGkzODZjb2ZmLGkzODZnbzMyLAotCWkzODZsaW51eCxpMzg2bHlueCxpMzg2bmJzZCxsbms5NjAsbTY4a2FvdXQsbTY4a2NvZmYsbTY4a2x5bngsCi0JbTg4a2JjcyxtaXBzYmlnLG1pcHNic2QsbWlwc2lkdCxtaXBzaWR0bCxtaXBzbGl0LG5ld3MsbnMzMmtuYnNkLAotCXBjNTMybWFjaGFvdXQscmlzY2l4LHNhMjkyMDAsc2gsc2hsLHNwYXJjbHlueCxzcGFyY25ic2QsCi0Jc3QyMDAwLHN1bjMsc3VuNCx2YW5pbGxhLHZheCx2c3RhLHc2NSx6ODAwMSx6ODAwMn0uc2g6IENoYW5nZWQKLQlQQUdFX1NJWkUgdG8gVEFSR0VUX1BBR0VfU0laRS4KLQotCSogZW11bHBhcmFtcy9tNjhrbmJzZC5oOiBEaXR0by4KLQkoVEVYVF9TVEFSVF9BRERSLCBOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBXZSBoYXZlIDhLIHBhZ2VzaXplLgotCShFWEVDVVRBQkxFX1NZTUJPTFMpOiBIYXJkY29kZSBfX0RZTkFNSUMgdG8gemVybyBmb3IgdGhlIHRpbWUKLQliZWluZy4KLQotCSogZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoOiBOZXcgZmlsZS4KLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogRXhwYW5kIEVYRUNVVEFCTEVfU1lNQk9MUyBpZiByZWxvY2F0aW5nLgotCi1GcmkgT2N0IDI3IDE3OjU5OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbTogSW5jbHVkZSBsZGN0b3IuaC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogQ2FsbCBmaW5kX3JlbG9jcy4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogVXNlIG5ldyBhZnRlcl9vcGVuIGZ1bmN0aW9uLgotCSogc2NyaXB0dGVtcGwvYWl4LnNjOiBVc2UgQ09OU1RSVUNUT1JTIGluIC5kYXRhLgotCSogbGRjdG9yLmMgKHN0cnVjdCBzZXRfaW5mbyk6IE1vdmUgZGVmaW5pdGlvbiBpbnRvIGxkY3Rvci5oLgotCShzdHJ1Y3Qgc2V0X2VsZW1lbnQpOiBMaWtld2lzZS4KLQkoc2V0cyk6IE1ha2Ugbm9uLXN0YXRpYy4KLQkobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBBZGQgbmFtZSBwYXJhbWV0ZXIuICBTYXZlIGl0IGluIHRoZSBuZXcKLQlzZXQgZWxlbWVudC4KLQkobGRjdG9yX2J1aWxkX3NldHMpOiBBdm9pZCBiZWluZyBjYWxsZWQgdHdpY2UuICBQYXNzIHNldCBlbGVtZW50Ci0JbmFtZSB0byBsYW5nX2FkZF9yZWxvYy4KLQkqIGxkY3Rvci5oIChzdHJ1Y3Qgc2V0X2luZm8pOiBNb3ZlIGRlZmluaXRpb24gaGVyZSBmcm9tIGxkY3Rvci5jLgotCShzdHJ1Y3Qgc2V0X2VsZW1lbnQpOiBMaWtld2lzZS4gIEFkZCBuZXcgZmllbGQgbmFtZS4KLQkoc2V0cyk6IERlY2xhcmUuCi0JKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogRGVjbGFyZSBuZXcgbmFtZSBwYXJhbWV0ZXIuCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBEb24ndCBpbnNpc3QgdGhhdCBlaXRoZXIgbmFtZSBvcgotCXNlY3Rpb24gYmUgTlVMTCBpbiBhIGxhbmdfcmVsb2Nfc3RhdGVtZW50LgotCSogbGRtYWluLmMgKGFkZF90b19zZXQpOiBQYXNzIE5VTEwgdG8gbGRjdG9yX2FkZF9uZXdfc2V0X2VudHJ5IGZvcgotCW5ldyBuYW1lIHBhcmFtZXRlci4KLQkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBQYXNzIG5hbWUgdG8gbGRjdG9yX2FkZF9uZXdfc2V0X2VudHJ5IGZvcgotCW5ldyBuYW1lIHBhcmFtZXRlci4KLQotCSogbGRtaXNjLmMgKGRlbWFuZ2xlKTogRml4IGluZGVudGF0aW9uLiAgUmVtb3ZlIGEgbGVhZGluZyBwZXJpb2QuCi0KLVRodSBPY3QgMjYgMjI6MjI6NDkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgUG93ZXJNYWMgdGFyZ2V0IHN1cHBvcnQsIGdlbmVyYXRlIGNvbmZpZy5oLgotCSogbWFjLWxkLnI6IE5ldyBmaWxlLCBNYWMgcmVzb3VyY2VzLgotCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgZWRpdHMgTWFrZWZpbGUuaW4gaW50byBNUFcgc3ludGF4LgotCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KLQkqIG1wdy1lcHBjbWFjb3MuYzogUHJlYnVpbHQgdmVyc2lvbiBvZiBQb3dlck1hYyBsaW5raW5nIHNjcmlwdC4KLQotVGh1IE9jdCAyNiAxNDoxMToyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBUcmVhdAotCS1zdGF0aWMgYXMgYSBzeW5vbnltIGZvciAtYm5zby4KLQotCSogc2NyaXB0dGVtcGwvYWl4LnNjOiBNb3ZlIHNwZWNpYWwgc3ltYm9scyBpbnNpZGUgc2VjdGlvbnMuCi0JQWx3YXlzIHN0YXJ0IC5kYXRhIGF0IDAuCi0KLVdlZCBPY3QgMjUgMTE6NTI6MTIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiAgQWxzbyBtYWtlIGluZm8uCi0JKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogIEFsc28gZGVsZXRlICouaW5mbyouCi0KLVdlZCBPY3QgMjUgMTE6Mjc6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtOiBBZGQgc3VwcG9ydCBmb3IgdmFyaW91cyBBSVggbGlua2VyIG9wdGlvbnMsCi0JZm9yIEFJWCBpbXBvcnQgYW5kIGV4cG9ydCBmaWxlcywgYW5kIGZvciBBSVggc2hhcmVkIG9iamVjdHMuCi0JKiBzY3JpcHR0ZW1wbC9haXguc2M6IEFkZCAucGFkLiAgUHV0IC5kcyBqdXN0IGJlZm9yZSB0aGUgVE9DLgotCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbmV3IGZpZWxkIGxpbmtfaW5mby5zdGF0aWNfbGluay4KLQotCSogbGRtYWluLmMgKGFkZF9rZWVwc3ltc19maWxlKTogQWRkIFxuIGF0IGVuZCBvZiBlaW5mbyBjYWxscy4KLQkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBMaWtld2lzZS4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBMaWtld2lzZS4KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi0JKiBsZC50ZXhpbmZvOiBUaGUgTVJJIEFMSUdOIGRpcmVjdGl2ZSBpcyBzdXBwb3J0ZWQuCi0KLU1vbiBPY3QgMjMgMTE6NDY6NDMgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAcGFzYW5kYS5jeWdudXMuY28udWs+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJ2cjQzMDAuc2g6IERlbGV0ZWQuCi0JKiBlbXVscGFyYW1zL2VsZjMydnI0MzAwZWwuc2g6IERlbGV0ZWQuCi0JKiBlbXVscGFyYW1zL2VsZjMyYjQzMDAuc2g6IEFkZGVkLgotCSogZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoOiBBZGRlZC4KLQkqIGNvbmZpZ3VyZS50Z3QsIE1ha2VmaWxlLmluOiBVcGRhdGVkIHRoZSBidWlsZCB0byB1c2UgdGhlCi0gCW5ldyA4LjMgdW5pcXVlIG5hbWVzLgotCi1UaHUgT2N0IDE5IDE3OjQxOjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGVudHJ5X3N5bWJvbCk6IE1ha2Ugbm9uLXN0YXRpYy4KLQkqIGxkbGFuZy5oIChlbnRyeV9zeW1ib2wpOiBEZWNsYXJlLgotCi0JKiBsZGxleC5sOiBUcmVhdCBQUk9WSURFIGFzIGEga2V5d29yZCBpbiBleHByZXNzaW9uIHN0YXRlLgotCi1XZWQgT2N0IDE4IDE3OjM0OjA2IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjICguYnNzKTogTW92ZSB0byBiZSBhZnRlciAudGV4dAotCi1UdWUgT2N0IDE3IDEyOjIyOjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50KToKLQlTZWFyY2ggdHJpbmFyeS5jb25kIHJhdGhlciB0aGFuIHNlYXJjaGluZyB0cmluYXJ5LmxocyB0d2ljZS4gIEZyb20KLQlsaW5saUBpaHAuUEh5cy5ldGh6LkNILgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBNb3ZlCi0JZGlyZWN0b3J5IHNlYXJjaGluZyBjb2RlIGludG8gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpci4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGV4dHJhY3RlZAotCWZyb20gZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zby4KLQkoZ2xvYmFsX25lZWRlZCwgZ2xvYmFsX2ZvdW5kKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IFVzZSBuZXcgYWZ0ZXJfb3BlbiBmdW5jdGlvbi4KLQkqIGxkLnRleGluZm8sIGxkLjE6IE1lbnRpb24gLXJwYXRoLWxpbmsgb24gU3VuT1MuCi0KLQkqIE1ha2VmaWxlLmluIChlZWxmMzJwcGMuYyk6IERlcGVuZCB1cG9uIGVsZjMyLmVtLCBub3QgZ2VuZXJpYy5lbS4KLQkoZWVsZjMybHBwYy5jKTogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2VsZjMybHBwYy5zaCAoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBlbGYzMi4KLQkoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lIGFzIHllcy4KLQotTW9uIE9jdCAxNiAxOToxMToxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogU3RydWN0IGJmZF9lbGZfbGlua19uZWVkZWRfbGlzdCBpcyBub3cgbmFtZWQKLQliZmRfbGlua19uZWVkZWQtbGlzdDsgbWFrZSBhcHByb3ByaWF0ZSBjaGFuZ2VzLgotCi0JKiBjb25maWd1cmUudGd0IChwb3dlcnBjLSotYWl4Kik6IE5ldyB0YXJnZXQ7IHVzZSBhaXhwcGMuCi0JKHJzNjAwMC0qLWFpeCopOiBOZXcgdGFyZ2V0OyB1c2UgYWl4cnM2LgotCSogZW11bHBhcmFtcy9haXhwcGMuc2gsIGVtdWxwYXJhbXMvYWl4cnM2LnNoOiBOZXcgZmlsZXMuCi0JKiBlbXVsdGVtcGwvYWl4LmVtOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2FpeC5zYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFpeHBwYy5vIGFuZCBlYWl4cnM2Lm8uCi0JKGVhaXhwcGMuYywgZWFpeHJzNi5jKTogTmV3IHRhcmdldHMuCi0KLUZyaSBPY3QgMTMgMTQ6MDA6MzcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcC9wZS5zYyAoLnJlbG9jKTogTW92ZSB0byB0aGUgZW5kLgotCi1UdWUgT2N0IDEwIDE3OjUzOjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfZmluaXNoKTogRG9uJ3QgdHJ5IHRvIHVzZSBhbiBlbnRyeV9zeW1ib2wgZnJvbSBhCi0Jc2VjdGlvbiB3aGljaCB3YXMgbm90IGxpbmtlZCBpbnRvIHRoZSBmaW5hbCBvdXRwdXQuCi0KLVR1ZSBPY3QgMTAgMTA6MTc6MjIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IEZpeAotCWZhdGFsIHR5cG9zLgotCi1UdWUgT2N0IDEwIDAxOjAxOjUxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIHJwYXRoX2xpbmsgZmllbGQuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBTZWFyY2ggZm9yCi0JcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGluIHJwYXRoX2xpbmsgcGF0aC4gIE9ubHkgc2VhcmNoCi0JTERfTElCUkFSWV9QQVRIIHdoZW4gY29uZmlndXJlZCBuYXRpdmUuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFJlY29nbml6ZSAtcnBhdGgtbGluay4KLQkqIGxkLjEsIGxkLnRleGluZm86IERvY3VtZW50IC1ycGF0aC1saW5rLgotCi1TYXQgT2N0ICA3IDE3OjA3OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogRG9uJ3QKLQlib3RoZXIgc2VhcmNoaW5nIGZvciBuZWVkZWQgbGlicmFyaWVzIHVubGVzcyBkb2luZyBhIGZpbmFsIGxpbmsuCi0KLUZyaSBPY3QgIDYgMTY6MjY6MTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC9sZC4xOiBGaXggZm9ybWF0dGluZyBidWdzLgotCi1XZWQgT2N0ICA0IDE3OjM3OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRleHAuYyAoZXhwX2dldF9hYnNfaW50KTogUmV0dXJuIGJmZF92bWEsIG5vdCBpbnQuCi0JKiBsZGV4cC5oIChleHBfZ2V0X2Fic19pbnQpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogVXNlIGZwcmludGZfdm1hIHRvCi0JcHJpbnQgcmV0dXJuIHZhbHVlIG9mIGV4cF9nZXRfYWJzX2ludC4KLQotTW9uIE9jdCAgMiAxMzo1NjowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xvYmFsX3N0YXQpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQpOiBDYWxsIHN0YXRfbmVlZGVkIHRvIG1ha2Ugc3VyZQotCXRoYXQgdGhlIGZpbGUgaGFzIG5vdCBhbHJlYWR5IGJlZW4gaW5jbHVkZWQgdW5kZXIgYW5vdGhlciBuYW1lLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLUZyaSBTZXAgMjkgMTI6MDA6MTggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjOiBTdGFydCAudGV4dCBhdCAweDgwMDAuCi0JU3RhcnQgLmRhdGEgYXQgMHg0MDAwMC4KLQotRnJpIFNlcCAyOSAxMTowOTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBJZgotCWNvbW1hbmRfbGluZS5ycGF0aCBpcyBzZXQsIHVzZSBpdCwgcmF0aGVyIHRoYW4gdGhlIC1MIG9wdGlvbnMsIHRvCi0JYnVpbGQgdGhlIHJ1bGVzIHNlY3Rpb24uCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCB0aGlzIHVzZSBvZiAtcnBhdGguCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogRG9uJ3Qgc2V0IGxpbmtfaW5mby5zaGFyZWQgZm9yIC1hc3NlcnQKLQlwdXJlLXRleHQuICBQYXNzIHRydWUsIG5vdCAxLCB0byBsYW5nX2FkZF9lbnRyeS4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZmluZF9hc3NpZ24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShmb3VuZF9hc3NpZ24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IFJlbmFtZSBsb2NhbCBoIHRvIGhkeW4uCi0JSWYgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuZCBubyBzdGFydCBzeW1ib2wgd2FzIHNwZWNpZmllZCBvbgotCXRoZSBjb21tYW5kIGxpbmUsIGFuZCB0aGVyZSBhcmUgYW55IHVuZGVmaW5lZCBzeW1ib2xzLCBzZXQKLQlsaW5rX2luZm8uc2hhcmVkLiAgSWYgbGlua19pbmZvLnNoYXJlZCBpcyBzZXQsIHNldCB0aGUgYWRkcmVzcyBvZgotCXRoZSAudGV4dCBzZWN0aW9uIHRvIDB4MjAuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYXNzaWdubWVudCk6IFJlbmFtZSBmcm9tCi0JZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudC4gIElmIGZpbmRfYXNzaWduIGlzCi0Jc2V0LCB0aGVuIGp1c3Qgc2V0IGZvdW5kX2Fzc2lnbiBiYXNlZCBvbiB3aGV0aGVyIGFuIGFzc2lnbm1lbnQgaXMKLQlmb3VuZCB0byBmaW5kX2Fzc2lnbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCk6IERvbid0IHVzZSBhIHNwZWNpYWwgc2NyaXB0IHdoZW4KLQlwcm9kdWNpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkqIGVtdWxwYXJhbXMvc3VuNC5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogUmVtb3ZlLgotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogUmVtb3ZlIENSRUFURV9TSExJQiB0ZXN0cy4KLQkqIGxkbGFuZy5jIChlbnRyeV9mcm9tX2NtZGxpbmUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShsYW5nX2FkZF9lbnRyeSk6IENoYW5nZSBjbWRsaW5lIHBhcmFtZXRlciBmcm9tIGludCB0byBib29sZWFuLgotCVVzZSBnbG9iYWwgZW50cnlfZnJvbV9jbWRsaW5lIHJhdGhlciB0aGFuIGZ1bmN0aW9uIHN0YXRpYwotCWZyb21fY21kbGluZS4KLQkqIGxkbGFuZy5oIChlbnRyeV9mcm9tX2NtZGxpbmUpOiBEZWNsYXJlLgotCShsYW5nX2FkZF9lbnRyeSk6IENoYW5nZSBkZWNsYXJhdGlvbiBvZiBzZWNvbmQgcGFyYW1ldGVyIGZyb20gaW50Ci0JdG8gYm9vbGVhbi4KLQkqIGxkZ3JhbS55OiBQYXNzIGZhbHNlLCBub3QgMCwgdG8gbGFuZ19hZGRfZW50cnkuCi0KLVRodSBTZXAgMjggMTI6MzQ6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChwYXJzaW5nX2RlZnN5bSk6IERlY2xhcmUuCi0JKiBsZGxleC5oIChsZXhfc3RyaW5nKTogRGVjbGFyZS4KLQkqIGxkbGV4LmwgKGxleF9zdHJpbmcpOiBEZWZpbmUuCi0JKiBsZXhzdXAuYyAocGFyc2luZ19kZWZzeW0pOiBEZWZpbmUuCi0JKHBhcnNlX2FyZ3MpOiBJbiBPUFRJT05fREVGU1lNIGNhc2UsIHNldCBsZXhfc3RyaW5nIGJlZm9yZSBjYWxsaW5nCi0JbGV4X3JlZGlyZWN0LCBhbmQgY2xlYXIgaXQgYWZ0ZXIgY2FsbGluZyB5eXBhcnNlLiAgU2V0Ci0JcGFyc2luZ19kZWZzeW0gYXJvdW5kIGNhbGwgdG8geXlwYXJzZS4KLQkqIGxkbWFpbi5jIChtYWluKTogU2V0IGxleF9zdHJpbmcgYmVmb3JlIGNhbGxpbmcgbGV4X3JlZGlyZWN0LCBhbmQKLQljbGVhciBpdCBhZnRlciBjYWxsaW5nIHl5cGFyc2UuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogRm9yICVTLCBoYW5kbGUgLS1kZWZzeW0gYXJndW1lbnRzIGFuZCBidWlsdAotCWluIGxpbmtlciBzY3JpcHRzIGNvcnJlY3RseS4KLQotCSogc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjOiBBZGQgLmN0b3JzLy5kdG9ycyBoYW5kbGluZyBsaWtlIG90aGVyCi0JQ09GRiB0YXJnZXRzLCBhbGxvd2luZyBmb3IgdGhlIGxlYWRpbmcgdW5kZXJzY29yZSB1c2VkIG9uIFNQQVJDCi0JQ09GRi4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLWFzc2VydC4KLQkqIGVtdWxwYXJhbXMvc3VuNC5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lLgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KTogVXNlIHRoZQotCXNoYXJlZCBsaWJyYXJ5IHNjcmlwdCB3aGVuIGFwcHJvcHJpYXRlLgotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogSWYgQ1JFQVRFX1NITElCIGlzIHNldCwgc3RhcnQgdGhlIC50ZXh0Ci0Jc2VjdGlvbiBhdCBTSVpFT0ZfSEVBREVSUy4KLQotVGh1IFNlcCAyOCAwMTo0MDozNyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGRlbmViLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChlYXJtY29mZi5jKTogQnVpbGQuCi0JKiBjb25maWd1cmUudGd0IChhcm0tKi1jb2ZmKTogTmV3IHRhcmdldAotCSogZW11bHBhcm1zL2FybWNvZmYuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogTmV3IGZpbGUuCi0KLVR1ZSBTZXAgMjYgMTA6NTk6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYzogUmVtb3ZlIC5kYXRhMjsgbm8gbG9uZ2VyIG5lZWRlZC4KLQotRnJpIFNlcCAyMiAxODowOTowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZmlsZS5jIChsZGZpbGVfc2V0X291dHB1dF9hcmNoKTogTWFrZSBhcmNoIGNvbnN0LgotCi1UaHUgU2VwIDIxIDE3OjU1OjI0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBDb3JyZWN0bHkgbG9jYXRlIF9fYnNzX3N0YXJ0IGF0IHRoZQotCWJlZ2lubmluZyBvZiB0aGUgLmJzcyBhcmVhLCBub3QgYXQgdGhlIGVuZCBvZiBkYXRhLiAgQWRkCi0JX19zYnNzX3tzdGFydCxlbmR9IHN5bWJvbHMuCi0KLVdlZCBTZXAgMjAgMTI6Mjk6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IFF1b3RlICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkuCi0JKENYWF9GT1JfVEFSR0VULCBpbnN0YWxsKTogTGlrZXdpc2UuCi0KLU1vbiBTZXAgMTggMTQ6NTM6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBieSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IFJlbW92ZSBicm9rZW5zZWQgc3R1ZmYuCi0JKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCi0JKGluc3RhbGwpOiBMaWtld2lzZS4KLQkoR0VORVJBVEVEX0hGSUxFUyk6IFJlbW92ZSBjb25maWcuaC4KLQkoLmRlcCk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgotCi1Nb24gU2VwIDE4IDE0OjM5OjM4IDE5OTUgIEFybmUgSC4gSnV1bCAgPGFybmVqQHB2di51bml0Lm5vPgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKi1kZWMtbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0KLUZyaSBTZXAgMTUgMjA6MDE6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtODgqLSotZGd1eCopOiBGaXggYW5vdGhlciBzaGVsbCBzeW50YXggZXJyb3IuCi0KLUZyaSBTZXAgMTUgMjM6Mjg6MDUgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni0qLWJzZCopOiBGaXggc2hlbGwgc3ludGF4IGVycm9yLgotCi1UaHUgU2VwIDEyIDEyOjUwOjQ5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXAvcGUuc2M6ICBBbGxvdyBib3RoIHNwZWxsaW5ncyBvZiAuY3RvcnMvLmR0b3JzLgotCVN0YXJ0IC50ZXh0IHNlY3Rpb24gb24gdGhlIHJpZ2h0IGJvdW5kYXJ5LiBBbHdheXMgYWxpZ24KLQlzdGFicy4KLQotVHVlIFNlcCAxMiAxMjoyNDoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldC4KLQotCSogbGRtYWluLmMgKHN0cnVjdCB3YXJuaW5nX2NhbGxiYWNrX2luZm8pOiBEZWZpbmUuCi0JKHdhcm5pbmdfY2FsbGJhY2spOiBBZGQgbmV3IHBhcmFtZXRlciBzeW1ib2wuICBDYWxsCi0Jd2FybmluZ19maW5kX3JlbG9jIHRvIHRyeSB0byBmaW5kIHRoZSBzZWN0aW9uIGFuZCBWTUEuCi0JKHdhcm5pbmdfZmluZF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlQYXNzIE5VTEwgYXMgc3ltYm9sIHBhcmFtZXRlciB0byB3YXJuaW5nIGNhbGxiYWNrLgotCi0JKiBsZC50ZXhpbmZvOiBDbGFyaWZ5IC1MIG9wdGlvbi4KLQotCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKHRvcG93ZXIpOiBMaWtld2lzZS4gIEFsc28sIHJlaW5kZW50LgotCSogbGR3cml0ZS5jIChjbG9uZV9zZWN0aW9uKTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IEFkZAotCWNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQotRnJpIFNlcCAgOCAxNjozMjo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjb25maWcuc3RhdHVzKTogRGVwZW5kIHVwb24gY29uZmlndXJlLnRndC4KLQotCSogbGRlbXVsLmggKGxkZW11bF9zZXRfc3ltYm9scyk6IERlY2xhcmUuCi0JKGxkZW11bF9wYXJzZV9hcmdzKTogRGVjbGFyZS4KLQkqIGxkZW11bC5jIChsZGVtdWxfcGFyc2VfYXJncyk6IEZpeCBpbmRlbnRhdGlvbi4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0hFQURFUl9ESVJFTlQuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogVXNlIGF1dG9jb25mIHJlY29tbWVuZCBtZWNoYW5pc20gdG8gZGVmaW5lCi0JRElSIGFuZCBzdHJ1Y3QgZGlyZW50LgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKi0qLWJzZCopOiBOZXcgY2FzZS4KLQotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LXNlcXVlbnQtcHR4KiB8IGlbMzQ1XTg2LXNlcXVlbnQtc3lzdiopCi0JTmV3IGNhc2UuCi0JKiBjb25maWd1cmUudGd0IChpWzM0NV04Ni0qLXB0eCopOiBOZXcgY2FzZS4KLQotVGh1IFNlcCAgNyAxMDo0ODoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5pbjogUmVuYW1lIGZyb20gY29uZmlnLmguaW4uCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUiB3aXRoIGNvbmZpZy5oOmNvbmZpZy5pbi4KLQlDaGVjayBmb3IgY29uZmlnLmg6Y29uZmlnLmluIHdoZW4gY3JlYXRpbmcgc3RhbXAtaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1oKTogRGVwZW5kIHVwb24gY29uZmlnLmluIHJhdGhlciB0aGFuCi0JY29uZmlnLmguaW4uICBTZXQgQ09ORklHX0hFQURFUlMgdG8gY29uZmlnLmg6Y29uZmlnLmluIHdoZW4KLQljYWxsaW5nIGNvbmZpZy5zdGF0dXMuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmggYW5kIHN0YW1wLWguCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLXN1bm9zNjQqKTogUmVtb3ZlLgotCSogbGRsYW5nLmMgKGxhbmdfbWFwKTogQ2hlY2sgQkZENjQsIG5vdCBIT1NUXzY0X0JJVC4KLQotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IERvbid0IHdhcm4gYWJvdXQgbW92aW5nIHRoZSBsb2NhdGlvbgotCWNvdW50ZXIgYmFja3dhcmQgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24uCi0KLVdlZCBTZXAgIDYgMTQ6NDI6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJld3JpdGUgdG8gdXNlIGF1dG9jb25mLgotCSogY29uZmlndXJlLmhvc3Q6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLnRndDogTmV3IGZpbGUuCi0JKiBhY2xvY2FsLm00OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9jb25mLgotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBjb25maWcuaC5pbjogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9oZWFkZXIuCi0JKiBzeXNkZXAuaDogTmV3IGZpbGUuCi0JKiBsZC5oOiBJbmNvcnBvcmF0ZSBvbGQgY29udGVudHMgb2YgY29uZmlnLmguCi0JKiBjb25maWcuaDogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW46IFZhcmlvdXMgY2hhbmdlcyBmb3IgbmV3IGNvbmZpZ3VyZSBzY3JpcHQuICBBbHNvOgotCShDQ19GT1JfQlVJTEQpOiBSZW1vdmUuCi0JKGxkbWFpbi5vKTogRG9uJ3QgYm90aGVyIHRvIGVuc3VyZSB0aGF0IEVNVUwgaXMgbm9uLWVtcHR5LgotCShkZXAuc2VkKTogVXNlIEBTUkNESVJALCBub3QgQHNyY2RpckAuCi0JKiBkZXAtaW4uc2VkOiBVc2UgQFNSQ0RJUkAsIG5vdCBAc3JjZGlyQC4KLQkqIGdlbnNjcmlwdHMuc2g6IENyZWF0ZSBsZHNjcmlwdHMgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0JKiBsZGVtdWwuYywgbGV4c3VwLmMsIG1wdy1lbWlwc2lkdC5jOiBEb24ndCBpbmNsdWRlICJjb25maWcuaCIuCi0JKiBtcHctZXNoLmMsIGVtdWx0ZW1wLyouZW06IExpa2V3aXNlLgotCSogbGRtYWluLmM6IExpa2V3aXNlLiAgSW5jbHVkZSA8Y3R5cGUuaD4uICBEb24ndCB0cnkgdG8gc2V0Ci0JSEFWRV9TQlJLIGhlcmUuCi0JKiBjb25maWcvKi5tdCwgY29uZmlnLyoubWg6IFJlbW92ZS4KLQotVHVlIFNlcCAgNSAxNDo1NToyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBUcmVhdCBuczMyay1wYzUzMi11eCogbGlrZSBuczMyay1wYzUzMi1tYWNoKiwgYW5kCi0JbnMzMmstcGM1MzItbGl0ZXMqIGxpa2UgbnMzMmstcGM1MzItbmV0YnNkKi4gIEZyb20gSWFuIERhbGwuCi0KLUZyaSBTZXAgIDEgMjI6Mjk6NTIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IEZpeCB0eXBvIGluIHNwZWxsaW5nIG9mIC5jdG9ycy8uZHRvcnMuCi0KLUZyaSBTZXAgIDEgMTM6MTM6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAod2FybmluZ19jYWxsYmFjayk6IEFkZCBhYmZkLCBzZWN0aW9uLCBhbmQgYWRkcmVzcwotCXBhcmFtZXRlcnMuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlDaGFuZ2UgY2FsbCB0byB3YXJuaW5nIGFjY29yZGluZ2x5LgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IElmIG5vdAotCXJlbG9jYXRlYWJsZSBhbmQgbm90IHNoYXJlZCwgcHV0IC5nbnUud2FybmluZy5TWU1CT0wgc2VjdGlvbnMgaW50bwotCXRoZSAudGV4dCBzZWN0aW9uLgotCi1GcmkgU2VwICAxIDA4OjM1OjE2IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIG1pcHMqdnI0MzAwLWlkdC1lbGYqIGFuZAotICAgICAgICBtaXBzKnZyNDMwMGVsLWlkdC1lbGYqIHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgZWVsZjMydnI0MzAwKiB0YXJnZXRzLgotCSogZW11bHBhcmFtcy97ZWxmMzJ2cjQzMDAuc2gsIGVsZjMydnI0MzAwZWwuc2h9OiBBZGRlZC4KLQkqIGNvbmZpZy97bWlwcy12cjQzMDAubXQsIG1pcHMtdnI0MzAwZWwubXR9OiBBZGRlZC4KLQotRnJpIFNlcCAgMSAxMDo1MTo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2EyOWsuc2M6IEZpeCB0byBiZSByZWFzb25hYmxlLiAgRnJvbSBCcmVuZGFuIEtlaG9lCi0JPGJyZW5kYW5AY3lnbnVzLmNvbT4uCi0KLVRodSBBdWcgMzEgMTY6Mzc6MDcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmMgKGxkZW11bF9wYXJzZV9hcmdzKTogTmV3LgotCSogbGRlbXVsLmggKGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6IEFkZCBwYXJzZV9hcmdzLgotCSogbGV4c3VwLmMgKGFsbCBwZSBzdHVmZik6IE1vdmVkIGludG8gcGUuZW0KLQkocGFyc2VfYXJncyk6IENhbGwgZW11bGF0aW9uIGFyZyBwYXJzZXIuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHBhcnNlX2FyZ3MpOiBoYW5kbGUgUEUgc3BlY2ZpYyBhcmdzLgotCi1UaHUgQXVnIDMxIDE3OjAxOjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXApOiBEb24ndCB1c2UgdGhlIGZpcnN0IHJlZ2lvbgotCWFzIHRoZSBkZWZhdWx0IHJlZ2lvbi4gIENyZWF0ZSBhIG5ldyByZWdpb24gaW5zdGVhZC4KLQotVHVlIEF1ZyAyOSAxNDoyMTo0MSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsZGVtdWwuYyAobGRlbXVsX3NldF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLgotCSogbGRlbXVsLmggKGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6IEFkZCBzZXRfc3ltYm9scy4KLQkqIGxkbWFpbi5jIChtYWluKTogQWRkIGNhbGwgdG8gbGRlbXVsX3NldF9zeW1ib2xzLgotCSogbGV4c3VwLmMgKHNldF9wZV92YWx1ZSk6IE5ldyBhcmdzLgotCShzZXRfcGVfbmFtZSk6IE5ldy4KLQkocGFyc2VfYXJncyk6IENvcGUgd2l0aCBuZXcgc2V0X3BlX3ZhbHVlIGFyZ3MuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNldF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLgotCShsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBBZGQgc2V0X3N5bWJvbHMuCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogVXNlIG5ldyBzeW1ib2xzLgotCi1UaHUgQXVnIDI0IDE4OjEyOjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBEb24ndCBjYWxsIHNldF9kZWZhdWx0X2Rpcmxpc3QgZm9yIC1PLgotCUZvciAtWSwgaWdub3JlIGEgbGVhZGluZyBgUCwnLCBhbmQgb25seSBjYWxsIHNldF9kZWZhdWx0X2Rpcmxpc3QKLQlhZnRlciBwcm9jZXNzaW5nIGFsbCB0aGUgb3RoZXIgYXJndW1lbnRzLgotCi1UdWUgQXVnIDIyIDA3OjM2OjU4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBLZWVwIC5lZGF0YSwgZG9uJ3QgYmFzZSBzdGFicyBhdCAwLgotCSogZW11bHBhcmFtcy9hcm1wZS5zaDogUnVuIFBFIHNjcmlwdC4KLQotTW9uIEF1ZyAyMSAxODozMDo0MiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IFJlbW92ZSBQRSBzdHVmZi4KLQkqIGxleHN1cC5jIChvcHRpb25zKTogTG9hZCBtb3JlIFBFIG9wdGlvbnMuCi0JKHNldF9wZV92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQotVGh1IEF1ZyAxNyAxMzozNTo0OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0KLQkqIGVtdWx0ZW1wbC97YXJtcGUuc2MsIGkzODZwZS5zY306IERlbGV0ZWQuCi0JKiBlbXVsdGVtcGwvcGUuc2M6IE5ldyBmaWxlIHBlcmZvcm1zIGdlbmVyaWMgUEUgc3VwcG9ydCBhbmQgc29ydHMKLQlhcmNoaXZlIG1lbWJlcnMuCi0JKiBlbXVscGFyYW1zL3thcm1wZS5zaCxpMzg2cGUuc2h9OiBVc2UgbmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC97YXJtcGUuc2MsIGkzODZwZS5zY306IERlbGV0ZWQKLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBOZXcuCi0JKiBNYWtlZmlsZS5pbjogVXNlIG5ldyBmaWxlcy4KLQotVGh1IEF1ZyAxNyAxNDo0NjozNCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9oODUwMHMuc2MgKC5yZGF0YSk6IEFsbCBkYXRhIG11c3QgZ28gaW4gZGF0YSBzZWdtZW50LgotCSguc3RyaW5ncywuY3RvcnMsLmR0b3JzKTogTGlrZXdpc2UuCi0KLVdlZCBBdWcgMTYgMTE6Mzg6NTkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYXJtcGUuc2M6IEFsd2F5cyBzdGFydCBjb2RlIGF0IDB4NDAxMDAwLCBldmVuCi0JaWYgLXIuCi0JKiBsZHdyaXRlLmMgKHN0cmR1cCk6IE5ldyBleHRlcm4gZGVjbGFyYXRpb24uCi0JKiBsZGdyYW0ueSAoYXR5cGUpOiBOZXcgcnVsZSB0byBjbGFyaWZ5IHR5cGUgcGFyc2luZy4KLQkqIGxkbGFuZy5jIChpbml0X29zKTogUmVtb3ZlIGNvbW1lbnRlZCBvdXQgY29kZS4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogU2V0IFNFQ19BTExPQyBhbmQgU0VDX0xPQUQgYml0cwotCXVubGVzcyB0b2xkIG5vdCB0byBieSB0aGUgbGluayBzY3JpcHQuCi0KLVdlZCBBdWcgMTYgMTE6NDU6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zZXRfc3RhcnRvZik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGxhbmdfcHJvY2Vzcyk6IENhbGwgaXQuCi0KLQkqIGxkZ3JhbS55OiBUd2VhayBjYXNlc3ltbGlzdCB0byBhdm9pZCBiaXNvbiBlcnJvcnMuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWNjZXB0IC1oIGFzIGEgc3lub255bSBmb3IgLS1zb25hbWUsIGZvcgotCVNvbGFyaXMgY29tcGF0aWJpbGl0eS4KLQotVHVlIEF1ZyAxNSAxNzozMToxNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55IChZWURFQlVHKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAxLgotCShDQVNFLCBFWFRFUk4sIFNUQVJUKTogTmV3IHRva2Vucy4KLQkobXJpX3NjcmlwdF9jb21tYW5kKTogSGFuZGxlIENBU0UsIEVYVEVSTiwgSU5DTFVERSwgU1RBUlQuCi0JKGNhc2VzeW1saXN0KTogTmV3IG5vbnRlcm1pbmFsLgotCShleHRlcm5fbmFtZV9saXN0KTogTmV3IG5vbnRlcm1pbmFsLgotCSogbGRsZXgubDogQWNjZXB0IGxvd2VyIGNhc2UgdHJhaWxpbmcgYmFzZSBzcGVjaWZpZXJzLiAgRG9uJ3QKLQlpZ25vcmUgdGhlIGZpcnN0IGRpZ2l0IHdoZW4gdGhlIGJhc2UgaXMgYSBzdWZmaXguICBBY2NlcHQgbWFueQotCUVYUFJFU1NJT04gc3RhdGUgdG9rZW5zIGluIE1SSSBzdGF0ZS4gIFN1cHBvcnQgTVJJIGNvbnRpbnVhdGlvbgotCWxpbmVzIGFuZCBNUkkgc2VtaWNvbG9uIGNvbW1lbnRzLiAgQWNjZXB0IGFsbCBNUkkga2V5d29yZHMgaW4KLQlsb3dlciBjYXNlLiAgQWRkIENBU0UsIEVYVEVSTiwgYW5kIFNUQVJUIE1SSSBrZXl3b3Jkcy4KLQotVHVlIEF1ZyAgOCAxOToxNDo1OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IFVzZSB4bWFsbG9jCi0JaW5zdGVhZCBvZiBhbGxvY2EuCi0KLVR1ZSBBdWcgIDggMTU6MjQ6MDUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCwgQ1hYX0ZPUl9UQVJHRVQpOiBEb24ndCB1c2UKLQkkci8uLi9nY2MveGdjYyB1bmxlc3MgaXQgaXMgcHJlc2VudC4KLQotVGh1IEF1ZyAgMyAxMTo1NjoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBPbmx5IHB1dCAuY3RvcnMgYW5kIC5kdG9ycyBpbiAudGV4dAotCXdoZW4gQ09OU1RSVUNUSU5HLgotCSogc2NyaXB0dGVtcGwvbTY4a2x5bnguc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvbncuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvc2EyOTIwMC5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2M6IExpa2V3aXNlLgotCi1GcmkgSnVsIDI4IDEyOjAyOjIzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMve3o4MDAxLnNoLCB6ODAwMi5zaH06IEZpeCB0eXBvLgotCi1UaHUgSnVsIDI3IDIxOjA2OjIxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotbGludXhvbGRsZCk6IFRyZWF0IGxpa2UgbGludXhhb3V0Ki4KLQotVGh1IEp1bCAyNyAxNToyNjoyOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9pMzg2cGUuc2M6IENvcGUgd2l0aCBjb25zdHJ1Y3RvcnMuCi0JKiBzY3JpcHR0ZW1wbC96OGtzaW0uc2M6IERlbGV0ZWQuCi0JKiBzY3JpcHR0ZW1wbC96ODAwMC5zYzogUmVzdXJyZWN0ZWQgYXMgdGhpcywgYnV0Ci0JY2FuIGhhbmRsZSB6ODAwMSBhbmQgejgwMDIgZm9ybWF0cy4KLQkqIGVtdWxwYXJhbXMvejhrc2ltLnNoOiBEZWxldGVkLgotCSogZW11bHBhcmFtcy97ejgwMDEuc2gsIHo4MDAyLnNofTogTmV3IGZpbGVzLgotCSogY29uZmlnL3o4a3NpbS5tdDogRGVsZXRlZAotCSogY29uZmlnL3o4ay1jb2ZmLm10OiBOZXcsIGdlbmVyYXRlcyBib3RoIGVtdWxhdGlvbnMuCi0KLVR1ZSBKdWwgMjUgMTQ6NTM6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogSW4gJUMgYW5kICVEIGNhc2UsIGFsd2F5cyBwcmludCB0aGUgQkZEIHVzaW5nCi0JJUIsIGluIGNhc2UgaXQgaXMgaW4gYW4gYXJjaGl2ZS4KLQotTW9uIEp1bCAyNCAxNToyMzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBDYWxsIHJlc2V0X21lbW9yeV9yZWdpb25zIGZvciBlYWNoCi0JcmVsYXhhdGlvbiBwYXNzLgotCi1GcmkgSnVsIDIxIDIyOjQ5OjQ0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IEFkZCBzdXBwb3J0IGZvciAuc2RhdGEsIC5zYnNzLCBhbmQKLQlfU0RBX0JBU0UuCi0KLVRodSBKdWwgMjAgMTY6MjY6NTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IEFsbG9jYXRlIHNldF9uYW1lIGluIHN0YWNrCi0JZnJhbWUsIHJhdGhlciB0aGFuIGFsd2F5cyBjYWxsaW5nIGFsbG9jYSB3aXRoIGEgZml4ZWQgc2l6ZS4KLQotV2VkIEp1bCAxOSAxNjoyMTo0MyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2FybXBlLnNoIChPVVRQVVRfRk9STUFUKTogQ2hhbmdlIHRvIHBlaS1hcm0tbGl0dGxlLgotCShMSVRUTEVfT1VUUFVUX0ZPUk1BVCwgQklHX09VVFBVVF9GT1JNQVQpOiBEZWZpbmUuCi0KLU1vbiBKdWwgMTcgMTM6NTc6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZHdyaXRlLmMgKGNsb25lX3NlY3Rpb24pOiBTZXQgdGhlIGFsaWdubWVudCBvZiB0aGUgY2xvbmUKLQlzZWN0aW9uIHRvIHRoYXQgb2YgdGhlIHNlY3Rpb24gYmVpbmcgY2xvbmVkLgotCi0JKiBsZHdyaXRlLmMgKHNwbGl0X3NlY3Rpb25zKTogRG9uJ3Qgc3BsaXQgdGhlIGZpcnN0IGlucHV0IHNlY3Rpb24KLQlpbnRvIGEgbmV3IG91dHB1dCBzZWN0aW9uLgotCi1TYXQgSnVsIDE1IDAwOjI2OjM1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIGVsZjMyLgotCShHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUgYXMgeWVzLgotCi1GcmkgSnVsIDE0IDEyOjExOjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL21pcHNlY29mZi5lbSAoY2hlY2tfc2VjdGlvbnMpOiBVc2UgJVAsIG5vdCAlRi4KLQotCSogbGR2ZXIuYyAoaGVscCk6IFVwZGF0ZSBsaXN0IG9mIG9wdGlvbnMgdG8gbWF0Y2ggY3VycmVudGx5Ci0Jc3VwcG9ydGVkIGxpc3QuCi0KLVRodSBKdWwgMTMgMTM6NTI6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvbG5rOTYwLmVtIChsZF9sbms5NjBfZW11bGF0aW9uKTogSW5pdGlhbGl6ZQotCWFmdGVyX29wZW4gZmllbGQuCi0KLQkqIGxkZXhwLmMgKGV4cF9pbnRvcCk6IERvbid0IGNhc3Qgc3RhdF9hbGxvYyBhcmcgdG8gYmZkX3NpemVfdHlwZTsKLQlpdCB0YWtlcyBhIHNpemVfdCBhbnlob3cuCi0JKGV4cF9iaW5vcCk6IExpa2V3aXNlLgotCShleHBfdHJpbm9wKTogTGlrZXdpc2UuCi0JKGV4cF91bm9wKTogTGlrZXdpc2UuCi0JKGV4cF9uYW1lb3ApOiBMaWtld2lzZS4KLQkoZXhwX2Fzc29wKTogTGlrZXdpc2UuCi0JKiBsZGxhbmcuYyAobGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCk6IExpa2V3aXNlLgotCShpbml0X29zKTogTGlrZXdpc2UuCi0JKGxkbGFuZ19hZGRfdW5kZWYpOiBMaWtld2lzZS4KLQkoaW5zZXJ0X3BhZCk6IExpa2V3aXNlLgotCSogbGRmaWxlLmMgKGxkZmlsZV9hZGRfYXJjaCk6IERvbid0IGNhc3QgeG1hbGxvYyBhcmcgdG8KLQliZmRfc2l6ZV90eXBlLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBJdCdzIGVhcm1hb3V0Yi5vLCBub3QgZWFybW91dGIuby4KLQotV2VkIEp1bCAxMiAxMTozMjoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5oIChsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUpOiBBZGQgc2VhcmNoIHBhcmFtZXRlciB0bwotCWRlY2xhcmF0aW9uLgotCShsZF9lbXVsYXRpb25feGZlcl90eXBlKTogQWRkIHNlYXJjaCBwYXJhbWV0ZXIgdG8KLQlvcGVuX2R5bmFtaWNfYXJjaGl2ZSBlbnRyeSBwb2ludC4KLQkqIGxkZW11bC5jIChsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUpOiBBZGQgc2VhcmNoIHBhcmFtZXRlci4KLQkqIGxkZmlsZS5jIChsZGZpbGVfdHJ5X29wZW5fYmZkKTogUmVuYW1lIGZyb20gdHJ5X29wZW5fYmZkLCBhbmQKLQltYWtlIG5vbi1zdGF0aWMuICBDaGFuZ2UgYWxsIGNhbGxlcnMgdG8gdXNlIG5ldyBuYW1lLgotCShsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCk6IE1ha2Ugc3RhdGljLiAgSWYgZW50cnkgaXMgZHluYW1pYywgY2FsbAotCWxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZS4KLQkobGRmaWxlX29wZW5fZmlsZSk6IERvbid0IGNhbGwgbGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlLgotCSogbGRmaWxlLmggKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoKTogRG9uJ3QgZGVjbGFyZS4KLQkobGRmaWxlX3RyeV9vcGVuX2JmZCk6IERlY2xhcmUuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlKToKLQlBY2NlcHQgc2VhcmNoIHBhcmFtZXRlci4gIERvbid0IHNlYXJjaCBmb3IgYSBsaWJyYXJ5LCBqdXN0IGxvb2sgaW4KLQlhIHNpbmdsZSBwbGFjZS4KLQkqIGVtdWx0ZW1wbC9saW51eC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUpOgotCUxpa2V3aXNlLgotCi1UdWUgSnVsIDExIDE2OjQ0OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKHNldF9zY3JpcHRzX2Rpcik6IERvbid0IGJhc2Ugc2NyaXB0IGRpcmVjdG9yeSBvbgotCWN1cnJlbnQgZGlyZWN0b3J5LgotCi1UdWUgSnVsIDExIDEyOjI5OjAyIDE5OTUgIFJpY2sgU2xhZGtleSAgPGpyc0B3b3JsZC5zdGQuY29tPgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogRG9uJ3QgcHJpbnQgdGhlIGxpbmUgbnVtYmVyIGlmIGl0IGlzbid0Ci0JbWVhbmluZ2Z1bC4KLQotTW9uIEp1bCAxMCAxMzozODoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIGZpZWxkIHdhcm5fY29uc3RydWN0b3JzLgotCSogbGRtYWluLmMgKGFkZF90b19zZXQpOiBXYXJuIGlmIGNvbmZpZy53YXJuX2NvbnN0cnVjdG9ycy4KLQkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBMaWtld2lzZS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC13YXJuLWNvbnN0cnVjdG9ycy4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC13YXJuLWNvbnN0cnVjdG9ycy4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQpOiBEb24ndAotCWdldCBjb25mdXNlZCBieSBkaXJlY3RvcnkgbmFtZXMgaWYgd2Ugc2VhcmNoZWQgZm9yIHRoZSBmaWxlLgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEguSi4gTHUgPGhqbEBueW5leHN0LmNvbT46Ci0JKiBsZGxhbmcuaCAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSk6IEFkZCBuZXcgZmllbGQgZHluYW1pYy4KLQkqIGxkbGFuZy5jIChuZXdfYWZpbGUpOiBTZXQgZHluYW1pYyBmcm9tIGNvbmZpZy5keW5hbWljX2xpbmsuCi0JKiBsZGZpbGUuYzogSW5jbHVkZSBiZmRsaW5rLmguCi0JKGxkZmlsZV9vcGVuX2ZpbGUpOiBDaGVjayBkeW5hbWljIGZpZWxkIG9mIGVudHJ5LCBub3QgZ2xvYmFsCi0JZHluYW1pY19saW5rIGZpZWxkLiAgRG9uJ3QgZG8gYSBkeW5hbWljIHNlYXJjaCB3aGVuIGRvaW5nIGEKLQlyZWxvY2F0ZWFibGUgbGluay4KLQkqIGxkbWFpbi5jIChtYWluKTogRG9uJ3Qgd2FybiBhYm91dCBkeW5hbWljX2xpbmsgZm9yIGEKLQlyZWxvY2F0ZWFibGUgbGluay4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IFNraXAgZmlsZSBpZgotCWR5bmFtaWMgaXMgZmFsc2UuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKTogQWx3YXlzCi0JbG9vcCBvdmVyIGlucHV0IGZpbGVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtQnN0YXRpYywgLUJkeW5hbWljLCAtQnNoYXJlZCwgYW5kCi0JLXNoYXJlZC4KLQotTW9uIEp1bCAxMCAxMzoyOTo0MyAxOTk1ICBFcmljIFlvdW5nZGFsZSAgPGVyaWNAYWliLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBTZXQgbGlua19pbmZvLnN5bWJvbGljIHRvIGZhbHNlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLUJzeW1ib2xpYy4KLQotV2VkIEp1bCAgNSAwMDoxMjoxMSAxOTk1ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKEhBVkVfU0JSSyk6ICBEZWZpbmUgZm9yIGV2ZXJ5dGhpbmcgZXhjZXB0Ci0Jc3BlY2lmaWMgc3lzdGVtcyB0aGF0IGFyZSBrbm93biB0byBub3Qgc3VwcG9ydCBzYnJrLgotCShtYWluKTogIFVzZSBIQVZFX1NCUksgdG8gZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIHVzZSBzYnJrLgotCi1UdWUgSnVsICA0IDEyOjU1OjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50KToKLQlIYW5kbGUgZXRyZWVfcHJvdmlkZS4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbG9iYWxfbmVlZGVkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xvYmFsX2ZvdW5kKTogTGlrZXdpc2UuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkKTogTGlrZXdpc2UuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQpOiBMaWtld2lzZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTogTGlrZXdpc2UuCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IFJlcGxhY2UgYWZ0ZXJfb3Blbl9kZWZhdWx0IHdpdGgKLQlnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLgotCi1Nb24gSnVsICAzIDE0OjI2OjM3IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLXdpbjMyKTogTmV3IHRhcmdldC4KLQotTW9uIEp1bCAgMyAxNDozOToyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogTGV0IC1HIGVpdGhlciBzZXQgdGhlIHNtYWxsIGRhdGEgc2l6ZSBvcgotCWJlIGVxdWl2YWxlbnQgdG8gLS1zaGFyZWQsIGRlcGVuZGluZyBvbiB0aGUgbmV4dCBhcmd1bWVudC4gIEFjY2VwdAotCWFuZCBpZ25vcmUgLXogZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eS4KLQotU3VuIEp1bCAgMiAxNzo1MjozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQ2FzdCBmb3BlbiByZXN1bHQgdG8gUFRSIGJlZm9yZSBzdG9yaW5nCi0JaXQgaW4gbGlua19pbmZvLmJhc2VfZmlsZS4gIEZpeCBpbmRlbnRhdGlvbi4KLQotV2VkIEp1biAyOCAxNzoxMToyNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IEFsd2F5cyBpbml0aWFsaXplIFBFIGluZm8gaW4gbGlua19pbmZvLgotCSogbGV4c3VwLmMgKE9QVElPTl9CQVNFX0ZJTEUpOiBOZXcgb3B0aW9uLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIG5ldyBvcHRpb24uCi0JKiBlbXVscGFyYW1zL2FybXBlLnNoOiBPdXRwdXQgcGVpLgotCSogZW11bHRlbXBsL2kzODZwZS5lbTogQWRkIG5ld2xpbmUgdG8gZW5kLgotCSogc2NyaXB0dGVtcGwvYXJtcGUuc2M6IENoYW5nZSBvdXRwdXQgYW5kIHF1b3RlIHRoZSAkcy4KLQkqIHNjcmlwdHRlbXBsL2kzODZwZS5zYzogQ2hhbmdlIG91dHB1dCBhbmQgcXVvdGUgdGhlICRzLgotCi1UaHUgSnVuIDIyIDE5OjU1OjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTdW4gTWF5ICA3IDExOjUzOjQxIE1EVCAxOTk1ICBCcnlhbiBGb3JkICA8YmFmb3JkQGNzLnV0YWguZWR1PgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1tc2RvcyosIGkzODYtKi1tb3NzKik6IE5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgaTM4Nm1zZG9zLm8uCi0JKGkzODZtc2Rvcy5vKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZy9pMzg2LW1zZG9zLm10OiBDcmVhdGVkLgotCSogZW11bHBhcmFtcy9pMzg2bXNkb3Muc2g6IENyZWF0ZWQuCi0JKiBzY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2M6IENyZWF0ZWQuCi0KLVRodSBKdW4gMjIgMTU6MDY6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2MgKC5maXh1cCk6IEFkZCBzdXBwb3J0IGZvciBhIC5maXh1cCBzZWN0aW9uCi0JdGhhdCBjb250YWlucyBwb2ludGVycyB0byBiZSByZWxvY2F0ZWQuCi0KLVR1ZSBKdW4gMjAgMTc6NDc6MjAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctZXNoLmM6IE5ldyBmaWxlLCBtb2RpZmllZCBmb3IgTVBXIGZyb20gZXNoLmMuCi0JKiBzY3JpcHR0ZW1wbC9zaC5zYzogUmVmb3JtYXR0ZWQgdG8gc2ltcGxpZnkgTVBXaWZpY2F0aW9uLAotCXVzZSAqKCkgdG8gY29uY2F0IHN0YWIgc2VjdGlvbnMgaW5zdGVhZCBvZiBbXS4KLQotVGh1IEp1biAxNSAwODo0ODoxNiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hcm1wZS5zYzogQWRkIGNvbnN0cnVjdG9yIHN1cHBvcnQuCi0KLVR1ZSBKdW4gMTMgMDk6MTE6MjAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6ICBBbnkgc2VjdGlvbiB3aXRoIGEgREFUQQotCXN0YXRlbWVudCBoYXMgY29udGVudHMuCi0KLVN1biBKdW4gMTEgMTU6MjA6NDYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9tNjhrZWxmLnNoIChOT1ApOiBEZWZpbmUuCi0JKERZTkFNSUNfTElOSyk6IERvbid0IGRlZmluZS4KLQkoVEVYVF9TVEFSVF9BRERSKTogU2V0IHRvIDB4ODAwMDAwMDA7IHRoZSBleHRyYSAweDEwMCBmb3IgaGVhZGVycwotCXdpbGwgY29tZSBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0LgotCi1UaHUgSnVuICA4IDE0OjE3OjMzIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvYXJtcGUuc2gsIHNjcmlwdGVtcGwvYXJtcGUuc2M6IEFkZCBlbmQgYW5kIHN0YWNrLgotCi1Nb24gSnVuICA1IDAyOjE2OjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLWdudSopOiBVc2UgR05VIGVsZiBjb25maWcuCi0KLVRodSBNYXkgMjUgMTE6NDk6MjggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JRnJvbSBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCSogTWFrZWZpbGUuaW46IEZpeHVwIG1vcmUgZ290Y2hhcyBmcm9tIHJlbmFtaW5nIGVsZjMycHBjbGUgdG8KLQllbGYzMmxwcGMuCi0KLVdlZCBNYXkgMjQgMTE6MjM6MjEgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBBUk0tUEUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgYXJtcGUubwotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgYXJtcGUuCi0JKiBjb25maWcvYXJtLXBlLm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvYXJtcGUuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvYXJtcGUuc2M6IE5ldyBmaWxlLgotCi0KLU1vbiBNYXkgMjIgMTU6MTk6MjYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGg4MzAwaC0qLWhtcyk6IERlbGV0ZWQKLQkqIGNvbmZpZy9jZi1oODMwMGgubXQ6IERlbGV0ZWQuCi0KLVRodSBNYXkgMTggMDQ6MjY6MTAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCUZyb20gRGF2aWQgVGF5bG9yIChkdGF5bG9yQGFybWx0ZC5jby51aykKLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlYXJtb3V0W2xiXS5vCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBhcm17LGVbbGJdLSotYW91dC4KLQkqIGNvbmZpZy9hcm1bbGJdLWFvdXQubXQ6IE5ldyBmaWxlcy4KLQkqIGVtdWxwYXJhbXMvYXJtYW91dFtsYl0uc2g6IE5ldyBmaWxlcy4KLQkqIHNjcmlwdHRlbXBsL2FybWFvdXQuc2M6IE5ldyBmaWxlLgotCi1UdWUgTWF5IDE2IDE4OjI3OjExIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3BwY2xlLWVsZjMyLm10IChFTVVMKTogVXNlIGVsZjMybHBwYywgbm90IGVsZjMycHBjbGUsIHRvCi0JYmUgdW5pcXVlIGluIDggY2hhcmFjdGVycyBmb3IgRE9TLgotCi0JKiBlbXVscGFyYW1zL2VsZjMybHBwYy5zaDogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBlbGYzMnBwY2xlLnNoLgotCSogZW11bHBhcmFtcy9lbGYzMnBwY2xlLnNoOiBEZWxldGVkLgotCi1GcmkgTWF5IDEyIDExOjAzOjU1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0JCQkgIFRvbSBHcmllc3QgPGdyaWVzdEBjcy55YWxlLmVkdT4KLQotCUluaXRpYWwgc3VwcG9ydCBmb3IgUEUgZXhlY3V0YWJsZXMgKGVnIE5ULCB3aW4zMikKLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZ3VyZS5pbiwgZWkzODZwZSk6IEFkZCBzdXBwb3J0LgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIFBFIGFyZ3VtZW50IGluZm8uCi0JKiBsZHdyaXRlLmMgKHByaW50X2ZpbGVfc3R1ZmYpOiBEb24ndCBwcmludCBvdXQgLmRyZWN0dmUKLQlhbmQgLmRlYnVnIHNlY3Rpb24gaW5mby4KLQkqIGxleHN1cC5jIChzZXRfc3Vic3lzdGVtLCBzZXRfc3RhY2tfaGVhcCwgT1BUSU9OX0hFQVAsCi0JIE9QVElPTl9TVUJTWVNURU0sIHBhcnNlX2FyZ3NtIHNldF9zdWJzeXN0ZW0sIHNldF9zdGFja19oZWFwKToKLQkgSGFuZGxlIG5ldyBhcmd1bWVudHMuCi0JKiBjb25maWcvaTM4Ni1wZS5tdCwgZW11bHRlbXBsL2kzODZwZS5lbSwgc2NyaXB0dGVtcGwvaTM4NnBlLnNjOgotCU5ldyBmaWxlcwotCi1XZWQgTWF5IDEwIDE4OjM3OjU5IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9ocHBhZWxmLnNjOiAgUmVtb3ZlIC5QQVJJU0MudW53aW5kIHNlY3Rpb24gZnJvbSB0ZXh0Ci0Jc2VnbWVudC4gIFRoaXMgYWxsb3dzIGxkIC1yIHRvIHByZXNlcnZlIHVud2luZCBzZWN0aW9ucy4KLQotVHVlIE1heSAgOSAxNzoxOTo1NyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBzdXBwb3J0LgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMycHBjbGUuby4KLQkoZWVsZjMycHBjbGUuYyk6IFN1cHBvcnQgZm9yIGxpdHRsZSBlbmRpYW4gUG93ZXJQQy4KLQotCSogY29uZmlnL3BwY2xlLWVsZjMyLm10OiBOZXcgZmlsZSBmb3IgbGl0dGxlIGVuZGlhbiBQb3dlclBDLgotCSogZW11bHBhcmFtcy9lbGYzMnBwY2xlLnNoOiBEaXR0by4KLQotV2VkIE1heSAgMyAxMjo1NjozMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogQ2hlY2sKLQlzdWJzZWN0aW9uX2FsaWdubWVudCwgaW5zdGVhZCBvZiBjaGVja2luZyBzZWN0aW9uX2FsaWdubWVudCB0d2ljZS4KLQlOb3RpY2VkIGJ5IEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1Pi4KLQotVHVlIE1heSAgMiAxNjozNjowNyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLWxpdGVzKik6IEhhbmRsZSBsaWtlIGhwcGEqLSotKmVsZiouCi0KLU1vbiBBcHIgMjQgMTk6MjE6MDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGxkd3JpdGUuYyAobGR3cml0ZSk6IEJlZm9yZSBkb2luZyBhbnl0aGluZywgcmVzZXQgdGhlIGVycm9yCi0JY29kZS4gIElmIGJmZF9maW5hbF9saW5rIHJldHVybnMgYW4gZXJyb3IsIGJ1dCB0aGUgZXJyb3IgY29kZSBpcwotCXVuc2V0LCBkb24ndCBpc3N1ZSBhbiBleHRyYSBtZXNzYWdlLiAgQXNzdW1lIGEgY29ycmVjdCBlcnJvcgotCW1lc3NhZ2Ugd2FzIGFscmVhZHkgc2V0LgotCi1GcmkgQXByIDE0IDE2OjMxOjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtNjhrZWxmLm8uCi0JKGVtNjhrZWxmLm8pOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL202OGstZWxmLm10LCBlbXVscGFyYW1zL202OGtlbGYuc2g6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIHRoZW0gZm9yIG02OCotKi1lbGYuCi0KLVR1ZSBBcHIgMTEgMTI6MDI6MDMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JTWVyZ2UgaW4gc3VwcG9ydCBmb3IgTWFjIE1QVyBhcyBhIGhvc3QuCi0JKE9sZCBjaGFuZ2UgZGVzY3JpcHRpb25zIHJldGFpbmVkIGZvciBpbmZvcm1hdGlvbmFsIHZhbHVlLikKLQotCSogbXB3LWNvbmZpZy5pbiAoaTM4Ni11bmtub3duLWFvdXQpOiBDaGFuZ2UgdG8gaTM4Ni11bmtub3duLWdvMzIuCi0JKGkzODYtdW5rbm93bi1jb2ZmKTogUmVtb3ZlLgotCShzaC1oaXRhY2hpLWhtcyk6IE5ldyB0YXJnZXQuCi0JKGVtdWxhdGlvbl9vZmlsZXMpOiBTZXQgY29ycmVjdGx5IGZvciBlYWNoIHRhcmdldC4KLQkodmVyc2lvbiwgVERFRklORVMpOiBBZGQgdG8gbWFrZWZpbGUgZnJhZ21lbnQuCi0JKiBtcHctbWFrZS5pbiAoQklTT04pOiBVc2UgYnlhY2MgaW5zdGVhZCBvZiBiaXNvbi4KLQkoZW1fKi5jKTogUmVwbGFjZSB3aXRoIGUqLmMgZXZlcnl3aGVyZS4KLQkobGRncmFtLmgpOiBTZXBhcmF0ZSBhY3Rpb24gZnJvbSBsZGdyYW0uYyBnZW5lcmF0aW9uLgotCShMRF9QUk9HKTogRGVwZW5kIG9uIFZlcnNpb24uci4KLQkoVmVyc2lvbi5yKTogZ2VuZXJhdGUgZnJvbSB2ZXJzaW9uIGluZm8uCi0JKiBtcHctZW1pcHNpZHQuYzogTmV3IGZpbGUsIG1vZGlmaWVkIGZvciBNUFcgZnJvbSBlbWlwc2lkdC5jLgotCi0JKiBtcHctY29uZmlnLmluIChtNjhrLWFwcGxlLW1hY29zLCBwcGMtYXBwbGUtbWFjb3MsCi0gICAgICAgIGkzODYtdW5rbm93bi1hb3V0LCBpMzg2LXVua25vd24tY29mZik6IE5ldyB0YXJnZXRzLgotCShtNjhrLWFvdXQsIG02OGstY29mZik6IFJlbW92ZSB0YXJnZXRzLgotCShtay50bXApOiBBZGQgZGVmaW5pdGlvbiBvZiBFTVVMLgotCi0JKiBtcHctY29uZmlnLmluIChlbXVsbmFtZSk6IFNldCBiYXNlZCBvbiB0YXJnZXQuCi0JKGxkZW11bC1saXN0LmgpOiBDb25zdHJ1Y3QuCi0JKiBtcHctbWFrZS5pbiAoaW5zdGFsbC1vbmx5KTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbCk6IERlcGVuZCBvbiBpbnN0YWxsLW9ubHkuCi0KLQkqIG1wdy1tYWtlLmluIChiaW5kaXIpOiBGaXggcGF0aG5hbWUuCi0JKGluc3RhbGwpOiBNb3ZlIGhlcmUgZnJvbSBtcHctYnVpbGQuaW4uCi0KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBNUFcgY29uZmlndXJhdGlvbiBmcmFnbWVudC4KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIG1ha2VmaWxlIGZyYWdtZW50LgotCShUaGlzIGZpbGUgaXMgc2VtaS1hdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIE1ha2VmaWxlLmluLikKLQkqIGxkZmlsZS5jIChzbGFzaCk6IElmIE1QVywgc2V0IHRvIGA6Jy4KLQkqIGxkbGV4LmwgKFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVEKTogSWYgTVBXLCBzZXQgdGhpcyB0bwotCXByZXZlbnQgcmVkZWZpbml0aW9uIGVycm9ycy4KLQotVHVlIEFwciAgNCAxNzo1NToxOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BiYW5nLmhhY2suY29tPgotCi0JKiBsZHdyaXRlLmMgKGNsb25lX3NlY3Rpb24pOiBBbGlnbiBjbG9uZSBzZWN0aW9ucyBvbiBldmVuCi0JYm91bmRhcmllcy4KLQotVGh1IE1hciAzMCAxNDozMjoyNiAxOTk1ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGxpbnV4IHRvIGRlZmF1bHQgdG8gZWxmLiAgVXNpbmcKLQlpWzM0NV04Ni0qLWxpbnV4YW91dCB3aWxsIGJ1aWxkIGEgbGlua2VyIHdoaWNoIGRlZmF1bHRzIHRvIGEub3V0LgotCSogY29uZmlnL2kzODYtbGFvdXQubXQ6IFJlbmFtZSBmcm9tIG9sZCBjb25maWcvaTM4Ni1saW51eC5tdC4KLQkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10OiBSZW5hbWUgZnJvbSBvbGQgY29uZmlnL2kzODYtbGVsZi5tdC4KLQkqIGNvbmZpZy9pMzg2LWxlbGYubXQ6IFJlbW92ZS4KLQotVGh1IE1hciAzMCAxMzowOTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogSWYgb3BlbmluZyB0aGUgbWFwIGZpbGUgZmFpbHMsIGNhbGwKLSAgICAgICAgYmZkX3NldF9lcnJvciBiZWZvcmUgY2FsbGluZyBlaW5mby4KLQotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgdGhlIC1uby1rZWVwLW1lbW9yeSBvcHRpb24uCi0KLU1vbiBNYXIgMjcgMTE6MTA6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IFJldmVydCBwYXRjaCBvZiBNYXJjaCAxMCwgc2luY2UgdGhlIFNWUjQgbGlua2VyCi0JZG9lcyBtYXJrIHNoYXJlZCBsaWJyYXJpZXMgYXMgZXhlY3V0YWJsZS4KLQotVHVlIE1hciAyMSAxNToxNTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2NvbW1vbik6IENoYW5nZSBwb3dlciB0byBpbnQuICBQYXNzIGxhcmdlciB2YWx1ZXMKLQliZWZvcmUgc21hbGxlciB2YWx1ZXMuCi0JKGxhbmdfb25lX2NvbW1vbik6IFRyZWF0IGluZm8gYXMgaW50ICouICBEb24ndCBib3RoZXIgdG8gY2hlY2sgZm9yCi0JbGFzdCB2YWx1ZSwgc2luY2UgaXQgaXMgbm93IHplcm8uCi0KLVNhdCBNYXIgMTggMDE6NDk6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobG9hZF9zeW1ib2xzKTogQW4gZW1wdHkgYXJjaGl2ZSBpcyBPSy4KLQotRnJpIE1hciAxNyAxNjoxNTozMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChwcm9ncmVzcy5oKTogSW5jbHVkZS4KLQkobWFpbik6IENhbGwgU1RBUlRfUFJPR1JFU1MgYW5kIEVORF9QUk9HUkVTUy4KLQotVGh1IE1hciAxNiAxNzoxNzozMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBNb3ZlIF9HT1QyX0VORF8gYWZ0ZXIgdGhlIC5jdG9ycyBhbmQKLQkuZHRvcnMgc2VjdGlvbnMsIHNvIHRoYXQgdGhlc2UgcG9pbnRlcnMgZ2V0IHJlbG9jYXRlZCBhbHNvLgotCURlZmluZSB0aGUgc3ltYm9scyBfX3tDLER9VE9SX3tMSVNULEVORH1fXyB0byBtYXJrIHRoZSBiZWdpbm5pbmcKLQlhbmQgZW5kIG9mIHRoZSBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMuCi0KLVRodSBNYXIgMTYgMTM6NTk6MTQgMTk5NSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAY2h1cmNoeS5nbnUuYWkubWl0LmVkdT4KLQotCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IElmIHdob2xlX2FyY2hpdmUgaXMgdHJ1ZSBhbmQgRU5UUlkKLQlkZXNjcmliZXMgYW4gYXJjaGl2ZSwgY2FsbCBiZmRfbGlua19hZGRfc3ltYm9scyBvbiBlYWNoIG1lbWJlci4KLQkqIGxkbWFpbi5jICh3aG9sZV9hcmNoaXZlKTogTmV3IHZhcmlhYmxlLgotCShtYWluKTogSW5pdGlhbGl6ZSBpdCB0byBmYWxzZS4KLQkqIGxkbWFpbi5oOiBEZWNsYXJlIHdob2xlX2FyY2hpdmUuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEdyb2sgLS13aG9sZS1hcmNoaXZlIHN3aXRjaC4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0td2hvbGUtYXJjaGl2ZS4KLQotVGh1IE1hciAxNiAxMTozODo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdlbnNjcmlwdHMuc2ggKEVNVUxBVElPTl9OQU1FKTogU2V0IExJQl9QQVRIIHRvIGVtcHR5IHdoZW4gbm90Ci0JdXNpbmcgdGhlIGRlZmF1bHQgZW11bGF0aW9uLgotCi0JKiBjb25maWcvZGd1eC5taCAoSE9TVElOR19FTVUpOiBVc2UgLW0gcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIHNldAotCUxERU1VTEFUSU9OLgotCSogY29uZmlnL2hwcGFlbGYubWggKEhPU1RJTkdfRU1VKTogTGlrZXdpc2UuCi0KLVR1ZSBNYXIgMTQgMTI6Mjg6MDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBTZXQgZm9yY2VfbWFqCi0JZm9yIC1sYy5OLiAgRnJvbSBILkouIEx1IDxoamxAbnluZXhzdC5jb20+LgotCi1GcmkgTWFyIDEwIDE0OjQzOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBEb24ndCBzZXQgRVhFQ19QIGlmIGxpbmtfaW5mby5zaGFyZWQgaXMgc2V0LgotCi0JKiBsZGxleC5sOiBSZXR1cm4gLWxGSUxFTkFNRSBhcyB0aGUgdG9rZW4gTE5BTUUuCi0JKiBsZGdyYW0ueTogQWRkIHRva2VuIExOQU1FLgotCShpbnB1dF9saXN0KTogVHJlYXQgTE5BTUUgbGlrZSBOQU1FLCBidXQgcGFzcyBpdCB0bwotCWxhbmdfYWRkX2lucHV0X2ZpbGUgYXMgbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bS4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IHVzaW5nIC1sRklMRU5BTUUgaW4gSU5QVVQuCi0KLVRodSBNYXIgIDkgMTI6MjE6NTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19jaGVjayk6IElmIHRoZSBhcmNoaXRlY3R1cmVzIGFyZSBjb21wYXRpYmxlIGNhbGwKLQliZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSB0byBsZXQgdGhlIGJhY2tlbmQgZG8gYWRkaXRpb25hbAotCWNoZWNrcy4KLQotVHVlIE1hciAgNyAwMDo1MzowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5jIChsZGVtdWxfY2hvb3NlX21vZGUpOiBJZiBlbXVsYXRpb24gbm90IHJlY29nbml6ZWQsIGxpc3QKLQlhbGwgc3VwcG9ydGVkIGVtdWxhdGlvbnMuCi0KLU1vbiBNYXIgIDYgMTQ6MDM6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGVtdWwuYyAobGRlbXVsX2xpc3RfZW11bGF0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkZW11bC5oIChsZGVtdWxfbGlzdF9lbXVsYXRpb25zKTogRGVjbGFyZS4KLQkqIGxkdmVyLmMgKGhlbHApOiBMaXN0IHN1cHBvcnRlZCB0YXJnZXRzIGFuZCBlbXVsYXRpb25zLgotCi1GcmkgTWFyICAzIDE1OjQwOjM2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYyAoLmRlYnVnKTogUmVsb2NhdGUgdG8gYWRkcmVzcyAwLgotCSguZGVidWdfc3JjaW5mbywgLmRlYnVnX2FyYW5nZXMsIC5kZWJ1Z19wdWJuYW1lcywKLQkuZGVidWdfc2ZuYW1lcywgLmxpbmUpOiBMaWtld2lzZS4KLQotRnJpIE1hciAgMyAxNzowNzoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoaG9sZF9yZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBQbGFjZSByZWFkb25seSBzZWN0aW9ucyB3aXRoCi0JY29udGVudHMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCAiLnJlbCIgYWZ0ZXIgaG9sZF9yZWwuICBSZW1vdmUgdGhlCi0JYXNzZXJ0aW9uIHdoaWNoIGNoZWNrZWQgZm9yIHVucGxhY2VkIC5yZWwgc2VjdGlvbnMuICBEb24ndCB0cnkgdG8KLQlzb3J0IHRoZSBzZWN0aW9uIGludG8gcGxhY2UgaWYgcGxhY2UtPmJmZF9zZWN0aW9uIGlzIE5VTEwuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBTZXQgaG9sZF9yZWwgdG8gdGhlIGZpcnN0Ci0Jc2VjdGlvbiBiZWdpbm5pbmcgd2l0aCAiLnJlbCIuCi0KLVRodSBNYXIgIDIgMTQ6MzQ6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRG9jIG5vdGUgZnJvbSBwaWVycmVAcGhpLmxhLnRjZS5jb20gKFBpZXJyZSBXaWxsYXJkKToKLQkqIGxkLnRleGluZm86IC1YIGFuZCAteCB3b3JrIGV2ZW4gaWYgLXMgb3IgLVMgYXJlIG5vdCBzcGVjaWZpZWQuCi0JKiBsZC4xOiBTaW1pbGFyIGNoYW5nZS4KLQotV2VkIE1hciAgMSAxMzo1MToxNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaCAoQ09GRl9DVE9SUyk6IERlZmluZS4KLQkqIHNjcmlwdHRlbXBsL2k5NjAuc2M6IFVzZSBDT0ZGX0NUT1JTIGlmIENPTlNUUlVDVElORy4KLQotVHVlIEZlYiAyOCAxMjo0Mjo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1saW51eGVsZiopOiBOZXcgdGFyZ2V0LiAgVXNlIGkzODYtbGVsZi4KLQkoaVszNDVdODYtKi1nbnVlbGYqKTogTmV3IHRhcmdldC4gIFVzZSBpMzg2LWdlbGYuCi0JKiBjb25maWcvaTM4Ni1sZWxmLm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9pMzg2LWdlbGYubXQ6IE5ldyBmaWxlLgotCi1UdWUgRmViIDI4IDEwOjI3OjU0IDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBNYXRjaCBvbiBtaXBzLWVjb2ZmLCBhbmQgZGVmYXVsdCB0byB0aGUgSURUCi0JY29uZmlndXJhdGlvbi4KLQotRnJpIEZlYiAxNyAxMzowNjo0NyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBBZGQgc3VwcG9ydCBmb3IgLmdvdDEgYW5kIC5nb3QyIHNlY3Rpb25zLgotCU9mZnNldCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gMzI3NjggZnJvbSB0aGUgc3RhcnQgb2YgdGhlIEdPVCBhcmVhCi0JdG8gZG91YmxlIHRoZSBzaXplIG9mIHRoZSB0YWJsZS4KLQotVGh1IEZlYiAgOSAxODoyOTo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRG8gcmVjdXJzaXZlIGRlbGV0aW9uLCBzaW5jZSBsZHNjcmlwdHMKLQlpcyBhIGRpcmVjdG9yeS4KLQotVGh1IEZlYiAgOSAxMTozODoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogSWYgdHJhY2VfZmlsZV90cmllcyBpcyB0cnVlLCBhbmQgd2UgYXJlIHVzaW5nCi0JYW4gaW50ZXJuYWwgbGlua2VyIHNjcmlwdCwgcHJpbnQgb3V0IHRoZSBzY3JpcHQuCi0JKiBsZGZpbGUuYyAodHJ5X29wZW4pOiBSZWluZGVudCBmdW5jdGlvbi4gIE1ha2UgdGhlIG1lc3NhZ2VzIGFib3V0Ci0Jb3BlbmluZyBzY3JpcHQgZmlsZXMgbW9yZSBpbmZvcm1hdGl2ZS4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBGb3IgLVYsIGNhbGwgbGR2ZXJzaW9uIHdpdGggMSwgbm90IDAuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLVdlZCBGZWIgIDggMTc6MzQ6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogQWRqdXN0IHJlZmVyZW5jZXMgdG8gY29tbW9uIHN5bWJvbAotCWluZm9ybWF0aW9uIGZvciBuZXcgc3RydWN0dXJlLgotCi1Nb24gRmViICA2IDEyOjE3OjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKHVuZGVmaW5lZF9zeW1ib2wpOiBIYW5kbGUgc2VjdGlvbiBiZWluZyBOVUxMLgotCi0JKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBIYW5kbGUgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLgotCSogbGRleHAuYyAoZm9sZF9uYW1lKTogTGlrZXdpc2UuCi0JKiBsZGxhbmcuYyAocHJpbnRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCShsYW5nX2ZpbmlzaCk6IExpa2V3aXNlLgotCSogbGRtYWluLmMgKG11bHRpcGxlX2NvbW1vbik6IExpa2V3aXNlLgotCSogbGR3cml0ZS5jIChwcmludF9zeW1ib2wpOiBMaWtld2lzZS4gIEFsc28sIGJmZF9saW5rX2hhc2hfd2VhawotCXJlbmFtZWQgdG8gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsuCi0KLQkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBTZXQgYWRkcmVzcyBvZiAuZGF0YSBzZWN0aW9uIGNvcnJlY3RseQotCXdoZW4gLW4gb3IgLU4gaXMgdXNlZC4gIFBhdGNoIGZyb20gQ2hyaXMgRyBEZW1ldHJpb3UKLQk8Q2hyaXNfR19EZW1ldHJpb3VATEFHQVZVTElOLlBETC5DUy5DTVUuRURVPi4KLQkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IFNpbWlsYXIgY2hhbmdlLgotCi1UdWUgSmFuIDMxIDE2OjIwOjUyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBDbGFyaWZ5IGVycm9yIG1lc3NhZ2Ugd2hlbiB1c2VyCi0Jc3BlY2lmaWVkIHN0YXJ0IGFkZHIgY29uZmxpY3RzIHdpdGggcmVnaW9uLiAgRml4IHJlc2V0dGluZyBvZgotCXJlZ2lvbiBwb2ludGVyLgotCi1UdWUgSmFuIDMxIDEyOjM3OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRleHAuYyAoZm9sZF9uYW1lKTogSW4gY2FzZSBOQU1FLCBwZXJtaXQgYW4gYWJzb2x1dGUgc3ltYm9sCi0JaW4gbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0uCi0KLU1vbiBKYW4gMzAgMTE6MzM6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRGVwZW5kIHVwb24gY2xlYW4uICBEb24ndCBib3RoZXIgdG8KLQlyZW1vdmUgZmlsZXMgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGJ5IGNsZWFuLiAgRnJvbSBwYXRjaCBieQotCWFsYW5AU1BSSS5MZXZlbHMuVW5pU0EuRWR1LkF1IChBbGFuIE1vZHJhKS4KLQotRnJpIEphbiAyNyAxNjoyNzozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBGb3IKLQlhIE1JUFMgdGFyZ2V0LCBjbG9iYmVyIHRoZSBzaXplIG9mIGFsbCBidXQgdGhlIGZpcnN0IGlucHV0Ci0JLnJlZ2luZm8gc2VjdGlvbiB0byBiZSAwLCBzbyB0aGF0IGxhbmdfc2l6ZV9zZWN0aW9ucyBzZXRzIHRoZQotCWNvcnJlY3Qgc2l6ZSBmb3IgdGhlIG91dHB1dCAucmVnaW5mbyBzZWN0aW9uLgotCi1UaHUgSmFuIDI2IDE5OjUzOjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpcy4KLQotVGh1IEphbiAyNiAxMjozMzowNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIHBvd2VycGMtKi1lYWJpLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IE5ldyBmaWxlIGZvciBQb3dlclBDIGVtYmVkZGVkIEFCSQotCXN1cHBvcnQuCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2ggKFNDUklQVF9OQU1FKTogVXNlIGVsZnBwYy5zYyBpbnN0ZWFkIG9mCi0JZWxmLnNjLCB3aGljaCBkZWZpbmVzIHNvbWUgbmV3IHN5bWJvbHMgUG93ZXJQQyBlbGYgbmVlZHMuCi0KLVR1ZSBKYW4gMjQgMTA6MzI6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZGN0b3IuYyAobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBEb24ndCBkdW1wIGNvcmUgaWYgYQotCWNvbnN0cnVjdG9yIGVudHJ5IGlzIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCi1Nb24gSmFuIDIzIDEzOjU4OjEzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLWdudSopOiBTZXQgbGRfdGFyZ2V0IHRvIGkzODYtZ251LgotCSogY29uZmlnL2kzODYtZ251Lm10OiBOZXcgZmlsZS4gIEluY2x1ZGUgRUxGIHN1cHBvcnQuCi0KLVRodSBKYW4gMTkgMTY6MjI6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogSWYKLQl0aGVyZSBhcmUgYW55IGlucHV0IHNlY3Rpb25zIG5hbWVkIC5nbnUud2FybmluZywgdHJlYXQgdGhlbSBhcwotCWNvbnRhaW5pbmcgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gYmUgcHJpbnRlZCBieSB0aGUgbGlua2VyLCBhbmQKLQljbG9iYmVyIHRoZSBzaXplIHNvIHRoYXQgdGhlIG1lc3NhZ2UgaXMgbm90IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQKLQlmaWxlLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBQdXQgLmdudS53YXJuaW5nIHNlY3Rpb25zIGludG8gdGhlIC50ZXh0Ci0Jc2VjdGlvbi4KLQotU3VuIEphbiAxNSAxNjo0NTowMCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogY29uZmlndXJlLmluICh3NjUtKi0qKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUuCi0JKiBzY3JpcHR0ZW1wbC93NjUuc2M6IE5ldy4KLQkqIGNvbmZpZy9jb2ZmLXc2NS5tdDogTmV3LgotCi1UaHUgSmFuIDEyIDAxOjMyOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfcGxhY2Vfb3JwaGFucyk6IERvbid0IGlnbm9yZSBmaWxlcyB3aXRoCi0JanVzdF9zeW1zX2ZsYWcgc2V0LiAgSW5zdGVhZCwgcHV0IGFsbCB0aGVpciBzZWN0aW9ucyBpbgotCWJmZF9hYnNfc2VjdGlvbl9wdHIsIHVzaW5nIHRoZSBzZWN0aW9uIFZNQSBhcyB0aGUgb3V0cHV0X29mZnNldC4KLQotV2VkIEphbiAxMSAyMjo1OTowOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBEb24ndCB1c2UgYGNvbnN0JyB3aXRoIHR5cGVkZWYKLQluYW1lIGByZWxvY19ob3d0b190eXBlJywgc2luY2UgaXQncyBub3cgZGVmaW5lZCB0byBiZSBjb25zdC4KLQkqIGxkbGFuZy5jIChsYW5nX2FkZF9yZWxvYyk6IERpdHRvLgotCSogbGRsYW5nLmggKGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUsIGxhbmdfYWRkX3JlbG9jKTogRGl0dG8uCi0KLVdlZCBKYW4gMTEgMTE6MjQ6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZGV4cC5jIChmb2xkX2JpbmFyeSk6IEFkZGluZyBvciBzdWJ0cmFjdGluZyBhbiBhYnNvbHV0ZSB2YWx1ZQotCXRvIGEgcmVsYXRpdmUgdmFsdWUgZG9lcyBub3QgcmVxdWlyZSBmb3JjaW5nIHRoZSByZWxhdGl2ZSB2YWx1ZSB0bwotCWJlIGFic29sdXRlLiAgQWxzbywgcmVpbmRlbnQgZnVuY3Rpb24uCi0KLVdlZCBEZWMgMjggMjI6MDU6NTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogbGR3cml0ZS5jIChjbG9uZV9zZWN0aW9uKTogQ3JlYXRlIGEgc3ltYm9sIHdpdGggdGhlCi0Jc2FtZSBuYW1lIGFzIHRoZSBzZWN0aW9uLgotCi1Nb24gRGVjIDE5IDE0OjAyOjEzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGxkLmggKHNwbGl0X2J5X3JlbG9jLCBzcGxpdF9ieV9maWxlKTogTmV3IGZsYWdzLgotCSogbGR3cml0ZS5jICAoY2xvbmVfc2VjdGlvbiwgc3BsaXRfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb25zLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBVbmRlcnN0YW5kIG5ldyBzcGxpdCBvcHRpb25zLgotCi1GcmkgRGVjICA5IDE3OjIyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBNb3ZlIC5jdG9ycyBhbmQgLmR0b3JzIGZyb20gLnRleHQgc2VnbWVudCB0bwotCS5kYXRhIHNlZ21lbnQuICBUaGV5IG11c3QgYmUgd3JpdGFibGUgd2hlbiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYnJhcnkuICBGcm9tIEguSi4gTHUgPGhqbEBueW5leHN0LmNvbT4uCi0KLUZyaSBEZWMgIDIgMTQ6MDk6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBydGwuY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL21pcG9zZWNvZmYuZW06IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9taXBzaWR0LnNoIChURU1QTEFURV9OQU1FKTogU2V0IHRvIG1pcHNlY29mZi4KLQkqIGVtdWxwYXJhbXMvbWlwc2lkdGwuc2ggKFRFTVBMQVRFX05BTUUpOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IFB1dCAucmVsLnNkYXRhIHNlY3Rpb25zIGluIC50ZXh0LCBhbmQKLQlwcm92aWRlIF9fcnVudGltZV9yZWxvY19zdGFydCBhbmQgX19ydW50aW1lX3JlbG9jX3N0b3AgaWYgdGhleSBhcmUKLQl1c2VkLiAgIEFsaWduIF9mZGF0YSB0byBhIDE2IGJ5dGUgYm91bmRhcnkuCi0JKiBNYWtlZmlsZS5pbiAoZW1pcHNpZHQuYyk6IERlcGVuZCB1cG9uIG1pcHNlY29mZi5lbSByYXRoZXIgdGhhbgotCWdlbmVyaWMuZW0uCi0JKGVtaXBzaWR0bC5jKTogTGlrZXdpc2UuCi0JKGNoZWNrKTogUGFzcyBDQ19GT1JfSE9TVCBhbmQgQ0ZMQUdTX0ZPUl9IT1NUIHRvIHJ1bnRlc3QuCi0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBuZXcgZmllbGQgZW1iZWRkZWRfcmVsb2NzLgotCSogbGRlbXVsLmggKGxkZW11bF9hZnRlcl9vcGVuLCBhZnRlcl9vcGVuX2RlZmF1bHQpOiBEZWNsYXJlLgotCShsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBBZGQgbmV3IGZpZWxkIGFmdGVyX29wZW4uCi0JKiBsZGVtdWwuYyAobGRlbXVsX2FmdGVyX29wZW4pOiBOZXcgZnVuY3Rpb24uCi0JKGFmdGVyX29wZW5fZGVmYXVsdCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBDYWxsIGxkZW11bF9hZnRlcl9vcGVuLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1lbWJlZGRlZC1yZWxvY3MuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IEluaXRpYWxpemUKLQluZXcgYWZ0ZXJfb3BlbiBmaWVsZCB0byBhZnRlcl9vcGVuX2RlZmF1bHQuCi0JKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbSwgZW11bHRlbXBsL2dsZDk2MC5lbTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvZ2xkOTYwYy5lbSwgZW11bHRlbXBsL2hwcGFlbGYuZW06IExpa2V3aXNlLgotCSogZW11bHRlbXBsL2xpbnV4LmVtLCBlbXVsdGVtcGwvbTg4a2Jjcy5lbTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0sIGVtdWx0ZW1wbC92YW5pbGxhLmVtOiBMaWtld2lzZS4KLQkqIGxkLnRleGluZm8sIGxkLjE6IE1lbnRpb24gLWVtYmVkZGVkLXJlbG9jcy4KLQotV2VkIE5vdiAyMyAyMjowNDo0NyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGVzaGwuby4KLQkqIGNvbmZpZy9jb2ZmLXNoLm10OiBBZGQgc2hsIGVtdWxhdGlvbi4KLQotVHVlIE5vdiAyMiAxMTo1NTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRmlsbCAudGV4dCBzZWN0aW9uIHdpdGggTk9QUy4gIEZyb20gRXJpYwotCVlvdW5nZGFsZSA8ZXJpY0BhaWIuY29tPi4KLQotVGh1IE5vdiAxNyAxNDozOTo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQlQYXRjaGVzIGZyb20gcGlya2VyQGVpdW5peC50dXdpZW4uYWMuYXQgKE1hcnRpbiBQaXJrZXIpLgotCSogY29uZmlnL2kzODZsaW51eC5taDogTmV3IGZpbGU7IHNldCBIT1NUSU5HX0NSVDAuCi0JKiBnZW5zY3JpcHRzLnNoOiBEb24ndCBwdXQgJHtsaWJkaXJ9IGluIExJQl9QQVRIIGlmIGl0IGlzCi0JL3Vzci9saWIsIHNpbmNlIHRoYXQgaXMgYWxyZWFkeSBpbiBMSUJfUEFUSC4KLQotV2VkIE5vdiAxNiAxMDowMzowMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYyAoLnRleHQpOiBIYW5kbGUgYSB1c2UgcmRlZmluZWQgdGV4dCBzdGFydAotCWFkZHJlc3MuCi0JKC5kYXRhLCAuYnNzKTogSWYgIi1OIiwgdGhlbiBwbGFjZSB0aGUgZGF0YS9ic3MganVzdCBhZnRlciB0aGUgZW5kCi0Jb2YgdGhlIC50ZXh0IHNlY3Rpb24gcmF0aGVyIHRoYW4gYXQgdGhlIGRlZmF1bHQgMHg0MDAwMDAwMC4KLQotCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYyAoLnRleHQpOiBQbGFjZSB1bndpbmQgZGVzY3JpcHRvcnMgaW4gdGhlCi0JdGV4dCBzZWdtZW50LgotCi1TYXQgTm92IDEyIDE1OjU1OjU2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCVBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhaWIuY29tPjoKLQkqIGxkbGFuZy5jIChsYW5nX2ZpbmlzaCk6IERvbid0IHdhcm4gaWYgZW50cnkgc3ltYm9sIG5vdCBmb3VuZAotCXdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBXYXJuIGlmCi0JYXR0ZW1wdGluZyB0byBwbGFjZSBhbiBvcnBoYW5lZCByZWxvY2F0aW9uIHNlY3Rpb24gd2hlbiBnZW5lcmF0aW5nCi0JYSBkeW5hbWljYWxseSBsaW5rZWQgb2JqZWN0LgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBFTlRSWSgke0VOVFJZfSksIGFuZCBkZWZhdWx0ICR7RU5UUll9IHRvCi0JX3N0YXJ0LgotCi1GcmkgTm92IDExIDE0OjI3OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGZpZWxkIGV4cG9ydF9keW5hbWljLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBSZWNvZ25pemUgLS1leHBvcnQtZHluYW1pYy4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCVBhc3MgZXhwb3J0X2R5bmFtaWMgYXJndW1lbnQgdG8gYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucy4KLQotV2VkIE5vdiAgOSAxMjo0NzoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX29uZV9jb21tb24pOiBTZXQgU0VDX0FMTE9DIGluIGFueSBzZWN0aW9uIHdoZXJlCi0Jd2UgYWxsb2NhdGUgY29tbW9uIHN5bWJvbHMuCi0KLVR1ZSBOb3YgIDggMTc6NTA6NDMgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljQGFpYi5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIC5yZWwuaW5pdCwgLnJlbGEuaW5pdCwgLnJlbC5maW5pLCBhbmQKLQkucmVsYS5maW5pIHRvIHRoZSBsaXN0IG9mIC5yZWwqIHNlY3Rpb25zLgotCi1UdWUgTm92ICA4IDE3OjQ3OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IEFkZCBuZXcgYXJndW1lbnQgcGxhY2UuICBPbmx5IGFjY2VwdAotCWxpbmtlciBzY3JpcHRzIGlmIHBsYWNlIGlzIG5vdCBOVUxMLiAgUHV0IGNvbW1hbmRzIGZvdW5kIGluIGFuCi0JYXNzdW1lZCBsaW5rZXIgc2NyaXB0IGludG8gcGxhY2UuCi0JKGxvb2t1cF9uYW1lKTogUGFzcyBOVUxMIGFzIHBsYWNlIGFyZ3VtZW50IHRvIGxvYWRfc3ltYm9scy4KLQkob3Blbl9pbnB1dF9iZmRzKTogSW4gbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bSBjYXNlLCBwYXNzIGEgcGxhY2UKLQlhcmd1bWVudCB0byBsb2FkX3N5bWJvbHMsIGFuZCBzdG9yZSBhbnkgbmV3IHN0YXRlbWVudHMgYWZ0ZXIgdGhlCi0JY3VycmVudCBvbmUuCi0KLU1vbiBOb3YgIDcgMTU6NTM6MDIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogQnVtcCB0byAyLjUuMy4KLQotRnJpIE5vdiAgNCAxNToxMToyNiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZSpuYnNkLmMpOiBGaXggdHlwbyBpbiBkZXBlbmRlbmNpZXMuCi0KLVRodSBOb3YgIDMgMTk6MzU6NDQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogQWRkIG1pc3NpbmcgImVsc2UgdHJ1ZSIgY2xhdXNlLgotCi0JKiBlbXVscGFyYW1zL3ZheC5zaCAoT1VUUFVUX0ZPUk1BVCk6IFVzZSAiYS5vdXQiLgotCi0JKiBzY3JpcHR0ZW1wbC9nbzMyY29mZi5zYzogQ2hhbmdlcyBmcm9tIERKIERlbG9yaWU6IENoYW5nZSBkZWZhdWx0Ci0JZW50cnkgcG9pbnQgdG8gInN0YXJ0Ii4gIEFsaWduIGF0IGVuZCBvZiBlYWNoIHNlY3Rpb24gdG8gMHgyMDAuCi0JU3RhcnQgLnRleHQgc2VjdGlvbiAweDEwMDAgbGF0ZXIuICBBZGQgX2V0ZXh0LCBfZWRhdGEsIF9lbmQKLQlzeW1ib2xzLgotCi1XZWQgTm92ICAyIDEyOjE3OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogRG9uJ3QgcGVybWl0IGEgc2V0IHRvIGJlCi0JY29tcG9zZWQgb2YgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMuCi0JKGxkY3Rvcl9idWlsZF9zZXRzKTogSWYgdGhlIG91dHB1dCBmb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUKLQlyZWxvYywgYW5kIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0cnkgZ2V0dGluZwotCXRoZSByZWxvYyBmcm9tIHRoZSBpbnB1dCBmb3JtYXQuCi0KLVR1ZSBOb3YgIDEgMTA6MzA6MTkgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbTY4a25ic2Quby4KLQkgIChlbTY4a25ic2QuYyk6IE5ldyB0YXJnZXQuCi0KLQkqIGNvbmZpZy9tNjhrLW5ic2QubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9tNjhrbmJzZC5zaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKG02OCotKi1uZXRic2QqKTogVXNlIGFib3ZlIGNvbmZpZ3MuCi0KLU1vbiBPY3QgMzEgMTk6MzU6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBJZiB3ZSBmaW5kIGFuCi0JYXBwcm9wcmlhdGVseSBuYW1lZCBzdGF0aWMgbGlicmFyeSwgc3RvcCB0aGUgc2VhcmNoIGF0IHRoYXQKLQlkaXJlY3RvcnkuCi0KLVdlZCBPY3QgMjYgMTM6NTk6MTIgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlaTM4Nm5ic2QubywgZW5zMzJrbmJzZC5vCi0JICBhbmQgZXNwYXJjbmJzZC5vOyBzb3J0ZWQgZW50cmllcy4KLSAgICAgICAgICAoZWkzODZuYnNkLmMsZW5zMzJrbmJzZC5jLGVzcGFyY25ic2QuYyk6IE5ldyB0YXJnZXRzLgotCi0JKiBjb25maWcvbmV0YnNkNTMyLm10OiBSZW1vdmVkLgotCSogZW11bHBhcmFtcy9uZXRic2Q1MzIuc2g6IFJlbW92ZWQuCi0KLQkqIGNvbmZpZy97aTM4Ni1uYnNkLm10LG5zMzJrLW5ic2QubXQsc3BhcmMtbmJzZC5tdH06IE5ldyBmaWxlcy4KLQkqIGVtdWxwYXJhbXMve2kzODZuYnNkLnNoLG5zMzJrbmJzZC5zaCxzcGFyY25ic2Quc2h9OiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotbmV0YnNkKiwgbnMzMmstcGM1MzItbmV0YnNkKiwKLQkgIHNwYXJjKi0qLW5ldGJzZCopOiBVc2UgYWJvdmUgY29uZmlncy4KLQotVHVlIE9jdCAyNSAxMTo0NzoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtdWx0aXBsZV9jb21tb24pOiBPbmUgb2YgdGhlIHR5cGVzIG1heSBub3cgYmUKLQliZmRfbGlua19oYXNoX2luZGlyZWN0LiAgVGhlIG9sZCBCRkQgYXJndW1lbnQgbWF5IGJlIE5VTEwuCi0KLVRodSBPY3QgMjAgMjI6MDE6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCAqIGF0IHRoZSBlbmQgb2YgbTY4ay1ocC1ocHV4LgotCi1UdWUgT2N0IDE4IDE1OjU4OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGRsZXgubDogQ2FzdCBhc3NpZ25tZW50IHRvIHl5X2NoX2J1ZiBmaWVsZCB0byBjaGFyICosIG5vdCB0bwotCVlZX0NIQVIgKi4KLQotTW9uIE9jdCAxNyAxNDo1MzoxNiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL253LnNjOiBHYXRoZXIgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQKLQkgIGRlZmluZSBfX0NUT1JfX0xJU1RfXyBhbmQgX19EVE9SX0xJU1RfXyBhcHByb3ByaWF0ZWx5LgotCi1GcmkgT2N0IDE0IDE0OjM1OjM4IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVpMzg2bncubyBhbmQgZXBwY253Lm8uCi0JICAoZWkzODZudy5jLCBlcHBjbncuYyk6IE5ldyB0YXJnZXRzLgotCi0JKiBjb25maWcve2kzODYscHBjfS1udy5tdCwgZW11bHBhcmFtcy97aTM4NixwcGN9bncuc2gsCi0JICBzY3JpcHR0ZW1wbC9udy5zYzogTmV3IGZpbGVzLCBmb3IgaTM4NiBhbmQgcG93ZXJwYyBuZXR3YXJlLgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZWQgbmV0d2FyZSBsZF90YXJnZXQgbmFtZSB0byBiZSB7aTM4NixwcGN9LW53Ci0JICBpbnN0ZWFkIG9mIHtpMzg2LHBwY30tZWxmLgotCi0gCSogY29uZmlndXJlLmluIChzcGFyYyotKi1uZXR3YXJlKTogUmVtb3ZlZC4gIFRoZXJlIGlzIG5vIHN1Y2gKLQkgIHRoaW5nIGFueW1vcmUuCi0KLQkqIGxkaW50LnRleGluZm86IE1vdmUgbWlzcGxhY2VkIGBAZW5kIGlmdGV4Jy4KLQotRnJpIE9jdCAxNCAxMjowMjoxOCAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWNAYWliLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgLnJlbC5jdG9ycywgLnJlbGEuY3RvcnMsIC5yZWwuZHRvcnMsIGFuZAotCS5yZWxhLmR0b3JzIHRvIHRoZSBsaXN0IG9mIC5yZWwqIHNlY3Rpb25zLgotCi1UaHUgT2N0IDEzIDE0OjE2OjI3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IFVwZGF0ZSB0byB2ZXJzaW9uIDIuNS4KLQkqIFZlcnNpb24gMi41IHJlbGVhc2VkLgotCi0JKiBjb25maWd1cmUuaW4gKGFsbF90YXJnZXRzKTogSGFuZGxlIGkzODYtbGludXgqLgotCi1UaHUgT2N0IDEzIDExOjI0OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogU2V0IF9ldGV4dCBhbmQgX19ldGV4dCB0byAuLCBub3QKLQkke0RBVEFfQUxJR05NRU5UfS4gIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIFN1bk9TLCBhbmQsIHdpdGggbHVjaywKLQl3aWxsIG5vdCBicmVhayBhbnkgb3RoZXIgc3lzdGVtLiAgRnJvbSBFcmljIFZhbGV0dGUKLQk8ZXZAY2hvcnVzLmZyPi4KLQotV2VkIE9jdCAxMiAxNjoyMjo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQ2hhbmdlIC1WIHRvIGJlIGEgc3lub255bSBmb3IgLXYuICBBZGQKLQktLXZlcmJvc2UgdG8gZ2V0IHRoZSBvbGQgLVYgYmVoYXZpb3VyLgotCSogbGQuMSwgbGQudGV4aW5mbzogRG9jdW1lbnQgdGhpcyBjaGFuZ2UuCi0KLVR1ZSBTZXAgMjcgMTQ6NTY6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJlbW92ZQotCWFzc2VydGlvbiwgc2luY2UgaXQgY291bGQgZmFpbCB3aXRoIGEgdXNlciBkZWZpbmVkIGxpbmtlciBzY3JpcHQuCi0KLQkqIGxkZXhwLmMgKGZvbGRfbmFtZSk6IEZvciBERUZJTkVEIGNhc2UsIGRvbid0IHRyeSB0byBsb29rIHVwIHRoZQotCW5hbWUgaW4gdGhlIGhhc2ggdGFibGUgZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS0tdGhlIGhhc2ggdGFibGUgZG9lcwotCW5vdCBldmVuIGV4aXN0IGF0IHRoYXQgcG9pbnQsIG11Y2ggbGVzcyBoYXZlIHRoZSByaWdodCB2YWx1ZS4KLQotCSogTWFrZWZpbGUuaW4gKENDKTogRGVmaW5lLgotCShDWFgpOiBNb3ZlIGRlZmluaXRpb24sIGNoYW5nZSBmcm9tIGcrKyB0byBnY2MuCi0JKEVYUEVDVCwgUlVOVEVTVCk6IENvcHkgZGVmaW5pdGlvbnMgZnJvbSB0b3AgbGV2ZWwgTWFrZWZpbGUuaW4uCi0JKFJVTlRFU1RfQ0MsIFJVTlRFU1RfQ0ZMQUdTKTogUmVtb3ZlLgotCShSVU5URVNUX0NYWCwgUlVOVEVTVF9DWFhGTEFHUyk6IFJlbW92ZS4KLQkoQ0NfRk9SX1RBUkdFVCwgQ1hYX0ZPUl9UQVJHRVQpOiBDb3B5IGZyb20gdG9wIGxldmVsIE1ha2VmaWxlLmluLgotCSguY2Mubyk6IENvbW1lbnQgb3V0LgotCSh0ZXN0ZGlyKTogUmVtb3ZlLgotCShzaXRlLmV4cCk6IERvbid0IGNyZWF0ZSB0ZXN0ZGlyIG9yIHNldCB0bXBkaXIuCi0JKGNoZWNrKTogUnVuIGNoZWNrcyBldmVuIGlmIG5vdCBydW5uaW5nIG5hdGl2ZS4gIFVzZSBDQ19GT1JfVEFSR0VUCi0JaW5zdGVhZCBvZiBSVU5URVNUX0NDLCBhbmQgbGlrZXdpc2UgZm9yIENYWC4KLQkoY2R0ZXN0IHRhcmdldHMpOiBDb21tZW50IG91dC4KLQkqIGNvbmZpZy9zb2xhcmlzMi5taCAoSE9TVElOR19MSUJTKTogT25seSBtZW50aW9uIGNydGVuZC5vIG9uY2UuCi0JKiBjZHRlc3QtYmFyLmNjLCBjZHRlc3QtZm9vLmNjLCBjZHRlc3QtZm9vLmg6IFJlbW92ZS4KLQkqIGNkdGVzdC1tYWluLmNjLCBjZHRlc3QuZXhwOiBSZW1vdmUuCi0KLU1vbiBTZXAgMjYgMTE6NDA6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2VsZjMyYm1pcC5zaDogUmVuYW1lIGZyb20gZWxmMzJtaXBiLnNoIHRvIGF2b2lkIERPUwotCWZpbGUgbmFtaW5nIHByb2JsZW1zLgotCSogZW11bHBhcmFtcy9lbGYzMmxtaXAuc2g6IFJlbmFtZSBmcm9tIGVsZjMybWlwbC5zaC4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IFJlbmFtZSBlZWxmMzJtaXBiLm8gdG8KLQllZWxmMzJibWlwLm8gYW5kIGVlbGYzMm1pcGwubyB0byBlZWxmMzJsbWlwLm8uCi0JKGVlbGYzMmJtaXAuYyk6IFJlbmFtZSBmcm9tIGVlbGYzMm1pcGIuYy4gIFVzZSBlbGYzMmJtaXAuc2guCi0JKGVlbGYzMmxtaXAuYyk6IFJlbmFtZSBmcm9tIGVlbGYzMm1pcGwuYy4gIFVzZSBlbGYzMmxtaXAuc2guCi0JKiBjb25maWcvbWlwc2ItZWxmMzIubXQgKEVNVUwpOiBVc2UgZWxmMzJibWlwLCBub3QgZWxmMzJtaXBiLgotCSogY29uZmlnL21pcHNsLWVsZjMyLm10IChFTVVMKTogVXNlIGVsZjMybG1pcCwgbm90IGVsZjMybWlwbC4KLQotCSogZ2Vuc2NyaXB0cy5zaDogQWx3YXlzIHNlYXJjaCAvdXNyL2xvY2FsL1RBUkdFVC9saWIuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogSWYgLU4gaXMgc2V0LCBmb3JjZSBEQVRBX0FERFIgdG8gYmUgIi4iLgotCi1GcmkgU2VwIDIzIDE1OjA1OjQ5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGkzODYtYnNkaSogdGFyZ2V0cyBsaWtlIGkzODYtYnNkLgotCi1GcmkgU2VwIDIzIDAwOjA2OjU5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgc3VwcG9ydCBmb3IgLWEgZm9yIEhQL1VYCi0JY29tcGF0aWJpbGl0eS4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiAtYyB0YWtlcyBhbiBhcmd1bWVudC4KLQotVHVlIFNlcCAyMCAxNDozNToyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBuZXcgZmllbGQgZW5kaWFuLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLUVCIGFuZCAtRUwgYnkgc2V0dGluZwotCWNvbW1hbmRfbGluZS5lbmRpYW4uCi0JKiBsZGdyYW0ueSAoaWZpbGVfcDEpOiBBY2NlcHQgT1VUUFVUX0ZPUk1BVCB3aXRoIHRocmVlIGFyZ3VtZW50cy4KLQkqIGxkbGFuZy5jIChsYW5nX2FkZF9vdXRwdXRfZm9ybWF0KTogQWRkIGFyZ3VtZW50cyBiaWcgYW5kIGxpdHRsZS4KLQlJZiBjb21tYW5kX2xpbmUuZW5kaWFuIGlzIHNldCwgdXNlIGl0IHRvIHNlbGVjdCBiaWcgb3IgbGl0dGxlCi0JcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCSogbGRsYW5nLmggKGxhbmdfYWRkX291dHB1dF9mb3JtYXQpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBlbXVscGFyYW1zL2VsZjMybWlwYi5zaDogRGVmaW5lIEJJR19PVVRQVVRfRk9STUFUIGFuZAotCUxJVFRMRV9PVVRQVVRfRk9STUFULgotCSogZW11bHBhcmFtcy9lbGYzMm1pcGwuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9taXBzYmlnLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvbWlwc2JzZC5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL21pcHNpZHQuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9taXBzaWR0bC5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL21pcHNsaXQuc2g6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBEZWZpbmUgQklHX09VVFBVVF9GT1JNQVQgYW5kCi0JTElUVExFX09VVFBVVF9GT1JNQVQgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4gIFBhc3MgdGhlbSB0bwotCU9VVFBVVF9GT1JNQVQuCi0JKiBzY3JpcHR0ZW1wbC9taXBzLnNjOiBQYXNzIEJJR19PVVRQVVRfRk9STUFUIGFuZAotCUxJVFRMRV9PVVRQVVRfRk9STUFUIHRvIE9VVFBVVF9GT1JNQVQuCi0JKiBzY3JpcHR0ZW1wbC9taXBzYnNkLnNjOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW4gKGxkZ3JhbS5oKTogTWFrZSBzZXBhcmF0ZSB0YXJnZXQgZnJvbSBsZGdyYW0uYywKLQlkZXBlbmRpbmcgdXBvbiBsZGdyYW0uYywgc28gdGhhdCBhIHBhcmFsbGVsIG1ha2UgZG9lcyBub3QgdHJ5IHRvCi0JYnVpbGQgYm90aCBhdCBvbmNlLgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMqZWwtZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMybWlwYi5vIGFuZCBlZWxmMzJtaXBsLm8uCi0JKGVlbGYzMm1pcGwuYyk6IE5ldyB0YXJnZXQuCi0KLQkqIGNvbmZpZy9taXBzbC1lbGYzMi5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2VsZjMybWlwbC5zaDogTmV3IGZpbGUuCi0KLUZyaSBTZXAgMTYgMTI6MTY6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAobWFpbik6IFJhdGhlciB0aGFuIHByb2hpYml0aW5nIGxkIC1yIC1zLCB0cmVhdCBpdCBhcwotCWxkIC1yIC1TIC14LgotCi1UaHUgU2VwIDE1IDEzOjA1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IFByaW50IEJGRCBmaWxlIG5hbWUgYXMgd2VsbCBhcyBmaWxlIG5hbWUKLQlyZXR1cm5lZCBieSBmaW5kX25lYXJlc3RfbGluZSwgaW4gY2FzZSB0aGUgZmlsZSBuYW1lIGlzIHNvbWV0aGluZwotCXVuaGVscGZ1bCBzdWNoIGFzIGEgLmggZmlsZS4gIEhhbmRsZSAldS4KLQotV2VkIFNlcCAxNCAxMjo0OToxMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19kb19hc3NpZ25tZW50cyk6IE1ha2Ugc3VyZSBvdXRwdXQgc3RhdGVtZW50Ci0JaGFzIGFuIGF0dGFjaGVkIGJmZF9zZWN0aW9uIGJlZm9yZSB0cnlpbmcgdG8gZGVyZWZlcmVuY2UgaXQuCi0KLVdlZCBTZXAgMTQgMTI6NDg6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCBuZXcgZmllbGQgd2Fybl9vbmNlLgotCSogbGRtYWluLmMgKHVuZGVmaW5lZF9zeW1ib2wpOiBIYW5kbGUgLXdhcm4tb25jZS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogUmVjb2duaXplIC13YXJuLW9uY2UuCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogRG9jdW1lbnQgLXdhcm4tb25jZS4KLQkqIGxkLjE6IExpa2V3aXNlLgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogSGFuZGxlICVEIGFzICVDLCBidXQgbmV2ZXIgcHJpbnQgdGhlIGZ1bmN0aW9uCi0JbmFtZS4gIEZvciAlQywgcHJpbnQgdGhlIGZ1bmN0aW9uIG5hbWUgb24gYSBzZXBhcmF0ZSBsaW5lLCB0byBrZWVwCi0JdGhlIGxlbmd0aCBvZiBlcnJvciBtZXNzYWdlcyB1bmRlciBjb250cm9sLgotCSogbGRtYWluLmMgKG11bHRpcGxlX2RlZmluaXRpb24pOiBVc2UgJUQgZm9yIGBgZmlyc3QgZGVmaW5lZAotCWhlcmUuJycKLQkodW5kZWZpbmVkX3N5bWJvbCk6IFVzZSAlRCBmb3IgYGBtb3JlIHVuZGVmaW5lZCByZWZlcmVuY2VzCi0JZm9sbG93JycuCi0KLQkqIGxkbWlzYy5jIChtdWx0aXBsZV93YXJuKTogUmVtb3ZlOyBubyBsb25nZXIgdXNlZC4KLQkqIGxkbWlzYy5oIChtdWx0aXBsZV93YXJuKTogRG9uJ3QgZGVjbGFyZS4KLQotVHVlIFNlcCAxMyAyMDo0Nzo1OCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogUHJpbnQgYWxsIGxpbmVzCi0JdG8gdGhlIG1hcCBmaWxlLgotCi1UdWUgU2VwIDEzIDE2OjMwOjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IENoZWNrIGZvciBhcmNoaXZlIGJlZm9yZSBvYmplY3QuICBVc2UKLQliZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMsIGFuZCwgaWYgYW1iaWd1b3VzLCBwcmludCBhIGxpc3Qgb2YKLQltYXRjaGluZyBmb3JtYXRzLiAgSWYgZmlsZSBmb3JtYXQgaXMgbm90IHJlY29nbml6ZWQsIHRyZWF0IGZpbGUgYXMKLQlhIGxpbmtlciBzY3JpcHQuCi0JKiBsZGdyYW0ueSAoeXllcnJvcik6IElmIGFzc3VtaW5nIGFuIG9iamVjdCBmaWxlIGlzIGEgc2NyaXB0LAotCW1lbnRpb24gdGhhdC4gIFR3ZWFrIHRoZSBmb3JtYXQgb2YgdGhlIGVycm9yIG1lc3NhZ2VzLgotCSogbGRsZXgubCAobGV4X3dhcm5faW52YWxpZCk6IElmIGFzc3VtaW5nIGFuIG9iamVjdCBpcyBhIHNjcmlwdCwKLQlndWVzcyB0aGF0IHRoaXMgaXMgbm90IGFjdHVhbGx5IGEgc2NyaXB0LCBhbmQganVzdCByZXBvcnQgdGhhdCB0aGUKLQlmaWxlIGZvcm1hdCB3YXMgbm90IHJlY29nbml6ZWQuCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogQWRtaXQgdGhhdCAtKCBtYXkgYmUgdXNlZCBtb3JlIHRoYW4gb25jZS4KLQlBZGQgbm90ZSB0aGF0IHVucmVjb2duaXplZCBvYmplY3QgZmlsZXMgYXJlIG5vdyB0cmVhdGVkIGFzIGxpbmtlcgotCXNjcmlwdHMuCi0KLQkqIGxkZmlsZS5jIChsZGZpbGVfaW5wdXRfZmlsZW5hbWUpOiBNYWtlIGNvbnN0LgotCShsZGZpbGVfYXNzdW1lZF9zY3JpcHQpOiBOZXcgdmFyaWFibGUuCi0JKHRyeV9vcGVuKTogQ2hhbmdlIGFyZ3VtZW50cyB0eXBlcyB0byBjb25zdC4KLQkobGRmaWxlX2ZpbmRfY29tbWFuZF9maWxlKTogTGlrZXdpc2UuCi0JKGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSk6IExpa2V3aXNlLiAgQWxzbywgc2V0IGxpbmVubyB0byAxLgotCSogbGRmaWxlLmg6IFVwZGF0ZSBkZWNsYXJhdGlvbnMgZm9yIGxkZmlsZS5jIGNoYW5nZXMuCi0JKiBsZGxleC5sOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkoZmlsZV9uYW1lX3N0YWNrKTogQ2hhbmdlIHRvIGJlIGNvbnN0IGNoYXIgKi4KLQkobGluZW5vX3N0YWNrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoPDxFT0Y+Pik6IFNldCBsaW5lbm8gYXMgd2VsbCBhcyBsZGZpbGVfaW5wdXRfZmlsZW5hbWUuCi0JKGxleF9wdXNoX2ZpbGUpOiBNYWtlIG5hbWUgYXJndW1lbnQgY29uc3QuICBJbml0aWFsaXplCi0JbGluZW5vX3N0YWNrIGVudHJ5LgotCShsZXhfcmVkaXJlY3QpOiBJbml0aWFsaXplIGxpbmVub19zdGFjayBlbnRyeS4KLQkobGV4X3dhcm5faW52YWxpZCk6IEhhbmRsZSBub24gcHJpbnRhYmxlIGNoYXJhY3RlcnMgbmljZWx5LgotCSogbGRsZXguaCAobGV4X3B1c2hfZmlsZSk6IERlY2xhcmUgc2Vjb25kIGFyZ3VtZW50IGFzIGNvbnN0LgotCi0JKiBsZGdyYW0ueSAoaWZpbGVfcDEpOiBSZWNvZ25pemUgR1JPVVAuCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgR1JPVVAuCi0JKiBsZC50ZXhpbmZvIChPcHRpb24gQ29tbWFuZHMpOiBEb2N1bWVudCBHUk9VUC4KLQotTW9uIFNlcCAxMiAxNzowNDoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tNjhrbHlueC5taDogTmV3IGZpbGUuCi0KLU1vbiBTZXAgMTIgMDE6NTA6MDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtOiBBZGQgbmV3bGluZXMgdG8gdGhlIGVycm9yIG1lc3NhZ2VzLgotCi1TYXQgU2VwIDEwIDE2OjA1OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2kzODZseW54Lm1oOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2kzODZseW54LnNjOiBEb24ndCBwdXQgLmN0b3JzIGFuZCAuZHRvcnMgaW4gLnRleHQKLQl1bmxlc3MgQ09OU1RSVUNUSU5HLgotCi1UaHUgU2VwICA4IDEzOjI1OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9lbGYzMm1pcGIuc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUgYXMgZWxmMzIuCi0JKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IERlZmluZSBhcyB5ZXMuCi0JKERZTkFNSUNfTElOSyk6IERlZmluZSBhcyBmYWxzZS4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKToKLQlJbml0aWFsaXplIGNvbmZpZy5keW5hbWljX2xpbmsgdG8gRFlOQU1JQ19MSU5LIGlmIGl0IGlzIGRlZmluZWQuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJlc2V0IHN0YXRfcHRyIGF0IGVuZC4KLQkqIE1ha2VmaWxlLmluIChlZWxmMzJtaXBiLmMpOiBEZXBlbmQgdXBvbiBlbGYzMi5lbSByYXRoZXIgdGhhbgotCWdlbmVyaWMuZW0uCi0KLVRodSBTZXAgIDggMTY6MzA6MzcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIHNjcmlwdHRlbXBsL2g4NTAwYi5zYzogUHV0IHJkYXRhIHN0dWZmIGludG8gb3duIHNlZ21lbnQuCi0KLVRodSBTZXAgIDggMTM6MjU6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoIChPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMpOiBEb24ndCBkZWZpbmU7Ci0JLmdvdCBzZWN0aW9uIGlzIG5vdyBleHBsaWNpdGx5IGhhbmRsZWQgaW4gZWxmLnNjLgotCi1XZWQgU2VwICA3IDEzOjA4OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvYWxwaGEuc2M6IFJlZG8gc2NyaXB0IHRvIHNldCAuIG91dHNpZGUgb2Ygc2VjdGlvbnMKLQlhbmQgbm90IGJvdGhlciB0byBleHBsaWNpdGx5IHNwZWNpZnkgc2VjdGlvbiBhZGRyZXNzZXMuCi0JRXhwbGljaXRseSBwbGFjZSAuc2RhdGEgc2VjdGlvbi4KLQotVHVlIFNlcCAgNiAyMzo1MTo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBQdXQgLmJzcyBpbiBkYXRhIHNlZ21lbnQuCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBDaGFuZ2UgLnN0YWIgYW5kIC5zdGFic3RyIHRvIHVzZSBhIFZNQSBvZgotCTAsIGFuZCB0byBvbmx5IGJlIG1hcmtlZCBhcyBOT0xPQUQgaWYgcmVsb2NhdGluZy4KLQkqIHNjcmlwdHRlbXBsL2g4NTAwLnNjLCBzY3JpcHR0ZW1wbC9oODUwMGIuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvaDg1MDBjLnNjLCBzY3JpcHR0ZW1wbC9oODUwMG0uc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvaDg1MDBzLnNjLCBzY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYywgc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MsIHNjcmlwdHRlbXBsL202OGtseW54LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL3NoLnNjLCBzY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjOiBMaWtld2lzZS4KLQotU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCAoZGlzYWJsZWQpIHRoZSBBUk0vUklTQ2lYLgotCSogY29uZmlnL3Jpc2NpeC5tdCwgZW11bHBhcmFtcy9yaXNjaXguc2gsIHNjcmlwdHRlbXBsL3Jpc2NpeC5zYzoKLQlOZXcgZmlsZXMuCi0KLVR1ZSBBdWcgMzAgMTE6NDg6MDggMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgZmllbGQgc29uYW1lLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLXNvbmFtZSBhcmd1bWVudC4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogSW4gY2FsbCB0byBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zLAotCXBhc3Mgc29uYW1lLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgLXNvbmFtZS4KLQotTW9uIEF1ZyAyOSAxNToyMTo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX2NoZWNrKTogRG9uJ3QgdHJ5IHRvIHNldCB0aGUgYXJjaGl0ZWN0dXJlIGlmIHRoZQotCWlucHV0IGFuZCBvdXRwdXQgZmlsZXMgYXJlIGluY29tcGF0aWJsZS4gIEp1c3Qgd2Fybi4KLQotV2VkIEF1ZyAyNCAxMjo1MjozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCi0KLVN1biBBdWcgMjEgMTY6MTc6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2hwM2hwdXguc2g6IERlZmluZSBfX0RZTkFNSUMgdG8gYmUgMC4KLQotVGh1IEF1ZyAxOCAxNTozNzo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQlNYWtlIHRoZSBFTEYgbGlua2VyIGhhbmRsZSBvcnBoYW5lZCBzZWN0aW9ucyByZWFzb25hYmx5LiAgQWxzbywKLQlkZWZpbmUgX19zdGFydF9TRUNOQU1FIGFuZCBfX3N0b3BfU0VDTkFNRSBhcm91bmQgc2VjdGlvbnMgd2hvc2UKLQluYW1lcyBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gQywgZm9yIHRoZSBiZW5lZml0IG9mIHN5bWJvbCBzZXRzIGluCi0JZ2xpYmMuCi0JKiBsZGVtdWwuaCAobGRlbXVsX3BsYWNlX29ycGhhbik6IERlY2xhcmUuCi0JKGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUpOiBBZGQgcGxhY2Vfb3JwaGFuIGZpZWxkLgotCSogbGRlbXVsLmMgKGxkZW11bF9wbGFjZV9vcnBoYW4pOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGxhbmcuaCAod2lsZF9kb2l0KTogRGVjbGFyZS4KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBNYWtlIG5vbnN0YXRpYy4KLQkobGFuZ19wbGFjZV9vcnBoYW5zKTogQ2FsbCBsZGVtdWxfcGxhY2Vfb3JwaGFuLgotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBJbmNsdWRlIDxjdHlwZS5oPiBhbmQgImxkZ3JhbS5oIi4KLQkoaG9sZF9zZWN0aW9uLCBob2xkX3VzZSwgaG9sZF90ZXh0LCBob2xkX2RhdGEsIGhvbGRfYnNzKTogTmV3Ci0Jc3RhdGljIHZhcmlhYmxlcy4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IEluaXRpYWxpemUgcGxhY2Vfb3JwaGFuIGZpZWxkLgotCi1UdWUgQXVnIDE2IDAwOjE3OjIwIDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogQWRkIC5saW51eC1keW5hbWljIGFmdGVyIC5kYXRhLgotCi1UdWUgQXVnIDE2IDAwOjA4OjIyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpIFRyZWF0IC0tZGxsLXZlcmJvc2UgYXMgLS12ZXJzaW9uLCBmb3IKLQlMaW51eCBjb21wYXRpYmlsaXR5LiAgRnJvbSBoamxAbnluZXhzdC5jb20gKEguSi4gTHUpLgotCi1Nb24gQXVnIDE1IDE3OjE3OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGRleHAuaCAoZXhwX2dldF9hYnNfaW50KTogRGVjbGFyZS4KLQotU2F0IEF1ZyAgNiAwMTo0NTozOSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19kb19hc3NpZ25tZW50cyk6ICBIYW5kbGUgY29tcGxleCBBVCdzIGJldHRlci4KLQkqIGxkZXhwLmMgKGV4cF9nZXRfYWJzX2ludCk6ICBOZXcgZnVuY3Rpb24uCi0KLUZyaSBBdWcgIDUgMjA6NTU6NTUgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhZGQgaTk2MC1uaW5keS1jb2ZmIHN1cHBvcnQuCi0KLVRodSBBdWcgIDQgMTQ6NDU6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sICh5eV9jcmVhdGVfc3RyaW5nX2J1ZmZlcik6IEhhbmRsZSBjaGFuZ2UgdG8gaW50ZXJuYWwKLQlpbnRlcmZhY2UgaW4gZmxleCAyLjQuNy4KLQotVHVlIEF1ZyAgMiAxMTo1MjowNiAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9saW51eC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hZGRyZXNzX3N0YXRlbWVudCk6Ci0JTmV3IGZ1bmN0aW9uOyBhZGQgMHgyMCB0byBhbnkgdXNlIG9mIC1UdGV4dC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiBOZXcKLQlmdW5jdGlvbi4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogVXNlIHRoZSBuZXcgZnVuY3Rpb24KLQlnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cy4KLQotTW9uIEF1ZyAgMSAxNTo1MDo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IFJlZG8gc2NyaXB0IHRvIHNldCAuIG91dHNpZGUgb2Ygc2VjdGlvbnMKLQlhbmQgbm90IGJvdGhlciB0byBleHBsaWNpdGx5IHNwZWNpZnkgc2VjdGlvbiBhZGRyZXNzZXMuCi0KLVR1ZSBKdWwgMjYgMTE6MDI6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IENvcHkgc2V2ZXJhbCBtb3JlIHJlbG9jYXRpb24gc2VjdGlvbnMgaW50bwotCXRoZSBvdXRwdXQuICBQdXQgLmdvdC5wbHQgc2VjdGlvbnMgaW50byAuZ290LgotCi1GcmkgSnVsIDIyIDEyOjE1OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBVc2UgUFJPVklERSB0byBkZWZpbmUgZXRleHQsIGVkYXRhLCBhbmQgZW5kLgotCi0JQWRkIGEgbmV3IHNjcmlwdCBvcGVyYXRvciwgUFJPVklERSwgdG8gZGVmaW5lIGEgc3ltYm9sIG9ubHkgaWYgaXQKLQlpcyBuZWVkZWQuCi0JKiBsZGdyYW0ueSAoUFJPVklERSk6IE5ldyB0b2tlbi4KLQkoYXNzaWdubWVudCk6IEFjY2VwdCBQUk9WSURFLgotCSogbGRsZXgubCAoUFJPVklERSk6IE5ldyB0b2tlbi4KLQkqIGxkZXhwLmggKG5vZGVfdHlwZSk6IEFkZCBldHJlZV9wcm92aWRlIHRvIG5vZGVfY2xhc3MgZW51bS4KLQkoZXhwX3Byb3ZpZGUpOiBEZWNsYXJlLgotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IEhhbmRsZSBldHJlZV9wcm92aWRlLgotCShleHBfcHJvdmlkZSk6IE5ldyBmdW5jdGlvbi4KLQkoZXhwX3ByaW50X3RyZWUpOiBIYW5kbGUgZXRyZWVfcHJvdmlkZS4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IFBST1ZJREUuCi0KLQkqIGxkbGFuZy5jIChsYW5nX2NvbW1vbik6IFBhc3MgZGVzaXJlZCBhbGlnbm1lbnQgdG8KLSAgICAgICAgbGFuZ19vbmVfY29tbW9uIGFzIHBvd2VyIG9mIHR3by4KLQkobGFuZ19vbmVfY29tbW9uKTogR2V0IGNvbW1vbiBzeW1ib2wgYWxpZ25tZW50IGZyb20gbGlua2VyIGhhc2gKLQl0YWJsZSBlbnRyeS4gIFRyZWF0IGRlc2lyZWQgYWxpZ25tZW50IGFzIGEgcG93ZXIgb2YgdHdvLgotCi0JKiBsZGxhbmcuYyAod2lsZF9zZWN0aW9uKTogQXR0YWNoIGFsbCBzZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUsCi0Jbm90IGp1c3QgdGhlIGZpcnN0IG9uZS4gIElmIHRoZXJlIGlzIG5vIG5hbWUsIGF0dGFjaCBhbGwgc2VjdGlvbnMKLQlldmVuIGlmIHRoZSBTRUNfSVNfQ09NTU9OIGZsYWcgaXMgc2V0LgotCi1XZWQgSnVsIDIwIDE1OjQ5OjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGZpZWxkIHJwYXRoLgotCSogbGV4c3VwLmMgKFNfSVNESVIpOiBEZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkocGFyc2VfYXJncyk6IEFkZCBzdXBwb3J0IGZvciAtcnBhdGguICBJZiAtUiBpcyB1c2VkIHRvIG5hbWUgYQotCWRpcmVjdG9yeSwgdHJlYXQgaXQgYXMgLXJwYXRoIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlQYXNzIGNvbW1hbmRfbGluZS5ycGF0aCB0byBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zLgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGNvbW1hbmRfbGluZS5ycGF0aCB0byBOVUxMLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgLXJwYXRoIG9wdGlvbi4KLQotU3VuIEp1bCAxMCAwMDozMzoyNCAxOTk0ICBJYW4gRGFsbCAgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkKLQotCSogZW11bHBhcmFtcy9wYzUzMm1hY2hhb3V0LnNoOiBOZXcgZmlsZS4gUGM1MzIgbWFjaCBzY3JpcHQKLQlwYXJhbWV0ZXJzLgotCi0JKiBlbXVscGFyYW1zL25ldGJzZDUzMi5zaDogTmV3IGZpbGUuIE5ldGJzZCA1MzIgc2NyaXB0IHBhcmFtZXRlcnMuCi0KLQkqIGNvbmZpZy9wYzUzMm1hY2gubXQ6IE5ldyBmaWxlLiBQYzUzMiBtYWNoIHRhcmdldCBzdXBwb3J0LgotCi0JKiBjb25maWcvcGM1MzJtYWNoLm1oOiBOZXcgZmlsZS4gUGM1MzIgbWFjaCBob3N0IHN1cHBvcnQuCi0KLQkqIGNvbmZpZy9uZXRic2Q1MzIubXQ6IE5ldyBmaWxlLiBOZXRic2QgNTMyIHRhcmdldCBzdXBwb3J0LgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBuczMyay1wYzUzMi1tYWNoIGFuZCBuczMyay1wYzUzMi1uZXRic2Qgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBlcGNtYWNoYW91dC5jIGRlcGVuZGVuY3kgYW5kIGVuZXRic2Q1MzIuYwotCWRlcGVuZGVuY3kuCi0KLUZyaSBKdWwgIDggMTA6NTc6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogVXNlCi0JYmZkX2Fic19zZWN0aW9uX3B0ciwgbm90ICZiZmRfYWJzX3NlY3Rpb24uCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQ2hhbmdlZCAicmV0YWluLXN5bWJvbHMtZmlsZSIgZnJvbQotCW5vX2FyZ3VtZW50IHRvIHJlcXVpcmVkX2FyZ3VtZW50LiAgRnJvbSBkam0uCi0KLVRodSBKdWwgIDcgMTI6Mjk6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEV4cGxpY2l0bHkgbWVudGlvbiAuc3RhYiBhbmQgLnN0YWJzdHIKLQlzZWN0aW9ucyB0byBmb3JjZSBhIFZNQSBvZiAwOyBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlCi0Jbm90IGJlZW4gY29udmVydGVkIHRvIHRoZSBuZXcgbGlua2VyIHN0eWxlLgotCi1Nb24gSnVsICA0IDE5OjM1OjQ1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzY3JpcHR0ZW1wbC9ocHBhZWxmLnNjIChfX3N0YWNrX3plcm8pOiBEb24ndCBkZWZpbmUgdGhpcyBuYW1lLAotCWl0IHdhcyBmb3IgdGhlIEhQVVggZHluYW1pYyBsb2FkZXIncyB1c2UgYW5kIGl0IGNyZWF0ZXMgcHJvYmxlbXMKLQl3aXRoIEVMRiBHREIuCi0KLUZyaSBKdWwgIDEgMTI6NTM6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxkbGFuZy5jIChsYW5nX2RvX2Fzc2lnbm1lbnRzKTogTm8gbG9uZ2VyIHN0YXRpYy4gIERlbGV0ZSBkZWNsLgotCSogbGRsYW5nLmggKGxhbmdfZG9fYXNzaWdubWVudHMpOiBQdXQgZXh0ZXJuYWwgZGVjbCBoZXJlLgotCSogZW11bHRlbXBsL2hwcGFlbGYuZW06IE1pbm9yIGNsZWFudXBzIHRocm91Z2hvdXQgZmlsZS4KLQkoaHBwYV9lbGZfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiBSZXdyaXRlLgotCShocHBhZWxmX2ZpbmlzaCk6IFJld3JpdGUuCi0KLVdlZCBKdW4gMjkgMTY6NTA6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvc29sYXJpczIubWggKE5BVElWRV9MSUJfRElSUyk6IERlZmluZSBhcyAvdXNyL2Njcy9saWIuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWNjZXB0IC1Cc3RhdGljIGFuZCAtQmR5bmFtaWMuICBEbyBub3QKLQlhY2NlcHQgcGxhaW4gLUIuCi0JKiBsZC50ZXhpbmZvOiAtQnN0YXRpYyBpcyBub3QgaWdub3JlZC4KLQotVHVlIEp1biAyOCAxMjoxMzozNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBcciB0aGUgc2FtZSBhcyBcbi4KLQotVGh1IEp1biAyMyAxNzo1MzowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQlQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIHNoYXJlZCBsaWJyYXJpZXMsIGZyb20gRXJpYwotCVlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBnZW5zY3JpcHRzLnNoOiBJZiB0aGUgZW11bGF0aW9uIHBhcmFtZXRlciBmaWxlIHNldHMKLSAgICAgICAgR0VORVJBVEVfU0hMSUJfU0NSSVBULCBnZW5lcmF0ZSBhIC54cyBzY3JpcHQgZmlsZSB3aXRoCi0JQ1JFQVRFX1NITElCIGRlZmluZWQuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQpOiBJZgotCWxpbmtfaW5mby5zaGFyZWQgaXMgc2V0LCB1c2UgdGhlIC54cyBzY3JpcHQgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogSWYgQ1JFQVRFX1NITElCIGlzIHNldCwgZG9uJ3QgY3JlYXRlIGEKLQkuaW50ZXJwIHNlY3Rpb24sIGFuZCBkb24ndCBpbmNsdWRlIFRFWFRfU1RBUlRfQUREUiBpbiB0aGUgc3RhcnRpbmcKLQlhZGRyZXNzIG9mIHRoZSBmaXJzdCBzZWN0aW9uLgotCSogZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUuCi0KLVRodSBKdW4gMjMgMTI6NTI6MjIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSAtLXdpdGgtdGFyZ2V0cyB0byAtLWVuYWJsZS10YXJnZXRzLgotCi1XZWQgSnVuIDIyIDEzOjQyOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgc3VwcG9ydCBmb3IgbmV3IG9wdGlvbnMgLSggLSkgd2l0aAotCXN5bm9ueW1zIC0tc3RhcnQtZ3JvdXAgLS1lbmQtZ3JvdXAuCi0JKiBsZGxhbmcuaCAoZW51bSBzdGF0ZW1lbnRfZW51bSk6IEFkZCBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtLgotCShsYW5nX2dyb3VwX3N0YXRlbWVudF90eXBlKTogRGVmaW5lIG5ldyBzdHJ1Y3QuCi0JKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUpOiBBZGQgZ3JvdXBfc3RhdGVtZW50IGZpZWxkLgotCShsYW5nX2VudGVyX2dyb3VwLCBsYW5nX2xlYXZlX2dyb3VwKTogRGVjbGFyZS4KLQkqIGxkbGFuZy5jIChsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIpOiBIYW5kbGUKLQlsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtLgotCShtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zLCBwcmludF9zdGF0ZW1lbnQpOiBMaWtld2lzZS4KLQkobGFuZ19zaXplX3NlY3Rpb25zLCBsYW5nX2RvX2Fzc2lnbm1lbnRzKTogTGlrZXdpc2UuCi0JKG9wZW5faW5wdXRfYmZkcyk6IENvbXBsZXRlbHkgcmV3cml0ZS4gIE5vdyBkb2VzIGl0cyBvd24gbG9vcGluZywKLQlyYXRoZXIgdGhhbiB1c2luZyBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEhhbmRsZSBncm91cHMuCi0JKGxhbmdfcHJvY2Vzcyk6IFVwZGF0ZSBjYWxsIHRvIG9wZW5faW5wdXRfYmZkcy4KLQkocHJpbnRfZ3JvdXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsYW5nX2VudGVyX2dyb3VwLCBsYW5nX2xlYXZlX2dyb3VwKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fZmlsZSk6IElmIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4KLQlvcGVuZWQsIGp1c3QgcmV0dXJuIHJhdGhlciB0aGFuIHRha2luZyBhbiBhc3NlcnRpb24gZmFpbHVyZS4KLQkqIGxkdmVyLmMgKGhlbHApOiBNZW50aW9uIG5ldyBvcHRpb25zLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLQkqIGxkbGFuZy5jIChlbmRfb2ZfZGF0YV9zZWN0aW9uX3N0YXRlbWVudF9saXN0KTogRG9uJ3QgZGVmaW5lLgotCShsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IERvbid0IHNldCBvYnNvbGV0ZSB2YXJpYWJsZQotCWVuZF9vZl9kYXRhX3NlY3Rpb25fc3RhdGVtZW50X2xpc3QuCi0KLQkqIHNjcmlwdHRlbXBsL2dvMzJjb2ZmLnNjOiBEb24ndCBwdXQgJHtEQVRBX0FMSUdOTUVOVH0gaW5zaWRlIGFuCi0JQUxJR04uCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBBZGp1c3QgY3VycmVudCByZWdpb24gYWRkcmVzcwotCWV2ZW4gZm9yIHNlY3Rpb25zIHdpdGggYW4gZXhwbGljaXQgYWRkcmVzcy4gIEZyb20KLQlyYWxwaGNAcHlyYW1pZC5jb20gKFJhbHBoIENhbXBiZWxsKS4KLQotCSogZW11bHBhcmFtcy9pMzg2bGludXguc2ggKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IFNldCB0byAwLgotCUZyb20ganJzQHdvcmxkLnN0ZC5jb20gKFJpY2sgU2xhZGtleSkuCi0KLQkqIHNjcmlwdHRlbXBsL21pcHNic2Quc2M6IExldCBzZWN0aW9ucyBhbGlnbiB0byB0aGVpciBuYXR1cmFsCi0JYm91bmRhcmllcy4KLQotVHVlIEp1biAyMSAxMToyNzowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX2luaXQpOiBVc2UgbmV3IGJmZF9hYnNfc2VjdGlvbl9wdHIsIG5vdAotCSZiZmRfYWJzX3NlY3Rpb24uCi0JKGxhbmdfYWJzX3N5bWJvbF9hdF9iZWdpbm5pbmdfb2YpOiBMaWtld2lzZS4KLQkobGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZik6IExpa2V3aXNlLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBVc2UgYmZkX2lzX2Fic19zZWN0aW9uIHRvIGNoZWNrIGZvciB0aGUKLQlhYnNvbHV0ZSBzZWN0aW9uLiAgRG9uJ3QgdHJ5IHRvIHNldCB0aGUgVk1BIG9yIG91dHB1dF9vZmZzZXQgb3IKLQlzaXplIG9mIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCSogbGRtYWluLmMgKG5vdGljZV95c3ltKTogVXNlIGJmZF9pc191bmRfc2VjdGlvbiB0byBjaGVjayBmb3IgdGhlCi0JdW5kZWZpbmVkIHNlY3Rpb24uCi0KLVRodSBKdW4gMTYgMjI6NDg6NDEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNjcmlwdHRlbXBsL2hwcGFlbGYuc2M6IFBsYWNlIC5kYXRhIGFuZCAuYnNzIGF0IDB4NDAwMDAwMDAKLQl3aGVuIGdlbmVyYXRpbmcgcmVsb2NhdGFibGUgb2JqZWN0cy4KLQotVGh1IEp1biAxNiAxNDoyNToyMiAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9saW51eC5lbTogTmV3IGZpbGUgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIGxpbmtpbmcKLQlhZ2FpbnN0IExpbnV4IHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdCAoZWkzODZsaW51eC5jKTogRGVwZW5kIHVwb24gbGludXguZW0uCi0JKiBlbXVscGFyYW1zL2kzODZsaW51eC5zaCAoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBsaW51eC4KLQotVGh1IEp1biAxNiAxMjoyMjowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIC1zaGFyZWQgdG8gbG9uZ29wdHMsIGFuZCBoYW5kbGUgaXQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbGlua19pbmZvLnNoYXJlZCB0byBmYWxzZS4gIEdpdmUKLQllcnJvciBpZiBsaW5rX2luZm8ucmVsb2NhdGVhYmxlIGFuZCBsaW5rX2luZm8uc2hhcmVkIGFyZSBib3RoIHNldC4KLQotCSogY29uZmlndXJlLmluOiBJZiBFTVVMX0VYVFJBKiBpcyBkZWZpbmVkIGluIGEgY29uZmlnIGZpbGUsIHRyZWF0Ci0JaXQgYXMgbmFtaW5nIGFuIGVtdWxhdGlvbiB0byBiZSBhZGRlZCB0byBFTVVMQVRJT05fT0ZJTEVTLgotCSogY29uZmlnL2kzODYtbGludXgubXQgKEVNVUxfRVhUUkExKTogRGVmaW5lIGFzIGVsZl9pMzg2LgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0JKEFMTF9FTVVMQVRJT05TKTogQWRkIGVpMzg2bGludXgubywgZWVsZjMyX3NwYXJjLm8sCi0JZWVsZjY0X3NwYXJjLm8uICBSZW1vdmUgJChPVEhFUl9FTVVMQVRJT05TKS4KLQkoZWkzODZsaW51eC5jLCBlZWxmMzJfc3BhcmMuYywgZWVsZjY0X3NwYXJjLmMpOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgotCShlaTM4NmxpbnV4LmMpOiBSZW1vdmU7IG5vdyBpbiBNYWtlZmlsZS5pbi4KLQkqIGNvbmZpZy9pMzg2LWx5bngubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvbTY4ay1seW54Lm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3NwYXJjLWx5bngubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvc3BhcmM2NC1lbGYubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCi0JKGVlbGY2NF9zcGFyYy5jKTogUmVtb3ZlOyBub3cgaW4gTWFrZWZpbGUuaW4uCi0JKiBjb25maWcvc3VuNHNvbDIubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCi0JKGVlbGYzMl9zcGFyYy5jKTogUmVtb3ZlOyBub3cgaW4gTWFrZWZpbGUuaW4uCi0KLQkqIGxkZXhwLmMgKGV4cF9wcmludF90cmVlKTogRG9uJ3QgY3Jhc2ggaWYgZXRyZWVfcmVsIHNlY3Rpb24gaGFzCi0Jbm8gb3duZXItLWl0IG1pZ2h0IGJlIGJmZF9hYnNfc2VjdGlvbi4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKLQk8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IExldCBzZWN0aW9ucyBhbGlnbiB0byB0aGVpciBuYXR1cmFsCi0JYm91bmRhcmllcy4KLQotV2VkIEp1biAxNSAwMTo1NDo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkZW11bC5oIChsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUpOiBEZWNsYXJlLgotCShsZF9lbXVsYXRpb25feGZlcl90eXBlKTogQWRkIG5ldyBmaWVsZCBvcGVuX2R5bmFtaWNfYXJjaGl2ZS4KLQkqIGxkZW11bC5jOiBJbmNsdWRlIGxkZXhwLmggYW5kIGxkbGFuZy5oLgotCShsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGZpbGUuaCAobGRmaWxlX29wZW5fZmlsZV9zZWFyY2gpOiBEZWNsYXJlLgotCSogbGRmaWxlLmM6IEluY2x1ZGUgbGRlbXVsLmguCi0JKHRyeV9vcGVuX2JmZCk6IFJlbmFtZSBmcm9tIGNhY2hlX2JmZF9vcGVuci4gIFJldHVybiBib29sZWFuCi0JYXJndW1lbnQsIG5vdCBiZmQgKi4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobGRmaWxlX29wZW5fZmlsZV9zZWFyY2gpOiBSZW5hbWUgZnJvbSBvcGVuX2EuICBSZXR1cm4gYm9vbGVhbgotCWFyZ3VtZW50LCBub3QgYmZkICouICBDbGVhbiB1cC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobGRmaWxlX29wZW5fZmlsZSk6IElmIGRvaW5nIGEgZHluYW1pYyBsaW5rLCBjYWxsCi0JbGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlIHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoZSBleHRlbnNpb24gb2YKLQlhIGR5bmFtaWMgb2JqZWN0IGlzICIuc28iLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6Ci0JTmV3IGZ1bmN0aW9uLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBJbml0aWFsaXplIG9wZW5fZHluYW1pY19hcmNoaXZlCi0JZmllbGQuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IExpa2V3aXNlLgotCi0JKiBsZG1haW4uYyAoZ2V0X2VtdWxhdGlvbik6IElnbm9yZSAtbTQ4NiBmb3IgTGludXggY29tcGF0aWJpbGl0eS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSWdub3JlIC1xbWFnaWMgZm9yIExpbnV4IGNvbXBhdGliaWxpdHkuCi0JQWNjZXB0IC1zdGF0aWMgYXMgYSBzeW5vbnltIGZvciAtbm9uX3NoYXJlZC4KLQotCUxldCB0aGUgdXNlciBjaGFuZ2UgdGhlIGR5bmFtaWMgbGlua2VyIHVzZWQgYnkgRUxGIGNvZGUuCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgbmV3IGZpZWxkIGludGVycHJldGVyLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgZHluYW1pYy1saW5rZXIgdG8gbG9uZ29wdHMsIGFuZAotCWhhbmRsZSBpdC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgdG8gTlVMTC4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBHZXQKLQl0aGUgRUxGIGJhY2tlbmQgdG8gcmV0dXJuIHRoZSAuaW50ZXJwIHNlY3Rpb24uICBJZgotCWNvbW1hbmRfbGluZS5pbnRlcnByZXRlciBpcyBub3QgTlVMTCwgc2V0IHRoZSBjb250ZW50cyBvZiAuaW50ZXJwCi0JdG8gaXQuCi0JKiBsZC50ZXhpbmZvOiBNZW50aW9uIC1keW5hbWljLWxpbmtlci4KLQotCSogY29uZmlnL3N1bjRzb2wyLm10IChlZWxmMzJfc3BhcmMuYyk6IERlcGVuZCB1cG9uIGVsZjMyLmVtLCBub3QKLQlnZW5lcmljLmVtLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFNvcnQgb3V0IHRoZSBvcHRpb24gbWFjcm9zIGFuZCBjaGFuZ2UgdGhlCi0JZGVmaW5pdGlvbnMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYWRkIGEgbmV3IG9wdGlvbi4KLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogRGVmaW5lIF9fZXRleHQgYW5kIF9fZWRhdGEgdG8gZ28gYWxvbmcgd2l0aAotCV9ldGV4dCBhbmQgX2VkYXRhLgotCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCBuZXcgZmllbGQgdHJhZGl0aW9uYWxfZm9ybWF0LgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgdHJhZGl0aW9uYWwtZm9ybWF0IHRvIGxvbmdvcHRzLCBhbmQKLQloYW5kbGUgaXQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgY29uZmlnLnRyYWRpdGlvbmFsX2Zvcm1hdCB0byBmYWxzZS4KLQkqIGxkbGFuZy5jIChsZGxhbmdfb3Blbl9vdXRwdXQpOiBTZXQgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBpbiBCRkQKLQlmbGFncyBvZiBvdXRwdXRfYmZkIGFjY29yZGluZyB0byBjb25maWcudHJhZGl0aW9uYWxfZm9ybWF0LgotCSogbGR2ZXIuYyAoaGVscCk6IE1lbnRpb24gLXRyYWRpdGlvbmFsLWZvcm1hdC4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IC10cmFkaXRpb25hbC1mb3JtYXQuCi0KLVR1ZSBKdW4gMTQgMjM6MTA6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGN0b3IuYyAobGRjdG9yX2FkZF9lbnRyeSk6IEFkZCBlbnRyaWVzIHRvIGEgc2V0IGluIHRoZSBvcmRlcgotCXRoZXkgYXJlIGVuY291bnRlcmVkLgotCi1UdWUgSnVuIDE0IDE4OjA1OjA5IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogZW11bHBhcmFtcy9pMzg2bGludXguc2ggKFRFWFRfU1RBUlRfQUREUik6IERlZmluZSBhcyAweDEwMDAuCi0JKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IERlZmluZSBhcyAweDIwLgotCi1Nb24gSnVuIDEzIDE1OjQ2OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvYWxwaGEuc2M6IERlZmluZSBfZnRleHQsIF9ldGV4dCBhbmQgX2ZkYXRhIGluc3RlZCBvZgotCV9GVEVYVCwgX0VURVhUIGFuZCBfRkRBVEEuICBEb250IGRlZmluZSBfRU5ELgotCi0JKiBsZGZpbGUuYyAob3Blbl9hKTogSWYgdGhpcyBpcyBub3QgYW4gYXJjaGl2ZSwgdHJ5IHRvIG9wZW4gaXQgaW4KLQl0aGUgY3VycmVudCBkaXJlY3RvcnkgYmVmb3JlIHNlYXJjaGluZyBmb3IgaXQuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVHJlYXQgLWkgYXMgYSBzeW5vbnltIGZvciAtci4KLQotCSogbGRncmFtLnkgKGV4cCk6IFRyZWF0IEJMT0NLIGFzIGEgc3lub255bSBmb3IgQUxJR04sIHNvIHRoYXQKLQlCTE9DSyB3b3JrcyBpbiBhIHNlY3Rpb24gYWRkcmVzcyBhcyBkb2N1bWVudGVkLgotCi0JKiBsZGdyYW0ueSAoWVlERUJVRyk6IERvbid0IGRlZmluZS4KLQotRnJpIEp1biAxMCAxNjo0NTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9nbGQ5NjAuZW06IFBhc3MgZmFsc2UgZm9yIG5ldyBhcmd1bWVudCB0bwotCWxkZmlsZV9hZGRfbGlicmFyeV9wYXRoLgotCSogZW11bHRlbXBsL2dsZDk2MGMuZW0sIGVtdWx0ZW1wbC9sbms5NjAuZW06IExpa2V3aXNlLgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IE9ubHkgbG9vayBmb3IgLnNvIGZpbGVzIGlmIGRvaW5nIGEgZHluYW1pYwotCWxpbmsuCi0KLVRodSBKdW4gIDkgMDg6MzU6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9pOTYwLnNjOiBBZGQgQ09OU1RSVUNUT1JTIHRvIC5kYXRhLgotCi1UaHUgSnVuICA5IDA2OjUyOjI5IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogRGVsZXRlIGxkLm5ldyBkZXBlbmRlbmN5IHNvIHRoYXQgYSByZWdyZXNzaW9uCi0JICB0ZXN0IGRvZXNuJ3QgdHJpZ2dlciBhIHJlYnVpbGQgb2YgdGhlIGxpbmtlci4KLQotVGh1IEp1biAgOSAwMDoxNzoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zKTogRm9yIGxhbmdfYWRkcmVzcywgY2FsbAotCWluaXRfb3MgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBjYWxsZWQuCi0KLVRodSBKdW4gIDIgMTc6MjQ6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkIHN1cHBvcnQgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBhb3V0LnNjOiBEb24ndCBkZWZpbmUgX19EWU5BTUlDIGhlcmUuICBBZGQgbmV3IHNlY3Rpb25zIHVzZWQgYnkKLQlzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGNvZGUuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9zdW40LnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIHN1bm9zLgotCSogZW11bHBhcmFtcy9zdW4zLnNoIChURU1QTEFURV9OQU1FKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbiAoZXN1bjQuYyk6IERlcGVuZCB1cG9uIHN1bm9zLmVtLCBub3QgZ2VuZXJpYy5lbS4KLQkoZXN1bjMuYyk6IExpa2V3aXNlLgotCi0JKiBsZGxhbmcuYzogTWlub3IgZm9ybWF0dGluZyBjbGVhbnVwcy4KLQkobGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlKTogTmV3IGZ1bmN0aW9uLgotCSogbGRsYW5nLmggKGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSk6IERlY2xhcmUuCi0KLQkqIGxkZmlsZS5oIChzZWFyY2hfZGlyc190eXBlKTogTW92ZSBmcm9tIGxkZmlsZS5jLCBhbmQgYWRkIGNtZGxpbmUKLQlmaWVsZC4KLQkoc2VhcmNoX2hlYWQpOiBEZWNsYXJlLgotCShsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCk6IEFkZCBuZXcgY21kbGluZSBhcmd1bWVudCBpbiBwcm90b3R5cGUuCi0JKiBsZGZpbGUuYyAoc2VhcmNoX2hlYWQpOiBNYWtlIG5vbi1zdGF0aWMuCi0JKHNlYXJjaF9kaXJzX3R5cGUpOiBNb3ZlIHRvIGxkZmlsZS5oLgotCShsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCk6IEFjY2VwdCBjbWRsaW5lIGFyZ3VtZW50LCBhbmQgc2F2ZSBpdC4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogUGFzcyB0cnVlIGZvciBuZXcgY21kbGluZSBhcmd1bWVudCBvZgotCWxkZmlsZV9hZGRfbGlicmFyeV9wYXRoLgotCShzZXRfZGVmYXVsdF9kaXJsaXN0KTogTGlrZXdpc2UuCi0JKiBsZG1haW4uYyAoY2hlY2tfZm9yX3NjcmlwdHNfZGlyKTogUGFzcyBmYWxzZSBmb3IgbmV3IGNtZGxpbmUKLQlhcmd1bWVudCBvZiBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aC4KLQkqIGxkZ3JhbS55IChpZmlsZV9wMSk6IExpa2V3aXNlLgotCi1XZWQgSnVuICAxIDE0OjI0OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmggKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpOiBSZW1vdmUgZmllbGRzIHN1YmZpbGVzLAotCXRvdGFsX3NpemUsIHN1cGVyZmlsZSBhbmQgY2hhaW4uCi0JKiBsZGZpbGUuYyAob3Blbl9hKTogRG9uJ3QgY2xlYXIgc2VhcmNoX2RpcnNfZmxhZy4KLQkobGRmaWxlX29wZW5fZmlsZSk6IERvbid0IHRyeSB0byBvcGVuIHN1cGVyZmlsZS4gIEFzc2VydCB0aGF0IGZpbGUKLQloYXMgbm90IGFscmVhZHkgYmVlbiBvcGVuZWQuCi0JKiBsZGxhbmcuYyAobmV3X2FmaWxlKTogRG9uJ3QgaW5pdGlhbGl6ZSBzdXBlcmZpbGUuCi0JKiBsZG1haW4uYyAoYWRkX2FyY2hpdmVfZWxlbWVudCk6IERvbid0IGluaXRpYWxpemUgc3ViZmlsZXMgb3IKLQljaGFpbiBvciBzdXBlcmZpbGUuICBJbml0aWFsaXplIHNlYXJjaF9kaXJzX2ZsYWcgdG8gZmFsc2UuCi0KLUZyaSBNYXkgMjcgMTI6MjU6MzMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogQ2hhbmdlZCB2ZXJzaW9uIHRvICJjeWdudXMtMi40LjEiLgotCi0JQ2hhbmdlcyBmcm9tIGJpbnV0aWxzLTIuNCByZWxlYXNlOgotCi0JKiBnZW5zY3JpcHRzLnNoIChSRUxPQ0FUSU5HLCBDT05TVFJVQ1RJTkcpOiBXaGVuIHNldHRpbmcKLQl2YXJpYWJsZXMsIHVzZSB3aGl0ZXNwYWNlLCBzbyBzY3JpcHRzIGRvbid0IGJyZWFrLgotCi0JKiBjb25maWcvYWxwaGFvc2YubWggKEhERUZJTkVTLCBDRkxBR1MpOiBEZWxldGVkLgotCi0JKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbTogRmluZCBlbXVsdGVtcGwvc3RyaW5naWZ5LnNlZCBpbiAke3NyY2Rpcn0uCi0KLQkqIGNkdGVzdC1iYXIuY2M6IFJlbmFtZWQgZnJvbSBjZHRlc3QtZnVuYy5jYy4KLQkqIE1ha2VmaWxlLmluOiBOb3RlZCBjaGFuZ2UuCi0KLQkqIHNjcmlwdHRlbXBsL2EyOWsuc2M6IERvbid0IGluY2x1ZGUgL2xhYjMvdTMvLi4uLi9zZWdtZW50cy5vOyBJCi0JZG9uJ3Qga25vdyB3aGVyZSB0aGF0J3Mgc3VwcG9zZWQgdG8gY29tZSBmcm9tLCBvciB3aHkgaXQncwotCW5lY2Vzc2FyeS4KLQotCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgdG8gbGF0ZXN0IG1ha2VmaWxlLmluCi0JKiBlbXVscGFyYS9nbzMyLnNoOiBzZXQgdG8gY29mZi1nbzMyIG5vdCBhb3V0Ci0JKiBlbXVsdGVtcC9nZW5lcmljLmVtOiBzdHJlbmd0aC1yZWR1Y2UgdGhlIHN0cnVjdHVyZSBvZgotCSAgdGhpcyBzaGVsbCBzY3JpcHQsIHNpbmNlIHRoZSBvbmx5IGF2YWlsYWJsZSBzaGVsbCBmb3IKLQkgIERPUyBjYW4ndCBoYW5kbGUgY29tcGxleCBzeW50YXguCi0JKiBlbXVsdGVtcC9zdHJpbmdpZnkuc2VkOiBmb3IgInNlZCAtZiIgaW5zdGVhZCBvZiBpbmxpbmUuCi0JKiBtYWtlZmlsZS5pbjogZGVwZW5kIG9uIHN0cmluZ2lmeS5zZWQgYXMgd2VsbCBhcyBnZW5zY3JpcHRzLnNoCi0JKiBzY3JpcHR0ZW1wL2dvMzJjb2ZmLnNjOiBjb3JyZWN0IGZvciBkamdwcCAxLjExJ3MgQ09GRiBmb3JtYXQKLQkqIGdlbnNjcmlwdHMuc2g6IGVtcHR5IHZhcmlhYmxlcyBhcmVuJ3QgYWx3YXlzIGNvbnNpZGVyZWQgInNldCIsCi0JICBzbyBzZXQgdGhlbSB0byAieSIgaW5zdGVhZC4KLQotRnJpIE1heSAyNyAwMTowODoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChlbnRyeV9zeW1ib2wpOiBNYWtlIHN0YXRpYy4KLQkobGFuZ19hZGRfZW50cnkpOiBBZGQgY21kbGluZSBhcmd1bWVudC4KLQkqIGxkbGFuZy5oIChsYW5nX2FkZF9lbnRyeSk6IENoYW5nZSBwcm90b3R5cGUuCi0JKiBsZGdyYW0ueSAoc3RhdGVtZW50X2FueXdoZXJlKTogQ2hhbmdlIGxhbmdfYWRkX2VudHJ5IGNhbGwuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IExpa2V3aXNlLgotCi1UdWUgTWF5IDI0IDE2OjEzOjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9lbGYzMm1pcGIuc2ggKE9USEVSX1JFQURPTkxZX1NFQ1RJT05TKTogRG9uJ3QgZ2l2ZQotCS5yZWdpbmZvIGFuIGFkZHJlc3MuCi0JKE9USEVSX1JFQURXUklURV9TRUNUSU9OUyk6IERvbid0IGdpdmUgLmxpdDQgb3IgLmxpdDggYW4gYWRkcmVzcy4KLQkoT1RIRVJfU0VDVElPTlMpOiBEZWZpbmUgZm9yIC5ncHRhYi5zZGF0YSBhbmQgLmdwdGFiLnNic3MuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFVzZSBPVEhFUl9TRUNUSU9OUyBhdCBlbmQgb2Ygc2NyaXB0LgotCi1UaHUgTWF5IDE5IDEzOjMxOjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCBzdXBwb3J0IGZvciBFTEYgc2hhcmVkIGxpYnJhcmllcy4KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIGZpZWxkIGR5bmFtaWNfbGluay4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBjb25maWcuZHluYW1pY19saW5rIHRvIGZhbHNlLiAgV2FybgotCW9uIGF0dGVtcHRzIHRvIHVzZSAtciB3aXRoIC1yZWxheCwgLWNhbGxfc2hhcmVkIG9yIC1zLgotCSogbGV4c3VwLmMgKGxvbmdvcHRzKTogU2VwYXJhdGUgT1BUSU9OX0NBTExfU0hBUkVEIGZyb20KLQlPUFRJT05fTk9OX1NIQVJFRC4gIEFkZCBPUFRJT05fSUdOT1JFLiAgQWRqdXN0IG1hY3JvIHZhbHVlcwotCWFjY29yZGluZ2x5LiAgQWRkICJkeSIgYW5kICJub25fc2hhcmVkIiBvcHRpb25zLiAgQ2hhbmdlICJReSIgdG8KLQlPUFRJT05fSUdOT1JFIGZvciBub3cuICBIYW5kbGUgT1BUSU9OX0NBTExfU0hBUkVEIGFuZAotCU9QVElPTl9OT05fU0hBUkVEIGJ5IHNldHRpbmcgZHluYW1pY19saW5rIGZpZWxkIGFjY29yZGluZ2x5LgotCUhhbmRsZSBPUFRJT05fSUdOT1JFIGJ5IGlnbm9yaW5nIGl0LiAgQ2xlYXIgZHluYW1pY19saW5rIGZpZWxkIGZvcgotCS1yIGFuZCAtVXIuCi0JKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fZmlsZSk6IElmIGNvbmZpZy5keW5hbWljX2xpbmsgaXMgdHJ1ZSwgdHJ5Ci0Jb3BlbmluZyBhIGZpbGUgd2l0aCBhIC5zbyBleHRlbnNpb24gZmlyc3QuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCAoVEVYVF9TVEFSVF9BRERSKTogQ2hhbmdlIHRvIDB4MTAwMDAuCi0JKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IExpa2V3aXNlLgotCShURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIGVsZjMyLgotCShEQVRBX1BMVCk6IERlZmluZS4KLQkqIGVtdWxwYXJhbXMvZWxmX2kzODYuc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUgYXMgZWxmMzIuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBwbGFjZW1lbnQgZm9yIG5ldyBkeW5hbWljIHNlY3Rpb25zLgotCURvbid0IHVzZSBDUkVBVEVfT0JKRUNUX1NZTUJPTFMuICBEZWZpbmUgX2V0ZXh0LCBfZWRhdGEgYW5kIF9lbmQKLQlvdXRzaWRlIG9mIGFueSBzZWN0aW9uLiAgRG9uJ3QgdXNlIEFMSUdOKDgpOyBqdXN0IGxldCBvbmUgc2VjdGlvbgotCVZNQSBmb2xsb3cgYW5vdGhlci4gIFB1dCAuZHluYnNzIGluIC5ic3MuICBEb24ndCBtZW50aW9uIGRlYnVnZ2luZwotCXNlY3Rpb25zOyB0aGV5J2xsIGJlIGhhbmRsZWQgY29ycmVjdGx5IGFueWhvdy4KLQkqIE1ha2VmaWxlLmluIChlZWxmX2kzODYuYyk6IERlcGVuZCB1cG9uIGVsZjMyLmVtLCBub3QgZ2VuZXJpYy5lbS4KLQotV2VkIE1heSAxOCAxMDoxNTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVkaXJlY3Qgb3V0cHV0IG9mIGxuIHRvIC9kZXYvbnVsbC4KLQotTW9uIE1heSAxNiAxMzozNTowOCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZW11bHRlbXBsL2hwcGFlbGYuZW06IENoYW5nZSBhbGwgcmVmZXJlbmNlcyBvZgotCS5ocHBhX2xpbmtlcl9zdHVicyB0byAuUEFSSVNDLnN0dWJzLgotCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYzogTGlrZXdpc2UuCi0KLUZyaSBNYXkgMTMgMTM6MDA6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogQ2hhbmdlIGBgbm8gYXR0YWNoZWQKLQlvdXRwdXQgc2VjdGlvbicnIG1lc3NhZ2Ugc2xpZ2h0bHkuCi0JKGxhbmdfZG9fYXNzaWdubWVudHMpOiBEb24ndCByZWN1cnNlIGRvd24gaWYgdGhlcmUgaXMgbm8gcmVhbAotCXNlY3Rpb24uCi0KLQkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10IChPVEhFUl9FTVVMQVRJT05TKTogQ2hhbmdlIGVtXyB0byBlIHRvCi0JbWF0Y2ggY29ycmVzcG9uZGluZyBjaGFuZ2UgaW4gZW11bGF0aW9uIHRlbXBsYXRlcy4KLQkqIGNvbmZpZy9pMzg2LWx5bngubXQsIGNvbmZpZy9tNjhrLWx5bngubXQ6IExpa2V3aXNlLgotCSogY29uZmlnL3NwYXJjLWx5bngubXQsIGNvbmZpZy9zdW40c29sMi5tdDogTGlrZXdpc2UuCi0KLVdlZCBNYXkgMTEgMTg6MTY6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogVXBkYXRlZCB2ZXJzaW9uIG51bWJlci4KLQotCSogY2R0ZXN0LWZvby5jYzogVXNlIGV4cGxpY2l0ICIjcHJhZ21hIGltcGxlbWVudGF0aW9uIi4KLQkqIGNkdGVzdC1iYXIuY2M6IFJlbmFtZWQgZnJvbSBjZHRlc3QtZnVuYy5jYy4KLQkqIE1ha2VmaWxlLmluOiBSZWZlcmVuY2VzIHRvIGNkdGVzdC1mdW5jLm8gY2hhbmdlZCB0bwotCWNkdGVzdC1iYXIuby4KLQotV2VkIE1heSAxMSAxNjoyNDoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlEb24ndCBjcmVhdGUgdW5uZWNlc3Nhcnkgb3V0cHV0IHNlY3Rpb25zLgotCSogbGRsYW5nLmMgKG91dF9iZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSk6IFJlbW92ZS4KLQkod2lsZF9zZWN0aW9uKTogQ2FsbCBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSByYXRoZXIgdGhhbgotCW91cl9iZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZS4gIERvbid0IGNhbGwgd2lsZF9kb2l0IGlmIHRoZXJlIGlzIG5vCi0Jc2VjdGlvbi4KLQkobGFuZ19jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyk6IFJlbW92ZS4KLQkobWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyk6IEZvciBzZXZlcmFsIGNhc2VzLCBjYWxsIGluaXRfb3MgaWYKLQlpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjYWxsZWQuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIG91dHB1dCBzZWN0aW9uIHdhcyBub3QgY3JlYXRlZCwgc2tpcCBpdC4KLQkobGFuZ19wcm9jZXNzKTogRG9uJ3QgY2FsbCBsYW5fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMuCi0JKGxhbmdfcGxhY2Vfb3JwaGFucyk6IFNraXAgZmlsZXMgd2l0aCBqdXN0X3N5bXNfZmxhZ3Mgc2V0IHRvIHRydWUuCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBjaGFuZ2UuCi0KLVR1ZSBNYXkgMTAgMTQ6MzE6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogRG9uJ3QgYm90aGVyIGluaXRpYWxpemluZyB0aGUgdm1hIGFuZAotCXNlY3Rpb24gc2l6ZS4gIERvbid0IHNwZWNpYWwgY2FzZSBTRUNfU0hBUkVEX0xJQlJBUlkuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IEhhbmRsZSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSBzZWN0aW9ucwotCXNwZWNpYWxseS4KLQotRnJpIE1heSAgNiAxMjoyNDoyNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvZ28zMi5taCA6IE5ldyBmaWxlIGZvciBYZ28zMlguCi0KLUZyaSBNYXkgIDYgMTU6MTU6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fY29tbWFuZF9maWxlKTogU2V0IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbAotCWJlZm9yZSBjYWxsaW5nIGVpbmZvLCBzaW5jZSB3ZSBhcmUgcmVwb3J0aW5nIGFuIGZvcGVuIGZhaWx1cmUuCi0JRnJvbSBqcnNAd29ybGQuc3RkLmNvbSAoUmljayBTbGFka2V5KS4KLQotCSogY29uZmlndXJlLmluOiBVc2UgImUiIHJhdGhlciB0aGFuICJlbV8iIGFzIHByZWZpeCBmb3IKLQllbXVsYXRpb25zLgotCi1GcmkgTWF5ICA2IDAxOjA4OjE0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbTogVXNlICJlIiByYXRoZXIgdGhhbiAiZW1fIiBhcyBwcmVmaXggZm9yCi0JZmlsZW5hbWUuCi0JKiBlbXVsdGVtcGwvZ2xkOTYwLmVtLCBlbXVsdGVtcGwvZ2xkOTYwYy5lbSwgZW11bHRlbXBsL2xuazk2MC5lbSwKLQllbXVsdGVtcGwvaHBwYWVsZi5lbSwgZW11bHRlbXBsL204OGtiY3MuZW0sIGVtdWx0ZW1wbC92YW5pbGxhLmVtOgotCURpdHRvLgotCSogTWFrZWZpbGUuaW46IENoYW5nZWQgYWxsIGdlbmVyYXRlZCBmaWxlIG5hbWVzLgotCShsZGVtdWwtbGlzdC5oKTogRGVwZW5kIG9uIE1ha2VmaWxlLCBub3QgY29uZmlnLnN0YXR1cy4gIENoYW5nZWQKLQlzZWQgcGF0dGVybnMgdG8gaGFuZGxlIG5ldyBmaWxlbmFtZXMuCi0KLQkqIGNvbmZpZy9taXBzbC1pZHQubXQ6IFJlbmFtZWQgZnJvbSBtaXBzLWlkdGwubXQuCi0JKiBjb25maWd1cmUuaW46IEFkanVzdGVkLgotCi1UaHUgTWF5ICA1IDE1OjA3OjMyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBEb24ndCB1c2UgIiQ8KiIsIGl0IGRvZXNuJ3QgYWx3YXlzCi0Jd29yay4gIEluc3RlYWQsIGNoZWNrIGJ1aWxkIGRpciBhbmQgJHNyY2RpciBleHBsaWNpdGx5LCBhbmQgdXNlCi0JYGVjaG8nIHRvIGdldCBhbGwgdGhlIGZpbGVuYW1lcy4KLQotCSogY29uZmlndXJlLmluIChoODMwMGgtKi1obXMpOiBDaGFuZ2VkIGxkX3RhcmdldCBuYW1lIHRvCi0JY2YtaDgzMDBoLgotCSogY29uZmlnL2NmLWg4MzAwaC5tdDogUmVuYW1lZCBmcm9tIGNvZmYtaDgzMDBoLm10LCB0byBtYWtlIGl0Ci0JdW5pcXVlIGluIDguMy4KLQotCSogY29uZmlnL2k5NjBjb2ZmLm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaDogTmV3IGZpbGUuCi0JKiBlbXVsdGVtcGwvZ2xkOTYwYy5lbTogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKGk5NjAtKi12eHdvcmtzNSogZXhjZXB0IC12eHdvcmtzNS4wKik6IFVzZQotCWk5NjBjb2ZmIGNvbmZpZ3VyYXRpb24uCi0JKiBNYWtlZmlsZS5pbiAoZW1fZ2xkOTYwY29mZi5jKTogQWRkZWQgZGVwZW5kZW5jaWVzLCBidWlsZCBydWxlLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBSZW1vdmUgZW1fZGVsdGE2OC5vLCBzaW5jZSB0aGUKLQljb2RlIGlzbid0IGluY2x1ZGVkIGluIEZTRiByZWxlYXNlcywgYW5kIGl0IGNhbiBzdGlsbCBiZQotCWV4cGxpY2l0bHkgc2VsZWN0ZWQuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSBzaXRlLmJhayBhbmQgdG1wZGlyLgotCShTVEFHRVNUVUZGKTogUmVtb3ZlZCAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykuCi0JKG1vc3RseWNsZWFuKTogRGVsZXRlIHRoZW0gZXhwbGljaXRseSBoZXJlLiAgQWxzbyByZW1vdmUgdG1wZGlyLgotCi0JUGF0Y2hlcyBmcm9tIFJhbHBoIENhbXBiZWxsOgotCSogY29uZmlnL21pcHNic2QubWg6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKGVtX21pcHNic2QuYyk6IFVzZSBtaXBzYnNkLnNjLCBub3QgYW91dC5zYy4KLQkqIHNjcmlwdHRlbXBsL21pcHNic2Quc2M6IERvbid0IGRlZmluZSBfX0RZTkFNSUMuCi0JKiBlbXVscGFyYW1zL21pcHNic2Quc2ggKE9VVFBVVF9GT1JNQVQpOiBGaXggbmFtZSB0byBoYXZlIGBhLm91dCcKLQlpbnN0ZWFkIG9mIGBhb3V0Jy4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotZ251Kik6IFRyZWF0IGxpa2UgaTM4Ni0qLW1hY2gqLgotCi1XZWQgTWF5ICA0IDExOjU5OjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL202OGsubXQgKEVNVUwpOiBTZXQgdG8gbTY4a2FvdXQuCi0JKiBlbXVscGFyYW1zL202OGthb3V0LnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbV9tNjhrYW91dC5vLgotCShlbV9tNjhrYW91dC5jKTogTmV3IHRhcmdldC4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIGRvdCBtb3ZlcyBiZWNhdXNlIG9mIGFuCi0JYXNzaWdubWVudCwgZG9uJ3QgdHJ5IHRvIGluc2VydCBhIHBhZCBpbnRvIHRoZSBhYnNvbHV0ZSBvdXRwdXQKLQlzZWN0aW9uLCBqdXN0IGNoYW5nZSB0aGUgYWRkcmVzcyBvZiB0aGUgZGVmYXVsdCBtZW1vcnkgcmVnaW9uCi0JaW5zdGVhZC4KLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIGNkdGVzdC50bXAsIGNkdGVzdC11ciwKLQljZHRlc3QtdXIub3V0LCBhbmQgY2R0ZXN0LXVyLnRtcC4KLQotV2VkIEFwciAyNyAxNjowMzozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL3NhMjkyMDAuc2M6IEFsaWduIGFsbCBzZWN0aW9ucyB0byBmb3VyIGJ5dGUKLQlib3VuZGFyaWVzLgotCi1XZWQgQXByIDI3IDEwOjQ4OjAzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IFN1cHBvcnQgZm9yIGdvMzIgY29mZi4KLQkqIGNvbmZpZy9pMzg2LWdvMzIubXQ6IE5ldyBmaWxlCi0JKiBlbXVscGFyYW1zL2kzODZnbzMyLnNoOiBOZXcgZmlsZQotCSogc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2M6IE5ldyBmaWxlCi0KLVR1ZSBBcHIgMjYgMTc6MjA6MDMgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZW1fbTY4a2x5bnguYywgZW1faTM4Nmx5bnguYywgZW1fc3BhcmNseW54LmMpOiBVc2UKLQlMeW54LXNwZWNpZmljIHNjcmlwdCB0ZW1wbGF0ZXMuCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjbGl0ZSotKi1jb2ZmKTogVXNlIGNvZmYtc3BhcmMuCi0JKiBlbXVscGFyYW1zL2kzODZseW54LnNoIChTQ1JJUFRfTkFNRSk6IFNldCB0byBpMzg2bHlueC4KLQkqIGVtdWxwYXJhbXMvc3BhcmNseW54LnNoIChTQ1JJUFRfTkFNRSk6IFNldCB0byBzcGFyY2x5bnguCi0JKEVOVFJZKTogU2V0IHRvIF9fbWFpbi4KLQkqIHNjcmlwdHRlbXBsL2kzODZseW54LnNjOiBOZXcgZmlsZSwgc2NyaXB0IGZvciBJMzg2IEx5bnguCi0JKiBzY3JpcHR0ZW1wbC9tNjhrbHlueC5zYzogQWRkIGluc2VydGlvbiBvZiBjdG9yL2R0b3Igc2VjdGlvbnMuCi0JKiBzY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2M6IE5ldyBmaWxlLCBzY3JpcHQgZm9yIHVTcGFyYyBMeW54LgotCi1UdWUgQXByIDI2IDEyOjQxOjAzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvbWlwcy5zYzogRm9yY2UgX2dwIGFuZCAubGl0OCB0byBiZSBhbGlnbmVkIHRvIGEgMTYKLQlieXRlIGJvdW5kYXJ5LCBpbiBjYXNlIHRoZSBnbG9iYWwgY29uc3RydWN0b3JzIGRvIG5vdCB0YWtlIHVwIGFuCi0JZXZlbiAxNiBieXRlcy4KLQotCSogY29uZmlnL2kzODZ2NC5taCAoSE9TVElOR19DUlQwKTogSWYgLi4vZ2NjL2NydGJlZ2luLm8gZG9lcyBub3QKLQlleGlzdCwgZ2V0IGNydGJlZ2luIGJhc2VkIG9uIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZS4KLQkoSE9TVElOR19MSUJTKTogU2ltaWxhciBjaGFuZ2UgZm9yIC4uL2djYy9jcnRlbmQuby4KLQotTW9uIEFwciAyNSAxNToyNzo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBXaGVuIG5vIGFkZHJlc3MgaXMgZ2l2ZW4gZm9yIGEKLQlzZWN0aW9uLCBhbGlnbiBpdCBhY2NvcmRpbmcgdG8gaXRzIHJlcXVpcmVtZW50cy4KLQotVGh1IEFwciAyMSAxNzoyNDoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbiwgZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZ2RvYy50ZXhpLgotCi1UdWUgQXByIDE5IDEyOjEyOjE1IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgaVszNF04Ni0qLWJzZDM4NiB0byB0aGUgcGF0dGVybnMgcmVjb2duaXplZC4KLQotRnJpIEFwciAxNSAxNDozNTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBXaGVuIHJlbGF4aW5nLCBhZGp1c3QgdGhlCi0JcG9zaXRpb24gb2YgYSBwYWRkaW5nIHN0YXRlbWVudCwgYW5kIGFkanVzdCBkb3QgYWNjb3JkaW5nbHkuCi0KLU1vbiBBcHIgMTEgMTc6Mzc6MDkgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRVhQRUNULCBSVU5URVNUKTogU2V0IHRoZXNlIGZvciB0aGUgY2hlY2sgZ29hbC4KLQotTW9uIEFwciAxMSAxMjozMjo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2kzODZjb2ZmLnNjOiBJZiByZWxvY2F0aW5nLCBkb24ndCBwdXQgLmluaXQgYW5kCi0JLmZpbmkgc2VjdGlvbnMgaW50byAudGV4dDsga2VlcCB0aGVtIHNlcGFyYXRlLgotCSogY29uZmlnL2kzODZzY28ubWggKEhPU1RJTkdfQ1JUMCk6IElmIC4uL2djYy9jcnRiZWdpbi5vIGRvZXMgbm90Ci0JZXhpc3QsIGdldCBjcnRiZWdpbiBiYXNlZCBvbiBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWUuCi0JKEhPU1RJTkdfTElCUyk6IFNpbWlsYXIgY2hhbmdlIGZvciAuLi9nY2MvY3J0ZW5kLm8uCi0KLU1vbiBBcHIgMTEgMTA6MzE6MDAgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBTZXQgVENMX0xJQlJBUlkgZm9yIHJ1bnRlc3QuCi0KLVdlZCBBcHIgIDYgMDA6MDk6MzcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi0qZWxmKik6IERvbid0IHJlcXVpcmUgIi1ocC0iIGZvciB0aGUKLQltYW51ZmFjdHVyZXIuCi0KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtIChocHBhZWxmX2ZpbmlzaCk6IE9ubHkgcmVzaXplIHNlY3Rpb25zCi0JaWYgYnVpbGRpbmcgYSBmaW5hbCBleGVjdXRhYmxlLgotCi1UdWUgQXByICA1IDEyOjE3OjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKG1haW4pOiBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIGJmZF9jbG9zZS4KLQotVGh1IE1hciAzMSAxODowNzowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBDbGVhbiB1cCBzZWN0aW9uIGFsaWdubWVudCB0byBlbnN1cmUgdGhhdAotCXNlY3Rpb25zIG5ldmVyIG92ZXJsYXAgd2hlbiB1c2luZyAtci4KLQotV2VkIE1hciAzMCAxNTo1MToxNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBDaGFuZ2Ugc3ltYm9sIHJlYWRpbmcgc2xpZ2h0bHkgZm9yIHJlY2VudCBCRkQKLQljaGFuZ2VzOiBnZXRfc3ltdGFiX3VwcGVyX2JvdW5kIHJlbmFtZWQgYW5kIHJldHVybnMgbG9uZywKLQliZmRfY2Fub25pY2FsaXplX3N5bXRhYiByZXR1cm5zIGxvbmcsIGNoZWNrIGZvciBlcnJvciBpbmRpY2F0aW9ucy4KLQotRnJpIE1hciAyNSAxNzoyMDowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChwcmludF9pbnB1dF9zZWN0aW9uKTogRm9yIHNlY3Rpb24gc2l6ZSwgdXNlCi0JX2Nvb2tlZF9zaXplIGlmIGl0IGlzIG5vbi16ZXJvLCBzaXplIG90aGVyd2lzZS4KLQkoc2l6ZV9pbnB1dF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGxhbmdfZG9fYXNzaWdubWVudHMpOiBMaWtld2lzZSAoY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bSkuCi0KLVRodSBNYXIgMjQgMTU6MjA6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobmV3X2FmaWxlKTogQWRkIG5ldyBhcmd1bWVudCBhZGRfdG9fbGlzdC4gIERvbid0IHNldAotCXJlYWwgdG8gdHJ1ZSBmb3IgbGFuZ19pbnB1dF9maWxlX2lzX21hcmtlcl9lbnVtLiAgQ2xlYXIgdGhlX2JmZC4KLQkobGFuZ19hZGRfaW5wdXRfZmlsZSk6IFBhc3MgdHJ1ZSB0byBuZXdfYWZpbGUgZm9yIGFkZF90b19saXN0LgotCShsb29rdXBfbmFtZSk6IFJlbW92ZSBmb3JjZV9sb2FkIGFyZ3VtZW50LiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQlQYXNzIGZhbHNlIHRvIG5ld19hZmlsZSBmb3IgYWRkX3RvX2xpc3QuICBTcGxpdCBsb2FkaW5nIG9mIHN5bWJvbHMKLQlvdXQgaW50byBzZXBhcmF0ZSBmdW5jdGlvbi4KLQkobG9hZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uIHNwbGl0IG91dCBvZiBsb29rdXBfbmFtZS4gIERvbid0IGxvYWQKLQl0aGUgc3ltYm9scyBpZiB0aGV5IGFyZSBhbHJlYWR5IGxvYWRlZC4KLQkob3Blbl9pbnB1dF9iZmRzKTogRm9yIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW0gY2FsbCBsb2FkX3N5bWJvbHMKLQlyYXRoZXIgdGhhbiBsb29rdXBfbmFtZS4KLQkobGFuZ19wcm9jZXNzKTogUGFzcyBhYnNfb3V0cHV0X3NlY3Rpb24gcmF0aGVyIHRoYW4gTlVMTCB0bwotCWxhbmdfc2l6ZV9zZWN0aW9ucy4KLQkobGFuZ19zdGFydHVwKTogU2V0IHJlYWwgZmllbGQgb2YgZmlyc3RfZmlsZSB0byB0cnVlLgotCi1XZWQgTWFyIDIzIDE0OjE1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGhhZF9yZWxheCk6IFJlbW92ZWQuCi0JKHJlbGF4X2FnYWluKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogQ2hhbmdlIGNhbGwgdG8gYmZkX3JlbGF4X3NlY3Rpb24gdG8KLQljb3JyZXNwb25kIHRvIEJGRCBjaGFuZ2VzLiAgU2V0IHJlbGF4X2FnYWluIGFwcHJvcHJpYXRlbHkuCi0JKGxhbmdfcHJvY2Vzcyk6IFJlbW92ZSAjaWYgMCBjb2RlLiAgV2hlbiByZWxheGluZywga2VlcCBjYWxsaW5nCi0JbGFuZ19kb19hc3NpZ25tZW50cyBhbmQgbGFuZ19zaXplX3NlY3Rpb25zIHVudGlsIHJlbGF4X2FnYWluCi0JYmVjb21lcyBmYWxzZS4KLQotCSogZW11bHRlbXAvZ2xkOTYwLmVtOiBJbmNsdWRlIGxpYmliZXJ0eS5oCi0JKGdsZDk2MF9iZWZvcmVfcGFyc2UpOiBQYXNzIE5VTEwgYXMgZmluYWwgYXJndW1lbnQgdG8gY29uY2F0LgotCi1UdWUgTWFyIDIyIDEzOjA4OjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogRm9yY2UgX2VuZCBhbmQgX19lbmQgdG8gYmUgYWxpZ25lZCB0byBhCi0JZm91ciBieXRlIGJvdW5kYXJ5LgotCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBIYW5kbGUgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtIGJ5Ci0JYnVpbGRpbmcgYSBiZmRfZGF0YV9saW5rX29yZGVyLCByYXRoZXIgdGhhbiBieSBzZXR0aW5nIHRoZSBzZWN0aW9uCi0JY29udGVudHMgaW1tZWRpYXRlbHkuCi0KLU1vbiBNYXIgMjEgMTg6Mjg6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyB0byBtYWtlIC1VciB3b3JrIGFnYWluLgotCSogbGRtYWluLmMgKGFkZF90b19zZXQpOiBOb3cgdGFrZXMgcmVsb2MgYXJndW1lbnQgcmF0aGVyIHRoYW4KLQliaXRzaXplLiAgQ2hlY2sgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyBoZXJlLiAgSWYgYW4gbmV3IGhhc2gKLQl0YWJsZSBlbnRyeSBpcyBjcmVhdGVkLCBtYXJrIGl0IGFzIHVuZGVmaW5lZC4KLQkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBObyBsb25nZXIgdGFrZXMgYml0c2l6ZSBhcmd1bWVudC4gIFBhc3MKLQlCRkRfUkVMT0NfQ1RPUiB0byBsZGN0b3JfYWRkX3NldF9lbnRyeSwgYnV0IGZpcnN0IG1ha2Ugc3VyZSB0aGUKLQlCRkQgYmFja2VuZCBzdXBwb3J0cyBpdC4KLQkocmVsb2Nfb3ZlcmZsb3cpOiBIYW5kbGUgYSBOVUxMIGFiZmQgYXJndW1lbnQuCi0JKHJlbG9jX2Rhbmdlcm91cywgdW5hdHRhY2hlZF9yZWxvYyk6IExpa2V3aXNlLgotCSogbGRjdG9yLmM6IEluY2x1ZGUgbGRtYWluLmguCi0JKHN0cnVjdCBzZXRfaW5mbyk6IENoYW5nZSBiaXRzaXplIGZpZWxkIHRvIHJlbG9jLgotCShsZGN0b3JfYWRkX3NldF9lbnRyeSk6IE5vdyB0YWtlcyByZWxvYyBhcmd1bWVudCByYXRoZXIgdGhhbgotCWJpdHNpemUuICBEb24ndCBib3RoZXIgdG8gY2hlY2sgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyBoZXJlLgotCShsZGN0b3JfYnVpbGRfc2V0cyk6IEdldCB0aGUgc2l6ZSBmcm9tIHRoZSByZWxvYyBob3d0by4gIElmCi0JZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBjYWxsIGxhbmdfYWRkX3JlbG9jIHJhdGhlciB0aGFuCi0JbGFuZ19hZGRfZGF0YS4KLQkqIGxkY3Rvci5oIChsZGN0b3JfYWRkX3NldF9lbnRyeSk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byB1c2UgcmVsb2MKLQlpbnN0ZWFkIG9mIGJpdHNpemUuCi0JKiBsZGxhbmcuaCAoc3RhdGVtZW50X2VudW0pOiBBZGQgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bS4KLQkobGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSk6IE5ldyBzdHJ1Y3R1cmUuCi0JKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUpOiBBZGQgcmVsb2Nfc3RhdGVtZW50IGZpZWxkLgotCShsYW5nX2FkZF9yZWxvYyk6IERlY2xhcmUgbmV3IGZ1bmN0aW9uLgotCSogbGRsYW5nLmMgKGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlcik6IEhhbmRsZQotCWxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW0uCi0JKG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMsIHByaW50X3N0YXRlbWVudCk6IExpa2V3aXNlLgotCShsYW5nX3NpemVfc2VjdGlvbnMsIGxhbmdfZG9fYXNzaWdubWVudHMpOiBMaWtld2lzZS4KLQkocHJpbnRfcmVsb2Nfc3RhdGVtZW50KTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX2FkZF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IEhhbmRsZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtLgotCi0JKiBNYWtlZmlsZS5pbiAoY2R0ZXN0Lm91dCwgY2R0ZXN0LXVyLm8pOiBOZXcgdGFyZ2V0cy4KLQkoY2R0ZXN0LXVyLCBjZHRlc3QtdXIub3V0KTogTmV3IHRhcmdldHMuCi0JKGNoZWNrLWNkdGVzdCk6IE5vdyBhbHNvIGNoZWNrIHRoYXQgLVVyIHdvcmtzIGNvcnJlY3RseS4KLQotCSogc2NyaXB0dGVtcC9hbHBoYS5zYzogQWxpZ24gYWxsIHNlY3Rpb25zIHRvIDE2IGJ5dGUgYm91bmRhcmllcy4KLQotVGh1IE1hciAxNyAxMjo0NTo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBNb3ZlIGxhbmdfY29tbW9uIGNhbGwgYmVmb3JlCi0JbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucywgdG8gZW5zdXJlIHRoYXQgYW55IGFsaWdubWVudAotCWNvbnN0cmFpbnRzIHNldCBieSBjb21tb24gc3ltYm9scyBhcmUgY29waWVkIG92ZXIgdG8gdGhlIG91dHB1dAotCXNlY3Rpb25zLgotCi1GcmkgTWFyIDExIDIyOjE3OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9lbGYzMnBwYy5zaCAoVEVNUExBVEVfTkFNRSk6IERvbid0IGRlZmluZS4KLQkoT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TKTogUmVuYW1lIC50b2MgdG8gLmdvdC4KLQkqIE1ha2VmaWxlLmluIChlbV9lbGYzMnBwYy5jKTogRGVwZW5kIHVwb24gZ2VuZXJpYy5lbSwgbm90IHBwYy5lbS4KLQkqIGVtdWx0ZW1wbC9wcGMuZW06IFJlbW92ZSB1Z2x5IHN0dWIgY29kZTsgdHVybnMgb3V0IG5vdCB0byBiZQotCW5lZWRlZCBmb3IgRUxGLgotCi1UdWUgTWFyICA4IDA0OjIyOjI3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2kzODZic2QubWg6IE5ldyBmaWxlLgotCi1Nb24gTWFyICA3IDE1OjIzOjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmLnNjOiBQZXJtaXQgVEVYVF9TVEFSVF9TWU1CT0xTIGFuZCBEQVRBX1NUQVJUX1NZTUJPTFMgdG8gYmUKLQlkZWZpbmVkLgotCSogZW11bHBhcmFtcy9lbGYzMm1pcGIucyAoVEVYVF9TVEFSVF9TWU1CT0xTKTogRGVmaW5lIF9mdGV4dC4KLQkoREFUQV9TVEFSVF9TWU1CT0xTKTogRGVmaW5lIF9mZGF0YS4KLQotTW9uIEZlYiAyOCAxMDo1OToxNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChjYXQpOiBEZWZpbmUgdXNpbmcgQU5TSSBzdHlsZSBpZiBBTE1PU1RfU1REQyBkZWZpbmVkLgotCi1TdW4gRmViIDI3IDE2OjI5OjM4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbXVsdGVtcGwvaHBwYWVsZi5lbSAoaHBwYWVsZl9maW5pc2gpOiBVcGRhdGUgY29tbWVudHMuICBUaGlzCi0Jd29ya3MgYWdhaW4uICBBdHRhY2ggc29tZSBvdXRwdXQgc3ltYm9scyB0byB0aGUgc3R1YiBmaWxlIGJmZC4KLQotCSogZW11bHRlbXBsL2hwcGFlbGYuZW06IEluY2x1ZGUgZWxmMzItaHBwYS5oLgotCShmaWxlX2NoYWluKTogQWRkIGRlY2wuCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IERlbGV0ZSBkZWNsLgotCShocHBhZWxmX2ZpbmlzaCk6IFJlZW5hYmxlIGNvZGUuICBEbyBub3QgcGFzcyBzeW1ib2xzCi0JZG93biB0byBocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24uCi0KLVNhdCBGZWIgMjYgMTA6NTg6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAod3JpdGVfbWFwKTogRG9uJ3QgZGVmaW5lLiAgUmVtb3ZlZCBhbGwgcmVmZXJlbmNlcy4KLQlKdXN0IHVzZSBtYXBfZmlsZSBvciBtYXBfZmlsZW5hbWUgaW5zdGVhZC4KLQkoYWRkX2FyY2hpdmVfZWxlbWVudCk6IFVzZSBtaW5mbyB0byB3cml0ZSBtYXAgaW5mb3JtYXRpb24sIG5vdAotCWluZm9fbXNnLgotCShjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IFVzZSBmcHJpbnRmIHRvIHdyaXRlIG1hcCBpbmZvcm1hdGlvbiwgbm90Ci0JaW5mb19tc2cuCi0JKiBsZG1haW4uaCAod3JpdGVfbWFwKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxkZ3JhbS55IChtcmlfc2NyaXB0X2NvbW1hbmQpOiBSZW1vdmVkIHJlZmVyZW5jZSB0byB3cml0ZV9tYXAuCi0JKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogTGlrZXdpc2UuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IExpa2V3aXNlLgotCi1GcmkgRmViIDI1IDE5OjEyOjAzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBGb3JjZSBhbGwgc2VjdGlvbnMgdG8gYmUgYWxpZ25lZC4KLQotCSogbGRncmFtLnkgKHNlY3Rpb24pOiBSZXZlcnNlIHRoZSBvcmRlciBvZiBtZW1zcGVjX29wdCBhbmQKLQlmaWxsX29wdCB0byBhdm9pZCBhbiBhbWJpZ3VpdHkgd2hlbiBib3RoIGFyZSB1c2VkLgotCSogbGQudGV4aW5mbzogQ2hhbmdlZCBhY2NvcmRpbmdseS4KLQotCSogbGRncmFtLnk6IE1vdmUgaW5jbHVkZSBvZiBsZGxleC5oIGJhY2sgd2l0aCBvdGhlciBpbmNsdWRlcy4KLQkqIGxkbGV4LmggKGlucHV0X3R5cGUpOiBEb24ndCBpbml0aWFsaXplIGVudW0gY29uc3RhbnRzIHRvCi0JcGFydGljdWxhciB2YWx1ZXMuCi0JKiBsZGxleC5sOiBVc2UgYSBzd2l0Y2ggdG8gcmV0dXJuIHRoZSByaWdodCB0b2tlbiBiYXNlZCBvbgotCWlucHV0X3R5cGUsIHJhdGhlciB0aGFuIGtub3dpbmcgdGhhdCBpbnB1dF90eXBlIGhhcyBhIHZhbHVlIGJhc2VkCi0Jb24gYSB0b2tlbiB0eXBlLgotCi0JKiBsZGdyYW0ueSAoZGlybGlzdF9wdHIpOiBSZW1vdmVkOyBub3QgdXNlZC4KLQkqIGxleHN1cC5jOiBJbmNsdWRlIGxkdmVyLmguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLUZyaSBGZWIgMjUgMTg6NTU6NTQgMTk5NCAgVGVkIExlbW9uICAobWVsbG9uQHBlcHBlci5uY2QuY29tKQotCi0JKiBsZGxhbmcuYyAobG9va3VwX25hbWUpOiBkb24ndCBjYWxsIGJmZF9zZXRfZ3Bfc2l6ZS4KLQkobGRsYW5nX2FkZF9maWxlKTogY2FsbCBpdCBoZXJlIGluc3RlYWQuCi0KLUZyaSBGZWIgMjUgMTg6MTM6NDYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueTogSW5jbHVkZSBsZGxleC5oIGFmdGVyICV0b2tlbiBkZWNscywgZm9yIGJ5YWNjLgotCi1GcmkgRmViIDI1IDEwOjQ3OjI1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0gICAgICAgICogZW11bHRlbXBsL2hwcGFlbGYuZW06IEZpcnN0IGF0dGVtcHQgdG8gY2xlYW4gdGhpcyBmaWxlIHVwLgotCUFkZCBjb21tZW50cyBpbiBzZXZlcmFsIGZ1bmN0aW9ucyBhcyB0byB0aGVpciBwdXJwb3NlIGFuZAotCWhvdyB0aGV5IGZ1bmN0aW9uIChvciBteSBjdXJyZW50IGJlc3QgZ3Vlc3MpLiAgQ2xlYW4gdXAgaG9ycmlibGUKLQlzcGFjaW5nIGFuZCBpbmRlbnRpb24gdGhhdCBuZXZlciBzaG91bGQgaGF2ZSBiZWVuIGFjY2VwdGVkIGluIHRoZQotCWZpcnN0IHBsYWNlLiAgQWRkIEZJWE1FcyBmb3IgaXNzdWVzIHdoaWNoIG5lZWQgdG8gYmUgcmVzb2x2ZWQuCi0JRGlzYWJsZSBsaW5rZXItc3R1YiBnZW5lcmF0aW9uIHVudGlsIGl0IGdldHMgZml4ZWQuICBUaGlzIGFsbG93cwotCXRoZSBsaW5rZXIgdG8gYXQgbGVhc3Qgd29yayBvbiBzaW1wbGUgY29kZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IE5vIGxvbmdlciBzdGF0aWMgKFBBIEVMRiBjYWxscwotCWl0IHZpYSBocHBhZWxmX2ZpbmlzaCkuICBQcm90b3R5cGUgbW92ZWQgaW50byBsZGxhbmcuaC4KLQkobGFuZ19wcm9jZXNzKTogTW92ZSBwcm9ibGVtYXRpYyBleHRyYSBjYWxsIHRvIGxhbmdfc2l6ZV9zZWN0aW9ucwotCWludG8gdGhlIFBBIEVMRiBzcGVjaWZpYyBjb2RlLgotCSogZW11bHRlbXBsL2hwcGFlbGYuZW0gKGhwcGFlbGZfZmluaXNoKTogRXh0cmEgY2FsbCB0bwotCWxhbmdfc2l6ZV9zZWN0aW9ucyBtb3ZlZCBoZXJlLgotCi1UaHUgRmViIDI0IDE2OjQ3OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChwb3dlcnBjLSotZWxmKik6IE5ldyB0YXJnZXQ7IHVzZSBwcGMtZWxmMzIuCi0JKiBjb25maWcvcHBjLWVsZjMyLm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2g6IE5ldyBmaWxlLgotCSogZW11bHRlbXBsL3BwYy5lbTogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9lbGYzMnBwYy5vLgotCShlbV9lbGYzMnBwYy5jKTogTmV3IHRhcmdldDsgdXNlcyBlbGYzMnBwYy5zaCwgcHBjLmVtIGFuZCBlbGYuc2MuCi0JKEVNVUxBVElPTl9PRklMRVMpOiBBZGRlZCBkZXBlbmRlbmNpZXMgb24gbGRleHAuaCBhbmQgbGRsYW5nLmguCi0KLVRodSBGZWIgMjQgMTI6Mjc6MDcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFVzZSBzeW1ib2xpYyBudW1iZXJzIGZvciBsb25nIG9wdGlvbnMuCi0JRml4IG1pc3VuZGVyc3RhbmRpbmcgaW4gLVkgYW5kIC1jYWxsX3NoYXJlZCBldCBhbC4KLQotCVVzZSBnZXRvcHQgaW5zdGVhZCBvZiBsZXggYW5kIHlhY2MgdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZS4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IERvY3VtZW50IGNoYW5nZXMgdG8gb3B0aW9uIHN5bnRheC4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogbGR2ZXIuYyAoaGVscCk6IFR3ZWFrIGRhc2hlcyBpbiB1c2FnZSBtZXNzYWdlLgotCSogbGRncmFtLnkgKCV1bmlvbik6IFJlbW92ZSB1bnVzZWQgbWVtYmVycy4KLQlSZW1vdmUgJXRva2VucyBmb3IgY29tbWFuZCBsaW5lIG9wdGlvbnM7IGFkZCBvbmVzIGZvciBpbnB1dCB0eXBlcy4KLQkoY29tbWFuZF9saW5lKTogUnVsZXMgcmVtb3ZlZC4KLQkoZmlsZSk6IEluc3RlYWQgb2YgY29tbWFuZCBsaW5lLCByZWNvZ25pemUgYW4KLQlpbnB1dCB0eXBlIGluZGljYXRvciwgdGhlbiB1c2UgdGhlIG5vbnRlcm1pbmFsIGZvciB0aGF0IHR5cGUuCi0JKGRlZnN5bV9leHByKTogTmV3IG5vbnRlcm1pbmFsIGZyb20gY29kZSBmb3JtZXJseSBpbiBjb21tYW5kX2xpbmUuCi0JKiBsZGxleC5oOiBEZWNsYXJlIHBhcnNlciBpbnB1dCB0eXBlIGVudW0gYW5kIHZhcmlhYmxlLgotCURvbid0IGRlY2xhcmUgcGFyc2VfbGluZS4KLQkqIGxkbGV4Lmw6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgTWFrZSBzb21lIHVzZWQgb25lcyBzdGF0aWMKLQlhbmQgY29tbWVudCB0aGVtLgotCShDT01NQU5EKTogU3RhcnQgc3RhdGUgYW5kIGl0cyBydWxlcyByZW1vdmVkLgotCUF0IHN0YXJ0IG9mIHl5bGV4LCByZXR1cm4gaW5wdXQgc3RhdGUgdG9rZW4gaWYgYXQgc3RhcnQgb2YgaW5wdXQuCi0JKGxleF9yZWRpcmVjdCk6IERvbid0IG5lZWQgdG8gc2V0IHl5b3V0LgotCShsZGxleF9jb21tYW5kKTogRnVuY3Rpb24gcmVtb3ZlZC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5zdGVhZCBvZiBjYWxsaW5nIHBhcnNlX2xpbmUsIHNldCB1cCB0aGUKLQlyZWRpcmVjdGlvbnMgYW5kIGNhbGwgeXlwYXJzZSBkaXJlY3RseS4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBJZiB0aGVyZSdzIG5vIGlucHV0IGZpbGVuYW1lLCBwcmludCBub3RoaW5nLCBub3QKLQkiY29tbWFuZCBsaW5lIi4KLQkqIGxleHN1cC5jOiBSZW1vdmUgI2lmIDAnZCBjb2RlLgotCShwYXJzZV9saW5lKTogRnVuY3Rpb24gcmVtb3ZlZC4KLQkocGFyc2VfYXJncyk6IFJld3JpdGUgdG8gdXNlIGdldG9wdF9sb25nX29ubHkuCi0JKHNldF9kZWZhdWx0X2Rpcmxpc3QpOiBOZXcgZnVuY3Rpb24gZnJvbSBjb2RlIGZvcm1lcmx5IGluCi0JbGRncmFtLnk6Y29tbWFuZF9saW5lLgotCShzZXRfc2VjdGlvbl9zdGFydCk6IE5ldyBmdW5jdGlvbi4KLQkqIGVtdWx0ZW1wbC9nZW5lcmljLmVtLCBlbXVsdGVtcGwvZ2xkOTYwLmVtLCBlbXVsdGVtcGwvaHBwYWVsZi5lbSwKLQllbXVsdGVtcGwvbG5rOTYwLmVtLCBlbXVsdGVtcGwvbTg4a2Jjcy5lbTogRG9uJ3QgZW5jbG9zZQotCWNvbXBpbGVkLWluIGxpbmsgc2NyaXB0cyBpbiAieyIgYW5kICJ9IiwgYXMgdGhlIGdyYW1tYXIgbm8gbG9uZ2VyCi0Jd2FudHMgdGhlbSB0byBiZS4KLQotVGh1IEZlYiAyNCAwODo0MzoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChsZC5kdmkpOiBEZXBlbmQgb24gY29uZmlnZG9jLnRleGksIGJ1dCBkb24ndAotCXJlcXVpcmUgdGhhdCBpdCBiZSBpbiAkKHNyY2RpcikuCi0KLVR1ZSBGZWIgMjIgMDk6MjE6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogT25seSBhbGlnbiBzZWN0aW9uIHRvIGFsaWdubWVudAotCXJlcXVpcmVkIGJ5IGxpbmtlciBzY3JpcHQsIG5vdCB0byBtYXhpbXVtIGFsaWdubWVudCBvZiBpbnB1dAotCXNlY3Rpb25zLgotCi0JKiBsZGxhbmcuaCAobGFyZ2VzdF9zZWN0aW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxkbGFuZy5jIChsYXJnZXN0X3NlY3Rpb24pOiBEb24ndCBkZWZpbmUuCi0JKHNpemVfaW5wdXRfc2VjdGlvbik6IERvbid0IHNldCBsYXJnZXN0X3NlY3Rpb247IG5vdCB1c2VkLgotCi1Nb24gRmViIDIxIDE1OjE1OjI5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKG5ld19hZmlsZSk6IFBhc3MgTlVMTCBhcyBsYXN0IGFyZ3VtZW50IHRvIGNvbmNhdC4KLQotVGh1IEZlYiAxNyAxNTo1MToyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jLCBsZG1haW4uYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQotCSogbGRtaXNjLmggKGNvbmNhdCk6IERvbid0IGRlY2xhcmUuCi0JKiBsZG1pc2MuYyAoY29uY2F0KTogRG9uJ3QgZGVmaW5lOyBqdXN0IHVzZSB0aGUgb25lIGluIGxpYmliZXJ0eS4KLQotCSogbGQuaCAoYXNfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogUmVtb3ZlZDsgbm90IHVzZWQuCi0KLVRodSBGZWIgMTcgMDk6MzI6MTQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYywgbGRtYWluLmMsIGxkbWlzYy5jOiBVc2UgYmZkX2dldF9lcnJvciBhbmQKLQliZmRfc2V0X2Vycm9yIGFuZCBuZXcgZXJyb3IgbmFtZXMuCi0KLVR1ZSBGZWIgMTUgMjA6MTQ6NTMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogSWYgdGhlIGNvb2tlZCBzaXplIG9mIHRoZSBzZWN0aW9uCi0JaGFzIGJlZW4gc2V0LCB1c2UgaXQsIGZvciBkZXRlcm1pbmluZyBsaW5rX29yZGVyIHNpemUuCi0JKGxkd3JpdGUpOiBJbiB0aGUgZXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgaWYgYmZkX2ZpbmFsX2xpbmsgZmFpbHMsCi0JaW5kaWNhdGUgdGhhdCBpdCB3YXMgaW4gZmFjdCB0aGUgZmluYWwgbGluayBzdGVwIHRoYXQgZmFpbGVkLgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQ2xlYXIgYmZkX2Vycm9yIGJlZm9yZSBjYWxsaW5nCi0JYmZkX3JlbGF4X3NlY3Rpb24sIGluIGNhc2UgaXQgcmV0dXJucyBmYWxzZSBidXQgZG9lc24ndCBmbGFnIGFuCi0JZXJyb3IuICBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCwgaW5kaWNhdGUgd2hpY2ggb25lIGl0IGlzIGluIHRoZQotCWVycm9yIG1lc3NhZ2UuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBEZXBlbmQgb24gbGQuaW5mbywgYW5kIHVzZSAiJDwqIiBzbwotCWl0J2xsIGdldCBwaWNrZWQgdXAgZnJvbSAkKHNyY2RpcikgaWYgYXBwcm9wcmlhdGUuCi0KLVR1ZSBGZWIgMTUgMTY6MzI6MDQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBPbmx5IHBhZCAudGV4dCBpZiBQQURfVEVYVCBpcyBzZXQuCi0JKiBlbXVscGFyYW1zL2kzODZtYWNoLnNoIChQQURfVEVYVCk6IFNldCBQQURfVEVYVC4KLQotRnJpIEZlYiAxMSAxNzowMjo0OSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4LmwgKGNvbW1lbnQpOiBJbmNyZW1lbnQgbGluZSBudW1iZXIgd2hlbiBuZXdsaW5lIGlzIHJlYWQuCi0KLUZyaSBGZWIgMTEgMTc6MzY6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobG9va3VwX25hbWUpOiBUYWtlIG5ldyBhcmd1bWVudCwgZm9yY2VfbG9hZC4gIElmIHRydWUsCi0JcmVsb2FkIHRoZSBmaWxlIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWQuCi0JKHdpbGQpOiBDYWxsIGxvb2t1cF9uYW1lIHdpdGggZm9yY2VfbG9hZCBhcmd1bWVudCBvZiAwLgotCShvcGVuX2lucHV0X2JmZHMpOiBDYWxsIGxvb2t1cF9uYW1lIHdpdGggZm9yY2VfbG9hZCBhcmd1bWVudCBvZiAxLgotCShwcmludF9zeW1ib2wpOiBSZW1vdmUgZGVjbGFyYXRpb24gb2Ygbm9uLWV4aXN0ZW50IGZ1bmN0aW9uLgotCShwcmludF9vbmVfc3ltYm9sKTogUmV0dXJuIHRydWUgcmF0aGVyIHRoYW4gZmFsbGluZyBvZmYgZW5kLgotCi1UaHUgRmViIDEwIDExOjUyOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKG1haW4pOiBVc2UgJWxkIHdoZW4gcHJpbnRpbmcgbG9uZyB2YWx1ZXMuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogTW92ZSBfZWRhdGEgYWZ0ZXIgdGhlIC5zZGF0YSBzZWN0aW9uLgotCVBlcm1pdCBPVEhFUl9CU1NfU1lNQk9MUyB0byBiZSBkZWZpbmVkLgotCSogZW11bHBhcmFtcy9lbGYzMm1pcGIucyAoT1RIRVJfQlNTX1NZTUJPTFMpOiBEZWZpbmUgX2Zic3MuCi0KLU1vbiBGZWIgIDcgMTY6MzE6MTUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIFJlbmFtZSBhbGwgImhwcGFvc2YiIGZpbGVzIHRvICJocHBhZWxmIi4KLQkqIENoYW5nZSBhbGwgIm9zZiIgcmVmZXJlbmNlcyB0byAiZWxmIiBpbiBocHBhZWxmIGZpbGVzLgotCSogTWFrZWZpbGUuaW46IExpa2V3aXNlLgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotU3VuIEZlYiAgNiAyMDozMTo1NiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChtYWluKTogQ2FsbCB4YXRleGl0LCBub3QgYXRleGl0LgotCUNhbGwgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lLgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQ2hlY2sgaWYgYmZkX3JlbGF4X3NlY3Rpb24gc2V0Ci0JYmZkX2Vycm5vLgotCi1TYXQgRmViICA1IDAzOjU0OjM0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZW11bHRlbXBsL2xuazk2MC5lbSAoYXBwZW5kKSwgZW11bHRlbXBsL2hwcGFvc2YuZW0KLQkoaHBwYW9zZl9maW5pc2gpOiBDYWxsIHhtYWxsb2MsIG5vdCBsZG1hbGxvYy4KLQkqIGxkbWFpbi5jIChwcmVzZXJ2ZV9vdXRwdXQpOiBGdW5jdGlvbiByZW1vdmVkLgotCShtYWluKTogRG8gaXQgaGVyZSBpbnN0ZWFkLgotCi1GcmkgRmViICA0IDIzOjAyOjE5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsZGxhbmcuaCAoTEFOR19GT1JfRUFDSF97SU5QVVQsT1VUUFVUfV9TRUNUSU9OKTogRGVsZXRlICh1bnVzZWQpCi0JR05VIEMgc3BlY2lmaWMgbWFjcm9zLgotCi0JKiBlbXVsdGVtcGwvaHBwYW9zZi5lbSAoaHBwYW9zZl9maW5pc2gpOiBFeHBhbmQgdGhlIG9ubHkgcmVtYWluaW5nCi0JY2FsbCB0byBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NFQ1RJT04uCi0KLUZyaSBGZWIgIDQgMTY6MjY6MDggMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1pc2MuYyAobGRtYWxsb2MsIHhtYWxsb2MsIGxkcmVhbGxvYywgeHJlYWxsb2MpOiBGdW5jdGlvbnMKLQlkZWxldGVkOyB3aWxsIHVzZSBsaWJpYmVydHkgdmVyc2lvbnMgaW5zdGVhZC4KLQkqIGxkY3Rvci5jIGxkZmlsZS5jIGxkbGFuZy5jIGxkbWFpbi5jIGxkbWlzYy5jIGxkbWlzYy5oIGxleHN1cC5jCi0JbXJpLmMgTWFrZWZpbGUuaW46IENoYW5nZSBjYWxsZXJzLgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogUmVtb3ZlIGNsZWFudXAgY29kZS4KLQkqIGxkbWFpbi5jIChyZW1vdmVfb3V0cHV0KTogUHV0IGl0IGhlcmUgKG5ldyBmdW5jdGlvbikuCi0JKHByZXNlcnZlX291dHB1dCk6IE5ldyBmdW5jdGlvbi4KLQkobWFpbik6IFJlZ2lzdGVyIHJlbW92ZV9vdXRwdXQgYW5kIHByZXNlcnZlX291dHB1dCB3aXRoIGF0ZXhpdC4KLQkqIGxkbWFpbi5jIGxkZ3JhbS55OiBDYWxsIHhleGl0IGluc3RlYWQgb2YgZXhpdC4KLQkqIGxkbWlzYy5oOiBEZWNsYXJlIHhleGl0LgotCi1GcmkgRmViICA0IDE1OjE5OjAxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBMb3RzIG9mIG5ldyBIOC81MDAgbWVtb3J5IG1vZGVscy4KLQotU3VuIEphbiAzMCAxNDozMzo0MCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sOiBSZW1vdmVkIGR1cGxpY2F0ZSBydWxlcy4KLQkoeXl3cmFwKTogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb24sIG5lZWRlZCB3aXRoIHNvbWUgdmVyc2lvbnMgb2YKLQlmbGV4LgotCi1GcmkgSmFuIDI4IDA5OjEyOjU2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IEZvciBgJUknLCBpZiB0aGUgZmlsZSBpcyBpbiBhbiBhcmNoaXZlLCBwcmludAotCXRoZSBhcmNoaXZlIGZpbGVuYW1lIHRvby4KLQotCSogbGRsZXgubDogQWRkIHJ1bGUgdG8gY2F0Y2ggaW52YWxpZCBpbnB1dCBjaGFyYWN0ZXJzIGluc3RlYWQgb2YKLQlwcmludGluZyB0aGVtLiAgSW5jbHVkZSAibGRtYWluLmgiIGZvciBwcm9ncmFtX25hbWUgZGVjbC4KLQkobGV4X3dhcm5faW52YWxpZCk6IE5ldyBmdW5jdGlvbi4KLQkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jeS4KLQotRnJpIEphbiAyOCAxMjo1ODo0NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBEb24ndCBib3RoZXIgcnVubmluZyBhbnkgdGVzdHMgb2YKLQljcm9zcy1saW5rZXIgdW50aWwgdGhlIHRlc3Qgc3VpdGUgbm8gbG9uZ2VyIGFzc3VtZXMgbmF0aXZlIG1vZGUuCi0KLVRodSBKYW4gMjcgMTc6MTk6NTQgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKHByaW50X29uZV9zeW1ib2wsIHByaW50X2lucHV0X3NlY3Rpb24pOiAgUHJpbnQKLQlnbG9iYWwgc3ltYm9scyBpbiBzeW1ib2wgdGFibGUgYWdhaW4uCi0KLVRodSBKYW4gMjcgMTI6MzU6MDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyBsZG1haW4uaCBsZGdyYW0ueTogSWYgLXYgLVYgb3IgLS12ZXJzaW9uIHdhcyBnaXZlbiwKLQlleGl0IHN1Y2Nlc3NmdWxseSBpbnN0ZWFkIG9mIGNvbXBsYWluaW5nIGlmIG5vIGlucHV0IGZpbGVzIGFyZQotCWdpdmVuLgotCi1UdWUgSmFuIDI1IDEzOjE5OjQxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEZvcm1hdCB2YXJpYWJsZSBkZWZpbml0aW9ucyBjb25zaXN0ZW50bHkuCi0JKExEX1BST0cpOiBSZW1vdmUgdW5uZWNlc3NhcnkgdmFyaWFibGVzIGZyb20gbGluayBjb21tYW5kLAotCWNoYW5nZSB2YXJpYWJsZSBMT0FETElCRVMgdG8gRVhUUkFMSUJTLgotCi0JKiBsZG1haW4uYyAobWFpbik6IENvbXB1dGUgYW5kIGRpc3BsYXkgdG90YWwgZXhlY3V0aW9uIHRpbWUuCi0JKiBsZC50ZXhpbmZvICgtc3RhdHMpOiBEb2N1bWVudCB0aGUgb3B0aW9uLgotCi1Nb24gSmFuIDI0IDEyOjU2OjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKHJlbG9jX292ZXJmbG93KTogQWRkZWQgbmFtZSwgcmVsb2NfbmFtZSBhbmQgYWRkZW5kCi0JYXJndW1lbnRzLgotCi0JKiBsZGxhbmcuYyAobG9va3VwX25hbWUpOiBTZXQgQkZEIEdQIHNpemUgdG8gLUcgYXJndW1lbnQgdmFsdWUKLQlhZnRlciBvcGVuaW5nIEJGRC4KLQotCSogbGRsYW5nLmMgKHJlbGF4aW5nKTogUmVtb3ZlZCBnbG9iYWwgdmFyaWFibGUuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIHRoZSBjYW5vbmljYWwgc3ltYm9scyBoYXZlIG5vdCBhbHJlYWR5Ci0JYmVlbiByZWFkIGluLCByZWFkIHRoZW0gaW4gYmVmb3JlIHJlbGF4aW5nLgotCSogbGRsYW5nLmggKHJlbGF4aW5nKTogUmVtb3ZlZCBkZWNsYXJhdGlvbi4KLQotRnJpIEphbiAyMSAwMDo0NDo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChuZXdfYWZpbGUpOiBJbml0aWFsaXplIGxvYWRlZCBmaWVsZCB0byBmYWxzZS4KLQkobG9va3VwX25hbWUpOiBJZiBmaWxlIHdhcyBhbHJlYWR5IGxvYWRlZCwgZG9uJ3QgY2FsbCB0aGUKLQlhZGRfc3ltYm9scyBlbnRyeSBwb2ludCBhZ2Fpbi4KLQotV2VkIEphbiAxOSAxMzo1NzowMCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkLnRleGluZm86IENsYXJpZnkgd2hhdCAtVCBvcHRpb24gZG9lcy4KLQotVHVlIEphbiAxOCAxNjoxODoxNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9tODhrYmNzLnNjOiBEb24ndCB1c2UgQ1JFQVRFX09CSkVDVF9TWU1CT0xTLCB0aGF0J3MKLQlmb3IgYS5vdXQuCi0KLVR1ZSBKYW4gMTEgMTM6MjI6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoYWRkX2FyY2hpdmVfZWxlbWVudCk6IElmIHRyYWNlX2ZpbGVzIG9yCi0JdHJhY2VfZmlsZV90cmllcywgcHJpbnQgZmlsZSBuYW1lLgotCSogbGRsYW5nLmMgKGxvb2t1cF9uYW1lKTogTGlrZXdpc2UuCi0JKGxkbGFuZ19hZGRfZmlsZSk6IERvbid0IHB1dCBmaWxlcyBvbiBpbnB1dF9iZmRzIGxpc3QgaW4gcmV2ZXJzZQotCW9yZGVyLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IENvcnJlY3QgdHlwby4KLQotTW9uIEphbiAxMCAxOTo0OTowNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55LCBsZGxleC5sOiBNYWtlIHRoZSBzcGFjZSBiZXR3ZWVuIC1lLCAtdSwgYW5kIC15IGFuZAotCXRoZWlyIGFyZ3VtZW50cyBvcHRpb25hbCwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkIEdOVSBsZC4KLQotRnJpIEphbiAgNyAyMDowMDoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5jOiBEZWZpbmUgX19ic3Nfc3RhcnQgYmVmb3JlIHRoZSAuc2JzcyBzZWN0aW9uLgotCi1UaHUgSmFuICA2IDAwOjEzOjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKGFkZF90b19zZXQpOiBBZGQgYml0c2l6ZSBhcmd1bWVudC4KLQkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBOZXcgZnVuY3Rpb24uCi0JKGxpbmtfY2FsbGJhY2tzKTogQWRkIGNvbnN0cnVjdG9yX2NhbGxiYWNrLgotCSogbGRjdG9yLmMgKHN0cnVjdCBzZXRfaW5mbyk6IEFkZCBiaXRzaXplIGZpZWxkLgotCShsZGN0b3JfYWRkX3NldF9lbnRyeSk6IEFkZCBiaXRzaXplIGFyZ3VtZW50LgotCShsZGN0b3JfYnVpbGRfc2V0cyk6IEJhc2UgdGhlIHNpemUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBzZXQgb24KLQl0aGUgYml0c2l6ZSwgcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nIExPTkcuCi0JKiBsZGN0b3IuaCAobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBBZGQgYml0c2l6ZSB0byBkZWNsYXJhdGlvbi4KLQotCSogbGQuaCAoUVVBRF9TSVpFKTogRGVmaW5lLgotCSogbGRncmFtLnkgKFFVQUQpOiBOZXcgdG9rZW4uCi0JKGxlbmd0aCk6IEhhbmRsZSBpdC4KLQkqIGxkbGV4Lmw6IFJldHVybiBRVUFELgotCSogbGV4c3VwLmMgKGtleXdvcmRzKTogQWRkIFFVQUQuCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBIYW5kbGUgUVVBRC4KLQkqIGxkbGFuZy5jIChwcmludF9kYXRhX3N0YXRlbWVudCk6IEhhbmRsZSBRVUFELgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkobGFuZ19kb19hc3NpZ25tZW50cyk6IExpa2V3aXNlLgotCSogbGRleHAuYyAoZXhwX3ByaW50X3Rva2VuKTogQWRkIFFVQUQgdG8gdGFibGUuCi0JKiBsZC50ZXhpbmZvOiBEZXNjcmliZSBRVUFELgotCi0JKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogRG9uJ3QgY3JlYXRlIC5saXQ0IG9yIC5zZGF0YSBzZWN0aW9ucywKLQlzaW5jZSB0aGUgQWxwaGEgZG9lc24ndCB1c2UgdGhlbS4KLQotV2VkIEphbiAgNSAxNzo0MjoxNiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZW11bC5oIChsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBDb21tZW50IHRoZSBtZW1iZXJzLgotCi1TYXQgSmFuICAxIDEzOjM5OjMxIDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIFZTVGEgbWljcm8ta2VybmVsLgotCSogY29uZmlnL3ZzdGEubXQsIGVtdWxwYXJhbXMvdnN0YS5zaDogTmV3IGZpbGVzIGZvciBWU1RhLgotCi1TYXQgSmFuICAxIDEwOjUzOjM1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogUGFkIC50ZXh0IHRvIERBVEFfQUxJR05NRU5UIGlmIHJlbG9jYXRpbmc7Ci0JbmVlZGVkIGZvciBpMzg2bWFjaC4gIChTaG91bGQgYmUgYSBuby1vcCBvbiBvdGhlciBzeXN0ZW1zLikKLQotCSogZW11bHBhcmFtcy9pMzg2bWFjaC5zaCAoU0VHTUVOVF9TSVpFKTogRml4IGFnYWluLgotCShQQUdFX1NJWkUpOiBEb24ndCBkZWZpbmU7IG5vdCB1c2VkLgotCi1GcmkgRGVjIDMxIDE2OjEyOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnkgKHl5ZXJyb3IpOiBNYWtlIGFyZ3VtZW50IGNvbnN0IGNoYXIgKiwgYW5kIGFjdHVhbGx5Ci0JcHJpbnQgaXQgb3V0IHJhdGhlciB0aGFuIGFzc3VtaW5nIGl0IGlzIGEgc3ludGF4IGVycm9yLgotCSogbGRtaXNjLmg6IENoYW5nZSBkZWNsYXJhdGlvbiBvZiB5eWVycm9yLgotCSogbGRlbXVsLmMsIGxkd3JpdGUuYzogQWRkIC8qQVJHU1VTRUQqLyBhcyBhcHByb3ByaWF0ZS4KLQotRnJpIERlYyAzMSAxMTozNzoyOCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvaTM4Nm1hY2guc2ggKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IERvbid0IGluY2x1ZGUKLQlleGVjIGhlYWRlciBvZmZzZXQsIHNpbmNlIHRoZSBleGVjIGhlYWRlciBpc24ndCBsb2FkZWQuCi0JKFBBR0VfU0laRSwgU0VHTUVOVF9TSVpFKTogQWdyZWUgd2l0aCBiZmQvaTM4Nm1hY2gzLmMuCi0KLVRodSBEZWMgMzAgMTM6MDE6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQSBtYWpvciByZXdyaXRlIHRvIG1vdmUgdGhlIGJ1bGsgb2YgdGhlIGxpbmtlciBpbnRvIEJGRCBzbyB0aGF0Ci0JbW9yZSBlZmZpY2llbnQgYmFja2VuZCBjb2RlIGNhbiBiZSB3cml0dGVuIGZvciBzcGVjaWZpYyBvYmplY3QKLQlmaWxlcy4KLQkqIGxkZXJyb3IuYywgbGRlcnJvci5oLCBsZGluZHIuYywgbGRpbmRyLmgsIGxkc3ltLmMsIGxkc3ltLmgsCi0JbGR3YXJuLmMsIGxkd2Fybi5oLCByZWxheC5jLCByZWxheC5oOiBSZW1vdmVkLgotCSogbGRjdG9yLmMsIGxkY3Rvci5oOiBDb21wbGV0ZSByZXdyaXRlLgotCSogbGR3cml0ZS5jLCBsZHdyaXRlLmg6IENvbXBsZXRlIHJld3JpdGUuCi0JKiBsZC5oIChzdHJpcF9zeW1ib2xzX3R5cGUsIHN0cmlwX3N5bWJvbHMpOiBSZW1vdmVkLiAgVXNlCi0JbGlua19pbmZvLnN0cmlwIGluc3RlYWQuICBDaGFuZ2VkIGFsbCB1c2VzLgotCShkaXNjYXJkX2xvY2Fsc190eXBlLCBkaXNjYXJkX2xvY2Fscyk6IFJlbW92ZWQuICBVc2UKLQlsaW5rX2luZm8uZGlzY2FyZCBpbnN0ZWFkLiAgQ2hhbmdlZCBhbGwgdXNlcy4KLQkobGRfY29uZmlnX3R5cGUpOiBSZW1vdmVkIHJlbG9jYXRlYWJsZV9vdXRwdXQgZmllbGQ7IHVzZQotCWxpbmtfaW5mby5yZWxvY2F0ZWFibGUgaW5zdGVhZDsgY2hhbmdlZCBhbGwgdXNlcy4gIEFkZGVkIHN0YXRzCi0JZmllbGQuCi0JKHNldF9hc3ltYm9sX2NoYWluLCBnZXRfYXN5bWJvbF9jaGFpbiwgZ2V0X2xvYWRlcl9zeW1ib2wsCi0Jc2V0X2xvYWRlcl9zeW1ib2wpOiBSZW1vdmVkLgotCSogbGRleHAuaCAobm9kZV9jbGFzcyk6IEFkZGVkIGV0cmVlX3JlbC4KLQkoZXRyZWVfdHlwZSk6IEFkZGVkIHJlbCBmaWVsZC4KLQkqIGxkZXhwLmMgKGV4cF9wcmludF90b2tlbik6IEJyYWNrZXRlZCB0YWJsZSBpbml0aWFsaXphdGlvbi4KLQkoZXhwX3JlbG9wKTogTmV3IGZ1bmN0aW9uLgotCShmb2xkX25hbWUpOiBVc2UgbGlua2VyIGhhc2ggdGFibGUgcmF0aGVyIHRoYW4gbGRzeW0gZnVuY3Rpb25zLgotCShleHBfZm9sZF90cmVlKTogTGlrZXdpc2UuICBBbHNvLCBoYW5kbGUgZXRyZWVfcmVsIGNhc2UuCi0JKGV4cF9wcmludF90cmVlKTogSGFuZGxlIGV0cmVlX3JlbC4KLQkqIGxkZ3JhbS55IChzdHJpcF9zeW1ib2xzLCBkaXNjYXJkX2xvY2Fscyk6IFJlbW92ZWQuCi0JKE9QVElPTl9zdGF0cywgT1BUSU9OX25vX2tlZXBfbWVtb3J5KTogTmV3IHRva2Vucy4gIEhhbmRsZSB0aGVtLgotCShSRUwpOiBOZXcgdG9rZW4uICBEb2VzIG5vdCBhcHBlYXIgaW4gZ3JhbW1hciwgYnV0IG5lZWRlZCBmb3IKLQlleHByZXNzaW9uIGNvZGUuCi0JKGZpbGUpOiBEb24ndCBjYWxsIGxhbmdfZmluYWw7IGl0J3MgY2FsbGVkIGJ5IG1haW4gYW55aG93LgotCSogbGRsZXgubDogQWNjZXB0IC1zdGF0cyBhbmQgLW5vLWtlZXAtbWVtb3J5IG9wdGlvbnMuCi0JKiBsZGxhbmcuaCAoZmlsbF90eXBlKTogTWFrZSB1bnNpZ25lZCBpbnQsIG5vdCB1bnNpZ25lZCBzaG9ydC4KLQkqIGxkbGFuZy5jOiBDb25zaXN0ZW50bHkgdXNlIGZpbGxfdHlwZSBmb3IgZmlsbCBhcmd1bWVudC4KLQkobGFuZ19pbml0X3NjcmlwdF9maWxlLCBzY3JpcHRfZmlsZSk6IFJlbW92ZWQuCi0JKGNyZWF0ZV9vYmplY3Rfc3ltYm9scyk6IFJlbW92ZWQuICBVc2UKLQlsaW5rX2luZm8uY3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24gaW5zdGVhZC4gIENoYW5nZWQgYWxsCi0JdXNlcy4KLQkobGFuZ19hZGRfa2VlcHN5bXNfZmlsZSk6IFJlbW92ZWQuCi0JKGxvb2t1cF9uYW1lKTogQ2FsbCBiZmRfbGlua19hZGRfc3ltYm9scyBpbnN0ZWFkIG9mCi0JbGRtYWluX29wZW5fZmlsZV9yZWFkX3N5bWJvbC4KLQkod2lsZCk6IERvbid0IGl0ZXJhdGUgb3ZlciBzY3JpcHRfZmlsZS4KLQkob3Blbl9vdXRwdXQpOiBDcmVhdGUgbGluayBoYXNoIHRhYmxlLgotCShsYW5nX3BsYWNlX3VuZGVmaW5lZHMpOiBSZXdyb3RlLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBIYW5kbGUgcmVsYXhpbmcgKGRvZXNuJ3Qgd29yayB5ZXQpLgotCShsYW5nX3JlbG9jYXRlX2dsb2JhbHMpOiBSZW1vdmVkLgotCShsYW5nX2ZpbmlzaCk6IFVzZSBsaW5rIGhhc2ggdGFibGUgcmF0aGVyIHRoYW4gbGRzeW0gZnVuY3Rpb25zLgotCShsYW5nX2NvbW1vbik6IFJld3JvdGUuCi0JKGxhbmdfb25lX2NvbW1vbik6IE5ldyBmdW5jdGlvbi4KLQkobGRsYW5nX2FkZF9maWxlKTogQWRkIGZpbGUgdG8gbGlua19pbmZvLmlucHV0X2JmZHMgbGlzdC4gIFNldAotCXVzcmRhdGEuCi0JKGNyZWF0ZV9zeW1ib2wpOiBSZW1vdmVkLgotCShsYW5nX3Byb2Nlc3MpOiBEb24ndCBjYWxsIGxhbmdfaW5pdF9zY3JpcHRfZmlsZS4gIENhbGwKLQlsZGN0b3JfYnVpbGRfc2V0cyByYXRoZXIgdGhhbiBmaW5kX2NvbnN0cnVjdG9ycy4gIERvbid0IGNhbGwKLQlsYW5nX3JlbG9jYXRlX2dsb2JhbHMuCi0JKGxhbmdfYWJzX3N5bWJvbF9hdF9iZWdpbm5pbmdfb2YpOiBSZXdyb3RlLgotCShsYW5nX2Fic19zeW1ib2xfYXRfZW5kX29mKTogUmV3cm90ZS4KLQkqIGxkbWFpbi5jIChoYWRfeSk6IFJlbW92ZWQuCi0JKGxwcmVmaXgsIGxwcmVmaXhfbGVuKTogUmVtb3ZlZDsgdXNlIGxpbmtfaW5mbyBmaWVsZHMgaW5zdGVhZC4KLQlDaGFuZ2VkIGFsbCB1c2VzLgotCShtdWx0aXBsZV9kZWZfY291bnQsIGNvbW1vbnNfcGVuZGluZywgdW5kZWZpbmVkX2dsb2JhbF9zeW1fY291bnQsCi0JdG90YWxfc3ltYm9sc19zZWVuLCB0b3RhbF9maWxlc19zZWVuKTogUmVtb3ZlZC4KLQkobGlua19jYWxsYmFja3MsIGxpbmtfaW5mbyk6IE5ldyB2YXJpYWJsZXMuCi0JKG1haW4pOiBJbml0aWFsaXplIGxpbmtfaW5mby4gIERvbid0IGNhbGwgaW5pdF9iZmRfZXJyb3JfdmVjdG9yIG9yCi0JbGRzeW1faW5pdC4gIERvbid0IHNldCBub3cgdW51c2VkIHZhcmlhYmxlcy4gIEhhbmRsZSAtc3RhdHMuCi0JKGdldF9lbXVsYXRpb24pOiBSZW1vdmVkIG9ic29sZXRlIGFuZCBub25mdW5jdGlvbmFsIEdOVTk2MCBjb2RlLgotCShhZGRfeXN5bSk6IFJld3JvdGUuCi0JKHJlYWRfZW50cnlfc3ltYm9scywgcmVmaXplLCBlbnRlcl9nbG9iYWxfcmVmLCBlbnRlcl9maWxlX3N5bWJvbHMsCi0Jc2VhcmNoX2xpYnJhcnksIGdudTk2MF9jaGVja19mb3JtYXQsIGRlY29kZV9saWJyYXJ5X3N1YmZpbGUsCi0JbGluZWFyX2xpYnJhcnksIHN5bWRlZl9saWJyYXJ5LCBjbGVhcl9zeW1zLCBzdWJmaWxlX3dhbnRlZF9wKToKLQlSZW1vdmVkLgotCShhZGRfa2VlcHN5bXNfZmlsZSwgYWRkX2FyY2hpdmVfZWxlbWVudCwgbXVsdGlwbGVfZGVmaW5pdGlvbiwKLQltdWx0aXBsZV9jb21tb24sIGFkZF90b19zZXQsIHdhcm5pbmdfY2FsbGJhY2ssIHVuZGVmaW5lZF9zeW1ib2wsCi0JcmVsb2Nfb3ZlcmZsb3csIHJlbG9jX2Rhbmdlcm91cywgdW5hdHRhY2hlZF9yZWxvYywgbm90aWNlX3lzeW0pOgotCU5ldyBmdW5jdGlvbnMuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogQWNjZXB0IGEgc3RyaW5nIGZvciAlVCwgbm90IGEgc3ltYm9sLiAgRG9uJ3QKLQlyZXF1aXJlIHN5bWJvbHMgZm9yICVDOyBsb29rIHRoZW0gdXAgaW5zdGVhZC4KLQkqIGVtdWx0ZW1wbC9ocHBhb3NmLmVtOiBQYXNzIGxpbmtfaW5mbyB0bwotCWhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogUmVtb3ZlZCBsZGVycm9yLmMsIGxkaW5kci5jLCBsZHN5bS5jLCBsZHdhcm4uYywgYW5kCi0JcmVsYXguYy4KLQkoSEZJTEVTKTogUmVtb3ZlZCBsZGVycm9yLmgsIGxkaW5kci5oLCBsZHN5bS5oLCBsZHdhcm4uaCwgYW5kCi0JcmVsYXguaC4KLQkoRU1VTEFUSU9OX09GSUxFUyk6IERlcGVuZCBvbiBiZmRsaW5rLmgsIGxkbWFpbi5oLCBsZGV4cC5oLAotCWxkbGFuZy5oIGFuZCBsZGN0b3IuaC4KLQotCSogTWFrZWZpbGUuaW4gKGxkbGV4LmMpOiBEb24ndCBkZXBlbmQgb24gbGRncmFtLmguICBSZW1vdmUKLQlkZWNsYXJhdGlvbnMgb2YgZnJlZSBhbmQgbWFsbG9jIGZyb20gZmxleCBvdXRwdXQuICBDaGFuZ2UgbWFsbG9jCi0JdG8gbGRtYWxsb2MgaW4gZmxleCBvdXRwdXQuCi0KLVRodSBEZWMgMTYgMjE6MTk6NTcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxkbWFpbi5jIChscHJlZml4KTogQ2hhbmdlIGRlZmF1bHQgZnJvbSBhIGNoYXIgdG8gYSBzdHJpbmcKLQl3aXRoIG9ubHkgb25lIGNoYXJhY3Rlci4KLQkobHByZWZpeF9sZW4pOiBTZXQgZGVmYXVsdCB0byBvbmUuCi0KLQkqIGxkbWFpbi5oIChscHJlZml4X2xlbik6IERlY2xhcmUuCi0KLQkqIGxkc3ltLmMgKHdyaXRlX2ZpbGVfbG9jYWxzKTogVXNlIHN0cm5jbXAgcmF0aGVyIHRoYW4gYSBjaGFyYWN0ZXIKLQljb21wYXJpc29uIGZvciBscHJlZml4LgotCi0JKiBlbXVsdG1wbC9tODhrYmNzLmVtIChiZWZvcmVfcGFyc2UpOiBTZXQgbHByZWZpeCBhbmQgbHByZWZpeF9sZW4KLQljb3JyZWN0bHkuCi0KLQkqIGVtdWx0bXBsL2hwcGFvc2YuZW06IEluY2x1ZGUgbGRleHAuaC4KLQkoYmVmb3JlX3BhcnNlKTogU2V0IGxwcmVmaXggYW5kIGxwcmVmaXhfbGVuIGNvcnJlY3RseS4KLQotVHVlIERlYyAxNCAxNzoxOTowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4Lmg6IERvbid0IGRlY2xhcmUgeXl3cmFwIGlmIGl0IGlzIGEgbWFjcm8uCi0JKiBsZGxleC5sOiBJbmNsdWRlIHN5c2RlcC5oLgotCSogbGRsYW5nLmMgKGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlciwKLQlsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCk6IEZvcmdvdCB0byB1c2UgUEFSQU1TLgotCi1Nb24gRGVjIDEzIDE0OjMwOjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZGVkIC5QSE9OWSB0YXJnZXRzIHdoZXJlIGFwcHJvcHJpYXRlLiAgQWRkZWQgc29tZQotCWNvbW1lbnRzLiAgQWxzbzoKLQkoZ2NjbGliZGlyLCB2ZXJzaW9uKTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGVzLgotCShERVApOiBOZXcgdmFyaWFibGUsIHNldCB0byBta2RlcC4KLQkoQUxMX0NGTEFHUyk6IE5ldyB2YXJpYWJsZS4gIFVzZWQgaW4gLmMubyB0YXJnZXQuCi0JKENGSUxFUywgSEZJTEVTLCBHRU5FUkFURURfQ0ZJTEVTLCBHRU5FUkFURURfSEZJTEVTKTogTmV3Ci0JdmFyaWFibGVzLgotCShIRUFERVJTLCBNQU5TT1VSQ0VTLCBMRENTT1VSQ0VTLCBHRU5FUkFURURfU09VUkNFUywKLQlHRU5FUkFURURfSEVBREVSUywgTERTT1VSQ0VTLCBCRkRfU09VUkNFUywgU09VUkNFUyk6IFJlbW92ZWQKLQltb3N0bHkgb2Jzb2xldGUgdmFyaWFibGVzLiAgQWRqdXN0ZWQgcmVtYWluaW5nIHVzZXMuCi0JKERFRl9FTVVMKTogUmVtb3ZlZCB2YXJpYWJsZS4KLQkobGRtYWluLm8pOiBIYW5kbGUgdW5kZWZpbmVkIEVNVUwgZXJyb3IgY29ycmVjdGx5LgotCShsZGVtdWwtbGlzdC5oKTogRGVwZW5kIG9uIGNvbmZpZy5zdGF0dXMgcmF0aGVyIHRoYW4gTWFrZWZpbGUuCi0JQ3JlYXRlIHZpYSB0ZW1wb3JhcnkgZmlsZS4KLQkodmVyOTYwLmMsIHJvbGwsIG1ha2UpOiBSZW1vdmVkIG9ic29sZXRlIHRhcmdldHMuCi0JKC5kZXAsIC5kZXAxLCBkZXAuc2VkLCBkZXAsIGRlcC1pbik6IE5ldyB0YXJnZXRzLiAgVXNlZCB0byByZWJ1aWxkCi0JZGVwZW5kZW5jaWVzLgotCSogZGVwLWluLnNlZDogTmV3IGZpbGUsIHVzZWQgd2hlbiByZWJ1aWxkaW5nIGRlcGVuZGVuY2llcy4KLQotU2F0IERlYyAxMSAxNDo0Mzo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGRlbmViLmN5Z251cy5jb20pCi0KLQlNYWRlIG1hbnkgY2hhbmdlcyB0byBlbGltaW5hdGUgZ2NjIHdhcm5pbmdzLiAgTWFkZSB2YXJpb3VzCi0JY29zbWV0aWMgY2hhbmdlcywgZGVjbGFyZWQgdmFyaW91cyB0aGluZ3MgaW4gaGVhZGVyIGZpbGVzLCByZW1vdmVkCi0JdmFyaW91cyBleHRlcm4gZGVjbGFyYXRpb25zIGZyb20gLmMgZmlsZXMuICBObyBzdWJzdGFudGl2ZQotCWNoYW5nZXMuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBJZmRlZiBvdXQgZmluYWwgY2FsbCB0bwotCWxhbmdfc2l6ZV9zZWN0aW9ucyBhZ2FpbiAocmV2ZXJ0aW5nIGNoYW5nZSBvZiBOb3ZlIDIpLCBzaW5jZSBpdAotCWJyZWFrcyB0aGUgU3VuNCBsaW5rZXIuCi0KLVRodSBEZWMgIDIgMTY6MzE6NDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLSotbmV0d2FyZSopOiBOZXcgdGFyZ2V0OyB1c2UgYWxwaGEuCi0KLVdlZCBEZWMgIDEgMTQ6MDQ6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogR3JvdXAgdGFyZ2V0cyBieSBDUFUuICBNZXJnZSBzb21lIG02OGsgdGFyZ2V0Ci0JZW50cmllcyB3aXRoIGRpZmZlcmVudCBDUFUgc3BlY3MgdGhhdCB1c2UgdGhlIHNhbWUgbGRfdGFyZ2V0Ci0JdmFsdWVzLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzcGFyYyotKi1jb2ZmLgotCSogY29uZmlnL2NvZmYtc3BhcmMubXQsIGVtdWxwYXJhbXMvY29mZl9zcGFyYy5zaDogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtX2NvZmZfc3BhcmMuby4KLQkoZW1fY29mZl9zcGFyYy5jKTogQWRkIGRlcGVuZGVuY2llcyBhbmQgYnVpbGQgcnVsZXMuCi0KLQkqIGxkbWlzYy5jIChlcnJubywgc3lzX25lcnIsIHN5c19lcnJsaXN0KTogRG9uJ3QgZGVjbGFyZS4KLQotV2VkIERlYyAgMSAxMjoxOTo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55IChPUFRJT05fY2FsbF9zaGFyZWQsIE9QVElPTl9ub25fc2hhcmVkLCBPUFRJT05fT3ZhbCk6Ci0JTmV3IHRva2Vucy4KLQkoY29tbWFuZF9saW5lX29wdGlvbik6IEFjY2VwdCBhbmQgaWdub3JlIHRoZW0gKGZvciBub3cpLgotCSogbGRsZXgubCAoPENPTU1BTkQ+KTogSGFuZGxlIC1ub25fc2hhcmVkLCAtY2FsbF9zaGFyZWQsIGFuZCAtT24KLQl3aGVyZSBuIGlzIGEgbnVtYmVyLgotCi1Nb24gTm92IDIyIDE0OjE0OjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKHN1YmZpbGVfd2FudGVkX3ApOiBJZiBtZXJnaW5nIGEgY29tbW9uIHN5bWJvbCB3aGljaCBpcwotCW5vdCBpbiBiZmRfY29tX3NlY3Rpb24sIGNyZWF0ZSB0aGUgc2VjdGlvbiBpbiB0aGUgQkZEIHNvIHRoYXQgaXQKLQljYW4gYmUgcGxhY2VkIGluIHRoZSByaWdodCBvdXRwdXQgc2VjdGlvbi4KLQotRnJpIE5vdiAxOSAxNDoxMjozOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg1Kik6IE5ldyB0YXJnZXQuICBVc2UgbWlwc2ItZWxmMzIuCi0JKiBlbXVscGFyYW1zL2VsZjMybWlwc2Iuc2ggKERBVEFfQUREUik6IERlZmluZS4KLQkoT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMpOiBEZWZpbmUgZm9yIC5yZWdpbmZvLgotCShFWEVDVVRBQkxFX1NZTUJPTFMpOiBEZWZpbmUgZm9yIF9EWU5BTUlDX0xJTksuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFVzZSBFWEVDVVRBQkxFX1NZTUJPTFMgd2hlbiBub3QgcmVsb2NhdGluZy4KLQlNb3ZlIE9USEVSX1JFQURPTkxZX1NFQ1RJT05TIGFmdGVyIGFsbCB0aGUgb3RoZXIgcmVhZG9ubHkKLQlzZWN0aW9ucy4gIERvbid0IHVzZSBEQVRBX0FERFIgdHdpY2UuCi0KLQkqIGxkbWFpbi5jIChlbnRlcl9maWxlX3N5bWJvbHMpOiBSZW1vdmVkIGR1cGxpY2F0ZSB0ZXN0cyBvZiBwLiAgSWYKLQlwIGlzIGluIGEgY29tbW9uIHNlY3Rpb24sIG1ha2Ugc3VyZSB0aGUgQkZEIGhhcyBhIHNlY3Rpb24gb2YgdGhhdAotCW5hbWUuCi0KLQkqIGxkbGFuZy5jIChsYW5nX2NvbW1vbik6IEFkZCBuZXdsaW5lIHRvIGVycm9yIG1lc3NhZ2UuCi0KLVRodSBOb3YgMTEgMTU6NTQ6NDEgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL202OGtseW54LnNoIChTQ1JJUFRfTkFNRSk6IERlZmluZSB0byB1c2UgYQotCUx5bngtc3BlY2lmaWMgc2NyaXB0IGluc3RlYWQgb2YgbTY4a2NvZmYuCi0JKE9VVFBVVF9GT1JNQVQpOiBEZWZpbmUgYXMgImNvZmYtbTY4ay1seW54Ii4KLQkoRU5UUlkpOiBEZWZpbmUgYXMgX19tYWluLgotCShURVhUX1NUQVJUX0FERFIpOiBEZWZpbmUgYXMgMC4KLQkoUEFHRV9TSVpFKTogRGVmaW5lIGFzIDB4MTAwMC4KLQkqIGVtdWxwYXJhbXMvaTM4Nmx5bnguc2gsIGVtdWxwYXJhbXMvc3BhcmNseW54LnNoOiBGaXggY29tbWVudC4KLQkqIHNjcmlwdHRlbXBsL202OGtseW54LnNjOiBOZXcgZmlsZS4KLQotTW9uIE5vdiAgOCAxMjowMDoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChnZXRfZW11bGF0aW9uKTogSWdub3JlIC1taXBzMSwgLW1pcHMyIGFuZCAtbWlwczMKLQlhcmd1bWVudHMgcmF0aGVyIHRoYW4gdHJlYXRpbmcgdGhlbSBhcyBlbXVsYXRpb24gbmFtZXMuCi0KLUZyaSBOb3YgIDUgMDk6MDI6NTIgMTk5MyAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBibHVlcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFN1cHBvcnQgeDg2IHVuaXh3YXJlIGFuZCBuZXR3YXJlIHBsdXMgZ2VuZXJpYyBuZXR3YXJlLgotCi1GcmkgTm92ICA1IDIxOjQ3OjU1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9pMzg2bWFjaC5zaCAoVEVYVF9TVEFSVF9BRERSLCBOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOgotCUNvcnJlY3QgdmFsdWVzICg/KS4KLQotV2VkIE5vdiAgMyAxNToxMDoxNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERvbid0IGRlbGV0ZSBkdmkgb3IgaW5mbyBmaWxlcy4KLQkobGQuaW5mbyk6IFVwZGF0ZSBkZXBlbmRlbmN5IGxpc3QuCi0JKGxkLmR2aSk6IERpdHRvLiAgRXh0ZW5kIFRFWElOUFVUUyB0byBnZXQgYmZkc3VtbS50ZXhpLgotCi1XZWQgTm92ICAzIDEyOjA3OjM5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfYWRkX291dHB1dCk6IFRha2UgbmV3IGFyZywgRlJPTV9TQ1JJUFQuCi0JU2V0IG91dHB1dF9maWxlbmFtZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG5vZGUuCi0JKG9wZW5fb3V0cHV0KTogRG9uJ3Qgc2V0IG91dHB1dF9maWxlbmFtZS4KLQkobGFuZ19maW5hbCk6IENyZWF0ZSB0aGUgbmV3IG5vZGUgaGVyZS4KLQkqIGxkbGFuZy5jLCBsZGxhbmcuaCwgbGRncmFtLnksIG1yaS5jOiBwYXNzIEZST01fU0NSSVBULgotCi1UdWUgTm92ICAyIDE1OjQ1OjUxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0gCUZyb20gUGV0ZSBIb29nZW5ib29tIChob29nZW5AY3MudXRhaC5lZHUpOgotCi0JKiBzY3JpcHR0ZW1wbC9ocHBhb3NmLnNjOiAoX19fc3RhY2tfemVybywgZXRleHQsIF9ldGV4dCwKLQllZGF0YSwgX2VkYXRhLCBlbmQpOiBBZGQgZGVmaW5pdGlvbnMgb2YgdGhlc2Ugc3ltYm9scy4KLQkoX19lbmQpOiAgUmVtb3ZlIGRlZmluaXRpb24gb2YgdGhpcyBzeW1ib2wuCi0JKF9fZGF0YV9zdGFydCk6IE1vdmUgZGVmaW5pdGlvbiBvZiB0aGlzIHN5bWJvbC4KLQotCSogZW11bHRlbXBsL2hwcGFvc2YuZW06ICBWYXJpb3VzIGZpeGVzIGFuZCBzdXBwb3J0IGZvciBsaW5rZXIgc3R1YgotCWdlbmVyYXRpb24uCi0JKGhwcGFvc2ZfZmluaXNoLCBocHBhb3NmX3NlYXJjaF9mb3JfcGFkZGluZ19zdGF0ZW1lbnRzLAotCWhwcGFvc2ZfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiBOZXcgZnVuY3Rpb25zIGluCi0Jc3VwcG9ydCBvZiBsaW5rZXIgc3R1YiBnZW5lcmF0aW9uLgotCShsZF9ocHBhb3NmX2VtdWxhdGlvbik6ICBSZWRlZmluZSB0byBpbmNsdWRlIG5ldwotCWVtdWxhdGlvbi1zcGVjaWZpYyByb3V0aW5lcy4KLQotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IFJlLWVuYWJsZSBsYXN0IGNhbGwgbGFuZ19zaXplX3NlY3Rpb25zLgotCVBhc3MgYWJzX291dHB1dF9zZWN0aW9uIHJhdGhlciB0aGFuIE5VTEwgdG8gYXZvaWQgaW52YWxpZGF0aW5nCi0JYWJzb2x1dGUgc3ltYm9scy4KLQotVGh1IE9jdCAyOCAyMToxNjo0MiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbV9pMzg2bWFjaC5vLgotCShlbV9pMzg2bWFjaC5jKTogTmV3IHJ1bGUuCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1tYWNoKik6IE5ldyBjYXNlLgotCSogY29uZmlnL2kzODYtbWFjaC5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2kzODZtYWNoLnNoOiBOZXcgZmlsZS4KLQotRnJpIE9jdCAyOSAxNDo1NTowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkLmggKGZsYWdfaXNfKik6IFJlbW92ZWQgbWFjcm9zLgotCSogbGRtYWluLmMgKGVudGVyX2dsb2JhbF9yZWYpLCBsZHN5bS5jICh3cml0ZV9maWxlX2xvY2Fscyk6Ci0JQ29uc2lzdGVudGx5IGNoZWNrIHRoZSBCRkQgc3ltYm9sIGZsYWdzIGRpcmVjdGx5LCByYXRoZXIgdGhhbgotCXVzaW5nIGZpbGVfaXNfKiBtYWNyb3MuCi0KLVRodSBPY3QgMjggMTk6MDg6NDIgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjKi0qLWx5bnhvcyopOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IEFkZCBydWxlIGZvciBlbV9zcGFyY2x5bnguYy4KLQkoQUxMX0VNVUxBVElPTlMpOiBBZGQgTHlueCBlbXVsYXRpb25zLgotCSogY29uZmlnL3NwYXJjLWx5bngubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9zcGFyY2x5bnguc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAyOCAxMzo1MDoyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jeSBmb3IgJChFTVVMQVRJT05fT0ZJTEVTKS4KLQotTW9uIE9jdCAyNSAxNjowOToyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlbGF4LmMgKHdyaXRlX3JlbGF4KTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9zZWNsZXRfbGluay4KLQotTW9uIE9jdCAyNSAwOTozMToyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlKTogTmV3IHZhcmlhYmxlLgotCShvcGVuX291dHB1dCk6IFNldCBpdCBhZnRlciBiZmQgb3BlbiBzdWNjZWVkcy4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBUZXN0IGl0LgotCi0JQ2hhbmdlcyBmcm9tIFBldGVyIEhvb2dlbmJvb20sIGhvb2dlbkBjcy51dGFoLmVkdToKLQotCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiBTZXQgdGhlIEJTRl9GSUxFIGZsYWcgZm9yIG9iamVjdAotCXN5bWJvbHMuCi0KLQkqIGxkZW11bC5jOiBTdXBwb3J0IHdhcyBhZGRlZCB0byBhbGxvdyBlbXVsYXRpb24tc3BlY2lmaWMKLQlwcm9jZXNzaW5nIHRvIG9jY3VyLiAgVGhpcyBzdXBwb3J0IHdhcyBhZGRlZCBwcmltYXJpbHkgZm9yIGxpbmtlcgotCXN0dWIgZ2VuZXJhdGlvbiBpbiB0aGUgZWxmMzItaHBwYSBnbGQuCi0JKGxkZW11bF9maW5pc2gsIGxkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyk6ICBOZXcKLQlmdW5jdGlvbnMuCi0JKiBsZGVtdWwuaDogU3VwcG9ydCB3YXMgYWRkZWQgdG8gYWxsb3cgZW11bGF0aW9uLXNwZWNpZmljCi0JcHJvY2Vzc2luZyB0byBvY2N1ci4gKEFzIGRlc2NyaWJlZCBhYm92ZS4pICBBZGRlZCBmaW5pc2ggYW5kCi0JY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgZmllbGRzIHRvCi0JbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IHN0cnVjdHVyZS4KLQkqIGxkbGFuZy5jOiBBZGQgY2FsbHMgdG8gZW11bGF0aW9uLXNwZWNpZmljIHJvdXRpbmVzLgotCShsYW5nX3Byb2Nlc3MpOiAgQWRkIGNhbGwgdG8KLQlsZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgZnVuY3Rpb24uCi0JKGxhbmdfcHJvY2Vzcyk6ICBBZGQgY2FsbCB0byBhIGVtdWxhdGlvbi1zcGVjaWZpYyByb3V0aW5lIChhbmQKLQlzb21lIHByb2Nlc3NpbmcgYWZ0ZXIgdGhlIGNhbGwpLgotCi1GcmkgT2N0IDIyIDIwOjU0OjEzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBtaXBzKi0gaW5zdGVhZCBvZiBtaXBzLSwgbWlwcyplbCBjaGFuZ2VzCi0KLVR1ZSBPY3QgMTkgMTU6NDY6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLSotb3NmKik6IE5ldyB0YXJnZXQ7IHVzZSBhbHBoYS5tdC4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtX2FscGhhLm8uCi0JKGVtX2FscGhhLmMpOiBOZXcgdGFyZ2V0OyB1c2UgYWxwaGEuc2ggYW5kIGFscGhhLnNjLgotCSogY29uZmlnL2FscGhhb3NmLm1oIChOQVRJVkVfTElCX0RJUlMsIEhPU1RJTkdfQ1JUMCk6IERlZmluZS4KLQkqIGNvbmZpZy9hbHBoYS5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2FscGhhLnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBOZXcgZmlsZS4KLQotRnJpIE9jdCAxNSAwMjoyMDowNCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zLCBsYW5nX2NvbW1vbik6IEFMSUdOX04gY2FuJ3QgaGFuZGxlCi0JdHlwZXMgb2YgZGlmZmVyZW50IHNpemVzIChlZzogNjQgYW5kIDMyIGJpdHMpLCBzbyBjb2VyY2UuCi0JKiBsZC5oIChBTElHTl9OKTogQWRkIHdhcm5pbmcgYWJvdXQgdXNhZ2UuCi0KLVdlZCBPY3QgMTMgMTY6MDI6MzkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoZW50ZXJfZ2xvYmFsX3JlZik6IEp1c3QgaWdub3JlIGFueSB3ZWFrIHN5bWJvbCBmb3IKLQl3aGljaCB3ZSBhbHJlYWR5IGhhdmUgYSBkZWZpbml0aW9uLCByYXRoZXIgdGhhbiBjaGVja2luZyBpbgotCXNldmVyYWwgZGlmZmVyZW50IHBsYWNlcyB3aGV0aGVyIHRoZSBzeW1ib2wgaXMgd2Vhay4KLQotVHVlIE9jdCAxMiAxNzozMDo1MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWVsZiopOiBOZXcgdGFyZ2V0OyB1c2UgbWlwc2ItZWxmMzIuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IE9ubHkgdXNlIE9USEVSX1JFQURPTkxZX1NFQ1RJT05TIGFuZAotCU9USEVSX1JFQURXUklURV9TRUNUSU9OUyBpZiByZWxvY2F0aW5nLiAgU2hlbGwgdmFyaWFibGVzIGFyZSBub3QKLQlleHBhbmRlZCB3aXRoaW4gdGhlbS4KLQkqIGNvbmZpZy9taXBzYi1lbGYzMi5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2VsZjMybWlwYi5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoZW1fZWxmMzJtaXBiLmMpOiBOZXcgdGFyZ2V0LgotCi1UaHUgU2VwIDMwIDE3OjAwOjM2IDE5OTMgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnk6IEluIGlucHV0X2xpc3QsIGNoYW5nZSBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtIHRvCi0JbGFuZ19pbnB1dF9maWxlX2lzX3NlYXJjaF9maWxlX2VudW0gc28gb2JqZWN0cyBicm91Z2h0IGluIHVzaW5nCi0JSU5QVVQoKSBkbyBhIHBhdGggbG9va3VwLgotCi1UdWUgU2VwIDI4IDEzOjMxOjIzIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgTHlueCBsZF90YXJnZXQgdG8gYmUge2kzODYsbTY4a30tbHlueAotCWluc3RlYWQgb2Yge2kzODYsbTY4a30tY29mZi4KLQkqIE1ha2VmaWxlLmluIChlbV9pMzg2bHlueC5jLCBlbV9tNjhrbHlueC5jKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWcvaTM4Ni1seW54Lm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9tNjhrLWx5bngubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9pMzg2bHlueC5zaDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL202OGtseW54LnNoOiBOZXcgZmlsZS4KLQotCSogc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2M6IE1ha2UgRU5UUlkgZ2V0IGl0cyB2YWx1ZSBmcm9tICR7RU5UUll9LAotCWJ1dCBkZWZhdWx0aW5nIHRvIF9zdGFydC4KLQotCSogbGRlbXVsLmMsIGxkZmlsZS5jLCBsZGxhbmcuYywgbGRtYWluLmMsIGxkbWlzYy5jLCBsZG1pc2MuaCwKLQlsZHN5bS5jLCBsZHdhcm4uYzogUmVuYW1lIGluZm8gdG8gaW5mb19tc2csIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGgKLQlMeW54T1MgbGliYy4KLQotVGh1IFNlcCAyMyAxNDo1MTowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zb2xhcmlzMi5taDogTmV3IGZpbGUuICBEZWZpbmUgSE9TVElOR19DUlQwIGFuZAotCUhPU1RJTkdfTElCUyBmb3IgdGVzdGluZy4KLQotRnJpIFNlcCAxNyAxNzo1MjoyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlGaW5pc2ggdXAgc3VwcG9ydCBmb3IgaTM4Ni1zeXN2NCAod2l0aG91dCBzaGFyZWQgbGlicmFyaWVzKToKLQkqIGxkLmggKGZsYWdfaXNfd2Vhayk6IERlZmluZS4KLQkqIGxkbGFuZy5jIChwcmludF9zeW1ib2wpOiBNZW50aW9uIHdoZXRoZXIgc3ltYm9sIGlzIHdlYWsuCi0JKHByaW50X2lucHV0X3NlY3Rpb24pOiBQcmludCB3ZWFrIHN5bWJvbHMgYXMgZ2xvYmFscy4KLQkqIGxkbWFpbi5jIChyZWZpemUpOiBEbyBub3QgemVybyBvdXQgQlNGX1dFQUsgZmxhZy4KLQkoZW50ZXJfZ2xvYmFsX3JlZik6IERvIG5vdCB3YXJuIGlmIGEgd2VhayBzeW1ib2wgcmVkZWZpbmVzIGEKLQlnbG9iYWwgc3ltYm9sLiAgRG8gbm90IGxldCBhIHdlYWsgc3ltYm9sIHJlZGVmaW5lIGEgY29tbW9uIHN5bWJvbC4KLQkoZW50ZXJfZmlsZV9zeW1ib2xzKTogVHJlYXQgd2VhayBzeW1ib2xzIGFzIGdsb2JhbCBzeW1ib2xzLgotCShzdWJmaWxlX3dhbnRlZF9wKTogRG8gbm90IHB1bGwgaW4gYW4gb2JqZWN0IGZpbGUgZnJvbSBhIGFyY2hpdmUKLQlqdXN0IHRvIHJlc29sdmUgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IERvbid0IG5lZWRsZXNzbHkgbWFsbG9jIHNwYWNlIGFmdGVyIGEgZmF0YWwKLQllcnJvcjsgdGhlIGVycm9yIG1pZ2h0IGJlIHRoYXQgbWFsbG9jIGhhcyBydW4gb3V0IG9mIHNwYWNlLgotCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiBUcmVhdCB3ZWFrIHN5bWJvbHMgYXMgZ2xvYmFsLgotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc3lzdjQqLCBpWzM0XTg2LSotZWxmKik6IE5ldyB0YXJnZXRzOwotCXVzZSBpMzg2LWVsZi4KLQkqIGNvbmZpZy9pMzg2djQubWg6IE5ldyBmaWxlOyBzZXQgTkFUSVZFX0xJQl9ESVJTIHRvIC91c3IvY2NzL2xpYi4KLQkqIGNvbmZpZy9pMzg2LWVsZi5tdDogTmV3IGZpbGU7IHNldCBFTVVMIHRvIGVsZl9pMzg2LgotCSogZW11bHBhcmFtcy9lbGZfaTM4Ni5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFVzZSAke05PUH0gYXMgZmlsbGVyIChkZWZhdWx0cyB0byAwKS4KLQkqIE1ha2VmaWxlLmluIChOQVRJVkVfTElCX0RJUlMpOiBEZWZpbmUgdG8gYmUgZW1wdHkuCi0JKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtX2VsZl9pMzg2Lm8uCi0JKEdFTlNDUklQVFMpOiBQYXNzIE5BVElWRV9MSUJfRElSUyBhcyBzaXh0aCBhcmd1bWVudC4KLQkoZW1fZWxmX2kzODYuYyk6IE5ldyB0YXJnZXQsIGxpa2Ugb3RoZXIgZW1fKi5jIHRhcmdldHMuCi0JKCQoTERfUFJPRykpOiBQYXNzICQoQ0ZMQUdTKSB0byAkKENDKS4KLQkqIGdlbnNjcmlwdHMuc2g6IEFjY2VwdCBOQVRJVkVfTElCX0RJUlMgYXMgc2l4dGggYXJndW1lbnQuICBJZgotCW5vbmVtcHR5LCBhbmQgY29uZmlndXJlZCBmb3IgbmF0aXZlLCBhZGQgaXQgdG8gTElCX1BBVEguCi0KLUZyaSBTZXAgMTcgMTM6MDc6MzkgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC97aDgzMDAuc2MsaDg1MDAuc2MsaTM4NmNvZmYuc2MsbTY4a2NvZmYuc2Msc2guc2N9OgotCUFkZGVkIHN0YXRlbWVudHMgdG8gcGFzcyBzdGFiIGFuZCBzdGFic3RyIHNlY3Rpb25zIHRocm91Z2ggYW5kCi0JbWFyayB0aGVtIGFzIE5PTE9BRCwgd2hpY2ggbWFrZXMgR0RCIGhhcHBpZXIuCi0KLVdlZCBTZXAgMTUgMTY6MDI6MjkgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCBtNjhrLWx5bngtbHlueG9zIGNvbmZpZy4KLQotCSogTWFrZWZpbGUuaW46IFVzZSAkKFNIRUxMKSB0byBydW4gZ2Vuc2NyaXB0cy5zaC4KLQotU3VuIFNlcCAxMiAxNjowNDo0MCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9jb2ZmLWg4MzAwLm10OiBBZGQgRU1VTD1oODMwMGguCi0KLQkqIGxkbWFpbi5jIChtYWluKTogQ2FsbCBzZXRfc2NyaXB0c19kaXIgYWZ0ZXIgYXJndiBoYXMgYmVlbiBwcm9jZXNzZWQuCi0KLUZyaSBTZXAgMTAgMDk6MzY6MjkgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZWQgQ1hYIGJhY2sgdG8gZysrLgotCi1GcmkgU2VwIDEwIDA5OjM0OjI5IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBGaXhlZCBSVU5URVNUKiBDWFggQ1hYRkxBR1MgbWFjcm9zIGFuZCBjaGVjayBydWxlLgotCi1GcmkgU2VwIDEwIDA3OjI2OjU3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBR1MpOiBVc2Ugc2hlbGwgd2lsZGNhcmRzLgotCi1UdWUgU2VwICA3IDE4OjA0OjU0IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgYWRkIFRFWElOUFVUUyB2YXJpYWJsZSBhbmQgdXNlIGl0IGluIGxkLmR2aSB0YXJnZXQKLQotRnJpIFNlcCAgMyAxNjo0Njo0MSAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBsZC50ZXhpbmZvOiByZS1lbmFibGUgaW5jbHVkZWQgY29uZmlnIGZpbGU7IGNvbmRpdGlvbmFsaXplIGRvYwotCWZvciAtb2Zvcm1hdCB0byBpbnRlcmFjdCBwcm9wZXJseSB3aXRoIFNpbmdsZUZvcm1hdCBkb2MgY29uZmlnCi0JdmFyOyByZW5hbWUgQHVwL0Bkb3duIHRvIEByYWlzZXNlY3Rpb25zL0Bsb3dlcnNlY3Rpb25zLgotCi1XZWQgQXVnIDI1IDE2OjI5OjU2IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgbTg4MTEwLgotCi1UdWUgQXVnIDI0IDE4OjQ5OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCUZyb20gUGV0ZXIgSG9vZ2VuYm9vbSA8aG9vZ2VuQHNoYWZlci5jcy51dGFoLmVkdT46Ci0JKiBlbXVsdGVtcGwvaHBwYW9zZi5lbSAobGRfaHBwYW9zZl9lbXVsYXRpb24pOiBDb3JyZWN0IG5hbWUgZm9yIFBBCi0JRUxGIGVtdWxhdGlvbiBpcyAiZWxmMzItaHBwYSIgbm90ICJlbGYtYmlnIi4KLQkoaHBwYW9zZl9iZWZvcmVfcGFyc2UpOiBSZW1vdmUgdW5uZWVkZWQgcHJvY2Vzc2luZyBvZiBlbnZpcm9ubWVudAotCXZhcmlhYmxlcy4KLQkqIHNjcmlwdHRlbXBsL2hwcGFvc2Yuc2M6IEluY2x1ZGUgLmhwcGFfbGlua2VyX3N0dWJzIHNlY3Rpb25zIGluCi0JLnRleHQgc2VnbWVudCBvZiBvdXRwdXQgZmlsZS4KLQkqIGVtdWxwYXJhbXMvaHBwYW9zZi5zaCAoT1VUUFVUX0ZPUk1BVCk6IFVzZSBlbGYzMi1ocHBhLgotCi1UdWUgQXVnIDI0IDE2OjE3OjAwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogbGQuaDogZGVmaW5lIEJZVEVfU0laRSwgU0hPUlRfU0laRSwgYW5kIExPTkdfU0laRSB3aGljaCBhcmUgbm8KLQkgIGxvbmdlciBpbiBiZmQuaC4KLQotCSogbGRsYW5nLmMsIGxkLmg6IHVwZGF0ZWQgY29weXJpZ2h0LgotCi1UdWUgQXVnIDE3IDE1OjIyOjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKG9wZW5fb3V0cHV0LCBsYW5nX2NoZWNrKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX3NldF9hcmNoX21hY2guCi0KLVR1ZSBBdWcgMTcgMDc6MDI6MTkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaDg1MDAuc2M6IFN0YXJ0IGFsbCBzZWN0aW9ucyBpbiBhIGRpZmZlcmVudCBzZWdtZW50LgotCSogc2NyaXB0dGVtcGwvejhrc2ltLnNjOiBIYW5kbGUgY29uc3RydWN0b3JzCi0KLVRodSBBdWcgMTIgMTY6MDU6MzcgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIE1ha2VmaWxlLmluOiByZXZlcnQgZWFybGllciBjaGFuZ2VzIGJhY2sgdG8gZXhlY3V0ZSBydW50ZXN0Ci0gICAgICAgICAgd2l0aCBtYWtlIGNoZWNrLiBjZHRlc3QgYW5kIGJvb3RzdHJhcCBub3cgZnVuY3Rpb24gYXMgdGhleQotCSAgZGlkIHdpdGhpbiB0aGUgTWFrZWZpbGUuCi0KLVRodSBBdWcgMTIgMTA6MjA6MDUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogCVVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEVNVUxBVElPTl9PRklMRVMgaW4gTWFrZWZpbGUgYmFzZWQgb24KLQktLXdpdGgtdGFyZ2V0cyBvcHRpb24uCi0KLVRodSBBdWcgMTIgMDg6NTI6MjkgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNoZWNrIHRhcmdldHMgcmVpbXBsZW1lbnRlZCB0byBvbGQgd2F5LgotCi1XZWQgQXVnIDExIDA4OjI2OjExIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2kzODZ2Lm1oLCBjb25maWcvaXJpeDQubWg6IFVzZSBnY2MKLQktcHJpbnQtbGliZ2NjLWZpbGUtbmFtZSByYXRoZXIgdGhhbiAkKGxpYmRpcikvbGliZ2NjLmEuCi0JKiBjb25maWcvaTM4NnNjby5taDogTmV3IGZpbGU7IGNvcHkgb2YgaTM4NnYubWggdG8gY29ycmVzcG9uZCB0bwotCWJmZC9jb25maWd1cmUuaG9zdCBjaGFuZ2UuCi0KLU1vbiBBdWcgIDkgMTQ6MjU6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEhhbmRsZSAubGluZSBhbmQgLmRlYnVnKiBzZWN0aW9ucy4KLQotCSogbGRsZXgubDogVXNlIGJmZF9zY2FuX3ZtYSwgbm90IHN0cnRvdWwuCi0KLUZyaSBBdWcgIDYgMDg6NTc6MzkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGV4cC5jLCBsZGZpbGUuYywgbGRsYW5nLmMsIGxleHN1cC5jLCBsZG1haW4uYywgbGRlbXVsLmM6Ci0JUmVtb3ZlIGluaXRhbCBjYXBzIGluIHNvbWUgZXJyb3IgbWVzc2FnZXMsIGNoYW5nZSAiY2FuJ3QiIHRvCi0JImNhbm5vdCIsIGFkZCBtaXNzaW5nIGNvbG9ucy4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBQcmludCAiJSUiIGFzIGEgc2luZ2xlICUuCi0JRm9yICclJyBmb2xsb3dlZCBieSB1bnJlY29nbml6ZWQgY2hhcmFjdGVyLCBwcmludCB0aGVtIGJvdGgKLQl2ZXJiYXRpbSBpbnN0ZWFkIG9mIGV4cGVjdGluZyBhIGNoYXIgKiBhcmcuCi0JRm9yICclQycsIGRvbid0IHB1dCB0aGUgZnVuY3Rpb24gbmFtZSBpbiBwYXJlbnMuCi0KLQkqIGxkZXhwLmMgKGludmFsaWQpOiBQYXNzICIlJSIsIG5vdCAiJSAiLgotCi1GcmkgQXVnICA2IDE0OjMxOjIyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvbWlwcy5zYzogQWx3YXlzIGRlZmluZSBfZnRleHQsIF9mZGF0YSwgX2Zic3MuCi0JKEJTU19WQVIpOiBSZW1vdmVkOyBub3cgYWx3YXlzIGRlZmluZSBfZmJzcy4KLQkqIGVtdWxwYXJhbXMvbWlwc2lkdC5zaCwgZW11bHBhcmFtcy9taXBzaWR0bC5zaCAoQlNTX1ZBUik6Ci0JUmVtb3ZlZC4KLQotVGh1IEF1ZyAgNSAxNTo1NToxOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogejhrLWNvZmYgaXMgdGhlIHNhbWUgYXMgejhrLXNpbQotCi1XZWQgQXVnICA0IDIxOjAwOjE4IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIHRlc3RzdWl0ZS9saWIvbGQuZXhwOiBuZXcgZmlsZQotCSogdGVzdHN1aXRlL2NvbmZpZy91bml4LWxkLmV4cDogbmV3IGZpbGUKLQkqIHRlc3RzdWl0ZS9sZC5ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogbmV3IGZpbGUKLQkqIE1ha2VmaWxlLmluOiBhZGQgZGVqYWdudSBzdXBwb3J0IGZvciBtYWtlIGNoZWNrCi0KLVdlZCBBdWcgIDQgMTc6NTI6MzIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sIChjb21tZW50KTogQWRkIG1pc3NpbmcgbmV3bGluZSBpbiBtZXNzYWdlLgotCSogbGRpbmRyLmMgKGFkZF9pbmRpcmVjdCk6IERpdHRvLgotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IERpdHRvLgotCi1UdWUgQXVnICAzIDEwOjU3OjQxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnksIGxkbGV4LmwsIG1yaS5jLCBsZHdyaXRlLmM6IENoYW5nZSBtdWx0aXBsZSBjb21tb25zCi0JaW50byBleHRlcm5zLgotCi0JKiBsZG1pc2MuYyAobXVsdGlwbGVfd2Fybik6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbWlzYy5oOiBEZWNsYXJlIGl0LgotCSogbGRtYWluLmMgKGVudGVyX2dsb2JhbF9yZWYpOiBDYWxsIGl0LgotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBBZGQgd2Fybl9jb21tb24uCi0JKiBsZGxleC5sLCBsZGdyYW0ueTogU2V0IGl0IHdpdGggLXdhcm4tY29tbW9uIG9wdGlvbi4KLQkqIGxkdmVyLmMgKGhlbHApOiBEb2N1bWVudCBpdC4KLQotTW9uIEF1ZyAgMiAxMjowNDozNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIGhvb2tzIGZvciAuc2RhdGEsIC5zYnNzLCBhbmQKLQl0YXJnZXQtc3BlY2lmaWMgc2VjdGlvbnMsIGFuZCBmb3IgY2hhbmdpbmcgZGF0YSBzZWN0aW9uIHZtYS4KLQotTW9uIEp1bCAyNiAxNDowMDowMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnkgKE9QVElPTl9ReSwgT1BUSU9OX1ksIE9QVElPTl9kbiwgT1BUSU9OX1lQKTogTmV3Ci0JdGVybWluYWxzLCBmb3IgU29sYXJpcy4KLQkoZGlybGlzdF9wdHIpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjb21tYW5kX2xpbmVfb3B0aW9uKTogQWNjZXB0IG5ldyBvcHRpb25zLgotCi0JKiBsZGxleC5sOiBBY2NlcHQgY29tbWFuZC1saW5lIG9wdGlvbnMgIi1ReSIsICItZG4iLCAiLVkiLCBhbmQKLQkiLVlQLC4uLiIuCi0KLQkqIGNvbmZpZy9zdW40c29sMi5tdDogUGFzcyBlbXVsYXRpb24gbmFtZSB3aXRob3V0ICIuc2giLgotCi0JKiBlbXVscGFyYW1zL2VsZjMyX3NwYXJjLmM6IFJlbmFtZWQgZnJvbSBlbGYzMi1zcGFyYy5jLgotCSogY29uZmlnL3N1bjRzb2wyLm10IChlbV9lbGYzMl9zcGFyYy5jKTogQWRqdXN0ZWQgYWNjb3JkaW5nbHkuCi0KLUZyaSBKdWwgMjMgMTM6NTE6MDkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBzdXBwb3J0IGZvciAuaW5pdCwgLmZpbmksIC5jdG9ycywKLQkuZHRvcnMsIC5kYXRhMSwgLnJvZGF0YTEgc2VjdGlvbnMsIGluc3RlYWQgb2YgY29tYmluaW5nIHRoZW0gaW50bwotCW90aGVyIHNlY3Rpb25zLiAgRm9yIGAtcicsIHNldCBhbGwgc2VjdGlvbiBzdGFydCBhZGRyZXNzZXMgdG8KLQl6ZXJvLgotCi0JKiBlbXVscGFyYW1zL2VsZjMyLXNwYXJjLnNoIChURVhUX1NUQVJUX0FERFIsCi0JTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogVmFsdWUgc2hvdWxkIGJlIDB4MTAxMDAuCi0JKE1BWFBBR0VTSVpFKTogUmVuYW1lZCBmcm9tIFBBR0VfU0laRS4KLQotV2VkIEp1bCAyMSAxNDoyODo0MiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGdlbnNjcmlwdHMuc2g6IElmIHRoaXMgaXMgdGhlIGRlZmF1bHQgZW11bGF0aW9uLCBzZXQKLQlDT01QSUxFX0lOLgotCSogZW11bHRlbXBsLyouZW06IFVzZSBpdCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBjb21waWxlIGluIHRoZQotCXNjcmlwdHMuCi0KLQkqIE1ha2VmaWxlLmluIChHRU5TQ1JJUFRTKTogUGFzcyB0aGUgZGVmYXVsdCBlbXVsYXRpb24gbmFtZSB0bwotCWdlbnNjcmlwdHMuc2guICBQYXNzIHRoZSBjdXJyZW50IGVtdWxhdGlvbiBuYW1lIHdpdGhvdXQgIi5zaCIgb24KLQl0aGUgZW5kLgotCSogZ2Vuc2NyaXB0cy5zaDogVGFrZSBhbiBkZWZhdWx0IGVtdWxhdGlvbiBhcmcuCi0JVXNlIHRoZSBjdXJyZW50IGVtdWxhdGlvbiBuYW1lIGFzIEVNVUxBVElPTl9OQU1FLgotCU1ha2UgZGVmYXVsdCBsaWIgcGF0aCBmb3IgY3Jvc3MtY29tcGlsaW5nICc6Jywgbm90IG51bGwuCi0JKiBlbXVscGFyYW1zLyouc2g6IERvbid0IHNldCBFTVVMQVRJT05fTkFNRS4KLQkqIGxkZW11bC5jIChsZGVtdWxfZ2V0X3NjcmlwdCk6IFRha2UgaXNmaWxlIGFyZy4KLQlQYXNzIGl0IHRvIGVtdWxhdGlvbidzIGdldF9zY3JpcHQgZnVuY3Rpb24uCi0JKiBsZGVtdWwuaDogQWRqdXN0IGdldF9zY3JpcHQgcHJvdG90eXBlcy4KLQkqIGxkZmlsZS5jIChsZGZpbGVfZmluZF9jb21tYW5kX2ZpbGUpOiBSZW5hbWVkIGZyb20gZmluZF9hX25hbWUuCi0JTm8gbG9uZ2VyIHN0YXRpYy4KLQkqIGxkZmlsZS5oOiBEZWNsYXJlIGl0LgotCSogbGRncmFtLnk6IEFjY2VwdCBhIHNjcmlwdCBvbiB0aGUgY29tbWFuZCBsaW5lIGFnYWluLAotCWZvciBwYXJzaW5nIGNvbXBpbGVkLWluIHNjcmlwdHMuCi0JKiBsZG1haW4uYyAobWFpbik6IElmIGxkIHNjcmlwdCBpcyBhIGZpbGUsIHBhcnNlIGl0IGFzIGEgLVQKLQlvcHRpb24sIG90aGVyd2lzZSBwYXJzZSBpdCBkaXJlY3RseS4KLQkqIGVtdWx0ZW1wbC8qLmVtICgqZ2V0X3NjcmlwdCk6IFJldHVybiB0aGUgc2NyaXB0cyB0aGVtc2VsdmVzIGlmCi0JdGhpcyBpcyB0aGUgZGVmYXVsdCBlbXVsYXRpb247IG90aGVyd2lzZSByZXR1cm4gdGhlaXIgZmlsZSBuYW1lcy4KLQkqIGVtdWx0ZW1wbC9tODhrYmNzLmVtOiBOZXcgZmlsZSwgdG8gdGFrZSBtODhrYmNzICNpZmRlZiBvdXQgb2YKLQlnZW5lcmljLmVtLgotCSogZW11bHBhcmFtcy9tODhrYmNzLnNoOiBVc2UgaXQuCi0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlOjp1bml4X3JlbG9jYXRlKTogUmVtb3ZlIHVudXNlZCBlbGVtZW50LgotCi1UdWUgSnVsIDIwIDEyOjAxOjQ5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogRGVsZXRlIGVtX2kzODZsaW51eC5vIChmb3Igd2hpY2gKLQl0aGVyZSdzIG5vIGNoYW5nZSBsb2cgZW50cnkgeWV0LCB0c2sgdHNrKSBmcm9tIHRoZSBsaXN0IG9mCi0JZW11bGF0aW9ucyBjb21waWxlZCBpbiB1bnRpbCBNYXJrIGdldHMgYXJvdW5kIHRvIGNoZWNraW5nIGluCi0JZW11bHBhcmFtcy9pMzg2bGludXguc2guCi0JKGxkZW11bC1saXN0LmgpOiBEZXBlbmQgb24gTWFrZWZpbGUsIHNvIGlmIEVNVUxBVElPTl9PRklMRVMgaXMKLQljaGFuZ2VkLCB0aGlzIGZpbGUgZ2V0cyB1cGRhdGVkLgotCi1GcmkgSnVsIDE2IDE0OjE0OjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnkgKE9QVElPTl9MZmlsZSk6IE5ldyB0b2tlbi4KLQkoY29tbWFuZF9saW5lX29wdGlvbik6IEFjY2VwdCBPUFRJT05fTCBOQU1FICh3aGl0ZXNwYWNlIGFmdGVyIC1MKS4KLQkqIGxkbGV4LmwgKDxDT01NQU5EPik6IEFjY2VwdCAtTCB3aXRob3V0IEZJTEVOQU1FLgotCi1GcmkgSnVsIDE2IDEzOjQ0OjI2IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogaDgvMzAwaCBzdXBwb3J0IG5lZWRzIG93biAubXQgZmlsZS4KLQljb25maWcvY29mZi1oODMwMGgubXQ6IE5ldyBmaWxlLgotCi1UaHUgSnVsIDE1IDEyOjQ0OjM1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmM6IERvbid0IGluY2x1ZGUgc3lzL3N0YXQuaDsgaXQgYWxyZWFkeSBnb3QgaW5jbHVkZWQKLQlzb21ld2hlcmUgYWxvbmcgdGhlIHdheS4KLQotVGh1IEp1bCAxNSAxNDo0MzozNCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGg4MzAwaCBzdXBwb3J0LgotCWVtdWxwYXJhbXMvaDgzMDBoLnNoOiBOZXcgZmlsZS4KLQlzY3JpcHR0ZW1wbC9oODMwMGguc2M6IE5ldyBmaWxlLgotCi1UaHUgSnVsIDE1IDEyOjQ0OjM1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2ZpbGUpOiBJbiBlcnJvciBtZXNzYWdlLCB1c2UgdGhlIG5hbWUgdGhlCi0JdXNlciBnYXZlIChlLmcuLCAiLWxjIiksIHJhdGhlciB0aGFuIHRoZSBiYXNlIGZpbGUgbmFtZS4KLQotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IERvbid0IGFzc2lnbiBhbiBpbnQgdG8gYW4gZW51bS4KLQotCSogbGRtYWluLltjaF06IFJlbW92ZSBpbml0aWFsIFFfIGZyb20gZnVuY3Rpb24gbmFtZXMuCi0JKiBsZGV4cC5jLCBsZGluZHIuYywgbGRsYW5nLmM6IENoYW5nZSBjYWxsZXJzLgotCi0JKiBsZGZpbGUuYywgbGRtYWluLmMsIGxkZ3JhbS55OiBSZW5hbWUgb3B0aW9uX3YgdG8gdHJhY2VfZmlsZV90cmllcy4KLQotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IE1vdmUgbG9hZGluZyBvZiBkZWZhdWx0IHNjcmlwdCBmcm9tCi0JaGVyZSB0byBtYWluLiAgQWRkIGEgIi8iIHRvIHN0YXJ0IG9mIHNjcmlwdCBuYW1lIHRvIHByZXZlbnQKLQlmaW5kaW5nIGl0IGluICIuIiBmaXJzdC4KLQotCSogbGRtYWluLmMgKHNldF9zY3JpcHRzX2Rpcik6IERvbid0IGxvb2sgaW4gIi4iIGZpcnN0LgotCi0JKiBsZGdyYW0ueSwgbGRsYW5nLmMsIGxkc3ltLmM6IFJlbW92ZSB0cmFjZXMgb2YgdW51c2VkIHZhcgotCW9wdGlvbl9sb25nbWFwLgotCi1UaHUgSnVsIDE1IDEwOjU1OjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVtX204OGtiY3MuYyk6IENvcnJlY3QgZGVwZW5kZW5jeS4KLQkqIHNjcmlwdHRlbXBsL204OGtiY3Muc2M6IEl0J3MgQVJDSCwgbm90IGFyY2guICBSZW1vdmVkIFRBUkdFVAotCXN0YXRlbWVudC4gIENoYW5nZWQgT1VUUFVUX0ZPUk1BVCB0byB1c2UgJHtPVVRQVVRfRk9STUFUfS4KLQkqIGVtdWxwYXJhbXMvbTg4a2Jjcy5zaDogSXQncyBjb2ZmLW04OGtiY3MsIG5vdCBtODhrYmNzLgotCi1XZWQgSnVsIDE0IDIxOjQyOjUzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRmaWxlLmMgKGxkbGFuZ19vcGVuX2ZpbGUsIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSksCi0JbWFpbi5jIChtYWluKTogUHJpbnQgdGhlIGVycm5vIHN0cmluZyBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQotVHVlIEp1bCAxMyAyMDowMDozMCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCBoODMwMGggZm9yIHRhcmdldCBjcHUuCi0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBIYXZlIGRlbWFuZ2xlIHJlbW92ZSBsZWFkaW5nIHVuZGVyc2NvcmUgaWYKLQlwcmVzZW50IChkZW1hbmdsZSBpcyBzbWFydCBlbm91Z2ggdG8ga25vdyB3aGV0aGVyIHRvIGRvIGl0IG9yIG5vdCkuCi0KLU1vbiBKdWwgMTIgMTE6NDU6NDggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoc2V0X3NjcmlwdHNfZGlyKTogQ2hlY2sgLiBhbmQgPGxkIGJpbiBkaXI+Ly4uL2xpYiBmb3IKLQlsZHNjcmlwdHMsIGFzIHdlbGwgYXMgPGxkIGJpbiBkaXI+IGFuZCBTQ1JJUFRESVIuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBVc2Ugc2l6ZW9mIGluc3RlYWQgb2YgbWFnaWMgY29uc3RhbnQuCi0KLQkqIGxkbWFpbi5jIChnZXRfZW11bGF0aW9uLCBjaGVja19mb3Jfc2NyaXB0c19kaXIsCi0Jc2V0X3NjcmlwdHNfZGlyKTogIE5ldyBmdW5jdGlvbnMuCi0JKG1haW4pOiBDYWxsIHRoZW0uCi0KLU1vbiBKdWwgMTIgMTA6NTc6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogSW5jbHVkZSAuaW5pdCwgLmZpbmksIC5yb2RhdGEgc2VjdGlvbnMuCi0JQ3JlYXRlIHN5bWJvbCAiZW5kIiBpbnN0ZWFkIG9mICJfX2VuZCIuICBDb21tZW50IG91dCBzb21lIHBhcnRzCi0JdGhhdCBtYXkgbm90IGJlIG5lZWRlZCAoeWV0KSBmb3IgZWxmLgotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCBzcGFyYy1lbGYgYW5kIHNwYXJjLXNvbGFyaXMyIGNvbmZpZ3MuCi0KLVRodSBKdWwgIDggMTU6MzM6MzIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBJbmNsdWRlICQoT1RIRVJfRU1VTEFUSU9OUykuCi0KLQkqIGxkbWlzYy5oIChlaW5mbywgbWluZm8sIGluZm8pOiBEb24ndCBib3RoZXIgd2l0aCBQQVJBTVMgbWFjcm8KLQl3aGVuIG5vIHByb3RvdHlwZSBpcyBiZWluZyBzdXBwbGllZC4KLQkobGRtYWxsb2MsIGxkcmVhbGxvYyk6IFNpemUgYXJndW1lbnQgaXMgbm93IHNpemVfdC4KLQotCSogbGRtaXNjLmMgKGZpbmZvKTogTmV3IGZ1bmN0aW9uLCBhY2NlcHRzIEZJTEUqIGFyZ3VtZW50LgotCSh2ZmluZm8sIGNhc2UgJ3YnKTogTmV3IGZvcm1hdCBjaGFyYWN0ZXI7IGRpc3BsYXlzIGJmZF92bWEgaW4gaGV4Ci0Jd2l0aG91dCBsZWFkaW5nIHplcm9zLgotCSh2ZmluZm8sIGNhc2VzICdSJyBhbmQgJ0MnKTogVXNlIGZpbmZvKCV2KSB3aGVuIGRpc3BsYXlpbmcgYQotCWJmZF92bWEgdmFsdWUsIGluc3RlYWQgb2YgZnByaW50ZigleCkgd2hpY2ggd29uJ3QgaG9sZCBhIGxvbmcgbG9uZwotCXZhbHVlLgotCShjb25jYXQsIGJ1eXN0cmluZyk6IFN0cmluZyBsZW5ndGhzIGFyZSBzaXplX3QuCi0JKGxkbWFsbG9jLCBsZHJlYWxsb2MsIHhyZWFsbG9jKTogU2l6ZSBhcmd1bWVudCBpcyBub3cgc2l6ZV90LgotCi0JKiBsZGxhbmcuYyAobmV3X3N0YXRlbWVudCk6IFNpemUgYXJndW1lbnQgaXMgbm93IHNpemVfdC4gIEFkZGVkCi0JZm9yd2FyZCBkZWNsYXJhdGlvbiB3aXRoIHByb3RvdHlwZS4KLQotVGh1IEp1bCAgOCAxMDo1Mzo0NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55IChPUFRJT05fdik6IERvbid0IHR1cm4gb24gdmVyYm9zZSBvdXRwdXQuCi0KLVdlZCBKdWwgIDcgMTc6MTA6NDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sOiBHZXQgcmlkIG9mIGxvY2FsIHR5cGVkZWYgZm9yIGJmZF92bWEhICBHZXQgaXQgZnJvbQotCWJmZC5oIGluc3RlYWQuCi0KLVdlZCBKdWwgIDcgMTE6MzM6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgYXMgJCh0b29sZGlyKS9iaW4vZ2xkOwotCWNvbGxlY3QyIGRvZXNuJ3QgbG9vayBmb3IgZ2xkIGFueSBtb3JlIGFueWhvdy4KLQotTW9uIEp1bCAgNSAxNDoyOTo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3JlbG9jYXRlX2dsb2JhbHMpOiBTa2lwIGluZGlyZWN0IHN5bWJvbHMsIHdoaWNoCi0Jbm93IGhhdmUgYSBub24gTlVMTCBzcmVmc19jaGFpbi4KLQotCSogY29uZmlnL2hwMzAwaHB1eC5tdDogVXNlIGVtdWxhdGlvbiBocDNocHV4IHJhdGhlciB0aGFuCi0JaHAzMDBocHV4LCBzaW5jZSB0aGUgbGF0dGVyIGRvZXMgbm90IGV4aXN0LgotCi1GcmkgSnVsICAyIDE4OjA2OjA1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZ2Vuc2NyaXB0cy5zaDogUHV0IHRoZSBzY3JpcHRzIGluIHRoZSBsZHNjcmlwdHMgZGlyZWN0b3J5LCBub3QKLQllbXVsYXRpb25zLgotCSogY29uZmlndXJlLmluIChsZHNjcmlwdHMpOiBNYWtlLCBpbnN0ZWFkIG9mIGVtdWxhdGlvbnMuCi0JKiBNYWtlZmlsZS5pbiAoc2NyaXB0ZGlyKTogVGFrZSBvZmYgdGhlICJsZCIgcGFydC4KLQkoaW5zdGFsbCwgY2xlYW4sIGRpc3RjbGVhbik6IFVzZSBsZHNjcmlwdHMsIG5vdCBlbXVsYXRpb25zLgotCUluIHRlc3RzLCBkb24ndCBwYXNzIC1MZW11bGF0aW9ucy4KLQlEb24ndCBwYXNzIHRvb2xkaXIvbGliIHRvIGdlbnNjcmlwdHMuc2guCi0JKiBnZW5zY3JpcHRzLnNoOiBEb24ndCB0YWtlIHRvb2xkaXIvbGliIGFyZy4KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBBZGQgImxkc2NyaXB0cy8iIHRvIHRoZSBuYW1lIG9mIHRoZQotCWRlZmF1bHQgc2NyaXB0IGZpbGUuCi0KLUZyaSBKdWwgIDIgMTc6MTM6MzUgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IEFkZCAudG9ycyBzZWN0aW9uIGZvciBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9ycy4KLQotVGh1IEp1bCAgMSAxNjozODo0NSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvY29mZi1oODMwMC5tdDogRU1VTD1oODMwMGhtcyAtPiBoODMwMC4KLQotV2VkIEp1biAzMCAxNTo0NTo1NSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICgueS5jKTogc2tpcCBkZWZhdWx0IC55LmMgcnVsZXMuIGdudSBtYWtlIGNhbiBub3cKLQkgIHJ1biBpbiBwYXJhbGxlbCB3aXRob3V0IGNvbGxpZGluZyBvbiB5YWNjJ3Mgc3RhdGljIGZpbGUgbmFtZXMuCi0JICBXaXRob3V0IHRoZSBzdHViIHJ1bGUsIG1ha2Ugd2lsbCB0cnkgdG8gc3RhcnQgdHdvIHlhY2MncwotCSAgY29uY3VycmVudGx5IHdoaWNoIGZhaWxzIGJlY2F1c2Ugb2YgeWFjYydzIHN0YXRpYyBmaWxlIG5hbWVzLgotCi1UdWUgSnVuIDI5IDEyOjIwOjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKHN1YmZpbGVfd2FudGVkX3ApOiBEb24ndCBkdW1wIGNvcmUgaWYgdGhlcmUgYXJlIG5vCi0Jc3ltYm9scy4KLQotTW9uIEp1biAyOCAxMjoyMjoxMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGdlbnNjcmlwdHMuc2ggKExJQl9QQVRIKTogT25seSBhZGQgL3Vzci9sb2NhbC9saWIgaWYgaXQncwotCWRpZmZlcmVudCBmcm9tIGxpYmRpci4KLQotCSogTWFrZWZpbGUuaW4gKHNjcmlwdGRpcik6IEJhc2Ugb24gdG9vbGRpciwgbm90IGRhdGFkaXIuCi0KLVNhdCBKdW4gMjYgMTI6MDM6NTcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZHZlci5jIChoZWxwKTogTmV3IGZ1bmN0aW9uLgotCSogbGR2ZXIuaDogRGVjbGFyZSBpdC4KLQkqIGxkbGV4LmwsIGxkZ3JhbS55OiBSZWNvZ25pemUgbmV3IG9wdGlvbnMgLS1oZWxwIGFuZCAtLXZlcnNpb24uCi0KLU1vbiBKdW4gMjEgMjA6Mzk6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6IERvbid0IG5lZWQgLi4vaW5jbHVkZSBhbnkgbW9yZS4KLQotTW9uIEp1biAyMSAxNjozODozNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4LmwsIGxkZ3JhbS55OiBTdXBwb3J0IG5ldyAtb2Zvcm1hdCBvcHRpb24uCi0JUmVtb3ZlIGF0dGVtcHQgYXQgc3VwcG9ydGluZyBzY3JpcHQgZnJhZ21lbnRzIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0JKiBsZGxhbmcuYyAobGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCk6IFRha2UgbmV3IGFyZywgRlJPTV9TQ1JJUFQuCi0JKiBtcmkuYyAobXJpX2Zvcm1hdCksIGxkZ3JhbS55OiBDaGFuZ2UgY2FsbGVycy4KLQkqIGxkbGFuZy5oOiBDaGFuZ2UgcHJvdG90eXBlLgotCi1UaHUgSnVuIDE3IDE2OjUzOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjYW5vbmljYWxpemUgaW5zdGFsbC5zaDsgZm9yIHVzZSB3aXRoaW4KLQl0aGlzIGRpcmVjdG9yeSAoYW5kIHN1YmRpcnMpCi0KLVRodSBKdW4gMTcgMTQ6MzM6MDkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueTogVHdlYWsgZ3JhbW1hciB0byBtYWtlIHJlcG9ydGluZyBvZiBpbnZhbGlkIG9wdGlvbnMgd29yay4KLQotCSogTWFrZWZpbGUuaW4gKC5jYy5vKTogUmVzdG9yZSAuU1VGRklYRVMgZW50cnkgZm9yIC5jYwotCWFuZCAuY2MubyBydWxlLgotCi1XZWQgSnVuIDE2IDExOjQ1OjMyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2NvbW1hbmQpOiBEb24ndCB0cnkgLmxkIGV4dGVuc2lvbi4KLQlJdCB3YXNuJ3QgZG9jdW1lbnRlZCAob3IgbGlrZWx5IHVzZWQpIGFuZCB3YXN0ZXMgdGltZS4KLQkodHJ5X29wZW4pOiBJZiBFWFRFTiBpcyBlbXB0eSwgZG9uJ3QgdHJ5IGl0LgotCi0JKiBsZGN0b3IuYywgbGRlcnJvci5jLCBsZGV4cC5jLCBsZGZpbGUuYywgbGRpbmRyLmMsIGxkbGFuZy5jLAotCWxkbGV4LmwsIGxkbWFpbi5jLCBsZG1pc2MuYywgbGRzeW0uYywgbGR2ZXIuYywgbGR3YXJuLmMsCi0JbGR3cml0ZS5jLCBsZXhzdXAuYywgbXJpLmMsIHJlbGF4LmM6IFJlcGxhY2UgREVGVU4gbWFjcm8gY2FsbHMKLQl3aXRoIG5vcm1hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0KLQkqIE1vdmUgKi5lbSB0byBlbXVsdGVtcGwvKi5lbS4gIE1vdmUgKi5zaCB0byBlbXVscGFyYW1zLyouc2guCi0JTW92ZSAqLnNjLXNoIHRvIHNjcmlwdHRlbXBsLyouc2MuCi0JKiB7ZW11bHRlbXBsLGVtdWxwYXJhbXMsc2NyaXB0dGVtcGx9L1JFQURNRTogTmV3IGZpbGVzLgotCSogc2guZW0sIHN0MjAwMC5lbSwgejhrc2ltLmVtLCBoODMwMGhtcy5lbSwgaDg1MDBobXMuZW06IEZpbGVzCi0JcmVtb3ZlZCwgcmVwbGFjZWQgd2l0aCBnZW5lcmljLmVtLgotCSogaDgzMDAuc2gsIGg4NTAwLnNoLCBoODMwMC5zYywgaDg1MDAuc2M6IFJlbmFtZWQgZnJvbQotCSBoOFszNV0wMGhtcy5zW2NoXS4gIENoYW5nZSB0aGVpciBjb250ZW50cyB0byBvbWl0IHRoZSAiaG1zIi4KLQotCSogKi5lbSAoKl9nZXRfc2NyaXB0KTogUmV0dXJuIHNjcmlwdCBuYW1lIGluc3RlYWQgb2Ygc2NyaXB0IGNvbnRlbnRzLgotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IENoYW5nZSBjYWxsZXIuCi0KLQkqIGxkbGV4LmwsIGxkZ3JhbS55OiBSZWNvZ25pemUgLW0gb3B0aW9uLgotCUNoZWNrIGZvciBpbnB1dCBmaWxlcyBhZnRlciAqYWxsKiBvcHRpb25zIGluIGdyYW1tYXIuCi0JKiBsZG1haW4uYyAobWFpbik6IENoZWNrIGZvciAtbSBvcHRpb25zLiAgQWRkIGRlZmF1bHQgZGlyZWN0b3J5Ci0JZm9yIC1tLgotCi0JKiBta3NjcmlwdC5jOiBGaWxlIHJlbW92ZWQuCi0JKiBnZW5zY3JpcHRzLnNoOiBUYWtlIHR3byBtb3JlIHBhcmFtZXRlcnMsIHRvb2xkaXJsaWIgYW5kIGxpYmRpciwKLQl0byBhZGQgdG8gdGhlIGRlZmF1bHQgTElCX1BBVEguCi0JTG9vayBmb3IgaW5wdXQgZmlsZXMgaW4gdGhlIG5ldyBzdWJkaXJlY3Rvcmllcy4KLQlDcmVhdGUgdGhlIHNjcmlwdHMgaW4gZW11bGF0aW9ucyBzdWJkaXJlY3RvcnkgYW5kIGRvbid0IGZpbHRlcgotCXRoZW0gdGhyb3VnaCBta3NjcmlwdC4KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSB0aGUgZW11bGF0aW9ucyBzdWJkaXJlY3RvcnkuCi0KLQkqIE1ha2VmaWxlLmluOiBBY2NvdW50IGZvciBhbGwgb2YgdGhlIGFib3ZlIGNoYW5nZXMuCi0JUmVtb3ZlIHVudXNlZCAuU1VGRklYRVMuICBHZXQgbGliZ2NjLmEgcGF0aCB3aXRoIGdjYwotCS1wcmludC1saWJnY2MtZmlsZS1uYW1lIGluc3RlYWQgb2YgJChsaWJkaXIpL2xpYmdjYy5hLgotCVB1dCBDRkxBR1MgbGFzdCBpbiB0aGUgY29tcGlsYXRpb24gcnVsZXMuCi0JQWRkIC1JLi4vYmZkIHRvIElOQ0xVREVTIHNvIHN5c2RlcC5oIGlzIGZvdW5kLgotCi1UdWUgSnVuIDE1IDIzOjA0OjQ2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogTG9vayBpbiAuLi9pbmNsdWRlLCBub3QgLi4vYmZkLgotCi0JKiBhb3V0LnNjLXNoOiBBZGQgU0hMSUJfUEFUSCBsaWtlIFNUQUNLWkVSTy4gIE1ha2UgU1RBQ0taRVJPCi0JZGVwZW5kZW50IG9uIFJFTE9DQVRJTkcsIG5vdCBSRUxPQ0FUSU9OLgotCSogaHAzaHB1eC5zaCAoU0hMSUJfUEFUSCk6IERlZmluZSBpdC4KLQotTW9uIEp1biAxNCAxOTowNjoxNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZmlsZS5jICh0cnlfb3Blbik6IElmIG9wZW5pbmcgd2l0aG91dCB0aGUgZXh0ZW5zaW9uIGZhaWxzLAotCXRyeSB3aXRoIHRoZSBleHRlbnNpb24gZXZlbiBpZiAtdiBvciAtViB3YXMgZ2l2ZW4uCi0JaGFkX3NjcmlwdCBpcyBpbXBvcnRlZCAoZnJvbSBsZGdyYW0ueSksIG5vdCBleHBvcnRlZC4KLQotTW9uIEp1biAxNCAxNjoyNjoxMCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQsIHVzZSBJTlNUQUxMX1hGT1JNCi0KLVRodSBKdW4gMTAgMTQ6MDA6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogRG9uJ3QgbG9zZSB0aGUgb2xkIGZsYWcgYml0cy4KLQkqIGxkZ3JhbS55IChzdGF0ZW1lbnRfbGlzdF9vcHQpOiBOZXcgbm9udGVybWluYWwsIGVpdGhlciBlbXB0eSBvcgotCXN0YXRlbWVudF9saXN0LgotCShzZWN0aW9uKTogVXNlIHN0YXRlbWVudF9saXN0X29wdCwgbm90IHN0YXRlbWVudF9saXN0LgotCSogbTY4a2NvZmYuc2Mtc2g6IEdhdGhlciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFuZCBkZWZpbmUKLQlfX0NUT1JfTElTVF9fIGFuZCBfX0RUT1JfTElTVF9fIGFwcHJvcHJpYXRlbHkuCi0JKiBzYTI5MjAwLnNjLXNoOiBHYXRoZXIgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQgZGVmaW5lCi0JX19fQ1RPUl9MSVNUX18gYW5kIF9fX0RUT1JfTElTVF9fIGFwcHJvcHJpYXRlbHkuCi0KLU1vbiBKdW4gIDcgMTI6NTM6MjggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiAgQWRkIC1JLi4vYmZkIGZvciBzeXNkZXAuaCBhbmQgYmZkLmguCi0JKiBjb25maWd1cmUuaW46ICBObyBsb25nZXIgbmVlZCB0byBjb25maWd1cmUgdG8gZ2V0IHN5c2RlcC5oLgotCi1GcmkgSnVuICA0IDE2OjE4OjI0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBpbnN0YWxsOmFsbCBhbmQgaW5zdGFsbC1pbmZvOmluZm8KLQlkZXBlbmRlbmNpZXMgKHRoZXNlIGNhdXNlIHNvbWUgc3B1cmlvdXMgcmVidWlsZHMgYXQgJ21ha2UgaW5zdGFsbCcKLSAgICAgICAgdGltZSkKLQotRnJpIEp1biAgNCAwODo1MDoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1pZHQtZWNvZmZsKik6IE5ldyB0YXJnZXQ7IHVzZSBtaXBzLWlkdGwuCi0JKG1pcHMtaWR0LWVjb2ZmKik6IEFkZGVkIHRyYWlsaW5nICcqJy4KLQkqIGNvbmZpZy9taXBzLWlkdGwubXQ6IE5ldyBmaWxlOyB1c2UgRU1VTCBvZiBtaXBzaWR0bC4KLQkqIG1pcHNpZHRsLnNoOiBOZXcgZmlsZTsgbGlrZSBtaXBzaWR0LnNoLCBidXQgbGl0dGxlIGVuZGlhbi4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtX21pcHNpZHRsLm8uCi0KLQkqIGNvbmZpZy9zdW4zLm1oIChIT1NUSU5HX0xJQlMsIEhPU1RJTkdfRU1VKTogUmVtb3ZlZCBvYnNvbGV0ZSBhbmQKLQlpbmNvcnJlY3QgZGVmaW5pdGlvbnMuCi0KLVR1ZSBKdW4gIDEgMTQ6NTY6MTAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZHN5bS5jICh3cml0ZV9maWxlX2xvY2Fscyk6ICBXcml0ZSBCU0ZfQ09OU1RSVUNUT1IKLQlzeW1ib2xzLCB1bmxlc3Mgc3RyaXBwaW5nLgotCi1UdWUgTWF5IDI1IDE1OjM0OjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNvbmZpZ3VyZSBsb29rcyBmb3IgIyMjIywgc28gcmVtb3ZlIGxpbmVzIHdpdGggbWFueQotCScjJyBjaGFyYWN0ZXJzLgotCSogY29uZmlnL2lyaXg0Lm1oLCBjb25maWcvaTM4NnYubWg6IE5ldyBmaWxlczsgc2V0IEhPU1RJTkdfQ1JUMAotCWFuZCBIT1NUSU5HX0xJQlMgY29ycmVjdGx5IHNvIHRoYXQgYGBtYWtlIGNoZWNrJycgd2lsbCB3b3JrLgotCi1UaHUgTWF5IDIwIDEzOjU2OjE2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLnNjLXNoOiAgRGVmaW5lIF9ldGV4dCwgX2VkYXRhLCBhbmQgX2VuZCwgaW4gYWRkaXRpb24KLQl0byBldGV4dCwgZWRhdGEsIGFuZCBlbmQuICBOZWVkZWQgZm9yIElSSVggNC4wLjVGLgotCVBhdGNoIGZyb20gbXdwQGljb25peC5vei5hdSAoTWljaGFlbCBQYWRkb24pLgotCi0JKiBWZXJzaW9uIDIuMi4xIHJlbGVhc2VkLgotCi1UaHUgTWF5IDIwIDExOjQyOjA2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWlwc2JzZC5zYy1zaDogUmVuYW1lZCBmcm9tIGFvdXQtbWlwc2JzZC5zYy1zaC4KLQkqIG1pcHNic2Quc2ggKEVNVUxBVElPTl9OQU1FKTogVXNlIG5ldyBmaWxlIG5hbWUuCi0KLVR1ZSBNYXkgMTggMTc6MTA6MjQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTERESVNUU1RVRkYpOiBSZW1vdmUgbGQubW0gc2luY2Ugd2UgY2FuJ3QgYnVpbGQgaXQKLQlwcm9wZXJseSByaWdodCBub3cuCi0KLQkqIFZlcnNpb24gMi4yIHJlbGVhc2VkLgotCi1Nb24gTWF5IDE3IDE1OjM3OjI4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBCdW1wIHZlcnNpb24gbnVtYmVyIHRvIDIuMi4KLQotTW9uIE1heSAxNyAxMjo0NDozMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTkVXUzogIE5ldyBmaWxlLgotCi1GcmkgTWF5IDE0IDExOjI2OjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5zYy1zaDogRG9uJ3QgZGVmaW5lIEJTU19WQVIgdW5sZXNzIHJlbG9jYXRpbmcuCi0KLVdlZCBNYXkgMTIgMTM6MzM6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWtzY3JpcHQubywgbWtzY3JpcHQpOiBCdWlsZCBta3NjcmlwdCB2aWEKLQlta3NjcmlwdC5vLCByYXRoZXIgdGhhbiBkaXJlY3RseSBmcm9tIG1rc2NyaXB0LmMuCi0KLVR1ZSBNYXkgIDQgMjE6NTg6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IExvb2sgZm9yICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IHJlbGF0aXZlIHRvCi0JJHtzcmNkaXJ9LCBub3QgcmVsYXRpdmUgdG8gYnVpbGQgZGlyZWN0b3J5LgotCi0JKiBocHBhb3NmLmVtLCBocHBhb3NmLnNjLXNoLCBocHBhb3NmLnNoOiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBocHBhKi1ocC1vc2YuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBJbmNsdWRlIGhwcGFvc2YgZW11bGF0aW9uLgotCShlbV9ocHBhb3NmLmMpOiBCdWlsZCBpdC4KLQkqIGNvbmZpZy9ocHBhb3NmLm1oLCBocHBhb3NmLm10OiBOZXcgZmlsZXMuCi0KLQkqIGxkLmggKEFMSUdOX04pOiBSZW5hbWVkIGZyb20gQUxJR04sIGJlY2F1c2UgdGhhdCBjb25mbGljdGVkIHdpdGgKLQlzb21lIHN5c3RlbSBoZWFkZXIgZmlsZXMuICBBbGwgdXNlcyBjaGFuZ2VkLgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBpMzg2LWFpeCBjb25maWd1cmF0aW9ucyBhcyBpMzg2LWNvZmYKLQl0YXJnZXRzLgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBtNjgqLSotaHB1eC4KLQkqIGFvdXQuc2Mtc2g6IElmIFNUQUNLWkVSTyBhbmQgUkVMT0NBVElORyBhcmUgYm90aCBkZWZpbmVkLCBvdXRwdXQKLQl0aGUgdmFsdWUgb2YgU1RBQ0taRVJPLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogSW5jbHVkZSBocDMwMC1ocHV4IGVtdWxhdGlvbi4KLQkoZW1faHAzaHB1eC5jKTogQnVpbGQgaXQuCi0JKiBocDNocHV4LnNoLCBjb25maWcvaHAzMDBocHV4Lm10OiBOZXcgZmlsZXMuCi0KLVR1ZSBNYXkgIDQgMTI6Mzc6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLnNjLXNoOiBQdXQgY29uc3RydWN0b3JzIGluIHRoZSAuZGF0YSBzZWN0aW9uLgotCSogTWFrZWZpbGUuaW4gKGNkdGVzdCk6IEFkZGVkIGRlcGVuZGVuY3kgb24gbGQubmV3LgotCi1Nb24gTWF5ICAzIDE5OjQzOjM5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIENoYW5nZSBkZWZpbml0aW9uIG9mICQodG9vbGRpcikgdG8gbWF0Y2ggRlNGLgotCSogdmF4LnNoLCBjb25maWcvdmF4Lm10LCBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOgotCVN1cHBvcnQgVkFYIFVsdHJpeCBhbmQgQlNELgotCi1Nb24gQXByIDI2IDE4OjM1OjQ3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzaC5lbSwgc2guc2gsIHNoLnNjLXNoOiBOZXcgZmlsZXMgc3VwcG9ydGluZyBIaXRhY2hpIFNILgotCi1XZWQgQXByIDE0IDIxOjAxOjUxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuaCAoc3RydWN0IG1lbW9yeV9yZWdpb24pOiAgQ2hhbmdlIGBsZW5ndGgnIGFuZAotCWBvbGRfbGVuZ3RoJyBmaWVsZHMgdG8gYmZkX3NpemVfdHlwZS4gIEVsaW1pbmF0ZSB1c2Ugb2YgYmZkX29mZnNldC4KLQkqIGxkbGFuZy5jLCBtcmkuYzogIENvcnJlc3BvbmRpbmcgY2hhbmdlcywgcGx1cyBsaW50LgotCi1UaHUgQXByICA4IDIyOjA4OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBGb3IgYWxsIGkzODYgdGFyZ2V0cywgYWNjZXB0IGk0ODYgYXMgd2VsbC4KLQotTW9uIEFwciAgNSAxNzozMzozOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBQcmVzZXJ2ZSBhbGwgZmxhZ3MgZm9yIGEKLQlTRUNfU0hBUkVEX0xJQlJBUlkgc2VjdGlvbi4KLQkoc2l6ZV9pbnB1dF9zZWN0aW9uKTogQ29uc2lkZXIgYW55IFNFQ19IQVNfQ09OVEVOVFMgc2VjdGlvbiB3aGVuCi0JY29tcHV0aW5nIGxhcmdlc3Rfc2VjdGlvbi4KLQotRnJpIEFwciAgMiAxNDozMzo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXApOiBJbml0aWFsaXplIGFsbAotCWZpZWxkcyBvZiBuZXdseSBjcmVhdGVkIHN0cnVjdHVyZS4KLQotV2VkIE1hciAzMSAxODoxOToxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChnX3N3aXRjaF92YWx1ZSk6IE5ldyB2YXJpYWJsZS4KLQkqIGxkZ3JhbS55IChPUFRJT05fRywgT1BUSU9OX0d2YWwpOiBOZXcgdG9rZW5zLgotCShjb21tYW5kX2xpbmVfb3B0aW9uKTogQWNjZXB0IC1HIGFuZCBzZXQgZ19zd2l0Y2hfdmFsdWUuCi0JKiBsZGxleC5sIChDT01NQU5EKTogQWNjZXB0IC1HLgotCSogbGRsYW5nLmMgKG9wZW5fb3V0cHV0KTogQ2FsbCBiZmRfc2V0X2dwX3NpemUgb24gbmV3IEJGRC4KLQotVHVlIE1hciAzMCAwOTo0MDoyNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCVN1cHBvcnQgZm9yIGxpbmtpbmcgYW5kIGxvYWRpbmcgYXQgZGlmZmVyZW50IHBsYWNlczoKLQotCSogbGRsZXgubDogQWRkICJBVCIga2V5d29yZC4KLQkqIGxkZ3JhbS55OiBDbGVhbnVwLCBhbmQgcGFyc2UgQVQuCi0JKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogUHJpbnQgb3V0cHV0IGFkZHJlc3MKLQlvZiBzZWN0aW9uIGluIG1hcC4gKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IEZpbGwgc2VjdGlvbnMnIGxtYSB3aXRoCi0JbG9hZCBhZGRyZXNzLgotCSogbGRsYW5nLmggKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUpOiBBZGQgbG9hZF9iYXNlCi0JaW5mb3JtYXRpb24uCi0KLQkqIGxkaW5kci5jIChhZGRfaW5kaXJlY3QpOiBLZWVwIG1vcmUgaW5mb3JtYXRpb24gaW4gdGhlIGFsaWFzCi0Jc3ltYm9sIGNoYWluLgotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6ICBEb24ndCBpbmhlcml0IE5FVkVSX0xPQUQgc2VjdGlvbgotCWF0dHJpYnV0ZSBmcm9tIGFuIGlucHV0IHNlY3Rpb24uCi0JKiBsZG1haW4uYyAoUV9lbnRlcl9maWxlX3N5bWJvbHMpOiBDb21tb24gc2VjdGlvbiBpcyBORVZFUl9MT0FEIGJ5Ci0JZGVmYXVsdC4gKFFfZW50ZXJfZmlsZV9zeW1ib3MpOiBJbmRpcmVjdCBzeW1ib2xzIG5vdyBhcmUga25vd24gYnkKLQl0aGVpciBzZWN0aW9uLCBub3QgYSBzcGVjaWFsIHN5bWJvbCBmbGFnLgotCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiBJbmRpcmVjdCBzeW1ib2xzIGFyZW4ndCBsb2NhbC4KLQkod3JpdGVfZmlsZV9nbG9iYWxzKTogV3JpdGUgdGhlIG1hcHBpbmcgZm9yIGFuIGluZGlyZWN0IHN5bWJvbC4KLQkqIHJlbGF4LmMgKGJ1aWxkX2l0KTogV2hlbiBmb3JjZWQgdG8gd3JpdGUgYSBORVZFUl9MT0FEIHNlY3Rpb24sCi0JZmlsbCBpdCB3aXRoIHplcm9zLgotCi1UdWUgTWFyIDIzIDEzOjI0OjEwIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGxkLnRleGluZm86ICBjaGFuZ2VzIGZvciBxMQotCi1UdWUgTWFyIDIzIDAwOjEzOjI5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBkdmkgdGFyZ2V0LCBkZWZpbmUgJiB1c2UgVEVYSTJEVkksIGFkZCBpbnN0YWxsY2hlY2sKLQotTW9uIE1hciAgOCAyMDozMDozNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW5hbWUgSE9TVF9DQyB0byBDQ19GT1JfQlVJTEQKLQotVGh1IE1hciAgNCAxMjo0NDozMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuc2Mtc2g6IEFkZGVkIHZhcmlhYmxlcyB3aGljaCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBhCi0Jc3BlY2lmaWMgZW11bGF0aW9uLgotCSogbWlwc2lkdC5zaDogTmV3IGZpbGU7IGVtdWxhdGlvbiBmb3IgSURUIE1JUFMgYm9hcmQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9taXBzaWR0Lm8uCi0JKGVtX21pcHNpZHQuYyk6IE5ldyB0YXJnZXQuICBVc2VzIG1pcHNpZHQuc2ggYW5kIG1pcHMuc2Mtc2guCi0JKiBjb25maWcvbWlwcy1pZHQubXQ6IE5ldyBmaWxlOyBzZXRzIEVNVUwgdG8gbWlwc2lkdC4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1pZHQtZWNvZmYpOiBOZXcgdGFyZ2V0OyB1c2VzIG1pcHMtaWR0LgotCi1TYXQgRmViIDI3IDAwOjAwOjE0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYW91dC1taXBzYnNkLnNjLXNoLCBtaXBzYnNkLnNoOiBOZXcgZmlsZXMgZnJvbSBSYWxwaCBDYW1wYmVsbCwKLQlyYWxwaGNAcHlyYW1pZC5jb20uCi0JKiBpMzg2YnNkLnNoLCBjb25maWcvaTM4NmJzZC5tdDogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogQWRkZWQgc3VwcG9ydCBmb3IgbWlwc2JzZCBhbmQgMzg2YnNkLgotCi1UaHUgRmViIDI1IDE1OjMzOjEwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbXJpLmM6ICBBZGQgZXh0ZXJuIGRlY2xhcmF0aW9uIG9mIHN0cmR1cC4KLQkqIGxkc3ltLmMgKEtFRVAgbWFjcm8pOiAgQWRkIHNwYWNlcyBhcm91bmQgJz0nIGZvciB0aGUKLQlzYWtlIG9mIG9sZCAoZS5nLiBQQ0MpIGNvbXBpbGVycy4KLQotV2VkIEZlYiAyNCAxOTo0OTozMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmM6ICBCdW1wIHRvIHZlcnNpb24gMi4xLgotCi1GcmkgRmViIDEyIDA4OjA5OjExIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueTogYWxsb3cgc2VjdGlvbiB0eXBlcyB3aXRob3V0IGFkZHJlc3MgIGV4cHJlc3Npb25zLgotCSogbGRsYW5nLmMgKGxhbmdfcmVsb2NhdGVfZ2xvYmFscyk6IGF2b2lkIHBvc3NpYmxlIGhhbmcgd2l0aAotCXVuZGVmaW5lZCBidXQgdW5yZWZlcmVuY2VkIHN5bWJvbHMuCi0JKiByZWxheC5jIChyZWxheF9zZWN0aW9uKTogZG9uJ3QgY29tcGxhaW4gaWYgdGhlIHNjcmlwdCBmaWxlIGlzbid0Ci0JcmVsYXhhYmxlIGJ1dCAtcmVsYXggaXMgc2V0Ci0KLVRodSBGZWIgMTggMTc6NTg6NDUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGdvMzIgaXMgdGhlIDNyZCBwYXJ0IG9mIHRoZSB0cmlwbGUsIG5vdCB0aGUgMm5kCi0KLVdlZCBGZWIgIDMgMDk6MDU6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzYmlnLnNoOiBOZXcgZmlsZS4gIEJpZyBlbmRpYW4gTUlQUyBlbXVsYXRpb24uCi0JKiBjb25maWcvbWlwcy1iaWcubXQ6IE5ldyBmaWxlLiAgVXNlIG1pcHNiaWcgZW11bGF0aW9uLgotCSogY29uZmlndXJlLmluIChtaXBzLXNnaS1pcml4Kik6IFVzZSB0YXJnZXQgbWlwcy1iaWcuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9taXBzYmlnLm8uCi0JKGVtX21pcHNiaWcuYyk6IE5ldyB0YXJnZXQuICBVc2VzIG1pcHNiaWcuc2guCi0KLVR1ZSBGZWIgIDIgMTE6MzI6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLnNjLXNoOiBQdXQgLnNjb21tb24gc2VjdGlvbnMgaW50byAuc2JzcyBzZWN0aW9uLgotCi0JKiBsZG1haW4uYyAoc3ViZmlsZV93YW50ZWRfcCk6IFByZXNlcnZlIHNlY3Rpb24gb2YgY29tbW9uIHN5bWJvbHMsCi0JcmF0aGVyIHRoYW4gYWx3YXlzIHB1dHRpbmcgdGhlbSBpbiBiZmRfY29tX3NlY3Rpb24uCi0JKiBsZGxhbmcuYyAobGFuZ19jb21tb24pOiBJZiBhIGNvbW1vbiBzeW1ib2wgaXMgbm90IGluCi0JYmZkX2NvbV9zZWN0aW9uLCBwdXQgaW4gYSBzZWN0aW9uIG9mIHRoZSBzYW1lIG5hbWUsIHJhdGhlciB0aGFuCi0JYWx3YXlzIHB1dHRpbmcgaXQgaW4gc2VjdGlvbiBDT01NT04uCi0KLUZyaSBKYW4gMjkgMDk6NTc6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoc3ViZmlsZV93YW50ZWRfcCk6IElmIHdlIGFscmVhZHkgaGF2ZSBhIGNvbW1vbgotCWRlZmluaXRpb24gb2YgYSBzeW1ib2wsIGRvbid0IG5lY2Vzc2FyaWx5IHB1bGwgaW4gYW4gb2JqZWN0IGZpbGUKLQl0aGF0IHByb3ZpZGVzIGEgbm9uLWNvbW1vbiBkZWZpbml0aW9uLgotCi0JKiBsZGxleC5sIChDT01NQU5EKTogQWNjZXB0IC1FQiBhbmQgLUVMIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsCi0JcmV0dXJuaW5nIE9QVElPTl9FQiBhbmQgT1BUSU9OX0VMLiAgZ2NjIHBhc3NlcyB0aGVzZSB0byBhIE1JUFMKLQlsaW5rZXIuCi0JKiBsZGdyYW0ueSAoT1BUSU9OX0VCLCBPUFRJT05fRUwpOiBOZXcgdG9rZW5zLgotCShjb21tYW5kX2xpbmVfb3B0aW9uKTogQWNjZXB0IGFuZCBpZ25vcmUgT1BUSU9OX0VCIGFuZCBPUFRJT05fRUwuCi0KLVRodSBKYW4gMjggMTU6MTI6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlbW92ZSAkKHRvb2xkaXIpL2Jpbi9nbGQgYmVmb3JlIGNyZWF0aW5nCi0JdGhlIGxpbmsgdG8gaXQuCi0KLVR1ZSBKYW4gMjYgMTE6NDk6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZG1haW4uYywgbGRzeW0uYzogVXNlIG5ldyBiZmRfaXNfY29tX3NlY3Rpb24gbWFjcm8gcmF0aGVyIHRoYW4KLQljaGVja2luZyBmb3IgZXF1YWxpdHkgdG8gYmZkX2NvbV9zZWN0aW9uLgotCi1GcmkgSmFuIDIyIDE0OjIyOjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5zYy1zaDogTmV3IGZpbGUuICBVbHRyaXgsIGFuZCBob3BlZnVsbHkgb3RoZXIgTUlQUyBFQ09GRgotCXRhcmdldHMsIGxpbmtlciBzY3JpcHQuCi0JKiBtaXBzbGl0LnNoOiBOZXcgZmlsZS4gIExpdHRsZSBlbmRpYW4gTUlQUyBlbXVsYXRpb24uCi0JKiBjb25maWcvbWlwcy1saXQubXQ6IE5ldyBmaWxlLiAgVXNlIG1pcHNsaXQgZW11bGF0aW9uLgotCSogY29uZmlndXJlLmluIChtaXBzLWRlYy11bHRyaXgqKTogVXNlIHRhcmdldCBtaXBzLWxpdC4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtX21pcHNsaXQuby4KLQkoZW1fbWlwc2xpdC5jKTogTmV3IHRhcmdldC4gIFVzZXMgbWlwc2xpdC5zaC4KLQotVGh1IEphbiAxNCAxNTozMDoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogSW5zdGFsbCBsZCBhcyBib3RoICQodG9vbGRpcikvYmluL2xkIGFuZAotCSQodG9vbGRpcikvYmluL2dsZCwgc28gdGhhdCBnY2MgY2FuIGZpbmQgaXQgd2l0aCBvciB3aXRob3V0Ci0JY29sbGVjdDIuCi0KLU1vbiBKYW4gMTEgMTg6NTA6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZHdyaXRlLmM6IFJlbW92ZWQgcGVyZm9ybV9yZWxvY2F0aW9uLCBjb3B5X2FuZF9yZWxvY2F0ZSwgYW5kCi0Jd3JpdGVfbm9yZWwuICBBbGwgbGlua2luZyBpcyBub3cgZG9uZSB2aWEgd3JpdGVfcmVsYXguICBDYWxsCi0JbGRzeW1fd3JpdGUgYmVmb3JlIGNhbGxpbmcgd3JpdGVfcmVsYXguCi0JKiByZWxheC5jOiBBZGRlZCBjb3B5cmlnaHQuCi0JKHdyaXRlX3JlbGF4KTogUmVuYW1lZCBmcm9tIHdyaXRlX3JlbGF4bm9yZWwuICBBZGRlZCByZWxvY2F0ZWFibGUKLQlhcmd1bWVudC4gIHNlY2xldF9kdW1wIHJlbmFtZWQgdG8gYmZkX3NlY2xldF9saW5rLgotCSogcmVsYXguaDogQWRkZWQgY29weXJpZ2h0LgotCi1Nb24gSmFuIDExIDE1OjQxOjU2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoZGVjb2RlX2xpYnJhcnlfc3ViZmlsZSk6IFBhdGNoIGZyb20KLQlob29nZW5Ac2hhZmVyLmNzLnV0YWguZWR1LCBkb24ndCByZXJlYWQgbGlicmFyeSBzeW1ib2wgdGFibGVzLgotCi1GcmkgSmFuICA4IDE4OjA0OjMzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3Z4d29ya3M5NjAubXQgcmVuYW1lZCB0byBjb25maWcvaTk2MC5tdAotCi0JKiBjb25maWd1cmUuaW46IHNwYXJjLWFvdXQgZW11bGF0ZXMgYSBzdW40LCBhcyBkb2VzCi0Jc3BhcmMqLXZ4d29ya3MsIGk5NjAtbmluZHkgdXNlcyBnbGQ5NjAgZW11bGF0aW9uCi0KLUZyaSBKYW4gIDggMTQ6Mzk6MDcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkgRml4IHN1cHBvcnQgZm9yIE5PTE9BRCwgYWRkIElOQ0xVREUKLQkqIGxkZmlsZS5jIChsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUpOiBwYXNzIGZpbGUgbmFtZSB0bwotCWxleF9wdXNoX2ZpbGUuCi0JKiBsZGxleC5sLCBsZGdyYW0ueTogdGlkeSB1cCwgcGFyc2UgSU5DTFVERSBhbmQgTk9MT0FECi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogbWFrZSBvdXRwdXQgc2VjdGlvbnMgaW5oZXJpdCBORVZFUl9MT0FECi0JYXR0cmlidXRlLgotCi1UaHUgSmFuICA3IDEwOjIyOjE5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy5oOiBubyBtb3JlIGRlZmF1bHQgZW11bGF0aW9uLiAgTWFrZSB0aGUgbGFjawotCW9mIGVtdWxhdGlvbiBhIGNvbXBpbGUgdGltZSBlcnJvcgotCi1XZWQgSmFuICA2IDAxOjA4OjM3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pc2UgYWxsIHNwYXJjbGl0ZSB2YXJpYW50cywgbm90IGp1c3QgJ3NwYXJjbGl0ZScKLQotTW9uIERlYyAyOCAxMToxNTozNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGtjb2ZmLnNjLXNoOiBkZWZpbmUgX2VuZCBhcyB3ZWxsIGFzIGVuZCwgZm9yIGNvbnNpc3RlbmN5IHdpdGgKLQlhb3V0LnNjLXNoLgotCi0JKiBjb25maWd1cmUuaW46IGFjY2VwdCAqLWVyaWNzc29uLW9zZSBmb3IgYW55IG02OGsgQ1BVLgotCi0JKiBsZHdyaXRlLmMgKHdyaXRlX3JlbCk6IGRvbid0IGFsd2F5cyBzZXQgU0VDX0hBU19DT05URU5UUyBmbGFnCi0JZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24uCi0KLU1vbiBEZWMgMjEgMTY6MDY6NTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGV4cC5jLCBsZGxhbmcuYywgbGRtYWluLmMsIGxkc3ltLmMsIGxkd2Fybi5jOiAgVXNlIG5ldwotCW1hY3JvIGJmZF9hc3ltYm9sX2JmZCBhcyBhcHByb3ByaWF0ZS4KLQkqIE1ha2VmaWxlLmluOiAgVW4tZHVwbGljYXRlIGxkbGV4LmMgZGVwZW5kZW5jeS4KLQkqIGNvbmRpZ3VyZS5pbjogIFJlcGxhY2UgbXlfaG9zdCBjYXNlIHRhYmxlIGJ5IHNvdXJjaW5nCi0JLi4vYmZkL2NvbmZpZ3VyZS5ob3N0LiAgQWxsb3cgc3RkLWhvc3QgYXMgdGhlIGRlZmF1bHQuCi0JKiBsZG1pc2MuYzogIENoYW5nZSBsb2dpYyBmb3IgQysrIG5hbWUgZGVtYW5nbGluZzogIFRoZXJlIGlzCi0Jbm8gaW5pdGlhbCAnXycgdG8gcmVtb3ZlIGZyb20gc3RhYi1kZXJpdmVkIGZ1bmN0aW9uIG5hbWVzLgotCi1TdW4gRGVjIDEzIDE2OjMxOjI2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19pbml0X3NjcmlwdF9maWxlKTogZG9uJ3QgYXR0YWNoIHRoZSBvdXRwdXQgZmlsZQotCXNlY3Rpb25zIHRvIHRoZSBzY3JpcHQgZmlsZS4KLQotV2VkIERlYyAgOSAwODozODowNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQkqIGxkbGFuZy5jICh3aWxkKTogcnVuIGV4cGFuc2lvbiBsb29wIG92ZXIgY29tbWFuZCBsaW5lIGJmZCB0b28uCi0JKGxhbmdfaW5pX3NjcmlwdF9maWxlKTogaW5pdGlhbGl6ZSBtb3JlIHBhcnRzIG9mIHRoZSBjb21tYW5kIGxpbmUKLQliZmQuCi0JKiBsZGxleC5sOiBmaXggREVGSU5FRCBzdGFydCBzdGF0ZXMuCi0KLU1vbiBEZWMgIDcgMDg6NDM6NDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0JIC15IHN1cHBvcnQKLQkqIGxkLnRleGluZm86IG5ldyBkb2MuCi0JKiBsZGdyYW0ueSwgbGRsZXgubDogdW5kZXJzdGFuZCAteTxzeW1ib2w+Ci0JKiBsZG1haW4uYyAoUV9lbnRlcl9maWxlX3N5bWJvbHMpOiBpZiBoYWQgLXksIGxvb2t1cCBzeW1ib2wgYW5kCi0JcHJpbnQgaW5mby4gKGFkZF95c3ltKTogbmV3IGZ1bmN0aW9uLgotCSogbGRzeW0uaDogKGxkc3ltX3R5cGUpOiBuZXcgZGVmaW5lIFNZTV9ZLgotCi1TYXQgTm92IDIxIDAzOjE1OjI3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBsZGN0b3IuaCwgbGRlcnJvci5oLCBsZGV4cC5oLCBsZGZpbGUuaCwgbGRpbmRyLmgsIGxkbGFuZy5jLAotCWxkbGFuZy5oLCBsZGxleC5oLCBsZG1haW4uaCwgbGRtaXNjLmgsIGxkc3ltLmgsIGxkdmVyLmgsIGxkd2Fybi5oLAotCWxkd3JpdGUuaCwgcmVsYXguaDogIFJlcGxhY2UgYWxsIHVzZXMgb2YgRVhGVU4gYW5kIFBST1RPIGFuc2ktZ2x1ZQotCW1hY3JvcyB3aXRoIFBBUkFNUy4gIFJlY3JlYXRpb25hbCBjbGVhbnVwLiAgVXBkYXRlIGNvcHlyaWdodHMuCi0KLVR1ZSBOb3YgMTAgMDA6MjM6MzcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcGFzcyBkb3duIHRoZSBiZmQgc291cmNlIGRpcmVjdG9yeSBmb3IgaW5jbHVkZXMKLQotVGh1IE5vdiAgNSAxNTo0MTo1NSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBkb24ndCBjaGFuZ2Ugc2l6ZSBhbmQgYWRkcmVzcyBmb3IKLQlTRUNfU0hBUkVEX0xJQlJBUlkgc2VjdGlvbnMgcmF0aGVyIHRoYW4gZm9yIFNFQ19ORVZFUl9MT0FECi0Jc2VjdGlvbnMuCi0KLVRodSBOb3YgIDUgMTE6MzM6NTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlbGF4LmMgKGJ1aWxkX2l0KTogcmUtZW5hYmxlIHRoZSBwcm9jZXNzaW5nIG9mIGRhdGFfc3RhdGVtZW50cwotCWluIHNjcmlwdHMsIG1ha2VzIGNvdW50ZWQgY29udHJ1Y3RvciBsaXN0cyB3b3JrIGFnYWluLgotCi1UaHUgTm92ICA1IDA1OjQzOjAxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBsZGVtdWwuaDogIFJlbW92ZSB1c2VzIG9mIFNERUYgYW5kIFBST1RPIG1hY3JvcyAodXNlIFBBUkFNUykuCi0KLVR1ZSBPY3QgMjAgMTA6NTY6MDYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtNjhrY29mZi5zYy1zaDogZG9uJ3QgdXNlIGluaXRpYWwgdW5kZXJzY29yZXMgZm9yIGV0ZXh0LCBlZGF0YQotCWFuZCBlbmQuCi0KLU1vbiBPY3QgMTkgMDk6NDU6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBTdXBwb3J0IGZvciBpMzg2LXN5c3YuCi0JY29uZmlndXJlLmluOiBjaGVjayBmb3IgaTM4Ni0qLXN5c3YqIGFuZCBpMzg2LSotc2NvKi4KLQlpMzg2Y29mZi5zYy1zaDogcmV3cm90ZSB0byBzdXBwb3J0IFNWUjMgYnkgZGVmYXVsdC4KLQlsZGN0b3IuYyAoZmluZF9jb25zdHJ1Y3RvcnMpOiBwcmVzZXJ2ZSBzdGF0X3B0ci4KLQlsZGxhbmcuYyAod2lsZF9kb2l0KTogaW5pdGlhbGl6ZSB2bWEgYW5kIHNpemUgb2YgbmV3IG91dHB1dAotCXNlY3Rpb24gdG8gY29ycmVzcG9uZGluZyBpbnB1dCBzZWN0aW9uLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IKLQlzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBkb24ndCBtb2RpZnkgdm1hIGFuZCBzaXplIG9mIHNlY3Rpb25zIHdoaWNoCi0JYXJlIG5ldmVyIGxvYWRlZCAoZm9yIHNoYXJlZCBsaWJyYXJpZXMpLgotCWxkd3JpdGUuYyAoY29weV9hbmRfcmVsb2NhdGUpOiBjb3B5IHRoZSBjb250ZW50cyBvZiBhbnkgc2VjdGlvbgotCXdoaWNoIGhhcyBjb250ZW50cywgbm90IGp1c3Qgc2VjdGlvbnMgd2hpY2ggYXJlIGxvYWRlZCAoZm9yIHNoYXJlZAotCWxpYnJhcmllcykuCi0KLVRodSBPY3QgMTUgMTU6MjA6MjYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChzaXplX2lucHV0X3NlY3Rpb24pOiBjb3VudCB0aGUgc2l6ZXMgb2YgYWxsIHNlY3Rpb25zCi0gICAgICAgIHdlIGFsbG9jYXRlLgotCi1UaHUgT2N0ICA4IDA5OjA1OjI1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1pc2MuYyAoZGVtYW5nbGUsdmZpbmZvKTogdXNlIHRoZSBuZXcgdW5kZXJzY29yZSBpbiBiZmQgdG8KLQl0byBkZW1hbmdsZSBzeW1ib2xzIGJldHRlcgotCi1UdWUgT2N0ICA2IDEzOjA4OjU0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfZmluaXNoKTogZG9uJ3Qgd2FybiBpZiAtZSBzdGFydCBzeW1ib2wgZG9lcyBub3QKLQlleGlzdCB3aGVuIGxpbmtpbmcgd2l0aCAtci4KLQotTW9uIE9jdCAgNSAxNDowNzozNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFvdXQuc2Mtc2gsIG02OGtjb2ZmLnNjLXNoOiBzZXQgX19ic3Nfc3RhcnQgdG8gdGhlIHN0YXJ0IG9mIHRoZQotCS5ic3Mgc2VnbWVudC4KLQotTW9uIE9jdCAgNSAwODo1NToxNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKGxpbmVhcl9saWJyYXJ5KTogZG9uJ3QgZXZlbiB0aGluayBhYm91dCBwcm9jZXNzaW5nCi0JYW4gb2JqZWN0IGZpbGUgaWYgaXQncyBhbHJlYWR5IGJlZW4gZG9uZQotCi1UaHUgT2N0ICAxIDIzOjE0OjU5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB0aGUgaHA5MDAwLzMwMCBjb25maWcgZmlsZSBpcyBub3cgaHAzMDAKLQotV2VkIFNlcCAzMCAwNzozNDowOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3o4a3NpbS5tdDogbmV3IGZpbGUKLQotRnJpIFNlcCAyNSAxMzo0OTo1MiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3lyaWF0aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobGRleHAubywgbGRjdG9yLm8sIGxkbGFuZy5vLCBsZG1haW4ubywgbGR3cml0ZS5vLAotCWxleHN1cC5vLCBtcmkubywgcmVsYXgubyk6IEluZGljYXRlIGRlcGVuZGVuY2Ugb24gbGRncmFtLmguCi0KLQkqIGxkLmggKHN0cmlwX3N5bWJvbHNfdHlwZSk6IEFkZCB2YWx1ZSBTVFJJUF9TT01FLgotCSogbGRncmFtLnkgKE9QVElPTl9SRVRBSU5fU1lNQk9MU19GSUxFKTogTmV3IHRlcm1pbmFsIHRva2VuLgotCSogbGRsYW5nLmMgKGxhbmdfYWRkX2tlZXBzeW1zX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGxleC5sOiBIYW5kbGUgIi1yZXRhaW4tc3ltYm9scy1maWxlIi4KLQkqIGxkc3ltLmMgKGtlZXBzeW1zX2ZpbGUsIGtlcHRfc3ltcyk6IE5ldyB2YXJzLgotCShwcm9jZXNzX2tlZXBzeW1zKTogTmV3IGZ1bmN0aWhvbjsgcmVhZHMgZmlsZSwgbWFya3Mgc3ltYm9scyBmb3IKLQlzYXZpbmcuCi0JKHdyaXRlX2ZpbGVfbG9jYWxzKTogRmlsZSBzeW1ib2xzIHNob3VsZCBhbHdheXMgYmUga2VwdC4KLQkobGRzeW1fd3JpdGUpOiBXYXJuIGFib3V0ICItcmV0YWluLXN5bWJvbHMtZmlsZSIgb3ZlcnJpZGluZyAiLVMiCi0JYW5kICItcyIuICBQcm9jZXNzIHJldGFpbi1zeW1ib2xzIGZpbGUgYmVmb3JlIHNldHRpbmcgc3ltdGFiLgotCSogbGRzeW0uaCAoU1lNX0tFRVApOiBOZXcgZmxhZyBmb3IgbGRzeW1fdHlwZSBmbGFncy4KLQkoa2VlcHN5bXNfZmlsZSwga2VwdF9zeW1zKTogRGVjbGFyZSB0aGVtLgotCi0JKiBsZG1haW4uYyAobWFpbik6IE5vbi1mYXRhbCBlcnJvcnMgc2hvdWxkIHN0aWxsIGNhdXNlIG5vbi16ZXJvCi0JZXhpdCBzdGF0dXMgZXZlbiB3aXRoIC1yLgotCi1GcmkgU2VwIDI1IDExOjA4OjAxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JQWRkZWQgaW5pdGlhbCBzdXBwb3J0IGZvciB0aGUgejhrCi0JKiB6OGtzaW0uZW0sIHo4a3NpbS5zYy1zaCwgejhrc2ltLnNoOiBuZXcgZmlsZXMKLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IG1vZGlmaWVkIHRvIHJlZmxlY3QgYWJvdmUKLQotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2spOiB3aGVuIGxpbmtpbmcgY29uZmxpY3RpbmcgYXJjaGl0ZWN0dXJlcywKLQltYWtlIHRoZSBvdXRwdXQgZmlsZSByZWZsZWN0IGF0IGxlYXN0IG9uZSBvZiB0aGUgYmFkIGlucHV0cy4KLQotVHVlIFNlcCAxNSAxNTozNTozOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogaWYgJCh0b29sZGlyKSBleGlzdHMsIGluc3RhbGwgbGQgaW4KLQkkKHRvb2xkaXIpL2Jpbi4KLQotRnJpIFNlcCAxMSAxMDoyNDoyMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogbW9kaWZpZWQgdG8gc3VwcG9ydCBpMzg2LWNvZmYKLQkqIGkzODZjb2ZmLnNoOiBuZXcgZmlsZQotCi1XZWQgU2VwICA5IDExOjUyOjU4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIG02OGtjb2ZmLnNoLCBtNjhrY29mZi5zYy1zaCwgY29uZmlnL202OGstY29mZi5tdDoKLQlhZGRlZCBtNjhrLWNvZmYgZW11bGF0aW9uIG1vZGUsIHN0b2xlbiBmcm9tIGEyOWsgZW11bGF0aW9uLgotCUFsbW9zdCBjZXJ0YWlubHkgd3JvbmcsIGJ1dCBwZXJoYXBzIGJldHRlciB0aGFuIHN1bjMuCi0KLVRodSBTZXAgIDMgMTQ6MTk6MzAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgTWFrZWZpbGUuZG9zLCBnZW5lcmljLmVtLCBnZW5zY3JpcHRzLnNoLAotCWdsZDk2MC5lbSwgaDgzMDBobXMuZW0sIGg4MzAweHJheS5lbSwgbG5rOTYwLmVtLCBzdDIwMDAuZW0sCi0JdmFuaWxsYS5lbTogIFJlbmFtZSBhbGwgKGdlbmVyYXRlZCkgbGRfXyouYyBmaWxlcyB0byBlbV8uYy4KLQlUaGlzIGlzIG9uZSBjaGFyYWN0ZXIgc2hvcnRlciwgYW5kIGxldHMgcGVvcGxlIGJ1aWxkIG9uCi0JU1ZSMyBzeXN0ZW0uIChsZF9faDgzMDB4cmF5Lltjb10gd2FzIHRoZSBraWxsZXIgdGhlcmU7Ci0JaDgzMDB4cmF5LnNjLXNoIGlzIGFsc28gb3ZlcmxvbmcsIGJ1dCBzZWVtcyBoYXJtbGVzcy4pCi0JQmFzZWQgb24gYSBwYXRjaCBmcm9tIEpvbmF0aGFuIFJ5c2hwYW4gPGhpdGFjaGkhYW1pdG8ham9uPi4KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6ICBGaXggdHlwbyBtb3N0Y2xlYW4gLT4gbW9zdGx5Y2xlYW4uCi0JKiBjb25maWd1cmUuaW46ICBBZGQgaG9zdCBpc2MuCi0KLQkqIGxkdmVyLmM6ICBDYWxsIGl0IHZlcnNpb24gMi4wLgotCi1XZWQgU2VwICAyIDAwOjIxOjMzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYzogIEJ1bXAgdG8gdmVyc2lvbiAwLjk4LgotCSogVE9ETzogIE5ldyBmaWxlLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZGVkIG1vc3RseWNsZWFuLCBkaXN0Y2xlYW4sIHJlYWxjbGVhbiBydWxlcy4KLQotVHVlIFNlcCAgMSAyMzo0MjoxNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkbWlzYy5jICh4cmVhbGxvYyk6ICBOZXcgKG5lZWRlZCBieSAuLi9saWJpYmVydHkvY3BsdXMuZGVtLmMpLgotCSogbGRsZXgubDogTW92ZWQgY29tbWVudCgpIHRvIGVuZCwgc2luY2Ugc29tZSBjb21waWxlcnMKLQlvdGhlcndpc2UgaGF2ZSBwcm9ibGVtcyB3aXRoIGlucHV0KCkgdXNlZCBiZWZvcmUgaXQgaXMgZGVmaW5lZC4KLQotVHVlIFNlcCAgMSAxNzo0NTo1MSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgU29sYXJpcyAyIGFuZCBJcml4IDQgaG9zdCBzdXBwb3J0LgotCi1Nb24gQXVnIDMxIDE5OjI3OjExIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSAtUyBmbGFnIGZyb20gdGhlIEZMRVggZGVmaW5pdGlvbgotCi0JKiBjb25maWd1cmUuaW46IHJld3JvdGUsIHVzaW5nIG5ldyBzdHlsZSBjYXNlIHN0YXRlbWVudC4gIHVzZQotCW02OGsubXQgZm9yIG02OGstYW91dCBzeXN0ZW1zCi0KLVN1biBBdWcgMzAgMjE6Mzg6NTMgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFwICJsZCIgdGhyb3VnaCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIHdoZW4KLQlpbnN0YWxsaW5nLgotCi1TdW4gQXVnIDMwIDE4OjEyOjEzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6ICBSZW1vdmVkLiAgVXNlIHRoZSB2ZXJzaW9uIGluIGxpYmliZXJ0eSBub3cuCi0JKiBsZG1pc2MuYzogIFVzZSBuZXcgbGliaWJlcnR5IHZlcnNpb24gb2YgY3BsdXNfZGVtYW5nbGUoKS4KLQotVGh1IEF1ZyAyNyAxNjozODo0MiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGdsZDk2MC5lbSAoZ2xkOTYwX2Nob29zZV90YXJnZXQpOiBkZWZhdWx0IHRvIGxpdHRsZSBlbmRpYW4sIG5vdAotCWJpZyBlbmRpYW4uCi0KLVdlZCBBdWcgMjYgMTc6Mjg6NTEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBkb24ndCBwYXNzIG51bGwgcG9pbnRlcnMgd2hlbgotCWFic19vdXRwdXRfc2VjdGlvbiBpcyB3aGF0IGlzIHJlcXVpcmVkLgotCSogbGR3cml0ZS5jIChsZHdyaXRlKTogdXNlIG1hbGxvYyB0byBhbGxvY2F0ZSB0aGUgbGFyZ2VzdCBzcGFjZQotCXVzZWQsIGFuZCBwYXNzIHRoYXQgZG93bi4KLQkqIHJlbGF4LmMscmVsYXguaCAod3JpdGVfcmVsYXhub3JlbCk6IHVzZSB0aGUgcGFzc2VkIG1hbGxvYyBhcmVhIHJhdGhlcgotCXRoYW4gYWxsb2NhLgotCi1Nb24gQXVnIDI0IDE0OjQyOjA2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcvb3NlNjgubXQ6IHJlbmFtZWQgT1NFIHRvIG9zZS4KLQotVGh1IEF1ZyAyMCAxOTo1NToyMiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiBSZW9yZGVyIGNoZWNrIGZvciBjb21tb24gb3IKLQl1bmRlZmluZWQgc3ltYm9scyBzbyB0aGF0IGl0IHdvcmtzLgotCi1UdWUgQXVnIDE4IDEzOjQxOjM2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBhY2NlcHQgYWxsIG02OEsgZmFtaWx5IG1lbWJlcnMuCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLQotVGh1IEF1ZyAxMyAxMTo0OTozNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubDogbm93IHBhcnNlcyBjb21tZW50IGNvcnJlY3RseSwgYWRkZWQgfiB0byBhY2NlcHRhYmxlCi0JY2hhcnMgaW4gZmlsZW5hbWVzCi0KLQkqIGxkZXhwLmMgKGV4cF91bm9wKTogcGFzcyBkb3duIGFic19vdXRwdXRfc2VjdGlvbiAtIG5vdyBjYW4gaGF2ZQotCXVuYXJ5IC12ZSBjb25zdGFudHMuCi0KLQkqIGxkbGFuZy5jIChsYW5nX2ZpbmlzaCk6IHdhcm4gd2hlbiBhbiBlbnRyeSBzeW1ib2wgc3VwcGxpZWQgb24KLQl0aGUgY29tbWFuZCBsaW5lIGNhbid0IGJlIGZvdW5kLgotCi1GcmkgQXVnICA3IDEyOjMxOjEwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuaDogYWRkIG5ldyBmaWVsZCAibG9hZGFibGUiIHRvIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC4KLQkqIGxkbGFuZy5jIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXApOiBpbml0aWxpemUgbmV3Ci0JZmllbGQuICh3aWxkX2RvaXQpOiBpZiBuZXcgZmllbGQgaXMgbm90IHNldCwgdGhlbiBzdG9wIG91dHB1dAotCXNlY3Rpb24gZnJvbSBiZWluZyBsb2FkYWJsZS4KLQkobGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBzZXQgdGhlIGZpZWxkIGZyb20gdGhlCi0JTk9MT0FEIGtleXdvcmQKLQkqIGxkZ3JhbS55OiBuZXcgc3luYXggZm9yIE5PTE9BRC4gUmVtb3ZlcyBhIHNoaWZ0L3JlZHVjZSB0b28uCi0JKiBoODMwMGhtcy5zYy1zaCwgaDgzMDBobXMuZW06IGdldCAtciByaWdodC4KLQotVGh1IEF1ZyAgNiAxODozNToyMSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkaW50LnRleGluZm86ICBOZXcgaW50ZXJuYWxzIG1hbnVhbCAoYmVnaW5uaW5ncyB0aGVyZW9mKS4KLQkqIFBPUlRJTkc6ICBSZW1vdmVkLCBtZXJnZWQgaW50byBsZGludC50ZXhpbmZvLgotCi1UdWUgQXVnICA0IDIxOjEyOjI5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY2R0ZXN0LW1haW4uY2MsIGNkdGVzdC1mdW5jLmNjLCBjZHRlc3QtZm9vLmgsIGNkdGVzdC1mb28uY2MsCi0JY2R0ZXN0LmV4cDogIEEgdGVzdCBwcm9ncmFtIChjb3BpZWQgZnJvbSBsaWJnKysvdGVzdC1pbnN0YWxsKQotCXRoYXQgdGVzdHMgdGhhdCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcnMgYXJlIGhhbmRsZWQKLQljb3JycmVjdGx5LgotCi1Nb24gQXVnICAzIDE0OjU4OjE5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBpbnN0YWxsIGZyb20gbGQubmV3LCByZW5hbWluZyBkdXJpbmcgdGhlCi0JY29weSwgb3IgZWxzZSB0aGUgbmV4dCAnbWFrZSBpbnN0YWxsJyBuZWVkcyB0byByZS1saW5rIGxkLgotCi1Nb24gSnVsIDIwIDAzOjM3OjA2IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBnZW5lcmFsaXNlIGhwIHJlY29nbml0aW9uIChmcm9tIHNlZikuCi0KLVNhdCBKdWwgMTggMTQ6NDY6MDQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBic2QgYW5kIGhwdXggaHBwYSBjb25maWd1cmF0aW9ucy4KLQllcnJvciBtZXNzYWdlcyBlY2hvIHRvIHN0ZGVyciwgbm90IHN0ZG91dAotCi1GcmkgSnVsIDE3IDIyOjA2OjExIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuZG9zLCBnbGQuMSwgbGQudGV4aW5mbywgbGRlbXVsLmMsIGxkZmlsZS5jLCBsZGxhbmcuYywKLQkgIGxkbWlzYy5jOiByZW1vdmVkIHJjc2lkJ3MuCi0KLVR1ZSBKdWwgMTQgMDg6MzQ6MzQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX21hcCk6IHByaW50IGNoYW5nZXMgaW4gc2l6ZXMgZHVlIHRvIHJlbGF4aW5nCi0JKHNpemVfaW5wdXRfc2VjdGlvbik6IG1haW50YWluIHRoZSBkZWx0YSBpbmZvcm1hdGlvbi4KLQkqIGxkbGFuZy5oOiBhZGQgbmV3IGZpZWxkIHRvIHN0cnVjdCB0byBjb250YWluIGRlbHRhIGluZm8uCi0JKiByZWxheC5jICAocmVsYXhfc2VjdGlvbik6IGNvbXBsYWluIGlmIGlucHV0IG5vdCByZWxheGFibGUuCi0JKiBsZGxleC5sIDogYWRkICdfJywgJywnIGFuZCAnJCcgdG8gY2hhcnMgd2hpY2ggY2FuIGFwcGVhciBhdCB0aGUKLQlzdGFydCBvZiBhIGZpbGVuYW1lCi0KLU1vbiBKdWwgMTMgMTc6MzM6MDAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jKG1haW4pOiBwcmV2ZW50IC1yIGFuZCAtcmVsYXggZnJvbSBiZWluZyBvbiBhdCB0aGUgc2FtZQotCXRpbWUuCi0KLVdlZCBKdWwgIDEgMTc6NTE6MTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChRX2VudGVyX2dsb2JhbF9yZWYpLCBsZGluZHIuYyAoYWRkX2luZGlyZWN0KTogZml4IGZvcgotCWFsaWFzaW5nIHByb2JsZW1zCi0KLQotVGh1IEp1biAxOCAwOTozODo1NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaDgzMDBobXMuZW0sIGg4MzAwaG1zLnNjLXNoOiAgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciAtcgotCSogbGRleHAuYzogIGxpbnQKLQkqIGxkbGFuZy5jKG9wZW5fb3V0cHV0KTogc2V0IHRoZSB0YXJnZXQgYXJjaCBhbmQgbWFjaGluZSBhcyBzb29uCi0JYXMgd2UgY2FuLiAobGFuZ19zaXplX3NlY3Rpb25zKTogdXNlIG5ldyBtYWNyb3MgZm9yIHNldHRpbmcgdm1hCi0JKiBsZHdyaXRlLmM6IGxpbnQKLQotTW9uIEp1biAxNSAwODo0Nzo0MyAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG15X3RhcmdldCk6IEFjY2VwdCBtNjgwPzAgZm9yIHdycyBhcyB2eHdvcmtzNjguCi0JQWxzbyBkZWxldGVkIGFuIHVucmVhY2hhYmxlIHBhdGggdG8gd3JzLgotCi1XZWQgTWF5IDI3IDIzOjI0OjE5IDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogdXNlIC1kIHRlc3QgZm9yICR0b29sZGlyIGJlZm9yZQotCWluc3RhbGxpbmcgbGQgdGhlcmUgc28gdGhhdCAkdG9vbGRpciBjYW4gYmUgaW5oZXJpdGVkIGZyb20KLQl0b3AtbGV2ZWwgTWFrZWZpbGUuCi0KLVdlZCBNYXkgMjcgMTY6NTY6NDggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYzogIFR3byBub24tc3Vic3RhbnRpYWwgY2hhbmdlcyBmb3IgdGhlIHNha2Ugb2YKLQl0aGUgb2xkIFBvcnRhYmxlIEMgQ29tcGlsZXIuCi0KLVdlZCBNYXkgMjcgMTU6MTU6NTggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBsZGdyYW0ueSwgbGRsZXgubDogcGFyc2UgQUJTT0xVVEUKLQkqIGxkZXhwLmM6IGFkZCBzdXBwb3J0IGZvciBBQlNPTFVURQotCi1XZWQgTWF5IDI3IDEzOjA3OjIwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGRlZCBkZWZhdWx0IGRlZmluaXRpb25zIGZvciBIT1NUSU5HX0NSVDAsCi0JSE9TVElOR19MSUJTLCBhbmQgSE9TVElOR19FTVUsIGJhc2VkIG9uIHRob3NlIGluIGNvbmZpZy8qLm1oLgotCSogY29uZmlnLyoubWg6ICBNaXNjZWxsYW5lb3VzIGNsZWFuLXVwOiAgUmVtb3ZlZCBkZWZpbml0aW9ucwotCW9mIFlBQ0MgKHNpbmNlIGl0IGlzIG5vdCBsb25nZXIgdXNlZCBpbiB0aGUgTWFrZWZpbGUpLgotCVJlbW92ZSBIT1NUSU5HXyogZGVmaW5pdGlvbnMgdGhhdCBhcmUgc3Vic3VtZWQgYnkgdGhlCi0Jb25lcyBhZGRlZCB0byBNYWtlZmlsZS5pbi4gIFJlbW92ZWQgbW9zdCBkZWZpbml0aW9ucyBvZiBDQy4KLQkqIGNvbmZpZy97c3BhcmMsbmV3cyxocDMwMGJzZCxkZWNzdGF0aW9ufS5taDogIFJlbW92ZWQ7Ci0JVGhlc2UgYXJlIG5vIGxvbmdlciBuZWVkZWQuCi0KLUZyaSBNYXkgMjIgMTM6NDc6MTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgVXNlIHNyY2RpciBpbnN0ZWFkIG9mIFZQQVRIIGluIGxkZ3JhbS9sZGxleAotCXJ1bGVzLCBzaW5jZSB0aGVzZSBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgZGlzdHJpYnV0aW9uLgotCSogTWFrZWZpbGUuaW4gKGxkbGV4LmMpOiAgRG9uJ3QgcmUtZGlyZWN0IG91dHB1dCwgc2luY2UgdGhhdAotCWxlYXZlcyBhIGJvZ3VzIG91dHB1dCBmaWxlcyBpZiBpdCBmYWlscy4KLQotCSogY29uZmlnL3NwYXJjLm1oOiAgRml4IEhPU1RJTkdfTElCUyBzbyBpdCBoYXMgYSBjaGFuY2Ugb2Ygd29ya2luZy4KLQkqIGxkbGV4LmM6ICBGaXggc29tZSB1bm5lY2Vzc2FyeSBmbGV4LXNwZWNpZmljLWlzbXMuCi0KLUZyaSBNYXkgIDggMTE6NDk6NDMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55OiBtb3ZlIHNwdXJpb3VzIHNlbWljb2xvbgotCSogbGRleHAuaDogZml4IHByb3RvdHlwZQotCi1UaHUgTWF5ICA3IDE3OjAxOjEyIDE5OTIgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGxkLnRleGluZm86IHJlZmVyZW5jZXMgdG8gbGlua2VyIG5vdyBzYXkgImxkIiBub3QgImdsZCIuCi0KLVdlZCBNYXkgIDYgMTM6MjY6MTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQljaGFuZ2VkIGNhbGxpbmcgY29udmVudGlvbiBmb3IgUV9lbnRlcl9nbG9iYWxfcmVmCi0JKiBsZGV4cC5jLCBsZGxhbmcuYywgbGRtYWluLmM6IHJlZmxlY3QgdGhpcwotCSogbGR2ZXIuYzogYnVtcCB2ZXJzaW9uIHRvIDEuOTcuMQotCSogbGRpbmRyLmMgKGFkZF9pbmRpcmVjdCk6IHdoZW4gYW4gZWRpY3QgZGVjbGFyaW5nIGFuIGluZGlyZWN0Ci0Jc3ltYm9sIGlzIGZvdW5kLCBtYWtlIHN1cmUgdGhhdCBhbnkgaWRlYXMgYWJvdXQgdGhlIHN5bWJvbCBiZWluZwotCWNvbW1vbiBhcmUgY2hhbmdlZCBpZiBpdCBub3cga25vd24gdG8gYmUgZGVmaW5lZC4KLQkqIGxkbWFpbi5jIChsaW5lYXJfbGlicmFyeSk6IGNvbXBsYWluIG9uY2UgaWYgYXJjaGl2ZSBpc24ndAotCXJhbmxpYmJlZC4KLQkqIGxkbGFuZy5oLCBsZGxhbmcuYzogbWFrZSByb29tIGZvciBhbmQgaW5pdGlhbGl6ZSB0aGUgY29tcGxhaW4KLQlvbmNlIGZpZWxkLgotCi1XZWQgTWF5ICA2IDExOjA3OjM1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHVzZSBmbGV4ICYgYmlzb24gZnJvbSAuLi8gaWYgdGhleSBleGlzdC4KLQotVHVlIE1heSAgNSAxNzo0NzozMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVsYXguYyAoYnVpbGRfaXQpOiBkb24ndCBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGZpbGUgZm9yCi0Jc3R1ZmYgaWYgLVIgZmxhZyBhcHBseXMgdG8gaXQuCi0JKiBsZGZpbGUuYzogbWVyZ2UgaW4gVk1TIGZpbGVuYW1lIHN1cHBvcnQKLQkqIGxkbWFpbi5jIChtYWluKTogdGFrZSBvdXQgLi8gZnJvbSBsaWJyYXJ5IHBhdGgsIGFuZCBjbG9zZSBmaWxlCi0JYmVmb3JlIHVubGlua2luZy4gTWFrZSBtdWx0aXBsZSBkZWZzIG9mIGEgc3ltYm9sIGNyZWF0ZSBhbgotCXVuZXhlY2FibGUgZmlsZS4KLQkqIGxkbWlzYy5jOiBmYXRhbCBlcnJvc3JzIGRlbGV0ZSBvdXRwdXQgZmlsZQotCi1UdWUgTWF5ICA1IDE0OjA1OjA1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYzogIEluY3JlYXNlIHZlcnNpb24gbnVtYmVyIHRvIDEuOTcsIGZvciBjb25zaXN0ZW5jeQotCXdpdGggLi4vYmludXRpbHMuCi0KLVR1ZSBNYXkgIDUgMTI6MTI6MjQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBGTEVYIC0+IExFWC4KLQotCSogbGQudGV4aW5mbzoge30gLT4gQHtAfS4KLQotTW9uIE1heSAgNCAxNzo1Mjo0MSAxOTkyICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBsZC50ZXhpbmZvOiBkZXNjcmliZSBhbHRlcm5hdGUsIE1SSS1jb21wYXRpYmxlIGxpbmtlciBzY3JpcHRzCi0JKGFuZCBhc3NvY2lhdGVkIGNoYW5nZSBpbiAtYyBvcHRpb24sIG5vdyB1c2VkIGZvciB0aGVzZSBzY3JpcHRzKQotCi1Nb24gTWF5ICA0IDE2OjEwOjEwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZHZlci5jOiBCdW1wZWQgdmVyc2lvbiB0byAxLjk2IC0gbmV3IHJlbGVhc2UsIHJlc3luYyB3aXRoIHRoZQotCWJmZCB0b28gIy4KLQkqIGxkZXhwLmMsIGxkbGFuZy5jOiBub3cgYnVpbGQgbWVtb3J5IHNoYXBlIHRyZWUgaW4gb2JzdGFja3MKLQlyYXRoZXIgdGhhbiB3aXRoIHJhdyBtYWxsb2MsIG1ha2VzIGl0IGVhc2llciB0byB0cmFjayB3aGVyZSBtZW1vcnkKLQlpcyBnb2luZy4KLQkqIGxkc3ltLmgsIGxkc3ltLmM6IGNyZWF0ZSBvYnN0YWNrIGZvciBhbGwgZ2xvYmFsIHN5bWJvbHMgdG9vLgotCSogbGR3cml0ZS5jIChsZHdyaXRlKTogbW92ZWQgbWFsbG9jIHNvIG9ubHkgdXNlZCB3aGVuIG5lZWRlZC4KLQkqIHNhMjkyMDAtc2Muc2g6IGFkZGVkIHN1cHBvcnQgZm9yIC5saXQsIGRhdGExIGFuZCBkYXRhMiBzZWN0aW9ucy4KLQotCi1GcmkgTWF5ICAxIDE4OjE3OjUyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWcvc3BhcmMubWg6IHVzZSAuLi9nY2MvbGliZ2NjLmEgb24gY2hlY2sgaWYgaXQgZXhpc3RzLgotCi0JKiBNYWtlZmlsZS5pbjogdXNlIGJvb3RzdHJhcCBmb3IgY2hlY2suCi0KLUZyaSBNYXkgIDEgMTM6MDM6NDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55LCBsZGxleC5jLCBtcmkuYzogYWRkZWQgbW9yZSBjb21wYXRpYmxlIHdvcmRzOyBCQVNFLCBBTElBUyBhbmQKLQlQVUJMSUMuCi0JKiBNYWtlZmlsZS5pbjogbm93IHVzZSBmbGV4LCBub3QgbGV4Ci0JKiBsZGxleC5sLCBsZGxhbmcuYywgbGRjdG9yLmM6IGxpbnQKLQotV2VkIEFwciAyMiAxMjo0ODo0MiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubDogYWRkZWQgQ01ERklMRU5BTUVDSEFSIHN0YXRlIHNvIHRoYXQgeW91IGNhbiBsZXgKLQlkaWZmZXJlbnQgc29ydHMgb2YgZmlsZW5hbWVzIG9uIHRoZSBjb21tYW5kIGxpbmUgdGhhbiBpbiBhIHNjcmlwdC4KLQotTW9uIEFwciAyMCAyMjozNzowNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZXdvcmsgQ0ZMQUdTIHNvIHRoYXQgdGhleSBjYW4gYmUgcGFzc2VkIG9uIHRoZQotCSAgbWFrZSBjb21tYW5kIGxpbmUuICBSZW1vdmUgTUlOVVNfRy4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCi1GcmkgQXByIDE3IDA4OjU3OjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWxheC5jOiBhZGRlZCBoYW5kbGluZyBmb3IgbmV3ICJwYWRkaW5nIiBzZWNsZXQgdHlwZSwgdXNlZCB0bwotCWZpbGwgb3V0IGdhcHMgYmV0d2VlbiBzZWN0aW9uLgotCSogbGRncmFtLnksIGxkbGV4Lmw6IG5vdyAtZGVmc3ltIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgZG9uZQotCXByb3Blcmx5LgotCi1XZWQgQXByIDE1IDIxOjIwOjA3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHRoZSB0b29sZGlyIGNvcHkgb2YgbGQgZ29lcyBkaXJlY3RseSBpbiB0b29sZGlyLgotCi1XZWQgQXByIDE1IDE2OjA5OjMzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBtcmkuYywgbGRncmFtLnksIGxkbGV4Lmw6IGFkZGVkIHN1cHBvcnQgZm9yIG1pbmltYWwgc3RyYW5nZSBsaW5rCi0Jc2NyaXB0cy4KLQotVGh1IEFwciAgOSAwNTo1MjowMiAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBJbnN0YWxsIHNlY29uZCBjb3B5IGluICQodG9vbGRpcikvYmluCi0Jd2l0aG91dCAkKHByb2dyYW1fcHJlZml4KSwgc2luY2UgdGhhdCdzIHdoYXQgZ2NjIGV4cGVjdHMuCi0KLVNhdCBBcHIgIDQgMTc6NDQ6MDYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4LmwsIGxkZ3JhbS55LCBsZGxleC5oOiBSZXdyb3RlIGxleGVyLiBOb3cgaXQncyBtdWNoIG5pY2VyLgotCSogaDgzMDAqOiBmaXggYml0IHJvdCBhbmQgYWRkIHN1cHBvcnQgZm9yIGg4MzAweHJheSB0YXJnZXQKLQkqIGdvMzIuc2g6IHRhcmdldCBlbXVsYXRpb24gZm9yIGdvMzIuCi0KLU1vbiBNYXIgMTYgMTQ6NTM6MjkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGdsZDk2MC5lbSwgaTk2MC5zYy1zaC4gRml4IGk5NjAgYml0IHJvdAotCi1GcmkgTWFyIDEzIDE5OjQ3OjIyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5zdGFsbCBtYW4gcGFnZS4KLQotRnJpIE1hciAxMyAwODoyMzo1OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL210LTxmb28+IHJlbmFtZWQgdG8gPGZvbz4ubXQKLQkqIGNvbmZpZy9taC08Zm9vPiByZW5hbWVkIHRvIDxmb28+Lm10Ci0JKiBjb25maWd1cmUuaW4gY2hhbmdlZCB0byByZWZsZWN0IHRoaXMKLQkqIGdlbnNjcmlwdHMuc2ggbm93IG1ha2UgLnhibiBmaWxlcyByYXRoZXIgdGhhbiAueE4gZmlsZXMKLQotU2F0IE1hciAgNyAwMzo0MDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuaDogZml4IGRlY2wgb2YgbGR2ZXJzaW9uLgotCi1GcmkgTWFyICA2IDIyOjAwOjM1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgotCi1GcmkgTWFyICA2IDA2OjU5OjA0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoUV9lbnRlcl9maWxlX3N5bWJvbHMpOiBub3cgYWxpYXNlcyB3b3JrIGFnYWluCi0KLVRodSBNYXIgIDUgMjE6Mzk6MjkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjbGVhbi1pbmZvIHRhcmdldC4KLQotVGh1IE1hciAgNSAxNjo1NTo1NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRleHAuYyAoZXhwX3ByaW50X3RyZWUpOiBkb24ndCB0cnkgYW5kIGZvbGxvdyBudWxsIHBvaW50ZXJzCi0JYXJvdW5kLgotCSogbGRncmFtLnk6IHJlbW92ZSAxMSBzaGlmdCByZWR1Y2UgZXJyb3JzCi0KLVR1ZSBNYXIgIDMgMTU6NDY6MzkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgdG9vbGRpciBhbmQgcHJvZ3JhbV9wcmVmaXguCi0KLUZyaSBGZWIgMjggMDg6MTc6NDUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChzaXplX2lucHV0X3NlY3Rpb24pOiBkb24ndCBtb3ZlIGFic29sdXRlIHNlY3Rpb25zCi0JYXJvdW5kIQotCi0KLVRodSBGZWIgMjcgMDk6MjA6NDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiB5ZXQgYW5vdGhlciBjb3B5IG9mIHRoaXMgLSBtYXliZSBpdCBzaG91bGQgZ28gaW50bwotCWxpYmliZXJ0eSA/Ci0JKiBsZGdyYW0ueTogbm93IC1WIGFuZCAtdiBoYXZlIGRpZmZlcmVudCBhY3Rpb25zCi0JKiBsZHZlci5jOiBpZiAtViwgcHJpbnRzIGxpc3Qgb2YgZW11bGF0aW9ucyBjb21waWxlZCBpbgotCSogbGRtaXNjLmM6IHN1cHBvcnQgZm9yIGNwbHVzIGRlbWFuZ2xpbmcKLQotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotVGh1IEZlYiAyMCAxNzo0Mzo0NiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDaGFuZ2UgbWtzY3JpcHQgcnVsZSBpbnRvIG9uZSBmb3IgLi9ta3NjcmlwdAotCShmb3IgdGhlIHNha2Ugb2YgbWFrZXMgdGhhdCBkb24ndCByZWFsaXplIHRoZXkncmUgdGhlIHNhbWUpLgotCSogUE9SVElORzogIEFkZCBtb3JlIGRldGFpbHMuCi0JKiBnZW5zY3JpcHRzLnNoOiAgQWRkIG1vcmUgdGFpbG9yYWJpbGl0eSBvZiBEQVRBX0FMSUdOTUVOVC4KLQotTW9uIEZlYiAxNyAxMjowNDozNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGFuZCBuZXcgZmlsZXMgaHAzMDBic2Quc2gsIGNvbmZpZy9taC1ocDMwMGJzZCwKLQljb25maWcvbXQtaHAzMDBic2Q6ICBOZXcgcG9ydCB0byBocDMwMCBydW5uaW5nIEJTRC4KLQotU2F0IEZlYiAxNSAxMzo1OTo1NCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCU1ham9yIHJld3JpdGUgb2YgaG93IGxkIGlzIGNvbmZpZ3VyZWQuICBUaGUgbWFqb3IgaWRlYQotCWlzIHRvIHVzZSBzaGVsbCBzY3JpcHRzIHRvIGdlbmVyYXRlIGV2ZXJ5dGhpbmcuCi0JKiBnZW5lcmljLmVtIHJlcGxhY2VzIGxkdGVtcGxhdGUuCi0JKiBPdGhlciAqLmVtIGZpbGVzIHJlcGxhY2UgdmFyaW91cyAqLmMgZmlsZXMuCi0JQSAqLmVtIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBnZW5lcmF0ZXMgdGhlIGNvcnJlc3BvbmRpbmcKLQlsZF9fKi5jIGZpbGUgdGhhdCBpbXBsZW1lbnRzIGFuIGVtdWxhdGlvbi4gIFRoaXMgaXMgdXN1YWxseQotCWEgc3RyYWlnaHQgJ2NhdCcgb2YgYSBoZXJlLWRvY3VtZW50LCBwb3NzaWJseSB3aXRoIHN1YnN0aXR1dGlvbnMuCi0JKiBTY3JpcHQgZmlsZXMgKCouc2MpIGFyZSBwbGFjZXMgYnkgKi5zYy1zaCBzY3JpcHRzLgotCUFnYWluLCB0aGVzZSBhcmUgc2ltcGxlIHNoZWxsIHNjcmlwdHMgdGhhdCAnY2F0JwotCWhlcmUtZG9jdW1lbnRzLCB1c3VhbGx5IHdpdGggc29tZSBzdWJzdGl0dXRpb25zLgotCVRoZSBvdXRwdXQgYSAqLnNjLXNoIGlzIGEgc2NyaXB0IGZpbGUuCi0JKiBFYWNoIGVtdWxhdGlvbiBpcyBkZWZpbmVkIGJ5IGEgc2hvcnQgc2hlbGwgc2NyaXB0IHdpdGgKLQlleHRlbnNpb24gKi5zaCB0aGF0IHNwZWNpZmllcyB0aGUgZW11bGF0aW9uLXNwZWNpZmljCi0JcGFyYW1ldGVycyAoc3VjaCBhcyB0aGUgbmFtZSBvZiB0aGUgKi5zaC1zYyBhbmQgKi5lbQotCWZpbGVzIHRvIHVzZSkuCi0JKiBnZW5zY3JpcHQuc2ggaXMgdGhlIG1hc3RlciBzaGVsbCBzY3JpcHQgdXNlZCB0byBnZW5lcmF0ZQotCWFuIGVtdWxhdGlvbi4gIEl0IGlzIHBhc3NlZCB2YXJpb3VzIGFyZ3VtZW50LCBpbmNsdWRpbmcKLQl0aGUgbmFtZSBhIHRoZSBlbXVsYXRpb24tc3BlY2lpYyAqLnNoIGZpbGUgdGhhdCBpdAotCSJzb3VyY2VzIiB0byBzZXQgdmFyaWFibGVzIHRvIGVtdWxhdGlvbi1zcGVjaWZjIHBhcmFtZXRlcnMuCi0JKiBjb25maWcvbXQtZm9vOiAgQ2hhbmdlZCBFTVVMPUdMREZPT19FTVVMQVRJT05fTkFNRQotCXRvIEVNVUw9Zm9vLiAoVGhlIEdMREZPT19FTVVMQVRJT05fTkFNRXMgaGF2ZSBiZWUgcmVtb3ZlZC4pCi0JKiBjb25maWcvbWgtZm9vOiAgUmVuYW1lIExERU1VTEFUSU9OIG5hbWVzIGFzIGFwcHJvcHJpYXRlCi0JKHVzdWFsbHkgJ2dsZGZvbycgLT4gcGxhaW4gJ2ZvbycpLgotCSogbGR3cml0ZS5jOiAgRml4ZWQgYSB0eXBvIGluIGEgY29tbWVudC4KLQkqIE1ha2VmaWxlLmluOiAgTWFqb3IgY2hhbmdlcy4gIFJlbW92ZWQgc29tZSB0aGUgc2VkCi0JbWFnaWMgdG8gY29udmVydHMgc2NyaXB0cywgc2luY2UgdGhhdCBpcyBub3cgaGFuZGxlZAotCWJ5IGdlbnNjcmlwdHMuc2ggYW5kIHRoZSAqLnNjLXNoIHNjaXB0IGdlbmVyYXRvcnMuCi0JKiBjb25maWcuaDogIFJlbW92ZSBhIGJ1bmNoIG9mIG1hY3JvcyBkZWZpbmluZyBlbXVsYXRpb25zCi0JYW5kIHRhcmdldHMuICBUaGlzIGJlY29tZXMgb25lIGxlc3MgZmlsZSB0byBlZGl0IHdoZW4KLQlhZGRpbmcgZW11bGF0aW9ucyBvciB0YXJnZXRzLgotCSogbGRlbXVsLmggKHN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiAgQWRkCi0JZW11bGF0aW9uX25hbWUgYW5kIHRhcmdldF9uYW1lIGZpZWxkcy4KLQkqIGxkZW11bC5jLCBsZGVtdWwuaDogIERlZmluZSBzb21lIGRlZmF1bHQgZnVuY3Rpb25zIHVzZWQKLQlieSBtb3N0IGVtdWxhdGlvbnMgKGFuZCByZW1vdmUgZnJvbSB0aGUgKi5lbSBzY3JpcHRzKS4KLQkqIGxkZW11bC5jIChsZGVtdWxfY2hvb3NlX3RhcmdldCk6ICBTZWFyY2ggdGhlIG5ldwotCWxkX2VtdWxhdGlvbnMgYXJyYXkgdXNpbmcgYSBsb29wIChpbnN0ZWFkIG9mIGEgaGFyZHdpcmVkCi0JbmVzdGVkIGlmIHN0YXRlbWVudCkuCi0JRGVmaW5lIHRoZSBsZF9lbXVsYXRpb24gZnJvbSB0aGUgYXV0b21hdGljYWxseS1nZWVucmF0ZWQKLQlsZGVtdWwtbGlzdC5oLiAgVGhpcyBtZWFucyB5b3Ugbm8gbG9uZ2VyIGhhdmUgdG8gZWRpdCBsZGVtdWwuYwotCXRvIGFkZCBhIG5ldyBlbXVsYXRpb24uCi0JKiBsZG1haW4uYzogIFJlcGxhY2Uge0dMRCxMTkt9OTYwX0VNVUxBVElPTl9OQU1FIGJ5Ci0JdGhlaXIgZXhwYW5zaW9ucywgc2luY2UgdGhlIGZvcm1lciBubyBsb25nZXIgZXhpc3QuCi0JKiBQT1JUSU5HOiAgQSB2ZXJ5IHJvdWdoIGZpcnN0IGRyYWZ0IG9mIGEgcG9ydGluZyBndWlkZS4KLQotCSogbGRncmFtLnksIGxkbGV4LmwsIGxleHN1cC5jOiBDaGFuZ2VzIHRvIGFsbG93IGFuIGFzc2lnbm1lbnQKLQl0byBiZSB0ZXJtaW5hdGVkIGJ5IGEgbmV3LWxpbmUgKGluc3RlYWQgb2YgcmVxdWlyaW5nIGEgc2VtaWNvbG9uKS4KLQotTW9uIEZlYiAxMCAxNjoyMTowMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRleHAuYywgbGRsYW5nLmM6IGFkZGVkIG5ldyBpZGVhICJhYnNfb3V0cHV0X3NlY3Rpb24iLCByZW1vdmVzCi0JdGVzdHMgZm9yIE5VTEwgcG9pbnRlcnMgYWxsIG92ZXIgdGhlIHBsYWNlLgotCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IHJlbWVtYmVyIHRvIHJlbG9jYXRlIGdsb2JhbCBzeW1ib2xzCi0JKmFmdGVyKiByZWxheGluZyBoYXMgZG9uZSBpdCBzdHVmZi4KLQotVGh1IEZlYiAgNiAxMTo0MDoxNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL210LWNvZmYtaDgzMDA6IHVzZSBFTVVMIGxpa2UgZXZlcnl0aGluZyBlbHNlCi0JKiBsZGxhbmcuYzogKHByaW50X3BhZGRpbmdfc3RhdGVtZW50KTogcHJpbnQgdGhlIHJpZ2h0IGFkZHJlc3MuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnLmgsIGxkZW11bC5jOiByZW5hbWVkICBoODMwMGhkcyB0byBoODMwMGhtcwotCi0KLVR1ZSBGZWIgIDQgMTU6Mjg6MDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4Lmw6IFB1dCBwYWNrIC1ub2luaGliaXQtZXhlYyBhbmQgLXNvcnQtY29tbW9uCi0JKiBsZGxhbmcuYyAocHJpbnRfZGF0YV9zdGF0ZW1lbnQpOiBwcmludCB0aGUgcmlnaHQgYWRkcmVzcy4KLQotVGh1IEphbiAzMCAxNzo1MTo1MyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBUaGUgcnVsZSBmb3IgdGVzdGluZyBsZCBieSByZS1saW5raW5nIGl0c2VsZgotCXZpYSBhbiBpbnRlcm1lZGlhdGUgLXIgbGluayB3YXMgbW92ZWQgdG8gdGhlIGxkMSBydWxlCi0JaW5zdGVhZCBvZiB0aGUgbGQyIHJ1bGUuICBUaGlzIGFsbG93cyBsZDIgYW5kIGxkMyB0byBiZSBpZGVudGljYWwsCi0Jd2hpY2ggYWxsb3dzIHRoZSBib290c3RyYXAgcnVsZSB0byB3b3JrLgotCSogbGRjdG9yLmMgKGZpbmRfY29uc3RydWN0b3JzKTogIERvbid0IGNyZWF0ZSBhIGNvbnN0cnVjdG9yCi0JbGlzdCBpZiBpdCBpcyBhbHJlYWR5IGRlZmluZWQgKGFzIHdvdWxkIGhhcHBlbiBpZiBsZCBpcwotCWludm9rZWQgYnkgY29sbGVjdCkuCi0KLVdlZCBKYW4gMjkgMDg6MzU6MzkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zcGFyYy5oOiBub3cgdXNlcyBsaWJnY2MuYQotCSogbGRtYWluLmM6IHF1aXQgdXNpbmcgZXhpdAotCSogKnNjOiB1c2UgKihDT01NT04pIHJhdGhlciB0aGFuIFtDT01NT05dCi0JKiBsZGxleC5sLCBsZXhzdXAuYzogbXVjaCB0aGlua2luZyBtb3ZlZCBmcm9tIC5sIGFuZCBwdXQgaW50byAuYywKLQl0byBhbGxvdyBwcmVwcm9jZXNzaW5nIG9mIC5sIGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogTmV3IGxkbGV4LmwgbWFuZ2xpbmcKLQkqIGxkZXhwLmMgKGZvbGRfYmluYXJ5KTogcGVyZm9ybSBleHByZXNzaW9ucyB3aXRoICUgYW5kIC8gaW4KLQlpbnRlZ2VyLgotCSogbGRmaWxlLmMgKG9wZW5fYSk6IG9wZW4gYXJjaGl2ZXMgb24gVk1TIGluIGEgc3BlY2lhbCB3YXkKLQotCi1UdWUgSmFuIDI4IDEwOjE4OjE2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueTogbWFwIC1NIGJlaGF2ZSBpbiB0aGUgc2FtZSB3YXkgYXMgLU1hcCAoc2V0cyBmaWxlIG5hbWUKLQl0byBiZSAiLSIuCi0JKiBsZHN5bS5jLCBsZGxhbmcuYzogcmVtZW1iZXIgdGhhdCBzaXplIG9mIGEgc2VjdGlvbiBpcyBkZXBlbmRlbnQgb24KLQl3aGV0aGVyIG9yIG5vdCByZWxheGluZyBoYXMgYmVlbiBkb25lLgotCSogbGRtYWluLmM6IGRvbid0IG9wZW4gYSBtYXAgZmlsZSBpZiBpdCBkb2Vzbid0IGhhdmUgYSBuYW1lCi0JKiByZWxheC5jOiBhbGwgdGhlIGJyYWlucyBoYXZlIG1vdmVkIGludG8gYmZkLgotCSogbGR3cml0ZS5jOiBhbW1lbmQgY29tbWVudAotCi1GcmkgSmFuIDI0IDE0OjIzOjQ2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgcmVsYXgsIGFsc28gbWFkZSB0aHJlZSBzdGFnZSBnbyB0aHJvdWdoIGEKLQlwYXJ0aWFsIGxpbmsgc3RhZ2UuCi0JKiByZWxheC5jIDogYWRkZWQKLQkqIGNvbmZpZy5oOiBpZiBHTlU5NjAgZGVmaW5lZCwgdGhlbiBkZWZhdWx0IGVtdWxhdGlvbiBtb2RlIGlzCi0JR0xEOTYwCi0JKiBsZGV4cC5oLCBsZGV4cC5jOiBtYXAgdG8gZmlsZSBob29rcwotCSogbGRsYW5nLmM6IG1hcCB0byBmaWxlIGhvb2tzCi0JKiBsZGdyYW0ueTogYWRkZWQgLU1hcCAtcmVsYXgKLQkqIGxkbGV4Lmw6IGFkZGVkIC1yZWxheCwgLU1hcAotCSogbGRtYWluLmM6IG9wZW4gbWFwIGZpbGUKLQkqIGxkbWlzYy5jOiBzdXBwb3J0IGZvciBtYXAgZmlsZQotCSogbGR3cml0ZS5jOiBuZXcgcmVsYXggbWFnaWMKLQotVGh1IERlYyAxOSAxODo0OTo1MSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy90bS0qLmg6ICBDbGVhbiB1cCBtYWtlIG91dHB1dCwgb25seQotCXBhc3MgREVGQVVMVF9FTVVMQVRJT04gdG8gbGRtYWluLmMuCi0KLVdlZCBEZWMgMTggMTU6MDI6NDcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmM6ICBCdW1wIHRvIHZlcnNpb24gMS45NC4KLQotVHVlIERlYyAxMCAwNDowNzoyMyAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbmZvZGlyIGJlbG9uZ3MgaW4gZGF0YWRpci4KLQotTW9uIERlYyAgOSAxNjoyNjo0MyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBQYXNzIC15IHRvIGJpc29uLiAgKEFnYWluOwotCWFjY2lkZW50YWxseSBkZWxldGVkIGJ5IFJpY2guKQotCSogbmV3cy5zYywgbGRnbGQ2OGsuc2M6ICBEZWZpbmUgX19lbmQgYXMgd2VsbCBhcyBfZW5kLgotCi1TYXQgRGVjICA3IDE3OjE5OjI2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGluZHIuaDogYWRkZWQgdG8gY29udGFpbiBwcm90b3R5cGVzIG9mIGxkaW5kci5jCi0JKiBsZGZpbGUuYzogaW5jbHVkZSBjdHlwZS5oCi0JKiBsZG1haW4uYzogaW5jbHVkZSB0aGUgcmVxdXJpZWQgcHJvdG90eXBlIGhlYWRlcnMKLQkqIGxkd3JpdGUuYzogZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGhhcyBiZWVuIHJlbmFtZWQKLQliZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0KLUZyaSBEZWMgIDYgMjM6Mjk6MjYgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcHVudCAiZnVuZGFtZW50YWwiIG1vZGUgYmVjYXVzZSBpdCBicmVha3MgbXkgZW1hY3MKLQkgIG1hY3Jvcy4gIGluc3RhbGwgdXNpbmcgSU5TVEFMTF9QUk9HUkFNIGFuZCBJTlNUQUxMX0RBVEEuICByZW1vdmUKLQkgIHNwYWNlcyBmb2xsb3dpbmcgaHlwaGVucywgYnNkIG1ha2UgY2FuJ3QgY29wZS4gIGFkZGVkCi0JICBzdGFuZGFyZHMudGV4dCBzdXBwb3J0IGFuZCBtYWRlIGl0IGxvb2sgbGlrZSBhbGwgdGhlIG90aGVyCi0JICBtYWtlZmlsZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogY29uZmlndXJlIG5vdyBydW5zIGVudGlyZWx5IGluIG9iamRpciBzbyBtYWtlIGZpbGUKLQkgIGV4aXN0ZW5jZSBjaGVja3MgYWdhaW5zdCAke3NyY2Rpcn0uICBNYXJrIHRoaXMgZGlyZWN0b3J5IGFzCi0JICB0YXJnZXQgZGVwZW5kZW50LgotCi1UaHUgRGVjICA1IDIyOjQ2OjE2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotV2VkIERlYyAgNCAyMzozNjo1NSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYzogIEJ1bXBlZCB2ZXJzaW9uIHRvIDEuOTMuCi0JKiBNYWtlZmlsZS5pbjogIFBhc3MgLXkgdG8gYmlzb24uCi0KLU1vbiBOb3YgMjUgMTg6Mjg6NDAgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmg6IGg4IGlzIG5vdyBjb2ZmLCBub3QgaWVlZQotCSogaDgzMDBoZHMuc2M6IHJlZmxlY3QgdGhlIHNhbWUKLQotVGh1IE5vdiAxNCAxOTo1NTowOSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKCkpOiAgVXBkYXRlIHRvIDEuOTIuCi0JKiBsZGN0b3IuYzogVGhlcmUgYXJlIHR3byBwbGFjZXMgY29uc3RydWN0b3Igc2V0cwotCWNhbiBiZSBkZWZpbmVkLiAgT25lIG9mIHRoZW0gY2hlY2tlZCBmb3IgYW4gZXhpc3RpbmcKLQlkdXBsaWNhdGUsIHRoZSBvdGhlciBkaWRuJ3QuICBVbmZvcnR1bmF0ZWx5LCB0aGUgbGF0dGVyCi0Jd2FzIGNhbGxlZCBhZnRlciB0aGUgZm9ybWVyIC4uLgotCVNvLCBmYWN0b3Igb3V0IGNvZGUgZm9yIGluc2VydGluZyBhIG5ldyBlbGVtZW50IGludG8KLQljb25zdHJ1Y3Rvcl9uYW1lX2xpc3QgKGFmdGVyIGNoZWNraW5nIGZvciBhIGR1cGxpY2F0ZSkKLQlpbnRvIGEgbmV3IGZ1bmN0aW9uIGFkZF9jb25zdHJ1Y3Rvcl9uYW1lLCBhbmQgY2FsbAotCWl0IGZyb20gYm90aCBhZm9yZW1lbnRpb25lZCBwbGFjZXMgKGxkbGFuZ19hZGRfY29uc3RydWN0b3IKLQlhbmQgbGRsYW5nX2NoZWNrX2Zvcl9jb25zdHJ1Y3RvcnMpLgotCi1XZWQgTm92IDEzIDE1OjE3OjQzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFJlbmFtZSAuYyBmaWxlcyBnZW5lcmF0ZWQgZnJvbSBsZHRlbXBsYXRlCi0JdG8gaGF2ZSBuYW1lcyBzdGFydGluZyB3aXRoIGxkX18uICBUaGlzIGhlbHBzICdtYWtlIGNsZWFuJy4KLQotVHVlIE5vdiAxMiAxODozNjo1MCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogVGFrZSBvdXQgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBpbnN0YWxsCi0JKiBtODhrYmNzLnNjOiBwdXQgaW4gY29udHJ1Y3RvciBibG9ja3MuCi0KLU1vbiBOb3YgMTEgMTg6NDc6MzMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkbWlzYy5jLCBsZG1pc2MuaDogIFJlLXdyaXRlIGluZm8oKSB0byB0YWtlIGEgZmlsZW5hbWUKLQlwYXJhbWV0ZXIsIGEgZm9ybWF0LCBhbmQgYW4gYXJnIHBvaW50ZXIsIGFuZCByZW5hbWUgaXQgdG8KLQl2ZmluZm8oKS4gIFdyaXRlIGluZm8oKSBpbiB0ZXJtcyBvZiBuZXcgdmZpbmZvKCkuCi0JTmV3IGVpbmZvKCkgaXMgdGhlIHNhbWUgYXMgaW5mbygpLCBleGNlcHQgaXQgd3JpdGVzIHRvIHN0ZGVyci4KLQkqIGxkZW11bC5jLCBsZGV4cC5jLCBsZGxhbmcuYywgbGRsbms5NjAuYywgbGRtYWluLmMsIGxkd3JpdGUuYywKLQlsZG1pc2MuYzogIFJlcGxhY2UgImVycm9yIiBjYWxscyB0byBpbmZvKCkgYnkgbmV3IGVpbmZvKCkuCi0KLU1vbiBOb3YgMTEgMDk6NTc6MzIgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBsZGxleC5sIGxkZ3JhbS55OiBtYWRlIC1WIG9wdGlvbiBkbyBzYW1lIGFzIC12Ci0JKiBNYWtlZmlsZS5pbjogQWRkZWQgJChNSU5VU19HKSBmbGFnIHNvIGRlYnVnZ2luZyBjYW4gYmUKLQl0dXJuZWQgb2ZmCi0KLVN1biBOb3YgIDMgMTY6Mzc6MzcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCSBpMzg2IGFvdXQgY2hhbmdlcyBmcm9tIEJvYiBLdWt1cmEKLQkqIE1ha2VmaWxlLmluLCBjb25maWcuaDogYWRkZWQgaTM4NmFvdXQgc3VwcG9ydAotCSogY29uZmlndXJlLmluOiBmaXhlZCAvaC17bXlob3N0fSB0eXBvCi0JKiBsZGdyYW0ueTogLU1NIG5vdyBnaXZlcyBtb3JlIGJvcmluZyBtYXAuCi0JKiBsZGxhbmcuYzogbm93IGRvZXMgRF9QQUdFRCBmbGFnIHRoZSByaWdodCB3YXkuCi0JKiBsZHN5bS5jOiAtTU0gZmxhZ3MgZG9lcyB0aGUgcmlnaHQgdGhpbmcuCi0KLVN1biBOb3YgIDMgMTU6MDA6MDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEZpeGVkIHR5cG8uICBBbHNvLCBhIGZpeCBmb3IgaHAzMDBic2QuCi0JKiBsZGxhbmcuYyAoaW5pdF9vcyk6ICBDb21wZW5zYXRlIGZvciBCRkQgY2hhbmdlLAotCXdoZXJlIGJmZF9tYWtlX3NlY3Rpb24gbm93IHJldHVybnMgTlVMTCBmb3IgYSBkdXBsaWNhdGUKLQlzZWN0aW9uIHJlcXVlc3QsIGluc3RlYWQgb2YgdGhlIG9sZCBzZWN0aW9uLgotCi1UaHUgT2N0IDE3IDE1OjI3OjEzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsZHZlci5jOiBCdW1wIHRvIHZlcnNpb24gMS45MSAoY29uc2lzdGVudCB3aXRoIGJpbnV0aWxzKS4KLQotV2VkIE9jdCAxNiAxMjoyNzowOCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy5oLCBsZC5oLCBsZGVtdWwuYywgbGRleHAuYywgbGRleHAuaCwKLQlsZGdyYW0ueSwgbGRsZXgubCwgbGRsbms5NjAuYywgbGRtYWluLmMsIGxkbWlzYy5jLCBsZG1pc2MuaCwKLQlsZHN5bS5jLCBsZHN5bS5oLCBsZHRlbXBsYXRlLCBsZHZhbmlsbGEuYywgbGR2ZXIuYywgbGR2ZXIuaCwKLQlsZHdhcm4uYywgbGR3YXJuLmgsIGxkd3JpdGUuYywgbGR3cml0ZS5oLCBta3NjcmlwdC5jOgotCUFkZCBvciB1cGRhdGUgY29weXJpZ2h0IG5vdGljZXMuCi0KLU1vbiBPY3QgMTQgMjM6NTU6MjcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogIENoYW5nZWQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBuYW1lIHNjaGVtZQotCXRvIGJlIGNvbnNpc3RlbnQgd2l0aCBnY2MuICBBbHNvIGNoYW5nZWQgJ2luc3RhbGwnLgotCi1Nb24gT2N0IDE0IDE3OjMwOjAyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBuZXcgdGFyZ2V0cyBsZC5tbSwgbGQubWUKLQotTW9uIE9jdCAxNCAxNzoyNzoyNCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGxkdGVtcGxhdGU6ICBOZWVkIHRvIHVzZSBzZXBhcmF0ZSBzY3JpcHRzCi0JZm9yIC1uIGFuZCAtTiBvcHRpb25zLiAgWWV0IG1vcmUgY29tcGxpY2F0aW9uLgotCi1GcmkgT2N0IDExIDIyOjQwOjQ2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEF2b2lkIHVzaW5nICQ8IGluIGV4cGxpY2l0IE1ha2UgcnVsZXMgKGl0IGRvZXNuJ3QKLQl3b3JrKS4gIEFkZCBzb21lIGxpbmVzIHRvIGF2b2lkIFN1biBNYWtlIFZQQVRIIGJ1Z3MuCi0KLUZyaSBPY3QgMTEgMTY6NDI6MjIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIG5ld3Muc2M6IEFkZCBhbGlnbm1lbnQgZm9yIGRhdGEgc2VnbWVudC4KLQkqIGxkdGVtcGxhdGU6IEFkZCAoeWV0IGFub3RoZXIpIHNjcmlwdCB0byBnZXQgZm9yIC1uIG9yIC1OCi0Jb3B0aW9ucy4gIChUaGVzZSBuZWVkIGRpZmZlcmVudCBhbGlnbm1lbnQgdGhhbiBaTUFHSUMgZmlsZXMuKQotCSogTWFrZWZpbGUuaW46ICBBZGQgc3R1ZmYgZm9yIG5ldyBmb28ueG4gc2NyaXB0cy4KLQlUaGVzZSBhcmUgZ2VuZXJhdGVkIGJ5IHJlcGxhY2luZyAiQUxJR04oMHguLi4wMCkiIGJ5ICIuIi4KLQotRnJpIE9jdCAxMSAxNTo0MzowNCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbmV3IHRhcmdldHMgbGQubXMsIGxkLWluZGV4Lm1zCi0JbGQudGV4aW5mbzogcmVtb3ZlIHRhYnMsIG90aGVyIGNsZWFudXBzIGZvciB0ZXhpMnJvZmYKLQotRnJpIE9jdCAxMSAxMzo1MTo1NCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKG1haW4pOiBNYWtlIGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgYmUgdHJ1ZQotCWJ5IGRlZmF1bHQuICBEb24ndCB0aGUgV1BfVEVYVCBhbmQgRF9QQUdFRCBmbGFncyBvZgotCW91dHB1dF9iZmQgaGVyZTsgaXQncyB0b28gbGF0ZSwgc28gc2V0IGl0IHdoZW4gb3V0cHV0X2JmZAotCWlzIGNyZWF0ZWQgKGluIGxkbGFuZy5jKS4gIEFsc28gZml4IHNldHRpbmcgb2YgRVhFQ19QIGZsYWcKLQkqIGxkbGFuZy5jIChsZGxhbmdfb3Blbl9vdXRwdXQpOiAgU2V0IG91dHB1dF9iZmQtPmZsYWdzIGhlcmUuCi0JKiBsZGxhbmcuYzogUmVtb3ZlIHNvbWUgZHVwbGljYXRlIGV4dGVybiBkZWNsYXJhdGlvbnMuCi0JKiBsZGdyYW0ueTogRml4ZXMgdG8gLU4gYW5kIC1uIG9wdGlvbnMuCi0JKiBNYWtlZmlsZS5pbjogIFJlY29nbml6ZSB1cHBlciBjYXNlIGxldHRlcnMgaW4gc2VkIHNjcmlwdAotCXRvIHJlbW92ZSBhc3NpZ25tZW50cyBmcm9tIHNjcmlwdCBmaWxlcy4KLQkqIGxkdGVtcGxhdGU6ICBEb24ndCBhc3N1a21lIHRoYXQgLU4gb3IgLW4gb3B0aW9ucwotCWltcGx5IHVzZSBvZiAtciBzY3JpcHQuCi0JKiBta3NjcmlwdC5jOiAgVHdlYWtpbmcgdG8gY29ycmVjdGx5IGhhbmRsZSBcbiBhbmQgXFwgaW4gaW5wdXQuCi0KLUZyaSBPY3QgMTEgMTA6Mjk6MjcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBsZHRlbXBsYXRlOiBpbmNsdWRlIGJmZC5oIGJlZm9yZSBzeXNkZXAuaC4KLQotRnJpIE9jdCAxMSAwNDoyNDo0NSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJlc3RydWN0dXJlIGNvbmZpZ3VyYXRpb24gc2NoZW1lIGZvciBiZmQsIGJpbnV0aWxzLCBsZC4KLQotCSogaW5jbHVkZS9zeXMvaC0qLmg6ICBNb3ZlIHRvIGJmZC9ob3N0cy9oLSouaC4KLQkqIGNvbmZpZ3VyZS5pbjogIFJldmlzZSB0byBzeW1saW5rIHN5c2RlcC5oIHRvIC4uL2JmZC9ob3N0cy9oLXh4eC5oLgotCUNoYW5nZSBzb21lIGNvbmZpZyBuYW1lcyB0byBtYXRjaCBvdGhlciBkaXJzLgotCSogKi5jOiAgSW5jbHVkZSBiZmQuaCBiZWZvcmUgc3lzZGVwLmgsIHNvIGFuc2lkZWNsIGFuZCBQUk9UTygpCi0JZ2V0IGRlZmluZWQgZmlyc3QuCi0JKiBjb25maWcvOiAgUmVuYW1lIHNvbWUgY29uZmlnIGZpbGVzIHRvIG1hdGNoIHVwIGgtKi5oIG5hbWVzLgotCVJlbW92ZSBhbGwgdGhlIEhPU1RfU1lTIGRlZmluaXRpb25zIGZyb20gdGhlIGNvbmZpZyBmaWxlcy4KLQotVHVlIE9jdCAgOCAxNjowMDo1NyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGRleHAuaCwgbGRsYW5nLmg6IENoYW5nZSBlbnVtIGJvb2xlYW4gLT4gZW51bSBiZmRfYm9vbGVhbi4KLQkqIGxkdGVtcGxhdGU6IFJlbW92ZSBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCBjYWxsczsKLQlqdXN0IHVzZSB0aGUgU0VBUkNIX0RJUiBjb21tYW5kcyBpbiB0aGUgc2NyaXB0IGZpbGVzLgotCSogTWFrZWZpbGUuaW46IEFkZCBMSUJfUEFUSCBtYWNybywgd2hpY2ggaWYgc2V0IGlzIHVzZWQgdG8gcmVwbGFjZQotCXRoZSBTRUFSQ0hfRElSIGNvbW1hbmRzIGluIHRoZSBzY3JpcHRzICh1c2luZyB1Z2x5IHNlZCBtYWdpYykuCi0JVGhpcyBpcyBwcmltYXJpbHkgaW50ZW5kZWQgZm9yIGNyb3NzLWxpbmtpbmcsIHdoZXJlIHlvdSB3b3VsZAotCXBsYWNlIGxpYmFyaWVzIGluIGEgZGlmZmVyZW50IHBsYWNlIHRoYW4gbmF0aXZlIGxpYnJhcmllcy4KLQlBbHNvLCBlbXVsYXRpb25zIG1hZGUgZnJvbSBsZHRlbXBsYXRlIG5vdyB1c2UgJChzcmNkaXIpLgotCSogbGRnbGRhMjlrLnNjOiAgQ2hhbmdlIFNFQVJDSF9ESVIgY29tbWFuZHMgdG8gYSBjb252ZW50aW9uYWwKLQlmb3JtOyBwZW9wbGUgY2FuIHVzZSB0aGUgTWFrZWZpbGUncyBMSUJfUEFUSCB0byBvdmVycmlkZS4KLQotVHVlIE9jdCAgOCAxNDo1MToyMSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZml4IHRhcmdldCBsZC5kdmksIGFkZCB0YXJnZXQgbGQuaW5mbwotCWxkLnRleGluZm86IG1ha2UgaW5mbyBmaWxlbmFtZSBsZC5pbmZvCi0KLUZyaSBPY3QgIDQgMjE6NTE6NTggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQXZvaWQgdXNpbmcgJDwgaW4gbm9uLXN1ZmZpeCBydWxlcyAoYnJlYWtzIG9uIFN1bgotCU1ha2UpLgotCSogbGRmaWxlLmMsIGxkbGFuZy5jLCBsZG1haW4uYywgbGR3cml0ZS5jOiAgQ29wZSB3aXRoIHJlbmFtZXMgb2YgYQotCWZldyBCRkQgdHlwZXMgJiBlbnVtcy4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvbGQvTWFrZWZpbGUuYW0gYi9sZC9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkYzEyZi4uMDAwMDAwMAotLS0gYS9sZC9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDkwMiArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLSMjIEZJWE1FOiB3b3JrIGFyb3VuZCBhcHBhcmVudCBhdXRvbWFrZSBidWcuCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwkKHNyY2RpcikvLi4vYmlzb24vOyBlbHNlIGVjaG8gQFlBQ0NAOyBmaWAKLVlGTEFHUyA9IC1kCi1MRVggPSBgaWYgWyAtZiAuLi9mbGV4L2ZsZXggXTsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleDsgZWxzZSBlY2hvIEBMRVhAOyBmaWAKLQotIyBXZSBwdXQgdGhlIHNjcmlwdHMgaW4gdGhlIGRpcmVjdG9yeSAkKHNjcmlwdGRpcikvbGRzY3JpcHRzLgotIyBXZSBjYW4ndCBwdXQgdGhlIHNjcmlwdHMgaW4gJChkYXRhZGlyKSBiZWNhdXNlIHRoZSBTRUFSQ0hfRElSCi0jIGRpcmVjdGl2ZXMgbmVlZCB0byBiZSBkaWZmZXJlbnQgZm9yIG5hdGl2ZSBhbmQgY3Jvc3MgbGlua2Vycy4KLXNjcmlwdGRpciA9ICQodG9vbGRpcikvbGliCi0KLUVNVUwgPSBARU1VTEAKLUVNVUxBVElPTl9PRklMRVMgPSBARU1VTEFUSU9OX09GSUxFU0AKLUVNVUxfRVhUUkFfT0ZJTEVTID0gQEVNVUxfRVhUUkFfT0ZJTEVTQAotCi0jIFNlYXJjaCBwYXRoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoIGZvciAtbGZvbyBsaWJyYXJpZXMuCi0jIElmIExJQl9QQVRIIGlzIGVtcHR5LCB0aGUgb25lcyBpbiB0aGUgc2NyaXB0IChpZiBhbnkpIGFyZSBsZWZ0IGFsb25lLgotIyAoVGhlIGRlZmF1bHQgaXMgdXN1YWxseSAvbGliOi91c3IvbGliOi91c3IvbG9jYWwvbGliLCB1bmxlc3MgYnVpbGRpbmcKLSMgYSBjcm9zcy1saW5rZXIsIGluIHdoaWNoIGNhc2UgdGhlIGRlZmF1bHQgaXMgZW1wdHkuICBTZWUgZ2Vuc2NyaXB0cy5zaC4pCi0jIE90aGVyd2lzZSwgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgb25lcyBnaXZlbiBpbiBMSUJfUEFUSCwKLSMgd2hpY2ggbWF5IGhhdmUgdGhlIGZvcm06IExJQl9QQVRIPS9saWI6L3Vzci9sb2NhbC9saWIKLUxJQl9QQVRIID0KLQotQkFTRURJUiA9ICQoc3JjZGlyKS8uLgotQkZERElSID0gJChCQVNFRElSKS9iZmQKLUlOQ0RJUgk9ICQoQkFTRURJUikvaW5jbHVkZQotTUtERVAgPSBta2RlcAotCi0jIFdoYXQgdmVyc2lvbiBvZiB0aGUgbWFudWFsIHRvIGJ1aWxkCi1ET0NWRVIgPSBnZW4KLQotI3N0dWZmIGZvciBzZWxmIGhvc3RpbmcgKGNhbiBiZSBvdmVycmlkZGVuIGluIGNvbmZpZyBmaWxlKS4KLUhPU1RJTkdfQ1JUMCA9IEBIT1NUSU5HX0NSVDBACi1IT1NUSU5HX0xJQlMgPSBASE9TVElOR19MSUJTQAotSE9TVElOR19FTVUgPSAtbSAkKEVNVUwpCi0KLSMgU2V0dXAgdGhlIHRlc3RpbmcgZnJhbWV3b3JrLCBpZiB5b3UgaGF2ZSBvbmUKLUVYUEVDVCA9IGBpZiBbIC1mICQkci8uLi9leHBlY3QvZXhwZWN0IF0gOyBcCi0JdGhlbiBlY2hvICQkci8uLi9leHBlY3QvZXhwZWN0IDsgXAotCWVsc2UgZWNobyBleHBlY3QgOyBmaWAKLQotUlVOVEVTVCA9IGBpZiBbIC1mICQke3NyY3Jvb3R9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgXAotCXRoZW4gZWNobyAkJHtzcmNyb290fS8uLi9kZWphZ251L3J1bnRlc3QgOyBcCi0JZWxzZSBlY2hvIHJ1bnRlc3QgOyBmaWAKLQotUlVOVEVTVEZMQUdTID0KLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvLi4vbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy8gLWlkaXJhZnRlciAkJHIvLi4vbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQke3NyY3Jvb3R9Ly4uL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiQGhvc3RAIiA9ICJAdGFyZ2V0QCIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyBnY2MgfCBzZWQgJyQodHJhbnNmb3JtKSc7IFwKLSAgICBmaTsgXAotICBmaWAKLQotQ1hYID0gZ2NjCi1DWFhfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvLi4vbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy8gLWlkaXJhZnRlciAkJHIvLi4vbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQke3NyY3Jvb3R9Ly4uL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiQGhvc3RAIiA9ICJAdGFyZ2V0QCIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENYWCk7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gZ2NjIHwgc2VkICckKHRyYW5zZm9ybSknOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGxkLW5ldwotaW5mb19URVhJTkZPUyA9IGxkLnRleGluZm8KLW5vaW5zdF9URVhJTkZPUyA9IGxkaW50LnRleGluZm8KLW1hbl9NQU5TID0gbGQuMQotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChCRkRESVIpIC1JJChJTkNESVIpIC1JJCh0b3Bfc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAkKEhERUZJTkVTKSAkKENGTEFHUykgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1CRkRMSUIgPSAuLi9iZmQvbGliYmZkLmxhCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotQUxMX0VNVUxBVElPTlMgPSBcCi0JZWEyOWsubyBcCi0JZWFpeHBwYy5vIFwKLQllYWl4cnM2Lm8gXAotCWVhbHBoYS5vIFwKLQllYXJjZWxmLm8gXAotCWVhcm1lbGYubyBcCi0JZWFybWVsZl9vYWJpLm8gXAotCWVhcm1lbGZfbGludXgubyBcCi0JZWFybWVsZl9saW51eDI2Lm8gXAotCWVhcm1hb3V0Yi5vIFwKLQllYXJtYW91dGwubyBcCi0JZWFybWNvZmYubyBcCi0JZWFybW5ic2QubyBcCi0JZWFybXBlLm8gXAotCWVhcm1fZXBvY19wZS5vIFwKLQllY29mZl9zcGFyYy5vIFwKLQllZDEwdmVsZi5vIFwKLQllZDMwdmVsZi5vIFwKLQllZDMwdl9lLm8gXAotCWVkMzB2X28ubyBcCi0JZWRlbHRhNjgubyBcCi0JZWVibW9uMjlrLm8gXAotCWVlbGYzMl9zcGFyYy5vIFwKLQllZWxmMzJfaTk2MC5vIFwKLQllZWxmMzJiNDMwMC5vIFwKLQllZWxmMzJibWlwLm8gXAotCWVlbGYzMmVibWlwLm8gXAotCWVlbGYzMmVsbWlwLm8gXAotCWVlbGYzMmJtaXBuMzIubyBcCi0JZWVsZjMybDQzMDAubyBcCi0JZWVsZjMybG1pcC5vIFwKLQllZWxmMzJscHBjLm8gXAotCWVlbGYzMnBwYy5vIFwKLQllZWxmMzJwcGNsaW51eC5vIFwKLQllZWxmX2kzODYubyBcCi0JZWVsZl9pMzg2X2JlLm8gXAotCWVnbGQ5NjAubyBcCi0JZWdsZDk2MGNvZmYubyBcCi0JZWVsZjMyZnIzMC5vIFwKLQllZWxmMzJtY29yZS5vIFwKLQllaDgzMDAubyBcCi0JZWg4MzAwaC5vIFwKLQllaDgzMDBzLm8gXAotCWVoODUwMC5vIFwKLQllaDg1MDBiLm8gXAotCWVoODUwMGMubyBcCi0JZWg4NTAwbS5vIFwKLQllaDg1MDBzLm8gXAotCWVocDMwMGJzZC5vIFwKLQllaHAzaHB1eC5vIFwKLQllaHBwYWVsZi5vIFwKLQllaTM4NmFvdXQubyBcCi0JZWkzODZiZW9zLm8gXAotCWVpMzg2YnNkLm8gXAotCWVpMzg2Y29mZi5vIFwKLQllaTM4NmdvMzIubyBcCi0JZWkzODZsaW51eC5vIFwKLQllaTM4Nmx5bngubyBcCi0JZWkzODZtYWNoLm8gXAotCWVpMzg2bW9zcy5vIFwKLQllaTM4Nm1zZG9zLm8gXAotCWVpMzg2bmJzZC5vIFwKLQllaTM4Nm53Lm8gXAotCWVpMzg2cGUubyBcCi0JZWkzODZwZV9wb3NpeC5vIFwKLQllbG5rOTYwLm8gXAotCWVtNjhrNGtuYnNkLm8gXAotCWVtNjhrYW91dC5vIFwKLQllbTY4a2F1eC5vIFwKLQllbTY4a2NvZmYubyBcCi0JZW02OGtlbGYubyBcCi0JZW02OGtsaW51eC5vIFwKLQllbTY4a2x5bngubyBcCi0JZW02OGtuYnNkLm8gXAotCWVtNjhrcHNvcy5vIFwKLQllbTg4a2Jjcy5vIFwKLQllbWNvcmVwZS5vIFwKLQllbWlwc2JpZy5vIFwKLQllbWlwc2JzZC5vIFwKLQllbWlwc2lkdC5vIFwKLQllbWlwc2lkdGwubyBcCi0JZW1pcHNsaXQubyBcCi0JZW1pcHNsbmV3cy5vIFwKLQllbmV3cy5vIFwKLQllcGplbGYubyBcCi0JZXBqbGVsZi5vIFwKLQllbnMzMmtuYnNkLm8gXAotCWVwYzUzMm1hY2hhLm8gXAotCWVwcGNtYWNvcy5vIFwKLQllcHBjbncubyBcCi0JZXBwY3BlLm8gXAotCWVyaXNjaXgubyBcCi0JZXNhMjkyMDAubyBcCi0JZXNoLm8gXAotCWVzaGVsZi5vIFwKLQllc2hsZWxmLm8gXAotCWVzaGwubyBcCi0JZXNwYXJjYW91dC5vIFwKLQllc3BhcmNsaW51eC5vIFwKLQllc3BhcmNseW54Lm8gXAotCWVzcGFyY25ic2QubyBcCi0JZXN0MjAwMC5vIFwKLQllc3VuMy5vIFwKLQllc3VuNC5vIFwKLQlldGljMzBhb3V0Lm8gXAotCWV0aWMzMGNvZmYubyBcCi0JZXRpYzgwY29mZi5vIFwKLQlldmFuaWxsYS5vIFwKLQlldmF4Lm8gXAotCWV2c3RhLm8gXAotCWV3NjUubyBcCi0JZXo4MDAxLm8gXAotCWV6ODAwMi5vCi0KLUFMTF82NF9FTVVMQVRJT05TID0gXAotCWVlbGY2NF9zcGFyYy5vIFwKLQllZWxmNjRhbHBoYS5vIFwKLQllZWxmNjRibWlwLm8gXAotCWVlbGY2NGhwcGEubwotCi1BTExfRU1VTF9FWFRSQV9PRklMRVMgPSBcCi0JcGUtZGxsLm8gXAotCWRlZmZpbGVwLm8KLQotQ0ZJTEVTID0gbGRjdG9yLmMgbGRlbXVsLmMgbGRleHAuYyBsZGZpbGUuYyBsZGxhbmcuYyBcCi0JbGRtYWluLmMgbGRtaXNjLmMgbGR2ZXIuYyBsZHdyaXRlLmMgbGV4c3VwLmMgXAotCW1yaS5jIGxkY3JlZi5jIHBlLWRsbC5jCi0KLUhGSUxFUyA9IGxkLmggbGRjdG9yLmggbGRlbXVsLmggbGRleHAuaCBsZGZpbGUuaCBcCi0JbGRsYW5nLmggbGRsZXguaCBsZG1haW4uaCBsZG1pc2MuaCBsZHZlci5oIFwKLQlsZHdyaXRlLmggbXJpLmggZGVmZmlsZS5oIHBlLWRsbC5oCi0KLUdFTkVSQVRFRF9DRklMRVMgPSBsZGdyYW0uYyBsZGxleC5jIGRlZmZpbGVwLmMKLUdFTkVSQVRFRF9IRklMRVMgPSBsZGdyYW0uaCBsZGVtdWwtbGlzdC5oIGRlZmZpbGVwLmgKLQotT0ZJTEVTID0gbGRncmFtLm8gbGRsZXgubyBsZXhzdXAubyBsZGxhbmcubyBtcmkubyBsZGN0b3IubyBsZG1haW4ubyBcCi0JbGR3cml0ZS5vIGxkZXhwLm8gIGxkZW11bC5vIGxkdmVyLm8gbGRtaXNjLm8gXAotCWxkZmlsZS5vIGxkY3JlZi5vICR7RU1VTEFUSU9OX09GSUxFU30gJHtFTVVMX0VYVFJBX09GSUxFU30KLQotU1RBR0VTVFVGRiA9ICoubyBsZHNjcmlwdHMvKiBlKi5jCi0KLSMgQXQgdGhlIG1vbWVudCB0aGlzIGlzIGp1c3QgYSBsaXN0IG9mIHRob3NlIGVtdWxhdGlvbiB0ZW1wbGF0ZSBmaWxlcwotIyB0aGF0IGNvbnRhaW4gaW50ZXJuYXRpb25hbGlzZWQgc3RyaW5ncy4KLUVNVUxBVElPTl9GSUxFUyA9IGVtdWx0ZW1wbC9wZS5lbSBlbXVsdGVtcGwvYXJtY29mZi5lbQotCi1QT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChFTVVMQVRJT05fRklMRVMpCi0KLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLWxkbWFpbi5vOiBsZG1haW4uYyBjb25maWcuc3RhdHVzCi0JJChDT01QSUxFKSAtYyAtRERFRkFVTFRfRU1VTEFUSU9OPSciJChFTVVMKSInIC1EU0NSSVBURElSPSciJChzY3JpcHRkaXIpIicgLURUQVJHRVQ9JyJAdGFyZ2V0QCInICQoc3JjZGlyKS9sZG1haW4uYwotCi1sZGVtdWwtbGlzdC5oOiBNYWtlZmlsZQotCShlY2hvICIvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuICBETyBOT1QgRURJVCEgKi8iO1wKLQlmb3IgZiBpbiBgZWNobyAiICIgJHtFTVVMQVRJT05fT0ZJTEVTfSAiIiBcCi0JIHwgc2VkIC1lICdzLyBlLyBsZC9nJyAtZSAncy8gbGQvIC9nJyAtZSAncy9bLl1vLy9nJ2A7IGRvIFwKLQkgICAgZWNobyAiZXh0ZXJuIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgbGRfJCR7Zn1fZW11bGF0aW9uOyI7IFwKLQlkb25lO1wKLQllY2hvICIiO1wKLQllY2hvICIjZGVmaW5lIEVNVUxBVElPTl9MSVNUIFxcIjtcCi0JZm9yIGYgaW4gYGVjaG8gIiAiICR7RU1VTEFUSU9OX09GSUxFU30gIiIgXAotCSB8IHNlZCAtZSAncy8gZS8gbGQvZycgLWUgJ3MvIGxkLyAvZycgLWUgJ3MvWy5dby8vZydgOyBkbyBcCi0JICAgIGVjaG8gIiAgJmxkXyQke2Z9X2VtdWxhdGlvbiwgXFwiOyBcCi0JZG9uZTtcCi0JZWNobyAiICAwIikgPmxkZW11bC10bXAuaAotCW12IGxkZW11bC10bXAuaCBsZGVtdWwtbGlzdC5oCi0KLXN0cmluZ2lmeS5zZWQ6ICR7c3JjZGlyfS9lbXVsdGVtcGwvJChTVFJJTkdJRlkpCi0JICBjcCAke3NyY2Rpcn0vZW11bHRlbXBsLyQoU1RSSU5HSUZZKSBzdHJpbmdpZnkuc2VkCi0KLSMgVGhlc2UgYWxsIHN0YXJ0IHdpdGggZSBzbyAnbWFrZSBjbGVhbicgY2FuIGZpbmQgdGhlbS4KLQotR0VOU0NSSVBUUyA9ICQoU0hFTEwpICQoc3JjZGlyKS9nZW5zY3JpcHRzLnNoICR7c3JjZGlyfSAke2xpYmRpcn0gQGhvc3RAIEB0YXJnZXRAIEB0YXJnZXRfYWxpYXNAICJARU1VTEFUSU9OX0xJQlBBVEhAIiAiQE5BVElWRV9MSUJfRElSU0AiCi1HRU5fREVQRU5EUyA9ICQoc3JjZGlyKS9nZW5zY3JpcHRzLnNoIHN0cmluZ2lmeS5zZWQKLUBURElSU0AKLQotZWEyOWsuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYTI5ay5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYTI5ay5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYTI5ayAiJCh0ZGlyX2EyOWspIgotZWFpeHBwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9haXhwcGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhaXhwcGMgIiQodGRpcl9haXhwcGMpIgotZWFpeHJzNi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9haXhyczYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhaXhyczYgIiQodGRpcl9haXhyczYpIgotZWFscGhhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FscGhhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hbHBoYS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYWxwaGEgIiQodGRpcl9hbHBoYSkiCi1lYXJjZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FyY2VsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcmNlbGYgIiQodGRpcl9hcmNlbGYpIgotZWFybWVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGYgIiQodGRpcl9hcm1lbGYpIgotZWFybWVsZl9vYWJpLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfb2FiaSAiJCh0ZGlyX2FybWVsZikiCi1lYXJtZWxmX2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9saW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZl9saW51eCAiJCh0ZGlyX2FybWVsZl9saW51eCkiCi1lYXJtZWxmX2xpbnV4MjYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfbGludXgyNiAiJCh0ZGlyX2FybWVsZl9saW51eDI2KSIKLWVhcm1hb3V0Yi5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1hb3V0Yi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtYW91dGIgIiQodGRpcl9hcm1hb3V0YikiCi1lYXJtYW91dGwuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtYW91dGwuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWFvdXRsICIkKHRkaXJfYXJtYW91dGwpIgotZWFybWNvZmYuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtY29mZiAiJCh0ZGlyX2FybWNvZmYpIgotZWFybW5ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtbmJzZCAiJCh0ZGlyX2FybW5ic2QpIgotZWFybV9lcG9jX3BlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybV9lcG9jX3BlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZXBvY3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1fZXBvY19wZSAiJCh0ZGlyX2FybXBlKSIKLWVhcm1wZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1wZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1wZSAiJCh0ZGlyX2FybXBlKSIKLWVjb2ZmX3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2NvZmZfc3BhcmMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NwYXJjY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gY29mZl9zcGFyYyAiJCh0ZGlyX2NvZmZfc3BhcmMpIgotZWQxMHZlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDEwdmVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDEwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDEwdmVsZiAiJCh0ZGlyX2QxMHYpIgotZWQzMHZlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdmVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDMwdmVsZiAiJCh0ZGlyX2QzMHYpIgotZWQzMHZfby5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMzB2X28uc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQzMHZfbyAiJCh0ZGlyX2QzMHYpIgotZWQzMHZfZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMzB2X2Uuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQzMHZfZSAiJCh0ZGlyX2QzMHYpIgotZWRlbHRhNjguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZGVsdGE2OC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZGVsdGE2OC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZGVsdGE2OCAiJCh0ZGlyX2RlbHRhNjgpIgotZWVibW9uMjlrLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VibW9uMjlrLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lYm1vbjI5ay5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWJtb24yOWsgIiQodGRpcl9lYm1vbjI5aykiCi1lZWxmMzJmcjMwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyZnIzMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJmcjMwICIkKHRkaXJfZnIzMCkiCi1lZWxmMzJtY29yZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMm1jb3JlICIkKHRkaXJfbWNvcmUpIgotZW0zMnJlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTMycmVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtMzJyZWxmICIkKHRkaXJfbTMycikiCi1lZWxmMzJfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyX3NwYXJjICIkKHRkaXJfZWxmMzJfc3BhcmMpIgotZWVsZjMyX2k5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJfaTk2MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJfaTk2MCAiJCh0ZGlyX2VsZjMyX2k5NjApIgotZWVsZjMyYjQzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJiNDMwMCAiJCh0ZGlyX2VsZjMyYjQzMDApIgotZWVsZjMyYm1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmJtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYm1pcCAiJCh0ZGlyX2VsZjMyYm1pcCkiCi1lZWxmMzJic21pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmJzbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmJzbWlwICIkKHRkaXJfZWxmMzJic21pcCkiCi1lZWxmMzJlYm1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmVibWlwICIkKHRkaXJfZWxmMzJlYm1pcCkiCi1lZWxmMzJlbG1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmVsbWlwICIkKHRkaXJfZWxmMzJlbG1pcCkiCi1lZWxmMzJibWlwbjMyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYm1pcG4zMi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJibWlwbjMyICIkKHRkaXJfZWxmMzJibWlwbjMyKSIKLWVlbGYzMmw0MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybDQzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybDQzMDAgIiQodGRpcl9lbGYzMmw0MzAwKSIKLWVlbGYzMmxtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmxtaXAgIiQodGRpcl9lbGYzMmxtaXApIgotZWVsZjMybHBwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmxwcGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybHBwYyAiJCh0ZGlyX2VsZjMybHBwYykiCi1lZWxmMzJsc21pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmxzbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmxzbWlwICIkKHRkaXJfZWxmMzJsc21pcCkiCi1lZWxmMzJwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJwcGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMycHBjICIkKHRkaXJfZWxmMzJwcGMpIgotZWVsZjMycHBjbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJwcGNsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZnBwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJwcGNsaW51eCAiJCh0ZGlyX2VsZjMycHBjbGludXgpIgotZWVsZjY0YWxwaGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRhbHBoYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmNjRhbHBoYSAiJCh0ZGlyX2VsZjY0YWxwaGEpIgotZWVsZjY0aHBwYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGY2NGhwcGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0aHBwYSAiJCh0ZGlyX2VsZjY0aHBwYSkiCi1lZWxmNjRfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0X3NwYXJjICIkKHRkaXJfZWxmNjRfc3BhcmMpIgotZWVsZjY0Ym1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGY2NGJtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0Ym1pcCAiJCh0ZGlyX2VsZjY0Ym1pcCkiCi1lZWxmX2kzODYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmX2kzODYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZl9pMzg2ICIkKHRkaXJfZWxmX2kzODYpIgotZWVsZl9pMzg2X2JlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGZfaTM4Nl9iZSAiJCh0ZGlyX2VsZl9pMzg2X2JlKSIKLWVnbGQ5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ2xkOTYwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nbGQ5NjAuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGdsZDk2MCAiJCh0ZGlyX2dsZDk2MCkiCi1lZ2xkOTYwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nbGQ5NjBjLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBnbGQ5NjBjb2ZmICIkKHRkaXJfZ2xkOTYwY29mZikiCi1laDgzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMCAiJCh0ZGlyX2g4MzAwKSIKLWVoODMwMGguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDBoLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMGguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4MzAwaCAiJCh0ZGlyX2g4MzAwaCkiCi1laDgzMDBzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMHMgIiQodGRpcl9oODMwMHMpIgotZWg4NTAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDAgIiQodGRpcl9oODUwMCkiCi1laDg1MDBiLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwYi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBiLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMGIgIiQodGRpcl9oODUwMGIpIgotZWg4NTAwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBjICIkKHRkaXJfaDg1MDBjKSIKLWVoODUwMG0uYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBtLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMG0uc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwbSAiJCh0ZGlyX2g4NTAwbSkiCi1laDg1MDBzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMHMgIiQodGRpcl9oODUwMHMpIgotZWhwMzAwYnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwMzAwYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBocDMwMGJzZCAiJCh0ZGlyX2hwMzAwYnNkKSIKLWVocDNocHV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwM2hwdXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGhwM2hwdXggIiQodGRpcl9ocDNocHV4KSIKLWVocHBhZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwcGFlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2hwcGFlbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2hwcGFlbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGhwcGFlbGYgIiQodGRpcl9ocHBhZWxmKSIKLWVpMzg2YW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmFvdXQgIiQodGRpcl9pMzg2YW91dCkiCi1laTM4NmJlb3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2Jlb3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZiZW9zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2YmVvcyAiJCh0ZGlyX2kzODZiZW9zKSIKLWVpMzg2YnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZic2QgIiQodGRpcl9pMzg2YnNkKSIKLWVpMzg2Y29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2Y29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZjb2ZmICIkKHRkaXJfaTM4NmNvZmYpIgotZWkzODZnbzMyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZnbzMyLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmdvMzIgIiQodGRpcl9pMzg2Z28zMikiCi1laTM4NmxpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZsaW51eCAiJCh0ZGlyX2kzODZsaW51eCkiCi1laTM4Nmx5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nmx5bnguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bHlueCAiJCh0ZGlyX2kzODZseW54KSIKLWVpMzg2bWFjaC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bWFjaC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1hY2ggIiQodGRpcl9pMzg2bWFjaCkiCi1laTM4Nm1vc3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1vc3MgIiQodGRpcl9pMzg2bW9zcykiCi1laTM4Nm1zZG9zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bXNkb3MgIiQodGRpcl9pMzg2bXNkb3MpIgotZWkzODZuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bmJzZCAiJCh0ZGlyX2kzODZuYnNkKSIKLWVpMzg2bncuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm53LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbncuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZudyAiJCh0ZGlyX2kzODZudykiCi1laTM4NnBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2cGUgIiQodGRpcl9pMzg2cGUpIgotZWkzODZwZV9wb3NpeC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2cGVfcG9zaXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NnBlX3Bvc2l4ICIkKHRkaXJfaTM4NnBlX3Bvc2l4KSIKLWVsbms5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbG5rOTYwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9sbms5NjAuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGxuazk2MCAiJCh0ZGlyX2xuazk2MCkiCi1lbTY4azRrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrNGtuYnNkICIkKHRkaXJfbTY4azRrbmJzZCkiCi1lbTY4a2FvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGthb3V0ICIkKHRkaXJfbTY4a2FvdXQpIgotZW02OGthdXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2F1eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2F1eCAiJCh0ZGlyX202OGthdXgpIgotZW02OGtjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2NvZmYgIiQodGRpcl9tNjhrY29mZikiCi1lbTY4a2VsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrZWxmICIkKHRkaXJfbTY4a2VsZikiCi1lbTY4a2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtsaW51eCAiJCh0ZGlyX202OGtsaW51eCkiCi1lbTY4a2x5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2x5bnguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGtseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrbHlueCAiJCh0ZGlyX202OGtseW54KSIKLWVtNjhrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a25ic2QgIiQodGRpcl9tNjhrbmJzZCkiCi1lbTY4a3Bzb3MuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wc29zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrcHNvcyAiJCh0ZGlyX202OGtwc29zKSIKLWVtODhrYmNzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL204OGtiY3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL204OGtiY3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG04OGtiY3MgIiQodGRpcl9tODhrYmNzKSIKLWVtY29yZXBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21jb3JlcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWNvcmVwZSAiJCh0ZGlyX21jb3JlcGUpIgotZW1pcHNiaWcuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNiaWcuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNiaWcKLWVtaXBzYnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHNic2Quc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNic2QKLWVtaXBzaWR0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNpZHQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL21pcHNlY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2lkdCAiJCh0ZGlyX21pcHNpZHQpIgotZW1pcHNpZHRsLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNpZHRsLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNpZHRsICIkKHRkaXJfbWlwc2lkdGwpIgotZW1pcHNsaXQuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNsaXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNsaXQgIiQodGRpcl9taXBzbGl0KSIKLWVtaXBzbG5ld3MuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNsbmV3cy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2xuZXdzCi1lbW4xMDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tbjEwMzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtbjEwMzAwICIkKHRkaXJfbW4xMDMwMCkiCi1lbW4xMDIwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tbjEwMjAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtbjEwMjAwICIkKHRkaXJfbW4xMDIwMCkiCi1lbmV3cy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9uZXdzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBuZXdzICIkKHRkaXJfbmV3cykiCi1lbnMzMmtuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL25zMzJrbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbnMzMmtuYnNkICIkKHRkaXJfbnMzMmtuYnNkKSIKLWVwYzUzMm1hY2hhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3BjNTMybWFjaGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBjNTMybWFjaGEgIiQodGRpcl9wYzUzMm1hY2hhKSIKLWVwamVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wamVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcGplbGYgIiQodGRpcl9wamVsZikiCi1lcGpsZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3BqbGVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcGpsZWxmICIkKHRkaXJfcGpsZWxmKSIKLWVwcGNtYWNvcy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNtYWNvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYWl4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9haXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBwY21hY29zICIkKHRkaXJfcHBjbWFjb3MpIgotZXBwY253LmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY253LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbncuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBwY253ICIkKHRkaXJfcHBjbncpIgotZXBwY3BlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY3BlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcHBjcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBwY3BlICIkKHRkaXJfcHBjcGUpIgotZXJpc2NpeC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9yaXNjaXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHJpc2NpeCAiJCh0ZGlyX3Jpc2NpeCkiCi1lc2EyOTIwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zYTI5MjAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zYTI5MjAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzYTI5MjAwICIkKHRkaXJfc2EyOTIwMCkiCi1lc2guYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2guc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NoLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaCAiJCh0ZGlyX3NoKSIKLWVzaGVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2hlbGYgIiQodGRpcl9zaGVsZikiCi1lc2hsZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NobGVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2hsZWxmICIkKHRkaXJfc2hsZWxmKSIKLWVzaGwuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hsLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zaC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2hsICIkKHRkaXJfc2hsKSIKLWVzcGFyY2FvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNhb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY2FvdXQgIiQodGRpcl9zcGFyY2FvdXQpIgotZXNwYXJjbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbGludXggIiQodGRpcl9zcGFyY2xpbnV4KSIKLWVzcGFyY2x5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNseW54LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbHlueCAiJCh0ZGlyX3NwYXJjbHlueCkiCi1lc3BhcmNuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNuYnNkICIkKHRkaXJfc3BhcmNuYnNkKSIKLWVzdDIwMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3QyMDAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zdDIwMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN0MjAwMCAiJCh0ZGlyX3N0MjAwMCkiCi1lc3VuMy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdW4zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9zdW5vcy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3VuMyAiJCh0ZGlyX3N1bjMpIgotZXN1bjQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3VuNC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvc3Vub3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN1bjQgIiQodGRpcl9zdW40KSIKLWV0aWMzMGFvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljMzBhb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHRpYzMwYW91dCAiJCh0ZGlyX3RpYzMwYW91dCkiCi1ldGljMzBjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzMwY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB0aWMzMGNvZmYgIiQodGRpcl90aWMzMGNvZmYpIgotZXRpYzgwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWM4MGNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdGljODBjb2ZmICIkKHRkaXJfdGljODBjb2ZmKSIKLWV2YW5pbGxhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZhbmlsbGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3ZhbmlsbGEuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3ZhbmlsbGEuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHZhbmlsbGEgIiQodGRpcl92YW5pbGxhKSIKLWV2YXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdmF4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2YXggIiQodGRpcl92YXgpIgotZXZzdGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdnN0YS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdnN0YSAiJCh0ZGlyX3ZzdGEpIgotZXY4NTAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdjg1MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3Y4NTAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHY4NTAgIiQodGRpcl92ODUwKSIKLWV3NjUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdzY1LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC93NjUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHc2NSAiJCh0ZGlyX3c2NSkiCi1lejgwMDEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvejgwMDEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3o4MDAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB6ODAwMSAiJCh0ZGlyX3o4MDAxKSIKLWV6ODAwMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy96ODAwMi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvejgwMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHo4MDAyICIkKHRkaXJfejgwMDIpIgotCi1sZF9uZXdfU09VUkNFUyA9IGxkZ3JhbS55IGxkbGV4LmwgbGV4c3VwLmMgbGRsYW5nLmMgbXJpLmMgbGRjdG9yLmMgbGRtYWluLmMgXAotCWxkd3JpdGUuYyBsZGV4cC5jIGxkZW11bC5jIGxkdmVyLmMgbGRtaXNjLmMgbGRmaWxlLmMgbGRjcmVmLmMKLWxkX25ld19ERVBFTkRFTkNJRVMgPSAkKEVNVUxBVElPTl9PRklMRVMpICQoRU1VTF9FWFRSQV9PRklMRVMpICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMREVQUykKLWxkX25ld19MREFERCA9ICQoRU1VTEFUSU9OX09GSUxFUykgJChFTVVMX0VYVFJBX09GSUxFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi0jIFRoZSBnZW5lcmF0ZWQgZW11bGF0aW9uIGZpbGVzIG1vc3RseSBoYXZlIHRoZSBzYW1lIGRlcGVuZGVuY2llcy4KLSQoRU1VTEFUSU9OX09GSUxFUyk6IC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZG1haW4uaCBsZGVtdWwuaCBsZGZpbGUuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRjdG9yLmggbGRleHAuaCBsZGxhbmcuaCBsZGdyYW0uaAotCi0jIFRoaXMgaXMgdGhlIHJlYWwgbGliYmZkLmEgY3JlYXRlZCBieSBsaWJ0b29sLgotVEVTVEJGRExJQiA9IEBURVNUQkZETElCQAotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCXNyY3Jvb3Q9YGNkICQoc3JjZGlyKSAmJiBwd2RgOyBleHBvcnQgc3Jjcm9vdDsgXAotCXI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JRVhQRUNUPSQoRVhQRUNUKTsgZXhwb3J0IEVYUEVDVDsgXAotCWlmIFsgLWYgJCh0b3BfYnVpbGRkaXIpLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCi0JICBUQ0xfTElCUkFSWT1gY2QgJCh0b3Bfc3JjZGlyKS8uLi90Y2wvbGlicmFyeSAmJiBwd2RgOyBcCi0JICBleHBvcnQgVENMX0xJQlJBUlk7IFwKLQlmaTsgXAotCXJ1bnRlc3Q9JChSVU5URVNUKTsgXAotCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICQkcnVudGVzdCAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCR7c3Jjcm9vdH0vdGVzdHN1aXRlIFwKLQkJQ0M9IiQoQ0NfRk9SX1RBUkdFVCkiIENGTEFHUz0iJChDRkxBR1MpIiBcCi0JCUNYWD0iJChDWFhfRk9SX1RBUkdFVCkiIENYWEZMQUdTPSIkKENYWEZMQUdTKSIgXAotCQlDQ19GT1JfSE9TVD0iJChDQykiIENGTEFHU19GT1JfSE9TVD0iJChDRkxBR1MpIiBcCi0JCU9GSUxFUz0iJChPRklMRVMpIiBCRkRMSUI9IiQoVEVTVEJGRExJQikiIFwKLQkJTElCSUJFUlRZPSIkKExJQklCRVJUWSkgJChJTlRMTElCUykiIFwKLQkJJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi0jIFJ1bGVzIGZvciB0ZXN0aW5nIGJ5IHJlbGlua2luZyBsZCBpdHNlbGYuCi0jIEEgc2ltaWxhciB0ZXN0IGlzIGluIHRoZSB0ZXN0c3VpdGUuICBUaGlzIHRhcmdldCBpcyBmb3IgZWFzZSBvZiB1c2UKLSMgd2hlbiBwb3J0aW5nIGxkLgotCi1sZC1wYXJ0aWFsLm86IGxkLW5ldyQoRVhFRVhUKQotCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkLXBhcnRpYWwubyAtciAkKE9GSUxFUykKLWxkMSQoRVhFRVhUKTogbGQtcGFydGlhbC5vCi0JLi9sZC1uZXckKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQxJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSBsZC1wYXJ0aWFsLm8gJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCi0KLWxkMS1mdWxsJChFWEVFWFQpOiBsZC1uZXcKLQkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDEtZnVsbCQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1sZDIkKEVYRUVYVCk6IGxkMSQoRVhFRVhUKQotCS4vbGQxJChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMiQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1sZDMkKEVYRUVYVCk6IGxkMiQoRVhFRVhUKQotCS4vbGQyJChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMyQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1ib290c3RyYXA6IGxkMyQoRVhFRVhUKQotCWNtcCBsZDIkKEVYRUVYVCkgbGQzJChFWEVFWFQpCi0KLS5QSE9OWTogYm9vdHN0cmFwCi0KLSMgQSB0ZXN0IHByb2dyYW0gZm9yIEMrKyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLgotIyBUaGlzIHRlc3QgaXMgbm93IGluIHRoZSB0ZXN0c3VpdGUuCi0jCi0jY2R0ZXN0OiBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gbGQubmV3Ci0jCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdCAkKEhPU1RJTkdfQ1JUMCkgXAotIwkgIGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyAkKEhPU1RJTkdfTElCUykKLSMKLSNjZHRlc3Qub3V0OiBjZHRlc3QKLSMJLi9jZHRlc3QgPiBjZHRlc3QudG1wCi0jCW12IGNkdGVzdC50bXAgY2R0ZXN0Lm91dAotIwotI2NkdGVzdC11ci5vOiBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gbGQubmV3Ci0jCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdC11ci5vIC1VciBjZHRlc3QtbWFpbi5vIFwKLSMJICBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vCi0jCi0jY2R0ZXN0LXVyOiBjZHRlc3QtdXIubwotIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QtdXIgJChIT1NUSU5HX0NSVDApIGNkdGVzdC11ci5vIFwKLSMJICAkKEhPU1RJTkdfTElCUykKLSMKLSNjZHRlc3QtdXIub3V0OiBjZHRlc3QtdXIKLSMJLi9jZHRlc3QtdXIgPiBjZHRlc3QtdXIudG1wCi0jCW12IGNkdGVzdC11ci50bXAgY2R0ZXN0LXVyLm91dAotIwotI2NoZWNrLWNkdGVzdDogY2R0ZXN0Lm91dCBjZHRlc3QtdXIub3V0ICQoc3JjZGlyKS9jZHRlc3QuZXhwCi0jCWRpZmYgJChzcmNkaXIpL2NkdGVzdC5leHAgY2R0ZXN0Lm91dAotIwlkaWZmICQoc3JjZGlyKS9jZHRlc3QuZXhwIGNkdGVzdC11ci5vdXQKLSMKLSMuUEhPTlk6IGNoZWNrLWNkdGVzdAotCi0jIEVORCBPRiBDSEVDSyBUQVJHRVRTCi0KLSMgRE9DVU1FTlRBVElPTiBUQVJHRVRTCi0jIE1hbnVhbCBjb25maWd1cmF0aW9uIGZpbGU7IG5vdCB1c3VhbGx5IGF0dGFjaGVkIHRvIG5vcm1hbCBjb25maWd1cmF0aW9uLAotIyBiZWNhdXNlIGFsbW9zdCBhbGwgY29uZmlncyB1c2UgImdlbiIgdmVyc2lvbiBvZiBtYW51YWwuCi0jICBTZXQgRE9DVkVSIGFib3ZlIHRvIGNoYW5nZS4KLWNvbmZpZ2RvYy50ZXhpOgkke0RPQ1ZFUn0tZG9jLnRleGkKLQlsbiAtcyAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGxuICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgY3AgJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpCi0KLWxkdmVyLnRleGk6IE1ha2VmaWxlCi0Jcm0gLWYgJEAKLQllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiAkQAotCi1sZC5pbmZvOiAkKHNyY2RpcikvbGQudGV4aW5mbyBjb25maWdkb2MudGV4aSBsZHZlci50ZXhpCi0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgLUkgJChCRkRESVIpL2RvYyAkKHNyY2RpcikvbGQudGV4aW5mbwotCi1sZC5kdmk6ICQoc3JjZGlyKS9sZC50ZXhpbmZvIGNvbmZpZ2RvYy50ZXhpIGxkdmVyLnRleGkKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvOiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSIkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgLUkgJChCRkRESVIpL2RvYyIgJChURVhJMkRWSSkgJChzcmNkaXIpL2xkLnRleGluZm8KLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBsZHZlci50ZXhpCi0KLSMgV2Ugd2FudCB0byByZWNvbmZpZ3VyZSBpZiBjb25maWd1cmUuaG9zdCBvciBjb25maWd1cmUudGd0IGNoYW5nZXMuCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdCAkKHNyY2RpcikvY29uZmlndXJlLnRndAotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgbGQxJChFWEVFWFQpIGxkMiQoRVhFRVhUKSBsZDMkKEVYRUVYVCkgXAotCWxkZW11bC1saXN0LmggY3J0YmVnaW4ubyBjcnRlbmQubyBsZC5sb2cgbGQuc3VtCi1tb3N0bHljbGVhbi1sb2NhbDoKLQktcm0gLXJmIHRtcGRpcgotQ0xFQU5GSUxFUyA9IGRlcC5zZWQgREVQIERFUDEKLQotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtbG9jYWwgaW5zdGFsbC1kYXRhLWxvY2FsCi0KLWluc3RhbGwtZXhlYy1sb2NhbDogbGQtbmV3JChFWEVFWFQpCi0JJChta2luc3RhbGxkaXJzKSAkKGJpbmRpcikgJCh0b29sZGlyKS9iaW4KLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQluPWBlY2hvIGxkIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCWlmIFsgIiQoYmluZGlyKS8kJG4kKEVYRUVYVCkiICE9ICIkKHRvb2xkaXIpL2Jpbi9sZCQoRVhFRVhUKSIgXTsgdGhlbiBcCi0JICBybSAtZiAkKHRvb2xkaXIpL2Jpbi9sZCQoRVhFRVhUKTsgXAotCSAgbG4gJChiaW5kaXIpLyQkbiQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi9sZCQoRVhFRVhUKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsIFwKLQkgIHx8ICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pIGxkLW5ldyQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi9sZCQoRVhFRVhUKTsgXAotCWZpCi0KLWluc3RhbGwtZGF0YS1sb2NhbDoKLQkkKG1raW5zdGFsbGRpcnMpICQoc2NyaXB0ZGlyKS9sZHNjcmlwdHMKLQlmb3IgZiBpbiBsZHNjcmlwdHMvKjsgZG8gXAotCSAgJChJTlNUQUxMX0RBVEEpICQkZiAkKHNjcmlwdGRpcikvJCRmIDsgXAotCWRvbmUKLQotIyBTdHVmZiB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhIGRpc3RyaWJ1dGlvbi4gIFRoZSBkaXN0c3R1ZmYKLSMgdGFyZ2V0IGlzIHJ1biBieSB0aGUgdGF6IHRhcmdldCBpbiAuLi9NYWtlZmlsZS5pbi4KLUxERElTVFNUVUZGID0gbGRncmFtLmMgbGRncmFtLmggbGRsZXguYwotZGlzdHN0dWZmOiAkKExERElTVFNUVUZGKSBpbmZvCi0KLURJU1RDTEVBTkZJTEVTID0gdGRpcnMgc2l0ZS5leHAgc2l0ZS5iYWsKLWRpc3RjbGVhbi1sb2NhbDoKLQlybSAtcmYgbGRzY3JpcHRzCi0KLSMgVGFyZ2V0cyB0byByZWJ1aWxkIGRlcGVuZGVuY2llcyBpbiB0aGlzIE1ha2VmaWxlLgotIyBIYXZlIHRvIGdldCByaWQgb2YgREVQMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgotREVQOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKSAkKEdFTkVSQVRFRF9IRklMRVMpIGNvbmZpZy5oCi0Jcm0gLWYgREVQMQotCSQoTUFLRSkgTUtERVA9JChNS0RFUCkgREVQMQotCXNlZCAtZiBkZXAuc2VkIDxERVAxID5ERVAKLQotIyBUaGlzIHJ1bGUgcmVhbGx5IHdhbnRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLURFUDE6ICQoQ0ZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpCi0Jcm0gLWYgREVQMgotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQMgotCSQoTUtERVApIC1mIERFUDIgJChJTkNMVURFUykgJD8KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgREVQMiBERVAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCi0KLWRlcDogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi0uUEhPTlk6IGRlcCBkZXAtaW4gZGVwLWFtCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi0KLWxkY3Rvci5vOiBsZGN0b3IuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkZXhwLmggbGRsYW5nLmggbGRtaXNjLmggbGRncmFtLmggbGRtYWluLmggbGRjdG9yLmgKLWxkZW11bC5vOiBsZGVtdWwuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGRlbXVsLmggXAotICBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZmlsZS5oIGxkbWFpbi5oIGxkZW11bC1saXN0LmgKLWxkZXhwLm86IGxkZXhwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZG1haW4uaCBsZG1pc2MuaCBsZGV4cC5oIGxkZ3JhbS5oIGxkbGFuZy5oCi1sZGZpbGUubzogbGRmaWxlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZmlsZS5oIGxkbWFpbi5oIGxkZ3JhbS5oIFwKLSAgbGRsZXguaCBsZGVtdWwuaAotbGRsYW5nLm86IGxkbGFuZy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYmZkbGluay5oIGxkLmggbGRtYWluLmggXAotICBsZGdyYW0uaCBsZGV4cC5oIGxkbGFuZy5oIGxkZW11bC5oIGxkbGV4LmggbGRtaXNjLmggXAotICBsZGN0b3IuaCBsZGZpbGUuaCAkKElOQ0RJUikvZm5tYXRjaC5oICQoSU5DRElSKS9kZW1hbmdsZS5oCi1sZG1haW4ubzogbGRtYWluLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCAkKElOQ0RJUikvYmZkbGluay5oIGxkLmggbGRtYWluLmggXAotICBsZG1pc2MuaCBsZHdyaXRlLmggbGRncmFtLmggbGRleHAuaCBsZGxhbmcuaCBsZGVtdWwuaCBcCi0gIGxkbGV4LmggbGRmaWxlLmggbGRjdG9yLmgKLWxkbWlzYy5vOiBsZG1pc2MuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9kZW1hbmdsZS5oIGxkLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBcCi0gIGxkZ3JhbS5oIGxkbGV4LmggbGRtYWluLmggbGRmaWxlLmgKLWxkdmVyLm86IGxkdmVyLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBsZC5oIGxkdmVyLmggXAotICBsZGVtdWwuaCBsZG1haW4uaAotbGR3cml0ZS5vOiBsZHdyaXRlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZHdyaXRlLmggXAotICBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaAotbGV4c3VwLm86IGxleHN1cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRncmFtLmggbGRsZXguaCBsZGZpbGUuaCBcCi0gIGxkdmVyLmggbGRlbXVsLmgKLW1yaS5vOiBtcmkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBcCi0gIGxkbWlzYy5oIG1yaS5oIGxkZ3JhbS5oICQoSU5DRElSKS9saWJpYmVydHkuaAotbGRjcmVmLm86IGxkY3JlZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBsZC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkZXhwLmggXAotICBsZGxhbmcuaAotcGUtZGxsLm86IHBlLWRsbC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBsZC5oIGxkZXhwLmggbGRsYW5nLmggbGR3cml0ZS5oIFwKLSAgbGRtaXNjLmggbGRncmFtLmggbGRtYWluLmggbGRlbXVsLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIC4uL2JmZC9saWJjb2ZmLmggZGVmZmlsZS5oIHBlLWRsbC5oCi1sZGdyYW0ubzogbGRncmFtLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZGV4cC5oIGxkdmVyLmggbGRsYW5nLmggbGRlbXVsLmggbGRmaWxlLmggbGRtaXNjLmggXAotICBsZG1haW4uaCBtcmkuaCBsZGN0b3IuaCBsZGxleC5oCi1sZGxleC5vOiBsZGxleC5jIC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgbGQuaCBsZGdyYW0uaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZmlsZS5oIGxkbGV4LmggXAotICBsZG1haW4uaAotZGVmZmlsZXAubzogZGVmZmlsZXAuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAuLi9iZmQvYmZkLmggc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gIGxkLmggbGRtaXNjLmggZGVmZmlsZS5oCi0KLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQpkaWZmIC0tZ2l0IGEvbGQvTWFrZWZpbGUuaW4gYi9sZC9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1MzZkZC4uMDAwMDAwMAotLS0gYS9sZC9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE1ODcgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQVMgPSBAQVNACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVNVUxBVElPTl9MSUJQQVRIID0gQEVNVUxBVElPTl9MSUJQQVRIQAotRVhFRVhUID0gQEVYRUVYVEAKLUVYRUVYVF9GT1JfQlVJTEQgPSBARVhFRVhUX0ZPUl9CVUlMREAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSERFRklORVMgPSBASERFRklORVNACi1JTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTEQgPSBATERACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5BVElWRV9MSUJfRElSUyA9IEBOQVRJVkVfTElCX0RJUlNACi1OTSA9IEBOTUAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVNUUklOR0lGWSA9IEBTVFJJTkdJRllACi1VU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKLVVTRV9OTFMgPSBAVVNFX05MU0AKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRSA9IEBVU0VfU1lNQk9MX1VOREVSU0NPUkVACi1WRVJTSU9OID0gQFZFUlNJT05ACi1sID0gQGxACi0KLUlOVExMSUJTID0gQElOVExMSUJTQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzIGRlamFnbnUKLQotU1VCRElSUyA9IHBvCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKLQotWUFDQyA9IGBpZiBbIC1mIC4uL2Jpc29uL2Jpc29uIF07IHRoZW4gZWNobyAuLi9iaXNvbi9iaXNvbiAteSAtTCQoc3JjZGlyKS8uLi9iaXNvbi87IGVsc2UgZWNobyBAWUFDQ0A7IGZpYAotWUZMQUdTID0gLWQKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdOyB0aGVuIGVjaG8gLi4vZmxleC9mbGV4OyBlbHNlIGVjaG8gQExFWEA7IGZpYAotCi0jIFdlIHB1dCB0aGUgc2NyaXB0cyBpbiB0aGUgZGlyZWN0b3J5ICQoc2NyaXB0ZGlyKS9sZHNjcmlwdHMuCi0jIFdlIGNhbid0IHB1dCB0aGUgc2NyaXB0cyBpbiAkKGRhdGFkaXIpIGJlY2F1c2UgdGhlIFNFQVJDSF9ESVIKLSMgZGlyZWN0aXZlcyBuZWVkIHRvIGJlIGRpZmZlcmVudCBmb3IgbmF0aXZlIGFuZCBjcm9zcyBsaW5rZXJzLgotc2NyaXB0ZGlyID0gJCh0b29sZGlyKS9saWIKLQotRU1VTCA9IEBFTVVMQAotRU1VTEFUSU9OX09GSUxFUyA9IEBFTVVMQVRJT05fT0ZJTEVTQAotRU1VTF9FWFRSQV9PRklMRVMgPSBARU1VTF9FWFRSQV9PRklMRVNACi0KLSMgU2VhcmNoIHBhdGggdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGggZm9yIC1sZm9vIGxpYnJhcmllcy4KLSMgSWYgTElCX1BBVEggaXMgZW1wdHksIHRoZSBvbmVzIGluIHRoZSBzY3JpcHQgKGlmIGFueSkgYXJlIGxlZnQgYWxvbmUuCi0jIChUaGUgZGVmYXVsdCBpcyB1c3VhbGx5IC9saWI6L3Vzci9saWI6L3Vzci9sb2NhbC9saWIsIHVubGVzcyBidWlsZGluZwotIyBhIGNyb3NzLWxpbmtlciwgaW4gd2hpY2ggY2FzZSB0aGUgZGVmYXVsdCBpcyBlbXB0eS4gIFNlZSBnZW5zY3JpcHRzLnNoLikKLSMgT3RoZXJ3aXNlLCB0aGV5IGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbmVzIGdpdmVuIGluIExJQl9QQVRILAotIyB3aGljaCBtYXkgaGF2ZSB0aGUgZm9ybTogTElCX1BBVEg9L2xpYjovdXNyL2xvY2FsL2xpYgotTElCX1BBVEggPSAKLQotQkFTRURJUiA9ICQoc3JjZGlyKS8uLgotQkZERElSID0gJChCQVNFRElSKS9iZmQKLUlOQ0RJUiA9ICQoQkFTRURJUikvaW5jbHVkZQotTUtERVAgPSBta2RlcAotCi0jIFdoYXQgdmVyc2lvbiBvZiB0aGUgbWFudWFsIHRvIGJ1aWxkCi1ET0NWRVIgPSBnZW4KLQotI3N0dWZmIGZvciBzZWxmIGhvc3RpbmcgKGNhbiBiZSBvdmVycmlkZGVuIGluIGNvbmZpZyBmaWxlKS4KLUhPU1RJTkdfQ1JUMCA9IEBIT1NUSU5HX0NSVDBACi1IT1NUSU5HX0xJQlMgPSBASE9TVElOR19MSUJTQAotSE9TVElOR19FTVUgPSAtbSAkKEVNVUwpCi0KLSMgU2V0dXAgdGhlIHRlc3RpbmcgZnJhbWV3b3JrLCBpZiB5b3UgaGF2ZSBvbmUKLUVYUEVDVCA9IGBpZiBbIC1mICQkci8uLi9leHBlY3QvZXhwZWN0IF0gOyBcCi0JdGhlbiBlY2hvICQkci8uLi9leHBlY3QvZXhwZWN0IDsgXAotCWVsc2UgZWNobyBleHBlY3QgOyBmaWAKLQotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3Jjcm9vdH0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyBcCi0JdGhlbiBlY2hvICQke3NyY3Jvb3R9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKLQllbHNlIGVjaG8gcnVudGVzdCA7IGZpYAotCi0KLVJVTlRFU1RGTEFHUyA9IAotCi1DQ19GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0KLUNYWCA9IGdjYwotQ1hYX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDWFgpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGxkLW5ldwotaW5mb19URVhJTkZPUyA9IGxkLnRleGluZm8KLW5vaW5zdF9URVhJTkZPUyA9IGxkaW50LnRleGluZm8KLW1hbl9NQU5TID0gbGQuMQotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChCRkRESVIpIC1JJChJTkNESVIpIC1JJCh0b3Bfc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAkKEhERUZJTkVTKSAkKENGTEFHUykgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1CRkRMSUIgPSAuLi9iZmQvbGliYmZkLmxhCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotQUxMX0VNVUxBVElPTlMgPSBcCi0JZWEyOWsubyBcCi0JZWFpeHBwYy5vIFwKLQllYWl4cnM2Lm8gXAotCWVhbHBoYS5vIFwKLQllYXJjZWxmLm8gXAotCWVhcm1lbGYubyBcCi0JZWFybWVsZl9vYWJpLm8gXAotCWVhcm1lbGZfbGludXgubyBcCi0JZWFybWVsZl9saW51eDI2Lm8gXAotCWVhcm1hb3V0Yi5vIFwKLQllYXJtYW91dGwubyBcCi0JZWFybWNvZmYubyBcCi0JZWFybW5ic2QubyBcCi0JZWFybXBlLm8gXAotCWVhcm1fZXBvY19wZS5vIFwKLQllY29mZl9zcGFyYy5vIFwKLQllZDEwdmVsZi5vIFwKLQllZDMwdmVsZi5vIFwKLQllZDMwdl9lLm8gXAotCWVkMzB2X28ubyBcCi0JZWRlbHRhNjgubyBcCi0JZWVibW9uMjlrLm8gXAotCWVlbGYzMl9zcGFyYy5vIFwKLQllZWxmMzJfaTk2MC5vIFwKLQllZWxmMzJiNDMwMC5vIFwKLQllZWxmMzJibWlwLm8gXAotCWVlbGYzMmVibWlwLm8gXAotCWVlbGYzMmVsbWlwLm8gXAotCWVlbGYzMmJtaXBuMzIubyBcCi0JZWVsZjMybDQzMDAubyBcCi0JZWVsZjMybG1pcC5vIFwKLQllZWxmMzJscHBjLm8gXAotCWVlbGYzMnBwYy5vIFwKLQllZWxmMzJwcGNsaW51eC5vIFwKLQllZWxmX2kzODYubyBcCi0JZWVsZl9pMzg2X2JlLm8gXAotCWVnbGQ5NjAubyBcCi0JZWdsZDk2MGNvZmYubyBcCi0JZWVsZjMyZnIzMC5vIFwKLQllZWxmMzJtY29yZS5vIFwKLQllaDgzMDAubyBcCi0JZWg4MzAwaC5vIFwKLQllaDgzMDBzLm8gXAotCWVoODUwMC5vIFwKLQllaDg1MDBiLm8gXAotCWVoODUwMGMubyBcCi0JZWg4NTAwbS5vIFwKLQllaDg1MDBzLm8gXAotCWVocDMwMGJzZC5vIFwKLQllaHAzaHB1eC5vIFwKLQllaHBwYWVsZi5vIFwKLQllaTM4NmFvdXQubyBcCi0JZWkzODZiZW9zLm8gXAotCWVpMzg2YnNkLm8gXAotCWVpMzg2Y29mZi5vIFwKLQllaTM4NmdvMzIubyBcCi0JZWkzODZsaW51eC5vIFwKLQllaTM4Nmx5bngubyBcCi0JZWkzODZtYWNoLm8gXAotCWVpMzg2bW9zcy5vIFwKLQllaTM4Nm1zZG9zLm8gXAotCWVpMzg2bmJzZC5vIFwKLQllaTM4Nm53Lm8gXAotCWVpMzg2cGUubyBcCi0JZWkzODZwZV9wb3NpeC5vIFwKLQllbG5rOTYwLm8gXAotCWVtNjhrNGtuYnNkLm8gXAotCWVtNjhrYW91dC5vIFwKLQllbTY4a2F1eC5vIFwKLQllbTY4a2NvZmYubyBcCi0JZW02OGtlbGYubyBcCi0JZW02OGtsaW51eC5vIFwKLQllbTY4a2x5bngubyBcCi0JZW02OGtuYnNkLm8gXAotCWVtNjhrcHNvcy5vIFwKLQllbTg4a2Jjcy5vIFwKLQllbWNvcmVwZS5vIFwKLQllbWlwc2JpZy5vIFwKLQllbWlwc2JzZC5vIFwKLQllbWlwc2lkdC5vIFwKLQllbWlwc2lkdGwubyBcCi0JZW1pcHNsaXQubyBcCi0JZW1pcHNsbmV3cy5vIFwKLQllbmV3cy5vIFwKLQllcGplbGYubyBcCi0JZXBqbGVsZi5vIFwKLQllbnMzMmtuYnNkLm8gXAotCWVwYzUzMm1hY2hhLm8gXAotCWVwcGNtYWNvcy5vIFwKLQllcHBjbncubyBcCi0JZXBwY3BlLm8gXAotCWVyaXNjaXgubyBcCi0JZXNhMjkyMDAubyBcCi0JZXNoLm8gXAotCWVzaGVsZi5vIFwKLQllc2hsZWxmLm8gXAotCWVzaGwubyBcCi0JZXNwYXJjYW91dC5vIFwKLQllc3BhcmNsaW51eC5vIFwKLQllc3BhcmNseW54Lm8gXAotCWVzcGFyY25ic2QubyBcCi0JZXN0MjAwMC5vIFwKLQllc3VuMy5vIFwKLQllc3VuNC5vIFwKLQlldGljMzBhb3V0Lm8gXAotCWV0aWMzMGNvZmYubyBcCi0JZXRpYzgwY29mZi5vIFwKLQlldmFuaWxsYS5vIFwKLQlldmF4Lm8gXAotCWV2c3RhLm8gXAotCWV3NjUubyBcCi0JZXo4MDAxLm8gXAotCWV6ODAwMi5vCi0KLQotQUxMXzY0X0VNVUxBVElPTlMgPSBcCi0JZWVsZjY0X3NwYXJjLm8gXAotCWVlbGY2NGFscGhhLm8gXAotCWVlbGY2NGJtaXAubyBcCi0JZWVsZjY0aHBwYS5vCi0KLQotQUxMX0VNVUxfRVhUUkFfT0ZJTEVTID0gXAotCXBlLWRsbC5vIFwKLQlkZWZmaWxlcC5vCi0KLQotQ0ZJTEVTID0gbGRjdG9yLmMgbGRlbXVsLmMgbGRleHAuYyBsZGZpbGUuYyBsZGxhbmcuYyBcCi0JbGRtYWluLmMgbGRtaXNjLmMgbGR2ZXIuYyBsZHdyaXRlLmMgbGV4c3VwLmMgXAotCW1yaS5jIGxkY3JlZi5jIHBlLWRsbC5jCi0KLQotSEZJTEVTID0gbGQuaCBsZGN0b3IuaCBsZGVtdWwuaCBsZGV4cC5oIGxkZmlsZS5oIFwKLQlsZGxhbmcuaCBsZGxleC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkdmVyLmggXAotCWxkd3JpdGUuaCBtcmkuaCBkZWZmaWxlLmggcGUtZGxsLmgKLQotCi1HRU5FUkFURURfQ0ZJTEVTID0gbGRncmFtLmMgbGRsZXguYyBkZWZmaWxlcC5jCi1HRU5FUkFURURfSEZJTEVTID0gbGRncmFtLmggbGRlbXVsLWxpc3QuaCBkZWZmaWxlcC5oCi0KLU9GSUxFUyA9IGxkZ3JhbS5vIGxkbGV4Lm8gbGV4c3VwLm8gbGRsYW5nLm8gbXJpLm8gbGRjdG9yLm8gbGRtYWluLm8gXAotCWxkd3JpdGUubyBsZGV4cC5vICBsZGVtdWwubyBsZHZlci5vIGxkbWlzYy5vIFwKLQlsZGZpbGUubyBsZGNyZWYubyAke0VNVUxBVElPTl9PRklMRVN9ICR7RU1VTF9FWFRSQV9PRklMRVN9Ci0KLQotU1RBR0VTVFVGRiA9ICoubyBsZHNjcmlwdHMvKiBlKi5jCi0KLSMgQXQgdGhlIG1vbWVudCB0aGlzIGlzIGp1c3QgYSBsaXN0IG9mIHRob3NlIGVtdWxhdGlvbiB0ZW1wbGF0ZSBmaWxlcwotIyB0aGF0IGNvbnRhaW4gaW50ZXJuYXRpb25hbGlzZWQgc3RyaW5ncy4KLUVNVUxBVElPTl9GSUxFUyA9IGVtdWx0ZW1wbC9wZS5lbSBlbXVsdGVtcGwvYXJtY29mZi5lbQotCi1QT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChFTVVMQVRJT05fRklMRVMpCi0KLSMgVGhlc2UgYWxsIHN0YXJ0IHdpdGggZSBzbyAnbWFrZSBjbGVhbicgY2FuIGZpbmQgdGhlbS4KLQotR0VOU0NSSVBUUyA9ICQoU0hFTEwpICQoc3JjZGlyKS9nZW5zY3JpcHRzLnNoICR7c3JjZGlyfSAke2xpYmRpcn0gQGhvc3RAIEB0YXJnZXRAIEB0YXJnZXRfYWxpYXNAICJARU1VTEFUSU9OX0xJQlBBVEhAIiAiQE5BVElWRV9MSUJfRElSU0AiCi1HRU5fREVQRU5EUyA9ICQoc3JjZGlyKS9nZW5zY3JpcHRzLnNoIHN0cmluZ2lmeS5zZWQKLQotbGRfbmV3X1NPVVJDRVMgPSBsZGdyYW0ueSBsZGxleC5sIGxleHN1cC5jIGxkbGFuZy5jIG1yaS5jIGxkY3Rvci5jIGxkbWFpbi5jIFwKLQlsZHdyaXRlLmMgbGRleHAuYyBsZGVtdWwuYyBsZHZlci5jIGxkbWlzYy5jIGxkZmlsZS5jIGxkY3JlZi5jCi0KLWxkX25ld19ERVBFTkRFTkNJRVMgPSAkKEVNVUxBVElPTl9PRklMRVMpICQoRU1VTF9FWFRSQV9PRklMRVMpICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMREVQUykKLWxkX25ld19MREFERCA9ICQoRU1VTEFUSU9OX09GSUxFUykgJChFTVVMX0VYVFJBX09GSUxFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi0jIFRoaXMgaXMgdGhlIHJlYWwgbGliYmZkLmEgY3JlYXRlZCBieSBsaWJ0b29sLgotVEVTVEJGRExJQiA9IEBURVNUQkZETElCQAotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IGxkdmVyLnRleGkKLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgbGQxJChFWEVFWFQpIGxkMiQoRVhFRVhUKSBsZDMkKEVYRUVYVCkgXAotCWxkZW11bC1saXN0LmggY3J0YmVnaW4ubyBjcnRlbmQubyBsZC5sb2cgbGQuc3VtCi0KLUNMRUFORklMRVMgPSBkZXAuc2VkIERFUCBERVAxCi0KLSMgU3R1ZmYgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYSBkaXN0cmlidXRpb24uICBUaGUgZGlzdHN0dWZmCi0jIHRhcmdldCBpcyBydW4gYnkgdGhlIHRheiB0YXJnZXQgaW4gLi4vTWFrZWZpbGUuaW4uCi1MRERJU1RTVFVGRiA9IGxkZ3JhbS5jIGxkZ3JhbS5oIGxkbGV4LmMKLQotRElTVENMRUFORklMRVMgPSB0ZGlycyBzaXRlLmV4cCBzaXRlLmJhawotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAKLW5vaW5zdF9QUk9HUkFNUyA9ICBsZC1uZXckKEVYRUVYVCkKLVBST0dSQU1TID0gICQobm9pbnN0X1BST0dSQU1TKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1sZF9uZXdfT0JKRUNUUyA9ICBsZGdyYW0ubyBsZGxleC5vIGxleHN1cC5vIGxkbGFuZy5vIG1yaS5vIGxkY3Rvci5vIFwKLWxkbWFpbi5vIGxkd3JpdGUubyBsZGV4cC5vIGxkZW11bC5vIGxkdmVyLm8gbGRtaXNjLm8gbGRmaWxlLm8gbGRjcmVmLm8KLWxkX25ld19MREZMQUdTID0gCi1MRVhfT1VUUFVUX1JPT1QgPSBATEVYX09VVFBVVF9ST09UQAotTEVYTElCID0gQExFWExJQkAKLUNGTEFHUyA9IEBDRkxBR1NACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGxkLmluZm8KLURWSVMgPSBsZC5kdmkKLVRFWElORk9TID0gbGQudGV4aW5mbwotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1NQU5TID0gJChtYW5fTUFOUykKLQotTlJPRkYgPSBucm9mZgotRElTVF9DT01NT04gPSAgUkVBRE1FIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gXAotTkVXUyBUT0RPIGFjaW5jbHVkZS5tNCBhY2xvY2FsLm00IGNvbmZpZy5pbiBjb25maWd1cmUgY29uZmlndXJlLmluIFwKLWxkZ3JhbS5jIGxkbGV4LmMKLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSBndGFyCi1HWklQX0VOViA9IC0tYmVzdAotU09VUkNFUyA9ICQobGRfbmV3X1NPVVJDRVMpCi1PQkpFQ1RTID0gJChsZF9uZXdfT0JKRUNUUykKLQotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLlMgLmMgLmR2aSAuaW5mbyAubCAubG8gLm8gLnBzIC5zIC50ZXhpIC50ZXhpbmZvIC50eGkgLnkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci0KLW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQktdGVzdCAteiAiJChub2luc3RfUFJPR1JBTVMpIiB8fCBybSAtZiAkKG5vaW5zdF9QUk9HUkFNUykKLQotZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi1tYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1sZC1uZXckKEVYRUVYVCk6ICQobGRfbmV3X09CSkVDVFMpICQobGRfbmV3X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgbGQtbmV3JChFWEVFWFQpCi0JJChMSU5LKSAkKGxkX25ld19MREZMQUdTKSAkKGxkX25ld19PQkpFQ1RTKSAkKGxkX25ld19MREFERCkgJChMSUJTKQotLmwuYzoKLQkkKExFWCkgJChBTV9MRkxBR1MpICQoTEZMQUdTKSAkPCAmJiBtdiAkKExFWF9PVVRQVVRfUk9PVCkuYyAkQAotLnkuYzoKLQkkKFlBQ0MpICQoQU1fWUZMQUdTKSAkKFlGTEFHUykgJDwgJiYgbXYgeS50YWIuYyAkKi5jCi0JaWYgdGVzdCAtZiB5LnRhYi5oOyB0aGVuIFwKLQlpZiBjbXAgLXMgeS50YWIuaCAkKi5oOyB0aGVuIHJtIC1mIHkudGFiLmg7IGVsc2UgbXYgeS50YWIuaCAkKi5oOyBmaTsgXAotCWVsc2UgOjsgZmkKLWxkZ3JhbS5oOiBsZGdyYW0uYwotCi0KLWxkLmluZm86IGxkLnRleGluZm8KLWxkLmR2aTogbGQudGV4aW5mbwotCi0KLURWSVBTID0gZHZpcHMKLQotLnRleGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udGV4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udHhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLS5kdmkucHM6Ci0JJChEVklQUykgJDwgLW8gJEAKLQotaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCi0JQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCi0JICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCi0JICAgIGVsc2UgOiA7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCUAkKFBPU1RfSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBsaXN0PSckKElORk9fREVQUyknOyBcCi0JICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAotCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCi0JICBkb25lOyBcCi0JZWxzZSA6IDsgZmkKLQotdW5pbnN0YWxsLWluZm86Ci0JJChQUkVfVU5JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlpPXllczsgXAotCWVsc2UgaWk9OyBmaTsgXAotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgLXogIiRpaSIgXAotCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKLQlkb25lCi0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKLQlkb25lCi0KLWRpc3QtaW5mbzogJChJTkZPX0RFUFMpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tYW1pbmZvOgotCS1ybSAtZiBsZC5hdXggbGQuY3AgbGQuY3BzIGxkLmR2aSBsZC5mbiBsZC5mbnMgbGQua3kgbGQua3lzIGxkLnBzIFwKLQkgIGxkLmxvZyBsZC5wZyBsZC50b2MgbGQudHAgbGQudHBzIGxkLnZyIGxkLnZycyBsZC5vcCBsZC50ciBcCi0JICBsZC5jdiBsZC5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLQotaW5zdGFsbC1tYW4xOgotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobWFuMWRpcikKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAotCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotCi11bmluc3RhbGwtbWFuMToKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLWluc3RhbGwtbWFuOiAkKE1BTlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1tYW4xCi11bmluc3RhbGwtbWFuOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLW1hbjEKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCi0KLURFSkFUT09MID0gJChQQUNLQUdFKQotCi1SVU5URVNUREVGQVVMVEZMQUdTID0gLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQkc3JjZGlyCi1zaXRlLmV4cDogTWFrZWZpbGUKLQlAZWNobyAnTWFraW5nIGEgbmV3IHNpdGUuZXhwIGZpbGUuLi4nCi0JQHRlc3QgISAtZiBzaXRlLmJhayB8fCBybSAtZiBzaXRlLmJhawotCUBlY2hvICcjIyB0aGVzZSB2YXJpYWJsZXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IG1ha2UgIyMnID4gJEAtdAotCUBlY2hvICcjIERvIG5vdCBlZGl0IGhlcmUuICBJZiB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGVzZSB2YWx1ZXMnID4+ICRALXQKLQlAZWNobyAnIyBlZGl0IHRoZSBsYXN0IHNlY3Rpb24nID4+ICRALXQKLQlAZWNobyAnc2V0IHRvb2wgJChERUpBVE9PTCknID4+ICRALXQKLQlAZWNobyAnc2V0IHNyY2RpciAkKHNyY2RpciknID4+ICRALXQKLQlAZWNobyAnc2V0IG9iamRpcicgYHB3ZGAgPj4gJEAtdAotCUBlY2hvICdzZXQgaG9zdF9hbGlhcyAkKGhvc3RfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBob3N0X3RyaXBsZXQgJChob3N0X3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0YXJnZXRfYWxpYXMgJCh0YXJnZXRfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0YXJnZXRfdHJpcGxldCAkKHRhcmdldF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfYWxpYXMgJChidWlsZF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IGJ1aWxkX3RyaXBsZXQgJChidWlsZF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICcjIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBEbyBOb3QgRWRpdCAjIycgPj4gJEAtdAotCUB0ZXN0ICEgLWYgc2l0ZS5leHAgfHwgc2VkICcxLC9eIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUuKiMjLyBkJyBzaXRlLmV4cCA+PiAkQC10Ci0JQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBtdiBzaXRlLmV4cCBzaXRlLmJhawotCUBtdiAkQC10IHNpdGUuZXhwCi1pbmZvLWFtOiAkKElORk9fREVQUykKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06ICQoRFZJUykKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stREVKQUdOVQotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbGNoZWNrLWFtOgotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi1hbGwtcmVjdXJzaXZlLWFtOiBjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWV4ZWMtbG9jYWwKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuIGluc3RhbGwtZGF0YS1sb2NhbAotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbWFuCi11bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKLWFsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgJChNQU5TKSBjb25maWcuaAotYWxsLXJlZGlyZWN0OiBhbGwtcmVjdXJzaXZlLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQkkKG1raW5zdGFsbGRpcnMpICAkKERFU1RESVIpJChtYW5kaXIpL21hbjEKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCi0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAibGRsZXhsbGRncmFtaGxkZ3JhbWMkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgbGRsZXhsIGxkZ3JhbWggbGRncmFtYyAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1oZHIgbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi1hbWluZm8gbW9zdGx5Y2xlYW4tdGFncyBtb3N0bHljbGVhbi1nZW5lcmljIFwKLQkJbW9zdGx5Y2xlYW4tbG9jYWwKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogIGNsZWFuLWhkciBjbGVhbi1ub2luc3RQUk9HUkFNUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi1hbWluZm8gY2xlYW4tdGFncyBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1yZWN1cnNpdmUKLQotZGlzdGNsZWFuLWFtOiAgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVMgZGlzdGNsZWFuLWNvbXBpbGUgXAotCQlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi10YWdzIFwKLQkJZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0gZGlzdGNsZWFuLWxvY2FsCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JCW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgXAotCQltYWludGFpbmVyLWNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVMgZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLWNsZWFuLW5vaW5zdFBST0dSQU1TIG1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotbW9zdGx5Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tY29tcGlsZSBjbGVhbi1jb21waWxlIFwKLW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJ0b29sIFwKLWNsZWFuLWxpYnRvb2wgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIGluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtaW5mbyBcCi1tb3N0bHljbGVhbi1hbWluZm8gZGlzdGNsZWFuLWFtaW5mbyBjbGVhbi1hbWluZm8gXAotbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gaW5zdGFsbC1tYW4xIHVuaW5zdGFsbC1tYW4xIGluc3RhbGwtbWFuIFwKLXVuaW5zdGFsbC1tYW4gaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAotaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIFwKLWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi10YWdzIFwKLWRpc3RjbGVhbi10YWdzIGNsZWFuLXRhZ3MgbWFpbnRhaW5lci1jbGVhbi10YWdzIGRpc3RkaXIgY2hlY2stREVKQUdOVSBcCi1pbmZvLWFtIGluZm8gZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIFwKLWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtbG9jYWwgXAotaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEtbG9jYWwgaW5zdGFsbC1kYXRhLWFtIFwKLWluc3RhbGwtZGF0YSBpbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBhbGwtcmVkaXJlY3QgXAotYWxsLWFtIGFsbCBpbnN0YWxsZGlycy1hbSBpbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIFwKLWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIFwKLW1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotbGRtYWluLm86IGxkbWFpbi5jIGNvbmZpZy5zdGF0dXMKLQkkKENPTVBJTEUpIC1jIC1EREVGQVVMVF9FTVVMQVRJT049JyIkKEVNVUwpIicgLURTQ1JJUFRESVI9JyIkKHNjcmlwdGRpcikiJyAtRFRBUkdFVD0nIkB0YXJnZXRAIicgJChzcmNkaXIpL2xkbWFpbi5jCi0KLWxkZW11bC1saXN0Lmg6IE1ha2VmaWxlCi0JKGVjaG8gIi8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gIERPIE5PVCBFRElUISAqLyI7XAotCWZvciBmIGluIGBlY2hvICIgIiAke0VNVUxBVElPTl9PRklMRVN9ICIiIFwKLQkgfCBzZWQgLWUgJ3MvIGUvIGxkL2cnIC1lICdzLyBsZC8gL2cnIC1lICdzL1suXW8vL2cnYDsgZG8gXAotCSAgICBlY2hvICJleHRlcm4gbGRfZW11bGF0aW9uX3hmZXJfdHlwZSBsZF8kJHtmfV9lbXVsYXRpb247IjsgXAotCWRvbmU7XAotCWVjaG8gIiI7XAotCWVjaG8gIiNkZWZpbmUgRU1VTEFUSU9OX0xJU1QgXFwiO1wKLQlmb3IgZiBpbiBgZWNobyAiICIgJHtFTVVMQVRJT05fT0ZJTEVTfSAiIiBcCi0JIHwgc2VkIC1lICdzLyBlLyBsZC9nJyAtZSAncy8gbGQvIC9nJyAtZSAncy9bLl1vLy9nJ2A7IGRvIFwKLQkgICAgZWNobyAiICAmbGRfJCR7Zn1fZW11bGF0aW9uLCBcXCI7IFwKLQlkb25lO1wKLQllY2hvICIgIDAiKSA+bGRlbXVsLXRtcC5oCi0JbXYgbGRlbXVsLXRtcC5oIGxkZW11bC1saXN0LmgKLQotc3RyaW5naWZ5LnNlZDogJHtzcmNkaXJ9L2VtdWx0ZW1wbC8kKFNUUklOR0lGWSkKLQkgIGNwICR7c3JjZGlyfS9lbXVsdGVtcGwvJChTVFJJTkdJRlkpIHN0cmluZ2lmeS5zZWQKLUBURElSU0AKLQotZWEyOWsuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYTI5ay5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYTI5ay5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYTI5ayAiJCh0ZGlyX2EyOWspIgotZWFpeHBwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9haXhwcGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhaXhwcGMgIiQodGRpcl9haXhwcGMpIgotZWFpeHJzNi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9haXhyczYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhaXhyczYgIiQodGRpcl9haXhyczYpIgotZWFscGhhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FscGhhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hbHBoYS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYWxwaGEgIiQodGRpcl9hbHBoYSkiCi1lYXJjZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FyY2VsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcmNlbGYgIiQodGRpcl9hcmNlbGYpIgotZWFybWVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGYgIiQodGRpcl9hcm1lbGYpIgotZWFybWVsZl9vYWJpLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfb2FiaSAiJCh0ZGlyX2FybWVsZikiCi1lYXJtZWxmX2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9saW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZl9saW51eCAiJCh0ZGlyX2FybWVsZl9saW51eCkiCi1lYXJtZWxmX2xpbnV4MjYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfbGludXgyNiAiJCh0ZGlyX2FybWVsZl9saW51eDI2KSIKLWVhcm1hb3V0Yi5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1hb3V0Yi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtYW91dGIgIiQodGRpcl9hcm1hb3V0YikiCi1lYXJtYW91dGwuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtYW91dGwuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWFvdXRsICIkKHRkaXJfYXJtYW91dGwpIgotZWFybWNvZmYuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtY29mZiAiJCh0ZGlyX2FybWNvZmYpIgotZWFybW5ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtbmJzZCAiJCh0ZGlyX2FybW5ic2QpIgotZWFybV9lcG9jX3BlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybV9lcG9jX3BlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZXBvY3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1fZXBvY19wZSAiJCh0ZGlyX2FybXBlKSIKLWVhcm1wZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1wZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1wZSAiJCh0ZGlyX2FybXBlKSIKLWVjb2ZmX3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2NvZmZfc3BhcmMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NwYXJjY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gY29mZl9zcGFyYyAiJCh0ZGlyX2NvZmZfc3BhcmMpIgotZWQxMHZlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDEwdmVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDEwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDEwdmVsZiAiJCh0ZGlyX2QxMHYpIgotZWQzMHZlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdmVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDMwdmVsZiAiJCh0ZGlyX2QzMHYpIgotZWQzMHZfby5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMzB2X28uc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQzMHZfbyAiJCh0ZGlyX2QzMHYpIgotZWQzMHZfZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMzB2X2Uuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQzMHZfZSAiJCh0ZGlyX2QzMHYpIgotZWRlbHRhNjguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZGVsdGE2OC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZGVsdGE2OC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZGVsdGE2OCAiJCh0ZGlyX2RlbHRhNjgpIgotZWVibW9uMjlrLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VibW9uMjlrLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lYm1vbjI5ay5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWJtb24yOWsgIiQodGRpcl9lYm1vbjI5aykiCi1lZWxmMzJmcjMwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyZnIzMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJmcjMwICIkKHRkaXJfZnIzMCkiCi1lZWxmMzJtY29yZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMm1jb3JlICIkKHRkaXJfbWNvcmUpIgotZW0zMnJlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTMycmVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtMzJyZWxmICIkKHRkaXJfbTMycikiCi1lZWxmMzJfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyX3NwYXJjICIkKHRkaXJfZWxmMzJfc3BhcmMpIgotZWVsZjMyX2k5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJfaTk2MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJfaTk2MCAiJCh0ZGlyX2VsZjMyX2k5NjApIgotZWVsZjMyYjQzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJiNDMwMCAiJCh0ZGlyX2VsZjMyYjQzMDApIgotZWVsZjMyYm1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmJtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYm1pcCAiJCh0ZGlyX2VsZjMyYm1pcCkiCi1lZWxmMzJic21pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmJzbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmJzbWlwICIkKHRkaXJfZWxmMzJic21pcCkiCi1lZWxmMzJlYm1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmVibWlwICIkKHRkaXJfZWxmMzJlYm1pcCkiCi1lZWxmMzJlbG1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmVsbWlwICIkKHRkaXJfZWxmMzJlbG1pcCkiCi1lZWxmMzJibWlwbjMyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYm1pcG4zMi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJibWlwbjMyICIkKHRkaXJfZWxmMzJibWlwbjMyKSIKLWVlbGYzMmw0MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybDQzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybDQzMDAgIiQodGRpcl9lbGYzMmw0MzAwKSIKLWVlbGYzMmxtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmxtaXAgIiQodGRpcl9lbGYzMmxtaXApIgotZWVsZjMybHBwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmxwcGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybHBwYyAiJCh0ZGlyX2VsZjMybHBwYykiCi1lZWxmMzJsc21pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmxzbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmxzbWlwICIkKHRkaXJfZWxmMzJsc21pcCkiCi1lZWxmMzJwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJwcGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMycHBjICIkKHRkaXJfZWxmMzJwcGMpIgotZWVsZjMycHBjbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJwcGNsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZnBwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJwcGNsaW51eCAiJCh0ZGlyX2VsZjMycHBjbGludXgpIgotZWVsZjY0YWxwaGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRhbHBoYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmNjRhbHBoYSAiJCh0ZGlyX2VsZjY0YWxwaGEpIgotZWVsZjY0aHBwYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGY2NGhwcGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0aHBwYSAiJCh0ZGlyX2VsZjY0aHBwYSkiCi1lZWxmNjRfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0X3NwYXJjICIkKHRkaXJfZWxmNjRfc3BhcmMpIgotZWVsZjY0Ym1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGY2NGJtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0Ym1pcCAiJCh0ZGlyX2VsZjY0Ym1pcCkiCi1lZWxmX2kzODYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmX2kzODYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZl9pMzg2ICIkKHRkaXJfZWxmX2kzODYpIgotZWVsZl9pMzg2X2JlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGZfaTM4Nl9iZSAiJCh0ZGlyX2VsZl9pMzg2X2JlKSIKLWVnbGQ5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ2xkOTYwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nbGQ5NjAuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGdsZDk2MCAiJCh0ZGlyX2dsZDk2MCkiCi1lZ2xkOTYwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nbGQ5NjBjLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBnbGQ5NjBjb2ZmICIkKHRkaXJfZ2xkOTYwY29mZikiCi1laDgzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMCAiJCh0ZGlyX2g4MzAwKSIKLWVoODMwMGguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDBoLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMGguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4MzAwaCAiJCh0ZGlyX2g4MzAwaCkiCi1laDgzMDBzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMHMgIiQodGRpcl9oODMwMHMpIgotZWg4NTAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDAgIiQodGRpcl9oODUwMCkiCi1laDg1MDBiLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwYi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBiLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMGIgIiQodGRpcl9oODUwMGIpIgotZWg4NTAwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBjICIkKHRkaXJfaDg1MDBjKSIKLWVoODUwMG0uYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBtLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMG0uc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwbSAiJCh0ZGlyX2g4NTAwbSkiCi1laDg1MDBzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMHMgIiQodGRpcl9oODUwMHMpIgotZWhwMzAwYnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwMzAwYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBocDMwMGJzZCAiJCh0ZGlyX2hwMzAwYnNkKSIKLWVocDNocHV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwM2hwdXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGhwM2hwdXggIiQodGRpcl9ocDNocHV4KSIKLWVocHBhZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwcGFlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2hwcGFlbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2hwcGFlbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGhwcGFlbGYgIiQodGRpcl9ocHBhZWxmKSIKLWVpMzg2YW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmFvdXQgIiQodGRpcl9pMzg2YW91dCkiCi1laTM4NmJlb3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2Jlb3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZiZW9zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2YmVvcyAiJCh0ZGlyX2kzODZiZW9zKSIKLWVpMzg2YnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZic2QgIiQodGRpcl9pMzg2YnNkKSIKLWVpMzg2Y29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2Y29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZjb2ZmICIkKHRkaXJfaTM4NmNvZmYpIgotZWkzODZnbzMyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZnbzMyLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmdvMzIgIiQodGRpcl9pMzg2Z28zMikiCi1laTM4NmxpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZsaW51eCAiJCh0ZGlyX2kzODZsaW51eCkiCi1laTM4Nmx5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nmx5bnguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bHlueCAiJCh0ZGlyX2kzODZseW54KSIKLWVpMzg2bWFjaC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bWFjaC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1hY2ggIiQodGRpcl9pMzg2bWFjaCkiCi1laTM4Nm1vc3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1vc3MgIiQodGRpcl9pMzg2bW9zcykiCi1laTM4Nm1zZG9zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bXNkb3MgIiQodGRpcl9pMzg2bXNkb3MpIgotZWkzODZuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bmJzZCAiJCh0ZGlyX2kzODZuYnNkKSIKLWVpMzg2bncuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm53LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbncuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZudyAiJCh0ZGlyX2kzODZudykiCi1laTM4NnBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2cGUgIiQodGRpcl9pMzg2cGUpIgotZWkzODZwZV9wb3NpeC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2cGVfcG9zaXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NnBlX3Bvc2l4ICIkKHRkaXJfaTM4NnBlX3Bvc2l4KSIKLWVsbms5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbG5rOTYwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9sbms5NjAuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGxuazk2MCAiJCh0ZGlyX2xuazk2MCkiCi1lbTY4azRrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrNGtuYnNkICIkKHRkaXJfbTY4azRrbmJzZCkiCi1lbTY4a2FvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGthb3V0ICIkKHRkaXJfbTY4a2FvdXQpIgotZW02OGthdXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2F1eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2F1eCAiJCh0ZGlyX202OGthdXgpIgotZW02OGtjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2NvZmYgIiQodGRpcl9tNjhrY29mZikiCi1lbTY4a2VsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrZWxmICIkKHRkaXJfbTY4a2VsZikiCi1lbTY4a2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtsaW51eCAiJCh0ZGlyX202OGtsaW51eCkiCi1lbTY4a2x5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2x5bnguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGtseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrbHlueCAiJCh0ZGlyX202OGtseW54KSIKLWVtNjhrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a25ic2QgIiQodGRpcl9tNjhrbmJzZCkiCi1lbTY4a3Bzb3MuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wc29zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrcHNvcyAiJCh0ZGlyX202OGtwc29zKSIKLWVtODhrYmNzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL204OGtiY3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL204OGtiY3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG04OGtiY3MgIiQodGRpcl9tODhrYmNzKSIKLWVtY29yZXBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21jb3JlcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWNvcmVwZSAiJCh0ZGlyX21jb3JlcGUpIgotZW1pcHNiaWcuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNiaWcuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNiaWcKLWVtaXBzYnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHNic2Quc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNic2QKLWVtaXBzaWR0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNpZHQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL21pcHNlY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2lkdCAiJCh0ZGlyX21pcHNpZHQpIgotZW1pcHNpZHRsLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNpZHRsLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNpZHRsICIkKHRkaXJfbWlwc2lkdGwpIgotZW1pcHNsaXQuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNsaXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNsaXQgIiQodGRpcl9taXBzbGl0KSIKLWVtaXBzbG5ld3MuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNsbmV3cy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2xuZXdzCi1lbW4xMDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tbjEwMzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtbjEwMzAwICIkKHRkaXJfbW4xMDMwMCkiCi1lbW4xMDIwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tbjEwMjAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtbjEwMjAwICIkKHRkaXJfbW4xMDIwMCkiCi1lbmV3cy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9uZXdzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBuZXdzICIkKHRkaXJfbmV3cykiCi1lbnMzMmtuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL25zMzJrbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbnMzMmtuYnNkICIkKHRkaXJfbnMzMmtuYnNkKSIKLWVwYzUzMm1hY2hhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3BjNTMybWFjaGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBjNTMybWFjaGEgIiQodGRpcl9wYzUzMm1hY2hhKSIKLWVwamVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wamVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcGplbGYgIiQodGRpcl9wamVsZikiCi1lcGpsZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3BqbGVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gcGpsZWxmICIkKHRkaXJfcGpsZWxmKSIKLWVwcGNtYWNvcy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNtYWNvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYWl4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9haXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBwY21hY29zICIkKHRkaXJfcHBjbWFjb3MpIgotZXBwY253LmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY253LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbncuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBwY253ICIkKHRkaXJfcHBjbncpIgotZXBwY3BlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY3BlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcHBjcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBwY3BlICIkKHRkaXJfcHBjcGUpIgotZXJpc2NpeC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9yaXNjaXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHJpc2NpeCAiJCh0ZGlyX3Jpc2NpeCkiCi1lc2EyOTIwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zYTI5MjAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zYTI5MjAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzYTI5MjAwICIkKHRkaXJfc2EyOTIwMCkiCi1lc2guYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2guc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NoLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaCAiJCh0ZGlyX3NoKSIKLWVzaGVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2hlbGYgIiQodGRpcl9zaGVsZikiCi1lc2hsZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NobGVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2hsZWxmICIkKHRkaXJfc2hsZWxmKSIKLWVzaGwuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hsLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zaC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2hsICIkKHRkaXJfc2hsKSIKLWVzcGFyY2FvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNhb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY2FvdXQgIiQodGRpcl9zcGFyY2FvdXQpIgotZXNwYXJjbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbGludXggIiQodGRpcl9zcGFyY2xpbnV4KSIKLWVzcGFyY2x5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNseW54LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbHlueCAiJCh0ZGlyX3NwYXJjbHlueCkiCi1lc3BhcmNuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNuYnNkICIkKHRkaXJfc3BhcmNuYnNkKSIKLWVzdDIwMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3QyMDAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zdDIwMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN0MjAwMCAiJCh0ZGlyX3N0MjAwMCkiCi1lc3VuMy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdW4zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9zdW5vcy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3VuMyAiJCh0ZGlyX3N1bjMpIgotZXN1bjQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3VuNC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvc3Vub3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN1bjQgIiQodGRpcl9zdW40KSIKLWV0aWMzMGFvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljMzBhb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHRpYzMwYW91dCAiJCh0ZGlyX3RpYzMwYW91dCkiCi1ldGljMzBjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzMwY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB0aWMzMGNvZmYgIiQodGRpcl90aWMzMGNvZmYpIgotZXRpYzgwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWM4MGNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdGljODBjb2ZmICIkKHRkaXJfdGljODBjb2ZmKSIKLWV2YW5pbGxhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZhbmlsbGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3ZhbmlsbGEuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3ZhbmlsbGEuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHZhbmlsbGEgIiQodGRpcl92YW5pbGxhKSIKLWV2YXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdmF4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2YXggIiQodGRpcl92YXgpIgotZXZzdGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdnN0YS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdnN0YSAiJCh0ZGlyX3ZzdGEpIgotZXY4NTAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdjg1MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3Y4NTAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHY4NTAgIiQodGRpcl92ODUwKSIKLWV3NjUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdzY1LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC93NjUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHc2NSAiJCh0ZGlyX3c2NSkiCi1lejgwMDEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvejgwMDEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3o4MDAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB6ODAwMSAiJCh0ZGlyX3o4MDAxKSIKLWV6ODAwMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy96ODAwMi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvejgwMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHo4MDAyICIkKHRkaXJfejgwMDIpIgotCi0jIFRoZSBnZW5lcmF0ZWQgZW11bGF0aW9uIGZpbGVzIG1vc3RseSBoYXZlIHRoZSBzYW1lIGRlcGVuZGVuY2llcy4KLSQoRU1VTEFUSU9OX09GSUxFUyk6IC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZG1haW4uaCBsZGVtdWwuaCBsZGZpbGUuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRjdG9yLmggbGRleHAuaCBsZGxhbmcuaCBsZGdyYW0uaAotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCXNyY3Jvb3Q9YGNkICQoc3JjZGlyKSAmJiBwd2RgOyBleHBvcnQgc3Jjcm9vdDsgXAotCXI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JRVhQRUNUPSQoRVhQRUNUKTsgZXhwb3J0IEVYUEVDVDsgXAotCWlmIFsgLWYgJCh0b3BfYnVpbGRkaXIpLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCi0JICBUQ0xfTElCUkFSWT1gY2QgJCh0b3Bfc3JjZGlyKS8uLi90Y2wvbGlicmFyeSAmJiBwd2RgOyBcCi0JICBleHBvcnQgVENMX0xJQlJBUlk7IFwKLQlmaTsgXAotCXJ1bnRlc3Q9JChSVU5URVNUKTsgXAotCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICQkcnVudGVzdCAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCR7c3Jjcm9vdH0vdGVzdHN1aXRlIFwKLQkJQ0M9IiQoQ0NfRk9SX1RBUkdFVCkiIENGTEFHUz0iJChDRkxBR1MpIiBcCi0JCUNYWD0iJChDWFhfRk9SX1RBUkdFVCkiIENYWEZMQUdTPSIkKENYWEZMQUdTKSIgXAotCQlDQ19GT1JfSE9TVD0iJChDQykiIENGTEFHU19GT1JfSE9TVD0iJChDRkxBR1MpIiBcCi0JCU9GSUxFUz0iJChPRklMRVMpIiBCRkRMSUI9IiQoVEVTVEJGRExJQikiIFwKLQkJTElCSUJFUlRZPSIkKExJQklCRVJUWSkgJChJTlRMTElCUykiIFwKLQkJJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi0jIFJ1bGVzIGZvciB0ZXN0aW5nIGJ5IHJlbGlua2luZyBsZCBpdHNlbGYuCi0jIEEgc2ltaWxhciB0ZXN0IGlzIGluIHRoZSB0ZXN0c3VpdGUuICBUaGlzIHRhcmdldCBpcyBmb3IgZWFzZSBvZiB1c2UKLSMgd2hlbiBwb3J0aW5nIGxkLgotCi1sZC1wYXJ0aWFsLm86IGxkLW5ldyQoRVhFRVhUKQotCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkLXBhcnRpYWwubyAtciAkKE9GSUxFUykKLWxkMSQoRVhFRVhUKTogbGQtcGFydGlhbC5vCi0JLi9sZC1uZXckKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQxJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSBsZC1wYXJ0aWFsLm8gJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCi0KLWxkMS1mdWxsJChFWEVFWFQpOiBsZC1uZXcKLQkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDEtZnVsbCQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1sZDIkKEVYRUVYVCk6IGxkMSQoRVhFRVhUKQotCS4vbGQxJChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMiQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1sZDMkKEVYRUVYVCk6IGxkMiQoRVhFRVhUKQotCS4vbGQyJChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMyQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1ib290c3RyYXA6IGxkMyQoRVhFRVhUKQotCWNtcCBsZDIkKEVYRUVYVCkgbGQzJChFWEVFWFQpCi0KLS5QSE9OWTogYm9vdHN0cmFwCi0KLSMgQSB0ZXN0IHByb2dyYW0gZm9yIEMrKyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLgotIyBUaGlzIHRlc3QgaXMgbm93IGluIHRoZSB0ZXN0c3VpdGUuCi0jCi0jY2R0ZXN0OiBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gbGQubmV3Ci0jCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdCAkKEhPU1RJTkdfQ1JUMCkgXAotIwkgIGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyAkKEhPU1RJTkdfTElCUykKLSMKLSNjZHRlc3Qub3V0OiBjZHRlc3QKLSMJLi9jZHRlc3QgPiBjZHRlc3QudG1wCi0jCW12IGNkdGVzdC50bXAgY2R0ZXN0Lm91dAotIwotI2NkdGVzdC11ci5vOiBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gbGQubmV3Ci0jCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdC11ci5vIC1VciBjZHRlc3QtbWFpbi5vIFwKLSMJICBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vCi0jCi0jY2R0ZXN0LXVyOiBjZHRlc3QtdXIubwotIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QtdXIgJChIT1NUSU5HX0NSVDApIGNkdGVzdC11ci5vIFwKLSMJICAkKEhPU1RJTkdfTElCUykKLSMKLSNjZHRlc3QtdXIub3V0OiBjZHRlc3QtdXIKLSMJLi9jZHRlc3QtdXIgPiBjZHRlc3QtdXIudG1wCi0jCW12IGNkdGVzdC11ci50bXAgY2R0ZXN0LXVyLm91dAotIwotI2NoZWNrLWNkdGVzdDogY2R0ZXN0Lm91dCBjZHRlc3QtdXIub3V0ICQoc3JjZGlyKS9jZHRlc3QuZXhwCi0jCWRpZmYgJChzcmNkaXIpL2NkdGVzdC5leHAgY2R0ZXN0Lm91dAotIwlkaWZmICQoc3JjZGlyKS9jZHRlc3QuZXhwIGNkdGVzdC11ci5vdXQKLSMKLSMuUEhPTlk6IGNoZWNrLWNkdGVzdAotCi0jIEVORCBPRiBDSEVDSyBUQVJHRVRTCi0KLSMgRE9DVU1FTlRBVElPTiBUQVJHRVRTCi0jIE1hbnVhbCBjb25maWd1cmF0aW9uIGZpbGU7IG5vdCB1c3VhbGx5IGF0dGFjaGVkIHRvIG5vcm1hbCBjb25maWd1cmF0aW9uLAotIyBiZWNhdXNlIGFsbW9zdCBhbGwgY29uZmlncyB1c2UgImdlbiIgdmVyc2lvbiBvZiBtYW51YWwuCi0jICBTZXQgRE9DVkVSIGFib3ZlIHRvIGNoYW5nZS4KLWNvbmZpZ2RvYy50ZXhpOgkke0RPQ1ZFUn0tZG9jLnRleGkKLQlsbiAtcyAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGxuICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgY3AgJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpCi0KLWxkdmVyLnRleGk6IE1ha2VmaWxlCi0Jcm0gLWYgJEAKLQllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiAkQAotCi1sZC5pbmZvOiAkKHNyY2RpcikvbGQudGV4aW5mbyBjb25maWdkb2MudGV4aSBsZHZlci50ZXhpCi0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgLUkgJChCRkRESVIpL2RvYyAkKHNyY2RpcikvbGQudGV4aW5mbwotCi1sZC5kdmk6ICQoc3JjZGlyKS9sZC50ZXhpbmZvIGNvbmZpZ2RvYy50ZXhpIGxkdmVyLnRleGkKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvOiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSIkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgLUkgJChCRkRESVIpL2RvYyIgJChURVhJMkRWSSkgJChzcmNkaXIpL2xkLnRleGluZm8KLQotIyBXZSB3YW50IHRvIHJlY29uZmlndXJlIGlmIGNvbmZpZ3VyZS5ob3N0IG9yIGNvbmZpZ3VyZS50Z3QgY2hhbmdlcy4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpL2NvbmZpZ3VyZS5ob3N0ICQoc3JjZGlyKS9jb25maWd1cmUudGd0Ci0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotbW9zdGx5Y2xlYW4tbG9jYWw6Ci0JLXJtIC1yZiB0bXBkaXIKLQotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtbG9jYWwgaW5zdGFsbC1kYXRhLWxvY2FsCi0KLWluc3RhbGwtZXhlYy1sb2NhbDogbGQtbmV3JChFWEVFWFQpCi0JJChta2luc3RhbGxkaXJzKSAkKGJpbmRpcikgJCh0b29sZGlyKS9iaW4KLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQluPWBlY2hvIGxkIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCWlmIFsgIiQoYmluZGlyKS8kJG4kKEVYRUVYVCkiICE9ICIkKHRvb2xkaXIpL2Jpbi9sZCQoRVhFRVhUKSIgXTsgdGhlbiBcCi0JICBybSAtZiAkKHRvb2xkaXIpL2Jpbi9sZCQoRVhFRVhUKTsgXAotCSAgbG4gJChiaW5kaXIpLyQkbiQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi9sZCQoRVhFRVhUKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsIFwKLQkgIHx8ICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pIGxkLW5ldyQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi9sZCQoRVhFRVhUKTsgXAotCWZpCi0KLWluc3RhbGwtZGF0YS1sb2NhbDoKLQkkKG1raW5zdGFsbGRpcnMpICQoc2NyaXB0ZGlyKS9sZHNjcmlwdHMKLQlmb3IgZiBpbiBsZHNjcmlwdHMvKjsgZG8gXAotCSAgJChJTlNUQUxMX0RBVEEpICQkZiAkKHNjcmlwdGRpcikvJCRmIDsgXAotCWRvbmUKLWRpc3RzdHVmZjogJChMRERJU1RTVFVGRikgaW5mbwotZGlzdGNsZWFuLWxvY2FsOgotCXJtIC1yZiBsZHNjcmlwdHMKLQotIyBUYXJnZXRzIHRvIHJlYnVpbGQgZGVwZW5kZW5jaWVzIGluIHRoaXMgTWFrZWZpbGUuCi0jIEhhdmUgdG8gZ2V0IHJpZCBvZiBERVAxIGhlcmUgc28gdGhhdCAiJD8iIGxhdGVyIGluY2x1ZGVzIGFsbCBvZiAkKENGSUxFUykuCi1ERVA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykgY29uZmlnLmgKLQlybSAtZiBERVAxCi0JJChNQUtFKSBNS0RFUD0kKE1LREVQKSBERVAxCi0Jc2VkIC1mIGRlcC5zZWQgPERFUDEgPkRFUAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotREVQMTogJChDRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykKLQlybSAtZiBERVAyCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiBERVAyCi0JJChNS0RFUCkgLWYgREVQMiAkKElOQ0xVREVTKSAkPwotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBERVAyIERFUDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLQotbGRjdG9yLm86IGxkY3Rvci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaCBsZGN0b3IuaAotbGRlbXVsLm86IGxkZW11bC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZGVtdWwuaCBcCi0gIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRtYWluLmggbGRlbXVsLWxpc3QuaAotbGRleHAubzogbGRleHAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkZXhwLmggbGRncmFtLmggbGRsYW5nLmgKLWxkZmlsZS5vOiBsZGZpbGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRtYWluLmggbGRncmFtLmggXAotICBsZGxleC5oIGxkZW11bC5oCi1sZGxhbmcubzogbGRsYW5nLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkZ3JhbS5oIGxkZXhwLmggbGRsYW5nLmggbGRlbXVsLmggbGRsZXguaCBsZG1pc2MuaCBcCi0gIGxkY3Rvci5oIGxkZmlsZS5oICQoSU5DRElSKS9mbm1hdGNoLmggJChJTkNESVIpL2RlbWFuZ2xlLmgKLWxkbWFpbi5vOiBsZG1haW4uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9wcm9ncmVzcy5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkbWlzYy5oIGxkd3JpdGUuaCBsZGdyYW0uaCBsZGV4cC5oIGxkbGFuZy5oIGxkZW11bC5oIFwKLSAgbGRsZXguaCBsZGZpbGUuaCBsZGN0b3IuaAotbGRtaXNjLm86IGxkbWlzYy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggbGQuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRncmFtLmggbGRsZXguaCBsZG1haW4uaCBsZGZpbGUuaAotbGR2ZXIubzogbGR2ZXIuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGR2ZXIuaCBcCi0gIGxkZW11bC5oIGxkbWFpbi5oCi1sZHdyaXRlLm86IGxkd3JpdGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkd3JpdGUuaCBcCi0gIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oCi1sZXhzdXAubzogbGV4c3VwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKLSAgbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGdyYW0uaCBsZGxleC5oIGxkZmlsZS5oIFwKLSAgbGR2ZXIuaCBsZGVtdWwuaAotbXJpLm86IG1yaS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRtaXNjLmggbXJpLmggbGRncmFtLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1sZGNyZWYubzogbGRjcmVmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRtYWluLmggbGRtaXNjLmggbGRleHAuaCBcCi0gIGxkbGFuZy5oCi1wZS1kbGwubzogcGUtZGxsLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZHdyaXRlLmggXAotICBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaCBsZGVtdWwuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgLi4vYmZkL2xpYmNvZmYuaCBkZWZmaWxlLmggcGUtZGxsLmgKLWxkZ3JhbS5vOiBsZGdyYW0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkZXhwLmggbGR2ZXIuaCBsZGxhbmcuaCBsZGVtdWwuaCBsZGZpbGUuaCBsZG1pc2MuaCBcCi0gIGxkbWFpbi5oIG1yaS5oIGxkY3Rvci5oIGxkbGV4LmgKLWxkbGV4Lm86IGxkbGV4LmMgLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICBsZC5oIGxkZ3JhbS5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRsZXguaCBcCi0gIGxkbWFpbi5oCi1kZWZmaWxlcC5vOiBkZWZmaWxlcC5jICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgbGQuaCBsZG1pc2MuaCBkZWZmaWxlLmgKLQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2xkL05FV1MgYi9sZC9ORVdTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjc4OTBlLi4wMDAwMDAwCi0tLSBhL2xkL05FV1MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLSotIHRleHQgLSotCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjEwOgotCi0qIEFkZGVkIGdhcmJhZ2UgY29sbGVjdGlvbiBvZiB1bnVzZWQgc2VjdGlvbnMsIGVuYWJsZWQgYnkgLS1nYy1zZWN0aW9ucy4gCi0gIEl0IGRvZXMgcmVxdWlyZSBhIGJpdCBvZiBiYWNrZW5kIHN1cHBvcnQ7IGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcmUKLSAgcHBjLWVsZiwgbWlwcy1lbGYsIGFuZCBtbjEwMzAwLWVsZi4gIE90aGVycyB3aWxsIGlnbm9yZSB0aGUgb3B0aW9uLgotCi0qIEFkZGVkIFNPUlQgdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UgdG8gcGVybWl0IHNvcnRpbmcgc2VjdGlvbnMgYnkgZmlsZQotICBuYW1lIG9yIHNlY3Rpb24gbmFtZS4KLQotKiBBZGRlZCBFWFRFUk4gdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UgYXMgYW4gZXF1aXZhbGVudCB0byB0aGUgLXUKLSAgY29tbWFuZC1saW5lIG9wdGlvbi4KLQotKiBBZGRlZCBBU1NFUlQgdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UuCi0KLSogQWRkZWQgRVhDTFVERV9GSUxFIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlIGZvciBmdXJ0aGVyIGNvbnRyb2wgb3ZlcgotICB3aWxkY2FyZCBmaWxlIG5hbWVzLgotCi0qIEFkZGVkIC1PIG9wdGlvbiB0byBvcHRpbWl6ZSBsaW5rZXIgb3V0cHV0IChhcyBvZiB0aGlzIHdyaXRpbmcsIHRoaXMgb25seQotYWZmZWN0cyBFTEYgc2hhcmVkIGxpYnJhcnkgZ2VuZXJhdGlvbikuCi0KLSogVGhlIC1lIG9wdGlvbiBub3cgYWNjZXB0cyBhIG51bWJlciBhcyB3ZWxsIGFzIGEgc3ltYm9sIG5hbWUuCi0KLSogQWRkZWQgLS1uby11bmRlZmluZWQgb3B0aW9uIHRvIGRpc2FsbG93IHVuZGVmaW5lZCBzeW1ib2xzIHdoZW4gY3JlYXRpbmcgYQotICBzaGFyZWQgbGlicmFyeS4KLQotKiBBZGRlZCAtLWRlbWFuZ2xlIGFuZCAtLW5vLWRlbWFuZ2xlIG9wdGlvbnMuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjk6Ci0KLSogQWRkZWQgU1FVQUQgdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UuCi0KLSogTmV3IG9wdGlvbiAtLW5vLXdhcm4tbWlzbWF0Y2guCi0KLSogVGhlIE1FTU9SWSBjb21tYW5kIG5vdyBwYXJzZXMgdGhlIGF0dHJpYnV0ZXMgdG8gZGV0ZXJtaW5lIHdoZXJlIHNlY3Rpb25zIHRoYXQKLSAgYXJlIG5vdCBwbGFjZWQgaW4gYSBzcGVjaWZpYyBtZW1vcnkgcmVnaW9uIGFyZSBwbGFjZWQuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjg6Ci0KLSogTGlua2VyIHNjcmlwdHMgbWF5IG5vdyBjb250YWluIHNoZWxsIHdpbGRjYXJkIGNoYXJhY3RlcnMgZm9yIGZpbGUgYW5kIHNlY3Rpb24KLSAgbmFtZXMuCi0KLSogVGhlIGxpbmtlciBub3cgc3VwcG9ydHMgc3ltYm9sIHZlcnNpb25zIGluIEVMRi4KLQotKiBUaGUgTk9DUk9TU1JFRlMgY29tbWFuZCB3YXMgYWRkZWQgdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UuCi0KLSogVGhlIExPQURBRERSIGV4cHJlc3Npb24gd2FzIGFkZGVkIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIE1BWCBhbmQgTUlOIGZ1bmN0aW9ucyB3ZXJlIGFkZGVkIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIFRoZSBPVkVSTEFZIGNvbnN0cnVjdCB3YXMgYWRkZWQgdG8gdGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UuCi0KLSogTmV3IG9wdGlvbiAtLXdhcm4tc2VjdGlvbi1hbGlnbiB0byB3YXJuIHdoZW4gdGhlIGFkZHJlc3Mgb2YgYW4gb3V0cHV0IHNlY3Rpb24KLSAgY2hhbmdlcyBkdWUgdG8gYWxpZ25tZW50IG9mIGFuIGlucHV0IHNlY3Rpb24uCi0KLSogTmV3IG9wdGlvbnMgLS1maWx0ZXIvLUYgYW5kIC0tYXV4aWxpYXJ5Ly1mLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi43OgotCi0qIE5ldyBvcHRpb24gLS1jcmVmIHRvIHByaW50IG91dCBhIGNyb3NzIHJlZmVyZW5jZSB0YWJsZS4KLQotKiBOZXcgb3B0aW9uIC0td3JhcCBTWU1CT0wuCi0KLSogTmV3IG9wdGlvbiAtLW5vLXdob2xlLWFyY2hpdmUsIHRvIHR1cm4gb2ZmIHRoZSBlZmZlY3Qgb2YgLS13aG9sZS1hcmNoaXZlLgotCi0qIElucHV0IHNlY3Rpb25zIGFzc2lnbmVkIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiAvRElTQ0FSRC8gaW4gdGhlIGxpbmtlciBzY3JpcHQKLSAgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLSogVGhlIFN1bk9TIGFuZCBFTEYgbGlua2VycyBub3cgbWVyZ2Ugc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWNoIHVzZXMKLSAgdGhlIE5fQklOQ0wgYW5kIE5fRUlOQ0wgc3RhYiB0eXBlcy4gIFRoaXMgcmVkdWNlcyB0aGUgYW1vdW50IG9mIGRlYnVnZ2luZwotICBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjY6Ci0KLSogV2hlbiBhbiBFTEYgc2VjdGlvbiBuYW1lIGlzIHJlcHJlc2VudGFibGUgYXMgYSBDIGlkZW50aWZpZXIgKHRoaXMgaXMgbm90IHRydWUKLW9mIG1vc3QgRUxGIHNlY3Rpb24gbmFtZXMpLCB0aGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBkZWZpbmUgc3ltYm9scwotX19zdGFydF9TRUNOQU1FIGFuZCBfX3N0b3BfU0VDTkFNRSwgd2hlcmUgU0VDTkFNRSBpcyB0aGUgc2VjdGlvbiBuYW1lLCBhdCB0aGUKLWJlZ2lubmluZyBhbmQgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgdXNlZCBieSBnbGliYy4KLQotKiBXaGVuIGFuIEVMRiBzZWN0aW9uIG5hbWVkIC5nbnUud2FybmluZyBpcyBlbmNvdW50ZXJlZCBpbiBhbiBpbnB1dCBmaWxlLCB0aGUKLWNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIGFyZSBkaXNwbGF5ZWQgYXMgYW4gZXJyb3IgbWVzc2FnZSwgYW5kIHRoZSBzZWN0aW9uIGlzCi1ub3QgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLiAgVGhpcyBpcyB1c2VkIGJ5IGdsaWJjLgotCi0qIFdoZW4gYW4gRUxGIHNlY3Rpb24gbmFtZWQgLmdudS53YXJuaW5nLlNZTUJPTCBpcyBlbmNvdW50ZXJlZCBpbiBhbiBpbnB1dAotZmlsZSwgYW5kIHRoZSBzeW1ib2wgU1lNQk9MIGlzIHJlZmVyZW5jZWQgYnkgc29tZSBvYmplY3QgZmlsZSwgdGhlIGNvbnRlbnRzIG9mCi10aGUgc2VjdGlvbiBhcmUgZGlzcGxheWVkIGFzIGFuIGVycm9yIG1lc3NhZ2UuICBUaGUgc2VjdGlvbiBpcyBub3QgY29waWVkIGludG8KLXRoZSBvdXRwdXQgZmlsZSwgdW5sZXNzIGRvaW5nIGEgcmVsb2NhdGVhYmxlIG9yIHNoYXJlZCBsaW5rLiAgVGhpcyBpcyB1c2VkIGJ5Ci1nbGliYy4KLQotKiBOZXcgb3B0aW9ucyAtc3BsaXQtYnktcmVsb2MgYW5kIC1zcGxpdC1ieS1maWxlLgotCi0qIFRoZSBsaW5rZXIgbm93IHN1cHBvcnRzIGxpbmtpbmcgUElDIGNvbXBpbGVkIGNvZGUgb24gU1BBUkMgU3VuT1MuICBJdCBjYW4KLWFsc28gY3JlYXRlIFNQQVJDIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCwgbGlrZSB0aGUgbmF0aXZlIFN1bk9TIGxpbmtlciwKLXdpbGwgZG8gc28gd2hlbmV2ZXIgdGhlcmUgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCBpbiB0aGUgbGluayBhbmQgbmVpdGhlciB0aGUgLWUKLW5vciB0aGUgLXIgb3B0aW9uIHdhcyB1c2VkLgotCi0qIFRoZSAtcnBhdGggb3B0aW9uIG1heSBiZSB1c2VkIG9uIFN1bk9TIHRvIHNldCB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBiZQotc2VhcmNoZWQgYXQgcnVuIHRpbWUuICBUaGlzIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBvZiBidWlsZGluZyB0aGUgbGlzdCBmcm9tIHRoZQotLUwgb3B0aW9ucy4KLQotKiBUaGUgQ09GRiBsaW5rZXIgbm93IGNvbWJpbmVzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3Igc3RydWN0cywgdW5pb25zLCBhbmQKLWVudW1zLCBzbyB0aGF0IGV2ZW4gaWYgdGhlIHNhbWUgdHlwZSBpcyBkZWZpbmVkIGluIG11bHRpcGxlIGlucHV0IGZpbGVzIGl0IHdpbGwKLW9ubHkgYmUgZGVmaW5lZCBvbmNlIGluIHRoZSBvdXRwdXQgZmlsZS4gIFRoZSAtLXRyYWRpdGlvbmFsLWZvcm1hdCBzd2l0Y2ggd2lsbAotcHJldmVudCB0aGlzIG9wdGltaXphdGlvbi4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuNToKLQotKiBUaGUgbGlua2VyIG5vdyBzdXBwb3J0cyBsaW5raW5nIGFnYWluc3QgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcy4gIEl0IHN0aWxsIGNhbgotbm90IGxpbmsgU3VuT1MgUElDIChQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlKSBmaWxlcywgc28gaXQgY2FuIG5vdCBiZSB1c2VkIHRvCi1nZW5lcmF0ZSBzaGFyZWQgbGliYXJpZXMuCi0KLSogVGhlIGxpbmtlciBub3cgc3VwcG9ydHMgbGlua2luZyBhZ2FpbnN0IEVMRiBzaGFyZWQgbGlicmFyaWVzIGZvciB0aGUgaTM4NgotKFVuaXhXYXJlKSBhbmQgU1BBUkMgKFNvbGFyaXMpLiAgSXQgY2FuIGFsc28gbGluayBFTEYgUElDIGZpbGVzLCBhbmQgY2FuIGJlCi11c2VkIHRvIGdlbmVyYXRlIHNoYXJlZCBsaWJyYXJpZXMuICBTaGFyZWQgbGlicmFyeSBnZW5lcmF0aW9uIGlzIG5vdCB3ZWxsCi10ZXN0ZWQ7IHBsZWFzZSByZXBvcnQgYW55IHByb2JsZW1zIGVuY291bnRlcmVkLiAgVGhlIGxpbmtlciBpcyBub3cgZW5hYmxlZCBmb3IKLVNvbGFyaXMgYWdhaW4uCi0KLSogRXJpYyBZb3VuZ2RhbGUgaGFzIGNvbnRyaWJ1dGVkIExpbnV4IHN1cHBvcnQgY29kZSwgaW5jbHVkaW5nIGxpbmtpbmcgYWdhaW5zdAotTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gIFRoZSBsaW5rZXIgcHJvZHVjZXMgTGludXggUU1BR0lDIGJpbmFyaWVzLgotCi0qIFRoZSBFTEYgYmFja2VuZCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBsaW5rZXIgY29kZS4gIFRvIHVzZSB0aGUgbmV3Ci1FTEYgbGlua2VyLCBlYWNoIHBhcnRpY3VsYXIgdGFyZ2V0IHJlcXVpcmVzIGEgcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFNvIGZhciwKLXRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gd3JpdHRlbiBmb3IgaTM4NiAoVW5peFdhcmUpLCBTUEFSQyAoU29sYXJpcykgTUlQUyAoSXJpeAotNSksIGFuZCBIUFBBIEVMRiB0YXJnZXRzLgotCi0qIFRoZSAtKCAoLS1zdGFydC1ncm91cCkgYW5kIC0pICgtLWVuZC1ncm91cCkgb3B0aW9ucyBoYXZlIGJlZW4gYWRkZWQgdG8KLXN1cHBvcnQgc2VhcmNoaW5nIGEgZ3JvdXAgb2YgYXJjaGl2ZXMgYXMgdGhvdWdoIHRoZXkgd2VyZSBhIHNpbmdsZSBhcmNoaXZlLgotVGhpcyBjYW4gYWxzbyBiZSB1c2VkIGluIGEgbGlua2VyIHNjcmlwdCwgYXMgR1JPVVAgKCBmaWxlcyApLgotCi0qIFdoZW4gYSBmaWxlIGlzIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFuZCB0aGUgbGlua2VyIGRvZXMgbm90IHJlY29nbml6ZQotaXQgYXMgYW4gb2JqZWN0IGZpbGUsIHRoZSBsaW5rZXIgd2lsbCBub3cgdHJlYXQgdGhlIGZpbGUgYXMgYSBsaW5rZXIgc2NyaXB0Ci1maWxlLiAgQSBsaW5rZXIgc2NyaXB0IG5hbWVkIGluIHRoaXMgd2F5IGF1Z21lbnRzLCBidXQgZG9lcyBub3QgcmVwbGFjZSwgdGhlCi1kZWZhdWx0IGxpbmtlciBzY3JpcHQuCi0KLSogVGhlIC13YXJuLW9uY2Ugb3B0aW9uIHdhcyBhZGRlZC4gIEl0IGNhdXNlcyB0aGUgbGlua2VyIHRvIG9ubHkgd2FybiBvbmNlIHBlcgotdW5kZWZpbmVkIHN5bWJvbCwgcmF0aGVyIHRoYW4gb25jZSBwZXIgcmVmZXJlbmNlLgotCi0qIFRoZSBDT0ZGIGJhY2tlbmQgaGFzIGJlZW4gY29udmVydGVkIHRvIHRoZSBuZXcgbGlua2VyIGNvZGUuICBBcyB3aXRoIEVMRiwgdG8KLXVzZSB0aGUgbmV3IGxpbmtlciwgZWFjaCBwYXJ0aWN1bGFyIHRhcmdldCByZXF1aXJlcyBhIHJlbG9jYXRpb24gZnVuY3Rpb24uICBTbwotZmFyLCB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIHRoZSBpMzg2LCBtNjhrLCBhMjlrIGFuZCBTSCB0YXJnZXRzLgotCi0qIFRoZSAtViBmbGFnIHdhcyBtYWRlIGEgc3lub255bSBmb3IgLXYsIGZvciBTVlI0IGNvbXBhdGliaWxpdHkuICBUaGUgb2xkIC1WCi1iZWhhdmlvdXIgaXMgYXZhaWxhYmxlIHZpYSAtLXZlcmJvc2UuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjQ6Ci0KLSogTmV3IGxpbmtlciBjb2RlLCBieSBTdGV2ZSBDaGFtYmVybGFpbiBhbmQgSWFuIFRheWxvci4gIEZvciBhLm91dCBhbmQgZWNvZmYKLSAgZm9ybWF0cyAoc28gZmFyKSwgdGhpcyBzaG91bGQgcmVzdWx0IGluIGNvbnNpZGVyYWJsZSBzYXZpbmdzIGluIHRpbWUKLSAgYW5kIG1lbW9yeSB1c2VkIHdoaWxlIGxpbmtpbmc7IHNsaWdodGx5IHBvb3JlciBwZXJmb3JtYW5jZSB0aGFuCi0gIGJlZm9yZSBmb3IgZm9ybWF0cyBub3QgY29udmVydGVkIHlldC4KLQotKiBDb21tYW5kLWxpbmUgcGFyc2luZyBpcyBubyBsb25nZXIgZG9uZSB3aXRoIGZsZXguICBUaGlzIG1lYW5zCi0gIG9kZGJhbGwgY2hhcmFjdGVycyBpbiBmaWxlbmFtZXMgd29uJ3QgZ2V0IHRyZWF0ZWQgYXMgYXJndW1lbnQKLSAgc2VwYXJhdG9ycy4KLQotKiBIUC1QQSBFTEYgc3VwcG9ydCwgYnkgSmVmZiBMYXcuICAoTm8gU09NIHN1cHBvcnQgeWV0LikKLQotKiBNYWNoIGkzODYgc3VwcG9ydCwgYnkgRGF2aWQgTWFja2VuemllLgotCi0qIElyaXggNCBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3cgc3VwcG9ydGVkIChJcml4IDUgdXNlcyBFTEYsIGFuZCBFTEYgc2hhcmVkCi0gIGxpYnJhcmllcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQpLgotCi0qIENPRkYgc2hhcmVkIGxpYnJhcmllcyAoYXMgb24gU0NPKSBzaG91bGQgd29yayBhcyB3ZWxsLgotCi0qIFRoZSBsaW5rZXIgaXMgZGlzYWJsZWQgZm9yIFNvbGFyaXMuICAoQWN0dWFsbHksIGl0IHdhcyBpbiAyLjMgYWxzbywgSSBqdXN0Ci0gIGZvcmdvdCB0byBub3RlIGl0LikgIFNvbWUgb2YgdGhlaXIgQyBsaWJyYXJ5IHJvdXRpbmVzIGRvbid0IHdvcmsgd2hlbgotICBzdGF0aWNhbGx5IGxpbmtlZCwgYW5kIHRoZSBHTlUgbGlua2VyIGRvZXNuJ3Qgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgeWV0LgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi4zOgotCi0qIFdlYWsgc3ltYm9scyBhcmUgbm93IHN1cHBvcnRlZC4KLQotKiBFTEYgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4gIFRoZSBsaW5rZXIgaGFzIGJlZW4gYm9vdHN0cmFwcGVkIG9uCi0gIFVuaXhXYXJlIGFuZCBTb2xhcmlzLgotCi0qIEFscGhhIE9TRi8xIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQgKG5vbiBkeW5hbWljIGxpbmtpbmcgb25seSkuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjI6Ci0KLSogVGhlIGBiZmQnIGxpYnJhcnkgaGFzIGJlZW4gdXBkYXRlZCB0byByZWR1Y2UgYS5vdXQtZm9ybWF0IHN0cmluZwotICB0YWJsZSBzaXplLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgZmlsZXMgbGlua2VkIGZyb20gbWFueSBpbnB1dAotICBmaWxlcyB3aXRoIGR1cGxpY2F0ZSBzeW1ib2xzIChgLWcnIGRlYnVnZ2luZyByZWNvcmRzLCBvciBpZGVudGljYWwKLSAgc3RhdGljIHN5bWJvbHMpIHNob3VsZCBiZSBtdWNoIHNtYWxsZXIuCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjE6Ci0KLSogVGhlIGxkIC15U1lNQk9MIGZsYWcgKHRvIHRyYWNlIHJlZmVyZW5jZXMgdG8gU1lNQk9MKSBpcyBub3cgaW1wbGVtZW50ZWQuCi0KLSogVGhlcmUgaXMgbm93IHN1cHBvcnQgZm9yIHdyaXRpbmcgRUNPRkYgZmlsZXMsIHNvIGxkIGFuZCB0aGUKLSAgb3RoZXIgdXRpbGl0aWVzIHNob3VsZCB3b3JrIG9uIFJpc2MvVWx0cml4IGFuZCBJcml4LgotCi0MCi1Mb2NhbCB2YXJpYWJsZXM6Ci1maWxsLWNvbHVtbjogNzkKLUVuZDoKZGlmZiAtLWdpdCBhL2xkL1JFQURNRSBiL2xkL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk0N2QwNC4uMDAwMDAwMAotLS0gYS9sZC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi1UaGlzIGlzIHRoZSBHTlUgbGlua2VyLiAgSXQgaXMgZGlzdHJpYnV0ZWQgd2l0aCBvdGhlciAiYmluYXJ5Ci11dGlsaXRpZXMiIHdoaWNoIHNob3VsZCBiZSBpbiAuLi9iaW51dGlscy4gIFNlZSAuLi9iaW51dGlscy9SRUFETUUgZm9yCi1tb3JlIGdlbmVyYWwgbm90ZXMsIGluY2x1ZGluZyB3aGVyZSB0byBzZW5kIGJ1ZyByZXBvcnRzLgotCi1UaGVyZSBhcmUgbWFueSBmZWF0dXJlcyBvZiB0aGUgbGlua2VyOgotCi0qIFRoZSBsaW5rZXIgdXNlcyBhIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeSAoLi4vYmZkKQotICB0aGF0IGl0IHVzZXMgdG8gcmVhZCBhbmQgd3JpdGUgb2JqZWN0IGZpbGVzLiAgVGhpcyBoZWxwcwotICBpbnN1bGF0ZSB0aGUgbGlua2VyIGl0c2VsZiBmcm9tIHRoZSBmb3JtYXQgb2Ygb2JqZWN0IGZpbGVzLgotCi0qIFRoZSBsaW5rZXIgc3VwcG9ydHMgYSBudW1iZXIgb2YgZGlmZmVyZW50IG9iamVjdCBmaWxlCi0gIGZvcm1hdHMuICBJdCBjYW4gZXZlbiBoYW5kbGUgbXVsdGlwbGUgZm9ybWF0cyBhdCBvbmNlOgotICBSZWFkIHR3byBpbnB1dCBmb3JtYXRzIGFuZCB3cml0ZSBhIHRoaXJkLgotCi0qIFRoZSBsaW5rZXIgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGNyb3NzLWxpbmtpbmcuCi0KLSogVGhlIGxpbmtlciBzdXBwb3J0cyBhIGNvbnRyb2wgbGFuZ3VhZ2UuCi0KLSogVGhlcmUgaXMgYSB1c2VyIG1hbnVhbCAobGQudGV4aW5mbyksIGFzIHdlbGwgYXMgdGhlCi0gIGJlZ2lubmluZ3Mgb2YgYW4gaW50ZXJuYWxzIG1hbnVhbCAobGRpbnQudGV4aW5mbykuCi0KLUluc3RhbGxhdGlvbgotPT09PT09PT09PT09Ci0KLVNlZSAuLi9iaW51dGlscy9SRUFETUUuCi0KLUlmIHlvdSB3YW50IHRvIG1ha2UgYSBjcm9zcy1saW5rZXIsIHlvdSBtYXkgd2FudCB0byBzcGVjaWZ5Ci1hIGRpZmZlcmVudCBzZWFyY2ggcGF0aCBvZiAtbGZvbyBsaWJyYXJpZXMgdGhhbiB0aGUgZGVmYXVsdC4KLVlvdSBjYW4gZG8gdGhpcyBieSBzZXR0aW5nIHRoZSBMSUJfUEFUSCB2YXJpYWJsZSBpbiAuL01ha2VmaWxlLgotCi1UbyBidWlsZCBqdXN0IHRoZSBsaW5rZXIsIG1ha2UgdGhlIHRhcmdldCBhbGwtbGQgZnJvbSB0aGUgdG9wIGxldmVsCi1kaXJlY3RvcnkgKG9uZSBkaXJlY3RvcnkgYWJvdmUgdGhpcyBvbmUpLgotCi1Qb3J0aW5nIHRvIGEgbmV3IHRhcmdldAotPT09PT09PT09PT09PT09PT09PT09PT0KLQotU2VlIHRoZSBsZGludC50ZXhpbmZvIG1hbnVhbC4KLQotUmVwb3J0aW5nIGJ1Z3MgZXRjCi09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotU2VlIC4uL2JpbnV0aWxzL1JFQURNRS4KLQotS25vd24gcHJvYmxlbXMKLT09PT09PT09PT09PT09Ci0KLVRoZSBTb2xhcmlzIGxpbmtlciBub3JtYWxseSBleHBvcnRzIGFsbCBkeW5hbWljIHN5bWJvbHMgZnJvbSBhbgotZXhlY3V0YWJsZS4gIFRoZSBHTlUgbGlua2VyIGRvZXMgbm90IGRvIHRoaXMgYnkgZGVmYXVsdC4gIFRoaXMgaXMKLWJlY2F1c2UgdGhlIEdOVSBsaW5rZXIgdHJpZXMgdG8gcHJlc2VudCB0aGUgc2FtZSBpbnRlcmZhY2UgZm9yIGFsbAotc2ltaWxhciB0YXJnZXRzIChpbiB0aGlzIGNhc2UsIGFsbCBuYXRpdmUgRUxGIHRhcmdldHMpLiAgVGhpcyBkb2VzIG5vdAotbWF0dGVyIGZvciBub3JtYWwgcHJvZ3JhbXMsIGJ1dCBpdCBjYW4gbWFrZSBhIGRpZmZlcmVuY2UgZm9yIHByb2dyYW1zCi13aGljaCB0cnkgdG8gZGxvcGVuIGFuIGV4ZWN1dGFibGUsIHN1Y2ggYXMgUEVSTCBvciBUY2wuICBZb3UgY2FuIG1ha2UKLXRoZSBHTlUgbGlua2VyIGV4cG9ydCBhbGwgZHluYW1pYyBzeW1ib2xzIHdpdGggdGhlIC1FIG9yCi0tLWV4cG9ydC1keW5hbWljIGNvbW1hbmQgbGluZSBvcHRpb24uCi0KLUhQL1VYIDkuMDEgaGFzIGEgc2hlbGwgYnVnIHRoYXQgY2F1c2VzIHRoZSBsaW5rZXIgc2NyaXB0cyB0byBiZQotZ2VuZXJhdGVkIGluY29ycmVjdGx5LiAgVGhlIHN5bXB0b20gb2YgdGhpcyBhcHBlYXJzIHRvIGJlICJmYXRhbCBlcnJvcgotLSBzY2FubmVyIGlucHV0IGJ1ZmZlciBvdmVyZmxvdyIgZXJyb3IgbWVzc2FnZXMuICBUaGVyZSBhcmUgdmFyaW91cwotd29ya2Fyb3VuZHMgdG8gdGhpczoKLSAgKiBCdWlsZCBhbmQgaW5zdGFsbCBiYXNoLCBhbmQgYnVpbGQgd2l0aCAibWFrZSBTSEVMTD1iYXNoIi4KLSAgKiBVcGRhdGUgdG8gYSB2ZXJzaW9uIG9mIEhQL1VYIHdpdGggYSB3b3JraW5nIHNoZWxsIChlLmcuLCA5LjA1KS4KLSAgKiBSZXBsYWNlICIoLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIiBpbgotICAgIGdlbnNjcmlwdHMuc2ggd2l0aCAic2ggJHtzcmNkaXJ9Li4uIiAobm8gcGFyZW5zKSBhbmQgbWFrZSBzdXJlIHRoZQotICAgIGVtdWxwYXJhbXMgc2NyaXB0IHVzZWQgZXhwb3J0cyBhbnkgc2hlbGwgdmFyaWFibGVzIGl0IHNldHMuCmRpZmYgLS1naXQgYS9sZC9UT0RPIGIvbGQvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjZDk4Yi4uMDAwMDAwMAotLS0gYS9sZC9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1Wb2x1bnRlZXJzIHRvIHRhY2tsZSBzb21lIG9mIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgd2VsY29tZToKLQotU3VwcG9ydCB0aGUgInRyYWRpdGlvbmFsIiBCU0QgIC1BIGZsYWcgKGluY3JlbWVudGFsIGxvYWRpbmcpLgotKFRoZXJlIGlzIGEgLUEgZmxhZyBpbiBsZCBub3csIGJ1dCBpdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi1hcmNoaXRlY3R1cmUuICBUaGF0IHNob3VsZCBwcm9iYWJseSBiZSBjaGFuZ2VkLikKLQotU3VwcG9ydCBmb3IgZHluYW1pYyBsb2FkaW5nIChhIGxhIGRsZCwgYnV0IGJmZC1iYXNlZCkgd291bGQgYmUgbmljZS4KLQotQXZvaWQgcmUtb3BlbiAoYW5kIHJlLXNlZWtpbmcpIG91dHB1dCBiZmQgYW5kIGFyY2hpdmVzLgpkaWZmIC0tZ2l0IGEvbGQvYWNpbmNsdWRlLm00IGIvbGQvYWNpbmNsdWRlLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWIwOWI5Li4wMDAwMDAwCi0tLSBhL2xkL2FjaW5jbHVkZS5tNAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXNpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCmRpZmYgLS1naXQgYS9sZC9hY2xvY2FsLm00IGIvbGQvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5MzRiMC4uMDAwMDAwMAotLS0gYS9sZC9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTEyMCArMCwwIEBACi1kbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNAotCi1kbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1kbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLWRubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci1kbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotc2luY2x1ZGUoLi4vYmZkL2FjaW5jbHVkZS5tNCkKLQotIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoIC0tCi0jIHNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZiB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4KLSMgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCi0KLSMgc2VyaWFsIDEKLQotZG5sIFVzYWdlOgotZG5sIEFNX0lOSVRfQVVUT01BS0UocGFja2FnZSx2ZXJzaW9uLCBbbm8tZGVmaW5lXSkKLQotQUNfREVGVU4oQU1fSU5JVF9BVVRPTUFLRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKQotUEFDS0FHRT1bJDFdCi1BQ19TVUJTVChQQUNLQUdFKQotVkVSU0lPTj1bJDJdCi1BQ19TVUJTVChWRVJTSU9OKQotZG5sIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQotZmkKLWlmZWxzZShbJDNdLCwKLUFDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKLUFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pKQotQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSkKLUFDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSkKLWRubCBGSVhNRSBUaGlzIGlzIHRydWx5IGdyb3NzLgotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLUFNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlciwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbywgJG1pc3NpbmdfZGlyKQotQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pXSkKLQotIwotIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4KLSMKLQotQUNfREVGVU4oQU1fU0FOSVRZX0NIRUNLLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiWyRdKiIgPSAiWCI7IHRoZW4KLSAgICAgICMgLUwgZGlkbid0IHdvcmsuCi0gICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAotICAgZmkKLSAgIGlmIHRlc3QgIlskXSoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiWyRdKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQotICAgZmkKLQotICAgdGVzdCAiWyRdMiIgPSBjb25mdGVzdGZpbGUKLSAgICkKLXRoZW4KLSAgICMgT2suCi0gICA6Ci1lbHNlCi0gICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQotQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotQUNfTVNHX1JFU1VMVCh5ZXMpXSkKLQotZG5sIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNLCBESVJFQ1RPUlkpCi1kbmwgVGhlIHByb2dyYW0gbXVzdCBwcm9wZXJseSBpbXBsZW1lbnQgLS12ZXJzaW9uLgotQUNfREVGVU4oQU1fTUlTU0lOR19QUk9HLAotW0FDX01TR19DSEVDS0lORyhmb3Igd29ya2luZyAkMikKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmICgkMiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICQxPSQyCi0gICBBQ19NU0dfUkVTVUxUKGZvdW5kKQotZWxzZQotICAgJDE9IiQzL21pc3NpbmcgJDIiCi0gICBBQ19NU0dfUkVTVUxUKG1pc3NpbmcpCi1maQotQUNfU1VCU1QoJDEpXSkKLQotCi0jIHNlcmlhbCAzNSBBQ19QUk9HX0xJQlRPT0wKLUFDX0RFRlVOKEFDX1BST0dfTElCVE9PTCwKLVtBQ19SRVFVSVJFKFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1BQ19DQUNIRV9TQVZFCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgQUNfTVNHX0VSUk9SKFtsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWRdKQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1BQ19DQUNIRV9MT0FECi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi1BQ19TVUJTVChMSUJUT09MKWRubAotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi1dKQotCi1BQ19ERUZVTihBQ19MSUJUT09MX1NFVFVQLAotW0FDX1BSRVJFUSgyLjEzKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKLWRubAotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCi0gICAgW0FDX1RSWV9MSU5LKFtdLFtdLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKV0pCi0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICBBQ19TWVNfTElCVE9PTF9DWUdXSU4KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotQUNfQVJHX0VOQUJMRShsaWJ0b29sLWxvY2ssCi1bICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmddLAotbmVlZF9sb2Nrcz0kZW5hYmxldmFsLAotbmVlZF9sb2Nrcz15ZXMpCi0KLWlmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KLSAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi1maQotXSkKLQotIyBBQ19MSUJUT09MX0RMT1BFTiAtIGNoZWNrIGZvciBkbG9wZW4gc3VwcG9ydAotQUNfREVGVU4oQUNfTElCVE9PTF9ETE9QRU4sIFtsdF9kbG9wZW49eWVzXSkKLQotIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU0hBUkVELAotW2RlZmluZShbQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHNoYXJlZCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3NoYXJlZD1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU0hBUkVEIC0gc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU0hBUkVELAotW0FDX0VOQUJMRV9TSEFSRUQobm8pXSkKLQotIyBBQ19FTkFCTEVfU1RBVElDIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX1NUQVRJQ1soREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfU1RBVElDLAotW2RlZmluZShbQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKHN0YXRpYywKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX3N0YXRpYz1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0RJU0FCTEVfU1RBVElDIC0gc2V0IHRoZSBkZWZhdWx0IHN0YXRpYyBmbGFnIHRvIC0tZGlzYWJsZS1zdGF0aWMKLUFDX0RFRlVOKEFDX0RJU0FCTEVfU1RBVElDLAotW0FDX0VOQUJMRV9TVEFUSUMobm8pXSkKLQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwsCi1bZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoZmFzdC1pbnN0YWxsLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD0+PkFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9mYXN0X2luc3RhbGw9QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gc2V0IHRoZSBkZWZhdWx0IHRvIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwKLUFDX0RFRlVOKEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMLAotW0FDX0VOQUJMRV9GQVNUX0lOU1RBTEwobm8pXSkKLQotCi0jIEFDX1BST0dfTEQgLSBmaW5kIHRoZSBwYXRoIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKLUFDX0RFRlVOKEFDX1BST0dfTEQsCi1bQUNfQVJHX1dJVEgoZ251LWxkLAotWyAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXV0sCi10ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMsIHdpdGhfZ251X2xkPW5vKQotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotY2hhbmdlcXVvdGUoLClkbmwKLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQotZWxzZQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKLWZpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9MRCwKLVtpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmldKQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKCRMRCkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi10ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQotQUNfU1VCU1QoTEQpCi1BQ19QUk9HX0xEX0dOVQotXSkKLQotQUNfREVGVU4oQUNfUFJPR19MRF9HTlUsCi1bQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgYWNfY3ZfcHJvZ19nbnVfbGQsCi1bIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maV0pCi1dKQotCi0jIEFDX1BST0dfTk0gLSBmaW5kIHRoZSBwYXRoIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKLUFDX0RFRlVOKEFDX1BST0dfTk0sCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTk0sCi1baWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maV0pCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1BQ19NU0dfUkVTVUxUKFskTk1dKQotQUNfU1VCU1QoTk0pCi1dKQotCi0jIEFDX1NZU19OTV9QQVJTRSAtIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZAotIyBieSBDIHN5bWJvbCBuYW1lIGZyb20gbm0uCi1BQ19ERUZVTihBQ19TWVNfTk1fUEFSU0UsCi1bQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotQUNfTVNHX0NIRUNLSU5HKFtjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUsCi1bIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQotCi1jaGFuZ2VxdW90ZSgsKWRubAotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJGFjX3N5bWNvZGVcKVsgCV1bIAldKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIAotICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1jaGFuZ2VxdW90ZSgsKWRubAotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci1jaGFuZ2VxdW90ZShbLF0pZG5sCi17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotCSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi0JICBmaQotCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotXSkKLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1BQ19NU0dfUkVTVUxUKCRhY19yZXN1bHQpCi1dKQotCi0jIEFDX1NZU19MSUJUT09MX0NZR1dJTiAtIGZpbmQgdG9vbHMgbmVlZGVkIG9uIGN5Z3dpbgotQUNfREVGVU4oQUNfU1lTX0xJQlRPT0xfQ1lHV0lOLAotW0FDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCi1BQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCi1dKQotCi0jIEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSAtIGRvZXMgdGhlIGNvbXBpbGVyIHByZWZpeCBnbG9iYWwgc3ltYm9scwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIHVuZGVyc2NvcmU/Ci1BQ19ERUZVTihBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAotQUNfTVNHX0NIRUNLSU5HKFtmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9sc10pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlLAotW2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICBhY19ubGlzdD1jb25mdGVzdC5ubQotICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQwotICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi1maQotcm0gLXJmIGNvbmZ0ZXN0KgotXSkKLUFDX01TR19SRVNVTFQoJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSkKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KLUFDX1NVQlNUKFVTRV9TWU1CT0xfVU5ERVJTQ09SRSlkbmwKLV0pCi0KLSMgQUNfQ0hFQ0tfTElCTSAtIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKLUFDX0RFRlVOKEFDX0NIRUNLX0xJQk0sIFsKLUFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wpCi1BQ19DSEVDS19MSUIobSwgY29zKQotXSkKLQotIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSwgYWRkcyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi1BQ19ERUZVTihBQ19MSUJMVERMX0NPTlZFTklFTkNFLCBbCi0gIGNhc2UgIiRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSIgaW4KLSAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7Ci0gICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKLSAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKLSAgZXNhYwotICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKLV0pCi0KLSMgQUNfTElCTFRETF9JTlNUQUxMQUJMRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnksIGFuZCBhZGRzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotIyBJbiB0aGUgZnV0dXJlLCB0aGlzIG1hY3JvIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBhZnRlciBBQ19QUk9HX0xJQlRPT0wuCi1BQ19ERUZVTihBQ19MSUJMVERMX0lOU1RBTExBQkxFLCBbCi0gIEFDX0NIRUNLX0xJQihsdGRsLCBtYWluLCBMSUJMVERMPSItbGx0ZGwiLCBbCi0gICAgY2FzZSAiJGVuYWJsZV9sdGRsX2luc3RhbGwiIGluCi0gICAgbm8pIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKSA7OwotICAgICIiKSBlbmFibGVfbHRkbF9pbnN0YWxsPXllcwotICAgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIgOzsKLSAgICBlc2FjCi0gIF0pCi0gIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geCJubyI7IHRoZW4KLSAgICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbC5sYQotICBmaQotXSkKLQotZG5sIG9sZCBuYW1lcwotQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLCBbaW5kaXIoW0FDX1BST0dfTElCVE9PTF0pXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRU5BQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0VOQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRElTQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRElTQUJMRV9TVEFUSUNdLCAkQCldKWRubAotQUNfREVGVU4oQU1fUFJPR19MRCwgW2luZGlyKFtBQ19QUk9HX0xEXSldKWRubAotQUNfREVGVU4oQU1fUFJPR19OTSwgW2luZGlyKFtBQ19QUk9HX05NXSldKWRubAotQUNfREVGVU4oQU1fU1lTX05NX1BBUlNFLCBbaW5kaXIoW0FDX1NZU19OTV9QQVJTRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwgW2luZGlyKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTElCVE9PTF9DWUdXSU4sIFtpbmRpcihbQUNfU1lTX0xJQlRPT0xfQ1lHV0lOXSldKWRubAotCi0jIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCi0KLUFDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCi1bQUNfUFJFUkVRKFsyLjEyXSkKLUFDX0NPTkZJR19IRUFERVIoWyQxXSkKLWRubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKLWRubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KLUFDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKLWlmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKLTw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCi08PGFtX2luZHg9MQotZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbwotICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCi0gICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+Ci0gICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKLSAgICA7OwotICBlc2FjCi0gIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAotZG9uZTw8Pj5kbmw+PikKLWNoYW5nZXF1b3RlKFssXSkpXSkKLQotIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCi0jIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCi0KLSMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDMKLQotQUNfREVGVU4oQ1lfV0lUSF9OTFMsCi0gIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKLSAgICBBQ19BUkdfRU5BQkxFKG5scywKLSAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAotICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKLSAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQotICAgIEFDX1NVQlNUKFVTRV9OTFMpCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAotICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCi0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQotICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KLQlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KLQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKLQkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAotCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCi0JICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKLQkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCi0JCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKLQkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQotCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLQkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAotCQkgIFtDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCi0JCSAgW0NBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliXSkKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCV0pCi0KLQlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KLSAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KLQotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgotCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgotCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCi0gICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKLSAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0gICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQotICAgICAgICBBQ19TVUJTVChNU0dGTVQpCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgotICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCi0JZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KLQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBBQ19NU0dfUkVTVUxUKAotCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKLSAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCi0gICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KLSAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgotICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQotICAgIEFDX1NVQlNUKENBVEFMT0dTKQotICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKLSAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKLSAgICBBQ19TVUJTVChHTU9GSUxFUykKLSAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQotICAgIEFDX1NVQlNUKElOVExERVBTKQotICAgIEFDX1NVQlNUKElOVExMSUJTKQotICAgIEFDX1NVQlNUKElOVExPQkpTKQotICAgIEFDX1NVQlNUKFBPRklMRVMpCi0gICAgQUNfU1VCU1QoUE9TVUIpCi0gIF0pCi0KLUFDX0RFRlVOKENZX0dOVV9HRVRURVhULAotICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAotICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKLQotICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQotICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCi0gICBmaQotCi0gICBBTV9MQ19NRVNTQUdFUwotICAgQ1lfV0lUSF9OTFMKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCi0gICAgIGZpCi0KLSAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCi0gICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCi0gICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKLSAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKLQotICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQotICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6Ci0gICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAotICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQotCi0JIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcwotICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCi0JIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCi0gICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKLSAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKLSAgIGRubCBwYWNrYWdlcy4KLSAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICBBQ19TVUJTVChHVF9OTykKLSAgIEFDX1NVQlNUKEdUX1lFUykKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKLQotICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCi0gICBsPQotICAgQUNfU1VCU1QobCkKLQotICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKLSAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQotICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCi0gICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgXSkKLQotIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAotZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQotQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKLVsjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKLVtjYXNlICJbJF0kMSIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIFskM107IHRoZW4KLQlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1kbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAotZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCi1pZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgotXSlkbmwKLSAgOzsKLWVzYWNdKWRubAotJDE9IiRhY19jdl9wYXRoXyQxIgotaWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoWyRdJDEpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotQUNfU1VCU1QoJDEpZG5sCi1dKQotCi0jIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAotICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKLSAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAotICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCi0JCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCi0gICAgZmkKLSAgZmldKQotCi0KLWRubCBBTV9QUk9HX0xFWAotZG5sIExvb2sgZm9yIGZsZXgsIGxleCBvciBtaXNzaW5nLCB0aGVuIHJ1biBBQ19QUk9HX0xFWCBhbmQgQUNfREVDTF9ZWVRFWFQKLUFDX0RFRlVOKEFNX1BST0dfTEVYLAotW21pc3NpbmdfZGlyPWlmZWxzZShbJDFdLCxgY2QgJGFjX2F1eF9kaXIgJiYgcHdkYCwkMSkKLUFDX0NIRUNLX1BST0dTKExFWCwgZmxleCBsZXgsICIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IikKLUFDX1BST0dfTEVYCi1BQ19ERUNMX1lZVEVYVF0pCi0KLSMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLgotIyBGcm9tIEppbSBNZXllcmluZwotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX01BSU5UQUlORVJfTU9ERSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKLSAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAotWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbCwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8pCi0gIEFDX01TR19SRVNVTFQoJFVTRV9NQUlOVEFJTkVSX01PREUpCi0gIEFNX0NPTkRJVElPTkFMKE1BSU5UQUlORVJfTU9ERSwgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllcykKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIEFDX1NVQlNUKE1BSU5UKWRubAotXQotKQotCi0jIERlZmluZSBhIGNvbmRpdGlvbmFsLgotCi1BQ19ERUZVTihBTV9DT05ESVRJT05BTCwKLVtBQ19TVUJTVCgkMV9UUlVFKQotQUNfU1VCU1QoJDFfRkFMU0UpCi1pZiAkMjsgdGhlbgotICAkMV9UUlVFPQotICAkMV9GQUxTRT0nIycKLWVsc2UKLSAgJDFfVFJVRT0nIycKLSAgJDFfRkFMU0U9Ci1maV0pCi0KZGlmZiAtLWdpdCBhL2xkL2NvbmZpZy5pbiBiL2xkL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxN2JkYy4uMDAwMDAwMAotLS0gYS9sZC9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgbGV4IGRlY2xhcmVzIHl5dGV4dCBhcyBhIGNoYXIgKiBieSBkZWZhdWx0LCBub3QgYSBjaGFyW10uICAqLwotI3VuZGVmIFlZVEVYVF9QT0lOVEVSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2JyayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TQlJLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxkaXJlbnQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRElSRU5UX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmRpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9ORElSX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0RJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9uZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19ORElSX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFMVUVTX0gKLQotLyogTmFtZSBvZiBwYWNrYWdlICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jdW5kZWYgVkVSU0lPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbiAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogVXNlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gKi8KLSN1bmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0KLS8qIERlZmluZSBpZiBzdHJzdHIgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLQotLyogRGVmaW5lIGlmIGZyZWUgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi0KLS8qIERlZmluZSBpZiBzYnJrIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSwotCi0vKiBEZWZpbmUgaWYgZ2V0ZW52IGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fR0VURU5WCi0KLS8qIERlZmluZSBpZiBlbnZpcm9uIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgotCi0vKiBBZGRpdGlvbmFsIGV4dGVuc2lvbiBhIHNoYXJlZCBvYmplY3QgbWlnaHQgaGF2ZS4gKi8KLSN1bmRlZiBFWFRSQV9TSExJQl9FWFRFTlNJT04KLQpkaWZmIC0tZ2l0IGEvbGQvY29uZmlndXJlIGIvbGQvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YjRlYzVlLi4wMDAwMDAwCi0tLSBhL2xkL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDUyODQgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLTY0LWJpdC1iZmQgICAgIDY0LWJpdCBzdXBwb3J0IChvbiBob3N0cyB3aXRoIG5hcnJvd2VyIHdvcmQgc2l6ZXMpIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1sZG1haW4uYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1OTQ6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjE1OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MzM6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjY4OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcyMTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3Nzg6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPWxkCi0KLVZFUlNJT049Mi45LjUKLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1FT0YKLQotCi0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MjQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODM3OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPQ09ORj1hdXRvY29uZgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg1MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT01BS0U9YXV0b21ha2UKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg2MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzY6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIE1BS0VJTkZPPW1ha2VpbmZvCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5NjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk5MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAyMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMDU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDExMTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTIxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNDc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTUyOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTYxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExODA6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjIzOiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNDc6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI1MDogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyODY6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMDI6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzQwOiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDAzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDA3OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1MDU6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUxNzogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotcm0gLXJmIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTQzOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KLSAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KLWVsc2UKLSAgYWNfdG9vbF9wcmVmaXg9Ci1maQotCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSAxNTg1ICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTg2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MDc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjEyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjE5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY0MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9ImRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiICYmIGFjX2N2X3Byb2dfRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBETExUT09MPSJmYWxzZSIKLWZpCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcwOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9ImFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyIgJiYgYWNfY3ZfcHJvZ19BUz0iZmFsc2UiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgQVM9ImZhbHNlIgotZmkKLWZpCi0KLQotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0gIG5lZWRfbG9ja3M9JGVuYWJsZXZhbAotZWxzZQotICBuZWVkX2xvY2tzPXllcwotZmkKLQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLQotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9Ci0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtNjQtYml0LWJmZCBvciAtLWRpc2FibGUtNjQtYml0LWJmZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV82NF9iaXRfYmZkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV82NF9iaXRfYmZkIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgIHdhbnQ2ND10cnVlICA7OwotICBubykgICB3YW50NjQ9ZmFsc2UgOzsKLSAgKikgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciA2NC1iaXQtYmZkIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1lbHNlCi0gIHdhbnQ2ND1mYWxzZQotZmkKLQotCi0KLQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotaWYgdGVzdCAteiAiJGhvc3QiIDsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi0jIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6Ci0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkxMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5OTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMjM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDIwMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDM5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNjU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDcwOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDc5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwOTg6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE0MTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTk2OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyNTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNzY6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyOTc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIzMTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM3NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDAxOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ1NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDc2OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0ODMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDkwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjUxNjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUyMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTQ5OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1ODQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTg5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1OTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjE3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY1MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI2ODI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjg3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcxMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjcxNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzQwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3Njc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzc1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3OTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgxOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4MjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI4Mjk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg1ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg2MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODg2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTExOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTE5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA4NzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwOTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwOTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTI3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTMyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxODQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxODkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIxMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjQ2OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyNTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI3OTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjk5OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMTg6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzMjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMyODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzNDU6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM1MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM1NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzczOiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM4MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzOTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MDg6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQxMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDQ4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDgyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDg3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1MTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1Mzc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTczOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2MDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2MTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjQ1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY3OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3MTU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MDU6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MzM6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4MzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzg0MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5MDY6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotI2lmbmRlZiBfX0NZR1dJTl9fCi0jZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCi0jZW5kaWYKLXJldHVybiBfX0NZR1dJTl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5MjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgotQ1lHV0lOPQotdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5Mzk6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzk0NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIF9fTUlOR1czMl9fOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5NTE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9taW5ndzMyPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgotTUlOR1czMj0KLXRlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcwotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzk3MDogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZXhlZXh0PS5leGUKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAotICBhY19jdl9leGVleHQ9Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk4MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgotICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCi0gICAgICBjYXNlICRmaWxlIGluCi0gICAgICAqLmMgfCAqLm8gfCAqLm9iaikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi1mb3IgYWNfcHJvZyBpbiAnYmlzb24gLXknIGJ5YWNjCi1kbwotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDAwNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1lBQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ZQUNDPSIkWUFDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfWUFDQz0iJGFjX3Byb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVlBQ0M9IiRhY19jdl9wcm9nX1lBQ0MiCi1pZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRZQUNDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotdGVzdCAtbiAiJFlBQ0MiICYmIGJyZWFrCi1kb25lCi10ZXN0IC1uICIkWUFDQyIgfHwgWUFDQz0ieWFjYyIKLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWZvciBhY19wcm9nIGluIGZsZXggbGV4Ci1kbwotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA0MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19MRVg9IiRhY19wcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1MRVg9IiRhY19jdl9wcm9nX0xFWCIKLWlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEVYIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotdGVzdCAtbiAiJExFWCIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRMRVgiIHx8IExFWD0iIiRtaXNzaW5nX2Rpci9taXNzaW5nIGZsZXgiIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImZsZXgiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGZsZXg7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA3NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19MRVg9ImZsZXgiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0xFWCIgJiYgYWNfY3ZfcHJvZ19MRVg9ImxleCIKLWZpCi1maQotTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCi1pZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRMRVhMSUIiCi10aGVuCi0gIGNhc2UgIiRMRVgiIGluCi0gIGZsZXgqKSBhY19saWI9ZmwgOzsKLSAgKikgYWNfbGliPWwgOzsKLSAgZXNhYwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDEwOTogY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiID4mNQotYWNfbGliX3Zhcj1gZWNobyAkYWNfbGliJ18neXl3cmFwIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbCRhY19saWIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDExNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHl5d3JhcCgpOwotCi1pbnQgbWFpbigpIHsKLXl5d3JhcCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDEyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTEVYTElCPSItbCRhY19saWIiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxNTE6IGNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2xleF9yb290JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBUaGUgbWluaW1hbCBsZXggcHJvZ3JhbSBpcyBqdXN0IGEgc2luZ2xlIGxpbmU6ICUlLiAgQnV0IHNvbWUgYnJva2VuIGxleGVzCi0jIChTb2xhcmlzLCBJIHRoaW5rIGl0IHdhcykgd2FudCB0d28gJSUgbGluZXMsIHNvIGFjY29tbW9kYXRlIHRoZW0uCi1lY2hvICclJQotJSUnIHwgJExFWAotaWYgdGVzdCAtZiBsZXgueXkuYzsgdGhlbgotICBhY19jdl9wcm9nX2xleF9yb290PWxleC55eQotZWxpZiB0ZXN0IC1mIGxleHl5LmM7IHRoZW4KLSAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXh5eQotZWxzZQotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbm5vdCBmaW5kIG91dHB1dCBmcm9tICRMRVg7IGdpdmluZyB1cCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF9yb290IiAxPiY2Ci1MRVhfT1VUUFVUX1JPT1Q9JGFjX2N2X3Byb2dfbGV4X3Jvb3QKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTcyOiBjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBQT1NJWCBzYXlzIGxleCBjYW4gZGVjbGFyZSB5eXRleHQgZWl0aGVyIGFzIGEgcG9pbnRlciBvciBhbiBhcnJheTsgdGhlCi0jIGRlZmF1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiBGaWd1cmUgb3V0IHdoaWNoIGl0IGlzLCBzaW5jZQotIyBub3QgYWxsIGltcGxlbWVudGF0aW9ucyBwcm92aWRlIHRoZSAlcG9pbnRlciBhbmQgJWFycmF5IGRlY2xhcmF0aW9ucy4KLWFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPW5vCi1lY2hvICdleHRlcm4gY2hhciAqeXl0ZXh0OycgPj4kTEVYX09VVFBVVF9ST09ULmMKLWFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSIkTElCUyAkTEVYTElCIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDE4NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1gY2F0ICRMRVhfT1VUUFVUX1JPT1QuY2AKLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE5MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLXJtIC1mICIke0xFWF9PVVRQVVRfUk9PVH0uYyIKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFlZVEVYVF9QT0lOVEVSIDEKLUVPRgotCi1maQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjE0OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKLSAgCi0KLWlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICAKLQotCi0uICR7c3JjZGlyfS9jb25maWd1cmUuaG9zdAotCi0KLQotCi0KLQotZm9yIGFjX2hkciBpbiBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjQ4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDI1MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDI1ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIHNicmsKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyODc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyOTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDMxNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotYWNfaGVhZGVyX2RpcmVudD1ubwotZm9yIGFjX2hkciBpbiBkaXJlbnQuaCBzeXMvbmRpci5oIHN5cy9kaXIuaCBuZGlyLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzNDQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzQ5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDwkYWNfaGRyPgotaW50IG1haW4oKSB7Ci1ESVIgKmRpcnAgPSAwOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzNTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfZGlyZW50XyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSBhY19oZWFkZXJfZGlyZW50PSRhY19oZHI7IGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLSMgVHdvIHZlcnNpb25zIG9mIG9wZW5kaXIgZXQgYWwuIGFyZSBpbiAtbGRpciBhbmQgLWx4IG9uIFNDTyBYZW5peC4KLWlmIHRlc3QgJGFjX2hlYWRlcl9kaXJlbnQgPSBkaXJlbnQuaDsgdGhlbgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWxkaXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzODI6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gZGlyJ18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkaXIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDM5MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbGRpciIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0MjM6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIHgnXydvcGVuZGlyIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbHggICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIG9wZW5kaXIoKTsKLQotaW50IG1haW4oKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDQyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMSUJTPSIkTElCUyAtbHgiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZmkKLQotCi0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotbXNkb3MqIHwgKi0qLWdvMzIqIHwgKi0qLW1pbmd3MzIqIHwgKi0qLWN5Z3dpbiogfCAqLSotd2luZG93cyopCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOIDEKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0NzU6IGNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDgwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHN0cnN0cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1MDE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU1RSU1RSIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDUyMjogY2hlY2tpbmcgd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9mcmVlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDUyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBmcmVlCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDU0ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlJFRSAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzYnJrIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1Njk6IGNoZWNraW5nIHdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ1NzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc2JyawotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1OTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NCUksgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2MTY6IGNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjIxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGdldGVudgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NDI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnY9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fR0VURU5WIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGVudmlyb24gbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDY2MzogY2hlY2tpbmcgd2hldGhlciBlbnZpcm9uIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDY2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBlbnZpcm9uCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY4OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24gPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTiAxCi1FT0YKLQotZmkKLQotCi0jIFdoZW4gY29udmVydGluZyBsaW5rZXIgc2NyaXB0cyBpbnRvIHN0cmluZ3MgZm9yIHVzZSBpbiBlbXVsYXRpb24KLSMgZmlsZXMsIHVzZSBhc3RyaW5nLnNlZCBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgQU5TSSBzdHJpbmcKLSMgY29uY2F0ZW5hdGlvbiwgb3Igb3N0cmluZy5zZWQgb3RoZXJ3aXNlLiAgVGhpcyBpcyB0byBzdXBwb3J0IHRoZQotIyBicm9rZW4gTWljcm9zb2Z0IE1TVkMgY29tcGlsZXIsIHdoaWNoIGxpbWl0cyB0aGUgbGVuZ3RoIG9mIHN0cmluZwotIyBjb25zdGFudHMsIHdoaWxlIHN0aWxsIHN1cHBvcnRpbmcgcHJlLUFOU0kgY29tcGlsZXJzIHdoaWNoIGRvIG5vdAotIyBzdXBwb3J0IHN0cmluZyBjb25jYXRlbmF0aW9uLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBBTlNJIEMgc3RyaW5nIGNvbmNhdGVuYXRpb24gd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3MTc6IGNoZWNraW5nIHdoZXRoZXIgQU5TSSBDIHN0cmluZyBjb25jYXRlbmF0aW9uIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsZF9jdl9zdHJpbmdfY29uY2F0ZW5hdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3MjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKmEgPSAiYSIgImEiOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3Mjk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsZF9jdl9zdHJpbmdfY29uY2F0ZW5hdGlvbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbGRfY3Zfc3RyaW5nX2NvbmNhdGVuYXRpb249bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkbGRfY3Zfc3RyaW5nX2NvbmNhdGVuYXRpb24iIDE+JjYKLWlmIHRlc3QgIiRsZF9jdl9zdHJpbmdfY29uY2F0ZW5hdGlvbiIgPSAieWVzIjsgdGhlbgotICBTVFJJTkdJRlk9YXN0cmluZy5zZWQKLWVsc2UKLSAgU1RSSU5HSUZZPW9zdHJpbmcuc2VkCi1maQotCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi1hbGxfdGFyZ2V0cz0KLUVNVUw9Ci1hbGxfZW11bHM9Ci1hbGxfZW11bF9leHRyYXM9Ci1hbGxfbGlicGF0aD0KLQotcm0gLWYgdGRpcnMKLQotZm9yIHRhcmdfYWxpYXMgaW4gYGVjaG8gJHRhcmdldF9hbGlhcyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotZG8KLSAgaWYgdGVzdCAiJHRhcmdfYWxpYXMiID0gImFsbCI7IHRoZW4KLSAgICBhbGxfdGFyZ2V0cz10cnVlCi0gIGVsc2UKLSAgICAjIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLSAgICByZXN1bHQ9YCRhY19jb25maWdfc3ViICR0YXJnX2FsaWFzIDI+L2Rldi9udWxsYAotICAgIGlmIHRlc3QgLW4gIiRyZXN1bHQiOyB0aGVuCi0JdGFyZz0kcmVzdWx0Ci0gICAgZWxzZQotCXRhcmc9JHRhcmdfYWxpYXMKLSAgICBmaQotCi0gICAgLiAke3NyY2Rpcn0vY29uZmlndXJlLnRndAotCi0gICAgaWYgdGVzdCAiJHRhcmciID0gIiR0YXJnZXQiOyB0aGVuCi0gICAgICBFTVVMPSR0YXJnX2VtdWwKLSAgICBmaQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZW11bCAkdGFyZ19leHRyYV9lbXVscyAkdGFyZ19leHRyYV9saWJwYXRoOyBkbwotCWNhc2UgIiAkYWxsX2VtdWxzICIgaW4KLQkqIiBlJHtpfS5vICIqKSA7OwotCSopCi0JICBhbGxfZW11bHM9IiRhbGxfZW11bHMgZSR7aX0ubyIKLQkgIGV2YWwgcmVzdWx0PVwkdGRpcl8kaQotCSAgdGVzdCAteiAiJHJlc3VsdCIgJiYgcmVzdWx0PSR0YXJnX2FsaWFzCi0JICBlY2hvIHRkaXJfJGk9JHJlc3VsdCA+PiB0ZGlycwotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZW11bCAkdGFyZ19leHRyYV9saWJwYXRoOyBkbwotCWNhc2UgIiAkYWxsX2xpYnBhdGggIiBpbgotCSoiICR7aX0gIiopIDs7Ci0JKikKLQkgIGlmIHRlc3QgLXogIiRhbGxfbGlicGF0aCI7IHRoZW4KLQkgICAgYWxsX2xpYnBhdGg9JHtpfQotCSAgZWxzZQotCSAgICBhbGxfbGlicGF0aD0iJGFsbF9saWJwYXRoICR7aX0iCi0JICBmaQotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGkgaW4gJHRhcmdfZXh0cmFfb2ZpbGVzOyBkbwotCWNhc2UgIiAkYWxsX2VtdWxfZXh0cmFzICIgaW4KLQkqIiAke2l9ICIqKSA7OwotCSopCi0JICBhbGxfZW11bF9leHRyYXM9IiRhbGxfZW11bF9leHRyYXMgJHtpfSIKLQkgIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgZmkKLWRvbmUKLQotCi0KLVRESVJTPXRkaXJzCi0KLQotaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4dHJ1ZTsgdGhlbgotICBpZiB0ZXN0IHgke3dhbnQ2NH0gPSB4dHJ1ZTsgdGhlbgotICAgIEVNVUxBVElPTl9PRklMRVM9JyQoQUxMX0VNVUxBVElPTlMpICQoQUxMXzY0X0VNVUxBVElPTlMpJwotICBlbHNlCi0gICAgRU1VTEFUSU9OX09GSUxFUz0nJChBTExfRU1VTEFUSU9OUyknCi0gIGZpCi0gIEVNVUxfRVhUUkFfT0ZJTEVTPSckKEFMTF9FTVVMX0VYVFJBX09GSUxFUyknCi1lbHNlCi0gIEVNVUxBVElPTl9PRklMRVM9JGFsbF9lbXVscwotICBFTVVMX0VYVFJBX09GSUxFUz0kYWxsX2VtdWxfZXh0cmFzCi1maQotCi0KLQotRU1VTEFUSU9OX0xJQlBBVEg9JGFsbF9saWJwYXRoCi0KLQotaWYgdGVzdCB4JHtlbmFibGVfc3RhdGljfSA9IHhubzsgdGhlbgotICBURVNUQkZETElCPSItLXJwYXRoIC4uL2JmZC8ubGlicyAuLi9iZmQvLmxpYnMvbGliYmZkLnNvIgotZWxzZQotICBURVNUQkZETElCPSIuLi9iZmQvLmxpYnMvbGliYmZkLmEiCi1maQotCi0KLXRhcmdldF92ZW5kb3I9JHt0YXJnZXRfdmVuZG9yPSRob3N0X3ZlbmRvcn0KLWNhc2UgIiR0YXJnZXRfdmVuZG9yIiBpbgotICBocCkgRVhUUkFfU0hMSUJfRVhURU5TSU9OPSIuc2wiIDs7Ci0gICopICBFWFRSQV9TSExJQl9FWFRFTlNJT049IDs7Ci1lc2FjCi1pZiB0ZXN0IHgke0VYVFJBX1NITElCX0VYVEVOU0lPTn0gIT0geCA7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgRVhUUkFfU0hMSUJfRVhURU5TSU9OICIkRVhUUkFfU0hMSUJfRVhURU5TSU9OIgotRU9GCi0KLWZpCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENDQCUkQ0MlZwotcyVATERAJSRMRCVnCi1zJUBOTUAlJE5NJWcKLXMlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBETExUT09MQCUkRExMVE9PTCVnCi1zJUBBU0AlJEFTJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQENQUEAlJENQUCVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVAVVNFX05MU0AlJFVTRV9OTFMlZwotcyVATVNHRk1UQCUkTVNHRk1UJWcKLXMlQEdNU0dGTVRAJSRHTVNHRk1UJWcKLXMlQFhHRVRURVhUQCUkWEdFVFRFWFQlZwotcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCi1zJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKLXMlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCi1zJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKLXMlQEdNT0ZJTEVTQCUkR01PRklMRVMlZwotcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZwotcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCi1zJUBJTlRMTElCU0AlJElOVExMSUJTJWcKLXMlQElOVExPQkpTQCUkSU5UTE9CSlMlZwotcyVAUE9GSUxFU0AlJFBPRklMRVMlZwotcyVAUE9TVUJAJSRQT1NVQiVnCi1zJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCi1zJUBHVF9OT0AlJEdUX05PJWcKLXMlQEdUX1lFU0AlJEdUX1lFUyVnCi1zJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCi1zJUBsQCUkbCVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotcyVAWUFDQ0AlJFlBQ0MlZwotcyVATEVYQCUkTEVYJWcKLXMlQExFWExJQkAlJExFWExJQiVnCi1zJUBMRVhfT1VUUFVUX1JPT1RAJSRMRVhfT1VUUFVUX1JPT1QlZwotcyVATUFJTlRBSU5FUl9NT0RFX1RSVUVAJSRNQUlOVEFJTkVSX01PREVfVFJVRSVnCi1zJUBNQUlOVEFJTkVSX01PREVfRkFMU0VAJSRNQUlOVEFJTkVSX01PREVfRkFMU0UlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKLXMlQEhPU1RJTkdfQ1JUMEAlJEhPU1RJTkdfQ1JUMCVnCi1zJUBIT1NUSU5HX0xJQlNAJSRIT1NUSU5HX0xJQlMlZwotcyVATkFUSVZFX0xJQl9ESVJTQCUkTkFUSVZFX0xJQl9ESVJTJWcKLXMlQFNUUklOR0lGWUAlJFNUUklOR0lGWSVnCi1zJUBFTVVMQCUkRU1VTCVnCi0vQFRESVJTQC9yICRURElSUwotcyVAVERJUlNAJSVnCi1zJUBFTVVMQVRJT05fT0ZJTEVTQCUkRU1VTEFUSU9OX09GSUxFUyVnCi1zJUBFTVVMX0VYVFJBX09GSUxFU0AlJEVNVUxfRVhUUkFfT0ZJTEVTJWcKLXMlQEVNVUxBVElPTl9MSUJQQVRIQCUkRU1VTEFUSU9OX0xJQlBBVEglZwotcyVAVEVTVEJGRExJQkAlJFRFU1RCRkRMSUIlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1zZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9sZC9jb25maWd1cmUuaG9zdCBiL2xkL2NvbmZpZ3VyZS5ob3N0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2VkMTg4Li4wMDAwMDAwCi0tLSBhL2xkL2NvbmZpZ3VyZS5ob3N0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSMgVGhpcyBpcyB0aGUgbGlua2VyIGhvc3Qgc3BlY2lmaWMgZmlsZS4gIFRoaXMgaXMgaW52b2tlZCBieSB0aGUKLSMgYXV0b2NvbmYgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQuICBQdXR0aW5nIGl0IGluIGEgc2VwYXJhdGUgc2hlbGwKLSMgZmlsZSBsZXRzIHVzIHNraXAgcnVubmluZyBhdXRvY29uZiB3aGVuIG1vZGlmeWluZyBob3N0IHNwZWNpZmljCi0jIGluZm9ybWF0aW9uLgotCi0jIFRoaXMgZmlsZSBzZXRzIHRoZSBmb2xsb3dpbmcgc2hlbGwgdmFyaWFibGVzOgotIyAgSERFRklORVMJCWhvc3Qgc3BlY2lmaWMgY29tcGlsZXIgZmxhZ3MKLSMgIEhPU1RJTkdfQ1JUMAkJY3J0MC5vIGZpbGUgdXNlZCBmb3IgYm9vdHN0cmFwcGluZwotIyAgSE9TVElOR19MSUJTCQlsaWJyYXJpZXMgdXNlZCBmb3IgYm9vdHN0cmFwcGluZwotIyAgTkFUSVZFX0xJQl9ESVJTCWxpYnJhcnkgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIG9uIHRoaXMgaG9zdAotCi1IREVGSU5FUz0KLUhPU1RJTkdfQ1JUMD0vbGliL2NydDAubwotSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjJwotTkFUSVZFX0xJQl9ESVJTPQotCi1jYXNlICIke2hvc3R9IiBpbgotCi1hbHBoYSotKi1saW51eC1nbnUqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciBgZWdyZXAgImxkW14gXSpcLnNvIiBcYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPXNwZWNzXGAgfCBzZWQgLWUgInMsLiotZHluYW1pYy1saW5rZXJbIAldWyAJXSpcKC4qL2xkW14gXSouc28uLlwpLiosXDEsImAgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydDEub2AgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGkub2AgYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLUxgZGlybmFtZSBcYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWxpYmMuc29cYGAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRuLm9gJwotICA7OwotCi1hbHBoYSotKi1uZXRic2QqKQotICAjIFRoZSBuZXcgQlNEIGBtYWtlJyBoYXMgYSBidWc6IGl0IGRvZXNuJ3QgcGFzcyBlbXB0eSBhcmd1bWVudHMgaW4KLSAgIyBzaGVsbCBjb21tYW5kcy4gIFNvIHdlIG5lZWQgdG8gbWFrZSB0aGlzIHZhbHVlIG5vbi1lbXB0eSBpbiBvcmRlcgotICAjIGZvciB0aGUgZ2Vuc2NyaXB0cy5zaCBjYWxsIHRvIHdvcmsuICBUaGVyZSdzIG5vdGhpbmcgbWFnaWMgYWJvdXQKLSAgIyB0aGUgdmFsdWUgYC9saWInOyBpdCdzIGp1c3QgYSBkdW1teS4KLSAgTkFUSVZFX0xJQl9ESVJTPS9saWIKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDAubwotICA7OwotCi1hbHBoYSotKi0qKQotICBIT1NUSU5HX0NSVDA9L3Vzci9jY3MvbGliL2NydDAubwotICBOQVRJVkVfTElCX0RJUlM9L3Vzci9jY3MvbGliCi0gIDs7Ci0KLWFybSotKi1saW51eC1nbnUqKQotICBIT1NUSU5HX0NSVDA9Jy1wIC1keW5hbWljLWxpbmtlciBgZmdyZXAgbGQtbGludXguc28gXGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1zcGVjc1xgIHwgc2VkIC1lICJzLC4qLWR5bmFtaWMtbGlua2VyWyAJXVsgCV0qXCguKi9sZC1saW51eC5zby4uXCkuKixcMSwiYCBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0MS5vYCBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0aS5vYCBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtTGBkaXJuYW1lIFxgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9bGliYy5zb1xgYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydG4ub2AnCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLWJzZCogfCBpWzM0NTZdODYtKi1mcmVlYnNkKiB8IGlbMzQ1Nl04Ni0qLW5ldGJzZCopCi0gICMgVGhlIG5ldyBCU0QgYG1ha2UnIGhhcyBhIGJ1ZzogaXQgZG9lc24ndCBwYXNzIGVtcHR5IGFyZ3VtZW50cyBpbgotICAjIHNoZWxsIGNvbW1hbmRzLiAgU28gd2UgbmVlZCB0byBtYWtlIHRoaXMgdmFsdWUgbm9uLWVtcHR5IGluIG9yZGVyCi0gICMgZm9yIHRoZSBnZW5zY3JpcHRzLnNoIGNhbGwgdG8gd29yay4gIFRoZXJlJ3Mgbm90aGluZyBtYWdpYyBhYm91dAotICAjIHRoZSB2YWx1ZSBgL2xpYic7IGl0J3MganVzdCBhIGR1bW15LgotICBOQVRJVkVfTElCX0RJUlM9L2xpYgotICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MC5vCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLXN5c3Y0KikKLSAgSE9TVElOR19DUlQwPScvdXNyL2Njcy9saWIvY3J0MS5vIC91c3IvY2NzL2xpYi9jcnRpLm8gL3Vzci9jY3MvbGliL3ZhbHVlcy1YYS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2Njcy9saWIvY3J0bi5vJwotICBOQVRJVkVfTElCX0RJUlM9L3Vzci9jY3MvbGliCi0gIDs7Ci0KLWlbMzQ1Nl04Ni1zZXF1ZW50LXB0eCogfCBpWzM0NTZdODYtc2VxdWVudC1zeXN2KikKLSAgSE9TVElOR19DUlQwPScvbGliL2NydDAubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAnCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLXN5c3YqKQotICBIT1NUSU5HX0NSVDA9Jy9saWIvY3J0MS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGZpYCAvbGliL2NydG4ubycKLSAgOzsKLQotaVszNDU2XTg2LSotc29sYXJpcyopCi0gIEhPU1RJTkdfQ1JUMD0nYGlmIFsgLWYgLi4vZ2NjL2NydDEubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydDEubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydDEubzsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRpLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRpLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRpLm87IGZpYCAvdXNyL2Njcy9saWIvdmFsdWVzLVhhLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRuLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRuLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRuLm87IGZpYCcKLSAgTkFUSVZFX0xJQl9ESVJTPS91c3IvY2NzL2xpYgotICA7OwotCi1pWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotaXNjKikKLSAgIyBJbiBzb21lIGNvbmZpZ3VyYXRpb25zIGdjYyBkb2VzIG5vdCB1c2UgY3J0YmVnaW4ubyBhbmQgY3J0ZW5kLm8uCi0gICMgSW4gdGhhdCBjYXNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm8gd2lsbCBzaW1wbHkgcHJpbnQKLSAgIyBjcnRiZWdpbi5vLiAgV2UgY3JlYXRlIGR1bW15IGNydGJlZ2luLm8gYW5kIGNydGVuZC5vIGZpbGVzIHRvCi0gICMgaGFuZGxlIHRoaXMuCi0gIGVjaG8gImludCBkdW1teV9jcnRiZWdpbiAoKSB7IHJldHVybiAwOyB9IiA+IGNydGJlZ2luLmMKLSAgJHtDQ30gLWMgY3J0YmVnaW4uYyAtbyBjcnRiZWdpbi5vCi0gIHJtIC1mIGNydGJlZ2luLmMKLSAgZWNobyAiaW50IGR1bW15X2NydGVuZyAoKSB7IHJldHVybiAwOyB9IiA+IGNydGVuZC5jCi0gICR7Q0N9IC1jIGNydGVuZC5jIC1vIGNydGVuZC5vCi0gIHJtIC1mIGNydGVuZC5jCi0gIEhPU1RJTkdfQ1JUMD0nL2xpYi9jcnQxLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC9saWIvY3J0bi5vJwotICA7OwotCi1pWzM0NTZdODYtKi1saW51eCphb3V0KiB8IGlbMzQ1Nl04Ni0qLWxpbnV4b2xkbGQpCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KLSAgOzsKLQotaVszNDU2XTg2LSotbGludXgqbGliYzEqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLWxpbnV4LnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsaWYgWyAtZiAvdXNyL2xpYi9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxpZiBbIC1mIC91c3IvbGliL2NydGVuZC5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRlbmQubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliL2NydG4ubycKLSAgOzsKLQotaVszNDU2XTg2LSotbGludXgtZ251KikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgYGZncmVwIGxkLWxpbnV4LnNvIFxgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9c3BlY3NcYCB8IHNlZCAtZSAicywuKi1keW5hbWljLWxpbmtlclsgCV1bIAldKlwoLiovbGQtbGludXguc28uLlwpLiosXDEsImAgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydDEub2AgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGkub2AgYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLUxgZGlybmFtZSBcYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWxpYmMuc29cYGAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRuLm9gJwotICA7OwotCi1pWzM0NTZdODYtKi1seW54b3MqKQotICBIT1NUSU5HX0NSVDA9L2xpYi9pbml0MS5vCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyAtbG0gL2xpYi9pbml0bi5vJwotICA7OwotCi1pWzM0NTZdODYtcGMtaW50ZXJpeCopCi0gIEhPU1RJTkdfQ1JUMD0nJCRJTlRFUklYX1JPT1QvdXNyL2xpYi9jcnQwLm8nCi0gIE5BVElWRV9MSUJfRElSUz0nJCRJTlRFUklYX1JPT1QvdXNyL2xpYi8nCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1MICQkWC9sb2NhbF9iaW4gLUwgJCRJTlRFUklYX1JPT1QvdXNyL2xpYiAtbGMgLWxjcHN4IC1sYyAtbGNwc3ggJCRJTlRFUklYX1JPT1QvdXNyL2xpYi9wc3hkbGwuYSAkJElOVEVSSVhfUk9PVC91c3IvbGliL3BzeGRsbDIuYScKLSAgOzsKLQotbWlwcyotZGVjLWJzZCopCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KLSAgOzsKLQotbWlwcyotc2dpLWlyaXg0KikKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDEubwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgL3Vzci9saWIvY3J0bi5vJwotICA7OwotCi1taXBzKi1zZ2ktaXJpeDUqKQotICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MS5vCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLW1pcHMqLXNnaS1pcml4NiopCi0gIEhPU1RJTkdfQ1JUMD0nL3Vzci9saWIzMi9jcnQxLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vIDsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLUwvdXNyL2xpYjMyIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubyA7IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliMzIvY3J0bi5vIC1pbml0IF9fZG9fZ2xvYmFsX2N0b3JzIC1maW5pIF9fZG9fZ2xvYmFsX2R0b3JzJwotICA7OwotCi1taXBzKi0qLWxpbnV4LWdudSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIC9saWIvbGQuc28uMSAvdXNyL2xpYi9jcnQxLm8gL3Vzci9saWIvY3J0aS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLW02OCotKi1saW51eCphb3V0KikKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDAubwotICA7OwotCi1tNjgqLSotbGludXgqbGliYzEqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLWxpbnV4LnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsaWYgWyAtZiAvdXNyL2xpYi9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxpZiBbIC1mIC91c3IvbGliL2NydGVuZC5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRlbmQubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliL2NydG4ubycKLSAgOzsKLQotbTY4Ki0qLWxpbnV4LWdudSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIC9saWIvbGQuc28uMSAvdXNyL2xpYi9jcnQxLm8gL3Vzci9saWIvY3J0aS5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLW02OCotKi1seW54b3MqKQotICBIT1NUSU5HX0NSVDA9L2xpYi9pbml0MS5vCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyAtbG0gL2xpYi9pbml0bi5vJwotICA7OwotCi1tNjgqLW1vdG9yb2xhLXN5c3YpCi0gIEhPU1RJTkdfQ1JUMD0nYGlmIFsgLWYgLi4vZ2NjL2NydDAubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydDAubzsgZWxpZiBbIC1mIFxgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1cYGNydDAubyBdOyB0aGVuIGVjaG8gXGAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPVxgY3J0MC5vOyBlbHNlIGVjaG8gL2xpYi9jcnQwLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjODgxIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCcKLSAgOzsKLQotbTY4Ki1zdW4tKikKLSAgSE9TVElOR19DUlQwPScvdXNyL2xpYi9jcnQwLm8gL3Vzci9saWIvRmNydDEubyAtTC91c3IvbGliL2Zzb2Z0Lm8nCi0gIDs7Ci0KLW04OCotKi1kZ3V4KikKLSAgSERFRklORVM9LURfX3VzaW5nX0RHVVgKLSAgSE9TVElOR19DUlQwPScvbGliL2NydDAubyAtWCcKLSAgSE9TVElOR19MSUJTPS91c3Ivc2RlL204OGtiY3MvbGliL2xpYmMuYQotICA7OwotCi1tODgqLW1vdG9yb2xhLXN5c3YzKQotICBIT1NUSU5HX0NSVDA9Jy9saWIvY3J0MC5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAnCi0gIDs7Ci0KLXBvd2VycGMqLSotbGludXgtZ251KikKLSAgSE9TVElOR19DUlQwPSctZHluYW1pYy1saW5rZXIgL2xpYi9sZC5zby4xIC91c3IvbGliL2NydDEubyAvdXNyL2xpYi9jcnRpLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlICR7Q0N9IC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSAke0NDfSAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliL2NydG4ubycKLSAgOzsKLQotcm9tcC0qLSopCi0gIEhERUZJTkVTPS1ETk9fVkFSQVJHUwotICA7OwotCi1zcGFyYyotKi1zb2xhcmlzMiopCi0gIEhPU1RJTkdfQ1JUMD0nYGlmIFsgLWYgLi4vZ2NjL2NydDEubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydDEubzsgZWxzZSAke0NDfSAtcHJpbnQtZmlsZS1uYW1lPWNydDEubzsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRpLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRpLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRpLm87IGZpYCAvdXNyL2Njcy9saWIvdmFsdWVzLVhhLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlICR7Q0N9IC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRuLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRuLm87IGVsc2UgJHtDQ30gLXByaW50LWZpbGUtbmFtZT1jcnRuLm87IGZpYCcKLSAgTkFUSVZFX0xJQl9ESVJTPS91c3IvY2NzL2xpYgotICA7OwotCi1zcGFyYy0qLWxpbnV4LWdudSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIC9saWIvbGQtbGludXguc28uMiBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0MS5vYCBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0aS5vYCBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtTGBkaXJuYW1lIFxgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9bGliYy5zb1xgYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydG4ub2AnCi0gIDs7Ci0KLXNwYXJjNjQtKi1saW51eC1nbnUqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliNjQvbGQtbGludXguc28uMiBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0MS5vYCBgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0aS5vYCBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgJHtDQ30gLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtTGBkaXJuYW1lIFxgJHtDQ30gLS1wcmludC1maWxlLW5hbWU9bGliYy5zb1xgYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSAke0NDfSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlICR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYCR7Q0N9IC0tcHJpbnQtZmlsZS1uYW1lPWNydG4ub2AnCi0gIDs7Ci0KLWVzYWMKZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZS5pbiBiL2xkL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmYzVmNi4uMDAwMDAwMAotLS0gYS9sZC9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQKLWRubAotQUNfUFJFUkVHKDIuMTMpCi1BQ19JTklUKGxkbWFpbi5jKQotCi1BQ19DQU5PTklDQUxfU1lTVEVNCi0KLUFNX0lOSVRfQVVUT01BS0UobGQsIDIuOS41KQotCi1BTV9QUk9HX0xJQlRPT0wKLQotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRSg2NC1iaXQtYmZkLAotWyAgLS1lbmFibGUtNjQtYml0LWJmZCAgICAgNjQtYml0IHN1cHBvcnQgKG9uIGhvc3RzIHdpdGggbmFycm93ZXIgd29yZCBzaXplcyldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSAgd2FudDY0PXRydWUgIDs7Ci0gIG5vKSAgIHdhbnQ2ND1mYWxzZSA7OwotICAqKSAgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgNjQtYml0LWJmZCBvcHRpb24pIDs7Ci1lc2FjXSxbd2FudDY0PWZhbHNlXSlkbmwKLQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiIDsgdGhlbgotICAgIEFDX01TR19FUlJPUihVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4pCi1maQotaWYgdGVzdCAteiAiJGhvc3QiIDsgdGhlbgotICAgIEFDX01TR19FUlJPUihVbnJlY29nbml6ZWQgaG9zdCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi1BQ19QUk9HX0NDCi1BQ19QUk9HX0lOU1RBTEwKLQotQUxMX0xJTkdVQVM9Ci1DWV9HTlVfR0VUVEVYVAotCi1BQ19FWEVFWFQKLQotQUNfUFJPR19ZQUNDCi1BTV9QUk9HX0xFWAotCi1BTV9NQUlOVEFJTkVSX01PREUKLQotLiAke3NyY2Rpcn0vY29uZmlndXJlLmhvc3QKLQotQUNfU1VCU1QoSERFRklORVMpCi1BQ19TVUJTVChIT1NUSU5HX0NSVDApCi1BQ19TVUJTVChIT1NUSU5HX0xJQlMpCi1BQ19TVUJTVChOQVRJVkVfTElCX0RJUlMpCi0KLUFDX0NIRUNLX0hFQURFUlMoc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHVuaXN0ZC5oKQotQUNfQ0hFQ0tfRlVOQ1Moc2JyaykKLUFDX0hFQURFUl9ESVJFTlQKLQotQkZEX0JJTkFSWV9GT1BFTgotCi1CRkRfTkVFRF9ERUNMQVJBVElPTihzdHJzdHIpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihmcmVlKQotQkZEX05FRURfREVDTEFSQVRJT04oc2JyaykKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGdldGVudikKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGVudmlyb24pCi0KLSMgV2hlbiBjb252ZXJ0aW5nIGxpbmtlciBzY3JpcHRzIGludG8gc3RyaW5ncyBmb3IgdXNlIGluIGVtdWxhdGlvbgotIyBmaWxlcywgdXNlIGFzdHJpbmcuc2VkIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBBTlNJIHN0cmluZwotIyBjb25jYXRlbmF0aW9uLCBvciBvc3RyaW5nLnNlZCBvdGhlcndpc2UuICBUaGlzIGlzIHRvIHN1cHBvcnQgdGhlCi0jIGJyb2tlbiBNaWNyb3NvZnQgTVNWQyBjb21waWxlciwgd2hpY2ggbGltaXRzIHRoZSBsZW5ndGggb2Ygc3RyaW5nCi0jIGNvbnN0YW50cywgd2hpbGUgc3RpbGwgc3VwcG9ydGluZyBwcmUtQU5TSSBjb21waWxlcnMgd2hpY2ggZG8gbm90Ci0jIHN1cHBvcnQgc3RyaW5nIGNvbmNhdGVuYXRpb24uCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgQU5TSSBDIHN0cmluZyBjb25jYXRlbmF0aW9uIHdvcmtzXSkKLUFDX0NBQ0hFX1ZBTChsZF9jdl9zdHJpbmdfY29uY2F0ZW5hdGlvbiwKLVtBQ19UUllfQ09NUElMRSgsW2NoYXIgKmEgPSAiYSIgImEiO10sCi0gIFtsZF9jdl9zdHJpbmdfY29uY2F0ZW5hdGlvbj15ZXNdLAotICBbbGRfY3Zfc3RyaW5nX2NvbmNhdGVuYXRpb249bm9dKV0pCi1BQ19NU0dfUkVTVUxUKCRsZF9jdl9zdHJpbmdfY29uY2F0ZW5hdGlvbikKLWlmIHRlc3QgIiRsZF9jdl9zdHJpbmdfY29uY2F0ZW5hdGlvbiIgPSAieWVzIjsgdGhlbgotICBTVFJJTkdJRlk9YXN0cmluZy5zZWQKLWVsc2UKLSAgU1RSSU5HSUZZPW9zdHJpbmcuc2VkCi1maQotQUNfU1VCU1QoU1RSSU5HSUZZKQotCi0jIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKLQotYWxsX3RhcmdldHM9Ci1FTVVMPQotYWxsX2VtdWxzPQotYWxsX2VtdWxfZXh0cmFzPQotYWxsX2xpYnBhdGg9Ci0KLWRubCBXZSBuZWVkIHRvIGdldCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHRkaXIgZGVmaW5pdGlvbnMgaW50bwotZG5sIE1ha2VmaWxlLiAgV2UgY2FuJ3QgZG8gaXQgdXNpbmcgQUNfU1VCU1QsIGJlY2F1c2UgYXV0b2NvbmYgZG9lcwotZG5sIG5vdCBwZXJtaXQgbGl0ZXJhbCBuZXdsaW5lcyBpbiBhbiBBQ19TVUJTVCB2YXJpYWJsZXMuICBTbyB3ZSB1c2UgYQotZG5sIGZpbGUuCi1ybSAtZiB0ZGlycwotCi1mb3IgdGFyZ19hbGlhcyBpbiBgZWNobyAkdGFyZ2V0X2FsaWFzICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi1kbwotICBpZiB0ZXN0ICIkdGFyZ19hbGlhcyIgPSAiYWxsIjsgdGhlbgotICAgIGFsbF90YXJnZXRzPXRydWUKLSAgZWxzZQotICAgICMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotICAgIHJlc3VsdD1gJGFjX2NvbmZpZ19zdWIgJHRhcmdfYWxpYXMgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJHJlc3VsdCI7IHRoZW4KLQl0YXJnPSRyZXN1bHQKLSAgICBlbHNlCi0JdGFyZz0kdGFyZ19hbGlhcwotICAgIGZpCi0KLSAgICAuICR7c3JjZGlyfS9jb25maWd1cmUudGd0Ci0KLSAgICBpZiB0ZXN0ICIkdGFyZyIgPSAiJHRhcmdldCI7IHRoZW4KLSAgICAgIEVNVUw9JHRhcmdfZW11bAotICAgIGZpCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2VtdWxzICR0YXJnX2V4dHJhX2xpYnBhdGg7IGRvCi0JY2FzZSAiICRhbGxfZW11bHMgIiBpbgotCSoiIGUke2l9Lm8gIiopIDs7Ci0JKikKLQkgIGFsbF9lbXVscz0iJGFsbF9lbXVscyBlJHtpfS5vIgotCSAgZXZhbCByZXN1bHQ9XCR0ZGlyXyRpCi0JICB0ZXN0IC16ICIkcmVzdWx0IiAmJiByZXN1bHQ9JHRhcmdfYWxpYXMKLQkgIGVjaG8gdGRpcl8kaT0kcmVzdWx0ID4+IHRkaXJzCi0JICA7OwotCWVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2xpYnBhdGg7IGRvCi0JY2FzZSAiICRhbGxfbGlicGF0aCAiIGluCi0JKiIgJHtpfSAiKikgOzsKLQkqKQotCSAgaWYgdGVzdCAteiAiJGFsbF9saWJwYXRoIjsgdGhlbgotCSAgICBhbGxfbGlicGF0aD0ke2l9Ci0JICBlbHNlCi0JICAgIGFsbF9saWJwYXRoPSIkYWxsX2xpYnBhdGggJHtpfSIKLQkgIGZpCi0JICA7OwotCWVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19leHRyYV9vZmlsZXM7IGRvCi0JY2FzZSAiICRhbGxfZW11bF9leHRyYXMgIiBpbgotCSoiICR7aX0gIiopIDs7Ci0JKikKLQkgIGFsbF9lbXVsX2V4dHJhcz0iJGFsbF9lbXVsX2V4dHJhcyAke2l9IgotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotICBmaQotZG9uZQotCi1BQ19TVUJTVChFTVVMKQotCi1URElSUz10ZGlycwotQUNfU1VCU1RfRklMRShURElSUykKLQotZG5sIEZJWE1FOiBXZSB3aWxsIGJ1aWxkIGEgNjQgYml0IEJGRCBmb3IgYSA2NCBiaXQgaG9zdCBvciBhIDY0IGJpdAotZG5sIHRhcmdldCwgYW5kIGluIHRob3NlIGNhc2VzIHdlIHNob3VsZCBhbHNvIGJ1aWxkIHRoZSA2NCBiaXQKLWRubCBlbXVsYXRpb25zLgotaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4dHJ1ZTsgdGhlbgotICBpZiB0ZXN0IHgke3dhbnQ2NH0gPSB4dHJ1ZTsgdGhlbgotICAgIEVNVUxBVElPTl9PRklMRVM9JyQoQUxMX0VNVUxBVElPTlMpICQoQUxMXzY0X0VNVUxBVElPTlMpJwotICBlbHNlCi0gICAgRU1VTEFUSU9OX09GSUxFUz0nJChBTExfRU1VTEFUSU9OUyknCi0gIGZpCi0gIEVNVUxfRVhUUkFfT0ZJTEVTPSckKEFMTF9FTVVMX0VYVFJBX09GSUxFUyknCi1lbHNlCi0gIEVNVUxBVElPTl9PRklMRVM9JGFsbF9lbXVscwotICBFTVVMX0VYVFJBX09GSUxFUz0kYWxsX2VtdWxfZXh0cmFzCi1maQotQUNfU1VCU1QoRU1VTEFUSU9OX09GSUxFUykKLUFDX1NVQlNUKEVNVUxfRVhUUkFfT0ZJTEVTKQotCi1FTVVMQVRJT05fTElCUEFUSD0kYWxsX2xpYnBhdGgKLUFDX1NVQlNUKEVNVUxBVElPTl9MSUJQQVRIKQotCi1pZiB0ZXN0IHgke2VuYWJsZV9zdGF0aWN9ID0geG5vOyB0aGVuCi0gIFRFU1RCRkRMSUI9Ii0tcnBhdGggLi4vYmZkLy5saWJzIC4uL2JmZC8ubGlicy9saWJiZmQuc28iCi1lbHNlCi0gIFRFU1RCRkRMSUI9Ii4uL2JmZC8ubGlicy9saWJiZmQuYSIKLWZpCi1BQ19TVUJTVChURVNUQkZETElCKQotCi10YXJnZXRfdmVuZG9yPSR7dGFyZ2V0X3ZlbmRvcj0kaG9zdF92ZW5kb3J9Ci1jYXNlICIkdGFyZ2V0X3ZlbmRvciIgaW4KLSAgaHApIEVYVFJBX1NITElCX0VYVEVOU0lPTj0iLnNsIiA7OwotICAqKSAgRVhUUkFfU0hMSUJfRVhURU5TSU9OPSA7OwotZXNhYwotaWYgdGVzdCB4JHtFWFRSQV9TSExJQl9FWFRFTlNJT059ICE9IHggOyB0aGVuCi0gIEFDX0RFRklORV9VTlFVT1RFRChFWFRSQV9TSExJQl9FWFRFTlNJT04sICIkRVhUUkFfU0hMSUJfRVhURU5TSU9OIiwKLSAgIFtBZGRpdGlvbmFsIGV4dGVuc2lvbiBhIHNoYXJlZCBvYmplY3QgbWlnaHQgaGF2ZS5dKQotZmkKLQotQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZS50Z3QgYi9sZC9jb25maWd1cmUudGd0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjg5Y2E5Li4wMDAwMDAwCi0tLSBhL2xkL2NvbmZpZ3VyZS50Z3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotIyBUaGlzIGlzIHRoZSBsaW5rZXIgdGFyZ2V0IHNwZWNpZmljIGZpbGUuICBUaGlzIGlzIGludm9rZWQgYnkgdGhlCi0jIGF1dG9jb25mIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0LiAgUHV0dGluZyBpdCBpbiBhIHNlcGFyYXRlIHNoZWxsCi0jIGZpbGUgbGV0cyB1cyBza2lwIHJ1bm5pbmcgYXV0b2NvbmYgd2hlbiBtb2RpZnlpbmcgdGFyZ2V0IHNwZWNpZmljCi0jIGluZm9ybWF0aW9uLgotCi0jIFRoaXMgZmlsZSBzd2l0Y2hlcyBvbiB0aGUgc2hlbGwgdmFyaWFibGUgJHt0YXJnfSwgYW5kIHNldHMgdGhlCi0jIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXM6Ci0jICB0YXJnX2VtdWwJCW5hbWUgb2YgbGlua2VyIGVtdWxhdGlvbiB0byB1c2UKLSMgIHRhcmdfZXh0cmFfZW11bHMJYWRkaXRpb25hbCBsaW5rZXIgZW11bGF0aW9ucyB0byBwcm92aWRlCi0jICB0YXJnX2V4dHJhX2xpYnBhdGgJYWRkaXRpb25hbCBsaW5rZXIgZW11bGF0aW9ucyB1c2luZyBMSUJfUEFUSAotIyAgdGFyZ19leHRyYV9vZmlsZXMJYWRkaXRpb25hbCBvYmplY3RzIG5lZWRlZCBieSB0aGUgZW11bGF0aW9uCi0KLXRhcmdfZXh0cmFfZW11bHM9Ci10YXJnX2V4dHJhX29maWxlcz0KLQotY2FzZSAiJHt0YXJnfSIgaW4KLWFybS1lcG9jLXBlKQkJdGFyZ19lbXVsPWFybV9lcG9jX3BlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotYXJtLSotcGUpCQl0YXJnX2VtdWw9YXJtcGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1hcmMtKi1lbGYqKQkJdGFyZ19lbXVsPWFyY2VsZiA7OwotZDEwdi0qLSopCQl0YXJnX2VtdWw9ZDEwdmVsZiA7OwotZDMwdi0qLSpleHQqKQkJdGFyZ19lbXVsPWQzMHZfZTsgdGFyZ19leHRyYV9lbXVscz0iZDMwdmVsZiBkMzB2X28iIDs7Ci1kMzB2LSotKm9uY2hpcCopCXRhcmdfZW11bD1kMzB2X287IHRhcmdfZXh0cmFfZW11bHM9ImQzMHZlbGYgZDMwdl9lIiA7OwotZDMwdi0qLSopCQl0YXJnX2VtdWw9ZDMwdmVsZjsgdGFyZ19leHRyYV9lbXVscz0iZDMwdl9lIGQzMHZfbyIgOzsKLXNwYXJjNjQtKi1hb3V0KikJdGFyZ19lbXVsPXNwYXJjYW91dCA7Owotc3BhcmM2NC0qLWVsZiopCQl0YXJnX2VtdWw9ZWxmNjRfc3BhcmMgOzsKLXNwYXJjLXN1bi1zdW5vczQqKSAJdGFyZ19lbXVsPXN1bjQgOzsKLXNwYXJjbGl0ZSotKi1lbGYpCXRhcmdfZW11bD1lbGYzMl9zcGFyYyA7Owotc3BhcmNsaXRlKi0qLWNvZmYpCXRhcmdfZW11bD1jb2ZmX3NwYXJjIDs7Ci1zcGFyY2xpdGUqLWZ1aml0c3UtKikJdGFyZ19lbXVsPXNwYXJjYW91dCA7Owotc3BhcmMqLSotYW91dCkJCXRhcmdfZW11bD1zcGFyY2FvdXQgOzsKLXNwYXJjKi0qLWNvZmYpCQl0YXJnX2VtdWw9Y29mZl9zcGFyYyA7Owotc3BhcmMqLSotZWxmKQkJdGFyZ19lbXVsPWVsZjMyX3NwYXJjIDs7Ci1zcGFyYyotKi1zeXN2NCopCXRhcmdfZW11bD1lbGYzMl9zcGFyYyA7Owotc3BhcmMqLSotbGludXgqYW91dCopCXRhcmdfZW11bD1zcGFyY2xpbnV4Ci0JCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMl9zcGFyYyBzdW40IgotCQkJdGRpcl9lbGYzMl9zcGFyYz1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzL2FvdXQvLydgCi0JCQl0ZGlyX3N1bjQ9c3BhcmMtc3VuLXN1bm9zNAotCQkJOzsKLXNwYXJjNjQtKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmNjRfc3BhcmMKLQkJCXRhcmdfZXh0cmFfZW11bHM9ImVsZjMyX3NwYXJjIHNwYXJjbGludXggc3VuNCIKLQkJCXRkaXJfZWxmMzJfc3BhcmM9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy82NC8vJ2AKLQkJCXRkaXJfc3BhcmNsaW51eD0ke3RkaXJfZWxmMzJfc3BhcmN9YW91dAotCQkJdGRpcl9zdW40PXNwYXJjLXN1bi1zdW5vczQKLQkJCTs7Ci1zcGFyYyotKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMKLQkJCXRhcmdfZXh0cmFfZW11bHM9InNwYXJjbGludXggc3VuNCIKLQkJCXRkaXJfc3BhcmNsaW51eD0ke3RhcmdfYWxpYXN9YW91dAotCQkJdGRpcl9zdW40PXNwYXJjLXN1bi1zdW5vczQKLQkJCTs7Ci1zcGFyYyotKi1seW54b3MqKQl0YXJnX2VtdWw9c3BhcmNseW54IDs7Ci1zcGFyYyotKi1uZXRic2QqKQl0YXJnX2VtdWw9c3BhcmNuYnNkIDs7Ci1zcGFyYyotKi1zb2xhcmlzMiopCXRhcmdfZW11bD1lbGYzMl9zcGFyYyA7Owotc3BhcmMqLXdycy12eHdvcmtzKikJdGFyZ19lbXVsPXNwYXJjYW91dCA7Owotc3BhcmMqLSotcnRlbXMqKQl0YXJnX2VtdWw9c3BhcmNhb3V0IDs7Ci1pOTYwLXdycy12eHdvcmtzNS4wKikJdGFyZ19lbXVsPWdsZDk2MCA7OwotaTk2MC13cnMtdnh3b3JrczUqKQl0YXJnX2VtdWw9Z2xkOTYwY29mZiA7OwotaTk2MC13cnMtdnh3b3JrcyopCXRhcmdfZW11bD1nbGQ5NjAgOzsKLWk5NjAtKi1jb2ZmKQkJdGFyZ19lbXVsPWdsZDk2MGNvZmYgOzsKLWk5NjAtaW50ZWwtbmluZHkpCXRhcmdfZW11bD1nbGQ5NjAgOzsKLWk5NjAtKi1ydGVtcyopCQl0YXJnX2VtdWw9Z2xkOTYwY29mZiA7OwotaTk2MC0qLWVsZiopCQl0YXJnX2VtdWw9ZWxmMzJfaTk2MCA7OwotbTMyci0qLSopCQl0YXJnX2VtdWw9bTMycmVsZiA7OwotbTY4Ki1zdW4tc3Vub3NbMzRdKikJdGFyZ19lbXVsPXN1bjMgOzsKLW02OCotd3JzLXZ4d29ya3MqKQl0YXJnX2VtdWw9c3VuMyA7OwotbTY4Ki1lcmljc3Nvbi1vc2UpCXRhcmdfZW11bD1zdW4zIDs7Ci1tNjgqLWFwcGxlLWF1eCopCXRhcmdfZW11bD1tNjhrYXV4IDs7Ci0qLXRhbmRlbS1ub25lKQkJdGFyZ19lbXVsPXN0MjAwMCA7OwotaVszNDU2XTg2LSotdnN0YSkJdGFyZ19lbXVsPXZzdGEgOzsKLWlbMzQ1Nl04Ni1nbzMyLXJ0ZW1zKikJdGFyZ19lbXVsPWkzODZnbzMyIDs7Ci1pWzM0NTZdODYtKi1nbzMyKQl0YXJnX2VtdWw9aTM4NmdvMzIgOzsKLWlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqKSB0YXJnX2VtdWw9aTM4NmdvMzIgOzsKLWlbMzQ1Nl04Ni0qLWFpeCopCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotc2NvKikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7Ci1pWzM0NTZdODYtKi1pc2MqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLWx5bnhvcyopCXRhcmdfZW11bD1pMzg2bHlueCA7OwotaVszNDU2XTg2LSotY29mZikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7Ci1pWzM0NTZdODYtKi1ydGVtc2VsZiopICB0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLXJ0ZW1zKikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7Ci1pWzM0NTZdODYtKi1ic2QpCXRhcmdfZW11bD1pMzg2YnNkIDs7Ci1pWzM0NTZdODYtKi1ic2QzODYpCXRhcmdfZW11bD1pMzg2YnNkIDs7Ci1pWzM0NTZdODYtKi1ic2RpKikJdGFyZ19lbXVsPWkzODZic2QgOzsKLWlbMzQ1Nl04Ni0qLWFvdXQpCXRhcmdfZW11bD1pMzg2YW91dCA7OwotaVszNDU2XTg2LSotbGludXgqYW91dCopCXRhcmdfZW11bD1pMzg2bGludXgKLQkJCXRhcmdfZXh0cmFfZW11bHM9ZWxmX2kzODYKLQkJCXRkaXJfZWxmX2kzODY9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9hb3V0Ly8nYAotCQkJOzsKLWlbMzQ1Nl04Ni0qLWxpbnV4b2xkbGQpCXRhcmdfZW11bD1pMzg2bGludXg7IHRhcmdfZXh0cmFfZW11bHM9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGZfaTM4NgotCQkJdGFyZ19leHRyYV9lbXVscz1pMzg2bGludXgKLQkJCXRkaXJfaTM4NmxpbnV4PSR7dGFyZ19hbGlhc31hb3V0Ci0JCQk7OwotaVszNDU2XTg2LSotc3lzdjQqKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLXNvbGFyaXMyKikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi11bml4d2FyZSkJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1zb2xhcmlzKikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1uZXRic2QqKQl0YXJnX2VtdWw9aTM4Nm5ic2QgOzsKLWlbMzQ1Nl04Ni0qLW5ldHdhcmUpCXRhcmdfZW11bD1pMzg2bncgOzsKLWlbMzQ1Nl04Ni0qLWVsZiopCXRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotZnJlZWJzZGFvdXQqIHwgaVszNDU2XTg2LSotZnJlZWJzZFsxMl0uKiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2RbMTJdKQotCQkJdGFyZ19lbXVsPWkzODZic2QgOzsKLWlbMzQ1Nl04Ni0qLWZyZWVic2QqKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLXN5c3YqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLXB0eCopCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotbWFjaCopCXRhcmdfZW11bD1pMzg2bWFjaCA7OwotaVszNDU2XTg2LSotZ251KikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1tc2RvcyopCXRhcmdfZW11bD1pMzg2bXNkb3M7IHRhcmdfZXh0cmFfZW11bHM9aTM4NmFvdXQgOzsKLWlbMzQ1Nl04Ni0qLW1vc3MqKQl0YXJnX2VtdWw9aTM4Nm1vc3M7IHRhcmdfZXh0cmFfZW11bHM9aTM4Nm1zZG9zIDs7Ci1pWzM0NTZdODYtKi13aW5udCopCXRhcmdfZW11bD1pMzg2cGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1pWzM0NTZdODYtKi1wZSkJCXRhcmdfZW11bD1pMzg2cGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1pWzM0NTZdODYtKi1jeWd3aW4qKQl0YXJnX2VtdWw9aTM4NnBlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotaVszNDU2XTg2LSotbWluZ3czMiopCXRhcmdfZW11bD1pMzg2cGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1pWzM0NTZdODYtKi1pbnRlcml4KikJdGFyZ19lbXVsPWkzODZwZV9wb3NpeDsKLSAJCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLWlbMzQ1Nl04Ni0qLWJlb3NwZSopICAgIHRhcmdfZW11bD1pMzg2YmVvcyA7OwotaVszNDU2XTg2LSotYmVvcyopCXRhcmdfZW11bD1lbGZfaTM4Nl9iZSA7OwotaVszNDU2XTg2LSotdnh3b3JrcyopCXRhcmdfZW11bD1pMzg2YW91dCA7OwotbTgqLSotKikJCXRhcmdfZW11bD1tODhrYmNzIDs7Ci1hMjlrLSotdWRpKQkJdGFyZ19lbXVsPXNhMjkyMDAgOzsKLWEyOWstKi1lYm1vbikJCXRhcmdfZW11bD1lYm1vbjI5ayA7OwotYTI5ay0qLSopCQl0YXJnX2VtdWw9YTI5ayA7OwotIyAgYXJtLSotcmlzY2l4KikJCXRhcmdfZW11bD1yaXNjaXggOzsKLWFybS0qLWFvdXQgfCBhcm1lbC0qLWFvdXQpIHRhcmdfZW11bD1hcm1hb3V0bCA7OwotYXJtZWItKi1hb3V0KQkJdGFyZ19lbXVsPWFybWFvdXRiIDs7Ci1hcm0tKi1jb2ZmKQkJdGFyZ19lbXVsPWFybWNvZmYgOzsKLWFybS0qLW5ldGJzZCopCQl0YXJnX2VtdWw9YXJtbmJzZCA7OwotYXJtLSotZWxmKQkJdGFyZ19lbXVsPWFybWVsZiA7OwotYXJtLSotb2FiaSkJCXRhcmdfZW11bD1hcm1lbGZfb2FiaSA7OwotYXJtKi0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1hcm1lbGZfbGludXg7IHRhcmdfZXh0cmFfZW11bHM9ImFybWVsZl9saW51eDI2IGFybWVsZiIgOzsKLWFybSotKi11Y2xpbnV4KikJdGFyZ19lbXVsPWFybWVsZl9saW51eDsgdGFyZ19leHRyYV9lbXVscz1hcm1lbGYgOzsKLXRodW1iLSotbGludXgtZ251KiB8IHRodW1iLSotdWNsaW51eCopCXRhcmdfZW11bD1hcm1lbGZfbGludXg7IHRhcmdfZXh0cmFfZW11bHM9YXJtZWxmIDs7Ci1zdHJvbmdhcm0tKi1jb2ZmKQl0YXJnX2VtdWw9YXJtY29mZiA7Owotc3Ryb25nYXJtLSotZWxmKQl0YXJnX2VtdWw9YXJtZWxmIDs7Ci10aHVtYi0qLWNvZmYpCQl0YXJnX2VtdWw9YXJtY29mZiA7OwotdGh1bWItKi1lbGYpCQl0YXJnX2VtdWw9YXJtZWxmIDs7Ci10aHVtYi0qLW9hYmkpICAgICAgICAgICB0YXJnX2VtdWw9YXJtZWxmX29hYmkgOzsKLXRodW1iLWVwb2MtcGUpCQl0YXJnX2VtdWw9YXJtX2Vwb2NfcGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci10aHVtYi0qLXBlKQkJdGFyZ19lbXVsPWFybXBlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotaDgzMDAtKi1obXMqIHwgaDgzMDAtKi1jb2ZmKikKLQkJCXRhcmdfZW11bD1oODMwMDsgdGFyZ19leHRyYV9lbXVscz0iaDgzMDBoIGg4MzAwcyIKLQkJCTs7Ci1oODUwMC0qLWhtcyogfCBoODUwMC0qLWNvZmYqKQotCQkJdGFyZ19lbXVsPWg4NTAwCi0JCQl0YXJnX2V4dHJhX2VtdWxzPSJoODUwMHMgaDg1MDBiIGg4NTAwbSBoODUwMGMiCi0JCQk7Owotc2gtKi1lbGYqIHwgc2gtKi1ydGVtc2VsZiopCi0JCQl0YXJnX2VtdWw9c2hlbGYKLQkJCXRhcmdfZXh0cmFfZW11bHM9InNobGVsZiBzaCBzaGwiCi0JCQk7Owotc2gtKi0qfHNoLSotcnRlbXMqKQl0YXJnX2VtdWw9c2g7IHRhcmdfZXh0cmFfZW11bHM9c2hsIDs7Ci1tNjhrLXNvbnktKikJCXRhcmdfZW11bD1uZXdzIDs7Ci1tNjhrLWhwLWJzZCopCQl0YXJnX2VtdWw9aHAzMDBic2QgOzsKLW02OCotbW90b3JvbGEtc3lzdiopCXRhcmdfZW11bD1kZWx0YTY4IDs7Ci1tNjgqLSotYW91dCkJCXRhcmdfZW11bD1tNjhrYW91dCA7OwotbTY4Ki0qLWNvZmYpCQl0YXJnX2VtdWw9bTY4a2NvZmYgOzsKLW02OCotKi1lbGYpCQl0YXJnX2VtdWw9bTY4a2VsZiA7OwotbTY4Ki0qLWhwdXgqKQkJdGFyZ19lbXVsPWhwM2hwdXggOzsKLW02OGstKi1saW51eCphb3V0KikJdGFyZ19lbXVsPW02OGtsaW51eAotCQkJdGFyZ19leHRyYV9lbXVscz1tNjhrZWxmCi0JCQl0ZGlyX202OGtlbGY9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9hb3V0Ly8nYAotCQkJOzsKLW02OGstKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9bTY4a2VsZgotCQkJdGFyZ19leHRyYV9lbXVscz1tNjhrbGludXgKLQkJCXRkaXJfbTY4a2xpbnV4PWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvbGludXgvbGludXhhb3V0LydgCi0JCQk7OwotbTY4Ki0qLWdudSopCQl0YXJnX2VtdWw9bTY4a2VsZiA7OwotbTY4Ki0qLWx5bnhvcyopCQl0YXJnX2VtdWw9bTY4a2x5bnggOzsKLW02OCotaHAqLW5ldGJzZCopCXRhcmdfZW11bD1tNjhrNGtuYnNkIDs7Ci1tNjgqLSotbmV0YnNkKikJCXRhcmdfZW11bD1tNjhrbmJzZCA7OwotbTY4Ki0qLXBzb3MqKQkJdGFyZ19lbXVsPW02OGtwc29zIDs7Ci1tNjgqLSotcnRlbXMqKQkJdGFyZ19lbXVsPW02OGtjb2ZmIDs7Ci1ocHBhKncqLSopCQl0YXJnX2VtdWw9ZWxmNjRocHBhIDs7Ci1ocHBhKi0qLSplbGYqKQkJdGFyZ19lbXVsPWhwcGFlbGYgOzsKLWhwcGEqLSotbGludXgtZ251KikJdGFyZ19lbXVsPWhwcGFlbGYgOzsKLWhwcGEqLSotbGl0ZXMqKQkJdGFyZ19lbXVsPWhwcGFlbGYgOzsKLWhwcGEqLSotcnRlbXMqKQkJdGFyZ19lbXVsPWhwcGFlbGYgOzsKLXZheC1kZWMtdWx0cml4KiB8IHZheC1kZWMtYnNkKikgdGFyZ19lbXVsPXZheCA7OwotbWlwcyotZGVjLXVsdHJpeCopCXRhcmdfZW11bD1taXBzbGl0IDs7Ci1taXBzKi1kZWMtb3NmKikJCXRhcmdfZW11bD1taXBzbGl0IDs7Ci1taXBzKi1zZ2ktaXJpeDUqKQl0YXJnX2VtdWw9ZWxmMzJic21pcCA7OwotbWlwcyotc2dpLWlyaXg2KikJdGFyZ19lbXVsPWVsZjMyYm1pcG4zMgotCSAgICAgICAgICAgICAgICB0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMmJzbWlwIGVsZjY0Ym1pcCIKLQkgICAgICAgICAgICAgICAgOzsKLW1pcHMqLXNnaS1pcml4KikJdGFyZ19lbXVsPW1pcHNiaWcgOzsKLW1pcHMqZWwtKi1lY29mZiopCXRhcmdfZW11bD1taXBzaWR0bCA7OwotbWlwcyotKi1lY29mZiopCQl0YXJnX2VtdWw9bWlwc2lkdCA7OwotbWlwcyotZGVjLWJzZCopCQl0YXJnX2VtdWw9bWlwc2JzZCA7OwotbWlwcyotZGVjLW5ldGJzZCopCXRhcmdfZW11bD1lbGYzMmxtaXAgOzsKLW1pcHMqLSotYnNkKikJCXRhcmdfZW11bD1taXBzYmlnIDs7Ci1taXBzKnZyNDMwMGVsLSotZWxmKikJdGFyZ19lbXVsPWVsZjMybDQzMDAgOzsKLW1pcHMqdnI0MzAwLSotZWxmKikJdGFyZ19lbXVsPWVsZjMyYjQzMDAgOzsKLW1pcHMqdnI0MTAwZWwtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJsNDMwMCA7OwotbWlwcyp2cjQxMDAtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJiNDMwMCA7OwotbWlwcyp2cjUwMDBlbC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmw0MzAwIDs7Ci1taXBzKnZyNTAwMC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmI0MzAwIDs7Ci1taXBzKmVsLSotZWxmKikJCXRhcmdfZW11bD1lbGYzMmVsbWlwIDs7Ci1taXBzKi0qLWVsZiopCQl0YXJnX2VtdWw9ZWxmMzJlYm1pcCA7OwotbWlwcyplbC0qLXJ0ZW1zKikJdGFyZ19lbXVsPWVsZjMyZWxtaXAgOzsKLW1pcHMqLSotcnRlbXMqKQkJdGFyZ19lbXVsPWVsZjMyZWJtaXAgOzsKLW1pcHMqZWwtKi12eHdvcmtzKikJdGFyZ19lbXVsPWVsZjMyZWxtaXAgOzsKLW1pcHMqLSotdnh3b3JrcyopCXRhcmdfZW11bD1lbGYzMmVibWlwIDs7Ci1taXBzKmVsLSotbGludXgtZ251KikJdGFyZ19lbXVsPWVsZjMybHNtaXAKLQkJCXRhcmdfZXh0cmFfZW11bHM9ImVsZjMyYnNtaXAgbWlwc2xpdCBtaXBzYmlnIgotCQkJOzsKLW1pcHMqLSotbGludXgtZ251KikJdGFyZ19lbXVsPWVsZjMyYnNtaXAKLQkJCXRhcmdfZXh0cmFfZW11bHM9ImVsZjMybHNtaXAgbWlwc2JpZyBtaXBzbGl0IgotCQkJOzsKLW1pcHMqLSotbG5ld3MqKQkJdGFyZ19lbXVsPW1pcHNsbmV3cyA7OwotbW4xMDIwMC0qLSopCQl0YXJnX2VtdWw9bW4xMDIwMCA7OwotbW4xMDMwMC0qLSopCQl0YXJnX2VtdWw9bW4xMDMwMCA7OwotYWxwaGEqLSotbGludXhlY29mZiopCXRhcmdfZW11bD1hbHBoYSB0YXJnX2V4dHJhX2VtdWxzPWVsZjY0YWxwaGEKLQkJCXRkaXJfZWxmNjRhbHBoYT1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzL2Vjb2ZmLy8nYAotCQkJOzsKLWFscGhhKi0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGY2NGFscGhhIHRhcmdfZXh0cmFfZW11bHM9YWxwaGEKLQkJCXRkaXJfYWxwaGE9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9saW51eC9saW51eGVjb2ZmLydgCi0JCQk7OwotYWxwaGEqLSotb3NmKikJCXRhcmdfZW11bD1hbHBoYSA7OwotYWxwaGEqLSotZ251KikJCXRhcmdfZW11bD1lbGY2NGFscGhhIDs7Ci1hbHBoYSotKi1uZXR3YXJlKikJdGFyZ19lbXVsPWFscGhhIDs7Ci1hbHBoYSotKi1uZXRic2QqKQl0YXJnX2VtdWw9ZWxmNjRhbHBoYSA7OwotejhrLSotY29mZikgCQl0YXJnX2VtdWw9ejgwMDI7IHRhcmdfZXh0cmFfZW11bHM9ejgwMDEgOzsKLW5zMzJrLXBjNTMyLW1hY2gqIHwgbnMzMmstcGM1MzItdXgqKQl0YXJnX2VtdWw9cGM1MzJtYWNoYSA7OwotbnMzMmstcGM1MzItbmV0YnNkKiB8IG5zMzJrLXBjNTMyLWxpdGVzKikgdGFyZ19lbXVsPW5zMzJrbmJzZCA7OwotcG93ZXJwYy0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMnBwY2xpbnV4OyB0YXJnX2V4dHJhX2VtdWxzPWVsZjMycHBjOwotCQkJdGFyZ19leHRyYV9saWJwYXRoPWVsZjMycHBjIDs7Ci1wamwqLSotKikJICAgICAgICB0YXJnX2VtdWw9cGpsZWxmIDsgdGFyZ19leHRyYV9lbXVscz0iZWxmX2kzODYiIDs7Ci1waiotKi0qKQkgICAgICAgIHRhcmdfZW11bD1wamVsZiA7OwotcG93ZXJwYy0qLWVsZiogfCBwb3dlcnBjLSotZWFiaSogfCBwb3dlcnBjLSotc3lzdiogXAotICB8IHBvd2VycGMtKi1uZXRic2QqIHwgcG93ZXJwYy0qLXZ4d29ya3MqKQotCXRhcmdfZW11bD1lbGYzMnBwYyA7OwotcG93ZXJwY2xlLSotZWxmKiB8IHBvd2VycGNsZS0qLWVhYmkqIHwgcG93ZXJwY2xlLSotc29sYXJpcyogXAotICB8IHBvd2VycGNsZS0qLXN5c3YqIHwgcG93ZXJwY2xlLSotdnh3b3JrcyopCi0JdGFyZ19lbXVsPWVsZjMybHBwYyA7OwotcG93ZXJwY2xlLSotcnRlbXMqKQl0YXJnX2VtdWw9ZWxmMzJsZXBwYyA7OwotcG93ZXJwYy0qLXJ0ZW1zKikJdGFyZ19lbXVsPWVsZjMycHBjIDs7Ci1wb3dlcnBjLSotbWFjb3MqKQl0YXJnX2VtdWw9cHBjbWFjb3MgOzsKLXBvd2VycGMtKi1uZXR3YXJlKikJdGFyZ19lbXVsPXBwY253IDs7Ci1wb3dlcnBjbGUtKi1wZSkgICAgICAgICB0YXJnX2VtdWw9cHBjcGUgOzsKLXBvd2VycGNsZS0qLXdpbm50KikgICAgIHRhcmdfZW11bD1wcGNwZSA7OwotcG93ZXJwY2xlLSotY3lnd2luKikgICB0YXJnX2VtdWw9cHBjcGUgOzsKLXBvd2VycGMtKi1haXgqKQkJdGFyZ19lbXVsPWFpeHBwYyA7OwotcG93ZXJwYy0qLWJlb3MqKQl0YXJnX2VtdWw9YWl4cHBjIDs7Ci1yczYwMDAtKi1haXgqKQkJdGFyZ19lbXVsPWFpeHJzNiA7OwotdGljMzAtKi0qYW91dCopCQl0YXJnX2VtdWw9dGljMzBhb3V0IDs7Ci10aWMzMC0qLSpjb2ZmKikJCXRhcmdfZW11bD10aWMzMGNvZmYgOzsKLXRpYzgwLSotKikJCXRhcmdfZW11bD10aWM4MGNvZmYgOzsKLXY4NTAtKi0qKQkJdGFyZ19lbXVsPXY4NTAgOzsKLXY4NTBlLSotKikJCXRhcmdfZW11bD12ODUwIDs7Ci12ODUwZWEtKi0qKQkJdGFyZ19lbXVsPXY4NTAgOzsKLXc2NS0qLSopCQl0YXJnX2VtdWw9dzY1IDs7Ci1mcjMwLSotKikJCXRhcmdfZW11bD1lbGYzMmZyMzAgOzsKLW1jb3JlLSotcGUpCQl0YXJnX2VtdWw9bWNvcmVwZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLW1jb3JlLSotZWxmKQkJdGFyZ19lbXVsPWVsZjMybWNvcmUgOzsKLSotKi1hb3V0KQkJdGFyZ19lbXVsPSR7dGFyZ2V0X2NwdX0tJHt0YXJnZXRfdmVuZG9yfSA7OwotKi0qLWNvZmYpCQl0YXJnX2VtdWw9JHt0YXJnZXRfY3B1fS0ke3RhcmdldF92ZW5kb3J9IDs7Ci0qLSotbmV0d2FyZSkJCXRhcmdfZW11bD0ke3RhcmdldF9jcHV9LW53IDs7Ci0qLSotaWVlZSopCQl0YXJnX2VtdWw9dmFuaWxsYSA7OwotCi0qKQotICBlY2hvIDI+JjEgIioqKiBsZCBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCAke3Rhcmd9IgotICBlY2hvIDI+JjEgIioqKiBzZWUgbGQvY29uZmlndXJlLnRndCBmb3Igc3VwcG9ydGVkIHRhcmdldHMiCi0gIGV4aXQgMQotCi1lc2FjCmRpZmYgLS1naXQgYS9sZC9kZWZmaWxlLmggYi9sZC9kZWZmaWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYzcxMGQuLjAwMDAwMDAKLS0tIGEvbGQvZGVmZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qIGRlZmZpbGUuaCAtIGhlYWRlciBmb3IgLkRFRiBmaWxlIHBhcnNlcgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBESiBEZWxvcmllIGRqQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBERUZGSUxFX0gKLSNkZWZpbmUgREVGRklMRV9ICi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBERUYgc3RvcmFnZSBkZWZpbml0aW9ucy4gIE5vdGUgdGhhdCBhbnkgb3JkaW5hbCBtYXkgYmUgemVybywgYW5kCi0gICBhbnkgcG9pbnRlciBtYXkgYmUgTlVMTCwgaWYgbm90IGRlZmluZWQgYnkgdGhlIERFRiBmaWxlLiAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWZfZmlsZV9zZWN0aW9uCi0gIHsKLSAgICBjaGFyICpuYW1lOwkJCS8qIGFsd2F5cyBzZXQgKi8KLSAgICBjaGFyICpjbGFzczsJCS8qIG1heSBiZSBOVUxMICovCi0gICAgY2hhciBmbGFnX3JlYWQsIGZsYWdfd3JpdGUsIGZsYWdfZXhlY3V0ZSwgZmxhZ19zaGFyZWQ7Ci0gIH0KLWRlZl9maWxlX3NlY3Rpb247Ci0KLXR5cGVkZWYgc3RydWN0IGRlZl9maWxlX2V4cG9ydAotICB7Ci0gICAgY2hhciAqbmFtZTsJCQkvKiBhbHdheXMgc2V0ICovCi0gICAgY2hhciAqaW50ZXJuYWxfbmFtZTsJLyogYWx3YXlzIHNldCwgbWF5ID09IG5hbWUgKi8KLSAgICBpbnQgb3JkaW5hbDsJCS8qIC0xIGlmIG5vdCBzcGVjaWZpZWQgKi8KLSAgICBpbnQgaGludDsKLSAgICBjaGFyIGZsYWdfcHJpdmF0ZSwgZmxhZ19jb25zdGFudCwgZmxhZ19ub25hbWUsIGZsYWdfZGF0YTsKLSAgfQotZGVmX2ZpbGVfZXhwb3J0OwotCi10eXBlZGVmIHN0cnVjdCBkZWZfZmlsZV9tb2R1bGUKLSAgewotICAgIHN0cnVjdCBkZWZfZmlsZV9tb2R1bGUgKm5leHQ7Ci0gICAgdm9pZCAqdXNlcl9kYXRhOwotICAgIGNoYXIgbmFtZVsxXTsgLyogZXh0ZW5kZWQgdmlhIG1hbGxvYyAqLwotICB9Ci1kZWZfZmlsZV9tb2R1bGU7Ci0KLXR5cGVkZWYgc3RydWN0IGRlZl9maWxlX2ltcG9ydAotICB7Ci0gICAgY2hhciAqaW50ZXJuYWxfbmFtZTsJLyogYWx3YXlzIHNldCAqLwotICAgIGRlZl9maWxlX21vZHVsZSAqbW9kdWxlOwkvKiBhbHdheXMgc2V0ICovCi0gICAgY2hhciAqbmFtZTsJCQkvKiBtYXkgYmUgTlVMTDsgZWl0aGVyIHRoaXMgb3Igb3JkaW5hbCB3aWxsIGJlIHNldCAqLwotICAgIGludCBvcmRpbmFsOwkJLyogbWF5IGJlIC0xICovCi0gIH0KLWRlZl9maWxlX2ltcG9ydDsKLQotdHlwZWRlZiBzdHJ1Y3QgZGVmX2ZpbGUKLSAgewotCi0gICAgLyogZnJvbSB0aGUgTkFNRSBvciBMSUJSQVJZIGNvbW1hbmQgKi8KLSAgICBjaGFyICpuYW1lOwotICAgIGludCBpc19kbGw7CQkJLyogLTEgaWYgTkFNRS9MSUJSQVJZIG5vdCBnaXZlbiAqLwotICAgIGJmZF92bWEgYmFzZV9hZGRyZXNzOwkvKiAoYmZkX3ZtYSkoLTEpIGlmIHVuc3BlY2lmaWVkICovCi0KLSAgICAvKiBmcm9tIHRoZSBERVNDUklQVElPTiBjb21tYW5kICovCi0gICAgY2hhciAqZGVzY3JpcHRpb247Ci0KLSAgICAvKiBmcm9tIHRoZSBTVEFDSy9IRUFQIGNvbW1hbmQsIC0xIGlmIHVuc3BlY2lmaWVkICovCi0gICAgaW50IHN0YWNrX3Jlc2VydmUsIHN0YWNrX2NvbW1pdDsKLSAgICBpbnQgaGVhcF9yZXNlcnZlLCBoZWFwX2NvbW1pdDsKLQotICAgIC8qIGZyb20gdGhlIFNFQ1RJT04vU0VHTUVOVCBjb21tYW5kcyAqLwotICAgIGludCBudW1fc2VjdGlvbl9kZWZzOwotICAgIGRlZl9maWxlX3NlY3Rpb24gKnNlY3Rpb25fZGVmczsKLQotICAgIC8qIGZyb20gdGhlIEVYUE9SVFMgY29tbWFuZHMgKi8KLSAgICBpbnQgbnVtX2V4cG9ydHM7Ci0gICAgZGVmX2ZpbGVfZXhwb3J0ICpleHBvcnRzOwotCi0gICAgLyogdXNlZCBieSBpbXBvcnRzIGZvciBtb2R1bGUgbmFtZXMgKi8KLSAgICBkZWZfZmlsZV9tb2R1bGUgKm1vZHVsZXM7Ci0KLSAgICAvKiBmcm9tIHRoZSBJTVBPUlRTIGNvbW1hbmRzICovCi0gICAgaW50IG51bV9pbXBvcnRzOwotICAgIGRlZl9maWxlX2ltcG9ydCAqaW1wb3J0czsKLQotICAgIC8qIGZyb20gdGhlIFZFUlNJT04gY29tbWFuZCwgLTEgaWYgbm90IHNwZWNpZmllZCAqLwotICAgIGludCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yOwotICB9Ci1kZWZfZmlsZTsKLQotZXh0ZXJuIGRlZl9maWxlICpkZWZfZmlsZV9lbXB0eSBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIGFkZF90byBtYXkgYmUgTlVMTC4gIElmIG5vdCwgdGhpcyAuZGVmIGlzIGFwcGVuZGVkIHRvIGl0ICovCi1leHRlcm4gZGVmX2ZpbGUgKmRlZl9maWxlX3BhcnNlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9maWxlbmFtZSwKLQkJCQkJIGRlZl9maWxlICogX2FkZF90bykpOwotCi1leHRlcm4gdm9pZCBkZWZfZmlsZV9mcmVlIFBBUkFNUyAoKGRlZl9maWxlICogX2RlZikpOwotCi1leHRlcm4gZGVmX2ZpbGVfZXhwb3J0ICpkZWZfZmlsZV9hZGRfZXhwb3J0IFBBUkFNUyAoKGRlZl9maWxlICogX2RlZiwKLQkJCQkJCSAgICAgY29uc3QgY2hhciAqX25hbWUsCi0JCQkJCQkgY29uc3QgY2hhciAqX2ludGVybmFsX25hbWUsCi0JCQkJCQkgICAgIGludCBfb3JkaW5hbCkpOwotCi1leHRlcm4gZGVmX2ZpbGVfaW1wb3J0ICpkZWZfZmlsZV9hZGRfaW1wb3J0IFBBUkFNUyAoKGRlZl9maWxlICogX2RlZiwKLQkJCQkJCSAgICAgY29uc3QgY2hhciAqX25hbWUsCi0JCQkJCQkgICAgIGNvbnN0IGNoYXIgKl9mcm9tLAotCQkJCQkJICAgICBpbnQgX29yZGluYWwsCi0JCQkJCSAgICAgICBjb25zdCBjaGFyICpfaW1wb3J0ZWRfbmFtZSkpOwotCi1leHRlcm4gdm9pZCBkZWZfZmlsZV9hZGRfZGlyZWN0aXZlIFBBUkFNUyAoKGRlZl9maWxlICogX2RlZiwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKnBhcmFtLAotCQkJCQkgICAgaW50IGxlbikpOwotCi0jaWZkZWYgREVGX0ZJTEVfUFJJTlQKLWV4dGVybiB2b2lkIGRlZl9maWxlX3ByaW50IFBBUkFNUyAoKEZJTEUgKiBfZmlsZSwKLQkJCQkgICAgZGVmX2ZpbGUgKiBfZGVmKSk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIERFRkZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvbGQvZGVmZmlsZXAueSBiL2xkL2RlZmZpbGVwLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWE3MDMuLjAwMDAwMDAKLS0tIGEvbGQvZGVmZmlsZXAueQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTggKzAsMCBAQAotJXsgLyogZGVmZmlsZXAueSAtIHBhcnNlciBmb3IgLmRlZiBmaWxlcyAqLwotCi0vKiAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAiZGVmZmlsZS5oIgotCi0jZGVmaW5lIFRSQUNFIDAKLQotI2RlZmluZSBST1VORF9VUChhLCBiKSAoKChhKSsoKGIpLTEpKSZ+KChiKS0xKSkKLQotLyogUmVtYXAgbm9ybWFsIHlhY2MgcGFyc2VyIGludGVyZmFjZSBuYW1lcyAoeXlwYXJzZSwgeXlsZXgsIHl5ZXJyb3IsIGV0YyksCi0gICBhcyB3ZWxsIGFzIGdyYXR1aXRpb3VzbHkgZ2xvYmFsIHN5bWJvbCBuYW1lcywgc28gd2UgY2FuIGhhdmUgbXVsdGlwbGUKLSAgIHlhY2MgZ2VuZXJhdGVkIHBhcnNlcnMgaW4gbGQuICBOb3RlIHRoYXQgdGhlc2UgYXJlIG9ubHkgdGhlIHZhcmlhYmxlcwotICAgcHJvZHVjZWQgYnkgeWFjYy4gIElmIG90aGVyIHBhcnNlciBnZW5lcmF0b3JzIChiaXNvbiwgYnlhY2MsIGV0YykgcHJvZHVjZQotICAgYWRkaXRpb25hbCBnbG9iYWwgbmFtZXMgdGhhdCBjb25mbGljdCBhdCBsaW5rIHRpbWUsIHRoZW4gdGhvc2UgcGFyc2VyCi0gICBnZW5lcmF0b3JzIG5lZWQgdG8gYmUgZml4ZWQgaW5zdGVhZCBvZiBhZGRpbmcgdGhvc2UgbmFtZXMgdG8gdGhpcyBsaXN0LiAqLwotCi0jZGVmaW5lCXl5bWF4ZGVwdGggZGVmX21heGRlcHRoCi0jZGVmaW5lCXl5cGFyc2UJZGVmX3BhcnNlCi0jZGVmaW5lCXl5bGV4CWRlZl9sZXgKLSNkZWZpbmUJeXllcnJvcglkZWZfZXJyb3IKLSNkZWZpbmUJeXlsdmFsCWRlZl9sdmFsCi0jZGVmaW5lCXl5Y2hhcglkZWZfY2hhcgotI2RlZmluZQl5eWRlYnVnCWRlZl9kZWJ1ZwotI2RlZmluZQl5eXBhY3QJZGVmX3BhY3QJCi0jZGVmaW5lCXl5cjEJZGVmX3IxCQkJCi0jZGVmaW5lCXl5cjIJZGVmX3IyCQkJCi0jZGVmaW5lCXl5ZGVmCWRlZl9kZWYJCQotI2RlZmluZQl5eWNoawlkZWZfY2hrCQkKLSNkZWZpbmUJeXlwZ28JZGVmX3BnbwkJCi0jZGVmaW5lCXl5YWN0CWRlZl9hY3QJCQotI2RlZmluZQl5eWV4Y2EJZGVmX2V4Y2EKLSNkZWZpbmUgeXllcnJmbGFnIGRlZl9lcnJmbGFnCi0jZGVmaW5lIHl5bmVycnMJZGVmX25lcnJzCi0jZGVmaW5lCXl5cHMJZGVmX3BzCi0jZGVmaW5lCXl5cHYJZGVmX3B2Ci0jZGVmaW5lCXl5cwlkZWZfcwotI2RlZmluZQl5eV95eXMJZGVmX3l5cwotI2RlZmluZQl5eXN0YXRlCWRlZl9zdGF0ZQotI2RlZmluZQl5eXRtcAlkZWZfdG1wCi0jZGVmaW5lCXl5dglkZWZfdgotI2RlZmluZQl5eV95eXYJZGVmX3l5dgotI2RlZmluZQl5eXZhbAlkZWZfdmFsCi0jZGVmaW5lCXl5bGxvYwlkZWZfbGxvYwotI2RlZmluZSB5eXJlZHMJZGVmX3JlZHMJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5dG9rcwlkZWZfdG9rcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXlsaHMJZGVmX3l5bGhzCi0jZGVmaW5lIHl5bGVuCWRlZl95eWxlbgotI2RlZmluZSB5eWRlZnJlZCBkZWZfeXlkZWZyZWQKLSNkZWZpbmUgeXlkZ290bwlkZWZfeXlkZ290bwotI2RlZmluZSB5eXNpbmRleCBkZWZfeXlzaW5kZXgKLSNkZWZpbmUgeXlyaW5kZXggZGVmX3l5cmluZGV4Ci0jZGVmaW5lIHl5Z2luZGV4IGRlZl95eWdpbmRleAotI2RlZmluZSB5eXRhYmxlCSBkZWZfeXl0YWJsZQotI2RlZmluZSB5eWNoZWNrCSBkZWZfeXljaGVjawotCi1zdGF0aWMgaW50IGRlZl9sZXggKCk7Ci0KLXN0YXRpYyB2b2lkIGRlZl9kZXNjcmlwdGlvbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRlZl9leHBvcnRzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgZGVmX2hlYXBzaXplIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfaW1wb3J0Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfbGlicmFyeSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZGVmX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfc2VjdGlvbl9hbHQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRlZl9zdGFja3NpemUgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl92ZXJzaW9uIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfZGlyZWN0aXZlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCBkZWZfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBkZWZfZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGRlZl9sZXggUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgaW50IGxleF9mb3JjZWRfdG9rZW4gPSAwOwotc3RhdGljIGNvbnN0IGNoYXIgKmxleF9wYXJzZV9zdHJpbmcgPSAwOwotc3RhdGljIGNvbnN0IGNoYXIgKmxleF9wYXJzZV9zdHJpbmdfZW5kID0gMDsKLQotJX0KLQotJXVuaW9uIHsKLSAgY2hhciAqaWQ7Ci0gIGludCBudW1iZXI7Ci19OwotCi0ldG9rZW4gTkFNRSwgTElCUkFSWSwgREVTQ1JJUFRJT04sIFNUQUNLU0laRSwgSEVBUFNJWkUsIENPREUsIERBVEFVLCBEQVRBTAotJXRva2VuIFNFQ1RJT05TLCBFWFBPUlRTLCBJTVBPUlRTLCBWRVJTSU9OSywgQkFTRSwgQ09OU1RBTlRVLCBDT05TVEFOVEwKLSV0b2tlbiBQUklWQVRFVSwgUFJJVkFURUwKLSV0b2tlbiBSRUFEIFdSSVRFIEVYRUNVVEUgU0hBUkVEIE5PTkFNRVUgTk9OQU1FTCBESVJFQ1RJVkUKLSV0b2tlbiA8aWQ+IElECi0ldG9rZW4gPG51bWJlcj4gTlVNQkVSCi0ldHlwZSAgPG51bWJlcj4gb3B0X2Jhc2Ugb3B0X29yZGluYWwKLSV0eXBlICA8bnVtYmVyPiBhdHRyIGF0dHJfbGlzdCBvcHRfbnVtYmVyIGV4cF9vcHRfbGlzdCBleHBfb3B0Ci0ldHlwZSAgPGlkPiBvcHRfbmFtZSBvcHRfZXF1YWxfbmFtZSAKLQotJSUKLQotc3RhcnQ6IHN0YXJ0IGNvbW1hbmQKLQl8IGNvbW1hbmQKLQk7Ci0KLWNvbW1hbmQ6IAotCQlOQU1FIG9wdF9uYW1lIG9wdF9iYXNlIHsgZGVmX25hbWUgKCQyLCAkMyk7IH0KLQl8CUxJQlJBUlkgb3B0X25hbWUgb3B0X2Jhc2UgeyBkZWZfbGlicmFyeSAoJDIsICQzKTsgfQotCXwJREVTQ1JJUFRJT04gSUQgeyBkZWZfZGVzY3JpcHRpb24gKCQyKTt9Ci0JfAlTVEFDS1NJWkUgTlVNQkVSIG9wdF9udW1iZXIgeyBkZWZfc3RhY2tzaXplICgkMiwgJDMpO30KLQl8CUhFQVBTSVpFIE5VTUJFUiBvcHRfbnVtYmVyIHsgZGVmX2hlYXBzaXplICgkMiwgJDMpO30KLQl8CUNPREUgYXR0cl9saXN0IHsgZGVmX3NlY3Rpb24gKCJDT0RFIiwgJDIpO30KLQl8CURBVEFVIGF0dHJfbGlzdCAgeyBkZWZfc2VjdGlvbiAoIkRBVEEiLCAkMik7fQotCXwJU0VDVElPTlMgc2VjbGlzdAotCXwJRVhQT1JUUyBleHBsaXN0IAotCXwJSU1QT1JUUyBpbXBsaXN0Ci0JfAlWRVJTSU9OSyBOVU1CRVIgeyBkZWZfdmVyc2lvbiAoJDIsIDApO30KLQl8CVZFUlNJT05LIE5VTUJFUiAnLicgTlVNQkVSIHsgZGVmX3ZlcnNpb24gKCQyLCAkNCk7fQotCXwJRElSRUNUSVZFIElEIHsgZGVmX2RpcmVjdGl2ZSAoJDIpO30KLQk7Ci0KLQotZXhwbGlzdDoKLQkJLyogRU1QVFkgKi8KLQl8CWV4cGxpbmUKLQl8CWV4cGxpc3QgZXhwbGluZQotCTsKLQotZXhwbGluZToKLQkJLyogVGhlIG9wdF9jb21tYSBpcyBuZWNlc3NhcnkgdG8gc3VwcG9ydCBib3RoIHRoZSB1c3VhbAotCQkgIERFRiBmaWxlIHN5bnRheCBhcyB3ZWxsIGFzIC5kcmVjdHZlIHN5bnRheCB3aGljaAotCQkgIG1hbmRhdGVzIDxleHBzeW0+LDxleHBvcHRsaXN0Pi4gICovCi0JCUlEIG9wdF9lcXVhbF9uYW1lIG9wdF9vcmRpbmFsIG9wdF9jb21tYSBleHBfb3B0X2xpc3QKLQkJCXsgZGVmX2V4cG9ydHMgKCQxLCAkMiwgJDMsICQ1KTsgfQotCTsKLWV4cF9vcHRfbGlzdDoKLQkJLyogVGhlIG9wdF9jb21tYSBpcyBuZWNlc3NhcnkgdG8gc3VwcG9ydCBib3RoIHRoZSB1c3VhbAotCQkgICBERUYgZmlsZSBzeW50YXggYXMgd2VsbCBhcyAuZHJlY3R2ZSBzeW50YXggd2hpY2gKLQkJICAgYWxsb3dzIGZvciBjb21tYSBzZXBhcmF0ZWQgb3B0IGxpc3QuICAqLwotCQlleHBfb3B0IG9wdF9jb21tYSBleHBfb3B0X2xpc3QgeyAkJCA9ICQxIHwgJDM7IH0KLQl8CXsgJCQgPSAwOyB9Ci0JOwotZXhwX29wdDoKLQkJTk9OQU1FVQkJeyAkJCA9IDE7IH0KLQl8CU5PTkFNRUwJCXsgJCQgPSAxOyB9Ci0JfAlDT05TVEFOVFUJeyAkJCA9IDI7IH0KLQl8CUNPTlNUQU5UTAl7ICQkID0gMjsgfQotCXwJREFUQVUJCXsgJCQgPSA0OyB9Ci0JfAlEQVRBTAkJeyAkJCA9IDQ7IH0KLQl8CVBSSVZBVEVVCXsgJCQgPSA4OyB9Ci0JfAlQUklWQVRFTAl7ICQkID0gODsgfQotCTsKLWltcGxpc3Q6CQotCQlpbXBsaXN0IGltcGxpbmUKLQl8CWltcGxpbmUKLQk7Ci0KLWltcGxpbmU6Ci0gICAgICAgICAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBJRCAgICAgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICQ1LCAkNywgLTEpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBOVU1CRVIgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICQ1LCAgMCwgJDcpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIElEICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICAwLCAkNSwgLTEpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIE5VTUJFUiAgICAgICAgeyBkZWZfaW1wb3J0ICgkMSwgJDMsICAwLCAgMCwgJDUpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgJy4nIElEICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwgJDEsICQzLCAkNSwgLTEpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgICAgICAgICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwgJDEsICAwLCAkMywgLTEpOyB9Ci07Ci0KLXNlY2xpc3Q6Ci0JCXNlY2xpc3Qgc2VjbGluZQotCXwJc2VjbGluZQotCTsKLQotc2VjbGluZToKLQlJRCBhdHRyX2xpc3QgeyBkZWZfc2VjdGlvbiAoJDEsICQyKTt9Ci0JfCBJRCBJRCB7IGRlZl9zZWN0aW9uX2FsdCAoJDEsICQyKTt9Ci0JOwotCi1hdHRyX2xpc3Q6Ci0JYXR0cl9saXN0IG9wdF9jb21tYSBhdHRyIHsgJCQgPSAkMSB8ICQzOyB9Ci0JfCBhdHRyIHsgJCQgPSAkMTsgfQotCTsKLQotb3B0X2NvbW1hOgotCScsJwotCXwgCi0JOwotb3B0X251bWJlcjogJywnIE5VTUJFUiB7ICQkPSQyO30KLQl8CSAgIHsgJCQ9LTE7fQotCTsKLQkKLWF0dHI6Ci0JCVJFQUQJeyAkJCA9IDE7fQotCXwJV1JJVEUJeyAkJCA9IDI7fQkKLQl8CUVYRUNVVEUJeyAkJD00O30KLQl8CVNIQVJFRAl7ICQkPTg7fQotCTsKLQotb3B0X25hbWU6IElECQl7ICQkID0gJDE7IH0KLQl8CQl7ICQkID0gMDsgfQotCTsKLQotb3B0X29yZGluYWw6IAotCSAgJ0AnIE5VTUJFUiAgICAgeyAkJCA9ICQyO30KLQl8ICAgICAgICAgICAgICAgIHsgJCQgPSAtMTt9Ci0JOwotCi1vcHRfZXF1YWxfbmFtZToKLSAgICAgICAgICAnPScgSUQJeyAkJCA9ICQyOyB9Ci0gICAgICAgIHwgCQl7ICQkID0gIDA7IH0JCQkgCi0JOwotCi1vcHRfYmFzZTogQkFTRQknPScgTlVNQkVSCXsgJCQgPSAkMzt9Ci0JfAl7ICQkID0gMDt9Ci0JOwotCi0JCi0KLSUlCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgRklMRSAqdGhlX2ZpbGU7Ci1zdGF0aWMgY29uc3QgY2hhciAqZGVmX2ZpbGVuYW1lOwotc3RhdGljIGludCBsaW5lbnVtYmVyOwotc3RhdGljIGRlZl9maWxlICpkZWY7Ci1zdGF0aWMgaW50IHNhd19uZXdsaW5lOwotCi1zdHJ1Y3QgZGlyZWN0aXZlCi0gIHsKLSAgICBzdHJ1Y3QgZGlyZWN0aXZlICpuZXh0OwotICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IGxlbjsKLSAgfTsKLQotc3RhdGljIHN0cnVjdCBkaXJlY3RpdmUgKmRpcmVjdGl2ZXMgPSAwOwotCi1kZWZfZmlsZSAqCi1kZWZfZmlsZV9lbXB0eSAoKQotewotICBkZWZfZmlsZSAqcnYgPSAoZGVmX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mIChkZWZfZmlsZSkpOwotICBtZW1zZXQgKHJ2LCAwLCBzaXplb2YgKGRlZl9maWxlKSk7Ci0gIHJ2LT5pc19kbGwgPSAtMTsKLSAgcnYtPmJhc2VfYWRkcmVzcyA9IChiZmRfdm1hKSAoLTEpOwotICBydi0+c3RhY2tfcmVzZXJ2ZSA9IHJ2LT5zdGFja19jb21taXQgPSAtMTsKLSAgcnYtPmhlYXBfcmVzZXJ2ZSA9IHJ2LT5oZWFwX2NvbW1pdCA9IC0xOwotICBydi0+dmVyc2lvbl9tYWpvciA9IHJ2LT52ZXJzaW9uX21pbm9yID0gLTE7Ci0gIHJldHVybiBydjsKLX0KLQotZGVmX2ZpbGUgKgotZGVmX2ZpbGVfcGFyc2UgKGZpbGVuYW1lLCBhZGRfdG8pCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBkZWZfZmlsZSAqYWRkX3RvOwotewotICBzdHJ1Y3QgZGlyZWN0aXZlICpkOwotCi0gIHRoZV9maWxlID0gZm9wZW4gKGZpbGVuYW1lLCAiciIpOwotICBkZWZfZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgbGluZW51bWJlciA9IDE7Ci0gIGlmICghdGhlX2ZpbGUpCi0gICAgewotICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChhZGRfdG8pCi0gICAgewotICAgICAgZGVmID0gYWRkX3RvOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRlZiA9IGRlZl9maWxlX2VtcHR5ICgpOwotICAgIH0KLQotICBzYXdfbmV3bGluZSA9IDE7Ci0gIGlmIChkZWZfcGFyc2UgKCkpCi0gICAgewotICAgICAgZGVmX2ZpbGVfZnJlZSAoZGVmKTsKLSAgICAgIGZjbG9zZSAodGhlX2ZpbGUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZjbG9zZSAodGhlX2ZpbGUpOwotCi0gIGZvciAoZCA9IGRpcmVjdGl2ZXM7IGQ7IGQgPSBkLT5uZXh0KQotICAgIHsKLSNpZiBUUkFDRQotICAgICAgcHJpbnRmICgiQWRkaW5nIGRpcmVjdGl2ZSAlMDh4IGAlcydcbiIsIGQtPm5hbWUsIGQtPm5hbWUpOwotI2VuZGlmCi0gICAgICBkZWZfZmlsZV9hZGRfZGlyZWN0aXZlIChkZWYsIGQtPm5hbWUsIGQtPmxlbik7Ci0gICAgfQotCi0gIHJldHVybiBkZWY7Ci19Ci0KLXZvaWQKLWRlZl9maWxlX2ZyZWUgKGRlZikKLSAgICAgZGVmX2ZpbGUgKmRlZjsKLXsKLSAgaW50IGk7Ci0gIGlmICghZGVmKQotICAgIHJldHVybjsKLSAgaWYgKGRlZi0+bmFtZSkKLSAgICBmcmVlIChkZWYtPm5hbWUpOwotICBpZiAoZGVmLT5kZXNjcmlwdGlvbikKLSAgICBmcmVlIChkZWYtPmRlc2NyaXB0aW9uKTsKLQotICBpZiAoZGVmLT5zZWN0aW9uX2RlZnMpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtX3NlY3Rpb25fZGVmczsgaSsrKQotCXsKLQkgIGlmIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5uYW1lKQotCSAgICBmcmVlIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5uYW1lKTsKLQkgIGlmIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5jbGFzcykKLQkgICAgZnJlZSAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uY2xhc3MpOwotCX0KLSAgICAgIGZyZWUgKGRlZi0+c2VjdGlvbl9kZWZzKTsKLSAgICB9Ci0KLSAgaWYgKGRlZi0+ZXhwb3J0cykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIGlmIChkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZQotCSAgICAgICYmIGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lICE9IGRlZi0+ZXhwb3J0c1tpXS5uYW1lKQotCSAgICBmcmVlIChkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLm5hbWUpCi0JICAgIGZyZWUgKGRlZi0+ZXhwb3J0c1tpXS5uYW1lKTsKLQl9Ci0gICAgICBmcmVlIChkZWYtPmV4cG9ydHMpOwotICAgIH0KLQotICBpZiAoZGVmLT5pbXBvcnRzKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWYtPm51bV9pbXBvcnRzOyBpKyspCi0JewotCSAgaWYgKGRlZi0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lCi0JICAgICAgJiYgZGVmLT5pbXBvcnRzW2ldLmludGVybmFsX25hbWUgIT0gZGVmLT5pbXBvcnRzW2ldLm5hbWUpCi0JICAgIGZyZWUgKGRlZi0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQkgIGlmIChkZWYtPmltcG9ydHNbaV0ubmFtZSkKLQkgICAgZnJlZSAoZGVmLT5pbXBvcnRzW2ldLm5hbWUpOwotCX0KLSAgICAgIGZyZWUgKGRlZi0+aW1wb3J0cyk7Ci0gICAgfQotCi0gIHdoaWxlIChkZWYtPm1vZHVsZXMpCi0gICAgewotICAgICAgZGVmX2ZpbGVfbW9kdWxlICptID0gZGVmLT5tb2R1bGVzOwotICAgICAgZGVmLT5tb2R1bGVzID0gZGVmLT5tb2R1bGVzLT5uZXh0OwotICAgICAgZnJlZSAobSk7Ci0gICAgfQotCi0gIGZyZWUgKGRlZik7Ci19Ci0KLSNpZmRlZiBERUZfRklMRV9QUklOVAotdm9pZAotZGVmX2ZpbGVfcHJpbnQgKGZpbGUsIGRlZikKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgZGVmX2ZpbGUgKmRlZjsKLXsKLSAgaW50IGk7Ci0gIGZwcmludGYgKGZpbGUsICI+Pj4+IGRlZl9maWxlIGF0IDB4JTA4eFxuIiwgZGVmKTsKLSAgaWYgKGRlZi0+bmFtZSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICBuYW1lOiAlc1xuIiwgZGVmLT5uYW1lID8gZGVmLT5uYW1lIDogIih1bnNwZWNpZmllZCkiKTsKLSAgaWYgKGRlZi0+aXNfZGxsICE9IC0xKQotICAgIGZwcmludGYgKGZpbGUsICIgIGlzIGRsbDogJXNcbiIsIGRlZi0+aXNfZGxsID8gInllcyIgOiAibm8iKTsKLSAgaWYgKGRlZi0+YmFzZV9hZGRyZXNzICE9IChiZmRfdm1hKSAoLTEpKQotICAgIGZwcmludGYgKGZpbGUsICIgIGJhc2UgYWRkcmVzczogMHglMDh4XG4iLCBkZWYtPmJhc2VfYWRkcmVzcyk7Ci0gIGlmIChkZWYtPmRlc2NyaXB0aW9uKQotICAgIGZwcmludGYgKGZpbGUsICIgIGRlc2NyaXB0aW9uOiBgJXMnXG4iLCBkZWYtPmRlc2NyaXB0aW9uKTsKLSAgaWYgKGRlZi0+c3RhY2tfcmVzZXJ2ZSAhPSAtMSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICBzdGFjayByZXNlcnZlOiAweCUwOHhcbiIsIGRlZi0+c3RhY2tfcmVzZXJ2ZSk7Ci0gIGlmIChkZWYtPnN0YWNrX2NvbW1pdCAhPSAtMSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICBzdGFjayBjb21taXQ6IDB4JTA4eFxuIiwgZGVmLT5zdGFja19jb21taXQpOwotICBpZiAoZGVmLT5oZWFwX3Jlc2VydmUgIT0gLTEpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgaGVhcCByZXNlcnZlOiAweCUwOHhcbiIsIGRlZi0+aGVhcF9yZXNlcnZlKTsKLSAgaWYgKGRlZi0+aGVhcF9jb21taXQgIT0gLTEpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgaGVhcCBjb21taXQ6IDB4JTA4eFxuIiwgZGVmLT5oZWFwX2NvbW1pdCk7Ci0KLSAgaWYgKGRlZi0+bnVtX3NlY3Rpb25fZGVmcyA+IDApCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsZSwgIiAgc2VjdGlvbiBkZWZzOlxuIik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1fc2VjdGlvbl9kZWZzOyBpKyspCi0JewotCSAgZnByaW50ZiAoZmlsZSwgIiAgICBuYW1lOiBgJXMnLCBjbGFzczogYCVzJywgZmxhZ3M6IiwKLQkJICAgZGVmLT5zZWN0aW9uX2RlZnNbaV0ubmFtZSwgZGVmLT5zZWN0aW9uX2RlZnNbaV0uY2xhc3MpOwotCSAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfcmVhZCkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBSIik7Ci0JICBpZiAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ193cml0ZSkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBXIik7Ci0JICBpZiAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ19leGVjdXRlKQotCSAgICBmcHJpbnRmIChmaWxlLCAiIFgiKTsKLQkgIGlmIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX3NoYXJlZCkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBTIik7Ci0JICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQl9Ci0gICAgfQotCi0gIGlmIChkZWYtPm51bV9leHBvcnRzID4gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICBleHBvcnRzOlxuIik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIGZwcmludGYgKGZpbGUsICIgICAgbmFtZTogYCVzJywgaW50OiBgJXMnLCBvcmRpbmFsOiAlZCwgZmxhZ3M6IiwKLQkJICAgZGVmLT5leHBvcnRzW2ldLm5hbWUsIGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lLAotCQkgICBkZWYtPmV4cG9ydHNbaV0ub3JkaW5hbCk7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLmZsYWdfcHJpdmF0ZSkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBQIik7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLmZsYWdfY29uc3RhbnQpCi0JICAgIGZwcmludGYgKGZpbGUsICIgQyIpOwotCSAgaWYgKGRlZi0+ZXhwb3J0c1tpXS5mbGFnX25vbmFtZSkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBOIik7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLmZsYWdfZGF0YSkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBEIik7Ci0JICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQl9Ci0gICAgfQotCi0gIGlmIChkZWYtPm51bV9pbXBvcnRzID4gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICBpbXBvcnRzOlxuIik7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1faW1wb3J0czsgaSsrKQotCXsKLQkgIGZwcmludGYgKGZpbGUsICIgICAgaW50OiAlcywgZnJvbTogYCVzJywgbmFtZTogYCVzJywgb3JkaW5hbDogJWRcbiIsCi0JCSAgIGRlZi0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lLAotCQkgICBkZWYtPmltcG9ydHNbaV0ubW9kdWxlLAotCQkgICBkZWYtPmltcG9ydHNbaV0ubmFtZSwKLQkJICAgZGVmLT5pbXBvcnRzW2ldLm9yZGluYWwpOwotCX0KLSAgICB9Ci0gIGlmIChkZWYtPnZlcnNpb25fbWFqb3IgIT0gLTEpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgdmVyc2lvbjogJWQuJWRcbiIsIGRlZi0+dmVyc2lvbl9tYWpvciwgZGVmLT52ZXJzaW9uX21pbm9yKTsKLSAgZnByaW50ZiAoZmlsZSwgIjw8PDwgZGVmX2ZpbGUgYXQgMHglMDh4XG4iLCBkZWYpOwotfQotI2VuZGlmCi0KLWRlZl9maWxlX2V4cG9ydCAqCi1kZWZfZmlsZV9hZGRfZXhwb3J0IChkZWYsIGV4dGVybmFsX25hbWUsIGludGVybmFsX25hbWUsIG9yZGluYWwpCi0gICAgIGRlZl9maWxlICpkZWY7Ci0gICAgIGNvbnN0IGNoYXIgKmV4dGVybmFsX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7Ci0gICAgIGludCBvcmRpbmFsOwotewotICBkZWZfZmlsZV9leHBvcnQgKmU7Ci0gIGludCBtYXhfZXhwb3J0cyA9IFJPVU5EX1VQKGRlZi0+bnVtX2V4cG9ydHMsIDMyKTsKLSAgaWYgKGRlZi0+bnVtX2V4cG9ydHMgPj0gbWF4X2V4cG9ydHMpCi0gICAgewotICAgICAgbWF4X2V4cG9ydHMgPSBST1VORF9VUChkZWYtPm51bV9leHBvcnRzKzEsIDMyKTsKLSAgICAgIGlmIChkZWYtPmV4cG9ydHMpCi0JZGVmLT5leHBvcnRzID0gKGRlZl9maWxlX2V4cG9ydCAqKSB4cmVhbGxvYyAoZGVmLT5leHBvcnRzLCBtYXhfZXhwb3J0cyAqIHNpemVvZiAoZGVmX2ZpbGVfZXhwb3J0KSk7Ci0gICAgICBlbHNlCi0JZGVmLT5leHBvcnRzID0gKGRlZl9maWxlX2V4cG9ydCAqKSB4bWFsbG9jIChtYXhfZXhwb3J0cyAqIHNpemVvZiAoZGVmX2ZpbGVfZXhwb3J0KSk7Ci0gICAgfQotICBlID0gZGVmLT5leHBvcnRzICsgZGVmLT5udW1fZXhwb3J0czsKLSAgbWVtc2V0IChlLCAwLCBzaXplb2YgKGRlZl9maWxlX2V4cG9ydCkpOwotICBpZiAoaW50ZXJuYWxfbmFtZSAmJiAhZXh0ZXJuYWxfbmFtZSkKLSAgICBleHRlcm5hbF9uYW1lID0gaW50ZXJuYWxfbmFtZTsKLSAgaWYgKGV4dGVybmFsX25hbWUgJiYgIWludGVybmFsX25hbWUpCi0gICAgaW50ZXJuYWxfbmFtZSA9IGV4dGVybmFsX25hbWU7Ci0gIGUtPm5hbWUgPSB4c3RyZHVwIChleHRlcm5hbF9uYW1lKTsKLSAgZS0+aW50ZXJuYWxfbmFtZSA9IHhzdHJkdXAgKGludGVybmFsX25hbWUpOwotICBlLT5vcmRpbmFsID0gb3JkaW5hbDsKLSAgZGVmLT5udW1fZXhwb3J0cysrOwotICByZXR1cm4gZTsKLX0KLQotc3RhdGljIGRlZl9maWxlX21vZHVsZSAqCi1kZWZfc3Rhc2hfbW9kdWxlIChkZWYsIG5hbWUpCi0gICAgIGRlZl9maWxlICpkZWY7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGRlZl9maWxlX21vZHVsZSAqczsKLSAgZm9yIChzPWRlZi0+bW9kdWxlczsgczsgcz1zLT5uZXh0KQotICAgIGlmIChzdHJjbXAgKHMtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICByZXR1cm4gczsKLSAgcyA9IChkZWZfZmlsZV9tb2R1bGUgKikgeG1hbGxvYyAoc2l6ZW9mIChkZWZfZmlsZV9tb2R1bGUpICsgc3RybGVuIChuYW1lKSk7Ci0gIHMtPm5leHQgPSBkZWYtPm1vZHVsZXM7Ci0gIGRlZi0+bW9kdWxlcyA9IHM7Ci0gIHMtPnVzZXJfZGF0YSA9IDA7Ci0gIHN0cmNweSAocy0+bmFtZSwgbmFtZSk7Ci0gIHJldHVybiBzOwotfQotCi1kZWZfZmlsZV9pbXBvcnQgKgotZGVmX2ZpbGVfYWRkX2ltcG9ydCAoZGVmLCBuYW1lLCBtb2R1bGUsIG9yZGluYWwsIGludGVybmFsX25hbWUpCi0gICAgIGRlZl9maWxlICpkZWY7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1vZHVsZTsKLSAgICAgaW50IG9yZGluYWw7Ci0gICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7Ci17Ci0gIGRlZl9maWxlX2ltcG9ydCAqaTsKLSAgaW50IG1heF9pbXBvcnRzID0gUk9VTkRfVVAoZGVmLT5udW1faW1wb3J0cywgMTYpOwotICBpZiAoZGVmLT5udW1faW1wb3J0cyA+PSBtYXhfaW1wb3J0cykKLSAgICB7Ci0gICAgICBtYXhfaW1wb3J0cyA9IFJPVU5EX1VQKGRlZi0+bnVtX2ltcG9ydHMrMSwgMTYpOwotICAgICAgaWYgKGRlZi0+aW1wb3J0cykKLQlkZWYtPmltcG9ydHMgPSAoZGVmX2ZpbGVfaW1wb3J0ICopIHhyZWFsbG9jIChkZWYtPmltcG9ydHMsIG1heF9pbXBvcnRzICogc2l6ZW9mIChkZWZfZmlsZV9pbXBvcnQpKTsKLSAgICAgIGVsc2UKLQlkZWYtPmltcG9ydHMgPSAoZGVmX2ZpbGVfaW1wb3J0ICopIHhtYWxsb2MgKG1heF9pbXBvcnRzICogc2l6ZW9mIChkZWZfZmlsZV9pbXBvcnQpKTsKLSAgICB9Ci0gIGkgPSBkZWYtPmltcG9ydHMgKyBkZWYtPm51bV9pbXBvcnRzOwotICBtZW1zZXQgKGksIDAsIHNpemVvZiAoZGVmX2ZpbGVfaW1wb3J0KSk7Ci0gIGlmIChuYW1lKQotICAgIGktPm5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgaWYgKG1vZHVsZSkKLSAgICBpLT5tb2R1bGUgPSBkZWZfc3Rhc2hfbW9kdWxlKGRlZiwgbW9kdWxlKTsKLSAgaS0+b3JkaW5hbCA9IG9yZGluYWw7Ci0gIGlmIChpbnRlcm5hbF9uYW1lKQotICAgIGktPmludGVybmFsX25hbWUgPSB4c3RyZHVwIChpbnRlcm5hbF9uYW1lKTsKLSAgZWxzZQotICAgIGktPmludGVybmFsX25hbWUgPSBpLT5uYW1lOwotICBkZWYtPm51bV9pbXBvcnRzKys7Ci0gIHJldHVybiBpOwotfQotCi1zdHJ1Y3QKLXsKLSAgY2hhciAqcGFyYW07Ci0gIGludCB0b2tlbjsKLX0KLWRpcm9wdHNbXSA9Ci17Ci0gIHsgIi1oZWFwIiwgSEVBUFNJWkUgfSwKLSAgeyAiLXN0YWNrIiwgU1RBQ0tTSVpFIH0sCi0gIHsgIi1hdHRyIiwgU0VDVElPTlMgfSwKLSAgeyAiLWV4cG9ydCIsIEVYUE9SVFMgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXZvaWQKLWRlZl9maWxlX2FkZF9kaXJlY3RpdmUgKG15X2RlZiwgcGFyYW0sIGxlbikKLSAgICAgZGVmX2ZpbGUgKm15X2RlZjsKLSAgICAgY29uc3QgY2hhciAqcGFyYW07Ci0gICAgIGludCBsZW47Ci17Ci0gIGRlZl9maWxlICpzYXZlX2RlZiA9IGRlZjsKLSAgY29uc3QgY2hhciAqcGVuZCA9IHBhcmFtICsgbGVuOwotICBjb25zdCBjaGFyICp0ZW5kID0gcGFyYW07Ci0gIGludCBpOwotCi0gIGRlZiA9IG15X2RlZjsKLQotICB3aGlsZSAocGFyYW0gPCBwZW5kKQotICAgIHsKLSAgICAgIHdoaWxlIChwYXJhbSA8IHBlbmQgJiYgaXNzcGFjZSAoKnBhcmFtKSkKLQlwYXJhbSsrOwotICAgICAgZm9yICh0ZW5kID0gcGFyYW0gKyAxOwotCSAgIHRlbmQgPCBwZW5kICYmICEoaXNzcGFjZSAodGVuZFstMV0pICYmICp0ZW5kID09ICctJyk7Ci0JICAgdGVuZCsrKTsKLQotICAgICAgZm9yIChpID0gMDsgZGlyb3B0c1tpXS5wYXJhbTsgaSsrKQotCXsKLQkgIGludCBsZW4gPSBzdHJsZW4gKGRpcm9wdHNbaV0ucGFyYW0pOwotCSAgaWYgKHRlbmQgLSBwYXJhbSA+PSBsZW4KLQkgICAgICAmJiBzdHJuY21wIChwYXJhbSwgZGlyb3B0c1tpXS5wYXJhbSwgbGVuKSA9PSAwCi0JICAgICAgJiYgKHBhcmFtW2xlbl0gPT0gJzonIHx8IHBhcmFtW2xlbl0gPT0gJyAnKSkKLQkgICAgewotCSAgICAgIGxleF9wYXJzZV9zdHJpbmdfZW5kID0gdGVuZDsKLQkgICAgICBsZXhfcGFyc2Vfc3RyaW5nID0gcGFyYW0gKyBsZW4gKyAxOwotCSAgICAgIGxleF9mb3JjZWRfdG9rZW4gPSBkaXJvcHRzW2ldLnRva2VuOwotCSAgICAgIHNhd19uZXdsaW5lID0gMDsKLQkgICAgICBkZWZfcGFyc2UgKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghZGlyb3B0c1tpXS5wYXJhbSkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZWluZm8gKF8oIldhcm5pbmc6IC5kcmVjdHZlIGAlLipzJyB1bnJlY29nbml6ZWRcbiIpLAotCQkgdGVuZCAtIHBhcmFtLCBwYXJhbSk7Ci0JfQotICAgICAgbGV4X3BhcnNlX3N0cmluZyA9IDA7Ci0gICAgICBwYXJhbSA9IHRlbmQ7Ci0gICAgfQotCi0gIGRlZiA9IHNhdmVfZGVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBQYXJzZXIgQ2FsbGJhY2tzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1kZWZfbmFtZSAobmFtZSwgYmFzZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGJhc2U7Ci17Ci0gIGlmIChkZWYtPm5hbWUpCi0gICAgZnJlZSAoZGVmLT5uYW1lKTsKLSAgZGVmLT5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGRlZi0+YmFzZV9hZGRyZXNzID0gYmFzZTsKLSAgZGVmLT5pc19kbGwgPSAwOwotfQotCi1zdGF0aWMgdm9pZAotZGVmX2xpYnJhcnkgKG5hbWUsIGJhc2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBiYXNlOwotewotICBpZiAoZGVmLT5uYW1lKQotICAgIGZyZWUgKGRlZi0+bmFtZSk7Ci0gIGRlZi0+bmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotICBkZWYtPmJhc2VfYWRkcmVzcyA9IGJhc2U7Ci0gIGRlZi0+aXNfZGxsID0gMTsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9kZXNjcmlwdGlvbiAodGV4dCkKLSAgICAgY29uc3QgY2hhciAqdGV4dDsKLXsKLSAgaW50IGxlbiA9IGRlZi0+ZGVzY3JpcHRpb24gPyBzdHJsZW4gKGRlZi0+ZGVzY3JpcHRpb24pIDogMDsKLSAgbGVuICs9IHN0cmxlbiAodGV4dCkgKyAxOwotICBpZiAoZGVmLT5kZXNjcmlwdGlvbikKLSAgICB7Ci0gICAgICBkZWYtPmRlc2NyaXB0aW9uID0gKGNoYXIgKikgeHJlYWxsb2MgKGRlZi0+ZGVzY3JpcHRpb24sIGxlbik7Ci0gICAgICBzdHJjYXQgKGRlZi0+ZGVzY3JpcHRpb24sIHRleHQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRlZi0+ZGVzY3JpcHRpb24gPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICAgICAgc3RyY3B5IChkZWYtPmRlc2NyaXB0aW9uLCB0ZXh0KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfc3RhY2tzaXplIChyZXNlcnZlLCBjb21taXQpCi0gICAgIGludCByZXNlcnZlOwotICAgICBpbnQgY29tbWl0OwotewotICBkZWYtPnN0YWNrX3Jlc2VydmUgPSByZXNlcnZlOwotICBkZWYtPnN0YWNrX2NvbW1pdCA9IGNvbW1pdDsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9oZWFwc2l6ZSAocmVzZXJ2ZSwgY29tbWl0KQotICAgICBpbnQgcmVzZXJ2ZTsKLSAgICAgaW50IGNvbW1pdDsKLXsKLSAgZGVmLT5oZWFwX3Jlc2VydmUgPSByZXNlcnZlOwotICBkZWYtPmhlYXBfY29tbWl0ID0gY29tbWl0OwotfQotCi1zdGF0aWMgdm9pZAotZGVmX3NlY3Rpb24gKG5hbWUsIGF0dHIpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBhdHRyOwotewotICBkZWZfZmlsZV9zZWN0aW9uICpzOwotICBpbnQgbWF4X3NlY3Rpb25zID0gUk9VTkRfVVAoZGVmLT5udW1fc2VjdGlvbl9kZWZzLCA0KTsKLSAgaWYgKGRlZi0+bnVtX3NlY3Rpb25fZGVmcyA+PSBtYXhfc2VjdGlvbnMpCi0gICAgewotICAgICAgbWF4X3NlY3Rpb25zID0gUk9VTkRfVVAoZGVmLT5udW1fc2VjdGlvbl9kZWZzKzEsIDQpOwotICAgICAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzKQotCWRlZi0+c2VjdGlvbl9kZWZzID0gKGRlZl9maWxlX3NlY3Rpb24gKikgeHJlYWxsb2MgKGRlZi0+c2VjdGlvbl9kZWZzLCBtYXhfc2VjdGlvbnMgKiBzaXplb2YgKGRlZl9maWxlX2ltcG9ydCkpOwotICAgICAgZWxzZQotCWRlZi0+c2VjdGlvbl9kZWZzID0gKGRlZl9maWxlX3NlY3Rpb24gKikgeG1hbGxvYyAobWF4X3NlY3Rpb25zICogc2l6ZW9mIChkZWZfZmlsZV9pbXBvcnQpKTsKLSAgICB9Ci0gIHMgPSBkZWYtPnNlY3Rpb25fZGVmcyArIGRlZi0+bnVtX3NlY3Rpb25fZGVmczsKLSAgbWVtc2V0IChzLCAwLCBzaXplb2YgKGRlZl9maWxlX3NlY3Rpb24pKTsKLSAgcy0+bmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotICBpZiAoYXR0ciAmIDEpCi0gICAgcy0+ZmxhZ19yZWFkID0gMTsKLSAgaWYgKGF0dHIgJiAyKQotICAgIHMtPmZsYWdfd3JpdGUgPSAxOwotICBpZiAoYXR0ciAmIDQpCi0gICAgcy0+ZmxhZ19leGVjdXRlID0gMTsKLSAgaWYgKGF0dHIgJiA4KQotICAgIHMtPmZsYWdfc2hhcmVkID0gMTsKLQotICBkZWYtPm51bV9zZWN0aW9uX2RlZnMrKzsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9zZWN0aW9uX2FsdCAobmFtZSwgYXR0cikKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqYXR0cjsKLXsKLSAgaW50IGF2YWwgPSAwOwotICBmb3IgKDsgKmF0dHI7IGF0dHIrKykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCphdHRyKQotCXsKLQljYXNlICdSJzoKLQljYXNlICdyJzoKLQkgIGF2YWwgfD0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1cnOgotCWNhc2UgJ3cnOgotCSAgYXZhbCB8PSAyOwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JY2FzZSAneCc6Ci0JICBhdmFsIHw9IDQ7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQljYXNlICdzJzoKLQkgIGF2YWwgfD0gODsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGRlZl9zZWN0aW9uIChuYW1lLCBhdmFsKTsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9leHBvcnRzIChleHRlcm5hbF9uYW1lLCBpbnRlcm5hbF9uYW1lLCBvcmRpbmFsLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqZXh0ZXJuYWxfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZTsKLSAgICAgaW50IG9yZGluYWw7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgZGVmX2ZpbGVfZXhwb3J0ICpkZmU7Ci0KLSAgaWYgKCFpbnRlcm5hbF9uYW1lICYmIGV4dGVybmFsX25hbWUpCi0gICAgaW50ZXJuYWxfbmFtZSA9IGV4dGVybmFsX25hbWU7Ci0jaWYgVFJBQ0UKLSAgcHJpbnRmICgiZGVmX2V4cG9ydHMsIGV4dD0lcyBpbnQ9JXNcbiIsIGV4dGVybmFsX25hbWUsIGludGVybmFsX25hbWUpOwotI2VuZGlmCi0KLSAgZGZlID0gZGVmX2ZpbGVfYWRkX2V4cG9ydCAoZGVmLCBleHRlcm5hbF9uYW1lLCBpbnRlcm5hbF9uYW1lLCBvcmRpbmFsKTsKLSAgaWYgKGZsYWdzICYgMSkKLSAgICBkZmUtPmZsYWdfbm9uYW1lID0gMTsKLSAgaWYgKGZsYWdzICYgMikKLSAgICBkZmUtPmZsYWdfY29uc3RhbnQgPSAxOwotICBpZiAoZmxhZ3MgJiA0KQotICAgIGRmZS0+ZmxhZ19kYXRhID0gMTsKLSAgaWYgKGZsYWdzICYgOCkKLSAgICBkZmUtPmZsYWdfcHJpdmF0ZSA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfaW1wb3J0IChpbnRlcm5hbF9uYW1lLCBtb2R1bGUsIGRsbGV4dCwgbmFtZSwgb3JkaW5hbCkKLSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbW9kdWxlOwotICAgICBjb25zdCBjaGFyICpkbGxleHQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBvcmRpbmFsOwotewotICBjaGFyICpidWYgPSAwOwotCi0gIGlmIChkbGxleHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG1vZHVsZSkgKyBzdHJsZW4gKGRsbGV4dCkgKyAyKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzLiVzIiwgbW9kdWxlLCBkbGxleHQpOwotICAgICAgbW9kdWxlID0gYnVmOwotICAgIH0KLQotICBkZWZfZmlsZV9hZGRfaW1wb3J0IChkZWYsIG5hbWUsIG1vZHVsZSwgb3JkaW5hbCwgaW50ZXJuYWxfbmFtZSk7Ci0gIGlmIChidWYpCi0gICAgZnJlZSAoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl92ZXJzaW9uIChtYWpvciwgbWlub3IpCi0gICAgIGludCBtYWpvcjsKLSAgICAgaW50IG1pbm9yOwotewotICBkZWYtPnZlcnNpb25fbWFqb3IgPSBtYWpvcjsKLSAgZGVmLT52ZXJzaW9uX21pbm9yID0gbWlub3I7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfZGlyZWN0aXZlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgc3RydWN0IGRpcmVjdGl2ZSAqZCA9IChzdHJ1Y3QgZGlyZWN0aXZlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGRpcmVjdGl2ZSkpOwotICBkLT5uZXh0ID0gZGlyZWN0aXZlczsKLSAgZGlyZWN0aXZlcyA9IGQ7Ci0gIGQtPm5hbWUgPSB4c3RyZHVwIChzdHIpOwotICBkLT5sZW4gPSBzdHJsZW4gKHN0cik7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlZl9lcnJvciAoZXJyKQotICAgICBjb25zdCBjaGFyICplcnI7Ci17Ci0gIGVpbmZvICgiJVA6ICVzOiVkOiAlc1xuIiwgZGVmX2ZpbGVuYW1lLCBsaW5lbnVtYmVyLCBlcnIpOwotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIExleGljYWwgU2Nhbm5lcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jdW5kZWYgVFJBQ0UKLSNkZWZpbmUgVFJBQ0UgMAotCi0vKiBOZXZlciBmcmVlZCwgYnV0IGFsd2F5cyByZXVzZWQgYXMgbmVlZGVkLCBzbyBubyByZWFsIGxlYWsgKi8KLXN0YXRpYyBjaGFyICpidWZmZXIgPSAwOwotc3RhdGljIGludCBidWZsZW4gPSAwOwotc3RhdGljIGludCBidWZwdHIgPSAwOwotCi1zdGF0aWMgdm9pZAotcHV0X2J1ZiAoYykKLSAgICAgY2hhciBjOwotewotICBpZiAoYnVmcHRyID09IGJ1ZmxlbikKLSAgICB7Ci0gICAgICBidWZsZW4gKz0gNTA7CQkvKiBvdmVybHkgcmVhc29uYWJsZSwgZWg/ICovCi0gICAgICBpZiAoYnVmZmVyKQotCWJ1ZmZlciA9IChjaGFyICopIHhyZWFsbG9jIChidWZmZXIsIGJ1ZmxlbiArIDEpOwotICAgICAgZWxzZQotCWJ1ZmZlciA9IChjaGFyICopIHhtYWxsb2MgKGJ1ZmxlbiArIDEpOwotICAgIH0KLSAgYnVmZmVyW2J1ZnB0cisrXSA9IGM7Ci0gIGJ1ZmZlcltidWZwdHJdID0gMDsJCS8qIG5vdCBvcHRpbWFsLCBidXQgdmVyeSBjb252ZW5pZW50ICovCi19Ci0KLXN0YXRpYyBzdHJ1Y3QKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IHRva2VuOwotfQotdG9rZW5zW10gPQotewotICB7ICJCQVNFIiwgQkFTRSB9LAotICB7ICJDT0RFIiwgQ09ERSB9LAotICB7ICJDT05TVEFOVCIsIENPTlNUQU5UVSB9LAotICB7ICJjb25zdGFudCIsIENPTlNUQU5UTCB9LAotICB7ICJEQVRBIiwgREFUQVUgfSwKLSAgeyAiZGF0YSIsIERBVEFMIH0sCi0gIHsgIkRFU0NSSVBUSU9OIiwgREVTQ1JJUFRJT04gfSwKLSAgeyAiRElSRUNUSVZFIiwgRElSRUNUSVZFIH0sCi0gIHsgIkVYRUNVVEUiLCBFWEVDVVRFIH0sCi0gIHsgIkVYUE9SVFMiLCBFWFBPUlRTIH0sCi0gIHsgIkhFQVBTSVpFIiwgSEVBUFNJWkUgfSwKLSAgeyAiSU1QT1JUUyIsIElNUE9SVFMgfSwKLSAgeyAiTElCUkFSWSIsIExJQlJBUlkgfSwKLSAgeyAiTkFNRSIsIE5BTUUgfSwKLSAgeyAiTk9OQU1FIiwgTk9OQU1FVSB9LAotICB7ICJub25hbWUiLCBOT05BTUVMIH0sCi0gIHsgIlBSSVZBVEUiLCBQUklWQVRFVSB9LAotICB7ICJwcml2YXRlIiwgUFJJVkFURUwgfSwKLSAgeyAiUkVBRCIsIFJFQUQgfSwKLSAgeyAiU0VDVElPTlMiLCBTRUNUSU9OUyB9LAotICB7ICJTRUdNRU5UUyIsIFNFQ1RJT05TIH0sCi0gIHsgIlNIQVJFRCIsIFNIQVJFRCB9LAotICB7ICJTVEFDS1NJWkUiLCBTVEFDS1NJWkUgfSwKLSAgeyAiVkVSU0lPTiIsIFZFUlNJT05LIH0sCi0gIHsgIldSSVRFIiwgV1JJVEUgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyBpbnQKLWRlZl9nZXRjICgpCi17Ci0gIGludCBydjsKLSAgaWYgKGxleF9wYXJzZV9zdHJpbmcpCi0gICAgewotICAgICAgaWYgKGxleF9wYXJzZV9zdHJpbmcgPj0gbGV4X3BhcnNlX3N0cmluZ19lbmQpCi0JcnYgPSBFT0Y7Ci0gICAgICBlbHNlCi0JcnYgPSAqbGV4X3BhcnNlX3N0cmluZysrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJ2ID0gZmdldGMgKHRoZV9maWxlKTsKLSAgICB9Ci0gIGlmIChydiA9PSAnXG4nKQotICAgIHNhd19uZXdsaW5lID0gMTsKLSAgcmV0dXJuIHJ2OwotfQotCi1zdGF0aWMgaW50Ci1kZWZfdW5nZXRjIChjKQotICAgICBpbnQgYzsKLXsKLSAgaWYgKGxleF9wYXJzZV9zdHJpbmcpCi0gICAgewotICAgICAgbGV4X3BhcnNlX3N0cmluZy0tOwotICAgICAgcmV0dXJuIGM7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIHVuZ2V0YyAoYywgdGhlX2ZpbGUpOwotfQotCi1zdGF0aWMgaW50Ci1kZWZfbGV4ICgpCi17Ci0gIGludCBjLCBpLCBxOwotCi0gIGlmIChsZXhfZm9yY2VkX3Rva2VuKQotICAgIHsKLSAgICAgIGkgPSBsZXhfZm9yY2VkX3Rva2VuOwotICAgICAgbGV4X2ZvcmNlZF90b2tlbiA9IDA7Ci0jaWYgVFJBQ0UKLSAgICAgIHByaW50ZiAoImxleDogZm9yY2luZyB0b2tlbiAlZFxuIiwgaSk7Ci0jZW5kaWYKLSAgICAgIHJldHVybiBpOwotICAgIH0KLQotICBjID0gZGVmX2dldGMgKCk7Ci0KLSAgLyogdHJpbSBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKGMgIT0gRU9GICYmIChjID09ICcgJyB8fCBjID09ICdcdCcpICYmIHNhd19uZXdsaW5lKQotICAgIGMgPSBkZWZfZ2V0YyAoKTsKLQotICBpZiAoYyA9PSBFT0YpCi0gICAgewotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IEVPRlxuIik7Ci0jZW5kaWYKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoc2F3X25ld2xpbmUgJiYgYyA9PSAnOycpCi0gICAgewotICAgICAgZG8KLQl7Ci0JICBjID0gZGVmX2dldGMgKCk7Ci0JfQotICAgICAgd2hpbGUgKGMgIT0gRU9GICYmIGMgIT0gJ1xuJyk7Ci0gICAgICBpZiAoYyA9PSAnXG4nKQotCXJldHVybiBkZWZfbGV4ICgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAvKiBtdXN0IGJlIHNvbWV0aGluZyBlbHNlICovCi0gIHNhd19uZXdsaW5lID0gMDsKLQotICBpZiAoaXNkaWdpdCAoYykpCi0gICAgewotICAgICAgYnVmcHRyID0gMDsKLSAgICAgIHdoaWxlIChjICE9IEVPRiAmJiAoaXN4ZGlnaXQgKGMpIHx8IChjID09ICd4JykpKQotCXsKLQkgIHB1dF9idWYgKGMpOwotCSAgYyA9IGRlZl9nZXRjICgpOwotCX0KLSAgICAgIGlmIChjICE9IEVPRikKLQlkZWZfdW5nZXRjIChjKTsKLSAgICAgIHl5bHZhbC5udW1iZXIgPSBzdHJ0b3VsIChidWZmZXIsIDAsIDApOwotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGAlcycgcmV0dXJucyBOVU1CRVIgJWRcbiIsIGJ1ZmZlciwgeXlsdmFsLm51bWJlcik7Ci0jZW5kaWYKLSAgICAgIHJldHVybiBOVU1CRVI7Ci0gICAgfQotCi0gIGlmIChpc2FscGhhIChjKSB8fCBzdHJjaHIgKCIkOi1fPyIsIGMpKQotICAgIHsKLSAgICAgIGJ1ZnB0ciA9IDA7Ci0gICAgICB3aGlsZSAoYyAhPSBFT0YgJiYgKGlzYWxudW0gKGMpIHx8IHN0cmNociAoIiQ6LV8/L0AiLCBjKSkpCi0JewotCSAgcHV0X2J1ZiAoYyk7Ci0JICBjID0gZGVmX2dldGMgKCk7Ci0JfQotICAgICAgaWYgKGMgIT0gRU9GKQotCWRlZl91bmdldGMgKGMpOwotICAgICAgZm9yIChpID0gMDsgdG9rZW5zW2ldLm5hbWU7IGkrKykKLQlpZiAoc3RyY21wICh0b2tlbnNbaV0ubmFtZSwgYnVmZmVyKSA9PSAwKQotCSAgewotI2lmIFRSQUNFCi0JICAgIHByaW50ZiAoImxleDogYCVzJyBpcyBhIHN0cmluZyB0b2tlblxuIiwgYnVmZmVyKTsKLSNlbmRpZgotCSAgICByZXR1cm4gdG9rZW5zW2ldLnRva2VuOwotCSAgfQotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGAlcycgcmV0dXJucyBJRFxuIiwgYnVmZmVyKTsKLSNlbmRpZgotICAgICAgeXlsdmFsLmlkID0geHN0cmR1cCAoYnVmZmVyKTsKLSAgICAgIHJldHVybiBJRDsKLSAgICB9Ci0KLSAgaWYgKGMgPT0gJ1wnJyB8fCBjID09ICciJykKLSAgICB7Ci0gICAgICBxID0gYzsKLSAgICAgIGMgPSBkZWZfZ2V0YyAoKTsKLSAgICAgIGJ1ZnB0ciA9IDA7Ci0gICAgICB3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSBxKQotCXsKLQkgIHB1dF9idWYgKGMpOwotCSAgYyA9IGRlZl9nZXRjICgpOwotCX0KLSAgICAgIHl5bHZhbC5pZCA9IHhzdHJkdXAgKGJ1ZmZlcik7Ci0jaWYgVFJBQ0UKLSAgICAgIHByaW50ZiAoImxleDogYCVzJyByZXR1cm5zIElEXG4iLCBidWZmZXIpOwotI2VuZGlmCi0gICAgICByZXR1cm4gSUQ7Ci0gICAgfQotCi0gIGlmIChjID09ICc9JyB8fCBjID09ICcuJyB8fCBjID09ICdAJyB8fCBjID09ICcsJykKLSAgICB7Ci0jaWYgVFJBQ0UKLSAgICAgIHByaW50ZiAoImxleDogYCVjJyByZXR1cm5zIGl0c2VsZlxuIiwgYyk7Ci0jZW5kaWYKLSAgICAgIHJldHVybiBjOwotICAgIH0KLQotICBpZiAoYyA9PSAnXG4nKQotICAgIHsKLSAgICAgIGxpbmVudW1iZXIrKzsKLSAgICAgIHNhd19uZXdsaW5lID0gMTsKLSAgICB9Ci0KLSAgLypwcmludGYgKCJsZXg6IDB4JTAyeCBpZ25vcmVkXG4iLCBjKTsgKi8KLSAgcmV0dXJuIGRlZl9sZXggKCk7Ci19CmRpZmYgLS1naXQgYS9sZC9kZXAtaW4uc2VkIGIvbGQvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4MGViMC4uMDAwMDAwMAotLS0gYS9sZC9kZXAtaW4uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotOmxvb3AKLS9cXCQvTgotL1xcJC9iIGxvb3AKLQotcyFASU5DRElSQCEkKElOQ0RJUikhZwotcyFAU1JDRElSQC8hIWcKLXMhXC5cLi9iZmQvaG9zdHMvW14gXSpcLmggISAhZwotCi1zL1xcXG4gKi8gL2cKLQotcy8gKiQvLwotcy8gICovIC9nCi0vOiQvZAotCi1zL1woLlx7NTBcfVteIF0qXCkgL1wxIFxcXAotICAvZwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9SRUFETUUgYi9sZC9lbXVscGFyYW1zL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkNmQyNi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFyZSByZWFkIGJ5IGdlbnNjcmlwdHMuc2ggYXMgc2hlbGwgY29tbWFuZHMuCi1UaGV5IHNldCBwYXJhbWV0ZXJzIGZvciB0aGUgZW11bGF0aW9ucy4KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYTI5ay5zaCBiL2xkL2VtdWxwYXJhbXMvYTI5ay5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljOGU4NS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2EyOWsuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWEyOWsKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtYTI5ay1iaWciCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1hMjlrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FpeHBwYy5zaCBiL2xkL2VtdWxwYXJhbXMvYWl4cHBjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJlNjg2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYWl4cHBjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1URU1QTEFURV9OQU1FPWFpeAotU0NSSVBUX05BTUU9YWl4Ci1PVVRQVVRfRk9STUFUPSJhaXhjb2ZmLXJzNjAwMCIKLUFSQ0g9cG93ZXJwYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9haXhyczYuc2ggYi9sZC9lbXVscGFyYW1zL2FpeHJzNi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzYzNmNy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FpeHJzNi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVEVNUExBVEVfTkFNRT1haXgKLVNDUklQVF9OQU1FPWFpeAotT1VUUFVUX0ZPUk1BVD0iYWl4Y29mZi1yczYwMDAiCi1BUkNIPXJzNjAwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hbHBoYS5zaCBiL2xkL2VtdWxwYXJhbXMvYWxwaGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTkyM2YuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hbHBoYS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotU0NSSVBUX05BTUU9YWxwaGEKLU9VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZWFscGhhIgotQVJDSD1hbHBoYQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcmNlbGYuc2ggYi9sZC9lbXVscGFyYW1zL2FyY2VsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjOWMxNy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FyY2VsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJjIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFyYyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdhcmMiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1NQVhQQUdFU0laRT0weDEwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAKLUFSQ0g9YXJjCi1NQUNISU5FPQotRU5UUlk9c3RhcnQKLSNURU1QTEFURV9OQU1FPWVsZjMyCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybV9lcG9jX3BlLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRmYTIyZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybV9lcG9jX3BlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BUkNIPWFybQotU0NSSVBUX05BTUU9ZXBvY3BlCi1PVVRQVVRfRk9STUFUPSJlcG9jLXBlaS1hcm0tbGl0dGxlIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVwb2MtcGVpLWFybS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZXBvYy1wZWktYXJtLWJpZyIKLVRFTVBMQVRFX05BTUU9cGUKLUVOVFJZPSJfbWFpbkNSVFN0YXJ0dXAiCi1TVUJTWVNURU09UEVfREVGX1NVQlNZU1RFTQotSU5JVElBTF9TWU1CT0xfQ0hBUj1cIl9cIgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1hb3V0Yi5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtYW91dGIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YWI2ZjEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1hb3V0Yi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YXJtYW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtYXJtLWJpZyIKLUhFQURFUl9TVEFSVF9BRERSPTB4ODAwMAotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSRVNTPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0zMjc2OAotQVJDSD1hcm0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtYW91dGwuc2ggYi9sZC9lbXVscGFyYW1zL2FybWFvdXRsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTAxZjMzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtYW91dGwuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFybWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWFybS1saXR0bGUiCi1IRUFERVJfU1RBUlRfQUREUj0weDgwMDAKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUkVTUz0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MzI3NjgKLUFSQ0g9YXJtCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL2FybWNvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZGY3ZDMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1jb2ZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1BUkNIPWFybQotU0NSSVBUX05BTUU9YXJtY29mZgotT1VUUFVUX0ZPUk1BVD0iY29mZi1hcm0tbGl0dGxlIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImNvZmYtYXJtLWxpdHRsZSIKLUJJR19PVVRQVVRfRk9STUFUPSJjb2ZmLWFybS1iaWciCi1URU1QTEFURV9OQU1FPWFybWNvZmYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1lbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzliNjQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1lbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJtIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRFTVBMQVRFX05BTUU9YXJtZWxmCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5nbHVlXzd0KSAqKC5nbHVlXzcpJwotT1RIRVJfQlNTX1NZTUJPTFM9J19fYnNzX3N0YXJ0X18gPSAuOycKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0nX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7JwotCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi0KLUFSQ0g9YXJtCi1NQUNISU5FPQotTUFYUEFHRVNJWkU9MjU2Ci1FTlRSWT1fc3RhcnQKLUVNQkVEREVEPXllcwotCi0jIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0jIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoMl4xOSBieXRlcykuCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHg4MDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eC5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODVlOGJkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotQVJDSD1hcm0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ2FybSIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1NQVhQQUdFU0laRT0weDgwMDAKLVRFTVBMQVRFX05BTUU9YXJtZWxmCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi0KLURBVEFfU1RBUlRfU1lNQk9MUz0nX19kYXRhX3N0YXJ0ID0gLiA7JzsKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLmdsdWVfN3QpICooLmdsdWVfNyknCi1PVEhFUl9CU1NfU1lNQk9MUz0nX19ic3Nfc3RhcnRfXyA9IC47JwotT1RIRVJfQlNTX0VORF9TWU1CT0xTPSdfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7IF9fZW5kX18gPSAuIDsnCi0KLSMgVGhpcyBuZWVkcyB0byBiZSBoaWdoIGVub3VnaCBzbyB0aGF0IHdlIGNhbiBsb2FkIGxkLnNvIGJlbG93IGl0LAotIyB5ZXQgbG93IGVub3VnaCB0byBzdGF5IGF3YXkgZnJvbSB0aGUgbW1hcCBhcmVhIGF0IDB4NDAwMDAwMDAuCi0jIEFsc28sIGl0IGlzIHNtYWxsIGVub3VnaCBzbyB0aGF0IHJlbG9jcyB3aGljaCBhcmUgcG9pbnRpbmcKLSMgYXQgYWJzb2x1dGUgMCB3aWxsIHN0aWxsIGJlIGZpeGVkIHVwLgotVEVYVF9TVEFSVF9BRERSPTB4MDIwMDAwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2ggYi9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmQxYjBlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1BUkNIPWFybQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJtIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKLU1BWFBBR0VTSVpFPTB4ODAwMAotVEVNUExBVEVfTkFNRT1hcm1lbGYKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLQotREFUQV9TVEFSVF9TWU1CT0xTPSdfX2RhdGFfc3RhcnQgPSAuIDsnOwotT1RIRVJfQlNTX1NZTUJPTFM9J19fYnNzX3N0YXJ0X18gPSAuOycKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0nX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOyBfX2VuZF9fID0gLiA7JwotCi0jIFRoaXMgbmVlZHMgdG8gYmUgaGlnaCBlbm91Z2ggc28gdGhhdCB3ZSBjYW4gbG9hZCBsZC5zbyBiZWxvdyBpdCwKLSMgeWV0IGxvdyBlbm91Z2ggdG8gc3RheSBhd2F5IGZyb20gdGhlIG1tYXAgYXJlYSBhdCAweDAxMTAwMDAwLgotIyBBbHNvLCBpdCBpcyBzbWFsbCBlbm91Z2ggc28gdGhhdCByZWxvY3Mgd2hpY2ggYXJlIHBvaW50aW5nCi0jIGF0IGFic29sdXRlIDAgd2lsbCBzdGlsbCBiZSBmaXhlZCB1cC4KLSMgVGhlc2UgdmFsdWVzIGdpdmUgdXMgYWJvdXQgMC41TUIgZm9yIGxkLnNvLCAxNi41TUIgZm9yIHVzZXIgCi0jIHByb2dyYW1zLCBhbmQgMTVNQiBmb3IgbW1hcCB3aGljaCBzZWVtcyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZS4KLVRFWFRfU1RBUlRfQUREUj0weDAwMDgwMDAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU2ODMyOC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtLW9hYmkiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJtLW9hYmkiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtLW9hYmkiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1URU1QTEFURV9OQU1FPWFybWVsZl9vYWJpCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5nbHVlXzd0KSAqKC5nbHVlXzcpJwotT1RIRVJfQlNTX1NZTUJPTFM9J19fYnNzX3N0YXJ0X18gPSAuOycKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0nX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOycKLSAKLSAKLUFSQ0g9YXJtCi1NQUNISU5FPQotTUFYUEFHRVNJWkU9MjU2Ci1FTlRSWT1fc3RhcnQKLUVNQkVEREVEPXllcwotIAotIyBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQotIyB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKDJeMTkgYnl0ZXMpLgotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4ODAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1uYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1uYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzI3NzkxLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtbmJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtYXJtLW5ldGJzZCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPWFybQotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfX0RZTkFNSUMgPSAwOycKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtcGUuc2ggYi9sZC9lbXVscGFyYW1zL2FybXBlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTdjOWRlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtcGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFSQ0g9YXJtCi1TQ1JJUFRfTkFNRT1wZQotT1VUUFVUX0ZPUk1BVD0icGVpLWFybS1saXR0bGUiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0icGVpLWFybS1saXR0bGUiCi1CSUdfT1VUUFVUX0ZPUk1BVD0icGVpLWFybS1iaWciCi1URU1QTEFURV9OQU1FPXBlCi1FTlRSWT0iX21haW5DUlRTdGFydHVwIgotU1VCU1lTVEVNPVBFX0RFRl9TVUJTWVNURU0KLUlOSVRJQUxfU1lNQk9MX0NIQVI9XCJfXCIKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvY29mZl9zcGFyYy5zaCBiL2xkL2VtdWxwYXJhbXMvY29mZl9zcGFyYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmODUyYS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2NvZmZfc3BhcmMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPXNwYXJjY29mZgotT1VUUFVUX0ZPUk1BVD0iY29mZi1zcGFyYyIKLSMgZm9sbG93aW5nIGFyZSBkdWJpb3VzIChib3Jyb3dlZCBmcm9tIHNwYXJjIGx5bngpCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKLUFSQ0g9c3BhcmMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZDEwdmVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvZDEwdmVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjNDIxNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2QxMHZlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGZkMTB2Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1kMTB2IgotVEVYVF9TVEFSVF9BRERSPTB4MDEwMDAwMDAKLVJFQURPTkxZX1NUQVJUX0FERFI9MHgwMjAwMDAwNAotQVJDSD1kMTB2Ci1NQVhQQUdFU0laRT0zMgotRU1CRURERUQ9dAotVEVNUExBVEVfTkFNRT1lbGYzMgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9kMzB2X2Uuc2ggYi9sZC9lbXVscGFyYW1zL2QzMHZfZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhYjVhMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2QzMHZfZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGZkMzB2Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1kMzB2IgotVEVYVF9TVEFSVF9BRERSPTB4MDAwMDAwMDAKLURBVEFfU1RBUlRfQUREUj0weDIwMDAwMDAwCi1FTUVNX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotU1RBQ0tfU1RBUlRfQUREUj0weDIwMDA4MDAwCi1FSVRfU1RBUlRfQUREUj0weGZmZmZmMDIwCi1URVhUX1NJWkU9NjRLCi1EQVRBX1NJWkU9MzJLCi1FTUVNX1NJWkU9OE0KLUVJVF9TSVpFPTMyMAotVEVYVF9NRU1PUlk9ZW1lbQotREFUQV9NRU1PUlk9ZW1lbQotQlNTX01FTU9SWT1lbWVtCi1URVhUX0RFRl9TRUNUSU9OPSIiCi1EQVRBX0RFRl9TRUNUSU9OPSIiCi1FTUVNX0RFRl9TRUNUSU9OPSIocnd4KSIKLUFSQ0g9ZDMwdgotRU1CRURERUQ9dApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9kMzB2X28uc2ggYi9sZC9lbXVscGFyYW1zL2QzMHZfby5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiY2I0Mi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2QzMHZfby5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGZkMzB2Ci1PVVRQVVRfRk9STUFUPSJlbGYzMi1kMzB2IgotVEVYVF9TVEFSVF9BRERSPTB4MDAwMDAwMDAKLURBVEFfU1RBUlRfQUREUj0weDIwMDAwMDAwCi1FTUVNX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotU1RBQ0tfU1RBUlRfQUREUj0weDIwMDA4MDAwCi1FSVRfU1RBUlRfQUREUj0weGZmZmZmMDIwCi1URVhUX1NJWkU9NjRLCi1EQVRBX1NJWkU9MzJLCi1FTUVNX1NJWkU9OE0KLUVJVF9TSVpFPTMyMAotVEVYVF9NRU1PUlk9dGV4dAotREFUQV9NRU1PUlk9ZGF0YQotQlNTX01FTU9SWT1kYXRhCi1URVhUX0RFRl9TRUNUSU9OPSIoeCkiCi1EQVRBX0RFRl9TRUNUSU9OPSIocncpIgotRU1FTV9ERUZfU0VDVElPTj0iIgotQVJDSD1kMzB2Ci1FTUJFRERFRD10CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2QzMHZlbGYuc2ggYi9sZC9lbXVscGFyYW1zL2QzMHZlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OWRlNzguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9kMzB2ZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZmQzMHYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWQzMHYiCi1URVhUX1NUQVJUX0FERFI9MHgwMDAwMDAwMAotREFUQV9TVEFSVF9BRERSPTB4MjAwMDAwMDAKLUVNRU1fU1RBUlRfQUREUj0weDgwMDAwMDAwCi1TVEFDS19TVEFSVF9BRERSPTB4MjAwMDgwMDAKLUVJVF9TVEFSVF9BRERSPTB4ZmZmZmYwMjAKLVRFWFRfU0laRT0yMDAwSwotREFUQV9TSVpFPTIwMDBLCi1FTUVNX1NJWkU9OE0KLUVJVF9TSVpFPTMyMAotVEVYVF9NRU1PUlk9dGV4dAotREFUQV9NRU1PUlk9ZGF0YQotQlNTX01FTU9SWT1kYXRhCi1URVhUX0RFRl9TRUNUSU9OPSIoeCkiCi1EQVRBX0RFRl9TRUNUSU9OPSIocncpIgotRU1FTV9ERUZfU0VDVElPTj0iIgotQVJDSD1kMzB2Ci1FTUJFRERFRD10CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2RlbHRhNjguc2ggYi9sZC9lbXVscGFyYW1zL2RlbHRhNjguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYzU5MDkuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9kZWx0YTY4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1kZWx0YTY4Ci1PVVRQVVRfRk9STUFUPSJjb2ZmLW02OGstc3lzdiIKLVRFWFRfU1RBUlRfQUREUj0weDIwMDAKLVBBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lYm1vbjI5ay5zaCBiL2xkL2VtdWxwYXJhbXMvZWJtb24yOWsuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzJiZDEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lYm1vbjI5ay5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWJtb24yOWsKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtYTI5ay1iaWciCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1hMjlrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyX2k5NjAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyX2k5NjAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWMzZmEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMl9pOTYwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWk5NjAiCi1BUkNIPWk5NjAKLU1BQ0hJTkU9Ci1URVhUX1NUQVJUX0FERFI9MAotRU1CRURERUQ9eWVzCi1NQVhQQUdFU0laRT0weDIwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGUyMzI2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXNwYXJjIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAwCi1BTElHTk1FTlQ9OAotQVJDSD1zcGFyYwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLURBVEFfUExUPQotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGY4ZDk4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHhhMDAyMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1FWEVDVVRBQkxFX1NZTUJPTFM9J19EWU5BTUlDX0xJTksgPSAwOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1EWU5BTUlDX0xJTks9ZmFsc2UKLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmJtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyYm1pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczYzQxMS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyYm1pcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1EQVRBX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKLVRFWFRfRFlOQU1JQz0KLUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJibWlwbjMyLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmJtaXBuMzIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU2ZjQyYTkuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmJtaXBuMzIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0jIFRoaXMgaXMgYW4gRUxGIHBsYXRmb3JtLgotU0NSSVBUX05BTUU9ZWxmCi0KLSMgSGFuZGxlIGJvdGggYmlnLSBhbmQgbGl0dGxlLWVuZGVkIDMyLWJpdCBNSVBTIG9iamVjdHMuCi1BUkNIPW1pcHMKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotCi1URU1QTEFURV9OQU1FPWVsZjMyCi0KLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAwMAotRU5UUlk9X19zdGFydAotCi0jIEdPVC1yZWxhdGVkIHNldHRpbmdzLiAgCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0gIC5zcmRhdGEgOiB7ICooLnNyZGF0YSkgfQotJwotCi0jIE1hZ2ljIHN5bWJvbHMuCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi0jIElSSVg2IGRlZmluZXMgdGhlc2Ugc3ltYm9scy4gIDB4MzQgaXMgdGhlIHNpemUgb2YgdGhlIEVMRiBoZWFkZXIuCi1FWEVDVVRBQkxFX1NZTUJPTFM9IgotICBfX2Rzb19kaXNwbGFjZW1lbnQgPSAwOwotICBfX2VsZl9oZWFkZXIgPSAke1RFWFRfU1RBUlRfQUREUn07Ci0gIF9fcHJvZ3JhbV9oZWFkZXJfdGFibGUgPSAke1RFWFRfU1RBUlRfQUREUn0gKyAweDM0OwotIgotCi0jIFRoZXJlIGFyZSBvZnRlbiBkeW5hbWljIHJlbG9jYXRpb25zIGFnYWluc3QgdGhlIC5yb2RhdGEgc2VjdGlvbi4KLSMgU2V0dGluZyBEVF9URVhUUkVMIGluIHRoZSAuZHluYW1pYyBzZWN0aW9uIGRvZXMgbm90IGNvbnZpbmNlIHRoZQotIyBJUklYNiBsaW5rZXIgdG8gcGVybWl0IHJlbG9jYXRpb25zIGFnYWluc3QgdGhlIHRleHQgc2VnbWVudC4KLSMgRm9sbG93aW5nIHRoZSBJUklYIGxpbmtlciwgd2Ugc2ltcGx5IHB1dCAucm9kYXRhIGluIHRoZSBkYXRhCi0jIHNlZ21lbnQuCi1XUklUQUJMRV9ST0RBVEE9Ci0KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9JwotICAuTUlQUy5ldmVudHMudGV4dCA6Ci0gICAgewotICAgICAgICooLk1JUFMuZXZlbnRzLnRleHQpCi0gICAgICAgKiguTUlQUy5ldmVudHMuZ251LmxpbmtvbmNlLnQqKQotICAgIH0KLSAgLk1JUFMuY29udGVudC50ZXh0IDogCi0gICAgewotICAgICAgICooLk1JUFMuY29udGVudC50ZXh0KQotICAgICAgICooLk1JUFMuY29udGVudC5nbnUubGlua29uY2UudCopCi0gICAgfQotICAuTUlQUy5ldmVudHMuZGF0YSA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmV2ZW50cy5kYXRhKQotICAgICAgICooLk1JUFMuZXZlbnRzLmdudS5saW5rb25jZS5kKikKLSAgICB9Ci0gIC5NSVBTLmNvbnRlbnQuZGF0YSA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQuZGF0YSkKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQuZ251LmxpbmtvbmNlLmQqKQotICAgIH0KLSAgLk1JUFMuZXZlbnRzLnJvZGF0YSA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmV2ZW50cy5yb2RhdGEpCi0gICAgICAgKiguTUlQUy5ldmVudHMuZ251LmxpbmtvbmNlLnIqKQotICAgIH0KLSAgLk1JUFMuY29udGVudC5yb2RhdGEgOiAKLSAgICB7Ci0gICAgICAgKiguTUlQUy5jb250ZW50LnJvZGF0YSkKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQuZ251LmxpbmtvbmNlLnIqKQotICAgIH0KLScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmMTMwNy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyYnNtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotREFUQV9BRERSPTB4MTAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1URVhUX0RZTkFNSUM9Ci1JTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTlRSWT1fX3N0YXJ0CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyZWJtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyZWJtaXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZWE4ZmQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMDA4YzguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyZnIzMC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYmUxZjUzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItZnIzMCIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwCi1BUkNIPWZyMzAKLU1BWFBBR0VTSVpFPTI1NgotRU5UUlk9X3N0YXJ0Ci1FTUJFRERFRD15ZXMKLU5PUD0weDlmYTAKLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9J1BST1ZJREUgKF9fc3RhY2sgPSAweDIwMDAwMCk7JwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwZGU4OC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMybDQzMDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4YTAwMjAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotRVhFQ1VUQUJMRV9TWU1CT0xTPSdfRFlOQU1JQ19MSU5LID0gMDsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRFlOQU1JQ19MSU5LPWZhbHNlCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJsbWlwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmxtaXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzEyZjQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmxtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotREFUQV9BRERSPTB4MTAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1URVhUX0RZTkFNSUM9Ci1JTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMybHBwYy5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGZmYzYxLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1TQ1JJUFRfTkFNRT1lbGZwcGMKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXBvd2VycGNsZSIKLVRFWFRfU1RBUlRfQUREUj0weDQwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1BUkNIPXBvd2VycGMKLU1BQ0hJTkU9CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMybHNtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMybHNtaXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZGM4YTEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmxzbWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLURBVEFfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1TSExJQl9URVhUX1NUQVJUX0FERFI9MHg1ZmZlMDAwMAotVEVYVF9EWU5BTUlDPQotSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRU5UUlk9X19zdGFydApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzY5ZTEyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJtY29yZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbWNvcmUtbGl0dGxlIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLW1jb3JlLWJpZyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1tY29yZS1saXR0bGUiCi1QQUdFX1NJWkU9MHgxMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4NDAwCi1NQVhQQUdFU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0wCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MAotQVJDSD1tY29yZQotRU1CRURERUQ9eWVzCi0KLSMgVGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIE5PUCB2YWx1ZSAtIGl0IG11c3Qgd29yayBmb3IgYm90aAotIyBiaWcgZW5kaWFuIGFuZCBsaXR0bGUgZW5kaWFuIHN5c3RlbXMuICBVbmZvcnR1bmF0ZWx5IHRoZXJlIGlzCi0jIG5vIHN5bW1ldHJpY2FsIG1jb3JlIG9wY29kZSB0aGF0IGZ1bmN0aW9ucyBhcyBhIG5vb3AuICBUaGUKLSMgY2hvc2VuIHNvbHV0aW9uIGlzIHRvIHVzZSAidHN0IHIwLCByMTQiLiAgVGhpcyBpcyBhIHN5bWV0cmljYWwKLSMgdmFsdWUsIGFuZCBhcGFydCBmcm9tIHRoZSBjb3JydXB0aW9uIG9mIHRoZSBDIGJpdCwgaXQgaGFzIG5vIG90aGVyCi0jIHNpZGUgZWZmZWN0cy4gIFNpbmNlIHRoZSBjYXJyeSBiaXQgaXMgbmV2ZXIgdGVzdGVkIHdpdGhvdXQgYmVpbmcKLSMgZXhwbGljaXRseSBzZXQgZmlyc3QsIGFuZCBzaW5jZSB0aGUgTk9QIGNvZGUgaXMgb25seSB1c2VkIGFzIGEKLSMgZmlsbCB2YWx1ZSBiZXR3ZWVuIGluZGVwZW5kYW50bHkgdmlhYmxlIHBlaWNlcyBvZiBjb2RlLCBpdCBzaG91bGQKLSMgbm90IG1hdHRlci4KLU5PUD0weDBlMGUKLQotT1RIRVJfQlNTX1NZTUJPTFM9Il9fYnNzX3N0YXJ0X18gPSAuIDsiCi1PVEhFUl9CU1NfRU5EX1NZTUJPTFM9Il9fYnNzX2VuZF9fID0gLiA7IgotCi0jIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0jIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoMl4xOSBieXRlcykuCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHg4MDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCi0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLQotIyBUaGlzIGNvZGUgZ2V0cyBpbnNlcnRlZCBpbnRvIHRoZSBnZW5lcmljIGVsZjMyLnNjIGxpbmtlciBzY3JpcHQKLSMgYW5kIGFsbG93cyB1cyB0byBkZWZpbmUgb3VyIG93biBjb21tYW5kIGxpbmUgc3dpdGNoZXMuCi1QQVJTRV9BTkRfTElTVF9BUkdTPScKLQotI2RlZmluZSBPUFRJT05fQkFTRV9GSUxFCQkzMDAKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9Ci17Ci0gIHsiYmFzZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX0ZJTEV9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19OwotCi1zdGF0aWMgdm9pZAotZ2xkX2VsZjMybWNvcmVfbGlzdF9vcHRpb25zIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWJhc2VfZmlsZSA8YmFzZWZpbGU+ICAgICAgR2VuZXJhdGUgYSBiYXNlIGZpbGUgZm9yIHJlbG9jYXRhYmxlIERMTHNcbiIpKTsKLX0KLQotc3RhdGljIGludAotZ2xkX2VsZjMybWNvcmVfcGFyc2VfYXJncyAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiogYXJndjsKLXsKLSAgaW50ICAgICAgICBsb25naW5kOwotICBpbnQgICAgICAgIG9wdGM7Ci0gIGludCAgICAgICAgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50ICAgICAgICBwcmV2b3B0ZXJyID0gb3B0ZXJyOwotICBpbnQgICAgICAgIHdhbnRlcnJvcjsKLSAgc3RhdGljIGludCBsYXN0b3B0aW5kID0gLTE7Ci0KLSAgaWYgKGxhc3RvcHRpbmQgIT0gb3B0aW5kKQotICAgIG9wdGVyciA9IDA7Ci0gIAotICB3YW50ZXJyb3IgID0gb3B0ZXJyOwotICBsYXN0b3B0aW5kID0gb3B0aW5kOwotCi0gIG9wdGMgICA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItIiwgbG9uZ29wdHMsICYgbG9uZ2luZCk7Ci0gIG9wdGVyciA9IHByZXZvcHRlcnI7Ci0KLSAgc3dpdGNoIChvcHRjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHdhbnRlcnJvcikKLQl4ZXhpdCAoMSk7Ci0gICAgICBvcHRpbmQgPSAgcHJldm9wdGluZDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBPUFRJT05fQkFTRV9GSUxFOgotICAgICAgbGlua19pbmZvLmJhc2VfZmlsZSA9IChQVFIpIGZvcGVuIChvcHRhcmcsIEZPUEVOX1dCKTsKLSAgICAgIGlmIChsaW5rX2luZm8uYmFzZV9maWxlID09IE5VTEwpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbm5vdCBvcGVuIGJhc2UgZmlsZSAlc1xuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgb3B0YXJnKTsKLQkgIHhleGl0ICgxKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gMTsKLX0KLQotJwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMnBwYy5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJwcGMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMzg4MGMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMnBwYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotU0NSSVBUX05BTUU9ZWxmcHBjCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1wb3dlcnBjIgotVEVYVF9TVEFSVF9BRERSPTB4MDE4MDAwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMDAKLUFSQ0g9cG93ZXJwYwotTUFDSElORT0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJwcGNsaW51eC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJwcGNsaW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5NmM3Yi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMycHBjbGludXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLVNDUklQVF9OQU1FPWVsZnBwYwotT1VUUFVUX0ZPUk1BVD0iZWxmMzItcG93ZXJwYyIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAwCi1BUkNIPXBvd2VycGMKLU1BQ0hJTkU9CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIGIvbGQvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFiMmU0Zi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1FTEZTSVpFPTY0Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1PVVRQVVRfRk9STUFUPSJlbGY2NC1zcGFyYyIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAwMAotQVJDSD0ic3BhcmM6djkiCi1NQUNISU5FPQotREFUQV9QTFQ9Ci1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1OT1A9MHgwMTAwMDAwMAotCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXTsgdGhlbgotICBjYXNlICIgJEVNVUxBVElPTl9MSUJQQVRIICIgaW4KLSAgICAqIiAke0VNVUxBVElPTl9OQU1FfSAiKikKLSAgICAgICMgTmF0aXZlLCBhbmQgZGVmYXVsdCBvciBlbXVsYXRpb24gcmVxdWVzdGluZyBMSUJfUEFUSC4KLQotICAgICAgIyBMaW51eCBhbmQgU29sYXJpcyBtb2RpZnkgdGhlIGRlZmF1bHQgbGlicmFyeSBzZWFyY2ggcGF0aAotICAgICAgIyB0byBmaXJzdCBpbmNsdWRlIGEgNjQtYml0IHNwZWNpZmljIGRpcmVjdG9yeS4gIEl0J3MgcHV0Ci0gICAgICAjIGluIHNsaWdodGx5IGRpZmZlcmVudCBwbGFjZXMgb24gdGhlIHR3byBzeXN0ZW1zLgotICAgICAgY2FzZSAiJHRhcmdldCIgaW4KLSAgICAgICAgc3BhcmMqLWxpbnV4KikKLSAgICAgICAgICBzdWZmaXg9NjQgOzsKLSAgICAgICAgc3BhcmMqLXNvbGFyaXMqKQotICAgICAgICAgIHN1ZmZpeD0vc3BhcmN2OSA7OwotICAgICAgZXNhYwotCi0gICAgICBpZiBbIC1uICIke3N1ZmZpeH0iIF07IHRoZW4KLQotCUxJQl9QQVRIPS9saWIke3N1ZmZpeH06L2xpYgotCUxJQl9QQVRIPSR7TElCX1BBVEh9Oi91c3IvbGliJHtzdWZmaXh9Oi91c3IvbGliCi0JaWYgWyAtbiAiJHtOQVRJVkVfTElCX0RJUlN9IiBdOyB0aGVuCi0JICBMSUJfUEFUSD0ke0xJQl9QQVRIfTpgZWNobyAke05BVElWRV9MSUJfRElSU30gfCBzZWQgcy86LyR7c3VmZml4fTovZ2Ake3N1ZmZpeH06JHtOQVRJVkVfTElCX0RJUlN9Ci0JZmkKLQlpZiBbICIke2xpYmRpcn0iICE9IC91c3IvbGliIF07IHRoZW4KLQkgIExJQl9QQVRIPSR7TElCX1BBVEh9OiR7bGliZGlyfSR7c3VmZml4fToke2xpYmRpcn0KLQlmaQotCWlmIFsgIiR7bGliZGlyfSIgIT0gL3Vzci9sb2NhbC9saWIgXTsgdGhlbgotCSAgTElCX1BBVEg9JHtMSUJfUEFUSH06L3Vzci9sb2NhbC9saWIke3N1ZmZpeH06L3Vzci9sb2NhbC9saWIKLQlmaQotCi0gICAgICBmaQotICAgIDs7Ci0gIGVzYWMKLWZpCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjY0YWxwaGEuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjY0YWxwaGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTIxZjIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGY2NGFscGhhLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotRU5UUlk9X19zdGFydAotU0NSSVBUX05BTUU9ZWxmCi1FTEZTSVpFPTY0Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1PVVRQVVRfRk9STUFUPSJlbGY2NC1hbHBoYSIKLVRFWFRfU1RBUlRfQUREUj0iMHgxMjAwMDAwMDAiCi1NQVhQQUdFU0laRT0weDEwMDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPSIweDEyMDAwMDAwMCIKLUFSQ0g9YWxwaGEKLU1BQ0hJTkU9Ci1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1EQVRBX1BMVD0KLU5PUD0weDQ3ZmYwNDFmCi0KLU9USEVSX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmNjRibWlwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGY2NGJtaXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0ODUyZDUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGY2NGJtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jIFRoaXMgaXMgYW4gRUxGIHBsYXRmb3JtLgotU0NSSVBUX05BTUU9ZWxmCi0KLSMgSGFuZGxlIGJvdGggYmlnLSBhbmQgbGl0dGxlLWVuZGVkIDMyLWJpdCBNSVBTIG9iamVjdHMuCi1BUkNIPW1pcHMKLU9VVFBVVF9GT1JNQVQ9ImVsZjY0LWJpZ21pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmNjQtYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGY2NC1saXR0bGVtaXBzIgotCi0jIE5vdGUgdGhhdCB0aGUgZWxmMzIgdGVtcGxhdGUgaXMgdXNlZCBmb3IgNjQtYml0IGVtdWxhdGlvbnMgYXMgd2VsbCAKLSMgYXMgMzItYml0IGVtdWxhdGlvbnMuCi1FTEZTSVpFPTY0Ci1URU1QTEFURV9OQU1FPWVsZjMyCi0KLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAwMAotRU5UUlk9X19zdGFydAotCi0jIEdPVC1yZWxhdGVkIHNldHRpbmdzLiAgCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0gIC5zcmRhdGEgOiB7ICooLnNyZGF0YSkgfQotJwotCi0jIE1hZ2ljIHN5bWJvbHMuCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi0jIElSSVg2IGRlZmluZXMgdGhlc2Ugc3ltYm9scy4gIDB4NDAgaXMgdGhlIHNpemUgb2YgdGhlIEVMRiBoZWFkZXIuCi1FWEVDVVRBQkxFX1NZTUJPTFM9IgotICBfX2Rzb19kaXNwbGFjZW1lbnQgPSAwOwotICBfX2VsZl9oZWFkZXIgPSAke1RFWFRfU1RBUlRfQUREUn07Ci0gIF9fcHJvZ3JhbV9oZWFkZXJfdGFibGUgPSAke1RFWFRfU1RBUlRfQUREUn0gKyAweDQwOwotIgotCi0jIFRoZXJlIGFyZSBvZnRlbiBkeW5hbWljIHJlbG9jYXRpb25zIGFnYWluc3QgdGhlIC5yb2RhdGEgc2VjdGlvbi4KLSMgU2V0dGluZyBEVF9URVhUUkVMIGluIHRoZSAuZHluYW1pYyBzZWN0aW9uIGRvZXMgbm90IGNvbnZpbmNlIHRoZQotIyBJUklYNiBsaW5rZXIgdG8gcGVybWl0IHJlbG9jYXRpb25zIGFnYWluc3QgdGhlIHRleHQgc2VnbWVudC4KLSMgRm9sbG93aW5nIHRoZSBJUklYIGxpbmtlciwgd2Ugc2ltcGx5IHB1dCAucm9kYXRhIGluIHRoZSBkYXRhCi0jIHNlZ21lbnQuCi1XUklUQUJMRV9ST0RBVEE9Ci0KLQotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nCi0gIC5NSVBTLmV2ZW50cy50ZXh0IDoKLSAgICB7Ci0gICAgICAgKiguTUlQUy5ldmVudHMudGV4dCkKLSAgICAgICAqKC5NSVBTLmV2ZW50cy5nbnUubGlua29uY2UudCopCi0gICAgfQotICAuTUlQUy5jb250ZW50LnRleHQgOiAKLSAgICB7Ci0gICAgICAgKiguTUlQUy5jb250ZW50LnRleHQpCi0gICAgICAgKiguTUlQUy5jb250ZW50LmdudS5saW5rb25jZS50KikKLSAgICB9Ci0gIC5NSVBTLmV2ZW50cy5kYXRhIDogCi0gICAgewotICAgICAgICooLk1JUFMuZXZlbnRzLmRhdGEpCi0gICAgICAgKiguTUlQUy5ldmVudHMuZ251LmxpbmtvbmNlLmQqKQotICAgIH0KLSAgLk1JUFMuY29udGVudC5kYXRhIDogCi0gICAgewotICAgICAgICooLk1JUFMuY29udGVudC5kYXRhKQotICAgICAgICooLk1JUFMuY29udGVudC5nbnUubGlua29uY2UuZCopCi0gICAgfQotICAuTUlQUy5ldmVudHMucm9kYXRhIDogCi0gICAgewotICAgICAgICooLk1JUFMuZXZlbnRzLnJvZGF0YSkKLSAgICAgICAqKC5NSVBTLmV2ZW50cy5nbnUubGlua29uY2UuciopCi0gICAgfQotICAuTUlQUy5jb250ZW50LnJvZGF0YSA6IAotICAgIHsKLSAgICAgICAqKC5NSVBTLmNvbnRlbnQucm9kYXRhKQotICAgICAgICooLk1JUFMuY29udGVudC5nbnUubGlua29uY2UuciopCi0gICAgfQotJwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGY2NGhwcGEuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjY0aHBwYS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODI5YWQ0My4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjY0aHBwYS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotRUxGU0laRT02NAotT1VUUFVUX0ZPUk1BVD0iZWxmNjQtaHBwYSIKLUxJQl9QQVRIPS91c3IvbGliL3BhMjBfNjQ6L29wdC9sYW5ndG9vbHMvbGliL3BhMjBfNjQKLVRFWFRfU1RBUlRfQUREUj0weDQwMDAwMDAwMDAwMDEwMDAKLURBVEFfQUREUj0weDgwMDAwMDAwMDAwMDEwMDAKLQotIyBUaGUgSFAgZHluYW1pYyBsaW5rZXIgYWN0dWFsbHkgcmVxdWlyZXMgeW91IHNldCB0aGUgc3RhcnQgb2YgdGV4dCBhbmQKLSMgZGF0YSB0byBzb21lIHJlYXNvbmFibGUgdmFsdWUuICBPZiBjb3Vyc2Ugbm9ib2R5IGtub3dzIHdoYXQgcmVhc29hbmJsZQotIyByZWFsbHkgaXMsIHNvIHdlIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlcyB0aGF0IEhQJ3MgbGlua2VyIHVzZXMuCi1TSExJQl9URVhUX1NUQVJUX0FERFI9MHg0MDAwMDAwMDAwMDAxMDAwCi1TSExJQl9EQVRBX0FERFI9MHg4MDAwMDAwMDAwMDAxMDAwCi0KLVRBUkdFVF9QQUdFX1NJWkU9NDA5NgotTUFYUEFHRVNJWkU9NDA5NgotQVJDSD1ocHBhCi1NQUNISU5FPWhwcGEyLjB3Ci1FTlRSWT0ibWFpbiIKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLSMgV2UgcmVhbGx5IHdhbnQgbXVsdGlwbGUgLnN0dWIgc2VjdGlvbnMsIG9uZSBmb3IgZWFjaCBpbnB1dCAudGV4dCBzZWN0aW9uLAotIyBidXQgZm9yIG5vdyB0aGlzIGlzIGdvb2QgZW5vdWdoLgotT1RIRVJfUkVBRE9OTFlfU0VDVElPTlM9Jy5QQVJJU0MudW53aW5kIDogeyAqKC5QQVJJU0MudW53aW5kKSB9ICcKLQotIyBUaGUgUEE2NCBFTEYgcG9ydCB0cmVhdHMgLnBsdCBzZWN0aW9ucyBkaWZmZXJlbnRseSB0aGFuIG1vc3QuICBXZSBhbHNvIGhhdmUKLSMgdG8gY3JlYXRlIGEgLm9wZCBzZWN0aW9uLiAgV2hhdCBtb3N0IHN5c3RlbXMgY2FsbCB0aGUgLmdvdCwgd2UgY2FsbCB0aGUgLmRsdAotT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TPScub3BkIDogeyAqKC5vcGQpIH0gUFJPVklERSAoX19ncCA9IC4pOyAucGx0IDogeyAqKC5wbHQpIH0gLmRsdCA6IHsgKiguZGx0KSB9JwotCi0jIFRoZSBQQTY0IEVMRiBwb3J0IGhhcyB0d28gYWRkaXRpb25hbCBic3Mgc2VjdGlvbnMuIGh1Z2UgYnNzIGFuZCB0aHJlYWQgYnNzLgotIyBNYWtlIHN1cmUgdGhleSBlbmQgdXAgaW4gdGhlIGFwcHJvcHJpYXRlIGxvY2F0aW9uLiAgV2UgYWxzbyBoYXZlIHRvIHNldAotIyBfX1RMU19TSVpFIHRvIHRoZSBzaXplIG9mIHRoZSB0aHJlYWQgYnNzIHNlY3Rpb24uCi1PVEhFUl9CU1NfU0VDVElPTlM9Jy5oYnNzIDogeyAqKC5oYnNzKSB9IC50YnNzIDogeyAqKC50YnNzKSB9JwotI09USEVSX0JTU19FTkRfU1lNQk9MUz0nUFJPVklERSAoX19UTFNfU0laRSA9IFNJWkVPRiAoLnRic3MpKTsnCi1PVEhFUl9CU1NfRU5EX1NZTUJPTFM9J1BST1ZJREUgKF9fVExTX1NJWkUgPSAwKTsnCi0KLSMgSFBzIHVzZSAuZGx0IHdoZXJlIHN5c3RlbXMgdXNlIC5nb3QuICBTaWdoLgotT1RIRVJfR09UX1JFTE9DX1NFQ1RJT05TPScucmVsYS5kbHQgOiB7ICooLnJlbGEuZGx0KSB9JwotCi0jIFdlJ3JlIG5vdCBhY3R1YWxseSBwcm92aWRpbmcgYSBzeW1ib2wgYW55bW9yZSAoZHVlIHRvIHRoZSBpbmFiaWxpdHkgdG8gYmUKLSMgc2FmZSBpbiByZWdhcmRzIHRvIHNoYXJlZCBsaWJyYXJpZXMpLiBTbyB3ZSBqdXN0IGFsbG9jYXRlIHRoZSBodW5rIG9mIHNwYWNlCi0jIHVuY29uZGl0aW9uYWxseSwgYnV0IGRvIG5vdCBtZXNzIGFyb3VuZCB3aXRoIHRoZSBzeW1ib2wgdGFibGUuCi1EQVRBX1NUQVJUX1NZTUJPTFM9Jy4gKz0gMTY7JwotCi0jIFRoZSBsaW5rZXIgaXMgcmVxdWlyZWQgdG8gZGVmaW5lIHRoZXNlIHR3byBzeW1ib2xzLgotRVhFQ1VUQUJMRV9TWU1CT0xTPSdQUk9WSURFIChfX1NZU1RFTV9JRCA9IDB4MjE0KTsgUFJPVklERSAoX0ZQVV9TVEFUVVMgPSAweDApOycKLURBVEFfUExUPQotCi0jIC5keW5hbWljIHNob3VsZCBiZSBhdCB0aGUgc3RhcnQgb2YgdGhlIC50ZXh0IHNlZ21lbnQuCi1URVhUX0RZTkFNSUM9Ci0KLSMgVGhlIFBBNjQgRUxGIHBvcnQgbmVlZHMgdHdvIGFkZGl0aW9uYWwgaW5pdGlhbGl6ZXIgc2VjdGlvbnMgYW5kIGFsc28gd2FudHMKLSMgYSBzdGFydC9lbmQgc3ltYm9sIHBhaXIgZm9yIHRoZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMuCi1JTklUX1NUQVJUPSdLRUVQICgqKC5IUC5pbml0KSk7IFBST1ZJREUgKF9fcHJlaW5pdF9zdGFydCA9IC4pOyBLRUVQICgqKC5wcmVpbml0KSk7IFBST1ZJREUgKF9fcHJlaW5pdF9lbmQgPSAuKTsgUFJPVklERSAoX19pbml0X3N0YXJ0ID0gLik7JwotSU5JVF9FTkQ9J1BST1ZJREUgKF9faW5pdF9lbmQgPSAuKTsnCi1GSU5JX1NUQVJUPSdQUk9WSURFIChfX2Zpbmlfc3RhcnQgPSAuKTsnCi1GSU5JX0VORD0nUFJPVklERSAoX19maW5pX2VuZCA9IC4pOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmX2kzODYuc2ggYi9sZC9lbXVscGFyYW1zL2VsZl9pMzg2LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmY1NjdiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmX2kzODYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHgwODA0ODAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwODA0ODAwMAotQVJDSD1pMzg2Ci1NQUNISU5FPQotTk9QPTB4OTA5MAotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGZfaTM4Nl9iZS5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NzdhMDYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGZfaTM4Nl9iZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItaTM4NiIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAwMDAwCi0jU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4ODAwMDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDgwMDAwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAKLUFSQ0g9aTM4NgotTUFDSElORT0KLU5PUD0weDkwOTAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZ2xkOTYwLnNoIGIvbGQvZW11bHBhcmFtcy9nbGQ5NjAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODFhNzguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9nbGQ5NjAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWk5NjAKLU9VVFBVVF9GT1JNQVQ9IiIKLVRFWFRfU1RBUlRfQUREUj0/PwotVEFSR0VUX1BBR0VfU0laRT0/PwotQVJDSD1pOTYwCi1URU1QTEFURV9OQU1FPWdsZDk2MAotR0xEX1NUWUxFPTEKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaCBiL2xkL2VtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyMDIyMC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2dsZDk2MGNvZmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1TQ1JJUFRfTkFNRT1pOTYwCi1PVVRQVVRfRk9STUFUPSIiCi1URVhUX1NUQVJUX0FERFI9Pz8KLVRBUkdFVF9QQUdFX1NJWkU9Pz8KLUFSQ0g9aTk2MAotVEVNUExBVEVfTkFNRT1nbGQ5NjBjCi1HTERfU1RZTEU9MQotQ09GRl9DVE9SUz0nCi0JX19fQ1RPUl9MSVNUX18gPSAuOwotCUxPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMikKLQkqKC5jdG9ycykKLQlMT05HKDApCi0JX19fQ1RPUl9FTkRfXyA9IC47Ci0JX19fRFRPUl9MSVNUX18gPSAuOwotCUxPTkcoKF9fX0RUT1JfRU5EX18gLSBfX19EVE9SX0xJU1RfXykgLyA0IC0gMikKLQkqKC5kdG9ycykKLQlMT05HKDApCi0JX19fRFRPUl9FTkRfXyA9IC47Ci0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4MzAwLnNoIGIvbGQvZW11bHBhcmFtcy9oODMwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllYjNjNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4MzAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODMwMAotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODMwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4MzAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4MzAwaC5zaCBiL2xkL2VtdWxwYXJhbXMvaDgzMDBoLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWI3OTRlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDgzMDBoLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODMwMGgKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDgzMDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODMwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODMwMHMuc2ggYi9sZC9lbXVscGFyYW1zL2g4MzAwcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3YjRmNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4MzAwcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDgzMDBzCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4MzAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDgzMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDAuc2ggYi9sZC9lbXVscGFyYW1zL2g4NTAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjRjYTgwLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDg1MDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4NTAwCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDBiLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMGIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZDNmZWUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODUwMGIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4NTAwYgotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODUwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4NTAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4NTAwYy5zaCBiL2xkL2VtdWxwYXJhbXMvaDg1MDBjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBhMDY1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDg1MDBjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODUwMGMKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDg1MDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODUwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODUwMG0uc2ggYi9sZC9lbXVscGFyYW1zL2g4NTAwbS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5ZjdiNi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4NTAwbS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDg1MDBtCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDBzLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTI5NGEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODUwMHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4NTAwcwotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODUwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4NTAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2hwMzAwYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9ocDMwMGJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1YzUwYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2hwMzAwYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1ocDMwMGJzZCIKLVRFWFRfU1RBUlRfQUREUj0wCi1UQVJHRVRfUEFHRV9TSVpFPTQwOTYKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9ocDNocHV4LnNoIGIvbGQvZW11bHBhcmFtcy9ocDNocHV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2JhZGQ4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaHAzaHB1eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaHAzMDBocHV4IgotVEVYVF9TVEFSVF9BRERSPTAKLVRBUkdFVF9QQUdFX1NJWkU9NDA5NgotQVJDSD1tNjhrCi1TVEFDS1pFUk89Il9fX3N0YWNrX3plcm8gPSAweDIwMDA7IF9fRFlOQU1JQyA9IDA7IgotIyBUaGlzIGlzIG5lZWRlZCBmb3IgSFBVWCA5LjA7IGl0IGlzIHVubmVjZXNzYXJ5IGJ1dCBoYXJtbGVzcyBmb3IgOC4wLgotU0hMSUJfUEFUSD0iX19fZGxkX3NobGliX3BhdGggPSAwOyIKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaHBwYWVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvaHBwYWVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiODllYS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2hwcGFlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWhwcGFlbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWhwcGEiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTQwOTYKLUFSQ0g9aHBwYQotU1RBUlQ9IiRTVEFSVCQiCi1URU1QTEFURV9OQU1FPWhwcGFlbGYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmFvdXQuc2ggYi9sZC9lbXVscGFyYW1zL2kzODZhb3V0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzllNTU0Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NmFvdXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWkzODYiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKLUFSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2YmVvcy5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2OWRhNWYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2YmVvcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQVJDSD1pMzg2Ci1TQ1JJUFRfTkFNRT1pMzg2YmVvcwotT1VUUFVUX0ZPUk1BVD0icGVpLWkzODYiCi1SRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0icGUtaTM4NiIKLVRFTVBMQVRFX05BTUU9YmVvcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2YnNkLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2YnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGMwZTJmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NmJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaTM4Ni1ic2QiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKLUFSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2Y29mZi5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NmNvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MTdiN2QuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2Y29mZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aTM4NmNvZmYKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaTM4NiIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmdvMzIuc2ggYi9sZC9lbXVscGFyYW1zL2kzODZnbzMyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWYxNmM0Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NmdvMzIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWkzODZnbzMyCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWdvMzIiCi1URVhUX1NUQVJUX0FERFI9MHgxMGE4Ci1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotU0VHTUVOVF9TSVpFPTB4MjAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwCi1BUkNIPWkzODYKLQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bGludXguc2ggYi9sZC9lbXVscGFyYW1zL2kzODZsaW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxNjQyMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZsaW51eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaTM4Ni1saW51eCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MAotQVJDSD1pMzg2Ci1URU1QTEFURV9OQU1FPWxpbnV4CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZseW54LnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2bHlueC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4YzE3NS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZseW54LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TQ1JJUFRfTkFNRT1pMzg2bHlueAotT1VUUFVUX0ZPUk1BVD0iY29mZi1pMzg2LWx5bngiCi0jIFRoaXMgaXMgd2hhdCBMeW54T1MgL2xpYi9pbml0MS5vIHdhbnRzLgotRU5UUlk9X21haW4KLSMgZm9sbG93aW5nIGFyZSBkdWJpb3VzCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKLUFSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bWFjaC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3Y2IyNzYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bWFjaC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbWFjaDMiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAyMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAKLVNFR01FTlRfU0laRT0weDEwMDAKLVBBRF9URVhUPXQKLUFSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bW9zcy5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTBlMDUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bW9zcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItaTM4NiIKLVRFWFRfU1RBUlRfQUREUj0weDAwMDAyMDAwCi1NQVhQQUdFU0laRT0weDEwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAwMDAyMDAwCi1BUkNIPWkzODYKLU1BQ0hJTkU9Ci1OT1A9MHg5MDkwCi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4Nm1zZG9zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzExZmExLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1zZG9zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1pMzg2bXNkb3MKLU9VVFBVVF9GT1JNQVQ9Im1zZG9zIgotVEVYVF9TVEFSVF9BRERSPTB4MAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MAotU0VHTUVOVF9TSVpFPTB4MTAKLVBBRF9URVhUPXQKLUFSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4Nm5ic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTZhMzguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bmJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaTM4Ni1uZXRic2QiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1pMzg2Ci1FWEVDVVRBQkxFX1NZTUJPTFM9J19fRFlOQU1JQyA9IDA7JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bncuc2ggYi9sZC9lbXVscGFyYW1zL2kzODZudy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwZWQ2Ny4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZudy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotU0NSSVBUX05BTUU9bncKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHgwODAwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwODAwMDAwMAotQVJDSD1pMzg2Ci1OT1A9MHg5MDkwCi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZwZS5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NnBlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGFkZDIzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NnBlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1BUkNIPWkzODYKLVNDUklQVF9OQU1FPXBlCi1PVVRQVVRfRk9STUFUPSJwZWktaTM4NiIKLVJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUPSJwZS1pMzg2IgotVEVNUExBVEVfTkFNRT1wZQotRU5UUlk9Il9tYWluQ1JUU3RhcnR1cCIKLVNVQlNZU1RFTT1QRV9ERUZfU1VCU1lTVEVNCi1JTklUSUFMX1NZTUJPTF9DSEFSPVwiX1wiCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZwZV9wb3NpeC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NnBlX3Bvc2l4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2Y1MWI1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NnBlX3Bvc2l4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BUkNIPWkzODYKLVNDUklQVF9OQU1FPXBlCi1PVVRQVVRfRk9STUFUPSJwZWktaTM4NiIKLVJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUPSJwZS1pMzg2IgotVEVNUExBVEVfTkFNRT1wZQotRU5UUlk9Il9fX1Bvc2l4UHJvY2Vzc1N0YXJ0dXAiCi1TVUJTWVNURU09NwotRVhFQ1VUQUJMRV9OQU1FPWEub3V0Ci1JTklUSUFMX1NZTUJPTF9DSEFSPVwiX1wiCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2xuazk2MC5zaCBiL2xkL2VtdWxwYXJhbXMvbG5rOTYwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2YzZmM0Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbG5rOTYwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1pOTYwCi1PVVRQVVRfRk9STUFUPSIiCi1URVhUX1NUQVJUX0FERFI9Pz8KLVRBUkdFVF9QQUdFX1NJWkU9Pz8KLUFSQ0g9aTk2MAotVEVNUExBVEVfTkFNRT1sbms5NjAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTMycmVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvbTMycmVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3NzA1YS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL20zMnJlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmCi1URU1QTEFURV9OQU1FPWVsZjMyCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1tMzJyIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwCi1BUkNIPW0zMnIKLU1BQ0hJTkU9Ci1NQVhQQUdFU0laRT0zMgotRU1CRURERUQ9eWVzCi0KLSMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSMgdG9wIG9mIHNpbXVsYXRvciBtZW1vcnkgKDhNQikuCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPSdQUk9WSURFIChfc3RhY2sgPSAweDgwMDAwMCk7JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmMyNGMwZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGs0a25ic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW02OGs0ay1uZXRic2QiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1tNjhrCi1FWEVDVVRBQkxFX1NZTUJPTFM9J19fRFlOQU1JQyA9IDA7JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrYW91dC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZmFhZjcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrYW91dC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtemVyby1iaWciCi1URVhUX1NUQVJUX0FERFI9MHgyMDIwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MjAwMAotU0VHTUVOVF9TSVpFPTB4MjAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrYXV4LnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrYXV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWU4NmNjLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a2F1eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9bTY4a2F1eAotT1VUUFVUX0ZPUk1BVD0iY29mZi1tNjhrLWF1eCIKLVNFR01FTlRfU0laRT0weDQwMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPSIkU0VHTUVOVF9TSVpFICsgU0laRU9GX0hFQURFUlMiCi1OT05fUEFHRURfVEVYVF9TVEFSVF9BRERSPVNJWkVPRl9IRUFERVJTCi1EQVRBX0FMSUdOTUVOVF89IiguICYgKC0kU0VHTUVOVF9TSVpFIHwgJFRBUkdFVF9QQUdFX1NJWkUtMSkpICsgJFNFR01FTlRfU0laRSIKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrY29mZi5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTdjMGQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrY29mZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9bTY4a2NvZmYKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtbTY4ayIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2VsZi5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2VsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzNTJjNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGtlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLW02OGsiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotTUFYUEFHRVNJWkU9MHgyMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9JHtURVhUX1NUQVJUX0FERFJ9Ci1BUkNIPW02OGsKLU1BQ0hJTkU9Ci1OT1A9MHg0ZTc1Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGtsaW51eC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2xpbnV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmMzZGFkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a2xpbnV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1tNjhrLWxpbnV4IgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0wCi1BUkNIPW02OGsKLVRFTVBMQVRFX05BTUU9bGludXgKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2x5bnguc2ggYi9sZC9lbXVscGFyYW1zL202OGtseW54LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDIwZmViLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a2x5bnguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPW02OGtseW54Ci1PVVRQVVRfRk9STUFUPSJjb2ZmLW02OGstbHlueCIKLSMgVGhpcyBpcyB3aGF0IEx5bnhPUyAvbGliL2luaXQxLm8gd2FudHMuCi1FTlRSWT1fX21haW4KLSMgZm9sbG93aW5nIGFyZSBkdWJpb3VzCi1URVhUX1NUQVJUX0FERFI9MAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrbmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a25ic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NDI4MDcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrbmJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotVEVYVF9TVEFSVF9BRERSPTB4MjAyMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MjAwMAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbTY4ay1uZXRic2QiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MjAwMAotQVJDSD1tNjhrCi1FWEVDVVRBQkxFX1NZTUJPTFM9J19fRFlOQU1JQyA9IDA7JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrcHNvcy5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZWI4Y2EuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrcHNvcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9cHNvcwotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbTY4ayIKLVRFWFRfU1RBUlRfQUREUj0weDIwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAKLUFSQ0g9bTY4awotVEVNUExBVEVfTkFNRT1lbGYzMgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tODhrYmNzLnNoIGIvbGQvZW11bHBhcmFtcy9tODhrYmNzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzY3MzdjLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTg4a2Jjcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9bTg4a2JjcwotT1VUUFVUX0ZPUk1BVD0iY29mZi1tODhrYmNzIgotVEVYVF9TVEFSVF9BRERSPT8/Ci1UQVJHRVRfUEFHRV9TSVpFPT8/Ci1BUkNIPW04OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWNvcmVwZS5zaCBiL2xkL2VtdWxwYXJhbXMvbWNvcmVwZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxOWUwMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21jb3JlcGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUFSQ0g9bWNvcmUKLVNDUklQVF9OQU1FPW1jb3JlcGUKLU9VVFBVVF9GT1JNQVQ9InBlaS1tY29yZS1saXR0bGUiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0icGVpLW1jb3JlLWxpdHRsZSIKLUJJR19PVVRQVVRfRk9STUFUPSJwZWktbWNvcmUtYmlnIgotVEVNUExBVEVfTkFNRT1wZQotRU5UUlk9Il9tYWluQ1JUU3RhcnR1cCIKLVNVQlNZU1RFTT1QRV9ERUZfU1VCU1lTVEVNCi1JTklUSUFMX1NZTUJPTF9DSEFSPVwiX1wiCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNiaWcuc2ggYi9sZC9lbXVscGFyYW1zL21pcHNiaWcuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTI5NTMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzYmlnLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1taXBzCi1PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW1pcHMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2JzZC5zaCBiL2xkL2VtdWxwYXJhbXMvbWlwc2JzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmYjM1Yi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21pcHNic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPW1pcHNic2QKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW1pcHMtbGl0dGxlIgotQklHX09VVFBVVF9GT1JNQVQ9ImEub3V0LW1pcHMtYmlnIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImEub3V0LW1pcHMtbGl0dGxlIgotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotVEFSR0VUX1BBR0VfU0laRT00MDk2Ci1BUkNIPW1pcHMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2lkdC5zaCBiL2xkL2VtdWxwYXJhbXMvbWlwc2lkdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxNzZmNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21pcHNpZHQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1taXBzCi1PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW1pcHMKLUVOVFJZPXN0YXJ0Ci1URVhUX1NUQVJUX0FERFI9MHhhMDAxMjAwMAotREFUQV9BRERSPS4KLVRFTVBMQVRFX05BTUU9bWlwc2Vjb2ZmCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2lkdGwuc2ggYi9sZC9lbXVscGFyYW1zL21pcHNpZHRsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjI3OWRlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbWlwc2lkdGwuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1taXBzCi1PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW1pcHMKLUVOVFJZPXN0YXJ0Ci1URVhUX1NUQVJUX0FERFI9MHhhMDAxMjAwMAotREFUQV9BRERSPS4KLVRFTVBMQVRFX05BTUU9bWlwc2Vjb2ZmCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2xpdC5zaCBiL2xkL2VtdWxwYXJhbXMvbWlwc2xpdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiMjM0NC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21pcHNsaXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPW1pcHMKLU9VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9bWlwcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9taXBzbG5ld3Muc2ggYi9sZC9lbXVscGFyYW1zL21pcHNsbmV3cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiYjkxYy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21pcHNsbmV3cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotU0NSSVBUX05BTUU9bWlwcwotT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1taXBzCi1URVhUX1NUQVJUX0FERFI9MHg4MDA4MDAwMAotREFUQV9BRERSPS4KLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tbjEwMjAwLnNoIGIvbGQvZW11bHBhcmFtcy9tbjEwMjAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzI0MzIyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbW4xMDIwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLW1uMTAyMDAiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1BUkNIPW1uMTAyMDAKLU1BQ0hJTkU9Ci1NQVhQQUdFU0laRT0xCi1FTlRSWT1fc3RhcnQKLUVNQkVEREVEPXllcwotCi0jIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0jIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoMl4xOSBieXRlcykuCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHg4MDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCi0KLSMgVGhlc2UgYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIENPRkYgdG9vbGNoYWluLgotIyBYWFggVGhlc2Ugc2hvdWxkIGRlZmluaXRlbHkgZGlzYXBwZWFyLgotQ1RPUl9TVEFSVD0nX19fY3RvcnMgPSAuOycKLUNUT1JfRU5EPSdfX19jdG9yc19lbmQgPSAuOycKLURUT1JfU1RBUlQ9J19fX2R0b3JzID0gLjsnCi1EVE9SX0VORD0nX19fZHRvcnNfZW5kID0gLjsnCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21uMTAzMDAuc2ggYi9sZC9lbXVscGFyYW1zL21uMTAzMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTQwZTUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tbjEwMzAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbW4xMDMwMCIKLVRFWFRfU1RBUlRfQUREUj0weDAKLUFSQ0g9bW4xMDMwMAotTUFDSElORT0KLU1BWFBBR0VTSVpFPTEKLUVOVFJZPV9zdGFydAotRU1CRURERUQ9eWVzCi0KLSMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSMgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5ICgyXjE5IGJ5dGVzKS4KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDgwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKLQotIyBUaGVzZSBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQ09GRiB0b29sY2hhaW4uCi0jIFhYWCBUaGVzZSBzaG91bGQgZGVmaW5pdGVseSBkaXNhcHBlYXIuCi1DVE9SX1NUQVJUPSdfX19jdG9ycyA9IC47JwotQ1RPUl9FTkQ9J19fX2N0b3JzX2VuZCA9IC47JwotRFRPUl9TVEFSVD0nX19fZHRvcnMgPSAuOycKLURUT1JfRU5EPSdfX19kdG9yc19lbmQgPSAuOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbmV3cy5zaCBiL2xkL2VtdWxwYXJhbXMvbmV3cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwZGRmOS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL25ld3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW5ld3NvczMiCi1URVhUX1NUQVJUX0FERFI9MAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9uczMya25ic2Quc2ggYi9sZC9lbXVscGFyYW1zL25zMzJrbmJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0ZmRmMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL25zMzJrbmJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbnMzMmstbmV0YnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9bnMzMmsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcGM1MzJtYWNoYS5zaCBiL2xkL2VtdWxwYXJhbXMvcGM1MzJtYWNoYS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxZDA3OS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3BjNTMybWFjaGEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXBjNTMyLW1hY2giCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPSIweDEwMDIwIgotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAKLUFSQ0g9bnMzMmsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcGplbGYuc2ggYi9sZC9lbXVscGFyYW1zL3BqZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2ZkMmIzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvcGplbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItcGoiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAKLUFSQ0g9cGoKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcGpsZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9wamxlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OTU4ZmQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9wamxlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItcGpsIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1BUkNIPXBqCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3BwY21hY29zLnNoIGIvbGQvZW11bHBhcmFtcy9wcGNtYWNvcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiODAwYy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3BwY21hY29zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1URU1QTEFURV9OQU1FPWFpeAotU0NSSVBUX05BTUU9YWl4Ci1PVVRQVVRfRk9STUFUPSJ4Y29mZi1wb3dlcm1hYyIKLUFSQ0g9cG93ZXJwYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9wcGNudy5zaCBiL2xkL2VtdWxwYXJhbXMvcHBjbncuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZWFkNDMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9wcGNudy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9bncKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXBvd2VycGMiCi1URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1EQVRBX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotQVJDSD1wb3dlcnBjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3BwY3BlLnNoIGIvbGQvZW11bHBhcmFtcy9wcGNwZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkMDllZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3BwY3BlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1BUkNIPXBvd2VycGMKLVNDUklQVF9OQU1FPXBwY3BlCi1PVVRQVVRfRk9STUFUPSJwZWktcG93ZXJwY2xlIgotVEVNUExBVEVfTkFNRT1wZQotRU5UUlk9Il9tYWluQ1JUU3RhcnR1cCIKLVNVQlNZU1RFTT1QRV9ERUZfU1VCU1lTVEVNCi1JTklUSUFMX1NZTUJPTF9DSEFSPVwiX1wiCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3Jpc2NpeC5zaCBiL2xkL2VtdWxwYXJhbXMvcmlzY2l4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Y2ZDkyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvcmlzY2l4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1yaXNjaXgKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXJpc2NpeCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MHg4MDAwCi1BUkNIPWFybQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zYTI5MjAwLnNoIGIvbGQvZW11bHBhcmFtcy9zYTI5MjAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjUyZjkyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc2EyOTIwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9c2EyOTIwMAotT1VUUFVUX0ZPUk1BVD0iY29mZi1hMjlrLWJpZyIKLVRFWFRfU1RBUlRfQUREUj0weDQwMDA0MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1hMjlrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NoLnNoIGIvbGQvZW11bHBhcmFtcy9zaC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4NDRmYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NoLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1zaAotT1VUUFVUX0ZPUk1BVD0iY29mZi1zaCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPXNoCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NoZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9zaGVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVkYjU4Ny4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NoZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1zaCIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAKLU1BWFBBR0VTSVpFPTEyOAotQVJDSD1zaAotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLUVNQkVEREVEPXllcwotCi0jIFRoZXNlIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBDT0ZGIHRvb2xjaGFpbi4KLUVOVFJZPXN0YXJ0Ci1DVE9SX1NUQVJUPSdfX19jdG9ycyA9IC47JwotQ1RPUl9FTkQ9J19fX2N0b3JzX2VuZCA9IC47JwotRFRPUl9TVEFSVD0nX19fZHRvcnMgPSAuOycKLURUT1JfRU5EPSdfX19kdG9yc19lbmQgPSAuOycKLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDMwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc2hsLnNoIGIvbGQvZW11bHBhcmFtcy9zaGwuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MGFhYzguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zaGwuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXNoCi1PVVRQVVRfRk9STUFUPSJjb2ZmLXNobCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPXNoCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NobGVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvc2hsZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjI3Zjg2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc2hsZWxmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1zaGwiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1NQVhQQUdFU0laRT0xMjgKLUFSQ0g9c2gKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTUJFRERFRD15ZXMKLQotIyBUaGVzZSBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQ09GRiB0b29sY2hhaW4uCi1FTlRSWT1zdGFydAotQ1RPUl9TVEFSVD0nX19fY3RvcnMgPSAuOycKLUNUT1JfRU5EPSdfX19jdG9yc19lbmQgPSAuOycKLURUT1JfU1RBUlQ9J19fX2R0b3JzID0gLjsnCi1EVE9SX0VORD0nX19fZHRvcnNfZW5kID0gLjsnCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHgzMDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NwYXJjYW91dC5zaCBiL2xkL2VtdWxwYXJhbXMvc3BhcmNhb3V0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjliOTI1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3BhcmNhb3V0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1zdW5vcy1iaWciCi1CSUdfT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3Vub3MtYmlnIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImEub3V0LXNwYXJjLWxpdHRsZSIKLVRFWFRfU1RBUlRfQUREUj0weDIwMjAKLVRBUkdFVF9QQUdFX1NJWkU9MHgyMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgyMDAwCi1BUkNIPXNwYXJjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NwYXJjbGludXguc2ggYi9sZC9lbXVscGFyYW1zL3NwYXJjbGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjY2IwYmVjLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3BhcmMtbGludXgiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTAKLUFSQ0g9c3BhcmMKLVRFTVBMQVRFX05BTUU9bGludXgKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3BhcmNseW54LnNoIGIvbGQvZW11bHBhcmFtcy9zcGFyY2x5bnguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZWIzMGIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zcGFyY2x5bnguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVNDUklQVF9OQU1FPXNwYXJjbHlueAotT1VUUFVUX0ZPUk1BVD0iY29mZi1zcGFyYy1seW54IgotIyBUaGlzIGlzIHdoYXQgTHlueE9TIC9saWIvaW5pdDEubyB3YW50cy4KLUVOVFJZPV9fbWFpbgotIyBmb2xsb3dpbmcgYXJlIGR1YmlvdXMKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotQVJDSD1zcGFyYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zcGFyY25ic2Quc2ggYi9sZC9lbXVscGFyYW1zL3NwYXJjbmJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3ZGFmMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NwYXJjbmJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3BhcmMtbmV0YnNkIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9c3BhcmMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3QyMDAwLnNoIGIvbGQvZW11bHBhcmFtcy9zdDIwMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTg4MzIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zdDIwMDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXN0MjAwMAotT1VUUFVUX0ZPUk1BVD0iY29mZi1tNjhrIgotVEVYVF9TVEFSVF9BRERSPTB4MAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zdW4zLnNoIGIvbGQvZW11bHBhcmFtcy9zdW4zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBmNzFmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3VuMy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3Vub3MtYmlnIgotVEVYVF9TVEFSVF9BRERSPTB4MjAyMAotVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKLVNFR01FTlRfU0laRT0weDIwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgyMDAwCi1BUkNIPW02OGsKLVRFTVBMQVRFX05BTUU9c3Vub3MKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3VuNC5zaCBiL2xkL2VtdWxwYXJhbXMvc3VuNC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0Mjc3NS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3N1bjQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXN1bm9zLWJpZyIKLVRFWFRfU1RBUlRfQUREUj0weDIwMjAKLVRBUkdFVF9QQUdFX1NJWkU9MHgyMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgyMDAwCi1BTElHTk1FTlQ9OAotQVJDSD1zcGFyYwotVEVNUExBVEVfTkFNRT1zdW5vcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy90aWMzMGFvdXQuc2ggYi9sZC9lbXVscGFyYW1zL3RpYzMwYW91dC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0YzEzZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3RpYzMwYW91dC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9dGljMzBhb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC10aWMzMCIKLU9VVFBVVF9BUkNIPSJ0bXMzMjBjMzAiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD10bXMzMjBjMzAKLUJJRz0xCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3RpYzMwY29mZi5zaCBiL2xkL2VtdWxwYXJhbXMvdGljMzBjb2ZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjc3OTQzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdGljMzBjb2ZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT10aWMzMGNvZmYKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtdGljMzAiCi1PVVRQVVRfQVJDSD0idG1zMzIwYzMwIgotVEVYVF9TVEFSVF9BRERSPTB4MAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9dG1zMzIwYzMwCi1CSUc9MQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy90aWM4MGNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL3RpYzgwY29mZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3MDMyMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3RpYzgwY29mZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMgVGhpcyBmaWxlIGlzIHNvdXJjZWQgYnkgdGhlIGdlbnNjcmlwdHMuc2ggc2NyaXB0LgotIyBUaGVzZSBhcmUgc2hlbGwgdmFyaWFibGVzIHRoYXQgYXJlIHVzZWQgbGF0ZXIgYnkgZWl0aGVyIGdlbnNjcmlwdHMKLSMgb3Igb24gb2YgdGhlIHNjcmlwdHMgdGhhdCBpdCBzb3VyY2VzLgotCi0jIFRoZSBuYW1lIG9mIHRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQgdG8gdXNlLiAgSW4gdGhpcyBjYXNlLCBnZW5zY3JpcHRzCi0jIHVzZXMgc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjCi0jCi1TQ1JJUFRfTkFNRT10aWM4MGNvZmYKLQotIyBUaGUgbmFtZSBvZiB0aGUgZW11bHRlbXBsIHNjcmlwdCB0byB1c2UuICBJZiBzZXQgdG8gInRlbXBsYXRlIiB0aGVuCi0jIGdlbnNjcmlwdHMuc2ggd2lsbCB1c2UgdGhlIHNjcmlwdCBlbXVsdGVtcGwvdGVtcGxhdGUuZW0uICBJZiBub3Qgc2V0LAotIyB0aGVuIHRoZSBkZWZhdWx0IHZhbHVlIGlzICJnZW5lcmljIi4KLSMKLSMgVEVNUExBVEVfTkFNRT0KLQotIyBJZiB0aGlzIGlzIHNldCB0byBhbiBub25lbXB0eSBzdHJpbmcsIGdlbnNjcmlwdHMuc2ggd2lsbCBpbnZva2UgdGhlCi0jIHNjcmlwdHRlbXBsIHNjcmlwdCBhbiBleHRyYSB0aW1lIHRvIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IHNjcmlwdC4KLSMKLSMgR0VORVJBVEVfU0hMSUJfU0NSSVBUPQotCi0jIFRoZSBCRkQgb3V0cHV0IGZvcm1hdCB0byB1c2UuICBUaGUgc2NyaXB0dGVtcGwgc2NyaXB0IHdpbGwgdXNlIGl0IGluCi0jIGFuIE9VVFBVVF9GT1JNQVQgZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KLSMKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtdGljODAiCi0KLSMgVGhpcyBpcyBub3JtYWxseSBzZXQgdG8gaW5kaWNhdGUgdGhlIGFyY2hpdGVjdHVyZSB0byB1c2UsIHN1Y2ggYXMKLSMgInNwYXJjIi4gIFRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQgd2lsbCBub3JtYWxseSB1c2UgaXQgaW4gYW4gT1VUUFVUX0FSQ0gKLSMgZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KLSMKLUFSQ0g9dGljODAKLQotIyBTb21lIHNjcmlwdHRlbXBsIHNjcmlwdHMgdXNlIHRoaXMgdG8gc2V0IHRoZSBlbnRyeSBhZGRyZXNzIGluIGFuIEVOVFJZCi0jIGV4cHJlc3Npb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0jCi0jIEVOVFJZPQotCi0jIFRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQgdXNlcyB0aGlzIHRvIHNldCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUKLSMgIi50ZXh0IiBzZWN0aW9uLgotIwotVEVYVF9TVEFSVF9BRERSPTB4MjAwMDAwMAotCi0jIElmIHRoaXMgaXMgZGVmaW5lZCwgdGhlIGdlbnNjcmlwdHMuc2ggc2NyaXB0IHNldHMgVEVYVF9TVEFSVF9BRERSIHRvCi0jIGl0cyB2YWx1ZSBiZWZvcmUgcnVubmluZyB0aGUgc2NyaXB0dGVtcGwgc2NyaXB0IGZvciB0aGUgLW4gYW5kIC1OCi0jIG9wdGlvbnMuCi0jCi0jIE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0KLQotIyBUaGUgZ2Vuc2NyaXB0cy5zaCBzY3JpcHQgdXNlcyB0aGlzIHRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAKLSMgREFUQV9BTElHTk1FTlQgd2hlbiBydW5uaW5nIHRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQuCi0jCi0jIFNFR01FTlRfU0laRT0KLQotIyBJZiBTRUdNRU5UX1NJWkUgaXMgbm90IGRlZmluZWQsIHRoZSBnZW5zY3JpcHRzLnNoIHNjcmlwdCB1c2VzIHRoaXMKLSMgdG8gZGVmaW5lIGl0LgotIwotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdjg1MC5zaCBiL2xkL2VtdWxwYXJhbXMvdjg1MC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiZmJkMy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3Y4NTAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9djg1MAotT1VUUFVUX0ZPUk1BVD0iZWxmMzItdjg1MCIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMAotWkRBVEFfU1RBUlRfQUREUj0weDE2MAotUk9aREFUQV9TVEFSVF9BRERSPSJBTElHTiAoNCkiCi1TREFUQV9TVEFSVF9BRERSPSJBTElHTiAoNCkiCi1ST1NEQVRBX1NUQVJUX0FERFI9IkFMSUdOICg0KSIKLVREQVRBX1NUQVJUX0FERFI9IkFMSUdOICg0KSIKLUNBTExfVEFCTEVfU1RBUlRfQUREUj0iQUxJR04gKDQpIgotQVJDSD12ODUwCi1NQVhQQUdFU0laRT0yNTYKLUVOVFJZPV9zdGFydAotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3ZhbmlsbGEuc2ggYi9sZC9lbXVscGFyYW1zL3ZhbmlsbGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTNiNzIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy92YW5pbGxhLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT12YW5pbGxhCi1URVhUX1NUQVJUX0FERFI9Pz8KLVRBUkdFVF9QQUdFX1NJWkU9Pz8KLUFSQ0g9dW5rbm93bgotVEVNUExBVEVfTkFNRT12YW5pbGxhCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3ZheC5zaCBiL2xkL2VtdWxwYXJhbXMvdmF4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg1NDgzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdmF4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dCIKLVRFWFRfU1RBUlRfQUREUj0wCi1UQVJHRVRfUEFHRV9TSVpFPTEwMjQKLUFSQ0g9dmF4CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3ZzdGEuc2ggYi9sZC9lbXVscGFyYW1zL3ZzdGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjI0OWIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy92c3RhLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1pMzg2IgotVEVYVF9TVEFSVF9BRERSPTB4MTAyMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVNFR01FTlRfU0laRT0weDQwMDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MAotQVJDSD1pMzg2Ci0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdzY1LnNoIGIvbGQvZW11bHBhcmFtcy93NjUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDJiMjMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy93NjUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXc2NQotT1VUUFVUX0ZPUk1BVD0iY29mZi13NjUiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTY0Ci1BUkNIPXc2NQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy96ODAwMS5zaCBiL2xkL2VtdWxwYXJhbXMvejgwMDEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjQ1YzMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy96ODAwMS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9ejgwMDAKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtejhrIgotT1VUUFVUX0FSQ0g9Ino4MDAxIgotVEVYVF9TVEFSVF9BRERSPTB4MAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9ejhrCi1CSUc9MQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy96ODAwMi5zaCBiL2xkL2VtdWxwYXJhbXMvejgwMDIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OWI1ZjUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy96ODAwMi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9ejgwMDAKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtejhrIgotT1VUUFVUX0FSQ0g9Ino4MDAyIgotVEVYVF9TVEFSVF9BRERSPTB4MAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9ejgwMDIKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9SRUFETUUgYi9sZC9lbXVsdGVtcGwvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGVjMGFiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgc291cmNlZCBieSBnZW5zY3JpcHRzLnNoLCBhZnRlcgotc2V0dGluZyBzb21lIHZhcmlhYmxlcyB0byBzdWJzdGl0dXRlIGluLCB0byBwcm9kdWNlCi1DIHNvdXJjZSBmaWxlcyB0aGF0IGNvbnRhaW4ganVtcCB0YWJsZXMgZm9yIGVhY2ggZW11bGF0aW9uLgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2FpeC5lbSBiL2xkL2VtdWx0ZW1wbC9haXguZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDhhZjAuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2FpeC5lbQorKysgL2Rldi9udWxsCkBAIC0xLDEwNTQgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBBSVggZW11bGF0aW9uIGNvZGUgZm9yICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgotICAgQUlYIHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+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+dHJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT51bmFyeS5jaGlsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICAwLAkvKiBmaW5pc2ggKi8KLSAgMCwJLyogY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKi8KLSAgMCwJLyogb3Blbl9keW5hbWljX2FyY2hpdmUgKi8KLSAgMCwJLyogcGxhY2Vfb3JwaGFuICovCi0gIDAsCS8qIHNldF9zeW1ib2xzICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3VucmVjb2duaXplZF9maWxlCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYXJtY29mZi5lbSBiL2xkL2VtdWx0ZW1wbC9hcm1jb2ZmLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI3OWQ0Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9hcm1jb2ZmLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogZW11bGF0ZSB0aGUgb3JpZ2luYWwgZ2xkIGZvciB0aGUgZ2l2ZW4gJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLXN0YXRpYyBpbnQgIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucyBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIElmIHRydWUsIHRoZW4gaW50ZXJ3b3JraW5nIHN0dWJzIHdoaWNoIHN1cHBvcnQgY2FsbHMgdG8gb2xkLCBub24taW50ZXJ3b3JraW5nCi0gICBhd2FyZSBBUk0gY29kZSBzaG91bGQgYmUgZ2VuZXJhdGVkLiAgKi8KLQotc3RhdGljIGludCBzdXBwb3J0X29sZF9jb2RlID0gMDsKLXN0YXRpYyBjaGFyICogdGh1bWJfZW50cnlfc3ltYm9sID0gTlVMTDsKLQotI2RlZmluZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERQkJMzAwCi0jZGVmaW5lIE9QVElPTl9USFVNQl9FTlRSWQkJMzAxCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQotewotICB7InN1cHBvcnQtb2xkLWNvZGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NVUFBPUlRfT0xEX0NPREV9LAotICB7InRodW1iLWVudHJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9USFVNQl9FTlRSWX0sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc3VwcG9ydC1vbGQtY29kZSAgIFN1cHBvcnQgaW50ZXJ3b3JraW5nIHdpdGggb2xkIGNvZGVcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLXRodW1iLWVudHJ5PTxzeW0+ICBTZXQgdGhlIGVudHJ5IHBvaW50IHRvIGJlIFRodW1iIHN5bWJvbCA8c3ltPlxuIikpOwotfQotCi1zdGF0aWMgaW50Ci1nbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgICAgIGFyZ2M7Ci0gICAgIGNoYXIgKiogYXJndjsKLXsKLSAgaW50ICAgICAgICBsb25naW5kOwotICBpbnQgICAgICAgIG9wdGM7Ci0gIGludCAgICAgICAgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50ICAgICAgICBwcmV2b3B0ZXJyID0gb3B0ZXJyOwotICBpbnQgICAgICAgIHdhbnRlcnJvcjsKLSAgc3RhdGljIGludCBsYXN0b3B0aW5kID0gLTE7Ci0KLSAgaWYgKGxhc3RvcHRpbmQgIT0gb3B0aW5kKQotICAgIG9wdGVyciA9IDA7Ci0gIAotICB3YW50ZXJyb3IgID0gb3B0ZXJyOwotICBsYXN0b3B0aW5kID0gb3B0aW5kOwotCi0gIG9wdGMgICA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItIiwgbG9uZ29wdHMsICYgbG9uZ2luZCk7Ci0gIG9wdGVyciA9IHByZXZvcHRlcnI7Ci0KLSAgc3dpdGNoIChvcHRjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHdhbnRlcnJvcikKLQl4ZXhpdCAoMSk7Ci0gICAgICBvcHRpbmQgPSAgcHJldm9wdGluZDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERToKLSAgICAgIHN1cHBvcnRfb2xkX2NvZGUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9USFVNQl9FTlRSWToKLSAgICAgIHRodW1iX2VudHJ5X3N5bWJvbCA9IG9wdGFyZzsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIHJldHVybiAxOwotfQotDAotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSAoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfc2V0X291dHB1dF9hcmNoICgiYGVjaG8gJHtBUkNIfWAiKTsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIC8qIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJ3b3JraW5nIHN0dWIgc2VjdGlvbiAqLwotCi0gIC8qIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgZ2x1ZSBpbmZvcm1hdGlvbiAqLwotICAvKiBGSVhNRTogc2hvdWxkIHRoaXMgYmUgYmFzZWQgb24gYSBjb21tYW5kIGxpbmUgb3B0aW9uPyBrcmtAY3lnbnVzLmNvbSAqLwotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmICghIGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotCSAgICAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvLCBzdXBwb3J0X29sZF9jb2RlKSkKLQkgIHsKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgZWluZm8gKF8oIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMiKSwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKCYgbGlua19pbmZvKTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgaWYgKHN0cnN0ciAoYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpLCAiYXJtIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgYXJtIGJhY2tlbmQgbmVlZHMgc3BlY2lhbCBmaWVsZHMgaW4gdGhlIG91dHB1dCBoYXNoIHN0cnVjdHVyZS4KLQkgVGhlc2Ugd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgdGhlIG91dHB1dCBmb3JtYXQgaXMgYW4gYXJtIGZvcm1hdCwKLQkgaGVuY2Ugd2UgZG8gbm90IHN1cHBvcnQgbGlua2luZyBhbmQgY2hhbmdpbmcgb3V0cHV0IGZvcm1hdHMgYXQgdGhlCi0JIHNhbWUgdGltZS4gIFVzZSBhIGxpbmsgZm9sbG93ZWQgYnkgb2JqY29weSB0byBjaGFuZ2Ugb3V0cHV0IGZvcm1hdHMuICAqLwotICAgICAgZWluZm8gKCIlRiVYJVA6IGVycm9yOiBjYW5ub3QgY2hhbmdlIG91dHB1dCBmb3JtYXQgd2hpbHN0IGxpbmtpbmcgQVJNIGJpbmFyaWVzXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmIChiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvKSkKLQkgIGJyZWFrOwotICAgICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5pc2ggUEFSQU1TKCh2b2lkKSkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCi0gIGlmICh0aHVtYl9lbnRyeV9zeW1ib2wgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIAotICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCB0aHVtYl9lbnRyeV9zeW1ib2wsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLSAgICAgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBjaGFyIGJ1ZmZlclszMl07Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIAotICAgICAgLyogU3BlY2lhbCBwcm9jZXNpbmcgaXMgcmVxdWlyZWQgZm9yIGEgVGh1bWIgZW50cnkgc3ltYm9sLiAgVGhlCi0JIGJvdHRvbSBiaXQgb2YgaXRzIGFkZHJlc3MgbXVzdCBiZSBzZXQuICAqLwotICAgICAgdmFsID0gKGgtPnUuZGVmLnZhbHVlCi0JICAgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsCi0JCQkJICAgIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotCSAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIAotICAgICAgdmFsIHw9IDE7Ci0KLSAgICAgIC8qIE5vdyBjb252ZXJ0IHRoaXMgdmFsdWUgaW50byBhIHN0cmluZyBhbmQgc3RvcmUgaXQgaW4gZW50cnlfc3ltYm9sCi0gICAgICAgICB3aGVyZSB0aGUgbGFuZ19maW5pc2goKSBmdW5jdGlvbiB3aWxsIHBpY2sgaXQgdXAuICAqLwotICAgICAgYnVmZmVyWzBdID0gJzAnOwotICAgICAgYnVmZmVyWzFdID0gJ3gnOwotICAgICAgCi0gICAgICBzcHJpbnRmX3ZtYSAoYnVmZmVyICsgMiwgdmFsKTsKLQotICAgICAgaWYgKGVudHJ5X3N5bWJvbCAhPSBOVUxMICYmIGVudHJ5X2Zyb21fY21kbGluZSkKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6ICctLXRodW1iLWVudHJ5ICVzJyBpcyBvdmVycmlkaW5nICctZSAlcydcbiIpLAotCSAgICAgICB0aHVtYl9lbnRyeV9zeW1ib2wsIGVudHJ5X3N5bWJvbCk7Ci0gICAgICBlbnRyeV9zeW1ib2wgPSBidWZmZXI7Ci0gICAgfQotICBlbHNlCi0gICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjb25ub3QgZmluZCB0aHVtYiBzdGFydCBzeW1ib2wgJXNcbiIpLCB0aHVtYl9lbnRyeV9zeW1ib2wpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIE5VTEwsIC8qIHBsYWNlIG9ycGhhbiAqLwotICBOVUxMLCAvKiBzZXRfc3ltYm9scyAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzLAotICBOVUxMLCAvKiB1bnJlY29nbmlzZWQgZmlsZSAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9hcm1lbGYuZW0gYi9sZC9lbXVsdGVtcGwvYXJtZWxmLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2ExYjNjLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9hcm1lbGYuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjkxICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLUVMRlNJWkU9MzIKLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogZW11bGF0ZSB0aGUgb3JpZ2luYWwgZ2xkIGZvciB0aGUgZ2l2ZW4gJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotCi1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHNlYXJjaF9kaXJzX3R5cGUgKiwgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjawotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbgotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotc3RhdGljIGludCAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyBQQVJBTVMoKGludCwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLQotDAotc3RhdGljIGludCBub19waXBlbGluZV9rbm93bGVkZ2UgPSAwOwotc3RhdGljIGNoYXIgKiB0aHVtYl9lbnRyeV9zeW1ib2wgPSBOVUxMOwotCi0jZGVmaW5lIE9QVElPTl9USFVNQl9FTlRSWQkJMzAxCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQotewotICB7ICJuby1waXBlbGluZS1rbm93bGVkZ2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ3AnfSwKLSAgeyAidGh1bWItZW50cnkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RIVU1CX0VOVFJZfSwKLSAgeyBOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMCB9Ci19OwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtcCAtLW5vLXBpcGVsaW5lLWtub3dsZWRnZSAgU3RvcCB0aGUgbGlua2VyIGtub3dpbmcgYWJvdXQgdGhlIHBpcGVsaW5lIGxlbmd0aFxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgIC0tdGh1bWItZW50cnk9PHN5bT4gICAgICBTZXQgdGhlIGVudHJ5IHBvaW50IHRvIGJlIFRodW1iIHN5bWJvbCA8c3ltPlxuIikpOwotfQotCi1zdGF0aWMgaW50Ci1nbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgICAgIGFyZ2M7Ci0gICAgIGNoYXIgKiogYXJndjsKLXsKLSAgaW50ICAgICAgICBsb25naW5kOwotICBpbnQgICAgICAgIG9wdGM7Ci0gIGludCAgICAgICAgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50ICAgICAgICBwcmV2b3B0ZXJyID0gb3B0ZXJyOwotICBpbnQgICAgICAgIHdhbnRlcnJvcjsKLSAgc3RhdGljIGludCBsYXN0b3B0aW5kID0gLTE7Ci0KLSAgaWYgKGxhc3RvcHRpbmQgIT0gb3B0aW5kKQotICAgIG9wdGVyciA9IDA7Ci0gIAotICB3YW50ZXJyb3IgID0gb3B0ZXJyOwotICBsYXN0b3B0aW5kID0gb3B0aW5kOwotCi0gIG9wdGMgICA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItcCIsIGxvbmdvcHRzLCAmIGxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh3YW50ZXJyb3IpCi0JeGV4aXQgKDEpOwotICAgICAgb3B0aW5kID0gIHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgJ3AnOgotICAgICAgbm9fcGlwZWxpbmVfa25vd2xlZGdlID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fVEhVTUJfRU5UUlk6Ci0gICAgICB0aHVtYl9lbnRyeV9zeW1ib2wgPSBvcHRhcmc7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gMTsKLX0KLQwKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSAoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfc2V0X291dHB1dF9hcmNoICgiYGVjaG8gJHtBUkNIfWAiKTsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotICBjb25maWcuZHluYW1pY19saW5rID0gJHtEWU5BTUlDX0xJTkstdHJ1ZX07Ci0gIGNvbmZpZy5oYXNfc2hhcmVkID0gYGlmIHRlc3QgLW4gIiRHRU5FUkFURV9TSExJQl9TQ1JJUFQiIDsgdGhlbiBlY2hvIHRydWUgOyBlbHNlIGVjaG8gZmFsc2UgOyBmaWA7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIGEgZHluYW1pYyBhcmNoaXZlLiAgVGhpcyBpcyB3aGVyZSB3ZSBrbm93IHRoYXQgRUxGCi0gICBkeW5hbWljIGxpYnJhcmllcyBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuc28uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBjaGFyICpzdHJpbmc7Ci0KLSAgaWYgKCEgZW50cnktPmlzX2FyY2hpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGVuYW1lID0gZW50cnktPmZpbGVuYW1lOwotCi0gIHN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKQotCQkJICAgICArIHN0cmxlbiAoZmlsZW5hbWUpCi0JCQkgICAgICsgc3RybGVuIChhcmNoKQotCQkJICAgICArIHNpemVvZiAiL2xpYi5zbyIpOwotCi0gIHNwcmludGYgKHN0cmluZywgIiVzL2xpYiVzJXMuc28iLCBzZWFyY2gtPm5hbWUsIGZpbGVuYW1lLCBhcmNoKTsKLQotICBpZiAoISBsZGZpbGVfdHJ5X29wZW5fYmZkIChzdHJpbmcsIGVudHJ5KSkKLSAgICB7Ci0gICAgICBmcmVlIChzdHJpbmcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlbnRyeS0+ZmlsZW5hbWUgPSBzdHJpbmc7Ci0KLSAgLyogV2UgaGF2ZSBmb3VuZCBhIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgaW4gdGhlIGxpbmsuICBUaGUgRUxGCi0gICAgIGJhY2tlbmQgbGlua2VyIHdpbGwgY3JlYXRlIGEgRFRfTkVFREVEIGVudHJ5IGluIHRoZSAuZHluYW1pYwotICAgICBzZWN0aW9uIG5hbWluZyB0aGlzIGZpbGUuICBJZiB0aGlzIGZpbGUgaW5jbHVkZXMgYSBEVF9TT05BTUUKLSAgICAgZW50cnksIGl0IHdpbGwgYmUgdXNlZC4gIE90aGVyd2lzZSwgdGhlIEVMRiBsaW5rZXIgd2lsbCBqdXN0IHVzZQotICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gIEZvciBhbiBhcmNoaXZlIGZvdW5kIGJ5IHNlYXJjaGluZywgbGlrZQotICAgICB0aGlzIG9uZSwgdGhlIERUX05FRURFRCBlbnRyeSBzaG91bGQgY29uc2lzdCBvZiBqdXN0IHRoZSBuYW1lIG9mCi0gICAgIHRoZSBmaWxlLCB3aXRob3V0IHRoZSBwYXRoIGluZm9ybWF0aW9uIHVzZWQgdG8gZmluZCBpdC4gIE5vdGUKLSAgICAgdGhhdCB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpZiB3ZSBoYXZlIGEgZHluYW1pYyBvYmplY3Q7IGFuCi0gICAgIGFyY2hpdmUgd2lsbCBuZXZlciBiZSByZWZlcmVuY2VkIGJ5IGEgRFRfTkVFREVEIGVudHJ5LgotCi0gICAgIEZJWE1FOiBUaGlzIGFwcHJvYWNoLS11c2luZyBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZS0taXMgbm90Ci0gICAgIHZlcnkgcHJldHR5LiAgSSBoYXZlbid0IGJlZW4gYWJsZSB0byB0aGluayBvZiBhbnl0aGluZyB0aGF0IGlzCi0gICAgIHByZXR0eSwgdGhvdWdoLiAgKi8KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGVudHJ5LT50aGVfYmZkLCBiZmRfb2JqZWN0KQotICAgICAgJiYgKGVudHJ5LT50aGVfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgY2hhciAqbmVlZGVkX25hbWU7Ci0KLSAgICAgIEFTU0VSVCAoZW50cnktPmlzX2FyY2hpdmUgJiYgZW50cnktPnNlYXJjaF9kaXJzX2ZsYWcpOwotICAgICAgbmVlZGVkX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGZpbGVuYW1lKQotCQkJCSAgICAgICsgc3RybGVuIChhcmNoKQotCQkJCSAgICAgICsgc2l6ZW9mICJsaWIuc28iKTsKLSAgICAgIHNwcmludGYgKG5lZWRlZF9uYW1lLCAibGliJXMlcy5zbyIsIGZpbGVuYW1lLCBhcmNoKTsKLSAgICAgIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChlbnRyeS0+dGhlX2JmZCwgbmVlZGVkX25hbWUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgY2FzZSAiICR7RU1VTEFUSU9OX0xJQlBBVEh9ICIgaW4KLSAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi0vKiBGb3IgYSBuYXRpdmUgbGlua2VyLCBjaGVjayB0aGUgZmlsZSAvZXRjL2xkLnNvLmNvbmYgZm9yIGRpcmVjdG9yaWVzCi0gICBpbiB3aGljaCB3ZSBtYXkgZmluZCBzaGFyZWQgbGlicmFyaWVzLiAgL2V0Yy9sZC5zby5jb25mIGlzIHJlYWxseQotICAgb25seSBtZWFuaW5nZnVsIG9uIExpbnV4LCBidXQgd2UgY2hlY2sgaXQgb24gb3RoZXIgc3lzdGVtcyBhbnlob3cuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mIChuYW1lLCBmb3JjZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZvcmNlOwotewotICBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZDsKLSAgc3RhdGljIGNoYXIgKmxkX3NvX2NvbmY7Ci0KLSAgaWYgKCEgaW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgRklMRSAqZjsKLQotICAgICAgZiA9IGZvcGVuICgiL2V0Yy9sZC5zby5jb25mIiwgRk9QRU5fUlQpOwotICAgICAgaWYgKGYgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpiOwotCSAgc2l6ZV90IGxlbiwgYWxsb2M7Ci0JICBpbnQgYzsKLQotCSAgbGVuID0gMDsKLQkgIGFsbG9jID0gMTAwOwotCSAgYiA9IChjaGFyICopIHhtYWxsb2MgKGFsbG9jKTsKLQotCSAgd2hpbGUgKChjID0gZ2V0YyAoZikpICE9IEVPRikKLQkgICAgewotCSAgICAgIGlmIChsZW4gKyAxID49IGFsbG9jKQotCQl7Ci0JCSAgYWxsb2MgKj0gMjsKLQkJICBiID0gKGNoYXIgKikgeHJlYWxsb2MgKGIsIGFsbG9jKTsKLQkJfQotCSAgICAgIGlmIChjICE9ICc6JwotCQkgICYmIGMgIT0gJyAnCi0JCSAgJiYgYyAhPSAnXHQnCi0JCSAgJiYgYyAhPSAnXG4nCi0JCSAgJiYgYyAhPSAnLCcpCi0JCXsKLQkJICBiW2xlbl0gPSBjOwotCQkgICsrbGVuOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGxlbiA+IDAgJiYgYltsZW4gLSAxXSAhPSAnOicpCi0JCSAgICB7Ci0JCSAgICAgIGJbbGVuXSA9ICc6JzsKLQkJICAgICAgKytsZW47Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAobGVuID4gMCAmJiBiW2xlbiAtIDFdID09ICc6JykKLQkgICAgLS1sZW47Ci0KLQkgIGlmIChsZW4gPiAwKQotCSAgICBiW2xlbl0gPSAnXDAnOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnJlZSAoYik7Ci0JICAgICAgYiA9IE5VTEw7Ci0JICAgIH0KLQotCSAgZmNsb3NlIChmKTsKLQotCSAgbGRfc29fY29uZiA9IGI7Ci0JfQotCi0gICAgICBpbml0aWFsaXplZCA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChsZF9zb19jb25mID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsZF9zb19jb25mLCBuYW1lLCBmb3JjZSk7Ci19Ci0KLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotLyogVGhlc2UgdmFyaWFibGVzIGFyZSByZXF1aXJlZCB0byBwYXNzIGluZm9ybWF0aW9uIGJhY2sgYW5kIGZvcnRoCi0gICBiZXR3ZWVuIGFmdGVyX29wZW4gYW5kIGNoZWNrX25lZWRlZCBhbmQgc3RhdF9uZWVkZWQgYW5kIHZlcmNoZWNrLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX25lZWRlZDsKLXN0YXRpYyBzdHJ1Y3Qgc3RhdCBnbG9iYWxfc3RhdDsKLXN0YXRpYyBib29sZWFuIGdsb2JhbF9mb3VuZDsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmdsb2JhbF92ZXJjaGVja19uZWVkZWQ7Ci1zdGF0aWMgYm9vbGVhbiBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZCwgKmw7Ci0KLSAgaWYgKHN0cnN0ciAoYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpLCAiYXJtIikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgYXJtIGJhY2tlbmQgbmVlZHMgc3BlY2lhbCBmaWVsZHMgaW4gdGhlIG91dHB1dCBoYXNoIHN0cnVjdHVyZS4KLQkgVGhlc2Ugd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgdGhlIG91dHB1dCBmb3JtYXQgaXMgYW4gYXJtIGZvcm1hdCwKLQkgaGVuY2Ugd2UgZG8gbm90IHN1cHBvcnQgbGlua2luZyBhbmQgY2hhbmdpbmcgb3V0cHV0IGZvcm1hdHMgYXQgdGhlCi0JIHNhbWUgdGltZS4gIFVzZSBhIGxpbmsgZm9sbG93ZWQgYnkgb2JqY29weSB0byBjaGFuZ2Ugb3V0cHV0IGZvcm1hdHMuICAqLwotICAgICAgZWluZm8gKCIlRiVYJVA6IGVycm9yOiBjYW5ub3QgY2hhbmdlIG91dHB1dCBmb3JtYXQgd2hpbHN0IGxpbmtpbmcgQVJNIGJpbmFyaWVzXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQkvKiBUaGUgaW50ZXJ3b3JraW5nIGJmZCBtdXN0IGJlIHRoZSBsYXN0IG9uZSB0byBiZSBwcm9jZXNzZWQgKi8KLQlpZiAoIWlzLT5uZXh0KQotCSAgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbyk7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyB3aGVuIGRvaW5nIGEgZmluYWwgbGluay4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdldCB0aGUgbGlzdCBvZiBmaWxlcyB3aGljaCBhcHBlYXIgaW4gRFRfTkVFREVEIGVudHJpZXMgaW4KLSAgICAgZHluYW1pYyBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBsaW5rIChvZnRlbiB0aGVyZSB3aWxsIGJlIG5vbmUpLgotICAgICBGb3IgZWFjaCBzdWNoIGZpbGUsIHdlIHdhbnQgdG8gdHJhY2sgZG93biB0aGUgY29ycmVzcG9uZGluZwotICAgICBsaWJyYXJ5LCBhbmQgaW5jbHVkZSB0aGUgc3ltYm9sIHRhYmxlIGluIHRoZSBsaW5rLiAgVGhpcyBpcyB3aGF0Ci0gICAgIHRoZSBydW50aW1lIGR5bmFtaWMgbGlua2VyIHdpbGwgZG8uICBUcmFja2luZyB0aGUgZmlsZXMgZG93biBoZXJlCi0gICAgIHBlcm1pdHMgb25lIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgYW5vdGhlciB3aXRob3V0IHJlcXVpcmluZwotICAgICBzcGVjaWFsIGFjdGlvbiBieSB0aGUgcGVyc29uIGRvaW5nIHRoZSBsaW5rLiAgTm90ZSB0aGF0IHRoZQotICAgICBuZWVkZWQgbGlzdCBjYW4gYWN0dWFsbHkgZ3JvdyB3aGlsZSB3ZSBhcmUgc3RlcHBpbmcgdGhyb3VnaCB0aGlzCi0gICAgIGxvb3AuICAqLwotICBuZWVkZWQgPSBiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmxsOwotICAgICAgaW50IGZvcmNlOwotCi0gICAgICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBmaWxlLCBza2lwIGl0LiAgKi8KLSAgICAgIGZvciAobGwgPSBuZWVkZWQ7IGxsICE9IGw7IGxsID0gbGwtPm5leHQpCi0JaWYgKHN0cmNtcCAobGwtPm5hbWUsIGwtPm5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIGlmIChsbCAhPSBsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmaWxlIHdhcyBpbmNsdWRlZCBpbiB0aGUgbGluayBleHBsaWNpdGx5LiAgKi8KLSAgICAgIGdsb2JhbF9uZWVkZWQgPSBsOwotICAgICAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk7Ci0gICAgICBpZiAoZ2xvYmFsX2ZvdW5kKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBuZWVkIHRvIGZpbmQgdGhpcyBmaWxlIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUuICBXZQotCSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlIGR5bmFtaWMKLQkgbGlua2VyIHdpbGwgc2VhcmNoLiAgVGhhdCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gdXNlCi0JIHJwYXRoX2xpbmssIHJwYXRoLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotCSBMRF9MSUJSQVJZX1BBVEggKG5hdGl2ZSBvbmx5KSwgdGhlbiB0aGUgbGlua2VyIHNjcmlwdAotCSBMSUJfU0VBUkNIX0RJUlMuICBXZSBkbyBub3Qgc2VhcmNoIHVzaW5nIHRoZSAtTCBhcmd1bWVudHMuCi0KLQkgV2Ugc2VhcmNoIHR3aWNlLiAgVGhlIGZpcnN0IHRpbWUsIHdlIHNraXAgb2JqZWN0cyB3aGljaCBtYXkKLQkgaW50cm9kdWNlIHZlcnNpb24gbWlzbWF0Y2hlcy4gIFRoZSBzZWNvbmQgdGltZSwgd2UgZm9yY2UKLQkgdGhlaXIgdXNlLiAgU2VlIGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrIGNvbW1lbnQuICAqLwotICAgICAgZm9yIChmb3JjZSA9IDA7IGZvcmNlIDwgMjsgZm9yY2UrKykKLQl7Ci0JICBjb25zdCBjaGFyICpsaWJfcGF0aDsKLQkgIHNpemVfdCBsZW47Ci0JICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGhfbGluaywKLQkJCQkJCSAgbC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGgsCi0JCQkJCQkgIGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci0JICBpZiAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPT0gTlVMTAotCSAgICAgICYmIGNvbW1hbmRfbGluZS5ycGF0aCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbGliX3BhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9SVU5fUEFUSCIpOwotCSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbC0+bmFtZSwKLQkJCQkJCSAgICAgIGZvcmNlKSkKLQkJYnJlYWs7Ci0JICAgIH0KLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIGxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfTElCUkFSWV9QQVRIIik7Ci0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAobGliX3BhdGgsIGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci1FT0YKLSAgOzsKLSAgZXNhYwotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JICBsZW4gPSBzdHJsZW4gKGwtPm5hbWUpOwotCSAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQkgICAgewotCSAgICAgIGNoYXIgKmZpbGVuYW1lOwotCi0JICAgICAgaWYgKHNlYXJjaC0+Y21kbGluZSkKLQkJY29udGludWU7Ci0JICAgICAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkgKyBsZW4gKyAyKTsKLQkgICAgICBzcHJpbnRmIChmaWxlbmFtZSwgIiVzLyVzIiwgc2VhcmNoLT5uYW1lLCBsLT5uYW1lKTsKLQkgICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZmlsZW5hbWUsIGZvcmNlKSkKLQkJYnJlYWs7Ci0JICAgICAgZnJlZSAoZmlsZW5hbWUpOwotCSAgICB9Ci0JICBpZiAoc2VhcmNoICE9IE5VTEwpCi0JICAgIGJyZWFrOwotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgY2FzZSAiICR7RU1VTEFUSU9OX0xJQlBBVEh9ICIgaW4KLSAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYgKGwtPm5hbWUsIGZvcmNlKSkKLQkgICAgYnJlYWs7Ci1FT0YKLSAgOzsKLSAgZXNhYwotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JfQotCi0gICAgICBpZiAoZm9yY2UgPCAyKQotCWNvbnRpbnVlOwotCi0gICAgICBlaW5mbyAoIiVQOiB3YXJuaW5nOiAlcywgbmVlZGVkIGJ5ICVCLCBub3QgZm91bmQgKHRyeSB1c2luZyAtLXJwYXRoKVxuIiwKLQkgICAgIGwtPm5hbWUsIGwtPmJ5KTsKLSAgICB9Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBuZWVkZWQgZmlsZSBpbiBhIHBhdGguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAocGF0aCwgbmFtZSwgZm9yY2UpCi0gICAgIGNvbnN0IGNoYXIgKnBhdGg7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBmb3JjZTsKLXsKLSAgY29uc3QgY2hhciAqczsKLSAgc2l6ZV90IGxlbjsKLQotICBpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICBsZW4gPSBzdHJsZW4gKG5hbWUpOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlbmFtZSwgKnNzZXQ7Ci0KLSAgICAgIHMgPSBzdHJjaHIgKHBhdGgsICc6Jyk7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXMgPSBwYXRoICsgc3RybGVuIChwYXRoKTsKLQotICAgICAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzIC0gcGF0aCArIGxlbiArIDIpOwotICAgICAgaWYgKHMgPT0gcGF0aCkKLQlzc2V0ID0gZmlsZW5hbWU7Ci0gICAgICBlbHNlCi0JewotCSAgbWVtY3B5IChmaWxlbmFtZSwgcGF0aCwgcyAtIHBhdGgpOwotCSAgZmlsZW5hbWVbcyAtIHBhdGhdID0gJy8nOwotCSAgc3NldCA9IGZpbGVuYW1lICsgKHMgLSBwYXRoKSArIDE7Ci0JfQotICAgICAgc3RyY3B5IChzc2V0LCBuYW1lKTsKLQotICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKGZpbGVuYW1lLCBmb3JjZSkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGZyZWUgKGZpbGVuYW1lKTsKLQotICAgICAgaWYgKCpzID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICBwYXRoID0gcyArIDE7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsJICAKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggcG9zc2libGUgbmFtZSBmb3IgYSBkeW5hbWljIG9iamVjdAotICAgbmFtZWQgYnkgYSBEVF9ORUVERUQgZW50cnkuICBUaGUgRk9SQ0UgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyCi0gICB0byBza2lwIHRoZSBjaGVjayBmb3IgYSBjb25mbGljdGluZyB2ZXJzaW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKG5hbWUsIGZvcmNlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgZm9yY2U7Ci17Ci0gIGJmZCAqYWJmZDsKLQotICBhYmZkID0gYmZkX29wZW5yIChuYW1lLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgb2JqZWN0IHdvdWxkIGluY2x1ZGUgYW55IGNvbmZsaWN0aW5nIGxpYnJhcnkKLSAgICAgdmVyc2lvbnMuICBJZiBGT1JDRSBpcyBzZXQsIHRoZW4gd2Ugc2tpcCB0aGlzIGNoZWNrOyB3ZSB1c2UgdGhpcwotICAgICB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kLCBpZiB3ZSBjb3VsZG4ndCBmaW5kIGFueSBjb21wYXRpYmxlCi0gICAgIGluc3RhbmNlIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0KLSAgaWYgKCEgZm9yY2UpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQ7Ci0KLSAgICAgIGlmICghIGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCAoYWJmZCwgJm5lZWRlZCkpCi0JZWluZm8gKCIlRiVQOiVCOiBiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QgZmFpbGVkOiAlRVxuIiwgYWJmZCk7Ci0KLSAgICAgIGlmIChuZWVkZWQgIT0gTlVMTCkKLQl7Ci0JICBnbG9iYWxfdmVyY2hlY2tfbmVlZGVkID0gbmVlZGVkOwotCSAgZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCA9IGZhbHNlOwotCSAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjayk7Ci0JICBpZiAoZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCkKLQkgICAgewotCSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotCSAgICAgIC8qIFJldHVybiBmYWxzZSB0byBmb3JjZSB0aGUgY2FsbGVyIHRvIG1vdmUgb24gdG8gdHJ5Ci0gICAgICAgICAgICAgICAgIGFub3RoZXIgZmlsZSBvbiB0aGUgc2VhcmNoIHBhdGguICAqLwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBCdXQgd2FpdCEgIEl0IGdldHMgbXVjaCB3b3JzZS4gIE9uIExpbnV4LCBpZiBhIHNoYXJlZAotICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3QgdXNlIGxpYmMgYXQgYWxsLCB3ZSBhcmUgc3VwcG9zZWQgdG8gc2tpcAotICAgICAgICAgICAgIGl0IHRoZSBmaXJzdCB0aW1lIGFyb3VuZCBpbiBjYXNlIHdlIGVuY291bnRlciBhIHNoYXJlZAotICAgICAgICAgICAgIGxpYnJhcnkgbGF0ZXIgb24gd2l0aCB0aGUgc2FtZSBuYW1lIHdoaWNoIGRvZXMgdXNlIHRoZQotICAgICAgICAgICAgIHZlcnNpb24gb2YgbGliYyB0aGF0IHdlIHdhbnQuICBUaGlzIGlzIG11Y2ggdG9vIGhvcnJpYmxlCi0gICAgICAgICAgICAgdG8gdXNlIG9uIGFueSBzeXN0ZW0gb3RoZXIgdGhhbiBMaW51eC4gICovCi0KLUVPRgotY2FzZSAke3RhcmdldH0gaW4KLSAgKi0qLWxpbnV4LWdudSopCi0gICAgY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIHsKLQkgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsOwotCi0JICAgIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQkgICAgICBpZiAoc3RybmNtcCAobC0+bmFtZSwgImxpYmMuc28iLCA3KSA9PSAwKQotCQlicmVhazsKLQkgICAgaWYgKGwgPT0gTlVMTCkKLQkgICAgICB7Ci0JCSh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgfQotCi1FT0YKLSAgICA7OwotZXNhYwotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQl9Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgbWF0Y2hpbmcgdGhlIERUX05FRURFRCBlbnRyeS4gICovCi0KLSAgLyogV2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGVyZSBpcyBubyBvdGhlciBpbnB1dCBmaWxlIG9mIHRoZQotICAgICBzYW1lIG5hbWUuICBXZSBtdXN0IG5vdyBjaGVjayBhZ2FpbiB0aGF0IHdlIGFyZSBub3QgaW5jbHVkaW5nIHRoZQotICAgICBzYW1lIGZpbGUgdHdpY2UuICBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSBvbiBtYW55IHN5c3RlbXMKLSAgICAgbGliYy5zbyBpcyBhIHN5bWxpbmsgdG8sIGUuZy4sIGxpYmMuc28uMS4gIFRoZSBTT05BTUUgZW50cnkgd2lsbAotICAgICByZWZlcmVuY2UgbGliYy5zby4xLiAgSWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGxpYmMuc28sIHdlCi0gICAgIGRvbid0IHdhbnQgdG8gaW5jbHVkZSBsaWJjLnNvLjEgaWYgdGhleSBhcmUgdGhlIHNhbWUgZmlsZSwgYW5kIHdlCi0gICAgIGNhbiBvbmx5IGNoZWNrIHRoYXQgdXNpbmcgc3RhdC4gICovCi0KLSAgaWYgKGJmZF9zdGF0IChhYmZkLCAmZ2xvYmFsX3N0YXQpICE9IDApCi0gICAgZWluZm8gKCIlRiVQOiVCOiBiZmRfc3RhdCBmYWlsZWQ6ICVFXG4iLCBhYmZkKTsKLSAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQpOwotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHsKLSAgICAgIC8qIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgd2UgZm91bmQgdGhlIGZpbGUsIGV2ZW4gdGhvdWdoCi0gICAgICAgICB3ZSBhcmVuJ3QgZ29pbmcgdG8gZG8gYW55dGhpbmcgd2l0aCBpdC4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGVsbCB0aGUgRUxGIGJhY2tlbmQgdGhhdCBkb24ndCB3YW50IHRoZSBvdXRwdXQgZmlsZSB0byBoYXZlIGEKLSAgICAgRFRfTkVFREVEIGVudHJ5IGZvciB0aGlzIGZpbGUuICAqLwotICBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoYWJmZCwgIiIpOwotCi0gIC8qIEFkZCB0aGlzIGZpbGUgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsICZsaW5rX2luZm8pKQotICAgIGVpbmZvICgiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIsIGFiZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgaWYgYW4gaW5wdXQgZmlsZSBtYXRjaGVzIGEgRFRfTkVFREVEIGVudHJ5IGJ5IG5hbWUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHJldHVybjsKLQotICBpZiAocy0+ZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgc3RyY21wIChzLT5maWxlbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLSAgICB7Ci0gICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocy0+dGhlX2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNvbmFtZTsKLQotICAgICAgc29uYW1lID0gYmZkX2VsZl9nZXRfZHRfc29uYW1lIChzLT50aGVfYmZkKTsKLSAgICAgIGlmIChzb25hbWUgIT0gTlVMTAotCSAgJiYgc3RyY21wIChzb25hbWUsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0JewotCSAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCSAgCi0gIGlmIChzLT5zZWFyY2hfZGlyc19mbGFnCi0gICAgICAmJiBzLT5maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBzdHJjaHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICcvJykgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpmOwotCi0gICAgICBmID0gc3RycmNociAocy0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBpZiAoZiAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKGYgKyAxLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCXsKLQkgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogU2VlIGlmIGFuIGlucHV0IGZpbGUgbWF0Y2hlcyBhIERUX05FRURFRCBlbnRyeSBieSBydW5uaW5nIHN0YXQgb24KLSAgIHRoZSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgY29uc3QgY2hhciAqc3VmZml4OwotICBjb25zdCBjaGFyICpzb25hbWU7Ci0gIGNvbnN0IGNoYXIgKmY7Ci0KLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICByZXR1cm47Ci0gIGlmIChzLT50aGVfYmZkID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChiZmRfc3RhdCAocy0+dGhlX2JmZCwgJnN0KSAhPSAwKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVA6JUI6IGJmZF9zdGF0IGZhaWxlZDogJUVcbiIsIHMtPnRoZV9iZmQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc3Quc3RfZGV2ID09IGdsb2JhbF9zdGF0LnN0X2RldgotICAgICAgJiYgc3Quc3RfaW5vID09IGdsb2JhbF9zdGF0LnN0X2lubykKLSAgICB7Ci0gICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBXZSBpc3N1ZSBhIHdhcm5pbmcgaWYgaXQgbG9va3MgbGlrZSB3ZSBhcmUgaW5jbHVkaW5nIHR3bwotICAgICBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUgc2hhcmVkIGxpYnJhcnkuICBGb3IgZXhhbXBsZSwKLSAgICAgdGhlcmUgbWF5IGJlIGEgcHJvYmxlbSBpZiAtbGMgcGlja3MgdXAgbGliYy5zby42IGJ1dCBzb21lIG90aGVyCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGhhcyBhIERUX05FRURFRCBlbnRyeSBvZiBsaWJjLnNvLjUuICBUaGlzIGlzIGEKLSAgICAgaHVlcmlzdGljIHRlc3QsIGFuZCBpdCB3aWxsIG9ubHkgd29yayBpZiB0aGUgbmFtZSBsb29rcyBsaWtlCi0gICAgIE5BTUUuc28uVkVSU0lPTi4gIEZJWE1FOiBEZXBlbmRpbmcgb24gZmlsZSBuYW1lcyBpcyBlcnJvci1wcm9uZS4KLSAgICAgSWYgd2UgcmVhbGx5IHdhbnQgdG8gaXNzdWUgd2FybmluZ3MgYWJvdXQgbWl4aW5nIHZlcnNpb24gbnVtYmVycwotICAgICBvZiBzaGFyZWQgbGlicmFyaWVzLCB3ZSBuZWVkIHRvIGZpbmQgYSBiZXR0ZXIgd2F5LiAgKi8KLQotICBpZiAoc3RyY2hyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAnLycpICE9IE5VTEwpCi0gICAgcmV0dXJuOwotICBzdWZmaXggPSBzdHJzdHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICIuc28uIik7Ci0gIGlmIChzdWZmaXggPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIHN1ZmZpeCArPSBzaXplb2YgIi5zby4iIC0gMTsKLQotICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICBpZiAoc29uYW1lID09IE5VTEwpCi0gICAgc29uYW1lID0gcy0+ZmlsZW5hbWU7Ci0KLSAgZiA9IHN0cnJjaHIgKHNvbmFtZSwgJy8nKTsKLSAgaWYgKGYgIT0gTlVMTCkKLSAgICArK2Y7Ci0gIGVsc2UKLSAgICBmID0gc29uYW1lOwotCi0gIGlmIChzdHJuY21wIChmLCBnbG9iYWxfbmVlZGVkLT5uYW1lLCBzdWZmaXggLSBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG1heSBjb25mbGljdCB3aXRoICVzXG4iLAotCSAgIGdsb2JhbF9uZWVkZWQtPm5hbWUsIGdsb2JhbF9uZWVkZWQtPmJ5LCBmKTsKLX0KLQotLyogT24gTGludXgsIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUKLSAgIHNoYXJlZCBsaWJyYXJ5IGxpbmtlZCBhZ2FpbnN0IGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBsaWJjLiAgVGhlCi0gICBkeW5hbWljIGxpbmtlciBzb21laG93IHRhZ3Mgd2hpY2ggbGliYyB2ZXJzaW9uIHRvIHVzZSBpbgotICAgL2V0Yy9sZC5zby5jYWNoZSwgYW5kLCBiYXNlZCBvbiB0aGUgbGliYyB0aGF0IGl0IHNlZXMgaW4gdGhlCi0gICBleGVjdXRhYmxlLCBjaG9vc2VzIHdoaWNoIHZlcnNpb24gb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IHRvIHVzZS4KLQotICAgV2UgdHJ5IHRvIGRvIGEgc2ltaWxhciBjaGVjayBoZXJlIGJ5IGNoZWNraW5nIHdoZXRoZXIgdGhpcyBzaGFyZWQKLSAgIGxpYnJhcnkgbmVlZHMgYW55IG90aGVyIHNoYXJlZCBsaWJyYXJpZXMgd2hpY2ggbWF5IGNvbmZsaWN0IHdpdGgKLSAgIGxpYnJhcmllcyB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBJZiBpdCBkb2VzLCB3ZQotICAgc2tpcCBpdCwgYW5kIHRyeSB0byBmaW5kIGFub3RoZXIgc2hhcmVkIGxpYnJhcnkgZmFydGhlciBvbiBkb3duIHRoZQotICAgbGluayBwYXRoLgotCi0gICBUaGlzIGlzIGNhbGxlZCB2aWEgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlLgotICAgR0xPQkFMX1ZFUkNIRUNLX05FRURFRCBpcyB0aGUgbGlzdCBvZiBvYmplY3RzIG5lZWRlZCBieSB0aGUgb2JqZWN0Ci0gICB3aGljaCB3ZSBhciBjaGVja2luZy4gIFRoaXMgc2V0cyBHTE9CQUxfVkVSQ0hFQ0tfRkFJTEVEIGlmIHdlIGZpbmQKLSAgIGEgY29uZmxpY3RpbmcgdmVyc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjayAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgY29uc3QgY2hhciAqc29uYW1lLCAqZjsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsOwotCi0gIGlmIChnbG9iYWxfdmVyY2hlY2tfZmFpbGVkKQotICAgIHJldHVybjsKLSAgaWYgKHMtPnRoZV9iZmQgPT0gTlVMTAotICAgICAgfHwgKGJmZF9nZXRfZmlsZV9mbGFncyAocy0+dGhlX2JmZCkgJiBEWU5BTUlDKSA9PSAwKQotICAgIHJldHVybjsKLQotICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICBpZiAoc29uYW1lID09IE5VTEwpCi0gICAgc29uYW1lID0gYmZkX2dldF9maWxlbmFtZSAocy0+dGhlX2JmZCk7Ci0KLSAgZiA9IHN0cnJjaHIgKHNvbmFtZSwgJy8nKTsKLSAgaWYgKGYgIT0gTlVMTCkKLSAgICArK2Y7Ci0gIGVsc2UKLSAgICBmID0gc29uYW1lOwotCi0gIGZvciAobCA9IGdsb2JhbF92ZXJjaGVja19uZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc3VmZml4OwotCi0gICAgICBpZiAoc3RyY21wIChmLCBsLT5uYW1lKSA9PSAwKQotCXsKLQkgIC8qIFByb2JhYmx5IGNhbid0IGhhcHBlbiwgYnV0IGl0J3MgYW4gZWFzeSBjaGVjay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJjaHIgKGwtPm5hbWUsICcvJykgIT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgc3VmZml4ID0gc3Ryc3RyIChsLT5uYW1lLCAiLnNvLiIpOwotICAgICAgaWYgKHN1ZmZpeCA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBzdWZmaXggKz0gc2l6ZW9mICIuc28uIiAtIDE7Ci0KLSAgICAgIGlmIChzdHJuY21wIChmLCBsLT5uYW1lLCBzdWZmaXggLSBsLT5uYW1lKSA9PSAwKQotCXsKLQkgIC8qIEhlcmUgd2Uga25vdyB0aGF0IFMgaXMgYSBkeW5hbWljIG9iamVjdCBGT08uU08uVkVSMSwgYW5kCi0gICAgICAgICAgICAgdGhlIG9iamVjdCB3ZSBhcmUgY29uc2lkZXJpbmcgbmVlZHMgYSBkeW5hbWljIG9iamVjdAotICAgICAgICAgICAgIEZPTy5TTy5WRVIyLCBhbmQgVkVSMSBhbmQgVkVSMiBhcmUgZGlmZmVyZW50LiAgVGhpcwotICAgICAgICAgICAgIGFwcGVhcnMgdG8gYmUgYSB2ZXJzaW9uIG1pc21hdGNoLCBzbyB3ZSB0ZWxsIHRoZSBjYWxsZXIKLSAgICAgICAgICAgICB0byB0cnkgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkuICAqLwotCSAgZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uICBXZSB1c2UgdGhpcyB0byBwdXQgcmFuZG9tIFNIRl9BTExPQwotICAgc2VjdGlvbnMgaW4gdGhlIHJpZ2h0IHNlZ21lbnQuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKmhvbGRfc2VjdGlvbjsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3VzZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3RleHQ7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yb2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9kYXRhOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfYnNzOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfcmVsOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfaW50ZXJwOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpwbGFjZTsKLSAgYXNlY3Rpb24gKnNuZXcsICoqcHBzOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKm9sZDsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGFkZDsKLSAgZXRyZWVfdHlwZSAqYWRkcmVzczsKLSAgY29uc3QgY2hhciAqc2VjbmFtZSwgKnBzOwotICBjb25zdCBjaGFyICpvdXRzZWNuYW1lOwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNjcmlwdCB0byBzZWUgd2hlcmUgdG8gcGxhY2UgdGhpcyBzZWN0aW9uLiAgKi8KLSAgaG9sZF9zZWN0aW9uID0gczsKLSAgaG9sZF91c2UgPSBOVUxMOwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik7Ci0KLSAgaWYgKGhvbGRfdXNlICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IHBsYWNlZCBhIHNlY3Rpb24gd2l0aCB0aGlzIG5hbWUuICAqLwotICAgICAgd2lsZF9kb2l0ICgmaG9sZF91c2UtPmNoaWxkcmVuLCBzLCBob2xkX3VzZSwgZmlsZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzLT5vd25lciwgcyk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIHRoZW4gYWx3YXlzIHB1dCAuZ251Lndhcm5pbmcuU1lNQk9MCi0gICAgIHNlY3Rpb25zIGludG8gdGhlIC50ZXh0IHNlY3Rpb24gdG8gZ2V0IHRoZW0gb3V0IG9mIHRoZSB3YXkuICAqLwotICBpZiAoISBsaW5rX2luZm8uc2hhcmVkCi0gICAgICAmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLSAgICAgICYmIHN0cm5jbXAgKHNlY25hbWUsICIuZ251Lndhcm5pbmcuIiwgc2l6ZW9mICIuZ251Lndhcm5pbmcuIiAtIDEpID09IDAKLSAgICAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHdpbGRfZG9pdCAoJmhvbGRfdGV4dC0+Y2hpbGRyZW4sIHMsIGhvbGRfdGV4dCwgZmlsZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogRGVjaWRlIHdoaWNoIHNlZ21lbnQgdGhlIHNlY3Rpb24gc2hvdWxkIGdvIGluIGJhc2VkIG9uIHRoZQotICAgICBzZWN0aW9uIG5hbWUgYW5kIHNlY3Rpb24gZmxhZ3MuICBXZSBwdXQgbG9hZGFibGUgLm5vdGUgc2VjdGlvbnMKLSAgICAgcmlnaHQgYWZ0ZXIgdGhlIC5pbnRlcnAgc2VjdGlvbiwgc28gdGhhdCB0aGUgUFRfTk9URSBzZWdtZW50IGlzCi0gICAgIHN0b3JlZCByaWdodCBhZnRlciB0aGUgcHJvZ3JhbSBoZWFkZXJzIHdoZXJlIHRoZSBPUyBjYW4gcmVhZCBpdAotICAgICBpbiB0aGUgZmlyc3QgcGFnZS4gICovCi0gIHBsYWNlID0gTlVMTDsKLSAgaWYgKHMtPmZsYWdzICYgU0VDX0VYQ0xVREUpCi0gICAgcmV0dXJuIGZhbHNlOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotICAgICAgJiYgc3RybmNtcCAoc2VjbmFtZSwgIi5ub3RlIiwgNCkgPT0gMAotICAgICAgJiYgaG9sZF9pbnRlcnAgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfaW50ZXJwOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICAgJiYgaG9sZF9ic3MgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfYnNzOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDAKLQkgICAmJiBob2xkX2RhdGEgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfZGF0YTsKLSAgZWxzZSBpZiAoc3RybmNtcCAoc2VjbmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JICAgJiYgaG9sZF9yZWwgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfcmVsOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAotCSAgICYmIChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICYmIGhvbGRfcm9kYXRhICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3JvZGF0YTsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3RleHQ7Ci0gIGlmIChwbGFjZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDaG9vc2UgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHNlY3Rpb24uICBUaGlzIHdpbGwgYmUgbmVlZGVkIGlmIHRoZQotICAgICBzYW1lIHNlY3Rpb24gbmFtZSBhcHBlYXJzIGluIHRoZSBpbnB1dCBmaWxlIHdpdGggZGlmZmVyZW50Ci0gICAgIGxvYWRhYmxlIG9yIGFsbG9jYXRlYWJsZSBjaGFyYWN0ZXJpc3RpY3MuICAqLwotICBvdXRzZWNuYW1lID0gc2VjbmFtZTsKLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRzZWNuYW1lKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW47Ci0gICAgICBjaGFyICpuZXduYW1lOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAob3V0c2VjbmFtZSk7Ci0gICAgICBuZXduYW1lID0geG1hbGxvYyAobGVuICsgNSk7Ci0gICAgICBzdHJjcHkgKG5ld25hbWUsIG91dHNlY25hbWUpOwotICAgICAgaSA9IDA7Ci0gICAgICBkbwotCXsKLQkgIHNwcmludGYgKG5ld25hbWUgKyBsZW4sICIlZCIsIGkpOwotCSAgKytpOwotCX0KLSAgICAgIHdoaWxlIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmV3bmFtZSkgIT0gTlVMTCk7Ci0KLSAgICAgIG91dHNlY25hbWUgPSBuZXduYW1lOwotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgcHV0IGl0IGluIHRoZSByaWdodAotICAgICBwbGFjZS4gIFRoaXMgc2h1ZmZsaW5nIGlzIHRvIG1ha2UgdGhlIG91dHB1dCBmaWxlIGxvb2sgbmVhdGVyLiAgKi8KLSAgc25ldyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dHB1dF9iZmQsIG91dHNlY25hbWUpOwotICBpZiAoc25ldyA9PSBOVUxMKQotICAgICAgZWluZm8gKCIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIsCi0JICAgICBvdXRwdXRfYmZkLT54dmVjLT5uYW1lLCBvdXRzZWNuYW1lKTsKLSAgaWYgKHBsYWNlLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAocHBzID0gJm91dHB1dF9iZmQtPnNlY3Rpb25zOyAqcHBzICE9IHNuZXc7IHBwcyA9ICYoKnBwcyktPm5leHQpCi0JOwotICAgICAgKnBwcyA9IHNuZXctPm5leHQ7Ci0gICAgICBzbmV3LT5uZXh0ID0gcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0OwotICAgICAgcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0ID0gc25ldzsKLSAgICB9Ci0KLSAgLyogU3RhcnQgYnVpbGRpbmcgYSBsaXN0IG9mIHN0YXRlbWVudHMgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gIG9sZCA9IHN0YXRfcHRyOwotICBzdGF0X3B0ciA9ICZhZGQ7Ci0gIGxhbmdfbGlzdF9pbml0IChzdGF0X3B0cik7Ci0KLSAgLyogSWYgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gaXMgcmVwcmVzZW50YWJsZSBpbiBDLCB0aGVuIGNyZWF0ZQotICAgICBzeW1ib2xzIHRvIG1hcmsgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgZm9yIChwcyA9IG91dHNlY25hbWU7ICpwcyAhPSAnXDAnOyBwcysrKQotICAgIGlmICghIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcHMpICYmICpwcyAhPSAnXycpCi0gICAgICBicmVhazsKLSAgaWYgKCpwcyA9PSAnXDAnICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgewotICAgICAgY2hhciAqc3ltbmFtZTsKLQotICAgICAgc3ltbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHBzIC0gb3V0c2VjbmFtZSArIHNpemVvZiAiX19zdGFydF8iKTsKLSAgICAgIHNwcmludGYgKHN5bW5hbWUsICJfX3N0YXJ0XyVzIiwgb3V0c2VjbmFtZSk7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9Jywgc3ltbmFtZSwKLQkJCQkgICAgICBleHBfdW5vcCAoQUxJR05fSywKLQkJCQkJCWV4cF9pbnRvcCAoKGJmZF92bWEpIDEKLQkJCQkJCQkgICA8PCBzLT5hbGlnbm1lbnRfcG93ZXIpKSkpOwotICAgIH0KLQotICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIGFkZHJlc3MgPSBOVUxMOwotICBlbHNlCi0gICAgYWRkcmVzcyA9IGV4cF9pbnRvcCAoKGJmZF92bWEpIDApOwotCi0gIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChvdXRzZWNuYW1lLCBhZGRyZXNzLCAwLAotCQkJCSAgICAgICAoYmZkX3ZtYSkgMCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCk7Ci0KLSAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHNlY25hbWUpOwotICB3aWxkX2RvaXQgKCZvcy0+Y2hpbGRyZW4sIHMsIG9zLCBmaWxlKTsKLQotICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotICAgICgoYmZkX3ZtYSkgMCwgIipkZWZhdWx0KiIsIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikgTlVMTCk7Ci0gIHN0YXRfcHRyID0gJmFkZDsKLQotICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICB7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotCi0gICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBvdXRzZWNuYW1lICsgc2l6ZW9mICJfX3N0b3BfIik7Ci0gICAgICBzcHJpbnRmIChzeW1uYW1lLCAiX19zdG9wXyVzIiwgb3V0c2VjbmFtZSk7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9Jywgc3ltbmFtZSwKLQkJCQkgICAgICBleHBfbmFtZW9wIChOQU1FLCAiLiIpKSk7Ci0gICAgfQotCi0gIC8qIE5vdyBzdGljayB0aGUgbmV3IHN0YXRlbWVudCBsaXN0IHJpZ2h0IGFmdGVyIFBMQUNFLiAgKi8KLSAgKmFkZC50YWlsID0gcGxhY2UtPmhlYWRlci5uZXh0OwotICBwbGFjZS0+aGVhZGVyLm5leHQgPSBhZGQuaGVhZDsKLQotICBzdGF0X3B0ciA9IG9sZDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24gKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGlmIChzLT5oZWFkZXIudHlwZSAhPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtKQotICAgIHJldHVybjsKLQotICBvcyA9ICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0KLSAgaWYgKHN0cmNtcCAob3MtPm5hbWUsIGhvbGRfc2VjdGlvbi0+bmFtZSkgPT0gMAotICAgICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmICgoaG9sZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0JICA9PSAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpKSkKLSAgICBob2xkX3VzZSA9IG9zOwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIGhvbGRfdGV4dCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnJvZGF0YSIpID09IDApCi0gICAgaG9sZF9yb2RhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICBob2xkX2RhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5ic3MiKSA9PSAwKQotICAgIGhvbGRfYnNzID0gb3M7Ci0gIGVsc2UgaWYgKGhvbGRfcmVsID09IE5VTEwKLQkgICAmJiBvcy0+YmZkX3NlY3Rpb24gIT0gTlVMTAotCSAgICYmIChvcy0+YmZkX3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgJiYgc3RybmNtcCAob3MtPm5hbWUsICIucmVsIiwgNCkgPT0gMCkKLSAgICBob2xkX3JlbCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmludGVycCIpID09IDApCi0gICAgaG9sZF9pbnRlcnAgPSBvczsKLX0KLQotLyogTG9vayB0aHJvdWdoIGFuIGV4cHJlc3Npb24gZm9yIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIGV0cmVlX3Byb3ZpZGU6Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBleHAtPmFzc2lnbi5kc3QsCi0JCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCWJyZWFrOwotCi0gICAgICAvKiBXZSBjYWxsIHJlY29yZF9saW5rX2Fzc2lnbm1lbnQgZXZlbiBpZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQuCi0JIFRoaXMgaXMgYmVjYXVzZSBpZiBpdCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIHdlCi0JIGFjdHVhbGx5IHdhbnQgdG8gdXNlIHRoZSB2YWx1ZSBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LAotCSBub3QgdGhlIHZhbHVlIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IChiZWNhdXNlIHdlIGFyZSBzZXR0aW5nCi0JIHN5bWJvbHMgbGlrZSBldGV4dCkuICBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyCi0JIG9iamVjdCwgdGhlbiwgYXMgaXQgaGFwcGVucywgY2FsbGluZyByZWNvcmRfbGlua19hc3NpZ25tZW50Ci0JIHdpbGwgZG8gbm8gaGFybS4gICovCi0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBldHJlZV9hc3NpZ246Ci0gICAgICBpZiAoc3RyY21wIChleHAtPmFzc2lnbi5kc3QsICIuIikgIT0gMCkKLQl7Ci0JICBpZiAoISAoYmZkX2VsZiR7RUxGU0laRX1fcmVjb3JkX2xpbmtfYXNzaWdubWVudAotCQkgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGV4cC0+YXNzaWduLmRzdCwKLQkJICBleHAtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9wcm92aWRlID8gdHJ1ZSA6IGZhbHNlKSkpCi0JICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHJlY29yZCBhc3NpZ25tZW50IHRvICVzOiAlRVxuIiwKLQkJICAgZXhwLT5hc3NpZ24uZHN0KTsKLQl9Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmFzc2lnbi5zcmMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3RyaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkuY29uZCk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkubGhzKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT51bmFyeS5jaGlsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lIHZpYQotICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBJdCBsb2NhdGVzIGFueSBhc3NpZ25tZW50IHN0YXRlbWVudHMsIGFuZAotICAgdGVsbHMgdGhlIEVMRiBiYWNrZW5kIGFib3V0IHRoZW0sIGluIGNhc2UgdGhleSBhcmUgYXNzaWdubWVudHMgdG8KLSAgIHN5bWJvbHMgd2hpY2ggYXJlIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50IChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtKQotICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgY29uc3QgY2hhciAqcnBhdGg7Ci0gIGFzZWN0aW9uICpzaW50ZXJwOwotCi0gIC8qIElmIHdlIGFyZSBnb2luZyB0byBtYWtlIGFueSB2YXJpYWJsZSBhc3NpZ25tZW50cywgd2UgbmVlZCB0byBsZXQKLSAgICAgdGhlIEVMRiBiYWNrZW5kIGtub3cgYWJvdXQgdGhlbSBpbiBjYXNlIHRoZSB2YXJpYWJsZXMgYXJlCi0gICAgIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50KTsKLQotICAvKiBMZXQgdGhlIEVMRiBiYWNrZW5kIHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbnkgc2VjdGlvbnMgcmVxdWlyZWQKLSAgICAgYnkgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgcnBhdGggPSBjb21tYW5kX2xpbmUucnBhdGg7Ci0gIGlmIChycGF0aCA9PSBOVUxMKQotICAgIHJwYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfUlVOX1BBVEgiKTsKLSAgaWYgKCEgKGJmZF9lbGYke0VMRlNJWkV9X3NpemVfZHluYW1pY19zZWN0aW9ucwotICAgICAgICAgKG91dHB1dF9iZmQsIGNvbW1hbmRfbGluZS5zb25hbWUsIHJwYXRoLAotCSAgY29tbWFuZF9saW5lLmV4cG9ydF9keW5hbWljLCBjb21tYW5kX2xpbmUuZmlsdGVyX3NobGliLAotCSAgKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMsCi0JICAmbGlua19pbmZvLCAmc2ludGVycCwgbGFuZ19lbGZfdmVyc2lvbl9pbmZvKSkpCi0gICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gc2V0IGR5bmFtaWMgc2VjdGlvbiBzaXplczogJUVcbiIpOwotCi0gIC8qIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgZHluYW1pYyBsaW5rZXIgd2UgYXJlIHVzaW5nLiAgKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5pbnRlcnByZXRlciAhPSBOVUxMCi0gICAgICAmJiBzaW50ZXJwICE9IE5VTEwpCi0gICAgewotICAgICAgc2ludGVycC0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgY29tbWFuZF9saW5lLmludGVycHJldGVyOwotICAgICAgc2ludGVycC0+X3Jhd19zaXplID0gc3RybGVuIChjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIpICsgMTsKLSAgICB9Ci0KLSAgLyogTG9vayBmb3IgYW55IHNlY3Rpb25zIG5hbWVkIC5nbnUud2FybmluZy4gIEFzIGEgR05VIGV4dGVuc2lvbnMsCi0gICAgIHdlIHRyZWF0IHN1Y2ggc2VjdGlvbnMgYXMgY29udGFpbmluZyB3YXJuaW5nIG1lc3NhZ2VzLiAgV2UgcHJpbnQKLSAgICAgb3V0IHRoZSB3YXJuaW5nIG1lc3NhZ2UsIGFuZCB0aGVuIHplcm8gb3V0IHRoZSBzZWN0aW9uIHNpemUgc28KLSAgICAgdGhhdCBpdCBkb2VzIG5vdCBnZXQgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWFzZWN0aW9uICpzOwotCWJmZF9zaXplX3R5cGUgc3o7Ci0JY2hhciAqbXNnOwotCWJvb2xlYW4gcmV0OwotCi0JaWYgKGlzLT5qdXN0X3N5bXNfZmxhZykKLQkgIGNvbnRpbnVlOwotCi0JcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpcy0+dGhlX2JmZCwgIi5nbnUud2FybmluZyIpOwotCWlmIChzID09IE5VTEwpCi0JICBjb250aW51ZTsKLQotCXN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoaXMtPnRoZV9iZmQsIHMpOwotCW1zZyA9IHhtYWxsb2MgKChzaXplX3QpIHN6ICsgMSk7Ci0JaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpcy0+dGhlX2JmZCwgcywgbXNnLCAoZmlsZV9wdHIpIDAsIHN6KSkKLQkgIGVpbmZvICgiJUYlQjogQ2FuJ3QgcmVhZCBjb250ZW50cyBvZiBzZWN0aW9uIC5nbnUud2FybmluZzogJUVcbiIsCi0JCSBpcy0+dGhlX2JmZCk7Ci0JbXNnW3N6XSA9ICdcMCc7Ci0JcmV0ID0gbGlua19pbmZvLmNhbGxiYWNrcy0+d2FybmluZyAoJmxpbmtfaW5mbywgbXNnLAotCQkJCQkgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJICAgIGlzLT50aGVfYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJCQkJICAgIChiZmRfdm1hKSAwKTsKLQlBU1NFUlQgKHJldCk7Ci0JZnJlZSAobXNnKTsKLQotCS8qIENsb2JiZXIgdGhlIHNlY3Rpb24gc2l6ZSwgc28gdGhhdCB3ZSBkb24ndCB3YXN0ZSBjb3B5aW5nIHRoZQotCSAgIHdhcm5pbmcgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgICB9Ci0gIH0KLQotICAvKiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViIHNlY3Rpb24gKi8KLQotICAvKiBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IGdsdWUgaW5mb3JtYXRpb24gKi8KLSAgLyogRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lIG9wdGlvbj8ga3JrQGN5Z251cy5jb20gKi8KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoIWJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvLAotCQkJCQkJICAgICAgbm9fcGlwZWxpbmVfa25vd2xlZGdlKSkKLQkgIHsKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgZWluZm8gKF8oIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMiKSwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKCYgbGlua19pbmZvKTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCBQQVJBTVMoKHZvaWQpKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0KLSAgaWYgKHRodW1iX2VudHJ5X3N5bWJvbCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgCi0gIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIHRodW1iX2VudHJ5X3N5bWJvbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotICAgICAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICYmIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgc3RhdGljIGNoYXIgYnVmZmVyWzMyXTsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgCi0gICAgICAvKiBTcGVjaWFsIHByb2Nlc2luZyBpcyByZXF1aXJlZCBmb3IgYSBUaHVtYiBlbnRyeSBzeW1ib2wuICBUaGUKLQkgYm90dG9tIGJpdCBvZiBpdHMgYWRkcmVzcyBtdXN0IGJlIHNldC4gICovCi0gICAgICB2YWwgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkgICAgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0JICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgCi0gICAgICB2YWwgfD0gMTsKLQotICAgICAgLyogTm93IGNvbnZlcnQgdGhpcyB2YWx1ZSBpbnRvIGEgc3RyaW5nIGFuZCBzdG9yZSBpdCBpbiBlbnRyeV9zeW1ib2wKLSAgICAgICAgIHdoZXJlIHRoZSBsYW5nX2ZpbmlzaCgpIGZ1bmN0aW9uIHdpbGwgcGljayBpdCB1cC4gICovCi0gICAgICBidWZmZXJbMF0gPSAnMCc7Ci0gICAgICBidWZmZXJbMV0gPSAneCc7Ci0gICAgICAKLSAgICAgIHNwcmludGZfdm1hIChidWZmZXIgKyAyLCB2YWwpOwotCi0gICAgICBpZiAoZW50cnlfc3ltYm9sICE9IE5VTEwgJiYgZW50cnlfZnJvbV9jbWRsaW5lKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogJy0tdGh1bWItZW50cnkgJXMnIGlzIG92ZXJyaWRpbmcgJy1lICVzJ1xuIiksCi0JICAgICAgIHRodW1iX2VudHJ5X3N5bWJvbCwgZW50cnlfc3ltYm9sKTsKLSAgICAgIGVudHJ5X3N5bWJvbCA9IGJ1ZmZlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IGNvbm5vdCBmaW5kIHRodW1iIHN0YXJ0IHN5bWJvbCAlc1xuIiksIHRodW1iX2VudHJ5X3N5bWJvbCk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgKGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWlmIHRlc3QgLW4gIiRHRU5FUkFURV9TSExJQl9TQ1JJUFQiIDsgdGhlbgotICAgICAgICBlY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnNoYXJlZCkgcmV0dXJuJyAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotICAgICAgICBzZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cyAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZmkKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlIGlmIChsaW5rX2luZm8uc2hhcmVkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhzIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4sCi0gIE5VTEwsIC8qIHNldF9zeW1ib2xzICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCi0gIE5VTEwsIC8qIHVucmVjb2duaXNlZCBmaWxlICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucywKLSAgTlVMTCAvKiByZWNvZ25pemVkIGZpbGUgKi8KLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbSBiL2xkL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyZGZlNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvYXJtZWxmX29hYmkuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBlbXVsYXRlIHRoZSBvcmlnaW5hbCBnbGQgZm9yIHRoZSBnaXZlbiAke0VNVUxBVElPTl9OQU1FfQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jZGVmaW5lIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIFwKLQliZmRfZWxmMzJfYXJtX29hYmlfYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIFwKLQliZmRfZWxmMzJfYXJtX29hYmlfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0jZGVmaW5lIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiBcCi0JYmZkX2VsZjMyX2FybV9vYWJpX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSAoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfc2V0X291dHB1dF9hcmNoICgiYGVjaG8gJHtBUkNIfWAiKTsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIC8qIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJ3b3JraW5nIHN0dWIgc2VjdGlvbiAqLwotCi0gIC8qIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgZ2x1ZSBpbmZvcm1hdGlvbiAqLwotICAvKiBGSVhNRTogc2hvdWxkIHRoaXMgYmUgYmFzZWQgb24gYSBjb21tYW5kIGxpbmUgb3B0aW9uPyBrcmtAY3lnbnVzLmNvbSAqLwotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmICghYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChpcy0+dGhlX2JmZCwgJmxpbmtfaW5mbywgMCkpCi0JICB7Ci0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIGVpbmZvIChfKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIiksIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCi17Ci0KLSAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgIHsKLSAgICAgIC8qIFRoZSBpbnRlcndvcmtpbmcgYmZkIG11c3QgYmUgdGhlIGxhc3Qgb25lIHRvIGJlIHByb2Nlc3NlZCAqLwotICAgICAgaWYgKCFpcy0+bmV4dCkKLSAgICAgICAgIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8pOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCAoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBOVUxMLCAvKiBmaW5pc2ggKi8KLSAgTlVMTCwgLyogY3JlYXRlIG91dHB1dCBzZWN0aW9uIHN0YXRlbWVudHMgKi8KLSAgTlVMTCwgLyogb3BlbiBkeW5hbWljIGFyY2hpdmUgKi8KLSAgTlVMTCwgLyogcGxhY2Ugb3JwaGFuICovCi0gIE5VTEwsIC8qIHNldF9zeW1ib2xzICovCi0gIE5VTEwsCi0gIE5VTEwsIC8qIHVucmVjb2duaXNlZCBmaWxlICovCi0gIE5VTEwKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9hc3RyaW5nLnNlZCBiL2xkL2VtdWx0ZW1wbC9hc3RyaW5nLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhiZDhhNi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvYXN0cmluZy5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1zL1siXFxdL1xcJi9nCi1zLyQvXFxuXFwvCi0xIHMvXi8iLwotMjVzL1xcJC8iLwotMjZzL14vIi8KLTUwcy9cXCQvIi8KLTUxcy9eLyIvCi03NXMvXFwkLyIvCi03NnMvXi8iLwotMTAwcy9cXCQvIi8KLTEwMXMvXi8iLwotJCBzLyQvbiIvCi0kIHMvXFxuIm4iJC9cXG4iLwpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2Jlb3MuZW0gYi9sZC9lbXVsdGVtcGwvYmVvcy5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0OTBjYS4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvYmVvcy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDgzNyArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotICAgQ29weXJpZ2h0IDE5OTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEZvciBXSU5ET1dTX05UICovCi0vKiBUaGUgb3JpZ2luYWwgZmlsZSBnZW5lcmF0ZWQgcmV0dXJuZWQgZGlmZmVyZW50IGRlZmF1bHQgc2NyaXB0cyBkZXBlbmRpbmcKLSAgIG9uIHdoZXRoZXIgY2VydGFpbiBzd2l0Y2hlcyB3ZXJlIHNldCwgYnV0IHRoZXNlIHN3aXRjaGVzIHBlcnRhaW4gdG8gdGhlCi0gICBMaW51eCBzeXN0ZW0gYW5kIHRoYXQgcGFydGljdWxhciB2ZXJzaW9uIG9mIGNvZmYuICBJbiB0aGUgTlQgY2FzZSwgd2UKLSAgIG9ubHkgZGV0ZXJtaW5lIGlmIHRoZSBzdWJzeXN0ZW0gaXMgY29uc29sZSBvciB3aW5kb3dzIGluIG9yZGVyIHRvIHNlbGVjdAotICAgdGhlIGNvcnJlY3QgZW50cnkgcG9pbnQgYnkgZGVmYXVsdC4gKi8gCi0gIAotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRsZXguaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGN0b3IuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiLi4vYmZkL2xpYmNvZmYuaCIKLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbgotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBjaGFyICpnbGRfJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKikpOwotc3RhdGljIGludCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLQotI2lmIDAgLyogYXJndW1lbnQgdG8gcXNvcnQgc28gZG9uJ3QgcHJvdG90eXBlICovCi1zdGF0aWMgaW50IHNvcnRfYnlfZmlsZV9uYW1lIFBBUkFNUyAoKHZvaWQgKiwgdm9pZCAqKSk7Ci1zdGF0aWMgaW50IHNvcnRfYnlfc2VjdGlvbl9uYW1lIFBBUkFNUyAoKHZvaWQgKiwgdm9pZCAqKSk7Ci0jZW5kaWYKLXN0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqc29ydF9zZWN0aW9uc18xCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiosIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiwgaW50LAotCSAgIGludCAoKikoKSkpOwotc3RhdGljIHZvaWQgc29ydF9zZWN0aW9ucyBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLQotc3RhdGljIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyIHBlOwotc3RhdGljIGludCBkbGw7Ci0KLWV4dGVybiBjb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWU7Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gImEuZXhlIjsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OwotfQotDAotLyogUEUgZm9ybWF0IGV4dHJhIGNvbW1hbmQgbGluZSBvcHRpb25zLiAgKi8KLQotLyogVXNlZCBmb3Igc2V0dGluZyBmbGFncyBpbiB0aGUgUEUgaGVhZGVyLiAqLwotI2RlZmluZSBPUFRJT05fQkFTRV9GSUxFCQkoMzAwICArIDEpCi0jZGVmaW5lIE9QVElPTl9ETEwJCQkoT1BUSU9OX0JBU0VfRklMRSArIDEpCi0jZGVmaW5lIE9QVElPTl9GSUxFX0FMSUdOTUVOVAkJKE9QVElPTl9ETEwgKyAxKQotI2RlZmluZSBPUFRJT05fSU1BR0VfQkFTRQkJKE9QVElPTl9GSUxFX0FMSUdOTUVOVCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OCShPUFRJT05fSU1BR0VfQkFTRSArIDEpCi0jZGVmaW5lIE9QVElPTl9NQUpPUl9PU19WRVJTSU9OCQkoT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT04JKE9QVElPTl9NQUpPUl9PU19WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT04JKE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NSU5PUl9PU19WRVJTSU9OCQkoT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT04JKE9QVElPTl9NSU5PUl9PU19WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UCShPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fU1RBQ0sgICAgICAgICAgICAgICAgICAgIChPUFRJT05fU0VDVElPTl9BTElHTk1FTlQgKyAxKQotI2RlZmluZSBPUFRJT05fU1VCU1lTVEVNICAgICAgICAgICAgICAgIChPUFRJT05fU1RBQ0sgKyAxKQotI2RlZmluZSBPUFRJT05fSEVBUAkJCShPUFRJT05fU1VCU1lTVEVNICsgMSkKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKLSAgLyogUEUgb3B0aW9ucyAqLwotICAgIHsiYmFzZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX0ZJTEV9LAotICAgIHsiZGxsIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ETEx9LAotICAgIHsiZmlsZS1hbGlnbm1lbnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0ZJTEVfQUxJR05NRU5UfSwKLSAgICB7ImhlYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0hFQVB9LCAKLSAgICB7ImltYWdlLWJhc2UiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNQUdFX0JBU0V9LCAKLSAgICB7Im1ham9yLWltYWdlLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT059LAotICAgIHsibWFqb3Itb3MtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfT1NfVkVSU0lPTn0sCi0gICAgeyJtYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT059LAotICAgIHsibWlub3ItaW1hZ2UtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTn0sCi0gICAgeyJtaW5vci1vcy12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9PU19WRVJTSU9OfSwKLSAgICB7Im1pbm9yLXN1YnN5c3RlbS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTn0sCi0gICAgeyJzZWN0aW9uLWFsaWdubWVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0VDVElPTl9BTElHTk1FTlR9LAotICAgIHsic3RhY2siLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUQUNLfSwKLSAgICB7InN1YnN5c3RlbSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1VCU1lTVEVNfSwKLSAgIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLSAgfTsKLQotCi0vKiBQRS9XSU4zMjsgYWRkZWQgcm91dGluZXMgdG8gZ2V0IHRoZSBzdWJzeXN0ZW0gdHlwZSwgaGVhcCBhbmQvb3Igc3RhY2sKLSAgIHBhcmFtZXRlcnMgd2hpY2ggbWF5IGJlIGlucHV0IGZyb20gdGhlIGNvbW1hbmQgbGluZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHZvaWQgKnB0cjsKLSAgaW50IHNpemU7Ci0gIGludCB2YWx1ZTsKLSAgY2hhciAqc3ltYm9sOwotICBpbnQgaW5pdGVkOwotfSBkZWZpbmZvOwotCi0jZGVmaW5lIEQoZmllbGQsc3ltYm9sLGRlZikgIHsmcGUuZmllbGQsc2l6ZW9mKHBlLmZpZWxkKSwgZGVmLCBzeW1ib2wsMH0KLQotc3RhdGljIGRlZmluZm8gaW5pdFtdID0KLXsKLSAgLyogaW1hZ2ViYXNlIG11c3QgYmUgZmlyc3QgKi8KLSNkZWZpbmUgSU1BR0VCQVNFT0ZGIDAKLSAgRChJbWFnZUJhc2UsIl9faW1hZ2VfYmFzZV9fIiwgQkVPU19FWEVfSU1BR0VfQkFTRSksCi0jZGVmaW5lIERMTE9GRiAxCi0gIHsmZGxsLCBzaXplb2YoZGxsKSwgMCwgIl9fZGxsX18ifSwKLSAgRChTZWN0aW9uQWxpZ25tZW50LCJfX3NlY3Rpb25fYWxpZ25tZW50X18iLCBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQpLAotICBEKEZpbGVBbGlnbm1lbnQsIl9fZmlsZV9hbGlnbm1lbnRfXyIsIFBFX0RFRl9GSUxFX0FMSUdOTUVOVCksCi0gIEQoTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uLCJfX21ham9yX29zX3ZlcnNpb25fXyIsIDQpLAotICBEKE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwiX19taW5vcl9vc192ZXJzaW9uX18iLCAwKSwKLSAgRChNYWpvckltYWdlVmVyc2lvbiwiX19tYWpvcl9pbWFnZV92ZXJzaW9uX18iLCAxKSwKLSAgRChNaW5vckltYWdlVmVyc2lvbiwiX19taW5vcl9pbWFnZV92ZXJzaW9uX18iLCAwKSwKLSAgRChNYWpvclN1YnN5c3RlbVZlcnNpb24sIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsIDQpLAotICBEKE1pbm9yU3Vic3lzdGVtVmVyc2lvbiwiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwgMCksCi0gIEQoU3Vic3lzdGVtLCJfX3N1YnN5c3RlbV9fIiwgMyksCi0gIEQoU2l6ZU9mU3RhY2tSZXNlcnZlLCJfX3NpemVfb2Zfc3RhY2tfcmVzZXJ2ZV9fIiwgMHgyMDAwMDAwKSwKLSAgRChTaXplT2ZTdGFja0NvbW1pdCwiX19zaXplX29mX3N0YWNrX2NvbW1pdF9fIiwgMHgxMDAwKSwKLSAgRChTaXplT2ZIZWFwUmVzZXJ2ZSwiX19zaXplX29mX2hlYXBfcmVzZXJ2ZV9fIiwgMHgxMDAwMDApLAotICBEKFNpemVPZkhlYXBDb21taXQsIl9fc2l6ZV9vZl9oZWFwX2NvbW1pdF9fIiwgMHgxMDAwKSwKLSAgRChMb2FkZXJGbGFncywiX19sb2FkZXJfZmxhZ3NfXyIsIDB4MCksCi0gIHsgTlVMTCwgMCwgMCwgTlVMTCwgMCB9Ci19OwotCi0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfbmFtZSAobmFtZSwgdmFsKQotICAgICBjaGFyICpuYW1lOwotICAgICBsb25nIHZhbDsKLXsKLSAgaW50IGk7Ci0gIC8qIEZpbmQgdGhlIG5hbWUgYW5kIHNldCBpdC4gKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5wdHI7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBpbml0W2ldLnN5bWJvbCkgPT0gMCkKLQl7Ci0JICBpbml0W2ldLnZhbHVlID0gdmFsOwotCSAgaW5pdFtpXS5pbml0ZWQgPSAxOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGFib3J0KCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNldF9wZV9zdWJzeXN0ZW0gKCkKLXsKLSAgY29uc3QgY2hhciAqc3ZlcjsKLSAgaW50IGxlbjsKLSAgaW50IGk7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGNvbnN0IGludCB2YWx1ZTsKLSAgICAgIGNvbnN0IGNoYXIgKmVudHJ5OwotICAgIH0KLSAgdltdID0KLSAgICB7Ci0gICAgICB7ICJuYXRpdmUiLCAxLCAiX050UHJvY2Vzc1N0YXJ0dXAiIH0sCi0gICAgICB7ICJ3aW5kb3dzIiwgMiwgIl9XaW5NYWluQ1JUU3RhcnR1cCIgfSwKLSAgICAgIHsgInd3aW5kb3dzIiwgMiwgIl93V2luTWFpbkNSVFN0YXJ0dXAiIH0sCi0gICAgICB7ICJjb25zb2xlIiwgMywgIl9tYWluQ1JUU3RhcnR1cCIgfSwKLSAgICAgIHsgIndjb25zb2xlIiwgMywgIl93bWFpbkNSVFN0YXJ0dXAiIH0sCi0jaWYgMAotICAgICAgLyogVGhlIE1pY3Jvc29mdCBsaW5rZXIgZG9lcyBub3QgcmVjb2duaXplIHRoaXMuICAqLwotICAgICAgeyAib3MyIiwgNSwgIiIgfSwKLSNlbmRpZgotICAgICAgeyAicG9zaXgiLCA3LCAiX19fUG9zaXhQcm9jZXNzU3RhcnR1cCJ9LAotICAgICAgeyAwLCAwLCAwIH0KLSAgICB9OwotCi0gIHN2ZXIgPSBzdHJjaHIgKG9wdGFyZywgJzonKTsKLSAgaWYgKHN2ZXIgPT0gTlVMTCkKLSAgICBsZW4gPSBzdHJsZW4gKG9wdGFyZyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICplbmQ7Ci0KLSAgICAgIGxlbiA9IHN2ZXIgLSBvcHRhcmc7Ci0gICAgICBzZXRfcGVfbmFtZSAoIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsCi0JCSAgIHN0cnRvdWwgKHN2ZXIgKyAxLCAmZW5kLCAwKSk7Ci0gICAgICBpZiAoKmVuZCA9PSAnLicpCi0Jc2V0X3BlX25hbWUgKCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLAotCQkgICAgIHN0cnRvdWwgKGVuZCArIDEsICZlbmQsIDApKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKCIlUDogd2FybmluZzogYmFkIHZlcnNpb24gbnVtYmVyIGluIC1zdWJzeXN0ZW0gb3B0aW9uXG4iKTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgdltpXS5uYW1lOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKG9wdGFyZywgdltpXS5uYW1lLCBsZW4pID09IDAKLQkgICYmIHZbaV0ubmFtZVtsZW5dID09ICdcMCcpCi0JewotCSAgc2V0X3BlX25hbWUgKCJfX3N1YnN5c3RlbV9fIiwgdltpXS52YWx1ZSk7Ci0KLQkgIC8qIElmIHRoZSBzdWJzeXN0ZW0gaXMgd2luZG93cywgd2UgdXNlIGEgZGlmZmVyZW50IGVudHJ5Ci0JICAgICBwb2ludC4gIFdlIGFsc28gcmVnaXN0ZXIgdGhlIGVudHJ5IHBvaW50IGFzIGFuIHVuZGVmaW5lZAotCSAgICAgc3ltYm9sLiBmcm9tIGxhbmdfYWRkX2VudHJ5KCkgVGhlIHJlYXNvbiB3ZSBkbwotCSAgICAgdGhpcyBpcyBzbyB0aGF0IHRoZSB1c2VyCi0JICAgICBkb2Vzbid0IGhhdmUgdG8gYmVjYXVzZSB0aGV5IHdvdWxkIGhhdmUgdG8gdXNlIHRoZSAtdQotCSAgICAgc3dpdGNoIGlmIHRoZXkgd2VyZSBzcGVjaWZ5aW5nIGFuIGVudHJ5IHBvaW50IG90aGVyIHRoYW4KLQkgICAgIF9tYWluQ1JUU3RhcnR1cC4gIFNwZWNpZmljYWxseSwgaWYgY3JlYXRpbmcgYSB3aW5kb3dzCi0JICAgICBhcHBsaWNhdGlvbiwgZW50cnkgcG9pbnQgX1dpbk1haW5DUlRTdGFydHVwIG11c3QgYmUKLQkgICAgIHNwZWNpZmllZC4gIFdoYXQgSSBoYXZlIGZvdW5kIGZvciBub24gY29uc29sZQotCSAgICAgYXBwbGljYXRpb25zIChlbnRyeSBub3QgX21haW5DUlRTdGFydHVwKSBpcyB0aGF0IHRoZSAub2JqCi0JICAgICB0aGF0IGNvbnRhaW5zIG1haW5DUlRTdGFydHVwIGlzIGJyb3VnaHQgaW4gc2luY2UgaXQgaXMKLQkgICAgIHRoZSBmaXJzdCBlbmNvdW50ZXJlZCBpbiBsaWJjLmxpYiBhbmQgaXQgaGFzIG90aGVyCi0JICAgICBzeW1ib2xzIGluIGl0IHdoaWNoIHdpbGwgYmUgcHVsbGVkIGluIGJ5IHRoZSBsaW5rCi0JICAgICBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgYWRkaW5nIC11IHdpdGggdGhlIGVudHJ5IHBvaW50Ci0JICAgICBuYW1lIHNwZWNpZmllZCBmb3JjZXMgdGhlIGNvcnJlY3QgLm9iaiB0byBiZSB1c2VkLiAgV2UKLQkgICAgIGNhbiBhdm9pZCBtYWtpbmcgdGhlIHVzZXIgZG8gdGhpcyBieSBhbHdheXMgYWRkaW5nIHRoZQotCSAgICAgZW50cnkgcG9pbnQgbmFtZSBhcyBhbiB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLQkgIGxhbmdfYWRkX2VudHJ5ICh2W2ldLmVudHJ5LCAxKTsKLQotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVpbmZvICgiJVAlRjogaW52YWxpZCBzdWJzeXN0ZW0gdHlwZSAlc1xuIiwgb3B0YXJnKTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfdmFsdWUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIAotewotICBjaGFyICplbmQ7Ci0gIHNldF9wZV9uYW1lIChuYW1lLCAgc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKSk7Ci0gIGlmIChlbmQgPT0gb3B0YXJnKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVAlRjogaW52YWxpZCBoZXggbnVtYmVyIGZvciBQRSBwYXJhbWV0ZXIgJyVzJ1xuIiwgb3B0YXJnKTsKLSAgICB9Ci0KLSAgb3B0YXJnID0gZW5kOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX3N0YWNrX2hlYXAgKHJlc25hbWUsIGNvbW5hbWUpCi0gICAgIGNoYXIgKnJlc25hbWU7Ci0gICAgIGNoYXIgKmNvbW5hbWU7Ci17Ci0gIHNldF9wZV92YWx1ZSAocmVzbmFtZSk7Ci0gIGlmICgqb3B0YXJnID09ICcsJykKLSAgICB7Ci0gICAgICBvcHRhcmcrKzsKLSAgICAgIHNldF9wZV92YWx1ZSAoY29tbmFtZSk7Ci0gICAgfQotICBlbHNlIGlmICgqb3B0YXJnKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVAlRjogc3RyYW5nZSBoZXggaW5mbyBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIsIG9wdGFyZyk7Ci0gICAgfQotfQotCi0KLQotc3RhdGljIGludAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgbG9uZ2luZDsKLSAgaW50IG9wdGM7Ci0gIGludCBwcmV2b3B0aW5kID0gb3B0aW5kOwotICBpbnQgcHJldm9wdGVyciA9IG9wdGVycjsKLSAgaW50IHdhbnRlcnJvcjsKLSAgc3RhdGljIGludCBsYXN0b3B0aW5kID0gLTE7Ci0KLSAgaWYgKGxhc3RvcHRpbmQgIT0gb3B0aW5kKQotICAgIG9wdGVyciA9IDA7Ci0gIHdhbnRlcnJvciA9IG9wdGVycjsKLQotICBsYXN0b3B0aW5kID0gb3B0aW5kOwotCi0gIG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLSIsIGxvbmdvcHRzLCAmbG9uZ2luZCk7Ci0gIG9wdGVyciA9IHByZXZvcHRlcnI7Ci0KLSAgc3dpdGNoIChvcHRjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHdhbnRlcnJvcikKLQl4ZXhpdCAoMSk7Ci0gICAgICBvcHRpbmQgPSAgcHJldm9wdGluZDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBPUFRJT05fQkFTRV9GSUxFOgotICAgICAgbGlua19pbmZvLmJhc2VfZmlsZSA9IChQVFIpIGZvcGVuIChvcHRhcmcsIEZPUEVOX1dCKTsKLSAgICAgIGlmIChsaW5rX2luZm8uYmFzZV9maWxlID09IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IENhbid0IG9wZW4gYmFzZSBmaWxlICVzXG4iLAotCQkgICBwcm9ncmFtX25hbWUsIG9wdGFyZyk7Ci0JICB4ZXhpdCAoMSk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFBFIG9wdGlvbnMgKi8KLSAgICBjYXNlIE9QVElPTl9IRUFQOiAKLSAgICAgIHNldF9wZV9zdGFja19oZWFwICgiX19zaXplX29mX2hlYXBfcmVzZXJ2ZV9fIiwgIl9fc2l6ZV9vZl9oZWFwX2NvbW1pdF9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9TVEFDSzogCi0gICAgICBzZXRfcGVfc3RhY2tfaGVhcCAoIl9fc2l6ZV9vZl9zdGFja19yZXNlcnZlX18iLCAiX19zaXplX29mX3N0YWNrX2NvbW1pdF9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9TVUJTWVNURU06Ci0gICAgICBzZXRfcGVfc3Vic3lzdGVtICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUFKT1JfT1NfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWFqb3Jfb3NfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NSU5PUl9PU19WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19taW5vcl9vc192ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19tYWpvcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWFqb3JfaW1hZ2VfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NSU5PUl9JTUFHRV9WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19taW5vcl9pbWFnZV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0ZJTEVfQUxJR05NRU5UOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19maWxlX2FsaWdubWVudF9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVDoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fc2VjdGlvbl9hbGlnbm1lbnRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRExMOgotICAgICAgc2V0X3BlX25hbWUgKCJfX2RsbF9fIiwgMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9JTUFHRV9CQVNFOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19pbWFnZV9iYXNlX18iKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0MCi0vKiBBc3NpZ24gdmFsdWVzIHRvIHRoZSBzcGVjaWFsIHN5bWJvbHMgYmVmb3JlIHRoZSBsaW5rZXIgc2NyaXB0IGlzCi0gICByZWFkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scygpCi17Ci0gIC8qIFJ1biB0aHJvdWdoIGFuZCBpbnZlbnQgc3ltYm9scyBmb3IgYWxsIHRoZQotICAgICBuYW1lcyBhbmQgaW5zZXJ0IHRoZSBkZWZhdWx0cy4gKi8KLSAgaW50IGo7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqc2F2ZTsKLQotICBpZiAoIWluaXRbSU1BR0VCQVNFT0ZGXS5pbml0ZWQpCi0gICAgewotICAgICAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gMDsKLSAgICAgIGVsc2UgaWYgKGluaXRbRExMT0ZGXS52YWx1ZSkKLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSBCRU9TX0RMTF9JTUFHRV9CQVNFOwotICAgICAgZWxzZQotCWluaXRbSU1BR0VCQVNFT0ZGXS52YWx1ZSA9IEJFT1NfRVhFX0lNQUdFX0JBU0U7Ci0gICAgfQotCi0gIC8qIERvbid0IGRvIGFueSBzeW1ib2wgYXNzaWdubWVudHMgaWYgdGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdsdWUgdGhlIGFzc2lnbm1lbnRzIGludG8gdGhlIGFicyBzZWN0aW9uICovCi0gIHNhdmUgPSBzdGF0X3B0cjsKLQotICBzdGF0X3B0ciA9ICYoYWJzX291dHB1dF9zZWN0aW9uLT5jaGlsZHJlbik7Ci0KLSAgZm9yIChqID0gMDsgaW5pdFtqXS5wdHI7IGorKykKLSAgICB7Ci0gICAgICBsb25nIHZhbCA9IGluaXRbal0udmFsdWU7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JyAsaW5pdFtqXS5zeW1ib2wsIGV4cF9pbnRvcCAodmFsKSkpOwotICAgICAgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2Yoc2hvcnQpKQotCSooc2hvcnQgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YoaW50KSkKLQkqKGludCAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihsb25nKSkKLQkqKGxvbmcgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIC8qIFRoaXMgbWlnaHQgYmUgYSBsb25nIGxvbmcgb3Igb3RoZXIgc3BlY2lhbCB0eXBlLiAgKi8KLSAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YoYmZkX3ZtYSkpCi0JKihiZmRfdm1hICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICBlbHNlCWFib3J0KCk7Ci0gICAgfQotICAvKiBSZXN0b3JlIHRoZSBwb2ludGVyLiAqLwotICBzdGF0X3B0ciA9IHNhdmU7Ci0gIAotICBpZiAocGUuRmlsZUFsaWdubWVudCA+Ci0gICAgICBwZS5TZWN0aW9uQWxpZ25tZW50KQotICAgIHsKLSAgICAgIGVpbmZvICgiJVA6IHdhcm5pbmcsIGZpbGUgYWxpZ25tZW50ID4gc2VjdGlvbiBhbGlnbm1lbnQuXG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbigpCi17Ci0gIC8qIFBhc3MgdGhlIHdhY2t5IFBFIGNvbW1hbmQgbGluZSBvcHRpb25zIGludG8gdGhlIG91dHB1dCBiZmQuCi0gICAgIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBkb25lIHZpYSBhIGZ1bmN0aW9uLCByYXRoZXIgdGhhbiBieQotICAgICBpbmNsdWRpbmcgYW4gaW50ZXJuYWwgQkZEIGhlYWRlci4gICovCi0gIGlmICghY29mZl9kYXRhKG91dHB1dF9iZmQpLT5wZSkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVGJVA6IFBFIG9wZXJhdGlvbnMgb24gbm9uIFBFIGZpbGUuXG4iKTsKLSAgICB9Ci0KLSAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyID0gcGU7Ci0gIHBlX2RhdGEob3V0cHV0X2JmZCktPmRsbCA9IGluaXRbRExMT0ZGXS52YWx1ZTsKLQotfQotDAotLyogQ2FsbGJhY2sgZnVuY3Rpb25zIGZvciBxc29ydCBpbiBzb3J0X3NlY3Rpb25zLiAqLwotCi1zdGF0aWMgaW50Ci1zb3J0X2J5X2ZpbGVfbmFtZSAoYSwgYikKLSAgICAgdm9pZCAqYTsKLSAgICAgdm9pZCAqYjsKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnJhID0gYTsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnJiID0gYjsKLSAgaW50IGksIGFfc2VjLCBiX3NlYzsKLQotICBpID0gc3RyY21wICgoKnJhKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZC0+bXlfYXJjaGl2ZS0+ZmlsZW5hbWUsCi0JICAgICAgKCpyYiktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQtPm15X2FyY2hpdmUtPmZpbGVuYW1lKTsKLSAgaWYgKGkgIT0gMCkKLSAgICByZXR1cm4gaTsKLQotICBpID0gc3RyY21wICgoKnJhKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+ZmlsZW5hbWUsCi0JCSAoKnJiKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+ZmlsZW5hbWUpOwotICBpZiAoaSAhPSAwKQotICAgIHJldHVybiBpOwotICAvKiB0aGUgdGFpbCBpZGF0YTQvNSBhcmUgdGhlIG9ubHkgb25lcyB3aXRob3V0IHJlbG9jcyB0byBhbgotICAgICBpZGF0YSQ2IHNlY3Rpb24gdW5sZXNzIHdlIGFyZSBpbXBvcnRpbmcgYnkgb3JkaW5hbCwgCi0gICAgIHNvIHNvcnQgdGhlbSB0byBsYXN0IHRvIHRlcm1pbmF0ZSB0aGUgSUFUCi0gICAgIGFuZCBITlQgcHJvcGVybHkuIGlmIG5vIHJlbG9jIHRoaXMgb25lIGlzIGltcG9ydCBieSBvcmRpbmFsCi0gICAgIHNvIHdlIGhhdmUgdG8gc29ydCBieSBzZWN0aW9uIGNvbnRlbnRzICovCi0KLSAgaWYgKCAoKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+cmVsb2NfY291bnQgKyAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCkgKQotICAgIHsKLSAgICAgICBpID0gICgoKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+cmVsb2NfY291bnQgPiAKLQkJICgqcmIpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50KSA/IC0xIDogMCk7Ci0gICAgICAgaWYgKCBpICE9IDApCi0gICAgICAgICByZXR1cm4gaTsKLQotICAgICAgICByZXR1cm4gICgoKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+cmVsb2NfY291bnQgPiAKLQkJICgqcmIpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50KSA/IDAgOiAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAgaWYgKCAoc3RyY21wKCAoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5uYW1lLCAiLmlkYXRhJDYiKSA9PSAwKSApCi0gICAgICAgICAgcmV0dXJuIDA7IC8qIGRvbid0IHNvcnQgLmlkYXRhJDYgb3IgLmlkYXRhJDcgRklYTUUgZGxsdG9vbCBlbGltaW5hdGUgLmlkYXRhJDcgKi8KLQotICAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoKCpyYSktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQsIAotICAgICAgICAgKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiwgJmFfc2VjLCAoZmlsZV9wdHIpIDAsIChiZmRfc2l6ZV90eXBlKXNpemVvZihhX3NlYykpKQotICAgICAgICAgICAgZWluZm8gKCIlRiVCOiBDYW4ndCByZWFkIGNvbnRlbnRzIG9mIHNlY3Rpb24gLmlkYXRhOiAlRVxuIiwKLSAgICAgICAgICAgICAgICAgKCpyYSktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQpOwotCi0gICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzICgoKnJiKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZCwgCi0gICAgICAgICgqcmIpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24sICZiX3NlYywgKGZpbGVfcHRyKSAwLCAoYmZkX3NpemVfdHlwZSlzaXplb2YoYl9zZWMpICkpCi0gICAgICAgICAgIGVpbmZvICgiJUYlQjogQ2FuJ3QgcmVhZCBjb250ZW50cyBvZiBzZWN0aW9uIC5pZGF0YTogJUVcbiIsCi0gICAgICAgICAgICAgICAgKCpyYiktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQpOwotCi0gICAgICBpID0gICgoYV9zZWMgPCBiX3NlYykgPyAtMSA6IDApOwotICAgICAgaWYgKCBpICE9IDApCi0gICAgICAgIHJldHVybiBpOwotICAgICAgcmV0dXJuICAoKGFfc2VjIDwgYl9zZWMpID8gMCA6IDEpOwotICAgfQotcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXNvcnRfYnlfc2VjdGlvbl9uYW1lIChhLCBiKQotICAgICB2b2lkICphOwotICAgICB2b2lkICpiOwotewotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcmEgPSBhOwotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcmIgPSBiOwotICBpbnQgaTsKLSAgaSA9IHN0cmNtcCAoKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+bmFtZSwKLQkJICgqcmIpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPm5hbWUpOwotLyogdGhpcyBpcyBhIGhhY2sgdG8gbWFrZSAuc3RhYiBhbmQgLnN0YWJzdHIgbGFzdCwgc28gd2UgZG9uJ3QgaGF2ZQotICAgdG8gZml4IHN0cmlwL29iamNvcHkgZm9yIC5yZWxvYyBzZWN0aW9ucy4KLSAgIEZJWE1FIHN0cmlwcGluZyBpbWFnZXMgd2l0aCBhIC5yc3JjIHNlY3Rpb24gc3RpbGwgbmVlZHMgdG8gYmUgZml4ZWQgKi8KLSAgaWYgKCBpICE9IDApCi0gICAgewotICAgICAgaWYgKChzdHJuY21wICgoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5uYW1lLCAiLnN0YWIiLCA1KSA9PSAwKQotICAgICAgICAgICAmJiAoc3RybmNtcCAoKCpyYiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+bmFtZSwgIi5zdGFiIiwgNSkgIT0gMCkpCi0gICAgICAgICByZXR1cm4gMTsKLSAgICAgIHJldHVybiBpOwotICAgIH0KLSAgcmV0dXJuIGk7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2Ygc29ydF9zZWN0aW9ucyB0byBhIGNvbnRpZ3VvdXMgc3Vic2V0IG9mIGEgbGlzdCBvZiBzZWN0aW9ucy4KLSAgIE5FWFRfQUZURVIgaXMgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGxhc3Qgb25lIHRvIHNvcnQuCi0gICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgbGFzdCBlbGVtZW50J3MgIm5leHQiIHBvaW50ZXIuICAqLwotCi1zdGF0aWMgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKgotc29ydF9zZWN0aW9uc18xIChzdGFydHB0ciwgbmV4dF9hZnRlciwgY291bnQsIHNvcnRfZnVuYykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnN0YXJ0cHRyLCpuZXh0X2FmdGVyOwotICAgICBpbnQgY291bnQ7Ci0gICAgIGludCAoKnNvcnRfZnVuYykgKCk7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKip2ZWM7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnA7Ci0gIGludCBpOwotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcmV0OwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiBzdGFydHB0cjsKLQotICB2ZWMgPSAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiopCi0JIHhtYWxsb2MgKGNvdW50ICogc2l6ZW9mIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKSk7Ci0KLSAgZm9yIChwID0gKnN0YXJ0cHRyLCBpID0gMDsgaSA8IGNvdW50OyBpKyssIHAgPSBwLT5uZXh0KQotICAgIHZlY1tpXSA9IHA7Ci0KLSAgcXNvcnQgKHZlYywgY291bnQsIHNpemVvZiAodmVjWzBdKSwgc29ydF9mdW5jKTsKLQotICAvKiBGaWxsIGluIHRoZSBuZXh0IHBvaW50ZXJzIGFnYWluLiAqLwotICAqc3RhcnRwdHIgPSB2ZWNbMF07Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudCAtIDE7IGkrKykKLSAgICB2ZWNbaV0tPmhlYWRlci5uZXh0ID0gdmVjW2kgKyAxXTsKLSAgdmVjW2ldLT5oZWFkZXIubmV4dCA9IG5leHRfYWZ0ZXI7Ci0gIHJldCA9ICZ2ZWNbaV0tPmhlYWRlci5uZXh0OwotICBmcmVlICh2ZWMpOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBTb3J0IHRoZSAuaWRhdGFcJGZvbyBpbnB1dCBzZWN0aW9ucyBvZiBhcmNoaXZlcyBpbnRvIGZpbGVuYW1lIG9yZGVyLgotICAgVGhlIHJlYXNvbiBpcyBzbyBkbGx0b29sIGNhbiBhcnJhbmdlIHRvIGhhdmUgdGhlIHBlIGRsbCBpbXBvcnQgaW5mb3JtYXRpb24KLSAgIGdlbmVyYXRlZCBjb3JyZWN0bHkgLSB0aGUgaGVhZCBvZiB0aGUgbGlzdCBnb2VzIGludG8gZGgubywgdGhlIHRhaWwgaW50bwotICAgZHQubywgYW5kIHRoZSBndXRzIGludG8gZHNbbm5ubl0uby4gIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciB0aGUKLSAgIC5pZGF0YSBzZWN0aW9uLgotICAgRklYTUU6IFRoaXMgbWF5IG5vIGxvbmdlciBiZSBuZWNlc3Nhcnkgd2l0aCBncm91cGVkIHNlY3Rpb25zLiAgSW5zdGVhZCBvZgotICAgc29ydGluZyBvbiBkaC5vLCBkc1tubm5uXS5vLCBkdC5vLCBvbmUgY291bGQsIGZvciBleGFtcGxlLCBoYXZlIGRoLm8gdXNlCi0gICAuaWRhdGFcJDRoLCBoYXZlIGRzW25ubm5dLm8gdXNlIC5pZGF0YVwkNHNbbm5ubl0sIGFuZCBoYXZlIGR0Lm8gdXNlIC5pZGF0YVwkNHQuCi0gICBUaGlzIHdvdWxkIGhhdmUgdG8gYmUgZWxhYm9yYXRlZCB1cG9uIHRvIGhhbmRsZSBtdWx0aXBsZSBkbGwncwotICAgW2Fzc3VtaW5nIHN1Y2ggYW4gZWxvYm9yYXRpb24gaXMgcG9zc2libGUgb2YgY291cnNlXS4KLQotICAgV2UgYWxzbyBzb3J0IHNlY3Rpb25zIGluICdcJCcgd2lsZCBzdGF0ZW1lbnRzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYnkgdGhlCi0gICBwbGFjZV9vcnBoYW5zIHJvdXRpbmUgdG8gaW1wbGVtZW50IGdyb3VwZWQgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotc29ydF9zZWN0aW9ucyAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgZm9yICg7IHMgOyBzID0gcy0+bmV4dCkKLSAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotICAgICAgewotICAgICAgY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgotCXNvcnRfc2VjdGlvbnMgKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkKTsKLQlicmVhazsKLSAgICAgIGNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCXsKLQkgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwID0gJnMtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQ7Ci0KLQkgIC8qIElzIHRoaXMgdGhlIC5pZGF0YSBzZWN0aW9uPyAgKi8KLQkgIGlmIChzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUgIT0gTlVMTAotCSAgICAgICYmIHN0cm5jbXAgKHMtPndpbGRfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSwgIi5pZGF0YSIsIDYpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBTb3J0IHRoZSBjaGlsZHJlbi4gIFdlIHdhbnQgdG8gc29ydCBhbnkgb2JqZWN0cyBpbgotICAgICAgICAgICAgICAgICB0aGUgc2FtZSBhcmNoaXZlLiAgSW4gb3JkZXIgdG8gaGFuZGxlIHRoZSBjYXNlIG9mCi0gICAgICAgICAgICAgICAgIGluY2x1ZGluZyBhIHNpbmdsZSBhcmNoaXZlIG11bHRpcGxlIHRpbWVzLCB3ZSBzb3J0Ci0gICAgICAgICAgICAgICAgIGFsbCB0aGUgY2hpbGRyZW4gYnkgYXJjaGl2ZSBuYW1lIGFuZCB0aGVuIGJ5IG9iamVjdAotICAgICAgICAgICAgICAgICBuYW1lLiAgQWZ0ZXIgc29ydGluZyB0aGVtLCB3ZSByZS10aHJlYWQgdGhlIHBvaW50ZXIKLSAgICAgICAgICAgICAgICAgY2hhaW4uICAqLwotCi0JICAgICAgd2hpbGUgKCpwKQotCQl7Ci0JCSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqc3RhcnQgPSAqcDsKLQkJICBpZiAoc3RhcnQtPmhlYWRlci50eXBlICE9IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtCi0JCSAgICAgIHx8ICFzdGFydC0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZC0+bXlfYXJjaGl2ZSkKLQkJICAgIHAgPSAmKHN0YXJ0LT5oZWFkZXIubmV4dCk7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICplbmQ7Ci0JCSAgICAgIGludCBjb3VudDsKLQotCQkgICAgICBmb3IgKGVuZCA9IHN0YXJ0LCBjb3VudCA9IDA7Ci0JCQkgICBlbmQgJiYgZW5kLT5oZWFkZXIudHlwZSA9PSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bTsKLQkJCSAgIGVuZCA9IGVuZC0+bmV4dCkKLQkJCWNvdW50Kys7Ci0KLQkJICAgICAgcCA9IHNvcnRfc2VjdGlvbnNfMSAocCwgZW5kLCBjb3VudCwgc29ydF9ieV9maWxlX25hbWUpOwotCQkgICAgfQotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgZ3JvdXBlZCBzZWN0aW9ucywgc29ydCB0aGVtLgotCSAgICAgVGhlIGxpbmtlciBzY3JpcHQgbXVzdCBleHBsaWNpdGx5IG1lbnRpb24gIiooLmZvb1wkKSIgb3IKLQkgICAgICIqKC5mb29cJCopIi4gIERvbid0IHNvcnQgdGhlbSBpZiBcJCBpcyBub3QgdGhlIGxhc3QKLQkgICAgIGNoYXJhY3RlciAobm90IHN1cmUgaWYgdGhpcyBpcyByZWFsbHkgdXNlZnVsLCBidXQgaXQKLQkgICAgIGFsbG93cyBleHBsaWNpdGx5IG1lbnRpb25pbmcgc29tZSBcJCBzZWN0aW9ucyBhbmQgbGV0dGluZwotCSAgICAgdGhlIGxpbmtlciBoYW5kbGUgdGhlIHJlc3QpLiAgKi8KLQkgIGlmIChzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNoYXIgKnEgPSBzdHJjaHIgKHMtPndpbGRfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSwgJ1wkJyk7Ci0KLQkgICAgICBpZiAocSAhPSBOVUxMCi0JCSAgJiYgKHFbMV0gPT0gJ1wwJwotCQkgICAgICB8fCAocVsxXSA9PSAnKicgJiYgcVsyXSA9PSAnXDAnKSkpCi0JCXsKLQkJICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICplbmQ7Ci0JCSAgaW50IGNvdW50OwotCi0JCSAgZm9yIChlbmQgPSAqcCwgY291bnQgPSAwOyBlbmQ7IGVuZCA9IGVuZC0+bmV4dCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGVuZC0+aGVhZGVyLnR5cGUgIT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0pCi0JCQlhYm9ydCAoKTsKLQkJICAgICAgY291bnQrKzsKLQkJICAgIH0KLQkJICAodm9pZCkgc29ydF9zZWN0aW9uc18xIChwLCBlbmQsIGNvdW50LCBzb3J0X2J5X3NlY3Rpb25fbmFtZSk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkICAKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbigpCi17Ci0gIGV4dGVybiBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnN0YXRfcHRyOwotCi0jaWZkZWYgVEFSR0VUX0lTX3BwY3BlCi0gIC8qIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgdG9jIGluZm9ybWF0aW9uICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCFwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbihpcy0+dGhlX2JmZCwgJmxpbmtfaW5mbykpCi0JICB7Ci0JICAgIGVpbmZvKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzXG4iLCBpcy0+ZmlsZW5hbWUpOwotCSAgfQotICAgICAgfQotICB9Ci0KLSAgLyogV2UgaGF2ZSBzZWVuIGl0IGFsbC4gQWxsb2NhdGUgaXQsIGFuZCBjYXJyeSBvbiAqLwotICBwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24gKCZsaW5rX2luZm8pOwotI2Vsc2UKLSNpZmRlZiBUQVJHRVRfSVNfYXJtcGUKLSAgLyogRklYTUU6IHdlIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJ3b3JraW5nIHN0dWIKLSAgICAgc2VjdGlvbi4KLQotICAgICBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IGdsdWUKLSAgICAgaW5mb3JtYXRpb24uICBGSVhNRTogc2hvdWxkIHRoaXMgYmUgYmFzZWQgb24gYSBjb21tYW5kIGxpbmUKLSAgICAgb3B0aW9uPyAga3JrQGN5Z251cy5jb20gKi8KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoIWFybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8pKQotCSAgewotCSAgICBlaW5mbyAoIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMiLCBpcy0+ZmlsZW5hbWUpOwotCSAgfQotICAgICAgfQotICB9Ci0KLSAgLyogV2UgaGF2ZSBzZWVuIGl0IGFsbC4gQWxsb2NhdGUgaXQsIGFuZCBjYXJyeSBvbiAqLwotICBhcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7Ci0jZW5kaWYgLyogVEFSR0VUX0lTX2FybXBlICovCi0jZW5kaWYgLyogVEFSR0VUX0lTX3BwY3BlICovCi0KLSAgc29ydF9zZWN0aW9ucyAoc3RhdF9wdHItPmhlYWQpOwotfQotDAotLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uICBXZSB1c2UgdGhpcyB0byBwdXQgc2VjdGlvbnMgd2l0aCBhICdcJCcgaW4gdGhlbQotICAgaW50byB0aGUgcmlnaHQgcGxhY2UuICBBbnkgc2VjdGlvbiB3aXRoIGEgJ1wkJyBpbiB0aGVtIChlLmcuIC50ZXh0XCRmb28pCi0gICBnZXRzIG1hcHBlZCB0byB0aGUgb3V0cHV0IHNlY3Rpb24gd2l0aCBldmVyeXRoaW5nIGZyb20gdGhlICdcJCcgb24gc3RyaXBwZWQKLSAgIChlLmcuIC50ZXh0KS4KLSAgIFNlZSB0aGUgTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQKLSAgIFNwZWNpZmljYXRpb24gNC4xLCBzZWN0aW9uIDQuMiwgR3JvdXBlZCBTZWN0aW9ucy4KLQotICAgRklYTUU6IFRoaXMgaXMgbm93IGhhbmRsZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQgdXNpbmcgd2lsZGNhcmRzLAotICAgYnV0IEknbSBsZWF2aW5nIHRoaXMgaGVyZSBpbiBjYXNlIHdlIHdhbnQgdG8gZW5hYmxlIGl0IGZvciBzZWN0aW9ucwotICAgd2hpY2ggYXJlIG5vdCBtZW50aW9uZWQgaW4gdGhlIGxpbmtlciBzY3JpcHQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICBjb25zdCBjaGFyICpzZWNuYW1lOwotICBjaGFyICpvdXRwdXRfc2VjbmFtZSwgKnBzOwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqbDsKLQotICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBEb24ndCBwcm9jZXNzIGdyb3VwZWQgc2VjdGlvbnMgdW5sZXNzIGRvaW5nIGEgZmluYWwgbGluay4KLSAgICAgSWYgdGhleSdyZSBtYXJrZWQgYXMgQ09NREFUIHNlY3Rpb25zLCB3ZSBkb24ndCB3YW50IC50ZXh0XCRmb28gdG8KLSAgICAgZW5kIHVwIGluIC50ZXh0IGFuZCB0aGVuIGhhdmUgLnRleHQgZGlzYXBwZWFyIGJlY2F1c2UgaXQncyBtYXJrZWQKLSAgICAgbGluay1vbmNlLWRpc2NhcmQuICAqLwotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzLT5vd25lciwgcyk7Ci0KLSAgLyogRXZlcnl0aGluZyBmcm9tIHRoZSAnXCQnIG9uIGdldHMgZGVsZXRlZCBzbyBkb24ndCBhbGxvdyAnXCQnIGFzIHRoZQotICAgICBmaXJzdCBjaGFyYWN0ZXIuICAqLwotICBpZiAoKnNlY25hbWUgPT0gJ1wkJykKLSAgICBlaW5mbyAoIiVQJUY6IHNlY3Rpb24gJXMgaGFzICdcJCcgYXMgZmlyc3QgY2hhcmFjdGVyXG4iLCBzZWNuYW1lKTsKLSAgaWYgKHN0cmNociAoc2VjbmFtZSArIDEsICdcJCcpID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIExvb2sgdXAgdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhlIE1pY3Jvc29mdCBzcGVjcyBzYXkgc2VjdGlvbnMgbmFtZXMgaW4KLSAgICAgaW1hZ2UgZmlsZXMgbmV2ZXIgY29udGFpbiBhICdcJCcuICBGb3J0dW5hdGVseSwgbGFuZ18uLi5fbG9va3VwIGNyZWF0ZXMKLSAgICAgdGhlIHNlY3Rpb24gaWYgaXQgZG9lc24ndCBleGlzdC4gICovCi0gIG91dHB1dF9zZWNuYW1lID0gYnV5c3RyaW5nIChzZWNuYW1lKTsKLSAgcHMgPSBzdHJjaHIgKG91dHB1dF9zZWNuYW1lICsgMSwgJ1wkJyk7Ci0gICpwcyA9IDA7Ci0gIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChvdXRwdXRfc2VjbmFtZSk7Ci0KLSAgLyogRmluZCB0aGUgJ1wkJyB3aWxkIHN0YXRlbWVudCBmb3IgdGhpcyBzZWN0aW9uLiAgV2UgY3VycmVudGx5IHJlcXVpcmUgdGhlCi0gICAgIGxpbmtlciBzY3JpcHQgdG8gZXhwbGljaXRseSBtZW50aW9uICIqKC5mb29cJCkiLgotICAgICBGSVhNRTogcHBjcGUuc2MgaGFzIC5DUlRcJGZvbyBpbiB0aGUgLnJkYXRhIHNlY3Rpb24uICBBY2NvcmRpbmcgdG8gdGhlCi0gICAgIE1pY3Jvc29mdCBkb2NzIHRoaXMgaXNuJ3QgY29ycmVjdCBzbyBpdCdzIG5vdCAoY3VycmVudGx5KSBoYW5kbGVkLiAgKi8KLQotICBwc1swXSA9ICdcJCc7Ci0gIHBzWzFdID0gMDsKLSAgZm9yIChsID0gb3MtPmNoaWxkcmVuLmhlYWQ7IGw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT5oZWFkZXIudHlwZSA9PSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW0KLQkgICYmIHN0cmNtcCAobC0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLCBvdXRwdXRfc2VjbmFtZSkgPT0gMCkKLQlicmVhazsKLSAgICB9Ci0gIHBzWzBdID0gMDsKLSAgaWYgKGwgPT0gTlVMTCkKLSNpZiAxCi0gICAgZWluZm8gKCIlUCVGOiAqKCVzXCQpIG1pc3NpbmcgZnJvbSBsaW5rZXIgc2NyaXB0XG4iLCBvdXRwdXRfc2VjbmFtZSk7Ci0jZWxzZSAvKiBGSVhNRTogVGhpcyBibG9jayBpcyB1bnRyaWVkLiAgSXQgZXhpc3RzIHRvIGNvbnZleSB0aGUgaW50ZW50LAotCSBzaG91bGQgb25lIGRlY2lkZSB0byBub3QgcmVxdWlyZSAqKC5mb29cJCkgdG8gYXBwZWFyIGluIHRoZSBsaW5rZXIKLQkgc2NyaXB0LiAgKi8KLSAgICB7Ci0gICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKm5ldyA9IG5ld19zdGF0IChsYW5nX3dpbGRfc3RhdGVtZW50LAotCQkJCQkJJm9zLT5jaGlsZHJlbik7Ci0gICAgICBuZXctPnNlY3Rpb25fbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAob3V0cHV0X3NlY25hbWUpICsgMik7Ci0gICAgICBzcHJpbnRmIChuZXctPnNlY3Rpb25fbmFtZSwgIiVzXCQiLCBvdXRwdXRfc2VjbmFtZSk7Ci0gICAgICBuZXctPmZpbGVuYW1lID0gTlVMTDsKLSAgICAgIGxhbmdfbGlzdF9pbml0ICgmbmV3LT5jaGlsZHJlbik7Ci0gICAgICBsID0gbmV3OwotICAgIH0KLSNlbmRpZgotCi0gIC8qIExpbmsgdGhlIGlucHV0IHNlY3Rpb24gaW4gYW5kIHdlJ3JlIGRvbmUgZm9yIG5vdy4KLSAgICAgVGhlIHNlY3Rpb25zIHN0aWxsIGhhdmUgdG8gYmUgc29ydGVkLCBidXQgdGhhdCBoYXMgdG8gd2FpdCB1bnRpbAotICAgICBhbGwgc3VjaCBzZWN0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkIGJ5IHVzLiAgVGhlIHNvcnRpbmcgaXMgZG9uZSBieQotICAgICBzb3J0X3NlY3Rpb25zLiAgKi8KLSAgd2lsZF9kb2l0ICgmbC0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4sIHMsIG9zLCBmaWxlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLXN0YXRpYyBjaGFyICoKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgTlVMTCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzLAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2VsZjMyLmVtIGIvbGQvZW11bHRlbXBsL2VsZjMyLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmZmNGQ4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9lbGYzMi5lbQorKysgL2Rldi9udWxsCkBAIC0xLDExODUgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotIyBUaGlzIGZpbGUgaXMgbm93IG1pc25hbWVkLCBiZWNhdXNlIGl0IHN1cHBvcnRzIGJvdGggMzIgYml0IGFuZCA2NCBiaXQKLSMgRUxGIGVtdWxhdGlvbnMuCi10ZXN0IC16ICIke0VMRlNJWkV9IiAmJiBFTEZTSVpFPTMyCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qICR7RUxGU0laRX0gYml0IEVMRiBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIEVMRiBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWFyY2hfZGlyc190eXBlICosIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2sKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbgotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9gZWNobyAke0FSQ0h9IHwgc2VkIC1lICdzLzouKi8vJ2A7Ci0gIGNvbmZpZy5keW5hbWljX2xpbmsgPSAke0RZTkFNSUNfTElOSy10cnVlfTsKLSAgY29uZmlnLmhhc19zaGFyZWQgPSBgaWYgdGVzdCAtbiAiJEdFTkVSQVRFX1NITElCX1NDUklQVCIgOyB0aGVuIGVjaG8gdHJ1ZSA7IGVsc2UgZWNobyBmYWxzZSA7IGZpYDsKLX0KLQotLyogVHJ5IHRvIG9wZW4gYSBkeW5hbWljIGFyY2hpdmUuICBUaGlzIGlzIHdoZXJlIHdlIGtub3cgdGhhdCBFTEYKLSAgIGR5bmFtaWMgbGlicmFyaWVzIGhhdmUgYW4gZXh0ZW5zaW9uIG9mIC5zbyAob3IgLnNsIG9uIG9kZGJhbGwgc3lzdGVtcwotICAgbGlrZSBocHV4KS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSAoYXJjaCwgc2VhcmNoLCBlbnRyeSkKLSAgICAgY29uc3QgY2hhciAqYXJjaDsKLSAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKnN0cmluZzsKLQotICBpZiAoISBlbnRyeS0+aXNfYXJjaGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsZW5hbWUgPSBlbnRyeS0+ZmlsZW5hbWU7Ci0KLSAgLyogVGhpcyBhbGxvY2F0ZXMgYSBmZXcgYnl0ZXMgdG9vIG1hbnkgd2hlbiBFWFRSQV9TSExJQl9FWFRFTlNJT04KLSAgICAgaXMgZGVmaW5lZCwgYnV0IGl0IGRvZXMgbm90IHNlZW0gd29ydGggdGhlIGhlYWRhY2hlIHRvIG9wdGltaXplCi0gICAgIGF3YXkgdGhvc2UgdHdvIGJ5dGVzIG9mIHNwYWNlLiAgKi8KLSAgc3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpCi0JCQkgICAgICsgc3RybGVuIChmaWxlbmFtZSkKLQkJCSAgICAgKyBzdHJsZW4gKGFyY2gpCi0jaWZkZWYgRVhUUkFfU0hMSUJfRVhURU5TSU9OCi0JCQkgICAgICsgc3RybGVuIChFWFRSQV9TSExJQl9FWFRFTlNJT04pCi0jZW5kaWYKLQkJCSAgICAgKyBzaXplb2YgIi9saWIuc28iKTsKLQotICBzcHJpbnRmIChzdHJpbmcsICIlcy9saWIlcyVzLnNvIiwgc2VhcmNoLT5uYW1lLCBmaWxlbmFtZSwgYXJjaCk7Ci0KLSNpZmRlZiBFWFRSQV9TSExJQl9FWFRFTlNJT04KLSAgLyogVHJ5IHRoZSAuc28gZXh0ZW5zaW9uIGZpcnN0LiAgSWYgdGhhdCBmYWlscyBidWlsZCBhIG5ldyBmaWxlbmFtZQotICAgICB1c2luZyBFWFRSQV9TSExJQl9FWFRFTlNJT04uICAqLwotICBpZiAoISBsZGZpbGVfdHJ5X29wZW5fYmZkIChzdHJpbmcsIGVudHJ5KSkKLSAgICBzcHJpbnRmIChzdHJpbmcsICIlcy9saWIlcyVzJXMiLCBzZWFyY2gtPm5hbWUsCi0JICAgICBmaWxlbmFtZSwgYXJjaCwgRVhUUkFfU0hMSUJfRVhURU5TSU9OKTsKLSNlbmRpZgotCi0gIGlmICghIGxkZmlsZV90cnlfb3Blbl9iZmQgKHN0cmluZywgZW50cnkpKQotICAgIHsKLSAgICAgIGZyZWUgKHN0cmluZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVudHJ5LT5maWxlbmFtZSA9IHN0cmluZzsKLQotICAvKiBXZSBoYXZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgdG8gaW5jbHVkZSBpbiB0aGUgbGluay4gIFRoZSBFTEYKLSAgICAgYmFja2VuZCBsaW5rZXIgd2lsbCBjcmVhdGUgYSBEVF9ORUVERUQgZW50cnkgaW4gdGhlIC5keW5hbWljCi0gICAgIHNlY3Rpb24gbmFtaW5nIHRoaXMgZmlsZS4gIElmIHRoaXMgZmlsZSBpbmNsdWRlcyBhIERUX1NPTkFNRQotICAgICBlbnRyeSwgaXQgd2lsbCBiZSB1c2VkLiAgT3RoZXJ3aXNlLCB0aGUgRUxGIGxpbmtlciB3aWxsIGp1c3QgdXNlCi0gICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAgRm9yIGFuIGFyY2hpdmUgZm91bmQgYnkgc2VhcmNoaW5nLCBsaWtlCi0gICAgIHRoaXMgb25lLCB0aGUgRFRfTkVFREVEIGVudHJ5IHNob3VsZCBjb25zaXN0IG9mIGp1c3QgdGhlIG5hbWUgb2YKLSAgICAgdGhlIGZpbGUsIHdpdGhvdXQgdGhlIHBhdGggaW5mb3JtYXRpb24gdXNlZCB0byBmaW5kIGl0LiAgTm90ZQotICAgICB0aGF0IHdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGlmIHdlIGhhdmUgYSBkeW5hbWljIG9iamVjdDsgYW4KLSAgICAgYXJjaGl2ZSB3aWxsIG5ldmVyIGJlIHJlZmVyZW5jZWQgYnkgYSBEVF9ORUVERUQgZW50cnkuCi0KLSAgICAgRklYTUU6IFRoaXMgYXBwcm9hY2gtLXVzaW5nIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lLS1pcyBub3QKLSAgICAgdmVyeSBwcmV0dHkuICBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRoaW5rIG9mIGFueXRoaW5nIHRoYXQgaXMKLSAgICAgcHJldHR5LCB0aG91Z2guICAqLwotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZW50cnktPnRoZV9iZmQsIGJmZF9vYmplY3QpCi0gICAgICAmJiAoZW50cnktPnRoZV9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpuZWVkZWRfbmFtZTsKLQotICAgICAgQVNTRVJUIChlbnRyeS0+aXNfYXJjaGl2ZSAmJiBlbnRyeS0+c2VhcmNoX2RpcnNfZmxhZyk7Ci0KLSAgICAgIC8qIFJhdGhlciB0aGFuIGR1cGxpY2F0aW5nIHRoZSBsb2dpYyBhYm92ZS4gIEp1c3QgdXNlIHRoZQotCSBmaWxlbmFtZSB3ZSByZWNvcmRlZCBlYXJsaWVyLgotCi0JIEZpcnN0IHN0cmlwIG9mZiBldmVyeXRoaW5nIGJlZm9yZSB0aGUgbGFzdCAnLycuICAqLwotICAgICAgZmlsZW5hbWUgPSBzdHJyY2hyIChlbnRyeS0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBmaWxlbmFtZSsrOwotCi0gICAgICBuZWVkZWRfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZmlsZW5hbWUpICsgMSk7Ci0gICAgICBzdHJjcHkgKG5lZWRlZF9uYW1lLCBmaWxlbmFtZSk7Ci0gICAgICBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoZW50cnktPnRoZV9iZmQsIG5lZWRlZF9uYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+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+bmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotICAgIGhvbGRfcmVsID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuaW50ZXJwIikgPT0gMCkKLSAgICBob2xkX2ludGVycCA9IG9zOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotaWYgdGVzdCAtbiAiJEdFTkVSQVRFX1NITElCX1NDUklQVCIgOyB0aGVuCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnNoYXJlZCkgcmV0dXJuJwkJICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhzICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWZpCi0KLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlIGlmIChsaW5rX2luZm8uc2hhcmVkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhzIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgLW4gIiRQQVJTRV9BTkRfTElTVF9BUkdTIiA7IHRoZW4KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi1zdGF0aWMgaW50ICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMgUEFSQU1TICgoRklMRSAqIGZpbGUpKTsKLQotICRQQVJTRV9BTkRfTElTVF9BUkdTCi1FT0YKLWVsc2UKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSNkZWZpbmUgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgICBOVUxMCi0jZGVmaW5lIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMgTlVMTAotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIE5VTEwsIAkvKiBmaW5pc2ggKi8KLSAgTlVMTCwgCS8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4sCi0gIE5VTEwsCQkvKiBzZXRfc3ltYm9scyAqLwotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncywKLSAgTlVMTCwJCS8qIHVucmVjb2duaXplZF9maWxlICovCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMsCi0gIE5VTEwJCS8qIHJlY29nbml6ZWRfZmlsZSAqLwotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2dlbmVyaWMuZW0gYi9sZC9lbXVsdGVtcGwvZ2VuZXJpYy5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzZjUzMC4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvZ2VuZXJpYy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKCJgZWNobyAke0FSQ0h9YCIpOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IgotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2dsZDk2MC5lbSBiL2xkL2VtdWx0ZW1wbC9nbGQ5NjAuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYjRhZjAuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2dsZDk2MC5lbQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogCi0gKiBlbXVsYXRlIHRoZSBJbnRlbHMgcG9ydCBvZiAgZ2xkCi0gKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLQotI2lmZGVmIEdOVTk2MAotCi1zdGF0aWMgdm9pZAotZ2xkOTYwX2JlZm9yZV9wYXJzZSgpCi17Ci0gIHN0YXRpYyBjaGFyICplbnZfdmFyaWFibGVzW10gPSB7ICJHOTYwTElCIiwgIkc5NjBCQVNFIiwgMCB9OwotICBjaGFyICoqcDsKLSAgY2hhciAqZW52IDsKLQotICBmb3IgKCBwID0gZW52X3ZhcmlhYmxlczsgKnA7IHArKyApewotICAgIGVudiA9ICAoY2hhciAqKSBnZXRlbnYoKnApOwotICAgIGlmIChlbnYpIHsKLSAgICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChjb25jYXQgKGVudiwKLQkJCQkgICAgICAgIi9saWIvbGliYm91dCIsCi0JCQkJICAgICAgIChjb25zdCBjaGFyICopIE5VTEwpLAotCQkJICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gIH0KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9pOTYwOwotfQotCi0jZWxzZQkvKiBub3QgR05VOTYwICovCi0KLXN0YXRpYyB2b2lkIGdsZDk2MF9iZWZvcmVfcGFyc2UoKQotewotICBjaGFyICplbnYgOwotICBlbnYgPSAgZ2V0ZW52KCJHOTYwTElCIik7Ci0gIGlmIChlbnYpIHsKLSAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChlbnYsIGZhbHNlKTsKLSAgfQotICBlbnYgPSBnZXRlbnYoIkc5NjBCQVNFIik7Ci0gIGlmIChlbnYpCi0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGNvbmNhdCAoZW52LCAiL2xpYiIsIChjb25zdCBjaGFyICopIE5VTEwpLCBmYWxzZSk7Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLX0KLQotI2VuZGlmCS8qIEdOVTk2MCAqLwotCi0KLXN0YXRpYyB2b2lkCi1nbGQ5NjBfc2V0X291dHB1dF9hcmNoKCkKLXsKLSAgYmZkX3NldF9hcmNoX21hY2gob3V0cHV0X2JmZCwgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIGJmZF9tYWNoX2k5NjBfY29yZSk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZDk2MF9jaG9vc2VfdGFyZ2V0KCkKLXsKLSNpZmRlZiBHTlU5NjAKLQotICBvdXRwdXRfZmlsZW5hbWUgPSAiYi5vdXQiOwotICByZXR1cm4gYmZkX21ha2VfdGFyZ19uYW1lKEJGRF9CT1VUX0ZPUk1BVCwgMCk7Ci0KLSNlbHNlCi0KLSAgY2hhciAqZnJvbV9vdXRzaWRlID0gZ2V0ZW52KFRBUkdFVF9FTlZJUk9OKTsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gImIub3V0IjsKLQotICBpZiAoZnJvbV9vdXRzaWRlICE9IChjaGFyICopTlVMTCkKLSAgICByZXR1cm4gZnJvbV9vdXRzaWRlOwotCi0gIHJldHVybiAiYi5vdXQubGl0dGxlIjsKLQotI2VuZGlmCi19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZDk2MF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9nbGQ5NjBfZW11bGF0aW9uID0gCi17Ci0gIGdsZDk2MF9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGdsZDk2MF9zZXRfb3V0cHV0X2FyY2gsCi0gIGdsZDk2MF9jaG9vc2VfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQ5NjBfZ2V0X3NjcmlwdCwKLSAgIjk2MCIsCi0gICIiCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvZ2xkOTYwYy5lbSBiL2xkL2VtdWx0ZW1wbC9nbGQ5NjBjLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzg5YjIyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9nbGQ5NjBjLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIAotICogZW11bGF0ZSB0aGUgSW50ZWxzIHBvcnQgb2YgIGdsZAotICovCi0KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLQotI2lmZGVmIEdOVTk2MAotCi1zdGF0aWMgdm9pZAotZ2xkOTYwX2JlZm9yZV9wYXJzZSgpCi17Ci0gIHN0YXRpYyBjaGFyICplbnZfdmFyaWFibGVzW10gPSB7ICJHOTYwTElCIiwgIkc5NjBCQVNFIiwgMCB9OwotICBjaGFyICoqcDsKLSAgY2hhciAqZW52IDsKLQotICBmb3IgKCBwID0gZW52X3ZhcmlhYmxlczsgKnA7IHArKyApewotICAgIGVudiA9ICAoY2hhciAqKSBnZXRlbnYoKnApOwotICAgIGlmIChlbnYpIHsKLSAgICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChjb25jYXQgKGVudiwKLQkJCQkgICAgICAgIi9saWIvbGliY29mZiIsCi0JCQkJICAgICAgIChjb25zdCBjaGFyICopIE5VTEwpLAotCQkJICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gIH0KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9pOTYwOwotfQotCi0jZWxzZQkvKiBub3QgR05VOTYwICovCi0KLXN0YXRpYyB2b2lkIGdsZDk2MF9iZWZvcmVfcGFyc2UoKQotewotICBjaGFyICplbnYgOwotICBlbnYgPSAgZ2V0ZW52KCJHOTYwTElCIik7Ci0gIGlmIChlbnYpIHsKLSAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChlbnYsIGZhbHNlKTsKLSAgfQotICBlbnYgPSBnZXRlbnYoIkc5NjBCQVNFIik7Ci0gIGlmIChlbnYpCi0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGNvbmNhdCAoZW52LCAiL2xpYiIsIChjb25zdCBjaGFyICopIE5VTEwpLAotCQkJICAgICBmYWxzZSk7Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLX0KLQotI2VuZGlmCS8qIEdOVTk2MCAqLwotCi0KLXN0YXRpYyB2b2lkCi1nbGQ5NjBfc2V0X291dHB1dF9hcmNoKCkKLXsKLSAgaWYgKGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lICE9IE5VTEwKLSAgICAgICYmICpsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGNoYXIgKnMsICpzMTsKLQotICAgICAgcyA9IGNvbmNhdCAoImk5NjA6IiwgbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUsIChjaGFyICopIE5VTEwpOwotICAgICAgZm9yIChzMSA9IHM7ICpzMSAhPSAnXDAnOyBzMSsrKQotCWlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKnMxKSkKLQkgICpzMSA9IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqczEpOwotICAgICAgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAocyk7Ci0gICAgICBmcmVlIChzKTsKLSAgICB9Ci0KLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQgKCk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZDk2MF9jaG9vc2VfdGFyZ2V0KCkKLXsKLSNpZmRlZiBHTlU5NjAKLQotICBvdXRwdXRfZmlsZW5hbWUgPSAiYi5vdXQiOwotICByZXR1cm4gYmZkX21ha2VfdGFyZ19uYW1lKEJGRF9CT1VUX0ZPUk1BVCwgMCk7Ci0KLSNlbHNlCi0KLSAgY2hhciAqZnJvbV9vdXRzaWRlID0gZ2V0ZW52KFRBUkdFVF9FTlZJUk9OKTsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gImIub3V0IjsKLQotICBpZiAoZnJvbV9vdXRzaWRlICE9IChjaGFyICopTlVMTCkKLSAgICByZXR1cm4gZnJvbV9vdXRzaWRlOwotCi0gIHJldHVybiAiY29mZi1JbnRlbC1saXR0bGUiOwotCi0jZW5kaWYKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkOTYwX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX2dsZDk2MGNvZmZfZW11bGF0aW9uID0gCi17Ci0gIGdsZDk2MF9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGdsZDk2MF9zZXRfb3V0cHV0X2FyY2gsCi0gIGdsZDk2MF9jaG9vc2VfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQ5NjBfZ2V0X3NjcmlwdCwKLSAgIjk2MGNvZmYiLAotICAiIgotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2hwcGFlbGYuZW0gYi9sZC9lbXVsdGVtcGwvaHBwYWVsZi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlhYmUzYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvaHBwYWVsZi5lbQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBBbiBlbXVsYXRpb24gZm9yIEhQIFBBLVJJU0MgRUxGIGxpbmtlcnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0KLS8qIFNlY3Rpb24gaW4gd2hpY2ggd2UgYnVpbGQgc3R1YnMuICAqLwotc3RhdGljIGFzZWN0aW9uICpzdHViX3NlYzsKLXN0YXRpYyBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzdHViX2ZpbGU7Ci0KLQotLyogRklYTUUuICBUaGlzIGRvZXNuJ3QgYmVsb25nIGhlcmUuICAqLwotZXh0ZXJuIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBmaWxlX2NoYWluOwotCi0vKiBQZXJmb3JtIHNvbWUgZW11bGF0aW9uIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLiAgRm9yIFBBIEVMRiB3ZSBzZXQKLSAgIHVwIHRoZSBsb2NhbCBsYWJlbCBwcmVmaXggYW5kIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFlbGZfYmVmb3JlX3BhcnNlICgpCi17Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaHBwYTsKLX0KLQotLyogU2V0IHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFlbGZfc2V0X291dHB1dF9hcmNoKCkKLXsKLSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lID0gMDsKLQotICBiZmRfc2V0X2FyY2hfbWFjaCAob3V0cHV0X2JmZCwgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIG1hY2hpbmUpOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGlucHV0IGZpbGVzIGFyZSBvcGVuZWQuICBXZSBjcmVhdGUgYSBuZXcKLSAgIGZha2UgaW5wdXQgZmlsZSB0byBob2xkIHRoZSBzdHViIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotaHBwYWVsZl9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyAoKQotewotICBzdHViX2ZpbGUgPSBsYW5nX2FkZF9pbnB1dF9maWxlICgibGlua2VyIHN0dWJzIiwKLQkJCQkgICBsYW5nX2lucHV0X2ZpbGVfaXNfZmFrZV9lbnVtLAotCQkJCSAgIE5VTEwpOwotICBzdHViX2ZpbGUtPnRoZV9iZmQgPSBiZmRfY3JlYXRlICgibGlua2VyIHN0dWJzIiwgb3V0cHV0X2JmZCk7Ci0gIGlmIChzdHViX2ZpbGUtPnRoZV9iZmQgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X2FyY2hfbWFjaCAoc3R1Yl9maWxlLT50aGVfYmZkLAotCQkJICAgICAgYmZkX2dldF9hcmNoIChvdXRwdXRfYmZkKSwKLQkJCSAgICAgIGJmZF9nZXRfbWFjaCAob3V0cHV0X2JmZCkpKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglUDogY2FuIG5vdCBjcmVhdGUgQkZEICVFXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3R1Yl9zZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN0dWJfZmlsZS0+dGhlX2JmZCwgIi50ZXh0Iik7Ci0gIC8qIERvbid0IHNldCBTRUNfUkVMT0MgdW50aWwgd2UgYWN0dWFsbHkgaGF2ZSByZWxvY2F0aW9ucyBpbiB0aGlzCi0gICAgIHNlY3Rpb24uICAqLwotICBpZiAoc3R1Yl9zZWMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0dWJfZmlsZS0+dGhlX2JmZCwgc3R1Yl9zZWMsCi0JCQkJICAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgIHwgU0VDX0FMTE9DCi0JCQkJICAgfCBTRUNfTE9BRAotCQkJCSAgIHwgU0VDX0NPREUKLQkJCQkgICB8IFNFQ19JTl9NRU1PUlkpKSkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIHN0dWIgc2VjdGlvbjogJUVcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBsZGxhbmdfYWRkX2ZpbGUgKHN0dWJfZmlsZSk7Ci19Ci0KLS8qIFdhbGsgYWxsIHRoZSBsYW5nIHN0YXRlbWVudHMgc3BsaWNpbmcgb3V0IGFueSBwYWRkaW5nIHN0YXRlbWVudHMgZnJvbSAKLSAgIHRoZSBsaXN0LiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFlbGZfZGVsZXRlX3BhZGRpbmdfc3RhdGVtZW50cyAocywgcHJldikKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnByZXY7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnNwcmV2ID0gTlVMTDsKLSAgZm9yICg7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0KLQkvKiBXZSB3YW50IHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2Ugc2VjdGlvbnMuICAqLwotCWNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0JICBocHBhZWxmX2RlbGV0ZV9wYWRkaW5nX3N0YXRlbWVudHMgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCwKLQkJCQkJICAgICAmY29uc3RydWN0b3JfbGlzdC5oZWFkKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgotCSAgaHBwYWVsZl9kZWxldGVfcGFkZGluZ19zdGF0ZW1lbnRzIChzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuCi0JCQkJCSAgICAgICBjaGlsZHJlbi5oZWFkLAotCQkJCQkgICAgICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuCi0JCQkJCSAgICAgICBjaGlsZHJlbi5oZWFkKTsKLQkgIGJyZWFrOwotCi0JLyogSHVoPyAgV2hhdCBpcyBhIGxhbmdfd2lsZF9zdGF0ZW1lbnQ/ICAqLwotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCSAgaHBwYWVsZl9kZWxldGVfcGFkZGluZ19zdGF0ZW1lbnRzIChzLT53aWxkX3N0YXRlbWVudC4KLQkJCQkJICAgICAgIGNoaWxkcmVuLmhlYWQsCi0JCQkJCSAgICAgJnMtPndpbGRfc3RhdGVtZW50LgotCQkJCQkgICAgICAgY2hpbGRyZW4uaGVhZCk7Ci0JICBicmVhazsKLQotCS8qIEhlcmUncyB3aGF0IHdlIGFyZSByZWFsbHkgbG9va2luZyBmb3IuICBTcGxpY2UgdGhlc2Ugb3V0IG9mCi0JICAgdGhlIGxpc3QuICAqLwotCWNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotCSAgaWYgKHNwcmV2KQotCSAgICBzcHJldi0+aGVhZGVyLm5leHQgPSBzLT5oZWFkZXIubmV4dDsKLQkgIGVsc2UKLQkgICAgKipwcmV2ID0gKnM7Ci0JICBicmVhazsKLQotCS8qIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlc2UgY2FzZXMuICAqLwotCWNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLQljYXNlIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHNwcmV2ID0gczsKLSAgICB9Ci19Ci0KLS8qIEZpbmFsIGVtdWxhdGlvbiBzcGVjaWZpYyBjYWxsLiAgRm9yIHRoZSBQQSB3ZSB1c2UgdGhpcyBvcHBvcnR1bml0eQotICAgdG8gYnVpbGQgbGlua2VyIHN0dWJzLiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFlbGZfZmluaXNoICgpCi17Ci0gIC8qIENhbGwgaW50byB0aGUgQkZEIGJhY2tlbmQgdG8gZG8gdGhlIHJlYWwgd29yay4gICovCi0gIGlmIChlbGYzMl9ocHBhX3NpemVfc3R1YnMgKHN0dWJfZmlsZS0+dGhlX2JmZCwgb3V0cHV0X2JmZCwgJmxpbmtfaW5mbykKLSAgICAgID09IGZhbHNlKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglUDogY2FuIG5vdCBzaXplIHN0dWIgc2VjdGlvbjogJUVcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIC8qIElmIHRoZSBzaXplIG9mIHRoZSBzdHViIHNlY3Rpb24gaXMgbm9uemVybywgdGhlbiB3ZSBuZWVkCi0gICAgIHRvIHJlc2l6ZSB0aGUgc2VjdGlvbnMsIHJlY29tcHV0ZSB0aGUgYXNzaWdubWVudHMsIGFuZCBmaW5hbGx5Ci0gICAgIGJ1aWxkIHRoZSBzdHVicy4gICovCi0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChzdHViX2ZpbGUtPnRoZV9iZmQsIHN0dWJfZmlsZS0+dGhlX2JmZC0+c2VjdGlvbnMpICE9IDApCi0gICAgewotICAgICAgLyogRGVsZXRlIGFsbCB0aGUgcGFkZGluZyBzdGF0ZW1lbnRzLCB0aGV5J3JlIG5vIGxvbmdlciB2YWxpZC4gICovCi0gICAgICBocHBhZWxmX2RlbGV0ZV9wYWRkaW5nX3N0YXRlbWVudHMgKHN0YXRfcHRyLT5oZWFkLCAmc3RhdF9wdHItPmhlYWQpOwotICAgICAgCi0gICAgICAvKiBSZXNpemUgdGhlIHNlY3Rpb25zLiAgKi8KLSAgICAgIGxhbmdfc2l6ZV9zZWN0aW9ucyAoc3RhdF9wdHItPmhlYWQsIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgJnN0YXRfcHRyLT5oZWFkLCAwLCAoYmZkX3ZtYSkgMCwgZmFsc2UpOwotICAgICAgCi0gICAgICAvKiBSZWRvIHNwZWNpYWwgc3R1ZmYuICAqLwotICAgICAgbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24gKCk7Ci0gICAgICAKLSAgICAgIC8qIERvIHRoZSBhc3NpZ25tZW50cyBhZ2Fpbi4gICovCi0gICAgICBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzdGF0X3B0ci0+aGVhZCwKLQkJCSAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgIChmaWxsX3R5cGUpIDAsIChiZmRfdm1hKSAwKTsKLSAgICAgIAotICAgICAgLyogTm93IGJ1aWxkIHRoZSBsaW5rZXIgc3R1YnMuICAqLwotICAgICAgaWYgKGVsZjMyX2hwcGFfYnVpbGRfc3R1YnMgKHN0dWJfZmlsZS0+dGhlX2JmZCwgJmxpbmtfaW5mbykgPT0gZmFsc2UpCi0JewotCSAgZWluZm8gKCIlWCVQOiBjYW4gbm90IGJ1aWxkIHN0dWJzOiAlRVxuIik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogVGhlIHNjcmlwdCBpdHNlbGYgZ2V0cyBpbnNlcnRlZCBoZXJlLiAgKi8KLQotc3RhdGljIGNoYXIgKgotaHBwYWVsZl9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9ocHBhZWxmX2VtdWxhdGlvbiA9IAotewotICBocHBhZWxmX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBhZnRlcl9vcGVuX2RlZmF1bHQsCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgaHBwYWVsZl9zZXRfb3V0cHV0X2FyY2gsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgaHBwYWVsZl9nZXRfc2NyaXB0LAotICAiaHBwYWVsZiIsCi0gICJlbGYzMi1ocHBhIiwKLSAgaHBwYWVsZl9maW5pc2gsCi0gIGhwcGFlbGZfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMsCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvbGludXguZW0gYi9sZC9lbXVsdGVtcGwvbGludXguZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTAzZmYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2xpbnV4LmVtCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogTGludXggYS5vdXQgZW11bGF0aW9uIGNvZGUgZm9yICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgotICAgTGludXggc3VwcG9ydCBieSBFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc2VhcmNoX2RpcnNfdHlwZSAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYWRkcmVzc19zdGF0ZW1lbnQKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cwotICBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OwotICBjb25maWcuZHluYW1pY19saW5rID0gdHJ1ZTsKLSAgY29uZmlnLmhhc19zaGFyZWQgPSB0cnVlOwotfQotCi0vKiBUcnkgdG8gb3BlbiBhIGR5bmFtaWMgYXJjaGl2ZS4gIFRoaXMgaXMgd2hlcmUgd2Uga25vdyB0aGF0IExpbnV4Ci0gICBkeW5hbWljIGxpYnJhcmllcyBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuc2EuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGNoYXIgKnN0cmluZzsKLQotICBpZiAoISBlbnRyeS0+aXNfYXJjaGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpCi0JCQkgICAgICsgc3RybGVuIChlbnRyeS0+ZmlsZW5hbWUpCi0JCQkgICAgICsgc3RybGVuIChhcmNoKQotCQkJICAgICArIHNpemVvZiAiL2xpYi5zYSIpOwotCi0gIHNwcmludGYgKHN0cmluZywgIiVzL2xpYiVzJXMuc2EiLCBzZWFyY2gtPm5hbWUsIGVudHJ5LT5maWxlbmFtZSwgYXJjaCk7Ci0KLSAgaWYgKCEgbGRmaWxlX3RyeV9vcGVuX2JmZCAoc3RyaW5nLCBlbnRyeSkpCi0gICAgewotICAgICAgZnJlZSAoc3RyaW5nKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZW50cnktPmZpbGVuYW1lID0gc3RyaW5nOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgcm91dGluZSB2aWEKLSAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgbG9jYXRlcyBhbnkgYWRkcmVzcyBhc3NpZ25tZW50IHRvCi0gICAudGV4dCwgYW5kIG1vZGlmaWVzIGl0IHRvIGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGhlYWRlcnMuICBUaGlzCi0gICBjYXVzZXMgLVR0ZXh0IHRvIG1lYW4gdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGhlYWRlciwgcmF0aGVyCi0gICB0aGFuIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIC50ZXh0LCB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggb3RoZXIKLSAgIExpbnV4IHRvb2xzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYWRkcmVzc19zdGF0ZW1lbnQgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW0KLSAgICAgICYmIHN0cmNtcCAocy0+YWRkcmVzc19zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIHsKLSAgICAgIEFTU0VSVCAocy0+YWRkcmVzc19zdGF0ZW1lbnQuYWRkcmVzcy0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX3ZhbHVlKTsKLSAgICAgIHMtPmFkZHJlc3Nfc3RhdGVtZW50LmFkZHJlc3MtPnZhbHVlLnZhbHVlICs9IDB4MjA7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgb3BlbmluZyB0aGUgaW5wdXQgQkZEJ3MuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKCkKLXsKLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYWRkcmVzc19zdGF0ZW1lbnQpOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgd29yayBvdXQgdGhlIHNpemVzIG9mIGFueSBzZWN0aW9ucyByZXF1aXJlZCBieQotICAgICBkeW5hbWljIGxpbmtpbmcuICAqLwotICBpZiAoISBiZmRfJHtFTVVMQVRJT05fTkFNRX1fc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKSkKLSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIik7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIE5VTEwsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTAotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2xuazk2MC5lbSBiL2xkL2VtdWx0ZW1wbC9sbms5NjAuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZjJmNjAuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2xuazk2MC5lbQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBpbnRlbCBjb2ZmIGxvYWRlciBlbXVsYXRpb24gc3BlY2lmaWMgc3R1ZmYKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0vKiNpbmNsdWRlICJhcmNodXJlcy5oIiovCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi10eXBlZGVmIHN0cnVjdCBsaWJfbGlzdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBsaWJfbGlzdCAqbmV4dDsKLX0gbGliX2xpc3RfdHlwZTsKLQotc3RhdGljIGxpYl9saXN0X3R5cGUgKmhsbF9saXN0Owotc3RhdGljIGxpYl9saXN0X3R5cGUgKipobGxfbGlzdF90YWlsID0gJmhsbF9saXN0OwotCi1zdGF0aWMgbGliX2xpc3RfdHlwZSAqc3lzbGliX2xpc3Q7Ci1zdGF0aWMgbGliX2xpc3RfdHlwZSAqKnN5c2xpYl9saXN0X3RhaWwgPSAmc3lzbGliX2xpc3Q7Ci0KLQotc3RhdGljIHZvaWQKLWFwcGVuZChsaXN0LCBuYW1lKQotICAgICBsaWJfbGlzdF90eXBlICoqKmxpc3Q7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGxpYl9saXN0X3R5cGUgKmVsZW1lbnQgPSAKLSAgICAobGliX2xpc3RfdHlwZSAqKSh4bWFsbG9jKHNpemVvZihsaWJfbGlzdF90eXBlKSkpOwotCi0gIGVsZW1lbnQtPm5hbWUgPSBuYW1lOwotICBlbGVtZW50LT5uZXh0ID0gKGxpYl9saXN0X3R5cGUgKilOVUxMOwotICAqKmxpc3QgPSBlbGVtZW50OwotICAqbGlzdCA9ICZlbGVtZW50LT5uZXh0OwotCi19Ci0KLXN0YXRpYyBib29sZWFuIGhhZF9obGwgPSBmYWxzZTsKLXN0YXRpYyBib29sZWFuIGhhZF9obGxfbmFtZSA9IGZhbHNlOwotCi1zdGF0aWMgdm9pZAotbG5rOTYwX2hsbChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBoYWRfaGxsID0gdHJ1ZTsKLSAgaWYgKG5hbWUgIT0gKGNoYXIgKilOVUxMKSB7Ci0gICAgaGFkX2hsbF9uYW1lID0gdHJ1ZTsKLSAgICBhcHBlbmQoJmhsbF9saXN0X3RhaWwsIG5hbWUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIAotbG5rOTYwX3N5c2xpYihuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBhcHBlbmQoJnN5c2xpYl9saXN0X3RhaWwsbmFtZSk7Ci19Ci0KLQotI2lmZGVmIEdOVTk2MAotCi1zdGF0aWMgdm9pZCAKLWxuazk2MF9iZWZvcmVfcGFyc2UoKQotewotICBzdGF0aWMgY2hhciAqZW52X3ZhcmlhYmxlc1tdID0geyAiRzk2MExJQiIsICJHOTYwQkFTRSIsIDAgfTsKLSAgY2hhciAqKnA7Ci0gIGNoYXIgKmVudiA7Ci0KLSAgZm9yICggcCA9IGVudl92YXJpYWJsZXM7ICpwOyBwKysgKXsKLSAgICBlbnYgPSAgKGNoYXIgKikgZ2V0ZW52KCpwKTsKLSAgICBpZiAoZW52KSB7Ci0gICAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChjb25jYXQoZW52LCIvbGliL2xpYmNvZmYiLCIiKSwgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIGVudj0gKGNoYXIgKikgZ2V0ZW52KCJJOTYwQkFTRSIpOwotICBpZiAoIGVudiApIHsKLSAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChjb25jYXQoZW52LCIvbGliIiwiIiksIGZhbHNlKTsKLSAgfQotCi0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLSAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOwotfQotCi0jZWxzZQkvKiBub3QgR05VOTYwICovCi0KLXN0YXRpYyB2b2lkIAotbG5rOTYwX2JlZm9yZV9wYXJzZSgpCi17Ci0gIGNoYXIgKm5hbWUgPSBnZXRlbnYoIkk5NjBCQVNFIik7Ci0KLSAgaWYgKG5hbWUgPT0gKGNoYXIgKilOVUxMKSB7Ci0gICAgbmFtZSA9IGdldGVudigiRzk2MEJBU0UiKTsKLSAgICBpZiAobmFtZSA9PSAoY2hhciAqKU5VTEwpIHsKLSAgICAgIGVpbmZvKCIlUCVGIEk5NjBCQVNFIGFuZCBHOTYwQkFTRSBub3Qgc2V0XG4iKTsKLSAgICB9Ci0gIH0KLQotCi0gIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoKGNvbmNhdChuYW1lLCIvbGliIiwiIiksIGZhbHNlKTsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9pOTYwOwotICBsZGZpbGVfb3V0cHV0X21hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NvcmU7Ci19Ci0KLSNlbmRpZgkvKiBHTlU5NjAgKi8KLQotCi1zdGF0aWMgdm9pZAotYWRkX29uKGxpc3QsIHNlYXJjaCkKLSAgICAgbGliX2xpc3RfdHlwZSAqbGlzdDsKLSAgICAgbGFuZ19pbnB1dF9maWxlX2VudW1fdHlwZSBzZWFyY2g7Ci17Ci0gIHdoaWxlIChsaXN0KSB7Ci0gICAgbGFuZ19hZGRfaW5wdXRfZmlsZShsaXN0LT5uYW1lLAotCQkJc2VhcmNoLAotCQkJKGNoYXIgKilOVUxMKTsKLSAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgfQotfQotc3RhdGljIHZvaWQKLWxuazk2MF9hZnRlcl9wYXJzZSgpCi17Ci0gIC8qIElmIHRoZXJlIGhhcyBiZWVuIG5vIGFyY2gsIGRlZmF1bHQgdG8gLUtCICovCi0gIGlmIChsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZVswXSA9PTApIHsKLSAgICBsZGZpbGVfYWRkX2FyY2goIktCIik7Ci0gIH0KLQotICAvKiBpZiB0aGVyZSBoYXMgYmVlbiBubyBobGwgbGlzdCB0aGVuIGFkZCBvdXIgb3duICovCi0gIAotICBpZihoYWRfaGxsICYmICFoYWRfaGxsX25hbWUpIHsKLSAgICBhcHBlbmQoJmhsbF9saXN0X3RhaWwsImNnIik7Ci0gICAgaWYgKGxkZmlsZV9vdXRwdXRfbWFjaGluZSA9PSBiZmRfbWFjaF9pOTYwX2thX3NhIHx8Ci0gIAlsZGZpbGVfb3V0cHV0X21hY2hpbmUgPT0gYmZkX21hY2hfaTk2MF9jYSkgewotICAgICAgICB7Ci0JICBhcHBlbmQoJmhsbF9saXN0X3RhaWwsImZwZyIpOwotICAgICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBhZGRfb24oaGxsX2xpc3QsIGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0pOwotICBhZGRfb24oc3lzbGliX2xpc3QsIGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtKTsKLX0KLQotc3RhdGljIHZvaWQKLWxuazk2MF9iZWZvcmVfYWxsb2NhdGlvbigpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1sbms5NjBfYWZ0ZXJfYWxsb2NhdGlvbigpCi17Ci0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IGZhbHNlKSB7Ci0gICAgbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZigiLnRleHQiLCJfZXRleHQiKTsKLSAgICBsYW5nX2Fic19zeW1ib2xfYXRfZW5kX29mKCIuZGF0YSIsIl9lZGF0YSIpOwotICAgIGxhbmdfYWJzX3N5bWJvbF9hdF9iZWdpbm5pbmdfb2YoIi5ic3MiLCJfYnNzX3N0YXJ0Iik7Ci0gICAgbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZigiLmJzcyIsIl9lbmQiKTsKLSAgfQotfQotCi0KLXN0YXRpYyBzdHJ1Y3QKLSB7Ci0gICB1bnNpZ25lZCAgbG9uZyBudW1iZXI7Ci0gICBjaGFyICpuYW1lOyAKLSB9Ci1tYWNoaW5lX3RhYmxlW10gPQotewotICB7IGJmZF9tYWNoX2k5NjBfY29yZQksIkNPUkUiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYl9zYgksIktCIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Jfc2IJLCJTQiIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX21jCSwiTUMiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF94YQksIlhBIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfY2EJLCJDQSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2thX3NhCSwiS0EiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYV9zYQksIlNBIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfangJLCJKWCIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2h4CSwiSFgiIH0sCi0KLSAgeyBiZmRfbWFjaF9pOTYwX2NvcmUJLCJjb3JlIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Jfc2IJLCJrYiIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2tiX3NiCSwic2IiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9tYwksIm1jIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfeGEJLCJ4YSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2NhCSwiY2EiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYV9zYQksImthIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Ffc2EJLCJzYSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2p4CSwiangiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9oeAksImh4IiB9LAotCi0gIHsgMCwgKGNoYXIgKikgTlVMTCB9Ci19OwotCi1zdGF0aWMgdm9pZAotbG5rOTYwX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZSAqLwotICB1bnNpZ25lZCBpbnQgaTsKLSAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOwotICBmb3IgKGk9IDA7IG1hY2hpbmVfdGFibGVbaV0ubmFtZSAhPSAoY2hhciopTlVMTDsgaSsrKSB7Ci0gICAgaWYgKHN0cmNtcChsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSxtYWNoaW5lX3RhYmxlW2ldLm5hbWUpPT0wKSB7Ci0gICAgICBsZGZpbGVfb3V0cHV0X21hY2hpbmUgPSBtYWNoaW5lX3RhYmxlW2ldLm51bWJlcjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBiZmRfc2V0X2FyY2hfbWFjaChvdXRwdXRfYmZkLCBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgbGRmaWxlX291dHB1dF9tYWNoaW5lKTsKLX0KLQotc3RhdGljIGNoYXIgKgotbG5rOTYwX2Nob29zZV90YXJnZXQoKQotewotI2lmZGVmIEdOVTk2MAotCi0gIHJldHVybiBiZmRfbWFrZV90YXJnX25hbWUoQkZEX0NPRkZfRk9STUFULCAwKTsKLQotI2Vsc2UKLQotICBjaGFyICpmcm9tX291dHNpZGUgPSBnZXRlbnYoVEFSR0VUX0VOVklST04pOwotICBpZiAoZnJvbV9vdXRzaWRlICE9IChjaGFyICopTlVMTCkKLSAgICByZXR1cm4gZnJvbV9vdXRzaWRlOwotI2lmZGVmIExOSzk2MF9MSVRUTEUKLSAgcmV0dXJuICJjb2ZmLUludGVsLWxpdHRsZSI7Ci0jZWxzZQotICByZXR1cm4gImNvZmYtSW50ZWwtYmlnIjsKLSNlbmRpZgotI2VuZGlmCi0KLX0KLQotc3RhdGljIGNoYXIgKgotbG5rOTYwX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX2xuazk2MF9lbXVsYXRpb24gPSAKLXsKLSAgbG5rOTYwX2JlZm9yZV9wYXJzZSwKLSAgbG5rOTYwX3N5c2xpYiwKLSAgbG5rOTYwX2hsbCwKLSAgbG5rOTYwX2FmdGVyX3BhcnNlLAotICBOVUxMLAkJCS8qIGFmdGVyX29wZW4gKi8KLSAgbG5rOTYwX2FmdGVyX2FsbG9jYXRpb24sCi0gIGxuazk2MF9zZXRfb3V0cHV0X2FyY2gsCi0gIGxuazk2MF9jaG9vc2VfdGFyZ2V0LAotICBsbms5NjBfYmVmb3JlX2FsbG9jYXRpb24sCi0gIGxuazk2MF9nZXRfc2NyaXB0LAotICAibG5rOTYwIiwKLSAgIiIKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0gYi9sZC9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ1OTI0Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBIYW5kbGUgZW1iZWRkZWQgcmVsb2NzIGZvciBNSVBTLgotICAgQ29weXJpZ2h0IDE5OTQsIDk1LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+IGJhc2VkIG9uIGdlbmVyaWMuZW0uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBjaGVja19zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoXyR7QVJDSH07Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBydW4gYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLgotICAgV2UgY3JlYXRlIGEgLnJlbC5zZGF0YSBzZWN0aW9uIGZvciBlYWNoIGlucHV0IGZpbGUgd2l0aCBhIG5vbiB6ZXJvCi0gICAuc2RhdGEgc2VjdGlvbi4gIFRoZSBCRkQgYmFja2VuZCB3aWxsIGZpbGwgaW4gdGhlc2Ugc2VjdGlvbnMgd2l0aAotICAgbWFnaWMgbnVtYmVycyB3aGljaCBjYW4gYmUgdXNlZCB0byByZWxvY2F0ZSB0aGUgZGF0YSBzZWN0aW9uIGF0IHJ1bgotICAgdGltZS4gIFRoaXMgd2lsbCBvbmx5IGRvIHRoZSByaWdodCB0aGluZyBpZiBhbGwgdGhlIGlucHV0IGZpbGVzCi0gICBoYXZlIGJlZW4gY29tcGlsZWQgdXNpbmcgLW1lbWJlZGRlZC1waWMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotICBiZmQgKmFiZmQ7Ci0KLSAgaWYgKCEgY29tbWFuZF9saW5lLmVtYmVkZGVkX3JlbG9jcwotICAgICAgfHwgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChhYmZkID0gbGlua19pbmZvLmlucHV0X2JmZHM7IGFiZmQgIT0gTlVMTDsgYWJmZCA9IGFiZmQtPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqZGF0YXNlYzsKLQotICAgICAgZGF0YXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7Ci0KLSAgICAgIC8qIE5vdGUgdGhhdCB3ZSBhc3N1bWUgdGhhdCB0aGUgcmVsb2NfY291bnQgZmllbGQgaGFzIGFscmVhZHkKLSAgICAgICAgIGJlZW4gc2V0IHVwLiAgV2UgY291bGQgY2FsbCBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLCBidXQKLSAgICAgICAgIHRoYXQgcmV0dXJucyB0aGUgc2l6ZSBvZiBhIG1lbW9yeSBidWZmZXIgcmF0aGVyIHRoYW4gYSByZWxvYwotICAgICAgICAgY291bnQuICBXZSBkbyBub3Qgd2FudCB0byBjYWxsIGJmZF9jYW5vbmljYWxpemVfcmVsb2MsCi0gICAgICAgICBiZWNhdXNlIGFsdGhvdWdoIGl0IHdvdWxkIGFsd2F5cyB3b3JrIGl0IHdvdWxkIGZvcmNlIHVzIHRvCi0gICAgICAgICByZWFkIGluIHRoZSByZWxvY3MgaW50byBCRkQgY2Fub25pY2FsIGZvcm0sIHdoaWNoIHdvdWxkIHdhc3RlCi0gICAgICAgICBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aW1lIGFuZCBtZW1vcnkuICAqLwotICAgICAgaWYgKGRhdGFzZWMgIT0gTlVMTCAmJiBkYXRhc2VjLT5yZWxvY19jb3VudCA+IDApCi0JewotCSAgYXNlY3Rpb24gKnJlbHNlYzsKLQotCSAgcmVsc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5yZWwuc2RhdGEiKTsKLQkgIGlmIChyZWxzZWMgPT0gTlVMTAotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCByZWxzZWMsCi0JCQkJCSAgKFNFQ19BTExPQwotCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkpKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcmVsc2VjLCAyKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbHNlYywKLQkJCQkJIGRhdGFzZWMtPnJlbG9jX2NvdW50ICogNCkpCi0JICAgIGVpbmZvICgiJUYlQjogY2FuIG5vdCBjcmVhdGUgLnJlbC5zZGF0YSBzZWN0aW9uOiAlRVxuIik7Ci0JfQotCi0gICAgICAvKiBEb3VibGUgY2hlY2sgdGhhdCBhbGwgb3RoZXIgZGF0YSBzZWN0aW9ucyBhcmUgZW1wdHksIGFzIGlzCi0gICAgICAgICByZXF1aXJlZCBmb3IgZW1iZWRkZWQgUElDIGNvZGUuICAqLwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBjaGVja19zZWN0aW9ucywgKFBUUikgZGF0YXNlYyk7Ci0gICAgfQotfQotCi0vKiBDaGVjayB0aGF0IG9mIHRoZSBkYXRhIHNlY3Rpb25zLCBvbmx5IHRoZSAuc2RhdGEgc2VjdGlvbiBoYXMKLSAgIHJlbG9jcy4gIFRoaXMgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotY2hlY2tfc2VjdGlvbnMgKGFiZmQsIHNlYywgc2RhdGFzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHNkYXRhc2VjOwotewotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19DT0RFKSA9PSAwCi0gICAgICAmJiBzZWMgIT0gKGFzZWN0aW9uICopIHNkYXRhc2VjCi0gICAgICAmJiBzZWMtPnJlbG9jX2NvdW50ICE9IDApCi0gICAgZWluZm8gKCIlUCVYOiBzZWN0aW9uICVzIGhhcyByZWxvY3M7IGNhbiBub3QgdXNlIC0tZW1iZWRkZWQtcmVsb2NzXG4iLAotCSAgIGFiZmQsIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb24gc2l6ZXMgYW5kIG9mZnNldHMgaGF2ZQotICAgYmVlbiBzZXQuICBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBlbWJlZGRlZCByZWxvY3MsIGl0IGNhbGxzIGEgc3BlY2lhbAotICAgQkZEIGJhY2tlbmQgcm91dGluZSB0byBkbyB0aGUgd29yay4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9hbGxvY2F0aW9uICgpCi17Ci0gIGJmZCAqYWJmZDsKLQotICBpZiAoISBjb21tYW5kX2xpbmUuZW1iZWRkZWRfcmVsb2NzCi0gICAgICB8fCBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICBmb3IgKGFiZmQgPSBsaW5rX2luZm8uaW5wdXRfYmZkczsgYWJmZCAhPSBOVUxMOyBhYmZkID0gYWJmZC0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpkYXRhc2VjLCAqcmVsc2VjOwotICAgICAgY2hhciAqZXJybXNnOwotCi0gICAgICBkYXRhc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc2RhdGEiKTsKLQotICAgICAgaWYgKGRhdGFzZWMgPT0gTlVMTCB8fCBkYXRhc2VjLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICByZWxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWwuc2RhdGEiKTsKLSAgICAgIEFTU0VSVCAocmVsc2VjICE9IE5VTEwpOwotCi0gICAgICBpZiAoISBiZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzIChhYmZkLCAmbGlua19pbmZvLAotCQkJCQkJICAgZGF0YXNlYywgcmVsc2VjLAotCQkJCQkJICAgJmVycm1zZykpCi0JewotCSAgaWYgKGVycm1zZyA9PSBOVUxMKQotCSAgICBlaW5mbyAoIiVCJVg6IGNhbiBub3QgY3JlYXRlIHJ1bnRpbWUgcmVsb2MgaW5mb3JtYXRpb246ICVFXG4iLAotCQkgICBhYmZkKTsKLQkgIGVsc2UKLQkgICAgZWluZm8gKCIlWCVCOiBjYW4gbm90IGNyZWF0ZSBydW50aW1lIHJlbG9jIGluZm9ybWF0aW9uOiAlc1xuIiwKLQkJICAgYWJmZCwgZXJybXNnKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mIHN0cmluZ2lmeS5zZWQiCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1FT0YKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLXNlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLWVjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX2FsbG9jYXRpb24sCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IgotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL29zdHJpbmcuc2VkIGIvbGQvZW11bHRlbXBsL29zdHJpbmcuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTI2ZDNmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9vc3RyaW5nLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMSBzL14vIi8KLSQgcy8kL24iLwpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL3BlLmVtIGIvbGQvZW11bHRlbXBsL3BlLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWEwOWZlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9wZS5lbQorKysgL2Rldi9udWxsCkBAIC0xLDEyNzkgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotcm0gLWYgZSR7RU1VTEFUSU9OX05BTUV9LmMKLShlY2hvO2VjaG87ZWNobztlY2hvO2VjaG8pPmUke0VNVUxBVElPTl9OQU1FfS5jICMgdGhlcmUsIG5vdyBsaW5lIG51bWJlcnMgbWF0Y2ggOy0pCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLSAgIENvcHlyaWdodCAxOTk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBGb3IgV0lORE9XU19OVCAqLwotLyogVGhlIG9yaWdpbmFsIGZpbGUgZ2VuZXJhdGVkIHJldHVybmVkIGRpZmZlcmVudCBkZWZhdWx0IHNjcmlwdHMgZGVwZW5kaW5nCi0gICBvbiB3aGV0aGVyIGNlcnRhaW4gc3dpdGNoZXMgd2VyZSBzZXQsIGJ1dCB0aGVzZSBzd2l0Y2hlcyBwZXJ0YWluIHRvIHRoZQotICAgTGludXggc3lzdGVtIGFuZCB0aGF0IHBhcnRpY3VsYXIgdmVyc2lvbiBvZiBjb2ZmLiAgSW4gdGhlIE5UIGNhc2UsIHdlCi0gICBvbmx5IGRldGVybWluZSBpZiB0aGUgc3Vic3lzdGVtIGlzIGNvbnNvbGUgb3Igd2luZG93cyBpbiBvcmRlciB0byBzZWxlY3QKLSAgIHRoZSBjb3JyZWN0IGVudHJ5IHBvaW50IGJ5IGRlZmF1bHQuICovIAotICAKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0vKiBGSVhNRTogVGhpcyBpcyBhIEJGRCBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgYW5kIHdlIHNob3VsZCBub3QgYmUKLSAgIHVzaW5nIGl0IGhlcmUuICAqLwotI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCi0KLSNpbmNsdWRlICJkZWZmaWxlLmgiCi0jaW5jbHVkZSAicGUtZGxsLmgiCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLS8qIFBlcm1pdCB0aGUgZW11bGF0aW9uIHBhcmFtZXRlcnMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2VjdGlvbgotICAgYWxpZ25tZW50IGJ5IHNldHRpbmcgT1ZFUlJJREVfU0VDVElPTl9BTElHTk1FTlQuICBGSVhNRTogVGhpcyBtYWtlcwotICAgaXQgc2VlbSB0aGF0IGluY2x1ZGUvY29mZi9pbnRlcm5hbC5oIHNob3VsZCBub3QgZGVmaW5lCi0gICBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQuICAqLwotI2lmIFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCAhPSAke09WRVJSSURFX1NFQ1RJT05fQUxJR05NRU5UOi1QRV9ERUZfU0VDVElPTl9BTElHTk1FTlR9Ci0jdW5kZWYgUEVfREVGX1NFQ1RJT05fQUxJR05NRU5UCi0jZGVmaW5lIFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCAke09WRVJSSURFX1NFQ1RJT05fQUxJR05NRU5UfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFRBUkdFVF9JU19pMzg2cGUpCi0jZGVmaW5lIERMTF9TVVBQT1JUCi0jZW5kaWYKLQotI2RlZmluZQlQRV9ERUZfU1VCU1lTVEVNCQkzCi0KLSNpZmRlZiBUQVJHRVRfSVNfYXJtX2Vwb2NfcGUKLSNkZWZpbmUgYmZkX2FybV9wZV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgXAotCWJmZF9hcm1fZXBvY19wZV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2FybV9wZV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAotCWJmZF9hcm1fZXBvY19wZV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2FybV9wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfYXJtX2Vwb2NfcGVfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbgotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgY2hhciAqZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICopKTsKLXN0YXRpYyBpbnQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyIHBlOwotc3RhdGljIGludCBkbGw7Ci1zdGF0aWMgaW50IHN1cHBvcnRfb2xkX2NvZGUgPSAwOwotc3RhdGljIGNoYXIgKiB0aHVtYl9lbnRyeV9zeW1ib2wgPSBOVUxMOwotc3RhdGljIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqaW1hZ2VfYmFzZV9zdGF0ZW1lbnQgPSAwOwotCi1zdGF0aWMgY2hhciAqcGVfb3V0X2RlZl9maWxlbmFtZSA9IDA7Ci1zdGF0aWMgaW50IHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwID0gLTE7IC8qIDA9ZGlzYWJsZSAxPWVuYWJsZSAqLwotc3RhdGljIGNoYXIgKnBlX2ltcGxpYl9maWxlbmFtZSA9IDA7Ci0KLWV4dGVybiBjb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWU7Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gIiR7RVhFQ1VUQUJMRV9OQU1FOi1hLmV4ZX0iOwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoXyR7QVJDSH07Ci0jaWZkZWYgRExMX1NVUFBPUlQKLSAgY29uZmlnLmhhc19zaGFyZWQgPSAxOwotI2VuZGlmCi19Ci0MCi0vKiBQRSBmb3JtYXQgZXh0cmEgY29tbWFuZCBsaW5lIG9wdGlvbnMuICAqLwotCi0vKiBVc2VkIGZvciBzZXR0aW5nIGZsYWdzIGluIHRoZSBQRSBoZWFkZXIuICovCi0jZGVmaW5lIE9QVElPTl9CQVNFX0ZJTEUJCSgzMDAgICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RMTAkJCShPUFRJT05fQkFTRV9GSUxFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0ZJTEVfQUxJR05NRU5UCQkoT1BUSU9OX0RMTCArIDEpCi0jZGVmaW5lIE9QVElPTl9JTUFHRV9CQVNFCQkoT1BUSU9OX0ZJTEVfQUxJR05NRU5UICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT04JKE9QVElPTl9JTUFHRV9CQVNFICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01BSk9SX09TX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTgkoT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01JTk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01JTk9SX09TX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQJKE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9TVEFDSyAgICAgICAgICAgICAgICAgICAgKE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVCArIDEpCi0jZGVmaW5lIE9QVElPTl9TVUJTWVNURU0gICAgICAgICAgICAgICAgKE9QVElPTl9TVEFDSyArIDEpCi0jZGVmaW5lIE9QVElPTl9IRUFQCQkJKE9QVElPTl9TVUJTWVNURU0gKyAxKQotI2RlZmluZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERQkJKE9QVElPTl9IRUFQICsgMSkKLSNkZWZpbmUgT1BUSU9OX09VVF9ERUYJCQkoT1BUSU9OX1NVUFBPUlRfT0xEX0NPREUgKyAxKQotI2RlZmluZSBPUFRJT05fRVhQT1JUX0FMTAkJKE9QVElPTl9PVVRfREVGICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYQ0xVREVfU1lNQk9MUwkJKE9QVElPTl9FWFBPUlRfQUxMICsgMSkKLSNkZWZpbmUgT1BUSU9OX0tJTExfQVRTCQkJKE9QVElPTl9FWENMVURFX1NZTUJPTFMgKyAxKQotI2RlZmluZSBPUFRJT05fU1REQ0FMTF9BTElBU0VTCQkoT1BUSU9OX0tJTExfQVRTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VOQUJMRV9TVERDQUxMX0ZJWFVQCShPUFRJT05fU1REQ0FMTF9BTElBU0VTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RJU0FCTEVfU1REQ0FMTF9GSVhVUAkoT1BUSU9OX0VOQUJMRV9TVERDQUxMX0ZJWFVQICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lNUExJQl9GSUxFTkFNRQkJKE9QVElPTl9ESVNBQkxFX1NURENBTExfRklYVVAgKyAxKQotI2RlZmluZSBPUFRJT05fVEhVTUJfRU5UUlkJCShPUFRJT05fSU1QTElCX0ZJTEVOQU1FICsgMSkKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9Ci17Ci0gIC8qIFBFIG9wdGlvbnMgKi8KLSAgeyJiYXNlLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JBU0VfRklMRX0sCi0gIHsiZGxsIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ETEx9LAotICB7ImZpbGUtYWxpZ25tZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9GSUxFX0FMSUdOTUVOVH0sCi0gIHsiaGVhcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSEVBUH0sIAotICB7ImltYWdlLWJhc2UiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNQUdFX0JBU0V9LAotICB7Im1ham9yLWltYWdlLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT059LAotICB7Im1ham9yLW9zLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX09TX1ZFUlNJT059LAotICB7Im1ham9yLXN1YnN5c3RlbS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTn0sCi0gIHsibWlub3ItaW1hZ2UtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTn0sCi0gIHsibWlub3Itb3MtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTn0sCi0gIHsibWlub3Itc3Vic3lzdGVtLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OfSwKLSAgeyJzZWN0aW9uLWFsaWdubWVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0VDVElPTl9BTElHTk1FTlR9LAotICB7InN0YWNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVEFDS30sCi0gIHsic3Vic3lzdGVtIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVUJTWVNURU19LAotICB7InN1cHBvcnQtb2xkLWNvZGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NVUFBPUlRfT0xEX0NPREV9LAotICB7InRodW1iLWVudHJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9USFVNQl9FTlRSWX0sCi0jaWZkZWYgRExMX1NVUFBPUlQKLSAgLyogZ2V0b3B0IGFsbG93cyBhYmJyZXZpYXRpb25zLCBzbyB3ZSBkbyB0aGlzIHRvIHN0b3AgaXQgZnJvbSB0cmVhdGluZyAtbwotICAgICBhcyBhbiBhYmJyZXZpYXRpb24gZm9yIHRoaXMgb3B0aW9uICovCi0gIHsib3V0cHV0LWRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUX0RFRn0sCi0gIHsib3V0cHV0LWRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUX0RFRn0sCi0gIHsiZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlRfQUxMfSwKLSAgeyJleGNsdWRlLXN5bWJvbHMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYQ0xVREVfU1lNQk9MU30sCi0gIHsia2lsbC1hdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fS0lMTF9BVFN9LAotICB7ImFkZC1zdGRjYWxsLWFsaWFzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVERDQUxMX0FMSUFTRVN9LAotICB7ImVuYWJsZS1zdGRjYWxsLWZpeHVwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTkFCTEVfU1REQ0FMTF9GSVhVUH0sCi0gIHsiZGlzYWJsZS1zdGRjYWxsLWZpeHVwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ESVNBQkxFX1NURENBTExfRklYVVB9LAotICB7Im91dC1pbXBsaWIiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNUExJQl9GSUxFTkFNRX0sCi0jZW5kaWYKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLQotCi0vKiBQRS9XSU4zMjsgYWRkZWQgcm91dGluZXMgdG8gZ2V0IHRoZSBzdWJzeXN0ZW0gdHlwZSwgaGVhcCBhbmQvb3Igc3RhY2sKLSAgIHBhcmFtZXRlcnMgd2hpY2ggbWF5IGJlIGlucHV0IGZyb20gdGhlIGNvbW1hbmQgbGluZSAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICB2b2lkICpwdHI7Ci0gIGludCBzaXplOwotICBpbnQgdmFsdWU7Ci0gIGNoYXIgKnN5bWJvbDsKLSAgaW50IGluaXRlZDsKLX0gZGVmaW5mbzsKLQotI2RlZmluZSBEKGZpZWxkLHN5bWJvbCxkZWYpICB7JnBlLmZpZWxkLHNpemVvZihwZS5maWVsZCksIGRlZiwgc3ltYm9sLDB9Ci0KLXN0YXRpYyBkZWZpbmZvIGluaXRbXSA9Ci17Ci0gIC8qIGltYWdlYmFzZSBtdXN0IGJlIGZpcnN0ICovCi0jZGVmaW5lIElNQUdFQkFTRU9GRiAwCi0gIEQoSW1hZ2VCYXNlLCJfX2ltYWdlX2Jhc2VfXyIsIE5UX0VYRV9JTUFHRV9CQVNFKSwKLSNkZWZpbmUgRExMT0ZGIDEKLSAgeyZkbGwsIHNpemVvZihkbGwpLCAwLCAiX19kbGxfXyIsIDB9LAotICBEKFNlY3Rpb25BbGlnbm1lbnQsIl9fc2VjdGlvbl9hbGlnbm1lbnRfXyIsIFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCksCi0gIEQoRmlsZUFsaWdubWVudCwiX19maWxlX2FsaWdubWVudF9fIiwgUEVfREVGX0ZJTEVfQUxJR05NRU5UKSwKLSAgRChNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sIl9fbWFqb3Jfb3NfdmVyc2lvbl9fIiwgNCksCi0gIEQoTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uLCJfX21pbm9yX29zX3ZlcnNpb25fXyIsIDApLAotICBEKE1ham9ySW1hZ2VWZXJzaW9uLCJfX21ham9yX2ltYWdlX3ZlcnNpb25fXyIsIDEpLAotICBEKE1pbm9ySW1hZ2VWZXJzaW9uLCJfX21pbm9yX2ltYWdlX3ZlcnNpb25fXyIsIDApLAotICBEKE1ham9yU3Vic3lzdGVtVmVyc2lvbiwiX19tYWpvcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwgNCksCi0gIEQoTWlub3JTdWJzeXN0ZW1WZXJzaW9uLCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLCAwKSwKLSAgRChTdWJzeXN0ZW0sIl9fc3Vic3lzdGVtX18iLCAke1NVQlNZU1RFTX0pLAotICBEKFNpemVPZlN0YWNrUmVzZXJ2ZSwiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIsIDB4MjAwMDAwMCksCi0gIEQoU2l6ZU9mU3RhY2tDb21taXQsIl9fc2l6ZV9vZl9zdGFja19jb21taXRfXyIsIDB4MTAwMCksCi0gIEQoU2l6ZU9mSGVhcFJlc2VydmUsIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIsIDB4MTAwMDAwKSwKLSAgRChTaXplT2ZIZWFwQ29tbWl0LCJfX3NpemVfb2ZfaGVhcF9jb21taXRfXyIsIDB4MTAwMCksCi0gIEQoTG9hZGVyRmxhZ3MsIl9fbG9hZGVyX2ZsYWdzX18iLCAweDApLAotICB7IE5VTEwsIDAsIDAsIE5VTEwsIDAgfQotfTsKLQotc3RhdGljIHZvaWQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tYmFzZV9maWxlIDxiYXNlZmlsZT4gICAgICAgICAgICAgR2VuZXJhdGUgYSBiYXNlIGZpbGUgZm9yIHJlbG9jYXRhYmxlIERMTHNcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWRsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBpbWFnZSBiYXNlIHRvIHRoZSBkZWZhdWx0IGZvciBETExzXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1maWxlLWFsaWdubWVudCA8c2l6ZT4gICAgICAgICAgICBTZXQgZmlsZSBhbGlnbm1lbnRcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWhlYXAgPHNpemU+ICAgICAgICAgICAgICAgICAgICAgIFNldCBpbml0aWFsIHNpemUgb2YgdGhlIGhlYXBcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWltYWdlLWJhc2UgPGFkZHJlc3M+ICAgICAgICAgICAgIFNldCBzdGFydCBhZGRyZXNzIG9mIHRoZSBleGVjdXRhYmxlXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1tYWpvci1pbWFnZS12ZXJzaW9uIDxudW1iZXI+ICAgICBTZXQgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGV4ZWN1dGFibGVcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW1ham9yLW9zLXZlcnNpb24gPG51bWJlcj4gICAgICAgIFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHZlcnNpb25cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW1ham9yLXN1YnN5c3RlbS12ZXJzaW9uIDxudW1iZXI+IFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHN1YnN5c3RlbSB2ZXJzaW9uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1taW5vci1pbWFnZS12ZXJzaW9uIDxudW1iZXI+ICAgICBTZXQgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBleGVjdXRhYmxlXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1taW5vci1vcy12ZXJzaW9uIDxudW1iZXI+ICAgICAgICBTZXQgbWluaW11bSByZXF1aXJlZCBPUyByZXZpc2lvblxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWlub3Itc3Vic3lzdGVtLXZlcnNpb24gPG51bWJlcj4gU2V0IG1pbmltdW0gcmVxdWlyZWQgT1Mgc3Vic3lzdGVtIHJldmlzaW9uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1zZWN0aW9uLWFsaWdubWVudCA8c2l6ZT4gICAgICAgICBTZXQgc2VjdGlvbiBhbGlnbm1lbnRcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLXN0YWNrIDxzaXplPiAgICAgICAgICAgICAgICAgICAgIFNldCBzaXplIG9mIHRoZSBpbml0aWFsIHN0YWNrXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1zdWJzeXN0ZW0gPG5hbWU+Wzo8dmVyc2lvbj5dICAgICBTZXQgcmVxdWlyZWQgT1Mgc3Vic3lzdGVtIFsmIHZlcnNpb25dXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1zdXBwb3J0LW9sZC1jb2RlICAgICAgICAgICAgICAgICBTdXBwb3J0IGludGVyd29ya2luZyB3aXRoIG9sZCBjb2RlXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS10aHVtYi1lbnRyeT08c3ltYm9sPiAgICAgICAgICAgICBTZXQgdGhlIGVudHJ5IHBvaW50IHRvIGJlIFRodW1iIDxzeW1ib2w+XG4iKSk7Ci0jaWZkZWYgRExMX1NVUFBPUlQKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWFkZC1zdGRjYWxsLWFsaWFzICAgICAgICAgICAgICAgIEV4cG9ydCBzeW1ib2xzIHdpdGggYW5kIHdpdGhvdXQgQG5uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAgICAgICAgICAgICBEb24ndCBsaW5rIF9zeW0gdG8gX3N5bUBublxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tZW5hYmxlLXN0ZGNhbGwtZml4dXAgICAgICAgICAgICAgTGluayBfc3ltIHRvIF9zeW1Abm4gd2l0aG91dCB3YXJuaW5nc1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tZXhjbHVkZS1zeW1ib2xzIHN5bSxzeW0sLi4uICAgICAgRXhjbHVkZSBzeW1ib2xzIGZyb20gYXV0b21hdGljIGV4cG9ydFxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tZXhwb3J0LWFsbC1zeW1ib2xzICAgICAgICAgICAgICAgQXV0b21hdGljYWxseSBleHBvcnQgYWxsIGdsb2JhbHMgdG8gRExMXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1raWxsLWF0ICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgQG5uIGZyb20gZXhwb3J0ZWQgc3ltYm9sc1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tb3V0LWltcGxpYiA8ZmlsZT4gICAgICAgICAgICAgICAgR2VuZXJhdGUgaW1wb3J0IGxpYnJhcnlcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW91dHB1dC1kZWYgPGZpbGU+ICAgICAgICAgICAgICAgIEdlbmVyYXRlIGEgLkRFRiBmaWxlIGZvciB0aGUgYnVpbHQgRExMXG4iKSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLXNldF9wZV9uYW1lIChuYW1lLCB2YWwpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGxvbmcgdmFsOwotewotICBpbnQgaTsKLSAgLyogRmluZCB0aGUgbmFtZSBhbmQgc2V0IGl0LiAqLwotICBmb3IgKGkgPSAwOyBpbml0W2ldLnB0cjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIGluaXRbaV0uc3ltYm9sKSA9PSAwKQotCXsKLQkgIGluaXRbaV0udmFsdWUgPSB2YWw7Ci0JICBpbml0W2ldLmluaXRlZCA9IDE7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgYWJvcnQoKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX3N1YnN5c3RlbSAoKQotewotICBjb25zdCBjaGFyICpzdmVyOwotICBpbnQgbGVuOwotICBpbnQgaTsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCAKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY29uc3QgaW50IHZhbHVlOwotICAgICAgY29uc3QgY2hhciAqZW50cnk7Ci0gICAgfQotICB2W10gPQotICAgIHsKLSAgICAgIHsgIm5hdGl2ZSIsIDEsICJOdFByb2Nlc3NTdGFydHVwIiB9LAotICAgICAgeyAid2luZG93cyIsIDIsICJXaW5NYWluQ1JUU3RhcnR1cCIgfSwKLSAgICAgIHsgImNvbnNvbGUiLCAzLCAibWFpbkNSVFN0YXJ0dXAiIH0sCi0jaWYgMAotICAgICAgLyogVGhlIE1pY3Jvc29mdCBsaW5rZXIgZG9lcyBub3QgcmVjb2duaXplIHRoaXMuICAqLwotICAgICAgeyAib3MyIiwgNSwgIiIgfSwKLSNlbmRpZgotICAgICAgeyAicG9zaXgiLCA3LCAiX19Qb3NpeFByb2Nlc3NTdGFydHVwIn0sCi0gICAgICB7IDAsIDAsIDAgfQotICAgIH07Ci0KLSAgc3ZlciA9IHN0cmNociAob3B0YXJnLCAnOicpOwotICBpZiAoc3ZlciA9PSBOVUxMKQotICAgIGxlbiA9IHN0cmxlbiAob3B0YXJnKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKmVuZDsKLQotICAgICAgbGVuID0gc3ZlciAtIG9wdGFyZzsKLSAgICAgIHNldF9wZV9uYW1lICgiX19tYWpvcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwKLQkJICAgc3RydG91bCAoc3ZlciArIDEsICZlbmQsIDApKTsKLSAgICAgIGlmICgqZW5kID09ICcuJykKLQlzZXRfcGVfbmFtZSAoIl9fbWlub3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsCi0JCSAgICAgc3RydG91bCAoZW5kICsgMSwgJmVuZCwgMCkpOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGJhZCB2ZXJzaW9uIG51bWJlciBpbiAtc3Vic3lzdGVtIG9wdGlvblxuIikpOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyB2W2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAob3B0YXJnLCB2W2ldLm5hbWUsIGxlbikgPT0gMAotCSAgJiYgdltpXS5uYW1lW2xlbl0gPT0gJ1wwJykKLQl7Ci0JICBjb25zdCBjaGFyICppbml0aWFsX3N5bWJvbF9jaGFyOwotCSAgY29uc3QgY2hhciAqZW50cnk7Ci0KLQkgIHNldF9wZV9uYW1lICgiX19zdWJzeXN0ZW1fXyIsIHZbaV0udmFsdWUpOwotCi0JICBpbml0aWFsX3N5bWJvbF9jaGFyID0gJHtJTklUSUFMX1NZTUJPTF9DSEFSfTsKLQkgIGlmICgqaW5pdGlhbF9zeW1ib2xfY2hhciA9PSAnXDAnKQotCSAgICBlbnRyeSA9IHZbaV0uZW50cnk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICphbGNfZW50cnk7Ci0KLQkgICAgICAvKiBsYW5nX2FkZF9lbnRyeSBleHBlY3RzIGl0cyBhcmd1bWVudCB0byBiZSBwZXJtYW5lbnRseQotCQkgYWxsb2NhdGVkLCBzbyB3ZSBkb24ndCBmcmVlIHRoaXMgc3RyaW5nLiAgKi8KLQkgICAgICBhbGNfZW50cnkgPSB4bWFsbG9jIChzdHJsZW4gKGluaXRpYWxfc3ltYm9sX2NoYXIpCi0JCQkJICAgKyBzdHJsZW4gKHZbaV0uZW50cnkpCi0JCQkJICAgKyAxKTsKLQkgICAgICBzdHJjcHkgKGFsY19lbnRyeSwgaW5pdGlhbF9zeW1ib2xfY2hhcik7Ci0JICAgICAgc3RyY2F0IChhbGNfZW50cnksIHZbaV0uZW50cnkpOwotCSAgICAgIGVudHJ5ID0gYWxjX2VudHJ5OwotCSAgICB9Ci0KLQkgIGxhbmdfYWRkX2VudHJ5IChlbnRyeSwgMSk7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICAKLSAgZWluZm8gKF8oIiVQJUY6IGludmFsaWQgc3Vic3lzdGVtIHR5cGUgJXNcbiIpLCBvcHRhcmcpOwotfQotCi0KLQotc3RhdGljIHZvaWQKLXNldF9wZV92YWx1ZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgCi17Ci0gIGNoYXIgKmVuZDsKLSAgCi0gIHNldF9wZV9uYW1lIChuYW1lLCAgc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKSk7Ci0gIAotICBpZiAoZW5kID09IG9wdGFyZykKLSAgICBlaW5mbyAoXygiJVAlRjogaW52YWxpZCBoZXggbnVtYmVyIGZvciBQRSBwYXJhbWV0ZXIgJyVzJ1xuIiksIG9wdGFyZyk7Ci0KLSAgb3B0YXJnID0gZW5kOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX3N0YWNrX2hlYXAgKHJlc25hbWUsIGNvbW5hbWUpCi0gICAgIGNoYXIgKnJlc25hbWU7Ci0gICAgIGNoYXIgKmNvbW5hbWU7Ci17Ci0gIHNldF9wZV92YWx1ZSAocmVzbmFtZSk7Ci0gIAotICBpZiAoKm9wdGFyZyA9PSAnLCcpCi0gICAgewotICAgICAgb3B0YXJnKys7Ci0gICAgICBzZXRfcGVfdmFsdWUgKGNvbW5hbWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKm9wdGFyZykKLSAgICBlaW5mbyAoXygiJVAlRjogc3RyYW5nZSBoZXggaW5mbyBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIpLCBvcHRhcmcpOwotfQotCi0KLQotc3RhdGljIGludAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgbG9uZ2luZDsKLSAgaW50IG9wdGM7Ci0gIGludCBwcmV2b3B0aW5kID0gb3B0aW5kOwotICBpbnQgcHJldm9wdGVyciA9IG9wdGVycjsKLSAgaW50IHdhbnRlcnJvcjsKLSAgc3RhdGljIGludCBsYXN0b3B0aW5kID0gLTE7Ci0KLSAgaWYgKGxhc3RvcHRpbmQgIT0gb3B0aW5kKQotICAgIG9wdGVyciA9IDA7Ci0gIHdhbnRlcnJvciA9IG9wdGVycjsKLQotICBsYXN0b3B0aW5kID0gb3B0aW5kOwotCi0gIG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLSIsIGxvbmdvcHRzLCAmbG9uZ2luZCk7Ci0gIG9wdGVyciA9IHByZXZvcHRlcnI7Ci0KLSAgc3dpdGNoIChvcHRjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHdhbnRlcnJvcikKLQl4ZXhpdCAoMSk7Ci0gICAgICBvcHRpbmQgPSAgcHJldm9wdGluZDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBPUFRJT05fQkFTRV9GSUxFOgotICAgICAgbGlua19pbmZvLmJhc2VfZmlsZSA9IChQVFIpIGZvcGVuIChvcHRhcmcsIEZPUEVOX1dCKTsKLSAgICAgIGlmIChsaW5rX2luZm8uYmFzZV9maWxlID09IE5VTEwpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IG9wZW4gYmFzZSBmaWxlICVzXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgeGV4aXQgKDEpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBQRSBvcHRpb25zICovCi0gICAgY2FzZSBPUFRJT05fSEVBUDogCi0gICAgICBzZXRfcGVfc3RhY2tfaGVhcCAoIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIsICJfX3NpemVfb2ZfaGVhcF9jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1RBQ0s6IAotICAgICAgc2V0X3BlX3N0YWNrX2hlYXAgKCJfX3NpemVfb2Zfc3RhY2tfcmVzZXJ2ZV9fIiwgIl9fc2l6ZV9vZl9zdGFja19jb21taXRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1VCU1lTVEVNOgotICAgICAgc2V0X3BlX3N1YnN5c3RlbSAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX09TX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX29zX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfT1NfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3Jfb3NfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX2ltYWdlX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTjoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3JfaW1hZ2VfdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9GSUxFX0FMSUdOTUVOVDoKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9fZmlsZV9hbGlnbm1lbnRfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQ6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX3NlY3Rpb25fYWxpZ25tZW50X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0RMTDoKLSAgICAgIHNldF9wZV9uYW1lICgiX19kbGxfXyIsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fSU1BR0VfQkFTRToKLSAgICAgIHNldF9wZV92YWx1ZSAoIl9faW1hZ2VfYmFzZV9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9TVVBQT1JUX09MRF9DT0RFOgotICAgICAgc3VwcG9ydF9vbGRfY29kZSA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9USFVNQl9FTlRSWToKLSAgICAgIHRodW1iX2VudHJ5X3N5bWJvbCA9IG9wdGFyZzsKLSAgICAgIGJyZWFrOwotI2lmZGVmIERMTF9TVVBQT1JUCi0gICAgY2FzZSBPUFRJT05fT1VUX0RFRjoKLSAgICAgIHBlX291dF9kZWZfZmlsZW5hbWUgPSB4c3RyZHVwIChvcHRhcmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRVhQT1JUX0FMTDoKLSAgICAgIHBlX2RsbF9leHBvcnRfZXZlcnl0aGluZyA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9FWENMVURFX1NZTUJPTFM6Ci0gICAgICBwZV9kbGxfYWRkX2V4Y2x1ZGVzIChvcHRhcmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fS0lMTF9BVFM6Ci0gICAgICBwZV9kbGxfa2lsbF9hdHMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1REQ0FMTF9BTElBU0VTOgotICAgICAgcGVfZGxsX3N0ZGNhbGxfYWxpYXNlcyA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9FTkFCTEVfU1REQ0FMTF9GSVhVUDoKLSAgICAgIHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0RJU0FCTEVfU1REQ0FMTF9GSVhVUDoKLSAgICAgIHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0lNUExJQl9GSUxFTkFNRToKLSAgICAgIHBlX2ltcGxpYl9maWxlbmFtZSA9IHhzdHJkdXAgKG9wdGFyZyk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0MCi0vKiBBc3NpZ24gdmFsdWVzIHRvIHRoZSBzcGVjaWFsIHN5bWJvbHMgYmVmb3JlIHRoZSBsaW5rZXIgc2NyaXB0IGlzCi0gICByZWFkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyAoKQotewotICAvKiBSdW4gdGhyb3VnaCBhbmQgaW52ZW50IHN5bWJvbHMgZm9yIGFsbCB0aGUKLSAgICAgbmFtZXMgYW5kIGluc2VydCB0aGUgZGVmYXVsdHMuICovCi0gIGludCBqOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnNhdmU7Ci0KLSAgaWYgKCFpbml0W0lNQUdFQkFTRU9GRl0uaW5pdGVkKQotICAgIHsKLSAgICAgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCWluaXRbSU1BR0VCQVNFT0ZGXS52YWx1ZSA9IDA7Ci0gICAgICBlbHNlIGlmIChpbml0W0RMTE9GRl0udmFsdWUgfHwgbGlua19pbmZvLnNoYXJlZCkKLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSBOVF9ETExfSU1BR0VfQkFTRTsKLSAgICAgIGVsc2UKLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSBOVF9FWEVfSU1BR0VfQkFTRTsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgZG8gYW55IHN5bWJvbCBhc3NpZ25tZW50cyBpZiB0aGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgLyogR2x1ZSB0aGUgYXNzaWdubWVudHMgaW50byB0aGUgYWJzIHNlY3Rpb24gKi8KLSAgc2F2ZSA9IHN0YXRfcHRyOwotCi0gIHN0YXRfcHRyID0gJihhYnNfb3V0cHV0X3NlY3Rpb24tPmNoaWxkcmVuKTsKLQotICBmb3IgKGogPSAwOyBpbml0W2pdLnB0cjsgaisrKQotICAgIHsKLSAgICAgIGxvbmcgdmFsID0gaW5pdFtqXS52YWx1ZTsKLSAgICAgIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqcnY7Ci0gICAgICBydiA9IGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nICxpbml0W2pdLnN5bWJvbCwgZXhwX2ludG9wICh2YWwpKSk7Ci0gICAgICBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihzaG9ydCkpCi0JKihzaG9ydCAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihpbnQpKQotCSooaW50ICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICBlbHNlIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKGxvbmcpKQotCSoobG9uZyAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgLyogVGhpcyBtaWdodCBiZSBhIGxvbmcgbG9uZyBvciBvdGhlciBzcGVjaWFsIHR5cGUuICAqLwotICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihiZmRfdm1hKSkKLQkqKGJmZF92bWEgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIGVsc2UJYWJvcnQoKTsKLSAgICAgIGlmIChqID09IElNQUdFQkFTRU9GRikKLQlpbWFnZV9iYXNlX3N0YXRlbWVudCA9IHJ2OwotICAgIH0KLSAgLyogUmVzdG9yZSB0aGUgcG9pbnRlci4gKi8KLSAgc3RhdF9wdHIgPSBzYXZlOwotICAKLSAgaWYgKHBlLkZpbGVBbGlnbm1lbnQgPgotICAgICAgcGUuU2VjdGlvbkFsaWdubWVudCkKLSAgICB7Ci0gICAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmcsIGZpbGUgYWxpZ25tZW50ID4gc2VjdGlvbiBhbGlnbm1lbnQuXG4iKSk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgbGlua2VyIHNjcmlwdCBhbmQgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zCi0gICBoYXZlIGJlZW4gcmVhZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UgKCkKLXsKLSAgLyogVGhlIFdpbmRvd3MgbGlicmFyaWVzIGFyZSBkZXNpZ25lZCBmb3IgdGhlIGxpbmtlciB0byB0cmVhdCB0aGUKLSAgICAgZW50cnkgcG9pbnQgYXMgYW4gdW5kZWZpbmVkIHN5bWJvbC4gIE90aGVyd2lzZSwgdGhlIC5vYmogdGhhdAotICAgICBkZWZpbmVzIG1haW5DUlRTdGFydHVwIGlzIGJyb3VnaHQgaW4gYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QKLSAgICAgZW5jb3VudGVyZWQgaW4gbGliYy5saWIgYW5kIGl0IGhhcyBvdGhlciBzeW1ib2xzIGluIGl0IHdoaWNoIHdpbGwKLSAgICAgYmUgcHVsbGVkIGluIGJ5IHRoZSBsaW5rIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBhY3QgYXMKLSAgICAgdGhvdWdoIHRoZSB1c2VyIHNwZWNpZmllZCAtdSB3aXRoIHRoZSBlbnRyeSBwb2ludCBzeW1ib2wuCi0KLSAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGxpbmtlciBzY3JpcHQgYW5kIGNvbW1hbmQgbGluZQotICAgICBvcHRpb25zIGhhdmUgYmVlbiByZWFkLCBzbyBhdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlIHJpZ2h0IGVudHJ5Ci0gICAgIHBvaW50LiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBpbnB1dCBmaWxlcyBhcmUKLSAgICAgb3BlbmVkLCBzbyByZWdpc3RlcmluZyB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCB3aWxsIG1ha2UgYQotICAgICBkaWZmZXJlbmNlLiAgKi8KLQotICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlICYmIGVudHJ5X3N5bWJvbCAhPSBOVUxMKQotICAgIGxkbGFuZ19hZGRfdW5kZWYgKGVudHJ5X3N5bWJvbCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqcGVfdW5kZWZfZm91bmRfc3ltOwotCi1zdGF0aWMgYm9vbGVhbgotcGVfdW5kZWZfY2RlY2xfbWF0Y2ggKGgsIHN0cmluZykKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIFBUUiBzdHJpbmc7Ci17Ci0gIGludCBzbCA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiBzdHJuY21wIChoLT5yb290LnN0cmluZywgc3RyaW5nLCBzbCkgPT0gMAotICAgICAgJiYgaC0+cm9vdC5zdHJpbmdbc2xdID09ICdAJykKLSAgewotICAgIHBlX3VuZGVmX2ZvdW5kX3N5bSA9IGg7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotcGVfZml4dXBfc3RkY2FsbHMgKCkKLXsKLSAgc3RhdGljIGludCBnYXZlX3dhcm5pbmdfbWVzc2FnZSA9IDA7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICp1bmRlZiwgKnN5bTsKLSAgY2hhciAqYXQ7Ci0gIGZvciAodW5kZWYgPSBsaW5rX2luZm8uaGFzaC0+dW5kZWZzOyB1bmRlZjsgdW5kZWY9dW5kZWYtPm5leHQpCi0gICAgaWYgKHVuZGVmLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotICAgIHsKLSAgICAgIGF0ID0gc3RyY2hyICh1bmRlZi0+cm9vdC5zdHJpbmcsICdAJyk7Ci0gICAgICBpZiAoYXQpCi0gICAgICB7Ci0JLyogVGhlIHN5bWJvbCBpcyBhIHN0ZGNhbGwgc3ltYm9sLCBzbyBsZXQncyBsb29rIGZvciBhIGNkZWNsCi0JICAgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgcmVzb2x2ZSB0byB0aGF0ICovCi0JY2hhciAqY25hbWUgPSB4c3RyZHVwICh1bmRlZi0+cm9vdC5zdHJpbmcpOwotCWF0ID0gc3RyY2hyIChjbmFtZSwgJ0AnKTsKLQkqYXQgPSAwOwotCXN5bSA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgY25hbWUsIDAsIDAsIDEpOwotCWlmIChzeW0gJiYgc3ltLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQl7Ci0JICB1bmRlZi0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgIHVuZGVmLT51LmRlZi52YWx1ZSA9IHN5bS0+dS5kZWYudmFsdWU7Ci0JICB1bmRlZi0+dS5kZWYuc2VjdGlvbiA9IHN5bS0+dS5kZWYuc2VjdGlvbjsKLQkgIGlmIChwZV9lbmFibGVfc3RkY2FsbF9maXh1cCA9PSAtMSkKLQkgICAgewotCSAgICAgIGVpbmZvIChfKCJXYXJuaW5nOiByZXNvbHZpbmcgJXMgYnkgbGlua2luZyB0byAlc1xuIiksCi0JCSAgICAgdW5kZWYtPnJvb3Quc3RyaW5nLCBjbmFtZSk7Ci0JICAgICAgaWYgKCEgZ2F2ZV93YXJuaW5nX21lc3NhZ2UpCi0JCXsKLQkJICBnYXZlX3dhcm5pbmdfbWVzc2FnZSA9IDE7Ci0JCSAgZWluZm8oXygiVXNlIC0tZW5hYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSB3YXJuaW5nc1xuIikpOwotCQkgIGVpbmZvKF8oIlVzZSAtLWRpc2FibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIGZpeHVwc1xuIikpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JLyogVGhlIHN5bWJvbCBpcyBhIGNkZWNsIHN5bWJvbCwgc28gd2UgbG9vayBmb3Igc3RkY2FsbAotCSAgIHN5bWJvbHMgLSB3aGljaCBtZWFucyBzY2FubmluZyB0aGUgd2hvbGUgc3ltYm9sIHRhYmxlICovCi0JcGVfdW5kZWZfZm91bmRfc3ltID0gMDsKLQliZmRfbGlua19oYXNoX3RyYXZlcnNlIChsaW5rX2luZm8uaGFzaCwgcGVfdW5kZWZfY2RlY2xfbWF0Y2gsCi0JCQkJKFBUUikgdW5kZWYtPnJvb3Quc3RyaW5nKTsKLQlzeW0gPSBwZV91bmRlZl9mb3VuZF9zeW07Ci0JaWYgKHN5bSkKLQl7Ci0JICB1bmRlZi0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgIHVuZGVmLT51LmRlZi52YWx1ZSA9IHN5bS0+dS5kZWYudmFsdWU7Ci0JICB1bmRlZi0+dS5kZWYuc2VjdGlvbiA9IHN5bS0+dS5kZWYuc2VjdGlvbjsKLQkgIGlmIChwZV9lbmFibGVfc3RkY2FsbF9maXh1cCA9PSAtMSkKLQkgICAgewotCSAgICAgIGVpbmZvIChfKCJXYXJuaW5nOiByZXNvbHZpbmcgJXMgYnkgbGlua2luZyB0byAlc1xuIiksCi0JCSAgICAgdW5kZWYtPnJvb3Quc3RyaW5nLCBzeW0tPnJvb3Quc3RyaW5nKTsKLQkgICAgICBpZiAoISBnYXZlX3dhcm5pbmdfbWVzc2FnZSkKLQkJewotCQkgIGdhdmVfd2FybmluZ19tZXNzYWdlID0gMTsKLQkJICBlaW5mbyhfKCJVc2UgLS1lbmFibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIHdhcm5pbmdzXG4iKSk7Ci0JCSAgZWluZm8oXygiVXNlIC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwIHRvIGRpc2FibGUgdGhlc2UgZml4dXBzXG4iKSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotICAvKiBQYXNzIHRoZSB3YWNreSBQRSBjb21tYW5kIGxpbmUgb3B0aW9ucyBpbnRvIHRoZSBvdXRwdXQgYmZkLgotICAgICBGSVhNRTogVGhpcyBzaG91bGQgYmUgZG9uZSB2aWEgYSBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYnkKLSAgICAgaW5jbHVkaW5nIGFuIGludGVybmFsIEJGRCBoZWFkZXIuICAqLwotICAKLSAgaWYgKCFjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5wZSkKLSAgICBlaW5mbyAoXygiJUYlUDogUEUgb3BlcmF0aW9ucyBvbiBub24gUEUgZmlsZS5cbiIpKTsKLQotICBwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyID0gcGU7Ci0gIHBlX2RhdGEgKG91dHB1dF9iZmQpLT5kbGwgPSBpbml0W0RMTE9GRl0udmFsdWU7Ci0KLSNpZmRlZiBETExfU1VQUE9SVAotICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXApIC8qIC0xPXdhcm4gb3IgMT1kaXNhYmxlICovCi0gICAgcGVfZml4dXBfc3RkY2FsbHMgKCk7Ci0KLSAgcGVfcHJvY2Vzc19pbXBvcnRfZGVmcyhvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLSAgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcGVfZGxsX2J1aWxkX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChUQVJHRVRfSVNfYXJtcGUpIHx8IGRlZmluZWQoVEFSR0VUX0lTX2FybV9lcG9jX3BlKQotICBpZiAoc3Ryc3RyIChiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCksICJhcm0iKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSBhcm0gYmFja2VuZCBuZWVkcyBzcGVjaWFsIGZpZWxkcyBpbiB0aGUgb3V0cHV0IGhhc2ggc3RydWN0dXJlLgotCSBUaGVzZSB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiB0aGUgb3V0cHV0IGZvcm1hdCBpcyBhbiBhcm0gZm9ybWF0LAotCSBoZW5jZSB3ZSBkbyBub3Qgc3VwcG9ydCBsaW5raW5nIGFuZCBjaGFuZ2luZyBvdXRwdXQgZm9ybWF0cyBhdCB0aGUKLQkgc2FtZSB0aW1lLiAgVXNlIGEgbGluayBmb2xsb3dlZCBieSBvYmpjb3B5IHRvIGNoYW5nZSBvdXRwdXQgZm9ybWF0cy4gICovCi0gICAgICBlaW5mbyAoIiVGJVglUDogZXJyb3I6IGNhbm5vdCBjaGFuZ2Ugb3V0cHV0IGZvcm1hdCB3aGlsc3QgbGlua2luZyBBUk0gYmluYXJpZXNcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgewotICAgIC8qIEZpbmQgYSBCRkQgdGhhdCBjYW4gaG9sZCB0aGUgaW50ZXJ3b3JraW5nIHN0dWJzLiAgKi8KLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKGJmZF9hcm1fcGVfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8pKQotCSAgYnJlYWs7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIHsKLSAgICBpbnQgaXNfbXNfYXJjaDsKLSAgICBiZmQgKmN1cl9hcmNoID0gMDsKLSAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppczI7Ci0KLSAgICAvKiBDYXJlZnVsIC0gdGhpcyBpcyBhIHNoZWxsIHNjcmlwdC4gIFdhdGNoIHRob3NlIGRvbGxhciBzaWducyEgKi8KLSAgICAvKiBNaWNyb3NvZnQgaW1wb3J0IGxpYnJhcmllcyBoYXZlIGV2ZXJ5IG1lbWJlciBuYW1lZCB0aGUgc2FtZSwKLSAgICAgICBhbmQgbm90IGluIHRoZSByaWdodCBvcmRlciBmb3IgdXMgdG8gbGluayB0aGVtIGNvcnJlY3RseS4gIFdlCi0gICAgICAgbXVzdCBkZXRlY3QgdGhlc2UgYW5kIHJlbmFtZSB0aGUgbWVtYmVycyBzbyB0aGF0IHRoZXknbGwgbGluawotICAgICAgIGNvcnJlY3RseS4gIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBvYmplY3RzOiB0aGUgaGVhZCwgdGhlCi0gICAgICAgdGh1bmtzLCBhbmQgdGhlIHNlbnRpbmVsKHMpLiAgVGhlIGhlYWQgaXMgZWFzeTsgaXQncyB0aGUgb25lCi0gICAgICAgd2l0aCBpZGF0YTIuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2VudGluZWxzIHdvbid0IGhhdmUgcmVsb2NzLAotICAgICAgIGFuZCB0aGUgdGh1bmtzIHdpbGwuICBJdCdzIGVhc2llciB0aGFuIGNoZWNraW5nIHRoZSBzeW1ib2wKLSAgICAgICB0YWJsZSBmb3IgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCi0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmIChpcy0+dGhlX2JmZC0+bXlfYXJjaGl2ZSkKLQkgIHsKLQkgICAgYmZkICphcmNoID0gaXMtPnRoZV9iZmQtPm15X2FyY2hpdmU7Ci0JICAgIGlmIChjdXJfYXJjaCAhPSBhcmNoKQotCSAgICAgIHsKLQkJY3VyX2FyY2ggPSBhcmNoOwotCQlpc19tc19hcmNoID0gMTsKLQkJZm9yIChpczIgPSBpczsKLQkJICAgICBpczIgJiYgaXMyLT50aGVfYmZkLT5teV9hcmNoaXZlID09IGFyY2g7Ci0JCSAgICAgaXMyID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKilpczItPm5leHQpCi0JCSAgewotCQkgICAgaWYgKHN0cmNtcCAoaXMtPnRoZV9iZmQtPmZpbGVuYW1lLCBpczItPnRoZV9iZmQtPmZpbGVuYW1lKSkKLQkJICAgICAgaXNfbXNfYXJjaCA9IDA7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAoaXNfbXNfYXJjaCkKLQkgICAgICB7Ci0JCWludCBpZGF0YTIgPSAwLCByZWxvY19jb3VudD0wOwotCQlhc2VjdGlvbiAqc2VjOwotCQljaGFyICpuZXdfbmFtZSwgc2VxOwotCi0JCWZvciAoc2VjID0gaXMtPnRoZV9iZmQtPnNlY3Rpb25zOyBzZWM7IHNlYyA9IHNlYy0+bmV4dCkKLQkJICB7Ci0JCSAgICBpZiAoc3RyY21wIChzZWMtPm5hbWUsICIuaWRhdGFcJDIiKSA9PSAwKQotCQkgICAgICBpZGF0YTIgPSAxOwotCQkgICAgcmVsb2NfY291bnQgKz0gc2VjLT5yZWxvY19jb3VudDsKLQkJICB9Ci0KLQkJaWYgKGlkYXRhMikgLyogLmlkYXRhMiBpcyB0aGUgVE9DICovCi0JCSAgc2VxID0gJ2EnOwotCQllbHNlIGlmIChyZWxvY19jb3VudCA+IDApIC8qIHRodW5rcyAqLwotCQkgIHNlcSA9ICdiJzsKLQkJZWxzZSAvKiBzZW50aW5lbCAqLwotCQkgIHNlcSA9ICdjJzsKLQotCQluZXdfbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoaXMtPnRoZV9iZmQtPmZpbGVuYW1lKSArIDMpOwotCQlzcHJpbnRmIChuZXdfbmFtZSwgIiVzLiVjIiwgaXMtPnRoZV9iZmQtPmZpbGVuYW1lLCBzZXEpOwotCQlpcy0+dGhlX2JmZC0+ZmlsZW5hbWUgPSBuZXdfbmFtZTsKLQotCQluZXdfbmFtZSA9IHhtYWxsb2MgKHN0cmxlbihpcy0+ZmlsZW5hbWUpICsgMyk7Ci0JCXNwcmludGYgKG5ld19uYW1lLCAiJXMuJWMiLCBpcy0+ZmlsZW5hbWUsIHNlcSk7Ci0JCWlzLT5maWxlbmFtZSA9IG5ld19uYW1lOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgfQotfQotDAotc3RhdGljIHZvaWQgIAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKCkKLXsKLSNpZmRlZiBUQVJHRVRfSVNfcHBjcGUKLSAgLyogSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCB0b2MgaW5mb3JtYXRpb24gKi8KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoIXBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChpcy0+dGhlX2JmZCwgJmxpbmtfaW5mbykpCi0JICB7Ci0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIGVpbmZvIChfKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzXG4iKSwgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgcHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uICgmbGlua19pbmZvKTsKLSNlbmRpZiAvKiBUQVJHRVRfSVNfcHBjcGUgKi8KLQotI2lmIGRlZmluZWQoVEFSR0VUX0lTX2FybXBlKSB8fCBkZWZpbmVkKFRBUkdFVF9JU19hcm1fZXBvY19wZSkKLSAgLyogRklYTUU6IHdlIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJ3b3JraW5nIHN0dWIKLSAgICAgc2VjdGlvbi4KLQotICAgICBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IGdsdWUKLSAgICAgaW5mb3JtYXRpb24uICBGSVhNRTogc2hvdWxkIHRoaXMgYmUgYmFzZWQgb24gYSBjb21tYW5kIGxpbmUKLSAgICAgb3B0aW9uPyAga3JrQGN5Z251cy5jb20gKi8KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoISBiZmRfYXJtX3BlX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLQkgICAgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbywgc3VwcG9ydF9vbGRfY29kZSkpCi0JICB7Ci0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIGVpbmZvIChfKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIGZvciBpbnRlcndvcmtpbmciKSwKLQkJICAgaXMtPmZpbGVuYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KLSAgYmZkX2FybV9wZV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKCYgbGlua19pbmZvKTsKLSNlbmRpZiAvKiBUQVJHRVRfSVNfYXJtcGUgKi8KLX0KLQwKLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhbiBpbnB1dCBmaWxlIGlzbid0IHJlY29nbml6ZWQgYXMgYSBCRkQuICBXZQotICAgY2hlY2sgaGVyZSBmb3IgLkRFRiBmaWxlcyBhbmQgcHVsbCB0aGVtIGluIGF1dG9tYXRpY2FsbHkuICovCi0KLXN0YXRpYyBpbnQKLXNhd19vcHRpb24oY2hhciAqb3B0aW9uKQotewotICBpbnQgaTsKLSAgZm9yIChpPTA7IGluaXRbaV0ucHRyOyBpKyspCi0gICAgaWYgKHN0cmNtcCAoaW5pdFtpXS5zeW1ib2wsIG9wdGlvbikgPT0gMCkKLSAgICAgIHJldHVybiBpbml0W2ldLmluaXRlZDsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fdW5yZWNvZ25pemVkX2ZpbGUoZW50cnkpCi0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotI2lmZGVmIERMTF9TVVBQT1JUCi0gIGNvbnN0IGNoYXIgKmV4dCA9IGVudHJ5LT5maWxlbmFtZSArIHN0cmxlbiAoZW50cnktPmZpbGVuYW1lKSAtIDQ7Ci0KLSAgaWYgKHN0cmNtcCAoZXh0LCAiLmRlZiIpID09IDAgfHwgc3RyY21wIChleHQsICIuREVGIikgPT0gMCkKLSAgewotICAgIGlmIChwZV9kZWZfZmlsZSA9PSAwKQotICAgICAgcGVfZGVmX2ZpbGUgPSBkZWZfZmlsZV9lbXB0eSAoKTsKLSAgICBkZWZfZmlsZV9wYXJzZSAoZW50cnktPmZpbGVuYW1lLCBwZV9kZWZfZmlsZSk7Ci0gICAgaWYgKHBlX2RlZl9maWxlKQotICAgIHsKLSAgICAgIGludCBpLCBidWZsZW49MCwgbGVuOwotICAgICAgY2hhciAqYnVmOwotICAgICAgZm9yIChpPTA7IGk8cGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzOyBpKyspCi0JewotCSAgbGVuID0gc3RybGVuKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCSAgaWYgKGJ1ZmxlbiA8IGxlbisyKQotCSAgICBidWZsZW4gPSBsZW4rMjsKLQl9Ci0gICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChidWZsZW4pOwotICAgICAgZm9yIChpPTA7IGk8cGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzOyBpKyspCi0JewotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0JICBzcHJpbnRmKGJ1ZiwgIl8lcyIsIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCi0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBidWYsIHRydWUsIHRydWUsIHRydWUpOwotCSAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0JICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkgICAgewotCSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgICAgICBoLT51LnVuZGVmLmFiZmQgPSBOVUxMOwotCSAgICAgIGJmZF9saW5rX2FkZF91bmRlZiAobGlua19pbmZvLmhhc2gsIGgpOwotCSAgICB9Ci0JfQotICAgICAgZnJlZSAoYnVmKTsKLQotICAgICAgLyogZGVmX2ZpbGVfcHJpbnQgKHN0ZG91dCwgcGVfZGVmX2ZpbGUpOyAqLwotICAgICAgaWYgKHBlX2RlZl9maWxlLT5pc19kbGwgPT0gMSkKLQlsaW5rX2luZm8uc2hhcmVkID0gMTsKLQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5iYXNlX2FkZHJlc3MgIT0gKGJmZF92bWEpKC0xKSkKLSAgICAgIHsKLQlwZS5JbWFnZUJhc2UgPQotCXBlX2RhdGEgKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlID0KLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSBwZV9kZWZfZmlsZS0+YmFzZV9hZGRyZXNzOwotCWluaXRbSU1BR0VCQVNFT0ZGXS5pbml0ZWQgPSAxOwotCWlmIChpbWFnZV9iYXNlX3N0YXRlbWVudCkKLQkgIGltYWdlX2Jhc2Vfc3RhdGVtZW50LT5leHAgPQotCSAgICBleHBfYXNzb3AgKCc9JywgIl9faW1hZ2VfYmFzZV9fIiwgZXhwX2ludG9wIChwZS5JbWFnZUJhc2UpKTsKLSAgICAgIH0KLQotI2lmIDAKLSAgICAgIC8qIE5vdCBzdXJlIGlmIHRoZXNlICpzaG91bGQqIGJlIHNldCAqLwotICAgICAgaWYgKHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yICE9IC0xKQotICAgICAgewotCXBlLk1ham9ySW1hZ2VWZXJzaW9uID0gcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWFqb3I7Ci0JcGUuTWlub3JJbWFnZVZlcnNpb24gPSBwZV9kZWZfZmlsZS0+dmVyc2lvbl9taW5vcjsKLSAgICAgIH0KLSNlbmRpZgotICAgICAgaWYgKHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlICE9IC0xCi0JICAmJiAhIHNhd19vcHRpb24gKCJfX3NpemVfb2Zfc3RhY2tfcmVzZXJ2ZV9fIikpCi0gICAgICB7Ci0JcGUuU2l6ZU9mU3RhY2tSZXNlcnZlID0gcGVfZGVmX2ZpbGUtPnN0YWNrX3Jlc2VydmU7Ci0JaWYgKHBlX2RlZl9maWxlLT5zdGFja19jb21taXQgIT0gLTEpCi0JICBwZS5TaXplT2ZTdGFja0NvbW1pdCA9IHBlX2RlZl9maWxlLT5zdGFja19jb21taXQ7Ci0gICAgICB9Ci0gICAgICBpZiAocGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZSAhPSAtMQotCSAgJiYgISBzYXdfb3B0aW9uICgiX19zaXplX29mX2hlYXBfcmVzZXJ2ZV9fIikpCi0gICAgICB7Ci0JcGUuU2l6ZU9mSGVhcFJlc2VydmUgPSBwZV9kZWZfZmlsZS0+aGVhcF9yZXNlcnZlOwotCWlmIChwZV9kZWZfZmlsZS0+aGVhcF9jb21taXQgIT0gLTEpCi0JICBwZS5TaXplT2ZIZWFwQ29tbWl0ID0gcGVfZGVmX2ZpbGUtPmhlYXBfY29tbWl0OwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotICAKLX0KLQotc3RhdGljIGJvb2xlYW4KLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9yZWNvZ25pemVkX2ZpbGUoZW50cnkpCi0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotI2lmZGVmIERMTF9TVVBQT1JUCi0jaWZkZWYgVEFSR0VUX0lTX2kzODZwZQotICBwZV9kbGxfaWRfdGFyZ2V0ICgicGVpLWkzODYiKTsKLSNlbmRpZgotICBpZiAoYmZkX2dldF9mb3JtYXQgKGVudHJ5LT50aGVfYmZkKSA9PSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmV4dCA9IGVudHJ5LT5maWxlbmFtZSArIHN0cmxlbiAoZW50cnktPmZpbGVuYW1lKSAtIDQ7Ci0gICAgICBpZiAoc3RyY21wIChleHQsICIuZGxsIikgPT0gMCB8fCBzdHJjbXAgKGV4dCwgIi5ETEwiKSA9PSAwKQotCXJldHVybiBwZV9pbXBsaWVkX2ltcG9ydF9kbGwgKGVudHJ5LT5maWxlbmFtZSk7Ci0gICAgfQotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9maW5pc2ggKCkKLXsKLSNpZiBkZWZpbmVkKFRBUkdFVF9JU19hcm1wZSkgfHwgZGVmaW5lZChUQVJHRVRfSVNfYXJtX2Vwb2NfcGUpCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogaDsKLQotICBpZiAodGh1bWJfZW50cnlfc3ltYm9sICE9IE5VTEwpCi0gICAgewotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgdGh1bWJfZW50cnlfc3ltYm9sLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgCi0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCXsKLQkgIHN0YXRpYyBjaGFyIGJ1ZmZlclszMl07Ci0JICBiZmRfdm1hIHZhbDsKLQkgIAotCSAgLyogU3BlY2lhbCBwcm9jZXNpbmcgaXMgcmVxdWlyZWQgZm9yIGEgVGh1bWIgZW50cnkgc3ltYm9sLiAgVGhlCi0JICAgICBib3R0b20gYml0IG9mIGl0cyBhZGRyZXNzIG11c3QgYmUgc2V0LiAgKi8KLQkgIHZhbCA9IChoLT51LmRlZi52YWx1ZQotCQkgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLAotCQkJCQloLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbikKLQkJICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAKLQkgIHZhbCB8PSAxOwotCSAgCi0JICAvKiBOb3cgY29udmVydCB0aGlzIHZhbHVlIGludG8gYSBzdHJpbmcgYW5kIHN0b3JlIGl0IGluIGVudHJ5X3N5bWJvbAotCSAgICAgd2hlcmUgdGhlIGxhbmdfZmluaXNoKCkgZnVuY3Rpb24gd2lsbCBwaWNrIGl0IHVwLiAgKi8KLQkgIGJ1ZmZlclswXSA9ICcwJzsKLQkgIGJ1ZmZlclsxXSA9ICd4JzsKLQkgIAotCSAgc3ByaW50Zl92bWEgKGJ1ZmZlciArIDIsIHZhbCk7Ci0JICAKLQkgIGlmIChlbnRyeV9zeW1ib2wgIT0gTlVMTCAmJiBlbnRyeV9mcm9tX2NtZGxpbmUpCi0JICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogJy0tdGh1bWItZW50cnkgJXMnIGlzIG92ZXJyaWRpbmcgJy1lICVzJ1xuIiksCi0JCSAgIHRodW1iX2VudHJ5X3N5bWJvbCwgZW50cnlfc3ltYm9sKTsKLQkgIGVudHJ5X3N5bWJvbCA9IGJ1ZmZlcjsKLQl9Ci0gICAgICBlbHNlCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjb25ub3QgZmluZCB0aHVtYiBzdGFydCBzeW1ib2wgJXNcbiIpLCB0aHVtYl9lbnRyeV9zeW1ib2wpOwotICAgIH0KLSNlbmRpZiAvKiBkZWZpbmVkKFRBUkdFVF9JU19hcm1wZSkgfHwgZGVmaW5lZChUQVJHRVRfSVNfYXJtX2Vwb2NfcGUpICovCi0KLSNpZmRlZiBETExfU1VQUE9SVAotICBpZiAobGlua19pbmZvLnNoYXJlZCkKLSAgICB7Ci0gICAgICBwZV9kbGxfZmlsbF9zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gICAgICBpZiAocGVfaW1wbGliX2ZpbGVuYW1lKQotCXBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIgKHBlX2RlZl9maWxlLCBwZV9pbXBsaWJfZmlsZW5hbWUpOwotICAgIH0KLSAgaWYgKHBlX291dF9kZWZfZmlsZW5hbWUpCi0gICAgcGVfZGxsX2dlbmVyYXRlX2RlZl9maWxlIChwZV9vdXRfZGVmX2ZpbGVuYW1lKTsKLSNlbmRpZgotfQotCi0MCi0vKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4KLQotICAgV2UgdXNlIHRoaXMgdG8gcHV0IHNlY3Rpb25zIGluIGEgcmVhc29uYWJsZSBwbGFjZSBpbiB0aGUgZmlsZSwgYW5kCi0gICB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZSBhbGlnbmVkIGFzIHJlcXVpcmVkLgotCi0gICBXZSBoYW5kbGUgZ3JvdXBlZCBzZWN0aW9ucyBoZXJlIGFzIHdlbGwuICBBIHNlY3Rpb24gbmFtZWQgLmZvbyRubgotICAgZ29lcyBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiAuZm9vLiAgQWxsIGdyb3VwZWQgc2VjdGlvbnMgYXJlIHNvcnRlZAotICAgYnkgbmFtZS4KLQotICAgR3JvdXBlZCBzZWN0aW9ucyBmb3IgdGhlIGRlZmF1bHQgc2VjdGlvbnMgYXJlIGhhbmRsZWQgYnkgdGhlCi0gICBkZWZhdWx0IGxpbmtlciBzY3JpcHQgdXNpbmcgd2lsZGNhcmRzLCBhbmQgYXJlIHNvcnRlZCBieQotICAgc29ydF9zZWN0aW9ucy4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqaG9sZF9zZWN0aW9uOwotc3RhdGljIGNoYXIgKmhvbGRfc2VjdGlvbl9uYW1lOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdXNlOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdGV4dDsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3JkYXRhOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2JzczsKLQotLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uICBXZSB1c2UgdGhpcyB0byBwdXQgcmFuZG9tIFNIRl9BTExPQwotICAgc2VjdGlvbnMgaW4gdGhlIHJpZ2h0IHNlZ21lbnQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuIChmaWxlLCBzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgY2hhciAqZG9sbGFyOwotCi0gIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3duZXIsIHMpOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc2NyaXB0IHRvIHNlZSB3aGVyZSB0byBwbGFjZSB0aGlzIHNlY3Rpb24uICAqLwotCi0gIGhvbGRfc2VjdGlvbiA9IHM7Ci0KLSAgaG9sZF9zZWN0aW9uX25hbWUgPSB4c3RyZHVwIChzZWNuYW1lKTsKLSAgaWYgKCFsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGRvbGxhciA9IHN0cmNociAoaG9sZF9zZWN0aW9uX25hbWUsICckJyk7Ci0gICAgICBpZiAoZG9sbGFyICE9IE5VTEwpCi0JKmRvbGxhciA9ICdcMCc7Ci0gICAgfQotCi0gIGhvbGRfdXNlID0gTlVMTDsKLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOwotCi0gIGlmIChob2xkX3VzZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnBsYWNlOwotICAgICAgY2hhciAqb3V0c2VjbmFtZTsKLSAgICAgIGFzZWN0aW9uICpzbmV3LCAqKnBwczsKLSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqb2xkOwotICAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGFkZDsKLSAgICAgIGV0cmVlX3R5cGUgKmFkZHJlc3M7Ci0KLSAgICAgIC8qIFRyeSB0byBwdXQgdGhlIG5ldyBvdXRwdXQgc2VjdGlvbiBpbiBhIHJlYXNvbmFibGUgcGxhY2UgYmFzZWQKLQkgb24gdGhlIHNlY3Rpb24gbmFtZSBhbmQgc2VjdGlvbiBmbGFncy4gICovCi0gICAgICBwbGFjZSA9IE5VTEw7Ci0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgJiYgaG9sZF9ic3MgIT0gTlVMTCkKLQlwbGFjZSA9IGhvbGRfYnNzOwotICAgICAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwCi0JICAgICAgICYmIGhvbGRfZGF0YSAhPSBOVUxMKQotCXBsYWNlID0gaG9sZF9kYXRhOwotICAgICAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX0NPREUpID09IDAKLQkgICAgICAgJiYgKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgICAgICYmIGhvbGRfcmRhdGEgIT0gTlVMTCkKLQlwbGFjZSA9IGhvbGRfcmRhdGE7Ci0gICAgICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkgICAgICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCi0JcGxhY2UgPSBob2xkX3RleHQ7Ci0KLSAgICAgIC8qIENob29zZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgc2VjdGlvbi4gIFRoaXMgd2lsbCBiZSBuZWVkZWQgaWYKLQkgdGhlIHNhbWUgc2VjdGlvbiBuYW1lIGFwcGVhcnMgaW4gdGhlIGlucHV0IGZpbGUgd2l0aAotCSBkaWZmZXJlbnQgbG9hZGFibGUgb3IgYWxsb2NhdGVhYmxlIGNoYXJhY3RlcmlzdGljcy4gICovCi0gICAgICBvdXRzZWNuYW1lID0geHN0cmR1cCAoaG9sZF9zZWN0aW9uX25hbWUpOwotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRzZWNuYW1lKSAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGludCBsZW47Ci0JICBjaGFyICpuZXduYW1lOwotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIGxlbiA9IHN0cmxlbiAob3V0c2VjbmFtZSk7Ci0JICBuZXduYW1lID0geG1hbGxvYyAobGVuICsgNSk7Ci0JICBzdHJjcHkgKG5ld25hbWUsIG91dHNlY25hbWUpOwotCSAgaSA9IDA7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgc3ByaW50ZiAobmV3bmFtZSArIGxlbiwgIiVkIiwgaSk7Ci0JICAgICAgKytpOwotCSAgICB9Ci0JICB3aGlsZSAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5ld25hbWUpICE9IE5VTEwpOwotCi0JICBmcmVlIChvdXRzZWNuYW1lKTsKLQkgIG91dHNlY25hbWUgPSBuZXduYW1lOwotCX0KLQotICAgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBmcmVlIE9VVFNFQ05BTUUsIGFzIGl0IG1heSBnZXQgYXR0YWNoZWQgdG8KLQkgdGhlIG91dHB1dCBzZWN0aW9uIHN0YXRlbWVudC4gICovCi0KLSAgICAgIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGFuZCBwdXQgaXQgaW4gdGhlCi0JIHJpZ2h0IHBsYWNlLiAgVGhpcyBzaHVmZmxpbmcgaXMgdG8gbWFrZSB0aGUgb3V0cHV0IGZpbGUgbG9vawotCSBuZWF0ZXIuICAqLwotICAgICAgc25ldyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dHB1dF9iZmQsIG91dHNlY25hbWUpOwotICAgICAgaWYgKHNuZXcgPT0gTlVMTCkKLQllaW5mbyAoIiVQJUY6IG91dHB1dCBmb3JtYXQgJXMgY2Fubm90IHJlcHJlc2VudCBzZWN0aW9uIGNhbGxlZCAlc1xuIiwKLQkgICAgICAgb3V0cHV0X2JmZC0+eHZlYy0+bmFtZSwgb3V0c2VjbmFtZSk7Ci0gICAgICBpZiAocGxhY2UgIT0gTlVMTCAmJiBwbGFjZS0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICBmb3IgKHBwcyA9ICZvdXRwdXRfYmZkLT5zZWN0aW9uczsgKnBwcyAhPSBzbmV3OyBwcHMgPSAmKCpwcHMpLT5uZXh0KQotCSAgICA7Ci0JICAqcHBzID0gc25ldy0+bmV4dDsKLQkgIHNuZXctPm5leHQgPSBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQ7Ci0JICBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQgPSBzbmV3OwotCX0KLQotICAgICAgLyogU3RhcnQgYnVpbGRpbmcgYSBsaXN0IG9mIHN0YXRlbWVudHMgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBvbGQgPSBzdGF0X3B0cjsKLSAgICAgIHN0YXRfcHRyID0gJmFkZDsKLSAgICAgIGxhbmdfbGlzdF9pbml0IChzdGF0X3B0cik7Ci0KLSAgICAgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCWFkZHJlc3MgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEFsbCBzZWN0aW9ucyBpbiBhbiBleGVjdXRhYmxlIG11c3QgYmUgYWxpZ25lZCB0byBhIHBhZ2UKLQkgICAgIGJvdW5kYXJ5LiAgKi8KLQkgIGFkZHJlc3MgPSBleHBfdW5vcCAoQUxJR05fSywKLQkJCSAgICAgIGV4cF9uYW1lb3AgKE5BTUUsICJfX3NlY3Rpb25fYWxpZ25tZW50X18iKSk7Ci0JfQotCi0gICAgICBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAob3V0c2VjbmFtZSwgYWRkcmVzcywgMCwKLQkJCQkJICAgKGJmZF92bWEpIDAsCi0JCQkJCSAgIChldHJlZV90eXBlICopIE5VTEwsCi0JCQkJCSAgIChldHJlZV90eXBlICopIE5VTEwsCi0JCQkJCSAgIChldHJlZV90eXBlICopIE5VTEwpOwotCi0gICAgICBob2xkX3VzZSA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAob3V0c2VjbmFtZSk7Ci0KLSAgICAgIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0JKChiZmRfdm1hKSAwLCAiKmRlZmF1bHQqIiwKLQkgKHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKSBOVUxMKTsKLQotICAgICAgLyogTm93IHN0aWNrIHRoZSBuZXcgc3RhdGVtZW50IGxpc3QgcmlnaHQgYWZ0ZXIgUExBQ0UuICAqLwotICAgICAgaWYgKHBsYWNlICE9IE5VTEwpCi0JewotCSAgKmFkZC50YWlsID0gcGxhY2UtPmhlYWRlci5uZXh0OwotCSAgcGxhY2UtPmhlYWRlci5uZXh0ID0gYWRkLmhlYWQ7Ci0JfQotCi0gICAgICBzdGF0X3B0ciA9IG9sZDsKLSAgICB9Ci0KLSAgaWYgKGRvbGxhciA9PSBOVUxMKQotICAgIHdpbGRfZG9pdCAoJmhvbGRfdXNlLT5jaGlsZHJlbiwgcywgaG9sZF91c2UsIGZpbGUpOwotICBlbHNlCi0gICAgewotICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnBsOwotICAgICAgYm9vbGVhbiBmb3VuZF9kb2xsYXI7Ci0gICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgbGlzdDsKLQotICAgICAgLyogVGhlIHNlY3Rpb24gbmFtZSBoYXMgYSAnJCcuICBTb3J0IGl0IHdpdGggdGhlIG90aGVyICckJwotICAgICAgICAgc2VjdGlvbnMuICAqLwotCi0gICAgICBmb3VuZF9kb2xsYXIgPSBmYWxzZTsKLSAgICAgIGZvciAocGwgPSAmaG9sZF91c2UtPmNoaWxkcmVuLmhlYWQ7ICpwbCAhPSBOVUxMOyBwbCA9ICYoKnBsKS0+bmV4dCkKLQl7Ci0JICBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqbHM7Ci0JICBjb25zdCBjaGFyICpsbmFtZTsKLQotCSAgaWYgKCgqcGwpLT5oZWFkZXIudHlwZSAhPSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bSkKLQkgICAgY29udGludWU7Ci0KLQkgIGxzID0gJigqcGwpLT5pbnB1dF9zZWN0aW9uOwotCi0JICBsbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChscy0+aWZpbGUtPnRoZV9iZmQsIGxzLT5zZWN0aW9uKTsKLQkgIGlmIChzdHJjaHIgKGxuYW1lLCAnJCcpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoZm91bmRfZG9sbGFyKQotCQlicmVhazsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZm91bmRfZG9sbGFyID0gdHJ1ZTsKLQkgICAgICBpZiAoc3RyY21wIChzZWNuYW1lLCBsbmFtZSkgPCAwKQotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgbGFuZ19saXN0X2luaXQgKCZsaXN0KTsKLSAgICAgIHdpbGRfZG9pdCAoJmxpc3QsIHMsIGhvbGRfdXNlLCBmaWxlKTsKLSAgICAgIGlmIChsaXN0LmhlYWQgIT0gTlVMTCkKLQl7Ci0JICBBU1NFUlQgKGxpc3QuaGVhZC0+bmV4dCA9PSBOVUxMKTsKLQkgIGxpc3QuaGVhZC0+bmV4dCA9ICpwbDsKLQkgICpwbCA9IGxpc3QuaGVhZDsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKGhvbGRfc2VjdGlvbl9uYW1lKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24gKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGlmIChzLT5oZWFkZXIudHlwZSAhPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtKQotICAgIHJldHVybjsKLQotICBvcyA9ICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0KLSAgaWYgKHN0cmNtcCAob3MtPm5hbWUsIGhvbGRfc2VjdGlvbl9uYW1lKSA9PSAwCi0gICAgICAmJiBvcy0+YmZkX3NlY3Rpb24gIT0gTlVMTAotICAgICAgJiYgKChob2xkX3NlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKLQkgID09IChvcy0+YmZkX3NlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkpKQotICAgIGhvbGRfdXNlID0gb3M7Ci0KLSAgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIudGV4dCIpID09IDApCi0gICAgaG9sZF90ZXh0ID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIucmRhdGEiKSA9PSAwKQotICAgIGhvbGRfcmRhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICBob2xkX2RhdGEgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5ic3MiKSA9PSAwKQotICAgIGhvbGRfYnNzID0gb3M7Ci19Ci0MCi1zdGF0aWMgY2hhciAqCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4sCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scywKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV91bnJlY29nbml6ZWRfZmlsZSwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucywKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3JlY29nbml6ZWRfZmlsZQotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL3N1bm9zLmVtIGIvbGQvZW11bHRlbXBsL3N1bm9zLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjA5NWZlLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9zdW5vcy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDEwMzggKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBTdW5PUyBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+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+bG9jYWxfc3ltX25hbWUgKyAyKTsKLQl9Ci0KLSAgICAgIGMgPSAobmVlZF9waW5mbyAtIG5lZWRfY29udGVudHMpIC8gTkVFRF9FTlRSWV9TSVpFOwotICAgICAgaWYgKGMgKyAxID49IG5lZWRfZW50cmllcykKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgbmVlZF9waW5mbyArIDEyKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgKGMgKyAxKSAqIE5FRURfRU5UUllfU0laRSwKLQkJICAgIG5lZWRfcGluZm8gKyAxMik7Ci0KLSAgICAgIG5lZWRfcGluZm8gKz0gTkVFRF9FTlRSWV9TSVpFOwotICAgICAgbmVlZF9wbmFtZXMgKz0gc3RybGVuIChuZWVkX3BuYW1lcykgKyAxOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSItZiBzdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIE5VTEwsIC8qIGZpbmlzaCAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cywKLSAgTlVMTCwgLyogb3Blbl9keW5hbWljX2xpYnJhcnkgKi8KLSAgTlVMTCwgLyogcGxhY2Vfb3JwaGFuICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvdmFuaWxsYS5lbSBiL2xkL2VtdWx0ZW1wbC92YW5pbGxhLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGUzNmZiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC92YW5pbGxhLmVtCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogQSB2YW5pbGxhIGVtdWxhdGlvbiB3aXRoIG5vIGRlZmF1bHRzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi1zdGF0aWMgdm9pZCB2YW5pbGxhX2JlZm9yZV9wYXJzZSgpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi12YW5pbGxhX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZSAqLwotICB1bnNpZ25lZCBsb25nICBtYWNoaW5lID0gMDsKLSAgYmZkX3NldF9hcmNoX21hY2gob3V0cHV0X2JmZCwgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIG1hY2hpbmUpOwotfQotCi1zdGF0aWMgY2hhciAqCi12YW5pbGxhX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLXsKLSAgKmlzZmlsZSA9IDA7Ci0gIHJldHVybiAiIjsKLX0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF92YW5pbGxhX2VtdWxhdGlvbiA9IAotewotICB2YW5pbGxhX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBhZnRlcl9vcGVuX2RlZmF1bHQsCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgdmFuaWxsYV9zZXRfb3V0cHV0X2FyY2gsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgdmFuaWxsYV9nZXRfc2NyaXB0LAotICAidmFuaWxsYSIsCi0gICJhLm91dC1zdW5vcy1iaWciCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9nZW4tZG9jLnRleGkgYi9sZC9nZW4tZG9jLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzY3MjcuLjAwMDAwMDAKLS0tIGEvbGQvZ2VuLWRvYy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTkZJR1VSQVRJT04gVkFSUzoKLUBjIDEuIEluY2x1c2l2ZW5lc3Mgb2YgdGhpcyBtYW51YWwKLUBzZXQgR0VORVJJQwotCi1AYyAyLiBTcGVjaWZpYyB0YXJnZXQgbWFjaGluZXMKLUBzZXQgSDgzMDAKLUBzZXQgSTk2MAotCi1AYyAzLiBQcm9wZXJ0aWVzIG9mIHRoaXMgY29uZmlndXJhdGlvbgotQGNsZWFyIFNpbmdsZUZvcm1hdAotQHNldCBVc2VzRW52VmFycwotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVuZCBDT05GSUdVUkFUSU9OIFZBUlMKLQpkaWZmIC0tZ2l0IGEvbGQvZ2Vuc2NyaXB0cy5zaCBiL2xkL2dlbnNjcmlwdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyOTRhZjcuLjAwMDAwMDAKLS0tIGEvbGQvZ2Vuc2NyaXB0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0jIS9iaW4vc2gKLSMgZ2Vuc2NyaXB0cy5zaCAtIGdlbmVyYXRlIHRoZSBsZC1lbXVsYXRpb24tdGFyZ2V0IHNwZWNpZmljIGZpbGVzCi0jCi0jIFVzYWdlOiBnZW5zY3JpcHRzLnNoIHNyY2RpciBsaWJkaXIgaG9zdCB0YXJnZXQgdGFyZ2V0X2FsaWFzIFwKLSMgZGVmYXVsdF9lbXVsYXRpb24gbmF0aXZlX2xpYl9kaXJzIHRoaXNfZW11bGF0aW9uIHRvb2xfZGlyCi0jCi0jIFNhbXBsZSB1c2FnZToKLSMgZ2Vuc2NyaXB0cy5zaCAvZGptL2xkLWRldm8vZGV2by9sZCAvdXNyL2xvY2FsL2xpYiBzcGFyYy1zdW4tc3Vub3M0LjEuMyBcCi0jIHNwYXJjLXN1bi1zdW5vczQuMS4zIHNwYXJjLXN1bi1zdW5vczQuMS4zIHN1bjQgIiIgc3VuMyBzcGFyYy1zdW4tc3Vub3M0LjEuMwotIyBwcm9kdWNlcyBzdW4zLnggc3VuMy54Ym4gc3VuMy54biBzdW4zLnhyIHN1bjMueHUgZW1fc3VuMy5jCi0KLXNyY2Rpcj0kMQotbGliZGlyPSQyCi1ob3N0PSQzCi10YXJnZXQ9JDQKLXRhcmdldF9hbGlhcz0kNQotRU1VTEFUSU9OX0xJQlBBVEg9JDYKLU5BVElWRV9MSUJfRElSUz0kNwotRU1VTEFUSU9OX05BTUU9JDgKLXRvb2xfbGliPWBlY2hvICR7bGliZGlyfSB8IHNlZCAtZSAnc3wvbGliJHx8J2AvJHs5LSR0YXJnZXRfYWxpYXN9L2xpYgotCi0jIEluY2x1ZGUgdGhlIGVtdWxhdGlvbi1zcGVjaWZpYyBwYXJhbWV0ZXJzOgotLiAke3NyY2Rpcn0vZW11bHBhcmFtcy8ke0VNVUxBVElPTl9OQU1FfS5zaAotCi1pZiB0ZXN0IC1kIGxkc2NyaXB0czsgdGhlbgotICB0cnVlCi1lbHNlCi0gIG1rZGlyIGxkc2NyaXB0cwotZmkKLQotIyBTZXQgdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGgsIGZvciBsaWJyYXJpZXMgbmFtZWQgYnkgLWxmb28uCi0jIElmIExJQl9QQVRIIGlzIGRlZmluZWQgKGUuZy4sIGJ5IE1ha2VmaWxlKSBhbmQgbm9uLWVtcHR5LCBpdCBpcyB1c2VkLgotIyBPdGhlcndpc2UsIHRoZSBkZWZhdWx0IGlzIHNldCBoZXJlLgotIwotIyBUaGUgZm9ybWF0IGlzIHRoZSB1c3VhbCBsaXN0IG9mIGNvbG9uLXNlcGFyYXRlZCBkaXJlY3Rvcmllcy4KLSMgVG8gZm9yY2UgYSBsb2dpY2FsbHkgZW1wdHkgTElCX1BBVEgsIGRvIExJQlBBVEg9IjoiLgotCi1pZiBbICJ4JHtMSUJfUEFUSH0iID0gIngiIF0gOyB0aGVuCi0gICMgQ3Jvc3MsIG9yIG5hdGl2ZSBub24tZGVmYXVsdCBlbXVsYXRpb24gbm90IHJlcXVlc3RpbmcgTElCX1BBVEguCi0gIExJQl9QQVRIPQotCi0gIGlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICAgIGNhc2UgIiAkRU1VTEFUSU9OX0xJQlBBVEggIiBpbgotICAgICAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi0gICAgICAgICMgTmF0aXZlLCBhbmQgZGVmYXVsdCBvciBlbXVsYXRpb24gcmVxdWVzdGluZyBMSUJfUEFUSC4KLSAgICAgICAgTElCX1BBVEg9L2xpYjovdXNyL2xpYgotICAgICAgICBpZiBbIC1uICIke05BVElWRV9MSUJfRElSU30iIF07IHRoZW4KLQkgIExJQl9QQVRIPSR7TElCX1BBVEh9OiR7TkFUSVZFX0xJQl9ESVJTfQotICAgICAgICBmaQotICAgICAgICBpZiBbICIke2xpYmRpcn0iICE9IC91c3IvbGliIF07IHRoZW4KLQkgIExJQl9QQVRIPSR7TElCX1BBVEh9OiR7bGliZGlyfQotICAgICAgICBmaQotICAgICAgICBpZiBbICIke2xpYmRpcn0iICE9IC91c3IvbG9jYWwvbGliIF0gOyB0aGVuCi0JICBMSUJfUEFUSD0ke0xJQl9QQVRIfTovdXNyL2xvY2FsL2xpYgotICAgICAgICBmaQotICAgIGVzYWMKLSAgZmkKLWZpCi0KLSMgQWx3YXlzIHNlYXJjaCAkKHRvb2xkaXIpL2xpYiwgYWthIC91c3IvbG9jYWwvVEFSR0VUL2xpYi4KLUxJQl9QQVRIPSR7TElCX1BBVEh9OiR7dG9vbF9saWJ9Ci0KLUxJQl9TRUFSQ0hfRElSUz1gZWNobyAke0xJQl9QQVRIfSB8IHRyICc6JyAnICcgfCBzZWQgLWUgJ3MvXChbXiBdW14gXSpcKS9TRUFSQ0hfRElSKFwxKTsvZydgCi0KLSMgR2VuZXJhdGUgNSBvciA2IHNjcmlwdCBmaWxlcyBmcm9tIGEgbWFzdGVyIHNjcmlwdCB0ZW1wbGF0ZSBpbgotIyAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2guICBXaGljaCBvbmUgb2YgdGhlIDUgb3IgNgotIyBzY3JpcHQgZmlsZXMgaXMgYWN0dWFsbHkgdXNlZCBkZXBlbmRzIG9uIGNvbW1hbmQgbGluZSBvcHRpb25zIGdpdmVuCi0jIHRvIGxkLiAgKFNDUklQVF9OQU1FIHdhcyBzZXQgaW4gdGhlIGVtdWxwYXJhbXNfZmlsZS4pCi0jCi0jIEEgLnggc2NyaXB0IGZpbGUgaXMgdGhlIGRlZmF1bHQgc2NyaXB0LgotIyBBIC54ciBzY3JpcHQgaXMgZm9yIGxpbmtpbmcgd2l0aG91dCByZWxvY2F0aW9uICgtciBmbGFnKS4KLSMgQSAueHUgc2NyaXB0IGlzIGxpa2UgLnhyLCBidXQgKmRvKiBjcmVhdGUgY29uc3RydWN0b3JzICgtVXIgZmxhZykuCi0jIEEgLnhuIHNjcmlwdCBpcyBmb3IgbGlua2luZyB3aXRoIC1uIGZsYWcgKG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZSkuCi0jIEEgLnhibiBzY3JpcHQgaXMgZm9yIGxpbmtpbmcgd2l0aCAtTiBmbGFnIChtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2UpLgotIyBBIC54cyBzY3JpcHQgaXMgZm9yIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSB3aXRoIHRoZSAtLXNoYXJlZAotIyAgIGZsYWc7IGl0IGlzIG9ubHkgZ2VuZXJhdGVkIGlmICRHRU5FUkFURV9TSExJQl9TQ1JJUFQgaXMgc2V0IGJ5IHRoZQotIyAgIGVtdWxhdGlvbiBwYXJhbWV0ZXJzLgotCi1TRUdNRU5UX1NJWkU9JHtTRUdNRU5UX1NJWkUtJHtUQVJHRVRfUEFHRV9TSVpFfX0KLQotIyBEZXRlcm1pbmUgREFUQV9BTElHTk1FTlQgZm9yIHRoZSA1IHZhcmlhbnRzLCB1c2luZwotIyB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZSBlbXVscGFyYW1zLzxlbXVsYXRpb24+LnNoIGZpbGUgb3IgZGVmYXVsdC4KLQotREFUQV9BTElHTk1FTlRfPSIke0RBVEFfQUxJR05NRU5UXy0ke0RBVEFfQUxJR05NRU5ULUFMSUdOKCR7U0VHTUVOVF9TSVpFfSl9fSIKLURBVEFfQUxJR05NRU5UX249IiR7REFUQV9BTElHTk1FTlRfbi0ke0RBVEFfQUxJR05NRU5UX319IgotREFUQV9BTElHTk1FTlRfTj0iJHtEQVRBX0FMSUdOTUVOVF9OLSR7REFUQV9BTElHTk1FTlQtLn19IgotREFUQV9BTElHTk1FTlRfcj0iJHtEQVRBX0FMSUdOTUVOVF9yLSR7REFUQV9BTElHTk1FTlQtfX0iCi1EQVRBX0FMSUdOTUVOVF91PSIke0RBVEFfQUxJR05NRU5UX3UtJHtEQVRBX0FMSUdOTUVOVF9yfX0iCi0KLUxEX0ZMQUc9cgotREFUQV9BTElHTk1FTlQ9JHtEQVRBX0FMSUdOTUVOVF9yfQotREVGQVVMVF9EQVRBX0FMSUdOTUVOVD0iQUxJR04oJHtTRUdNRU5UX1NJWkV9KSIKLSguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIKLQotTERfRkxBRz11Ci1EQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX3V9Ci1DT05TVFJVQ1RJTkc9IiAiCi0oLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKLSAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1Ci0KLUxEX0ZMQUc9Ci1EQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX30KLVJFTE9DQVRJTkc9IiAiCi0oLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKLSAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngKLQotTERfRkxBRz1uCi1EQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX259Ci1URVhUX1NUQVJUX0FERFI9JHtOT05QQUdFRF9URVhUX1NUQVJUX0FERFItJHtURVhUX1NUQVJUX0FERFJ9fQotKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSB8IHNlZCAtZSAnL14gKiQvZCcgPiBcCi0gIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bgotCi1MRF9GTEFHPU4KLURBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRfTn0KLSguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuCi0KLWlmIHRlc3QgLW4gIiRHRU5FUkFURV9TSExJQl9TQ1JJUFQiOyB0aGVuCi0gIExEX0ZMQUc9c2hhcmVkCi0gIERBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRfcy0ke0RBVEFfQUxJR05NRU5UX319Ci0gIENSRUFURV9TSExJQj0iICIKLSAgIyBOb3RlIHRoYXQgVEVYVF9TVEFSVF9BRERSIGlzIHNldCB0byBOT05QQUdFRF9URVhUX1NUQVJUX0FERFIuCi0gICguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICAgIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cwotZmkKLQotZm9yIGkgaW4gJEVNVUxBVElPTl9MSUJQQVRIIDsgZG8KLSAgdGVzdCAiJGkiID0gIiRFTVVMQVRJT05fTkFNRSIgJiYgQ09NUElMRV9JTj10cnVlCi1kb25lCi0KLSMgR2VuZXJhdGUgZSR7RU1VTEFUSU9OX05BTUV9LmMuCi0uICR7c3JjZGlyfS9lbXVsdGVtcGwvJHtURU1QTEFURV9OQU1FLWdlbmVyaWN9LmVtCmRpZmYgLS1naXQgYS9sZC9oOC1kb2MudGV4aSBiL2xkL2g4LWRvYy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M2MmExLi4wMDAwMDAwCi0tLSBhL2xkL2g4LWRvYy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTkZJR1VSQVRJT04gVkFSUzoKLUBjIDEuIEluY2x1c2l2ZW5lc3Mgb2YgdGhpcyBtYW51YWwKLUBjbGVhciBHRU5FUklDCi0KLUBjIDIuIFNwZWNpZmljIHRhcmdldCBtYWNoaW5lcwotQHNldCBIODMwMAotQHNldCBIaXRhY2hpCi1AY2xlYXIgSTk2MAotCi1AYyAzLiBQcm9wZXJ0aWVzIG9mIHRoaXMgY29uZmlndXJhdGlvbgotQHNldCBTaW5nbGVGb3JtYXQKLUBjbGVhciBVc2VzRW52VmFycwotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVuZCBDT05GSUdVUkFUSU9OIFZBUlMKLQpkaWZmIC0tZ2l0IGEvbGQvbGQuMSBiL2xkL2xkLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NTE2YjkuLjAwMDAwMDAKLS0tIGEvbGQvbGQuMQorKysgL2Rldi9udWxsCkBAIC0xLDExMTUgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBsZCAxICIxNyBBdWd1c3QgMTk5MiIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLWxkIFwtIHRoZSBHTlUgbGlua2VyCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBsZCAKLS5SQiAiW1x8IiBcLW8gIgotLkkgb3V0cHV0XGMKLVwmXHxdIFxjCi0uSSBvYmpmaWxlXGMKLVwmLlx8Llx8LgotLmJyCi0uUkIgIltcfCIgXC1BXGMKLS5JIGFyY2hpdGVjdHVyZVxjCi1cJlx8XSAKLS5SQiAiW1x8IiAiXC1iXCAiXGMKLS5JIGlucHV0LWZvcm1hdFxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLUJzdGF0aWMgIlx8XSIgIAotLlJCICJbXHwiIFwtQmR5bmFtaWMgIlx8XSIgIAotLlJCICJbXHwiIFwtQnN5bWJvbGljICJcfF0iICAKLS5SQiAiW1x8IiAiXC1jXCAiXGMKLS5JIGNvbW1hbmRmaWxlXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtXC1jcmVmICJcfF0iCi0uUkIgIltcfCIgXC1kIHwgXC1kYyB8IFwtZHBcYwotXHxdCi0uYnIKLS5SQiAiW1x8IiAiXC1kZWZzeW1cICJcYwotLkkgc3ltYm9sXGMKLVwmID0gXGMKLS5JIGV4cHJlc3Npb25cYwotXCZcfF0KLS5SQiAiW1x8IiBcLVwtZGVtYW5nbGUgIlx8XSIKLS5SQiAiW1x8IiBcLVwtbm9cLWRlbWFuZ2xlICJcfF0iCi0uUkIgIltcfCIgIlwtZVwgIlxjCi0uSSBlbnRyeVxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLWVtYmVkZGVkXC1yZWxvY3MgIlx8XSIKLS5SQiAiW1x8IiBcLUUgIlx8XSIgCi0uUkIgIltcfCIgXC1leHBvcnRcLWR5bmFtaWMgIlx8XSIKLS5SQiAiW1x8IiAiXC1mXCAiXGMKLS5JIG5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1cLWF1eGlsaWFyeVwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtRlwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtXC1maWx0ZXJcICJcYwotLkkgbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLWZvcm1hdFwgIlxjCi0uSSBpbnB1dC1mb3JtYXRcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1nICJcfF0iIAotLlJCICJbXHwiIFwtRwotLkkgc2l6ZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLWhcICJcYwotLkkgbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLXNvbmFtZVwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIKLS5SQiAiW1x8IiBcLWkgIlx8XSIKLS5SQiAiW1x8IiBcLWxcYwotLkkgYXJcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1MXGMKLS5JIHNlYXJjaGRpclxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLU0gIlx8XSIgCi0uUkIgIltcfCIgXC1NYXAKLS5JIG1hcGZpbGVcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1tCi0uSSBlbXVsYXRpb25cYwotXCZcfF0gCi0uUkIgIltcfCIgXC1uIHwgXC1OICJcfF0iIAotLlJCICJbXHwiIFwtbm9pbmhpYml0LWV4ZWMgIlx8XSIgCi0uUkIgIltcfCIgXC1ub1wta2VlcFwtbWVtb3J5ICJcfF0iIAotLlJCICJbXHwiIFwtbm9cLXdhcm5cLW1pc21hdGNoICJcfF0iIAotLlJCICJbXHwiIFwtT1xjCi0uSSBsZXZlbFxjCi1cJlx8XQotLlJCICJbXHwiICJcLW9mb3JtYXRcICJcYwotLkkgb3V0cHV0LWZvcm1hdFxjCi1cJlx8XSAKLS5SQiAiW1x8IiAiXC1SXCAiXGMKLS5JIGZpbGVuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1yZWxheCAiXHxdIgotLlJCICJbXHwiIFwtciB8IFwtVXIgIlx8XSIgCi0uUkIgIltcfCIgIlwtcnBhdGhcICJcYwotLkkgZGlyZWN0b3J5XGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtcnBhdGhcLWxpbmtcICJcYwotLkkgZGlyZWN0b3J5XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1TICJcfF0iIAotLlJCICJbXHwiIFwtcyAiXHxdIiAKLS5SQiAiW1x8IiBcLXNoYXJlZCAiXHxdIiAKLS5SQiAiW1x8IiBcLXNvcnRcLWNvbW1vbiAiXHxdIiAKLS5SQiAiW1x8IiAiXC1zcGxpdFwtYnlcLXJlbG9jXCAiXGMKLS5JIGNvdW50XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1zcGxpdFwtYnlcLWZpbGUgIlx8XSIgCi0uUkIgIltcfCIgIlwtVFwgIlxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJlx8XSAgCi0uUkIgIltcfCIgIlwtVHRleHRcICJcYwotLkkgdGV4dG9yZ1xjCi1cJlx8XSAKLS5SQiAiW1x8IiAiXC1UZGF0YVwgIlxjCi0uSSBkYXRhb3JnXGMKLVwmXHxdIAotLlJCICJbXHwiICJcLVRic3NcICJcYwotLkkgYnNzb3JnXGMKLVwmXHxdCi0uUkIgIltcfCIgXC10ICJcfF0iIAotLlJCICJbXHwiICJcLXVcICJcYwotLkkgc3ltXGMKLVwmXQotLlJCICJbXHwiIFwtViAiXHxdIgotLlJCICJbXHwiIFwtdiAiXHxdIgotLlJCICJbXHwiIFwtXC12ZXJib3NlICJcfF0iCi0uUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIKLS5SQiAiW1x8IiBcLXdhcm5cLWNvbW1vbiAiXHxdIiAKLS5SQiAiW1x8IiBcLXdhcm5cLWNvbnN0cnVjdG9ycyAiXHxdIiAKLS5SQiAiW1x8IiBcLXdhcm5cLW11bHRpcGxlXC1ncCAiXHxdIiAKLS5SQiAiW1x8IiBcLXdhcm5cLW9uY2UgIlx8XSIgCi0uUkIgIltcfCIgXC13YXJuXC1zZWN0aW9uXC1hbGlnbiAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtd2hvbGVcLWFyY2hpdmUgIlx8XSIgCi0uUkIgIltcfCIgXC1cLW5vXC13aG9sZVwtYXJjaGl2ZSAiXHxdIiAKLS5SQiAiW1x8IiAiXC1cLXdyYXBcICJcYwotLkkgc3ltYm9sXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1YICJcfF0iIAotLlJCICJbXHwiIFwteCAiXHxdIiAKLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1cYwotLkIgbGRcYwotXCYgY29tYmluZXMgYSBudW1iZXIgb2Ygb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzLCByZWxvY2F0ZXMKLXRoZWlyIGRhdGEgYW5kIHRpZXMgdXAgc3ltYm9sIHJlZmVyZW5jZXMuIE9mdGVuIHRoZSBsYXN0IHN0ZXAgaW4KLWJ1aWxkaW5nIGEgbmV3IGNvbXBpbGVkIHByb2dyYW0gdG8gcnVuIGlzIGEgY2FsbCB0byBcYwotLkIgbGRcYwotXCYuCi0KLVxjCi0uQiBsZFxjCi1cJiBhY2NlcHRzIExpbmtlciBDb21tYW5kIExhbmd1YWdlIGZpbGVzIAotdG8gcHJvdmlkZSBleHBsaWNpdCBhbmQgdG90YWwgY29udHJvbCBvdmVyIHRoZSBsaW5raW5nIHByb2Nlc3MuCi1UaGlzIG1hbiBwYWdlIGRvZXMgbm90IGRlc2NyaWJlIHRoZSBjb21tYW5kIGxhbmd1YWdlOyBzZWUgdGhlIGBcfFxjCi0uQiBsZFxjCi1cfCcgZW50cnkgaW4gYFx8XGMKLS5CIGluZm9cYwotXHwnLCBvciB0aGUgbWFudWFsCi0uSQotbGQ6IHRoZSBHTlUgbGlua2VyCi1cJiwgZm9yIGZ1bGwgZGV0YWlscyBvbiB0aGUgY29tbWFuZCBsYW5ndWFnZSBhbmQgb24gb3RoZXIgYXNwZWN0cyBvZgotdGhlIEdOVSBsaW5rZXIuIAotCi1UaGlzIHZlcnNpb24gb2YgXGMKLS5CIGxkXGMKLVwmIHVzZXMgdGhlIGdlbmVyYWwgcHVycG9zZSBCRkQgbGlicmFyaWVzCi10byBvcGVyYXRlIG9uIG9iamVjdCBmaWxlcy4gVGhpcyBhbGxvd3MgXGMKLS5CIGxkXGMKLVwmIHRvIHJlYWQsIGNvbWJpbmUsIGFuZAotd3JpdGUgb2JqZWN0IGZpbGVzIGluIG1hbnkgZGlmZmVyZW50IGZvcm1hdHNcKGVtXCZmb3IgZXhhbXBsZSwgQ09GRiBvcgotXGMKLS5CIGEub3V0XGMKLVwmLiAgRGlmZmVyZW50IGZvcm1hdHMgbWF5IGJlIGxpbmtlZCB0b2dldGhlciB0byBwcm9kdWNlIGFueQotYXZhaWxhYmxlIGtpbmQgb2Ygb2JqZWN0IGZpbGUuICBZb3UgY2FuIHVzZSBgXHxcYwotLkIgb2JqZHVtcCBcLWlcYwotXHwnIHRvIGdldCBhIGxpc3Qgb2YgZm9ybWF0cyBzdXBwb3J0ZWQgb24gdmFyaW91cyBhcmNoaXRlY3R1cmVzOyBzZWUgCi0uQlIgb2JqZHVtcCAoIDEgKS4KLQotQXNpZGUgZnJvbSBpdHMgZmxleGliaWxpdHksIHRoZSBHTlUgbGlua2VyIGlzIG1vcmUgaGVscGZ1bCB0aGFuIG90aGVyCi1saW5rZXJzIGluIHByb3ZpZGluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiAgTWFueSBsaW5rZXJzIGFiYW5kb24KLWV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGVuY291bnRlcmluZyBhbiBlcnJvcjsgd2hlbmV2ZXIgcG9zc2libGUsCi1cYwotLkIgbGRcYwotXCYgY29udGludWVzIGV4ZWN1dGluZywgYWxsb3dpbmcgeW91IHRvIGlkZW50aWZ5IG90aGVyIGVycm9ycwotKG9yLCBpbiBzb21lIGNhc2VzLCB0byBnZXQgYW4gb3V0cHV0IGZpbGUgaW4gc3BpdGUgb2YgdGhlIGVycm9yKS4KLQotVGhlIEdOVSBsaW5rZXIgXGMKLS5CIGxkXGMKLVwmIGlzIG1lYW50IHRvIGNvdmVyIGEgYnJvYWQgcmFuZ2Ugb2Ygc2l0dWF0aW9ucywKLWFuZCB0byBiZSBhcyBjb21wYXRpYmxlIGFzIHBvc3NpYmxlIHdpdGggb3RoZXIgbGlua2Vycy4gIEFzIGEgcmVzdWx0LAoteW91IGhhdmUgbWFueSBjaG9pY2VzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yIHRocm91Z2ggdGhlIGNvbW1hbmQgbGluZSwKLWFuZCB0aHJvdWdoIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQotLlNIIE9QVElPTlMKLVRoZSBwbGV0aG9yYSBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucyBtYXkgc2VlbSBpbnRpbWlkYXRpbmcsIGJ1dCBpbgotYWN0dWFsIHByYWN0aWNlIGZldyBvZiB0aGVtIGFyZSB1c2VkIGluIGFueSBwYXJ0aWN1bGFyIGNvbnRleHQuCi1Gb3IgaW5zdGFuY2UsIGEgZnJlcXVlbnQgdXNlIG9mIFxjCi0uQiBsZFxjCi1cJiBpcyB0byBsaW5rIHN0YW5kYXJkIFVuaXgKLW9iamVjdCBmaWxlcyBvbiBhIHN0YW5kYXJkLCBzdXBwb3J0ZWQgVW5peCBzeXN0ZW0uICBPbiBzdWNoIGEgc3lzdGVtLCB0bwotbGluayBhIGZpbGUgXGMKLS5CIGhlbGxvLm9cYwotXCY6Ci0uc3AKLS5icgotJFwgbGRcIFwtb1wgb3V0cHV0XCAvbGliL2NydDAub1wgaGVsbG8ub1wgXC1sYwotLmJyCi0uc3AKLVRoaXMgdGVsbHMgXGMKLS5CIGxkXGMKLVwmIHRvIHByb2R1Y2UgYSBmaWxlIGNhbGxlZCBcYwotLkIgb3V0cHV0XGMKLVwmIGFzIHRoZQotcmVzdWx0IG9mIGxpbmtpbmcgdGhlIGZpbGUgXGMKLS5CIC9saWIvY3J0MC5vXGMKLVwmIHdpdGggXGMKLS5CIGhlbGxvLm9cYwotXCYgYW5kCi10aGUgbGlicmFyeSBcYwotLkIgbGliYy5hXGMKLVwmIHdoaWNoIHdpbGwgY29tZSBmcm9tIHRoZSBzdGFuZGFyZCBzZWFyY2gKLWRpcmVjdG9yaWVzLgotCi1UaGUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gXGMKLS5CIGxkXGMKLVwmIG1heSBiZSBzcGVjaWZpZWQgaW4gYW55IG9yZGVyLCBhbmQKLW1heSBiZSByZXBlYXRlZCBhdCB3aWxsLiAgRm9yIHRoZSBtb3N0IHBhcnQsIHJlcGVhdGluZyBhbiBvcHRpb24gd2l0aCBhCi1kaWZmZXJlbnQgYXJndW1lbnQgd2lsbCBlaXRoZXIgaGF2ZSBubyBmdXJ0aGVyIGVmZmVjdCwgb3Igb3ZlcnJpZGUgcHJpb3IKLW9jY3VycmVuY2VzICh0aG9zZSBmdXJ0aGVyIHRvIHRoZSBsZWZ0IG9uIHRoZSBjb21tYW5kIGxpbmUpIG9mIGFuCi1vcHRpb24uICAKLQotVGhlIGV4Y2VwdGlvbnNcKGVtXCZ3aGljaCBtYXkgbWVhbmluZ2Z1bGx5IGJlIHVzZWQgbW9yZSB0aGFuIG9uY2VcKGVtXCZhcmUKLVxjCi0uQiBcLUFcYwotXCYsIFxjCi0uQiBcLWJcYwotXCYgKG9yIGl0cyBzeW5vbnltIFxjCi0uQiBcLWZvcm1hdFxjCi1cJiksIFxjCi0uQiBcLWRlZnN5bVxjCi1cJiwKLVxjCi0uQiBcLUxcYwotXCYsIFxjCi0uQiBcLWxcYwotXCYsIFxjCi0uQiBcLVJcYwotXCYsIGFuZCBcYwotLkIgXC11XGMKLVwmLgotCi1UaGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgdG8gYmUgbGlua2VkIHRvZ2V0aGVyLCBzaG93biBhcyBcYwotLkkgb2JqZmlsZVxjCi1cJiwKLW1heSBmb2xsb3csIHByZWNlZGUsIG9yIGJlIG1peGVkIGluIHdpdGggY29tbWFuZC1saW5lIG9wdGlvbnM7IHNhdmUgdGhhdAotYW4gXGMKLS5JIG9iamZpbGVcYwotXCYgYXJndW1lbnQgbWF5IG5vdCBiZSBwbGFjZWQgYmV0d2VlbiBhbiBvcHRpb24gZmxhZyBhbmQKLWl0cyBhcmd1bWVudC4KLQotVXN1YWxseSB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCBhdCBsZWFzdCBvbmUgb2JqZWN0IGZpbGUsIGJ1dCBvdGhlcgotZm9ybXMgb2YgYmluYXJ5IGlucHV0IGZpbGVzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB3aXRoIFxjCi0uQiBcLWxcYwotXCYsCi1cYwotLkIgXC1SXGMKLVwmLCBhbmQgdGhlIHNjcmlwdCBjb21tYW5kIGxhbmd1YWdlLiAgSWYgXGMKLS5JIG5vXGMKLVwmIGJpbmFyeSBpbnB1dAotZmlsZXMgYXQgYWxsIGFyZSBzcGVjaWZpZWQsIHRoZSBsaW5rZXIgZG9lcyBub3QgcHJvZHVjZSBhbnkgb3V0cHV0LCBhbmQKLWlzc3VlcyB0aGUgbWVzc2FnZSBgXHxcYwotLkIgTm8gaW5wdXQgZmlsZXNcYwotXHwnLgotCi1PcHRpb24gYXJndW1lbnRzIG11c3QgZWl0aGVyIGZvbGxvdyB0aGUgb3B0aW9uIGxldHRlciB3aXRob3V0IGludGVydmVuaW5nCi13aGl0ZXNwYWNlLCBvciBiZSBnaXZlbiBhcyBzZXBhcmF0ZSBhcmd1bWVudHMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZQotb3B0aW9uIHRoYXQgcmVxdWlyZXMgdGhlbS4KLQotLlRQCi0uQkkgIi1BIiAiYXJjaGl0ZWN0dXJlIgotSW4gdGhlIGN1cnJlbnQgcmVsZWFzZSBvZiBcYwotLkIgbGRcYwotXCYsIHRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBvbmx5IGZvciB0aGUKLUludGVsIDk2MCBmYW1pbHkgb2YgYXJjaGl0ZWN0dXJlcy4gIEluIHRoYXQgXGMKLS5CIGxkXGMKLVwmIGNvbmZpZ3VyYXRpb24sIHRoZQotXGMKLS5JIGFyY2hpdGVjdHVyZVxjCi1cJiBhcmd1bWVudCBpcyBvbmUgb2YgdGhlIHR3by1sZXR0ZXIgbmFtZXMgaWRlbnRpZnlpbmcKLW1lbWJlcnMgb2YgdGhlIDk2MCBmYW1pbHk7IHRoZSBvcHRpb24gc3BlY2lmaWVzIHRoZSBkZXNpcmVkIG91dHB1dAotdGFyZ2V0LCBhbmQgd2FybnMgb2YgYW55IGluY29tcGF0aWJsZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGlucHV0IGZpbGVzLgotSXQgYWxzbyBtb2RpZmllcyB0aGUgbGlua2VyJ3Mgc2VhcmNoIHN0cmF0ZWd5IGZvciBhcmNoaXZlIGxpYnJhcmllcywgdG8KLXN1cHBvcnQgdGhlIHVzZSBvZiBsaWJyYXJpZXMgc3BlY2lmaWMgdG8gZWFjaCBwYXJ0aWN1bGFyCi1hcmNoaXRlY3R1cmUsIGJ5IGluY2x1ZGluZyBpbiB0aGUgc2VhcmNoIGxvb3AgbmFtZXMgc3VmZml4ZWQgd2l0aCB0aGUKLXN0cmluZyBpZGVudGlmeWluZyB0aGUgYXJjaGl0ZWN0dXJlLgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91ciBcYwotLkIgbGRcYwotXCYgY29tbWFuZCBsaW5lIGluY2x1ZGVkIGBcfFxjCi0uQiBcLUFDQVxjCi1cfCcgYXMKLXdlbGwgYXMgYFx8XGMKLS5CIFwtbHRyeVxjCi1cfCcsIHRoZSBsaW5rZXIgd291bGQgbG9vayAoaW4gaXRzIGJ1aWx0LWluIHNlYXJjaAotcGF0aHMsIGFuZCBpbiBhbnkgcGF0aHMgeW91IHNwZWNpZnkgd2l0aCBcYwotLkIgXC1MXGMKLVwmKSBmb3IgYSBsaWJyYXJ5IHdpdGgKLXRoZSBuYW1lcwotLnNwCi0uYnIKLXRyeQotLmJyCi1saWJ0cnkuYQotLmJyCi10cnljYQotLmJyCi1saWJ0cnljYS5hCi0uYnIKLS5zcAotCi1UaGUgZmlyc3QgdHdvIHBvc3NpYmlsaXRpZXMgd291bGQgYmUgY29uc2lkZXJlZCBpbiBhbnkgZXZlbnQ7IHRoZSBsYXN0Ci10d28gYXJlIGR1ZSB0byB0aGUgdXNlIG9mIGBcfFxjCi0uQiBcLUFDQVxjCi1cfCcuCi0KLUZ1dHVyZSByZWxlYXNlcyBvZiBcYwotLkIgbGRcYwotXCYgbWF5IHN1cHBvcnQgc2ltaWxhciBmdW5jdGlvbmFsaXR5IGZvcgotb3RoZXIgYXJjaGl0ZWN0dXJlIGZhbWlsaWVzLgotCi1Zb3UgY2FuIG1lYW5pbmdmdWxseSB1c2UgXGMKLS5CIFwtQVxjCi1cJiBtb3JlIHRoYW4gb25jZSBvbiBhIGNvbW1hbmQgbGluZSwgaWYKLWFuIGFyY2hpdGVjdHVyZSBmYW1pbHkgYWxsb3dzIGNvbWJpbmF0aW9uIG9mIHRhcmdldCBhcmNoaXRlY3R1cmVzOyBlYWNoCi11c2Ugd2lsbCBhZGQgYW5vdGhlciBwYWlyIG9mIG5hbWUgdmFyaWFudHMgdG8gc2VhcmNoIGZvciB3aGVuIFxjCi0uQiBcLWwKLXNwZWNpZmllcyBhIGxpYnJhcnkuCi0KLS5UUAotLkJJICJcLWIgIiAiaW5wdXQtZm9ybWF0IgotU3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgaW5wdXQgb2JqZWN0IGZpbGVzIHRoYXQgZm9sbG93IHRoaXMgb3B0aW9uCi1vbiB0aGUgY29tbWFuZCBsaW5lLiAgWW91IGRvbid0IHVzdWFsbHkgbmVlZCB0byBzcGVjaWZ5IHRoaXMsIGFzCi1cYwotLkIgbGRcYwotXCYgaXMgY29uZmlndXJlZCB0byBleHBlY3QgYXMgYSBkZWZhdWx0IGlucHV0IGZvcm1hdCB0aGUgbW9zdAotdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4gIFxjCi0uSSBpbnB1dC1mb3JtYXRcYwotXCYgaXMgYSB0ZXh0IHN0cmluZywgdGhlCi1uYW1lIG9mIGEgcGFydGljdWxhciBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBCRkQgbGlicmFyaWVzLiAgCi1cYwotLkIgXC1mb3JtYXQgXGMKLS5JIGlucHV0LWZvcm1hdFxjCi1cJlxjCi1cJiBoYXMgdGhlIHNhbWUgZWZmZWN0LCBhcyBkb2VzIHRoZSBzY3JpcHQgY29tbWFuZAotLkJSIFRBUkdFVCAuCi0KLVlvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBvcHRpb24gaWYgeW91IGFyZSBsaW5raW5nIGZpbGVzIHdpdGggYW4gdW51c3VhbAotYmluYXJ5IGZvcm1hdC4gIFlvdSBjYW4gYWxzbyB1c2UgXGMKLS5CIFwtYlxjCi1cJiB0byBzd2l0Y2ggZm9ybWF0cyBleHBsaWNpdGx5ICh3aGVuCi1saW5raW5nIG9iamVjdCBmaWxlcyBvZiBkaWZmZXJlbnQgZm9ybWF0cyksIGJ5IGluY2x1ZGluZwotXGMKLS5CIFwtYiBcYwotLkkgaW5wdXQtZm9ybWF0XGMKLVwmXGMKLVwmIGJlZm9yZSBlYWNoIGdyb3VwIG9mIG9iamVjdCBmaWxlcyBpbiBhCi1wYXJ0aWN1bGFyIGZvcm1hdC4gIAotCi1UaGUgZGVmYXVsdCBmb3JtYXQgaXMgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLS5CIEdOVVRBUkdFVFxjCi1cJi4gIFlvdSBjYW4gYWxzbyBkZWZpbmUgdGhlIGlucHV0Ci1mb3JtYXQgZnJvbSBhIHNjcmlwdCwgdXNpbmcgdGhlIGNvbW1hbmQgXGMKLS5CIFRBUkdFVFxjCi1cJi4KLQotLlRQCi0uQiBcLUJzdGF0aWMgCi1EbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbgotcGxhdGZvcm1zIGZvciB3aGljaCBzaGFyZWQgbGlicmFyaWVzIGFyZSBzdXBwb3J0ZWQuCi0KLS5UUAotLkIgXC1CZHluYW1pYwotTGluayBhZ2FpbnN0IGR5bmFtaWMgbGlicmFyaWVzLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgb24gcGxhdGZvcm1zCi1mb3Igd2hpY2ggc2hhcmVkIGxpYnJhcmllcyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBvcHRpb24gaXMgbm9ybWFsbHkgdGhlCi1kZWZhdWx0IG9uIHN1Y2ggcGxhdGZvcm1zLgotCi0uVFAKLS5CIFwtQnN5bWJvbGljCi1XaGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGJpbmQgcmVmZXJlbmNlcyB0byBnbG9iYWwgc3ltYm9scyB0bwotdGhlIGRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSwgaWYgYW55LiAgTm9ybWFsbHksIGl0IGlzCi1wb3NzaWJsZSBmb3IgYSBwcm9ncmFtIGxpbmtlZCBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgdG8gb3ZlcnJpZGUgdGhlCi1kZWZpbml0aW9uIHdpdGhpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICBUaGlzIG9wdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwKLW9uIEVMRiBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotCi0uVFAKLS5CSSAiXC1jICIgImNvbW1hbmRmaWxlIgotRGlyZWN0cyBcYwotLkIgbGRcYwotXCYgdG8gcmVhZCBsaW5rIGNvbW1hbmRzIGZyb20gdGhlIGZpbGUKLVxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJi4gIFRoZXNlIGNvbW1hbmRzIHdpbGwgY29tcGxldGVseSBvdmVycmlkZSBcYwotLkIgbGRcYwotXCYncwotZGVmYXVsdCBsaW5rIGZvcm1hdCAocmF0aGVyIHRoYW4gYWRkaW5nIHRvIGl0KTsgXGMKLS5JIGNvbW1hbmRmaWxlXGMKLVwmIG11c3QKLXNwZWNpZnkgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gZGVzY3JpYmUgdGhlIHRhcmdldCBmb3JtYXQuCi0KLQotWW91IG1heSBhbHNvIGluY2x1ZGUgYSBzY3JpcHQgb2YgbGluayBjb21tYW5kcyBkaXJlY3RseSBpbiB0aGUgY29tbWFuZAotbGluZSBieSBicmFja2V0aW5nIGl0IGJldHdlZW4gYFx8XGMKLS5CIHtcYwotXHwnIGFuZCBgXHxcYwotLkIgfVxjCi1cfCcgY2hhcmFjdGVycy4KLQotLlRQCi0uQiBcLVwtY3JlZgotT3V0cHV0IGEgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLiAgSWYgYSBsaW5rZXIgbWFwIGZpbGUgaXMgYmVpbmcKLWdlbmVyYXRlZCwgdGhlIGNyb3NzIHJlZmVyZW5jZSB0YWJsZSBpcyBwcmludGVkIHRvIHRoZSBtYXAgZmlsZS4KLU90aGVyd2lzZSwgaXQgaXMgcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi0uVFAKLS5CIFwtZCAKLS5UUAotLkIgXC1kYwotLlRQCi0uQiBcLWRwCi1UaGVzZSB0aHJlZSBvcHRpb25zIGFyZSBlcXVpdmFsZW50OyBtdWx0aXBsZSBmb3JtcyBhcmUgc3VwcG9ydGVkIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGxpbmtlcnMuICBVc2UgYW55IG9mIHRoZW0gdG8gbWFrZSBcYwotLkIgbGQKLWFzc2lnbiBzcGFjZSB0byBjb21tb24gc3ltYm9scyBldmVuIGlmIGEgcmVsb2NhdGFibGUgb3V0cHV0IGZpbGUgaXMKLXNwZWNpZmllZCAoXGMKLS5CIFwtclxjCi1cJikuICBUaGUgc2NyaXB0IGNvbW1hbmQKLVxjCi0uQiBGT1JDRV9DT01NT05fQUxMT0NBVElPTlxjCi1cJiBoYXMgdGhlIHNhbWUgZWZmZWN0LgotCi0uVFAKLS5CSSAiLWRlZnN5bSAiICJzeW1ib2wiICJcZlIgPSBcZlAiIGV4cHJlc3Npb24KLUNyZWF0ZSBhIGdsb2JhbCBzeW1ib2wgaW4gdGhlIG91dHB1dCBmaWxlLCBjb250YWluaW5nIHRoZSBhYnNvbHV0ZQotYWRkcmVzcyBnaXZlbiBieSBcYwotLkkgZXhwcmVzc2lvblxjCi1cJi4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uIGFzIG1hbnkKLXRpbWVzIGFzIG5lY2Vzc2FyeSB0byBkZWZpbmUgbXVsdGlwbGUgc3ltYm9scyBpbiB0aGUgY29tbWFuZCBsaW5lLiAgQQotbGltaXRlZCBmb3JtIG9mIGFyaXRobWV0aWMgaXMgc3VwcG9ydGVkIGZvciB0aGUgXGMKLS5JIGV4cHJlc3Npb25cYwotXCYgaW4gdGhpcwotY29udGV4dDogeW91IG1heSBnaXZlIGEgaGV4YWRlY2ltYWwgY29uc3RhbnQgb3IgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcKLXN5bWJvbCwgb3IgdXNlIFxjCi0uQiArXGMKLVwmIGFuZCBcYwotLkIgXC1cYwotXCYgdG8gYWRkIG9yIHN1YnRyYWN0IGhleGFkZWNpbWFsCi1jb25zdGFudHMgb3Igc3ltYm9scy4gIElmIHlvdSBuZWVkIG1vcmUgZWxhYm9yYXRlIGV4cHJlc3Npb25zLCBjb25zaWRlcgotdXNpbmcgdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlIGZyb20gYSBzY3JpcHQuCi0KLS5UUAotLkIgXC1cLWRlbWFuZ2xlCi0uVFAKLS5CIFwtXC1ub1wtZGVtYW5nbGUKLVRoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0aGVyIHRvIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyBpbiBlcnJvcgotbWVzc2FnZXMgYW5kIG90aGVyIG91dHB1dC4gIFdoZW4gdGhlIGxpbmtlciBpcyB0b2xkIHRvIGRlbWFuZ2xlLCBpdAotdHJpZXMgdG8gcHJlc2VudCBzeW1ib2wgbmFtZXMgaW4gYSByZWFkYWJsZSBmYXNoaW9uOiBpdCBzdHJpcHMgbGVhZGluZwotdW5kZXJzY29yZXMgaWYgdGhleSBhcmUgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCBhbmQgY29udmVydHMKLUMrKyBtYW5nbGVkIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXIgcmVhZGFibGUgbmFtZXMuICBUaGUgbGlua2VyIHdpbGwKLWRlbWFuZ2xlIGJ5IGRlZmF1bHQgdW5sZXNzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotLkIgQ09MTEVDVF9OT19ERU1BTkdMRQotaXMgc2V0LiAgVGhlc2Ugb3B0aW9ucyBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdC4KLQotLlRQCi0uQkkgIi1lICIgImVudHJ5IlxjCi1cJiAKLVVzZSBcYwotLkkgZW50cnlcYwotXCYgYXMgdGhlIGV4cGxpY2l0IHN5bWJvbCBmb3IgYmVnaW5uaW5nIGV4ZWN1dGlvbiBvZiB5b3VyCi1wcm9ncmFtLCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBlbnRyeSBwb2ludC4gIFNlZSB0aGUgYFx8XGMKLS5CIGxkXGMKLVx8JyBlbnRyeSBpbiBgXHxcYwotLkIgaW5mb1xjCi1cfCcgZm9yIGEKLWRpc2N1c3Npb24gb2YgZGVmYXVsdHMgYW5kIG90aGVyIHdheXMgb2Ygc3BlY2lmeWluZyB0aGUKLWVudHJ5IHBvaW50LgotCi0uVFAKLS5CIFwtZW1iZWRkZWRcLXJlbG9jcwotVGhpcyBvcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gbGlua2luZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLAotZ2VuZXJhdGVkIGJ5IHRoZQotLkIgXC1tZW1iZWRkZWRcLXBpYwotb3B0aW9uIHRvIHRoZSBHTlUgY29tcGlsZXIgYW5kIGFzc2VtYmxlci4gIEl0IGNhdXNlcyB0aGUgbGlua2VyIHRvCi1jcmVhdGUgYSB0YWJsZSB3aGljaCBtYXkgYmUgdXNlZCBhdCBydW50aW1lIHRvIHJlbG9jYXRlIGFueSBkYXRhIHdoaWNoCi13YXMgc3RhdGljYWxseSBpbml0aWFsaXplZCB0byBwb2ludGVyIHZhbHVlcy4gIFNlZSB0aGUgY29kZSBpbgotdGVzdHN1aXRlL2xkLWVtcGljIGZvciBkZXRhaWxzLgotCi0uVFAKLS5CIFwtRQotLlRQCi0uQiBcLWV4cG9ydFwtZHluYW1pYwotV2hlbiBjcmVhdGluZyBhbiBFTEYgZmlsZSwgYWRkIGFsbCBzeW1ib2xzIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLU5vcm1hbGx5LCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgY29udGFpbnMgb25seSBzeW1ib2xzIHdoaWNoIGFyZSB1c2VkCi1ieSBhIGR5bmFtaWMgb2JqZWN0LiAgVGhpcyBvcHRpb24gaXMgbmVlZGVkIGZvciBzb21lIHVzZXMgb2YKLS5JIGRsb3Blbi4KLQotLlRQCi0uQkkgIi1mICIgIm5hbWUiCi0uVFAKLS5CSSAiLS1hdXhpbGlhcnkgIiAibmFtZSIKLVdoZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfQVVYSUxJQVJZIGZpZWxkCi10byB0aGUgc3BlY2lmaWVkIG5hbWUuICBUaGlzIHRlbGxzIHRoZSBkeW5hbWljIGxpbmtlciB0aGF0IHRoZSBzeW1ib2wKLXRhYmxlIG9mIHRoZSBzaGFyZWQgb2JqZWN0IHNob3VsZCBiZSB1c2VkIGFzIGFuIGF1eGlsaWFyeSBmaWx0ZXIgb24gdGhlCi1zeW1ib2wgdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3QKLS5JIG5hbWUuCi0KLS5UUAotLkJJICItRiAiICJuYW1lIgotLlRQCi0uQkkgIi0tZmlsdGVyICIgIm5hbWUiCi1XaGVuIGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LCBzZXQgdGhlIGludGVybmFsIERUX0ZJTFRFUiBmaWVsZCB0bwotdGhlIHNwZWNpZmllZCBuYW1lLiAgVGhpcyB0ZWxscyB0aGUgZHluYW1pYyBsaW5rZXIgdGhhdCB0aGUgc3ltYm9sIHRhYmxlCi1vZiB0aGUgc2hhcmVkIG9iamVjdCBzaG91bGQgYmUgdXNlZCBhcyBhIGZpbHRlciBvbiB0aGUgc3ltYm9sIHRhYmxlIG9mCi10aGUgc2hhcmVkIG9iamVjdAotLkkgbmFtZS4KLQotLlRQCi0uQkkgIlwtZm9ybWF0ICIgImlucHV0XC1mb3JtYXQiCi1TeW5vbnltIGZvciBcYwotLkIgXC1iXGMKLVwmIFxjCi0uSSBpbnB1dFwtZm9ybWF0XGMKLVwmLgotCi0uVFAKLS5CIFwtZwotQWNjZXB0ZWQsIGJ1dCBpZ25vcmVkOyBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHRvb2xzLgotCi0uVFAKLS5CSSAiXC1HICIgInNpemUiXGMKLVNldCB0aGUgbWF4aW11bSBzaXplIG9mIG9iamVjdHMgdG8gYmUgb3B0aW1pemVkIHVzaW5nIHRoZSBHUCByZWdpc3RlcgotdG8KLS5JIHNpemUKLXVuZGVyIE1JUFMgRUNPRkYuICBJZ25vcmVkIGZvciBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi0uVFAKLS5CSSAiLWggIiAibmFtZSIKLS5UUAotLkJJICItc29uYW1lICIgIm5hbWUiCi1XaGVuIGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LCBzZXQgdGhlIGludGVybmFsIERUX1NPTkFNRSBmaWVsZCB0bwotdGhlIHNwZWNpZmllZCBuYW1lLiAgV2hlbiBhbiBleGVjdXRhYmxlIGlzIGxpbmtlZCB3aXRoIGEgc2hhcmVkIG9iamVjdAotd2hpY2ggaGFzIGEgRFRfU09OQU1FIGZpZWxkLCB0aGVuIHdoZW4gdGhlIGV4ZWN1dGFibGUgaXMgcnVuIHRoZSBkeW5hbWljCi1saW5rZXIgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIHNoYXJlZCBvYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBEVF9TT05BTUUKLWZpZWxkIHJhdGhlciB0aGFuIHRoZSB1c2luZyB0aGUgZmlsZSBuYW1lIGdpdmVuIHRvIHRoZSBsaW5rZXIuCi0KLS5UUAotLkIgXC1cLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLVRoaXMgb3B0aW9uIGFuZAotLkIgXC1cLXZlcnNpb24KLWJlZ2luIHdpdGggdHdvIGRhc2hlcyBpbnN0ZWFkIG9mIG9uZQotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBHTlUgcHJvZ3JhbXMuICBUaGUgb3RoZXIgb3B0aW9ucyBzdGFydCB3aXRoCi1vbmx5IG9uZSBkYXNoIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgbGlua2Vycy4KLQotLlRQCi0uQiBcLWkKLVBlcmZvcm0gYW4gaW5jcmVtZW50YWwgbGluayAoc2FtZSBhcyBvcHRpb24gXGMKLS5CIFwtclxjCi1cJikuCi0KLS5UUAotLkJJICJcLWwiICJhciJcYwotXCYgCi1BZGQgYW4gYXJjaGl2ZSBmaWxlIFxjCi0uSSBhclxjCi1cJiB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byBsaW5rLiAgVGhpcyAKLW9wdGlvbiBtYXkgYmUgdXNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgXGMKLS5CIGxkXGMKLVwmIHdpbGwgc2VhcmNoIGl0cwotcGF0aC1saXN0IGZvciBvY2N1cnJlbmNlcyBvZiBcYwotLkIgbGliXGMKLS5JIGFyXGMKLVwmLmFcYwotXCYgZm9yIGV2ZXJ5IFxjCi0uSSBhcgotc3BlY2lmaWVkLgotCi0uVFAKLS5CSSAiXC1MIiAic2VhcmNoZGlyIgotVGhpcyBjb21tYW5kIGFkZHMgcGF0aCBcYwotLkkgc2VhcmNoZGlyXGMKLVwmIHRvIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQKLVxjCi0uQiBsZFxjCi1cJiB3aWxsIHNlYXJjaCBmb3IgYXJjaGl2ZSBsaWJyYXJpZXMuICBZb3UgbWF5IHVzZSB0aGlzIG9wdGlvbgotYW55IG51bWJlciBvZiB0aW1lcy4KLQotVGhlIGRlZmF1bHQgc2V0IG9mIHBhdGhzIHNlYXJjaGVkICh3aXRob3V0IGJlaW5nIHNwZWNpZmllZCB3aXRoCi1cYwotLkIgXC1MXGMKLVwmKSBkZXBlbmRzIG9uIHdoYXQgZW11bGF0aW9uIG1vZGUgXGMKLS5CIGxkXGMKLVwmIGlzIHVzaW5nLCBhbmQgaW4KLXNvbWUgY2FzZXMgYWxzbyBvbiBob3cgaXQgd2FzIGNvbmZpZ3VyZWQuICAgIFRoZQotcGF0aHMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGluIGEgbGluayBzY3JpcHQgd2l0aCB0aGUgXGMKLS5CIFNFQVJDSF9ESVIKLWNvbW1hbmQuCi0KLS5UUAotLkIgXC1NIAotUHJpbnQgKHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZmlsZSkgYSBsaW5rIG1hcFwoZW1cJmRpYWdub3N0aWMgaW5mb3JtYXRpb24KLWFib3V0IHdoZXJlIHN5bWJvbHMgYXJlIG1hcHBlZCBieSBcYwotLkIgbGRcYwotXCYsIGFuZCBpbmZvcm1hdGlvbiBvbiBnbG9iYWwKLWNvbW1vbiBzdG9yYWdlIGFsbG9jYXRpb24uCi0KLS5UUAotLkJJICJcLU1hcCAiICJtYXBmaWxlIlxjCi1QcmludCB0byB0aGUgZmlsZQotLkkgbWFwZmlsZQotYSBsaW5rIG1hcFwoZW1cJmRpYWdub3N0aWMgaW5mb3JtYXRpb24KLWFib3V0IHdoZXJlIHN5bWJvbHMgYXJlIG1hcHBlZCBieSBcYwotLkIgbGRcYwotXCYsIGFuZCBpbmZvcm1hdGlvbiBvbiBnbG9iYWwKLWNvbW1vbiBzdG9yYWdlIGFsbG9jYXRpb24uCi0KLS5UUAotLkJJICJcLW0gIiAiZW11bGF0aW9uIlxjCi1FbXVsYXRlIHRoZQotLkkgZW11bGF0aW9uCi1saW5rZXIuICBZb3UgY2FuIGxpc3QgdGhlIGF2YWlsYWJsZSBlbXVsYXRpb25zIHdpdGggdGhlCi0uSSBcLVwtdmVyYm9zZQotb3IKLS5JIFwtVgotb3B0aW9ucy4gIFRoaXMgb3B0aW9uIG92ZXJyaWRlcyB0aGUgY29tcGlsZWQtaW4gZGVmYXVsdCwgd2hpY2ggaXMgdGhlCi1zeXN0ZW0gZm9yIHdoaWNoIHlvdSBjb25maWd1cmVkCi0uQlIgbGQgLgotCi0uVFAKLS5CIFwtTiAKLXNwZWNpZmllcyByZWFkYWJsZSBhbmQgd3JpdGFibGUgXGMKLS5CIHRleHRcYwotXCYgYW5kIFxjCi0uQiBkYXRhXGMKLVwmIHNlY3Rpb25zLiBJZgotdGhlIG91dHB1dCBmb3JtYXQgc3VwcG9ydHMgVW5peCBzdHlsZSBtYWdpYyBudW1iZXJzLCB0aGUgb3V0cHV0IGlzCi1tYXJrZWQgYXMgXGMKLS5CIE9NQUdJQ1xjCi1cJi4KLQotV2hlbiB5b3UgdXNlIHRoZSBgXHxcYwotLkIgXC1OXGMKLVwmXHwnIG9wdGlvbiwgdGhlIGxpbmtlciBkb2VzIG5vdCBwYWdlLWFsaWduIHRoZQotZGF0YSBzZWdtZW50LgotCi0uVFAKLS5CIFwtbiAKLXNldHMgdGhlIHRleHQgc2VnbWVudCB0byBiZSByZWFkIG9ubHksIGFuZCBcYwotLkIgTk1BR0lDXGMKLVwmIGlzIHdyaXR0ZW4KLWlmIHBvc3NpYmxlLgotCi0uVFAKLS5CIFwtbm9pbmhpYml0XC1leGVjCi1Ob3JtYWxseSwgdGhlIGxpbmtlciB3aWxsIG5vdCBwcm9kdWNlIGFuIG91dHB1dCBmaWxlIGlmIGl0IGVuY291bnRlcnMKLWVycm9ycyBkdXJpbmcgdGhlIGxpbmsgcHJvY2Vzcy4gIFdpdGggdGhpcyBmbGFnLCB5b3UgY2FuIHNwZWNpZnkgdGhhdAoteW91IHdpc2ggdGhlIG91dHB1dCBmaWxlIHJldGFpbmVkIGV2ZW4gYWZ0ZXIgbm9uLWZhdGFsIGVycm9ycy4KLQotLlRQCi0uQiBcLW5vXC1rZWVwXC1tZW1vcnkKLVRoZSBsaW5rZXIgbm9ybWFsbHkgb3B0aW1pemVzIGZvciBzcGVlZCBvdmVyIG1lbW9yeSB1c2FnZSBieSBjYWNoaW5nCi10aGUgc3ltYm9sIHRhYmxlcyBvZiBpbnB1dCBmaWxlcyBpbiBtZW1vcnkuICBUaGlzIG9wdGlvbiB0ZWxscyB0aGUKLWxpbmtlciB0byBpbnN0ZWFkIG9wdGltaXplIGZvciBtZW1vcnkgdXNhZ2UsIGJ5IHJlcmVhZGluZyB0aGUgc3ltYm9sCi10YWJsZXMgYXMgbmVjZXNzYXJ5LiAgVGhpcyBtYXkgYmUgcmVxdWlyZWQgaWYgdGhlIGxpbmtlciBydW5zIG91dCBvZgotbWVtb3J5IHNwYWNlIHdoaWxlIGxpbmtpbmcgYSBsYXJnZSBleGVjdXRhYmxlLgotCi0uVFAKLS5CIFwtbm9cLXdhcm5cLW1pc21hdGNoCi1Ob3JtYWxseSB0aGUgbGlua2VyIHdpbGwgZ2l2ZSBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIGxpbmsgdG9nZXRoZXIKLWlucHV0IGZpbGVzIHRoYXQgYXJlIG1pc21hdGNoZWQgZm9yIHNvbWUgcmVhc29uLCBwZXJoYXBzIGJlY2F1c2UgdGhleQotaGF2ZSBiZWVuIGNvbXBpbGVkIGZvciBkaWZmZXJlbnQgcHJvY2Vzc29ycyBvciBmb3IgZGlmZmVyZW50Ci1lbmRpYW5uZXNzZXMuICBUaGlzIG9wdGlvbiB0ZWxscyB0aGUgbGlua2VyIHRoYXQgaXQgc2hvdWxkIHNpbGVudGx5Ci1wZXJtaXQgc3VjaCBwb3NzaWJsZSBlcnJvcnMuICBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdpdGgKLWNhcmUsIGluIGNhc2VzIHdoZW4geW91IGhhdmUgdGFrZW4gc29tZSBzcGVjaWFsIGFjdGlvbiB0aGF0IGVuc3VyZXMKLXRoYXQgdGhlIGxpbmtlciBlcnJvcnMgYXJlIGluYXBwcm9wcmlhdGUuCi0KLS5UUAotLkJJICJcLW8gIiAib3V0cHV0IgotLkkgb3V0cHV0XGMKLVwmIGlzIGEgbmFtZSBmb3IgdGhlIHByb2dyYW0gcHJvZHVjZWQgYnkgXGMKLS5CIGxkXGMKLVwmOyBpZiB0aGlzCi1vcHRpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgYFx8XGMKLS5CIGEub3V0XGMKLVx8JyBpcyB1c2VkIGJ5IGRlZmF1bHQuICBUaGUKLXNjcmlwdCBjb21tYW5kIFxjCi0uQiBPVVRQVVRcYwotXCYgY2FuIGFsc28gc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KLQotLlRQCi0uQkkgIlwtTyIgImxldmVsIgotR2VuZXJhdGUgb3B0aW1pemVkIG91dHB1dCBmaWxlcy4gIFRoaXMgbWlnaHQgdXNlIHNpZ25pZmljYW50bHkgbW9yZQotdGltZSBhbmQgdGhlcmVmb3JlIHByb2JhYmx5IHNob3VsZCBiZSBlbmFibGVkIG9ubHkgZm9yIGdlbmVyYXRpbmcgdGhlCi1maW5hbCBiaW5hcnkuCi1cYwotLkkgbGV2ZWxcYwotXCYgaXMgc3VwcG9zZWQgdG8gYmUgYSBudW1lcmljIHZhbHVlLiAgQW55IHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvIGVuYWJsZXMKLXRoZSBvcHRpbWl6YXRpb25zLgotCi0uVFAKLS5CSSAiXC1vZm9ybWF0ICIgIm91dHB1dFwtZm9ybWF0IgotU3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgdGhlIG91dHB1dCBvYmplY3QgZmlsZS4KLVlvdSBkb24ndCB1c3VhbGx5IG5lZWQgdG8gc3BlY2lmeSB0aGlzLCBhcwotXGMKLS5CIGxkXGMKLVwmIGlzIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBhcyBhIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0aGUgbW9zdAotdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4gIFxjCi0uSSBvdXRwdXQtZm9ybWF0XGMKLVwmIGlzIGEgdGV4dCBzdHJpbmcsIHRoZQotbmFtZSBvZiBhIHBhcnRpY3VsYXIgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgQkZEIGxpYnJhcmllcy4gIAotVGhlIHNjcmlwdCBjb21tYW5kCi0uQiBPVVRQVVRfRk9STUFUCi1jYW4gYWxzbyBzcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0LCBidXQgdGhpcyBvcHRpb24gb3ZlcnJpZGVzIGl0LgotCi0uVFAKLS5CSSAiXC1SICIgImZpbGVuYW1lIgotUmVhZCBzeW1ib2wgbmFtZXMgYW5kIHRoZWlyIGFkZHJlc3NlcyBmcm9tIFxjCi0uSSBmaWxlbmFtZVxjCi1cJiwgYnV0IGRvIG5vdAotcmVsb2NhdGUgaXQgb3IgaW5jbHVkZSBpdCBpbiB0aGUgb3V0cHV0LiAgVGhpcyBhbGxvd3MgeW91ciBvdXRwdXQgZmlsZQotdG8gcmVmZXIgc3ltYm9saWNhbGx5IHRvIGFic29sdXRlIGxvY2F0aW9ucyBvZiBtZW1vcnkgZGVmaW5lZCBpbiBvdGhlcgotcHJvZ3JhbXMuCi0KLS5UUAotLkIgXC1yZWxheAotQW4gb3B0aW9uIHdpdGggbWFjaGluZSBkZXBlbmRlbnQgZWZmZWN0cy4gIEN1cnJlbnRseSB0aGlzIG9wdGlvbiBpcyBvbmx5Ci1zdXBwb3J0ZWQgb24gdGhlIEg4LzMwMC4KLQotT24gc29tZSBwbGF0Zm9ybXMsIHVzZSB0aGlzIG9wdGlvbiB0byBwZXJmb3JtIGdsb2JhbCBvcHRpbWl6YXRpb25zIHRoYXQKLWJlY29tZSBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVzb2x2ZXMgYWRkcmVzc2luZyBpbiB5b3VyIHByb2dyYW0sIHN1Y2gKLWFzIHJlbGF4aW5nIGFkZHJlc3MgbW9kZXMgYW5kIHN5bnRoZXNpemluZyBuZXcgaW5zdHJ1Y3Rpb25zIGluIHRoZQotb3V0cHV0IG9iamVjdCBmaWxlLiAgCi0KLU9uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQsIGBcfFxjCi0uQiBcLXJlbGF4XGMKLVwmXHwnIGlzIGFjY2VwdGVkLCBidXQgaGFzIG5vIGVmZmVjdC4KLQotLlRQCi0uQiBcLXIgCi1HZW5lcmF0ZXMgcmVsb2NhdGFibGUgb3V0cHV0XChlbVwmaS5lLiwgZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUgdGhhdCBjYW4gaW4KLXR1cm4gc2VydmUgYXMgaW5wdXQgdG8gXGMKLS5CIGxkXGMKLVwmLiAgVGhpcyBpcyBvZnRlbiBjYWxsZWQgXGMKLS5JIHBhcnRpYWwKLWxpbmtpbmdcYwotXCYuICBBcyBhIHNpZGUgZWZmZWN0LCBpbiBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IHN0YW5kYXJkIFVuaXgKLW1hZ2ljIG51bWJlcnMsIHRoaXMgb3B0aW9uIGFsc28gc2V0cyB0aGUgb3V0cHV0IGZpbGUncyBtYWdpYyBudW1iZXIgdG8KLVxjCi0uQiBPTUFHSUNcYwotXCYuCi1JZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhbiBhYnNvbHV0ZSBmaWxlIGlzIHByb2R1Y2VkLiAgV2hlbgotbGlua2luZyBDKysgcHJvZ3JhbXMsIHRoaXMgb3B0aW9uIFxjCi0uSSB3aWxsIG5vdFxjCi1cJiByZXNvbHZlIHJlZmVyZW5jZXMgdG8KLWNvbnN0cnVjdG9yczsgXGMKLS5CIFwtVXJcYwotXCYgaXMgYW4gYWx0ZXJuYXRpdmUuIAotCi1UaGlzIG9wdGlvbiBkb2VzIHRoZSBzYW1lIGFzIFxjCi0uQiBcLWlcYwotXCYuCi0KLS5UUAotLkIgXC1ycGF0aFwgXGZJZGlyZWN0b3J5Ci1BZGQgYSBkaXJlY3RvcnkgdG8gdGhlIHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aC4gIFRoaXMgaXMgdXNlZCB3aGVuCi1saW5raW5nIGFuIEVMRiBleGVjdXRhYmxlIHdpdGggc2hhcmVkIG9iamVjdHMuICBBbGwgCi0uQiBcLXJwYXRoCi1hcmd1bWVudHMgYXJlIGNvbmNhdGVuYXRlZCBhbmQgcGFzc2VkIHRvIHRoZSBydW50aW1lIGxpbmtlciwgd2hpY2ggdXNlcwotdGhlbSB0byBsb2NhdGUgc2hhcmVkIG9iamVjdHMgYXQgcnVudGltZS4gIFRoZQotLkIgXC1ycGF0aAotb3B0aW9uIGlzIGFsc28gdXNlZCB3aGVuIGxvY2F0aW5nIHNoYXJlZCBvYmplY3RzIHdoaWNoIGFyZSBuZWVkZWQgYnkKLXNoYXJlZCBvYmplY3RzIGV4cGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIGxpbms7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YKLXRoZQotLkIgXC1ycGF0aFwtbGluawotb3B0aW9uLiAgSWYKLS5CIFwtcnBhdGgKLWlzIG5vdCB1c2VkIHdoZW4gbGlua2luZyBhbiBFTEYgZXhlY3V0YWJsZSwgdGhlIGNvbnRlbnRzIG9mIHRoZQotZW52aXJvbm1lbnQgdmFyaWFibGUKLS5CIExEX1JVTl9QQVRICi13aWxsIGJlIHVzZWQgaWYgaXQgaXMgZGVmaW5lZC4KLQotVGhlCi0uQiBcLXJwYXRoCi1vcHRpb24gbWF5IGFsc28gYmUgdXNlZCBvbiBTdW5PUy4gIEJ5IGRlZmF1bHQsIG9uIFN1bk9TLCB0aGUgbGlua2VyCi13aWxsIGZvcm0gYSBydW50aW1lIHNlYXJjaCBwYXRoIG91dCBvZiBhbGwgdGhlCi0uQiBcLUwKLW9wdGlvbnMgaXQgaXMgZ2l2ZW4uICBJZiBhCi0uQiBcLXJwYXRoCi1vcHRpb24gaXMgdXNlZCwgdGhlIHJ1bnRpbWUgc2VhcmNoIHBhdGggd2lsbCBiZSBmb3JtZWQgZXhjbHVzaXZlbHkKLXVzaW5nIHRoZQotLkIgXC1ycGF0aAotb3B0aW9ucywgaWdub3JpbmcKLXRoZQotLkIgXC1MCi1vcHRpb25zLiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdXNpbmcgZ2NjLCB3aGljaCBhZGRzIG1hbnkKLS5CIFwtTAotb3B0aW9ucyB3aGljaCBtYXkgYmUgb24gTkZTIG1vdW50ZWQgZmlsZXN5c3RlbXMuCi0KLS5UUAotLkIgXC1ycGF0aFwtbGlua1wgXGZJZGlyZWN0b3J5Ci1XaGVuIHVzaW5nIEVMRiBvciBTdW5PUywgb25lIHNoYXJlZCBsaWJyYXJ5IG1heSByZXF1aXJlIGFub3RoZXIuICBUaGlzCi1oYXBwZW5zIHdoZW4gYW4KLS5CIGxkXCBcLXNoYXJlZAotbGluayBpbmNsdWRlcyBhIHNoYXJlZCBsaWJyYXJ5IGFzIG9uZSBvZiB0aGUgaW5wdXQgZmlsZXMuCi0KLVdoZW4gdGhlIGxpbmtlciBlbmNvdW50ZXJzIHN1Y2ggYSBkZXBlbmRlbmN5IHdoZW4gZG9pbmcgYSBub24tc2hhcmVkLAotbm9uLXJlbG9jYXRlYWJsZSBsaW5rLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgdHJ5IHRvIGxvY2F0ZSB0aGUgcmVxdWlyZWQKLXNoYXJlZCBsaWJyYXJ5IGFuZCBpbmNsdWRlIGl0IGluIHRoZSBsaW5rLCBpZiBpdCBpcyBub3QgaW5jbHVkZWQKLWV4cGxpY2l0bHkuICBJbiBzdWNoIGEgY2FzZSwgdGhlCi0uQiBcLXJwYXRoXC1saW5rCi1vcHRpb24gc3BlY2lmaWVzIHRoZSBmaXJzdCBzZXQgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoLiAgVGhlCi0uQiBcLXJwYXRoXC1saW5rCi1vcHRpb24gbWF5IHNwZWNpZnkgYSBzZXF1ZW5jZSBvZiBkaXJlY3RvcnkgbmFtZXMgZWl0aGVyIGJ5IHNwZWNpZnlpbmcKLWEgbGlzdCBvZiBuYW1lcyBzZXBhcmF0ZWQgYnkgY29sb25zLCBvciBieSBhcHBlYXJpbmcgbXVsdGlwbGUgdGltZXMuCi0KLUlmIHRoZSByZXF1aXJlZCBzaGFyZWQgbGlicmFyeSBpcyBub3QgZm91bmQsIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhCi13YXJuaW5nIGFuZCBjb250aW51ZSB3aXRoIHRoZSBsaW5rLgotCi0uVFAKLS5CIFwtUyAKLU9taXRzIGRlYnVnZ2VyIHN5bWJvbCBpbmZvcm1hdGlvbiAoYnV0IG5vdCBhbGwgc3ltYm9scykgZnJvbSB0aGUgb3V0cHV0IGZpbGUuCi0KLS5UUAotLkIgXC1zIAotT21pdHMgYWxsIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KLQotLlRQCi0uQiBcLXNoYXJlZAotQ3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkuICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBvbiBFTEYgYW5kCi1TdW5PUyBwbGF0Zm9ybXMgKG9uIFN1bk9TIGl0IGlzIG5vdCByZXF1aXJlZCwgYXMgdGhlIGxpbmtlciB3aWxsCi1hdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IHdoZW4gdGhlcmUgYXJlIHVuZGVmaW5lZCBzeW1ib2xzCi1hbmQgdGhlCi0uQiBcLWUKLW9wdGlvbiBpcyBub3QgdXNlZCkuCi0KLS5UUAotLkIgXC1zb3J0XC1jb21tb24KLU5vcm1hbGx5LCB3aGVuCi0uQiBsZAotcGxhY2VzIHRoZSBnbG9iYWwgY29tbW9uIHN5bWJvbHMgaW4gdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBzZWN0aW9ucywKLWl0IHNvcnRzIHRoZW0gYnkgc2l6ZS4gIEZpcnN0IGNvbWUgYWxsIHRoZSBvbmUgYnl0ZSBzeW1ib2xzLCB0aGVuIGFsbAotdGhlIHR3byBieXRlcywgdGhlbiBhbGwgdGhlIGZvdXIgYnl0ZXMsIGFuZCB0aGVuIGV2ZXJ5dGhpbmcgZWxzZS4KLVRoaXMgaXMgdG8gcHJldmVudCBnYXBzIGJldHdlZW4gc3ltYm9scyBkdWUgdG8KLWFsaWdubWVudCBjb25zdHJhaW50cy4gIFRoaXMgb3B0aW9uIGRpc2FibGVzIHRoYXQgc29ydGluZy4KLQotLlRQCi0uQiBcLXNwbGl0XC1ieVwtcmVsb2NcIFxmSWNvdW50Ci1UcnlzIHRvIGNyZWF0ZXMgZXh0cmEgc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBmaWxlIHNvIHRoYXQgbm8gc2luZ2xlCi1vdXRwdXQgc2VjdGlvbiBpbiB0aGUgZmlsZSBjb250YWlucyBtb3JlIHRoYW4KLS5JIGNvdW50Ci1yZWxvY2F0aW9ucy4KLVRoaXMgaXMgdXNlZnVsIHdoZW4gZ2VuZXJhdGluZyBodWdlIHJlbG9jYXRhYmxlIGZvciBkb3dubG9hZGluZyBpbnRvCi1jZXJ0YWluIHJlYWwgdGltZSBrZXJuZWxzIHdpdGggdGhlIENPRkYgb2JqZWN0IGZpbGUgZm9ybWF0OyBzaW5jZSBDT0ZGCi1jYW5ub3QgcmVwcmVzZW50IG1vcmUgdGhhbiA2NTUzNSByZWxvY2F0aW9ucyBpbiBhIHNpbmdsZSBzZWN0aW9uLgotTm90ZSB0aGF0IHRoaXMgd2lsbCBmYWlsIHRvIHdvcmsgd2l0aCBvYmplY3QgZmlsZSBmb3JtYXRzIHdoaWNoIGRvIG5vdAotc3VwcG9ydCBhcmJpdHJhcnkgc2VjdGlvbnMuICBUaGUgbGlua2VyIHdpbGwgbm90IHNwbGl0IHVwIGluZGl2aWR1YWwKLWlucHV0IHNlY3Rpb25zIGZvciByZWRpc3RyaWJ1dGlvbiwgc28gaWYgYSBzaW5nbGUgaW5wdXQgc2VjdGlvbgotY29udGFpbnMgbW9yZSB0aGFuCi0uSSBjb3VudAotcmVsb2NhdGlvbnMgb25lIG91dHB1dCBzZWN0aW9uIHdpbGwgY29udGFpbiB0aGF0IG1hbnkgcmVsb2NhdGlvbnMuCi0KLS5UUAotLkIgXC1zcGxpdFwtYnlcLWZpbGUKLVNpbWlsYXIgdG8KLS5CIFwtc3BsaXRcLWJ5XC1yZWxvYwotYnV0IGNyZWF0ZXMgYSBuZXcgb3V0cHV0IHNlY3Rpb24gZm9yIGVhY2ggaW5wdXQgZmlsZS4KLQotLlRQCi0uQkkgIlwtVGJzcyAiICJvcmciXGMKLS5UUAotLkJJICJcLVRkYXRhICIgIm9yZyJcYwotLlRQCi0uQkkgIlwtVHRleHQgIiAib3JnIlxjCi1Vc2UgXGMKLS5JIG9yZ1xjCi1cJiBhcyB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3JcKGVtXCZyZXNwZWN0aXZlbHlcKGVtXCZ0aGUKLVxjCi0uQiBic3NcYwotXCYsIFxjCi0uQiBkYXRhXGMKLVwmLCBvciB0aGUgXGMKLS5CIHRleHRcYwotXCYgc2VnbWVudCBvZiB0aGUgb3V0cHV0IGZpbGUuCi1cYwotLkkgb3JnXGMKLVwmIG11c3QgYmUgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyLgotCi0uVFAKLS5CSSAiXC1UICIgImNvbW1hbmRmaWxlIgotRXF1aXZhbGVudCB0byBcYwotLkIgXC1jIFxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJlxjCi1cJjsgc3VwcG9ydGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLW90aGVyIHRvb2xzLiAgCi0KLS5UUAotLkIgXC10IAotUHJpbnRzIG5hbWVzIG9mIGlucHV0IGZpbGVzIGFzIFxjCi0uQiBsZFxjCi1cJiBwcm9jZXNzZXMgdGhlbS4KLQotLlRQCi0uQkkgIlwtdSAiICJzeW0iCi1Gb3JjZXMgXGMKLS5JIHN5bVxjCi1cJiB0byBiZSBlbnRlcmVkIGluIHRoZSBvdXRwdXQgZmlsZSBhcyBhbiB1bmRlZmluZWQgc3ltYm9sLgotVGhpcyBtYXksIGZvciBleGFtcGxlLCB0cmlnZ2VyIGxpbmtpbmcgb2YgYWRkaXRpb25hbCBtb2R1bGVzIGZyb20KLXN0YW5kYXJkIGxpYnJhcmllcy4gIFxjCi0uQiBcLXVcYwotXCYgbWF5IGJlIHJlcGVhdGVkIHdpdGggZGlmZmVyZW50IG9wdGlvbgotYXJndW1lbnRzIHRvIGVudGVyIGFkZGl0aW9uYWwgdW5kZWZpbmVkIHN5bWJvbHMuCi0KLS5UUAotLkIgXC1VciAKLUZvciBhbnl0aGluZyBvdGhlciB0aGFuIEMrKyBwcm9ncmFtcywgdGhpcyBvcHRpb24gaXMgZXF1aXZhbGVudCB0bwotXGMKLS5CIFwtclxjCi1cJjogaXQgZ2VuZXJhdGVzIHJlbG9jYXRhYmxlIG91dHB1dFwoZW1cJmkuZS4sIGFuIG91dHB1dCBmaWxlIHRoYXQgY2FuIGluCi10dXJuIHNlcnZlIGFzIGlucHV0IHRvIFxjCi0uQiBsZFxjCi1cJi4gIFdoZW4gbGlua2luZyBDKysgcHJvZ3JhbXMsIFxjCi0uQiBcLVVyCi0uSSB3aWxsXGMKLVwmIHJlc29sdmUgcmVmZXJlbmNlcyB0byBjb25zdHJ1Y3RvcnMsIHVubGlrZSBcYwotLkIgXC1yXGMKLVwmLgotCi0uVFAKLS5CIFwtXC12ZXJib3NlCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGMKLS5CIGxkCi1hbmQgbGlzdCB0aGUgc3VwcG9ydGVkIGVtdWxhdGlvbnMuCi1EaXNwbGF5IHdoaWNoIGlucHV0IGZpbGVzIGNhbiBhbmQgY2FuIG5vdCBiZSBvcGVuZWQuCi0KLS5UUAotLkIgXC12LCBcLVYKLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBcYwotLkIgbGRcYwotXCYuCi1UaGUKLS5CIFwtVgotb3B0aW9uIGFsc28gbGlzdHMgdGhlIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGMKLS5CIGxkCi1hbmQgZXhpdC4KLQotLlRQCi0uQiBcLXdhcm5cLWNvbW1vbgotV2FybiB3aGVuIGEgY29tbW9uIHN5bWJvbCBpcyBjb21iaW5lZCB3aXRoIGFub3RoZXIgY29tbW9uIHN5bWJvbCBvciB3aXRoCi1hIHN5bWJvbCBkZWZpbml0aW9uLiAgVW5peCBsaW5rZXJzIGFsbG93IHRoaXMgc29tZXdoYXQgc2xvcHB5IHByYWN0aWNlLAotYnV0IGxpbmtlcnMgb24gc29tZSBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyBkbyBub3QuICBUaGlzIG9wdGlvbiBhbGxvd3MKLXlvdSB0byBmaW5kIHBvdGVudGlhbCBwcm9ibGVtcyBmcm9tIGNvbWJpbmluZyBnbG9iYWwgc3ltYm9scy4KLQotLlRQCi0uQiBcLXdhcm5cLWNvbnN0cnVjdG9ycwotV2FybiBpZiBhbnkgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhcmUgdXNlZC4gIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIGEKLWZldyBvYmplY3QgZmlsZSBmb3JtYXRzLiAgRm9yIGZvcm1hdHMgbGlrZSBDT0ZGIG9yIEVMRiwgdGhlIGxpbmtlciBjYW4KLW5vdCBkZXRlY3QgdGhlIHVzZSBvZiBnbG9iYWwgY29uc3RydWN0b3JzLgotCi0uVFAKLS5CIFwtd2FyblwtbXVsdGlwbGVcLWdwCi1XYXJuIGlmIHRoZSBvdXRwdXQgZmlsZSByZXF1aXJlcyBtdWx0aXBsZSBnbG9iYWwtcG9pbnRlciB2YWx1ZXMuICBUaGlzCi1vcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIGZvciBjZXJ0YWluIHByb2Nlc3NvcnMsIHN1Y2ggYXMgdGhlIEFscGhhLgotCi0uVFAKLS5CIFwtd2Fyblwtb25jZQotT25seSB3YXJuIG9uY2UgZm9yIGVhY2ggdW5kZWZpbmVkIHN5bWJvbCwgcmF0aGVyIHRoYW4gb25jZSBwZXIgbW9kdWxlCi13aGljaCByZWZlcnMgdG8gaXQuCi0KLS5UUAotLkIgXC13YXJuXC1zZWN0aW9uXC1hbGlnbgotV2FybiBpZiB0aGUgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbiBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YKLWFsaWdubWVudC4gIFR5cGljYWxseSwgdGhlIGFsaWdubWVudCB3aWxsIGJlIHNldCBieSBhbiBpbnB1dCBzZWN0aW9uLgotVGhlIGFkZHJlc3Mgd2lsbCBvbmx5IGJlIGNoYW5nZWQgaWYgaXQgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkOyB0aGF0Ci1pcywgaWYgdGhlIFNFQ1RJT05TIGNvbW1hbmQgZG9lcyBub3Qgc3BlY2lmeSBhIHN0YXJ0IGFkZHJlc3MgZm9yIHRoZQotc2VjdGlvbi4KLQotLlRQCi0uQiBcLVwtd2hvbGVcLWFyY2hpdmUKLUZvciBlYWNoIGFyY2hpdmUgbWVudGlvbmVkIG9uIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIgdGhlCi0uQiBcLVwtd2hvbGVcLWFyY2hpdmUKLW9wdGlvbiwgaW5jbHVkZSBldmVyeSBvYmplY3QgZmlsZSBpbiB0aGUgYXJjaGl2ZSBpbiB0aGUgbGluaywgcmF0aGVyCi10aGFuIHNlYXJjaGluZyB0aGUgYXJjaGl2ZSBmb3IgdGhlIHJlcXVpcmVkIG9iamVjdCBmaWxlcy4gIFRoaXMgaXMKLW5vcm1hbGx5IHVzZWQgdG8gdHVybiBhbiBhcmNoaXZlIGZpbGUgaW50byBhIHNoYXJlZCBsaWJyYXJ5LCBmb3JjaW5nCi1ldmVyeSBvYmplY3QgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBzaGFyZWQgbGlicmFyeS4KLQotLlRQCi0uQiBcLVwtbm9cLXdob2xlXC1hcmNoaXZlCi1UdXJuIG9mZiB0aGUgZWZmZWN0IG9mIHRoZQotLkIgXC1cLXdob2xlXC1hcmNoaXZlCi1vcHRpb24gZm9yIGFyY2hpdmVzIHdoaWNoIGFwcGVhciBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi0uVFAKLS5CSSAiLS13cmFwICIgInN5bWJvbCIKLVVzZSBhIHdyYXBwZXIgZnVuY3Rpb24gZm9yIAotLkkgc3ltYm9sLgotQW55IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8KLS5JIHN5bWJvbAotd2lsbCBiZSByZXNvbHZlZCB0bwotLkJJICJfX3dyYXBfIiAic3ltYm9sIi4KLUFueSB1bmRlZmluZWQgcmVmZXJlbmNlIHRvCi0uQkkgIl9fcmVhbF8iICJzeW1ib2wiCi13aWxsIGJlIHJlc29sdmVkIHRvCi0uSSBzeW1ib2wuCi0KLS5UUAotLkIgXC1YIAotRGVsZXRlIGFsbCB0ZW1wb3JhcnkgbG9jYWwgc3ltYm9scy4gIEZvciBtb3N0IHRhcmdldHMsIHRoaXMgaXMgYWxsIGxvY2FsCi1zeW1ib2xzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggYFx8XGMKLS5CIExcYwotXHwnLgotCi0uVFAKLS5CIFwteAotRGVsZXRlIGFsbCBsb2NhbCBzeW1ib2xzLgotCi0uUFAKLQotLlNIIEVOVklST05NRU5UCi1cYwotWW91IGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCi0uQiBsZFxjCi1cJiB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBcYwotLkIgR05VVEFSR0VUXGMKLVwmLgotCi1cYwotLkIgR05VVEFSR0VUXGMKLVwmIGRldGVybWluZXMgdGhlIGlucHV0LWZpbGUgb2JqZWN0IGZvcm1hdCBpZiB5b3UgZG9uJ3QKLXVzZSBcYwotLkIgXC1iXGMKLVwmIChvciBpdHMgc3lub255bSBcYwotLkIgXC1mb3JtYXRcYwotXCYpLiAgSXRzIHZhbHVlIHNob3VsZCBiZSBvbmUKLW9mIHRoZSBCRkQgbmFtZXMgZm9yIGFuIGlucHV0IGZvcm1hdC4gIElmIHRoZXJlIGlzIG5vCi1cYwotLkIgR05VVEFSR0VUXGMKLVwmIGluIHRoZSBlbnZpcm9ubWVudCwgXGMKLS5CIGxkXGMKLVwmIHVzZXMgdGhlIG5hdHVyYWwgZm9ybWF0Ci1vZiB0aGUgaG9zdC4gSWYgXGMKLS5CIEdOVVRBUkdFVFxjCi1cJiBpcyBzZXQgdG8gXGMKLS5CIGRlZmF1bHRcYwotXCYgdGhlbiBCRkQgYXR0ZW1wdHMgdG8gZGlzY292ZXIgdGhlCi1pbnB1dCBmb3JtYXQgYnkgZXhhbWluaW5nIGJpbmFyeSBpbnB1dCBmaWxlczsgdGhpcyBtZXRob2Qgb2Z0ZW4KLXN1Y2NlZWRzLCBidXQgdGhlcmUgYXJlIHBvdGVudGlhbCBhbWJpZ3VpdGllcywgc2luY2UgdGhlcmUgaXMgbm8gbWV0aG9kCi1vZiBlbnN1cmluZyB0aGF0IHRoZSBtYWdpYyBudW1iZXIgdXNlZCB0byBmbGFnIG9iamVjdC1maWxlIGZvcm1hdHMgaXMKLXVuaXF1ZS4gIEhvd2V2ZXIsIHRoZSBjb25maWd1cmF0aW9uIHByb2NlZHVyZSBmb3IgQkZEIG9uIGVhY2ggc3lzdGVtCi1wbGFjZXMgdGhlIGNvbnZlbnRpb25hbCBmb3JtYXQgZm9yIHRoYXQgc3lzdGVtIGZpcnN0IGluIHRoZSBzZWFyY2gtbGlzdCwKLXNvIGFtYmlndWl0aWVzIGFyZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb252ZW50aW9uLgotCi0uUFAKLQotLlNIICJTRUUgQUxTTyIKLQotLkJSIG9iamR1bXAgKCAxICkKLS5icgotLmJyCi0uUkIgImBcfCIgbGQgIlx8JyBhbmQgYFx8IiBiaW51dGlscyAiXHwnIgotZW50cmllcyBpbgotLkIgaW5mb1xjCi0uYnIKLS5JIAotbGQ6IHRoZSBHTlUgbGlua2VyXGMKLSwgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIFJvbGFuZCBQZXNjaDsKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotLCBSb2xhbmQgSC4gUGVzY2guCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2xkL2xkLmggYi9sZC9sZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTU2NWE4Li4wMDAwMDAwCi0tLSBhL2xkL2xkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyogbGQuaCAtLSBnZW5lcmFsIGxpbmtlciBoZWFkZXIgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRF9ICi0jZGVmaW5lIExEX0gKLQotI2lmZGVmIEhBVkVfTE9DQUxFX0gKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEVOQUJMRV9OTFMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotIyBkZWZpbmUgXyhTdHJpbmcpIGdldHRleHQgKFN0cmluZykKLSMgaWZkZWYgZ2V0dGV4dF9ub29wCi0jICBkZWZpbmUgTl8oU3RyaW5nKSBnZXR0ZXh0X25vb3AgKFN0cmluZykKLSMgZWxzZQotIyAgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSMgZW5kaWYKLSNlbHNlCi0vKiBTdHVicyB0aGF0IGRvIHNvbWV0aGluZyBjbG9zZSBlbm91Z2guICAqLwotIyBkZWZpbmUgdGV4dGRvbWFpbihTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBnZXR0ZXh0KFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbixNZXNzYWdlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW4sTWVzc2FnZSxUeXBlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbixEaXJlY3RvcnkpIChEb21haW4pCi0jIGRlZmluZSBfKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSNlbmRpZgotCi0vKiBMb29rIGluIHRoaXMgZW52aXJvbm1lbnQgbmFtZSBmb3IgdGhlIGxpbmtlciB0byBwcmV0ZW5kIHRvIGJlICovCi0jZGVmaW5lIEVNVUxBVElPTl9FTlZJUk9OICJMREVNVUxBVElPTiIKLS8qIElmIGluIHRoZXJlIGxvb2sgZm9yIHRoZSBzdHJpbmdzOiAqLwotCi0vKiBMb29rIGluIHRoaXMgdmFyaWFibGUgZm9yIGEgdGFyZ2V0IGZvcm1hdCAqLwotI2RlZmluZSBUQVJHRVRfRU5WSVJPTiAiR05VVEFSR0VUIgotCi0vKiBJbnB1dCBzZWN0aW9ucyB3aGljaCBhcmUgcHV0IGluIGEgc2VjdGlvbiBvZiB0aGlzIG5hbWUgYXJlIGFjdHVhbGx5Ci0gICBkaXNjYXJkZWQuICAqLwotI2RlZmluZSBESVNDQVJEX1NFQ1RJT05fTkFNRSAiL0RJU0NBUkQvIgotCi0vKiBBIHdpbGRjYXJkIHNwZWNpZmljYXRpb24uICBUaGlzIGlzIG9ubHkgdXNlZCBpbiBsZGdyYW0ueSwgYnV0IGl0Ci0gICB3aW5kcyB1cCBpbiBsZGdyYW0uaCwgc28gd2UgbmVlZCB0byBkZWZpbmUgaXQgb3V0c2lkZS4gICovCi0KLXN0cnVjdCB3aWxkY2FyZF9zcGVjCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNvbnN0IGNoYXIgKmV4Y2x1ZGVfbmFtZTsKLSAgYm9vbGVhbiBzb3J0ZWQ7Ci19OwotCi0vKiBFeHRyYSBpbmZvcm1hdGlvbiB3ZSBob2xkIG9uIHNlY3Rpb25zICovCi10eXBlZGVmIHN0cnVjdCAgdXNlcl9zZWN0aW9uX3N0cnVjdAotewotICAvKiBQb2ludGVyIHRvIHRoZSBzZWN0aW9uIHdoZXJlIHRoaXMgZGF0YSB3aWxsIGdvICovCi0gIHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKmZpbGU7Ci19IHNlY3Rpb25fdXNlcmRhdGFfdHlwZTsKLQotCi0jZGVmaW5lIGdldF91c2VyZGF0YSh4KSAoKHgpLT51c2VyZGF0YSkKLQotI2RlZmluZSBCWVRFX1NJWkUJKDEpCi0jZGVmaW5lIFNIT1JUX1NJWkUJKDIpCi0jZGVmaW5lIExPTkdfU0laRQkoNCkKLSNkZWZpbmUgUVVBRF9TSVpFCSg4KQotCi0vKiBBTElHTiBtYWNybyBjaGFuZ2VkIHRvIEFMSUdOX04gdG8gYXZvaWQJKi8KLS8qIGNvbmZsaWN0IGluIC91c3IvaW5jbHVkZS9tYWNoaW5lL21hY2hwYXJhbS5oICovCi0vKiBXQVJOSU5HOiBJZiBUSElTIGlzIGEgNjQgYml0IGFkZHJlc3MgYW5kIEJPVU5EQVJZIGlzIGEgMzIgYml0IGludCwKLSAgIHlvdSBtdXN0IGNvZXJjZSBib3VuZGFyeSB0byB0aGUgc2FtZSB0eXBlIGFzIFRISVMuCi0gICA/Pz8gSXMgdGhlcmUgYSBwb3J0YWJsZSB3YXkgdG8gYXZvaWQgdGhpcy4gICovCi0jZGVmaW5lIEFMSUdOX04odGhpcywgYm91bmRhcnkpIFwKLSAgKCgoICh0aGlzKSArICgoYm91bmRhcnkpIC0xKSkgJiAofigoYm91bmRhcnkpLTEpKSkpCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIDEgPT4gYXNzaWduIHNwYWNlIHRvIGNvbW1vbiBzeW1ib2xzIGV2ZW4gaWYgYHJlbG9jYXRhYmxlX291dHB1dCcuICAqLwotICBib29sZWFuIGZvcmNlX2NvbW1vbl9kZWZpbml0aW9uOwotICBib29sZWFuIHJlbGF4OwotCi0gIC8qIE5hbWUgb2YgcnVudGltZSBpbnRlcnByZXRlciB0byBpbnZva2UuICAqLwotICBjaGFyICppbnRlcnByZXRlcjsKLQotICAvKiBOYW1lIHRvIGdpdmUgcnVudGltZSBsaWJhcnkgZnJvbSB0aGUgLXNvbmFtZSBhcmd1bWVudC4gICovCi0gIGNoYXIgKnNvbmFtZTsKLQotICAvKiBSdW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGggZnJvbSB0aGUgLXJwYXRoIGFyZ3VtZW50LiAgKi8KLSAgY2hhciAqcnBhdGg7Ci0KLSAgLyogTGluayB0aW1lIHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aCBmcm9tIHRoZSAtcnBhdGgtbGluawotICAgICBhcmd1bWVudC4gICovCi0gIGNoYXIgKnJwYXRoX2xpbms7Ci0KLSAgLyogQmlnIG9yIGxpdHRsZSBlbmRpYW4gYXMgc2V0IG9uIGNvbW1hbmQgbGluZS4gICovCi0gIGVudW0geyBFTkRJQU5fVU5TRVQgPSAwLCBFTkRJQU5fQklHLCBFTkRJQU5fTElUVExFIH0gZW5kaWFuOwotCi0gIC8qIElmIHRydWUsIGV4cG9ydCBhbGwgc3ltYm9scyBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgb2YgYW4gRUxGCi0gICAgIGV4ZWN1dGFibGUuICAqLwotICBib29sZWFuIGV4cG9ydF9keW5hbWljOwotCi0gIC8qIElmIHRydWUsIGJ1aWxkIE1JUFMgZW1iZWRkZWQgUElDIHJlbG9jYXRpb24gdGFibGVzIGluIHRoZSBvdXRwdXQKLSAgICAgZmlsZS4gICovCi0gIGJvb2xlYW4gZW1iZWRkZWRfcmVsb2NzOwotCi0gIC8qIElmIHRydWUsIGZvcmNlIGdlbmVyYXRpb24gb2YgYSBmaWxlIHdpdGggYSAuZXhlIGZpbGUuICovCi0gIGJvb2xlYW4gZm9yY2VfZXhlX3N1ZmZpeDsKLQotICAvKiBJZiB0cnVlLCBnZW5lcmF0ZSBhIGNyb3NzIHJlZmVyZW5jZSByZXBvcnQuICAqLwotICBib29sZWFuIGNyZWY7Ci0KLSAgLyogSWYgdHJ1ZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLCB3YXJuIGFib3V0IG1pc21hdGNoZWQgaW5wdXQKLSAgICAgZmlsZXMuICAqLwotICBib29sZWFuIHdhcm5fbWlzbWF0Y2g7Ci0KLSAgLyogUmVtb3ZlIHVucmVmZXJlbmNlZCBzZWN0aW9ucz8gICovCi0gIGJvb2xlYW4gZ2Nfc2VjdGlvbnM7Ci0KLSAgLyogTmFtZSBvZiBzaGFyZWQgb2JqZWN0IHdob3NlIHN5bWJvbCB0YWJsZSBzaG91bGQgYmUgZmlsdGVyZWQgd2l0aAotICAgICB0aGlzIHNoYXJlZCBvYmplY3QuICBGcm9tIHRoZSAtLWZpbHRlciBvcHRpb24uICAqLwotICBjaGFyICpmaWx0ZXJfc2hsaWI7Ci0KLSAgLyogTmFtZSBvZiBzaGFyZWQgb2JqZWN0IGZvciB3aG9zZSBzeW1ib2wgdGFibGUgdGhpcyBzaGFyZWQgb2JqZWN0Ci0gICAgIGlzIGFuIGF1eGlsaWFyeSBmaWx0ZXIuICBGcm9tIHRoZSAtLWF1eGlsaWFyeSBvcHRpb24uICAqLwotICBjaGFyICoqYXV4aWxpYXJ5X2ZpbHRlcnM7Ci0KLSAgLyogQSB2ZXJzaW9uIHN5bWJvbCB0byBiZSBhcHBsaWVkIHRvIHRoZSBzeW1ib2wgbmFtZXMgZm91bmQgaW4gdGhlCi0gICAgIC5leHBvcnRzIHNlY3Rpb25zLiAgKi8KLSAgY2hhciAqdmVyc2lvbl9leHBvcnRzX3NlY3Rpb247Ci0KLSAgLyogSWYgdHJ1ZSAodGhlIGRlZmF1bHQpIGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzLCBvbmNlIGNvbXB1dGUsCi0gICAgIGZwb3Igb3ZlcmxhcHMuICAqLwotICBib29sZWFuIGNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzOwotICAKLX0gYXJnc190eXBlOwotCi1leHRlcm4gYXJnc190eXBlIGNvbW1hbmRfbGluZTsKLQotdHlwZWRlZiBpbnQgdG9rZW5fY29kZV90eXBlOwotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgYmZkX3NpemVfdHlwZSBzcGVjaWZpZWRfZGF0YV9zaXplOwotICBib29sZWFuIG1hZ2ljX2RlbWFuZF9wYWdlZDsKLSAgYm9vbGVhbiBtYWtlX2V4ZWN1dGFibGU7Ci0KLSAgLyogSWYgdHJ1ZSwgZG9pbmcgYSBkeW5hbWljIGxpbmsuICAqLwotICBib29sZWFuIGR5bmFtaWNfbGluazsKLQotICAvKiBJZiB0cnVlLCAtc2hhcmVkIGlzIHN1cHBvcnRlZC4gICovCi0gIC8qID8/PyBBIGJldHRlciB3YXkgdG8gZG8gdGhpcyBpcyBwZXJoYXBzIHRvIGRlZmluZSB0aGlzIGluIHRoZQotICAgICBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3Qgc2luY2UgdGhpcyBpcyByZWFsbHkgYSB0YXJnZXQgZGVwZW5kZW50Ci0gICAgIHBhcmFtZXRlci4gICovCi0gIGJvb2xlYW4gaGFzX3NoYXJlZDsKLQotICAvKiBJZiB0cnVlLCBidWlsZCBjb25zdHJ1Y3RvcnMuICAqLwotICBib29sZWFuIGJ1aWxkX2NvbnN0cnVjdG9yczsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGFib3V0IGFueSBjb25zdHJ1Y3RvcnMuICAqLwotICBib29sZWFuIHdhcm5fY29uc3RydWN0b3JzOwotCi0gIC8qIElmIHRydWUsIHdhcm4gYWJvdXQgbWVyZ2luZyBjb21tb24gc3ltYm9scyB3aXRoIG90aGVycy4gICovCi0gIGJvb2xlYW4gd2Fybl9jb21tb247Ci0KLSAgLyogSWYgdHJ1ZSwgb25seSB3YXJuIG9uY2UgYWJvdXQgYSBwYXJ0aWN1bGFyIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotICBib29sZWFuIHdhcm5fb25jZTsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGlmIG11bHRpcGxlIGdsb2JhbC1wb2ludGVycyBhcmUgbmVlZGVkIChBbHBoYQotICAgICBvbmx5KS4gICovCi0gIGJvb2xlYW4gd2Fybl9tdWx0aXBsZV9ncDsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGlmIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uCi0gICAgIGNoYW5nZXMgZHVlIHRvIHRoZSBhbGlnbm1lbnQgb2YgYW4gaW5wdXQgc2VjdGlvbi4gICovCi0gIGJvb2xlYW4gd2Fybl9zZWN0aW9uX2FsaWduOwotCi0gIGJvb2xlYW4gc29ydF9jb21tb247Ci0KLSAgYm9vbGVhbiB0ZXh0X3JlYWRfb25seTsKLQotICBjaGFyICptYXBfZmlsZW5hbWU7Ci0gIEZJTEUgKm1hcF9maWxlOwotCi0gIGJvb2xlYW4gc3RhdHM7Ci0KLSAgaW50IHNwbGl0X2J5X3JlbG9jOwotICBib29sZWFuIHNwbGl0X2J5X2ZpbGU7Ci19IGxkX2NvbmZpZ190eXBlOwotCi1leHRlcm4gbGRfY29uZmlnX3R5cGUgY29uZmlnOwotCi10eXBlZGVmIGVudW0KLXsKLSAgbGFuZ19maXJzdF9waGFzZV9lbnVtLAotICBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSwKLSAgbGFuZ19maW5hbF9waGFzZV9lbnVtCi19IGxhbmdfcGhhc2VfdHlwZTsKLQotZXh0ZXJuIGJvb2xlYW4gaGFkX3NjcmlwdDsKLWV4dGVybiBib29sZWFuIGZvcmNlX21ha2VfZXhlY3V0YWJsZTsKLQotLyogTm9uLXplcm8gaWYgd2UgYXJlIHByb2Nlc3NpbmcgYSAtLWRlZnN5bSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICAqLwotZXh0ZXJuIGludCBwYXJzaW5nX2RlZnN5bTsKLQotZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgYWRkX2NyZWYgUEFSQU1TICgoY29uc3QgY2hhciAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgb3V0cHV0X2NyZWYgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gdm9pZCBjaGVja19ub2Nyb3NzcmVmcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIGxkX2Fib3J0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopKQotICAgICBBVFRSSUJVVEVfTk9SRVRVUk47Ci0KLS8qIElmIGdjYywgd2UgY2FuIGdpdmUgYSBmdW5jdGlvbiBuYW1lLCB0b28uICAqLwotI2lmICFkZWZpbmVkIChfX0dOVUNfXykgfHwgX19HTlVDX01JTk9SX18gPD0gNQotI2RlZmluZSBfX1BSRVRUWV9GVU5DVElPTl9fICAoKGNoYXIqKSBOVUxMKQotI2VuZGlmCi0KLSN1bmRlZiBhYm9ydAotI2RlZmluZSBhYm9ydCgpIGxkX2Fib3J0IChfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18pCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGQudGV4aW5mbyBiL2xkL2xkLnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OTQzNzAuLjAwMDAwMDAKLS0tIGEvbGQvbGQudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDQzNjYgKzAsMCBAQAotXGlucHV0IHRleGluZm8KLUBzZXRmaWxlbmFtZSBsZC5pbmZvCi1Ac3luY29kZWluZGV4IGt5IGNwCi1AaW5jbHVkZSBjb25maWdkb2MudGV4aQotQGMgKGNvbmZpZ2RvYy50ZXhpIGlzIGdlbmVyYXRlZCBieSB0aGUgTWFrZWZpbGUpCi1AaW5jbHVkZSBsZHZlci50ZXhpCi0KLUBjIEBzbWFsbGJvb2sKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogTGQ6IChsZCkuICAgICAgICAgICAgICAgICAgICAgICBUaGUgR05VIGxpbmtlci4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEBzY3tnbnV9IGxpbmtlciBMRCB2ZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfS4KLQotQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdAotdGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1AZW5kIGlmaW5mbwotQGlmdGV4Ci1AZmluYWxvdXQKLUBzZXRjaGFwdGVybmV3cGFnZSBvZGQKLUBzZXR0aXRsZSBVc2luZyBMRCwgdGhlIEdOVSBsaW5rZXIKLUB0aXRsZXBhZ2UKLUB0aXRsZSBVc2luZyBsZAotQHN1YnRpdGxlIFRoZSBHTlUgbGlua2VyCi1Ac3AgMQotQHN1YnRpdGxlIEBjb2Rle2xkfSB2ZXJzaW9uIDIKLUBzdWJ0aXRsZSBWZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfQotQGF1dGhvciBTdGV2ZSBDaGFtYmVybGFpbgotQGF1dGhvciBJYW4gTGFuY2UgVGF5bG9yCi1AYXV0aG9yIEN5Z251cyBTb2x1dGlvbnMKLUBwYWdlCi0KLUB0ZXgKLXtccGFyc2tpcD0wcHQKLVxoZmlsbCBDeWdudXMgU29sdXRpb25zXHBhcgotXGhmaWxsIGlhblxAY3lnbnVzLmNvbSwgZG9jXEBjeWdudXMuY29tXHBhcgotXGhmaWxsIHtcaXQgVXNpbmcgTEQsIHRoZSBHTlUgbGlua2VyfVxwYXIKLVxoZmlsbCBFZGl0ZWQgYnkgSmVmZnJleSBPc2llciAoamVmZnJleVxAY3lnbnVzLmNvbSlccGFyCi19Ci1cZ2xvYmFsXHBhcmluZGVudD0wcHQgJSBTdGV2ZSBsaWtlcyBpdCB0aGlzIHdheS4KLUBlbmQgdGV4Ci0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLUBlbmQgaWZ0ZXgKLUBjIEZJWE1FOiBUYWxrIGFib3V0IGltcG9ydGFuY2Ugb2YgKm9yZGVyKiBvZiBhcmdzLCBjbWRzIHRvIGxpbmtlciEKLQotQGlmaW5mbwotQG5vZGUgVG9wCi1AdG9wIFVzaW5nIGxkCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBAc2N7Z251fSBsaW5rZXIgbGQgdmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0uCi0KLUBtZW51Ci0qIE92ZXJ2aWV3OjogICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3Ci0qIEludm9jYXRpb246OiAgICAgICAgICAgICAgICAgIEludm9jYXRpb24KLSogU2NyaXB0czo6ICAgICAgICAgICAgICAgICAgICAgTGlua2VyIFNjcmlwdHMKLUBpZnNldCBHRU5FUklDCi0qIE1hY2hpbmUgRGVwZW5kZW50OjogICAgICAgICAgIE1hY2hpbmUgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSDgzMDAKLSogSDgvMzAwOjogICAgICAgICAgICAgICAgICAgICAgbGQgYW5kIHRoZSBIOC8zMDAKLUBlbmQgaWZzZXQKLUBpZnNldCBIaXRhY2hpCi0qIEhpdGFjaGk6OiAgICAgICAgICAgICAgICAgICAgIGxkIGFuZCBvdGhlciBIaXRhY2hpIG1pY3JvcwotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLSogaTk2MDo6ICAgICAgICAgICAgICAgICAgICAgICAgbGQgYW5kIHRoZSBJbnRlbCA5NjAgZmFtaWx5Ci1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotKiBCRkQ6OiAgICAgICAgICAgICAgICAgICAgICAgICBCRkQKLUBlbmQgaWZjbGVhcgotQGMgRm9sbG93aW5nIGJsYW5rIGxpbmUgcmVxdWlyZWQgZm9yIHJlbWFpbmluZyBidWcgaW4gbWFrZWluZm8gY29uZHMvbWVudXMKLQotKiBSZXBvcnRpbmcgQnVnczo6ICAgICAgICAgICAgICBSZXBvcnRpbmcgQnVncwotKiBNUkk6OiAgICAgICAgICAgICAgICAgICAgICAgICBNUkkgQ29tcGF0aWJsZSBTY3JpcHQgRmlsZXMKLSogSW5kZXg6OiAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgKLUBlbmQgbWVudQotQGVuZCBpZmluZm8KLQotQG5vZGUgT3ZlcnZpZXcKLUBjaGFwdGVyIE92ZXJ2aWV3Ci0KLUBjaW5kZXggQHNje2dudX0gbGlua2VyCi1AY2luZGV4IHdoYXQgaXMgdGhpcz8KLUBjb2Rle2xkfSBjb21iaW5lcyBhIG51bWJlciBvZiBvYmplY3QgYW5kIGFyY2hpdmUgZmlsZXMsIHJlbG9jYXRlcwotdGhlaXIgZGF0YSBhbmQgdGllcyB1cCBzeW1ib2wgcmVmZXJlbmNlcy4gVXN1YWxseSB0aGUgbGFzdCBzdGVwIGluCi1jb21waWxpbmcgYSBwcm9ncmFtIGlzIHRvIHJ1biBAY29kZXtsZH0uCi0KLUBjb2Rle2xkfSBhY2NlcHRzIExpbmtlciBDb21tYW5kIExhbmd1YWdlIGZpbGVzIHdyaXR0ZW4gaW4KLWEgc3VwZXJzZXQgb2YgQVQmVCdzIExpbmsgRWRpdG9yIENvbW1hbmQgTGFuZ3VhZ2Ugc3ludGF4LAotdG8gcHJvdmlkZSBleHBsaWNpdCBhbmQgdG90YWwgY29udHJvbCBvdmVyIHRoZSBsaW5raW5nIHByb2Nlc3MuCi0KLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotVGhpcyB2ZXJzaW9uIG9mIEBjb2Rle2xkfSB1c2VzIHRoZSBnZW5lcmFsIHB1cnBvc2UgQkZEIGxpYnJhcmllcwotdG8gb3BlcmF0ZSBvbiBvYmplY3QgZmlsZXMuIFRoaXMgYWxsb3dzIEBjb2Rle2xkfSB0byByZWFkLCBjb21iaW5lLCBhbmQKLXdyaXRlIG9iamVjdCBmaWxlcyBpbiBtYW55IGRpZmZlcmVudCBmb3JtYXRzLS0tZm9yIGV4YW1wbGUsIENPRkYgb3IKLUBjb2Rle2Eub3V0fS4gIERpZmZlcmVudCBmb3JtYXRzIG1heSBiZSBsaW5rZWQgdG9nZXRoZXIgdG8gcHJvZHVjZSBhbnkKLWF2YWlsYWJsZSBraW5kIG9mIG9iamVjdCBmaWxlLiAgQHhyZWZ7QkZEfSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1AZW5kIGlmY2xlYXIKLQotQXNpZGUgZnJvbSBpdHMgZmxleGliaWxpdHksIHRoZSBAc2N7Z251fSBsaW5rZXIgaXMgbW9yZSBoZWxwZnVsIHRoYW4gb3RoZXIKLWxpbmtlcnMgaW4gcHJvdmlkaW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uICBNYW55IGxpbmtlcnMgYWJhbmRvbgotZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gZW5jb3VudGVyaW5nIGFuIGVycm9yOyB3aGVuZXZlciBwb3NzaWJsZSwKLUBjb2Rle2xkfSBjb250aW51ZXMgZXhlY3V0aW5nLCBhbGxvd2luZyB5b3UgdG8gaWRlbnRpZnkgb3RoZXIgZXJyb3JzCi0ob3IsIGluIHNvbWUgY2FzZXMsIHRvIGdldCBhbiBvdXRwdXQgZmlsZSBpbiBzcGl0ZSBvZiB0aGUgZXJyb3IpLgotCi1Abm9kZSBJbnZvY2F0aW9uCi1AY2hhcHRlciBJbnZvY2F0aW9uCi0KLVRoZSBAc2N7Z251fSBsaW5rZXIgQGNvZGV7bGR9IGlzIG1lYW50IHRvIGNvdmVyIGEgYnJvYWQgcmFuZ2Ugb2Ygc2l0dWF0aW9ucywKLWFuZCB0byBiZSBhcyBjb21wYXRpYmxlIGFzIHBvc3NpYmxlIHdpdGggb3RoZXIgbGlua2Vycy4gIEFzIGEgcmVzdWx0LAoteW91IGhhdmUgbWFueSBjaG9pY2VzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yLgotCi1AaWZzZXQgVXNlc0VudlZhcnMKLUBtZW51Ci0qIE9wdGlvbnM6OiAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQgTGluZSBPcHRpb25zCi0qIEVudmlyb25tZW50OjogICAgICAgICAgICAgICAgIEVudmlyb25tZW50IFZhcmlhYmxlcwotQGVuZCBtZW51Ci0KLUBub2RlIE9wdGlvbnMKLUBzZWN0aW9uIENvbW1hbmQgTGluZSBPcHRpb25zCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggY29tbWFuZCBsaW5lCi1AY2luZGV4IG9wdGlvbnMKLVRoZSBsaW5rZXIgc3VwcG9ydHMgYSBwbGV0aG9yYSBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucywgYnV0IGluIGFjdHVhbAotcHJhY3RpY2UgZmV3IG9mIHRoZW0gYXJlIHVzZWQgaW4gYW55IHBhcnRpY3VsYXIgY29udGV4dC4KLUBjaW5kZXggc3RhbmRhcmQgVW5peCBzeXN0ZW0KLUZvciBpbnN0YW5jZSwgYSBmcmVxdWVudCB1c2Ugb2YgQGNvZGV7bGR9IGlzIHRvIGxpbmsgc3RhbmRhcmQgVW5peAotb2JqZWN0IGZpbGVzIG9uIGEgc3RhbmRhcmQsIHN1cHBvcnRlZCBVbml4IHN5c3RlbS4gIE9uIHN1Y2ggYSBzeXN0ZW0sIHRvCi1saW5rIGEgZmlsZSBAY29kZXtoZWxsby5vfToKLQotQHNtYWxsZXhhbXBsZQotbGQgLW8gQHZhcntvdXRwdXR9IC9saWIvY3J0MC5vIGhlbGxvLm8gLWxjCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIHRlbGxzIEBjb2Rle2xkfSB0byBwcm9kdWNlIGEgZmlsZSBjYWxsZWQgQHZhcntvdXRwdXR9IGFzIHRoZQotcmVzdWx0IG9mIGxpbmtpbmcgdGhlIGZpbGUgQGNvZGV7L2xpYi9jcnQwLm99IHdpdGggQGNvZGV7aGVsbG8ub30gYW5kCi10aGUgbGlicmFyeSBAY29kZXtsaWJjLmF9LCB3aGljaCB3aWxsIGNvbWUgZnJvbSB0aGUgc3RhbmRhcmQgc2VhcmNoCi1kaXJlY3Rvcmllcy4gIChTZWUgdGhlIGRpc2N1c3Npb24gb2YgdGhlIEBzYW1wey1sfSBvcHRpb24gYmVsb3cuKQotCi1Tb21lIG9mIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBAY29kZXtsZH0gbWF5IGJlIHNwZWNpZmllZCBhdCBhbnkKLXBvaW50IGluIHRoZSBjb21tYW5kIGxpbmUuICBIb3dldmVyLCBvcHRpb25zIHdoaWNoIHJlZmVyIHRvIGZpbGVzLCBzdWNoCi1hcyBAc2FtcHstbH0gb3IgQHNhbXB7LVR9LCBjYXVzZSB0aGUgZmlsZSB0byBiZSByZWFkIGF0IHRoZSBwb2ludCBhdAotd2hpY2ggdGhlIG9wdGlvbiBhcHBlYXJzIGluIHRoZSBjb21tYW5kIGxpbmUsIHJlbGF0aXZlIHRvIHRoZSBvYmplY3QKLWZpbGVzIGFuZCBvdGhlciBmaWxlIG9wdGlvbnMuICBSZXBlYXRpbmcgbm9uLWZpbGUgb3B0aW9ucyB3aXRoIGEKLWRpZmZlcmVudCBhcmd1bWVudCB3aWxsIGVpdGhlciBoYXZlIG5vIGZ1cnRoZXIgZWZmZWN0LCBvciBvdmVycmlkZSBwcmlvcgotb2NjdXJyZW5jZXMgKHRob3NlIGZ1cnRoZXIgdG8gdGhlIGxlZnQgb24gdGhlIGNvbW1hbmQgbGluZSkgb2YgdGhhdAotb3B0aW9uLiAgT3B0aW9ucyB3aGljaCBtYXkgYmUgbWVhbmluZ2Z1bGx5IHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSBhcmUKLW5vdGVkIGluIHRoZSBkZXNjcmlwdGlvbnMgYmVsb3cuCi0KLUBjaW5kZXggb2JqZWN0IGZpbGVzCi1Ob24tb3B0aW9uIGFyZ3VtZW50cyBhcmUgb2JqZWN0IGZpbGVzIG9yIGFyY2hpdmVzIHdoaWNoIGFyZSB0byBiZSBsaW5rZWQKLXRvZ2V0aGVyLiAgVGhleSBtYXkgZm9sbG93LCBwcmVjZWRlLCBvciBiZSBtaXhlZCBpbiB3aXRoIGNvbW1hbmQtbGluZQotb3B0aW9ucywgZXhjZXB0IHRoYXQgYW4gb2JqZWN0IGZpbGUgYXJndW1lbnQgbWF5IG5vdCBiZSBwbGFjZWQgYmV0d2VlbgotYW4gb3B0aW9uIGFuZCBpdHMgYXJndW1lbnQuCi0KLVVzdWFsbHkgdGhlIGxpbmtlciBpcyBpbnZva2VkIHdpdGggYXQgbGVhc3Qgb25lIG9iamVjdCBmaWxlLCBidXQgeW91IGNhbgotc3BlY2lmeSBvdGhlciBmb3JtcyBvZiBiaW5hcnkgaW5wdXQgZmlsZXMgdXNpbmcgQHNhbXB7LWx9LCBAc2FtcHstUn0sCi1hbmQgdGhlIHNjcmlwdCBjb21tYW5kIGxhbmd1YWdlLiAgSWYgQGVtcGh7bm99IGJpbmFyeSBpbnB1dCBmaWxlcyBhdCBhbGwKLWFyZSBzcGVjaWZpZWQsIHRoZSBsaW5rZXIgZG9lcyBub3QgcHJvZHVjZSBhbnkgb3V0cHV0LCBhbmQgaXNzdWVzIHRoZQotbWVzc2FnZSBAc2FtcHtObyBpbnB1dCBmaWxlc30uCi0KLUlmIHRoZSBsaW5rZXIgY2FuIG5vdCByZWNvZ25pemUgdGhlIGZvcm1hdCBvZiBhbiBvYmplY3QgZmlsZSwgaXQgd2lsbAotYXNzdW1lIHRoYXQgaXQgaXMgYSBsaW5rZXIgc2NyaXB0LiAgQSBzY3JpcHQgc3BlY2lmaWVkIGluIHRoaXMgd2F5Ci1hdWdtZW50cyB0aGUgbWFpbiBsaW5rZXIgc2NyaXB0IHVzZWQgZm9yIHRoZSBsaW5rIChlaXRoZXIgdGhlIGRlZmF1bHQKLWxpbmtlciBzY3JpcHQgb3IgdGhlIG9uZSBzcGVjaWZpZWQgYnkgdXNpbmcgQHNhbXB7LVR9KS4gIFRoaXMgZmVhdHVyZQotcGVybWl0cyB0aGUgbGlua2VyIHRvIGxpbmsgYWdhaW5zdCBhIGZpbGUgd2hpY2ggYXBwZWFycyB0byBiZSBhbiBvYmplY3QKLW9yIGFuIGFyY2hpdmUsIGJ1dCBhY3R1YWxseSBtZXJlbHkgZGVmaW5lcyBzb21lIHN5bWJvbCB2YWx1ZXMsIG9yIHVzZXMKLUBjb2Rle0lOUFVUfSBvciBAY29kZXtHUk9VUH0gdG8gbG9hZCBvdGhlciBvYmplY3RzLiAgTm90ZSB0aGF0Ci1zcGVjaWZ5aW5nIGEgc2NyaXB0IGluIHRoaXMgd2F5IHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gYXVnbWVudCB0aGUgbWFpbgotbGlua2VyIHNjcmlwdDsgaWYgeW91IHdhbnQgdG8gdXNlIHNvbWUgY29tbWFuZCB0aGF0IGxvZ2ljYWxseSBjYW4gb25seQotYXBwZWFyIG9uY2UsIHN1Y2ggYXMgdGhlIEBjb2Rle1NFQ1RJT05TfSBvciBAY29kZXtNRU1PUll9IGNvbW1hbmQsIHlvdQotbXVzdCByZXBsYWNlIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgdXNpbmcgdGhlIEBzYW1wey1UfSBvcHRpb24uCi1AeHJlZntTY3JpcHRzfS4KLQotRm9yIG9wdGlvbnMgd2hvc2UgbmFtZXMgYXJlIGEgc2luZ2xlIGxldHRlciwKLW9wdGlvbiBhcmd1bWVudHMgbXVzdCBlaXRoZXIgZm9sbG93IHRoZSBvcHRpb24gbGV0dGVyIHdpdGhvdXQgaW50ZXJ2ZW5pbmcKLXdoaXRlc3BhY2UsIG9yIGJlIGdpdmVuIGFzIHNlcGFyYXRlIGFyZ3VtZW50cyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlCi1vcHRpb24gdGhhdCByZXF1aXJlcyB0aGVtLgotCi1Gb3Igb3B0aW9ucyB3aG9zZSBuYW1lcyBhcmUgbXVsdGlwbGUgbGV0dGVycywgZWl0aGVyIG9uZSBkYXNoIG9yIHR3byBjYW4KLXByZWNlZGUgdGhlIG9wdGlvbiBuYW1lOyBmb3IgZXhhbXBsZSwgQHNhbXB7LS1vZm9ybWF0fSBhbmQKLUBzYW1wey0tb2Zvcm1hdH0gYXJlIGVxdWl2YWxlbnQuICBBcmd1bWVudHMgdG8gbXVsdGlwbGUtbGV0dGVyIG9wdGlvbnMKLW11c3QgZWl0aGVyIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBvcHRpb24gbmFtZSBieSBhbiBlcXVhbHMgc2lnbiwgb3IgYmUKLWdpdmVuIGFzIHNlcGFyYXRlIGFyZ3VtZW50cyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIG9wdGlvbiB0aGF0Ci1yZXF1aXJlcyB0aGVtLiAgRm9yIGV4YW1wbGUsIEBzYW1wey0tb2Zvcm1hdCBzcmVjfSBhbmQKLUBzYW1wey0tb2Zvcm1hdD1zcmVjfSBhcmUgZXF1aXZhbGVudC4gIFVuaXF1ZSBhYmJyZXZpYXRpb25zIG9mIHRoZSBuYW1lcwotb2YgbXVsdGlwbGUtbGV0dGVyIG9wdGlvbnMgYXJlIGFjY2VwdGVkLgotCi1AdGFibGUgQGNvZGUKLUBraW5kZXggLWFAdmFye2tleXdvcmR9Ci1AaXRlbSAtYUB2YXJ7a2V5d29yZH0KLVRoaXMgb3B0aW9uIGlzIHN1cHBvcnRlZCBmb3IgSFAvVVggY29tcGF0aWJpbGl0eS4gIFRoZSBAdmFye2tleXdvcmR9Ci1hcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgc3RyaW5ncyBAc2FtcHthcmNoaXZlfSwgQHNhbXB7c2hhcmVkfSwgb3IKLUBzYW1we2RlZmF1bHR9LiAgQHNhbXB7LWFhcmNoaXZlfSBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0bwotQHNhbXB7LUJzdGF0aWN9LCBhbmQgdGhlIG90aGVyIHR3byBrZXl3b3JkcyBhcmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQKLXRvIEBzYW1wey1CZHluYW1pY30uICBUaGlzIG9wdGlvbiBtYXkgYmUgdXNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLgotCi1AaWZzZXQgSTk2MAotQGNpbmRleCBhcmNoaXRlY3R1cmVzCi1Aa2luZGV4IC1BQHZhcnthcmNofQotQGl0ZW0gLUFAdmFye2FyY2hpdGVjdHVyZX0KLUBraW5kZXggLS1hcmNoaXRlY3R1cmU9QHZhcnthcmNofQotQGl0ZW14IC0tYXJjaGl0ZWN0dXJlPUB2YXJ7YXJjaGl0ZWN0dXJlfQotSW4gdGhlIGN1cnJlbnQgcmVsZWFzZSBvZiBAY29kZXtsZH0sIHRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBvbmx5IGZvciB0aGUKLUludGVsIDk2MCBmYW1pbHkgb2YgYXJjaGl0ZWN0dXJlcy4gIEluIHRoYXQgQGNvZGV7bGR9IGNvbmZpZ3VyYXRpb24sIHRoZQotQHZhcnthcmNoaXRlY3R1cmV9IGFyZ3VtZW50IGlkZW50aWZpZXMgdGhlIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlIGluCi10aGUgOTYwIGZhbWlseSwgZW5hYmxpbmcgc29tZSBzYWZlZ3VhcmRzIGFuZCBtb2RpZnlpbmcgdGhlCi1hcmNoaXZlLWxpYnJhcnkgc2VhcmNoIHBhdGguICBAeHJlZntpOTYwLCxAY29kZXtsZH0gYW5kIHRoZSBJbnRlbCA5NjAKLWZhbWlseX0sIGZvciBkZXRhaWxzLgotCi1GdXR1cmUgcmVsZWFzZXMgb2YgQGNvZGV7bGR9IG1heSBzdXBwb3J0IHNpbWlsYXIgZnVuY3Rpb25hbGl0eSBmb3IKLW90aGVyIGFyY2hpdGVjdHVyZSBmYW1pbGllcy4KLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1AY2luZGV4IGJpbmFyeSBpbnB1dCBmb3JtYXQKLUBraW5kZXggLWIgQHZhcntmb3JtYXR9Ci1Aa2luZGV4IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fQotQGNpbmRleCBpbnB1dCBmb3JtYXQKLUBjaW5kZXggaW5wdXQgZm9ybWF0Ci1AaXRlbSAtYiBAdmFye2lucHV0LWZvcm1hdH0KLUBpdGVteCAtLWZvcm1hdD1AdmFye2lucHV0LWZvcm1hdH0KLUBjb2Rle2xkfSBtYXkgYmUgY29uZmlndXJlZCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUga2luZCBvZiBvYmplY3QKLWZpbGUuICBJZiB5b3VyIEBjb2Rle2xkfSBpcyBjb25maWd1cmVkIHRoaXMgd2F5LCB5b3UgY2FuIHVzZSB0aGUKLUBzYW1wey1ifSBvcHRpb24gdG8gc3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgaW5wdXQgb2JqZWN0IGZpbGVzCi10aGF0IGZvbGxvdyB0aGlzIG9wdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgRXZlbiB3aGVuIEBjb2Rle2xkfSBpcwotY29uZmlndXJlZCB0byBzdXBwb3J0IGFsdGVybmF0aXZlIG9iamVjdCBmb3JtYXRzLCB5b3UgZG9uJ3QgdXN1YWxseSBuZWVkCi10byBzcGVjaWZ5IHRoaXMsIGFzIEBjb2Rle2xkfSBzaG91bGQgYmUgY29uZmlndXJlZCB0byBleHBlY3QgYXMgYQotZGVmYXVsdCBpbnB1dCBmb3JtYXQgdGhlIG1vc3QgdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4KLUB2YXJ7aW5wdXQtZm9ybWF0fSBpcyBhIHRleHQgc3RyaW5nLCB0aGUgbmFtZSBvZiBhIHBhcnRpY3VsYXIgZm9ybWF0Ci1zdXBwb3J0ZWQgYnkgdGhlIEJGRCBsaWJyYXJpZXMuICAoWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUgYmluYXJ5Ci1mb3JtYXRzIHdpdGggQHNhbXB7b2JqZHVtcCAtaX0uKQotQHhyZWZ7QkZEfS4KLQotWW91IG1heSB3YW50IHRvIHVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIGxpbmtpbmcgZmlsZXMgd2l0aCBhbiB1bnVzdWFsCi1iaW5hcnkgZm9ybWF0LiAgWW91IGNhbiBhbHNvIHVzZSBAc2FtcHstYn0gdG8gc3dpdGNoIGZvcm1hdHMgZXhwbGljaXRseSAod2hlbgotbGlua2luZyBvYmplY3QgZmlsZXMgb2YgZGlmZmVyZW50IGZvcm1hdHMpLCBieSBpbmNsdWRpbmcKLUBzYW1wey1iIEB2YXJ7aW5wdXQtZm9ybWF0fX0gYmVmb3JlIGVhY2ggZ3JvdXAgb2Ygb2JqZWN0IGZpbGVzIGluIGEKLXBhcnRpY3VsYXIgZm9ybWF0LiAgCi0KLVRoZSBkZWZhdWx0IGZvcm1hdCBpcyB0YWtlbiBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotQGNvZGV7R05VVEFSR0VUfS4KLUBpZnNldCBVc2VzRW52VmFycwotQHhyZWZ7RW52aXJvbm1lbnR9LgotQGVuZCBpZnNldAotWW91IGNhbiBhbHNvIGRlZmluZSB0aGUgaW5wdXQgZm9ybWF0IGZyb20gYSBzY3JpcHQsIHVzaW5nIHRoZSBjb21tYW5kCi1AY29kZXtUQVJHRVR9OyBzZWUgQHJlZntGb3JtYXQgQ29tbWFuZHN9LgotQGVuZCBpZmNsZWFyCi0KLUBraW5kZXggLWMgQHZhcntNUkktY21kZmlsZX0KLUBraW5kZXggLS1tcmktc2NyaXB0PUB2YXJ7TVJJLWNtZGZpbGV9Ci1AY2luZGV4IGNvbXBhdGliaWxpdHksIE1SSQotQGl0ZW0gLWMgQHZhcntNUkktY29tbWFuZGZpbGV9Ci1AaXRlbXggLS1tcmktc2NyaXB0PUB2YXJ7TVJJLWNvbW1hbmRmaWxlfQotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsaW5rZXJzIHByb2R1Y2VkIGJ5IE1SSSwgQGNvZGV7bGR9IGFjY2VwdHMgc2NyaXB0Ci1maWxlcyB3cml0dGVuIGluIGFuIGFsdGVybmF0ZSwgcmVzdHJpY3RlZCBjb21tYW5kIGxhbmd1YWdlLCBkZXNjcmliZWQgaW4KLUByZWZ7TVJJLCxNUkkgQ29tcGF0aWJsZSBTY3JpcHQgRmlsZXN9LiAgSW50cm9kdWNlIE1SSSBzY3JpcHQgZmlsZXMgd2l0aAotdGhlIG9wdGlvbiBAc2FtcHstY307IHVzZSB0aGUgQHNhbXB7LVR9IG9wdGlvbiB0byBydW4gbGlua2VyCi1zY3JpcHRzIHdyaXR0ZW4gaW4gdGhlIGdlbmVyYWwtcHVycG9zZSBAY29kZXtsZH0gc2NyaXB0aW5nIGxhbmd1YWdlLgotSWYgQHZhcntNUkktY21kZmlsZX0gZG9lcyBub3QgZXhpc3QsIEBjb2Rle2xkfSBsb29rcyBmb3IgaXQgaW4gdGhlIGRpcmVjdG9yaWVzCi1zcGVjaWZpZWQgYnkgYW55IEBzYW1wey1MfSBvcHRpb25zLgotCi1AY2luZGV4IGNvbW1vbiBhbGxvY2F0aW9uCi1Aa2luZGV4IC1kCi1Aa2luZGV4IC1kYwotQGtpbmRleCAtZHAKLUBpdGVtIC1kIAotQGl0ZW14IC1kYwotQGl0ZW14IC1kcAotVGhlc2UgdGhyZWUgb3B0aW9ucyBhcmUgZXF1aXZhbGVudDsgbXVsdGlwbGUgZm9ybXMgYXJlIHN1cHBvcnRlZCBmb3IKLWNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaW5rZXJzLiAgVGhleSBhc3NpZ24gc3BhY2UgdG8gY29tbW9uIHN5bWJvbHMKLWV2ZW4gaWYgYSByZWxvY2F0YWJsZSBvdXRwdXQgZmlsZSBpcyBzcGVjaWZpZWQgKHdpdGggQHNhbXB7LXJ9KS4gIFRoZQotc2NyaXB0IGNvbW1hbmQgQGNvZGV7Rk9SQ0VfQ09NTU9OX0FMTE9DQVRJT059IGhhcyB0aGUgc2FtZSBlZmZlY3QuCi1AeHJlZntNaXNjZWxsYW5lb3VzIENvbW1hbmRzfS4KLQotQGNpbmRleCBlbnRyeSBwb2ludCwgZnJvbSBjb21tYW5kIGxpbmUKLUBraW5kZXggLWUgQHZhcntlbnRyeX0KLUBraW5kZXggLS1lbnRyeT1AdmFye2VudHJ5fQotQGl0ZW0gLWUgQHZhcntlbnRyeX0gCi1AaXRlbXggLS1lbnRyeT1AdmFye2VudHJ5fQotVXNlIEB2YXJ7ZW50cnl9IGFzIHRoZSBleHBsaWNpdCBzeW1ib2wgZm9yIGJlZ2lubmluZyBleGVjdXRpb24gb2YgeW91cgotcHJvZ3JhbSwgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgZW50cnkgcG9pbnQuICBJZiB0aGVyZSBpcyBubyBzeW1ib2wKLW5hbWVkIEB2YXJ7ZW50cnl9LCB0aGUgbGlua2VyIHdpbGwgdHJ5IHRvIHBhcnNlIEB2YXJ7ZW50cnl9IGFzIGEgbnVtYmVyLAotYW5kIHVzZSB0aGF0IGFzIHRoZSBlbnRyeSBhZGRyZXNzICh0aGUgbnVtYmVyIHdpbGwgYmUgaW50ZXJwcmV0ZWQgaW4KLWJhc2UgMTA7IHlvdSBtYXkgdXNlIGEgbGVhZGluZyBAc2FtcHsweH0gZm9yIGJhc2UgMTYsIG9yIGEgbGVhZGluZwotQHNhbXB7MH0gZm9yIGJhc2UgOCkuICBAeHJlZntFbnRyeSBQb2ludH0sIGZvciBhIGRpc2N1c3Npb24gb2YgZGVmYXVsdHMKLWFuZCBvdGhlciB3YXlzIG9mIHNwZWNpZnlpbmcgdGhlIGVudHJ5IHBvaW50LgotCi1AY2luZGV4IGR5bmFtaWMgc3ltYm9sIHRhYmxlCi1Aa2luZGV4IC1FCi1Aa2luZGV4IC0tZXhwb3J0LWR5bmFtaWMKLUBpdGVtIC1FCi1AaXRlbXggLS1leHBvcnQtZHluYW1pYwotV2hlbiBjcmVhdGluZyBhIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlLCBhZGQgYWxsIHN5bWJvbHMgdG8gdGhlCi1keW5hbWljIHN5bWJvbCB0YWJsZS4gIFRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpcyB0aGUgc2V0IG9mIHN5bWJvbHMKLXdoaWNoIGFyZSB2aXNpYmxlIGZyb20gZHluYW1pYyBvYmplY3RzIGF0IHJ1biB0aW1lLgotCi1JZiB5b3UgZG8gbm90IHVzZSB0aGlzIG9wdGlvbiwgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIHdpbGwgbm9ybWFsbHkKLWNvbnRhaW4gb25seSB0aG9zZSBzeW1ib2xzIHdoaWNoIGFyZSByZWZlcmVuY2VkIGJ5IHNvbWUgZHluYW1pYyBvYmplY3QKLW1lbnRpb25lZCBpbiB0aGUgbGluay4KLQotSWYgeW91IHVzZSBAY29kZXtkbG9wZW59IHRvIGxvYWQgYSBkeW5hbWljIG9iamVjdCB3aGljaCBuZWVkcyB0byByZWZlcgotYmFjayB0byB0aGUgc3ltYm9scyBkZWZpbmVkIGJ5IHRoZSBwcm9ncmFtLCByYXRoZXIgdGhhbiBzb21lIG90aGVyCi1keW5hbWljIG9iamVjdCwgdGhlbiB5b3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIHVzZSB0aGlzIG9wdGlvbiB3aGVuCi1saW5raW5nIHRoZSBwcm9ncmFtIGl0c2VsZi4KLQotQGNpbmRleCBiaWctZW5kaWFuIG9iamVjdHMKLUBjaW5kZXggZW5kaWFubmVzcwotQGtpbmRleCAtRUIKLUBpdGVtIC1FQgotTGluayBiaWctZW5kaWFuIG9iamVjdHMuICBUaGlzIGFmZmVjdHMgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdC4KLQotQGNpbmRleCBsaXR0bGUtZW5kaWFuIG9iamVjdHMKLUBraW5kZXggLUVMCi1AaXRlbSAtRUwKLUxpbmsgbGl0dGxlLWVuZGlhbiBvYmplY3RzLiAgVGhpcyBhZmZlY3RzIHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQuCi0KLUBraW5kZXggLWYKLUBraW5kZXggLS1hdXhpbGlhcnkKLUBpdGVtIC1mCi1AaXRlbXggLS1hdXhpbGlhcnkgQHZhcntuYW1lfQotV2hlbiBjcmVhdGluZyBhbiBFTEYgc2hhcmVkIG9iamVjdCwgc2V0IHRoZSBpbnRlcm5hbCBEVF9BVVhJTElBUlkgZmllbGQKLXRvIHRoZSBzcGVjaWZpZWQgbmFtZS4gIFRoaXMgdGVsbHMgdGhlIGR5bmFtaWMgbGlua2VyIHRoYXQgdGhlIHN5bWJvbAotdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3Qgc2hvdWxkIGJlIHVzZWQgYXMgYW4gYXV4aWxpYXJ5IGZpbHRlciBvbiB0aGUKLXN5bWJvbCB0YWJsZSBvZiB0aGUgc2hhcmVkIG9iamVjdCBAdmFye25hbWV9LgotCi1JZiB5b3UgbGF0ZXIgbGluayBhIHByb2dyYW0gYWdhaW5zdCB0aGlzIGZpbHRlciBvYmplY3QsIHRoZW4sIHdoZW4geW91Ci1ydW4gdGhlIHByb2dyYW0sIHRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHNlZSB0aGUgRFRfQVVYSUxJQVJZIGZpZWxkLiAgSWYKLXRoZSBkeW5hbWljIGxpbmtlciByZXNvbHZlcyBhbnkgc3ltYm9scyBmcm9tIHRoZSBmaWx0ZXIgb2JqZWN0LCBpdCB3aWxsCi1maXJzdCBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgZGVmaW5pdGlvbiBpbiB0aGUgc2hhcmVkIG9iamVjdAotQHZhcntuYW1lfS4gIElmIHRoZXJlIGlzIG9uZSwgaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGRlZmluaXRpb24KLWluIHRoZSBmaWx0ZXIgb2JqZWN0LiAgVGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfSBuZWVkIG5vdCBleGlzdC4KLVRodXMgdGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGFuIGFsdGVybmF0aXZlCi1pbXBsZW1lbnRhdGlvbiBvZiBjZXJ0YWluIGZ1bmN0aW9ucywgcGVyaGFwcyBmb3IgZGVidWdnaW5nIG9yIGZvcgotbWFjaGluZSBzcGVjaWZpYyBwZXJmb3JtYW5jZS4KLQotVGhpcyBvcHRpb24gbWF5IGJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZS4gIFRoZSBEVF9BVVhJTElBUlkgZW50cmllcwotd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi1Aa2luZGV4IC1GCi1Aa2luZGV4IC0tZmlsdGVyCi1AaXRlbSAtRiBAdmFye25hbWV9Ci1AaXRlbXggLS1maWx0ZXIgQHZhcntuYW1lfQotV2hlbiBjcmVhdGluZyBhbiBFTEYgc2hhcmVkIG9iamVjdCwgc2V0IHRoZSBpbnRlcm5hbCBEVF9GSUxURVIgZmllbGQgdG8KLXRoZSBzcGVjaWZpZWQgbmFtZS4gIFRoaXMgdGVsbHMgdGhlIGR5bmFtaWMgbGlua2VyIHRoYXQgdGhlIHN5bWJvbCB0YWJsZQotb2YgdGhlIHNoYXJlZCBvYmplY3Qgd2hpY2ggaXMgYmVpbmcgY3JlYXRlZCBzaG91bGQgYmUgdXNlZCBhcyBhIGZpbHRlcgotb24gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgc2hhcmVkIG9iamVjdCBAdmFye25hbWV9LgotCi1JZiB5b3UgbGF0ZXIgbGluayBhIHByb2dyYW0gYWdhaW5zdCB0aGlzIGZpbHRlciBvYmplY3QsIHRoZW4sIHdoZW4geW91Ci1ydW4gdGhlIHByb2dyYW0sIHRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHNlZSB0aGUgRFRfRklMVEVSIGZpZWxkLiAgVGhlCi1keW5hbWljIGxpbmtlciB3aWxsIHJlc29sdmUgc3ltYm9scyBhY2NvcmRpbmcgdG8gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUKLWZpbHRlciBvYmplY3QgYXMgdXN1YWwsIGJ1dCBpdCB3aWxsIGFjdHVhbGx5IGxpbmsgdG8gdGhlIGRlZmluaXRpb25zCi1mb3VuZCBpbiB0aGUgc2hhcmVkIG9iamVjdCBAdmFye25hbWV9LiAgVGh1cyB0aGUgZmlsdGVyIG9iamVjdCBjYW4gYmUKLXVzZWQgdG8gc2VsZWN0IGEgc3Vic2V0IG9mIHRoZSBzeW1ib2xzIHByb3ZpZGVkIGJ5IHRoZSBvYmplY3QKLUB2YXJ7bmFtZX0uCi0KLVNvbWUgb2xkZXIgbGlua2VycyB1c2VkIHRoZSBAY29kZXstRn0gb3B0aW9uIHRocm91Z2hvdXQgYSBjb21waWxhdGlvbgotdG9vbGNoYWluIGZvciBzcGVjaWZ5aW5nIG9iamVjdC1maWxlIGZvcm1hdCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0Ci1vYmplY3QgZmlsZXMuICBUaGUgQHNje2dudX0gbGlua2VyIHVzZXMgb3RoZXIgbWVjaGFuaXNtcyBmb3IgdGhpcwotcHVycG9zZTogdGhlIEBjb2Rley1ifSwgQGNvZGV7LS1mb3JtYXR9LCBAY29kZXstLW9mb3JtYXR9IG9wdGlvbnMsIHRoZQotQGNvZGV7VEFSR0VUfSBjb21tYW5kIGluIGxpbmtlciBzY3JpcHRzLCBhbmQgdGhlIEBjb2Rle0dOVVRBUkdFVH0KLWVudmlyb25tZW50IHZhcmlhYmxlLiAgVGhlIEBzY3tnbnV9IGxpbmtlciB3aWxsIGlnbm9yZSB0aGUgQGNvZGV7LUZ9Ci1vcHRpb24gd2hlbiBub3QgY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QuCi0KLUBjaW5kZXggZmluYWxpemF0aW9uIGZ1bmN0aW9uCi1Aa2luZGV4IC1maW5pCi1AaXRlbSAtZmluaSBAdmFye25hbWV9Ci1XaGVuIGNyZWF0aW5nIGFuIEVMRiBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QsIGNhbGwgTkFNRSB3aGVuIHRoZQotZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0IGlzIHVubG9hZGVkLCBieSBzZXR0aW5nIERUX0ZJTkkgdG8gdGhlCi1hZGRyZXNzIG9mIHRoZSBmdW5jdGlvbi4gIEJ5IGRlZmF1bHQsIHRoZSBsaW5rZXIgdXNlcyBAY29kZXtfZmluaX0gYXMKLXRoZSBmdW5jdGlvbiB0byBjYWxsLgotCi1Aa2luZGV4IC1nCi1AaXRlbSAtZwotSWdub3JlZC4gIFByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgdG9vbHMuCi0KLUBraW5kZXggLUcKLUBraW5kZXggLS1ncHNpemUKLUBjaW5kZXggb2JqZWN0IHNpemUKLUBpdGVtIC1HQHZhcnt2YWx1ZX0KLUBpdGVteCAtLWdwc2l6ZT1AdmFye3ZhbHVlfQotU2V0IHRoZSBtYXhpbXVtIHNpemUgb2Ygb2JqZWN0cyB0byBiZSBvcHRpbWl6ZWQgdXNpbmcgdGhlIEdQIHJlZ2lzdGVyIHRvCi1AdmFye3NpemV9LiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgc3VjaCBhcwotTUlQUyBFQ09GRiB3aGljaCBzdXBwb3J0cyBwdXR0aW5nIGxhcmdlIGFuZCBzbWFsbCBvYmplY3RzIGludG8gZGlmZmVyZW50Ci1zZWN0aW9ucy4gIFRoaXMgaXMgaWdub3JlZCBmb3Igb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotQGNpbmRleCBydW50aW1lIGxpYnJhcnkgbmFtZQotQGtpbmRleCAtaEB2YXJ7bmFtZX0KLUBraW5kZXggLXNvbmFtZT1AdmFye25hbWV9Ci1AaXRlbSAtaEB2YXJ7bmFtZX0KLUBpdGVteCAtc29uYW1lPUB2YXJ7bmFtZX0KLVdoZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfU09OQU1FIGZpZWxkIHRvCi10aGUgc3BlY2lmaWVkIG5hbWUuICBXaGVuIGFuIGV4ZWN1dGFibGUgaXMgbGlua2VkIHdpdGggYSBzaGFyZWQgb2JqZWN0Ci13aGljaCBoYXMgYSBEVF9TT05BTUUgZmllbGQsIHRoZW4gd2hlbiB0aGUgZXhlY3V0YWJsZSBpcyBydW4gdGhlIGR5bmFtaWMKLWxpbmtlciB3aWxsIGF0dGVtcHQgdG8gbG9hZCB0aGUgc2hhcmVkIG9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIERUX1NPTkFNRQotZmllbGQgcmF0aGVyIHRoYW4gdGhlIHVzaW5nIHRoZSBmaWxlIG5hbWUgZ2l2ZW4gdG8gdGhlIGxpbmtlci4KLQotQGtpbmRleCAtaQotQGNpbmRleCBpbmNyZW1lbnRhbCBsaW5rCi1AaXRlbSAtaQotUGVyZm9ybSBhbiBpbmNyZW1lbnRhbCBsaW5rIChzYW1lIGFzIG9wdGlvbiBAc2FtcHstcn0pLgotCi1AY2luZGV4IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCi1Aa2luZGV4IC1pbml0Ci1AaXRlbSAtaW5pdCBAdmFye25hbWV9Ci1XaGVuIGNyZWF0aW5nIGFuIEVMRiBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QsIGNhbGwgTkFNRSB3aGVuIHRoZQotZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0IGlzIGxvYWRlZCwgYnkgc2V0dGluZyBEVF9JTklUIHRvIHRoZSBhZGRyZXNzCi1vZiB0aGUgZnVuY3Rpb24uICBCeSBkZWZhdWx0LCB0aGUgbGlua2VyIHVzZXMgQGNvZGV7X2luaXR9IGFzIHRoZQotZnVuY3Rpb24gdG8gY2FsbC4KLQotQGNpbmRleCBhcmNoaXZlIGZpbGVzLCBmcm9tIGNtZCBsaW5lCi1Aa2luZGV4IC1sQHZhcnthcmNoaXZlfQotQGtpbmRleCAtLWxpYnJhcnk9QHZhcnthcmNoaXZlfQotQGl0ZW0gLWxAdmFye2FyY2hpdmV9Ci1AaXRlbXggLS1saWJyYXJ5PUB2YXJ7YXJjaGl2ZX0KLUFkZCBhcmNoaXZlIGZpbGUgQHZhcnthcmNoaXZlfSB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byBsaW5rLiAgVGhpcwotb3B0aW9uIG1heSBiZSB1c2VkIGFueSBudW1iZXIgb2YgdGltZXMuICBAY29kZXtsZH0gd2lsbCBzZWFyY2ggaXRzCi1wYXRoLWxpc3QgZm9yIG9jY3VycmVuY2VzIG9mIEBjb2Rle2xpYkB2YXJ7YXJjaGl2ZX0uYX0gZm9yIGV2ZXJ5Ci1AdmFye2FyY2hpdmV9IHNwZWNpZmllZC4KLQotT24gc3lzdGVtcyB3aGljaCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMsIEBjb2Rle2xkfSBtYXkgYWxzbyBzZWFyY2ggZm9yCi1saWJyYXJpZXMgd2l0aCBleHRlbnNpb25zIG90aGVyIHRoYW4gQGNvZGV7LmF9LiAgU3BlY2lmaWNhbGx5LCBvbiBFTEYKLWFuZCBTdW5PUyBzeXN0ZW1zLCBAY29kZXtsZH0gd2lsbCBzZWFyY2ggYSBkaXJlY3RvcnkgZm9yIGEgbGlicmFyeSB3aXRoCi1hbiBleHRlbnNpb24gb2YgQGNvZGV7LnNvfSBiZWZvcmUgc2VhcmNoaW5nIGZvciBvbmUgd2l0aCBhbiBleHRlbnNpb24gb2YKLUBjb2Rley5hfS4gIEJ5IGNvbnZlbnRpb24sIGEgQGNvZGV7LnNvfSBleHRlbnNpb24gaW5kaWNhdGVzIGEgc2hhcmVkCi1saWJyYXJ5LgotCi1UaGUgbGlua2VyIHdpbGwgc2VhcmNoIGFuIGFyY2hpdmUgb25seSBvbmNlLCBhdCB0aGUgbG9jYXRpb24gd2hlcmUgaXQgaXMKLXNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgSWYgdGhlIGFyY2hpdmUgZGVmaW5lcyBhIHN5bWJvbCB3aGljaAotd2FzIHVuZGVmaW5lZCBpbiBzb21lIG9iamVjdCB3aGljaCBhcHBlYXJlZCBiZWZvcmUgdGhlIGFyY2hpdmUgb24gdGhlCi1jb21tYW5kIGxpbmUsIHRoZSBsaW5rZXIgd2lsbCBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBmaWxlKHMpIGZyb20gdGhlCi1hcmNoaXZlLiAgSG93ZXZlciwgYW4gdW5kZWZpbmVkIHN5bWJvbCBpbiBhbiBvYmplY3QgYXBwZWFyaW5nIGxhdGVyIG9uCi10aGUgY29tbWFuZCBsaW5lIHdpbGwgbm90IGNhdXNlIHRoZSBsaW5rZXIgdG8gc2VhcmNoIHRoZSBhcmNoaXZlIGFnYWluLgotCi1TZWUgdGhlIEBjb2Rley0ofSBvcHRpb24gZm9yIGEgd2F5IHRvIGZvcmNlIHRoZSBsaW5rZXIgdG8gc2VhcmNoCi1hcmNoaXZlcyBtdWx0aXBsZSB0aW1lcy4KLQotWW91IG1heSBsaXN0IHRoZSBzYW1lIGFyY2hpdmUgbXVsdGlwbGUgdGltZXMgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotQGlmc2V0IEdFTkVSSUMKLVRoaXMgdHlwZSBvZiBhcmNoaXZlIHNlYXJjaGluZyBpcyBzdGFuZGFyZCBmb3IgVW5peCBsaW5rZXJzLiAgSG93ZXZlciwKLWlmIHlvdSBhcmUgdXNpbmcgQGNvZGV7bGR9IG9uIEFJWCwgbm90ZSB0aGF0IGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZQotYmVoYXZpb3VyIG9mIHRoZSBBSVggbGlua2VyLgotQGVuZCBpZnNldAotCi1AY2luZGV4IHNlYXJjaCBkaXJlY3RvcnksIGZyb20gY21kIGxpbmUKLUBraW5kZXggLUxAdmFye2Rpcn0KLUBraW5kZXggLS1saWJyYXJ5LXBhdGg9QHZhcntkaXJ9Ci1AaXRlbSAtTEB2YXJ7c2VhcmNoZGlyfSAKLUBpdGVteCAtLWxpYnJhcnktcGF0aD1AdmFye3NlYXJjaGRpcn0KLUFkZCBwYXRoIEB2YXJ7c2VhcmNoZGlyfSB0byB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IEBjb2Rle2xkfSB3aWxsIHNlYXJjaAotZm9yIGFyY2hpdmUgbGlicmFyaWVzIGFuZCBAY29kZXtsZH0gY29udHJvbCBzY3JpcHRzLiAgWW91IG1heSB1c2UgdGhpcwotb3B0aW9uIGFueSBudW1iZXIgb2YgdGltZXMuICBUaGUgZGlyZWN0b3JpZXMgYXJlIHNlYXJjaGVkIGluIHRoZSBvcmRlcgotaW4gd2hpY2ggdGhleSBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBEaXJlY3RvcmllcyBzcGVjaWZpZWQKLW9uIHRoZSBjb21tYW5kIGxpbmUgYXJlIHNlYXJjaGVkIGJlZm9yZSB0aGUgZGVmYXVsdCBkaXJlY3Rvcmllcy4gIEFsbAotQGNvZGV7LUx9IG9wdGlvbnMgYXBwbHkgdG8gYWxsIEBjb2Rley1sfSBvcHRpb25zLCByZWdhcmRsZXNzIG9mIHRoZQotb3JkZXIgaW4gd2hpY2ggdGhlIG9wdGlvbnMgYXBwZWFyLgotCi1AaWZzZXQgVXNlc0VudlZhcnMKLVRoZSBkZWZhdWx0IHNldCBvZiBwYXRocyBzZWFyY2hlZCAod2l0aG91dCBiZWluZyBzcGVjaWZpZWQgd2l0aAotQHNhbXB7LUx9KSBkZXBlbmRzIG9uIHdoaWNoIGVtdWxhdGlvbiBtb2RlIEBjb2Rle2xkfSBpcyB1c2luZywgYW5kIGluCi1zb21lIGNhc2VzIGFsc28gb24gaG93IGl0IHdhcyBjb25maWd1cmVkLiAgQHhyZWZ7RW52aXJvbm1lbnR9LgotQGVuZCBpZnNldAotCi1UaGUgcGF0aHMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGluIGEgbGluayBzY3JpcHQgd2l0aCB0aGUKLUBjb2Rle1NFQVJDSF9ESVJ9IGNvbW1hbmQuICBEaXJlY3RvcmllcyBzcGVjaWZpZWQgdGhpcyB3YXkgYXJlIHNlYXJjaGVkCi1hdCB0aGUgcG9pbnQgaW4gd2hpY2ggdGhlIGxpbmtlciBzY3JpcHQgYXBwZWFycyBpbiB0aGUgY29tbWFuZCBsaW5lLgotCi1AY2luZGV4IGVtdWxhdGlvbgotQGtpbmRleCAtbSBAdmFye2VtdWxhdGlvbn0KLUBpdGVtIC1tQHZhcntlbXVsYXRpb259Ci1FbXVsYXRlIHRoZSBAdmFye2VtdWxhdGlvbn0gbGlua2VyLiAgWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUKLWVtdWxhdGlvbnMgd2l0aCB0aGUgQHNhbXB7LS12ZXJib3NlfSBvciBAc2FtcHstVn0gb3B0aW9ucy4KLQotSWYgdGhlIEBzYW1wey1tfSBvcHRpb24gaXMgbm90IHVzZWQsIHRoZSBlbXVsYXRpb24gaXMgdGFrZW4gZnJvbSB0aGUKLUBjb2Rle0xERU1VTEFUSU9OfSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgdGhhdCBpcyBkZWZpbmVkLgotCi1PdGhlcndpc2UsIHRoZSBkZWZhdWx0IGVtdWxhdGlvbiBkZXBlbmRzIHVwb24gaG93IHRoZSBsaW5rZXIgd2FzCi1jb25maWd1cmVkLgotCi1AY2luZGV4IGxpbmsgbWFwCi1Aa2luZGV4IC1NCi1Aa2luZGV4IC0tcHJpbnQtbWFwCi1AaXRlbSAtTQotQGl0ZW14IC0tcHJpbnQtbWFwCi1QcmludCBhIGxpbmsgbWFwIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuICBBIGxpbmsgbWFwIHByb3ZpZGVzCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgbGluaywgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1XaGVyZSBvYmplY3QgZmlsZXMgYW5kIHN5bWJvbHMgYXJlIG1hcHBlZCBpbnRvIG1lbW9yeS4KLUBpdGVtCi1Ib3cgY29tbW9uIHN5bWJvbHMgYXJlIGFsbG9jYXRlZC4KLUBpdGVtCi1BbGwgYXJjaGl2ZSBtZW1iZXJzIGluY2x1ZGVkIGluIHRoZSBsaW5rLCB3aXRoIGEgbWVudGlvbiBvZiB0aGUgc3ltYm9sCi13aGljaCBjYXVzZWQgdGhlIGFyY2hpdmUgbWVtYmVyIHRvIGJlIGJyb3VnaHQgaW4uCi1AZW5kIGl0ZW1pemUKLQotQGtpbmRleCAtbgotQGNpbmRleCByZWFkLW9ubHkgdGV4dAotQGNpbmRleCBOTUFHSUMKLUBraW5kZXggLS1ubWFnaWMKLUBpdGVtIC1uCi1AaXRlbXggLS1ubWFnaWMKLVNldCB0aGUgdGV4dCBzZWdtZW50IHRvIGJlIHJlYWQgb25seSwgYW5kIG1hcmsgdGhlIG91dHB1dCBhcwotQGNvZGV7Tk1BR0lDfSBpZiBwb3NzaWJsZS4KLQotQGtpbmRleCAtTgotQGtpbmRleCAtLW9tYWdpYwotQGNpbmRleCByZWFkL3dyaXRlIGZyb20gY21kIGxpbmUKLUBjaW5kZXggT01BR0lDCi1AaXRlbSAtTiAKLUBpdGVteCAtLW9tYWdpYwotU2V0IHRoZSB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zIHRvIGJlIHJlYWRhYmxlIGFuZCB3cml0YWJsZS4gIEFsc28sIGRvCi1ub3QgcGFnZS1hbGlnbiB0aGUgZGF0YSBzZWdtZW50LiAgSWYgdGhlIG91dHB1dCBmb3JtYXQgc3VwcG9ydHMgVW5peAotc3R5bGUgbWFnaWMgbnVtYmVycywgbWFyayB0aGUgb3V0cHV0IGFzIEBjb2Rle09NQUdJQ30uCi0KLUBraW5kZXggLW8gQHZhcntvdXRwdXR9Ci1Aa2luZGV4IC0tb3V0cHV0PUB2YXJ7b3V0cHV0fQotQGNpbmRleCBuYW1pbmcgdGhlIG91dHB1dCBmaWxlCi1AaXRlbSAtbyBAdmFye291dHB1dH0KLUBpdGVteCAtLW91dHB1dD1AdmFye291dHB1dH0KLVVzZSBAdmFye291dHB1dH0gYXMgdGhlIG5hbWUgZm9yIHRoZSBwcm9ncmFtIHByb2R1Y2VkIGJ5IEBjb2Rle2xkfTsgaWYgdGhpcwotb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIEBmaWxle2Eub3V0fSBpcyB1c2VkIGJ5IGRlZmF1bHQuICBUaGUKLXNjcmlwdCBjb21tYW5kIEBjb2Rle09VVFBVVH0gY2FuIGFsc28gc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KLQotQGtpbmRleCAtTyBAdmFye2xldmVsfQotQGNpbmRleCBnZW5lcmF0aW5nIG9wdGltaXplZCBvdXRwdXQKLUBpdGVtIC1PIEB2YXJ7bGV2ZWx9Ci1JZiBAdmFye2xldmVsfSBpcyBhIG51bWVyaWMgdmFsdWVzIGdyZWF0ZXIgdGhhbiB6ZXJvIEBjb2Rle2xkfSBvcHRpbWl6ZXMKLXRoZSBvdXRwdXQuICBUaGlzIG1pZ2h0IHRha2Ugc2lnbmlmaWNhbnRseSBsb25nZXIgYW5kIHRoZXJlZm9yZSBwcm9iYWJseQotc2hvdWxkIG9ubHkgYmUgZW5hYmxlZCBmb3IgdGhlIGZpbmFsIGJpbmFyeS4KLQotQGNpbmRleCBwYXJ0aWFsIGxpbmsKLUBjaW5kZXggcmVsb2NhdGFibGUgb3V0cHV0Ci1Aa2luZGV4IC1yCi1Aa2luZGV4IC0tcmVsb2NhdGVhYmxlCi1AaXRlbSAtcgotQGl0ZW14IC0tcmVsb2NhdGVhYmxlCi1HZW5lcmF0ZSByZWxvY2F0YWJsZSBvdXRwdXQtLS1pLmUuLCBnZW5lcmF0ZSBhbiBvdXRwdXQgZmlsZSB0aGF0IGNhbiBpbgotdHVybiBzZXJ2ZSBhcyBpbnB1dCB0byBAY29kZXtsZH0uICBUaGlzIGlzIG9mdGVuIGNhbGxlZCBAZGZue3BhcnRpYWwKLWxpbmtpbmd9LiAgQXMgYSBzaWRlIGVmZmVjdCwgaW4gZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBzdGFuZGFyZCBVbml4Ci1tYWdpYyBudW1iZXJzLCB0aGlzIG9wdGlvbiBhbHNvIHNldHMgdGhlIG91dHB1dCBmaWxlJ3MgbWFnaWMgbnVtYmVyIHRvCi1AY29kZXtPTUFHSUN9LgotQGMgOyBzZWUgQGNvZGV7LU59LiAKLUlmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIGFuIGFic29sdXRlIGZpbGUgaXMgcHJvZHVjZWQuICBXaGVuCi1saW5raW5nIEMrKyBwcm9ncmFtcywgdGhpcyBvcHRpb24gQGVtcGh7d2lsbCBub3R9IHJlc29sdmUgcmVmZXJlbmNlcyB0bwotY29uc3RydWN0b3JzOyB0byBkbyB0aGF0LCB1c2UgQHNhbXB7LVVyfS4KLQotVGhpcyBvcHRpb24gZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBAc2FtcHstaX0uCi0KLUBraW5kZXggLVIgQHZhcntmaWxlfQotQGtpbmRleCAtLWp1c3Qtc3ltYm9scz1AdmFye2ZpbGV9Ci1AY2luZGV4IHN5bWJvbC1vbmx5IGlucHV0Ci1AaXRlbSAtUiBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tanVzdC1zeW1ib2xzPUB2YXJ7ZmlsZW5hbWV9Ci1SZWFkIHN5bWJvbCBuYW1lcyBhbmQgdGhlaXIgYWRkcmVzc2VzIGZyb20gQHZhcntmaWxlbmFtZX0sIGJ1dCBkbyBub3QKLXJlbG9jYXRlIGl0IG9yIGluY2x1ZGUgaXQgaW4gdGhlIG91dHB1dC4gIFRoaXMgYWxsb3dzIHlvdXIgb3V0cHV0IGZpbGUKLXRvIHJlZmVyIHN5bWJvbGljYWxseSB0byBhYnNvbHV0ZSBsb2NhdGlvbnMgb2YgbWVtb3J5IGRlZmluZWQgaW4gb3RoZXIKLXByb2dyYW1zLiAgWW91IG1heSB1c2UgdGhpcyBvcHRpb24gbW9yZSB0aGFuIG9uY2UuCi0KLUZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgRUxGIGxpbmtlcnMsIGlmIHRoZSBAY29kZXstUn0gb3B0aW9uIGlzCi1mb2xsb3dlZCBieSBhIGRpcmVjdG9yeSBuYW1lLCByYXRoZXIgdGhhbiBhIGZpbGUgbmFtZSwgaXQgaXMgdHJlYXRlZCBhcwotdGhlIEBjb2Rley1ycGF0aH0gb3B0aW9uLgotCi1Aa2luZGV4IC1zCi1Aa2luZGV4IC0tc3RyaXAtYWxsCi1AY2luZGV4IHN0cmlwIGFsbCBzeW1ib2xzCi1AaXRlbSAtcyAKLUBpdGVteCAtLXN0cmlwLWFsbAotT21pdCBhbGwgc3ltYm9sIGluZm9ybWF0aW9uIGZyb20gdGhlIG91dHB1dCBmaWxlLgotCi1Aa2luZGV4IC1TCi1Aa2luZGV4IC0tc3RyaXAtZGVidWcKLUBjaW5kZXggc3RyaXAgZGVidWdnZXIgc3ltYm9scwotQGl0ZW0gLVMgCi1AaXRlbXggLS1zdHJpcC1kZWJ1ZwotT21pdCBkZWJ1Z2dlciBzeW1ib2wgaW5mb3JtYXRpb24gKGJ1dCBub3QgYWxsIHN5bWJvbHMpIGZyb20gdGhlIG91dHB1dCBmaWxlLgotCi1Aa2luZGV4IC10Ci1Aa2luZGV4IC0tdHJhY2UKLUBjaW5kZXggaW5wdXQgZmlsZXMsIGRpc3BsYXlpbmcKLUBpdGVtIC10IAotQGl0ZW14IC0tdHJhY2UKLVByaW50IHRoZSBuYW1lcyBvZiB0aGUgaW5wdXQgZmlsZXMgYXMgQGNvZGV7bGR9IHByb2Nlc3NlcyB0aGVtLgotCi1Aa2luZGV4IC1UIEB2YXJ7c2NyaXB0fQotQGtpbmRleCAtLXNjcmlwdD1AdmFye3NjcmlwdH0KLUBjaW5kZXggc2NyaXB0IGZpbGVzCi1AaXRlbSAtVCBAdmFye3NjcmlwdGZpbGV9Ci1AaXRlbXggLS1zY3JpcHQ9QHZhcntzY3JpcHRmaWxlfQotVXNlIEB2YXJ7c2NyaXB0ZmlsZX0gYXMgdGhlIGxpbmtlciBzY3JpcHQuICBUaGlzIHNjcmlwdCByZXBsYWNlcwotQGNvZGV7bGR9J3MgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IChyYXRoZXIgdGhhbiBhZGRpbmcgdG8gaXQpLCBzbwotQHZhcntjb21tYW5kZmlsZX0gbXVzdCBzcGVjaWZ5IGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGRlc2NyaWJlIHRoZQotb3V0cHV0IGZpbGUuICBZb3UgbXVzdCB1c2UgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gdXNlIGEgY29tbWFuZAotd2hpY2ggY2FuIG9ubHkgYXBwZWFyIG9uY2UgaW4gYSBsaW5rZXIgc2NyaXB0LCBzdWNoIGFzIHRoZQotQGNvZGV7U0VDVElPTlN9IG9yIEBjb2Rle01FTU9SWX0gY29tbWFuZC4gIEB4cmVme1NjcmlwdHN9LiAgSWYKLUB2YXJ7c2NyaXB0ZmlsZX0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBAY29kZXtsZH0KLWxvb2tzIGZvciBpdCBpbiB0aGUgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IGFueSBwcmVjZWRpbmcgQHNhbXB7LUx9Ci1vcHRpb25zLiAgTXVsdGlwbGUgQHNhbXB7LVR9IG9wdGlvbnMgYWNjdW11bGF0ZS4KLQotQGtpbmRleCAtdSBAdmFye3N5bWJvbH0KLUBraW5kZXggLS11bmRlZmluZWQ9QHZhcntzeW1ib2x9Ci1AY2luZGV4IHVuZGVmaW5lZCBzeW1ib2wKLUBpdGVtIC11IEB2YXJ7c3ltYm9sfQotQGl0ZW14IC0tdW5kZWZpbmVkPUB2YXJ7c3ltYm9sfQotRm9yY2UgQHZhcntzeW1ib2x9IHRvIGJlIGVudGVyZWQgaW4gdGhlIG91dHB1dCBmaWxlIGFzIGFuIHVuZGVmaW5lZAotc3ltYm9sLiAgRG9pbmcgdGhpcyBtYXksIGZvciBleGFtcGxlLCB0cmlnZ2VyIGxpbmtpbmcgb2YgYWRkaXRpb25hbAotbW9kdWxlcyBmcm9tIHN0YW5kYXJkIGxpYnJhcmllcy4gIEBzYW1wey11fSBtYXkgYmUgcmVwZWF0ZWQgd2l0aAotZGlmZmVyZW50IG9wdGlvbiBhcmd1bWVudHMgdG8gZW50ZXIgYWRkaXRpb25hbCB1bmRlZmluZWQgc3ltYm9scy4gIFRoaXMKLW9wdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSBAY29kZXtFWFRFUk59IGxpbmtlciBzY3JpcHQgY29tbWFuZC4KLQotQGtpbmRleCAtVXIKLUBjaW5kZXggY29uc3RydWN0b3JzCi1AaXRlbSAtVXIgCi1Gb3IgYW55dGhpbmcgb3RoZXIgdGhhbiBDKysgcHJvZ3JhbXMsIHRoaXMgb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8KLUBzYW1wey1yfTogaXQgZ2VuZXJhdGVzIHJlbG9jYXRhYmxlIG91dHB1dC0tLWkuZS4sIGFuIG91dHB1dCBmaWxlIHRoYXQgY2FuIGluCi10dXJuIHNlcnZlIGFzIGlucHV0IHRvIEBjb2Rle2xkfS4gIFdoZW4gbGlua2luZyBDKysgcHJvZ3JhbXMsIEBzYW1wey1Vcn0KLUBlbXBoe2RvZXN9IHJlc29sdmUgcmVmZXJlbmNlcyB0byBjb25zdHJ1Y3RvcnMsIHVubGlrZSBAc2FtcHstcn0uCi1JdCBkb2VzIG5vdCB3b3JrIHRvIHVzZSBAc2FtcHstVXJ9IG9uIGZpbGVzIHRoYXQgd2VyZSB0aGVtc2VsdmVzIGxpbmtlZAotd2l0aCBAc2FtcHstVXJ9OyBvbmNlIHRoZSBjb25zdHJ1Y3RvciB0YWJsZSBoYXMgYmVlbiBidWlsdCwgaXQgY2Fubm90Ci1iZSBhZGRlZCB0by4gIFVzZSBAc2FtcHstVXJ9IG9ubHkgZm9yIHRoZSBsYXN0IHBhcnRpYWwgbGluaywgYW5kCi1Ac2FtcHstcn0gZm9yIHRoZSBvdGhlcnMuCi0KLUBraW5kZXggLXYKLUBraW5kZXggLVYKLUBraW5kZXggLS12ZXJzaW9uCi1AY2luZGV4IHZlcnNpb24KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1AaXRlbXggLVYKLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBAY29kZXtsZH0uICBUaGUgQGNvZGV7LVZ9IG9wdGlvbiBhbHNvCi1saXN0cyB0aGUgc3VwcG9ydGVkIGVtdWxhdGlvbnMuCi0KLUBraW5kZXggLXgKLUBraW5kZXggLS1kaXNjYXJkLWFsbAotQGNpbmRleCBkZWxldGluZyBsb2NhbCBzeW1ib2xzCi1AaXRlbSAteAotQGl0ZW14IC0tZGlzY2FyZC1hbGwKLURlbGV0ZSBhbGwgbG9jYWwgc3ltYm9scy4KLQotQGtpbmRleCAtWAotQGtpbmRleCAtLWRpc2NhcmQtbG9jYWxzCi1AY2luZGV4IGxvY2FsIHN5bWJvbHMsIGRlbGV0aW5nCi1AY2luZGV4IEwsIGRlbGV0aW5nIHN5bWJvbHMgYmVnaW5uaW5nCi1AaXRlbSAtWCAKLUBpdGVteCAtLWRpc2NhcmQtbG9jYWxzCi1EZWxldGUgYWxsIHRlbXBvcmFyeSBsb2NhbCBzeW1ib2xzLiAgRm9yIG1vc3QgdGFyZ2V0cywgdGhpcyBpcyBhbGwgbG9jYWwKLXN5bWJvbHMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBAc2FtcHtMfS4KLQotQGtpbmRleCAteSBAdmFye3N5bWJvbH0KLUBraW5kZXggLS10cmFjZS1zeW1ib2w9QHZhcntzeW1ib2x9Ci1AY2luZGV4IHN5bWJvbCB0cmFjaW5nCi1AaXRlbSAteSBAdmFye3N5bWJvbH0KLUBpdGVteCAtLXRyYWNlLXN5bWJvbD1AdmFye3N5bWJvbH0KLVByaW50IHRoZSBuYW1lIG9mIGVhY2ggbGlua2VkIGZpbGUgaW4gd2hpY2ggQHZhcntzeW1ib2x9IGFwcGVhcnMuICBUaGlzCi1vcHRpb24gbWF5IGJlIGdpdmVuIGFueSBudW1iZXIgb2YgdGltZXMuICBPbiBtYW55IHN5c3RlbXMgaXQgaXMgbmVjZXNzYXJ5Ci10byBwcmVwZW5kIGFuIHVuZGVyc2NvcmUuCi0KLVRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIGFuIHVuZGVmaW5lZCBzeW1ib2wgaW4geW91ciBsaW5rIGJ1dAotZG9uJ3Qga25vdyB3aGVyZSB0aGUgcmVmZXJlbmNlIGlzIGNvbWluZyBmcm9tLgotCi1Aa2luZGV4IC1ZIEB2YXJ7cGF0aH0KLUBpdGVtIC1ZIEB2YXJ7cGF0aH0KLUFkZCBAdmFye3BhdGh9IHRvIHRoZSBkZWZhdWx0IGxpYnJhcnkgc2VhcmNoIHBhdGguICBUaGlzIG9wdGlvbiBleGlzdHMKLWZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkuCi0KLUBraW5kZXggLXogQHZhcntrZXl3b3JkfQotQGl0ZW0gLXogQHZhcntrZXl3b3JkfQotVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC0oCi1AY2luZGV4IGdyb3VwcyBvZiBhcmNoaXZlcwotQGl0ZW0gLSggQHZhcnthcmNoaXZlc30gLSkKLUBpdGVteCAtLXN0YXJ0LWdyb3VwIEB2YXJ7YXJjaGl2ZXN9IC0tZW5kLWdyb3VwCi1UaGUgQHZhcnthcmNoaXZlc30gc2hvdWxkIGJlIGEgbGlzdCBvZiBhcmNoaXZlIGZpbGVzLiAgVGhleSBtYXkgYmUKLWVpdGhlciBleHBsaWNpdCBmaWxlIG5hbWVzLCBvciBAc2FtcHstbH0gb3B0aW9ucy4KLQotVGhlIHNwZWNpZmllZCBhcmNoaXZlcyBhcmUgc2VhcmNoZWQgcmVwZWF0ZWRseSB1bnRpbCBubyBuZXcgdW5kZWZpbmVkCi1yZWZlcmVuY2VzIGFyZSBjcmVhdGVkLiAgTm9ybWFsbHksIGFuIGFyY2hpdmUgaXMgc2VhcmNoZWQgb25seSBvbmNlIGluCi10aGUgb3JkZXIgdGhhdCBpdCBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIElmIGEgc3ltYm9sIGluIHRoYXQKLWFyY2hpdmUgaXMgbmVlZGVkIHRvIHJlc29sdmUgYW4gdW5kZWZpbmVkIHN5bWJvbCByZWZlcnJlZCB0byBieSBhbgotb2JqZWN0IGluIGFuIGFyY2hpdmUgdGhhdCBhcHBlYXJzIGxhdGVyIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBsaW5rZXIKLXdvdWxkIG5vdCBiZSBhYmxlIHRvIHJlc29sdmUgdGhhdCByZWZlcmVuY2UuICBCeSBncm91cGluZyB0aGUgYXJjaGl2ZXMsCi10aGV5IGFsbCBiZSBzZWFyY2hlZCByZXBlYXRlZGx5IHVudGlsIGFsbCBwb3NzaWJsZSByZWZlcmVuY2VzIGFyZQotcmVzb2x2ZWQuCi0KLVVzaW5nIHRoaXMgb3B0aW9uIGhhcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGNvc3QuICBJdCBpcyBiZXN0IHRvIHVzZQotaXQgb25seSB3aGVuIHRoZXJlIGFyZSB1bmF2b2lkYWJsZSBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW4gdHdvIG9yCi1tb3JlIGFyY2hpdmVzLgotCi1Aa2luZGV4IC1hc3NlcnQgQHZhcntrZXl3b3JkfQotQGl0ZW0gLWFzc2VydCBAdmFye2tleXdvcmR9Ci1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBTdW5PUyBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC1CZHluYW1pYwotQGtpbmRleCAtZHkKLUBraW5kZXggLWNhbGxfc2hhcmVkCi1AaXRlbSAtQmR5bmFtaWMKLUBpdGVteCAtZHkKLUBpdGVteCAtY2FsbF9zaGFyZWQKLUxpbmsgYWdhaW5zdCBkeW5hbWljIGxpYnJhcmllcy4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIG9uIHBsYXRmb3JtcwotZm9yIHdoaWNoIHNoYXJlZCBsaWJyYXJpZXMgYXJlIHN1cHBvcnRlZC4gIFRoaXMgb3B0aW9uIGlzIG5vcm1hbGx5IHRoZQotZGVmYXVsdCBvbiBzdWNoIHBsYXRmb3Jtcy4gIFRoZSBkaWZmZXJlbnQgdmFyaWFudHMgb2YgdGhpcyBvcHRpb24gYXJlCi1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZhcmlvdXMgc3lzdGVtcy4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uCi1tdWx0aXBsZSB0aW1lcyBvbiB0aGUgY29tbWFuZCBsaW5lOiBpdCBhZmZlY3RzIGxpYnJhcnkgc2VhcmNoaW5nIGZvcgotQGNvZGV7LWx9IG9wdGlvbnMgd2hpY2ggZm9sbG93IGl0LgotCi1Aa2luZGV4IC1Cc3RhdGljCi1Aa2luZGV4IC1kbgotQGtpbmRleCAtbm9uX3NoYXJlZAotQGtpbmRleCAtc3RhdGljCi1AaXRlbSAtQnN0YXRpYyAKLUBpdGVteCAtZG4KLUBpdGVteCAtbm9uX3NoYXJlZAotQGl0ZW14IC1zdGF0aWMKLURvIG5vdCBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcy4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIG9uCi1wbGF0Zm9ybXMgZm9yIHdoaWNoIHNoYXJlZCBsaWJyYXJpZXMgYXJlIHN1cHBvcnRlZC4gIFRoZSBkaWZmZXJlbnQKLXZhcmlhbnRzIG9mIHRoaXMgb3B0aW9uIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZhcmlvdXMgc3lzdGVtcy4gIFlvdQotbWF5IHVzZSB0aGlzIG9wdGlvbiBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgY29tbWFuZCBsaW5lOiBpdCBhZmZlY3RzCi1saWJyYXJ5IHNlYXJjaGluZyBmb3IgQGNvZGV7LWx9IG9wdGlvbnMgd2hpY2ggZm9sbG93IGl0LgotCi1Aa2luZGV4IC1Cc3ltYm9saWMKLUBpdGVtIC1Cc3ltYm9saWMKLVdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYmluZCByZWZlcmVuY2VzIHRvIGdsb2JhbCBzeW1ib2xzIHRvIHRoZQotZGVmaW5pdGlvbiB3aXRoaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LCBpZiBhbnkuICBOb3JtYWxseSwgaXQgaXMgcG9zc2libGUKLWZvciBhIHByb2dyYW0gbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgbGlicmFyeSB0byBvdmVycmlkZSB0aGUgZGVmaW5pdGlvbgotd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeS4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbiBFTEYKLXBsYXRmb3JtcyB3aGljaCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuCi0KLUBraW5kZXggLS1jaGVjay1zZWN0aW9ucwotQGtpbmRleCAtLW5vLWNoZWNrLXNlY3Rpb25zCi1AaXRlbSAtLWNoZWNrLXNlY3Rpb25zCi1AaXRlbXggLS1uby1jaGVjay1zZWN0aW9ucwotQXNrcyB0aGUgbGlua2VyIEBlbXBoe25vdH0gdG8gY2hlY2sgc2VjdGlvbiBhZGRyZXNzZXMgYWZ0ZXIgdGhleSBoYXZlCi1iZWVuIGFzc2lnbmVkIHRvIHNlZSBpZiB0aGVyZSBhbnkgb3ZlcmxhcHMuICBOb3JtYWxseSB0aGUgbGlua2VyIHdpbGwKLXBlcmZvcm0gdGhpcyBjaGVjaywgYW5kIGlmIGl0IGZpbmRzIGFueSBvdmVybGFwcyBpdCB3aWxsIHByb2R1Y2UKLXN1aXRhYmxlIGVycm9yIG1lc3NhZ2VzLiAgVGhlIGxpbmtlciBkb2VzIGtub3cgYWJvdXQsIGFuZCBkb2VzIG1ha2UKLWFsbG93YW5jZXMgZm9yIHNlY3Rpb25zIGluIG92ZXJsYXlzLiAgVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGNhbiBiZQotcmVzdG9yZWQgYnkgdXNpbmcgdGhlIGNvbW1hbmQgbGluZSBzd2l0Y2ggQHNhbXB7LS1jaGVjay1zZWN0aW9uc30uCi0KLUBjaW5kZXggY3Jvc3MgcmVmZXJlbmNlIHRhYmxlCi1Aa2luZGV4IC0tY3JlZgotQGl0ZW0gLS1jcmVmCi1PdXRwdXQgYSBjcm9zcyByZWZlcmVuY2UgdGFibGUuICBJZiBhIGxpbmtlciBtYXAgZmlsZSBpcyBiZWluZwotZ2VuZXJhdGVkLCB0aGUgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIGlzIHByaW50ZWQgdG8gdGhlIG1hcCBmaWxlLgotT3RoZXJ3aXNlLCBpdCBpcyBwcmludGVkIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCi0KLVRoZSBmb3JtYXQgb2YgdGhlIHRhYmxlIGlzIGludGVudGlvbmFsbHkgc2ltcGxlLCBzbyB0aGF0IGl0IG1heSBiZQotZWFzaWx5IHByb2Nlc3NlZCBieSBhIHNjcmlwdCBpZiBuZWNlc3NhcnkuICBUaGUgc3ltYm9scyBhcmUgcHJpbnRlZCBvdXQsCi1zb3J0ZWQgYnkgbmFtZS4gIEZvciBlYWNoIHN5bWJvbCwgYSBsaXN0IG9mIGZpbGUgbmFtZXMgaXMgZ2l2ZW4uICBJZiB0aGUKLXN5bWJvbCBpcyBkZWZpbmVkLCB0aGUgZmlyc3QgZmlsZSBsaXN0ZWQgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZQotZGVmaW5pdGlvbi4gIFRoZSByZW1haW5pbmcgZmlsZXMgY29udGFpbiByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wuCi0KLUBjaW5kZXggc3ltYm9scywgZnJvbSBjb21tYW5kIGxpbmUKLUBraW5kZXggLS1kZWZzeW0gQHZhcntzeW1ib2x9PUB2YXJ7ZXhwfQotQGl0ZW0gLS1kZWZzeW0gQHZhcntzeW1ib2x9PUB2YXJ7ZXhwcmVzc2lvbn0KLUNyZWF0ZSBhIGdsb2JhbCBzeW1ib2wgaW4gdGhlIG91dHB1dCBmaWxlLCBjb250YWluaW5nIHRoZSBhYnNvbHV0ZQotYWRkcmVzcyBnaXZlbiBieSBAdmFye2V4cHJlc3Npb259LiAgWW91IG1heSB1c2UgdGhpcyBvcHRpb24gYXMgbWFueQotdGltZXMgYXMgbmVjZXNzYXJ5IHRvIGRlZmluZSBtdWx0aXBsZSBzeW1ib2xzIGluIHRoZSBjb21tYW5kIGxpbmUuICBBCi1saW1pdGVkIGZvcm0gb2YgYXJpdGhtZXRpYyBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBAdmFye2V4cHJlc3Npb259IGluIHRoaXMKLWNvbnRleHQ6IHlvdSBtYXkgZ2l2ZSBhIGhleGFkZWNpbWFsIGNvbnN0YW50IG9yIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nCi1zeW1ib2wsIG9yIHVzZSBAY29kZXsrfSBhbmQgQGNvZGV7LX0gdG8gYWRkIG9yIHN1YnRyYWN0IGhleGFkZWNpbWFsCi1jb25zdGFudHMgb3Igc3ltYm9scy4gIElmIHlvdSBuZWVkIG1vcmUgZWxhYm9yYXRlIGV4cHJlc3Npb25zLCBjb25zaWRlcgotdXNpbmcgdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlIGZyb20gYSBzY3JpcHQgKEBweHJlZntBc3NpZ25tZW50cywsCi1Bc3NpZ25tZW50OiBTeW1ib2wgRGVmaW5pdGlvbnN9KS4gIEBlbXBoe05vdGU6fSB0aGVyZSBzaG91bGQgYmUgbm8gd2hpdGUKLXNwYWNlIGJldHdlZW4gQHZhcntzeW1ib2x9LCB0aGUgZXF1YWxzIHNpZ24gKGBgQGtleXs9fScnKSwgYW5kCi1AdmFye2V4cHJlc3Npb259LgotCi1AY2luZGV4IGRlbWFuZ2xpbmcsIGZyb20gY29tbWFuZCBsaW5lCi1Aa2luZGV4IC0tZGVtYW5nbGUKLUBraW5kZXggLS1uby1kZW1hbmdsZQotQGl0ZW0gLS1kZW1hbmdsZQotQGl0ZW14IC0tbm8tZGVtYW5nbGUKLVRoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0aGVyIHRvIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyBpbiBlcnJvciBtZXNzYWdlcwotYW5kIG90aGVyIG91dHB1dC4gIFdoZW4gdGhlIGxpbmtlciBpcyB0b2xkIHRvIGRlbWFuZ2xlLCBpdCB0cmllcyB0bwotcHJlc2VudCBzeW1ib2wgbmFtZXMgaW4gYSByZWFkYWJsZSBmYXNoaW9uOiBpdCBzdHJpcHMgbGVhZGluZwotdW5kZXJzY29yZXMgaWYgdGhleSBhcmUgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCBhbmQgY29udmVydHMgQysrCi1tYW5nbGVkIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXIgcmVhZGFibGUgbmFtZXMuICBUaGUgbGlua2VyIHdpbGwgZGVtYW5nbGUKLWJ5IGRlZmF1bHQgdW5sZXNzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBAc2FtcHtDT0xMRUNUX05PX0RFTUFOR0xFfSBpcwotc2V0LiAgVGhlc2Ugb3B0aW9ucyBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdC4KLQotQGNpbmRleCBkeW5hbWljIGxpbmtlciwgZnJvbSBjb21tYW5kIGxpbmUKLUBraW5kZXggLS1keW5hbWljLWxpbmtlciBAdmFye2ZpbGV9Ci1AaXRlbSAtLWR5bmFtaWMtbGlua2VyIEB2YXJ7ZmlsZX0KLVNldCB0aGUgbmFtZSBvZiB0aGUgZHluYW1pYyBsaW5rZXIuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuCi1nZW5lcmF0aW5nIGR5bmFtaWNhbGx5IGxpbmtlZCBFTEYgZXhlY3V0YWJsZXMuICBUaGUgZGVmYXVsdCBkeW5hbWljCi1saW5rZXIgaXMgbm9ybWFsbHkgY29ycmVjdDsgZG9uJ3QgdXNlIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZQotZG9pbmcuCi0KLUBjaW5kZXggTUlQUyBlbWJlZGRlZCBQSUMgY29kZQotQGtpbmRleCAtLWVtYmVkZGVkLXJlbG9jcwotQGl0ZW0gLS1lbWJlZGRlZC1yZWxvY3MKLVRoaXMgb3B0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGxpbmtpbmcgTUlQUyBlbWJlZGRlZCBQSUMgY29kZSwKLWdlbmVyYXRlZCBieSB0aGUgLW1lbWJlZGRlZC1waWMgb3B0aW9uIHRvIHRoZSBAc2N7Z251fSBjb21waWxlciBhbmQKLWFzc2VtYmxlci4gIEl0IGNhdXNlcyB0aGUgbGlua2VyIHRvIGNyZWF0ZSBhIHRhYmxlIHdoaWNoIG1heSBiZSB1c2VkIGF0Ci1ydW50aW1lIHRvIHJlbG9jYXRlIGFueSBkYXRhIHdoaWNoIHdhcyBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHRvIHBvaW50ZXIKLXZhbHVlcy4gIFNlZSB0aGUgY29kZSBpbiB0ZXN0c3VpdGUvbGQtZW1waWMgZm9yIGRldGFpbHMuCi0KLUBraW5kZXggLS1mb3JjZS1leGUtc3VmZml4Ci1AaXRlbSAgLS1mb3JjZS1leGUtc3VmZml4Ci1NYWtlIHN1cmUgdGhhdCBhbiBvdXRwdXQgZmlsZSBoYXMgYSAuZXhlIHN1ZmZpeC4KLQotSWYgYSBzdWNjZXNzZnVsbHkgYnVpbHQgZnVsbHkgbGlua2VkIG91dHB1dCBmaWxlIGRvZXMgbm90IGhhdmUgYQotQGNvZGV7LmV4ZX0gb3IgQGNvZGV7LmRsbH0gc3VmZml4LCB0aGlzIG9wdGlvbiBmb3JjZXMgdGhlIGxpbmtlciB0byBjb3B5Ci10aGUgb3V0cHV0IGZpbGUgdG8gb25lIG9mIHRoZSBzYW1lIG5hbWUgd2l0aCBhIEBjb2Rley5leGV9IHN1ZmZpeC4gVGhpcwotb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIHVubW9kaWZpZWQgVW5peCBtYWtlZmlsZXMgb24gYSBNaWNyb3NvZnQKLVdpbmRvd3MgaG9zdCwgc2luY2Ugc29tZSB2ZXJzaW9ucyBvZiBXaW5kb3dzIHdvbid0IHJ1biBhbiBpbWFnZSB1bmxlc3MKLWl0IGVuZHMgaW4gYSBAY29kZXsuZXhlfSBzdWZmaXguCi0KLUBraW5kZXggLS1nYy1zZWN0aW9ucwotQGtpbmRleCAtLW5vLWdjLXNlY3Rpb25zCi1AY2luZGV4IGdhcmJhZ2UgY29sbGVjdGlvbgotQGl0ZW0gLS1uby1nYy1zZWN0aW9ucwotQGl0ZW14IC0tZ2Mtc2VjdGlvbnMKLUVuYWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgdW51c2VkIGlucHV0IHNlY3Rpb25zLiAgSXQgaXMgaWdub3JlZCBvbgotdGFyZ2V0cyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoaXMgb3B0aW9uLiAgVGhpcyBvcHRpb24gaXMgbm90IGNvbXBhdGlibGUKLXdpdGggQHNhbXB7LXJ9LCBub3Igc2hvdWxkIGl0IGJlIHVzZWQgd2l0aCBkeW5hbWljIGxpbmtpbmcuICBUaGUgZGVmYXVsdAotYmVoYXZpb3VyIChvZiBub3QgcGVyZm9ybWluZyB0aGlzIGdhcmJhZ2UgY29sbGVjdGlvbikgY2FuIGJlIHJlc3RvcmVkIGJ5Ci1zcGVjaWZ5aW5nIEBzYW1wey0tbm8tZ2Mtc2VjdGlvbnN9IG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLUBjaW5kZXggaGVscAotQGNpbmRleCB1c2FnZQotQGtpbmRleCAtLWhlbHAKLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotCi1Aa2luZGV4IC1NYXAKLUBpdGVtIC1NYXAgQHZhcnttYXBmaWxlfQotUHJpbnQgYSBsaW5rIG1hcCB0byB0aGUgZmlsZSBAdmFye21hcGZpbGV9LiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKLUBzYW1wey1NfSBvcHRpb24sIGFib3ZlLgotCi1AY2luZGV4IG1lbW9yeSB1c2FnZQotQGtpbmRleCAtLW5vLWtlZXAtbWVtb3J5Ci1AaXRlbSAtLW5vLWtlZXAtbWVtb3J5Ci1AY29kZXtsZH0gbm9ybWFsbHkgb3B0aW1pemVzIGZvciBzcGVlZCBvdmVyIG1lbW9yeSB1c2FnZSBieSBjYWNoaW5nIHRoZQotc3ltYm9sIHRhYmxlcyBvZiBpbnB1dCBmaWxlcyBpbiBtZW1vcnkuICBUaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtsZH0gdG8KLWluc3RlYWQgb3B0aW1pemUgZm9yIG1lbW9yeSB1c2FnZSwgYnkgcmVyZWFkaW5nIHRoZSBzeW1ib2wgdGFibGVzIGFzCi1uZWNlc3NhcnkuICBUaGlzIG1heSBiZSByZXF1aXJlZCBpZiBAY29kZXtsZH0gcnVucyBvdXQgb2YgbWVtb3J5IHNwYWNlCi13aGlsZSBsaW5raW5nIGEgbGFyZ2UgZXhlY3V0YWJsZS4KLQotQGtpbmRleCAtLW5vLXVuZGVmaW5lZAotQGl0ZW0gLS1uby11bmRlZmluZWQKLU5vcm1hbGx5IHdoZW4gY3JlYXRpbmcgYSBub24tc3ltYm9saWMgc2hhcmVkIGxpYnJhcnksIHVuZGVmaW5lZCBzeW1ib2xzCi1hcmUgYWxsb3dlZCBhbmQgbGVmdCB0byBiZSByZXNvbHZlZCBieSB0aGUgcnVudGltZSBsb2FkZXIuICBUaGlzIG9wdGlvbgotZGlzYWxsb3dzIHN1Y2ggdW5kZWZpbmVkIHN5bWJvbHMuCi0KLUBraW5kZXggLS1uby13YXJuLW1pc21hdGNoCi1AaXRlbSAtLW5vLXdhcm4tbWlzbWF0Y2gKLU5vcm1hbGx5IEBjb2Rle2xkfSB3aWxsIGdpdmUgYW4gZXJyb3IgaWYgeW91IHRyeSB0byBsaW5rIHRvZ2V0aGVyIGlucHV0Ci1maWxlcyB0aGF0IGFyZSBtaXNtYXRjaGVkIGZvciBzb21lIHJlYXNvbiwgcGVyaGFwcyBiZWNhdXNlIHRoZXkgaGF2ZQotYmVlbiBjb21waWxlZCBmb3IgZGlmZmVyZW50IHByb2Nlc3NvcnMgb3IgZm9yIGRpZmZlcmVudCBlbmRpYW5uZXNzZXMuCi1UaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtsZH0gdGhhdCBpdCBzaG91bGQgc2lsZW50bHkgcGVybWl0IHN1Y2ggcG9zc2libGUKLWVycm9ycy4gIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBjYXJlLCBpbiBjYXNlcyB3aGVuIHlvdQotaGF2ZSB0YWtlbiBzb21lIHNwZWNpYWwgYWN0aW9uIHRoYXQgZW5zdXJlcyB0aGF0IHRoZSBsaW5rZXIgZXJyb3JzIGFyZQotaW5hcHByb3ByaWF0ZS4KLQotQGtpbmRleCAtLW5vLXdob2xlLWFyY2hpdmUKLUBpdGVtIC0tbm8td2hvbGUtYXJjaGl2ZQotVHVybiBvZmYgdGhlIGVmZmVjdCBvZiB0aGUgQGNvZGV7LS13aG9sZS1hcmNoaXZlfSBvcHRpb24gZm9yIHN1YnNlcXVlbnQKLWFyY2hpdmUgZmlsZXMuCi0KLUBjaW5kZXggb3V0cHV0IGZpbGUgYWZ0ZXIgZXJyb3JzCi1Aa2luZGV4IC0tbm9pbmhpYml0LWV4ZWMKLUBpdGVtIC0tbm9pbmhpYml0LWV4ZWMKLVJldGFpbiB0aGUgZXhlY3V0YWJsZSBvdXRwdXQgZmlsZSB3aGVuZXZlciBpdCBpcyBzdGlsbCB1c2FibGUuCi1Ob3JtYWxseSwgdGhlIGxpbmtlciB3aWxsIG5vdCBwcm9kdWNlIGFuIG91dHB1dCBmaWxlIGlmIGl0IGVuY291bnRlcnMKLWVycm9ycyBkdXJpbmcgdGhlIGxpbmsgcHJvY2VzczsgaXQgZXhpdHMgd2l0aG91dCB3cml0aW5nIGFuIG91dHB1dCBmaWxlCi13aGVuIGl0IGlzc3VlcyBhbnkgZXJyb3Igd2hhdHNvZXZlci4KLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1Aa2luZGV4IC0tb2Zvcm1hdAotQGl0ZW0gLS1vZm9ybWF0IEB2YXJ7b3V0cHV0LWZvcm1hdH0KLUBjb2Rle2xkfSBtYXkgYmUgY29uZmlndXJlZCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUga2luZCBvZiBvYmplY3QKLWZpbGUuICBJZiB5b3VyIEBjb2Rle2xkfSBpcyBjb25maWd1cmVkIHRoaXMgd2F5LCB5b3UgY2FuIHVzZSB0aGUKLUBzYW1wey0tb2Zvcm1hdH0gb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGJpbmFyeSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQKLW9iamVjdCBmaWxlLiAgRXZlbiB3aGVuIEBjb2Rle2xkfSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQgYWx0ZXJuYXRpdmUKLW9iamVjdCBmb3JtYXRzLCB5b3UgZG9uJ3QgdXN1YWxseSBuZWVkIHRvIHNwZWNpZnkgdGhpcywgYXMgQGNvZGV7bGR9Ci1zaG91bGQgYmUgY29uZmlndXJlZCB0byBwcm9kdWNlIGFzIGEgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IHRoZSBtb3N0Ci11c3VhbCBmb3JtYXQgb24gZWFjaCBtYWNoaW5lLiAgQHZhcntvdXRwdXQtZm9ybWF0fSBpcyBhIHRleHQgc3RyaW5nLCB0aGUKLW5hbWUgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIEJGRCBsaWJyYXJpZXMuICAoWW91IGNhbgotbGlzdCB0aGUgYXZhaWxhYmxlIGJpbmFyeSBmb3JtYXRzIHdpdGggQHNhbXB7b2JqZHVtcCAtaX0uKSAgVGhlIHNjcmlwdAotY29tbWFuZCBAY29kZXtPVVRQVVRfRk9STUFUfSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0LCBidXQKLXRoaXMgb3B0aW9uIG92ZXJyaWRlcyBpdC4gIEB4cmVme0JGRH0uCi1AZW5kIGlmY2xlYXIKLQotQGtpbmRleCAtcW1hZ2ljCi1AaXRlbSAtcW1hZ2ljCi1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBMaW51eCBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC1ReQotQGl0ZW0gLVF5Ci1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBTVlI0IGNvbXBhdGliaWxpdHkuCi0KLUBraW5kZXggLS1yZWxheAotQGNpbmRleCBzeW50aGVzaXppbmcgbGlua2VyCi1AY2luZGV4IHJlbGF4aW5nIGFkZHJlc3NpbmcgbW9kZXMKLUBpdGVtIC0tcmVsYXgKLUFuIG9wdGlvbiB3aXRoIG1hY2hpbmUgZGVwZW5kZW50IGVmZmVjdHMuICAKLUBpZnNldCBHRU5FUklDCi1UaGlzIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBvbiBhIGZldyB0YXJnZXRzLgotQGVuZCBpZnNldAotQGlmc2V0IEg4MzAwCi1AeHJlZntIOC8zMDAsLEBjb2Rle2xkfSBhbmQgdGhlIEg4LzMwMH0uCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotQHhyZWZ7aTk2MCwsIEBjb2Rle2xkfSBhbmQgdGhlIEludGVsIDk2MCBmYW1pbHl9LgotQGVuZCBpZnNldAotCi0KLU9uIHNvbWUgcGxhdGZvcm1zLCB0aGUgQHNhbXB7LS1yZWxheH0gb3B0aW9uIHBlcmZvcm1zIGdsb2JhbAotb3B0aW1pemF0aW9ucyB0aGF0IGJlY29tZSBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVzb2x2ZXMgYWRkcmVzc2luZwotaW4gdGhlIHByb2dyYW0sIHN1Y2ggYXMgcmVsYXhpbmcgYWRkcmVzcyBtb2RlcyBhbmQgc3ludGhlc2l6aW5nIG5ldwotaW5zdHJ1Y3Rpb25zIGluIHRoZSBvdXRwdXQgb2JqZWN0IGZpbGUuCi0KLU9uIHNvbWUgcGxhdGZvcm1zIHRoZXNlIGxpbmsgdGltZSBnbG9iYWwgb3B0aW1pemF0aW9ucyBtYXkgbWFrZSBzeW1ib2xpYwotZGVidWdnaW5nIG9mIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSBpbXBvc3NpYmxlLgotQGlmc2V0IEdFTkVSSUMKLVRoaXMgaXMga25vd24gdG8gYmUKLXRoZSBjYXNlIGZvciB0aGUgTWF0c3VzaGl0YSBNTjEwMjAwIGFuZCBNTjEwMzAwIGZhbWlseSBvZiBwcm9jZXNzb3JzLgotQGVuZCBpZnNldAotCi1AaWZzZXQgR0VORVJJQwotT24gcGxhdGZvcm1zIHdoZXJlIHRoaXMgaXMgbm90IHN1cHBvcnRlZCwgQHNhbXB7LS1yZWxheH0gaXMgYWNjZXB0ZWQsCi1idXQgaWdub3JlZC4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCByZXRhaW5pbmcgc3BlY2lmaWVkIHN5bWJvbHMKLUBjaW5kZXggc3RyaXBwaW5nIGFsbCBidXQgc29tZSBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIHJldGFpbmluZyBzZWxlY3RpdmVseQotQGl0ZW0gLS1yZXRhaW4tc3ltYm9scy1maWxlIEB2YXJ7ZmlsZW5hbWV9Ci1SZXRhaW4gQGVtcGh7b25seX0gdGhlIHN5bWJvbHMgbGlzdGVkIGluIHRoZSBmaWxlIEB2YXJ7ZmlsZW5hbWV9LAotZGlzY2FyZGluZyBhbGwgb3RoZXJzLiAgQHZhcntmaWxlbmFtZX0gaXMgc2ltcGx5IGEgZmxhdCBmaWxlLCB3aXRoIG9uZQotc3ltYm9sIG5hbWUgcGVyIGxpbmUuICBUaGlzIG9wdGlvbiBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpbiBlbnZpcm9ubWVudHMKLUBpZnNldCBHRU5FUklDCi0oc3VjaCBhcyBWeFdvcmtzKQotQGVuZCBpZnNldAotd2hlcmUgYSBsYXJnZSBnbG9iYWwgc3ltYm9sIHRhYmxlIGlzIGFjY3VtdWxhdGVkIGdyYWR1YWxseSwgdG8gY29uc2VydmUKLXJ1bi10aW1lIG1lbW9yeS4KLQotQHNhbXB7LS1yZXRhaW4tc3ltYm9scy1maWxlfSBkb2VzIEBlbXBoe25vdH0gZGlzY2FyZCB1bmRlZmluZWQgc3ltYm9scywKLW9yIHN5bWJvbHMgbmVlZGVkIGZvciByZWxvY2F0aW9ucy4KLQotWW91IG1heSBvbmx5IHNwZWNpZnkgQHNhbXB7LS1yZXRhaW4tc3ltYm9scy1maWxlfSBvbmNlIGluIHRoZSBjb21tYW5kCi1saW5lLiAgSXQgb3ZlcnJpZGVzIEBzYW1wey1zfSBhbmQgQHNhbXB7LVN9LgotCi1AaWZzZXQgR0VORVJJQwotQGl0ZW0gLXJwYXRoIEB2YXJ7ZGlyfQotQGNpbmRleCBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGgKLUBraW5kZXggLXJwYXRoCi1BZGQgYSBkaXJlY3RvcnkgdG8gdGhlIHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aC4gIFRoaXMgaXMgdXNlZCB3aGVuCi1saW5raW5nIGFuIEVMRiBleGVjdXRhYmxlIHdpdGggc2hhcmVkIG9iamVjdHMuICBBbGwgQGNvZGV7LXJwYXRofQotYXJndW1lbnRzIGFyZSBjb25jYXRlbmF0ZWQgYW5kIHBhc3NlZCB0byB0aGUgcnVudGltZSBsaW5rZXIsIHdoaWNoIHVzZXMKLXRoZW0gdG8gbG9jYXRlIHNoYXJlZCBvYmplY3RzIGF0IHJ1bnRpbWUuICBUaGUgQGNvZGV7LXJwYXRofSBvcHRpb24gaXMKLWFsc28gdXNlZCB3aGVuIGxvY2F0aW5nIHNoYXJlZCBvYmplY3RzIHdoaWNoIGFyZSBuZWVkZWQgYnkgc2hhcmVkCi1vYmplY3RzIGV4cGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIGxpbms7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCi1AY29kZXstcnBhdGgtbGlua30gb3B0aW9uLiAgSWYgQGNvZGV7LXJwYXRofSBpcyBub3QgdXNlZCB3aGVuIGxpbmtpbmcgYW4KLUVMRiBleGVjdXRhYmxlLCB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi1AY29kZXtMRF9SVU5fUEFUSH0gd2lsbCBiZSB1c2VkIGlmIGl0IGlzIGRlZmluZWQuCi0KLVRoZSBAY29kZXstcnBhdGh9IG9wdGlvbiBtYXkgYWxzbyBiZSB1c2VkIG9uIFN1bk9TLiAgQnkgZGVmYXVsdCwgb24KLVN1bk9TLCB0aGUgbGlua2VyIHdpbGwgZm9ybSBhIHJ1bnRpbWUgc2VhcmNoIHBhdGNoIG91dCBvZiBhbGwgdGhlCi1AY29kZXstTH0gb3B0aW9ucyBpdCBpcyBnaXZlbi4gIElmIGEgQGNvZGV7LXJwYXRofSBvcHRpb24gaXMgdXNlZCwgdGhlCi1ydW50aW1lIHNlYXJjaCBwYXRoIHdpbGwgYmUgZm9ybWVkIGV4Y2x1c2l2ZWx5IHVzaW5nIHRoZSBAY29kZXstcnBhdGh9Ci1vcHRpb25zLCBpZ25vcmluZyB0aGUgQGNvZGV7LUx9IG9wdGlvbnMuICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB1c2luZwotZ2NjLCB3aGljaCBhZGRzIG1hbnkgQGNvZGV7LUx9IG9wdGlvbnMgd2hpY2ggbWF5IGJlIG9uIE5GUyBtb3VudGVkCi1maWxlc3lzdGVtcy4KLQotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBFTEYgbGlua2VycywgaWYgdGhlIEBjb2Rley1SfSBvcHRpb24gaXMKLWZvbGxvd2VkIGJ5IGEgZGlyZWN0b3J5IG5hbWUsIHJhdGhlciB0aGFuIGEgZmlsZSBuYW1lLCBpdCBpcyB0cmVhdGVkIGFzCi10aGUgQGNvZGV7LXJwYXRofSBvcHRpb24uCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBHRU5FUklDCi1AY2luZGV4IGxpbmstdGltZSBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGgKLUBraW5kZXggLXJwYXRoLWxpbmsKLUBpdGVtIC1ycGF0aC1saW5rIEB2YXJ7RElSfQotV2hlbiB1c2luZyBFTEYgb3IgU3VuT1MsIG9uZSBzaGFyZWQgbGlicmFyeSBtYXkgcmVxdWlyZSBhbm90aGVyLiAgVGhpcwotaGFwcGVucyB3aGVuIGFuIEBjb2Rle2xkIC1zaGFyZWR9IGxpbmsgaW5jbHVkZXMgYSBzaGFyZWQgbGlicmFyeSBhcyBvbmUKLW9mIHRoZSBpbnB1dCBmaWxlcy4KLQotV2hlbiB0aGUgbGlua2VyIGVuY291bnRlcnMgc3VjaCBhIGRlcGVuZGVuY3kgd2hlbiBkb2luZyBhIG5vbi1zaGFyZWQsCi1ub24tcmVsb2NhdGFibGUgbGluaywgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHRyeSB0byBsb2NhdGUgdGhlIHJlcXVpcmVkCi1zaGFyZWQgbGlicmFyeSBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbGluaywgaWYgaXQgaXMgbm90IGluY2x1ZGVkCi1leHBsaWNpdGx5LiAgSW4gc3VjaCBhIGNhc2UsIHRoZSBAY29kZXstcnBhdGgtbGlua30gb3B0aW9uCi1zcGVjaWZpZXMgdGhlIGZpcnN0IHNldCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2guICBUaGUKLUBjb2Rley1ycGF0aC1saW5rfSBvcHRpb24gbWF5IHNwZWNpZnkgYSBzZXF1ZW5jZSBvZiBkaXJlY3RvcnkgbmFtZXMKLWVpdGhlciBieSBzcGVjaWZ5aW5nIGEgbGlzdCBvZiBuYW1lcyBzZXBhcmF0ZWQgYnkgY29sb25zLCBvciBieQotYXBwZWFyaW5nIG11bHRpcGxlIHRpbWVzLgotCi1UaGUgbGlua2VyIHVzZXMgdGhlIGZvbGxvd2luZyBzZWFyY2ggcGF0aHMgdG8gbG9jYXRlIHJlcXVpcmVkIHNoYXJlZAotbGlicmFyaWVzLgotQGVudW1lcmF0ZQotQGl0ZW0KLUFueSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgQGNvZGV7LXJwYXRoLWxpbmt9IG9wdGlvbnMuCi1AaXRlbQotQW55IGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSBAY29kZXstcnBhdGh9IG9wdGlvbnMuICBUaGUgZGlmZmVyZW5jZQotYmV0d2VlbiBAY29kZXstcnBhdGh9IGFuZCBAY29kZXstcnBhdGgtbGlua30gaXMgdGhhdCBkaXJlY3Rvcmllcwotc3BlY2lmaWVkIGJ5IEBjb2Rley1ycGF0aH0gb3B0aW9ucyBhcmUgaW5jbHVkZWQgaW4gdGhlIGV4ZWN1dGFibGUgYW5kCi11c2VkIGF0IHJ1bnRpbWUsIHdoZXJlYXMgdGhlIEBjb2Rley1ycGF0aC1saW5rfSBvcHRpb24gaXMgb25seSBlZmZlY3RpdmUKLWF0IGxpbmsgdGltZS4KLUBpdGVtCi1PbiBhbiBFTEYgc3lzdGVtLCBpZiB0aGUgQGNvZGV7LXJwYXRofSBhbmQgQGNvZGV7cnBhdGgtbGlua30gb3B0aW9ucwotd2VyZSBub3QgdXNlZCwgc2VhcmNoIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLUBjb2Rle0xEX1JVTl9QQVRIfS4KLUBpdGVtCi1PbiBTdW5PUywgaWYgdGhlIEBjb2Rley1ycGF0aH0gb3B0aW9uIHdhcyBub3QgdXNlZCwgc2VhcmNoIGFueQotZGlyZWN0b3JpZXMgc3BlY2lmaWVkIHVzaW5nIEBjb2Rley1MfSBvcHRpb25zLgotQGl0ZW0KLUZvciBhIG5hdGl2ZSBsaW5rZXIsIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLUBjb2Rle0xEX0xJQlJBUllfUEFUSH0uCi1AaXRlbQotVGhlIGRlZmF1bHQgZGlyZWN0b3JpZXMsIG5vcm1hbGx5IEBmaWxley9saWJ9IGFuZCBAZmlsZXsvdXNyL2xpYn0uCi1AaXRlbQotRm9yIGEgbmF0aXZlIGxpbmtlciBvbiBhbiBFTEYgc3lzdGVtLCBpZiB0aGUgZmlsZSBAZmlsZXsvZXRjL2xkLnNvLmNvbmZ9Ci1leGlzdHMsIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGZvdW5kIGluIHRoYXQgZmlsZS4KLUBlbmQgZW51bWVyYXRlCi0KLUlmIHRoZSByZXF1aXJlZCBzaGFyZWQgbGlicmFyeSBpcyBub3QgZm91bmQsIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhCi13YXJuaW5nIGFuZCBjb250aW51ZSB3aXRoIHRoZSBsaW5rLgotQGVuZCBpZnNldAotCi1Aa2luZGV4IC1zaGFyZWQKLUBraW5kZXggLUJzaGFyZWFibGUKLUBpdGVtIC1zaGFyZWQKLUBpdGVteCAtQnNoYXJlYWJsZQotQGNpbmRleCBzaGFyZWQgbGlicmFyaWVzCi1DcmVhdGUgYSBzaGFyZWQgbGlicmFyeS4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIG9uIEVMRiwgWENPRkYKLWFuZCBTdW5PUyBwbGF0Zm9ybXMuICBPbiBTdW5PUywgdGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEKLXNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBAY29kZXstZX0gb3B0aW9uIGlzIG5vdCB1c2VkIGFuZCB0aGVyZSBhcmUKLXVuZGVmaW5lZCBzeW1ib2xzIGluIHRoZSBsaW5rLgotCi1AaXRlbSAtLXNvcnQtY29tbW9uCi1Aa2luZGV4IC0tc29ydC1jb21tb24KLVRoaXMgb3B0aW9uIHRlbGxzIEBjb2Rle2xkfSB0byBzb3J0IHRoZSBjb21tb24gc3ltYm9scyBieSBzaXplIHdoZW4gaXQKLXBsYWNlcyB0aGVtIGluIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgc2VjdGlvbnMuICBGaXJzdCBjb21lIGFsbCB0aGUgb25lCi1ieXRlIHN5bWJvbHMsIHRoZW4gYWxsIHRoZSB0d28gYnl0ZXMsIHRoZW4gYWxsIHRoZSBmb3VyIGJ5dGVzLCBhbmQgdGhlbgotZXZlcnl0aGluZyBlbHNlLiAgVGhpcyBpcyB0byBwcmV2ZW50IGdhcHMgYmV0d2VlbiBzeW1ib2xzIGR1ZSB0bwotYWxpZ25tZW50IGNvbnN0cmFpbnRzLgotCi1Aa2luZGV4IC0tc3BsaXQtYnktZmlsZQotQGl0ZW0gLS1zcGxpdC1ieS1maWxlCi1TaW1pbGFyIHRvIEBjb2Rley0tc3BsaXQtYnktcmVsb2N9IGJ1dCBjcmVhdGVzIGEgbmV3IG91dHB1dCBzZWN0aW9uIGZvcgotZWFjaCBpbnB1dCBmaWxlLgotCi1Aa2luZGV4IC0tc3BsaXQtYnktcmVsb2MKLUBpdGVtIC0tc3BsaXQtYnktcmVsb2MgQHZhcntjb3VudH0KLVRyeXMgdG8gY3JlYXRlcyBleHRyYSBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IGZpbGUgc28gdGhhdCBubyBzaW5nbGUKLW91dHB1dCBzZWN0aW9uIGluIHRoZSBmaWxlIGNvbnRhaW5zIG1vcmUgdGhhbiBAdmFye2NvdW50fSByZWxvY2F0aW9ucy4KLVRoaXMgaXMgdXNlZnVsIHdoZW4gZ2VuZXJhdGluZyBodWdlIHJlbG9jYXRhYmxlIGZvciBkb3dubG9hZGluZyBpbnRvCi1jZXJ0YWluIHJlYWwgdGltZSBrZXJuZWxzIHdpdGggdGhlIENPRkYgb2JqZWN0IGZpbGUgZm9ybWF0OyBzaW5jZSBDT0ZGCi1jYW5ub3QgcmVwcmVzZW50IG1vcmUgdGhhbiA2NTUzNSByZWxvY2F0aW9ucyBpbiBhIHNpbmdsZSBzZWN0aW9uLiAgTm90ZQotdGhhdCB0aGlzIHdpbGwgZmFpbCB0byB3b3JrIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cyB3aGljaCBkbyBub3QKLXN1cHBvcnQgYXJiaXRyYXJ5IHNlY3Rpb25zLiAgVGhlIGxpbmtlciB3aWxsIG5vdCBzcGxpdCB1cCBpbmRpdmlkdWFsCi1pbnB1dCBzZWN0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24sIHNvIGlmIGEgc2luZ2xlIGlucHV0IHNlY3Rpb24gY29udGFpbnMKLW1vcmUgdGhhbiBAdmFye2NvdW50fSByZWxvY2F0aW9ucyBvbmUgb3V0cHV0IHNlY3Rpb24gd2lsbCBjb250YWluIHRoYXQKLW1hbnkgcmVsb2NhdGlvbnMuCi0KLUBraW5kZXggLS1zdGF0cwotQGl0ZW0gLS1zdGF0cwotQ29tcHV0ZSBhbmQgZGlzcGxheSBzdGF0aXN0aWNzIGFib3V0IHRoZSBvcGVyYXRpb24gb2YgdGhlIGxpbmtlciwgc3VjaAotYXMgZXhlY3V0aW9uIHRpbWUgYW5kIG1lbW9yeSB1c2FnZS4KLQotQGtpbmRleCAtLXRyYWRpdGlvbmFsLWZvcm1hdAotQGNpbmRleCB0cmFkaXRpb25hbCBmb3JtYXQKLUBpdGVtIC0tdHJhZGl0aW9uYWwtZm9ybWF0Ci1Gb3Igc29tZSB0YXJnZXRzLCB0aGUgb3V0cHV0IG9mIEBjb2Rle2xkfSBpcyBkaWZmZXJlbnQgaW4gc29tZSB3YXlzIGZyb20KLXRoZSBvdXRwdXQgb2Ygc29tZSBleGlzdGluZyBsaW5rZXIuICBUaGlzIHN3aXRjaCByZXF1ZXN0cyBAY29kZXtsZH0gdG8KLXVzZSB0aGUgdHJhZGl0aW9uYWwgZm9ybWF0IGluc3RlYWQuCi0KLUBjaW5kZXggZGJ4Ci1Gb3IgZXhhbXBsZSwgb24gU3VuT1MsIEBjb2Rle2xkfSBjb21iaW5lcyBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUKLXN5bWJvbCBzdHJpbmcgdGFibGUuICBUaGlzIGNhbiByZWR1Y2UgdGhlIHNpemUgb2YgYW4gb3V0cHV0IGZpbGUgd2l0aAotZnVsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYnkgb3ZlciAzMCBwZXJjZW50LiAgVW5mb3J0dW5hdGVseSwgdGhlIFN1bk9TCi1AY29kZXtkYnh9IHByb2dyYW0gY2FuIG5vdCByZWFkIHRoZSByZXN1bHRpbmcgcHJvZ3JhbSAoQGNvZGV7Z2RifSBoYXMgbm8KLXRyb3VibGUpLiAgVGhlIEBzYW1wey0tdHJhZGl0aW9uYWwtZm9ybWF0fSBzd2l0Y2ggdGVsbHMgQGNvZGV7bGR9IHRvIG5vdAotY29tYmluZSBkdXBsaWNhdGUgZW50cmllcy4KLQotQGtpbmRleCAtVGJzcyBAdmFye29yZ30KLUBraW5kZXggLVRkYXRhIEB2YXJ7b3JnfQotQGtpbmRleCAtVHRleHQgQHZhcntvcmd9Ci1AY2luZGV4IHNlZ21lbnQgb3JpZ2lucywgY21kIGxpbmUKLUBpdGVtIC1UYnNzIEB2YXJ7b3JnfQotQGl0ZW14IC1UZGF0YSBAdmFye29yZ30KLUBpdGVteCAtVHRleHQgQHZhcntvcmd9Ci1Vc2UgQHZhcntvcmd9IGFzIHRoZSBzdGFydGluZyBhZGRyZXNzIGZvci0tLXJlc3BlY3RpdmVseS0tLXRoZQotQGNvZGV7YnNzfSwgQGNvZGV7ZGF0YX0sIG9yIHRoZSBAY29kZXt0ZXh0fSBzZWdtZW50IG9mIHRoZSBvdXRwdXQgZmlsZS4KLUB2YXJ7b3JnfSBtdXN0IGJlIGEgc2luZ2xlIGhleGFkZWNpbWFsIGludGVnZXI7Ci1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGxpbmtlcnMsIHlvdSBtYXkgb21pdCB0aGUgbGVhZGluZwotQHNhbXB7MHh9IHVzdWFsbHkgYXNzb2NpYXRlZCB3aXRoIGhleGFkZWNpbWFsIHZhbHVlcy4KLQotQGtpbmRleCAtLXZlcmJvc2UKLUBjaW5kZXggdmVyYm9zZQotQGl0ZW0gLS1kbGwtdmVyYm9zZQotQGl0ZW14IC0tdmVyYm9zZQotRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIEBjb2Rle2xkfSBhbmQgbGlzdCB0aGUgbGlua2VyIGVtdWxhdGlvbnMKLXN1cHBvcnRlZC4gIERpc3BsYXkgd2hpY2ggaW5wdXQgZmlsZXMgY2FuIGFuZCBjYW5ub3QgYmUgb3BlbmVkLiAgRGlzcGxheQotdGhlIGxpbmtlciBzY3JpcHQgaWYgdXNpbmcgYSBkZWZhdWx0IGJ1aWx0aW4gc2NyaXB0LgotCi1Aa2luZGV4IC0tdmVyc2lvbi1zY3JpcHQ9QHZhcnt2ZXJzaW9uLXNjcmlwdGZpbGV9Ci1AY2luZGV4IHZlcnNpb24gc2NyaXB0LCBzeW1ib2wgdmVyc2lvbnMKLUBpdGVteCAtLXZlcnNpb24tc2NyaXB0PUB2YXJ7dmVyc2lvbi1zY3JpcHRmaWxlfQotU3BlY2lmeSB0aGUgbmFtZSBvZiBhIHZlcnNpb24gc2NyaXB0IHRvIHRoZSBsaW5rZXIuICBUaGlzIGlzIHR5cGljYWxseQotdXNlZCB3aGVuIGNyZWF0aW5nIHNoYXJlZCBsaWJyYXJpZXMgdG8gc3BlY2lmeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgdmVyc2lvbiBoZWlyYXJjaHkgZm9yIHRoZSBsaWJyYXJ5IGJlaW5nIGNyZWF0ZWQuICBUaGlzIG9wdGlvbgotaXMgb25seSBtZWFuaW5nZnVsIG9uIEVMRiBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotQHhyZWZ7VkVSU0lPTn0uCi0KLUBraW5kZXggLS13YXJuLWNvbW9uCi1AY2luZGV4IHdhcm5pbmdzLCBvbiBjb21iaW5pbmcgc3ltYm9scwotQGNpbmRleCBjb21iaW5pbmcgc3ltYm9scywgd2FybmluZ3Mgb24KLUBpdGVtIC0td2Fybi1jb21tb24KLVdhcm4gd2hlbiBhIGNvbW1vbiBzeW1ib2wgaXMgY29tYmluZWQgd2l0aCBhbm90aGVyIGNvbW1vbiBzeW1ib2wgb3Igd2l0aAotYSBzeW1ib2wgZGVmaW5pdGlvbi4gIFVuaXggbGlua2VycyBhbGxvdyB0aGlzIHNvbWV3aGF0IHNsb3BweSBwcmFjdGljZSwKLWJ1dCBsaW5rZXJzIG9uIHNvbWUgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMgZG8gbm90LiAgVGhpcyBvcHRpb24gYWxsb3dzCi15b3UgdG8gZmluZCBwb3RlbnRpYWwgcHJvYmxlbXMgZnJvbSBjb21iaW5pbmcgZ2xvYmFsIHN5bWJvbHMuCi1VbmZvcnR1bmF0ZWx5LCBzb21lIEMgbGlicmFyaWVzIHVzZSB0aGlzIHByYWN0aWNlLCBzbyB5b3UgbWF5IGdldCBzb21lCi13YXJuaW5ncyBhYm91dCBzeW1ib2xzIGluIHRoZSBsaWJyYXJpZXMgYXMgd2VsbCBhcyBpbiB5b3VyIHByb2dyYW1zLgotCi1UaGVyZSBhcmUgdGhyZWUga2luZHMgb2YgZ2xvYmFsIHN5bWJvbHMsIGlsbHVzdHJhdGVkIGhlcmUgYnkgQyBleGFtcGxlczoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBpbnQgaSA9IDE7Ci1BIGRlZmluaXRpb24sIHdoaWNoIGdvZXMgaW4gdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiBvZiB0aGUgb3V0cHV0Ci1maWxlLgotCi1AaXRlbSBleHRlcm4gaW50IGk7Ci1BbiB1bmRlZmluZWQgcmVmZXJlbmNlLCB3aGljaCBkb2VzIG5vdCBhbGxvY2F0ZSBzcGFjZS4KLVRoZXJlIG11c3QgYmUgZWl0aGVyIGEgZGVmaW5pdGlvbiBvciBhIGNvbW1vbiBzeW1ib2wgZm9yIHRoZQotdmFyaWFibGUgc29tZXdoZXJlLgotCi1AaXRlbSBpbnQgaTsKLUEgY29tbW9uIHN5bWJvbC4gIElmIHRoZXJlIGFyZSBvbmx5IChvbmUgb3IgbW9yZSkgY29tbW9uIHN5bWJvbHMgZm9yIGEKLXZhcmlhYmxlLCBpdCBnb2VzIGluIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBvZiB0aGUgb3V0cHV0IGZpbGUuCi1UaGUgbGlua2VyIG1lcmdlcyBtdWx0aXBsZSBjb21tb24gc3ltYm9scyBmb3IgdGhlIHNhbWUgdmFyaWFibGUgaW50byBhCi1zaW5nbGUgc3ltYm9sLiAgSWYgdGhleSBhcmUgb2YgZGlmZmVyZW50IHNpemVzLCBpdCBwaWNrcyB0aGUgbGFyZ2VzdAotc2l6ZS4gIFRoZSBsaW5rZXIgdHVybnMgYSBjb21tb24gc3ltYm9sIGludG8gYSBkZWNsYXJhdGlvbiwgaWYgdGhlcmUgaXMKLWEgZGVmaW5pdGlvbiBvZiB0aGUgc2FtZSB2YXJpYWJsZS4KLUBlbmQgdGFibGUKLQotVGhlIEBzYW1wey0td2Fybi1jb21tb259IG9wdGlvbiBjYW4gcHJvZHVjZSBmaXZlIGtpbmRzIG9mIHdhcm5pbmdzLgotRWFjaCB3YXJuaW5nIGNvbnNpc3RzIG9mIGEgcGFpciBvZiBsaW5lczogdGhlIGZpcnN0IGRlc2NyaWJlcyB0aGUgc3ltYm9sCi1qdXN0IGVuY291bnRlcmVkLCBhbmQgdGhlIHNlY29uZCBkZXNjcmliZXMgdGhlIHByZXZpb3VzIHN5bWJvbAotZW5jb3VudGVyZWQgd2l0aCB0aGUgc2FtZSBuYW1lLiAgT25lIG9yIGJvdGggb2YgdGhlIHR3byBzeW1ib2xzIHdpbGwgYmUKLWEgY29tbW9uIHN5bWJvbC4KLQotQGVudW1lcmF0ZQotQGl0ZW0KLVR1cm5pbmcgYSBjb21tb24gc3ltYm9sIGludG8gYSByZWZlcmVuY2UsIGJlY2F1c2UgdGhlcmUgaXMgYWxyZWFkeSBhCi1kZWZpbml0aW9uIGZvciB0aGUgc3ltYm9sLgotQHNtYWxsZXhhbXBsZQotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIG9mIGBAdmFye3N5bWJvbH0nCi0gICBvdmVycmlkZGVuIGJ5IGRlZmluaXRpb24KLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGRlZmluZWQgaGVyZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0KLVR1cm5pbmcgYSBjb21tb24gc3ltYm9sIGludG8gYSByZWZlcmVuY2UsIGJlY2F1c2UgYSBsYXRlciBkZWZpbml0aW9uIGZvcgotdGhlIHN5bWJvbCBpcyBlbmNvdW50ZXJlZC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGNhc2UsCi1leGNlcHQgdGhhdCB0aGUgc3ltYm9scyBhcmUgZW5jb3VudGVyZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIuCi1Ac21hbGxleGFtcGxlCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBkZWZpbml0aW9uIG9mIGBAdmFye3N5bWJvbH0nCi0gICBvdmVycmlkaW5nIGNvbW1vbgotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIGlzIGhlcmUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtCi1NZXJnaW5nIGEgY29tbW9uIHN5bWJvbCB3aXRoIGEgcHJldmlvdXMgc2FtZS1zaXplZCBjb21tb24gc3ltYm9sLgotQHNtYWxsZXhhbXBsZQotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogbXVsdGlwbGUgY29tbW9uCi0gICBvZiBgQHZhcntzeW1ib2x9JwotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogcHJldmlvdXMgY29tbW9uIGlzIGhlcmUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtCi1NZXJnaW5nIGEgY29tbW9uIHN5bWJvbCB3aXRoIGEgcHJldmlvdXMgbGFyZ2VyIGNvbW1vbiBzeW1ib2wuCi1Ac21hbGxleGFtcGxlCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBjb21tb24gb2YgYEB2YXJ7c3ltYm9sfScKLSAgIG92ZXJyaWRkZW4gYnkgbGFyZ2VyIGNvbW1vbgotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogbGFyZ2VyIGNvbW1vbiBpcyBoZXJlCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbQotTWVyZ2luZyBhIGNvbW1vbiBzeW1ib2wgd2l0aCBhIHByZXZpb3VzIHNtYWxsZXIgY29tbW9uIHN5bWJvbC4gIFRoaXMgaXMKLXRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBjYXNlLCBleGNlcHQgdGhhdCB0aGUgc3ltYm9scyBhcmUKLWVuY291bnRlcmVkIGluIGEgZGlmZmVyZW50IG9yZGVyLgotQHNtYWxsZXhhbXBsZQotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIG9mIGBAdmFye3N5bWJvbH0nCi0gICBvdmVycmlkaW5nIHNtYWxsZXIgY29tbW9uCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBzbWFsbGVyIGNvbW1vbiBpcyBoZXJlCi1AZW5kIHNtYWxsZXhhbXBsZQotQGVuZCBlbnVtZXJhdGUKLQotQGtpbmRleCAtLXdhcm4tY29uc3RydWN0b3JzCi1AaXRlbSAtLXdhcm4tY29uc3RydWN0b3JzCi1XYXJuIGlmIGFueSBnbG9iYWwgY29uc3RydWN0b3JzIGFyZSB1c2VkLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3IgYSBmZXcKLW9iamVjdCBmaWxlIGZvcm1hdHMuICBGb3IgZm9ybWF0cyBsaWtlIENPRkYgb3IgRUxGLCB0aGUgbGlua2VyIGNhbiBub3QKLWRldGVjdCB0aGUgdXNlIG9mIGdsb2JhbCBjb25zdHJ1Y3RvcnMuCi0KLUBraW5kZXggLS13YXJuLW11bHRpcGxlLWdwCi1AaXRlbSAtLXdhcm4tbXVsdGlwbGUtZ3AKLVdhcm4gaWYgbXVsdGlwbGUgZ2xvYmFsIHBvaW50ZXIgdmFsdWVzIGFyZSByZXF1aXJlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi1UaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgY2VydGFpbiBwcm9jZXNzb3JzLCBzdWNoIGFzIHRoZSBBbHBoYS4KLVNwZWNpZmljYWxseSwgc29tZSBwcm9jZXNzb3JzIHB1dCBsYXJnZS12YWx1ZWQgY29uc3RhbnRzIGluIGEgc3BlY2lhbAotc2VjdGlvbi4gIEEgc3BlY2lhbCByZWdpc3RlciAodGhlIGdsb2JhbCBwb2ludGVyKSBwb2ludHMgaW50byB0aGUgbWlkZGxlCi1vZiB0aGlzIHNlY3Rpb24sIHNvIHRoYXQgY29uc3RhbnRzIGNhbiBiZSBsb2FkZWQgZWZmaWNpZW50bHkgdmlhIGEKLWJhc2UtcmVnaXN0ZXIgcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlLiAgU2luY2UgdGhlIG9mZnNldCBpbgotYmFzZS1yZWdpc3RlciByZWxhdGl2ZSBtb2RlIGlzIGZpeGVkIGFuZCByZWxhdGl2ZWx5IHNtYWxsIChlLmcuLCAxNgotYml0cyksIHRoaXMgbGltaXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNvbnN0YW50IHBvb2wuICBUaHVzLCBpbgotbGFyZ2UgcHJvZ3JhbXMsIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byB1c2UgbXVsdGlwbGUgZ2xvYmFsIHBvaW50ZXIKLXZhbHVlcyBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGFkZHJlc3MgYWxsIHBvc3NpYmxlIGNvbnN0YW50cy4gIFRoaXMKLW9wdGlvbiBjYXVzZXMgYSB3YXJuaW5nIHRvIGJlIGlzc3VlZCB3aGVuZXZlciB0aGlzIGNhc2Ugb2NjdXJzLgotCi1Aa2luZGV4IC0td2Fybi1vbmNlCi1AY2luZGV4IHdhcm5pbmdzLCBvbiB1bmRlZmluZWQgc3ltYm9scwotQGNpbmRleCB1bmRlZmluZWQgc3ltYm9scywgd2FybmluZ3Mgb24KLUBpdGVtIC0td2Fybi1vbmNlCi1Pbmx5IHdhcm4gb25jZSBmb3IgZWFjaCB1bmRlZmluZWQgc3ltYm9sLCByYXRoZXIgdGhhbiBvbmNlIHBlciBtb2R1bGUKLXdoaWNoIHJlZmVycyB0byBpdC4KLQotQGtpbmRleCAtLXdhcm4tc2VjdGlvbi1hbGlnbgotQGNpbmRleCB3YXJuaW5ncywgb24gc2VjdGlvbiBhbGlnbm1lbnQKLUBjaW5kZXggc2VjdGlvbiBhbGlnbm1lbnQsIHdhcm5pbmdzIG9uCi1AaXRlbSAtLXdhcm4tc2VjdGlvbi1hbGlnbgotV2FybiBpZiB0aGUgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbiBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YKLWFsaWdubWVudC4gIFR5cGljYWxseSwgdGhlIGFsaWdubWVudCB3aWxsIGJlIHNldCBieSBhbiBpbnB1dCBzZWN0aW9uLgotVGhlIGFkZHJlc3Mgd2lsbCBvbmx5IGJlIGNoYW5nZWQgaWYgaXQgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkOyB0aGF0Ci1pcywgaWYgdGhlIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGRvZXMgbm90IHNwZWNpZnkgYSBzdGFydCBhZGRyZXNzIGZvcgotdGhlIHNlY3Rpb24gKEBweHJlZntTRUNUSU9OU30pLgotCi1Aa2luZGV4IC0td2hvbGUtYXJjaGl2ZQotQGNpbmRleCBpbmNsdWRpbmcgYW4gZW50aXJlIGFyY2hpdmUKLUBpdGVtIC0td2hvbGUtYXJjaGl2ZQotRm9yIGVhY2ggYXJjaGl2ZSBtZW50aW9uZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhZnRlciB0aGUKLUBjb2Rley0td2hvbGUtYXJjaGl2ZX0gb3B0aW9uLCBpbmNsdWRlIGV2ZXJ5IG9iamVjdCBmaWxlIGluIHRoZSBhcmNoaXZlCi1pbiB0aGUgbGluaywgcmF0aGVyIHRoYW4gc2VhcmNoaW5nIHRoZSBhcmNoaXZlIGZvciB0aGUgcmVxdWlyZWQgb2JqZWN0Ci1maWxlcy4gIFRoaXMgaXMgbm9ybWFsbHkgdXNlZCB0byB0dXJuIGFuIGFyY2hpdmUgZmlsZSBpbnRvIGEgc2hhcmVkCi1saWJyYXJ5LCBmb3JjaW5nIGV2ZXJ5IG9iamVjdCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIHNoYXJlZAotbGlicmFyeS4gIFRoaXMgb3B0aW9uIG1heSBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlLgotCi1Aa2luZGV4IC0td3JhcAotQGl0ZW0gLS13cmFwIEB2YXJ7c3ltYm9sfQotVXNlIGEgd3JhcHBlciBmdW5jdGlvbiBmb3IgQHZhcntzeW1ib2x9LiAgQW55IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8KLUB2YXJ7c3ltYm9sfSB3aWxsIGJlIHJlc29sdmVkIHRvIEBjb2Rle19fd3JhcF9AdmFye3N5bWJvbH19LiAgQW55Ci11bmRlZmluZWQgcmVmZXJlbmNlIHRvIEBjb2Rle19fcmVhbF9AdmFye3N5bWJvbH19IHdpbGwgYmUgcmVzb2x2ZWQgdG8KLUB2YXJ7c3ltYm9sfS4KLQotVGhpcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgd3JhcHBlciBmb3IgYSBzeXN0ZW0gZnVuY3Rpb24uICBUaGUKLXdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBAY29kZXtfX3dyYXBfQHZhcntzeW1ib2x9fS4gIElmIGl0Ci13aXNoZXMgdG8gY2FsbCB0aGUgc3lzdGVtIGZ1bmN0aW9uLCBpdCBzaG91bGQgY2FsbAotQGNvZGV7X19yZWFsX0B2YXJ7c3ltYm9sfX0uCi0KLUhlcmUgaXMgYSB0cml2aWFsIGV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLXZvaWQgKgotX193cmFwX21hbGxvYyAoaW50IGMpCi1AewotICBwcmludGYgKCJtYWxsb2MgY2FsbGVkIHdpdGggJWxkXG4iLCBjKTsKLSAgcmV0dXJuIF9fcmVhbF9tYWxsb2MgKGMpOwotQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUlmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGlzIGZpbGUgdXNpbmcgQGNvZGV7LS13cmFwIG1hbGxvY30sIHRoZW4KLWFsbCBjYWxscyB0byBAY29kZXttYWxsb2N9IHdpbGwgY2FsbCB0aGUgZnVuY3Rpb24gQGNvZGV7X193cmFwX21hbGxvY30KLWluc3RlYWQuICBUaGUgY2FsbCB0byBAY29kZXtfX3JlYWxfbWFsbG9jfSBpbiBAY29kZXtfX3dyYXBfbWFsbG9jfSB3aWxsCi1jYWxsIHRoZSByZWFsIEBjb2Rle21hbGxvY30gZnVuY3Rpb24uCi0KLVlvdSBtYXkgd2lzaCB0byBwcm92aWRlIGEgQGNvZGV7X19yZWFsX21hbGxvY30gZnVuY3Rpb24gYXMgd2VsbCwgc28gdGhhdAotbGlua3Mgd2l0aG91dCB0aGUgQGNvZGV7LS13cmFwfSBvcHRpb24gd2lsbCBzdWNjZWVkLiAgSWYgeW91IGRvIHRoaXMsCi15b3Ugc2hvdWxkIG5vdCBwdXQgdGhlIGRlZmluaXRpb24gb2YgQGNvZGV7X19yZWFsX21hbGxvY30gaW4gdGhlIHNhbWUKLWZpbGUgYXMgQGNvZGV7X193cmFwX21hbGxvY307IGlmIHlvdSBkbywgdGhlIGFzc2VtYmxlciBtYXkgcmVzb2x2ZSB0aGUKLWNhbGwgYmVmb3JlIHRoZSBsaW5rZXIgaGFzIGEgY2hhbmNlIHRvIHdyYXAgaXQgdG8gQGNvZGV7bWFsbG9jfS4KLQotQGVuZCB0YWJsZQotCi1Ac3Vic2VjdGlvbiBPcHRpb25zIHNwZWNpZmljIHRvIGkzODYgUEUgdGFyZ2V0cwotCi1UaGUgaTM4NiBQRSBsaW5rZXIgc3VwcG9ydHMgdGhlIEBjb2Rley1zaGFyZWR9IG9wdGlvbiwgd2hpY2ggY2F1c2VzCi10aGUgb3V0cHV0IHRvIGJlIGEgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcnkgKERMTCkgaW5zdGVhZCBvZiBhCi1ub3JtYWwgZXhlY3V0YWJsZS4gIFlvdSBzaG91bGQgbmFtZSB0aGUgb3V0cHV0IEBjb2RleyouZGxsfSB3aGVuIHlvdQotdXNlIHRoaXMgb3B0aW9uLiAgSW4gYWRkaXRpb24sIHRoZSBsaW5rZXIgZnVsbHkgc3VwcG9ydHMgdGhlIHN0YW5kYXJkCi1AY29kZXsqLmRlZn0gZmlsZXMsIHdoaWNoIG1heSBiZSBzcGVjaWZpZWQgb24gdGhlIGxpbmtlciBjb21tYW5kIGxpbmUKLWxpa2UgYW4gb2JqZWN0IGZpbGUgKGluIGZhY3QsIGl0IHNob3VsZCBwcmVjZWRlIGFyY2hpdmVzIGl0IGV4cG9ydHMKLXN5bWJvbHMgZnJvbSwgdG8gZW5zdXJlIHRoYXQgdGhleSBnZXQgbGlua2VkIGluLCBqdXN0IGxpa2UgYSBub3JtYWwKLW9iamVjdCBmaWxlKS4KLQotSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgY29tbW9uIHRvIGFsbCB0YXJnZXRzLCB0aGUgaTM4NiBQRSBsaW5rZXIKLXN1cHBvcnQgYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgaTM4NgotUEUgdGFyZ2V0LiAgT3B0aW9ucyB0aGF0IHRha2UgdmFsdWVzIG1heSBiZSBzZXBhcmF0ZWQgZnJvbSB0aGVpcgotdmFsdWVzIGJ5IGVpdGhlciBhIHNwYWNlIG9yIGFuIGVxdWFscyBzaWduLgotCi1AdGFibGUgQGNvZGUKLQotQGtpbmRleCAtLWFkZC1zdGRjYWxsLWFsaWFzCi1AaXRlbSAtLWFkZC1zdGRjYWxsLWFsaWFzCi1JZiBnaXZlbiwgc3ltYm9scyB3aXRoIGEgc3RkY2FsbCBzdWZmaXggKEBAQHZhcntubn0pIHdpbGwgYmUgZXhwb3J0ZWQKLWFzLWlzIGFuZCBhbHNvIHdpdGggdGhlIHN1ZmZpeCBzdHJpcHBlZC4KLQotQGtpbmRleCAtLWJhc2UtZmlsZQotQGl0ZW0gLS1iYXNlLWZpbGUgQHZhcntmaWxlfQotVXNlIEB2YXJ7ZmlsZX0gYXMgdGhlIG5hbWUgb2YgYSBmaWxlIGluIHdoaWNoIHRvIHNhdmUgdGhlIGJhc2UKLWFkZHJlc3NlcyBvZiBhbGwgdGhlIHJlbG9jYXRpb25zIG5lZWRlZCBmb3IgZ2VuZXJhdGluZyBETExzIHdpdGgKLUBmaWxle2RsbHRvb2x9LgotCi1Aa2luZGV4IC0tZGxsCi1AaXRlbSAtLWRsbAotQ3JlYXRlIGEgRExMIGluc3RlYWQgb2YgYSByZWd1bGFyIGV4ZWN1dGFibGUuICBZb3UgbWF5IGFsc28gdXNlCi1AY29kZXstc2hhcmVkfSBvciBzcGVjaWZ5IGEgQGNvZGV7TElCUkFSWX0gaW4gYSBnaXZlbiBAY29kZXsuZGVmfQotZmlsZS4KLQotQGtpbmRleCAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwCi1Aa2luZGV4IC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwCi1AaXRlbSAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwCi1AaXRlbXggLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAKLUlmIHRoZSBsaW5rIGZpbmRzIGEgc3ltYm9sIHRoYXQgaXQgY2Fubm90IHJlc29sdmUsIGl0IHdpbGwgYXR0ZW1wdCB0bwotZG8gImZ1enp5IGxpbmtpbmciIGJ5IGxvb2tpbmcgZm9yIGFub3RoZXIgZGVmaW5lZCBzeW1ib2wgdGhhdCBkaWZmZXJzCi1vbmx5IGluIHRoZSBmb3JtYXQgb2YgdGhlIHN5bWJvbCBuYW1lIChjZGVjbCB2cyBzdGRjYWxsKSBhbmQgd2lsbAotcmVzb2x2ZSB0aGF0IHN5bWJvbCBieSBsaW5raW5nIHRvIHRoZSBtYXRjaC4gIEZvciBleGFtcGxlLCB0aGUKLXVuZGVmaW5lZCBzeW1ib2wgQGNvZGV7X2Zvb30gbWlnaHQgYmUgbGlua2VkIHRvIHRoZSBmdW5jdGlvbgotQGNvZGV7X2Zvb0BAMTJ9LCBvciB0aGUgdW5kZWZpbmVkIHN5bWJvbCBAY29kZXtfYmFyQEAxNn0gbWlnaHQgYmUgbGlua2VkCi10byB0aGUgZnVuY3Rpb24gQGNvZGV7X2Jhcn0uICBXaGVuIHRoZSBsaW5rZXIgZG9lcyB0aGlzLCBpdCBwcmludHMgYQotd2FybmluZywgc2luY2UgaXQgbm9ybWFsbHkgc2hvdWxkIGhhdmUgZmFpbGVkIHRvIGxpbmssIGJ1dCBzb21ldGltZXMKLWltcG9ydCBsaWJyYXJpZXMgZ2VuZXJhdGVkIGZyb20gdGhpcmQtcGFydHkgZGxscyBtYXkgbmVlZCB0aGlzIGZlYXR1cmUKLXRvIGJlIHVzYWJsZS4gIElmIHlvdSBzcGVjaWZ5IEBjb2Rley0tZW5hYmxlLXN0ZGNhbGwtZml4dXB9LCB0aGlzCi1mZWF0dXJlIGlzIGZ1bGx5IGVuYWJsZWQgYW5kIHdhcm5pbmdzIGFyZSBub3QgcHJpbnRlZC4gIElmIHlvdSBzcGVjaWZ5Ci1AY29kZXstLWRpc2FibGUtc3RkY2FsbC1maXh1cH0sIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBhbmQgc3VjaAotbWlzbWF0Y2hlcyBhcmUgY29uc2lkZXJlZCB0byBiZSBlcnJvcnMuCi0KLUBjaW5kZXggRExMcywgY3JlYXRpbmcKLUBraW5kZXggLS1leHBvcnQtYWxsLXN5bWJvbHMKLUBpdGVtIC0tZXhwb3J0LWFsbC1zeW1ib2xzCi1JZiBnaXZlbiwgYWxsIGdsb2JhbCBzeW1ib2xzIGluIHRoZSBvYmplY3RzIHVzZWQgdG8gYnVpbGQgYSBETEwgd2lsbAotYmUgZXhwb3J0ZWQgYnkgdGhlIERMTC4gIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIHRoZXJlCi1vdGhlcndpc2Ugd291bGRuJ3QgYmUgYW55IGV4cG9ydGVkIHN5bWJvbHMuICBXaGVuIHN5bWJvbHMgYXJlCi1leHBsaWNpdGx5IGV4cG9ydGVkIHZpYSBERUYgZmlsZXMgb3IgaW1wbGljaXRseSBleHBvcnRlZCB2aWEgZnVuY3Rpb24KLWF0dHJpYnV0ZXMsIHRoZSBkZWZhdWx0IGlzIHRvIG5vdCBleHBvcnQgYW55dGhpbmcgZWxzZSB1bmxlc3MgdGhpcwotb3B0aW9uIGlzIGdpdmVuLiAgTm90ZSB0aGF0IHRoZSBzeW1ib2xzIEBjb2Rle0RsbE1haW5AQDEyfSwKLUBjb2Rle0RsbEVudHJ5UG9pbnRAQDB9LCBhbmQgQGNvZGV7aW1wdXJlX3B0cn0gd2lsbCBub3QgYmUgYXV0b21hdGljYWxseQotZXhwb3J0ZWQuCi0KLUBraW5kZXggLS1leGNsdWRlLXN5bWJvbHMKLUBpdGVtIC0tZXhjbHVkZS1zeW1ib2xzIEB2YXJ7c3ltYm9sfSxAdmFye3N5bWJvbH0sLi4uCi1TcGVjaWZpZXMgYSBsaXN0IG9mIHN5bWJvbHMgd2hpY2ggc2hvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5Ci1leHBvcnRlZC4gIFRoZSBzeW1ib2wgbmFtZXMgbWF5IGJlIGRlbGltaXRlZCBieSBjb21tYXMgb3IgY29sb25zLgotCi1Aa2luZGV4IC0tZmlsZS1hbGlnbm1lbnQKLUBpdGVtIC0tZmlsZS1hbGlnbm1lbnQKLVNwZWNpZnkgdGhlIGZpbGUgYWxpZ25tZW50LiAgU2VjdGlvbnMgaW4gdGhlIGZpbGUgd2lsbCBhbHdheXMgYmVnaW4gYXQKLWZpbGUgb2Zmc2V0cyB3aGljaCBhcmUgbXVsdGlwbGVzIG9mIHRoaXMgbnVtYmVyLiAgVGhpcyBkZWZhdWx0cyB0bwotNTEyLgotCi1AY2luZGV4IGhlYXAgc2l6ZQotQGtpbmRleCAtLWhlYXAKLUBpdGVtIC0taGVhcCBAdmFye3Jlc2VydmV9Ci1AaXRlbXggLS1oZWFwIEB2YXJ7cmVzZXJ2ZX0sQHZhcntjb21taXR9Ci1TcGVjaWZ5IHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlc2VydmUgKGFuZCBvcHRpb25hbGx5IGNvbW1pdCkgdG8gYmUKLXVzZWQgYXMgaGVhcCBmb3IgdGhpcyBwcm9ncmFtLiAgVGhlIGRlZmF1bHQgaXMgMU1iIHJlc2VydmVkLCA0SwotY29tbWl0dGVkLgotCi1AY2luZGV4IGltYWdlIGJhc2UKLUBraW5kZXggLS1pbWFnZS1iYXNlCi1AaXRlbSAtLWltYWdlLWJhc2UgQHZhcnt2YWx1ZX0KLVVzZSBAdmFye3ZhbHVlfSBhcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHlvdXIgcHJvZ3JhbSBvciBkbGwuICBUaGlzIGlzCi10aGUgbG93ZXN0IG1lbW9yeSBsb2NhdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdXIgcHJvZ3JhbSBvciBkbGwKLWlzIGxvYWRlZC4gIFRvIHJlZHVjZSB0aGUgbmVlZCB0byByZWxvY2F0ZSBhbmQgaW1wcm92ZSBwZXJmb3JtYW5jZSBvZgoteW91ciBkbGxzLCBlYWNoIHNob3VsZCBoYXZlIGEgdW5pcXVlIGJhc2UgYWRkcmVzcyBhbmQgbm90IG92ZXJsYXAgYW55Ci1vdGhlciBkbGxzLiAgVGhlIGRlZmF1bHQgaXMgMHg0MDAwMDAgZm9yIGV4ZWN1dGFibGVzLCBhbmQgMHgxMDAwMDAwMAotZm9yIGRsbHMuCi0KLUBraW5kZXggLS1raWxsLWF0Ci1AaXRlbSAtLWtpbGwtYXQKLUlmIGdpdmVuLCB0aGUgc3RkY2FsbCBzdWZmaXhlcyAoQEBAdmFye25ufSkgd2lsbCBiZSBzdHJpcHBlZCBmcm9tCi1zeW1ib2xzIGJlZm9yZSB0aGV5IGFyZSBleHBvcnRlZC4KLQotQGtpbmRleCAtLW1ham9yLWltYWdlLXZlcnNpb24KLUBpdGVtIC0tbWFqb3ItaW1hZ2UtdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSAiaW1hZ2UgdmVyc2lvbiIuICBEZWZhdWx0cyB0byAxLgotCi1Aa2luZGV4IC0tbWFqb3Itb3MtdmVyc2lvbgotQGl0ZW0gLS1tYWpvci1vcy12ZXJzaW9uIEB2YXJ7dmFsdWV9Ci1TZXRzIHRoZSBtYWpvciBudW1iZXIgb2YgdGhlICJvcyB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDQuCi0KLUBraW5kZXggLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbgotQGl0ZW0gLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSAic3Vic3lzdGVtIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gNC4KLQotQGtpbmRleCAtLW1pbm9yLWltYWdlLXZlcnNpb24KLUBpdGVtIC0tbWlub3ItaW1hZ2UtdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSAiaW1hZ2UgdmVyc2lvbiIuICBEZWZhdWx0cyB0byAwLgotCi1Aa2luZGV4IC0tbWlub3Itb3MtdmVyc2lvbgotQGl0ZW0gLS1taW5vci1vcy12ZXJzaW9uIEB2YXJ7dmFsdWV9Ci1TZXRzIHRoZSBtaW5vciBudW1iZXIgb2YgdGhlICJvcyB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDAuCi0KLUBraW5kZXggLS1taW5vci1zdWJzeXN0ZW0tdmVyc2lvbgotQGl0ZW0gLS1taW5vci1zdWJzeXN0ZW0tdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSAic3Vic3lzdGVtIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gMC4KLQotQGNpbmRleCBERUYgZmlsZXMsIGNyZWF0aW5nCi1AY2luZGV4IERMTHMsIGNyZWF0aW5nCi1Aa2luZGV4IC0tb3V0cHV0LWRlZgotQGl0ZW0gLS1vdXRwdXQtZGVmIEB2YXJ7ZmlsZX0KLVRoZSBsaW5rZXIgd2lsbCBjcmVhdGUgdGhlIGZpbGUgQHZhcntmaWxlfSB3aGljaCB3aWxsIGNvbnRhaW4gYSBERUYKLWZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgRExMIHRoZSBsaW5rZXIgaXMgZ2VuZXJhdGluZy4gIFRoaXMgREVGIGZpbGUKLSh3aGljaCBzaG91bGQgYmUgY2FsbGVkIEBjb2RleyouZGVmfSkgbWF5IGJlIHVzZWQgdG8gY3JlYXRlIGFuIGltcG9ydAotbGlicmFyeSB3aXRoIEBjb2Rle2RsbHRvb2x9IG9yIG1heSBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIHRvCi1hdXRvbWF0aWNhbGx5IG9yIGltcGxpY2l0bHkgZXhwb3J0ZWQgc3ltYm9scy4KLQotQGtpbmRleCAtLXNlY3Rpb24tYWxpZ25tZW50Ci1AaXRlbSAtLXNlY3Rpb24tYWxpZ25tZW50Ci1TZXRzIHRoZSBzZWN0aW9uIGFsaWdubWVudC4gIFNlY3Rpb25zIGluIG1lbW9yeSB3aWxsIGFsd2F5cyBiZWdpbiBhdAotYWRkcmVzc2VzIHdoaWNoIGFyZSBhIG11bHRpcGxlIG9mIHRoaXMgbnVtYmVyLiAgRGVmYXVsdHMgdG8gMHgxMDAwLgotCi1AY2luZGV4IHN0YWNrIHNpemUKLUBraW5kZXggLS1zdGFjawotQGl0ZW0gLS1zdGFjayBAdmFye3Jlc2VydmV9Ci1AaXRlbXggLS1zdGFjayBAdmFye3Jlc2VydmV9LEB2YXJ7Y29tbWl0fQotU3BlY2lmeSB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZXNlcnZlIChhbmQgb3B0aW9uYWxseSBjb21taXQpIHRvIGJlCi11c2VkIGFzIHN0YWNrIGZvciB0aGlzIHByb2dyYW0uICBUaGUgZGVmYXVsdCBpcyAzMk1iIHJlc2VydmVkLCA0SwotY29tbWl0dGVkLgotCi1Aa2luZGV4IC0tc3Vic3lzdGVtCi1AaXRlbSAtLXN1YnN5c3RlbSBAdmFye3doaWNofQotQGl0ZW14IC0tc3Vic3lzdGVtIEB2YXJ7d2hpY2h9OkB2YXJ7bWFqb3J9Ci1AaXRlbXggLS1zdWJzeXN0ZW0gQHZhcnt3aGljaH06QHZhcnttYWpvcn0uQHZhcnttaW5vcn0KLVNwZWNpZmllcyB0aGUgc3Vic3lzdGVtIHVuZGVyIHdoaWNoIHlvdXIgcHJvZ3JhbSB3aWxsIGV4ZWN1dGUuICBUaGUKLWxlZ2FsIHZhbHVlcyBmb3IgQHZhcnt3aGljaH0gYXJlIEBjb2Rle25hdGl2ZX0sIEBjb2Rle3dpbmRvd3N9LAotQGNvZGV7Y29uc29sZX0sIGFuZCBAY29kZXtwb3NpeH0uICBZb3UgbWF5IG9wdGlvbmFsbHkgc2V0IHRoZQotc3Vic3lzdGVtIHZlcnNpb24gYWxzby4KLQotQGVuZCB0YWJsZQotCi1AaWZzZXQgVXNlc0VudlZhcnMKLUBub2RlIEVudmlyb25tZW50Ci1Ac2VjdGlvbiBFbnZpcm9ubWVudCBWYXJpYWJsZXMKLQotWW91IGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIEBjb2Rle2xkfSB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLUBjb2Rle0dOVVRBUkdFVH0sIEBjb2Rle0xERU1VTEFUSU9OfSwgYW5kIEBjb2Rle0NPTExFQ1RfTk9fREVNQU5HTEV9LgotCi1Aa2luZGV4IEdOVVRBUkdFVAotQGNpbmRleCBkZWZhdWx0IGlucHV0IGZvcm1hdAotQGNvZGV7R05VVEFSR0VUfSBkZXRlcm1pbmVzIHRoZSBpbnB1dC1maWxlIG9iamVjdCBmb3JtYXQgaWYgeW91IGRvbid0Ci11c2UgQHNhbXB7LWJ9IChvciBpdHMgc3lub255bSBAc2FtcHstLWZvcm1hdH0pLiAgSXRzIHZhbHVlIHNob3VsZCBiZSBvbmUKLW9mIHRoZSBCRkQgbmFtZXMgZm9yIGFuIGlucHV0IGZvcm1hdCAoQHB4cmVme0JGRH0pLiAgSWYgdGhlcmUgaXMgbm8KLUBjb2Rle0dOVVRBUkdFVH0gaW4gdGhlIGVudmlyb25tZW50LCBAY29kZXtsZH0gdXNlcyB0aGUgbmF0dXJhbCBmb3JtYXQKLW9mIHRoZSB0YXJnZXQuIElmIEBjb2Rle0dOVVRBUkdFVH0gaXMgc2V0IHRvIEBjb2Rle2RlZmF1bHR9IHRoZW4gQkZECi1hdHRlbXB0cyB0byBkaXNjb3ZlciB0aGUgaW5wdXQgZm9ybWF0IGJ5IGV4YW1pbmluZyBiaW5hcnkgaW5wdXQgZmlsZXM7Ci10aGlzIG1ldGhvZCBvZnRlbiBzdWNjZWVkcywgYnV0IHRoZXJlIGFyZSBwb3RlbnRpYWwgYW1iaWd1aXRpZXMsIHNpbmNlCi10aGVyZSBpcyBubyBtZXRob2Qgb2YgZW5zdXJpbmcgdGhhdCB0aGUgbWFnaWMgbnVtYmVyIHVzZWQgdG8gc3BlY2lmeQotb2JqZWN0LWZpbGUgZm9ybWF0cyBpcyB1bmlxdWUuICBIb3dldmVyLCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZWR1cmUgZm9yCi1CRkQgb24gZWFjaCBzeXN0ZW0gcGxhY2VzIHRoZSBjb252ZW50aW9uYWwgZm9ybWF0IGZvciB0aGF0IHN5c3RlbSBmaXJzdAotaW4gdGhlIHNlYXJjaC1saXN0LCBzbyBhbWJpZ3VpdGllcyBhcmUgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgY29udmVudGlvbi4KLQotQGtpbmRleCBMREVNVUxBVElPTgotQGNpbmRleCBkZWZhdWx0IGVtdWxhdGlvbgotQGNpbmRleCBlbXVsYXRpb24sIGRlZmF1bHQKLUBjb2Rle0xERU1VTEFUSU9OfSBkZXRlcm1pbmVzIHRoZSBkZWZhdWx0IGVtdWxhdGlvbiBpZiB5b3UgZG9uJ3QgdXNlIHRoZQotQHNhbXB7LW19IG9wdGlvbi4gIFRoZSBlbXVsYXRpb24gY2FuIGFmZmVjdCB2YXJpb3VzIGFzcGVjdHMgb2YgbGlua2VyCi1iZWhhdmlvdXIsIHBhcnRpY3VsYXJseSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgWW91IGNhbiBsaXN0IHRoZQotYXZhaWxhYmxlIGVtdWxhdGlvbnMgd2l0aCB0aGUgQHNhbXB7LS12ZXJib3NlfSBvciBAc2FtcHstVn0gb3B0aW9ucy4gIElmCi10aGUgQHNhbXB7LW19IG9wdGlvbiBpcyBub3QgdXNlZCwgYW5kIHRoZSBAY29kZXtMREVNVUxBVElPTn0gZW52aXJvbm1lbnQKLXZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkLCB0aGUgZGVmYXVsdCBlbXVsYXRpb24gZGVwZW5kcyB1cG9uIGhvdyB0aGUKLWxpbmtlciB3YXMgY29uZmlndXJlZC4KLUBlbmQgaWZzZXQKLQotQGtpbmRleCBDT0xMRUNUX05PX0RFTUFOR0xFCi1AY2luZGV4IGRlbWFuZ2xpbmcsIGRlZmF1bHQKLU5vcm1hbGx5LCB0aGUgbGlua2VyIHdpbGwgZGVmYXVsdCB0byBkZW1hbmdsaW5nIHN5bWJvbHMuICBIb3dldmVyLCBpZgotQGNvZGV7Q09MTEVDVF9OT19ERU1BTkdMRX0gaXMgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwgdGhlbiBpdCB3aWxsCi1kZWZhdWx0IHRvIG5vdCBkZW1hbmdsaW5nIHN5bWJvbHMuICBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQgaW4KLWEgc2ltaWxhciBmYXNoaW9uIGJ5IHRoZSBAY29kZXtnY2N9IGxpbmtlciB3cmFwcGVyIHByb2dyYW0uICBUaGUgZGVmYXVsdAotbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIEBzYW1wey0tZGVtYW5nbGV9IGFuZCBAc2FtcHstLW5vLWRlbWFuZ2xlfQotb3B0aW9ucy4KLQotQG5vZGUgU2NyaXB0cwotQGNoYXB0ZXIgTGlua2VyIFNjcmlwdHMKLQotQGNpbmRleCBzY3JpcHRzCi1AY2luZGV4IGxpbmtlciBzY3JpcHRzCi1AY2luZGV4IGNvbW1hbmQgZmlsZXMKLUV2ZXJ5IGxpbmsgaXMgY29udHJvbGxlZCBieSBhIEBkZm57bGlua2VyIHNjcmlwdH0uICBUaGlzIHNjcmlwdCBpcwotd3JpdHRlbiBpbiB0aGUgbGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2UuCi0KLVRoZSBtYWluIHB1cnBvc2Ugb2YgdGhlIGxpbmtlciBzY3JpcHQgaXMgdG8gZGVzY3JpYmUgaG93IHRoZSBzZWN0aW9ucyBpbgotdGhlIGlucHV0IGZpbGVzIHNob3VsZCBiZSBtYXBwZWQgaW50byB0aGUgb3V0cHV0IGZpbGUsIGFuZCB0byBjb250cm9sCi10aGUgbWVtb3J5IGxheW91dCBvZiB0aGUgb3V0cHV0IGZpbGUuICBNb3N0IGxpbmtlciBzY3JpcHRzIGRvIG5vdGhpbmcKLW1vcmUgdGhhbiB0aGlzLiAgSG93ZXZlciwgd2hlbiBuZWNlc3NhcnksIHRoZSBsaW5rZXIgc2NyaXB0IGNhbiBhbHNvCi1kaXJlY3QgdGhlIGxpbmtlciB0byBwZXJmb3JtIG1hbnkgb3RoZXIgb3BlcmF0aW9ucywgdXNpbmcgdGhlIGNvbW1hbmRzCi1kZXNjcmliZWQgYmVsb3cuCi0KLVRoZSBsaW5rZXIgYWx3YXlzIHVzZXMgYSBsaW5rZXIgc2NyaXB0LiAgSWYgeW91IGRvIG5vdCBzdXBwbHkgb25lCi15b3Vyc2VsZiwgdGhlIGxpbmtlciB3aWxsIHVzZSBhIGRlZmF1bHQgc2NyaXB0IHRoYXQgaXMgY29tcGlsZWQgaW50byB0aGUKLWxpbmtlciBleGVjdXRhYmxlLiAgWW91IGNhbiB1c2UgdGhlIEBzYW1wey0tdmVyYm9zZX0gY29tbWFuZCBsaW5lIG9wdGlvbgotdG8gZGlzcGxheSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgQ2VydGFpbiBjb21tYW5kIGxpbmUgb3B0aW9ucywKLXN1Y2ggYXMgQHNhbXB7LXJ9IG9yIEBzYW1wey1OfSwgd2lsbCBhZmZlY3QgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4KLQotWW91IG1heSBzdXBwbHkgeW91ciBvd24gbGlua2VyIHNjcmlwdCBieSB1c2luZyB0aGUgQHNhbXB7LVR9IGNvbW1hbmQKLWxpbmUgb3B0aW9uLiAgV2hlbiB5b3UgZG8gdGhpcywgeW91ciBsaW5rZXIgc2NyaXB0IHdpbGwgcmVwbGFjZSB0aGUKLWRlZmF1bHQgbGlua2VyIHNjcmlwdC4KLQotWW91IG1heSBhbHNvIHVzZSBsaW5rZXIgc2NyaXB0cyBpbXBsaWNpdGx5IGJ5IG5hbWluZyB0aGVtIGFzIGlucHV0IGZpbGVzCi10byB0aGUgbGlua2VyLCBhcyB0aG91Z2ggdGhleSB3ZXJlIGZpbGVzIHRvIGJlIGxpbmtlZC4gIEB4cmVme0ltcGxpY2l0Ci1MaW5rZXIgU2NyaXB0c30uCi0KLUBtZW51Ci0qIEJhc2ljIFNjcmlwdCBDb25jZXB0czo6CUJhc2ljIExpbmtlciBTY3JpcHQgQ29uY2VwdHMKLSogU2NyaXB0IEZvcm1hdDo6CQlMaW5rZXIgU2NyaXB0IEZvcm1hdAotKiBTaW1wbGUgRXhhbXBsZTo6CQlTaW1wbGUgTGlua2VyIFNjcmlwdCBFeGFtcGxlCi0qIFNpbXBsZSBDb21tYW5kczo6CQlTaW1wbGUgTGlua2VyIFNjcmlwdCBDb21tYW5kcwotKiBBc3NpZ25tZW50czo6CQkJQXNzaWduaW5nIFZhbHVlcyB0byBTeW1ib2xzCi0qIFNFQ1RJT05TOjoJCQlTRUNUSU9OUyBDb21tYW5kCi0qIE1FTU9SWTo6CQkJTUVNT1JZIENvbW1hbmQKLSogUEhEUlM6OgkJCVBIRFJTIENvbW1hbmQKLSogVkVSU0lPTjo6CQkJVkVSU0lPTiBDb21tYW5kCi0qIEV4cHJlc3Npb25zOjoJCQlFeHByZXNzaW9ucyBpbiBMaW5rZXIgU2NyaXB0cwotKiBJbXBsaWNpdCBMaW5rZXIgU2NyaXB0czo6CUltcGxpY2l0IExpbmtlciBTY3JpcHRzCi1AZW5kIG1lbnUKLQotQG5vZGUgQmFzaWMgU2NyaXB0IENvbmNlcHRzCi1Ac2VjdGlvbiBCYXNpYyBMaW5rZXIgU2NyaXB0IENvbmNlcHRzCi1AY2luZGV4IGxpbmtlciBzY3JpcHQgY29uY2VwdHMKLVdlIG5lZWQgdG8gZGVmaW5lIHNvbWUgYmFzaWMgY29uY2VwdHMgYW5kIHZvY2FidWxhcnkgaW4gb3JkZXIgdG8KLWRlc2NyaWJlIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi1UaGUgbGlua2VyIGNvbWJpbmVzIGlucHV0IGZpbGVzIGludG8gYSBzaW5nbGUgb3V0cHV0IGZpbGUuICBUaGUgb3V0cHV0Ci1maWxlIGFuZCBlYWNoIGlucHV0IGZpbGUgYXJlIGluIGEgc3BlY2lhbCBkYXRhIGZvcm1hdCBrbm93biBhcyBhbgotQGRmbntvYmplY3QgZmlsZSBmb3JtYXR9LiAgRWFjaCBmaWxlIGlzIGNhbGxlZCBhbiBAZGZue29iamVjdCBmaWxlfS4KLVRoZSBvdXRwdXQgZmlsZSBpcyBvZnRlbiBjYWxsZWQgYW4gQGRmbntleGVjdXRhYmxlfSwgYnV0IGZvciBvdXIKLXB1cnBvc2VzIHdlIHdpbGwgYWxzbyBjYWxsIGl0IGFuIG9iamVjdCBmaWxlLiAgRWFjaCBvYmplY3QgZmlsZSBoYXMsCi1hbW9uZyBvdGhlciB0aGluZ3MsIGEgbGlzdCBvZiBAZGZue3NlY3Rpb25zfS4gIFdlIHNvbWV0aW1lcyByZWZlciB0byBhCi1zZWN0aW9uIGluIGFuIGlucHV0IGZpbGUgYXMgYW4gQGRmbntpbnB1dCBzZWN0aW9ufTsgc2ltaWxhcmx5LCBhIHNlY3Rpb24KLWluIHRoZSBvdXRwdXQgZmlsZSBpcyBhbiBAZGZue291dHB1dCBzZWN0aW9ufS4KLQotRWFjaCBzZWN0aW9uIGluIGFuIG9iamVjdCBmaWxlIGhhcyBhIG5hbWUgYW5kIGEgc2l6ZS4gIE1vc3Qgc2VjdGlvbnMKLWFsc28gaGF2ZSBhbiBhc3NvY2lhdGVkIGJsb2NrIG9mIGRhdGEsIGtub3duIGFzIHRoZSBAZGZue3NlY3Rpb24KLWNvbnRlbnRzfS4gIEEgc2VjdGlvbiBtYXkgYmUgbWFya2VkIGFzIEBkZm57bG9hZGFibGV9LCB3aGljaCBtZWFuIHRoYXQKLXRoZSBjb250ZW50cyBzaG91bGQgYmUgbG9hZGVkIGludG8gbWVtb3J5IHdoZW4gdGhlIG91dHB1dCBmaWxlIGlzIHJ1bi4KLUEgc2VjdGlvbiB3aXRoIG5vIGNvbnRlbnRzIG1heSBiZSBAZGZue2FsbG9jYXRhYmxlfSwgd2hpY2ggbWVhbnMgdGhhdCBhbgotYXJlYSBpbiBtZW1vcnkgc2hvdWxkIGJlIHNldCBhc2lkZSwgYnV0IG5vdGhpbmcgaW4gcGFydGljdWxhciBzaG91bGQgYmUKLWxvYWRlZCB0aGVyZSAoaW4gc29tZSBjYXNlcyB0aGlzIG1lbW9yeSBtdXN0IGJlIHplcm9lZCBvdXQpLiAgQSBzZWN0aW9uCi13aGljaCBpcyBuZWl0aGVyIGxvYWRhYmxlIG5vciBhbGxvY2F0YWJsZSB0eXBpY2FsbHkgY29udGFpbnMgc29tZSBzb3J0Ci1vZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLUV2ZXJ5IGxvYWRhYmxlIG9yIGFsbG9jYXRhYmxlIG91dHB1dCBzZWN0aW9uIGhhcyB0d28gYWRkcmVzc2VzLiAgVGhlCi1maXJzdCBpcyB0aGUgQGRmbntWTUF9LCBvciB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzLiAgVGhpcyBpcyB0aGUgYWRkcmVzcwotdGhlIHNlY3Rpb24gd2lsbCBoYXZlIHdoZW4gdGhlIG91dHB1dCBmaWxlIGlzIHJ1bi4gIFRoZSBzZWNvbmQgaXMgdGhlCi1AZGZue0xNQX0sIG9yIGxvYWQgbWVtb3J5IGFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoZQotc2VjdGlvbiB3aWxsIGJlIGxvYWRlZC4gIEluIG1vc3QgY2FzZXMgdGhlIHR3byBhZGRyZXNzZXMgd2lsbCBiZSB0aGUKLXNhbWUuICBBbiBleGFtcGxlIG9mIHdoZW4gdGhleSBtaWdodCBiZSBkaWZmZXJlbnQgaXMgd2hlbiBhIGRhdGEgc2VjdGlvbgotaXMgbG9hZGVkIGludG8gUk9NLCBhbmQgdGhlbiBjb3BpZWQgaW50byBSQU0gd2hlbiB0aGUgcHJvZ3JhbSBzdGFydHMgdXAKLSh0aGlzIHRlY2huaXF1ZSBpcyBvZnRlbiB1c2VkIHRvIGluaXRpYWxpemUgZ2xvYmFsIHZhcmlhYmxlcyBpbiBhIFJPTQotYmFzZWQgc3lzdGVtKS4gIEluIHRoaXMgY2FzZSB0aGUgUk9NIGFkZHJlc3Mgd291bGQgYmUgdGhlIExNQSwgYW5kIHRoZQotUkFNIGFkZHJlc3Mgd291bGQgYmUgdGhlIFZNQS4KLQotWW91IGNhbiBzZWUgdGhlIHNlY3Rpb25zIGluIGFuIG9iamVjdCBmaWxlIGJ5IHVzaW5nIHRoZSBAY29kZXtvYmpkdW1wfQotcHJvZ3JhbSB3aXRoIHRoZSBAc2FtcHstaH0gb3B0aW9uLgotCi1FdmVyeSBvYmplY3QgZmlsZSBhbHNvIGhhcyBhIGxpc3Qgb2YgQGRmbntzeW1ib2xzfSwga25vd24gYXMgdGhlCi1AZGZue3N5bWJvbCB0YWJsZX0uICBBIHN5bWJvbCBtYXkgYmUgZGVmaW5lZCBvciB1bmRlZmluZWQuICBFYWNoIHN5bWJvbAotaGFzIGEgbmFtZSwgYW5kIGVhY2ggZGVmaW5lZCBzeW1ib2wgaGFzIGFuIGFkZHJlc3MsIGFtb25nIG90aGVyCi1pbmZvcm1hdGlvbi4gIElmIHlvdSBjb21waWxlIGEgQyBvciBDKysgcHJvZ3JhbSBpbnRvIGFuIG9iamVjdCBmaWxlLCB5b3UKLXdpbGwgZ2V0IGEgZGVmaW5lZCBzeW1ib2wgZm9yIGV2ZXJ5IGRlZmluZWQgZnVuY3Rpb24gYW5kIGdsb2JhbCBvcgotc3RhdGljIHZhcmlhYmxlLiAgRXZlcnkgdW5kZWZpbmVkIGZ1bmN0aW9uIG9yIGdsb2JhbCB2YXJpYWJsZSB3aGljaCBpcwotcmVmZXJlbmNlZCBpbiB0aGUgaW5wdXQgZmlsZSB3aWxsIGJlY29tZSBhbiB1bmRlZmluZWQgc3ltYm9sLgotCi1Zb3UgY2FuIHNlZSB0aGUgc3ltYm9scyBpbiBhbiBvYmplY3QgZmlsZSBieSB1c2luZyB0aGUgQGNvZGV7bm19Ci1wcm9ncmFtLCBvciBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0gcHJvZ3JhbSB3aXRoIHRoZSBAc2FtcHstdH0KLW9wdGlvbi4KLQotQG5vZGUgU2NyaXB0IEZvcm1hdAotQHNlY3Rpb24gTGlua2VyIFNjcmlwdCBGb3JtYXQKLUBjaW5kZXggbGlua2VyIHNjcmlwdCBmb3JtYXQKLUxpbmtlciBzY3JpcHRzIGFyZSB0ZXh0IGZpbGVzLgotCi1Zb3Ugd3JpdGUgYSBsaW5rZXIgc2NyaXB0IGFzIGEgc2VyaWVzIG9mIGNvbW1hbmRzLiAgRWFjaCBjb21tYW5kIGlzCi1laXRoZXIgYSBrZXl3b3JkLCBwb3NzaWJseSBmb2xsb3dlZCBieSBhcmd1bWVudHMsIG9yIGFuIGFzc2lnbm1lbnQgdG8gYQotc3ltYm9sLiAgWW91IG1heSBzZXBhcmF0ZSBjb21tYW5kcyB1c2luZyBzZW1pY29sb25zLiAgV2hpdGVzcGFjZSBpcwotZ2VuZXJhbGx5IGlnbm9yZWQuCi0KLVN0cmluZ3Mgc3VjaCBhcyBmaWxlIG9yIGZvcm1hdCBuYW1lcyBjYW4gbm9ybWFsbHkgYmUgZW50ZXJlZCBkaXJlY3RseS4KLUlmIHRoZSBmaWxlIG5hbWUgY29udGFpbnMgYSBjaGFyYWN0ZXIgc3VjaCBhcyBhIGNvbW1hIHdoaWNoIHdvdWxkCi1vdGhlcndpc2Ugc2VydmUgdG8gc2VwYXJhdGUgZmlsZSBuYW1lcywgeW91IG1heSBwdXQgdGhlIGZpbGUgbmFtZSBpbgotZG91YmxlIHF1b3Rlcy4gIFRoZXJlIGlzIG5vIHdheSB0byB1c2UgYSBkb3VibGUgcXVvdGUgY2hhcmFjdGVyIGluIGEKLWZpbGUgbmFtZS4KLQotWW91IG1heSBpbmNsdWRlIGNvbW1lbnRzIGluIGxpbmtlciBzY3JpcHRzIGp1c3QgYXMgaW4gQywgZGVsaW1pdGVkIGJ5Ci1Ac2FtcHsvKn0gYW5kIEBzYW1weyovfS4gIEFzIGluIEMsIGNvbW1lbnRzIGFyZSBzeW50YWN0aWNhbGx5IGVxdWl2YWxlbnQKLXRvIHdoaXRlc3BhY2UuCi0KLUBub2RlIFNpbXBsZSBFeGFtcGxlCi1Ac2VjdGlvbiBTaW1wbGUgTGlua2VyIFNjcmlwdCBFeGFtcGxlCi1AY2luZGV4IGxpbmtlciBzY3JpcHQgZXhhbXBsZQotQGNpbmRleCBleGFtcGxlIG9mIGxpbmtlciBzY3JpcHQKLU1hbnkgbGlua2VyIHNjcmlwdHMgYXJlIGZhaXJseSBzaW1wbGUuCi0KLVRoZSBzaW1wbGVzdCBwb3NzaWJsZSBsaW5rZXIgc2NyaXB0IGhhcyBqdXN0IG9uZSBjb21tYW5kOgotQHNhbXB7U0VDVElPTlN9LiAgWW91IHVzZSB0aGUgQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQgdG8gZGVzY3JpYmUgdGhlCi1tZW1vcnkgbGF5b3V0IG9mIHRoZSBvdXRwdXQgZmlsZS4KLQotVGhlIEBzYW1we1NFQ1RJT05TfSBjb21tYW5kIGlzIGEgcG93ZXJmdWwgY29tbWFuZC4gIEhlcmUgd2Ugd2lsbAotZGVzY3JpYmUgYSBzaW1wbGUgdXNlIG9mIGl0LiAgTGV0J3MgYXNzdW1lIHlvdXIgcHJvZ3JhbSBjb25zaXN0cyBvbmx5IG9mCi1jb2RlLCBpbml0aWFsaXplZCBkYXRhLCBhbmQgdW5pbml0aWFsaXplZCBkYXRhLiAgVGhlc2Ugd2lsbCBiZSBpbiB0aGUKLUBzYW1wey50ZXh0fSwgQHNhbXB7LmRhdGF9LCBhbmQgQHNhbXB7LmJzc30gc2VjdGlvbnMsIHJlc3BlY3RpdmVseS4KLUxldCdzIGFzc3VtZSBmdXJ0aGVyIHRoYXQgdGhlc2UgYXJlIHRoZSBvbmx5IHNlY3Rpb25zIHdoaWNoIGFwcGVhciBpbgoteW91ciBpbnB1dCBmaWxlcy4KLQotRm9yIHRoaXMgZXhhbXBsZSwgbGV0J3Mgc2F5IHRoYXQgdGhlIGNvZGUgc2hvdWxkIGJlIGxvYWRlZCBhdCBhZGRyZXNzCi0weDEwMDAwLCBhbmQgdGhhdCB0aGUgZGF0YSBzaG91bGQgc3RhcnQgYXQgYWRkcmVzcyAweDgwMDAwMDAuICBIZXJlIGlzIGEKLWxpbmtlciBzY3JpcHQgd2hpY2ggd2lsbCBkbyB0aGF0OgotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLUB7Ci0gIC4gPSAweDEwMDAwOwotICAudGV4dCA6IEB7ICooLnRleHQpIEB9Ci0gIC4gPSAweDgwMDAwMDA7Ci0gIC5kYXRhIDogQHsgKiguZGF0YSkgQH0KLSAgLmJzcyA6IEB7ICooLmJzcykgQH0KLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1Zb3Ugd3JpdGUgdGhlIEBzYW1we1NFQ1RJT05TfSBjb21tYW5kIGFzIHRoZSBrZXl3b3JkIEBzYW1we1NFQ1RJT05TfSwKLWZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIHN5bWJvbCBhc3NpZ25tZW50cyBhbmQgb3V0cHV0IHNlY3Rpb24KLWRlc2NyaXB0aW9ucyBlbmNsb3NlZCBpbiBjdXJseSBicmFjZXMuCi0KLVRoZSBmaXJzdCBsaW5lIGluIHRoZSBhYm92ZSBleGFtcGxlIHNldHMgdGhlIHNwZWNpYWwgc3ltYm9sIEBzYW1wey59LAotd2hpY2ggaXMgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICBJZiB5b3UgZG8gbm90IHNwZWNpZnkgdGhlIGFkZHJlc3Mgb2YgYW4KLW91dHB1dCBzZWN0aW9uIGluIHNvbWUgb3RoZXIgd2F5IChvdGhlciB3YXlzIGFyZSBkZXNjcmliZWQgbGF0ZXIpLCB0aGUKLWFkZHJlc3MgaXMgc2V0IGZyb20gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICBUaGUKLWxvY2F0aW9uIGNvdW50ZXIgaXMgdGhlbiBpbmNyZW1lbnRlZCBieSB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uCi0KLVRoZSBmaXJzdCBsaW5lIGluc2lkZSB0aGUgQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQgb2YgdGhlIGFib3ZlIGV4YW1wbGUKLXNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWFsIHN5bWJvbCBAc2FtcHsufSwgd2hpY2ggaXMgdGhlIGxvY2F0aW9uCi1jb3VudGVyLiAgSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoZSBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uIGluIHNvbWUKLW90aGVyIHdheSAob3RoZXIgd2F5cyBhcmUgZGVzY3JpYmVkIGxhdGVyKSwgdGhlIGFkZHJlc3MgaXMgc2V0IGZyb20gdGhlCi1jdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyLiAgVGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgdGhlbgotaW5jcmVtZW50ZWQgYnkgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBzZWN0aW9uLiAgQXQgdGhlIHN0YXJ0IG9mIHRoZQotQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQsIHRoZSBsb2NhdGlvbiBjb3VudGVyIGhhcyB0aGUgdmFsdWUgQHNhbXB7MH0uCi0KLVRoZSBzZWNvbmQgbGluZSBkZWZpbmVzIGFuIG91dHB1dCBzZWN0aW9uLCBAc2FtcHsudGV4dH0uICBUaGUgY29sb24gaXMKLXJlcXVpcmVkIHN5bnRheCB3aGljaCBtYXkgYmUgaWdub3JlZCBmb3Igbm93LiAgV2l0aGluIHRoZSBjdXJseSBicmFjZXMKLWFmdGVyIHRoZSBvdXRwdXQgc2VjdGlvbiBuYW1lLCB5b3UgbGlzdCB0aGUgbmFtZXMgb2YgdGhlIGlucHV0IHNlY3Rpb25zCi13aGljaCBzaG91bGQgYmUgcGxhY2VkIGludG8gdGhpcyBvdXRwdXQgc2VjdGlvbi4gIFRoZSBAc2FtcHsqfSBpcyBhCi13aWxkY2FyZCB3aGljaCBtYXRjaGVzIGFueSBmaWxlIG5hbWUuICBUaGUgZXhwcmVzc2lvbiBAc2FtcHsqKC50ZXh0KX0KLW1lYW5zIGFsbCBAc2FtcHsudGV4dH0gaW5wdXQgc2VjdGlvbnMgaW4gYWxsIGlucHV0IGZpbGVzLgotCi1TaW5jZSB0aGUgbG9jYXRpb24gY291bnRlciBpcyBAc2FtcHsweDEwMDAwfSB3aGVuIHRoZSBvdXRwdXQgc2VjdGlvbgotQHNhbXB7LnRleHR9IGlzIGRlZmluZWQsIHRoZSBsaW5rZXIgd2lsbCBzZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCi1Ac2FtcHsudGV4dH0gc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgQHNhbXB7MHgxMDAwMH0uCi0KLVRoZSByZW1haW5pbmcgbGluZXMgZGVmaW5lIHRoZSBAc2FtcHsuZGF0YX0gYW5kIEBzYW1wey5ic3N9IHNlY3Rpb25zIGluCi10aGUgb3V0cHV0IGZpbGUuICBUaGUgbGlua2VyIHdpbGwgcGxhY2UgdGhlIEBzYW1wey5kYXRhfSBvdXRwdXQgc2VjdGlvbgotYXQgYWRkcmVzcyBAc2FtcHsweDgwMDAwMDB9LiAgQWZ0ZXIgdGhlIGxpbmtlciBwbGFjZXMgdGhlIEBzYW1wey5kYXRhfQotb3V0cHV0IHNlY3Rpb24sIHRoZSB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gY291bnRlciB3aWxsIGJlCi1Ac2FtcHsweDgwMDAwMDB9IHBsdXMgdGhlIHNpemUgb2YgdGhlIEBzYW1wey5kYXRhfSBvdXRwdXQgc2VjdGlvbi4gIFRoZQotZWZmZWN0IGlzIHRoYXQgdGhlIGxpbmtlciB3aWxsIHBsYWNlIHRoZSBAc2FtcHsuYnNzfSBvdXRwdXQgc2VjdGlvbgotaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIEBzYW1wey5kYXRhfSBvdXRwdXQgc2VjdGlvbiBpbiBtZW1vcnkKLQotVGhlIGxpbmtlciB3aWxsIGVuc3VyZSB0aGF0IGVhY2ggb3V0cHV0IHNlY3Rpb24gaGFzIHRoZSByZXF1aXJlZAotYWxpZ25tZW50LCBieSBpbmNyZWFzaW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyIGlmIG5lY2Vzc2FyeS4gIEluIHRoaXMKLWV4YW1wbGUsIHRoZSBzcGVjaWZpZWQgYWRkcmVzc2VzIGZvciB0aGUgQHNhbXB7LnRleHR9IGFuZCBAc2FtcHsuZGF0YX0KLXNlY3Rpb25zIHdpbGwgcHJvYmFibHkgc2F0aXNmeSBhbnkgYWxpZ25tZW50IGNvbnN0cmFpbnRzLCBidXQgdGhlIGxpbmtlcgotbWF5IGhhdmUgdG8gY3JlYXRlIGEgc21hbGwgZ2FwIGJldHdlZW4gdGhlIEBzYW1wey5kYXRhfSBhbmQgQHNhbXB7LmJzc30KLXNlY3Rpb25zLgotCi1UaGF0J3MgaXQhICBUaGF0J3MgYSBzaW1wbGUgYW5kIGNvbXBsZXRlIGxpbmtlciBzY3JpcHQuCi0KLUBub2RlIFNpbXBsZSBDb21tYW5kcwotQHNlY3Rpb24gU2ltcGxlIExpbmtlciBTY3JpcHQgQ29tbWFuZHMKLUBjaW5kZXggbGlua2VyIHNjcmlwdCBzaW1wbGUgY29tbWFuZHMKLUluIHRoaXMgc2VjdGlvbiB3ZSBkZXNjcmliZSB0aGUgc2ltcGxlIGxpbmtlciBzY3JpcHQgY29tbWFuZHMuCi0KLUBtZW51Ci0qIEVudHJ5IFBvaW50OjoJCQlTZXR0aW5nIHRoZSBlbnRyeSBwb2ludAotKiBGaWxlIENvbW1hbmRzOjoJCUNvbW1hbmRzIGRlYWxpbmcgd2l0aCBmaWxlcwotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci0qIEZvcm1hdCBDb21tYW5kczo6CQlDb21tYW5kcyBkZWFsaW5nIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cwotQGVuZCBpZmNsZWFyCi0KLSogTWlzY2VsbGFuZW91cyBDb21tYW5kczo6CU90aGVyIGxpbmtlciBzY3JpcHQgY29tbWFuZHMKLUBlbmQgbWVudQotCi1Abm9kZSBFbnRyeSBQb2ludAotQHN1YnNlY3Rpb24gU2V0dGluZyB0aGUgZW50cnkgcG9pbnQKLUBraW5kZXggRU5UUlkoQHZhcntzeW1ib2x9KQotQGNpbmRleCBzdGFydCBvZiBleGVjdXRpb24KLUBjaW5kZXggZmlyc3QgaW5zdHJ1Y3Rpb24KLUBjaW5kZXggZW50cnkgcG9pbnQKLVRoZSBmaXJzdCBpbnN0cnVjdGlvbiB0byBleGVjdXRlIGluIGEgcHJvZ3JhbSBpcyBjYWxsZWQgdGhlIEBkZm57ZW50cnkKLXBvaW50fS4gIFlvdSBjYW4gdXNlIHRoZSBAY29kZXtFTlRSWX0gbGlua2VyIHNjcmlwdCBjb21tYW5kIHRvIHNldCB0aGUKLWVudHJ5IHBvaW50LiAgVGhlIGFyZ3VtZW50IGlzIGEgc3ltYm9sIG5hbWU6Ci1Ac21hbGxleGFtcGxlCi1FTlRSWShAdmFye3N5bWJvbH0pCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIHNldCB0aGUgZW50cnkgcG9pbnQuICBUaGUgbGlua2VyIHdpbGwgc2V0IHRoZQotZW50cnkgcG9pbnQgYnkgdHJ5aW5nIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzIGluIG9yZGVyLCBhbmQKLXN0b3BwaW5nIHdoZW4gb25lIG9mIHRoZW0gc3VjY2VlZHM6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbSAKLXRoZSBAc2FtcHstZX0gQHZhcntlbnRyeX0gY29tbWFuZC1saW5lIG9wdGlvbjsKLUBpdGVtIAotdGhlIEBjb2Rle0VOVFJZKEB2YXJ7c3ltYm9sfSl9IGNvbW1hbmQgaW4gYSBsaW5rZXIgc2NyaXB0OwotQGl0ZW0gCi10aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBAY29kZXtzdGFydH0sIGlmIGRlZmluZWQ7Ci1AaXRlbSAKLXRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiwgaWYgcHJlc2VudDsKLUBpdGVtIAotVGhlIGFkZHJlc3MgQGNvZGV7MH0uCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgRmlsZSBDb21tYW5kcwotQHN1YnNlY3Rpb24gQ29tbWFuZHMgZGVhbGluZyB3aXRoIGZpbGVzCi1AY2luZGV4IGxpbmtlciBzY3JpcHQgZmlsZSBjb21tYW5kcwotU2V2ZXJhbCBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzIGRlYWwgd2l0aCBmaWxlcy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBJTkNMVURFIEB2YXJ7ZmlsZW5hbWV9Ci1Aa2luZGV4IElOQ0xVREUgQHZhcntmaWxlbmFtZX0KLUBjaW5kZXggaW5jbHVkaW5nIGEgbGlua2VyIHNjcmlwdAotSW5jbHVkZSB0aGUgbGlua2VyIHNjcmlwdCBAdmFye2ZpbGVuYW1lfSBhdCB0aGlzIHBvaW50LiAgVGhlIGZpbGUgd2lsbAotYmUgc2VhcmNoZWQgZm9yIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIGluIGFueSBkaXJlY3Rvcnkgc3BlY2lmaWVkCi13aXRoIHRoZSBAY29kZXstTH0gb3B0aW9uLiAgWW91IGNhbiBuZXN0IGNhbGxzIHRvIEBjb2Rle0lOQ0xVREV9IHVwIHRvCi0xMCBsZXZlbHMgZGVlcC4KLQotQGl0ZW0gSU5QVVQoQHZhcntmaWxlfSwgQHZhcntmaWxlfSwgQGRvdHN7fSkKLUBpdGVteCBJTlBVVChAdmFye2ZpbGV9IEB2YXJ7ZmlsZX0gQGRvdHN7fSkKLUBraW5kZXggSU5QVVQoQHZhcntmaWxlc30pCi1AY2luZGV4IGlucHV0IGZpbGVzIGluIGxpbmtlciBzY3JpcHRzCi1AY2luZGV4IGlucHV0IG9iamVjdCBmaWxlcyBpbiBsaW5rZXIgc2NyaXB0cwotQGNpbmRleCBsaW5rZXIgc2NyaXB0IGlucHV0IG9iamVjdCBmaWxlcwotVGhlIEBjb2Rle0lOUFVUfSBjb21tYW5kIGRpcmVjdHMgdGhlIGxpbmtlciB0byBpbmNsdWRlIHRoZSBuYW1lZCBmaWxlcwotaW4gdGhlIGxpbmssIGFzIHRob3VnaCB0aGV5IHdlcmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSBhbHdheXMgd2FudCB0byBpbmNsdWRlIEBmaWxle3N1YnIub30gYW55IHRpbWUgeW91IGRvCi1hIGxpbmssIGJ1dCB5b3UgY2FuJ3QgYmUgYm90aGVyZWQgdG8gcHV0IGl0IG9uIGV2ZXJ5IGxpbmsgY29tbWFuZCBsaW5lLAotdGhlbiB5b3UgY2FuIHB1dCBAc2FtcHtJTlBVVCAoc3Vici5vKX0gaW4geW91ciBsaW5rZXIgc2NyaXB0LgotCi1JbiBmYWN0LCBpZiB5b3UgbGlrZSwgeW91IGNhbiBsaXN0IGFsbCBvZiB5b3VyIGlucHV0IGZpbGVzIGluIHRoZSBsaW5rZXIKLXNjcmlwdCwgYW5kIHRoZW4gaW52b2tlIHRoZSBsaW5rZXIgd2l0aCBub3RoaW5nIGJ1dCBhIEBzYW1wey1UfSBvcHRpb24uCi0KLVRoZSBsaW5rZXIgd2lsbCBmaXJzdCB0cnkgdG8gb3BlbiB0aGUgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBJZgotaXQgaXMgbm90IGZvdW5kLCB0aGUgbGlua2VyIHdpbGwgc2VhcmNoIHRocm91Z2ggdGhlIGFyY2hpdmUgbGlicmFyeQotc2VhcmNoIHBhdGguICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBzYW1wey1MfSBpbiBAcmVme09wdGlvbnMsLENvbW1hbmQKLUxpbmUgT3B0aW9uc30uCi0KLUlmIHlvdSB1c2UgQHNhbXB7SU5QVVQgKC1sQHZhcntmaWxlfSl9LCBAY29kZXtsZH0gd2lsbCB0cmFuc2Zvcm0gdGhlCi1uYW1lIHRvIEBjb2Rle2xpYkB2YXJ7ZmlsZX0uYX0sIGFzIHdpdGggdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudAotQHNhbXB7LWx9LgotCi1XaGVuIHlvdSB1c2UgdGhlIEBjb2Rle0lOUFVUfSBjb21tYW5kIGluIGFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQsIHRoZQotZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbGluayBhdCB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIGxpbmtlcgotc2NyaXB0IGZpbGUgaXMgaW5jbHVkZWQuICBUaGlzIGNhbiBhZmZlY3QgYXJjaGl2ZSBzZWFyY2hpbmcuCi0KLUBpdGVtIEdST1VQKEB2YXJ7ZmlsZX0sIEB2YXJ7ZmlsZX0sIEBkb3Rze30pCi1AaXRlbXggR1JPVVAoQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30pCi1Aa2luZGV4IEdST1VQKEB2YXJ7ZmlsZXN9KQotQGNpbmRleCBncm91cGluZyBpbnB1dCBmaWxlcwotVGhlIEBjb2Rle0dST1VQfSBjb21tYW5kIGlzIGxpa2UgQGNvZGV7SU5QVVR9LCBleGNlcHQgdGhhdCB0aGUgbmFtZWQKLWZpbGVzIHNob3VsZCBhbGwgYmUgYXJjaGl2ZXMsIGFuZCB0aGV5IGFyZSBzZWFyY2hlZCByZXBlYXRlZGx5IHVudGlsIG5vCi1uZXcgdW5kZWZpbmVkIHJlZmVyZW5jZXMgYXJlIGNyZWF0ZWQuICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBzYW1wey0ofQotaW4gQHJlZntPcHRpb25zLCxDb21tYW5kIExpbmUgT3B0aW9uc30uCi0KLUBpdGVtIE9VVFBVVChAdmFye2ZpbGVuYW1lfSkKLUBraW5kZXggT1VUUFVUKEB2YXJ7ZmlsZW5hbWV9KQotQGNpbmRleCBvdXRwdXQgZmlsZSBuYW1lIGluIGxpbmtlciBzY3JpcG90Ci1UaGUgQGNvZGV7T1VUUFVUfSBjb21tYW5kIG5hbWVzIHRoZSBvdXRwdXQgZmlsZS4gIFVzaW5nCi1AY29kZXtPVVRQVVQoQHZhcntmaWxlbmFtZX0pfSBpbiB0aGUgbGlua2VyIHNjcmlwdCBpcyBleGFjdGx5IGxpa2UgdXNpbmcKLUBzYW1wey1vIEB2YXJ7ZmlsZW5hbWV9fSBvbiB0aGUgY29tbWFuZCBsaW5lIChAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZAotTGluZSBPcHRpb25zfSkuICBJZiBib3RoIGFyZSB1c2VkLCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0YWtlcwotcHJlY2VkZW5jZS4KLQotWW91IGNhbiB1c2UgdGhlIEBjb2Rle09VVFBVVH0gY29tbWFuZCB0byBkZWZpbmUgYSBkZWZhdWx0IG5hbWUgZm9yIHRoZQotb3V0cHV0IGZpbGUgb3RoZXIgdGhhbiB0aGUgdXN1YWwgZGVmYXVsdCBvZiBAZmlsZXthLm91dH0uCi0KLUBpdGVtIFNFQVJDSF9ESVIoQHZhcntwYXRofSkKLUBraW5kZXggU0VBUkNIX0RJUihAdmFye3BhdGh9KQotQGNpbmRleCBsaWJyYXJ5IHNlYXJjaCBwYXRoIGluIGxpbmtlciBzY3JpcHQKLUBjaW5kZXggYXJjaGl2ZSBzZWFyY2ggcGF0aCBpbiBsaW5rZXIgc2NyaXB0Ci1AY2luZGV4IHNlYXJjaCBwYXRoIGluIGxpbmtlciBzY3JpcHQKLVRoZSBAY29kZXtTRUFSQ0hfRElSfSBjb21tYW5kIGFkZHMgQHZhcntwYXRofSB0byB0aGUgbGlzdCBvZiBwYXRocyB3aGVyZQotQGNvZGV7bGR9IGxvb2tzIGZvciBhcmNoaXZlIGxpYnJhcmllcy4gIFVzaW5nCi1AY29kZXtTRUFSQ0hfRElSKEB2YXJ7cGF0aH0pfSBpcyBleGFjdGx5IGxpa2UgdXNpbmcgQHNhbXB7LUwgQHZhcntwYXRofX0KLW9uIHRoZSBjb21tYW5kIGxpbmUgKEBweHJlZntPcHRpb25zLCxDb21tYW5kIExpbmUgT3B0aW9uc30pLiAgSWYgYm90aAotYXJlIHVzZWQsIHRoZW4gdGhlIGxpbmtlciB3aWxsIHNlYXJjaCBib3RoIHBhdGhzLiAgUGF0aHMgc3BlY2lmaWVkIHVzaW5nCi10aGUgY29tbWFuZCBsaW5lIG9wdGlvbiBhcmUgc2VhcmNoZWQgZmlyc3QuCi0KLUBpdGVtIFNUQVJUVVAoQHZhcntmaWxlbmFtZX0pCi1Aa2luZGV4IFNUQVJUVVAoQHZhcntmaWxlbmFtZX0pCi1AY2luZGV4IGZpcnN0IGlucHV0IGZpbGUKLVRoZSBAY29kZXtTVEFSVFVQfSBjb21tYW5kIGlzIGp1c3QgbGlrZSB0aGUgQGNvZGV7SU5QVVR9IGNvbW1hbmQsIGV4Y2VwdAotdGhhdCBAdmFye2ZpbGVuYW1lfSB3aWxsIGJlY29tZSB0aGUgZmlyc3QgaW5wdXQgZmlsZSB0byBiZSBsaW5rZWQsIGFzCi10aG91Z2ggaXQgd2VyZSBzcGVjaWZpZWQgZmlyc3Qgb24gdGhlIGNvbW1hbmQgbGluZS4gIFRoaXMgbWF5IGJlIHVzZWZ1bAotd2hlbiB1c2luZyBhIHN5c3RlbSBpbiB3aGljaCB0aGUgZW50cnkgcG9pbnQgaXMgYWx3YXlzIHRoZSBzdGFydCBvZiB0aGUKLWZpcnN0IGZpbGUuCi1AZW5kIHRhYmxlCi0KLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotQG5vZGUgRm9ybWF0IENvbW1hbmRzCi1Ac3Vic2VjdGlvbiBDb21tYW5kcyBkZWFsaW5nIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cwotQSBjb3VwbGUgb2YgbGlua2VyIHNjcmlwdCBjb21tYW5kcyBkZWFsIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBPVVRQVVRfRk9STUFUKEB2YXJ7YmZkbmFtZX0pCi1AaXRlbXggT1VUUFVUX0ZPUk1BVChAdmFye2RlZmF1bHR9LCBAdmFye2JpZ30sIEB2YXJ7bGl0dGxlfSkKLUBraW5kZXggT1VUUFVUX0ZPUk1BVChAdmFye2JmZG5hbWV9KQotQGNpbmRleCBvdXRwdXQgZmlsZSBmb3JtYXQgaW4gbGlua2VyIHNjcmlwdAotVGhlIEBjb2Rle09VVFBVVF9GT1JNQVR9IGNvbW1hbmQgbmFtZXMgdGhlIEJGRCBmb3JtYXQgdG8gdXNlIGZvciB0aGUKLW91dHB1dCBmaWxlIChAcHhyZWZ7QkZEfSkuICBVc2luZyBAY29kZXtPVVRQVVRfRk9STUFUKEB2YXJ7YmZkbmFtZX0pfSBpcwotZXhhY3RseSBsaWtlIHVzaW5nIEBzYW1wey1vZm9ybWF0IEB2YXJ7YmZkbmFtZX19IG9uIHRoZSBjb21tYW5kIGxpbmUKLShAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZCBMaW5lIE9wdGlvbnN9KS4gIElmIGJvdGggYXJlIHVzZWQsIHRoZSBjb21tYW5kCi1saW5lIG9wdGlvbiB0YWtlcyBwcmVjZWRlbmNlLgotCi1Zb3UgY2FuIHVzZSBAY29kZXtPVVRQVVRfRk9STUFUfSB3aXRoIHRocmVlIGFyZ3VtZW50cyB0byB1c2UgZGlmZmVyZW50Ci1mb3JtYXRzIGJhc2VkIG9uIHRoZSBAc2FtcHstRUJ9IGFuZCBAc2FtcHstRUx9IGNvbW1hbmQgbGluZSBvcHRpb25zLgotVGhpcyBwZXJtaXRzIHRoZSBsaW5rZXIgc2NyaXB0IHRvIHNldCB0aGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiB0aGUKLWRlc2lyZWQgZW5kaWFubmVzcy4KLQotSWYgbmVpdGhlciBAc2FtcHstRUJ9IG5vciBAc2FtcHstRUx9IGFyZSB1c2VkLCB0aGVuIHRoZSBvdXRwdXQgZm9ybWF0Ci13aWxsIGJlIHRoZSBmaXJzdCBhcmd1bWVudCwgQHZhcntkZWZhdWx0fS4gIElmIEBzYW1wey1FQn0gaXMgdXNlZCwgdGhlCi1vdXRwdXQgZm9ybWF0IHdpbGwgYmUgdGhlIHNlY29uZCBhcmd1bWVudCwgQHZhcntiaWd9LiAgSWYgQHNhbXB7LUVMfSBpcwotdXNlZCwgdGhlIG91dHB1dCBmb3JtYXQgd2lsbCBiZSB0aGUgdGhpcmQgYXJndW1lbnQsIEB2YXJ7bGl0dGxlfS4KLQotRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgZm9yIHRoZSBNSVBTIEVMRiB0YXJnZXQgdXNlcyB0aGlzCi1jb21tYW5kOgotQHNtYWxsZXhhbXBsZQotT1VUUFVUX0ZPUk1BVChlbGYzMi1iaWdtaXBzLCBlbGYzMi1iaWdtaXBzLCBlbGYzMi1saXR0bGVtaXBzKQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoaXMgc2F5cyB0aGF0IHRoZSBkZWZhdWx0IGZvcm1hdCBmb3IgdGhlIG91dHB1dCBmaWxlIGlzCi1Ac2FtcHtlbGYzMi1iaWdtaXBzfSwgYnV0IGlmIHRoZSB1c2VyIHVzZXMgdGhlIEBzYW1wey1FTH0gY29tbWFuZCBsaW5lCi1vcHRpb24sIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIEBzYW1we2VsZjMyLWxpdHRsZW1pcHN9Ci1mb3JtYXQuCi0KLUBpdGVtIFRBUkdFVChAdmFye2JmZG5hbWV9KQotQGtpbmRleCBUQVJHRVQoQHZhcntiZmRuYW1lfSkKLUBjaW5kZXggaW5wdXQgZmlsZSBmb3JtYXQgaW4gbGlua2VyIHNjcmlwdAotVGhlIEBjb2Rle1RBUkdFVH0gY29tbWFuZCBuYW1lcyB0aGUgQkZEIGZvcm1hdCB0byB1c2Ugd2hlbiByZWFkaW5nIGlucHV0Ci1maWxlcy4gIEl0IGFmZmVjdHMgc3Vic2VxdWVudCBAY29kZXtJTlBVVH0gYW5kIEBjb2Rle0dST1VQfSBjb21tYW5kcy4KLVRoaXMgY29tbWFuZCBpcyBsaWtlIHVzaW5nIEBzYW1wey1iIEB2YXJ7YmZkbmFtZX19IG9uIHRoZSBjb21tYW5kIGxpbmUKLShAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZCBMaW5lIE9wdGlvbnN9KS4gIElmIHRoZSBAY29kZXtUQVJHRVR9IGNvbW1hbmQKLWlzIHVzZWQgYnV0IEBjb2Rle09VVFBVVF9GT1JNQVR9IGlzIG5vdCwgdGhlbiB0aGUgbGFzdCBAY29kZXtUQVJHRVR9Ci1jb21tYW5kIGlzIGFsc28gdXNlZCB0byBzZXQgdGhlIGZvcm1hdCBmb3IgdGhlIG91dHB1dCBmaWxlLiAgQHhyZWZ7QkZEfS4KLUBlbmQgdGFibGUKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBNaXNjZWxsYW5lb3VzIENvbW1hbmRzCi1Ac3Vic2VjdGlvbiBPdGhlciBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzCi1UaGVyZSBhcmUgYSBmZXcgb3RoZXIgbGlua2VyIHNjcmlwdHMgY29tbWFuZHMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gQVNTRVJUKEB2YXJ7ZXhwfSwgQHZhcnttZXNzYWdlfSkKLUBraW5kZXggQVNTRVJUCi1AY2luZGV4IGFzc2VydGlvbiBpbiBsaW5rZXIgc2NyaXB0Ci1FbnN1cmUgdGhhdCBAdmFye2V4cH0gaXMgbm9uLXplcm8uICBJZiBpdCBpcyB6ZXJvLCB0aGVuIGV4aXQgdGhlIGxpbmtlcgotd2l0aCBhbiBlcnJvciBjb2RlLCBhbmQgcHJpbnQgQHZhcnttZXNzYWdlfS4KLQotQGl0ZW0gRVhURVJOKEB2YXJ7c3ltYm9sfSBAdmFye3N5bWJvbH0gQGRvdHN7fSkKLUBraW5kZXggRVhURVJOCi1AY2luZGV4IHVuZGVmaW5lZCBzeW1ib2wgaW4gbGlua2VyIHNjcmlwdAotRm9yY2UgQHZhcntzeW1ib2x9IHRvIGJlIGVudGVyZWQgaW4gdGhlIG91dHB1dCBmaWxlIGFzIGFuIHVuZGVmaW5lZAotc3ltYm9sLiAgRG9pbmcgdGhpcyBtYXksIGZvciBleGFtcGxlLCB0cmlnZ2VyIGxpbmtpbmcgb2YgYWRkaXRpb25hbAotbW9kdWxlcyBmcm9tIHN0YW5kYXJkIGxpYnJhcmllcy4gIFlvdSBtYXkgbGlzdCBzZXZlcmFsIEB2YXJ7c3ltYm9sfXMgZm9yCi1lYWNoIEBjb2Rle0VYVEVSTn0sIGFuZCB5b3UgbWF5IHVzZSBAY29kZXtFWFRFUk59IG11bHRpcGxlIHRpbWVzLiAgVGhpcwotY29tbWFuZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHRoZSBAc2FtcHstdX0gY29tbWFuZC1saW5lIG9wdGlvbi4KLQotQGl0ZW0gRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04KLUBraW5kZXggRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04KLUBjaW5kZXggY29tbW9uIGFsbG9jYXRpb24gaW4gbGlua2VyIHNjcmlwdAotVGhpcyBjb21tYW5kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgdGhlIEBzYW1wey1kfSBjb21tYW5kLWxpbmUgb3B0aW9uOgotdG8gbWFrZSBAY29kZXtsZH0gYXNzaWduIHNwYWNlIHRvIGNvbW1vbiBzeW1ib2xzIGV2ZW4gaWYgYSByZWxvY2F0YWJsZQotb3V0cHV0IGZpbGUgaXMgc3BlY2lmaWVkIChAc2FtcHstcn0pLgotCi1AaXRlbSBOT0NST1NTUkVGUyhAdmFye3NlY3Rpb259IEB2YXJ7c2VjdGlvbn0gQGRvdHN7fSkKLUBraW5kZXggTk9DUk9TU1JFRlMoQHZhcntzZWN0aW9uc30pCi1AY2luZGV4IGNyb3NzIHJlZmVyZW5jZXMKLVRoaXMgY29tbWFuZCBtYXkgYmUgdXNlZCB0byB0ZWxsIEBjb2Rle2xkfSB0byBpc3N1ZSBhbiBlcnJvciBhYm91dCBhbnkKLXJlZmVyZW5jZXMgYW1vbmcgY2VydGFpbiBvdXRwdXQgc2VjdGlvbnMuCi0KLUluIGNlcnRhaW4gdHlwZXMgb2YgcHJvZ3JhbXMsIHBhcnRpY3VsYXJseSBvbiBlbWJlZGRlZCBzeXN0ZW1zIHdoZW4KLXVzaW5nIG92ZXJsYXlzLCB3aGVuIG9uZSBzZWN0aW9uIGlzIGxvYWRlZCBpbnRvIG1lbW9yeSwgYW5vdGhlciBzZWN0aW9uCi13aWxsIG5vdCBiZS4gIEFueSBkaXJlY3QgcmVmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gc2VjdGlvbnMgd291bGQgYmUKLWVycm9ycy4gIEZvciBleGFtcGxlLCBpdCB3b3VsZCBiZSBhbiBlcnJvciBpZiBjb2RlIGluIG9uZSBzZWN0aW9uIGNhbGxlZAotYSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZSBvdGhlciBzZWN0aW9uLgotCi1UaGUgQGNvZGV7Tk9DUk9TU1JFRlN9IGNvbW1hbmQgdGFrZXMgYSBsaXN0IG9mIG91dHB1dCBzZWN0aW9uIG5hbWVzLiAgSWYKLUBjb2Rle2xkfSBkZXRlY3RzIGFueSBjcm9zcyByZWZlcmVuY2VzIGJldHdlZW4gdGhlIHNlY3Rpb25zLCBpdCByZXBvcnRzCi1hbiBlcnJvciBhbmQgcmV0dXJucyBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzLiAgTm90ZSB0aGF0IHRoZQotQGNvZGV7Tk9DUk9TU1JFRlN9IGNvbW1hbmQgdXNlcyBvdXRwdXQgc2VjdGlvbiBuYW1lcywgbm90IGlucHV0IHNlY3Rpb24KLW5hbWVzLgotCi1AaWZjbGVhciBTaW5nbGVGb3JtYXQKLUBpdGVtIE9VVFBVVF9BUkNIKEB2YXJ7YmZkYXJjaH0pCi1Aa2luZGV4IE9VVFBVVF9BUkNIKEB2YXJ7YmZkYXJjaH0pCi1AY2luZGV4IG1hY2hpbmUgYXJjaGl0ZWN0dXJlCi1AY2luZGV4IGFyY2hpdGVjdHVyZQotU3BlY2lmeSBhIHBhcnRpY3VsYXIgb3V0cHV0IG1hY2hpbmUgYXJjaGl0ZWN0dXJlLiAgVGhlIGFyZ3VtZW50IGlzIG9uZQotb2YgdGhlIG5hbWVzIHVzZWQgYnkgdGhlIEJGRCBsaWJyYXJ5IChAcHhyZWZ7QkZEfSkuICBZb3UgY2FuIHNlZSB0aGUKLWFyY2hpdGVjdHVyZSBvZiBhbiBvYmplY3QgZmlsZSBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0gcHJvZ3JhbSB3aXRoCi10aGUgQHNhbXB7LWZ9IG9wdGlvbi4KLUBlbmQgaWZjbGVhcgotQGVuZCB0YWJsZQotCi1Abm9kZSBBc3NpZ25tZW50cwotQHNlY3Rpb24gQXNzaWduaW5nIFZhbHVlcyB0byBTeW1ib2xzCi1AY2luZGV4IGFzc2lnbm1lbnQgaW4gc2NyaXB0cwotQGNpbmRleCBzeW1ib2wgZGVmaW5pdGlvbiwgc2NyaXB0cwotQGNpbmRleCB2YXJpYWJsZXMsIGRlZmluaW5nCi1Zb3UgbWF5IGFzc2lnbiBhIHZhbHVlIHRvIGEgc3ltYm9sIGluIGEgbGlua2VyIHNjcmlwdC4gIFRoaXMgd2lsbCBkZWZpbmUKLXRoZSBzeW1ib2wgYXMgYSBnbG9iYWwgc3ltYm9sLgotCi1AbWVudQotKiBTaW1wbGUgQXNzaWdubWVudHM6OgkJU2ltcGxlIEFzc2lnbm1lbnRzCi0qIFBST1ZJREU6OgkJCVBST1ZJREUKLUBlbmQgbWVudQotCi1Abm9kZSBTaW1wbGUgQXNzaWdubWVudHMKLUBzdWJzZWN0aW9uIFNpbXBsZSBBc3NpZ25tZW50cwotCi1Zb3UgbWF5IGFzc2lnbiB0byBhIHN5bWJvbCB1c2luZyBhbnkgb2YgdGhlIEMgYXNzaWdubWVudCBvcGVyYXRvcnM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gQHZhcntzeW1ib2x9ID0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9ICs9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSAtPSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gKj0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9IC89IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSA8PD0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9ID4+PSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gJj0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9IHw9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGVuZCB0YWJsZQotCi1UaGUgZmlyc3QgY2FzZSB3aWxsIGRlZmluZSBAdmFye3N5bWJvbH0gdG8gdGhlIHZhbHVlIG9mCi1AdmFye2V4cHJlc3Npb259LiAgSW4gdGhlIG90aGVyIGNhc2VzLCBAdmFye3N5bWJvbH0gbXVzdCBhbHJlYWR5IGJlCi1kZWZpbmVkLCBhbmQgdGhlIHZhbHVlIHdpbGwgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuCi0KLVRoZSBzcGVjaWFsIHN5bWJvbCBuYW1lIEBzYW1wey59IGluZGljYXRlcyB0aGUgbG9jYXRpb24gY291bnRlci4gIFlvdQotbWF5IG9ubHkgdXNlIHRoaXMgd2l0aGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQuCi0KLVRoZSBzZW1pY29sb24gYWZ0ZXIgQHZhcntleHByZXNzaW9ufSBpcyByZXF1aXJlZC4KLQotRXhwcmVzc2lvbnMgYXJlIGRlZmluZWQgYmVsb3c7IHNlZSBAcmVme0V4cHJlc3Npb25zfS4KLQotWW91IG1heSB3cml0ZSBzeW1ib2wgYXNzaWdubWVudHMgYXMgY29tbWFuZHMgaW4gdGhlaXIgb3duIHJpZ2h0LCBvciBhcwotc3RhdGVtZW50cyB3aXRoaW4gYSBAY29kZXtTRUNUSU9OU30gY29tbWFuZCwgb3IgYXMgcGFydCBvZiBhbiBvdXRwdXQKLXNlY3Rpb24gZGVzY3JpcHRpb24gaW4gYSBAY29kZXtTRUNUSU9OU30gY29tbWFuZC4KLQotVGhlIHNlY3Rpb24gb2YgdGhlIHN5bWJvbCB3aWxsIGJlIHNldCBmcm9tIHRoZSBzZWN0aW9uIG9mIHRoZQotZXhwcmVzc2lvbjsgZm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBAcmVme0V4cHJlc3Npb24gU2VjdGlvbn0uCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBzaG93aW5nIHRoZSB0aHJlZSBkaWZmZXJlbnQgcGxhY2VzIHRoYXQgc3ltYm9sCi1hc3NpZ25tZW50cyBtYXkgYmUgdXNlZDoKLQotQHNtYWxsZXhhbXBsZQotZmxvYXRpbmdfcG9pbnQgPSAwOwotU0VDVElPTlMKLUB7Ci0gIC50ZXh0IDoKLSAgICBAewotICAgICAgKigudGV4dCkKLSAgICAgIF9ldGV4dCA9IC47Ci0gICAgQH0KLSAgX2JkYXRhID0gKC4gKyAzKSAmIH4gNDsKLSAgLmRhdGEgOiBAeyAqKC5kYXRhKSBAfQotQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLUluIHRoaXMgZXhhbXBsZSwgdGhlIHN5bWJvbCBAc2FtcHtmbG9hdGluZ19wb2ludH0gd2lsbCBiZSBkZWZpbmVkIGFzCi16ZXJvLiAgVGhlIHN5bWJvbCBAc2FtcHtfZXRleHR9IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgYWRkcmVzcyBmb2xsb3dpbmcKLXRoZSBsYXN0IEBzYW1wey50ZXh0fSBpbnB1dCBzZWN0aW9uLiAgVGhlIHN5bWJvbCBAc2FtcHtfYmRhdGF9IHdpbGwgYmUKLWRlZmluZWQgYXMgdGhlIGFkZHJlc3MgZm9sbG93aW5nIHRoZSBAc2FtcHsudGV4dH0gb3V0cHV0IHNlY3Rpb24gYWxpZ25lZAotdXB3YXJkIHRvIGEgNCBieXRlIGJvdW5kYXJ5LgotCi1Abm9kZSBQUk9WSURFCi1Ac3Vic2VjdGlvbiBQUk9WSURFCi1AY2luZGV4IFBST1ZJREUKLUluIHNvbWUgY2FzZXMsIGl0IGlzIGRlc2lyYWJsZSBmb3IgYSBsaW5rZXIgc2NyaXB0IHRvIGRlZmluZSBhIHN5bWJvbAotb25seSBpZiBpdCBpcyByZWZlcmVuY2VkIGFuZCBpcyBub3QgZGVmaW5lZCBieSBhbnkgb2JqZWN0IGluY2x1ZGVkIGluCi10aGUgbGluay4gIEZvciBleGFtcGxlLCB0cmFkaXRpb25hbCBsaW5rZXJzIGRlZmluZWQgdGhlIHN5bWJvbAotQHNhbXB7ZXRleHR9LiAgSG93ZXZlciwgQU5TSSBDIHJlcXVpcmVzIHRoYXQgdGhlIHVzZXIgYmUgYWJsZSB0byB1c2UKLUBzYW1we2V0ZXh0fSBhcyBhIGZ1bmN0aW9uIG5hbWUgd2l0aG91dCBlbmNvdW50ZXJpbmcgYW4gZXJyb3IuICBUaGUKLUBjb2Rle1BST1ZJREV9IGtleXdvcmQgbWF5IGJlIHVzZWQgdG8gZGVmaW5lIGEgc3ltYm9sLCBzdWNoIGFzCi1Ac2FtcHtldGV4dH0sIG9ubHkgaWYgaXQgaXMgcmVmZXJlbmNlZCBidXQgbm90IGRlZmluZWQuICBUaGUgc3ludGF4IGlzCi1AY29kZXtQUk9WSURFKEB2YXJ7c3ltYm9sfSA9IEB2YXJ7ZXhwcmVzc2lvbn0pfS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIEBjb2Rle1BST1ZJREV9IHRvIGRlZmluZSBAc2FtcHtldGV4dH06Ci1Ac21hbGxleGFtcGxlCi1TRUNUSU9OUwotQHsKLSAgLnRleHQgOgotICAgIEB7Ci0gICAgICAqKC50ZXh0KQotICAgICAgX2V0ZXh0ID0gLjsKLSAgICAgIFBST1ZJREUoZXRleHQgPSAuKTsKLSAgICBAfQotQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUluIHRoaXMgZXhhbXBsZSwgaWYgdGhlIHByb2dyYW0gZGVmaW5lcyBAc2FtcHtfZXRleHR9ICh3aXRoIGEgbGVhZGluZwotdW5kZXJzY29yZSksIHRoZSBsaW5rZXIgd2lsbCBnaXZlIGEgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gIElmLCBvbgotdGhlIG90aGVyIGhhbmQsIHRoZSBwcm9ncmFtIGRlZmluZXMgQHNhbXB7ZXRleHR9ICh3aXRoIG5vIGxlYWRpbmcKLXVuZGVyc2NvcmUpLCB0aGUgbGlua2VyIHdpbGwgc2lsZW50bHkgdXNlIHRoZSBkZWZpbml0aW9uIGluIHRoZSBwcm9ncmFtLgotSWYgdGhlIHByb2dyYW0gcmVmZXJlbmNlcyBAc2FtcHtldGV4dH0gYnV0IGRvZXMgbm90IGRlZmluZSBpdCwgdGhlCi1saW5rZXIgd2lsbCB1c2UgdGhlIGRlZmluaXRpb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLUBub2RlIFNFQ1RJT05TCi1Ac2VjdGlvbiBTRUNUSU9OUyBjb21tYW5kCi1Aa2luZGV4IFNFQ1RJT05TCi1UaGUgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQgdGVsbHMgdGhlIGxpbmtlciBob3cgdG8gbWFwIGlucHV0IHNlY3Rpb25zCi1pbnRvIG91dHB1dCBzZWN0aW9ucywgYW5kIGhvdyB0byBwbGFjZSB0aGUgb3V0cHV0IHNlY3Rpb25zIGluIG1lbW9yeS4KLQotVGhlIGZvcm1hdCBvZiB0aGUgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQgaXM6Ci1Ac21hbGxleGFtcGxlCi1TRUNUSU9OUwotQHsKLSAgQHZhcntzZWN0aW9ucy1jb21tYW5kfQotICBAdmFye3NlY3Rpb25zLWNvbW1hbmR9Ci0gIEBkb3Rze30KLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1FYWNoIEB2YXJ7c2VjdGlvbnMtY29tbWFuZH0gbWF5IG9mIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotYW4gQGNvZGV7RU5UUll9IGNvbW1hbmQgKEBweHJlZntFbnRyeSBQb2ludCwsRW50cnkgY29tbWFuZH0pCi1AaXRlbQotYSBzeW1ib2wgYXNzaWdubWVudCAoQHB4cmVme0Fzc2lnbm1lbnRzfSkKLUBpdGVtCi1hbiBvdXRwdXQgc2VjdGlvbiBkZXNjcmlwdGlvbgotQGl0ZW0KLWFuIG92ZXJsYXkgZGVzY3JpcHRpb24KLUBlbmQgaXRlbWl6ZQotCi1UaGUgQGNvZGV7RU5UUll9IGNvbW1hbmQgYW5kIHN5bWJvbCBhc3NpZ25tZW50cyBhcmUgcGVybWl0dGVkIGluc2lkZSB0aGUKLUBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGZvciBjb252ZW5pZW5jZSBpbiB1c2luZyB0aGUgbG9jYXRpb24gY291bnRlciBpbgotdGhvc2UgY29tbWFuZHMuICBUaGlzIGNhbiBhbHNvIG1ha2UgdGhlIGxpbmtlciBzY3JpcHQgZWFzaWVyIHRvCi11bmRlcnN0YW5kIGJlY2F1c2UgeW91IGNhbiB1c2UgdGhvc2UgY29tbWFuZHMgYXQgbWVhbmluZ2Z1bCBwb2ludHMgaW4KLXRoZSBsYXlvdXQgb2YgdGhlIG91dHB1dCBmaWxlLgotCi1PdXRwdXQgc2VjdGlvbiBkZXNjcmlwdGlvbnMgYW5kIG92ZXJsYXkgZGVzY3JpcHRpb25zIGFyZSBkZXNjcmliZWQKLWJlbG93LgotCi1JZiB5b3UgZG8gbm90IHVzZSBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGluIHlvdXIgbGlua2VyIHNjcmlwdCwgdGhlCi1saW5rZXIgd2lsbCBwbGFjZSBlYWNoIGlucHV0IHNlY3Rpb24gaW50byBhbiBpZGVudGljYWxseSBuYW1lZCBvdXRwdXQKLXNlY3Rpb24gaW4gdGhlIG9yZGVyIHRoYXQgdGhlIHNlY3Rpb25zIGFyZSBmaXJzdCBlbmNvdW50ZXJlZCBpbiB0aGUKLWlucHV0IGZpbGVzLiAgSWYgYWxsIGlucHV0IHNlY3Rpb25zIGFyZSBwcmVzZW50IGluIHRoZSBmaXJzdCBmaWxlLCBmb3IKLWV4YW1wbGUsIHRoZSBvcmRlciBvZiBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IGZpbGUgd2lsbCBtYXRjaCB0aGUgb3JkZXIKLWluIHRoZSBmaXJzdCBpbnB1dCBmaWxlLiAgVGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBhdCBhZGRyZXNzIHplcm8uCi0KLUBtZW51Ci0qIE91dHB1dCBTZWN0aW9uIERlc2NyaXB0aW9uOjoJT3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KLSogT3V0cHV0IFNlY3Rpb24gTmFtZTo6CQlPdXRwdXQgc2VjdGlvbiBuYW1lCi0qIE91dHB1dCBTZWN0aW9uIEFkZHJlc3M6OglPdXRwdXQgc2VjdGlvbiBhZGRyZXNzCi0qIElucHV0IFNlY3Rpb246OgkJSW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbgotKiBPdXRwdXQgU2VjdGlvbiBEYXRhOjoJCU91dHB1dCBzZWN0aW9uIGRhdGEKLSogT3V0cHV0IFNlY3Rpb24gS2V5d29yZHM6OglPdXRwdXQgc2VjdGlvbiBrZXl3b3JkcwotKiBPdXRwdXQgU2VjdGlvbiBEaXNjYXJkaW5nOjoJT3V0cHV0IHNlY3Rpb24gZGlzY2FyZGluZwotKiBPdXRwdXQgU2VjdGlvbiBBdHRyaWJ1dGVzOjoJT3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlcwotKiBPdmVybGF5IERlc2NyaXB0aW9uOjoJCU92ZXJsYXkgZGVzY3JpcHRpb24KLUBlbmQgbWVudQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBEZXNjcmlwdGlvbgotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KLVRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGFuIG91dHB1dCBzZWN0aW9uIGxvb2tzIGxpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLUBncm91cCAKLUB2YXJ7c2VjdGlvbn0gW0B2YXJ7YWRkcmVzc31dIFsoQHZhcnt0eXBlfSldIDogW0FUKEB2YXJ7bG1hfSldCi0gIEB7Ci0gICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQotICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICBAZG90c3t9Ci0gIEB9IFs+QHZhcntyZWdpb259XSBbOkB2YXJ7cGhkcn0gOkB2YXJ7cGhkcn0gQGRvdHN7fV0gWz1AdmFye2ZpbGxleHB9XQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotTW9zdCBvdXRwdXQgc2VjdGlvbnMgZG8gbm90IHVzZSBtb3N0IG9mIHRoZSBvcHRpb25hbCBzZWN0aW9uIGF0dHJpYnV0ZXMuCi0KLVRoZSB3aGl0ZXNwYWNlIGFyb3VuZCBAdmFye3NlY3Rpb259IGlzIHJlcXVpcmVkLCBzbyB0aGF0IHRoZSBzZWN0aW9uCi1uYW1lIGlzIHVuYW1iaWd1b3VzLiAgVGhlIGNvbG9uIGFuZCB0aGUgY3VybHkgYnJhY2VzIGFyZSBhbHNvIHJlcXVpcmVkLgotVGhlIGxpbmUgYnJlYWtzIGFuZCBvdGhlciB3aGl0ZSBzcGFjZSBhcmUgb3B0aW9uYWwuCi0KLUVhY2ggQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfSBtYXkgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1hIHN5bWJvbCBhc3NpZ25tZW50IChAcHhyZWZ7QXNzaWdubWVudHN9KQotQGl0ZW0KLWFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24gKEBweHJlZntJbnB1dCBTZWN0aW9ufSkKLUBpdGVtCi1kYXRhIHZhbHVlcyB0byBpbmNsdWRlIGRpcmVjdGx5IChAcHhyZWZ7T3V0cHV0IFNlY3Rpb24gRGF0YX0pCi1AaXRlbQotYSBzcGVjaWFsIG91dHB1dCBzZWN0aW9uIGtleXdvcmQgKEBweHJlZntPdXRwdXQgU2VjdGlvbiBLZXl3b3Jkc30pCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gTmFtZQotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gbmFtZQotQGNpbmRleCBuYW1lLCBzZWN0aW9uCi1AY2luZGV4IHNlY3Rpb24gbmFtZQotVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBzZWN0aW9uIGlzIEB2YXJ7c2VjdGlvbn0uICBAdmFye3NlY3Rpb259IG11c3QKLW1lZXQgdGhlIGNvbnN0cmFpbnRzIG9mIHlvdXIgb3V0cHV0IGZvcm1hdC4gIEluIGZvcm1hdHMgd2hpY2ggb25seQotc3VwcG9ydCBhIGxpbWl0ZWQgbnVtYmVyIG9mIHNlY3Rpb25zLCBzdWNoIGFzIEBjb2Rle2Eub3V0fSwgdGhlIG5hbWUKLW11c3QgYmUgb25lIG9mIHRoZSBuYW1lcyBzdXBwb3J0ZWQgYnkgdGhlIGZvcm1hdCAoQGNvZGV7YS5vdXR9LCBmb3IKLWV4YW1wbGUsIGFsbG93cyBvbmx5IEBzYW1wey50ZXh0fSwgQHNhbXB7LmRhdGF9IG9yIEBzYW1wey5ic3N9KS4gSWYgdGhlCi1vdXRwdXQgZm9ybWF0IHN1cHBvcnRzIGFueSBudW1iZXIgb2Ygc2VjdGlvbnMsIGJ1dCB3aXRoIG51bWJlcnMgYW5kIG5vdAotbmFtZXMgKGFzIGlzIHRoZSBjYXNlIGZvciBPYXN5cyksIHRoZSBuYW1lIHNob3VsZCBiZSBzdXBwbGllZCBhcyBhCi1xdW90ZWQgbnVtZXJpYyBzdHJpbmcuICBBIHNlY3Rpb24gbmFtZSBtYXkgY29uc2lzdCBvZiBhbnkgc2VxdWVuY2Ugb2YKLWNoYXJhY3RlcnMsIGJ1dCBhIG5hbWUgd2hpY2ggY29udGFpbnMgYW55IHVudXN1YWwgY2hhcmFjdGVycyBzdWNoIGFzCi1jb21tYXMgbXVzdCBiZSBxdW90ZWQuCi0KLVRoZSBvdXRwdXQgc2VjdGlvbiBuYW1lIEBzYW1wey9ESVNDQVJEL30gaXMgc3BlY2lhbDsgQHJlZntPdXRwdXQgU2VjdGlvbgotRGlzY2FyZGluZ30uCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIEFkZHJlc3MKLUBzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIGFkZHJlc3MKLUBjaW5kZXggYWRkcmVzcywgc2VjdGlvbgotQGNpbmRleCBzZWN0aW9uIGFkZHJlc3MKLVRoZSBAdmFye2FkZHJlc3N9IGlzIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBWTUEgKHRoZSB2aXJ0dWFsIG1lbW9yeQotYWRkcmVzcykgb2YgdGhlIG91dHB1dCBzZWN0aW9uLiAgSWYgeW91IGRvIG5vdCBwcm92aWRlIEB2YXJ7YWRkcmVzc30sCi10aGUgbGlua2VyIHdpbGwgc2V0IGl0IGJhc2VkIG9uIEB2YXJ7cmVnaW9ufSBpZiBwcmVzZW50LCBvciBvdGhlcndpc2UKLWJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyLgotCi1JZiB5b3UgcHJvdmlkZSBAdmFye2FkZHJlc3N9LCB0aGUgYWRkcmVzcyBvZiB0aGUgb3V0cHV0IHNlY3Rpb24gd2lsbCBiZQotc2V0IHRvIHByZWNpc2VseSB0aGF0LiAgSWYgeW91IHByb3ZpZGUgbmVpdGhlciBAdmFye2FkZHJlc3N9IG5vcgotQHZhcntyZWdpb259LCB0aGVuIHRoZSBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiB3aWxsIGJlIHNldCB0byB0aGUKLWN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgYWxpZ25lZCB0byB0aGUgYWxpZ25tZW50Ci1yZXF1aXJlbWVudHMgb2YgdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBvZiB0aGUKLW91dHB1dCBzZWN0aW9uIGlzIHRoZSBzdHJpY3Rlc3QgYWxpZ25tZW50IG9mIGFueSBpbnB1dCBzZWN0aW9uIGNvbnRhaW5lZAotd2l0aGluIHRoZSBvdXRwdXQgc2VjdGlvbi4KLQotRm9yIGV4YW1wbGUsCi1Ac21hbGxleGFtcGxlCi0udGV4dCAuIDogQHsgKigudGV4dCkgQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLWFuZAotQHNtYWxsZXhhbXBsZQotLnRleHQgOiBAeyAqKC50ZXh0KSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotYXJlIHN1YnRseSBkaWZmZXJlbnQuICBUaGUgZmlyc3Qgd2lsbCBzZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCi1Ac2FtcHsudGV4dH0gb3V0cHV0IHNlY3Rpb24gdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uCi1jb3VudGVyLiAgVGhlIHNlY29uZCB3aWxsIHNldCBpdCB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24KLWNvdW50ZXIgYWxpZ25lZCB0byB0aGUgc3RyaWN0ZXN0IGFsaWdubWVudCBvZiBhIEBzYW1wey50ZXh0fSBpbnB1dAotc2VjdGlvbi4KLQotVGhlIEB2YXJ7YWRkcmVzc30gbWF5IGJlIGFuIGFyYml0cmFyeSBleHByZXNzaW9uOyBAcmVme0V4cHJlc3Npb25zfS4KLUZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBhbGlnbiB0aGUgc2VjdGlvbiBvbiBhIDB4MTAgYnl0ZSBib3VuZGFyeSwKLXNvIHRoYXQgdGhlIGxvd2VzdCBmb3VyIGJpdHMgb2YgdGhlIHNlY3Rpb24gYWRkcmVzcyBhcmUgemVybywgeW91IGNvdWxkCi1kbyBzb21ldGhpbmcgbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotLnRleHQgQUxJR04oMHgxMCkgOiBAeyAqKC50ZXh0KSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhpcyB3b3JrcyBiZWNhdXNlIEBjb2Rle0FMSUdOfSByZXR1cm5zIHRoZSBjdXJyZW50IGxvY2F0aW9uIGNvdW50ZXIKLWFsaWduZWQgdXB3YXJkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0KLVNwZWNpZnlpbmcgQHZhcnthZGRyZXNzfSBmb3IgYSBzZWN0aW9uIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUKLWxvY2F0aW9uIGNvdW50ZXIuCi0KLUBub2RlIElucHV0IFNlY3Rpb24KLUBzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KLUBjaW5kZXggaW5wdXQgc2VjdGlvbnMKLUBjaW5kZXggbWFwcGluZyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMKLVRoZSBtb3N0IGNvbW1vbiBvdXRwdXQgc2VjdGlvbiBjb21tYW5kIGlzIGFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24uCi0KLVRoZSBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIGlzIHRoZSBtb3N0IGJhc2ljIGxpbmtlciBzY3JpcHQgb3BlcmF0aW9uLgotWW91IHVzZSBvdXRwdXQgc2VjdGlvbnMgdG8gdGVsbCB0aGUgbGlua2VyIGhvdyB0byBsYXkgb3V0IHlvdXIgcHJvZ3JhbQotaW4gbWVtb3J5LiAgWW91IHVzZSBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9ucyB0byB0ZWxsIHRoZSBsaW5rZXIgaG93IHRvCi1tYXAgdGhlIGlucHV0IGZpbGVzIGludG8geW91ciBtZW1vcnkgbGF5b3V0LgotCi1AbWVudQotKiBJbnB1dCBTZWN0aW9uIEJhc2ljczo6CUlucHV0IHNlY3Rpb24gYmFzaWNzCi0qIElucHV0IFNlY3Rpb24gV2lsZGNhcmRzOjoJSW5wdXQgc2VjdGlvbiB3aWxkY2FyZCBwYXR0ZXJucwotKiBJbnB1dCBTZWN0aW9uIENvbW1vbjo6CUlucHV0IHNlY3Rpb24gZm9yIGNvbW1vbiBzeW1ib2xzCi0qIElucHV0IFNlY3Rpb24gS2VlcDo6CQlJbnB1dCBzZWN0aW9uIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24KLSogSW5wdXQgU2VjdGlvbiBFeGFtcGxlOjoJSW5wdXQgc2VjdGlvbiBleGFtcGxlCi1AZW5kIG1lbnUKLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBCYXNpY3MKLUBzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gYmFzaWNzCi1AY2luZGV4IGlucHV0IHNlY3Rpb24gYmFzaWNzCi1BbiBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIGNvbnNpc3RzIG9mIGEgZmlsZSBuYW1lIG9wdGlvbmFsbHkgZm9sbG93ZWQKLWJ5IGEgbGlzdCBvZiBzZWN0aW9uIG5hbWVzIGluIHBhcmVudGhlc2VzLgotCi1UaGUgZmlsZSBuYW1lIGFuZCB0aGUgc2VjdGlvbiBuYW1lIG1heSBiZSB3aWxkY2FyZCBwYXR0ZXJucywgd2hpY2ggd2UKLWRlc2NyaWJlIGZ1cnRoZXIgYmVsb3cgKEBweHJlZntJbnB1dCBTZWN0aW9uIFdpbGRjYXJkc30pLgotCi1UaGUgbW9zdCBjb21tb24gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiBpcyB0byBpbmNsdWRlIGFsbCBpbnB1dAotc2VjdGlvbnMgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICBGb3IgZXhhbXBsZSwgdG8KLWluY2x1ZGUgYWxsIGlucHV0IEBzYW1wey50ZXh0fSBzZWN0aW9ucywgeW91IHdvdWxkIHdyaXRlOgotQHNtYWxsZXhhbXBsZQotKigudGV4dCkKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLUhlcmUgdGhlIEBzYW1weyp9IGlzIGEgd2lsZGNhcmQgd2hpY2ggbWF0Y2hlcyBhbnkgZmlsZSBuYW1lLiAgVG8gZXhjbHVkZSBhIGZpbGUKLWZyb20gbWF0Y2hpbmcgdGhlIGZpbGUgbmFtZSB3aWxkY2FyZCwgRVhDTFVERV9GSUxFIG1heSBiZSB1c2VkIHRvIG1hdGNoIGFsbCBmaWxlcwotZXhjZXB0IHRoZSBvbmUgc3BlY2lmaWVkIGJ5IEVYQ0xVREVfRklMRS4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCi1AZW5kIHNtYWxsZXhhbXBsZQotd2lsbCBjYXVzZSBhbGwgLmN0b3JzIHNlY3Rpb25zIGZyb20gYWxsIGZpbGVzIGV4Y2VwdCBjcnRlbmQubyB0byBiZSBpbmNsdWRlZC4KLQotVGhlcmUgYXJlIHR3byB3YXlzIHRvIGluY2x1ZGUgbW9yZSB0aGFuIG9uZSBzZWN0aW9uOgotQHNtYWxsZXhhbXBsZQotKigudGV4dCAucmRhdGEpCi0qKC50ZXh0KSAqKC5yZGF0YSkKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBAc2FtcHsudGV4dH0gYW5kCi1Ac2FtcHsucmRhdGF9IGlucHV0IHNlY3Rpb25zIHdpbGwgYXBwZWFyIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gIEluIHRoZQotZmlyc3QgZXhhbXBsZSwgdGhleSB3aWxsIGJlIGludGVybWluZ2xlZC4gIEluIHRoZSBzZWNvbmQgZXhhbXBsZSwgYWxsCi1Ac2FtcHsudGV4dH0gaW5wdXQgc2VjdGlvbnMgd2lsbCBhcHBlYXIgZmlyc3QsIGZvbGxvd2VkIGJ5IGFsbAotQHNhbXB7LnJkYXRhfSBpbnB1dCBzZWN0aW9ucy4KLQotWW91IGNhbiBzcGVjaWZ5IGEgZmlsZSBuYW1lIHRvIGluY2x1ZGUgc2VjdGlvbnMgZnJvbSBhIHBhcnRpY3VsYXIgZmlsZS4KLVlvdSB3b3VsZCBkbyB0aGlzIGlmIG9uZSBvciBtb3JlIG9mIHlvdXIgZmlsZXMgY29udGFpbiBzcGVjaWFsIGRhdGEgdGhhdAotbmVlZHMgdG8gYmUgYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIGluIG1lbW9yeS4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotZGF0YS5vKC5kYXRhKQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgeW91IHVzZSBhIGZpbGUgbmFtZSB3aXRob3V0IGEgbGlzdCBvZiBzZWN0aW9ucywgdGhlbiBhbGwgc2VjdGlvbnMgaW4KLXRoZSBpbnB1dCBmaWxlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhpcyBpcyBub3QKLWNvbW1vbmx5IGRvbmUsIGJ1dCBpdCBtYXkgYnkgdXNlZnVsIG9uIG9jY2FzaW9uLiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi1kYXRhLm8KLUBlbmQgc21hbGxleGFtcGxlCi0KLVdoZW4geW91IHVzZSBhIGZpbGUgbmFtZSB3aGljaCBkb2VzIG5vdCBjb250YWluIGFueSB3aWxkIGNhcmQKLWNoYXJhY3RlcnMsIHRoZSBsaW5rZXIgd2lsbCBmaXJzdCBzZWUgaWYgeW91IGFsc28gc3BlY2lmaWVkIHRoZSBmaWxlCi1uYW1lIG9uIHRoZSBsaW5rZXIgY29tbWFuZCBsaW5lIG9yIGluIGFuIEBjb2Rle0lOUFVUfSBjb21tYW5kLiAgSWYgeW91Ci1kaWQgbm90LCB0aGUgbGlua2VyIHdpbGwgYXR0ZW1wdCB0byBvcGVuIHRoZSBmaWxlIGFzIGFuIGlucHV0IGZpbGUsIGFzCi10aG91Z2ggaXQgYXBwZWFyZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSBhbgotQGNvZGV7SU5QVVR9IGNvbW1hbmQsIGJlY2F1c2UgdGhlIGxpbmtlciB3aWxsIG5vdCBzZWFyY2ggZm9yIHRoZSBmaWxlIGluCi10aGUgYXJjaGl2ZSBzZWFyY2ggcGF0aC4KLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBXaWxkY2FyZHMKLUBzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gd2lsZGNhcmQgcGF0dGVybnMKLUBjaW5kZXggaW5wdXQgc2VjdGlvbiB3aWxkY2FyZHMKLUBjaW5kZXggd2lsZGNhcmQgZmlsZSBuYW1lIHBhdHRlcm5zCi1AY2luZGV4IGZpbGUgbmFtZSB3aWxkY2FyZCBwYXR0ZXJucwotQGNpbmRleCBzZWN0aW9uIG5hbWUgd2lsZGNhcmQgcGF0dGVybnMKLUluIGFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24sIGVpdGhlciB0aGUgZmlsZSBuYW1lIG9yIHRoZSBzZWN0aW9uCi1uYW1lIG9yIGJvdGggbWF5IGJlIHdpbGRjYXJkIHBhdHRlcm5zLgotCi1UaGUgZmlsZSBuYW1lIG9mIEBzYW1weyp9IHNlZW4gaW4gbWFueSBleGFtcGxlcyBpcyBhIHNpbXBsZSB3aWxkY2FyZAotcGF0dGVybiBmb3IgdGhlIGZpbGUgbmFtZS4KLQotVGhlIHdpbGRjYXJkIHBhdHRlcm5zIGFyZSBsaWtlIHRob3NlIHVzZWQgYnkgdGhlIFVuaXggc2hlbGwuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gKgotbWF0Y2hlcyBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnMKLUBpdGVtID8KLW1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIKLUBpdGVtIFtAdmFye2NoYXJzfV0KLW1hdGNoZXMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgYW55IG9mIHRoZSBAdmFye2NoYXJzfTsgdGhlIEBzYW1wey19Ci1jaGFyYWN0ZXIgbWF5IGJlIHVzZWQgdG8gc3BlY2lmeSBhIHJhbmdlIG9mIGNoYXJhY3RlcnMsIGFzIGluCi1Ac2FtcHtbYS16XX0gdG8gbWF0Y2ggYW55IGxvd2VyIGNhc2UgbGV0dGVyCi1AaXRlbSBcCi1xdW90ZXMgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIKLUBlbmQgdGFibGUKLQotV2hlbiBhIGZpbGUgbmFtZSBpcyBtYXRjaGVkIHdpdGggYSB3aWxkY2FyZCwgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMKLXdpbGwgbm90IG1hdGNoIGEgQHNhbXB7L30gY2hhcmFjdGVyICh1c2VkIHRvIHNlcGFyYXRlIGRpcmVjdG9yeSBuYW1lcyBvbgotVW5peCkuICBBIHBhdHRlcm4gY29uc2lzdGluZyBvZiBhIHNpbmdsZSBAc2FtcHsqfSBjaGFyYWN0ZXIgaXMgYW4KLWV4Y2VwdGlvbjsgaXQgd2lsbCBhbHdheXMgbWF0Y2ggYW55IGZpbGUgbmFtZSwgd2hldGhlciBpdCBjb250YWlucyBhCi1Ac2FtcHsvfSBvciBub3QuICBJbiBhIHNlY3Rpb24gbmFtZSwgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMgd2lsbCBtYXRjaAotYSBAc2FtcHsvfSBjaGFyYWN0ZXIuCi0KLUZpbGUgbmFtZSB3aWxkY2FyZCBwYXR0ZXJucyBvbmx5IG1hdGNoIGZpbGVzIHdoaWNoIGFyZSBleHBsaWNpdGx5Ci1zcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBpbiBhbiBAY29kZXtJTlBVVH0gY29tbWFuZC4gIFRoZSBsaW5rZXIKLWRvZXMgbm90IHNlYXJjaCBkaXJlY3RvcmllcyB0byBleHBhbmQgd2lsZGNhcmRzLgotCi1JZiBhIGZpbGUgbmFtZSBtYXRjaGVzIG1vcmUgdGhhbiBvbmUgd2lsZGNhcmQgcGF0dGVybiwgb3IgaWYgYSBmaWxlIG5hbWUKLWFwcGVhcnMgZXhwbGljaXRseSBhbmQgaXMgYWxzbyBtYXRjaGVkIGJ5IGEgd2lsZGNhcmQgcGF0dGVybiwgdGhlIGxpbmtlcgotd2lsbCB1c2UgdGhlIGZpcnN0IG1hdGNoIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgRm9yIGV4YW1wbGUsIHRoaXMKLXNlcXVlbmNlIG9mIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb25zIGlzIHByb2JhYmx5IGluIGVycm9yLCBiZWNhdXNlIHRoZQotQGZpbGV7ZGF0YS5vfSBydWxlIHdpbGwgbm90IGJlIHVzZWQ6Ci1Ac21hbGxleGFtcGxlCi0uZGF0YSA6IEB7ICooLmRhdGEpIEB9Ci0uZGF0YTEgOiBAeyBkYXRhLm8oLmRhdGEpIEB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IFNPUlQKLU5vcm1hbGx5LCB0aGUgbGlua2VyIHdpbGwgcGxhY2UgZmlsZXMgYW5kIHNlY3Rpb25zIG1hdGNoZWQgYnkgd2lsZGNhcmRzCi1pbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgc2VlbiBkdXJpbmcgdGhlIGxpbmsuICBZb3UgY2FuIGNoYW5nZQotdGhpcyBieSB1c2luZyB0aGUgQGNvZGV7U09SVH0ga2V5d29yZCwgd2hpY2ggYXBwZWFycyBiZWZvcmUgYSB3aWxkY2FyZAotcGF0dGVybiBpbiBwYXJlbnRoZXNlcyAoZS5nLiwgQGNvZGV7U09SVCgudGV4dCopfSkuICBXaGVuIHRoZQotQGNvZGV7U09SVH0ga2V5d29yZCBpcyB1c2VkLCB0aGUgbGlua2VyIHdpbGwgc29ydCB0aGUgZmlsZXMgb3Igc2VjdGlvbnMKLWludG8gYXNjZW5kaW5nIG9yZGVyIGJ5IG5hbWUgYmVmb3JlIHBsYWNpbmcgdGhlbSBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUlmIHlvdSBldmVyIGdldCBjb25mdXNlZCBhYm91dCB3aGVyZSBpbnB1dCBzZWN0aW9ucyBhcmUgZ29pbmcsIHVzZSB0aGUKLUBzYW1wey1NfSBsaW5rZXIgb3B0aW9uIHRvIGdlbmVyYXRlIGEgbWFwIGZpbGUuICBUaGUgbWFwIGZpbGUgc2hvd3MKLXByZWNpc2VseSBob3cgaW5wdXQgc2VjdGlvbnMgYXJlIG1hcHBlZCB0byBvdXRwdXQgc2VjdGlvbnMuCi0KLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgd2lsZGNhcmQgcGF0dGVybnMgbWlnaHQgYmUgdXNlZCB0byBwYXJ0aXRpb24KLWZpbGVzLiAgVGhpcyBsaW5rZXIgc2NyaXB0IGRpcmVjdHMgdGhlIGxpbmtlciB0byBwbGFjZSBhbGwgQHNhbXB7LnRleHR9Ci1zZWN0aW9ucyBpbiBAc2FtcHsudGV4dH0gYW5kIGFsbCBAc2FtcHsuYnNzfSBzZWN0aW9ucyBpbiBAc2FtcHsuYnNzfS4KLVRoZSBsaW5rZXIgd2lsbCBwbGFjZSB0aGUgQHNhbXB7LmRhdGF9IHNlY3Rpb24gZnJvbSBhbGwgZmlsZXMgYmVnaW5uaW5nCi13aXRoIGFuIHVwcGVyIGNhc2UgY2hhcmFjdGVyIGluIEBzYW1wey5EQVRBfTsgZm9yIGFsbCBvdGhlciBmaWxlcywgdGhlCi1saW5rZXIgd2lsbCBwbGFjZSB0aGUgQHNhbXB7LmRhdGF9IHNlY3Rpb24gaW4gQHNhbXB7LmRhdGF9LgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OUyBAewotICAudGV4dCA6IEB7ICooLnRleHQpIEB9Ci0gIC5EQVRBIDogQHsgW0EtWl0qKC5kYXRhKSBAfQotICAuZGF0YSA6IEB7ICooLmRhdGEpIEB9Ci0gIC5ic3MgOiBAeyAqKC5ic3MpIEB9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBDb21tb24KLUBzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gZm9yIGNvbW1vbiBzeW1ib2xzCi1AY2luZGV4IGNvbW1vbiBzeW1ib2wgcGxhY2VtZW50Ci1AY2luZGV4IHVuaW5pdGlhbGl6ZWQgZGF0YSBwbGFjZW1lbnQKLUEgc3BlY2lhbCBub3RhdGlvbiBpcyBuZWVkZWQgZm9yIGNvbW1vbiBzeW1ib2xzLCBiZWNhdXNlIGluIG1hbnkgb2JqZWN0Ci1maWxlIGZvcm1hdHMgY29tbW9uIHN5bWJvbHMgZG8gbm90IGhhdmUgYSBwYXJ0aWN1bGFyIGlucHV0IHNlY3Rpb24uICBUaGUKLWxpbmtlciB0cmVhdHMgY29tbW9uIHN5bWJvbHMgYXMgdGhvdWdoIHRoZXkgYXJlIGluIGFuIGlucHV0IHNlY3Rpb24KLW5hbWVkIEBzYW1we0NPTU1PTn0uCi0KLVlvdSBtYXkgdXNlIGZpbGUgbmFtZXMgd2l0aCB0aGUgQHNhbXB7Q09NTU9OfSBzZWN0aW9uIGp1c3QgYXMgd2l0aCBhbnkKLW90aGVyIGlucHV0IHNlY3Rpb25zLiAgWW91IGNhbiB1c2UgdGhpcyB0byBwbGFjZSBjb21tb24gc3ltYm9scyBmcm9tIGEKLXBhcnRpY3VsYXIgaW5wdXQgZmlsZSBpbiBvbmUgc2VjdGlvbiB3aGlsZSBjb21tb24gc3ltYm9scyBmcm9tIG90aGVyCi1pbnB1dCBmaWxlcyBhcmUgcGxhY2VkIGluIGFub3RoZXIgc2VjdGlvbi4KLQotSW4gbW9zdCBjYXNlcywgY29tbW9uIHN5bWJvbHMgaW4gaW5wdXQgZmlsZXMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlCi1Ac2FtcHsuYnNzfSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotLmJzcyBAeyAqKC5ic3MpICooQ09NTU9OKSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBzY29tbW9uIHNlY3Rpb24KLUBjaW5kZXggc21hbGwgY29tbW9uIHN5bWJvbHMKLVNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyBoYXZlIG1vcmUgdGhhbiBvbmUgdHlwZSBvZiBjb21tb24gc3ltYm9sLiAgRm9yCi1leGFtcGxlLCB0aGUgTUlQUyBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0IGRpc3Rpbmd1aXNoZXMgc3RhbmRhcmQgY29tbW9uCi1zeW1ib2xzIGFuZCBzbWFsbCBjb21tb24gc3ltYm9scy4gIEluIHRoaXMgY2FzZSwgdGhlIGxpbmtlciB3aWxsIHVzZSBhCi1kaWZmZXJlbnQgc3BlY2lhbCBzZWN0aW9uIG5hbWUgZm9yIG90aGVyIHR5cGVzIG9mIGNvbW1vbiBzeW1ib2xzLiAgSW4KLXRoZSBjYXNlIG9mIE1JUFMgRUxGLCB0aGUgbGlua2VyIHVzZXMgQHNhbXB7Q09NTU9OfSBmb3Igc3RhbmRhcmQgY29tbW9uCi1zeW1ib2xzIGFuZCBAc2FtcHsuc2NvbW1vbn0gZm9yIHNtYWxsIGNvbW1vbiBzeW1ib2xzLiAgVGhpcyBwZXJtaXRzIHlvdQotdG8gbWFwIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgY29tbW9uIHN5bWJvbHMgaW50byBtZW1vcnkgYXQgZGlmZmVyZW50Ci1sb2NhdGlvbnMuCi0KLUBjaW5kZXggW0NPTU1PTl0KLVlvdSB3aWxsIHNvbWV0aW1lcyBzZWUgQHNhbXB7W0NPTU1PTl19IGluIG9sZCBsaW5rZXIgc2NyaXB0cy4gIFRoaXMKLW5vdGF0aW9uIGlzIG5vdyBjb25zaWRlcmVkIG9ic29sZXRlLiAgSXQgaXMgZXF1aXZhbGVudCB0bwotQHNhbXB7KihDT01NT04pfS4KLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBLZWVwCi1Ac3Vic3Vic2VjdGlvbiBJbnB1dCBzZWN0aW9uIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24KLUBjaW5kZXggS0VFUAotQGNpbmRleCBnYXJiYWdlIGNvbGxlY3Rpb24KLVdoZW4gbGluay10aW1lIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBpbiB1c2UgKEBzYW1wey0tZ2Mtc2VjdGlvbnN9KSwKLWl0IGlzIG9mdGVuIHVzZWZ1bCB0byBtYXJrIHNlY3Rpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBlbGltaW5hdGVkLiAKLVRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHN1cnJvdW5kaW5nIGFuIGlucHV0IHNlY3Rpb24ncyB3aWxkY2FyZCBlbnRyeQotd2l0aCBAY29kZXtLRUVQKCl9LCBhcyBpbiBAY29kZXtLRUVQKCooLmluaXQpKX0gb3IKLUBjb2Rle0tFRVAoU09SVCgqKSguY3RvcnMpKX0uCi0KLUBub2RlIElucHV0IFNlY3Rpb24gRXhhbXBsZQotQHN1YnN1YnNlY3Rpb24gSW5wdXQgc2VjdGlvbiBleGFtcGxlCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgaXMgYSBjb21wbGV0ZSBsaW5rZXIgc2NyaXB0LiAgSXQgdGVsbHMgdGhlIGxpbmtlcgotdG8gcmVhZCBhbGwgb2YgdGhlIHNlY3Rpb25zIGZyb20gZmlsZSBAZmlsZXthbGwub30gYW5kIHBsYWNlIHRoZW0gYXQgdGhlCi1zdGFydCBvZiBvdXRwdXQgc2VjdGlvbiBAc2FtcHtvdXRwdXRhfSB3aGljaCBzdGFydHMgYXQgbG9jYXRpb24KLUBzYW1wezB4MTAwMDB9LiAgQWxsIG9mIHNlY3Rpb24gQHNhbXB7LmlucHV0MX0gZnJvbSBmaWxlIEBmaWxle2Zvby5vfQotZm9sbG93cyBpbW1lZGlhdGVseSwgaW4gdGhlIHNhbWUgb3V0cHV0IHNlY3Rpb24uICBBbGwgb2Ygc2VjdGlvbgotQHNhbXB7LmlucHV0Mn0gZnJvbSBAZmlsZXtmb28ub30gZ29lcyBpbnRvIG91dHB1dCBzZWN0aW9uCi1Ac2FtcHtvdXRwdXRifSwgZm9sbG93ZWQgYnkgc2VjdGlvbiBAc2FtcHsuaW5wdXQxfSBmcm9tIEBmaWxle2ZvbzEub30uCi1BbGwgb2YgdGhlIHJlbWFpbmluZyBAc2FtcHsuaW5wdXQxfSBhbmQgQHNhbXB7LmlucHV0Mn0gc2VjdGlvbnMgZnJvbSBhbnkKLWZpbGVzIGFyZSB3cml0dGVuIHRvIG91dHB1dCBzZWN0aW9uIEBzYW1we291dHB1dGN9LgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7Ci0gIG91dHB1dGEgMHgxMDAwMCA6Ci0gICAgQHsKLSAgICBhbGwubwotICAgIGZvby5vICguaW5wdXQxKQotICAgIEB9Ci0gIG91dHB1dGIgOgotICAgIEB7Ci0gICAgZm9vLm8gKC5pbnB1dDIpCi0gICAgZm9vMS5vICguaW5wdXQxKQotICAgIEB9Ci0gIG91dHB1dGMgOgotICAgIEB7Ci0gICAgKiguaW5wdXQxKQotICAgICooLmlucHV0MikKLSAgICBAfQotQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlICAgICAgICAKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRGF0YQotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGF0YQotQGNpbmRleCBkYXRhCi1AY2luZGV4IHNlY3Rpb24gZGF0YQotQGNpbmRleCBvdXRwdXQgc2VjdGlvbiBkYXRhCi1Aa2luZGV4IEJZVEUoQHZhcntleHByZXNzaW9ufSkKLUBraW5kZXggU0hPUlQoQHZhcntleHByZXNzaW9ufSkKLUBraW5kZXggTE9ORyhAdmFye2V4cHJlc3Npb259KQotQGtpbmRleCBRVUFEKEB2YXJ7ZXhwcmVzc2lvbn0pCi1Aa2luZGV4IFNRVUFEKEB2YXJ7ZXhwcmVzc2lvbn0pCi1Zb3UgY2FuIGluY2x1ZGUgZXhwbGljaXQgYnl0ZXMgb2YgZGF0YSBpbiBhbiBvdXRwdXQgc2VjdGlvbiBieSB1c2luZwotQGNvZGV7QllURX0sIEBjb2Rle1NIT1JUfSwgQGNvZGV7TE9OR30sIEBjb2Rle1FVQUR9LCBvciBAY29kZXtTUVVBRH0gYXMKLWFuIG91dHB1dCBzZWN0aW9uIGNvbW1hbmQuICBFYWNoIGtleXdvcmQgaXMgZm9sbG93ZWQgYnkgYW4gZXhwcmVzc2lvbiBpbgotcGFyZW50aGVzZXMgcHJvdmlkaW5nIHRoZSB2YWx1ZSB0byBzdG9yZSAoQHB4cmVme0V4cHJlc3Npb25zfSkuICBUaGUKLXZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzIHN0b3JlZCBhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24KLWNvdW50ZXIuCi0KLVRoZSBAY29kZXtCWVRFfSwgQGNvZGV7U0hPUlR9LCBAY29kZXtMT05HfSwgYW5kIEBjb2Rle1FVQUR9IGNvbW1hbmRzCi1zdG9yZSBvbmUsIHR3bywgZm91ciwgYW5kIGVpZ2h0IGJ5dGVzIChyZXNwZWN0aXZlbHkpLiAgQWZ0ZXIgc3RvcmluZyB0aGUKLWJ5dGVzLCB0aGUgbG9jYXRpb24gY291bnRlciBpcyBpbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi1zdG9yZWQuCi0KLUZvciBleGFtcGxlLCB0aGlzIHdpbGwgc3RvcmUgdGhlIGJ5dGUgMSBmb2xsb3dlZCBieSB0aGUgZm91ciBieXRlIHZhbHVlCi1vZiB0aGUgc3ltYm9sIEBzYW1we2FkZHJ9OgotQHNtYWxsZXhhbXBsZQotQllURSgxKQotTE9ORyhhZGRyKQotQGVuZCBzbWFsbGV4YW1wbGUKLQotV2hlbiB1c2luZyBhIDY0IGJpdCBob3N0IG9yIHRhcmdldCwgQGNvZGV7UVVBRH0gYW5kIEBjb2Rle1NRVUFEfSBhcmUgdGhlCi1zYW1lOyB0aGV5IGJvdGggc3RvcmUgYW4gOCBieXRlLCBvciA2NCBiaXQsIHZhbHVlLiAgV2hlbiBib3RoIGhvc3QgYW5kCi10YXJnZXQgYXJlIDMyIGJpdHMsIGFuIGV4cHJlc3Npb24gaXMgY29tcHV0ZWQgYXMgMzIgYml0cy4gIEluIHRoaXMgY2FzZQotQGNvZGV7UVVBRH0gc3RvcmVzIGEgMzIgYml0IHZhbHVlIHplcm8gZXh0ZW5kZWQgdG8gNjQgYml0cywgYW5kCi1AY29kZXtTUVVBRH0gc3RvcmVzIGEgMzIgYml0IHZhbHVlIHNpZ24gZXh0ZW5kZWQgdG8gNjQgYml0cy4KLQotSWYgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUgaGFzIGFuIGV4cGxpY2l0IGVuZGlhbm5lc3MsCi13aGljaCBpcyB0aGUgbm9ybWFsIGNhc2UsIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGF0IGVuZGlhbm5lc3MuCi1XaGVuIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgZG9lcyBub3QgaGF2ZSBhbiBleHBsaWNpdCBlbmRpYW5uZXNzLCBhcyBpcwotdHJ1ZSBvZiwgZm9yIGV4YW1wbGUsIFMtcmVjb3JkcywgdGhlIHZhbHVlIHdpbGwgYmUgc3RvcmVkIGluIHRoZQotZW5kaWFubmVzcyBvZiB0aGUgZmlyc3QgaW5wdXQgb2JqZWN0IGZpbGUuCi0KLUBraW5kZXggRklMTChAdmFye2V4cHJlc3Npb259KQotQGNpbmRleCBob2xlcywgZmlsbGluZwotQGNpbmRleCB1bnNwZWNpZmllZCBtZW1vcnkKLVlvdSBtYXkgdXNlIHRoZSBAY29kZXtGSUxMfSBjb21tYW5kIHRvIHNldCB0aGUgZmlsbCBwYXR0ZXJuIGZvciB0aGUKLWN1cnJlbnQgc2VjdGlvbi4gIEl0IGlzIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24gaW4gcGFyZW50aGVzZXMuICBBbnkKLW90aGVyd2lzZSB1bnNwZWNpZmllZCByZWdpb25zIG9mIG1lbW9yeSB3aXRoaW4gdGhlIHNlY3Rpb24gKGZvciBleGFtcGxlLAotZ2FwcyBsZWZ0IGR1ZSB0byB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IG9mIGlucHV0IHNlY3Rpb25zKSBhcmUgZmlsbGVkCi13aXRoIHRoZSB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZXMgb2YgdGhlIGV4cHJlc3Npb24sIHJlcGVhdGVkIGFzCi1uZWNlc3NhcnkuICBBIEBjb2Rle0ZJTEx9IHN0YXRlbWVudCBjb3ZlcnMgbWVtb3J5IGxvY2F0aW9ucyBhZnRlciB0aGUKLXBvaW50IGF0IHdoaWNoIGl0IG9jY3VycyBpbiB0aGUgc2VjdGlvbiBkZWZpbml0aW9uOyBieSBpbmNsdWRpbmcgbW9yZQotdGhhbiBvbmUgQGNvZGV7RklMTH0gc3RhdGVtZW50LCB5b3UgY2FuIGhhdmUgZGlmZmVyZW50IGZpbGwgcGF0dGVybnMgaW4KLWRpZmZlcmVudCBwYXJ0cyBvZiBhbiBvdXRwdXQgc2VjdGlvbi4KLQotVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBmaWxsIHVuc3BlY2lmaWVkIHJlZ2lvbnMgb2YgbWVtb3J5IHdpdGggdGhlCi12YWx1ZSBAc2FtcHsweDkwOTB9OgotQHNtYWxsZXhhbXBsZQotRklMTCgweDkwOTApCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQGNvZGV7RklMTH0gY29tbWFuZCBpcyBzaW1pbGFyIHRvIHRoZSBAc2FtcHs9QHZhcntmaWxsZXhwfX0gb3V0cHV0Ci1zZWN0aW9uIGF0dHJpYnV0ZSAoQHB4cmVme091dHB1dCBTZWN0aW9uIEZpbGx9KSwgYnV0IGl0IG9ubHkgYWZmZWN0cyB0aGUKLXBhcnQgb2YgdGhlIHNlY3Rpb24gZm9sbG93aW5nIHRoZSBAY29kZXtGSUxMfSBjb21tYW5kLCByYXRoZXIgdGhhbiB0aGUKLWVudGlyZSBzZWN0aW9uLiAgSWYgYm90aCBhcmUgdXNlZCwgdGhlIEBjb2Rle0ZJTEx9IGNvbW1hbmQgdGFrZXMKLXByZWNlZGVuY2UuCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIEtleXdvcmRzCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBrZXl3b3JkcwotVGhlcmUgYXJlIGEgY291cGxlIG9mIGtleXdvcmRzIHdoaWNoIGNhbiBhcHBlYXIgYXMgb3V0cHV0IHNlY3Rpb24KLWNvbW1hbmRzLgotCi1AdGFibGUgQGNvZGUKLUBraW5kZXggQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi1AY2luZGV4IGlucHV0IGZpbGVuYW1lIHN5bWJvbHMKLUBjaW5kZXggZmlsZW5hbWUgc3ltYm9scwotQGl0ZW0gQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi1UaGUgY29tbWFuZCB0ZWxscyB0aGUgbGlua2VyIHRvIGNyZWF0ZSBhIHN5bWJvbCBmb3IgZWFjaCBpbnB1dCBmaWxlLgotVGhlIG5hbWUgb2YgZWFjaCBzeW1ib2wgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBpbnB1dAotZmlsZS4gIFRoZSBzZWN0aW9uIG9mIGVhY2ggc3ltYm9sIHdpbGwgYmUgdGhlIG91dHB1dCBzZWN0aW9uIGluIHdoaWNoCi10aGUgQGNvZGV7Q1JFQVRFX09CSkVDVF9TWU1CT0xTfSBjb21tYW5kIGFwcGVhcnMuCi0KLVRoaXMgaXMgY29udmVudGlvbmFsIGZvciB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LiAgSXQgaXMgbm90Ci1ub3JtYWxseSB1c2VkIGZvciBhbnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi1Aa2luZGV4IENPTlNUUlVDVE9SUwotQGNpbmRleCBDKysgY29uc3RydWN0b3JzLCBhcnJhbmdpbmcgaW4gbGluawotQGNpbmRleCBjb25zdHJ1Y3RvcnMsIGFycmFuZ2luZyBpbiBsaW5rCi1AaXRlbSBDT05TVFJVQ1RPUlMKLVdoZW4gbGlua2luZyB1c2luZyB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LCB0aGUgbGlua2VyIHVzZXMgYW4KLXVudXN1YWwgc2V0IGNvbnN0cnVjdCB0byBzdXBwb3J0IEMrKyBnbG9iYWwgY29uc3RydWN0b3JzIGFuZAotZGVzdHJ1Y3RvcnMuICBXaGVuIGxpbmtpbmcgb2JqZWN0IGZpbGUgZm9ybWF0cyB3aGljaCBkbyBub3Qgc3VwcG9ydAotYXJiaXRyYXJ5IHNlY3Rpb25zLCBzdWNoIGFzIEVDT0ZGIGFuZCBYQ09GRiwgdGhlIGxpbmtlciB3aWxsCi1hdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYnkgbmFtZS4KLUZvciB0aGVzZSBvYmplY3QgZmlsZSBmb3JtYXRzLCB0aGUgQGNvZGV7Q09OU1RSVUNUT1JTfSBjb21tYW5kIHRlbGxzIHRoZQotbGlua2VyIHRvIHBsYWNlIGNvbnN0cnVjdG9yIGluZm9ybWF0aW9uIGluIHRoZSBvdXRwdXQgc2VjdGlvbiB3aGVyZSB0aGUKLUBjb2Rle0NPTlNUUlVDVE9SU30gY29tbWFuZCBhcHBlYXJzLiAgVGhlIEBjb2Rle0NPTlNUUlVDVE9SU30gY29tbWFuZCBpcwotaWdub3JlZCBmb3Igb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotVGhlIHN5bWJvbCBAd3tAY29kZXtfX0NUT1JfTElTVF9ffX0gbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBnbG9iYWwKLWNvbnN0cnVjdG9ycywgYW5kIHRoZSBzeW1ib2wgQHd7QGNvZGV7X19EVE9SX0xJU1R9fSBtYXJrcyB0aGUgZW5kLiAgVGhlCi1maXJzdCB3b3JkIGluIHRoZSBsaXN0IGlzIHRoZSBudW1iZXIgb2YgZW50cmllcywgZm9sbG93ZWQgYnkgdGhlIGFkZHJlc3MKLW9mIGVhY2ggY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciwgZm9sbG93ZWQgYnkgYSB6ZXJvIHdvcmQuICBUaGUKLWNvbXBpbGVyIG11c3QgYXJyYW5nZSB0byBhY3R1YWxseSBydW4gdGhlIGNvZGUuICBGb3IgdGhlc2Ugb2JqZWN0IGZpbGUKLWZvcm1hdHMgQHNje2dudX0gQysrIG5vcm1hbGx5IGNhbGxzIGNvbnN0cnVjdG9ycyBmcm9tIGEgc3Vicm91dGluZQotQGNvZGV7X19tYWlufTsgYSBjYWxsIHRvIEBjb2Rle19fbWFpbn0gaXMgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbnRvCi10aGUgc3RhcnR1cCBjb2RlIGZvciBAY29kZXttYWlufS4gIEBzY3tnbnV9IEMrKyBub3JtYWxseSBydW5zCi1kZXN0cnVjdG9ycyBlaXRoZXIgYnkgdXNpbmcgQGNvZGV7YXRleGl0fSwgb3IgZGlyZWN0bHkgZnJvbSB0aGUgZnVuY3Rpb24KLUBjb2Rle2V4aXR9LgotCi1Gb3Igb2JqZWN0IGZpbGUgZm9ybWF0cyBzdWNoIGFzIEBjb2Rle0NPRkZ9IG9yIEBjb2Rle0VMRn0gd2hpY2ggc3VwcG9ydAotYXJiaXRyYXJ5IHNlY3Rpb24gbmFtZXMsIEBzY3tnbnV9IEMrKyB3aWxsIG5vcm1hbGx5IGFycmFuZ2UgdG8gcHV0IHRoZQotYWRkcmVzc2VzIG9mIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGludG8gdGhlIEBjb2Rley5jdG9yc30KLWFuZCBAY29kZXsuZHRvcnN9IHNlY3Rpb25zLiAgUGxhY2luZyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGludG8geW91cgotbGlua2VyIHNjcmlwdCB3aWxsIGJ1aWxkIHRoZSBzb3J0IG9mIHRhYmxlIHdoaWNoIHRoZSBAc2N7Z251fSBDKysKLXJ1bnRpbWUgY29kZSBleHBlY3RzIHRvIHNlZS4KLQotQHNtYWxsZXhhbXBsZQotICAgICAgX19DVE9SX0xJU1RfXyA9IC47Ci0gICAgICBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKQotICAgICAgKiguY3RvcnMpCi0gICAgICBMT05HKDApCi0gICAgICBfX0NUT1JfRU5EX18gPSAuOwotICAgICAgX19EVE9SX0xJU1RfXyA9IC47Ci0gICAgICBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKQotICAgICAgKiguZHRvcnMpCi0gICAgICBMT05HKDApCi0gICAgICBfX0RUT1JfRU5EX18gPSAuOwotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgeW91IGFyZSB1c2luZyB0aGUgQHNje2dudX0gQysrIHN1cHBvcnQgZm9yIGluaXRpYWxpemF0aW9uIHByaW9yaXR5LAotd2hpY2ggcHJvdmlkZXMgc29tZSBjb250cm9sIG92ZXIgdGhlIG9yZGVyIGluIHdoaWNoIGdsb2JhbCBjb25zdHJ1Y3RvcnMKLWFyZSBydW4sIHlvdSBtdXN0IHNvcnQgdGhlIGNvbnN0cnVjdG9ycyBhdCBsaW5rIHRpbWUgdG8gZW5zdXJlIHRoYXQgdGhleQotYXJlIGV4ZWN1dGVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgV2hlbiB1c2luZyB0aGUgQGNvZGV7Q09OU1RSVUNUT1JTfQotY29tbWFuZCwgdXNlIEBzYW1we1NPUlQoQ09OU1RSVUNUT1JTKX0gaW5zdGVhZC4gIFdoZW4gdXNpbmcgdGhlCi1AY29kZXsuY3RvcnN9IGFuZCBAY29kZXsuZHRvcnN9IHNlY3Rpb25zLCB1c2UgQHNhbXB7KihTT1JUKC5jdG9ycykpfSBhbmQKLUBzYW1weyooU09SVCguZHRvcnMpKX0gaW5zdGVhZCBvZiBqdXN0IEBzYW1weyooLmN0b3JzKX0gYW5kCi1Ac2FtcHsqKC5kdG9ycyl9LgotCi1Ob3JtYWxseSB0aGUgY29tcGlsZXIgYW5kIGxpbmtlciB3aWxsIGhhbmRsZSB0aGVzZSBpc3N1ZXMgYXV0b21hdGljYWxseSwKLWFuZCB5b3Ugd2lsbCBub3QgbmVlZCB0byBjb25jZXJuIHlvdXJzZWxmIHdpdGggdGhlbS4gIEhvd2V2ZXIsIHlvdSBtYXkKLW5lZWQgdG8gY29uc2lkZXIgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIEMrKyBhbmQgd3JpdGluZyB5b3VyIG93biBsaW5rZXIKLXNjcmlwdHMuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRGlzY2FyZGluZwotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGlzY2FyZGluZwotQGNpbmRleCBkaXNjYXJkaW5nIHNlY3Rpb25zCi1AY2luZGV4IHNlY3Rpb25zLCBkaXNjYXJkaW5nCi1AY2luZGV4IHJlbW92aW5nIHNlY3Rpb25zCi1UaGUgbGlua2VyIHdpbGwgbm90IGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiB3aGljaCBkbyBub3QgaGF2ZSBhbnkKLWNvbnRlbnRzLiAgVGhpcyBpcyBmb3IgY29udmVuaWVuY2Ugd2hlbiByZWZlcnJpbmcgdG8gaW5wdXQgc2VjdGlvbnMgdGhhdAotbWF5IG9yIG1heSBub3QgYmUgcHJlc2VudCBpbiBhbnkgb2YgdGhlIGlucHV0IGZpbGVzLiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi0uZm9vIEB7ICooLmZvbykgQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdpbGwgb25seSBjcmVhdGUgYSBAc2FtcHsuZm9vfSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSBpZiB0aGVyZSBpcyBhCi1Ac2FtcHsuZm9vfSBzZWN0aW9uIGluIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlLgotCi1JZiB5b3UgdXNlIGFueXRoaW5nIG90aGVyIHRoYW4gYW4gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiBhcyBhbiBvdXRwdXQKLXNlY3Rpb24gY29tbWFuZCwgc3VjaCBhcyBhIHN5bWJvbCBhc3NpZ25tZW50LCB0aGVuIHRoZSBvdXRwdXQgc2VjdGlvbgotd2lsbCBhbHdheXMgYmUgY3JlYXRlZCwgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcgaW5wdXQgc2VjdGlvbnMuCi0KLUBjaW5kZXggL0RJU0NBUkQvCi1UaGUgc3BlY2lhbCBvdXRwdXQgc2VjdGlvbiBuYW1lIEBzYW1wey9ESVNDQVJEL30gbWF5IGJlIHVzZWQgdG8gZGlzY2FyZAotaW5wdXQgc2VjdGlvbnMuICBBbnkgaW5wdXQgc2VjdGlvbnMgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGFuIG91dHB1dAotc2VjdGlvbiBuYW1lZCBAc2FtcHsvRElTQ0FSRC99IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBBdHRyaWJ1dGVzCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBhdHRyaWJ1dGVzCi1AY2luZGV4IG91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZXMKLVdlIHNob3dlZCBhYm92ZSB0aGF0IHRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGFuIG91dHB1dCBzZWN0aW9uIGxvb2tlZAotbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwIAotQHZhcntzZWN0aW9ufSBbQHZhcnthZGRyZXNzfV0gWyhAdmFye3R5cGV9KV0gOiBbQVQoQHZhcntsbWF9KV0KLSAgQHsKLSAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQotICAgIEBkb3Rze30KLSAgQH0gWz5AdmFye3JlZ2lvbn1dIFs6QHZhcntwaGRyfSA6QHZhcntwaGRyfSBAZG90c3t9XSBbPUB2YXJ7ZmlsbGV4cH1dCi1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotV2UndmUgYWxyZWFkeSBkZXNjcmliZWQgQHZhcntzZWN0aW9ufSwgQHZhcnthZGRyZXNzfSwgYW5kCi1AdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9LiAgSW4gdGhpcyBzZWN0aW9uIHdlIHdpbGwgZGVzY3JpYmUgdGhlCi1yZW1haW5pbmcgc2VjdGlvbiBhdHRyaWJ1dGVzLgotCi1AbWVudSAKLSogT3V0cHV0IFNlY3Rpb24gVHlwZTo6CQlPdXRwdXQgc2VjdGlvbiB0eXBlCi0qIE91dHB1dCBTZWN0aW9uIExNQTo6CQlPdXRwdXQgc2VjdGlvbiBMTUEKLSogT3V0cHV0IFNlY3Rpb24gUmVnaW9uOjoJT3V0cHV0IHNlY3Rpb24gcmVnaW9uCi0qIE91dHB1dCBTZWN0aW9uIFBoZHI6OgkJT3V0cHV0IHNlY3Rpb24gcGhkcgotKiBPdXRwdXQgU2VjdGlvbiBGaWxsOjoJCU91dHB1dCBzZWN0aW9uIGZpbGwKLUBlbmQgbWVudQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBUeXBlCi1Ac3Vic3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiB0eXBlCi1FYWNoIG91dHB1dCBzZWN0aW9uIG1heSBoYXZlIGEgdHlwZS4gIFRoZSB0eXBlIGlzIGEga2V5d29yZCBpbgotcGFyZW50aGVzZXMuICBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBkZWZpbmVkOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIE5PTE9BRAotVGhlIHNlY3Rpb24gc2hvdWxkIGJlIG1hcmtlZCBhcyBub3QgbG9hZGFibGUsIHNvIHRoYXQgaXQgd2lsbCBub3QgYmUKLWxvYWRlZCBpbnRvIG1lbW9yeSB3aGVuIHRoZSBwcm9ncmFtIGlzIHJ1bi4KLUBpdGVtIERTRUNUCi1AaXRlbXggQ09QWQotQGl0ZW14IElORk8KLUBpdGVteCBPVkVSTEFZCi1UaGVzZSB0eXBlIG5hbWVzIGFyZSBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGFuZCBhcmUKLXJhcmVseSB1c2VkLiAgVGhleSBhbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3Q6IHRoZSBzZWN0aW9uIHNob3VsZCBiZQotbWFya2VkIGFzIG5vdCBhbGxvY2F0YWJsZSwgc28gdGhhdCBubyBtZW1vcnkgaXMgYWxsb2NhdGVkIGZvciB0aGUKLXNlY3Rpb24gd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW4uCi1AZW5kIHRhYmxlCi0KLUBraW5kZXggTk9MT0FECi1AY2luZGV4IHByZXZlbnQgdW5uZWNlc3NhcnkgbG9hZGluZwotQGNpbmRleCBsb2FkaW5nLCBwcmV2ZW50aW5nCi1UaGUgbGlua2VyIG5vcm1hbGx5IHNldHMgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gb3V0cHV0IHNlY3Rpb24gYmFzZWQgb24KLXRoZSBpbnB1dCBzZWN0aW9ucyB3aGljaCBtYXAgaW50byBpdC4gIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBieSB1c2luZwotdGhlIHNlY3Rpb24gdHlwZS4gIEZvciBleGFtcGxlLCBpbiB0aGUgc2NyaXB0IHNhbXBsZSBiZWxvdywgdGhlCi1Ac2FtcHtST019IHNlY3Rpb24gaXMgYWRkcmVzc2VkIGF0IG1lbW9yeSBsb2NhdGlvbiBAc2FtcHswfSBhbmQgZG9lcyBub3QKLW5lZWQgdG8gYmUgbG9hZGVkIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuLiAgVGhlIGNvbnRlbnRzIG9mIHRoZQotQHNhbXB7Uk9NfSBzZWN0aW9uIHdpbGwgYXBwZWFyIGluIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUgYXMgdXN1YWwuCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7Ci0gIFJPTSAwIChOT0xPQUQpIDogQHsgQGRvdHN7fSBAfQotICBAZG90c3t9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gTE1BCi1Ac3Vic3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBMTUEKLUBraW5kZXggQVQoQHZhcntsbWF9KQotQGNpbmRleCBsb2FkIGFkZHJlc3MKLUBjaW5kZXggc2VjdGlvbiBsb2FkIGFkZHJlc3MKLUV2ZXJ5IHNlY3Rpb24gaGFzIGEgdmlydHVhbCBhZGRyZXNzIChWTUEpIGFuZCBhIGxvYWQgYWRkcmVzcyAoTE1BKTsgc2VlCi1AcmVme0Jhc2ljIFNjcmlwdCBDb25jZXB0c30uICBUaGUgYWRkcmVzcyBleHByZXNzaW9uIHdoaWNoIG1heSBhcHBlYXIgaW4KLWFuIG91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIHNldHMgdGhlIFZNQSAoQHB4cmVme091dHB1dCBTZWN0aW9uCi1BZGRyZXNzfSkuCi0KLVRoZSBsaW5rZXIgd2lsbCBub3JtYWxseSBzZXQgdGhlIExNQSBlcXVhbCB0byB0aGUgVk1BLiAgWW91IGNhbiBjaGFuZ2UKLXRoYXQgYnkgdXNpbmcgdGhlIEBjb2Rle0FUfSBrZXl3b3JkLiAgVGhlIGV4cHJlc3Npb24gQHZhcntsbWF9IHRoYXQKLWZvbGxvd3MgdGhlIEBjb2Rle0FUfSBrZXl3b3JkIHNwZWNpZmllcyB0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uLgotCi1AY2luZGV4IFJPTSBpbml0aWFsaXplZCBkYXRhCi1AY2luZGV4IGluaXRpYWxpemVkIGRhdGEgaW4gUk9NCi1UaGlzIGZlYXR1cmUgaXMgZGVzaWduZWQgdG8gbWFrZSBpdCBlYXN5IHRvIGJ1aWxkIGEgUk9NIGltYWdlLiAgRm9yCi1leGFtcGxlLCB0aGUgZm9sbG93aW5nIGxpbmtlciBzY3JpcHQgY3JlYXRlcyB0aHJlZSBvdXRwdXQgc2VjdGlvbnM6IG9uZQotY2FsbGVkIEBzYW1wey50ZXh0fSwgd2hpY2ggc3RhcnRzIGF0IEBjb2RlezB4MTAwMH0sIG9uZSBjYWxsZWQKLUBzYW1wey5tZGF0YX0sIHdoaWNoIGlzIGxvYWRlZCBhdCB0aGUgZW5kIG9mIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbgotZXZlbiB0aG91Z2ggaXRzIFZNQSBpcyBAY29kZXsweDIwMDB9LCBhbmQgb25lIGNhbGxlZCBAc2FtcHsuYnNzfSB0byBob2xkCi11bmluaXRpYWxpemVkIGRhdGEgYXQgYWRkcmVzcyBAY29kZXsweDMwMDB9LiAgVGhlIHN5bWJvbCBAY29kZXtfZGF0YX0gaXMKLWRlZmluZWQgd2l0aCB0aGUgdmFsdWUgQGNvZGV7MHgyMDAwfSwgd2hpY2ggc2hvd3MgdGhhdCB0aGUgbG9jYXRpb24KLWNvdW50ZXIgaG9sZHMgdGhlIFZNQSB2YWx1ZSwgbm90IHRoZSBMTUEgdmFsdWUuCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMKLSAgQHsKLSAgLnRleHQgMHgxMDAwIDogQHsgKigudGV4dCkgX2V0ZXh0ID0gLiA7IEB9Ci0gIC5tZGF0YSAweDIwMDAgOiAKLSAgICBBVCAoIEFERFIgKC50ZXh0KSArIFNJWkVPRiAoLnRleHQpICkKLSAgICBAeyBfZGF0YSA9IC4gOyAqKC5kYXRhKTsgX2VkYXRhID0gLiA7ICBAfQotICAuYnNzIDB4MzAwMCA6Ci0gICAgQHsgX2JzdGFydCA9IC4gOyAgKiguYnNzKSAqKENPTU1PTikgOyBfYmVuZCA9IC4gO0B9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIHJ1bi10aW1lIGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHVzZSB3aXRoIGEgcHJvZ3JhbSBnZW5lcmF0ZWQgd2l0aAotdGhpcyBsaW5rZXIgc2NyaXB0IHdvdWxkIGluY2x1ZGUgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywgdG8gY29weQotdGhlIGluaXRpYWxpemVkIGRhdGEgZnJvbSB0aGUgUk9NIGltYWdlIHRvIGl0cyBydW50aW1lIGFkZHJlc3MuICBOb3RpY2UKLWhvdyB0aGlzIGNvZGUgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBzeW1ib2xzIGRlZmluZWQgYnkgdGhlIGxpbmtlcgotc2NyaXB0LgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLWV4dGVybiBjaGFyIF9ldGV4dCwgX2RhdGEsIF9lZGF0YSwgX2JzdGFydCwgX2JlbmQ7Ci1jaGFyICpzcmMgPSAmX2V0ZXh0OwotY2hhciAqZHN0ID0gJl9kYXRhOwotCi0vKiBST00gaGFzIGRhdGEgYXQgZW5kIG9mIHRleHQ7IGNvcHkgaXQuICovCi13aGlsZSAoZHN0IDwgJl9lZGF0YSkgQHsKLSAgKmRzdCsrID0gKnNyYysrOwotQH0KLQotLyogWmVybyBic3MgKi8KLWZvciAoZHN0ID0gJl9ic3RhcnQ7IGRzdDwgJl9iZW5kOyBkc3QrKykKLSAgKmRzdCA9IDA7Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBSZWdpb24KLUBzdWJzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIHJlZ2lvbgotQGtpbmRleCA+QHZhcntyZWdpb259Ci1AY2luZGV4IHNlY3Rpb24sIGFzc2lnbmluZyB0byBtZW1vcnkgcmVnaW9uCi1AY2luZGV4IG1lbW9yeSByZWdpb25zIGFuZCBzZWN0aW9ucwotWW91IGNhbiBhc3NpZ24gYSBzZWN0aW9uIHRvIGEgcHJldmlvdXNseSBkZWZpbmVkIHJlZ2lvbiBvZiBtZW1vcnkgYnkKLXVzaW5nIEBzYW1wez5AdmFye3JlZ2lvbn19LiAgQHhyZWZ7TUVNT1JZfS4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1NRU1PUlkgQHsgcm9tIDogT1JJR0lOID0gMHgxMDAwLCBMRU5HVEggPSAweDEwMDAgQH0KLVNFQ1RJT05TIEB7IFJPTSA6IEB7ICooLnRleHQpIEB9ID5yb20gQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIFBoZHIKLUBzdWJzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIHBoZHIKLUBraW5kZXggOkB2YXJ7cGhkcn0KLUBjaW5kZXggc2VjdGlvbiwgYXNzaWduaW5nIHRvIHByb2dyYW0gaGVhZGVyCi1AY2luZGV4IHByb2dyYW0gaGVhZGVycyBhbmQgc2VjdGlvbnMKLVlvdSBjYW4gYXNzaWduIGEgc2VjdGlvbiB0byBhIHByZXZpb3VzbHkgZGVmaW5lZCBwcm9ncmFtIHNlZ21lbnQgYnkKLXVzaW5nIEBzYW1wezpAdmFye3BoZHJ9fS4gIEB4cmVme1BIRFJTfS4gIElmIGEgc2VjdGlvbiBpcyBhc3NpZ25lZCB0bwotb25lIG9yIG1vcmUgc2VnbWVudHMsIHRoZW4gYWxsIHN1YnNlcXVlbnQgYWxsb2NhdGVkIHNlY3Rpb25zIHdpbGwgYmUKLWFzc2lnbmVkIHRvIHRob3NlIHNlZ21lbnRzIGFzIHdlbGwsIHVubGVzcyB0aGV5IHVzZSBhbiBleHBsaWNpdGx5Ci1AY29kZXs6QHZhcntwaGRyfX0gbW9kaWZpZXIuICBZb3UgY2FuIHVzZSBAY29kZXs6Tk9ORX0gdG8gdGVsbCB0aGUKLWxpbmtlciB0byBub3QgcHV0IHRoZSBzZWN0aW9uIGluIGFueSBzZWdtZW50IGF0IGFsbC4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1QSERSUyBAeyB0ZXh0IFBUX0xPQUQgOyBAfQotU0VDVElPTlMgQHsgLnRleHQgOiBAeyAqKC50ZXh0KSBAfSA6dGV4dCBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRmlsbAotQHN1YnN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZmlsbAotQGtpbmRleCA9QHZhcntmaWxsZXhwfQotQGNpbmRleCBzZWN0aW9uIGZpbGwgcGF0dGVybgotQGNpbmRleCBmaWxsIHBhdHRlcm4sIGVudGlyZSBzZWN0aW9uCi1Zb3UgY2FuIHNldCB0aGUgZmlsbCBwYXR0ZXJuIGZvciBhbiBlbnRpcmUgc2VjdGlvbiBieSB1c2luZwotQHNhbXB7PUB2YXJ7ZmlsbGV4cH19LiAgQHZhcntmaWxsZXhwfSBpcyBhbiBleHByZXNzaW9uCi0oQHB4cmVme0V4cHJlc3Npb25zfSkuICBBbnkgb3RoZXJ3aXNlIHVuc3BlY2lmaWVkIHJlZ2lvbnMgb2YgbWVtb3J5Ci13aXRoaW4gdGhlIG91dHB1dCBzZWN0aW9uIChmb3IgZXhhbXBsZSwgZ2FwcyBsZWZ0IGR1ZSB0byB0aGUgcmVxdWlyZWQKLWFsaWdubWVudCBvZiBpbnB1dCBzZWN0aW9ucykgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvIGxlYXN0Ci1zaWduaWZpY2FudCBieXRlcyBvZiB0aGUgdmFsdWUsIHJlcGVhdGVkIGFzIG5lY2Vzc2FyeS4KLQotWW91IGNhbiBhbHNvIGNoYW5nZSB0aGUgZmlsbCB2YWx1ZSB3aXRoIGEgQGNvZGV7RklMTH0gY29tbWFuZCBpbiB0aGUKLW91dHB1dCBzZWN0aW9uIGNvbW1hbmRzOyBzZWUgQHJlZntPdXRwdXQgU2VjdGlvbiBEYXRhfS4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OUyBAeyAudGV4dCA6IEB7ICooLnRleHQpIEB9ID0weDkwOTAgQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE92ZXJsYXkgRGVzY3JpcHRpb24KLUBzdWJzZWN0aW9uIE92ZXJsYXkgZGVzY3JpcHRpb24KLUBraW5kZXggT1ZFUkxBWQotQGNpbmRleCBvdmVybGF5cwotQW4gb3ZlcmxheSBkZXNjcmlwdGlvbiBwcm92aWRlcyBhbiBlYXN5IHdheSB0byBkZXNjcmliZSBzZWN0aW9ucyB3aGljaAotYXJlIHRvIGJlIGxvYWRlZCBhcyBwYXJ0IG9mIGEgc2luZ2xlIG1lbW9yeSBpbWFnZSBidXQgYXJlIHRvIGJlIHJ1biBhdAotdGhlIHNhbWUgbWVtb3J5IGFkZHJlc3MuICBBdCBydW4gdGltZSwgc29tZSBzb3J0IG9mIG92ZXJsYXkgbWFuYWdlciB3aWxsCi1jb3B5IHRoZSBvdmVybGFpZCBzZWN0aW9ucyBpbiBhbmQgb3V0IG9mIHRoZSBydW50aW1lIG1lbW9yeSBhZGRyZXNzIGFzCi1yZXF1aXJlZCwgcGVyaGFwcyBieSBzaW1wbHkgbWFuaXB1bGF0aW5nIGFkZHJlc3NpbmcgYml0cy4gIFRoaXMgYXBwcm9hY2gKLWNhbiBiZSB1c2VmdWwsIGZvciBleGFtcGxlLCB3aGVuIGEgY2VydGFpbiByZWdpb24gb2YgbWVtb3J5IGlzIGZhc3RlcgotdGhhbiBhbm90aGVyLgotCi1PdmVybGF5cyBhcmUgZGVzY3JpYmVkIHVzaW5nIHRoZSBAY29kZXtPVkVSTEFZfSBjb21tYW5kLiAgVGhlCi1AY29kZXtPVkVSTEFZfSBjb21tYW5kIGlzIHVzZWQgd2l0aGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQsIGxpa2UgYW4KLW91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uLiAgVGhlIGZ1bGwgc3ludGF4IG9mIHRoZSBAY29kZXtPVkVSTEFZfQotY29tbWFuZCBpcyBhcyBmb2xsb3dzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1PVkVSTEFZIFtAdmFye3N0YXJ0fV0gOiBbTk9DUk9TU1JFRlNdIFtBVCAoIEB2YXJ7bGRhZGRyfSApXQotICBAewotICAgIEB2YXJ7c2VjbmFtZTF9Ci0gICAgICBAewotICAgICAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICAgICAgQGRvdHN7fQotICAgICAgQH0gWzpAdmFye3BoZHJ9QGRvdHN7fV0gWz1AdmFye2ZpbGx9XQotICAgIEB2YXJ7c2VjbmFtZTJ9Ci0gICAgICBAewotICAgICAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICAgICAgQGRvdHN7fQotICAgICAgQH0gWzpAdmFye3BoZHJ9QGRvdHN7fV0gWz1AdmFye2ZpbGx9XQotICAgIEBkb3Rze30KLSAgQH0gWz5AdmFye3JlZ2lvbn1dIFs6QHZhcntwaGRyfUBkb3Rze31dIFs9QHZhcntmaWxsfV0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUV2ZXJ5dGhpbmcgaXMgb3B0aW9uYWwgZXhjZXB0IEBjb2Rle09WRVJMQVl9IChhIGtleXdvcmQpLCBhbmQgZWFjaAotc2VjdGlvbiBtdXN0IGhhdmUgYSBuYW1lIChAdmFye3NlY25hbWUxfSBhbmQgQHZhcntzZWNuYW1lMn0gYWJvdmUpLiAgVGhlCi1zZWN0aW9uIGRlZmluaXRpb25zIHdpdGhpbiB0aGUgQGNvZGV7T1ZFUkxBWX0gY29uc3RydWN0IGFyZSBpZGVudGljYWwgdG8KLXRob3NlIHdpdGhpbiB0aGUgZ2VuZXJhbCBAY29kZXtTRUNUSU9OU30gY29udHJ1Y3QgKEBweHJlZntTRUNUSU9OU30pLAotZXhjZXB0IHRoYXQgbm8gYWRkcmVzc2VzIGFuZCBubyBtZW1vcnkgcmVnaW9ucyBtYXkgYmUgZGVmaW5lZCBmb3IKLXNlY3Rpb25zIHdpdGhpbiBhbiBAY29kZXtPVkVSTEFZfS4KLQotVGhlIHNlY3Rpb25zIGFyZSBhbGwgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIHN0YXJ0aW5nIGFkZHJlc3MuICBUaGUgbG9hZAotYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucyBhcmUgYXJyYW5nZWQgc3VjaCB0aGF0IHRoZXkgYXJlIGNvbnNlY3V0aXZlIGluCi1tZW1vcnkgc3RhcnRpbmcgYXQgdGhlIGxvYWQgYWRkcmVzcyB1c2VkIGZvciB0aGUgQGNvZGV7T1ZFUkxBWX0gYXMgYQotd2hvbGUgKGFzIHdpdGggbm9ybWFsIHNlY3Rpb24gZGVmaW5pdGlvbnMsIHRoZSBsb2FkIGFkZHJlc3MgaXMgb3B0aW9uYWwsCi1hbmQgZGVmYXVsdHMgdG8gdGhlIHN0YXJ0IGFkZHJlc3M7IHRoZSBzdGFydCBhZGRyZXNzIGlzIGFsc28gb3B0aW9uYWwsCi1hbmQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIpLgotCi1JZiB0aGUgQGNvZGV7Tk9DUk9TU1JFRlN9IGtleXdvcmQgaXMgdXNlZCwgYW5kIHRoZXJlIGFueSByZWZlcmVuY2VzCi1hbW9uZyB0aGUgc2VjdGlvbnMsIHRoZSBsaW5rZXIgd2lsbCByZXBvcnQgYW4gZXJyb3IuICBTaW5jZSB0aGUgc2VjdGlvbnMKLWFsbCBydW4gYXQgdGhlIHNhbWUgYWRkcmVzcywgaXQgbm9ybWFsbHkgZG9lcyBub3QgbWFrZSBzZW5zZSBmb3Igb25lCi1zZWN0aW9uIHRvIHJlZmVyIGRpcmVjdGx5IHRvIGFub3RoZXIuICBAeHJlZntNaXNjZWxsYW5lb3VzIENvbW1hbmRzLAotTk9DUk9TU1JFRlN9LgotCi1Gb3IgZWFjaCBzZWN0aW9uIHdpdGhpbiB0aGUgQGNvZGV7T1ZFUkxBWX0sIHRoZSBsaW5rZXIgYXV0b21hdGljYWxseQotZGVmaW5lcyB0d28gc3ltYm9scy4gIFRoZSBzeW1ib2wgQGNvZGV7X19sb2FkX3N0YXJ0X0B2YXJ7c2VjbmFtZX19IGlzCi1kZWZpbmVkIGFzIHRoZSBzdGFydGluZyBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24uICBUaGUgc3ltYm9sCi1AY29kZXtfX2xvYWRfc3RvcF9AdmFye3NlY25hbWV9fSBpcyBkZWZpbmVkIGFzIHRoZSBmaW5hbCBsb2FkIGFkZHJlc3Mgb2YKLXRoZSBzZWN0aW9uLiAgQW55IGNoYXJhY3RlcnMgd2l0aGluIEB2YXJ7c2VjbmFtZX0gd2hpY2ggYXJlIG5vdCBsZWdhbAotd2l0aGluIEMgaWRlbnRpZmllcnMgYXJlIHJlbW92ZWQuICBDIChvciBhc3NlbWJsZXIpIGNvZGUgbWF5IHVzZSB0aGVzZQotc3ltYm9scyB0byBtb3ZlIHRoZSBvdmVybGFpZCBzZWN0aW9ucyBhcm91bmQgYXMgbmVjZXNzYXJ5LgotCi1BdCB0aGUgZW5kIG9mIHRoZSBvdmVybGF5LCB0aGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgc2V0IHRvCi10aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgb3ZlcmxheSBwbHVzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IHNlY3Rpb24uCi0KLUhlcmUgaXMgYW4gZXhhbXBsZS4gIFJlbWVtYmVyIHRoYXQgdGhpcyB3b3VsZCBhcHBlYXIgaW5zaWRlIGEKLUBjb2Rle1NFQ1RJT05TfSBjb25zdHJ1Y3QuCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLSAgT1ZFUkxBWSAweDEwMDAgOiBBVCAoMHg0MDAwKQotICAgQHsKLSAgICAgLnRleHQwIEB7IG8xLyoubygudGV4dCkgQH0KLSAgICAgLnRleHQxIEB7IG8yLyoubygudGV4dCkgQH0KLSAgIEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIHdpbGwgZGVmaW5lIGJvdGggQHNhbXB7LnRleHQwfSBhbmQgQHNhbXB7LnRleHQxfSB0byBzdGFydCBhdAotYWRkcmVzcyAweDEwMDAuICBAc2FtcHsudGV4dDB9IHdpbGwgYmUgbG9hZGVkIGF0IGFkZHJlc3MgMHg0MDAwLCBhbmQKLUBzYW1wey50ZXh0MX0gd2lsbCBiZSBsb2FkZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgQHNhbXB7LnRleHQwfS4gIFRoZQotZm9sbG93aW5nIHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkOiBAY29kZXtfX2xvYWRfc3RhcnRfdGV4dDB9LAotQGNvZGV7X19sb2FkX3N0b3BfdGV4dDB9LCBAY29kZXtfX2xvYWRfc3RhcnRfdGV4dDF9LAotQGNvZGV7X19sb2FkX3N0b3BfdGV4dDF9LgotCi1DIGNvZGUgdG8gY29weSBvdmVybGF5IEBjb2Rley50ZXh0MX0gaW50byB0aGUgb3ZlcmxheSBhcmVhIG1pZ2h0IGxvb2sKLWxpa2UgdGhlIGZvbGxvd2luZy4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi0gIGV4dGVybiBjaGFyIF9fbG9hZF9zdGFydF90ZXh0MSwgX19sb2FkX3N0b3BfdGV4dDE7Ci0gIG1lbWNweSAoKGNoYXIgKikgMHgxMDAwLCAmX19sb2FkX3N0YXJ0X3RleHQxLAotICAgICAgICAgICZfX2xvYWRfc3RvcF90ZXh0MSAtICZfX2xvYWRfc3RhcnRfdGV4dDEpOwotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotTm90ZSB0aGF0IHRoZSBAY29kZXtPVkVSTEFZfSBjb21tYW5kIGlzIGp1c3Qgc3ludGFjdGljIHN1Z2FyLCBzaW5jZQotZXZlcnl0aGluZyBpdCBkb2VzIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBtb3JlIGJhc2ljIGNvbW1hbmRzLiAgVGhlIGFib3ZlCi1leGFtcGxlIGNvdWxkIGhhdmUgYmVlbiB3cml0dGVuIGlkZW50aWNhbGx5IGFzIGZvbGxvd3MuCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotICAudGV4dDAgMHgxMDAwIDogQVQgKDB4NDAwMCkgQHsgbzEvKi5vKC50ZXh0KSBAfQotICBfX2xvYWRfc3RhcnRfdGV4dDAgPSBMT0FEQUREUiAoLnRleHQwKTsKLSAgX19sb2FkX3N0b3BfdGV4dDAgPSBMT0FEQUREUiAoLnRleHQwKSArIFNJWkVPRiAoLnRleHQwKTsKLSAgLnRleHQxIDB4MTAwMCA6IEFUICgweDQwMDAgKyBTSVpFT0YgKC50ZXh0MCkpIEB7IG8yLyoubygudGV4dCkgQH0KLSAgX19sb2FkX3N0YXJ0X3RleHQxID0gTE9BREFERFIgKC50ZXh0MSk7Ci0gIF9fbG9hZF9zdG9wX3RleHQxID0gTE9BREFERFIgKC50ZXh0MSkgKyBTSVpFT0YgKC50ZXh0MSk7Ci0gIC4gPSAweDEwMDAgKyBNQVggKFNJWkVPRiAoLnRleHQwKSwgU0laRU9GICgudGV4dDEpKTsKLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE1FTU9SWQotQHNlY3Rpb24gTUVNT1JZIGNvbW1hbmQKLUBraW5kZXggTUVNT1JZCi1AY2luZGV4IG1lbW9yeSByZWdpb25zCi1AY2luZGV4IHJlZ2lvbnMgb2YgbWVtb3J5Ci1AY2luZGV4IGFsbG9jYXRpbmcgbWVtb3J5Ci1AY2luZGV4IGRpc2NvbnRpbnVvdXMgbWVtb3J5Ci1UaGUgbGlua2VyJ3MgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBlcm1pdHMgYWxsb2NhdGlvbiBvZiBhbGwgYXZhaWxhYmxlCi1tZW1vcnkuICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgdXNpbmcgdGhlIEBjb2Rle01FTU9SWX0gY29tbWFuZC4KLQotVGhlIEBjb2Rle01FTU9SWX0gY29tbWFuZCBkZXNjcmliZXMgdGhlIGxvY2F0aW9uIGFuZCBzaXplIG9mIGJsb2NrcyBvZgotbWVtb3J5IGluIHRoZSB0YXJnZXQuICBZb3UgY2FuIHVzZSBpdCB0byBkZXNjcmliZSB3aGljaCBtZW1vcnkgcmVnaW9ucwotbWF5IGJlIHVzZWQgYnkgdGhlIGxpbmtlciwgYW5kIHdoaWNoIG1lbW9yeSByZWdpb25zIGl0IG11c3QgYXZvaWQuICBZb3UKLWNhbiB0aGVuIGFzc2lnbiBzZWN0aW9ucyB0byBwYXJ0aWN1bGFyIG1lbW9yeSByZWdpb25zLiAgVGhlIGxpbmtlciB3aWxsCi1zZXQgc2VjdGlvbiBhZGRyZXNzZXMgYmFzZWQgb24gdGhlIG1lbW9yeSByZWdpb25zLCBhbmQgd2lsbCB3YXJuIGFib3V0Ci1yZWdpb25zIHRoYXQgYmVjb21lIHRvbyBmdWxsLiAgVGhlIGxpbmtlciB3aWxsIG5vdCBzaHVmZmxlIHNlY3Rpb25zCi1hcm91bmQgdG8gZml0IGludG8gdGhlIGF2YWlsYWJsZSByZWdpb25zLgotCi1BIGxpbmtlciBzY3JpcHQgbWF5IGNvbnRhaW4gYXQgbW9zdCBvbmUgdXNlIG9mIHRoZSBAY29kZXtNRU1PUll9Ci1jb21tYW5kLiAgSG93ZXZlciwgeW91IGNhbiBkZWZpbmUgYXMgbWFueSBibG9ja3Mgb2YgbWVtb3J5IHdpdGhpbiBpdCBhcwoteW91IHdpc2guICBUaGUgc3ludGF4IGlzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1NRU1PUlkgCi0gIEB7Ci0gICAgQHZhcntuYW1lfSBbKEB2YXJ7YXR0cn0pXSA6IE9SSUdJTiA9IEB2YXJ7b3JpZ2lufSwgTEVOR1RIID0gQHZhcntsZW59Ci0gICAgQGRvdHN7fQotICBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEB2YXJ7bmFtZX0gaXMgYSBuYW1lIHVzZWQgaW4gdGhlIGxpbmtlciBzY3JpcHQgdG8gcmVmZXIgdG8gdGhlCi1yZWdpb24uICBUaGUgcmVnaW9uIG5hbWUgaGFzIG5vIG1lYW5pbmcgb3V0c2lkZSBvZiB0aGUgbGlua2VyIHNjcmlwdC4KLVJlZ2lvbiBuYW1lcyBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgbmFtZSBzcGFjZSwgYW5kIHdpbGwgbm90IGNvbmZsaWN0Ci13aXRoIHN5bWJvbCBuYW1lcywgZmlsZSBuYW1lcywgb3Igc2VjdGlvbiBuYW1lcy4gIEVhY2ggbWVtb3J5IHJlZ2lvbgotbXVzdCBoYXZlIGEgZGlzdGluY3QgbmFtZS4KLQotQGNpbmRleCBtZW1vcnkgcmVnaW9uIGF0dHJpYnV0ZXMKLVRoZSBAdmFye2F0dHJ9IHN0cmluZyBpcyBhbiBvcHRpb25hbCBsaXN0IG9mIGF0dHJpYnV0ZXMgdGhhdCBzcGVjaWZ5Ci13aGV0aGVyIHRvIHVzZSBhIHBhcnRpY3VsYXIgbWVtb3J5IHJlZ2lvbiBmb3IgYW4gaW5wdXQgc2VjdGlvbiB3aGljaCBpcwotbm90IGV4cGxpY2l0bHkgbWFwcGVkIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgQXMgZGVzY3JpYmVkIGluCi1AcmVme1NFQ1RJT05TfSwgaWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFuIG91dHB1dCBzZWN0aW9uIGZvciBzb21lIGlucHV0Ci1zZWN0aW9uLCB0aGUgbGlua2VyIHdpbGwgY3JlYXRlIGFuIG91dHB1dCBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBhcwotdGhlIGlucHV0IHNlY3Rpb24uICBJZiB5b3UgZGVmaW5lIHJlZ2lvbiBhdHRyaWJ1dGVzLCB0aGUgbGlua2VyIHdpbGwgdXNlCi10aGVtIHRvIHNlbGVjdCB0aGUgbWVtb3J5IHJlZ2lvbiBmb3IgdGhlIG91dHB1dCBzZWN0aW9uIHRoYXQgaXQgY3JlYXRlcy4KLQotVGhlIEB2YXJ7YXR0cn0gc3RyaW5nIG11c3QgY29uc2lzdCBvbmx5IG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKLUB0YWJsZSBAc2FtcAotQGl0ZW0gUgotUmVhZC1vbmx5IHNlY3Rpb24KLUBpdGVtIFcKLVJlYWQvd3JpdGUgc2VjdGlvbgotQGl0ZW0gWAotRXhlY3V0YWJsZSBzZWN0aW9uCi1AaXRlbSBBCi1BbGxvY2F0YWJsZSBzZWN0aW9uCi1AaXRlbSBJCi1Jbml0aWFsaXplZCBzZWN0aW9uCi1AaXRlbSBMCi1TYW1lIGFzIEBzYW1we0l9Ci1AaXRlbSAhCi1JbnZlcnQgdGhlIHNlbnNlIG9mIGFueSBvZiB0aGUgcHJlY2VkaW5nIGF0dHJpYnV0ZXMKLUBlbmQgdGFibGUKLQotSWYgYSB1bm1hcHBlZCBzZWN0aW9uIG1hdGNoZXMgYW55IG9mIHRoZSBsaXN0ZWQgYXR0cmlidXRlcyBvdGhlciB0aGFuCi1Ac2FtcHshfSwgaXQgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIG1lbW9yeSByZWdpb24uICBUaGUgQHNhbXB7IX0KLWF0dHJpYnV0ZSByZXZlcnNlcyB0aGlzIHRlc3QsIHNvIHRoYXQgYW4gdW5tYXBwZWQgc2VjdGlvbiB3aWxsIGJlIHBsYWNlZAotaW4gdGhlIG1lbW9yeSByZWdpb24gb25seSBpZiBpdCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIGxpc3RlZAotYXR0cmlidXRlcy4KLQotQGtpbmRleCBPUklHSU4gPQotQGtpbmRleCBvID0KLUBraW5kZXggb3JnID0KLVRoZSBAdmFye29yaWdpbn0gaXMgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG1lbW9yeQotcmVnaW9uLiAgVGhlIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byBhIGNvbnN0YW50IGJlZm9yZSBtZW1vcnkKLWFsbG9jYXRpb24gaXMgcGVyZm9ybWVkLCB3aGljaCBtZWFucyB0aGF0IHlvdSBtYXkgbm90IHVzZSBhbnkgc2VjdGlvbgotcmVsYXRpdmUgc3ltYm9scy4gIFRoZSBrZXl3b3JkIEBjb2Rle09SSUdJTn0gbWF5IGJlIGFiYnJldmlhdGVkIHRvCi1AY29kZXtvcmd9IG9yIEBjb2Rle299IChidXQgbm90LCBmb3IgZXhhbXBsZSwgQGNvZGV7T1JHfSkuCi0KLUBraW5kZXggTEVOR1RIID0KLUBraW5kZXggbGVuID0KLUBraW5kZXggbCA9Ci1UaGUgQHZhcntsZW59IGlzIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkKLXJlZ2lvbi4gIEFzIHdpdGggdGhlIEB2YXJ7b3JpZ2lufSBleHByZXNzaW9uLCB0aGUgZXhwcmVzc2lvbiBtdXN0Ci1ldmFsdWF0ZSB0byBhIGNvbnN0YW50IGJlZm9yZSBtZW1vcnkgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQuICBUaGUKLWtleXdvcmQgQGNvZGV7TEVOR1RIfSBtYXkgYmUgYWJicmV2aWF0ZWQgdG8gQGNvZGV7bGVufSBvciBAY29kZXtsfS4KLQotSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB3ZSBzcGVjaWZ5IHRoYXQgdGhlcmUgYXJlIHR3byBtZW1vcnkgcmVnaW9ucwotYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uOiBvbmUgc3RhcnRpbmcgYXQgQHNhbXB7MH0gZm9yIDI1NiBraWxvYnl0ZXMsCi1hbmQgdGhlIG90aGVyIHN0YXJ0aW5nIGF0IEBzYW1wezB4NDAwMDAwMDB9IGZvciBmb3VyIG1lZ2FieXRlcy4gIFRoZQotbGlua2VyIHdpbGwgcGxhY2UgaW50byB0aGUgQHNhbXB7cm9tfSBtZW1vcnkgcmVnaW9uIGV2ZXJ5IHNlY3Rpb24gd2hpY2gKLWlzIG5vdCBleHBsaWNpdGx5IG1hcHBlZCBpbnRvIGEgbWVtb3J5IHJlZ2lvbiwgYW5kIGlzIGVpdGhlciByZWFkLW9ubHkKLW9yIGV4ZWN1dGFibGUuICBUaGUgbGlua2VyIHdpbGwgcGxhY2Ugb3RoZXIgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdAotZXhwbGljaXRseSBtYXBwZWQgaW50byBhIG1lbW9yeSByZWdpb24gaW50byB0aGUgQHNhbXB7cmFtfSBtZW1vcnkKLXJlZ2lvbi4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1NRU1PUlkgCi0gIEB7Ci0gICAgcm9tIChyeCkgIDogT1JJR0lOID0gMCwgTEVOR1RIID0gMjU2SwotICAgIHJhbSAoIXJ4KSA6IG9yZyA9IDB4NDAwMDAwMDAsIGwgPSA0TQotICBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotT25jZSB5b3UgZGVmaW5lIGEgbWVtb3J5IHJlZ2lvbiwgeW91IGNhbiBkaXJlY3QgdGhlIGxpbmtlciB0byBwbGFjZQotc3BlY2lmaWMgb3V0cHV0IHNlY3Rpb25zIGludG8gdGhhdCBtZW1vcnkgcmVnaW9uIGJ5IHVzaW5nIHRoZQotQHNhbXB7PkB2YXJ7cmVnaW9ufX0gb3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCi1hIG1lbW9yeSByZWdpb24gbmFtZWQgQHNhbXB7bWVtfSwgeW91IHdvdWxkIHVzZSBAc2FtcHs+bWVtfSBpbiB0aGUKLW91dHB1dCBzZWN0aW9uIGRlZmluaXRpb24uICBAeHJlZntPdXRwdXQgU2VjdGlvbiBSZWdpb259LiAgSWYgbm8gYWRkcmVzcwotd2FzIHNwZWNpZmllZCBmb3IgdGhlIG91dHB1dCBzZWN0aW9uLCB0aGUgbGlua2VyIHdpbGwgc2V0IHRoZSBhZGRyZXNzIHRvCi10aGUgbmV4dCBhdmFpbGFibGUgYWRkcmVzcyB3aXRoaW4gdGhlIG1lbW9yeSByZWdpb24uICBJZiB0aGUgY29tYmluZWQKLW91dHB1dCBzZWN0aW9ucyBkaXJlY3RlZCB0byBhIG1lbW9yeSByZWdpb24gYXJlIHRvbyBsYXJnZSBmb3IgdGhlCi1yZWdpb24sIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlLgotCi1Abm9kZSBQSERSUwotQHNlY3Rpb24gUEhEUlMgQ29tbWFuZAotQGtpbmRleCBQSERSUwotQGNpbmRleCBwcm9ncmFtIGhlYWRlcnMKLUBjaW5kZXggRUxGIHByb2dyYW0gaGVhZGVycwotQGNpbmRleCBwcm9ncmFtIHNlZ21lbnRzCi1AY2luZGV4IHNlZ21lbnRzLCBFTEYKLVRoZSBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0IHVzZXMgQGRmbntwcm9ncmFtIGhlYWRlcnN9LCBhbHNvIGtub3dzIGFzCi1AZGZue3NlZ21lbnRzfS4gIFRoZSBwcm9ncmFtIGhlYWRlcnMgZGVzY3JpYmUgaG93IHRoZSBwcm9ncmFtIHNob3VsZCBiZQotbG9hZGVkIGludG8gbWVtb3J5LiAgWW91IGNhbiBwcmludCB0aGVtIG91dCBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0KLXByb2dyYW0gd2l0aCB0aGUgQHNhbXB7LXB9IG9wdGlvbi4KLQotV2hlbiB5b3UgcnVuIGFuIEVMRiBwcm9ncmFtIG9uIGEgbmF0aXZlIEVMRiBzeXN0ZW0sIHRoZSBzeXN0ZW0gbG9hZGVyCi1yZWFkcyB0aGUgcHJvZ3JhbSBoZWFkZXJzIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGxvYWQgdGhlCi1wcm9ncmFtLiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgcHJvZ3JhbSBoZWFkZXJzIGFyZSBzZXQgY29ycmVjdGx5LgotVGhpcyBtYW51YWwgZG9lcyBub3QgZGVzY3JpYmUgdGhlIGRldGFpbHMgb2YgaG93IHRoZSBzeXN0ZW0gbG9hZGVyCi1pbnRlcnByZXRzIHByb2dyYW0gaGVhZGVyczsgZm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgRUxGIEFCSS4KLQotVGhlIGxpbmtlciB3aWxsIGNyZWF0ZSByZWFzb25hYmxlIHByb2dyYW0gaGVhZGVycyBieSBkZWZhdWx0LiAgSG93ZXZlciwKLWluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSBwcm9ncmFtIGhlYWRlcnMgbW9yZQotcHJlY2lzZWx5LiAgWW91IG1heSB1c2UgdGhlIEBjb2Rle1BIRFJTfSBjb21tYW5kIGZvciB0aGlzIHB1cnBvc2UuICBXaGVuCi10aGUgbGlua2VyIHNlZXMgdGhlIEBjb2Rle1BIRFJTfSBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LCBpdCB3aWxsCi1ub3QgY3JlYXRlIGFueSBwcm9ncmFtIGhlYWRlcnMgb3RoZXIgdGhhbiB0aGUgb25lcyBzcGVjaWZpZWQuCi0KLVRoZSBsaW5rZXIgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgQGNvZGV7UEhEUlN9IGNvbW1hbmQgd2hlbgotZ2VuZXJhdGluZyBhbiBFTEYgb3V0cHV0IGZpbGUuICBJbiBvdGhlciBjYXNlcywgdGhlIGxpbmtlciB3aWxsIHNpbXBseQotaWdub3JlIEBjb2Rle1BIRFJTfS4KLQotVGhpcyBpcyB0aGUgc3ludGF4IG9mIHRoZSBAY29kZXtQSERSU30gY29tbWFuZC4gIFRoZSB3b3JkcyBAY29kZXtQSERSU30sCi1AY29kZXtGSUxFSERSfSwgQGNvZGV7QVR9LCBhbmQgQGNvZGV7RkxBR1N9IGFyZSBrZXl3b3Jkcy4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1QSERSUwotQHsKLSAgQHZhcntuYW1lfSBAdmFye3R5cGV9IFsgRklMRUhEUiBdIFsgUEhEUlMgXSBbIEFUICggQHZhcnthZGRyZXNzfSApIF0KLSAgICAgICAgWyBGTEFHUyAoIEB2YXJ7ZmxhZ3N9ICkgXSA7Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEB2YXJ7bmFtZX0gaXMgdXNlZCBvbmx5IGZvciByZWZlcmVuY2UgaW4gdGhlIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kCi1vZiB0aGUgbGlua2VyIHNjcmlwdC4gIEl0IGlzIG5vdCBwdXQgaW50byB0aGUgb3V0cHV0IGZpbGUuICBQcm9ncmFtCi1oZWFkZXIgbmFtZXMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG5hbWUgc3BhY2UsIGFuZCB3aWxsIG5vdCBjb25mbGljdAotd2l0aCBzeW1ib2wgbmFtZXMsIGZpbGUgbmFtZXMsIG9yIHNlY3Rpb24gbmFtZXMuICBFYWNoIHByb2dyYW0gaGVhZGVyCi1tdXN0IGhhdmUgYSBkaXN0aW5jdCBuYW1lLgotCi1DZXJ0YWluIHByb2dyYW0gaGVhZGVyIHR5cGVzIGRlc2NyaWJlIHNlZ21lbnRzIG9mIG1lbW9yeSB3aGljaCB0aGUKLXN5c3RlbSBsb2FkZXIgd2lsbCBsb2FkIGZyb20gdGhlIGZpbGUuICBJbiB0aGUgbGlua2VyIHNjcmlwdCwgeW91Ci1zcGVjaWZ5IHRoZSBjb250ZW50cyBvZiB0aGVzZSBzZWdtZW50cyBieSBwbGFjaW5nIGFsbG9jYXRhYmxlIG91dHB1dAotc2VjdGlvbnMgaW4gdGhlIHNlZ21lbnRzLiAgWW91IHVzZSB0aGUgQHNhbXB7OkB2YXJ7cGhkcn19IG91dHB1dCBzZWN0aW9uCi1hdHRyaWJ1dGUgdG8gcGxhY2UgYSBzZWN0aW9uIGluIGEgcGFydGljdWxhciBzZWdtZW50LiAgQHhyZWZ7T3V0cHV0Ci1TZWN0aW9uIFBoZHJ9LgotCi1JdCBpcyBub3JtYWwgdG8gcHV0IGNlcnRhaW4gc2VjdGlvbnMgaW4gbW9yZSB0aGFuIG9uZSBzZWdtZW50LiAgVGhpcwotbWVyZWx5IGltcGxpZXMgdGhhdCBvbmUgc2VnbWVudCBvZiBtZW1vcnkgY29udGFpbnMgYW5vdGhlci4gIFlvdSBtYXkKLXJlcGVhdCBAc2FtcHs6QHZhcntwaGRyfX0sIHVzaW5nIGl0IG9uY2UgZm9yIGVhY2ggc2VnbWVudCB3aGljaCBzaG91bGQKLWNvbnRhaW4gdGhlIHNlY3Rpb24uCi0KLUlmIHlvdSBwbGFjZSBhIHNlY3Rpb24gaW4gb25lIG9yIG1vcmUgc2VnbWVudHMgdXNpbmcgQHNhbXB7OkB2YXJ7cGhkcn19LAotdGhlbiB0aGUgbGlua2VyIHdpbGwgcGxhY2UgYWxsIHN1YnNlcXVlbnQgYWxsb2NhdGFibGUgc2VjdGlvbnMgd2hpY2ggZG8KLW5vdCBzcGVjaWZ5IEBzYW1wezpAdmFye3BoZHJ9fSBpbiB0aGUgc2FtZSBzZWdtZW50cy4gIFRoaXMgaXMgZm9yCi1jb252ZW5pZW5jZSwgc2luY2UgZ2VuZXJhbGx5IGEgd2hvbGUgc2V0IG9mIGNvbnRpZ3VvdXMgc2VjdGlvbnMgd2lsbCBiZQotcGxhY2VkIGluIGEgc2luZ2xlIHNlZ21lbnQuICBZb3UgY2FuIHVzZSBAY29kZXs6Tk9ORX0gdG8gb3ZlcnJpZGUgdGhlCi1kZWZhdWx0IHNlZ21lbnQgYW5kIHRlbGwgdGhlIGxpbmtlciB0byBub3QgcHV0IHRoZSBzZWN0aW9uIGluIGFueQotc2VnbWVudCBhdCBhbGwuCi0KLUBraW5kZXggRklMRUhEUgotQGtpbmRleCBQSERSUwotWW91IG1heSB1c2UgdGhlIEBjb2Rle0ZJTEVIRFJ9IGFuZCBAY29kZXtQSERSU30ga2V5d29yZHMgYXBwZWFyIGFmdGVyCi10aGUgcHJvZ3JhbSBoZWFkZXIgdHlwZSB0byBmdXJ0aGVyIGRlc2NyaWJlIHRoZSBjb250ZW50cyBvZiB0aGUgc2VnbWVudC4KLVRoZSBAY29kZXtGSUxFSERSfSBrZXl3b3JkIG1lYW5zIHRoYXQgdGhlIHNlZ21lbnQgc2hvdWxkIGluY2x1ZGUgdGhlIEVMRgotZmlsZSBoZWFkZXIuICBUaGUgQGNvZGV7UEhEUlN9IGtleXdvcmQgbWVhbnMgdGhhdCB0aGUgc2VnbWVudCBzaG91bGQKLWluY2x1ZGUgdGhlIEVMRiBwcm9ncmFtIGhlYWRlcnMgdGhlbXNlbHZlcy4KLQotVGhlIEB2YXJ7dHlwZX0gbWF5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nLiAgVGhlIG51bWJlcnMgaW5kaWNhdGUgdGhlCi12YWx1ZSBvZiB0aGUga2V5d29yZC4KLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBAY29kZXtQVF9OVUxMfSAoMCkKLUluZGljYXRlcyBhbiB1bnVzZWQgcHJvZ3JhbSBoZWFkZXIuCi0KLUBpdGVtIEBjb2Rle1BUX0xPQUR9ICgxKQotSW5kaWNhdGVzIHRoYXQgdGhpcyBwcm9ncmFtIGhlYWRlciBkZXNjcmliZXMgYSBzZWdtZW50IHRvIGJlIGxvYWRlZCBmcm9tCi10aGUgZmlsZS4KLQotQGl0ZW0gQGNvZGV7UFRfRFlOQU1JQ30gKDIpCi1JbmRpY2F0ZXMgYSBzZWdtZW50IHdoZXJlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQuCi0KLUBpdGVtIEBjb2Rle1BUX0lOVEVSUH0gKDMpCi1JbmRpY2F0ZXMgYSBzZWdtZW50IHdoZXJlIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIGludGVycHJldGVyIG1heSBiZQotZm91bmQuCi0KLUBpdGVtIEBjb2Rle1BUX05PVEV9ICg0KQotSW5kaWNhdGVzIGEgc2VnbWVudCBob2xkaW5nIG5vdGUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIEBjb2Rle1BUX1NITElCfSAoNSkKLUEgcmVzZXJ2ZWQgcHJvZ3JhbSBoZWFkZXIgdHlwZSwgZGVmaW5lZCBidXQgbm90IHNwZWNpZmllZCBieSB0aGUgRUxGCi1BQkkuCi0KLUBpdGVtIEBjb2Rle1BUX1BIRFJ9ICg2KQotSW5kaWNhdGVzIGEgc2VnbWVudCB3aGVyZSB0aGUgcHJvZ3JhbSBoZWFkZXJzIG1heSBiZSBmb3VuZC4KLQotQGl0ZW0gQHZhcntleHByZXNzaW9ufQotQW4gZXhwcmVzc2lvbiBnaXZpbmcgdGhlIG51bWVyaWMgdHlwZSBvZiB0aGUgcHJvZ3JhbSBoZWFkZXIuICBUaGlzIG1heQotYmUgdXNlZCBmb3IgdHlwZXMgbm90IGRlZmluZWQgYWJvdmUuCi1AZW5kIHRhYmxlCi0KLVlvdSBjYW4gc3BlY2lmeSB0aGF0IGEgc2VnbWVudCBzaG91bGQgYmUgbG9hZGVkIGF0IGEgcGFydGljdWxhciBhZGRyZXNzCi1pbiBtZW1vcnkgYnkgdXNpbmcgYW4gQGNvZGV7QVR9IGV4cHJlc3Npb24uICBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUKLUBjb2Rle0FUfSBjb21tYW5kIHVzZWQgYXMgYW4gb3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlIChAcHhyZWZ7T3V0cHV0Ci1TZWN0aW9uIExNQX0pLiAgVGhlIEBjb2Rle0FUfSBjb21tYW5kIGZvciBhIHByb2dyYW0gaGVhZGVyIG92ZXJyaWRlcyB0aGUKLW91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZS4KLQotVGhlIGxpbmtlciB3aWxsIG5vcm1hbGx5IHNldCB0aGUgc2VnbWVudCBmbGFncyBiYXNlZCBvbiB0aGUgc2VjdGlvbnMKLXdoaWNoIGNvbXByaXNlIHRoZSBzZWdtZW50LiAgWW91IG1heSB1c2UgdGhlIEBjb2Rle0ZMQUdTfSBrZXl3b3JkIHRvCi1leHBsaWNpdGx5IHNwZWNpZnkgdGhlIHNlZ21lbnQgZmxhZ3MuICBUaGUgdmFsdWUgb2YgQHZhcntmbGFnc30gbXVzdCBiZQotYW4gaW50ZWdlci4gIEl0IGlzIHVzZWQgdG8gc2V0IHRoZSBAY29kZXtwX2ZsYWdzfSBmaWVsZCBvZiB0aGUgcHJvZ3JhbQotaGVhZGVyLgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgQGNvZGV7UEhEUlN9LiAgVGhpcyBzaG93cyBhIHR5cGljYWwgc2V0IG9mIHByb2dyYW0KLWhlYWRlcnMgdXNlZCBvbiBhIG5hdGl2ZSBFTEYgc3lzdGVtLgotCi1AZXhhbXBsZQotQGdyb3VwCi1QSERSUwotQHsKLSAgaGVhZGVycyBQVF9QSERSIFBIRFJTIDsKLSAgaW50ZXJwIFBUX0lOVEVSUCA7Ci0gIHRleHQgUFRfTE9BRCBGSUxFSERSIFBIRFJTIDsKLSAgZGF0YSBQVF9MT0FEIDsKLSAgZHluYW1pYyBQVF9EWU5BTUlDIDsKLUB9Ci0KLVNFQ1RJT05TCi1AewotICAuID0gU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiBAeyAqKC5pbnRlcnApIEB9IDp0ZXh0IDppbnRlcnAKLSAgLnRleHQgOiBAeyAqKC50ZXh0KSBAfSA6dGV4dAotICAucm9kYXRhIDogQHsgKigucm9kYXRhKSBAfSAvKiBkZWZhdWx0cyB0byA6dGV4dCAqLwotICBAZG90c3t9Ci0gIC4gPSAuICsgMHgxMDAwOyAvKiBtb3ZlIHRvIGEgbmV3IHBhZ2UgaW4gbWVtb3J5ICovCi0gIC5kYXRhIDogQHsgKiguZGF0YSkgQH0gOmRhdGEKLSAgLmR5bmFtaWMgOiBAeyAqKC5keW5hbWljKSBAfSA6ZGF0YSA6ZHluYW1pYwotICBAZG90c3t9Ci1AfQotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLUBub2RlIFZFUlNJT04KLUBzZWN0aW9uIFZFUlNJT04gQ29tbWFuZAotQGtpbmRleCBWRVJTSU9OIEB7c2NyaXB0IHRleHRAfQotQGNpbmRleCBzeW1ib2wgdmVyc2lvbnMKLUBjaW5kZXggdmVyc2lvbiBzY3JpcHQKLUBjaW5kZXggdmVyc2lvbnMgb2Ygc3ltYm9scwotVGhlIGxpbmtlciBzdXBwb3J0cyBzeW1ib2wgdmVyc2lvbnMgd2hlbiB1c2luZyBFTEYuICBTeW1ib2wgdmVyc2lvbnMgYXJlCi1vbmx5IHVzZWZ1bCB3aGVuIHVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgZHluYW1pYyBsaW5rZXIgY2FuIHVzZQotc3ltYm9sIHZlcnNpb25zIHRvIHNlbGVjdCBhIHNwZWNpZmljIHZlcnNpb24gb2YgYSBmdW5jdGlvbiB3aGVuIGl0IHJ1bnMKLWEgcHJvZ3JhbSB0aGF0IG1heSBoYXZlIGJlZW4gbGlua2VkIGFnYWluc3QgYW4gZWFybGllciB2ZXJzaW9uIG9mIHRoZQotc2hhcmVkIGxpYnJhcnkuCi0KLVlvdSBjYW4gaW5jbHVkZSBhIHZlcnNpb24gc2NyaXB0IGRpcmVjdGx5IGluIHRoZSBtYWluIGxpbmtlciBzY3JpcHQsIG9yCi15b3UgY2FuIHN1cHBseSB0aGUgdmVyc2lvbiBzY3JpcHQgYXMgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdC4gIFlvdSBjYW4KLWFsc28gdXNlIHRoZSBAc2FtcHstLXZlcnNpb24tc2NyaXB0fSBsaW5rZXIgb3B0aW9uLgotCi1UaGUgc3ludGF4IG9mIHRoZSBAY29kZXtWRVJTSU9OfSBjb21tYW5kIGlzIHNpbXBseQotQHNtYWxsZXhhbXBsZQotVkVSU0lPTiBAeyB2ZXJzaW9uLXNjcmlwdC1jb21tYW5kcyBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIGZvcm1hdCBvZiB0aGUgdmVyc2lvbiBzY3JpcHQgY29tbWFuZHMgaXMgaWRlbnRpY2FsIHRvIHRoYXQgdXNlZCBieQotU3VuJ3MgbGlua2VyIGluIFNvbGFyaXMgMi41LiAgVGhlIHZlcnNpb24gc2NyaXB0IGRlZmluZXMgYSB0cmVlIG9mCi12ZXJzaW9uIG5vZGVzLiAgWW91IHNwZWNpZnkgdGhlIG5vZGUgbmFtZXMgYW5kIGludGVyZGVwZW5kZW5jaWVzIGluIHRoZQotdmVyc2lvbiBzY3JpcHQuICBZb3UgY2FuIHNwZWNpZnkgd2hpY2ggc3ltYm9scyBhcmUgYm91bmQgdG8gd2hpY2gKLXZlcnNpb24gbm9kZXMsIGFuZCB5b3UgY2FuIHJlZHVjZSBhIHNwZWNpZmllZCBzZXQgb2Ygc3ltYm9scyB0byBsb2NhbAotc2NvcGUgc28gdGhhdCB0aGV5IGFyZSBub3QgZ2xvYmFsbHkgdmlzaWJsZSBvdXRzaWRlIG9mIHRoZSBzaGFyZWQKLWxpYnJhcnkuCi0KLVRoZSBlYXNpZXN0IHdheSB0byBkZW1vbnN0cmF0ZSB0aGUgdmVyc2lvbiBzY3JpcHQgbGFuZ3VhZ2UgaXMgd2l0aCBhIGZldwotZXhhbXBsZXMuCi0KLUBzbWFsbGV4YW1wbGUKLVZFUlNfMS4xIEB7Ci0JIGdsb2JhbDoKLQkJIGZvbzE7Ci0JIGxvY2FsOgotCQkgb2xkKjsgCi0JCSBvcmlnaW5hbCo7IAotCQkgbmV3KjsgCi1AfTsKLQotVkVSU18xLjIgQHsKLQkJIGZvbzI7Ci1AfSBWRVJTXzEuMTsKLQotVkVSU18yLjAgQHsKLQkJIGJhcjE7IGJhcjI7Ci1AfSBWRVJTXzEuMjsKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoaXMgZXhhbXBsZSB2ZXJzaW9uIHNjcmlwdCBkZWZpbmVzIHRocmVlIHZlcnNpb24gbm9kZXMuICBUaGUgZmlyc3QKLXZlcnNpb24gbm9kZSBkZWZpbmVkIGlzIEBzYW1we1ZFUlNfMS4xfTsgaXQgaGFzIG5vIG90aGVyIGRlcGVuZGVuY2llcy4KLVRoZSBzY3JpcHQgYmluZHMgdGhlIHN5bWJvbCBAc2FtcHtmb28xfSB0byBAc2FtcHtWRVJTXzEuMX0uICBJdCByZWR1Y2VzCi1hIG51bWJlciBvZiBzeW1ib2xzIHRvIGxvY2FsIHNjb3BlIHNvIHRoYXQgdGhleSBhcmUgbm90IHZpc2libGUgb3V0c2lkZQotb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgotCi1OZXh0LCB0aGUgdmVyc2lvbiBzY3JpcHQgZGVmaW5lcyBub2RlIEBzYW1we1ZFUlNfMS4yfS4gIFRoaXMgbm9kZQotZGVwZW5kcyB1cG9uIEBzYW1we1ZFUlNfMS4xfS4gIFRoZSBzY3JpcHQgYmluZHMgdGhlIHN5bWJvbCBAc2FtcHtmb28yfQotdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzEuMn0uCi0KLUZpbmFsbHksIHRoZSB2ZXJzaW9uIHNjcmlwdCBkZWZpbmVzIG5vZGUgQHNhbXB7VkVSU18yLjB9LiAgVGhpcyBub2RlCi1kZXBlbmRzIHVwb24gQHNhbXB7VkVSU18xLjJ9LiAgVGhlIHNjcmlwdHMgYmluZHMgdGhlIHN5bWJvbHMgQHNhbXB7YmFyMX0KLWFuZCBAc2FtcHtiYXIyfSBhcmUgYm91bmQgdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzIuMH0uCi0KLVdoZW4gdGhlIGxpbmtlciBmaW5kcyBhIHN5bWJvbCBkZWZpbmVkIGluIGEgbGlicmFyeSB3aGljaCBpcyBub3QKLXNwZWNpZmljYWxseSBib3VuZCB0byBhIHZlcnNpb24gbm9kZSwgaXQgd2lsbCBlZmZlY3RpdmVseSBiaW5kIGl0IHRvIGFuCi11bnNwZWNpZmllZCBiYXNlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBZb3UgY2FuIGJpbmQgYWxsIG90aGVyd2lzZQotdW5zcGVjaWZpZWQgc3ltYm9scyB0byBhIGdpdmVuIHZlcnNpb24gbm9kZSBieSB1c2luZyBAc2FtcHtnbG9iYWw6ICp9Ci1zb21ld2hlcmUgaW4gdGhlIHZlcnNpb24gc2NyaXB0LgotCi1UaGUgbmFtZXMgb2YgdGhlIHZlcnNpb24gbm9kZXMgaGF2ZSBubyBzcGVjaWZpYyBtZWFuaW5nIG90aGVyIHRoYW4gd2hhdAotdGhleSBtaWdodCBzdWdnZXN0IHRvIHRoZSBwZXJzb24gcmVhZGluZyB0aGVtLiAgVGhlIEBzYW1wezIuMH0gdmVyc2lvbgotY291bGQganVzdCBhcyB3ZWxsIGhhdmUgYXBwZWFyZWQgaW4gYmV0d2VlbiBAc2FtcHsxLjF9IGFuZCBAc2FtcHsxLjJ9LgotSG93ZXZlciwgdGhpcyB3b3VsZCBiZSBhIGNvbmZ1c2luZyB3YXkgdG8gd3JpdGUgYSB2ZXJzaW9uIHNjcmlwdC4KLQotV2hlbiB5b3UgbGluayBhbiBhcHBsaWNhdGlvbiBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgdGhhdCBoYXMgdmVyc2lvbmVkCi1zeW1ib2xzLCB0aGUgYXBwbGljYXRpb24gaXRzZWxmIGtub3dzIHdoaWNoIHZlcnNpb24gb2YgZWFjaCBzeW1ib2wgaXQKLXJlcXVpcmVzLCBhbmQgaXQgYWxzbyBrbm93cyB3aGljaCB2ZXJzaW9uIG5vZGVzIGl0IG5lZWRzIGZyb20gZWFjaAotc2hhcmVkIGxpYnJhcnkgaXQgaXMgbGlua2VkIGFnYWluc3QuICBUaHVzIGF0IHJ1bnRpbWUsIHRoZSBkeW5hbWljCi1sb2FkZXIgY2FuIG1ha2UgYSBxdWljayBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbGlicmFyaWVzIHlvdSBoYXZlCi1saW5rZWQgYWdhaW5zdCBkbyBpbiBmYWN0IHN1cHBseSBhbGwgb2YgdGhlIHZlcnNpb24gbm9kZXMgdGhhdCB0aGUKLWFwcGxpY2F0aW9uIHdpbGwgbmVlZCB0byByZXNvbHZlIGFsbCBvZiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgSW4gdGhpcwotd2F5IGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgZHluYW1pYyBsaW5rZXIgdG8ga25vdyB3aXRoIGNlcnRhaW50eSB0aGF0Ci1hbGwgZXh0ZXJuYWwgc3ltYm9scyB0aGF0IGl0IG5lZWRzIHdpbGwgYmUgcmVzb2x2YWJsZSB3aXRob3V0IGhhdmluZyB0bwotc2VhcmNoIGZvciBlYWNoIHN5bWJvbCByZWZlcmVuY2UuCi0KLVRoZSBzeW1ib2wgdmVyc2lvbmluZyBpcyBpbiBlZmZlY3QgYSBtdWNoIG1vcmUgc29waGlzdGljYXRlZCB3YXkgb2YKLWRvaW5nIG1pbm9yIHZlcnNpb24gY2hlY2tpbmcgdGhhdCBTdW5PUyBkb2VzLiAgVGhlIGZ1bmRhbWVudGFsIHByb2JsZW0KLXRoYXQgaXMgYmVpbmcgYWRkcmVzc2VkIGhlcmUgaXMgdGhhdCB0eXBpY2FsbHkgcmVmZXJlbmNlcyB0byBleHRlcm5hbAotZnVuY3Rpb25zIGFyZSBib3VuZCBvbiBhbiBhcy1uZWVkZWQgYmFzaXMsIGFuZCBhcmUgbm90IGFsbCBib3VuZCB3aGVuCi10aGUgYXBwbGljYXRpb24gc3RhcnRzIHVwLiAgSWYgYSBzaGFyZWQgbGlicmFyeSBpcyBvdXQgb2YgZGF0ZSwgYQotcmVxdWlyZWQgaW50ZXJmYWNlIG1heSBiZSBtaXNzaW5nOyB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byB1c2UKLXRoYXQgaW50ZXJmYWNlLCBpdCBtYXkgc3VkZGVubHkgYW5kIHVuZXhwZWN0ZWRseSBmYWlsLiAgV2l0aCBzeW1ib2wKLXZlcnNpb25pbmcsIHRoZSB1c2VyIHdpbGwgZ2V0IGEgd2FybmluZyB3aGVuIHRoZXkgc3RhcnQgdGhlaXIgcHJvZ3JhbSBpZgotdGhlIGxpYnJhcmllcyBiZWluZyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGFyZSB0b28gb2xkLgotCi1UaGVyZSBhcmUgc2V2ZXJhbCBHTlUgZXh0ZW5zaW9ucyB0byBTdW4ncyB2ZXJzaW9uaW5nIGFwcHJvYWNoLiAgVGhlCi1maXJzdCBvZiB0aGVzZSBpcyB0aGUgYWJpbGl0eSB0byBiaW5kIGEgc3ltYm9sIHRvIGEgdmVyc2lvbiBub2RlIGluIHRoZQotc291cmNlIGZpbGUgd2hlcmUgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluc3RlYWQgb2YgaW4gdGhlIHZlcnNpb25pbmcKLXNjcmlwdC4gIFRoaXMgd2FzIGRvbmUgbWFpbmx5IHRvIHJlZHVjZSB0aGUgYnVyZGVuIG9uIHRoZSBsaWJyYXJ5Ci1tYWludGFpbmVyLiAgWW91IGNhbiBkbyB0aGlzIGJ5IHB1dHRpbmcgc29tZXRoaW5nIGxpa2U6Ci1Ac21hbGxleGFtcGxlCi1fX2FzbV9fKCIuc3ltdmVyIG9yaWdpbmFsX2Zvbyxmb29AQFZFUlNfMS4xIik7Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1pbiB0aGUgQyBzb3VyY2UgZmlsZS4gIFRoaXMgcmVuYW1lcyB0aGUgZnVuY3Rpb24gQHNhbXB7b3JpZ2luYWxfZm9vfSB0bwotYmUgYW4gYWxpYXMgZm9yIEBzYW1we2Zvb30gYm91bmQgdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzEuMX0uCi1UaGUgQHNhbXB7bG9jYWw6fSBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gcHJldmVudCB0aGUgc3ltYm9sCi1Ac2FtcHtvcmlnaW5hbF9mb299IGZyb20gYmVpbmcgZXhwb3J0ZWQuCi0KLVRoZSBzZWNvbmQgR05VIGV4dGVuc2lvbiBpcyB0byBhbGxvdyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZQotZnVuY3Rpb24gdG8gYXBwZWFyIGluIGEgZ2l2ZW4gc2hhcmVkIGxpYnJhcnkuICBJbiB0aGlzIHdheSB5b3UgY2FuIG1ha2UKLWFuIGluY29tcGF0aWJsZSBjaGFuZ2UgdG8gYW4gaW50ZXJmYWNlIHdpdGhvdXQgaW5jcmVhc2luZyB0aGUgbWFqb3IKLXZlcnNpb24gbnVtYmVyIG9mIHRoZSBzaGFyZWQgbGlicmFyeSwgd2hpbGUgc3RpbGwgYWxsb3dpbmcgYXBwbGljYXRpb25zCi1saW5rZWQgYWdhaW5zdCB0aGUgb2xkIGludGVyZmFjZSB0byBjb250aW51ZSB0byBmdW5jdGlvbi4KLQotVG8gZG8gdGhpcywgeW91IG11c3QgdXNlIG11bHRpcGxlIEBzYW1wey5zeW12ZXJ9IGRpcmVjdGl2ZXMgaW4gdGhlCi1zb3VyY2UgZmlsZS4gIEhlcmUgaXMgYW4gZXhhbXBsZToKLQotQHNtYWxsZXhhbXBsZQotX19hc21fXygiLnN5bXZlciBvcmlnaW5hbF9mb28sZm9vQEAiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2Zvbyxmb29AQFZFUlNfMS4xIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG9sZF9mb28xLGZvb0BAVkVSU18xLjIiKTsKLV9fYXNtX18oIi5zeW12ZXIgbmV3X2Zvbyxmb29AQEBAVkVSU18yLjAiKTsKLUBlbmQgc21hbGxleGFtcGxlCi0KLUluIHRoaXMgZXhhbXBsZSwgQHNhbXB7Zm9vQEB9IHJlcHJlc2VudHMgdGhlIHN5bWJvbCBAc2FtcHtmb299IGJvdW5kIHRvIHRoZQotdW5zcGVjaWZpZWQgYmFzZSB2ZXJzaW9uIG9mIHRoZSBzeW1ib2wuICBUaGUgc291cmNlIGZpbGUgdGhhdCBjb250YWlucyB0aGlzCi1leGFtcGxlIHdvdWxkIGRlZmluZSA0IEMgZnVuY3Rpb25zOiBAc2FtcHtvcmlnaW5hbF9mb299LCBAc2FtcHtvbGRfZm9vfSwKLUBzYW1we29sZF9mb28xfSwgYW5kIEBzYW1we25ld19mb299LgotCi1XaGVuIHlvdSBoYXZlIG11bHRpcGxlIGRlZmluaXRpb25zIG9mIGEgZ2l2ZW4gc3ltYm9sLCB0aGVyZSBuZWVkcyB0byBiZQotc29tZSB3YXkgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmVyc2lvbiB0byB3aGljaCBleHRlcm5hbCByZWZlcmVuY2VzIHRvCi10aGlzIHN5bWJvbCB3aWxsIGJlIGJvdW5kLiAgWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlCi1Ac2FtcHtmb29AQEBAVkVSU18yLjB9IHR5cGUgb2YgQHNhbXB7LnN5bXZlcn0gZGlyZWN0aXZlLiAgWW91IGNhbiBvbmx5Ci1kZWNsYXJlIG9uZSB2ZXJzaW9uIG9mIGEgc3ltYm9sIGFzIHRoZSBkZWZhdWx0IGluIHRoaXMgbWFubmVyOyBvdGhlcndpc2UKLXlvdSB3b3VsZCBlZmZlY3RpdmVseSBoYXZlIG11bHRpcGxlIGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIHN5bWJvbC4KLQotSWYgeW91IHdpc2ggdG8gYmluZCBhIHJlZmVyZW5jZSB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIHN5bWJvbAotd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSwgeW91IGNhbiB1c2UgdGhlIGFsaWFzZXMgb2YgY29udmVuaWVuY2UKLShpLmUuIEBzYW1we29sZF9mb299KSwgb3IgeW91IGNhbiB1c2UgdGhlIEBzYW1wey5zeW12ZXJ9IGRpcmVjdGl2ZSB0bwotc3BlY2lmaWNhbGx5IGJpbmQgdG8gYW4gZXh0ZXJuYWwgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gaW4gcXVlc3Rpb24uCi0KLUBub2RlIEV4cHJlc3Npb25zCi1Ac2VjdGlvbiBFeHByZXNzaW9ucyBpbiBMaW5rZXIgU2NyaXB0cwotQGNpbmRleCBleHByZXNzaW9ucwotQGNpbmRleCBhcml0aG1ldGljCi1UaGUgc3ludGF4IGZvciBleHByZXNzaW9ucyBpbiB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZSBpcyBpZGVudGljYWwgdG8KLXRoYXQgb2YgQyBleHByZXNzaW9ucy4gIEFsbCBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGFzIGludGVnZXJzLiAgQWxsCi1leHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGluIHRoZSBzYW1lIHNpemUsIHdoaWNoIGlzIDMyIGJpdHMgaWYgYm90aCB0aGUKLWhvc3QgYW5kIHRhcmdldCBhcmUgMzIgYml0cywgYW5kIGlzIG90aGVyd2lzZSA2NCBiaXRzLgotCi1Zb3UgY2FuIHVzZSBhbmQgc2V0IHN5bWJvbCB2YWx1ZXMgaW4gZXhwcmVzc2lvbnMuCi0KLVRoZSBsaW5rZXIgZGVmaW5lcyBzZXZlcmFsIHNwZWNpYWwgcHVycG9zZSBidWlsdGluIGZ1bmN0aW9ucyBmb3IgdXNlIGluCi1leHByZXNzaW9ucy4KLQotQG1lbnUKLSogQ29uc3RhbnRzOjoJCQlDb25zdGFudHMKLSogU3ltYm9sczo6CQkJU3ltYm9sIE5hbWVzCi0qIExvY2F0aW9uIENvdW50ZXI6OgkJVGhlIExvY2F0aW9uIENvdW50ZXIKLSogT3BlcmF0b3JzOjoJCQlPcGVyYXRvcnMKLSogRXZhbHVhdGlvbjo6CQkJRXZhbHVhdGlvbgotKiBFeHByZXNzaW9uIFNlY3Rpb246OgkJVGhlIFNlY3Rpb24gb2YgYW4gRXhwcmVzc2lvbgotKiBCdWlsdGluIEZ1bmN0aW9uczo6CQlCdWlsdGluIEZ1bmN0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIENvbnN0YW50cwotQHN1YnNlY3Rpb24gQ29uc3RhbnRzCi1AY2luZGV4IGludGVnZXIgbm90YXRpb24KLUBjaW5kZXggY29uc3RhbnRzIGluIGxpbmtlciBzY3JpcHRzCi1BbGwgY29uc3RhbnRzIGFyZSBpbnRlZ2Vycy4KLQotQXMgaW4gQywgdGhlIGxpbmtlciBjb25zaWRlcnMgYW4gaW50ZWdlciBiZWdpbm5pbmcgd2l0aCBAc2FtcHswfSB0byBiZQotb2N0YWwsIGFuZCBhbiBpbnRlZ2VyIGJlZ2lubmluZyB3aXRoIEBzYW1wezB4fSBvciBAc2FtcHswWH0gdG8gYmUKLWhleGFkZWNpbWFsLiAgVGhlIGxpbmtlciBjb25zaWRlcnMgb3RoZXIgaW50ZWdlcnMgdG8gYmUgZGVjaW1hbC4KLQotQGNpbmRleCBzY2FsZWQgaW50ZWdlcnMKLUBjaW5kZXggSyBhbmQgTSBpbnRlZ2VyIHN1ZmZpeGVzCi1AY2luZGV4IE0gYW5kIEsgaW50ZWdlciBzdWZmaXhlcwotQGNpbmRleCBzdWZmaXhlcyBmb3IgaW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlciBzdWZmaXhlcwotSW4gYWRkaXRpb24sIHlvdSBjYW4gdXNlIHRoZSBzdWZmaXhlcyBAY29kZXtLfSBhbmQgQGNvZGV7TX0gdG8gc2NhbGUgYQotY29uc3RhbnQgYnkKLUBjIFRFWEkyUk9GRi1LSUxMCi1AaWZpbmZvCi1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLUBjb2RlezEwMjR9IG9yIEBjb2RlezEwMjQqMTAyNH0KLUBjIFRFWEkyUk9GRi1LSUxMCi1AZW5kIGlmaW5mbwotQHRleAotJHtccm0gMTAyNH0kIG9yICR7XHJtIDEwMjR9XjIkCi1AZW5kIHRleAotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1yZXNwZWN0aXZlbHkuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGFsbCByZWZlciB0byB0aGUgc2FtZSBxdWFudGl0eToKLUBzbWFsbGV4YW1wbGUKLSAgX2ZvdXJrXzEgPSA0SzsKLSAgX2ZvdXJrXzIgPSA0MDk2OwotICBfZm91cmtfMyA9IDB4MTAwMDsKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCBOYW1lcwotQGNpbmRleCBzeW1ib2wgbmFtZXMKLUBjaW5kZXggbmFtZXMKLUBjaW5kZXggcXVvdGVkIHN5bWJvbCBuYW1lcwotQGtpbmRleCAiCi1Vbmxlc3MgcXVvdGVkLCBzeW1ib2wgbmFtZXMgc3RhcnQgd2l0aCBhIGxldHRlciwgdW5kZXJzY29yZSwgb3IgcGVyaW9kCi1hbmQgbWF5IGluY2x1ZGUgbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywgcGVyaW9kcywgYW5kIGh5cGhlbnMuCi1VbnF1b3RlZCBzeW1ib2wgbmFtZXMgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCBhbnkga2V5d29yZHMuICBZb3UgY2FuCi1zcGVjaWZ5IGEgc3ltYm9sIHdoaWNoIGNvbnRhaW5zIG9kZCBjaGFyYWN0ZXJzIG9yIGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEKLWtleXdvcmQgYnkgc3Vycm91bmRpbmcgdGhlIHN5bWJvbCBuYW1lIGluIGRvdWJsZSBxdW90ZXM6Ci1Ac21hbGxleGFtcGxlCi0gICJTRUNUSU9OIiA9IDk7Ci0gICJ3aXRoIGEgc3BhY2UiID0gImFsc28gd2l0aCBhIHNwYWNlIiArIDEwOwotQGVuZCBzbWFsbGV4YW1wbGUKLQotU2luY2Ugc3ltYm9scyBjYW4gY29udGFpbiBtYW55IG5vbi1hbHBoYWJldGljIGNoYXJhY3RlcnMsIGl0IGlzIHNhZmVzdAotdG8gZGVsaW1pdCBzeW1ib2xzIHdpdGggc3BhY2VzLiAgRm9yIGV4YW1wbGUsIEBzYW1we0EtQn0gaXMgb25lIHN5bWJvbCwKLXdoZXJlYXMgQHNhbXB7QSAtIEJ9IGlzIGFuIGV4cHJlc3Npb24gaW52b2x2aW5nIHN1YnRyYWN0aW9uLgotCi1Abm9kZSBMb2NhdGlvbiBDb3VudGVyCi1Ac3Vic2VjdGlvbiBUaGUgTG9jYXRpb24gQ291bnRlcgotQGtpbmRleCAuCi1AY2luZGV4IGRvdAotQGNpbmRleCBsb2NhdGlvbiBjb3VudGVyCi1AY2luZGV4IGN1cnJlbnQgb3V0cHV0IGxvY2F0aW9uCi1UaGUgc3BlY2lhbCBsaW5rZXIgdmFyaWFibGUgQGRmbntkb3R9IEBzYW1wey59IGFsd2F5cyBjb250YWlucyB0aGUKLWN1cnJlbnQgb3V0cHV0IGxvY2F0aW9uIGNvdW50ZXIuICBTaW5jZSB0aGUgQGNvZGV7Ln0gYWx3YXlzIHJlZmVycyB0byBhCi1sb2NhdGlvbiBpbiBhbiBvdXRwdXQgc2VjdGlvbiwgaXQgbWF5IG9ubHkgYXBwZWFyIGluIGFuIGV4cHJlc3Npb24KLXdpdGhpbiBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kLiAgVGhlIEBjb2Rley59IHN5bWJvbCBtYXkgYXBwZWFyCi1hbnl3aGVyZSB0aGF0IGFuIG9yZGluYXJ5IHN5bWJvbCBpcyBhbGxvd2VkIGluIGFuIGV4cHJlc3Npb24uCi0KLUBjaW5kZXggaG9sZXMKLUFzc2lnbmluZyBhIHZhbHVlIHRvIEBjb2Rley59IHdpbGwgY2F1c2UgdGhlIGxvY2F0aW9uIGNvdW50ZXIgdG8gYmUKLW1vdmVkLiAgVGhpcyBtYXkgYmUgdXNlZCB0byBjcmVhdGUgaG9sZXMgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhlCi1sb2NhdGlvbiBjb3VudGVyIG1heSBuZXZlciBiZSBtb3ZlZCBiYWNrd2FyZHMuCi0KLUBzbWFsbGV4YW1wbGUKLVNFQ1RJT05TCi1AewotICBvdXRwdXQgOgotICAgIEB7Ci0gICAgICBmaWxlMSgudGV4dCkKLSAgICAgIC4gPSAuICsgMTAwMDsKLSAgICAgIGZpbGUyKC50ZXh0KQotICAgICAgLiArPSAxMDAwOwotICAgICAgZmlsZTMoLnRleHQpCi0gICAgQH0gPSAweDEyMzQ7Ci1AfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotSW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiBmcm9tIEBmaWxle2ZpbGUxfSBpcwotbG9jYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiBAc2FtcHtvdXRwdXR9LiAgSXQgaXMKLWZvbGxvd2VkIGJ5IGEgMTAwMCBieXRlIGdhcC4gIFRoZW4gdGhlIEBzYW1wey50ZXh0fSBzZWN0aW9uIGZyb20KLUBmaWxle2ZpbGUyfSBhcHBlYXJzLCBhbHNvIHdpdGggYSAxMDAwIGJ5dGUgZ2FwIGZvbGxvd2luZyBiZWZvcmUgdGhlCi1Ac2FtcHsudGV4dH0gc2VjdGlvbiBmcm9tIEBmaWxle2ZpbGUzfS4gIFRoZSBub3RhdGlvbiBAc2FtcHs9IDB4MTIzNH0KLXNwZWNpZmllcyB3aGF0IGRhdGEgdG8gd3JpdGUgaW4gdGhlIGdhcHMgKEBweHJlZntPdXRwdXQgU2VjdGlvbiBGaWxsfSkuCi0KLUBjaW5kZXggZG90IGluc2lkZSBzZWN0aW9ucwotTm90ZTogQGNvZGV7Ln0gYWN0dWFsbHkgcmVmZXJzIHRvIHRoZSBieXRlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLWN1cnJlbnQgY29udGFpbmluZyBvYmplY3QuICBOb3JtYWxseSB0aGlzIGlzIHRoZSBAY29kZXtTRUNUSU9OU30KLXN0YXRlbWVudCwgd2hvZXMgc3RhcnQgYWRkcmVzcyBpcyAwLCBoZW5jZSBAY29kZXsufSBjYW4gYmUgdXNlZCBhcyBhbgotYWJzb2x1dGUgYWRkcmVzcy4gIElmIEBjb2Rley59IGlzIHVzZWQgaW5zaWRlIGEgc2VjdGlvbiBkZXNjcmlwdGlvbgotaG93ZXZlciwgaXQgcmVmZXJzIHRvIHRoZSBieXRlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGF0IHNlY3Rpb24sCi1ub3QgYW4gYWJzb2x1dGUgYWRkcmVzcy4gIFRodXMgaW4gYSBzY3JpcHQgbGlrZSB0aGlzOgotCi1Ac21hbGxleGFtcGxlCi1TRUNUSU9OUwotQHsKLSAgICAuID0gMHgxMDAKLSAgICAudGV4dDogQHsKLSAgICAgICooLnRleHQpCi0gICAgICAuID0gMHgyMDAKLSAgICBAfQotICAgIC4gPSAweDUwMAotICAgIC5kYXRhOiBAewotICAgICAgKiguZGF0YSkKLSAgICAgIC4gKz0gMHg2MDAKLSAgICBAfQotQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiB3aWxsIGJlIGFzc2lnbmVkIGEgc3RhcnRpbmcgYWRkcmVzcyBvZiAweDEwMAotYW5kIGEgc2l6ZSBvZiBleGFjdGx5IDB4MjAwIGJ5dGVzLCBldmVuIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggZGF0YSBpbgotdGhlIEBzYW1wey50ZXh0fSBpbnB1dCBzZWN0aW9ucyB0byBmaWxsIHRoaXMgYXJlYS4gIChJZiB0aGVyZSBpcyB0b28KLW11Y2ggZGF0YSwgYW4gZXJyb3Igd2lsbCBiZSBwcm9kdWNlZCBiZWNhdXNlIHRoaXMgd291bGQgYmUgYW4gYXR0ZW1wdCB0bwotbW92ZSBAY29kZXsufSBiYWNrd2FyZHMpLiAgVGhlIEBzYW1wey5kYXRhfSBzZWN0aW9uIHdpbGwgc3RhcnQgYXQgMHg1MDAKLWFuZCBpdCB3aWxsIGhhdmUgYW4gZXh0cmEgMHg2MDAgYnl0ZXMgd29ydGggb2Ygc3BhY2UgYWZ0ZXIgdGhlIGVuZCBvZgotdGhlIHZhbHVlcyBmcm9tIHRoZSBAc2FtcHsuZGF0YX0gaW5wdXQgc2VjdGlvbnMgYW5kIGJlZm9yZSB0aGUgZW5kIG9mCi10aGUgQHNhbXB7LmRhdGF9IG91dHB1dCBzZWN0aW9uIGl0c2VsZi4KLQotQG5lZWQgMjAwMAotQG5vZGUgT3BlcmF0b3JzCi1Ac3Vic2VjdGlvbiBPcGVyYXRvcnMKLUBjaW5kZXggb3BlcmF0b3JzIGZvciBhcml0aG1ldGljCi1AY2luZGV4IGFyaXRobWV0aWMgb3BlcmF0b3JzCi1AY2luZGV4IHByZWNlZGVuY2UgaW4gZXhwcmVzc2lvbnMKLVRoZSBsaW5rZXIgcmVjb2duaXplcyB0aGUgc3RhbmRhcmQgQyBzZXQgb2YgYXJpdGhtZXRpYyBvcGVyYXRvcnMsIHdpdGgKLXRoZSBzdGFuZGFyZCBiaW5kaW5ncyBhbmQgcHJlY2VkZW5jZSBsZXZlbHM6Ci1AYyBURVhJMlJPRkYtS0lMTAotQGlmaW5mbwotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1Ac21hbGxleGFtcGxlCi1wcmVjZWRlbmNlICAgICAgYXNzb2NpYXRpdml0eSAgIE9wZXJhdG9ycyAgICAgICAgICAgICAgICBOb3RlcwotKGhpZ2hlc3QpCi0xICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgICEgIC0gIH4gICAgICAgICAgICAgICAgICAoMSkKLTIgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgKiAgLyAgJQotMyAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICArICAtCi00ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgID4+ICA8PAotNSAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICA9PSAgIT0gID4gIDwgIDw9ICA+PQotNiAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICAmCi03ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgIHwKLTggICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgJiYKLTkgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgfHwKLTEwICAgICAgICAgICAgICByaWdodCAgICAgICAgICAgPyA6Ci0xMSAgICAgICAgICAgICAgcmlnaHQgICAgICAgICAgICY9ICArPSAgLT0gICo9ICAvPSAgICAgICAoMikKLShsb3dlc3QpCi1AZW5kIHNtYWxsZXhhbXBsZQotTm90ZXM6Ci0oMSkgUHJlZml4IG9wZXJhdG9ycyAKLSgyKSBAeHJlZntBc3NpZ25tZW50c30uCi1AYyBURVhJMlJPRkYtS0lMTAotQGVuZCBpZmluZm8KLUB0ZXgKLVx2c2tpcCBcYmFzZWxpbmVza2lwCi0lImxpc3BuYXJyb3dpbmciIGlzIHRoZSBleHRyYSBpbmRlbnQgdXNlZCBnZW5lcmFsbHkgZm9yIHNtYWxsZXhhbXBsZQotXGhza2lwXGxpc3BuYXJyb3dpbmdcdmJveHtcb2ZmaW50ZXJsaW5lc2tpcAotXGhydWxlCi1caGFsaWduCi17XHZydWxlIyZcc3RydXRcaGZpbFwgI1wgXGhmaWwmXHZydWxlIyZcc3RydXRcaGZpbFwgI1wgXGhmaWwmXHZydWxlIyZcc3RydXRcaGZpbFwge1x0dCAjfVwgXGhmaWwmXHZydWxlI1xjcgotaGVpZ2h0MnB0JlxvbWl0JiZcb21pdCYmXG9taXQmXGNyCi0mUHJlY2VkZW5jZSYmICBBc3NvY2lhdGl2aXR5ICAmJntccm0gT3BlcmF0b3JzfSZcY3IKLWhlaWdodDJwdCZcb21pdCYmXG9taXQmJlxvbWl0JlxjcgotXG5vYWxpZ257XGhydWxlfQotaGVpZ2h0MnB0JlxvbWl0JiZcb21pdCYmXG9taXQmXGNyCi0maGlnaGVzdCYmJiYmXGNyCi0lICcxNzYgaXMgdGlsZGUsICd+JyBpbiB0dCBmb250Ci0mMSYmbGVmdCYmXHFxdWFkLSAgICAgICAgICBcY2hhcicxNzZcICAgICAgIVxxcXVhZFxkYWcmXGNyIAotJjImJmxlZnQmJiogICAgICAgICAgLyAgICAgICAgXCUmXGNyCi0mMyYmbGVmdCYmKyAgICAgICAgICAtJlxjcgotJjQmJmxlZnQmJj4+ICAgICAgICAgPDwmXGNyCi0mNSYmbGVmdCYmPT0gICAgICAgICAhPSAgICAgICA+ICAgICAgPCAgICAgIDw9ICAgICAgPj0mXGNyCi0mNiYmbGVmdCYmXCYmXGNyCi0mNyYmbGVmdCYmfCZcY3IKLSY4JiZsZWZ0JiZ7XCZcJn0mXGNyCi0mOSYmbGVmdCYmfHwmXGNyCi0mMTAmJnJpZ2h0JiY/ICAgICAgICA6JlxjcgotJjExJiZyaWdodCYmXHFxdWFkXCY9ICAgICAgKz0gICAgICAgLT0gICAgICo9ICAgICAvPVxxcXVhZFxkZGFnJlxjcgotJmxvd2VzdCYmJiYmXGNyCi1oZWlnaHQycHQmXG9taXQmJlxvbWl0JiZcb21pdCZcY3J9Ci1caHJ1bGV9Ci1AZW5kIHRleAotQGlmdGV4Ci17Ci1Ab2JleWxpbmVzQHBhcnNraXA9MHB0QHBhcmluZGVudD0wcHQKLUBkYWdAcXVhZCBQcmVmaXggb3BlcmF0b3JzLgotQGRkYWdAcXVhZCBAeHJlZntBc3NpZ25tZW50c30uCi19Ci1AZW5kIGlmdGV4Ci1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLQotQG5vZGUgRXZhbHVhdGlvbgotQHN1YnNlY3Rpb24gRXZhbHVhdGlvbgotQGNpbmRleCBsYXp5IGV2YWx1YXRpb24KLUBjaW5kZXggZXhwcmVzc2lvbiBldmFsdWF0aW9uIG9yZGVyCi1UaGUgbGlua2VyIGV2YWx1YXRlcyBleHByZXNzaW9ucyBsYXppbHkuICBJdCBvbmx5IGNvbXB1dGVzIHRoZSB2YWx1ZSBvZgotYW4gZXhwcmVzc2lvbiB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LgotCi1UaGUgbGlua2VyIG5lZWRzIHNvbWUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHZhbHVlIG9mIHRoZSBzdGFydAotYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2VjdGlvbiwgYW5kIHRoZSBvcmlnaW5zIGFuZCBsZW5ndGhzIG9mIG1lbW9yeQotcmVnaW9ucywgaW4gb3JkZXIgdG8gZG8gYW55IGxpbmtpbmcgYXQgYWxsLiAgVGhlc2UgdmFsdWVzIGFyZSBjb21wdXRlZAotYXMgc29vbiBhcyBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVhZHMgaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLUhvd2V2ZXIsIG90aGVyIHZhbHVlcyAoc3VjaCBhcyBzeW1ib2wgdmFsdWVzKSBhcmUgbm90IGtub3duIG9yIG5lZWRlZAotdW50aWwgYWZ0ZXIgc3RvcmFnZSBhbGxvY2F0aW9uLiAgU3VjaCB2YWx1ZXMgYXJlIGV2YWx1YXRlZCBsYXRlciwgd2hlbgotb3RoZXIgaW5mb3JtYXRpb24gKHN1Y2ggYXMgdGhlIHNpemVzIG9mIG91dHB1dCBzZWN0aW9ucykgaXMgYXZhaWxhYmxlCi1mb3IgdXNlIGluIHRoZSBzeW1ib2wgYXNzaWdubWVudCBleHByZXNzaW9uLgotCi1UaGUgc2l6ZXMgb2Ygc2VjdGlvbnMgY2Fubm90IGJlIGtub3duIHVudGlsIGFmdGVyIGFsbG9jYXRpb24sIHNvCi1hc3NpZ25tZW50cyBkZXBlbmRlbnQgdXBvbiB0aGVzZSBhcmUgbm90IHBlcmZvcm1lZCB1bnRpbCBhZnRlcgotYWxsb2NhdGlvbi4KLQotU29tZSBleHByZXNzaW9ucywgc3VjaCBhcyB0aG9zZSBkZXBlbmRpbmcgdXBvbiB0aGUgbG9jYXRpb24gY291bnRlcgotQHNhbXB7Ln0sIG11c3QgYmUgZXZhbHVhdGVkIGR1cmluZyBzZWN0aW9uIGFsbG9jYXRpb24uCi0KLUlmIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiBpcyByZXF1aXJlZCwgYnV0IHRoZSB2YWx1ZSBpcyBub3QKLWF2YWlsYWJsZSwgdGhlbiBhbiBlcnJvciByZXN1bHRzLiAgRm9yIGV4YW1wbGUsIGEgc2NyaXB0IGxpa2UgdGhlCi1mb2xsb3dpbmcKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMKLSAgQHsKLSAgICAudGV4dCA5K3RoaXNfaXNudF9jb25zdGFudCA6IAotICAgICAgQHsgKigudGV4dCkgQH0KLSAgQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdpbGwgY2F1c2UgdGhlIGVycm9yIG1lc3NhZ2UgQHNhbXB7bm9uIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yIGluaXRpYWwKLWFkZHJlc3N9LgotCi1Abm9kZSBFeHByZXNzaW9uIFNlY3Rpb24KLUBzdWJzZWN0aW9uIFRoZSBTZWN0aW9uIG9mIGFuIEV4cHJlc3Npb24KLUBjaW5kZXggZXhwcmVzc2lvbiBzZWN0aW9ucwotQGNpbmRleCBhYnNvbHV0ZSBleHByZXNzaW9ucwotQGNpbmRleCByZWxhdGl2ZSBleHByZXNzaW9ucwotQGNpbmRleCBhYnNvbHV0ZSBhbmQgcmVsb2NhdGFibGUgc3ltYm9scwotQGNpbmRleCByZWxvY2F0YWJsZSBhbmQgYWJzb2x1dGUgc3ltYm9scwotQGNpbmRleCBzeW1ib2xzLCByZWxvY2F0YWJsZSBhbmQgYWJzb2x1dGUKLVdoZW4gdGhlIGxpbmtlciBldmFsdWF0ZXMgYW4gZXhwcmVzc2lvbiwgdGhlIHJlc3VsdCBpcyBlaXRoZXIgYWJzb2x1dGUKLW9yIHJlbGF0aXZlIHRvIHNvbWUgc2VjdGlvbi4gIEEgcmVsYXRpdmUgZXhwcmVzc2lvbiBpcyBleHByZXNzZWQgYXMgYQotZml4ZWQgb2Zmc2V0IGZyb20gdGhlIGJhc2Ugb2YgYSBzZWN0aW9uLgotCi1UaGUgcG9zaXRpb24gb2YgdGhlIGV4cHJlc3Npb24gd2l0aGluIHRoZSBsaW5rZXIgc2NyaXB0IGRldGVybWluZXMKLXdoZXRoZXIgaXQgaXMgYWJzb2x1dGUgb3IgcmVsYXRpdmUuICBBbiBleHByZXNzaW9uIHdoaWNoIGFwcGVhcnMgd2l0aGluCi1hbiBvdXRwdXQgc2VjdGlvbiBkZWZpbml0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBiYXNlIG9mIHRoZSBvdXRwdXQKLXNlY3Rpb24uICBBbiBleHByZXNzaW9uIHdoaWNoIGFwcGVhcnMgZWxzZXdoZXJlIHdpbGwgYmUgYWJzb2x1dGUuCi0KLUEgc3ltYm9sIHNldCB0byBhIHJlbGF0aXZlIGV4cHJlc3Npb24gd2lsbCBiZSByZWxvY2F0YWJsZSBpZiB5b3UgcmVxdWVzdAotcmVsb2NhdGFibGUgb3V0cHV0IHVzaW5nIHRoZSBAc2FtcHstcn0gb3B0aW9uLiAgVGhhdCBtZWFucyB0aGF0IGEKLWZ1cnRoZXIgbGluayBvcGVyYXRpb24gbWF5IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFRoZSBzeW1ib2wncwotc2VjdGlvbiB3aWxsIGJlIHRoZSBzZWN0aW9uIG9mIHRoZSByZWxhdGl2ZSBleHByZXNzaW9uLgotCi1BIHN5bWJvbCBzZXQgdG8gYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiB3aWxsIHJldGFpbiB0aGUgc2FtZSB2YWx1ZQotdGhyb3VnaCBhbnkgZnVydGhlciBsaW5rIG9wZXJhdGlvbi4gIFRoZSBzeW1ib2wgd2lsbCBiZSBhYnNvbHV0ZSwgYW5kCi13aWxsIG5vdCBoYXZlIGFueSBwYXJ0aWN1bGFyIGFzc29jaWF0ZWQgc2VjdGlvbi4KLQotWW91IGNhbiB1c2UgdGhlIGJ1aWx0aW4gZnVuY3Rpb24gQGNvZGV7QUJTT0xVVEV9IHRvIGZvcmNlIGFuIGV4cHJlc3Npb24KLXRvIGJlIGFic29sdXRlIHdoZW4gaXQgd291bGQgb3RoZXJ3aXNlIGJlIHJlbGF0aXZlLiAgRm9yIGV4YW1wbGUsIHRvCi1jcmVhdGUgYW4gYWJzb2x1dGUgc3ltYm9sIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBvdXRwdXQKLXNlY3Rpb24gQHNhbXB7LmRhdGF9OgotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLSAgQHsKLSAgICAuZGF0YSA6IEB7ICooLmRhdGEpIF9lZGF0YSA9IEFCU09MVVRFKC4pOyBAfQotICBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotSWYgQHNhbXB7QUJTT0xVVEV9IHdlcmUgbm90IHVzZWQsIEBzYW1we19lZGF0YX0gd291bGQgYmUgcmVsYXRpdmUgdG8gdGhlCi1Ac2FtcHsuZGF0YX0gc2VjdGlvbi4KLQotQG5vZGUgQnVpbHRpbiBGdW5jdGlvbnMKLUBzdWJzZWN0aW9uIEJ1aWx0aW4gRnVuY3Rpb25zCi1AY2luZGV4IGZ1bmN0aW9ucyBpbiBleHByZXNzaW9ucwotVGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UgaW5jbHVkZXMgYSBudW1iZXIgb2YgYnVpbHRpbiBmdW5jdGlvbnMgZm9yCi11c2UgaW4gbGlua2VyIHNjcmlwdCBleHByZXNzaW9ucy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBBQlNPTFVURShAdmFye2V4cH0pCi1Aa2luZGV4IEFCU09MVVRFKEB2YXJ7ZXhwfSkKLUBjaW5kZXggZXhwcmVzc2lvbiwgYWJzb2x1dGUKLVJldHVybiB0aGUgYWJzb2x1dGUgKG5vbi1yZWxvY2F0YWJsZSwgYXMgb3Bwb3NlZCB0byBub24tbmVnYXRpdmUpIHZhbHVlCi1vZiB0aGUgZXhwcmVzc2lvbiBAdmFye2V4cH0uICBQcmltYXJpbHkgdXNlZnVsIHRvIGFzc2lnbiBhbiBhYnNvbHV0ZQotdmFsdWUgdG8gYSBzeW1ib2wgd2l0aGluIGEgc2VjdGlvbiBkZWZpbml0aW9uLCB3aGVyZSBzeW1ib2wgdmFsdWVzIGFyZQotbm9ybWFsbHkgc2VjdGlvbiByZWxhdGl2ZS4gIEB4cmVme0V4cHJlc3Npb24gU2VjdGlvbn0uCi0KLUBpdGVtIEFERFIoQHZhcntzZWN0aW9ufSkKLUBraW5kZXggQUREUihAdmFye3NlY3Rpb259KQotQGNpbmRleCBzZWN0aW9uIGFkZHJlc3MgaW4gZXhwcmVzc2lvbgotUmV0dXJuIHRoZSBhYnNvbHV0ZSBhZGRyZXNzICh0aGUgVk1BKSBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufS4gIFlvdXIKLXNjcmlwdCBtdXN0IHByZXZpb3VzbHkgaGF2ZSBkZWZpbmVkIHRoZSBsb2NhdGlvbiBvZiB0aGF0IHNlY3Rpb24uICBJbgotdGhlIGZvbGxvd2luZyBleGFtcGxlLCBAY29kZXtzeW1ib2xfMX0gYW5kIEBjb2Rle3N5bWJvbF8yfSBhcmUgYXNzaWduZWQKLWlkZW50aWNhbCB2YWx1ZXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7IEBkb3Rze30KLSAgLm91dHB1dDEgOgotICAgIEB7IAotICAgIHN0YXJ0X29mX291dHB1dF8xID0gQUJTT0xVVEUoLik7Ci0gICAgQGRvdHN7fQotICAgIEB9Ci0gIC5vdXRwdXQgOgotICAgIEB7Ci0gICAgc3ltYm9sXzEgPSBBRERSKC5vdXRwdXQxKTsKLSAgICBzeW1ib2xfMiA9IHN0YXJ0X29mX291dHB1dF8xOwotICAgIEB9Ci1AZG90c3t9IEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSBBTElHTihAdmFye2V4cH0pCi1Aa2luZGV4IEFMSUdOKEB2YXJ7ZXhwfSkKLUBjaW5kZXggcm91bmQgdXAgbG9jYXRpb24gY291bnRlcgotQGNpbmRleCBhbGlnbiBsb2NhdGlvbiBjb3VudGVyCi1SZXR1cm4gdGhlIGxvY2F0aW9uIGNvdW50ZXIgKEBjb2Rley59KSBhbGlnbmVkIHRvIHRoZSBuZXh0IEB2YXJ7ZXhwfQotYm91bmRhcnkuICBAdmFye2V4cH0gbXVzdCBiZSBhbiBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGEgcG93ZXIgb2YKLXR3by4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotQHNtYWxsZXhhbXBsZQotKC4gKyBAdmFye2V4cH0gLSAxKSAmIH4oQHZhcntleHB9IC0gMSkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle0FMSUdOfSBkb2Vzbid0IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXItLS1pdCBqdXN0Ci1kb2VzIGFyaXRobWV0aWMgb24gaXQuICBIZXJlIGlzIGFuIGV4YW1wbGUgd2hpY2ggYWxpZ25zIHRoZSBvdXRwdXQKLUBjb2Rley5kYXRhfSBzZWN0aW9uIHRvIHRoZSBuZXh0IEBjb2RlezB4MjAwMH0gYnl0ZSBib3VuZGFyeSBhZnRlciB0aGUKLXByZWNlZGluZyBzZWN0aW9uIGFuZCBzZXRzIGEgdmFyaWFibGUgd2l0aGluIHRoZSBzZWN0aW9uIHRvIHRoZSBuZXh0Ci1AY29kZXsweDgwMDB9IGJvdW5kYXJ5IGFmdGVyIHRoZSBpbnB1dCBzZWN0aW9uczoKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsgQGRvdHN7fQotICAuZGF0YSBBTElHTigweDIwMDApOiBAewotICAgICooLmRhdGEpCi0gICAgdmFyaWFibGUgPSBBTElHTigweDgwMDApOwotICBAfQotQGRvdHN7fSBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhlIGZpcnN0IHVzZSBvZiBAY29kZXtBTElHTn0gaW4gdGhpcyBleGFtcGxlIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YKLWEgc2VjdGlvbiBiZWNhdXNlIGl0IGlzIHVzZWQgYXMgdGhlIG9wdGlvbmFsIEB2YXJ7YWRkcmVzc30gYXR0cmlidXRlIG9mCi1hIHNlY3Rpb24gZGVmaW5pdGlvbiAoQHB4cmVme091dHB1dCBTZWN0aW9uIEFkZHJlc3N9KS4gIFRoZSBzZWNvbmQgdXNlCi1vZiBAY29kZXtBTElHTn0gaXMgdXNlZCB0byBkZWZpbmVzIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4KLQotVGhlIGJ1aWx0aW4gZnVuY3Rpb24gQGNvZGV7TkVYVH0gaXMgY2xvc2VseSByZWxhdGVkIHRvIEBjb2Rle0FMSUdOfS4KLQotQGl0ZW0gQkxPQ0soQHZhcntleHB9KQotQGtpbmRleCBCTE9DSyhAdmFye2V4cH0pCi1UaGlzIGlzIGEgc3lub255bSBmb3IgQGNvZGV7QUxJR059LCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGxpbmtlcgotc2NyaXB0cy4gIEl0IGlzIG1vc3Qgb2Z0ZW4gc2VlbiB3aGVuIHNldHRpbmcgdGhlIGFkZHJlc3Mgb2YgYW4gb3V0cHV0Ci1zZWN0aW9uLgotCi1AaXRlbSBERUZJTkVEKEB2YXJ7c3ltYm9sfSkKLUBraW5kZXggREVGSU5FRChAdmFye3N5bWJvbH0pCi1AY2luZGV4IHN5bWJvbCBkZWZhdWx0cwotUmV0dXJuIDEgaWYgQHZhcntzeW1ib2x9IGlzIGluIHRoZSBsaW5rZXIgZ2xvYmFsIHN5bWJvbCB0YWJsZSBhbmQgaXMKLWRlZmluZWQsIG90aGVyd2lzZSByZXR1cm4gMC4gIFlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gcHJvdmlkZQotZGVmYXVsdCB2YWx1ZXMgZm9yIHN5bWJvbHMuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzY3JpcHQgZnJhZ21lbnQKLXNob3dzIGhvdyB0byBzZXQgYSBnbG9iYWwgc3ltYm9sIEBzYW1we2JlZ2lufSB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4KLXRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbi0tLWJ1dCBpZiBhIHN5bWJvbCBjYWxsZWQgQHNhbXB7YmVnaW59IGFscmVhZHkKLWV4aXN0ZWQsIGl0cyB2YWx1ZSBpcyBwcmVzZXJ2ZWQ6Ci0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsgQGRvdHN7fQotICAudGV4dCA6IEB7Ci0gICAgYmVnaW4gPSBERUZJTkVEKGJlZ2luKSA/IGJlZ2luIDogLiA7Ci0gICAgQGRvdHN7fQotICBAfQotICBAZG90c3t9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0gTE9BREFERFIoQHZhcntzZWN0aW9ufSkKLUBraW5kZXggTE9BREFERFIoQHZhcntzZWN0aW9ufSkKLUBjaW5kZXggc2VjdGlvbiBsb2FkIGFkZHJlc3MgaW4gZXhwcmVzc2lvbgotUmV0dXJuIHRoZSBhYnNvbHV0ZSBMTUEgb2YgdGhlIG5hbWVkIEB2YXJ7c2VjdGlvbn0uICBUaGlzIGlzIG5vcm1hbGx5Ci10aGUgc2FtZSBhcyBAY29kZXtBRERSfSwgYnV0IGl0IG1heSBiZSBkaWZmZXJlbnQgaWYgdGhlIEBjb2Rle0FUfQotYXR0cmlidXRlIGlzIHVzZWQgaW4gdGhlIG91dHB1dCBzZWN0aW9uIGRlZmluaXRpb24gKEBweHJlZntPdXRwdXQKLVNlY3Rpb24gTE1BfSkuCi0KLUBraW5kZXggTUFYCi1AaXRlbSBNQVgoQHZhcntleHAxfSwgQHZhcntleHAyfSkKLVJldHVybnMgdGhlIG1heGltdW0gb2YgQHZhcntleHAxfSBhbmQgQHZhcntleHAyfS4KLQotQGtpbmRleCBNSU4KLUBpdGVtIE1JTihAdmFye2V4cDF9LCBAdmFye2V4cDJ9KQotUmV0dXJucyB0aGUgbWluaW11bSBvZiBAdmFye2V4cDF9IGFuZCBAdmFye2V4cDJ9LgotCi1AaXRlbSBORVhUKEB2YXJ7ZXhwfSkKLUBraW5kZXggTkVYVChAdmFye2V4cH0pCi1AY2luZGV4IHVuYWxsb2NhdGVkIGFkZHJlc3MsIG5leHQKLVJldHVybiB0aGUgbmV4dCB1bmFsbG9jYXRlZCBhZGRyZXNzIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiBAdmFye2V4cH0uCi1UaGlzIGZ1bmN0aW9uIGlzIGNsb3NlbHkgcmVsYXRlZCB0byBAY29kZXtBTElHTihAdmFye2V4cH0pfTsgdW5sZXNzIHlvdQotdXNlIHRoZSBAY29kZXtNRU1PUll9IGNvbW1hbmQgdG8gZGVmaW5lIGRpc2NvbnRpbnVvdXMgbWVtb3J5IGZvciB0aGUKLW91dHB1dCBmaWxlLCB0aGUgdHdvIGZ1bmN0aW9ucyBhcmUgZXF1aXZhbGVudC4KLQotQGl0ZW0gU0laRU9GKEB2YXJ7c2VjdGlvbn0pCi1Aa2luZGV4IFNJWkVPRihAdmFye3NlY3Rpb259KQotQGNpbmRleCBzZWN0aW9uIHNpemUKLVJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufSwgaWYgdGhhdCBzZWN0aW9uIGhhcwotYmVlbiBhbGxvY2F0ZWQuICBJZiB0aGUgc2VjdGlvbiBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIHdoZW4gdGhpcyBpcwotZXZhbHVhdGVkLCB0aGUgbGlua2VyIHdpbGwgcmVwb3J0IGFuIGVycm9yLiAgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLAotQGNvZGV7c3ltYm9sXzF9IGFuZCBAY29kZXtzeW1ib2xfMn0gYXJlIGFzc2lnbmVkIGlkZW50aWNhbCB2YWx1ZXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TQHsgQGRvdHN7fQotICAub3V0cHV0IEB7Ci0gICAgLnN0YXJ0ID0gLiA7Ci0gICAgQGRvdHN7fQotICAgIC5lbmQgPSAuIDsKLSAgICBAfQotICBzeW1ib2xfMSA9IC5lbmQgLSAuc3RhcnQgOwotICBzeW1ib2xfMiA9IFNJWkVPRigub3V0cHV0KTsKLUBkb3Rze30gQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIFNJWkVPRl9IRUFERVJTCi1AaXRlbXggc2l6ZW9mX2hlYWRlcnMKLUBraW5kZXggU0laRU9GX0hFQURFUlMKLUBjaW5kZXggaGVhZGVyIHNpemUKLVJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgb3V0cHV0IGZpbGUncyBoZWFkZXJzLiAgVGhpcyBpcwotaW5mb3JtYXRpb24gd2hpY2ggYXBwZWFycyBhdCB0aGUgc3RhcnQgb2YgdGhlIG91dHB1dCBmaWxlLiAgWW91IGNhbiB1c2UKLXRoaXMgbnVtYmVyIHdoZW4gc2V0dGluZyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2VjdGlvbiwgaWYgeW91Ci1jaG9vc2UsIHRvIGZhY2lsaXRhdGUgcGFnaW5nLgotCi1AY2luZGV4IG5vdCBlbm91Z2ggcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzCi1AY2luZGV4IHByb2dyYW0gaGVhZGVycywgbm90IGVub3VnaCByb29tCi1XaGVuIHByb2R1Y2luZyBhbiBFTEYgb3V0cHV0IGZpbGUsIGlmIHRoZSBsaW5rZXIgc2NyaXB0IHVzZXMgdGhlCi1AY29kZXtTSVpFT0ZfSEVBREVSU30gYnVpbHRpbiBmdW5jdGlvbiwgdGhlIGxpbmtlciBtdXN0IGNvbXB1dGUgdGhlCi1udW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzIGJlZm9yZSBpdCBoYXMgZGV0ZXJtaW5lZCBhbGwgdGhlIHNlY3Rpb24KLWFkZHJlc3NlcyBhbmQgc2l6ZXMuICBJZiB0aGUgbGlua2VyIGxhdGVyIGRpc2NvdmVycyB0aGF0IGl0IG5lZWRzCi1hZGRpdGlvbmFsIHByb2dyYW0gaGVhZGVycywgaXQgd2lsbCByZXBvcnQgYW4gZXJyb3IgQHNhbXB7bm90IGVub3VnaAotcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzfS4gIFRvIGF2b2lkIHRoaXMgZXJyb3IsIHlvdSBtdXN0IGF2b2lkIHVzaW5nCi10aGUgQGNvZGV7U0laRU9GX0hFQURFUlN9IGZ1bmN0aW9uLCBvciB5b3UgbXVzdCByZXdvcmsgeW91ciBsaW5rZXIKLXNjcmlwdCB0byBhdm9pZCBmb3JjaW5nIHRoZSBsaW5rZXIgdG8gdXNlIGFkZGl0aW9uYWwgcHJvZ3JhbSBoZWFkZXJzLCBvcgoteW91IG11c3QgZGVmaW5lIHRoZSBwcm9ncmFtIGhlYWRlcnMgeW91cnNlbGYgdXNpbmcgdGhlIEBjb2Rle1BIRFJTfQotY29tbWFuZCAoQHB4cmVme1BIRFJTfSkuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEltcGxpY2l0IExpbmtlciBTY3JpcHRzCi1Ac2VjdGlvbiBJbXBsaWNpdCBMaW5rZXIgU2NyaXB0cwotQGNpbmRleCBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0cwotSWYgeW91IHNwZWNpZnkgYSBsaW5rZXIgaW5wdXQgZmlsZSB3aGljaCB0aGUgbGlua2VyIGNhbiBub3QgcmVjb2duaXplIGFzCi1hbiBvYmplY3QgZmlsZSBvciBhbiBhcmNoaXZlIGZpbGUsIGl0IHdpbGwgdHJ5IHRvIHJlYWQgdGhlIGZpbGUgYXMgYQotbGlua2VyIHNjcmlwdC4gIElmIHRoZSBmaWxlIGNhbiBub3QgYmUgcGFyc2VkIGFzIGEgbGlua2VyIHNjcmlwdCwgdGhlCi1saW5rZXIgd2lsbCByZXBvcnQgYW4gZXJyb3IuCi0KLUFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQgd2lsbCBub3QgcmVwbGFjZSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LgotCi1UeXBpY2FsbHkgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdCB3b3VsZCBjb250YWluIG9ubHkgc3ltYm9sCi1hc3NpZ25tZW50cywgb3IgdGhlIEBjb2Rle0lOUFVUfSwgQGNvZGV7R1JPVVB9LCBvciBAY29kZXtWRVJTSU9OfQotY29tbWFuZHMuCi0KLUFueSBpbnB1dCBmaWxlcyByZWFkIGJlY2F1c2Ugb2YgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdCB3aWxsIGJlIHJlYWQKLWF0IHRoZSBwb3NpdGlvbiBpbiB0aGUgY29tbWFuZCBsaW5lIHdoZXJlIHRoZSBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0IHdhcwotcmVhZC4gIFRoaXMgY2FuIGFmZmVjdCBhcmNoaXZlIHNlYXJjaGluZy4KLQotQGlmc2V0IEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW50Ci1AY2hhcHRlciBNYWNoaW5lIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IG1hY2hpbmUgZGVwZW5kZW5jaWVzCi1AY29kZXtsZH0gaGFzIGFkZGl0aW9uYWwgZmVhdHVyZXMgb24gc29tZSBwbGF0Zm9ybXM7IHRoZSBmb2xsb3dpbmcKLXNlY3Rpb25zIGRlc2NyaWJlIHRoZW0uICBNYWNoaW5lcyB3aGVyZSBAY29kZXtsZH0gaGFzIG5vIGFkZGl0aW9uYWwKLWZ1bmN0aW9uYWxpdHkgYXJlIG5vdCBsaXN0ZWQuCi0KLUBtZW51Ci0qIEg4LzMwMDo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rle2xkfSBhbmQgdGhlIEg4LzMwMAotKiBpOTYwOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXtsZH0gYW5kIHRoZSBJbnRlbCA5NjAgZmFtaWx5Ci0qIEFSTTo6CQkJCUBjb2Rle2xkfSBhbmQgdGhlIEFSTSBmYW1pbHkKLUBlbmQgbWVudQotQGVuZCBpZnNldAotCi1AYyBGSVhNRSEgIFRoaXMgY291bGQgdXNlIEByYWlzZXNlY3Rpb25zL0Bsb3dlcnNlY3Rpb25zLCBidXQgdGhlcmUgc2VlbXMgdG8gYmUgYSBjb25mbGljdAotQGMgICAgICAgICBiZXR3ZWVuIHRob3NlIGFuZCBub2RlLWRlZmF1bHRpbmcuCi1AaWZzZXQgSDgzMDAKLUBpZmNsZWFyIEdFTkVSSUMKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgSDgvMzAwCi1Ac2VjdGlvbiBAY29kZXtsZH0gYW5kIHRoZSBIOC8zMDAKLQotQGNpbmRleCBIOC8zMDAgc3VwcG9ydAotRm9yIHRoZSBIOC8zMDAsIEBjb2Rle2xkfSBjYW4gcGVyZm9ybSB0aGVzZSBnbG9iYWwgb3B0aW1pemF0aW9ucyB3aGVuCi15b3Ugc3BlY2lmeSB0aGUgQHNhbXB7LS1yZWxheH0gY29tbWFuZC1saW5lIG9wdGlvbi4KLQotQHRhYmxlIEBlbXBoCi1AY2luZGV4IHJlbGF4aW5nIG9uIEg4LzMwMAotQGl0ZW0gcmVsYXhpbmcgYWRkcmVzcyBtb2RlcwotQGNvZGV7bGR9IGZpbmRzIGFsbCBAY29kZXtqc3J9IGFuZCBAY29kZXtqbXB9IGluc3RydWN0aW9ucyB3aG9zZQotdGFyZ2V0cyBhcmUgd2l0aGluIGVpZ2h0IGJpdHMsIGFuZCB0dXJucyB0aGVtIGludG8gZWlnaHQtYml0Ci1wcm9ncmFtLWNvdW50ZXIgcmVsYXRpdmUgQGNvZGV7YnNyfSBhbmQgQGNvZGV7YnJhfSBpbnN0cnVjdGlvbnMsCi1yZXNwZWN0aXZlbHkuCi0KLUBjaW5kZXggc3ludGhlc2l6aW5nIG9uIEg4LzMwMAotQGl0ZW0gc3ludGhlc2l6aW5nIGluc3RydWN0aW9ucwotQGMgRklYTUU6IHNwZWNpZmljYWxseSBtb3YuYiwgb3IgYW55IG1vdiBpbnN0cnVjdGlvbnMgcmVhbGx5PwotQGNvZGV7bGR9IGZpbmRzIGFsbCBAY29kZXttb3YuYn0gaW5zdHJ1Y3Rpb25zIHdoaWNoIHVzZSB0aGUKLXNpeHRlZW4tYml0IGFic29sdXRlIGFkZHJlc3MgZm9ybSwgYnV0IHJlZmVyIHRvIHRoZSB0b3AKLXBhZ2Ugb2YgbWVtb3J5LCBhbmQgY2hhbmdlcyB0aGVtIHRvIHVzZSB0aGUgZWlnaHQtYml0IGFkZHJlc3MgZm9ybS4KLShUaGF0IGlzOiB0aGUgbGlua2VyIHR1cm5zIEBzYW1we21vdi5iIEBjb2Rle0BAfUB2YXJ7YWF9OjE2fSBpbnRvCi1Ac2FtcHttb3YuYiBAY29kZXtAQH1AdmFye2FhfTo4fSB3aGVuZXZlciB0aGUgYWRkcmVzcyBAdmFye2FhfSBpcyBpbiB0aGUKLXRvcCBwYWdlIG9mIG1lbW9yeSkuCi1AZW5kIHRhYmxlCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEhpdGFjaGkKLUBjIFRoaXMgc3R1ZmYgaXMgcG9pbnRsZXNzIHRvIHNheSB1bmxlc3MgeW91J3JlIGVzcGVjaWFsbHkgY29uY2VybmVkCi1AYyB3aXRoIEhpdGFjaGkgY2hpcHM7IGRvbid0IGVuYWJsZSBpdCBmb3IgZ2VuZXJpYyBjYXNlLCBwbGVhc2UuCi1Abm9kZSBIaXRhY2hpCi1AY2hhcHRlciBAY29kZXtsZH0gYW5kIG90aGVyIEhpdGFjaGkgY2hpcHMKLQotQGNvZGV7bGR9IGFsc28gc3VwcG9ydHMgdGhlIEg4LzMwMEgsIHRoZSBIOC81MDAsIGFuZCB0aGUgSGl0YWNoaSBTSC4gIE5vCi1zcGVjaWFsIGZlYXR1cmVzLCBjb21tYW5kcywgb3IgY29tbWFuZC1saW5lIG9wdGlvbnMgYXJlIHJlcXVpcmVkIGZvcgotdGhlc2UgY2hpcHMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQGlmc2V0IEk5NjAKLUBpZmNsZWFyIEdFTkVSSUMKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgaTk2MAotQHNlY3Rpb24gQGNvZGV7bGR9IGFuZCB0aGUgSW50ZWwgOTYwIGZhbWlseQotCi1AY2luZGV4IGk5NjAgc3VwcG9ydAotCi1Zb3UgY2FuIHVzZSB0aGUgQHNhbXB7LUFAdmFye2FyY2hpdGVjdHVyZX19IGNvbW1hbmQgbGluZSBvcHRpb24gdG8KLXNwZWNpZnkgb25lIG9mIHRoZSB0d28tbGV0dGVyIG5hbWVzIGlkZW50aWZ5aW5nIG1lbWJlcnMgb2YgdGhlIDk2MAotZmFtaWx5OyB0aGUgb3B0aW9uIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBvdXRwdXQgdGFyZ2V0LCBhbmQgd2FybnMgb2YgYW55Ci1pbmNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBpbnB1dCBmaWxlcy4gIEl0IGFsc28gbW9kaWZpZXMgdGhlCi1saW5rZXIncyBzZWFyY2ggc3RyYXRlZ3kgZm9yIGFyY2hpdmUgbGlicmFyaWVzLCB0byBzdXBwb3J0IHRoZSB1c2Ugb2YKLWxpYnJhcmllcyBzcGVjaWZpYyB0byBlYWNoIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLCBieSBpbmNsdWRpbmcgaW4gdGhlCi1zZWFyY2ggbG9vcCBuYW1lcyBzdWZmaXhlZCB3aXRoIHRoZSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGFyY2hpdGVjdHVyZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdXIgQGNvZGV7bGR9IGNvbW1hbmQgbGluZSBpbmNsdWRlZCBAd3tAc2FtcHstQUNBfX0gYXMKLXdlbGwgYXMgQHd7QHNhbXB7LWx0cnl9fSwgdGhlIGxpbmtlciB3b3VsZCBsb29rIChpbiBpdHMgYnVpbHQtaW4gc2VhcmNoCi1wYXRocywgYW5kIGluIGFueSBwYXRocyB5b3Ugc3BlY2lmeSB3aXRoIEBzYW1wey1MfSkgZm9yIGEgbGlicmFyeSB3aXRoCi10aGUgbmFtZXMKLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi10cnkKLWxpYnRyeS5hCi10cnljYQotbGlidHJ5Y2EuYQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGUgZmlyc3QgdHdvIHBvc3NpYmlsaXRpZXMgd291bGQgYmUgY29uc2lkZXJlZCBpbiBhbnkgZXZlbnQ7IHRoZSBsYXN0Ci10d28gYXJlIGR1ZSB0byB0aGUgdXNlIG9mIEB3e0BzYW1wey1BQ0F9fS4KLQotWW91IGNhbiBtZWFuaW5nZnVsbHkgdXNlIEBzYW1wey1BfSBtb3JlIHRoYW4gb25jZSBvbiBhIGNvbW1hbmQgbGluZSwgc2luY2UKLXRoZSA5NjAgYXJjaGl0ZWN0dXJlIGZhbWlseSBhbGxvd3MgY29tYmluYXRpb24gb2YgdGFyZ2V0IGFyY2hpdGVjdHVyZXM7IGVhY2gKLXVzZSB3aWxsIGFkZCBhbm90aGVyIHBhaXIgb2YgbmFtZSB2YXJpYW50cyB0byBzZWFyY2ggZm9yIHdoZW4gQHd7QHNhbXB7LWx9fQotc3BlY2lmaWVzIGEgbGlicmFyeS4KLQotQGNpbmRleCBAY29kZXstLXJlbGF4fSBvbiBpOTYwCi1AY2luZGV4IHJlbGF4aW5nIG9uIGk5NjAKLUBjb2Rle2xkfSBzdXBwb3J0cyB0aGUgQHNhbXB7LS1yZWxheH0gb3B0aW9uIGZvciB0aGUgaTk2MCBmYW1pbHkuICBJZgoteW91IHNwZWNpZnkgQHNhbXB7LS1yZWxheH0sIEBjb2Rle2xkfSBmaW5kcyBhbGwgQGNvZGV7YmFseH0gYW5kCi1AY29kZXtjYWx4fSBpbnN0cnVjdGlvbnMgd2hvc2UgdGFyZ2V0cyBhcmUgd2l0aGluIDI0IGJpdHMsIGFuZCB0dXJucwotdGhlbSBpbnRvIDI0LWJpdCBwcm9ncmFtLWNvdW50ZXIgcmVsYXRpdmUgQGNvZGV7YmFsfSBhbmQgQGNvZGV7Y2FsfQotaW5zdHJ1Y3Rpb25zLCByZXNwZWN0aXZlbHkuICBAY29kZXtsZH0gYWxzbyB0dXJucyBAY29kZXtjYWx9Ci1pbnN0cnVjdGlvbnMgaW50byBAY29kZXtiYWx9IGluc3RydWN0aW9ucyB3aGVuIGl0IGRldGVybWluZXMgdGhhdCB0aGUKLXRhcmdldCBzdWJyb3V0aW5lIGlzIGEgbGVhZiByb3V0aW5lICh0aGF0IGlzLCB0aGUgdGFyZ2V0IHN1YnJvdXRpbmUgZG9lcwotbm90IGl0c2VsZiBjYWxsIGFueSBzdWJyb3V0aW5lcykuCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgR0VORVJJQwotQHJhaXNlc2VjdGlvbnMKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBBUk0KLUBzZWN0aW9uIEBjb2Rle2xkfSdzIHN1cHBvcnQgZm9yIGludGVyd29ya2luZyBiZXR3ZWVuIEFSTSBhbmQgVGh1bWIgY29kZQotCi1AY2luZGV4IEFSTSBpbnRlcndvcmtpbmcgc3VwcG9ydAotQGtpbmRleCAtLXN1cHBvcnQtb2xkLWNvZGUKLUZvciB0aGUgQVJNLCBAY29kZXtsZH0gd2lsbCBnZW5lcmF0ZSBjb2RlIHN0dWJzIHRvIGFsbG93IGZ1bmN0aW9ucyBjYWxscwotYmV0d2VlbSBBUk0gYW5kIFRodW1iIGNvZGUuICBUaGVzZSBzdHVicyBvbmx5IHdvcmsgd2l0aCBjb2RlIHRoYXQgaGFzCi1iZWVuIGNvbXBpbGVkIGFuZCBhc3NlbWJsZWQgd2l0aCB0aGUgQHNhbXB7LW10aHVtYi1pbnRlcndvcmt9IGNvbW1hbmQKLWxpbmUgb3B0aW9uLiAgSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGxpbmsgd2l0aCBvbGQgQVJNIG9iamVjdCBmaWxlcyBvcgotbGlicmFyaWVzLCB3aGljaCBoYXZlIG5vdCBiZWVuIGNvbXBpbGVkIHdpdGggdGhlIC1tdGh1bWItaW50ZXJ3b3JrCi1vcHRpb24gdGhlbiB0aGUgQHNhbXB7LS1zdXBwb3J0LW9sZC1jb2RlfSBjb21tYW5kIGxpbmUgc3dpdGNoIHNob3VsZCBiZQotZ2l2ZW4gdG8gdGhlIGxpbmtlci4gIFRoaXMgd2lsbCBtYWtlIGl0IGdlbmVyYXRlIGxhcmdlciBzdHViIGZ1bmN0aW9ucwotd2hpY2ggd2lsbCB3b3JrIHdpdGggbm9uLWludGVyd29ya2luZyBhd2FyZSBBUk0gY29kZS4gIE5vdGUsIGhvd2V2ZXIsCi10aGUgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgZ2VuZXJhdGluZyBzdHVicyBmb3IgZnVuY3Rpb24gY2FsbHMgdG8KLW5vbi1pbnRlcndvcmtpbmcgYXdhcmUgVGh1bWIgY29kZS4KLQotQGNpbmRleCB0aHVtYiBlbnRyeSBwb2ludAotQGNpbmRleCBlbnRyeSBwb2ludCwgdGh1bWIKLUBraW5kZXggLS10aHVtYi1lbnRyeT1AdmFye2VudHJ5fQotVGhlIEBzYW1wey0tdGh1bWItZW50cnl9IHN3aXRjaCBpcyBhIGR1cGxpY2F0ZSBvZiB0aGUgZ2VuZXJpYwotQHNhbXB7LS1lbnRyeX0gc3dpdGNoLCBpbiB0aGF0IGl0IHNldHMgdGhlIHByb2dyYW0ncyBzdGFydGluZyBhZGRyZXNzLiAgCi1CdXQgaXQgYWxzbyBzZXRzIHRoZSBib3R0b20gYml0IG9mIHRoZSBhZGRyZXNzLCBzbyB0aGF0IGl0IGNhbiBiZQotYnJhbmNoZWQgdG8gdXNpbmcgYSBCWCBpbnN0cnVjdGlvbiwgYW5kIHRoZSBwcm9ncmFtIHdpbGwgc3RhcnQKLWV4ZWN1dGluZyBpbiBUaHVtYiBtb2RlIHN0cmFpZ2h0IGF3YXkuCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1Abm9kZSBCRkQKLUBjaGFwdGVyIEJGRAotCi1AY2luZGV4IGJhY2sgZW5kCi1AY2luZGV4IG9iamVjdCBmaWxlIG1hbmFnZW1lbnQKLUBjaW5kZXggb2JqZWN0IGZvcm1hdHMgYXZhaWxhYmxlCi1Aa2luZGV4IG9iamR1bXAgLWkKLVRoZSBsaW5rZXIgYWNjZXNzZXMgb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzIHVzaW5nIHRoZSBCRkQgbGlicmFyaWVzLgotVGhlc2UgbGlicmFyaWVzIGFsbG93IHRoZSBsaW5rZXIgdG8gdXNlIHRoZSBzYW1lIHJvdXRpbmVzIHRvIG9wZXJhdGUgb24KLW9iamVjdCBmaWxlcyB3aGF0ZXZlciB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgQSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUKLWZvcm1hdCBjYW4gYmUgc3VwcG9ydGVkIHNpbXBseSBieSBjcmVhdGluZyBhIG5ldyBCRkQgYmFjayBlbmQgYW5kIGFkZGluZwotaXQgdG8gdGhlIGxpYnJhcnkuICBUbyBjb25zZXJ2ZSBydW50aW1lIG1lbW9yeSwgaG93ZXZlciwgdGhlIGxpbmtlciBhbmQKLWFzc29jaWF0ZWQgdG9vbHMgYXJlIHVzdWFsbHkgY29uZmlndXJlZCB0byBzdXBwb3J0IG9ubHkgYSBzdWJzZXQgb2YgdGhlCi1vYmplY3QgZmlsZSBmb3JtYXRzIGF2YWlsYWJsZS4gIFlvdSBjYW4gdXNlIEBjb2Rle29iamR1bXAgLWl9Ci0oQHB4cmVme29iamR1bXAsLG9iamR1bXAsYmludXRpbHMuaW5mbyxUaGUgR05VIEJpbmFyeSBVdGlsaXRpZXN9KSB0bwotbGlzdCBhbGwgdGhlIGZvcm1hdHMgYXZhaWxhYmxlIGZvciB5b3VyIGNvbmZpZ3VyYXRpb24uCi0KLUBjaW5kZXggQkZEIHJlcXVpcmVtZW50cwotQGNpbmRleCByZXF1aXJlbWVudHMgZm9yIEJGRAotQXMgd2l0aCBtb3N0IGltcGxlbWVudGF0aW9ucywgQkZEIGlzIGEgY29tcHJvbWlzZSBiZXR3ZWVuCi1zZXZlcmFsIGNvbmZsaWN0aW5nIHJlcXVpcmVtZW50cy4gVGhlIG1ham9yIGZhY3RvciBpbmZsdWVuY2luZwotQkZEIGRlc2lnbiB3YXMgZWZmaWNpZW5jeTogYW55IHRpbWUgdXNlZCBjb252ZXJ0aW5nIGJldHdlZW4KLWZvcm1hdHMgaXMgdGltZSB3aGljaCB3b3VsZCBub3QgaGF2ZSBiZWVuIHNwZW50IGhhZCBCRkQgbm90Ci1iZWVuIGludm9sdmVkLiBUaGlzIGlzIHBhcnRseSBvZmZzZXQgYnkgYWJzdHJhY3Rpb24gcGF5YmFjazsgc2luY2UKLUJGRCBzaW1wbGlmaWVzIGFwcGxpY2F0aW9ucyBhbmQgYmFjayBlbmRzLCBtb3JlIHRpbWUgYW5kIGNhcmUKLW1heSBiZSBzcGVudCBvcHRpbWl6aW5nIGFsZ29yaXRobXMgZm9yIGEgZ3JlYXRlciBzcGVlZC4KLQotT25lIG1pbm9yIGFydGlmYWN0IG9mIHRoZSBCRkQgc29sdXRpb24gd2hpY2ggeW91IHNob3VsZCBiZWFyIGluCi1taW5kIGlzIHRoZSBwb3RlbnRpYWwgZm9yIGluZm9ybWF0aW9uIGxvc3MuICBUaGVyZSBhcmUgdHdvIHBsYWNlcyB3aGVyZQotdXNlZnVsIGluZm9ybWF0aW9uIGNhbiBiZSBsb3N0IHVzaW5nIHRoZSBCRkQgbWVjaGFuaXNtOiBkdXJpbmcKLWNvbnZlcnNpb24gYW5kIGR1cmluZyBvdXRwdXQuIEB4cmVme0JGRCBpbmZvcm1hdGlvbiBsb3NzfS4KLQotQG1lbnUKLSogQkZEIG91dGxpbmU6OiAgICAgICAgICAgICAgICAgSG93IGl0IHdvcmtzOiBhbiBvdXRsaW5lIG9mIEJGRAotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBvdXRsaW5lCi1Ac2VjdGlvbiBIb3cgaXQgd29ya3M6IGFuIG91dGxpbmUgb2YgQkZECi1AY2luZGV4IG9wZW5pbmcgb2JqZWN0IGZpbGVzCi1AaW5jbHVkZSBiZmRzdW1tLnRleGkKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBSZXBvcnRpbmcgQnVncwotQGNoYXB0ZXIgUmVwb3J0aW5nIEJ1Z3MKLUBjaW5kZXggYnVncyBpbiBAY29kZXtsZH0KLUBjaW5kZXggcmVwb3J0aW5nIGJ1Z3MgaW4gQGNvZGV7bGR9Ci0KLVlvdXIgYnVnIHJlcG9ydHMgcGxheSBhbiBlc3NlbnRpYWwgcm9sZSBpbiBtYWtpbmcgQGNvZGV7bGR9IHJlbGlhYmxlLgotCi1SZXBvcnRpbmcgYSBidWcgbWF5IGhlbHAgeW91IGJ5IGJyaW5naW5nIGEgc29sdXRpb24gdG8geW91ciBwcm9ibGVtLCBvcgotaXQgbWF5IG5vdC4gIEJ1dCBpbiBhbnkgY2FzZSB0aGUgcHJpbmNpcGFsIGZ1bmN0aW9uIG9mIGEgYnVnIHJlcG9ydCBpcwotdG8gaGVscCB0aGUgZW50aXJlIGNvbW11bml0eSBieSBtYWtpbmcgdGhlIG5leHQgdmVyc2lvbiBvZiBAY29kZXtsZH0KLXdvcmsgYmV0dGVyLiAgQnVnIHJlcG9ydHMgYXJlIHlvdXIgY29udHJpYnV0aW9uIHRvIHRoZSBtYWludGVuYW5jZSBvZgotQGNvZGV7bGR9LgotCi1JbiBvcmRlciBmb3IgYSBidWcgcmVwb3J0IHRvIHNlcnZlIGl0cyBwdXJwb3NlLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotaW5mb3JtYXRpb24gdGhhdCBlbmFibGVzIHVzIHRvIGZpeCB0aGUgYnVnLgotCi1AbWVudQotKiBCdWcgQ3JpdGVyaWE6OiAgICAgICAgICAgICAgICBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLSogQnVnIFJlcG9ydGluZzo6ICAgICAgICAgICAgICAgSG93IHRvIHJlcG9ydCBidWdzCi1AZW5kIG1lbnUKLQotQG5vZGUgQnVnIENyaXRlcmlhCi1Ac2VjdGlvbiBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLUBjaW5kZXggYnVnIGNyaXRlcmlhCi0KLUlmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB5b3UgaGF2ZSBmb3VuZCBhIGJ1ZywgaGVyZSBhcmUgc29tZSBndWlkZWxpbmVzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AY2luZGV4IGZhdGFsIHNpZ25hbAotQGNpbmRleCBsaW5rZXIgY3Jhc2gKLUBjaW5kZXggY3Jhc2ggb2YgbGlua2VyCi1AaXRlbQotSWYgdGhlIGxpbmtlciBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzIGEKLUBjb2Rle2xkfSBidWcuICBSZWxpYWJsZSBsaW5rZXJzIG5ldmVyIGNyYXNoLgotCi1AY2luZGV4IGVycm9yIG9uIHZhbGlkIGlucHV0Ci1AaXRlbQotSWYgQGNvZGV7bGR9IHByb2R1Y2VzIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHZhbGlkIGlucHV0LCB0aGF0IGlzIGEgYnVnLgotCi1AY2luZGV4IGludmFsaWQgaW5wdXQKLUBpdGVtCi1JZiBAY29kZXtsZH0gZG9lcyBub3QgcHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIGlucHV0LCB0aGF0Ci1tYXkgYmUgYSBidWcuICBJbiB0aGUgZ2VuZXJhbCBjYXNlLCB0aGUgbGlua2VyIGNhbiBub3QgdmVyaWZ5IHRoYXQKLW9iamVjdCBmaWxlcyBhcmUgY29ycmVjdC4KLQotQGl0ZW0KLUlmIHlvdSBhcmUgYW4gZXhwZXJpZW5jZWQgdXNlciBvZiBsaW5rZXJzLCB5b3VyIHN1Z2dlc3Rpb25zIGZvcgotaW1wcm92ZW1lbnQgb2YgQGNvZGV7bGR9IGFyZSB3ZWxjb21lIGluIGFueSBjYXNlLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIEJ1ZyBSZXBvcnRpbmcKLUBzZWN0aW9uIEhvdyB0byByZXBvcnQgYnVncwotQGNpbmRleCBidWcgcmVwb3J0cwotQGNpbmRleCBAY29kZXtsZH0gYnVncywgcmVwb3J0aW5nCi0KLUEgbnVtYmVyIG9mIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgb2ZmZXIgc3VwcG9ydCBmb3IgQHNje2dudX0KLXByb2R1Y3RzLiAgSWYgeW91IG9idGFpbmVkIEBjb2Rle2xkfSBmcm9tIGEgc3VwcG9ydCBvcmdhbml6YXRpb24sIHdlCi1yZWNvbW1lbmQgeW91IGNvbnRhY3QgdGhhdCBvcmdhbml6YXRpb24gZmlyc3QuCi0KLVlvdSBjYW4gZmluZCBjb250YWN0IGluZm9ybWF0aW9uIGZvciBtYW55IHN1cHBvcnQgY29tcGFuaWVzIGFuZAotaW5kaXZpZHVhbHMgaW4gdGhlIGZpbGUgQGZpbGV7ZXRjL1NFUlZJQ0V9IGluIHRoZSBAc2N7Z251fSBFbWFjcwotZGlzdHJpYnV0aW9uLgotCi1PdGhlcndpc2UsIHNlbmQgYnVnIHJlcG9ydHMgZm9yIEBjb2Rle2xkfSB0bwotQHNhbXB7YnVnLWdudS11dGlsc0BAZ251Lm9yZ30uCi0KLVRoZSBmdW5kYW1lbnRhbCBwcmluY2lwbGUgb2YgcmVwb3J0aW5nIGJ1Z3MgdXNlZnVsbHkgaXMgdGhpczoKLUBzdHJvbmd7cmVwb3J0IGFsbCB0aGUgZmFjdHN9LiAgSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHRvIHN0YXRlIGEKLWZhY3Qgb3IgbGVhdmUgaXQgb3V0LCBzdGF0ZSBpdCEKLQotT2Z0ZW4gcGVvcGxlIG9taXQgZmFjdHMgYmVjYXVzZSB0aGV5IHRoaW5rIHRoZXkga25vdyB3aGF0IGNhdXNlcyB0aGUKLXByb2JsZW0gYW5kIGFzc3VtZSB0aGF0IHNvbWUgZGV0YWlscyBkbyBub3QgbWF0dGVyLiAgVGh1cywgeW91IG1pZ2h0Ci1hc3N1bWUgdGhhdCB0aGUgbmFtZSBvZiBhIHN5bWJvbCB5b3UgdXNlIGluIGFuIGV4YW1wbGUgZG9lcyBub3QgbWF0dGVyLgotV2VsbCwgcHJvYmFibHkgaXQgZG9lcyBub3QsIGJ1dCBvbmUgY2Fubm90IGJlIHN1cmUuICBQZXJoYXBzIHRoZSBidWcgaXMKLWEgc3RyYXkgbWVtb3J5IHJlZmVyZW5jZSB3aGljaCBoYXBwZW5zIHRvIGZldGNoIGZyb20gdGhlIGxvY2F0aW9uIHdoZXJlCi10aGF0IG5hbWUgaXMgc3RvcmVkIGluIG1lbW9yeTsgcGVyaGFwcywgaWYgdGhlIG5hbWUgd2VyZSBkaWZmZXJlbnQsIHRoZQotY29udGVudHMgb2YgdGhhdCBsb2NhdGlvbiB3b3VsZCBmb29sIHRoZSBsaW5rZXIgaW50byBkb2luZyB0aGUgcmlnaHQKLXRoaW5nIGRlc3BpdGUgdGhlIGJ1Zy4gIFBsYXkgaXQgc2FmZSBhbmQgZ2l2ZSBhIHNwZWNpZmljLCBjb21wbGV0ZQotZXhhbXBsZS4gIFRoYXQgaXMgdGhlIGVhc2llc3QgdGhpbmcgZm9yIHlvdSB0byBkbywgYW5kIHRoZSBtb3N0IGhlbHBmdWwuCi0KLUtlZXAgaW4gbWluZCB0aGF0IHRoZSBwdXJwb3NlIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcgaWYKLWl0IGlzIG5ldyB0byB1cy4gIFRoZXJlZm9yZSwgYWx3YXlzIHdyaXRlIHlvdXIgYnVnIHJlcG9ydHMgb24gdGhlIGFzc3VtcHRpb24KLXRoYXQgdGhlIGJ1ZyBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgcHJldmlvdXNseS4KLQotU29tZXRpbWVzIHBlb3BsZSBnaXZlIGEgZmV3IHNrZXRjaHkgZmFjdHMgYW5kIGFzaywgYGBEb2VzIHRoaXMgcmluZyBhCi1iZWxsPycnICBUaG9zZSBidWcgcmVwb3J0cyBhcmUgdXNlbGVzcywgYW5kIHdlIHVyZ2UgZXZlcnlvbmUgdG8KLUBlbXBoe3JlZnVzZSB0byByZXNwb25kIHRvIHRoZW19IGV4Y2VwdCB0byBjaGlkZSB0aGUgc2VuZGVyIHRvIHJlcG9ydAotYnVncyBwcm9wZXJseS4KLQotVG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYWxsIHRoZXNlIHRoaW5nczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSB2ZXJzaW9uIG9mIEBjb2Rle2xkfS4gIEBjb2Rle2xkfSBhbm5vdW5jZXMgaXQgaWYgeW91IHN0YXJ0IGl0IHdpdGgKLXRoZSBAc2FtcHstLXZlcnNpb259IGFyZ3VtZW50LgotCi1XaXRob3V0IHRoaXMsIHdlIHdpbGwgbm90IGtub3cgd2hldGhlciB0aGVyZSBpcyBhbnkgcG9pbnQgaW4gbG9va2luZyBmb3IKLXRoZSBidWcgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBAY29kZXtsZH0uCi0KLUBpdGVtCi1BbnkgcGF0Y2hlcyB5b3UgbWF5IGhhdmUgYXBwbGllZCB0byB0aGUgQGNvZGV7bGR9IHNvdXJjZSwgaW5jbHVkaW5nIGFueQotcGF0Y2hlcyBtYWRlIHRvIHRoZSBAY29kZXtCRkR9IGxpYnJhcnkuCi0KLUBpdGVtCi1UaGUgdHlwZSBvZiBtYWNoaW5lIHlvdSBhcmUgdXNpbmcsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIGFuZAotdmVyc2lvbiBudW1iZXIuCi0KLUBpdGVtCi1XaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgQGNvZGV7bGR9LS0tZS5nLgotYGBAY29kZXtnY2MtMi43fScnLgotCi1AaXRlbQotVGhlIGNvbW1hbmQgYXJndW1lbnRzIHlvdSBnYXZlIHRoZSBsaW5rZXIgdG8gbGluayB5b3VyIGV4YW1wbGUgYW5kCi1vYnNlcnZlIHRoZSBidWcuICBUbyBndWFyYW50ZWUgeW91IHdpbGwgbm90IG9taXQgc29tZXRoaW5nIGltcG9ydGFudCwKLWxpc3QgdGhlbSBhbGwuICBBIGNvcHkgb2YgdGhlIE1ha2VmaWxlIChvciB0aGUgb3V0cHV0IGZyb20gbWFrZSkgaXMKLXN1ZmZpY2llbnQuCi0KLUlmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCi1hbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCi0KLUBpdGVtCi1BIGNvbXBsZXRlIGlucHV0IGZpbGUsIG9yIHNldCBvZiBpbnB1dCBmaWxlcywgdGhhdCB3aWxsIHJlcHJvZHVjZSB0aGUKLWJ1Zy4gIEl0IGlzIGdlbmVyYWxseSBtb3N0IGhlbHBmdWwgdG8gc2VuZCB0aGUgYWN0dWFsIG9iamVjdCBmaWxlcywKLXV1ZW5jb2RlZCBpZiBuZWNlc3NhcnkgdG8gZ2V0IHRoZW0gdGhyb3VnaCB0aGUgbWFpbCBzeXN0ZW0uICBNYWtpbmcgdGhlbQotYXZhaWxhYmxlIGZvciBhbm9ueW1vdXMgRlRQIGlzIG5vdCBhcyBnb29kLCBidXQgbWF5IGJlIHRoZSBvbmx5Ci1yZWFzb25hYmxlIGNob2ljZSBmb3IgbGFyZ2Ugb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgc291cmNlIGZpbGVzIHdlcmUgYXNzZW1ibGVkIHVzaW5nIEBjb2Rle2dhc30gb3IgY29tcGlsZWQgdXNpbmcKLUBjb2Rle2djY30sIHRoZW4gaXQgbWF5IGJlIE9LIHRvIHNlbmQgdGhlIHNvdXJjZSBmaWxlcyByYXRoZXIgdGhhbiB0aGUKLW9iamVjdCBmaWxlcy4gIEluIHRoaXMgY2FzZSwgYmUgc3VyZSB0byBzYXkgZXhhY3RseSB3aGF0IHZlcnNpb24gb2YKLUBjb2Rle2dhc30gb3IgQGNvZGV7Z2NjfSB3YXMgdXNlZCB0byBwcm9kdWNlIHRoZSBvYmplY3QgZmlsZXMuICBBbHNvIHNheQotaG93IEBjb2Rle2dhc30gb3IgQGNvZGV7Z2NjfSB3ZXJlIGNvbmZpZ3VyZWQuCi0KLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHdoYXQgYmVoYXZpb3IgeW91IG9ic2VydmUgdGhhdCB5b3UgYmVsaWV2ZSBpcwotaW5jb3JyZWN0LiAgRm9yIGV4YW1wbGUsIGBgSXQgZ2V0cyBhIGZhdGFsIHNpZ25hbC4nJwotCi1PZiBjb3Vyc2UsIGlmIHRoZSBidWcgaXMgdGhhdCBAY29kZXtsZH0gZ2V0cyBhIGZhdGFsIHNpZ25hbCwgdGhlbiB3ZQotd2lsbCBjZXJ0YWlubHkgbm90aWNlIGl0LiAgQnV0IGlmIHRoZSBidWcgaXMgaW5jb3JyZWN0IG91dHB1dCwgd2UgbWlnaHQKLW5vdCBub3RpY2UgdW5sZXNzIGl0IGlzIGdsYXJpbmdseSB3cm9uZy4gIFlvdSBtaWdodCBhcyB3ZWxsIG5vdCBnaXZlIHVzCi1hIGNoYW5jZSB0byBtYWtlIGEgbWlzdGFrZS4KLQotRXZlbiBpZiB0aGUgcHJvYmxlbSB5b3UgZXhwZXJpZW5jZSBpcyBhIGZhdGFsIHNpZ25hbCwgeW91IHNob3VsZCBzdGlsbAotc2F5IHNvIGV4cGxpY2l0bHkuICBTdXBwb3NlIHNvbWV0aGluZyBzdHJhbmdlIGlzIGdvaW5nIG9uLCBzdWNoIGFzLCB5b3VyCi1jb3B5IG9mIEBjb2Rle2xkfSBpcyBvdXQgb2Ygc3luY2gsIG9yIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnIGluIHRoZQotQyBsaWJyYXJ5IG9uIHlvdXIgc3lzdGVtLiAgKFRoaXMgaGFzIGhhcHBlbmVkISkgIFlvdXIgY29weSBtaWdodCBjcmFzaAotYW5kIG91cnMgd291bGQgbm90LiAgSWYgeW91IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2hlbiBvdXJzCi1mYWlscyB0byBjcmFzaCwgd2Ugd291bGQga25vdyB0aGF0IHRoZSBidWcgd2FzIG5vdCBoYXBwZW5pbmcgZm9yIHVzLiAgSWYKLXlvdSBoYWQgbm90IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2Ugd291bGQgbm90IGJlIGFibGUgdG8gZHJhdwotYW55IGNvbmNsdXNpb24gZnJvbSBvdXIgb2JzZXJ2YXRpb25zLgotCi1AaXRlbQotSWYgeW91IHdpc2ggdG8gc3VnZ2VzdCBjaGFuZ2VzIHRvIHRoZSBAY29kZXtsZH0gc291cmNlLCBzZW5kIHVzIGNvbnRleHQKLWRpZmZzLCBhcyBnZW5lcmF0ZWQgYnkgQGNvZGV7ZGlmZn0gd2l0aCB0aGUgQHNhbXB7LXV9LCBAc2FtcHstY30sIG9yCi1Ac2FtcHstcH0gb3B0aW9uLiAgQWx3YXlzIHNlbmQgZGlmZnMgZnJvbSB0aGUgb2xkIGZpbGUgdG8gdGhlIG5ldyBmaWxlLgotSWYgeW91IGV2ZW4gZGlzY3VzcyBzb21ldGhpbmcgaW4gdGhlIEBjb2Rle2xkfSBzb3VyY2UsIHJlZmVyIHRvIGl0IGJ5Ci1jb250ZXh0LCBub3QgYnkgbGluZSBudW1iZXIuCi0KLVRoZSBsaW5lIG51bWJlcnMgaW4gb3VyIGRldmVsb3BtZW50IHNvdXJjZXMgd2lsbCBub3QgbWF0Y2ggdGhvc2UgaW4geW91cgotc291cmNlcy4gIFlvdXIgbGluZSBudW1iZXJzIHdvdWxkIGNvbnZleSBubyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gdXMuCi1AZW5kIGl0ZW1pemUKLQotSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeToKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUEgZGVzY3JpcHRpb24gb2YgdGhlIGVudmVsb3BlIG9mIHRoZSBidWcuCi0KLU9mdGVuIHBlb3BsZSB3aG8gZW5jb3VudGVyIGEgYnVnIHNwZW5kIGEgbG90IG9mIHRpbWUgaW52ZXN0aWdhdGluZwotd2hpY2ggY2hhbmdlcyB0byB0aGUgaW5wdXQgZmlsZSB3aWxsIG1ha2UgdGhlIGJ1ZyBnbyBhd2F5IGFuZCB3aGljaAotY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgaXQuCi0KLVRoaXMgaXMgb2Z0ZW4gdGltZSBjb25zdW1pbmcgYW5kIG5vdCB2ZXJ5IHVzZWZ1bCwgYmVjYXVzZSB0aGUgd2F5IHdlCi13aWxsIGZpbmQgdGhlIGJ1ZyBpcyBieSBydW5uaW5nIGEgc2luZ2xlIGV4YW1wbGUgdW5kZXIgdGhlIGRlYnVnZ2VyCi13aXRoIGJyZWFrcG9pbnRzLCBub3QgYnkgcHVyZSBkZWR1Y3Rpb24gZnJvbSBhIHNlcmllcyBvZiBleGFtcGxlcy4KLVdlIHJlY29tbWVuZCB0aGF0IHlvdSBzYXZlIHlvdXIgdGltZSBmb3Igc29tZXRoaW5nIGVsc2UuCi0KLU9mIGNvdXJzZSwgaWYgeW91IGNhbiBmaW5kIGEgc2ltcGxlciBleGFtcGxlIHRvIHJlcG9ydCBAZW1waHtpbnN0ZWFkfQotb2YgdGhlIG9yaWdpbmFsIG9uZSwgdGhhdCBpcyBhIGNvbnZlbmllbmNlIGZvciB1cy4gIEVycm9ycyBpbiB0aGUKLW91dHB1dCB3aWxsIGJlIGVhc2llciB0byBzcG90LCBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciB3aWxsIHRha2UKLWxlc3MgdGltZSwgYW5kIHNvIG9uLgotCi1Ib3dldmVyLCBzaW1wbGlmaWNhdGlvbiBpcyBub3Qgdml0YWw7IGlmIHlvdSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLAotcmVwb3J0IHRoZSBidWcgYW55d2F5IGFuZCBzZW5kIHVzIHRoZSBlbnRpcmUgdGVzdCBjYXNlIHlvdSB1c2VkLgotCi1AaXRlbQotQSBwYXRjaCBmb3IgdGhlIGJ1Zy4KLQotQSBwYXRjaCBmb3IgdGhlIGJ1ZyBkb2VzIGhlbHAgdXMgaWYgaXQgaXMgYSBnb29kIG9uZS4gIEJ1dCBkbyBub3Qgb21pdAotdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdGVzdCBjYXNlLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0Ci1hIHBhdGNoIGlzIGFsbCB3ZSBuZWVkLiAgV2UgbWlnaHQgc2VlIHByb2JsZW1zIHdpdGggeW91ciBwYXRjaCBhbmQgZGVjaWRlCi10byBmaXggdGhlIHByb2JsZW0gYW5vdGhlciB3YXksIG9yIHdlIG1pZ2h0IG5vdCB1bmRlcnN0YW5kIGl0IGF0IGFsbC4KLQotU29tZXRpbWVzIHdpdGggYSBwcm9ncmFtIGFzIGNvbXBsaWNhdGVkIGFzIEBjb2Rle2xkfSBpdCBpcyB2ZXJ5IGhhcmQgdG8KLWNvbnN0cnVjdCBhbiBleGFtcGxlIHRoYXQgd2lsbCBtYWtlIHRoZSBwcm9ncmFtIGZvbGxvdyBhIGNlcnRhaW4gcGF0aAotdGhyb3VnaCB0aGUgY29kZS4gIElmIHlvdSBkbyBub3Qgc2VuZCB1cyB0aGUgZXhhbXBsZSwgd2Ugd2lsbCBub3QgYmUKLWFibGUgdG8gY29uc3RydWN0IG9uZSwgc28gd2Ugd2lsbCBub3QgYmUgYWJsZSB0byB2ZXJpZnkgdGhhdCB0aGUgYnVnIGlzCi1maXhlZC4KLQotQW5kIGlmIHdlIGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQgYnVnIHlvdSBhcmUgdHJ5aW5nIHRvIGZpeCwgb3Igd2h5IHlvdXIKLXBhdGNoIHNob3VsZCBiZSBhbiBpbXByb3ZlbWVudCwgd2Ugd2lsbCBub3QgaW5zdGFsbCBpdC4gIEEgdGVzdCBjYXNlIHdpbGwKLWhlbHAgdXMgdG8gdW5kZXJzdGFuZC4KLQotQGl0ZW0KLUEgZ3Vlc3MgYWJvdXQgd2hhdCB0aGUgYnVnIGlzIG9yIHdoYXQgaXQgZGVwZW5kcyBvbi4KLQotU3VjaCBndWVzc2VzIGFyZSB1c3VhbGx5IHdyb25nLiAgRXZlbiB3ZSBjYW5ub3QgZ3Vlc3MgcmlnaHQgYWJvdXQgc3VjaAotdGhpbmdzIHdpdGhvdXQgZmlyc3QgdXNpbmcgdGhlIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIGZhY3RzLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIE1SSQotQGFwcGVuZGl4IE1SSSBDb21wYXRpYmxlIFNjcmlwdCBGaWxlcwotQGNpbmRleCBNUkkgY29tcGF0aWJpbGl0eQotVG8gYWlkIHVzZXJzIG1ha2luZyB0aGUgdHJhbnNpdGlvbiB0byBAc2N7Z251fSBAY29kZXtsZH0gZnJvbSB0aGUgTVJJCi1saW5rZXIsIEBjb2Rle2xkfSBjYW4gdXNlIE1SSSBjb21wYXRpYmxlIGxpbmtlciBzY3JpcHRzIGFzIGFuCi1hbHRlcm5hdGl2ZSB0byB0aGUgbW9yZSBnZW5lcmFsLXB1cnBvc2UgbGlua2VyIHNjcmlwdGluZyBsYW5ndWFnZQotZGVzY3JpYmVkIGluIEByZWZ7U2NyaXB0c30uICBNUkkgY29tcGF0aWJsZSBsaW5rZXIgc2NyaXB0cyBoYXZlIGEgbXVjaAotc2ltcGxlciBjb21tYW5kIHNldCB0aGFuIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugb3RoZXJ3aXNlIHVzZWQgd2l0aAotQGNvZGV7bGR9LiAgQHNje2dudX0gQGNvZGV7bGR9IHN1cHBvcnRzIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgTVJJCi1saW5rZXIgY29tbWFuZHM7IHRoZXNlIGNvbW1hbmRzIGFyZSBkZXNjcmliZWQgaGVyZS4KLQotSW4gZ2VuZXJhbCwgTVJJIHNjcmlwdHMgYXJlbid0IG9mIG11Y2ggdXNlIHdpdGggdGhlIEBjb2Rle2Eub3V0fSBvYmplY3QKLWZpbGUgZm9ybWF0LCBzaW5jZSBpdCBvbmx5IGhhcyB0aHJlZSBzZWN0aW9ucyBhbmQgTVJJIHNjcmlwdHMgbGFjayBzb21lCi1mZWF0dXJlcyB0byBtYWtlIHVzZSBvZiB0aGVtLgotCi1Zb3UgY2FuIHNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYW4gTVJJLWNvbXBhdGlibGUgc2NyaXB0IHVzaW5nIHRoZQotQHNhbXB7LWN9IGNvbW1hbmQtbGluZSBvcHRpb24uCi0KLUVhY2ggY29tbWFuZCBpbiBhbiBNUkktY29tcGF0aWJsZSBzY3JpcHQgb2NjdXBpZXMgaXRzIG93biBsaW5lOyBlYWNoCi1jb21tYW5kIGxpbmUgc3RhcnRzIHdpdGggdGhlIGtleXdvcmQgdGhhdCBpZGVudGlmaWVzIHRoZSBjb21tYW5kICh0aG91Z2gKLWJsYW5rIGxpbmVzIGFyZSBhbHNvIGFsbG93ZWQgZm9yIHB1bmN0dWF0aW9uKS4gIElmIGEgbGluZSBvZiBhbgotTVJJLWNvbXBhdGlibGUgc2NyaXB0IGJlZ2lucyB3aXRoIGFuIHVucmVjb2duaXplZCBrZXl3b3JkLCBAY29kZXtsZH0KLWlzc3VlcyBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IGNvbnRpbnVlcyBwcm9jZXNzaW5nIHRoZSBzY3JpcHQuCi0KLUxpbmVzIGJlZ2lubmluZyB3aXRoIEBzYW1weyp9IGFyZSBjb21tZW50cy4KLQotWW91IGNhbiB3cml0ZSB0aGVzZSBjb21tYW5kcyB1c2luZyBhbGwgdXBwZXItY2FzZSBsZXR0ZXJzLCBvciBhbGwKLWxvd2VyIGNhc2U7IGZvciBleGFtcGxlLCBAc2FtcHtjaGlwfSBpcyB0aGUgc2FtZSBhcyBAc2FtcHtDSElQfS4KLVRoZSBmb2xsb3dpbmcgbGlzdCBzaG93cyBvbmx5IHRoZSB1cHBlci1jYXNlIGZvcm0gb2YgZWFjaCBjb21tYW5kLgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7QUJTT0xVVEV9IChNUkkpCi1AaXRlbSBBQlNPTFVURSBAdmFye3NlY25hbWV9Ci1AaXRlbXggQUJTT0xVVEUgQHZhcntzZWNuYW1lfSwgQHZhcntzZWNuYW1lfSwgQGRvdHN7fSBAdmFye3NlY25hbWV9Ci1Ob3JtYWxseSwgQGNvZGV7bGR9IGluY2x1ZGVzIGluIHRoZSBvdXRwdXQgZmlsZSBhbGwgc2VjdGlvbnMgZnJvbSBhbGwKLXRoZSBpbnB1dCBmaWxlcy4gIEhvd2V2ZXIsIGluIGFuIE1SSS1jb21wYXRpYmxlIHNjcmlwdCwgeW91IGNhbiB1c2UgdGhlCi1AY29kZXtBQlNPTFVURX0gY29tbWFuZCB0byByZXN0cmljdCB0aGUgc2VjdGlvbnMgdGhhdCB3aWxsIGJlIHByZXNlbnQgaW4KLXlvdXIgb3V0cHV0IHByb2dyYW0uICBJZiB0aGUgQGNvZGV7QUJTT0xVVEV9IGNvbW1hbmQgaXMgdXNlZCBhdCBhbGwgaW4gYQotc2NyaXB0LCB0aGVuIG9ubHkgdGhlIHNlY3Rpb25zIG5hbWVkIGV4cGxpY2l0bHkgaW4gQGNvZGV7QUJTT0xVVEV9Ci1jb21tYW5kcyB3aWxsIGFwcGVhciBpbiB0aGUgbGlua2VyIG91dHB1dC4gIFlvdSBjYW4gc3RpbGwgdXNlIG90aGVyCi1pbnB1dCBzZWN0aW9ucyAod2hhdGV2ZXIgeW91IHNlbGVjdCBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciB1c2luZwotQGNvZGV7TE9BRH0pIHRvIHJlc29sdmUgYWRkcmVzc2VzIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotQGNpbmRleCBAY29kZXtBTElBU30gKE1SSSkKLUBpdGVtIEFMSUFTIEB2YXJ7b3V0LXNlY25hbWV9LCBAdmFye2luLXNlY25hbWV9Ci1Vc2UgdGhpcyBjb21tYW5kIHRvIHBsYWNlIHRoZSBkYXRhIGZyb20gaW5wdXQgc2VjdGlvbiBAdmFye2luLXNlY25hbWV9Ci1pbiBhIHNlY3Rpb24gY2FsbGVkIEB2YXJ7b3V0LXNlY25hbWV9IGluIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUuCi0KLUB2YXJ7aW4tc2VjbmFtZX0gbWF5IGJlIGFuIGludGVnZXIuCi0KLUBjaW5kZXggQGNvZGV7QUxJR059IChNUkkpCi1AaXRlbSBBTElHTiBAdmFye3NlY25hbWV9ID0gQHZhcntleHByZXNzaW9ufQotQWxpZ24gdGhlIHNlY3Rpb24gY2FsbGVkIEB2YXJ7c2VjbmFtZX0gdG8gQHZhcntleHByZXNzaW9ufS4gIFRoZQotQHZhcntleHByZXNzaW9ufSBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28uCi0KLUBjaW5kZXggQGNvZGV7QkFTRX0gKE1SSSkKLUBpdGVtIEJBU0UgQHZhcntleHByZXNzaW9ufQotVXNlIHRoZSB2YWx1ZSBvZiBAdmFye2V4cHJlc3Npb259IGFzIHRoZSBsb3dlc3QgYWRkcmVzcyAob3RoZXIgdGhhbgotYWJzb2x1dGUgYWRkcmVzc2VzKSBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUBjaW5kZXggQGNvZGV7Q0hJUH0gKE1SSSkKLUBpdGVtIENISVAgQHZhcntleHByZXNzaW9ufQotQGl0ZW14IENISVAgQHZhcntleHByZXNzaW9ufSwgQHZhcntleHByZXNzaW9ufQotVGhpcyBjb21tYW5kIGRvZXMgbm90aGluZzsgaXQgaXMgYWNjZXB0ZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eS4KLQotQGNpbmRleCBAY29kZXtFTkR9IChNUkkpCi1AaXRlbSBFTkQKLVRoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmcgd2hhdGV2ZXI7IGl0J3Mgb25seSBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eS4KLQotQGNpbmRleCBAY29kZXtGT1JNQVR9IChNUkkpCi1AaXRlbSBGT1JNQVQgQHZhcntvdXRwdXQtZm9ybWF0fQotU2ltaWxhciB0byB0aGUgQGNvZGV7T1VUUFVUX0ZPUk1BVH0gY29tbWFuZCBpbiB0aGUgbW9yZSBnZW5lcmFsIGxpbmtlcgotbGFuZ3VhZ2UsIGJ1dCByZXN0cmljdGVkIHRvIG9uZSBvZiB0aGVzZSBvdXRwdXQgZm9ybWF0czogCi0KLUBlbnVtZXJhdGUKLUBpdGVtIAotUy1yZWNvcmRzLCBpZiBAdmFye291dHB1dC1mb3JtYXR9IGlzIEBzYW1we1N9Ci0KLUBpdGVtCi1JRUVFLCBpZiBAdmFye291dHB1dC1mb3JtYXR9IGlzIEBzYW1we0lFRUV9Ci0KLUBpdGVtCi1DT0ZGICh0aGUgQHNhbXB7Y29mZi1tNjhrfSB2YXJpYW50IGluIEJGRCksIGlmIEB2YXJ7b3V0cHV0LWZvcm1hdH0gaXMKLUBzYW1we0NPRkZ9Ci1AZW5kIGVudW1lcmF0ZQotCi1AY2luZGV4IEBjb2Rle0xJU1R9IChNUkkpCi1AaXRlbSBMSVNUIEB2YXJ7YW55dGhpbmd9QGRvdHN7fQotUHJpbnQgKHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZmlsZSkgYSBsaW5rIG1hcCwgYXMgcHJvZHVjZWQgYnkgdGhlCi1AY29kZXtsZH0gY29tbWFuZC1saW5lIG9wdGlvbiBAc2FtcHstTX0uCi0KLVRoZSBrZXl3b3JkIEBjb2Rle0xJU1R9IG1heSBiZSBmb2xsb3dlZCBieSBhbnl0aGluZyBvbiB0aGUKLXNhbWUgbGluZSwgd2l0aCBubyBjaGFuZ2UgaW4gaXRzIGVmZmVjdC4KLQotQGNpbmRleCBAY29kZXtMT0FEfSAoTVJJKQotQGl0ZW0gTE9BRCBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IExPQUQgQHZhcntmaWxlbmFtZX0sIEB2YXJ7ZmlsZW5hbWV9LCBAZG90c3t9IEB2YXJ7ZmlsZW5hbWV9Ci1JbmNsdWRlIG9uZSBvciBtb3JlIG9iamVjdCBmaWxlIEB2YXJ7ZmlsZW5hbWV9IGluIHRoZSBsaW5rOyB0aGlzIGhhcyB0aGUKLXNhbWUgZWZmZWN0IGFzIHNwZWNpZnlpbmcgQHZhcntmaWxlbmFtZX0gZGlyZWN0bHkgb24gdGhlIEBjb2Rle2xkfQotY29tbWFuZCBsaW5lLgotCi1AY2luZGV4IEBjb2Rle05BTUV9IChNUkkpCi1AaXRlbSBOQU1FIEB2YXJ7b3V0cHV0LW5hbWV9Ci1AdmFye291dHB1dC1uYW1lfSBpcyB0aGUgbmFtZSBmb3IgdGhlIHByb2dyYW0gcHJvZHVjZWQgYnkgQGNvZGV7bGR9OyB0aGUKLU1SSS1jb21wYXRpYmxlIGNvbW1hbmQgQGNvZGV7TkFNRX0gaXMgZXF1aXZhbGVudCB0byB0aGUgY29tbWFuZC1saW5lCi1vcHRpb24gQHNhbXB7LW99IG9yIHRoZSBnZW5lcmFsIHNjcmlwdCBsYW5ndWFnZSBjb21tYW5kIEBjb2Rle09VVFBVVH0uCi0KLUBjaW5kZXggQGNvZGV7T1JERVJ9IChNUkkpCi1AaXRlbSBPUkRFUiBAdmFye3NlY25hbWV9LCBAdmFye3NlY25hbWV9LCBAZG90c3t9IEB2YXJ7c2VjbmFtZX0KLUBpdGVteCBPUkRFUiBAdmFye3NlY25hbWV9IEB2YXJ7c2VjbmFtZX0gQHZhcntzZWNuYW1lfQotTm9ybWFsbHksIEBjb2Rle2xkfSBvcmRlcnMgdGhlIHNlY3Rpb25zIGluIGl0cyBvdXRwdXQgZmlsZSBpbiB0aGUKLW9yZGVyIGluIHdoaWNoIHRoZXkgZmlyc3QgYXBwZWFyIGluIHRoZSBpbnB1dCBmaWxlcy4gIEluIGFuIE1SSS1jb21wYXRpYmxlCi1zY3JpcHQsIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBvcmRlcmluZyB3aXRoIHRoZSBAY29kZXtPUkRFUn0gY29tbWFuZC4gIFRoZQotc2VjdGlvbnMgeW91IGxpc3Qgd2l0aCBAY29kZXtPUkRFUn0gd2lsbCBhcHBlYXIgZmlyc3QgaW4geW91ciBvdXRwdXQKLWZpbGUsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuCi0KLUBjaW5kZXggQGNvZGV7UFVCTElDfSAoTVJJKQotQGl0ZW0gUFVCTElDIEB2YXJ7bmFtZX09QHZhcntleHByZXNzaW9ufQotQGl0ZW14IFBVQkxJQyBAdmFye25hbWV9LEB2YXJ7ZXhwcmVzc2lvbn0KLUBpdGVteCBQVUJMSUMgQHZhcntuYW1lfSBAdmFye2V4cHJlc3Npb259Ci1TdXBwbHkgYSB2YWx1ZSAoQHZhcntleHByZXNzaW9ufSkgZm9yIGV4dGVybmFsIHN5bWJvbAotQHZhcntuYW1lfSB1c2VkIGluIHRoZSBsaW5rZXIgaW5wdXQgZmlsZXMuCi0KLUBjaW5kZXggQGNvZGV7U0VDVH0gKE1SSSkKLUBpdGVtIFNFQ1QgQHZhcntzZWNuYW1lfSwgQHZhcntleHByZXNzaW9ufQotQGl0ZW14IFNFQ1QgQHZhcntzZWNuYW1lfT1AdmFye2V4cHJlc3Npb259Ci1AaXRlbXggU0VDVCBAdmFye3NlY25hbWV9IEB2YXJ7ZXhwcmVzc2lvbn0KLVlvdSBjYW4gdXNlIGFueSBvZiB0aGVzZSB0aHJlZSBmb3JtcyBvZiB0aGUgQGNvZGV7U0VDVH0gY29tbWFuZCB0bwotc3BlY2lmeSB0aGUgc3RhcnQgYWRkcmVzcyAoQHZhcntleHByZXNzaW9ufSkgZm9yIHNlY3Rpb24gQHZhcntzZWNuYW1lfS4KLUlmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgQGNvZGV7U0VDVH0gc3RhdGVtZW50IGZvciB0aGUgc2FtZQotQHZhcntzZWNuYW1lfSwgb25seSB0aGUgQGVtcGh7Zmlyc3R9IHNldHMgdGhlIHN0YXJ0IGFkZHJlc3MuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AdGV4Ci0lIEkgdGhpbmsgc29tZXRoaW5nIGxpa2UgQGNvbG9waG9uIHNob3VsZCBiZSBpbiB0ZXhpbmZvLiAgSW4gdGhlCi0lIG1lYW50aW1lOgotXGxvbmdcZGVmXGNvbG9waG9ue1xoYm94IHRvMHB0e31cdmZpbGwKLVxjZW50ZXJsaW5le1RoZSBib2R5IG9mIHRoaXMgbWFudWFsIGlzIHNldCBpbn0KLVxjZW50ZXJsaW5le1xmb250bmFtZVx0ZW5ybSx9Ci1cY2VudGVybGluZXt3aXRoIGhlYWRpbmdzIGluIHtcYmZcZm9udG5hbWVcdGVuYmZ9fQotXGNlbnRlcmxpbmV7YW5kIGV4YW1wbGVzIGluIHtcdHRcZm9udG5hbWVcdGVudHR9Ln0KLVxjZW50ZXJsaW5le3tcaXRcZm9udG5hbWVcdGVuaXRcL30gYW5kfQotXGNlbnRlcmxpbmV7e1xzbFxmb250bmFtZVx0ZW5zbFwvfX0KLVxjZW50ZXJsaW5le2FyZSB1c2VkIGZvciBlbXBoYXNpcy59XHZmaWxsfQotXHBhZ2VcY29sb3Bob24KLSUgQmxhbWU6IGRvY0BjeWdudXMuY29tLCAyOG1hcjkxLgotQGVuZCB0ZXgKLQotCi1AY29udGVudHMKLUBieWUKLQotCmRpZmYgLS1naXQgYS9sZC9sZGNyZWYuYyBiL2xkL2xkY3JlZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzViOGU2Li4wMDAwMDAwCi0tLSBhL2xkL2xkY3JlZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qIGxkY3JlZi5jIC0tIG91dHB1dCBhIGNyb3NzIHJlZmVyZW5jZSB0YWJsZQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIHJvdXRpbmVzIHRoYXQgbWFuYWdlIHRoZSBjcm9zcyByZWZlcmVuY2UgdGFibGUuCi0gICBUaGUgdGFibGUgaXMgdXNlZCB0byBnZW5lcmF0ZSBjcm9zcyByZWZlcmVuY2UgcmVwb3J0cy4gIEl0IGlzIGFsc28KLSAgIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBOT0NST1NTUkVGUyBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLQotLyogV2Uga2VlcCBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZSBmb3IgZWFjaCByZWZlcmVuY2UgdG8gYQotICAgc3ltYm9sIGZyb20gYSBnaXZlbiBvYmplY3QuICAqLwotCi1zdHJ1Y3QgY3JlZl9yZWYKLXsKLSAgLyogVGhlIG5leHQgcmVmZXJlbmNlLiAgKi8KLSAgc3RydWN0IGNyZWZfcmVmICpuZXh0OwotICAvKiBUaGUgb2JqZWN0LiAgKi8KLSAgYmZkICphYmZkOwotICAvKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4gICovCi0gIHVuc2lnbmVkIGludCBkZWYgOiAxOwotICAvKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgY29tbW9uLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbW1vbiA6IDE7Ci0gIC8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuICAqLwotICB1bnNpZ25lZCBpbnQgdW5kZWYgOiAxOwotfTsKLQotLyogV2Uga2VlcCBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scy4gIEVhY2ggZW50cnkgbG9va3MgbGlrZSB0aGlzLiAgKi8KLQotc3RydWN0IGNyZWZfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogVGhlIGRlbWFuZ2xlZCBuYW1lLiAgKi8KLSAgY2hhciAqZGVtYW5nbGVkOwotICAvKiBSZWZlcmVuY2VzIHRvIGFuZCBkZWZpbml0aW9ucyBvZiB0aGlzIHN5bWJvbC4gICovCi0gIHN0cnVjdCBjcmVmX3JlZiAqcmVmczsKLX07Ci0KLS8qIFRoaXMgaXMgd2hhdCB0aGUgaGFzaCB0YWJsZSBsb29rcyBsaWtlLiAgKi8KLQotc3RydWN0IGNyZWZfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmNyZWZfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjcmVmX2ZpbGxfYXJyYXkgUEFSQU1TICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBpbnQgY3JlZl9zb3J0X2FycmF5IFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBvdXRwdXRfb25lX2NyZWYgUEFSQU1TICgoRklMRSAqLCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGNoZWNrX25vY3Jvc3NyZWYgUEFSQU1TICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNoZWNrX3JlZnMKLSAgUEFSQU1TICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICopKTsKLXN0YXRpYyB2b2lkIGNoZWNrX3JlbG9jX3JlZnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIHRoZSBjcmVmIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNyZWZfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KQkJXAotICAoKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogVHJhdmVyc2UgdGhlIGNyZWYgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY3JlZl9oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCQlcCi0gIChiZmRfaGFzaF90cmF2ZXJzZQkJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBUaGUgY3JlZiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBjcmVmX2hhc2hfdGFibGUgY3JlZl90YWJsZTsKLQotLyogV2hldGhlciB0aGUgY3JlZiBoYXNoIHRhYmxlIGhhcyBiZWVuIGluaXRpYWxpemVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY3JlZl9pbml0aWFsaXplZDsKLQotLyogVGhlIG51bWJlciBvZiBzeW1ib2xzIHNlZW4gc28gZmFyLiAgKi8KLQotc3RhdGljIHNpemVfdCBjcmVmX3N5bWNvdW50OwotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBjcmVmIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWNyZWZfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+ZGVtYW5nbGVkID0gTlVMTDsKLSAgICAgIHJldC0+cmVmcyA9IE5VTEw7Ci0KLSAgICAgIC8qIEtlZXAgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgY3JlYXRlZCBpbiB0aGUgaGFzaAotICAgICAgICAgdGFibGUuICAqLwotICAgICAgKytjcmVmX3N5bWNvdW50OwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgY3JlZiBoYXNoIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGV2ZXJ5Ci0gICBzeW1ib2wgdGhhdCBpcyBzZWVuIGR1cmluZyB0aGUgbGluay4gICovCi0KLS8qQVJHU1VTRUQqLwotdm9pZAotYWRkX2NyZWYgKG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBjcmVmX3JlZiAqcjsKLQotICBpZiAoISBjcmVmX2luaXRpYWxpemVkKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZjcmVmX3RhYmxlLnJvb3QsIGNyZWZfaGFzaF9uZXdmdW5jKSkKLQllaW5mbyAoXygiJVglUDogYmZkX2hhc2hfdGFibGVfaW5pdCBvZiBjcmVmIHRhYmxlIGZhaWxlZDogJUVcbiIpKTsKLSAgICAgIGNyZWZfaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICBoID0gY3JlZl9oYXNoX2xvb2t1cCAoJmNyZWZfdGFibGUsIG5hbWUsIHRydWUsIGZhbHNlKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICBlaW5mbyAoXygiJVglUDogY3JlZl9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0KLSAgZm9yIChyID0gaC0+cmVmczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICBpZiAoci0+YWJmZCA9PSBhYmZkKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByID0gKHN0cnVjdCBjcmVmX3JlZiAqKSB4bWFsbG9jIChzaXplb2YgKnIpOwotICAgICAgci0+bmV4dCA9IGgtPnJlZnM7Ci0gICAgICBoLT5yZWZzID0gcjsKLSAgICAgIHItPmFiZmQgPSBhYmZkOwotICAgICAgci0+ZGVmID0gZmFsc2U7Ci0gICAgICByLT5jb21tb24gPSBmYWxzZTsKLSAgICAgIHItPnVuZGVmID0gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotICAgIHItPnVuZGVmID0gdHJ1ZTsKLSAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICByLT5jb21tb24gPSB0cnVlOwotICBlbHNlCi0gICAgci0+ZGVmID0gdHJ1ZTsKLX0KLQotLyogQ29weSB0aGUgYWRkcmVzc2VzIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJpZXMgaW50byBhbiBhcnJheS4gIFRoaXMKLSAgIGlzIGNhbGxlZCB2aWEgY3JlZl9oYXNoX3RyYXZlcnNlLiAgV2UgYWxzbyBmaWxsIGluIHRoZSBkZW1hbmdsZWQKLSAgIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY3JlZl9maWxsX2FycmF5IChoLCBkYXRhKQotICAgICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKipwcGggPSAoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKiopIGRhdGE7Ci0KLSAgQVNTRVJUIChoLT5kZW1hbmdsZWQgPT0gTlVMTCk7Ci0gIGgtPmRlbWFuZ2xlZCA9IGRlbWFuZ2xlIChoLT5yb290LnN0cmluZyk7Ci0KLSAgKipwcGggPSBoOwotCi0gICsrKnBwaDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU29ydCBhbiBhcnJheSBvZiBjcmVmIGhhc2ggdGFibGUgZW50cmllcyBieSBuYW1lLiAgKi8KLQotc3RhdGljIGludAotY3JlZl9zb3J0X2FycmF5IChhMSwgYTIpCi0gICAgIGNvbnN0IFBUUiBhMTsKLSAgICAgY29uc3QgUFRSIGEyOwotewotICBjb25zdCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqcDEgPSAoY29uc3Qgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKikgYTE7Ci0gIGNvbnN0IHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKipwMiA9IChjb25zdCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqKSBhMjsKLQotICByZXR1cm4gc3RyY21wICgoKnAxKS0+ZGVtYW5nbGVkLCAoKnAyKS0+ZGVtYW5nbGVkKTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBjcmVmIHRhYmxlLiAgKi8KLQotI2RlZmluZSBGSUxFQ09MICg1MCkKLQotdm9pZAotb3V0cHV0X2NyZWYgKGZwKQotICAgICBGSUxFICpmcDsKLXsKLSAgaW50IGxlbjsKLSAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKmNzeW1zLCAqKmNzeW1fZmlsbCwgKipjc3ltLCAqKmNzeW1fZW5kOwotICBjb25zdCBjaGFyICptc2c7Ci0KLSAgZnByaW50ZiAoZnAsIF8oIlxuQ3Jvc3MgUmVmZXJlbmNlIFRhYmxlXG5cbiIpKTsKLSAgbXNnID0gXygiU3ltYm9sIik7Ci0gIGZwcmludGYgKGZwLCBtc2cpOwotICBsZW4gPSBzdHJsZW4gKG1zZyk7Ci0gIHdoaWxlIChsZW4gPCBGSUxFQ09MKQotICAgIHsKLSAgICAgIHB1dGMgKCcgJyAsIGZwKTsKLSAgICAgICsrbGVuOwotICAgIH0KLSAgZnByaW50ZiAoZnAsIF8oIkZpbGVcbiIpKTsKLQotICBpZiAoISBjcmVmX2luaXRpYWxpemVkKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZwLCBfKCJObyBzeW1ib2xzXG4iKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNzeW1zID0gKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqKQotCSAgIHhtYWxsb2MgKGNyZWZfc3ltY291bnQgKiBzaXplb2YgKCpjc3ltcykpKTsKLQotICBjc3ltX2ZpbGwgPSBjc3ltczsKLSAgY3JlZl9oYXNoX3RyYXZlcnNlICgmY3JlZl90YWJsZSwgY3JlZl9maWxsX2FycmF5LCAmY3N5bV9maWxsKTsKLSAgQVNTRVJUICgoc2l6ZV90KSAoY3N5bV9maWxsIC0gY3N5bXMpID09IGNyZWZfc3ltY291bnQpOwotCi0gIHFzb3J0IChjc3ltcywgY3JlZl9zeW1jb3VudCwgc2l6ZW9mICgqY3N5bXMpLCBjcmVmX3NvcnRfYXJyYXkpOwotCi0gIGNzeW1fZW5kID0gY3N5bXMgKyBjcmVmX3N5bWNvdW50OwotICBmb3IgKGNzeW0gPSBjc3ltczsgY3N5bSA8IGNzeW1fZW5kOyBjc3ltKyspCi0gICAgb3V0cHV0X29uZV9jcmVmIChmcCwgKmNzeW0pOwotfQotCi0vKiBPdXRwdXQgb25lIGVudHJ5IGluIHRoZSBjcm9zcyByZWZlcmVuY2UgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotb3V0cHV0X29uZV9jcmVmIChmcCwgaCkKLSAgICAgRklMRSAqZnA7Ci0gICAgIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGludCBsZW47Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpobDsKLSAgc3RydWN0IGNyZWZfcmVmICpyOwotCi0gIGhsID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBoLT5yb290LnN0cmluZywgZmFsc2UsCi0JCQkgICAgIGZhbHNlLCB0cnVlKTsKLSAgaWYgKGhsID09IE5VTEwpCi0gICAgZWluZm8gKCIlUDogc3ltYm9sIGAlVCcgbWlzc2luZyBmcm9tIG1haW4gaGFzaCB0YWJsZVxuIiwKLQkgICBoLT5yb290LnN0cmluZyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QgYnV0IG5ldmVyCi0JIHJlZmVyZW5jZWQgYnkgYSBub3JtYWwgb2JqZWN0LCB0aGVuIGRvbid0IHByaW50IGl0LiAgKi8KLSAgICAgIGlmIChobC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JewotCSAgaWYgKGhsLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICByZXR1cm47Ci0JICBpZiAoaGwtPnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICAgICAmJiAoaGwtPnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JICAgIHsKLQkgICAgICBmb3IgKHIgPSBoLT5yZWZzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotCQlpZiAoKHItPmFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLQkJICBicmVhazsKLQkgICAgICBpZiAociA9PSBOVUxMKQotCQlyZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGZwLCAiJXMgIiwgaC0+ZGVtYW5nbGVkKTsKLSAgbGVuID0gc3RybGVuIChoLT5kZW1hbmdsZWQpICsgMTsKLQotICBmb3IgKHIgPSBoLT5yZWZzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChyLT5kZWYpCi0JewotCSAgd2hpbGUgKGxlbiA8IEZJTEVDT0wpCi0JICAgIHsKLQkgICAgICBwdXRjICgnICcsIGZwKTsKLQkgICAgICArK2xlbjsKLQkgICAgfQotCSAgbGZpbmZvIChmcCwgIiVCXG4iLCByLT5hYmZkKTsKLQkgIGxlbiA9IDA7Ci0JfQotICAgIH0KLQotICBmb3IgKHIgPSBoLT5yZWZzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIHItPmRlZikKLQl7Ci0JICB3aGlsZSAobGVuIDwgRklMRUNPTCkKLQkgICAgewotCSAgICAgIHB1dGMgKCcgJywgZnApOwotCSAgICAgICsrbGVuOwotCSAgICB9Ci0JICBsZmluZm8gKGZwLCAiJUJcbiIsIHItPmFiZmQpOwotCSAgbGVuID0gMDsKLQl9Ci0gICAgfQotCi0gIEFTU0VSVCAobGVuID09IDApOwotfQotCi0vKiBDaGVjayBmb3IgcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2VzLiAgKi8KLQotdm9pZAotY2hlY2tfbm9jcm9zc3JlZnMgKCkKLXsKLSAgaWYgKCEgY3JlZl9pbml0aWFsaXplZCkKLSAgICByZXR1cm47Ci0KLSAgY3JlZl9oYXNoX3RyYXZlcnNlICgmY3JlZl90YWJsZSwgY2hlY2tfbm9jcm9zc3JlZiwgKFBUUikgTlVMTCk7Ci19Ci0KLS8qIENoZWNrIG9uZSBzeW1ib2wgdG8gc2VlIGlmIGl0IGlzIGEgcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2UuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1jaGVja19ub2Nyb3NzcmVmIChoLCBpZ25vcmUpCi0gICAgIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhsOwotICBhc2VjdGlvbiAqZGVmc2VjOwotICBjb25zdCBjaGFyICpkZWZzZWNuYW1lOwotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbmNyczsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbmNyOwotCi0gIGhsID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBoLT5yb290LnN0cmluZywgZmFsc2UsCi0JCQkgICAgIGZhbHNlLCB0cnVlKTsKLSAgaWYgKGhsID09IE5VTEwpCi0gICAgewotICAgICAgZWluZm8gKF8oIiVQOiBzeW1ib2wgYCVUJyBtaXNzaW5nIGZyb20gbWFpbiBoYXNoIHRhYmxlXG4iKSwKLQkgICAgIGgtPnJvb3Quc3RyaW5nKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaGwtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiBobC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZGVmc2VjID0gaGwtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotICBpZiAoZGVmc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGRlZnNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZGVmc2VjLT5vd25lciwgZGVmc2VjKTsKLQotICBmb3IgKG5jcnMgPSBub2Nyb3NzcmVmX2xpc3Q7IG5jcnMgIT0gTlVMTDsgbmNycyA9IG5jcnMtPm5leHQpCi0gICAgZm9yIChuY3IgPSBuY3JzLT5saXN0OyBuY3IgIT0gTlVMTDsgbmNyID0gbmNyLT5uZXh0KQotICAgICAgaWYgKHN0cmNtcCAobmNyLT5uYW1lLCBkZWZzZWNuYW1lKSA9PSAwKQotCWNoZWNrX3JlZnMgKGgsIGhsLCBuY3JzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIHN0cnVjdCBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gZnJvbSBjaGVja19yZWZzIHRvCi0gICBjaGVja19yZWxvY19yZWZzIHRocm91Z2ggYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RydWN0IGNoZWNrX3JlZnNfaW5mbwotewotICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotICBhc2VjdGlvbiAqZGVmc2VjOwotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbmNyczsKLSAgYXN5bWJvbCAqKmFzeW1ib2xzOwotICBib29sZWFuIHNhbWU7Ci19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBzeW1ib2wgZGVmaW5lZCBpbiBhIHNlY3Rpb24gd2hpY2gKLSAgIHByb2hpYml0cyBjcm9zcyByZWZlcmVuY2VzLiAgV2UgbmVlZCB0byBsb29rIHRocm91Z2ggYWxsIHJlZmVyZW5jZXMKLSAgIHRvIHRoaXMgc3ltYm9sLCBhbmQgZW5zdXJlIHRoYXQgdGhlIHJlZmVyZW5jZXMgYXJlIG5vdCBmcm9tCi0gICBwcm9oaWJpdGVkIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoZWNrX3JlZnMgKGgsIGhsLCBuY3JzKQotICAgICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGw7Ci0gICAgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICpuY3JzOwotewotICBzdHJ1Y3QgY3JlZl9yZWYgKnJlZjsKLQotICBmb3IgKHJlZiA9IGgtPnJlZnM7IHJlZiAhPSBOVUxMOyByZWYgPSByZWYtPm5leHQpCi0gICAgewotICAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqbGk7Ci0gICAgICBhc3ltYm9sICoqYXN5bWJvbHM7Ci0gICAgICBzdHJ1Y3QgY2hlY2tfcmVmc19pbmZvIGluZm87Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gbG9vayB0aHJvdWdoIHRoZSByZWxvY2F0aW9ucyBmb3IgdGhpcyBCRkQsIHRvIHNlZQotICAgICAgICAgaWYgYW55IG9mIHRoZSByZWxvY2F0aW9ucyB3aGljaCByZWZlciB0byB0aGlzIHN5bWJvbCBhcmUgZnJvbQotICAgICAgICAgYSBwcm9oaWJpdGVkIHNlY3Rpb24uICBOb3RlIHRoYXQgd2UgbmVlZCB0byBkbyB0aGlzIGV2ZW4gZm9yCi0gICAgICAgICB0aGUgQkZEIGluIHdoaWNoIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgc2luY2UgZXZlbiBhIHNpbmdsZQotICAgICAgICAgQkZEIG1pZ2h0IGNvbnRhaW4gYSBwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZTsgZm9yIHRoaXMKLSAgICAgICAgIGNhc2UsIHdlIHNldCB0aGUgU0FNRSBmaWVsZCBpbiBJTkZPLCB3aGljaCB3aWxsIGNhdXNlCi0gICAgICAgICBDSEVDS19SRUxPQ1NfUkVGUyB0byBjaGVjayBmb3IgcmVsb2NhdGlvbnMgYWdhaW5zdCB0aGUKLSAgICAgICAgIHNlY3Rpb24gYXMgd2VsbCBhcyBhZ2FpbnN0IHRoZSBzeW1ib2wuICAqLwotCi0gICAgICBsaSA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIHJlZi0+YWJmZC0+dXNyZGF0YTsKLSAgICAgIGlmIChsaSAhPSBOVUxMICYmIGxpLT5hc3ltYm9scyAhPSBOVUxMKQotCWFzeW1ib2xzID0gbGktPmFzeW1ib2xzOwotICAgICAgZWxzZQotCXsKLQkgIGxvbmcgc3ltc2l6ZTsKLQkgIGxvbmcgc3ltYm9sX2NvdW50OwotCi0JICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKHJlZi0+YWJmZCk7Ci0JICBpZiAoc3ltc2l6ZSA8IDApCi0JICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOyAlRVxuIiksIHJlZi0+YWJmZCk7Ci0JICBhc3ltYm9scyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLQkgIHN5bWJvbF9jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChyZWYtPmFiZmQsIGFzeW1ib2xzKTsKLQkgIGlmIChzeW1ib2xfY291bnQgPCAwKQotCSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCByZWYtPmFiZmQpOwotCSAgaWYgKGxpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBsaS0+YXN5bWJvbHMgPSBhc3ltYm9sczsKLQkgICAgICBsaS0+c3ltYm9sX2NvdW50ID0gc3ltYm9sX2NvdW50OwotCSAgICB9Ci0JfQotCi0gICAgICBpbmZvLmggPSBoOwotICAgICAgaW5mby5kZWZzZWMgPSBobC0+dS5kZWYuc2VjdGlvbjsKLSAgICAgIGluZm8ubmNycyA9IG5jcnM7Ci0gICAgICBpbmZvLmFzeW1ib2xzID0gYXN5bWJvbHM7Ci0gICAgICBpZiAocmVmLT5hYmZkID09IGhsLT51LmRlZi5zZWN0aW9uLT5vd25lcikKLQlpbmZvLnNhbWUgPSB0cnVlOwotICAgICAgZWxzZQotCWluZm8uc2FtZSA9IGZhbHNlOwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChyZWYtPmFiZmQsIGNoZWNrX3JlbG9jX3JlZnMsIChQVFIpICZpbmZvKTsKLQotICAgICAgaWYgKGxpID09IE5VTEwpCi0JZnJlZSAoYXN5bWJvbHMpOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgdmlhIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gIElORk8tPkggaXMgYSBzeW1ib2wKLSAgIGRlZmluZWQgaW4gSU5GTy0+REVGU0VDTkFNRS4gIElmIHRoaXMgc2VjdGlvbiBtYXBzIGludG8gYW55IG9mIHRoZQotICAgc2VjdGlvbnMgbGlzdGVkIGluIElORk8tPk5DUlMsIG90aGVyIHRoYW4gSU5GTy0+REVGU0VDTkFNRSwgdGhlbiB3ZQotICAgbG9vayB0aHJvdWdoIHRoZSByZWxvY2F0aW9ucy4gIElmIGFueSBvZiB0aGUgcmVsb2NhdGlvbnMgYXJlIHRvCi0gICBJTkZPLT5ILCB0aGVuIHdlIHJlcG9ydCBhIHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlIGVycm9yLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoZWNrX3JlbG9jX3JlZnMgKGFiZmQsIHNlYywgaWFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgaWFyZzsKLXsKLSAgc3RydWN0IGNoZWNrX3JlZnNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgY2hlY2tfcmVmc19pbmZvICopIGlhcmc7Ci0gIGFzZWN0aW9uICpvdXRzZWM7Ci0gIGNvbnN0IGNoYXIgKm91dHNlY25hbWU7Ci0gIGFzZWN0aW9uICpvdXRkZWZzZWM7Ci0gIGNvbnN0IGNoYXIgKm91dGRlZnNlY25hbWU7Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm5jcjsKLSAgY29uc3QgY2hhciAqc3ltbmFtZTsKLSAgbG9uZyByZWxzaXplOwotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQ7Ci0gIGFyZWxlbnQgKipwLCAqKnBlbmQ7Ci0KLSAgb3V0c2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLSAgb3V0c2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRzZWMtPm93bmVyLCBvdXRzZWMpOwotCi0gIG91dGRlZnNlYyA9IGluZm8tPmRlZnNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gIG91dGRlZnNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0ZGVmc2VjLT5vd25lciwgb3V0ZGVmc2VjKTsKLQotICAvKiBUaGUgc2VjdGlvbiB3aGVyZSB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaXMgcGVybWl0dGVkLiAgKi8KLSAgaWYgKHN0cmNtcCAob3V0c2VjbmFtZSwgb3V0ZGVmc2VjbmFtZSkgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChuY3IgPSBpbmZvLT5uY3JzLT5saXN0OyBuY3IgIT0gTlVMTDsgbmNyID0gbmNyLT5uZXh0KQotICAgIGlmIChzdHJjbXAgKG91dHNlY25hbWUsIG5jci0+bmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChuY3IgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogVGhpcyBzZWN0aW9uIGlzIG9uZSBmb3Igd2hpY2ggY3Jvc3MgcmVmZXJlbmNlcyBhcmUgcHJvaGliaXRlZC4KLSAgICAgTG9vayB0aHJvdWdoIHRoZSByZWxvY2F0aW9ucywgYW5kIHNlZSBpZiBhbnkgb2YgdGhlbSBhcmUgdG8KLSAgICAgSU5GTy0+SC4gICovCi0KLSAgc3ltbmFtZSA9IGluZm8tPmgtPnJvb3Quc3RyaW5nOwotCi0gIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpOwotICBpZiAocmVsc2l6ZSA8IDApCi0gICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHJlbG9jczogJUVcbiIpLCBhYmZkKTsKLSAgaWYgKHJlbHNpemUgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0gIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWxwcCwgaW5mby0+YXN5bWJvbHMpOwotICBpZiAocmVsY291bnQgPCAwKQotICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCByZWxvY3M6ICVFXG4iKSwgYWJmZCk7Ci0KLSAgcCA9IHJlbHBwOwotICBwZW5kID0gcCArIHJlbGNvdW50OwotICBmb3IgKDsgcCA8IHBlbmQgJiYgKnAgIT0gTlVMTDsgcCsrKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnEgPSAqcDsKLQotICAgICAgaWYgKHEtPnN5bV9wdHJfcHRyICE9IE5VTEwKLQkgICYmICpxLT5zeW1fcHRyX3B0ciAhPSBOVUxMCi0JICAmJiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lICgqcS0+c3ltX3B0cl9wdHIpLCBzeW1uYW1lKSA9PSAwCi0JICAgICAgfHwgKGluZm8tPnNhbWUKLQkJICAmJiBiZmRfZ2V0X3NlY3Rpb24gKCpxLT5zeW1fcHRyX3B0cikgPT0gaW5mby0+ZGVmc2VjKSkpCi0JewotCSAgLyogV2UgZm91bmQgYSByZWxvYyBmb3IgdGhlIHN5bWJvbC4gIFRoZSBzeW1ib2wgaXMgZGVmaW5lZAotICAgICAgICAgICAgIGluIE9VVFNFQ05BTUUuICBUaGlzIHJlbG9jIGlzIGZyb20gYSBzZWN0aW9uIHdoaWNoIGlzCi0gICAgICAgICAgICAgbWFwcGVkIGludG8gYSBzZWN0aW9uIGZyb20gd2hpY2ggcmVmZXJlbmNlcyB0byBPVVRTRUNOQU1FCi0gICAgICAgICAgICAgYXJlIHByb2hpYml0ZWQuICBXZSBtdXN0IHJlcG9ydCBhbiBlcnJvci4gICovCi0JICBlaW5mbyAoXygiJVglQzogcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2UgZnJvbSAlcyB0byBgJVQnIGluICVzXG4iKSwKLQkJIGFiZmQsIHNlYywgcS0+YWRkcmVzcywgb3V0c2VjbmFtZSwKLQkJIGJmZF9hc3ltYm9sX25hbWUgKCpxLT5zeW1fcHRyX3B0ciksIG91dGRlZnNlY25hbWUpOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAocmVscHApOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRjdG9yLmMgYi9sZC9sZGN0b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0MzRiOC4uMDAwMDAwMAotLS0gYS9sZC9sZGN0b3IuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi0vKiBsZGN0b3IuYyAtLSBjb25zdHJ1Y3RvciBzdXBwb3J0IHJvdXRpbmVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgotICAgCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGN0b3IuaCIKLQotc3RhdGljIGludCBjdG9yX3ByaW8gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGN0b3JfY21wIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLS8qIFRoZSBsaXN0IG9mIHN0YXRlbWVudHMgbmVlZGVkIHRvIGhhbmRsZSBjb25zdHJ1Y3RvcnMuICBUaGVzZSBhcmUKLSAgIGludm9rZWQgYnkgdGhlIGNvbW1hbmQgQ09OU1RSVUNUT1JTIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLWxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBjb25zdHJ1Y3Rvcl9saXN0OwotCi0vKiBXaGV0aGVyIHRoZSBjb25zdHJ1Y3RvcnMgc2hvdWxkIGJlIHNvcnRlZC4gIE5vdGUgdGhhdCB0aGlzIGlzCi0gICBnbG9iYWwgZm9yIHRoZSBlbnRpcmUgbGluazsgd2UgYXNzdW1lIHRoYXQgdGhlcmUgaXMgb25seSBhIHNpbmdsZQotICAgQ09OU1RSVUNUT1JTIGNvbW1hbmQgaW4gdGhlIGxpbmtlciBzY3JpcHQuICAqLwotYm9vbGVhbiBjb25zdHJ1Y3RvcnNfc29ydGVkOwotCi0vKiBUaGUgc2V0cyB3ZSBoYXZlIHNlZW4uICAqLwotc3RydWN0IHNldF9pbmZvICpzZXRzOwotCi0vKiBBZGQgYW4gZW50cnkgdG8gYSBzZXQuICBIIGlzIHRoZSBlbnRyeSBpbiB0aGUgbGlua2VyIGhhc2ggdGFibGUuCi0gICBSRUxPQyBpcyB0aGUgcmVsb2NhdGlvbiB0byB1c2UgZm9yIGFuIGVudHJ5IGluIHRoZSBzZXQuICBTRUNUSU9OCi0gICBhbmQgVkFMVUUgYXJlIHRoZSB2YWx1ZSB0byBhZGQuICBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgdGhlIGZpcnN0Ci0gICBwaGFzZSBvZiB0aGUgbGluaywgd2hlbiB3ZSBhcmUgc3RpbGwgZ2F0aGVyaW5nIHN5bWJvbHMgdG9nZXRoZXIuCi0gICBXZSBqdXN0IHJlY29yZCB0aGUgaW5mb3JtYXRpb24gbm93LiAgVGhlIGxkY3Rvcl9maW5kX2NvbnN0cnVjdG9ycwotICAgZnVuY3Rpb24gd2lsbCBjb25zdHJ1Y3QgdGhlIHNldHMuICAqLwotCi12b2lkCi1sZGN0b3JfYWRkX3NldF9lbnRyeSAoaCwgcmVsb2MsIG5hbWUsIHNlY3Rpb24sIHZhbHVlKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgc3RydWN0IHNldF9pbmZvICpwOwotICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKmU7Ci0gIHN0cnVjdCBzZXRfZWxlbWVudCAqKmVwcDsKLQotICBmb3IgKHAgPSBzZXRzOyBwICE9IChzdHJ1Y3Qgc2V0X2luZm8gKikgTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgaWYgKHAtPmggPT0gaCkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChwID09IChzdHJ1Y3Qgc2V0X2luZm8gKikgTlVMTCkKLSAgICB7Ci0gICAgICBwID0gKHN0cnVjdCBzZXRfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzZXRfaW5mbykpOwotICAgICAgcC0+bmV4dCA9IHNldHM7Ci0gICAgICBzZXRzID0gcDsKLSAgICAgIHAtPmggPSBoOwotICAgICAgcC0+cmVsb2MgPSByZWxvYzsKLSAgICAgIHAtPmNvdW50ID0gMDsKLSAgICAgIHAtPmVsZW1lbnRzID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocC0+cmVsb2MgIT0gcmVsb2MpCi0JewotCSAgZWluZm8gKF8oIiVQJVg6IERpZmZlcmVudCByZWxvY3MgdXNlZCBpbiBzZXQgJXNcbiIpLCBoLT5yb290LnN0cmluZyk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBEb24ndCBwZXJtaXQgYSBzZXQgdG8gYmUgY29uc3RydWN0ZWQgZnJvbSBkaWZmZXJlbnQgb2JqZWN0Ci0gICAgICAgICBmaWxlIGZvcm1hdHMuICBUaGUgc2FtZSByZWxvYyBtYXkgaGF2ZSBkaWZmZXJlbnQgcmVzdWx0cy4gIFdlCi0gICAgICAgICBhY3R1YWxseSBjb3VsZCBzb21ldGltZXMgaGFuZGxlIHRoaXMsIGJ1dCB0aGUgY2FzZSBpcwotICAgICAgICAgdW5saWtlbHkgdG8gZXZlciBhcmlzZS4gIFNvbWV0aW1lcyBjb25zdHJ1Y3RvciBzeW1ib2xzIGFyZSBpbgotICAgICAgICAgdW51c3VhbCBzZWN0aW9ucywgc3VjaCBhcyB0aGUgYWJzb2x1dGUgc2VjdGlvbi0tdGhpcyBhcHBlYXJzCi0gICAgICAgICB0byBiZSB0aGUgY2FzZSBpbiBMaW51eCBhLm91dC0tYW5kIGluIHN1Y2ggY2FzZXMgd2UganVzdAotICAgICAgICAgYXNzdW1lIGV2ZXJ5dGhpbmcgaXMgT0suICAqLwotICAgICAgaWYgKHAtPmVsZW1lbnRzICE9IE5VTEwKLQkgICYmIHNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICYmIHAtPmVsZW1lbnRzLT5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChzZWN0aW9uLT5vd25lciksCi0JCSAgICAgYmZkX2dldF90YXJnZXQgKHAtPmVsZW1lbnRzLT5zZWN0aW9uLT5vd25lcikpICE9IDApCi0JewotCSAgZWluZm8gKF8oIiVQJVg6IERpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzIGNvbXBvc2luZyBzZXQgJXNcbiIpLAotCQkgaC0+cm9vdC5zdHJpbmcpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgZSA9IChzdHJ1Y3Qgc2V0X2VsZW1lbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2V0X2VsZW1lbnQpKTsKLSAgZS0+bmV4dCA9IE5VTEw7Ci0gIGUtPm5hbWUgPSBuYW1lOwotICBlLT5zZWN0aW9uID0gc2VjdGlvbjsKLSAgZS0+dmFsdWUgPSB2YWx1ZTsKLQotICBmb3IgKGVwcCA9ICZwLT5lbGVtZW50czsgKmVwcCAhPSBOVUxMOyBlcHAgPSAmKCplcHApLT5uZXh0KQotICAgIDsKLSAgKmVwcCA9IGU7Ci0KLSAgKytwLT5jb3VudDsKLX0KLQotLyogR2V0IHRoZSBwcmlvcml0eSBvZiBhIGcrKyBnbG9iYWwgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBmcm9tIHRoZQotICAgc3ltYm9sIG5hbWUuICAqLwotCi1zdGF0aWMgaW50Ci1jdG9yX3ByaW8gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIFRoZSBuYW1lIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSBfR0xPQkFMXyRJJDY1NTM1JHRlc3QwMl9fRnYuCi0gICAgIFRoZXJlIG1pZ2h0IGJlIGV4dHJhIGxlYWRpbmcgdW5kZXJzY29yZXMsIGFuZCB0aGUgJCBjaGFyYWN0ZXJzCi0gICAgIG1pZ2h0IGJlIHNvbWV0aGluZyBlbHNlLiAgVGhlIEkgbWlnaHQgYmUgYSBELiAgKi8KLQotICB3aGlsZSAoKm5hbWUgPT0gJ18nKQotICAgICsrbmFtZTsKLQotICBpZiAoc3RybmNtcCAobmFtZSwgIkdMT0JBTF8iLCAgc2l6ZW9mICJHTE9CQUxfIiAtIDEpICE9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIG5hbWUgKz0gc2l6ZW9mICJHTE9CQUxfIiAtIDE7Ci0KLSAgaWYgKG5hbWVbMF0gIT0gbmFtZVsyXSkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChuYW1lWzFdICE9ICdJJyAmJiBuYW1lWzFdICE9ICdEJykKLSAgICByZXR1cm4gLTE7Ci0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBuYW1lWzNdKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIGF0b2kgKG5hbWUgKyAzKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNvcnQgY29uc3RydWN0b3IgZWxlbWVudHMgYnkgcHJpb3JpdHkuICBJdAotICAgaXMgY2FsbGVkIHZpYSBxc29ydC4gICovCi0KLXN0YXRpYyBpbnQKLWN0b3JfY21wIChwMSwgcDIpCi0gICAgIGNvbnN0IFBUUiBwMTsKLSAgICAgY29uc3QgUFRSIHAyOwotewotICBjb25zdCBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKipwZTEgPSAoY29uc3Qgc3RydWN0IHNldF9lbGVtZW50ICoqKSBwMTsKLSAgY29uc3Qgc3RydWN0IHNldF9lbGVtZW50ICoqcGUyID0gKGNvbnN0IHN0cnVjdCBzZXRfZWxlbWVudCAqKikgcDI7Ci0gIGNvbnN0IGNoYXIgKm4xOwotICBjb25zdCBjaGFyICpuMjsKLSAgaW50IHByaW8xOwotICBpbnQgcHJpbzI7Ci0KLSAgbjEgPSAoKnBlMSktPm5hbWU7Ci0gIGlmIChuMSA9PSBOVUxMKQotICAgIG4xID0gIiI7Ci0gIG4yID0gKCpwZTIpLT5uYW1lOwotICBpZiAobjIgPT0gTlVMTCkKLSAgICBuMiA9ICIiOwotCi0gIC8qIFdlIG5lZWQgdG8gc29ydCBpbiByZXZlcnNlIG9yZGVyIGJ5IHByaW9yaXR5LiAgV2hlbiB0d28KLSAgICAgY29uc3RydWN0b3JzIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHksIHdlIHNob3VsZCBtYWludGFpbiB0aGVpcgotICAgICBjdXJyZW50IHJlbGF0aXZlIHBvc2l0aW9uLiAgKi8KLQotICBwcmlvMSA9IGN0b3JfcHJpbyAobjEpOwotICBwcmlvMiA9IGN0b3JfcHJpbyAobjIpOwotCi0gIC8qIFdlIHNvcnQgaW4gcmV2ZXJzZSBvcmRlciBiZWNhdXNlIHRoYXQgaXMgd2hhdCBnKysgZXhwZWN0cy4gICovCi0gIGlmIChwcmlvMSA8IHByaW8yKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChwcmlvMSA+IHByaW8yKQotICAgIHJldHVybiAtMTsKLQotICAvKiBGb3JjZSBhIHN0YWJsZSBzb3J0LiAgKi8KLQotICBpZiAocGUxIDwgcGUyKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAocGUxID4gcGUyKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBmaXJzdCBwaGFzZSBvZiB0aGUgbGluayBhbmQKLSAgIGJlZm9yZSB0aGUgc2Vjb25kIHBoYXNlLiAgQXQgdGhpcyBwb2ludCBhbGwgc2V0IGluZm9ybWF0aW9uIGhhcwotICAgYmVlbiBnYXRoZXJlZC4gIFdlIG5vdyBwdXQgdGhlIHN0YXRlbWVudHMgdG8gYnVpbGQgdGhlIHNldHMKLSAgIHRoZW1zZWx2ZXMgaW50byBjb25zdHJ1Y3Rvcl9saXN0LiAgKi8KLQotdm9pZAotbGRjdG9yX2J1aWxkX3NldHMgKCkKLXsKLSAgc3RhdGljIGJvb2xlYW4gY2FsbGVkOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKm9sZDsKLSAgYm9vbGVhbiBoZWFkZXJfcHJpbnRlZDsKLSAgc3RydWN0IHNldF9pbmZvICpwOwotCi0gIC8qIFRoZSBlbXVsYXRpb24gY29kZSBtYXkgY2FsbCB1cyBkaXJlY3RseSwgYnV0IHdlIG9ubHkgd2FudCB0byBkbwotICAgICB0aGlzIG9uY2UuICAqLwotICBpZiAoY2FsbGVkKQotICAgIHJldHVybjsKLSAgY2FsbGVkID0gdHJ1ZTsKLQotICBpZiAoY29uc3RydWN0b3JzX3NvcnRlZCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBzZXRzOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGludCBjLCBpOwotCSAgc3RydWN0IHNldF9lbGVtZW50ICplOwotCSAgc3RydWN0IHNldF9lbGVtZW50ICoqYXJyYXk7Ci0KLQkgIGlmIChwLT5lbGVtZW50cyA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgYyA9IDA7Ci0JICBmb3IgKGUgPSBwLT5lbGVtZW50czsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKLQkgICAgKytjOwotCi0JICBhcnJheSA9IChzdHJ1Y3Qgc2V0X2VsZW1lbnQgKiopIHhtYWxsb2MgKGMgKiBzaXplb2YgKmFycmF5KTsKLQotCSAgaSA9IDA7Ci0JICBmb3IgKGUgPSBwLT5lbGVtZW50czsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKLQkgICAgewotCSAgICAgIGFycmF5W2ldID0gZTsKLQkgICAgICArK2k7Ci0JICAgIH0KLQotCSAgcXNvcnQgKGFycmF5LCBjLCBzaXplb2YgKmFycmF5LCBjdG9yX2NtcCk7Ci0KLQkgIGUgPSBhcnJheVswXTsKLQkgIHAtPmVsZW1lbnRzID0gZTsKLQkgIGZvciAoaSA9IDA7IGkgPCBjIC0gMTsgaSsrKQotCSAgICBhcnJheVtpXS0+bmV4dCA9IGFycmF5W2kgKyAxXTsKLQkgIGFycmF5W2ldLT5uZXh0ID0gTlVMTDsKLQotCSAgZnJlZSAoYXJyYXkpOwotCX0KLSAgICB9Ci0KLSAgb2xkID0gc3RhdF9wdHI7Ci0gIHN0YXRfcHRyID0gJmNvbnN0cnVjdG9yX2xpc3Q7Ci0KLSAgbGFuZ19saXN0X2luaXQgKHN0YXRfcHRyKTsKLQotICBoZWFkZXJfcHJpbnRlZCA9IGZhbHNlOwotICBmb3IgKHAgPSBzZXRzOyBwICE9IChzdHJ1Y3Qgc2V0X2luZm8gKikgTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IHNldF9lbGVtZW50ICplOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBpbnQgcmVsb2Nfc2l6ZSwgc2l6ZTsKLQotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB3ZSBtYXkgaGF2ZSBiZWVuIGludm9rZWQgZnJvbQotCSBjb2xsZWN0LCBhbmQgdGhlIHNldHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGJ1aWx0LCBzbyB3ZSBkbwotCSBub3QgZG8gYW55dGhpbmcuICAqLwotICAgICAgaWYgKHAtPmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQljb250aW51ZTsKLQotICAgICAgLyogRm9yIGVhY2ggc2V0IHdlIGJ1aWxkOgotCSAgIHNldDoKLQkgICAgIC5sb25nIG51bWJlcl9vZl9lbGVtZW50cwotCSAgICAgLmxvbmcgZWxlbWVudDAKLQkgICAgIC4uLgotCSAgICAgLmxvbmcgZWxlbWVudE4KLQkgICAgIC5sb25nIDAKLQkgZXhjZXB0IHRoYXQgd2UgdXNlIHRoZSByaWdodCBzaXplIGluc3RlYWQgb2YgLmxvbmcuICBXaGVuCi0JIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgZ2VuZXJhdGUgcmVsb2NzIGluc3RlYWQgb2YKLQkgYWRkcmVzc2VzLiAgKi8KLSAgICAgIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBwLT5yZWxvYyk7Ci0gICAgICBpZiAoaG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLQl7Ci0JICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGVpbmZvIChfKCIlUCVYOiAlcyBkb2VzIG5vdCBzdXBwb3J0IHJlbG9jICVzIGZvciBzZXQgJXNcbiIpLAotCQkgICAgIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSwKLQkJICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAocC0+cmVsb2MpLAotCQkgICAgIHAtPmgtPnJvb3Quc3RyaW5nKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBJZiB0aGlzIGlzIG5vdCBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbGwgd2UgbmVlZCBpcyB0aGUKLQkgICAgIHNpemUsIHdoaWNoIHdlIGNhbiBnZXQgZnJvbSB0aGUgaW5wdXQgQkZELiAgKi8KLQkgIGlmIChwLT5lbGVtZW50cy0+c2VjdGlvbi0+b3duZXIgIT0gTlVMTCkKLQkgICAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHAtPmVsZW1lbnRzLT5zZWN0aW9uLT5vd25lciwKLQkJCQkJICAgcC0+cmVsb2MpOwotCSAgaWYgKGhvd3RvID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlaW5mbyAoXygiJVAlWDogJXMgZG9lcyBub3Qgc3VwcG9ydCByZWxvYyAlcyBmb3Igc2V0ICVzXG4iKSwKLQkJICAgICBiZmRfZ2V0X3RhcmdldCAocC0+ZWxlbWVudHMtPnNlY3Rpb24tPm93bmVyKSwKLQkJICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAocC0+cmVsb2MpLAotCQkgICAgIHAtPmgtPnJvb3Quc3RyaW5nKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotICAgICAgc3dpdGNoIChyZWxvY19zaXplKQotCXsKLQljYXNlIDE6IHNpemUgPSBCWVRFOyBicmVhazsKLQljYXNlIDI6IHNpemUgPSBTSE9SVDsgYnJlYWs7Ci0JY2FzZSA0OiBzaXplID0gTE9ORzsgYnJlYWs7Ci0JY2FzZSA4OgotCSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQpCi0JICAgIHNpemUgPSBTUVVBRDsKLQkgIGVsc2UKLQkgICAgc2l6ZSA9IFFVQUQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZWluZm8gKF8oIiVQJVg6IFVuc3VwcG9ydGVkIHNpemUgJWQgZm9yIHNldCAlc1xuIiksCi0JCSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKSwgcC0+aC0+cm9vdC5zdHJpbmcpOwotCSAgc2l6ZSA9IExPTkc7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCAiLiIsCi0JCQkJICAgICAgZXhwX3Vub3AgKEFMSUdOX0ssCi0JCQkJCQlleHBfaW50b3AgKHJlbG9jX3NpemUpKSkpOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHAtPmgtPnJvb3Quc3RyaW5nLAotCQkJCSAgICAgIGV4cF9uYW1lb3AgKE5BTUUsICIuIikpKTsKLSAgICAgIGxhbmdfYWRkX2RhdGEgKHNpemUsIGV4cF9pbnRvcCAoKGJmZF92bWEpIHAtPmNvdW50KSk7Ci0KLSAgICAgIGZvciAoZSA9IHAtPmVsZW1lbnRzOyBlICE9IChzdHJ1Y3Qgc2V0X2VsZW1lbnQgKikgTlVMTDsgZSA9IGUtPm5leHQpCi0JewotCSAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaW50IGxlbjsKLQotCSAgICAgIGlmICghIGhlYWRlcl9wcmludGVkKQotCQl7Ci0JCSAgbWluZm8gKF8oIlxuU2V0ICAgICAgICAgICAgICAgICBTeW1ib2xcblxuIikpOwotCQkgIGhlYWRlcl9wcmludGVkID0gdHJ1ZTsKLQkJfQotCi0JICAgICAgbWluZm8gKCIlcyIsIHAtPmgtPnJvb3Quc3RyaW5nKTsKLQkgICAgICBsZW4gPSBzdHJsZW4gKHAtPmgtPnJvb3Quc3RyaW5nKTsKLQotCSAgICAgIGlmIChsZW4gPj0gMTkpCi0JCXsKLQkJICBwcmludF9ubCAoKTsKLQkJICBsZW4gPSAwOwotCQl9Ci0JICAgICAgd2hpbGUgKGxlbiA8IDIwKQotCQl7Ci0JCSAgcHJpbnRfc3BhY2UgKCk7Ci0JCSAgKytsZW47Ci0JCX0KLQotCSAgICAgIGlmIChlLT5uYW1lICE9IE5VTEwpCi0JCW1pbmZvICgiJVRcbiIsIGUtPm5hbWUpOwotCSAgICAgIGVsc2UKLQkJbWluZm8gKCIlR1xuIiwgZS0+c2VjdGlvbi0+b3duZXIsIGUtPnNlY3Rpb24sIGUtPnZhbHVlKTsKLQkgICAgfQotCi0gICAgICAgICAgLyogTmVlZCBTRUNfS0VFUCBmb3IgLS1nYy1zZWN0aW9ucyAqLwotCSAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChlLT5zZWN0aW9uKSkKLQkgICAgZS0+c2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0tFRVA7Ci0KLQkgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCSAgICBsYW5nX2FkZF9yZWxvYyAocC0+cmVsb2MsIGhvd3RvLCBlLT5zZWN0aW9uLCBlLT5uYW1lLAotCQkJICAgIGV4cF9pbnRvcCAoZS0+dmFsdWUpKTsKLQkgIGVsc2UKLQkgICAgbGFuZ19hZGRfZGF0YSAoc2l6ZSwgZXhwX3JlbG9wIChlLT5zZWN0aW9uLCBlLT52YWx1ZSkpOwotCX0KLQotICAgICAgbGFuZ19hZGRfZGF0YSAoc2l6ZSwgZXhwX2ludG9wICgwKSk7Ci0gICAgfQotCi0gIHN0YXRfcHRyID0gb2xkOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRjdG9yLmggYi9sZC9sZGN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3M2Y3Ny4uMDAwMDAwMAotLS0gYS9sZC9sZGN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIGxkY3Rvci5oIC0gbGlua2VyIGNvbnN0cnVjdG9yIHN1cHBvcnQKLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRENUT1JfSAotI2RlZmluZSBMRENUT1JfSAotCi0vKiBMaXN0IG9mIHN0YXRlbWVudHMgbmVlZGVkIHRvIGhhbmRsZSBjb25zdHJ1Y3RvcnMgKi8KLWV4dGVybiBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgY29uc3RydWN0b3JfbGlzdDsKLQotLyogV2hldGhlciB0aGUgY29uc3RydWN0b3JzIHNob3VsZCBiZSBzb3J0ZWQuICBOb3RlIHRoYXQgdGhpcyBpcwotICAgZ2xvYmFsIGZvciB0aGUgZW50aXJlIGxpbms7IHdlIGFzc3VtZSB0aGF0IHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUKLSAgIENPTlNUUlVDVE9SUyBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLWV4dGVybiBib29sZWFuIGNvbnN0cnVjdG9yc19zb3J0ZWQ7Ci0KLS8qIFdlIGtlZXAgYSBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgZm9yIGVhY2ggc2V0IHdlIGJ1aWxkLiAgKi8KLQotc3RydWN0IHNldF9pbmZvCi17Ci0gIHN0cnVjdCBzZXRfaW5mbyAqbmV4dDsJCS8qIE5leHQgc2V0LiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7CS8qIEhhc2ggdGFibGUgZW50cnkuICAqLwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7CS8qIFJlbG9jIHRvIHVzZSBmb3IgYW4gZW50cnkuICAqLwotICBzaXplX3QgY291bnQ7CQkJCS8qIE51bWJlciBvZiBlbGVtZW50cy4gICovCi0gIHN0cnVjdCBzZXRfZWxlbWVudCAqZWxlbWVudHM7CQkvKiBFbGVtZW50cyBpbiBzZXQuICAqLwotfTsKLQotc3RydWN0IHNldF9lbGVtZW50Ci17Ci0gIHN0cnVjdCBzZXRfZWxlbWVudCAqbmV4dDsJCS8qIE5leHQgZWxlbWVudC4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7CQkJLyogTmFtZSBpbiBzZXQgKG1heSBiZSBOVUxMKS4gICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwkJCS8qIFNlY3Rpb24gb2YgdmFsdWUgaW4gc2V0LiAgKi8KLSAgYmZkX3ZtYSB2YWx1ZTsJCQkvKiBWYWx1ZSBpbiBzZXQuICAqLwotfTsKLQotLyogVGhlIHNldHMgd2UgaGF2ZSBzZWVuLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCBzZXRfaW5mbyAqc2V0czsKLQotZXh0ZXJuIHZvaWQgbGRjdG9yX2FkZF9zZXRfZW50cnkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsCi0JCQkJCSAgY29uc3QgY2hhciAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1leHRlcm4gdm9pZCBsZGN0b3JfYnVpbGRfc2V0cyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRlbXVsLmMgYi9sZC9sZGVtdWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhMjg5NC4uMDAwMDAwMAotLS0gYS9sZC9sZGVtdWwuYworKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKiBsZGVtdWwuYyAtLSBjbGVhcmluZyBob3VzZSBmb3IgbGQgZW11bGF0aW9uIHN0YXRlcwotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC1saXN0LmgiCi0KLWxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKmxkX2VtdWxhdGlvbjsKLQotdm9pZAotbGRlbXVsX2hsbChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBsZF9lbXVsYXRpb24tPmhsbChuYW1lKTsKLX0KLQotCi12b2lkIGxkZW11bF9zeXNsaWIobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgbGRfZW11bGF0aW9uLT5zeXNsaWIobmFtZSk7Ci19Ci0KLXZvaWQKLWxkZW11bF9hZnRlcl9wYXJzZSgpCi17Ci0gIGxkX2VtdWxhdGlvbi0+YWZ0ZXJfcGFyc2UoKTsKLX0KLQotdm9pZAotbGRlbXVsX2JlZm9yZV9wYXJzZSgpCi17Ci0gIGxkX2VtdWxhdGlvbi0+YmVmb3JlX3BhcnNlKCk7Ci19Ci0KLXZvaWQKLWxkZW11bF9hZnRlcl9vcGVuICgpCi17Ci0gIGxkX2VtdWxhdGlvbi0+YWZ0ZXJfb3BlbiAoKTsKLX0KLQotdm9pZCAKLWxkZW11bF9hZnRlcl9hbGxvY2F0aW9uKCkKLXsKLSAgbGRfZW11bGF0aW9uLT5hZnRlcl9hbGxvY2F0aW9uKCk7Ci19Ci0KLXZvaWQgCi1sZGVtdWxfYmVmb3JlX2FsbG9jYXRpb24oKQotewotICBpZiAobGRfZW11bGF0aW9uLT5iZWZvcmVfYWxsb2NhdGlvbikKLSAgICBsZF9lbXVsYXRpb24tPmJlZm9yZV9hbGxvY2F0aW9uKCk7Ci19Ci0KLQotdm9pZAotbGRlbXVsX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIGxkX2VtdWxhdGlvbi0+c2V0X291dHB1dF9hcmNoKCk7Ci19Ci0KLXZvaWQKLWxkZW11bF9maW5pc2goKQotewotICBpZiAobGRfZW11bGF0aW9uLT5maW5pc2gpCi0gICAgbGRfZW11bGF0aW9uLT5maW5pc2goKTsKLX0KLQotdm9pZAotbGRlbXVsX3NldF9zeW1ib2xzKCkKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+c2V0X3N5bWJvbHMpCi0gICAgbGRfZW11bGF0aW9uLT5zZXRfc3ltYm9scygpOwotfQotCi12b2lkCi1sZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMoKQotewotICBpZiAobGRfZW11bGF0aW9uLT5jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cykKLSAgICBsZF9lbXVsYXRpb24tPmNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKCk7Ci19Ci0KLWNoYXIgKgotbGRlbXVsX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLXsKLSAgcmV0dXJuIGxkX2VtdWxhdGlvbi0+Z2V0X3NjcmlwdChpc2ZpbGUpOwotfQotCi1ib29sZWFuCi1sZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGlmIChsZF9lbXVsYXRpb24tPm9wZW5fZHluYW1pY19hcmNoaXZlKQotICAgIHJldHVybiAoKmxkX2VtdWxhdGlvbi0+b3Blbl9keW5hbWljX2FyY2hpdmUpIChhcmNoLCBzZWFyY2gsIGVudHJ5KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sZWFuCi1sZGVtdWxfcGxhY2Vfb3JwaGFuIChmaWxlLCBzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+cGxhY2Vfb3JwaGFuKQotICAgIHJldHVybiAoKmxkX2VtdWxhdGlvbi0+cGxhY2Vfb3JwaGFuKSAoZmlsZSwgcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotaW50Ci1sZGVtdWxfcGFyc2VfYXJncyAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICAvKiBUcnkgYW5kIHVzZSB0aGUgZW11bGF0aW9uIHBhcnNlciBpZiB0aGVyZSBpcyBvbmUuICovCi0gIGlmIChsZF9lbXVsYXRpb24tPnBhcnNlX2FyZ3MpCi0gICAgewotICAgICAgcmV0dXJuIGxkX2VtdWxhdGlvbi0+cGFyc2VfYXJncyAoYXJnYywgYXJndik7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogTGV0IHRoZSBlbXVsYXRpb24gY29kZSBoYW5kbGUgYW4gdW5yZWNvZ25pemVkIGZpbGUuICAqLwotCi1ib29sZWFuCi1sZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+dW5yZWNvZ25pemVkX2ZpbGUpCi0gICAgcmV0dXJuICgqbGRfZW11bGF0aW9uLT51bnJlY29nbml6ZWRfZmlsZSkgKGVudHJ5KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBMZXQgdGhlIGVtdWxhdGlvbiBjb2RlIGhhbmRsZSBhIHJlY29nbml6ZWQgZmlsZS4gICovCi0KLWJvb2xlYW4KLWxkZW11bF9yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+cmVjb2duaXplZF9maWxlKQotICAgIHJldHVybiAoKmxkX2VtdWxhdGlvbi0+cmVjb2duaXplZF9maWxlKSAoZW50cnkpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWNoYXIgKgotbGRlbXVsX2Nob29zZV90YXJnZXQoKQotewotICByZXR1cm4gbGRfZW11bGF0aW9uLT5jaG9vc2VfdGFyZ2V0KCk7Ci19Ci0KLS8qIFRoZSBkZWZhdWx0IGNob29zZV90YXJnZXQgZnVuY3Rpb24uICAqLwotCi1jaGFyICoKLWxkZW11bF9kZWZhdWx0X3RhcmdldCgpCi17Ci0gIGNoYXIgKmZyb21fb3V0c2lkZSA9IGdldGVudiAoVEFSR0VUX0VOVklST04pOwotICBpZiAoZnJvbV9vdXRzaWRlICE9IChjaGFyICopTlVMTCkKLSAgICByZXR1cm4gZnJvbV9vdXRzaWRlOwotICByZXR1cm4gbGRfZW11bGF0aW9uLT50YXJnZXRfbmFtZTsKLX0KLQotdm9pZCAKLWFmdGVyX3BhcnNlX2RlZmF1bHQoKQotewotCi19Ci0KLXZvaWQKLWFmdGVyX29wZW5fZGVmYXVsdCAoKQotewotfQotCi12b2lkCi1hZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQoKQotewotCi19Ci0KLXZvaWQKLWJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQoKQotewotCi19Ci0KLXZvaWQKLXNldF9vdXRwdXRfYXJjaF9kZWZhdWx0KCkKLXsKLSAgLyogU2V0IHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIGlmIHBvc3NpYmxlICovCi0gIGJmZF9zZXRfYXJjaF9tYWNoKG91dHB1dF9iZmQsCi0JICAgICAgICAgICAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIGxkZmlsZV9vdXRwdXRfbWFjaGluZSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotdm9pZAotc3lzbGliX2RlZmF1bHQoaWdub3JlKQotICAgICBjaGFyICAqaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIGluZm9fbXNnIChfKCIlUyBTWVNMSUIgaWdub3JlZFxuIikpOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLWhsbF9kZWZhdWx0KGlnbm9yZSkKLSAgICAgY2hhciAgKmlnbm9yZSBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbmZvX21zZyAoXygiJVMgSExMIGlnbm9yZWRcbiIpKTsKLX0KLQotbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqbGRfZW11bGF0aW9uc1tdID0geyBFTVVMQVRJT05fTElTVCB9OwotCi12b2lkCi1sZGVtdWxfY2hvb3NlX21vZGUodGFyZ2V0KQotICAgICBjaGFyICp0YXJnZXQ7Ci17Ci0gICAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqKmVwdHIgPSBsZF9lbXVsYXRpb25zOwotICAgIC8qIElnbm9yZSAiZ2xkIiBwcmVmaXguICovCi0gICAgaWYgKHRhcmdldFswXSA9PSAnZycgJiYgdGFyZ2V0WzFdID09ICdsJyAmJiB0YXJnZXRbMl0gPT0gJ2QnKQotCXRhcmdldCArPSAzOwotICAgIGZvciAoOyAqZXB0cjsgZXB0cisrKQotICAgICAgewotCWlmIChzdHJjbXAodGFyZ2V0LCAoKmVwdHIpLT5lbXVsYXRpb25fbmFtZSkgPT0gMCkKLQkgIHsKLQkgICAgbGRfZW11bGF0aW9uID0gKmVwdHI7Ci0JICAgIHJldHVybjsKLQkgIH0KLSAgICAgIH0KLSAgICBlaW5mbyAoXygiJVA6IHVucmVjb2duaXNlZCBlbXVsYXRpb24gbW9kZTogJXNcbiIpLCB0YXJnZXQpOwotICAgIGVpbmZvIChfKCJTdXBwb3J0ZWQgZW11bGF0aW9uczogIikpOwotICAgIGxkZW11bF9saXN0X2VtdWxhdGlvbnMgKHN0ZGVycik7Ci0gICAgZWluZm8gKCIlRlxuIik7Ci19Ci0KLXZvaWQKLWxkZW11bF9saXN0X2VtdWxhdGlvbnMgKGYpCi0gICAgIEZJTEUgKmY7Ci17Ci0gIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKiplcHRyID0gbGRfZW11bGF0aW9uczsKLSAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0KLSAgZm9yICg7ICplcHRyOyBlcHRyKyspCi0gICAgewotICAgICAgaWYgKGZpcnN0KQotCWZpcnN0ID0gZmFsc2U7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoZiwgIiAiKTsKLSAgICAgIGZwcmludGYgKGYsICIlcyIsICgqZXB0ciktPmVtdWxhdGlvbl9uYW1lKTsKLSAgICB9Ci19Ci0KLXZvaWQKLWxkZW11bF9saXN0X2VtdWxhdGlvbl9vcHRpb25zIChmKQotICAgICBGSUxFICogZjsKLXsKLSAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqKiBlcHRyOwotICBpbnQgb3B0aW9uc19mb3VuZCA9IDA7Ci0gIAotICBmb3IgKGVwdHIgPSBsZF9lbXVsYXRpb25zOyAqIGVwdHI7IGVwdHIgKyspCi0gICAgewotICAgICAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqIGVtdWwgPSAqIGVwdHI7Ci0gICAgICAKLSAgICAgIGlmIChlbXVsLT5saXN0X29wdGlvbnMpCi0JewotCSAgZnByaW50ZiAoZiwgIiVzOiBcbiIsIGVtdWwtPmVtdWxhdGlvbl9uYW1lKTsKLSAgICAgIAotCSAgZW11bC0+bGlzdF9vcHRpb25zIChmKTsKLQotCSAgb3B0aW9uc19mb3VuZCA9IDE7Ci0JfQotICAgIH0KLSAgCi0gIGlmICghIG9wdGlvbnNfZm91bmQpCi0gICAgZnByaW50ZiAoZiwgXygiICBubyBlbXVsYXRpb24gc3BlY2lmaWMgb3B0aW9ucy5cbiIpKTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkZW11bC5oIGIvbGQvbGRlbXVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MGRlMDYuLjAwMDAwMDAKLS0tIGEvbGQvbGRlbXVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyogbGQtZW11bC5oIC0gTGlua2VyIGVtdWxhdGlvbiBoZWFkZXIgZmlsZQotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAqLwotCi0jaWZuZGVmIExERU1VTF9ICi0jZGVmaW5lIExERU1VTF9ICi0KLSNpZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3Q7Ci1zdHJ1Y3Qgc2VhcmNoX2RpcnM7Ci0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgbGRlbXVsX2hsbCBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiB2b2lkIGxkZW11bF9zeXNsaWIgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfYWZ0ZXJfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX3NldF9vdXRwdXRfYXJjaCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gY2hhciAqbGRlbXVsX2Nob29zZV90YXJnZXQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2Nob29zZV9tb2RlIFBBUkFNUyAoKGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2xpc3RfZW11bGF0aW9ucyBQQVJBTVMgKChGSUxFICopKTsKLWV4dGVybiB2b2lkIGxkZW11bF9saXN0X2VtdWxhdGlvbl9vcHRpb25zIFBBUkFNUyAoKEZJTEUgKikpOwotZXh0ZXJuIGNoYXIgKmxkZW11bF9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9zZXRfc3ltYm9scyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGJvb2xlYW4gbGRlbXVsX3BsYWNlX29ycGhhbgotICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBpbnQgbGRlbXVsX3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1leHRlcm4gYm9vbGVhbiBsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGUKLSAgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBsZGVtdWxfcmVjb2duaXplZF9maWxlCi0gIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotZXh0ZXJuIGJvb2xlYW4gbGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IHNlYXJjaF9kaXJzICosCi0JICAgc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqKSk7Ci1leHRlcm4gY2hhciAqbGRlbXVsX2RlZmF1bHRfdGFyZ2V0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGFmdGVyX3BhcnNlX2RlZmF1bHQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgYWZ0ZXJfb3Blbl9kZWZhdWx0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHN5c2xpYl9kZWZhdWx0IFBBUkFNUyAoKGNoYXIqKSk7Ci1leHRlcm4gdm9pZCBobGxfZGVmYXVsdCBQQVJBTVMgKChjaGFyKikpOwotCi10eXBlZGVmIHN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QKLXsKLSAgLyogUnVuIGJlZm9yZSBwYXJzaW5nIHRoZSBjb21tYW5kIGxpbmUgYW5kIHNjcmlwdCBmaWxlLgotICAgICBTZXQgdGhlIGFyY2hpdGVjdHVyZSwgbWF5YmUgb3RoZXIgdGhpbmdzLiAgKi8KLSAgdm9pZCAgICgqYmVmb3JlX3BhcnNlKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogSGFuZGxlIHRoZSBTWVNMSUIgKGxvdyBsZXZlbCBsaWJyYXJ5KSBzY3JpcHQgY29tbWFuZC4gICovCi0gIHZvaWQgICAoKnN5c2xpYikgUEFSQU1TICgoY2hhciAqKSk7Ci0KLSAgLyogSGFuZGxlIHRoZSBITEwgKGhpZ2ggbGV2ZWwgbGlicmFyeSkgc2NyaXB0IGNvbW1hbmQuICAqLwotICB2b2lkICAgKCpobGwpIFBBUkFNUyAoKGNoYXIgKikpOwotCi0gIC8qIFJ1biBhZnRlciBwYXJzaW5nIHRoZSBjb21tYW5kIGxpbmUgYW5kIHNjcmlwdCBmaWxlLiAgKi8KLSAgdm9pZCAgICgqYWZ0ZXJfcGFyc2UpIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBSdW4gYWZ0ZXIgb3BlbmluZyBhbGwgaW5wdXQgZmlsZXMsIGFuZCBsb2FkaW5nIHRoZSBzeW1ib2xzLiAgKi8KLSAgdm9pZCAgICgqYWZ0ZXJfb3BlbikgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIFJ1biBhZnRlciBhbGxvY2F0aW5nIG91dHB1dCBzZWN0aW9ucy4gICovCi0gIHZvaWQgICAoKmFmdGVyX2FsbG9jYXRpb24pIFBBUkFNUyAoICh2b2lkKSk7Ci0KLSAgLyogU2V0IHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIGlmIHBvc3NpYmxlLiAgKi8KLSAgdm9pZCAgICgqc2V0X291dHB1dF9hcmNoKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogRGVjaWRlIHdoaWNoIHRhcmdldCBuYW1lIHRvIHVzZS4gICovCi0gIGNoYXIgKiAoKmNob29zZV90YXJnZXQpIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBSdW4gYmVmb3JlIGFsbG9jYXRpbmcgb3V0cHV0IHNlY3Rpb25zLiAgKi8KLSAgdm9pZCAgICgqYmVmb3JlX2FsbG9jYXRpb24pIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGxpbmtlciBzY3JpcHQuICAqLwotICBjaGFyICogKCpnZXRfc2NyaXB0KSBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi0gIC8qIFRoZSBuYW1lIG9mIHRoaXMgZW11bGF0aW9uLiAgKi8KLSAgY2hhciAqZW11bGF0aW9uX25hbWU7Ci0KLSAgLyogVGhlIG91dHB1dCBmb3JtYXQuICAqLwotICBjaGFyICp0YXJnZXRfbmFtZTsKLQotICAvKiBSdW4gYWZ0ZXIgYXNzaWduaW5nIHZhbHVlcyBmcm9tIHRoZSBzY3JpcHQuICAqLwotICB2b2lkCSgqZmluaXNoKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogQ3JlYXRlIGFueSBvdXRwdXQgc2VjdGlvbnMgbmVlZGVkIGJ5IHRoZSB0YXJnZXQuICAqLwotICB2b2lkCSgqY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBUcnkgdG8gb3BlbiBhIGR5bmFtaWMgbGlicmFyeS4gIEFSQ0ggaXMgYW4gYXJjaGl0ZWN0dXJlIG5hbWUsIGFuZAotICAgICBpcyBub3JtYWxseSB0aGUgZW1wdHkgc3RyaW5nLiAgRU5UUlkgaXMgdGhlIGxhbmdfaW5wdXRfc3RhdGVtZW50Ci0gICAgIHRoYXQgc2hvdWxkIGJlIG9wZW5lZC4gICovCi0gIGJvb2xlYW4gKCpvcGVuX2R5bmFtaWNfYXJjaGl2ZSkKLSAgICBQQVJBTVMgKChjb25zdCBjaGFyICphcmNoLCBzdHJ1Y3Qgc2VhcmNoX2RpcnMgKiwKLQkgICAgIHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKmVudHJ5KSk7Ci0KLSAgLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uICBSZXR1cm4gdHJ1ZSBpZiBpdCB3YXMgcGxhY2VkLCBmYWxzZSBpZgotICAgICB0aGUgZGVmYXVsdCBhY3Rpb24gc2hvdWxkIGJlIHRha2VuLiAgVGhpcyBmaWVsZCBtYXkgYmUgTlVMTCwgaW4KLSAgICAgd2hpY2ggY2FzZSB0aGUgZGVmYXVsdCBhY3Rpb24gd2lsbCBhbHdheXMgYmUgdGFrZW4uICAqLwotICBib29sZWFuICgqcGxhY2Vfb3JwaGFuKQotICAgIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKiwgYXNlY3Rpb24gKikpOwotCi0gIC8qIFJ1biBhZnRlciBhc3NpZ25pbmcgcGFyc2luZyB3aXRoIHRoZSBhcmdzLCBidXQgYmVmb3JlIAotICAgICByZWFkaW5nIHRoZSBzY3JpcHQuICBVc2VkIHRvIGluaXRpYWxpemUgc3ltYm9scyB1c2VkIGluIHRoZSBzY3JpcHQuICovCi0gIHZvaWQJKCpzZXRfc3ltYm9scykgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIFJ1biB0byBwYXJzZSBhcmdzIHdoaWNoIHRoZSBiYXNlIGxpbmtlciBkb2Vzbid0Ci0gICAgIHVuZGVyc3RhbmQuIFJldHVybiBub24gemVybyBvbiBzdWNlc3MuICovCi0gIGludCAoKnBhcnNlX2FyZ3MpIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotCi0gIC8qIFJ1biB0byBoYW5kbGUgZmlsZXMgd2hpY2ggYXJlIG5vdCByZWNvZ25pemVkIGFzIG9iamVjdCBmaWxlcyBvcgotICAgICBhcmNoaXZlcy4gIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHdhcyBoYW5kbGVkLiAgKi8KLSAgYm9vbGVhbiAoKnVucmVjb2duaXplZF9maWxlKQotICAgIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotCi0gIC8qIFJ1biB0byBsaXN0IHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyB3aGljaCBwYXJzZV9hcmdzIGhhbmRsZXMuICAqLwotICB2b2lkICgqIGxpc3Rfb3B0aW9ucykgUEFSQU1TICgoRklMRSAqKSk7Ci0KLSAgLyogUnVuIHRvIHNwZWNpYWxseSBoYW5kbGUgZmlsZXMgd2hpY2ggKmFyZSogcmVjb2duaXplZCBhcyBvYmplY3QKLSAgICAgZmlsZXMgb3IgYXJjaGl2ZXMuICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgaGFuZGxlZC4gICovCi0gIGJvb2xlYW4gKCpyZWNvZ25pemVkX2ZpbGUpCi0gICAgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqKSk7Ci0KLX0gbGRfZW11bGF0aW9uX3hmZXJfdHlwZTsKLQotdHlwZWRlZiBlbnVtIAotewotICBpbnRlbF9pYzk2MF9sZF9tb2RlX2VudW0sCi0gIGRlZmF1bHRfbW9kZV9lbnVtICwKLSAgaW50ZWxfZ2xkOTYwX2xkX21vZGVfZW51bQotfSBsYW5nX2VtdWxhdGlvbl9tb2RlX2VudW1fdHlwZTsKLQotZXh0ZXJuIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKmxkX2VtdWxhdGlvbnNbXTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZGV4cC5jIGIvbGQvbGRleHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIxZWQ4OC4uMDAwMDAwMAotLS0gYS9sZC9sZGV4cC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTg2ICswLDAgQEAKLS8qIFRoaXMgbW9kdWxlIGhhbmRsZXMgZXhwcmVzc2lvbiB0cmVlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCAoc2FjQGN5Z251cy5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotVGhpcyBtb2R1bGUgaXMgaW4gY2hhcmdlIG9mIHdvcmtpbmcgb3V0IHRoZSBjb250ZW50cyBvZiBleHByZXNzaW9ucy4KLQotSXQgaGFzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHJlbGF0aXZlL2Fic25lc3Mgb2YgYSBzeW1ib2wgZXRjLiBUaGlzIGlzCi1kb25lIGJ5IGtlZXBpbmcgYWxsIHZhbHVlcyBpbiBhIHN0cnVjdCAoYW4gZXRyZWVfdmFsdWVfdHlwZSkgd2hpY2gKLWNvbnRhaW5zIGEgdmFsdWUsIGEgc2VjdGlvbiB0byB3aGljaCBpdCBpcyByZWxhdGl2ZSBhbmQgYSB2YWxpZCBiaXQuCi0KLSovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLQotc3RhdGljIHZvaWQgZXhwX3ByaW50X3Rva2VuIFBBUkFNUyAoKHRva2VuX2NvZGVfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBtYWtlX2FicyBQQVJBTVMgKChldHJlZV92YWx1ZV90eXBlICpwdHIpKTsKLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIG5ld19hYnMgUEFSQU1TICgoYmZkX3ZtYSB2YWx1ZSkpOwotc3RhdGljIHZvaWQgY2hlY2sgUEFSQU1TICgobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MsCi0JCQkgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpvcCkpOwotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgbmV3X3JlbAotICBQQVJBTVMgKChiZmRfdm1hIHZhbHVlLCBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpzZWN0aW9uKSk7Ci1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSBuZXdfcmVsX2Zyb21fc2VjdGlvbgotICBQQVJBTVMgKChiZmRfdm1hIHZhbHVlLCBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpzZWN0aW9uKSk7Ci1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSBmb2xkX2JpbmFyeQotICBQQVJBTVMgKChldHJlZV90eXBlICp0cmVlLAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbiwKLQkgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lLAotCSAgIGJmZF92bWEgZG90LCBiZmRfdm1hICpkb3RwKSk7Ci1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSBmb2xkX25hbWUKLSAgUEFSQU1TICgoZXRyZWVfdHlwZSAqdHJlZSwKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb24sCi0JICAgbGFuZ19waGFzZV90eXBlIGFsbG9jYXRpb25fZG9uZSwKLQkgICBiZmRfdm1hIGRvdCkpOwotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgZXhwX2ZvbGRfdHJlZV9ub19kb3QKLSAgUEFSQU1TICgoZXRyZWVfdHlwZSAqdHJlZSwKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb24sCi0JICAgbGFuZ19waGFzZV90eXBlIGFsbG9jYXRpb25fZG9uZSkpOwotCi1zdGF0aWMgdm9pZAotZXhwX3ByaW50X3Rva2VuIChjb2RlKQotICAgICB0b2tlbl9jb2RlX3R5cGUgY29kZTsKLXsKLSAgc3RhdGljIENPTlNUIHN0cnVjdAotICAgIHsKLSAgICAgIHRva2VuX2NvZGVfdHlwZSBjb2RlOwotICAgICAgY2hhciAqbmFtZTsKLSAgICB9IHRhYmxlW10gPQotICAgICAgewotCXsgSU5ULAkiaW50IiB9LAotCXsgUkVMLCAicmVsb2NhdGVhYmxlIiB9LAotCXsgTkFNRSwiTkFNRSIgfSwKLQl7IFBMVVNFUSwiKz0iIH0sCi0JeyBNSU5VU0VRLCItPSIgfSwKLQl7IE1VTFRFUSwiKj0iIH0sCi0JeyBESVZFUSwiLz0iIH0sCi0JeyBMU0hJRlRFUSwiPDw9IiB9LAotCXsgUlNISUZURVEsIj4+PSIgfSwKLQl7IEFOREVRLCImPSIgfSwKLQl7IE9SRVEsInw9IiB9LAotCXsgT1JPUiwifHwiIH0sCi0JeyBBTkRBTkQsIiYmIiB9LAotCXsgRVEsIj09IiB9LAotCXsgTkUsIiE9IiB9LAotCXsgTEUsIjw9IiB9LAotCXsgR0UsIj49IiB9LAotCXsgTFNISUZULCI8PCIgfSwKLQl7IFJTSElGVCwiPj49IiB9LAotCXsgQUxJR05fSywiQUxJR04iIH0sCi0JeyBCTE9DSywiQkxPQ0siIH0sCi0JeyBTRUNUSU9OUywiU0VDVElPTlMiIH0sCi0JeyBTSVpFT0ZfSEVBREVSUywiU0laRU9GX0hFQURFUlMiIH0sCi0JeyBORVhULCJORVhUIiB9LAotCXsgU0laRU9GLCJTSVpFT0YiIH0sCi0JeyBBRERSLCJBRERSIiB9LAotCXsgTE9BREFERFIsIkxPQURBRERSIiB9LAotCXsgTUVNT1JZLCJNRU1PUlkiIH0sCi0JeyBERUZJTkVELCJERUZJTkVEIiB9LAotCXsgVEFSR0VUX0ssIlRBUkdFVCIgfSwKLQl7IFNFQVJDSF9ESVIsIlNFQVJDSF9ESVIiIH0sCi0JeyBNQVAsIk1BUCIgfSwKLQl7IFFVQUQsIlFVQUQiIH0sCi0JeyBTUVVBRCwiU1FVQUQiIH0sCi0JeyBMT05HLCJMT05HIiB9LAotCXsgU0hPUlQsIlNIT1JUIiB9LAotCXsgQllURSwiQllURSIgfSwKLQl7IEVOVFJZLCJFTlRSWSIgfSwKLQl7IDAsKGNoYXIgKilOVUxMIH0KLSAgICAgIH07Ci0gIHVuc2lnbmVkIGludCBpZHg7Ci0KLSAgZm9yIChpZHggPSAwOyB0YWJsZVtpZHhdLm5hbWUgIT0gKGNoYXIqKU5VTEw7IGlkeCsrKSB7Ci0gICAgaWYgKHRhYmxlW2lkeF0uY29kZSA9PSBjb2RlKSB7Ci0gICAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwgIiVzIiwgdGFibGVbaWR4XS5uYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgLyogTm90IGluIHRhYmxlLCBqdXN0IHByaW50IGl0IGFsb25lICovCi0gIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCAiJWMiLGNvZGUpOwotfQotCi1zdGF0aWMgdm9pZCAKLW1ha2VfYWJzIChwdHIpCi0gICAgIGV0cmVlX3ZhbHVlX3R5cGUgKnB0cjsKLXsKLSAgICBhc2VjdGlvbiAqcyA9IHB0ci0+c2VjdGlvbi0+YmZkX3NlY3Rpb247Ci0gICAgcHRyLT52YWx1ZSArPSBzLT52bWE7Ci0gICAgcHRyLT5zZWN0aW9uID0gYWJzX291dHB1dF9zZWN0aW9uOwotfQotCi1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZQotbmV3X2FicyAodmFsdWUpCi0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgbmV3OwotICBuZXcudmFsaWRfcCA9IHRydWU7Ci0gIG5ldy5zZWN0aW9uID0gYWJzX291dHB1dF9zZWN0aW9uOwotICBuZXcudmFsdWUgPSB2YWx1ZTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIHZvaWQgCi1jaGVjayAob3MsIG5hbWUsIG9wKQotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqb3A7Ci17Ci0gIGlmIChvcyA9PSBOVUxMKQotICAgIGVpbmZvIChfKCIlRiVQOiAlcyB1c2VzIHVuZGVmaW5lZCBzZWN0aW9uICVzXG4iKSwgb3AsIG5hbWUpOwotICBpZiAoISBvcy0+cHJvY2Vzc2VkKQotICAgIGVpbmZvIChfKCIlRiVQOiAlcyBmb3J3YXJkIHJlZmVyZW5jZSBvZiBzZWN0aW9uICVzXG4iKSwgb3AsIG5hbWUpOwotfQotCi1ldHJlZV90eXBlICoKLWV4cF9pbnRvcCAodmFsdWUpCi0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGV0cmVlX3R5cGUgKm5ldyA9IChldHJlZV90eXBlICopIHN0YXRfYWxsb2Moc2l6ZW9mKG5ldy0+dmFsdWUpKTsKLSAgbmV3LT50eXBlLm5vZGVfY29kZSA9IElOVDsKLSAgbmV3LT52YWx1ZS52YWx1ZSA9IHZhbHVlOwotICBuZXctPnR5cGUubm9kZV9jbGFzcyA9IGV0cmVlX3ZhbHVlOwotICByZXR1cm4gbmV3OwotCi19Ci0KLS8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGFuIHVubmFtZWQgcmVsb2NhdGVhYmxlIHZhbHVlLiAgKi8KLQotZXRyZWVfdHlwZSAqCi1leHBfcmVsb3AgKHNlY3Rpb24sIHZhbHVlKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgZXRyZWVfdHlwZSAqbmV3ID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuZXctPnJlbCkpOwotICBuZXctPnR5cGUubm9kZV9jb2RlID0gUkVMOwotICBuZXctPnR5cGUubm9kZV9jbGFzcyA9IGV0cmVlX3JlbDsKLSAgbmV3LT5yZWwuc2VjdGlvbiA9IHNlY3Rpb247Ci0gIG5ldy0+cmVsLnZhbHVlID0gdmFsdWU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlCi1uZXdfcmVsICh2YWx1ZSwgc2VjdGlvbikKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqc2VjdGlvbjsKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSBuZXc7Ci0gIG5ldy52YWxpZF9wID0gdHJ1ZTsKLSAgbmV3LnZhbHVlID0gdmFsdWU7Ci0gIG5ldy5zZWN0aW9uID0gc2VjdGlvbjsKLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUKLW5ld19yZWxfZnJvbV9zZWN0aW9uICh2YWx1ZSwgc2VjdGlvbikKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqc2VjdGlvbjsKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSBuZXc7Ci0gIG5ldy52YWxpZF9wID0gdHJ1ZTsKLSAgbmV3LnZhbHVlID0gdmFsdWU7Ci0gIG5ldy5zZWN0aW9uID0gc2VjdGlvbjsKLQotICAgIG5ldy52YWx1ZSAtPSBzZWN0aW9uLT5iZmRfc2VjdGlvbi0+dm1hOwotCi0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIAotZm9sZF9iaW5hcnkgKHRyZWUsIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lLCBkb3QsIGRvdHApCi0gICAgIGV0cmVlX3R5cGUgKnRyZWU7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbjsKLSAgICAgbGFuZ19waGFzZV90eXBlIGFsbG9jYXRpb25fZG9uZTsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci0gICAgIGJmZF92bWEgKmRvdHA7Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcmVzdWx0OwotCi0gIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWUgKHRyZWUtPmJpbmFyeS5saHMsIGN1cnJlbnRfc2VjdGlvbiwKLQkJCSAgYWxsb2NhdGlvbl9kb25lLCBkb3QsIGRvdHApOwotICBpZiAocmVzdWx0LnZhbGlkX3ApCi0gICAgewotICAgICAgZXRyZWVfdmFsdWVfdHlwZSBvdGhlcjsKLQotICAgICAgb3RoZXIgPSBleHBfZm9sZF90cmVlICh0cmVlLT5iaW5hcnkucmhzLAotCQkJICAgICBjdXJyZW50X3NlY3Rpb24sCi0JCQkgICAgIGFsbG9jYXRpb25fZG9uZSwgZG90LGRvdHApIDsKLSAgICAgIGlmIChvdGhlci52YWxpZF9wKQotCXsKLQkgIC8qIElmIHRoZSB2YWx1ZXMgYXJlIGZyb20gZGlmZmVyZW50IHNlY3Rpb25zLCBvciB0aGlzIGlzIGFuCi0JICAgICBhYnNvbHV0ZSBleHByZXNzaW9uLCBtYWtlIGJvdGggdGhlIHNvdXJjZSBhcmd1bWVudHMKLQkgICAgIGFic29sdXRlLiAgSG93ZXZlciwgYWRkaW5nIG9yIHN1YnRyYWN0aW5nIGFuIGFic29sdXRlCi0JICAgICB2YWx1ZSBmcm9tIGEgcmVsYXRpdmUgdmFsdWUgaXMgbWVhbmluZ2Z1bCwgYW5kIGlzIGFuCi0JICAgICBleGNlcHRpb24uICAqLwotCSAgaWYgKGN1cnJlbnRfc2VjdGlvbiAhPSBhYnNfb3V0cHV0X3NlY3Rpb24KLQkgICAgICAmJiAob3RoZXIuc2VjdGlvbiA9PSBhYnNfb3V0cHV0X3NlY3Rpb24KLQkJICB8fCAocmVzdWx0LnNlY3Rpb24gPT0gYWJzX291dHB1dF9zZWN0aW9uCi0JCSAgICAgICYmIHRyZWUtPnR5cGUubm9kZV9jb2RlID09ICcrJykpCi0JICAgICAgJiYgKHRyZWUtPnR5cGUubm9kZV9jb2RlID09ICcrJwotCQkgIHx8IHRyZWUtPnR5cGUubm9kZV9jb2RlID09ICctJykpCi0JICAgIHsKLQkgICAgICBldHJlZV92YWx1ZV90eXBlIGhvbGQ7Ci0KLQkgICAgICAvKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSBhYnNvbHV0ZSB0ZXJtLCBtYWtlIHN1cmUgaXQgaXMgdGhlCi0JCSBzZWNvbmQgb25lLiAgKi8KLQkgICAgICBpZiAob3RoZXIuc2VjdGlvbiAhPSBhYnNfb3V0cHV0X3NlY3Rpb24pCi0JCXsKLQkJICBob2xkID0gcmVzdWx0OwotCQkgIHJlc3VsdCA9IG90aGVyOwotCQkgIG90aGVyID0gaG9sZDsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChyZXN1bHQuc2VjdGlvbiAhPSBvdGhlci5zZWN0aW9uCi0JCSAgIHx8IGN1cnJlbnRfc2VjdGlvbiA9PSBhYnNfb3V0cHV0X3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBtYWtlX2FicygmcmVzdWx0KTsKLQkgICAgICBtYWtlX2Ficygmb3RoZXIpOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAodHJlZS0+dHlwZS5ub2RlX2NvZGUpIAotCSAgICB7Ci0JICAgIGNhc2UgJyUnOgotCSAgICAgIGlmIChvdGhlci52YWx1ZSA9PSAwKQotCQllaW5mbyAoXygiJUYlUyAlJSBieSB6ZXJvXG4iKSk7Ci0JICAgICAgcmVzdWx0LnZhbHVlID0gKChiZmRfc2lnbmVkX3ZtYSkgcmVzdWx0LnZhbHVlCi0JCQkgICAgICAlIChiZmRfc2lnbmVkX3ZtYSkgb3RoZXIudmFsdWUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJy8nOgotCSAgICAgIGlmIChvdGhlci52YWx1ZSA9PSAwKQotCQllaW5mbyAoXygiJUYlUyAvIGJ5IHplcm9cbiIpKTsKLQkgICAgICByZXN1bHQudmFsdWUgPSAoKGJmZF9zaWduZWRfdm1hKSByZXN1bHQudmFsdWUKLQkJCSAgICAgIC8gKGJmZF9zaWduZWRfdm1hKSBvdGhlci52YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0KLSNkZWZpbmUgQk9QKHgseSkgY2FzZSB4IDogcmVzdWx0LnZhbHVlID0gcmVzdWx0LnZhbHVlIHkgb3RoZXIudmFsdWU7IGJyZWFrOwotCSAgICAgIEJPUCgnKycsKyk7Ci0JICAgICAgQk9QKCcqJywqKTsKLQkgICAgICBCT1AoJy0nLC0pOwotCSAgICAgIEJPUChMU0hJRlQsPDwpOwotCSAgICAgIEJPUChSU0hJRlQsPj4pOwotCSAgICAgIEJPUChFUSw9PSk7Ci0JICAgICAgQk9QKE5FLCE9KTsKLQkgICAgICBCT1AoJzwnLDwpOwotCSAgICAgIEJPUCgnPicsPik7Ci0JICAgICAgQk9QKExFLDw9KTsKLQkgICAgICBCT1AoR0UsPj0pOwotCSAgICAgIEJPUCgnJicsJik7Ci0JICAgICAgQk9QKCdeJyxeKTsKLQkgICAgICBCT1AoJ3wnLHwpOwotCSAgICAgIEJPUChBTkRBTkQsJiYpOwotCSAgICAgIEJPUChPUk9SLHx8KTsKLQotCSAgICBjYXNlIE1BWF9LOgotCSAgICAgIGlmIChyZXN1bHQudmFsdWUgPCBvdGhlci52YWx1ZSkKLQkJcmVzdWx0ID0gb3RoZXI7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBNSU5fSzoKLQkgICAgICBpZiAocmVzdWx0LnZhbHVlID4gb3RoZXIudmFsdWUpCi0JCXJlc3VsdCA9IG90aGVyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgRkFJTCgpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1ldHJlZV92YWx1ZV90eXBlIAotaW52YWxpZCAoKQotewotICBldHJlZV92YWx1ZV90eXBlIG5ldzsKLSAgbmV3LnZhbGlkX3AgPSBmYWxzZTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgCi1mb2xkX25hbWUgKHRyZWUsIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lLCBkb3QpCi0gICAgIGV0cmVlX3R5cGUgKnRyZWU7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbjsKLSAgICAgbGFuZ19waGFzZV90eXBlICBhbGxvY2F0aW9uX2RvbmU7Ci0gICAgIGJmZF92bWEgZG90OwotewotICBldHJlZV92YWx1ZV90eXBlIHJlc3VsdDsKLSAgc3dpdGNoICh0cmVlLT50eXBlLm5vZGVfY29kZSkgCi0gICAgICB7Ci0gICAgICBjYXNlIFNJWkVPRl9IRUFERVJTOgotCWlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKSAKLQkgIHsKLQkgICAgcmVzdWx0ID0gbmV3X2FicyAoKGJmZF92bWEpCi0JCQkgICAgICBiZmRfc2l6ZW9mX2hlYWRlcnMgKG91dHB1dF9iZmQsCi0JCQkJCQkgIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICBjYXNlIERFRklORUQ6Ci0JaWYgKGFsbG9jYXRpb25fZG9uZSA9PSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pCi0JICByZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotCWVsc2UKLQkgIHsKLQkgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sCi0JCQkJCSAgICAgIHRyZWUtPm5hbWUubmFtZSwKLQkJCQkJICAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkgICAgcmVzdWx0LnZhbHVlID0gKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJCSAgICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCQl8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkJCXx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pKTsKLQkgICAgcmVzdWx0LnNlY3Rpb24gPSAwOwotCSAgICByZXN1bHQudmFsaWRfcCA9IHRydWU7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE5BTUU6Ci0JcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKLQlpZiAodHJlZS0+bmFtZS5uYW1lWzBdID09ICcuJyAmJiB0cmVlLT5uYW1lLm5hbWVbMV0gPT0gMCkKLQkgIHsKLQkgICAgaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pCi0JICAgICAgcmVzdWx0ID0gbmV3X3JlbF9mcm9tX3NlY3Rpb24oZG90LCBjdXJyZW50X3NlY3Rpb24pOwotCSAgICBlbHNlCi0JICAgICAgcmVzdWx0ID0gaW52YWxpZCgpOwotCSAgfQotCWVsc2UgaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pCi0JICB7Ci0JICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLAotCQkJCQkgICAgICB0cmVlLT5uYW1lLm5hbWUsCi0JCQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JICAgIGlmIChoICE9IE5VTEwKLQkJJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JICAgICAgewotCQlpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT51LmRlZi5zZWN0aW9uKSkKLQkJICByZXN1bHQgPSBuZXdfYWJzIChoLT51LmRlZi52YWx1ZSk7Ci0JCWVsc2UgaWYgKGFsbG9jYXRpb25fZG9uZSA9PSBsYW5nX2ZpbmFsX3BoYXNlX2VudW0KLQkJCSB8fCBhbGxvY2F0aW9uX2RvbmUgPT0gbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0pCi0JCSAgewotCQkgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCi0JCSAgICBvdXRwdXRfc2VjdGlvbiA9IGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCQkgICAgaWYgKG91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCSAgICAgIGVpbmZvIChfKCIlWCVTOiB1bnJlc29sdmFibGUgc3ltYm9sIGAlcycgcmVmZXJlbmNlZCBpbiBleHByZXNzaW9uXG4iKSwKLQkJCSAgICAgdHJlZS0+bmFtZS5uYW1lKTsKLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLQkJCW9zID0gKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cAotCQkJICAgICAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkJICAgICBvdXRwdXRfc2VjdGlvbikpKTsKLQotCQkJLyogRklYTUU6IElzIHRoaXMgY29ycmVjdCBpZiB0aGlzIHNlY3Rpb24gaXMKLQkJCSAgIGJlaW5nIGxpbmtlZCB3aXRoIC1SPyAgKi8KLQkJCXJlc3VsdCA9IG5ld19yZWwgKChoLT51LmRlZi52YWx1ZQotCQkJCQkgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpLAotCQkJCQkgIG9zKTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKGFsbG9jYXRpb25fZG9uZSA9PSBsYW5nX2ZpbmFsX3BoYXNlX2VudW0pCi0JICAgICAgZWluZm8gKF8oIiVGJVM6IHVuZGVmaW5lZCBzeW1ib2wgYCVzJyByZWZlcmVuY2VkIGluIGV4cHJlc3Npb25cbiIpLAotCQkgICAgIHRyZWUtPm5hbWUubmFtZSk7Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUREUjoKLQlpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkKLQkgIHsKLQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLQkgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKHRyZWUtPm5hbWUubmFtZSk7Ci0JICAgIGNoZWNrIChvcywgdHJlZS0+bmFtZS5uYW1lLCAiQUREUiIpOwotCSAgICByZXN1bHQgPSBuZXdfcmVsICgwLCBvcyk7Ci0JICB9Ci0JZWxzZQotCSAgcmVzdWx0ID0gaW52YWxpZCAoKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBMT0FEQUREUjoKLQlpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkKLQkgIHsKLQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLQkgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKHRyZWUtPm5hbWUubmFtZSk7Ci0JICAgIGNoZWNrIChvcywgdHJlZS0+bmFtZS5uYW1lLCAiTE9BREFERFIiKTsKLQkgICAgaWYgKG9zLT5sb2FkX2Jhc2UgPT0gTlVMTCkKLQkgICAgICByZXN1bHQgPSBuZXdfcmVsICgwLCBvcyk7Ci0JICAgIGVsc2UKLQkgICAgICByZXN1bHQgPSBleHBfZm9sZF90cmVlX25vX2RvdCAob3MtPmxvYWRfYmFzZSwKLQkJCQkJICAgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgYWxsb2NhdGlvbl9kb25lKTsKLQkgIH0KLQllbHNlCi0JICByZXN1bHQgPSBpbnZhbGlkICgpOwotCWJyZWFrOwotCi0gICAgICBjYXNlIFNJWkVPRjoKLQlpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkKLQkgIHsKLQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLQkgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKHRyZWUtPm5hbWUubmFtZSk7Ci0JICAgIGNoZWNrIChvcywgdHJlZS0+bmFtZS5uYW1lLCAiU0laRU9GIik7Ci0JICAgIHJlc3VsdCA9IG5ld19hYnMgKG9zLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkgIH0KLQllbHNlCi0JICByZXN1bHQgPSBpbnZhbGlkICgpOwotCWJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCUZBSUwoKTsKLQlicmVhazsKLSAgICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotZXRyZWVfdmFsdWVfdHlwZSAKLWV4cF9mb2xkX3RyZWUgKHRyZWUsIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lLCBkb3QsIGRvdHApCi0gICAgIGV0cmVlX3R5cGUgKnRyZWU7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbjsKLSAgICAgbGFuZ19waGFzZV90eXBlICBhbGxvY2F0aW9uX2RvbmU7Ci0gICAgIGJmZF92bWEgZG90OwotICAgICBiZmRfdm1hICpkb3RwOwotewotICBldHJlZV92YWx1ZV90eXBlIHJlc3VsdDsKLQotICBpZiAodHJlZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICBzd2l0Y2ggKHRyZWUtPnR5cGUubm9kZV9jbGFzcykgCi0gICAgewotICAgIGNhc2UgZXRyZWVfdmFsdWU6Ci0gICAgICByZXN1bHQgPSBuZXdfcmVsICh0cmVlLT52YWx1ZS52YWx1ZSwgY3VycmVudF9zZWN0aW9uKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9yZWw6Ci0gICAgICBpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmluYWxfcGhhc2VfZW51bSkKLQlyZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotICAgICAgZWxzZQotCXJlc3VsdCA9IG5ld19yZWwgKCh0cmVlLT5yZWwudmFsdWUKLQkJCSAgICsgdHJlZS0+cmVsLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgdHJlZS0+cmVsLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpLAotCQkJICBjdXJyZW50X3NlY3Rpb24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2Fzc2VydDoKLSAgICAgIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWUgKHRyZWUtPmFzc2VydF9zLmNoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9zZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbl9kb25lLCBkb3QsIGRvdHApOwotICAgICAgaWYgKHJlc3VsdC52YWxpZF9wKQotCXsKLQkgIGlmICghIHJlc3VsdC52YWx1ZSkKLQkgICAgZWluZm8gKCIlRiVQOiAlc1xuIiwgdHJlZS0+YXNzZXJ0X3MubWVzc2FnZSk7Ci0JICByZXR1cm4gcmVzdWx0OwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWUgKHRyZWUtPnVuYXJ5LmNoaWxkLAotCQkJICAgICAgY3VycmVudF9zZWN0aW9uLAotCQkJICAgICAgYWxsb2NhdGlvbl9kb25lLCBkb3QsIGRvdHApOwotICAgICAgaWYgKHJlc3VsdC52YWxpZF9wKQotCXsKLQkgIHN3aXRjaCAodHJlZS0+dHlwZS5ub2RlX2NvZGUpIAotCSAgICB7Ci0JICAgIGNhc2UgQUxJR05fSzoKLQkgICAgICBpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkKLQkJcmVzdWx0ID0gbmV3X3JlbF9mcm9tX3NlY3Rpb24gKEFMSUdOX04gKGRvdCwgcmVzdWx0LnZhbHVlKSwKLQkJCQkJICAgICAgIGN1cnJlbnRfc2VjdGlvbik7Ci0JICAgICAgZWxzZQotCQlyZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQUJTT0xVVEU6Ci0JICAgICAgaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0gJiYgcmVzdWx0LnZhbGlkX3ApCi0JCXsKLQkJICByZXN1bHQudmFsdWUgKz0gcmVzdWx0LnNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWE7Ci0JCSAgcmVzdWx0LnNlY3Rpb24gPSBhYnNfb3V0cHV0X3NlY3Rpb247Ci0JCX0KLQkgICAgICBlbHNlIAotCQlyZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ34nOgotCSAgICAgIG1ha2VfYWJzICgmcmVzdWx0KTsKLQkgICAgICByZXN1bHQudmFsdWUgPSB+cmVzdWx0LnZhbHVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJyEnOgotCSAgICAgIG1ha2VfYWJzICgmcmVzdWx0KTsKLQkgICAgICByZXN1bHQudmFsdWUgPSAhcmVzdWx0LnZhbHVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJy0nOgotCSAgICAgIG1ha2VfYWJzICgmcmVzdWx0KTsKLQkgICAgICByZXN1bHQudmFsdWUgPSAtcmVzdWx0LnZhbHVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTkVYVDoKLQkgICAgICAvKiBSZXR1cm4gbmV4dCBwbGFjZSBhbGlnbmVkIHRvIHZhbHVlLiAgKi8KLQkgICAgICBpZiAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtKQotCQl7Ci0JCSAgbWFrZV9hYnMgKCZyZXN1bHQpOwotCQkgIHJlc3VsdC52YWx1ZSA9IEFMSUdOX04gKGRvdCwgcmVzdWx0LnZhbHVlKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIEZBSUwgKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICAgIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWUgKHRyZWUtPnRyaW5hcnkuY29uZCwgY3VycmVudF9zZWN0aW9uLAotCQkJICAgICAgYWxsb2NhdGlvbl9kb25lLCBkb3QsIGRvdHApOwotICAgICAgaWYgKHJlc3VsdC52YWxpZF9wKQotCXJlc3VsdCA9IGV4cF9mb2xkX3RyZWUgKChyZXN1bHQudmFsdWUKLQkJCQkgPyB0cmVlLT50cmluYXJ5LmxocwotCQkJCSA6IHRyZWUtPnRyaW5hcnkucmhzKSwKLQkJCQljdXJyZW50X3NlY3Rpb24sCi0JCQkJYWxsb2NhdGlvbl9kb25lLCBkb3QsIGRvdHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICAgIHJlc3VsdCA9IGZvbGRfYmluYXJ5ICh0cmVlLCBjdXJyZW50X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSwKLQkJCSAgICBkb3QsIGRvdHApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSAgICBjYXNlIGV0cmVlX3Byb3ZpZGU6Ci0gICAgICBpZiAodHJlZS0+YXNzaWduLmRzdFswXSA9PSAnLicgJiYgdHJlZS0+YXNzaWduLmRzdFsxXSA9PSAwKQotCXsKLQkgIC8qIEFzc2lnbm1lbnQgdG8gZG90IGNhbiBvbmx5IGJlIGRvbmUgZHVyaW5nIGFsbG9jYXRpb24gKi8KLQkgIGlmICh0cmVlLT50eXBlLm5vZGVfY2xhc3MgPT0gZXRyZWVfcHJvdmlkZSkKLQkgICAgZWluZm8gKF8oIiVGJVMgY2FuIG5vdCBQUk9WSURFIGFzc2lnbm1lbnQgdG8gbG9jYXRpb24gY291bnRlclxuIikpOwotCSAgaWYgKGFsbG9jYXRpb25fZG9uZSA9PSBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bQotCSAgICAgIHx8IChhbGxvY2F0aW9uX2RvbmUgPT0gbGFuZ19maW5hbF9waGFzZV9lbnVtCi0JCSAgJiYgY3VycmVudF9zZWN0aW9uID09IGFic19vdXRwdXRfc2VjdGlvbikpCi0JICAgIHsKLQkgICAgICByZXN1bHQgPSBleHBfZm9sZF90cmVlICh0cmVlLT5hc3NpZ24uc3JjLAotCQkJCSAgICAgIGN1cnJlbnRfc2VjdGlvbiwKLQkJCQkgICAgICBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSwgZG90LAotCQkJCSAgICAgIGRvdHApOwotCSAgICAgIGlmICghIHJlc3VsdC52YWxpZF9wKQotCQllaW5mbyAoXygiJUYlUyBpbnZhbGlkIGFzc2lnbm1lbnQgdG8gbG9jYXRpb24gY291bnRlclxuIikpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChjdXJyZW50X3NlY3Rpb24gPT0gTlVMTCkKLQkJICAgIGVpbmZvIChfKCIlRiVTIGFzc2lnbm1lbnQgdG8gbG9jYXRpb24gY291bnRlciBpbnZhbGlkIG91dHNpZGUgb2YgU0VDVElPTlxuIikpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3ZtYSBuZXh0ZG90OwotCi0JCSAgICAgIG5leHRkb3QgPSAocmVzdWx0LnZhbHVlCi0JCQkJICsgY3VycmVudF9zZWN0aW9uLT5iZmRfc2VjdGlvbi0+dm1hKTsKLQkJICAgICAgaWYgKG5leHRkb3QgPCBkb3QKLQkJCSAgJiYgY3VycmVudF9zZWN0aW9uICE9IGFic19vdXRwdXRfc2VjdGlvbikKLQkJCXsKLQkJCSAgZWluZm8gKF8oIiVGJVMgY2Fubm90IG1vdmUgbG9jYXRpb24gY291bnRlciBiYWNrd2FyZHMgKGZyb20gJVYgdG8gJVYpXG4iKSwKLQkJCQkgZG90LCBuZXh0ZG90KTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJKmRvdHAgPSBuZXh0ZG90OyAKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWUgKHRyZWUtPmFzc2lnbi5zcmMsCi0JCQkJICBjdXJyZW50X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSwKLQkJCQkgIGRvdCwgZG90cCk7Ci0JICBpZiAocmVzdWx0LnZhbGlkX3ApCi0JICAgIHsKLQkgICAgICBib29sZWFuIGNyZWF0ZTsKLQkgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIGlmICh0cmVlLT50eXBlLm5vZGVfY2xhc3MgPT0gZXRyZWVfYXNzaWduKQotCQljcmVhdGUgPSB0cnVlOwotCSAgICAgIGVsc2UKLQkJY3JlYXRlID0gZmFsc2U7Ci0JICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgdHJlZS0+YXNzaWduLmRzdCwKLQkJCQkJY3JlYXRlLCBmYWxzZSwgZmFsc2UpOwotCSAgICAgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCQl7Ci0JCSAgaWYgKHRyZWUtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9hc3NpZ24pCi0JCSAgICBlaW5mbyAoXygiJVAlRjolczogaGFzaCBjcmVhdGlvbiBmYWlsZWRcbiIpLAotCQkJICAgdHJlZS0+YXNzaWduLmRzdCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICh0cmVlLT50eXBlLm5vZGVfY2xhc3MgPT0gZXRyZWVfcHJvdmlkZQotCQkgICAgICAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCQkgICAgICAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkJewotCQkgIC8qIERvIG5vdGhpbmcuICBUaGUgc3ltYm9sIHdhcyBkZWZpbmVkIGJ5IHNvbWUKLQkJICAgICBvYmplY3QuICAqLwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogRklYTUU6IFNob3VsZCB3ZSB3b3JyeSBpZiB0aGUgc3ltYm9sIGlzIGFscmVhZHkKLQkJICAgICBkZWZpbmVkPyAgKi8KLQkJICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCQkgIGgtPnUuZGVmLnZhbHVlID0gcmVzdWx0LnZhbHVlOwotCQkgIGgtPnUuZGVmLnNlY3Rpb24gPSByZXN1bHQuc2VjdGlvbi0+YmZkX3NlY3Rpb247Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9uYW1lOgotICAgICAgcmVzdWx0ID0gZm9sZF9uYW1lICh0cmVlLCBjdXJyZW50X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSwgZG90KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEZBSUwgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgCi1leHBfZm9sZF90cmVlX25vX2RvdCAodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUpCi0gICAgIGV0cmVlX3R5cGUgKnRyZWU7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbjsKLSAgICAgbGFuZ19waGFzZV90eXBlIGFsbG9jYXRpb25fZG9uZTsKLXsKLXJldHVybiBleHBfZm9sZF90cmVlKHRyZWUsIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lLCAoYmZkX3ZtYSkKLQkJICAgICAwLCAoYmZkX3ZtYSAqKU5VTEwpOwotfQotCi1ldHJlZV90eXBlICoKLWV4cF9iaW5vcCAoY29kZSwgbGhzLCByaHMpCi0gICAgIGludCBjb2RlOwotICAgICBldHJlZV90eXBlICpsaHM7Ci0gICAgIGV0cmVlX3R5cGUgKnJoczsKLXsKLSAgZXRyZWVfdHlwZSB2YWx1ZSwgKm5ldzsKLSAgZXRyZWVfdmFsdWVfdHlwZSByOwotCi0gIHZhbHVlLnR5cGUubm9kZV9jb2RlID0gY29kZTsKLSAgdmFsdWUuYmluYXJ5LmxocyA9IGxoczsKLSAgdmFsdWUuYmluYXJ5LnJocyA9IHJoczsKLSAgdmFsdWUudHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfYmluYXJ5OwotICByID0gZXhwX2ZvbGRfdHJlZV9ub19kb3QoJnZhbHVlLAotCQkJICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJICAgbGFuZ19maXJzdF9waGFzZV9lbnVtICk7Ci0gIGlmIChyLnZhbGlkX3ApCi0gICAgewotICAgICAgcmV0dXJuIGV4cF9pbnRvcChyLnZhbHVlKTsKLSAgICB9Ci0gIG5ldyA9IChldHJlZV90eXBlICopIHN0YXRfYWxsb2MgKHNpemVvZiAobmV3LT5iaW5hcnkpKTsKLSAgbWVtY3B5KChjaGFyICopbmV3LCAoY2hhciAqKSZ2YWx1ZSwgc2l6ZW9mKG5ldy0+YmluYXJ5KSk7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLWV0cmVlX3R5cGUgKgotZXhwX3RyaW5vcCAoY29kZSwgY29uZCwgbGhzLCByaHMpCi0gICAgIGludCBjb2RlOwotICAgICBldHJlZV90eXBlICpjb25kOwotICAgICBldHJlZV90eXBlICpsaHM7Ci0gICAgIGV0cmVlX3R5cGUgKnJoczsKLXsKLSAgZXRyZWVfdHlwZSB2YWx1ZSwgKm5ldzsKLSAgZXRyZWVfdmFsdWVfdHlwZSByOwotICB2YWx1ZS50eXBlLm5vZGVfY29kZSA9IGNvZGU7Ci0gIHZhbHVlLnRyaW5hcnkubGhzID0gbGhzOwotICB2YWx1ZS50cmluYXJ5LmNvbmQgPSBjb25kOwotICB2YWx1ZS50cmluYXJ5LnJocyA9IHJoczsKLSAgdmFsdWUudHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfdHJpbmFyeTsKLSAgcj0gZXhwX2ZvbGRfdHJlZV9ub19kb3QoJnZhbHVlLCAgKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUKLQkJCQkgICAgKilOVUxMLGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci0gIGlmIChyLnZhbGlkX3ApIHsKLSAgICByZXR1cm4gZXhwX2ludG9wKHIudmFsdWUpOwotICB9Ci0gIG5ldyA9IChldHJlZV90eXBlICopIHN0YXRfYWxsb2MgKHNpemVvZiAobmV3LT50cmluYXJ5KSk7Ci0gIG1lbWNweSgoY2hhciAqKW5ldywoY2hhciAqKSAmdmFsdWUsIHNpemVvZihuZXctPnRyaW5hcnkpKTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotCi1ldHJlZV90eXBlICoKLWV4cF91bm9wIChjb2RlLCBjaGlsZCkKLSAgICAgaW50IGNvZGU7Ci0gICAgIGV0cmVlX3R5cGUgKmNoaWxkOwotewotICBldHJlZV90eXBlIHZhbHVlLCAqbmV3OwotCi0gIGV0cmVlX3ZhbHVlX3R5cGUgcjsKLSAgdmFsdWUudW5hcnkudHlwZS5ub2RlX2NvZGUgPSBjb2RlOwotICB2YWx1ZS51bmFyeS5jaGlsZCA9IGNoaWxkOwotICB2YWx1ZS51bmFyeS50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV91bmFyeTsKLSAgciA9IGV4cF9mb2xkX3RyZWVfbm9fZG90KCZ2YWx1ZSxhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pOwotICBpZiAoci52YWxpZF9wKSB7Ci0gICAgcmV0dXJuIGV4cF9pbnRvcChyLnZhbHVlKTsKLSAgfQotICBuZXcgPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKG5ldy0+dW5hcnkpKTsKLSAgbWVtY3B5KChjaGFyICopbmV3LCAoY2hhciAqKSZ2YWx1ZSwgc2l6ZW9mKG5ldy0+dW5hcnkpKTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotCi1ldHJlZV90eXBlICoKLWV4cF9uYW1lb3AgKGNvZGUsIG5hbWUpCi0gICAgIGludCBjb2RlOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBldHJlZV90eXBlIHZhbHVlLCAqbmV3OwotICBldHJlZV92YWx1ZV90eXBlIHI7Ci0gIHZhbHVlLm5hbWUudHlwZS5ub2RlX2NvZGUgPSBjb2RlOwotICB2YWx1ZS5uYW1lLm5hbWUgPSBuYW1lOwotICB2YWx1ZS5uYW1lLnR5cGUubm9kZV9jbGFzcyA9IGV0cmVlX25hbWU7Ci0KLQotICByID0gZXhwX2ZvbGRfdHJlZV9ub19kb3QoJnZhbHVlLAotCQkJICAgKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKilOVUxMLAotCQkJICAgbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLSAgaWYgKHIudmFsaWRfcCkgewotICAgIHJldHVybiBleHBfaW50b3Aoci52YWx1ZSk7Ci0gIH0KLSAgbmV3ID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuZXctPm5hbWUpKTsKLSAgbWVtY3B5KChjaGFyICopbmV3LCAoY2hhciAqKSZ2YWx1ZSwgc2l6ZW9mKG5ldy0+bmFtZSkpOwotICByZXR1cm4gbmV3OwotCi19Ci0KLQotCi0KLWV0cmVlX3R5cGUgKgotZXhwX2Fzc29wIChjb2RlLCBkc3QsIHNyYykKLSAgICAgaW50IGNvZGU7Ci0gICAgIENPTlNUIGNoYXIgKmRzdDsKLSAgICAgZXRyZWVfdHlwZSAqc3JjOwotewotICBldHJlZV90eXBlIHZhbHVlLCAqbmV3OwotCi0gIHZhbHVlLmFzc2lnbi50eXBlLm5vZGVfY29kZSA9IGNvZGU7Ci0KLQotICB2YWx1ZS5hc3NpZ24uc3JjID0gc3JjOwotICB2YWx1ZS5hc3NpZ24uZHN0ID0gZHN0OwotICB2YWx1ZS5hc3NpZ24udHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfYXNzaWduOwotCi0jaWYgMAotICBpZiAoZXhwX2ZvbGRfdHJlZV9ub19kb3QoJnZhbHVlLCAmcmVzdWx0KSkgewotICAgIHJldHVybiBleHBfaW50b3AocmVzdWx0KTsKLSAgfQotI2VuZGlmCi0gIG5ldyA9IChldHJlZV90eXBlKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuZXctPmFzc2lnbikpOwotICBtZW1jcHkoKGNoYXIgKiluZXcsIChjaGFyICopJnZhbHVlLCBzaXplb2YobmV3LT5hc3NpZ24pKTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotLyogSGFuZGxlIFBST1ZJREUuICAqLwotCi1ldHJlZV90eXBlICoKLWV4cF9wcm92aWRlIChkc3QsIHNyYykKLSAgICAgY29uc3QgY2hhciAqZHN0OwotICAgICBldHJlZV90eXBlICpzcmM7Ci17Ci0gIGV0cmVlX3R5cGUgKm47Ci0KLSAgbiA9IChldHJlZV90eXBlICopIHN0YXRfYWxsb2MgKHNpemVvZiAobi0+YXNzaWduKSk7Ci0gIG4tPmFzc2lnbi50eXBlLm5vZGVfY29kZSA9ICc9JzsKLSAgbi0+YXNzaWduLnR5cGUubm9kZV9jbGFzcyA9IGV0cmVlX3Byb3ZpZGU7Ci0gIG4tPmFzc2lnbi5zcmMgPSBzcmM7Ci0gIG4tPmFzc2lnbi5kc3QgPSBkc3Q7Ci0gIHJldHVybiBuOwotfQotCi0vKiBIYW5kbGUgQVNTRVJULiAgKi8KLQotZXRyZWVfdHlwZSAqCi1leHBfYXNzZXJ0IChleHAsIG1lc3NhZ2UpCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLXsKLSAgZXRyZWVfdHlwZSAqbjsKLQotICBuID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuLT5hc3NlcnRfcykpOwotICBuLT5hc3NlcnRfcy50eXBlLm5vZGVfY29kZSA9ICchJzsKLSAgbi0+YXNzZXJ0X3MudHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfYXNzZXJ0OwotICBuLT5hc3NlcnRfcy5jaGlsZCA9IGV4cDsKLSAgbi0+YXNzZXJ0X3MubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gIHJldHVybiBuOwotfQotCi12b2lkIAotZXhwX3ByaW50X3RyZWUgKHRyZWUpCi0gICAgIGV0cmVlX3R5cGUgKnRyZWU7Ci17Ci0gIHN3aXRjaCAodHJlZS0+dHlwZS5ub2RlX2NsYXNzKSB7Ci0gIGNhc2UgZXRyZWVfdmFsdWU6Ci0gICAgbWluZm8gKCIweCV2IiwgdHJlZS0+dmFsdWUudmFsdWUpOwotICAgIHJldHVybjsKLSAgY2FzZSBldHJlZV9yZWw6Ci0gICAgaWYgKHRyZWUtPnJlbC5zZWN0aW9uLT5vd25lciAhPSBOVUxMKQotICAgICAgbWluZm8gKCIlQjoiLCB0cmVlLT5yZWwuc2VjdGlvbi0+b3duZXIpOwotICAgIG1pbmZvICgiJXMrMHgldiIsIHRyZWUtPnJlbC5zZWN0aW9uLT5uYW1lLCB0cmVlLT5yZWwudmFsdWUpOwotICAgIHJldHVybjsKLSAgY2FzZSBldHJlZV9hc3NpZ246Ci0jaWYgMAotICAgIGlmICh0cmVlLT5hc3NpZ24uZHN0LT5zZGVmcyAhPSAoYXN5bWJvbCAqKU5VTEwpewotICAgICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIiVzICgleCkgIix0cmVlLT5hc3NpZ24uZHN0LT5uYW1lLAotCSAgICAgIHRyZWUtPmFzc2lnbi5kc3QtPnNkZWZzLT52YWx1ZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIiVzIChVTkRFRklORUQpIix0cmVlLT5hc3NpZ24uZHN0LT5uYW1lKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiJXMiLHRyZWUtPmFzc2lnbi5kc3QpOwotICAgIGV4cF9wcmludF90b2tlbih0cmVlLT50eXBlLm5vZGVfY29kZSk7Ci0gICAgZXhwX3ByaW50X3RyZWUodHJlZS0+YXNzaWduLnNyYyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgZXRyZWVfcHJvdmlkZToKLSAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJQUk9WSURFICglcywgIiwgdHJlZS0+YXNzaWduLmRzdCk7Ci0gICAgZXhwX3ByaW50X3RyZWUgKHRyZWUtPmFzc2lnbi5zcmMpOwotICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIikiKTsKLSAgICBicmVhazsKLSAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIigiKTsKLSAgICBleHBfcHJpbnRfdHJlZSh0cmVlLT5iaW5hcnkubGhzKTsKLSAgICBleHBfcHJpbnRfdG9rZW4odHJlZS0+dHlwZS5ub2RlX2NvZGUpOwotICAgIGV4cF9wcmludF90cmVlKHRyZWUtPmJpbmFyeS5yaHMpOwotICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCIpIik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICBleHBfcHJpbnRfdHJlZSh0cmVlLT50cmluYXJ5LmNvbmQpOwotICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCI/Iik7Ci0gICAgZXhwX3ByaW50X3RyZWUodHJlZS0+dHJpbmFyeS5saHMpOwotICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCI6Iik7Ci0gICAgZXhwX3ByaW50X3RyZWUodHJlZS0+dHJpbmFyeS5yaHMpOwotICAgIGJyZWFrOwotICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgIGV4cF9wcmludF90b2tlbih0cmVlLT51bmFyeS50eXBlLm5vZGVfY29kZSk7Ci0gICAgaWYgKHRyZWUtPnVuYXJ5LmNoaWxkKSAKLSAgICB7Ci0gICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIigiKTsKLSAgICBleHBfcHJpbnRfdHJlZSh0cmVlLT51bmFyeS5jaGlsZCk7Ci0gICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIikiKTsKLSAgfQotICAgIAotICAgIGJyZWFrOwotCi0gIGNhc2UgZXRyZWVfYXNzZXJ0OgotICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIkFTU0VSVCAoIik7Ci0gICAgZXhwX3ByaW50X3RyZWUgKHRyZWUtPmFzc2VydF9zLmNoaWxkKTsKLSAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICIsICVzKSIsIHRyZWUtPmFzc2VydF9zLm1lc3NhZ2UpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgZXRyZWVfdW5kZWY6Ci0gICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIj8/Pz8/Pz8/Iik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgZXRyZWVfbmFtZToKLSAgICBpZiAodHJlZS0+dHlwZS5ub2RlX2NvZGUgPT0gTkFNRSkgewotICAgICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIiVzIiwgdHJlZS0+bmFtZS5uYW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBleHBfcHJpbnRfdG9rZW4odHJlZS0+dHlwZS5ub2RlX2NvZGUpOwotICAgICAgaWYgKHRyZWUtPm5hbWUubmFtZSkKLSAgICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCIoJXMpIiwgdHJlZS0+bmFtZS5uYW1lKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRkFJTCgpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLWJmZF92bWEKLWV4cF9nZXRfdm1hICh0cmVlLCBkZWYsIG5hbWUsIGFsbG9jYXRpb25fZG9uZSkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLSAgICAgYmZkX3ZtYSBkZWY7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmU7Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcjsKLQotICBpZiAodHJlZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHIgPSBleHBfZm9sZF90cmVlX25vX2RvdCAodHJlZSwgYWJzX291dHB1dF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUpOwotICAgICAgaWYgKCEgci52YWxpZF9wICYmIG5hbWUgIT0gTlVMTCkKLQllaW5mbyAoXygiJUYlUyBub25jb25zdGFudCBleHByZXNzaW9uIGZvciAlc1xuIiksIG5hbWUpOwotICAgICAgcmV0dXJuIHIudmFsdWU7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIGRlZjsKLX0KLQotaW50IAotZXhwX2dldF92YWx1ZV9pbnQgKHRyZWUsZGVmLG5hbWUsIGFsbG9jYXRpb25fZG9uZSkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLSAgICAgaW50IGRlZjsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgbGFuZ19waGFzZV90eXBlIGFsbG9jYXRpb25fZG9uZTsKLXsKLSAgcmV0dXJuIChpbnQpZXhwX2dldF92bWEodHJlZSwoYmZkX3ZtYSlkZWYsbmFtZSwgYWxsb2NhdGlvbl9kb25lKTsKLX0KLQotCi1iZmRfdm1hCi1leHBfZ2V0X2Fic19pbnQgKHRyZWUsIGRlZiwgbmFtZSwgYWxsb2NhdGlvbl9kb25lKQotICAgICBldHJlZV90eXBlICp0cmVlOwotICAgICBpbnQgZGVmIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmU7Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcmVzOwotICByZXMgPSBleHBfZm9sZF90cmVlX25vX2RvdCAodHJlZSwgYWJzX291dHB1dF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUpOwotCi0gIGlmIChyZXMudmFsaWRfcCkKLSAgICB7Ci0gICAgICByZXMudmFsdWUgKz0gcmVzLnNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWE7Ci0gICAgfQotICBlbHNlIHsKLSAgICBlaW5mbyAoXygiJUYlUyBub24gY29uc3RhbnQgZXhwcmVzc2lvbiBmb3IgJXNcbiIpLG5hbWUpOwotICB9Ci0gIHJldHVybiByZXMudmFsdWU7Ci19CmRpZmYgLS1naXQgYS9sZC9sZGV4cC5oIGIvbGQvbGRleHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlOGRkZi4uMDAwMDAwMAotLS0gYS9sZC9sZGV4cC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qIGxkZXhwLmggLQotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExERVhQX0gKLSNkZWZpbmUgTERFWFBfSAotCi0vKiBUaGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24gdHJlZSAqLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9zdHJ1Y3QgKnNlY3Rpb247Ci0gIGJvb2xlYW4gdmFsaWRfcDsKLX0gZXRyZWVfdmFsdWVfdHlwZTsKLQotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBpbnQgbm9kZV9jb2RlOwotICBlbnVtIHsgZXRyZWVfYmluYXJ5LAotCSAgIGV0cmVlX3RyaW5hcnksCi0JICAgZXRyZWVfdW5hcnksCi0JICAgZXRyZWVfbmFtZSwKLQkgICBldHJlZV9hc3NpZ24sCi0JICAgZXRyZWVfcHJvdmlkZSwKLQkgICBldHJlZV91bmRlZiwKLQkgICBldHJlZV91bnNwZWMsCi0JICAgZXRyZWVfdmFsdWUsCi0JICAgZXRyZWVfYXNzZXJ0LAotCSAgIGV0cmVlX3JlbCB9IG5vZGVfY2xhc3M7Ci19IG5vZGVfdHlwZTsKLQotCi0KLXR5cGVkZWYgdW5pb24gZXRyZWVfdW5pb24gCi17Ci0gIG5vZGVfdHlwZSB0eXBlOwotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpsaHM7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKnJoczsKLSAgfSBiaW5hcnk7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKmNvbmQ7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKmxoczsKLSAgICB1bmlvbiBldHJlZV91bmlvbiAqcmhzOwotICB9IHRyaW5hcnk7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgQ09OU1QgY2hhciAqZHN0OwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpzcmM7Ci0gIH0gYXNzaWduOwotCi0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgdW5pb24gICBldHJlZV91bmlvbiAqY2hpbGQ7Ci0gIH0gdW5hcnk7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICBDT05TVCBjaGFyICpuYW1lOwotICB9IG5hbWU7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgYmZkX3ZtYSB2YWx1ZTsKLSAgfSB2YWx1ZTsKLSAgc3RydWN0IHsKLSAgICBub2RlX3R5cGUgdHlwZTsKLSAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICBiZmRfdm1hIHZhbHVlOwotICB9IHJlbDsKLSAgc3RydWN0IHsKLSAgICBub2RlX3R5cGUgdHlwZTsKLSAgICB1bmlvbiBldHJlZV91bmlvbiAqY2hpbGQ7Ci0gICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLSAgfSBhc3NlcnRfczsKLX0gZXRyZWVfdHlwZTsKLQotCi1ldHJlZV90eXBlICpleHBfaW50b3AgUEFSQU1TICgoYmZkX3ZtYSkpOwotZXRyZWVfdHlwZSAqZXhwX3JlbG9wIFBBUkFNUyAoKGFzZWN0aW9uICosIGJmZF92bWEpKTsKLWV0cmVlX3ZhbHVlX3R5cGUgaW52YWxpZCBQQVJBTVMgKCh2b2lkKSk7Ci1ldHJlZV92YWx1ZV90eXBlIGV4cF9mb2xkX3RyZWUgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBzdHJ1Y3QKLQkJCQkJbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfc3RydWN0ICosCi0JCQkJCWxhbmdfcGhhc2VfdHlwZSwKLQkJCQkJYmZkX3ZtYSwgYmZkX3ZtYSAqKSk7Ci1ldHJlZV90eXBlICpleHBfYmlub3AgUEFSQU1TICgoaW50LCBldHJlZV90eXBlICosIGV0cmVlX3R5cGUgKikpOwotZXRyZWVfdHlwZSAqZXhwX3RyaW5vcCBQQVJBTVMgKChpbnQsZXRyZWVfdHlwZSAqLCBldHJlZV90eXBlICosIGV0cmVlX3R5cGUgKikpOwotZXRyZWVfdHlwZSAqZXhwX3Vub3AgUEFSQU1TICgoaW50LCBldHJlZV90eXBlICopKTsKLWV0cmVlX3R5cGUgKmV4cF9uYW1lb3AgUEFSQU1TICgoaW50LCBDT05TVCBjaGFyICopKTsKLWV0cmVlX3R5cGUgKmV4cF9hc3NvcCBQQVJBTVMgKChpbnQsIENPTlNUIGNoYXIgKiwgZXRyZWVfdHlwZSAqKSk7Ci1ldHJlZV90eXBlICpleHBfcHJvdmlkZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGV0cmVlX3R5cGUgKikpOwotZXRyZWVfdHlwZSAqZXhwX2Fzc2VydCBQQVJBTVMgKChldHJlZV90eXBlICosIGNvbnN0IGNoYXIgKikpOwotdm9pZCBleHBfcHJpbnRfdHJlZSBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLWJmZF92bWEgZXhwX2dldF92bWEgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBiZmRfdm1hLCBjaGFyICosIGxhbmdfcGhhc2VfdHlwZSkpOwotaW50IGV4cF9nZXRfdmFsdWVfaW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgaW50LCBjaGFyICosbGFuZ19waGFzZV90eXBlKSk7Ci1iZmRfdm1hIGV4cF9nZXRfYWJzX2ludCBQQVJBTVMgKChldHJlZV90eXBlICosIGludCwgY2hhciAqLGxhbmdfcGhhc2VfdHlwZSkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkZmlsZS5jIGIvbGQvbGRmaWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMDBjYWIuLjAwMDAwMDAKLS0tIGEvbGQvbGRmaWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gbGRmaWxlLmMKLQotIGxvb2sgYWZ0ZXIgYWxsIHRoZSBmaWxlIHN0dWZmCi0KLSAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotY29uc3QgY2hhciAqbGRmaWxlX2lucHV0X2ZpbGVuYW1lOwotYm9vbGVhbiBsZGZpbGVfYXNzdW1lZF9zY3JpcHQgPSBmYWxzZTsKLWNvbnN0IGNoYXIgKmxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lID0gIiI7Ci11bnNpZ25lZCBsb25nIGxkZmlsZV9vdXRwdXRfbWFjaGluZTsKLWVudW0gYmZkX2FyY2hpdGVjdHVyZSBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZTsKLXNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaF9oZWFkOwotCi0jaWZuZGVmIE1QVwotI2lmZGVmIFZNUwotY2hhciAqc2xhc2ggPSAiIjsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLWNoYXIgKnNsYXNoID0gIlxcIjsKLSNlbHNlCi1jaGFyICpzbGFzaCA9ICIvIjsKLSNlbmRpZgotI2VuZGlmCi0jZWxzZSAvKiBNUFcgKi8KLS8qIFRoZSBNUFcgcGF0aCBjaGFyIGlzIGEgY29sb24uICovCi1jaGFyICpzbGFzaCA9ICI6IjsKLSNlbmRpZiAvKiBNUFcgKi8KLQotLyogTE9DQUwgKi8KLQotc3RhdGljIHNlYXJjaF9kaXJzX3R5cGUgKipzZWFyY2hfdGFpbF9wdHIgPSAmc2VhcmNoX2hlYWQ7Ci0KLXR5cGVkZWYgc3RydWN0IHNlYXJjaF9hcmNoIAotewotICBjaGFyICpuYW1lOyAKLSAgc3RydWN0IHNlYXJjaF9hcmNoICpuZXh0OwotfSBzZWFyY2hfYXJjaF90eXBlOwotCi1zdGF0aWMgc2VhcmNoX2FyY2hfdHlwZSAqc2VhcmNoX2FyY2hfaGVhZDsKLXN0YXRpYyBzZWFyY2hfYXJjaF90eXBlICoqc2VhcmNoX2FyY2hfdGFpbF9wdHIgPSAmc2VhcmNoX2FyY2hfaGVhZDsKLSAKLXN0YXRpYyBib29sZWFuIGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2gsIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwKLQkgICBjb25zdCBjaGFyICpsaWIsIGNvbnN0IGNoYXIgKnN1ZmZpeCkpOwotc3RhdGljIEZJTEUgKnRyeV9vcGVuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmV4dGVuKSk7Ci0KLXZvaWQKLWxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChuYW1lLCBjbWRsaW5lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGNtZGxpbmU7Ci17Ci0gIHNlYXJjaF9kaXJzX3R5cGUgKm5ldzsKLQotICBuZXcgPSAoc2VhcmNoX2RpcnNfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKHNlYXJjaF9kaXJzX3R5cGUpKTsKLSAgbmV3LT5uZXh0ID0gTlVMTDsKLSAgbmV3LT5uYW1lID0gbmFtZTsKLSAgbmV3LT5jbWRsaW5lID0gY21kbGluZTsKLSAgKnNlYXJjaF90YWlsX3B0ciA9IG5ldzsKLSAgc2VhcmNoX3RhaWxfcHRyID0gJm5ldy0+bmV4dDsKLX0KLQotLyogVHJ5IHRvIG9wZW4gYSBCRkQgZm9yIGEgbGFuZ19pbnB1dF9zdGF0ZW1lbnQuICAqLwotCi1ib29sZWFuCi1sZGZpbGVfdHJ5X29wZW5fYmZkIChhdHRlbXB0LCBlbnRyeSkKLSAgICAgY29uc3QgY2hhciAqYXR0ZW1wdDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGVudHJ5LT50aGVfYmZkID0gYmZkX29wZW5yIChhdHRlbXB0LCBlbnRyeS0+dGFyZ2V0KTsKLQotICBpZiAodHJhY2VfZmlsZV90cmllcykKLSAgICB7Ci0gICAgICBpZiAoZW50cnktPnRoZV9iZmQgPT0gTlVMTCkKLQlpbmZvX21zZyAoXygiYXR0ZW1wdCB0byBvcGVuICVzIGZhaWxlZFxuIiksIGF0dGVtcHQpOwotICAgICAgZWxzZQotCWluZm9fbXNnIChfKCJhdHRlbXB0IHRvIG9wZW4gJXMgc3VjY2VlZGVkXG4iKSwgYXR0ZW1wdCk7Ci0gICAgfQotCi0gIGlmIChlbnRyeS0+dGhlX2JmZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCkKLQllaW5mbyAoXygiJUYlUDogaW52YWxpZCBCRkQgdGFyZ2V0IGAlcydcbiIpLCBlbnRyeS0+dGFyZ2V0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIHNlYXJjaGluZyBmb3IgdGhpcyBmaWxlLCBzZWUgaWYgdGhlIGFyY2hpdGVjdHVyZSBpcwotICAgICBjb21wYXRpYmxlIHdpdGggdGhlIG91dHB1dCBmaWxlLiAgSWYgaXQgaXNuJ3QsIGtlZXAgc2VhcmNoaW5nLgotICAgICBJZiB3ZSBjYW4ndCBvcGVuIHRoZSBmaWxlIGFzIGFuIG9iamVjdCBmaWxlLCBzdG9wIHRoZSBzZWFyY2gKLSAgICAgaGVyZS4gICovCi0KLSAgaWYgKGVudHJ5LT5zZWFyY2hfZGlyc19mbGFnKQotICAgIHsKLSAgICAgIGJmZCAqY2hlY2s7Ci0KLSAgICAgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCwgYmZkX2FyY2hpdmUpKQotCWNoZWNrID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZW50cnktPnRoZV9iZmQsIE5VTEwpOwotICAgICAgZWxzZQotCWNoZWNrID0gZW50cnktPnRoZV9iZmQ7Ci0KLSAgICAgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGNoZWNrLCBiZmRfb2JqZWN0KSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGlmIChiZmRfYXJjaF9nZXRfY29tcGF0aWJsZSAoY2hlY2ssIG91dHB1dF9iZmQpID09IE5VTEwpCi0JewotCSAgZWluZm8gKF8oIiVQOiBza2lwcGluZyBpbmNvbXBhdGlibGUgJXMgd2hlbiBzZWFyY2hpbmcgZm9yICVzIiksCi0JCSBhdHRlbXB0LCBlbnRyeS0+bG9jYWxfc3ltX25hbWUpOwotCSAgYmZkX2Nsb3NlIChlbnRyeS0+dGhlX2JmZCk7Ci0JICBlbnRyeS0+dGhlX2JmZCA9IE5VTEw7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VhcmNoIGZvciBhbmQgb3BlbiB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgRU5UUlkuICBJZiBpdCBpcyBhbgotICAgYXJjaGl2ZSwgdXNlIEFSQ0gsIExJQiBhbmQgU1VGRklYIHRvIG1vZGlmeSB0aGUgZmlsZSBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoIChhcmNoLCBlbnRyeSwgbGliLCBzdWZmaXgpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotICAgICBjb25zdCBjaGFyICpsaWI7Ci0gICAgIGNvbnN0IGNoYXIgKnN1ZmZpeDsKLXsKLSAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0gIC8qIElmIHRoaXMgaXMgbm90IGFuIGFyY2hpdmUsIHRyeSB0byBvcGVuIGl0IGluIHRoZSBjdXJyZW50Ci0gICAgIGRpcmVjdG9yeSBmaXJzdC4gICovCi0gIGlmICghIGVudHJ5LT5pc19hcmNoaXZlKQotICAgIHsKLSAgICAgIGlmIChsZGZpbGVfdHJ5X29wZW5fYmZkIChlbnRyeS0+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+NDsKLQkJCX0KLQk7Ci0KLSUlCi12b2lkCi15eWVycm9yKGFyZykgCi0gICAgIGNvbnN0IGNoYXIgKmFyZzsKLXsgCi0gIGlmIChsZGZpbGVfYXNzdW1lZF9zY3JpcHQpCi0gICAgZWluZm8gKF8oIiVQOiVzOiBmaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZDsgdHJlYXRpbmcgYXMgbGlua2VyIHNjcmlwdFxuIiksCi0JICAgbGRmaWxlX2lucHV0X2ZpbGVuYW1lKTsKLSAgaWYgKGVycm9yX2luZGV4ID4gMCAmJiBlcnJvcl9pbmRleCA8IEVSUk9SX05BTUVfTUFYKQotICAgICBlaW5mbyAoIiVQJUY6JVM6ICVzIGluICVzXG4iLCBhcmcsIGVycm9yX25hbWVzW2Vycm9yX2luZGV4LTFdKTsKLSAgZWxzZQotICAgICBlaW5mbyAoIiVQJUY6JVM6ICVzXG4iLCBhcmcpOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRpbnQudGV4aW5mbyBiL2xkL2xkaW50LnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZWE3ODguLjAwMDAwMDAKLS0tIGEvbGQvbGRpbnQudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi1caW5wdXQgdGV4aW5mbwotQHNldGZpbGVuYW1lIGxkaW50LmluZm8KLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogTGQtSW50ZXJuYWxzOiAobGRpbnQpLglUaGUgR05VIGxpbmtlciBpbnRlcm5hbHMuCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIEdOVSBsaW5rZXIgbGQuCi0KLUNvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IG9yIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIChmb3Igd2hpY2ggcHVycG9zZSB0aGlzIHRleHQgbWF5IGJlCi1yZWdhcmRlZCBhcyBhIHByb2dyYW0gaW4gdGhlIGxhbmd1YWdlIFRlWCkuCi1AZW5kIGlmaW5mbwotCi1AaWZ0ZXgKLUBmaW5hbG91dAotQHNldGNoYXB0ZXJuZXdwYWdlIG9mZgotQHNldHRpdGxlIEdOVSBMaW5rZXIgSW50ZXJuYWxzCi1AdGl0bGVwYWdlCi1AdGl0bGV7QSBndWlkZSB0byB0aGUgaW50ZXJuYWxzIG9mIHRoZSBHTlUgbGlua2VyfQotQGF1dGhvciBQZXIgQm90aG5lciwgU3RldmUgQ2hhbWJlcmxhaW4sIElhbiBMYW5jZSBUYXlsb3IsIERKIERlbG9yaWUKLUBhdXRob3IgQ3lnbnVzIFN1cHBvcnQKLUBwYWdlCi0KLUB0ZXgKLVxkZWZcJCMxJHt7IzF9fSAgJSBLbHVnZTogY29sbGVjdCBSQ1MgcmV2aXNpb24gaW5mbyB3aXRob3V0ICQuLi4kCi1ceGRlZlxtYW52ZXJze1wkUmV2aXNpb24kfSAgJSBGb3IgdXNlIGluIGhlYWRlcnMsIGZvb3RlcnMgdG9vCi17XHBhcnNraXA9MHB0Ci1caGZpbGwgQ3lnbnVzIFN1cHBvcnRccGFyCi1caGZpbGwgXG1hbnZlcnNccGFyCi1caGZpbGwgXFRlWHt9aW5mbyBcdGV4aW5mb3ZlcnNpb25ccGFyCi19Ci1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGVuZCB0aXRsZXBhZ2UKLUBlbmQgaWZ0ZXgKLQotQG5vZGUgVG9wCi1AdG9wCi0KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGludGVybmFscyBvZiB0aGUgR05VIGxpbmtlciBAY29kZXtsZH0uICBJdCBpcyBhCi1jb2xsZWN0aW9uIG9mIG1pc2NlbGxhbmVvdXMgaW5mb3JtYXRpb24gd2l0aCBsaXR0bGUgZm9ybSBhdCB0aGlzIHBvaW50LgotTW9zdGx5LCBpdCBpcyBhIHJlcG9zaXRvcnkgaW50byB3aGljaCB5b3UgY2FuIHB1dCBpbmZvcm1hdGlvbiBhYm91dAotR05VIEBjb2Rle2xkfSBhcyB5b3UgZGlzY292ZXIgaXQgKG9yIGFzIHlvdSBkZXNpZ24gY2hhbmdlcyB0byBAY29kZXtsZH0pLgotCi1AbWVudQotKiBSRUFETUU6OgkJCVRoZSBSRUFETUUgRmlsZQotKiBFbXVsYXRpb25zOjoJCQlIb3cgbGlua2VyIGVtdWxhdGlvbnMgYXJlIGdlbmVyYXRlZAotKiBFbXVsYXRpb24gV2Fsa3Rocm91Z2g6OglBIFdhbGt0aHJvdWdoIG9mIGEgVHlwaWNhbCBFbXVsYXRpb24KLUBlbmQgbWVudQotCi1Abm9kZSBSRUFETUUKLUBjaGFwdGVyIFRoZSBAZmlsZXtSRUFETUV9IEZpbGUKLQotQ2hlY2sgdGhlIEBmaWxle1JFQURNRX0gZmlsZTsgaXQgb2Z0ZW4gaGFzIHVzZWZ1bCBpbmZvcm1hdGlvbiB0aGF0IGRvZXMgbm90Ci1hcHBlYXIgYW55d2hlcmUgZWxzZSBpbiB0aGUgZGlyZWN0b3J5LgotCi1Abm9kZSBFbXVsYXRpb25zCi1AY2hhcHRlciBIb3cgbGlua2VyIGVtdWxhdGlvbnMgYXJlIGdlbmVyYXRlZAotCi1FYWNoIGxpbmtlciB0YXJnZXQgaGFzIGFuIEBkZm57ZW11bGF0aW9ufS4gIFRoZSBlbXVsYXRpb24gaW5jbHVkZXMgdGhlCi1kZWZhdWx0IGxpbmtlciBzY3JpcHQsIGFuZCBjZXJ0YWluIGVtdWxhdGlvbnMgYWxzbyBtb2RpZnkgY2VydGFpbiB0eXBlcwotb2YgbGlua2VyIGJlaGF2aW91ci4KLQotRW11bGF0aW9ucyBhcmUgY3JlYXRlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MgYnkgdGhlIHNoZWxsIHNjcmlwdAotQGZpbGV7Z2Vuc2NyaXB0cy5zaH0uCi0KLVRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgc3RhcnRzIGJ5IHJlYWRpbmcgYSBmaWxlIGluIHRoZQotQGZpbGV7ZW11bHBhcmFtc30gZGlyZWN0b3J5LiAgVGhpcyBpcyBhIHNoZWxsIHNjcmlwdCB3aGljaCBzZXRzIHZhcmlvdXMKLXNoZWxsIHZhcmlhYmxlcyB1c2VkIGJ5IEBmaWxle2dlbnNjcmlwdHMuc2h9IGFuZCB0aGUgb3RoZXIgc2hlbGwgc2NyaXB0cwotaXQgaW52b2tlcy4KLQotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB3aWxsIGludm9rZSBhIHNoZWxsIHNjcmlwdCBpbiB0aGUKLUBmaWxle3NjcmlwdHRlbXBsfSBkaXJlY3RvcnkgaW4gb3JkZXIgdG8gY3JlYXRlIGRlZmF1bHQgbGlua2VyIHNjcmlwdHMKLXdyaXR0ZW4gaW4gdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlLiAgVGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQKLXdpbGwgYmUgaW52b2tlZCA1IChvciwgaW4gc29tZSBjYXNlcywgNikgdGltZXMsIHdpdGggZGlmZmVyZW50Ci1hc3NpZ25tZW50cyB0byBzaGVsbCB2YXJpYWJsZXMsIHRvIGNyZWF0ZSBkaWZmZXJlbnQgZGVmYXVsdCBzY3JpcHRzLgotVGhlIGNob2ljZSBvZiBzY3JpcHQgaXMgbWFkZSBiYXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0KLUFmdGVyIGNyZWF0aW5nIHRoZSBzY3JpcHRzLCBAZmlsZXtnZW5zY3JpcHRzLnNofSB3aWxsIGludm9rZSB5ZXQgYW5vdGhlcgotc2hlbGwgc2NyaXB0LCB0aGlzIHRpbWUgaW4gdGhlIEBmaWxle2VtdWx0ZW1wbH0gZGlyZWN0b3J5LiAgVGhhdCBzaGVsbAotc2NyaXB0IHdpbGwgY3JlYXRlIHRoZSBlbXVsYXRpb24gc291cmNlIGZpbGUsIHdoaWNoIGNvbnRhaW5zIEMgY29kZS4KLVRoaXMgQyBjb2RlIHBlcm1pdHMgdGhlIGxpbmtlciBlbXVsYXRpb24gdG8gb3ZlcnJpZGUgdmFyaW91cyBsaW5rZXIKLWJlaGF2aW91cnMuICBNb3N0IHRhcmdldHMgdXNlIHRoZSBnZW5lcmljIGVtdWxhdGlvbiBjb2RlLCB3aGljaCBpcyBpbgotQGZpbGV7ZW11bHRlbXBsL2dlbmVyaWMuZW19LgotCi1UbyBzdW1tYXJpemUsIEBmaWxle2dlbnNjcmlwdHMuc2h9IHJlYWRzIHRocmVlIHNoZWxsIHNjcmlwdHM6IGFuCi1lbXVsYXRpb24gcGFyYW1ldGVycyBzY3JpcHQgaW4gdGhlIEBmaWxle2VtdWxwYXJhbXN9IGRpcmVjdG9yeSwgYSBsaW5rZXIKLXNjcmlwdCBnZW5lcmF0aW9uIHNjcmlwdCBpbiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IGRpcmVjdG9yeSwgYW5kIGFuCi1lbXVsYXRpb24gc291cmNlIGZpbGUgZ2VuZXJhdGlvbiBzY3JpcHQgaW4gdGhlIEBmaWxle2VtdWx0ZW1wbH0KLWRpcmVjdG9yeS4KLQotRm9yIGV4YW1wbGUsIHRoZSBTdW4gNCBsaW5rZXIgc2V0cyB1cCB2YXJpYWJsZXMgaW4KLUBmaWxle2VtdWxwYXJhbXMvc3VuNC5zaH0sIGNyZWF0ZXMgbGlua2VyIHNjcmlwdHMgdXNpbmcKLUBmaWxle3NjcmlwdHRlbXBsL2FvdXQuc2N9LCBhbmQgY3JlYXRlcyB0aGUgZW11bGF0aW9uIGNvZGUgdXNpbmcKLUBmaWxle2VtdWx0ZW1wbC9zdW5vcy5lbX0uCi0KLU5vdGUgdGhhdCB0aGUgbGlua2VyIGNhbiBzdXBwb3J0IHNldmVyYWwgZW11bGF0aW9ucyBzaW11bHRhbmVvdXNseSwKLWRlcGVuZGluZyB1cG9uIGhvdyBpdCBpcyBjb25maWd1cmVkLiAgQW4gZW11bGF0aW9uIGNhbiBiZSBzZWxlY3RlZCB3aXRoCi10aGUgQGNvZGV7LW19IG9wdGlvbi4gIFRoZSBAY29kZXstVn0gb3B0aW9uIHdpbGwgbGlzdCBhbGwgc3VwcG9ydGVkCi1lbXVsYXRpb25zLgotCi1AbWVudQotKiBlbXVsYXRpb24gcGFyYW1ldGVyczo6ICAgICAgICBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHRzCi0qIGxpbmtlciBzY3JpcHRzOjogICAgICAgICAgICAgIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHRzCi0qIGxpbmtlciBlbXVsYXRpb25zOjogICAgICAgICAgIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0cwotQGVuZCBtZW51Ci0KLUBub2RlIGVtdWxhdGlvbiBwYXJhbWV0ZXJzCi1Ac2VjdGlvbiBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHRzCi0KLUVhY2ggdGFyZ2V0IHNlbGVjdHMgYSBwYXJ0aWN1bGFyIGZpbGUgaW4gdGhlIEBmaWxle2VtdWxwYXJhbXN9IGRpcmVjdG9yeQotYnkgc2V0dGluZyB0aGUgc2hlbGwgdmFyaWFibGUgQGNvZGV7dGFyZ19lbXVsfSBpbiBAZmlsZXtjb25maWd1cmUudGd0fS4KLVRoaXMgc2hlbGwgdmFyaWFibGUgaXMgdXNlZCBieSB0aGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgdG8gY29udHJvbAotYnVpbGRpbmcgYW4gZW11bGF0aW9uIHNvdXJjZSBmaWxlLgotCi1DZXJ0YWluIGNvbnZlbnRpb25zIGFyZSBlbmZvcmNlZC4gIFN1cHBvc2UgdGhlIEBjb2Rle3RhcmdfZW11bH0gdmFyaWFibGUKLWlzIHNldCB0byBAdmFye2VtdWx9IGluIEBmaWxle2NvbmZpZ3VyZS50Z3R9LiAgVGhlIG5hbWUgb2YgdGhlIGVtdWxhdGlvbgotc2hlbGwgc2NyaXB0IHdpbGwgYmUgQGZpbGV7ZW11bHBhcmFtcy9AdmFye2VtdWx9LnNofS4gIFRoZQotQGZpbGV7TWFrZWZpbGV9IG11c3QgaGF2ZSBhIHRhcmdldCBuYW1lZCBAZmlsZXtlQHZhcntlbXVsfS5jfTsgdGhpcwotdGFyZ2V0IG11c3QgZGVwZW5kIHVwb24gQGZpbGV7ZW11bHBhcmFtcy9AdmFye2VtdWx9LnNofSwgYXMgd2VsbCBhcyB0aGUKLWFwcHJvcHJpYXRlIHNjcmlwdHMgaW4gdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBhbmQgQGZpbGV7ZW11bHRlbXBsfQotZGlyZWN0b3JpZXMuICBUaGUgQGZpbGV7TWFrZWZpbGV9IHRhcmdldCBtdXN0IGludm9rZSBAY29kZXtHRU5TQ1JJUFRTfQotd2l0aCB0d28gYXJndW1lbnRzOiBAdmFye2VtdWx9LCBhbmQgdGhlIHZhbHVlIG9mIHRoZSBtYWtlIHZhcmlhYmxlCi1AY29kZXt0ZGlyX0B2YXJ7ZW11bH19LiAgVGhlIHZhbHVlIG9mIHRoZSBsYXR0ZXIgdmFyaWFibGUgd2lsbCBiZSBzZXQgYnkKLXRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCwgYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0IHRhcmdldAotZGlyZWN0b3J5IHRvIHNlYXJjaC4KLQotQnkgY29udmVudGlvbiwgdGhlIEBmaWxle2VtdWxwYXJhbXMvQHZhcntlbXVsfS5zaH0gc2hlbGwgc2NyaXB0IHNob3VsZAotb25seSBzZXQgc2hlbGwgdmFyaWFibGVzLiAgSXQgbWF5IHNldCBzaGVsbCB2YXJpYWJsZXMgd2hpY2ggYXJlIHRvIGJlCi1pbnRlcnByZXRlZCBieSB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IGFuZCB0aGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHRzLgotQ2VydGFpbiBzaGVsbCB2YXJpYWJsZXMgYXJlIGludGVycHJldGVkIGRpcmVjdGx5IGJ5IHRoZQotQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0LgotCi1IZXJlIGlzIGEgbGlzdCBvZiBzaGVsbCB2YXJpYWJsZXMgaW50ZXJwcmV0ZWQgYnkgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0sCi1hcyB3ZWxsIGFzIHNvbWUgY29udmVudGlvbmFsIHNoZWxsIHZhcmlhYmxlcyBpbnRlcnByZXRlZCBieSB0aGUKLUBmaWxle3NjcmlwdHRlbXBsfSBhbmQgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHRzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFNDUklQVF9OQU1FCi1UaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IHRvIHVzZS4gIElmCi1AY29kZXtTQ1JJUFRfTkFNRX0gaXMgc2V0IHRvIEB2YXJ7c2NyaXB0fSwgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbCB1c2UKLXRoZSBzY3JpcHQgQGZpbGV7c2NyaXB0dGVtbC9AdmFye3NjcmlwdH0uc2N9LgotCi1AaXRlbSBURU1QTEFURV9OQU1FCi1UaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBAZmlsZXtlbXVsdGVtbHB9IHNjcmlwdCB0byB1c2UuICBJZgotQGNvZGV7VEVNUExBVEVfTkFNRX0gaXMgc2V0IHRvIEB2YXJ7dGVtcGxhdGV9LCBAZmlsZXtnZW5zY3JpcHRzLnNofSB3aWxsCi11c2UgdGhlIHNjcmlwdCBAZmlsZXtlbXVsdGVtcGwvQHZhcnt0ZW1wbGF0ZX0uZW19LiAgSWYgdGhpcyB2YXJpYWJsZSBpcwotbm90IHNldCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgQHNhbXB7Z2VuZXJpY30uCi0KLUBpdGVtIEdFTkVSQVRFX1NITElCX1NDUklQVAotSWYgdGhpcyBpcyBzZXQgdG8gYSBub25lbXB0eSBzdHJpbmcsIEBmaWxle2dlbnNjcmlwdHMuc2h9IHdpbGwgaW52b2tlCi10aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBhbiBleHRyYSB0aW1lIHRvIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5Ci1zY3JpcHQuICBAcmVme2xpbmtlciBzY3JpcHRzfS4KLQotQGl0ZW0gT1VUUFVUX0ZPUk1BVAotVGhpcyBpcyBub3JtYWxseSBzZXQgdG8gaW5kaWNhdGUgdGhlIEJGRCBvdXRwdXQgZm9ybWF0IHVzZSAoZS5nLiwKLUBzYW1weyJhLm91dC1zdW5vcy1iaWcifS4gIFRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IHdpbGwgbm9ybWFsbHkKLXVzZSBpdCBpbiBhbiBAY29kZXtPVVRQVVRfRk9STUFUfSBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotCi1AaXRlbSBBUkNICi1UaGlzIGlzIG5vcm1hbGx5IHNldCB0byBpbmRpY2F0ZSB0aGUgYXJjaGl0ZWN0dXJlIHRvIHVzZSAoZS5nLiwKLUBzYW1we3NwYXJjfSkuICBUaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB3aWxsIG5vcm1hbGx5IHVzZSBpdCBpbiBhbgotQGNvZGV7T1VUUFVUX0FSQ0h9IGV4cHJlc3Npb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLUBpdGVtIEVOVFJZCi1Tb21lIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHRzIHVzZSB0aGlzIHRvIHNldCB0aGUgZW50cnkgYWRkcmVzcywgaW4gYW4KLUBjb2Rle0VOVFJZfSBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotCi1AaXRlbSBURVhUX1NUQVJUX0FERFIKLVNvbWUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdHMgdXNlIHRoaXMgdG8gc2V0IHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZQotQHNhbXB7LnRleHR9IHNlY3Rpb24uCi0KLUBpdGVtIE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUgotSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHNldHMKLUBjb2Rle1RFWFRfU1RBUlRfQUREUn0gdG8gaXRzIHZhbHVlIGJlZm9yZSBydW5uaW5nIHRoZQotQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBmb3IgdGhlIEBjb2Rley1ufSBhbmQgQGNvZGV7LU59IG9wdGlvbnMKLShAcHhyZWZ7bGlua2VyIHNjcmlwdHN9KS4KLQotQGl0ZW0gU0VHTUVOVF9TSVpFCi1UaGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHVzZXMgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YKLUBjb2Rle0RBVEFfQUxJR05NRU5UfSB3aGVuIHJ1bm5pbmcgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQuCi0KLUBpdGVtIFRBUkdFVF9QQUdFX1NJWkUKLUlmIEBjb2Rle1NFR01FTlRfU0laRX0gaXMgbm90IGRlZmluZWQsIHRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQKLXVzZXMgdGhpcyB0byBkZWZpbmUgaXQuCi0KLUBpdGVtIEFMSUdOTUVOVAotU29tZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0cyBzZXQgdGhpcyB0byBhIG51bWJlciB0byBwYXNzIHRvCi1AY29kZXtBTElHTn0gdG8gc2V0IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQgZm9yIHRoZSBAY29kZXtlbmR9IHN5bWJvbC4KLUBlbmQgdGFibGUKLQotQG5vZGUgbGlua2VyIHNjcmlwdHMKLUBzZWN0aW9uIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHRzCi0KLUVhY2ggbGlua2VyIHRhcmdldCB1c2VzIGEgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB0byBnZW5lcmF0ZSB0aGUKLWRlZmF1bHQgbGlua2VyIHNjcmlwdHMuICBUaGUgbmFtZSBvZiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBpcwotc2V0IGJ5IHRoZSBAY29kZXtTQ1JJUFRfTkFNRX0gdmFyaWFibGUgaW4gdGhlIEBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdC4KLUlmIEBjb2Rle1NDUklQVF9OQU1FfSBpcyBzZXQgdG8gQHZhcntzY3JpcHR9LCBAY29kZXtnZW5zY3JpcHRzLnNofSB3aWxsCi1pbnZva2UgQGZpbGV7c2NyaXB0dGVtcGwvQHZhcntzY3JpcHR9LnNjfS4KLQotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB3aWxsIGludm9rZSB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9Ci1zY3JpcHQgNSBvciA2IHRpbWVzLiAgRWFjaCB0aW1lIGl0IHdpbGwgc2V0IHRoZSBzaGVsbCB2YXJpYWJsZQotQGNvZGV7TERfRkxBR30gdG8gYSBkaWZmZXJlbnQgdmFsdWUuICBXaGVuIHRoZSBsaW5rZXIgaXMgcnVuLCB0aGUKLW9wdGlvbnMgdXNlZCB3aWxsIGRpcmVjdCBpdCB0byBzZWxlY3QgYSBwYXJ0aWN1bGFyIHNjcmlwdC4gIChTY3JpcHQKLXNlbGVjdGlvbiBpcyBjb250cm9sbGVkIGJ5IHRoZSBAY29kZXtnZXRfc2NyaXB0fSBlbXVsYXRpb24gZW50cnkgcG9pbnQ7Ci10aGlzIGRlc2NyaWJlcyB0aGUgY29udmVudGlvbmFsIGJlaGF2aW91cikuCi0KLVRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IHNob3VsZCBqdXN0IHdyaXRlIGEgbGlua2VyIHNjcmlwdCwgd3JpdHRlbgotaW4gdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlLCB0byBzdGFuZGFyZCBvdXRwdXQuICBJZiB0aGUgZW11bGF0aW9uCi1uYW1lLS10aGUgbmFtZSBvZiB0aGUgQGZpbGV7ZW11bHBhcmFtc30gZmlsZSB3aXRob3V0IHRoZSBAZmlsZXsuc2N9Ci1leHRlbnNpb24tLWlzIEB2YXJ7ZW11bH0sIHRoZW4gdGhlIG91dHB1dCB3aWxsIGJlIGRpcmVjdGVkIHRvCi1AZmlsZXtsZHNjcmlwdHMvQHZhcntlbXVsfS5AdmFye2V4dGVuc2lvbn19IGluIHRoZSBidWlsZCBkaXJlY3RvcnksCi13aGVyZSBAdmFye2V4dGVuc2lvbn0gY2hhbmdlcyBlYWNoIHRpbWUgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgaXMKLWludm9rZWQuCi0KLUhlcmUgaXMgdGhlIGxpc3Qgb2YgdmFsdWVzIGFzc2lnbmVkIHRvIEBjb2Rle0xEX0ZMQUd9LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIChlbXB0eSkKLVRoZSBzY3JpcHQgZ2VuZXJhdGVkIGlzIHVzZWQgYnkgZGVmYXVsdCAod2hlbiBub25lIG9mIHRoZSBmb2xsb3dpbmcKLWNhc2VzIGFwcGx5KS4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsueH0uCi1AaXRlbSBuCi1UaGUgc2NyaXB0IGdlbmVyYXRlZCBpcyB1c2VkIHdoZW4gdGhlIGxpbmtlciBpcyBpbnZva2VkIHdpdGggdGhlCi1AY29kZXstbn0gb3B0aW9uLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mIEBmaWxley54bn0uCi1AaXRlbSBOCi1UaGUgc2NyaXB0IGdlbmVyYXRlZCBpcyB1c2VkIHdoZW4gdGhlIGxpbmtlciBpcyBpbnZva2VkIHdpdGggdGhlCi1AY29kZXstTn0gb3B0aW9uLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mIEBmaWxley54Ym59LgotQGl0ZW0gcgotVGhlIHNjcmlwdCBnZW5lcmF0ZWQgaXMgdXNlZCB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIHRoZQotQGNvZGV7LXJ9IG9wdGlvbi4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsueHJ9LgotQGl0ZW0gdQotVGhlIHNjcmlwdCBnZW5lcmF0ZWQgaXMgdXNlZCB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIHRoZQotQGNvZGV7LVVyfSBvcHRpb24uICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YgQGZpbGV7Lnh1fS4KLUBpdGVtIHNoYXJlZAotVGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgaXMgb25seSBpbnZva2VkIHdpdGggQGNvZGV7TERfRkxBR30gc2V0IHRvCi10aGlzIHZhbHVlIGlmIEBjb2Rle0dFTkVSQVRFX1NITElCX1NDUklQVH0gaXMgZGVmaW5lZCBpbiB0aGUKLUBmaWxle2VtdWxwYXJhbXN9IGZpbGUuICBUaGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgbXVzdCBhcnJhbmdlIHRvIHVzZQotdGhpcyBzY3JpcHQgYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUsIG5vcm1hbGx5IHdoZW4gdGhlIGxpbmtlciBpcyBpbnZva2VkCi13aXRoIHRoZSBAY29kZXstc2hhcmVkfSBvcHRpb24uICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YKLUBmaWxley54c30uCi1AZW5kIHRhYmxlCi0KLUJlc2lkZXMgdGhlIHNoZWxsIHZhcmlhYmxlcyBzZXQgYnkgdGhlIEBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdCwgYW5kIHRoZQotQGNvZGV7TERfRkxBR30gdmFyaWFibGUsIHRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgd2lsbCBzZXQKLWNlcnRhaW4gdmFyaWFibGVzIGZvciBlYWNoIHJ1biBvZiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBSRUxPQ0FUSU5HCi1UaGlzIHdpbGwgYmUgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHRoZSBsaW5rZXIgaXMgZG9pbmcgYSBmaW5hbAotcmVsb2NhdGlvbiAoZS5nLiwgYWxsIHNjcmlwdHMgb3RoZXIgdGhhbiBAY29kZXstcn0gYW5kIEBjb2Rley1Vcn0pLgotCi1AaXRlbSBDT05TVFJVQ1RJTkcKLVRoaXMgd2lsbCBiZSBzZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGxpbmtlciBpcyBidWlsZGluZwotZ2xvYmFsIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIHRhYmxlcyAoZS5nLiwgYWxsIHNjcmlwdHMgb3RoZXIgdGhhbgotQGNvZGV7LXJ9KS4KLQotQGl0ZW0gREFUQV9BTElHTk1FTlQKLVRoaXMgd2lsbCBiZSBzZXQgdG8gYW4gQGNvZGV7QUxJR059IGV4cHJlc3Npb24gd2hlbiB0aGUgb3V0cHV0IHNob3VsZCBiZQotcGFnZSBhbGlnbmVkLCBvciB0byBAc2FtcHsufSB3aGVuIGdlbmVyYXRpbmcgdGhlIEBjb2Rley1OfSBzY3JpcHQuCi0KLUBpdGVtIENSRUFURV9TSExJQgotVGhpcyB3aWxsIGJlIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiBnZW5lcmF0aW5nIGEgQGNvZGV7LXNoYXJlZH0KLXNjcmlwdC4KLUBlbmQgdGFibGUKLQotVGhlIGNvbnZlbnRpb25hbCB3YXkgdG8gd3JpdGUgYSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IGlzIHRvIGZpcnN0Ci1zZXQgYSBmZXcgc2hlbGwgdmFyaWFibGVzLCBhbmQgdGhlbiB3cml0ZSBvdXQgYSBsaW5rZXIgc2NyaXB0IHVzaW5nCi1AY29kZXtjYXR9IHdpdGggYSBoZXJlIGRvY3VtZW50LiAgVGhlIGxpbmtlciBzY3JpcHQgd2lsbCB1c2UgdmFyaWFibGUKLXN1YnN0aXR1dGlvbnMsIGJhc2VkIG9uIHRoZSBhYm92ZSB2YXJpYWJsZXMgYW5kIHRob3NlIHNldCBpbiB0aGUKLUBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdCwgdG8gY29udHJvbCBpdHMgYmVoYXZpb3VyLgotCi1XaGVuIHRoZXJlIGFyZSBwYXJ0cyBvZiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB3aGljaCBzaG91bGQgb25seQotYmUgcnVuIHdoZW4gZG9pbmcgYSBmaW5hbCByZWxvY2F0aW9uLCB0aGV5IHNob3VsZCBiZSBlbmNsb3NlZCB3aXRoaW4gYQotdmFyaWFibGUgc3Vic3RpdHV0aW9uIGJhc2VkIG9uIEBjb2Rle1JFTE9DQVRJTkd9LiAgRm9yIGV4YW1wbGUsIG9uIG1hbnkKLXRhcmdldHMgc3BlY2lhbCBzeW1ib2xzIHN1Y2ggYXMgQGNvZGV7X2VuZH0gc2hvdWxkIGJlIGRlZmluZWQgd2hlbiBkb2luZwotYSBmaW5hbCBsaW5rLiAgTmF0dXJhbGx5LCB0aG9zZSBzeW1ib2xzIHNob3VsZCBub3QgYmUgZGVmaW5lZCB3aGVuIGRvaW5nCi1hIHJlbG9jYXRlYWJsZSBsaW5rIHVzaW5nIEBjb2Rley1yfS4gIFRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0Ci1jb3VsZCB1c2UgYSBjb25zdHJ1Y3QgbGlrZSB0aGlzIHRvIGRlZmluZSB0aG9zZSBzeW1ib2xzOgotQHNtYWxsZXhhbXBsZQotICAkQHtSRUxPQ0FUSU5HKyBfZW5kID0gLjtAfQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoaXMgd2lsbCBkbyB0aGUgc3ltYm9sIGFzc2lnbm1lbnQgb25seSBpZiB0aGUgQGNvZGV7UkVMT0NBVElOR30KLXZhcmlhYmxlIGlzIGRlZmluZWQuCi0KLVRoZSBiYXNpYyBqb2Igb2YgdGhlIGxpbmtlciBzY3JpcHQgaXMgdG8gcHV0IHRoZSBzZWN0aW9ucyBpbiB0aGUgY29ycmVjdAotb3JkZXIsIGFuZCBhdCB0aGUgY29ycmVjdCBtZW1vcnkgYWRkcmVzc2VzLiAgRm9yIHNvbWUgdGFyZ2V0cywgdGhlCi1saW5rZXIgc2NyaXB0IG1heSBoYXZlIHRvIGRvIHNvbWUgb3RoZXIgb3BlcmF0aW9ucy4KLQotRm9yIGV4YW1wbGUsIG9uIG1vc3QgTUlQUyBwbGF0Zm9ybXMsIHRoZSBsaW5rZXIgaXMgcmVzcG9uc2libGUgZm9yCi1kZWZpbmluZyB0aGUgc3BlY2lhbCBzeW1ib2wgQGNvZGV7X2dwfSwgdXNlZCB0byBpbml0aWFsaXplIHRoZQotQGNvZGV7JGdwfSByZWdpc3Rlci4gIEl0IG11c3QgYmUgc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgc21hbGwgZGF0YQotc2VjdGlvbiBwbHVzIEBjb2RlezB4ODAwMH0uICBOYXR1cmFsbHksIGl0IHNob3VsZCBvbmx5IGJlIGRlZmluZWQgd2hlbgotZG9pbmcgYSBmaW5hbCByZWxvY2F0aW9uLiAgVGhpcyB3aWxsIHR5cGljYWxseSBiZSBkb25lIGxpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLSAgJEB7UkVMT0NBVElORysgX2dwID0gQUxJR04oMTYpICsgMHg4MDAwO0B9Ci1AZW5kIHNtYWxsZXhhbXBsZQotVGhpcyBsaW5lIHdvdWxkIGFwcGVhciBqdXN0IGJlZm9yZSB0aGUgc2VjdGlvbnMgd2hpY2ggY29tcG9zZSB0aGUgc21hbGwKLWRhdGEgc2VjdGlvbiAoQHNhbXB7LnNkYXRhfSwgQHNhbXB7LnNic3N9KS4gIEFsbCB0aG9zZSBzZWN0aW9ucyB3b3VsZCBiZQotY29udGlndW91cyBpbiBtZW1vcnkuCi0KLU1hbnkgQ09GRiBzeXN0ZW1zIGJ1aWxkIGNvbnN0cnVjdG9yIHRhYmxlcyBpbiB0aGUgbGlua2VyIHNjcmlwdC4gIFRoZQotY29tcGlsZXIgd2lsbCBhcnJhbmdlIHRvIG91dHB1dCB0aGUgYWRkcmVzcyBvZiBlYWNoIGdsb2JhbCBjb25zdHJ1Y3RvcgotaW4gYSBAc2FtcHsuY3Rvcn0gc2VjdGlvbiwgYW5kIHRoZSBhZGRyZXNzIG9mIGVhY2ggZ2xvYmFsIGRlc3RydWN0b3IgaW4KLWEgQHNhbXB7LmR0b3J9IHNlY3Rpb24gKHRoaXMgaXMgZG9uZSBieSBkZWZpbmluZwotQGNvZGV7QVNNX09VVFBVVF9DT05TVFJVQ1RPUn0gYW5kIEBjb2Rle0FTTV9PVVRQVVRfREVTVFJVQ1RPUn0gaW4gdGhlCi1AY29kZXtnY2N9IGNvbmZpZ3VyYXRpb24gZmlsZXMpLiAgVGhlIEBjb2Rle2djY30gcnVudGltZSBzdXBwb3J0Ci1yb3V0aW5lcyBleHBlY3QgdGhlIGNvbnN0cnVjdG9yIHRhYmxlIHRvIGJlIG5hbWVkIEBjb2Rle19fQ1RPUl9MSVNUX199LgotVGhleSBleHBlY3QgaXQgdG8gYmUgYSBsaXN0IG9mIHdvcmRzLCB3aXRoIHRoZSBmaXJzdCB3b3JkIGJlaW5nIHRoZQotY291bnQgb2YgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgVGhlcmUgc2hvdWxkIGJlIGEgdHJhaWxpbmcgemVybyB3b3JkLgotKEFjdHVhbGx5LCB0aGUgY291bnQgbWF5IGJlIC0xIGlmIHRoZSB0cmFpbGluZyB3b3JkIGlzIHByZXNlbnQsIGFuZCB0aGUKLXRyYWlsaW5nIHdvcmQgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGNvdW50IGlzIGNvcnJlY3QsIGJ1dCwgYXMgdGhlCi1AY29kZXtnY2N9IGJlaGF2aW91ciBoYXMgY2hhbmdlZCBzbGlnaHRseSBvdmVyIHRoZSB5ZWFycywgaXQgaXMgc2FmZXN0Ci10byBwcm92aWRlIGJvdGgpLiAgSGVyZSBpcyBhIHR5cGljYWwgd2F5IHRoYXQgbWlnaHQgYmUgaGFuZGxlZCBpbiBhCi1AZmlsZXtzY3JpcHR0ZW1wbH0gZmlsZS4KLUBzbWFsbGV4YW1wbGUKLSAgICAkQHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuO0B9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKUB9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycylAfQotICAgICRAe0NPTlNUUlVDVElORysgTE9ORygwKUB9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBfX0NUT1JfRU5EX18gPSAuO0B9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBfX0RUT1JfTElTVF9fID0gLjtAfQotICAgICRAe0NPTlNUUlVDVElORysgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMilAfQotICAgICRAe0NPTlNUUlVDVElORysgKiguZHRvcnMpQH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrIExPTkcoMClAfQotICAgICRAe0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjtAfQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSB1c2Ugb2YgQGNvZGV7Q09OU1RSVUNUSU5HfSBlbnN1cmVzIHRoYXQgdGhlc2UgbGlua2VyIHNjcmlwdCBjb21tYW5kcwotd2lsbCBvbmx5IGFwcGVhciB3aGVuIHRoZSBsaW5rZXIgaXMgc3VwcG9zZWQgdG8gYmUgYnVpbGRpbmcgdGhlCi1jb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMuICBUaGlzIGV4YW1wbGUgaXMgd3JpdHRlbiBmb3IgYSB0YXJnZXQKLXdoaWNoIHVzZXMgNCBieXRlIHBvaW50ZXJzLgotCi1FbWJlZGRlZCBzeXN0ZW1zIG9mdGVuIG5lZWQgdG8gc2V0IGEgc3RhY2sgYWRkcmVzcy4gIFRoaXMgaXMgbm9ybWFsbHkKLWJlc3QgZG9uZSBieSB1c2luZyB0aGUgQGNvZGV7UFJPVklERX0gY29uc3RydWN0IHdpdGggYSBkZWZhdWx0IHN0YWNrCi1hZGRyZXNzLiAgVGhpcyBwZXJtaXRzIHRoZSB1c2VyIHRvIGVhc2lseSBvdmVycmlkZSB0aGUgc3RhY2sgYWRkcmVzcwotdXNpbmcgdGhlIEBjb2Rley0tZGVmc3ltfSBvcHRpb24uICBIZXJlIGlzIGFuIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi0gICRAe1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fc3RhY2sgPSAweDgwMDAwMDAwKTtAfQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIEBjb2Rle19fc3RhY2t9IHdvdWxkIHRoZW4gYmUgdXNlZCBpbiB0aGUgc3RhcnR1cAotY29kZSB0byBpbml0aWFsaXplIHRoZSBzdGFjayBwb2ludGVyLgotCi1Abm9kZSBsaW5rZXIgZW11bGF0aW9ucwotQHNlY3Rpb24gQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHRzCi0KLUVhY2ggbGlua2VyIHRhcmdldCB1c2VzIGFuIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IHRvIGdlbmVyYXRlIHRoZQotZW11bGF0aW9uIGNvZGUuICBUaGUgbmFtZSBvZiB0aGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgaXMgc2V0IGJ5IHRoZQotQGNvZGV7VEVNUExBVEVfTkFNRX0gdmFyaWFibGUgaW4gdGhlIEBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdC4gIElmIHRoZQotQGNvZGV7VEVNUExBVEVfTkFNRX0gdmFyaWFibGUgaXMgbm90IHNldCwgdGhlIGRlZmF1bHQgaXMKLUBzYW1we2dlbmVyaWN9LiAgSWYgdGhlIHZhbHVlIG9mIEBjb2Rle1RFTVBMQVRFX05BTUV9IGlzIEB2YXJ7dGVtcGxhdGV9LAotQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbCB1c2UgQGZpbGV7ZW11bHRlbXBsL0B2YXJ7dGVtcGxhdGV9LmVtfS4KLQotTW9zdCB0YXJnZXRzIHVzZSB0aGUgZ2VuZXJpYyBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCwKLUBmaWxle2VtdWx0ZW1wbC9nZW5lcmljLmVtfS4gIEEgZGlmZmVyZW50IEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IGlzCi1vbmx5IG5lZWRlZCBpZiB0aGUgbGlua2VyIG11c3Qgc3VwcG9ydCB1bnVzdWFsIGFjdGlvbnMsIHN1Y2ggYXMgbGlua2luZwotYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzLgotCi1UaGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgaXMgbm9ybWFsbHkgd3JpdHRlbiBhcyBhIHNpbXBsZSBpbnZvY2F0aW9uCi1vZiBAY29kZXtjYXR9IHdpdGggYSBoZXJlIGRvY3VtZW50LiAgVGhlIGRvY3VtZW50IHdpbGwgdXNlIGEgZmV3Ci12YXJpYWJsZSBzdWJzdGl0dXRpb25zLiAgVHlwaWNhbGx5IGVhY2ggZnVuY3Rpb24gbmFtZXMgdXNlcyBhCi1zdWJzdGl0dXRpb24gaW52b2x2aW5nIEBjb2Rle0VNVUxBVElPTl9OQU1FfSwgZm9yIGVhc2Ugb2YgZGVidWdnaW5nIHdoZW4KLXRoZSBsaW5rZXIgc3VwcG9ydHMgbXVsdGlwbGUgZW11bGF0aW9ucy4KLQotRXZlcnkgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGluIHRoZSBlbWl0dGVkIGZpbGUgc2hvdWxkIGJlIHN0YXRpYy4gIFRoZQotb25seSBnbG9iYWxseSB2aXNpYmxlIG9iamVjdCBtdXN0IGJlIG5hbWVkCi1AY29kZXtsZF9AdmFye0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb259LCB3aGVyZSBAdmFye0VNVUxBVElPTl9OQU1FfSBpcwotdGhlIG5hbWUgb2YgdGhlIGVtdWxhdGlvbiBzZXQgaW4gQGZpbGV7Y29uZmlndXJlLnRndH0gKHRoaXMgaXMgYWxzbyB0aGUKLW5hbWUgb2YgdGhlIEBmaWxle2VtdWxwYXJhbXN9IGZpbGUgd2l0aG91dCB0aGUgQGZpbGV7LnNofSBleHRlbnNpb24pLgotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB3aWxsIHNldCB0aGUgc2hlbGwgdmFyaWFibGUKLUBjb2Rle0VNVUxBVElPTl9OQU1FfSBiZWZvcmUgaW52b2tpbmcgdGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0LgotCi1UaGUgQGNvZGV7bGRfQHZhcntFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9ufSB2YXJpYWJsZSBtdXN0IGJlIGEKLUBjb2Rle3N0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3R9LCBhcyBkZWZpbmVkIGluIEBmaWxle2xkZW11bC5ofS4KLUl0IGRlZmluZXMgYSBzZXQgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlIGludm9rZWQgYnkgdGhlIGxpbmtlciwKLWFzIHdlbGwgYXMgc3RyaW5ncyBmb3IgdGhlIGVtdWxhdGlvbiBuYW1lIChub3JtYWxseSBzZXQgZnJvbSB0aGUgc2hlbGwKLXZhcmlhYmxlIEBjb2Rle0VNVUxBVElPTl9OQU1FfSBhbmQgdGhlIGRlZmF1bHQgQkZEIHRhcmdldCBuYW1lIChub3JtYWxseQotc2V0IGZyb20gdGhlIHNoZWxsIHZhcmlhYmxlIEBjb2Rle09VVFBVVF9GT1JNQVR9IHdoaWNoIGlzIG5vcm1hbGx5IHNldAotYnkgdGhlIEBmaWxle2VtdWxwYXJhbXN9IGZpbGUpLgotCi1UaGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHdpbGwgc2V0IHRoZSBzaGVsbCB2YXJpYWJsZQotQGNvZGV7Q09NUElMRV9JTn0gd2hlbiBpdCBpbnZva2VzIHRoZSBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCBmb3IgdGhlCi1kZWZhdWx0IGVtdWxhdGlvbi4gIEluIHRoaXMgY2FzZSwgdGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IHNob3VsZAotaW5jbHVkZSB0aGUgbGlua2VyIHNjcmlwdHMgZGlyZWN0bHksIGFuZCByZXR1cm4gdGhlbSBmcm9tIHRoZQotQGNvZGV7Z2V0X3NjcmlwdHN9IGVudHJ5IHBvaW50LiAgV2hlbiB0aGUgZW11bGF0aW9uIGlzIG5vdCB0aGUgZGVmYXVsdCwKLXRoZSBAY29kZXtnZXRfc2NyaXB0c30gZW50cnkgcG9pbnQgc2hvdWxkIGp1c3QgcmV0dXJuIGEgZmlsZSBuYW1lLiAgU2VlCi1AZmlsZXtlbXVsdGVtcGwvZ2VuZXJpYy5lbX0gZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRoaXMgaXMgZG9uZS4KLQotQXQgc29tZSBwb2ludCwgdGhlIGxpbmtlciBlbXVsYXRpb24gZW50cnkgcG9pbnRzIHNob3VsZCBiZSBkb2N1bWVudGVkLgotCi1Abm9kZSBFbXVsYXRpb24gV2Fsa3Rocm91Z2gKLUBjaGFwdGVyIEEgV2Fsa3Rocm91Z2ggb2YgYSBUeXBpY2FsIEVtdWxhdGlvbgotCi1UaGlzIGNoYXB0ZXIgaXMgdG8gaGVscCBwZW9wbGUgd2hvIGFyZSBuZXcgdG8gdGhlIHdheSBlbXVsYXRpb25zCi1pbnRlcmFjdCB3aXRoIHRoZSBsaW5rZXIsIG9yIHdobyBhcmUgc3VkZGVubHkgdGhydXN0IGludG8gdGhlIHBvc2l0aW9uCi1vZiBoYXZpbmcgdG8gd29yayB3aXRoIGV4aXN0aW5nIGVtdWxhdGlvbnMuICBJdCB3aWxsIGRpc2N1c3MgdGhlIGZpbGVzCi15b3UgbmVlZCB0byBiZSBhd2FyZSBvZi4gIEl0IHdpbGwgdGVsbCB5b3Ugd2hlbiB0aGUgZ2l2ZW4gImhvb2tzIiBpbgotdGhlIGVtdWxhdGlvbiB3aWxsIGJlIGNhbGxlZC4gIEl0IHdpbGwsIGhvcGVmdWxseSwgZ2l2ZSB5b3UgZW5vdWdoCi1pbmZvcm1hdGlvbiBhYm91dCB3aGVuIGFuZCBob3cgdGhpbmdzIGhhcHBlbiB0aGF0IHlvdSdsbCBiZSBhYmxlIHRvCi1nZXQgYnkuICBBcyBhbHdheXMsIHRoZSBzb3VyY2UgaXMgdGhlIGRlZmluaXRpdmUgcmVmZXJlbmNlIHRvIHRoaXMuCi0KLVRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIGxpbmtlciBpcyBpbiBAZmlsZXtsZG1haW4uY30gd2hlcmUKLUBjb2Rle21haW59IGlzIGRlZmluZWQuICBUaGUgYnVsayBvZiB0aGUgY29kZSB0aGF0J3MgZW11bGF0aW9uCi1zcGVjaWZpYyB3aWxsIGluaXRpYWxseSBiZSBpbiBAY29kZXtlbXVsdGVtcGwvQHZhcntlbXVsYXRpb259LmVtfSBidXQKLXdpbGwgZW5kIHVwIGluIEBjb2Rle2VAdmFye2VtdWxhdGlvbn0uY30gd2hlbiB0aGUgYnVpbGQgaXMgZG9uZS4KLU1vc3Qgb2YgdGhlIHdvcmsgdG8gc2VsZWN0IGFuZCBpbnRlcmZhY2Ugd2l0aCBlbXVsYXRpb25zIGlzIGluCi1AY29kZXtsZGVtdWwuaH0gYW5kIEBjb2Rle2xkZW11bC5jfS4gIFNwZWNpZmljYWxseSwgQGNvZGV7bGRlbXVsLmh9Ci1kZWZpbmVzIHRoZSBAY29kZXtsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3R9IHN0cnVjdHVyZSB5b3VyIGVtdWxhdGlvbgotZXhwb3J0cy4KLQotWW91ciBlbXVsYXRpb24gZmlsZSBleHBvcnRzIGEgc3ltYm9sCi1AY29kZXtsZF9AdmFye0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb259LiAgSWYgeW91ciBlbXVsYXRpb24gaXMKLXNlbGVjdGVkIChpdCB1c3VhbGx5IGlzLCBzaW5jZSB1c3VhbGx5IHRoZXJlJ3Mgb25seSBvbmUpLAotQGNvZGV7bGRlbXVsLmN9IHNldHMgdGhlIHZhcmlhYmxlIEB2YXJ7bGRfZW11bGF0aW9ufSB0byBwb2ludCB0byBpdC4KLUBjb2Rle2xkZW11bC5jfSBhbHNvIGRlZmluZXMgYSBudW1iZXIgb2YgQVBJIGZ1bmN0aW9ucyB0aGF0IGludGVyZmFjZQotdG8geW91ciBlbXVsYXRpb24sIGxpa2UgQGNvZGV7bGRlbXVsX2FmdGVyX3BhcnNlfSB3aGljaCBzaW1wbHkgY2FsbHMKLXlvdXIgQGNvZGV7bGRfQHZhcntFTVVMQVRJT059X2VtdWxhdGlvbi5hZnRlcl9wYXJzZX0gZnVuY3Rpb24uICBGb3IKLXRoZSByZXN0IG9mIHRoaXMgc2VjdGlvbiwgdGhlIGZ1bmN0aW9ucyB3aWxsIGJlIG1lbnRpb25lZCwgYnV0IHlvdQotc2hvdWxkIGFzc3VtZSB0aGUgaW5kaXJlY3QgcmVmZXJlbmNlIHRvIHlvdXIgZW11bGF0aW9uIGFsc28uCi0KLVdlIHdpbGwgYWxzbyBza2lwIG9yIGdsb3NzIG92ZXIgcGFydHMgb2YgdGhlIGxpbmsgcHJvY2VzcyB0aGF0IGRvbid0Ci1yZWxhdGUgdG8gZW11bGF0aW9ucywgbGlrZSBzZXR0aW5nIHVwIGludGVybmF0aW9uYWxpemF0aW9uLgotCi1BZnRlciBpbml0aWFsaXphdGlvbiwgQGNvZGV7bWFpbn0gc2VsZWN0cyBhbiBlbXVsYXRpb24gYnkgcHJlLXNjYW5uaW5nCi10aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIEl0IGNhbGxzIEBjb2Rle2xkZW11bF9jaG9vc2VfdGFyZ2V0fSB0bwotY2hvb3NlIGEgdGFyZ2V0LiAgSWYgeW91IHNldCBAY29kZXtjaG9vc2VfdGFyZ2V0fSB0bwotQGNvZGV7bGRlbXVsX2RlZmF1bHRfdGFyZ2V0fSwgaXQgcGlja3MgeW91ciBAY29kZXt0YXJnZXRfbmFtZX0gYnkKLWRlZmF1bHQuCi0KLUBjb2Rle21haW59IGNhbGxzIEBjb2Rle2xkZW11bF9iZWZvcmVfcGFyc2V9LCB0aGVuIEBjb2Rle3BhcnNlX2FyZ3N9LgotQGNvZGV7cGFyc2VfYXJnc30gY2FsbHMgQGNvZGV7bGRlbXVsX3BhcnNlX2FyZ3N9IGZvciBlYWNoIGFyZywgd2hpY2gKLW11c3QgdXBkYXRlIHRoZSBAY29kZXtnZXRvcHR9IGdsb2JhbHMgaWYgaXQgcmVjb2duaXplcyB0aGUgYXJndW1lbnQuCi1JZiB0aGUgZW11bGF0aW9uIGRvZXNuJ3QgcmVjb2duaXplIGl0LCB0aGVuIHBhcnNlX2FyZ3MgY2hlY2tzIHRvIHNlZQotaWYgaXQgcmVjb2duaXplcyBpdC4KLQotTm93IHRoYXQgdGhlIGVtdWxhdGlvbiBoYXMgaGFkIGFjY2VzcyB0byBhbGwgaXRzIGNvbW1hbmQtbGluZSBvcHRpb25zLAotQGNvZGV7bWFpbn0gY2FsbHMgQGNvZGV7bGRlbXVsX3NldF9zeW1ib2xzfS4gIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFueQotaW5pdGlhbGl6YXRpb24gdGhhdCBtYXkgYmUgYWZmZWN0ZWQgYnkgb3B0aW9ucy4gIEl0IGlzIGFsc28gc3VwcG9zZWQKLXRvIHNldCB1cCBhbnkgdmFyaWFibGVzIG5lZWRlZCBieSB0aGUgZW11bGF0aW9uIHNjcmlwdC4KLQotQGNvZGV7bWFpbn0gbm93IGNhbGxzIEBjb2Rle2xkZW11bF9nZXRfc2NyaXB0fSB0byBnZXQgdGhlIGVtdWxhdGlvbgotc2NyaXB0IHRvIHVzZSAoYmFzZWQgb24gYXJndW1lbnRzLCBubyBkb3VidCwgQHB4cmVme0VtdWxhdGlvbnN9KSBhbmQKLXJ1bnMgaXQuICBXaGlsZSBwYXJzaW5nLCBAY29kZXtsZGdyYW0ueX0gbWF5IGNhbGwgQGNvZGV7bGRlbXVsX2hsbH0gb3IKLUBjb2Rle2xkZW11bF9zeXNsaWJ9IHRvIGhhbmRsZSB0aGUgQGNvZGV7SExMfSBvciBAY29kZXtTWVNMSUJ9Ci1jb21tYW5kcy4gIEl0IG1heSBjYWxsIEBjb2Rle2xkZW11bF91bnJlY29nbml6ZWRfZmlsZX0gaWYgeW91IGFza2VkCi10aGUgbGlua2VyIHRvIGxpbmsgYSBmaWxlIGl0IGRvZXNuJ3QgcmVjb2duaXplLiAgSXQgd2lsbCBjYWxsCi1AY29kZXtsZGVtdWxfcmVjb2duaXplZF9maWxlfSBmb3IgZWFjaCBmaWxlIGl0IGRvZXMgcmVjb2duaXplLCBpbiBjYXNlCi10aGUgZW11bGF0aW9uIHdhbnRzIHRvIGhhbmRsZSBzb21lIGZpbGVzIHNwZWNpYWxseS4gIEFsbCB0aGUgd2hpbGUsCi1pdCdzIGxvYWRpbmcgdGhlIGZpbGVzIChwb3NzaWJseSBjYWxsaW5nCi1AY29kZXtsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmV9KSBhbmQgc3ltYm9scyBhbmQgc3R1ZmYuICBBZnRlciBpdCdzCi1kb25lIHJlYWRpbmcgdGhlIHNjcmlwdCwgQGNvZGV7bWFpbn0gY2FsbHMgQGNvZGV7bGRlbXVsX2FmdGVyX3BhcnNlfS4KLVVzZSB0aGUgYWZ0ZXItcGFyc2UgaG9vayB0byBzZXQgdXAgYW55dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHN0dWZmIHRoZQotc2NyaXB0IG1pZ2h0IGhhdmUgc2V0IHVwLCBsaWtlIHRoZSBlbnRyeSBwb2ludC4KLQotQGNvZGV7bWFpbn0gbmV4dCBjYWxscyBAY29kZXtsYW5nX3Byb2Nlc3N9IGluIEBjb2Rle2xkbGFuZy5jfS4gIFRoaXMKLWFwcGVhcnMgdG8gYmUgdGhlIG1haW4gY29yZSBvZiB0aGUgbGlua2luZyBpdHNlbGYsIGFzIGZhciBhcyBlbXVsYXRpb24KLWhvb2tzIGFyZSBjb25jZXJuZWQoKikuICBJdCBmaXJzdCBvcGVucyB0aGUgb3V0cHV0IGZpbGUncyBCRkQsIGNhbGxpbmcKLUBjb2Rle2xkZW11bF9zZXRfb3V0cHV0X2FyY2h9LCBhbmQgY2FsbHMKLUBjb2Rle2xkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50c30gaW4gY2FzZSB5b3UgbmVlZCB0byB1c2UKLW90aGVyIG1lYW5zIHRvIGZpbmQgb3IgY3JlYXRlIG9iamVjdCBmaWxlcyAoaS5lLiBzaGFyZWQgbGlicmFyaWVzCi1mb3VuZCBvbiBhIHBhdGgsIG9yIGZha2Ugc3R1YiBvYmplY3RzKS4gIERlc3BpdGUgdGhlIG5hbWUsIG5vYm9keQotY3JlYXRlcyBvdXRwdXQgc2VjdGlvbnMgaGVyZS4KLQotKCopIEluIG1vc3QgY2FzZXMsIHRoZSBCRkQgbGlicmFyeSBkb2VzIHRoZSBidWxrIG9mIHRoZSBhY3R1YWwKLWxpbmtpbmcsIGhhbmRsaW5nIHN5bWJvbCB0YWJsZXMsIHN5bWJvbCByZXNvbHV0aW9uLCByZWxvY2F0aW9ucywgYW5kCi1idWlsZGluZyB0aGUgZmluYWwgb3V0cHV0IGZpbGUuICBTZWUgdGhlIEJGRCByZWZlcmVuY2UgZm9yIGFsbCB0aGUKLWRldGFpbHMuICBZb3VyIGVtdWxhdGlvbiBpcyB1c3VhbGx5IGNvbmNlcm5lZCBtb3JlIHdpdGggbWFuYWdpbmcKLXRoaW5ncyBhdCB0aGUgZmlsZSBhbmQgc2VjdGlvbiBsZXZlbCwgbGlrZSAicHV0IHRoaXMgaGVyZSwgYWRkIHRoaXMKLXNlY3Rpb24iLCBldGMuCi0KLU5leHQsIHRoZSBvYmplY3RzIHRvIGJlIGxpbmtlZCBhcmUgb3BlbmVkIGFuZCBCRkRzIGNyZWF0ZWQgZm9yIHRoZW0sCi1hbmQgQGNvZGV7bGRlbXVsX2FmdGVyX29wZW59IGlzIGNhbGxlZC4gIEF0IHRoaXMgcG9pbnQsIHlvdSBoYXZlIGFsbAotdGhlIG9iamVjdHMgYW5kIHN5bWJvbHMgbG9hZGVkLCBidXQgbm9uZSBvZiB0aGUgZGF0YSBoYXMgYmVlbiBwbGFjZWQKLXlldC4KLQotTmV4dCBjb21lcyB0aGUgQmlnIExpbmtpbmcgVGhpbmd5IChleGNlcHQgZm9yIHRoZSBwYXJ0cyBCRkQgZG9lcykuCi1BbGwgaW5wdXQgc2VjdGlvbnMgYXJlIG1hcHBlZCB0byBvdXRwdXQgc2VjdGlvbnMgYWNjb3JkaW5nIHRvIHRoZQotc2NyaXB0LiAgSWYgYSBzZWN0aW9uIGRvZXNuJ3QgZ2V0IG1hcHBlZCBieSBkZWZhdWx0LAotQGNvZGV7bGRlbXVsX3BsYWNlX29ycGhhbn0gd2lsbCBnZXQgY2FsbGVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgaXQgZ29lcy4KLU5leHQgaXQgZmlndXJlcyBvdXQgdGhlIG9mZnNldHMgZm9yIGVhY2ggc2VjdGlvbiwgY2FsbGluZwotQGNvZGV7bGRlbXVsX2JlZm9yZV9hbGxvY2F0aW9ufSBiZWZvcmUgYW5kCi1AY29kZXtsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbn0gYWZ0ZXIgZGVjaWRpbmcgd2hlcmUgZWFjaCBpbnB1dCBzZWN0aW9uCi1lbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbnMuCi0KLVRoZSBsYXN0IHBhcnQgb2YgQGNvZGV7bGFuZ19wcm9jZXNzfSBpcyB0byBmaWd1cmUgb3V0IGFsbCB0aGUgc3ltYm9scycKLXZhbHVlcy4gIEFmdGVyIGFzc2lnbmluZyBmaW5hbCB2YWx1ZXMgdG8gdGhlIHN5bWJvbHMsCi1AY29kZXtsZGVtdWxfZmluaXNofSBpcyBjYWxsZWQsIGFuZCBhZnRlciB0aGF0LCBhbnkgdW5kZWZpbmVkIHN5bWJvbHMKLWFyZSB0dXJuZWQgaW50byBmYXRhbCBlcnJvcnMuCi0KLU9LLCBiYWNrIHRvIEBjb2Rle21haW59LCB3aGljaCBjYWxscyBAY29kZXtsZHdyaXRlfSBpbgotQGZpbGV7bGR3cml0ZS5jfS4gIEBjb2Rle2xkd3JpdGV9IGNhbGxzIEJGRCdzIGZpbmFsX2xpbmssIHdoaWNoIGRvZXMKLWFsbCB0aGUgcmVsb2NhdGlvbiBmaXh1cHMgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IGJmZCB0byBkaXNrLCBhbmQgd2UncmUKLWRvbmUuCi0KLUluIHN1bW1hcnksCi0KLUBpdGVtaXplIEBidWxsZXQKLQotQGl0ZW0gQGNvZGV7bWFpbigpfSBpbiBAZmlsZXtsZG1haW4uY30KLUBpdGVtIEBmaWxle2VtdWx0ZW1wbC9AdmFye0VNVUxBVElPTn0uZW19IGhhcyB5b3VyIGNvZGUKLUBpdGVtIEBjb2Rle2xkZW11bF9jaG9vc2VfdGFyZ2V0fSAoZGVmYXVsdHMgdG8geW91ciBAY29kZXt0YXJnZXRfbmFtZX0pCi1AaXRlbSBAY29kZXtsZGVtdWxfYmVmb3JlX3BhcnNlfQotQGl0ZW0gUGFyc2UgYXJndiwgY2FsbHMgQGNvZGV7bGRlbXVsX3BhcnNlX2FyZ3N9IGZvciBlYWNoCi1AaXRlbSBAY29kZXtsZGVtdWxfc2V0X3N5bWJvbHN9Ci1AaXRlbSBAY29kZXtsZGVtdWxfZ2V0X3NjcmlwdH0KLUBpdGVtIHBhcnNlIHNjcmlwdAotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbSBtYXkgY2FsbCBAY29kZXtsZGVtdWxfaGxsfSBvciBAY29kZXtsZGVtdWxfc3lzbGlifQotQGl0ZW0gbWF5IGNhbGwgQGNvZGV7bGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlfQotQGVuZCBpdGVtaXplCi0KLUBpdGVtIEBjb2Rle2xkZW11bF9hZnRlcl9wYXJzZX0KLUBpdGVtIEBjb2Rle2xhbmdfcHJvY2VzcygpfSBpbiBAZmlsZXtsZGxhbmcuY30KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0gY3JlYXRlIEBjb2Rle291dHB1dF9iZmR9Ci1AaXRlbSBAY29kZXtsZGVtdWxfc2V0X291dHB1dF9hcmNofQotQGl0ZW0gQGNvZGV7bGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzfQotQGl0ZW0gcmVhZCBvYmplY3RzLCBjcmVhdGUgaW5wdXQgYmZkcyAtIGFsbCBzeW1ib2xzIGV4aXN0LCBidXQgaGF2ZSBubyB2YWx1ZXMKLUBpdGVtIG1heSBjYWxsIEBjb2Rle2xkZW11bF91bnJlY29nbml6ZWRfZmlsZX0KLUBpdGVtIHdpbGwgY2FsbCBAY29kZXtsZGVtdWxfcmVjb2duaXplZF9maWxlfQotQGl0ZW0gQGNvZGV7bGRlbXVsX2FmdGVyX29wZW59Ci1AaXRlbSBtYXAgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zCi1AaXRlbSBtYXkgY2FsbCBAY29kZXtsZGVtdWxfcGxhY2Vfb3JwaGFufSBmb3IgcmVtYWluaW5nIHNlY3Rpb25zCi1AaXRlbSBAY29kZXtsZGVtdWxfYmVmb3JlX2FsbG9jYXRpb259Ci1AaXRlbSBnaXZlcyBpbnB1dCBzZWN0aW9ucyBvZmZzZXRzIGludG8gb3V0cHV0IHNlY3Rpb25zLCBwbGFjZXMgb3V0cHV0IHNlY3Rpb25zCi1AaXRlbSBAY29kZXtsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbn0gLSBzZWN0aW9uIGFkZHJlc3NlcyB2YWxpZAotQGl0ZW0gYXNzaWducyB2YWx1ZXMgdG8gc3ltYm9scwotQGl0ZW0gQGNvZGV7bGRlbXVsX2ZpbmlzaH0gLSBzeW1ib2wgdmFsdWVzIHZhbGlkCi1AZW5kIGl0ZW1pemUKLQotQGl0ZW0gb3V0cHV0IGJmZCBpcyB3cml0dGVuIHRvIGRpc2sKLQotQGVuZCBpdGVtaXplCi0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvbGQvbGRsYW5nLmMgYi9sZC9sZGxhbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwM2I0Ny4uMDAwMDAwMAotLS0gYS9sZC9sZGxhbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5MjYgKzAsMCBAQAotLyogTGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2Ugc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImZubWF0Y2guaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogRk9SV0FSRFMgKi8KLXN0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpuZXdfc3RhdGVtZW50IFBBUkFNUyAoKGVudW0gc3RhdGVtZW50X2VudW0sCi0JCQkJCQkJIHNpemVfdCwKLQkJCQkJCQkgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlKikpOwotCi0KLS8qIExPQ0FMUyAqLwotc3RhdGljIHN0cnVjdCBvYnN0YWNrIHN0YXRfb2JzdGFjazsKLQotI2RlZmluZSBvYnN0YWNrX2NodW5rX2FsbG9jIHhtYWxsb2MKLSNkZWZpbmUgb2JzdGFja19jaHVua19mcmVlIGZyZWUKLXN0YXRpYyBDT05TVCBjaGFyICpzdGFydHVwX2ZpbGU7Ci1zdGF0aWMgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGlucHV0X2ZpbGVfY2hhaW47Ci1zdGF0aWMgYm9vbGVhbiBwbGFjZWRfY29tbW9ucyA9IGZhbHNlOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmRlZmF1bHRfY29tbW9uX3NlY3Rpb247Ci1zdGF0aWMgYm9vbGVhbiBtYXBfb3B0aW9uX2Y7Ci1zdGF0aWMgYmZkX3ZtYSBwcmludF9kb3Q7Ci1zdGF0aWMgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlyc3RfZmlsZTsKLXN0YXRpYyBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci1zdGF0aWMgQ09OU1QgY2hhciAqY3VycmVudF90YXJnZXQ7Ci1zdGF0aWMgQ09OU1QgY2hhciAqb3V0cHV0X3RhcmdldDsKLXN0YXRpYyBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgc3RhdGVtZW50X2xpc3Q7Ci1zdGF0aWMgc3RydWN0IGxhbmdfcGhkciAqbGFuZ19waGRyX2xpc3Q7Ci0KLXN0YXRpYyB2b2lkIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlcgotICBQQVJBTVMgKCh2b2lkICgqZnVuYykgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiksCi0JICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcykpOwotc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKm5ld19hZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBsYW5nX2lucHV0X2ZpbGVfZW51bV90eXBlIGZpbGVfdHlwZSwKLQkgICBjb25zdCBjaGFyICp0YXJnZXQsIGJvb2xlYW4gYWRkX3RvX2xpc3QpKTsKLXN0YXRpYyB2b2lkIGluaXRfb3MgUEFSQU1TICgobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqcykpOwotc3RhdGljIHZvaWQgZXhwX2luaXRfb3MgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBzZWN0aW9uX2FscmVhZHlfbGlua2VkIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmFscmVhZHlfbGlua2VkX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOwotc3RhdGljIHZvaWQgYWxyZWFkeV9saW5rZWRfdGFibGVfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBhbHJlYWR5X2xpbmtlZF90YWJsZV9mcmVlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIHdpbGRjYXJkcCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICp3aWxkX3NvcnQKLSAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwKLQkgICBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqbG9va3VwX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotc3RhdGljIHZvaWQgbG9hZF9zeW1ib2xzIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5LAotCQkJCSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICopKTsKLXN0YXRpYyB2b2lkIHdpbGQgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpzLAotCQkJICBjb25zdCBjaGFyICpzZWN0aW9uLCBjb25zdCBjaGFyICpmaWxlLAotCQkJICBjb25zdCBjaGFyICp0YXJnZXQsCi0JCQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dCkpOwotc3RhdGljIGJmZCAqb3Blbl9vdXRwdXQgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotc3RhdGljIHZvaWQgbGRsYW5nX29wZW5fb3V0cHV0IFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnN0YXRlbWVudCkpOwotc3RhdGljIHZvaWQgb3Blbl9pbnB1dF9iZmRzCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnN0YXRlbWVudCwgYm9vbGVhbikpOwotc3RhdGljIHZvaWQgbGFuZ19yZWFzb25hYmxlX2RlZmF1bHRzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfcGxhY2VfdW5kZWZpbmVkcyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnMsCi0JICAgY29uc3QgY2hhciAqdGFyZ2V0LAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCkpOwotc3RhdGljIHZvaWQgcHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0gIFBBUkFNUyAoKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCkpOwotc3RhdGljIHZvaWQgcHJpbnRfYXNzaWdubWVudAotICBQQVJBTVMgKChsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKmFzc2lnbm1lbnQsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb24pKTsKLXN0YXRpYyB2b2lkIHByaW50X2lucHV0X3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzdGF0bSkpOwotc3RhdGljIGJvb2xlYW4gcHJpbnRfb25lX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHByaW50X2lucHV0X3NlY3Rpb24gUEFSQU1TICgobGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmluKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9maWxsX3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX2ZpbGxfc3RhdGVtZW50X3R5cGUgKmZpbGwpKTsKLXN0YXRpYyB2b2lkIHByaW50X2RhdGFfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfZGF0YV9zdGF0ZW1lbnRfdHlwZSAqZGF0YSkpOwotc3RhdGljIHZvaWQgcHJpbnRfYWRkcmVzc19zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIHByaW50X3JlbG9jX3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpyZWxvYykpOwotc3RhdGljIHZvaWQgcHJpbnRfcGFkZGluZ19zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlICpzKSk7Ci1zdGF0aWMgdm9pZCBwcmludF93aWxkX3N0YXRlbWVudAotICBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKncsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MpKTsKLXN0YXRpYyB2b2lkIHByaW50X2dyb3VwCi0gIFBBUkFNUyAoKGxhbmdfZ3JvdXBfc3RhdGVtZW50X3R5cGUgKiwgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcywKLQkJCQkgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGF0ZW1lbnRfbGlzdCBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzLAotCQkJCQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGF0ZW1lbnRzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBiZmRfdm1hIGluc2VydF9wYWQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnRoaXNfcHRyLAotCQkJCSAgIGZpbGxfdHlwZSBmaWxsLCB1bnNpZ25lZCBpbnQgcG93ZXIsCi0JCQkJICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICBiZmRfdm1hIGRvdCkpOwotc3RhdGljIGJmZF92bWEgc2l6ZV9pbnB1dF9zZWN0aW9uCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKip0aGlzX3B0ciwKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JICAgZmlsbF90eXBlIGZpbGwsIGJmZF92bWEgZG90LCBib29sZWFuIHJlbGF4KSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBpZ25vcmVfYmZkX2Vycm9ycyBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotc3RhdGljIHZvaWQgbGFuZ19jaGVjayBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2NvbW1vbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBsYW5nX29uZV9jb21tb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX3BsYWNlX29ycGhhbnMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCB0b3Bvd2VyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbGFuZ19zZXRfc3RhcnRvZiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCByZXNldF9tZW1vcnlfcmVnaW9ucyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX3JlY29yZF9waGRycyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2djX3dpbGQKLSAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2djX3NlY3Rpb25zXzEgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2djX3NlY3Rpb25zIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbGFuZ19jaGVja19zZWN0aW9uX2FkZHJlc3NlcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXR5cGVkZWYgdm9pZCAoKmNhbGxiYWNrX3QpIFBBUkFNUyAoKGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqLAotCQkJCSAgICBhc2VjdGlvbiAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosCi0JCQkJICAgIHZvaWQgKikpOwotc3RhdGljIHZvaWQgd2Fsa193aWxkX3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGNvbnN0IGNoYXIgKiwKLQkgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGNhbGxiYWNrX3QsIHZvaWQgKikpOwotc3RhdGljIHZvaWQgd2Fsa193aWxkX2ZpbGUKLSAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGNvbnN0IGNoYXIgKiwKLQkgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGNhbGxiYWNrX3QsIHZvaWQgKikpOwotCi1zdGF0aWMgaW50ICAgIGdldF90YXJnZXQgUEFSQU1TICgoY29uc3QgYmZkX3RhcmdldCAqLCB2b2lkICopKTsKLXN0YXRpYyB2b2lkICAgc3RyaWNweSBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOwotc3RhdGljIHZvaWQgICBzdHJjdXQgUEFSQU1TICgoY2hhciAqLCBjaGFyICopKTsKLXN0YXRpYyBpbnQgICAgbmFtZV9jb21wYXJlIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7Ci1zdGF0aWMgaW50ICAgIGNsb3Nlc3RfdGFyZ2V0X21hdGNoIFBBUkFNUyAoKGNvbnN0IGJmZF90YXJnZXQgKiwgdm9pZCAqKSk7Ci1zdGF0aWMgY2hhciAqIGdldF9maXJzdF9pbnB1dF90YXJnZXQgUEFSQU1TICgodm9pZCkpOwotCQkJCQkKLS8qIEVYUE9SVFMgKi8KLWxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmFic19vdXRwdXRfc2VjdGlvbjsKLWxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqc3RhdF9wdHIgPSAmc3RhdGVtZW50X2xpc3Q7Ci1sYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgZmlsZV9jaGFpbiA9IHsgTlVMTCwgTlVMTCB9OwotY29uc3QgY2hhciAqZW50cnlfc3ltYm9sID0gTlVMTDsKLWJvb2xlYW4gZW50cnlfZnJvbV9jbWRsaW5lOwotYm9vbGVhbiBsYW5nX2hhc19pbnB1dF9maWxlID0gZmFsc2U7Ci1ib29sZWFuIGhhZF9vdXRwdXRfZmlsZW5hbWUgPSBmYWxzZTsKLWJvb2xlYW4gbGFuZ19mbG9hdF9mbGFnID0gZmFsc2U7Ci1ib29sZWFuIGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlID0gZmFsc2U7Ci1zdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbm9jcm9zc3JlZl9saXN0OwotCi1ldHJlZV90eXBlICpiYXNlOyAvKiBSZWxvY2F0aW9uIGJhc2UgLSBvciBudWxsICovCi0KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi0jZGVmaW5lIGNhdChhLGIpIGEjI2IKLSNlbHNlCi0jZGVmaW5lIGNhdChhLGIpIGEvKiovYgotI2VuZGlmCi0KLSNkZWZpbmUgbmV3X3N0YXQoeCx5KSAoY2F0KHgsX3R5cGUpKikgbmV3X3N0YXRlbWVudChjYXQoeCxfZW51bSksIHNpemVvZihjYXQoeCxfdHlwZSkpLHkpCi0KLSNkZWZpbmUgb3V0c2lkZV9zZWN0aW9uX2FkZHJlc3MocSkgKCAocSktPm91dHB1dF9vZmZzZXQgKyAocSktPm91dHB1dF9zZWN0aW9uLT52bWEpCi0KLSNkZWZpbmUgb3V0c2lkZV9zeW1ib2xfYWRkcmVzcyhxKSAoKHEpLT52YWx1ZSArICAgb3V0c2lkZV9zZWN0aW9uX2FkZHJlc3MocS0+c2VjdGlvbikpCi0KLSNkZWZpbmUgU0VDVElPTl9OQU1FX01BUF9MRU5HVEggKDE2KQotCi1QVFIKLXN0YXRfYWxsb2MgKHNpemUpCi0gICAgIHNpemVfdCBzaXplOwotewotICByZXR1cm4gb2JzdGFja19hbGxvYyAoJnN0YXRfb2JzdGFjaywgc2l6ZSk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBHZW5lcmljIHRyYXZlcnNhbCByb3V0aW5lcyBmb3IgZmluZGluZyBtYXRjaGluZyBzZWN0aW9ucy4KLSovCi0KLXN0YXRpYyB2b2lkCi13YWxrX3dpbGRfc2VjdGlvbiAocHRyLCBzZWN0aW9uLCBmaWxlLCBjYWxsYmFjaywgZGF0YSkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpwdHI7Ci0gICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIGNhbGxiYWNrX3QgY2FsbGJhY2s7Ci0gICAgIHZvaWQgKmRhdGE7Ci17Ci0gIC8qIERvbid0IHByb2Nlc3Mgc2VjdGlvbnMgZnJvbSBmaWxlcyB3aGljaCB3ZXJlIGV4Y2x1ZGVkLiAqLwotICBpZiAocHRyLT5leGNsdWRlX2ZpbGVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgYm9vbGVhbiBtYXRjaDsKLQotICAgICAgaWYgKHdpbGRjYXJkcCAocHRyLT5leGNsdWRlX2ZpbGVuYW1lKSkKLSAgICAgICAgIG1hdGNoID0gZm5tYXRjaCAocHRyLT5leGNsdWRlX2ZpbGVuYW1lLCBmaWxlLT5maWxlbmFtZSwgMCkgPT0gMCA/IHRydWUgOiBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgIG1hdGNoID0gc3RyY21wIChwdHItPmV4Y2x1ZGVfZmlsZW5hbWUsIGZpbGUtPmZpbGVuYW1lKSA9PSAwID8gdHJ1ZSA6IGZhbHNlOwotCi0gICAgICBpZiAobWF0Y2gpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGZpbGUtPmp1c3Rfc3ltc19mbGFnID09IGZhbHNlKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICAgICAgYm9vbGVhbiB3aWxkY2FyZDsKLQotICAgICAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKLQl3aWxkY2FyZCA9IGZhbHNlOwotICAgICAgZWxzZQotCXdpbGRjYXJkID0gd2lsZGNhcmRwIChzZWN0aW9uKTsKLQotICAgICAgZm9yIChzID0gZmlsZS0+dGhlX2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgYm9vbGVhbiBtYXRjaDsKLQotCSAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKLQkgICAgbWF0Y2ggPSB0cnVlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZmlsZS0+dGhlX2JmZCwgcyk7Ci0JICAgICAgaWYgKHdpbGRjYXJkKQotCQltYXRjaCA9IGZubWF0Y2ggKHNlY3Rpb24sIG5hbWUsIDApID09IDAgPyB0cnVlIDogZmFsc2U7Ci0JICAgICAgZWxzZQotCQltYXRjaCA9IHN0cmNtcCAoc2VjdGlvbiwgbmFtZSkgPT0gMCA/IHRydWUgOiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAobWF0Y2gpCi0JICAgICgqY2FsbGJhY2spIChwdHIsIHMsIGZpbGUsIGRhdGEpOwotCX0KLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSBhIHdpbGQgc3RhdGVtZW50IGZvciBhIHNpbmdsZSBmaWxlIEYuICAqLwotCi1zdGF0aWMgdm9pZAotd2Fsa193aWxkX2ZpbGUgKHMsIHNlY3Rpb24sIGYsIGNhbGxiYWNrLCBkYXRhKQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnM7Ci0gICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmY7Ci0gICAgIGNhbGxiYWNrX3QgY2FsbGJhY2s7Ci0gICAgIHZvaWQgKmRhdGE7Ci17Ci0gIGlmIChmLT50aGVfYmZkID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX2NoZWNrX2Zvcm1hdCAoZi0+dGhlX2JmZCwgYmZkX2FyY2hpdmUpKQotICAgIHdhbGtfd2lsZF9zZWN0aW9uIChzLCBzZWN0aW9uLCBmLCBjYWxsYmFjaywgZGF0YSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmQgKm1lbWJlcjsKLQotICAgICAgLyogVGhpcyBpcyBhbiBhcmNoaXZlIGZpbGUuICBXZSBtdXN0IG1hcCBlYWNoIG1lbWJlciBvZiB0aGUKLQkgYXJjaGl2ZSBzZXBhcmF0ZWx5LiAgKi8KLSAgICAgIG1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGYtPnRoZV9iZmQsIChiZmQgKikgTlVMTCk7Ci0gICAgICB3aGlsZSAobWVtYmVyICE9IE5VTEwpCi0JewotCSAgLyogV2hlbiBsb29rdXBfbmFtZSBpcyBjYWxsZWQsIGl0IHdpbGwgY2FsbCB0aGUgYWRkX3N5bWJvbHMKLQkgICAgIGVudHJ5IHBvaW50IGZvciB0aGUgYXJjaGl2ZS4gIEZvciBlYWNoIGVsZW1lbnQgb2YgdGhlCi0JICAgICBhcmNoaXZlIHdoaWNoIGlzIGluY2x1ZGVkLCBCRkQgd2lsbCBjYWxsIGxkbGFuZ19hZGRfZmlsZSwKLQkgICAgIHdoaWNoIHdpbGwgc2V0IHRoZSB1c3JkYXRhIGZpZWxkIG9mIHRoZSBtZW1iZXIgdG8gdGhlCi0JICAgICBsYW5nX2lucHV0X3N0YXRlbWVudC4gICovCi0JICBpZiAobWVtYmVyLT51c3JkYXRhICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB3YWxrX3dpbGRfc2VjdGlvbiAocywgc2VjdGlvbiwKLQkJCQkgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgbWVtYmVyLT51c3JkYXRhLAotCQkJCSBjYWxsYmFjaywgZGF0YSk7Ci0JICAgIH0KLQotCSAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZi0+dGhlX2JmZCwgbWVtYmVyKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotd2Fsa193aWxkIChzLCBzZWN0aW9uLCBmaWxlLCBjYWxsYmFjaywgZGF0YSkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpzOwotICAgICBjb25zdCBjaGFyICpzZWN0aW9uOwotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICBjYWxsYmFja190IGNhbGxiYWNrOwotICAgICB2b2lkICpkYXRhOwotewotICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFBlcmZvcm0gdGhlIGl0ZXJhdGlvbiBvdmVyIGFsbCBmaWxlcyBpbiB0aGUgbGlzdC4gICovCi0gICAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoZikKLQl7Ci0JICB3YWxrX3dpbGRfZmlsZSAocywgc2VjdGlvbiwgZiwgY2FsbGJhY2ssIGRhdGEpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHdpbGRjYXJkcCAoZmlsZSkpCi0gICAgewotICAgICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGYpCi0JewotCSAgaWYgKGZubWF0Y2ggKGZpbGUsIGYtPmZpbGVuYW1lLCBGTk1fRklMRV9OQU1FKSA9PSAwKQotCSAgICB3YWxrX3dpbGRfZmlsZSAocywgc2VjdGlvbiwgZiwgY2FsbGJhY2ssIGRhdGEpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmOwotCi0gICAgICAvKiBQZXJmb3JtIHRoZSBpdGVyYXRpb24gb3ZlciBhIHNpbmdsZSBmaWxlLiAgKi8KLSAgICAgIGYgPSBsb29rdXBfbmFtZSAoZmlsZSk7Ci0gICAgICB3YWxrX3dpbGRfZmlsZSAocywgc2VjdGlvbiwgZiwgY2FsbGJhY2ssIGRhdGEpOwotICAgIH0KLX0gIAotICAgICAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCB3YWxrcyB0aGUgcGFyc2UgdHJlZSBhbmQgY2FsbHMgdGhlIHByb3ZpZGVkCi0gIGZ1bmN0aW9uIGZvciBlYWNoIG5vZGUKLSovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIgKGZ1bmMsIHMpCi0gICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgZnVuYyAocyk7Ci0KLSAgICAgIHN3aXRjaCAocy0+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+bmFtZS5uYW1lKTsKLQkgICAgaWYgKG9zICE9IE5VTEwgJiYgb3MtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgICAgaW5pdF9vcyAob3MpOwotCSAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLS8qIFNlY3Rpb25zIG1hcmtlZCB3aXRoIHRoZSBTRUNfTElOS19PTkNFIGZsYWcgc2hvdWxkIG9ubHkgYmUgbGlua2VkCi0gICBvbmNlIGludG8gdGhlIG91dHB1dC4gIFRoaXMgcm91dGluZSBjaGVja3MgZWFjaCBzZWN0aW9uLCBhbmQKLSAgIGFycmFuZ2UgdG8gZGlzY2FyZCBpdCBpZiBhIHNlY3Rpb24gb2YgdGhlIHNhbWUgbmFtZSBoYXMgYWxyZWFkeQotICAgYmVlbiBsaW5rZWQuICBJZiB0aGUgc2VjdGlvbiBoYXMgQ09NREFUIGluZm9ybWF0aW9uLCB0aGVuIGl0IHVzZXMKLSAgIHRoYXQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHNlY3Rpb24gc2hvdWxkIGJlIGluY2x1ZGVkLiAgVGhpcyBjb2RlCi0gICBhc3N1bWVzIHRoYXQgYWxsIHJlbGV2YW50IHNlY3Rpb25zIGhhdmUgdGhlIFNFQ19MSU5LX09OQ0UgZmxhZyBzZXQ7Ci0gICB0aGF0IGlzLCBpdCBkb2VzIG5vdCBkZXBlbmQgc29sZWx5IHVwb24gdGhlIHNlY3Rpb24gbmFtZS4KLSAgIHNlY3Rpb25fYWxyZWFkeV9saW5rZWQgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi0vKiBUaGlzIGlzIHRoZSBzaGFwZSBvZiB0aGUgZWxlbWVudHMgaW5zaWRlIHRoZSBhbHJlYWR5X2xpbmtlZCBoYXNoCi0gICB0YWJsZS4gSXQgbWFwcyBhIG5hbWUgb250byBhIGxpc3Qgb2YgYWxyZWFkeV9saW5rZWQgZWxlbWVudHMgd2l0aAotICAgdGhlIHNhbWUgbmFtZS4gIEl0J3MgcG9zc2libGUgdG8gZ2V0IG1vcmUgdGhhbiBvbmUgZWxlbWVudCBpbiBhCi0gICBsaXN0IGlmIHRoZSBDT01EQVQgc2VjdGlvbnMgaGF2ZSBkaWZmZXJlbnQgbmFtZXMuICAqLwotCi1zdHJ1Y3QgYWxyZWFkeV9saW5rZWRfaGFzaF9lbnRyeSAKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIHN0cnVjdCBhbHJlYWR5X2xpbmtlZCAqZW50cnk7Ci19OwotCi1zdHJ1Y3QgYWxyZWFkeV9saW5rZWQgCi17Ci0gIHN0cnVjdCBhbHJlYWR5X2xpbmtlZCAqbmV4dDsKLSAgYXNlY3Rpb24gKnNlYzsKLX07Ci0KLS8qIFRoZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF90YWJsZSBhbHJlYWR5X2xpbmtlZF90YWJsZTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCAoYWJmZCwgc2VjLCBkYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeSA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGRhdGE7Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBjb25zdCBjaGFyICpuYW1lOwotICBzdHJ1Y3QgYWxyZWFkeV9saW5rZWQgKmw7Ci0gIHN0cnVjdCBhbHJlYWR5X2xpbmtlZF9oYXNoX2VudHJ5ICphbHJlYWR5X2xpbmtlZF9saXN0OwotCi0gIC8qIElmIHdlIGFyZSBvbmx5IHJlYWRpbmcgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0LCB0aGVuIHdlIHdhbnQgdG8KLSAgICAgZGlzY2FyZCBhbGwgc2VjdGlvbnMuICAqLwotICBpZiAoZW50cnktPmp1c3Rfc3ltc19mbGFnKQotICAgIHsKLSAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgc2VjLT5vdXRwdXRfb2Zmc2V0ID0gc2VjLT52bWE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpOwotCi0gIGlmICgoZmxhZ3MgJiBTRUNfTElOS19PTkNFKSA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBGSVhNRTogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3ZSBtYXkgaGF2ZSB0cm91YmxlCi0gICAgIGNvcHlpbmcgcmVsb2NhdGlvbnMgaW4gb3RoZXIgc2VjdGlvbnMgdGhhdCByZWZlciB0byBsb2NhbCBzeW1ib2xzCi0gICAgIGluIHRoZSBzZWN0aW9uIGJlaW5nIGRpc2NhcmRlZC4gIFRob3NlIHJlbG9jYXRpb25zIHdpbGwgaGF2ZSB0bwotICAgICBiZSBjb252ZXJ0ZWQgc29tZWhvdzsgYXMgb2YgdGhpcyB3cml0aW5nIEknbSBub3Qgc3VyZSB0aGF0IGFueSBvZgotICAgICB0aGUgYmFja2VuZHMgaGFuZGxlIHRoYXQgY29ycmVjdGx5LgotCi0gICAgIEl0IGlzIHRlbXB0aW5nIHRvIGluc3RlYWQgbm90IGRpc2NhcmQgbGluayBvbmNlIHNlY3Rpb25zIHdoZW4KLSAgICAgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluayAodGVjaG5pY2FsbHksIHRoZXkgc2hvdWxkIGJlIGRpc2NhcmRlZAotICAgICB3aGVuZXZlciB3ZSBhcmUgYnVpbGRpbmcgY29uc3RydWN0b3JzKS4gIEhvd2V2ZXIsIHRoYXQgZmFpbHMsCi0gICAgIGJlY2F1c2UgdGhlIGxpbmtlciB3aW5kcyB1cCBjb21iaW5pbmcgYWxsIHRoZSBsaW5rIG9uY2Ugc2VjdGlvbnMKLSAgICAgaW50byBhIHNpbmdsZSBsYXJnZSBsaW5rIG9uY2Ugc2VjdGlvbiwgd2hpY2ggZGVmZWF0cyB0aGUgcHVycG9zZQotICAgICBvZiBoYXZpbmcgbGluayBvbmNlIHNlY3Rpb25zIGluIHRoZSBmaXJzdCBwbGFjZS4KLQotICAgICBBbHNvLCBub3QgbWVyZ2luZyBsaW5rIG9uY2Ugc2VjdGlvbnMgaW4gYSByZWxvY2F0ZWFibGUgbGluawotICAgICBjYXVzZXMgdHJvdWJsZSBmb3IgTUlQUyBFTEYsIHdoaWNoIHJlbGllcyBpbiBsaW5rIG9uY2Ugc2VtYW50aWNzCi0gICAgIHRvIGhhbmRsZSB0aGUgLnJlZ2luZm8gc2VjdGlvbiBjb3JyZWN0bHkuICAqLwotCi0gIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKLQotICBhbHJlYWR5X2xpbmtlZF9saXN0ID0gCi0gICAgKChzdHJ1Y3QgYWxyZWFkeV9saW5rZWRfaGFzaF9lbnRyeSAqKQotICAgICBiZmRfaGFzaF9sb29rdXAgKCZhbHJlYWR5X2xpbmtlZF90YWJsZSwgbmFtZSwgdHJ1ZSwgZmFsc2UpKTsKLQotICBmb3IgKGwgPSBhbHJlYWR5X2xpbmtlZF9saXN0LT5lbnRyeTsgIGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKHNlYy0+Y29tZGF0ID09IE5VTEwKLQkgIHx8IGwtPnNlYy0+Y29tZGF0ID09IE5VTEwKLQkgIHx8IHN0cmNtcCAoc2VjLT5jb21kYXQtPm5hbWUsIGwtPnNlYy0+Y29tZGF0LT5uYW1lKSA9PSAwKQotCXsKLQkgIC8qIFRoZSBzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gbGlua2VkLiAgU2VlIGlmIHdlIHNob3VsZAotICAgICAgICAgICAgIGlzc3VlIGEgd2FybmluZy4gICovCi0JICBzd2l0Y2ggKGZsYWdzICYgU0VDX0xJTktfRFVQTElDQVRFUykKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIGNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWToKLQkgICAgICBpZiAoc2VjLT5jb21kYXQgPT0gTlVMTCkKLQkJZWluZm8gKF8oIiVQOiAlQjogd2FybmluZzogaWdub3JpbmcgZHVwbGljYXRlIHNlY3Rpb24gYCVzJ1xuIiksCi0JCSAgICAgICBhYmZkLCBuYW1lKTsKLQkgICAgICBlbHNlCi0JCWVpbmZvIChfKCIlUDogJUI6IHdhcm5pbmc6IGlnbm9yaW5nIGR1cGxpY2F0ZSBgJXMnIHNlY3Rpb24gc3ltYm9sIGAlcydcbiIpLAotCQkgICAgICAgYWJmZCwgbmFtZSwgc2VjLT5jb21kYXQtPm5hbWUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOgotCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgcmVhbGx5IGRpZyBvdXQgdGhlIGNvbnRlbnRzIG9mIGJvdGgKLSAgICAgICAgICAgICAgICAgc2VjdGlvbnMgYW5kIG1lbWNtcCB0aGVtLiAgVGhlIENPRkYvUEUgc3BlYyBzYXlzIHRoYXQKLSAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBsaW5rZXIgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMKLSAgICAgICAgICAgICAgICAgY29ycmVjdGx5LCBzbyBJJ20gbm90IGdvaW5nIHRvIGJvdGhlciBkb2luZyBpdAotICAgICAgICAgICAgICAgICBlaXRoZXIuICAqLwotCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgIGNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU6Ci0JICAgICAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykKLQkJICAhPSBiZmRfc2VjdGlvbl9zaXplIChsLT5zZWMtPm93bmVyLCBsLT5zZWMpKQotCQllaW5mbyAoXygiJVA6ICVCOiB3YXJuaW5nOiBkdXBsaWNhdGUgc2VjdGlvbiBgJXMnIGhhcyBkaWZmZXJlbnQgc2l6ZVxuIiksCi0JCSAgICAgICBhYmZkLCBuYW1lKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBTZXQgdGhlIG91dHB1dF9zZWN0aW9uIGZpZWxkIHNvIHRoYXQgd2lsZF9kb2l0IGRvZXMgbm90Ci0JICAgICBjcmVhdGUgYSBsYW5nX2lucHV0X3NlY3Rpb24gc3RydWN0dXJlIGZvciB0aGlzIHNlY3Rpb24uCi0JICAgICBTaW5jZSB0aGVyZSBtaWdodCBiZSBhIHN5bWJvbCBpbiB0aGUgc2VjdGlvbiBiZWluZwotCSAgICAgZGlzY2FyZGVkLCB3ZSBtdXN0IHJldGFpbiBhIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gd2hpY2gKLQkgICAgIHdlIGFyZSByZWFsbHkgZ29pbmcgdG8gdXNlLiAgKi8KLQkgIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgaWYgKHNlYy0+Y29tZGF0ICE9IE5VTEwpCi0JICAgIHNlYy0+Y29tZGF0LT5zZWMgPSBsLT5zZWM7Ci0KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgdGhlIGZpcnN0IHNlY3Rpb24gd2l0aCB0aGlzIG5hbWUuICBSZWNvcmQgaXQuICBBbGxvY2F0ZQotICAgICB0aGUgbWVtb3J5IGZyb20gdGhlIHNhbWUgb2JzdGFjayBhcyB0aGUgaGFzaCB0YWJsZSBpcyBrZXB0IGluLiAgKi8KLQotICBsID0gKChzdHJ1Y3QgYWxyZWFkeV9saW5rZWQgKikgCi0gICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZhbHJlYWR5X2xpbmtlZF90YWJsZSwgc2l6ZW9mICpsKSk7Ci0KLSAgbC0+c2VjID0gc2VjOwotICBsLT5uZXh0ID0gYWxyZWFkeV9saW5rZWRfbGlzdC0+ZW50cnk7Ci0gIGFscmVhZHlfbGlua2VkX2xpc3QtPmVudHJ5ID0gbDsKLX0KLQotLyogU3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGhhc2ggdGFibGUgdXNlZCBieSBzZWN0aW9uX2FscmVhZHlfbGlua2VkLAotICAgaW5pdGlhbGl6ZSB0aGUgdGFibGUsIGZpbGwgaW4gYW4gZW50cnkgYW5kIHJlbW92ZSB0aGUgdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWFscmVhZHlfbGlua2VkX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdHJ1Y3QgYWxyZWFkeV9saW5rZWRfaGFzaF9lbnRyeSAqcmV0ID0gCi0gICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBhbHJlYWR5X2xpbmtlZF9oYXNoX2VudHJ5KSk7Ci0KLSAgcmV0LT5lbnRyeSA9IE5VTEw7Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi1zdGF0aWMgdm9pZAotYWxyZWFkeV9saW5rZWRfdGFibGVfaW5pdCAoKQotewotICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0X24gKCZhbHJlYWR5X2xpbmtlZF90YWJsZSwKLQkJCSAgICAgICBhbHJlYWR5X2xpbmtlZF9uZXdmdW5jLAotCQkJICAgICAgIDQyKSkKLSAgICBlaW5mbyAoXygiJVAlRjogRmFpbGVkIHRvIGNyZWF0ZSBoYXNoIHRhYmxlXG4iKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hbHJlYWR5X2xpbmtlZF90YWJsZV9mcmVlICgpCi17Ci0gIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZhbHJlYWR5X2xpbmtlZF90YWJsZSk7Ci19Ci0MCi0vKiBUaGUgd2lsZCByb3V0aW5lcy4KLQotICAgVGhlc2UgZXhwYW5kIHN0YXRlbWVudHMgbGlrZSAqKC50ZXh0KSBhbmQgZm9vLm8gdG8gYSBsaXN0IG9mCi0gICBleHBsaWNpdCBhY3Rpb25zLCBsaWtlIGZvby5vKC50ZXh0KSwgYmFyLm8oLnRleHQpIGFuZAotICAgZm9vLm8oLnRleHQsIC5kYXRhKS4gICovCi0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBQQVRURVJOIGFyZ3VtZW50IGlzIGEgd2lsZGNhcmQgcGF0dGVybi4KLSAgIEFsdGhvdWdoIGJhY2tzbGFzaGVzIGFyZSB0cmVhdGVkIHNwZWNpYWxseSBpZiBhIHBhdHRlcm4gY29udGFpbnMKLSAgIHdpbGRjYXJkcywgd2UgZG8gbm90IGNvbnNpZGVyIHRoZSBtZXJlIHByZXNlbmNlIG9mIGEgYmFja3NsYXNoIHRvCi0gICBiZSBlbm91Z2ggdG8gY2F1c2UgdGhlIHRoZSBwYXR0ZXJuIHRvIGJlIHRyZWF0ZWQgYXMgYSB3aWxkY2FyZC4KLSAgIFRoYXQgbGV0cyB1cyBoYW5kbGUgRE9TIGZpbGVuYW1lcyBtb3JlIG5hdHVyYWxseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi13aWxkY2FyZHAgKHBhdHRlcm4pCi0gICAgIGNvbnN0IGNoYXIgKnBhdHRlcm47Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0KLSAgZm9yIChzID0gcGF0dGVybjsgKnMgIT0gJ1wwJzsgKytzKQotICAgIGlmICgqcyA9PSAnPycKLQl8fCAqcyA9PSAnKicKLQl8fCAqcyA9PSAnWycpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBZGQgU0VDVElPTiB0byB0aGUgb3V0cHV0IHNlY3Rpb24gT1VUUFVULiAgRG8gdGhpcyBieSBjcmVhdGluZyBhCi0gICBsYW5nX2lucHV0X3NlY3Rpb24gc3RhdGVtZW50IHdoaWNoIGlzIHBsYWNlZCBhdCBQVFIuICBGSUxFIGlzIHRoZQotICAgaW5wdXQgZmlsZSB3aGljaCBob2xkcyBTRUNUSU9OLiAgKi8KLQotdm9pZAotd2lsZF9kb2l0IChwdHIsIHNlY3Rpb24sIG91dHB1dCwgZmlsZSkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpwdHI7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXQ7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBib29sZWFuIGRpc2NhcmQ7Ci0KLSAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHNlY3Rpb24tPm93bmVyLCBzZWN0aW9uKTsKLQotICBkaXNjYXJkID0gZmFsc2U7Ci0KLSAgLyogSWYgd2UgYXJlIGRvaW5nIGEgZmluYWwgbGluaywgZGlzY2FyZCBzZWN0aW9ucyBtYXJrZWQgd2l0aAotICAgICBTRUNfRVhDTFVERS4gICovCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLSAgICAgICYmIChmbGFncyAmIFNFQ19FWENMVURFKSAhPSAwKQotICAgIGRpc2NhcmQgPSB0cnVlOwotCi0gIC8qIERpc2NhcmQgaW5wdXQgc2VjdGlvbnMgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGEgc2VjdGlvbiBuYW1lZAotICAgICBESVNDQVJEX1NFQ1RJT05fTkFNRS4gICovCi0gIGlmIChzdHJjbXAgKG91dHB1dC0+bmFtZSwgRElTQ0FSRF9TRUNUSU9OX05BTUUpID09IDApCi0gICAgZGlzY2FyZCA9IHRydWU7Ci0KLSAgLyogRGlzY2FyZCBkZWJ1Z2dpbmcgc2VjdGlvbnMgaWYgd2UgYXJlIHN0cmlwcGluZyBkZWJ1Z2dpbmcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBpZiAoKGxpbmtfaW5mby5zdHJpcCA9PSBzdHJpcF9kZWJ1Z2dlciB8fCBsaW5rX2luZm8uc3RyaXAgPT0gc3RyaXBfYWxsKQotICAgICAgJiYgKGZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLSAgICBkaXNjYXJkID0gdHJ1ZTsKLQotICBpZiAoZGlzY2FyZCkKLSAgICB7Ci0gICAgICBpZiAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICAvKiBUaGlzIHByZXZlbnRzIGZ1dHVyZSBjYWxscyBmcm9tIGFzc2lnbmluZyB0aGlzIHNlY3Rpb24uICAqLwotCSAgc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCX0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgYm9vbGVhbiBmaXJzdDsKLSAgICAgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICpuZXc7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLQotICAgICAgaWYgKG91dHB1dC0+YmZkX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBpbml0X29zIChvdXRwdXQpOwotCSAgZmlyc3QgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UKLQlmaXJzdCA9IGZhbHNlOwotCi0gICAgICAvKiBBZGQgYSBzZWN0aW9uIHJlZmVyZW5jZSB0byB0aGUgbGlzdCAqLwotICAgICAgbmV3ID0gbmV3X3N0YXQgKGxhbmdfaW5wdXRfc2VjdGlvbiwgcHRyKTsKLQotICAgICAgbmV3LT5zZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgIG5ldy0+aWZpbGUgPSBmaWxlOwotICAgICAgc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBvdXRwdXQtPmJmZF9zZWN0aW9uOwotCi0gICAgICBmbGFncyA9IHNlY3Rpb24tPmZsYWdzOwotCi0gICAgICAvKiBXZSBkb24ndCBjb3B5IHRoZSBTRUNfTkVWRVJfTE9BRCBmbGFnIGZyb20gYW4gaW5wdXQgc2VjdGlvbgotCSB0byBhbiBvdXRwdXQgc2VjdGlvbiwgYmVjYXVzZSB3ZSB3YW50IHRvIGJlIGFibGUgdG8gaW5jbHVkZSBhCi0JIFNFQ19ORVZFUl9MT0FEIHNlY3Rpb24gaW4gdGhlIG1pZGRsZSBvZiBhbiBvdGhlcndpc2UgbG9hZGVkCi0JIHNlY3Rpb24gKEkgZG9uJ3Qga25vdyB3aHkgd2Ugd2FudCB0byBkbyB0aGlzLCBidXQgd2UgZG8pLgotCSBidWlsZF9saW5rX29yZGVyIGluIGxkd3JpdGUuYyBoYW5kbGVzIHRoaXMgY2FzZSBieSB0dXJuaW5nCi0JIHRoZSBlbWJlZGRlZCBTRUNfTkVWRVJfTE9BRCBzZWN0aW9uIGludG8gYSBmaWxsLiAgKi8KLQotICAgICAgZmxhZ3MgJj0gfiBTRUNfTkVWRVJfTE9BRDsKLQotICAgICAgLyogSWYgZmluYWwgbGluaywgZG9uJ3QgY29weSB0aGUgU0VDX0xJTktfT05DRSBmbGFncywgdGhleSd2ZQotCSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLiAgT25lIHJlYXNvbiB0byBkbyB0aGlzIGlzIHRoYXQgb24gcGUKLQkgZm9ybWF0IHRhcmdldHMsIC50ZXh0JGZvbyBzZWN0aW9ucyBnbyBpbnRvIC50ZXh0IGFuZCBpdCdzIG9kZAotCSB0byBzZWUgLnRleHQgd2l0aCBTRUNfTElOS19PTkNFIHNldC4gICovCi0KLSAgICAgIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0JZmxhZ3MgJj0gfiAoU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVMpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgaW5wdXQgc2VjdGlvbiwgYW5kIHRoZSBTRUNfUkVBRE9OTFkKLSAgICAgICAgIGZsYWcgaXMgbm90IGN1cnJlbnRseSBzZXQsIHRoZW4gZG9uJ3Qgc2V0IGl0IGp1c3QgYmVjYXVzZSB0aGUKLSAgICAgICAgIGlucHV0IHNlY3Rpb24gaGFzIGl0IHNldC4gICovCi0KLSAgICAgIGlmICghIGZpcnN0ICYmIChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCi0JZmxhZ3MgJj0gfiBTRUNfUkVBRE9OTFk7Ci0KLSAgICAgIHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5mbGFncyB8PSBmbGFnczsKLQotICAgICAgLyogSWYgU0VDX1JFQURPTkxZIGlzIG5vdCBzZXQgaW4gdGhlIGlucHV0IHNlY3Rpb24sIHRoZW4gY2xlYXIKLSAgICAgICAgIGl0IGZyb20gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCi0Jc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzICY9IH5TRUNfUkVBRE9OTFk7Ci0KLSAgICAgIHN3aXRjaCAob3V0cHV0LT5zZWN0eXBlKQotCXsKLQljYXNlIG5vcm1hbF9zZWN0aW9uOgotCSAgYnJlYWs7Ci0JY2FzZSBkc2VjdF9zZWN0aW9uOgotCWNhc2UgY29weV9zZWN0aW9uOgotCWNhc2UgaW5mb19zZWN0aW9uOgotCWNhc2Ugb3ZlcmxheV9zZWN0aW9uOgotCSAgb3V0cHV0LT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJj0gflNFQ19BTExPQzsKLQkgIGJyZWFrOwotCWNhc2Ugbm9sb2FkX3NlY3Rpb246Ci0JICBvdXRwdXQtPmJmZF9zZWN0aW9uLT5mbGFncyAmPSB+U0VDX0xPQUQ7Ci0JICBvdXRwdXQtPmJmZF9zZWN0aW9uLT5mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQ29weSBvdmVyIFNFQ19TTUFMTF9EQVRBLiAgKi8KLSAgICAgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19TTUFMTF9EQVRBKQotCXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5mbGFncyB8PSBTRUNfU01BTExfREFUQTsKLQotICAgICAgaWYgKHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA+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+bG9hZGVkID0gdHJ1ZTsKLX0KLQotICAgICAKLQotLyogSGFuZGxlIGEgd2lsZCBzdGF0ZW1lbnQuICBTRUNUSU9OIG9yIEZJTEUgb3IgYm90aCBtYXkgYmUgTlVMTCwKLSAgIGluZGljYXRpbmcgdGhhdCBpdCBpcyBhIHdpbGRjYXJkLiAgU2VwYXJhdGUgbGFuZ19pbnB1dF9zZWN0aW9uCi0gICBzdGF0ZW1lbnRzIGFyZSBjcmVhdGVkIGZvciBlYWNoIHBhcnQgb2YgdGhlIGV4cGFuc2lvbjsgdGhleSBhcmUKLSAgIGFkZGVkIGFmdGVyIHRoZSB3aWxkIHN0YXRlbWVudCBTLiAgT1VUUFVUIGlzIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi13aWxkIChzLCBzZWN0aW9uLCBmaWxlLCB0YXJnZXQsIG91dHB1dCkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpzOwotICAgICBjb25zdCBjaGFyICpzZWN0aW9uOwotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICBjb25zdCBjaGFyICp0YXJnZXQgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0OwotewotICB3YWxrX3dpbGQgKHMsIHNlY3Rpb24sIGZpbGUsIG91dHB1dF9zZWN0aW9uX2NhbGxiYWNrLCAodm9pZCAqKSBvdXRwdXQpOwotCi0gIGlmIChzZWN0aW9uICE9IChjaGFyICopIE5VTEwKLSAgICAgICYmIHN0cmNtcCAoc2VjdGlvbiwgIkNPTU1PTiIpID09IDAKLSAgICAgICYmIGRlZmF1bHRfY29tbW9uX3NlY3Rpb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBSZW1lbWJlciB0aGUgc2VjdGlvbiB0aGF0IGNvbW1vbiBpcyBnb2luZyB0byBpbiBjYXNlIHdlIGxhdGVyCi0gICAgICAgICBnZXQgc29tZXRoaW5nIHdoaWNoIGRvZXNuJ3Qga25vdyB3aGVyZSB0byBwdXQgaXQuICAqLwotICAgICAgZGVmYXVsdF9jb21tb25fc2VjdGlvbiA9IG91dHB1dDsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmZiB0YXJnZXQgaXMgdGhlIHNvdWdodCB0YXJnZXQuICAqLwotc3RhdGljIGludAotZ2V0X3RhcmdldCAodGFyZ2V0LCBkYXRhKQotICAgICBjb25zdCBiZmRfdGFyZ2V0ICogdGFyZ2V0OwotICAgICB2b2lkICogZGF0YTsKLXsKLSAgY29uc3QgY2hhciAqIHNvdWdodCA9IChjb25zdCBjaGFyICopIGRhdGE7Ci0gIAotICByZXR1cm4gc3RyY21wICh0YXJnZXQtPm5hbWUsIHNvdWdodCkgPT0gMDsKLX0KLQotLyogTGlrZSBzdHJjcHkoKSBidXQgY29udmVydCB0byBsb3dlciBjYXNlIGFzIHdlbGwuICAqLwotc3RhdGljIHZvaWQKLXN0cmljcHkgKGRlc3QsIHNyYykKLSAgICAgY2hhciAqIGRlc3Q7Ci0gICAgIGNoYXIgKiBzcmM7Ci17Ci0gIGNoYXIgYzsKLSAgCi0gIHdoaWxlICgoYyA9ICogc3JjICsrKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgYykpCi0JYyA9IHRvbG93ZXIgKGMpOwotCi0gICAgICAqIGRlc3QgKysgPSBjOwotICAgIH0KLQotICAqIGRlc3QgPSAwOwotfQotCi0vKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VyYW5jZSBvZiBuZWVkbGUgKGlmIGFueSkgaW4gaGF5c3RhY2sKLSAgIGZyb20gaGF5c3RhY2suICAqLwotc3RhdGljIHZvaWQKLXN0cmN1dCAoaGF5c3RhY2ssIG5lZWRsZSkKLSAgICAgY2hhciAqIGhheXN0YWNrOwotICAgICBjaGFyICogbmVlZGxlOwotewotICBoYXlzdGFjayA9IHN0cnN0ciAoaGF5c3RhY2ssIG5lZWRsZSk7Ci0gIAotICBpZiAoaGF5c3RhY2spCi0gICAgewotICAgICAgY2hhciAqIHNyYzsKLQotICAgICAgZm9yIChzcmMgPSBoYXlzdGFjayArIHN0cmxlbiAobmVlZGxlKTsgKiBzcmM7KQotCSogaGF5c3RhY2sgKysgPSAqIHNyYyArKzsKLSAgICAgIAotICAgICAgKiBoYXlzdGFjayA9IDA7Ci0gICAgfQotfQotCi0vKiBDb21wYXJlIHR3byB0YXJnZXQgZm9ybWF0IG5hbWUgc3RyaW5ncy4KLSAgIFJldHVybiBhIHZhbHVlIGluZGljYXRpbmcgaG93ICJzaW1pbGFyIiB0aGV5IGFyZS4gICovCi1zdGF0aWMgaW50Ci1uYW1lX2NvbXBhcmUgKGZpcnN0LCBzZWNvbmQpCi0gICAgIGNoYXIgKiBmaXJzdDsKLSAgICAgY2hhciAqIHNlY29uZDsKLXsKLSAgY2hhciAqIGNvcHkxOwotICBjaGFyICogY29weTI7Ci0gIGludCAgICByZXN1bHQ7Ci0gIAotICBjb3B5MSA9IHhtYWxsb2MgKHN0cmxlbiAoZmlyc3QpICsgMSk7Ci0gIGNvcHkyID0geG1hbGxvYyAoc3RybGVuIChzZWNvbmQpICsgMSk7Ci0KLSAgLyogQ29udmVydCB0aGUgbmFtZXMgdG8gbG93ZXIgY2FzZS4gICovCi0gIHN0cmljcHkgKGNvcHkxLCBmaXJzdCk7Ci0gIHN0cmljcHkgKGNvcHkyLCBzZWNvbmQpOwotCi0gIC8qIFJlbW92ZSBhbmQgZW5kaWFuIHN0cmluZ3MgZnJvbSB0aGUgbmFtZS4gICovCi0gIHN0cmN1dCAoY29weTEsICJiaWciKTsKLSAgc3RyY3V0IChjb3B5MSwgImxpdHRsZSIpOwotICBzdHJjdXQgKGNvcHkyLCAiYmlnIik7Ci0gIHN0cmN1dCAoY29weTIsICJsaXR0bGUiKTsKLQotICAvKiBSZXR1cm4gYSB2YWx1ZSBiYXNlZCBvbiBob3cgbWFueSBjaGFyYWN0ZXJzIG1hdGNoLAotICAgICBzdGFydGluZyBmcm9tIHRoZSBiZWdpbm5pbmcuICAgSWYgYm90aCBzdHJpbmdzIGFyZQotICAgICB0aGUgc2FtZSB0aGVuIHJldHVybiAxMCAqIHRoZWlyIGxlbmd0aC4gICovCi0gIGZvciAocmVzdWx0ID0gMDsgY29weTEgW3Jlc3VsdF0gPT0gY29weTIgW3Jlc3VsdF07IHJlc3VsdCArKykKLSAgICBpZiAoY29weTEgW3Jlc3VsdF0gPT0gMCkKLSAgICAgIHsKLQlyZXN1bHQgKj0gMTA7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIAotICBmcmVlIChjb3B5MSk7Ci0gIGZyZWUgKGNvcHkyKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBTZXQgYnkgY2xvc2VzdF90YXJnZXRfbWF0Y2goKSBiZWxvdy4gICovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHdpbm5lcjsKLQotLyogU2NhbiBhbGwgdGhlIHZhbGlkIGJmZCB0YXJnZXRzIGxvb2tpbmcgZm9yIG9uZSB0aGF0IGhhcyB0aGUgZW5kaWFubmVzcwotICAgcmVxdWlyZW1lbnQgdGhhdCB3YXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFuZCBpcyB0aGUgbmVhcmVzdAotICAgbWF0Y2ggdG8gdGhlIG9yaWdpbmFsIG91dHB1dCB0YXJnZXQuICAqLwotc3RhdGljIGludAotY2xvc2VzdF90YXJnZXRfbWF0Y2ggKHRhcmdldCwgZGF0YSkKLSAgICAgY29uc3QgYmZkX3RhcmdldCAqIHRhcmdldDsKLSAgICAgdm9pZCAqIGRhdGE7Ci17Ci0gIGNvbnN0IGJmZF90YXJnZXQgKiBvcmlnaW5hbCA9IChjb25zdCBiZmRfdGFyZ2V0ICopIGRhdGE7Ci0gIAotICBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiA9PSBFTkRJQU5fQklHICYmIHRhcmdldC0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fQklHKQotICAgIHJldHVybiAwOwotICAKLSAgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gPT0gRU5ESUFOX0xJVFRMRSAmJiB0YXJnZXQtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX0xJVFRMRSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBNdXN0IGJlIHRoZSBzYW1lIGZsYXZvdXIuICAqLwotICBpZiAodGFyZ2V0LT5mbGF2b3VyICE9IG9yaWdpbmFsLT5mbGF2b3VyKQotICAgIHJldHVybiAwOwotCi0gIC8qIElmIHdlIGhhdmUgbm90IGZvdW5kIGEgcG90ZW50aWFsIHdpbm5lciB5ZXQsIHRoZW4gcmVjb3JkIHRoaXMgb25lLiAgKi8KLSAgaWYgKHdpbm5lciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHdpbm5lciA9IHRhcmdldDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBPaCBkZWFyLCB3ZSBub3cgaGF2ZSB0d28gcG90ZW50aWFsIGNhbmRpZGF0ZXMgZm9yIGEgc3VjY2Vzc2Z1bCBtYXRjaC4KLSAgICAgQ29tcGFyZSB0aGVpciBuYW1lcyBhbmQgY2hvb3NlIHRoZSBiZXR0ZXIgb25lLiAqLwotICBpZiAobmFtZV9jb21wYXJlICh0YXJnZXQtPm5hbWUsIG9yaWdpbmFsLT5uYW1lKSA+IG5hbWVfY29tcGFyZSAod2lubmVyLT5uYW1lLCBvcmlnaW5hbC0+bmFtZSkpCi0gICAgd2lubmVyID0gdGFyZ2V0OwotCi0gIC8qIEtlZXAgb24gc2VhcmNoaW5nIHVudGlsIHdxZSBoYXZlIGNoZWNrZWQgdGhlbSBhbGwuICAqLwotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHRoZSBCRkQgdGFyZ2V0IGZvcm1hdCBvZiB0aGUgZmlyc3QgaW5wdXQgZmlsZS4gICovCi1zdGF0aWMgY2hhciAqCi1nZXRfZmlyc3RfaW5wdXRfdGFyZ2V0ICgpCi17Ci0gIGNoYXIgKiB0YXJnZXQgPSBOVUxMOwotCi0gIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChzKQotICAgIHsKLSAgICAgIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtCi0JICAmJiBzLT5yZWFsKQotCXsKLQkgIGxkZmlsZV9vcGVuX2ZpbGUgKHMpOwotCSAgCi0JICBpZiAocy0+dGhlX2JmZCAhPSBOVUxMCi0JICAgICAgJiYgYmZkX2NoZWNrX2Zvcm1hdCAocy0+dGhlX2JmZCwgYmZkX29iamVjdCkpCi0JICAgIHsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3RhcmdldCAocy0+dGhlX2JmZCk7Ci0JICAKLQkgICAgICBpZiAodGFyZ2V0ICE9IE5VTEwpCi0JCWJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLS8qIE9wZW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJmZCAqCi1vcGVuX291dHB1dCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqIG5hbWU7Ci17Ci0gIGJmZCAqIG91dHB1dDsKLQotICAvKiBIYXMgdGhlIHVzZXIgdG9sZCB1cyB3aGljaCBvdXRwdXQgZm9ybWF0IHRvIHVzZSA/ICAqLwotICBpZiAob3V0cHV0X3RhcmdldCA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vIC0gaGFzIHRoZSBjdXJyZW50IHRhcmdldCBiZWVuIHNldCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCA/ICAqLwotICAgICAgaWYgKGN1cnJlbnRfdGFyZ2V0ICE9IGRlZmF1bHRfdGFyZ2V0KQotCW91dHB1dF90YXJnZXQgPSBjdXJyZW50X3RhcmdldDsKLQotICAgICAgLyogTm8gLSBjYW4gd2UgZGV0ZXJtaW5lIHRoZSBmb3JtYXQgb2YgdGhlIGZpcnN0IGlucHV0IGZpbGUgPyAqLwotICAgICAgZWxzZQotCXsKLQkgIG91dHB1dF90YXJnZXQgPSBnZXRfZmlyc3RfaW5wdXRfdGFyZ2V0ICgpOwotCi0JICAvKiBGYWlsZWQgLSB1c2UgdGhlIGRlZmF1bHQgb3V0cHV0IHRhcmdldC4gICovCi0JICBpZiAob3V0cHV0X3RhcmdldCA9PSBOVUxMKQotCSAgICBvdXRwdXRfdGFyZ2V0ID0gZGVmYXVsdF90YXJnZXQ7Ci0JfQotICAgIH0KLSAgCi0gIC8qIEhhcyB0aGUgdXNlciByZXF1ZXN0ZWQgYSBwYXJ0aWN1bGFyIGVuZGlhbm5lc3Mgb24gdGhlIGNvbW1hbmQgbGluZSA/ICAqLwotICBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiAhPSBFTkRJQU5fVU5TRVQpCi0gICAgewotICAgICAgY29uc3QgYmZkX3RhcmdldCAqIHRhcmdldDsKLSAgICAgIGVudW0gYmZkX2VuZGlhbiBkZXNpcmVkX2VuZGlhbjsKLQotICAgICAgLyogR2V0IHRoZSBjaG9zZW4gdGFyZ2V0LiAgKi8KLSAgICAgIHRhcmdldCA9IGJmZF9zZWFyY2hfZm9yX3RhcmdldCAoZ2V0X3RhcmdldCwgKHZvaWQgKikgb3V0cHV0X3RhcmdldCk7Ci0KLSAgICAgIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9CSUcpCi0JZGVzaXJlZF9lbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKLSAgICAgIGVsc2UKLQlkZXNpcmVkX2VuZGlhbiA9IEJGRF9FTkRJQU5fTElUVExFOwotICAgICAgCi0gICAgICAvKiBTZWUgaWYgdGhlIHRhcmdldCBoYXMgdGhlIHdyb25nIGVuZGlhbm5lc3MuICBUaGlzIHNob3VsZCBub3QgaGFwcGVuCi0JIGlmIHRoZSBsaW5rZXIgc2NyaXB0IGhhcyBwcm92aWRlZCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gYWx0ZXJuYXRpdmVzLAotCSBidXQgc29tZSBzY3JpcHMgZG9uJ3QgZG8gdGhpcy4gICovCi0gICAgICBpZiAodGFyZ2V0LT5ieXRlb3JkZXIgIT0gZGVzaXJlZF9lbmRpYW4pCi0JewotCSAgLyogSWYgaXQgZG9lcywgdGhlbiBzZWUgaWYgdGhlIHRhcmdldCBwcm92aWRlcwotCSAgICAgYW4gYWx0ZXJuYXRpdmUgd2l0aCB0aGUgY29ycmVjdCBlbmRpYW5uZXNzLiAgKi8KLQkgIGlmICh0YXJnZXQtPmFsdGVybmF0aXZlX3RhcmdldCAhPSBOVUxMCi0JICAgICAgJiYgKHRhcmdldC0+YWx0ZXJuYXRpdmVfdGFyZ2V0LT5ieXRlb3JkZXIgPT0gZGVzaXJlZF9lbmRpYW4pKQotCSAgICBvdXRwdXRfdGFyZ2V0ID0gdGFyZ2V0LT5hbHRlcm5hdGl2ZV90YXJnZXQtPm5hbWU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUcnkgdG8gZmluZCBhIHRhcmdldCBhcyBzaW1pbGFyIGFzIHBvc3NpYmxlIHRvIHRoZSBkZWZhdWx0Ci0JCSB0YXJnZXQsIGJ1dCB3aGljaCBoYXMgdGhlIGRlc2lyZWQgZW5kaWFuIGNoYXJhY3RlcmlzdGljLiAgKi8KLQkgICAgICAodm9pZCkgYmZkX3NlYXJjaF9mb3JfdGFyZ2V0IChjbG9zZXN0X3RhcmdldF9tYXRjaCwgKHZvaWQgKikgdGFyZ2V0KTsKLQkgICAgICAKLQkgICAgICAvKiBPaCBkZWFyIC0gd2UgY291bGQgbm90IGZpbmQgYW55IHRhcmdldHMgdGhhdCBzYXRpc2Z5IG91ciByZXF1aXJlbWVudHMuICAqLwotCSAgICAgIGlmICh3aW5uZXIgPT0gTlVMTCkKLQkJZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBhbnkgdGFyZ2V0cyB0aGF0IG1hdGNoIGVuZGlhbm5lc3MgcmVxdWlyZW1lbnRcbiIpKTsKLQkgICAgICBlbHNlCi0JCW91dHB1dF90YXJnZXQgPSB3aW5uZXItPm5hbWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgICAgCi0gIG91dHB1dCA9IGJmZF9vcGVudyAobmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0KLSAgaWYgKG91dHB1dCA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KQotCWVpbmZvIChfKCIlUCVGOiB0YXJnZXQgJXMgbm90IGZvdW5kXG4iKSwgb3V0cHV0X3RhcmdldCk7Ci0KLSAgICAgIGVpbmZvIChfKCIlUCVGOiBjYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlczogJUVcbiIpLCBuYW1lKTsKLSAgICB9Ci0KLSAgZGVsZXRlX291dHB1dF9maWxlX29uX2ZhaWx1cmUgPSB0cnVlOwotCi0gIC8qICBvdXRwdXQtPmZsYWdzIHw9IERfUEFHRUQ7Ki8KLQotICBpZiAoISBiZmRfc2V0X2Zvcm1hdCAob3V0cHV0LCBiZmRfb2JqZWN0KSkKLSAgICBlaW5mbyAoXygiJVAlRjolczogY2FuIG5vdCBtYWtlIG9iamVjdCBmaWxlOiAlRVxuIiksIG5hbWUpOwotICBpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAob3V0cHV0LAotCQkJICAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsCi0JCQkgICBsZGZpbGVfb3V0cHV0X21hY2hpbmUpKQotICAgIGVpbmZvIChfKCIlUCVGOiVzOiBjYW4gbm90IHNldCBhcmNoaXRlY3R1cmU6ICVFXG4iKSwgbmFtZSk7Ci0KLSAgbGlua19pbmZvLmhhc2ggPSBiZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAob3V0cHV0KTsKLSAgaWYgKGxpbmtfaW5mby5oYXNoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVGOiBjYW4gbm90IGNyZWF0ZSBsaW5rIGhhc2ggdGFibGU6ICVFXG4iKSk7Ci0KLSAgYmZkX3NldF9ncF9zaXplIChvdXRwdXQsIGdfc3dpdGNoX3ZhbHVlKTsKLSAgcmV0dXJuIG91dHB1dDsKLX0KLQotc3RhdGljIHZvaWQKLWxkbGFuZ19vcGVuX291dHB1dCAoc3RhdGVtZW50KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogc3RhdGVtZW50OwotewotICBzd2l0Y2ggKHN0YXRlbWVudC0+aGVhZGVyLnR5cGUpCi0gICAgewotICAgIGNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06Ci0gICAgICBBU1NFUlQgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKTsKLSAgICAgIG91dHB1dF9iZmQgPSBvcGVuX291dHB1dCAoc3RhdGVtZW50LT5vdXRwdXRfc3RhdGVtZW50Lm5hbWUpOwotICAgICAgbGRlbXVsX3NldF9vdXRwdXRfYXJjaCAoKTsKLSAgICAgIGlmIChjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkICYmICFsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCW91dHB1dF9iZmQtPmZsYWdzIHw9IERfUEFHRUQ7Ci0gICAgICBlbHNlCi0Jb3V0cHV0X2JmZC0+ZmxhZ3MgJj0gfkRfUEFHRUQ7Ci0gICAgICBpZiAoY29uZmlnLnRleHRfcmVhZF9vbmx5KQotCW91dHB1dF9iZmQtPmZsYWdzIHw9IFdQX1RFWFQ7Ci0gICAgICBlbHNlCi0Jb3V0cHV0X2JmZC0+ZmxhZ3MgJj0gfldQX1RFWFQ7Ci0gICAgICBpZiAobGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCkKLQlvdXRwdXRfYmZkLT5mbGFncyB8PSBCRkRfVFJBRElUSU9OQUxfRk9STUFUOwotICAgICAgZWxzZQotCW91dHB1dF9iZmQtPmZsYWdzICY9IH5CRkRfVFJBRElUSU9OQUxfRk9STUFUOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotICAgICAgY3VycmVudF90YXJnZXQgPSBzdGF0ZW1lbnQtPnRhcmdldF9zdGF0ZW1lbnQudGFyZ2V0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogT3BlbiBhbGwgdGhlIGlucHV0IGZpbGVzLiAgKi8KLQotc3RhdGljIHZvaWQKLW9wZW5faW5wdXRfYmZkcyAocywgZm9yY2UpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci0gICAgIGJvb2xlYW4gZm9yY2U7Ci17Ci0gIGZvciAoOyBzICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCi0JewotCWNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0JICBvcGVuX2lucHV0X2JmZHMgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCwgZm9yY2UpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgotCSAgb3Blbl9pbnB1dF9iZmRzIChzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwgZm9yY2UpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06Ci0JICAvKiBNYXliZSB3ZSBzaG91bGQgbG9hZCB0aGUgZmlsZSdzIHN5bWJvbHMgKi8KLQkgIGlmIChzLT53aWxkX3N0YXRlbWVudC5maWxlbmFtZQotCSAgICAgICYmICEgd2lsZGNhcmRwIChzLT53aWxkX3N0YXRlbWVudC5maWxlbmFtZSkpCi0JICAgICh2b2lkKSBsb29rdXBfbmFtZSAocy0+d2lsZF9zdGF0ZW1lbnQuZmlsZW5hbWUpOwotCSAgb3Blbl9pbnB1dF9iZmRzIChzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLCBmb3JjZSk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICp1bmRlZnM7Ci0KLQkgICAgLyogV2UgbXVzdCBjb250aW51YWxseSBzZWFyY2ggdGhlIGVudHJpZXMgaW4gdGhlIGdyb3VwCi0gICAgICAgICAgICAgICB1bnRpbCBubyBuZXcgc3ltYm9scyBhcmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdW5kZWZpbmVkCi0gICAgICAgICAgICAgICBzeW1ib2xzLiAgKi8KLQotCSAgICBkbwotCSAgICAgIHsKLQkJdW5kZWZzID0gbGlua19pbmZvLmhhc2gtPnVuZGVmc190YWlsOwotCQlvcGVuX2lucHV0X2JmZHMgKHMtPmdyb3VwX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLCB0cnVlKTsKLQkgICAgICB9Ci0JICAgIHdoaWxlICh1bmRlZnMgIT0gbGlua19pbmZvLmhhc2gtPnVuZGVmc190YWlsKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0JICBjdXJyZW50X3RhcmdldCA9IHMtPnRhcmdldF9zdGF0ZW1lbnQudGFyZ2V0OwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotCSAgaWYgKHMtPmlucHV0X3N0YXRlbWVudC5yZWFsKQotCSAgICB7Ci0JICAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGFkZDsKLQotCSAgICAgIHMtPmlucHV0X3N0YXRlbWVudC50YXJnZXQgPSBjdXJyZW50X3RhcmdldDsKLQotCSAgICAgIC8qIElmIHdlIGFyZSBiZWluZyBjYWxsZWQgZnJvbSB3aXRoaW4gYSBncm91cCwgYW5kIHRoaXMKLSAgICAgICAgICAgICAgICAgaXMgYW4gYXJjaGl2ZSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHNlYXJjaGVkLCB0aGVuCi0gICAgICAgICAgICAgICAgIGZvcmNlIGl0IHRvIGJlIHJlc2VhcmNoZWQuICAqLwotCSAgICAgIGlmIChmb3JjZQotCQkgICYmIHMtPmlucHV0X3N0YXRlbWVudC5sb2FkZWQKLQkJICAmJiBiZmRfY2hlY2tfZm9ybWF0IChzLT5pbnB1dF9zdGF0ZW1lbnQudGhlX2JmZCwKLQkJCQkgICAgICAgYmZkX2FyY2hpdmUpKQotCQlzLT5pbnB1dF9zdGF0ZW1lbnQubG9hZGVkID0gZmFsc2U7Ci0KLQkgICAgICBsYW5nX2xpc3RfaW5pdCAoJmFkZCk7Ci0KLQkgICAgICBsb2FkX3N5bWJvbHMgKCZzLT5pbnB1dF9zdGF0ZW1lbnQsICZhZGQpOwotCi0JICAgICAgaWYgKGFkZC5oZWFkICE9IE5VTEwpCi0JCXsKLQkJICAqYWRkLnRhaWwgPSBzLT5uZXh0OwotCQkgIHMtPm5leHQgPSBhZGQuaGVhZDsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotLyogSWYgdGhlcmUgYXJlIFtDT01NT05TXSBzdGF0ZW1lbnRzLCBwdXQgYSB3aWxkIG9uZSBpbnRvIHRoZSBic3Mgc2VjdGlvbiAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19yZWFzb25hYmxlX2RlZmF1bHRzICgpCi17Ci0jaWYgMAotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIudGV4dCIpOwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIuZGF0YSIpOwotCi0gIGRlZmF1bHRfY29tbW9uX3NlY3Rpb24gPQotICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAoIi5ic3MiKTsKLQotCi0gIGlmIChwbGFjZWRfY29tbW9ucyA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKm5ldyA9Ci0gICAgICBuZXdfc3RhdCAobGFuZ193aWxkX3N0YXRlbWVudCwKLQkJJmRlZmF1bHRfY29tbW9uX3NlY3Rpb24tPmNoaWxkcmVuKTsKLQotICAgICAgbmV3LT5zZWN0aW9uX25hbWUgPSAiQ09NTU9OIjsKLSAgICAgIG5ldy0+ZmlsZW5hbWUgPSAoY2hhciAqKSBOVUxMOwotICAgICAgbGFuZ19saXN0X2luaXQgKCZuZXctPmNoaWxkcmVuKTsKLSAgICB9Ci0jZW5kaWYKLQotfQotCi0vKgotIEFkZCB0aGUgc3VwcGxpZWQgbmFtZSB0byB0aGUgc3ltYm9sIHRhYmxlIGFzIGFuIHVuZGVmaW5lZCByZWZlcmVuY2UuCi0gUmVtb3ZlIGl0ZW1zIGZyb20gdGhlIGNoYWluIGFzIHdlIG9wZW4gaW5wdXQgYmZkcwotICovCi10eXBlZGVmIHN0cnVjdCBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdAotewotICBzdHJ1Y3QgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3QgKm5leHQ7Ci0gIGNoYXIgKm5hbWU7Ci19ICAgICAgICAgICAgICAgICAgICAgICBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlOwotCi1zdGF0aWMgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSAqbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfaGVhZDsKLQotdm9pZAotbGRsYW5nX2FkZF91bmRlZiAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqQ09OU1QgbmFtZTsKLXsKLSAgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSAqbmV3ID0KLSAgICAoKGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKikKLSAgICAgc3RhdF9hbGxvYyAoc2l6ZW9mIChsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlKSkpOwotCi0gIG5ldy0+bmV4dCA9IGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQ7Ci0gIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQgPSBuZXc7Ci0KLSAgbmV3LT5uYW1lID0gYnV5c3RyaW5nIChuYW1lKTsKLX0KLQotLyogUnVuIHRocm91Z2ggdGhlIGxpc3Qgb2YgdW5kZWZpbmVkcyBjcmVhdGVkIGFib3ZlIGFuZCBwbGFjZSB0aGVtCi0gICBpbnRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBhcyB1bmRlZmluZWQgc3ltYm9scyBiZWxvbmdpbmcgdG8gdGhlCi0gICBzY3JpcHQgZmlsZS4KLSovCi1zdGF0aWMgdm9pZAotbGFuZ19wbGFjZV91bmRlZmluZWRzICgpCi17Ci0gIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKnB0cjsKLQotICBmb3IgKHB0ciA9IGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQ7Ci0gICAgICAgcHRyICE9IChsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlICopIE5VTEw7Ci0gICAgICAgcHRyID0gcHRyLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBwdHItPm5hbWUsIHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCWVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQl7Ci0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT51LnVuZGVmLmFiZmQgPSBOVUxMOwotCSAgYmZkX2xpbmtfYWRkX3VuZGVmIChsaW5rX2luZm8uaGFzaCwgaCk7Ci0JfQotICAgIH0KLX0KLQotLyogT3BlbiBpbnB1dCBmaWxlcyBhbmQgYXR0YXRjaCB0byBvdXRwdXQgc2VjdGlvbnMgKi8KLXN0YXRpYyB2b2lkCi1tYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzLCB0YXJnZXQsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHM7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLXsKLSAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0KLQotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCSAgd2lsZCAoJnMtPndpbGRfc3RhdGVtZW50LCBzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsCi0JCXMtPndpbGRfc3RhdGVtZW50LmZpbGVuYW1lLCB0YXJnZXQsCi0JCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0KLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0JICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsCi0JCQkJCXRhcmdldCwKLQkJCQkJb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLQkgIG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMgKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCQl0YXJnZXQsCi0JCQkJCSZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bToKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0JICB0YXJnZXQgPSBzLT50YXJnZXRfc3RhdGVtZW50LnRhcmdldDsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKLQkgIG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMgKHMtPmdyb3VwX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCQl0YXJnZXQsCi0JCQkJCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotCWNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotCSAgaWYgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAhPSBOVUxMCi0JICAgICAgJiYgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICBpbml0X29zIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JICBpZiAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ICE9IE5VTEwKLQkgICAgICAmJiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgIGluaXRfb3MgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGF0IGFueSBzZWN0aW9ucyBtZW50aW9uZWQgaW4gdGhlIGFzc2lnbm1lbnQKLSAgICAgICAgICAgICBhcmUgaW5pdGlhbGl6ZWQuICAqLwotCSAgZXhwX2luaXRfb3MgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfYWZpbGVfYXNlY3Rpb25fcGFpcl9zdGF0ZW1lbnRfZW51bToKLQkgIEZBSUwgKCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKLQkgIC8qIE1hcmsgdGhlIHNwZWNpZmllZCBzZWN0aW9uIHdpdGggdGhlIHN1cHBsaWVkIGFkZHJlc3MgKi8KLQkgIHsKLQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MgPQotCSAgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cAotCQkocy0+YWRkcmVzc19zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lKTsKLQotCSAgICBpZiAob3MtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgICAgaW5pdF9vcyAob3MpOwotCSAgICBvcy0+YWRkcl90cmVlID0gcy0+YWRkcmVzc19zdGF0ZW1lbnQuYWRkcmVzczsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCkKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uOwotICBpbnQgbGVuOwotCi0gIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgIT0gYWJzX291dHB1dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIG1pbmZvICgiXG4lcyIsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+bmFtZSk7Ci0KLSAgICAgIGlmIChzZWN0aW9uICE9IE5VTEwpCi0JewotCSAgcHJpbnRfZG90ID0gc2VjdGlvbi0+dm1hOwotCi0JICBsZW4gPSBzdHJsZW4gKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+bmFtZSk7Ci0JICBpZiAobGVuID49IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIIC0gMSkKLQkgICAgewotCSAgICAgIHByaW50X25sICgpOwotCSAgICAgIGxlbiA9IDA7Ci0JICAgIH0KLQkgIHdoaWxlIChsZW4gPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCkKLQkgICAgewotCSAgICAgIHByaW50X3NwYWNlICgpOwotCSAgICAgICsrbGVuOwotCSAgICB9Ci0KLQkgIG1pbmZvICgiMHglViAlVyIsIHNlY3Rpb24tPnZtYSwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCSAgaWYgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+bG9hZF9iYXNlICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIGFkZHI7Ci0KLQkgICAgICBhZGRyID0gZXhwX2dldF9hYnNfaW50IChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmxvYWRfYmFzZSwgMCwKLQkJCQkgICAgICAibG9hZCBiYXNlIiwgbGFuZ19maW5hbF9waGFzZV9lbnVtKTsKLQkgICAgICBtaW5mbyAoXygiIGxvYWQgYWRkcmVzcyAweCVWIiksIGFkZHIpOwotCSAgICB9Ci0JfQotCi0gICAgICBwcmludF9ubCAoKTsKLSAgICB9Ci0KLSAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+Y2hpbGRyZW4uaGVhZCwKLQkJCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hc3NpZ25tZW50IChhc3NpZ25tZW50LCBvdXRwdXRfc2VjdGlvbikKLSAgICAgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF90eXBlICogYXNzaWdubWVudDsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uOwotewotICBpbnQgaTsKLSAgZXRyZWVfdmFsdWVfdHlwZSByZXN1bHQ7Ci0KLSAgZm9yIChpID0gMDsgaSA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIOyBpKyspCi0gICAgcHJpbnRfc3BhY2UgKCk7Ci0KLSAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAoYXNzaWdubWVudC0+ZXhwLT5hc3NpZ24uc3JjLCBvdXRwdXRfc2VjdGlvbiwKLQkJCSAgbGFuZ19maW5hbF9waGFzZV9lbnVtLCBwcmludF9kb3QsICZwcmludF9kb3QpOwotICBpZiAocmVzdWx0LnZhbGlkX3ApCi0gICAgbWluZm8gKCIweCVWIiwgcmVzdWx0LnZhbHVlICsgcmVzdWx0LnNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWEpOwotICBlbHNlCi0gICAgewotICAgICAgbWluZm8gKCIqdW5kZWYqICAgIik7Ci0jaWZkZWYgQkZENjQKLSAgICAgIG1pbmZvICgiICAgICAgICAiKTsKLSNlbmRpZgotICAgIH0KLQotICBtaW5mbyAoIiAgICAgICAgICAgICAgICAiKTsKLQotICBleHBfcHJpbnRfdHJlZSAoYXNzaWdubWVudC0+ZXhwKTsKLQotICBwcmludF9ubCAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2lucHV0X3N0YXRlbWVudCAoc3RhdG0pCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiBzdGF0bTsKLXsKLSAgaWYgKHN0YXRtLT5maWxlbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIkxPQUQgJXNcbiIsIHN0YXRtLT5maWxlbmFtZSk7Ci0gICAgfQotfQotCi0vKiBQcmludCBhbGwgc3ltYm9scyBkZWZpbmVkIGluIGEgcGFydGljdWxhciBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQKLSAgIHZpYSBiZmRfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1wcmludF9vbmVfc3ltYm9sIChoYXNoX2VudHJ5LCBwdHIpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoYXNoX2VudHJ5OwotICAgICBQVFIgcHRyOwotewotICBhc2VjdGlvbiAqc2VjID0gKGFzZWN0aW9uICopIHB0cjsKLQotICBpZiAoKGhhc2hfZW50cnktPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgfHwgaGFzaF9lbnRyeS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAmJiBzZWMgPT0gaGFzaF9lbnRyeS0+dS5kZWYuc2VjdGlvbikKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIOyBpKyspCi0JcHJpbnRfc3BhY2UgKCk7Ci0gICAgICBtaW5mbyAoIjB4JVYgICAiLAotCSAgICAgKGhhc2hfZW50cnktPnUuZGVmLnZhbHVlCi0JICAgICAgKyBoYXNoX2VudHJ5LT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICAgKyBoYXNoX2VudHJ5LT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKSk7Ci0KLSAgICAgIG1pbmZvICgiICAgICAgICAgICAgICVUXG4iLCBoYXNoX2VudHJ5LT5yb290LnN0cmluZyk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQcmludCBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbnB1dCBzZWN0aW9uIHRvIHRoZSBtYXAgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9pbnB1dF9zZWN0aW9uIChpbikKLSAgICAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKiBpbjsKLXsKLSAgYXNlY3Rpb24gKmkgPSBpbi0+c2VjdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBzaXplID0gaS0+X2Nvb2tlZF9zaXplICE9IDAgPyBpLT5fY29va2VkX3NpemUgOiBpLT5fcmF3X3NpemU7Ci0KLSAgaWYgKHNpemUgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9zcGFjZSAoKTsKLQotICAgICAgbWluZm8gKCIlcyIsIGktPm5hbWUpOwotCi0gICAgICBpZiAoaS0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICBpbnQgbGVuOwotCi0JICBsZW4gPSAxICsgc3RybGVuIChpLT5uYW1lKTsKLQkgIGlmIChsZW4gPj0gU0VDVElPTl9OQU1FX01BUF9MRU5HVEggLSAxKQotCSAgICB7Ci0JICAgICAgcHJpbnRfbmwgKCk7Ci0JICAgICAgbGVuID0gMDsKLQkgICAgfQotCSAgd2hpbGUgKGxlbiA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc3BhY2UgKCk7Ci0JICAgICAgKytsZW47Ci0JICAgIH0KLQotCSAgbWluZm8gKCIweCVWICVXICVCXG4iLAotCQkgaS0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGktPm91dHB1dF9vZmZzZXQsIHNpemUsCi0JCSBpLT5vd25lcik7Ci0KLQkgIGlmIChpLT5fY29va2VkX3NpemUgIT0gMCAmJiBpLT5fY29va2VkX3NpemUgIT0gaS0+X3Jhd19zaXplKQotCSAgICB7Ci0JICAgICAgbGVuID0gU0VDVElPTl9OQU1FX01BUF9MRU5HVEggKyAzOwotI2lmZGVmIEJGRDY0Ci0JICAgICAgbGVuICs9IDE2OwotI2Vsc2UKLQkgICAgICBsZW4gKz0gODsKLSNlbmRpZgotCSAgICAgIHdoaWxlIChsZW4gPiAwKQotCQl7Ci0JCSAgcHJpbnRfc3BhY2UgKCk7Ci0JCSAgLS1sZW47Ci0JCX0KLQotCSAgICAgIG1pbmZvIChfKCIlVyAoc2l6ZSBiZWZvcmUgcmVsYXhpbmcpXG4iKSwgaS0+X3Jhd19zaXplKTsKLQkgICAgfQotCi0JICBiZmRfbGlua19oYXNoX3RyYXZlcnNlIChsaW5rX2luZm8uaGFzaCwgcHJpbnRfb25lX3N5bWJvbCwgKFBUUikgaSk7Ci0KLQkgIHByaW50X2RvdCA9IGktPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpLT5vdXRwdXRfb2Zmc2V0ICsgc2l6ZTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZmlsbF9zdGF0ZW1lbnQgKGZpbGwpCi0gICAgIGxhbmdfZmlsbF9zdGF0ZW1lbnRfdHlwZSAqIGZpbGw7Ci17Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiBGSUxMIG1hc2sgMHgleFxuIiwgZmlsbC0+ZmlsbCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9kYXRhX3N0YXRlbWVudCAoZGF0YSkKLSAgICAgbGFuZ19kYXRhX3N0YXRlbWVudF90eXBlICogZGF0YTsKLXsKLSAgaW50IGk7Ci0gIGJmZF92bWEgYWRkcjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQotICAgIHByaW50X3NwYWNlICgpOwotCi0gIGFkZHIgPSBkYXRhLT5vdXRwdXRfdm1hOwotICBpZiAoZGF0YS0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICBhZGRyICs9IGRhdGEtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgc3dpdGNoIChkYXRhLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBCWVRFOgotICAgICAgc2l6ZSA9IEJZVEVfU0laRTsKLSAgICAgIG5hbWUgPSAiQllURSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIT1JUOgotICAgICAgc2l6ZSA9IFNIT1JUX1NJWkU7Ci0gICAgICBuYW1lID0gIlNIT1JUIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTE9ORzoKLSAgICAgIHNpemUgPSBMT05HX1NJWkU7Ci0gICAgICBuYW1lID0gIkxPTkciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRVUFEOgotICAgICAgc2l6ZSA9IFFVQURfU0laRTsKLSAgICAgIG5hbWUgPSAiUVVBRCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNRVUFEOgotICAgICAgc2l6ZSA9IFFVQURfU0laRTsKLSAgICAgIG5hbWUgPSAiU1FVQUQiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIG1pbmZvICgiMHglViAlVyAlcyAweCV2IiwgYWRkciwgc2l6ZSwgbmFtZSwgZGF0YS0+dmFsdWUpOwotCi0gIGlmIChkYXRhLT5leHAtPnR5cGUubm9kZV9jbGFzcyAhPSBldHJlZV92YWx1ZSkKLSAgICB7Ci0gICAgICBwcmludF9zcGFjZSAoKTsKLSAgICAgIGV4cF9wcmludF90cmVlIChkYXRhLT5leHApOwotICAgIH0KLQotICBwcmludF9ubCAoKTsKLQotICBwcmludF9kb3QgPSBhZGRyICsgc2l6ZTsKLX0KLQotLyogUHJpbnQgYW4gYWRkcmVzcyBzdGF0ZW1lbnQuICBUaGVzZSBhcmUgZ2VuZXJhdGVkIGJ5IG9wdGlvbnMgbGlrZQotICAgLVR0ZXh0LiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FkZHJlc3Nfc3RhdGVtZW50IChhZGRyZXNzKQotICAgICBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X3R5cGUgKmFkZHJlc3M7Ci17Ci0gIG1pbmZvIChfKCJBZGRyZXNzIG9mIHNlY3Rpb24gJXMgc2V0IHRvICIpLCBhZGRyZXNzLT5zZWN0aW9uX25hbWUpOwotICBleHBfcHJpbnRfdHJlZSAoYWRkcmVzcy0+YWRkcmVzcyk7Ci0gIHByaW50X25sICgpOwotfQotCi0vKiBQcmludCBhIHJlbG9jIHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9yZWxvY19zdGF0ZW1lbnQgKHJlbG9jKQotICAgICBsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpyZWxvYzsKLXsKLSAgaW50IGk7Ci0gIGJmZF92bWEgYWRkcjsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQotICAgIHByaW50X3NwYWNlICgpOwotCi0gIGFkZHIgPSByZWxvYy0+b3V0cHV0X3ZtYTsKLSAgaWYgKHJlbG9jLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgIGFkZHIgKz0gcmVsb2MtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2MtPmhvd3RvKTsKLQotICBtaW5mbyAoIjB4JVYgJVcgUkVMT0MgJXMgIiwgYWRkciwgc2l6ZSwgcmVsb2MtPmhvd3RvLT5uYW1lKTsKLQotICBpZiAocmVsb2MtPm5hbWUgIT0gTlVMTCkKLSAgICBtaW5mbyAoIiVzKyIsIHJlbG9jLT5uYW1lKTsKLSAgZWxzZQotICAgIG1pbmZvICgiJXMrIiwgcmVsb2MtPnNlY3Rpb24tPm5hbWUpOwotCi0gIGV4cF9wcmludF90cmVlIChyZWxvYy0+YWRkZW5kX2V4cCk7Ci0KLSAgcHJpbnRfbmwgKCk7Ci0KLSAgcHJpbnRfZG90ID0gYWRkciArIHNpemU7Ci19ICAKLQotc3RhdGljIHZvaWQKLXByaW50X3BhZGRpbmdfc3RhdGVtZW50IChzKQotICAgICBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIGludCBsZW47Ci0gIGJmZF92bWEgYWRkcjsKLQotICBtaW5mbyAoIiAqZmlsbCoiKTsKLQotICBsZW4gPSBzaXplb2YgIiAqZmlsbCoiIC0gMTsKLSAgd2hpbGUgKGxlbiA8IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIKQotICAgIHsKLSAgICAgIHByaW50X3NwYWNlICgpOwotICAgICAgKytsZW47Ci0gICAgfQotCi0gIGFkZHIgPSBzLT5vdXRwdXRfb2Zmc2V0OwotICBpZiAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICBhZGRyICs9IHMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIG1pbmZvICgiMHglViAlVyIsIGFkZHIsIHMtPnNpemUpOwotCi0gIGlmIChzLT5maWxsICE9IDApCi0gICAgbWluZm8gKCIgJXUiLCBzLT5maWxsKTsKLQotICBwcmludF9ubCAoKTsKLQotICBwcmludF9kb3QgPSBhZGRyICsgcy0+c2l6ZTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3dpbGRfc3RhdGVtZW50ICh3LCBvcykKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICogdzsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG9zOwotewotICBwcmludF9zcGFjZSAoKTsKLQotICBpZiAody0+ZmlsZW5hbWVzX3NvcnRlZCkKLSAgICBtaW5mbyAoIlNPUlQoIik7Ci0gIGlmICh3LT5leGNsdWRlX2ZpbGVuYW1lICE9IE5VTEwpCi0gICAgbWluZm8gKCJFWENMVURFX0ZJTEUgKCAlcyApIiwgdy0+ZXhjbHVkZV9maWxlbmFtZSk7Ci0gIGlmICh3LT5maWxlbmFtZSAhPSBOVUxMKQotICAgIG1pbmZvICgiJXMiLCB3LT5maWxlbmFtZSk7Ci0gIGVsc2UKLSAgICBtaW5mbyAoIioiKTsKLSAgaWYgKHctPmZpbGVuYW1lc19zb3J0ZWQpCi0gICAgbWluZm8gKCIpIik7Ci0KLSAgbWluZm8gKCIoIik7Ci0gIGlmICh3LT5zZWN0aW9uc19zb3J0ZWQpCi0gICAgbWluZm8gKCJTT1JUKCIpOwotICBpZiAody0+c2VjdGlvbl9uYW1lICE9IE5VTEwpCi0gICAgbWluZm8gKCIlcyIsIHctPnNlY3Rpb25fbmFtZSk7Ci0gIGVsc2UKLSAgICBtaW5mbyAoIioiKTsKLSAgaWYgKHctPnNlY3Rpb25zX3NvcnRlZCkKLSAgICBtaW5mbyAoIikiKTsKLSAgbWluZm8gKCIpIik7Ci0KLSAgcHJpbnRfbmwgKCk7Ci0KLSAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKHctPmNoaWxkcmVuLmhlYWQsIG9zKTsKLX0KLQotLyogUHJpbnQgYSBncm91cCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfZ3JvdXAgKHMsIG9zKQotICAgICBsYW5nX2dyb3VwX3N0YXRlbWVudF90eXBlICpzOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLXsKLSAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiU1RBUlQgR1JPVVBcbiIpOwotICBwcmludF9zdGF0ZW1lbnRfbGlzdCAocy0+Y2hpbGRyZW4uaGVhZCwgb3MpOwotICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJFTkQgR1JPVVBcbiIpOwotfQotCi0vKiBQcmludCB0aGUgbGlzdCBvZiBzdGF0ZW1lbnRzIGluIFMuCi0gICBUaGlzIGNhbiBiZSBjYWxsZWQgZm9yIGFueSBzdGF0ZW1lbnQgdHlwZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zdGF0ZW1lbnRfbGlzdCAocywgb3MpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotewotICB3aGlsZSAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHByaW50X3N0YXRlbWVudCAocywgb3MpOwotICAgICAgcyA9IHMtPm5leHQ7Ci0gICAgfQotfQotCi0vKiBQcmludCB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHN0YXRlbWVudCBsaXN0IFMuCi0gICBUaGlzIGNhbiBiZSBjYWxsZWQgZm9yIGFueSBzdGF0ZW1lbnQgdHlwZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zdGF0ZW1lbnQgKHMsIG9zKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLXsKLSAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgXygiRmFpbCB3aXRoICVkXG4iKSwgcy0+aGVhZGVyLnR5cGUpOwotICAgICAgRkFJTCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0gICAgICBpZiAoY29uc3RydWN0b3JfbGlzdC5oZWFkICE9IE5VTEwpCi0JewotCSAgaWYgKGNvbnN0cnVjdG9yc19zb3J0ZWQpCi0JICAgIG1pbmZvICgiIFNPUlQgKENPTlNUUlVDVE9SUylcbiIpOwotCSAgZWxzZQotCSAgICBtaW5mbyAoIiBDT05TVFJVQ1RPUlNcbiIpOwotCSAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCwgb3MpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfd2lsZF9zdGF0ZW1lbnQgKCZzLT53aWxkX3N0YXRlbWVudCwgb3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9hZGRyZXNzX3N0YXRlbWVudCAoJnMtPmFkZHJlc3Nfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLSAgICAgIG1pbmZvICgiIENSRUFURV9PQkpFQ1RfU1lNQk9MU1xuIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X2ZpbGxfc3RhdGVtZW50ICgmcy0+ZmlsbF9zdGF0ZW1lbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9kYXRhX3N0YXRlbWVudCAoJnMtPmRhdGFfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X3JlbG9jX3N0YXRlbWVudCAoJnMtPnJlbG9jX3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotICAgICAgcHJpbnRfaW5wdXRfc2VjdGlvbiAoJnMtPmlucHV0X3NlY3Rpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9wYWRkaW5nX3N0YXRlbWVudCAoJnMtPnBhZGRpbmdfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X2Fzc2lnbm1lbnQgKCZzLT5hc3NpZ25tZW50X3N0YXRlbWVudCwgb3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIlRBUkdFVCglcylcbiIsIHMtPnRhcmdldF9zdGF0ZW1lbnQudGFyZ2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06Ci0gICAgICBtaW5mbyAoIk9VVFBVVCglcyIsIHMtPm91dHB1dF9zdGF0ZW1lbnQubmFtZSk7Ci0gICAgICBpZiAob3V0cHV0X3RhcmdldCAhPSBOVUxMKQotCW1pbmZvICgiICVzIiwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBtaW5mbyAoIilcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfaW5wdXRfc3RhdGVtZW50ICgmcy0+aW5wdXRfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X2dyb3VwICgmcy0+Z3JvdXBfc3RhdGVtZW50LCBvcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfYWZpbGVfYXNlY3Rpb25fcGFpcl9zdGF0ZW1lbnRfZW51bToKLSAgICAgIEZBSUwgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zdGF0ZW1lbnRzICgpCi17Ci0gIHByaW50X3N0YXRlbWVudF9saXN0IChzdGF0ZW1lbnRfbGlzdC5oZWFkLCBhYnNfb3V0cHV0X3NlY3Rpb24pOwotfQotCi0vKiBQcmludCB0aGUgZmlyc3QgTiBzdGF0ZW1lbnRzIGluIHN0YXRlbWVudCBsaXN0IFMgdG8gU1RERVJSLgotICAgSWYgTiA9PSAwLCBub3RoaW5nIGlzIHByaW50ZWQuCi0gICBJZiBOIDwgMCwgdGhlIGVudGlyZSBsaXN0IGlzIHByaW50ZWQuCi0gICBJbnRlbmRlZCB0byBiZSBjYWxsZWQgZnJvbSBHREIuICAqLwotCi12b2lkCi1kcHJpbnRfc3RhdGVtZW50IChzLCBuKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogczsKLSAgICAgaW50IG47Ci17Ci0gIEZJTEUgKm1hcF9zYXZlID0gY29uZmlnLm1hcF9maWxlOwotCi0gIGNvbmZpZy5tYXBfZmlsZSA9IHN0ZGVycjsKLQotICBpZiAobiA8IDApCi0gICAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKHMsIGFic19vdXRwdXRfc2VjdGlvbik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAocyAmJiAtLW4gPj0gMCkKLQl7Ci0JICBwcmludF9zdGF0ZW1lbnQgKHMsIGFic19vdXRwdXRfc2VjdGlvbik7Ci0JICBzID0gcy0+bmV4dDsKLQl9Ci0gICAgfQotCi0gIGNvbmZpZy5tYXBfZmlsZSA9IG1hcF9zYXZlOwotfQotCi1zdGF0aWMgYmZkX3ZtYQotaW5zZXJ0X3BhZCAodGhpc19wdHIsIGZpbGwsIHBvd2VyLCBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsIGRvdCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiB0aGlzX3B0cjsKLSAgICAgZmlsbF90eXBlIGZpbGw7Ci0gICAgIHVuc2lnbmVkIGludCBwb3dlcjsKLSAgICAgYXNlY3Rpb24gKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0gICAgIGJmZF92bWEgZG90OwotewotICAvKiBBbGlnbiB0aGlzIHNlY3Rpb24gZmlyc3QgdG8gdGhlCi0gICAgIGlucHV0IHNlY3Rpb25zIHJlcXVpcmVtZW50LCB0aGVuCi0gICAgIHRvIHRoZSBvdXRwdXQgc2VjdGlvbidzIHJlcXVpcmVtZW50LgotICAgICBJZiB0aGlzIGFsaWdubWVudCBpcyA+IHRoYW4gYW55IHNlZW4gYmVmb3JlLAotICAgICB0aGVuIHJlY29yZCBpdCB0b28uIFBlcmZvcm0gdGhlIGFsaWdubWVudCBieQotICAgICBpbnNlcnRpbmcgYSBtYWdpYyAncGFkZGluZycgc3RhdGVtZW50LgotICAgICAqLwotCi0gIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfbmVlZGVkID0gYWxpZ25fcG93ZXIgKGRvdCwgcG93ZXIpIC0gZG90OwotCi0gIGlmIChhbGlnbm1lbnRfbmVlZGVkICE9IDApCi0gICAgewotICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqbmV3ID0KLQkoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikKLQkgc3RhdF9hbGxvYyAoc2l6ZW9mIChsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGUpKSk7Ci0KLSAgICAgIC8qIExpbmsgaW50byBleGlzdGluZyBjaGFpbiAqLwotICAgICAgbmV3LT5oZWFkZXIubmV4dCA9ICp0aGlzX3B0cjsKLSAgICAgICp0aGlzX3B0ciA9IG5ldzsKLSAgICAgIG5ldy0+aGVhZGVyLnR5cGUgPSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW07Ci0gICAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uID0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICAgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfb2Zmc2V0ID0KLQlkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPnZtYTsKLSAgICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQuZmlsbCA9IGZpbGw7Ci0gICAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50LnNpemUgPSBhbGlnbm1lbnRfbmVlZGVkOwotICAgIH0KLQotCi0gIC8qIFJlbWVtYmVyIHRoZSBtb3N0IHJlc3RyaWN0aXZlIGFsaWdubWVudCAqLwotICBpZiAocG93ZXIgPiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmFsaWdubWVudF9wb3dlcikKLSAgICB7Ci0gICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotICAgIH0KLSAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5fcmF3X3NpemUgKz0gYWxpZ25tZW50X25lZWRlZDsKLSAgcmV0dXJuIGFsaWdubWVudF9uZWVkZWQgKyBkb3Q7Ci0KLX0KLQotLyogV29yayBvdXQgaG93IG11Y2ggdGhpcyBzZWN0aW9uIHdpbGwgbW92ZSB0aGUgZG90IHBvaW50ICovCi1zdGF0aWMgYmZkX3ZtYQotc2l6ZV9pbnB1dF9zZWN0aW9uICh0aGlzX3B0ciwgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBmaWxsLCBkb3QsIHJlbGF4KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqIHRoaXNfcHRyOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICogb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICAgICBmaWxsX3R5cGUgZmlsbDsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci0gICAgIGJvb2xlYW4gcmVsYXggQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmlzID0gJigoKnRoaXNfcHRyKS0+aW5wdXRfc2VjdGlvbik7Ci0gIGFzZWN0aW9uICppID0gaXMtPnNlY3Rpb247Ci0KLSAgaWYgKGlzLT5pZmlsZS0+anVzdF9zeW1zX2ZsYWcgPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+c3Vic2VjdGlvbl9hbGlnbm1lbnQgIT0gLTEpCi0gICAgICAgaS0+YWxpZ25tZW50X3Bvd2VyID0KLQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPnN1YnNlY3Rpb25fYWxpZ25tZW50OwotCi0gICAgICBkb3QgPSBpbnNlcnRfcGFkICh0aGlzX3B0ciwgZmlsbCwgaS0+YWxpZ25tZW50X3Bvd2VyLAotCQkJb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbiwgZG90KTsKLQotICAgICAgLyogUmVtZW1iZXIgd2hlcmUgaW4gdGhlIG91dHB1dCBzZWN0aW9uIHRoaXMgaW5wdXQgc2VjdGlvbiBnb2VzICovCi0KLSAgICAgIGktPm91dHB1dF9vZmZzZXQgPSBkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIC8qIE1hcmsgaG93IGJpZyB0aGUgb3V0cHV0IHNlY3Rpb24gbXVzdCBiZSB0byBjb250YWluIHRoaXMgbm93Ci0JICovCi0gICAgICBpZiAoaS0+X2Nvb2tlZF9zaXplICE9IDApCi0JZG90ICs9IGktPl9jb29rZWRfc2l6ZTsKLSAgICAgIGVsc2UKLQlkb3QgKz0gaS0+X3Jhd19zaXplOwotICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplID0gZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGktPm91dHB1dF9vZmZzZXQgPSBpLT52bWEgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7Ci0gICAgfQotCi0gIHJldHVybiBkb3Q7Ci19Ci0KLSNkZWZpbmUgSUdOT1JFX1NFQ1RJT04oYmZkLCBzKSBcCi0gICgoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYmZkLCBzKSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCkpICE9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCkpIFwKLSAgIHx8IGJmZF9zZWN0aW9uX3NpemUgKGJmZCwgcykgPT0gMCkKLQotLyogQ2hlY2sgdG8gc2VlIGlmIGFueSBhbGxvY2F0ZWQgc2VjdGlvbnMgb3ZlcmxhcCB3aXRoIG90aGVyIGFsbG9jYXRlZAotICAgc2VjdGlvbnMuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgbGlua2VyIHNjcmlwdCBzcGVjaWZpY2FsbHkgc3BlY2lmaWVzCi0gICB0aGUgb3V0cHV0IHNlY3Rpb24gYWRkcmVzc2VzIG9mIHRoZSB0d28gc2VjdGlvbnMuICAqLwotc3RhdGljIHZvaWQKLWxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgKCkKLXsKLSAgYXNlY3Rpb24gKiBzOwotCi0gIC8qIFNjYW4gYWxsIHNlY3Rpb25zIGluIHRoZSBvdXRwdXQgbGlzdC4gICovCi0gIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICogb3M7Ci0gICAgICAKLSAgICAgIC8qIElnbm9yZSBzZWN0aW9ucyB3aGljaCBhcmUgbm90IGxvYWRlZCBvciB3aGljaCBoYXZlIG5vIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChJR05PUkVfU0VDVElPTiAob3V0cHV0X2JmZCwgcykpCi0JY29udGludWU7Ci0gICAgICAKLSAgICAgIC8qIE9uY2Ugd2UgcmVhY2ggc2VjdGlvbiAncycgc3RvcCBvdXIgc2VhY2guICBUaGlzIHByZXZlbnRzIHR3bwotCSB3YXJuaW5nIG1lc3NhZ2VzIGZyb20gYmVpbmcgcHJvZHVjZWQsIG9uZSBmb3IgJ3NlY3Rpb24gQSBvdmVybGFwcwotCSBzZWN0aW9uIEInIGFuZCBvbmUgZm9yICdzZWN0aW9uIEIgb3ZlcmxhcHMgc2VjdGlvbiBBJy4gICovCi0gICAgICBmb3IgKG9zID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IG9zICE9IHM7IG9zID0gb3MtPm5leHQpCi0JewotCSAgYmZkX3ZtYSBzX3N0YXJ0OwotCSAgYmZkX3ZtYSBzX2VuZDsKLQkgIGJmZF92bWEgb3Nfc3RhcnQ7Ci0JICBiZmRfdm1hIG9zX2VuZDsKLQkgIAotCSAgLyogT25seSBjb25zaWRlciBsb2FkYWJsZSBzZWN0aW9ucyB3aXRoIHJlYWwgY29udGVudHMuICAqLwotCSAgaWYgKElHTk9SRV9TRUNUSU9OIChvdXRwdXRfYmZkLCBvcykpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBXZSBtdXN0IGNoZWNrIHRoZSBzZWN0aW9ucycgTE1BIGFkZHJlc3NlcyBub3QgdGhlaXIKLQkgICAgIFZNQSBhZGRyZXNzZXMgYmVjYXVzZSBvdmVybGF5IHNlY3Rpb25zIGNhbiBoYXZlCi0JICAgICBvdmVybGFwcGluZyBWTUFzIGJ1dCB0aGV5IG11c3QgaGF2ZSBkaXN0aW5jdCBMTUFzLiAgKi8KLQkgIHNfc3RhcnQgID0gYmZkX3NlY3Rpb25fbG1hIChvdXRwdXRfYmZkLCBzKTsKLQkgIG9zX3N0YXJ0ID0gYmZkX3NlY3Rpb25fbG1hIChvdXRwdXRfYmZkLCBvcyk7Ci0JICBzX2VuZCAgICA9IHNfc3RhcnQgICsgYmZkX3NlY3Rpb25fc2l6ZSAob3V0cHV0X2JmZCwgcykgLSAxOwotCSAgb3NfZW5kICAgPSBvc19zdGFydCArIGJmZF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIG9zKSAtIDE7Ci0JICAKLQkgIC8qIExvb2sgZm9yIGFuIG92ZXJsYXAuICAqLwotCSAgaWYgKChzX2VuZCA8IG9zX3N0YXJ0KSB8fCAoc19zdGFydCA+IG9zX2VuZCkpCi0JICAgIGNvbnRpbnVlOwotCSAgCi0JICBlaW5mbyAoCi1fKCIlWCVQOiBzZWN0aW9uICVzIFslViAtPiAlVl0gb3ZlcmxhcHMgc2VjdGlvbiAlcyBbJVYgLT4gJVZdXG4iKSwKLQkJIHMtPm5hbWUsIHNfc3RhcnQsIHNfZW5kLCBvcy0+bmFtZSwgb3Nfc3RhcnQsIG9zX2VuZCk7Ci0JICAKLQkgIC8qIE9uY2Ugd2UgaGF2ZSBmb3VuZCBvbmUgb3ZlcmxhcCBmb3IgdGhpcyBzZWN0aW9uLAotCSAgICAgc3RvcCBsb29raW5nIGZvciBvdGhlcnMuICAqLwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotLyogVGhpcyB2YXJpYWJsZSBpbmRpY2F0ZXMgd2hldGhlciBiZmRfcmVsYXhfc2VjdGlvbiBzaG91bGQgYmUgY2FsbGVkCi0gICBhZ2Fpbi4gICovCi0KLXN0YXRpYyBib29sZWFuIHJlbGF4X2FnYWluOwotCi0vKiBTZXQgdGhlIHNpemVzIGZvciBhbGwgdGhlIG91dHB1dCBzZWN0aW9ucy4gICovCi0KLWJmZF92bWEKLWxhbmdfc2l6ZV9zZWN0aW9ucyAocywgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBwcmV2LCBmaWxsLCBkb3QsIHJlbGF4KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogczsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiBwcmV2OwotICAgICBmaWxsX3R5cGUgZmlsbDsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci0gICAgIGJvb2xlYW4gcmVsYXg7Ci17Ci0gIC8qIFNpemUgdXAgdGhlIHNlY3Rpb25zIGZyb20gdGhlaXIgY29uc3RpdHVlbnQgcGFydHMuICAqLwotICBmb3IgKDsgcyAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQotCXsKLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgYWZ0ZXI7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zID0gJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLQotCSAgICBpZiAob3MtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgICAgLyogVGhpcyBzZWN0aW9uIHdhcyBuZXZlciBhY3R1YWxseSBjcmVhdGVkLiAgKi8KLQkgICAgICBicmVhazsKLQotCSAgICAvKiBJZiB0aGlzIGlzIGEgQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLCB1c2UgdGhlIHNpemUgYW5kCi0JICAgICAgIGFkZHJlc3MgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbi4gIEZJWE1FOiBUaGlzIGlzIENPRkYKLQkgICAgICAgc3BlY2lmaWM7IGl0IHdvdWxkIGJlIGNsZWFuZXIgaWYgdGhlcmUgd2VyZSBzb21lIG90aGVyIHdheQotCSAgICAgICB0byBkbyB0aGlzLCBidXQgbm90aGluZyBzaW1wbGUgY29tZXMgdG8gbWluZC4gICovCi0JICAgIGlmICgob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZKSAhPSAwKQotCSAgICAgIHsKLQkJYXNlY3Rpb24gKiBpbnB1dDsKLQotCQlpZiAob3MtPmNoaWxkcmVuLmhlYWQgPT0gTlVMTAotCQkgICAgfHwgb3MtPmNoaWxkcmVuLmhlYWQtPm5leHQgIT0gTlVMTAotCQkgICAgfHwgb3MtPmNoaWxkcmVuLmhlYWQtPmhlYWRlci50eXBlICE9IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtKQotCQkgIGVpbmZvIChfKCIlUCVYOiBJbnRlcm5hbCBlcnJvciBvbiBDT0ZGIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb24gJXNcbiIpLAotCQkJIG9zLT5uYW1lKTsKLQotCQlpbnB1dCA9IG9zLT5jaGlsZHJlbi5oZWFkLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb247Ci0JCWJmZF9zZXRfc2VjdGlvbl92bWEgKG9zLT5iZmRfc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgICBvcy0+YmZkX3NlY3Rpb24sCi0JCQkJICAgICBiZmRfc2VjdGlvbl92bWEgKGlucHV0LT5vd25lciwgaW5wdXQpKTsKLQkJb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgPSBpbnB1dC0+X3Jhd19zaXplOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAob3MtPmJmZF9zZWN0aW9uKSkKLQkgICAgICB7Ci0JCS8qIE5vIG1hdHRlciB3aGF0IGhhcHBlbnMsIGFuIGFicyBzZWN0aW9uIHN0YXJ0cyBhdCB6ZXJvLiAgKi8KLQkJQVNTRVJUIChvcy0+YmZkX3NlY3Rpb24tPnZtYSA9PSAwKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWlmIChvcy0+YWRkcl90cmVlID09IChldHJlZV90eXBlICopIE5VTEwpCi0JCSAgewotCQkgICAgLyogTm8gYWRkcmVzcyBzcGVjaWZpZWQgZm9yIHRoaXMgc2VjdGlvbiwgZ2V0IG9uZQotCQkgICAgICAgZnJvbSB0aGUgcmVnaW9uIHNwZWNpZmljYXRpb24uICAqLwotCQkgICAgaWYgKG9zLT5yZWdpb24gPT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEwKLQkJCXx8ICgoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKQotCQkJICAgICAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSAhPSAwKQotCQkJICAgICYmIG9zLT5yZWdpb24tPm5hbWVbMF0gPT0gJyonCi0JCQkgICAgJiYgc3RyY21wIChvcy0+cmVnaW9uLT5uYW1lLCAiKmRlZmF1bHQqIikgPT0gMCkpCi0JCSAgICAgIHsKLQkJCW9zLT5yZWdpb24gPSBsYW5nX21lbW9yeV9kZWZhdWx0IChvcy0+YmZkX3NlY3Rpb24pOwotCQkgICAgICB9Ci0KLQkJICAgIC8qIElmIGEgbG9hZGFibGUgc2VjdGlvbiBpcyB1c2luZyB0aGUgZGVmYXVsdCBtZW1vcnkKLQkJICAgICAgIHJlZ2lvbiwgYW5kIHNvbWUgbm9uIGRlZmF1bHQgbWVtb3J5IHJlZ2lvbnMgd2VyZQotCQkgICAgICAgZGVmaW5lZCwgaXNzdWUgYSB3YXJuaW5nLiAgKi8KLQkJICAgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvdXRwdXRfYmZkLCBvcy0+YmZkX3NlY3Rpb24pCi0JCQkgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSAhPSAwCi0JCQkmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLQkJCSYmIHN0cmNtcCAob3MtPnJlZ2lvbi0+bmFtZSwgIipkZWZhdWx0KiIpID09IDAKLQkJCSYmIGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0ICE9IE5VTEwKLQkJCSYmIChzdHJjbXAgKGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0LT5uYW1lLCAiKmRlZmF1bHQqIikgIT0gMAotCQkJICAgIHx8IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0LT5uZXh0ICE9IE5VTEwpKQotCQkgICAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IG5vIG1lbW9yeSByZWdpb24gc3BlY2lmaWVkIGZvciBzZWN0aW9uIGAlcydcbiIpLAotCQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKSk7Ci0KLQkJICAgIGRvdCA9IG9zLT5yZWdpb24tPmN1cnJlbnQ7Ci0gCi0JCSAgICBpZiAob3MtPnNlY3Rpb25fYWxpZ25tZW50ID09IC0xKQotCQkgICAgICB7Ci0JCQliZmRfdm1hIG9sZGRvdDsKLQotCQkJb2xkZG90ID0gZG90OwotCQkJZG90ID0gYWxpZ25fcG93ZXIgKGRvdCwgb3MtPmJmZF9zZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpOwotCi0JCQlpZiAoZG90ICE9IG9sZGRvdCAmJiBjb25maWcud2Fybl9zZWN0aW9uX2FsaWduKQotCQkJICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IGNoYW5naW5nIHN0YXJ0IG9mIHNlY3Rpb24gJXMgYnkgJXUgYnl0ZXNcbiIpLAotCQkJCSBvcy0+bmFtZSwgKHVuc2lnbmVkIGludCkgKGRvdCAtIG9sZGRvdCkpOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgZXRyZWVfdmFsdWVfdHlwZSByOwotCi0JCSAgICByID0gZXhwX2ZvbGRfdHJlZSAob3MtPmFkZHJfdHJlZSwKLQkJCQkgICAgICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJCSAgICAgICBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSwKLQkJCQkgICAgICAgZG90LCAmZG90KTsKLQkJICAgIGlmIChyLnZhbGlkX3AgPT0gZmFsc2UpCi0JCSAgICAgIHsKLQkJCWVpbmZvIChfKCIlRiVTOiBub24gY29uc3RhbnQgYWRkcmVzcyBleHByZXNzaW9uIGZvciBzZWN0aW9uICVzXG4iKSwKLQkJCSAgICAgICBvcy0+bmFtZSk7Ci0JCSAgICAgIH0KLQkJICAgIGRvdCA9IHIudmFsdWUgKyByLnNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWE7Ci0JCSAgfQotCQkKLQkJLyogVGhlIHNlY3Rpb24gc3RhcnRzIGhlcmUuCi0JCSAgIEZpcnN0LCBhbGlnbiB0byB3aGF0IHRoZSBzZWN0aW9uIG5lZWRzLiAgKi8KLQotCQlpZiAob3MtPnNlY3Rpb25fYWxpZ25tZW50ICE9IC0xKQotCQkgIGRvdCA9IGFsaWduX3Bvd2VyIChkb3QsIG9zLT5zZWN0aW9uX2FsaWdubWVudCk7Ci0KLQkJYmZkX3NldF9zZWN0aW9uX3ZtYSAoMCwgb3MtPmJmZF9zZWN0aW9uLCBkb3QpOwotCQkKLQkJb3MtPmJmZF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID0gMDsKLQkgICAgICB9Ci0KLQkgICAgKHZvaWQpIGxhbmdfc2l6ZV9zZWN0aW9ucyAob3MtPmNoaWxkcmVuLmhlYWQsIG9zLCAmb3MtPmNoaWxkcmVuLmhlYWQsCi0JCQkJICAgICAgIG9zLT5maWxsLCBkb3QsIHJlbGF4KTsKLQkgICAgCi0JICAgIC8qIElnbm9yZSB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc2VjdGlvbnMsIHVzZSB0aGUgdm1hIGFuZCBzaXplIHRvCi0JICAgICAgIGFsaWduIGFnYWluc3QuICAqLwotCi0JICAgIGFmdGVyID0gQUxJR05fTiAob3MtPmJmZF9zZWN0aW9uLT52bWEgKwotCQkJICAgICBvcy0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSwKLQkJCSAgICAgLyogVGhlIGNvZXJjaW9uIGhlcmUgaXMgaW1wb3J0YW50LCBzZWUgbGQuaC4gICovCi0JCQkgICAgIChiZmRfdm1hKSBvcy0+YmxvY2tfdmFsdWUpOwotCi0JICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKG9zLT5iZmRfc2VjdGlvbikpCi0JICAgICAgQVNTRVJUIChhZnRlciA9PSBvcy0+YmZkX3NlY3Rpb24tPnZtYSk7Ci0JICAgIGVsc2UKLQkgICAgICBvcy0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSA9IGFmdGVyIC0gb3MtPmJmZF9zZWN0aW9uLT52bWE7Ci0JICAgIGRvdCA9IG9zLT5iZmRfc2VjdGlvbi0+dm1hICsgb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0JICAgIG9zLT5wcm9jZXNzZWQgPSB0cnVlOwotCi0JICAgIC8qIFVwZGF0ZSBkb3QgaW4gdGhlIHJlZ2lvbiA/Ci0JICAgICAgIFdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgc2VjdGlvbiBpcyBnb2luZyB0byBiZSBhbGxvY2F0ZWQsCi0JICAgICAgIHNpbmNlIHVuYWxsb2NhdGVkIHNlY3Rpb25zIGRvIG5vdCBjb250cmlidXRlIHRvIHRoZSByZWdpb24ncwotCSAgICAgICBvdmVyYWxsIHNpemUgaW4gbWVtb3J5LiAgKi8KLQkgICAgaWYgKG9zLT5yZWdpb24gIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEwKLQkJJiYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKQotCQkgICAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSkKLQkgICAgICB7Ci0JCW9zLT5yZWdpb24tPmN1cnJlbnQgPSBkb3Q7Ci0JCQotCQkvKiBNYWtlIHN1cmUgdGhlIG5ldyBhZGRyZXNzIGlzIHdpdGhpbiB0aGUgcmVnaW9uLiAgV2UKLSAgICAgICAgICAgICAgICAgICBleHBsaWNpdGx5IHBlcm1pdCB0aGUgY3VycmVudCBhZGRyZXNzIHRvIGJlIGF0IHRoZQotICAgICAgICAgICAgICAgICAgIGV4YWN0IGVuZCBvZiB0aGUgcmVnaW9uIHdoZW4gdGhlIFZNQSBpcyBub24temVybywKLSAgICAgICAgICAgICAgICAgICBpbiBjYXNlIHRoZSByZWdpb24gaXMgYXQgdGhlIGVuZCBvZiBhZGRyZXNzYWJsZQotICAgICAgICAgICAgICAgICAgIG1lbW9yeSBhbmQgdGhlIGNhbGN1bGF0aW9uIHdyYXBzIGFyb3VuZC4gICovCi0JCWlmICgob3MtPnJlZ2lvbi0+Y3VycmVudCA8IG9zLT5yZWdpb24tPm9yaWdpbgotCQkgICAgIHx8IChvcy0+cmVnaW9uLT5jdXJyZW50IC0gb3MtPnJlZ2lvbi0+b3JpZ2luCi0JCQkgPiBvcy0+cmVnaW9uLT5sZW5ndGgpKQotCQkgICAgJiYgKChvcy0+cmVnaW9uLT5jdXJyZW50Ci0JCQkgIT0gb3MtPnJlZ2lvbi0+b3JpZ2luICsgb3MtPnJlZ2lvbi0+bGVuZ3RoKQotCQkJfHwgb3MtPmJmZF9zZWN0aW9uLT52bWEgPT0gMCkpCi0KLQkJICB7Ci0JCSAgICBpZiAob3MtPmFkZHJfdHJlZSAhPSAoZXRyZWVfdHlwZSAqKSBOVUxMKQotCQkgICAgICB7Ci0JCQllaW5mbyAoXygiJVglUDogYWRkcmVzcyAweCV2IG9mICVCIHNlY3Rpb24gJXMgaXMgbm90IHdpdGhpbiByZWdpb24gJXNcbiIpLAotCQkJICAgICAgIG9zLT5yZWdpb24tPmN1cnJlbnQsCi0JCQkgICAgICAgb3MtPmJmZF9zZWN0aW9uLT5vd25lciwKLQkJCSAgICAgICBvcy0+YmZkX3NlY3Rpb24tPm5hbWUsCi0JCQkgICAgICAgb3MtPnJlZ2lvbi0+bmFtZSk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJZWluZm8gKF8oIiVYJVA6IHJlZ2lvbiAlcyBpcyBmdWxsICglQiBzZWN0aW9uICVzKVxuIiksCi0JCQkgICAgICAgb3MtPnJlZ2lvbi0+bmFtZSwKLQkJCSAgICAgICBvcy0+YmZkX3NlY3Rpb24tPm93bmVyLAotCQkJICAgICAgIG9zLT5iZmRfc2VjdGlvbi0+bmFtZSk7Ci0JCSAgICAgIH0KLQkJICAgIC8qIFJlc2V0IHRoZSByZWdpb24gcG9pbnRlci4gICovCi0JCSAgICBvcy0+cmVnaW9uLT5jdXJyZW50ID0gb3MtPnJlZ2lvbi0+b3JpZ2luOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0JICBkb3QgPSBsYW5nX3NpemVfc2VjdGlvbnMgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCwKLQkJCQkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJCSAgICAmcy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkgICAgZmlsbCwKLQkJCQkgICAgZG90LCByZWxheCk7Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7Ci0KLQkgICAgcy0+ZGF0YV9zdGF0ZW1lbnQub3V0cHV0X3ZtYSA9IGRvdCAtIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPnZtYTsKLQkgICAgcy0+ZGF0YV9zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb24gPQotCSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb247Ci0KLQkgICAgc3dpdGNoIChzLT5kYXRhX3N0YXRlbWVudC50eXBlKQotCSAgICAgIHsKLQkgICAgICBjYXNlIFFVQUQ6Ci0JICAgICAgY2FzZSBTUVVBRDoKLQkJc2l6ZSA9IFFVQURfU0laRTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBMT05HOgotCQlzaXplID0gTE9OR19TSVpFOwotCQlicmVhazsKLQkgICAgICBjYXNlIFNIT1JUOgotCQlzaXplID0gU0hPUlRfU0laRTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBCWVRFOgotCQlzaXplID0gQllURV9TSVpFOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgZG90ICs9IHNpemU7Ci0JICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSArPSBzaXplOwotCSAgICAvKiBUaGUgb3V0cHV0IHNlY3Rpb24gZ2V0cyBjb250ZW50cywgYW5kIHRoZW4gd2UgaW5zcGVjdCBmb3IKLQkgICAgICAgYW55IGZsYWdzIHNldCBpbiB0aGUgaW5wdXQgc2NyaXB0IHdoaWNoIG92ZXJyaWRlIGFueSBBTExPQy4gICovCi0JICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIGlmICghKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+ZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkpIHsKLQkgICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLQkgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGludCBzaXplOwotCi0JICAgIHMtPnJlbG9jX3N0YXRlbWVudC5vdXRwdXRfdm1hID0KLQkgICAgICBkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7Ci0JICAgIHMtPnJlbG9jX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9Ci0JICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbjsKLQkgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocy0+cmVsb2Nfc3RhdGVtZW50Lmhvd3RvKTsKLQkgICAgZG90ICs9IHNpemU7Ci0JICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSArPSBzaXplOwotCSAgfQotCSAgYnJlYWs7Ci0gICAgIAotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCi0JICBkb3QgPSBsYW5nX3NpemVfc2VjdGlvbnMgKHMtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsCi0JCQkJICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICAgJnMtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsCi0KLQkJCQkgICAgZmlsbCwgZG90LCByZWxheCk7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF9lbnVtOgotCSAgbGlua19pbmZvLmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uID0KLQkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbjsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19pbnB1dF9zZWN0aW9uX2VudW06Ci0JICB7Ci0JICAgIGFzZWN0aW9uICppOwotCi0JICAgIGkgPSAoKnByZXYpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb247Ci0JICAgIGlmICghIHJlbGF4KQotCSAgICAgIHsKLQkJaWYgKGktPl9jb29rZWRfc2l6ZSA9PSAwKQotCQkgIGktPl9jb29rZWRfc2l6ZSA9IGktPl9yYXdfc2l6ZTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWJvb2xlYW4gYWdhaW47Ci0KLQkJaWYgKCEgYmZkX3JlbGF4X3NlY3Rpb24gKGktPm93bmVyLCBpLCAmbGlua19pbmZvLCAmYWdhaW4pKQotCQkgIGVpbmZvIChfKCIlUCVGOiBjYW4ndCByZWxheCBzZWN0aW9uOiAlRVxuIikpOwotCQlpZiAoYWdhaW4pCi0JCSAgcmVsYXhfYWdhaW4gPSB0cnVlOwotCSAgICAgIH0KLQkgICAgZG90ID0gc2l6ZV9pbnB1dF9zZWN0aW9uIChwcmV2LAotCQkJCSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmZpbGwsCi0JCQkJICAgICAgZG90LCByZWxheCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bToKLQkgIHMtPmZpbGxfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uID0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbjsKLQotCSAgZmlsbCA9IHMtPmZpbGxfc3RhdGVtZW50LmZpbGw7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSBuZXdkb3QgPSBkb3Q7Ci0KLQkgICAgZXhwX2ZvbGRfdHJlZSAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwLAotCQkJICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJICAgbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0sCi0JCQkgICBkb3QsCi0JCQkgICAmbmV3ZG90KTsKLQotCSAgICBpZiAobmV3ZG90ICE9IGRvdCkKLQkgICAgICB7Ci0JCS8qIFRoZSBhc3NpZ25tZW50IGNoYW5nZWQgZG90LiAgSW5zZXJ0IGEgcGFkLiAgKi8KLQkJaWYgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCA9PSBhYnNfb3V0cHV0X3NlY3Rpb24pCi0JCSAgewotCQkgICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbiBvdXRwdXQgc2VjdGlvbiwgdGhlbiBqdXN0IGFkanVzdAotCQkgICAgICAgdGhlIGRlZmF1bHQgbWVtb3J5IGFkZHJlc3MuICAqLwotCQkgICAgbGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCAoIipkZWZhdWx0KiIpLT5jdXJyZW50ID0gbmV3ZG90OwotCQkgIH0KLQkJZWxzZSBpZiAoIXJlbGF4KQotCQkgIHsKLQkJICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKm5ldyA9Ci0JCSAgICAgICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKQotCQkgICAgICAgc3RhdF9hbGxvYyAoc2l6ZW9mIChsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGUpKSk7Ci0KLQkJICAgIC8qIExpbmsgaW50byBleGlzdGluZyBjaGFpbi4gICovCi0JCSAgICBuZXctPmhlYWRlci5uZXh0ID0gKnByZXY7Ci0JCSAgICAqcHJldiA9IG5ldzsKLQkJICAgIG5ldy0+aGVhZGVyLnR5cGUgPSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW07Ci0JCSAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uID0KLQkJICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbjsKLQkJICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X29mZnNldCA9Ci0JCSAgICAgIGRvdCAtIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPnZtYTsKLQkJICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQuZmlsbCA9IGZpbGw7Ci0JCSAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50LnNpemUgPSBuZXdkb3QgLSBkb3Q7Ci0JCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgKz0KLQkJICAgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5zaXplOwotCQkgIH0KLQotCQlkb3QgPSBuZXdkb3Q7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bToKLQkgIC8qIElmIHdlIGFyZSByZWxheGluZywgYW5kIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBwYXNzLCBzb21lCi0JICAgICBwYWRkaW5nIHN0YXRlbWVudHMgbWF5IGhhdmUgYmVlbiBpbnNlcnRlZCBkdXJpbmcgcHJldmlvdXMKLQkgICAgIHBhc3Nlcy4gIFdlIG1heSBoYXZlIHRvIG1vdmUgdGhlIHBhZGRpbmcgc3RhdGVtZW50IHRvIGEgbmV3Ci0JICAgICBsb2NhdGlvbiBpZiBkb3QgaGFzIGEgZGlmZmVyZW50IHZhbHVlIGF0IHRoaXMgcG9pbnQgaW4gdGhpcwotCSAgICAgcGFzcyB0aGFuIGl0IGRpZCBhdCB0aGlzIHBvaW50IGluIHRoZSBwcmV2aW91cyBwYXNzLiAgKi8KLQkgIHMtPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9vZmZzZXQgPQotCSAgICBkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7Ci0JICBkb3QgKz0gcy0+cGFkZGluZ19zdGF0ZW1lbnQuc2l6ZTsKLQkgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSArPQotCSAgICBzLT5wYWRkaW5nX3N0YXRlbWVudC5zaXplOwotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0JICBkb3QgPSBsYW5nX3NpemVfc2VjdGlvbnMgKHMtPmdyb3VwX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgICZzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkgICAgZmlsbCwgZG90LCByZWxheCk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBGQUlMICgpOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgY2FuIG9ubHkgZ2V0IGhlcmUgd2hlbiByZWxheGluZyBpcyB0dXJuZWQgb24uICAqLwotCi0JY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQl9Ci0gICAgICBwcmV2ID0gJnMtPmhlYWRlci5uZXh0OwotICAgIH0KLSAgcmV0dXJuIGRvdDsKLX0KLQotYmZkX3ZtYQotbGFuZ19kb19hc3NpZ25tZW50cyAocywgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBmaWxsLCBkb3QpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBzOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICogb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICAgICBmaWxsX3R5cGUgZmlsbDsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci17Ci0gIGZvciAoOyBzICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCi0JewotCWNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0JICBkb3QgPSBsYW5nX2RvX2Fzc2lnbm1lbnRzIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsCi0JCQkJICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgICBmaWxsLAotCQkJCSAgICAgZG90KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcyA9Ci0JICAgICAgJihzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCi0JICAgIGlmIChvcy0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLQkgICAgICB7Ci0JCWRvdCA9IG9zLT5iZmRfc2VjdGlvbi0+dm1hOwotCQkodm9pZCkgbGFuZ19kb19hc3NpZ25tZW50cyAob3MtPmNoaWxkcmVuLmhlYWQsIG9zLAotCQkJCQkgICAgb3MtPmZpbGwsIGRvdCk7Ci0JCWRvdCA9IG9zLT5iZmRfc2VjdGlvbi0+dm1hICsgb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0JICAgICAgfQotCSAgICBpZiAob3MtPmxvYWRfYmFzZSkgCi0JICAgICAgewotCQkvKiBJZiBub3RoaW5nIGhhcyBiZWVuIHBsYWNlZCBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiB0aGVuCi0JCSAgIGl0IHdvbid0IGhhdmUgYSBiZmRfc2VjdGlvbi4gKi8KLQkJaWYgKG9zLT5iZmRfc2VjdGlvbikgCi0JCSAgewotCQkgICAgb3MtPmJmZF9zZWN0aW9uLT5sbWEgCi0JCSAgICAgID0gZXhwX2dldF9hYnNfaW50KG9zLT5sb2FkX2Jhc2UsIDAsImxvYWQgYmFzZSIsIGxhbmdfZmluYWxfcGhhc2VfZW51bSk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCi0JICBkb3QgPSBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCSAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJCSAgICAgZmlsbCwgZG90KTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotI2lmIDAKLQljYXNlIGxhbmdfY29tbW9uX3N0YXRlbWVudF9lbnVtOgotI2VuZGlmCi0JICBicmVhazsKLQljYXNlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgZXRyZWVfdmFsdWVfdHlwZSB2YWx1ZTsKLQotCSAgICB2YWx1ZSA9IGV4cF9mb2xkX3RyZWUgKHMtPmRhdGFfc3RhdGVtZW50LmV4cCwKLQkJCQkgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkJICAgbGFuZ19maW5hbF9waGFzZV9lbnVtLCBkb3QsICZkb3QpOwotCSAgICBzLT5kYXRhX3N0YXRlbWVudC52YWx1ZSA9IHZhbHVlLnZhbHVlOwotCSAgICBpZiAodmFsdWUudmFsaWRfcCA9PSBmYWxzZSkKLQkgICAgICBlaW5mbyAoXygiJUYlUDogaW52YWxpZCBkYXRhIHN0YXRlbWVudFxuIikpOwotCSAgfQotCSAgc3dpdGNoIChzLT5kYXRhX3N0YXRlbWVudC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgUVVBRDoKLQkgICAgY2FzZSBTUVVBRDoKLQkgICAgICBkb3QgKz0gUVVBRF9TSVpFOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIExPTkc6Ci0JICAgICAgZG90ICs9IExPTkdfU0laRTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTSE9SVDoKLQkgICAgICBkb3QgKz0gU0hPUlRfU0laRTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBCWVRFOgotCSAgICAgIGRvdCArPSBCWVRFX1NJWkU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBldHJlZV92YWx1ZV90eXBlIHZhbHVlOwotCi0JICAgIHZhbHVlID0gZXhwX2ZvbGRfdHJlZSAocy0+cmVsb2Nfc3RhdGVtZW50LmFkZGVuZF9leHAsCi0JCQkJICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkJCSAgIGxhbmdfZmluYWxfcGhhc2VfZW51bSwgZG90LCAmZG90KTsKLQkgICAgcy0+cmVsb2Nfc3RhdGVtZW50LmFkZGVuZF92YWx1ZSA9IHZhbHVlLnZhbHVlOwotCSAgICBpZiAodmFsdWUudmFsaWRfcCA9PSBmYWxzZSkKLQkgICAgICBlaW5mbyAoXygiJUYlUDogaW52YWxpZCByZWxvYyBzdGF0ZW1lbnRcbiIpKTsKLQkgIH0KLQkgIGRvdCArPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHMtPnJlbG9jX3N0YXRlbWVudC5ob3d0byk7Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19pbnB1dF9zZWN0aW9uX2VudW06Ci0JICB7Ci0JICAgIGFzZWN0aW9uICppbiA9IHMtPmlucHV0X3NlY3Rpb24uc2VjdGlvbjsKLQotCSAgICBpZiAoaW4tPl9jb29rZWRfc2l6ZSAhPSAwKQotCSAgICAgIGRvdCArPSBpbi0+X2Nvb2tlZF9zaXplOwotCSAgICBlbHNlCi0JICAgICAgZG90ICs9IGluLT5fcmF3X3NpemU7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19maWxsX3N0YXRlbWVudF9lbnVtOgotCSAgZmlsbCA9IHMtPmZpbGxfc3RhdGVtZW50LmZpbGw7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgZXhwX2ZvbGRfdHJlZSAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwLAotCQkJICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJICAgbGFuZ19maW5hbF9waGFzZV9lbnVtLAotCQkJICAgZG90LAotCQkJICAgJmRvdCk7Ci0JICB9Ci0KLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotCSAgZG90ICs9IHMtPnBhZGRpbmdfc3RhdGVtZW50LnNpemU7Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKLQkgIGRvdCA9IGxhbmdfZG9fYXNzaWdubWVudHMgKHMtPmdyb3VwX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCSAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJCSAgICAgZmlsbCwgZG90KTsKLQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgRkFJTCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9lbnVtOgotCSAgYnJlYWs7Ci0JfQotCi0gICAgfQotICByZXR1cm4gZG90OwotfQotCi0vKiBGaXggYW55IC5zdGFydG9mLiBvciAuc2l6ZW9mLiBzeW1ib2xzLiAgV2hlbiB0aGUgYXNzZW1ibGVycyBzZWUgdGhlCi0gICBvcGVyYXRvciAuc3RhcnRvZi4gKHNlY3Rpb25fbmFtZSksIGl0IHByb2R1Y2VzIGFuIHVuZGVmaW5lZCBzeW1ib2wKLSAgIC5zdGFydG9mLnNlY3Rpb25fbmFtZS4gIFNpbWlsYXJseSwgd2hlbiBpdCBzZWVzCi0gICAuc2l6ZW9mLiAoc2VjdGlvbl9uYW1lKSwgaXQgcHJvZHVjZXMgYW4gdW5kZWZpbmVkIHN5bWJvbAotICAgLnNpemVvZi5zZWN0aW9uX25hbWUuICBGb3IgYWxsIHRoZSBvdXRwdXQgc2VjdGlvbnMsIHdlIGxvb2sgZm9yCi0gICBzdWNoIHN5bWJvbHMsIGFuZCBzZXQgdGhlbSB0byB0aGUgY29ycmVjdCB2YWx1ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX3NldF9zdGFydG9mICgpCi17Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzZWNuYW1lOwotICAgICAgY2hhciAqYnVmOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgcyk7Ci0gICAgICBidWYgPSB4bWFsbG9jICgxMCArIHN0cmxlbiAoc2VjbmFtZSkpOwotCi0gICAgICBzcHJpbnRmIChidWYsICIuc3RhcnRvZi4lcyIsIHNlY25hbWUpOwotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgYnVmLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gTlVMTCAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXsKLQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICBoLT51LmRlZi52YWx1ZSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsIHMpOwotCSAgaC0+dS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JfQotCi0gICAgICBzcHJpbnRmIChidWYsICIuc2l6ZW9mLiVzIiwgc2VjbmFtZSk7Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBidWYsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JewotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkgICAgaC0+dS5kZWYudmFsdWUgPSBzLT5fY29va2VkX3NpemU7Ci0JICBlbHNlCi0JICAgIGgtPnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCSAgaC0+dS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JfQotCi0gICAgICBmcmVlIChidWYpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWxhbmdfZmluaXNoICgpCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICBib29sZWFuIHdhcm47Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgfHwgbGlua19pbmZvLnNoYXJlZCkKLSAgICB3YXJuID0gZmFsc2U7Ci0gIGVsc2UKLSAgICB3YXJuID0gdHJ1ZTsKLQotICBpZiAoZW50cnlfc3ltYm9sID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgLyogTm8gZW50cnkgaGFzIGJlZW4gc3BlY2lmaWVkLiAgTG9vayBmb3Igc3RhcnQsIGJ1dCBkb24ndCB3YXJuCi0JIGlmIHdlIGRvbid0IGZpbmQgaXQuICAqLwotICAgICAgZW50cnlfc3ltYm9sID0gInN0YXJ0IjsKLSAgICAgIHdhcm4gPSBmYWxzZTsKLSAgICB9Ci0KLSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZW50cnlfc3ltYm9sLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotICAgICAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICYmIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3ZtYSB2YWw7Ci0KLSAgICAgIHZhbCA9IChoLT51LmRlZi52YWx1ZQotCSAgICAgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLAotCQkJCSAgICBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbikKLQkgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBpZiAoISBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKG91dHB1dF9iZmQsIHZhbCkpCi0JZWluZm8gKF8oIiVQJUY6JXM6IGNhbid0IHNldCBzdGFydCBhZGRyZXNzXG4iKSwgZW50cnlfc3ltYm9sKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIENPTlNUIGNoYXIgKnNlbmQ7Ci0KLSAgICAgIC8qIFdlIGNvdWxkbid0IGZpbmQgdGhlIGVudHJ5IHN5bWJvbC4gIFRyeSBwYXJzaW5nIGl0IGFzIGEKLSAgICAgICAgIG51bWJlci4gICovCi0gICAgICB2YWwgPSBiZmRfc2Nhbl92bWEgKGVudHJ5X3N5bWJvbCwgJnNlbmQsIDApOwotICAgICAgaWYgKCpzZW5kID09ICdcMCcpCi0JewotCSAgaWYgKCEgYmZkX3NldF9zdGFydF9hZGRyZXNzIChvdXRwdXRfYmZkLCB2YWwpKQotCSAgICBlaW5mbyAoXygiJVAlRjogY2FuJ3Qgc2V0IHN0YXJ0IGFkZHJlc3NcbiIpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNlY3Rpb24gKnRzOwotCi0JICAvKiBDYW4ndCBmaW5kIHRoZSBlbnRyeSBzeW1ib2wsIGFuZCBpdCdzIG5vdCBhIG51bWJlci4gIFVzZQotCSAgICAgdGhlIGZpcnN0IGFkZHJlc3MgaW4gdGhlIHRleHQgc2VjdGlvbi4gICovCi0JICB0cyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnRleHQiKTsKLQkgIGlmICh0cyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgewotCSAgICAgIGlmICh3YXJuKQotCQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbCAlczsgZGVmYXVsdGluZyB0byAlVlxuIiksCi0JCSAgICAgICBlbnRyeV9zeW1ib2wsIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsIHRzKSk7Ci0JICAgICAgaWYgKCEgYmZkX3NldF9zdGFydF9hZGRyZXNzIChvdXRwdXRfYmZkLAotCQkJCQkgICBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLAotCQkJCQkJCQl0cykpKQotCQllaW5mbyAoXygiJVAlRjogY2FuJ3Qgc2V0IHN0YXJ0IGFkZHJlc3NcbiIpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHdhcm4pCi0JCWVpbmZvIChfKCIlUDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICVzOyBub3Qgc2V0dGluZyBzdGFydCBhZGRyZXNzXG4iKSwKLQkJICAgICAgIGVudHJ5X3N5bWJvbCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGEgc21hbGwgZnVuY3Rpb24gdXNlZCB3aGVuIHdlIHdhbnQgdG8gaWdub3JlIGVycm9ycyBmcm9tCi0gICBCRkQuICAqLwotCi1zdGF0aWMgdm9pZAotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotaWdub3JlX2JmZF9lcnJvcnMgKGNvbnN0IGNoYXIgKnMgQVRUUklCVVRFX1VOVVNFRCwgLi4uKQotI2Vsc2UKLWlnbm9yZV9iZmRfZXJyb3JzIChzKQotICAgICBjb25zdCBjaGFyICpzIEFUVFJJQlVURV9VTlVTRUQ7Ci0jZW5kaWYKLXsKLSAgLyogRG9uJ3QgZG8gYW55dGhpbmcuICAqLwotfQotCi0vKiBDaGVjayB0aGF0IHRoZSBhcmNoaXRlY3R1cmUgb2YgYWxsIHRoZSBpbnB1dCBmaWxlcyBpcyBjb21wYXRpYmxlCi0gICB3aXRoIHRoZSBvdXRwdXQgZmlsZS4gIEFsc28gY2FsbCB0aGUgYmFja2VuZCB0byBsZXQgaXQgZG8gYW55Ci0gICBvdGhlciBjaGVja2luZyB0aGF0IGlzIG5lZWRlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX2NoZWNrICgpCi17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKmZpbGU7Ci0gIGJmZCAqaW5wdXRfYmZkOwotICBDT05TVCBiZmRfYXJjaF9pbmZvX3R5cGUgKmNvbXBhdGlibGU7Ci0KLSAgZm9yIChmaWxlID0gZmlsZV9jaGFpbi5oZWFkOwotICAgICAgIGZpbGUgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgICBmaWxlID0gZmlsZS0+aW5wdXRfc3RhdGVtZW50Lm5leHQpCi0gICAgewotICAgICAgaW5wdXRfYmZkID0gZmlsZS0+aW5wdXRfc3RhdGVtZW50LnRoZV9iZmQ7Ci0gICAgICBjb21wYXRpYmxlID0gYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUgKGlucHV0X2JmZCwKLQkJCQkJICAgIG91dHB1dF9iZmQpOwotICAgICAgaWYgKGNvbXBhdGlibGUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2gpCi0JICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogJXMgYXJjaGl0ZWN0dXJlIG9mIGlucHV0IGZpbGUgYCVCJyBpcyBpbmNvbXBhdGlibGUgd2l0aCAlcyBvdXRwdXRcbiIpLAotCQkgICBiZmRfcHJpbnRhYmxlX25hbWUgKGlucHV0X2JmZCksIGlucHV0X2JmZCwKLQkJICAgYmZkX3ByaW50YWJsZV9uYW1lIChvdXRwdXRfYmZkKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgcGZuID0gTlVMTDsKLQotCSAgLyogSWYgd2UgYXJlbid0IHN1cHBvc2VkIHRvIHdhcm4gYWJvdXQgbWlzbWF0Y2hlZCBpbnB1dAotICAgICAgICAgICAgIGZpbGVzLCB0ZW1wb3JhcmlseSBzZXQgdGhlIEJGRCBlcnJvciBoYW5kbGVyIHRvIGEKLSAgICAgICAgICAgICBmdW5jdGlvbiB3aGljaCB3aWxsIGRvIG5vdGhpbmcuICBXZSBzdGlsbCB3YW50IHRvIGNhbGwKLSAgICAgICAgICAgICBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgc2luY2UgaXQgbWF5IHNldCB1cAotICAgICAgICAgICAgIGluZm9ybWF0aW9uIHdoaWNoIGlzIG5lZWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgaWYgKCEgY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2gpCi0JICAgIHBmbiA9IGJmZF9zZXRfZXJyb3JfaGFuZGxlciAoaWdub3JlX2JmZF9lcnJvcnMpOwotCSAgaWYgKCEgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGlucHV0X2JmZCwgb3V0cHV0X2JmZCkpCi0JICAgIHsKLQkgICAgICBpZiAoY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2gpCi0JCWVpbmZvIChfKCIlRSVYOiBmYWlsZWQgdG8gbWVyZ2UgdGFyZ2V0IHNwZWNpZmljIGRhdGEgb2YgZmlsZSAlQlxuIiksCi0JCSAgICAgICBpbnB1dF9iZmQpOwotCSAgICB9Ci0JICBpZiAoISBjb21tYW5kX2xpbmUud2Fybl9taXNtYXRjaCkKLQkgICAgYmZkX3NldF9lcnJvcl9oYW5kbGVyIChwZm4pOwotCX0KLSAgICB9Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIGdsb2JhbCBjb21tb24gc3ltYm9scyBhbmQgYXR0YWNoIHRoZW0gdG8gdGhlCi0gICBjb3JyZWN0IHNlY3Rpb24uICBUaGUgLXNvcnQtY29tbW9uIGNvbW1hbmQgbGluZSBzd2l0Y2ggbWF5IGJlIHVzZWQKLSAgIHRvIHJvdWdobHkgc29ydCB0aGUgZW50cmllcyBieSBzaXplLiAgKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfY29tbW9uICgpCi17Ci0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIGNvbW1hbmRfbGluZS5mb3JjZV9jb21tb25fZGVmaW5pdGlvbikKLSAgICByZXR1cm47Ci0KLSAgaWYgKCEgY29uZmlnLnNvcnRfY29tbW9uKQotICAgIGJmZF9saW5rX2hhc2hfdHJhdmVyc2UgKGxpbmtfaW5mby5oYXNoLCBsYW5nX29uZV9jb21tb24sIChQVFIpIE5VTEwpOwotICBlbHNlCi0gICAgewotICAgICAgaW50IHBvd2VyOwotCi0gICAgICBmb3IgKHBvd2VyID0gNDsgcG93ZXIgPj0gMDsgcG93ZXItLSkKLQliZmRfbGlua19oYXNoX3RyYXZlcnNlIChsaW5rX2luZm8uaGFzaCwgbGFuZ19vbmVfY29tbW9uLAotCQkJCShQVFIpICZwb3dlcik7Ci0gICAgfQotfQotCi0vKiBQbGFjZSBvbmUgY29tbW9uIHN5bWJvbCBpbiB0aGUgY29ycmVjdCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxhbmdfb25lX2NvbW1vbiAoaCwgaW5mbykKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpbmZvOwotewotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotICBiZmRfdm1hIHNpemU7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIGlmIChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNpemUgPSBoLT51LmMuc2l6ZTsKLSAgcG93ZXJfb2ZfdHdvID0gaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlcjsKLQotICBpZiAoY29uZmlnLnNvcnRfY29tbW9uCi0gICAgICAmJiBwb3dlcl9vZl90d28gPCAodW5zaWduZWQgaW50KSAqKGludCAqKSBpbmZvKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNlY3Rpb24gPSBoLT51LmMucC0+c2VjdGlvbjsKLQotICAvKiBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHNlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IEFMSUdOX04gKHNlY3Rpb24tPl9jb29rZWRfc2l6ZSwKLQkJCQkgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0KLSAgLyogQWRqdXN0IHRoZSBhbGlnbm1lbnQgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKHBvd2VyX29mX3R3byA+IHNlY3Rpb24tPmFsaWdubWVudF9wb3dlcikKLSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcl9vZl90d287Ci0KLSAgLyogQ2hhbmdlIHRoZSBzeW1ib2wgZnJvbSBjb21tb24gdG8gZGVmaW5lZC4gICovCi0gIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0gIGgtPnUuZGVmLnNlY3Rpb24gPSBzZWN0aW9uOwotICBoLT51LmRlZi52YWx1ZSA9IHNlY3Rpb24tPl9jb29rZWRfc2l6ZTsKLQotICAvKiBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIHNlY3Rpb24tPl9jb29rZWRfc2l6ZSArPSBzaXplOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgc2VjdGlvbiBpcyBhbGxvY2F0ZWQgaW4gbWVtb3J5LCBhbmQgbWFrZSBzdXJlIHRoYXQKLSAgICAgaXQgaXMgbm8gbG9uZ2VyIGEgY29tbW9uIHNlY3Rpb24uICAqLwotICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQUxMT0M7Ci0gIHNlY3Rpb24tPmZsYWdzICY9IH4gU0VDX0lTX0NPTU1PTjsKLQotICBpZiAoY29uZmlnLm1hcF9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgc3RhdGljIGJvb2xlYW4gaGVhZGVyX3ByaW50ZWQ7Ci0gICAgICBpbnQgbGVuOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgYnVmWzUwXTsKLQotICAgICAgaWYgKCEgaGVhZGVyX3ByaW50ZWQpCi0JewotCSAgbWluZm8gKF8oIlxuQWxsb2NhdGluZyBjb21tb24gc3ltYm9sc1xuIikpOwotCSAgbWluZm8gKF8oIkNvbW1vbiBzeW1ib2wgICAgICAgc2l6ZSAgICAgICAgICAgICAgZmlsZVxuXG4iKSk7Ci0JICBoZWFkZXJfcHJpbnRlZCA9IHRydWU7Ci0JfQotCi0gICAgICBuYW1lID0gZGVtYW5nbGUgKGgtPnJvb3Quc3RyaW5nKTsKLSAgICAgIG1pbmZvICgiJXMiLCBuYW1lKTsKLSAgICAgIGxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gICAgICBmcmVlIChuYW1lKTsKLQotICAgICAgaWYgKGxlbiA+PSAxOSkKLQl7Ci0JICBwcmludF9ubCAoKTsKLQkgIGxlbiA9IDA7Ci0JfQotICAgICAgd2hpbGUgKGxlbiA8IDIwKQotCXsKLQkgIHByaW50X3NwYWNlICgpOwotCSAgKytsZW47Ci0JfQotCi0gICAgICBtaW5mbyAoIjB4Iik7Ci0gICAgICBpZiAoc2l6ZSA8PSAweGZmZmZmZmZmKQotCXNwcmludGYgKGJ1ZiwgIiVseCIsICh1bnNpZ25lZCBsb25nKSBzaXplKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmX3ZtYSAoYnVmLCBzaXplKTsKLSAgICAgIG1pbmZvICgiJXMiLCBidWYpOwotICAgICAgbGVuID0gc3RybGVuIChidWYpOwotCi0gICAgICB3aGlsZSAobGVuIDwgMTYpCi0JewotCSAgcHJpbnRfc3BhY2UgKCk7Ci0JICArK2xlbjsKLQl9Ci0KLSAgICAgIG1pbmZvICgiJUJcbiIsIHNlY3Rpb24tPm93bmVyKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1ydW4gdGhyb3VnaCB0aGUgaW5wdXQgZmlsZXMgYW5kIGVuc3VyZSB0aGF0IGV2ZXJ5IGlucHV0Ci1zZWN0aW9uIGhhcyBzb21ld2hlcmUgdG8gZ28uIElmIG9uZSBpcyBmb3VuZCB3aXRob3V0Ci1hIGRlc3RpbmF0aW9uIHRoZW4gY3JlYXRlIGFuIGlucHV0IHJlcXVlc3QgYW5kIHBsYWNlIGl0Ci1pbnRvIHRoZSBzdGF0ZW1lbnQgdHJlZS4KLSovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX3BsYWNlX29ycGhhbnMgKCkKLXsKLSAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGZpbGUpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGZpbGUtPnRoZV9iZmQtPnNlY3Rpb25zOwotCSAgIHMgIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0JICAgcyA9IHMtPm5leHQpCi0JewotCSAgaWYgKHMtPm91dHB1dF9zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzZWN0aW9uIG9mIHRoZSBmaWxlIGlzIG5vdCBhdHRhdGNoZWQsIHJvb3QKLQkgICAgICAgICBhcm91bmQgZm9yIGEgc2Vuc2libGUgcGxhY2UgZm9yIGl0IHRvIGdvICovCi0KLQkgICAgICBpZiAoZmlsZS0+anVzdF9zeW1zX2ZsYWcpCi0JCXsKLQkJICAvKiBXZSBhcmUgb25seSByZXRyaWV2aW5nIHN5bWJvbCB2YWx1ZXMgZnJvbSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICBmaWxlLiAgV2Ugd2FudCB0aGUgc3ltYm9scyB0byBhY3QgYXMgdGhvdWdoIHRoZQotICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGluIHRoZSBmaWxlIGFyZSBhYnNvbHV0ZS4gICovCi0JCSAgcy0+b3V0cHV0X3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQkgIHMtPm91dHB1dF9vZmZzZXQgPSBzLT52bWE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKHMtPm5hbWUsICJDT01NT04iKSA9PSAwKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhIGxvbmVseSBjb21tb24gc2VjdGlvbiB3aGljaCBtdXN0IGhhdmUKLQkJICAgICBjb21lIGZyb20gYW4gYXJjaGl2ZS4gIFdlIGF0dGFjaCB0byB0aGUgc2VjdGlvbgotCQkgICAgIHdpdGggdGhlIHdpbGRjYXJkLiAgKi8KLQkJICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0JCSAgICAgIHx8IGNvbW1hbmRfbGluZS5mb3JjZV9jb21tb25fZGVmaW5pdGlvbikKLQkJICAgIHsKLQkJICAgICAgaWYgKGRlZmF1bHRfY29tbW9uX3NlY3Rpb24gPT0gTlVMTCkKLQkJCXsKLSNpZiAwCi0JCQkgIC8qIFRoaXMgbWVzc2FnZSBoYXBwZW5zIHdoZW4gdXNpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2cjMuaWZpbGUgbGlua2VyIHNjcmlwdCwgc28gSSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIGl0LiAgKi8KLQkJCSAgaW5mb19tc2cgKF8oIiVQOiBubyBbQ09NTU9OXSBjb21tYW5kLCBkZWZhdWx0aW5nIHRvIC5ic3NcbiIpKTsKLSNlbmRpZgotCQkJICBkZWZhdWx0X2NvbW1vbl9zZWN0aW9uID0KLQkJCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIuYnNzIik7Ci0KLQkJCX0KLQkJICAgICAgd2lsZF9kb2l0ICgmZGVmYXVsdF9jb21tb25fc2VjdGlvbi0+Y2hpbGRyZW4sIHMsCi0JCQkJIGRlZmF1bHRfY29tbW9uX3NlY3Rpb24sIGZpbGUpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAobGRlbXVsX3BsYWNlX29ycGhhbiAoZmlsZSwgcykpCi0JCTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcyA9Ci0JCSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChzLT5uYW1lKTsKLQotCQkgIHdpbGRfZG9pdCAoJm9zLT5jaGlsZHJlbiwgcywgb3MsIGZpbGUpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLXZvaWQKLWxhbmdfc2V0X2ZsYWdzIChwdHIsIGZsYWdzLCBpbnZlcnQpCi0gICAgIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpwdHI7Ci0gICAgIENPTlNUIGNoYXIgKmZsYWdzOwotICAgICBpbnQgaW52ZXJ0OwotewotICBmbGFnd29yZCAqcHRyX2ZsYWdzOwotCi0gIHB0cl9mbGFncyA9IGludmVydCA/ICZwdHItPm5vdF9mbGFncyA6ICZwdHItPmZsYWdzOwotICB3aGlsZSAoKmZsYWdzKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKmZsYWdzKQotCXsKLQljYXNlICdBJzogY2FzZSAnYSc6Ci0JICAqcHRyX2ZsYWdzIHw9IFNFQ19BTExPQzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUic6IGNhc2UgJ3InOgotCSAgKnB0cl9mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1cnOiBjYXNlICd3JzoKLQkgICpwdHJfZmxhZ3MgfD0gU0VDX0RBVEE7Ci0JICBicmVhazsKLQotCWNhc2UgJ1gnOiBjYXNlICd4JzoKLQkgICpwdHJfZmxhZ3MgfD0gU0VDX0NPREU7Ci0JICBicmVhazsKLQotCWNhc2UgJ0wnOiBjYXNlICdsJzoKLQljYXNlICdJJzogY2FzZSAnaSc6Ci0JICAqcHRyX2ZsYWdzIHw9IFNFQ19MT0FEOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgZWluZm8gKF8oIiVQJUY6IGludmFsaWQgc3ludGF4IGluIGZsYWdzXG4iKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBmbGFncysrOwotICAgIH0KLX0KLQotLyogQ2FsbCBhIGZ1bmN0aW9uIG9uIGVhY2ggaW5wdXQgZmlsZS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKLSAgIG9uIGFuIGFyY2hpdmUsIGJ1dCBub3Qgb24gdGhlIGVsZW1lbnRzLiAgKi8KLQotdm9pZAotbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChmdW5jKQotICAgICB2b2lkICgqZnVuYykgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmY7Ci0KLSAgZm9yIChmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgaW5wdXRfZmlsZV9jaGFpbi5oZWFkOwotICAgICAgIGYgIT0gTlVMTDsKLSAgICAgICBmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZi0+bmV4dF9yZWFsX2ZpbGUpCi0gICAgZnVuYyAoZik7Ci19Ci0KLS8qIENhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGZpbGUuICBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb24gYWxsCi0gICB0aGUgZWxlbWVudHMgb2YgYW4gYXJjaGl2ZSB3aGljaCBhcmUgaW5jbHVkZWQgaW4gdGhlIGxpbmssIGJ1dCB3aWxsCi0gICBub3QgYmUgY2FsbGVkIG9uIHRoZSBhcmNoaXZlIGZpbGUgaXRzZWxmLiAgKi8KLQotdm9pZAotbGFuZ19mb3JfZWFjaF9maWxlIChmdW5jKQotICAgICB2b2lkICgqZnVuYykgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci17Ci0gIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChmKQotICAgIHsKLSAgICAgIGZ1bmMgKGYpOwotICAgIH0KLX0KLQotI2lmIDAKLQotLyogTm90IHVzZWQuICAqLwotCi12b2lkCi1sYW5nX2Zvcl9lYWNoX2lucHV0X3NlY3Rpb24gKGZ1bmMpCi0gICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChiZmQgKiBhYiwgYXNlY3Rpb24gKiBhcykpOwotewotICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoZikKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqIHM7Ci0KLSAgICAgIGZvciAocyA9IGYtPnRoZV9iZmQtPnNlY3Rpb25zOwotCSAgIHMgIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0JICAgcyA9IHMtPm5leHQpCi0JewotCSAgZnVuYyAoZi0+dGhlX2JmZCwgcyk7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmCi0KLXZvaWQKLWxkbGFuZ19hZGRfZmlsZSAoZW50cnkpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiBlbnRyeTsKLXsKLSAgYmZkICoqcHA7Ci0KLSAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kICgmZmlsZV9jaGFpbiwKLQkJCSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBlbnRyeSwKLQkJCSAmZW50cnktPm5leHQpOwotCi0gIC8qIFRoZSBCRkQgbGlua2VyIG5lZWRzIHRvIGhhdmUgYSBsaXN0IG9mIGFsbCBpbnB1dCBCRkRzIGludm9sdmVkIGluCi0gICAgIGEgbGluay4gICovCi0gIEFTU0VSVCAoZW50cnktPnRoZV9iZmQtPmxpbmtfbmV4dCA9PSAoYmZkICopIE5VTEwpOwotICBBU1NFUlQgKGVudHJ5LT50aGVfYmZkICE9IG91dHB1dF9iZmQpOwotICBmb3IgKHBwID0gJmxpbmtfaW5mby5pbnB1dF9iZmRzOwotICAgICAgICpwcCAhPSAoYmZkICopIE5VTEw7Ci0gICAgICAgcHAgPSAmKCpwcCktPmxpbmtfbmV4dCkKLSAgICA7Ci0gICpwcCA9IGVudHJ5LT50aGVfYmZkOwotICBlbnRyeS0+dGhlX2JmZC0+dXNyZGF0YSA9IChQVFIpIGVudHJ5OwotICBiZmRfc2V0X2dwX3NpemUgKGVudHJ5LT50aGVfYmZkLCBnX3N3aXRjaF92YWx1ZSk7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzZWN0aW9ucyBhbmQgY2hlY2sgZm9yIGFueSB3aGljaCBzaG91bGQgbm90IGJlCi0gICAgIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgV2UgbmVlZCB0byBkbyB0aGlzIG5vdywgc28gdGhhdCB3ZSBjYW4KLSAgICAgbm90aWNlIHdoZW4gdGhlIGJhY2tlbmQgbGlua2VyIHRyaWVzIHRvIHJlcG9ydCBtdWx0aXBsZQotICAgICBkZWZpbml0aW9uIGVycm9ycyBmb3Igc3ltYm9scyB3aGljaCBhcmUgaW4gc2VjdGlvbnMgd2UgYXJlbid0Ci0gICAgIGdvaW5nIHRvIGxpbmsuICBGSVhNRTogSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGVudGlyZWx5IGlnbm9yZQotICAgICBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkIGluIHNlY3Rpb25zIHdoaWNoIGFyZSBnb2luZyB0byBiZQotICAgICBkaXNjYXJkZWQuICBUaGlzIHdvdWxkIHJlcXVpcmUgbW9kaWZ5aW5nIHRoZSBiYWNrZW5kIGxpbmtlciBmb3IKLSAgICAgZWFjaCBiYWNrZW5kIHdoaWNoIG1pZ2h0IHNldCB0aGUgU0VDX0xJTktfT05DRSBmbGFnLiAgSWYgd2UgZG8KLSAgICAgdGhpcywgd2Ugc2hvdWxkIHByb2JhYmx5IGhhbmRsZSBTRUNfRVhDTFVERSBpbiB0aGUgc2FtZSB3YXkuICAqLwotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoZW50cnktPnRoZV9iZmQsIHNlY3Rpb25fYWxyZWFkeV9saW5rZWQsIChQVFIpIGVudHJ5KTsKLX0KLQotdm9pZAotbGFuZ19hZGRfb3V0cHV0IChuYW1lLCBmcm9tX3NjcmlwdCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZyb21fc2NyaXB0OwotewotICAvKiBNYWtlIC1vIG9uIGNvbW1hbmQgbGluZSBvdmVycmlkZSBPVVRQVVQgaW4gc2NyaXB0LiAgKi8KLSAgaWYgKGhhZF9vdXRwdXRfZmlsZW5hbWUgPT0gZmFsc2UgfHwgIWZyb21fc2NyaXB0KQotICAgIHsKLSAgICAgIG91dHB1dF9maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBoYWRfb3V0cHV0X2ZpbGVuYW1lID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbjsKLQotc3RhdGljIGludAotdG9wb3dlciAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHVuc2lnbmVkIGludCBpID0gMTsKLSAgaW50IGw7Ci0KLSAgaWYgKHggPCAwKQotICAgIHJldHVybiAtMTsKLQotICBmb3IgKGwgPSAwOyBsIDwgMzI7IGwrKykgCi0gICAgewotICAgICAgaWYgKGkgPj0gKHVuc2lnbmVkIGludCkgeCkKLQlyZXR1cm4gbDsKLSAgICAgIGkgPDw9IDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi12b2lkCi1sYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X25hbWUsCi0JCQkJICAgICBhZGRyZXNzX2V4cCwgc2VjdHlwZSwgYmxvY2tfdmFsdWUsCi0JCQkJICAgICBhbGlnbiwgc3ViYWxpZ24sIGViYXNlKQotICAgICBjb25zdCBjaGFyICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqIGFkZHJlc3NfZXhwOwotICAgICBlbnVtIHNlY3Rpb25fdHlwZSBzZWN0eXBlOwotICAgICBiZmRfdm1hIGJsb2NrX3ZhbHVlOwotICAgICBldHJlZV90eXBlICphbGlnbjsKLSAgICAgZXRyZWVfdHlwZSAqc3ViYWxpZ247Ci0gICAgIGV0cmVlX3R5cGUgKmViYXNlOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBjdXJyZW50X3NlY3Rpb24gPQotICAgb3MgPQotICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X25hbWUpOwotCi0KLQotICAvKiBBZGQgdGhpcyBzdGF0ZW1lbnQgdG8gdHJlZSAqLwotICAvKiAgYWRkX3N0YXRlbWVudChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtLAotICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsqLwotICAvKiBNYWtlIG5leHQgdGhpbmdzIGNoYWluIGludG8gc3ViY2hhaW4gb2YgdGhpcyAqLwotCi0gIGlmIChvcy0+YWRkcl90cmVlID09Ci0gICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMKQotICB7Ci0gICAgb3MtPmFkZHJfdHJlZSA9Ci0gICAgIGFkZHJlc3NfZXhwOwotICB9Ci0gIG9zLT5zZWN0eXBlID0gc2VjdHlwZTsKLSAgaWYgKHNlY3R5cGUgIT0gbm9sb2FkX3NlY3Rpb24pCi0gICAgb3MtPmZsYWdzID0gU0VDX05PX0ZMQUdTOwotICBlbHNlCi0gICAgb3MtPmZsYWdzID0gU0VDX05FVkVSX0xPQUQ7Ci0gIG9zLT5ibG9ja192YWx1ZSA9IGJsb2NrX3ZhbHVlID8gYmxvY2tfdmFsdWUgOiAxOwotICBzdGF0X3B0ciA9ICZvcy0+Y2hpbGRyZW47Ci0KLSAgb3MtPnN1YnNlY3Rpb25fYWxpZ25tZW50ID0gdG9wb3dlcigKLSAgIGV4cF9nZXRfdmFsdWVfaW50KHN1YmFsaWduLCAtMSwKLQkJICAgICAic3Vic2VjdGlvbiBhbGlnbm1lbnQiLAotCQkgICAgIDApKTsKLSAgb3MtPnNlY3Rpb25fYWxpZ25tZW50ID0gdG9wb3dlcigKLSAgIGV4cF9nZXRfdmFsdWVfaW50KGFsaWduLCAtMSwKLQkJICAgICAic2VjdGlvbiBhbGlnbm1lbnQiLCAwKSk7Ci0KLSAgb3MtPmxvYWRfYmFzZSA9IGViYXNlOwotfQotCi0KLXZvaWQKLWxhbmdfZmluYWwgKCkKLXsKLSAgbGFuZ19vdXRwdXRfc3RhdGVtZW50X3R5cGUgKm5ldyA9Ci0gICAgbmV3X3N0YXQgKGxhbmdfb3V0cHV0X3N0YXRlbWVudCwgc3RhdF9wdHIpOwotCi0gIG5ldy0+bmFtZSA9IG91dHB1dF9maWxlbmFtZTsKLX0KLQotLyogUmVzZXQgdGhlIGN1cnJlbnQgY291bnRlcnMgaW4gdGhlIHJlZ2lvbnMgKi8KLXN0YXRpYyB2b2lkCi1yZXNldF9tZW1vcnlfcmVnaW9ucyAoKQotewotICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcCA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotCi0gIGZvciAocCA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotICAgICAgIHAgIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7Ci0gICAgICAgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgcC0+b2xkX2xlbmd0aCA9IChiZmRfc2l6ZV90eXBlKSAocC0+Y3VycmVudCAtIHAtPm9yaWdpbik7Ci0gICAgICBwLT5jdXJyZW50ID0gcC0+b3JpZ2luOwotICAgIH0KLX0KLQotLyogRXhwYW5kIGEgd2lsZCBzdGF0ZW1lbnQgZm9yIGEgcGFydGljdWxhciBGSUxFLCBtYXJraW5nIGl0cyBzZWN0aW9ucyBLRUVQCi0gICBhcyBuZWVkZWQuICBTRUNUSU9OIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIGl0IGlzIGEgd2lsZCBjYXJkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdjX3NlY3Rpb25fY2FsbGJhY2sgKHB0ciwgc2VjdGlvbiwgZmlsZSwgZGF0YSkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpwdHI7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHZvaWQgKmRhdGEgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgLyogSWYgdGhlIHdpbGQgcGF0dGVybiB3YXMgbWFya2VkIEtFRVAsIHRoZSBtZW1iZXIgc2VjdGlvbnMKLSAgICAgc2hvdWxkIGJlIGFzIHdlbGwuICAqLwotICBpZiAocHRyLT5rZWVwX3NlY3Rpb25zKQotICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19LRUVQOwotfQotCi0vKiBIYW5kbGUgYSB3aWxkIHN0YXRlbWVudCwgbWFya2luZyBpdCBhZ2FpbnN0IEdDLiAgU0VDVElPTiBvciBGSUxFIG9yIGJvdGgKLSAgIG1heSBiZSBOVUxMLCBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgYSB3aWxkY2FyZC4gICovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX2djX3dpbGQgKHMsIHNlY3Rpb24sIGZpbGUpCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqczsKLSAgICAgY29uc3QgY2hhciAqc2VjdGlvbjsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgd2Fsa193aWxkIChzLCBzZWN0aW9uLCBmaWxlLCBnY19zZWN0aW9uX2NhbGxiYWNrLCBOVUxMKTsKLX0KLQotLyogSXRlcmF0ZSBvdmVyIHNlY3Rpb25zIG1hcmtpbmcgdGhlbSBhZ2FpbnN0IEdDLiAgKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfZ2Nfc2VjdGlvbnNfMSAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHM7Ci17Ci0gIGZvciAoOyBzICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCi0JewotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCSAgbGFuZ19nY193aWxkICgmcy0+d2lsZF9zdGF0ZW1lbnQsCi0JCQlzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsCi0JCQlzLT53aWxkX3N0YXRlbWVudC5maWxlbmFtZSk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgbGFuZ19nY19zZWN0aW9uc18xIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgotCSAgbGFuZ19nY19zZWN0aW9uc18xIChzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2djX3NlY3Rpb25zXzEgKHMtPmdyb3VwX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotbGFuZ19nY19zZWN0aW9ucyAoKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSAqdWxpc3QsIGZha2VfbGlzdF9zdGFydDsKLQotICAvKiBLZWVwIGFsbCBzZWN0aW9ucyBzbyBtYXJrZWQgaW4gdGhlIGxpbmsgc2NyaXB0LiAgKi8KLQotICBsYW5nX2djX3NlY3Rpb25zXzEgKHN0YXRlbWVudF9saXN0LmhlYWQpOwotCi0gIC8qIEtlZXAgYWxsIHNlY3Rpb25zIGNvbnRhaW5pbmcgc3ltYm9scyB1bmRlZmluZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KLSAgICAgSGFuZGxlIHRoZSBlbnRyeSBzeW1ib2wgYXQgdGhlIHNhbWUgdGltZS4gICovCi0gIAotICBpZiAoZW50cnlfc3ltYm9sICE9IE5VTEwpCi0gICAgewotICAgICAgZmFrZV9saXN0X3N0YXJ0Lm5leHQgPSBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkOwotICAgICAgZmFrZV9saXN0X3N0YXJ0Lm5hbWUgPSAoY2hhciAqKSBlbnRyeV9zeW1ib2w7Ci0gICAgICB1bGlzdCA9ICZmYWtlX2xpc3Rfc3RhcnQ7Ci0gICAgfQotICBlbHNlCi0gICAgdWxpc3QgPSBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkOwotCi0gIGZvciAoOyB1bGlzdDsgdWxpc3QgPSB1bGlzdC0+bmV4dCkKLSAgICB7Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCB1bGlzdC0+bmFtZSwgCi0JCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0gICAgICAgICAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnUuZGVmLnNlY3Rpb24pKQotCXsKLQkgIGgtPnUuZGVmLnNlY3Rpb24tPmZsYWdzIHw9IFNFQ19LRUVQOwotCX0KLSAgICB9Ci0KLSAgYmZkX2djX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLX0KLQotdm9pZAotbGFuZ19wcm9jZXNzICgpCi17Ci0gIGxhbmdfcmVhc29uYWJsZV9kZWZhdWx0cyAoKTsKLSAgY3VycmVudF90YXJnZXQgPSBkZWZhdWx0X3RhcmdldDsKLQotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAobGRsYW5nX29wZW5fb3V0cHV0KTsJLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUgKi8KLQotICBsZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKCk7Ci0KLSAgLyogQWRkIHRvIHRoZSBoYXNoIHRhYmxlIGFsbCB1bmRlZmluZWRzIG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KLSAgbGFuZ19wbGFjZV91bmRlZmluZWRzICgpOwotCi0gIGFscmVhZHlfbGlua2VkX3RhYmxlX2luaXQgKCk7Ci0KLSAgLyogQ3JlYXRlIGEgYmZkIGZvciBlYWNoIGlucHV0IGZpbGUgKi8KLSAgY3VycmVudF90YXJnZXQgPSBkZWZhdWx0X3RhcmdldDsKLSAgb3Blbl9pbnB1dF9iZmRzIChzdGF0ZW1lbnRfbGlzdC5oZWFkLCBmYWxzZSk7Ci0KLSAgbGRlbXVsX2FmdGVyX29wZW4gKCk7Ci0KLSAgYWxyZWFkeV9saW5rZWRfdGFibGVfZnJlZSAoKTsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSdyZSBub3QgbWl4aW5nIGFyY2hpdGVjdHVyZXMuICBXZSBjYWxsIHRoaXMKLSAgICAgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLCBidXQgYmVmb3JlIHdlIGRvIGFueQotICAgICBvdGhlciBwcm9jZXNzaW5nLCBzbyB0aGF0IGFueSBvcGVyYXRpb25zIG1lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgICAgZG9lcyBvbiB0aGUgb3V0cHV0IGZpbGUgd2lsbCBiZSBrbm93biBkdXJpbmcgdGhlIHJlc3Qgb2YgdGhlCi0gICAgIGxpbmsuICAqLwotICBsYW5nX2NoZWNrICgpOwotCi0gIC8qIEhhbmRsZSAuZXhwb3J0cyBpbnN0ZWFkIG9mIGEgdmVyc2lvbiBzY3JpcHQgaWYgd2UncmUgdG9sZCB0byBkbyBzby4gICovCi0gIGlmIChjb21tYW5kX2xpbmUudmVyc2lvbl9leHBvcnRzX3NlY3Rpb24pCi0gICAgbGFuZ19kb192ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbiAoKTsKLQotICAvKiBCdWlsZCBhbGwgc2V0cyBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgaW5wdXQKLSAgICAgZmlsZXMuICAqLwotICBsZGN0b3JfYnVpbGRfc2V0cyAoKTsKLQotICAvKiBSZW1vdmUgdW5yZWZlcmVuY2VkIHNlY3Rpb25zIGlmIGFza2VkIHRvLiAgKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5nY19zZWN0aW9ucykKLSAgICBsYW5nX2djX3NlY3Rpb25zICgpOwotCi0gIC8qIFNpemUgdXAgdGhlIGNvbW1vbiBkYXRhICovCi0gIGxhbmdfY29tbW9uICgpOwotCi0gIC8qIFJ1biB0aHJvdWdoIHRoZSBjb250b3VycyBvZiB0aGUgc2NyaXB0IGFuZCBhdHRhY2ggaW5wdXQgc2VjdGlvbnMKLSAgICAgdG8gdGhlIGNvcnJlY3Qgb3V0cHV0IHNlY3Rpb25zCi0gICAgICovCi0gIG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMgKHN0YXRlbWVudF9saXN0LmhlYWQsIChjaGFyICopIE5VTEwsCi0JCQkJKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikgTlVMTCk7Ci0KLQotICAvKiBGaW5kIGFueSBzZWN0aW9ucyBub3QgYXR0YWNoZWQgZXhwbGljaXRseSBhbmQgaGFuZGxlIHRoZW0gKi8KLSAgbGFuZ19wbGFjZV9vcnBoYW5zICgpOwotCi0gIGxkZW11bF9iZWZvcmVfYWxsb2NhdGlvbiAoKTsKLQotICAvKiBXZSBtdXN0IHJlY29yZCB0aGUgcHJvZ3JhbSBoZWFkZXJzIGJlZm9yZSB3ZSB0cnkgdG8gZml4IHRoZQotICAgICBzZWN0aW9uIHBvc2l0aW9ucywgc2luY2UgdGhleSB3aWxsIGFmZmVjdCBTSVpFT0ZfSEVBREVSUy4gICovCi0gIGxhbmdfcmVjb3JkX3BoZHJzICgpOwotCi0gIC8qIE5vdyBydW4gYXJvdW5kIGFuZCByZWxheCBpZiB3ZSBjYW4gKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5yZWxheCkKLSAgICB7Ci0gICAgICAvKiBGaXJzdCB0aW1lIHJvdW5kIGlzIGEgdHJpYWwgcnVuIHRvIGdldCB0aGUgJ3dvcnN0IGNhc2UnCi0JIGFkZHJlc3NlcyBvZiB0aGUgb2JqZWN0cyBpZiB0aGVyZSB3YXMgbm8gcmVsYXhpbmcuICAqLwotICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0ZW1lbnRfbGlzdC5oZWFkLAotCQkJICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICYoc3RhdGVtZW50X2xpc3QuaGVhZCksIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7Ci0KLSAgICAgIC8qIEtlZXAgcmVsYXhpbmcgdW50aWwgYmZkX3JlbGF4X3NlY3Rpb24gZ2l2ZXMgdXAuICAqLwotICAgICAgZG8KLQl7Ci0JICByZXNldF9tZW1vcnlfcmVnaW9ucyAoKTsKLQotCSAgcmVsYXhfYWdhaW4gPSBmYWxzZTsKLQotCSAgLyogTm90ZTogcGUtZGxsLmMgZG9lcyBzb21ldGhpbmcgbGlrZSB0aGlzIGFsc28uICBJZiB5b3UgZmluZAotCSAgICAgeW91IG5lZWQgdG8gY2hhbmdlIHRoaXMgY29kZSwgeW91IHByb2JhYmx5IG5lZWQgdG8gY2hhbmdlCi0JICAgICBwZS1kbGwuYyBhbHNvLiAgREogKi8KLQotCSAgLyogRG8gYWxsIHRoZSBhc3NpZ25tZW50cyB3aXRoIG91ciBjdXJyZW50IGd1ZXNzZXMgYXMgdG8KLQkgICAgIHNlY3Rpb24gc2l6ZXMuICAqLwotCSAgbGFuZ19kb19hc3NpZ25tZW50cyAoc3RhdGVtZW50X2xpc3QuaGVhZCwKLQkJCSAgICAgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICAgICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOwotCi0JICAvKiBQZXJmb3JtIGFub3RoZXIgcmVsYXggcGFzcyAtIHRoaXMgdGltZSB3ZSBrbm93IHdoZXJlIHRoZQotCSAgICAgZ2xvYmFscyBhcmUsIHNvIGNhbiBtYWtlIGJldHRlciBndWVzcy4gICovCi0JICBsYW5nX3NpemVfc2VjdGlvbnMgKHN0YXRlbWVudF9saXN0LmhlYWQsCi0JCQkgICAgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICAgICAmKHN0YXRlbWVudF9saXN0LmhlYWQpLCAwLCAoYmZkX3ZtYSkgMCwgdHJ1ZSk7Ci0JfQotICAgICAgd2hpbGUgKHJlbGF4X2FnYWluKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTaXplIHVwIHRoZSBzZWN0aW9ucy4gICovCi0gICAgICBsYW5nX3NpemVfc2VjdGlvbnMgKHN0YXRlbWVudF9saXN0LmhlYWQsCi0JCQkgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgJihzdGF0ZW1lbnRfbGlzdC5oZWFkKSwgMCwgKGJmZF92bWEpIDAsIGZhbHNlKTsKLSAgICB9Ci0KLSAgLyogU2VlIGlmIGFueXRoaW5nIHNwZWNpYWwgc2hvdWxkIGJlIGRvbmUgbm93IHdlIGtub3cgaG93IGJpZwotICAgICBldmVyeXRoaW5nIGlzLiAgKi8KLSAgbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24gKCk7Ci0KLSAgLyogRml4IGFueSAuc3RhcnRvZi4gb3IgLnNpemVvZi4gc3ltYm9scy4gICovCi0gIGxhbmdfc2V0X3N0YXJ0b2YgKCk7Ci0KLSAgLyogRG8gYWxsIHRoZSBhc3NpZ25tZW50cywgbm93IHRoYXQgd2Uga25vdyB0aGUgZmluYWwgcmVzdGluZ3BsYWNlcwotICAgICBvZiBhbGwgdGhlIHN5bWJvbHMgKi8KLQotICBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzdGF0ZW1lbnRfbGlzdC5oZWFkLAotCQkgICAgICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkgICAgICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzZWN0aW9uIGFkZHJlc3NlcyBtYWtlIHNlbnNlLiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotICAgICAgJiYgY29tbWFuZF9saW5lLmNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzKQotICAgIGxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgKCk7Ci0gIAotICAvKiBGaW5hbCBzdHVmZnMgKi8KLQotICBsZGVtdWxfZmluaXNoICgpOwotICBsYW5nX2ZpbmlzaCAoKTsKLX0KLQotLyogRVhQT1JURUQgVE8gWUFDQyAqLwotCi12b2lkCi1sYW5nX2FkZF93aWxkIChzZWN0aW9uX25hbWUsIHNlY3Rpb25zX3NvcnRlZCwgZmlsZW5hbWUsIGZpbGVuYW1lc19zb3J0ZWQsCi0JICAgICAgIGtlZXBfc2VjdGlvbnMsIGV4Y2x1ZGVfZmlsZW5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmNvbnN0IHNlY3Rpb25fbmFtZTsKLSAgICAgYm9vbGVhbiBzZWN0aW9uc19zb3J0ZWQ7Ci0gICAgIGNvbnN0IGNoYXIgKmNvbnN0IGZpbGVuYW1lOwotICAgICBib29sZWFuIGZpbGVuYW1lc19zb3J0ZWQ7Ci0gICAgIGJvb2xlYW4ga2VlcF9zZWN0aW9uczsKLSAgICAgY29uc3QgY2hhciAqZXhjbHVkZV9maWxlbmFtZTsKLXsKLSAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ193aWxkX3N0YXRlbWVudCwKLQkJCQkJICAgIHN0YXRfcHRyKTsKLQotICBpZiAoc2VjdGlvbl9uYW1lICE9IChjaGFyICopIE5VTEwgJiYgc3RyY21wIChzZWN0aW9uX25hbWUsICJDT01NT04iKSA9PSAwKQotICAgIHsKLSAgICAgIHBsYWNlZF9jb21tb25zID0gdHJ1ZTsKLSAgICB9Ci0gIGlmIChmaWxlbmFtZSAhPSBOVUxMICYmICEgd2lsZGNhcmRwIChmaWxlbmFtZSkpCi0gICAgewotICAgICAgbGFuZ19oYXNfaW5wdXRfZmlsZSA9IHRydWU7Ci0gICAgfQotICBuZXctPnNlY3Rpb25fbmFtZSA9IHNlY3Rpb25fbmFtZTsKLSAgbmV3LT5zZWN0aW9uc19zb3J0ZWQgPSBzZWN0aW9uc19zb3J0ZWQ7Ci0gIG5ldy0+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+eXlfYnVmX3BvcyA9ICZiLT55eV9jaF9idWZbMV07Ci0KLSAgLyogZmxleCAyLjQuNyBjaGFuZ2VkIHRoZSBpbnRlcmZhY2UuICBGSVhNRTogV2Ugc2hvdWxkIG5vdCBiZSB1c2luZwotICAgICBhIGZsZXggaW50ZXJuYWwgaW50ZXJmYWNlIGluIHRoZSBmaXJzdCBwbGFjZSEgICovCi0jaWZkZWYgWVlfQlVGRkVSX05FVwotICBiLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05FVzsKLSNlbHNlCi0gIGItPnl5X2VvZl9zdGF0dXMgPSBFT0ZfTk9UX1NFRU47Ci0jZW5kaWYKLQotICByZXR1cm4gYjsKLX0KLQotLyogU3dpdGNoIGZsZXggdG8gcmVhZGluZyBmcm9tIFNUUklORywgc2F2aW5nIHRoZSBjdXJyZW50IGlucHV0IGluZm8KLSAgIG9uIHRoZSBpbmNsdWRlIHN0YWNrLiAgKi8KLQotdm9pZAotbGV4X3JlZGlyZWN0IChzdHJpbmcpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLXsKLSAgWVlfQlVGRkVSX1NUQVRFIHRtcDsKLQotICB5eV9pbml0ID0gMDsKLSAgaWYgKGluY2x1ZGVfc3RhY2tfcHRyID49IE1BWF9JTkNMVURFX0RFUFRIKSAKLSAgICB7Ci0gICAgICBlaW5mbygiJUY6IG1hY3JvcyBuZXN0ZWQgdG9vIGRlZXBseVxuIik7Ci0gICAgfQotICBmaWxlX25hbWVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gInJlZGlyZWN0IjsKLSAgbGluZW5vX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSA9IDA7Ci0gIGluY2x1ZGVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gWVlfQ1VSUkVOVF9CVUZGRVI7Ci0gIGluY2x1ZGVfc3RhY2tfcHRyKys7Ci0gIHRtcCA9IHl5X2NyZWF0ZV9zdHJpbmdfYnVmZmVyIChzdHJpbmcsIHN0cmxlbiAoc3RyaW5nKSk7Ci0gIHl5X3N3aXRjaF90b19idWZmZXIgKHRtcCk7Ci0gIEJFR0lOIChTQ1JJUFQpOwotfQotDAotLyogRnVuY3Rpb25zIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudCBmbGV4IHN0YXJ0IGNvbmRpdGlvbiwKLSAgIHNhdmluZyB0aGUgY3VycmVudCBzdGFydCBjb25kaXRpb24gb24gYHN0YXRlX3N0YWNrJy4gICovCi0KLXN0YXRpYyBpbnQgc3RhdGVfc3RhY2tbTUFYX0lOQ0xVREVfREVQVEggKiAyXTsKLXN0YXRpYyBpbnQgKnN0YXRlX3N0YWNrX3AgPSBzdGF0ZV9zdGFjazsKLQotdm9pZAotbGRsZXhfc2NyaXB0ICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoU0NSSVBUKTsKLX0KLQotdm9pZAotbGRsZXhfbXJpX3NjcmlwdCAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKE1SSSk7Ci19Ci0KLXZvaWQKLWxkbGV4X3ZlcnNpb25fc2NyaXB0ICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoVkVSU19TVEFSVCk7Ci19Ci0KLXZvaWQKLWxkbGV4X3ZlcnNpb25fZmlsZSAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKFZFUlNfU0NSSVBUKTsKLX0KLQotdm9pZAotbGRsZXhfZGVmc3ltICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoREVGU1lNRVhQKTsKLX0KLQkgICAKLXZvaWQKLWxkbGV4X2V4cHJlc3Npb24gKCkKLXsKLSAgKihzdGF0ZV9zdGFja19wKSsrID0geXlfc3RhcnQ7Ci0gIEJFR0lOIChFWFBSRVNTSU9OKTsKLX0KLQotdm9pZAotbGRsZXhfYm90aCAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKEJPVEgpOwotfQotCi12b2lkCi1sZGxleF9wb3BzdGF0ZSAoKQotewotICB5eV9zdGFydCA9ICooLS1zdGF0ZV9zdGFja19wKTsKLX0KLQwKLQotLyogUGxhY2UgdXAgdG8gTUFYX1NJWkUgY2hhcmFjdGVycyBpbiBCVUYgYW5kIHJldHVybiBpbiAqUkVTVUxUCi0gICBlaXRoZXIgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIDAgdG8gaW5kaWNhdGUgRU9GLiAgKi8KLQotc3RhdGljIHZvaWQKLXl5X2lucHV0IChidWYsIHJlc3VsdCwgbWF4X3NpemUpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50ICpyZXN1bHQ7Ci0gICAgIGludCBtYXhfc2l6ZTsKLXsKLSAgKnJlc3VsdCA9IDA7IAotICBpZiAoeXlfY3VycmVudF9idWZmZXItPnl5X2lucHV0X2ZpbGUpCi0gICAgewotICAgICAgaWYgKHl5aW4pCi0JewotCSAgKnJlc3VsdCA9IHJlYWQgKGZpbGVubyAoeXlpbiksIChjaGFyICopIGJ1ZiwgbWF4X3NpemUpOwotCSAgaWYgKCpyZXN1bHQgPCAwKSAKLQkgICAgZWluZm8gKCIlRiVQOiByZWFkIGluIGZsZXggc2Nhbm5lciBmYWlsZWRcbiIpOwotCX0KLSAgICB9Ci19Ci0KLS8qIEVhdCB0aGUgcmVzdCBvZiBhIEMtc3R5bGUgY29tbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1jb21tZW50ICgpCi17Ci0gIGludCBjOwotCi0gIHdoaWxlICgxKQotICB7Ci0gICAgYyA9IGlucHV0KCk7Ci0gICAgd2hpbGUgKGMgIT0gJyonICYmIGMgIT0gRU9GKSAKLSAgICB7Ci0gICAgICBpZiAoYyA9PSAnXG4nKQotCWxpbmVubysrOwotICAgICAgYyA9IGlucHV0KCk7Ci0gICAgfQotCi0gICAgaWYgKGMgPT0gJyonKQotICAgIHsKLSAgICAgIGMgPSBpbnB1dCgpOwotICAgICAgd2hpbGUgKGMgPT0gJyonKQotICAgICAgIGMgPSBpbnB1dCgpOwotICAgICAgaWYgKGMgPT0gJy8nKQotICAgICAgIGJyZWFrOwkJCS8qIGZvdW5kIHRoZSBlbmQgKi8KLSAgICB9Ci0KLSAgICBpZiAoYyA9PSAnXG4nKQotICAgICAgbGluZW5vKys7Ci0KLSAgICBpZiAoYyA9PSBFT0YpCi0gICAgewotICAgICAgZWluZm8oICIlRiVQOiBFT0YgaW4gY29tbWVudFxuIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLyogV2FybiB0aGUgdXNlciBhYm91dCBhIGdhcmJhZ2UgY2hhcmFjdGVyIFdIQVQgaW4gdGhlIGlucHV0Ci0gICBpbiBjb250ZXh0IFdIRVJFLiAgKi8KLQotc3RhdGljIHZvaWQKLWxleF93YXJuX2ludmFsaWQgKHdoZXJlLCB3aGF0KQotICAgICBjaGFyICp3aGVyZSwgKndoYXQ7Ci17Ci0gIGNoYXIgYnVmWzVdOwotCi0gIC8qIElmIHdlIGhhdmUgZm91bmQgYW4gaW5wdXQgZmlsZSB3aG9zZSBmb3JtYXQgd2UgZG8gbm90IHJlY29nbml6ZSwKLSAgICAgYW5kIHdlIGFyZSB0aGVyZWZvcmUgdHJlYXRpbmcgaXQgYXMgYSBsaW5rZXIgc2NyaXB0LCBhbmQgd2UgZmluZAotICAgICBhbiBpbnZhbGlkIGNoYXJhY3RlciwgdGhlbiBtb3N0IGxpa2VseSB0aGlzIGlzIGEgcmVhbCBvYmplY3QgZmlsZQotICAgICBvZiBzb21lIGRpZmZlcmVudCBmb3JtYXQuICBUcmVhdCBpdCBhcyBzdWNoLiAgKi8KLSAgaWYgKGxkZmlsZV9hc3N1bWVkX3NjcmlwdCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCk7Ci0gICAgICBlaW5mbyAoIiVGJXM6IGZpbGUgbm90IHJlY29nbml6ZWQ6ICVFXG4iLCBsZGZpbGVfaW5wdXRfZmlsZW5hbWUpOwotICAgIH0KLQotICBpZiAoISBpc3ByaW50ICgodW5zaWduZWQgY2hhcikgKndoYXQpKQotICAgIHsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpICp3aGF0KTsKLSAgICAgIHdoYXQgPSBidWY7Ci0gICAgfQotCi0gIGVpbmZvICgiJVA6JVM6IGlnbm9yaW5nIGludmFsaWQgY2hhcmFjdGVyIGAlcyclc1xuIiwgd2hhdCwgd2hlcmUpOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRtYWluLmMgYi9sZC9sZG1haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0YmMzMi4uMDAwMDAwMAotLS0gYS9sZC9sZG1haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDEzMDQgKzAsMCBAQAotLyogTWFpbiBwcm9ncmFtIG9mIEdOVSBsaW5rZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInByb2dyZXNzLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZHdyaXRlLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotCi0vKiBTb21ld2hlcmUgYWJvdmUsIHN5cy9zdGF0LmggZ290IGluY2x1ZGVkIC4gLiAuIC4gKi8KLSNpZiAhZGVmaW5lZChTX0lTRElSKSAmJiBkZWZpbmVkKFNfSUZESVIpCi0jZGVmaW5lCVNfSVNESVIobSkgKCgobSkgJiBTX0lGTVQpID09IFNfSUZESVIpCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWZkZWYgSEFWRV9TQlJLCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi1leHRlcm4gUFRSIHNicmsgKCk7Ci0jZW5kaWYKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqZ2V0X2VtdWxhdGlvbiBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHNldF9zY3JpcHRzX2RpciBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEVYUE9SVFMgKi8KLQotY2hhciAqZGVmYXVsdF90YXJnZXQ7Ci1jb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWUgPSAiYS5vdXQiOwotCi0vKiBOYW1lIHRoaXMgcHJvZ3JhbSB3YXMgaW52b2tlZCBieS4gICovCi1jaGFyICpwcm9ncmFtX25hbWU7Ci0KLS8qIFRoZSBmaWxlIHRoYXQgd2UncmUgY3JlYXRpbmcgKi8KLWJmZCAqb3V0cHV0X2JmZCA9IDA7Ci0KLS8qIFNldCBieSAtRyBhcmd1bWVudCwgZm9yIE1JUFMgRUNPRkYgdGFyZ2V0LiAgKi8KLWludCBnX3N3aXRjaF92YWx1ZSA9IDg7Ci0KLS8qIE5vbnplcm8gbWVhbnMgcHJpbnQgbmFtZXMgb2YgaW5wdXQgZmlsZXMgYXMgcHJvY2Vzc2VkLiAgKi8KLWJvb2xlYW4gdHJhY2VfZmlsZXM7Ci0KLS8qIE5vbnplcm8gbWVhbnMgc2FtZSwgYnV0IG5vdGUgb3BlbiBmYWlsdXJlcywgdG9vLiAgKi8KLWJvb2xlYW4gdHJhY2VfZmlsZV90cmllczsKLQotLyogTm9uemVybyBtZWFucyB2ZXJzaW9uIG51bWJlciB3YXMgcHJpbnRlZCwgc28gZXhpdCBzdWNjZXNzZnVsbHkKLSAgIGluc3RlYWQgb2YgY29tcGxhaW5pbmcgaWYgbm8gaW5wdXQgZmlsZXMgYXJlIGdpdmVuLiAgKi8KLWJvb2xlYW4gdmVyc2lvbl9wcmludGVkOwotCi0vKiBOb256ZXJvIG1lYW5zIGxpbmsgaW4gZXZlcnkgbWVtYmVyIG9mIGFuIGFyY2hpdmUuICAqLwotYm9vbGVhbiB3aG9sZV9hcmNoaXZlOwotCi0vKiBUcnVlIGlmIHdlIHNob3VsZCBkZW1hbmdsZSBzeW1ib2wgbmFtZXMuICAqLwotYm9vbGVhbiBkZW1hbmdsaW5nOwotCi1hcmdzX3R5cGUgY29tbWFuZF9saW5lOwotCi1sZF9jb25maWdfdHlwZSBjb25maWc7Ci0KLXN0YXRpYyB2b2lkIHJlbW92ZV9vdXRwdXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gY2hlY2tfZm9yX3NjcmlwdHNfZGlyIFBBUkFNUyAoKGNoYXIgKmRpcikpOwotc3RhdGljIGJvb2xlYW4gYWRkX2FyY2hpdmVfZWxlbWVudCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gbXVsdGlwbGVfZGVmaW5pdGlvbiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgY29uc3QgY2hhciAqLAotCQkJCQkgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsCi0JCQkJCSAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gbXVsdGlwbGVfY29tbW9uIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCWNvbnN0IGNoYXIgKiwgYmZkICosCi0JCQkJCWVudW0gYmZkX2xpbmtfaGFzaF90eXBlLCBiZmRfdm1hLAotCQkJCQliZmQgKiwgZW51bSBiZmRfbGlua19oYXNoX3R5cGUsCi0JCQkJCWJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGFkZF90b19zZXQgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCQkJCSAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwKLQkJCQkgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gY29uc3RydWN0b3JfY2FsbGJhY2sgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgICBib29sZWFuIGNvbnN0cnVjdG9yLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHdhcm5pbmdfY2FsbGJhY2sgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBiZmQgKiwKLQkJCQkJIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyB2b2lkIHdhcm5pbmdfZmluZF9yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiB1bmRlZmluZWRfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSBjb25zdCBjaGFyICosIGJmZCAqLAotCQkJCQkgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcmVsb2Nfb3ZlcmZsb3cgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICosIGJmZF92bWEsCi0JCQkJICAgICAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiByZWxvY19kYW5nZXJvdXMgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAotCQkJCQliZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gdW5hdHRhY2hlZF9yZWxvYyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgY29uc3QgY2hhciAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIG5vdGljZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCi0JCQkgICAgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MgbGlua19jYWxsYmFja3MgPQotewotICBhZGRfYXJjaGl2ZV9lbGVtZW50LAotICBtdWx0aXBsZV9kZWZpbml0aW9uLAotICBtdWx0aXBsZV9jb21tb24sCi0gIGFkZF90b19zZXQsCi0gIGNvbnN0cnVjdG9yX2NhbGxiYWNrLAotICB3YXJuaW5nX2NhbGxiYWNrLAotICB1bmRlZmluZWRfc3ltYm9sLAotICByZWxvY19vdmVyZmxvdywKLSAgcmVsb2NfZGFuZ2Vyb3VzLAotICB1bmF0dGFjaGVkX3JlbG9jLAotICBub3RpY2UKLX07Ci0KLXN0cnVjdCBiZmRfbGlua19pbmZvIGxpbmtfaW5mbzsKLQwKLXN0YXRpYyB2b2lkCi1yZW1vdmVfb3V0cHV0ICgpCi17Ci0gIGlmIChvdXRwdXRfZmlsZW5hbWUpIAotICAgIHsKLSAgICAgIGlmIChvdXRwdXRfYmZkICYmIG91dHB1dF9iZmQtPmlvc3RyZWFtKQotCWZjbG9zZSgoRklMRSAqKShvdXRwdXRfYmZkLT5pb3N0cmVhbSkpOwotICAgICAgaWYgKGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlKQotCXVubGluayAob3V0cHV0X2ZpbGVuYW1lKTsKLSAgICB9Ci19Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBjaGFyICplbXVsYXRpb247Ci0gIGxvbmcgc3RhcnRfdGltZSA9IGdldF9ydW5fdGltZSAoKTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKLQotICBiZmRfaW5pdCAoKTsKLQotICBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICB4YXRleGl0IChyZW1vdmVfb3V0cHV0KTsKLQotICAvKiBTZXQgdGhlIGRlZmF1bHQgQkZEIHRhcmdldCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCB0YXJnZXQuICBEb2luZwotICAgICB0aGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0byBiZSBjb25maWd1cmVkIGZvciBhIHBhcnRpY3VsYXIgdGFyZ2V0LAotICAgICBhbmQgbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgQkZEIGxpYnJhcnkgd2hpY2ggd2FzIGNvbmZpZ3VyZWQgZm9yCi0gICAgIGEgZGlmZmVyZW50IHRhcmdldC4gIFRoZSBtYWNybyBUQVJHRVQgaXMgZGVmaW5lZCBieSBNYWtlZmlsZS4gICovCi0gIGlmICghIGJmZF9zZXRfZGVmYXVsdF90YXJnZXQgKFRBUkdFVCkpCi0gICAgewotICAgICAgZWluZm8gKF8oIiVYJVA6IGNhbid0IHNldCBCRkQgZGVmYXVsdCB0YXJnZXQgdG8gYCVzJzogJUVcbiIpLCBUQVJHRVQpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBJbml0aWFsaXplIHRoZSBkYXRhIGFib3V0IG9wdGlvbnMuICAqLwotICB0cmFjZV9maWxlcyA9IHRyYWNlX2ZpbGVfdHJpZXMgPSB2ZXJzaW9uX3ByaW50ZWQgPSBmYWxzZTsKLSAgd2hvbGVfYXJjaGl2ZSA9IGZhbHNlOwotICBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID0gdHJ1ZTsKLSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotICBjb25maWcuaGFzX3NoYXJlZCA9IGZhbHNlOwotICBjb21tYW5kX2xpbmUuZm9yY2VfY29tbW9uX2RlZmluaXRpb24gPSBmYWxzZTsKLSAgY29tbWFuZF9saW5lLmludGVycHJldGVyID0gTlVMTDsKLSAgY29tbWFuZF9saW5lLnJwYXRoID0gTlVMTDsKLSAgY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2ggPSB0cnVlOwotICBjb21tYW5kX2xpbmUuY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgPSB0cnVlOwotCi0gIC8qIFdlIGluaXRpYWxpemUgREVNQU5HTElORyBiYXNlZCBvbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgQ09MTEVDVF9OT19ERU1BTkdMRS4gIFRoZSBnY2MgY29sbGVjdDIgcHJvZ3JhbSB3aWxsIGRlbWFuZ2xlIHRoZQotICAgICBvdXRwdXQgb2YgdGhlIGxpbmtlciwgdW5sZXNzIENPTExFQ1RfTk9fREVNQU5HTEUgaXMgc2V0IGluIHRoZQotICAgICBlbnZpcm9ubWVudC4gIEFjdGluZyB0aGUgc2FtZSB3YXkgaGVyZSBsZXRzIHVzIHByb3ZpZGUgdGhlIHNhbWUKLSAgICAgaW50ZXJmYWNlIGJ5IGRlZmF1bHQuICAqLwotICBkZW1hbmdsaW5nID0gZ2V0ZW52ICgiQ09MTEVDVF9OT19ERU1BTkdMRSIpID09IE5VTEw7Ci0KLSAgbGlua19pbmZvLmNhbGxiYWNrcyA9ICZsaW5rX2NhbGxiYWNrczsKLSAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICBsaW5rX2luZm8uc2hhcmVkID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5zeW1ib2xpYyA9IGZhbHNlOwotICBsaW5rX2luZm8uc3RhdGljX2xpbmsgPSBmYWxzZTsKLSAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IGZhbHNlOwotICBsaW5rX2luZm8ub3B0aW1pemUgPSBmYWxzZTsKLSAgbGlua19pbmZvLm5vX3VuZGVmaW5lZCA9IGZhbHNlOwotICBsaW5rX2luZm8uc3RyaXAgPSBzdHJpcF9ub25lOwotICBsaW5rX2luZm8uZGlzY2FyZCA9IGRpc2NhcmRfbm9uZTsKLSAgbGlua19pbmZvLmtlZXBfbWVtb3J5ID0gdHJ1ZTsKLSAgbGlua19pbmZvLmlucHV0X2JmZHMgPSBOVUxMOwotICBsaW5rX2luZm8uY3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24gPSBOVUxMOwotICBsaW5rX2luZm8uaGFzaCA9IE5VTEw7Ci0gIGxpbmtfaW5mby5rZWVwX2hhc2ggPSBOVUxMOwotICBsaW5rX2luZm8ubm90aWNlX2FsbCA9IGZhbHNlOwotICBsaW5rX2luZm8ubm90aWNlX2hhc2ggPSBOVUxMOwotICBsaW5rX2luZm8ud3JhcF9oYXNoID0gTlVMTDsKLSAgbGlua19pbmZvLm1wYzg2MGMwID0gMDsKLSAgLyogU1ZSNCBsaW5rZXJzIHNlZW0gdG8gc2V0IERUX0lOSVQgYW5kIERUX0ZJTkkgYmFzZWQgb24gbWFnaWMgX2luaXQKLSAgICAgYW5kIF9maW5pIHN5bWJvbHMuICBXZSBhcmUgY29tcGF0aWJsZS4gICovCi0gIGxpbmtfaW5mby5pbml0X2Z1bmN0aW9uID0gIl9pbml0IjsKLSAgbGlua19pbmZvLmZpbmlfZnVuY3Rpb24gPSAiX2ZpbmkiOwotCi0gIGxkZmlsZV9hZGRfYXJjaCAoIiIpOwotCi0gIGNvbmZpZy5tYWtlX2V4ZWN1dGFibGUgPSB0cnVlOwotICBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPSBmYWxzZTsKLSAgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCA9IHRydWU7Ci0gIGNvbmZpZy50ZXh0X3JlYWRfb25seSA9IHRydWU7Ci0gIGNvbmZpZy5tYWtlX2V4ZWN1dGFibGUgPSB0cnVlOwotCi0gIGVtdWxhdGlvbiA9IGdldF9lbXVsYXRpb24gKGFyZ2MsIGFyZ3YpOwotICBsZGVtdWxfY2hvb3NlX21vZGUgKGVtdWxhdGlvbik7Ci0gIGRlZmF1bHRfdGFyZ2V0ID0gbGRlbXVsX2Nob29zZV90YXJnZXQgKCk7Ci0gIGxhbmdfaW5pdCAoKTsKLSAgbGRlbXVsX2JlZm9yZV9wYXJzZSAoKTsKLSAgbGFuZ19oYXNfaW5wdXRfZmlsZSA9IGZhbHNlOwotICBwYXJzZV9hcmdzIChhcmdjLCBhcmd2KTsKLQotICBsZGVtdWxfc2V0X3N5bWJvbHMgKCk7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaWYgKGNvbW1hbmRfbGluZS5nY19zZWN0aW9ucykKLQllaW5mbyAoIiVQJUY6IC0tZ2Mtc2VjdGlvbnMgYW5kIC1yIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIik7Ci0gICAgICBpZiAobGlua19pbmZvLm1wYzg2MGMwKQotCWVpbmZvIChfKCIlUCVGOiAtciBhbmQgLS1tcGM4NjBjMCBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIpKTsKLSAgICAgIGVsc2UgaWYgKGNvbW1hbmRfbGluZS5yZWxheCkKLQllaW5mbyAoXygiJVAlRjogLS1yZWxheCBhbmQgLXIgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iKSk7Ci0gICAgICBpZiAobGlua19pbmZvLnNoYXJlZCkKLQllaW5mbyAoXygiJVAlRjogLXIgYW5kIC1zaGFyZWQgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iKSk7Ci0gICAgfQotCi0gIC8qIFRyZWF0IGxkIC1yIC1zIGFzIGxkIC1yIC1TIC14IChpLmUuLCBzdHJpcCBhbGwgbG9jYWwgc3ltYm9scykuICBJCi0gICAgIGRvbid0IHNlZSBob3cgZWxzZSB0aGlzIGNhbiBiZSBoYW5kbGVkLCBzaW5jZSBpbiB0aGlzIGNhc2Ugd2UKLSAgICAgbXVzdCBwcmVzZXJ2ZSBhbGwgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMuICAqLwotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSAmJiBsaW5rX2luZm8uc3RyaXAgPT0gc3RyaXBfYWxsKQotICAgIHsKLSAgICAgIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX2RlYnVnZ2VyOwotICAgICAgaWYgKGxpbmtfaW5mby5kaXNjYXJkID09IGRpc2NhcmRfbm9uZSkKLQlsaW5rX2luZm8uZGlzY2FyZCA9IGRpc2NhcmRfYWxsOwotICAgIH0KLQotICAvKiBUaGlzIGVzc2VudGlhbGx5IGFkZHMgYW5vdGhlciAtTCBkaXJlY3Rvcnkgc28gdGhpcyBtdXN0IGJlIGRvbmUgYWZ0ZXIKLSAgICAgdGhlIC1MJ3MgaW4gYXJndiBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgKi8KLSAgc2V0X3NjcmlwdHNfZGlyICgpOwotCi0gIGlmIChoYWRfc2NyaXB0ID09IGZhbHNlKQotICAgIHsKLSAgICAgIC8qIFJlYWQgdGhlIGVtdWxhdGlvbidzIGFwcHJvcHJpYXRlIGRlZmF1bHQgc2NyaXB0LiAgKi8KLSAgICAgIGludCBpc2ZpbGU7Ci0gICAgICBjaGFyICpzID0gbGRlbXVsX2dldF9zY3JpcHQgKCZpc2ZpbGUpOwotCi0gICAgICBpZiAoaXNmaWxlKQotCWxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAocyk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHRyYWNlX2ZpbGVfdHJpZXMpCi0JICAgIHsKLQkgICAgICBpbmZvX21zZyAoXygidXNpbmcgaW50ZXJuYWwgbGlua2VyIHNjcmlwdDpcbiIpKTsKLQkgICAgICBpbmZvX21zZyAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKLQkgICAgICBpbmZvX21zZyAocyk7Ci0JICAgICAgaW5mb19tc2cgKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKLQkgICAgfQotCSAgbGV4X3N0cmluZyA9IHM7Ci0JICBsZXhfcmVkaXJlY3QgKHMpOwotCX0KLSAgICAgIHBhcnNlcl9pbnB1dCA9IGlucHV0X3NjcmlwdDsKLSAgICAgIHl5cGFyc2UgKCk7Ci0gICAgICBsZXhfc3RyaW5nID0gTlVMTDsKLSAgICB9Ci0KLSAgbGFuZ19maW5hbCAoKTsKLQotICBpZiAobGFuZ19oYXNfaW5wdXRfZmlsZSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAodmVyc2lvbl9wcmludGVkKQotCXhleGl0ICgwKTsKLSAgICAgIGVpbmZvIChfKCIlUCVGOiBubyBpbnB1dCBmaWxlc1xuIikpOwotICAgIH0KLQotICBpZiAodHJhY2VfZmlsZXMpCi0gICAgewotICAgICAgaW5mb19tc2cgKF8oIiVQOiBtb2RlICVzXG4iKSwgZW11bGF0aW9uKTsKLSAgICB9Ci0KLSAgbGRlbXVsX2FmdGVyX3BhcnNlICgpOwotCi0KLSAgaWYgKGNvbmZpZy5tYXBfZmlsZW5hbWUpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoY29uZmlnLm1hcF9maWxlbmFtZSwgIi0iKSA9PSAwKQotCXsKLQkgIGNvbmZpZy5tYXBfZmlsZSA9IHN0ZG91dDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY29uZmlnLm1hcF9maWxlID0gZm9wZW4gKGNvbmZpZy5tYXBfZmlsZW5hbWUsIEZPUEVOX1dUKTsKLQkgIGlmIChjb25maWcubWFwX2ZpbGUgPT0gKEZJTEUgKikgTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICAgICAgZWluZm8gKF8oIiVQJUY6IGNhbm5vdCBvcGVuIG1hcCBmaWxlICVzOiAlRVxuIiksCi0JCSAgICAgY29uZmlnLm1hcF9maWxlbmFtZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0KLSAgbGFuZ19wcm9jZXNzICgpOwotCi0gIC8qIFByaW50IGVycm9yIG1lc3NhZ2VzIGZvciBhbnkgbWlzc2luZyBzeW1ib2xzLCBmb3IgYW55IHdhcm5pbmcKLSAgICAgc3ltYm9scywgYW5kIHBvc3NpYmx5IG11bHRpcGxlIGRlZmluaXRpb25zICovCi0KLQotICBpZiAoY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHsKLSAgICAgIC8qIExvb2sgZm9yIGEgdGV4dCBzZWN0aW9uIGFuZCBtYXJrIHRoZSByZWFkb25seSBhdHRyaWJ1dGUgaW4gaXQgKi8KLSAgICAgIGFzZWN0aW9uICpmb3VuZCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnRleHQiKTsKLQotICAgICAgaWYgKGZvdW5kICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCXsKLQkgIGZvdW5kLT5mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0JfQotICAgIH0KLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICBvdXRwdXRfYmZkLT5mbGFncyAmPSB+RVhFQ19QOwotICBlbHNlCi0gICAgb3V0cHV0X2JmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotCi0gIGxkd3JpdGUgKCk7Ci0KLSAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSBOVUxMKQotICAgIGxhbmdfbWFwICgpOwotICBpZiAoY29tbWFuZF9saW5lLmNyZWYpCi0gICAgb3V0cHV0X2NyZWYgKGNvbmZpZy5tYXBfZmlsZSAhPSBOVUxMID8gY29uZmlnLm1hcF9maWxlIDogc3Rkb3V0KTsKLSAgaWYgKG5vY3Jvc3NyZWZfbGlzdCAhPSBOVUxMKQotICAgIGNoZWNrX25vY3Jvc3NyZWZzICgpOwotCi0gIC8qIEV2ZW4gaWYgd2UncmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHNvbWUgbm9uLWZhdGFsIGVycm9ycyBzaG91bGQKLSAgICAgYmUgcmVwb3J0ZWQgaW4gdGhlIGV4aXQgc3RhdHVzLiAgKFdoYXQgbm9uLWZhdGFsIGVycm9ycywgaWYgYW55LCBkbyB3ZQotICAgICB3YW50IHRvIGlnbm9yZSBmb3IgcmVsb2NhdGVhYmxlIG91dHB1dD8pICAqLwotCi0gIGlmIChjb25maWcubWFrZV9leGVjdXRhYmxlID09IGZhbHNlICYmIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAodHJhY2VfZmlsZXMgPT0gdHJ1ZSkKLQl7Ci0JICBlaW5mbyAoXygiJVA6IGxpbmsgZXJyb3JzIGZvdW5kLCBkZWxldGluZyBleGVjdXRhYmxlIGAlcydcbiIpLAotCQkgb3V0cHV0X2ZpbGVuYW1lKTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBmaWxlIHdpbGwgYmUgcmVtb3ZlZCBieSByZW1vdmVfb3V0cHV0LiAgKi8KLQotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jbG9zZSAob3V0cHV0X2JmZCkpCi0JZWluZm8gKF8oIiVGJUI6IGZpbmFsIGNsb3NlIGZhaWxlZDogJUVcbiIpLCBvdXRwdXRfYmZkKTsKLQotICAgICAgLyogSWYgdGhlIC0tZm9yY2UtZXhlLXN1ZmZpeCBpcyBlbmFibGVkLCBhbmQgd2UncmUgbWFraW5nIGFuCi0JIGV4ZWN1dGFibGUgZmlsZSBhbmQgaXQgZG9lc24ndCBlbmQgaW4gLmV4ZSwgY29weSBpdCB0byBvbmUgd2hpY2ggZG9lcy4gKi8KLQotICAgICAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSAmJiBjb21tYW5kX2xpbmUuZm9yY2VfZXhlX3N1ZmZpeCkKLQl7Ci0JICBpbnQgbGVuID0gc3RybGVuIChvdXRwdXRfZmlsZW5hbWUpOwotCSAgaWYgKGxlbiA8IDQgCi0JICAgICAgfHwgKHN0cmNhc2VjbXAgKG91dHB1dF9maWxlbmFtZSArIGxlbiAtIDQsICIuZXhlIikgIT0gMAotCQkgICYmIHN0cmNhc2VjbXAgKG91dHB1dF9maWxlbmFtZSArIGxlbiAtIDQsICIuZGxsIikgIT0gMCkpCi0JICAgIHsKLQkgICAgICBGSUxFICpzcmM7Ci0JICAgICAgRklMRSAqZHN0OwotCSAgICAgIGNvbnN0IGludCBic2l6ZSA9IDQwOTY7Ci0JICAgICAgY2hhciAqYnVmID0geG1hbGxvYyAoYnNpemUpOwotCSAgICAgIGludCBsOwotCSAgICAgIGNoYXIgKmRzdF9uYW1lID0geG1hbGxvYyAobGVuICsgNSk7Ci0JICAgICAgc3RyY3B5IChkc3RfbmFtZSwgb3V0cHV0X2ZpbGVuYW1lKTsKLQkgICAgICBzdHJjYXQgKGRzdF9uYW1lLCAiLmV4ZSIpOwotCSAgICAgIHNyYyA9IGZvcGVuIChvdXRwdXRfZmlsZW5hbWUsIEZPUEVOX1JCKTsKLQkgICAgICBkc3QgPSBmb3BlbiAoZHN0X25hbWUsIEZPUEVOX1dCKTsKLQotCSAgICAgIGlmICghc3JjKQotCQllaW5mbyAoXygiJVglUDogdW5hYmxlIHRvIG9wZW4gZm9yIHNvdXJjZSBvZiBjb3B5IGAlcydcbiIpLCBvdXRwdXRfZmlsZW5hbWUpOwotCSAgICAgIGlmICghZHN0KQotCQllaW5mbyAoXygiJVglUDogdW5hYmxlIHRvIG9wZW4gZm9yIGRlc3RpbmF0aW9uIG9mIGNvcHkgYCVzJ1xuIiksIGRzdF9uYW1lKTsKLQkgICAgICB3aGlsZSAoKGwgPSBmcmVhZCAoYnVmLCAxLCBic2l6ZSwgc3JjKSkgPiAwKQotCQl7Ci0JCSAgaW50IGRvbmUgPSBmd3JpdGUgKGJ1ZiwgMSwgbCwgZHN0KTsKLQkJICBpZiAoZG9uZSAhPSBsKQotCQkgICAgewotCQkgICAgICBlaW5mbyAoXygiJVA6IEVycm9yIHdyaXRpbmcgZmlsZSBgJXMnXG4iKSwgZHN0X25hbWUpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZmNsb3NlIChzcmMpOwotCSAgICAgIGlmIChmY2xvc2UgKGRzdCkgPT0gRU9GKQotCQl7Ci0JCSAgZWluZm8gKF8oIiVQOiBFcnJvciBjbG9zaW5nIGZpbGUgYCVzJ1xuIiksIGRzdF9uYW1lKTsKLQkJfQotCSAgICAgIGZyZWUgKGRzdF9uYW1lKTsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7Ci0KLSAgaWYgKGNvbmZpZy5zdGF0cykKLSAgICB7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gICAgICBjaGFyICpsaW0gPSAoY2hhciAqKSBzYnJrICgwKTsKLSNlbmRpZgotICAgICAgbG9uZyBydW5fdGltZSA9IGdldF9ydW5fdGltZSAoKSAtIHN0YXJ0X3RpbWU7Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHRvdGFsIHRpbWUgaW4gbGluazogJWxkLiUwNmxkXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCBydW5fdGltZSAvIDEwMDAwMDAsIHJ1bl90aW1lICUgMTAwMDAwMCk7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBkYXRhIHNpemUgJWxkXG4iKSwgcHJvZ3JhbV9uYW1lLAotCSAgICAgICAobG9uZykgKGxpbSAtIChjaGFyICopICZlbnZpcm9uKSk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyogUHJldmVudCByZW1vdmVfb3V0cHV0IGZyb20gZG9pbmcgYW55dGhpbmcsIGFmdGVyIGEgc3VjY2Vzc2Z1bCBsaW5rLiAgKi8KLSAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLQotICB4ZXhpdCAoMCk7Ci0gIHJldHVybiAwOwotfQotCi0vKiBXZSBuZWVkIHRvIGZpbmQgYW55IGV4cGxpY2l0bHkgZ2l2ZW4gZW11bGF0aW9uIGluIG9yZGVyIHRvIGluaXRpYWxpemUgdGhlCi0gICBzdGF0ZSB0aGF0J3MgbmVlZGVkIGJ5IHRoZSBsZXgmeWFjYyBhcmd1bWVudCBwYXJzZXIgKHBhcnNlX2FyZ3MpLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZ2V0X2VtdWxhdGlvbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBjaGFyICplbXVsYXRpb247Ci0gIGludCBpOwotCi0gIGVtdWxhdGlvbiA9IGdldGVudiAoRU1VTEFUSU9OX0VOVklST04pOwotICBpZiAoZW11bGF0aW9uID09IE5VTEwpCi0gICAgZW11bGF0aW9uID0gREVGQVVMVF9FTVVMQVRJT047Ci0KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXN0cm5jbXAgKGFyZ3ZbaV0sICItbSIsIDIpKQotCXsKLQkgIGlmIChhcmd2W2ldWzJdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICAvKiAtbSBFTVVMICovCi0JICAgICAgaWYgKGkgPCBhcmdjIC0gMSkKLQkJewotCQkgIGVtdWxhdGlvbiA9IGFyZ3ZbaSArIDFdOwotCQkgIGkrKzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGVpbmZvKF8oIiVQJUY6IG1pc3NpbmcgYXJndW1lbnQgdG8gLW1cbiIpKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItbWlwczEiKSA9PSAwCi0JCSAgIHx8IHN0cmNtcCAoYXJndltpXSwgIi1taXBzMiIpID09IDAKLQkJICAgfHwgc3RyY21wIChhcmd2W2ldLCAiLW1pcHMzIikgPT0gMAotCQkgICB8fCBzdHJjbXAgKGFyZ3ZbaV0sICItbWlwczQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFRoZSBhcmd1bWVudHMgLW1pcHMxLCAtbWlwczIgYW5kIC1taXBzMyBhcmUKLQkJIHBhc3NlZCB0byB0aGUgbGlua2VyIGJ5IHNvbWUgTUlQUyBjb21waWxlcnMuICBUaGV5Ci0JCSBnZW5lcmFsbHkgdGVsbCB0aGUgbGlua2VyIHRvIHVzZSBhIHNsaWdodGx5IGRpZmZlcmVudAotCQkgbGlicmFyeSBwYXRoLiAgUGVyaGFwcyBzb21lZGF5IHRoZXNlIHNob3VsZCBiZQotCQkgaW1wbGVtZW50ZWQgYXMgZW11bGF0aW9uczsgdW50aWwgdGhlbiwgd2UganVzdCBpZ25vcmUKLQkJIHRoZSBhcmd1bWVudHMgYW5kIGhvcGUgdGhhdCBub2JvZHkgZXZlciBjcmVhdGVzCi0JCSBlbXVsYXRpb25zIG5hbWVkIGlwczEsIGlwczIgb3IgaXBzMy4gICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAoYXJndltpXSwgIi1tNDg2IikgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBUaGUgYXJndW1lbnQgLW00ODYgaXMgcGFzc2VkIHRvIHRoZSBsaW5rZXIgb24KLQkJIHNvbWUgTGludXggc3lzdGVtcy4gIEhvcGUgdGhhdCBub2JvZHkgY3JlYXRlcyBhbgotCQkgZW11bGF0aW9uIG5hbWVkIDQ4Ni4gICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIC1tRU1VTCAqLwotCSAgICAgIGVtdWxhdGlvbiA9ICZhcmd2W2ldWzJdOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gZW11bGF0aW9uOwotfQotCi0vKiBJZiBkaXJlY3RvcnkgRElSIGNvbnRhaW5zIGFuICJsZHNjcmlwdHMiIHN1YmRpcmVjdG9yeSwKLSAgIGFkZCBESVIgdG8gdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggYW5kIHJldHVybiB0cnVlLAotICAgZWxzZSByZXR1cm4gZmFsc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY2hlY2tfZm9yX3NjcmlwdHNfZGlyIChkaXIpCi0gICAgIGNoYXIgKmRpcjsKLXsKLSAgc2l6ZV90IGRpcmxlbjsKLSAgY2hhciAqYnVmOwotICBzdHJ1Y3Qgc3RhdCBzOwotICBib29sZWFuIHJlczsKLQotICBkaXJsZW4gPSBzdHJsZW4gKGRpcik7Ci0gIC8qIHNpemVvZiBjb3VudHMgdGhlIHRlcm1pbmF0aW5nIE5VTC4gICovCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGRpcmxlbiArIHNpemVvZigiL2xkc2NyaXB0cyIpKTsKLSAgc3ByaW50ZiAoYnVmLCAiJXMvbGRzY3JpcHRzIiwgZGlyKTsKLQotICByZXMgPSBzdGF0IChidWYsICZzKSA9PSAwICYmIFNfSVNESVIgKHMuc3RfbW9kZSk7Ci0gIGZyZWUgKGJ1Zik7Ci0gIGlmIChyZXMpCi0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGRpciwgZmFsc2UpOwotICByZXR1cm4gcmVzOwotfQotCi0vKiBTZXQgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGZvciBmaW5kaW5nIHNjcmlwdCBmaWxlcy4KLSAgIExpYnJhcmllcyB3aWxsIGJlIHNlYXJjaGVkIGZvciBoZXJlIHRvbywgYnV0IHRoYXQncyBvay4KLSAgIFdlIGxvb2sgZm9yIHRoZSAibGRzY3JpcHRzIiBkaXJlY3RvcnkgaW46Ci0KLSAgIFNDUklQVERJUiAocGFzc2VkIGZyb20gTWFrZWZpbGUpCi0gICB0aGUgZGlyIHdoZXJlIHRoaXMgcHJvZ3JhbSBpcyAoZm9yIHVzaW5nIGl0IGZyb20gdGhlIGJ1aWxkIHRyZWUpCi0gICB0aGUgZGlyIHdoZXJlIHRoaXMgcHJvZ3JhbSBpcy8uLi9saWIgKGZvciBpbnN0YWxsaW5nIHRoZSB0b29sIHN1aXRlIGVsc2V3aGVyZSkgKi8KLQotc3RhdGljIHZvaWQKLXNldF9zY3JpcHRzX2RpciAoKQotewotICBjaGFyICplbmQsICpkaXI7Ci0gIHNpemVfdCBkaXJsZW47Ci0KLSAgaWYgKGNoZWNrX2Zvcl9zY3JpcHRzX2RpciAoU0NSSVBURElSKSkKLSAgICByZXR1cm47CQkJLyogV2UndmUgYmVlbiBpbnN0YWxsZWQgbm9ybWFsbHkuICAqLwotCi0gIC8qIExvb2sgZm9yICJsZHNjcmlwdHMiIGluIHRoZSBkaXIgd2hlcmUgb3VyIGJpbmFyeSBpcy4gICovCi0gIGVuZCA9IHN0cnJjaHIgKHByb2dyYW1fbmFtZSwgJy8nKTsKLQotICBpZiAoZW5kID09IE5VTEwpCi0gICAgewotICAgICAgLyogRG9uJ3QgbG9vayBmb3IgbGRzY3JpcHRzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIFRoZXJlIGlzCi0gICAgICAgICB0b28gbXVjaCBwb3RlbnRpYWwgZm9yIGNvbmZ1c2lvbi4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRpcmxlbiA9IGVuZCAtIHByb2dyYW1fbmFtZTsKLSAgLyogTWFrZSBhIGNvcHkgb2YgcHJvZ3JhbV9uYW1lIGluIGRpci4KLSAgICAgTGVhdmUgcm9vbSBmb3IgbGF0ZXIgIi8uLi9saWIiLiAgKi8KLSAgZGlyID0gKGNoYXIgKikgeG1hbGxvYyAoZGlybGVuICsgOCk7Ci0gIHN0cm5jcHkgKGRpciwgcHJvZ3JhbV9uYW1lLCBkaXJsZW4pOwotICBkaXJbZGlybGVuXSA9ICdcMCc7Ci0KLSAgaWYgKGNoZWNrX2Zvcl9zY3JpcHRzX2RpciAoZGlyKSkKLSAgICByZXR1cm47CQkJLyogRG9uJ3QgZnJlZSBkaXIuICAqLwotCi0gIC8qIExvb2sgZm9yICJsZHNjcmlwdHMiIGluIDx0aGUgZGlyIHdoZXJlIG91ciBiaW5hcnkgaXM+Ly4uL2xpYi4gICovCi0gIHN0cmNweSAoZGlyICsgZGlybGVuLCAiLy4uL2xpYiIpOwotICBpZiAoY2hlY2tfZm9yX3NjcmlwdHNfZGlyIChkaXIpKQotICAgIHJldHVybjsKLQotICBmcmVlIChkaXIpOwkJCS8qIFdlbGwsIHdlIHRyaWVkLiAgKi8KLX0KLQotdm9pZAotYWRkX3lzeW0gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChsaW5rX2luZm8ubm90aWNlX2hhc2ggPT0gKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmtfaW5mby5ub3RpY2VfaGFzaCA9ICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopCi0JCQkgICAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpKSk7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0X24gKGxpbmtfaW5mby5ub3RpY2VfaGFzaCwKLQkJCQkgICBiZmRfaGFzaF9uZXdmdW5jLAotCQkJCSAgIDYxKSkKLQllaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgfSAgICAgIAotCi0gIGlmIChiZmRfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5ub3RpY2VfaGFzaCwgbmFtZSwgdHJ1ZSwgdHJ1ZSkKLSAgICAgID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIpKTsKLX0KLQotLyogUmVjb3JkIGEgc3ltYm9sIHRvIGJlIHdyYXBwZWQsIGZyb20gdGhlIC0td3JhcCBvcHRpb24uICAqLwotCi12b2lkCi1hZGRfd3JhcCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKGxpbmtfaW5mby53cmFwX2hhc2ggPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsaW5rX2luZm8ud3JhcF9oYXNoID0gKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikKLQkJCSAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpKSk7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0X24gKGxpbmtfaW5mby53cmFwX2hhc2gsCi0JCQkJICAgYmZkX2hhc2hfbmV3ZnVuYywKLQkJCQkgICA2MSkpCi0JZWluZm8gKF8oIiVQJUY6IGJmZF9oYXNoX3RhYmxlX2luaXQgZmFpbGVkOiAlRVxuIikpOwotICAgIH0KLSAgaWYgKGJmZF9oYXNoX2xvb2t1cCAobGlua19pbmZvLndyYXBfaGFzaCwgbmFtZSwgdHJ1ZSwgdHJ1ZSkgPT0gTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIpKTsKLX0KLQotLyogSGFuZGxlIHRoZSAtcmV0YWluLXN5bWJvbHMtZmlsZSBvcHRpb24uICAqLwotCi12b2lkCi1hZGRfa2VlcHN5bXNfZmlsZSAoZmlsZW5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICpmaWxlOwotICBjaGFyICpidWY7Ci0gIHNpemVfdCBidWZzaXplOwotICBpbnQgYzsKLQotICBpZiAobGlua19pbmZvLnN0cmlwID09IHN0cmlwX3NvbWUpCi0gICAgZWluZm8gKF8oIiVYJVA6IGVycm9yOiBkdXBsaWNhdGUgcmV0YWluLXN5bWJvbHMtZmlsZVxuIikpOwotCi0gIGZpbGUgPSBmb3BlbiAoZmlsZW5hbWUsICJyIik7Ci0gIGlmIChmaWxlID09IChGSUxFICopIE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIGVpbmZvICgiJVglUDogJXM6ICVFXG4iLCBmaWxlbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxpbmtfaW5mby5rZWVwX2hhc2ggPSAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKQotCQkJIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX3RhYmxlKSkpOwotICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0IChsaW5rX2luZm8ua2VlcF9oYXNoLCBiZmRfaGFzaF9uZXdmdW5jKSkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iKSk7Ci0KLSAgYnVmc2l6ZSA9IDEwMDsKLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoYnVmc2l6ZSk7Ci0KLSAgYyA9IGdldGMgKGZpbGUpOwotICB3aGlsZSAoYyAhPSBFT0YpCi0gICAgewotICAgICAgd2hpbGUgKGlzc3BhY2UgKGMpKQotCWMgPSBnZXRjIChmaWxlKTsKLQotICAgICAgaWYgKGMgIT0gRU9GKQotCXsKLQkgIHNpemVfdCBsZW4gPSAwOwotCi0JICB3aGlsZSAoISBpc3NwYWNlIChjKSAmJiBjICE9IEVPRikKLQkgICAgewotCSAgICAgIGJ1ZltsZW5dID0gYzsKLQkgICAgICArK2xlbjsKLQkgICAgICBpZiAobGVuID49IGJ1ZnNpemUpCi0JCXsKLQkJICBidWZzaXplICo9IDI7Ci0JCSAgYnVmID0geHJlYWxsb2MgKGJ1ZiwgYnVmc2l6ZSk7Ci0JCX0KLQkgICAgICBjID0gZ2V0YyAoZmlsZSk7Ci0JICAgIH0KLQotCSAgYnVmW2xlbl0gPSAnXDAnOwotCi0JICBpZiAoYmZkX2hhc2hfbG9va3VwIChsaW5rX2luZm8ua2VlcF9oYXNoLCBidWYsIHRydWUsIHRydWUpCi0JICAgICAgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZvciBpbnNlcnRpb24gZmFpbGVkOiAlRVxuIikpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxpbmtfaW5mby5zdHJpcCAhPSBzdHJpcF9ub25lKQotICAgIGVpbmZvIChfKCIlUDogYC1yZXRhaW4tc3ltYm9scy1maWxlJyBvdmVycmlkZXMgYC1zJyBhbmQgYC1TJ1xuIikpOwotCi0gIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX3NvbWU7Ci19Ci0MCi0vKiBDYWxsYmFja3MgZnJvbSB0aGUgQkZEIGxpbmtlciByb3V0aW5lcy4gICovCi0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gQkZEIGhhcyBkZWNpZGVkIHRvIGluY2x1ZGUgYW4gYXJjaGl2ZSBtZW1iZXIgaW4KLSAgIGEgbGluay4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWFkZF9hcmNoaXZlX2VsZW1lbnQgKGluZm8sIGFiZmQsIG5hbWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaW5wdXQ7Ci0KLSAgaW5wdXQgPSAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikKLQkgICB4bWFsbG9jIChzaXplb2YgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpKSk7Ci0gIGlucHV0LT5maWxlbmFtZSA9IGFiZmQtPmZpbGVuYW1lOwotICBpbnB1dC0+bG9jYWxfc3ltX25hbWUgPSBhYmZkLT5maWxlbmFtZTsKLSAgaW5wdXQtPnRoZV9iZmQgPSBhYmZkOwotICBpbnB1dC0+YXN5bWJvbHMgPSBOVUxMOwotICBpbnB1dC0+bmV4dCA9IE5VTEw7Ci0gIGlucHV0LT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOwotICBpbnB1dC0+bG9hZGVkID0gZmFsc2U7Ci0gIGlucHV0LT5zZWFyY2hfZGlyc19mbGFnID0gZmFsc2U7Ci0KLSAgLyogRklYTUU6IFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3Qgc2V0OiBoZWFkZXIubmV4dCwKLSAgICAgaGVhZGVyLnR5cGUsIGNsb3NlZCwgcGFzc2l2ZV9wb3NpdGlvbiwgc3ltYm9sX2NvdW50LAotICAgICBuZXh0X3JlYWxfZmlsZSwgaXNfYXJjaGl2ZSwgdGFyZ2V0LCByZWFsLiAgVGhpcyBiaXQgb2YgY29kZSBpcwotICAgICBmcm9tIHRoZSBvbGQgZGVjb2RlX2xpYnJhcnlfc3ViZmlsZSBmdW5jdGlvbi4gIEkgZG9uJ3Qga25vdwotICAgICB3aGV0aGVyIGFueSBvZiB0aG9zZSBmaWVsZHMgbWF0dGVycy4gICovCi0KLSAgbGRsYW5nX2FkZF9maWxlIChpbnB1dCk7Ci0KLSAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSAoRklMRSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBib29sZWFuIGhlYWRlcl9wcmludGVkOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmQgKmZyb207Ci0gICAgICBpbnQgbGVuOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCWZyb20gPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoaC0+dHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGZyb20gPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICBmcm9tID0gaC0+dS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLQkgICAgICBmcm9tID0gaC0+dS51bmRlZi5hYmZkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgZnJvbSA9IGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgaGVhZGVyX3ByaW50ZWQpCi0JewotCSAgY2hhciBidWZbMTAwXTsKLQotCSAgc3ByaW50ZiAoYnVmLCAiJS0yOXMgJXNcblxuIiwgXygiQXJjaGl2ZSBtZW1iZXIgaW5jbHVkZWQiKSwKLQkJICAgXygiYmVjYXVzZSBvZiBmaWxlIChzeW1ib2wpIikpOwotCSAgbWluZm8gKCIlcyIsIGJ1Zik7Ci0JICBoZWFkZXJfcHJpbnRlZCA9IHRydWU7Ci0JfQotCi0gICAgICBpZiAoYmZkX215X2FyY2hpdmUgKGFiZmQpID09IE5VTEwpCi0JewotCSAgbWluZm8gKCIlcyIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGxlbiA9IHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtaW5mbyAoIiVzKCVzKSIsIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChhYmZkKSksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBsZW4gPSAoc3RybGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpKQotCQkgKyBzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKQotCQkgKyAyKTsKLQl9Ci0KLSAgICAgIGlmIChsZW4gPj0gMjkpCi0JewotCSAgcHJpbnRfbmwgKCk7Ci0JICBsZW4gPSAwOwotCX0KLSAgICAgIHdoaWxlIChsZW4gPCAzMCkKLQl7Ci0JICBwcmludF9zcGFjZSAoKTsKLQkgICsrbGVuOwotCX0KLQotICAgICAgaWYgKGZyb20gIT0gTlVMTCkKLQltaW5mbyAoIiVCICIsIGZyb20pOwotICAgICAgaWYgKGggIT0gTlVMTCkKLQltaW5mbyAoIiglVClcbiIsIGgtPnJvb3Quc3RyaW5nKTsKLSAgICAgIGVsc2UKLQltaW5mbyAoIiglcylcbiIsIG5hbWUpOwotICAgIH0KLQotICBpZiAodHJhY2VfZmlsZXMgfHwgdHJhY2VfZmlsZV90cmllcykKLSAgICBpbmZvX21zZyAoIiVJXG4iLCBpbnB1dCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gQkZEIGhhcyBkaXNjb3ZlcmVkIGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQKLSAgIG11bHRpcGxlIHRpbWVzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbXVsdGlwbGVfZGVmaW5pdGlvbiAoaW5mbywgbmFtZSwgb2JmZCwgb3NlYywgb3ZhbCwgbmJmZCwgbnNlYywgbnZhbCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlYzsKLSAgICAgYmZkX3ZtYSBvdmFsOwotICAgICBiZmQgKm5iZmQ7Ci0gICAgIGFzZWN0aW9uICpuc2VjOwotICAgICBiZmRfdm1hIG52YWw7Ci17Ci0gIC8qIElmIGVpdGhlciBzZWN0aW9uIGhhcyB0aGUgb3V0cHV0X3NlY3Rpb24gZmllbGQgc2V0IHRvCi0gICAgIGJmZF9hYnNfc2VjdGlvbl9wdHIsIGl0IG1lYW5zIHRoYXQgdGhlIHNlY3Rpb24gaXMgYmVpbmcKLSAgICAgZGlzY2FyZGVkLCBhbmQgdGhpcyBpcyBub3QgcmVhbGx5IGEgbXVsdGlwbGUgZGVmaW5pdGlvbiBhdCBhbGwuCi0gICAgIEZJWE1FOiBJdCB3b3VsZCBiZSBjbGVhbmVyIHRvIHNvbWVob3cgaWdub3JlIHN5bWJvbHMgZGVmaW5lZCBpbgotICAgICBzZWN0aW9ucyB3aGljaCBhcmUgYmVpbmcgZGlzY2FyZGVkLiAgKi8KLSAgaWYgKChvc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKG9zZWMpCi0gICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChvc2VjLT5vdXRwdXRfc2VjdGlvbikpCi0gICAgICB8fCAobnNlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAotCSAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKG5zZWMpCi0JICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKG5zZWMtPm91dHB1dF9zZWN0aW9uKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZWluZm8gKF8oIiVYJUM6IG11bHRpcGxlIGRlZmluaXRpb24gb2YgYCVUJ1xuIiksCi0JIG5iZmQsIG5zZWMsIG52YWwsIG5hbWUpOwotICBpZiAob2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgZWluZm8gKF8oIiVEOiBmaXJzdCBkZWZpbmVkIGhlcmVcbiIpLCBvYmZkLCBvc2VjLCBvdmFsKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSBkZWZpbml0aW9uIG9mIGEgY29tbW9uIHN5bWJvbCwgb3IKLSAgIHdoZW4gYSBjb21tb24gc3ltYm9sIGlzIGZvdW5kIGZvciBhIHN5bWJvbCB0aGF0IGlzIGFscmVhZHkgZGVmaW5lZCwKLSAgIG9yIHdoZW4gdHdvIGNvbW1vbiBzeW1ib2xzIGFyZSBmb3VuZC4gIFdlIG9ubHkgZG8gc29tZXRoaW5nIGlmCi0gICAtd2Fybi1jb21tb24gd2FzIHVzZWQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1tdWx0aXBsZV9jb21tb24gKGluZm8sIG5hbWUsIG9iZmQsIG90eXBlLCBvc2l6ZSwgbmJmZCwgbnR5cGUsIG5zaXplKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG90eXBlOwotICAgICBiZmRfdm1hIG9zaXplOwotICAgICBiZmQgKm5iZmQ7Ci0gICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG50eXBlOwotICAgICBiZmRfdm1hIG5zaXplOwotewotICBpZiAoISBjb25maWcud2Fybl9jb21tb24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKG50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgfHwgbnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0gICAgICB8fCBudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotICAgIHsKLSAgICAgIEFTU0VSVCAob3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOwotICAgICAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBkZWZpbml0aW9uIG9mIGAlVCcgb3ZlcnJpZGluZyBjb21tb25cbiIpLAotCSAgICAgbmJmZCwgbmFtZSk7Ci0gICAgICBpZiAob2JmZCAhPSBOVUxMKQotCWVpbmZvIChfKCIlQjogd2FybmluZzogY29tbW9uIGlzIGhlcmVcbiIpLCBvYmZkKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG90eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IG90eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCSAgIHx8IG90eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0gICAgewotICAgICAgQVNTRVJUIChudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7Ci0gICAgICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IGNvbW1vbiBvZiBgJVQnIG92ZXJyaWRkZW4gYnkgZGVmaW5pdGlvblxuIiksCi0JICAgICBuYmZkLCBuYW1lKTsKLSAgICAgIGlmIChvYmZkICE9IE5VTEwpCi0JZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBkZWZpbmVkIGhlcmVcbiIpLCBvYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBBU1NFUlQgKG90eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uICYmIG50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKLSAgICAgIGlmIChvc2l6ZSA+IG5zaXplKQotCXsKLQkgIGVpbmZvIChfKCIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGRlbiBieSBsYXJnZXIgY29tbW9uXG4iKSwKLQkJIG5iZmQsIG5hbWUpOwotCSAgaWYgKG9iZmQgIT0gTlVMTCkKLQkgICAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBsYXJnZXIgY29tbW9uIGlzIGhlcmVcbiIpLCBvYmZkKTsKLQl9Ci0gICAgICBlbHNlIGlmIChuc2l6ZSA+IG9zaXplKQotCXsKLQkgIGVpbmZvIChfKCIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGluZyBzbWFsbGVyIGNvbW1vblxuIiksCi0JCSBuYmZkLCBuYW1lKTsKLQkgIGlmIChvYmZkICE9IE5VTEwpCi0JICAgIGVpbmZvIChfKCIlQjogd2FybmluZzogc21hbGxlciBjb21tb24gaXMgaGVyZVxuIiksIG9iZmQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IG11bHRpcGxlIGNvbW1vbiBvZiBgJVQnXG4iKSwgbmJmZCwgbmFtZSk7Ci0JICBpZiAob2JmZCAhPSBOVUxMKQotCSAgICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IHByZXZpb3VzIGNvbW1vbiBpcyBoZXJlXG4iKSwgb2JmZCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBCRkQgaGFzIGRpc2NvdmVyZWQgYSBzZXQgZWxlbWVudC4gIEggaXMgdGhlCi0gICBlbnRyeSBpbiB0aGUgbGlua2VyIGhhc2ggdGFibGUgZm9yIHRoZSBzZXQuICBTRUNUSU9OIGFuZCBWQUxVRQotICAgcmVwcmVzZW50IGEgdmFsdWUgd2hpY2ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBzZXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1hZGRfdG9fc2V0IChpbmZvLCBoLCByZWxvYywgYWJmZCwgc2VjdGlvbiwgdmFsdWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGlmIChjb25maWcud2Fybl9jb25zdHJ1Y3RvcnMpCi0gICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBnbG9iYWwgY29uc3RydWN0b3IgJXMgdXNlZFxuIiksCi0JICAgaC0+cm9vdC5zdHJpbmcpOwotCi0gIGlmICghIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbGRjdG9yX2FkZF9zZXRfZW50cnkgKGgsIHJlbG9jLCAoY29uc3QgY2hhciAqKSBOVUxMLCBzZWN0aW9uLCB2YWx1ZSk7Ci0KLSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0gICAgewotICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotICAgICAgaC0+dS51bmRlZi5hYmZkID0gYWJmZDsKLSAgICAgIC8qIFdlIGRvbid0IGNhbGwgYmZkX2xpbmtfYWRkX3VuZGVmIHRvIGFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mCi0JIHVuZGVmaW5lZCBzeW1ib2xzIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGRlZmluZSBpdAotCSBvdXJzZWx2ZXMuICAqLwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBCRkQgaGFzIGRpc2NvdmVyZWQgYSBjb25zdHJ1Y3Rvci4gIFRoaXMgaXMgb25seQotICAgY2FsbGVkIGZvciBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMtLXRob3NlIHdoaWNoIGRvIG5vdCBoYW5kbGUKLSAgIGNvbnN0cnVjdG9ycyBpbiBzb21lIG1vcmUgY2xldmVyIGZhc2hpb24uICBUaGlzIGlzIHNpbWlsYXIgdG8KLSAgIGFkZGluZyBhbiBlbGVtZW50IHRvIGEgc2V0LCBidXQgbGVzcyBnZW5lcmFsLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvbnN0cnVjdG9yX2NhbGxiYWNrIChpbmZvLCBjb25zdHJ1Y3RvciwgbmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuIGNvbnN0cnVjdG9yOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBjaGFyICpzOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgY2hhciBzZXRfbmFtZVsxICsgc2l6ZW9mICJfX0NUT1JfTElTVF9fIl07Ci0KLSAgaWYgKGNvbmZpZy53YXJuX2NvbnN0cnVjdG9ycykKLSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IGdsb2JhbCBjb25zdHJ1Y3RvciAlcyB1c2VkXG4iKSwgbmFtZSk7Ci0KLSAgaWYgKCEgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBFbnN1cmUgdGhhdCBCRkRfUkVMT0NfQ1RPUiBleGlzdHMgbm93LCBzbyB0aGF0IHdlIGNhbiBnaXZlIGEKLSAgICAgdXNlZnVsIGVycm9yIG1lc3NhZ2UuICAqLwotICBpZiAoYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBCRkRfUkVMT0NfQ1RPUikgPT0gTlVMTAotICAgICAgJiYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLQkgIHx8IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DX0NUT1IpID09IE5VTEwpKQotICAgIGVpbmZvIChfKCIlUCVGOiBCRkQgYmFja2VuZCBlcnJvcjogQkZEX1JFTE9DX0NUT1IgdW5zdXBwb3J0ZWRcbiIpKTsKLQotICBzID0gc2V0X25hbWU7Ci0gIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpICE9ICdcMCcpCi0gICAgKnMrKyA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCk7Ci0gIGlmIChjb25zdHJ1Y3RvcikKLSAgICBzdHJjcHkgKHMsICJfX0NUT1JfTElTVF9fIik7Ci0gIGVsc2UKLSAgICBzdHJjcHkgKHMsICJfX0RUT1JfTElTVF9fIik7Ci0KLSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBzZXRfbmFtZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0gIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotICAgIHsKLSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLSAgICAgIGgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0gICAgICAvKiBXZSBkb24ndCBjYWxsIGJmZF9saW5rX2FkZF91bmRlZiB0byBhZGQgdGhpcyB0byB0aGUgbGlzdCBvZgotCSB1bmRlZmluZWQgc3ltYm9scyBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBkZWZpbmUgaXQKLQkgb3Vyc2VsdmVzLiAgKi8KLSAgICB9Ci0KLSAgbGRjdG9yX2FkZF9zZXRfZW50cnkgKGgsIEJGRF9SRUxPQ19DVE9SLCBuYW1lLCBzZWN0aW9uLCB2YWx1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBIHN0cnVjdHVyZSB1c2VkIGJ5IHdhcm5pbmdfY2FsbGJhY2sgdG8gcGFzcyBpbmZvcm1hdGlvbiB0aHJvdWdoCi0gICBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi1zdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvCi17Ci0gIGJvb2xlYW4gZm91bmQ7Ci0gIGNvbnN0IGNoYXIgKndhcm5pbmc7Ci0gIGNvbnN0IGNoYXIgKnN5bWJvbDsKLSAgYXN5bWJvbCAqKmFzeW1ib2xzOwotfTsKLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byBhIHdhcm5pbmcgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotd2FybmluZ19jYWxsYmFjayAoaW5mbywgd2FybmluZywgc3ltYm9sLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICp3YXJuaW5nOwotICAgICBjb25zdCBjaGFyICpzeW1ib2w7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgLyogVGhpcyBpcyBhIGhhY2sgdG8gc3VwcG9ydCB3YXJuX211bHRpcGxlX2dwLiAgRklYTUU6IFRoaXMgc2hvdWxkCi0gICAgIGhhdmUgYSBjbGVhbmVyIGludGVyZmFjZSwgYnV0IHdoYXQ/ICAqLwotICBpZiAoISBjb25maWcud2Fybl9tdWx0aXBsZV9ncAotICAgICAgJiYgc3RyY21wICh3YXJuaW5nLCAidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoc2VjdGlvbiAhPSBOVUxMKQotICAgIGVpbmZvICgiJUM6ICVzXG4iLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzLCB3YXJuaW5nKTsKLSAgZWxzZSBpZiAoYWJmZCA9PSBOVUxMKQotICAgIGVpbmZvICgiJVA6ICVzXG4iLCB3YXJuaW5nKTsKLSAgZWxzZSBpZiAoc3ltYm9sID09IE5VTEwpCi0gICAgZWluZm8gKCIlQjogJXNcbiIsIGFiZmQsIHdhcm5pbmcpOwotICBlbHNlCi0gICAgewotICAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci0gICAgICBhc3ltYm9sICoqYXN5bWJvbHM7Ci0gICAgICBzdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvIGluZm87Ci0KLSAgICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBhIHBsYXVzaWJsZQotCSBhZGRyZXNzLiAgKi8KLQotICAgICAgZW50cnkgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBhYmZkLT51c3JkYXRhOwotICAgICAgaWYgKGVudHJ5ICE9IE5VTEwgJiYgZW50cnktPmFzeW1ib2xzICE9IE5VTEwpCi0JYXN5bWJvbHMgPSBlbnRyeS0+YXN5bWJvbHM7Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBzeW1zaXplOwotCSAgbG9uZyBzeW1ib2xfY291bnQ7Ci0KLQkgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0JICBpZiAoc3ltc2l6ZSA8IDApCi0JICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiksIGFiZmQpOwotCSAgYXN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7Ci0JICBzeW1ib2xfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgYXN5bWJvbHMpOwotCSAgaWYgKHN5bWJvbF9jb3VudCA8IDApCi0JICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiksIGFiZmQpOwotCSAgaWYgKGVudHJ5ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBlbnRyeS0+YXN5bWJvbHMgPSBhc3ltYm9sczsKLQkgICAgICBlbnRyeS0+c3ltYm9sX2NvdW50ID0gc3ltYm9sX2NvdW50OwotCSAgICB9Ci0JfQotCi0gICAgICBpbmZvLmZvdW5kID0gZmFsc2U7Ci0gICAgICBpbmZvLndhcm5pbmcgPSB3YXJuaW5nOwotICAgICAgaW5mby5zeW1ib2wgPSBzeW1ib2w7Ci0gICAgICBpbmZvLmFzeW1ib2xzID0gYXN5bWJvbHM7Ci0gICAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIHdhcm5pbmdfZmluZF9yZWxvYywgKFBUUikgJmluZm8pOwotCi0gICAgICBpZiAoISBpbmZvLmZvdW5kKQotCWVpbmZvICgiJUI6ICVzXG4iLCBhYmZkLCB3YXJuaW5nKTsKLQotICAgICAgaWYgKGVudHJ5ID09IE5VTEwpCi0JZnJlZSAoYXN5bWJvbHMpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgd2FybmluZ19jYWxsYmFjayBmb3IgZWFjaCBzZWN0aW9uLiAgSXQgY2hlY2tzIHRoZQotICAgcmVsb2NzIG9mIHRoZSBzZWN0aW9uIHRvIHNlZSBpZiBpdCBjYW4gZmluZCBhIHJlZmVyZW5jZSB0byB0aGUKLSAgIHN5bWJvbCB3aGljaCB0cmlnZ2VyZWQgdGhlIHdhcm5pbmcuICBJZiBpdCBjYW4sIGl0IHVzZXMgdGhlIHJlbG9jCi0gICB0byBnaXZlIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCBhIGZpbGUgYW5kIGxpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXdhcm5pbmdfZmluZF9yZWxvYyAoYWJmZCwgc2VjLCBpYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBpYXJnOwotewotICBzdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvICppbmZvID0gKHN0cnVjdCB3YXJuaW5nX2NhbGxiYWNrX2luZm8gKikgaWFyZzsKLSAgbG9uZyByZWxzaXplOwotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQ7Ci0gIGFyZWxlbnQgKipwLCAqKnBlbmQ7Ci0KLSAgaWYgKGluZm8tPmZvdW5kKQotICAgIHJldHVybjsKLQotICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjKTsKLSAgaWYgKHJlbHNpemUgPCAwKQotICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCByZWxvY3M6ICVFXG4iKSwgYWJmZCk7Ci0gIGlmIChyZWxzaXplID09IDApCi0gICAgcmV0dXJuOwotCi0gIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlYywgcmVscHAsIGluZm8tPmFzeW1ib2xzKTsKLSAgaWYgKHJlbGNvdW50IDwgMCkKLSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIiksIGFiZmQpOwotCi0gIHAgPSByZWxwcDsKLSAgcGVuZCA9IHAgKyByZWxjb3VudDsKLSAgZm9yICg7IHAgPCBwZW5kICYmICpwICE9IE5VTEw7IHArKykKLSAgICB7Ci0gICAgICBhcmVsZW50ICpxID0gKnA7Ci0KLSAgICAgIGlmIChxLT5zeW1fcHRyX3B0ciAhPSBOVUxMCi0JICAmJiAqcS0+c3ltX3B0cl9wdHIgIT0gTlVMTAotCSAgJiYgc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lICgqcS0+c3ltX3B0cl9wdHIpLCBpbmZvLT5zeW1ib2wpID09IDApCi0JewotCSAgLyogV2UgZm91bmQgYSByZWxvYyBmb3IgdGhlIHN5bWJvbCB3ZSBhcmUgbG9va2luZyBmb3IuICAqLwotCSAgZWluZm8gKCIlQzogJXNcbiIsIGFiZmQsIHNlYywgcS0+YWRkcmVzcywgaW5mby0+d2FybmluZyk7Ci0JICBpbmZvLT5mb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKHJlbHBwKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhbiB1bmRlZmluZWQgc3ltYm9sIGlzIGZvdW5kLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotdW5kZWZpbmVkX3N5bWJvbCAoaW5mbywgbmFtZSwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBzdGF0aWMgY2hhciAqZXJyb3JfbmFtZTsKLSAgc3RhdGljIHVuc2lnbmVkIGludCBlcnJvcl9jb3VudDsKLQotI2RlZmluZSBNQVhfRVJST1JTX0lOX0FfUk9XIDUKLQotICBpZiAoY29uZmlnLndhcm5fb25jZSkKLSAgICB7Ci0gICAgICBzdGF0aWMgc3RydWN0IGJmZF9oYXNoX3RhYmxlICpoYXNoOwotCi0gICAgICAvKiBPbmx5IHdhcm4gb25jZSBhYm91dCBhIHBhcnRpY3VsYXIgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0KLSAgICAgIGlmIChoYXNoID09IE5VTEwpCi0JewotCSAgaGFzaCA9ICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopCi0JCSAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpKSk7Ci0JICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0IChoYXNoLCBiZmRfaGFzaF9uZXdmdW5jKSkKLQkgICAgZWluZm8gKF8oIiVGJVA6IGJmZF9oYXNoX3RhYmxlX2luaXQgZmFpbGVkOiAlRVxuIikpOwotCX0KLQotICAgICAgaWYgKGJmZF9oYXNoX2xvb2t1cCAoaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKQotCXJldHVybiB0cnVlOwotCi0gICAgICBpZiAoYmZkX2hhc2hfbG9va3VwIChoYXNoLCBuYW1lLCB0cnVlLCB0cnVlKSA9PSBOVUxMKQotCWVpbmZvIChfKCIlRiVQOiBiZmRfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotICAgIH0KLQotICAvKiBXZSBuZXZlciBwcmludCBtb3JlIHRoYW4gYSByZWFzb25hYmxlIG51bWJlciBvZiBlcnJvcnMgaW4gYSByb3cKLSAgICAgZm9yIGEgc2luZ2xlIHN5bWJvbC4gICovCi0gIGlmIChlcnJvcl9uYW1lICE9IChjaGFyICopIE5VTEwKLSAgICAgICYmIHN0cmNtcCAobmFtZSwgZXJyb3JfbmFtZSkgPT0gMCkKLSAgICArK2Vycm9yX2NvdW50OwotICBlbHNlCi0gICAgewotICAgICAgZXJyb3JfY291bnQgPSAwOwotICAgICAgaWYgKGVycm9yX25hbWUgIT0gKGNoYXIgKikgTlVMTCkKLQlmcmVlIChlcnJvcl9uYW1lKTsKLSAgICAgIGVycm9yX25hbWUgPSBidXlzdHJpbmcgKG5hbWUpOwotICAgIH0KLQotICBpZiAoc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChlcnJvcl9jb3VudCA8IE1BWF9FUlJPUlNfSU5fQV9ST1cpCi0JZWluZm8gKF8oIiVYJUM6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYCVUJ1xuIiksCi0JICAgICAgIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MsIG5hbWUpOwotICAgICAgZWxzZSBpZiAoZXJyb3JfY291bnQgPT0gTUFYX0VSUk9SU19JTl9BX1JPVykKLQllaW5mbyAoXygiJUQ6IG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gYCVUJyBmb2xsb3dcbiIpLAotCSAgICAgICBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzLCBuYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JfY291bnQgPCBNQVhfRVJST1JTX0lOX0FfUk9XKQotCWVpbmZvIChfKCIlWCVCOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGAlVCdcbiIpLAotCSAgICAgICBhYmZkLCBuYW1lKTsKLSAgICAgIGVsc2UgaWYgKGVycm9yX2NvdW50ID09IE1BWF9FUlJPUlNfSU5fQV9ST1cpCi0JZWluZm8gKF8oIiVCOiBtb3JlIHVuZGVmaW5lZCByZWZlcmVuY2VzIHRvIGAlVCcgZm9sbG93XG4iKSwKLQkgICAgICAgYWJmZCwgbmFtZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgcmVsb2Mgb3ZlcmZsb3dzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcmVsb2Nfb3ZlcmZsb3cgKGluZm8sIG5hbWUsIHJlbG9jX25hbWUsIGFkZGVuZCwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcmVsb2NfbmFtZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgaWYgKGFiZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVYOiBnZW5lcmF0ZWQiKSk7Ci0gIGVsc2UKLSAgICBlaW5mbyAoIiVYJUM6IiwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcyk7Ci0gIGVpbmZvIChfKCIgcmVsb2NhdGlvbiB0cnVuY2F0ZWQgdG8gZml0OiAlcyAlVCIpLCByZWxvY19uYW1lLCBuYW1lKTsKLSAgaWYgKGFkZGVuZCAhPSAwKQotICAgIGVpbmZvICgiKyV2IiwgYWRkZW5kKTsKLSAgZWluZm8gKCJcbiIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGRhbmdlcm91cyByZWxvY2F0aW9uIGlzIG1hZGUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1yZWxvY19kYW5nZXJvdXMgKGluZm8sIG1lc3NhZ2UsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgaWYgKGFiZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVYOiBnZW5lcmF0ZWQiKSk7Ci0gIGVsc2UKLSAgICBlaW5mbyAoIiVYJUM6IiwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcyk7Ci0gIGVpbmZvIChfKCJkYW5nZXJvdXMgcmVsb2NhdGlvbjogJXNcbiIpLCBtZXNzYWdlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSByZWxvYyBpcyBiZWluZyBnZW5lcmF0ZWQgYXR0YWNoZWQgdG8gYSBzeW1ib2wKLSAgIHRoYXQgaXMgbm90IGJlaW5nIG91dHB1dC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXVuYXR0YWNoZWRfcmVsb2MgKGluZm8sIG5hbWUsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgaWYgKGFiZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVYOiBnZW5lcmF0ZWQiKSk7Ci0gIGVsc2UKLSAgICBlaW5mbyAoIiVYJUM6IiwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcyk7Ci0gIGVpbmZvIChfKCIgcmVsb2MgcmVmZXJzIHRvIHN5bWJvbCBgJVQnIHdoaWNoIGlzIG5vdCBiZWluZyBvdXRwdXRcbiIpLCBuYW1lKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGlmIGxpbmtfaW5mby5ub3RpY2VfYWxsIGlzIHNldCwgb3Igd2hlbiBhIHN5bWJvbCBpbgotICAgbGlua19pbmZvLm5vdGljZV9oYXNoIGlzIGZvdW5kLiAgU3ltYm9scyBhcmUgcHV0IGluIG5vdGljZV9oYXNoCi0gICB1c2luZyB0aGUgLXkgb3B0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5vdGljZSAoaW5mbywgbmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBpZiAoISBpbmZvLT5ub3RpY2VfYWxsCi0gICAgICB8fCAoaW5mby0+bm90aWNlX2hhc2ggIT0gTlVMTAotCSAgJiYgYmZkX2hhc2hfbG9va3VwIChpbmZvLT5ub3RpY2VfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLQllaW5mbyAoIiVCOiByZWZlcmVuY2UgdG8gJXNcbiIsIGFiZmQsIG5hbWUpOwotICAgICAgZWxzZQotCWVpbmZvICgiJUI6IGRlZmluaXRpb24gb2YgJXNcbiIsIGFiZmQsIG5hbWUpOwotICAgIH0KLQotICBpZiAoY29tbWFuZF9saW5lLmNyZWYgfHwgbm9jcm9zc3JlZl9saXN0ICE9IE5VTEwpCi0gICAgYWRkX2NyZWYgKG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkbWFpbi5oIGIvbGQvbGRtYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWJmM2QuLjAwMDAwMDAKLS0tIGEvbGQvbGRtYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBsZG1haW4uaCAtCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExETUFJTl9ICi0jZGVmaW5lIExETUFJTl9ICi0KLWV4dGVybiBjaGFyICpwcm9ncmFtX25hbWU7Ci1leHRlcm4gYmZkICpvdXRwdXRfYmZkOwotZXh0ZXJuIGNoYXIgKmRlZmF1bHRfdGFyZ2V0OwotZXh0ZXJuIGJvb2xlYW4gdHJhY2VfZmlsZXM7Ci1leHRlcm4gYm9vbGVhbiB0cmFjZV9maWxlX3RyaWVzOwotZXh0ZXJuIGJvb2xlYW4gdmVyc2lvbl9wcmludGVkOwotZXh0ZXJuIGJvb2xlYW4gd2hvbGVfYXJjaGl2ZTsKLWV4dGVybiBib29sZWFuIGRlbWFuZ2xpbmc7Ci1leHRlcm4gaW50IGdfc3dpdGNoX3ZhbHVlOwotZXh0ZXJuIGNvbnN0IGNoYXIgKm91dHB1dF9maWxlbmFtZTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyBsaW5rX2luZm87Ci0KLWV4dGVybiB2b2lkIGFkZF95c3ltIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgYWRkX3dyYXAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBhZGRfa2VlcHN5bXNfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkbWlzYy5jIGIvbGQvbGRtaXNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2N2RmZjEuLjAwMDAwMDAKLS0tIGEvbGQvbGRtaXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotLyogbGRtaXNjLmMKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlbWFuZ2xlLmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNkZWZpbmUgVVNFX1NUREFSRyAxCi0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNkZWZpbmUgVVNFX1NUREFSRyAwCi0jZW5kaWYKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotCi1zdGF0aWMgdm9pZCB2ZmluZm8gUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLQotLyoKLSAlJSBsaXRlcmFsICUKLSAlRiBlcnJvciBpcyBmYXRhbAotICVQIHByaW50IHByb2dyYW0gbmFtZQotICVTIHByaW50IHNjcmlwdCBmaWxlIGFuZCBsaW5lbnVtYmVyCi0gJUUgY3VycmVudCBiZmQgZXJyb3Igb3IgZXJybm8KLSAlSSBmaWxlbmFtZSBmcm9tIGEgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZQotICVCIGZpbGVuYW1lIGZyb20gYSBiZmQKLSAlVCBzeW1ib2wgbmFtZQotICVYIG5vIG9iamVjdCBvdXRwdXQsIGZhaWwgcmV0dXJuCi0gJVYgaGV4IGJmZF92bWEKLSAldiBoZXggYmZkX3ZtYSwgbm8gbGVhZGluZyB6ZXJvcwotICVXIGhleCBiZmRfdm1hIHdpdGggMHggd2l0aCBubyBsZWFkaW5nIHplcm9zIHRha2luZyB1cCA4IHNwYWNlcwotICVDIGNsZXZlciBmaWxlbmFtZTpsaW5lbnVtYmVyIHdpdGggZnVuY3Rpb24KLSAlRCBsaWtlICVDLCBidXQgbm8gZnVuY3Rpb24gbmFtZQotICVHIGxpa2UgJUQsIGJ1dCBvbmx5IGZ1bmN0aW9uIG5hbWUKLSAlUiBpbmZvIGFib3V0IGEgcmVsZW50Ci0gJXMgYXJiaXRyYXJ5IHN0cmluZywgbGlrZSBwcmludGYKLSAlZCBpbnRlZ2VyLCBsaWtlIHByaW50ZgotICV1IGludGVnZXIsIGxpa2UgcHJpbnRmCi0qLwotCi1jaGFyICoKLWRlbWFuZ2xlIChzdHJpbmcpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgY2hhciAqcmVzOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwKLSAgICAgICYmIGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob3V0cHV0X2JmZCkgPT0gc3RyaW5nWzBdKQotICAgICsrc3RyaW5nOwotCi0gIC8qIFRoaXMgaXMgYSBoYWNrIGZvciBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIG9uIFhDT0ZGLCBvciB0aGUgTVMgUEUgICAqLwotICAvKiBmb3JtYXQuICBYY29mZiBoYXMgYSBzaW5nbGUgJy4nLCB3aGlsZSB0aGUgTlQgUEUgZm9yIFBQQyBoYXMgJy4uJy4gKi8KLSAgLyogU28gd2UgcmVtb3ZlIGFsbCBvZiB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHdoaWxlKHN0cmluZ1swXSA9PSAnLicpCi0gICAgKytzdHJpbmc7Ci0KLSAgcmVzID0gY3BsdXNfZGVtYW5nbGUgKHN0cmluZywgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotICByZXR1cm4gcmVzID8gcmVzIDogeHN0cmR1cCAoc3RyaW5nKTsKLX0KLQotc3RhdGljIHZvaWQKLXZmaW5mbyAoZnAsIGZtdCwgYXJnKQotICAgICBGSUxFICpmcDsKLSAgICAgY29uc3QgY2hhciAqZm10OwotICAgICB2YV9saXN0IGFyZzsKLXsKLSAgYm9vbGVhbiBmYXRhbCA9IGZhbHNlOwotCi0gIHdoaWxlICgqZm10ICE9ICdcMCcpCi0gICAgewotICAgICAgd2hpbGUgKCpmbXQgIT0gJyUnICYmICpmbXQgIT0gJ1wwJykgCi0JewotCSAgcHV0YyAoKmZtdCwgZnApOwotCSAgZm10Kys7Ci0JfQotCi0gICAgICBpZiAoKmZtdCA9PSAnJScpIAotCXsKLQkgIGZtdCArKzsKLQkgIHN3aXRjaCAoKmZtdCsrKSAKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYgKGZwLCIlJSVjIiwgZm10Wy0xXSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnJSc6Ci0JICAgICAgLyogbGl0ZXJhbCAlICovCi0JICAgICAgcHV0YyAoJyUnLCBmcCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnWCc6Ci0JICAgICAgLyogbm8gb2JqZWN0IG91dHB1dCwgZmFpbCByZXR1cm4gKi8KLQkgICAgICBjb25maWcubWFrZV9leGVjdXRhYmxlID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnVic6Ci0JICAgICAgLyogaGV4IGJmZF92bWEgKi8KLQkgICAgICB7Ci0JCWJmZF92bWEgdmFsdWUgPSB2YV9hcmcgKGFyZywgYmZkX3ZtYSk7Ci0JCWZwcmludGZfdm1hIChmcCwgdmFsdWUpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd2JzoKLQkgICAgICAvKiBoZXggYmZkX3ZtYSwgbm8gbGVhZGluZyB6ZXJvcyAqLwotCSAgICAgIHsKLQkJY2hhciBidWZbMTAwXTsKLQkJY2hhciAqcCA9IGJ1ZjsKLQkJYmZkX3ZtYSB2YWx1ZSA9IHZhX2FyZyAoYXJnLCBiZmRfdm1hKTsKLQkJc3ByaW50Zl92bWEgKHAsIHZhbHVlKTsKLQkJd2hpbGUgKCpwID09ICcwJykKLQkJICBwKys7Ci0JCWlmICghKnApCi0JCSAgcC0tOwotCQlmcHV0cyAocCwgZnApOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdXJzoKLQkgICAgICAvKiBoZXggYmZkX3ZtYSB3aXRoIDB4IHdpdGggbm8gbGVhZGluZyB6ZXJvZXMgdGFraW5nIHVwCi0gICAgICAgICAgICAgICAgIDggc3BhY2VzLiAgKi8KLQkgICAgICB7Ci0JCWNoYXIgYnVmWzEwMF07Ci0JCWJmZF92bWEgdmFsdWU7Ci0JCWNoYXIgKnA7Ci0JCWludCBsZW47Ci0KLQkJdmFsdWUgPSB2YV9hcmcgKGFyZywgYmZkX3ZtYSk7Ci0JCXNwcmludGZfdm1hIChidWYsIHZhbHVlKTsKLQkJZm9yIChwID0gYnVmOyAqcCA9PSAnMCc7ICsrcCkKLQkJICA7Ci0JCWlmICgqcCA9PSAnXDAnKQotCQkgIC0tcDsKLQkJbGVuID0gc3RybGVuIChwKTsKLQkJd2hpbGUgKGxlbiA8IDgpCi0JCSAgewotCQkgICAgcHV0YyAoJyAnLCBmcCk7Ci0JCSAgICArK2xlbjsKLQkJICB9Ci0JCWZwcmludGYgKGZwLCAiMHglcyIsIHApOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdUJzoKLQkgICAgICAvKiBTeW1ib2wgbmFtZS4gICovCi0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lID0gdmFfYXJnIChhcmcsIGNvbnN0IGNoYXIgKik7Ci0KLQkJaWYgKG5hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCB8fCAqbmFtZSA9PSAwKQotCQkgIGZwcmludGYgKGZwLCBfKCJubyBzeW1ib2wiKSk7Ci0JCWVsc2UgaWYgKCEgZGVtYW5nbGluZykKLQkJICBmcHJpbnRmIChmcCwgIiVzIiwgbmFtZSk7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBjaGFyICpkZW1hbmdsZWQ7Ci0KLQkJICAgIGRlbWFuZ2xlZCA9IGRlbWFuZ2xlIChuYW1lKTsKLQkJICAgIGZwcmludGYgKGZwLCAiJXMiLCBkZW1hbmdsZWQpOwotCQkgICAgZnJlZSAoZGVtYW5nbGVkKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0InOgotCSAgICAgIC8qIGZpbGVuYW1lIGZyb20gYSBiZmQgKi8KLQkgICAgICB7IAotCQliZmQgKmFiZmQgPSB2YV9hcmcgKGFyZywgYmZkICopOwotCQlpZiAoYWJmZC0+bXlfYXJjaGl2ZSkKLQkJICBmcHJpbnRmIChmcCwgIiVzKCVzKSIsIGFiZmQtPm15X2FyY2hpdmUtPmZpbGVuYW1lLAotCQkJICAgYWJmZC0+ZmlsZW5hbWUpOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZnAsICIlcyIsIGFiZmQtPmZpbGVuYW1lKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnRic6Ci0JICAgICAgLyogZXJyb3IgaXMgZmF0YWwgKi8KLQkgICAgICBmYXRhbCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUCc6Ci0JICAgICAgLyogcHJpbnQgcHJvZ3JhbSBuYW1lICovCi0JICAgICAgZnByaW50ZiAoZnAsICIlcyIsIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnRSc6Ci0JICAgICAgLyogY3VycmVudCBiZmQgZXJyb3Igb3IgZXJybm8gKi8KLQkgICAgICBmcHJpbnRmIChmcCwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0knOgotCSAgICAgIC8qIGZpbGVuYW1lIGZyb20gYSBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICovCi0JICAgICAgewotCQlsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppOwotCi0JCWkgPSB2YV9hcmcgKGFyZywgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKTsKLQkJaWYgKGJmZF9teV9hcmNoaXZlIChpLT50aGVfYmZkKSAhPSBOVUxMKQotCQkgIGZwcmludGYgKGZwLCAiKCVzKSIsCi0JCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoaS0+dGhlX2JmZCkpKTsKLQkJZnByaW50ZiAoZnAsICIlcyIsIGktPmxvY2FsX3N5bV9uYW1lKTsKLQkJaWYgKGJmZF9teV9hcmNoaXZlIChpLT50aGVfYmZkKSA9PSBOVUxMCi0JCSAgICAmJiBzdHJjbXAgKGktPmxvY2FsX3N5bV9uYW1lLCBpLT5maWxlbmFtZSkgIT0gMCkKLQkJICBmcHJpbnRmIChmcCwgIiAoJXMpIiwgaS0+ZmlsZW5hbWUpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdTJzoKLQkgICAgICAvKiBwcmludCBzY3JpcHQgZmlsZSBhbmQgbGluZW51bWJlciAqLwotCSAgICAgIGlmIChwYXJzaW5nX2RlZnN5bSkKLQkJZnByaW50ZiAoZnAsICItLWRlZnN5bSAlcyIsIGxleF9zdHJpbmcpOwotCSAgICAgIGVsc2UgaWYgKGxkZmlsZV9pbnB1dF9maWxlbmFtZSAhPSBOVUxMKQotCQlmcHJpbnRmIChmcCwgIiVzOiV1IiwgbGRmaWxlX2lucHV0X2ZpbGVuYW1lLCBsaW5lbm8pOwotCSAgICAgIGVsc2UKLQkJZnByaW50ZiAoZnAsIF8oImJ1aWx0IGluIGxpbmtlciBzY3JpcHQ6JXUiKSwgbGluZW5vKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdSJzoKLQkgICAgICAvKiBQcmludCBhbGwgdGhhdCdzIGludGVyZXN0aW5nIGFib3V0IGEgcmVsZW50ICovCi0JICAgICAgewotCQlhcmVsZW50ICpyZWxlbnQgPSB2YV9hcmcgKGFyZywgYXJlbGVudCAqKTsKLQkKLQkJbGZpbmZvIChmcCwgIiVzKzB4JXYgKHR5cGUgJXMpIiwKLQkJCSgqKHJlbGVudC0+c3ltX3B0cl9wdHIpKS0+bmFtZSwKLQkJCXJlbGVudC0+YWRkZW5kLAotCQkJcmVsZW50LT5ob3d0by0+bmFtZSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCQotCSAgICBjYXNlICdDJzoKLQkgICAgY2FzZSAnRCc6Ci0JICAgIGNhc2UgJ0cnOgotCSAgICAgIC8qIENsZXZlciBmaWxlbmFtZTpsaW5lbnVtYmVyIHdpdGggZnVuY3Rpb24gbmFtZSBpZiBwb3NzaWJsZSwKLQkJIG9yIHNlY3Rpb24gbmFtZSBhcyBhIGxhc3QgcmVzb3J0LiAgVGhlIGFyZ3VtZW50cyBhcmUgYSBCRkQsCi0JCSBhIHNlY3Rpb24sIGFuZCBhbiBvZmZzZXQuICAqLwotCSAgICAgIHsKLQkJc3RhdGljIGJmZCAqbGFzdF9iZmQ7Ci0JCXN0YXRpYyBjaGFyICpsYXN0X2ZpbGUgPSBOVUxMOwotCQlzdGF0aWMgY2hhciAqbGFzdF9mdW5jdGlvbiA9IE5VTEw7Ci0JCWJmZCAqYWJmZDsKLQkJYXNlY3Rpb24gKnNlY3Rpb247Ci0JCWJmZF92bWEgb2Zmc2V0OwotCQlsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLQkJYXN5bWJvbCAqKmFzeW1ib2xzOwotCQljb25zdCBjaGFyICpmaWxlbmFtZTsKLQkJY29uc3QgY2hhciAqZnVuY3Rpb25uYW1lOwotCQl1bnNpZ25lZCBpbnQgbGluZW51bWJlcjsKLQkJYm9vbGVhbiBkaXNjYXJkX2xhc3Q7Ci0KLQkJYWJmZCA9IHZhX2FyZyAoYXJnLCBiZmQgKik7Ci0JCXNlY3Rpb24gPSB2YV9hcmcgKGFyZywgYXNlY3Rpb24gKik7Ci0JCW9mZnNldCA9IHZhX2FyZyAoYXJnLCBiZmRfdm1hKTsKLQotCQllbnRyeSA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGFiZmQtPnVzcmRhdGE7Ci0JCWlmIChlbnRyeSAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMCi0JCSAgICAmJiBlbnRyeS0+YXN5bWJvbHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpCi0JCSAgYXN5bWJvbHMgPSBlbnRyeS0+YXN5bWJvbHM7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBsb25nIHN5bXNpemU7Ci0JCSAgICBsb25nIHN5bWJvbF9jb3VudDsKLQotCQkgICAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLQkJICAgIGlmIChzeW1zaXplIDwgMCkKLQkJICAgICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHNcbiIpLCBhYmZkKTsKLQkJICAgIGFzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCQkgICAgc3ltYm9sX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIGFzeW1ib2xzKTsKLQkJICAgIGlmIChzeW1ib2xfY291bnQgPCAwKQotCQkgICAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sc1xuIiksIGFiZmQpOwotCQkgICAgaWYgKGVudHJ5ICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEwpCi0JCSAgICAgIHsKLQkJCWVudHJ5LT5hc3ltYm9scyA9IGFzeW1ib2xzOwotCQkJZW50cnktPnN5bWJvbF9jb3VudCA9IHN5bWJvbF9jb3VudDsKLQkJICAgICAgfQotCQkgIH0KLQotCQlkaXNjYXJkX2xhc3QgPSB0cnVlOwotCQlpZiAoYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBhc3ltYm9scywgb2Zmc2V0LAotCQkJCQkgICAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsCi0JCQkJCSAgICZsaW5lbnVtYmVyKSkKLQkJICB7Ci0JCSAgICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwgJiYgZm10Wy0xXSA9PSAnRycpCi0JCSAgICAgIHsKLQkJCWxmaW5mbyAoZnAsICIlQjoiLCBhYmZkKTsKLQkJCWlmIChmaWxlbmFtZSAhPSBOVUxMCi0JCQkgICAgJiYgc3RyY21wIChmaWxlbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpICE9IDApCi0JCQkgIGZwcmludGYgKGZwLCAiJXM6IiwgZmlsZW5hbWUpOwotCQkJbGZpbmZvIChmcCwgIiVUIiwgZnVuY3Rpb25uYW1lKTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwgJiYgZm10Wy0xXSA9PSAnQycpCi0JCSAgICAgIHsKLQkJCWlmIChmaWxlbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotCQkJICBmaWxlbmFtZSA9IGFiZmQtPmZpbGVuYW1lOwotCi0JCQlpZiAobGFzdF9iZmQgPT0gTlVMTAotCQkJICAgIHx8IGxhc3RfZmlsZSA9PSBOVUxMCi0JCQkgICAgfHwgbGFzdF9mdW5jdGlvbiA9PSBOVUxMCi0JCQkgICAgfHwgbGFzdF9iZmQgIT0gYWJmZAotCQkJICAgIHx8IHN0cmNtcCAobGFzdF9maWxlLCBmaWxlbmFtZSkgIT0gMAotCQkJICAgIHx8IHN0cmNtcCAobGFzdF9mdW5jdGlvbiwgZnVuY3Rpb25uYW1lKSAhPSAwKQotCQkJICB7Ci0JCQkgICAgLyogV2UgdXNlIGFiZmQtPmZpbGVuYW1lIGluIHRoaXMgaW5pdGlhbCBsaW5lLAotCQkJICAgICAgIGluIGNhc2UgZmlsZW5hbWUgaXMgYSAuaCBmaWxlIG9yIHNvbWV0aGluZwotCQkJICAgICAgIHNpbWlsYXJseSB1bmhlbHBmdWwuICAqLwotCQkJICAgIGxmaW5mbyAoZnAsIF8oIiVCOiBJbiBmdW5jdGlvbiBgJVQnOlxuIiksCi0JCQkJICAgIGFiZmQsIGZ1bmN0aW9ubmFtZSk7Ci0KLQkJCSAgICBsYXN0X2JmZCA9IGFiZmQ7Ci0JCQkgICAgaWYgKGxhc3RfZmlsZSAhPSBOVUxMKQotCQkJICAgICAgZnJlZSAobGFzdF9maWxlKTsKLQkJCSAgICBsYXN0X2ZpbGUgPSBidXlzdHJpbmcgKGZpbGVuYW1lKTsKLQkJCSAgICBpZiAobGFzdF9mdW5jdGlvbiAhPSBOVUxMKQotCQkJICAgICAgZnJlZSAobGFzdF9mdW5jdGlvbik7Ci0JCQkgICAgbGFzdF9mdW5jdGlvbiA9IGJ1eXN0cmluZyAoZnVuY3Rpb25uYW1lKTsKLQkJCSAgfQotCQkJZGlzY2FyZF9sYXN0ID0gZmFsc2U7Ci0JCQlpZiAobGluZW51bWJlciAhPSAwKQotCQkJICBmcHJpbnRmIChmcCwgIiVzOiV1IiwgZmlsZW5hbWUsIGxpbmVudW1iZXIpOwotCQkJZWxzZQotCQkJICBsZmluZm8gKGZwLCAiJXMoJXMrMHgldikiLCBmaWxlbmFtZSwgc2VjdGlvbi0+bmFtZSwKLQkJCQkgIG9mZnNldCk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKGZpbGVuYW1lID09IE5VTEwKLQkJCSAgICAgfHwgc3RyY21wIChmaWxlbmFtZSwgYWJmZC0+ZmlsZW5hbWUpID09IDApCi0JCSAgICAgIHsKLQkJCWxmaW5mbyAoZnAsICIlQiglcysweCV2KSIsIGFiZmQsIHNlY3Rpb24tPm5hbWUsCi0JCQkJb2Zmc2V0KTsKLQkJCWlmIChsaW5lbnVtYmVyICE9IDApCi0JCQkgIGxmaW5mbyAoZnAsICI6JXUiLCBsaW5lbnVtYmVyKTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAobGluZW51bWJlciAhPSAwKSAKLQkJICAgICAgbGZpbmZvIChmcCwgIiVCOiVzOiV1IiwgYWJmZCwgZmlsZW5hbWUsIGxpbmVudW1iZXIpOwotCQkgICAgZWxzZQotCQkgICAgICBsZmluZm8gKGZwLCAiJUIoJXMrMHgldik6JXMiLCBhYmZkLCBzZWN0aW9uLT5uYW1lLAotCQkJICAgICAgb2Zmc2V0LCBmaWxlbmFtZSk7Ci0JCSAgfQotCQllbHNlCi0JCSAgbGZpbmZvIChmcCwgIiVCKCVzKzB4JXYpIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSwgb2Zmc2V0KTsKLQotCQlpZiAoZGlzY2FyZF9sYXN0KQotCQkgIHsKLQkJICAgIGxhc3RfYmZkID0gTlVMTDsKLQkJICAgIGlmIChsYXN0X2ZpbGUgIT0gTlVMTCkKLQkJICAgICAgewotCQkJZnJlZSAobGFzdF9maWxlKTsKLQkJCWxhc3RfZmlsZSA9IE5VTEw7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChsYXN0X2Z1bmN0aW9uICE9IE5VTEwpCi0JCSAgICAgIHsKLQkJCWZyZWUgKGxhc3RfZnVuY3Rpb24pOwotCQkJbGFzdF9mdW5jdGlvbiA9IE5VTEw7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCQkKLQkgICAgY2FzZSAncyc6Ci0JICAgICAgLyogYXJiaXRyYXJ5IHN0cmluZywgbGlrZSBwcmludGYgKi8KLQkgICAgICBmcHJpbnRmIChmcCwgIiVzIiwgdmFfYXJnIChhcmcsIGNoYXIgKikpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2QnOgotCSAgICAgIC8qIGludGVnZXIsIGxpa2UgcHJpbnRmICovCi0JICAgICAgZnByaW50ZiAoZnAsICIlZCIsIHZhX2FyZyAoYXJnLCBpbnQpKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd1JzoKLQkgICAgICAvKiB1bnNpZ25lZCBpbnRlZ2VyLCBsaWtlIHByaW50ZiAqLwotCSAgICAgIGZwcmludGYgKGZwLCAiJXUiLCB2YV9hcmcgKGFyZywgdW5zaWduZWQgaW50KSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChmYXRhbCA9PSB0cnVlKSAKLSAgICB4ZXhpdCgxKTsKLX0KLQotLyogRm9ybWF0IGluZm8gbWVzc2FnZSBhbmQgcHJpbnQgb24gc3Rkb3V0LiAqLwotCi0vKiAoWW91IHdvdWxkIHRoaW5rIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBqdXN0ICJpbmZvIiwgYnV0IHRoZW4geW91Ci0gICB3b3VsZCBob3NlZCBieSBMeW54T1MsIHdoaWNoIGRlZmluZXMgdGhhdCBuYW1lIGluIGl0cyBsaWJjLikgICovCi0KLXZvaWQKLSNpZiBVU0VfU1REQVJHCi1pbmZvX21zZyAoY29uc3QgY2hhciAqZm10LCAuLi4pCi0jZWxzZQotaW5mb19tc2cgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZzsKLQotI2lmICEgVVNFX1NUREFSRwotICBjb25zdCBjaGFyICpmbXQ7Ci0KLSAgdmFfc3RhcnQgKGFyZyk7Ci0gIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZywgZm10KTsKLSNlbmRpZgotCi0gIHZmaW5mbyAoc3Rkb3V0LCBmbXQsIGFyZyk7Ci0gIHZhX2VuZCAoYXJnKTsKLX0KLQotLyogKCdlJyBmb3IgZXJyb3IuKSBGb3JtYXQgaW5mbyBtZXNzYWdlIGFuZCBwcmludCBvbiBzdGRlcnIuICovCi0KLXZvaWQKLSNpZiBVU0VfU1REQVJHCi1laW5mbyAoY29uc3QgY2hhciAqZm10LCAuLi4pCi0jZWxzZQotZWluZm8gKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZzsKLQotI2lmICEgVVNFX1NUREFSRwotICBjb25zdCBjaGFyICpmbXQ7Ci0KLSAgdmFfc3RhcnQgKGFyZyk7Ci0gIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZywgZm10KTsKLSNlbmRpZgotCi0gIHZmaW5mbyAoc3RkZXJyLCBmbXQsIGFyZyk7Ci0gIHZhX2VuZCAoYXJnKTsKLX0KLQotdm9pZCAKLWluZm9fYXNzZXJ0IChmaWxlLCBsaW5lKQotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLXsKLSAgZWluZm8gKF8oIiVGJVA6IGludGVybmFsIGVycm9yICVzICVkXG4iKSwgZmlsZSwgbGluZSk7Ci19Ci0KLWNoYXIgKgotYnV5c3RyaW5nICh4KQotICAgICBDT05TVCBjaGFyICpDT05TVCB4OwotewotICBzaXplX3QgbCA9IHN0cmxlbih4KSsxOwotICBjaGFyICpyID0geG1hbGxvYyhsKTsKLSAgbWVtY3B5KHIsIHgsbCk7Ci0gIHJldHVybiByOwotfQotCi0vKiAoJ20nIGZvciBtYXApIEZvcm1hdCBpbmZvIG1lc3NhZ2UgYW5kIHByaW50IG9uIG1hcC4gKi8KLQotdm9pZAotI2lmIFVTRV9TVERBUkcKLW1pbmZvIChjb25zdCBjaGFyICpmbXQsIC4uLikKLSNlbHNlCi1taW5mbyAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnOwotCi0jaWYgISBVU0VfU1REQVJHCi0gIGNvbnN0IGNoYXIgKmZtdDsKLSAgdmFfc3RhcnQgKGFyZyk7Ci0gIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZywgZm10KTsKLSNlbmRpZgotCi0gIHZmaW5mbyAoY29uZmlnLm1hcF9maWxlLCBmbXQsIGFyZyk7Ci0gIHZhX2VuZCAoYXJnKTsKLX0KLQotdm9pZAotI2lmIFVTRV9TVERBUkcKLWxmaW5mbyAoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0jZWxzZQotbGZpbmZvICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmc7Ci0KLSNpZiAhIFVTRV9TVERBUkcKLSAgRklMRSAqZmlsZTsKLSAgY29uc3QgY2hhciAqZm10OwotCi0gIHZhX3N0YXJ0IChhcmcpOwotICBmaWxlID0gdmFfYXJnIChhcmcsIEZJTEUgKik7Ci0gIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZywgZm10KTsKLSNlbmRpZgotCi0gIHZmaW5mbyAoZmlsZSwgZm10LCBhcmcpOwotICB2YV9lbmQgKGFyZyk7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgdG8gcHJpbnQgdGhlIGxpbmsgbWFwLiAgKi8KLQotdm9pZCAKLXByaW50X3NwYWNlICgpCi17Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiAiKTsKLX0KLQotdm9pZCAKLXByaW50X25sICgpCi17Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIlxuIik7Ci19Ci0KLS8qIEEgbW9yZSBvciBsZXNzIGZyaWVuZGx5IGFib3J0IG1lc3NhZ2UuICBJbiBsZC5oIGFib3J0IGlzIGRlZmluZWQgdG8KLSAgIGNhbGwgdGhpcyBmdW5jdGlvbi4gICovCi0KLXZvaWQKLWxkX2Fib3J0IChmaWxlLCBsaW5lLCBmbikKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgaW50IGxpbmU7Ci0gICAgIGNvbnN0IGNoYXIgKmZuOwotewotICBpZiAoZm4gIT0gTlVMTCkKLSAgICBlaW5mbyAoXygiJVA6IGludGVybmFsIGVycm9yOiBhYm9ydGluZyBhdCAlcyBsaW5lICVkIGluICVzXG4iKSwKLQkgICBmaWxlLCBsaW5lLCBmbik7Ci0gIGVsc2UKLSAgICBlaW5mbyAoXygiJVA6IGludGVybmFsIGVycm9yOiBhYm9ydGluZyBhdCAlcyBsaW5lICVkXG4iKSwKLQkgICBmaWxlLCBsaW5lKTsKLSAgZWluZm8gKF8oIiVQJUY6IHBsZWFzZSByZXBvcnQgdGhpcyBidWdcbiIpKTsKLSAgeGV4aXQgKDEpOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRtaXNjLmggYi9sZC9sZG1pc2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViM2I0Zi4uMDAwMDAwMAotLS0gYS9sZC9sZG1pc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qIGxkbWlzYy5oIC0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRE1JU0NfSAotI2RlZmluZSBMRE1JU0NfSAotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1leHRlcm4gdm9pZCBlaW5mbyBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotZXh0ZXJuIHZvaWQgbWluZm8gUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLWV4dGVybiB2b2lkIGluZm9fbXNnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci1leHRlcm4gdm9pZCBsZmluZm8gUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICosIC4uLikpOwotI2Vsc2UKLS8qIFZBUkFSR1MqLwotZXh0ZXJuIHZvaWQgZWluZm8gKCk7Ci0vKiBWQVJBUkdTKi8KLWV4dGVybiB2b2lkIG1pbmZvICgpOwotLyogVkFSQVJHUyovCi1leHRlcm4gdm9pZCBpbmZvX21zZyAoKTsKLS8qVkFSQVJHUyovCi1leHRlcm4gdm9pZCBsZmluZm8gKCk7Ci0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgaW5mb19hc3NlcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQpKTsKLWV4dGVybiB2b2lkIHl5ZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gUFRSIHhtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1leHRlcm4gUFRSIHhyZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci1leHRlcm4gdm9pZCB4ZXhpdCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBjaGFyICpidXlzdHJpbmcgUEFSQU1TICgoQ09OU1QgY2hhciAqQ09OU1QpKTsKLQotI2RlZmluZSBBU1NFUlQoeCkgXAotZG8geyBpZiAoISh4KSkgaW5mb19hc3NlcnQoX19GSUxFX18sX19MSU5FX18pOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEZBSUwoKSBcCi1kbyB7IGluZm9fYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfSB3aGlsZSAoMCkKLQotZXh0ZXJuIHZvaWQgcHJpbnRfc3BhY2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgcHJpbnRfbmwgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGNoYXIgKmRlbWFuZ2xlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkdmVyLmMgYi9sZC9sZHZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjYwMGEyLi4wMDAwMDAwCi0tLSBhL2xkL2xkdmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBsZHZlci5jIC0tIFByaW50IGxpbmtlciB2ZXJzaW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkdmVyLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLWNvbnN0IGNoYXIgKmxkX3Byb2dyYW1fdmVyc2lvbiA9IFZFUlNJT047Ci0KLXZvaWQKLWxkdmVyc2lvbiAobm9pc3kpCi0gICAgIGludCBub2lzeTsKLXsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCJHTlUgbGQgdmVyc2lvbiAlcyAod2l0aCBCRkQgJXMpXG4iKSwKLQkgICBsZF9wcm9ncmFtX3ZlcnNpb24sIEJGRF9WRVJTSU9OKTsKLQotICBpZiAobm9pc3kpIAotICAgIHsKLSAgICAgIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKipwdHIgPSBsZF9lbXVsYXRpb25zOwotICAgIAotICAgICAgcHJpbnRmIChfKCIgIFN1cHBvcnRlZCBlbXVsYXRpb25zOlxuIikpOwotICAgICAgd2hpbGUgKCpwdHIpIAotCXsKLQkgIHByaW50ZiAoIiAgICVzXG4iLCAoKnB0ciktPmVtdWxhdGlvbl9uYW1lKTsKLQkgIHB0cisrOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC9sZHZlci5oIGIvbGQvbGR2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3YjZiYy4uMDAwMDAwMAotLS0gYS9sZC9sZHZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogbGR2ZXIuaCAtLSBIZWFkZXIgZmlsZSBmb3IgbGR2ZXIuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmxkX3Byb2dyYW1fdmVyc2lvbjsKLQotdm9pZCBsZHZlcnNpb24gUEFSQU1TICgoaW50KSk7CmRpZmYgLS1naXQgYS9sZC9sZHdyaXRlLmMgYi9sZC9sZHdyaXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NjExOWEuLjAwMDAwMDAKLS0tIGEvbGQvbGR3cml0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMwICswLDAgQEAKLS8qIGxkd3JpdGUuYyAtLSB3cml0ZSBvdXQgdGhlIGxpbmtlZCBmaWxlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzYWNAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkd3JpdGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLQotc3RhdGljIHZvaWQgYnVpbGRfbGlua19vcmRlciBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyBhc2VjdGlvbiAqY2xvbmVfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLXN0YXRpYyB2b2lkIHNwbGl0X3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEJ1aWxkIGxpbmtfb3JkZXIgc3RydWN0dXJlcyBmb3IgdGhlIEJGRCBsaW5rZXIuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfbGlua19vcmRlciAoc3RhdGVtZW50KQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzdGF0ZW1lbnQ7Ci17Ci0gIHN3aXRjaCAoc3RhdGVtZW50LT5oZWFkZXIudHlwZSkKLSAgICB7Ci0gICAgY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0gICAgICB7Ci0JYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCXN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLQliZmRfdm1hIHZhbHVlOwotCWJvb2xlYW4gYmlnX2VuZGlhbiA9IGZhbHNlOwotCi0Jb3V0cHV0X3NlY3Rpb24gPSBzdGF0ZW1lbnQtPmRhdGFfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uOwotCUFTU0VSVCAob3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOwotCi0JbGlua19vcmRlciA9IGJmZF9uZXdfbGlua19vcmRlciAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pOwotCWlmIChsaW5rX29yZGVyID09IE5VTEwpCi0JICBlaW5mbyAoXygiJVAlRjogYmZkX25ld19saW5rX29yZGVyIGZhaWxlZFxuIikpOwotCi0JbGlua19vcmRlci0+dHlwZSA9IGJmZF9kYXRhX2xpbmtfb3JkZXI7Ci0JbGlua19vcmRlci0+b2Zmc2V0ID0gc3RhdGVtZW50LT5kYXRhX3N0YXRlbWVudC5vdXRwdXRfdm1hOwotCWxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChRVUFEX1NJWkUpOwotCi0JdmFsdWUgPSBzdGF0ZW1lbnQtPmRhdGFfc3RhdGVtZW50LnZhbHVlOwotCi0JLyogSWYgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIG91dHB1dCBCRkQgaXMgbm90IGtub3duLCB0aGVuIHdlCi0JICAgYmFzZSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgZGF0YSBvbiB0aGUgZmlyc3QgaW5wdXQgZmlsZS4KLQkgICBCeSBjb252ZW50aW9uLCB0aGUgYmZkX3B1dCByb3V0aW5lcyBmb3IgYW4gdW5rbm93bgotCSAgIGVuZGlhbm5lc3MgYXJlIGJpZyBlbmRpYW4sIHNvIHdlIG11c3Qgc3dhcCBoZXJlIGlmIHRoZQotCSAgIGlucHV0IGZpbGUgaXMgbGl0dGxlIGVuZGlhbi4gICovCi0JaWYgKGJmZF9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkgIGJpZ19lbmRpYW4gPSB0cnVlOwotCWVsc2UgaWYgKGJmZF9saXR0bGVfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkgIGJpZ19lbmRpYW4gPSBmYWxzZTsKLQllbHNlCi0JICB7Ci0JICAgIGJvb2xlYW4gc3dhcDsKLQotCSAgICBzd2FwID0gZmFsc2U7Ci0JICAgIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9CSUcpCi0JICAgICAgYmlnX2VuZGlhbiA9IHRydWU7Ci0JICAgIGVsc2UgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gPT0gRU5ESUFOX0xJVFRMRSkKLQkgICAgICB7Ci0JCWJpZ19lbmRpYW4gPSBmYWxzZTsKLQkJc3dhcCA9IHRydWU7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9VTlNFVCkKLQkgICAgICB7Ci0JCWJpZ19lbmRpYW4gPSB0cnVlOwotCQl7Ci0JCSAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKHMpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzLT50aGVfYmZkICE9IE5VTEwpCi0JCQl7Ci0JCQkgIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAocy0+dGhlX2JmZCkpCi0JCQkgICAgewotCQkJICAgICAgYmlnX2VuZGlhbiA9IGZhbHNlOwotCQkJICAgICAgc3dhcCA9IHRydWU7Ci0JCQkgICAgfQotCQkJICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIH0KLQotCSAgICBpZiAoc3dhcCkKLQkgICAgICB7Ci0JCWJmZF9ieXRlIGJ1ZmZlcls4XTsKLQotCQlzd2l0Y2ggKHN0YXRlbWVudC0+ZGF0YV9zdGF0ZW1lbnQudHlwZSkKLQkJICB7Ci0JCSAgY2FzZSBRVUFEOgotCQkgIGNhc2UgU1FVQUQ6Ci0JCSAgICBpZiAoc2l6ZW9mIChiZmRfdm1hKSA+PSBRVUFEX1NJWkUpCi0JCSAgICAgIHsKLQkJCWJmZF9wdXRsNjQgKHZhbHVlLCBidWZmZXIpOwotCQkJdmFsdWUgPSBiZmRfZ2V0YjY0IChidWZmZXIpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JCSAgY2FzZSBMT05HOgotCQkgICAgYmZkX3B1dGwzMiAodmFsdWUsIGJ1ZmZlcik7Ci0JCSAgICB2YWx1ZSA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFNIT1JUOgotCQkgICAgYmZkX3B1dGwxNiAodmFsdWUsIGJ1ZmZlcik7Ci0JCSAgICB2YWx1ZSA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIEJZVEU6Ci0JCSAgICBicmVhazsKLQkJICBkZWZhdWx0OgotCQkgICAgYWJvcnQgKCk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQotCUFTU0VSVCAob3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOwotCXN3aXRjaCAoc3RhdGVtZW50LT5kYXRhX3N0YXRlbWVudC50eXBlKQotCSAgewotCSAgY2FzZSBRVUFEOgotCSAgY2FzZSBTUVVBRDoKLQkgICAgaWYgKHNpemVvZiAoYmZkX3ZtYSkgPj0gUVVBRF9TSVpFKQotCSAgICAgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIHZhbHVlLCBsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMpOwotCSAgICBlbHNlCi0JICAgICAgewotCQliZmRfdm1hIGhpZ2g7Ci0KLQkJaWYgKHN0YXRlbWVudC0+ZGF0YV9zdGF0ZW1lbnQudHlwZSA9PSBRVUFEKQotCQkgIGhpZ2ggPSAwOwotCQllbHNlIGlmICgodmFsdWUgJiAweDgwMDAwMDAwKSA9PSAwKQotCQkgIGhpZ2ggPSAwOwotCQllbHNlCi0JCSAgaGlnaCA9IChiZmRfdm1hKSAtMTsKLQkJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaGlnaCwKLQkJCSAgICAobGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzCi0JCQkgICAgICsgKGJpZ19lbmRpYW4gPyAwIDogNCkpKTsKLQkJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdmFsdWUsCi0JCQkgICAgKGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cwotCQkJICAgICArIChiaWdfZW5kaWFuID8gNCA6IDApKSk7Ci0JICAgICAgfQotCSAgICBsaW5rX29yZGVyLT5zaXplID0gUVVBRF9TSVpFOwotCSAgICBicmVhazsKLQkgIGNhc2UgTE9ORzoKLQkgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdmFsdWUsIGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cyk7Ci0JICAgIGxpbmtfb3JkZXItPnNpemUgPSBMT05HX1NJWkU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBTSE9SVDoKLQkgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdmFsdWUsIGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cyk7Ci0JICAgIGxpbmtfb3JkZXItPnNpemUgPSBTSE9SVF9TSVpFOwotCSAgICBicmVhazsKLQkgIGNhc2UgQllURToKLQkgICAgYmZkX3B1dF84IChvdXRwdXRfYmZkLCB2YWx1ZSwgbGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzKTsKLQkgICAgbGlua19vcmRlci0+c2l6ZSA9IEJZVEVfU0laRTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtOgotICAgICAgewotCWxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUgKnJzOwotCWFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQlzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0KLQlycyA9ICZzdGF0ZW1lbnQtPnJlbG9jX3N0YXRlbWVudDsKLQotCW91dHB1dF9zZWN0aW9uID0gcnMtPm91dHB1dF9zZWN0aW9uOwotCUFTU0VSVCAob3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOwotCi0JbGlua19vcmRlciA9IGJmZF9uZXdfbGlua19vcmRlciAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pOwotCWlmIChsaW5rX29yZGVyID09IE5VTEwpCi0JICBlaW5mbyAoXygiJVAlRjogYmZkX25ld19saW5rX29yZGVyIGZhaWxlZFxuIikpOwotCi0JbGlua19vcmRlci0+b2Zmc2V0ID0gcnMtPm91dHB1dF92bWE7Ci0JbGlua19vcmRlci0+c2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocnMtPmhvd3RvKTsKLQotCWxpbmtfb3JkZXItPnUucmVsb2MucCA9Ci0JICAoKHN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYyAqKQotCSAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jKSkpOwotCi0JbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyA9IHJzLT5yZWxvYzsKLQlsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZCA9IHJzLT5hZGRlbmRfdmFsdWU7Ci0KLQlpZiAocnMtPm5hbWUgPT0gTlVMTCkKLQkgIHsKLQkgICAgbGlua19vcmRlci0+dHlwZSA9IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXI7Ci0JICAgIGlmIChycy0+c2VjdGlvbi0+b3duZXIgPT0gb3V0cHV0X2JmZCkKLQkgICAgICBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbiA9IHJzLT5zZWN0aW9uOwotCSAgICBlbHNlCi0JICAgICAgewotCQlsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbiA9IHJzLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkJbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQgKz0gcnMtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgICAgfQotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgbGlua19vcmRlci0+dHlwZSA9IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcjsKLQkgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUgPSBycy0+bmFtZTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLSAgICAgIC8qIENyZWF0ZSBhIG5ldyBsaW5rX29yZGVyIGluIHRoZSBvdXRwdXQgc2VjdGlvbiB3aXRoIHRoaXMKLQkgYXR0YWNoZWQgKi8KLSAgICAgIGlmIChzdGF0ZW1lbnQtPmlucHV0X3NlY3Rpb24uaWZpbGUtPmp1c3Rfc3ltc19mbGFnID09IGZhbHNlKQotCXsKLQkgIGFzZWN0aW9uICppID0gc3RhdGVtZW50LT5pbnB1dF9zZWN0aW9uLnNlY3Rpb247Ci0JICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBpLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgQVNTRVJUIChvdXRwdXRfc2VjdGlvbi0+b3duZXIgPT0gb3V0cHV0X2JmZCk7Ci0KLQkgIGlmICgob3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLQotCSAgICAgIGxpbmtfb3JkZXIgPSBiZmRfbmV3X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKTsKLQotCSAgICAgIGlmIChpLT5mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCQl7Ci0JCSAgLyogV2UndmUgZ290IGEgbmV2ZXIgbG9hZCBzZWN0aW9uIGluc2lkZSBvbmUgd2hpY2gKLQkJICAgICBpcyBnb2luZyB0byBiZSBvdXRwdXQsIHdlJ2xsIGNoYW5nZSBpdCBpbnRvIGEKLQkJICAgICBmaWxsIGxpbmtfb3JkZXIgKi8KLQkJICBsaW5rX29yZGVyLT50eXBlID0gYmZkX2ZpbGxfbGlua19vcmRlcjsKLQkJICBsaW5rX29yZGVyLT51LmZpbGwudmFsdWUgPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbGlua19vcmRlci0+dHlwZSA9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyOwotCQkgIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbiA9IGk7Ci0JCSAgQVNTRVJUIChpLT5vdXRwdXRfc2VjdGlvbiA9PSBvdXRwdXRfc2VjdGlvbik7Ci0JCX0KLQkgICAgICBpZiAoaS0+X2Nvb2tlZF9zaXplKQotCQlsaW5rX29yZGVyLT5zaXplID0gaS0+X2Nvb2tlZF9zaXplOwotCSAgICAgIGVsc2UKLQkJbGlua19vcmRlci0+c2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoaSk7Ci0JICAgICAgbGlua19vcmRlci0+b2Zmc2V0ID0gaS0+b3V0cHV0X29mZnNldDsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0gICAgICAvKiBNYWtlIGEgbmV3IGxpbmtfb3JkZXIgd2l0aCB0aGUgcmlnaHQgZmlsbGVyICovCi0gICAgICB7Ci0JYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCXN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLQotCW91dHB1dF9zZWN0aW9uID0gc3RhdGVtZW50LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbjsKLQlBU1NFUlQgKHN0YXRlbWVudC0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb24tPm93bmVyCi0JCT09IG91dHB1dF9iZmQpOwotCWlmICgob3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQkgIHsKLQkgICAgbGlua19vcmRlciA9IGJmZF9uZXdfbGlua19vcmRlciAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pOwotCSAgICBsaW5rX29yZGVyLT50eXBlID0gYmZkX2ZpbGxfbGlua19vcmRlcjsKLQkgICAgbGlua19vcmRlci0+c2l6ZSA9IHN0YXRlbWVudC0+cGFkZGluZ19zdGF0ZW1lbnQuc2l6ZTsKLQkgICAgbGlua19vcmRlci0+b2Zmc2V0ID0gc3RhdGVtZW50LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfb2Zmc2V0OwotCSAgICBsaW5rX29yZGVyLT51LmZpbGwudmFsdWUgPSBzdGF0ZW1lbnQtPnBhZGRpbmdfc3RhdGVtZW50LmZpbGw7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBBbGwgdGhlIG90aGVyIG9uZXMgZmFsbCB0aHJvdWdoICovCi0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIENhbGwgQkZEIHRvIHdyaXRlIG91dCB0aGUgbGlua2VkIGZpbGUuICAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qIFdhbmRlciBhcm91bmQgdGhlIGlucHV0IHNlY3Rpb25zLCBtYWtlIHN1cmUgdGhhdAotICAgd2UnbGwgbmV2ZXIgdHJ5IGFuZCBjcmVhdGUgYW4gb3V0cHV0IHNlY3Rpb24gd2l0aCBtb3JlIHJlbG9jcwotICAgdGhhbiB3aWxsIGZpdC4uIERvIHRoaXMgYnkgYWx3YXlzIGFzc3VtaW5nIHRoZSB3b3JzdCBjYXNlLCBhbmQKLSAgIGNyZWF0aW5nIG5ldyBvdXRwdXQgc2VjdGlvbnMgd2l0aCBhbGwgdGhlIHJpZ2h0IGJpdHMgKi8KLSNkZWZpbmUgVEVTVElUIDEKLXN0YXRpYyBhc2VjdGlvbiAqCi1jbG9uZV9zZWN0aW9uIChhYmZkLCBzLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqczsKLSAgICAgaW50ICpjb3VudDsKLXsKLSNkZWZpbmUgU1NJWkUgOAotICBjaGFyIHNuYW1lW1NTSVpFXTsJCS8qID8/ICBmaW5kIHRoZSBuYW1lIGZvciB0aGlzIHNpemUgKi8KLSAgYXNlY3Rpb24gKm47Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAvKiBJbnZlbnQgYSBzZWN0aW9uIG5hbWUgLSB1c2UgZmlyc3QgZml2ZQotICAgICBjaGFycyBvZiBiYXNlIHNlY3Rpb24gbmFtZSBhbmQgYSBkaWdpdCBzdWZmaXggKi8KLSAgZG8KLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGNoYXIgYls2XTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGIpIC0gMSAmJiBzLT5uYW1lW2ldOyBpKyspCi0JYltpXSA9IHMtPm5hbWVbaV07Ci0gICAgICBiW2ldID0gMDsKLSAgICAgIHNwcmludGYgKHNuYW1lLCAiJXMlZCIsIGIsICgqY291bnQpKyspOwotICAgIH0KLSAgd2hpbGUgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzbmFtZSkpOwotCi0gIG4gPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgeHN0cmR1cCAoc25hbWUpKTsKLQotICAvKiBDcmVhdGUgYSBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZSAqLwotCi0gIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsCi0JCQkgICAgc25hbWUsIHRydWUsIHRydWUsIGZhbHNlKTsKLSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLSAgaC0+dS5kZWYudmFsdWUgPSAwOwotICBoLT51LmRlZi5zZWN0aW9uID0gbiAgIDsKLQotCi0gIG4tPmZsYWdzID0gcy0+ZmxhZ3M7Ci0gIG4tPnZtYSA9IHMtPnZtYTsKLSAgbi0+dXNlcl9zZXRfdm1hID0gcy0+dXNlcl9zZXRfdm1hOwotICBuLT5sbWEgPSBzLT5sbWE7Ci0gIG4tPl9jb29rZWRfc2l6ZSA9IDA7Ci0gIG4tPl9yYXdfc2l6ZSA9IDA7Ci0gIG4tPm91dHB1dF9vZmZzZXQgPSBzLT5vdXRwdXRfb2Zmc2V0OwotICBuLT5vdXRwdXRfc2VjdGlvbiA9IG47Ci0gIG4tPm9yZWxvY2F0aW9uID0gMDsKLSAgbi0+cmVsb2NfY291bnQgPSAwOwotICBuLT5hbGlnbm1lbnRfcG93ZXIgPSBzLT5hbGlnbm1lbnRfcG93ZXI7Ci0gIHJldHVybiBuOwotfQotCi0jaWYgVEVTVElORwotc3RhdGljIHZvaWQgCi1kcyAocykKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbCA9IHMtPmxpbmtfb3JkZXJfaGVhZDsKLSAgcHJpbnRmICgidm1hICV4IHNpemUgJXhcbiIsIHMtPnZtYSwgcy0+X3Jhd19zaXplKTsKLSAgd2hpbGUgKGwpCi0gICAgewotICAgICAgaWYgKGwtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JewotCSAgcHJpbnRmICgiJTh4ICVzXG4iLCBsLT5vZmZzZXQsIGwtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXItPmZpbGVuYW1lKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmIChfKCIlOHggc29tZXRoaW5nIGVsc2VcbiIpLCBsLT5vZmZzZXQpOwotCX0KLSAgICAgIGwgPSBsLT5uZXh0OwotICAgIH0KLSAgcHJpbnRmICgiXG4iKTsKLX0KLWR1bXAgKHMsIGExLCBhMikKLSAgICAgY2hhciAqczsKLSAgICAgYXNlY3Rpb24gKmExOwotICAgICBhc2VjdGlvbiAqYTI7Ci17Ci0gIHByaW50ZiAoIiVzXG4iLCBzKTsKLSAgZHMgKGExKTsKLSAgZHMgKGEyKTsKLX0KLQotc3RhdGljIHZvaWQgCi1zYW5pdHlfY2hlY2sgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gICAgICBiZmRfdm1hIHByZXYgPSAwOwotICAgICAgZm9yIChwID0gcy0+bGlua19vcmRlcl9oZWFkOyBwOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+b2Zmc2V0ID4gMTAwMDAwKQotCSAgICBhYm9ydCAoKTsKLQkgIGlmIChwLT5vZmZzZXQgPCBwcmV2KQotCSAgICBhYm9ydCAoKTsKLQkgIHByZXYgPSBwLT5vZmZzZXQ7Ci0JfQotICAgIH0KLX0KLSNlbHNlCi0jZGVmaW5lIHNhbml0eV9jaGVjayhhKQotI2RlZmluZSBkdW1wKGEsIGIsIGMpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgCi1zcGxpdF9zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKm9yaWdpbmFsX3NlYzsKLSAgaW50IG5zZWNzID0gYWJmZC0+c2VjdGlvbl9jb3VudDsKLSAgc2FuaXR5X2NoZWNrIChhYmZkKTsKLSAgLyogbG9vayB0aHJvdWdoIGFsbCB0aGUgb3JpZ2luYWwgc2VjdGlvbnMgKi8KLSAgZm9yIChvcmlnaW5hbF9zZWMgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBvcmlnaW5hbF9zZWMgJiYgbnNlY3M7Ci0gICAgICAgb3JpZ2luYWxfc2VjID0gb3JpZ2luYWxfc2VjLT5uZXh0LCBuc2Vjcy0tKQotICAgIHsKLSAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgIGludCBsaW5lcyA9IDA7Ci0gICAgICBpbnQgcmVsb2NzID0gMDsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKnBwOwotICAgICAgYmZkX3ZtYSB2bWEgPSBvcmlnaW5hbF9zZWMtPnZtYTsKLSAgICAgIGJmZF92bWEgc2hpZnRfb2Zmc2V0ID0gMDsKLSAgICAgIGFzZWN0aW9uICpjdXJzb3IgPSBvcmlnaW5hbF9zZWM7Ci0KLSAgICAgIC8qIGNvdW50IHVwIHRoZSByZWxvY2F0aW9ucyBhbmQgbGluZSBlbnRyaWVzIHRvIHNlZSBpZgotCSBhbnl0aGluZyB3b3VsZCBiZSB0b28gYmlnIHRvIGZpdCAqLwotICAgICAgZm9yIChwcCA9ICYoY3Vyc29yLT5saW5rX29yZGVyX2hlYWQpOyAqcHA7IHBwID0gJigoKnBwKS0+bmV4dCkpCi0JewotCSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwID0gKnBwOwotCSAgaW50IHRoaXNsaW5lcyA9IDA7Ci0JICBpbnQgdGhpc3JlbG9jcyA9IDA7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkgICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZQotCQkgIHx8IGluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUpCi0JCXRoaXNsaW5lcyA9IHNlYy0+bGluZW5vX2NvdW50OwotCi0JICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJdGhpc3JlbG9jcyA9IHNlYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgfQotCSAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgICYmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKSkKLQkgICAgdGhpc3JlbG9jcysrOwotCi0JICBpZiAoISBmaXJzdAotCSAgICAgICYmICh0aGlzcmVsb2NzICsgcmVsb2NzID4gY29uZmlnLnNwbGl0X2J5X3JlbG9jCi0JCSAgfHwgdGhpc2xpbmVzICsgbGluZXMgPiBjb25maWcuc3BsaXRfYnlfcmVsb2MKLQkJICB8fCBjb25maWcuc3BsaXRfYnlfZmlsZSkpCi0JICAgIHsKLQkgICAgICAvKiBjcmVhdGUgYSBuZXcgc2VjdGlvbiBhbmQgcHV0IHRoaXMgbGluayBvcmRlciBhbmQgdGhlCi0JCSBmb2xsb3dpbmcgbGluayBvcmRlcnMgaW50byBpdCAqLwotCSAgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbCA9IHA7Ci0JICAgICAgYXNlY3Rpb24gKm4gPSBjbG9uZV9zZWN0aW9uIChhYmZkLCBjdXJzb3IsICZjb3VudCk7Ci0JICAgICAgKnBwID0gTlVMTDsJLyogU25pcCBvZmYgbGluayBvcmRlcnMgZnJvbSBvbGQgc2VjdGlvbiAqLwotCSAgICAgIG4tPmxpbmtfb3JkZXJfaGVhZCA9IGw7CS8qIGF0dGFjaCB0byBuZXcgc2VjdGlvbiAqLwotCSAgICAgIHBwID0gJm4tPmxpbmtfb3JkZXJfaGVhZDsKLQotCSAgICAgIC8qIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgb3JpZ2luYWwgc2VjdGlvbiBhbmQKLQkJIHVwZGF0ZSB0aGUgdm1hIG9mIHRoZSBuZXcgb25lICovCi0KLQkgICAgICBkdW1wICgiYmVmb3JlIHNuaXAiLCBjdXJzb3IsIG4pOwotCi0JICAgICAgbi0+X3Jhd19zaXplID0gY3Vyc29yLT5fcmF3X3NpemUgLSBsLT5vZmZzZXQ7Ci0JICAgICAgY3Vyc29yLT5fcmF3X3NpemUgPSBsLT5vZmZzZXQ7Ci0KLQkgICAgICB2bWEgKz0gY3Vyc29yLT5fcmF3X3NpemU7Ci0JICAgICAgbi0+bG1hID0gbi0+dm1hID0gdm1hOwotCi0JICAgICAgc2hpZnRfb2Zmc2V0ID0gbC0+b2Zmc2V0OwotCi0JICAgICAgLyogcnVuIGRvd24gdGhlIGNoYWluIGFuZCBjaGFuZ2UgdGhlIG91dHB1dCBzZWN0aW9uIHRvCi0JCSB0aGUgcmlnaHQgb25lLCB1cGRhdGUgdGhlIG9mZnNldHMgdG9vICovCi0KLQkgICAgICB3aGlsZSAobCkKLQkJewotCQkgIGwtPm9mZnNldCAtPSBzaGlmdF9vZmZzZXQ7Ci0JCSAgaWYgKGwtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCSAgICB7Ci0JCSAgICAgIGwtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBuOwotCQkgICAgICBsLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9vZmZzZXQgPSBsLT5vZmZzZXQ7Ci0JCSAgICB9Ci0JCSAgbCA9IGwtPm5leHQ7Ci0JCX0KLQkgICAgICBkdW1wICgiYWZ0ZXIgc25pcCIsIGN1cnNvciwgbik7Ci0JICAgICAgY3Vyc29yID0gbjsKLQkgICAgICByZWxvY3MgPSB0aGlzcmVsb2NzOwotCSAgICAgIGxpbmVzID0gdGhpc2xpbmVzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWxvY3MgKz0gdGhpc3JlbG9jczsKLQkgICAgICBsaW5lcyArPSB0aGlzbGluZXM7Ci0JICAgIH0KLQotCSAgZmlyc3QgPSBmYWxzZTsKLQl9Ci0gICAgfQotICBzYW5pdHlfY2hlY2sgKGFiZmQpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1sZHdyaXRlICgpCi17Ci0gIC8qIFJlc2V0IGVycm9yIGluZGljYXRvciwgd2hpY2ggY2FuIHR5cGljYWxseSBzb21ldGhpbmcgbGlrZSBpbnZhbGlkCi0gICAgIGZvcm1hdCBmcm9tIG9wZW5uaW5nIHVwIHRoZSAubyBmaWxlcyAqLwotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoYnVpbGRfbGlua19vcmRlcik7Ci0KLSAgaWYgKGNvbmZpZy5zcGxpdF9ieV9yZWxvYyB8fCBjb25maWcuc3BsaXRfYnlfZmlsZSkKLSAgICBzcGxpdF9zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGlmICghYmZkX2ZpbmFsX2xpbmsgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pKQotICAgIHsKLSAgICAgIC8qIElmIHRoZXJlIHdhcyBhbiBlcnJvciByZWNvcmRlZCwgcHJpbnQgaXQgb3V0LiAgT3RoZXJ3aXNlIGFzc3VtZQotCSBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlIGxpa2UgdW5rbm93biBzeW1ib2wgd2FzIHByaW50ZWQKLQkgb3V0LiAgKi8KLQotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX25vX2Vycm9yKQotCWVpbmZvIChfKCIlRiVQOiBmaW5hbCBsaW5rIGZhaWxlZDogJUVcbiIpLCBvdXRwdXRfYmZkKTsKLSAgICAgIGVsc2UKLQl4ZXhpdCgxKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC9sZHdyaXRlLmggYi9sZC9sZHdyaXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZDhiNTIuLjAwMDAwMDAKLS0tIGEvbGQvbGR3cml0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyogbGR3cml0ZS5oIC0KLSAgIENvcHlyaWdodCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXZvaWQgbGR3cml0ZSBQQVJBTVMgKCh2b2lkKSk7CmRpZmYgLS1naXQgYS9sZC9sZXhzdXAuYyBiL2xkL2xleHN1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmE2NWUxLi4wMDAwMDAwCi0tLSBhL2xkL2xleHN1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2NyArMCwwIEBACi0vKiBQYXJzZSBvcHRpb25zIGZvciB0aGUgR05VIGxpbmtlci4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRsZXguaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZHZlci5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotCi0jaWZuZGVmIFBBVEhfU0VQQVJBVE9SCi0jaWYgZGVmaW5lZCAoX19NU0RPU19fKSB8fCAoZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykpCi0jZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc7JwotI2Vsc2UKLSNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzonCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBTb21ld2hlcmUgYWJvdmUsIHN5cy9zdGF0LmggZ290IGluY2x1ZGVkIC4gLiAuIC4gKi8KLSNpZiAhZGVmaW5lZChTX0lTRElSKSAmJiBkZWZpbmVkKFNfSUZESVIpCi0jZGVmaW5lCVNfSVNESVIobSkgKCgobSkgJiBTX0lGTVQpID09IFNfSUZESVIpCi0jZW5kaWYKLQotLyogT21pdCBhcmdzIHRvIGF2b2lkIHRoZSBwb3NzaWJpbGl0eSBvZiBjbGFzaGluZyB3aXRoIGEgc3lzdGVtIGhlYWRlcgotICAgdGhhdCBtaWdodCBkaXNhZ3JlZSBhYm91dCBjb25zdHMuICAqLwotdW5zaWduZWQgbG9uZyBzdHJ0b3VsICgpOwotCi1zdGF0aWMgaW50IGlzX251bSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNldF9kZWZhdWx0X2Rpcmxpc3QgUEFSQU1TICgoY2hhciAqZGlybGlzdF9wdHIpKTsKLXN0YXRpYyB2b2lkIHNldF9zZWN0aW9uX3N0YXJ0IFBBUkFNUyAoKGNoYXIgKnNlY3QsIGNoYXIgKnZhbHN0cikpOwotc3RhdGljIHZvaWQgaGVscCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIE5vbi16ZXJvIGlmIHdlIGFyZSBwcm9jZXNzaW5nIGEgLS1kZWZzeW0gZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLWludCBwYXJzaW5nX2RlZnN5bSA9IDA7Ci0KLS8qIENvZGVzIHVzZWQgZm9yIHRoZSBsb25nIG9wdGlvbnMgd2l0aCBubyBzaG9ydCBzeW5vbnltcy4gIDE1MCBpc24ndAotICAgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCi0KLSNkZWZpbmUgT1BUSU9OX0FTU0VSVAkJCTE1MAotI2RlZmluZSBPUFRJT05fQ0FMTF9TSEFSRUQJCShPUFRJT05fQVNTRVJUICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NSRUYJCQkoT1BUSU9OX0NBTExfU0hBUkVEICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RFRlNZTQkJCShPUFRJT05fQ1JFRiArIDEpCi0jZGVmaW5lIE9QVElPTl9ERU1BTkdMRQkJCShPUFRJT05fREVGU1lNICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RZTkFNSUNfTElOS0VSCQkoT1BUSU9OX0RFTUFOR0xFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VCCQkJKE9QVElPTl9EWU5BTUlDX0xJTktFUiArIDEpCi0jZGVmaW5lIE9QVElPTl9FTAkJCShPUFRJT05fRUIgKyAxKQotI2RlZmluZSBPUFRJT05fRU1CRURERURfUkVMT0NTCQkoT1BUSU9OX0VMICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYUE9SVF9EWU5BTUlDCQkoT1BUSU9OX0VNQkVEREVEX1JFTE9DUyArIDEpCi0jZGVmaW5lIE9QVElPTl9IRUxQCQkJKE9QVElPTl9FWFBPUlRfRFlOQU1JQyArIDEpCi0jZGVmaW5lIE9QVElPTl9JR05PUkUJCQkoT1BUSU9OX0hFTFAgKyAxKQotI2RlZmluZSBPUFRJT05fTUFQCQkJKE9QVElPTl9JR05PUkUgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fREVNQU5HTEUJCShPUFRJT05fTUFQICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0tFRVBfTUVNT1JZCQkoT1BUSU9OX05PX0RFTUFOR0xFICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX1dBUk5fTUlTTUFUQ0gJCShPUFRJT05fTk9fS0VFUF9NRU1PUlkgKyAxKQotI2RlZmluZSBPUFRJT05fTk9JTkhJQklUX0VYRUMJCShPUFRJT05fTk9fV0FSTl9NSVNNQVRDSCArIDEpCi0jZGVmaW5lIE9QVElPTl9OT05fU0hBUkVECQkoT1BUSU9OX05PSU5ISUJJVF9FWEVDICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX1dIT0xFX0FSQ0hJVkUJCShPUFRJT05fTk9OX1NIQVJFRCArIDEpCi0jZGVmaW5lIE9QVElPTl9PRk9STUFUCQkJKE9QVElPTl9OT19XSE9MRV9BUkNISVZFICsgMSkKLSNkZWZpbmUgT1BUSU9OX1JFTEFYCQkJKE9QVElPTl9PRk9STUFUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1JFVEFJTl9TWU1CT0xTX0ZJTEUJKE9QVElPTl9SRUxBWCArIDEpCi0jZGVmaW5lIE9QVElPTl9SUEFUSAkJCShPUFRJT05fUkVUQUlOX1NZTUJPTFNfRklMRSArIDEpCi0jZGVmaW5lIE9QVElPTl9SUEFUSF9MSU5LCQkoT1BUSU9OX1JQQVRIICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NIQVJFRAkJCShPUFRJT05fUlBBVEhfTElOSyArIDEpCi0jZGVmaW5lIE9QVElPTl9TT05BTUUJCQkoT1BUSU9OX1NIQVJFRCArIDEpCi0jZGVmaW5lIE9QVElPTl9TT1JUX0NPTU1PTgkJKE9QVElPTl9TT05BTUUgKyAxKQotI2RlZmluZSBPUFRJT05fU1RBVFMJCQkoT1BUSU9OX1NPUlRfQ09NTU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NZTUJPTElDCQkJKE9QVElPTl9TVEFUUyArIDEpCi0jZGVmaW5lIE9QVElPTl9UQVNLX0xJTksJCShPUFRJT05fU1lNQk9MSUMgKyAxKQotI2RlZmluZSBPUFRJT05fVEJTUwkJCShPUFRJT05fVEFTS19MSU5LICsgMSkKLSNkZWZpbmUgT1BUSU9OX1REQVRBCQkJKE9QVElPTl9UQlNTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1RURVhUCQkJKE9QVElPTl9UREFUQSArIDEpCi0jZGVmaW5lIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVQJKE9QVElPTl9UVEVYVCArIDEpCi0jZGVmaW5lIE9QVElPTl9VUgkJCShPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUkJPU0UJCQkoT1BUSU9OX1VSICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT04JCQkoT1BUSU9OX1ZFUkJPU0UgKyAxKQotI2RlZmluZSBPUFRJT05fVkVSU0lPTl9TQ1JJUFQJCShPUFRJT05fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9WRVJTSU9OX0VYUE9SVFNfU0VDVElPTgkoT1BUSU9OX1ZFUlNJT05fU0NSSVBUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dBUk5fQ09NTU9OCQkoT1BUSU9OX1ZFUlNJT05fRVhQT1JUU19TRUNUSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dBUk5fQ09OU1RSVUNUT1JTCShPUFRJT05fV0FSTl9DT01NT04gKyAxKQotI2RlZmluZSBPUFRJT05fV0FSTl9NVUxUSVBMRV9HUAkJKE9QVElPTl9XQVJOX0NPTlNUUlVDVE9SUyArIDEpCi0jZGVmaW5lIE9QVElPTl9XQVJOX09OQ0UJCShPUFRJT05fV0FSTl9NVUxUSVBMRV9HUCArIDEpCi0jZGVmaW5lIE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR04JKE9QVElPTl9XQVJOX09OQ0UgKyAxKQotI2RlZmluZSBPUFRJT05fU1BMSVRfQllfUkVMT0MJCShPUFRJT05fV0FSTl9TRUNUSU9OX0FMSUdOICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NQTElUX0JZX0ZJTEUgCSAgICAJKE9QVElPTl9TUExJVF9CWV9SRUxPQyArIDEpCi0jZGVmaW5lIE9QVElPTl9XSE9MRV9BUkNISVZFCQkoT1BUSU9OX1NQTElUX0JZX0ZJTEUgKyAxKQotI2RlZmluZSBPUFRJT05fV1JBUAkJCShPUFRJT05fV0hPTEVfQVJDSElWRSArIDEpCi0jZGVmaW5lIE9QVElPTl9GT1JDRV9FWEVfU1VGRklYCQkoT1BUSU9OX1dSQVAgKyAxKQotI2RlZmluZSBPUFRJT05fR0NfU0VDVElPTlMJCShPUFRJT05fRk9SQ0VfRVhFX1NVRkZJWCArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19HQ19TRUNUSU9OUwkJKE9QVElPTl9HQ19TRUNUSU9OUyArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEVDS19TRUNUSU9OUwkJKE9QVElPTl9OT19HQ19TRUNUSU9OUyArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19DSEVDS19TRUNUSU9OUwkoT1BUSU9OX0NIRUNLX1NFQ1RJT05TICsgMSkKLSNkZWZpbmUgT1BUSU9OX01QQzg2MEMwICAgICAgICAgICAgICAgICAoT1BUSU9OX05PX0NIRUNLX1NFQ1RJT05TICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX1VOREVGSU5FRAkJKE9QVElPTl9NUEM4NjBDMCArIDEpCi0jZGVmaW5lIE9QVElPTl9JTklUICAgICAgICAgICAgICAgICAgICAgKE9QVElPTl9OT19VTkRFRklORUQgKyAxKQotI2RlZmluZSBPUFRJT05fRklOSSAgICAgICAgICAgICAgICAgICAgIChPUFRJT05fSU5JVCArIDEpCi0KLS8qIFRoZSBsb25nIG9wdGlvbnMuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBib3RoIHRoZSBvcHRpb24KLSAgIHBhcnNpbmcgYW5kIHRoZSBoZWxwIHRleHQuICAqLwotCi1zdHJ1Y3QgbGRfb3B0aW9uCi17Ci0gIC8qIFRoZSBsb25nIG9wdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBvcHRpb24gb3B0OwotICAvKiBUaGUgc2hvcnQgb3B0aW9uIHdpdGggdGhlIHNhbWUgbWVhbmluZyAoJ1wwJyBpZiBub25lKS4gICovCi0gIGNoYXIgc2hvcnRvcHQ7Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCAoTlVMTCBpZiBub25lKS4gICovCi0gIGNvbnN0IGNoYXIgKmFyZzsKLSAgLyogVGhlIGRvY3VtZW50YXRpb24gc3RyaW5nLiAgSWYgdGhpcyBpcyBOVUxMLCB0aGlzIGlzIGEgc3lub255bSBmb3IKLSAgICAgdGhlIHByZXZpb3VzIG9wdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKmRvYzsKLSAgZW51bQotICAgIHsKLSAgICAgIC8qIFVzZSBvbmUgZGFzaCBiZWZvcmUgbG9uZyBvcHRpb24gbmFtZS4gICovCi0gICAgICBPTkVfREFTSCwKLSAgICAgIC8qIFVzZSB0d28gZGFzaGVzIGJlZm9yZSBsb25nIG9wdGlvbiBuYW1lLiAgKi8KLSAgICAgIFRXT19EQVNIRVMsCi0gICAgICAvKiBEb24ndCBtZW50aW9uIHRoaXMgb3B0aW9uIGluIC0taGVscCBvdXRwdXQuICAqLwotICAgICAgTk9fSEVMUAotICAgIH0gY29udHJvbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbGRfb3B0aW9uIGxkX29wdGlvbnNbXSA9Ci17Ci0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdhJywgTl8oIktFWVdPUkQiKSwgTl8oIlNoYXJlZCBsaWJyYXJ5IGNvbnRyb2wgZm9yIEhQL1VYIGNvbXBhdGliaWxpdHkiKSwKLSAgICAgIE9ORV9EQVNIIH0sCi0gIHsgeyJhcmNoaXRlY3R1cmUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0EnfSwKLSAgICAgICdBJywgTl8oIkFSQ0giKSwgTl8oIlNldCBhcmNoaXRlY3R1cmUiKSAsIFRXT19EQVNIRVMgfSwKLSAgeyB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYid9LAotICAgICAgJ2InLCBOXygiVEFSR0VUIiksIE5fKCJTcGVjaWZ5IHRhcmdldCBmb3IgZm9sbG93aW5nIGlucHV0IGZpbGVzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im1yaS1zY3JpcHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2MnfSwKLSAgICAgICdjJywgTl8oIkZJTEUiKSwgTl8oIlJlYWQgTVJJIGZvcm1hdCBsaW5rZXIgc2NyaXB0IiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImRjIiwgbm9fYXJndW1lbnQsIE5VTEwsICdkJ30sCi0gICAgICAnZCcsIE5VTEwsIE5fKCJGb3JjZSBjb21tb24gc3ltYm9scyB0byBiZSBkZWZpbmVkIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJkcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZCd9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7ImVudHJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdlJ30sCi0gICAgICAnZScsIE5fKCJBRERSRVNTIiksIE5fKCJTZXQgc3RhcnQgYWRkcmVzcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJleHBvcnQtZHluYW1pYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUX0RZTkFNSUN9LAotICAgICAgJ0UnLCBOVUxMLCBOXygiRXhwb3J0IGFsbCBkeW5hbWljIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VCfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJMaW5rIGJpZy1lbmRpYW4gb2JqZWN0cyIpLCBPTkVfREFTSCB9LAotICB7IHsiRUwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VMfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJMaW5rIGxpdHRsZS1lbmRpYW4gb2JqZWN0cyIpLCBPTkVfREFTSCB9LAotICB7IHsiYXV4aWxpYXJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdmJ30sCi0gICAgICAnZicsIE5fKCJTSExJQiIpLCBOXygiQXV4aWxpYXJ5IGZpbHRlciBmb3Igc2hhcmVkIG9iamVjdCBzeW1ib2wgdGFibGUiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7ImZpbHRlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnRid9LAotICAgICAgJ0YnLCBOXygiU0hMSUIiKSwgTl8oIkZpbHRlciBmb3Igc2hhcmVkIG9iamVjdCBzeW1ib2wgdGFibGUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCi0gICAgICAnZycsIE5VTEwsIE5fKCJJZ25vcmVkIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJncHNpemUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0cnfSwKLSAgICAgICdHJywgTl8oIlNJWkUiKSwgTl8oIlNtYWxsIGRhdGEgc2l6ZSAoaWYgbm8gc2l6ZSwgc2FtZSBhcyAtLXNoYXJlZCkiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7InNvbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU09OQU1FfSwKLSAgICAgICdoJywgTl8oIkZJTEVOQU1FIiksIE5fKCJTZXQgaW50ZXJuYWwgbmFtZSBvZiBzaGFyZWQgbGlicmFyeSIpLCBPTkVfREFTSCB9LAotICB7IHsibGlicmFyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbCd9LAotICAgICAgJ2wnLCBOXygiTElCTkFNRSIpLCBOXygiU2VhcmNoIGZvciBsaWJyYXJ5IExJQk5BTUUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibGlicmFyeS1wYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdMJ30sCi0gICAgICAnTCcsIE5fKCJESVJFQ1RPUlkiKSwgTl8oIkFkZCBESVJFQ1RPUlkgdG8gbGlicmFyeSBzZWFyY2ggcGF0aCIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdtJywgTl8oIkVNVUxBVElPTiIpLCBOXygiU2V0IGVtdWxhdGlvbiIpLCBPTkVfREFTSCB9LAotICB7IHsicHJpbnQtbWFwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdNJ30sCi0gICAgICAnTScsIE5VTEwsIE5fKCJQcmludCBtYXAgZmlsZSBvbiBzdGFuZGFyZCBvdXRwdXQiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm1hZ2ljIiwgbm9fYXJndW1lbnQsIE5VTEwsICduJ30sCi0gICAgICAnbicsIE5VTEwsIE5fKCJEbyBub3QgcGFnZSBhbGlnbiBkYXRhIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im9tYWdpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnTid9LAotICAgICAgJ04nLCBOVUxMLCBOXygiRG8gbm90IHBhZ2UgYWxpZ24gZGF0YSwgZG8gbm90IG1ha2UgdGV4dCByZWFkb25seSIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsib3V0cHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdvJ30sCi0gICAgICAnbycsIE5fKCJGSUxFIiksIE5fKCJTZXQgb3V0cHV0IGZpbGUgbmFtZSIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdPJywgTlVMTCwgTl8oIk9wdGltaXplIG91dHB1dCBmaWxlIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJReSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJJZ25vcmVkIGZvciBTVlI0IGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7InJlbG9jYXRlYWJsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncid9LAotICAgICAgJ3InLCBOVUxMLCBOXygiR2VuZXJhdGUgcmVsb2NhdGVhYmxlIG91dHB1dCIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdpJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7Imp1c3Qtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnUid9LAotICAgICAgJ1InLCBOXygiRklMRSIpLCBOXygiSnVzdCBsaW5rIHN5bWJvbHMgKGlmIGRpcmVjdG9yeSwgc2FtZSBhcyAtLXJwYXRoKSIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsic3RyaXAtYWxsIiwgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCi0gICAgICAncycsIE5VTEwsIE5fKCJTdHJpcCBhbGwgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJzdHJpcC1kZWJ1ZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnUyd9LAotICAgICAgJ1MnLCBOVUxMLCBOXygiU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidHJhY2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ3QnfSwKLSAgICAgICd0JywgTlVMTCwgTl8oIlRyYWNlIGZpbGUgb3BlbnMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsic2NyaXB0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdUJ30sCi0gICAgICAnVCcsIE5fKCJGSUxFIiksIE5fKCJSZWFkIGxpbmtlciBzY3JpcHQiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidW5kZWZpbmVkIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd1J30sCi0gICAgICAndScsIE5fKCJTWU1CT0wiKSwgTl8oIlN0YXJ0IHdpdGggdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBTWU1CT0wiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiVXIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1VSfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJCdWlsZCBnbG9iYWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB0YWJsZXMiKSwgT05FX0RBU0ggfSwKLSAgeyB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUlNJT059LAotICAgICAgJ3YnLCBOVUxMLCBOXygiUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdWJywgTlVMTCwgTl8oIlByaW50IHZlcnNpb24gYW5kIGVtdWxhdGlvbiBpbmZvcm1hdGlvbiIpLCBPTkVfREFTSCB9LAotICB7IHsiZGlzY2FyZC1hbGwiLCBub19hcmd1bWVudCwgTlVMTCwgJ3gnfSwKLSAgICAgICd4JywgTlVMTCwgTl8oIkRpc2NhcmQgYWxsIGxvY2FsIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZGlzY2FyZC1sb2NhbHMiLCBub19hcmd1bWVudCwgTlVMTCwgJ1gnfSwKLSAgICAgICdYJywgTlVMTCwgTl8oIkRpc2NhcmQgdGVtcG9yYXJ5IGxvY2FsIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidHJhY2Utc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd5J30sCi0gICAgICAneScsIE5fKCJTWU1CT0wiKSwgTl8oIlRyYWNlIG1lbnRpb25zIG9mIFNZTUJPTCIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdZJywgTl8oIlBBVEgiKSwgTl8oIkRlZmF1bHQgc2VhcmNoIHBhdGggZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eSIpLCBPTkVfREFTSCB9LAotICB7IHtOVUxMLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCi0gICAgICAneicsIE5fKCJLRVlXT1JEIiksIE5fKCJJZ25vcmVkIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7InN0YXJ0LWdyb3VwIiwgbm9fYXJndW1lbnQsIE5VTEwsICcoJ30sCi0gICAgICAnKCcsIE5VTEwsIE5fKCJTdGFydCBhIGdyb3VwIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImVuZC1ncm91cCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnKSd9LAotICAgICAgJyknLCBOVUxMLCBOXygiRW5kIGEgZ3JvdXAiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiYXNzZXJ0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BU1NFUlR9LAotICAgICAgJ1wwJywgTl8oIktFWVdPUkQiKSwgTl8oIklnbm9yZWQgZm9yIFN1bk9TIGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7IkJkeW5hbWljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiTGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImR5Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsiY2FsbF9zaGFyZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NBTExfU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJCc3RhdGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJEbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImRuIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJub25fc2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJzdGF0aWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PTl9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7IkJzeW1ib2xpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1lNQk9MSUN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkJpbmQgZ2xvYmFsIHJlZmVyZW5jZXMgbG9jYWxseSIpLCBPTkVfREFTSCB9LAotICB7IHsiY2hlY2stc2VjdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NIRUNLX1NFQ1RJT05TfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJDaGVjayBzZWN0aW9uIGFkZHJlc3NlcyBmb3Igb3ZlcmxhcHMgKGRlZmF1bHQpIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im5vLWNoZWNrLXNlY3Rpb25zIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19DSEVDS19TRUNUSU9OU30sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiRG8gbm90IGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsiY3JlZiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ1JFRn0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiT3V0cHV0IGNyb3NzIHJlZmVyZW5jZSB0YWJsZSIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJkZWZzeW0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFRlNZTX0sCi0gICAgICAnXDAnLCBOXygiU1lNQk9MPUVYUFJFU1NJT04iKSwgTl8oIkRlZmluZSBhIHN5bWJvbCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJkZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fREVNQU5HTEV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkRlbWFuZ2xlIHN5bWJvbCBuYW1lcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJkeW5hbWljLWxpbmtlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRFlOQU1JQ19MSU5LRVJ9LAotICAgICAgJ1wwJywgTl8oIlBST0dSQU0iKSwgTl8oIlNldCB0aGUgZHluYW1pYyBsaW5rZXIgdG8gdXNlIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImVtYmVkZGVkLXJlbG9jcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU1CRURERURfUkVMT0NTfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJHZW5lcmF0ZSBlbWJlZGRlZCByZWxvY3MiKSwgVFdPX0RBU0hFU30sCi0gIHsgeyJmaW5pIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9GSU5JfSwKLSAgICAgJ1wwJywgTl8oIlNZTUJPTCIpLCBOXygiQ2FsbCBTWU1CT0wgYXQgdW5sb2FkLXRpbWUiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImZvcmNlLWV4ZS1zdWZmaXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0ZPUkNFX0VYRV9TVUZGSVh9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkZvcmNlIGdlbmVyYXRpb24gb2YgZmlsZSB3aXRoIC5leGUgc3VmZml4IiksIFRXT19EQVNIRVN9LAotICB7IHsiZ2Mtc2VjdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0dDX1NFQ1RJT05TfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJSZW1vdmUgdW51c2VkIHNlY3Rpb25zIChvbiBzb21lIHRhcmdldHMpIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJuby1nYy1zZWN0aW9ucyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fR0NfU0VDVElPTlN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkRvbid0IHJlbW92ZSB1bnVzZWQgc2VjdGlvbnMgKGRlZmF1bHQpIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IRUxQfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJQcmludCBvcHRpb24gaGVscCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJpbml0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTklUfSwKLSAgICAgJ1wwJywgTl8oIlNZTUJPTCIpLCBOXygiQ2FsbCBTWU1CT0wgYXQgbG9hZC10aW1lIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJNYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BUH0sCi0gICAgICAnXDAnLCBOXygiRklMRSIpLCBOXygiV3JpdGUgYSBtYXAgZmlsZSIpLCBPTkVfREFTSCB9LAotICB7IHsibm8tZGVtYW5nbGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0RFTUFOR0xFIH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiRG8gbm90IGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJuby1rZWVwLW1lbW9yeSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fS0VFUF9NRU1PUll9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlVzZSBsZXNzIG1lbW9yeSBhbmQgbW9yZSBkaXNrIEkvTyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJuby11bmRlZmluZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1VOREVGSU5FRH0sCi0gICAgICdcMCcsIE5VTEwsIE5fKCJBbGxvdyBubyB1bmRlZmluZWQgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJuby13YXJuLW1pc21hdGNoIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19XQVJOX01JU01BVENIfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJEb24ndCB3YXJuIGFib3V0IG1pc21hdGNoZWQgaW5wdXQgZmlsZXMiKSwgVFdPX0RBU0hFU30sCi0gIHsgeyJuby13aG9sZS1hcmNoaXZlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19XSE9MRV9BUkNISVZFfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJUdXJuIG9mZiAtLXdob2xlLWFyY2hpdmUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm9pbmhpYml0LWV4ZWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PSU5ISUJJVF9FWEVDfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJDcmVhdGUgYW4gb3V0cHV0IGZpbGUgZXZlbiBpZiBlcnJvcnMgb2NjdXIiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm9pbmhpYml0X2V4ZWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PSU5ISUJJVF9FWEVDfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE5PX0hFTFAgfSwKLSAgeyB7Im9mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09GT1JNQVR9LAotICAgICAgJ1wwJywgTl8oIlRBUkdFVCIpLCBOXygiU3BlY2lmeSB0YXJnZXQgb2Ygb3V0cHV0IGZpbGUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsicW1hZ2ljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIklnbm9yZWQgZm9yIExpbnV4IGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7InJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiUmVsYXggYnJhbmNoZXMgb24gY2VydGFpbiB0YXJnZXRzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InJldGFpbi1zeW1ib2xzLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwKLSAgICAgICBPUFRJT05fUkVUQUlOX1NZTUJPTFNfRklMRX0sCi0gICAgICAnXDAnLCBOXygiRklMRSIpLCBOXygiS2VlcCBvbmx5IHN5bWJvbHMgbGlzdGVkIGluIEZJTEUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsicnBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JQQVRIfSwKLSAgICAgICdcMCcsIE5fKCJQQVRIIiksIE5fKCJTZXQgcnVudGltZSBzaGFyZWQgbGlicmFyeSBzZWFyY2ggcGF0aCIpLCBPTkVfREFTSCB9LAotICB7IHsicnBhdGgtbGluayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUlBBVEhfTElOS30sCi0gICAgICAnXDAnLCBOXygiUEFUSCIpLCBOXygiU2V0IGxpbmsgdGltZSBzaGFyZWQgbGlicmFyeSBzZWFyY2ggcGF0aCIpLCBPTkVfREFTSCB9LAotICB7IHsic2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IiksIE9ORV9EQVNIIH0sCi0gIHsgeyJCc2hhcmVhYmxlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSEFSRUQgfSwgLyogRnJlZUJTRC4gICovCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsic29ydC1jb21tb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NPUlRfQ09NTU9OfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJTb3J0IGNvbW1vbiBzeW1ib2xzIGJ5IHNpemUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsic29ydF9jb21tb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NPUlRfQ09NTU9OfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE5PX0hFTFAgfSwKLSAgeyB7InNwbGl0LWJ5LWZpbGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NQTElUX0JZX0ZJTEV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBmb3IgZWFjaCBmaWxlIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InNwbGl0LWJ5LXJlbG9jIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TUExJVF9CWV9SRUxPQ30sCi0gICAgICAnXDAnLCBOXygiQ09VTlQiKSwgTl8oIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBldmVyeSBDT1VOVCByZWxvY3MiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsic3RhdHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUQVRTfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJQcmludCBtZW1vcnkgdXNhZ2Ugc3RhdGlzdGljcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ0YXNrLWxpbmsiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RBU0tfTElOS30sCi0gICAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJEbyB0YXNrIGxldmVsIGxpbmtpbmciKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidHJhZGl0aW9uYWwtZm9ybWF0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVR9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgbGlua2VyIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7IlRic3MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RCU1N9LAotICAgICAgJ1wwJywgTl8oIkFERFJFU1MiKSwgTl8oIlNldCBhZGRyZXNzIG9mIC5ic3Mgc2VjdGlvbiIpLCBPTkVfREFTSCB9LAotICB7IHsiVGRhdGEiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1REQVRBfSwKLSAgICAgICdcMCcsIE5fKCJBRERSRVNTIiksIE5fKCJTZXQgYWRkcmVzcyBvZiAuZGF0YSBzZWN0aW9uIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJUdGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFRFWFR9LAotICAgICAgJ1wwJywgTl8oIkFERFJFU1MiKSwgTl8oIlNldCBhZGRyZXNzIG9mIC50ZXh0IHNlY3Rpb24iKSwgT05FX0RBU0ggfSwKLSAgeyB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUkJPU0V9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIk91dHB1dCBsb3RzIG9mIGluZm9ybWF0aW9uIGR1cmluZyBsaW5rIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImRsbC12ZXJib3NlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WRVJCT1NFfSwgLyogTGludXguICAqLwotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgTk9fSEVMUCB9LAotICB7IHsidmVyc2lvbi1zY3JpcHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUlNJT05fU0NSSVBUIH0sCi0gICAgICAnXDAnLCBOXygiRklMRSIpLCBOXygiUmVhZCB2ZXJzaW9uIGluZm9ybWF0aW9uIHNjcmlwdCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ2ZXJzaW9uLWV4cG9ydHMtc2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLAotICAgICBPUFRJT05fVkVSU0lPTl9FWFBPUlRTX1NFQ1RJT04gfSwKLSAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJUYWtlIGV4cG9ydCBzeW1ib2xzIGxpc3QgZnJvbSAuZXhwb3J0cywgdXNpbmdcblx0XHRcdFx0U1lNQk9MIGFzIHRoZSB2ZXJzaW9uLiIpLAotICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Indhcm4tY29tbW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX0NPTU1PTn0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiV2FybiBhYm91dCBkdXBsaWNhdGUgY29tbW9uIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsid2Fybi1jb25zdHJ1Y3RvcnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fQ09OU1RSVUNUT1JTfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJXYXJuIGlmIGdsb2JhbCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgYXJlIHNlZW4iKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Indhcm4tbXVsdGlwbGUtZ3AiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fTVVMVElQTEVfR1B9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIldhcm4gaWYgdGhlIG11bHRpcGxlIEdQIHZhbHVlcyBhcmUgdXNlZCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ3YXJuLW9uY2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fT05DRX0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiV2FybiBvbmx5IG9uY2UgcGVyIHVuZGVmaW5lZCBzeW1ib2wiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsid2Fybi1zZWN0aW9uLWFsaWduIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR059LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIldhcm4gaWYgc3RhcnQgb2Ygc2VjdGlvbiBjaGFuZ2VzIGR1ZSB0byBhbGlnbm1lbnQiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Indob2xlLWFyY2hpdmUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dIT0xFX0FSQ0hJVkV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkluY2x1ZGUgYWxsIG9iamVjdHMgZnJvbSBmb2xsb3dpbmcgYXJjaGl2ZXMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsid3JhcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV1JBUH0sCi0gICAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJVc2Ugd3JhcHBlciBmdW5jdGlvbnMgZm9yIFNZTUJPTCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJtcGM4NjBjMCIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTVBDODYwQzB9LAotICAgICAgJ1wwJywgTl8oIls9V09SRFNdIiksIE5fKCJNb2RpZnkgcHJvYmxlbWF0aWMgYnJhbmNoZXMgaW4gbGFzdCBXT1JEUyAoMS0xMCxcblx0XHRcdFx0ZGVmYXVsdCA1KSB3b3JkcyBvZiBhIHBhZ2UiKSwgVFdPX0RBU0hFUyB9Ci19OwotCi0jZGVmaW5lIE9QVElPTl9DT1VOVCAoKGludCkgKHNpemVvZiBsZF9vcHRpb25zIC8gc2l6ZW9mIGxkX29wdGlvbnNbMF0pKQotCi0vKiBUZXN0IFNUUklORyBmb3IgY29udGFpbmluZyBhIHN0cmluZyBvZiBkaWdpdHMgdGhhdCBmb3JtIGEgbnVtYmVyCi0gICBiZXR3ZWVuIE1JTiBhbmQgTUFYLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9yIEVSUi4gICovCi0KLXN0YXRpYyBpbnQKLWlzX251bSAoc3RyaW5nLCBtaW4sIG1heCwgZXJyKQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGludCBtaW47Ci0gICAgIGludCBtYXg7Ci0gICAgIGludCBlcnI7Ci17Ci0gIGludCByZXN1bHQgPSAwOwotCi0gIGZvciAoOyAqc3RyaW5nOyArK3N0cmluZykKLSAgICB7Ci0gICAgICBpZiAoISBpc2RpZ2l0ICgqc3RyaW5nKSkKLQl7Ci0JICByZXN1bHQgPSBlcnI7Ci0JICBicmVhazsKLQl9Ci0gICAgICByZXN1bHQgPSByZXN1bHQgKiAxMCArICgqc3RyaW5nIC0gJzAnKTsKLSAgICB9Ci0gIGlmIChyZXN1bHQgPCBtaW4gfHwgcmVzdWx0ID4gbWF4KQotICAgIHJlc3VsdCA9IGVycjsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkCi1wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBpLCBpcywgaWw7Ci0gIGludCBpbmdyb3VwID0gMDsKLSAgY2hhciAqZGVmYXVsdF9kaXJsaXN0ID0gTlVMTDsKLSAgY2hhciBzaG9ydG9wdHNbT1BUSU9OX0NPVU5UICogMyArIDJdOwotICBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW09QVElPTl9DT1VOVCArIDFdOwotICBpbnQgbGFzdF9vcHRpbmQ7Ci0KLSAgLyogU3RhcnRpbmcgdGhlIHNob3J0IG9wdGlvbiBzdHJpbmcgd2l0aCAnLScgaXMgZm9yIHByb2dyYW1zIHRoYXQKLSAgICAgZXhwZWN0IG9wdGlvbnMgYW5kIG90aGVyIEFSR1YtZWxlbWVudHMgaW4gYW55IG9yZGVyIGFuZCB0aGF0IGNhcmUgYWJvdXQKLSAgICAgdGhlIG9yZGVyaW5nIG9mIHRoZSB0d28uICBXZSBkZXNjcmliZSBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50Ci0gICAgIGFzIGlmIGl0IHdlcmUgdGhlIGFyZ3VtZW50IG9mIGFuIG9wdGlvbiB3aXRoIGNoYXJhY3RlciBjb2RlIDEuICAqLwotICBzaG9ydG9wdHNbMF0gPSAnLSc7Ci0gIGlzID0gMTsKLSAgaWwgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgT1BUSU9OX0NPVU5UOyBpKyspCi0gICAgewotICAgICAgaWYgKGxkX29wdGlvbnNbaV0uc2hvcnRvcHQgIT0gJ1wwJykKLQl7Ci0JICBzaG9ydG9wdHNbaXNdID0gbGRfb3B0aW9uc1tpXS5zaG9ydG9wdDsKLQkgICsraXM7Ci0JICBpZiAobGRfb3B0aW9uc1tpXS5vcHQuaGFzX2FyZyA9PSByZXF1aXJlZF9hcmd1bWVudAotCSAgICAgIHx8IGxkX29wdGlvbnNbaV0ub3B0Lmhhc19hcmcgPT0gb3B0aW9uYWxfYXJndW1lbnQpCi0JICAgIHsKLQkgICAgICBzaG9ydG9wdHNbaXNdID0gJzonOwotCSAgICAgICsraXM7Ci0JICAgICAgaWYgKGxkX29wdGlvbnNbaV0ub3B0Lmhhc19hcmcgPT0gb3B0aW9uYWxfYXJndW1lbnQpCi0JCXsKLQkJICBzaG9ydG9wdHNbaXNdID0gJzonOwotCQkgICsraXM7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGlmIChsZF9vcHRpb25zW2ldLm9wdC5uYW1lICE9IE5VTEwpCi0JewotCSAgbG9uZ29wdHNbaWxdID0gbGRfb3B0aW9uc1tpXS5vcHQ7Ci0JICArK2lsOwotCX0KLSAgICB9Ci0gIHNob3J0b3B0c1tpc10gPSAnXDAnOwotICBsb25nb3B0c1tpbF0ubmFtZSA9IE5VTEw7Ci0KLSAgLyogVGhlIC1HIG9wdGlvbiBpcyBhbWJpZ3VvdXMgb24gZGlmZmVyZW50IHBsYXRmb3Jtcy4gIFNvbWV0aW1lcyBpdAotICAgICBzcGVjaWZpZXMgdGhlIGxhcmdlc3QgZGF0YSBzaXplIHRvIHB1dCBpbnRvIHRoZSBzbWFsbCBkYXRhCi0gICAgIHNlY3Rpb24uICBTb21ldGltZXMgaXQgaXMgZXF1aXZhbGVudCB0byAtLXNoYXJlZC4gIFVuZm9ydHVuYXRlbHksCi0gICAgIHRoZSBmaXJzdCBmb3JtIHRha2VzIGFuIGFyZ3VtZW50LCB3aGlsZSB0aGUgc2Vjb25kIGRvZXMgbm90LgotCi0gICAgIFdlIG5lZWQgdG8gcGVybWl0IHRoZSAtLXNoYXJlZCBmb3JtIGJlY2F1c2Ugb24gc29tZSBwbGF0Zm9ybXMsCi0gICAgIHN1Y2ggYXMgU29sYXJpcywgZ2NjIC1zaGFyZWQgd2lsbCBwYXNzIC1HIHRvIHRoZSBsaW5rZXIuCi0KLSAgICAgVG8gcGVybWl0IGVpdGhlciB1c2FnZSwgd2UgbG9vayB0aHJvdWdoIHRoZSBhcmd1bWVudCBsaXN0LiAgSWYgd2UKLSAgICAgZmluZCAtRyBub3QgZm9sbG93ZWQgYnkgYSBudW1iZXIsIHdlIGNoYW5nZSBpdCBpbnRvIC0tc2hhcmVkLgotICAgICBUaGlzIHdpbGwgd29yayBmb3IgbW9zdCBub3JtYWwgY2FzZXMuICAqLwotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItRyIpID09IDAKLQkmJiAoaSArIDEgPj0gYXJnYwotCSAgICB8fCAhIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBhcmd2W2kgKyAxXVswXSkpKQotICAgICAgYXJndltpXSA9IChjaGFyICopICItLXNoYXJlZCI7Ci0KLSAgLyogQmVjYXVzZSB3ZSBwZXJtaXQgbG9uZyBvcHRpb25zIHRvIHN0YXJ0IHdpdGggYSBzaW5nbGUgZGFzaCwgYW5kCi0gICAgIHdlIGhhdmUgYSAtLWxpYnJhcnkgb3B0aW9uLCBhbmQgdGhlIC1sIG9wdGlvbiBpcyBjb252ZW50aW9uYWxseQotICAgICB1c2VkIHdpdGggYW4gaW1tZWRpYXRlbHkgZm9sbG93aW5nIGFyZ3VtZW50LCB3ZSBjYW4gaGF2ZSBiYWQKLSAgICAgcmVzdWx0cyBpZiBzb21lYm9keSB0cmllcyB0byB1c2UgLWwgd2l0aCBhIGxpYnJhcnkgd2hvc2UgbmFtZQotICAgICBoYXBwZW5zIHRvIHN0YXJ0IHdpdGggImlicmFyeSIsIGFzIGluIC1saS4gIFdlIGF2b2lkIHByb2JsZW1zIGJ5Ci0gICAgIHNpbXBseSB0dXJuaW5nIC1sIGludG8gLS1saWJyYXJ5LiAgVGhpcyBtZWFucyB0aGF0IHVzZXJzIHdpbGwKLSAgICAgaGF2ZSB0byB1c2UgdHdvIGRhc2hlcyBpbiBvcmRlciB0byB1c2UgLS1saWJyYXJ5LCB3aGljaCBpcyBPSwotICAgICBzaW5jZSB0aGF0J3MgaG93IGl0IGlzIGRvY3VtZW50ZWQuCi0KLSAgICAgRklYTUU6IEl0J3MgcG9zc2libGUgdGhhdCB0aGlzIHByb2JsZW0gY2FuIGFyaXNlIGZvciBvdGhlciBzaG9ydAotICAgICBvcHRpb25zIGFzIHdlbGwsIGFsdGhvdWdoIHRoZSB1c2VyIGRvZXMgYWx3YXlzIGhhdmUgdGhlIHJlY291cnNlCi0gICAgIG9mIGFkZGluZyBhIHNwYWNlIGJldHdlZW4gdGhlIG9wdGlvbiBhbmQgdGhlIGFyZ3VtZW50LiAgKi8KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYXJndltpXVswXSA9PSAnLScKLQkgICYmIGFyZ3ZbaV1bMV0gPT0gJ2wnCi0JICAmJiBhcmd2W2ldWzJdICE9ICdcMCcpCi0JewotCSAgY2hhciAqbjsKLQotCSAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoYXJndltpXSkgKyAyMCk7Ci0JICBzcHJpbnRmIChuLCAiLS1saWJyYXJ5PSVzIiwgYXJndltpXSArIDIpOwotCSAgYXJndltpXSA9IG47Ci0JfQotICAgIH0KLQotICBsYXN0X29wdGluZCA9IC0xOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgbG9uZ2luZDsKLSAgICAgIGludCBvcHRjOwotCi0gICAgICAvKiBVc2luZyBsYXN0X29wdGluZCBsZXRzIHVzIGF2b2lkIGNhbGxpbmcgbGRlbXVsX3BhcnNlX2FyZ3MKLQkgbXVsdGlwbGUgdGltZXMgb24gYSBzaW5nbGUgb3B0aW9uLCB3aGljaCB3b3VsZCBsZWFkIHRvCi0JIGNvbmZ1c2lvbiBpbiB0aGUgaW50ZXJuYWwgc3RhdGljIHZhcmlhYmxlcyBtYWludGFpbmVkIGJ5Ci0JIGdldG9wdC4gIFRoaXMgY291bGQgb3RoZXJ3aXNlIGhhcHBlbiBmb3IgYW4gYXJndW1lbnQgbGlrZQotCSAtbngsIGluIHdoaWNoIHRoZSAtbiBpcyBwYXJzZWQgYXMgYSBzaW5nbGUgb3B0aW9uLCBhbmQgd2UKLQkgbG9vcCBhcm91bmQgdG8gcGljayB1cCB0aGUgLXguICAqLwotICAgICAgaWYgKG9wdGluZCAhPSBsYXN0X29wdGluZCkKLQl7Ci0JICBpZiAobGRlbXVsX3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpKQotCSAgICBjb250aW51ZTsKLQkgIGxhc3Rfb3B0aW5kID0gb3B0aW5kOwotCX0KLQotICAgICAgLyogZ2V0b3B0X2xvbmdfb25seSBpcyBsaWtlIGdldG9wdF9sb25nLCBidXQgJy0nIGFzIHdlbGwgYXMgJy0tJwotCSBjYW4gaW5kaWNhdGUgYSBsb25nIG9wdGlvbi4gICovCi0gICAgICBvcHRjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgc2hvcnRvcHRzLCBsb25nb3B0cywgJmxvbmdpbmQpOwotCi0gICAgICBpZiAob3B0YyA9PSAtMSkKLQlicmVhazsKLSAgICAgIHN3aXRjaCAob3B0YykKLQl7Ci0JZGVmYXVsdDoKLQkgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgXygiJXM6IHVzZSB0aGUgLS1oZWxwIG9wdGlvbiBmb3IgdXNhZ2UgaW5mb3JtYXRpb25cbiIpLAotCQkgICBwcm9ncmFtX25hbWUpOwotCSAgeGV4aXQgKDEpOwotCWNhc2UgMToJCQkvKiBGaWxlIG5hbWUuICAqLwotCSAgbGFuZ19hZGRfaW5wdXRfZmlsZSAob3B0YXJnLCBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtLAotCQkJICAgICAgIChjaGFyICopIE5VTEwpOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9JR05PUkU6Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIC8qIEZvciBIUC9VWCBjb21wYXRpYmlsaXR5LiAgQWN0dWFsbHkgLWEgc2hhcmVkIHNob3VsZCBtZWFuCi0gICAgICAgICAgICAgYGB1c2Ugb25seSBzaGFyZWQgbGlicmFyaWVzJycgYnV0LCB0aGVuLCB3ZSBkb24ndAotICAgICAgICAgICAgIGN1cnJlbnRseSBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgb24gSFAvVVggYW55aG93LiAgKi8KLQkgIGlmIChzdHJjbXAgKG9wdGFyZywgImFyY2hpdmUiKSA9PSAwKQotCSAgICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgInNoYXJlZCIpID09IDAKLQkJICAgfHwgc3RyY21wIChvcHRhcmcsICJkZWZhdWx0IikgPT0gMCkKLQkgICAgY29uZmlnLmR5bmFtaWNfbGluayA9IHRydWU7Ci0JICBlbHNlCi0JICAgIGVpbmZvIChfKCIlUCVGOiB1bnJlY29nbml6ZWQgLWEgb3B0aW9uIGAlcydcbiIpLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQVNTRVJUOgotCSAgLyogRklYTUU6IFdlIGp1c3QgaWdub3JlIHRoZXNlLCBidXQgd2Ugc2hvdWxkIGhhbmRsZSB0aGVtLiAgKi8KLQkgIGlmIChzdHJjbXAgKG9wdGFyZywgImRlZmluaXRpb25zIikgPT0gMCkKLQkgICAgOwotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJub2RlZmluaXRpb25zIikgPT0gMCkKLQkgICAgOwotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJub3N5bWJvbGljIikgPT0gMCkKLQkgICAgOwotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJwdXJlLXRleHQiKSA9PSAwKQotCSAgICA7Ci0JICBlbHNlCi0JICAgIGVpbmZvIChfKCIlUCVGOiB1bnJlY29nbml6ZWQgLWFzc2VydCBvcHRpb24gYCVzJ1xuIiksIG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdBJzoKLQkgIGxkZmlsZV9hZGRfYXJjaCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgbGFuZ19hZGRfdGFyZ2V0IChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JICBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKG9wdGFyZyk7Ci0JICBwYXJzZXJfaW5wdXQgPSBpbnB1dF9tcmlfc2NyaXB0OwotCSAgeXlwYXJzZSAoKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NBTExfU0hBUkVEOgotCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT05fU0hBUkVEOgotCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQ1JFRjoKLQkgIGNvbW1hbmRfbGluZS5jcmVmID0gdHJ1ZTsKLQkgIGxpbmtfaW5mby5ub3RpY2VfYWxsID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgY29tbWFuZF9saW5lLmZvcmNlX2NvbW1vbl9kZWZpbml0aW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RFRlNZTToKLQkgIGxleF9zdHJpbmcgPSBvcHRhcmc7Ci0JICBsZXhfcmVkaXJlY3QgKG9wdGFyZyk7Ci0JICBwYXJzZXJfaW5wdXQgPSBpbnB1dF9kZWZzeW07Ci0JICBwYXJzaW5nX2RlZnN5bSA9IDE7Ci0JICB5eXBhcnNlICgpOwotCSAgcGFyc2luZ19kZWZzeW0gPSAwOwotCSAgbGV4X3N0cmluZyA9IE5VTEw7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ERU1BTkdMRToKLQkgIGRlbWFuZ2xpbmcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRFlOQU1JQ19MSU5LRVI6Ci0JICBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9FQjoKLQkgIGNvbW1hbmRfbGluZS5lbmRpYW4gPSBFTkRJQU5fQklHOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRUw6Ci0JICBjb21tYW5kX2xpbmUuZW5kaWFuID0gRU5ESUFOX0xJVFRMRTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VNQkVEREVEX1JFTE9DUzoKLQkgIGNvbW1hbmRfbGluZS5lbWJlZGRlZF9yZWxvY3MgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRVhQT1JUX0RZTkFNSUM6Ci0JY2FzZSAnRSc6IC8qIEhQL1VYIGNvbXBhdGliaWxpdHkuICAqLwotCSAgY29tbWFuZF9saW5lLmV4cG9ydF9keW5hbWljID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgbGFuZ19hZGRfZW50cnkgKG9wdGFyZywgdHJ1ZSk7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIGlmIChjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVycyA9Ci0JCShjaGFyICoqKSB4bWFsbG9jICgyICogc2l6ZW9mIChjaGFyICopKTsKLQkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnNbMF0gPSBvcHRhcmc7Ci0JICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzWzFdID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IGM7Ci0JICAgICAgY2hhciAqKnA7Ci0KLQkgICAgICBjID0gMDsKLQkgICAgICBmb3IgKHAgPSBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnM7ICpwICE9IE5VTEw7IHArKykKLQkJKytjOwotCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVycyA9Ci0JCShjaGFyICoqKSB4cmVhbGxvYyAoY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzLAotCQkJCSAgICAoYyArIDIpICogc2l6ZW9mIChjaGFyICopKTsKLQkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnNbY10gPSBvcHRhcmc7Ci0JICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzW2MgKyAxXSA9IE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ0YnOgotCSAgY29tbWFuZF9saW5lLmZpbHRlcl9zaGxpYiA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0ZPUkNFX0VYRV9TVUZGSVg6Ci0JICBjb21tYW5kX2xpbmUuZm9yY2VfZXhlX3N1ZmZpeCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdHJzoKLQkgIHsKLQkgICAgY2hhciAqZW5kOwotCSAgICBnX3N3aXRjaF92YWx1ZSA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0JICAgIGlmICgqZW5kKQotCSAgICAgIGVpbmZvIChfKCIlUCVGOiBpbnZhbGlkIG51bWJlciBgJXMnXG4iKSwgb3B0YXJnKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgotCSAgLyogSWdub3JlLiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0dDX1NFQ1RJT05TOgotCSAgY29tbWFuZF9saW5lLmdjX3NlY3Rpb25zID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0hFTFA6Ci0JICBoZWxwICgpOwotCSAgeGV4aXQgKDApOwotCSAgYnJlYWs7Ci0JY2FzZSAnTCc6Ci0JICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAob3B0YXJnLCB0cnVlKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgbGFuZ19hZGRfaW5wdXRfZmlsZSAob3B0YXJnLCBsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLAotCQkJICAgICAgIChjaGFyICopIE5VTEwpOwotCSAgYnJlYWs7Ci0JY2FzZSAnTSc6Ci0JICBjb25maWcubWFwX2ZpbGVuYW1lID0gIi0iOwotCSAgYnJlYWs7Ci0JY2FzZSAnbSc6Ci0JICAvKiBJZ25vcmUuICBXYXMgaGFuZGxlZCBpbiBhIHByZS1wYXJzZS4gICAqLwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTUFQOgotCSAgY29uZmlnLm1hcF9maWxlbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ04nOgotCSAgY29uZmlnLnRleHRfcmVhZF9vbmx5ID0gZmFsc2U7Ci0JICBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkID0gZmFsc2U7Ci0JICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICduJzoKLQkgIGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgPSBmYWxzZTsKLQkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0RFTUFOR0xFOgotCSAgZGVtYW5nbGluZyA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fR0NfU0VDVElPTlM6Ci0JICBjb21tYW5kX2xpbmUuZ2Nfc2VjdGlvbnMgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0tFRVBfTUVNT1JZOgotCSAgbGlua19pbmZvLmtlZXBfbWVtb3J5ID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19VTkRFRklORUQ6Ci0JICBsaW5rX2luZm8ubm9fdW5kZWZpbmVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX1dBUk5fTUlTTUFUQ0g6Ci0JICBjb21tYW5kX2xpbmUud2Fybl9taXNtYXRjaCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9JTkhJQklUX0VYRUM6Ci0JICBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fV0hPTEVfQVJDSElWRToKLQkgIHdob2xlX2FyY2hpdmUgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJ08nOgotCSAgLyogRklYTUUgIi1PPG5vbi1kaWdpdHM+IDx2YWx1ZT4iIHVzZWQgdG8gc2V0IHRoZSBhZGRyZXNzIG9mCi0JICAgICBzZWN0aW9uIDxub24tZGlnaXRzPi4gIFdhcyB0aGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLQkgICAgIHNvbWV0aGluZywgb3IgY2FuIHdlIGNyZWF0ZSBhIG5ldyBvcHRpb24gdG8gZG8gdGhhdAotCSAgICAgKHdpdGggYSBzeW50YXggc2ltaWxhciB0byAtZGVmc3ltKT8KLQkgICAgIGdldG9wdCBjYW4ndCBoYW5kbGUgdHdvIGFyZ3MgdG8gYW4gb3B0aW9uIHdpdGhvdXQga2x1ZGdlcy4gICovCi0KLQkgIC8qIEVuYWJsZSBvcHRpbWl6YXRpb25zIG9mIG91dHB1dCBmaWxlcy4gICovCi0JICBsaW5rX2luZm8ub3B0aW1pemUgPSBzdHJ0b3VsIChvcHRhcmcsIE5VTEwsIDApID8gdHJ1ZSA6IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JICBsYW5nX2FkZF9vdXRwdXQgKG9wdGFyZywgMCk7IAotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fT0ZPUk1BVDoKLQkgIGxhbmdfYWRkX291dHB1dF9mb3JtYXQgKG9wdGFyZywgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTCwgMCk7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQljYXNlICdyJzoKLQkgIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSB0cnVlOwotCSAgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9IGZhbHNlOwotCSAgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCA9IGZhbHNlOwotCSAgY29uZmlnLnRleHRfcmVhZF9vbmx5ID0gZmFsc2U7Ci0JICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICdSJzoKLQkgIC8qIFRoZSBHTlUgbGlua2VyIHRyYWRpdGlvbmFsbHkgdXNlcyAtUiB0byBtZWFuIHRvIGluY2x1ZGUKLQkgICAgIG9ubHkgdGhlIHN5bWJvbHMgZnJvbSBhIGZpbGUuICBUaGUgU29sYXJpcyBsaW5rZXIgdXNlcyAtUgotCSAgICAgdG8gc2V0IHRoZSBwYXRoIHVzZWQgYnkgdGhlIHJ1bnRpbWUgbGlua2VyIHRvIGZpbmQKLQkgICAgIGxpYnJhcmllcy4gIFRoaXMgaXMgdGhlIEdOVSBsaW5rZXIgLXJwYXRoIGFyZ3VtZW50LiAgV2UKLQkgICAgIHRyeSB0byBzdXBwb3J0IGJvdGggc2ltdWx0YW5lb3VzbHkgYnkgY2hlY2tpbmcgdGhlIGZpbGUKLQkgICAgIG5hbWVkLiAgSWYgaXQgaXMgYSBkaXJlY3RvcnksIHJhdGhlciB0aGFuIGEgcmVndWxhciBmaWxlLAotCSAgICAgd2UgYXNzdW1lIC1ycGF0aCB3YXMgbWVhbnQuICAqLwotCSAgewotCSAgICBzdHJ1Y3Qgc3RhdCBzOwotCi0JICAgIGlmIChzdGF0IChvcHRhcmcsICZzKSA+PSAwCi0JCSYmICEgU19JU0RJUiAocy5zdF9tb2RlKSkKLQkgICAgICB7Ci0JCWxhbmdfYWRkX2lucHV0X2ZpbGUgKG9wdGFyZywKLQkJCQkgICAgIGxhbmdfaW5wdXRfZmlsZV9pc19zeW1ib2xzX29ubHlfZW51bSwKLQkJCQkgICAgIChjaGFyICopIE5VTEwpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgT1BUSU9OX1JQQVRIOgotCSAgaWYgKGNvbW1hbmRfbGluZS5ycGF0aCA9PSBOVUxMKQotCSAgICBjb21tYW5kX2xpbmUucnBhdGggPSBidXlzdHJpbmcgKG9wdGFyZyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzaXplX3QgcnBhdGhfbGVuID0gc3RybGVuIChjb21tYW5kX2xpbmUucnBhdGgpOwotCSAgICAgIHNpemVfdCBvcHRhcmdfbGVuID0gc3RybGVuIChvcHRhcmcpOwotCSAgICAgIGNoYXIgKmJ1ZjsKLQkgICAgICBjaGFyICpjcCA9IGNvbW1hbmRfbGluZS5ycGF0aDsKLQotCSAgICAgIC8qIEZpcnN0IHNlZSB3aGV0aGVyIE9QVEFSRyBpcyBhbHJlYWR5IGluIHRoZSBwYXRoLiAgKi8KLQkgICAgICBkbwotCQl7Ci0JCSAgc2l6ZV90IGlkeCA9IDA7Ci0JCSAgd2hpbGUgKG9wdGFyZ1tpZHhdICE9ICdcMCcgJiYgb3B0YXJnW2lkeF0gPT0gY3BbaWR4XSkKLQkJICAgICsraWR4OwotCQkgIGlmIChvcHRhcmdbaWR4XSA9PSAnXDAnCi0JCSAgICAgICYmIChjcFtpZHhdID09ICdcMCcgfHwgY3BbaWR4XSA9PSAnOicpKQotCQkgICAgLyogV2UgZm91bmQgaXQuICAqLwotCQkgICAgYnJlYWs7Ci0KLQkJICAvKiBOb3QgeWV0IGZvdW5kLiAgKi8KLQkJICBjcCA9IHN0cmNociAoY3AsICc6Jyk7Ci0JCSAgaWYgKGNwICE9IE5VTEwpCi0JCSAgICArK2NwOwotCQl9Ci0JICAgICAgd2hpbGUgKGNwICE9IE5VTEwpOwotCi0JICAgICAgaWYgKGNwID09IE5VTEwpCi0JCXsKLQkJICBidWYgPSB4bWFsbG9jIChycGF0aF9sZW4gKyBvcHRhcmdfbGVuICsgMik7Ci0JCSAgc3ByaW50ZiAoYnVmLCAiJXM6JXMiLCBjb21tYW5kX2xpbmUucnBhdGgsIG9wdGFyZyk7Ci0JCSAgZnJlZSAoY29tbWFuZF9saW5lLnJwYXRoKTsKLQkJICBjb21tYW5kX2xpbmUucnBhdGggPSBidWY7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fUlBBVEhfTElOSzoKLQkgIGlmIChjb21tYW5kX2xpbmUucnBhdGhfbGluayA9PSBOVUxMKQotCSAgICBjb21tYW5kX2xpbmUucnBhdGhfbGluayA9IGJ1eXN0cmluZyAob3B0YXJnKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKmJ1ZjsKLQotCSAgICAgIGJ1ZiA9IHhtYWxsb2MgKHN0cmxlbiAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmspCi0JCQkgICAgICsgc3RybGVuIChvcHRhcmcpCi0JCQkgICAgICsgMik7Ci0JICAgICAgc3ByaW50ZiAoYnVmLCAiJXM6JXMiLCBjb21tYW5kX2xpbmUucnBhdGhfbGluaywgb3B0YXJnKTsKLQkgICAgICBmcmVlIChjb21tYW5kX2xpbmUucnBhdGhfbGluayk7Ci0JICAgICAgY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPSBidWY7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1JFTEFYOgotCSAgY29tbWFuZF9saW5lLnJlbGF4ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1JFVEFJTl9TWU1CT0xTX0ZJTEU6Ci0JICBhZGRfa2VlcHN5bXNfZmlsZSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCSAgbGlua19pbmZvLnN0cmlwID0gc3RyaXBfZGVidWdnZXI7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX2FsbDsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NIQVJFRDoKLQkgIGlmIChjb25maWcuaGFzX3NoYXJlZCkKLQkgICAgbGlua19pbmZvLnNoYXJlZCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIGVpbmZvIChfKCIlUCVGOiAtc2hhcmVkIG5vdCBzdXBwb3J0ZWRcbiIpKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgkJLyogVXNlZCBvbiBTb2xhcmlzLiAgKi8KLQljYXNlIE9QVElPTl9TT05BTUU6Ci0JICBjb21tYW5kX2xpbmUuc29uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU09SVF9DT01NT046Ci0JICBjb25maWcuc29ydF9jb21tb24gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1RBVFM6Ci0JICBjb25maWcuc3RhdHMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1lNQk9MSUM6Ci0JICBsaW5rX2luZm8uc3ltYm9saWMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICB0cmFjZV9maWxlcyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdUJzoKLQkgIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAob3B0YXJnKTsKLQkgIHBhcnNlcl9pbnB1dCA9IGlucHV0X3NjcmlwdDsKLQkgIHl5cGFyc2UgKCk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9UQlNTOgotCSAgc2V0X3NlY3Rpb25fc3RhcnQgKCIuYnNzIiwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1REQVRBOgotCSAgc2V0X3NlY3Rpb25fc3RhcnQgKCIuZGF0YSIsIG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9UVEVYVDoKLQkgIHNldF9zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUOgotCSAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9UQVNLX0xJTks6Ci0JICBsaW5rX2luZm8udGFza19saW5rID0gdHJ1ZTsKLQkgIC8qIEZhbGwgdGhyb3VnaCAtIGRvIGFuIGltcGxpZWQgLXIgb3B0aW9uLiAgKi8KLQljYXNlIE9QVElPTl9VUjoKLQkgIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSB0cnVlOwotCSAgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9IHRydWU7Ci0JICBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkID0gZmFsc2U7Ci0JICBjb25maWcudGV4dF9yZWFkX29ubHkgPSBmYWxzZTsKLQkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3UnOgotCSAgbGRsYW5nX2FkZF91bmRlZiAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1ZFUkJPU0U6Ci0JICBsZHZlcnNpb24gKDEpOwotCSAgdmVyc2lvbl9wcmludGVkID0gdHJ1ZTsKLQkgIHRyYWNlX2ZpbGVfdHJpZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICBsZHZlcnNpb24gKDApOwotCSAgdmVyc2lvbl9wcmludGVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgbGR2ZXJzaW9uICgxKTsKLQkgIHZlcnNpb25fcHJpbnRlZCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9WRVJTSU9OOgotCSAgLyogVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LiAgKi8KLQkgIHByaW50ZiAoIkdOVSBsZCAlc1xuIiwgbGRfcHJvZ3JhbV92ZXJzaW9uKTsKLQkgIHByaW50ZiAoXygiQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iKSk7Ci0JICBwcmludGYgKF8oIlwKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcblwKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIpKTsKLQkgIHsKLQkgICAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqKnB0ciA9IGxkX2VtdWxhdGlvbnM7Ci0gICAgCi0JICAgIHByaW50ZiAoXygiICBTdXBwb3J0ZWQgZW11bGF0aW9uczpcbiIpKTsKLQkgICAgd2hpbGUgKCpwdHIpIAotCSAgICAgIHsKLQkJcHJpbnRmICgiICAgJXNcbiIsICgqcHRyKS0+ZW11bGF0aW9uX25hbWUpOwotCQlwdHIrKzsKLQkgICAgICB9Ci0JICB9Ci0JICB4ZXhpdCAoMCk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9WRVJTSU9OX1NDUklQVDoKLQkgIC8qIFRoaXMgb3B0aW9uIGluZGljYXRlcyBhIHNtYWxsIHNjcmlwdCB0aGF0IG9ubHkgc3BlY2lmaWVzCi0gICAgICAgICAgICAgdmVyc2lvbiBpbmZvcm1hdGlvbi4gIFJlYWQgaXQsIGJ1dCBkb24ndCBhc3N1bWUgdGhhdAotICAgICAgICAgICAgIHdlJ3ZlIHNlZW4gYSBsaW5rZXIgc2NyaXB0LiAgKi8KLQkgIHsKLQkgICAgYm9vbGVhbiBob2xkX2hhZF9zY3JpcHQ7Ci0KLQkgICAgaG9sZF9oYWRfc2NyaXB0ID0gaGFkX3NjcmlwdDsKLQkgICAgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChvcHRhcmcpOwotCSAgICBoYWRfc2NyaXB0ID0gaG9sZF9oYWRfc2NyaXB0OwotCSAgICBwYXJzZXJfaW5wdXQgPSBpbnB1dF92ZXJzaW9uX3NjcmlwdDsKLQkgICAgeXlwYXJzZSAoKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1ZFUlNJT05fRVhQT1JUU19TRUNUSU9OOgotCSAgLyogVGhpcyBvcHRpb24gcmVjb3JkcyBhIHZlcnNpb24gc3ltYm9sIHRvIGJlIGFwcGxpZWQgdG8gdGhlCi0JICAgICBzeW1ib2xzIGxpc3RlZCBmb3IgZXhwb3J0IHRvIGJlIGZvdW5kIGluIHRoZSBvYmplY3QgZmlsZXMKLQkgICAgIC5leHBvcnRzIHNlY3Rpb25zLiAgKi8KLQkgIGNvbW1hbmRfbGluZS52ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbiA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dBUk5fQ09NTU9OOgotCSAgY29uZmlnLndhcm5fY29tbW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dBUk5fQ09OU1RSVUNUT1JTOgotCSAgY29uZmlnLndhcm5fY29uc3RydWN0b3JzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dBUk5fTVVMVElQTEVfR1A6Ci0JICBjb25maWcud2Fybl9tdWx0aXBsZV9ncCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX09OQ0U6Ci0JICBjb25maWcud2Fybl9vbmNlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dBUk5fU0VDVElPTl9BTElHTjoKLQkgIGNvbmZpZy53YXJuX3NlY3Rpb25fYWxpZ24gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fV0hPTEVfQVJDSElWRToKLQkgIHdob2xlX2FyY2hpdmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fV1JBUDoKLQkgIGFkZF93cmFwIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JICBsaW5rX2luZm8uZGlzY2FyZCA9IGRpc2NhcmRfbDsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgbGlua19pbmZvLmRpc2NhcmQgPSBkaXNjYXJkX2FsbDsKLQkgIGJyZWFrOwotCWNhc2UgJ1knOgotCSAgaWYgKHN0cm5jbXAgKG9wdGFyZywgIlAsIiwgMikgPT0gMCkKLQkgICAgb3B0YXJnICs9IDI7Ci0JICBkZWZhdWx0X2Rpcmxpc3QgPSB4c3RyZHVwIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAneSc6Ci0JICBhZGRfeXN5bSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3onOgotCSAgLyogV2UgYWNjZXB0IGFuZCBpZ25vcmUgdGhpcyBvcHRpb24gZm9yIFNvbGFyaXMKLSAgICAgICAgICAgICBjb21wYXRpYmlsaXR5LiAgQWN0dWFsbHksIG9uIFNvbGFyaXMsIG9wdGFyZyBpcyBub3QKLSAgICAgICAgICAgICBpZ25vcmVkLiAgU29tZWRheSB3ZSBzaG91bGQgaGFuZGxlIGl0IGNvcnJlY3RseS4gIEZJWE1FLiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NQTElUX0JZX1JFTE9DOgotCSAgY29uZmlnLnNwbGl0X2J5X3JlbG9jID0gc3RydG91bCAob3B0YXJnLCBOVUxMLCAwKTsKLQkgIGJyZWFrOyAKLQljYXNlIE9QVElPTl9TUExJVF9CWV9GSUxFOgotCSAgY29uZmlnLnNwbGl0X2J5X2ZpbGUgPSB0cnVlOwotCSAgYnJlYWs7IAotCWNhc2UgT1BUSU9OX0NIRUNLX1NFQ1RJT05TOgotCSAgY29tbWFuZF9saW5lLmNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0NIRUNLX1NFQ1RJT05TOgotCSAgY29tbWFuZF9saW5lLmNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICcoJzoKLQkgIGlmIChpbmdyb3VwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IG1heSBub3QgbmVzdCBncm91cHMgKC0taGVscCBmb3IgdXNhZ2UpXG4iKSwKLQkJICAgICAgIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgeGV4aXQgKDEpOwotCSAgICB9Ci0JICBsYW5nX2VudGVyX2dyb3VwICgpOwotCSAgaW5ncm91cCA9IDE7Ci0JICBicmVhazsKLQljYXNlICcpJzoKLQkgIGlmICghIGluZ3JvdXApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogZ3JvdXAgZW5kZWQgYmVmb3JlIGl0IGJlZ2FuICgtLWhlbHAgZm9yIHVzYWdlKVxuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUpOwotCSAgICAgIHhleGl0ICgxKTsKLQkgICAgfQotCSAgbGFuZ19sZWF2ZV9ncm91cCAoKTsKLQkgIGluZ3JvdXAgPSAwOwotCSAgYnJlYWs7Ci0gICAgICBjYXNlIE9QVElPTl9NUEM4NjBDMDoKLSAgICAgICAgICBsaW5rX2luZm8ubXBjODYwYzAgPSAyMDsgICAgICAvKiBkZWZhdWx0IHZhbHVlIChpbiBieXRlcykgKi8KLSAgICAgICAgICBpZiAob3B0YXJnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1bnNpZ25lZCB3b3JkczsKLQotICAgICAgICAgICAgICB3b3JkcyA9IGlzX251bSAob3B0YXJnLCAxLCAxMCwgMCk7Ci0gICAgICAgICAgICAgIGlmICh3b3JkcyA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJCSAgIF8oIiVzOiBJbnZhbGlkIGFyZ3VtZW50IHRvIG9wdGlvbiBcIm1wYzg2MGMwXCJcbiIpLAotCQkJICAgcHJvZ3JhbV9uYW1lKTsKLSAgICAgICAgICAgICAgICAgIHhleGl0ICgxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGxpbmtfaW5mby5tcGM4NjBjMCA9IHdvcmRzICogNDsgICAvKiBjb252ZXJ0IHdvcmRzIHRvIGJ5dGVzICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgY29tbWFuZF9saW5lLnJlbGF4ID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0lOSVQ6Ci0JICBsaW5rX2luZm8uaW5pdF9mdW5jdGlvbiA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBPUFRJT05fRklOSToKLQkgIGxpbmtfaW5mby5maW5pX2Z1bmN0aW9uID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoaW5ncm91cCkKLSAgICBsYW5nX2xlYXZlX2dyb3VwICgpOwotCi0gIGlmIChkZWZhdWx0X2Rpcmxpc3QgIT0gTlVMTCkKLSAgICBzZXRfZGVmYXVsdF9kaXJsaXN0IChkZWZhdWx0X2Rpcmxpc3QpOwotCi19Ci0KLS8qIEFkZCB0aGUgKGNvbG9uLXNlcGFyYXRlZCkgZWxlbWVudHMgb2YgRElSTElTVF9QVFIgdG8gdGhlCi0gICBsaWJyYXJ5IHNlYXJjaCBwYXRoLiAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9kZWZhdWx0X2Rpcmxpc3QgKGRpcmxpc3RfcHRyKQotICAgICBjaGFyICpkaXJsaXN0X3B0cjsKLXsKLSAgY2hhciAqcDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBwID0gc3RyY2hyIChkaXJsaXN0X3B0ciwgUEFUSF9TRVBBUkFUT1IpOwotICAgICAgaWYgKHAgIT0gTlVMTCkKLQkqcCA9ICdcMCc7Ci0gICAgICBpZiAoKmRpcmxpc3RfcHRyICE9ICdcMCcpCi0JbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGRpcmxpc3RfcHRyLCB0cnVlKTsKLSAgICAgIGlmIChwID09IE5VTEwpCi0JYnJlYWs7Ci0gICAgICBkaXJsaXN0X3B0ciA9IHAgKyAxOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNldF9zZWN0aW9uX3N0YXJ0IChzZWN0LCB2YWxzdHIpCi0gICAgIGNoYXIgKnNlY3QsICp2YWxzdHI7Ci17Ci0gIGNoYXIgKmVuZDsKLSAgdW5zaWduZWQgbG9uZyB2YWwgPSBzdHJ0b3VsICh2YWxzdHIsICZlbmQsIDE2KTsKLSAgaWYgKCplbmQpCi0gICAgZWluZm8gKF8oIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBgJXMnXG4iKSwgdmFsc3RyKTsKLSAgbGFuZ19zZWN0aW9uX3N0YXJ0IChzZWN0LCBleHBfaW50b3AgKHZhbCkpOwotfQotDAotLyogUHJpbnQgaGVscCBtZXNzYWdlcyBmb3IgdGhlIG9wdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotaGVscCAoKQotewotICBpbnQgaTsKLSAgY29uc3QgY2hhciAqKnRhcmdldHMsICoqcHA7Ci0KLSAgcHJpbnRmIChfKCJVc2FnZTogJXMgW29wdGlvbnNdIGZpbGUuLi5cbiIpLCBwcm9ncmFtX25hbWUpOwotCi0gIHByaW50ZiAoXygiT3B0aW9uczpcbiIpKTsKLSAgZm9yIChpID0gMDsgaSA8IE9QVElPTl9DT1VOVDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChsZF9vcHRpb25zW2ldLmRvYyAhPSBOVUxMKQotCXsKLQkgIGJvb2xlYW4gY29tbWE7Ci0JICBpbnQgbGVuOwotCSAgaW50IGo7Ci0KLQkgIHByaW50ZiAoIiAgIik7Ci0KLQkgIGNvbW1hID0gZmFsc2U7Ci0JICBsZW4gPSAyOwotCi0JICBqID0gaTsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBpZiAobGRfb3B0aW9uc1tqXS5zaG9ydG9wdCAhPSAnXDAnCi0JCSAgJiYgbGRfb3B0aW9uc1tqXS5jb250cm9sICE9IE5PX0hFTFApCi0JCXsKLQkJICBwcmludGYgKCIlcy0lYyIsIGNvbW1hID8gIiwgIiA6ICIiLCBsZF9vcHRpb25zW2pdLnNob3J0b3B0KTsKLQkJICBsZW4gKz0gKGNvbW1hID8gMiA6IDApICsgMjsKLQkJICBpZiAobGRfb3B0aW9uc1tqXS5hcmcgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGxkX29wdGlvbnNbal0ub3B0Lmhhc19hcmcgIT0gb3B0aW9uYWxfYXJndW1lbnQpCi0JCQl7Ci0JCQkgIHByaW50ZiAoIiAiKTsKLQkJCSAgKytsZW47Ci0JCQl9Ci0JCSAgICAgIHByaW50ZiAoIiVzIiwgXyhsZF9vcHRpb25zW2pdLmFyZykpOwotCQkgICAgICBsZW4gKz0gc3RybGVuIChfKGxkX29wdGlvbnNbal0uYXJnKSk7Ci0JCSAgICB9Ci0JCSAgY29tbWEgPSB0cnVlOwotCQl9Ci0JICAgICAgKytqOwotCSAgICB9Ci0JICB3aGlsZSAoaiA8IE9QVElPTl9DT1VOVCAmJiBsZF9vcHRpb25zW2pdLmRvYyA9PSBOVUxMKTsKLQotCSAgaiA9IGk7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgaWYgKGxkX29wdGlvbnNbal0ub3B0Lm5hbWUgIT0gTlVMTAotCQkgICYmIGxkX29wdGlvbnNbal0uY29udHJvbCAhPSBOT19IRUxQKQotCQl7Ci0JCSAgcHJpbnRmICgiJXMtJXMlcyIsCi0JCQkgIGNvbW1hID8gIiwgIiA6ICIiLAotCQkJICBsZF9vcHRpb25zW2pdLmNvbnRyb2wgPT0gVFdPX0RBU0hFUyA/ICItIiA6ICIiLAotCQkJICBsZF9vcHRpb25zW2pdLm9wdC5uYW1lKTsKLQkJICBsZW4gKz0gKChjb21tYSA/IDIgOiAwKQotCQkJICArIDEKLQkJCSAgKyAobGRfb3B0aW9uc1tqXS5jb250cm9sID09IFRXT19EQVNIRVMgPyAxIDogMCkKLQkJCSAgKyBzdHJsZW4gKGxkX29wdGlvbnNbal0ub3B0Lm5hbWUpKTsKLQkJICBpZiAobGRfb3B0aW9uc1tqXS5hcmcgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiICVzIiwgXyhsZF9vcHRpb25zW2pdLmFyZykpOwotCQkgICAgICBsZW4gKz0gMSArIHN0cmxlbiAoXyhsZF9vcHRpb25zW2pdLmFyZykpOwotCQkgICAgfQotCQkgIGNvbW1hID0gdHJ1ZTsKLQkJfQotCSAgICAgICsrajsKLQkgICAgfQotCSAgd2hpbGUgKGogPCBPUFRJT05fQ09VTlQgJiYgbGRfb3B0aW9uc1tqXS5kb2MgPT0gTlVMTCk7Ci0KLQkgIGlmIChsZW4gPj0gMzApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJcbiIpOwotCSAgICAgIGxlbiA9IDA7Ci0JICAgIH0KLQotCSAgZm9yICg7IGxlbiA8IDMwOyBsZW4rKykKLQkgICAgcHV0Y2hhciAoJyAnKTsKLQotCSAgcHJpbnRmICgiJXNcbiIsIF8obGRfb3B0aW9uc1tpXS5kb2MpKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdGU6IFZhcmlvdXMgdG9vbHMgKHN1Y2ggYXMgbGlidG9vbCkgZGVwZW5kIHVwb24gdGhlCi0gICAgIGZvcm1hdCBvZiB0aGUgbGlzdGluZ3MgYmVsb3cgLSBkbyBub3QgY2hhbmdlIHRoZW0uICAqLwotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBwcmludGYgKF8oIiVzOiBzdXBwb3J0ZWQgdGFyZ2V0czoiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgdGFyZ2V0cyA9IGJmZF90YXJnZXRfbGlzdCAoKTsKLSAgZm9yIChwcCA9IHRhcmdldHM7ICpwcCAhPSBOVUxMOyBwcCsrKQotICAgIHByaW50ZiAoIiAlcyIsICpwcCk7Ci0gIGZyZWUgKHRhcmdldHMpOwotICBwcmludGYgKCJcbiIpOwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIHByaW50ZiAoXygiJXM6IHN1cHBvcnRlZCBlbXVsYXRpb25zOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgbGRlbXVsX2xpc3RfZW11bGF0aW9ucyAoc3Rkb3V0KTsKLSAgcHJpbnRmICgiXG4iKTsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBwcmludGYgKF8oIiVzOiBlbXVsYXRpb24gc3BlY2lmaWMgb3B0aW9uczpcbiIpLCBwcm9ncmFtX25hbWUpOwotICBsZGVtdWxfbGlzdF9lbXVsYXRpb25fb3B0aW9ucyAoc3Rkb3V0KTsKLSAgcHJpbnRmICgiXG4iKTsKLSAgCi0gIHByaW50ZiAoXygiXG5SZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLX0KZGlmZiAtLWdpdCBhL2xkL21hYy1sZC5yIGIvbGQvbWFjLWxkLnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMTZmYzUuLjAwMDAwMDAKLS0tIGEvbGQvbWFjLWxkLnIKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBSZXNvdXJjZXMgZm9yIEdOVSBMRC4gKi8KLQotI2luY2x1ZGUgIlN5c1R5cGVzLnIiCi0KLS8qIFZlcnNpb24gcmVzb3VyY2VzLiAqLwotCi1yZXNvdXJjZSAndmVycycgKDEpICB7Ci0JMCwKLQkwLAotCTAsCi0JMCwKLQl2ZXJVcywKLQlWRVJTSU9OX1NUUklORywKLQlWRVJTSU9OX1NUUklORyAgIiAoQykgMTk4Ni05NSBGU0YsIEluYy4iCi19OwotCi1yZXNvdXJjZSAndmVycycgKDIsIHB1cmdlYWJsZSkgIHsKLQkwLAotCTAsCi0JMCwKLQkwLAotCXZlclVzLAotCVZFUlNJT05fU1RSSU5HLAotCSJHTEQgIiBWRVJTSU9OX1NUUklORyAiIGZvciBNUFciCi19OwotCi0jaWZkZWYgV0FOVF9DRlJHCi0KLSNpbmNsdWRlICJDb2RlRnJhZ21lbnRUeXBlcy5yIgotCi1yZXNvdXJjZSAnY2ZyZycgKDApIHsKLQl7Ci0JCWtQb3dlclBDLAotCQlrRnVsbExpYiwKLQkJa05vVmVyc2lvbk51bSwga05vVmVyc2lvbk51bSwKLQkJMCwgMCwKLQkJa0lzQXBwLCBrT25EaXNrRmxhdCwga1plcm9PZmZzZXQsIGtXaG9sZUZvcmssCi0JCVBST0dfTkFNRQotCX0KLX07Ci0KLSNlbmRpZiAvKiBXQU5UX0NGUkcgKi8KZGlmZiAtLWdpdCBhL2xkL21wdy1jb25maWcuaW4gYi9sZC9tcHctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjU0MmNjLi4wMDAwMDAwCi0tLSBhL2xkL21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIExELgotCi1JZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbTY4ay1hcHBsZS1tYWNvcy8KLQlTZXQgZW11bG5hbWUgbTY4a2NvZmYKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9Im1wdy1lbTY4a2NvZmYuYyBlbTY4a2NvZmYuYwotCVNldCBlbXVsYXRpb25fb2ZpbGVzICJ7b30iZW02OGtjb2ZmLmMubwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9wb3dlcnBjLWFwcGxlLW1hY29zLwotCVNldCBlbXVsbmFtZSBwcGNtYWNvcwotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0ibXB3LWVwcGNtYWMuYyBlcHBjbWFjb3MuYwotCVNldCBlbXVsYXRpb25fb2ZpbGVzICJ7b30iZXBwY21hY29zLmMubwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9pMzg2LVxPcHRpb24teC1nbzMyLwotCVNldCBlbXVsbmFtZSBpMzg2Z28zMgotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0ibXB3LWVpMzg2Z28zMi5jIGVpMzg2Z28zMi5jCi0JU2V0IGVtdWxhdGlvbl9vZmlsZXMgIntvfSJlaTM4NmdvMzIuYy5vCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL21pcHMtXE9wdGlvbi14LWVjb2ZmLwotCVNldCBlbXVsbmFtZSBtaXBzaWR0Ci0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJtcHctaWR0bWlwcy5jIGVtaXBzaWR0LmMKLQlTZXQgZW11bGF0aW9uX29maWxlcyAie299ImVtaXBzaWR0LmMubwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9taXBzLVxPcHRpb24teC1cT3B0aW9uLXgvCi0JU2V0IGVtdWxuYW1lIGVsZjMyZWJtaXAKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9Im1wdy1lbGZtaXBzLmMgZWVsZjMyZWJtaXAuYwotCVNldCBlbXVsYXRpb25fb2ZpbGVzICJ7b30iZWVsZjMyZWJtaXAuYy5vCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3NoLVxPcHRpb24teC1obXMvCi0JU2V0IGVtdWxuYW1lIHNoCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJtcHctZXNoLmMgZXNoLmMKLQlTZXQgZW11bGF0aW9uX29maWxlcyAie299ImVzaC5jLm8KLUVuZCBJZgotCi1FY2hvICcvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuICBETyBOT1QgRURJVCEgKi8nID4gIntvfSJsZGVtdWwtdG1wLmgKLUVjaG8gImV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlIGxkX3tlbXVsbmFtZX1fZW11bGF0aW9uOyIgPj4gIntvfSJsZGVtdWwtdG1wLmgKLUVjaG8gJyNkZWZpbmUgRU1VTEFUSU9OX0xJU1QgXCcJCQkJPj4gIntvfSJsZGVtdWwtdG1wLmgKLUVjaG8gIiAgJmxkX3tlbXVsbmFtZX1fZW11bGF0aW9uLCBcIgkJCT4+ICJ7b30ibGRlbXVsLXRtcC5oCi1FY2hvICcgIDAnCQkJCQkJPj4gIntvfSJsZGVtdWwtdG1wLmgKLQotTW92ZUlmQ2hhbmdlICJ7b30ibGRlbXVsLXRtcC5oICJ7b30ibGRlbXVsLWxpc3QuaAotCi1FY2hvICcjIEZyb20gbXB3LWNvbmZpZy5pbicJCQkJID4gIntvfSJtay50bXAKLUVjaG8gIkVNVUwgPSAiIHtlbXVsbmFtZX0JCQkJPj4gIntvfSJtay50bXAKLUVjaG8gIkVNVUxBVElPTl9PRklMRVMgPSAiIHtlbXVsYXRpb25fb2ZpbGVzfQkJPj4gIntvfSJtay50bXAKLUVjaG8gJ3ZlcnNpb24gPSAnIGBTZWFyY2ggJ2xkIHZlcnNpb24gJyB7c3JjZGlyfWxkdmVyLmMgfCBzZWQgLWUgJ3MvLipsZCB2ZXJzaW9uIFwoW14gXSpcKS4qL1wxLydgID4+ICJ7b30ibWsudG1wCi1FY2hvICJUREVGSU5FUyA9ICIJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICcjIEVuZCBmcm9tIG1wdy1jb25maWcuaW4nCQkJCT4+ICJ7b30ibWsudG1wCi0KLUVjaG8gJy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IG1wdy1jb25maWd1cmUuICAqLycJID4gIntvfSJjb25maWcubmV3Ci1FY2hvICcjaW5jbHVkZSAibXB3LmgiJwkJCQkJPj4gIntvfSJjb25maWcubmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImNvbmZpZy5uZXcgIntvfSJjb25maWcuaApkaWZmIC0tZ2l0IGEvbGQvbXB3LWVsZm1pcHMuYyBiL2xkL21wdy1lbGZtaXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWIwNTYuLjAwMDAwMDAKLS0tIGEvbGQvbXB3LWVsZm1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MzkgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiAzMiBiaXQgRUxGIGVtdWxhdGlvbiBjb2RlIGZvciBlbGYzMmVibWlwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIEVMRiBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU19lbGYzMmVibWlwCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0KLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGdsZGVsZjMyZWJtaXBfb3Blbl9keW5hbWljX2FyY2hpdmUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWFyY2hfZGlyc190eXBlICosIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfY2hlY2tfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9zdGF0X25lZWRlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGdsZGVsZjMyZWJtaXBfc2VhcmNoX25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkZWxmMzJlYm1pcF90cnlfbmVlZGVkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGRlbGYzMmVibWlwX3BsYWNlX29ycGhhbgotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfcGxhY2Vfc2VjdGlvbgotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGRlbGYzMmVibWlwX2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfYmVmb3JlX3BhcnNlKCkKLXsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9taXBzOwotICBjb25maWcuZHluYW1pY19saW5rID0gdHJ1ZTsKLX0KLQotLyogVHJ5IHRvIG9wZW4gYSBkeW5hbWljIGFyY2hpdmUuICBUaGlzIGlzIHdoZXJlIHdlIGtub3cgdGhhdCBFTEYKLSAgIGR5bmFtaWMgbGlicmFyaWVzIGhhdmUgYW4gZXh0ZW5zaW9uIG9mIC5zby4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGRlbGYzMmVibWlwX29wZW5fZHluYW1pY19hcmNoaXZlIChhcmNoLCBzZWFyY2gsIGVudHJ5KQotICAgICBjb25zdCBjaGFyICphcmNoOwotICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgY2hhciAqc3RyaW5nOwotCi0gIGlmICghIGVudHJ5LT5pc19hcmNoaXZlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmaWxlbmFtZSA9IGVudHJ5LT5maWxlbmFtZTsKLQotICBzdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkKLQkJCSAgICAgKyBzdHJsZW4gKGZpbGVuYW1lKQotCQkJICAgICArIHN0cmxlbiAoYXJjaCkKLQkJCSAgICAgKyBzaXplb2YgIi9saWIuc28iKTsKLQotICBzcHJpbnRmIChzdHJpbmcsICIlcy9saWIlcyVzLnNvIiwgc2VhcmNoLT5uYW1lLCBmaWxlbmFtZSwgYXJjaCk7Ci0KLSAgaWYgKCEgbGRmaWxlX3RyeV9vcGVuX2JmZCAoc3RyaW5nLCBlbnRyeSkpCi0gICAgewotICAgICAgZnJlZSAoc3RyaW5nKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZW50cnktPmZpbGVuYW1lID0gc3RyaW5nOwotCi0gIC8qIFdlIGhhdmUgZm91bmQgYSBkeW5hbWljIG9iamVjdCB0byBpbmNsdWRlIGluIHRoZSBsaW5rLiAgVGhlIEVMRgotICAgICBiYWNrZW5kIGxpbmtlciB3aWxsIGNyZWF0ZSBhIERUX05FRURFRCBlbnRyeSBpbiB0aGUgLmR5bmFtaWMKLSAgICAgc2VjdGlvbiBuYW1pbmcgdGhpcyBmaWxlLiAgSWYgdGhpcyBmaWxlIGluY2x1ZGVzIGEgRFRfU09OQU1FCi0gICAgIGVudHJ5LCBpdCB3aWxsIGJlIHVzZWQuICBPdGhlcndpc2UsIHRoZSBFTEYgbGlua2VyIHdpbGwganVzdCB1c2UKLSAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUuICBGb3IgYW4gYXJjaGl2ZSBmb3VuZCBieSBzZWFyY2hpbmcsIGxpa2UKLSAgICAgdGhpcyBvbmUsIHRoZSBEVF9ORUVERUQgZW50cnkgc2hvdWxkIGNvbnNpc3Qgb2YganVzdCB0aGUgbmFtZSBvZgotICAgICB0aGUgZmlsZSwgd2l0aG91dCB0aGUgcGF0aCBpbmZvcm1hdGlvbiB1c2VkIHRvIGZpbmQgaXQuICBOb3RlCi0gICAgIHRoYXQgd2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgaWYgd2UgaGF2ZSBhIGR5bmFtaWMgb2JqZWN0OyBhbgotICAgICBhcmNoaXZlIHdpbGwgbmV2ZXIgYmUgcmVmZXJlbmNlZCBieSBhIERUX05FRURFRCBlbnRyeS4KLQotICAgICBGSVhNRTogVGhpcyBhcHByb2FjaC0tdXNpbmcgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUtLWlzIG5vdAotICAgICB2ZXJ5IHByZXR0eS4gIEkgaGF2ZW4ndCBiZWVuIGFibGUgdG8gdGhpbmsgb2YgYW55dGhpbmcgdGhhdCBpcwotICAgICBwcmV0dHksIHRob3VnaC4gICovCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCwgYmZkX29iamVjdCkKLSAgICAgICYmIChlbnRyeS0+dGhlX2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIHsKLSAgICAgIGNoYXIgKm5lZWRlZF9uYW1lOwotCi0gICAgICBBU1NFUlQgKGVudHJ5LT5pc19hcmNoaXZlICYmIGVudHJ5LT5zZWFyY2hfZGlyc19mbGFnKTsKLSAgICAgIG5lZWRlZF9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlbmFtZSkKLQkJCQkgICAgICArIHN0cmxlbiAoYXJjaCkKLQkJCQkgICAgICArIHNpemVvZiAibGliLnNvIik7Ci0gICAgICBzcHJpbnRmIChuZWVkZWRfbmFtZSwgImxpYiVzJXMuc28iLCBmaWxlbmFtZSwgYXJjaCk7Ci0gICAgICBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoZW50cnktPnRoZV9iZmQsIG5lZWRlZF9uYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogVGhlc2UgdmFyaWFibGVzIGFyZSByZXF1aXJlZCB0byBwYXNzIGluZm9ybWF0aW9uIGJhY2sgYW5kIGZvcnRoCi0gICBiZXR3ZWVuIGFmdGVyX29wZW4gYW5kIGNoZWNrX25lZWRlZCBhbmQgc3RhdF9uZWVkZWQuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpnbG9iYWxfbmVlZGVkOwotc3RhdGljIHN0cnVjdCBzdGF0IGdsb2JhbF9zdGF0Owotc3RhdGljIGJvb2xlYW4gZ2xvYmFsX2ZvdW5kOwotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkZWxmMzJlYm1pcF9hZnRlcl9vcGVuICgpCi17Ci0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkLCAqbDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyB3aGVuIGRvaW5nIGEgZmluYWwgbGluay4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdldCB0aGUgbGlzdCBvZiBmaWxlcyB3aGljaCBhcHBlYXIgaW4gRFRfTkVFREVEIGVudHJpZXMgaW4KLSAgICAgZHluYW1pYyBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBsaW5rIChvZnRlbiB0aGVyZSB3aWxsIGJlIG5vbmUpLgotICAgICBGb3IgZWFjaCBzdWNoIGZpbGUsIHdlIHdhbnQgdG8gdHJhY2sgZG93biB0aGUgY29ycmVzcG9uZGluZwotICAgICBsaWJyYXJ5LCBhbmQgaW5jbHVkZSB0aGUgc3ltYm9sIHRhYmxlIGluIHRoZSBsaW5rLiAgVGhpcyBpcyB3aGF0Ci0gICAgIHRoZSBydW50aW1lIGR5bmFtaWMgbGlua2VyIHdpbGwgZG8uICBUcmFja2luZyB0aGUgZmlsZXMgZG93biBoZXJlCi0gICAgIHBlcm1pdHMgb25lIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgYW5vdGhlciB3aXRob3V0IHJlcXVpcmluZwotICAgICBzcGVjaWFsIGFjdGlvbiBieSB0aGUgcGVyc29uIGRvaW5nIHRoZSBsaW5rLiAgTm90ZSB0aGF0IHRoZQotICAgICBuZWVkZWQgbGlzdCBjYW4gYWN0dWFsbHkgZ3JvdyB3aGlsZSB3ZSBhcmUgc3RlcHBpbmcgdGhyb3VnaCB0aGlzCi0gICAgIGxvb3AuICAqLwotICBuZWVkZWQgPSBiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmxsOwotICAgICAgY29uc3QgY2hhciAqbGliX3BhdGg7Ci0gICAgICBzaXplX3QgbGVuOwotICAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0gICAgICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBmaWxlLCBza2lwIGl0LiAgKi8KLSAgICAgIGZvciAobGwgPSBuZWVkZWQ7IGxsICE9IGw7IGxsID0gbGwtPm5leHQpCi0JaWYgKHN0cmNtcCAobGwtPm5hbWUsIGwtPm5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIGlmIChsbCAhPSBsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmaWxlIHdhcyBpbmNsdWRlZCBpbiB0aGUgbGluayBleHBsaWNpdGx5LiAgKi8KLSAgICAgIGdsb2JhbF9uZWVkZWQgPSBsOwotICAgICAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7Ci0gICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZGVsZjMyZWJtaXBfY2hlY2tfbmVlZGVkKTsKLSAgICAgIGlmIChnbG9iYWxfZm91bmQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gZmluZCB0aGlzIGZpbGUgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbCB0YWJsZS4gIFdlCi0JIHdhbnQgdG8gc2VhcmNoIGZvciB0aGUgZmlsZSBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGUgZHluYW1pYwotCSBsaW5rZXIgd2lsbCBzZWFyY2guICBUaGF0IG1lYW5zIHRoYXQgd2Ugd2FudCB0byB1c2UKLQkgcnBhdGhfbGluaywgcnBhdGgsIHRoZW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0JIExEX0xJQlJBUllfUEFUSCAobmF0aXZlIG9ubHkpLCB0aGVuIHRoZSBsaW5rZXIgc2NyaXB0Ci0JIExJQl9TRUFSQ0hfRElSUy4gIFdlIGRvIG5vdCBzZWFyY2ggdXNpbmcgdGhlIC1MIGFyZ3VtZW50cy4gICovCi0gICAgICBpZiAoZ2xkZWxmMzJlYm1pcF9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGhfbGluaywKLQkJCQkJICAgICAgbC0+bmFtZSkpCi0JY29udGludWU7Ci0gICAgICBpZiAoZ2xkZWxmMzJlYm1pcF9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGgsIGwtPm5hbWUpKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rID09IE5VTEwKLQkgICYmIGNvbW1hbmRfbGluZS5ycGF0aCA9PSBOVUxMKQotCXsKLQkgIGxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfUlVOX1BBVEgiKTsKLQkgIGlmIChnbGRlbGYzMmVibWlwX3NlYXJjaF9uZWVkZWQgKGxpYl9wYXRoLCBsLT5uYW1lKSkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgbGVuID0gc3RybGVuIChsLT5uYW1lKTsKLSAgICAgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JewotCSAgY2hhciAqZmlsZW5hbWU7Ci0KLQkgIGlmIChzZWFyY2gtPmNtZGxpbmUpCi0JICAgIGNvbnRpbnVlOwotCSAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkgKyBsZW4gKyAyKTsKLQkgIHNwcmludGYgKGZpbGVuYW1lLCAiJXMvJXMiLCBzZWFyY2gtPm5hbWUsIGwtPm5hbWUpOwotCSAgaWYgKGdsZGVsZjMyZWJtaXBfdHJ5X25lZWRlZCAoZmlsZW5hbWUpKQotCSAgICBicmVhazsKLQkgIGZyZWUgKGZpbGVuYW1lKTsKLQl9Ci0gICAgICBpZiAoc2VhcmNoICE9IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbm90IGZvdW5kXG4iKSwKLQkgICAgIGwtPm5hbWUsIGwtPmJ5KTsKLSAgICB9Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBuZWVkZWQgZmlsZSBpbiBhIHBhdGguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkZWxmMzJlYm1pcF9zZWFyY2hfbmVlZGVkIChwYXRoLCBuYW1lKQotICAgICBjb25zdCBjaGFyICpwYXRoOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBjaGFyICpzOwotICBzaXplX3QgbGVuOwotCi0gIGlmIChwYXRoID09IE5VTEwgfHwgKnBhdGggPT0gJ1wwJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGNoYXIgKmZpbGVuYW1lLCAqc3NldDsKLQotICAgICAgcyA9IHN0cmNociAocGF0aCwgJzonKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JcyA9IHBhdGggKyBzdHJsZW4gKHBhdGgpOwotCi0gICAgICBmaWxlbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHMgLSBwYXRoICsgbGVuICsgMik7Ci0gICAgICBpZiAocyA9PSBwYXRoKQotCXNzZXQgPSBmaWxlbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKGZpbGVuYW1lLCBwYXRoLCBzIC0gcGF0aCk7Ci0JICBmaWxlbmFtZVtzIC0gcGF0aF0gPSAnLyc7Ci0JICBzc2V0ID0gZmlsZW5hbWUgKyAocyAtIHBhdGgpICsgMTsKLQl9Ci0gICAgICBzdHJjcHkgKHNzZXQsIG5hbWUpOwotCi0gICAgICBpZiAoZ2xkZWxmMzJlYm1pcF90cnlfbmVlZGVkIChmaWxlbmFtZSkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGZyZWUgKGZpbGVuYW1lKTsKLQotICAgICAgaWYgKCpzID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICBwYXRoID0gcyArIDE7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsJICAKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggcG9zc2libGUgbmFtZSBmb3IgYSBkeW5hbWljIG9iamVjdAotICAgbmFtZWQgYnkgYSBEVF9ORUVERUQgZW50cnkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkZWxmMzJlYm1pcF90cnlfbmVlZGVkIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBiZmQgKmFiZmQ7Ci0KLSAgYWJmZCA9IGJmZF9vcGVuciAobmFtZSwgYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpKTsKLSAgaWYgKGFiZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotICAgIHsKLSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV2UndmUgZm91bmQgYSBkeW5hbWljIG9iamVjdCBtYXRjaGluZyB0aGUgRFRfTkVFREVEIGVudHJ5LiAgKi8KLQotICAvKiBXZSBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZXJlIGlzIG5vIG90aGVyIGlucHV0IGZpbGUgb2YgdGhlCi0gICAgIHNhbWUgbmFtZS4gIFdlIG11c3Qgbm93IGNoZWNrIGFnYWluIHRoYXQgd2UgYXJlIG5vdCBpbmNsdWRpbmcgdGhlCi0gICAgIHNhbWUgZmlsZSB0d2ljZS4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIG9uIG1hbnkgc3lzdGVtcwotICAgICBsaWJjLnNvIGlzIGEgc3ltbGluayB0bywgZS5nLiwgbGliYy5zby4xLiAgVGhlIFNPTkFNRSBlbnRyeSB3aWxsCi0gICAgIHJlZmVyZW5jZSBsaWJjLnNvLjEuICBJZiB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgbGliYy5zbywgd2UKLSAgICAgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIGxpYmMuc28uMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBmaWxlLCBhbmQgd2UKLSAgICAgY2FuIG9ubHkgY2hlY2sgdGhhdCB1c2luZyBzdGF0LiAgKi8KLQotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZnbG9iYWxfc3RhdCkgIT0gMCkKLSAgICBlaW5mbyAoXygiJUYlUDolQjogYmZkX3N0YXQgZmFpbGVkOiAlRVxuIiksIGFiZmQpOwotICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGRlbGYzMmVibWlwX3N0YXRfbmVlZGVkKTsKLSAgaWYgKGdsb2JhbF9mb3VuZCkKLSAgICB7Ci0gICAgICAvKiBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHdlIGZvdW5kIHRoZSBmaWxlLCBldmVuIHRob3VnaAotICAgICAgICAgd2UgYXJlbid0IGdvaW5nIHRvIGRvIGFueXRoaW5nIHdpdGggaXQuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRlbGwgdGhlIEVMRiBiYWNrZW5kIHRoYXQgZG9uJ3Qgd2FudCB0aGUgb3V0cHV0IGZpbGUgdG8gaGF2ZSBhCi0gICAgIERUX05FRURFRCBlbnRyeSBmb3IgdGhpcyBmaWxlLiAgKi8KLSAgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgKGFiZmQsICIiKTsKLQotICAvKiBBZGQgdGhpcyBmaWxlIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmICghIGJmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCAmbGlua19pbmZvKSkKLSAgICBlaW5mbyAoXygiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCBhYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIGlmIGFuIGlucHV0IGZpbGUgbWF0Y2hlcyBhIERUX05FRURFRCBlbnRyeSBieSBuYW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfY2hlY2tfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHJldHVybjsKLQotICBpZiAocy0+ZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgc3RyY21wIChzLT5maWxlbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLSAgICB7Ci0gICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocy0+dGhlX2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNvbmFtZTsKLQotICAgICAgc29uYW1lID0gYmZkX2VsZl9nZXRfZHRfc29uYW1lIChzLT50aGVfYmZkKTsKLSAgICAgIGlmIChzb25hbWUgIT0gTlVMTAotCSAgJiYgc3RyY21wIChzb25hbWUsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0JewotCSAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCSAgCi0gIGlmIChzLT5zZWFyY2hfZGlyc19mbGFnCi0gICAgICAmJiBzLT5maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBzdHJjaHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICcvJykgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpmOwotCi0gICAgICBmID0gc3RycmNociAocy0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBpZiAoZiAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKGYgKyAxLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCXsKLQkgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogU2VlIGlmIGFuIGlucHV0IGZpbGUgbWF0Y2hlcyBhIERUX05FRURFRCBlbnRyeSBieSBydW5uaW5nIHN0YXQgb24KLSAgIHRoZSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfc3RhdF9uZWVkZWQgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBjb25zdCBjaGFyICpzdWZmaXg7Ci0gIGNvbnN0IGNoYXIgKnNvbmFtZTsKLSAgY29uc3QgY2hhciAqZjsKLQotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHJldHVybjsKLSAgaWYgKHMtPnRoZV9iZmQgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9zdGF0IChzLT50aGVfYmZkLCAmc3QpICE9IDApCi0gICAgewotICAgICAgZWluZm8gKF8oIiVQOiVCOiBiZmRfc3RhdCBmYWlsZWQ6ICVFXG4iKSwgcy0+dGhlX2JmZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzdC5zdF9kZXYgPT0gZ2xvYmFsX3N0YXQuc3RfZGV2Ci0gICAgICAmJiBzdC5zdF9pbm8gPT0gZ2xvYmFsX3N0YXQuc3RfaW5vKQotICAgIHsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFdlIGlzc3VlIGEgd2FybmluZyBpZiBpdCBsb29rcyBsaWtlIHdlIGFyZSBpbmNsdWRpbmcgdHdvCi0gICAgIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBzaGFyZWQgbGlicmFyeS4gIEZvciBleGFtcGxlLAotICAgICB0aGVyZSBtYXkgYmUgYSBwcm9ibGVtIGlmIC1sYyBwaWNrcyB1cCBsaWJjLnNvLjYgYnV0IHNvbWUgb3RoZXIKLSAgICAgc2hhcmVkIGxpYnJhcnkgaGFzIGEgRFRfTkVFREVEIGVudHJ5IG9mIGxpYmMuc28uNS4gIFRoaXMgaXMgYQotICAgICBodWVyaXN0aWMgdGVzdCwgYW5kIGl0IHdpbGwgb25seSB3b3JrIGlmIHRoZSBuYW1lIGxvb2tzIGxpa2UKLSAgICAgTkFNRS5zby5WRVJTSU9OLiAgRklYTUU6IERlcGVuZGluZyBvbiBmaWxlIG5hbWVzIGlzIGVycm9yLXByb25lLgotICAgICBJZiB3ZSByZWFsbHkgd2FudCB0byBpc3N1ZSB3YXJuaW5ncyBhYm91dCBtaXhpbmcgdmVyc2lvbiBudW1iZXJzCi0gICAgIG9mIHNoYXJlZCBsaWJyYXJpZXMsIHdlIG5lZWQgdG8gZmluZCBhIGJldHRlciB3YXkuICAqLwotCi0gIGlmIChzdHJjaHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICcvJykgIT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIHN1ZmZpeCA9IHN0cnN0ciAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgIi5zby4iKTsKLSAgaWYgKHN1ZmZpeCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgc3VmZml4ICs9IHNpemVvZiAiLnNvLiIgLSAxOwotCi0gIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gIGlmIChzb25hbWUgPT0gTlVMTCkKLSAgICBzb25hbWUgPSBzLT5maWxlbmFtZTsKLQotICBmID0gc3RycmNociAoc29uYW1lLCAnLycpOwotICBpZiAoZiAhPSBOVUxMKQotICAgICsrZjsKLSAgZWxzZQotICAgIGYgPSBzb25hbWU7Ci0KLSAgaWYgKHN0cm5jbXAgKGYsIGdsb2JhbF9uZWVkZWQtPm5hbWUsIHN1ZmZpeCAtIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0gICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiAlcywgbmVlZGVkIGJ5ICVCLCBtYXkgY29uZmxpY3Qgd2l0aCAlc1xuIiksCi0JICAgZ2xvYmFsX25lZWRlZC0+bmFtZSwgZ2xvYmFsX25lZWRlZC0+YnksIGYpOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgY29uc3QgY2hhciAqcnBhdGg7Ci0gIGFzZWN0aW9uICpzaW50ZXJwOwotCi0gIC8qIElmIHdlIGFyZSBnb2luZyB0byBtYWtlIGFueSB2YXJpYWJsZSBhc3NpZ25tZW50cywgd2UgbmVlZCB0byBsZXQKLSAgICAgdGhlIEVMRiBiYWNrZW5kIGtub3cgYWJvdXQgdGhlbSBpbiBjYXNlIHRoZSB2YXJpYWJsZXMgYXJlCi0gICAgIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGRlbGYzMmVibWlwX2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQpOwotCi0gIC8qIExldCB0aGUgRUxGIGJhY2tlbmQgd29yayBvdXQgdGhlIHNpemVzIG9mIGFueSBzZWN0aW9ucyByZXF1aXJlZAotICAgICBieSBkeW5hbWljIGxpbmtpbmcuICAqLwotICBycGF0aCA9IGNvbW1hbmRfbGluZS5ycGF0aDsKLSAgaWYgKHJwYXRoID09IE5VTEwpCi0gICAgcnBhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9SVU5fUEFUSCIpOwotICBpZiAoISBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLAotCQkJCQkJIGNvbW1hbmRfbGluZS5zb25hbWUsCi0JCQkJCQkgcnBhdGgsCi0JCQkJCQkgY29tbWFuZF9saW5lLmV4cG9ydF9keW5hbWljLAotCQkJCQkJICZsaW5rX2luZm8sCi0JCQkJCQkgJnNpbnRlcnApKQotICAgIGVpbmZvIChfKCIlUCVGOiBmYWlsZWQgdG8gc2V0IGR5bmFtaWMgc2VjdGlvbiBzaXplczogJUVcbiIpKTsKLQotICAvKiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIGR5bmFtaWMgbGlua2VyIHdlIGFyZSB1c2luZy4gICovCi0gIGlmIChjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgIT0gTlVMTAotICAgICAgJiYgc2ludGVycCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNpbnRlcnAtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGNvbW1hbmRfbGluZS5pbnRlcnByZXRlcjsKLSAgICAgIHNpbnRlcnAtPl9yYXdfc2l6ZSA9IHN0cmxlbiAoY29tbWFuZF9saW5lLmludGVycHJldGVyKSArIDE7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yIGFueSBzZWN0aW9ucyBuYW1lZCAuZ251Lndhcm5pbmcuICBBcyBhIEdOVSBleHRlbnNpb25zLAotICAgICB3ZSB0cmVhdCBzdWNoIHNlY3Rpb25zIGFzIGNvbnRhaW5pbmcgd2FybmluZyBtZXNzYWdlcy4gIFdlIHByaW50Ci0gICAgIG91dCB0aGUgd2FybmluZyBtZXNzYWdlLCBhbmQgdGhlbiB6ZXJvIG91dCB0aGUgc2VjdGlvbiBzaXplIHNvCi0gICAgIHRoYXQgaXQgZG9lcyBub3QgZ2V0IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlhc2VjdGlvbiAqczsKLQliZmRfc2l6ZV90eXBlIHN6OwotCWNoYXIgKm1zZzsKLQlib29sZWFuIHJldDsKLQotCWlmIChpcy0+anVzdF9zeW1zX2ZsYWcpCi0JICBjb250aW51ZTsKLQotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaXMtPnRoZV9iZmQsICIuZ251Lndhcm5pbmciKTsKLQlpZiAocyA9PSBOVUxMKQotCSAgY29udGludWU7Ci0KLQlzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGlzLT50aGVfYmZkLCBzKTsKLQltc2cgPSB4bWFsbG9jICgoc2l6ZV90KSBzeiArIDEpOwotCWlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaXMtPnRoZV9iZmQsIHMsIG1zZywgKGZpbGVfcHRyKSAwLCBzeikpCi0JICBlaW5mbyAoXygiJUYlQjogQ2FuJ3QgcmVhZCBjb250ZW50cyBvZiBzZWN0aW9uIC5nbnUud2FybmluZzogJUVcbiIpLAotCQkgaXMtPnRoZV9iZmQpOwotCW1zZ1tzel0gPSAnXDAnOwotCXJldCA9IGxpbmtfaW5mby5jYWxsYmFja3MtPndhcm5pbmcgKCZsaW5rX2luZm8sIG1zZywKLQkJCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCSAgICBpcy0+dGhlX2JmZCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCQkJCSAgICAoYmZkX3ZtYSkgMCk7Ci0JQVNTRVJUIChyZXQpOwotCWZyZWUgKG1zZyk7Ci0KLQkvKiBDbG9iYmVyIHRoZSBzZWN0aW9uIHNpemUsIHNvIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgY29weWluZyB0aGUKLQkgICB3YXJuaW5nIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQlzLT5fcmF3X3NpemUgPSAwOwotICAgICAgfQotICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lIHZpYQotICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBJdCBsb2NhdGVzIGFueSBhc3NpZ25tZW50IHN0YXRlbWVudHMsIGFuZAotICAgdGVsbHMgdGhlIEVMRiBiYWNrZW5kIGFib3V0IHRoZW0sIGluIGNhc2UgdGhleSBhcmUgYXNzaWdubWVudHMgdG8KLSAgIHN5bWJvbHMgd2hpY2ggYXJlIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0pCi0gICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotfQotCi0vKiBMb29rIHRocm91Z2ggYW4gZXhwcmVzc2lvbiBmb3IgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBldHJlZV9wcm92aWRlOgotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZXhwLT5hc3NpZ24uZHN0LAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlicmVhazsKLQotICAgICAgLyogV2UgY2FsbCByZWNvcmRfbGlua19hc3NpZ25tZW50IGV2ZW4gaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLgotCSBUaGlzIGlzIGJlY2F1c2UgaWYgaXQgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCB3ZQotCSBhY3R1YWxseSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgZGVmaW5lZCBieSB0aGUgbGlua2VyIHNjcmlwdCwKLQkgbm90IHRoZSB2YWx1ZSBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCAoYmVjYXVzZSB3ZSBhcmUgc2V0dGluZwotCSBzeW1ib2xzIGxpa2UgZXRleHQpLiAgSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhcgotCSBvYmplY3QsIHRoZW4sIGFzIGl0IGhhcHBlbnMsIGNhbGxpbmcgcmVjb3JkX2xpbmtfYXNzaWdubWVudAotCSB3aWxsIGRvIG5vIGhhcm0uICAqLwotCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgaWYgKHN0cmNtcCAoZXhwLT5hc3NpZ24uZHN0LCAiLiIpICE9IDApCi0JewotCSAgaWYgKCEgKGJmZF9lbGYzMl9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0JCSAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgZXhwLT5hc3NpZ24uZHN0LAotCQkgIGV4cC0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX3Byb3ZpZGUgPyB0cnVlIDogZmFsc2UpKSkKLQkgICAgZWluZm8gKF8oIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIpLAotCQkgICBleHAtPmFzc2lnbi5kc3QpOwotCX0KLSAgICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5Lmxocyk7Ci0gICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOwotICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkubGhzKTsKLSAgICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4gIFdlIHVzZSB0aGlzIHRvIHB1dCByYW5kb20gU0hGX0FMTE9DCi0gICBzZWN0aW9ucyBpbiB0aGUgcmlnaHQgc2VnbWVudC4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqaG9sZF9zZWN0aW9uOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdXNlOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdGV4dDsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3JvZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9ic3M7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yZWw7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWdsZGVsZjMyZWJtaXBfcGxhY2Vfb3JwaGFuIChmaWxlLCBzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqcGxhY2U7Ci0gIGFzZWN0aW9uICpzbmV3LCAqKnBwczsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpvbGQ7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7Ci0gIGV0cmVlX3R5cGUgKmFkZHJlc3M7Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWUsICpwczsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLSAgaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzY3JpcHQgdG8gc2VlIHdoZXJlIHRvIHBsYWNlIHRoaXMgc2VjdGlvbi4gICovCi0gIGhvbGRfc2VjdGlvbiA9IHM7Ci0gIGhvbGRfdXNlID0gTlVMTDsKLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZGVsZjMyZWJtaXBfcGxhY2Vfc2VjdGlvbik7Ci0KLSAgaWYgKGhvbGRfdXNlICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IHBsYWNlZCBhIHNlY3Rpb24gd2l0aCB0aGlzIG5hbWUuICAqLwotICAgICAgd2lsZF9kb2l0ICgmaG9sZF91c2UtPmNoaWxkcmVuLCBzLCBob2xkX3VzZSwgZmlsZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzLT5vd25lciwgcyk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIHRoZW4gYWx3YXlzIHB1dCAuZ251Lndhcm5pbmcuU1lNQk9MCi0gICAgIHNlY3Rpb25zIGludG8gdGhlIC50ZXh0IHNlY3Rpb24gdG8gZ2V0IHRoZW0gb3V0IG9mIHRoZSB3YXkuICAqLwotICBpZiAoISBsaW5rX2luZm8uc2hhcmVkCi0gICAgICAmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLSAgICAgICYmIHN0cm5jbXAgKHNlY25hbWUsICIuZ251Lndhcm5pbmcuIiwgc2l6ZW9mICIuZ251Lndhcm5pbmcuIiAtIDEpID09IDAKLSAgICAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHdpbGRfZG9pdCAoJmhvbGRfdGV4dC0+Y2hpbGRyZW4sIHMsIGhvbGRfdGV4dCwgZmlsZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogRGVjaWRlIHdoaWNoIHNlZ21lbnQgdGhlIHNlY3Rpb24gc2hvdWxkIGdvIGluIGJhc2VkIG9uIHRoZQotICAgICBzZWN0aW9uIG5hbWUgYW5kIHNlY3Rpb24gZmxhZ3MuICAqLwotICBwbGFjZSA9IE5VTEw7Ci0gIGlmICgocy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0gICAgICAmJiBob2xkX2JzcyAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9ic3M7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAotCSAgICYmIGhvbGRfZGF0YSAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9kYXRhOwotICBlbHNlIGlmIChzdHJuY21wIChzZWNuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkgICAmJiBob2xkX3JlbCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9yZWw7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgJiYgKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgJiYgaG9sZF9yb2RhdGEgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfcm9kYXRhOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfdGV4dDsKLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGFuZCBwdXQgaXQgaW4gdGhlIHJpZ2h0Ci0gICAgIHBsYWNlLiAgVGhpcyBzaHVmZmxpbmcgaXMgdG8gbWFrZSB0aGUgb3V0cHV0IGZpbGUgbG9vayBuZWF0ZXIuICAqLwotICBzbmV3ID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0cHV0X2JmZCwgc2VjbmFtZSk7Ci0gIGlmIChzbmV3ID09IE5VTEwpCi0gICAgICBlaW5mbyAoXygiJVAlRjogb3V0cHV0IGZvcm1hdCAlcyBjYW5ub3QgcmVwcmVzZW50IHNlY3Rpb24gY2FsbGVkICVzXG4iKSwKLQkgICAgIG91dHB1dF9iZmQtPnh2ZWMtPm5hbWUsIHNlY25hbWUpOwotICBpZiAocGxhY2UtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChwcHMgPSAmb3V0cHV0X2JmZC0+c2VjdGlvbnM7ICpwcHMgIT0gc25ldzsgcHBzID0gJigqcHBzKS0+bmV4dCkKLQk7Ci0gICAgICAqcHBzID0gc25ldy0+bmV4dDsKLSAgICAgIHNuZXctPm5leHQgPSBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQ7Ci0gICAgICBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQgPSBzbmV3OwotICAgIH0KLQotICAvKiBTdGFydCBidWlsZGluZyBhIGxpc3Qgb2Ygc3RhdGVtZW50cyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgb2xkID0gc3RhdF9wdHI7Ci0gIHN0YXRfcHRyID0gJmFkZDsKLSAgbGFuZ19saXN0X2luaXQgKHN0YXRfcHRyKTsKLQotICAvKiBJZiB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiBpcyByZXByZXNlbnRhYmxlIGluIEMsIHRoZW4gY3JlYXRlCi0gICAgIHN5bWJvbHMgdG8gbWFyayB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uICAqLwotICBmb3IgKHBzID0gc2VjbmFtZTsgKnBzICE9ICdcMCc7IHBzKyspCi0gICAgaWYgKCEgaXNhbG51bSAoKnBzKSAmJiAqcHMgIT0gJ18nKQotICAgICAgYnJlYWs7Ci0gIGlmICgqcHMgPT0gJ1wwJyAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bW5hbWU7Ci0KLSAgICAgIHN5bW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChwcyAtIHNlY25hbWUgKyBzaXplb2YgIl9fc3RhcnRfIik7Ci0gICAgICBzcHJpbnRmIChzeW1uYW1lLCAiX19zdGFydF8lcyIsIHNlY25hbWUpOwotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHN5bW5hbWUsCi0JCQkJICAgICAgZXhwX3Vub3AgKEFMSUdOX0ssCi0JCQkJCQlleHBfaW50b3AgKChiZmRfdm1hKSAxCi0JCQkJCQkJICAgPDwgcy0+YWxpZ25tZW50X3Bvd2VyKSkpKTsKLSAgICB9Ci0KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICBhZGRyZXNzID0gTlVMTDsKLSAgZWxzZQotICAgIGFkZHJlc3MgPSBleHBfaW50b3AgKChiZmRfdm1hKSAwKTsKLQotICBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoc2VjbmFtZSwgYWRkcmVzcywgMCwKLQkJCQkgICAgICAgKGJmZF92bWEpIDAsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwsCi0JCQkJICAgICAgIChldHJlZV90eXBlICopIE5VTEwpOwotCi0gIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChzZWNuYW1lKTsKLSAgd2lsZF9kb2l0ICgmb3MtPmNoaWxkcmVuLCBzLCBvcywgZmlsZSk7Ci0KLSAgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKChiZmRfdm1hKSAwLCAiKmRlZmF1bHQqIik7Ci0gIHN0YXRfcHRyID0gJmFkZDsKLQotICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICB7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotCi0gICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBzZWNuYW1lICsgc2l6ZW9mICJfX3N0b3BfIik7Ci0gICAgICBzcHJpbnRmIChzeW1uYW1lLCAiX19zdG9wXyVzIiwgc2VjbmFtZSk7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9Jywgc3ltbmFtZSwKLQkJCQkgICAgICBleHBfbmFtZW9wIChOQU1FLCAiLiIpKSk7Ci0gICAgfQotCi0gIC8qIE5vdyBzdGljayB0aGUgbmV3IHN0YXRlbWVudCBsaXN0IHJpZ2h0IGFmdGVyIFBMQUNFLiAgKi8KLSAgKmFkZC50YWlsID0gcGxhY2UtPmhlYWRlci5uZXh0OwotICBwbGFjZS0+aGVhZGVyLm5leHQgPSBhZGQuaGVhZDsKLQotICBzdGF0X3B0ciA9IG9sZDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfcGxhY2Vfc2VjdGlvbiAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLSAgaWYgKHMtPmhlYWRlci50eXBlICE9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW0pCi0gICAgcmV0dXJuOwotCi0gIG9zID0gJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLQotICBpZiAoc3RyY21wIChvcy0+bmFtZSwgaG9sZF9zZWN0aW9uLT5uYW1lKSA9PSAwKQotICAgIGhvbGRfdXNlID0gb3M7Ci0KLSAgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIudGV4dCIpID09IDApCi0gICAgaG9sZF90ZXh0ID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIucm9kYXRhIikgPT0gMCkKLSAgICBob2xkX3JvZGF0YSA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmRhdGEiKSA9PSAwKQotICAgIGhvbGRfZGF0YSA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmJzcyIpID09IDApCi0gICAgaG9sZF9ic3MgPSBvczsKLSAgZWxzZSBpZiAoaG9sZF9yZWwgPT0gTlVMTAotCSAgICYmIG9zLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0JICAgJiYgc3RybmNtcCAob3MtPm5hbWUsICIucmVsIiwgNCkgPT0gMCkKLSAgICBob2xkX3JlbCA9IG9zOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGRlbGYzMmVibWlwX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gIk9VVFBVVF9GT1JNQVQoXCJlbGYzMi1iaWdtaXBzXCIsIFwiZWxmMzItYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWxmMzItbGl0dGxlbWlwc1wiKVxuXAotT1VUUFVUX0FSQ0gobWlwcylcblwKLUVOVFJZKF9zdGFydClcblwKLSAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXNcblwKLSAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmdcblwKLSAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGRcblwKLSAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqL1xuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovXG5cCi0gIC5pbnRlcnAgICAwIDogeyAqKC5pbnRlcnApIAl9XG5cCi0gIC5yZWdpbmZvICAgICAwIDogeyAqKC5yZWdpbmZvKSB9XG5cCi0gIC5keW5hbWljICAgICAwIDogeyAqKC5keW5hbWljKSB9XG5cCi0gIC5keW5zdHIgICAgICAwIDogeyAqKC5keW5zdHIpCQl9XG5cCi0gIC5keW5zeW0gICAgICAwIDogeyAqKC5keW5zeW0pCQl9XG5cCi0gIC5oYXNoICAgICAgICAwIDogeyAqKC5oYXNoKQkJfVxuXAotICAucmVsLnRleHQgICAgMCA6IHsgKigucmVsLnRleHQpCQl9XG5cCi0gIC5yZWxhLnRleHQgICAwIDogeyAqKC5yZWxhLnRleHQpIAl9XG5cCi0gIC5yZWwuZGF0YSAgICAwIDogeyAqKC5yZWwuZGF0YSkJCX1cblwKLSAgLnJlbGEuZGF0YSAgIDAgOiB7ICooLnJlbGEuZGF0YSkgCX1cblwKLSAgLnJlbC5yb2RhdGEgIDAgOiB7ICooLnJlbC5yb2RhdGEpIAl9XG5cCi0gIC5yZWxhLnJvZGF0YSAwIDogeyAqKC5yZWxhLnJvZGF0YSkgCX1cblwKLSAgLnJlbC5nb3QgICAgIDAgOiB7ICooLnJlbC5nb3QpCQl9XG5cCi0gIC5yZWxhLmdvdCAgICAwIDogeyAqKC5yZWxhLmdvdCkJCX1cblwKLSAgLnJlbC5jdG9ycyAgIDAgOiB7ICooLnJlbC5jdG9ycykJfVxuXAotICAucmVsYS5jdG9ycyAgMCA6IHsgKigucmVsYS5jdG9ycykJfVxuXAotICAucmVsLmR0b3JzICAgMCA6IHsgKigucmVsLmR0b3JzKQl9XG5cCi0gIC5yZWxhLmR0b3JzICAwIDogeyAqKC5yZWxhLmR0b3JzKQl9XG5cCi0gIC5yZWwuaW5pdCAgICAwIDogeyAqKC5yZWwuaW5pdCkJfVxuXAotICAucmVsYS5pbml0ICAgMCA6IHsgKigucmVsYS5pbml0KQl9XG5cCi0gIC5yZWwuZmluaSAgICAwIDogeyAqKC5yZWwuZmluaSkJfVxuXAotICAucmVsYS5maW5pICAgMCA6IHsgKigucmVsYS5maW5pKQl9XG5cCi0gIC5yZWwuYnNzICAgICAwIDogeyAqKC5yZWwuYnNzKQkJfVxuXAotICAucmVsYS5ic3MgICAgMCA6IHsgKigucmVsYS5ic3MpCQl9XG5cCi0gIC5yZWwucGx0ICAgICAwIDogeyAqKC5yZWwucGx0KQkJfVxuXAotICAucmVsYS5wbHQgICAgMCA6IHsgKigucmVsYS5wbHQpCQl9XG5cCi0gIC5yb2RhdGEgIDAgOiB7ICooLnJvZGF0YSkgIH1cblwKLSAgLnJvZGF0YTEgMCA6IHsgKigucm9kYXRhMSkgfVxuXAotICAuaW5pdCAgICAgICAgMCA6IHsgKiguaW5pdCkJfSA9MFxuXAotICAudGV4dCAgICAwIDpcblwKLSAge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3R1YilcblwKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi9cblwKLSAgICAqKC5nbnUud2FybmluZylcblwKLSAgfSA9MFxuXAotICAuZmluaSAgICAwIDogeyAqKC5maW5pKSAgICB9ID0wXG5cCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvXG5cCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZFxuXAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczpcblwKLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGFcblwKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGVcblwKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZVxuXAotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlXG5cCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuXG5cCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmdcblwKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmVcblwKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlXG5cCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3RcblwKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqL1xuXAotICAuZGF0YSAgMCA6XG5cCi0gIHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gIC5kYXRhMSAwIDogeyAqKC5kYXRhMSkgfVxuXAotICAuY3RvcnMgICAgICAgMCA6IHsgKiguY3RvcnMpICAgfVxuXAotICAuZHRvcnMgICAgICAgMCA6IHsgKiguZHRvcnMpICAgfVxuXAotICAuZ290ICAgICAgICAgMCA6XG5cCi0gIHtcblwKLSAgICAqKC5nb3QucGx0KSAqKC5nb3QpXG5cCi0gICB9XG5cCi0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzXG5cCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc29cblwKLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi9cblwKLSAgLnNkYXRhICAgMCA6IHsgKiguc2RhdGEpIH1cblwKLSAgLnNic3MgICAgMCA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfVxuXAotICAuYnNzICAgICAwIDpcblwKLSAge1xuXAotICAgKiguZHluYnNzKVxuXAotICAgKiguYnNzKVxuXAotICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgLyogVGhlc2UgYXJlIG5lZWRlZCBmb3IgRUxGIGJhY2tlbmRzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuXG5cCi0gICAgIGNvbnZlcnRlZCB0byB0aGUgbmV3IHN0eWxlIGxpbmtlci4gICovXG5cCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH1cblwKLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfVxuXAotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy5cblwKLSAgICAgU3ltYm9scyBpbiB0aGUgLmRlYnVnIERXQVJGIHNlY3Rpb24gYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlXG5cCi0gICAgIHNlY3Rpb24gc28gd2UgYmVnaW4gLmRlYnVnIGF0IDAuICBJdCdzIG5vdCBjbGVhciB5ZXQgd2hhdCBuZWVkcyB0byBoYXBwZW5cblwKLSAgICAgZm9yIHRoZSBvdGhlcnMuICAgKi9cblwKLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9XG5cCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9XG5cCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9XG5cCi0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfVxuXAotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfVxuXAotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfVxuXAotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mIC4gICovXG5cCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH1cblwKLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfVxuXAotfVxuXG4iOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKLU9VVFBVVF9BUkNIKG1pcHMpXG5cCi1FTlRSWShfc3RhcnQpXG5cCi0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzXG5cCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nXG5cCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkXG5cCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi9cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAotICAuaW50ZXJwICAgMCA6IHsgKiguaW50ZXJwKSAJfVxuXAotICAucmVnaW5mbyAgICAgMCA6IHsgKigucmVnaW5mbykgfVxuXAotICAuZHluYW1pYyAgICAgMCA6IHsgKiguZHluYW1pYykgfVxuXAotICAuZHluc3RyICAgICAgMCA6IHsgKiguZHluc3RyKQkJfVxuXAotICAuZHluc3ltICAgICAgMCA6IHsgKiguZHluc3ltKQkJfVxuXAotICAuaGFzaCAgICAgICAgMCA6IHsgKiguaGFzaCkJCX1cblwKLSAgLnJlbC50ZXh0ICAgIDAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAotICAucmVsYS50ZXh0ICAgMCA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAotICAucmVsLmRhdGEgICAgMCA6IHsgKigucmVsLmRhdGEpCQl9XG5cCi0gIC5yZWxhLmRhdGEgICAwIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCi0gIC5yZWwucm9kYXRhICAwIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAotICAucmVsYS5yb2RhdGEgMCA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCi0gIC5yZWwuZ290ICAgICAwIDogeyAqKC5yZWwuZ290KQkJfVxuXAotICAucmVsYS5nb3QgICAgMCA6IHsgKigucmVsYS5nb3QpCQl9XG5cCi0gIC5yZWwuY3RvcnMgICAwIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKLSAgLnJlbGEuY3RvcnMgIDAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKLSAgLnJlbC5kdG9ycyAgIDAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAotICAucmVsYS5kdG9ycyAgMCA6IHsgKigucmVsYS5kdG9ycykJfVxuXAotICAucmVsLmluaXQgICAgMCA6IHsgKigucmVsLmluaXQpCX1cblwKLSAgLnJlbGEuaW5pdCAgIDAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAotICAucmVsLmZpbmkgICAgMCA6IHsgKigucmVsLmZpbmkpCX1cblwKLSAgLnJlbGEuZmluaSAgIDAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAotICAucmVsLmJzcyAgICAgMCA6IHsgKigucmVsLmJzcykJCX1cblwKLSAgLnJlbGEuYnNzICAgIDAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAotICAucmVsLnBsdCAgICAgMCA6IHsgKigucmVsLnBsdCkJCX1cblwKLSAgLnJlbGEucGx0ICAgIDAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAotICAucm9kYXRhICAwIDogeyAqKC5yb2RhdGEpICB9XG5cCi0gIC5yb2RhdGExIDAgOiB7ICooLnJvZGF0YTEpIH1cblwKLSAgLmluaXQgICAgICAgIDAgOiB7ICooLmluaXQpCX0gPTBcblwKLSAgLnRleHQgICAgMCA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0dWIpXG5cCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCi0gICAgKiguZ251Lndhcm5pbmcpXG5cCi0gIH0gPTBcblwKLSAgLmZpbmkgICAgMCA6IHsgKiguZmluaSkgICAgfSA9MFxuXAotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCi0gICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCi0gICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCi0gICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKLSAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAotICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAotICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCi0gICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCi0gICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAotICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCi0gICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKLSAgLmRhdGEgIDAgOlxuXAotICB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgfVxuXAotICAuZGF0YTEgMCA6IHsgKiguZGF0YTEpIH1cblwKLSAgLmN0b3JzICAgICAgIDAgOiB7ICooLmN0b3JzKSAgIH1cblwKLSAgLmR0b3JzICAgICAgIDAgOiB7ICooLmR0b3JzKSAgIH1cblwKLSAgLmdvdCAgICAgICAgIDAgOlxuXAotICB7XG5cCi0gICAgKiguZ290LnBsdCkgKiguZ290KVxuXAotICAgfVxuXAotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCi0gIC5zZGF0YSAgIDAgOiB7ICooLnNkYXRhKSB9XG5cCi0gIC5zYnNzICAgIDAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKLSAgLmJzcyAgICAgMCA6XG5cCi0gIHtcblwKLSAgICooLmR5bmJzcylcblwKLSAgICooLmJzcylcblwKLSAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCi0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCi0gICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAotICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCi0gICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAuICAqL1xuXAotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9XG5cCi0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH1cblwKLX1cblxuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gIk9VVFBVVF9GT1JNQVQoXCJlbGYzMi1iaWdtaXBzXCIsIFwiZWxmMzItYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWxmMzItbGl0dGxlbWlwc1wiKVxuXAotT1VUUFVUX0FSQ0gobWlwcylcblwKLUVOVFJZKF9zdGFydClcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1lbGYvbGliKTtcblwKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/XG5cCi0gICBfX0RZTkFNSUMgPSAwOyAgICAqL1xuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovXG5cCi0gIC4gPSAweDA0MDAwMDA7XG5cCi0gIC5pbnRlcnAgICAgIDogeyAqKC5pbnRlcnApIAl9XG5cCi0gIC5yZWdpbmZvICAgICAgIDogeyAqKC5yZWdpbmZvKSB9XG5cCi0gIC5keW5hbWljICAgICAgIDogeyAqKC5keW5hbWljKSB9XG5cCi0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9XG5cCi0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9XG5cCi0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfVxuXAotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9XG5cCi0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9XG5cCi0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX1cblwKLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX1cblwKLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9XG5cCi0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX1cblwKLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9XG5cCi0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX1cblwKLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfVxuXAotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfVxuXAotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9XG5cCi0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9XG5cCi0gIC5yZWwuaW5pdCAgICAgIDogeyAqKC5yZWwuaW5pdCkJfVxuXAotICAucmVsYS5pbml0ICAgICA6IHsgKigucmVsYS5pbml0KQl9XG5cCi0gIC5yZWwuZmluaSAgICAgIDogeyAqKC5yZWwuZmluaSkJfVxuXAotICAucmVsYS5maW5pICAgICA6IHsgKigucmVsYS5maW5pKQl9XG5cCi0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfVxuXAotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9XG5cCi0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfVxuXAotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9XG5cCi0gIC5yb2RhdGEgICAgOiB7ICooLnJvZGF0YSkgIH1cblwKLSAgLnJvZGF0YTEgICA6IHsgKigucm9kYXRhMSkgfVxuXAotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfSA9MFxuXAotICAudGV4dCAgICAgIDpcblwKLSAge1xuXAotICAgIF9mdGV4dCA9IC4gO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3R1YilcblwKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi9cblwKLSAgICAqKC5nbnUud2FybmluZylcblwKLSAgfSA9MFxuXAotICBfZXRleHQgPSAuO1xuXAotICBQUk9WSURFIChldGV4dCA9IC4pO1xuXAotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wXG5cCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvXG5cCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZFxuXAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczpcblwKLSAgICAgICAuID0gLjtcblwKLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGFcblwKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGVcblwKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZVxuXAotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlXG5cCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuXG5cCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmdcblwKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmVcblwKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlXG5cCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3RcblwKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqL1xuXAotICAuICs9IC4gLSAweDA0MDAwMDA7XG5cCi0gIC5kYXRhICAgIDpcblwKLSAge1xuXAotICAgIF9mZGF0YSA9IC4gO1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgLmRhdGExICAgOiB7ICooLmRhdGExKSB9XG5cCi0gIC5jdG9ycyAgICAgICAgIDogeyAqKC5jdG9ycykgICB9XG5cCi0gIC5kdG9ycyAgICAgICAgIDogeyAqKC5kdG9ycykgICB9XG5cCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDtcblwKLSAgLmdvdCAgICAgICAgICAgOlxuXAotICB7XG5cCi0gICAgKiguZ290LnBsdCkgKiguZ290KVxuXAotICAgfVxuXAotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCi0gIC5zZGF0YSAgICAgOiB7ICooLnNkYXRhKSB9XG5cCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9XG5cCi0gIC5saXQ0IDogeyAqKC5saXQ0KSB9XG5cCi0gIF9lZGF0YSAgPSAgLjtcblwKLSAgUFJPVklERSAoZWRhdGEgPSAuKTtcblwKLSAgX19ic3Nfc3RhcnQgPSAuO1xuXAotICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzICAgICAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKLSAgLmJzcyAgICAgICA6XG5cCi0gIHtcblwKLSAgICooLmR5bmJzcylcblwKLSAgICooLmJzcylcblwKLSAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIF9lbmQgPSAuIDtcblwKLSAgUFJPVklERSAoZW5kID0gLik7XG5cCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCi0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCi0gICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAotICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCi0gICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi9cblwKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfVxuXAotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9XG5cCi19XG5cbiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAiT1VUUFVUX0ZPUk1BVChcImVsZjMyLWJpZ21pcHNcIiwgXCJlbGYzMi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlbGYzMi1saXR0bGVtaXBzXCIpXG5cCi1PVVRQVVRfQVJDSChtaXBzKVxuXAotRU5UUlkoX3N0YXJ0KVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWVsZi9saWIpO1xuXAotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj9cblwKLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi9cblwKLSAgLiA9IDB4MDQwMDAwMDtcblwKLSAgLmludGVycCAgICAgOiB7ICooLmludGVycCkgCX1cblwKLSAgLnJlZ2luZm8gICAgICAgOiB7ICooLnJlZ2luZm8pIH1cblwKLSAgLmR5bmFtaWMgICAgICAgOiB7ICooLmR5bmFtaWMpIH1cblwKLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX1cblwKLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX1cblwKLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9XG5cCi0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX1cblwKLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX1cblwKLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfVxuXAotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfVxuXAotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX1cblwKLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfVxuXAotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX1cblwKLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfVxuXAotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9XG5cCi0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9XG5cCi0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX1cblwKLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX1cblwKLSAgLnJlbC5pbml0ICAgICAgOiB7ICooLnJlbC5pbml0KQl9XG5cCi0gIC5yZWxhLmluaXQgICAgIDogeyAqKC5yZWxhLmluaXQpCX1cblwKLSAgLnJlbC5maW5pICAgICAgOiB7ICooLnJlbC5maW5pKQl9XG5cCi0gIC5yZWxhLmZpbmkgICAgIDogeyAqKC5yZWxhLmZpbmkpCX1cblwKLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9XG5cCi0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX1cblwKLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9XG5cCi0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX1cblwKLSAgLnJvZGF0YSAgICA6IHsgKigucm9kYXRhKSAgfVxuXAotICAucm9kYXRhMSAgIDogeyAqKC5yb2RhdGExKSB9XG5cCi0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9ID0wXG5cCi0gIC50ZXh0ICAgICAgOlxuXAotICB7XG5cCi0gICAgX2Z0ZXh0ID0gLiA7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHViKVxuXAotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqL1xuXAotICAgICooLmdudS53YXJuaW5nKVxuXAotICB9ID0wXG5cCi0gIF9ldGV4dCA9IC47XG5cCi0gIFBST1ZJREUgKGV0ZXh0ID0gLik7XG5cCi0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTBcblwKLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG9cblwKLSAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gIEl0IHdvdWxkXG5cCi0gICAgIGJlIG1vcmUgY29ycmVjdCB0byBkbyB0aGlzOlxuXAotICAgICAgIC4gPSAweDEwMDAwMDAwO1xuXAotICAgICBUaGUgY3VycmVudCBleHByZXNzaW9uIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugb2YgYVxuXAotICAgICB0ZXh0IHNlZ21lbnQgZW5kaW5nIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIGEgcGFnZTsgaXQgY2F1c2VzIHRoZVxuXAotICAgICBkYXRhIHNlZ21lbnQgdG8gc2tpcCBhIHBhZ2UuICBUaGUgYWJvdmUgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlXG5cCi0gICAgIHRoaXMgcHJvYmxlbSwgYnV0IGl0IHdpbGwgY3VycmVudGx5ICgyLzk1KSBjYXVzZSBCRkQgdG8gYWxsb2NhdGVcblwKLSAgICAgYSBzaW5nbGUgc2VnbWVudCwgY29tYmluaW5nIGJvdGggdGV4dCBhbmQgZGF0YSwgZm9yIHRoaXMgY2FzZS5cblwKLSAgICAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHRleHQgc2VnbWVudCBmcm9tIGJlaW5nIHNoYXJlZCBhbW9uZ1xuXAotICAgICBtdWx0aXBsZSBleGVjdXRpb25zIG9mIHRoZSBwcm9ncmFtOyBJIHRoaW5rIHRoYXQgaXMgbW9yZVxuXAotICAgICBpbXBvcnRhbnQgdGhhbiBsb3NpbmcgYSBwYWdlIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKG5vdGVcblwKLSAgICAgdGhhdCBubyBhY3R1YWwgbWVtb3J5IGlzIGxvc3Q7IHRoZSBwYWdlIHdoaWNoIGlzIHNraXBwZWQgY2FuIG5vdFxuXAotICAgICBiZSByZWZlcmVuY2VkKS4gICovXG5cCi0gIC4gKz0gMHgxMDAwMDAwMCAtIDB4MDQwMDAwMDtcblwKLSAgLmRhdGEgICAgOlxuXAotICB7XG5cCi0gICAgX2ZkYXRhID0gLiA7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAuZGF0YTEgICA6IHsgKiguZGF0YTEpIH1cblwKLSAgLmN0b3JzICAgICAgICAgOiB7ICooLmN0b3JzKSAgIH1cblwKLSAgLmR0b3JzICAgICAgICAgOiB7ICooLmR0b3JzKSAgIH1cblwKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwO1xuXAotICAuZ290ICAgICAgICAgICA6XG5cCi0gIHtcblwKLSAgICAqKC5nb3QucGx0KSAqKC5nb3QpXG5cCi0gICB9XG5cCi0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzXG5cCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc29cblwKLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi9cblwKLSAgLnNkYXRhICAgICA6IHsgKiguc2RhdGEpIH1cblwKLSAgLmxpdDggOiB7ICooLmxpdDgpIH1cblwKLSAgLmxpdDQgOiB7ICooLmxpdDQpIH1cblwKLSAgX2VkYXRhICA9ICAuO1xuXAotICBQUk9WSURFIChlZGF0YSA9IC4pO1xuXAotICBfX2Jzc19zdGFydCA9IC47XG5cCi0gIF9mYnNzID0gLjtcblwKLSAgLnNic3MgICAgICA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfVxuXAotICAuYnNzICAgICAgIDpcblwKLSAge1xuXAotICAgKiguZHluYnNzKVxuXAotICAgKiguYnNzKVxuXAotICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgX2VuZCA9IC4gO1xuXAotICBQUk9WSURFIChlbmQgPSAuKTtcblwKLSAgLyogVGhlc2UgYXJlIG5lZWRlZCBmb3IgRUxGIGJhY2tlbmRzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuXG5cCi0gICAgIGNvbnZlcnRlZCB0byB0aGUgbmV3IHN0eWxlIGxpbmtlci4gICovXG5cCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH1cblwKLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfVxuXAotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy5cblwKLSAgICAgU3ltYm9scyBpbiB0aGUgLmRlYnVnIERXQVJGIHNlY3Rpb24gYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlXG5cCi0gICAgIHNlY3Rpb24gc28gd2UgYmVnaW4gLmRlYnVnIGF0IDAuICBJdCdzIG5vdCBjbGVhciB5ZXQgd2hhdCBuZWVkcyB0byBoYXBwZW5cblwKLSAgICAgZm9yIHRoZSBvdGhlcnMuICAgKi9cblwKLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9XG5cCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9XG5cCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9XG5cCi0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfVxuXAotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfVxuXAotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfVxuXAotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICAuICAqL1xuXAotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9XG5cCi0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH1cblwKLX1cblxuIjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm4gIk9VVFBVVF9GT1JNQVQoXCJlbGYzMi1iaWdtaXBzXCIsIFwiZWxmMzItYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWxmMzItbGl0dGxlbWlwc1wiKVxuXAotT1VUUFVUX0FSQ0gobWlwcylcblwKLUVOVFJZKF9zdGFydClcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1lbGYvbGliKTtcblwKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/XG5cCi0gICBfX0RZTkFNSUMgPSAwOyAgICAqL1xuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovXG5cCi0gIC4gPSAweDVmZmUwMDAwICsgU0laRU9GX0hFQURFUlM7XG5cCi0gIC5yZWdpbmZvICAgICAgIDogeyAqKC5yZWdpbmZvKSB9XG5cCi0gIC5keW5hbWljICAgICAgIDogeyAqKC5keW5hbWljKSB9XG5cCi0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9XG5cCi0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9XG5cCi0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfVxuXAotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9XG5cCi0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9XG5cCi0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX1cblwKLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX1cblwKLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9XG5cCi0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX1cblwKLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9XG5cCi0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX1cblwKLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfVxuXAotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfVxuXAotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9XG5cCi0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9XG5cCi0gIC5yZWwuaW5pdCAgICAgIDogeyAqKC5yZWwuaW5pdCkJfVxuXAotICAucmVsYS5pbml0ICAgICA6IHsgKigucmVsYS5pbml0KQl9XG5cCi0gIC5yZWwuZmluaSAgICAgIDogeyAqKC5yZWwuZmluaSkJfVxuXAotICAucmVsYS5maW5pICAgICA6IHsgKigucmVsYS5maW5pKQl9XG5cCi0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfVxuXAotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9XG5cCi0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfVxuXAotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9XG5cCi0gIC5yb2RhdGEgICAgOiB7ICooLnJvZGF0YSkgIH1cblwKLSAgLnJvZGF0YTEgICA6IHsgKigucm9kYXRhMSkgfVxuXAotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfSA9MFxuXAotICAudGV4dCAgICAgIDpcblwKLSAge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3R1YilcblwKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi9cblwKLSAgICAqKC5nbnUud2FybmluZylcblwKLSAgfSA9MFxuXAotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wXG5cCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvXG5cCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZFxuXAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczpcblwKLSAgICAgICAuID0gMHgxMDAwMDAwMDtcblwKLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGFcblwKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGVcblwKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZVxuXAotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlXG5cCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuXG5cCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmdcblwKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmVcblwKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlXG5cCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3RcblwKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqL1xuXAotICAuICs9IDB4MTAwMDA7XG5cCi0gIC5kYXRhICAgIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgLmRhdGExICAgOiB7ICooLmRhdGExKSB9XG5cCi0gIC5jdG9ycyAgICAgICAgIDogeyAqKC5jdG9ycykgICB9XG5cCi0gIC5kdG9ycyAgICAgICAgIDogeyAqKC5kdG9ycykgICB9XG5cCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDtcblwKLSAgLmdvdCAgICAgICAgICAgOlxuXAotICB7XG5cCi0gICAgKiguZ290LnBsdCkgKiguZ290KVxuXAotICAgfVxuXAotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCi0gIC5zZGF0YSAgICAgOiB7ICooLnNkYXRhKSB9XG5cCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9XG5cCi0gIC5saXQ0IDogeyAqKC5saXQ0KSB9XG5cCi0gIC5zYnNzICAgICAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKLSAgLmJzcyAgICAgICA6XG5cCi0gIHtcblwKLSAgICooLmR5bmJzcylcblwKLSAgICooLmJzcylcblwKLSAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCi0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCi0gICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAotICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCi0gICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi9cblwKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfVxuXAotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9XG5cCi19XG5cbiI7Ci0gIGVsc2UKLSAgICByZXR1cm4gIk9VVFBVVF9GT1JNQVQoXCJlbGYzMi1iaWdtaXBzXCIsIFwiZWxmMzItYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWxmMzItbGl0dGxlbWlwc1wiKVxuXAotT1VUUFVUX0FSQ0gobWlwcylcblwKLUVOVFJZKF9zdGFydClcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1lbGYvbGliKTtcblwKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/XG5cCi0gICBfX0RZTkFNSUMgPSAwOyAgICAqL1xuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovXG5cCi0gIC4gPSAweDA0MDAwMDA7XG5cCi0gIC5pbnRlcnAgICAgIDogeyAqKC5pbnRlcnApIAl9XG5cCi0gIC5yZWdpbmZvICAgICAgIDogeyAqKC5yZWdpbmZvKSB9XG5cCi0gIC5keW5hbWljICAgICAgIDogeyAqKC5keW5hbWljKSB9XG5cCi0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9XG5cCi0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9XG5cCi0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfVxuXAotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9XG5cCi0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9XG5cCi0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX1cblwKLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX1cblwKLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9XG5cCi0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX1cblwKLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9XG5cCi0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX1cblwKLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfVxuXAotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfVxuXAotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9XG5cCi0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9XG5cCi0gIC5yZWwuaW5pdCAgICAgIDogeyAqKC5yZWwuaW5pdCkJfVxuXAotICAucmVsYS5pbml0ICAgICA6IHsgKigucmVsYS5pbml0KQl9XG5cCi0gIC5yZWwuZmluaSAgICAgIDogeyAqKC5yZWwuZmluaSkJfVxuXAotICAucmVsYS5maW5pICAgICA6IHsgKigucmVsYS5maW5pKQl9XG5cCi0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfVxuXAotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9XG5cCi0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfVxuXAotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9XG5cCi0gIC5yb2RhdGEgICAgOiB7ICooLnJvZGF0YSkgIH1cblwKLSAgLnJvZGF0YTEgICA6IHsgKigucm9kYXRhMSkgfVxuXAotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfSA9MFxuXAotICAudGV4dCAgICAgIDpcblwKLSAge1xuXAotICAgIF9mdGV4dCA9IC4gO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3R1YilcblwKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi9cblwKLSAgICAqKC5nbnUud2FybmluZylcblwKLSAgfSA9MFxuXAotICBfZXRleHQgPSAuO1xuXAotICBQUk9WSURFIChldGV4dCA9IC4pO1xuXAotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wXG5cCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvXG5cCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZFxuXAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczpcblwKLSAgICAgICAuID0gMHgxMDAwMDAwMDtcblwKLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGFcblwKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGVcblwKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZVxuXAotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlXG5cCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuXG5cCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmdcblwKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmVcblwKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlXG5cCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3RcblwKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqL1xuXAotICAuICs9IDB4MTAwMDAwMDAgLSAweDA0MDAwMDA7XG5cCi0gIC5kYXRhICAgIDpcblwKLSAge1xuXAotICAgIF9mZGF0YSA9IC4gO1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgLmRhdGExICAgOiB7ICooLmRhdGExKSB9XG5cCi0gIC5jdG9ycyAgICAgICAgIDogeyAqKC5jdG9ycykgICB9XG5cCi0gIC5kdG9ycyAgICAgICAgIDogeyAqKC5kdG9ycykgICB9XG5cCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDtcblwKLSAgLmdvdCAgICAgICAgICAgOlxuXAotICB7XG5cCi0gICAgKiguZ290LnBsdCkgKiguZ290KVxuXAotICAgfVxuXAotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCi0gIC5zZGF0YSAgICAgOiB7ICooLnNkYXRhKSB9XG5cCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9XG5cCi0gIC5saXQ0IDogeyAqKC5saXQ0KSB9XG5cCi0gIF9lZGF0YSAgPSAgLjtcblwKLSAgUFJPVklERSAoZWRhdGEgPSAuKTtcblwKLSAgX19ic3Nfc3RhcnQgPSAuO1xuXAotICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzICAgICAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKLSAgLmJzcyAgICAgICA6XG5cCi0gIHtcblwKLSAgICooLmR5bmJzcylcblwKLSAgICooLmJzcylcblwKLSAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIF9lbmQgPSAuIDtcblwKLSAgUFJPVklERSAoZW5kID0gLik7XG5cCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCi0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCi0gICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAotICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCi0gICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi9cblwKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfVxuXAotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9XG5cCi19XG5cbiI7Ci19Ci0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfZWxmMzJlYm1pcF9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkZWxmMzJlYm1pcF9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkZWxmMzJlYm1pcF9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZGVsZjMyZWJtaXBfYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZGVsZjMyZWJtaXBfZ2V0X3NjcmlwdCwKLSAgImVsZjMyZWJtaXAiLAotICAiZWxmMzItYmlnbWlwcyIsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIGdsZGVsZjMyZWJtaXBfb3Blbl9keW5hbWljX2FyY2hpdmUsCi0gIGdsZGVsZjMyZWJtaXBfcGxhY2Vfb3JwaGFuCi19OwpkaWZmIC0tZ2l0IGEvbGQvbXB3LWVwcGNtYWMuYyBiL2xkL21wdy1lcHBjbWFjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDlhNDEuLjAwMDAwMDAKLS0tIGEvbGQvbXB3LWVwcGNtYWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMjQgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBBSVggZW11bGF0aW9uIGNvZGUgZm9yIHBwY21hY29zCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMsIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIEFJWCBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU19wcGNtYWNvcwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGN0b3IuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLQotc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZ2xkcHBjbWFjb3NfcGFyc2VfYXJncyBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfcmVhZF9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfZnJlZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyB2b2lkIGdsZHBwY21hY29zX2ZpbmRfcmVsb2NzCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGRwcGNtYWNvc19nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLS8qIFRoZSBmaWxlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgZWFjaCBzZWN0aW9uLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGZpbGVfYWxpZ247Ci0KLS8qIFRoZSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrIGlzIHBlcm1pdHRlZCB0byBncm93LiAgVGhpcyBpcyBzdG9yZWQgaW4KLSAgIHRoZSBhLm91dCBoZWFkZXIuICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4c3RhY2s7Ci0KLS8qIFRoZSBtYXhpbXVtIGRhdGEgc2l6ZS4gIFRoaXMgaXMgc3RvcmVkIGluIHRoZSBhLm91dCBoZWFkZXIuICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4ZGF0YTsKLQotLyogV2hldGhlciB0byBwZXJmb3JtIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi1zdGF0aWMgaW50IGdjID0gMTsKLQotLyogVGhlIG1vZHVsZSB0eXBlIHRvIHVzZS4gICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbW9kdHlwZSA9ICgnMScgPDwgOCkgfCAnTCc7Ci0KLS8qIFdoZXRoZXIgdGhlIC50ZXh0IHNlY3Rpb24gbXVzdCBiZSByZWFkLW9ubHkgKGkuZS4sIG5vIHJlbG9jcwotICAgcGVybWl0dGVkKS4gICovCi1zdGF0aWMgaW50IHRleHRybzsKLQotLyogV2hldGhlciB0byBpbXBsZW1lbnQgVW5peCBsaWtlIGxpbmtlciBzZW1hbnRpY3MuICAqLwotc3RhdGljIGludCB1bml4X2xkOwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGltcG9ydCBmaWxlIGxpc3QuICAqLwotCi1zdHJ1Y3QgZmlsZWxpc3QKLXsKLSAgc3RydWN0IGZpbGVsaXN0ICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotLyogTGlzdCBvZiBpbXBvcnQgZmlsZXMuICAqLwotc3RhdGljIHN0cnVjdCBmaWxlbGlzdCAqaW1wb3J0X2ZpbGVzOwotCi0vKiBMaXN0IG9mIGV4cG9ydCBzeW1ib2xzIHJlYWQgZnJvbSB0aGUgZXhwb3J0IGZpbGVzLiAgKi8KLQotc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdAotewotICBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotICBib29sZWFuIHN5c2NhbGw7Ci19OwotCi1zdGF0aWMgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqZXhwb3J0X3N5bWJvbHM7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgZG9uZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRwcGNtYWNvc19iZWZvcmVfcGFyc2UoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotLyogSGFuZGxlIEFJWCBzcGVjaWZpYyBvcHRpb25zLiAgKi8KLQotc3RhdGljIGludAotZ2xkcHBjbWFjb3NfcGFyc2VfYXJncyAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50IHByZXZvcHRlcnIgPSBvcHRlcnI7Ci0gIGludCBpbmR4OwotICBpbnQgbG9uZ2luZDsKLSAgaW50IG9wdGM7Ci0gIGxvbmcgdmFsOwotICBjaGFyICplbmQ7Ci0KLSNkZWZpbmUgT1BUSU9OX0lHTk9SRSAoMzAwKQotI2RlZmluZSBPUFRJT05fQVVUT0lNUCAoT1BUSU9OX0lHTk9SRSArIDEpCi0jZGVmaW5lIE9QVElPTl9FUk5PVE9LIChPUFRJT05fQVVUT0lNUCArIDEpCi0jZGVmaW5lIE9QVElPTl9FUk9LIChPUFRJT05fRVJOT1RPSyArIDEpCi0jZGVmaW5lIE9QVElPTl9FWFBPUlQgKE9QVElPTl9FUk9LICsgMSkKLSNkZWZpbmUgT1BUSU9OX0lNUE9SVCAoT1BUSU9OX0VYUE9SVCArIDEpCi0jZGVmaW5lIE9QVElPTl9MT0FETUFQIChPUFRJT05fSU1QT1JUICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BWERBVEEgKE9QVElPTl9MT0FETUFQICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BWFNUQUNLIChPUFRJT05fTUFYREFUQSArIDEpCi0jZGVmaW5lIE9QVElPTl9NT0RUWVBFIChPUFRJT05fTUFYU1RBQ0sgKyAxKQotI2RlZmluZSBPUFRJT05fTk9BVVRPSU1QIChPUFRJT05fTU9EVFlQRSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT1NUUkNNUENUIChPUFRJT05fTk9BVVRPSU1QICsgMSkKLSNkZWZpbmUgT1BUSU9OX1BEIChPUFRJT05fTk9TVFJDTVBDVCArIDEpCi0jZGVmaW5lIE9QVElPTl9QVCAoT1BUSU9OX1BEICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NUUkNNUENUIChPUFRJT05fUFQgKyAxKQotI2RlZmluZSBPUFRJT05fVU5JWCAoT1BUSU9OX1NUUkNNUENUICsgMSkKLQotICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0gewotICAgIHsiYmFzaXMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiYXV0b2ltcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQVVUT0lNUH0sCi0gICAgeyJiY29tcHJsZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJjcmxkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmNyb3IzMSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJEIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhEQVRBfSwKLSAgICB7ImJFIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlR9LAotICAgIHsiYmVybm90b2siLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VSTk9UT0t9LAotICAgIHsiYmVyb2siLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VST0t9LAotICAgIHsiYmVycm1zZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJleHBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVH0sCi0gICAgeyJiZiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVJOT1RPS30sCi0gICAgeyJiZ2MiLCBub19hcmd1bWVudCwgJmdjLCAxfSwKLSAgICB7ImJoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmhhbHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiSSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1QT1JUfSwKLSAgICB7ImJpbXBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNUE9SVH0sCi0gICAgeyJibCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTE9BRE1BUH0sCi0gICAgeyJibG9hZG1hcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTE9BRE1BUH0sCi0gICAgeyJibWF4ZGF0YSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYREFUQX0sCi0gICAgeyJibWF4c3RhY2siLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWFNUQUNLfSwKLSAgICB7ImJNIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NT0RUWVBFfSwKLSAgICB7ImJtb2R0eXBlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NT0RUWVBFfSwKLSAgICB7ImJub2F1dG9pbXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCi0gICAgeyJibm9kZWxjc2VjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJub2VudHJ5Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYm5vZ2MiLCBub19hcmd1bWVudCwgJmdjLCAwfSwKLSAgICB7ImJuc28iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCi0gICAgeyJibm9zdHJjbXBjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9TVFJDTVBDVH0sCi0gICAgeyJibm90ZXh0cm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMH0sCi0gICAgeyJibnJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDB9LAotICAgIHsiYnBEIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QRH0sCi0gICAgeyJicFQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BUfSwKLSAgICB7ImJybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAxfSwKLSAgICB7ImJTIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhTVEFDS30sCi0gICAgeyJic28iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FVVE9JTVB9LAotICAgIHsiYnN0cmNtcGN0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVFJDTVBDVH0sCi0gICAgeyJidGV4dHJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDF9LAotICAgIHsic3RhdGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAotICAgIHsidW5peCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVU5JWH0sCi0gICAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotICB9OwotCi0gIC8qIE9wdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBBSVggbGlua2VyIHdoaWNoIHdlIGRvIG5vdCBzdXBwb3J0OiAtZiwKLSAgICAgLVMsIC12LCAtWiwgLWJiaW5kY21kcywgLWJiaW5kZXIsIC1iYmluZG9wdHMsIC1iY2FsbHMsIC1iY2FwcywKLSAgICAgLWJjcm9yMTUsIC1iZGVidWdvcHQsIC1iZGJnLCAtYmRlbGNzZWN0LCAtYmV4PywgLWJmaWxlbGlzdCwgLWJmbCwKLSAgICAgLWJnY2J5cGFzcywgLWJnbGluaywgLWJpbnNlcnQsIC1iaSwgLWJsb2FkbWFwLCAtYmwsIC1ibWFwLCAtYm5sLAotICAgICAtYm5vYmluZCwgLWJub2NvbXBybGQsIC1ibm9jcmxkLCAtYm5vZXJybXNnLCAtYm5vZ2xpbmssCi0gICAgIC1ibm9sb2FkbWFwLCAtYm5sLCAtYm5vb2JqcmVvcmRlciwgLWJub3F1aWV0LCAtYm5vcmVvcmRlciwKLSAgICAgLWJub3R5cGNoaywgLWJub3gsIC1icXVpZXQsIC1iUiwgLWJyZW5hbWUsIC1icmVvcmRlciwgLWJ0eXBjaGssCi0gICAgIC1ieCwgLWJYLCAtYnhyZWYuICAqLwotCi0gIC8qIElmIHRoZSBjdXJyZW50IG9wdGlvbiBzdGFydHMgd2l0aCAtYiwgY2hhbmdlIHRoZSBmaXJzdCA6IHRvIGFuID0uCi0gICAgIFRoZSBBSVggbGlua2VyIHVzZXMgOiB0byBzZXBhcmF0ZSB0aGUgb3B0aW9uIGZyb20gdGhlIGFyZ3VtZW50OwotICAgICBjaGFuZ2luZyBpdCB0byA9IGxldHMgdXMgdHJlYXQgaXQgYXMgYSBnZXRvcHQgb3B0aW9uLiAgKi8KLSAgaW5keCA9IG9wdGluZDsKLSAgaWYgKGluZHggPT0gMCkKLSAgICBpbmR4ID0gMTsKLSAgaWYgKGluZHggPCBhcmdjICYmIHN0cm5jbXAgKGFyZ3ZbaW5keF0sICItYiIsIDIpID09IDApCi0gICAgewotICAgICAgY2hhciAqczsKLQotICAgICAgZm9yIChzID0gYXJndltpbmR4XTsgKnMgIT0gJ1wwJzsgcysrKQotCXsKLQkgIGlmICgqcyA9PSAnOicpCi0JICAgIHsKLQkgICAgICAqcyA9ICc9JzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgb3B0ZXJyID0gMDsKLSAgb3B0YyA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItRDpIOktUOnoiLCBsb25nb3B0cywgJmxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9wdGluZCA9IHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgMDoKLSAgICAgIC8qIExvbmcgb3B0aW9uIHdoaWNoIGp1c3Qgc2V0cyBhIGZsYWcuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdEJzoKLSAgICAgIHZhbCA9IHN0cnRvbCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1EIG51bWJlciAlc1xuIiksIG9wdGFyZyk7Ci0gICAgICBlbHNlIGlmICh2YWwgIT0gLTEpCi0JbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLmRhdGEiLCBleHBfaW50b3AgKHZhbCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdIJzoKLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnCi0JICB8fCAodmFsICYgKHZhbCAtIDEpKSAhPSAwKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtSCBudW1iZXIgJXNcbiIpLCBvcHRhcmcpOwotICAgICAgZWxzZQotCWZpbGVfYWxpZ24gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0snOgotICAgIGNhc2UgJ3onOgotICAgICAgLyogRklYTUU6IFRoaXMgc2hvdWxkIHVzZSB0aGUgcGFnZSBzaXplIGZvciB0aGUgdGFyZ2V0IHN5c3RlbS4gICovCi0gICAgICBmaWxlX2FsaWduID0gNDA5NjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICAvKiBPbiBBSVggdGhpcyBpcyB0aGUgc2FtZSBhcyBHTlUgbGQgLVR0ZXh0LiAgV2hlbiB3ZSBzZWUgLVQKLSAgICAgICAgIG51bWJlciwgd2UgYXNzdW1lIHRoZSBBSVggb3B0aW9uIGlzIGludGVuZGVkLiAgT3RoZXJ3aXNlLCB3ZQotICAgICAgICAgYXNzdW1lIHRoZSB1c3VhbCBHTlUgbGQgLVQgb3B0aW9uIGlzIGludGVuZGVkLiAgV2UgY2FuJ3QganVzdAotICAgICAgICAgaWdub3JlIHRoZSBBSVggb3B0aW9uLCBiZWNhdXNlIGdjYyBwYXNzZXMgaXQgdG8gdGhlIGxpbmtlci4gICovCi0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQl7Ci0JICBvcHRpbmQgPSBwcmV2b3B0aW5kOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCBleHBfaW50b3AgKHZhbCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9JR05PUkU6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0FVVE9JTVA6Ci0gICAgICBsaW5rX2luZm8uc3RhdGljX2xpbmsgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRVJOT1RPSzoKLSAgICAgIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FUk9LOgotICAgICAgZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRVhQT1JUOgotICAgICAgZ2xkcHBjbWFjb3NfcmVhZF9maWxlIChvcHRhcmcsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fSU1QT1JUOgotICAgICAgewotCXN0cnVjdCBmaWxlbGlzdCAqbjsKLQlzdHJ1Y3QgZmlsZWxpc3QgKipmbHBwOwotCi0JbiA9IChzdHJ1Y3QgZmlsZWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlsZWxpc3QpKTsKLQluLT5uZXh0ID0gTlVMTDsKLQluLT5uYW1lID0gb3B0YXJnOwotCWZscHAgPSAmaW1wb3J0X2ZpbGVzOwotCXdoaWxlICgqZmxwcCAhPSBOVUxMKQotCSAgZmxwcCA9ICYoKmZscHApLT5uZXh0OwotCSpmbHBwID0gbjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTE9BRE1BUDoKLSAgICAgIGNvbmZpZy5tYXBfZmlsZW5hbWUgPSBvcHRhcmc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01BWERBVEE6Ci0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLWJtYXhkYXRhIG51bWJlciAlc1xuIiksCi0JICAgICAgIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JbWF4ZGF0YSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUFYU1RBQ0s6Ci0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLWJtYXhzdGFjayBudW1iZXIgJXNcbiIpLAotCSAgICAgICBvcHRhcmcpOwotICAgICAgZWxzZQotCW1heHN0YWNrID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NT0RUWVBFOgotICAgICAgaWYgKCpvcHRhcmcgPT0gJ1MnKQotCXsKLQkgIGxpbmtfaW5mby5zaGFyZWQgPSB0cnVlOwotCSAgKytvcHRhcmc7Ci0JfQotICAgICAgaWYgKCpvcHRhcmcgPT0gJ1wwJyB8fCBvcHRhcmdbMV0gPT0gJ1wwJykKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgbW9kdWxlIHR5cGUgJXNcbiIpLCBvcHRhcmcpOwotICAgICAgZWxzZQotCW1vZHR5cGUgPSAoKm9wdGFyZyA8PCA4KSB8IG9wdGFyZ1sxXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9BVVRPSU1QOgotICAgICAgbGlua19pbmZvLnN0YXRpY19saW5rID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9TVFJDTVBDVDoKLSAgICAgIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QRDoKLSAgICAgIC8qIFRoaXMgc2V0cyB0aGUgcGFnZSB0aGF0IHRoZSAuZGF0YSBzZWN0aW9uIGlzIHN1cHBvc2VkIHRvCi0gICAgICAgICBzdGFydCBvbi4gIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYWdlIHNob3VsZCBzdGlsbCBiZSB0aGUKLSAgICAgICAgIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUsIHNvIHdlIG5lZWQgdG8gYnVpbGQgYW4gYXBwcm9wcmlhdGUKLSAgICAgICAgIGV4cHJlc3Npb24uICAqLwotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1wRCBudW1iZXIgJXNcbiIpLCBvcHRhcmcpOwotICAgICAgZWxzZQotCXsKLQkgIGV0cmVlX3R5cGUgKnQ7Ci0KLQkgIHQgPSBleHBfYmlub3AgKCcrJywKLQkJCSBleHBfaW50b3AgKHZhbCksCi0JCQkgZXhwX2Jpbm9wICgnJicsCi0JCQkJICAgIGV4cF9uYW1lb3AgKE5BTUUsICIuIiksCi0JCQkJICAgIGV4cF9pbnRvcCAoMHhmZmYpKSk7Ci0JICB0ID0gZXhwX2Jpbm9wICgnJicsCi0JCQkgZXhwX2Jpbm9wICgnKycsIHQsIGV4cF9pbnRvcCAoNykpLAotCQkJIGV4cF9pbnRvcCAofiAoYmZkX3ZtYSkgNykpOwotCSAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLmRhdGEiLCB0KTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1BUOgotICAgICAgLyogVGhpcyBzZXQgdGhlIHBhZ2UgdGhhdCB0aGUgLnRleHQgc2VjdGlvbiBpcyBzdXBwb3NlZCB0byBzdGFydAotICAgICAgICAgb24uICBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGFnZSBzaG91bGQgc3RpbGwgYmUgdGhlIG9mZnNldAotICAgICAgICAgd2l0aGluIHRoZSBmaWxlLiAgKi8KLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtcFQgbnVtYmVyICVzXG4iKSwgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBldHJlZV90eXBlICp0OwotCi0JICB0ID0gZXhwX2Jpbm9wICgnKycsCi0JCQkgZXhwX2ludG9wICh2YWwpLAotCQkJIGV4cF9uYW1lb3AgKFNJWkVPRl9IRUFERVJTLCBOVUxMKSk7Ci0JICB0ID0gZXhwX2Jpbm9wICgnJicsCi0JCQkgZXhwX2Jpbm9wICgnKycsIHQsIGV4cF9pbnRvcCAoNykpLAotCQkJIGV4cF9pbnRvcCAofiAoYmZkX3ZtYSkgNykpOwotCSAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCB0KTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1NUUkNNUENUOgotICAgICAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9VTklYOgotICAgICAgdW5peF9sZCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5wdXQgZmlsZSBjYW4gbm90IGJlIHJlY29nbml6ZWQgYXMgYSBCRkQKLSAgIG9iamVjdCBvciBhbiBhcmNoaXZlLiAgSWYgdGhlIGZpbGUgc3RhcnRzIHdpdGggIyEsIHdlIG11c3QgdHJlYXQgaXQKLSAgIGFzIGFuIGltcG9ydCBmaWxlLiAgVGhpcyBpcyBmb3IgQUlYIGNvbXBhdGliaWxpdHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkcHBjbWFjb3NfdW5yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgRklMRSAqZTsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgZSA9IGZvcGVuIChlbnRyeS0+ZmlsZW5hbWUsIEZPUEVOX1JUKTsKLSAgaWYgKGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0ID0gZmFsc2U7Ci0KLSAgaWYgKGdldGMgKGUpID09ICcjJyAmJiBnZXRjIChlKSA9PSAnIScpCi0gICAgewotICAgICAgc3RydWN0IGZpbGVsaXN0ICpuOwotICAgICAgc3RydWN0IGZpbGVsaXN0ICoqZmxwcDsKLQotICAgICAgbiA9IChzdHJ1Y3QgZmlsZWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlsZWxpc3QpKTsKLSAgICAgIG4tPm5leHQgPSBOVUxMOwotICAgICAgbi0+bmFtZSA9IGVudHJ5LT5maWxlbmFtZTsKLSAgICAgIGZscHAgPSAmaW1wb3J0X2ZpbGVzOwotICAgICAgd2hpbGUgKCpmbHBwICE9IE5VTEwpCi0JZmxwcCA9ICYoKmZscHApLT5uZXh0OwotICAgICAgKmZscHAgPSBuOwotCi0gICAgICByZXQgPSB0cnVlOwotICAgICAgZW50cnktPmxvYWRlZCA9IHRydWU7Ci0gICAgfQotCi0gIGZjbG9zZSAoZSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkcHBjbWFjb3NfYWZ0ZXJfb3BlbiAoKQotewotICBib29sZWFuIHI7Ci0gIHN0cnVjdCBzZXRfaW5mbyAqcDsKLQotICAvKiBDYWxsIGxkY3Rvcl9idWlsZF9zZXRzLCBhZnRlciBwcmV0ZW5kaW5nIHRoYXQgdGhpcyBpcyBhCi0gICAgIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG8gdGhpcyBiZWNhdXNlIEFJWCByZXF1aXJlcyByZWxvY2F0aW9uCi0gICAgIGVudHJpZXMgZm9yIGFsbCByZWZlcmVuY2VzIHRvIHN5bWJvbHMsIGV2ZW4gaW4gYSBmaW5hbAotICAgICBleGVjdXRhYmxlLiAgT2YgY291cnNlLCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBpZiB3ZSBhcmUKLSAgICAgcHJvZHVjaW5nIGFuIFhDT0ZGIG91dHB1dCBmaWxlLiAgKi8KLSAgciA9IGxpbmtfaW5mby5yZWxvY2F0ZWFibGU7Ci0gIGlmIChzdHJzdHIgKGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSwgInhjb2ZmIikgIT0gTlVMTCkKLSAgICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgbGRjdG9yX2J1aWxkX3NldHMgKCk7Ci0gIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSByOwotCi0gIC8qIEZvciBlYWNoIHNldCwgcmVjb3JkIHRoZSBzaXplLCBzbyB0aGF0IHRoZSBYQ09GRiBiYWNrZW5kIGNhbgotICAgICBvdXRwdXQgdGhlIGNvcnJlY3QgY3NlY3QgbGVuZ3RoLiAgKi8KLSAgZm9yIChwID0gc2V0czsgcCAhPSAoc3RydWN0IHNldF9pbmZvICopIE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB3ZSBtYXkgaGF2ZSBiZWVuIGludm9rZWQgZnJvbQotCSBjb2xsZWN0LCBhbmQgdGhlIHNldHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGJ1aWx0LCBzbyB3ZSBkbwotCSBub3QgZG8gYW55dGhpbmcuICAqLwotICAgICAgaWYgKHAtPmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQljb250aW51ZTsKLQotICAgICAgaWYgKHAtPnJlbG9jICE9IEJGRF9SRUxPQ19DVE9SKQotCXsKLQkgIC8qIEhhbmRsZSB0aGlzIGlmIHdlIG5lZWQgdG8uICAqLwotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBzaXplID0gKHAtPmNvdW50ICsgMikgKiA0OwotICAgICAgaWYgKCEgYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgcC0+aCwgc2l6ZSkpCi0JZWluZm8gKF8oIiVGJVA6IGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQgZmFpbGVkOiAlRVxuIikpOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRwcGNtYWNvc19iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICBzdHJ1Y3QgZmlsZWxpc3QgKmZsOwotICBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICplbDsKLSAgY2hhciAqbGlicGF0aDsKLSAgYXNlY3Rpb24gKnNwZWNpYWxfc2VjdGlvbnNbNl07Ci0gIGludCBpOwotCi0gIC8qIEhhbmRsZSB0aGUgaW1wb3J0IGFuZCBleHBvcnQgZmlsZXMsIGlmIGFueS4gICovCi0gIGZvciAoZmwgPSBpbXBvcnRfZmlsZXM7IGZsICE9IE5VTEw7IGZsID0gZmwtPm5leHQpCi0gICAgZ2xkcHBjbWFjb3NfcmVhZF9maWxlIChmbC0+bmFtZSwgdHJ1ZSk7Ci0gIGZvciAoZWwgPSBleHBvcnRfc3ltYm9sczsgZWwgIT0gTlVMTDsgZWwgPSBlbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZWwtPm5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQllaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgb2YgZXhwb3J0IHN5bWJvbCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgICBpZiAoISBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgaCwgZWwtPnN5c2NhbGwpKQotCWVpbmZvIChfKCIlUCVGOiBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgfQotCi0gIC8qIFRyYWNrIGRvd24gYWxsIHJlbG9jYXRpb25zIGNhbGxlZCBmb3IgYnkgdGhlIGxpbmtlciBzY3JpcHQgKHRoZXNlCi0gICAgIGFyZSB0eXBpY2FsbHkgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBlbnRyaWVzIGNyZWF0ZWQgYnkKLSAgICAgQ09OU1RSVUNUT1JTKSBhbmQgbGV0IHRoZSBiYWNrZW5kIGtub3cgaXQgd2lsbCBuZWVkIHRvIGNyZWF0ZQotICAgICAubG9hZGVyIHJlbG9jcyBmb3IgdGhlbS4gICovCi0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGRwcGNtYWNvc19maW5kX3JlbG9jcyk7Ci0KLSAgLyogV2UgbmVlZCB0byBidWlsZCBMSUJQQVRIIGZyb20gdGhlIC1MIGFyZ3VtZW50cy4gIElmIGFueSAtcnBhdGgKLSAgICAgYXJndW1lbnRzIHdlcmUgdXNlZCwgdGhvdWdoLCB3ZSB1c2UgLXJwYXRoIGluc3RlYWQsIGFzIGEgR05VCi0gICAgIGV4dGVuc2lvbi4gICovCi0gIGlmIChjb21tYW5kX2xpbmUucnBhdGggIT0gTlVMTCkKLSAgICBsaWJwYXRoID0gY29tbWFuZF9saW5lLnJwYXRoOwotICBlbHNlIGlmIChzZWFyY2hfaGVhZCA9PSBOVUxMKQotICAgIGxpYnBhdGggPSAoY2hhciAqKSAiIjsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemVfdCBsZW47Ci0gICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoc2VhcmNoX2hlYWQtPm5hbWUpOwotICAgICAgbGlicGF0aCA9IHhtYWxsb2MgKGxlbiArIDEpOwotICAgICAgc3RyY3B5IChsaWJwYXRoLCBzZWFyY2hfaGVhZC0+bmFtZSk7Ci0gICAgICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkLT5uZXh0OyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCXsKLQkgIHNpemVfdCBubGVuOwotCi0JICBubGVuID0gc3RybGVuIChzZWFyY2gtPm5hbWUpOwotCSAgbGlicGF0aCA9IHhyZWFsbG9jIChsaWJwYXRoLCBsZW4gKyBubGVuICsgMik7Ci0JICBsaWJwYXRoW2xlbl0gPSAnOic7Ci0JICBzdHJjcHkgKGxpYnBhdGggKyBsZW4gKyAxLCBzZWFyY2gtPm5hbWUpOwotCSAgbGVuICs9IG5sZW4gKyAxOwotCX0KLSAgICB9Ci0KLSAgLyogTGV0IHRoZSBYQ09GRiBiYWNrZW5kIHNldCB1cCB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KLSAgaWYgKCEgYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgbGlicGF0aCwKLQkJCQkJIGVudHJ5X3N5bWJvbCwgZmlsZV9hbGlnbiwKLQkJCQkJIG1heHN0YWNrLCBtYXhkYXRhLAotCQkJCQkgZ2MgJiYgISB1bml4X2xkID8gdHJ1ZSA6IGZhbHNlLAotCQkJCQkgbW9kdHlwZSwKLQkJCQkJIHRleHRybyA/IHRydWUgOiBmYWxzZSwKLQkJCQkJIHVuaXhfbGQsCi0JCQkJCSBzcGVjaWFsX3NlY3Rpb25zKSkKLSAgICBlaW5mbyAoXygiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKSk7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzcGVjaWFsIHNlY3Rpb25zLCBhbmQgcHV0IHRoZW0gaW4gdGhlIHJpZ2h0Ci0gICAgIHBsYWNlIGluIHRoZSBsaW5rIG9yZGVyaW5nLiAgVGhpcyBpcyBlc3BlY2lhbGx5IG1hZ2ljLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0gICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcGxzOwotICAgICAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmlzOwotICAgICAgY29uc3QgY2hhciAqb25hbWU7Ci0gICAgICBib29sZWFuIHN0YXJ0OwotCi0gICAgICBzZWMgPSBzcGVjaWFsX3NlY3Rpb25zW2ldOwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBSZW1vdmUgdGhpcyBzZWN0aW9uIGZyb20gdGhlIGxpc3Qgb2YgdGhlIG91dHB1dCBzZWN0aW9uLgotICAgICAgICAgVGhpcyBhc3N1bWVzIHdlIGtub3cgd2hhdCB0aGUgc2NyaXB0IGxvb2tzIGxpa2UuICAqLwotICAgICAgaXMgPSBOVUxMOwotICAgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUpOwotICAgICAgaWYgKG9zID09IE5VTEwpCi0JZWluZm8gKF8oIiVQJUY6IGNhbid0IGZpbmQgb3V0cHV0IHNlY3Rpb24gJXNcbiIpLAotCSAgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKLSAgICAgIGZvciAocGxzID0gJm9zLT5jaGlsZHJlbi5oZWFkOyAqcGxzICE9IE5VTEw7IHBscyA9ICYoKnBscyktPm5leHQpCi0JewotCSAgaWYgKCgqcGxzKS0+aGVhZGVyLnR5cGUgPT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0KLQkgICAgICAmJiAoKnBscyktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiA9PSBzZWMpCi0JICAgIHsKLQkgICAgICBpcyA9IChsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqKSAqcGxzOwotCSAgICAgICpwbHMgPSAoKnBscyktPm5leHQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmICgoKnBscyktPmhlYWRlci50eXBlID09IGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bSkKLQkgICAgewotCSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwd2xzOwotCi0JICAgICAgZm9yIChwd2xzID0gJigqcGxzKS0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZDsKLQkJICAgKnB3bHMgIT0gTlVMTDsKLQkJICAgcHdscyA9ICYoKnB3bHMpLT5uZXh0KQotCQl7Ci0JCSAgaWYgKCgqcHdscyktPmhlYWRlci50eXBlID09IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtCi0JCSAgICAgICYmICgqcHdscyktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiA9PSBzZWMpCi0JCSAgICB7Ci0JCSAgICAgIGlzID0gKGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICopICpwd2xzOwotCQkgICAgICAqcHdscyA9ICgqcHdscyktPm5leHQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgaWYgKGlzICE9IE5VTEwpCi0JCWJyZWFrOwotCSAgICB9Ci0JfQkKLQotICAgICAgaWYgKGlzID09IE5VTEwpCi0JZWluZm8gKF8oIiVQJUY6IGNhbid0IGZpbmQgJXMgaW4gb3V0cHV0IHNlY3Rpb25cbiIpLAotCSAgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoc2VjLT5vd25lciwgc2VjKSk7Ci0KLSAgICAgIC8qIE5vdyBmaWd1cmUgb3V0IHdoZXJlIHRoZSBzZWN0aW9uIHNob3VsZCBnby4gICovCi0gICAgICBzd2l0Y2ggKGkpCi0JewotCWRlZmF1bHQ6IC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCi0JY2FzZSAwOgotCSAgLyogX3RleHQgKi8KLQkgIG9uYW1lID0gIi50ZXh0IjsKLQkgIHN0YXJ0ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIC8qIF9ldGV4dCAqLwotCSAgb25hbWUgPSAiLnRleHQiOwotCSAgc3RhcnQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIC8qIF9kYXRhICovCi0JICBvbmFtZSA9ICIuZGF0YSI7Ci0JICBzdGFydCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIDM6Ci0JICAvKiBfZWRhdGEgKi8KLQkgIG9uYW1lID0gIi5kYXRhIjsKLQkgIHN0YXJ0ID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIDQ6Ci0JY2FzZSA1OgotCSAgLyogX2VuZCBhbmQgZW5kICovCi0JICBvbmFtZSA9ICIuYnNzIjsKLQkgIHN0YXJ0ID0gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChvbmFtZSk7Ci0KLSAgICAgIGlmIChzdGFydCkKLQl7Ci0JICBpcy0+aGVhZGVyLm5leHQgPSBvcy0+Y2hpbGRyZW4uaGVhZDsKLQkgIG9zLT5jaGlsZHJlbi5oZWFkID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgaXM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlzLT5oZWFkZXIubmV4dCA9IE5VTEw7Ci0JICBsYW5nX3N0YXRlbWVudF9hcHBlbmQgKCZvcy0+Y2hpbGRyZW4sCi0JCQkJIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGlzLAotCQkJCSAmaXMtPmhlYWRlci5uZXh0KTsKLQl9Ci0gICAgfQotfQotCi0vKiBSZWFkIGFuIGltcG9ydCBvciBleHBvcnQgZmlsZS4gIEZvciBhbiBpbXBvcnQgZmlsZSwgdGhpcyBpcyBjYWxsZWQKLSAgIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiBlbXVsYXRpb24gcm91dGluZS4gIEZvciBhbiBleHBvcnQgZmlsZSwKLSAgIHRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBwYXJzZV9hcmdzIGVtdWxhdGlvbiByb3V0aW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZHBwY21hY29zX3JlYWRfZmlsZSAoZmlsZW5hbWUsIGltcG9ydCkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGJvb2xlYW4gaW1wb3J0OwotewotICBzdHJ1Y3Qgb2JzdGFjayAqbzsKLSAgRklMRSAqZjsKLSAgaW50IGxpbmVubzsKLSAgaW50IGM7Ci0gIGJvb2xlYW4ga2VlcDsKLSAgY29uc3QgY2hhciAqaW1wcGF0aDsKLSAgY29uc3QgY2hhciAqaW1wZmlsZTsKLSAgY29uc3QgY2hhciAqaW1wbWVtYmVyOwotCi0gIG8gPSAoc3RydWN0IG9ic3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb2JzdGFjaykpOwotICBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbiAobywgMCwgMCwgeG1hbGxvYywgZ2xkcHBjbWFjb3NfZnJlZSk7Ci0KLSAgZiA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUlQpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICBlaW5mbyAoIiVGJXM6ICVFXG4iLCBmaWxlbmFtZSk7Ci0gICAgfQotCi0gIGtlZXAgPSBmYWxzZTsKLQotICBpbXBwYXRoID0gTlVMTDsKLSAgaW1wZmlsZSA9IE5VTEw7Ci0gIGltcG1lbWJlciA9IE5VTEw7Ci0KLSAgbGluZW5vID0gMDsKLSAgd2hpbGUgKChjID0gZ2V0YyAoZikpICE9IEVPRikKLSAgICB7Ci0gICAgICBjaGFyICpzOwotICAgICAgY2hhciAqc3ltbmFtZTsKLSAgICAgIGJvb2xlYW4gc3lzY2FsbDsKLSAgICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBpZiAoYyAhPSAnXG4nKQotCXsKLQkgIG9ic3RhY2tfMWdyb3cgKG8sIGMpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBvYnN0YWNrXzFncm93IChvLCAnXDAnKTsKLSAgICAgICsrbGluZW5vOwotCi0gICAgICBzID0gKGNoYXIgKikgb2JzdGFja19iYXNlIChvKTsKLSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotCSsrczsKLSAgICAgIGlmICgqcyA9PSAnXDAnCi0JICB8fCAqcyA9PSAnKicKLQkgIHx8ICgqcyA9PSAnIycgJiYgc1sxXSA9PSAnICcpCi0JICB8fCAoISBpbXBvcnQgJiYgKnMgPT0gJyMnICYmIHNbMV0gPT0gJyEnKSkKLQl7Ci0JICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKnMgPT0gJyMnICYmIHNbMV0gPT0gJyEnKQotCXsKLQkgIHMgKz0gMjsKLQkgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotCSAgICArK3M7Ci0JICBpZiAoKnMgPT0gJ1wwJykKLQkgICAgewotCSAgICAgIGltcHBhdGggPSBOVUxMOwotCSAgICAgIGltcGZpbGUgPSBOVUxMOwotCSAgICAgIGltcG1lbWJlciA9IE5VTEw7Ci0JICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnMgPT0gJygnKQotCSAgICBlaW5mbyAoXygiJUYlcyVkOiAjISAoW21lbWJlcl0pIGlzIG5vdCBzdXBwb3J0ZWQgaW4gaW1wb3J0IGZpbGVzXG4iKSwKLQkJICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyIGNzOwotCSAgICAgIGNoYXIgKmZpbGU7Ci0KLQkgICAgICAodm9pZCkgb2JzdGFja19maW5pc2ggKG8pOwotCSAgICAgIGtlZXAgPSB0cnVlOwotCSAgICAgIGltcHBhdGggPSBzOwotCSAgICAgIGZpbGUgPSBOVUxMOwotCSAgICAgIHdoaWxlICghIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykgJiYgKnMgIT0gJygnICYmICpzICE9ICdcMCcpCi0JCXsKLQkJICBpZiAoKnMgPT0gJy8nKQotCQkgICAgZmlsZSA9IHMgKyAxOwotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChmaWxlICE9IE5VTEwpCi0JCXsKLQkJICBmaWxlWy0xXSA9ICdcMCc7Ci0JCSAgaW1wZmlsZSA9IGZpbGU7Ci0JCSAgaWYgKGltcHBhdGggPT0gZmlsZSAtIDEpCi0JCSAgICBpbXBwYXRoID0gIi8iOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW1wZmlsZSA9IGltcHBhdGg7Ci0JCSAgaW1wcGF0aCA9ICIiOwotCQl9Ci0JICAgICAgY3MgPSAqczsKLQkgICAgICAqcyA9ICdcMCc7Ci0JICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcykpCi0JCXsKLQkJICArK3M7Ci0JCSAgY3MgPSAqczsKLQkJfQotCSAgICAgIGlmIChjcyAhPSAnKCcpCi0JCXsKLQkJICBpbXBtZW1iZXIgPSAiIjsKLQkJICBpZiAoY3MgIT0gJ1wwJykKLQkJICAgIGVpbmZvIChfKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydCBmaWxlXG4iKSwKLQkJCSAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKytzOwotCQkgIGltcG1lbWJlciA9IHM7Ci0JCSAgd2hpbGUgKCpzICE9ICcpJyAmJiAqcyAhPSAnXDAnKQotCQkgICAgKytzOwotCQkgIGlmICgqcyA9PSAnKScpCi0JCSAgICAqcyA9ICdcMCc7Ci0JCSAgZWxzZQotCQkgICAgZWluZm8gKF8oIiVzOiVkOiB3YXJuaW5nOiBzeW50YXggZXJyb3IgaW4gaW1wb3J0IGZpbGVcbiIpLAotCQkJICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBzeW1ib2wgdG8gYmUgaW1wb3J0ZWQgb3IgZXhwb3J0ZWQuICAqLwotICAgICAgc3ltbmFtZSA9IHM7Ci0gICAgICBzeXNjYWxsID0gZmFsc2U7Ci0gICAgICBhZGRyZXNzID0gKGJmZF92bWEpIC0xOwotCi0gICAgICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpICYmICpzICE9ICdcMCcpCi0JKytzOwotICAgICAgaWYgKCpzICE9ICdcMCcpCi0JewotCSAgY2hhciAqc2U7Ci0KLQkgICpzKysgPSAnXDAnOwotCi0JICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkgICAgKytzOwotCi0JICBzZSA9IHM7Ci0JICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnNlKSAmJiAqc2UgIT0gJ1wwJykKLQkgICAgKytzZTsKLQkgIGlmICgqc2UgIT0gJ1wwJykKLQkgICAgewotCSAgICAgICpzZSsrID0gJ1wwJzsKLQkgICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZSkpCi0JCSsrc2U7Ci0JICAgICAgaWYgKCpzZSAhPSAnXDAnKQotCQllaW5mbyAoXygiJXMlZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydC9leHBvcnQgZmlsZVxuIiksCi0JCSAgICAgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkgICAgfQotCi0JICBpZiAoc3RyY2FzZWNtcCAocywgInN2YyIpID09IDAKLQkgICAgICB8fCBzdHJjYXNlY21wIChzLCAic3lzY2FsbCIpID09IDApCi0JICAgIHN5c2NhbGwgPSB0cnVlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqZW5kOwotCi0JICAgICAgYWRkcmVzcyA9IHN0cnRvdWwgKHMsICZlbmQsIDApOwotCSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JCWVpbmZvIChfKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydC9leHBvcnQgZmlsZVxuIiksCi0JCSAgICAgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgaW1wb3J0KQotCXsKLQkgIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKm47Ci0KLQkgIGxkbGFuZ19hZGRfdW5kZWYgKHN5bW5hbWUpOwotCSAgbiA9ICgoc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqKQotCSAgICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QpKSk7Ci0JICBuLT5uZXh0ID0gZXhwb3J0X3N5bWJvbHM7Ci0JICBuLT5uYW1lID0gYnV5c3RyaW5nIChzeW1uYW1lKTsKLQkgIG4tPnN5c2NhbGwgPSBzeXNjYWxsOwotCSAgZXhwb3J0X3N5bWJvbHMgPSBuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBzeW1uYW1lLCBmYWxzZSwgZmFsc2UsCi0JCQkJICAgIHRydWUpOwotCSAgaWYgKGggPT0gTlVMTCB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuIGp1c3QgaWdub3JlIGF0dGVtcHRzIHRvIGltcG9ydCBhbiB1bnJlZmVyZW5jZWQKLQkJIHN5bWJvbC4gICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghIGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBoLAotCQkJCQkgICAgIGFkZHJlc3MsIGltcHBhdGgsIGltcGZpbGUsCi0JCQkJCSAgICAgaW1wbWVtYmVyKSkKLQkJZWluZm8gKF8oIiVYJXM6JWQ6IGZhaWxlZCB0byBpbXBvcnQgc3ltYm9sICVzOiAlRVxuIiksCi0JCSAgICAgICBmaWxlbmFtZSwgbGluZW5vLCBzeW1uYW1lKTsKLQkgICAgfQotCX0KLQotICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLSAgICB9Ci0KLSAgaWYgKG9ic3RhY2tfb2JqZWN0X3NpemUgKG8pID4gMCkKLSAgICB7Ci0gICAgICBlaW5mbyAoXygiJXM6JWQ6IHdhcm5pbmc6IGlnbm9yaW5nIHVudGVybWluYXRlZCBsYXN0IGxpbmVcbiIpLAotCSAgICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0gICAgICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOwotICAgIH0KLQotICBpZiAoISBrZWVwKQotICAgIHsKLSAgICAgIG9ic3RhY2tfZnJlZSAobywgTlVMTCk7Ci0gICAgICBmcmVlIChvKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgcm91dGluZSBzYXZlcyB1cyBmcm9tIHdvcnJ5aW5nIGFib3V0IGRlY2xhcmluZyBmcmVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZHBwY21hY29zX2ZyZWUgKHApCi0gICAgIFBUUiBwOwotewotICBmcmVlIChwKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUgdmlhCi0gICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGxvb2tzIGZvciByZWxvY2F0aW9ucyBhbmQgYXNzaWdubWVudHMKLSAgIHRvIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkcHBjbWFjb3NfZmluZF9yZWxvY3MgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtKQotICAgIHsKLSAgICAgIGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUgKnJzOwotCi0gICAgICBycyA9ICZzLT5yZWxvY19zdGF0ZW1lbnQ7Ci0gICAgICBpZiAocnMtPm5hbWUgPT0gTlVMTCkKLQllaW5mbyAoXygiJUYlUDogb25seSByZWxvY2F0aW9ucyBhZ2FpbnN0IHN5bWJvbHMgYXJlIHBlcm1pdHRlZFxuIikpOwotICAgICAgaWYgKCEgYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIHJzLT5uYW1lKSkKLQllaW5mbyAoXygiJUYlUDogYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MgZmFpbGVkOiAlRVxuIikpOwotICAgIH0KLQotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtKQotICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBhbiBleHByZXNzaW9uIGZvciBhbiBhc3NpZ25tZW50IHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBldHJlZV9wcm92aWRlOgotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZXhwLT5hc3NpZ24uZHN0LAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlicmVhazsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBldHJlZV9hc3NpZ246Ci0gICAgICBpZiAoc3RyY21wIChleHAtPmFzc2lnbi5kc3QsICIuIikgIT0gMCkKLQl7Ci0JICBpZiAoISBiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKLQkJCQkJCSAgZXhwLT5hc3NpZ24uZHN0KSkKLQkgICAgZWluZm8gKF8oIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIpLAotCQkgICBleHAtPmFzc2lnbi5kc3QpOwotCX0KLSAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YXNzaWduLnNyYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkubGhzKTsKLSAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5jb25kKTsKLSAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5saHMpOwotICAgICAgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnVuYXJ5LmNoaWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkcHBjbWFjb3NfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotIk9VVFBVVF9GT1JNQVQoXCJ4Y29mZi1wb3dlcm1hY1wiKVxuXAotT1VUUFVUX0FSQ0gocG93ZXJwYylcblwKLUVOVFJZKF9fc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAucGFkIDAgOiB7ICooLnBhZCkgfVxuXAotICAudGV4dCAwIDoge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKigucHIpXG5cCi0gICAgKigucm8pXG5cCi0gICAgKiguZGIpXG5cCi0gICAgKiguZ2wpXG5cCi0gICAgKigueG8pXG5cCi0gICAgKigudGkpXG5cCi0gICAgKigudGIpXG5cCi0gIH1cblwKLSAgLmRhdGEgMCA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgICooLnJ3KVxuXAotICAgICooLnN2KVxuXAotICAgICooLnVhKVxuXAotICAgIC4gPSBBTElHTig0KTtcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgICAqKC5kcylcblwKLSAgICAqKC50YzApXG5cCi0gICAgKigudGMpXG5cCi0gICAgKigudGQpXG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKiguYnMpXG5cCi0gICAgKigudWMpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgLmxvYWRlciAwIDoge1xuXAotICAgICooLmxvYWRlcilcblwKLSAgfVxuXAotICAuZGVidWcgMCA6IHtcblwKLSAgICAqKC5kZWJ1ZylcblwKLSAgfVxuXAotfVxuXG4iCi0gIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4KLSJPVVRQVVRfRk9STUFUKFwieGNvZmYtcG93ZXJtYWNcIilcblwKLU9VVFBVVF9BUkNIKHBvd2VycGMpXG5cCi1FTlRSWShfX3N0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLnBhZCAwIDogeyAqKC5wYWQpIH1cblwKLSAgLnRleHQgMCA6IHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnByKVxuXAotICAgICooLnJvKVxuXAotICAgICooLmRiKVxuXAotICAgICooLmdsKVxuXAotICAgICooLnhvKVxuXAotICAgICooLnRpKVxuXAotICAgICooLnRiKVxuXAotICB9XG5cCi0gIC5kYXRhIDAgOiB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAqKC5ydylcblwKLSAgICAqKC5zdilcblwKLSAgICAqKC51YSlcblwKLSAgICAuID0gQUxJR04oNCk7XG5cCi0gICAgKiguZHMpXG5cCi0gICAgKigudGMwKVxuXAotICAgICooLnRjKVxuXAotICAgICooLnRkKVxuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooLmJzKVxuXAotICAgICooLnVjKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gIC5sb2FkZXIgMCA6IHtcblwKLSAgICAqKC5sb2FkZXIpXG5cCi0gIH1cblwKLSAgLmRlYnVnIDAgOiB7XG5cCi0gICAgKiguZGVidWcpXG5cCi0gIH1cblwKLX1cblxuIgotICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybgotIk9VVFBVVF9GT1JNQVQoXCJ4Y29mZi1wb3dlcm1hY1wiKVxuXAotT1VUUFVUX0FSQ0gocG93ZXJwYylcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hcHBsZS1tYWNvcy9saWIpO1xuXAotRU5UUlkoX19zdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC5wYWQgMCA6IHsgKigucGFkKSB9XG5cCi0gIC50ZXh0ICAgOiB7XG5cCi0gICAgUFJPVklERSAoX3RleHQgPSAuKTtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnByKVxuXAotICAgICooLnJvKVxuXAotICAgICooLmRiKVxuXAotICAgICooLmdsKVxuXAotICAgICooLnhvKVxuXAotICAgICooLnRpKVxuXAotICAgICooLnRiKVxuXAotICAgIFBST1ZJREUgKF9ldGV4dCA9IC4pO1xuXAotICB9XG5cCi0gIC5kYXRhIDAgOiB7XG5cCi0gICAgUFJPVklERSAoX2RhdGEgPSAuKTtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgICooLnJ3KVxuXAotICAgICooLnN2KVxuXAotICAgICooLnVhKVxuXAotICAgIC4gPSBBTElHTig0KTtcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgICAqKC5kcylcblwKLSAgICAqKC50YzApXG5cCi0gICAgKigudGMpXG5cCi0gICAgKigudGQpXG5cCi0gICAgUFJPVklERSAoX2VkYXRhID0gLik7XG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKiguYnMpXG5cCi0gICAgKigudWMpXG5cCi0gICAgKihDT01NT04pXG5cCi0gICAgUFJPVklERSAoX2VuZCA9IC4pO1xuXAotICAgIFBST1ZJREUgKGVuZCA9IC4pO1xuXAotICB9XG5cCi0gIC5sb2FkZXIgMCA6IHtcblwKLSAgICAqKC5sb2FkZXIpXG5cCi0gIH1cblwKLSAgLmRlYnVnIDAgOiB7XG5cCi0gICAgKiguZGVidWcpXG5cCi0gIH1cblwKLX1cblxuIgotICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4KLSJPVVRQVVRfRk9STUFUKFwieGNvZmYtcG93ZXJtYWNcIilcblwKLU9VVFBVVF9BUkNIKHBvd2VycGMpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYXBwbGUtbWFjb3MvbGliKTtcblwKLUVOVFJZKF9fc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAucGFkIDAgOiB7ICooLnBhZCkgfVxuXAotICAudGV4dCAgIDoge1xuXAotICAgIFBST1ZJREUgKF90ZXh0ID0gLik7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5wcilcblwKLSAgICAqKC5ybylcblwKLSAgICAqKC5kYilcblwKLSAgICAqKC5nbClcblwKLSAgICAqKC54bylcblwKLSAgICAqKC50aSlcblwKLSAgICAqKC50YilcblwKLSAgICBQUk9WSURFIChfZXRleHQgPSAuKTtcblwKLSAgfVxuXAotICAuZGF0YSAwIDoge1xuXAotICAgIFBST1ZJREUgKF9kYXRhID0gLik7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAqKC5ydylcblwKLSAgICAqKC5zdilcblwKLSAgICAqKC51YSlcblwKLSAgICAuID0gQUxJR04oNCk7XG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gICAgKiguZHMpXG5cCi0gICAgKigudGMwKVxuXAotICAgICooLnRjKVxuXAotICAgICooLnRkKVxuXAotICAgIFBST1ZJREUgKF9lZGF0YSA9IC4pO1xuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooLmJzKVxuXAotICAgICooLnVjKVxuXAotICAgICooQ09NTU9OKVxuXAotICAgIFBST1ZJREUgKF9lbmQgPSAuKTtcblwKLSAgICBQUk9WSURFIChlbmQgPSAuKTtcblwKLSAgfVxuXAotICAubG9hZGVyIDAgOiB7XG5cCi0gICAgKigubG9hZGVyKVxuXAotICB9XG5cCi0gIC5kZWJ1ZyAwIDoge1xuXAotICAgICooLmRlYnVnKVxuXAotICB9XG5cCi19XG5cbiIKLSAgOyBlbHNlIHJldHVybgotIk9VVFBVVF9GT1JNQVQoXCJ4Y29mZi1wb3dlcm1hY1wiKVxuXAotT1VUUFVUX0FSQ0gocG93ZXJwYylcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hcHBsZS1tYWNvcy9saWIpO1xuXAotRU5UUlkoX19zdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC5wYWQgMCA6IHsgKigucGFkKSB9XG5cCi0gIC50ZXh0ICAgOiB7XG5cCi0gICAgUFJPVklERSAoX3RleHQgPSAuKTtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnByKVxuXAotICAgICooLnJvKVxuXAotICAgICooLmRiKVxuXAotICAgICooLmdsKVxuXAotICAgICooLnhvKVxuXAotICAgICooLnRpKVxuXAotICAgICooLnRiKVxuXAotICAgIFBST1ZJREUgKF9ldGV4dCA9IC4pO1xuXAotICB9XG5cCi0gIC5kYXRhIDAgOiB7XG5cCi0gICAgUFJPVklERSAoX2RhdGEgPSAuKTtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgICooLnJ3KVxuXAotICAgICooLnN2KVxuXAotICAgICooLnVhKVxuXAotICAgIC4gPSBBTElHTig0KTtcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgICAqKC5kcylcblwKLSAgICAqKC50YzApXG5cCi0gICAgKigudGMpXG5cCi0gICAgKigudGQpXG5cCi0gICAgUFJPVklERSAoX2VkYXRhID0gLik7XG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKiguYnMpXG5cCi0gICAgKigudWMpXG5cCi0gICAgKihDT01NT04pXG5cCi0gICAgUFJPVklERSAoX2VuZCA9IC4pO1xuXAotICAgIFBST1ZJREUgKGVuZCA9IC4pO1xuXAotICB9XG5cCi0gIC5sb2FkZXIgMCA6IHtcblwKLSAgICAqKC5sb2FkZXIpXG5cCi0gIH1cblwKLSAgLmRlYnVnIDAgOiB7XG5cCi0gICAgKiguZGVidWcpXG5cCi0gIH1cblwKLX1cblxuIgotOyB9Ci0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfcHBjbWFjb3NfZW11bGF0aW9uID0gCi17Ci0gIGdsZHBwY21hY29zX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGRwcGNtYWNvc19hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZHBwY21hY29zX2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGRwcGNtYWNvc19nZXRfc2NyaXB0LAotICAicHBjbWFjb3MiLAotICAieGNvZmYtcG93ZXJtYWMiLAotICAwLAkvKiBmaW5pc2ggKi8KLSAgMCwJLyogY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKi8KLSAgMCwJLyogb3Blbl9keW5hbWljX2FyY2hpdmUgKi8KLSAgMCwJLyogcGxhY2Vfb3JwaGFuICovCi0gIDAsCS8qIHNldF9zeW1ib2xzICovCi0gIGdsZHBwY21hY29zX3BhcnNlX2FyZ3MsCi0gIGdsZHBwY21hY29zX3VucmVjb2duaXplZF9maWxlCi19OwpkaWZmIC0tZ2l0IGEvbGQvbXB3LWVzaC5jIGIvbGQvbXB3LWVzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2JjNWY1Li4wMDAwMDAwCi0tLSBhL2xkL21wdy1lc2guYworKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuIHNoCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfc2gKLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLXN0YXRpYyB2b2lkIGdsZHNoX2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkc2hfZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkc2hfYmVmb3JlX3BhcnNlKCkKLXsKLSNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9zaDsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGRzaF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1jb25jYXQoCi0iT1VUUFVUX0ZPUk1BVChcImNvZmYtc2hcIilcblwKLU9VVFBVVF9BUkNIKHNoKVxuXAotTUVNT1JZXG5cCi17XG5cCi0gIHJhbSA6IG8gPSAweDEwMDAsIGwgPSA1MTJrXG5cCi19XG5cCi0gIiwiIFNFQ1RJT05TXG5cCi17XG5cCi0gIiwiICAudGV4dCA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0cmluZ3MpXG5cCi0gIH0gXG5cCi0gIC50b3JzIDpcblwKLSAge1xuXAotICAgIF9fX2N0b3JzID0gLiA7XG5cCi0gICAgKiguY3RvcnMpXG5cCi0gICAgX19fY3RvcnNfZW5kID0gLiA7XG5cCi0gICAgX19fZHRvcnMgPSAuIDtcblwKLSAgICAqKC5kdG9ycylcblwKLSAgICBfX19kdG9yc19lbmQgPSAuIDtcblwKLSAgfSBcblwKLSAiLCIgIC5kYXRhIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gIH0gXG5cCi0gIiwiIC5ic3MgOlxuXAotICB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9IFxuXAotICIsIiAuc3RhY2sgICA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFjaylcblwKLSAgfSBcblwKLSAiLCIgLnN0YWIgMCAgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYilcblwKLSAgfVxuXAotICIsIiAuc3RhYnN0ciAwICA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFic3RyKVxuXAotICB9XG5cCi19XG5cbiIsIE5VTEwpCi0gIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4KLWNvbmNhdCAoCi0iT1VUUFVUX0ZPUk1BVChcImNvZmYtc2hcIilcblwKLU9VVFBVVF9BUkNIKHNoKVxuXAotICIsIiBNRU1PUllcblwKLXtcblwKLSAgcmFtIDogbyA9IDB4MTAwMCwgbCA9IDUxMmtcblwKLX1cblwKLSAiLCIgU0VDVElPTlNcblwKLXtcblwKLSAiLCIgIC50ZXh0IDpcblwKLSAge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3RyaW5ncylcblwKLSAgfSBcblwKLSAiLCIgICAudG9ycyA6XG5cCi0gIHtcblwKLSAgICBfX19jdG9ycyA9IC4gO1xuXAotICAgICooLmN0b3JzKVxuXAotICAgIF9fX2N0b3JzX2VuZCA9IC4gO1xuXAotICAgIF9fX2R0b3JzID0gLiA7XG5cCi0gICAgKiguZHRvcnMpXG5cCi0gICAgX19fZHRvcnNfZW5kID0gLiA7XG5cCi0gIH0gXG5cCi0gIiwiICAgLmRhdGEgOlxuXAotICB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgfSBcblwKLSAiLCIgICAuYnNzIDpcblwKLSAge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfSBcblwKLSAiLCIgICAuc3RhY2sgICA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFjaylcblwKLSAgfSBcblwKLSAiLCIgICAuc3RhYiAwICA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFiKVxuXAotICB9XG5cCi0gIiwiICAgLnN0YWJzdHIgMCAgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYnN0cilcblwKLSAgfVxuXAotfVxuXG4iLCBOVUxMKQotICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybgotY29uY2F0ICgKLSJPVVRQVVRfRk9STUFUKFwiY29mZi1zaFwiKVxuXAotT1VUUFVUX0FSQ0goc2gpXG5cCi1NRU1PUllcblwKLXtcblwKLSAgcmFtIDogbyA9IDB4MTAwMCwgbCA9IDUxMmtcblwKLX1cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIiwiICAgLnRleHQgOlxuXAotICB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHJpbmdzKVxuXAotICAgICBfZXRleHQgPSAuIDsgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnRvcnMgOlxuXAotICB7XG5cCi0gICAgX19fY3RvcnMgPSAuIDtcblwKLSAgICAqKC5jdG9ycylcblwKLSAgICBfX19jdG9yc19lbmQgPSAuIDtcblwKLSAgICBfX19kdG9ycyA9IC4gO1xuXAotICAgICooLmR0b3JzKVxuXAotICAgIF9fX2R0b3JzX2VuZCA9IC4gO1xuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5kYXRhIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgIF9lZGF0YSA9IC4gOyBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuYnNzIDpcblwKLSAge1xuXAotICAgICBfYnNzX3N0YXJ0ID0gLiA7IFxuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgICAgX2VuZCA9IC4gOyAgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnN0YWNrICAweDMwMDAwICAgOlxuXAotICB7XG5cCi0gICAgIF9zdGFjayA9IC4gOyBcblwKLSAgICAqKC5zdGFjaylcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuc3RhYiAwIChOT0xPQUQpIDpcblwKLSAge1xuXAotICAgICooLnN0YWIpXG5cCi0gIH1cblwKLSAiLCIgICAuc3RhYnN0ciAwIChOT0xPQUQpIDpcblwKLSAge1xuXAotICAgICooLnN0YWJzdHIpXG5cCi0gIH1cblwKLX1cblxuIiwgTlVMTCkKLSAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuCi1jb25jYXQgKAotIk9VVFBVVF9GT1JNQVQoXCJjb2ZmLXNoXCIpXG5cCi1PVVRQVVRfQVJDSChzaClcblwKLU1FTU9SWVxuXAote1xuXAotICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEya1xuXAotfVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAiLCIgICAudGV4dCA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0cmluZ3MpXG5cCi0gICAgIF9ldGV4dCA9IC4gOyBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAudG9ycyA6XG5cCi0gIHtcblwKLSAgICBfX19jdG9ycyA9IC4gO1xuXAotICAgICooLmN0b3JzKVxuXAotICAgIF9fX2N0b3JzX2VuZCA9IC4gO1xuXAotICAgIF9fX2R0b3JzID0gLiA7XG5cCi0gICAgKiguZHRvcnMpXG5cCi0gICAgX19fZHRvcnNfZW5kID0gLiA7XG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLmRhdGEgOlxuXAotICB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAgX2VkYXRhID0gLiA7IFxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5ic3MgOlxuXAotICB7XG5cCi0gICAgIF9ic3Nfc3RhcnQgPSAuIDsgXG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICAgICBfZW5kID0gLiA7ICBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuc3RhY2sgIDB4MzAwMDAgICA6XG5cCi0gIHtcblwKLSAgICAgX3N0YWNrID0gLiA7IFxuXAotICAgICooLnN0YWNrKVxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5zdGFiIDAgKE5PTE9BRCkgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYilcblwKLSAgfVxuXAotICIsIiAgIC5zdGFic3RyIDAgKE5PTE9BRCkgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYnN0cilcblwKLSAgfVxuXAotfVxuXG4iLCBOVUxMKQotICA7IGVsc2UgcmV0dXJuCi1jb25jYXQgKAotIk9VVFBVVF9GT1JNQVQoXCJjb2ZmLXNoXCIpXG5cCi1PVVRQVVRfQVJDSChzaClcblwKLU1FTU9SWVxuXAote1xuXAotICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEya1xuXAotfVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAiLCIgICAudGV4dCA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0cmluZ3MpXG5cCi0gICAgIF9ldGV4dCA9IC4gOyBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAudG9ycyA6XG5cCi0gIHtcblwKLSAgICBfX19jdG9ycyA9IC4gO1xuXAotICAgICooLmN0b3JzKVxuXAotICAgIF9fX2N0b3JzX2VuZCA9IC4gO1xuXAotICAgIF9fX2R0b3JzID0gLiA7XG5cCi0gICAgKiguZHRvcnMpXG5cCi0gICAgX19fZHRvcnNfZW5kID0gLiA7XG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLmRhdGEgOlxuXAotICB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAgX2VkYXRhID0gLiA7IFxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5ic3MgOlxuXAotICB7XG5cCi0gICAgIF9ic3Nfc3RhcnQgPSAuIDsgXG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICAgICBfZW5kID0gLiA7ICBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuc3RhY2sgIDB4MzAwMDAgICA6XG5cCi0gIHtcblwKLSAgICAgX3N0YWNrID0gLiA7IFxuXAotICAgICooLnN0YWNrKVxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5zdGFiIDAgKE5PTE9BRCkgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYilcblwKLSAgfVxuXAotICIsIiAgIC5zdGFic3RyIDAgKE5PTE9BRCkgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYnN0cilcblwKLSAgfVxuXAotfVxuXG4iLCBOVUxMKQotOyB9Ci0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfc2hfZW11bGF0aW9uID0gCi17Ci0gIGdsZHNoX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBhZnRlcl9vcGVuX2RlZmF1bHQsCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkc2hfZ2V0X3NjcmlwdCwKLSAgInNoIiwKLSAgImNvZmYtc2giCi19OwpkaWZmIC0tZ2l0IGEvbGQvbXB3LWlkdG1pcHMuYyBiL2xkL21wdy1pZHRtaXBzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZGRjNzAuLjAwMDAwMDAKLS0tIGEvbGQvbXB3LWlkdG1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIEhhbmRsZSBlbWJlZGRlZCByZWxvY3MgZm9yIE1JUFMuCi0gICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+IGJhc2VkIG9uIGdlbmVyaWMuZW0uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX21pcHNpZHQKLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLXN0YXRpYyB2b2lkIGdsZG1pcHNpZHRfYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZG1pcHNpZHRfYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBjaGVja19zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBnbGRtaXBzaWR0X2FmdGVyX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZG1pcHNpZHRfZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkbWlwc2lkdF9iZWZvcmVfcGFyc2UoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX21pcHM7Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBydW4gYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLgotICAgV2UgY3JlYXRlIGEgLnJlbC5zZGF0YSBzZWN0aW9uIGZvciBlYWNoIGlucHV0IGZpbGUgd2l0aCBhIG5vbiB6ZXJvCi0gICAuc2RhdGEgc2VjdGlvbi4gIFRoZSBCRkQgYmFja2VuZCB3aWxsIGZpbGwgaW4gdGhlc2Ugc2VjdGlvbnMgd2l0aAotICAgbWFnaWMgbnVtYmVycyB3aGljaCBjYW4gYmUgdXNlZCB0byByZWxvY2F0ZSB0aGUgZGF0YSBzZWN0aW9uIGF0IHJ1bgotICAgdGltZS4gIFRoaXMgd2lsbCBvbmx5IGRvIHRoZSByaWdodCB0aGluZyBpZiBhbGwgdGhlIGlucHV0IGZpbGVzCi0gICBoYXZlIGJlZW4gY29tcGlsZWQgdXNpbmcgLW1lbWJlZGRlZC1waWMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkbWlwc2lkdF9hZnRlcl9vcGVuICgpCi17Ci0gIGJmZCAqYWJmZDsKLQotICBpZiAoISBjb21tYW5kX2xpbmUuZW1iZWRkZWRfcmVsb2NzCi0gICAgICB8fCBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICBmb3IgKGFiZmQgPSBsaW5rX2luZm8uaW5wdXRfYmZkczsgYWJmZCAhPSBOVUxMOyBhYmZkID0gYWJmZC0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpkYXRhc2VjOwotCi0gICAgICBkYXRhc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc2RhdGEiKTsKLQotICAgICAgLyogTm90ZSB0aGF0IHdlIGFzc3VtZSB0aGF0IHRoZSByZWxvY19jb3VudCBmaWVsZCBoYXMgYWxyZWFkeQotICAgICAgICAgYmVlbiBzZXQgdXAuICBXZSBjb3VsZCBjYWxsIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQsIGJ1dAotICAgICAgICAgdGhhdCByZXR1cm5zIHRoZSBzaXplIG9mIGEgbWVtb3J5IGJ1ZmZlciByYXRoZXIgdGhhbiBhIHJlbG9jCi0gICAgICAgICBjb3VudC4gIFdlIGRvIG5vdCB3YW50IHRvIGNhbGwgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYywKLSAgICAgICAgIGJlY2F1c2UgYWx0aG91Z2ggaXQgd291bGQgYWx3YXlzIHdvcmsgaXQgd291bGQgZm9yY2UgdXMgdG8KLSAgICAgICAgIHJlYWQgaW4gdGhlIHJlbG9jcyBpbnRvIEJGRCBjYW5vbmljYWwgZm9ybSwgd2hpY2ggd291bGQgd2FzdGUKLSAgICAgICAgIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUgYW5kIG1lbW9yeS4gICovCi0gICAgICBpZiAoZGF0YXNlYyAhPSBOVUxMICYmIGRhdGFzZWMtPnJlbG9jX2NvdW50ID4gMCkKLQl7Ci0JICBhc2VjdGlvbiAqcmVsc2VjOwotCi0JICByZWxzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJlbC5zZGF0YSIpOwotCSAgaWYgKHJlbHNlYyA9PSBOVUxMCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHJlbHNlYywKLQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWSkpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCByZWxzZWMsIDIpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsc2VjLAotCQkJCQkgZGF0YXNlYy0+cmVsb2NfY291bnQgKiA0KSkKLQkgICAgZWluZm8gKF8oIiVGJUI6IGNhbiBub3QgY3JlYXRlIC5yZWwuc2RhdGEgc2VjdGlvbjogJUVcbiIpKTsKLQl9Ci0KLSAgICAgIC8qIERvdWJsZSBjaGVjayB0aGF0IGFsbCBvdGhlciBkYXRhIHNlY3Rpb25zIGFyZSBlbXB0eSwgYXMgaXMKLSAgICAgICAgIHJlcXVpcmVkIGZvciBlbWJlZGRlZCBQSUMgY29kZS4gICovCi0gICAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGNoZWNrX3NlY3Rpb25zLCAoUFRSKSBkYXRhc2VjKTsKLSAgICB9Ci19Ci0KLS8qIENoZWNrIHRoYXQgb2YgdGhlIGRhdGEgc2VjdGlvbnMsIG9ubHkgdGhlIC5zZGF0YSBzZWN0aW9uIGhhcwotICAgcmVsb2NzLiAgVGhpcyBpcyBjYWxsZWQgdmlhIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1jaGVja19zZWN0aW9ucyAoYWJmZCwgc2VjLCBzZGF0YXNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgc2RhdGFzZWM7Ci17Ci0gIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0NPREUpID09IDAKLSAgICAgICYmIHNlYyAhPSAoYXNlY3Rpb24gKikgc2RhdGFzZWMKLSAgICAgICYmIHNlYy0+cmVsb2NfY291bnQgIT0gMCkKLSAgICBlaW5mbyAoXygiJUYlWDogc2VjdGlvbiAlcyBoYXMgcmVsb2NzOyBjYW4gbm90IHVzZSAtLWVtYmVkZGVkLXJlbG9jc1xuIiksCi0JICAgYWJmZCwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbiBzaXplcyBhbmQgb2Zmc2V0cyBoYXZlCi0gICBiZWVuIHNldC4gIElmIHdlIGFyZSBnZW5lcmF0aW5nIGVtYmVkZGVkIHJlbG9jcywgaXQgY2FsbHMgYSBzcGVjaWFsCi0gICBCRkQgYmFja2VuZCByb3V0aW5lIHRvIGRvIHRoZSB3b3JrLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZG1pcHNpZHRfYWZ0ZXJfYWxsb2NhdGlvbiAoKQotewotICBiZmQgKmFiZmQ7Ci0KLSAgaWYgKCEgY29tbWFuZF9saW5lLmVtYmVkZGVkX3JlbG9jcwotICAgICAgfHwgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChhYmZkID0gbGlua19pbmZvLmlucHV0X2JmZHM7IGFiZmQgIT0gTlVMTDsgYWJmZCA9IGFiZmQtPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqZGF0YXNlYywgKnJlbHNlYzsKLSAgICAgIGNoYXIgKmVycm1zZzsKLQotICAgICAgZGF0YXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7Ci0KLSAgICAgIGlmIChkYXRhc2VjID09IE5VTEwgfHwgZGF0YXNlYy0+cmVsb2NfY291bnQgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVsLnNkYXRhIik7Ci0gICAgICBBU1NFUlQgKHJlbHNlYyAhPSBOVUxMKTsKLQotICAgICAgaWYgKCEgYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcyAoYWJmZCwgJmxpbmtfaW5mbywKLQkJCQkJCSAgIGRhdGFzZWMsIHJlbHNlYywKLQkJCQkJCSAgICZlcnJtc2cpKQotCXsKLQkgIGlmIChlcnJtc2cgPT0gTlVMTCkKLQkgICAgZWluZm8gKF8oIiVCJVg6IGNhbiBub3QgY3JlYXRlIHJ1bnRpbWUgcmVsb2MgaW5mb3JtYXRpb246ICVFXG4iKSwKLQkJICAgYWJmZCk7Ci0JICBlbHNlCi0JICAgIGVpbmZvIChfKCIlWCVCOiBjYW4gbm90IGNyZWF0ZSBydW50aW1lIHJlbG9jIGluZm9ybWF0aW9uOiAlc1xuIiksCi0JCSAgIGFiZmQsIGVycm1zZyk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkbWlwc2lkdF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi1jb25jYXQoCi0iT1VUUFVUX0ZPUk1BVChcImVjb2ZmLWJpZ21pcHNcIiwgXCJlY29mZi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlY29mZi1saXR0bGVtaXBzXCIpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtaWR0LWVjb2ZmL2xpYik7XG5cCi1FTlRSWShzdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC50ZXh0IDoge1xuXAotICAgIDtcblwKLSAgICAqKC5pbml0KVxuXAotICAgIDtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnJlbC5zZGF0YSlcblwKLSAgICAqKC5maW5pKVxuXAotICAgIDtcblwKLSAgICA7XG5cCi0gIH1cblwKLSAiLCIgIC5yZGF0YSA6IHtcblwKLSAgICAqKC5yZGF0YSlcblwKLSAgfVxuXAotICAuZGF0YSA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gIC5saXQ4IDoge1xuXAotICAgICooLmxpdDgpXG5cCi0gIH1cblwKLSAgLmxpdDQgOiB7XG5cCi0gICAgKigubGl0NClcblwKLSAgfVxuXAotICIsIiAgLnNkYXRhIDoge1xuXAotICAgICooLnNkYXRhKVxuXAotICB9XG5cCi0gIC5zYnNzIDoge1xuXAotICAgICooLnNic3MpXG5cCi0gICAgKiguc2NvbW1vbilcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfVxuXAotfVxuXG4iLCBOVUxMKQotICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuCi0iT1VUUFVUX0ZPUk1BVChcImVjb2ZmLWJpZ21pcHNcIiwgXCJlY29mZi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlY29mZi1saXR0bGVtaXBzXCIpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtaWR0LWVjb2ZmL2xpYik7XG5cCi1FTlRSWShzdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC50ZXh0IDoge1xuXAotICAgIDtcblwKLSAgICAqKC5pbml0KVxuXAotICAgIDtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnJlbC5zZGF0YSlcblwKLSAgICAqKC5maW5pKVxuXAotICAgIDtcblwKLSAgICA7XG5cCi0gIH1cblwKLSAgLnJkYXRhIDoge1xuXAotICAgICooLnJkYXRhKVxuXAotICB9XG5cCi0gIC5kYXRhIDoge1xuXAotICAgICooLmRhdGEpXG5cCi0gIH1cblwKLSAgLmxpdDggOiB7XG5cCi0gICAgKigubGl0OClcblwKLSAgfVxuXAotICAubGl0NCA6IHtcblwKLSAgICAqKC5saXQ0KVxuXAotICB9XG5cCi0gIC5zZGF0YSA6IHtcblwKLSAgICAqKC5zZGF0YSlcblwKLSAgfVxuXAotICAuc2JzcyA6IHtcblwKLSAgICAqKC5zYnNzKVxuXAotICAgICooLnNjb21tb24pXG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLX1cblxuIgotICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybgotY29uY2F0KAotIk9VVFBVVF9GT1JNQVQoXCJlY29mZi1iaWdtaXBzXCIsIFwiZWNvZmYtYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWNvZmYtbGl0dGxlbWlwc1wiKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWlkdC1lY29mZi9saWIpO1xuXAotRU5UUlkoc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAuID0gMHhhMDAxMjAwMDtcblwKLSAgLnRleHQgOiB7XG5cCi0gICAgIF9mdGV4dCA9IC4gO1xuXAotICAgICooLmluaXQpXG5cCi0gICAgIGVwcm9sICA9ICAuO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0YXJ0ID0gLik7XG5cCi0gICAgKigucmVsLnNkYXRhKVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdG9wID0gLik7XG5cCi0gICAgKiguZmluaSlcblwKLSAgICAgZXRleHQgID0gIC47XG5cCi0gICAgIF9ldGV4dCAgPSAgLjtcblwKLSIsIiAgfVxuXAotICAuID0gLjtcblwKLSAgLnJkYXRhIDoge1xuXAotICAgICooLnJkYXRhKVxuXAotICB9XG5cCi0gICBfZmRhdGEgPSBBTElHTigxNik7XG5cCi0gIC5kYXRhIDoge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgIF9ncCA9IEFMSUdOKDE2KSArIDB4ODAwMDtcblwKLSAgLmxpdDggOiB7XG5cCi0gICAgKigubGl0OClcblwKLSAgfVxuXAotICAubGl0NCA6IHtcblwKLSAgICAqKC5saXQ0KVxuXAotICB9XG5cCi0gIC5zZGF0YSA6IHtcblwKLSAgICAqKC5zZGF0YSlcblwKLSAgfVxuXAotIiwiICAgZWRhdGEgID0gIC47XG5cCi0gICBfZWRhdGEgID0gIC47XG5cCi0gICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzIDoge1xuXAotICAgICooLnNic3MpXG5cCi0gICAgKiguc2NvbW1vbilcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfVxuXAotICAgZW5kID0gLjtcblwKLSAgIF9lbmQgPSAuO1xuXAotfVxuXG4iCi0sIE5VTEwpCi0gIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybgotY29uY2F0ICgKLSJPVVRQVVRfRk9STUFUKFwiZWNvZmYtYmlnbWlwc1wiLCBcImVjb2ZmLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVjb2ZmLWxpdHRsZW1pcHNcIilcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1pZHQtZWNvZmYvbGliKTtcblwKLUVOVFJZKHN0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLiA9IDB4YTAwMTIwMDA7XG5cCi0gIC50ZXh0IDoge1xuXAotICAgICBfZnRleHQgPSAuIDtcblwKLSAgICAqKC5pbml0KVxuXAotICAgICBlcHJvbCAgPSAgLjtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdGFydCA9IC4pO1xuXAotICAgICooLnJlbC5zZGF0YSlcblwKLSAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RvcCA9IC4pO1xuXAotICAgICooLmZpbmkpXG5cCi0gICAgIGV0ZXh0ICA9ICAuO1xuXAotICAgICBfZXRleHQgID0gIC47XG5cCi0gIiwiICB9XG5cCi0gIC4gPSAuO1xuXAotICAucmRhdGEgOiB7XG5cCi0gICAgKigucmRhdGEpXG5cCi0gIH1cblwKLSAgIF9mZGF0YSA9IEFMSUdOKDE2KTtcblwKLSAgLmRhdGEgOiB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAgX2dwID0gQUxJR04oMTYpICsgMHg4MDAwO1xuXAotICAubGl0OCA6IHtcblwKLSAgICAqKC5saXQ4KVxuXAotICIsIiAgfVxuXAotICAubGl0NCA6IHtcblwKLSAgICAqKC5saXQ0KVxuXAotICB9XG5cCi0gIC5zZGF0YSA6IHtcblwKLSAgICAqKC5zZGF0YSlcblwKLSAgfVxuXAotICAgZWRhdGEgID0gIC47XG5cCi0gICBfZWRhdGEgID0gIC47XG5cCi0gICBfZmJzcyA9IC47XG5cCi0gIC5zYnNzIDoge1xuXAotICAgICooLnNic3MpXG5cCi0gICAgKiguc2NvbW1vbilcblwKLSAiLCIgIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgIGVuZCA9IC47XG5cCi0gICBfZW5kID0gLjtcblwKLX1cblxuIgotLCBOVUxMKQotICA7IGVsc2UgcmV0dXJuCi1jb25jYXQgKAotIk9VVFBVVF9GT1JNQVQoXCJlY29mZi1iaWdtaXBzXCIsIFwiZWNvZmYtYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWNvZmYtbGl0dGxlbWlwc1wiKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWlkdC1lY29mZi9saWIpO1xuXAotRU5UUlkoc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAuID0gMHhhMDAxMjAwMDtcblwKLSAgLnRleHQgOiB7XG5cCi0gICAgIF9mdGV4dCA9IC4gO1xuXAotICAgICooLmluaXQpXG5cCi0gICAgIGVwcm9sICA9ICAuO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0YXJ0ID0gLik7XG5cCi0gICAgKigucmVsLnNkYXRhKVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdG9wID0gLik7XG5cCi0gICAgKiguZmluaSlcblwKLSAgICAgZXRleHQgID0gIC47XG5cCi0gICAgIF9ldGV4dCAgPSAgLjtcblwKLSAiLCIgIH1cblwKLSAgLiA9IC47XG5cCi0gIC5yZGF0YSA6IHtcblwKLSAgICAqKC5yZGF0YSlcblwKLSAgfVxuXAotICAgX2ZkYXRhID0gQUxJR04oMTYpO1xuXAotICAuZGF0YSA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gICBfZ3AgPSBBTElHTigxNikgKyAweDgwMDA7XG5cCi0gIC5saXQ4IDoge1xuXAotICAgICooLmxpdDgpXG5cCi0gIH1cblwKLSAgLmxpdDQgOiB7XG5cCi0gICAgKigubGl0NClcblwKLSAiLCIgIH1cblwKLSAgLnNkYXRhIDoge1xuXAotICAgICooLnNkYXRhKVxuXAotICB9XG5cCi0gICBlZGF0YSAgPSAgLjtcblwKLSAgIF9lZGF0YSAgPSAgLjtcblwKLSAgIF9mYnNzID0gLjtcblwKLSAgLnNic3MgOiB7XG5cCi0gICAgKiguc2JzcylcblwKLSAgICAqKC5zY29tbW9uKVxuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gICBlbmQgPSAuO1xuXAotICAgX2VuZCA9IC47XG5cCi19XG5cbiIKLSwgTlVMTCkKLTsgfQotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX21pcHNpZHRfZW11bGF0aW9uID0gCi17Ci0gIGdsZG1pcHNpZHRfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZG1pcHNpZHRfYWZ0ZXJfb3BlbiwKLSAgZ2xkbWlwc2lkdF9hZnRlcl9hbGxvY2F0aW9uLAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGRtaXBzaWR0X2dldF9zY3JpcHQsCi0gICJtaXBzaWR0IiwKLSAgImVjb2ZmLWJpZ21pcHMiCi19OwpkaWZmIC0tZ2l0IGEvbGQvbXB3LW1ha2Uuc2VkIGIvbGQvbXB3LW1ha2Uuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTE5NzA4Li4wMDAwMDAwCi0tLSBhL2xkL21wdy1tYWtlLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIGZpbmlzaCB0cmFuc2xhdGluZyB0aGUgbGQgTWFrZWZpbGUuaW4gaW50byBNUFcgc3ludGF4LgotCi0vSERFRklORVMvcy9ASERFRklORVNALy8KLQotL150YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQC9zL14vIy8KLQotL15FTVVMID0gQEVNVUxAL3MvXi8jLwotCi0vXkVNVUxBVElPTl9PRklMRVMgPSBARU1VTEFUSU9OX09GSUxFU0Avcy9eLyMvCi0KLSMgRml4YWRkIHRvIHRoZSBpbmNsdWRlIHBhdGhzLgotL15JTkNMVURFUyA9IC4qJC9zLyQvIC1pICJ7SU5DRElSfSI6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LwotL0JGRERJUi9zLy1pIHtCRkRESVJ9IC8taSAie0JGRERJUn0iOiAvCi0vSU5DRElSL3MvLWkge0lOQ0RJUn0gLy1pICJ7SU5DRElSfSI6IC8KLQotIyBVc2UgYnlhY2MgaW5zdGVhZCBvZiBiaXNvbiAoZm9yIG5vdyBhbnl3YXkpLgotL0JJU09OL3MvXkJJU09OID0uKiQvQklTT04gPSBieWFjYy8KLSMvQklTT05GTEFHUy9zL15CSVNPTkZMQUdTID0uKiQvQklTT05GTEFHUyA9IC8KLQotIyBTdXBwcmVzcyB0aGUgc3VwcHJlc3Npb24gb2Ygc21hcnQgbWFrZXMuCi0vXlwueVwuYy9kCi0KLSMgSGFjayB1cCBsZG1haW4gY29tcGlsZS4KLS9eIntvfSJsZG1haW4uYy5vIFxcT3B0aW9uLWYgLiogY29uZmlnLnN0YXR1cyQvLC9eJC9jXAotIntvfSJsZG1haW4uYy5vIFxcT3B0aW9uLWYgICJ7c30ibGRtYWluLmNcCi0Je0NDfSBAREFTSF9DX0ZMQUdAIC1kIERFRkFVTFRfRU1VTEFUSU9OPXtkcX17RU1VTH17ZHF9IC1kIFNDUklQVERJUj17ZHF9e3NjcmlwdGRpcn17ZHF9IHtBTExfQ0ZMQUdTfSAie3N9ImxkbWFpbi5jIC1vICJ7b30ibGRtYWluLmMub1wKLQotCi0jIFJlbW92ZSBsZGVtdWwtbGlzdC5oIGJ1aWxkLCByZWx5IG9uIGNvbmZpZ3VyZSB0byBtYWtlIG9uZS4KLS9ebGRlbXVsLWxpc3QuaCAvLC9SZW5hbWUgLXkgIntzfSJsZGVtdWwtdG1wLmggL2QKLQotIyBGaXggcGF0aG5hbWVzIHRvIGdlbmVyYXRlZCBmaWxlcy4KLS9jb25maWcuaC9zLyJ7c30iY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvZwotL2NvbmZpZy5oL3MvXmNvbmZpZ1wuaC8ie299ImNvbmZpZy5oLwotCi0veS50YWIuYy9zLyJ7c30ieVwudGFiXC5jLyJ7b30ieS50YWIuYy9nCi0veS50YWIuYy9zL155XC50YWJcLmMvIntvfSJ5LnRhYi5jLwotL3kudGFiLmgvcy8ie3N9InlcLnRhYlwuaC8ie299InkudGFiLmgvZwotL3kudGFiLmgvcy9eeVwudGFiXC5oLyJ7b30ieS50YWIuaC8KLQotL2xkZ3JhbS5jL3MvIntzfSJsZGdyYW1cLmMvIntvfSJsZGdyYW0uYy9nCi0vbGRncmFtLmMvcy9ebGRncmFtXC5jLyJ7b30ibGRncmFtLmMvCi0KLS9sZGdyYW0uaC9zLyJ7c30ibGRncmFtXC5oLyJ7b30ibGRncmFtLmgvZwotL2xkZ3JhbS5oL3MvXmxkZ3JhbVwuaC8ie299ImxkZ3JhbS5oLwotCi0vbGRsZXguYy9zLyJ7c30ibGRsZXhcLmMvIntvfSJsZGxleC5jL2cKLS9sZGxleC5jL3MvXmxkbGV4XC5jLyJ7b30ibGRsZXguYy8KLQotL2xkbGV4LmMubmV3L3MvIntzfSJsZGxleFwuY1wubmV3LyJ7b30ibGRsZXguYy5uZXcvZwotCi0vbGV4Lnl5LmMvcy8ie3N9ImxleFwueXlcLmMvIntvfSJsZXgueXkuYy9nCi0KLS9sZGVtdWwtbGlzdC5oL3MvIntzfSJsZGVtdWwtbGlzdFwuaC8ie299ImxkZW11bC1saXN0LmgvZwotL2xkZW11bC1saXN0Lmgvcy9ebGRlbXVsLWxpc3RcLmgvIntvfSJsZGVtdWwtbGlzdC5oLwotCi0jIEVkaXQgcGF0aG5hbWVzIHRvIGVtdWxhdGlvbiBmaWxlcy4KLS8ie3N9ImUuKlwuYy9zLyJ7c30iZVwoWy1fYS16MC05XSpcKVwuYy8ie299ImVcMS5jL2cKLS9eZS4qXC5jL3MvXmVcKFstX2EtejAtOV0qXClcLmMvIntvfSJlXDEuYy8KLQotIyBXZSBjYW4ndCBydW4gZ2Vuc2NyaXB0cywgc28gZG9uJ3QgdHJ5LgotL3tHRU5TQ1JJUFRTfS9zL3tHRU5TQ1JJUFRTfS9udWxsLWNvbW1hbmQvCi0KLSMgQ29tbWVudCBvdXQgdGhlIFRESVJTIGJpdHMuCi0vXlRESVJTQC9zL14vIy8KLQotIyBQb2ludCBhdCB0aGUgQkZEIGxpYnJhcnkgZGlyZWN0bHkuCi0vQEJGRExJQkAvcy9AQkZETElCQC86OmJmZDpsaWJiZmQuby8KLQotIyBEb24ndCBuZWVkIHRoaXMuCi0vQEhMREZMQUdTQC9zL0BITERGTEFHU0AvLwotCi0jL3NlZC4qZnJlZS8sLz4gIntvfSJsZGxleC5jLm5ldy9jXAotIwlcCUNhdGVuYXRlICJ7b30ibGV4Lnl5LmMgPiJ7b30ibGRsZXguYy5uZXcKLQotIyBUaGUgcmVzb3VyY2UgZmlsZSBpcyBjYWxsZWQgbWFjLWxkLnIuCi0ve0xEX1BST0d9LnIvcy97TERfUFJPR31cLnIvbWFjLWxkLnIvCi0KLS9eaW5zdGFsbCBcXE9wdGlvbi1mIC8sL14kL2NcCi1pbnN0YWxsIFxcT3B0aW9uLWYgIGFsbCBpbnN0YWxsLW9ubHlcCi1cCi1pbnN0YWxsLW9ubHkgXFxPcHRpb24tZlwKLQlOZXdGb2xkZXJSZWN1cnNpdmUgIntiaW5kaXJ9IlwKLQlEdXBsaWNhdGUgLXkgOmxkLm5ldyAie2JpbmRpcn0ibGRcCi0KLQotIyBSZW1vdmUgZGVwZW5kZW5jeSByZWJ1aWxkaW5nIGNydWQuCi0vXi5kZXAgLywvIyAuUEhPTlkgL2QKLQotIyBSZW1vdmUgdGhlIGxpbnRsb2cgYWN0aW9uLCBwaXBlIHN5bWJvbHMgaW4gY29sdW1uIDEgbG9zZS4KLS9ebGludGxvZyBcXE9wdGlvbi1mLywvXiQvZAotCi0vXk1ha2VmaWxlIFxcT3B0aW9uLWYvLC9eJC9kCi0vXiJ7b30iY29uZmlnLmggXFxPcHRpb24tZi8sL14kL2QKLS9eY29uZmlnLnN0YXR1cyBcXE9wdGlvbi1mLywvXiQvZApkaWZmIC0tZ2l0IGEvbGQvbXJpLmMgYi9sZC9tcmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhYWVhMi4uMDAwMDAwMAotLS0gYS9sZC9tcmkuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKiBtcmkuYyAtLSBoYW5kbGUgTVJJIHN0eWxlIGxpbmtlciBzY3JpcHRzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGJpdCBkb2VzIHRoZSB0cmVlIGRlY29yYXRpb24gd2hlbiBNUkkgc3R5bGUgbGluayBzY3JpcHRzIGFyZSBwYXJzZWQgKi8KLQotLyoKLSAgY29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgCQkgc2FjQGN5Z251cy5jb20KLQotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIiAKLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibXJpLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0IHsKLSAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKm5leHQ7Ci0gIENPTlNUIGNoYXIgKm5hbWU7Ci0gIENPTlNUIGNoYXIgKmFsaWFzOwotICBldHJlZV90eXBlICp2bWE7Ci0gIGV0cmVlX3R5cGUgKmFsaWduOwotICBldHJlZV90eXBlICpzdWJhbGlnbjsKLSAgaW50IG9rX3RvX2xvYWQ7Ci19IDsKLQotdW5zaWduZWQgaW50IHN5bWJvbF90cnVuY2F0ZSA9IDEwMDAwOwotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKm9yZGVyOwotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKm9ubHlfbG9hZDsKLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICphZGRyZXNzOwotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKmFsaWFzOwotCi1zdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqYWxpZ25tZW50Owotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnN1YmFsaWdubWVudDsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqbG9va3VwCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqbGlzdCkpOwotc3RhdGljIHZvaWQgbXJpX2FkZF90b19saXN0IFBBUkFNUyAoKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqbGlzdCwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKnZtYSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKnphbGlhcywgZXRyZWVfdHlwZSAqYWxpZ24sCi0JCQkJICAgICBldHJlZV90eXBlICpzdWJhbGlnbikpOwotCi1zdGF0aWMgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKioKLWxvb2t1cCAobmFtZSwgbGlzdCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipsaXN0OwotewotCi0gIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqcHRyID0gbGlzdDsKLSAgd2hpbGUgKCpwdHIpIAotICB7Ci0gICAgaWYgKHN0cmNtcChuYW1lLCAoKnB0ciktPm5hbWUpID09IDApIHsKLSAgICAgIC8qIElmIHRoaXMgaXMgYSBtYXRjaCwgZGVsZXRlIGl0LCB3ZSBvbmx5IGtlZXAgdGhlIGxhc3QgaW5zdGFuY2UKLQkgb2YgYW55IG5hbWUgKi8KLSAgICAgICpwdHIgPSAoKnB0ciktPm5leHQ7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcHRyID0gJigoKnB0ciktPm5leHQpOwotICAgIH0KLSAgfQotCi0gICpwdHIgPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKil4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCkpOwotICByZXR1cm4gcHRyOwotfQotCi1zdGF0aWMgdm9pZAotbXJpX2FkZF90b19saXN0IChsaXN0LCBuYW1lLCB2bWEsIHphbGlhcywgYWxpZ24sIHN1YmFsaWduKQotICAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKmxpc3Q7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKnZtYTsKLSAgICAgQ09OU1QgY2hhciAqemFsaWFzOwotICAgICBldHJlZV90eXBlICphbGlnbjsKLSAgICAgZXRyZWVfdHlwZSAqc3ViYWxpZ247Ci17Ci0gIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqcHRyID0gbG9va3VwKG5hbWUsbGlzdCk7Ci0gICgqcHRyKS0+bmFtZSA9IG5hbWU7Ci0gICgqcHRyKS0+dm1hID0gdm1hOwotICAoKnB0ciktPm5leHQgPSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMOwotICAoKnB0ciktPm9rX3RvX2xvYWQgPSAwOwotICAoKnB0ciktPmFsaWFzID0gemFsaWFzOwotICAoKnB0ciktPmFsaWduID0gYWxpZ247Ci0gICgqcHRyKS0+c3ViYWxpZ24gPSBzdWJhbGlnbjsKLX0KLQotCi12b2lkCi1tcmlfb3V0cHV0X3NlY3Rpb24gKG5hbWUsIHZtYSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqdm1hOwotewotICBtcmlfYWRkX3RvX2xpc3QoJmFkZHJlc3MsIG5hbWUsIHZtYSwgMCwwLDApOwotfQotCi0vKiBpZiBhbnkgQUJTT0xVVEUgPG5hbWU+IGFyZSBpbiB0aGUgc2NyaXB0LCBvbmx5IGxvYWQgdGhvc2UgZmlsZXMKLW1hcmtlZCB0aHVzICovCi0KLXZvaWQKLW1yaV9vbmx5X2xvYWQgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIG1yaV9hZGRfdG9fbGlzdCgmb25seV9sb2FkLCBuYW1lLCAwLCAwLDAsMCk7Ci19Ci0KLQotdm9pZAotbXJpX2Jhc2UgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBiYXNlID0gZXhwOwotfQotCi1zdGF0aWMgaW50IGRvbmVfdHJlZSA9IDA7Ci0KLXZvaWQKLW1yaV9kcmF3X3RyZWUgKCkKLXsKLSAgaWYgKGRvbmVfdHJlZSkgcmV0dXJuOwotCi0gIC8qIFdlIGRvbid0IGJvdGhlciB3aXRoIG1lbW9yeSByZWdpb25zLiAgKi8KLSNpZiAwCi0gIC8qIENyZWF0ZSB0aGUgcmVnaW9ucyAqLwotIHsKLSAgIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpyOwotICAgciA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAoImxvbmciKTsKLSAgIHItPmN1cnJlbnQgPSByLT5vcmlnaW4gPSBleHBfZ2V0X3ZtYShiYXNlLCAoYmZkX3ZtYSkwLCAib3JpZ2luIiwKLQkJCQkJbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLSAgIHItPmxlbmd0aCA9IChiZmRfc2l6ZV90eXBlKSBleHBfZ2V0X3ZtYSgwLCAoYmZkX3ZtYSkgfigoYmZkX3NpemVfdHlwZSkwKSwKLQkJCQkJICAgImxlbmd0aCIsIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci0gfQotI2VuZGlmCi0gIAotICAvKiBOb3cgYnVpbGQgdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBsZGxhbmcgbWFjaGluZSAqLwotCi0KLSAgLyogQXR0YXRjaCB0aGUgYWRkcmVzc2VzIG9mIGFueSB3aGljaCBoYXZlIGFkZHJlc3NlcywgYW5kIGFkZCB0aGUKLSAgICAgb25lcyBub3QgbWVudGlvbmVkICovCi0gIGlmIChhZGRyZXNzICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEwpIHsKLSAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqYWxpc3Q7Ci0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKm9saXN0OwotICAgIGlmIChvcmRlciA9PSAoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKilOVUxMKSB7Ci0gICAgICBvcmRlciA9IGFkZHJlc3M7Ci0gICAgfQotCi0gICAgZm9yIChhbGlzdCA9IGFkZHJlc3M7Ci0JIGFsaXN0ICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCopTlVMTDsKLQkgYWxpc3QgPSBhbGlzdC0+bmV4dCkgCi0gICAgewotICAgICAgaW50IGRvbmUgPSAwOwotICAgICAgZm9yIChvbGlzdCA9IG9yZGVyOwotCSAgIGRvbmUgPT0gMCAmJgotCSAgIG9saXN0ICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEw7Ci0JICAgb2xpc3QgPSBvbGlzdC0+bmV4dCkgCi0gICAgICB7Ci0JaWYgKHN0cmNtcChhbGlzdC0+bmFtZSwgb2xpc3QtPm5hbWUpID09IDApIAotCXsKLQkgIG9saXN0LT52bWEgPSBhbGlzdC0+dm1hOwotCSAgZG9uZSA9IDE7Ci0JfQotICAgICAgfQotICAgICAgaWYgKCFkb25lKSB7Ci0JLyogYWRkIHRoaXMgb250byBlbmQgb2Ygb3JkZXIgbGlzdCAqLwotCW1yaV9hZGRfdG9fbGlzdCgmb3JkZXIsIGFsaXN0LT5uYW1lLCBhbGlzdC0+dm1hLCAwLDAsMCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgfQotCi0gIC8qIElmIHdlJ3JlIG9ubHkgc3VwcG9zZWQgdG8gbG9hZCBhIHN1YnNldCBvZiB0aGVtIGluLCB0aGVuIHBydW5lCi0gICAgIHRoZSBsaXN0LiAgKi8KLQotICBpZiAob25seV9sb2FkICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEwpIAotICB7Ci0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnB0cjE7Ci0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnB0cjI7Ci0gICAgaWYgKG9yZGVyID09IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCopTlVMTCkKLSAgICAgb3JkZXIgPSBvbmx5X2xvYWQ7Ci0gICAgCi0gICAgLyogU2VlIGlmIHRoaXMgbmFtZSBpcyBpbiB0aGUgbGlzdCwgaWYgaXQgaXMgdGhlbiB3ZSBjYW4gbG9hZCBpdAotICAgICAqLwotICAgIGZvciAocHRyMSA9IG9ubHlfbG9hZDsgcHRyMTsgcHRyMSA9IHB0cjEtPm5leHQpIAotICAgIHsKLSAgICAgIGZvciAocHRyMj0gb3JkZXI7IHB0cjI7IHB0cjI9cHRyMi0+bmV4dCkgCi0gICAgICB7Ci0JaWYgKHN0cmNtcChwdHIyLT5uYW1lLCBwdHIxLT5uYW1lKT09MCkgewotCSAgcHRyMi0+b2tfdG9fbG9hZCA9IDE7Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlIAotICB7Ci0gICAgLyogTm8gb25seSBsb2FkIGxpc3QsIHNvIGV2ZXJ5dGhpbmcgaXMgb2sgdG8gbG9hZCAqLwotICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICpwdHI7Ci0gICAgZm9yIChwdHIgPSBvcmRlcjsgcHRyOyBwdHI9cHRyLT5uZXh0KSB7Ci0gICAgICBwdHItPm9rX3RvX2xvYWQgPSAxOwotICAgIH0KLSAgfQotCi0KLQotICAvKiBDcmVhdGUgdGhlIG9yZGVyIG9mIHNlY3Rpb25zIHRvIGxvYWQgKi8KLSAgaWYgKG9yZGVyICE9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEwpIAotICB7Ci0gICAgLyogQmVlbiB0b2xkIHRvIG91dHB1dCB0aGUgc2VjdGlvbnMgaW4gYSBjZXJ0YWluIG9yZGVyICovCi0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnAgPSBvcmRlcjsKLSAgICB3aGlsZSAocCkgCi0gICAgewotICAgICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKmFwdHI7Ci0gICAgICBldHJlZV90eXBlICphbGlnbiA9IDA7Ci0gICAgICBldHJlZV90eXBlICpzdWJhbGlnbiA9IDA7Ci0gICAgICAvKiBTZWUgaWYgYW4gYWxpZ25tZW50IGhhcyBiZWVuIHNwZWNpZmllZCAqLwotCi0gICAgICBmb3IgKGFwdHIgPSBhbGlnbm1lbnQ7IGFwdHI7IGFwdHI9IGFwdHItPm5leHQpCi0gICAgICB7Ci0JaWYgKHN0cmNtcChhcHRyLT5uYW1lLCBwLT5uYW1lKT09MCkgewotCSAgYWxpZ24gPSAgYXB0ci0+YWxpZ247Ci0JfQotICAgICAgfQotCi0gICAgICBmb3IgKGFwdHIgPSBzdWJhbGlnbm1lbnQ7IGFwdHI7IGFwdHI9IGFwdHItPm5leHQpCi0gICAgICB7Ci0JaWYgKHN0cmNtcChhcHRyLT5uYW1lLCBwLT5uYW1lKT09MCkgewotCSAgc3ViYWxpZ24gPSAgYXB0ci0+c3ViYWxpZ247Ci0JfQotICAgICAgfQotCi0gICAgICBpZiAoYmFzZSA9PSAwKSB7Ci0JYmFzZSA9IHAtPnZtYSA/IHAtPnZtYSA6ZXhwX25hbWVvcChOQU1FLCAiLiIpOwotICAgICAgfQotICAgICAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKHAtPm5hbWUsIGJhc2UsCi0JCQkJCSAgIHAtPm9rX3RvX2xvYWQgPyAwIDogbm9sb2FkX3NlY3Rpb24sCi0JCQkJCSAgIDEsIGFsaWduLCBzdWJhbGlnbiwKLQkJCQkJICAgKGV0cmVlX3R5cGUgKikgTlVMTCk7Ci0gICAgICBiYXNlID0gMDsKLSAgICAgIGxhbmdfYWRkX3dpbGQgKHAtPm5hbWUsIGZhbHNlLCAoY2hhciAqKU5VTEwsIGZhbHNlLCBmYWxzZSwgTlVMTCk7Ci0gICAgICAvKiBJZiB0aGVyZSBpcyBhbiBhbGlhcyBmb3IgdGhpcyBzZWN0aW9uLCBhZGQgaXQgdG9vICovCi0gICAgICBmb3IgKGFwdHIgPSBhbGlhczsgYXB0cjsgYXB0ciA9IGFwdHItPm5leHQpIHsKLQotCWlmIChzdHJjbXAoYXB0ci0+YWxpYXMsIHAtPm5hbWUpPT0gMCkgewotCSAgbGFuZ19hZGRfd2lsZCAoYXB0ci0+bmFtZSwgZmFsc2UsIChjaGFyICopTlVMTCwgZmFsc2UsIGZhbHNlLCBOVUxMKTsKLQl9Ci0gICAgICB9Ci0KLSAgICAgIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0JKDAsICIqZGVmYXVsdCoiLCAoc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopIE5VTEwpOwotCi0gICAgICBwID0gcC0+bmV4dDsKLSAgICB9Ci0gIH0KLQotCi0gIGRvbmVfdHJlZSA9IDE7Ci0KLX0KLXZvaWQKLW1yaV9sb2FkIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBiYXNlID0gMDsKLSAgbGFuZ19hZGRfaW5wdXRfZmlsZShuYW1lLAotCQkgICAgICBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtLCAoY2hhciAqKU5VTEwpOwotICAvKiAgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQoMCwiKmRlZmF1bHQqIik7Ki8KLX0KLQotCi12b2lkCi1tcmlfb3JkZXIgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIG1yaV9hZGRfdG9fbGlzdCgmb3JkZXIsIG5hbWUsIDAsIDAsMCwwKTsKLX0KLQotdm9pZCAKLW1yaV9hbGlhcyAod2FudCwgaXMsIGlzbikKLSAgICAgQ09OU1QgY2hhciAqd2FudDsKLSAgICAgQ09OU1QgY2hhciAqaXM7Ci0gICAgIGludCBpc247Ci17Ci0gIGlmICghaXMpIHsKLSAgICAvKiBTb21lIHNlY3Rpb25zIGFyZSBkaWdpdHMgLSAqLwotICAgIGNoYXIgYnVmWzIwXTsKLSAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgaXNuKTsKLSAgICBpcyA9IHhzdHJkdXAgKGJ1Zik7Ci0gICAgaWYgKGlzID09IE5VTEwpCi0gICAgICBhYm9ydCAoKTsKLSAgfQotICBtcmlfYWRkX3RvX2xpc3QoJmFsaWFzLCBpcywgMCwgd2FudCwwLDApOwotCi19Ci0KLQotdm9pZCAKLW1yaV9uYW1lIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBsYW5nX2FkZF9vdXRwdXQobmFtZSwgMSk7Ci0KLX0KLQotCi12b2lkCi1tcmlfZm9ybWF0IChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBpZiAoc3RyY21wKG5hbWUsICJTIikgPT0gMCkKLSAgewotICAgIGxhbmdfYWRkX291dHB1dF9mb3JtYXQoInNyZWMiLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMLCAxKTsKLSAgfQotICBlbHNlIGlmIChzdHJjbXAobmFtZSwgIklFRUUiKSA9PSAwKQotICB7Ci0gICAgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCgiaWVlZSIsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEwsIDEpOwotICB9Ci0gIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiQ09GRiIpID09IDApCi0gIHsKLSAgICBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0KCJjb2ZmLW02OGsiLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMLCAxKTsKLSAgfQotICBlbHNlIHsKLSAgICBlaW5mbyhfKCIlUCVGOiB1bmtub3duIGZvcm1hdCB0eXBlICVzXG4iKSwgbmFtZSk7Ci0gIH0KLX0KLQotCi12b2lkCi1tcmlfcHVibGljIChuYW1lLCBleHApCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgbGFuZ19hZGRfYXNzaWdubWVudChleHBfYXNzb3AoJz0nLCBuYW1lLCBleHApKTsKLX0KLQotdm9pZCAKLW1yaV9hbGlnbiAobmFtZSwgZXhwKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIG1yaV9hZGRfdG9fbGlzdCgmYWxpZ25tZW50LCBuYW1lLDAsMCxleHAsMCk7Ci19Ci0KLXZvaWQgCi1tcmlfYWxpZ25tb2QgKG5hbWUsIGV4cCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBtcmlfYWRkX3RvX2xpc3QoJnN1YmFsaWdubWVudCwgbmFtZSwwLDAsMCxleHApOwotfQotCi0KLXZvaWQgCi1tcmlfdHJ1bmNhdGUgKGV4cCkKLSAgICAgdW5zaWduZWQgaW50IGV4cDsKLXsKLSAgc3ltYm9sX3RydW5jYXRlID0gZXhwOwotfQpkaWZmIC0tZ2l0IGEvbGQvbXJpLmggYi9sZC9tcmkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzZjBmMy4uMDAwMDAwMAotLS0gYS9sZC9tcmkuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIG1yaS5oIC0tIGhlYWRlciBmaWxlIGZvciBNUkkgc2NyaXB0aW5nIGZ1bmN0aW9ucwotICAgQ29weXJpZ2h0IDE5OTMsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIE1SSV9ICi0jZGVmaW5lIE1SSV9ICi0KLWV4dGVybiB1bnNpZ25lZCBpbnQgc3ltYm9sX3RydW5jYXRlOwotCi1leHRlcm4gdm9pZCBtcmlfb3V0cHV0X3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgZXRyZWVfdHlwZSAqdm1hKSk7Ci1leHRlcm4gdm9pZCBtcmlfb25seV9sb2FkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiB2b2lkIG1yaV9iYXNlIFBBUkFNUyAoKGV0cmVlX3R5cGUgKmV4cCkpOwotZXh0ZXJuIHZvaWQgbXJpX2xvYWQgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgbXJpX29yZGVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiB2b2lkIG1yaV9hbGlhcyBQQVJBTVMgKChjb25zdCBjaGFyICp3YW50LCBjb25zdCBjaGFyICppcywgaW50IGlzbikpOwotZXh0ZXJuIHZvaWQgbXJpX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgbXJpX2Zvcm1hdCBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1leHRlcm4gdm9pZCBtcmlfcHVibGljIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKmV4cCkpOwotZXh0ZXJuIHZvaWQgbXJpX2FsaWduIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKmV4cCkpOwotZXh0ZXJuIHZvaWQgbXJpX2FsaWdubW9kIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKmV4cCkpOwotZXh0ZXJuIHZvaWQgbXJpX3RydW5jYXRlIFBBUkFNUyAoKHVuc2lnbmVkIGludCBleHApKTsKLWV4dGVybiB2b2lkIG1yaV9kcmF3X3RyZWUgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL3BlLWRsbC5jIGIvbGQvcGUtZGxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1N2Y0MWQuLjAwMDAwMDAKLS0tIGEvbGQvcGUtZGxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODM2ICswLDAgQEAKLS8qIFJvdXRpbmVzIHRvIGhlbHAgYnVpbGQgUEVJLWZvcm1hdCBETExzIChXaW4zMiBldGMpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IERKIERlbG9yaWUgPGRqQGN5Z251cy5jb20+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZHdyaXRlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCi0jaW5jbHVkZSAiZGVmZmlsZS5oIgotI2luY2x1ZGUgInBlLWRsbC5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBUaGlzIGZpbGUgdHVybnMgYSByZWd1bGFyIFdpbmRvd3MgUEUgaW1hZ2UgaW50byBhIERMTC4gIEJlY2F1c2Ugb2YKLSB0aGUgY29tcGxleGl0eSBvZiB0aGlzIG9wZXJhdGlvbiwgaXQgaGFzIGJlZW4gYnJva2VuIGRvd24gaW50byBhCi0gbnVtYmVyIG9mIHNlcGFyYXRlIG1vZHVsZXMgd2hpY2ggYXJlIGFsbCBjYWxsZWQgYnkgdGhlIG1haW4gZnVuY3Rpb24KLSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlLWVudHJhbnQgYW5kIGlzCi0gbm9ybWFsbHkgb25seSBjYWxsZWQgb25jZSwgc28gc3RhdGljIHZhcmlhYmxlcyBhcmUgdXNlZCB0byByZWR1Y2UKLSB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZXMgcmVxdWlyZWQuCi0KLSBTZWUgYWxzbzogbGQvZW11bHRlbXBsL3BlLmVtCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGZvciBlbXVsdGVtcGwvcGUuZW0gKi8KLQotZGVmX2ZpbGUgKnBlX2RlZl9maWxlID0gMDsKLWludCBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmcgPSAwOwotaW50IHBlX2RsbF9kb19kZWZhdWx0X2V4Y2x1ZGVzID0gMTsKLWludCBwZV9kbGxfa2lsbF9hdHMgPSAwOwotaW50IHBlX2RsbF9zdGRjYWxsX2FsaWFzZXMgPSAwOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBzdGF0aWMgdmFyaWFibGVzIGFuZCB0eXBlcwotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYmZkX3ZtYSBpbWFnZV9iYXNlOwotCi1zdGF0aWMgYmZkICpmaWxsZXJfYmZkOwotc3RhdGljIHN0cnVjdCBzZWMgKmVkYXRhX3MsICpyZWxvY19zOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmVkYXRhX2QsICpyZWxvY19kOwotc3RhdGljIHNpemVfdCBlZGF0YV9zeiwgcmVsb2Nfc3o7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqdGFyZ2V0X25hbWU7Ci0gIGNoYXIgKm9iamVjdF90YXJnZXQ7Ci0gIHVuc2lnbmVkIGludCBpbWFnZWJhc2VfcmVsb2M7Ci0gIGludCBwZV9hcmNoOwotICBpbnQgYmZkX2FyY2g7Ci0gIGludCB1bmRlcnNjb3JlZDsKLX0gcGVfZGV0YWlsc190eXBlOwotCi0jZGVmaW5lIFBFX0FSQ0hfaTM4NgkxCi0KLXN0YXRpYyBwZV9kZXRhaWxzX3R5cGUgcGVfZGV0YWlsX2xpc3RbXSA9IHsKLSAgewotICAgICJwZWktaTM4NiIsCi0gICAgInBlLWkzODYiLAotICAgIDcgLyogUl9JTUFHRUJBU0UgKi8sCi0gICAgUEVfQVJDSF9pMzg2LAotICAgIGJmZF9hcmNoX2kzODYsCi0gICAgMQotICB9LAotICB7IE5VTEwsIE5VTEwsIDAsIDAsIDAsIDAgfQotfTsKLQotc3RhdGljIHBlX2RldGFpbHNfdHlwZSAqcGVfZGV0YWlsczsKLQotI2RlZmluZSBVKHN0cikgKHBlX2RldGFpbHMtPnVuZGVyc2NvcmVkID8gIl8iIHN0ciA6IHN0cikKLQotdm9pZAotcGVfZGxsX2lkX3RhcmdldCAodGFyZ2V0KQotICAgICBjb25zdCBjaGFyICp0YXJnZXQ7Ci17Ci0gIGludCBpOwotICBmb3IgKGk9MDsgcGVfZGV0YWlsX2xpc3RbaV0udGFyZ2V0X25hbWU7IGkrKykKLSAgICBpZiAoc3RyY21wIChwZV9kZXRhaWxfbGlzdFtpXS50YXJnZXRfbmFtZSwgdGFyZ2V0KSA9PSAwKQotICAgICAgewotCXBlX2RldGFpbHMgPSBwZV9kZXRhaWxfbGlzdCtpOwotCXJldHVybjsKLSAgICAgIH0KLSAgZWluZm8gKF8oIiVYVW5zdXBwb3J0ZWQgUEVJIGFyY2hpdGVjdHVyZTogJXNcbiIpLCB0YXJnZXQpOwotICBleGl0ICgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gSGVscGVyIGZ1bmN0aW9ucyBmb3IgcXNvcnQuICBSZWxvY3MgbXVzdCBiZSBzb3J0ZWQgc28gdGhhdCB3ZSBjYW4gd3JpdGUKLSB0aGVtIG91dCBieSBwYWdlcy4KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBiZmRfdm1hIHZtYTsKLSAgY2hhciB0eXBlOwotICBzaG9ydCBleHRyYTsKLX0gcmVsb2NfZGF0YV90eXBlOwotCi1zdGF0aWMgaW50Ci1yZWxvY19zb3J0ICh2YSwgdmIpCi0gICAgIGNvbnN0IHZvaWQgKnZhLCAqdmI7Ci17Ci0gIGJmZF92bWEgYSA9ICgocmVsb2NfZGF0YV90eXBlICopIHZhKS0+dm1hOwotICBiZmRfdm1hIGIgPSAoKHJlbG9jX2RhdGFfdHlwZSAqKSB2YiktPnZtYTsKLSAgcmV0dXJuIChhID4gYikgPyAxIDogKChhIDwgYikgPyAtMSA6IDApOwotfQotCi1zdGF0aWMgaW50Ci1wZV9leHBvcnRfc29ydCAodmEsIHZiKQotICAgICBjb25zdCB2b2lkICp2YSwgKnZiOwotewotICBkZWZfZmlsZV9leHBvcnQgKmEgPSAoZGVmX2ZpbGVfZXhwb3J0ICopIHZhOwotICBkZWZfZmlsZV9leHBvcnQgKmIgPSAoZGVmX2ZpbGVfZXhwb3J0ICopIHZiOwotICByZXR1cm4gc3RyY21wIChhLT5uYW1lLCBiLT5uYW1lKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gUmVhZCBhbmQgcHJvY2VzcyB0aGUgLkRFRiBmaWxlCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZXNlIGNvcnJlc3BvbmQgdG8gdGhlIGVudHJpZXMgaW4gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbXS4gIEkgdXNlCi0gICBleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbaV0gdG8gdGFnIHdoZXRoZXIgb3Igbm90IHRoZSBzeW1ib2wgd2FzCi0gICBkZWZpbmVkLCBzaW5jZSB3ZSBjYW4ndCBleHBvcnQgc3ltYm9scyB3ZSBkb24ndCBoYXZlLiAqLwotCi1zdGF0aWMgYmZkX3ZtYSAqZXhwb3J0ZWRfc3ltYm9sX29mZnNldHM7Ci1zdGF0aWMgc3RydWN0IHNlYyAqKmV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uczsKLQotc3RhdGljIGludCBleHBvcnRfdGFibGVfc2l6ZTsKLXN0YXRpYyBpbnQgY291bnRfZXhwb3J0ZWQ7Ci1zdGF0aWMgaW50IGNvdW50X2V4cG9ydGVkX2J5bmFtZTsKLXN0YXRpYyBpbnQgY291bnRfd2l0aF9vcmRpbmFsczsKLXN0YXRpYyBjb25zdCBjaGFyICpkbGxfbmFtZTsKLXN0YXRpYyBpbnQgbWluX29yZGluYWwsIG1heF9vcmRpbmFsOwotc3RhdGljIGludCAqZXhwb3J0ZWRfc3ltYm9sczsKLQotdHlwZWRlZiBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdAotICB7Ci0gICAgY2hhciAqc3RyaW5nOwotICAgIHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICpuZXh0OwotICB9Ci1leGNsdWRlX2xpc3Rfc3RydWN0Owotc3RhdGljIHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICpleGNsdWRlcyA9IDA7Ci0KLXZvaWQKLXBlX2RsbF9hZGRfZXhjbHVkZXMgKG5ld19leGNsdWRlcykKLSAgICAgY29uc3QgY2hhciAqbmV3X2V4Y2x1ZGVzOwotewotICBjaGFyICpsb2NhbF9jb3B5OwotICBjaGFyICpleGNsdWRlX3N0cmluZzsKLQotICBsb2NhbF9jb3B5ID0geHN0cmR1cCAobmV3X2V4Y2x1ZGVzKTsKLQotICBleGNsdWRlX3N0cmluZyA9IHN0cnRvayAobG9jYWxfY29weSwgIiw6Iik7Ci0gIGZvciAoOyBleGNsdWRlX3N0cmluZzsgZXhjbHVkZV9zdHJpbmcgPSBzdHJ0b2sgKE5VTEwsICIsOiIpKQotICAgIHsKLSAgICAgIHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICpuZXdfZXhjbHVkZTsKLQotICAgICAgbmV3X2V4Y2x1ZGUgPSAoKHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICopCi0JCSAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCkpKTsKLSAgICAgIG5ld19leGNsdWRlLT5zdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGV4Y2x1ZGVfc3RyaW5nKSArIDEpOwotICAgICAgc3RyY3B5IChuZXdfZXhjbHVkZS0+c3RyaW5nLCBleGNsdWRlX3N0cmluZyk7Ci0gICAgICBuZXdfZXhjbHVkZS0+bmV4dCA9IGV4Y2x1ZGVzOwotICAgICAgZXhjbHVkZXMgPSBuZXdfZXhjbHVkZTsKLSAgICB9Ci0KLSAgZnJlZSAobG9jYWxfY29weSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWF1dG9fZXhwb3J0IChkLCBuKQotICAgICBkZWZfZmlsZSAqZDsKLSAgICAgY29uc3QgY2hhciAqbjsKLXsKLSAgaW50IGk7Ci0gIHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0ICpleDsKLSAgZm9yIChpID0gMDsgaSA8IGQtPm51bV9leHBvcnRzOyBpKyspCi0gICAgaWYgKHN0cmNtcCAoZC0+ZXhwb3J0c1tpXS5uYW1lLCBuKSA9PSAwKQotICAgICAgcmV0dXJuIDA7Ci0gIGlmIChwZV9kbGxfZG9fZGVmYXVsdF9leGNsdWRlcykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuLCAiRGxsTWFpbkAxMiIpID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBpZiAoc3RyY21wIChuLCAiRGxsRW50cnlQb2ludEAwIikgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGlmIChzdHJjbXAgKG4sICJpbXB1cmVfcHRyIikgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGZvciAoZXggPSBleGNsdWRlczsgZXg7IGV4ID0gZXgtPm5leHQpCi0gICAgaWYgKHN0cmNtcCAobiwgZXgtPnN0cmluZykgPT0gMCkKLSAgICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZGVmX2ZpbGUgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZCBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGksIGo7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpibGhlOwotICBiZmQgKmI7Ci0gIHN0cnVjdCBzZWMgKnM7Ci0gIGRlZl9maWxlX2V4cG9ydCAqZT0wOwotCi0gIGlmICghcGVfZGVmX2ZpbGUpCi0gICAgcGVfZGVmX2ZpbGUgPSBkZWZfZmlsZV9lbXB0eSAoKTsKLQotICAvKiBGaXJzdCwgcnVuIGFyb3VuZCB0byBhbGwgdGhlIG9iamVjdHMgbG9va2luZyBmb3IgdGhlIC5kcmVjdHZlCi0gICAgIHNlY3Rpb25zLCBhbmQgcHVzaCB0aG9zZSBpbnRvIHRoZSBkZWYgZmlsZSB0b28gKi8KLQotICBmb3IgKGIgPSBpbmZvLT5pbnB1dF9iZmRzOyBiOyBiID0gYi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYiwgIi5kcmVjdHZlIik7Ci0gICAgICBpZiAocykKLQl7Ci0JICBpbnQgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAocyk7Ci0JICBjaGFyICpidWYgPSB4bWFsbG9jIChzaXplKTsKLQkgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYiwgcywgYnVmLCAwLCBzaXplKTsKLQkgIGRlZl9maWxlX2FkZF9kaXJlY3RpdmUgKHBlX2RlZl9maWxlLCBidWYsIHNpemUpOwotCSAgZnJlZSAoYnVmKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdywgbWF5YmUgZXhwb3J0IGV2ZXJ5dGhpbmcgZWxzZSB0aGUgZGVmYXVsdCB3YXkgKi8KLQotICBpZiAocGVfZGxsX2V4cG9ydF9ldmVyeXRoaW5nIHx8IHBlX2RlZl9maWxlLT5udW1fZXhwb3J0cyA9PSAwKQotICAgIHsKLSAgICAgIGZvciAoYiA9IGluZm8tPmlucHV0X2JmZHM7IGI7IGIgPSBiLT5saW5rX25leHQpCi0JewotCSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0JICBpbnQgbnN5bXMsIHN5bXNpemU7Ci0KLQkgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYik7Ci0JICBzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCSAgbnN5bXMgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYiwgc3ltYm9scyk7Ci0KLQkgIGZvciAoaiA9IDA7IGogPCBuc3ltczsgaisrKQotCSAgICB7Ci0JICAgICAgaWYgKChzeW1ib2xzW2pdLT5mbGFncyAmIChCU0ZfRlVOQ1RJT04gfCBCU0ZfR0xPQkFMKSkKLQkJICA9PSAoQlNGX0ZVTkNUSU9OIHwgQlNGX0dMT0JBTCkpCi0JCXsKLQkJICBjb25zdCBjaGFyICpzbiA9IHN5bWJvbHNbal0tPm5hbWU7Ci0JCSAgaWYgKCpzbiA9PSAnXycpCi0JCSAgICBzbisrOwotCQkgIGlmIChhdXRvX2V4cG9ydCAocGVfZGVmX2ZpbGUsIHNuKSkKLQkJICAgIGRlZl9maWxlX2FkZF9leHBvcnQgKHBlX2RlZl9maWxlLCBzbiwgMCwgLTEpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jdW5kZWYgTkUKLSNkZWZpbmUgTkUgcGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzCi0KLSAgLyogQ2Fub25pY2FsaXplIHRoZSBleHBvcnQgbGlzdCAqLwotCi0gIGlmIChwZV9kbGxfa2lsbF9hdHMpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IE5FOyBpKyspCi0JewotCSAgaWYgKHN0cmNociAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSwgJ0AnKSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgd2lsbCBwcmVzZXJ2ZSBpbnRlcm5hbF9uYW1lLCB3aGljaCBtYXkgaGF2ZSBiZWVuIHBvaW50aW5nCi0JICAgICAgICAgdG8gdGhlIHNhbWUgbWVtb3J5IGFzIG5hbWUsIG9yIG1pZ2h0IG5vdCBoYXZlICovCi0JICAgICAgY2hhciAqdG1wID0geHN0cmR1cCAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSk7Ci0JICAgICAgKihzdHJjaHIgKHRtcCwgJ0AnKSkgPSAwOwotCSAgICAgIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUgPSB0bXA7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChwZV9kbGxfc3RkY2FsbF9hbGlhc2VzKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBORTsgaSsrKQotCXsKLQkgIGlmIChzdHJjaHIgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUsICdAJykpCi0JICAgIHsKLQkgICAgICBjaGFyICp0bXAgPSB4c3RyZHVwIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lKTsKLQkgICAgICAqKHN0cmNociAodG1wLCAnQCcpKSA9IDA7Ci0JICAgICAgaWYgKGF1dG9fZXhwb3J0IChwZV9kZWZfZmlsZSwgdG1wKSkKLQkJZGVmX2ZpbGVfYWRkX2V4cG9ydCAocGVfZGVmX2ZpbGUsIHRtcCwKLQkJCQkgICAgIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUsIC0xKTsKLQkgICAgICBlbHNlCi0JCWZyZWUgKHRtcCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGUgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0czsgLyogY29udmVuaWVuY2UsIGJ1dCB3YXRjaCBvdXQgZm9yIGl0IGNoYW5naW5nICovCi0KLSAgZXhwb3J0ZWRfc3ltYm9sX29mZnNldHMgPSAoYmZkX3ZtYSAqKSB4bWFsbG9jIChORSAqIHNpemVvZiAoYmZkX3ZtYSkpOwotICBleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnMgPSAoc3RydWN0IHNlYyAqKikgeG1hbGxvYyAoTkUgKiBzaXplb2YgKHN0cnVjdCBzZWMgKikpOwotCi0gIG1lbXNldCAoZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zLCAwLCBORSAqIHNpemVvZiAoc3RydWN0IHNlYyAqKSk7Ci0gIG1heF9vcmRpbmFsID0gMDsKLSAgbWluX29yZGluYWwgPSA2NTUzNjsKLSAgY291bnRfZXhwb3J0ZWQgPSAwOwotICBjb3VudF9leHBvcnRlZF9ieW5hbWUgPSAwOwotICBjb3VudF93aXRoX29yZGluYWxzID0gMDsKLQotICBxc29ydCAocGVfZGVmX2ZpbGUtPmV4cG9ydHMsIE5FLCBzaXplb2YgKHBlX2RlZl9maWxlLT5leHBvcnRzWzBdKSwgcGVfZXhwb3J0X3NvcnQpOwotICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IE5FOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgPiAwICYmIHN0cmNtcCAoZVtpXS5uYW1lLCBlW2kgLSAxXS5uYW1lKSA9PSAwKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBkdXBsaWNhdGUgKi8KLQkgIGlmIChlW2ogLSAxXS5vcmRpbmFsICE9IC0xCi0JICAgICAgJiYgZVtpXS5vcmRpbmFsICE9IC0xCi0JICAgICAgJiYgZVtqIC0gMV0ub3JkaW5hbCAhPSBlW2ldLm9yZGluYWwpCi0JICAgIHsKLQkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICAgIGVpbmZvIChfKCIlWEVycm9yLCBkdXBsaWNhdGUgRVhQT1JUIHdpdGggb3JpZGluYWxzOiAlcyAoJWQgdnMgJWQpXG4iKSwKLQkJICAgICBlW2ogLSAxXS5uYW1lLCBlW2ogLSAxXS5vcmRpbmFsLCBlW2ldLm9yZGluYWwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICAgIGVpbmZvIChfKCJXYXJuaW5nLCBkdXBsaWNhdGUgRVhQT1JUOiAlc1xuIiksCi0JCSAgICAgZVtqIC0gMV0ubmFtZSk7Ci0JICAgIH0KLQkgIGlmIChlW2ldLm9yZGluYWwpCi0JICAgIGVbaiAtIDFdLm9yZGluYWwgPSBlW2ldLm9yZGluYWw7Ci0JICBlW2ogLSAxXS5mbGFnX3ByaXZhdGUgfD0gZVtpXS5mbGFnX3ByaXZhdGU7Ci0JICBlW2ogLSAxXS5mbGFnX2NvbnN0YW50IHw9IGVbaV0uZmxhZ19jb25zdGFudDsKLQkgIGVbaiAtIDFdLmZsYWdfbm9uYW1lIHw9IGVbaV0uZmxhZ19ub25hbWU7Ci0JICBlW2ogLSAxXS5mbGFnX2RhdGEgfD0gZVtpXS5mbGFnX2RhdGE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChpICE9IGopCi0JICAgIGVbal0gPSBlW2ldOwotCSAgaisrOwotCX0KLSAgICB9Ci0gIHBlX2RlZl9maWxlLT5udW1fZXhwb3J0cyA9IGo7CS8qID09IE5FICovCi0KLSAgZm9yIChpID0gMDsgaSA8IE5FOyBpKyspCi0gICAgewotICAgICAgY2hhciAqbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSkgKyAyKTsKLSAgICAgIGlmIChwZV9kZXRhaWxzLT51bmRlcnNjb3JlZCkKLQl7Ci0JICAqbmFtZSA9ICdfJzsKLQkgIHN0cmNweSAobmFtZSArIDEsIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCX0KLSAgICAgIGVsc2UKLQlzdHJjcHkgKG5hbWUsIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCi0gICAgICBibGhlID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsCi0JCQkJICAgbmFtZSwKLQkJCQkgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gICAgICBpZiAoYmxoZQotICAgICAgICAgICYmIChibGhlLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IChibGhlLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSkpCi0JewotCSAgY291bnRfZXhwb3J0ZWQrKzsKLQkgIGlmICghcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uZmxhZ19ub25hbWUpCi0JICAgIGNvdW50X2V4cG9ydGVkX2J5bmFtZSsrOwotCi0JICAvKiBPbmx5IGZpbGwgaW4gdGhlIHNlY3Rpb25zLiBUaGUgYWN0dWFsIG9mZnNldHMgYXJlIGNvbXB1dGVkCi0JICAgICBpbiBmaWxsX2V4cG9ydGVkX29mZnNldHMoKSBhZnRlciBjb21tb24gc3ltYm9scyBhcmUgbGFpZAotCSAgICAgb3V0LiAgKi8KLSAgICAgICAgICBpZiAoYmxoZS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICAgIGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uc1tpXSA9IGJsaGUtPnUuZGVmLnNlY3Rpb247Ci0JICBlbHNlCi0JICAgIGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uc1tpXSA9IGJsaGUtPnUuYy5wLT5zZWN0aW9uOwotCi0JICBpZiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCAhPSAtMSkKLQkgICAgewotCSAgICAgIGlmIChtYXhfb3JkaW5hbCA8IHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwpCi0JCW1heF9vcmRpbmFsID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbDsKLQkgICAgICBpZiAobWluX29yZGluYWwgPiBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsKQotCQltaW5fb3JkaW5hbCA9IHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWw7Ci0JICAgICAgY291bnRfd2l0aF9vcmRpbmFscysrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoYmxoZSAmJiBibGhlLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBlaW5mbyAoXygiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgbm90IGRlZmluZWRcbiIpLAotCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoYmxoZSkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZWluZm8gKF8oIiVYQ2Fubm90IGV4cG9ydCAlczogc3ltYm9sIHdyb25nIHR5cGUgKCVkIHZzICVkKVxuIiksCi0JCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lLAotCQkgYmxoZS0+dHlwZSwgYmZkX2xpbmtfaGFzaF9kZWZpbmVkKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGVpbmZvIChfKCIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCBub3QgZm91bmRcbiIpLAotCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JfQotICAgICAgZnJlZSAobmFtZSk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBCdWlsZCB0aGUgYmZkIHRoYXQgd2lsbCBjb250YWluIC5lZGF0YSBhbmQgLnJlbG9jIHNlY3Rpb25zCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9maWxsZXJfYmZkIChpbmNsdWRlX2VkYXRhKQotICAgICBpbnQgaW5jbHVkZV9lZGF0YTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsbGVyX2ZpbGU7Ci0gIGZpbGxlcl9maWxlID0gbGFuZ19hZGRfaW5wdXRfZmlsZSAoImRsbCBzdHVmZiIsCi0JCQkJICAgICBsYW5nX2lucHV0X2ZpbGVfaXNfZmFrZV9lbnVtLAotCQkJCSAgICAgTlVMTCk7Ci0gIGZpbGxlcl9maWxlLT50aGVfYmZkID0gZmlsbGVyX2JmZCA9IGJmZF9jcmVhdGUgKCJkbGwgc3R1ZmYiLCBvdXRwdXRfYmZkKTsKLSAgaWYgKGZpbGxlcl9iZmQgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfYXJjaF9tYWNoIChmaWxsZXJfYmZkLAotCQkJICAgICBiZmRfZ2V0X2FyY2ggKG91dHB1dF9iZmQpLAotCQkJICAgICBiZmRfZ2V0X21hY2ggKG91dHB1dF9iZmQpKSkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIEJGRCAlRVxuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbmNsdWRlX2VkYXRhKQotICAgIHsKLSAgICAgIGVkYXRhX3MgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGZpbGxlcl9iZmQsICIuZWRhdGEiKTsKLSAgICAgIGlmIChlZGF0YV9zID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGZpbGxlcl9iZmQsIGVkYXRhX3MsCi0JCQkJICAgICAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgIHwgU0VDX0FMTE9DCi0JCQkJICAgICAgfCBTRUNfTE9BRAotCQkJCSAgICAgIHwgU0VDX0tFRVAKLQkJCQkgICAgICB8IFNFQ19JTl9NRU1PUlkpKSkKLQl7Ci0JICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIC5lZGF0YSBzZWN0aW9uOiAlRVxuIik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGZpbGxlcl9iZmQsIGVkYXRhX3MsIGVkYXRhX3N6KTsKLSAgICB9Ci0KLSAgcmVsb2NfcyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoZmlsbGVyX2JmZCwgIi5yZWxvYyIpOwotICBpZiAocmVsb2NfcyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChmaWxsZXJfYmZkLCByZWxvY19zLAotCQkJCSAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgfCBTRUNfQUxMT0MKLQkJCQkgIHwgU0VDX0xPQUQKLQkJCQkgIHwgU0VDX0tFRVAKLQkJCQkgIHwgU0VDX0lOX01FTU9SWSkpKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglUDogY2FuIG5vdCBjcmVhdGUgLnJlbG9jIHNlY3Rpb246ICVFXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChmaWxsZXJfYmZkLCByZWxvY19zLCAwKTsKLQotICBsZGxhbmdfYWRkX2ZpbGUgKGZpbGxlcl9maWxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gR2F0aGVyIGFsbCB0aGUgZXhwb3J0ZWQgc3ltYm9scyBhbmQgYnVpbGQgdGhlIC5lZGF0YSBzZWN0aW9uCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1nZW5lcmF0ZV9lZGF0YSAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgaSwgbmV4dF9vcmRpbmFsOwotICBpbnQgbmFtZV90YWJsZV9zaXplID0gMDsKLSAgY29uc3QgY2hhciAqZGxucDsKLQotICAvKiBGaXJzdCwgd2UgbmVlZCB0byBrbm93IGhvdyBtYW55IGV4cG9ydGVkIHN5bWJvbHMgdGhlcmUgYXJlLAotICAgICBhbmQgd2hhdCB0aGUgcmFuZ2Ugb2Ygb3JkaW5hbHMgaXMuICovCi0KLSAgaWYgKHBlX2RlZl9maWxlLT5uYW1lKQotICAgIHsKLSAgICAgIGRsbF9uYW1lID0gcGVfZGVmX2ZpbGUtPm5hbWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZGxsX25hbWUgPSBhYmZkLT5maWxlbmFtZTsKLSAgICAgIGZvciAoZGxucCA9IGRsbF9uYW1lOyAqZGxucDsgZGxucCsrKQotCXsKLQkgIGlmICgqZGxucCA9PSAnXFwnIHx8ICpkbG5wID09ICcvJyB8fCAqZGxucCA9PSAnOicpCi0JICAgIGRsbF9uYW1lID0gZGxucCArIDE7Ci0JfQotICAgIH0KLQotICBpZiAoY291bnRfd2l0aF9vcmRpbmFscyAmJiBtYXhfb3JkaW5hbCA+IGNvdW50X2V4cG9ydGVkKQotICAgIHsKLSAgICAgIGlmIChtaW5fb3JkaW5hbCA+IG1heF9vcmRpbmFsIC0gY291bnRfZXhwb3J0ZWQgKyAxKQotCW1pbl9vcmRpbmFsID0gbWF4X29yZGluYWwgLSBjb3VudF9leHBvcnRlZCArIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWluX29yZGluYWwgPSAxOwotICAgICAgbWF4X29yZGluYWwgPSBjb3VudF9leHBvcnRlZDsKLSAgICB9Ci0gIGV4cG9ydF90YWJsZV9zaXplID0gbWF4X29yZGluYWwgLSBtaW5fb3JkaW5hbCArIDE7Ci0KLSAgZXhwb3J0ZWRfc3ltYm9scyA9IChpbnQgKikgeG1hbGxvYyAoZXhwb3J0X3RhYmxlX3NpemUgKiBzaXplb2YgKGludCkpOwotICBmb3IgKGkgPSAwOyBpIDwgZXhwb3J0X3RhYmxlX3NpemU7IGkrKykKLSAgICBleHBvcnRlZF9zeW1ib2xzW2ldID0gLTE7Ci0KLSAgLyogTm93IHdlIG5lZWQgdG8gYXNzaWduIG9yZGluYWxzIHRvIHRob3NlIHRoYXQgZG9uJ3QgaGF2ZSB0aGVtICovCi0gIGZvciAoaSA9IDA7IGkgPCBORTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbaV0pCi0JewotCSAgaWYgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwgIT0gLTEpCi0JICAgIHsKLQkgICAgICBpbnQgZWkgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsIC0gbWluX29yZGluYWw7Ci0JICAgICAgaW50IHBpID0gZXhwb3J0ZWRfc3ltYm9sc1tlaV07Ci0JICAgICAgaWYgKHBpICE9IC0xKQotCQl7Ci0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBlaW5mbyAoXygiJVhFcnJvciwgb3JpZGluYWwgdXNlZCB0d2ljZTogJWQgKCVzIHZzICVzKVxuIiksCi0JCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCwKLQkJCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lLAotCQkJIHBlX2RlZl9maWxlLT5leHBvcnRzW3BpXS5uYW1lKTsKLQkJfQotCSAgICAgIGV4cG9ydGVkX3N5bWJvbHNbZWldID0gaTsKLQkgICAgfQotCSAgbmFtZV90YWJsZV9zaXplICs9IHN0cmxlbiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSkgKyAxOwotCX0KLSAgICB9Ci0KLSAgbmV4dF9vcmRpbmFsID0gbWluX29yZGluYWw7Ci0gIGZvciAoaSA9IDA7IGkgPCBORTsgaSsrKQotICAgIGlmIChleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbaV0pCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCA9PSAtMSkKLQl7Ci0JICB3aGlsZSAoZXhwb3J0ZWRfc3ltYm9sc1tuZXh0X29yZGluYWwgLSBtaW5fb3JkaW5hbF0gIT0gLTEpCi0JICAgIG5leHRfb3JkaW5hbCsrOwotCSAgZXhwb3J0ZWRfc3ltYm9sc1tuZXh0X29yZGluYWwgLSBtaW5fb3JkaW5hbF0gPSBpOwotCSAgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCA9IG5leHRfb3JkaW5hbDsKLQl9Ci0KLSAgLyogT0ssIG5vdyB3ZSBjYW4gYWxsb2NhdGUgc29tZSBtZW1vcnkgKi8KLQotICBlZGF0YV9zeiA9ICg0MAkJLyogZGlyZWN0b3J5ICovCi0JICAgICAgKyA0ICogZXhwb3J0X3RhYmxlX3NpemUJLyogYWRkcmVzc2VzICovCi0JICAgICAgKyA0ICogY291bnRfZXhwb3J0ZWRfYnluYW1lCS8qIG5hbWUgcHRycyAqLwotCSAgICAgICsgMiAqIGNvdW50X2V4cG9ydGVkX2J5bmFtZQkvKiBvcmRpbmFscyAqLwotCSAgICAgICsgbmFtZV90YWJsZV9zaXplICsgc3RybGVuIChkbGxfbmFtZSkgKyAxKTsKLX0KLQotLyogRmlsbCB0aGUgZXhwb3J0ZWQgc3ltYm9sIG9mZnNldHMuIFRoZSBwcmVsaW1pbmFyeSB3b3JrIGhhcyBhbHJlYWR5Ci0gICBiZWVuIGRvbmUgaW4gcHJvY2Vzc19kZWZfZmlsZSgpLiAgKi8KLQotc3RhdGljIHZvaWQKLWZpbGxfZXhwb3J0ZWRfb2Zmc2V0cyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGksIGo7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpibGhlOwotICBiZmQgKmI7Ci0gIHN0cnVjdCBzZWMgKnM7Ci0gIGRlZl9maWxlX2V4cG9ydCAqZT0wOwotCi0gIGZvciAoaSA9IDA7IGkgPCBwZV9kZWZfZmlsZS0+bnVtX2V4cG9ydHM7IGkrKykKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKSArIDIpOwotICAgICAgaWYgKHBlX2RldGFpbHMtPnVuZGVyc2NvcmVkKQotCXsKLQkgICpuYW1lID0gJ18nOwotCSAgc3RyY3B5IChuYW1lICsgMSwgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXN0cmNweSAobmFtZSwgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0KLSAgICAgIGJsaGUgPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwKLQkJCQkgICBuYW1lLAotCQkJCSAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgIGlmIChibGhlICYmIChibGhlLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkpCi0JewotCSAgZXhwb3J0ZWRfc3ltYm9sX29mZnNldHNbaV0gPSBibGhlLT51LmRlZi52YWx1ZTsKLSAgICAgICAgfQotICAgICAgZnJlZSAobmFtZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZmlsbF9lZGF0YSAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBpbnQgaSwgaGludDsKLSAgdW5zaWduZWQgY2hhciAqZWRpcmVjdG9yeTsKLSAgdW5zaWduZWQgbG9uZyAqZWFkZHJlc3NlczsKLSAgdW5zaWduZWQgbG9uZyAqZW5hbWVwdHJzOwotICB1bnNpZ25lZCBzaG9ydCAqZW9yZGluYWxzOwotICB1bnNpZ25lZCBjaGFyICplbmFtZXN0cjsKLSAgdGltZV90IG5vdzsKLQotICB0aW1lICgmbm93KTsKLQotICBlZGF0YV9kID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoZWRhdGFfc3opOwotCi0gIC8qIE5vdGUgdXNlIG9mIGFycmF5IHBvaW50ZXIgbWF0aCBoZXJlICovCi0gIGVkaXJlY3RvcnkgPSBlZGF0YV9kOwotICBlYWRkcmVzc2VzID0gKHVuc2lnbmVkIGxvbmcgKikgKGVkYXRhX2QgKyA0MCk7Ci0gIGVuYW1lcHRycyA9IGVhZGRyZXNzZXMgKyBleHBvcnRfdGFibGVfc2l6ZTsKLSAgZW9yZGluYWxzID0gKHVuc2lnbmVkIHNob3J0ICopIChlbmFtZXB0cnMgKyBjb3VudF9leHBvcnRlZF9ieW5hbWUpOwotICBlbmFtZXN0ciA9IChjaGFyICopIChlb3JkaW5hbHMgKyBjb3VudF9leHBvcnRlZF9ieW5hbWUpOwotCi0jZGVmaW5lIEVSVkEocHRyKSAoKCh1bnNpZ25lZCBjaGFyICopKHB0cikgLSBlZGF0YV9kKSArIGVkYXRhX3MtPm91dHB1dF9zZWN0aW9uLT52bWEgLSBpbWFnZV9iYXNlKQotCi0gIG1lbXNldCAoZWRhdGFfZCwgMCwgNDApOwotICBiZmRfcHV0XzMyIChhYmZkLCBub3csIGVkYXRhX2QgKyA0KTsKLSAgaWYgKHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yICE9IC0xKQotICAgIHsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yLCBlZGF0YV9kICsgOCk7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBwZV9kZWZfZmlsZS0+dmVyc2lvbl9taW5vciwgZWRhdGFfZCArIDEwKTsKLSAgICB9Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIEVSVkEgKGVuYW1lc3RyKSwgZWRhdGFfZCArIDEyKTsKLSAgc3RyY3B5IChlbmFtZXN0ciwgZGxsX25hbWUpOwotICBlbmFtZXN0ciArPSBzdHJsZW4gKGVuYW1lc3RyKSArIDE7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIG1pbl9vcmRpbmFsLCBlZGF0YV9kICsgMTYpOwotICBiZmRfcHV0XzMyIChhYmZkLCBleHBvcnRfdGFibGVfc2l6ZSwgZWRhdGFfZCArIDIwKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgY291bnRfZXhwb3J0ZWRfYnluYW1lLCBlZGF0YV9kICsgMjQpOwotICBiZmRfcHV0XzMyIChhYmZkLCBFUlZBIChlYWRkcmVzc2VzKSwgZWRhdGFfZCArIDI4KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgRVJWQSAoZW5hbWVwdHJzKSwgZWRhdGFfZCArIDMyKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgRVJWQSAoZW9yZGluYWxzKSwgZWRhdGFfZCArIDM2KTsKLQotICBmaWxsX2V4cG9ydGVkX29mZnNldHMgKGFiZmQsIGluZm8pOwotCi0gIC8qIE9rLCBub3cgZm9yIHRoZSBmaWxsaW5nIGluIHBhcnQgKi8KLSAgaGludCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBleHBvcnRfdGFibGVfc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIGludCBzID0gZXhwb3J0ZWRfc3ltYm9sc1tpXTsKLSAgICAgIGlmIChzICE9IC0xKQotCXsKLQkgIHN0cnVjdCBzZWMgKnNzZWMgPSBleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbc107Ci0JICB1bnNpZ25lZCBsb25nIHNydmEgPSAoZXhwb3J0ZWRfc3ltYm9sX29mZnNldHNbc10KLQkJCQkrIHNzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIHNzZWMtPm91dHB1dF9vZmZzZXQpOwotCi0JICBiZmRfcHV0XzMyIChhYmZkLCBzcnZhIC0gaW1hZ2VfYmFzZSwgKHZvaWQgKikgKGVhZGRyZXNzZXMgKyBpKSk7Ci0JICBpZiAoIXBlX2RlZl9maWxlLT5leHBvcnRzW3NdLmZsYWdfbm9uYW1lKQotCSAgICB7Ci0JICAgICAgY2hhciAqZW5hbWUgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tzXS5uYW1lOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIEVSVkEgKGVuYW1lc3RyKSwgKHZvaWQgKikgZW5hbWVwdHJzKTsKLQkgICAgICBzdHJjcHkgKGVuYW1lc3RyLCBlbmFtZSk7Ci0JICAgICAgZW5hbWVzdHIgKz0gc3RybGVuIChlbmFtZXN0cikgKyAxOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGksICh2b2lkICopIGVvcmRpbmFscyk7Ci0JICAgICAgZW5hbWVwdHJzKys7Ci0JICAgICAgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbc10uaGludCA9IGhpbnQrKzsKLQkgICAgfQotCSAgZW9yZGluYWxzKys7Ci0JfQotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gR2F0aGVyIGFsbCB0aGUgcmVsb2NhdGlvbnMgYW5kIGJ1aWxkIHRoZSAucmVsb2Mgc2VjdGlvbgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotZ2VuZXJhdGVfcmVsb2MgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0KLSAgLyogZm9yIC5yZWxvYyBzdHVmZiAqLwotICByZWxvY19kYXRhX3R5cGUgKnJlbG9jX2RhdGE7Ci0gIGludCB0b3RhbF9yZWxvY3MgPSAwOwotICBpbnQgaTsKLSAgdW5zaWduZWQgbG9uZyBzZWNfcGFnZSA9ICh1bnNpZ25lZCBsb25nKSAoLTEpOwotICB1bnNpZ25lZCBsb25nIHBhZ2VfcHRyLCBwYWdlX2NvdW50OwotICBpbnQgYmk7Ci0gIGJmZCAqYjsKLSAgc3RydWN0IHNlYyAqczsKLQotICB0b3RhbF9yZWxvY3MgPSAwOwotICBmb3IgKGIgPSBpbmZvLT5pbnB1dF9iZmRzOyBiOyBiID0gYi0+bGlua19uZXh0KQotICAgIGZvciAocyA9IGItPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLSAgICAgIHRvdGFsX3JlbG9jcyArPSBzLT5yZWxvY19jb3VudDsKLQotICByZWxvY19kYXRhID0gKHJlbG9jX2RhdGFfdHlwZSAqKSB4bWFsbG9jICh0b3RhbF9yZWxvY3MgKiBzaXplb2YgKHJlbG9jX2RhdGFfdHlwZSkpOwotCi0gIHRvdGFsX3JlbG9jcyA9IDA7Ci0gIGJpID0gMDsKLSAgZm9yIChiaSA9IDAsIGIgPSBpbmZvLT5pbnB1dF9iZmRzOyBiOyBiaSsrLCBiID0gYi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipyZWxvY3M7Ci0gICAgICBpbnQgcmVsc2l6ZSwgbnJlbG9jcywgaTsKLQotICAgICAgZm9yIChzID0gYi0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgc2VjX3ZtYSA9IHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0OwotCSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0JICBpbnQgbnN5bXMsIHN5bXNpemU7Ci0KLQkgIC8qIGlmIGl0J3Mgbm90IGxvYWRlZCwgd2UgZG9uJ3QgbmVlZCB0byByZWxvY2F0ZSBpdCB0aGlzIHdheSAqLwotCSAgaWYgKCEocy0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSSBkb24ndCBrbm93IHdoeSB0aGVyZSB3b3VsZCBiZSBhIHJlbG9jIGZvciB0aGVzZSwgYnV0IEkndmUKLQkgICAgIHNlZW4gaXQgaGFwcGVuIC0gREogKi8KLQkgIGlmIChzLT5vdXRwdXRfc2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKHMtPm91dHB1dF9zZWN0aW9uLT52bWEgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEh1aD8gIFNob3VsZG4ndCBoYXBwZW4sIGJ1dCBwdW50IGlmIGl0IGRvZXMgKi8KLQkgICAgICBlaW5mbyAoIkRKOiB6ZXJvIHZtYSBzZWN0aW9uIHJlbG9jIGRldGVjdGVkOiBgJXMnICMlZCBmPSVkXG4iLAotCQkgICAgIHMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCBzLT5vdXRwdXRfc2VjdGlvbi0+aW5kZXgsCi0JCSAgICAgcy0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGIpOwotCSAgc3ltYm9scyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLQkgIG5zeW1zID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGIsIHN5bWJvbHMpOwotCi0JICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYiwgcyk7Ci0JICByZWxvY3MgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAoKHNpemVfdCkgcmVsc2l6ZSk7Ci0JICBucmVsb2NzID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYiwgcywgcmVsb2NzLCBzeW1ib2xzKTsKLQotCSAgZm9yIChpID0gMDsgaSA8IG5yZWxvY3M7IGkrKykKLQkgICAgewotCSAgICAgIGlmICghcmVsb2NzW2ldLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkJICAmJiByZWxvY3NbaV0tPmhvd3RvLT50eXBlICE9IHBlX2RldGFpbHMtPmltYWdlYmFzZV9yZWxvYykKLQkJewotCQkgIGJmZF92bWEgc3ltX3ZtYTsKLQkJICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW0gPSAqcmVsb2NzW2ldLT5zeW1fcHRyX3B0cjsKLQkJICBzeW1fdm1hID0gKHJlbG9jc1tpXS0+YWRkZW5kCi0JCQkgICAgICsgc3ltLT52YWx1ZQotCQkJICAgICArIHN5bS0+c2VjdGlvbi0+dm1hCi0JCQkgICAgICsgc3ltLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICsgc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkJICByZWxvY19kYXRhW3RvdGFsX3JlbG9jc10udm1hID0gc2VjX3ZtYSArIHJlbG9jc1tpXS0+YWRkcmVzczsKLQkJICBzd2l0Y2ggKHJlbG9jc1tpXS0+aG93dG8tPmJpdHNpemUqMTAwMAotCQkJICArIHJlbG9jc1tpXS0+aG93dG8tPnJpZ2h0c2hpZnQpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDMyMDAwOgotCQkgICAgICByZWxvY19kYXRhW3RvdGFsX3JlbG9jc10udHlwZSA9IDM7Ci0JCSAgICAgIHRvdGFsX3JlbG9jcysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgICAgIGVpbmZvIChfKCIlWEVycm9yOiAlZC1iaXQgcmVsb2MgaW4gZGxsXG4iKSwKLQkJCSAgICAgcmVsb2NzW2ldLT5ob3d0by0+Yml0c2l6ZSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGZyZWUgKHJlbG9jcyk7Ci0JICAvKiBXYXJuaW5nOiB0aGUgYWxsb2NhdGVkIHN5bWJvbHMgYXJlIHJlbWVtYmVyZWQgaW4gQkZEIGFuZCByZXVzZWQKLQkgICAgIGxhdGVyLCBzbyBkb24ndCBmcmVlIHRoZW0hICovCi0JICAvKiBmcmVlIChzeW1ib2xzKTsgKi8KLQl9Ci0gICAgfQotCi0gIC8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgdG90YWxfcmVsb2NzIHJlbG9jYXRpb24gYWRkcmVzc2VzIGluCi0gICAgIHJlbG9jX2FkZHJlc3Nlcywgd2hpY2ggYXJlIGFsbCBzdWl0YWJsZSBmb3IgdGhlIC5yZWxvYyBzZWN0aW9uLgotICAgICBXZSBtdXN0IG5vdyBjcmVhdGUgdGhlIG5ldyBzZWN0aW9ucy4gKi8KLQotICBxc29ydCAocmVsb2NfZGF0YSwgdG90YWxfcmVsb2NzLCBzaXplb2YgKCpyZWxvY19kYXRhKSwgcmVsb2Nfc29ydCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3JlbG9jczsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdGhpc19wYWdlID0gKHJlbG9jX2RhdGFbaV0udm1hID4+IDEyKTsKLSAgICAgIGlmICh0aGlzX3BhZ2UgIT0gc2VjX3BhZ2UpCi0JewotCSAgcmVsb2Nfc3ogPSAocmVsb2Nfc3ogKyAzKSAmIH4zOwkvKiA0LWJ5dGUgYWxpZ24gKi8KLQkgIHJlbG9jX3N6ICs9IDg7Ci0JICBzZWNfcGFnZSA9IHRoaXNfcGFnZTsKLQl9Ci0gICAgICByZWxvY19zeiArPSAyOwotICAgIH0KLSAgcmVsb2Nfc3ogPSAocmVsb2Nfc3ogKyAzKSAmIH4zOwkvKiA0LWJ5dGUgYWxpZ24gKi8KLQotICByZWxvY19kID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAocmVsb2Nfc3opOwotCi0gIHNlY19wYWdlID0gKHVuc2lnbmVkIGxvbmcpICgtMSk7Ci0gIHJlbG9jX3N6ID0gMDsKLSAgcGFnZV9wdHIgPSAodW5zaWduZWQgbG9uZykgKC0xKTsKLSAgcGFnZV9jb3VudCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9yZWxvY3M7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJ2YSA9IHJlbG9jX2RhdGFbaV0udm1hIC0gaW1hZ2VfYmFzZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdGhpc19wYWdlID0gKHJ2YSAmIH4weGZmZik7Ci0gICAgICBpZiAodGhpc19wYWdlICE9IHNlY19wYWdlKQotCXsKLQkgIHdoaWxlIChyZWxvY19zeiAmIDMpCi0JICAgIHJlbG9jX2RbcmVsb2Nfc3orK10gPSAwOwotCSAgaWYgKHBhZ2VfcHRyICE9ICh1bnNpZ25lZCBsb25nKSAoLTEpKQotCSAgICBiZmRfcHV0XzMyIChhYmZkLCByZWxvY19zeiAtIHBhZ2VfcHRyLCByZWxvY19kICsgcGFnZV9wdHIgKyA0KTsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIHRoaXNfcGFnZSwgcmVsb2NfZCArIHJlbG9jX3N6KTsKLQkgIHBhZ2VfcHRyID0gcmVsb2Nfc3o7Ci0JICByZWxvY19zeiArPSA4OwotCSAgc2VjX3BhZ2UgPSB0aGlzX3BhZ2U7Ci0JICBwYWdlX2NvdW50ID0gMDsKLQl9Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCAocnZhICYgMHhmZmYpICsgKHJlbG9jX2RhdGFbaV0udHlwZTw8MTIpLAotCQkgIHJlbG9jX2QgKyByZWxvY19zeik7Ci0gICAgICByZWxvY19zeiArPSAyOwotICAgICAgaWYgKHJlbG9jX2RhdGFbaV0udHlwZSA9PSA0KQotCXsKLQkgIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jX2RhdGFbaV0uZXh0cmEsIHJlbG9jX2QgKyByZWxvY19zeik7Ci0JICByZWxvY19zeiArPSAyOwotCX0KLSAgICAgIHBhZ2VfY291bnQrKzsKLSAgICB9Ci0gIHdoaWxlIChyZWxvY19zeiAmIDMpCi0gICAgcmVsb2NfZFtyZWxvY19zeisrXSA9IDA7Ci0gIGlmIChwYWdlX3B0ciAhPSAodW5zaWduZWQgbG9uZykgKC0xKSkKLSAgICBiZmRfcHV0XzMyIChhYmZkLCByZWxvY19zeiAtIHBhZ2VfcHRyLCByZWxvY19kICsgcGFnZV9wdHIgKyA0KTsKLSAgd2hpbGUgKHJlbG9jX3N6IDwgcmVsb2Nfcy0+X3Jhd19zaXplKQotICAgIHJlbG9jX2RbcmVsb2Nfc3orK10gPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBHaXZlbiB0aGUgZXhpdGluZyBkZWZfZmlsZSBzdHJ1Y3R1cmUsIHByaW50IG91dCBhIC5ERUYgZmlsZSB0aGF0Ci0gY29ycmVzcG9uZHMgdG8gaXQuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1xdW90ZXB1dCAocywgZiwgbmVlZHNfcXVvdGVzKQotICAgICBjaGFyICpzOwotICAgICBGSUxFICogZjsKLSAgICAgaW50IG5lZWRzX3F1b3RlczsKLXsKLSAgY2hhciAqY3A7Ci0gIGZvciAoY3AgPSBzOyAqY3A7IGNwKyspCi0gICAgaWYgKCpjcCA9PSAnXCcnCi0JfHwgKmNwID09ICciJwotCXx8ICpjcCA9PSAnXFwnCi0JfHwgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpjcCkKLQl8fCAqY3AgPT0gJywnCi0JfHwgKmNwID09ICc7JykKLSAgICAgIG5lZWRzX3F1b3RlcyA9IDE7Ci0gIGlmIChuZWVkc19xdW90ZXMpCi0gICAgewotICAgICAgcHV0YyAoJyInLCBmKTsKLSAgICAgIHdoaWxlICgqcykKLQl7Ci0JICBpZiAoKnMgPT0gJyInIHx8ICpzID09ICdcXCcpCi0JICAgIHB1dGMgKCdcXCcsIGYpOwotCSAgcHV0YyAoKnMsIGYpOwotCSAgcysrOwotCX0KLSAgICAgIHB1dGMgKCciJywgZik7Ci0gICAgfQotICBlbHNlCi0gICAgZnB1dHMgKHMsIGYpOwotfQotCi12b2lkCi1wZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUgKHBlX291dF9kZWZfZmlsZW5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKnBlX291dF9kZWZfZmlsZW5hbWU7Ci17Ci0gIGludCBpOwotICBGSUxFICpvdXQgPSBmb3BlbiAocGVfb3V0X2RlZl9maWxlbmFtZSwgInciKTsKLSAgaWYgKG91dCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBlaW5mbyAoXygiJXM6IENhbid0IG9wZW4gb3V0cHV0IGRlZiBmaWxlICVzXG4iKSwKLQkgICAgIHByb2dyYW1fbmFtZSwgcGVfb3V0X2RlZl9maWxlbmFtZSk7Ci0gICAgfQotCi0gIGlmIChwZV9kZWZfZmlsZSkKLSAgICB7Ci0gICAgICBpZiAocGVfZGVmX2ZpbGUtPm5hbWUpCi0JewotCSAgaWYgKHBlX2RlZl9maWxlLT5pc19kbGwpCi0JICAgIGZwcmludGYgKG91dCwgIkxJQlJBUlkgIik7Ci0JICBlbHNlCi0JICAgIGZwcmludGYgKG91dCwgIk5BTUUgIik7Ci0JICBxdW90ZXB1dCAocGVfZGVmX2ZpbGUtPm5hbWUsIG91dCwgMSk7Ci0JICBpZiAocGVfZGF0YSAob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2UpCi0JICAgIGZwcmludGYgKG91dCwgIiBCQVNFPTB4JWx4IiwKLQkJICAgICAodW5zaWduZWQgbG9uZykgcGVfZGF0YSAob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2UpOwotCSAgZnByaW50ZiAob3V0LCAiXG4iKTsKLQl9Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+ZGVzY3JpcHRpb24pCi0JewotCSAgZnByaW50ZiAob3V0LCAiREVTQ1JJUFRJT04gIik7Ci0JICBxdW90ZXB1dCAocGVfZGVmX2ZpbGUtPmRlc2NyaXB0aW9uLCBvdXQsIDEpOwotCSAgZnByaW50ZiAob3V0LCAiXG4iKTsKLQl9Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+dmVyc2lvbl9taW5vciAhPSAtMSkKLQlmcHJpbnRmIChvdXQsICJWRVJTSU9OICVkLiVkXG4iLCBwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciwKLQkJIHBlX2RlZl9maWxlLT52ZXJzaW9uX21pbm9yKTsKLSAgICAgIGVsc2UgaWYgKHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yICE9IC0xKQotCWZwcmludGYgKG91dCwgIlZFUlNJT04gJWRcbiIsIHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yKTsKLQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlICE9IC0xIHx8IHBlX2RlZl9maWxlLT5oZWFwX3Jlc2VydmUgIT0gLTEpCi0JZnByaW50ZiAob3V0LCAiXG4iKTsKLQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5zdGFja19jb21taXQgIT0gLTEpCi0JZnByaW50ZiAob3V0LCAiU1RBQ0tTSVpFIDB4JXgsMHgleFxuIiwKLQkJIHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlLCBwZV9kZWZfZmlsZS0+c3RhY2tfY29tbWl0KTsKLSAgICAgIGVsc2UgaWYgKHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlICE9IC0xKQotCWZwcmludGYgKG91dCwgIlNUQUNLU0laRSAweCV4XG4iLCBwZV9kZWZfZmlsZS0+c3RhY2tfcmVzZXJ2ZSk7Ci0gICAgICBpZiAocGVfZGVmX2ZpbGUtPmhlYXBfY29tbWl0ICE9IC0xKQotCWZwcmludGYgKG91dCwgIkhFQVBTSVpFIDB4JXgsMHgleFxuIiwKLQkJIHBlX2RlZl9maWxlLT5oZWFwX3Jlc2VydmUsIHBlX2RlZl9maWxlLT5oZWFwX2NvbW1pdCk7Ci0gICAgICBlbHNlIGlmIChwZV9kZWZfZmlsZS0+aGVhcF9yZXNlcnZlICE9IC0xKQotCWZwcmludGYgKG91dCwgIkhFQVBTSVpFIDB4JXhcbiIsIHBlX2RlZl9maWxlLT5oZWFwX3Jlc2VydmUpOwotCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPm51bV9zZWN0aW9uX2RlZnMgPiAwKQotCXsKLQkgIGZwcmludGYgKG91dCwgIlxuU0VDVElPTlNcblxuIik7Ci0JICBmb3IgKGkgPSAwOyBpIDwgcGVfZGVmX2ZpbGUtPm51bV9zZWN0aW9uX2RlZnM7IGkrKykKLQkgICAgewotCSAgICAgIGZwcmludGYgKG91dCwgIiAgICAiKTsKLQkgICAgICBxdW90ZXB1dCAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5uYW1lLCBvdXQsIDApOwotCSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLmNsYXNzKQotCQl7Ci0JCSAgZnByaW50ZiAob3V0LCAiIENMQVNTICIpOwotCQkgIHF1b3RlcHV0IChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLmNsYXNzLCBvdXQsIDApOwotCQl9Ci0JICAgICAgaWYgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ19yZWFkKQotCQlmcHJpbnRmIChvdXQsICIgUkVBRCIpOwotCSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfd3JpdGUpCi0JCWZwcmludGYgKG91dCwgIiBXUklURSIpOwotCSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfZXhlY3V0ZSkKLQkJZnByaW50ZiAob3V0LCAiIEVYRUNVVEUiKTsKLQkgICAgICBpZiAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX3NoYXJlZCkKLQkJZnByaW50ZiAob3V0LCAiIFNIQVJFRCIpOwotCSAgICAgIGZwcmludGYgKG91dCwgIlxuIik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+bnVtX2V4cG9ydHMgPiAwKQotCXsKLQkgIGZwcmludGYgKG91dCwgIlxuRVhQT1JUU1xuXG4iKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBwZV9kZWZfZmlsZS0+bnVtX2V4cG9ydHM7IGkrKykKLQkgICAgewotCSAgICAgIGRlZl9maWxlX2V4cG9ydCAqZSA9IHBlX2RlZl9maWxlLT5leHBvcnRzICsgaTsKLQkgICAgICBmcHJpbnRmIChvdXQsICIgICAgIik7Ci0JICAgICAgcXVvdGVwdXQgKGUtPm5hbWUsIG91dCwgMCk7Ci0JICAgICAgaWYgKGUtPmludGVybmFsX25hbWUgJiYgc3RyY21wIChlLT5pbnRlcm5hbF9uYW1lLCBlLT5uYW1lKSkKLQkJewotCQkgIGZwcmludGYgKG91dCwgIiA9ICIpOwotCQkgIHF1b3RlcHV0IChlLT5pbnRlcm5hbF9uYW1lLCBvdXQsIDApOwotCQl9Ci0JICAgICAgaWYgKGUtPm9yZGluYWwgIT0gLTEpCi0JCWZwcmludGYgKG91dCwgIiBAJWQiLCBlLT5vcmRpbmFsKTsKLQkgICAgICBpZiAoZS0+ZmxhZ19wcml2YXRlKQotCQlmcHJpbnRmIChvdXQsICIgUFJJVkFURSIpOwotCSAgICAgIGlmIChlLT5mbGFnX2NvbnN0YW50KQotCQlmcHJpbnRmIChvdXQsICIgQ09OU1RBTlQiKTsKLQkgICAgICBpZiAoZS0+ZmxhZ19ub25hbWUpCi0JCWZwcmludGYgKG91dCwgIiBOT05BTUUiKTsKLQkgICAgICBpZiAoZS0+ZmxhZ19kYXRhKQotCQlmcHJpbnRmIChvdXQsICIgREFUQSIpOwotCi0JICAgICAgZnByaW50ZiAob3V0LCAiXG4iKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5udW1faW1wb3J0cyA+IDApCi0JewotCSAgZnByaW50ZiAob3V0LCAiXG5JTVBPUlRTXG5cbiIpOwotCSAgZm9yIChpID0gMDsgaSA8IHBlX2RlZl9maWxlLT5udW1faW1wb3J0czsgaSsrKQotCSAgICB7Ci0JICAgICAgZGVmX2ZpbGVfaW1wb3J0ICppbSA9IHBlX2RlZl9maWxlLT5pbXBvcnRzICsgaTsKLQkgICAgICBmcHJpbnRmIChvdXQsICIgICAgIik7Ci0JICAgICAgaWYgKGltLT5pbnRlcm5hbF9uYW1lCi0JCSAgJiYgKCFpbS0+bmFtZSB8fCBzdHJjbXAgKGltLT5pbnRlcm5hbF9uYW1lLCBpbS0+bmFtZSkpKQotCQl7Ci0JCSAgcXVvdGVwdXQgKGltLT5pbnRlcm5hbF9uYW1lLCBvdXQsIDApOwotCQkgIGZwcmludGYgKG91dCwgIiA9ICIpOwotCQl9Ci0JICAgICAgcXVvdGVwdXQgKGltLT5tb2R1bGUtPm5hbWUsIG91dCwgMCk7Ci0JICAgICAgZnByaW50ZiAob3V0LCAiLiIpOwotCSAgICAgIGlmIChpbS0+bmFtZSkKLQkJcXVvdGVwdXQgKGltLT5uYW1lLCBvdXQsIDApOwotCSAgICAgIGVsc2UKLQkJZnByaW50ZiAob3V0LCAiJWQiLCBpbS0+b3JkaW5hbCk7Ci0JICAgICAgZnByaW50ZiAob3V0LCAiXG4iKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChvdXQsIF8oIjsgbm8gY29udGVudHMgYXZhaWxhYmxlXG4iKSk7Ci0KLSAgaWYgKGZjbG9zZSAob3V0KSA9PSBFT0YpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGVpbmZvIChfKCIlUDogRXJyb3IgY2xvc2luZyBmaWxlIGAlcydcbiIpLCBwZV9vdXRfZGVmX2ZpbGVuYW1lKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEdlbmVyYXRlIHRoZSBpbXBvcnQgbGlicmFyeQotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYXN5bWJvbCAqKnN5bXRhYjsKLXN0YXRpYyBpbnQgc3ltcHRyOwotc3RhdGljIGludCB0bXBfc2VxOwotc3RhdGljIGNvbnN0IGNoYXIgKmRsbF9maWxlbmFtZTsKLXN0YXRpYyBjaGFyICpkbGxfc3ltbmFtZTsKLQotI2RlZmluZSBVTkRTRUMgKGFzZWN0aW9uICopICZiZmRfdW5kX3NlY3Rpb24KLQotc3RhdGljIGFzZWN0aW9uICoKLXF1aWNrX3NlY3Rpb24oYWJmZCwgbmFtZSwgZmxhZ3MsIGFsaWduKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBmbGFnczsKLSAgICAgaW50IGFsaWduOwotewotICBhc2VjdGlvbiAqc2VjOwotICBhc3ltYm9sICpzeW07Ci0KLSAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCBuYW1lKTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzCi0JCQkJICB8IFNFQ19BTExPQwotCQkJCSAgfCBTRUNfTE9BRAotCQkJCSAgfCBTRUNfS0VFUAotCQkJICk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgYWxpZ24pOwotICAvKiByZW1lbWJlciB0byB1bmRvIHRoaXMgYmVmb3JlIHRyeWluZyB0byBsaW5rIGludGVybmFsbHkhICovCi0gIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzZWM7Ci0KLSAgc3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgc3ltdGFiW3N5bXB0cisrXSA9IHN5bTsKLSAgc3ltLT5uYW1lID0gc2VjLT5uYW1lOwotICBzeW0tPnNlY3Rpb24gPSBzZWM7Ci0gIHN5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0gIHN5bS0+dmFsdWUgPSAwOwotCi0gIHJldHVybiBzZWM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1xdWlja19zeW1ib2wgKGFiZmQsIG4xLCBuMiwgbjMsIHNlYywgZmxhZ3MsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbjE7Ci0gICAgIGNoYXIgKm4yOwotICAgICBjaGFyICpuMzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgaW50IGZsYWdzOwotICAgICBpbnQgYWRkcjsKLXsKLSAgYXN5bWJvbCAqc3ltOwotICBjaGFyICpuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuMSkgKyBzdHJsZW4gKG4yKSArIHN0cmxlbiAobjMpICsgMSk7Ci0gIHN0cmNweSAobmFtZSwgbjEpOwotICBzdHJjYXQgKG5hbWUsIG4yKTsKLSAgc3RyY2F0IChuYW1lLCBuMyk7Ci0gIHN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIHN5bS0+bmFtZSA9IG5hbWU7Ci0gIHN5bS0+c2VjdGlvbiA9IHNlYzsKLSAgc3ltLT5mbGFncyA9IGZsYWdzOwotICBzeW0tPnZhbHVlID0gYWRkcjsKLSAgc3ltdGFiW3N5bXB0cisrXSA9IHN5bTsKLX0KLQotc3RhdGljIGFyZWxlbnQgKnJlbHRhYiA9IDA7Ci1zdGF0aWMgaW50IHJlbGNvdW50ID0gMCwgcmVsc2l6ZSA9IDA7Ci0KLXN0YXRpYyB2b2lkCi1xdWlja19yZWxvYyAoYWJmZCwgYWRkcmVzcywgd2hpY2hfaG93dG8sIHN5bWlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgYWRkcmVzczsKLSAgICAgaW50IHdoaWNoX2hvd3RvOwotICAgICBpbnQgc3ltaWR4OwotewotICBpZiAocmVsY291bnQgPj0gKHJlbHNpemUtMSkpCi0gICAgewotICAgICAgcmVsc2l6ZSArPSAxMDsKLSAgICAgIGlmIChyZWx0YWIpCi0JcmVsdGFiID0gKGFyZWxlbnQgKikgeHJlYWxsb2MgKHJlbHRhYiwgcmVsc2l6ZSAqIHNpemVvZiAoYXJlbGVudCkpOwotICAgICAgZWxzZQotCXJlbHRhYiA9IChhcmVsZW50ICopIHhtYWxsb2MgKHJlbHNpemUgKiBzaXplb2YgKGFyZWxlbnQpKTsKLSAgICB9Ci0gIHJlbHRhYltyZWxjb3VudF0uYWRkcmVzcyA9IGFkZHJlc3M7Ci0gIHJlbHRhYltyZWxjb3VudF0uYWRkZW5kID0gMDsKLSAgcmVsdGFiW3JlbGNvdW50XS5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgd2hpY2hfaG93dG8pOwotICByZWx0YWJbcmVsY291bnRdLnN5bV9wdHJfcHRyID0gc3ltdGFiICsgc3ltaWR4OwotICByZWxjb3VudCsrOwotfQotCi1zdGF0aWMgdm9pZAotc2F2ZV9yZWxvY3MgKGFzZWN0aW9uICpzZWMpCi17Ci0gIGludCBpOwotICBzZWMtPnJlbG9jYXRpb24gPSByZWx0YWI7Ci0gIHNlYy0+cmVsb2NfY291bnQgPSByZWxjb3VudDsKLSAgc2VjLT5vcmVsb2NhdGlvbiA9IChhcmVsZW50ICoqKSB4bWFsbG9jICgocmVsY291bnQrMSkgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICBmb3IgKGk9MDsgaTxyZWxjb3VudDsgaSsrKQotICAgIHNlYy0+b3JlbG9jYXRpb25baV0gPSBzZWMtPnJlbG9jYXRpb24gKyBpOwotICBzZWMtPm9yZWxvY2F0aW9uW3JlbGNvdW50XSA9IDA7Ci0gIHNlYy0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotICByZWx0YWIgPSAwOwotICByZWxjb3VudCA9IHJlbHNpemUgPSAwOwotfQotCi0vKgotICoJLnNlY3Rpb24JLmlkYXRhJDIKLSAqCS5nbG9iYWwJCV9faGVhZF9teV9kbGwKLSAqIF9faGVhZF9teV9kbGw6Ci0gKgkucnZhCQlobmFtZQotICoJLmxvbmcJCTAKLSAqCS5sb25nCQkwCi0gKgkucnZhCQlfX215X2RsbF9pbmFtZQotICoJLnJ2YQkJZnRodW5rCi0gKgotICoJLnNlY3Rpb24JLmlkYXRhJDUKLSAqCS5sb25nCQkwCi0gKiBmdGh1bms6Ci0gKgotICoJLnNlY3Rpb24JLmlkYXRhJDQKLSAqCS5sb25nCQkwCi0gKiBobmFtZToKLSAqLwotCi1zdGF0aWMgYmZkICoKLW1ha2VfaGVhZCAocGFyZW50KQotICAgICBiZmQgKnBhcmVudDsKLXsKLSAgYXNlY3Rpb24gKmlkMiwgKmlkNSwgKmlkNDsKLSAgdW5zaWduZWQgY2hhciAqZDIsICpkNSwgKmQ0OwotICBjaGFyICpvbmFtZTsKLSAgYmZkICphYmZkOwotCi0gIG9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoMjApOwotICBzcHJpbnRmIChvbmFtZSwgImQlMDZkLm8iLCB0bXBfc2VxKTsKLSAgdG1wX3NlcSsrOwotCi0gIGFiZmQgPSBiZmRfY3JlYXRlIChvbmFtZSwgcGFyZW50KTsKLSAgYmZkX2ZpbmRfdGFyZ2V0IChwZV9kZXRhaWxzLT5vYmplY3RfdGFyZ2V0LCBhYmZkKTsKLSAgYmZkX21ha2Vfd3JpdGFibGUgKGFiZmQpOwotCi0gIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KTsKLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIHBlX2RldGFpbHMtPmJmZF9hcmNoLCAwKTsKLQotICBzeW1wdHIgPSAwOwotICBzeW10YWIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoNiAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIGlkMiA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkMiIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDUgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDUiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ0ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ0IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIHF1aWNrX3N5bWJvbCAoYWJmZCwgVSgiX2hlYWRfIiksIGRsbF9zeW1uYW1lLCAiIiwgaWQyLCBCU0ZfR0xPQkFMLCAwKTsKLSAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCIiKSwgZGxsX3N5bW5hbWUsICJfaW5hbWUiLCBVTkRTRUMsIEJTRl9HTE9CQUwsIDApOwotCi0gIC8qIE9LLCBwYXkgYXR0ZW50aW9uIGhlcmUuICBJIGdvdCBjb25mdXNlZCBteXNlbGYgbG9va2luZyBiYWNrIGF0Ci0gICAgIGl0LiAgV2UgY3JlYXRlIGEgZm91ci1ieXRlIHNlY3Rpb24gdG8gbWFyayB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgICBsaXN0LCBhbmQgd2UgaW5jbHVkZSBhbiBvZmZzZXQgb2YgNCBpbiB0aGUgc2VjdGlvbiwgc28gdGhhdCB0aGUKLSAgICAgcG9pbnRlciB0byB0aGUgbGlzdCBwb2ludHMgdG8gdGhlICplbmQqIG9mIHRoaXMgc2VjdGlvbiwgd2hpY2ggaXMKLSAgICAgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0IG9mIHNlY3Rpb25zIGZyb20gb3RoZXIgb2JqZWN0cy4gKi8KLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQyLCAyMCk7Ci0gIGQyID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoMjApOwotICBpZDItPmNvbnRlbnRzID0gZDI7Ci0gIG1lbXNldCAoZDIsIDAsIDIwKTsKLSAgZDJbMF0gPSBkMlsxNl0gPSA0OyAvKiByZWxvYyBhZGRlbmQgKi8KLSAgcXVpY2tfcmVsb2MgKGFiZmQsICAwLCBCRkRfUkVMT0NfUlZBLCAyKTsKLSAgcXVpY2tfcmVsb2MgKGFiZmQsIDEyLCBCRkRfUkVMT0NfUlZBLCA0KTsKLSAgcXVpY2tfcmVsb2MgKGFiZmQsIDE2LCBCRkRfUkVMT0NfUlZBLCAxKTsKLSAgc2F2ZV9yZWxvY3MgKGlkMik7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNSwgNCk7Ci0gIGQ1ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNS0+Y29udGVudHMgPSBkNTsKLSAgbWVtc2V0IChkNSwgMCwgNCk7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNCwgNCk7Ci0gIGQ0ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNC0+Y29udGVudHMgPSBkNDsKLSAgbWVtc2V0IChkNCwgMCwgNCk7Ci0KLSAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHN5bXRhYiwgc3ltcHRyKTsKLQotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkMiwgZDIsIDAsIDIwKTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDUsIGQ1LCAwLCA0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDQsIGQ0LCAwLCA0KTsKLSAgCi0gIGJmZF9tYWtlX3JlYWRhYmxlIChhYmZkKTsKLSAgcmV0dXJuIGFiZmQ7Ci19Ci0KLS8qCi0gKgkuc2VjdGlvbgkuaWRhdGEkNAotICoJLmxvbmcJCTAKLSAqCS5zZWN0aW9uCS5pZGF0YSQ1Ci0gKgkubG9uZwkJMAotICoJLnNlY3Rpb24JaWRhdGEkNwotICoJLmdsb2JhbAkJX19teV9kbGxfaW5hbWUKLSAqX19teV9kbGxfaW5hbWU6Ci0gKgkuYXNjaXoJCSJteS5kbGwiCi0gKi8KLQotc3RhdGljIGJmZCAqCi1tYWtlX3RhaWwgKHBhcmVudCkKLSAgICAgYmZkICpwYXJlbnQ7Ci17Ci0gIGFzZWN0aW9uICppZDQsICppZDUsICppZDc7Ci0gIHVuc2lnbmVkIGNoYXIgKmQ0LCAqZDUsICpkNzsKLSAgaW50IGxlbjsKLSAgY2hhciAqb25hbWU7Ci0gIGJmZCAqYWJmZDsKLQotICBvbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKLSAgc3ByaW50ZiAob25hbWUsICJkJTA2ZC5vIiwgdG1wX3NlcSk7Ci0gIHRtcF9zZXErKzsKLQotICBhYmZkID0gYmZkX2NyZWF0ZSAob25hbWUsIHBhcmVudCk7Ci0gIGJmZF9maW5kX3RhcmdldCAocGVfZGV0YWlscy0+b2JqZWN0X3RhcmdldCwgYWJmZCk7Ci0gIGJmZF9tYWtlX3dyaXRhYmxlIChhYmZkKTsKLQotICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBwZV9kZXRhaWxzLT5iZmRfYXJjaCwgMCk7Ci0KLSAgc3ltcHRyID0gMDsKLSAgc3ltdGFiID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKDUgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBpZDQgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ1ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ1IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNyA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNyIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBxdWlja19zeW1ib2wgKGFiZmQsIFUoIiIpLCBkbGxfc3ltbmFtZSwgIl9pbmFtZSIsIGlkNywgQlNGX0dMT0JBTCwgMCk7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNCwgNCk7Ci0gIGQ0ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNC0+Y29udGVudHMgPSBkNDsKLSAgbWVtc2V0IChkNCwgMCwgNCk7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNSwgNCk7Ci0gIGQ1ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNS0+Y29udGVudHMgPSBkNTsKLSAgbWVtc2V0IChkNSwgMCwgNCk7Ci0KLSAgbGVuID0gc3RybGVuIChkbGxfZmlsZW5hbWUpKzE7Ci0gIGlmIChsZW4gJiAxKQotICAgIGxlbiArKzsKLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNywgbGVuKTsKLSAgZDcgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICBpZDctPmNvbnRlbnRzID0gZDc7Ci0gIHN0cmNweSAoZDcsIGRsbF9maWxlbmFtZSk7Ci0KLSAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHN5bXRhYiwgc3ltcHRyKTsKLQotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNCwgZDQsIDAsIDQpOwotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNSwgZDUsIDAsIDQpOwotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNywgZDcsIDAsIGxlbik7Ci0KLSAgYmZkX21ha2VfcmVhZGFibGUgKGFiZmQpOwotICByZXR1cm4gYWJmZDsKLX0KLQotLyoKLSAqCS50ZXh0Ci0gKgkuZ2xvYmFsCQlfZnVuY3Rpb24KLSAqCS5nbG9iYWwJCV9fX2ltcF9mdW5jdGlvbgotICoJLmdsb2JhbAkJX19pbXBfX2Z1bmN0aW9uCi0gKl9mdW5jdGlvbjoKLSAqCWptcAkJKl9faW1wX19mdW5jdGlvbjoKLSAqCi0gKgkuc2VjdGlvbglpZGF0YSQ3Ci0gKgkubG9uZwkJX19oZWFkX215X2RsbAotICoKLSAqCS5zZWN0aW9uCS5pZGF0YSQ1Ci0gKl9fX2ltcF9mdW5jdGlvbjoKLSAqX19pbXBfX2Z1bmN0aW9uOgotICppYXQ/Ci0gKgkuc2VjdGlvbgkuaWRhdGEkNAotICppYXQ/Ci0gKgkuc2VjdGlvbgkuaWRhdGEkNgotICpJRDxvcmRpbmFsPjoKLSAqCS5zaG9ydAkJPGhpbnQ+Ci0gKgkuYXNjaXoJCSJmdW5jdGlvbiIgeGxhdGU/IChhZGQgdW5kZXJzY29yZSwga2lsbCBhdCkKLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBqbXBfaXg4Nl9ieXRlc1tdID0gewotICAweGZmLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDkwCi19OwotCi0KLXN0YXRpYyBiZmQgKgotbWFrZV9vbmUgKGV4cCwgcGFyZW50KQotICAgICBkZWZfZmlsZV9leHBvcnQgKmV4cDsKLSAgICAgYmZkICpwYXJlbnQ7Ci17Ci0gIGFzZWN0aW9uICp0eCwgKmlkNywgKmlkNSwgKmlkNCwgKmlkNjsKLSAgdW5zaWduZWQgY2hhciAqdGQsICpkNywgKmQ1LCAqZDQsICpkNjsKLSAgaW50IGxlbjsKLSAgY2hhciAqb25hbWU7Ci0gIGJmZCAqYWJmZDsKLSAgdW5zaWduZWQgY2hhciAqam1wX2J5dGVzOwotICBpbnQgam1wX2J5dGVfY291bnQ7Ci0KLSAgc3dpdGNoIChwZV9kZXRhaWxzLT5wZV9hcmNoKQotICAgIHsKLSAgICBjYXNlIFBFX0FSQ0hfaTM4NjoKLSAgICAgIGptcF9ieXRlcyA9IGptcF9peDg2X2J5dGVzOwotICAgICAgam1wX2J5dGVfY291bnQgPSBzaXplb2YgKGptcF9peDg2X2J5dGVzKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBvbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKLSAgc3ByaW50ZiAob25hbWUsICJkJTA2ZC5vIiwgdG1wX3NlcSk7Ci0gIHRtcF9zZXErKzsKLQotICBhYmZkID0gYmZkX2NyZWF0ZSAob25hbWUsIHBhcmVudCk7Ci0gIGJmZF9maW5kX3RhcmdldCAocGVfZGV0YWlscy0+b2JqZWN0X3RhcmdldCwgYWJmZCk7Ci0gIGJmZF9tYWtlX3dyaXRhYmxlIChhYmZkKTsKLQotICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBwZV9kZXRhaWxzLT5iZmRfYXJjaCwgMCk7Ci0KLSAgc3ltcHRyID0gMDsKLSAgc3ltdGFiID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKDEwICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgdHggID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi50ZXh0IiwgICAgU0VDX0NPREV8U0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNyA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNyIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDUgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDUiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ0ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ0IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNiA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNiIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZiAoISBleHAtPmZsYWdfZGF0YSkKLSAgICBxdWlja19zeW1ib2wgKGFiZmQsIFUoIiIpLCBleHAtPmludGVybmFsX25hbWUsICIiLCB0eCwgQlNGX0dMT0JBTCwgMCk7Ci0gIHF1aWNrX3N5bWJvbCAoYWJmZCwgVSgiX2hlYWRfIiksIGRsbF9zeW1uYW1lLCAiIiwgVU5EU0VDLCBCU0ZfR0xPQkFMLCAwKTsKLSAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCJfX2ltcF8iKSwgZXhwLT5pbnRlcm5hbF9uYW1lLCAiIiwgaWQ1LCBCU0ZfR0xPQkFMLCAwKTsKLSAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCJfaW1wX18iKSwgZXhwLT5pbnRlcm5hbF9uYW1lLCAiIiwgaWQ1LCBCU0ZfR0xPQkFMLCAwKTsKLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgdHgsIGptcF9ieXRlX2NvdW50KTsKLSAgdGQgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jIChqbXBfYnl0ZV9jb3VudCk7Ci0gIHR4LT5jb250ZW50cyA9IHRkOwotICBtZW1jcHkgKHRkLCBqbXBfYnl0ZXMsIGptcF9ieXRlX2NvdW50KTsKLSAgc3dpdGNoIChwZV9kZXRhaWxzLT5wZV9hcmNoKQotICAgIHsKLSAgICBjYXNlIFBFX0FSQ0hfaTM4NjoKLSAgICAgIHF1aWNrX3JlbG9jIChhYmZkLCAyLCBCRkRfUkVMT0NfMzIsIDIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBzYXZlX3JlbG9jcyAodHgpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDcsIDQpOwotICBkNyA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDctPmNvbnRlbnRzID0gZDc7Ci0gIG1lbXNldCAoZDcsIDAsIDQpOwotICBxdWlja19yZWxvYyAoYWJmZCwgMCwgQkZEX1JFTE9DX1JWQSwgNik7Ci0gIHNhdmVfcmVsb2NzIChpZDcpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDUsIDQpOwotICBkNSA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDUtPmNvbnRlbnRzID0gZDU7Ci0gIG1lbXNldCAoZDUsIDAsIDQpOwotICBpZiAoZXhwLT5mbGFnX25vbmFtZSkKLSAgICB7Ci0gICAgICBkNVswXSA9IGV4cC0+b3JkaW5hbDsKLSAgICAgIGQ1WzFdID0gZXhwLT5vcmRpbmFsID4+IDg7Ci0gICAgICBkNVszXSA9IDB4ODA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcXVpY2tfcmVsb2MgKGFiZmQsIDAsIEJGRF9SRUxPQ19SVkEsIDQpOwotICAgICAgc2F2ZV9yZWxvY3MgKGlkNSk7Ci0gICAgfQotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDQsIDQpOwotICBkNCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOwotICBpZDQtPmNvbnRlbnRzID0gZDQ7Ci0gIG1lbXNldCAoZDQsIDAsIDQpOwotICBpZiAoZXhwLT5mbGFnX25vbmFtZSkKLSAgICB7Ci0gICAgICBkNVswXSA9IGV4cC0+b3JkaW5hbDsKLSAgICAgIGQ1WzFdID0gZXhwLT5vcmRpbmFsID4+IDg7Ci0gICAgICBkNVszXSA9IDB4ODA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcXVpY2tfcmVsb2MgKGFiZmQsIDAsIEJGRF9SRUxPQ19SVkEsIDQpOwotICAgICAgc2F2ZV9yZWxvY3MgKGlkNCk7Ci0gICAgfQotCi0gIGlmIChleHAtPmZsYWdfbm9uYW1lKQotICAgIHsKLSAgICAgIGxlbiA9IDA7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ2LCAwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsZW4gPSBzdHJsZW4gKGV4cC0+bmFtZSkgKyAzOwotICAgICAgaWYgKGxlbiAmIDEpCi0JbGVuKys7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ2LCBsZW4pOwotICAgICAgZDYgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICAgICAgaWQ2LT5jb250ZW50cyA9IGQ2OwotICAgICAgbWVtc2V0IChkNiwgMCwgbGVuKTsKLSAgICAgIGQ2WzBdID0gZXhwLT5oaW50ICYgMHhmZjsKLSAgICAgIGQ2WzFdID0gZXhwLT5oaW50ID4+IDg7Ci0gICAgICBzdHJjcHkgKGQ2KzIsIGV4cC0+bmFtZSk7Ci0gICAgfQotCi0gIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBzeW10YWIsIHN5bXB0cik7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCB0eCwgdGQsIDAsIGptcF9ieXRlX2NvdW50KTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDcsIGQ3LCAwLCA0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDUsIGQ1LCAwLCA0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDQsIGQ0LCAwLCA0KTsKLSAgaWYgKCFleHAtPmZsYWdfbm9uYW1lKQotICAgIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ2LCBkNiwgMCwgbGVuKTsKLQotICBiZmRfbWFrZV9yZWFkYWJsZSAoYWJmZCk7Ci0gIHJldHVybiBhYmZkOwotfQotCi12b2lkCi1wZV9kbGxfZ2VuZXJhdGVfaW1wbGliIChkZWYsIGltcGZpbGVuYW1lKQotICAgICBkZWZfZmlsZSAqZGVmOwotICAgICBjb25zdCBjaGFyICppbXBmaWxlbmFtZTsKLXsKLSAgaW50IGk7Ci0gIGJmZCAqYXJfaGVhZDsKLSAgYmZkICphcl90YWlsOwotICBiZmQgKm91dGFyY2g7Ci0gIGJmZCAqaGVhZCA9IDA7Ci0KLSAgZGxsX2ZpbGVuYW1lID0gZGVmLT5uYW1lOwotICBpZiAoZGxsX2ZpbGVuYW1lID09IDApCi0gICAgewotICAgICAgZGxsX2ZpbGVuYW1lID0gZGxsX25hbWU7Ci0gICAgICBmb3IgKGk9MDsgaW1wZmlsZW5hbWVbaV07IGkrKykKLQlpZiAoaW1wZmlsZW5hbWVbaV0gPT0gJy8nIHx8IGltcGZpbGVuYW1lW2ldID09ICdcXCcpCi0JICBkbGxfZmlsZW5hbWUgPSBpbXBmaWxlbmFtZSsxOwotICAgIH0KLSAgZGxsX3N5bW5hbWUgPSB4c3RyZHVwIChkbGxfZmlsZW5hbWUpOwotICBmb3IgKGk9MDsgZGxsX3N5bW5hbWVbaV07IGkrKykKLSAgICBpZiAoIWlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBkbGxfc3ltbmFtZVtpXSkpCi0gICAgICBkbGxfc3ltbmFtZVtpXSA9ICdfJzsKLQotICB1bmxpbmsgKGltcGZpbGVuYW1lKTsKLQotICBvdXRhcmNoID0gYmZkX29wZW53IChpbXBmaWxlbmFtZSwgMCk7Ci0KLSAgaWYgKCFvdXRhcmNoKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBlaW5mbyAoXygiJVhDYW4ndCBvcGVuIC5saWIgZmlsZTogJXNcbiIpLCBpbXBmaWxlbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGVpbmZvIChfKCJDcmVhdGluZyBsaWJyYXJ5IGZpbGU6ICVzXG4iKSwgaW1wZmlsZW5hbWUpOwotICAKLSAgYmZkX3NldF9mb3JtYXQgKG91dGFyY2gsIGJmZF9hcmNoaXZlKTsKLSAgb3V0YXJjaC0+aGFzX2FybWFwID0gMTsKLQotICAvKiBXb3JrIG91dCBhIHJlYXNvbmFibGUgc2l6ZSBvZiB0aGluZ3MgdG8gcHV0IG9udG8gb25lIGxpbmUuICovCi0KLSAgYXJfaGVhZCA9IG1ha2VfaGVhZCAob3V0YXJjaCk7Ci0KLSAgZm9yIChpID0gMDsgaTxkZWYtPm51bV9leHBvcnRzOyBpKyspCi0gICAgewotICAgICAgLyogVGhlIGltcG9ydCBsaWJyYXJ5IGRvZXNuJ3Qga25vdyBhYm91dCB0aGUgaW50ZXJuYWwgbmFtZSAqLwotICAgICAgY2hhciAqaW50ZXJuYWwgPSBkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZTsKLSAgICAgIGJmZCAqbjsKLSAgICAgIGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lID0gZGVmLT5leHBvcnRzW2ldLm5hbWU7Ci0gICAgICBuID0gbWFrZV9vbmUgKGRlZi0+ZXhwb3J0cytpLCBvdXRhcmNoKTsKLSAgICAgIG4tPm5leHQgPSBoZWFkOwotICAgICAgaGVhZCA9IG47Ci0gICAgICBkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSA9IGludGVybmFsOwotICAgIH0KLQotICBhcl90YWlsID0gbWFrZV90YWlsIChvdXRhcmNoKTsKLQotICBpZiAoYXJfaGVhZCA9PSBOVUxMIHx8IGFyX3RhaWwgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogTm93IHN0aWNrIHRoZW0gYWxsIGludG8gdGhlIGFyY2hpdmUgKi8KLQotICBhcl9oZWFkLT5uZXh0ID0gaGVhZDsKLSAgYXJfdGFpbC0+bmV4dCA9IGFyX2hlYWQ7Ci0gIGhlYWQgPSBhcl90YWlsOwotCi0gIGlmICghIGJmZF9zZXRfYXJjaGl2ZV9oZWFkIChvdXRhcmNoLCBoZWFkKSkKLSAgICBlaW5mbyAoIiVYYmZkX3NldF9hcmNoaXZlX2hlYWQ6ICVzXG4iLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gIAotICBpZiAoISBiZmRfY2xvc2UgKG91dGFyY2gpKQotICAgIGVpbmZvICgiJVhiZmRfY2xvc2UgJXM6ICVzXG4iLCBpbXBmaWxlbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCi0gIHdoaWxlIChoZWFkICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkICpuID0gaGVhZC0+bmV4dDsKLSAgICAgIGJmZF9jbG9zZSAoaGVhZCk7Ci0gICAgICBoZWFkID0gbjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGRfYmZkX3RvX2xpbmsgKGFiZmQsIG5hbWUsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmYWtlX2ZpbGU7Ci0gIGZha2VfZmlsZSA9IGxhbmdfYWRkX2lucHV0X2ZpbGUgKG5hbWUsCi0JCQkJICAgbGFuZ19pbnB1dF9maWxlX2lzX2Zha2VfZW51bSwKLQkJCQkgICBOVUxMKTsKLSAgZmFrZV9maWxlLT50aGVfYmZkID0gYWJmZDsKLSAgbGRsYW5nX2FkZF9maWxlIChmYWtlX2ZpbGUpOwotICBpZiAoIWJmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBsaW5rX2luZm8pKQotICAgIGVpbmZvICgiJVhhZGRzeW0gJXM6ICVzXG4iLCBuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci19Ci0KLXZvaWQKLXBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBkZWZfZmlsZV9tb2R1bGUgKm1vZHVsZTsKLSAgcGVfZGxsX2lkX3RhcmdldChiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotCi0gIGlmICghcGVfZGVmX2ZpbGUpCi0gICAgcmV0dXJuOwotCi0gIGZvciAobW9kdWxlID0gcGVfZGVmX2ZpbGUtPm1vZHVsZXM7IG1vZHVsZTsgbW9kdWxlID0gbW9kdWxlLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBpLCBkb190aGlzX2RsbDsKLQotICAgICAgZGxsX2ZpbGVuYW1lID0gbW9kdWxlLT5uYW1lOwotICAgICAgZGxsX3N5bW5hbWUgPSB4c3RyZHVwIChtb2R1bGUtPm5hbWUpOwotICAgICAgZm9yIChpPTA7IGRsbF9zeW1uYW1lW2ldOyBpKyspCi0JaWYgKCFpc2FsbnVtIChkbGxfc3ltbmFtZVtpXSkpCi0JICBkbGxfc3ltbmFtZVtpXSA9ICdfJzsKLQotICAgICAgZG9fdGhpc19kbGwgPSAwOwotCi0gICAgICBmb3IgKGk9MDsgaTxwZV9kZWZfZmlsZS0+bnVtX2ltcG9ydHM7IGkrKykKLQlpZiAocGVfZGVmX2ZpbGUtPmltcG9ydHNbaV0ubW9kdWxlID09IG1vZHVsZSkKLQkgIHsKLQkgICAgZGVmX2ZpbGVfZXhwb3J0IGV4cDsKLQkgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmJsaGU7Ci0KLQkgICAgLyogc2VlIGlmIHdlIG5lZWQgdGhpcyBpbXBvcnQgKi8KLQkgICAgY2hhciAqbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocGVfZGVmX2ZpbGUtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZSkgKyAyKTsKLQkgICAgc3ByaW50ZiAobmFtZSwgIiVzJXMiLCBVKCIiKSwgcGVfZGVmX2ZpbGUtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7Ci0JICAgIGJsaGUgPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLT5oYXNoLCBuYW1lLAotCQkJCQkgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JICAgIGZyZWUgKG5hbWUpOwotCSAgICBpZiAoYmxoZSAmJiBibGhlLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCSAgICAgIHsKLQkJYmZkICpvbmU7Ci0JCS8qIHdlIGRvICovCi0JCWlmICghZG9fdGhpc19kbGwpCi0JCSAgewotCQkgICAgYmZkICphcl9oZWFkID0gbWFrZV9oZWFkIChvdXRwdXRfYmZkKTsKLQkJICAgIGFkZF9iZmRfdG9fbGluayAoYXJfaGVhZCwgYXJfaGVhZC0+ZmlsZW5hbWUsIGxpbmtfaW5mbyk7Ci0JCSAgICBkb190aGlzX2RsbCA9IDE7Ci0JCSAgfQotCQlleHAuaW50ZXJuYWxfbmFtZSA9IHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLmludGVybmFsX25hbWU7Ci0JCWV4cC5uYW1lID0gcGVfZGVmX2ZpbGUtPmltcG9ydHNbaV0ubmFtZTsKLQkJZXhwLm9yZGluYWwgPSBwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5vcmRpbmFsOwotCQlleHAuaGludCA9IGV4cC5vcmRpbmFsID49IDAgPyBleHAub3JkaW5hbCA6IDA7Ci0JCWV4cC5mbGFnX3ByaXZhdGUgPSAwOwotCQlleHAuZmxhZ19jb25zdGFudCA9IDA7Ci0JCWV4cC5mbGFnX2RhdGEgPSAwOwotCQlleHAuZmxhZ19ub25hbWUgPSBleHAubmFtZSA/IDAgOiAxOwotCQlvbmUgPSBtYWtlX29uZSAoJmV4cCwgb3V0cHV0X2JmZCk7Ci0JCWFkZF9iZmRfdG9fbGluayAob25lLCBvbmUtPmZpbGVuYW1lLCBsaW5rX2luZm8pOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIGlmIChkb190aGlzX2RsbCkKLQl7Ci0JICBiZmQgKmFyX3RhaWwgPSBtYWtlX3RhaWwgKG91dHB1dF9iZmQpOwotCSAgYWRkX2JmZF90b19saW5rIChhcl90YWlsLCBhcl90YWlsLT5maWxlbmFtZSwgbGlua19pbmZvKTsKLQl9Ci0KLSAgICAgIGZyZWUgKGRsbF9zeW1uYW1lKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIFdlIHdlcmUgaGFuZGVkIGEgKi5ETEwgZmlsZS4gIFBhcnNlIGl0IGFuZCB0dXJuIGl0IGludG8gYSBzZXQgb2YKLSBJTVBPUlRTIGRpcmVjdGl2ZXMgaW4gdGhlIGRlZiBmaWxlLiAgUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgd2FzCi0gaGFuZGxlZCwgZmFsc2UgaWYgbm90LgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wZV9nZXQxNiAoYWJmZCwgd2hlcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHdoZXJlOwotewotICB1bnNpZ25lZCBjaGFyIGJbMl07Ci0gIGJmZF9zZWVrIChhYmZkLCB3aGVyZSwgU0VFS19TRVQpOwotICBiZmRfcmVhZCAoYiwgMSwgMiwgYWJmZCk7Ci0gIHJldHVybiBiWzBdICsgKGJbMV08PDgpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wZV9nZXQzMiAoYWJmZCwgd2hlcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHdoZXJlOwotewotICB1bnNpZ25lZCBjaGFyIGJbNF07Ci0gIGJmZF9zZWVrIChhYmZkLCB3aGVyZSwgU0VFS19TRVQpOwotICBiZmRfcmVhZCAoYiwgMSwgNCwgYWJmZCk7Ci0gIHJldHVybiBiWzBdICsgKGJbMV08PDgpICsgKGJbMl08PDE2KSArIChiWzNdPDwyNCk7Ci19Ci0KLSNpZiAwIC8qIFRoaXMgaXMgbm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotcGVfYXMxNiAocHRyKQotICAgICB2b2lkICpwdHI7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmIgPSBwdHI7Ci0gIHJldHVybiBiWzBdICsgKGJbMV08PDgpOwotfQotCi0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIGludAotcGVfYXMzMiAocHRyKQotICAgICB2b2lkICpwdHI7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmIgPSBwdHI7Ci0gIHJldHVybiBiWzBdICsgKGJbMV08PDgpICsgKGJbMl08PDE2KSArIChiWzNdPDwyNCk7Ci19Ci0KLWJvb2xlYW4KLXBlX2ltcGxpZWRfaW1wb3J0X2RsbCAoZmlsZW5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBiZmQgKmRsbDsKLSAgdW5zaWduZWQgbG9uZyBwZV9oZWFkZXJfb2Zmc2V0LCBvcHRoZHJfb2ZzLCBudW1fZW50cmllcywgaTsKLSAgdW5zaWduZWQgbG9uZyBleHBvcnRfcnZhLCBleHBvcnRfc2l6ZSwgbnNlY3Rpb25zLCBzZWNwdHIsIGV4cHB0cjsKLSAgdW5zaWduZWQgY2hhciAqZXhwZGF0YSwgKmVydmE7Ci0gIHVuc2lnbmVkIGxvbmcgbmFtZV9ydmFzLCBvcmRpbmFscywgbmV4cCwgb3JkYmFzZTsKLSAgY29uc3QgY2hhciAqZGxsX25hbWU7Ci0KLSAgLyogTm8sIEkgY2FuJ3QgdXNlIGJmZCBoZXJlLiAga2VybmVsMzIuZGxsIHB1dHMgaXRzIGV4cG9ydCB0YWJsZSBpbgotICAgICB0aGUgbWlkZGxlIG9mIHRoZSAucmRhdGEgc2VjdGlvbi4gKi8KLQotICBkbGwgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCBwZV9kZXRhaWxzLT50YXJnZXRfbmFtZSk7Ci0gIGlmICghZGxsKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVhvcGVuICVzOiAlc1xuIiwgZmlsZW5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIC8qIFBFSSBkbGxzIHNlZW0gdG8gYmUgYmZkX29iamVjdHMgKi8KLSAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChkbGwsIGJmZF9vYmplY3QpKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglczogdGhpcyBkb2Vzbid0IGFwcGVhciB0byBiZSBhIERMTFxuIiwgZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBkbGxfbmFtZSA9IGZpbGVuYW1lOwotICBmb3IgKGk9MDsgZmlsZW5hbWVbaV07IGkrKykKLSAgICBpZiAoZmlsZW5hbWVbaV0gPT0gJy8nIHx8IGZpbGVuYW1lW2ldID09ICdcXCcgfHwgZmlsZW5hbWVbaV0gPT0gJzonKQotICAgICAgZGxsX25hbWUgPSBmaWxlbmFtZSArIGkgKyAxOwotCi0gIHBlX2hlYWRlcl9vZmZzZXQgPSBwZV9nZXQzMiAoZGxsLCAweDNjKTsKLSAgb3B0aGRyX29mcyA9IHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMjA7Ci0gIG51bV9lbnRyaWVzID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDkyKTsKLSAgaWYgKG51bV9lbnRyaWVzIDwgMSkgLyogbm8gZXhwb3J0cyAqLwotICAgIHJldHVybiBmYWxzZTsKLSAgZXhwb3J0X3J2YSA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyA5Nik7Ci0gIGV4cG9ydF9zaXplID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDEwMCk7Ci0gIG5zZWN0aW9ucyA9IHBlX2dldDE2IChkbGwsIHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMik7Ci0gIHNlY3B0ciA9IChwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwICsKLQkgICAgcGVfZ2V0MTYgKGRsbCwgcGVfaGVhZGVyX29mZnNldCArIDQgKyAxNikpOwotICBleHBwdHIgPSAwOwotICBmb3IgKGk9MDsgaTxuc2VjdGlvbnM7IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIHNuYW1lWzhdOwotICAgICAgdW5zaWduZWQgbG9uZyBzZWNwdHIxID0gc2VjcHRyICsgNDAgKiBpOwotICAgICAgdW5zaWduZWQgbG9uZyB2YWRkciA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxMik7Ci0gICAgICB1bnNpZ25lZCBsb25nIHZzaXplID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDE2KTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgZnB0ciA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAyMCk7Ci0gICAgICBiZmRfc2VlayhkbGwsIHNlY3B0cjEsIFNFRUtfU0VUKTsKLSAgICAgIGJmZF9yZWFkKHNuYW1lLCAxLCA4LCBkbGwpOwotICAgICAgaWYgKHZhZGRyIDw9IGV4cG9ydF9ydmEgJiYgdmFkZHIrdnNpemUgPiBleHBvcnRfcnZhKQotCXsKLQkgIGV4cHB0ciA9IGZwdHIgKyAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKLQkgIGlmIChleHBvcnRfcnZhICsgZXhwb3J0X3NpemUgPiB2YWRkciArIHZzaXplKQotCSAgICBleHBvcnRfc2l6ZSA9IHZzaXplIC0gKGV4cG9ydF9ydmEgLSB2YWRkcik7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGV4cGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jIChleHBvcnRfc2l6ZSk7Ci0gIGJmZF9zZWVrIChkbGwsIGV4cHB0ciwgU0VFS19TRVQpOwotICBiZmRfcmVhZCAoZXhwZGF0YSwgMSwgZXhwb3J0X3NpemUsIGRsbCk7Ci0gIGVydmEgPSBleHBkYXRhIC0gZXhwb3J0X3J2YTsKLQotICBpZiAocGVfZGVmX2ZpbGUgPT0gMCkKLSAgICBwZV9kZWZfZmlsZSA9IGRlZl9maWxlX2VtcHR5KCk7Ci0KLSAgbmV4cCA9IHBlX2FzMzIgKGV4cGRhdGErMjQpOwotICBuYW1lX3J2YXMgPSBwZV9hczMyIChleHBkYXRhKzMyKTsKLSAgb3JkaW5hbHMgPSBwZV9hczMyIChleHBkYXRhKzM2KTsKLSAgb3JkYmFzZSA9IHBlX2FzMzIgKGV4cGRhdGErMTYpOwotICBmb3IgKGk9MDsgaTxuZXhwOyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBuYW1lX3J2YSA9IHBlX2FzMzIgKGVydmErbmFtZV9ydmFzK2kqNCk7Ci0gICAgICBkZWZfZmlsZV9pbXBvcnQgKmltcDsKLSAgICAgIGltcCA9IGRlZl9maWxlX2FkZF9pbXBvcnQgKHBlX2RlZl9maWxlLCBlcnZhK25hbWVfcnZhLCBkbGxfbmFtZSwKLQkJCQkgaSwgMCk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBUaGVzZSBhcmUgdGhlIG1haW4gZnVuY3Rpb25zLCBjYWxsZWQgZnJvbSB0aGUgZW11bGF0aW9uLiAgVGhlIGZpcnN0Ci0gaXMgY2FsbGVkIGFmdGVyIHRoZSBiZmRzIGFyZSByZWFkLCBzbyB3ZSBjYW4gZ3Vlc3MgYXQgaG93IG11Y2ggc3BhY2UKLSB3ZSBuZWVkLiAgVGhlIHNlY29uZCBpcyBjYWxsZWQgYWZ0ZXIgZXZlcnl0aGluZyBpcyBwbGFjZWQsIHNvIHdlCi0gY2FuIHB1dCB0aGUgcmlnaHQgdmFsdWVzIGluIHBsYWNlLgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1wZV9kbGxfYnVpbGRfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHBlX2RsbF9pZF90YXJnZXQgKGJmZF9nZXRfdGFyZ2V0IChhYmZkKSk7Ci0gIHByb2Nlc3NfZGVmX2ZpbGUgKGFiZmQsIGluZm8pOwotCi0gIGdlbmVyYXRlX2VkYXRhIChhYmZkLCBpbmZvKTsKLSAgYnVpbGRfZmlsbGVyX2JmZCAoMSk7Ci19Ci0KLXZvaWQKLXBlX2V4ZV9idWlsZF9zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBwZV9kbGxfaWRfdGFyZ2V0IChiZmRfZ2V0X3RhcmdldCAoYWJmZCkpOwotICBidWlsZF9maWxsZXJfYmZkICgwKTsKLX0KLQotdm9pZAotcGVfZGxsX2ZpbGxfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHBlX2RsbF9pZF90YXJnZXQgKGJmZF9nZXRfdGFyZ2V0IChhYmZkKSk7Ci0gIGltYWdlX2Jhc2UgPSBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQotICBnZW5lcmF0ZV9yZWxvYyAoYWJmZCwgaW5mbyk7Ci0gIGlmIChyZWxvY19zeiA+IDApCi0gICAgewotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGZpbGxlcl9iZmQsIHJlbG9jX3MsIHJlbG9jX3N6KTsKLQotICAgICAgLyogUmVzaXplIHRoZSBzZWN0aW9ucy4gICovCi0gICAgICBsYW5nX3NpemVfc2VjdGlvbnMgKHN0YXRfcHRyLT5oZWFkLCBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICZzdGF0X3B0ci0+aGVhZCwgMCwgKGJmZF92bWEpIDAsIGZhbHNlKTsKLQotICAgICAgLyogUmVkbyBzcGVjaWFsIHN0dWZmLiAgKi8KLSAgICAgIGxkZW11bF9hZnRlcl9hbGxvY2F0aW9uICgpOwotCi0gICAgICAvKiBEbyB0aGUgYXNzaWdubWVudHMgYWdhaW4uICAqLwotICAgICAgbGFuZ19kb19hc3NpZ25tZW50cyAoc3RhdF9wdHItPmhlYWQsCi0JCQkgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICAoZmlsbF90eXBlKSAwLCAoYmZkX3ZtYSkgMCk7Ci0gICAgfQotCi0gIGZpbGxfZWRhdGEgKGFiZmQsIGluZm8pOwotCi0gIHBlX2RhdGEgKGFiZmQpLT5kbGwgPSAxOwotCi0gIGVkYXRhX3MtPmNvbnRlbnRzID0gZWRhdGFfZDsKLSAgcmVsb2Nfcy0+Y29udGVudHMgPSByZWxvY19kOwotfQotCi12b2lkCi1wZV9leGVfZmlsbF9zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcGVfZGxsX2lkX3RhcmdldCAoYmZkX2dldF90YXJnZXQgKGFiZmQpKTsKLSAgaW1hZ2VfYmFzZSA9IHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCi0gIGdlbmVyYXRlX3JlbG9jIChhYmZkLCBpbmZvKTsKLSAgaWYgKHJlbG9jX3N6ID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoZmlsbGVyX2JmZCwgcmVsb2NfcywgcmVsb2Nfc3opOwotCi0gICAgICAvKiBSZXNpemUgdGhlIHNlY3Rpb25zLiAgKi8KLSAgICAgIGxhbmdfc2l6ZV9zZWN0aW9ucyAoc3RhdF9wdHItPmhlYWQsIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgJnN0YXRfcHRyLT5oZWFkLCAwLCAoYmZkX3ZtYSkgMCwgZmFsc2UpOwotCi0gICAgICAvKiBSZWRvIHNwZWNpYWwgc3R1ZmYuICAqLwotICAgICAgbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24gKCk7Ci0KLSAgICAgIC8qIERvIHRoZSBhc3NpZ25tZW50cyBhZ2Fpbi4gICovCi0gICAgICBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzdGF0X3B0ci0+aGVhZCwKLQkJCSAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgIChmaWxsX3R5cGUpIDAsIChiZmRfdm1hKSAwKTsKLSAgICB9Ci0gIHJlbG9jX3MtPmNvbnRlbnRzID0gcmVsb2NfZDsKLX0KZGlmZiAtLWdpdCBhL2xkL3BlLWRsbC5oIGIvbGQvcGUtZGxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2EzNzguLjAwMDAwMDAKLS0tIGEvbGQvcGUtZGxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBwZS1kbGwuaDogSGVhZGVyIGZpbGUgZm9yIHJvdXRpbmVzIHVzZWQgdG8gYnVpbGQgV2luZG93cyBETExzLgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFBFX0RMTF9ICi0jZGVmaW5lIFBFX0RMTF9ICi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZGVmZmlsZS5oIgotCi1leHRlcm4gZGVmX2ZpbGUgKnBlX2RlZl9maWxlOwotZXh0ZXJuIGludCBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmc7Ci1leHRlcm4gaW50IHBlX2RsbF9kb19kZWZhdWx0X2V4Y2x1ZGVzOwotZXh0ZXJuIGludCBwZV9kbGxfa2lsbF9hdHM7Ci1leHRlcm4gaW50IHBlX2RsbF9zdGRjYWxsX2FsaWFzZXM7Ci0KLWV4dGVybiB2b2lkIHBlX2RsbF9pZF90YXJnZXQgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBwZV9kbGxfYWRkX2V4Y2x1ZGVzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgcGVfZGxsX2dlbmVyYXRlX2RlZl9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgcGVfZGxsX2dlbmVyYXRlX2ltcGxpYiBQQVJBTVMgKChkZWZfZmlsZSAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIHBlX2ltcGxpZWRfaW1wb3J0X2RsbCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHBlX2RsbF9idWlsZF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIHZvaWQgcGVfZXhlX2J1aWxkX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBwZV9kbGxfZmlsbF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIHZvaWQgcGVfZXhlX2ZpbGxfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotI2VuZGlmIC8qIFBFX0RMTF9IICovCmRpZmYgLS1naXQgYS9sZC9wby9NYWtlLWluIGIvbGQvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5MTA5MC4uMDAwMDAwMAotLS0gYS9sZC9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtQyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2xkL3BvL1BPVEZJTEVTLmluIGIvbGQvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYTBjOGUuLjAwMDAwMDAKLS0tIGEvbGQvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1kZWZmaWxlLmgKLWVtdWx0ZW1wbC9hcm1jb2ZmLmVtCi1lbXVsdGVtcGwvcGUuZW0KLWxkLmgKLWxkY3JlZi5jCi1sZGN0b3IuYwotbGRjdG9yLmgKLWxkZW11bC5jCi1sZGVtdWwuaAotbGRleHAuYwotbGRleHAuaAotbGRmaWxlLmMKLWxkZmlsZS5oCi1sZGxhbmcuYwotbGRsYW5nLmgKLWxkbGV4LmgKLWxkbWFpbi5jCi1sZG1haW4uaAotbGRtaXNjLmMKLWxkbWlzYy5oCi1sZHZlci5jCi1sZHZlci5oCi1sZHdyaXRlLmMKLWxkd3JpdGUuaAotbGV4c3VwLmMKLW1yaS5jCi1tcmkuaAotcGUtZGxsLmMKZGlmZiAtLWdpdCBhL2xkL3BvL2xkLnBvdCBiL2xkL3BvL2xkLnBvdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwMzRjZS4uMDAwMDAwMAotLS0gYS9sZC9wby9sZC5wb3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDI1ICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk5LTA2LTAzIDAzOjExLTA3MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBlbXVsdGVtcGwvYXJtY29mZi5lbTo2NQotbXNnaWQgIiAgLS1zdXBwb3J0LW9sZC1jb2RlICAgU3VwcG9ydCBpbnRlcndvcmtpbmcgd2l0aCBvbGQgY29kZVxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOjEzMAotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToxOTgKLW1zZ2lkICIiCi0iICAtLWJhc2VfZmlsZSA8YmFzZWZpbGU+ICAgICAgICAgICAgIEdlbmVyYXRlIGEgYmFzZSBmaWxlIGZvciByZWxvY2F0YWJsZSAiCi0iRExMc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToxOTkKLW1zZ2lkICIiCi0iICAtLWRsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBpbWFnZSBiYXNlIHRvIHRoZSBkZWZhdWx0IGZvciBETExzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwMAotbXNnaWQgIiAgLS1maWxlLWFsaWdubWVudCA8c2l6ZT4gICAgICAgICAgICBTZXQgZmlsZSBhbGlnbm1lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjAxCi1tc2dpZCAiICAtLWhlYXAgPHNpemU+ICAgICAgICAgICAgICAgICAgICAgIFNldCBpbml0aWFsIHNpemUgb2YgdGhlIGhlYXBcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjAyCi1tc2dpZCAiIgotIiAgLS1pbWFnZS1iYXNlIDxhZGRyZXNzPiAgICAgICAgICAgICBTZXQgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZXhlY3V0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDMKLW1zZ2lkICIiCi0iICAtLW1ham9yLWltYWdlLXZlcnNpb24gPG51bWJlcj4gICAgIFNldCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZXhlY3V0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDQKLW1zZ2lkICIgIC0tbWFqb3Itb3MtdmVyc2lvbiA8bnVtYmVyPiAgICAgICAgU2V0IG1pbmltdW0gcmVxdWlyZWQgT1MgdmVyc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDUKLW1zZ2lkICIiCi0iICAtLW1ham9yLXN1YnN5c3RlbS12ZXJzaW9uIDxudW1iZXI+IFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHN1YnN5c3RlbSAiCi0idmVyc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDYKLW1zZ2lkICIiCi0iICAtLW1pbm9yLWltYWdlLXZlcnNpb24gPG51bWJlcj4gICAgIFNldCByZXZpc2lvbiBudW1iZXIgb2YgdGhlIGV4ZWN1dGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjA3Ci1tc2dpZCAiICAtLW1pbm9yLW9zLXZlcnNpb24gPG51bWJlcj4gICAgICAgIFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHJldmlzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwOAotbXNnaWQgIiIKLSIgIC0tbWlub3Itc3Vic3lzdGVtLXZlcnNpb24gPG51bWJlcj4gU2V0IG1pbmltdW0gcmVxdWlyZWQgT1Mgc3Vic3lzdGVtICIKLSJyZXZpc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDkKLW1zZ2lkICIgIC0tc2VjdGlvbi1hbGlnbm1lbnQgPHNpemU+ICAgICAgICAgU2V0IHNlY3Rpb24gYWxpZ25tZW50XG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxMAotbXNnaWQgIiAgLS1zdGFjayA8c2l6ZT4gICAgICAgICAgICAgICAgICAgICBTZXQgc2l6ZSBvZiB0aGUgaW5pdGlhbCBzdGFja1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTEKLW1zZ2lkICIiCi0iICAtLXN1YnN5c3RlbSA8bmFtZT5bOjx2ZXJzaW9uPl0gICAgIFNldCByZXF1aXJlZCBPUyBzdWJzeXN0ZW0gWyYgdmVyc2lvbl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjEyCi1tc2dpZCAiIgotIiAgLS1zdXBwb3J0LW9sZC1jb2RlICAgICAgICAgICAgICAgICBTdXBwb3J0IGludGVyd29ya2luZyB3aXRoIG9sZCBjb2RlXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxNAotbXNnaWQgIiIKLSIgIC0tYWRkLXN0ZGNhbGwtYWxpYXMgICAgICAgICAgICAgICAgRXhwb3J0IHN5bWJvbHMgd2l0aCBhbmQgd2l0aG91dCBAbm5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjE1Ci1tc2dpZCAiICAtLWRpc2FibGUtc3RkY2FsbC1maXh1cCAgICAgICAgICAgIERvbid0IGxpbmsgX3N5bSB0byBfc3ltQG5uXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxNgotbXNnaWQgIiIKLSIgIC0tZW5hYmxlLXN0ZGNhbGwtZml4dXAgICAgICAgICAgICAgTGluayBfc3ltIHRvIF9zeW1Abm4gd2l0aG91dCB3YXJuaW5nc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTcKLW1zZ2lkICIiCi0iICAtLWV4Y2x1ZGUtc3ltYm9scyBzeW0sc3ltLC4uLiAgICAgIEV4Y2x1ZGUgc3ltYm9scyBmcm9tIGF1dG9tYXRpYyBleHBvcnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjE4Ci1tc2dpZCAiIgotIiAgLS1leHBvcnQtYWxsLXN5bWJvbHMgICAgICAgICAgICAgICBBdXRvbWF0aWNhbGx5IGV4cG9ydCBhbGwgZ2xvYmFscyB0byAiCi0iRExMXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxOQotbXNnaWQgIiAgLS1raWxsLWF0ICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgQG5uIGZyb20gZXhwb3J0ZWQgc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMjAKLW1zZ2lkICIgIC0tb3V0LWltcGxpYiA8ZmlsZT4gICAgICAgICAgICAgICAgR2VuZXJhdGUgaW1wb3J0IGxpYnJhcnlcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjIxCi1tc2dpZCAiIgotIiAgLS1vdXRwdXQtZGVmIDxmaWxlPiAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhIC5ERUYgZmlsZSBmb3IgdGhlIGJ1aWx0IERMTFxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyODQKLW1zZ2lkICIlUDogd2FybmluZzogYmFkIHZlcnNpb24gbnVtYmVyIGluIC1zdWJzeXN0ZW0gb3B0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjMwMAotbXNnaWQgIiVQJUY6IGludmFsaWQgc3Vic3lzdGVtIHR5cGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MzE1Ci1tc2dpZCAiJVAlRjogaW52YWxpZCBoZXggbnVtYmVyIGZvciBQRSBwYXJhbWV0ZXIgJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTozMzMKLW1zZ2lkICIlUCVGOiBzdHJhbmdlIGhleCBpbmZvIGZvciBQRSBwYXJhbWV0ZXIgJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTozNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IG9wZW4gYmFzZSBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjUwNQotbXNnaWQgIiVQOiB3YXJuaW5nLCBmaWxlIGFsaWdubWVudCA+IHNlY3Rpb24gYWxpZ25tZW50LlxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTo1NzUgZW11bHRlbXBsL3BlLmVtOjYwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiByZXNvbHZpbmcgJXMgYnkgbGlua2luZyB0byAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTo1ODAgZW11bHRlbXBsL3BlLmVtOjYwNgotbXNnaWQgIlVzZSAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwIHRvIGRpc2FibGUgdGhlc2Ugd2FybmluZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NTgxIGVtdWx0ZW1wbC9wZS5lbTo2MDcKLW1zZ2lkICJVc2UgLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSBmaXh1cHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NjIzCi1tc2dpZCAiJUYlUDogUEUgb3BlcmF0aW9ucyBvbiBub24gUEUgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NzQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMgZm9yIGludGVyd29ya2luZyIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06ODAyIGxkbGFuZy5jOjE2NTcgbGRsYW5nLmM6MzkzNCBsZGxhbmcuYzozOTY4IGxkbWFpbi5jOjk5MgotbXNnaWQgIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoxNjIKLW1zZ2lkICIlWCVQOiBiZmRfaGFzaF90YWJsZV9pbml0IG9mIGNyZWYgdGFibGUgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjE2OAotbXNnaWQgIiVYJVA6IGNyZWZfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjIzOQotbXNnaWQgIiIKLSJcbiIKLSJDcm9zcyBSZWZlcmVuY2UgVGFibGVcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoyNDAKLW1zZ2lkICJTeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MjQ4Ci1tc2dpZCAiRmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjI1MgotbXNnaWQgIk5vIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzozNjkKLW1zZ2lkICIlUDogc3ltYm9sIGAlVCcgbWlzc2luZyBmcm9tIG1haW4gaGFzaCB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjQ0MQotbXNnaWQgIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM7ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6NDQ1IGxkbWFpbi5jOjEwNjAgbGRtYWluLmM6MTA2NAotbXNnaWQgIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6NTE3IGxkY3JlZi5jOjUyNCBsZG1haW4uYzoxMTEwIGxkbWFpbi5jOjExMTcKLW1zZ2lkICIlQiVGOiBjb3VsZCBub3QgcmVhZCByZWxvY3M6ICVFXG4iCi1tc2dzdHIgIiIKLQotIy4gV2UgZm91bmQgYSByZWxvYyBmb3IgdGhlIHN5bWJvbC4gIFRoZSBzeW1ib2wgaXMgZGVmaW5lZAotIy4gaW4gT1VUU0VDTkFNRS4gIFRoaXMgcmVsb2MgaXMgZnJvbSBhIHNlY3Rpb24gd2hpY2ggaXMKLSMuIG1hcHBlZCBpbnRvIGEgc2VjdGlvbiBmcm9tIHdoaWNoIHJlZmVyZW5jZXMgdG8gT1VUU0VDTkFNRQotIy4gYXJlIHByb2hpYml0ZWQuICBXZSBtdXN0IHJlcG9ydCBhbiBlcnJvci4KLSM6IGxkY3JlZi5jOjU0MgotbXNnaWQgIiVYJUM6IHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlIGZyb20gJXMgdG8gYCVUJyBpbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkY3Rvci5jOjg5Ci1tc2dpZCAiJVAlWDogRGlmZmVyZW50IHJlbG9jcyB1c2VkIGluIHNldCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkY3Rvci5jOjEwNgotbXNnaWQgIiVQJVg6IERpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzIGNvbXBvc2luZyBzZXQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGN0b3IuYzoyODggbGRjdG9yLmM6MzAyCi1tc2dpZCAiJVAlWDogJXMgZG9lcyBub3Qgc3VwcG9ydCByZWxvYyAlcyBmb3Igc2V0ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjdG9yLmM6MzIzCi1tc2dpZCAiJVAlWDogVW5zdXBwb3J0ZWQgc2l6ZSAlZCBmb3Igc2V0ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjdG9yLmM6MzQ0Ci1tc2dpZCAiIgotIlxuIgotIlNldCAgICAgICAgICAgICAgICAgU3ltYm9sXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbGRlbXVsLmM6MjIzCi1tc2dpZCAiJVMgU1lTTElCIGlnbm9yZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGVtdWwuYzoyMzEKLW1zZ2lkICIlUyBITEwgaWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZW11bC5jOjI1MgotbXNnaWQgIiVQOiB1bnJlY29nbmlzZWQgZW11bGF0aW9uIG1vZGU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRlbXVsLmM6MjUzCi1tc2dpZCAiU3VwcG9ydGVkIGVtdWxhdGlvbnM6ICIKLW1zZ3N0ciAiIgotCi0jOiBsZGVtdWwuYzoyOTcKLW1zZ2lkICIgIG5vIGVtdWxhdGlvbiBzcGVjaWZpYyBvcHRpb25zLlxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6MTU2Ci1tc2dpZCAiJUYlUDogJXMgdXNlcyB1bmRlZmluZWQgc2VjdGlvbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6MTU4Ci1tc2dpZCAiJUYlUDogJXMgZm9yd2FyZCByZWZlcmVuY2Ugb2Ygc2VjdGlvbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6MjcwCi1tc2dpZCAiJUYlUyAlJSBieSB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzoyNzcKLW1zZ2lkICIlRiVTIC8gYnkgemVyb1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6NDAwCi1tc2dpZCAiJVglUzogdW5yZXNvbHZhYmxlIHN5bWJvbCBgJXMnIHJlZmVyZW5jZWQgaW4gZXhwcmVzc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6NDE5Ci1tc2dpZCAiJUYlUzogdW5kZWZpbmVkIHN5bWJvbCBgJXMnIHJlZmVyZW5jZWQgaW4gZXhwcmVzc2lvblxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6NjAwCi1tc2dpZCAiJUYlUyBjYW4gbm90IFBST1ZJREUgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzo2MTAKLW1zZ2lkICIlRiVTIGludmFsaWQgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzo2MTQKLW1zZ2lkICIlRiVTIGFzc2lnbm1lbnQgdG8gbG9jYXRpb24gY291bnRlciBpbnZhbGlkIG91dHNpZGUgb2YgU0VDVElPTlxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6NjI0Ci1tc2dpZCAiJUYlUyBjYW5ub3QgbW92ZSBsb2NhdGlvbiBjb3VudGVyIGJhY2t3YXJkcyAoZnJvbSAlViB0byAlVilcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjY1MgotbXNnaWQgIiVQJUY6JXM6IGhhc2ggY3JlYXRpb24gZmFpbGVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzo5NDkKLW1zZ2lkICIlRiVTIG5vbmNvbnN0YW50IGV4cHJlc3Npb24gZm9yICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzo5ODIKLW1zZ2lkICIlRiVTIG5vbiBjb25zdGFudCBleHByZXNzaW9uIGZvciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjEwOQotIywgYy1mb3JtYXQKLW1zZ2lkICJhdHRlbXB0IHRvIG9wZW4gJXMgZmFpbGVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MTExCi0jLCBjLWZvcm1hdAotbXNnaWQgImF0dGVtcHQgdG8gb3BlbiAlcyBzdWNjZWVkZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoxMTkKLW1zZ2lkICIlRiVQOiBpbnZhbGlkIEJGRCB0YXJnZXQgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjIwNAotbXNnaWQgIiVGJVA6IGNhbm5vdCBvcGVuICVzIGZvciAlczogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoyMDcKLW1zZ2lkICIlRiVQOiBjYW5ub3Qgb3BlbiAlczogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoyMjUKLW1zZ2lkICIlRiVQOiBjYW5ub3QgZmluZCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjI0MyBsZGZpbGUuYzoyNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IGZpbmQgc2NyaXB0IGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoyNDUgbGRmaWxlLmM6MjYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZW5lZCBzY3JpcHQgZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjMwMwotbXNnaWQgIiVQJUY6IGNhbm5vdCBvcGVuIGxpbmtlciBzY3JpcHQgZmlsZSAlczogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzozNDQKLW1zZ2lkICIlUCVGOiB1bmtub3duIGFyY2hpdGVjdHVyZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzozNjEKLW1zZ2lkICIlUCVGOiB0YXJnZXQgYXJjaGl0ZWN0dXJlIHJlc3BlY2lmaWVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6NDE0Ci1tc2dpZCAiJVAlRjogY2Fubm90IHJlcHJlc2VudCBtYWNoaW5lIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo3MjMKLW1zZ2lkICIiCi0iXG4iCi0iTWVtb3J5IENvbmZpZ3VyYXRpb25cbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo3MjUKLW1zZ2lkICJOYW1lIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjcyNQotbXNnaWQgIk9yaWdpbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo3MjUKLW1zZ2lkICJMZW5ndGgiCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzI1Ci1tc2dpZCAiQXR0cmlidXRlcyIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo3NjcKLW1zZ2lkICIiCi0iXG4iCi0iTGlua2VyIHNjcmlwdCBhbmQgbWVtb3J5IG1hcFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjc4NAotbXNnaWQgIiVQJUY6IElsbGVnYWwgdXNlIG9mIGAlcycgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo3OTQKLW1zZ2lkICIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo5MTUKLW1zZ2lkICIlUDogJUI6IHdhcm5pbmc6IGlnbm9yaW5nIGR1cGxpY2F0ZSBzZWN0aW9uIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo5MjkKLW1zZ2lkICIlUDogJUI6IHdhcm5pbmc6IGR1cGxpY2F0ZSBzZWN0aW9uIGAlcycgaGFzIGRpZmZlcmVudCBzaXplXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTMyMAotbXNnaWQgIiVCOiBmaWxlIG5vdCByZWNvZ25pemVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjEzMjEKLW1zZ2lkICIlQjogbWF0Y2hpbmcgZm9ybWF0czoiCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTMyOAotbXNnaWQgIiVGJUI6IGZpbGUgbm90IHJlY29nbml6ZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTM4MQotbXNnaWQgIiVGJUI6IG9iamVjdCAlQiBpbiBhcmNoaXZlIGlzIG5vdCBvYmplY3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxMzg3IGxkbGFuZy5jOjEzOTkKLW1zZ2lkICIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE0NTIKLW1zZ2lkICIlUCVGOiB0YXJnZXQgJXMgbm90IGZvdW5kXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTQ1NAotbXNnaWQgIiVQJUY6IGNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE0NjIKLW1zZ2lkICIlUCVGOiVzOiBjYW4gbm90IG1ha2Ugb2JqZWN0IGZpbGU6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTQ2NgotbXNnaWQgIiVQJUY6JXM6IGNhbiBub3Qgc2V0IGFyY2hpdGVjdHVyZTogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNDcwCi1tc2dpZCAiJVAlRjogY2FuIG5vdCBjcmVhdGUgbGluayBoYXNoIHRhYmxlOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE3ODAKLW1zZ2lkICIgbG9hZCBhZGRyZXNzIDB4JVYiCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTkwOQotbXNnaWQgIiVXIChzaXplIGJlZm9yZSByZWxheGluZylcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxOTg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFkZHJlc3Mgb2Ygc2VjdGlvbiAlcyBzZXQgdG8gIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjIxMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRmFpbCB3aXRoICVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjM1NwotbXNnaWQgIiVYJVA6IHNlY3Rpb24gJXMgWyVWIC0+ICVWXSBvdmVybGFwcyBzZWN0aW9uICVzIFslViAtPiAlVl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyNDA4Ci1tc2dpZCAiJVAlWDogSW50ZXJuYWwgZXJyb3Igb24gQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjQ0OQotbXNnaWQgIiVQOiB3YXJuaW5nOiBubyBtZW1vcnkgcmVnaW9uIHNwZWNpZmllZCBmb3Igc2VjdGlvbiBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjQ2MgotbXNnaWQgIiVQOiB3YXJuaW5nOiBjaGFuZ2luZyBzdGFydCBvZiBzZWN0aW9uICVzIGJ5ICV1IGJ5dGVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjQ3NgotbXNnaWQgIiVGJVM6IG5vbiBjb25zdGFudCBhZGRyZXNzIGV4cHJlc3Npb24gZm9yIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyNTI4Ci1tc2dpZCAiJVglUDogYWRkcmVzcyAweCV2IG9mICVCIHNlY3Rpb24gJXMgaXMgbm90IHdpdGhpbiByZWdpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyNTM2Ci1tc2dpZCAiJVglUDogcmVnaW9uICVzIGlzIGZ1bGwgKCVCIHNlY3Rpb24gJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjYzOAotbXNnaWQgIiVQJUY6IGNhbid0IHJlbGF4IHNlY3Rpb246ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Mjc5OQotbXNnaWQgIiVGJVA6IGludmFsaWQgZGF0YSBzdGF0ZW1lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyODI4Ci1tc2dpZCAiJUYlUDogaW52YWxpZCByZWxvYyBzdGF0ZW1lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyOTYyCi1tc2dpZCAiJVAlRjolczogY2FuJ3Qgc2V0IHN0YXJ0IGFkZHJlc3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyOTc1IGxkbGFuZy5jOjI5OTIKLW1zZ2lkICIlUCVGOiBjYW4ndCBzZXQgc3RhcnQgYWRkcmVzc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI5ODcKLW1zZ2lkICIlUDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICVzOyBkZWZhdWx0aW5nIHRvICVWXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Mjk5NwotbXNnaWQgIiVQOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2wgJXM7IG5vdCBzZXR0aW5nIHN0YXJ0IGFkZHJlc3NcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzozMDM5Ci1tc2dpZCAiIgotIiVQOiB3YXJuaW5nOiAlcyBhcmNoaXRlY3R1cmUgb2YgaW5wdXQgZmlsZSBgJUInIGlzIGluY29tcGF0aWJsZSB3aXRoICVzICIKLSJvdXRwdXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzozMDU3Ci1tc2dpZCAiJUUlWDogZmFpbGVkIHRvIG1lcmdlIHRhcmdldCBzcGVjaWZpYyBkYXRhIG9mIGZpbGUgJUJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzozMTQyCi1tc2dpZCAiIgotIlxuIgotIkFsbG9jYXRpbmcgY29tbW9uIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzozMTQzCi1tc2dpZCAiIgotIkNvbW1vbiBzeW1ib2wgICAgICAgc2l6ZSAgICAgICAgICAgICAgZmlsZVxuIgotIlxuIgotbXNnc3RyICIiCi0KLSMuIFRoaXMgbWVzc2FnZSBoYXBwZW5zIHdoZW4gdXNpbmcgdGhlCi0jLiBzdnIzLmlmaWxlIGxpbmtlciBzY3JpcHQsIHNvIEkgaGF2ZQotIy4gZGlzYWJsZWQgaXQuCi0jOiBsZGxhbmcuYzozMjMyCi1tc2dpZCAiJVA6IG5vIFtDT01NT05dIGNvbW1hbmQsIGRlZmF1bHRpbmcgdG8gLmJzc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjMyOTUKLW1zZ2lkICIlUCVGOiBpbnZhbGlkIHN5bnRheCBpbiBmbGFnc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjM4OTEKLW1zZ2lkICIlUCVGbXVsdGlwbGUgU1RBUlRVUCBmaWxlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjQxNTMKLW1zZ2lkICIlRiVQOiBiZmRfcmVjb3JkX3BoZHIgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjQxNzIKLW1zZ2lkICIlWCVQOiBzZWN0aW9uIGAlcycgYXNzaWduZWQgdG8gbm9uLWV4aXN0ZW50IHBoZHIgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjQ0NzEKLW1zZ2lkICIlWCVQOiB1bmtub3duIGxhbmd1YWdlIGAlcycgaW4gdmVyc2lvbiBpbmZvcm1hdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjQ1MjAKLW1zZ2lkICIlWCVQOiBkdXBsaWNhdGUgdmVyc2lvbiB0YWcgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjQ1MzMgbGRsYW5nLmM6NDU0NgotbXNnaWQgIiVYJVA6IGR1cGxpY2F0ZSBleHByZXNzaW9uIGAlcycgaW4gdmVyc2lvbiBpbmZvcm1hdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjQ1ODMKLW1zZ2lkICIlWCVQOiB1bmFibGUgdG8gZmluZCB2ZXJzaW9uIGRlcGVuZGVuY3kgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjQ2MDUKLW1zZ2lkICIlWCVQOiB1bmFibGUgdG8gcmVhZCAuZXhwb3J0cyBzZWN0aW9uIGNvbnRlbnRzIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjE5MgotbXNnaWQgIiVYJVA6IGNhbid0IHNldCBCRkQgZGVmYXVsdCB0YXJnZXQgdG8gYCVzJzogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoyNTgKLW1zZ2lkICIlUCVGOiAtciBhbmQgLS1tcGM4NjBjMCBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoyNjAKLW1zZ2lkICIlUCVGOiAtLXJlbGF4IGFuZCAtciBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoyNjIKLW1zZ2lkICIlUCVGOiAtciBhbmQgLXNoYXJlZCBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoyOTEKLW1zZ2lkICJ1c2luZyBpbnRlcm5hbCBsaW5rZXIgc2NyaXB0OlxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjMxMAotbXNnaWQgIiVQJUY6IG5vIGlucHV0IGZpbGVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MzE1Ci1tc2dpZCAiJVA6IG1vZGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzozMzMKLW1zZ2lkICIlUCVGOiBjYW5ub3Qgb3BlbiBtYXAgZmlsZSAlczogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzozNzkKLW1zZ2lkICIlUDogbGluayBlcnJvcnMgZm91bmQsIGRlbGV0aW5nIGV4ZWN1dGFibGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjM5MAotbXNnaWQgIiVGJUI6IGZpbmFsIGNsb3NlIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo0MTQKLW1zZ2lkICIlWCVQOiB1bmFibGUgdG8gb3BlbiBmb3Igc291cmNlIG9mIGNvcHkgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjQxNgotbXNnaWQgIiVYJVA6IHVuYWJsZSB0byBvcGVuIGZvciBkZXN0aW5hdGlvbiBvZiBjb3B5IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo0MjIKLW1zZ2lkICIlUDogRXJyb3Igd3JpdGluZyBmaWxlIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo0MjggcGUtZGxsLmM6OTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVQOiBFcnJvciBjbG9zaW5nIGZpbGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjQ0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdG90YWwgdGltZSBpbiBsaW5rOiAlbGQuJTA2bGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo0NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGRhdGEgc2l6ZSAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo0ODkKLW1zZ2lkICIlUCVGOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC1tXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NjAzIGxkbWFpbi5jOjYyNCBsZG1haW4uYzo2NTUKLW1zZ2lkICIlUCVGOiBiZmRfaGFzaF90YWJsZV9pbml0IGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo2MDggbGRtYWluLmM6NjI3Ci1tc2dpZCAiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo2NDIKLW1zZ2lkICIlWCVQOiBlcnJvcjogZHVwbGljYXRlIHJldGFpbi1zeW1ib2xzLWZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo2ODYKLW1zZ2lkICIlUCVGOiBiZmRfaGFzaF9sb29rdXAgZm9yIGluc2VydGlvbiBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NjkxCi1tc2dpZCAiJVA6IGAtcmV0YWluLXN5bWJvbHMtZmlsZScgb3ZlcnJpZGVzIGAtcycgYW5kIGAtUydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo3NjgKLW1zZ2lkICJBcmNoaXZlIG1lbWJlciBpbmNsdWRlZCIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo3NjkKLW1zZ2lkICJiZWNhdXNlIG9mIGZpbGUgKHN5bWJvbCkiCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODQxCi1tc2dpZCAiJVglQzogbXVsdGlwbGUgZGVmaW5pdGlvbiBvZiBgJVQnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODQ0Ci1tc2dpZCAiJUQ6IGZpcnN0IGRlZmluZWQgaGVyZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg3MwotbXNnaWQgIiVCOiB3YXJuaW5nOiBkZWZpbml0aW9uIG9mIGAlVCcgb3ZlcnJpZGluZyBjb21tb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4NzYKLW1zZ2lkICIlQjogd2FybmluZzogY29tbW9uIGlzIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4ODMKLW1zZ2lkICIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGRlbiBieSBkZWZpbml0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODg2Ci1tc2dpZCAiJUI6IHdhcm5pbmc6IGRlZmluZWQgaGVyZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg5MwotbXNnaWQgIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkZGVuIGJ5IGxhcmdlciBjb21tb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4OTYKLW1zZ2lkICIlQjogd2FybmluZzogbGFyZ2VyIGNvbW1vbiBpcyBoZXJlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6OTAwCi1tc2dpZCAiJUI6IHdhcm5pbmc6IGNvbW1vbiBvZiBgJVQnIG92ZXJyaWRpbmcgc21hbGxlciBjb21tb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo5MDMKLW1zZ2lkICIlQjogd2FybmluZzogc21hbGxlciBjb21tb24gaXMgaGVyZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjkwNwotbXNnaWQgIiVCOiB3YXJuaW5nOiBtdWx0aXBsZSBjb21tb24gb2YgYCVUJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjkwOQotbXNnaWQgIiVCOiB3YXJuaW5nOiBwcmV2aW91cyBjb21tb24gaXMgaGVyZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjkzMSBsZG1haW4uYzo5NzAKLW1zZ2lkICIlUDogd2FybmluZzogZ2xvYmFsIGNvbnN0cnVjdG9yICVzIHVzZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo5ODAKLW1zZ2lkICIlUCVGOiBCRkQgYmFja2VuZCBlcnJvcjogQkZEX1JFTE9DX0NUT1IgdW5zdXBwb3J0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMTY2Ci1tc2dpZCAiJUYlUDogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTE3MwotbXNnaWQgIiVGJVA6IGJmZF9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTE5MgotbXNnaWQgIiVYJUM6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYCVUJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjExOTUKLW1zZ2lkICIlRDogbW9yZSB1bmRlZmluZWQgcmVmZXJlbmNlcyB0byBgJVQnIGZvbGxvd1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjEyMDEKLW1zZ2lkICIlWCVCOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGAlVCdcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMjA0Ci1tc2dpZCAiJUI6IG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gYCVUJyBmb2xsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMjI1IGxkbWFpbi5jOjEyNDcgbGRtYWluLmM6MTI2NwotbXNnaWQgIiVQJVg6IGdlbmVyYXRlZCIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMjI4Ci1tc2dpZCAiIHJlbG9jYXRpb24gdHJ1bmNhdGVkIHRvIGZpdDogJXMgJVQiCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTI1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJkYW5nZXJvdXMgcmVsb2NhdGlvbjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMjcwCi1tc2dpZCAiIHJlbG9jIHJlZmVycyB0byBzeW1ib2wgYCVUJyB3aGljaCBpcyBub3QgYmVpbmcgb3V0cHV0XG4iCi1tc2dzdHIgIiIKLQotIzogbGRtaXNjLmM6MTc4Ci1tc2dpZCAibm8gc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGxkbWlzYy5jOjI0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJidWlsdCBpbiBsaW5rZXIgc2NyaXB0OiV1IgotbXNnc3RyICIiCi0KLSM6IGxkbWlzYy5jOjI5MiBsZG1pc2MuYzoyOTYKLW1zZ2lkICIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIy4gV2UgdXNlIGFiZmQtPmZpbGVuYW1lIGluIHRoaXMgaW5pdGlhbCBsaW5lLAotIy4gaW4gY2FzZSBmaWxlbmFtZSBpcyBhIC5oIGZpbGUgb3Igc29tZXRoaW5nCi0jLiBzaW1pbGFybHkgdW5oZWxwZnVsLgotIzogbGRtaXNjLmM6MzMyCi1tc2dpZCAiJUI6IEluIGZ1bmN0aW9uIGAlVCc6XG4iCi1tc2dzdHIgIiIKLQotIzogbGRtaXNjLmM6NDY0Ci1tc2dpZCAiJUYlUDogaW50ZXJuYWwgZXJyb3IgJXMgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZHZlci5jOjM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkdOVSBsZCB2ZXJzaW9uICVzICh3aXRoIEJGRCAlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZHZlci5jOjQyIGxleHN1cC5jOjg3MgotbXNnaWQgIiAgU3VwcG9ydGVkIGVtdWxhdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogbGR3cml0ZS5jOjU5IGxkd3JpdGUuYzoxOTUKLW1zZ2lkICIlUCVGOiBiZmRfbmV3X2xpbmtfb3JkZXIgZmFpbGVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGR3cml0ZS5jOjM2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlOHggc29tZXRoaW5nIGVsc2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZHdyaXRlLmM6NTI2Ci1tc2dpZCAiJUYlUDogZmluYWwgbGluayBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTUyIGxleHN1cC5jOjIzNSBsZXhzdXAuYzoyNDEKLW1zZ2lkICJLRVlXT1JEIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1MgotbXNnaWQgIlNoYXJlZCBsaWJyYXJ5IGNvbnRyb2wgZm9yIEhQL1VYIGNvbXBhdGliaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTU1Ci1tc2dpZCAiQVJDSCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNTUKLW1zZ2lkICJTZXQgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1NyBsZXhzdXAuYzozMDAKLW1zZ2lkICJUQVJHRVQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTU3Ci1tc2dpZCAiU3BlY2lmeSB0YXJnZXQgZm9yIGZvbGxvd2luZyBpbnB1dCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNTkgbGV4c3VwLmM6MTk4IGxleHN1cC5jOjIwOCBsZXhzdXAuYzoyMTcgbGV4c3VwLmM6Mjg0Ci0jOiBsZXhzdXAuYzozMDcgbGV4c3VwLmM6MzQxCi1tc2dpZCAiRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNTkKLW1zZ2lkICJSZWFkIE1SSSBmb3JtYXQgbGlua2VyIHNjcmlwdCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNjEKLW1zZ2lkICJGb3JjZSBjb21tb24gc3ltYm9scyB0byBiZSBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2NSBsZXhzdXAuYzozMzEgbGV4c3VwLmM6MzMzIGxleHN1cC5jOjMzNQotbXNnaWQgIkFERFJFU1MiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTY1Ci1tc2dpZCAiU2V0IHN0YXJ0IGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTY3Ci1tc2dpZCAiRXhwb3J0IGFsbCBkeW5hbWljIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTY5Ci1tc2dpZCAiTGluayBiaWctZW5kaWFuIG9iamVjdHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTcxCi1tc2dpZCAiTGluayBsaXR0bGUtZW5kaWFuIG9iamVjdHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTczIGxleHN1cC5jOjE3NgotbXNnaWQgIlNITElCIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3MwotbXNnaWQgIkF1eGlsaWFyeSBmaWx0ZXIgZm9yIHNoYXJlZCBvYmplY3Qgc3ltYm9sIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE3NgotbXNnaWQgIkZpbHRlciBmb3Igc2hhcmVkIG9iamVjdCBzeW1ib2wgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTc4Ci1tc2dpZCAiSWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODAKLW1zZ2lkICJTSVpFIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4MAotbXNnaWQgIlNtYWxsIGRhdGEgc2l6ZSAoaWYgbm8gc2l6ZSwgc2FtZSBhcyAtLXNoYXJlZCkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTgzCi1tc2dpZCAiRklMRU5BTUUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTgzCi1tc2dpZCAiU2V0IGludGVybmFsIG5hbWUgb2Ygc2hhcmVkIGxpYnJhcnkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTg1Ci1tc2dpZCAiTElCTkFNRSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODUKLW1zZ2lkICJTZWFyY2ggZm9yIGxpYnJhcnkgTElCTkFNRSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODcKLW1zZ2lkICJESVJFQ1RPUlkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTg3Ci1tc2dpZCAiQWRkIERJUkVDVE9SWSB0byBsaWJyYXJ5IHNlYXJjaCBwYXRoIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4OQotbXNnaWQgIkVNVUxBVElPTiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODkKLW1zZ2lkICJTZXQgZW11bGF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE5MQotbXNnaWQgIlByaW50IG1hcCBmaWxlIG9uIHN0YW5kYXJkIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxOTMKLW1zZ2lkICJEbyBub3QgcGFnZSBhbGlnbiBkYXRhIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE5NQotbXNnaWQgIkRvIG5vdCBwYWdlIGFsaWduIGRhdGEsIGRvIG5vdCBtYWtlIHRleHQgcmVhZG9ubHkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTk4Ci1tc2dpZCAiU2V0IG91dHB1dCBmaWxlIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjAwCi1tc2dpZCAiT3B0aW1pemUgb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjAyCi1tc2dpZCAiSWdub3JlZCBmb3IgU1ZSNCBjb21wYXRpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIwNAotbXNnaWQgIkdlbmVyYXRlIHJlbG9jYXRlYWJsZSBvdXRwdXQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjA4Ci1tc2dpZCAiSnVzdCBsaW5rIHN5bWJvbHMgKGlmIGRpcmVjdG9yeSwgc2FtZSBhcyAtLXJwYXRoKSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMTEKLW1zZ2lkICJTdHJpcCBhbGwgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMTMKLW1zZ2lkICJTdHJpcCBkZWJ1Z2dpbmcgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMTUKLW1zZ2lkICJUcmFjZSBmaWxlIG9wZW5zIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIxNwotbXNnaWQgIlJlYWQgbGlua2VyIHNjcmlwdCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMTkgbGV4c3VwLmM6MjMxIGxleHN1cC5jOjMyNyBsZXhzdXAuYzozNDQgbGV4c3VwLmM6MzYxCi1tc2dpZCAiU1lNQk9MIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIxOQotbXNnaWQgIlN0YXJ0IHdpdGggdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBTWU1CT0wiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjIxCi1tc2dpZCAiQnVpbGQgZ2xvYmFsIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgdGFibGVzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIyMwotbXNnaWQgIlByaW50IHZlcnNpb24gaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjI1Ci1tc2dpZCAiUHJpbnQgdmVyc2lvbiBhbmQgZW11bGF0aW9uIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIyNwotbXNnaWQgIkRpc2NhcmQgYWxsIGxvY2FsIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjI5Ci1tc2dpZCAiRGlzY2FyZCB0ZW1wb3JhcnkgbG9jYWwgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMzEKLW1zZ2lkICJUcmFjZSBtZW50aW9ucyBvZiBTWU1CT0wiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjMzIGxleHN1cC5jOjMwOSBsZXhzdXAuYzozMTEKLW1zZ2lkICJQQVRIIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIzMwotbXNnaWQgIkRlZmF1bHQgc2VhcmNoIHBhdGggZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMzUKLW1zZ2lkICJJZ25vcmVkIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjM3Ci1tc2dpZCAiU3RhcnQgYSBncm91cCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMzkKLW1zZ2lkICJFbmQgYSBncm91cCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNDEKLW1zZ2lkICJJZ25vcmVkIGZvciBTdW5PUyBjb21wYXRpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI0MwotbXNnaWQgIkxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI0OQotbXNnaWQgIkRvIG5vdCBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNTcKLW1zZ2lkICJCaW5kIGdsb2JhbCByZWZlcmVuY2VzIGxvY2FsbHkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjU5Ci1tc2dpZCAiQ2hlY2sgc2VjdGlvbiBhZGRyZXNzZXMgZm9yIG92ZXJsYXBzIChkZWZhdWx0KSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNjEKLW1zZ2lkICJEbyBub3QgY2hlY2sgc2VjdGlvbiBhZGRyZXNzZXMgZm9yIG92ZXJsYXBzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2NAotbXNnaWQgIk91dHB1dCBjcm9zcyByZWZlcmVuY2UgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjY2Ci1tc2dpZCAiU1lNQk9MPUVYUFJFU1NJT04iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjY2Ci1tc2dpZCAiRGVmaW5lIGEgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2OAotbXNnaWQgIkRlbWFuZ2xlIHN5bWJvbCBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNzAKLW1zZ2lkICJQUk9HUkFNIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI3MAotbXNnaWQgIlNldCB0aGUgZHluYW1pYyBsaW5rZXIgdG8gdXNlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI3MgotbXNnaWQgIkdlbmVyYXRlIGVtYmVkZGVkIHJlbG9jcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNzQKLW1zZ2lkICJGb3JjZSBnZW5lcmF0aW9uIG9mIGZpbGUgd2l0aCAuZXhlIHN1ZmZpeCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNzYKLW1zZ2lkICJSZW1vdmUgdW51c2VkIHNlY3Rpb25zIChvbiBzb21lIHRhcmdldHMpIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI3OQotbXNnaWQgIkRvbid0IHJlbW92ZSB1bnVzZWQgc2VjdGlvbnMgKGRlZmF1bHQpIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI4MgotbXNnaWQgIlByaW50IG9wdGlvbiBoZWxwIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI4NAotbXNnaWQgIldyaXRlIGEgbWFwIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjg2Ci1tc2dpZCAiRG8gbm90IGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyODgKLW1zZ2lkICJVc2UgbGVzcyBtZW1vcnkgYW5kIG1vcmUgZGlzayBJL08iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjkwCi1tc2dpZCAiQWxsb3cgbm8gdW5kZWZpbmVkIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjkyCi1tc2dpZCAiRG9uJ3Qgd2FybiBhYm91dCBtaXNtYXRjaGVkIGlucHV0IGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI5NAotbXNnaWQgIlR1cm4gb2ZmIC0td2hvbGUtYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyOTYKLW1zZ2lkICJDcmVhdGUgYW4gb3V0cHV0IGZpbGUgZXZlbiBpZiBlcnJvcnMgb2NjdXIiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzAwCi1tc2dpZCAiU3BlY2lmeSB0YXJnZXQgb2Ygb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzAyCi1tc2dpZCAiSWdub3JlZCBmb3IgTGludXggY29tcGF0aWJpbGl0eSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMDQKLW1zZ2lkICJSZWxheCBicmFuY2hlcyBvbiBjZXJ0YWluIHRhcmdldHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzA3Ci1tc2dpZCAiS2VlcCBvbmx5IHN5bWJvbHMgbGlzdGVkIGluIEZJTEUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzA5Ci1tc2dpZCAiU2V0IHJ1bnRpbWUgc2hhcmVkIGxpYnJhcnkgc2VhcmNoIHBhdGgiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzExCi1tc2dpZCAiU2V0IGxpbmsgdGltZSBzaGFyZWQgbGlicmFyeSBzZWFyY2ggcGF0aCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMTMKLW1zZ2lkICJDcmVhdGUgYSBzaGFyZWQgbGlicmFyeSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMTcKLW1zZ2lkICJTb3J0IGNvbW1vbiBzeW1ib2xzIGJ5IHNpemUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzIxCi1tc2dpZCAiU3BsaXQgb3V0cHV0IHNlY3Rpb25zIGZvciBlYWNoIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzIzCi1tc2dpZCAiQ09VTlQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzIzCi1tc2dpZCAiU3BsaXQgb3V0cHV0IHNlY3Rpb25zIGV2ZXJ5IENPVU5UIHJlbG9jcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMjUKLW1zZ2lkICJQcmludCBtZW1vcnkgdXNhZ2Ugc3RhdGlzdGljcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMjcKLW1zZ2lkICJEbyB0YXNrIGxldmVsIGxpbmtpbmciCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzI5Ci1tc2dpZCAiVXNlIHNhbWUgZm9ybWF0IGFzIG5hdGl2ZSBsaW5rZXIiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzMxCi1tc2dpZCAiU2V0IGFkZHJlc3Mgb2YgLmJzcyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMzMwotbXNnaWQgIlNldCBhZGRyZXNzIG9mIC5kYXRhIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzM1Ci1tc2dpZCAiU2V0IGFkZHJlc3Mgb2YgLnRleHQgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMzcKLW1zZ2lkICJPdXRwdXQgbG90cyBvZiBpbmZvcm1hdGlvbiBkdXJpbmcgbGluayIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNDEKLW1zZ2lkICJSZWFkIHZlcnNpb24gaW5mb3JtYXRpb24gc2NyaXB0IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM0NAotbXNnaWQgIiIKLSJUYWtlIGV4cG9ydCBzeW1ib2xzIGxpc3QgZnJvbSAuZXhwb3J0cywgdXNpbmdcbiIKLSJcdFx0XHRcdFNZTUJPTCBhcyB0aGUgdmVyc2lvbi4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzQ3Ci1tc2dpZCAiV2FybiBhYm91dCBkdXBsaWNhdGUgY29tbW9uIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzQ5Ci1tc2dpZCAiV2FybiBpZiBnbG9iYWwgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIGFyZSBzZWVuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM1MgotbXNnaWQgIldhcm4gaWYgdGhlIG11bHRpcGxlIEdQIHZhbHVlcyBhcmUgdXNlZCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNTQKLW1zZ2lkICJXYXJuIG9ubHkgb25jZSBwZXIgdW5kZWZpbmVkIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNTYKLW1zZ2lkICJXYXJuIGlmIHN0YXJ0IG9mIHNlY3Rpb24gY2hhbmdlcyBkdWUgdG8gYWxpZ25tZW50IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM1OQotbXNnaWQgIkluY2x1ZGUgYWxsIG9iamVjdHMgZnJvbSBmb2xsb3dpbmcgYXJjaGl2ZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzYxCi1tc2dpZCAiVXNlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBTWU1CT0wiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzYzCi1tc2dpZCAiWz1XT1JEU10iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzYzCi1tc2dpZCAiIgotIk1vZGlmeSBwcm9ibGVtYXRpYyBicmFuY2hlcyBpbiBsYXN0IFdPUkRTICgxLTEwLFxuIgotIlx0XHRcdFx0ZGVmYXVsdCA1KSB3b3JkcyBvZiBhIHBhZ2UiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6NTI1Ci1tc2dpZCAiJVAlRjogdW5yZWNvZ25pemVkIC1hIG9wdGlvbiBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6NTM4Ci1tc2dpZCAiJVAlRjogdW5yZWNvZ25pemVkIC1hc3NlcnQgb3B0aW9uIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo2MjkKLW1zZ2lkICIlUCVGOiBpbnZhbGlkIG51bWJlciBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6ODAxCi1tc2dpZCAiJVAlRjogLXNoYXJlZCBub3Qgc3VwcG9ydGVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6ODY1Ci1tc2dpZCAiQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6ODY2Ci1tc2dpZCAiIgotIlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcbiIKLSJ0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6OTU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBtYXkgbm90IG5lc3QgZ3JvdXBzICgtLWhlbHAgZm9yIHVzYWdlKVxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjk2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZ3JvdXAgZW5kZWQgYmVmb3JlIGl0IGJlZ2FuICgtLWhlbHAgZm9yIHVzYWdlKVxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjk4NAotbXNnaWQgIkludmFsaWQgYXJndW1lbnQgdG8gb3B0aW9uIFwibXBjODYwYzBcIlxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjEwMzEKLW1zZ2lkICIlUCVGOiBpbnZhbGlkIGhleCBudW1iZXIgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjEwNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2U6ICVzIFtvcHRpb25zXSBmaWxlLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTA0NQotbXNnaWQgIk9wdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTEyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IHN1cHBvcnRlZCB0YXJnZXRzOlxuIgotIiAgIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjExMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBzdXBwb3J0ZWQgZW11bGF0aW9uczpcbiIKLSIgICIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBlbXVsYXRpb24gc3BlY2lmaWMgb3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMTM5Ci1tc2dpZCAiIgotIlxuIgotIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIgotbXNnc3RyICIiCi0KLSM6IG1yaS5jOjM0MgotbXNnaWQgIiVQJUY6IHVua25vd24gZm9ybWF0IHR5cGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzoxMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhVbnN1cHBvcnRlZCBQRUkgYXJjaGl0ZWN0dXJlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjM0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlWEVycm9yLCBkdXBsaWNhdGUgRVhQT1JUIHdpdGggb3JpZGluYWxzOiAlcyAoJWQgdnMgJWQpXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6MzUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmcsIGR1cGxpY2F0ZSBFWFBPUlQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6NDA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVYQ2Fubm90IGV4cG9ydCAlczogc3ltYm9sIG5vdCBkZWZpbmVkXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6NDExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVYQ2Fubm90IGV4cG9ydCAlczogc3ltYm9sIHdyb25nIHR5cGUgKCVkIHZzICVkKVxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjQxOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCBub3QgZm91bmRcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo1NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhFcnJvciwgb3JpZGluYWwgdXNlZCB0d2ljZTogJWQgKCVzIHZzICVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjczNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlWEVycm9yOiAlZC1iaXQgcmVsb2MgaW4gZGxsXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6ODU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCBvcGVuIG91dHB1dCBkZWYgZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjk3NgotbXNnaWQgIjsgbm8gY29udGVudHMgYXZhaWxhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6MTQyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlWENhbid0IG9wZW4gLmxpYiBmaWxlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjE0MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ3JlYXRpbmcgbGlicmFyeSBmaWxlOiAlc1xuIgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9SRUFETUUgYi9sZC9zY3JpcHR0ZW1wbC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YWQyZTkuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1UaGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIGxpbmtlciBzY3JpcHQgdGVtcGxhdGVzLgotZ2Vuc2NyaXB0cy5zaCBzZXRzIHNvbWUgc2hlbGwgdmFyaWFibGVzLCB0aGVuIHNvdXJjZXMKLUVNVUxBVElPTi5zYywgdG8gZ2VuZXJhdGUgRU1VTEFUSU9OLnt4LHhyLHh1LHhuLHhibn0gLS0gdGhlIHNjcmlwdAotZmlsZXMgZm9yIGRlZmF1bHQsIC1yLCAtVXIsIC1uLCAtTi4KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2EyOWsuc2MgYi9sZC9zY3JpcHR0ZW1wbC9hMjlrLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODI1YjFlLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2EyOWsuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0IDogewotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2V0ZXh0ICA9ICAufTsKLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuO30KLSAgICAqKC5saXQpCi0gICAgKiguc2hkYXRhKQotICB9Ci0gIC5zaGJzcyBTSVpFT0YoLnRleHQpICsgQUREUigudGV4dCkgOgl7Ci0gICAgKiguc2hic3MpCi0gIH0gCi0gIC5kYXRhICA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgX19lZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyAgIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKSA6Ci0gIHsgCQkJCQkKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgICAke1JFTE9DQVRJTkcrIF9fZW5kID0gQUxJR04oMHg4KX07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvYWl4LnNjIGIvbGQvc2NyaXB0dGVtcGwvYWl4LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjRiNjE3Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2FpeC5zYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMgQUlYIGxpbmtlciBzY3JpcHQuCi0jIEFJWCBhbHdheXMgdXNlcyBzaGFyZWQgbGlicmFyaWVzLiAgVGhlIHNlY3Rpb24gVk1BIGFwcGVhcnMgdG8gYmUKLSMgdW5pbXBvcnRhbnQuICBUaGUgbmF0aXZlIGxpbmtlciBhbGlnbnMgdGhlIHNlY3Rpb25zIG9uIGJvdW5kYXJpZXMKLSMgc3BlY2lmaWVkIGJ5IHRoZSAtSCBvcHRpb24uCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci1FTlRSWShfX3N0YXJ0KQotU0VDVElPTlMKLXsKLSAgLnBhZCAwIDogeyAqKC5wYWQpIH0KLSAgLnRleHQgJHtSRUxPQ0FUSU5HLTB9IDogewotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfdGV4dCA9IC4pO30KLSAgICAqKC50ZXh0KQotICAgICooLnByKQotICAgICooLnJvKQotICAgICooLmRiKQotICAgICooLmdsKQotICAgICooLnhvKQotICAgICooLnRpKQotICAgICooLnRiKQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfZXRleHQgPSAuKTt9Ci0gIH0KLSAgLmRhdGEgMCA6IHsKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX2RhdGEgPSAuKTt9Ci0gICAgKiguZGF0YSkKLSAgICAqKC5ydykKLSAgICAqKC5zdikKLSAgICAqKC51YSkKLSAgICAuID0gQUxJR04oNCk7Ci0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICAgICooLmRzKQotICAgICooLnRjMCkKLSAgICAqKC50YykKLSAgICAqKC50ZCkKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX2VkYXRhID0gLik7fQotICB9Ci0gIC5ic3MgOiB7Ci0gICAgKigudG9jYnNzKQotICAgICooLmJzcykKLSAgICAqKC5icykKLSAgICAqKC51YykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX2VuZCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoZW5kID0gLik7fQotICB9Ci0gIC5sb2FkZXIgMCA6IHsKLSAgICAqKC5sb2FkZXIpCi0gIH0KLSAgLmRlYnVnIDAgOiB7Ci0gICAgKiguZGVidWcpCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvYWxwaGEuc2MgYi9sZC9zY3JpcHR0ZW1wbC9hbHBoYS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhMTBjNC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9hbHBoYS5zYworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgQWxwaGEgc3lzdGVtcy4KLSMgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotIyBUaGVzZSB2YXJpYWJsZXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGVtdWxhdGlvbiBmaWxlLiAgVGhlCi0jIGRlZmF1bHRzIGFyZSBhcHByb3ByaWF0ZSBmb3IgYW4gQWxwaGEgcnVubmluZyBPU0YvMS4KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X19zdGFydAotdGVzdCAteiAiJFRFWFRfU1RBUlRfQUREUiIgJiYgVEVYVF9TVEFSVF9BRERSPSIweDEyMDAwMDAwMCArIFNJWkVPRl9IRUFERVJTIgotaWYgdGVzdCAieCRMRF9GTEFHIiA9ICJ4biIgLW8gIngkTERfRkxBRyIgPSAieE4iOyB0aGVuCi0gIERBVEFfQUREUj0uCi1lbHNlCi0gIHRlc3QgLXogIiREQVRBX0FERFIiICYmIERBVEFfQUREUj0weDE0MDAwMDAwMAotZmkKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KLSAgLnRleHQgOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZnRleHQgPSAuIH07Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX2lzdGFydCA9IC4gfTsKLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpIH0KLSAgICAke1JFTE9DQVRJTkcrIExPTkcgKDB4NmJmYTgwMDEpfQotICAgICR7UkVMT0NBVElORysgZXByb2wgID0gIC59OwotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2ZzdGFydCA9IC4gfTsKLSAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQotICAgICR7UkVMT0NBVElORysgTE9ORyAoMHg2YmZhODAwMSl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZXRleHQgID0gIC59OwotICB9Ci0gIC5yZGF0YSA6IHsKLSAgICAqKC5yZGF0YSkKLSAgfQotICAucmNvbnN0IDogewotICAgICooLnJjb25zdCkKLSAgfQotICAucGRhdGEgOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZnBkYXRhID0gLjt9Ci0gICAgKigucGRhdGEpCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUn07fQotICAuZGF0YSA6IHsKLSAgICAke1JFTE9DQVRJTkcrIF9mZGF0YSA9IC47fQotICAgICooLmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICB9Ci0gIC54ZGF0YSA6IHsKLSAgICAqKC54ZGF0YSkKLSAgfQotICAke1JFTE9DQVRJTkcrIF9ncCA9IEFMSUdOICgxNikgKyAweDgwMDA7fQotICAubGl0OCA6IHsKLSAgICAqKC5saXQ4KQotICB9Ci0gIC5saXRhIDogewotICAgICooLmxpdGEpCi0gIH0KLSAgLnNkYXRhIDogewotICAgICooLnNkYXRhKQotICB9Ci0gICR7UkVMT0NBVElORysgX0VEQVRBICA9ICAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfRkJTUyA9IC47fQotICAuc2JzcyA6IHsKLSAgICAqKC5zYnNzKQotICAgICooLnNjb21tb24pCi0gIH0KLSAgLmJzcyA6IHsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLjt9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FvdXQuc2MgYi9sZC9zY3JpcHR0ZW1wbC9hb3V0LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGRiYjM3Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2FvdXQuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi10ZXN0IC16ICIke0JJR19PVVRQVVRfRk9STUFUfSIgJiYgQklHX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAteiAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iICYmIExJVFRMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgLXogIiR7QUxJR05NRU5UfSIgJiYgQUxJR05NRU5UPSI0IgotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtTVEFDS1pFUk8rJHtSRUxPQ0FUSU5HKyR7U1RBQ0taRVJPfX19Ci0ke1NITElCX1BBVEgrJHtSRUxPQ0FUSU5HKyR7U0hMSUJfUEFUSH19fQotJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KLSR7UkVMT0NBVElORytQUk9WSURFIChfX3N0YWNrID0gMCk7fQotU0VDVElPTlMKLXsKLSAgJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn07fQotICAudGV4dCA6Ci0gIHsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAqKC50ZXh0KQotICAgIC8qIFRoZSBuZXh0IHNpeCBzZWN0aW9ucyBhcmUgZm9yIFN1bk9TIGR5bmFtaWMgbGlua2luZy4gIFRoZSBvcmRlcgotICAgICAgIGlzIGltcG9ydGFudC4gICovCi0gICAgKiguZHlucmVsKQotICAgICooLmhhc2gpCi0gICAgKiguZHluc3ltKQotICAgICooLmR5bnN0cikKLSAgICAqKC5ydWxlcykKLSAgICAqKC5uZWVkKQotICAgICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrX19ldGV4dCA9IC47fQotICAgICR7UEFEX1RFWFQrJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9fQotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICAuZGF0YSA6Ci0gIHsKLSAgICAvKiBUaGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICAqLwotICAgICooLmR5bmFtaWMpCi0gICAgKiguZ290KQotICAgICooLnBsdCkKLSAgICAqKC5kYXRhKQotICAgICooLmxpbnV4LWR5bmFtaWMpIC8qIEZvciBMaW51eCBkeW5hbWljIGxpbmtpbmcuICAqLwotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX19lZGF0YSAgPSAgLjt9Ci0gIH0KLSAgLmJzcyA6Ci0gIHsKLSAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HKy4gPSBBTElHTigke0FMSUdOTUVOVH0pO30KLSAgICR7UkVMT0NBVElORytfZW5kID0gLiB9OwotICAgJHtSRUxPQ0FUSU5HK19fZW5kID0gLiB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MgYi9sZC9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTI3NmE4Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQotU0VDVElPTlMKLXsKLSAgLnRleHQgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX0FERFJ9fSA6Ci0gIHsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAke1JFTE9DQVRJTkcrX19zdGV4dF8gPSAuO30KLSAgICAqKC50ZXh0KQotICAgICR7UEFEX1RFWFQrJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9fQotICAgICR7UkVMT0NBVElORytfZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyR7REFUQV9BTElHTk1FTlR9fSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19zZGF0YV8gPSAuO30KLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX19lZGF0YSAgPSAgLjt9Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSICguZGF0YSl9IDoKLSAgewotICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrX2VuZCA9IEFMSUdOKDQpIH07Ci0gICAke1JFTE9DQVRJTkcrX19lbmQgPSBBTElHTig0KSB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FybWNvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjljZDdjLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2FybWNvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIEFSTSBDT0ZGLgotIyBCYXNlZCBvbiBpMzg2Y29mZi5zYyBieSBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotaWYgdGVzdCAteiAiJHtEQVRBX0FERFJ9IjsgdGhlbgotICBpZiB0ZXN0ICIkTERfRkxBRyIgPSAiTiIgfHwgdGVzdCAiJExEX0ZMQUciID0gIm4iOyB0aGVuCi0gICAgREFUQV9BRERSPS4KLSAgZmkKLWZpCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLCAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAvKiBXZSBzdGFydCBhdCAweDgwMDAgYmVjYXVzZSBnZGIgYXNzdW1lcyBpdCAoc2VlIEZSQU1FX0NIQUlOKS4KLSAgICAgVGhpcyBpcyBhbiBhcnRpZmFjdCBvZiB0aGUgQVJNIERlbW9uIG1vbml0b3IgdXNpbmcgdGhlIGJvdHRvbSAzMmsKLSAgICAgYXMgd29ya3NwYWNlIChzaGFyZWQgd2l0aCB0aGUgRlAgaW5zdHJ1Y3Rpb24gZW11bGF0b3IgaWYKLSAgICAgcHJlc2VudCk6ICovCi0gIC50ZXh0ICR7UkVMT0NBVElORysgMHg4MDAwfSA6IHsKLSAgICAqKC5pbml0KQotICAgICooLnRleHQpCi0gICAgKiguZ2x1ZV83dCkKLSAgICAqKC5nbHVlXzcpCi0gICAgKigucmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORyske0RBVEFfQUREUi0weDQwMDAwICsgKC4gJiAweGZmZmMwZmZmKX19IDogewotICAgICR7UkVMT0NBVElORysgIF9fZGF0YV9zdGFydF9fID0gLiA7fQotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2RhdGFfZW5kX18gPSAuIDt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgID0gIC47fQotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19lbmRfXyA9IC4gO30KLSAgfQotCi0gICR7UkVMT0NBVElORysgZW5kID0gLjt9Ci0gICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotICAke1JFTE9DQVRJTkcrIF9fZW5kX18gPSAuO30KLQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2RlbHRhNjguc2MgYi9sZC9zY3JpcHR0ZW1wbC9kZWx0YTY4LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTk2MzA1Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2RlbHRhNjguc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLUVOVFJZKF9zdGFydCkKLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgMHgyMDAwICsgU0laRU9GX0hFQURFUlN9IDoKLSAgICB7Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLnRleHQuc3RhcnQgPSAufTsKLSAgICAgICooLnRleHQpCi0gICAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgICAgICR7UkVMT0NBVElORysgX2V0ZXh0ICA9ICAuO30KLSAgICAgICR7UkVMT0NBVElORysgX18udGV4dC5lbmQgPSAufTsKLSAgICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjt9Ci0gICAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47fQotICAgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9FTkRfXyA9IC47fQotICAgIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLnRleHQpICsgQUREUigudGV4dCkgKyAweDQwMDAwMH0gOgotICAgIHsKLSAgICAgICR7UkVMT0NBVElORysgX18uZGF0YS5zdGFydCA9IC59OwotICAgICAgKiguZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgID0gIC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5kYXRhLmVuZCA9IC59OwotICAgIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICAgIHsgCQkJCQkKLSAgICAgICR7UkVMT0NBVElORysgX18uYnNzLnN0YXJ0ID0gLn07Ci0gICAgICAqKC5ic3MpCi0gICAgICAqKENPTU1PTikKLSAgICAgICR7UkVMT0NBVElORysgX18uYnNzLmVuZCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSBBTElHTigweDgpfTsKLSAgICAgICR7UkVMT0NBVElORysgX2VuZCA9IEFMSUdOKDB4OCl9OwotICAgIH0KLSAgLmNvbW1lbnQgJHtSRUxPQ0FUSU5HKyAwfSA6Ci0gICAgewotICAgICAgKiguY29tbWVudCkKLSAgICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VibW9uMjlrLnNjIGIvbGQvc2NyaXB0dGVtcGwvZWJtb24yOWsuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDUwZWUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvZWJtb24yOWsuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotRU5UUlkoc3RhcnQpCi0KLVNFQ1RJT05TIHsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOiAKLSAgICB7Ci0JKigudGV4dCk7Ci0JJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC59OwotICAgIH0KLSAgZGF0YSAke1JFTE9DQVRJTkcrMHg4MDAwMjAwMH0gOgotICAgIHsKLQkqKC5kYXRhKTsKLQkqKC5tc3RhY2spOyAKLQkqKC5zaGJzcyk7Ci0JKigucnN0YWNrKTsKLQkqKC5tc3RhY2spOwotCSR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICB9Ci0gIC5ic3MgIC4gOgotICAgIHsgCi0JKihDT01NT04pIAkKLQkqKC5ic3MpOwotCSR7UkVMT0NBVElORytfZW5kID0gLn07Ci0gICAgfSAKLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvZWxmLnNjIGIvbGQvc2NyaXB0dGVtcGwvZWxmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGRjN2IwLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VsZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0jCi0jIFVudXN1YWwgdmFyaWFibGVzIGNoZWNrZWQgYnkgdGhpcyBjb2RlOgotIwlOT1AgLSB0d28gYnl0ZSBvcGNvZGUgZm9yIG5vLW9wIChkZWZhdWx0cyB0byAwKQotIwlEQVRBX0FERFIgLSBpZiBlbmQtb2YtdGV4dC1wbHVzLW9uZS1wYWdlIGlzbid0IHJpZ2h0IGZvciBkYXRhIHN0YXJ0Ci0jCUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlMgLSBhdCBzdGFydCBvZiB0ZXh0IHNlZ21lbnQKLSMJT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMgLSBvdGhlciB0aGFuIC50ZXh0IC5pbml0IC5yb2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5taWxsaSkKLSMJT1RIRVJfVEVYVF9TRUNUSU9OUyAtIHRoZXNlIGdldCBwdXQgaW4gLnRleHQgd2hlbiByZWxvY2F0aW5nCi0jCU9USEVSX1JFQURXUklURV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLmRhdGEgLmJzcyAuY3RvcnMgLnNkYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MuZ2xvYmFsKQotIwlPVEhFUl9CU1NfU0VDVElPTlMgLSBvdGhlciB0aGFuIC5ic3MgLnNic3MgLi4uCi0jCU9USEVSX1NFQ1RJT05TIC0gYXQgdGhlIGVuZAotIwlFWEVDVVRBQkxFX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgbXVzdCBiZSBkZWZpbmVkIGZvciBhbgotIwkJZXhlY3V0YWJsZSAoZS5nLiwgX0RZTkFNSUNfTElOSykKLSMJVEVYVF9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkudGV4dCBzZWN0aW9uLgotIwlEQVRBX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5kYXRhIHNlY3Rpb24uCi0jCU9USEVSX0dPVF9TWU1CT0xTIC0gc3ltYm9scyBkZWZpbmVkIGp1c3QgYmVmb3JlIC5nb3QuCi0jCU9USEVSX0dPVF9TRUNUSU9OUyAtIHNlY3Rpb25zIGp1c3QgYWZ0ZXIgLmdvdCBhbmQgLnNkYXRhLgotIwlPVEhFUl9CU1NfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmJzcyBzZWN0aW9uIGJlc2lkZXMgX19ic3Nfc3RhcnQuCi0jCURBVEFfUExUIC0gLnBsdCBzaG91bGQgYmUgaW4gZGF0YSBzZWdtZW50LCBub3QgdGV4dCBzZWdtZW50LgotIwlURVhUX0RZTkFNSUMgLSAuZHluYW1pYyBpbiB0ZXh0IHNlZ21lbnQsIG5vdCBkYXRhIHNlZ21lbnQuCi0jCUVNQkVEREVEIC0gd2hldGhlciB0aGlzIGlzIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0uIAotIwlTSExJQl9URVhUX1NUQVJUX0FERFIgLSBpZiBzZXQsIGFkZCB0byBTSVpFT0ZfSEVBREVSUyB0byBzZXQKLSMJCXN0YXJ0IGFkZHJlc3Mgb2Ygc2hhcmVkIGxpYnJhcnkuCi0jCUlOUFVUX0ZJTEVTIC0gSU5QVVQgY29tbWFuZCBvZiBmaWxlcyB0byBhbHdheXMgaW5jbHVkZQotIwlXUklUQUJMRV9ST0RBVEEgLSBpZiBzZXQsIHRoZSAucm9kYXRhIHNlY3Rpb24gc2hvdWxkIGJlIHdyaXRhYmxlCi0jCUlOSVRfU1RBUlQsIElOSVRfRU5EIC0gIHN0YXRlbWVudHMganVzdCBiZWZvcmUgYW5kIGp1c3QgYWZ0ZXIKLSMgCWNvbWJpbmF0aW9uIG9mIC5pbml0IHNlY3Rpb25zLgotIwlGSU5JX1NUQVJULCBGSU5JX0VORCAtIHN0YXRlbWVudHMganVzdCBiZWZvcmUgYW5kIGp1c3QgYWZ0ZXIKLSMgCWNvbWJpbmF0aW9uIG9mIC5maW5pIHNlY3Rpb25zLgotIwotIyBXaGVuIGFkZGluZyBzZWN0aW9ucywgZG8gbm90ZSB0aGF0IHRoZSBuYW1lcyBvZiBzb21lIHNlY3Rpb25zIGFyZSB1c2VkCi0jIHdoZW4gc3BlY2lmeWluZyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV4dC4KLSMKLQotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLXRlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotaWYgWyAteiAiJE1BQ0hJTkUiIF07IHRoZW4gT1VUUFVUX0FSQ0g9JHtBUkNIfTsgZWxzZSBPVVRQVVRfQVJDSD0ke0FSQ0h9OiR7TUFDSElORX07IGZpCi10ZXN0IC16ICIke0VMRlNJWkV9IiAmJiBFTEZTSVpFPTMyCi10ZXN0IC16ICIke0FMSUdOTUVOVH0iICYmIEFMSUdOTUVOVD0iJHtFTEZTSVpFfSAvIDgiCi10ZXN0ICIkTERfRkxBRyIgPSAiTiIgJiYgREFUQV9BRERSPS4KLUlOVEVSUD0iLmludGVycCAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaW50ZXJwKSAJfSIKLVBMVD0iLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnBsdCkJfSIKLURZTkFNSUM9Ii5keW5hbWljICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bmFtaWMpIH0iCi1ST0RBVEE9Ii5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGEpICR7UkVMT0NBVElORysqKC5yb2RhdGEuKil9ICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UuciopfSB9IgotQ1RPUj0iLmN0b3JzICR7Q09OU1RSVUNUSU5HLTB9IDogCi0gIHsKLSAgICAke0NPTlNUUlVDVElORyske0NUT1JfU1RBUlR9fQotICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKLSAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKLSAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90Ci0gICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQotICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQotICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCi0gICAgICAgaXMgaW4uICAqLwotCi0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKLQotICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCi0gICAgICAgZnJvbSB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgotICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQotICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLwotCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmN0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKLSAgICBLRUVQICgqKC5jdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrJHtDVE9SX0VORH19Ci0gIH0iCi0KLURUT1I9IiAuZHRvcnMgICAgICAgJHtDT05TVFJVQ1RJTkctMH0gOgotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX1NUQVJUfX0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5kdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguZHRvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyR7RFRPUl9FTkR9fQotICB9IgotCi0jIGlmIHRoaXMgaXMgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbSwgZG9uJ3QgYWRkIFNJWkVPRl9IRUFERVJTLgotaWYgWyAteiAiJEVNQkVEREVEIiBdOyB0aGVuCi0gICB0ZXN0IC16ICIke1RFWFRfQkFTRV9BRERSRVNTfSIgJiYgVEVYVF9CQVNFX0FERFJFU1M9IiR7VEVYVF9TVEFSVF9BRERSfSArIFNJWkVPRl9IRUFERVJTIgotZWxzZQotICAgdGVzdCAteiAiJHtURVhUX0JBU0VfQUREUkVTU30iICYmIFRFWFRfQkFTRV9BRERSRVNTPSIke1RFWFRfU1RBUlRfQUREUn0iCi1maQotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke09VVFBVVF9BUkNIfSkKLUVOVFJZKCR7RU5UUll9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtSRUxPQ0FUSU5HKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAke1NUQUNLWkVSTyske1NUQUNLWkVST319ICR7U0hMSUJfUEFUSCske1NITElCX1BBVEh9fSAgKi99Ci0ke1JFTE9DQVRJTkcrJHtFWEVDVVRBQkxFX1NZTUJPTFN9fQotJHtSRUxPQ0FUSU5HKyR7SU5QVVRfRklMRVN9fQotJHtSRUxPQ0FUSU5HLSAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKLSAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKLSAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKLSAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqL30KLQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gICR7Q1JFQVRFX1NITElCLSR7UkVMT0NBVElORysuID0gJHtURVhUX0JBU0VfQUREUkVTU307fX0KLSAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSAke1NITElCX1RFWFRfU1RBUlRfQUREUjotMH0gKyBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQi0ke0lOVEVSUH19Ci0gICR7SU5JVElBTF9SRUFET05MWV9TRUNUSU9OU30KLSAgJHtURVhUX0RZTkFNSUMrJHtEWU5BTUlDfX0KLSAgLmhhc2ggICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpCQl9Ci0gIC5nbnUudmVyc2lvbiAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uKQl9Ci0gIC5nbnUudmVyc2lvbl9kICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb25fZCkJfQotICAuZ251LnZlcnNpb25fciAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX3IpCX0KLQotICAucmVsLmluaXQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuaW5pdCkJfQotICAucmVsYS5pbml0ICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmluaXQpCX0KLSAgLnJlbC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsLnRleHQpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLnRleHQuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLmdudS5saW5rb25jZS50Kil9Ci0gICAgfQotICAucmVsYS50ZXh0ICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnRleHQpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS50ZXh0LiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZ251LmxpbmtvbmNlLnQqKX0KLSAgICB9Ci0gIC5yZWwuZmluaSAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5maW5pKQl9Ci0gIC5yZWxhLmZpbmkgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZmluaSkJfQotICAucmVsLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWwucm9kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5yb2RhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLmdudS5saW5rb25jZS5yKil9Ci0gICAgfQotICAucmVsYS5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnJvZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLnJvZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5yKil9Ci0gICAgfQotICAke09USEVSX1JFQURPTkxZX1JFTE9DX1NFQ1RJT05TfQotICAucmVsLmRhdGEgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWwuZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwuZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwuZ251LmxpbmtvbmNlLmQqKX0KLSAgICB9Ci0gIC5yZWxhLmRhdGEgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEuZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmRhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UuZCopfQotICAgIH0KLSAgLnJlbC5jdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5nb3QgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QpCQl9Ci0gICR7T1RIRVJfR09UX1JFTE9DX1NFQ1RJT05TfQotICAucmVsLnNkYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWwuc2RhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLnNkYXRhLiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5nbnUubGlua29uY2UucyopfQotICAgIH0KLSAgLnJlbGEuc2RhdGEgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEuc2RhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5zZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5zKil9Ci0gICAgfQotICAucmVsLnNic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuc2JzcykJCX0KLSAgLnJlbGEuc2JzcyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zYnNzKQl9Ci0gIC5yZWwuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnBsdCkJCX0KLQotICAuaW5pdCAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogCi0gIHsgCi0gICAgJHtJTklUX1NUQVJUfQotICAgIEtFRVAgKCooLmluaXQpKQotICAgICR7SU5JVF9FTkR9Ci0gIH0gPSR7Tk9QLTB9Ci0KLSAgJHtEQVRBX1BMVC0ke1BMVH19Ci0gIC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX1NZTUJPTFN9fQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyooLnRleHQuKil9Ci0gICAgKiguc3R1YikKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KLSAgICAqKC5nbnUud2FybmluZykKLSAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLnQqKX0KLSAgICAke1JFTE9DQVRJTkcrJHtPVEhFUl9URVhUX1NFQ1RJT05TfX0KLSAgfSA9JHtOT1AtMH0KLSAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZXRleHQgPSAuKTt9Ci0gIC5maW5pICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke0ZJTklfU1RBUlR9Ci0gICAgS0VFUCAoKiguZmluaSkpCi0gICAgJHtGSU5JX0VORH0KLSAgfSA9JHtOT1AtMH0KLSAgJHtXUklUQUJMRV9ST0RBVEEtJHtST0RBVEF9fQotICAucm9kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRE9OTFlfU0VDVElPTlN9fQotCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLwotICAke0NSRUFURV9TSExJQi0ke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLUFMSUdOKCR7TUFYUEFHRVNJWkV9KSArICguICYgKCR7TUFYUEFHRVNJWkV9IC0gMSkpfTt9fQotICAke0NSRUFURV9TSExJQiske1JFTE9DQVRJTkcrLiA9ICR7U0hMSUJfREFUQV9BRERSLUFMSUdOKCR7TUFYUEFHRVNJWkV9KSArICguICYgKCR7TUFYUEFHRVNJWkV9IC0gMSkpfTt9fQotCi0gIC5kYXRhICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7REFUQV9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysqKC5kYXRhLiopfQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UuZCopfQotICAgICR7Q09OU1RSVUNUSU5HK1NPUlQoQ09OU1RSVUNUT1JTKX0KLSAgfQotICAuZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kYXRhMSkgfQotICAuZWhfZnJhbWUgOiB7ICooLmVoX2ZyYW1lKSB9Ci0gIC5nY2NfZXhjZXB0X3RhYmxlIDogeyAqKC5nY2NfZXhjZXB0X3RhYmxlKSB9Ci0gICR7V1JJVEFCTEVfUk9EQVRBKyR7Uk9EQVRBfX0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TfX0KLSAgJHtSRUxPQ0FUSU5HKyR7Q1RPUn19Ci0gICR7UkVMT0NBVElORyske0RUT1J9fQotICAke0RBVEFfUExUKyR7UExUfX0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfR09UX1NZTUJPTFN9fQotICAuZ290ICAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QucGx0KSAqKC5nb3QpIH0KLSAgJHtURVhUX0RZTkFNSUMtJHtEWU5BTUlDfX0KLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbwotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLwotICAuc2RhdGEgICAke1JFTE9DQVRJTkctMH0gOiAKLSAgewotICAgICR7UkVMT0NBVElORyske1NEQVRBX1NUQVJUX1NZTUJPTFN9fQotICAgICooLnNkYXRhKSAKLSAgICAke1JFTE9DQVRJTkcrKiguc2RhdGEuKil9Ci0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS5zLiopfQotICB9Ci0gICR7UkVMT0NBVElORyske09USEVSX0dPVF9TRUNUSU9OU319Ci0gICR7UkVMT0NBVElORytfZWRhdGEgPSAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVkYXRhID0gLik7fQotICAke1JFTE9DQVRJTkcrX19ic3Nfc3RhcnQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfQlNTX1NZTUJPTFN9fQotICAuc2JzcyAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgKiguZHluc2JzcykKLSAgICAqKC5zYnNzKQotICAgICR7UkVMT0NBVElORysqKC5zYnNzLiopfQotICAgICooLnNjb21tb24pCi0gIH0KLSAgLmJzcyAgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgJHtSRUxPQ0FUSU5HKyooLmJzcy4qKX0KLSAgICooQ09NTU9OKQotICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCi0gICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKLSAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KLSAgICR7UkVMT0NBVElORysuID0gQUxJR04oJHtBTElHTk1FTlR9KTt9Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfQlNTX1NFQ1RJT05TfX0KLSAgJHtSRUxPQ0FUSU5HKy4gPSBBTElHTigke0FMSUdOTUVOVH0pO30KLSAgJHtSRUxPQ0FUSU5HK19lbmQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfQlNTX0VORF9TWU1CT0xTfX0KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLQotICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KLSAgLnN0YWIuZXhjbCAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KLSAgLnN0YWIuZXhjbHN0ciAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KLSAgLnN0YWIuaW5kZXggMCA6IHsgKiguc3RhYi5pbmRleCkgfQotICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9Ci0KLSAgLmNvbW1lbnQgMCA6IHsgKiguY29tbWVudCkgfQotCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLQotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQotCi0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KLSAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KLSAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQotCi0gICR7UkVMT0NBVElORyske09USEVSX1JFTE9DQVRJTkdfU0VDVElPTlN9fQotCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgJHtSRUxPQ0FUSU5HfS4gICovCi0gICR7T1RIRVJfU0VDVElPTlN9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VsZmQxMHYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9lbGZkMTB2LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjJlZWY0Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VsZmQxMHYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotIwotIyBVbnVzdWFsIHZhcmlhYmxlcyBjaGVja2VkIGJ5IHRoaXMgY29kZToKLSMJTk9QIC0gdHdvIGJ5dGUgb3Bjb2RlIGZvciBuby1vcCAoZGVmYXVsdHMgdG8gMCkKLSMJREFUQV9BRERSIC0gaWYgZW5kLW9mLXRleHQtcGx1cy1vbmUtcGFnZSBpc24ndCByaWdodCBmb3IgZGF0YSBzdGFydAotIwlPVEhFUl9SRUFET05MWV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLnRleHQgLmluaXQgLnJvZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLm1pbGxpKQotIwlPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMgLSBvdGhlciB0aGFuIC5kYXRhIC5ic3MgLmN0b3JzIC5zZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLmdsb2JhbCkKLSMJT1RIRVJfU0VDVElPTlMgLSBhdCB0aGUgZW5kCi0jCUVYRUNVVEFCTEVfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBtdXN0IGJlIGRlZmluZWQgZm9yIGFuCi0jCQlleGVjdXRhYmxlIChlLmcuLCBfRFlOQU1JQ19MSU5LKQotIwlURVhUX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS50ZXh0IHNlY3Rpb24uCi0jCURBVEFfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmRhdGEgc2VjdGlvbi4KLSMJT1RIRVJfQlNTX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5ic3Mgc2VjdGlvbiBiZXNpZGVzIF9fYnNzX3N0YXJ0LgotIwlEQVRBX1BMVCAtIC5wbHQgc2hvdWxkIGJlIGluIGRhdGEgc2VnbWVudCwgbm90IHRleHQgc2VnbWVudC4KLSMJRU1CRURERUQgLSB3aGV0aGVyIHRoaXMgaXMgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbS4gCi0jCi0jIFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBkbyBub3RlIHRoYXQgdGhlIG5hbWVzIG9mIHNvbWUgc2VjdGlvbnMgYXJlIHVzZWQKLSMgd2hlbiBzcGVjaWZ5aW5nIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXh0LgotIwotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLXRlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotaWYgWyAteiAiJE1BQ0hJTkUiIF07IHRoZW4gT1VUUFVUX0FSQ0g9JHtBUkNIfTsgZWxzZSBPVVRQVVRfQVJDSD0ke0FSQ0h9OiR7TUFDSElORX07IGZpCi10ZXN0ICIkTERfRkxBRyIgPSAiTiIgJiYgREFUQV9BRERSPS4KLUlOVEVSUD0iLmludGVycCAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaW50ZXJwKSAJfSIKLVBMVD0iLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnBsdCkJfSIKLQotCi1DVE9SPSIuY3RvcnMgJHtDT05TVFJVQ1RJTkctMH0gOiAKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9TVEFSVH19Ci0gICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgotICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcwotICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKLSAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCi0gICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCi0gICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KLSAgICAgICBpcyBpbi4gICovCi0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQotCi0gICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KLSAgICAgICBmcm9tIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCi0gICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCi0gICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCi0KLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQotICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQotICAgIEtFRVAgKCooLmN0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORyske0NUT1JfRU5EfX0KLSAgfSIKLQotRFRPUj0iIC5kdG9ycyAgICAgICAke0NPTlNUUlVDVElORy0wfSA6Ci0gIHsKLSAgICAke0NPTlNUUlVDVElORyske0RUT1JfU1RBUlR9fQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmR0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKLSAgICBLRUVQICgqKC5kdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX0VORH19Ci0gIH0iCi0KLQotIyBpZiB0aGlzIGlzIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0sIGRvbid0IGFkZCBTSVpFT0ZfSEVBREVSUy4KLWlmIFsgLXogIiRFTUJFRERFRCIgXTsgdGhlbgotICAgdGVzdCAteiAiJHtSRUFET05MWV9CQVNFX0FERFJFU1N9IiAmJiBSRUFET05MWV9CQVNFX0FERFJFU1M9IiR7UkVBRE9OTFlfU1RBUlRfQUREUn0gKyBTSVpFT0ZfSEVBREVSUyIKLWVsc2UKLSAgIHRlc3QgLXogIiR7UkVBRE9OTFlfQkFTRV9BRERSRVNTfSIgJiYgUkVBRE9OTFlfQkFTRV9BRERSRVNTPSIke1JFQURPTkxZX1NUQVJUX0FERFJ9IgotZmkKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtPVVRQVVRfQVJDSH0pCi1FTlRSWSgke0VOVFJZfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQotJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KLSR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCi0gIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCi0gIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCi0gIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99Ci1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgJHtDUkVBVEVfU0hMSUItJHtSRUxPQ0FUSU5HKy4gPSAke1JFQURPTkxZX0JBU0VfQUREUkVTU307fX0KLSAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQi0ke0lOVEVSUH19Ci0gIC5oYXNoICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuaW5pdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5pbml0KQl9Ci0gIC5yZWxhLmluaXQgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuaW5pdCkJfQotICAucmVsLmZpbmkgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZmluaSkJfQotICAucmVsYS5maW5pICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmZpbmkpCX0KLSAgLnJlbC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucGx0KQkJfQotICAke0RBVEFfUExULSR7UExUfX0KLSAgLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGEpICooLmdudS5saW5rb25jZS5yKikgfQotICAucm9kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRE9OTFlfU0VDVElPTlN9fQotCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gICovCi0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFItQUxJR04oNCk7fX0KLQotICAuZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske0RBVEFfU1RBUlRfU1lNQk9MU319Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhLiopCi0gICAgKiguZ251LmxpbmtvbmNlLmQqKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgfQotICAuZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlN9fQotICAke1JFTE9DQVRJTkcrJHtDVE9SfX0KLSAgJHtSRUxPQ0FUSU5HKyR7RFRPUn19Ci0gIC5nb3QgICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQotICAuZHluYW1pYyAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5hbWljKSB9Ci0gICR7REFUQV9QTFQrJHtQTFR9fQotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cwotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCi0gIC5zZGF0YSAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2RhdGEpIH0KLSAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0ID0gLjt9Ci0gICR7UkVMT0NBVElORyske09USEVSX0JTU19TWU1CT0xTfX0KLSAgLnNic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9Ci0gIC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gICR7UkVMT0NBVElORytfZW5kID0gLiA7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZW5kID0gLik7fQotCi0gIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfQotICAuc3RhYi5leGNsIDAgOiB7ICooLnN0YWIuZXhjbCkgfQotICAuc3RhYi5leGNsc3RyIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQotICAuc3RhYi5pbmRleCAwIDogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLQotICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Ci0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9Ci0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotCi0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotCi0gIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQotICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQotICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9Ci0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVMT0NBVElOR19TRUNUSU9OU319Ci0KLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAke1JFTE9DQVRJTkd9LiAgKi8KLSAgJHtPVEhFUl9TRUNUSU9OU30KLQotCi0gIC8qIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0gICAgIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoaS5lLiB0b3Agb2YgNjRLIGRhdGEgc3BhY2UpLiAqLwotICAuc3RhY2sgMHgwMDAwN0ZGRSA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0KLQotICAudGV4dCAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX0FERFJ9fSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX1NZTUJPTFN9fQotICAgIEtFRVAgKCooLmluaXQpKQotICAgIEtFRVAgKCooLmZpbmkpKQotICAgICooLnRleHQpCi0gICAgKigudGV4dC4qKQotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLwotICAgICooLmdudS53YXJuaW5nKQotICAgICooLmdudS5saW5rb25jZS50KikKLSAgfSA9JHtOT1AtMH0KLSAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZXRleHQgPSAuKTt9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmY5MjgzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotCi1DVE9SPSIuY3RvcnMgJHtDT05TVFJVQ1RJTkctMH0gOiAKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjsgfQotICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKLSAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKLSAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90Ci0gICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQotICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQotICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCi0gICAgICAgaXMgaW4uICAqLwotCi0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKLQotICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCi0gICAgICAgZnJvbSB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgotICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQotICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLwotCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmN0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKLSAgICBLRUVQICgqKC5jdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gJHtEQVRBX01FTU9SWX19IgotCi1EVE9SPSIgIC5kdG9ycwkke0NPTlNUUlVDVElORy0wfSA6Ci0gIHsKLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47IH0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5kdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguZHRvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fSIKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLU1FTU9SWQotewotICB0ZXh0ICR7VEVYVF9ERUZfU0VDVElPTn0gOiBPUklHSU4gPSAke1RFWFRfU1RBUlRfQUREUn0sIExFTkdUSCA9ICR7VEVYVF9TSVpFfQotICBkYXRhICR7REFUQV9ERUZfU0VDVElPTn0gOiBPUklHSU4gPSAke0RBVEFfU1RBUlRfQUREUn0sIExFTkdUSCA9ICR7REFUQV9TSVpFfQotICBlbWVtICR7RU1FTV9ERUZfU0VDVElPTn0gOiBPUklHSU4gPSAke0VNRU1fU1RBUlRfQUREUn0sIExFTkdUSCA9ICR7RU1FTV9TSVpFfQotICBlaXQJCQkgICA6IE9SSUdJTiA9ICR7RUlUX1NUQVJUX0FERFJ9LCAgTEVOR1RIID0gJHtFSVRfU0laRX0KLX0KLQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gICR7VEVYVF9EWU5BTUlDKyR7RFlOQU1JQ319Ci0gIC5oYXNoCQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5oYXNoKSB9Ci0gIC5keW5zeW0JCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKSB9Ci0gIC5keW5zdHIJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3RyKSB9Ci0gIC5nbnUudmVyc2lvbgkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbikgfQotICAuZ251LnZlcnNpb25fZAkke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KLSAgLmdudS52ZXJzaW9uX3IJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9yKSB9Ci0KLSAgLnJlbGEudGV4dAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnRleHQpICooLnJlbGEuZ251LmxpbmtvbmNlLnQqKSB9Ci0gIC5yZWxhLmRhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kYXRhKSAqKC5yZWxhLmdudS5saW5rb25jZS5kKikgfQotICAucmVsYS5yb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5yb2RhdGEpICooLnJlbGEuZ251LmxpbmtvbmNlLnIqKSB9Ci0gIC5yZWxhLnN0ZXh0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc3Rlc3QpIH0KLSAgLnJlbGEuZXRleHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ldGVzdCkgfQotICAucmVsYS5zZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNkYXRhKSB9Ci0gIC5yZWxhLmVkYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZWRhdGEpIH0KLSAgLnJlbGEuZWl0X3YJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5laXRfdikgfQotICAucmVsYS5zYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2JzcykgfQotICAucmVsYS5lYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZWJzcykgfQotICAucmVsYS5zcm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc3JvZGF0YSkgfQotICAucmVsYS5lcm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZXJvZGF0YSkgfQotICAucmVsYS5nb3QJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QpIH0KLSAgLnJlbGEuY3RvcnMJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5jdG9ycykgfQotICAucmVsYS5kdG9ycwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmR0b3JzKSB9Ci0gIC5yZWxhLmluaXQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5pbml0KSB9Ci0gIC5yZWxhLmZpbmkJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5maW5pKSB9Ci0gIC5yZWxhLmJzcwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmJzcykgfQotICAucmVsYS5wbHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5wbHQpIH0KLQotICAucmVsLmRhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmRhdGEpICooLnJlbC5nbnUubGlua29uY2UuZCopIH0KLSAgLnJlbC5yb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnJvZGF0YSkgKigucmVsLmdudS5saW5rb25jZS5yKikgfQotICAucmVsLnN0ZXh0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5zdGVzdCkgfQotICAucmVsLmV0ZXh0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5ldGVzdCkgfQotICAucmVsLnNkYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5zZGF0YSkgfQotICAucmVsLmVkYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5lZGF0YSkgfQotICAucmVsLnNic3MJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnNic3MpIH0KLSAgLnJlbC5lYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5lYnNzKSB9Ci0gIC5yZWwuZWl0X3YJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmVpdF92KSB9Ci0gIC5yZWwuc3JvZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuc3JvZGF0YSkgfQotICAucmVsLmVyb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmVyb2RhdGEpIH0KLSAgLnJlbC5nb3QJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmdvdCkgfQotICAucmVsLmN0b3JzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5jdG9ycykgfQotICAucmVsLmR0b3JzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kdG9ycykgfQotICAucmVsLmluaXQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmluaXQpIH0KLSAgLnJlbC5maW5pCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5maW5pKSB9Ci0gIC5yZWwuYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5ic3MpIH0KLSAgLnJlbC5wbHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnBsdCkgfQotCi0gIC5pbml0CQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbml0KSB9ID0ke05PUC0wfQotICAke0RBVEFfUExULSR7UExUfX0KLQotICAvKiBJbnRlcm5hbCB0ZXh0IHNwYWNlICovCi0gIC5zdGV4dAkke1JFTE9DQVRJTkctMH0gOiB7ICooLnN0ZXh0KSB9CQkke1JFTE9DQVRJTkcrID4gdGV4dH0KLQotICAvKiBJbnRlcm5hbCB0ZXh0IHNwYWNlIG9yIGV4dGVybmFsIG1lbW9yeSAqLwotICAudGV4dCA6Ci0gIHsKLSAgICAqKC50ZXh0KQotICAgICooLmdudS5saW5rb25jZS50KikKLSAgICAqKC5pbml0KQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotICB9ICR7UkVMT0NBVElORysgPiAke1RFWFRfTUVNT1JZfX0KLQotICAvKiBJbnRlcm5hbCBkYXRhIHNwYWNlICovCi0gIC5zcm9kYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKiguc3JvZGF0YSkgfQkke1JFTE9DQVRJTkcrID4gZGF0YX0KLSAgLnNkYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKiguc2RhdGEpIH0JCSR7UkVMT0NBVElORysgPiBkYXRhfQotCi0gIC8qIEludGVybmFsIGRhdGEgc3BhY2Ugb3IgZXh0ZXJuYWwgbWVtb3J5ICovCi0gIC5yb2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGEpIH0JJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fQotCi0gIC8qIEMrKyBleGNlcHRpb24gc3VwcG9ydC4gICovCi0gIC5laF9mcmFtZQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmVoX2ZyYW1lKSB9CSR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0KLQotICAke1JFTE9DQVRJTkcrJHtDVE9SfX0KLSAgJHtSRUxPQ0FUSU5HKyR7RFRPUn19Ci0KLSAgLmRhdGEJCSR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmdudS5saW5rb25jZS5kKikKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotICB9ICR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0KLQotICAvKiBFeHRlcm5hbCBtZW1vcnkgKi8KLSAgLmV0ZXh0CSR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZXRleHRfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5ldGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZXRleHRfZW5kID0gLikgOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IGVtZW19Ci0KLSAgLmVyb2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5lcm9kYXRhKSB9CSR7UkVMT0NBVElORysgPiBlbWVtfQotICAuZWRhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5lZGF0YSkgfQkJJHtSRUxPQ0FUSU5HKyA+IGVtZW19Ci0KLSAgLnNic3MJCSR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fc2Jzc19zdGFydCA9IC4pIDsgfQotICAgICooLnNic3MpCi0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX3Nic3NfZW5kID0gLikgOyAgfQotICB9ICR7UkVMT0NBVElORysgPiBkYXRhfQotCi0gIC5lYnNzCQkke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2Vic3Nfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5lYnNzKQotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19lYnNzX2VuZCA9IC4pIDsgIH0KLSAgfSAke1JFTE9DQVRJTkcrID4gZGF0YX0KLQotICAuYnNzCQkke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2Jzc19zdGFydCA9IC4pIDsgfQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fYnNzX2VuZCA9IC4pIDsgfQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotICB9ICR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0KLQotICAuZWl0X3YJJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19laXRfc3RhcnQgPSAuKSA7IH0KLSAgICAqKC5laXRfdikKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZWl0X2VuZCA9IC4pIDsgfQotICB9ICR7UkVMT0NBVElORysgPiBlaXR9Ci0KLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIJCSAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyCSAwIDogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wJIDAgOiB7ICooLnN0YWIuZXhjbCkgfQotICAuc3RhYi5leGNsc3RyCSAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KLSAgLnN0YWIuaW5kZXgJIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQotCi0gIC5jb21tZW50CSAwIDogeyAqKC5jb21tZW50KSB9Ci0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnCSAwIDogeyAqKC5kZWJ1ZykgfQotICAubGluZQkJIDAgOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotCi0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotCi0gIFBST1ZJREUgKF9fc3RhY2sgPSAke1NUQUNLX1NUQVJUX0FERFJ9KTsKLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgYi9sZC9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYWI4ZjguLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvZWxmcHBjLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLSMKLSMgVW51c3VhbCB2YXJpYWJsZXMgY2hlY2tlZCBieSB0aGlzIGNvZGU6Ci0jCU5PUCAtIHR3byBieXRlIG9wY29kZSBmb3Igbm8tb3AgKGRlZmF1bHRzIHRvIDApCi0jCURBVEFfQUREUiAtIGlmIGVuZC1vZi10ZXh0LXBsdXMtb25lLXBhZ2UgaXNuJ3QgcmlnaHQgZm9yIGRhdGEgc3RhcnQKLSMJT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMgLSBvdGhlciB0aGFuIC50ZXh0IC5pbml0IC5yb2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5taWxsaSkKLSMJT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAuZGF0YSAuYnNzIC5jdG9ycyAuc2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5nbG9iYWwpCi0jCU9USEVSX1NFQ1RJT05TIC0gYXQgdGhlIGVuZAotIwlFWEVDVVRBQkxFX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgbXVzdCBiZSBkZWZpbmVkIGZvciBhbgotIwkJZXhlY3V0YWJsZSAoZS5nLiwgX0RZTkFNSUNfTElOSykKLSMJVEVYVF9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkudGV4dCBzZWN0aW9uLgotIwlEQVRBX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5kYXRhIHNlY3Rpb24uCi0jCU9USEVSX0JTU19TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuYnNzIHNlY3Rpb24gYmVzaWRlcyBfX2Jzc19zdGFydC4KLSMKLSMgV2hlbiBhZGRpbmcgc2VjdGlvbnMsIGRvIG5vdGUgdGhhdCB0aGUgbmFtZXMgb2Ygc29tZSBzZWN0aW9ucyBhcmUgdXNlZAotIyB3aGVuIHNwZWNpZnlpbmcgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5leHQuCi0jCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotdGVzdCAteiAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iICYmIEJJR19PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgLXogIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IiAmJiBMSVRUTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0ICIkTERfRkxBRyIgPSAiTiIgJiYgREFUQV9BRERSPS4KLVNCU1MyPSIuc2JzczIgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zYnNzMikgfSIKLVNEQVRBMj0iLnNkYXRhMiAke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhMikgfSIKLUlOVEVSUD0iLmludGVycCAke1JFTE9DQVRJTkctMH0gOiB7ICooLmludGVycCkgfSIKLVBMVD0iLnBsdCAke1JFTE9DQVRJTkctMH0gOiB7ICooLnBsdCkgfSIKLUNUT1I9Ii5jdG9ycyAke0NPTlNUUlVDVElORy0wfSA6IAotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrJHtDVE9SX1NUQVJUfX0KLSAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCi0gICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCi0gICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAotICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKLSAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKLSAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubwotICAgICAgIGlzIGluLiAgKi8KLQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCi0KLSAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQotICAgICAgIGZyb20gdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KLSAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKLSAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KLQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguY3RvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9FTkR9fQotICB9IgotCi1EVE9SPSIgLmR0b3JzICAgICAgICR7Q09OU1RSVUNUSU5HLTB9IDoKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyR7RFRPUl9TVEFSVH19Ci0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuZHRvcnMpKQotICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQotICAgIEtFRVAgKCooLmR0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORyske0RUT1JfRU5EfX0KLSAgfSIKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKLQkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLUVOVFJZKCR7RU5UUll9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtSRUxPQ0FUSU5HKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAke1NUQUNLWkVSTyske1NUQUNLWkVST319ICR7U0hMSUJfUEFUSCske1NITElCX1BBVEh9fSAgKi99Ci0ke1JFTE9DQVRJTkcrJHtFWEVDVVRBQkxFX1NZTUJPTFN9fQotJHtSRUxPQ0FUSU5HLSAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKLSAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKLSAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKLSAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqL30KLQotJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fc3RhY2sgPSAwKTt9Ci0ke1JFTE9DQVRJTkcrUFJPVklERSAoX19fc3RhY2sgPSAwKTt9Ci1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgJHtDUkVBVEVfU0hMSUItJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn0gKyBTSVpFT0ZfSEVBREVSUzt9fQotICAke0NSRUFURV9TSExJQiske1JFTE9DQVRJTkcrLiA9IFNJWkVPRl9IRUFERVJTO319Ci0gICR7Q1JFQVRFX1NITElCLSR7SU5URVJQfX0KLSAgLmhhc2gJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0cgkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN0cikJCX0KLSAgLmdudS52ZXJzaW9uICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb24pICAgICAgfQotICAuZ251LnZlcnNpb25fZCAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX2QpICB9Ci0gIC5nbnUudmVyc2lvbl9yICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb25fcikgIH0KLSAgLnJlbGEudGV4dCAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsYS50ZXh0KQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEudGV4dC4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS50Kil9Ci0gICAgfQotICAucmVsYS5kYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLmRhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5kYXRhLiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZ251LmxpbmtvbmNlLmQqKX0KLSAgICB9Ci0gIC5yZWxhLnJvZGF0YSAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEucm9kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEucm9kYXRhLiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZ251LmxpbmtvbmNlLnIqKX0KLSAgICB9Ci0gIC5yZWxhLmdvdAkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290KQl9Ci0gIC5yZWxhLmdvdDEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdDEpCX0KLSAgLnJlbGEuZ290Mgkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290MikJfQotICAucmVsYS5jdG9ycwkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbGEuZHRvcnMJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWxhLmluaXQJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmluaXQpCX0KLSAgLnJlbGEuZmluaQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZmluaSkJfQotICAucmVsYS5ic3MJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsYS5wbHQJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnBsdCkJfQotICAucmVsYS5zZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2RhdGEpCX0KLSAgLnJlbGEuc2Jzcwkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2JzcykJfQotICAucmVsYS5zZGF0YTIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNkYXRhMikJfQotICAucmVsYS5zYnNzMgkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2JzczIpCX0KLSAgLnRleHQgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfU1lNQk9MU319Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrKigudGV4dC4qKX0KLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KLSAgICAqKC5nbnUud2FybmluZykKLSAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLnQqKX0KLSAgfSA9JHtOT1AtMH0KLSAgLmluaXQJCSR7UkVMT0NBVElORy0wfSA6IHsgS0VFUCAoKiguaW5pdCkpCX0gPSR7Tk9QLTB9Ci0gIC5maW5pCQkke1JFTE9DQVRJTkctMH0gOiB7IEtFRVAgKCooLmZpbmkpKQl9ID0ke05PUC0wfQotICAucm9kYXRhICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgKigucm9kYXRhKQotICAgICR7UkVMT0NBVElORysqKC5yb2RhdGEuKil9Ci0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS5yKil9Ci0gIH0KLSAgLnJvZGF0YTEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGExKSB9Ci0gICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGV0ZXh0ID0gLik7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19ldGV4dCA9IC4pO30KLSAgJHtDUkVBVEVfU0hMSUItJHtTREFUQTJ9fQotICAke0NSRUFURV9TSExJQi0ke1NCU1MyfX0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRE9OTFlfU0VDVElPTlN9fQotCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczoKLSAgICAgICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLUFMSUdOKCR7TUFYUEFHRVNJWkV9KSArIChBTElHTig4KSAmICgke01BWFBBR0VTSVpFfSAtIDEpKX07fQotICAgICBUaGUgY3VycmVudCBleHByZXNzaW9uIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugb2YgYQotICAgICB0ZXh0IHNlZ21lbnQgZW5kaW5nIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIGEgcGFnZTsgaXQgY2F1c2VzIHRoZQotICAgICBkYXRhIHNlZ21lbnQgdG8gc2tpcCBhIHBhZ2UuICBUaGUgYWJvdmUgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlCi0gICAgIHRoaXMgcHJvYmxlbSwgYnV0IGl0IHdpbGwgY3VycmVudGx5ICgyLzk1KSBjYXVzZSBCRkQgdG8gYWxsb2NhdGUKLSAgICAgYSBzaW5nbGUgc2VnbWVudCwgY29tYmluaW5nIGJvdGggdGV4dCBhbmQgZGF0YSwgZm9yIHRoaXMgY2FzZS4KLSAgICAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHRleHQgc2VnbWVudCBmcm9tIGJlaW5nIHNoYXJlZCBhbW9uZwotICAgICBtdWx0aXBsZSBleGVjdXRpb25zIG9mIHRoZSBwcm9ncmFtOyBJIHRoaW5rIHRoYXQgaXMgbW9yZQotICAgICBpbXBvcnRhbnQgdGhhbiBsb3NpbmcgYSBwYWdlIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKG5vdGUKLSAgICAgdGhhdCBubyBhY3R1YWwgbWVtb3J5IGlzIGxvc3Q7IHRoZSBwYWdlIHdoaWNoIGlzIHNraXBwZWQgY2FuIG5vdAotICAgICBiZSByZWZlcmVuY2VkKS4gICovCi0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFItIEFMSUdOKDgpICsgJHtNQVhQQUdFU0laRX19O30KLQotICAuZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORyske0RBVEFfU1RBUlRfU1lNQk9MU319Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrKiguZGF0YS4qKX0KLSAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLmQqKX0KLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gIH0KLSAgLmRhdGExICR7UkVMT0NBVElORy0wfSA6IHsgKiguZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TfX0KLQotICAuZ290MQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QxKSB9Ci0gIC5keW5hbWljCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluYW1pYykgfQotCi0gIC8qIFB1dCAuY3RvcnMgYW5kIC5kdG9ycyBuZXh0IHRvIHRoZSAuZ290MiBzZWN0aW9uLCBzbyB0aGF0IHRoZSBwb2ludGVycwotICAgICBnZXQgcmVsb2NhdGVkIHdpdGggLW1yZWxvY2F0YWJsZS4gQWxzbyBwdXQgaW4gdGhlIC5maXh1cCBwb2ludGVycy4KLSAgICAgVGhlIGN1cnJlbnQgY29tcGlsZXIgbm8gbG9uZ2VyIG5lZWRzIHRoaXMsIGJ1dCBrZWVwIGl0IGFyb3VuZCBmb3IgMi43LjIgICovCi0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9HT1QyX1NUQVJUXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fR09UMl9TVEFSVF8gPSAuKTt9Ci0gIC5nb3QyCQkke1JFTE9DQVRJTkctMH0gOiAgeyAqKC5nb3QyKSB9Ci0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fQ1RPUl9MSVNUX18gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX19DVE9SX0xJU1RfXyA9IC4pO30KLSAgICAgICAgICAgICAgICAke1JFTE9DQVRJTkcrJHtDVE9SfX0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fQ1RPUl9FTkRfXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX0NUT1JfRU5EX18gPSAuKTt9Ci0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fRFRPUl9MSVNUX18gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX19EVE9SX0xJU1RfXyA9IC4pO30KLSAgICAgICAgICAgICAgICAke1JFTE9DQVRJTkcrJHtEVE9SfX0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fRFRPUl9FTkRfXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX0RUT1JfRU5EX18gPSAuKTt9Ci0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9GSVhVUF9TVEFSVF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0ZJWFVQX1NUQVJUXyA9IC4pO30KLSAgLmZpeHVwCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZml4dXApIH0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9GSVhVUF9FTkRfID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19GSVhVUF9FTkRfID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX0dPVDJfRU5EXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fR09UMl9FTkRfID0gLik7fQotCi0JCSR7UkVMT0NBVElORytQUk9WSURFIChfR09UX1NUQVJUXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fR09UX1NUQVJUXyA9IC4pO30KLSAgLmdvdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QpIH0KLSAgLmdvdC5wbHQJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QucGx0KSB9Ci0gICR7Q1JFQVRFX1NITElCKyR7U0RBVEEyfX0KLSAgJHtDUkVBVEVfU0hMSUIrJHtTQlNTMn19Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfR09UX0VORF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVF9FTkRfID0gLik7fQotCi0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KLSAgLnNkYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKiguc2RhdGEpIH0KLSAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZWRhdGEgPSAuKTt9Ci0gIC5zYnNzICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19zYnNzX3N0YXJ0ID0gLik7fQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX19zYnNzX3N0YXJ0ID0gLik7fQotICAgICooLnNic3MpCi0gICAgKiguc2NvbW1vbikKLSAgICAqKC5keW5zYnNzKQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX3Nic3NfZW5kID0gLik7fQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX19zYnNzX2VuZCA9IC4pO30KLSAgfQotICAke1BMVH0KLSAgLmJzcyAgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfQlNTX1NZTUJPTFN9fQotICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fYnNzX3N0YXJ0ID0gLik7fQotICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX2Jzc19zdGFydCA9IC4pO30KLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gICR7UkVMT0NBVElORytfZW5kID0gLiA7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZW5kID0gLik7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19lbmQgPSAuKTt9Ci0KLSAgLyogVGhlc2UgYXJlIG5lZWRlZCBmb3IgRUxGIGJhY2tlbmRzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuCi0gICAgIGNvbnZlcnRlZCB0byB0aGUgbmV3IHN0eWxlIGxpbmtlci4gICovCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfQotCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLQotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQotCi0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KLSAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KLSAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQotCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgJHtSRUxPQ0FUSU5HfS4gICovCi0gICR7T1RIRVJfU0VDVElPTlN9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2Vwb2NwZS5zYyBiL2xkL3NjcmlwdHRlbXBsL2Vwb2NwZS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhNjY5Ni4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9lcG9jcGUuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBQRS4KLQotaWYgdGVzdCAteiAiJHtSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVH0iOyB0aGVuCi0gIFJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLWZpCi0KLSMgV2UgY2FuJ3QgZWFzaWx5IGFuZCBwb3J0YWJseSBnZXQgYW4gdW5xdW90ZWQgJCBpbiBhIHNoZWxsCi0jIHN1YnN0aXR1dGlvbiwgc28gd2UgZG8gdGhpcyBpbnN0ZWFkLgotIyBTb3J0aW5nIG9mIHRoZSAuZm9vJCogc2VjdGlvbnMgaXMgcmVxdWlyZWQgYnkgdGhlIGRlZmluaXRpb24gb2YKLSMgZ3JvdXBlZCBzZWN0aW9ucyBpbiBQRS4KLSMgU29ydGluZyBvZiB0aGUgZmlsZSBuYW1lcyBpbiBSX0lEQVRBIGlzIHJlcXVpcmVkIGJ5IHRoZQotIyBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGRsbHRvb2wgKHRoaXMgY291bGQgcHJvYmFibHkgYmUgY2hhbmdlZCB0bwotIyB1c2UgZ3JvdXBlZCBzZWN0aW9ucyBpbnN0ZWFkKS4KLWlmIHRlc3QgIiR7UkVMT0NBVElOR30iOyB0aGVuCi0gIFJfVEVYVD0nKihTT1JUKC50ZXh0JCopKScKLSAgUl9EQVRBPScqKFNPUlQoLmRhdGEkKikpJwotICBSX1JEQVRBPScqKFNPUlQoLnJkYXRhJCopKScKLSAgUl9JREFUQT0nCi0gICAgU09SVCgqKSguaWRhdGEkMikKLSAgICBTT1JUKCopKC5pZGF0YSQzKQotICAgIC8qIFRoZXNlIHplcm9lcyBtYXJrIHRoZSBlbmQgb2YgdGhlIGltcG9ydCBsaXN0LiAgKi8KLSAgICBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7Ci0gICAgU09SVCgqKSguaWRhdGEkNCkKLSAgICBTT1JUKCopKC5pZGF0YSQ1KQotICAgIFNPUlQoKikoLmlkYXRhJDYpCi0gICAgU09SVCgqKSguaWRhdGEkNyknCi0gIFJfQ1JUPScqKFNPUlQoLkNSVCQqKSknCi0gIFJfUlNSQz0nKihTT1JUKC5yc3JjJCopKScKLWVsc2UKLSAgUl9URVhUPQotICBSX0RBVEE9Ci0gIFJfUkRBVEE9Ci0gIFJfSURBVEE9Ci0gIFJfQ1JUPQotICBSX1JTUkM9Ci1maQotCi1jYXQgPDxFT0YKLSR7UkVMT0NBVElORytPVVRQVVRfRk9STUFUKCR7T1VUUFVUX0ZPUk1BVH0pfQotJHtSRUxPQ0FUSU5HLU9VVFBVVF9GT1JNQVQoJHtSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVH0pfQotCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoX21haW5DUlRTdGFydHVwKQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIF9faW1hZ2VfYmFzZV9fICsgX19zZWN0aW9uX2FsaWdubWVudF9fIH0gOiAKLSAgewotICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9Ci0gICAgKigudGV4dCkKLSAgICAke1JfVEVYVH0KLSAgICAqKC5nbHVlXzd0KQotICAgICooLmdsdWVfNykKLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuOyBfX0NUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47IF9fRFRPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmR0b3JzKTsgKiguZHRvcik7ICBMT05HICgwKTsgfQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgLyogPz8/IFdoeSBpcyAuZ2NjX2V4YyBoZXJlPyAgKi8KLSAgICAke1JFTE9DQVRJTkcrICooLmdjY19leGMpfQotICAgICR7UkVMT0NBVElORysgZXRleHQgPSAuO30KLSAgICAqKC5nY2NfZXhjZXB0X3RhYmxlKQotCi0gICAgLyogRm9yIEVQT0MgdGhlIHJlYWQgb25seSBkYXRhIGlzIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgLnRleHQKLSAgICBzZWN0aW9uICovCi0gICAgKigucmRhdGEpCi0gICAgJHtSX1JEQVRBfQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0KLSAgLyogVGhlIEN5Z3dpbjMyIGxpYnJhcnkgdXNlcyBhIHNlY3Rpb24gdG8gYXZvaWQgY29weWluZyBjZXJ0YWluIGRhdGEKLSAgICAgb24gZm9yay4gIFRoaXMgdXNlZCB0byBiZSBuYW1lZCAiLmRhdGEkbm9jb3B5Ii4gIFRoZSBsaW5rZXIgdXNlZAotICAgICB0byBpbmNsdWRlIHRoaXMgYmV0d2VlbiBfX2RhdGFfc3RhcnRfXyBhbmQgX19kYXRhX2VuZF9fLCBidXQgdGhhdAotICAgICBicmVha3MgYnVpbGRpbmcgdGhlIGN5Z3dpbjMyIGRsbC4gIEluc3RlYWQsIHdlIG5hbWUgdGhlIHNlY3Rpb24KLSAgICAgIi5kYXRhX2N5Z3dpbl9ub2NvcHkiIGFuZCBleHBsaWN0bHkgaW5jbHVkZSBpdCBhZnRlciBfX2RhdGFfZW5kX18uICovCi0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMikKLSAgICAke1JfREFUQX0KLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX2VuZF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysqKC5kYXRhX2N5Z3dpbl9ub2NvcHkpfQotICB9Ci0KLSAgLmJzcyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORytfX2Jzc19lbmRfXyA9IC4gO30KLSAgfQotCi0gIC5lZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgKiguZWRhdGEpCi0gIH0KLQotICAvRElTQ0FSRC8gOgotICB7Ci0gICAgKiguZGVidWdcJFMpCi0gICAgKiguZGVidWdcJFQpCi0gICAgKiguZGVidWdcJEYpCi0gICAgKiguZHJlY3R2ZSkKLSAgfQotCi0gIC5pZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogVGhpcyBjYW5ub3QgY3VycmVudGx5IGJlIGhhbmRsZWQgd2l0aCBncm91cGVkIHNlY3Rpb25zLgotCVNlZSBwZS5lbTpzb3J0X3NlY3Rpb25zLiAgKi8KLSAgICAke1JfSURBVEF9Ci0gIH0KLSAgCi0gIC5DUlQgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICR7Ul9DUlR9Ci0gIH0KLQotICAuZW5kanVuayAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogZW5kIGlzIGRlcHJlY2F0ZWQsIGRvbid0IHVzZSBpdCAqLwotICAgICR7UkVMT0NBVElORysgZW5kID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX2VuZF9fID0gLjt9Ci0gIH0KLQotICAucmVsb2MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICooLnJlbG9jKQotICB9Ci0KLSAgLnJzcmMgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICooLnJzcmMpCi0gICAgJHtSX1JTUkN9Ci0gIH0KLQotICAuc3RhYiAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotCi0gIC5zdGFic3RyICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDgzMDAuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODMwMC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmODc2ZS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODMwMC5zYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotRU5UUlkoIl9zdGFydCIpCi0KLU1FTU9SWQotewotCS8qIDB4YzQgaXMgYSBtYWdpYyBlbnRyeS4gIFdlIHNob3VsZCBoYXZlIHRoZSBsaW5rZXIganVzdAotCSAgIHNraXAgb3ZlciBpdCBvbmUgZGF5Li4uICovCi0JdmVjdG9ycyA6IG8gPSAweDAwMDAsIGwgPSAweGM0Ci0JbWFnaWN2ZWN0b3JzIDogbyA9IDB4YzQsIGwgPSAweDNjCi0JcmFtICAgIDogbyA9IDB4MDEwMCwgbCA9IDB4ZmRmYwotCS8qIFRoZSBzdGFjayBzdGFydHMgYXQgdGhlIHRvcCBvZiBtYWluIHJhbS4gICovCi0JdG9wcmFtIDogbyA9IDB4ZmVmYywgbCA9IDB4NAotCS8qIEF0IHRoZSB2ZXJ5IHRvIG9mIHRoZSBhZGRyZXNzIHNwYWNlIGlzIHRoZSA4LWJpdCBhcmVhLiAgKi8KLQllaWdodCA6IG8gPSAweGZmMDAsIGwgPSAweDEwMAotfQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udmVjdG9ycyA6IHsKLQkvKiBVc2Ugc29tZXRoaW5nIGxpa2UgdGhpcyB0byBwbGFjZSBhIHNwZWNpZmljIGZ1bmN0aW9uJ3MgYWRkcmVzcwotCSAgIGludG8gdGhlIHZlY3RvciB0YWJsZS4gCi0KLQlTSE9SVChBQlNPTFVURShfZm9vYmFyKSkgKi8KLQotCSooLnZlY3RvcnMpCi0gICAgICAgIH0gJHtSRUxPQ0FUSU5HKyA+IHZlY3RvcnN9Ci0KLS50ZXh0IDoJeyAJCQkJCQotCSooLnJvZGF0YSkgCQkJCQotCSooLnRleHQpIAkJCQkKLQkqKC5zdHJpbmdzKQotICAgCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0udG9ycyA6IHsKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmRhdGEgOiB7Ci0JKiguZGF0YSkKLQkqKC50aW55KQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0uYnNzIDogewotCSR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC4gO30KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfSAke1JFTE9DQVRJTkcrID5yYW19Ci0uc3RhY2sgOiB7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRvcHJhbX0KLS5laWdodCA6IHsKLQkqKC5laWdodCkKLQl9ICR7UkVMT0NBVElORysgPiBlaWdodH0KLS5zdGFiIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsKLQlbIC5zdGFiIF0KLQl9Ci0uc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYnN0ciBdCi0JfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODMwMGguc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODMwMGguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxY2ZkODYuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDgzMDBoLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKGg4MzAwaCkKLUVOVFJZKCJfc3RhcnQiKQotCi0vKiBUaGUgbWVtb3J5IHNpemUgaXMgMjU2S0IgdG8gY29pbmNpZGUgd2l0aCB0aGUgc2ltdWxhdG9yLgotICAgRG9uJ3QgY2hhbmdlIGVpdGhlciB3aXRob3V0IGNvbnNpZGVyaW5nIHRoZSBvdGhlci4gICovCi0KLU1FTU9SWQotewotICAgICAgICAvKiAweGM0IGlzIGEgbWFnaWMgZW50cnkuICBXZSBzaG91bGQgaGF2ZSB0aGUgbGlua2VyIGp1c3QKLSAgICAgICAgICAgc2tpcCBvdmVyIGl0IG9uZSBkYXkuLi4gKi8KLSAgICAgICAgdmVjdG9ycyA6IG8gPSAweDAwMDAsIGwgPSAweGM0Ci0gICAgICAgIG1hZ2ljdmVjdG9ycyA6IG8gPSAweGM0LCBsID0gMHgzYwotCS8qIFdlIHN0aWxsIG9ubHkgdXNlIDI1NmsgYXMgdGhlIG1haW4gcmFtIHNpemUuICAqLwotCXJhbSAgICA6IG8gPSAweDAxMDAsIGwgPSAweDNmZWZjCi0JLyogVGhlIHN0YWNrIHN0YXJ0cyBhdCB0aGUgdG9wIG9mIG1haW4gcmFtLiAgKi8KLQl0b3ByYW0gOiBvID0gMHgzZmZmYywgbCA9IDB4NAotCS8qIFRoaXMgaG9sZHMgdmFyaWFibGVzIGluIHRoZSAidGlueSIgc2VjdGlvbnMuICAqLwotCXRpbnkgICA6IG8gPSAweGZmODAwMCwgbCA9IDB4N2YwMAotCS8qIEF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgYWRkcmVzcyBzcGFjZSBpcyB0aGUgOC1iaXQgYXJlYS4gICovCi0JZWlnaHQgIDogbyA9IDB4ZmZmZjAwLCBsID0gMHgxMDAKLX0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnZlY3RvcnMgOiB7Ci0JLyogVXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gcGxhY2UgYSBzcGVjaWZpYyBmdW5jdGlvbidzIGFkZHJlc3MKLQkgICBpbnRvIHRoZSB2ZWN0b3IgdGFibGUuCi0KLQlMT05HKEFCU09MVVRFKF9mb29iYXIpKSAqLwotCi0JKigudmVjdG9ycykKLQl9ICR7UkVMT0NBVElORysgPiB2ZWN0b3JzfQotLnRleHQgOgl7IAkJCQkJCi0JKigucm9kYXRhKSAJCQkJCi0JKigudGV4dCkgCQkJCQotCSooLnN0cmluZ3MpCi0gICAJJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS50b3JzIDogewotCV9fX2N0b3JzID0gLiA7Ci0JKiguY3RvcnMpCi0JX19fY3RvcnNfZW5kID0gLiA7Ci0JX19fZHRvcnMgPSAuIDsKLQkqKC5kdG9ycykKLQlfX19kdG9yc19lbmQgPSAuIDsKLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0uZGF0YSA6IHsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0uYnNzIDogewotCSR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC4gO30KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfSAke1JFTE9DQVRJTkcrID5yYW19Ci0uc3RhY2sgOiB7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRvcHJhbX0KLS50aW55IDogewotCSooLnRpbnkpCi0JfSAke1JFTE9DQVRJTkcrID4gdGlueX0KLS5laWdodCA6IHsKLQkqKC5laWdodCkKLQl9ICR7UkVMT0NBVElORysgPiBlaWdodH0KLS5zdGFiIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsKLQlbIC5zdGFiIF0KLQl9Ci0uc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYnN0ciBdCi0JfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODMwMHMuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODMwMHMuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDc0ZmMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDgzMDBzLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKGg4MzAwcykKLUVOVFJZKCJfc3RhcnQiKQotCi0vKiBUaGUgbWVtb3J5IHNpemUgaXMgMjU2S0IgdG8gY29pbmNpZGUgd2l0aCB0aGUgc2ltdWxhdG9yLgotICAgRG9uJ3QgY2hhbmdlIGVpdGhlciB3aXRob3V0IGNvbnNpZGVyaW5nIHRoZSBvdGhlci4gICovCi0KLU1FTU9SWQotewotICAgICAgICAvKiAweGM0IGlzIGEgbWFnaWMgZW50cnkuICBXZSBzaG91bGQgaGF2ZSB0aGUgbGlua2VyIGp1c3QKLSAgICAgICAgICAgc2tpcCBvdmVyIGl0IG9uZSBkYXkuLi4gKi8KLSAgICAgICAgdmVjdG9ycyA6IG8gPSAweDAwMDAsIGwgPSAweGM0Ci0gICAgICAgIG1hZ2ljdmVjdG9ycyA6IG8gPSAweGM0LCBsID0gMHgzYwotCS8qIFdlIHN0aWxsIG9ubHkgdXNlIDI1NmsgYXMgdGhlIG1haW4gcmFtIHNpemUuICAqLwotCXJhbSAgICA6IG8gPSAweDAxMDAsIGwgPSAweDNmZWZjCi0JLyogVGhlIHN0YWNrIHN0YXJ0cyBhdCB0aGUgdG9wIG9mIG1haW4gcmFtLiAgKi8KLQl0b3ByYW0gOiBvID0gMHgzZmZmYywgbCA9IDB4NAotCS8qIFRoaXMgaG9sZHMgdmFyaWFibGVzIGluIHRoZSAidGlueSIgc2VjdGlvbnMuICAqLwotCXRpbnkgICA6IG8gPSAweGZmODAwMCwgbCA9IDB4N2YwMAotCS8qIEF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgYWRkcmVzcyBzcGFjZSBpcyB0aGUgOC1iaXQgYXJlYS4gICovCi0JZWlnaHQgIDogbyA9IDB4ZmZmZjAwLCBsID0gMHgxMDAKLX0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnZlY3RvcnMgOiB7Ci0JLyogVXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gcGxhY2UgYSBzcGVjaWZpYyBmdW5jdGlvbidzIGFkZHJlc3MKLQkgICBpbnRvIHRoZSB2ZWN0b3IgdGFibGUuCi0KLQlMT05HKEFCU09MVVRFKF9mb29iYXIpKSAqLwotCi0JKigudmVjdG9ycykKLQl9ICR7UkVMT0NBVElORysgPiB2ZWN0b3JzfQotLnRleHQgOgl7IAkJCQkJCi0JKigucm9kYXRhKSAJCQkJCi0JKigudGV4dCkgCQkJCQotCSooLnN0cmluZ3MpCi0gICAJJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS50b3JzIDogewotCV9fX2N0b3JzID0gLiA7Ci0JKiguY3RvcnMpCi0JX19fY3RvcnNfZW5kID0gLiA7Ci0JX19fZHRvcnMgPSAuIDsKLQkqKC5kdG9ycykKLQlfX19kdG9yc19lbmQgPSAuIDsKLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0uZGF0YSA6IHsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0uYnNzIDogewotCSR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC4gO30KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfSAke1JFTE9DQVRJTkcrID5yYW19Ci0uc3RhY2sgOiB7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRvcHJhbX0KLS50aW55IDogewotCSooLnRpbnkpCi0JfSAke1JFTE9DQVRJTkcrID4gdGlueX0KLS5laWdodCA6IHsKLQkqKC5laWdodCkKLQl9ICR7UkVMT0NBVElORysgPiBlaWdodH0KLS5zdGFiIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsKLQlbIC5zdGFiIF0KLQl9Ci0uc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYnN0ciBdCi0JfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODUwMC5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4NTAwLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmEzOWVlLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLS8qIENvZGUgYW5kIGRhdGEgNjRrIHRvdGFsICovCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0ICR7UkVMT0NBVElORysgMHgwMDAwIH0gOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQotICAgCSAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfQotCi0KLS5kYXRhICAke1JFTE9DQVRJTkcrIC4gfSA6Ci0JewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gCi0KLS5yZGF0YSAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkqKC5yZGF0YSk7IAotCSAgKiguc3RyaW5ncykKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci19IAotCi0uYnNzICAke1JFTE9DQVRJTkcrIC4gfSA6Ci0JewotCSR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9Ci0KLS5zdGFjayAgJHtSRUxPQ0FUSU5HKyAweGZmZjB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gCi0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwYi5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4NTAwYi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1ZmEyYy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODUwMGIuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotLyogQ29kZSBhbmQgZGF0YSwgYm90aCBsYXJnZXIgdGhhbiA2NGsgKi8KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgJHtSRUxPQ0FUSU5HKyAweDEwMDAwfSA6Ci0JeyAJCQkJCQotCSAgKigudGV4dCkgCQkJCQotCi0gICAJICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9Ci0KLQotLmRhdGEgICR7UkVMT0NBVElORysgMHgyMDAwMH0gOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9IAotCi0ucmRhdGEgICR7UkVMT0NBVElORysgMHgzMDAwMH0gOgotCXsKLQkqKC5yZGF0YSk7IAotCSAgKiguc3RyaW5ncykKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci19IAotCi0uYnNzICAke1JFTE9DQVRJTkcrIDB4NDAwMDB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2JzcyA9IC4gOyB9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0KLQotLnN0YWNrICAke1JFTE9DQVRJTkcrIDB4NTAwMDB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gCi0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwYy5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4NTAwYy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM4ODBlMy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODUwMGMuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotLyogQ29tcGFjdCBtb2RlbCAtIGNvZGUgPCA2NGssIGRhdGEgPiA2NGsgKi8KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgMHgxMDAwMCA6Ci0JeyAJCQkJCQotCSAgKigudGV4dCkgCQkJCQotCSAgKiguc3RyaW5ncykKLSAgIAkgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLQotCi0uZGF0YSAweDIwMDAwIDoKLQl7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotCi0ucmRhdGEgMHgzMDAwMCAgOiB7Ci0JKigucmRhdGEpOyAKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci19ICAke1JFTE9DQVRJTkcrID4gcmFtfQotCi0uYnNzICAweDQwMDAwIDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2JzcyA9IC4gOyB9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQotLnN0YWNrIDB4NWZmZjAgOgotCXsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JfSAke1JFTE9DQVRJTkcrID4gdG9wcmFtfQotCi0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODUwMG0uc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMG0uc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MGE0YTcuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBtLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLS8qIENvZGUgYW5kIGRhdGEsIGJvdGggbGFyZ2VyIHRoYW4gNjRrICovCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0ICR7UkVMT0NBVElORysgMHgxMDAwMH0gOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLSAgIAkgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0KLQotCi0uZGF0YSAgJHtSRUxPQ0FUSU5HKyAweDIwMDAwfSA6Ci0JewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gCi0KLS5yZGF0YSAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkqKC5yZGF0YSk7IAotCSAgKiguc3RyaW5ncykKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci0JfSAKLQotLmJzcyAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9fc3RhcnRfYnNzID0gLiA7IH0KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfQotCi0uc3RhY2sgICR7UkVMT0NBVElORysgMHgyZmZmMH0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JfSAKLQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBzLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDg1MDBzLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTYxNWQ4Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0vKiBDb2RlIGFuZCBkYXRhLCBib3RoIDY0ayAqLwotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCAke1JFTE9DQVRJTkcrIDB4MTAwMDAgfSA6Ci0JeyAJCQkJCQotCSooLnRleHQpIAkJCQkKLSAgIAkke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfQotCi0ucmRhdGEgICR7UkVMT0NBVElORysgMHgyMDAwMCB9IDoKLQl7Ci0JKigucmRhdGEpOyAKLQkqKC5zdHJpbmdzKQotCV9fX2N0b3JzID0gLiA7Ci0JKiguY3RvcnMpCi0JX19fY3RvcnNfZW5kID0gLiA7Ci0JX19fZHRvcnMgPSAuIDsKLQkqKC5kdG9ycykKLQlfX19kdG9yc19lbmQgPSAuIDsKLQl9Ci0KLS5kYXRhICAke1JFTE9DQVRJTkcrIC4gfSA6Ci0JewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gCi0KLS5ic3MgICR7UkVMT0NBVElORysgLn0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9fc3RhcnRfYnNzID0gLiA7IH0KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfQotCi0uc3RhY2sgICR7UkVMT0NBVElORysgMHgyZmZmMH0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JfSAKLQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaHBwYWVsZi5zYyBiL2xkL3NjcmlwdHRlbXBsL2hwcGFlbGYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MWNlMDguLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaHBwYWVsZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLURBVEFfQUREUj0weDQwMDAwMDAwCi10ZXN0ICIkTERfRkxBRyIgPSAiTiIgJiYgREFUQV9BRERSPS4KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotRU5UUlkoIlwkU1RBUlRcJCIpCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotU0VDVElPTlMKLXsKLSAgLnRleHQgMHgxMDAwICR7UkVMT0NBVElORysrJHtURVhUX1NUQVJUX0FERFJ9fToKLSAgewotICAgICR7UkVMT0NBVElORytfX3RleHRfc3RhcnQgPSAufTsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAqKC5QQVJJU0Muc3R1YnMpCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrZXRleHQgPSAufTsKLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLn07Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUn07fQotICAuZGF0YSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIC4gPSAuICsgMHgxMDAwIH07Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9zdGFydCA9IC59OwotICAgICooLmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICAgICR7UkVMT0NBVElORytlZGF0YSA9IC59OwotICAgICR7UkVMT0NBVElORytfZWRhdGEgPSAufTsKLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSfSArIFNJWkVPRiguZGF0YSk7fQotICAuYnNzIDoKLSAgewotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrZW5kID0gLiB9OwotICAgJHtSRUxPQ0FUSU5HK19lbmQgPSAuIH07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTM4NmJlb3Muc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2YmVvcy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmZmRlMS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9pMzg2YmVvcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIFBFLgotCi1pZiB0ZXN0IC16ICIke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSI7IHRoZW4KLSAgUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotZmkKLQotIyBXZSBjYW4ndCBlYXNpbHkgYW5kIHBvcnRhYmx5IGdldCBhbiB1bnF1b3RlZCAkIGluIGEgc2hlbGwKLSMgc3Vic3RpdHV0aW9uLCBzbyB3ZSBkbyB0aGlzIGluc3RlYWQuCi1pZiB0ZXN0ICIke1JFTE9DQVRJTkd9IjsgdGhlbgotICBSX1RFWFQ9JyooLnRleHQkKiknCi0gIFJfREFUQT0nKiguZGF0YSQqKScKLSAgUl9SREFUQT0nKigucmRhdGEkKiknCi0gIFJfSURBVEE9JwotICAgICooLmlkYXRhJDIpCi0gICAgKiguaWRhdGEkMykKLSAgICAvKiBUaGVzZSB6ZXJvZXMgbWFyayB0aGUgZW5kIG9mIHRoZSBpbXBvcnQgbGlzdC4gICovCi0gICAgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOwotICAgICooLmlkYXRhJDQpCi0gICAgKiguaWRhdGEkNSkKLSAgICAqKC5pZGF0YSQ2KQotICAgICooLmlkYXRhJDcpJwotICBSX0NSVD0nKiguQ1JUJCopJwotICBSX1JTUkM9JyooLnJzcmMkKiknCi0gIFJfRVhDPScqKC5leGMkKiknCi1lbHNlCi0gIFJfVEVYVD0KLSAgUl9EQVRBPQotICBSX1JEQVRBPQotICBSX0lEQVRBPQotICBSX0NSVD0KLSAgUl9SU1JDPQotICBSX0VYQz0KLWZpCi0KLWNhdCA8PEVPRgotJHtSRUxPQ0FUSU5HK09VVFBVVF9GT1JNQVQoJHtPVVRQVVRfRk9STUFUfSl9Ci0ke1JFTE9DQVRJTkctT1VUUFVUX0ZPUk1BVCgke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSl9Ci0KLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWShfX3N0YXJ0KQotJHtSRUxPQ0FUSU5HK2hlYWRlciA9IC47fQotJHtSRUxPQ0FUSU5HK19fZmx0dXNlZCA9IC47IC8qIHNldCB1cCBmbG9hdGluZyBwdCBmb3IgTVMgLm9ialwncyAqL30KLSR7UkVMT0NBVElORytfX2xkdXNlZCA9IC47fQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBfX2ltYWdlX2Jhc2VfXyArIF9fc2VjdGlvbl9hbGlnbm1lbnRfXyB9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrIF9fdGV4dF9zdGFydF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9Ci0gICAgKigudGV4dCkKLSAgICAke1JfVEVYVH0KLSAgICAqKC5nbHVlXzd0KQotICAgICooLmdsdWVfNykKLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuOyBfX0NUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47IF9fRFRPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmR0b3JzKTsgKiguZHRvcik7ICBMT05HICgwKTsgfQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgLyogPz8/IFdoeSBpcyAuZ2NjX2V4YyBoZXJlPyAgKi8KLSAgICAke1JFTE9DQVRJTkcrICooLmdjY19leGMpfQotICAgICR7UkVMT0NBVElORysgZXRleHQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9fdGV4dF9lbmRfXyA9IC47fQotICAgICooLmdjY19leGNlcHRfdGFibGUpCi0gIH0KLQotICAvKiBUaGUgQ3lnd2luMzIgbGlicmFyeSB1c2VzIGEgc2VjdGlvbiB0byBhdm9pZCBjb3B5aW5nIGNlcnRhaW4gZGF0YQotICAgICBvbiBmb3JrLiAgVGhpcyB1c2VkIHRvIGJlIG5hbWVkICIuZGF0YSRub2NvcHkiLiAgVGhlIGxpbmtlciB1c2VkCi0gICAgIHRvIGluY2x1ZGUgdGhpcyBiZXR3ZWVuIF9fZGF0YV9zdGFydF9fIGFuZCBfX2RhdGFfZW5kX18sIGJ1dCB0aGF0Ci0gICAgIGJyZWFrcyBidWlsZGluZyB0aGUgY3lnd2luMzIgZGxsLiAgSW5zdGVhZCwgd2UgbmFtZSB0aGUgc2VjdGlvbgotICAgICAiLmRhdGFfY3lnd2luX25vY29weSIgYW5kIGV4cGxpY3RseSBpbmNsdWRlIGl0IGFmdGVyIF9fZGF0YV9lbmRfXy4gKi8KLQotICAuZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOiAKLSAgewotICAgICR7UkVMT0NBVElORytfX2RhdGFfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5kYXRhKQotICAgICooLmRhdGEyKQotICAgICR7Ul9EQVRBfQotICAgICR7UkVMT0NBVElORytfX2RhdGFfZW5kX18gPSAuIDt9Ci0gICAgJHtSRUxPQ0FUSU5HKyooLmRhdGFfY3lnd2luX25vY29weSl9Ci0gIH0KLQotICAuYnNzICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19ic3Nfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgLyogbGluay5leGUgYXBwYXJlbnRseSBwdWxscyBpbiAub2JqJ3MgYmVjYXVzZSBvZiBVTkRFRiBjb21tb24KLQlzeW1ib2xzLCB3aGljaCBpcyBub3QgdGhlIGNvZmYgd2F5LCBidXQgdGhhdCdzIE1TIGZvciB5b3UuICovCi0gICAgKiguQ1JUXCRYQ0EpCi0gICAgKiguQ1JUXCRYQ1opCi0gICAgKiguQ1JUXCRYSUEpCi0gICAgKiguQ1JUXCRYSVopCi0gICAgJHtSRUxPQ0FUSU5HK19fYnNzX2VuZF9fID0gLiA7fQotICB9Ci0KLSAgLnJkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAqKC5yZGF0YSkKLSAgICAke1JfUkRBVEF9Ci0gICAgKiguZWhfZnJhbWUpCi0gIH0KLQotICAuZWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLmVkYXRhKQotICB9Ci0KLSAgL0RJU0NBUkQvIDoKLSAgewotICAgICooLmRlYnVnXCRTKQotICAgICooLmRlYnVnXCRUKQotICAgICooLmRlYnVnXCRGKQotICAgICooLmRyZWN0dmUpCi0gICAgKiguZGVidWcqKQotICB9Ci0KLSAgLmlkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBUaGlzIGNhbm5vdCBjdXJyZW50bHkgYmUgaGFuZGxlZCB3aXRoIGdyb3VwZWQgc2VjdGlvbnMuCi0JU2VlIHBlLmVtOnNvcnRfc2VjdGlvbnMuICAqLwotICAgICR7Ul9JREFUQX0KLSAgfQotICAuQ1JUICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAke1JfQ1JUfQotICB9Ci0KLSAgLmVuZGp1bmsgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIGVuZCBpcyBkZXByZWNhdGVkLCBkb24ndCB1c2UgaXQgKi8KLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX19lbmRfXyA9IC47fQotICB9Ci0KLSAgLnJlbG9jICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yZWxvYykKLSAgfQotCi0gIC5yc3JjICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yc3JjKQotICAgICR7Ul9SU1JDfQotICB9Ci0KLSAgLmV4YyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKiguZXhjKQotICAgICR7Ul9FWEN9Ci0gIH0KLQotICAuc3RhYiAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotCi0gIC5zdGFic3RyICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLQotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZyAgICAgICAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotCi0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotCi0gIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfd2Vha25hbWVzIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KLSAgLmRlYnVnX3R5cGVuYW1lcyAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQotICAuZGVidWdfdmFybmFtZXMgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiMWI3OS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgMzg2IENPRkYuICBUaGlzIHdvcmtzIG9uIFNWUjMuMiBhbmQgU0NPIFVuaXggMy4yLjIuCi0jIElhbiBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci0jIFRoZXNlIGFyZSBzdWJzdGl0dXRlZCBpbiBhcyB2YXJpYWJsZXMgaW4gb3JkZXIgdG8gZ2V0ICd9JyBpbiBhIHNoZWxsCi0jIGNvbmRpdGlvbmFsIGV4cGFuc2lvbi4KLUlOSVQ9Jy5pbml0IDogeyAqKC5pbml0KSB9JwotRklOST0nLmZpbmkgOiB7ICooLmZpbmkpIH0nCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIFNJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKX0KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrIDB4NDAwMDAwICsgKC4gJiAweGZmYzAwZmZmKX0gOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAufTsKLSAgfQotICAke1JFTE9DQVRJTkctICR7SU5JVH19Ci0gICR7UkVMT0NBVElORy0gJHtGSU5JfX0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYyBiL2xkL3NjcmlwdHRlbXBsL2kzODZnbzMyLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDk3ZmQzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2kzODZnbzMyLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBpMzg2IGdvMzIgKERKR1BQKQotCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPXN0YXJ0Ci1FWEU9JHtDT05TVFJVQ1RJTkcrJHtSRUxPQ0FUSU5HKy1leGV9fQotCi0jIFRoZXNlIGFyZSBzdWJzdGl0dXRlZCBpbiBhcyB2YXJpYWJsZXMgaW4gb3JkZXIgdG8gZ2V0ICd9JyBpbiBhIHNoZWxsCi0jIGNvbmRpdGlvbmFsIGV4cGFuc2lvbi4KLUNUT1I9Jy5jdG9yIDogeyAqKC5jdG9yKSB9JwotRFRPUj0nLmR0b3IgOiB7ICooLmR0b3IpIH0nCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSR7RVhFfSIpCi0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrICR7VEFSR0VUX1BBR0VfU0laRX0rU0laRU9GX0hFQURFUlN9IDogewotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS50Kil9Ci0gICAgKiguY29uc3QqKQotICAgICooLnJvKikKLSAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLnIqKX0KLSAgICAke1JFTE9DQVRJTkcrZXRleHQgID0gIC4gOyBfZXRleHQgPSAufTsKLSAgICAke1JFTE9DQVRJTkcrLiA9IEFMSUdOKCR7U0VHTUVOVF9TSVpFfSk7fQotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgJHtEQVRBX0FMSUdOTUVOVH19IDogewotICAgICR7UkVMT0NBVElORytkamdwcF9maXJzdF9jdG9yID0gLiA7Ci0gICAgKiguY3RvcikKLSAgICBkamdwcF9sYXN0X2N0b3IgPSAuIDt9Ci0gICAgJHtSRUxPQ0FUSU5HK2RqZ3BwX2ZpcnN0X2R0b3IgPSAuIDsKLSAgICAqKC5kdG9yKQotICAgIGRqZ3BwX2xhc3RfZHRvciA9IC4gO30KLSAgICAqKC5kYXRhKQotCi0gICAgJHtSRUxPQ0FUSU5HKyooLmdjY19leGMqKX0KLSAgICAke1JFTE9DQVRJTkcrX19fRUhfRlJBTUVfQkVHSU5fXyA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrKiguZWhfZnJhbSopfQotICAgICR7UkVMT0NBVElORytfX19FSF9GUkFNRV9FTkRfXyA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrTE9ORygwKTt9Ci0KLSAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLmQqKX0KLSAgICAke1JFTE9DQVRJTkcrZWRhdGEgID0gIC4gOyBfZWRhdGEgPSAufTsKLSAgICAke1JFTE9DQVRJTkcrLiA9IEFMSUdOKCR7U0VHTUVOVF9TSVpFfSk7fQotICB9Ci0gICR7Q09OU1RSVUNUSU5HKyR7UkVMT0NBVElORy0kQ1RPUn19Ci0gICR7Q09OU1RSVUNUSU5HKyR7UkVMT0NBVElORy0kRFRPUn19Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC4gOyBfZW5kID0gLn07Ci0gICAgJHtSRUxPQ0FUSU5HKyAuID0gQUxJR04oJHtTRUdNRU5UX1NJWkV9KTt9Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2bHlueC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiNzJhNC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9pMzg2bHlueC5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIFNJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAqKC5pbml0KQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjt9Ci0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrIDB4NDAwMDAwICsgKC4gJiAweGZmYzAwZmZmKX0gOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAufTsKLSAgfQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZtc2Rvcy5zYyBiL2xkL3NjcmlwdHRlbXBsL2kzODZtc2Rvcy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzMTJlNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLSR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQotU0VDVElPTlMKLXsKLSAgJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn07fQotICAudGV4dCA6Ci0gIHsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORytldGV4dCA9IC47fQotICAgICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrX19ldGV4dCA9IC47fQotICB9Ci0gIC5kYXRhIDoKLSAgewotICAgICooLnJvZGF0YSkKLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrZWRhdGEgID0gIC47fQotICAgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAgICR7UkVMT0NBVElORytfX2VkYXRhICA9ICAuO30KLSAgfQotICAuYnNzIDoKLSAgewotICAgJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLn07Ci0gICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07Ci0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICR7UkVMT0NBVElORytlbmQgPSBBTElHTig0KSB9OwotICAgJHtSRUxPQ0FUSU5HK19lbmQgPSBBTElHTig0KSB9OwotICAgJHtSRUxPQ0FUSU5HK19fZW5kID0gQUxJR04oNCkgfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9pOTYwLnNjIGIvbGQvc2NyaXB0dGVtcGwvaTk2MC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzMzU1NS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9pOTYwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotY2F0IDw8RU9GCi1TRUNUSU9OUwoteyAKLSAgICAudGV4dCA6IAotICAgIHsgCi0JJHtHTERfU1RZTEUrIENSRUFURV9PQkpFQ1RfU1lNQk9MU30KLQkqKC50ZXh0KSAKLQkke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC59OwotCSR7Q09OU1RSVUNUSU5HKyR7Q09GRl9DVE9SU319Ci0gICAgfSAgCi0gICAgLmRhdGEgOgotICAgIHsgCi0gCSooLmRhdGEpIAotCSR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC59OwotICAgIH0gIAotICAgIC5ic3MgOgotICAgIHsgCi0JJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLn07Ci0JKiguYnNzKQkgCi0JKihDT01NT04pIAotCSR7UkVMT0NBVElORysgX2VuZCA9IC59OwotICAgIH0gCi19IAotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9tNjhrYXV4LnNjIGIvbGQvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0MjgwZS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9tNjhrYXV4LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBBL1VYLgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLUlOSVQ9Jy5pbml0IDogeyAqKC5pbml0KSB9JwotRklOST0nLmZpbmkgOiB7ICooLmZpbmkpIH0nCi1DVE9SUz0nLmN0b3JzIDogeyAqKC5jdG9ycykgfScKLURUT1JTPScuZHRvcnMgOiB7ICooLmR0b3JzKSB9JwotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrICRURVhUX1NUQVJUX0FERFJ9IDogewotICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKX0KLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgLiA9IEFMSUdOKDQpO30KLSAgICAke1JFTE9DQVRJTkcrICooLmN0b3JzKX0KLSAgICAke1JFTE9DQVRJTkcrICooLmR0b3JzKX0KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuO30KLSAgfSA9MHg0RTcxNEU3MQotICAuZGF0YSAke1JFTE9DQVRJTkcrICREQVRBX0FMSUdOTUVOVH0gOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuO30KLSAgfQotICAuYnNzIDogewotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotICB9Ci0gICR7UkVMT0NBVElORy0gJHtJTklUfX0KLSAgJHtSRUxPQ0FUSU5HLSAke0ZJTkl9fQotICAke1JFTE9DQVRJTkctICR7Q1RPUlN9fQotICAke1JFTE9DQVRJTkctICR7RFRPUlN9fQotCi0gIC5jb21tZW50IDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgWyAuY29tbWVudCBdIFsgLmlkZW50IF0gfQotICAuc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7IFsgLnN0YWIgXSB9Ci0gIC5zdGFic3RyIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgWyAuc3RhYnN0ciBdIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9tNjhrY29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2OGM2Zi4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9tNjhrY29mZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLVBST1ZJREUgKF9fc3RhY2sgPSAwKTsgCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIDB4MTAwMDAwMH0gOiB7Ci0gICAgKigudGV4dCkKLSAgICAke0NPTlNUUlVDVElORysgLiA9IEFMSUdOKDQpO30KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuO30KLSAgfQotICAuZGF0YSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgOiB7IAkJCQkJCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSBBTElHTigweDgpfTsKLSAgICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gQUxJR04oMHg4KX07Ci0gIH0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYyBiL2xkL3NjcmlwdHRlbXBsL202OGtseW54LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWQyMjQ1Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL202OGtseW54LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgU0laRU9GX0hFQURFUlN9IDogewotICAgICooLmluaXQpCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fQ1RPUl9FTkRfXyAtIF9fX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0RUT1JfRU5EX18gLSBfX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9FTkRfXyA9IC47fQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMCArICguICYgMHhmZmMwMGZmZil9IDogewotICAgICooLmRhdGEgLmRhdGEyKQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC59OwotICB9Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYyBiL2xkL3NjcmlwdHRlbXBsL204OGtiY3Muc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MmIxNGQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMgVGhlc2UgYXJlIHN1YnN0aXR1dGVkIGluIGFzIHZhcmlhYmxlcyBpbiBvcmRlciB0byBnZXQgJ30nIGluIGEgc2hlbGwKLSMgY29uZGl0aW9uYWwgZXhwYW5zaW9uLgotSU5JVD0nLmluaXQgOiB7ICooLmluaXQpIH0nCi1GSU5JPScuZmluaSA6IHsgKiguZmluaSkgfScKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotRU5UUlkoX19zdGFydCkKLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAoMHgyMDAwNyArIFNJWkVPRl9IRUFERVJTKSAmfiA3fSA6Ci0gICAgewotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy50ZXh0LnN0YXJ0ID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmluaXQuc3RhcnQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmluaXQuZW5kID0gLn07Ci0gICAgICAqKC50ZXh0KSAJCQkJCi0gICAgICAke1JFTE9DQVRJTkcrIF9fLnRkZXNjX3N0YXJ0ID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrICooLnRkZXNjKX0KLSAgICAgICR7UkVMT0NBVElORysgX18udGV4dF9lbmQgPSAufQk7Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmluaXRwLnN0YXJ0ID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmluaXRwLmVuZCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5maW5pX3N0YXJ0ID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpIH0KLSAgICAgICR7UkVMT0NBVElORysgX18uZmluaV9lbmQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORytfZXRleHQgPSAufTsKLSAgICB9ICAJCQkJCQotICAuZGF0YSAke1JFTE9DQVRJTkcrIE5FWFQgKDB4NDAwMDAwKSArICgoU0laRU9GKC50ZXh0KSArIEFERFIoLnRleHQpKSAlIDB4MjAwMCl9IDoKLSAgICB7IAkJCQkJCi0gICAgICAqKC5kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLn07Ci0gICAgfSAgCQkJCQkKLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICAgIHsgCQkKLSAgICAgICooLmJzcykJCi0gICAgICAqKENPTU1PTikgCQotICAgICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fZW5kID0gLn07Ci0gICAgfQotICAke1JFTE9DQVRJTkctICR7SU5JVH19Ci0gICR7UkVMT0NBVElORy0gJHtGSU5JfX0KLSAgLmNvbW1lbnQgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgKiguY29tbWVudCkKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9tY29yZXBlLnNjIGIvbGQvc2NyaXB0dGVtcGwvbWNvcmVwZS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY5MjhhYS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9tY29yZXBlLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgTUNvcmUgUEUuCi0KLWlmIHRlc3QgLXogIiR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9IjsgdGhlbgotICBSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci1maQotCi0jIFdlIGNhbid0IGVhc2lseSBhbmQgcG9ydGFibHkgZ2V0IGFuIHVucXVvdGVkICQgaW4gYSBzaGVsbAotIyBzdWJzdGl0dXRpb24sIHNvIHdlIGRvIHRoaXMgaW5zdGVhZC4KLSMgU29ydGluZyBvZiB0aGUgLmZvbyQqIHNlY3Rpb25zIGlzIHJlcXVpcmVkIGJ5IHRoZSBkZWZpbml0aW9uIG9mCi0jIGdyb3VwZWQgc2VjdGlvbnMgaW4gUEUuCi0jIFNvcnRpbmcgb2YgdGhlIGZpbGUgbmFtZXMgaW4gUl9JREFUQSBpcyByZXF1aXJlZCBieSB0aGUKLSMgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBkbGx0b29sICh0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGNoYW5nZWQgdG8KLSMgdXNlIGdyb3VwZWQgc2VjdGlvbnMgaW5zdGVhZCkuCi1pZiB0ZXN0ICIke1JFTE9DQVRJTkd9IjsgdGhlbgotICBSX1RFWFQ9JyooU09SVCgudGV4dCQqKSknCi0gIFJfREFUQT0nKihTT1JUKC5kYXRhJCopKScKLSAgUl9SREFUQT0nKihTT1JUKC5yZGF0YSQqKSknCi0gIFJfSURBVEE9JwotICAgIFNPUlQoKikoLmlkYXRhJDIpCi0gICAgU09SVCgqKSguaWRhdGEkMykKLSAgICAvKiBUaGVzZSB6ZXJvZXMgbWFyayB0aGUgZW5kIG9mIHRoZSBpbXBvcnQgbGlzdC4gICovCi0gICAgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOwotICAgIFNPUlQoKikoLmlkYXRhJDQpCi0gICAgU09SVCgqKSguaWRhdGEkNSkKLSAgICBTT1JUKCopKC5pZGF0YSQ2KQotICAgIFNPUlQoKikoLmlkYXRhJDcpJwotICBSX0NSVD0nKihTT1JUKC5DUlQkKikpJwotICBSX1JTUkM9JyooU09SVCgucnNyYyQqKSknCi1lbHNlCi0gIFJfVEVYVD0KLSAgUl9EQVRBPQotICBSX1JEQVRBPQotICBSX0lEQVRBPQotICBSX0NSVD0KLSAgUl9SU1JDPQotZmkKLQotaWYgdGVzdCAiJFJFTE9DQVRJTkciOyB0aGVuCi0gICMgQ2FuJ3QgdXNlICR7UkVMT0NBVElORytibGFoICJibGFoIiBibGFofSBmb3IgdGhpcywKLSAgIyBiZWNhdXNlIGJhc2ggMi54IHdpbGwgbG9zZSB0aGUgZG91YmxlcXVvdGVzLgotICBjYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgCSAgICAgICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKLUVPRgotZmkKLQotY2F0IDw8RU9GCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoX21haW5DUlRTdGFydHVwKQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIF9faW1hZ2VfYmFzZV9fICsgX19zZWN0aW9uX2FsaWdubWVudF9fIH0gOiAKLSAgewotICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9Ci0gICAgKigudGV4dCkKLSAgICAke1JfVEVYVH0KLSAgICAqKC5nbHVlXzd0KQotICAgICooLmdsdWVfNykKLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuOyBfX0NUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47IF9fRFRPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmR0b3JzKTsgKiguZHRvcik7ICBMT05HICgwKTsgfQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgLyogPz8/IFdoeSBpcyAuZ2NjX2V4YyBoZXJlPyAgKi8KLSAgICAke1JFTE9DQVRJTkcrICooLmdjY19leGMpfQotICAgICR7UkVMT0NBVElORysgZXRleHQgPSAuO30KLSAgICAqKC5nY2NfZXhjZXB0X3RhYmxlKQotICB9Ci0KLSAgLyogVGhlIEN5Z3dpbjMyIGxpYnJhcnkgdXNlcyBhIHNlY3Rpb24gdG8gYXZvaWQgY29weWluZyBjZXJ0YWluIGRhdGEKLSAgICAgb24gZm9yay4gIFRoaXMgdXNlZCB0byBiZSBuYW1lZCAiLmRhdGEkbm9jb3B5Ii4gIFRoZSBsaW5rZXIgdXNlZAotICAgICB0byBpbmNsdWRlIHRoaXMgYmV0d2VlbiBfX2RhdGFfc3RhcnRfXyBhbmQgX19kYXRhX2VuZF9fLCBidXQgdGhhdAotICAgICBicmVha3MgYnVpbGRpbmcgdGhlIGN5Z3dpbjMyIGRsbC4gIEluc3RlYWQsIHdlIG5hbWUgdGhlIHNlY3Rpb24KLSAgICAgIi5kYXRhX2N5Z3dpbl9ub2NvcHkiIGFuZCBleHBsaWN0bHkgaW5jbHVkZSBpdCBhZnRlciBfX2RhdGFfZW5kX18uICovCi0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMikKLSAgICAke1JfREFUQX0KLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX2VuZF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysqKC5kYXRhX2N5Z3dpbl9ub2NvcHkpfQotICB9Ci0KLSAgLmJzcyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORytfX2Jzc19lbmRfXyA9IC4gO30KLSAgfQotCi0gIC5yZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgKigucmRhdGEpCi0gICAgJHtSX1JEQVRBfQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0KLSAgLmVkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAqKC5lZGF0YSkKLSAgfQotCi0gIC9ESVNDQVJELyA6Ci0gIHsKLSAgICAqKC5kZWJ1Z1wkUykKLSAgICAqKC5kZWJ1Z1wkVCkKLSAgICAqKC5kZWJ1Z1wkRikKLSAgICAqKC5kcmVjdHZlKQotICB9Ci0KLSAgLmlkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBUaGlzIGNhbm5vdCBjdXJyZW50bHkgYmUgaGFuZGxlZCB3aXRoIGdyb3VwZWQgc2VjdGlvbnMuCi0JU2VlIHBlLmVtOnNvcnRfc2VjdGlvbnMuICAqLwotICAgICR7Ul9JREFUQX0KLSAgfQotICAuQ1JUICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAke1JfQ1JUfQotICB9Ci0KLSAgLmVuZGp1bmsgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIGVuZCBpcyBkZXByZWNhdGVkLCBkb24ndCB1c2UgaXQgKi8KLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX19lbmRfXyA9IC47fQotICB9Ci0KLSAgLnJlbG9jICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yZWxvYykKLSAgfQotCi0gIC5yc3JjICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yc3JjKQotICAgICR7Ul9SU1JDfQotICB9Ci0KLSAgLnN0YWIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLQotICAuc3RhYnN0ciAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotCi0gIC5zdGFjayAweDgwMDAwIDoKLSAgewotICAgIF9zdGFjayA9IC47Ci0gICAgKiguc3RhY2spCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbWlwcy5zYyBiL2xkL3NjcmlwdHRlbXBsL21pcHMuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MGFlZWQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbWlwcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgTUlQUyBzeXN0ZW1zLgotIyBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0jIFRoZXNlIHZhcmlhYmxlcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZW11bGF0aW9uIGZpbGUuICBUaGUKLSMgZGVmYXVsdHMgYXJlIGFwcHJvcHJpYXRlIGZvciBhIERFQ3N0YXRpb24gcnVubmluZyBVbHRyaXguCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9fc3RhcnQKLQotaWYgWyAteiAiJEVNQkVEREVEIiBdOyB0aGVuCi0gIHRlc3QgLXogIiRURVhUX1NUQVJUX0FERFIiICYmIFRFWFRfU1RBUlRfQUREUj0iMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUyIKLWVsc2UKLSAgdGVzdCAteiAiJFRFWFRfU1RBUlRfQUREUiIgJiYgVEVYVF9TVEFSVF9BRERSPSIweDQwMDAwMCIKLWZpCi1pZiB0ZXN0ICJ4JExEX0ZMQUciID0gInhuIiAtbyAieCRMRF9GTEFHIiA9ICJ4TiI7IHRoZW4KLSAgREFUQV9BRERSPS4KLWVsc2UKLSAgdGVzdCAteiAiJERBVEFfQUREUiIgJiYgREFUQV9BRERSPTB4MTAwMDAwMDAKLWZpCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KLSAgLnRleHQgOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZnRleHQgPSAuIH07Ci0gICAgKiguaW5pdCkKLSAgICAke1JFTE9DQVRJTkcrIGVwcm9sICA9ICAufTsKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RhcnQgPSAuKTt9Ci0gICAgKigucmVsLnNkYXRhKQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RvcCA9IC4pO30KLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OwotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ICA9ICAufTsKLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSfTt9Ci0gIC5yZGF0YSA6IHsKLSAgICAqKC5yZGF0YSkKLSAgfQotICAke1JFTE9DQVRJTkcrIF9mZGF0YSA9IEFMSUdOKDE2KTt9Ci0gIC5kYXRhIDogewotICAgICooLmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICB9Ci0gICR7UkVMT0NBVElORysgX2dwID0gQUxJR04oMTYpICsgMHg4MDAwO30KLSAgLmxpdDggOiB7Ci0gICAgKigubGl0OCkKLSAgfQotICAubGl0NCA6IHsKLSAgICAqKC5saXQ0KQotICB9Ci0gIC5zZGF0YSA6IHsKLSAgICAqKC5zZGF0YSkKLSAgfQotICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgID0gIC47fQotICAke1JFTE9DQVRJTkcrIF9mYnNzID0gLjt9Ci0gIC5zYnNzIDogewotICAgICooLnNic3MpCi0gICAgKiguc2NvbW1vbikKLSAgfQotICAuYnNzIDogewotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgfQotICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbWlwc2JzZC5zYyBiL2xkL3NjcmlwdHRlbXBsL21pcHNic2Quc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMjJiMzMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbWlwc2JzZC5zYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsICIke0JJR19PVVRQVVRfRk9STUFUfSIsCi0JICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci1TRUNUSU9OUwotewotICAke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfTt9Ci0gIC50ZXh0IDoKLSAgewotICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUwotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HK2V0ZXh0ID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICAuZGF0YSA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrZWRhdGEgID0gIC47fQotICB9Ci0gIC5ic3MgOgotICB7Ci0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICR7UkVMT0NBVElORytlbmQgPSAuIH07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbncuc2MgYi9sZC9zY3JpcHR0ZW1wbC9udy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1NTIyYy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9udy5zYworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0jCi0jIFVudXN1YWwgdmFyaWFibGVzIGNoZWNrZWQgYnkgdGhpcyBjb2RlOgotIwlOT1AgLSB0d28gYnl0ZSBvcGNvZGUgZm9yIG5vLW9wIChkZWZhdWx0cyB0byAwKQotIwlEQVRBX0FERFIgLSBpZiBlbmQtb2YtdGV4dC1wbHVzLW9uZS1wYWdlIGlzbid0IHJpZ2h0IGZvciBkYXRhIHN0YXJ0Ci0jCU9USEVSX1JFQURPTkxZX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAudGV4dCAuaW5pdCAuY3RvcnMgLnJvZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLm1pbGxpKQotIwlPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMgLSBvdGhlciB0aGFuIC5kYXRhIC5ic3MgLnNkYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MuZ2xvYmFsKQotIwlPVEhFUl9TRUNUSU9OUyAtIGF0IHRoZSBlbmQKLSMJRVhFQ1VUQUJMRV9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IG11c3QgYmUgZGVmaW5lZCBmb3IgYW4KLSMJCWV4ZWN1dGFibGUgKGUuZy4sIF9EWU5BTUlDX0xJTkspCi0jCVRFWFRfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLnRleHQgc2VjdGlvbi4KLSMJREFUQV9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuZGF0YSBzZWN0aW9uLgotIwlPVEhFUl9CU1NfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmJzcyBzZWN0aW9uIGJlc2lkZXMgX19ic3Nfc3RhcnQuCi0jCURBVEFfUExUIC0gLnBsdCBzaG91bGQgYmUgaW4gZGF0YSBzZWdtZW50LCBub3QgdGV4dCBzZWdtZW50LgotIwotIyBXaGVuIGFkZGluZyBzZWN0aW9ucywgZG8gbm90ZSB0aGF0IHRoZSBuYW1lcyBvZiBzb21lIHNlY3Rpb25zIGFyZSB1c2VkCi0jIHdoZW4gc3BlY2lmeWluZyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV4dC4KLSMKLXRlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCi1JTlRFUlA9Ii5pbnRlcnAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmludGVycCkgCX0iCi1QTFQ9Ii5wbHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5wbHQpCX0iCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtSRUxPQ0FUSU5HKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAke1NUQUNLWkVSTyske1NUQUNLWkVST319ICR7U0hMSUJfUEFUSCske1NITElCX1BBVEh9fSAgKi99Ci0ke1JFTE9DQVRJTkcrJHtFWEVDVVRBQkxFX1NZTUJPTFN9fQotJHtSRUxPQ0FUSU5HLSAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKLSAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKLSAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKLSAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqL30KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAke0NSRUFURV9TSExJQi0ke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfSArIFNJWkVPRl9IRUFERVJTO319Ci0gICR7Q1JFQVRFX1NITElCKyR7UkVMT0NBVElORysuID0gU0laRU9GX0hFQURFUlM7fX0KLSAgJHtDUkVBVEVfU0hMSUItJHtJTlRFUlB9fQotICAuaGFzaCAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmluaXQpCX0gPSR7Tk9QLTB9Ci0gICR7REFUQV9QTFQtJHtQTFR9fQotICAudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC50ZXh0KQotICAgICR7Q09OU1RSVUNUSU5HKwlfX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCUxPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKwkqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCUxPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCV9fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKwlfX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCUxPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKwkqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCUxPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCV9fRFRPUl9FTkRfXyA9IC47fQotICB9Ci0gICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGV0ZXh0ID0gLik7fQotICAuZmluaSAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmZpbmkpICAgIH0gPSR7Tk9QLTB9Ci0gIC5jdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR0b3JzKSAgIH0KLSAgLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGEpICB9Ci0gIC5yb2RhdGExICR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFET05MWV9TRUNUSU9OU319Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFItIEFMSUdOKDgpICsgJHtNQVhQQUdFU0laRX19O30KLSAgLmRhdGEgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtEQVRBX1NUQVJUX1NZTUJPTFN9fQotICAgICooLmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICB9Ci0gIC5kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLmRhdGExKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURXUklURV9TRUNUSU9OU319Ci0gIC5nb3QgICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQotICAuZHluYW1pYyAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5hbWljKSB9Ci0gICR7REFUQV9QTFQrJHtQTFR9fQotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cwotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCi0gIC5zZGF0YSAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2RhdGEpIH0KLSAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0ID0gLjt9Ci0gICR7UkVMT0NBVElORyske09USEVSX0JTU19TWU1CT0xTfX0KLSAgLnNic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9Ci0gIC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gICR7UkVMT0NBVElORytfZW5kID0gLiA7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZW5kID0gLik7fQotCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlbgotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqLwotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KLQotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICR7UkVMT0NBVElOR30uICAqLwotICAke09USEVSX1NFQ1RJT05TfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9wZS5zYyBiL2xkL3NjcmlwdHRlbXBsL3BlLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjFiYWJkLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3BlLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgUEUuCi0KLWlmIHRlc3QgLXogIiR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9IjsgdGhlbgotICBSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci1maQotCi0jIFdlIGNhbid0IGVhc2lseSBhbmQgcG9ydGFibHkgZ2V0IGFuIHVucXVvdGVkICQgaW4gYSBzaGVsbAotIyBzdWJzdGl0dXRpb24sIHNvIHdlIGRvIHRoaXMgaW5zdGVhZC4KLSMgU29ydGluZyBvZiB0aGUgLmZvbyQqIHNlY3Rpb25zIGlzIHJlcXVpcmVkIGJ5IHRoZSBkZWZpbml0aW9uIG9mCi0jIGdyb3VwZWQgc2VjdGlvbnMgaW4gUEUuCi0jIFNvcnRpbmcgb2YgdGhlIGZpbGUgbmFtZXMgaW4gUl9JREFUQSBpcyByZXF1aXJlZCBieSB0aGUKLSMgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBkbGx0b29sICh0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGNoYW5nZWQgdG8KLSMgdXNlIGdyb3VwZWQgc2VjdGlvbnMgaW5zdGVhZCkuCi1pZiB0ZXN0ICIke1JFTE9DQVRJTkd9IjsgdGhlbgotICBSX1RFWFQ9JyooU09SVCgudGV4dCQqKSknCi0gIFJfREFUQT0nKihTT1JUKC5kYXRhJCopKScKLSAgUl9SREFUQT0nKihTT1JUKC5yZGF0YSQqKSknCi0gIFJfSURBVEE9JwotICAgIFNPUlQoKikoLmlkYXRhJDIpCi0gICAgU09SVCgqKSguaWRhdGEkMykKLSAgICAvKiBUaGVzZSB6ZXJvZXMgbWFyayB0aGUgZW5kIG9mIHRoZSBpbXBvcnQgbGlzdC4gICovCi0gICAgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOwotICAgIFNPUlQoKikoLmlkYXRhJDQpCi0gICAgU09SVCgqKSguaWRhdGEkNSkKLSAgICBTT1JUKCopKC5pZGF0YSQ2KQotICAgIFNPUlQoKikoLmlkYXRhJDcpJwotICBSX0NSVD0nKihTT1JUKC5DUlQkKikpJwotICBSX1JTUkM9JyooU09SVCgucnNyYyQqKSknCi1lbHNlCi0gIFJfVEVYVD0KLSAgUl9EQVRBPQotICBSX1JEQVRBPQotICBSX0lEQVRBPQotICBSX0NSVD0KLSAgUl9SU1JDPQotZmkKLQotY2F0IDw8RU9GCi0ke1JFTE9DQVRJTkcrT1VUUFVUX0ZPUk1BVCgke09VVFBVVF9GT1JNQVR9KX0KLSR7UkVMT0NBVElORy1PVVRQVVRfRk9STUFUKCR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9KX0KLSR7T1VUUFVUX0FSQ0grT1VUUFVUX0FSQ0goJHtPVVRQVVRfQVJDSH0pfQotCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgX19pbWFnZV9iYXNlX18gKyBfX3NlY3Rpb25fYWxpZ25tZW50X18gfSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KX0KLSAgICAqKC50ZXh0KQotICAgICR7Ul9URVhUfQotICAgICooLmdsdWVfN3QpCi0gICAgKiguZ2x1ZV83KQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47IF9fQ1RPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmN0b3JzKTsgKiguY3Rvcik7IExPTkcgKDApOyB9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjsgX19EVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguZHRvcnMpOyAqKC5kdG9yKTsgIExPTkcgKDApOyB9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKX0KLSAgICAvKiA/Pz8gV2h5IGlzIC5nY2NfZXhjIGhlcmU/ICAqLwotICAgICR7UkVMT0NBVElORysgKiguZ2NjX2V4Yyl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCA9IC47fQotICAgICooLmdjY19leGNlcHRfdGFibGUpCi0gIH0KLQotICAvKiBUaGUgQ3lnd2luMzIgbGlicmFyeSB1c2VzIGEgc2VjdGlvbiB0byBhdm9pZCBjb3B5aW5nIGNlcnRhaW4gZGF0YQotICAgICBvbiBmb3JrLiAgVGhpcyB1c2VkIHRvIGJlIG5hbWVkICIuZGF0YSRub2NvcHkiLiAgVGhlIGxpbmtlciB1c2VkCi0gICAgIHRvIGluY2x1ZGUgdGhpcyBiZXR3ZWVuIF9fZGF0YV9zdGFydF9fIGFuZCBfX2RhdGFfZW5kX18sIGJ1dCB0aGF0Ci0gICAgIGJyZWFrcyBidWlsZGluZyB0aGUgY3lnd2luMzIgZGxsLiAgSW5zdGVhZCwgd2UgbmFtZSB0aGUgc2VjdGlvbgotICAgICAiLmRhdGFfY3lnd2luX25vY29weSIgYW5kIGV4cGxpY3RseSBpbmNsdWRlIGl0IGFmdGVyIF9fZGF0YV9lbmRfXy4gKi8KLQotICAuZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOiAKLSAgewotICAgICR7UkVMT0NBVElORytfX2RhdGFfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5kYXRhKQotICAgICooLmRhdGEyKQotICAgICR7Ul9EQVRBfQotICAgICR7UkVMT0NBVElORytfX2RhdGFfZW5kX18gPSAuIDt9Ci0gICAgJHtSRUxPQ0FUSU5HKyooLmRhdGFfY3lnd2luX25vY29weSl9Ci0gIH0KLQotICAucmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLnJkYXRhKQotICAgICR7Ul9SREFUQX0KLSAgICAqKC5laF9mcmFtZSkKLSAgfQotCi0gIC5ic3MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICR7UkVMT0NBVElORytfX2Jzc19zdGFydF9fID0gLiA7fQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrX19ic3NfZW5kX18gPSAuIDt9Ci0gIH0KLQotICAuZWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLmVkYXRhKQotICB9Ci0KLSAgL0RJU0NBUkQvIDoKLSAgewotICAgICooLmRlYnVnXCRTKQotICAgICooLmRlYnVnXCRUKQotICAgICooLmRlYnVnXCRGKQotICAgICooLmRyZWN0dmUpCi0gIH0KLQotICAuaWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIFRoaXMgY2Fubm90IGN1cnJlbnRseSBiZSBoYW5kbGVkIHdpdGggZ3JvdXBlZCBzZWN0aW9ucy4KLQlTZWUgcGUuZW06c29ydF9zZWN0aW9ucy4gICovCi0gICAgJHtSX0lEQVRBfQotICB9Ci0gIC5DUlQgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgeyAJCQkJCQotICAgICR7Ul9DUlR9Ci0gIH0KLQotICAuZW5kanVuayAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgLyogZW5kIGlzIGRlcHJlY2F0ZWQsIGRvbid0IHVzZSBpdCAqLwotICAgICR7UkVMT0NBVElORysgZW5kID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX2VuZF9fID0gLjt9Ci0gIH0KLQotICAucnNyYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucnNyYykKLSAgICAke1JfUlNSQ30KLSAgfQotCi0gIC5yZWxvYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKigucmVsb2MpCi0gIH0KLQotICAuc3RhYiAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotCi0gIC5zdGFic3RyICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvcGouc2MgYi9sZC9zY3JpcHR0ZW1wbC9wai5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5ODFhNS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9wai5zYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLVRPUlM9Ii50b3JzIDoKLSAgewotICAgIF9fX2N0b3JzID0gLiA7Ci0gICAgKiguY3RvcnMpCi0gICAgX19fY3RvcnNfZW5kID0gLiA7Ci0gICAgX19fZHRvcnMgPSAuIDsKLSAgICAqKC5kdG9ycykKLSAgICBfX19kdG9yc19lbmQgPSAuIDsKLSAgfSA+IHJhbSIKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLU1FTU9SWQotewotICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEyTQotfQotCi1TRUNUSU9OUwotewotICAudGV4dCA6Ci0gIHsKLSAgICAqKC50ZXh0KQotICAgICooLnN0cmluZ3MpCi0gICAgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotICB9ICR7UkVMT0NBVElORysgPiByYW19Ci0gICR7Q09OU1RSVUNUSU5HKyR7VE9SU319Ci0gIC5kYXRhIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotICB9ICR7UkVMT0NBVElORysgPiByYW19Ci0gIC5ic3MgOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLiA7IH0KLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgLnN0YWNrICR7UkVMT0NBVElORysgMHgzMDAwMCB9ICA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0gICAgKiguc3RhY2spCi0gIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgICooLnN0YWIpCi0gIH0KLSAgLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgICooLnN0YWJzdHIpCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvcHBjcGUuc2MgYi9sZC9zY3JpcHR0ZW1wbC9wcGNwZS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBmYmUzMy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9wcGNwZS5zYworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0jIEEgUEUgbGlua2VyIHNjcmlwdCBmb3IgUG93ZXJQQy4KLSMgTG9vc2VseSBiYXNlZCBvbiBTdGV2ZSBDaGFtYmVybGFpbidzIHBlLnNjLgotIyBBbGwgbmV3IG1pc3Rha2VzIHNob3VsZCBiZSBjcmVkaXRlZCB0byBLaW0gS251dHRpbGEgKGtya0BjeWdudXMuY29tKQotIwotIyBUaGVzZSBhcmUgc3Vic3RpdHV0ZWQgaW4gYXMgdmFyaWFibGVzIGluIG9yZGVyIHRvIGdldCAnfScgaW4gYSBzaGVsbAotIyBjb25kaXRpb25hbCBleHBhbnNpb24uCi1JTklUPScuaW5pdCA6IHsgKiguaW5pdCkgfScKLUZJTkk9Jy5maW5pIDogeyAqKC5maW5pKSB9JwotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCR7T1VUUFVUX0ZPUk1BVH0pCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotLyogTXVjaCBvZiB0aGlzIGxheW91dCB3YXMgZGV0ZXJtaW5lZCBieSBkZWx2aW5nIGludG8gLmV4ZSBmaWxlcyBmb3IKLSAgIHRoZSBib3ggZ2VuZXJhdGVkIGJ5IG90aGVyIGNvbXBpbGVycy9saW5rZXJzL2V0Yy4gVGhpcyBtZWFucyB0aGF0Ci0gICBpZiBhIHBhcnRpY3VsYXIgZmVhdHVyZSBkaWQgbm90IGhhcHBlbiB0byBhcHBlYXIgaW4gb25lIG9mIHRoZSAKLSAgIHN1YmplY3QgZmlsZXMsIHRoZW4gaXQgbWF5IG5vdCBiZSB5ZXQgc3VwcG9ydGVkLgotKi8KLQotLyogSXQncyAibWFpbkNSVFN0YXJ0dXAiLCBub3QgIl9tYWluQ1JUU3RhcnR1cCIsIGFuZCBpdCdzIGxvY2F0ZWQgaW4KLSAgIG9uZSBvZiB0aGUgdHdvIC5saWIgZmlsZXMgKGxpYmMubGliIGFuZCBrZXJuZWwzMi5saWIpIHRoYXQgY3VycmVudGx5Ci0gICBtdXN0IGJlIHByZXNlbnQgb24gdGhlIGxpbmsgbGluZS4gVGhpcyBtZWFucyB0aGF0IHlvdSBtdXN0IHVzZSAKLSAgICItdSBtYWluQ1JUU3RhcnR1cCIgdG8gbWFrZSBzdXJlIGl0IGdldHMgaW5jbHVkZWQgaW4gdGhlIGxpbmsuCi0qLwotCi1FTlRSWShtYWluQ1JUU3RhcnR1cCkKLQotU0VDVElPTlMKLXsKLQotICAvKiB0ZXh0IC0gdGhlIHVzdWFsIG1lYW5pbmcgKi8KLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBfX2ltYWdlX2Jhc2VfXyArIF9fc2VjdGlvbl9hbGlnbm1lbnRfXyB9IDogCi0JewotCSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpO30KLQkgICAgKigudGV4dCkKLQkgICAgKiguZ2NjX2V4Y2VwdF90YWJsZSkKLQkgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKLQkJICAgICAgICBMT05HICgtMSk7ICooLmN0b3JzKTsgKiguY3Rvcik7IExPTkcgKDApOyB9Ci0gICAgICAgICAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KLQkgICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKTt9Ci0JICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OwotCX0KLQotICAvKiByZGF0YSAtIFJlYWQgT25seSBSdW50aW1lIERhdGEKLSAgICAgQ1RSIHNlY3Rpb25zOiBBbGwgb2YgdGhlIENSVCAocmVhZCBvbmx5IEMgcnVudGltZSBkYXRhKSBzZWN0aW9ucyAKLQlhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZSAucmRhdGEgKHJlYWQgb25seSBydW50aW1lIGRhdGEpIAotCXNlY3Rpb24sIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIuIERvbid0IGtub3cgaWYgaXQgbWF0dGVycyBvciBub3QuCi0JTm90IGFsbCBzZWN0aW9ucyBhcmUgYWx3YXlzIHByZXNlbnQgZWl0aGVyLgotICAgICAucmRhdGE6IGNvbXBpbGVyIGdlbmVyYXRlZCByZWFkIG9ubHkgZGF0YQotICAgICAueGRhdGE6IGNvbXBpbGVyIGdlbmVyYXRlZCBleGNlcHRpb24gaGFuZGxpbmcgdGFibGUuIChNb3N0IGRvY3MKLQlzZWVtIHRvIHN1Z2dlc3QgdGhhdCB0aGlzIHNlY3Rpb24gaXMgbm93IGRlcHJlY2F0ZWQgaW5mYXZvcgotCW9mIHRoZSB5ZGF0YSBzZWN0aW9uKQotICAgICAuZWRhdGE6IFRoZSBleHBvcnRlZCBuYW1lcyB0YWJsZS4KLSAgKi8KLSAgLnJkYXRhIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsKLQkgICAgKiguQ1JUXCRYQ0EpOwotCSAgICAqKC5DUlRcJFhDQyk7Ci0JICAgICooLkNSVFwkWENaKTsKLQkgICAgKiguQ1JUXCRYSUEpOwotCSAgICAqKC5DUlRcJFhJQyk7Ci0JICAgICooLkNSVFwkWElaKTsKLQkgICAgKiguQ1JUXCRYTEEpOwotCSAgICAqKC5DUlRcJFhMWik7Ci0JICAgICooLkNSVFwkWFBBKTsKLQkgICAgKiguQ1JUXCRYUFgpOwotCSAgICAqKC5DUlRcJFhQWik7Ci0JICAgICooLkNSVFwkWFRBKTsKLQkgICAgKiguQ1JUXCRYVFopOwotCSAgICAqKC5yZGF0YSk7Ci0JICAgICooLnhkYXRhKTsKLQl9Ci0KLSAgLmVkYXRhIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsKLSAgICAJICAgICooLmVkYXRhKTsKLQl9Ci0KLSAgLyogZGF0YSAtIGluaXRpYWxpemVkIGRhdGEKLSAgICAgLnlkYXRhOiBleGNlcHRpb24gaGFuZGxpbmcgaW5mb3JtYXRpb24uCi0gICAgIC5kYXRhOiB0aGUgdXN1YWwgbWVhbmluZy4KLSAgICAgLmRhdGEyOiBtb3JlIG9mIHRoZSBzYW1lLgotICAgICAuYnNzOiBGb3Igc29tZSByZWFzb24sIGJzcyBhcHBlYXJzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBkYXRhCi0Jc2VjdGlvbiwgYXMgb3Bwb3NlZCB0byBiZWluZyBnaXZlbiBhIHNlY3Rpb24gb2YgaXQncyBvd24uCi0gICAgIENPTU1PTjoKLSAgKi8KLSAgLmRhdGEgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6IAotCXsKLQkgICAgX19kYXRhX3N0YXJ0X18gPSAuIDsgCi0JICAgICooLnlkYXRhKTsKLQkgICAgKiguZGF0YSk7Ci0JICAgICooLmRhdGEyKTsKLQkgICAgX19ic3Nfc3RhcnRfXyA9IC4gOwotCSAgICAqKC5ic3MpIDsKLQkgICAgKihDT01NT04pOwotCSAgICBfX2Jzc19lbmRfXyA9IC4gOwotCSAgICAke1JFTE9DQVRJTkcrIGVuZCA9ICAufTsKLSAJICAgIF9fZGF0YV9lbmRfXyA9IC4gOyAKLQl9Ci0KLSAgLyogVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZS4gQSBzZXF1ZW5jZSBvZiA1IHdvcmQgZW50cmllcy4gU2VjdGlvbgotICAgICBhZGRyZXNzIGFuZCBleHRlbnQgYXJlIHBsYWNlZCBpbiB0aGUgRGF0YURpcmVjdG9yeS4KLSAgKi8KLSAgLnBkYXRhIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsgCQkJCQkKLQkgICAgKigucGRhdGEpCi0gCSAgICA7Ci0JfQotCi0gIC8qIFRoZSBpZGF0YSBzZWN0aW9uIGlzIGNob2NrIGZ1bGwgb2YgbWFnaWMgYml0cy4gCi0JMS4gQm91bmRhcmllcyBhcm91bmQgdmFyaW91cyBpZGF0YSBwYXJ0cyBhcmUgdXNlZCB0byBpbml0aWFsaXplCi0JICAgc29tZSBvZiB0aGUgZmllbGRzIG9mIHRoZSBEYXRhRGlyZWN0b3J5LiBJbiBwYXJ0aWN1bGFyLCB0aGUKLQkgICBtYWdpYyBmb3IgMiwgNCBhbmQgNSBhcmUga25vd24gdG8gYmUgdXNlZC4gU29tZSBjb21waWxlcnMKLQkgICBhcHBlYXIgdG8gZ2VuZXJhdGUgbWFnaWMgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGlzIHB1cnBvc2UuCi0JICAgV2hlcmUgd2UgY2FuLCB3ZSBjYXRjaCBzdWNoIHN5bWJvbHMgYW5kIHVzZSBvdXIgb3duLiBUaGlzIG9mCi0JICAgY291cnNlIGlzIHNvbWV0aGluZyBsZXNzIHRoYW4gYSBwZXJmZWN0IHN0cmF0ZWd5LgotCTIuIFRoZSB0YWJsZSBvZiBjb250ZW50cyBpcyBwbGFjZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgaWRhdGE0LgotCSAgIFRoZSAiLnByaXZhdGUudG9jIiBzZWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBwcGMgYmZkLiBUaGUKLQkgICAudG9jIHZhcmlhYmxlIGlzIGdlbmVyYXRlZCBieSBnYXMsIGFuZCByZXNvbHZlZCBoZXJlLiBJdCBpcwotCSAgIHVzZWQgdG8gaW5pdGlhbGl6ZWQgZnVuY3Rpb24gZGVzY3JpcHRvcnMgKGFuZCBhbnlvbmUgZWxzZSB3aG8KLQkgICBuZWVkcyB0aGUgYWRkcmVzcyBvZiB0aGUgbW9kdWxlJ3MgdG9jKS4gVGhlIG9ubHkgdGhpbmcgCi0JICAgaW50ZXJlc3RpbmcgYWJvdXQgaXQgYXQgYWxsPyBNb3N0IHBwYyBpbnN0cnVjdGlvbnMgdXNpbmcgaXQKLQkgICBoYXZlIGEgMTZiaXQgZGlzcGxhY2VtZW50IGZpZWxkLiBUaGUgY29udmVudGlvbiBmb3IgYWRkcmVzc2luZwotCSAgIGlzIHRvIGluaXRpYWxpemUgdGhlIC50b2MgdmFsdWUgdG8gMzJLIHBhc3QgdGhlIHN0YXJ0IG9mIHRoZQotCSAgIGFjdHVhbCB0b2MsIGFuZCBzdWJ0cmFjdCAzMksgZnJvbSBhbGwgcmVmZXJlbmNlcywgdGh1cyB1c2luZwotCSAgIHRoZSBlbnRpcmUgNjRLIHJhbmdlLiBOYXR1cmFsbHksIHRoZSByZWxvYyBjb2RlIG11c3QgYWdyZWUKLQkgICBvbiB0aGlzIG51bWJlciBvciB5b3UgZ2V0IHByZXR0eSBzdHVwaWQgcmVzdWx0cy4KLSAgKi8KLSAgLmlkYXRhIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsgCQkJCQkKLQkgICAgX19pZGF0YTJfbWFnaWNfXyA9IC47Ci0JICAgICooLmlkYXRhXCQyKTsKLQkgICAgX19pZGF0YTNfbWFnaWNfXyA9IC47Ci0JICAgICooLmlkYXRhXCQzKTsKLQkgICAgX19pZGF0YTRfbWFnaWNfXyA9IC47Ci0JICAgICooLmlkYXRhXCQ0KTsKLQkgICAgLiA9IEFMSUdOKDQpOwotCSAgICAudG9jID0gLiArIDMyNzY4OwotCSAgICAqKC5wcml2YXRlLnRvYyk7Ci0JICAgIF9faWRhdGE1X21hZ2ljX18gPSAuOwotCSAgICAqKC5pZGF0YVwkNSk7Ci0JICAgIF9faWRhdGE2X21hZ2ljX18gPSAuOwotCSAgICAqKC5pZGF0YVwkNik7Ci0JICAgIF9faWRhdGE3X21hZ2ljX18gPSAuOwotCSAgICAqKC5pZGF0YVwkNyk7Ci0JICAgIDsKLQl9Ci0KLSAgLyogcmVsZGF0YSAtLSBkYXRhIHRoYXQgcmVxdWlyZXMgcmVsb2NhdGlvbgotICAqLwotICAucmVsZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7IAkJCQkJCi0JICAgICooLnJlbGRhdGEpCi0gCSAgICA7Ci0JfQotCi0KLSAgLyogUmVzb3VyY2VzICovCi0gIC5yc3JjIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsgCQkJCQkKLQkgICAgKigucnNyY1wkMDEpCi0JICAgICooLnJzcmNcJDAyKQotCSAgICA7Ci0JfQotCi0gIC5zdGFiIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0KLSAgLnN0YWJzdHIgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci0KLSAgLyogVGhlIC5yZWxvYyBzZWN0aW9uIGlzIGN1cnJlbnRseSBnZW5lcmF0ZWQgYnkgdGhlIGRsbHRvb2wgZnJvbSBTdGV2ZSAKLSAgICAgQ2hhbWJlcmxhaW4gaW4gYSBzZWNvbmQgcGFzcyBvZiBsaW5raW5nLiBTZWN0aW9uIGFkZHJlc3MgYW5kIGV4dGVudAotICAgICBhcmUgcGxhY2VkIGluIHRoZSBEYXRhRGlyZWN0b3J5LgotICAqLwotICAucmVsb2MgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JeyAJCQkJCQotCSAgICAqKC5yZWxvYykKLQkgICAgOwotCX0KLQotICAvKiBXZSBkb24ndCBkbyBhbnl0aGluZyB1c2VmdWwgd2l0aCBjb2RldmlldyBkZWJ1Z2dlciBzdXBwb3J0IG9yIHRoZQotICAgICBkaXJlY3RpdmUgc2VjdGlvbiAoeWV0KS4gSG9wZWZ1bGx5LCB3ZSBqdW5rIHRoZW0gY29ycmVjdGx5LiAKLSAgKi8KLSAgL0RJU0NBUkQvIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOiAKLQl7Ci0gICAgCSAgICAqKC5kZWJ1Z1wkUykKLSAgICAJICAgICooLmRlYnVnXCRUKQotICAgIAkgICAgKiguZGVidWdcJEYpCi0gICAgCSAgICAqKC5kcmVjdHZlKQotICAgIAkgICAgOwotICAgCX0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvcHNvcy5zYyBiL2xkL3NjcmlwdHRlbXBsL3Bzb3Muc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOGM2YzcuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvcHNvcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgke09VVFBVVF9GT1JNQVR9KQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORzotMH0gJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBzdGFydCA9IERFRklORUQoX1NUQVJUKSA/IF9TVEFSVCA6IERFRklORUQoX3N0YXJ0KSA/IF9zdGFydCA6IC47fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX3RleHQgPSAuKTt9Ci0gICAgKigudGV4dCk7Ci0gICAgKihjb2RlKTsKLSAgICAqKGNvbnN0KTsKLSAgICAqKHN0cmluZ3MpOwotICAgICoocFNPUyk7Ci0gICAgKihwUk9CRSk7Ci0gICAgKihwTkEpOwotICAgICoocEhJTEUpOwotICAgICoocFJFUEMpOwotICAgICoocFJQQyk7Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKTt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fRFRPUl9FTkRfXyAtIF9fX0RUT1JfTElTVF9fKSAvIDQgLSAyKTt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKTt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCk7fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fZXRleHQgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9ldGV4dCA9IC4pO30KLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkc6LTB9IDogJHtSRUxPQ0FUSU5HKyBBVChBRERSKC50ZXh0KSArIFNJWkVPRigudGV4dCkpfSB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fZGF0YSA9IC4pO30KLSAgICAqKC5kYXRhKTsKLSAgICAqKHZhcnMpOwotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2VkYXRhID0gLik7fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfZWRhdGEgPSAuKTt9Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkc6LTB9IDoKLSAgeyAJCQkJCQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2JzcyA9IC4pO30KLSAgICAqKC5ic3MpOwotICAgICooemVyb3ZhcnMpOwotICAgICooQ09NTU9OKTsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX19lYnNzID0gLik7fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2VuZCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX2VuZCA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX0ZyZWVNZW1TdGFydCA9IC4pO30KLSAgfQotICAuc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgICooLnN0YWIpOwotICB9Ci0gIC5zdGFic3RyIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICAqKC5zdGFic3RyKTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9yaXNjaXguc2MgYi9sZC9zY3JpcHR0ZW1wbC9yaXNjaXguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MDFhMGMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvcmlzY2l4LnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1JFTE9DQVRJTkcrX19EWU5BTUlDICA9ICAwO30KLSR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQotJHtTSExJQl9QQVRIKyR7UkVMT0NBVElORyske1NITElCX1BBVEh9fX0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfQUREUn19OgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKigudGV4dCkKLSAgICAke1BBRF9URVhUKyR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fX0KLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICAgICR7UkVMT0NBVElORytfX2V0ZXh0ID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICB9Ci0gIC5kYXRhICAke1JFTE9DQVRJTkcrJHtEQVRBX0FMSUdOTUVOVH19IDoKLSAgewotICAgICooLmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICAgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAgICR7UkVMT0NBVElORytfX2VkYXRhID0gIC47fQotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HK1NJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7Ci0gICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07Ci0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICR7UkVMT0NBVElORytfZW5kID0gQUxJR04oNCkgfTsKLSAgICR7UkVMT0NBVElORytfX2VuZCA9IEFMSUdOKDQpIH07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvc2EyOTIwMC5zYyBiL2xkL3NjcmlwdHRlbXBsL3NhMjkyMDAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjI2N2UuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvc2EyOTIwMC5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1FTlRSWShzdGFydCkKLQotU0VDVElPTlMgewotICAudGV4dCAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX0FERFJ9fSA6IAotICAgIHsKLQkqKC50ZXh0KTsKLQkqKC50ZXh0MSk7Ci0JKigudGV4dDIpOwotCSR7UkVMT0NBVElORytfZXRleHQgPSAufTsKLSAgICB9Ci0gIC5saXQgQUxJR04oNCkgOgotICAgewotCSooLmxpdCk7Ci0JJHtSRUxPQ0FUSU5HK19lbGl0ID0gLn07Ci0gICB9Ci0gIC5kYXRhIEFMSUdOKDQpIDoKLSAgICB7Ci0JKiguZGF0YSk7Ci0JKiguZGF0YTEpOwotCSooLmRhdGEyKTsKLQkke1JFTE9DQVRJTkcrX2VkYXRhID0gLn07Ci0JJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotCSR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47fQotCSR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotCSR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0JJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0JJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KLQkke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KLQkke0NPTlNUUlVDVElORysgTE9ORygoX19fRFRPUl9FTkRfXyAtIF9fX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLQkke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotCSR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotCSR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9Ci0gICAgfQotCi0gIC5ic3MgIEFMSUdOKDQpIDoKLSAgICB7IAotCSooQ09NTU9OKSAJCi0JKiguYnNzKQotCSR7UkVMT0NBVElORytfZW5kID0gLn07Ci0gICAgfSAKLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvc2guc2MgYi9sZC9zY3JpcHR0ZW1wbC9zaC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2ZGQyMS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9zaC5zYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLVRPUlM9Ii50b3JzIDoKLSAgewotICAgIF9fX2N0b3JzID0gLiA7Ci0gICAgKiguY3RvcnMpCi0gICAgX19fY3RvcnNfZW5kID0gLiA7Ci0gICAgX19fZHRvcnMgPSAuIDsKLSAgICAqKC5kdG9ycykKLSAgICBfX19kdG9yc19lbmQgPSAuIDsKLSAgfSA+IHJhbSIKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLU1FTU9SWQotewotICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEyawotfQotCi1TRUNUSU9OUwotewotICAudGV4dCA6Ci0gIHsKLSAgICAqKC50ZXh0KQotICAgICooLnN0cmluZ3MpCi0gICAgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotICB9ICR7UkVMT0NBVElORysgPiByYW19Ci0gICR7Q09OU1RSVUNUSU5HKyR7VE9SU319Ci0gIC5kYXRhIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotICB9ICR7UkVMT0NBVElORysgPiByYW19Ci0gIC5ic3MgOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLiA7IH0KLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgLnN0YWNrICR7UkVMT0NBVElORysgMHgzMDAwMCB9ICA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0gICAgKiguc3RhY2spCi0gIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgICooLnN0YWIpCi0gIH0KLSAgLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgICooLnN0YWJzdHIpCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYmI3YWQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBTcGFyYyBDT0ZGLgotIyBCYXNlZCBvbiBpMzg2Y29mZi5zYyBieSBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7Ci0gICAgKiguaW5pdCkKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fRFRPUl9FTkRfXyAtIF9fX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9Ci0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrIDB4NDAwMDAwICsgKC4gJiAweGZmYzAwZmZmKX0gOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAufTsKLSAgfQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3NwYXJjbHlueC5zYyBiL2xkL3NjcmlwdHRlbXBsL3NwYXJjbHlueC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiMWUxZC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIFNwYXJjIEx5bnhPUy4KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIFNJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAqKC5pbml0KQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OwotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgMHg0MDAwMDAgKyAoLiAmIDB4ZmZjMDBmZmYpfSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OwotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgeyAJCQkJCQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC59OwotICB9Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvc3QyMDAwLnNjIGIvbGQvc2NyaXB0dGVtcGwvc3QyMDAwLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWUxMzJhLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3N0MjAwMC5zYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0IDoKLQl7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0JICAqKC5zdHJpbmdzKQotICAgCSAgX2V0ZXh0ID0gLjsKLQkqKC5kYXRhKQotCV9lZGF0YSA9IC47Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSBfZW5kID0gLjsKLQotfQotCi19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjIGIvbGQvc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGJhZWQzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3RpYzMwYW91dC5zYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0ke1NUQUNLWkVSTyske1JFTE9DQVRJTkcrJHtTVEFDS1pFUk99fX0KLSR7UkVMT0NBVElORytQUk9WSURFIChfX3N0YWNrID0gMCk7fQotU0VDVElPTlMKLXsKLSAgJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn07fQotICAudGV4dCA6Ci0gIHsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrX19ldGV4dCA9IC47fQotICAgICR7UEFEX1RFWFQrJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9fQotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICAuZGF0YSA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAgICR7UkVMT0NBVElORytfX2VkYXRhICA9ICAuO30KLSAgfQotICAuYnNzIDoKLSAgewotICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrX2VuZCA9IEFMSUdOKDQpIH07Ci0gICAke1JFTE9DQVRJTkcrX19lbmQgPSBBTElHTig0KSB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3RpYzMwY29mZi5zYyBiL2xkL3NjcmlwdHRlbXBsL3RpYzMwY29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyZDRmNy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC90aWMzMGNvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goIiR7T1VUUFVUX0FSQ0h9IikKLQotTUVNT1JZCi17Ci0Jcm9tIDogT1JJR0lOID0gMHgwMDAwMDMwMCwgTEVOR1RIID0gMTZrCi0JcmFtIDogT1JJR0lOID0gMHgwMDAwMDMwMCArIDE2aywgTEVOR1RIID0gMTZrCi0JcmFtYmxrMCA6IE9SSUdJTiA9IDB4MDIwMjYwMDAsIExFTkdUSCA9IDB4MTAwMAotCXJhbWJsazEgOiBPUklHSU4gPSAweDAyMDI3MDAwLCBMRU5HVEggPSAweDEwMDAKLX0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnZlY3RvcnMgMHgwMDAwMDAwMCA6Ci17Ci0JKih2ZWN0b3JzKQotfQotCi0udGV4dCA6IAotewotCSooLnRleHQpCi19ID4gcm9tCi0KLS5jb25zdCA6Ci17Ci0JKiguY29uc3QpCi0JX19ldGV4dCA9IC4gOwotfSA+IHJvbQotCi0ubWRhdGEgOiBBVCggQUREUiguY29uc3QpICsgU0laRU9GKC5jb25zdCkgKQotewotCV9fZGF0YSA9IC4gOwotCSooLmRhdGEpOwotCV9fZWRhdGEgPSAuIDsKLX0gPiByYW0KLQotLmJzcyA6Ci17Ci0JX19ic3MgPSAuIDsKLQkqKC5ic3MpOwotCSooQ09NTU9OKTsKLQlfX2Vic3MgPSAuIDsKLX0gPiByYW0KLQotLnJhbTAgOgotewotCSoocmFtMCkKLX0gPiByYW1ibGswCi0KLS5yYW0xIDoKLXsKLQkqKHJhbTEpCi19ID4gcmFtYmxrMQotCi19Ci0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjZmNjUzLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgVEkgVE1TMzIwQzgwICh0aWM4MCkgQ09GRi4KLSMKLSMgQmVzaWRlcyB0aGUgc2hlbGwgdmFyaWFibGVzIHNldCBieSB0aGUgZW11bHBhcmFtcyBzY3JpcHQsIGFuZCB0aGUgTERfRkxBRwotIyB2YXJpYWJsZSwgdGhlIGdlbnNjcmlwdHMuc2ggc2NyaXB0IHdpbGwgc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGZvciBlYWNoCi0jIHRpbWUgdGhpcyBzY3JpcHQgaXMgcnVuIHRvIGdlbmVyYXRlIG9uZSBvZiB0aGUgbGlua2VyIHNjcmlwdHMgZm9yIGxkc2NyaXB0czoKLSMKLSMgUkVMT0NBVElORzogU2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHRoZSBsaW5rZXIgaXMgZ29pbmcgdG8gYmUgZG9pbmcKLSMgYSBmaW5hbCByZWxvY2F0aW9uLgotIwotIyBDT05TVFJVQ1RJTkc6IFNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiB0aGUgbGlua2VyIGlzIGdvaW5nIHRvIGJlCi0jIGJ1aWxkaW5nIGdsb2JhbCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMuCi0jCi0jIERBVEFfQUxJR05NRU5UOiBTZXQgdG8gYW4gQUxJR04gZXhwcmVzc2lvbiB3aGVuIHRoZSBvdXRwdXQgc2hvdWxkIGJlIHBhZ2UKLSMgYWxpZ25lZCwgb3IgdG8gIi4iIHdoZW4gZ2VuZXJhdGluZyB0aGUgLU4gc2NyaXB0LgotIwotIyBDUkVBVEVfU0hMSUI6IFNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiBnZW5lcmF0aW5nIGEgc2NyaXB0IGZvcgotIyB0aGUgLXNoYXJlZCBsaW5rZXIgYXJnLgotCi10ZXN0IC16ICIkVEVYVF9TVEFSVF9BRERSIiAmJiBURVhUX1NUQVJUX0FERFI9IjB4ODAwMDAgKyBTSVpFT0ZfSEVBREVSUyIKLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X19zdGFydAotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrICRURVhUX1NUQVJUX0FERFJ9IDogewotICAgICooLmluaXQpCi0gICAgKiguZmluaSkKLSAgICAqKC50ZXh0KQotICB9Ci0gIC5jb25zdCBBTElHTig0KSA6IHsKLSAgICAqKC5jb25zdCkKLSAgfQotICAuY3RvcnMgQUxJR04oNCkgOiB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrIC4gPSBBTElHTig0KTt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoLTEpfQotICAgICooLmN0b3JzKQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gIH0KLSAgLmR0b3JzIEFMSUdOKDQpIDogewotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKC0xKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gIC5kYXRhIDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2VkYXRhICA9ICAufTsKLSAgfQotICAuYnNzIDogeyAJCQkJCQotICAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgICR7UkVMT0NBVElORysgX2VuZCA9IEFMSUdOKDB4OCl9OwotICAgICAke1JFTE9DQVRJTkcrIF9fZW5kID0gQUxJR04oMHg4KX07Ci0gIH0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC92ODUwLnNjIGIvbGQvc2NyaXB0dGVtcGwvdjg1MC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyMDk1NC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC92ODUwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLWNhdCA8PCBFT0YKLU9VVFBVVF9GT1JNQVQoImVsZjMyLXY4NTAiLCAiZWxmMzItdjg1MCIsCi0JICAgICAgImVsZjMyLXY4NTAiKQotT1VUUFVUX0FSQ0godjg1MCkKLUVOVFJZKF9zdGFydCkKLVNFQVJDSF9ESVIoLik7Ci0vKi9jcml0dGVycy9zbHVnL2dyb3NzbWFuL2luc3RhbGwvc3VuNC92ODUwLWVsZi9saWIqLwotU0VDVElPTlMKLXsKLSAgLyogVGhpcyBzYXZlcyBhIGxpdHRsZSBzcGFjZSBpbiB0aGUgRUxGIGZpbGUsIHNpbmNlIHRoZSB6ZGEgc3RhcnRzCi0gICAgIGF0IGEgaGlnaGVyIGxvY2F0aW9uIHRoYXQgdGhlIEVMRiBoZWFkZXJzIHRha2UgdXAuICAqLwotCi0gIC56ZGF0YSAke1pEQVRBX1NUQVJUX0FERFJ9IDogewotCSooLnpkYXRhKQotCSooLnpic3MpCi0JKihyZXN6ZGF0YSkKLQkqKC56Y29tbW9uKQotICB9Ci0KLSAgLyogVGhpcyBpcyB0aGUgcmVhZCBvbmx5IHBhcnQgb2YgdGhlIHplcm8gZGF0YSBhcmVhLgotICAgICBIYXZpbmcgaXQgYXMgYSBzZXBlcmF0ZSBzZWN0aW9uIHByZXZlbnRzIGl0cwotICAgICBhdHRyaWJ1dGVzIGZyb20gYmVpbmcgaW5oZXJpdGVkIGJ5IHRoZSB6ZGF0YQotICAgICBzZWN0aW9uLiAgU3BlY2lmaWNhbGx5IGl0IHByZXZlbnRzIHRoZSB6ZGF0YQotICAgICBzZWN0aW9uIGZyb20gYmVpbmcgbWFya2VkIFJFQURPTkxZLiAgKi8KLQotICAucm96ZGF0YSAke1JPWkRBVEFfU1RBUlRfQUREUn0gOiB7Ci0JKigucm96ZGF0YSkKLQkqKHJvbXpkYXRhKQotCSoocm9temJzcykKLSAgfQotCi0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gJHtURVhUX1NUQVJUX0FERFJ9OwotICAuaW50ZXJwCTogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2gJCTogeyAqKC5oYXNoKSB9Ci0gIC5keW5zeW0JOiB7ICooLmR5bnN5bSkgfQotICAuZHluc3RyCTogeyAqKC5keW5zdHIpIH0KLSAgLnJlbC50ZXh0CTogeyAqKC5yZWwudGV4dCkgfQotICAucmVsYS50ZXh0CTogeyAqKC5yZWxhLnRleHQpIH0KLSAgLnJlbC5kYXRhCTogeyAqKC5yZWwuZGF0YSkgfQotICAucmVsYS5kYXRhCTogeyAqKC5yZWxhLmRhdGEpIH0KLSAgLnJlbC5yb2RhdGEJOiB7ICooLnJlbC5yb2RhdGEpIH0KLSAgLnJlbGEucm9kYXRhCTogeyAqKC5yZWxhLnJvZGF0YSkgfQotICAucmVsLmdvdAk6IHsgKigucmVsLmdvdCkgfQotICAucmVsYS5nb3QJOiB7ICooLnJlbGEuZ290KSB9Ci0gIC5yZWwuY3RvcnMJOiB7ICooLnJlbC5jdG9ycykgfQotICAucmVsYS5jdG9ycwk6IHsgKigucmVsYS5jdG9ycykgfQotICAucmVsLmR0b3JzCTogeyAqKC5yZWwuZHRvcnMpIH0KLSAgLnJlbGEuZHRvcnMJOiB7ICooLnJlbGEuZHRvcnMpIH0KLSAgLnJlbC5pbml0CTogeyAqKC5yZWwuaW5pdCkgfQotICAucmVsYS5pbml0CTogeyAqKC5yZWxhLmluaXQpIH0KLSAgLnJlbC5maW5pCTogeyAqKC5yZWwuZmluaSkgfQotICAucmVsYS5maW5pCTogeyAqKC5yZWxhLmZpbmkpIH0KLSAgLnJlbC5ic3MJOiB7ICooLnJlbC5ic3MpIH0KLSAgLnJlbGEuYnNzCTogeyAqKC5yZWxhLmJzcykgfQotICAucmVsLnBsdAk6IHsgKigucmVsLnBsdCkgfQotICAucmVsYS5wbHQJOiB7ICooLnJlbGEucGx0KSB9Ci0gIC5pbml0CQk6IHsgS0VFUCAoKiguaW5pdCkpIH0gPTAKLSAgLnBsdAkJOiB7ICooLnBsdCkgfQotCi0gIC50ZXh0CQk6IHsKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysqKC50ZXh0LiopfQotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLwotICAgICooLmdudS53YXJuaW5nKQotICAgICooLmdudS5saW5rb25jZS50KikKLSAgfSA9MAotCi0gICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGV0ZXh0ID0gLik7fQotCi0gICAvKiBUaGlzIGlzIHNwZWNpYWwgY29kZSBhcmVhIGF0IHRoZSBlbmQgb2YgdGhlIG5vcm1hbCB0ZXh0IHNlY3Rpb24uCi0gICAgICBJdCBjb250YWlucyBhIHNtYWxsIGxvb2t1cCB0YWJsZSBhdCB0aGUgc3RhcnQgZm9sbG93ZWQgYnkgdGhlCi0gICAgICBjb2RlIHBvaW50ZWQgdG8gYnkgZW50cmllcyBpbiB0aGUgbG9va3VwIHRhYmxlLiAgKi8KLQotICAuY2FsbF90YWJsZV9kYXRhICR7Q0FMTF9UQUJMRV9TVEFSVF9BRERSfSA6IHsKLSAgICAke1JFTE9DQVRJTkcrUFJPVklERShfX2N0YnAgPSAuKTt9Ci0gICAgKiguY2FsbF90YWJsZV9kYXRhKQotICB9ID0gMHhmZiAgIC8qIGZpbGwgZ2FwcyB3aXRoIDB4ZmYgKi8KLSAgLmNhbGxfdGFibGVfdGV4dCA6IHsKLSAgICAqKC5jYWxsX3RhYmxlX3RleHQpCi0gIH0KLQotICAuZmluaQkJOiB7IEtFRVAgKCooLmZpbmkpKSAgICB9ID0wCi0gIC5yb2RhdGEJOiB7ICooLnJvZGF0YSkgJHtSRUxPQ0FUSU5HKyooLnJvZGF0YS4qKX0gKiguZ251LmxpbmtvbmNlLnIqKSB9Ci0gIC5yb2RhdGExCTogeyAqKC5yb2RhdGExKSB9Ci0KLSAgLmRhdGEJCTogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyooLmRhdGEuKil9Ci0gICAgKiguZ251LmxpbmtvbmNlLmQqKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIC5kYXRhMQk6IHsgKiguZGF0YTEpIH0KLSAgLmN0b3JzCTogewotICAgICR7UkVMT0NBVElORytfX19jdG9ycyA9IC47fQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCi0gICAgS0VFUCAoKmNydGVuZCguY3RvcnMpKQotICAgICR7UkVMT0NBVElORytfX19jdG9yc19lbmQgPSAuO30KLSAgfQotCi0gIC5kdG9ycwk6IHsKLSAgICAke1JFTE9DQVRJTkcrX19fZHRvcnMgPSAuO30KLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuZHRvcnMpKQotICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQotICAgIEtFRVAgKCpjcnRlbmQubyguZHRvcnMpKQotICAgICR7UkVMT0NBVElORytfX19kdG9yc19lbmQgPSAuO30KLSAgfQotCi0gIC5nb3QJCTogeyAqKC5nb3QucGx0KSAqKC5nb3QpIH0KLSAgLmR5bmFtaWMJOiB7ICooLmR5bmFtaWMpIH0KLQotICAudGRhdGEgJHtUREFUQV9TVEFSVF9BRERSfSA6IHsKLQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19lcCA9IC4pO30KLQkqKC50Ynl0ZSkKLQkqKC50Y29tbW9uX2J5dGUpCi0JKigudGRhdGEpCi0JKigudGJzcykKLQkqKC50Y29tbW9uKQotICB9Ci0KLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbwotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLwotICAuc2RhdGEgJHtTREFUQV9TVEFSVF9BRERSfSA6IHsKLQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19ncCA9IC4gKyAweDgwMDApO30KLQkqKC5zZGF0YSkKLSAgIH0KLQotICAvKiBTZWUgY29tbWVudCBhYm91dCAucm96ZGF0YS4gKi8KLSAgLnJvc2RhdGEgJHtST1NEQVRBX1NUQVJUX0FERFJ9IDogewotCSooLnJvc2RhdGEpCi0gIH0KLQotICAvKiBXZSBwbGFjZSB0aGUgLnNic3MgZGF0YSBzZWN0aW9uIEFGVEVSIHRoZSAucm9zZGF0YSBzZWN0aW9uLCBzbyB0aGF0Ci0gICAgIGl0IGNhbiBkaXJlY3RseSBwcmVjZWVkIHRoZSAuYnNzIHNlY3Rpb24uICBUaGlzIGFsbG93cyBydW50aW1lIHN0YXJ0dXAKLSAgICAgY29kZSB0byBpbml0aWFsaXNlIGFsbCB0aGUgemVyby1kYXRhIHNlY3Rpb25zIGJ5IHNpbXBseSB0YWtpbmcgdGhlCi0gICAgIHZhbHVlIG9mICdfZWRhdGEnIGFuZCB6ZXJvaW5nIHVudGlsIGl0IHJlYWNoZXMgJ19lbmQnICAqLwotICAuc2JzcyA6IHsKLQkke1JFTE9DQVRJTkcrX19zYnNzX3N0YXJ0ID0gLjt9Ci0JKiguc2JzcykKLQkqKC5zY29tbW9uKQotICB9Ci0KLSAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSBERUZJTkVEIChfX3Nic3Nfc3RhcnQpID8gX19zYnNzX3N0YXJ0IDogLiA7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSBfZWRhdGEpO30KLQotICAuYnNzICAgICAgIDoKLSAgewotCSR7UkVMT0NBVElORytfX2Jzc19zdGFydCA9IERFRklORUQgKF9fc2Jzc19zdGFydCkgPyBfX3Nic3Nfc3RhcnQgOiAuIDt9Ci0JJHtSRUxPQ0FUSU5HK19fcmVhbF9ic3Nfc3RhcnQgPSAuIDt9Ci0JKiguZHluYnNzKQotCSooLmJzcykKLQkqKENPTU1PTikKLSAgfQotCi0gICR7UkVMT0NBVElORytfZW5kID0gLiA7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZW5kID0gLik7fQotCi0gIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0gIC5zdGFiIDAJCTogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyIDAJCTogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wgMAkJOiB7ICooLnN0YWIuZXhjbCkgfQotICAuc3RhYi5leGNsc3RyIDAJOiB7ICooLnN0YWIuZXhjbHN0cikgfQotICAuc3RhYi5pbmRleCAwCQk6IHsgKiguc3RhYi5pbmRleCkgfQotICAuc3RhYi5pbmRleHN0ciAwCTogeyAqKC5zdGFiLmluZGV4c3RyKSB9Ci0gIC5jb21tZW50IDAJCTogeyAqKC5jb21tZW50KSB9Ci0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnICAgICAgICAgIDAJOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwCTogeyAqKC5saW5lKSB9Ci0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAgMAk6IHsgKiguZGVidWdfc3JjaW5mbykgfQotICAuZGVidWdfc2ZuYW1lcyAgMAk6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotCi0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMAk6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMAk6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwCTogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwCTogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAJOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAJOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwCTogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAJOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMAk6IHsgKiguZGVidWdfbWFjaW5mbykgfQotCi0gIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfd2Vha25hbWVzIDAJOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAJOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQotICAuZGVidWdfdHlwZW5hbWVzIDAJOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQotICAuZGVidWdfdmFybmFtZXMgIDAJOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9Ci0KLSAgLyogVXNlciBzdGFjayAqLwotICAuc3RhY2sgMHgyMDAwMDAJOiB7Ci0JJHtSRUxPQ0FUSU5HK19fc3RhY2sgPSAuO30KLQkqKC5zdGFjaykKLSAgfQotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICAuICAqLwotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC92YW5pbGxhLnNjIGIvbGQvc2NyaXB0dGVtcGwvdmFuaWxsYS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc5ODQ4MC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC92YW5pbGxhLnNjCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBOb3RoaW5nIHRvIGRvLgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdzY1LnNjIGIvbGQvc2NyaXB0dGVtcGwvdzY1LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTA0NDk1Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3c2NS5zYworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi1NRU1PUlkgewotCXJhbSAgIDogbyA9IDB4MTAwMCwgbCA9IDUxMmsKLQl9Ci0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0IDoKLQl7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0JICAqKC5zdHJpbmdzKQotICAgCSAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotCi0KLS50b3JzICAgOiB7Ci0JX19fY3RvcnMgPSAuIDsKLQkqKC5jdG9ycykKLQlfX19jdG9yc19lbmQgPSAuIDsKLQlfX19kdG9ycyA9IC4gOwotCSooLmR0b3JzKQotCV9fX2R0b3JzX2VuZCA9IC4gOwotfSAgJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLQotLmRhdGEgIDoKLQl7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmJzcyAgOgotCXsKLQkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDsgfQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9ICR7UkVMT0NBVElORysgPnJhbX0KLS5zdGFjayAke1JFTE9DQVRJTkcrIDB4MzAwMDAgfSAgOiAKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLSAgLnN0YWIgIC4gKE5PTE9BRCkgOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAuIChOT0xPQUQpIDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvejgwMDAuc2MgYi9sZC9zY3JpcHR0ZW1wbC96ODAwMC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4NzkzMC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC96ODAwMC5zYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgiJHtPVVRQVVRfQVJDSH0iKQotRU5UUlkoX3N0YXJ0KQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCAke0JJRysgJHtSRUxPQ0FUSU5HKyAweDAwMDAwMDB9fSA6IHsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQkgICooLnN0cmluZ3MpCi0JICAqKC5yZGF0YSkKLQl9Ci0KLS5jdG9ycyAke0JJRysgJHtSRUxPQ0FUSU5HKyAweDIwMDAwMDB9fSAgOiAKLQl7Ci0JICAke1JFTE9DQVRJTkcrIF9fX2N0b3JzID0gLiA7ICB9Ci0JICAqKC5jdG9ycyk7Ci0JICAke1JFTE9DQVRJTkcrIF9fX2N0b3JzX2VuZCA9IC4gOyB9Ci0JICBfX19kdG9ycyA9IC4gOwotCSAgKiguZHRvcnMpOwotCSAgJHtSRUxPQ0FUSU5HKyBfX19kdG9yc19lbmQgPSAuIDsgfQotCX0gCi0KLS5kYXRhICR7QklHKyAke1JFTE9DQVRJTkcrIDB4MzAwMDAwMH19IDogewotCSooLmRhdGEpCi0JfQotCi0uYnNzICR7QklHKyAke1JFTE9DQVRJTkcrIDB4NDAwMDAwMH19IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrIF9fc3RhcnRfYnNzID0gLiA7IH0KLSAgICAqKC5ic3MpOwotICAgICooQ09NTU9OKTsKLSAgICAke1JFTE9DQVRJTkcrIF9fZW5kX2JzcyA9IC4gOyB9Ci0gIH0KLQotLmhlYXAgJHtCSUcrICR7UkVMT0NBVElORysgMHg1MDAwMDAwfX0gOiB7Ci0JJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2hlYXAgPSAuIDsgfQotCSR7UkVMT0NBVElORysgLiA9IC4gKyAyMGsgIDsgfQotCSR7UkVMT0NBVElORysgX19lbmRfaGVhcCA9IC4gOyB9Ci0JfSAKLQotLnN0YWNrICR7UkVMT0NBVElORysgMHhmMDAwIH0gIDogCi0JewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQkke1JFTE9DQVRJTkcrIF9fc3RhY2tfdG9wID0gLiA7IH0KLQl9IAotCi19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc3RhbXAtaC5pbiBiL2xkL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvbGQvc3RhbXAtaC5pbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRpbWVzdGFtcApkaWZmIC0tZ2l0IGEvbGQvc3lzZGVwLmggYi9sZC9zeXNkZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjYzEyMi4uMDAwMDAwMAotLS0gYS9sZC9zeXNkZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIHN5c2RlcC5oIC0tIGhhbmRsZSBob3N0IGRlcGVuZGVuY2llcyBmb3IgdGhlIEdOVSBsaW5rZXIKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERfU1lTREVQX0gKLSNkZWZpbmUgTERfU1lTREVQX0gKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZWxzZQotZXh0ZXJuIGNoYXIgKnN0cmNociAoKTsKLWV4dGVybiBjaGFyICpzdHJyY2hyICgpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0jaW5jbHVkZSAiZm9wZW4tYmluLmgiCi0jZWxzZQotI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLWV4dGVybiBjaGFyICpzdHJzdHIgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotZXh0ZXJuIHZvaWQgZnJlZSAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKLWV4dGVybiBjaGFyICpnZXRlbnYgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgotZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKExEX1NZU0RFUF9IKSAqLwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL0NoYW5nZUxvZyBiL2xkL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNzhlODRiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4NDQgKzAsMCBAQAotMTk5OS0xMS0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHA6IEZpeCB0ZXN0IHRvIGRpc2FibGUgdGhlc2UgY2hlY2tzIGZvcgotCVBFIGJhc2VkIHRhcmdldHMuCi0KLTE5OTktMTAtMjkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBsZC1zZWxlY3RpdmUvc2VsZWN0aXZlLmV4cDogIFJlbW92ZSB0ZXN0Ni4KLQkqIGxkLXNlbGVjdGl2ZS81LmNjOiBEZWxldGUuCi0KLTE5OTktMTAtMjggIFNjb3R0IEJhbWJyb3VnaCAgPHNjb3R0YkBuZXR3aW5kZXIub3JnPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBTZXR1cCBleHBlY3RlZCBmYWlsdXJlcyBmb3IKLQlzcmVjIHRlc3RzIG9uIEFSTSBMaW51eC4KLQotMTk5OS0wOS0xNyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogeGZhaWwgbGludXgqbGliYzEgc2hhcmVkIChub24gUElDLCBsb2FkCi0Jb2Zmc2V0KSB0ZXN0LgotCi0xOTk5LTA5LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGQtc2NyaXB0cy9zY3JpcHQuZXhwOiBBZGQgLS1pbWFnZS1iYXNlIDAgZm9yIFBFIHRhcmdldHMuCi0KLTE5OTktMDgtMTcgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogbGQtY2R0ZXN0L2NkdGVzdC1mb28uY2MgKEZvbzo6aW5pdF9mb28pOiBVc2UgIiVsZCIgZm9yIHNpemVvZi4KLQotMTk5OS0wOC0wOSAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwOiBSdW4gdGVzdHMgb24gc3BhcmMqLSotbGludXgqLgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IExpa2V3aXNlLgotCi0xOTk5LTA3LTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsaWIvbGQtbGliLmV4cCAocHJvYyBiaWdfb3JfbGl0dGxlX2VuZGlhbik6IE5ldyBwcm9jLgotCURldGVybWluZSBpZiBhIGJpZyBlbmRpYW4gb3IgbGl0dGxlIGVuZGlhbiBvdXRwdXQgZm9ybWF0IGhhc3MKLQliZWVuIHNlbGVjdGVkIGJ5IGFueSBvZiB0aGUgbXVsdGlsaWIgb3B0aW9ucywgYW5kIGlmIHNvIHJldHVybgotCWEgc3VpdGFibGUgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgdGhlIGxpbmtlci9hc3NlbWJsZXIuCi0JKHByb2MgZGVmYXVsdF9sZF9saW5rKTogSW5jbHVkZSB0aGUgcmVzdWx0IG9mIHByb2MKLQliaWdfb3JfbGl0dGxlX2VuZGlhbiBvbiB0aGUgY29tbWFuZCBsaW5lIHRvIHRoZSBsaW5rZXIuCi0JKHByb2MgbGRfc2ltcGxlX2xpbmspOiBJbmNsdWRlIHRoZSByZXN1bHQgb2YgcHJvYwotCWJpZ19vcl9saXR0bGVfZW5kaWFuIG9uIHRoZSBjb21tYW5kIGxpbmUgdG8gdGhlIGxpbmtlci4KLQkocHJvYyBkZWZhdWx0X2xkX2NvbXBpbGUpOiBBcHBlbmQgbXVsdGlsaWIgZmxhZ3MgdG8gY29tcGlsZXIKLQlzd2l0Y2hlcy4KLQkocHJvYyBkZWZhdWx0X2xkX2Fzc2VtYmxlKTogSW5jbHVkZSB0aGUgcmVzdWx0IG9mIHByb2MKLQliaWdfb3JfbGl0dGxlX2VuZGlhbiBvbiB0aGUgY29tbWFuZCBsaW5lIHRvIHRoZSBsaW5rZXIuCi0KLTE5OTktMDctMjEgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogbGQtZWxmdmVycy92ZXJzMS5jOiBBZGQgbWlzc2luZyBwcm90b3R5cGVzIGFuZCBpbmNsdWRlCi0JPHN0ZGlvLmg+IGlmIG5lY2Vzc2FyeS4KLQkqIGxkLWVsZnZlcnMvdmVyczE1LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzMTkuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMyLmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzMy5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczQuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM2LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzNy5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczkuYzogTGlrZXdpc2UuCi0JKiBsZC1zaGFyZWQvbWFpbi5jOiBMaWtld2lzZS4KLQkqIGxkLXNyZWMvc3IzLmNjIChGb286OkZvbyk6IFJlbW92ZSBhcmcgbmFtZS4KLQotVGh1IEp1bCAxNSAxODowMDozMCAxOTk5ICBNYXJrIFAuIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogWEZBSUwgb24gSVJJWDYgZm9yIHRoZSB1c3VhbCBhcwotCXdpdGggb3RoZXIgRFdBUkYyIHRhcmdldHMuCi0KLTE5OTktMDctMTMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBEbyBub3QgZXhwZWN0IGFybSB0b29sY2hhaW5zIHRvIGZhaWwKLQl0aGUgdW5kZWZpbmVkIGxpbmUgdGVzdC4KLQotMTk5OS0wNy0xMCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHA6IFVzZSAtcnBhdGggaW4gbmV3IHZlcnMxOSB0ZXN0LgotCi0xOTk5LTA3LTA3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cDogQWRkIG5ldyB0ZXN0cyB2ZXJzMTcgdG8gdmVyczE5LgotCSogbGQvZWxmdmVycy97dmVyczE3LiosIHZlcnMxOC4qLCB2ZXJzMTkuKn06IE5ldyBmaWxlcy4KLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+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+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBQYXNzIGNtcCBvdXRwdXQgdGhyb3VnaAotCXBydW5lX3N5c3RlbV9jcnVkLgotCSogbGQtY2R0ZXN0L2NkdGVzdC5leHA6IFBhc3MgZGlmZiBvdXRwdXQgdGhyb3VnaAotCXBydW5lX3N5c3RlbV9jcnVkLgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IExpa2V3aXNlLgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFJlbW92ZSB1bnVzZWQgYW5kIHVzZWxlc3MgcHJvYyBsZF9sb2FkLgotCi1TdW4gT2N0IDMwIDEzOjAyOjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9jb21waWxlKTogUmVtb3ZlIHRoZSBvdXRwdXQgZmlsZSBiZWZvcmUKLQljb21waWxpbmcuCi0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBNb3ZlIGNvbW1vbiB0ZXN0IGNvZGUgaW50byBhIHByb2NlZHVyZS4KLQlBZGQgdGVzdHMgZm9yIGNvbXBpbGluZyB0aGUgbm9uIHNoYXJlZCBjb2RlIFBJQy4KLQkqIGxkLXNoYXJlZC9tYWluLmMgKG1haW4pOiBDYWxsIG1haW5fY2FsbGVkLCBhbmQgcHJpbnQgdGhlIHJlc3VsdC4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZGF0OiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0KLVRodSBPY3QgMjcgMTc6MzA6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZC1zaGFyZWQ6IE5ldyBkaXJlY3RvcnksIHdpdGggbmV3IGZpbGVzIHRvIHRlc3QgZ2VuZXJhdGluZyBFTEYKLQlzaGFyZWQgbGlicmFyaWVzLgotCi0JKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX2NvbXBpbGUpOiBJZiB0aGUgY29tcGlsYXRpb24gd29ya2VkLCBidXQKLQlubyBvYmplY3QgZmlsZSB3YXMgY3JlYXRlZCwgY2hlY2sgdG8gc2VlIGlmIHRoZSBjb21waWxlciBmb29saXNobHkKLQlpZ25vcmVkIHRoZSAtbyBzd2l0Y2ggd2hlbiBjb21waWxpbmcsIGFuZCBtb3ZlIHRoZSByZXN1bHRpbmcKLQlvYmplY3QgaWYgaXQgZGlkLgotCi1UaHUgU2VwIDI5IDEyOjM2OjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogVk1TIGRvZXMgbm90IHBlcm1pdHMgYC4nIGluIGRpcmVjdG9yeSBuYW1lcy4gIFJlbmFtZWQKLQlsZC5ib290c3RyYXAgdG8gbGQtYm9vdHN0cmFwLCBsZC5jZHRlc3QgdG8gbGQtY2R0ZXN0LCBhbmQKLQlsZC5zY3JpcHRzIHRvIGxkLXNjcmlwdHMuCi0KLVdlZCBTZXAgMjggMTI6MTg6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFNldCB2YXJpYWJsZXMgYXMgYW5kIG5tLiAgQ3JlYXRlIHRtcGRpciBpZgotCWl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0JKiBsZC5ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogRG9uJ3QgY3JlYXRlIHRtcGRpciBoZXJlLgotCSogbGQuY2R0ZXN0L2NkdGVzdC5leHA6IExpa2V3aXNlLgotCSogbGQuc2NyaXB0cy9kZWZpbmVkLmV4cDogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBzZXQgYXMgYW5kIG5tCi0JaGVyZS4gIENoYW5nZSBwZXJyb3IgZm9yIG5vIHZhcmlhYmxlcyBmb3VuZCB0byBmYWlsLgotCSogbGQuc2NyaXB0cy9zY3JpcHQuZXhwOiBOZXcgdGVzdC4KLQkqIGxkLnNjcmlwdHMvc2NyaXB0LnQsIGxkLnNjcmlwdHMvc2NyaXB0LnM6IE5ldyBmaWxlcy4KLQotVHVlIFNlcCAyNyAxNDo1OTo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkLnNjcmlwdHM6IE5ldyBkaXJlY3RvcnkuCi0JKiBsZC5zY3JpcHRzL2RlZmluZWQuZXhwLCBsZC5zY3JpcHRzL2RlZmluZWQuczogTmV3IGZpbGVzLgotCSogbGQuc2NyaXB0cy9kZWZpbmVkLnQ6IE5ldyBmaWxlLgotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9zaW1wbGVfbGluayk6IE5ldyBmdW5jdGlvbi4KLQkoZGVmYXVsdF9sZF9hc3NlbWJsZSwgZGVmYXVsdF9sZF9ubSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFJlbmFtZSBmcm9tIHVuaXgtbGQuZXhwLgotCShsZF9zaW1wbGVfbGluaywgbGRfYXNzZW1ibGUsIGxkX25tKTogTmV3IGZ1bmN0aW9ucy4KLQotCSogY29uZmlnL3VuaXgtbGQuZXhwOiBTZXQgbGQgdXNpbmcgZmluZGZpbGUuCi0JKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX3JlbG9jYXRlKTogUmV0dXJuIGEgdmFsdWUuICBDaGFuZ2UgZm9ybWF0Ci0Jb2YgbG9nIG1lc3NhZ2VzLgotCShkZWZhdWx0X2xkX2NvbXBpbGUpOiBMaWtld2lzZS4KLQkoZGVmYXVsdF9sZF9saW5rKTogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBpbmNsdWRlICRCRkRMSUIgYW5kCi0JJExJQklCRVJUWSBpbiBsaW5rLgotCSogbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IFJld3JpdGUuCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LmV4cDogUmV3cml0ZS4KLQkqIGxkLmNkdGVzdC9jZHRlc3QtZm9vLmNjOiBVcGRhdGUgZnJvbSB0b3AgbGV2ZWwgbGQgZGlyZWN0b3J5LgotCSogbGQuY2R0ZXN0L2NkdGVzdC1mb28uaDogTGlrZXdpc2UuCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LW1haW4uY2M6IExpa2V3aXNlLgotCi1GcmkgTWF5IDI3IDA5OjM1OjA0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LmV4cDogRG9uJ3QgbG9vayBmb3IgJHJlc3VsdCBiZWZvcmUgaXQncwotCWRlZmluZWQuCi0KLVR1ZSBNYXkgMTcgMTU6MDY6NDkgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZC5ib290c3RyYXAvYm9vdHN0cmFwLmV4cCwgbGliL2xkLmV4cDogUmVwbGFjZSBlcnJvciBwcm9jCi0JICBjYWxscyB3aXRoIHBlcnJvciBjYWxscy4KLQotV2VkIE1heSAxMSAxNjo0Nzo0NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkLmNkdGVzdC9jZHRlc3QtYmFyLmNjOiBSZW5hbWVkIGZyb20gY2R0ZXN0LWZ1bmMuY2MuCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LmV4cDogQWRqdXN0ZWQuCi0KLUZyaSBKYW4gMjggMTM6MjU6NDEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGliL2xkLmV4cCAoc2ltcGxlX2RpZmYpOiBJbmRpY2F0ZSBmYWlsdXJlIGlmIGZpbGVzIGhhdmUKLQlkaWZmZXJlbnQgbnVtYmVycyBvZiBsaW5lcy4gIERvbid0IG11Y2sgd2l0aCAkZGlmZmVyZW5jZXMgdG8gYXZvaWQKLQlpbmRpY2F0aW5nIGEgcGFzcywganVzdCByZXR1cm4uCi0KLQkqIHRlc3RzdWl0ZS9sZC5jZHRlc3Qve2NkdGVzdC1mb28uaCxjZHRlc3QtZm9vLmNjLGNkdGVzdC1tYWluLmNjfToKLQlGaXggdGVzdCBjYXNlIHRvIGJlIHZhbGlkIEFOU0kgQysrLiAgRG9uJ3QgcmVxdWlyZSB1c2Ugb2YgaGVhZGVyCi0JZmlsZXMsIHNvICIuLi9nY2MveGdjYyAtQi4uL2djYy8iIGNhbiBiZSB1c2VkIGZvciBDWFguCi0JKiB0ZXN0c3VpdGUvbGQuY2R0ZXN0L2NkdGVzdC5leHA6IENvbWJpbmUgInJtIiBsaW5lcy4gIEFkZCBzb21lCi0JY29tbWVudGFyeSBvbiB0aGluZ3MgdGhhdCBhcmUgc3RpbGwgYnJva2VuIHdpdGggdGhpcyB0ZXN0IGNhc2UuCi0KLUZyaSBTZXAgMTAgMDk6NTg6MjMgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogdGVzdHN1aXRlL2xkLmNkdGVzdC9jZHRlc3QuZXhwOiBBZGRlZCBDWFhGTEFHUyB0byBjb21waWxlIHN0YWdlLgotCi1UaHUgQXVnIDEyIDE2OjA1OjM3IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIHRlc3RzdWl0ZS9saWIvbGQuZXhwOiBhZGQgY29tcGlsZXIgYW5kIGxpbmtlciBzdXBwb3J0Ci0JKiB0ZXN0c3VpdGUvY29uZmlnL3VuaXgtbGQuZXhwOiBhZGQgY29tcGlsZXIgYW5kIGxpbmtlciBzdXBwb3J0Ci0JKiB0ZXN0c3VpdGUvbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IGZpeGVkIHRvIGRvIHBhcnRpYWwgbGlua3MKLQkqIHRlc3RzdWl0ZS9sZC5jZHRlc3QvY2R0ZXN0LmV4cDogY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB0ZXN0c2Nhc2UKLQotV2VkIEF1ZyAgNCAyMTowMDoxOCAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiB0ZXN0c3VpdGUvbGliL2xkLmV4cDogbmV3IGZpbGUKLQkqIHRlc3RzdWl0ZS9jb25maWcvdW5peC1sZC5leHA6IG5ldyBmaWxlCi0JKiB0ZXN0c3VpdGUvbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IG5ldyBmaWxlCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwIGIvbGQvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEwZmRlYS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLSMgQmFzaWMgZXhwZWN0IHNjcmlwdCBmb3IgTEQgUmVncmVzc2lvbiBUZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBKZWZmcmV5IFdoZWF0IChjYXNzaWR5QGN5Z251cy5jb20pCi0jCi0KLWlmICFbaW5mbyBleGlzdHMgbGRdIHRoZW4gewotICAgIHNldCBsZCBbZmluZGZpbGUgJGJhc2VfZGlyL2xkLW5ldyAkYmFzZV9kaXIvbGQtbmV3IFt0cmFuc2Zvcm0gbGRdXQotfQotCi1pZiAhW2luZm8gZXhpc3RzIGFzXSB0aGVuIHsKLSAgICBzZXQgYXMgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9nYXMvYXMtbmV3ICRiYXNlX2Rpci8uLi9nYXMvYXMtbmV3IFt0cmFuc2Zvcm0gYXNdXQotfQotCi1pZiAhW2luZm8gZXhpc3RzIG5tXSB0aGVuIHsKLSAgICBzZXQgbm0gW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9ubS1uZXcgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL25tLW5ldyBbdHJhbnNmb3JtIG5tXV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBvYmpkdW1wXSB0aGVuIHsKLSAgICBzZXQgb2JqZHVtcCBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL29iamR1bXBdCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgb2JqY29weV0gdGhlbiB7Ci0gICAgc2V0IG9iamNvcHkgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9vYmpjb3B5XQotfQotCi1pZiAhW2luZm8gZXhpc3RzIGFyXSB0aGVuIHsKLSAgICBzZXQgYXIgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9hcl0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBzdHJpcF0gdGhlbiB7Ci0gICAgc2V0IHN0cmlwIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYmludXRpbHMvc3RyaXAtbmV3ICRiYXNlX2Rpci8uLi9iaW51dGlscy9zdHJpcC1uZXcgW3RyYW5zZm9ybSBzdHJpcF1dCi19Ci0KLWlmIHshW2ZpbGUgaXNkaXJlY3RvcnkgdG1wZGlyXX0gdGhlbiB7Ci0gICAgY2F0Y2ggImV4ZWMgbWtkaXIgdG1wZGlyIiBzdGF0dXMKLX0KLQotIyBNYWtlIGEgc3ltbGluayBmcm9tIHRtcGRpci9hcyB0byB0aGUgYXNzZW1ibGVyIGluIHRoZSBidWlsZCB0cmVlLCBzbwotIyB0aGF0IHdlIGNhbiB1c2UgYSAtQiBvcHRpb24gdG8gZ2NjIHRvIGZvcmNlIGl0IHRvIHVzZSB0aGUgbmV3bHkKLSMgYnVpbHQgYXNzZW1ibGVyLgotaWYgeyFbZmlsZSBpc2RpcmVjdG9yeSB0bXBkaXIvZ2FzXX0gdGhlbiB7Ci0gICAgY2F0Y2ggImV4ZWMgbWtkaXIgdG1wZGlyL2dhcyIgc3RhdHVzCi0gICAgY2F0Y2ggImV4ZWMgbG4gLXMgLi4vLi4vLi4vZ2FzL2FzLW5ldyB0bXBkaXIvZ2FzL2FzIiBzdGF0dXMKLX0KLXNldCBnY2NfZ2FzX2ZsYWcgIi1CW3B3ZF0vdG1wZGlyL2dhcy8iCi0KLSMgbG9hZCB0aGUgdXRpbGl0eSBwcm9jZWR1cmVzCi1sb2FkX2xpYiBsZC1saWIuZXhwCi0KLXByb2MgZ2V0X2xpbmtfZmlsZXMge3Zhcm5hbWV9IHsKLSAgICBnbG9iYWwgJHZhcm5hbWUKLSAgICBnbG9iYWwgdGFyZ2V0X3RyaXBsZXQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIENDCi0gICAgaWYgIVtpbmZvIGV4aXN0cyAkdmFybmFtZV0gewotCXNldCBzdGF0dXMgW2NhdGNoICJleGVjIHNoIC1jIFwiaG9zdD0nJHRhcmdldF90cmlwbGV0JyAmJiBDQz0nJENDJyAmJiAuICRzcmNkaXIvLi4vY29uZmlndXJlLmhvc3QgJiYgZXZhbCBlY2hvIFxcJCR2YXJuYW1lXCIiIHJlc3VsdF0KLQlpZiAkc3RhdHVzIHsgZXJyb3IgIkVycm9yIGdldHRpbmcgbmF0aXZlIGxpbmsgZmlsZXM6ICRyZXN1bHQiIH0KLQlzZXQgJHZhcm5hbWUgJHJlc3VsdAotICAgIH0KLX0KLQotcHJvYyBnZXRfdGFyZ2V0X2VtdWwge30gewotICAgIGdsb2JhbCB0YXJnZXRfdHJpcGxldAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBzZXQgc3RhdHVzIFtjYXRjaCAiZXhlYyBzaCAtYyBcInRhcmc9JyR0YXJnZXRfdHJpcGxldCcgJiYgLiAkc3JjZGlyLy4uL2NvbmZpZ3VyZS50Z3QgJiYgZWNobyBcXFwkdGFyZ19lbXVsXCIiIHJlc3VsdF0KLSAgICBpZiAkc3RhdHVzIHsgZXJyb3IgIkVycm9yIGdldHRpbmcgZW11bGF0aW9uIG5hbWU6ICRyZXN1bHQiIH0KLSAgICByZXR1cm4gJHJlc3VsdAotfQotCi1pZiBbaXNuYXRpdmVdIHsKLSAgICBmb3JlYWNoIHgge0hPU1RJTkdfQ1JUMCBIT1NUSU5HX0xJQlN9IHsKLQlnZXRfbGlua19maWxlcyAkeAotICAgIH0KLX0gZWxzZSB7Ci0gICAgZm9yZWFjaCB4IHtIT1NUSU5HX0NSVDAgSE9TVElOR19MSUJTfSB7IHNldCAkeCAiIiB9Ci19Ci1pZiAhW2luZm8gZXhpc3RzIEhPU1RJTkdfRU1VXSB7IHNldCBIT1NUSU5HX0VNVSAiLW0gW2dldF90YXJnZXRfZW11bF0iIH0KLQotIwotIyBsZF92ZXJzaW9uIC0tIGV4dHJhY3QgYW5kIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBsZCBjb21waWxlciAoR0NDKQotIwotcHJvYyBsZF92ZXJzaW9uIHt9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBkZWZhdWx0X2xkX3ZlcnNpb24gJGxkCi19Ci0KLSMKLSMgbGRfZXhpdCAtLSBqdXN0IGEgc3R1YiBmb3IgbGQKLSMKLXByb2MgbGRfZXhpdCB7fSB7Ci19Ci0KLSMKLSMgbGRfc3RhcnQgCi0jCXJlbGluayB0aGUgbGlua2VyCi0jCi1wcm9jIGxkX3N0YXJ0IHsgbGQgdGFyZ2V0IH0gewotCSMKLX0KLQotIwotIyBsZF9yZWxvY2F0ZSAKLSMJbGluayBhbiBvYmplY3QgdXNpbmcgcmVsb2NhdGlvbgotIwotcHJvYyBsZF9yZWxvY2F0ZSB7IGxkIHRhcmdldCBvYmplY3RzIH0gewotCWRlZmF1bHRfbGRfcmVsb2NhdGUgJGxkICR0YXJnZXQgJG9iamVjdHMKLX0KLQotIwotIyBsZF9saW5rIAotIwlsaW5rIGEgcHJvZ3JhbSB1c2luZyBsZAotIwotcHJvYyBsZF9saW5rIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7Ci0JZGVmYXVsdF9sZF9saW5rICRsZCAkdGFyZ2V0ICRvYmplY3RzCi19Ci0KLSMKLSMgbGRfc2ltcGxlX2xpbmsgCi0jCWxpbmsgYSBwcm9ncmFtIHVzaW5nIGxkLCB3aXRob3V0IGluY2x1ZGluZyBhbnkgbGlicmFyaWVzCi0jCi1wcm9jIGxkX3NpbXBsZV9saW5rIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7Ci0JZGVmYXVsdF9sZF9zaW1wbGVfbGluayAkbGQgJHRhcmdldCAkb2JqZWN0cwotfQotCi0jCi0jIGxkX2NvbXBpbGUgCi0jCWNvbXBpbGUgYW4gb2JqZWN0IHVzaW5nICRjYwotIwotcHJvYyBsZF9jb21waWxlIHsgY2Mgc291cmNlIG9iamVjdCB9IHsKLQlkZWZhdWx0X2xkX2NvbXBpbGUgJGNjICRzb3VyY2UgJG9iamVjdCAKLX0KLQotIwotIyBsZF9hc3NlbWJsZQotIwlhc3NlbWJsZSBhIGZpbGUKLSMKLXByb2MgbGRfYXNzZW1ibGUgeyBhcyBzb3VyY2Ugb2JqZWN0IH0gewotCWRlZmF1bHRfbGRfYXNzZW1ibGUgJGFzICRzb3VyY2UgJG9iamVjdCAKLX0KLQotIwotIyBsZF9ubQotIwlydW4gbm0gb24gYSBmaWxlCi0jCi1wcm9jIGxkX25tIHsgbm0gb2JqZWN0IH0gewotCWRlZmF1bHRfbGRfbm0gJG5tICRvYmplY3QKLX0KLQotIwotIyBsZF9leGVjCi0jCWV4ZWN1dGUgaXRoZSB0YXJnZXQKLSMKLXByb2MgbGRfZXhlYyB7IHRhcmdldCBvdXRwdXQgfSB7Ci0JZGVmYXVsdF9sZF9leGVjICR0YXJnZXQgJG91dHB1dAotfQotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNGI4MjAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgQm9vdHN0cmFwIFRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgSmVmZnJleSBXaGVhdCAoY2Fzc2lkeUBjeWdudXMuY29tKQotIyBSZXdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciAoaWFuQGN5Z251cy5jb20pCi0jCi0KLSMgTWFrZSBzdXJlIHRoYXQgbGQgY2FuIGJvb3RzdHJhcCBpdHNlbGYuCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBpZiBsZCBnZW5lcmF0ZXMgbmF0aXZlIGV4ZWN1dGFibGVzLgotaWYgIVtpc25hdGl2ZV0gewotICAgIHJldHVybgotfQotCi0jIEJvb3RzdHJhcCBsZC4gIEZpcnN0IGxpbmsgdGhlIG9iamVjdCBmaWxlcyB0b2dldGhlciB1c2luZyAtciwgaW4KLSMgb3JkZXIgdG8gdGVzdCAtci4gIFRoZW4gbGluayB0aGUgcmVzdWx0IGludG8gYW4gZXhlY3V0YWJsZSwgbGQxLCB0bwotIyByZWFsbHkgdGVzdCAtci4gIFVzZSBsZDEgdG8gbGluayBhIGZyZXNoIGxkLCBsZDIuICBVc2UgbGQyIHRvIGxpbmsgYQotIyBuZXcgbGQsIGxkMy4gIGxkMiBhbmQgbGQzIHNob3VsZCBiZSBpZGVudGljYWwuCi0KLWZvcmVhY2ggZmxhZ3MgeyIiICItLXN0YXRpYyIgIi0tdHJhZGl0aW9uYWwtZm9ybWF0IiAiLS1uby1rZWVwLW1lbW9yeSJ9IHsKLSAgICBpZiB7IiRmbGFncyIgIT0gIiJ9IHsgCi0Jc2V0IHRlc3RuYW1lICJib290c3RyYXAgd2l0aCAkZmxhZ3MiCi0gICAgfSBlbHNlIHsKLQlzZXQgdGVzdG5hbWUgImJvb3RzdHJhcCIKLSAgICB9Ci0KLSAgICAjIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gaWYgd2UgaGF2ZSB0aGUgbGQgYnVpbGQgZGlyZWN0b3J5LAotICAgICMgc2luY2Ugd2UgbmVlZCB0aGUgb2JqZWN0IGZpbGVzLgotICAgIGlmIHskbGQgIT0gIiRvYmpkaXIvbGQtbmV3In0gewotCXVudGVzdGVkICR0ZXN0bmFtZQotCWNvbnRpbnVlCi0gICAgfQotCi0gICAgIyBJZiB3ZSBvbmx5IGhhdmUgYSBzaGFyZWQgbGliYmZkLCB3ZSBwcm9iYWJseSBjYW4ndCBydW4gdGhlCi0gICAgIyAtLXN0YXRpYyB0ZXN0LgotICAgIGlmIHsgJGZsYWdzID09ICItLXN0YXRpYyIgJiYgISBbc3RyaW5nIG1hdGNoICIqbGliYmZkLmEqIiAkQkZETElCXSB9IHRoZW4gewotCXVudGVzdGVkICR0ZXN0bmFtZQotCWNvbnRpbnVlCi0gICAgfQotCi0gICAgaWYgIVtsZF9yZWxvY2F0ZSAkbGQgdG1wZGlyL2xkLXBhcnRpYWwubyAiJGZsYWdzICRPRklMRVMiXSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQljb250aW51ZQotICAgIH0KLQotICAgICMgT24gQUlYLCB5b3UgbmVlZCB0byBzcGVjaWZ5IGFuIGltcG9ydCBsaXN0IHdoZW4gdXNpbmcgLS1zdGF0aWMuCi0gICAgIyBZb3Ugb25seSB3YW50IHRoZSBpbXBvcnQgbGlzdCB3aGVuIGNyZWF0aW5nIHRoZSBmaW5hbAotICAgICMgZXhlY3V0YWJsZS4KLSAgICBpZiBbaXN0YXJnZXQgIiotKi1haXgqIl0gewotCWlmIHsiJGZsYWdzIiA9PSAiLS1zdGF0aWMifSB7Ci0JICAgIHNldCBmbGFncyAiLS1zdGF0aWMgLWJJOi9saWIvc3lzY2FsbHMuZXhwIgotCX0KLSAgICB9Ci0KLSAgICAjIE9uIElyaXggNSwgbGlua2luZyB3aXRoIC0tc3RhdGljIG9ubHkgd29ya3MgaWYgYWxsIHRoZSBmaWxlcyBhcmUKLSAgICAjIGNvbXBpbGVkIHVzaW5nIC1ub25fc2hhcmVkLgotICAgIGlmIHsiJGZsYWdzIiA9PSAiLS1zdGF0aWMifSB7Ci0Jc2V0dXBfeGZhaWwgIm1pcHMqLSotaXJpeDUqIgotICAgIH0KLQotICAgIGlmICFbbGRfbGluayAkbGQgdG1wZGlyL2xkMSAiJGZsYWdzIHRtcGRpci9sZC1wYXJ0aWFsLm8gJEJGRExJQiAkTElCSUJFUlRZIl0gewotCWZhaWwgJHRlc3RuYW1lCi0JY29udGludWUKLSAgICB9Ci0KLSAgICBpZiAhW2xkX2xpbmsgdG1wZGlyL2xkMSB0bXBkaXIvbGQyICIkZmxhZ3MgJE9GSUxFUyAkQkZETElCICRMSUJJQkVSVFkiXSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQljb250aW51ZQotICAgIH0KLQotICAgIGlmICFbbGRfbGluayB0bXBkaXIvbGQyIHRtcGRpci9sZDMgIiRmbGFncyAkT0ZJTEVTICRCRkRMSUIgJExJQklCRVJUWSJdIHsKLQlmYWlsICR0ZXN0bmFtZQotCWNvbnRpbnVlCi0gICAgfQotCi0gICAgc2VuZF9sb2cgImNtcCB0bXBkaXIvbGQyIHRtcGRpci9sZDNcbiIKLSAgICB2ZXJib3NlICJjbXAgdG1wZGlyL2xkMiB0bXBkaXIvbGQzIgotICAgIGNhdGNoICJleGVjIGNtcCB0bXBkaXIvbGQyIHRtcGRpci9sZDMiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQotCWZhaWwgJHRlc3RuYW1lCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtYmFyLmNjIGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtYmFyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTAwMGUzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWJhci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vIHRlc3QgcHJvZ3JhbSBmb3IgQ2xhc3MgRm9vCi0KLSNpbmNsdWRlICJjZHRlc3QtZm9vLmgiCi0KLXN0YXRpYyBGb28gc3RhdGljX2ZvbyggInN0YXRpY19mb28iKTsgCi0KLUZvbyBmKCkKLXsKLSAgICBGb28geDsKLSAgICByZXR1cm4geDsKLX0KLQotdm9pZCBnKCkKLXsKLSAgICBGb28gb3RoZXJfZm9vMSA9IEZvbyggIm90aGVyX2ZvbzEiKSwgb3RoZXJfZm9vMiA9IEZvbyggIm90aGVyX2ZvbzIiKTsKLSAgICBvdGhlcl9mb28yID0gb3RoZXJfZm9vMTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkNDFhOS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1mb28uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLyBDbGFzcyBGb28KLSNwcmFnbWEgaW1wbGVtZW50YXRpb24KLQotCi0vLyBXZSBkb24ndCB1c2UgaGVhZGVyIGZpbGVzLCBzaW5jZSB3ZSBvbmx5IHdhbnQgdG8gc2VlLCB3aGV0aGVyIHRoZQotLy8gY29tcGlsZXIgaXMgaW5zdGFsbGVkIHByb3Blcmx5LgotLy8KLSNpZiAoX19HTlVHX18gPT0gMikKLXR5cGVkZWYgX19TSVpFX1RZUEVfXyBzaXplX3Q7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OwotI2VuZGlmCi0KLWV4dGVybiAiQyIgewotICAgIGNoYXIgKnN0cm5jcHkgKGNoYXIqIGRlc3QsIGNvbnN0IGNoYXIqIGRlc3QsIHNpemVfdCBsZW4pOwotICAgIGludCBwcmludGYgKGNvbnN0IGNoYXIqLCAuLi4pOwotfTsKLQotI2luY2x1ZGUgImNkdGVzdC1mb28uaCIKLQotaW50IEZvbzo6Zm9vcyA9IDA7Ci0KLXZvaWQgRm9vOjppbml0X2ZvbyAoKQotewotICAgIHByaW50ZiAoIkJST0tFTkxZIGNhbGxpbmcgRm9vOjppbml0X2ZvbyBmcm9tIF9faW5pdF9zdGFydDsgc2l6ZV9vZihGb28pID0gJWxkXG4iLCAobG9uZykgc2l6ZW9mKEZvbykpOwotICAgIGZvb3MgPSBGT09MSVNIX05VTUJFUjsKLX0KLQotCi1Gb286OkZvbyAoKQotewotICAgIGkgPSArK2Zvb3M7Ci0gICAgc3RybmNweSAobWVzc2FnZSwgImRlZmF1bHQtZm9vIiwgbGVuKTsKLSNpZmRlZiBXSVRIX0FERFIKLSAgICBwcmludGYgKCJDb25zdHJ1Y3RpbmcgRm9vKCVkKSBcImRlZmF1bHQtZm9vXCIgYXQgJTA4eFxuIiwgaSwgdGhpcyk7Ci0jZWxzZQotICAgIHByaW50ZiAoIkNvbnN0cnVjdGluZyBGb28oJWQpIFwiZGVmYXVsdC1mb29cIlxuIiwgaSk7Ci0jZW5kaWYKLX0KLQotRm9vOjpGb28gKGNoYXIqIG1zZykKLXsKLSAgICBpID0gKytmb29zOwotICAgIHN0cm5jcHkoIG1lc3NhZ2UsIG1zZywgbGVuKTsKLSNpZmRlZiBXSVRIX0FERFIKLSAgICBwcmludGYgKCAiQ29uc3RydWN0aW5nIEZvbyglZCkgXCIlc1wiIGF0ICUwOHhcbiIsIGksIG1lc3NhZ2UsIHRoaXMpOwotI2Vsc2UKLSAgICBwcmludGYgKCAiQ29uc3RydWN0aW5nIEZvbyglZCkgXCIlc1wiXG4iLCBpLCBtZXNzYWdlKTsKLSNlbmRpZgotfQotCi0KLUZvbzo6Rm9vIChjb25zdCBGb28mIGZvbykKLXsKLSAgICBpID0gKytmb29zOwotI2lmZGVmIFdJVEhfQUREUgotICAgIHByaW50ZiAoIkluaXRpYWxpemluZyBGb28oJWQpIFwiJXNcIiBhdCAlMDh4IHdpdGggRm9vKCVkKSAlMDh4XG4iLCAKLQkgICAgaSwgZm9vLm1lc3NhZ2UsIHRoaXMsIGZvby5pLCAmZm9vKTsKLSNlbHNlCi0gICBwcmludGYgKCJJbml0aWFsaXppbmcgRm9vKCVkKSBcIiVzXCIgd2l0aCBGb28oJWQpXG4iLGksIGZvby5tZXNzYWdlLCBmb28uaSk7Ci0jZW5kaWYKLSAgICBmb3IgKCBpbnQgayA9IDA7IGsgPCBGT09fTVNHX0xFTjsgaysrKSBtZXNzYWdlW2tdID0gZm9vLm1lc3NhZ2Vba107Ci19Ci0KLQotRm9vJiBGb286Om9wZXJhdG9yPSAoY29uc3QgRm9vJiBmb28pCi17Ci0jaWZkZWYgV0lUSF9BRERSCi0gICAgcHJpbnRmICgiQ29weWluZyBGb28oJWQpIFwiJXNcIiBhdCAlMDh4IHRvIEZvbyglZCkgJTA4eFxuIiwgCi0JICAgIGZvby5pLCBmb28ubWVzc2FnZSwgJmZvbywgaSwgdGhpcyk7Ci0jZWxzZQotICAgcHJpbnRmICgiQ29weWluZyBGb28oJWQpIFwiJXNcIiB0byBGb28oJWQpXG4iLCBmb28uaSwgZm9vLm1lc3NhZ2UsIGkpOwotI2VuZGlmCi0gICAgZm9yICggaW50IGsgPSAwOyBrIDwgRk9PX01TR19MRU47IGsrKykgbWVzc2FnZVtrXSA9IGZvby5tZXNzYWdlW2tdOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotCi1Gb286On5Gb28gKCkKLXsKLSAgICBmb29zLS07Ci0jaWZkZWYgV0lUSF9BRERSCi0gICAgcHJpbnRmICgiRGVzdHJ1Y3RpbmcgRm9vKCVkKSBcIiVzXCIgYXQgJTA4eCAocmVtYWluaW5nIGZvb3M6ICVkKVxuIiwKLQkgICAgaSwgbWVzc2FnZSwgdGhpcywgZm9vcyk7Ci0jZWxzZQotICAgIHByaW50ZiAoIkRlc3RydWN0aW5nIEZvbyglZCkgXCIlc1wiIChyZW1haW5pbmcgZm9vczogJWQpXG4iLAotCSAgICBpLCBtZXNzYWdlLCBmb29zKTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmggYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1mb28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmZTUyYS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1mb28uaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vIENsYXNzIEZvbwotCi0jcHJhZ21hIGludGVyZmFjZQotCi0jZGVmaW5lIEZPT0xJU0hfTlVNQkVSIC00NzExCi0KLSNpZm5kZWYgRk9PX01TR19MRU4KLSNkZWZpbmUgRk9PX01TR19MRU4gODAKLSNlbmRpZgotIAotY2xhc3MgRm9vIHsKLSAgICBzdGF0aWMgaW50IGZvb3M7Ci0gICAgaW50IGk7Ci0gICAgc3RhdGljIGNvbnN0IGludCBsZW4gPSBGT09fTVNHX0xFTjsKLSAgICBjaGFyIG1lc3NhZ2VbbGVuXTsKLXB1YmxpYzogCi0gICAgc3RhdGljIHZvaWQgaW5pdF9mb28gKCk7Ci0gICAgc3RhdGljIGludCBuYl9mb29zKCkgeyByZXR1cm4gZm9vczsgfQotICAgIEZvbygpOwotICAgIEZvbyggY2hhciogbWVzc2FnZSk7Ci0gICAgRm9vKGNvbnN0IEZvbyYpOwotICAgIEZvbyAmIG9wZXJhdG9yPSAoY29uc3QgRm9vJik7Ci0gICAgfkZvbyAoKTsKLX07IApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtbWFpbi5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjODgxZGEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vIG1haW4gcHJvZ3JhbSBmb3IgQ2xhc3MgRm9vCi0KLWV4dGVybiAiQyIgewotLy8gU29tZSA8YXNzZXJ0Lmg+IGltcGxlbWVudGF0aW9ucyAoZS5nLiBTVU5PUyA0LjEpIGFyZSBicm9rZW4sCi0vLyBpbiB0aGF0IHRoZXkgcmVxdWlyZSA8c3RkaW8uaD4uICBCdXQsIGlmIGdjYy9nKysgaXMgaW5zdGFsbGVkCi0vLyBjb3JyZWN0bHksIHlvdSBzaG91bGQgZ2V0IGdjYydzIGFzc2VydC5oLgotLy8gSWYgdGhlIGNvbXBpbGUgZmFpbHMsIGl0IG1lYW5zIHRoZSB3cm9uZyBpbmNsdWRlIGZpbGVzIGFyZSBpbiB1c2UhCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci19OwotI2luY2x1ZGUgImNkdGVzdC1mb28uaCIKLQotZXh0ZXJuICJDIiB2b2lkIF9faW5pdF9zdGFydCgpOwotCi1leHRlcm4gRm9vIGYodm9pZCk7Ci1leHRlcm4gdm9pZCBnKHZvaWQpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCAqbm90KiBiZSBjYWxsZWQgYnkgdGhlIGVudmlyb25tZW50LiAgVGhlcmUgaXMKLSAgIG5vIHdheSBpbiBDKysgdG8gYGBydW4gc29tZXRoaW5nIGFmdGVyIHRoZSBpbml0aWFsaXplcnMgYnV0IGJlZm9yZSBtYWluKCknJy4KLSAgIFRoZSBsaWJyYXJ5IHRoYXQgZGVwZW5kcyBvbiB0aGlzIChOSUhDTCkgaXMgYnJva2VuLiAgLS0gSm9obiBHaWxtb3JlIAotICAgV2UgbGVhdmUgdGhpcyBoZXJlIHRvIHRlc3QgdGhhdCBmdXR1cmUgY2hhbmdlcyB0byB0aGUgY29tcGlsZXIKLSAgIGRvIG5vdCByZS1pbnRyb2R1Y2UgdGhpcyBsb3NpbmcgYGBmZWF0dXJlJycuICAqLwotdm9pZCAKLV9faW5pdF9zdGFydCgpCi17Ci0gICAgRm9vOjppbml0X2ZvbygpOwotfQotCi1zdGF0aWMgRm9vIHN0YXRpY19mb28oICJzdGF0aWNfZm9vIik7IAotCi1pbnQgbWFpbigpIAoteyAKLSAgICBhc3NlcnQgKEZvbzo6bmJfZm9vcygpID09IDIpOwotICAgIEZvbyBhdXRvbWF0aWNfZm9vKCAiYXV0b21hdGljX2ZvbyIpOwotICAgIEZvbyBibGFfZm9vID0gZigpOwotICAgIGFzc2VydCAoRm9vOjpuYl9mb29zKCkgPT0gNCk7Ci0gICAgZygpOwotICAgIGFzc2VydCAoRm9vOjpuYl9mb29zKCkgPT0gNCk7Ci0gICAgLy8gYGF1dG9tYXRpY19mb28nIGFuZCBgYmxhX2ZvbycgYXJlIGRlc3RydWN0ZWQgaGVyZSAKLX0gCi0gCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC5kYXQgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC5kYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YmUwZGIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZGF0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotQ29uc3RydWN0aW5nIEZvbygxKSAic3RhdGljX2ZvbyIKLUNvbnN0cnVjdGluZyBGb28oMikgInN0YXRpY19mb28iCi1Db25zdHJ1Y3RpbmcgRm9vKDMpICJhdXRvbWF0aWNfZm9vIgotQ29uc3RydWN0aW5nIEZvbyg0KSAiZGVmYXVsdC1mb28iCi1Jbml0aWFsaXppbmcgRm9vKDUpICJkZWZhdWx0LWZvbyIgd2l0aCBGb28oNCkKLURlc3RydWN0aW5nIEZvbyg0KSAiZGVmYXVsdC1mb28iIChyZW1haW5pbmcgZm9vczogNCkKLUNvbnN0cnVjdGluZyBGb28oNSkgIm90aGVyX2ZvbzEiCi1Db25zdHJ1Y3RpbmcgRm9vKDYpICJvdGhlcl9mb28yIgotQ29weWluZyBGb28oNSkgIm90aGVyX2ZvbzEiIHRvIEZvbyg2KQotRGVzdHJ1Y3RpbmcgRm9vKDYpICJvdGhlcl9mb28xIiAocmVtYWluaW5nIGZvb3M6IDUpCi1EZXN0cnVjdGluZyBGb28oNSkgIm90aGVyX2ZvbzEiIChyZW1haW5pbmcgZm9vczogNCkKLURlc3RydWN0aW5nIEZvbyg1KSAiZGVmYXVsdC1mb28iIChyZW1haW5pbmcgZm9vczogMykKLURlc3RydWN0aW5nIEZvbygzKSAiYXV0b21hdGljX2ZvbyIgKHJlbWFpbmluZyBmb29zOiAyKQotRGVzdHJ1Y3RpbmcgRm9vKDIpICJzdGF0aWNfZm9vIiAocmVtYWluaW5nIGZvb3M6IDEpCi1EZXN0cnVjdGluZyBGb28oMSkgInN0YXRpY19mb28iIChyZW1haW5pbmcgZm9vczogMCkKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiZTM1ZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBMRCBjZHRlc3QgVGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTMsMTk5NCwxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgSmVmZnJleSBXaGVhdCAoY2Fzc2lkeUBjeWdudXMuY29tKQotIyBSZXdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciAoaWFuQGN5Z251cy5jb20pCi0jCi0KLSMgTWFrZSBzdXJlIHRoYXQgY29uc3RydWN0b3JzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQotc2V0IHRlc3QxICJjZHRlc3QiCi1zZXQgdGVzdDIgImNkdGVzdCB3aXRoIC1VciIKLQotIyBUaGlzIHRlc3QgcmVxdWlyZXMgcnVubmluZyB0aGUgZXhlY3V0YWJsZSBnZW5lcmF0ZWQgYnkgbGQuCi1pZiAhW2lzbmF0aXZlXSB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHsgW3doaWNoICRDWFhdID09IDAgfSB7Ci0gICAgdW50ZXN0ZWQgJHRlc3QxCi0gICAgdW50ZXN0ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLWlmIHsgIVtsZF9jb21waWxlICIkQ1hYICRDWFhGTEFHUyAtZmdudS1saW5rZXIiICRzcmNkaXIvJHN1YmRpci9jZHRlc3QtZm9vLmNjIHRtcGRpci9jZHRlc3QtZm9vLm9dCi0gICAgIHx8ICFbbGRfY29tcGlsZSAiJENYWCAkQ1hYRkxBR1MgLWZnbnUtbGlua2VyIiAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LWJhci5jYyB0bXBkaXIvY2R0ZXN0LWJhci5vXQotICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDWFggJENYWEZMQUdTIC1mZ251LWxpbmtlciIgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC1tYWluLmNjIHRtcGRpci9jZHRlc3QtbWFpbi5vXSB9IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MQotICAgIHVucmVzb2x2ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfbGluayAkbGQgdG1wZGlyL2NkdGVzdCB7dG1wZGlyL2NkdGVzdC1mb28ubyB0bXBkaXIvY2R0ZXN0LWJhci5vIHRtcGRpci9jZHRlc3QtbWFpbi5vfV0gewotICAgIGZhaWwgJHRlc3QxCi19IGVsc2UgewotICAgIHNlbmRfbG9nICJ0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dFxuIgotICAgIHZlcmJvc2UgInRtcGRpci9jZHRlc3QgPnRtcGRpci9jZHRlc3Qub3V0IgotICAgIGNhdGNoICJleGVjIHRtcGRpci9jZHRlc3QgPnRtcGRpci9jZHRlc3Qub3V0IiBleGVjX291dHB1dAotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIgMQotCWZhaWwgJHRlc3QxCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiZGlmZiB0bXBkaXIvY2R0ZXN0Lm91dCAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LmRhdFxuIgotCXZlcmJvc2UgImRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXQiCi0JY2F0Y2ggImV4ZWMgZGlmZiB0bXBkaXIvY2R0ZXN0Lm91dCAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LmRhdCIgZXhlY19vdXRwdXQKLQlzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotCWlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQkgICAgcGFzcyAkdGVzdDEKLQl9IGVsc2UgewotCSAgICBzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JICAgIHZlcmJvc2UgIiRleGVjX291dHB1dCIgMQotCSAgICBmYWlsICR0ZXN0MQotCX0KLSAgICB9Ci19Ci0KLWlmICFbbGRfcmVsb2NhdGUgJGxkIHRtcGRpci9jZHRlc3QubyB7LVVyIHRtcGRpci9jZHRlc3QtZm9vLm8gdG1wZGlyL2NkdGVzdC1iYXIubyB0bXBkaXIvY2R0ZXN0LW1haW4ub31dIHsKLSAgICBmYWlsICR0ZXN0MgotfSBlbHNlIHsKLSAgICBpZiAhW2xkX2xpbmsgJGxkIHRtcGRpci9jZHRlc3QgdG1wZGlyL2NkdGVzdC5vXSB7Ci0JZmFpbCAkdGVzdDIKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICJ0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dFxuIgotCXZlcmJvc2UgInRtcGRpci9jZHRlc3QgPnRtcGRpci9jZHRlc3Qub3V0IgotCWNhdGNoICJleGVjIHRtcGRpci9jZHRlc3QgPnRtcGRpci9jZHRlc3Qub3V0IiBleGVjX291dHB1dAotCWlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JICAgIHNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQkgICAgdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IiAxCi0JICAgIGZhaWwgJHRlc3QyCi0JfSBlbHNlIHsKLQkgICAgc2VuZF9sb2cgImRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXRcbiIKLQkgICAgdmVyYm9zZSAiZGlmZiB0bXBkaXIvY2R0ZXN0Lm91dCAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LmRhdCIKLQkgICAgY2F0Y2ggImV4ZWMgZGlmZiB0bXBkaXIvY2R0ZXN0Lm91dCAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LmRhdCIgZXhlY19vdXRwdXQKLQkgICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLQkgICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCQlwYXNzICR0ZXN0MgotCSAgICB9IGVsc2UgewotCQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JCXZlcmJvc2UgIiRleGVjX291dHB1dCIgMQotCQlmYWlsICR0ZXN0MgotCSAgICB9Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3MvYXNtLnMgYi9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL2FzbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDVlMTc3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3MvYXNtLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0udGV4dAotCS5nbG9iYWwgZm9vCi1mb286Ci0JLmxvbmcgMHgxMjM0NTY3OAotCi0uZGF0YQotCS5nbG9iYWwgYmFyCi1iYXI6Ci0JLmxvbmcgMHg4NzY1NDMyMQotCi0JLmxjb21tIGR1bW15LCAweDEyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL2NoZWNrcy5leHAgYi9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL2NoZWNrcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZmFmZTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9jaGVja3MuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBMRCBzZWN0aW9uIGNoZWNrcyB0ZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IE5pY2sgQ2xpZnRvbiAobmlja2NAY3lnbnVzLmNvbSkKLQotcHJvYyBzZWN0aW9uX2NoZWNrIHt9IHsKLSAgICBnbG9iYWwgbGRfZmxhZ3MKLSAgICBnbG9iYWwgYXMKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIAotICAgIHNldCB0ZXN0ICJjaGVjayBzZWN0aW9ucyAxIgotICAgIAotICAgIHNldCBsZGZsYWdzICItLWNoZWNrLXNlY3Rpb25zIgotCi0gICAgaWYgeyAhW2xkX2Fzc2VtYmxlICRhcyAkc3JjZGlyLyRzdWJkaXIvYXNtLnMgdG1wZGlyL2FzbS5vXX0gewotCXVucmVzb2x2ZWQgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvYXNtLnggIiRsZGZsYWdzIHRtcGRpci9hc20ubyJdIHsKLQlmYWlsICR0ZXN0Ci0gICAgfSBlbHNlIHsKLQlwYXNzICR0ZXN0Ci0gICAgfQotCi0gICAgc2V0IHRlc3QgImNoZWNrIHNlY3Rpb25zIDIiCi0KLSAgICAjIENoYW5nZSB0aGUgbGlua2VyIGZsYWdzIHNvIHRoYXQgb3VyICJidWdneSIgbGlua2VyCi0gICAgIyBzY3JpcHQgaXMgdXNlZC4KLSAgICBzZXQgbGRmbGFncyAiLS1jaGVjay1zZWN0aW9ucyAtVCAkc3JjZGlyLyRzdWJkaXIvc2NyaXB0IC1lIGZvbyIKLQotICAgICMgUGVyZm9ybSB0aGUgZXF1aXZhbGVudCBvZiBpbnZva2luZyBsZF9zaW1wbGVfbGluawotICAgICMgZXhjZXB0IHRoYXQgd2UgbmVlZCB0byBtYXNzYWdlIHRoZSBvdXRwdXQgZnV0aGVyLgotICAgIAotICAgIGNhdGNoICJleGVjICRsZCAtbyB0bXBkaXIvYXNtLnggJGxkZmxhZ3MgdG1wZGlyL2FzbS5vIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0gICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBnb3Qgc29tZSBvdXRwdXQgZnJvbSB0aGUgbGlua2VyCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCWZhaWwgJHRlc3QKLSAgICB9IAotCi0gICAgIyBOb3cgcmVtb3ZlIG91ciBleHBlY3RlZCBlcnJvciBtZXNzYWdlCi0gICAgcmVnc3ViIC1hbGwgIi4qOiBzZWN0aW9uIC5kYXRhIC4qIG92ZXJsYXBzIHNlY3Rpb24gLnRleHQgLioiICRleGVjX291dHB1dCAiIiBleGVjX291dHB1dAotCi0gICAgIyBBbmQgY2hlY2sgdG8gc2VlIGlmIGFueXRoaW5nIGVsc2UsICh1bmV4cGVjdGVkKSB3YXMgbGVmdAotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlwYXNzICR0ZXN0Ci0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIlVuZXhwZWN0ZWQgbGlua2VyIG1lc3NhZ2Uocyk6ICRleGVjX291dHB1dCIKLQlmYWlsICR0ZXN0Ci0gICAgfQotfQotCi1zZWN0aW9uX2NoZWNrCi0KLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9zY3JpcHQgYi9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL3NjcmlwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjNmEwOC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL3NjcmlwdAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0VDVElPTlMgewotICAgICAgICAudGV4dCAweDEwMCA6ICAgICAgICAgICAgIHsgKigudGV4dCkgfQotCS5kYXRhIDB4MTAwIDogQVQgKDB4MTAwKSAgeyAqKC5kYXRhKSB9Ci0JLmJzcyAgMHgxMDAgOiBBVCAoMHg0MDAwKSB7ICooLmJzcykgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVycy5leHAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwZGZkNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDgxNCArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIGxkLXZlcnNpb24gdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBFcmljIFlvdW5nZGFsZSAoZXJpY0BhbmRhbnRlLmppYy5jb20pCi0KLSMKLQotIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIGlmIGxkIGdlbmVyYXRlcyBuYXRpdmUgZXhlY3V0YWJsZXMuCi1pZiAhW2lzbmF0aXZlXSB0aGVuIHtyZXR1cm59Ci0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBvbiBhIGNvdXBsZSBvZiBFTEYgcGxhdGZvcm1zLgotIyBTcXVhcmUgYnJhY2tldCBleHByZXNzaW9ucyBzZWVtIHRvIGNvbmZ1c2UgaXN0YXJnZXQuCi0jIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgdGVzdCB0aGF0IGlzIHVzZWQgaW4gbGQtc2hhcmVkLCBCVFcuCi1pZiB7ICFbaXN0YXJnZXQgaT84Ni0qLXN5c3Y0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk/ODYtKi11bml4d2FyZV0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk/ODYtKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaT84Ni0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IG02OGstKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBtaXBzKi0qLWlyaXg1Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgcG93ZXJwYy0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBzcGFyYyotKi1lbGZdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBzcGFyYyotKi1zb2xhcmlzMipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBzcGFyYyotKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBhbHBoYSotKi1saW51eCpdIH0gewotICAgIHJldHVybgotfQotCi1pZiB7IFtpc3RhcmdldCBpPzg2LSotbGludXhhb3V0Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgaT84Ni0qLWxpbnV4b2xkbGQqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBtNjhrLSotbGludXhhb3V0Kl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotc2V0IGRpZmYgZGlmZgotc2V0IHRtcGRpciB0bXBkaXIKLXNldCBWT0JKRFVNUF9GTEFHUyAtLXByaXZhdGUtaGVhZGVycwotc2V0IERPQkpEVU1QX0ZMQUdTIC0tZHluYW1pYy1zeW1zCi1zZXQgU09CSkRVTVBfRkxBR1MgLS1zeW1zCi1zZXQgc2hhcmVkIC0tc2hhcmVkCi1zZXQgc2NyaXB0IC0tdmVyc2lvbi1zY3JpcHQKLQotcHJvYyB0ZXN0X2FyIHsgdGVzdCBsaWIgb2JqZWN0IGV4cGVjdCB9IHsKLSAgICBnbG9iYWwgYXIKLSAgICBnbG9iYWwgbm0KLSAgICBnbG9iYWwgdG1wZGlyCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgZGlmZgotCi0gICAgdmVyYm9zZSAtbG9nICIkYXIgLWNyICR0bXBkaXIvJGxpYiAkdG1wZGlyLyRvYmplY3QiCi0gICAgY2F0Y2ggImV4ZWMgJGFyIC1jciAkdG1wZGlyLyRsaWIgJHRtcGRpci8kb2JqZWN0IiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXVucmVzb2x2ZWQgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLSAgICAKLSAgICB2ZXJib3NlIC1sb2cgIiRubSAtLXByaW50LWFybWFwICR0bXBkaXIvJGxpYiB8IGdyZXAgXCIgaW4gXCIgfCBlZ3JlcCBcIlZFUlNcXHxiYXJcXHxmb29cIiB8IHNvcnQgPiAkdG1wZGlyL25tLm91dCIKLQotICAgIGNhdGNoICJleGVjICRubSAtLXByaW50LWFybWFwICR0bXBkaXIvJGxpYiB8IGdyZXAgXFxcIGluXFxcICB8IGVncmVwIFZFUlNcXFx8YmFyXFxcfGZvbyB8IHNvcnQgPiAkdG1wZGlyL25tLm91dCIgZXhlY19vdXRwdXQKLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JY2F0Y2ggImV4ZWMgJGRpZmYgLXEgJHRtcGRpci9ubS5vdXQgJHNyY2Rpci8kc3ViZGlyLyRleHBlY3QiIGV4ZWNfb3V0cHV0Ci0Jc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0JaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCSAgICBwYXNzICR0ZXN0Ci0JICAgIHJldHVybgotCX0gZWxzZSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JZmFpbCAiJHRlc3QiCi0gICAgfQotfQotCi0jCi0jIG9iamR1bXBfZW1wdHlzeW1zdHVmZgotIwlDaGVjayBub24tZHluYW1pYyBzeW1ib2xzIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vbmUgd2l0aCAnQCcuCi0jCi1wcm9jIG9iamR1bXBfZW1wdHlzeW1zdHVmZiB7IG9iamR1bXAgb2JqZWN0IH0gewotICAgIGdsb2JhbCBTT0JKRFVNUF9GTEFHUwotICAgIGdsb2JhbCB2ZXJzaW9uX291dHB1dAotICAgIGdsb2JhbCBkaWZmCi0KLSAgICBpZiAhW2luZm8gZXhpc3RzIFNPQkpEVU1QX0ZMQUdTXSB7IHNldCBTT0JKRFVNUF9GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRTT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9cQC9wIgotCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJFNPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1xAL3AiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotIyBXZSBzaG91bGRuJ3QgZ2V0IGFueXRoaW5nIGhlcmUuCi0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotIyBpdCBpcyBub3Qgbm9ybWFsIHRvIGNvbWUgaGVyZSAtIHdlIGhhdmUgbm8gb3V0cHV0IHRvIGNvbXBhcmUuCi0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JdmVyYm9zZSAtbG9nICJvYmpkdW1wX2VtcHR5c3ltc3R1ZmY6IGRpZCBub3QgZXhwZWN0IGFueSBvdXRwdXQgZnJvbSBvYmpkdW1wIgotCXJldHVybiAwCi0gICAgfQotCi19Ci0KLSMKLSMgb2JqZHVtcF9lbXB0eWR5bnN5bXN0dWZmCi0jCUNoZWNrIGR5bmFtaWMgc3ltYm9scyBhbmQgbWFrZSBzdXJlIHRoZXJlIGFyZSBub25lIHdpdGggJ0AnLgotIwotcHJvYyBvYmpkdW1wX2VtcHR5ZHluc3ltc3R1ZmYgeyBvYmpkdW1wIG9iamVjdCB9IHsKLSAgICBnbG9iYWwgRE9CSkRVTVBfRkxBR1MKLSAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKLSAgICBnbG9iYWwgZGlmZgotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBWT0JKRFVNUF9GTEFHU10geyBzZXQgVk9CSkRVTVBfRkxBR1MgIiIgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAkRE9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVkVSUy9wXFxcOy9zaG93L3AiCi0KLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAkRE9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVkVSUy9wXFxcOy9zaG93L3AiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotIyBXZSBzaG91bGRuJ3QgZ2V0IGFueXRoaW5nIGhlcmUuCi0JcmV0dXJuIDEKLSAgICB9IGVsc2UgeyBpZiBbc3RyaW5nIG1hdGNoICIqb2JqZHVtcDogKjogbm90IGEgZHluYW1pYyBvYmplY3QiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotIyBpdCBpcyBub3Qgbm9ybWFsIHRvIGNvbWUgaGVyZSAtIHdlIGhhdmUgbm8gb3V0cHV0IHRvIGNvbXBhcmUuCi0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JdmVyYm9zZSAtbG9nICJvYmpkdW1wX2VtcHR5ZHluc3ltc3R1ZmY6IGRpZCBub3QgZXhwZWN0IGFueSBvdXRwdXQgZnJvbSBvYmpkdW1wIgotCXJldHVybiAwCi0gICAgfSB9Ci19Ci0KLSMKLSMgb2JqZHVtcF9lbXB0eXZlcnN0dWZmCi0jCU1ha2Ugc3VyZSB0aGVyZSBpcyBubyB2ZXJzaW9uIGluZm9ybWF0aW9uCi0jCi1wcm9jIG9iamR1bXBfZW1wdHl2ZXJzdHVmZiB7IG9iamR1bXAgb2JqZWN0IH0gewotICAgIGdsb2JhbCBWT0JKRFVNUF9GTEFHUwotICAgIGdsb2JhbCB2ZXJzaW9uX291dHB1dAotICAgIGdsb2JhbCBkaWZmCi0gICAgZ2xvYmFsIHRtcGRpcgotCi0gICAgaWYge1t3aGljaCAkb2JqZHVtcF0gPT0gMH0gdGhlbiB7Ci0JcGVycm9yICIkb2JqZHVtcCBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGlmICFbaW5mbyBleGlzdHMgVk9CSkRVTVBfRkxBR1NdIHsgc2V0IFZPQkpEVU1QX0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJFZPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZlcnNpb24vLFxcXCRwID4gJHRtcGRpci9vYmpkdW1wLm91dCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRWT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WZXJzaW9uLyxcXFwkcCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0jIGl0IGlzIG5vcm1hbCB0byBmYWlsIGhlcmUgLSB3ZSBoYXZlIG5vIG91dHB1dCB0byBjb21wYXJlLgotCXJldHVybiAxCi0gICAgfSBlbHNlIHsgaWYgeyBbc3RyaW5nIG1hdGNoICIqbGliYyoiICRleGVjX291dHB1dF0gfSB0aGVuIHsKLSMgdGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZXJlIGlzIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gbGliYywgc28gd2UKLSMgY2FuJ3QgcmVhbGx5IHBlcmZvcm0gdGhpcyB0ZXN0LgotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQl2ZXJib3NlIC1sb2cgIm9iamR1bXBfZW1wdHl2ZXJzdHVmZjogZGlkIG5vdCBleHBlY3QgYW55IG91dHB1dCBmcm9tIG9iamR1bXAiCi0JcmV0dXJuIDAKLSAgICB9IH0KLQotfQotCi0jCi0jIG9iamR1bXBfc3ltc3R1ZmYKLSMJRHVtcCBub24tZHluYW1pYyBzeW1ib2wgc3R1ZmYgYW5kIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHNhbmUuCi0jCi1wcm9jIG9iamR1bXBfc3ltc3R1ZmYgeyBvYmpkdW1wIG9iamVjdCBleHBlY3RmaWxlIH0gewotICAgIGdsb2JhbCBTT0JKRFVNUF9GTEFHUwotICAgIGdsb2JhbCB2ZXJzaW9uX291dHB1dAotICAgIGdsb2JhbCBkaWZmCi0gICAgZ2xvYmFsIHRtcGRpcgotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBTT0JKRFVNUF9GTEFHU10geyBzZXQgU09CSkRVTVBfRkxBR1MgIiIgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAkU09CSkRVTVBfRkxBR1MgJG9iamVjdCB8IGdyZXAgXEAgfCBzb3J0ICA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiCi0KLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAkU09CSkRVTVBfRkxBR1MgJG9iamVjdCB8IGdyZXAgXEAgfCBzb3J0ICA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCi0jIE5vdyBkbyBhIGxpbmUtYnktbGluZSBjb21wYXJpc29uIHRvIGVmZmVjdGl2ZWx5IGRpZmYgdGhlIGRhcm5lZCB0aGluZ3MKLSMgVGhlIHN0dWZmIGNvbWluZyBmcm9tIHRoZSBleHBlY3RmaWxlIGlzIGFjdHVhbGx5IGEgcmVnZXgsIHNvIHdlIGNhbgotIyBza2lwIG92ZXIgdGhlIGFjdHVhbCBhZGRyZXNzZXMgYW5kIHNvIGZvcnRoLiAgVGhpcyBpcyBjdXJyZW50bHkgdmVyeQotIyBzaW1wbGVtaW5kZWQgLSBpdCBleHBlY3RzIGEgb25lLXRvLW9uZSBjb3JyZXNwb25kZW5jZSBpbiB0ZXJtcyBvZiBsaW5lCi0jIG51bWJlcnMuCi0KLQlpZiBbZmlsZSBleGlzdHMgJGV4cGVjdGZpbGVdIHRoZW4gewotCSAgICBzZXQgZmlsZV9hIFtvcGVuICRleHBlY3RmaWxlIHJdCi0JfSBlbHNlIHsKLQkgICAgcGVycm9yICIkZXhwZWN0ZmlsZSBkb2Vzbid0IGV4aXN0IgotCSAgICByZXR1cm4gMAotCX0KLQkKLQlpZiBbZmlsZSBleGlzdHMgJHRtcGRpci9vYmpkdW1wLm91dF0gdGhlbiB7Ci0JICAgIHNldCBmaWxlX2IgW29wZW4gJHRtcGRpci9vYmpkdW1wLm91dCByXQotCX0gZWxzZSB7Ci0JICAgIHBlcnJvciAiJHRtcGRpci9vYmpkdW1wLm91dCBkb2Vzbid0IGV4aXN0IgotCSAgICByZXR1cm4gMAotCX0KLQotCXZlcmJvc2UgIiMgRGlmZidpbmc6ICRleHBlY3RmaWxlICR0bXBkaXIvb2JqZHVtcC5vdXQiIDIKLQotCXNldCBlb2YgLTEKLQlzZXQgZGlmZmVyZW5jZXMgMAotCi0Jd2hpbGUgeyBbZ2V0cyAkZmlsZV9hIGxpbmVdICE9ICRlb2YgfSB7Ci0JICAgIGlmIFtyZWdleHAgIl4jLiokIiAkbGluZV0gdGhlbiB7Ci0JCWNvbnRpbnVlCi0JICAgIH0gZWxzZSB7Ci0JCWxhcHBlbmQgbGlzdF9hICRsaW5lCi0JICAgIH0KLQl9Ci0JY2xvc2UgJGZpbGVfYQotCi0Jd2hpbGUgeyBbZ2V0cyAkZmlsZV9iIGxpbmVdICE9ICRlb2YgfSB7Ci0JICAgIGlmIFtyZWdleHAgIl4jLiokIiAkbGluZV0gdGhlbiB7Ci0JCWNvbnRpbnVlCi0JICAgIH0gZWxzZSB7Ci0JCWxhcHBlbmQgbGlzdF9iICRsaW5lCi0JICAgIH0KLQl9Ci0JY2xvc2UgJGZpbGVfYgotCQotCWZvciB7IHNldCBpIDAgfSB7ICRpIDwgW2xsZW5ndGggJGxpc3RfYV0gfSB7IGluY3IgaSB9IHsKLQkgICAgc2V0IGxpbmVfYSBbbGluZGV4ICRsaXN0X2EgJGldCi0JICAgIHNldCBsaW5lX2IgW2xpbmRleCAkbGlzdF9iICRpXQotCSAgICAKLQotCSAgICB2ZXJib3NlICJcdCRleHBlY3RmaWxlOiAkaTogJGxpbmVfYSIgMwotCSAgICB2ZXJib3NlICJcdC90bXAvb2JqZHVtcC5vdXQ6ICRpOiAkbGluZV9iIiAzCi0JICAgIGlmIFtyZWdleHAgJGxpbmVfYSAkbGluZV9iXSB0aGVuIHsKLQkJY29udGludWUKLQkgICAgfSBlbHNlIHsKLQkJdmVyYm9zZSAtbG9nICJcdCRleHBlY3RmaWxlOiAkaTogJGxpbmVfYSIKLQkJdmVyYm9zZSAtbG9nICJcdCR0bXBkaXIvb2JqZHVtcC5vdXQ6ICRpOiAkbGluZV9iIgotCQkKLQkJcmV0dXJuIDAKLQkgICAgfQotCX0KLQkKLQlpZiB7IFtsbGVuZ3RoICRsaXN0X2FdICE9IFtsbGVuZ3RoICRsaXN0X2JdIH0gewotCSAgICB2ZXJib3NlIC1sb2cgIkxpbmUgY291bnQiCi0JICAgIHJldHVybiAwCi0JfQotCQotCWlmICRkaWZmZXJlbmNlczwxIHRoZW4gewotCSAgICByZXR1cm4gMQotCX0KLQkKLQlyZXR1cm4gMAotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci0KLX0KLQotIwotIyBvYmpkdW1wX2R5bXN5bXN0dWZmCi0jCUR1bXAgZHluYW1pYyBzeW1ib2wgc3R1ZmYgYW5kIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHNhbmUuCi0jCi1wcm9jIG9iamR1bXBfZHluc3ltc3R1ZmYgeyBvYmpkdW1wIG9iamVjdCBleHBlY3RmaWxlIH0gewotICAgIGdsb2JhbCBET0JKRFVNUF9GTEFHUwotICAgIGdsb2JhbCB2ZXJzaW9uX291dHB1dAotICAgIGdsb2JhbCBkaWZmCi0gICAgZ2xvYmFsIHRtcGRpcgotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBET0JKRFVNUF9GTEFHU10geyBzZXQgRE9CSkRVTVBfRkxBR1MgIiIgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAkRE9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVkVSUy9wXFxcOy9zaG93L3AgfCBzb3J0IHwgdW5pcSAgPiAkdG1wZGlyL29iamR1bXAub3V0IgotCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJERPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZFUlMvcFxcXDsvc2hvdy9wIHwgc29ydCB8IHVuaXEgID4gJHRtcGRpci9vYmpkdW1wLm91dCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0KLSMgTm93IGRvIGEgbGluZS1ieS1saW5lIGNvbXBhcmlzb24gdG8gZWZmZWN0aXZlbHkgZGlmZiB0aGUgZGFybmVkIHRoaW5ncwotIyBUaGUgc3R1ZmYgY29taW5nIGZyb20gdGhlIGV4cGVjdGZpbGUgaXMgYWN0dWFsbHkgYSByZWdleCwgc28gd2UgY2FuCi0jIHNraXAgb3ZlciB0aGUgYWN0dWFsIGFkZHJlc3NlcyBhbmQgc28gZm9ydGguICBUaGlzIGlzIGN1cnJlbnRseSB2ZXJ5Ci0jIHNpbXBsZW1pbmRlZCAtIGl0IGV4cGVjdHMgYSBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlIGluIHRlcm1zIG9mIGxpbmUKLSMgbnVtYmVycy4KLQotCWlmIFtmaWxlIGV4aXN0cyAkZXhwZWN0ZmlsZV0gdGhlbiB7Ci0JICAgIHNldCBmaWxlX2EgW29wZW4gJGV4cGVjdGZpbGUgcl0KLQl9IGVsc2UgewotCSAgICB3YXJuaW5nICIkZXhwZWN0ZmlsZSBkb2Vzbid0IGV4aXN0IgotCSAgICByZXR1cm4gMAotCX0KLQkKLQlpZiBbZmlsZSBleGlzdHMgJHRtcGRpci9vYmpkdW1wLm91dF0gdGhlbiB7Ci0JICAgIHNldCBmaWxlX2IgW29wZW4gJHRtcGRpci9vYmpkdW1wLm91dCByXQotCX0gZWxzZSB7Ci0JICAgIGZhaWwgIiR0bXBkaXIvb2JqZHVtcC5vdXQgZG9lc24ndCBleGlzdCIKLQkgICAgcmV0dXJuIDAKLQl9Ci0KLQl2ZXJib3NlICIjIERpZmYnaW5nOiAkZXhwZWN0ZmlsZSAkdG1wZGlyL29iamR1bXAub3V0IiAyCi0KLQlzZXQgZW9mIC0xCi0Jc2V0IGRpZmZlcmVuY2VzIDAKLQotCXdoaWxlIHsgW2dldHMgJGZpbGVfYSBsaW5lXSAhPSAkZW9mIH0gewotCSAgICBpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4gewotCQljb250aW51ZQotCSAgICB9IGVsc2UgewotCQlsYXBwZW5kIGxpc3RfYSAkbGluZQotCSAgICB9Ci0JfQotCWNsb3NlICRmaWxlX2EKLQotCXdoaWxlIHsgW2dldHMgJGZpbGVfYiBsaW5lXSAhPSAkZW9mIH0gewotCSAgICBpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4gewotCQljb250aW51ZQotCSAgICB9IGVsc2UgewotCQlsYXBwZW5kIGxpc3RfYiAkbGluZQotCSAgICB9Ci0JfQotCWNsb3NlICRmaWxlX2IKLQkKLQlmb3IgeyBzZXQgaSAwIH0geyAkaSA8IFtsbGVuZ3RoICRsaXN0X2JdIH0geyBpbmNyIGkgfSB7Ci0JICAgIHNldCBsaW5lX2IgW2xpbmRleCAkbGlzdF9iICRpXQotCSAgICAKLSMgVGhlIHRlc3RzIGFyZSByaWdnZWQgc28gdGhhdCB3ZSBzaG91bGQgbmV2ZXIgZXhwb3J0IGEgc3ltYm9sIHdpdGggdGhlCi0jIHdvcmQgJ2hpZGUnIGluIGl0LiAgVGh1cyB3ZSBqdXN0IHNlYXJjaCBmb3IgaXQsIGFuZCBiYWlsIGlmIHdlIGZpbmQgaXQuCi0JICAgIGlmIFtyZWdleHAgImhpZGUiICRsaW5lX2JdIHRoZW4gewotCQl2ZXJib3NlIC1sb2cgIlx0JHRtcGRpci9vYmpkdW1wLm91dDogJGk6ICRsaW5lX2IiCi0JCQotCQlyZXR1cm4gMAotCSAgICB9Ci0KLQkgICAgdmVyYm9zZSAiXHQkZXhwZWN0ZmlsZTogJGk6ICRsaW5lX2IiIDMKLQotCSAgICAjIFdlIGNhbid0IGFzc3VtZSB0aGF0IHRoZSBzb3J0IGlzIGNvbnNpc3RlbnQgYWNyb3NzCi0JICAgICMgc3lzdGVtcywgc28gd2UgbXVzdCBjaGVjayBlYWNoIHJlZ2V4cC4gIFdoZW4gd2UgZmluZCBhCi0JICAgICMgcmVnZXhwLCB3ZSBudWxsIGl0IG91dCwgc28gd2UgZG9uJ3QgbWF0Y2ggaXQgdHdpY2UuCi0JICAgIGZvciB7IHNldCBqIDAgfSB7ICRqIDwgW2xsZW5ndGggJGxpc3RfYV0gfSB7IGluY3IgaiB9IHsKLQkJc2V0IGxpbmVfYSBbbGluZGV4ICRsaXN0X2EgJGpdCi0KLQkJaWYgW3JlZ2V4cCAkbGluZV9hICRsaW5lX2JdIHRoZW4gewotCQkgICAgbHJlcGxhY2UgJGxpc3RfYSAkaiAkaiAiQ0FOIE5PVCBNQVRDSCIKLQkJICAgIGJyZWFrCi0JCX0KLQkgICAgfQotCi0JICAgIGlmIHsgJGogPj0gW2xsZW5ndGggJGxpc3RfYV0gfSB7Ci0JCXZlcmJvc2UgLWxvZyAiXHQkdG1wZGlyL29iamR1bXAub3V0OiAkaTogJGxpbmVfYiIKLQkJCi0JCXJldHVybiAwCi0JICAgIH0KLQl9Ci0JCi0JaWYgeyBbbGxlbmd0aCAkbGlzdF9hXSAhPSBbbGxlbmd0aCAkbGlzdF9iXSB9IHsKLQkgICAgdmVyYm9zZSAtbG9nICJMaW5lIGNvdW50IgotCSAgICByZXR1cm4gMAotCX0KLQkKLQlpZiAkZGlmZmVyZW5jZXM8MSB0aGVuIHsKLQkgICAgcmV0dXJuIDEKLQl9Ci0JCi0JcmV0dXJuIDAKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXJldHVybiAwCi0gICAgfQotCi19Ci0KLSMKLSMgb2JqZHVtcF92ZXJzaW9uc3R1ZmYKLSMJRHVtcCB2ZXJzaW9uIGRlZmluaXRpb25zL3JlZmVyZW5jZXMgYW5kIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHNhbmUuCi0jCi1wcm9jIG9iamR1bXBfdmVyc2lvbnN0dWZmIHsgb2JqZHVtcCBvYmplY3QgZXhwZWN0ZmlsZSB9IHsKLSAgICBnbG9iYWwgVk9CSkRVTVBfRkxBR1MKLSAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKLSAgICBnbG9iYWwgZGlmZgotICAgIGdsb2JhbCB0bXBkaXIKLQotICAgIGlmIHtbd2hpY2ggJG9iamR1bXBdID09IDB9IHRoZW4gewotCXBlcnJvciAiJG9iamR1bXAgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0KLSAgICBpZiAhW2luZm8gZXhpc3RzIFZPQkpEVU1QX0ZMQUdTXSB7IHNldCBWT0JKRFVNUF9GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRWT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WZXJzaW9uLyxcXFwkcCA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiCi0KLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAkVk9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVmVyc2lvbi8sXFxcJHAgPiAkdG1wZGlyL29iamR1bXAub3V0IiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQotCSMgSXQncyBPSyBpZiB0aGVyZSBhcmUgZXh0cmEgbGluZXMgaW4gdGhlIGFjdHVhbCBvdXRwdXQ7IHRoZXkKLQkjIG1heSBjb21lIGZyb20gdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiBsaWJjLiAgV2UgcmVxdWlyZSB0aGF0Ci0JIyBldmVyeSBsaW5lIGluIEVYUEVDVEZJTEUgYXBwZWFyIGluIHRoZSBvdXRwdXQgaW4gb3JkZXIuCi0KLQlzZXQgZjEgW29wZW4gJHRtcGRpci9vYmpkdW1wLm91dCByXQotCXNldCBmMiBbb3BlbiAkZXhwZWN0ZmlsZSByXQotCWdldHMgJGYyIGwyCi0Jd2hpbGUgeyBbZ2V0cyAkZjEgbDFdICE9IC0xIH0gewotCSAgICBpZiB7IFtzdHJpbmcgbWF0Y2ggJGwyICRsMV0gfSB0aGVuIHsKLQkJaWYgeyBbZ2V0cyAkZjIgbDJdID09IC0xIH0gdGhlbiB7Ci0JCSAgICBjbG9zZSAkZjEKLQkJICAgIGNsb3NlICRmMgotCQkgICAgcmV0dXJuIDEKLQkJfQotCSAgICB9Ci0JfQotCi0JIyBXZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG91dHB1dCB3aXRob3V0IHNlZWluZyB0aGUgbGluZSB3ZQotCSMgZXhwZWN0ZWQuICBUaGlzIGlzIGEgdGVzdCBmYWlsdXJlLgotCi0JY2xvc2UgJGYxCi0JY2xvc2UgJGYyCi0KLQl2ZXJib3NlIC1sb2cgIkRpZCBub3QgZmluZCBcIiRsMlwiIgotCXNldCBmMSBbb3BlbiAkdG1wZGlyL29iamR1bXAub3V0IHJdCi0Jd2hpbGUgeyBbZ2V0cyAkZjEgbDFdICE9IC0xIH0gewotCSAgICB2ZXJib3NlIC1sb2cgJGwxCi0JfQotCi0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXJldHVybiAwCi0gICAgfQotfQotCi1wcm9jIGJ1aWxkX3ZlcnNfbGliIHsgdGVzdCBzb3VyY2UgbGlibmFtZSBvdGhlciBtYXBmaWxlIHZlcmV4cCB2ZXJzeW1leHAgc3ltZXhwIH0gewotICAgIGdsb2JhbCBsZAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGV4ZWNfb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIGdsb2JhbCB0bXBkaXIKLSAgICBnbG9iYWwgYXMKLSAgICBnbG9iYWwgb2JqZHVtcAotICAgIGdsb2JhbCBDQwotICAgIGdsb2JhbCBDRkxBR1MKLSAgICBnbG9iYWwgc2hhcmVkCi0gICAgZ2xvYmFsIHNjcmlwdAotCi0gICAgaWYgIVtsZF9jb21waWxlICIkQ0MgLVMgJENGTEFHUyIgJHNyY2Rpci8kc3ViZGlyLyRzb3VyY2UgJHRtcGRpci8kbGlibmFtZS5zXSAgICAgewotCXVucmVzb2x2ZWQgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmICFbbGRfYXNzZW1ibGUgJGFzICR0bXBkaXIvJGxpYm5hbWUucyAkdG1wZGlyLyRsaWJuYW1lLm8gXSAgICAgewotCXVucmVzb2x2ZWQgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJG90aGVyXSB0aGVuIHsKLQlzZXQgb3RoZXJfbGliICIiCi0gICAgfSBlbHNlIHsKLQlzZXQgb3RoZXJfbGliICR0bXBkaXIvJG90aGVyCi0gICAgfQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkbWFwZmlsZV0gdGhlbiB7Ci0Jc2V0IHNjcmlwdF9hcmcgIiIKLSAgICB9IGVsc2UgewotCXNldCBzY3JpcHRfYXJnICIkc2NyaXB0ICRzcmNkaXIvJHN1YmRpci8kbWFwZmlsZSIKLSAgICB9Ci0KLSAgICBpZiB7IVtsZF9zaW1wbGVfbGluayAkbGQgJHRtcGRpci8kbGlibmFtZS5zbyAiJHNoYXJlZCAkdG1wZGlyLyRsaWJuYW1lLm8gJG90aGVyX2xpYiAkc2NyaXB0X2FyZyJdfSAgICAgewotCWZhaWwgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmIHshW29iamR1bXBfdmVyc2lvbnN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGxpYm5hbWUuc28gJHNyY2Rpci8kc3ViZGlyLyR2ZXJleHAgXX0gICAgIHsKLQlmYWlsICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiB7IVtvYmpkdW1wX2R5bnN5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGxpYm5hbWUuc28gJHNyY2Rpci8kc3ViZGlyLyR2ZXJzeW1leHAgXX0gICAgIHsKLQlmYWlsICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRzeW1leHBdIHRoZW4gewotCWlmIHshW29iamR1bXBfZW1wdHlzeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLm8gXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9IGVsc2UgewotCWlmIHshW29iamR1bXBfc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5vICRzcmNkaXIvJHN1YmRpci8kc3ltZXhwIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotCi0gICAgcGFzcyAkdGVzdAotICAgIAotfQotCi1wcm9jIHRlc3RfbGRmYWlsIHsgdGVzdCBmbGFnIHNvdXJjZSBleGVjbmFtZSBvdGhlciBtYXBmaWxlIHdoeWZhaWwgfSB7Ci0gICAgZ2xvYmFsIGxkCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgZ2xvYmFsIHRtcGRpcgotICAgIGdsb2JhbCBhcwotICAgIGdsb2JhbCBvYmpkdW1wCi0gICAgZ2xvYmFsIENDCi0gICAgZ2xvYmFsIENGTEFHUwotICAgIGdsb2JhbCBzY3JpcHQKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJG90aGVyXSB0aGVuIHsKLQlzZXQgb3RoZXJfbGliICIiCi0gICAgfSBlbHNlIHsKLQlzZXQgb3RoZXJfbGliICR0bXBkaXIvJG90aGVyCi0gICAgfQotCi0gICAgaWYgIVtsZF9jb21waWxlICIkQ0MgLVMgJGZsYWcgJENGTEFHUyIgJHNyY2Rpci8kc3ViZGlyLyRzb3VyY2UgJHRtcGRpci8kZXhlY25hbWUuc10gICAgIHsKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiAhW2xkX2Fzc2VtYmxlICRhcyAkdG1wZGlyLyRleGVjbmFtZS5zICR0bXBkaXIvJGV4ZWNuYW1lLm8gXSAgICAgewotCXVucmVzb2x2ZWQgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiVGhpcyBsaW5rIHNob3VsZCBmYWlsIGJlY2F1c2Ugb2YgJHdoeWZhaWwiCi0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRtYXBmaWxlXSB0aGVuIHsKLQlzZXQgc2NyaXB0X2FyZyAiIgotICAgIH0gZWxzZSB7Ci0Jc2V0IHNjcmlwdF9hcmcgIiRzY3JpcHQgJHNyY2Rpci8kc3ViZGlyLyRtYXBmaWxlIgotICAgIH0KLQotICAgIGlmIHshW2xkX2xpbmsgJGxkICR0bXBkaXIvJGV4ZWNuYW1lICIkdG1wZGlyLyRleGVjbmFtZS5vICRvdGhlcl9saWIgJHNjcmlwdF9hcmciXX0gICAgIHsKLQlwYXNzICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0gICAgZmFpbCAiJHRlc3QiCi19Ci0KLXByb2MgdGVzdF9hc2ZhaWwgeyB0ZXN0IGZsYWcgc291cmNlIGV4ZWNuYW1lIHdoeWZhaWwgfSB7Ci0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgdG1wZGlyCi0gICAgZ2xvYmFsIGFzCi0gICAgZ2xvYmFsIENDCi0gICAgZ2xvYmFsIENGTEFHUwotCi0gICAgaWYgIVtsZF9jb21waWxlICIkQ0MgLVMgJGZsYWcgJENGTEFHUyIgJHNyY2Rpci8kc3ViZGlyLyRzb3VyY2UgJHRtcGRpci8kZXhlY25hbWUuc10gICAgIHsKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIlRoaXMgYXNzZW1ibGUgc2hvdWxkIGZhaWwgYmVjYXVzZSBvZiAkd2h5ZmFpbCIKLSAgICBjYXRjaCAiZXhlYyAkYXMgLW8gJHRtcGRpci8kZXhlY25hbWUubyAkdG1wZGlyLyRleGVjbmFtZS5zIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlmYWlsICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0gICAgdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0gICAgcGFzcyAiJHRlc3QiCi19Ci0KLXByb2MgdGVzdF9zdHJpcF92ZXJzX2xpYiB7IHRlc3Qgc3JjbGliIGxpYm5hbWUgdmVyZXhwIHZlcnN5bWV4cCB9IHsKLSAgICBnbG9iYWwgc3RyaXAKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBleGVjX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICBnbG9iYWwgdG1wZGlyCi0gICAgZ2xvYmFsIG9iamR1bXAKLQotICAgIHZlcmJvc2UgLWxvZyAiY3AgJHRtcGRpci8kc3JjbGliICR0bXBkaXIvJGxpYm5hbWUuc28iCi0gICAgZXhlYyBjcCAkdG1wZGlyLyRzcmNsaWIgJHRtcGRpci8kbGlibmFtZS5zbwotCi0gICAgdmVyYm9zZSAtbG9nICIkc3RyaXAgJHRtcGRpci8kbGlibmFtZS5zbyIKLSAgICBjYXRjaCAiZXhlYyAkc3RyaXAgJHRtcGRpci8kbGlibmFtZS5zbyIgZXhlY19vdXRwdXQKLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0KLSMgSWYgc3RyaXAgd2VudCBPSywgdGhlbiBydW4gdGhlIHVzdWFsIHRlc3RzIG9uIHRoZSB0aGluZyB0byBtYWtlIHN1cmUgdGhhdAotIyBpdCBpcyBzYW5lLgotCWlmIHshW29iamR1bXBfdmVyc2lvbnN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGxpYm5hbWUuc28gJHNyY2Rpci8kc3ViZGlyLyR2ZXJleHAgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLQkKLQlpZiB7IVtvYmpkdW1wX2R5bnN5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGxpYm5hbWUuc28gJHNyY2Rpci8kc3ViZGlyLyR2ZXJzeW1leHAgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLQkKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCWZhaWwgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLSAgICBwYXNzICR0ZXN0Ci19Ci0KLQotcHJvYyBidWlsZF9leGVjIHsgdGVzdCBzb3VyY2UgZXhlY25hbWUgZmxhZ3Mgc29saWJuYW1lIHZlcmV4cCB2ZXJzeW1leHAgc3ltZXhwIH0gewotICAgIGdsb2JhbCBsZAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGV4ZWNfb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIGdsb2JhbCB0bXBkaXIKLSAgICBnbG9iYWwgYXMKLSAgICBnbG9iYWwgb2JqZHVtcAotICAgIGdsb2JhbCBDQwotICAgIGdsb2JhbCBDRkxBR1MKLQotICAgIHNldCBzaGFyZWQgLS1zaGFyZWQKLSAgICBzZXQgc2NyaXB0IC0tdmVyc2lvbi1zY3JpcHQKLSAgICBpZiAhW2xkX2NvbXBpbGUgIiRDQyAtUyAkQ0ZMQUdTIiAkc3JjZGlyLyRzdWJkaXIvJHNvdXJjZSAkdG1wZGlyLyRleGVjbmFtZS5zXSAgICAgewotCXVucmVzb2x2ZWQgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmICFbbGRfYXNzZW1ibGUgJGFzICR0bXBkaXIvJGV4ZWNuYW1lLnMgJHRtcGRpci8kZXhlY25hbWUubyBdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkc29saWJuYW1lXSB0aGVuIHsKLQlzZXQgc29saWJuYW1lX2xpYiAiIgotICAgIH0gZWxzZSB7Ci0Jc2V0IHNvbGlibmFtZV9saWIgJHRtcGRpci8kc29saWJuYW1lCi0gICAgfQotCi0gICAgaWYgeyFbbGRfbGluayAkbGQgJHRtcGRpci8kZXhlY25hbWUgIiRmbGFncyAkdG1wZGlyLyRleGVjbmFtZS5vICRzb2xpYm5hbWVfbGliIl19ICAgICB7Ci0JZmFpbCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkdmVyZXhwXSB0aGVuIHsKLSMKLSMgTWFrZSBzdXJlIHdlIGdldCBub3RoaW5nIGJhY2suCi0jCi0JaWYgeyFbb2JqZHVtcF9lbXB0eXZlcnN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGV4ZWNuYW1lIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfSBlbHNlIHsKLQlpZiB7IVtvYmpkdW1wX3ZlcnNpb25zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZSAkc3JjZGlyLyRzdWJkaXIvJHZlcmV4cCBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJHZlcnN5bWV4cF0gdGhlbiB7Ci0JaWYgeyFbb2JqZHVtcF9lbXB0eWR5bnN5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGV4ZWNuYW1lIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfSBlbHNlIHsKLQlpZiB7IVtvYmpkdW1wX2R5bnN5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGV4ZWNuYW1lICRzcmNkaXIvJHN1YmRpci8kdmVyc3ltZXhwIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkc3ltZXhwXSB0aGVuIHsKLQlpZiB7IVtvYmpkdW1wX2VtcHR5c3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUubyBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0gZWxzZSB7Ci0JaWYgeyFbb2JqZHVtcF9zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZS5vICRzcmNkaXIvJHN1YmRpci8kc3ltZXhwIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotCi0gICAgcGFzcyAkdGVzdAotfQotCi0KLSMKLSMgQmFzaWMgdGVzdCAtIGJ1aWxkIGEgbGlicmFyeSB3aXRoIHZlcnNpb25lZCBzeW1ib2xzLgotIwotYnVpbGRfdmVyc19saWIgInZlcnMxIiB2ZXJzMS5jIHZlcnMxICIiIHZlcnMxLm1hcCB2ZXJzMS52ZXIgdmVyczEuZHN5bSB2ZXJzMS5zeW0KLQotCi0jCi0jIFRlc3QgIzIgLSBidWlsZCBhIGxpYnJhcnksIGFuZCBsaW5rIGl0IGFnYWluc3QgdGhlIGxpYnJhcnkgd2UgYnVpbHQgaW4gc3RlcAotIyAxLgotIwotYnVpbGRfdmVyc19saWIgInZlcnMyIiB2ZXJzMi5jIHZlcnMyIHZlcnMxLnNvIHZlcnMyLm1hcCB2ZXJzMi52ZXIgdmVyczIuZHN5bSAiIgotCi0jCi0jIFRlc3QgIzMgLSBidWlsZCBhbiBleGVjdXRhYmxlLCBhbmQgbGluayBpdCBhZ2FpbnN0IHZlcnMxLnNvLgotIwotYnVpbGRfZXhlYyAidmVyczMiIHZlcnMzLmMgdmVyczMgIiIgdmVyczEuc28gdmVyczMudmVyIHZlcnMzLmRzeW0gIiIKLQotIwotIyBUZXN0ICM0IC0gTWFrZSBzdXJlIGEgdmVyc2lvbiBpbXBsaWNpdGx5IGRlZmluZWQgaW4gYW4gZXhlY3V0YWJsZQotIyBjYXVzZXMgYSB2ZXJzaW9uIG5vZGUgdG8gYmUgY3JlYXRlZC4gIFZlcmlmeSB0aGlzIGJvdGggd2l0aCBhbmQgd2l0aG91dAotIyAtLWV4cG9ydC1keW5hbWljLgotIwotCi0jIFRoaXMgdGVzdCBmYWlscyBvbiBNSVBTLiAgT24gdGhlIE1JUFMgd2UgbXVzdCBwdXQgZm9vIGluIHRoZSBkeW5hbWljCi0jIHN5bWJvbCB0YWJsZSwgd2hpY2ggdGhlIHRlc3QgZG9lcyBub3QgZXhwZWN0Lgotc2V0dXBfeGZhaWwgIm1pcHMqLSotKiIKLWJ1aWxkX2V4ZWMgInZlcnM0IiB2ZXJzNC5jIHZlcnM0ICIiICIiICIiICIiIHZlcnM0LnN5bQotCi1idWlsZF9leGVjICJ2ZXJzNGEiIHZlcnM0LmMgdmVyczRhICItZXhwb3J0LWR5bmFtaWMiICIiIHZlcnM0YS52ZXIgdmVyczRhLmRzeW0gdmVyczRhLnN5bQotCi0KLSMKLSMgVHJ5IG11bHRpcGxlIGRlZmluaXRpb25zIGZvb0BCQVIgYW5kIGZvb0BAQkFSIGFuZCBtYWtlIHN1cmUgdGhlIGxpbmtlcgotIyBjb21wbGFpbnMuCi0jCi10ZXN0X2xkZmFpbCAidmVyczUiICIiIHZlcnM1LmMgdmVyczUgIiIgIiIgIm11bHRpcGxlIGRlZmluaXRpb24gb2YgZm9vQFZFUlNfMS4yIgotCi0jCi0jCi0jIE5vdyBidWlsZCBhIHRlc3QgdGhhdCBzaG91bGQgcmVmZXJlbmNlIGEgYnVuY2ggb2YgdmVyc2lvbmVkIHN5bWJvbHMuCi0jIEFsbCBvZiB0aGVtIHNob3VsZCBiZSBjb3JyZWN0bHkgcmVmZXJlbmNlZC4KLSMKLWJ1aWxkX2V4ZWMgInZlcnM2IiB2ZXJzNi5jIHZlcnM2ICIiIHZlcnMxLnNvIHZlcnM2LnZlciB2ZXJzNi5kc3ltIHZlcnM2LnN5bQotCi0jCi0jIEFub3RoZXIgdGVzdCB0byB2ZXJpZnkgdGhhdCBzb21ldGhpbmcgbWFkZSBsb2NhbCB2aWEgJ2xvY2FsJyBpcyB0cnVseSBub3QKLSMgYWNjZXNzaWJsZS4KLSMKLWJ1aWxkX3ZlcnNfbGliICJ2ZXJzN2EiIHZlcnM3YS5jIHZlcnM3YSAiIiB2ZXJzNy5tYXAgdmVyczdhLnZlciB2ZXJzN2EuZHN5bSB2ZXJzN2Euc3ltCi0KLXRlc3RfbGRmYWlsICJ2ZXJzNyIgIiIgdmVyczcuYyB2ZXJzNyB2ZXJzN2Euc28gIiIgInVuZGVmaW5lZCByZWZlcmVuY2UgdG8gaGlkZV9hIgotCi0KLSMKLSMgVGhpcyB0ZXN0IGlzIGRlc2lnbmVkIHRvIHZlcmlmeSB0aGF0IHdlIGNhbiBwYXNzIGEgbGlua2VyIHNjcmlwdCBvbiB0aGUKLSMgY29tbWFuZCBsaW5lIGFzIGlmIGl0IHdlcmUgYSBub3JtYWwgLm8gZmlsZS4KLSMKLWNhdGNoICJleGVjIGNwICRzcmNkaXIvJHN1YmRpci92ZXJzOC5tYXAgJHRtcGRpci8iIGlnbm9yZV9vdXRwdXQKLWJ1aWxkX3ZlcnNfbGliICJ2ZXJzOCIgdmVyczEuYyB2ZXJzOCB2ZXJzOC5tYXAgIiIgdmVyczgudmVyIHZlcnMxLmRzeW0gdmVyczEuc3ltCi0KLSMKLSMgVGhpcyB0ZXN0IHRyaWVzIHRvIG1ha2Ugc3VyZSB0aGF0IHZlcnNpb24gcmVmZXJlbmNlcyB0byB2ZXJzaW9uZWQgc3ltYm9scwotIyBkb24ndCBjb2xsaWRlIHdpdGggZGVmYXVsdCBkZWZpbml0aW9ucyB3aXRoIHRoZSBzYW1lIHN5bWJvbC4KLSMKLWJ1aWxkX2V4ZWMgInZlcnM5IiB2ZXJzOS5jIHZlcnM5ICItZXhwb3J0LWR5bmFtaWMiICIiIHZlcnM5LnZlciB2ZXJzOS5kc3ltIHZlcnM5LnN5bQotCi0KLSMKLSMgVHJ5IGFuZCB1c2UgYSBub24tZXhpc3RhbnQgdmVyc2lvbiBub2RlLiAgVGhlIGxpbmtlciBzaG91bGQgZmFpbCB3aXRoCi0jIGFuIGVycm9yIG1lc3NhZ2UuCi0jCi10ZXN0X2xkZmFpbCAidmVyczEwIiAiLURET19URVNUMTAiIHZlcnMxLmMgdmVyczEwICIiICJ2ZXJzMS5tYXAgLS1zaGFyZWQiICJpbnZhbGlkIHZlcnNpb24iCi0KLSMKLSMgVHJ5IGFuZCBzb21lIHRoaW5ncyB0aGUgYXNzZW1ibGVyIHNob3VsZCBjb21wbGFpbiBhYm91dC4KLSMKLXRlc3RfYXNmYWlsICJ2ZXJzMTEiICItRERPX1RFU1QxMSIgdmVyczEuYyB2ZXJzMTEgIm5vIEAgaW4gc3ltdmVyIgotCi10ZXN0X2FzZmFpbCAidmVyczEyIiAiLURET19URVNUMTIiIHZlcnMxLmMgdmVyczEyICJleHRlcm4gdmVyc2lvbiBkZWZpbml0aW9uIgotCi0jCi0jIFB1dCBhIHNoYXJlZCBsaWJyYXJ5IGluIGFuIGFyY2hpdmUgbGlicmFyeSwgYW5kIG1ha2Ugc3VyZSB0aGUgZ2xvYmFsCi0jIGFyY2hpdmUgc3ltYm9sIHRhYmxlIGlzIHNhbmUuCi0jCi10ZXN0X2FyICJhciB3aXRoIHZlcnNpb25lZCBzb2xpYiIgdmVyczEzLmEgdmVyczEuc28gdmVyczEzLmFzeW0KLQotIwotIyBTdHJpcCBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgbWFrZSBzdXJlIHdlIGRpZG4ndCBzY3JldyBzb21ldGhpbmcgdXAgaW4gdGhlcmUuCi0jCi10ZXN0X3N0cmlwX3ZlcnNfbGliICJ2ZXJzMTQiIHZlcnMxLnNvIHZlcnMxNCB2ZXJzMS52ZXIgdmVyczEuZHN5bSAKLQotCi0jCi0jIEJ1aWxkIGFub3RoZXIgdGVzdCB3aXRoIHNvbWUgdmVyc2lvbmVkIHN5bWJvbHMuICBIZXJlIHdlIGFyZSBnb2luZyB0byAKLSMgdHJ5IGFuZCBvdmVycmlkZSBzb21ldGhpbmcgZnJvbSB0aGUgbGlicmFyeSwgYW5kIHdlIHNob3VsZG4ndCBnZXQKLSMgYW55IGVycm9ycy4KLSMKLWJ1aWxkX2V4ZWMgInZlcnMxNSIgdmVyczE1LmMgdmVyczE1ICIiIHZlcnMxLnNvIHZlcnMxNS52ZXIgdmVyczE1LmRzeW0gdmVyczE1LnN5bQotCi0jCi0jIFRlc3QgdGhhdCB3aGVuIHdlIG92ZXJyaWRlIGEgdmVyc2lvbmVkIHN5bWJvbCBmcm9tIHRoZSBsaWJyYXJ5IHRoaXMKLSMgc3ltYm9sIGFwcGVhcnMgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIG9mIHRoZSBleGVjdXRhYmxlLgotIwotYnVpbGRfdmVyc19saWIgInZlcnMxNmEiIHZlcnMxNmEuYyB2ZXJzMTZhICIiIHZlcnMxNi5tYXAgdmVyczE2YS52ZXIgdmVyczE2YS5kc3ltICIiCi1idWlsZF9leGVjICJ2ZXJzMTYiIHZlcnMxNi5jIHZlcnMxNiAiIiB2ZXJzMTZhLnNvICIiIHZlcnMxNi5kc3ltICIiCi0KLSMgVGVzdCBhIHdlYWsgdmVyc2lvbmVkIHN5bWJvbC4KLWJ1aWxkX3ZlcnNfbGliICJ2ZXJzMTciIHZlcnMxNy5jIHZlcnMxNyAiIiB2ZXJzMTcubWFwIHZlcnMxNy52ZXIgdmVyczE3LmRzeW0gIiIKLWJ1aWxkX3ZlcnNfbGliICJ2ZXJzMTgiIHZlcnMxOC5jIHZlcnMxOCB2ZXJzMTcuc28gdmVyczE4Lm1hcCB2ZXJzMTgudmVyIHZlcnMxOC5kc3ltIHZlcnMxOC5zeW0KLWJ1aWxkX2V4ZWMgInZlcnMxOSIgdmVyczE5LmMgdmVyczE5ICItcnBhdGggLiIgdmVyczE4LnNvIHZlcnMxOS52ZXIgdmVyczE5LmRzeW0gIiIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjdiYzNiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIEJhc2ljIHRlc3Qgb2YgdmVyc2lvbmluZy4gIFRoZSBpZGVhIHdpdGggdGhpcyBpcyB0aGF0IHdlIGRlZmluZQotICogYSBidW5jaCBvZiBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBzeW1ib2wsIGFuZCB3ZSBjYW4gdGhlb3JldGljYWxseQotICogdGhlbiBsaW5rIGFwcGxpY2F0aW9ucyBhZ2FpbnN0IHZhcnlpbmcgc2V0cyBvZiB0aGVzZS4KLSAqLwotY29uc3QgY2hhciAqIHNob3dfYmFyMSA9ICJhc2RmIjsKLWNvbnN0IGNoYXIgKiBzaG93X2JhcjIgPSAiYXNkZiI7Ci0KLWV4dGVybiBpbnQgbmV3Ml9mb28oKTsKLWV4dGVybiBpbnQgYmFyMzMoKTsKLQotaW50Ci1iYXIoKQotewotCXJldHVybiAzOwotfQotCi0vKgotICogVGhlICdoaWRlJyBwcmVmaXggaXMgc29tZXRoaW5nIHNvIHRoYXQgd2UgY2FuIGF1dG9tYXRpY2FsbHkgc2VhcmNoIHRoZQotICogc3ltYm9sIHRhYmxlIGFuZCB2ZXJpZnkgdGhhdCBub25lIG9mIHRoZXNlIHN5bWJvbHMgd2VyZSBhY3R1YWxseSBleHBvcnRlZC4KLSAqLwotaW50Ci1oaWRlX29yaWdpbmFsX2ZvbygpCi17Ci0JcmV0dXJuIDErYmFyKCk7Ci0KLX0KLQotaW50Ci1oaWRlX29sZF9mb28oKQotewotCXJldHVybiAxMCtiYXIoKTsKLQotfQotCi1pbnQKLWhpZGVfb2xkX2ZvbzEoKQotewotCXJldHVybiAxMDArYmFyKCk7Ci0KLX0KLQotaW50Ci1oaWRlX25ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLV9fYXNtX18oIi5zeW12ZXIgaGlkZV9vcmlnaW5hbF9mb28sc2hvd19mb29AIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfb2xkX2ZvbyxzaG93X2Zvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBoaWRlX29sZF9mb28xLHNob3dfZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfbmV3X2ZvbyxzaG93X2Zvb0BAVkVSU18yLjAiKTsKLQotCi0KLSNpZmRlZiBET19URVNUMTAKLS8qIEluIHRlc3QgMTAsIHdlIHRyeSBhbmQgZGVmaW5lIGEgbm9uLWV4aXN0YW50IHZlcnNpb24gbm9kZS4gIFRoZSBsaW5rZXIKLSAqIHNob3VsZCBjYXRjaCB0aGlzIGFuZCBjb21wbGFpbi4gKi8KLWludAotaGlkZV9uZXdfYm9ndXNfZm9vKCkKLXsKLQlyZXR1cm4gMTAwMCtiYXIoKTsKLQotfQotX19hc21fXygiLnN5bXZlciBoaWRlX25ld19ib2d1c19mb28sc2hvd19mb29AVkVSU18yLjIiKTsKLSNlbmRpZgotCi0KLQotCi0jaWZkZWYgRE9fVEVTVDExCi0vKgotICogVGhpcyB0ZXN0IGlzIGRlc2lnbmVkIHRvIGNhdGNoIGEgY291cGxlIG9mIHN5bnRhY3RpYyBlcnJvcnMuICBUaGUgYXNzZW1ibGVyCi0gKiBzaG91bGQgY29tcGxhaW4gYWJvdXQgYm90aCBvZiB0aGUgZGlyZWN0aXZlcyBiZWxvdy4KLSAqLwotdm9pZAoteHl6enooKQotewotICBuZXcyX2ZvbygpOwotICBiYXIzMygpOwotfQotCi1fX2FzbV9fKCIuc3ltdmVyIG5ldzJfZm9vLGZvb1ZFUlNfMi4wIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGJhcjMzLGJhckBAVkVSU18yLjAiKTsKLSNlbmRpZgotCi0jaWZkZWYgRE9fVEVTVDEyCi0vKgotICogVGhpcyB0ZXN0IGlzIGRlc2lnbmVkIHRvIGNhdGNoIGEgY291cGxlIG9mIHN5bnRhY3RpYyBlcnJvcnMuICBUaGUgYXNzZW1ibGVyCi0gKiBzaG91bGQgY29tcGxhaW4gYWJvdXQgYm90aCBvZiB0aGUgZGlyZWN0aXZlcyBiZWxvdy4KLSAqLwotdm9pZAoteHl6enooKQotewotICBuZXcyX2ZvbygpOwotICBiYXIzMygpOwotfQotCi1fX2FzbV9fKCIuc3ltdmVyIGJhcjMzLGJhckBAVkVSU18yLjAiKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNDQzNGIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18xLjEgICAgVkVSU18xLjEKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4yICAgIFZFUlNfMS4yCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzIuMCAgICBWRVJTXzIuMAotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKEJhc2VcKSAgICAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChWRVJTXzEuMVwpICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjJcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogZyAgICBETyAoLnM/ZGF0YXxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMi4wICAgIHNob3dfYmFyMQotWzAtOWEtZl0qIGcgICAgRE8gKC5zP2RhdGF8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzIuMCAgICBzaG93X2JhcjIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLm1hcCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjMzdiYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1WRVJTXzEuMSB7Ci0JIGdsb2JhbDoKLQkJIGZvbzE7Ci0JIGxvY2FsOgotCQkgaGlkZV9vbGQqOyAKLQkJIGhpZGVfb3JpZ2luYWwqOyAKLQkJIGhpZGVfbmV3KjsgCi19OwotCi1WRVJTXzEuMiB7Ci0JCSBmb28yOwotfSBWRVJTXzEuMTsKLQotVkVSU18yLjAgewotCQkgc2hvd19iYXIxOyBzaG93X2JhcjI7Ci19IFZFUlNfMS4yOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEuc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEuc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGZmODU1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnN5bQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0AKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AVkVSU18xLjEKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AVkVSU18xLjIKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AQFZFUlNfMi4wCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNzMxMmIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEudmVyCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MGEyNjg4MWYgdG1wZGlyL3ZlcnMxLnNvCi0yIDB4MDAgMHgwYTc5MjdiMSBWRVJTXzEuMQotMyAweDAwIDB4MGE3OTI3YjIgVkVSU18xLjIKLQlWRVJTXzEuMSAKLTQgMHgwMCAweDBhNzkyMmIwIFZFUlNfMi4wCi0JVkVSU18xLjIgCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxMy5hc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEzLmFzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDYxNDQuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEzLmFzeW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1WRVJTXzEuMSBpbiB2ZXJzMS5zbwotVkVSU18xLjIgaW4gdmVyczEuc28KLVZFUlNfMi4wIGluIHZlcnMxLnNvCi1iYXIgaW4gdmVyczEuc28KLXNob3dfYmFyMSBpbiB2ZXJzMS5zbwotc2hvd19iYXIyIGluIHZlcnMxLnNvCi1zaG93X2Zvb0AgaW4gdmVyczEuc28KLXNob3dfZm9vQEBWRVJTXzIuMCBpbiB2ZXJzMS5zbwotc2hvd19mb29AVkVSU18xLjEgaW4gdmVyczEuc28KLXNob3dfZm9vQFZFUlNfMS4yIGluIHZlcnMxLnNvCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTIyY2FjLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIFRlc3RjYXNlIHRvIG1ha2Ugc3VyZSB0aGF0IGlmIHdlIGV4dGVybmFsbHkgcmVmZXJlbmNlIGEgdmVyc2lvbmVkIHN5bWJvbAotICogdGhhdCB3ZSBhbHdheXMgZ2V0IHRoZSByaWdodCBvbmUuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQKLWZvb18xKCkKLXsKLSAgcmV0dXJuIDEwMzQ7Ci19Ci0KLWludAotZm9vXzIoKQotewotICByZXR1cm4gMTM0MzsKLX0KLQotaW50Ci1mb29fMygpCi17Ci0gIHJldHVybiAxMzM0OwotfQotCi1pbnQKLW1haW4oKQotewotICBwcmludGYoIkV4cGVjdCA0LCAgICBnZXQgJWRcbiIsIGZvb18xKCkpOwotICBwcmludGYoIkV4cGVjdCAxMywgICBnZXQgJWRcbiIsIGZvb18yKCkpOwotICBwcmludGYoIkV4cGVjdCAxMDMsICBnZXQgJWRcbiIsIGZvb18zKCkpOwotICByZXR1cm4gMDsKLX0KLQotX19hc21fXygiLnN5bXZlciBmb29fMSxzaG93X2Zvb0AiKTsKLV9fYXNtX18oIi5zeW12ZXIgZm9vXzIsc2hvd19mb29AVkVSU18xLjEiKTsKLV9fYXNtX18oIi5zeW12ZXIgZm9vXzMsc2hvd19mb29AQFZFUlNfMS4yIik7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjVlMTVjLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMSAgICBWRVJTXzEuMQotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18xLjIgICAgVkVSU18xLjIKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChCYXNlXCkgICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjFcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18xLjIgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdiYWI2Mi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQAotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0BWRVJTXzEuMQotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0BAVkVSU18xLjIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDJlYzU4Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwZDhhMjYwNSB0bXBkaXIvdmVyczE1Ci0yIDB4MDAgMHgwYTc5MjdiMiBWRVJTXzEuMgotMyAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY2OGJjNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWludCBzaG93X2JhciAoKQotewotICByZXR1cm4gMDsKLX0KLWV4dGVybiBpbnQgc2hvd19mb28gKCk7Ci0KLWludCBtYWluICgpCi17Ci0gIHJldHVybiBzaG93X2ZvbyAoKTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNDI0YzMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVswLTlhLWZdKiBnICAgIERGIChcLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qKCAgQmFzZSAgICAgICApPyAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19iYXIKLVswLTlhLWZdKiAgICAgIERGIFwqVU5EXCoJWzAtOWEtZl0qKCAgICAgICAgICAgICApPyAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjYzMzJmLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVZFUlNfMS4xIHsKLSAgZ2xvYmFsOiBzaG93X2JhcjsKLX07CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1M2IxZmQuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS5jCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1pbnQgc2hvd19iYXIgKCkKLXsKLSAgcmV0dXJuIDE7Ci19Ci1pbnQgc2hvd19mb28gKCkKLXsKLSAgcmV0dXJuIHNob3dfYmFyICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNThkZjQ3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgRE8gKFwudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMVwuMSAgICBWRVJTXzFcLjEKLVswLTlhLWZdKiBnICAgIERGIChcLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzFcLjEgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfYmFyCi1bMC05YS1mXSogZyAgICBERiAoXC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgQmFzZSAgICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2NmMWRmLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEudmVyCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MDYwMWNmYmYgdG1wZGlyL3ZlcnMxNmEuc28KLTIgMHgwMCAweDBhNzkyN2IxIFZFUlNfMS4xCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmNkNjQ3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy5jCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1pbnQKLXNob3dfZm9vICgpCi17Ci0gIHJldHVybiA5OTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3LmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZWNjMGEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3LmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMi4wICAgIFZFUlNfMi4wCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzIuMCAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTcubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWM5Y2Y2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVZFUlNfMi4wIHsKLQkgZ2xvYmFsOgotCQkgc2hvd19mb287Ci19OwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNy52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OGQ1OWMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE3LnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDAyNjA1ZDNmIHRtcGRpci92ZXJzMTcuc28KLTIgMHgwMCAweDBhNzkyMmIwIFZFUlNfMi4wCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTguYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWRjYzI1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotaW50Ci1iYXIgKCkKLXsKLSAgcmV0dXJuIDM7Ci19Ci0KLSNwcmFnbWEgd2VhayBoaWRlX29yaWdpbmFsX2ZvbwotCi1pbnQKLWhpZGVfb3JpZ2luYWxfZm9vICgpCi17Ci0gIHJldHVybiAxICsgYmFyICgpOwotfQotCi0jcHJhZ21hIHdlYWsgaGlkZV9vbGRfZm9vCi0KLWludAotaGlkZV9vbGRfZm9vICgpCi17Ci0gIHJldHVybiAxMCArIGJhcigpOwotfQotCi0jcHJhZ21hIHdlYWsgaGlkZV9vbGRfZm9vMQotCi1pbnQKLWhpZGVfb2xkX2ZvbzEgKCkKLXsKLSAgcmV0dXJuIDEwMCArIGJhciAoKTsKLX0KLQotI3ByYWdtYSB3ZWFrIGhpZGVfbmV3X2ZvbwotCi1pbnQKLWhpZGVfbmV3X2ZvbyAoKQotewotICByZXR1cm4gMTAwMCArIGJhciAoKTsKLX0KLQotX19hc21fXygiLnN5bXZlciBoaWRlX29yaWdpbmFsX2ZvbyxzaG93X2Zvb0AiKTsKLV9fYXNtX18oIi5zeW12ZXIgaGlkZV9vbGRfZm9vLHNob3dfZm9vQFZFUlNfMS4xIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfb2xkX2ZvbzEsc2hvd19mb29AVkVSU18xLjIiKTsKLV9fYXNtX18oIi5zeW12ZXIgaGlkZV9uZXdfZm9vLHNob3dfZm9vQEBWRVJTXzIuMCIpOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTguZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzYWQ3Yi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTguZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotWzAtOWEtZl0qICB3ICAgREYgKFwqVU5EXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMSAgICBWRVJTXzEuMQotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18xLjIgICAgVkVSU18xLjIKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMi4wICAgIFZFUlNfMi4wCi1bMC05YS1mXSogIHcgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoQmFzZVwpICAgICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qICB3ICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKFZFUlNfMS4xXCkgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiAgdyAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChWRVJTXzEuMlwpICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTgubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4Lm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFjMmIwZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTgubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotVkVSU18xLjEgewotCSBnbG9iYWw6Ci0JCSBmb28xOwotCSBsb2NhbDoKLQkJIGhpZGVfb2xkKjsgCi0JCSBoaWRlX29yaWdpbmFsKjsgCi0JCSBoaWRlX25ldyo7IAotfTsKLQotVkVSU18xLjIgewotCQkgZm9vMjsKLX0gVkVSU18xLjE7Ci0KLVZFUlNfMi4wIHsKLX0gVkVSU18xLjI7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTguc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE4LnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljZWZkZi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTguc3ltCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1bMC05YS1mXSogIHcgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQAotWzAtOWEtZl0qICB3ICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0BWRVJTXzEuMQotWzAtOWEtZl0qICB3ICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0BWRVJTXzEuMgotWzAtOWEtZl0qICB3ICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0BAVkVSU18yLjAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTgudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjUyOTk2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOC52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MDI2MDhkM2YgdG1wZGlyL3ZlcnMxOC5zbwotMiAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKLTMgMHgwMCAweDBhNzkyN2IyIFZFUlNfMS4yCi0JVkVSU18xLjEgCi00IDB4MDIgMHgwYTc5MjJiMCBWRVJTXzIuMAotCVZFUlNfMS4yIAotCi1WZXJzaW9uIFJlZmVyZW5jZXM6Ci0gIHJlcXVpcmVkIGZyb20gdG1wZGlyL3ZlcnMxNy5zbzoKLSAgICAweDBhNzkyMmIwIDB4MDAgMDUgVkVSU18yLjAKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE5LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFiZjI3YS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTkuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1leHRlcm4gaW50IHNob3dfZm9vICgpOwotCi1pbnQKLW1haW4gKCkKLXsKLSAgcHJpbnRmICgiJWRcbiIsIHNob3dfZm9vICgpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTkuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWMyNjQyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE5LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxOS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmRjODguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE5LnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotVmVyc2lvbiBSZWZlcmVuY2VzOgotICByZXF1aXJlZCBmcm9tICp0bXBkaXIvdmVyczE3LnNvOgotICAgIDB4MGE3OTIyYjAgMHgwMCAwMiBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYTU0Y2IuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qCi0gKiBUZXN0IGZ1bmN0aW9uLiAgVGhpcyBpcyBidWlsdCBpbnRvIGEgc2hhcmVkIGxpYnJhcnksIGFuZCByZWZlcmVuY2VzIGEKLSAqIHZlcnNpb25lZCBzeW1ib2wgZm9vIHRoYXQgaXMgaW4gdGVzdC5zby4KLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWV4dGVybiBpbnQgc2hvd19mb28gKCk7Ci0KLXZvaWQKLXNob3dfeHl6enkoKQotewotICBwcmludGYoIiVkIiwgc2hvd19mb28oKSk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5ODVjMi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTX1hYWF8xLjEgVkVSU19YWFhfMS4xCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTX1hYWF8xLjEgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfeHl6enkKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLm1hcCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1N2Q3ZS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotVkVSU19YWFhfMS4xIHsKLQkJIHNob3dfeHl6enk7Ci19OwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTI2MzQzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDBhMjYxODFmIHRtcGRpci92ZXJzMi5zbwotMiAweDAwIDB4MDg3ODViNTEgVkVSU19YWFhfMS4xCi0KLVZlcnNpb24gUmVmZXJlbmNlczoKLSAgcmVxdWlyZWQgZnJvbSB0bXBkaXIvdmVyczEuc286Ci0gICAgMHgwYTc5MjJiMCAweDAwIDAzIFZFUlNfMi4wCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmI0ZGFmLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKgotICogTWFpbiBwcm9ncmFtIGZvciB0ZXN0MSwgdGVzdDIuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1leHRlcm4gaW50IHNob3dfZm9vICgpOwotCi1pbnQKLW1haW4oKQotewotICBwcmludGYoIiVkXG4iLCBzaG93X2ZvbygpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzljMjY0Mi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTIzMGVlLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVmVyc2lvbiBSZWZlcmVuY2VzOgotICByZXF1aXJlZCBmcm9tIHRtcGRpci92ZXJzMS5zbzoKLSAgICAweDBhNzkyMmIwIDB4MDAgMDIgVkVSU18yLjAKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1M2YyZWIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBUZXN0Y2FzZSB0byBtYWtlIHN1cmUgdGhhdCBhIHZlcnNpb25lZCBzeW1ib2wgZGVmaW5pdGlvbiBpbiBhbgotICogYXBwbGljYXRpb24gY29ycmVjdGx5IGRlZmluZXMgdGhlIHZlcnNpb24gbm9kZSwgaWYgYW5kIG9ubHkgaWYKLSAqIHRoZSBhY3R1YWwgc3ltYm9sIGlzIGV4cG9ydGVkLiAgVGhpcyBpcyBidWlsdCBib3RoIHdpdGggYW5kIHdpdGhvdXQKLSAqIC1leHBvcnQtZHluYW1pYy4KLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWV4dGVybiBpbnQgZm9vICgpOwotCi1pbnQKLWJhcigpCi17Ci0JcmV0dXJuIDM7Ci19Ci0KLWludAotbmV3X2ZvbygpCi17Ci0JcmV0dXJuIDEwMDArYmFyKCk7Ci0KLX0KLQotX19hc21fXygiLnN5bXZlciBuZXdfZm9vLGZvb0BAVkVSU18yLjAiKTsKLQotaW50Ci1tYWluKCkKLXsKLSAgcHJpbnRmKCIlZFxuIiwgZm9vKCkpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0OTQ0Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP2Zvb0BAVkVSU18yLjAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZjlmZGEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMi4wICAgIFZFUlNfMi4wCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzIuMCAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEuc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0OTQ0Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEuc3ltCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb29AQFZFUlNfMi4wCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc2Y2VkYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEudmVyCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MGQ4YTI2ZTEgdG1wZGlyL3ZlcnM0YQotMiAweDAwIDB4MGE3OTIyYjAgVkVSU18yLjAKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczUuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNmVhNDAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczUuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBUZXN0Y2FzZSB0byB2ZXJpZnkgdGhhdCBmb29AQkFSIGFuZCBmb29AQEJBUiBhcmUgY29ycmVjdGx5IGRldGVjdGVkCi0gKiBhcyBhIG11bHRpcGx5IGRlZmluZWQgc3ltYm9sLgotICovCi1jb25zdCBjaGFyICogYmFyMSA9ICJhc2RmIjsKLWNvbnN0IGNoYXIgKiBiYXIyID0gImFzZGYiOwotCi1pbnQKLWJhcigpCi17Ci0JcmV0dXJuIDM7Ci19Ci0KLWludAotb3JpZ2luYWxfZm9vKCkKLXsKLQlyZXR1cm4gMStiYXIoKTsKLQotfQotCi1pbnQKLW9sZF9mb28oKQotewotCXJldHVybiAxMCtiYXIoKTsKLQotfQotCi1pbnQKLW9sZF9mb28xKCkKLXsKLQlyZXR1cm4gMTAwK2JhcigpOwotCi19Ci0KLWludAotbmV3X2ZvbygpCi17Ci0JcmV0dXJuIDEwMDArYmFyKCk7Ci0KLX0KLQotX19hc21fXygiLnN5bXZlciBvcmlnaW5hbF9mb28sZm9vQCIpOwotX19hc21fXygiLnN5bXZlciBvbGRfZm9vLGZvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBvbGRfZm9vMSxmb29AVkVSU18xLjIiKTsKLV9fYXNtX18oIi5zeW12ZXIgbmV3X2Zvbyxmb29AQFZFUlNfMS4yIik7Ci0KLWludAotbWFpbiAoKQotewotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQ4ZGY5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogVGVzdGNhc2UgdG8gbWFrZSBzdXJlIHRoYXQgaWYgd2UgZXh0ZXJuYWxseSByZWZlcmVuY2UgYSB2ZXJzaW9uZWQgc3ltYm9sCi0gKiB0aGF0IHdlIGFsd2F5cyBnZXQgdGhlIHJpZ2h0IG9uZS4KLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWV4dGVybiBpbnQgZm9vXzEoKTsKLWV4dGVybiBpbnQgZm9vXzIoKTsKLWV4dGVybiBpbnQgZm9vXzMoKTsKLWV4dGVybiBpbnQgZm9vXzQoKTsKLQotaW50Ci1tYWluKCkKLXsKLSAgcHJpbnRmKCJFeHBlY3QgNCwgICAgZ2V0ICVkXG4iLCBmb29fMSgpKTsKLSAgcHJpbnRmKCJFeHBlY3QgMTMsICAgZ2V0ICVkXG4iLCBmb29fMigpKTsKLSAgcHJpbnRmKCJFeHBlY3QgMTAzLCAgZ2V0ICVkXG4iLCBmb29fMygpKTsKLSAgcHJpbnRmKCJFeHBlY3QgMTAwMywgZ2V0ICVkXG4iLCBmb29fNCgpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLV9fYXNtX18oIi5zeW12ZXIgZm9vXzEsc2hvd19mb29AIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGZvb18yLHNob3dfZm9vQFZFUlNfMS4xIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGZvb18zLHNob3dfZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGZvb180LHNob3dfZm9vQFZFUlNfMi4wIik7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U4NTFkNC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgICAgICAgICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgVkVSU18xLjIgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgVkVSU18xLjEgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YjVjYzcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuc3ltCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1bMF0qICpGPyAqXCpVTkRcKglbMF0qIHNob3dfZm9vQAotWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0BWRVJTXzEuMQotWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0BWRVJTXzEuMgotWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0BWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGEyYjQ2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotVmVyc2lvbiBSZWZlcmVuY2VzOgotICByZXF1aXJlZCBmcm9tIHRtcGRpci92ZXJzMS5zbzoKLSAgICAweDBhNzkyN2IxIDB4MDAgPz8gVkVSU18xLjEKLSAgICAweDBhNzkyN2IyIDB4MDAgPz8gVkVSU18xLjIKLSAgICAweDBhNzkyMmIwIDB4MDAgPz8gVkVSU18yLjAKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MzE2YzkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcuYworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qCi0gKiBUZXN0IHByb2dyYW0gdGhhdCBnb2VzIHdpdGggdGVzdDcuc28KLSAqLwotCi1leHRlcm4gaW50IGhpZGVfYSgpOwotZXh0ZXJuIGludCBzaG93X2IoKTsKLQotaW50Ci1tYWluKCkKLXsKLSAgcmV0dXJuIGhpZGVfYSgxKSArIHNob3dfYigxKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNy5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNy5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZmQ1MDEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcubWFwCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1WRVJTXzEgewotCWdsb2JhbDoKLQkJc2hvd19iIDsKLQlsb2NhbDoKLQkJaGlkZV9hOwotfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZWU4YzcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogVGVzdCBzdXBwbGllZCBieSBVbHJpY2guICBWZXJpZnkgdGhhdCB3ZSBjYW4gY29ycmVjdGx5IGZvcmNlICdhJwotICogdG8gbG9jYWwgc2NvcGUuCi0gKi8KLWludAotX19hX2ludGVybmFsIChpbnQgZSkKLXsKLSAgcmV0dXJuIGUgKyAxMDsKLX0KLQotaW50Ci1fX2JfaW50ZXJuYWwgKGludCBlKQotewotICByZXR1cm4gZSArIDQyOwotfQotCi1hc20gKCIuc3ltdmVyIF9fYV9pbnRlcm5hbCxoaWRlX2FAQFZFUlNfMSIpOwotYXNtICgiLnN5bXZlciBfX2JfaW50ZXJuYWwsc2hvd19iQEBWRVJTXzEiKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Njk2YzcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMSAgICAgIFZFUlNfMQotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18xICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfYgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OWJkNjEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLnN5bQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9oaWRlX2FAQFZFUlNfMQotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2JAQFZFUlNfMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZWY4YTguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDAyNjlmZDNmIHRtcGRpci92ZXJzN2Euc28KLTIgMHgwMCAweDA1YWE3OTIxIFZFUlNfMQotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0NTg2Yy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC5jCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1pbnQKLW1haW4oKQotewotICByZXR1cm4gYSgxKSArIGIoMSk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MzU5NTUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotVkVSU0lPTiB7Ci0JVkVSU18xLjEgewotCQkgZ2xvYmFsOgotCQkJIGZvbzE7Ci0JCSBsb2NhbDoKLQkJCSBoaWRlX29sZCo7IAotCQkJIGhpZGVfb3JpZ2luYWwqOyAKLQkJCSBoaWRlX25ldyo7IAotCX07Ci0JCi0JVkVSU18xLjIgewotCQkJIGZvbzI7Ci0JfSBWRVJTXzEuMTsKLQkKLQlWRVJTXzIuMCB7Ci0JCQkgc2hvd19iYXIxOyBzaG93X2JhcjI7Ci0JfSBWRVJTXzEuMjsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4LnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1OTAyMy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwYTI2ZjgxZiB0bXBkaXIvdmVyczguc28KLTIgMHgwMCAweDBhNzkyN2IxIFZFUlNfMS4xCi0zIDB4MDAgMHgwYTc5MjdiMiBWRVJTXzEuMgotCVZFUlNfMS4xIAotNCAweDAwIDB4MGE3OTIyYjAgVkVSU18yLjAKLQlWRVJTXzEuMiAKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjE0MDIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBUZXN0Y2FzZSB0byB2ZXJpZnkgdGhhdCByZWZlcmVuY2UgdG8gZm9vQEJBUiBhbmQgYSBkZWZpbml0aW9uIG9mIGZvb0BAQkFSCi0gKiBhcmUgbm90IHRyZWF0ZWQgYXMgYSBtdWx0aXBsZSBkZWYuCi0gKi8KLWNvbnN0IGNoYXIgKiBiYXIxID0gImFzZGYiOwotY29uc3QgY2hhciAqIGJhcjIgPSAiYXNkZiI7Ci0KLWV4dGVybiBpbnQgb2xkX2ZvbzEoKTsKLQotaW50Ci1iYXIoKQotewotCXJldHVybiAzOwotfQotCi1pbnQKLW9yaWdpbmFsX2ZvbygpCi17Ci0JcmV0dXJuIDErYmFyKCk7Ci0KLX0KLQotaW50Ci1vbGRfZm9vKCkKLXsKLQlyZXR1cm4gMTArYmFyKCk7Ci0KLX0KLQotaW50Ci1uZXdfZm9vKCkKLXsKLQlyZXR1cm4gMTAwMCtiYXIoKTsKLQotfQotCi1pbnQKLW1haW4oKQotewotICBvbGRfZm9vMSgpOwotICByZXR1cm4gMDsKLX0KLQotX19hc21fXygiLnN5bXZlciBvcmlnaW5hbF9mb28sZm9vQCIpOwotX19hc21fXygiLnN5bXZlciBvbGRfZm9vLGZvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBvbGRfZm9vMSxmb29AVkVSU18xLjIiKTsKLV9fYXNtX18oIi5zeW12ZXIgbmV3X2Zvbyxmb29AQFZFUlNfMS4yIik7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5MzAwMi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMSAgICBWRVJTXzEuMQotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18xLjIgICAgVkVSU18xLjIKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChWRVJTXzEuMVwpICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP2ZvbwotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18xLjIgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjMxNTE2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnN5bQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBmb29AVkVSU18xLjIKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vQAotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb29AVkVSU18xLjEKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vQEBWRVJTXzEuMgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzNiYTcyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDA0ZDhhMjY5IHRtcGRpci92ZXJzOQotMiAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKLTMgMHgwMCAweDBhNzkyN2IyIFZFUlNfMS4yCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9lbXBpYy5leHAgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvZW1waWMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDUyOGJlLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9lbXBpYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBsZC1lbXBpYyB0ZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5NCwxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciAoaWFuQGN5Z251cy5jb20pCi0jCi0KLSMgVGVzdCB0aGUgaGFuZGxpbmcgb2YgTUlQUyBlbWJlZGRlZCBQSUMgY29kZS4gIFRoaXMgdGVzdCBlc3NlbnRpYWxseQotIyB0ZXN0cyB0aGUgY29tcGlsZXIgYW5kIGFzc2VtYmxlciBhcyB3ZWxsIGFzIHRoZSBsaW5rZXIsIHNpbmNlIE1JUFMKLSMgZW1iZWRkZWQgUElDIGlzIGEgR05VIGVuaGFuY2VtZW50IHRvIHN0YW5kYXJkIE1JUFMgdG9vbHMuCi0KLSMgRW1iZWRkZWQgUElDIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBNSVBTIEVDT0ZGIHRhcmdldHMuCi1pZiAhW2lzdGFyZ2V0IG1pcHMqLSotZWNvZmYqXSB7Ci0gICAgcmV0dXJuCi19Ci0KLXNldCB0ZXN0bmFtZSByZWxheAotCi1pZiB7IFt3aGljaCAkQ0NdID09IDAgfSB7Ci0gICAgdW50ZXN0ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLSMgVGVzdCB0aGF0IHJlbGF4YXRpb24gd29ya3MgY29ycmVjdGx5LiAgVGhpcyB0ZXN0c3VpdGUgd2FzIGNvbXBvc2VkCi0jIChieSBleHBlcmltZW50YXRpb24pIHRvIGZvcmNlIHRoZSBsaW5rZXIgdG8gcmVsYXggdHdpY2UtLXRoYXQgaXMsCi0jIHRoZSBmaXJzdCByZWxheGF0aW9uIHBhc3Mgd2lsbCBmb3JjZSBhbm90aGVyIGNhbGwgdG8gYmUgb3V0IG9mCi0jIHJhbmdlLCByZXF1aXJpbmcgYSBzZWNvbmQgcmVsYXhhdGlvbiBwYXNzLgotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTIC1tZW1iZWRkZWQtcGljIiAkc3JjZGlyLyRzdWJkaXIvcmVsYXgxLmMgdG1wZGlyL3JlbGF4MS5vXQotICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTIC1tZW1iZWRkZWQtcGljIiAkc3JjZGlyLyRzdWJkaXIvcmVsYXgyLmMgdG1wZGlyL3JlbGF4Mi5vXQotICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTIC1tZW1iZWRkZWQtcGljIiAkc3JjZGlyLyRzdWJkaXIvcmVsYXgzLmMgdG1wZGlyL3JlbGF4My5vXQotICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTIC1tZW1iZWRkZWQtcGljIiAkc3JjZGlyLyRzdWJkaXIvcmVsYXg0LmMgdG1wZGlyL3JlbGF4NC5vXSB9IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvcmVsYXggIi0tcmVsYXggLVQgJHNyY2Rpci8kc3ViZGlyL3JlbGF4LnQgdG1wZGlyL3JlbGF4MS5vIHRtcGRpci9yZWxheDIubyB0bXBkaXIvcmVsYXgzLm8gdG1wZGlyL3JlbGF4NC5vIl0gewotICAgIGZhaWwgJHRlc3RuYW1lCi19IGVsc2UgewotICAgICMgQ2hlY2sgdGhhdCB0aGUgcmVsYXhhdGlvbiBwcm9kdWNlZCB0aGUgY29ycmVjdCByZXN1bHQuICBDaGVjawotICAgICMgZWFjaCBiYWwgaW5zdHJ1Y3Rpb24uICBTb21lIHdpbGwgZ28gZGlyZWN0bHkgdG8gdGhlIHN0YXJ0IG9mIGEKLSAgICAjIGZ1bmN0aW9uLCB3aGljaCBpcyBPSy4gIFNvbWUgd2lsbCBmb3JtIHBhcnQgb2YgdGhlIGZpdmUKLSAgICAjIGluc3RydWN0aW9uIGV4cGFuZGVkIGNhbGwgc2VxdWVuY2UsIGluIHdoaWNoIGNhc2Ugd2UgY29tcHV0ZSB0aGUKLSAgICAjIHJlYWwgZGVzdGluYXRpb24gYW5kIG1ha2Ugc3VyZSBpdCBpcyB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbi4KLSAgICAjIFNvbWUgYmFsIGluc3RydWN0aW9ucyBhcmUgdXNlZCB0byBsb2NhdGUgdGhlIHN0YXJ0IG9mIHRoZQotICAgICMgZnVuY3Rpb24gaW4gb3JkZXIgdG8gZG8gcG9zaXRpb24gaW5kZXBlbmRlbnQgYWRkcmVzc2luZyBpbnRvIHRoZQotICAgICMgdGV4dCBzZWN0aW9uLCBpbiB3aGljaCBjYXNlIHdlIGp1c3QgY2hlY2sgdGhhdCBpdCBjb3JyZWN0bHkKLSAgICAjIGNvbXB1dGVzIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uCi0KLSAgICAjIEdldCB0aGUgc3ltYm9sIHRhYmxlLgotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci9yZWxheF0gewotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgIyBHZXQgYSBkaXNhc3NlbWJseS4KLSAgICBzZW5kX2xvZyAiJG9iamR1bXAgLWQgdG1wZGlyL3JlbGF4ID50bXBkaXIvcmVsYXguZGlzXG4iCi0gICAgdmVyYm9zZSAiJG9iamR1bXAgLWQgdG1wZGlyL3JlbGF4ID50bXBkaXIvcmVsYXguZGlzIgotICAgIGNhdGNoICJleGVjICRvYmpkdW1wIC1kIHRtcGRpci9yZWxheCA+dG1wZGlyL3JlbGF4LmRpcyIgZXhlY19vdXRwdXQKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAkZXhlY19vdXRwdXQKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHNldCBiYWxjbnQgMAotICAgIHNldCBmaWxlIFtvcGVuIHRtcGRpci9yZWxheC5kaXMgcl0KLSAgICB3aGlsZSB7IFtnZXRzICRmaWxlIGxpbmVdICE9IC0xIH0gewotCXZlcmJvc2UgIiRsaW5lIiAyCi0KLQlpZiAhW3N0cmluZyBtYXRjaCAiKmJhbCoiICRsaW5lXSB7Ci0JICAgIGNvbnRpbnVlCi0JfQotCi0JdmVyYm9zZSAiJGxpbmUiCi0KLQlpbmNyIGJhbGNudAotCi0JaWYgIVtyZWdleHAgIl4oXFswLTlhLWZBLUZcXSspICg8XFthLXorMC05QS1aLlxdKz4pPyBiYWwgKFxbMC05YS1mQS1GXF0rKSIgJGxpbmUgd2hvbGUgYWRkciBsYWJlbCBkZXN0XSB7Ci0JICAgIHBlcnJvciAidW5yZWNvZ25pemVkIGZvcm1hdCBmb3IgJGxpbmUiCi0JICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0JICAgIHJldHVybgotCX0KLQotCWlmICIweCRhZGRyICsgOCAhPSAweCRkZXN0IiB7Ci0JICAgICMgVGhpcyBpcyBhIHN0cmFpZ2h0IGZ1bmN0aW9uIGNhbGwuICBBbGwgZnVuY3Rpb24gY2FsbHMgaW4KLQkgICAgIyB0aGlzIGV4YW1wbGUgYXJlIHRvIGVpdGhlciBmb28gb3IgYmFyLgotCSAgICBpZiAiMHgkZGVzdCAhPSAkbm1fb3V0cHV0KGZvbykgJiYgMHgkZGVzdCAhPSAkbm1fb3V0cHV0KGJhcikiIHsKLQkJc2VuZF9sb2cgImZhaWwgMVxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQl9IGVsc2UgewotCSAgICAjIFBpY2sgdXAgdGhlIG5leHQgbGluZS4gIElmIGl0IGlzIHNsbCwgdGhpcyBpcyBhIHN3aXRjaAotCSAgICAjIHByb2xvZ3VlLCBhbmQgdGhlcmUgaXMgbm90IG11Y2ggd2UgY2FuIGRvIHRvIHRlc3QgaXQuCi0JICAgICMgT3RoZXJ3aXNlLCBpdCBzaG91bGQgYmUgbHVpLCBhbmQgdGhlIG5leHQgaW5zdHJ1Y3Rpb24KLQkgICAgIyBzaG91bGQgYmUgYW4gYWRkaXUsIGZvbGxvd2VkIGJ5IGFuIGFkZHUgdG8gJDMxLgotCSAgICBpZiB7IFtnZXRzICRmaWxlIGxdID09IC0xIH0gewotCQlzZW5kX2xvZyAiZmFpbCAyXG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCSAgICB2ZXJib3NlICRsCi0KLQkgICAgaWYgW3N0cmluZyBtYXRjaCAiKnNsbCoiICRsXSB7Ci0JCWNvbnRpbnVlCi0JICAgIH0KLQkgICAgaWYgIVtyZWdleHAgImx1aSAoXFtcJGEtejAtOVxdKyksKFxbMC05YS1mQS1GeFxdKykiICRsIHdob2xlIHJlZyB1cHBlcl0gewotCQlzZW5kX2xvZyAiZmFpbCAzXG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlzZW5kX2xvZyAiJGxcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQotCSAgICBpZiB7IFtnZXRzICRmaWxlIGxdID09IC0xIH0gewotCQlzZW5kX2xvZyAiZmFpbCA0XG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCSAgICB2ZXJib3NlICIkbCIKLQkgICAgaWYgIVtyZWdleHAgImFkZGl1IFxcJHJlZyxcXCRyZWcsKFxbLTAtOVxdKykiICRsIHdob2xlIGxvd2VyXSB7Ci0JCXNlbmRfbG9nICJmYWlsIDVcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCXNlbmRfbG9nICIkbFxuIgotCQlzZW5kX2xvZyAiYWRkaXUgXFwkcmVnLFxcJHJlZywoXFstMC05XF0rKVxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCi0JICAgIGlmIHsgW2dldHMgJGZpbGUgbF0gPT0gLTEgfSB7Ci0JCXNlbmRfbG9nICJmYWlsIDZcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0JICAgIHZlcmJvc2UgIiRsIgotCSAgICBpZiAhW3JlZ2V4cCAiYWRkdSBcXCRyZWcsXFwkcmVnLFxcXCRyYSIgJGxdIHsKLQkJc2VuZF9sb2cgImZhaWwgN1xuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJc2VuZF9sb2cgIiRsXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0KLQkgICAgIyBUaGUgbmV4dCBsaW5lIHdpbGwgYmUgamFsciBpbiB0aGUgY2FzZSBvZiBhbiBleHBhbmRlZAotCSAgICAjIGNhbGwuICBPdGhlcndpc2UsIHRoZSBjb2RlIGlzIGdldHRpbmcgdGhlIHN0YXJ0IG9mIHRoZQotCSAgICAjIGZ1bmN0aW9uLCBhbmQgdGhlIG5leHQgbGluZSBjYW4gYmUgYW55dGhpbmcuCi0KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZSBsXSA9PSAtMSB9IHsKLQkJc2VuZF9sb2cgImZhaWwgOFxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQkgICAgdmVyYm9zZSAiJGwiCQotCSAgICBpZiBbc3RyaW5nIG1hdGNoICIqamFscioiICRsXSB7Ci0JCXNldCBkZXN0IFtleHByIDB4JGFkZHIgKyA4ICsgKCR1cHBlciA8PCAxNikgKyAkbG93ZXJdCi0JCWlmIHsgJGRlc3QgIT0gJG5tX291dHB1dChmb28pICYmICRkZXN0ICE9ICRubV9vdXRwdXQoYmFyKSB9IHsKLQkJICAgIHNlbmRfbG9nICJmYWlsIDlcbiIKLQkJICAgIHNlbmRfbG9nICIkbGluZVxuIgotCQkgICAgZmFpbCAkdGVzdG5hbWUKLQkJICAgIHJldHVybgotCQl9Ci0JICAgIH0gZWxzZSB7Ci0JCXNldCBkZXN0IFtleHByICgkdXBwZXIgPDwgMTYpICsgJGxvd2VyXQotCQlpZiAhW3JlZ2V4cCAiPChcWy5hLXpcXSspXFwrKFxbMC05YS1mQS1GXF0rKT4iICRsYWJlbCB3aG9sZSBiYXNlIG9mZnNldF0gewotCQkgICAgc2VuZF9sb2cgImZhaWwgMTBcbiIKLQkJICAgIHNlbmRfbG9nICIkbGluZVxuIgotCQkgICAgZmFpbCAkdGVzdG5hbWUKLQkJICAgIHJldHVybgotCQl9Ci0JCXNldCBvZmZzZXQgMHgkb2Zmc2V0Ci0JCWlmIHsgJGJhc2UgPT0gIi5mb28iIH0gewotCQkgICAgc2V0IG9mZnNldCBbZXhwciAkb2Zmc2V0IC0gKCRubV9vdXRwdXQoZm9vKSAtIDB4MzApXQotCQl9Ci0JCWlmIHsgJG9mZnNldCArIDggIT0gLSAkZGVzdCB9IHsKLQkJICAgIHNlbmRfbG9nICJmYWlsIDExXG4iCi0JCSAgICBzZW5kX2xvZyAiJGxpbmVcbiIKLQkJICAgIGZhaWwgJHRlc3RuYW1lCi0JCSAgICByZXR1cm4KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGNsb3NlICRmaWxlCi0KLSAgICBpZiB7JGJhbGNudCA8IDEwfSB7Ci0Jc2VuZF9sb2cgImZhaWwgMTJcbiIKLQlmYWlsICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAiJGJhbGNudCBiYWwgaW5zdHJ1Y3Rpb25zIgotCXBhc3MgJHRlc3RuYW1lCi0gICAgfQotfQotCi0jIFdlIG5vdyB0ZXN0IGFjdHVhbGx5IHJ1bm5pbmcgZW1iZWRkZWQgTUlQUyBQSUMgY29kZS4gIFRoaXMgY2FuIG9ubHkKLSMgYmUgZG9uZSBvbiBhIE1JUFMgaG9zdCB3aXRoIHRoZSBzYW1lIGVuZGlhbm5lc3MgYXMgb3VyIHRhcmdldC4KLWlmIFtpc3RhcmdldCBtaXBzZWwtKi0qXSB7Ci0gICAgaWYgIVtpc2hvc3QgbWlwcyotKi11bHRyaXgqXSB7Ci0JcmV0dXJuCi0gICAgfQotfSBlbHNlIHsKLSAgICBpZiAhW2lzaG9zdCBtaXBzKi0qLWlyaXgqXSB7Ci0JcmV0dXJuCi0gICAgfQotfQotCi1zZXQgdGVzdG5hbWUgInJ1biBlbWJlZGRlZCBQSUMgY29kZSIKLQotIyBDb21waWxlIHRoZSBwcm9ncmFtIHdoaWNoIHdpbGwgcnVuIHRoZSB0ZXN0LiAgVGhpcyBjb2RlIG11c3QgYmUKLSMgY29tcGlsZWQgZm9yIHRoZSBob3N0LCBub3QgdGhlIHRhcmdldC4KLXNlbmRfbG9nICIkQ0NfRk9SX0hPU1QgJENGTEFHU19GT1JfSE9TVCAtbyB0bXBkaXIvcnVuICRzcmNkaXIvJHN1YmRpci9ydW4uY1xuIgotdmVyYm9zZSAiJENDX0ZPUl9IT1NUICRDRkxBR1NfRk9SX0hPU1QgLW8gdG1wZGlyL3J1biAkc3JjZGlyLyRzdWJkaXIvcnVuLmMiCi1jYXRjaCAiZXhlYyAkQ0NfRk9SX0hPU1QgJENGTEFHU19GT1JfSE9TVCAtbyB0bXBkaXIvcnVuICRzcmNkaXIvJHN1YmRpci9ydW4uYyIgZXhlY19vdXRwdXQKLWlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotICAgIHNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLSAgICB2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotIyBDb21waWxlIGFuZCBsaW5rIHRoZSB0ZXN0LgotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTIC1tZW1iZWRkZWQtcGljIiAkc3JjZGlyLyRzdWJkaXIvcnVudGVzdGkucyB0bXBkaXIvcnVudGVzdGkub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3J1bnRlc3QxLmMgdG1wZGlyL3J1bnRlc3QxLm9dCi0gICAgIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9ydW50ZXN0Mi5jIHRtcGRpci9ydW50ZXN0Mi5vXSB9IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3J1bnRlc3QgIi0tZW1iZWRkZWQtcmVsb2NzIHRtcGRpci9ydW50ZXN0aS5vIHRtcGRpci9ydW50ZXN0MS5vIHRtcGRpci9ydW50ZXN0Mi5vIl0gewotICAgIGZhaWwgJHRlc3RuYW1lCi19IGVsc2UgewotICAgICMgTm93IHJ1biB0aGUgdGVzdC4KLSAgICBzZW5kX2xvZyAidG1wZGlyL3J1biB0bXBkaXIvcnVudGVzdFxuIgotICAgIHZlcmJvc2UgInRtcGRpci9ydW4gdG1wZGlyL3J1bnRlc3QiCi0gICAgY2F0Y2ggImV4ZWMgdG1wZGlyL3J1biB0bXBkaXIvcnVudGVzdCIgZXhlY19vdXRwdXQKLSAgICBpZiBbc3RyaW5nIG1hdGNoICIqcmFuIGFuZCByZXR1cm5lZCAwKiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQlwYXNzICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQlmYWlsICR0ZXN0bmFtZQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheC50IGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4LnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMThiNjkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4LnQKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1PVVRQVVRfRk9STUFUKCJlY29mZi1iaWdtaXBzIikKLVNFQ1RJT05TCi17Ci0gIC5mb28gMHgzMCA6IHsKLSAgICB0bXBkaXIvcmVsYXgzLm8oLnRleHQpCi0gICAgdG1wZGlyL3JlbGF4MS5vKC50ZXh0KQotICB9Ci0gIC50ZXh0ICAweDIwMDAwIDogewotICAgICBfZnRleHQgPSAuIDsKLSAgICAqKC5pbml0KQotICAgICBlcHJvbCAgPSAgLjsKLSAgICB0bXBkaXIvcmVsYXg0Lm8oLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maW5pKQotICAgICBldGV4dCAgPSAgLjsKLSAgICAgX2V0ZXh0ICA9ICAuOwotICB9Ci0gIC5yZGF0YSAgLiA6IHsKLSAgICAqKC5yZGF0YSkKLSAgfQotICAgX2ZkYXRhID0gLjsKLSAgLmRhdGEgIC4gOiB7Ci0gICAgKiguZGF0YSkKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICAgX2dwID0gLiArIDB4ODAwMDsKLSAgLmxpdDggIC4gOiB7Ci0gICAgKigubGl0OCkKLSAgfQotICAubGl0NCAgLiA6IHsKLSAgICAqKC5saXQ0KQotICB9Ci0gIC5zZGF0YSAgLiA6IHsKLSAgICAqKC5zZGF0YSkKLSAgfQotICAgZWRhdGEgID0gIC47Ci0gICBfZWRhdGEgID0gIC47Ci0gICBfZmJzcyA9IC47Ci0gIC5zYnNzICAuIDogewotICAgICooLnNic3MpCi0gICAgKiguc2NvbW1vbikKLSAgfQotICAuYnNzICAuIDogewotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgfQotICAgZW5kID0gLjsKLSAgIF9lbmQgPSAuOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4MS5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4MS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGVjMzllLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDEuYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIEZpcnN0IHNvdXJjZSBmaWxlIGluIHJlbGF4YXRpb24gdGVzdC4gICovCi0KLWV4dGVybiBpbnQgYmFyICgpOwotc3RhdGljIGludCBmb28yICgpOwotCi1pbnQgZm9vIChpbnQgaSkKLXsKLSAgc3dpdGNoIChpKQotICAgIHsKLSAgICBjYXNlIDA6IGJhciAoMCk7IGJyZWFrOwotICAgIGNhc2UgMTogYmFyICgxKTsgYnJlYWs7Ci0gICAgY2FzZSAyOiBiYXIgKDIpOyBicmVhazsKLSAgICBjYXNlIDM6IGJhciAoMyk7IGJyZWFrOwotICAgIGNhc2UgNDogYmFyIChmb28yKTsgYnJlYWs7Ci0gICAgY2FzZSA1OiBiYXIgKGJhcik7IGJyZWFrOwotICAgIH0KLSAgd2hpbGUgKDEpCi0gICAgaWYgKGkpCi0gICAgICByZXR1cm4gYmFyICgpOwotfQotCi1zdGF0aWMgaW50IGZvbzIgKCkgeyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgyLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ODU0YTAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyogU2Vjb25kIHNvdXJjZSBmaWxlIGluIHJlbGF4YXRpb24gdGVzdC4gICovCi0KLWludCBiYXIyICgpCi17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykKLSAgICBmb28gKCk7Ci0gIHJldHVybiBmb28gKCkgKyBmb28gKCkgKyBmb28gKCkgKyBmb28gKCk7Ci19Ci0KLWludCBiYXIgKGludCBpKQotewotICB3aGlsZSAoMSkKLSAgICBpZiAoaSkKLSAgICAgIHJldHVybiBmb28gKCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZvbyAoKTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDMuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFhYTUzMi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLS8qIFRoaXJkIHNvdXJjZSBmaWxlIGluIHJlbGF4YXRpb24gdGVzdC4gICovCi0KLWludCBxdXV4ICgpIHsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDQuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjZmIwNS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXg0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLS8qIEZvdXJ0aCBzb3VyY2UgZmlsZSBpbiByZWxheGF0aW9uIHRlc3QuICAqLwotCi1pbnQgeHl6enkgKCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTAzNzdlLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKiBMb2FkIGFuZCBydW4gYSBNSVBTIHBvc2l0aW9uIGluZGVwZW5kZW50IEVDT0ZGIGZpbGUuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotICAgUHVibGljIGRvbWFpbi4gICovCi0KLS8qIFRoaXMgcHJvZ3JhbSB3aWxsIGxvYWQgYW4gRUNPRkYgZmlsZSBpbnRvIG1lbW9yeSBhbmQgZXhlY3V0ZSBpdC4KLSAgIFRoZSBmaWxlIG11c3QgaGF2ZSBiZWVuIGNvbXBpbGVkIHVzaW5nIHRoZSBHTlUgLW1lbWJlZGRlZC1waWMKLSAgIHN3aXRjaCB0byBwcm9kdWNlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUuICBUaGlzIHdpbGwgb25seSB3b3JrCi0gICBpZiB0aGlzIHByb2dyYW0gaXMgcnVuIG9uIGEgTUlQUyBzeXN0ZW0gd2l0aCB0aGUgc2FtZSBlbmRpYW5uZXNzIGFzCi0gICB0aGUgRUNPRkYgZmlsZS4gIFRoZSBFQ09GRiBmaWxlIG11c3QgYmUgY29tcGxldGUuICBTeXN0ZW0gY2FsbHMgbWF5Ci0gICBub3Qgd29yayBjb3JyZWN0bHkuCi0KLSAgIFRoZXJlIGFyZSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgZmlsZSAodGhleSBjb3VsZCBiZSByZW1vdmVkCi0gICBieSBkb2luZyBzb21lIGFkZGl0aW9uYWwgcHJvZ3JhbW1pbmcpLiAgVGhlIGZpbGUgbXVzdCBiZSBhbGlnbmVkCi0gICBzdWNoIHRoYXQgaXQgZG9lcyBub3QgcmVxdWlyZSBhbnkgZ2FwcyBpbnRyb2R1Y2VkIGluIHRoZSBkYXRhCi0gICBzZWdtZW50OyB0aGUgR05VIGxpbmtlciBwcm9kdWNlcyBzdWNoIGZpbGVzIGJ5IGRlZmF1bHQuICBIb3dldmVyLAotICAgdGhlIGZpbGUgbXVzdCBub3QgYXNzdW1lIHRoYXQgdGhlIHRleHQgb3IgZGF0YSBzZWdtZW50IGlzIGFsaWduZWQKLSAgIG9uIGEgcGFnZSBib3VuZGFyeS4gIFRoZSBzdGFydCBhZGRyZXNzIG11c3QgYmUgYXQgdGhlIHN0YXJ0IG9mIHRoZQotICAgdGV4dCBzZWdtZW50LgotCi0gICBUaGUgRUNPRkYgZmlsZSBpcyBydW4gYnkgY2FsbGluZyBpdCBhcyB0aG91Z2ggaXQgd2VyZSBhIGZ1bmN0aW9uLgotICAgVGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudCBpcyBwYXNzZWQgYXMgdGhlIG9ubHkgYXJndW1lbnQuCi0gICBUaGUgZmlsZSBpcyBleHBlY3RlZCB0byByZXR1cm4gYW4gaW50ZWdlciB2YWx1ZSwgd2hpY2ggd2lsbCBiZQotICAgcHJpbnRlZC4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLS8qIFN0cnVjdHVyZXMgdXNlZCBpbiBFQ09GRiBmaWxlcy4gIFdlIGFzc3VtZSB0aGF0IGEgc2hvcnQgaXMgdHdvCi0gICBieXRlcyBhbmQgYW4gaW50IGlzIGZvdXIgYnl0ZXMuICBUaGlzIGlzIG5vdCBtdWNoIG9mIGFuIGFzc3VtcHRpb24sCi0gICBzaW5jZSB3ZSBhbHJlYWR5IGFzc3VtZSB0aGF0IHdlIGFyZSBydW5uaW5nIG9uIGEgTUlQUyBob3N0IHdpdGggdGhlCi0gICBzYW1lIGVuZGlhbm5lc3MgYXMgdGhlIGZpbGUgd2UgYXJlIGV4YW1pbmluZy4gICovCi0KLXN0cnVjdCBlY29mZl9maWxlaGRyIHsKLSAgdW5zaWduZWQgc2hvcnQgZl9tYWdpYzsJLyogbWFnaWMgbnVtYmVyICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBzaG9ydCBmX25zY25zOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBmX3RpbWRhdDsJLyogdGltZSAmIGRhdGUgc3RhbXAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZl9zeW1wdHI7CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGZfbnN5bXM7CQkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMgICAgICovCi0gIHVuc2lnbmVkIHNob3J0IGZfb3B0aGRyOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKSAgICAgICAgICovCi0gIHVuc2lnbmVkIHNob3J0IGZfZmxhZ3M7CS8qIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLXN0cnVjdCBlY29mZl9hb3V0aGRyCi17Ci0gIHVuc2lnbmVkIHNob3J0IG1hZ2ljOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIHVuc2lnbmVkIHNob3J0IHZzdGFtcDsJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIHVuc2lnbmVkIGludCB0c2l6ZTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICB1bnNpZ25lZCBpbnQgZHNpemU7CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIHVuc2lnbmVkIGludCBic2l6ZTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgdW5zaWduZWQgaW50IGVudHJ5OwkJLyogZW50cnkgcHQuCQkJCSovCi0gIHVuc2lnbmVkIGludCB0ZXh0X3N0YXJ0OwkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGludCBkYXRhX3N0YXJ0OwkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGludCBic3Nfc3RhcnQ7CS8qIGJhc2Ugb2YgYnNzIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBpbnQgZ3BybWFzazsJCS8qID8/ICovCi0gIHVuc2lnbmVkIGludCBjcHJtYXNrWzRdOwkvKiA/PyAqLwotICB1bnNpZ25lZCBpbnQgZ3BfdmFsdWU7CS8qIHZhbHVlIGZvciBncCByZWdpc3RlciAqLwotfTsKLQotI2RlZmluZSBFQ09GRl9TQ05IRFJfU0laRSAoNDApCi0KLXN0YXRpYyB2b2lkCi1kaWUgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHBlcnJvciAocyk7Ci0gIGV4aXQgKDEpOwotfQotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgRklMRSAqZjsKLSAgc3RydWN0IHN0YXQgczsKLSAgY2hhciAqejsKLSAgc3RydWN0IGVjb2ZmX2ZpbGVoZHIgKmZoOwotICBzdHJ1Y3QgZWNvZmZfYW91dGhkciAqYWg7Ci0gIHVuc2lnbmVkIGludCB0b2ZmOwotICBjaGFyICp0LCAqZDsKLSAgaW50ICgqcGZuKSAoKTsKLSAgaW50IHJldDsKLQotICBpZiAoYXJnYyAhPSAyKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiAlcyBmaWxlXG4iLCBhcmd2WzBdKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBmID0gZm9wZW4gKGFyZ3ZbMV0sICJyIik7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgZGllIChhcmd2WzFdKTsKLQotICBpZiAoc3RhdCAoYXJndlsxXSwgJnMpIDwgMCkKLSAgICBkaWUgKCJzdGF0Iik7Ci0KLSAgeiA9IChjaGFyICopIG1hbGxvYyAocy5zdF9zaXplKTsKLSAgaWYgKHogPT0gTlVMTCkKLSAgICBkaWUgKCJtYWxsb2MiKTsKLQotICBpZiAoZnJlYWQgKHosIDEsIHMuc3Rfc2l6ZSwgZikgIT0gcy5zdF9zaXplKQotICAgIGRpZSAoImZyZWFkIik7Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWdtZW50LCB3aGljaCBpcyB0aGUKLSAgICAgbG9jYXRpb24gd2UgYXJlIGdvaW5nIHRvIGNhbGwsIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCwKLSAgICAgd2hpY2ggd2UgYXJlIGdvaW5nIHRvIHBhc3MgYXMgYW4gYXJndW1lbnQuICBXZSBhbHNvIG5lZWQgdGhlIHNpemUKLSAgICAgYW5kIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGJzcyBzZWdtZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBhbGwgaW4KLSAgICAgdGhlIEVDT0ZGIGEub3V0IGhlYWRlci4gICovCi0KLSAgZmggPSAoc3RydWN0IGVjb2ZmX2ZpbGVoZHIgKikgejsKLSAgaWYgKGZoLT5mX29wdGhkciAhPSBzaXplb2YgKHN0cnVjdCBlY29mZl9hb3V0aGRyKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogdW5leHBlY3RlZCBvcHRoZHIgc2l6ZTogaXMgJXUsIHdhbnQgJXVcbiIsCi0JICAgICAgIGFyZ3ZbMV0sICh1bnNpZ25lZCBpbnQpIGZoLT5mX29wdGhkciwKLQkgICAgICAgKHVuc2lnbmVkIGludCkgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfYW91dGhkcikpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGFoID0gKHN0cnVjdCBlY29mZl9hb3V0aGRyICopICh6ICsgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfZmlsZWhkcikpOwotICBpZiAoYWgtPm1hZ2ljICE9IDA0MTMpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGJhZCBhb3V0aGRyIG1hZ2ljIG51bWJlciAwJW8gKHdhbnQgMDQxMylcbiIsCi0JICAgICAgIGFyZ3ZbMV0sICh1bnNpZ25lZCBpbnQpIGFoLT5tYWdpYyk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgLyogV2Ugc2hvdWxkIGNsZWFyIHRoZSBic3Mgc2VnbWVudCBhdCB0aGlzIHBvaW50LiAgVGhpcyBpcyB0aGUKLSAgICAgYWgtPmJzaXplIGJ5dGVzIHN0YXJ0aW5nIGF0IGFoLT5ic3Nfc3RhcnQsIFRvIGRvIHRoaXMgY29ycmVjdGx5LAotICAgICB3ZSB3b3VsZCBoYXZlIHRvIG1ha2Ugc3VyZSBvdXIgbWVtb3J5IGJsb2NrIGlzIGxhcmdlIGVub3VnaC4gIEl0Ci0gICAgIHNvIGhhcHBlbnMgdGhhdCBvdXIgdGVzdCBjYXNlIGRvZXMgbm90IGhhdmUgYW55IGFkZGl0aW9uYWwgcGFnZXMKLSAgICAgZm9yIHRoZSBic3Mgc2VnbWVudC0taXQgaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgZGF0YSBzZWdtZW50LgotICAgICBTbywgd2UgZG9uJ3QgYm90aGVyLiAgKi8KLSAgaWYgKGFoLT5ic2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgICAgIiVzOiBic3Mgc2VnbWVudCBpcyAldSBieXRlczsgbm9uLXplcm8gc2l6ZXMgbm90IHN1cHBvcnRlZFxuIiwKLQkgICAgICAgYXJndlsxXSwgYWgtPmJzaXplKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBUaGUgdGV4dCBzZWN0aW9uIHN0YXJ0cyBqdXN0IGFmdGVyIGFsbCB0aGUgaGVhZGVycywgcm91bmRlZCB0byBhCi0gICAgIDE2IGJ5dGUgYm91bmRhcnkuICAqLwotICB0b2ZmID0gKHNpemVvZiAoc3RydWN0IGVjb2ZmX2ZpbGVoZHIpICsgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfYW91dGhkcikKLQkgICsgZmgtPmZfbnNjbnMgKiBFQ09GRl9TQ05IRFJfU0laRSk7Ci0gIHRvZmYgKz0gMTU7Ci0gIHRvZmYgJj1+IDE1OwotICB0ID0geiArIHRvZmY7Ci0KLSAgLyogVGhlIHRzaXplIGZpZWxkIGdpdmVzIHVzIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWdtZW50LiAgKi8KLSAgZCA9IHogKyBhaC0+dHNpemU7Ci0KLSAgLyogQ2FsbCB0aGUgY29kZSBhcyBhIGZ1bmN0aW9uLiAgKi8KLSAgcGZuID0gKGludCAoKikgKCkpIHQ7Ci0gIHJldCA9ICgqcGZuKSAoZCk7Ci0KLSAgcHJpbnRmICgiJXMgcmFuIGFuZCByZXR1cm5lZCAlZFxuIiwgYXJndlsxXSwgcmV0KTsKLQotICBleGl0ICgwKTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0MS5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YWI2ZWIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyogRmlyc3QgQyBzb3VyY2UgZmlsZSBmb3IgYWN0dWFsIGV4ZWN1dGlvbiB0ZXN0LiAgKi8KLQotLyogVGhlIG1haW4gcG9pbnQgb2YgdGhpcyB0ZXN0IGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb2RlIGFuZCBkYXRhCi0gICBhcmUgdHJ1bHkgcG9zaXRpb24gaW5kZXBlbmRlbnQuICBXZSBzdGF0aWNhbGx5IGluaXRpYWxpemUgc2V2ZXJhbAotICAgZ2xvYmFsIHZhcmlhYmxlcywgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZXkgYXJlIGNvcnJlY3RseSBhZGp1c3RlZCBhdAotICAgcnVudGltZS4gICovCi0KLWludCBpID0gMTsKLWludCBqID0gMDsKLWV4dGVybiBpbnQgazsKLWludCBsOwotY2hhciBzbWFsbF9idWZbXSA9ICJhYWFhIjsKLWNoYXIgKnNtYWxsX3BvaW50ZXIgPSBzbWFsbF9idWY7Ci1jaGFyIGJpZ19idWZbXSA9ICJhYWFhYWFhYWFhYWFhYWFhIjsKLWNoYXIgKmJpZ19wb2ludGVyID0gYmlnX2J1ZjsKLQotZXh0ZXJuIGludCBiYXIgKCk7Ci1pbnQgKCpwYmFyKSAoKSA9IGJhcjsKLQotc3RhdGljIGludAotZm9vMiAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBsID0gYXJnOwotICByZXR1cm4gaSArIGo7Ci19Ci0KLWludCAoKnBmb28yKSAoKSA9IGZvbzI7Ci0KLWludAotY2hrc3RyICh6LCBjKQotICAgICBjaGFyICp6OwotICAgICBpbnQgYzsKLXsKLSAgLyogU3dpdGNoIHN0YXRlbWVudHMgbmVlZCBleHRyYSBlZmZvcnQgdG8gYmUgcG9zaXRpb24gaW5kZXBlbmRlbnQsCi0gICAgIHNvIHdlIHJ1biBvbmUgaGVyZSwgZXZlbiB0aG91Z2ggbW9zdCBvZiB0aGUgY2FzZXMgd2lsbCBuZXZlciBiZQotICAgICB0YWtlbi4gICovCi0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDM6Ci0gICAgICByZXR1cm4gaSAtIDE7Ci0gICAgY2FzZSA0OgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgIGNhc2UgNjoKLSAgICBjYXNlIDc6Ci0gICAgY2FzZSA4OgotICAgIGNhc2UgOToKLSAgICAgIHJldHVybiBpICogajsKLSAgICBjYXNlIDEwOgotICAgIGNhc2UgMTE6Ci0gICAgY2FzZSAxMjoKLSAgICBjYXNlIDEzOgotICAgIGNhc2UgMTQ6Ci0gICAgY2FzZSAxNToKLSAgICAgIHJldHVybiBqOwotICAgIGNhc2UgMTY6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHdoaWxlIChjLS0gIT0gMCkKLSAgICBpZiAoKnorKyAhPSAnYScpCi0gICAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKnogPT0gJ1wwJzsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGFzc2VtYmxlciBzdGFydHVwIHJvdXRpbmUuICBJdCB0cmllcwotICAgdG8gdGVzdCB0aGF0IGV2ZXJ5dGhpbmcgd2FzIGNvcnJlY3RseSBpbml0aWFsaXplZC4gIEl0IHJldHVybnMgMCBvbgotICAgc3VjY2Vzcywgc29tZXRoaW5nIGVsc2Ugb24gZmFpbHVyZS4gICovCi0KLWludAotZm9vICgpCi17Ci0gIGlmIChpICE9IDEpCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChqICE9IDApCi0gICAgcmV0dXJuIDI7Ci0gIGlmICghIGNoa3N0ciAoc21hbGxfYnVmLCA0KSkKLSAgICByZXR1cm4gMzsKLSAgaWYgKCEgY2hrc3RyIChzbWFsbF9wb2ludGVyLCA0KSkKLSAgICByZXR1cm4gNDsKLSAgaWYgKCEgY2hrc3RyIChiaWdfYnVmLCAxNikpCi0gICAgcmV0dXJuIDU7Ci0gIGlmICghIGNoa3N0ciAoYmlnX3BvaW50ZXIsIDE2KSkKLSAgICByZXR1cm4gNjsKLQotICBpZiAobCAhPSAwKQotICAgIHJldHVybiA3OwotICBpZiAoZm9vMiAoMSkgIT0gMSkKLSAgICByZXR1cm4gODsKLSAgaWYgKGwgIT0gMSkKLSAgICByZXR1cm4gOTsKLSAgaWYgKCgqcGZvbzIpICgyKSAhPSAxKQotICAgIHJldHVybiAxMDsKLSAgaWYgKGwgIT0gMikKLSAgICByZXR1cm4gMTE7Ci0KLSAgaWYgKGJhciAoMSkgIT0gMCkKLSAgICByZXR1cm4gMTI7Ci0gIGlmIChiYXIgKC0xKSAhPSAxKQotICAgIHJldHVybiAxMzsKLSAgaWYgKCgqcGJhcikgKDB4YTVhNWE1YTUpICE9IC0xKQotICAgIHJldHVybiAxNDsKLSAgaWYgKGsgIT0gMHhhNWE1YTVhNSkKLSAgICByZXR1cm4gMTU7Ci0gIGlmICgoKnBiYXIpICgwKSAhPSAweGE1YTVhNWE1KQotICAgIHJldHVybiAxNjsKLSAgaWYgKGsgIT0gMCkKLSAgICByZXR1cm4gMTc7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDA1MjVmLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyogU2Vjb25kIEMgc291cmNlIGZpbGUgZm9yIGFjdHVhbCBleGVjdXRpb24gdGVzdC4gICovCi0KLWludCBrOwotZXh0ZXJuIGludCBpOwotZXh0ZXJuIGludCBqOwotZXh0ZXJuIGNoYXIgc21hbGxfYnVmW107Ci1leHRlcm4gY2hhciAqc21hbGxfcG9pbnRlcjsKLQotZXh0ZXJuIGludCBjaGtzdHIgKCk7Ci0KLWludAotYmFyIChuKQotICAgICBpbnQgbjsKLXsKLSAgaW50IHI7Ci0KLSAgaWYgKGkgIT0gMQotICAgICAgfHwgaiAhPSAwCi0gICAgICB8fCAhIGNoa3N0ciAoc21hbGxfYnVmLCA0KQotICAgICAgfHwgISBjaGtzdHIgKHNtYWxsX3BvaW50ZXIsIDQpKQotICAgIHJldHVybiBrICsgMTsKLQotICByID0gazsKLSAgayA9IG47Ci0gIHJldHVybiByOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3RpLnMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdGkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhMTk1My4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdGkucworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMgQXNzZW1ibGVyIGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIGFjdHVhbCBleGVjdXRpb24gdGVzdC4KLQkKLSMgVGhpcyBjb2RlIGJlY29tZXMgdGhlIHN0YXJ0IG9mIHRoZSBleGVjdXRpb24gdGVzdCBwcm9ncmFtLiAgSXQgaXMKLSMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyB0aGUgc3RhdGljIGRhdGEsIGludm9raW5nIHRoZSBDIGNvZGUsCi0jIGFuZCByZXR1cm5pbmcgdGhlIHJlc3VsdC4gIEl0IGlzIGNhbGxlZCBhcyB0aG91Z2ggaXQgd2VyZSBhIEMKLSMgZnVuY3Rpb24gd2l0aCBhbiBhcmd1bWVudCBvZiB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWdtZW50LgotCi0jIFdlIG5lZWQgdG8ga25vdyB0aGUgdmFsdWUgb2YgX2Z0ZXh0IGFuZCBfZmRhdGEgYXQgbGluayB0aW1lLCBidXQgd2UKLSMgaGF2ZSBubyB3YXkgdG8gYWN0dWFsbHkgZ2V0IHRoYXQgYXQgcnVudGltZS4gIFRoaXMgaXMgYmVjYXVzZSB3aGVuCi0jIHRoaXMgY29kZSBpcyBjb21waWxlZCB3aXRoIC1tZW1iZWRkZWQtcGljLCB0aGUgbGEgaW5zdHJ1Y3Rpb24gd2lsbAotIyBiZSB0dXJuZWQgaW50byBhbiBhZGRpdSAkZ3AgaW5zdHJ1Y3Rpb24uICBXZSB3b3JrIGFyb3VuZCB0aGlzIGJ5Ci0jIHN0b3JpbmcgdGhlIGluZm9ybWF0aW9uIGluIHdvcmRzIGluIHRoZSAuZGF0YSBzZWN0aW9uLiAgV2UgdGhlbiBsb2FkCi0jIHRoZSB2YWx1ZXMgb2YgdGhlc2Ugd29yZHMgKmJlZm9yZSogZG9pbmcgdGhlIHJ1bnRpbWUgcmVsb2NhdGlvbi4KLQkuc2RhdGEKLXRleHRfc3RhcnQ6Ci0JLndvcmQJX2Z0ZXh0Ci1kYXRhX3N0YXJ0OgotCS53b3JkCV9mZGF0YQotCi0JLmdsb2JsCXN0YXJ0Ci0JLnRleHQKLXN0YXJ0OgotCSMgR3JhYiBzb21lIHNwYWNlIG9uIHRoZSBzdGFjaywganVzdCBhcyB0aG91Z2ggd2Ugd2VyZSBhIHJlYWwKLQkjIGZ1bmN0aW9uLgotCWFkZGl1CSRzcCwkc3AsLTgKLQlzdwkkMzEsMCgkc3ApCi0KLQkjIFNhdmUgdGhlICRncCByZWdpc3RlciwgYW5kIHNldCBpdCB1cCBmb3Igb3VyIGRhdGEgc2VjdGlvbi4KLQlzdwkkZ3AsNCgkc3ApCi0KLQlhZGR1CSRncCwkNCwweDgwMDAJCSMgbWFjcm8KLQotCSMgVGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQgaXMgaW4gJDQuCi0KLQkjIEdldCB0aGUgYWRkcmVzcyBvZiBzdGFydCBpbnRvICQ1IGluIGEgcG9zaXRpb24gaW5kZXBlbmRlbnQKLQkjIGZhc2hpb24uCi0JLnNldAlub3Jlb3JkZXIKLQkkTEYxID0gLiArIDgKLQliYWwJJExGMQotCWxhCSQ1LHN0YXJ0LSRMRjEJCSMgbWFjcm8KLQkuc2V0CXJlb3JkZXIKLQlhZGR1CSQ1LCQ1LCQzMQotCi0JIyBOb3cgZ2V0IHRoZSBhZGRyZXNzIG9mIF9mdGV4dCBpbnRvICQ2LgotCWxhCSQ2LF9mdGV4dC1zdGFydAkJIyBtYWNybwotCWFkZHUJJDYsJDYsJDUKLQotCSMgR2V0IHRoZSB2YWx1ZSBvZiBfZnRleHQgdXNlZCB0byBsaW5rIGludG8gJDcuCi0JbHcJJDcsdGV4dF9zdGFydAkJIyBtYWNybwotCi0JIyBHZXQgdGhlIHZhbHVlIG9mIF9mZGF0YSB1c2VkIHRvIGxpbmsgaW50byAkOC4KLQlsdwkkOCxkYXRhX3N0YXJ0CQkjIG1hY3JvCi0KLQkjIEdldCB0aGUgYWRkcmVzcyBvZiBfX3J1bnRpbWVfcmVsb2Nfc3RhcnQgaW50byAkOS4KLQlsYQkkOSxfX3J1bnRpbWVfcmVsb2Nfc3RhcnQtc3RhcnQJIyBtYWNybwotCWFkZHUJJDksJDksJDUKLQotCSMgR2V0IHRoZSBhZGRyZXNzIG9mIF9fcnVudGltZV9yZWxvY19zdG9wIGludG8gJDEwLgotCWxhCSQxMCxfX3J1bnRpbWVfcmVsb2Nfc3RvcC1zdGFydAkjIG1hY3JvCi0JYWRkdQkkMTAsJDEwLCQ1Ci0KLQkjIFRoZSB3b3JkcyBiZXR3ZWVuICQ5IGFuZCAkMTAgYXJlIHRoZSBydW50aW1lIGluaXRpYWxpemF0aW9uCi0JIyBpbnN0cnVjdGlvbnMuICBTdGVwIHRocm91Z2ggYW5kIHJlbG9jYXRlIHRoZW0uICBGaXJzdCBzZXQKLQkjICQxMSBhbmQgJDEyIHRvIHRoZSB2YWx1ZXMgdG8gYWRkIHRvIHRleHQgYW5kIGRhdGEgc2VjdGlvbnMsCi0JIyByZXNwZWN0aXZlbHkuCi0Jc3VidQkkMTEsJDYsJDcKLQlzdWJ1CSQxMiwkNCwkOAotCi0xOgkKLQliZ2UJJDksJDEwLDNmCQkjIG1hY3JvCi0JbHcJJDEzLDAoJDkpCi0JYW5kCSQxNCwkMTMsMHhmZmZmZmZmZQkjIG1hY3JvCi0JbW92ZQkkMTUsJDExCi0JYmVxCSQxMywkMTQsMmYKLQltb3ZlCSQxNSwkMTIKLTI6CQotCWFkZHUJJDE0LCQxNCwkNAotCWx3CSQyNCwwKCQxNCkKLQlhZGR1CSQyNCwkMjQsJDE1Ci0Jc3cJJDI0LDAoJDE0KQotCWFkZGl1CSQ5LCQ5LDQKLQliCTFiCi0zOgkKLQotCSMgTm93IHRoZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkIGRhdGEgaGFzIGJlZW4gcmVsb2NhdGVkCi0JIyBjb3JyZWN0bHksIGFuZCB3ZSBjYW4gY2FsbCB0aGUgQyBjb2RlIHdoaWNoIGRvZXMgdGhlIGFjdHVhbAotCSMgdGVzdGluZy4KLQliYWwJZm9vCi0KLQkjIFdlIHJldHVybiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIEMgY29kZS4KLQlsdwkkMzEsMCgkc3ApCi0JbHcJJGdwLDQoJHNwKQotCWFkZHUJJHNwLCRzcCw4Ci0JagkkMzEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMS5jIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Nzg5NDUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWV4dGVybiBpbnQgZm9vICgpOwotaW50Ci1mdW5jICgpCi17Ci0gIHJldHVybiBmb28gKCk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMS50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTk0OGM5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMS50CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1OT0NST1NTUkVGUyAoIC50ZXh0IC5kYXRhICkKLVNFQ1RJT05TCi17Ci0gIC50ZXh0IDogeyB0bXBkaXIvY3Jvc3MxLm8gfQotICAuZGF0YSA6IHsgdG1wZGlyL2Nyb3NzMi5vIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNDMxNzcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWludAotZm9vICgpCi17Ci0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MyLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwNDZmNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIudAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotTk9DUk9TU1JFRlMgKCAudGV4dCAuZGF0YSApCi1TRUNUSU9OUwotewotICAudGV4dCA6IHsgKigudGV4dCkgKigucHIpIH0KLSAgLmRhdGEgOiB7ICooLmRhdGEpICooLnNkYXRhKSAqKC5ydykgKigudGMwKSAqKC50YykgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MzLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0OGMzMi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczMuYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotaW50IGkgPSA0OwotCi1pbnQKLWZvbyAoKQotewotICByZXR1cm4gaTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlOTc1OS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zc3JlZi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0jIFRlc3QgTk9DUk9TU1JFRlMgaW4gYSBsaW5rZXIgc2NyaXB0LgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotc2V0IHRlc3QxICJOT0NST1NTUkVGUyAxIgotc2V0IHRlc3QyICJOT0NST1NTUkVGUyAyIgotCi1pZiB7IFt3aGljaCAkQ0NdID09IDAgfSB7Ci0gICAgdW50ZXN0ZWQgJHRlc3QxCi0gICAgdW50ZXN0ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLWlmIHsgIVtsZF9jb21waWxlICRDQyAiJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMS5jIiB0bXBkaXIvY3Jvc3MxLm9dIFwKLSAgICAgfHwgIVtsZF9jb21waWxlICRDQyAiJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMi5jIiB0bXBkaXIvY3Jvc3MyLm9dIH0gewotICAgIHVucmVzb2x2ZWQgJHRlc3QxCi0gICAgdW5yZXNvbHZlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotc2V0IGZsYWdzICIiCi0KLSMgVGhlIGEyOWsgY29tcGlsZWQgY29kZSBjYWxscyBWX1NQSUxMIGFuZCBWX0ZJTEwuICBTaW5jZSB3ZSBkb24ndAotIyBuZWVkIHRvIHJ1biB0aGlzIGNvZGUsIGJ1dCB3ZSBkb24ndCBoYXZlIGRlZmluaXRpb25zIGZvciB0aG9zZQotIyBmdW5jdGlvbnMsIHdlIGp1c3QgZGVmaW5lIHRoZW0gb3V0LgotaWYgW2lzdGFyZ2V0IGEyOWsqLSotKl0gewotICAgIHNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIFZfU1BJTEw9MCAtLWRlZnN5bSBWX0ZJTEw9MCIKLX0KLQotIyBocHBhLWVsZiBuZWVkcyBhIGRlZmluaXRpb24gZm9yICRnbG9iYWwkLgotaWYgW2lzdGFyZ2V0IGhwcGEqLSotKl0gewotICAgIHNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltICdcJGdsb2JhbFwkJz0wIgotfQotCi12ZXJib3NlIC1sb2cgIiRsZCAkZmxhZ3MgLW8gdG1wZGlyL2Nyb3NzMSAtVCAkc3JjZGlyLyRzdWJkaXIvY3Jvc3MxLnQgdG1wZGlyL2Nyb3NzMS5vIHRtcGRpci9jcm9zczIubyIKLQotY2F0Y2ggImV4ZWMgJGxkICRmbGFncyAtbyB0bXBkaXIvY3Jvc3MxIC1UICRzcmNkaXIvJHN1YmRpci9jcm9zczEudCB0bXBkaXIvY3Jvc3MxLm8gdG1wZGlyL2Nyb3NzMi5vIiBleGVjX291dHB1dAotCi1zZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotcmVnc3ViIC1hbGwgIihefFxuKSgkbGQ6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbFxbXlxuXF0qXG4/KSIgJGV4ZWNfb3V0cHV0ICJcXDEiIGV4ZWNfb3V0cHV0Ci0KLWlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLSAgICBmYWlsICR0ZXN0MQotfSBlbHNlIHsKLSAgICB2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLSAgICBpZiBbcmVnZXhwICJwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZSBmcm9tIC4qIHRvIGBmb28nIGluIiAkZXhlY19vdXRwdXRdIHsKLQlwYXNzICR0ZXN0MQotICAgIH0gZWxzZSB7Ci0JZmFpbCAkdGVzdDEKLSAgICB9Ci19Ci0KLSMgQ2hlY2sgY3Jvc3MgcmVmZXJlbmNlcyB3aXRoaW4gYSBzaW5nbGUgb2JqZWN0LgotCi1pZiB7ICFbbGRfY29tcGlsZSAkQ0MgIiRzcmNkaXIvJHN1YmRpci9jcm9zczMuYyIgdG1wZGlyL2Nyb3NzMy5vXSB9IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi12ZXJib3NlIC1sb2cgIiRsZCAkZmxhZ3MgLW8gdG1wZGlyL2Nyb3NzMiAtVCAkc3JjZGlyLyRzdWJkaXIvY3Jvc3MyLnQgdG1wZGlyL2Nyb3NzMy5vIgotCi1jYXRjaCAiZXhlYyAkbGQgJGZsYWdzIC1vIHRtcGRpci9jcm9zczIgLVQgJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMi50IHRtcGRpci9jcm9zczMubyIgZXhlY19vdXRwdXQKLQotc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLXJlZ3N1YiAtYWxsICIoXnxcbikoJGxkOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2xcW15cblxdKlxuPykiICRleGVjX291dHB1dCAiXFwxIiBleGVjX291dHB1dAotCi1pZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0gICAgZmFpbCAkdGVzdDIKLX0gZWxzZSB7Ci0gICAgdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0gICAgaWYgW3JlZ2V4cCAicHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2UgZnJvbSAuKiB0byBgLionIGluIiAkZXhlY19vdXRwdXRdIHsKLQlwYXNzICR0ZXN0MgotICAgIH0gZWxzZSB7Ci0JZmFpbCAkdGVzdDIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGEyNmJjLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyBUZXN0IERFRklORUQgaW4gYSBsaW5rZXIgc2NyaXB0LgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotc2V0IHRlc3RuYW1lICJERUZJTkVEIgotc2V0IHBybXNfaWQgNTY5OQotCi1pZiAhW2xkX2Fzc2VtYmxlICRhcyAkc3JjZGlyLyRzdWJkaXIvZGVmaW5lZC5zIHRtcGRpci9kZWYub10gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9kZWYgIi1UICRzcmNkaXIvJHN1YmRpci9kZWZpbmVkLnQgdG1wZGlyL2RlZi5vIl0gewotICAgIGZhaWwgJHRlc3RuYW1lCi19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci9kZWZdIHsKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0JaWYgeyFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHZhbHVlMSldIFwKLQkgICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHZhbHVlMildfSB7Ci0JICAgIHNlbmRfbG9nICJiYWQgb3V0cHV0IGZyb20gbm1cbiIKLQkgICAgdmVyYm9zZSAiYmFkIG91dHB1dCBmcm9tIG5tIgotCSAgICBmYWlsICR0ZXN0bmFtZQotCX0gZWxzZSB7Ci0JICAgIGlmIHskbm1fb3V0cHV0KHZhbHVlMSkgIT0gMX0gewotCQlzZW5kX2xvZyAidmFsdWUxID09ICRubV9vdXRwdXQodmFsdWUxKVxuIgotCQl2ZXJib3NlICJ2YWx1ZTEgPT0gJG5tX291dHB1dCh2YWx1ZTEpIgotCQlmYWlsICR0ZXN0bmFtZQotCSAgICB9IGVsc2UgewotCQlpZiB7JG5tX291dHB1dCh2YWx1ZTIpICE9IDJ9IHsKLQkJICAgIHNlbmRfbG9nICJ2YWx1ZTIgPT0gJG5tX291dHB1dCh2YWx1ZTIpXG4iCi0JCSAgICB2ZXJib3NlICJ2YWx1ZTIgPT0gJG5tX291dHB1dCh2YWx1ZTIpIgotCQkgICAgZmFpbCAkdGVzdG5hbWUKLQkJfSBlbHNlIHsKLQkJICAgIHBhc3MgJHRlc3RuYW1lCi0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNjRiYmIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0JLmdsb2JsCWRlZmluZWQKLQlkZWZpbmVkCT0JMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWVmMWI2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQudAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0VDVElPTlMgewotCS50ZXh0IDogeyAqKC50ZXh0KSB9Ci0JLmRhdGEgOiB7ICooLmRhdGEpIH0KLQkuYnNzIDogeyAqKC5ic3MpICooQ09NTU9OKSB9Ci19Ci12YWx1ZTEgPSBERUZJTkVEIChkZWZpbmVkKSA/IDEgOiAyOwotdmFsdWUyID0gREVGSU5FRCAodW5kZWZpbmVkKSA/IDEgOiAyOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTM3ZmEwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMgVGVzdCBQSERSUyBpbiBhIGxpbmtlciBzY3JpcHQuCi0jIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0jIFBIRFJTIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgRUxGLgotaWYgeyAhW2lzdGFyZ2V0ICotKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotdW5peHdhcmUqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWVsZipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotZWFiaSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWlyaXg1Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1pcml4NipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotc29sYXJpczIqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotaWYgeyBbaXN0YXJnZXQgKi0qLWxpbnV4KmFvdXQqXSBcCi0gICAgIHx8IFtpc3RhcmdldCAqLSotbGludXgqb2xkbGQqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotIyBUaGlzIGlzIGEgdmVyeSBzaW1wbGlzdGljIHRlc3QuCi0KLXNldCB0ZXN0bmFtZSAiUEhEUlMiCi0KLWlmICFbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci9waGRycy5zIHRtcGRpci9waGRycy5vXSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotc2V0IHBoZHJzX3JlZ2V4cCBcCi0iLipQcm9ncmFtIEhlYWRlcjouKlBIRFIgKm9mZiAqMHgwMCozNCAqdmFkZHIgKjB4MDAqODAwMzQgKnBhZGRyICoweDAwKjgwMDM0LipmaWxlc3ogKjB4MFxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogZmxhZ3Mgci0tLipMT0FEICpvZmYgKjB4MDAqICp2YWRkciAqMHgwMCo4MDAwMCAqcGFkZHIgKjB4MDAqODAwMDAuKmZpbGVzeiAqMHgwMCpcWzAtOWEtZlxdKiAqbWVtc3ogKjB4MFxbMC05YS1mXF0qICpmbGFncyByLXguKkxPQUQgKm9mZiAqMHgwXFswLTlhLWZcXSogKnZhZGRyICoweDAwKjgwKlxbMC05YS1mXF0qICpwYWRkciAqMHgwMCo4MCpcWzAtOWEtZlxdKi4qZmlsZXN6ICoweDBcWzAtOWEtZlxdKiAqbWVtc3ogKjB4MFxbMC05YS1mXF0qICpmbGFncyAqcnctLioiCi0KLSMgT24gYSA2NCBiaXQgRUxGIGZvcm1hdCwgd2UgbmVlZCBkaWZmZXJlbnQgbnVtYmVycy4KLWlmIHsgW2lzdGFyZ2V0IGFscGhhKi0qLSpdIH0gdGhlbiB7Ci0gIHNldCBwaGRyc19yZWdleHAgXAotIi4qUHJvZ3JhbSBIZWFkZXI6LipQSERSICpvZmYgKjB4MDAqNDAgKnZhZGRyICoweDAwKjgwMDQwICpwYWRkciAqMHgwMCo4MDA0MC4qZmlsZXN6ICoweDBcWzAtOWEtZlxdKiAqbWVtc3ogKjB4MFxbMC05YS1mXF0qIGZsYWdzIHItLS4qTE9BRCAqb2ZmICoweDAwKiAqdmFkZHIgKjB4MDAqODAwMDAgKnBhZGRyICoweDAwKjgwMDAwLipmaWxlc3ogKjB4MDAqXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiAqZmxhZ3Mgci14LipMT0FEICpvZmYgKjB4MFxbMC05YS1mXF0qICp2YWRkciAqMHgwMCo4MCpcWzAtOWEtZlxdKiAqcGFkZHIgKjB4MDAqODAqXFswLTlhLWZcXSouKmZpbGVzeiAqMHgwXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiAqZmxhZ3MgKnJ3LS4qIgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvcGhkcnMgIi1UICRzcmNkaXIvJHN1YmRpci9waGRycy50IHRtcGRpci9waGRycy5vIl0gewotICAgIGZhaWwgJHRlc3RuYW1lCi19IGVsc2UgewotICAgIGlmIHtbd2hpY2ggJG9iamR1bXBdID09IDB9IHsKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgLS1wcml2YXRlIHRtcGRpci9waGRycyIKLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtLXByaXZhdGUgdG1wZGlyL3BoZHJzIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIHZlcmJvc2UgLWxvZyAkZXhlY19vdXRwdXQKLQotICAgIGlmIFtyZWdleHAgJHBoZHJzX3JlZ2V4cCAkZXhlY19vdXRwdXRdIHsKLQlwYXNzICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0JZmFpbCAkdGVzdG5hbWUKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxZjBkMS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLnRleHQKLQotCS5sb25nCTEKLQotCS5kYXRhCi0KLQkubG9uZwkyCi0JCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3MTBlMi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy50CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotUEhEUlMKLXsKLSAgaGVhZGVyIFBUX1BIRFIgUEhEUlMgOwotICB0ZXh0IFBUX0xPQUQgRklMRUhEUiBQSERSUyA7Ci0gIGRhdGEgUFRfTE9BRCA7Ci19Ci0KLVNFQ1RJT05TCi17Ci0gIC4gPSAweDgwMDAwICsgU0laRU9GX0hFQURFUlM7Ci0gIC50ZXh0IDogeyAqKC50ZXh0KSB9IDp0ZXh0Ci0gIC5kYXRhIDogeyAqKC5kYXRhKSB9IDpkYXRhCi0gIC9ESVNDQVJELyA6IHsgKigucmVnaW5mbykgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjYxNzQuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSMgVGVzdCBiYXNpYyBsaW5rZXIgc2NyaXB0IGZ1bmN0aW9uYWxpdHkKLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotc2V0IHRlc3RuYW1lICJzY3JpcHQiCi0KLWlmICFbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci9zY3JpcHQucyB0bXBkaXIvc2NyaXB0Lm9dIHsgCi0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotcHJvYyBjaGVja19zY3JpcHQgeyB9IHsKLSAgICBnbG9iYWwgbm0KLSAgICBnbG9iYWwgdGVzdG5hbWUKLSAgICBnbG9iYWwgbm1fb3V0cHV0Ci0KLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvc2NyaXB0XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dCh0ZXh0X3N0YXJ0KV0gXAotCSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQodGV4dF9lbmQpXSBcCi0JICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChkYXRhX3N0YXJ0KV0gXAotCSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZGF0YV9lbmQpXX0gewotCSAgICBzZW5kX2xvZyAiYmFkIG91dHB1dCBmcm9tIG5tXG4iCi0JICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKLQkgICAgZmFpbCAkdGVzdG5hbWUKLQl9IGVsc2UgewotCSAgICBpZiB7JG5tX291dHB1dCh0ZXh0X3N0YXJ0KSAhPSAweDEwMH0gewotCQlzZW5kX2xvZyAidGV4dF9zdGFydCA9PSAkbm1fb3V0cHV0KHRleHRfc3RhcnQpXG4iCi0JCXZlcmJvc2UgInRleHRfc3RhcnQgPT0gJG5tX291dHB1dCh0ZXh0X3N0YXJ0KSIKLQkJZmFpbCAkdGVzdG5hbWUKLQkgICAgfSBlbHNlIHsgaWYgeyRubV9vdXRwdXQodGV4dF9lbmQpIDwgMHgxMDQgXAotCQkJICB8fCAkbm1fb3V0cHV0KHRleHRfZW5kKSA+IDB4MTEwfSB7Ci0JCXNlbmRfbG9nICJ0ZXh0X2VuZCA9PSAkbm1fb3V0cHV0KHRleHRfZW5kKVxuIgotCQl2ZXJib3NlICJ0ZXh0X2VuZCA9PSAkbm1fb3V0cHV0KHRleHRfZW5kKSIKLQkJZmFpbCAkdGVzdG5hbWUKLQkgICAgfSBlbHNlIHsgaWYgeyRubV9vdXRwdXQoZGF0YV9zdGFydCkgIT0gMHgxMDAwfSB7Ci0JCXNlbmRfbG9nICJkYXRhX3N0YXJ0ID09ICRubV9vdXRwdXQoZGF0YV9zdGFydClcbiIKLQkJdmVyYm9zZSAiZGF0YV9zdGFydCA9PSAkbm1fb3V0cHV0KGRhdGFfc3RhcnQpIgotCQlmYWlsICR0ZXN0bmFtZQotCSAgICB9IGVsc2UgeyBpZiB7JG5tX291dHB1dChkYXRhX2VuZCkgPCAweDEwMDQgXAotCQkJIHx8ICRubV9vdXRwdXQoZGF0YV9lbmQpID4gMHgxMDEwfSB7Ci0JCXNlbmRfbG9nICJkYXRhX2VuZCA9PSAkbm1fb3V0cHV0KGRhdGFfZW5kKVxuIgotCQl2ZXJib3NlICJkYXRhX2VuZCA9PSAkbm1fb3V0cHV0KGRhdGFfZW5kKSIKLQkJZmFpbCAkdGVzdG5hbWUKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAkdGVzdG5hbWUKLQkgICAgfSB9IH0gfQotCX0KLSAgICB9Ci19Ci0KLSMgUEUgdGFyZ2V0cyBuZWVkIHRvIHNldCB0aGUgaW1hZ2UgYmFzZSB0byAwIHRvIGF2b2lkIGNvbXBsaWNhdGlvbnMgZnJvbSBubS4KLXNldCBmbGFncyAiIgotaWYge1tpc3RhcmdldCAiKi0qLXBlKiJdIFwKLSAgICB8fCBbaXN0YXJnZXQgIiotKi1jeWd3aW4qIl0gXAotICAgIHx8IFtpc3RhcmdldCAiKi0qLW1pbmd3MzIqIl0gXAotICAgIHx8IFtpc3RhcmdldCAiKi0qLXdpbm50KiJdIFwKLSAgICB8fCBbaXN0YXJnZXQgIiotKi1udCoiXSBcCi0gICAgfHwgW2lzdGFyZ2V0ICIqLSotaW50ZXJpeCoiXSB9IHRoZW4gewotICBzZXQgZmxhZ3MgIi0taW1hZ2UtYmFzZSAwIgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc2NyaXB0ICIkZmxhZ3MgLVQgJHNyY2Rpci8kc3ViZGlyL3NjcmlwdC50IHRtcGRpci9zY3JpcHQubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBjaGVja19zY3JpcHQKLX0KLQotc2V0IHRlc3RuYW1lICJNUkkgc2NyaXB0IgotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc2NyaXB0ICIkZmxhZ3MgLWMgJHNyY2Rpci8kc3ViZGlyL3NjcmlwdG0udCJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBjaGVja19zY3JpcHQKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YjY1YjAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkudGV4dAotCS5nbG9ibCB0ZXh0X3N5bWJvbAotdGV4dF9zeW1ib2w6CQotCS5sb25nCTEKLQkuZGF0YQotCS5nbG9ibCBkYXRhX3N5bWJvbAotZGF0YV9zeW1ib2w6CQotCS5sb25nCTIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlN2E0OGEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LnQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1TRUNUSU9OUwotewotICAudGV4dCAweDEwMCA6IHsgCi0gICAgdGV4dF9zdGFydCA9IC47Ci0gICAgKigudGV4dCkKLSAgICAqKC5wcikKLSAgICB0ZXh0X2VuZCA9IC47Ci0gIH0KLSAgLiA9IDB4MTAwMDsKLSAgLmRhdGEgOiB7Ci0gICAgZGF0YV9zdGFydCA9IC47Ci0gICAgKiguZGF0YSkKLSAgICAqKC5ydykKLSAgICBkYXRhX2VuZCA9IC47Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdG0udCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdG0udApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjY2FlMS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHRtLnQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0qIE1SSSBzY3JpcHQKLXNlY3QgLnRleHQgPSAkMTAwCTsgLnRleHQgc3RhcnQgYWRkcmVzcwotc2VjdCAuZGF0YSA9IDEwMDBoCTsgLmRhdGEgc3RhcnQgYWRkcmVzcwotcHVibGljIHRleHRfc3RhcnQgPSAkMTAwCi1wdWJsaWMgdGV4dF9lbmQgPSAjIGNvbnRpbnVhdGlvbiBsaW5lCi0gIHRleHRfc3RhcnQgKyA0Ci1wdWJsaWMgZGF0YV9zdGFydCA9IDEwMDBoCi1wdWJsaWMgZGF0YV9lbmQgPSBkYXRhX3N0YXJ0ICsgNAotCi1sb2FkIHRtcGRpci9zY3JpcHQubwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGVmZDQuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMgVGVzdCBTSVpFT0YgaW4gYSBsaW5rZXIgc2NyaXB0LgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotIyBCYXNlZCBvbiBhIGJ1ZyByZXBvcnQgZnJvbSBhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2UuCi0KLXNldCB0ZXN0bmFtZSAiU0laRU9GIgotCi1pZiAhW2xkX2Fzc2VtYmxlICRhcyAkc3JjZGlyLyRzdWJkaXIvc2l6ZW9mLnMgdG1wZGlyL3NpemVvZi5vXSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NpemVvZiAiLVQgJHNyY2Rpci8kc3ViZGlyL3NpemVvZi50IHRtcGRpci9zaXplb2YubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX25tICRubSB0bXBkaXIvc2l6ZW9mXSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgeyFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHRleHRfc3RhcnQpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHRleHRfZW5kKV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChkYXRhX3N0YXJ0KV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChkYXRhX2VuZCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoc2l6ZW9mX3RleHQpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHNpemVvZl9kYXRhKV19IHsKLSAgICBzZW5kX2xvZyAiYmFkIG91dHB1dCBmcm9tIG5tXG4iCi0gICAgdmVyYm9zZSAiYmFkIG91dHB1dCBmcm9tIG5tIgotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmIHskbm1fb3V0cHV0KHRleHRfZW5kKSAtICRubV9vdXRwdXQodGV4dF9zdGFydCkgIT0gJG5tX291dHB1dChzaXplb2ZfdGV4dCl9IHsKLSAgICBzZW5kX2xvZyAidGV4dF9lbmQgLSB0ZXh0X3N0YXJ0ICE9IHNpemVvZl90ZXh0XG4iCi0gICAgdmVyYm9zZSAidGV4dF9lbmQgLSB0ZXh0X3N0YXJ0ICE9IHNpemVvZl90ZXh0IgotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmIHskbm1fb3V0cHV0KGRhdGFfZW5kKSAtICRubV9vdXRwdXQoZGF0YV9zdGFydCkgIT0gJG5tX291dHB1dChzaXplb2ZfZGF0YSl9IHsKLSAgICBzZW5kX2xvZyAiZGF0YV9lbmQgLSBkYXRhX3N0YXJ0ICE9IHNpemVvZl9kYXRhXG4iCi0gICAgdmVyYm9zZSAiZGF0YV9lbmQgLSBkYXRhX3N0YXJ0ICE9IHNpemVvZl9kYXRhIgotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmIHskbm1fb3V0cHV0KHNpemVvZl90ZXh0KSAhPSAkbm1fb3V0cHV0KHNpemVvZl9kYXRhKX0gewotICAgIHNlbmRfbG9nICJzaXplb2ZfdGV4dCAhPSBzaXplb2ZfZGF0YVxuIgotICAgIHZlcmJvc2UgInNpemVvZl90ZXh0ICE9IHNpemVvZl9kYXRhIgotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLXBhc3MgJHRlc3RuYW1lCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjIxY2EzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi5zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotCS5zcGFjZQkxNgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0NGEzNy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YudAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLVNFQ1RJT05TIHsKLQkudGV4dCA6Ci0JICB7Ci0JICAgIHRleHRfc3RhcnQgPSAuOwotCSAgICB0bXBkaXIvc2l6ZW9mLm8gCi0JICAgIHRleHRfZW5kID0gLjsKLQkgIH0KLQkuZGF0YSA6IAotCSAgeyAKLQkgICAgZGF0YV9zdGFydCA9IC47Ci0JICAgIC4gPSAuICsgU0laRU9GKC50ZXh0KTsKLQkgICAgZGF0YV9lbmQgPSAuOwotCSAgfQotfQkKLQotc2l6ZW9mX3RleHQgPSBTSVpFT0YoLnRleHQpOwotc2l6ZW9mX2RhdGEgPSBTSVpFT0YoLmRhdGEpOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2Vhay5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2NTk2Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMgVGVzdCB3ZWFrIHN5bWJvbHMuCi0jIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTb2x1dGlvbnMuCi0KLXNldCB0ZXN0bmFtZSAid2VhayBzeW1ib2xzIgotCi0jIFRoaXMgdGVzdCBvbmx5IHdvcmtzIGZvciBFTEYgdGFyZ2V0cy4gIEl0IG91Z2h0IHRvIHdvcmsgZm9yIHNvbWUKLSMgYS5vdXQgdGFyZ2V0cywgYnV0IGl0IGRvZXNuJ3QuCi0KLWlmIHsgIVtpc3RhcmdldCAqLSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLXVuaXh3YXJlKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWVhYmkqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1pcml4NSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotaXJpeDYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLXNvbGFyaXMyKl0gfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLQotaWYgeyBbaXN0YXJnZXQgKi0qLWxpbnV4KmFvdXQqXSBcCi0gICAgIHx8IFtpc3RhcmdldCAqLSotbGludXgqb2xkbGQqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotaWYgeyEgW2xkX2Fzc2VtYmxlICRhcyAkc3JjZGlyLyRzdWJkaXIvd2VhazEucyB0bXBkaXIvd2VhazEub10KLSAgICB8fCAhIFtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL3dlYWsyLnMgdG1wZGlyL3dlYWsyLm9dfSB0aGVuIHsKLSAgICAjIEl0J3MgT0sgaWYgLndlYWsgZG9lc24ndCB3b3JrIG9uIHRoaXMgdGFyZ2V0LgotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLXNldCB3ZWFrX3JlZ2V4cF9iaWcgXAotIi4qQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDouKjEwMDAgMDAwMDEwMDggMDAwMDIwMGMgMTIxMjEyMTIgMzQzNDM0MzQuKkNvbnRlbnRzIG9mIHNlY3Rpb24gLmRhdGE6LioyMDAwIDAwMDAxMDA4IDAwMDAyMDBjIDU2NTY1NjU2IDc4Nzg3ODc4LioiCi0KLXNldCB3ZWFrX3JlZ2V4cF9saXR0bGUgXAotIi4qQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDouKjEwMDAgMDgxMDAwMDAgMGMyMDAwMDAgMTIxMjEyMTIgMzQzNDM0MzQuKkNvbnRlbnRzIG9mIHNlY3Rpb24gLmRhdGE6LioyMDAwIDA4MTAwMDAwIDBjMjAwMDAwIDU2NTY1NjU2IDc4Nzg3ODc4LioiCi0KLWlmIHshIFtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3dlYWsgIi1UICRzcmNkaXIvJHN1YmRpci93ZWFrLnQgdG1wZGlyL3dlYWsxLm8gdG1wZGlyL3dlYWsyLm8iXSB9IHRoZW4gewotICAgIGZhaWwgJHRlc3RuYW1lCi19IGVsc2UgewotICAgIGlmIHtbd2hpY2ggJG9iamR1bXBdID09IDB9IHRoZW4gewotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAtcyB0bXBkaXIvd2VhayIKLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtcyB0bXBkaXIvd2VhayIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICB2ZXJib3NlIC1sb2cgJGV4ZWNfb3V0cHV0Ci0KLSAgICBpZiB7W3JlZ2V4cCAkd2Vha19yZWdleHBfYmlnICRleGVjX291dHB1dF0gXAotCXx8IFtyZWdleHAgJHdlYWtfcmVnZXhwX2xpdHRsZSAkZXhlY19vdXRwdXRdIH0gdGhlbiB7Ci0JcGFzcyAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3RuYW1lCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2Vhay50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2Vhay50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2QwMTNlLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsudAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLVNFQ1RJT05TCi17Ci0gIC50ZXh0IDB4MTAwMCA6IHsKLSAgICB0bXBkaXIvd2VhazEubyguZGF0YSkKLSAgfQotICAuZGF0YSAweDIwMDAgOiB7Ci0gICAgdG1wZGlyL3dlYWsyLm8oLmRhdGEpCi0gIH0KLSAgL0RJU0NBUkQvIDogewotICAgICooKikKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2VhazEucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NmZiZTEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2VhazEucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS5kYXRhCi0JLmdsb2JhbAlmb28xCi0JLmdsb2JhbAlzeW0xCi0JLndlYWsJc3ltMgotZm9vMToKLQkubG9uZwlzeW0xCi0JLmxvbmcJc3ltMgotc3ltMToKLQkubG9uZwkweDEyMTIxMjEyCi1zeW0yOgotCS5sb25nCTB4MzQzNDM0MzQKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsyLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGVkZmY1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0uZGF0YQotCS5nbG9iYWwJZm9vMgotCS53ZWFrCXN5bTEKLQkuZ2xvYmFsCXN5bTIKLWZvbzI6Ci0JLmxvbmcJc3ltMQotCS5sb25nCXN5bTIKLXN5bTE6Ci0JLmxvbmcJMHg1NjU2NTY1Ngotc3ltMjoKLQkubG9uZwkweDc4Nzg3ODc4CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjAyMzY3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLyogX3N0YXJ0IHNob3VsZCBiZSB0aGUgb25seSB0aGluZyBsZWZ0IGFmdGVyIEdDLiAgKi8KLQotdm9pZCBfc3RhcnQoKSBfX2FzbV9fKCJfc3RhcnQiKTsKLXZvaWQgX3N0YXJ0KCkKLXsKLX0KLQotdm9pZCBkcm9wbWUxKCkKLXsKLX0KLQotaW50IGRyb3BtZTJbMTAyXSA9IHsgMCB9OwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8yLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5NTg4Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzIuYworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qIE5vcm1hbGx5IHdlIHNob3VsZCBsb29zZSBmb28gYW5kIGtlZXAgX3N0YXJ0IGFuZCBfaW5pdC4gCi0gICBXaXRoIC11IGZvbywgd2Ugc2hvdWxkIGtlZXAgdGhhdCBhcyB3ZWxsLiAgKi8KLQotdm9pZCBfc3RhcnQoKSBfX2FzbV9fKCJfc3RhcnQiKTsKLXZvaWQgX3N0YXJ0KCkKLXsKLX0KLQotdm9pZCBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuaW5pdCIpKSkKLV9pbml0KCkKLXsKLX0KLQotaW50IGZvbygpIF9fYXNtX18oImZvbyIpOwotaW50IGZvbygpCi17Ci0gIHN0YXRpYyBpbnQgeCA9IDE7Ci0gIHJldHVybiB4Kys7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzMuY2MgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MmJjNWQuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8zLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotc3RydWN0IEEKLXsKLSAgdmlydHVhbCB2b2lkIGZvbygpOwotICB2aXJ0dWFsIHZvaWQgYmFyKCk7Ci19OwotCi12b2lkIEE6OmZvbygpIHsgfQkJCS8vIGtlZXAKLXZvaWQgQTo6YmFyKCkgeyB9CQkJLy8gbG9vc2UKLQotc3RydWN0IEIgOiBwdWJsaWMgQQotewotICB2aXJ0dWFsIHZvaWQgZm9vKCk7Ci19OwotCi12b2lkIEI6OmZvbygpIHsgfQkJCS8vIGtlZXAKLQotdm9pZCBfc3RhcnQoKSBfX2FzbV9fKCJfc3RhcnQiKTsJLy8ga2VlcAotCi1BIGE7CQkJCQkvLyBrZWVwCi1CIGI7Ci1BICpnZXRtZSgpIHsgcmV0dXJuICZhOyB9CQkvLyBrZWVwCi0KLXZvaWQgX3N0YXJ0KCkKLXsKLSAgZ2V0bWUoKS0+Zm9vKCk7Ci19Ci0KLS8vIEluIGFkZGl0aW9uLCBrZWVwIEEncyB2aXJ0dWFsIHRhYmxlLgotCi0vLyBXZSdsbCB3aW5kIHVwIGtlZXBpbmcgYGInIGFuZCB0aHVzIEIncyB2aXJ0dWFsIHRhYmxlIGJlY2F1c2UKLS8vIGBhJyBhbmQgYGInIGFyZSBib3RoIHJlZmVyZW5jZWQgZnJvbSB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24uCi0KLWV4dGVybiAiQyIgdm9pZCBfX21haW4oKSB7IH0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvNC5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvNC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmMjZhYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1zdHJ1Y3QgQQotewotICB2aXJ0dWFsIHZvaWQgZm9vKCk7Ci0gIHZpcnR1YWwgdm9pZCBiYXIoKTsKLX07Ci0KLXZvaWQgQTo6Zm9vKCkgeyB9CQkJLy8gbG9vc2UKLXZvaWQgQTo6YmFyKCkgeyB9CQkJLy8ga2VlcAotCi1zdHJ1Y3QgQiA6IHB1YmxpYyBBCi17Ci0gIHZpcnR1YWwgdm9pZCBmb28oKTsKLX07Ci0KLXZvaWQgQjo6Zm9vKCkgeyB9CQkJLy8gbG9vc2UKLQotdm9pZCBfc3RhcnQoKSBfX2FzbV9fKCJfc3RhcnQiKTsJLy8ga2VlcAotCi1BIGE7CQkJCQkvLyBrZWVwCi1CIGI7Ci1BICpnZXRtZSgpIHsgcmV0dXJuICZhOyB9CQkvLyBrZWVwCi0KLXZvaWQgX3N0YXJ0KCkKLXsKLSAgZ2V0bWUoKS0+YmFyKCk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBfX21haW4oKSB7IH0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvc2VsZWN0aXZlLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvc2VsZWN0aXZlLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFiNTg3Mi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBMRCBzZWxlY3RpdmUgbGlua2luZyB0ZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IENhdGhlcmluZSBNb29yZSAoY2xtQGN5Z251cy5jb20pCi0jIE1ha2Ugc3VyZSB0aGF0IGNvbnN0cnVjdG9ycyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0KLQotIyBDT0ZGIGJhc2VkIHBvcnRzIGRvIG5vdCBzdXBwb3J0IHNlbGVjdGl2ZSBsaW5raW5nCi1pZiB7W2lzdGFyZ2V0ICIqLSotY29mZiJdfSB7Ci0gIHJldHVybgotfQotaWYge1tpc3RhcmdldCAiKi0qLXBlIl19IHsKLSAgcmV0dXJuCi19Ci0KLXNldCB0ZXN0MSAic2VsZWN0aXZlMSIKLXNldCB0ZXN0MiAic2VsZWN0aXZlMiIKLXNldCB0ZXN0MyAic2VsZWN0aXZlMyIKLXNldCB0ZXN0NCAic2VsZWN0aXZlNCIKLXNldCB0ZXN0NSAic2VsZWN0aXZlNSIKLQotc2V0IGNmbGFncyAiLXcgLU8yIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zIiAKLXNldCBjeHhmbGFncyAiLWZ2dGFibGUtZ2MgLWZuby1leGNlcHRpb25zIC1mbm8tcnR0aSIKLXNldCBsZGZsYWdzICItLWdjLXNlY3Rpb25zIC1Cc3RhdGljIgotCi1pZiB7IFt3aGljaCAkQ1hYXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MQotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHVudGVzdGVkICR0ZXN0MwotICAgIHVudGVzdGVkICR0ZXN0NAotICAgIHVudGVzdGVkICR0ZXN0NQotICAgIHJldHVybgotfQotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRjZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8xLmMgdG1wZGlyLzEub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMS54ICIkbGRmbGFncyB0bXBkaXIvMS5vIl0gewotICAgIGZhaWwgJHRlc3QxCi19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci8xLnhdIHsKLQl1bnJlc29sdmVkICR0ZXN0MQotICAgIH0gZWxzZSB7Ci0JaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZHJvcG1lMSldfSB7Ci0JCXNlbmRfbG9nICJkcm9wbWUxID09ICRubV9vdXRwdXQoZHJvcG1lMSlcbiIKLQkJdmVyYm9zZSAiZHJvcG1lMSA9PSAkbm1fb3V0cHV0KGRyb3BtZTEpIgotCQlmYWlsICR0ZXN0MQotCSAgICB9IGVsc2UgewotCQlpZiB7W2luZm8gZXhpc3RzIG5tX291dHB1dChkcm9wbWUyKV19IHsKLQkJICAgIHNlbmRfbG9nICJkcm9wbWUyID09ICRubV9vdXRwdXQoZHJvcG1lMilcbiIKLQkJICAgIHZlcmJvc2UgImRyb3BtZTIgPT0gJG5tX291dHB1dChkcm9wbWUyKSIKLQkJICAgIGZhaWwgJHRlc3QxCi0JCX0gZWxzZSB7Ci0JCSAgICBwYXNzICR0ZXN0MQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRjZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8yLmMgdG1wZGlyLzIub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMi54ICIkbGRmbGFncyB0bXBkaXIvMi5vIl0gewotICAgIGZhaWwgJHRlc3QyCi19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci8yLnhdIHsKLQl1bnJlc29sdmVkICR0ZXN0MgotICAgIH0gZWxzZSB7Ci0JaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vKV0gfSB7Ci0gICAgICAgICAgICBzZW5kX2xvZyAiZm9vID09ICRubV9vdXRwdXQoZm9vKVxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZm9vPT0gJG5tX291dHB1dChmb28pIgotICAgICAgICAgICAgZmFpbCAkdGVzdDIKLQl9IGVsc2UgewotICAgICAgICAgICAgcGFzcyAkdGVzdDIKLQkgICAgfSAKLQkgfQotICAgICB9Ci0KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJGNmbGFncyIgJHNyY2Rpci8kc3ViZGlyLzIuYyB0bXBkaXIvMi5vXX0gewotICAgIHVucmVzb2x2ZWQgJHRlc3QzCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci8yLnggIiRsZGZsYWdzIC11IGZvbyB0bXBkaXIvMi5vIl0gewotICAgIGZhaWwgJHRlc3QzCi19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci8yLnhdIHsKLQl1bnJlc29sdmVkICR0ZXN0MwotICAgIH0gZWxzZSB7Ci0JaWYgeyFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvbyldIH0gewotCSAgICBzZW5kX2xvZyAiYmFkIG91dHB1dCBmcm9tIG5tXG4iCi0JICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKLQkgICAgZmFpbCAkdGVzdDMKLQl9IGVsc2UgewotCSAgICBpZiB7JG5tX291dHB1dChmb28pID09IDB9IHsKLQkJc2VuZF9sb2cgImZvbyA9PSAkbm1fb3V0cHV0KGZvbylcbiIKLQkJdmVyYm9zZSAiZm9vPT0gJG5tX291dHB1dChmb28pIgotCQlmYWlsICR0ZXN0MwotCSAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBhc3MgJHRlc3QzCi0JCX0KLQkgfQotICAgICB9Ci19Ci0KLXNldHVwX3hmYWlsICJ2ODUwKi0qLWVsZiIKLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzICRjeHhmbGFncyIgJHNyY2Rpci8kc3ViZGlyLzMuY2MgdG1wZGlyLzMub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0NAotICAgIHJldHVybgotfQotCi1zZXR1cF94ZmFpbCAidjg1MCotKi1lbGYiCi0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci8zLnggIiRsZGZsYWdzIHRtcGRpci8zLm8iXSB7Ci0gICBmYWlsICR0ZXN0NAotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMy54XSB7Ci0gICAgICAgdW5yZXNvbHZlZCAkdGVzdDQKLSAgICB9IGVsc2UgewotICAgICAgIGlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvb19fMUIpXX0gewotICAgICAgICAgIHNlbmRfbG9nICJmb29fXzFCID09ICRubV9vdXRwdXQoZm9vX18xQilcbiIKLSAgICAgICAgICB2ZXJib3NlICJmb29fXzFCID09ICRubV9vdXRwdXQoZm9vX18xQikiCi0gICAgICAgICAgZmFpbCAkdGVzdDQKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgICBpZiB7WyBpbmZvIGV4aXN0cyBubV9vdXRwdXQoYmFyX18xQSldfSB7Ci0gICAgICAgICAgICAgIHNlbmRfbG9nICJiYXJfXzFBPT0gJG5tX291dHB1dChfYmFyX18xQSlcbiIKLSAgICAgICAgICAgICAgdmVyYm9zZSAiYmFyX18xQSA9PSAkbm1fb3V0cHV0KF9iYXJfXzFBKSIKLSAgICAgICAgICAgICAgZmFpbCAkdGVzdDQKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIHBhc3MgJHRlc3Q0Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KLX0KLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzICRjeHhmbGFncyIgJHNyY2Rpci8kc3ViZGlyLzQuY2MgdG1wZGlyLzQub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0NQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvNC54ICIkbGRmbGFncyB0bXBkaXIvNC5vIl0gewotICAgIGZhaWwgJHRlc3Q1Ci19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci80LnhdIHsKLQl1bnJlc29sdmVkICR0ZXN0NQotICAgIH0gZWxzZSB7Ci0JaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vX18xQildfSB7IAotICAgICAgICAgICAgc2VuZF9sb2cgImZvb19fMUIgPT0gJG5tX291dHB1dChmb29fXzFCKVxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpIgotCSAgICBmYWlsICR0ZXN0NQotCX0gZWxzZSB7Ci0gICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vX18xQSldfSB7Ci0JICAgICAgICBzZW5kX2xvZyAiZm9vX18xQT09ICRubV9vdXRwdXQoZm9vX18xQSlcbiIKLQkJdmVyYm9zZSAiZm9vX18xQSA9PSAkbm1fb3V0cHV0KGZvb19fMUEpIgotCQlmYWlsICR0ZXN0NQotICAgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgcGFzcyAkdGVzdDUKLSAgICAgICAgICAgICB9Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2gvc2guZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQ2ZDI2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBsZC1zaCB0ZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIFRlc3QgU0ggcmVsYXhpbmcuICBUaGlzIHRlc3RzIHRoZSBjb21waWxlciBhbmQgYXNzZW1ibGVyIGFzIHdlbGwgYXMKLSMgdGhlIGxpbmtlci4KLQotaWYgIVtpc3RhcmdldCBzaCotKi0qXSB7Ci0gICAgcmV0dXJuCi19Ci0KLXNldCB0ZXN0c2ltcGxlICJTSCBzaW1wbGUgcmVsYXhpbmciCi0KLWlmICFbbGRfYXNzZW1ibGUgJGFzICItcmVsYXggJHNyY2Rpci8kc3ViZGlyL3NoMS5zIiB0bXBkaXIvc2gxLm9dIHsKLSAgICB1bnJlc29sdmVkICR0ZXN0c2ltcGxlCi19IGVsc2UgeyBpZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc2gxICItcmVsYXggdG1wZGlyL3NoMS5vIl0gewotICAgIGZhaWwgJHRlc3RzaW1wbGUKLX0gZWxzZSB7Ci0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyL3NoMV0gewotCXVucmVzb2x2ZWQgJHRlc3RzaW1wbGUKLSAgICB9IGVsc2UgewotCWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dChiYXIpXSBcCi0JICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChmb28pXX0gewotCSAgICBzZW5kX2xvZyAiYmFkIG91dHB1dCBmcm9tIG5tXG4iCi0JICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKLQkgICAgZmFpbCAkdGVzdHNpbXBsZQotCX0gZWxzZSB7Ci0JICAgIGlmIHskbm1fb3V0cHV0KGJhcikgIT0gJG5tX291dHB1dChmb28pICsgNH0gewotCQlzZW5kX2xvZyAiZm9vID09ICRubV9vdXRwdXQoZm9vKVxuIgotCQl2ZXJib3NlICJmb28gPT0gJG5tX291dHB1dChmb28pIgotCQlzZW5kX2xvZyAiYmFyID09ICRubV9vdXRwdXQoYmFyKVxuIgotCQl2ZXJib3NlICJiYXIgPT0gJG5tX291dHB1dChiYXIpIgotCQlmYWlsICR0ZXN0c2ltcGxlCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgJHRlc3RzaW1wbGUKLQkgICAgfQotCX0KLSAgICB9Ci19IH0KLQotc2V0IHRlc3RzcmVjICJTSCByZWxheGluZyB0byBTLXJlY29yZHMiCi0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zaDEuczEgIi1yZWxheCAtb2Zvcm1hdCBzcmVjIHRtcGRpci9zaDEubyJdIHsKLSAgICBmYWlsICR0ZXN0c3JlYwotfSBlbHNlIHsKLSAgICAjIFRoZSBmaWxlIG5hbWUgaXMgZW1iZWRkZWQgaW4gdGhlIFMtcmVjb3Jkcywgc28gY3JlYXRlIGJvdGgKLSAgICAjIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZS4KLSAgICBjYXRjaCAiZXhlYyBybSAtZiB0bXBkaXIvc2gxLnMyIiBleGVjX291dHB1dAotICAgIHNlbmRfbG9nICJtdiB0bXBkaXIvc2gxLnMxIHRtcGRpci9zaDEuczJcbiIKLSAgICB2ZXJib3NlICJtdiB0bXBkaXIvc2gxLnMxIHRtcGRpci9zaDEuczIiCi0gICAgY2F0Y2ggImV4ZWMgbXYgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyIiBleGVjX291dHB1dAotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JdW5yZXNvbHZlZCAkdGVzdHNyZWMKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkb2JqY29weSAtTyBzcmVjIHRtcGRpci9zaDEgdG1wZGlyL3NoMS5zMSIKLQl2ZXJib3NlICIkb2JqY29weSAtTyBzcmVjIHRtcGRpci9zaDEgdG1wZGlyL3NoMS5zMSIKLQljYXRjaCAiZXhlYyAkb2JqY29weSAtTyBzcmVjIHRtcGRpci9zaDEgdG1wZGlyL3NoMS5zMSIgZXhlY19vdXRwdXQKLQlpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQkgICAgc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCSAgICB2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JICAgIHVucmVzb2x2ZWQgJHRlc3RzcmVjCi0JfSBlbHNlIHsKLQkgICAgc2VuZF9sb2cgImNtcCB0bXBkaXIvc2gxLnMxIHRtcGRpci9zaDEuczJcbiIKLQkgICAgdmVyYm9zZSAiY21wIHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMiIKLQkgICAgY2F0Y2ggImV4ZWMgY21wIHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMiIgZXhlY19vdXRwdXQKLQkgICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0JICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQkJZmFpbCAkdGVzdHNyZWMKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAkdGVzdHNyZWMKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLXNldCB0ZXN0bGluayAiU0ggcmVsYXhpbmciCi1zZXQgdGVzdGpzciAiU0ggY29uZmlybSByZWxheGluZyIKLXNldCB0ZXN0cnVuICJTSCByZWxheGluZyBleGVjdXRpb24iCi0KLWlmIHsgW3doaWNoICRDQ10gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdGxpbmsKLSAgICB1bnRlc3RlZCAkdGVzdGpzcgotICAgIHVudGVzdGVkICR0ZXN0cnVuCi0gICAgcmV0dXJuCi19Ci0KLWlmIHshW2xkX2Fzc2VtYmxlICRhcyAiLXJlbGF4ICRzcmNkaXIvJHN1YmRpci9zdGFydC5zIiB0bXBkaXIvc3RhcnQub10gXAotICAgICB8fCAhW2xkX2NvbXBpbGUgJENDICItTyAtbXJlbGF4ICRzcmNkaXIvJHN1YmRpci9zaDIuYyIgdG1wZGlyL3NoMi5vXX0gewotICAgIHVucmVzb2x2ZWQgJHRlc3RsaW5rCi0gICAgdW5yZXNvbHZlZCAkdGVzdGpzcgotICAgIHVucmVzb2x2ZWQgJHRlc3RydW4KLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NoMiAiLXJlbGF4IHRtcGRpci9zdGFydC5vIHRtcGRpci9zaDIubyJdIHsKLSAgICBmYWlsICR0ZXN0bGluawotICAgIHVucmVzb2x2ZWQgJHRlc3Rqc3IKLSAgICB1bnJlc29sdmVkICR0ZXN0cnVuCi0gICAgcmV0dXJuCi19Ci0KLXBhc3MgJHRlc3RsaW5rCi0KLXNlbmRfbG9nICIkb2JqZHVtcCAtZCB0bXBkaXIvc2gyXG4iCi12ZXJib3NlICIkb2JqZHVtcCAtZCB0bXBkaXIvc2gyIgotY2F0Y2ggImV4ZWMgJG9iamR1bXAgLWQgdG1wZGlyL3NoMiIgZXhlY19vdXRwdXQKLWlmIFtzdHJpbmcgbWF0Y2ggIipqc3IqIiAkZXhlY19vdXRwdXRdIHsKLSAgICBmYWlsICR0ZXN0anNyCi19IGVsc2UgewotICAgIHBhc3MgJHRlc3Rqc3IKLX0KLQotaWYgeyAhW2luZm8gZXhpc3RzIFNJTV0gfHwgW3doaWNoICRTSU1dID09IDAgfSB7Ci0gICAgdW50ZXN0ZWQgJHRlc3RydW4KLSAgICByZXR1cm4KLX0KLQotc2V0IHN0YXR1cyBbY2F0Y2ggImV4ZWMgJFNJTSB0bXBkaXIvc2gyIiBleGVjX291dHB1dF0KLWlmIHsgJHN0YXR1cyA9PSAwIH0gewotICAgIHBhc3MgJHRlc3RydW4KLX0gZWxzZSB7Ci0gICAgZmFpbCAkdGVzdHJ1bgotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMS5zIGIvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMThlNDM5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaDEucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotZm9vOgotTDE6CQotCW1vdi5sCUwyLHIwCi0JLnVzZXMJTDEKLQlqc3IJQHIwCi0JcnRzCi0JLmFsaWduCTIKLUwyOgotCS5sb25nCWJhcgotYmFyOgotCXJ0cwotCS5hbGlnbgk0CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2gvc2gyLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2gvc2gyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyN2ZlODguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLWludCBnbG9iYWw7Ci0KLWV4dGVybiB2b2lkIHRyYXAgKGludCwgaW50KTsKLXN0YXRpYyB2b2lkIHF1aXQgKGludCk7Ci1zdGF0aWMgaW50IGZvbyAoaW50KTsKLQotaW50Ci1tYWluICgpCi17Ci0gIGlmIChmb28gKDApICE9IDAgfHwgZ2xvYmFsICE9IDApCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDEpICE9IDEgfHwgZ2xvYmFsICE9IDEpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDIpICE9IDIgfHwgZ2xvYmFsICE9IDIpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDMpICE9IDMgfHwgZ2xvYmFsICE9IDMpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDQpICE9IDQgfHwgZ2xvYmFsICE9IDQpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDUpICE9IDUgfHwgZ2xvYmFsICE9IDUpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDYpICE9IDYgfHwgZ2xvYmFsICE9IDYpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDcpICE9IDcgfHwgZ2xvYmFsICE9IDcpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDgpICE9IDggfHwgZ2xvYmFsICE9IDgpCi0gICAgcXVpdCAoMSk7Ci0gIHF1aXQgKDApOwotfQotCi12b2lkCi1fX21haW4gKCkKLXsKLX0KLQotc3RhdGljIHZvaWQKLXF1aXQgKGludCBzdGF0dXMpCi17Ci0gIHRyYXAgKDEsIHN0YXR1cyk7Ci19Ci0KLWludAotYmFyIChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gaTsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyMCAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDA7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjEgKGludCBpKQotewotICBnbG9iYWwgPSAxOwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXIyIChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gMjsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyMyAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDM7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjQgKGludCBpKQotewotICBnbG9iYWwgPSA0OwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXI1IChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gNTsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyNiAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDY7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjcgKGludCBpKQotewotICBnbG9iYWwgPSA3OwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1mb28gKGludCBpKQotewotICBzd2l0Y2ggKGkpCi0gICAgewotICAgIGNhc2UgMDogYmFyMCAoMCk7IHJldHVybiAwOwotICAgIGNhc2UgMTogYmFyMSAoMSk7IHJldHVybiAxOwotICAgIGNhc2UgMjogYmFyMiAoMik7IHJldHVybiAyOwotICAgIGNhc2UgMzogYmFyMyAoMyk7IHJldHVybiAzOwotICAgIGNhc2UgNDogYmFyNCAoNCk7IHJldHVybiA0OwotICAgIGNhc2UgNTogYmFyNSAoNSk7IHJldHVybiA1OwotICAgIGNhc2UgNjogYmFyNiAoNik7IHJldHVybiA2OwotICAgIGNhc2UgNzogYmFyNyAoNyk7IHJldHVybiA3OwotICAgIGRlZmF1bHQ6IHJldHVybiBiYXIgKGkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zdGFydC5zIGIvbGQvdGVzdHN1aXRlL2xkLXNoL3N0YXJ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZjRjNzkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoL3N0YXJ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCXN0YXJ0Ci1zdGFydDoKLQotCW1vdi5sCXN0YWNrX2sscjE1Ci0KLQkhIGNhbGwgdGhlIG1haW5saW5lCQotTDE6CQotCW1vdi5sCW1haW5fayxyMAotCS51c2VzCUwxCi0JanNyCUByMAotCW5vcAotCi0JLmFsaWduIDIKLXN0YWNrX2s6Ci0JLmxvbmcJX3N0YWNrCQotbWFpbl9rOgotCS5sb25nCV9tYWluCi0KLQkuZ2xvYmFsIF90cmFwCi1fdHJhcDoJCi0JdHJhcGEgIzMKLQlydHMKLQlub3AKLQotCS5zZWN0aW9uIC5zdGFjawotX3N0YWNrOgkubG9uZwkweGRlYWRkZWFkCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL2VsZi1vZmZzZXQubGQgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL2VsZi1vZmZzZXQubGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZTQyOTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9lbGYtb2Zmc2V0LmxkCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gMHgxMDAwMDA7Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAuZ251LnZlcnNpb24gICA6IHsgKiguZ251LnZlcnNpb24pCX0KLSAgLmdudS52ZXJzaW9uX2QgICA6IHsgKiguZ251LnZlcnNpb25fZCkJfQotICAuZ251LnZlcnNpb25fciAgIDogeyAqKC5nbnUudmVyc2lvbl9yKQl9Ci0gIC5yZWwudGV4dCAgICAgIDoKLSAgICB7Ci0gICAgICAqKC5yZWwudGV4dCkKLSAgICAgICooLnJlbC50ZXh0LiopCi0gICAgICAqKC5yZWwuZ251LmxpbmtvbmNlLnQqKQotICAgIH0KLSAgLnJlbGEudGV4dCAgICAgOgotICAgIHsKLSAgICAgICooLnJlbGEudGV4dCkKLSAgICAgICooLnJlbGEudGV4dC4qKQotICAgICAgKigucmVsYS5nbnUubGlua29uY2UudCopCi0gICAgfQotICAucmVsLmRhdGEgICAgICA6Ci0gICAgewotICAgICAgKigucmVsLmRhdGEpCi0gICAgICAqKC5yZWwuZGF0YS4qKQotICAgICAgKigucmVsLmdudS5saW5rb25jZS5kKikKLSAgICB9Ci0gIC5yZWxhLmRhdGEgICAgIDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLmRhdGEpCi0gICAgICAqKC5yZWxhLmRhdGEuKikKLSAgICAgICooLnJlbGEuZ251LmxpbmtvbmNlLmQqKQotICAgIH0KLSAgLnJlbC5yb2RhdGEgICAgOgotICAgIHsKLSAgICAgICooLnJlbC5yb2RhdGEpCi0gICAgICAqKC5yZWwucm9kYXRhLiopCi0gICAgICAqKC5yZWwuZ251LmxpbmtvbmNlLnIqKQotICAgIH0KLSAgLnJlbGEucm9kYXRhICAgOgotICAgIHsKLSAgICAgICooLnJlbGEucm9kYXRhKQotICAgICAgKigucmVsYS5yb2RhdGEuKikKLSAgICAgICooLnJlbGEuZ251LmxpbmtvbmNlLnIqKQotICAgIH0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuaW5pdCAgICAgIDogeyAqKC5yZWwuaW5pdCkJfQotICAucmVsYS5pbml0ICAgICA6IHsgKigucmVsYS5pbml0KQl9Ci0gIC5yZWwuZmluaSAgICAgIDogeyAqKC5yZWwuZmluaSkJfQotICAucmVsYS5maW5pICAgICA6IHsgKigucmVsYS5maW5pKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyBLRUVQICgqKC5pbml0KSkJfQotICAucGx0ICAgICAgOiB7ICooLnBsdCkJfQotICAudGV4dCAgICAgIDoKLSAgewotICAgICooLnRleHQpCi0gICAgKigudGV4dC4qKQotICAgICooLnN0dWIpCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCi0gICAgKiguZ251Lndhcm5pbmcpCi0gICAgKiguZ251LmxpbmtvbmNlLnQqKQotICB9Ci0gIF9ldGV4dCA9IC47Ci0gIFBST1ZJREUgKGV0ZXh0ID0gLik7Ci0gIC5maW5pICAgICAgOiB7IEtFRVAgKCooLmZpbmkpKQkJfSA9MHg5MDkwCi0gIC5yb2RhdGEgICAgOgotICB7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YS4qKQotICAgICooLmdudS5saW5rb25jZS5yKikKLSAgfQotICAucm9kYXRhMSAgIDogeyAqKC5yb2RhdGExKSB9Ci0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLwotICAuID0gQUxJR04oMHgxMDAwKSArICguICYgKDB4MTAwMCAtIDEpKTsKLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhLiopCi0gICAgKiguZ251LmxpbmtvbmNlLmQqKQotICAgIFNPUlQoQ09OU1RSVUNUT1JTKQotICB9Ci0gIC5kYXRhMSAgIDogeyAqKC5kYXRhMSkgfQotICAuY3RvcnMgICAgICAgICA6Ci0gIHsKLSAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBjb25zdHJ1Y3RvcnMsIHNvCi0gICAgICAgd2UgbWFrZSBzdXJlIGl0IGlzIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QgYWN0dWFsbHkgbGluayBhZ2FpbnN0Ci0gICAgICAgY3J0YmVnaW4ubzsgdGhlIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQotICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaAotICAgICAgIGRpcmVjdG9yeSBjcnRiZWdpbi5vIGlzIGluLiAgKi8KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQotICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQotICAgIEtFRVAgKCooLmN0b3JzKSkKLSAgfQotICAuZHRvcnMgICAgICAgICA6Ci0gIHsKLSAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQotICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQotICAgIEtFRVAgKCooLmR0b3JzKSkKLSAgfQotICAuZ290ICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguZ290KSB9Ci0gIC5keW5hbWljICAgICAgIDogeyAqKC5keW5hbWljKSB9Ci0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KLSAgLnNkYXRhICAgICA6IHsgKiguc2RhdGEpICooLnNkYXRhLiopIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5zYnNzICAgICAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH0KLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCi0gICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKLSAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KLSAgIC4gPSBBTElHTigzMiAvIDgpOwotICB9Ci0gIC4gPSBBTElHTigzMiAvIDgpOwotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KLSAgLnN0YWIuZXhjbCAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KLSAgLnN0YWIuZXhjbHN0ciAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KLSAgLnN0YWIuaW5kZXggMCA6IHsgKiguc3RhYi5pbmRleCkgfQotICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9Ci0gIC5jb21tZW50IDAgOiB7ICooLmNvbW1lbnQpIH0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9Ci0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi8KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvbWFpbi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNWM3OGEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKiBUaGlzIGlzIHRoZSBtYWluIHByb2dyYW0gZm9yIHRoZSBzaGFyZWQgbGlicmFyeSB0ZXN0LiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludCBtYWludmFyID0gMTsKLWludCBvdmVycmlkZGVudmFyID0gMjsKLWV4dGVybiBpbnQgc2hsaWJ2YXIxOwotCi1leHRlcm4gaW50IHNobGliX21haW52YXIgKCk7Ci1leHRlcm4gaW50IHNobGliX292ZXJyaWRkZW52YXIgKCk7Ci1leHRlcm4gaW50IHNobGliX3NobGlidmFyMSAoKTsKLWV4dGVybiBpbnQgc2hsaWJfc2hsaWJ2YXIyICgpOwotZXh0ZXJuIGludCBzaGxpYl9zaGxpYmNhbGwgKCk7Ci1leHRlcm4gaW50IHNobGliX21haW5jYWxsICgpOwotZXh0ZXJuIGludCBzaGxpYl9jaGVja2Z1bnB0cjEgKCk7Ci1leHRlcm4gaW50IHNobGliX2NoZWNrZnVucHRyMiAoKTsKLWV4dGVybiBpbnQgKCpzaGxpYl9nZXRmdW5wdHIxICgpKSAoKTsKLWV4dGVybiBpbnQgKCpzaGxpYl9nZXRmdW5wdHIyICgpKSAoKTsKLWV4dGVybiBpbnQgc2hsaWJfY2hlY2sgKCk7Ci1leHRlcm4gaW50IHNobGliX3NobGliY2FsbDIgKCk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0KLWludAotbWFpbl9jYWxsZWQgKCkKLXsKLSAgcmV0dXJuIDY7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIGEgZnVuY3Rpb24gaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotaW50Ci1zaGxpYl9vdmVycmlkZGVuY2FsbDIgKCkKLXsKLSAgcmV0dXJuIDg7Ci19Ci0KLWludAotbWFpbiAoKQotewotICBpbnQgKCpwKSAoKTsKLQotICBwcmludGYgKCJtYWludmFyID09ICVkXG4iLCBtYWludmFyKTsKLSAgcHJpbnRmICgib3ZlcnJpZGRlbnZhciA9PSAlZFxuIiwgb3ZlcnJpZGRlbnZhcik7Ci0gIHByaW50ZiAoInNobGlidmFyMSA9PSAlZFxuIiwgc2hsaWJ2YXIxKTsKLSNpZm5kZWYgWENPRkZfVEVTVAotICBwcmludGYgKCJzaGxpYl9tYWludmFyICgpID09ICVkXG4iLCBzaGxpYl9tYWludmFyICgpKTsKLSAgcHJpbnRmICgic2hsaWJfb3ZlcnJpZGRlbnZhciAoKSA9PSAlZFxuIiwgc2hsaWJfb3ZlcnJpZGRlbnZhciAoKSk7Ci0jZW5kaWYKLSAgcHJpbnRmICgic2hsaWJfc2hsaWJ2YXIxICgpID09ICVkXG4iLCBzaGxpYl9zaGxpYnZhcjEgKCkpOwotICBwcmludGYgKCJzaGxpYl9zaGxpYnZhcjIgKCkgPT0gJWRcbiIsIHNobGliX3NobGlidmFyMiAoKSk7Ci0gIHByaW50ZiAoInNobGliX3NobGliY2FsbCAoKSA9PSAlZFxuIiwgc2hsaWJfc2hsaWJjYWxsICgpKTsKLSNpZm5kZWYgWENPRkZfVEVTVAotICBwcmludGYgKCJzaGxpYl9zaGxpYmNhbGwyICgpID09ICVkXG4iLCBzaGxpYl9zaGxpYmNhbGwyICgpKTsKLSAgcHJpbnRmICgic2hsaWJfbWFpbmNhbGwgKCkgPT0gJWRcbiIsIHNobGliX21haW5jYWxsICgpKTsKLSNlbmRpZgotICBwcmludGYgKCJtYWluX2NhbGxlZCAoKSA9PSAlZFxuIiwgbWFpbl9jYWxsZWQgKCkpOwotICBwcmludGYgKCJzaGxpYl9jaGVja2Z1bnB0cjEgKHNobGliX3NobGlidmFyMSkgPT0gJWRcbiIsCi0JICBzaGxpYl9jaGVja2Z1bnB0cjEgKHNobGliX3NobGlidmFyMSkpOwotI2lmbmRlZiBYQ09GRl9URVNUCi0gIHByaW50ZiAoInNobGliX2NoZWNrZnVucHRyMiAobWFpbl9jYWxsZWQpID09ICVkXG4iLAotCSAgc2hsaWJfY2hlY2tmdW5wdHIyIChtYWluX2NhbGxlZCkpOwotI2VuZGlmCi0gIHAgPSBzaGxpYl9nZXRmdW5wdHIxICgpOwotICBwcmludGYgKCJzaGxpYl9nZXRmdW5wdHIxICgpICIpOwotICBpZiAocCA9PSBzaGxpYl9zaGxpYnZhcjEpCi0gICAgcHJpbnRmICgiPT0iKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIiE9Iik7Ci0gIHByaW50ZiAoIiBzaGxpYl9zaGxpYnZhcjFcbiIpOwotI2lmbmRlZiBYQ09GRl9URVNUCi0gIHAgPSBzaGxpYl9nZXRmdW5wdHIyICgpOwotICBwcmludGYgKCJzaGxpYl9nZXRmdW5wdHIyICgpICIpOwotICBpZiAocCA9PSBtYWluX2NhbGxlZCkKLSAgICBwcmludGYgKCI9PSIpOwotICBlbHNlCi0gICAgcHJpbnRmICgiIT0iKTsKLSAgcHJpbnRmICgiIG1haW5fY2FsbGVkXG4iKTsKLSNlbmRpZgotICBwcmludGYgKCJzaGxpYl9jaGVjayAoKSA9PSAlZFxuIiwgc2hsaWJfY2hlY2sgKCkpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gxLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGYxODNjLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogVGhpcyBpcyBwYXJ0IG9mIHRoZSBzaGFyZWQgbGlicmFyeSBsZCB0ZXN0LiAgVGhpcyBmaWxlIGJlY29tZXMgcGFydAotICAgb2YgYSBzaGFyZWQgbGlicmFyeS4gICovCi0KLS8qIFRoaXMgdmFyaWFibGUgaXMgc3VwcGxpZWQgYnkgdGhlIG1haW4gcHJvZ3JhbS4gICovCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWV4dGVybiBpbnQgbWFpbnZhcjsKLSNlbmRpZgotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LCBhbmQgb3ZlcnJpZGRlbiBieQotICAgdGhlIG1haW4gcHJvZ3JhbS4gICovCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWludCBvdmVycmlkZGVudmFyID0gLTE7Ci0jZW5kaWYKLQotLyogVGhpcyB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi1pbnQgc2hsaWJ2YXIxID0gMzsKLQotLyogVGhpcyB2YXJpYWJsZSBpcyBkZWZpbmVkIGJ5IGFub3RoZXIgb2JqZWN0IGluIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi1leHRlcm4gaW50IHNobGlidmFyMjsKLQotLyogVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgdmFsdWVzIG9mIHRoZSBhYm92ZSB2YXJpYWJsZXMgYXMgc2VlbiBpbgotICAgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotI2lmbmRlZiBYQ09GRl9URVNUCi1pbnQKLXNobGliX21haW52YXIgKCkKLXsKLSAgcmV0dXJuIG1haW52YXI7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBYQ09GRl9URVNUCi1pbnQKLXNobGliX292ZXJyaWRkZW52YXIgKCkKLXsKLSAgcmV0dXJuIG92ZXJyaWRkZW52YXI7Ci19Ci0jZW5kaWYKLQotaW50Ci1zaGxpYl9zaGxpYnZhcjEgKCkKLXsKLSAgcmV0dXJuIHNobGlidmFyMTsKLX0KLQotaW50Ci1zaGxpYl9zaGxpYnZhcjIgKCkKLXsKLSAgcmV0dXJuIHNobGlidmFyMjsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBjYWxscyBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYW5vdGhlciBvYmplY3QgaW4gdGhlCi0gICBzaGFyZWQgbGlicmFyeS4gICovCi0KLWV4dGVybiBpbnQgc2hsaWJfc2hsaWJjYWxsZWQgKCk7Ci0KLWludAotc2hsaWJfc2hsaWJjYWxsICgpCi17Ci0gIHJldHVybiBzaGxpYl9zaGxpYmNhbGxlZCAoKTsKLX0KLQotI2lmbmRlZiBYQ09GRl9URVNUCi0vKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGEgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGlzIG9iamVjdCBpbiB0aGUgc2hhcmVkCi0gICBsaWJyYXJ5LiAgVGhlIG1haW4gcHJvZ3JhbSB3aWxsIG92ZXJyaWRlIHRoZSBjYWxsZWQgZnVuY3Rpb24uICAqLwotCi1leHRlcm4gaW50IHNobGliX292ZXJyaWRkZW5jYWxsMiAoKTsKLQotaW50Ci1zaGxpYl9zaGxpYmNhbGwyICgpCi17Ci0gIHJldHVybiBzaGxpYl9vdmVycmlkZGVuY2FsbDIgKCk7Ci19Ci0KLWludAotc2hsaWJfb3ZlcnJpZGRlbmNhbGwyICgpCi17Ci0gIHJldHVybiA3OwotfQotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gY2FsbHMgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IHRoZSBtYWluIHByb2dyYW0uICAqLwotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWV4dGVybiBpbnQgbWFpbl9jYWxsZWQgKCk7Ci0KLWludAotc2hsaWJfbWFpbmNhbGwgKCkKLXsKLSAgcmV0dXJuIG1haW5fY2FsbGVkICgpOwotfQotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIGEgZnVuY3Rpb24gcG9pbnRlciB0byBzaGxpYl9tYWludmFyLiAgSXQKLSAgIGNvbmZpcm1zIHRoYXQgdGhlIHBvaW50ZXIgY29tcGFyZXMgZXF1YWxseS4gICovCi0KLWludCAKLXNobGliX2NoZWNrZnVucHRyMSAocCkKLSAgICAgaW50ICgqcCkgKCk7Ci17Ci0gIHJldHVybiBwID09IHNobGliX3NobGlidmFyMTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgYSBmdW5jdGlvbiBwb2ludGVyIHRvIG1haW5fY2FsbGVkLiAgSXQKLSAgIGNvbmZpcm1zIHRoYXQgdGhlIHBvaW50ZXIgY29tcGFyZXMgZXF1YWxseS4gICovCi0KLSNpZm5kZWYgWENPRkZfVEVTVAotaW50Ci1zaGxpYl9jaGVja2Z1bnB0cjIgKHApCi0gICAgIGludCAoKnApICgpOwotewotICByZXR1cm4gcCA9PSBtYWluX2NhbGxlZDsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHNobGliX21haW52YXIuICAqLwotCi1pbnQKLSgqc2hsaWJfZ2V0ZnVucHRyMSAoKSkgKCkKLXsKLSAgcmV0dXJuIHNobGliX3NobGlidmFyMTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBtYWluX2NhbGxlZC4gICovCi0KLSNpZm5kZWYgWENPRkZfVEVTVAotaW50Ci0oKnNobGliX2dldGZ1bnB0cjIgKCkpICgpCi17Ci0gIHJldHVybiBtYWluX2NhbGxlZDsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhhdCBjb25zdGFudCBkYXRhIGFuZCBsb2NhbCBmdW5jdGlvbnMKLSAgIHdvcmsuICAqLwotCi0jaWZuZGVmIF9fU1REQ19fCi0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotc3RhdGljIGludCBpID0gNjsKLXN0YXRpYyBjb25zdCBjaGFyICpzdHIgPSAiSGVsbG8sIHdvcmxkXG4iOwotCi1pbnQKLXNobGliX2NoZWNrICgpCi17Ci0gIGNvbnN0IGNoYXIgKnMxLCAqczI7Ci0KLSAgaWYgKGkgIT0gNikKLSAgICByZXR1cm4gMDsKLQotICAvKiBUbyBpc29sYXRlIHRoZSB0ZXN0LCBkb24ndCByZWx5IG9uIGFueSBleHRlcm5hbCBmdW5jdGlvbnMsIHN1Y2gKLSAgICAgYXMgc3RyY21wLiAgKi8KLSAgczEgPSAiSGVsbG8sIHdvcmxkXG4iOwotICBzMiA9IHN0cjsKLSAgd2hpbGUgKCpzMSAhPSAnXDAnKQotICAgIGlmICgqczErKyAhPSAqczIrKykKLSAgICAgIHJldHVybiAwOwotICBpZiAoKnMyICE9ICdcMCcpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKHNobGliX3NobGlidmFyMSAoKSAhPSAzKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaDIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxM2E0ZTAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaDIuYworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qIFRoaXMgaXMgcGFydCBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgbGQgdGVzdC4gIFRoaXMgZmlsZSBiZWNvbWVzIHBhcnQKLSAgIG9mIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIGRlZmluZWQgaGVyZSwgYW5kIHJlZmVyZW5jZWQgYnkgYW5vdGhlciBmaWxlIGluCi0gICB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotaW50IHNobGlidmFyMiA9IDQ7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFub3RoZXIgZmlsZSBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi1pbnQKLXNobGliX3NobGliY2FsbGVkICgpCi17Ci0gIHJldHVybiA1OwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZGF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGVlMzdmLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmRhdAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLW1haW52YXIgPT0gMQotb3ZlcnJpZGRlbnZhciA9PSAyCi1zaGxpYnZhcjEgPT0gMwotc2hsaWJfbWFpbnZhciAoKSA9PSAxCi1zaGxpYl9vdmVycmlkZGVudmFyICgpID09IDIKLXNobGliX3NobGlidmFyMSAoKSA9PSAzCi1zaGxpYl9zaGxpYnZhcjIgKCkgPT0gNAotc2hsaWJfc2hsaWJjYWxsICgpID09IDUKLXNobGliX3NobGliY2FsbDIgKCkgPT0gOAotc2hsaWJfbWFpbmNhbGwgKCkgPT0gNgotbWFpbl9jYWxsZWQgKCkgPT0gNgotc2hsaWJfY2hlY2tmdW5wdHIxIChzaGxpYl9zaGxpYnZhcjEpID09IDEKLXNobGliX2NoZWNrZnVucHRyMiAobWFpbl9jYWxsZWQpID09IDEKLXNobGliX2dldGZ1bnB0cjEgKCkgPT0gc2hsaWJfc2hsaWJ2YXIxCi1zaGxpYl9nZXRmdW5wdHIyICgpID09IG1haW5fY2FsbGVkCi1zaGxpYl9jaGVjayAoKSA9PSAxCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoYXJlZC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoYXJlZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYjBhOGMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgbGQtc2hhcmVkIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciAoaWFuQGN5Z251cy5jb20pCi0jCi0KLSMgTWFrZSBzdXJlIHRoYXQgbGQgY2FuIGdlbmVyYXRlIEVMRiBzaGFyZWQgbGlicmFyaWVzLgotIyBOb3RlIHRoYXQgbGlua2luZyBhZ2FpbnN0IEVMRiBzaGFyZWQgbGlicmFyaWVzIGlzIHRlc3RlZCBieSB0aGUKLSMgYm9vdHN0cmFwIHRlc3QuCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBpZiBsZCBnZW5lcmF0ZXMgbmF0aXZlIGV4ZWN1dGFibGVzLgotaWYgIVtpc25hdGl2ZV0gdGhlbiB7cmV0dXJufQotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gb24gYSBjb3VwbGUgb2YgRUxGIHBsYXRmb3Jtcy4KLSMgU3F1YXJlIGJyYWNrZXQgZXhwcmVzc2lvbnMgc2VlbSB0byBjb25mdXNlIGlzdGFyZ2V0LgotaWYgeyAhW2lzdGFyZ2V0IGkzODYtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNDg2LSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTU4Ni0qLXN5c3Y0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGkzODYtKi11bml4d2FyZV0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk0ODYtKi11bml4d2FyZV0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk1ODYtKi11bml4d2FyZV0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGkzODYtKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTQ4Ni0qLWVsZipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNTg2LSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGkzODYtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNDg2LSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTU4Ni0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IG02OGstKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBtaXBzKi0qLWlyaXg1Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgcG93ZXJwYy0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBzcGFyYyotKi1lbGZdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBzcGFyYyotKi1zb2xhcmlzMipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBzcGFyYyotKi1zdW5vczQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotICAgIHJldHVybgotfQotCi1pZiB7IFtpc3RhcmdldCAqLSotbGludXgqYW91dCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0ICotKi1saW51eCpvbGRsZCpdIH0gewotICAgIHJldHVybgotfQotCi1zZXQgdG1wZGlyIHRtcGRpcgotc2V0IFNIQ0ZMQUcgIiIKLQotaWYgeyBbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotCi0gICAgIyBBSVggc2hhcmVkIGxpYnJhcmllcyBkbyBub3Qgc2VlbSB0byBzdXBwb3J0IHVzZWZ1bCBmZWF0dXJlcywKLSAgICAjIGxpa2Ugb3ZlcnJpZGluZyB0aGUgc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb24gb3IgbGV0dGluZyB0aGUKLSAgICAjIHNoYXJlZCBsaWJyYXJ5IHJlZmVyIHRvIG9iamVjdHMgZGVmaW5lZCBpbiB0aGUgbWFpbiBwcm9ncmFtLiAgV2UKLSAgICAjIGF2b2lkIHRlc3RpbmcgdGhvc2UgZmVhdHVyZXMuCi0gICAgc2V0IFNIQ0ZMQUcgIi1EWENPRkZfVEVTVCIKLQotICAgICMgVGhlIEFJWCAzLjIuNSBsb2FkZXIgYXBwZWFycyB0byByYW5kb21seSBmYWlsIHdoZW4gbG9hZGluZwotICAgICMgc2hhcmVkIGxpYnJhcmllcyBmcm9tIE5TRiBtb3VudGVkIHBhcnRpdGlvbnMsIHNvIHdlIGF2b2lkIGFueQotICAgICMgcG90ZW50aWFsIHByb2JsZW1zIGJ5IHVzaW5nIGEgbG9jYWwgZGlyZWN0b3J5LgotICAgIGNhdGNoIHtleGVjIC9iaW4vc2ggLWMgImVjaG8gJCQifSBwaWQKLSAgICBzZXQgdG1wZGlyIC91c3IvdG1wL2xkLiRwaWQKLSAgICBjYXRjaCAiZXhlYyBta2RpciAkdG1wZGlyIiBleGVjX3N0YXR1cwotCi0gICAgIyBPbiBBSVgsIHdlIG5lZWQgdG8gZXhwbGljaXRseSBleHBvcnQgdGhlIHN5bWJvbHMgdGhlIHNoYXJlZAotICAgICMgbGlicmFyeSBpcyBnb2luZyB0byBwcm92aWRlLCBhbmQgbmVlZC4KLSAgICBzZXQgZmlsZSBbb3BlbiAkdG1wZGlyL3hjb2ZmLmV4cCB3XQotICAgIHB1dHMgJGZpbGUgc2hsaWJ2YXIxCi0gICAgcHV0cyAkZmlsZSBzaGxpYnZhcjIKLSAgICBwdXRzICRmaWxlIHNobGliX3NobGlidmFyMQotICAgIHB1dHMgJGZpbGUgc2hsaWJfc2hsaWJ2YXIyCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9zaGxpYmNhbGwKLSAgICBwdXRzICRmaWxlIHNobGliX3NobGliY2FsbGVkCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9jaGVja2Z1bnB0cjEKLSAgICBwdXRzICRmaWxlIHNobGliX2dldGZ1bnB0cjEKLSAgICBwdXRzICRmaWxlIHNobGliX2NoZWNrCi0gICAgY2xvc2UgJGZpbGUKLX0KLQotIyBUaGUgdGVzdCBwcm9jZWR1cmUuCi1wcm9jIHNoYXJlZF90ZXN0IHsgcHJvZ25hbWUgdGVzdG5hbWUgbWFpbiBzaDEgc2gyIGRhdCBhcmdzIH0gewotICAgIGdsb2JhbCBsZAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGV4ZWNfb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIGdsb2JhbCB0bXBkaXIKLQotICAgIGlmIFtsbGVuZ3RoICRhcmdzXSB7IHNldCBzaGxkZmxhZ3MgW2xpbmRleCAkYXJncyAwXSB9IGVsc2UgeyBzZXQgc2hsZGZsYWdzICIiIH0KLQotICAgICMgQnVpbGQgdGhlIHNoYXJlZCBsaWJyYXJ5LgotICAgICMgT24gQUlYLCB3ZSBuZWVkIHRvIHVzZSBhbiBleHBvcnQgZmlsZS4KLSAgICBzZXQgc2hhcmVkIC1zaGFyZWQKLSAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0Jc2V0IHNoYXJlZCAiLWJNOlNSRSAtYkU6JHRtcGRpci94Y29mZi5leHAiCi0gICAgfQotICAgIGlmIHshW2xkX3NpbXBsZV9saW5rICRsZCAkdG1wZGlyLyRwcm9nbmFtZS5zbyAiJHNoYXJlZCAkc2hsZGZsYWdzICR0bXBkaXIvJHNoMSAkdG1wZGlyLyRzaDIiXX0gewotICAgICAgICBmYWlsICIkdGVzdG5hbWUiCi0gICAgCXJldHVybgotICAgIH0KLQotICAgICMgTGluayBhZ2FpbnN0IHRoZSBzaGFyZWQgbGlicmFyeS4gIFVzZSAtcnBhdGggc28gdGhhdCB0aGUKLSAgICAjIGR5bmFtaWMgbGlua2VyIGNhbiBsb2NhdGUgdGhlIHNoYXJlZCBsaWJyYXJ5IGF0IHJ1bnRpbWUuCi0gICAgIyBPbiBBSVgsIHdlIG11c3QgaW5jbHVkZSAvbGliIGluIC1ycGF0aCwgYXMgb3RoZXJ3aXNlIHRoZSBsb2FkZXIKLSAgICAjIGNhbiBub3QgZmluZCAtbGMuCi0gICAgc2V0IHJwYXRoICR0bXBkaXIKLSAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0Jc2V0IHJwYXRoIC9saWI6JHRtcGRpcgotICAgIH0KLSAgICBpZiAhW2xkX2xpbmsgJGxkICR0bXBkaXIvJHByb2duYW1lICItcnBhdGggJHJwYXRoICR0bXBkaXIvJG1haW4gJHRtcGRpci8kcHJvZ25hbWUuc28iXSB7Ci0gICAgCWZhaWwgIiR0ZXN0bmFtZSIKLSAgICAJcmV0dXJuCi0gICAgfQotCi0gICAgIyBSdW4gdGhlIHJlc3VsdGluZyBwcm9ncmFtCi0gICAgc2VuZF9sb2cgIiR0bXBkaXIvJHByb2duYW1lID4kdG1wZGlyLyRwcm9nbmFtZS5vdXRcbiIKLSAgICB2ZXJib3NlICIkdG1wZGlyLyRwcm9nbmFtZSA+JHRtcGRpci8kcHJvZ25hbWUub3V0IgotICAgIGNhdGNoICJleGVjICR0bXBkaXIvJHByb2duYW1lID4kdG1wZGlyLyRwcm9nbmFtZS5vdXQiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCWZhaWwgIiR0ZXN0bmFtZSIKLSAgICAJcmV0dXJuCi0gICAgfQotCi0gICAgc2VuZF9sb2cgImRpZmYgJHRtcGRpci8kcHJvZ25hbWUub3V0ICRzcmNkaXIvJHN1YmRpci8kZGF0LmRhdFxuIgotICAgIHZlcmJvc2UgImRpZmYgJHRtcGRpci8kcHJvZ25hbWUub3V0ICRzcmNkaXIvJHN1YmRpci8kZGF0LmRhdCIKLSAgICBjYXRjaCAiZXhlYyBkaWZmICR0bXBkaXIvJHByb2duYW1lLm91dCAkc3JjZGlyLyRzdWJkaXIvJGRhdC5kYXQiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLSAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XX0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQlmYWlsICIkdGVzdG5hbWUiCi0gICAgICAgIHJldHVybgotICAgIH0KLQotICAgIHBhc3MgIiR0ZXN0bmFtZSIKLX0KLQotaWYgW2lzdGFyZ2V0IG1pcHMqLSotKl0gewotICAgIHNldCBwaWNmbGFnICIiCi19IGVsc2UgewotICAgICMgVW5mb3J0dW5hdGVseSwgdGhlIGdjYyBhcmd1bWVudCBpcyAtZnBpYyBhbmQgdGhlIGNjIGFyZ3VtZW50IGlzCi0gICAgIyAtS1BJQy4gIFdlIGhhdmUgdG8gdHJ5IGJvdGguCi0gICAgc2V0IHBpY2ZsYWcgIi1mcGljIgotICAgIHNlbmRfbG9nICIkQ0MgJHBpY2ZsYWdcbiIKLSAgICB2ZXJib3NlICIkQ0MgJHBpY2ZsYWciCi0gICAgY2F0Y2ggImV4ZWMgJENDICRwaWNmbGFnIiBleGVjX291dHB1dAotICAgIHNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLSAgICB2ZXJib3NlICItLSIgIiRleGVjX291dHB1dCIKLSAgICBpZiB7IFtzdHJpbmcgbWF0Y2ggIippbGxlZ2FsIG9wdGlvbioiICRleGVjX291dHB1dF0gXAotCSB8fCBbc3RyaW5nIG1hdGNoICIqb3B0aW9uIGlnbm9yZWQqIiAkZXhlY19vdXRwdXRdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKnVucmVjb2duaXplZCBvcHRpb24qIiAkZXhlY19vdXRwdXRdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKnBhc3NlZCB0byBsZCoiICRleGVjX291dHB1dF0gfSB7Ci0JaWYgW2lzdGFyZ2V0ICotKi1zdW5vczQqXSB7Ci0JICAgIHNldCBwaWNmbGFnICItcGljIgotCX0gZWxzZSB7Ci0JICAgIHNldCBwaWNmbGFnICItS1BJQyIKLQl9Ci0gICAgfQotfQotdmVyYm9zZSAiVXNpbmcgJHBpY2ZsYWcgdG8gY29tcGlsZSBQSUMgY29kZSIKLQotIyBDb21waWxlIHRoZSBtYWluIHByb2dyYW0uCi1pZiAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHIiAkc3JjZGlyLyRzdWJkaXIvbWFpbi5jICR0bXBkaXIvbWFpbm5wLm9dIHsKLSAgICB1bnJlc29sdmVkICJzaGFyZWQgKG5vbiBQSUMpIgotICAgIHVucmVzb2x2ZWQgInNoYXJlZCIKLX0gZWxzZSB7Ci0gICAgIyBUaGUgc2hhcmVkIGxpYnJhcnkgaXMgY29tcG9zZWQgb2YgdHdvIGZpbGVzLiAgRmlyc3QgY29tcGlsZSB0aGVtCi0gICAgIyB3aXRob3V0IHVzaW5nIC1mcGljLiAgVGhhdCBzaG91bGQgd29yayBvbiBhbiBFTEYgc3lzdGVtLAotICAgICMgYWx0aG91Z2ggaXQgd2lsbCBiZSBsZXNzIGVmZmljaWVudCBiZWNhdXNlIHRoZSBkeW5hbWljIGxpbmtlcgotICAgICMgd2lsbCBuZWVkIHRvIGRvIG1vcmUgcmVsb2NhdGlvbiB3b3JrLiAgSG93ZXZlciwgbm90ZSB0aGF0IG5vdAotICAgICMgdXNpbmcgLWZwaWMgd2lsbCBjYXVzZSBzb21lIG9mIHRoZSB0ZXN0cyB0byByZXR1cm4gZGlmZmVyZW50Ci0gICAgIyByZXN1bHRzLgotICAgIGlmIHsgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAkU0hDRkxBRyIgJHNyY2Rpci8kc3ViZGlyL3NoMS5jICR0bXBkaXIvc2gxbnAub10KLQkgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAkU0hDRkxBRyIgJHNyY2Rpci8kc3ViZGlyL3NoMi5jICR0bXBkaXIvc2gybnAub10gfSB7Ci0JdW5yZXNvbHZlZCAic2hhcmVkIChub24gUElDKSIKLSAgICB9IGVsc2UgeyBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0Jc2hhcmVkX3Rlc3Qgc2hucCAic2hhcmVkIChub25QSUMpIiBtYWlubnAubyBzaDFucC5vIHNoMm5wLm8geGNvZmYKLSAgICB9IGVsc2UgewotCSMgU3VuT1Mgbm9uIFBJQyBzaGFyZWQgbGlicmFyaWVzIGRvbid0IHBlcm1pdCBzb21lIGNhc2VzIG9mCi0JIyBvdmVycmlkaW5nLgotCXNldHVwX3hmYWlsICIqLSotc3Vub3M0KiIKLQlzaGFyZWRfdGVzdCBzaG5wICJzaGFyZWQgKG5vbiBQSUMpIiBtYWlubnAubyBzaDFucC5vIHNoMm5wLm8gc2hhcmVkCi0KLQkjIFRlc3QgRUxGIHNoYXJlZCBsaWJyYXJ5IHJlbG9jYXRpb25zIHdpdGggYSBub24temVybyBsb2FkCi0JIyBhZGRyZXNzIGZvciB0aGUgbGlicmFyeS4gIE5lYXIgYXMgSSBjYW4gdGVsbCwgdGhlIFJfKl9SRUxBVElWRQotCSMgcmVsb2NhdGlvbnMgZm9yIHZhcmlvdXMgdGFyZ2V0cyBhcmUgYnJva2VuIGluIHRoZSBjYXNlIHdoZXJlCi0JIyB0aGUgbG9hZCBhZGRyZXNzIGlzIG5vdCB6ZXJvICh3aGljaCBpcyB0aGUgZGVmYXVsdCkuCi0Jc2V0dXBfeGZhaWwgIiotKi1zdW5vczQqIgotCXNldHVwX3hmYWlsICIqLSotbGludXgqbGliYzEiCi0Jc2hhcmVkX3Rlc3Qgc2hucCAic2hhcmVkIChub24gUElDLCBsb2FkIG9mZnNldCkiIFwKLQkJbWFpbm5wLm8gc2gxbnAubyBzaDJucC5vIHNoYXJlZCBcCi0JCSItVCAkc3JjZGlyLyRzdWJkaXIvZWxmLW9mZnNldC5sZCIKLSAgICB9IH0KLQotICAgICMgTm93IGNvbXBpbGUgdGhlIGNvZGUgdXNpbmcgLWZwaWMuCi0KLSAgICBpZiB7ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgJFNIQ0ZMQUcgJHBpY2ZsYWciICRzcmNkaXIvJHN1YmRpci9zaDEuYyAkdG1wZGlyL3NoMXAub10gCi0JIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgJFNIQ0ZMQUcgJHBpY2ZsYWciICRzcmNkaXIvJHN1YmRpci9zaDIuYyAkdG1wZGlyL3NoMnAub10gfSB7Ci0JdW5yZXNvbHZlZCAic2hhcmVkIgotICAgIH0gZWxzZSB7Ci0JIyBTdW5PUyBjYW4gbm90IGNvbXBhcmUgZnVuY3Rpb24gcG9pbnRlcnMgY29ycmVjdGx5Ci0JaWYgW2lzdGFyZ2V0ICIqLSotc3Vub3M0KiJdIHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2hwICJzaGFyZWQiIG1haW5ucC5vIHNoMXAubyBzaDJwLm8gc3VuNAotCX0gZWxzZSB7IGlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2hwICJzaGFyZWQiIG1haW5ucC5vIHNoMXAubyBzaDJwLm8geGNvZmYKLQl9IGVsc2UgewotCSAgICBzaGFyZWRfdGVzdCBzaHAgInNoYXJlZCIgbWFpbm5wLm8gc2gxcC5vIHNoMnAubyBzaGFyZWQKLQl9IH0KLSAgICB9Ci19Ci0KLSMgTm93IGRvIHRoZSBzYW1lIHRlc3RzIGFnYWluLCBidXQgdGhpcyB0aW1lIGNvbXBpbGUgbWFpbi5jIFBJQy4KLWlmICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgJFNIQ0ZMQUcgJHBpY2ZsYWciICRzcmNkaXIvJHN1YmRpci9tYWluLmMgJHRtcGRpci9tYWlucC5vXSB7Ci0gICAgdW5yZXNvbHZlZCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiCi0gICAgdW5yZXNvbHZlZCAic2hhcmVkIChQSUMgbWFpbikiCi19IGVsc2UgewotICAgIGlmIHsgW2ZpbGUgZXhpc3RzICR0bXBkaXIvc2gxbnAubyBdICYmIFsgZmlsZSBleGlzdHMgJHRtcGRpci9zaDJucC5vIF0gfSB7Ci0gICAgICAgIGlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2htcG5wICJzaGFyZWQgKFBJQyBtYWluLCBub24gUElDIHNvKSIgbWFpbnAubyBzaDFucC5vIHNoMm5wLm8geGNvZmYKLQl9IGVsc2UgewotCSAgICAjIFN1bk9TIG5vbiBQSUMgc2hhcmVkIGxpYnJhcmllcyBkb24ndCBwZXJtaXQgc29tZSBjYXNlcyBvZgotCSAgICAjIG92ZXJyaWRpbmcuCi0JICAgIHNldHVwX3hmYWlsICIqLSotc3Vub3M0KiIKLQkgICAgc2hhcmVkX3Rlc3Qgc2htcG5wICJzaGFyZWQgKFBJQyBtYWluLCBub24gUElDIHNvKSIgbWFpbnAubyBzaDFucC5vIHNoMm5wLm8gc2hhcmVkCi0JfQotICAgIH0gZWxzZSB7Ci0JdW5yZXNvbHZlZCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiCi0gICAgfQotCi0gICAgaWYgeyBbZmlsZSBleGlzdHMgJHRtcGRpci9zaDFwLm8gXSAmJiBbIGZpbGUgZXhpc3RzICR0bXBkaXIvc2gycC5vIF0gfSB7Ci0gICAgICAgIGlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2htcHAgInNoYXJlZCAoUElDIG1haW4pIiBtYWlucC5vIHNoMXAubyBzaDJwLm8geGNvZmYKLQl9IGVsc2UgewotCSAgICBzaGFyZWRfdGVzdCBzaG1wcCAic2hhcmVkIChQSUMgbWFpbikiIG1haW5wLm8gc2gxcC5vIHNoMnAubyBzaGFyZWQKLQl9Ci0gICAgfSBlbHNlIHsKLQl1bnJlc29sdmVkICJzaGFyZWQgKFBJQyBtYWluKSIKLSAgICB9Ci19Ci0KLWlmIHsgW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKLSAgICAjIFJlbW92ZSB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KLSAgICBjYXRjaCAiZXhlYyBybSAtcmYgJHRtcGRpciIgZXhlY19zdGF0dXMKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc3VuNC5kYXQgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3N1bjQuZGF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTBkODdkLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc3VuNC5kYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1tYWludmFyID09IDEKLW92ZXJyaWRkZW52YXIgPT0gMgotc2hsaWJ2YXIxID09IDMKLXNobGliX21haW52YXIgKCkgPT0gMQotc2hsaWJfb3ZlcnJpZGRlbnZhciAoKSA9PSAyCi1zaGxpYl9zaGxpYnZhcjEgKCkgPT0gMwotc2hsaWJfc2hsaWJ2YXIyICgpID09IDQKLXNobGliX3NobGliY2FsbCAoKSA9PSA1Ci1zaGxpYl9zaGxpYmNhbGwyICgpID09IDgKLXNobGliX21haW5jYWxsICgpID09IDYKLW1haW5fY2FsbGVkICgpID09IDYKLXNobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSA9PSAwCi1zaGxpYl9jaGVja2Z1bnB0cjIgKG1haW5fY2FsbGVkKSA9PSAxCi1zaGxpYl9nZXRmdW5wdHIxICgpICE9IHNobGliX3NobGlidmFyMQotc2hsaWJfZ2V0ZnVucHRyMiAoKSA9PSBtYWluX2NhbGxlZAotc2hsaWJfY2hlY2sgKCkgPT0gMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC94Y29mZi5kYXQgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3hjb2ZmLmRhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwOWQ5Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3hjb2ZmLmRhdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLW1haW52YXIgPT0gMQotb3ZlcnJpZGRlbnZhciA9PSAyCi1zaGxpYnZhcjEgPT0gMwotc2hsaWJfc2hsaWJ2YXIxICgpID09IDMKLXNobGliX3NobGlidmFyMiAoKSA9PSA0Ci1zaGxpYl9zaGxpYmNhbGwgKCkgPT0gNQotbWFpbl9jYWxsZWQgKCkgPT0gNgotc2hsaWJfY2hlY2tmdW5wdHIxIChzaGxpYl9zaGxpYnZhcjEpID09IDEKLXNobGliX2dldGZ1bnB0cjEgKCkgPT0gc2hsaWJfc2hsaWJ2YXIxCi1zaGxpYl9jaGVjayAoKSA9PSAxCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2RlOTc3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byB0aGUgUy1yZWNvcmQgZm9ybWF0LiAgKi8KLQotZXh0ZXJuIGludCBlMTsKLWV4dGVybiBpbnQgZTI7Ci1pbnQgaTsKLWludCBqID0gMTsKLXN0YXRpYyBpbnQgazsKLXN0YXRpYyBpbnQgbCA9IDE7Ci1zdGF0aWMgY2hhciBhYltdID0gIlRoaXMgaXMgYSBzdHJpbmcgY29uc3RhbnQiOwotCi1leHRlcm4gaW50IGZuMSAoKTsKLWV4dGVybiBpbnQgZm4yICgpOwotCi1pbnQKLW1haW4gKCkKLXsKLSAgZm4xIChhYik7Ci0gIGZuMiAoInN0YXRpYyBzdHJpbmcgY29uc3RhbnQiKTsKLSAgcmV0dXJuIGUxICsgZTIgKyBpICsgaiArIGsgKyBsOwotfQotCi12b2lkCi1fX21haW4gKCkKLXsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzZjZmEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbnRvIHRoZSBTLXJlY29yZCBmb3JtYXQuICAqLwotCi1pbnQgZTE7Ci1pbnQgZTIgPSAxOwotCi1pbnQKLWZuMSAocykKLSAgICAgY2hhciAqczsKLXsKLSAgcmV0dXJuIHNbZTFdOwotfQotCi1pbnQKLWZuMiAocykKLSAgICAgY2hhciAqczsKLXsKLSAgcmV0dXJuIHNbZTJdOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IzLmNjIGIvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmU1Y2M4Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMy5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vLyBUaGlzIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbnRvIHRoZSBTLXJlY29yZCBmb3JtYXQuCi0KLSNkZWZpbmUgRk9PX01TR19MRU4gODAKLQotY2xhc3MgRm9vIHsKLSAgICBzdGF0aWMgaW50IGZvb3M7Ci0gICAgaW50IGk7Ci0gICAgc3RhdGljIGNvbnN0IGludCBsZW4gPSBGT09fTVNHX0xFTjsKLSAgICBjaGFyIG1lc3NhZ2VbbGVuXTsKLXB1YmxpYzoKLSAgICBzdGF0aWMgdm9pZCBpbml0X2ZvbyAoKTsKLSAgICBzdGF0aWMgaW50IG5iX2Zvb3MoKSB7IHJldHVybiBmb29zOyB9Ci0gICAgRm9vKCk7Ci0gICAgRm9vKCBjaGFyKiBtZXNzYWdlKTsKLSAgICBGb28oY29uc3QgRm9vJik7Ci0gICAgRm9vICYgb3BlcmF0b3I9IChjb25zdCBGb28mKTsKLSAgICB+Rm9vICgpOwotfTsKLQotc3RhdGljIEZvbyBzdGF0aWNfZm9vKCAic3RhdGljX2ZvbyIpOwotCi1pbnQKLW1haW4gKCkKLXsKLSAgRm9vIGF1dG9tYXRpY19mb28oICJhdXRvbWF0aWNfZm9vIik7Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi10ZXJtaW5hdGUodm9pZCkKLXsKLSAgLyogVGhpcyByZWN1cnNpdmUgY2FsbCBwcmV2ZW50cyBhIGNvbXBpbGVyIHdhcm5pbmcgdGhhdCB0aGUgbm9yZXR1cm4KLSAgICAgZnVuY3Rpb24gdGVybWluYXRlIGFjdHVhbGx5IGRvZXMgcmV0dXJuLiAgKi8KLSAgdGVybWluYXRlICgpOwotfQotCi1leHRlcm4gIkMiIHsKLXZvaWQKLV9fbWFpbiAoKQotewotfQotCi12b2lkCi1fX2J1aWx0aW5fZGVsZXRlICgpCi17Ci19Ci0KLXZvaWQKLV9fYnVpbHRpbl9uZXcgKCkKLXsKLX0KLQotdm9pZAotX190aHJvdyAoKQotewotfQotCi12b2lkCi1fX3Rlcm1pbmF0ZSAoKQotewotfQotCi12b2lkICpfX2VoX3BjOwotCi12b2lkICoqKgotX19nZXRfZHluYW1pY19oYW5kbGVyX2NoYWluICgpCi17Ci0gIHJldHVybiAwOwotfQotCi12b2lkICoKLV9fZ2V0X2VoX2NvbnRleHQgKCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLX0KLQotaW50IEZvbzo6Zm9vcyA9IDA7Ci0KLXZvaWQgRm9vOjppbml0X2ZvbyAoKQotewotICBmb29zID0gODA7Ci19Ci0KLUZvbzo6Rm9vICgpCi17Ci0gIGkgPSArK2Zvb3M7Ci19Ci0KLUZvbzo6Rm9vIChjaGFyKikKLXsKLSAgaSA9ICsrZm9vczsKLX0KLQotRm9vOjpGb28gKGNvbnN0IEZvbyYgZm9vKQotewotICBpID0gKytmb29zOwotICBmb3IgKGludCBrID0gMDsgayA8IEZPT19NU0dfTEVOOyBrKyspCi0gICAgbWVzc2FnZVtrXSA9IGZvby5tZXNzYWdlW2tdOwotfQotCi1Gb28mIEZvbzo6b3BlcmF0b3I9IChjb25zdCBGb28mIGZvbykKLXsKLSAgZm9yIChpbnQgayA9IDA7IGsgPCBGT09fTVNHX0xFTjsgaysrKQotICAgIG1lc3NhZ2Vba10gPSBmb28ubWVzc2FnZVtrXTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1Gb286On5Gb28gKCkKLXsKLSAgZm9vcy0tOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3JlYy5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcmVjLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzOGEwMC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcmVjLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0jIFRlc3QgbGlua2luZyBkaXJlY3RseSB0byBTLXJlY29yZHMuCi0jIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotIyBQdWJsaWMgZG9tYWluLgotCi0jIEdldCB0aGUgb2Zmc2V0IGZyb20gYW4gUy1yZWNvcmQgbGluZSB0byB0aGUgc3RhcnQgb2YgdGhlIGRhdGEuCi0KLXByb2Mgc3JlY19vZmYgeyBsIH0gewotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIlMxKiIgJGxdIHsKLQlyZXR1cm4gOAotICAgIH0gZWxzZSB7IGlmIFtzdHJpbmcgbWF0Y2ggIlMyKiIgJGxdIHsKLQlyZXR1cm4gMTAKLSAgICB9IGVsc2UgeyBpZiBbc3RyaW5nIG1hdGNoICJTMyoiICRsXSB7Ci0JcmV0dXJuIDEyCi0gICAgfSBlbHNlIHsKLQlyZXR1cm4gLTEKLSAgICB9IH0gfQotfQotCi0jIFNlZSBpZiBhbiBTLXJlY29yZCBsaW5lIGNvbnRhaW5zIG9ubHkgemVybyBkYXRhLgotCi1wcm9jIHNyZWNfemVybyB7IGwgfSB7Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiU1xbMDc4OVxdKiIgJGxdIHsKLQlyZXR1cm4gMQotICAgIH0KLQotICAgICMgU3RyaXAgdGhlIGFkZHJlc3MgYW5kIGNoZWNrc3VtLgotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIlNcWzEyM1xdKiIgJGxdIHsKLQlzZXQgbCBbc3RyaW5nIHJhbmdlICRsIFtzcmVjX29mZiAkbF0gW2V4cHIgW3N0cmluZyBsZW5ndGggJGxdIC0gM11dCi0gICAgfSBlbHNlIHsKLQlyZXR1cm4gMAotICAgIH0KLQotICAgICMgVGhlIHJlc3QgbXVzdCBiZSB6ZXJvLgotICAgIHJldHVybiBbc3RyaW5nIG1hdGNoICIiIFtzdHJpbmcgdHJpbSAkbCAiMCJdXQotfQotCi0jIEdldCB0aGUgYWRkcmVzcyBvZiBhbiBTLXJlY29yZCBsaW5lLgotCi1wcm9jIHNyZWNfYWRkciB7IGwgfSB7Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiU1xbMTIzXF0qIiAkbF0gewotCXNldCBhZGRyIFtzdHJpbmcgcmFuZ2UgJGwgNCBbZXhwciBbc3JlY19vZmYgJGxdIC0gMV1dCi0gICAgfSBlbHNlIHsKLQlyZXR1cm4gLTEKLSAgICB9Ci0KLSAgICByZXR1cm4gIjB4JGFkZHIiCi19Ci0KLSMgR2V0IHRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiBhbiBTLXJlY29yZCBsaW5lLgotCi1wcm9jIHNyZWNfbGVuIHsgbCB9IHsKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiU1xbMTIzXF0qIiAkbF0gewotCXJldHVybiAwCi0gICAgfQotCi0gICAgcmV0dXJuIFtleHByICIweFtzdHJpbmcgcmFuZ2UgJGwgMiAzXSIgLSAoW3NyZWNfb2ZmICRsXSAtIDQpIC8gMiAtIDFdCi19Ci0KLSMgRXh0cmFjdCBieXRlcyBmcm9tIGFuIFMtcmVjb3JkIGxpbmUuCi0KLXByb2Mgc3JlY19leHRyYWN0IHsgbCBzdGFydCBsZW4gfSB7Ci0gICAgc2V0IG9mZiBbc3JlY19vZmYgJGxdCi0gICAgc2V0IHJsZW4gW3NyZWNfbGVuICRsXQotICAgIHNldCBzdG9wIFtleHByICRzdGFydCArICRsZW5dCi0gICAgaWYgeyAkc3RvcCA+ICRybGVuIH0gewotCXNldCBzdG9wIFtleHByICRybGVuXQotICAgIH0KLSAgICBzZXQgc3RhcnQgW2V4cHIgJHN0YXJ0ICogMiArICRvZmZdCi0gICAgc2V0IHN0b3AgW2V4cHIgJHN0b3AgKiAyICsgJG9mZiAtIDFdCi0gICAgcmV0dXJuIFtzdHJpbmcgcmFuZ2UgJGwgJHN0YXJ0ICRzdG9wXQotfQotCi0jIFNlZSBpZiBhIHJhbmdlIG9mIGJ5dGVzIGluIGFuIFMtcmVjb3JkIGxpbmUgaXMgYWxsIHplcm9lcy4KLQotcHJvYyBzcmVjX3plcm9fcmFuZ2UgeyBsIHN0YXJ0IGxlbiB9IHsKLSAgICByZXR1cm4gW3N0cmluZyBtYXRjaCAiIiBbc3RyaW5nIHRyaW0gW3NyZWNfZXh0cmFjdCAkbCAkc3RhcnQgJGxlbl0gIjAiXV0KLX0KLQotIyBUcmltIGFuIFMtcmVjb3JkIGxpbmUgc3VjaCB0aGF0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbgotIyBhdCB0aGUgZW5kLgotCi1wcm9jIHNyZWNfdHJpbSB7IGwgbGVhdmUgfSB7Ci0gICAgc2V0IG9mZiBbc3JlY19vZmYgJGxdCi0gICAgc2V0IGFkZHIgW3NyZWNfYWRkciAkbF0KLSAgICBzZXQgbGVuIFtzcmVjX2xlbiAkbF0KLQotICAgIGlmIHsgJGxlYXZlID49ICRsZW4gfSB7Ci0JcmV0dXJuICRsCi0gICAgfQotCi0gICAgc2V0IHMxIFtzdHJpbmcgcmFuZ2UgJGwgMCAxXQotICAgIHNldCBzMiBbZm9ybWF0ICIlMDJ4IiBbZXhwciAoJG9mZiAtIDQpIC8gMiArICRsZWF2ZSArIDFdXQotICAgIHNldCBzMyBbZm9ybWF0ICIlMFtleHByICRvZmYgLSA0XXgiIFtleHByICRhZGRyICsgJGxlbiAtICRsZWF2ZV1dCi0gICAgc2V0IHM0IFtzdHJpbmcgcmFuZ2UgJGwgW2V4cHIgW3N0cmluZyBsZW5ndGggJGxdIC0gKCRsZWF2ZSAqIDIpIC0gMl0gZW5kXQotICAgIHNldCBzICIke3MxfSR7czJ9JHtzM30ke3M0fSIKLQotICAgIHZlcmJvc2UgInNyZWNfdHJpbSB7ICckbCcgJGxlYXZlIH0gcmV0dXJuaW5nICckcyciIDIKLQotICAgIHJldHVybiAkcwotfQotCi0jIFJlcG9ydCBmYWlsdXJlIHdoZW4gY29tcGFyaW5nIFMtcmVjb3JkIGxpbmVzCi0KLXByb2Mgc3JlY19jb21wYXJlX2ZhaWwgeyB3aGljaCBsMSBsMiB9IHsKLSAgICBzZW5kX2xvZyAiY29tcGFyaXNvbiBmYWlsdXJlICR3aGljaDpcbiRsMVxuJGwyXG4iCi0gICAgdmVyYm9zZSAiY29tcGFyaXNvbiBmYWlsdXJlICR3aGljaDpcbiRsMVxuJGwyIgotfQotCi0jIENvbXBhcmUgUy1yZWNvcmQgZmlsZXMuICBXZSBkb24ndCB3YW50IHRvIGZ1c3MgYWJvdXQgdGhpbmdzIGxpa2UKLSMgZXh0cmEgemVyb2VzLiAgTm90ZSB0aGF0IEJGRCBhbHdheXMgc29ydHMgUy1yZWNvcmRzIGJ5IGFkZHJlc3MuCi0KLXByb2Mgc3JlY19jb21wYXJlIHsgZjEgZjIgfSB7Ci0gICAgc2V0IGUxIFtnZXRzICRmMSBsMV0KLSAgICBzZXQgZTIgW2dldHMgJGYyIGwyXQotCi0gICAgd2hpbGUgeyAkZTEgIT0gLTEgfSB7Ci0Jc2V0IGwxIFtzdHJpbmcgdHJpbXJpZ2h0ICRsMSAiXHJcbiJdCi0Jc2V0IGwyIFtzdHJpbmcgdHJpbXJpZ2h0ICRsMiAiXHJcbiJdCi0JaWYgeyAkZTIgPT0gLTEgfSB7Ci0JICAgICMgSWYgbDEgY29udGFpbnMgZGF0YSwgaXQgbXVzdCBiZSB6ZXJvLgotCSAgICBpZiAhW3NyZWNfemVybyAkbDFdIHsKLQkJc2VuZF9sb2cgImRhdGEgYWZ0ZXIgRU9GOiAkbDFcbiIKLQkJdmVyYm9zZSAiZGF0YSBhZnRlciBFT0Y6ICRsMSIKLQkJcmV0dXJuIDAKLQkgICAgfQotCX0gZWxzZSB7IGlmIHsgW3N0cmluZyBjb21wYXJlICRsMSAkbDJdID09IDAgfSB7Ci0JICAgIHNldCBlMSBbZ2V0cyAkZjEgbDFdCi0JICAgIHNldCBlMiBbZ2V0cyAkZjIgbDJdCi0JfSBlbHNlIHsgaWYgeyBbc3JlY196ZXJvICRsMV0gfSB7Ci0JICAgIHNldCBlMSBbZ2V0cyAkZjEgbDFdCi0JfSBlbHNlIHsgaWYgeyBbc3JlY196ZXJvICRsMl0gfSB7Ci0JICAgIHNldCBlMiBbZ2V0cyAkZjIgbDJdCi0JfSBlbHNlIHsKLQkgICAgIyBUaGUgc3RyaW5ncyBhcmUgbm90IHRoZSBzYW1lLCBhbmQgbmVpdGhlciBpcyBhbGwgemVyb2VzLgotCSAgICBzZXQgYTEgW3NyZWNfYWRkciAkbDFdCi0JICAgIHNldCBuMSBbc3JlY19sZW4gJGwxXQotCSAgICBzZXQgYTIgW3NyZWNfYWRkciAkbDJdCi0JICAgIHNldCBuMiBbc3JlY19sZW4gJGwyXQotCi0JICAgIGlmIHsgJGExIDwgJGEyICYmICFbc3JlY196ZXJvX3JhbmdlICRsMSAwIFtleHByICRhMiAtICRhMV1dIH0gewotCQl2ZXJib3NlICIkYTEgJGEyIFtzcmVjX2V4dHJhY3QgJGwxIDAgW2V4cHIgJGEyIC0gJGExXV0iIDIKLQkJc3JlY19jb21wYXJlX2ZhaWwgMSAkbDEgJGwyCi0JCXJldHVybiAwCi0JICAgIH0KLQkgICAgaWYgeyAkYTIgPCAkYTEgJiYgIVtzcmVjX3plcm9fcmFuZ2UgJGwyIDAgW2V4cHIgJGExIC0gJGEyXV0gfSB7Ci0JCXNyZWNfY29tcGFyZV9mYWlsIDIgJGwxICRsMgotCQlyZXR1cm4gMAotCSAgICB9Ci0KLQkgICAgIyBIZXJlIHdlIGtub3cgdGhhdCBhbnkgaW5pdGlhbCBkYXRhIGluIGJvdGggbGluZXMgaXMKLQkgICAgIyB6ZXJvLiAgTm93IG1ha2Ugc3VyZSB0aGF0IGFueSBvdmVybGFwcGluZyBkYXRhIG1hdGNoZXMuCi0JICAgIGlmIHsgJGExIDwgJGEyIH0gewotCQlzZXQgb3MxIFtleHByICRhMiAtICRhMV0KLQkJc2V0IG9zMiAwCi0JICAgIH0gZWxzZSB7Ci0JCXNldCBvczEgMAotCQlzZXQgb3MyIFtleHByICRhMSAtICRhMl0KLQkgICAgfQotCSAgICBpZiB7ICRhMSArICRuMSA8ICRhMiArICRuMiB9IHsKLQkJc2V0IG9sIFtleHByICRuMSAtICRvczFdCi0JICAgIH0gZWxzZSB7Ci0JCXNldCBvbCBbZXhwciAkbjIgLSAkb3MyXQotCSAgICB9Ci0KLQkgICAgc2V0IHgxIFtzcmVjX2V4dHJhY3QgJGwxICRvczEgJG9sXQotCSAgICBzZXQgeDIgW3NyZWNfZXh0cmFjdCAkbDIgJG9zMiAkb2xdCi0JICAgIGlmIHsgW3N0cmluZyBjb21wYXJlICR4MSAkeDJdICE9IDAgfSB7Ci0JCXZlcmJvc2UgIiRvczEgJG9sICR4MSIgMgotCQl2ZXJib3NlICIkb3MyICRvbCAkeDIiIDIKLQkJc3JlY19jb21wYXJlX2ZhaWwgMyAkbDEgJGwyCi0JCXJldHVybiAwCi0JICAgIH0KLQotCSAgICAjIFRoZXNlIHN0cmluZ3MgbWF0Y2guICBUcmltIHRoZSBkYXRhIGZyb20gdGhlIGxhcmdlcgotCSAgICAjIHN0cmluZywgcmVhZCBhIG5ldyBjb3B5IG9mIHRoZSBzbWFsbGVyIHN0cmluZywgYW5kCi0JICAgICMgY29udGludWUuCi0JICAgIGlmIHsgJGExICsgJG4xIDwgJGEyICsgJG4yIH0gewotCQlzZXQgbDIgW3NyZWNfdHJpbSAkbDIgW2V4cHIgKCRhMiArICRuMikgLSAoJGExICsgJG4xKV1dCi0JCXNldCBlMSBbZ2V0cyAkZjEgbDFdCi0JICAgIH0gZWxzZSB7IGlmIHsgJGExICsgJG4xID4gJGEyICsgJG4yIH0gewotCQlzZXQgbDEgW3NyZWNfdHJpbSAkbDEgW2V4cHIgKCRhMSArICRuMSkgLSAoJGEyICsgJG4yKV1dCi0JCXNldCBlMiBbZ2V0cyAkZjIgbDJdCi0JICAgIH0gZWxzZSB7Ci0JCXNldCBlMSBbZ2V0cyAkZjEgbDFdCi0JCXNldCBlMiBbZ2V0cyAkZjIgbDJdCi0JICAgIH0gfQotCX0gfSB9IH0KLSAgICB9Ci0KLSAgICAjIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZmlyc3QgZmlsZS4gIFRoZSByZW1haW5kZXIgb2YgdGhlCi0gICAgIyBzZWNvbmQgZmlsZSBtdXN0IGNvbnRhaW4gb25seSB6ZXJvZXMuCi0gICAgd2hpbGUgeyAkZTIgIT0gLTEgfSB7Ci0Jc2V0IGwyIFtzdHJpbmcgdHJpbXJpZ2h0ICRsMiAiXHJcbiJdCi0JaWYgIVtzcmVjX3plcm8gJGwyXSB7Ci0JICAgIHNlbmRfbG9nICJkYXRhIGFmdGVyIEVPRjogJGwyXG4iCi0JICAgIHZlcmJvc2UgImRhdGEgYWZ0ZXIgRU9GOiAkbDIiCi0JICAgIHJldHVybiAwCi0JfQotCXNldCBlMiBbZ2V0cyAkZjIgbDJdCi0gICAgfQotCi0gICAgcmV0dXJuIDEKLX0KLQotIyBMaW5rIHR3aWNlLCBvYmpjb3B5LCBhbmQgY29tcGFyZQotCi1wcm9jIHJ1bl9zcmVjX3Rlc3QgeyB0ZXN0IG9ianMgfSB7Ci0gICAgZ2xvYmFsIGxkCi0gICAgZ2xvYmFsIG9iamNvcHkKLSAgICBnbG9iYWwgc2l6ZW9mX2hlYWRlcnMKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICBzZXQgZmxhZ3MgIiIKLQotICAgICMgSWYgdGhlIGxpbmtlciBzY3JpcHQgdXNlcyBTSVpFT0ZfSEVBREVSUywgdXNlIGEgLVR0ZXh0IGFyZ3VtZW50Ci0gICAgIyB0byBmb3JjZSBib3RoIHRoZSBub3JtYWwgbGluayBhbmQgdGhlIFMtcmVjb3JkIGxpbmsgdG8gYmUgcHV0IGluCi0gICAgIyB0aGUgc2FtZSBwbGFjZS4gIFdlIGRvbid0IGFsd2F5cyB1c2UgLVR0ZXh0IGJlY2F1c2UgaXQgaW50ZXJhY3RzCi0gICAgIyBwb29ybHkgd2l0aCBhLm91dC4KLQotICAgIGlmIHsgJHNpemVvZl9oZWFkZXJzIH0gewotCXNldCBmbGFncyAiJGZsYWdzIC1UdGV4dCAweDEwMDAiCi0gICAgfQotCi0gICAgIyBUaGUgYTI5ayBjb21waWxlZCBjb2RlIGNhbGxzIFZfU1BJTEwgYW5kIFZfRklMTC4gIFNpbmNlIHdlIGRvbid0Ci0gICAgIyBuZWVkIHRvIHJ1biB0aGlzIGNvZGUsIGJ1dCB3ZSBkb24ndCBoYXZlIGRlZmluaXRpb25zIGZvciB0aG9zZQotICAgICMgZnVuY3Rpb25zLCB3ZSBqdXN0IGRlZmluZSB0aGVtIG91dC4KLSAgICBpZiBbaXN0YXJnZXQgYTI5ayotKi0qXSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gVl9TUElMTD0wIC0tZGVmc3ltIFZfRklMTD0wIgotICAgIH0KLQotICAgICMgQVJNIHRhcmdldHMgY2FsbCBfX2djY21haW4KLSAgICBpZiBbaXN0YXJnZXQgYXJtKi0qLSpdIHsKLQlzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBfX19nY2NtYWluPTAiCi0gICAgfQotICAgIAotICAgIGlmIFtpc3RhcmdldCBzdHJvbmdhcm0qLSotKl0gewotCXNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIF9fZ2NjbWFpbj0wIgotICAgIH0KLSAgICAKLSAgICAjIFRodW1iIHRhcmdldHMgY2FsbCBfX2djY21haW4KLSAgICBpZiBbaXN0YXJnZXQgdGh1bWItKi0qXSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19fZ2NjbWFpbj0wIgotICAgIH0KLQotICAgICMgUG93ZXJQQyBFQUJJIGNvZGUgY2FsbHMgX19lYWJpLgotICAgIGlmIFtpc3RhcmdldCBwb3dlcnBjKi0qLWVhYmkqXSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19lYWJpPTAiCi0gICAgfQotCi0gICAgIyBtbjEwMjAwIGNvZGUgY2FsbHMgX190cnVuY3NpcHNpMl9kMF9kMi4KLSAgICBpZiB7W2lzdGFyZ2V0IG1uMTAyMDAqLSotKl19IHRoZW4gewotCXNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIF9fdHJ1bmNzaXBzaTJfZDBfZDI9MCIKLSAgICB9Ci0KLSAgICAjIFY4NTAgdGFyZ2V0cyBuZWVkIGxpYmdjYy5hCi0gICAgaWYgW2lzdGFyZ2V0IHY4NTAqLSotZWxmXSB7Ci0Jc2V0IG9ianMgIiRvYmpzIC1MIC4uL2djYyAtbGdjYyIKLSAgICB9Ci0gICAgCi0gICAgaWYgeyAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc3IxICIkZmxhZ3MgJG9ianMiXSBcCi0JIHx8ICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zcjIuc3IgIiRmbGFncyAtb2Zvcm1hdCBzcmVjICRvYmpzIl0gfSB7Ci0Jc2V0dXBfeGZhaWwgImhwcGEqLSotKmVsZioiCi0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHNlbmRfbG9nICIkb2JqY29weSAtTyBzcmVjIHRtcGRpci9zcjEgdG1wZGlyL3NyMS5zclxuIgotICAgIHZlcmJvc2UgIiRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NyMSB0bXBkaXIvc3IxLnNyIgotICAgIGNhdGNoICJleGVjICRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NyMSB0bXBkaXIvc3IxLnNyIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JdW5yZXNvbHZlZCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHNldCBmMSBbb3BlbiB0bXBkaXIvc3IxLnNyIHJdCi0gICAgc2V0IGYyIFtvcGVuIHRtcGRpci9zcjIuc3Igcl0KLSAgICBpZiBbc3JlY19jb21wYXJlICRmMSAkZjJdIHsKLQlwYXNzICR0ZXN0Ci0gICAgfSBlbHNlIHsKLQlmYWlsICR0ZXN0Ci0gICAgfQotICAgIGNsb3NlICRmMQotICAgIGNsb3NlICRmMgotfQotCi1zZXQgdGVzdDEgIlMtcmVjb3JkcyIKLXNldCB0ZXN0MiAiUy1yZWNvcmRzIHdpdGggY29uc3RydWN0b3JzIgotCi0jIFNlZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgdXNlcyBTSVpFT0ZfSEVBREVSUy4KLWNhdGNoICJleGVjICRsZCAtLXZlcmJvc2UiIGV4ZWNfb3V0cHV0Ci1zZXQgc2l6ZW9mX2hlYWRlcnMgW3N0cmluZyBtYXRjaCAiKlNJWkVPRl9IRUFERVJTKiIgJGV4ZWNfb3V0cHV0XQotCi0jIEZpcnN0IHRlc3QgbGlua2luZyBhIEMgcHJvZ3JhbS4gIFdlIGRvbid0IHJlcXVpcmUgYW55IGxpYnJhcmllcy4gIFdlCi0jIGxpbmsgaXQgbm9ybWFsbHksIGFuZCBvYmpjb3B5IHRvIHRoZSBTLXJlY29yZCBmb3JtYXQsIGFuZCB0aGVuIGxpbmsKLSMgZGlyZWN0bHkgdG8gdGhlIFMtcmVjb3JkIGZvcm1hdCwgYW5kIHJlcXVpcmUgdGhhdCB0aGUgdHdvIGZpbGVzCi0jIGNvbnRhaW4gdGhlIHNhbWUgZGF0YS4KLQotaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MQotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiB7ICFbbGRfY29tcGlsZSAkQ0MgJHNyY2Rpci8kc3ViZGlyL3NyMS5jIHRtcGRpci9zcjEub10gXAotICAgICB8fCAhW2xkX2NvbXBpbGUgJENDICRzcmNkaXIvJHN1YmRpci9zcjIuYyB0bXBkaXIvc3IyLm9dIH0gewotICAgIHVucmVzb2x2ZWQgJHRlc3QxCi0gICAgdW5yZXNvbHZlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotIyBUaGUgaTM4Ni1hb3V0IHRhcmdldCBpcyBjb25mdXNlZDogdGhlIGxpbmtlciBkb2VzIG5vdCBwdXQgdGhlCi0jIHNlY3Rpb25zIHdoZXJlIG9iamR1bXAgZmluZHMgdGhlbS4gIEkgZG9uJ3Qga25vdyB3aGljaCBpcyB3cm9uZy4KLXNldHVwX3hmYWlsICJpKjg2LSotYW91dCoiCi0KLSMgVGhlc2UgdGVzdHMgZmFpbCBvbiB0aGUgbmF0aXZlIE1JUFMgRUxGIHRhcmdldHMgYmVjYXVzZSB0aGUgR1AgdmFsdWUKLSMgaW4gdGhlIC5yZWdpbmZvIHNlY3Rpb24gaXMgbm90IHVwZGF0ZWQgd2hlbiB0aGUgUy1yZWNvcmQgdmVyc2lvbiBpcwotIyB3cml0dGVuIG91dC4gIFRoZSBtaXBzLWVsZiB0YXJnZXQgaXRzZWxmIGRvZXMgbm90IHVzZSBhIC5yZWdpbmZvIHNlY3Rpb24uCi1zZXR1cF94ZmFpbCAibWlwcyotKi1pcml4NSoiICJtaXBzKi0qLWlyaXg2KiIKLQotIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgZG8gdGhlIG1hZ2ljIFRPQyBoYW5kbGluZyB0aGF0IFhDT0ZGCi0jIGxpbmtlcnMgZG8uCi1zZXR1cF94ZmFpbCAiKi0qLWFpeCoiICIqLSoteGNvZmYqIgotCi0jIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBidWlsZCBBUk0vVGh1bWIgc3R1YnMuCi1zZXR1cF94ZmFpbCAiYXJtLSotY29mZiIKLXNldHVwX3hmYWlsICJzdHJvbmdhcm0qLSotKiIKLXNldHVwX3hmYWlsICJhcm0tKi1wZSoiCi0jIHNldHVwX3hmYWlsICJhcm0tKmVsZioiCi1zZXR1cF94ZmFpbCAidGh1bWItKi1jb2ZmKiIKLXNldHVwX3hmYWlsICJ0aHVtYi0qLXBlKiIKLXNldHVwX3hmYWlsICJ0aHVtYi0qLWVsZioiCi1zZXR1cF94ZmFpbCAiYXJtKi0qLWxpbnV4KiIKLQotIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgYnVpbGQgc3BlY2lhbCBFQUJJIHNlY3Rpb25zLgotc2V0dXBfeGZhaWwgInBvd2VycGMqLSotZWFiaSoiCi0KLSMgVGhlIFMtcmVjb3JkIGxpbmtlciBkb2Vzbid0IGluY2x1ZGUgdGhlIC57emRhfSBzZWN0aW9ucy4KLXNldHVwX3hmYWlsICJ2ODUwKi0qLWVsZiIKLQotIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgaGFuZGxlIEFscGhhIEVsZiByZWxheGF0aW9uLgotc2V0dXBfeGZhaWwgImFscGhhKi0qLWVsZioiICJhbHBoYSotKi1saW51eC1nbnUqIiAiYWxwaGEqLSotZ251KiIKLXNldHVwX3hmYWlsICJhbHBoYSotKi1uZXRic2QqIgotCi0jIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBzcGVjaWFsIFBFIGhlYWRlcnMgLSB0aGUgUEUKLSMgZW11bGF0aW9uIHRyaWVzIHRvIHdyaXRlIHBlLXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIHRoZSBQRSBoZWFkZXJzCi0jIGluIHRoZSBvdXRwdXQgYmZkLCBidXQgaXQncyBub3QgYSBQRSBiZmQgKGl0J3MgYW4gc3JlYyBiZmQpCi1zZXR1cF94ZmFpbCAiKi0qLWN5Z3dpbioiICIqLSotbWluZ3cqIiAiKi0qLXBlKiIgIiotKi13aW5udCoiCi0KLXJ1bl9zcmVjX3Rlc3QgJHRlc3QxICJ0bXBkaXIvc3IxLm8gdG1wZGlyL3NyMi5vIgotCi0jIE5vdyB0cnkgbGlua2luZyBhIEMrKyBwcm9ncmFtIHdpdGggZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQKLSMgZGVzdHJ1Y3RvcnMuICBOb3RlIHRoYXQgc2luY2Ugd2UgYXJlIG5vdCBsaW5raW5nIGFnYWluc3QgYW55Ci0jIGxpYnJhcmllcywgdGhpcyBwcm9ncmFtIHdvbid0IGFjdHVhbGx5IHdvcmsgb3IgYW55dGhpbmcuCi0KLWlmIHsgW3doaWNoICRDWFhdID09IDAgfSB7Ci0gICAgdW50ZXN0ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfY29tcGlsZSAiJENYWCAkQ1hYRkxBR1MgLWZnbnUtbGlua2VyIiAkc3JjZGlyLyRzdWJkaXIvc3IzLmNjIHRtcGRpci9zcjMub10gewotICAgIHVucmVzb2x2ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLSMgU2VlIGFib3ZlLgotc2V0dXBfeGZhaWwgImkqODYtKi1hb3V0KiIKLXNldHVwX3hmYWlsICJtaXBzKi0qLWlyaXg1KiIgIm1pcHMqLSotaXJpeDYqIgotc2V0dXBfeGZhaWwgIiotKi1haXgqIiAiKi0qLXhjb2ZmKiIKLXNldHVwX3hmYWlsICJhcm0qLSotKiIKLXNldHVwX3hmYWlsICJzdHJvbmdhcm0qLSotKiIKLXNldHVwX3hmYWlsICJ0aHVtYi0qLSoiCi1zZXR1cF94ZmFpbCAicG93ZXJwYyotKi1lYWJpKiIKLXNldHVwX3hmYWlsICJ2ODUwKi0qLWVsZiIKLXNldHVwX3hmYWlsICJhbHBoYSotKi1lbGYqIiAiYWxwaGEqLSotbGludXgtZ251KiIgImFscGhhKi0qLWdudSoiCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotbmV0YnNkKiIKLXNldHVwX3hmYWlsICIqLSotY3lnd2luKiIgIiotKi1taW5ndyoiICIqLSotcGUqIiAiKi0qLXdpbm50KiIKLQotcnVuX3NyZWNfdGVzdCAkdGVzdDIgInRtcGRpci9zcjMubyIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmMgYi9sZC90ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhZWM2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdXNlZCB0byB0ZXN0IHRoZSBsaW5rZXIncyByZXBvcnRpbmcgb2YgdW5kZWZpbmVkCi0gICBzeW1ib2xzLiAgKi8KLQotZXh0ZXJuIGludCB0aGlzX2Z1bmN0aW9uX2lzX25vdF9kZWZpbmVkICgpOwotCi1pbnQKLWZ1bmN0aW9uICgpCi17Ci0gIHJldHVybiB0aGlzX2Z1bmN0aW9uX2lzX25vdF9kZWZpbmVkICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjU1MTkyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIFRlc3QgdGhhdCB0aGUgbGlua2VyIHJlcG9ydHMgdW5kZWZpbmVkIHN5bWJvbCBlcnJvcnMgY29ycmVjdGx5LgotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotIwotIyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1zZXQgdGVzdHVuZCAidW5kZWZpbmVkIgotc2V0IHRlc3RmbiAidW5kZWZpbmVkIGZ1bmN0aW9uIgotc2V0IHRlc3RsaW5lICJ1bmRlZmluZWQgbGluZSIKLQotaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0gewotICAgIHZlcmJvc2UgIkNvdWxkIG5vdCBmaW5kIEMgY29tcGlsZXIhIiAxCi0gICAgdW50ZXN0ZWQgJHRlc3R1bmQKLSAgICB1bnRlc3RlZCAkdGVzdGZuCi0gICAgdW50ZXN0ZWQgJHRlc3RsaW5lCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfY29tcGlsZSAiJENDIC1nIiAkc3JjZGlyLyRzdWJkaXIvdW5kZWZpbmVkLmMgdG1wZGlyL3VuZGVmaW5lZC5vXSB7Ci0gICAgdmVyYm9zZSAiVW5hYmxlIHRvIGNvbXBpbGUgdGVzdCBmaWxlISIgMQotICAgIHVucmVzb2x2ZWQgJHRlc3R1bmQKLSAgICB1bnJlc29sdmVkICR0ZXN0Zm4KLSAgICB1bnJlc29sdmVkICR0ZXN0bGluZQotICAgIHJldHVybgotfQotCi1jYXRjaCAiZXhlYyBybSAtZiB0bXBkaXIvdW5kZWZpbmVkIiBleGVjX291dHB1dAotCi0jIFVzaW5nIC1lIHN0YXJ0IHByZXZlbnRzIHRoZSBTdW5PUyBsaW5rZXIgZnJvbSB0cnlpbmcgdG8gYnVpbGQgYQotIyBzaGFyZWQgbGlicmFyeS4KLXNlbmRfbG9nICIkbGQgLWUgc3RhcnQgLW8gdG1wZGlyL3VuZGVmaW5lZCB0bXBkaXIvdW5kZWZpbmVkLm9cbiIKLXZlcmJvc2UgIiRsZCAtZSBzdGFydCAtbyB0bXBkaXIvdW5kZWZpbmVkIHRtcGRpci91bmRlZmluZWQubyIKLQotY2F0Y2ggImV4ZWMgJGxkIC1lIHN0YXJ0IC1vIHRtcGRpci91bmRlZmluZWQgdG1wZGlyL3VuZGVmaW5lZC5vIiBleGVjX291dHB1dAotc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCi1wcm9jIGNoZWNrdW5kIHsgc3RyaW5nIHRlc3RuYW1lIH0gewotICAgIGdsb2JhbCBleGVjX291dHB1dAotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiKiRzdHJpbmcqIiAkZXhlY19vdXRwdXRdIHsKLQlwYXNzICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0JZmFpbCAkdGVzdG5hbWUKLSAgICB9Ci19Ci0KLXNldCBtdSAidW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCciCi1jaGVja3VuZCAkbXUgJHRlc3R1bmQKLQotIyBBUk0gUEUgZGVmYXVsdHMgdG8gdXNpbmcgc3RhYnMgZGVidWdnaW5nLCB3aGljaCB3ZSBjYW4ndCBoYW5kbGUgZm9yCi0jIGEgQ09GRiBmaWxlLgotI3NldHVwX3hmYWlsICJhcm0qLSotcGUqIgotI3NldHVwX3hmYWlsICJ0aHVtYiotKi1wZSoiCi0KLSMgSnVzdCBkb2Vzbid0IHdvcmsgZm9yIFBBIEVMRi4gIE5vIGNsdWUgd2h5Lgotc2V0dXBfeGZhaWwgImhwcGEqLSotKmVsZioiCi0KLXNldCBtZiAidG1wZGlyL3VuZGVmaW5lZC5vOiBJbiBmdW5jdGlvbiBgZnVuY3Rpb24nOiIKLWNoZWNrdW5kICRtZiAkdGVzdGZuCi0KLSMgQ09GRiBTSCBnZXRzIHRoaXMgdGVzdCB3cm9uZy0taXQgcmVwb3J0cyBsaW5lIDEwLCBiZWNhdXNlIGFsdGhvdWdoCi0jIHRoZSBqdW1wIGlzIGF0IGxpbmUgOSwgdGhlIGZ1bmN0aW9uIGFkZHJlc3MsIGFuZCB0aGUgcmVsb2MsIGlzCi0jIHN0b3JlZCBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4KLXNldHVwX3hmYWlsICJzaC0qLSoiCi0KLSMgQVJNIFBFIGRlZmF1bHRzIHRvIHVzaW5nIHN0YWJzIGRlYnVnZ2luZywgd2hpY2ggd2UgY2FuJ3QgaGFuZGxlIGZvcgotIyBhIENPRkYgZmlsZS4KLSNzZXR1cF94ZmFpbCAiYXJtKi0qLXBlKiIKLSNzZXR1cF94ZmFpbCAidGh1bWIqLSotcGUqIgotCi0jIEp1c3QgZG9lc24ndCB3b3JrIGZvciBQQSBFTEYuICBObyBjbHVlIHdoeS4KLXNldHVwX3hmYWlsICJocHBhKi0qLSplbGYqIgotCi1zZXQgbWwgInVuZGVmaW5lZC5jOjk6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQnIgotIyBXaXRoIHRhcmdldHMgdGhhdCB1c2UgZWxmL2R3YXJmMiwgc3VjaCBhcyB0aGUgYXJtLWVsZiBhbmQgdGh1bWItZWxmCi0jIHRvb2xjaGFpbnMsIHRoZSBjb2RlIGluIGJmZC9lbGYuYzpfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSgpIGlzIGNhbGxlZAotIyBpbiBvcmRlciB0byBsb2NhdGUgdGhlIGZpbGUgbmFtZS9saW5lIG51bWJlciB3aGVyZSB0aGUgdW5kZWZpbmVkCi0jIHJlZmVyZW5jZSBvY2N1cnMuICBVbmZvcnR1bmF0ZWx5IHRoaXMgdHJpZXMgdG8gdXNlIHRoZSBkd2FyZjIgZGVidWcKLSMgaW5mb3JtYXRpb24gaGVsZCBpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4gIFRoaXMgc2VjdGlvbiBjb250YWlucyBhIHNlcmllcwotIyBvZiBjb21wX3VuaXQgc3RydWN0dXJlcywgZWFjaCBvZiB3aGljaCBoYXMgYSBsb3cvaGlnaCBhZGRyZXNzIHJhbmdlCi0jIHJlcHJlc2VudGluZyB0aGUgc3BhbiBvZiBtZW1vcnkgbG9jYXRpb25zIGNvdmVyZWQgYnkgdGhhdCBzdHJ1Y3R1cmUuICBUaGUKLSMgc3RydWN0dXJlcyBhbHNvIGluZGV4IGludG8gb3RoZXIgc3RydWN0dXJlcyBoZWxkIGluIHRoZSAuZGVidWdfbGluZSBzZWN0aW9uCi0jIGFuZCB0b2dldGhlciB0aGV5IGNhbiB0cmFuc2xhdGUgbWVtb3J5IGxvY2F0aW9ucyBiYWNrIGludG8gZmlsZS9mdW5jdGlvbi9saW5lCi0jIG51bWJlciBhZGRyZXNzZXMgaW4gdGhlIHNvdXJjZSBjb2RlLiAgU2luY2UgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZW1vcnkKLSMgcmVnaW9uIGNvdmVyZWQgYnkgYSBjb21wX3VuaXQgaXMgb25seSBkZXRlcm1pbmVkIGF0IGxpbmsgdGltZSwgdGhlIGxvdy9oaWdoCi0jIGFkZHJlc3NlcyBpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBhbmQgdGhlIGxpbmUgYWRkcmVzc2VzIGluIHRoZSAuZGVidWdfbGluZQotIyBzZWN0aW9uIGFyZSBjb21wdXRlZCBieSBnZW5lcmF0aW5nIHJlbG9jcyBhZ2FpbnN0IGtub3duIHN5bWJvbHMgaW4gdGhlIG9iamVjdAotIyBjb2RlLgotIwotIyBXaGVuIHRoZSB1bmRlZmluZWQgcmVmZXJlbmNlIGlzIGRldGVjdGVkLCB0aGUgcmVsb2NzIGluIHRoZSBkd2FyZjIKLSMgZGVidWcgc2VjdGlvbnMgaGF2ZSBub3QgeWV0IGJlZW4gcmVzb2x2ZWQsIHNvIHRoZSBsb3cvaGlnaCBhZGRyZXNzZXMgYW5kIHRoZQotIyBsaW5lIG51bWJlciBhZGRyZXNzIGFyZSBhbGwgc2V0IGF0IHplcm8uICBUaHVzIHdoZW4gX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUoKQotIyBjYWxscyBfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSgpIG5vIGNvbXBfdW5pdCBjYW4gYmUgZm91bmQgd2hpY2gKLSMgYWN0dWFsbHkgY292ZXJzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSByZWZlcmVuY2Ugb2NjdXJlZCwgYW5kIHNvCi0jIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKCkgZmFpbHMuCi0jCi0jIFRoZSB1cHNob3Qgb2YgYWxsIG9mIHRoaXMsIGlzIHRoYXQgdGhlIGVycm9yIG1lc3NhZ2UgcmVwb3J0ZWQgYnkgdGhlCi0jIGxpbmtlciwgaW5zdGVhZCBvZiBoYXZpbmcgYSBzb3VyY2UgZmlsZSBuYW1lICYgbGluZSBudW1iZXIgYXMgaW46Ci0jCi0jICAgdW5kZWZpbmVkLmM6OTogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCcKLSMKLSMgaGFzIGFuIG9iamVjdCBmaWxlICYgc2VjdGlvbiBhZGRyZXNzIGluc3RlYWQ6Ci0jCi0jICAgdW5kZWZpbmVkLjAoLnRleHQrMHhjKTogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCcKLSMKLSMgaGVuY2UgdGhlIHhmYWlscyBiZWxvdy4KLQotI3NldHVwX3hmYWlsIGFybS0qLWVsZgotI3NldHVwX3hmYWlsIHN0cm9uZ2FybS0qLWVsZgotI3NldHVwX3hmYWlsIHRodW1iLSotZWxmCi1zZXR1cF94ZmFpbCBtY29yZS0qLWVsZgotc2V0dXBfeGZhaWwgbWlwcy1zZ2ktaXJpeDYqCi0KLWNoZWNrdW5kICRtbCAkdGVzdGxpbmUKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0xLnJvIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTEucm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNzBkODAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTEucm8KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEtMi5ybyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0yLnJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDRkYzU5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0yLnJvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLmxkIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLmxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTVjNGUzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5sZAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi1PVVRQVVRfRk9STUFUKCJzcmVjIikKLVNFQ1RJT05TCi17Ci0KLQotLnRleHQgMCA6IHsgKigiOSIpICooIjEwIikgKigiMTEiKSAqKCIxMiIpICooIjEzIikgKigiMTQiKSAqKCIxNSIpCi0JCSooIjciKSAqKCI4IikgKigiMCIpICooIjEiKSAqKCIyIikgKigiMyIpICooIjQiKSB9Ci0uYnNzIChOT0xPQUQpICA6IHsgICooIjUiKSAqKCI2IikgfQotCi0uUEFGSSAgICA9MHgwMDAwMDA1MCA7Ci0uUENISU8gICA9MHgwMDAwMDBEMCA7Ci0uUENMTyAgICA9MHgwMDAwMDA1NCA7Ci0uUENWQlNWICA9MHgwMDAwMDAwRSA7Ci0uUENWVFNVICA9MHgwMDAwMDAxMiA7Ci0uUENWVFNWICA9MHgwMDAwMDAxNiA7Ci0uUENWVFNWTCA9MHgwMDAwMDAxQSA7Ci0uUENWVFVTICA9MHgwMDAwMDAxRSA7Ci0uUERJUyAgICA9MHgwMDAwMDAyMiA7Ci0uUERJU0wgICA9MHgwMDAwMDAyNiA7Ci0uUERWSiAgICA9MHgwMDAwMDAyQSA7Ci0uUEVJTyAgICA9MHgwMDAwMDBDQyA7Ci0uUEVPRiAgICA9MHgwMDAwMDA1OCA7Ci0uUEVPTCAgICA9MHgwMDAwMDA1QyA7Ci0uUEVRVVMgICA9MHgwMDAwMDAyRSA7Ci0uUEVRVVYgICA9MHgwMDAwMDAzMiA7Ci0uUEVRVVZMICA9MHgwMDAwMDAzNiA7Ci0uUEVRVVcgICA9MHgwMDAwMDBERSA7Ci0uUEdDTSAgICA9MHgwMDAwMDA2NCA7Ci0uUEdFUVMgICA9MHgwMDAwMDAzQSA7Ci0uUEdFUVYgICA9MHgwMDAwMDAzRSA7Ci0uUEdFUVZMICA9MHgwMDAwMDA0MiA7Ci0uUEdFVCAgICA9MHgwMDAwMDA2MCA7Ci0uUEdSVFMgICA9MHgwMDAwMDA0NiA7Ci0uUEdSVFYgICA9MHgwMDAwMDA0QSA7Ci0uUEdSVFZMICA9MHgwMDAwMDA0RSA7Ci0uUElBQ1QgICA9MHgwMDAwMDA2QyA7Ci0uUElGRCAgICA9MHgwMDAwMDA2OCA7Ci0uUElORFMgICA9MHgwMDAwMDA1MiA7Ci0uUElORFYgICA9MHgwMDAwMDA1NiA7Ci0uUElORFZMICA9MHgwMDAwMDA1QSA7Ci0uUElORFcgICA9MHgwMDAwMDBENiA7Ci0uUExEQ1MgICA9MHgwMDAwMDA1RSA7Ci0uUExEQ1YgICA9MHgwMDAwMDA2MiA7Ci0uUExFUVMgICA9MHgwMDAwMDA2NiA7Ci0uUExFUVYgICA9MHgwMDAwMDA2QSA7Ci0uUExFUVZMICA9MHgwMDAwMDA2RSA7Ci0uUExFU1MgICA9MHgwMDAwMDA3MiA7Ci0uUExFU1YgICA9MHgwMDAwMDA3NiA7Ci0uUExFU1ZMICA9MHgwMDAwMDA3QSA7Ci0uUExPRFMgICA9MHgwMDAwMDA3RSA7Ci0uUExPRFYgICA9MHgwMDAwMDA4MiA7Ci0uUExPRFZMICA9MHgwMDAwMDA4NiA7Ci0uUE1PREogICA9MHgwMDAwMDA4QSA7Ci0uUE1PViAgICA9MHgwMDAwMDBFMiA7Ci0uUE1QSiAgICA9MHgwMDAwMDA4RSA7Ci0uUE5FUVMgICA9MHgwMDAwMDA5MiA7Ci0uUE5FUVYgICA9MHgwMDAwMDA5NiA7Ci0uUE5FUVZMICA9MHgwMDAwMDA5QSA7Ci0uUE5FUVcgICA9MHgwMDAwMDBEQSA7Ci0uUFBBR0UgICA9MHgwMDAwMDBENCA7Ci0uUFBFRSAgICA9MHgwMDAwMDA3MCA7Ci0uUFBVVCAgICA9MHgwMDAwMDA3NCA7Ci0uUFJEQiAgICA9MHgwMDAwMDA3OCA7Ci0uUFJEQyAgICA9MHgwMDAwMDA3QyA7Ci0uUFJESCAgICA9MHgwMDAwMDA4MCA7Ci0uUFJESSAgICA9MHgwMDAwMDA4NCA7Ci0uUFJESiAgICA9MHgwMDAwMDA4OCA7Ci0uUFJEUlMgICA9MHgwMDAwMDBDOCA7Ci0uUFJEUyAgICA9MHgwMDAwMDA4QyA7Ci0uUFJEViAgICA9MHgwMDAwMDA5MCA7Ci0uUFJMTiAgICA9MHgwMDAwMDA5NCA7Ci0uUFJSQU4gICA9MHgwMDAwMDA5OCA7Ci0uUFJTVCAgICA9MHgwMDAwMDA5QyA7Ci0uUFJXVCAgICA9MHgwMDAwMDBBMCA7Ci0uUFNDT04gICA9MHgwMDAwMDA5RSA7Ci0uUFNDT1AgICA9MHgwMDAwMDBBMiA7Ci0uUFNERUwgICA9MHgwMDAwMDBBNiA7Ci0uUFNJTlMgICA9MHgwMDAwMDBBQSA7Ci0uUFNMRU4gICA9MHgwMDAwMDBBRSA7Ci0uUFNQT1MgICA9MHgwMDAwMDBCMiA7Ci0uUFNUQ1YgICA9MHgwMDAwMDBCNiA7Ci0uUFNUQ1ZMICA9MHgwMDAwMDBCQSA7Ci0uUFNUT1MgICA9MHgwMDAwMDBCRSA7Ci0uUFNUT1YgICA9MHgwMDAwMDBDMiA7Ci0uUFNUT1ZMICA9MHgwMDAwMDBDNiA7Ci0uUFNUUlMgICA9MHgwMDAwMDBDQSA7Ci0uUFNUUlYgICA9MHgwMDAwMDBDRSA7Ci0uUFNUUlZMICA9MHgwMDAwMDBEMiA7Ci0uUFdMTiAgICA9MHgwMDAwMDBBNCA7Ci0uUFdSQU4gICA9MHgwMDAwMDBBOCA7Ci0uUFdSQiAgICA9MHgwMDAwMDBBQyA7Ci0uUFdSQyAgICA9MHgwMDAwMDBCMCA7Ci0uUFdSSCAgICA9MHgwMDAwMDBCNCA7Ci0uUFdSSSAgICA9MHgwMDAwMDBCOCA7Ci0uUFdSSiAgICA9MHgwMDAwMDBCQyA7Ci0uUFdSUyAgICA9MHgwMDAwMDBDMCA7Ci0uUFdSViAgICA9MHgwMDAwMDBDNCA7Ci0KLS8qCi0uUEFGST0weCAgID0gMHgwMDsKLS5QQ0hJTyAgID0weCAweDAwMDAwMDsKLS5QQ0xPICAgID0weCA2NCA7Ci0uUEM7Ci0uUENWVFNVICA9MHggMHgwMDAwMDA7Ci0uUENWVFNWICA9MHggMHgwMDAwMDA7Ci0uUENWVFNWTCA9MHggMHgwMDAwMDA7Ci0uUENWVFVTICA9MHggMTU4IDsKLS5QOwotLlBESVNMICAgPTB4IDB4MDAwMDAwOwotLlBEVkogICAgPTB4IDB4MDAwMDAwOwotLlBFSU8gICAgPTB4IDB4MDAwMDAwOwotLlBFT0YgICAgPTB4IDB4MDAwMDAwOwotLlBFT0wgICAgPTB4IDB4MDAwMDAwOwotLlBFUVVTICAgPTB4IDB4MDAwMDAwOwotLlBFUVVWICAgPTB4IDB4MDAwMDAwOwotLlBFUVVWTCAgPTB4IDB4MDAwMDAwOwotLlBFUVVXICAgPTB4IDB4MDAwMDAwOwotLlBHQ00gICAgPTB4IDB4MDAwMDAwOwotLlBHRVFTICAgPTB4IDB4MDAwMDAwOwotLlBHRVFWICAgPTB4IDB4MDAwMDAwOwotLlBHRVFWTCAgPTB4IDB4MDAwMDAwOwotLlBHRVQgICAgPTB4IDB4MDAwMDAwOwotLlBHUlRTICAgPTB4IDB4MDAwMDAwOwotLlBHUlRWICAgPTB4IDB4MDAwMDAwOwotLlBHUlRWTCAgPTB4IDB4MDAwMDAwOwotLlBJQUNUICAgPTB4IDB4MDAwMDAwOwotLlBJRkQgICAgPTB4IDEyNiA7Ci0uUDsKLS5QSU5EViAgID0weCAweDAwMDAwMDsKLS5QSU5EVkwgID0weCAweDAwMDAwMDsKLS5QSU5EVyAgID0weCAweDAwMDAwMDsKLS5QTERDUyAgID0weCAweDAwMDAwMDsKLS5QTERDViAgID0weCAweDAwMDAwMDsKLS5QTEVRUyAgID0weCAweDAwMDAwMDsKLS5QTEVRViAgID0weCAweDAwMDAwMDsKLS5QTEVRVkwgID0weCAweDAwMDAwMDsKLS5QTEVTUyAgID0weCAweDAwMDAwMDsKLS5QTEVTViAgID0weCAweDAwMDAwMDsKLS5QTEVTVkwgID0weCAweDAwMDAwMDsKLS5QTE9EUyAgID0weCAweDAwMDAwMDsKLS5QTE9EViAgID0weCAweDAwMDAwMDsKLS5QTE9EVkwgID0weCAweDAwMDAwMDsKLS5QTU9ESiAgID0weCAweDAwMDAwMDsKLS5QTU9WICAgID0weCAweDAwMDAwMDsKLS5QTVBKICAgID0weCAweDAwMDAwMDsKLS5QTkVRUyAgID0weCAweDAwMDAwMDsKLS5QTkVRViAgID0weCAweDAwMDAwMDsKLS5QTkVRVkwgID0weCAweDAwMDAwMDsKLS5QTkVRVyAgID0weCAweDAwMDAwMDsKLS5QUEFHRSAgID0weCAweDAwMDAwMDsKLS5QUEVFICAgID0weCAweDAwMDAwMDsKLS5QUFVUICAgID0weCAweDAwMDAwMDsKLS5QUkRCICAgID0weCAweDAwMDAwMDsKLS5QUkRDICAgID0weCAweDAwMDAwMDsKLS5QUkRIICAgID0weCAweDAwMDAwMDsKLS5QUkRJICAgID0weCAweDAwMDAwMDsKLS5QUkRKICAgID0weCAweDAwMDAwMDsKLS5QUkRSUyAgID0weCAweDAwMDAwMDsKLS5QUkRTICAgID0weCAweDAwMDAwMDsKLS5QUkRWICAgID0weCAweDAwMDAwMDsKLS5QUkxOICAgID0weCAweDAwMDAwMDsKLS5QUlJBTiAgID0weCAweDAwMDAwMDsKLS5QUlNUICAgID0weCAweDAwMDAwMDsKLS5QUldUICAgID0weCAweDAwMDAwMDsKLS5QU0NPTiAgID0weCAweDAwMDAwMDsKLS5QU0NPUCAgID0weCAweDAwMDAwMDsKLS5QU0RFTCAgID0weCAweDAwMDAwMDsKLS5QU0lOUyAgID0weCAweDAwMDAwMDsKLS5QU0xFTiAgID0weCAweDAwMDAwMDsKLS5QU1BPUyAgID0weCAweDAwMDAwMDsKLS5QU1RDViAgID0weCAweDAwMDAwMDsKLS5QU1RDVkwgID0weCAweDAwMDAwMDsKLS5QU1RPUyAgID0weCAweDAwMDAwMDsKLS5QU1RPViAgID0weCAweDAwMDAwMDsKLS5QU1RPVkwgID0weCAweDAwMDAwMDsKLS5QU1RSUyAgID0weCAweDAwMDAwMDsKLS5QU1RSViAgID0weCAweDAwMDAwMDsKLS5QU1RSVkwgID0weCAweDAwMDAwMDsKLS5QV0xOICAgID0weCAweDAwMDAwMDsKLS5QV1JBTiAgID0weCAweDAwMDAwMDsKLS5QV1JCICAgID0weCAweDAwMDAwMDsKLS5QV1JDICAgID0weCAweDAwMDAwMDsKLS5QV1JIICAgID0weCAweDAwMDAwMDsKLS5QV1JJICAgID0weCAweDAwMDAwMDsKLS5QV1JKICAgID0weCAweDAwMDAwMDsKLS5QV1JTICAgID0weCAweDAwMDAwMDsKLS5QV1JWICAgID0weCAweDAwMDAwMDsKLQotKi8KLS8qCi0uUD0weCAgICAgID0gMDsKLS5QQ0hJTyAgID0weCAweGZlZWRmYTsKLS5QQ0xPICAgID0weCAweGZlZWRmYTsKLS5QQ1ZCU1YgID0weCAweGZlZWRmYTsKLS5QQ1ZUU1UgID0weCAweGZlZWRmYTsKLS5QQ1ZUU1YgID0weCAweGZlZWRmYTsKLS5QQ1ZUU1ZMID0weCAweGZlZWRmYTsKLS5QQ1ZUVVMgID0weCAweGZlZWRmYTsKLS5QRElTICAgID0weCAweGZlZWRmYTsKLS5QRElTTCAgID0weCAweGZlZWRmYTsKLS5QRFZKICAgID0weCAweGZlZWRmYTsKLS5QRUlPICAgID0weCAweGZlZWRmYTsKLS5QRU9GICAgID0weCAweGZlZWRmYTsKLS5QRU9MICAgID0weCAweGZlZWRmYTsKLS5QRVFVUyAgID0weCAweGZlZWRmYTsKLS5QRVFVViAgID0weCAweGZlZWRmYTsKLS5QRVFVVkwgID0weCAweGZlZWRmYTsKLS5QRVFVVyAgID0weCAweGZlZWRmYTsKLS5QR0NNICAgID0weCAweGZlZWRmYTsKLS5QR0VRUyAgID0weCAweGZlZWRmYTsKLS5QR0VRViAgID0weCAweGZlZWRmYTsKLS5QR0VRVkwgID0weCAweGZlZWRmYTsKLS5QR0VUICAgID0weCAweGZlZWRmYTsKLS5QR1JUUyAgID0weCAweGZlZWRmYTsKLS5QR1JUViAgID0weCAweGZlZWRmYTsKLS5QR1JUVkwgID0weCAweGZlZWRmYTsKLS5QSUFDVCAgID0weCAweGZlZWRmYTsKLS5QSUZEICAgID0weCAweGZlZWRmYTsKLS5QSU5EUyAgID0weCAweGZlZWRmYTsKLS5QSU5EViAgID0weCAweGZlZWRmYTsKLS5QSU5EVkwgID0weCAweGZlZWRmYTsKLS5QSU5EVyAgID0weCAweGZlZWRmYTsKLS5QTERDUyAgID0weCAweGZlZWRmYTsKLS5QTERDViAgID0weCAweGZlZWRmYTsKLS5QTEVRUyAgID0weCAweGZlZWRmYTsKLS5QTEVRViAgID0weCAweGZlZWRmYTsKLS5QTEVRVkwgID0weCAweGZlZWRmYTsKLS5QTEVTUyAgID0weCAweGZlZWRmYTsKLS5QTEVTViAgID0weCAweGZlZWRmYTsKLS5QTEVTVkwgID0weCAweGZlZWRmYTsKLS5QTE9EUyAgID0weCAweGZlZWRmYTsKLS5QTE9EViAgID0weCAweGZlZWRmYTsKLS5QTE9EVkwgID0weCAweGZlZWRmYTsKLS5QTU9ESiAgID0weCAweGZlZWRmYTsKLS5QTU9WICAgID0weCAweGZlZWRmYTsKLS5QTVBKICAgID0weCAweGZlZWRmYTsKLS5QTkVRUyAgID0weCAweGZlZWRmYTsKLS5QTkVRViAgID0weCAweGZlZWRmYTsKLS5QTkVRVkwgICAgPSAweGZlZWRmYWNlOwotLlBORVFXICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFBBR0UgICAgID0gMHhmZWVkZmFjZTsKLS5QUEVFICAgICAgPSAweGZlZWRmYWNlOwotLlBQVVQgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEQiAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRDICAgICAgPSAweGZlZWRmYWNlOwotLlBSREggICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJESSAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRKICAgICAgPSAweGZlZWRmYWNlOwotLlBSRFJTICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEUyAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRWICAgICAgPSAweGZlZWRmYWNlOwotLlBSTE4gICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJSQU4gICAgID0gMHhmZWVkZmFjZTsKLS5QUlNUICAgICAgPSAweGZlZWRmYWNlOwotLlBSV1QgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNDT04gICAgID0gMHhmZWVkZmFjZTsKLS5QU0NPUCAgICAgPSAweGZlZWRmYWNlOwotLlBTREVMICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNJTlMgICAgID0gMHhmZWVkZmFjZTsKLS5QU0xFTiAgICAgPSAweGZlZWRmYWNlOwotLlBTUE9TICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUQ1YgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RDVkwgICAgPSAweGZlZWRmYWNlOwotLlBTVE9TICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUT1YgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RPVkwgICAgPSAweGZlZWRmYWNlOwotLlBTVFJTICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUUlYgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RSVkwgICAgPSAweGZlZWRmYWNlOwotLlBXTE4gICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSQU4gICAgID0gMHhmZWVkZmFjZTsKLS5QV1JCICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSSCAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JJICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkogICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSUyAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JWICAgICAgPSAweGZlZWRmYWNlOwotKi8KLQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLm9vayBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5vb2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ODRiOTQuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLm9vaworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi1TMDBDMDAwMDc0MzEyRTZGNzU3NDJFNkY2QkMwDQotUzExODAwMDAwMDAwMEEyMDUzNDE0NjQ1NTM1NDRGNTI0NTIwNDEyMDIwMjAyMDIwNTJCRQ0KLVMxMTgwMDE1MzEzMzJFMzMyMDIwMjAyMDIwMjAyMDUyMzEzMzJFMzIyMDIwMjAyMDIwNzcNCi1TMTE4MDAyQTIwMjAwMEI1RTg2NjAwQjVFOUIxMURBMTVCOTkwMDAwMUYwMDAwMDAwQTUwDQotUzExODAwM0Y2NDAwMDAwMDNFMDAwMDAwNUMwMEE4MDBCQTAwRjAwMDA0MDAwMTAwMDI1MQ0KLVMxMTgwMDU0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MDA0MDMxQ0Y1MjU0NEM0OTQyRDANCi1TMTE4MDA2OTQzNEY0RTAwMDRFNUVDNTI1NDRDNDk0MjQzNEY0RTAwMDRFNUVENTI1NEYwDQotUzExODAwN0U0QzQ5NDI0MzRGNEUwMDQwMzFEMjUyNTQ0QzQ5NDI0MzRGNEUwMDAwMEEwOA0KLVMxMTgwMDkzN0Q1MjU0NEM0OTQyNTM1NDUyMDAxMEE0QTg1MjU0NEM0OTQyNDY0OTRDQUQNCi1TMTE4MDBBODAwMDIwMEI1RTg2RDAwMDAwMTYwMDBCNUU4NzMwMDAwMDI1NDAwMDIwMDZBDQotUzExODAwQkRCNUU5Mzc1MzQxNDY0NTUwNTI0OTRFNTQyMDAwMDAwNjAwMDIwMDA4MDA3OQ0KLVMxMTgwMEQyMDAwMDAzNDIwMEI1RTg2RTQ5NEU0OTU0NTM0MTQ2NDU1MzU0MDAwMDAyQzkNCi1TMTE4MDBFNzE4MDAwMDBFMDAwMDAwMDkwMjAwMzAwMDAwMDAwMDRFNTZGRkQ4QkE4RkRCDQotUzExODAwRkM2MzA2MkU0RTYxMDAwMDE2NDFGQTAwMzI0M0VFRkZEODcwMjYxMkQ4NTE0OQ0KLVMxMTgwMTExQzhGRkZDNEU1RTRFNzUyQjU3RkZGMjJGM0MwMDAwMDAwQTYwMDAwMDAyNTkNCi1TMTE4MDEyNjNCNkYwMDAyRkZGNjJGMkQwMDM4MkYyRDAwMzQ0RTRDNEU0QTQzNEY1MEU3DQotUzExODAxM0I1OTUyNDk0NzQ4NTQyMDU0NjU2QzY1NjY2RjZFMjA0MTQyMjA0QzIwNEQ2Qg0KLVMxMTgwMTUwMjA0NTcyNjk2MzczNzM2RjZFMkMyMDMxMzkzOTMzMDA0RTU2RkZGQ0JBQjUNCi1TMTE4MDE2NThGNjMwNDJFNEU2MUFDMjAyRTAwMEMwNjgwMDAwMDAwMEM0RTc2NTY4MDdDDQotUzExODAxN0E0RTc2MDI4MEZGRkZGRkZDNEFENTY2MDQ2MTAwMDBCMDJENDBGRkZDMjAwQg0KLVMxMTgwMThGNkMwMDNBMjIwODI0MkMwMDM2OTQ4MTRFNzYwNDgyMDAwMDAwMEM0RTc2RDINCi1TMTE4MDFBNDRBRDU2NjA0NjEwMDAwOEVCMDgyNkUwQzBDQUUwMDAwMDAwMTAwMEM2Q0VCDQotUzExODAxQjkwMDAwMEMyMDdDMDAwMDAwMDA2MTAwMDA2MDIwNkMwMDNBMjAwODY2MDQ2Qw0KLVMxMTgwMUNFNjEwMDAwNzYyMjA4RDJBRUZGRkM2ODA0NjEwMDAwNUMyMDgxMjE2RTAwNDMNCi1TMTE4MDFFMzEwMDAwNDIxNkUwMDBDMDAwODIyMDgwNjgxMDAwMDAwMEM2ODA0NjEwMEMyDQotUzExODAxRjgwMDQwMkQ0MTAwMTQyOTUwMDAzQTIwNkMwMDNBMjQwODY2MDQ2MTAwMDBCQw0KLVMxMTgwMjBEM0E0MjkwNDJBODAwMDQ0MkE4MDAwODRFNUUyMjVGMjg1RjUwOEY0RUU5MjINCi1TMTE4MDIyMjAwMDIyQjVGRkZGMjRFNUVEMURGMjg1RjJGMDgyQjQ4RkZGMkQwRDA0RURBDQotUzExODAyMzdEMDJCNTdGRkYyMkYzQzAwMDAwMDBFNjAwMEZFRTIyQjU3RkZGMjJGM0NENA0KLVMxMTgwMjRDMDAwMDAwMTA2MDAwRkVENDRFNTZGRkZDQkE4RjYzMDYyRTRFNjEwMEZFMkINCi1TMTE4MDI2MUI4MkQ2QzAwMzJGRkZDNjAwMDAwMTIyQjVGRkZGMjRGRUVGRkZDNDJBRUYxDQotUzExODAyNzZGRkZDNjAwMDAwODI0QUFFRkZGQzY3MDAwMDdBMjA2RUZGRkMyMDA4NjZBNw0KLVMxMTgwMjhCMDAwMDA0NjFCNjIyMjgwMDA0QjJBRTAwMTA2NzAwMDA2MjIyMDgwMjgxMEINCi1TMTE4MDJBMDAwMDAwMDAzNEE4MTY2NDAyMjA4MjI2QzAwM0EyNDA5QjI4MjZFMzQyNkI2DQotUzExODAyQjUxMDI4MDgwNjg0MDAwMDAwMEM2ODA0NjEwMEZGNzZCNjg0NkQyMDI2MTAxQg0KLVMxMTgwMkNBMjgwODk2ODQ0RTc2MDQ4MzAwMDAwMDBDNEU3NjRBRDU2NjA0NjEwMEZGQ0QNCi1TMTE4MDJERjVBQjZBODAwMDg2QzAwMDAwNDYxODIyMDZFRkZGQzIwMDg2NjA0NjEwMDc3DQotUzExODAyRjRGRjUyMkQ1MEZGRkM2MDgwNEFBRUZGRkM2NzAwMDAyQzIwNkVGRkZDMjAxOQ0KLVMxMTgwMzA5MDg2NjA0NjEwMEZGMzgyMjZFMDAwQzIyQTgwMDA4MjIwODA2ODEwMDAwQjINCi1TMTE4MDMxRTAwMEM2ODA0NjEwMEZGMTQyRDQxMDAxNDYwMDAwMDBDMjA2RTAwMEM0MjEwDQotUzExODAzMzM5MDQyQUUwMDE0NEU1RTIwNUYyODVGNTA4RjRFRDA0RkVERkYwMDcwN0Y0NA0KLVMxMTgwMzQ4MjA0RjQyNTg1MUM4RkZGQzQ4NkRGRjA4MUYzQzAwMDQzRjNDMDAwMTlGNDkNCi1TMTE4MDM1REZDMDAwMDAwMEMyMjRGNDVGQTA0RkUyMkRBMjJEQTIyREEyNjZDMDAyODFGDQotUzExODAzNzIyRjBDMjg2QzAwMkM0RUFCMDA2ODQ4NkRGRkI4NDg2REZGQjQyRjBDMjBFNw0KLVMxMTgwMzg3NkMwMDAwMjg2QzAwMDQ0RTkwOUZGQzAwMDAwMDUyMkYyREZGQzYyRjBDMzINCi1TMTE4MDM5QzIwNkMwMDA4Mjg2QzAwMEM0RTkwNzA1MjI2NkMwMDIwNEVBQjAwMUU0MTZBDQotUzExODAzQjFGQTA0QkUyNjZDMDAyMDRFQUIwMDdFMjY2QzAwMjA0RUFCMDA5RTQxRURENw0KLVMxMTgwM0M2RkZCQTI2NkMwMDIwNEVBQjAwN0UyNjZDMDAyMDRFQUIwMDlFMUYzQzAwOTgNCi1TMTE4MDNEQjI4M0YzQzAwMDEyNjZDMDAyMDRFQUIwMDlFOUZGQzAwMDAwMDUyMzAyREQyDQotUzExODAzRjBGRkNBNDhDMDJGMDAyRjBDMjA2QzAwMDgyODZDMDAwQzRFOTA3MDUyMjZCRg0KLVMxMTgwNDA1NkMwMDIwNEVBQjAwMUUyNjZDMDAyMDRFQUIwMDlFNDFGQTA0NUUyNjZDQzMNCi1TMTE4MDQxQTAwMjA0RUFCMDA3RTI2NkMwMDIwNEVBQjAwOUU0MUVERkY5RTcwMTYyNjcyDQotUzExODA0MkY2QzAwMjA0RUFCMDBDQTYwMDAwMDE2MkI1RkZGRjI0RkVERkYwMDJCN0M5Mg0KLVMxMTgwNDQ0MDAwMDAwMDFGRkI0NjAwMDAzRTQ0ODZERkYwODlGRkMwMDAwMDA1MjIwREINCi1TMTE4MDQ1OTRGNDNFREZGOUUzMDE5NzI1MDkyNDA2RjAyNDI0MUQwNDEzMEMwNkYwQTIzDQotUzExODA0NkU1MzQwRTI0MDMwRDk1MUM4RkZGQzlGRkMwMDAwMDA1MjIyNEY0NUZBMDMwMw0KLVMxMTgwNDgzRjYzMkRBMjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDA1MEZGQUE0ODZEMDINCi1TMTE4MDQ5OEZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMEEwRkY5NjQyQURGRjczDQotUzExODA0QUQwMDJCNkMwMDMyRkYwNDQ4N0EwM0M0M0YzQ0ZGRkY0ODZERkYwODI2NkMxQQ0KLVMxMTgwNEMyMDAyODJGMEMyODZDMDAyQzRFQUIwMEMwRkY3MDQ4NkRGRjA4MjY2QzAwODgNCi1TMTE4MDRENzI4MkYwQzI4NkMwMDJDNEVBQjAwQTRGRjVDNjAwMDAwNzgyQjVGRkZGMjlFDQotUzExODA0RUM0RkVERkYwMDQ4N0EwM0JBM0YzQ0ZGRkY0ODZERkYwODI2NkMwMDI4MkYxRg0KLVMxMTgwNTAxMEMyODZDMDAyQzRFQUIwMEMwRkYzNDlGRkMwMDAwMDA1MjIwNkRGRjA0QUMNCi1TMTE4MDUxNjIwMDgyRjAwMkYwQzIwNkMwMDEwMjg2QzAwMTQ0RTkwMkYwRjNGM0NGRjYwDQotUzExODA1MkJGRjQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDBDMEZGMDA4Rg0KLVMxMTgwNTQwREZGQzAwMDAwMDUyNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFQjYNCi1TMTE4MDU1NUFCMDBBNEZFRTY2MDAwMDFGMDIwNkRGRjA0MjAwODY2MDI2MTgwNEE5MDJFDQotUzExODA1NkE2NzAwMDE2QTIyMTAwMjgxMDAwMDAwMDM0QTgxNjY0QTIyMTAyNDJDMDBGMQ0KLVMxMTgwNTdGMzYwNDgyMDAwMDAwMEM2ODA0NjEwMEZDQUVCMjgyNkUzNDIyMTAyNDA4RjANCi1TMTE4MDU5NDA2ODIwMDAwMDAwQzY4MDQ2MTAwRkM5QUIyODI2RDIwMjIxMDI0MDg5MkE2DQotUzExODA1QTk4MjRFNzYwNDgxMDAwMDAwMEM0RTc2NEFENTY2MDQ2MTAwRkM3RUIyQThFMA0KLVMxMTgwNUJFMDAwODZDMDAwMDA2NjEwMEZGMjIyMDZERkYwNDIwMDg2NjA0NjEwMEZGQTYNCi1TMTE4MDVEMzE2MjIyODAwMDhEMkFERkYwMDY4MDQ2MTAwRkM1ODJCNDFGRjAwOUZGQzAyDQotUzExODA1RTgwMDAwMDA1MjI0MDgyRjAyMkYwQzIwNkMwMDEwMjg2QzAwMTQ0RTkwMkZCRg0KLVMxMTgwNUZEMEYzRjNDMDAwQzQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCRTUNCi1TMTE4MDYxMjAwQzBGRTJBREZGQzAwMDAwMDUyMjA2REZGMDQyMDA4NjYwNDYxMDBGRTM5DQotUzExODA2MjdDMjJGMjgwMDA0M0YzQzAwMEM0ODZERkYwODI2NkMwMDI4MkYwQzI4NkNEMQ0KLVMxMTgwNjNDMDAyQzRFQUIwMEJDRkRGQzIwNkRGRjA0MjAwODY2MDQ2MTAwRkU5QTJGODENCi1TMTE4MDY1MTI4MDAwODNGM0MwMDBDNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzY4DQotUzExODA2NjY0RUFCMDBCQ0ZERDQ5RkZDMDAwMDAwNTIyMDZERkYwNDIwMDg2NjA0NjE4NQ0KLVMxMTgwNjdCMDBGRTZDMjIxMDJGMDEyRjBDMjA2QzAwMTAyODZDMDAxNDRFOTAyRjBGRkYNCi1TMTE4MDY5MDNGM0MwMDBDNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMDYwDQotUzExODA2QTVDMEZEOThERkZDMDAwMDAwNTI0ODZERkYwODI2NkMwMDI4MkYwQzI4NkM3NQ0KLVMxMTgwNkJBMDAyQzRFQUIwMEE0RkQ3RTIwNkRGRjA0MjAwODY2MDQ2MTAwRkUxQzJCMUINCi1TMTE4MDZDRjUwRkYwNDYwMDBGRThBMjA2QzAwM0FCMUVERkYwNDY3MDAwMDZDNDg3QURCDQotUzExODA2RTQwMUU4M0YzQ0ZGRkY0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVEQw0KLVMxMTgwNkY5QUIwMEMwRkQ0MjlGRkMwMDAwMDA1MjIwNkRGRjA0MjAwODJGMDAyRjBDMkYNCi1TMTE4MDcwRTIwNkMwMDEwMjg2QzAwMTQ0RTkwMkYwRjNGM0NGRkZGNDg2REZGMDgyNjE3DQotUzExODA3MjM2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDBDMEZEMEVERkZDMDAwMDAwNTIzRA0KLVMxMTgwNzM4NDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMEE0RkNGNDQ4NjINCi1TMTE4MDc0RDdBMDE5ODNGM0NGRkZGNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzk2DQotUzExODA3NjI0RUFCMDBDMEZDRDg0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEUzMg0KLVMxMTgwNzc3QUIwMEE0RkNDNDQ4N0EwMTZBM0YzQ0ZGRkY0ODZERkYwODI2NkMwMDI4M0UNCi1TMTE4MDc4QzJGMEMyODZDMDAyQzRFQUIwMEMwRkNBODQ4NkRGRjA4MjY2QzAwMjgyRjU3DQotUzExODA3QTEwQzI4NkMwMDJDNEVBQjAwQTRGQzk0MjA2REZGMDQyMDA4MDY4MDAwMDAwOA0KLVMxMTgwN0I2MDAxODRFNzYyMjJDMDAzNjkyODA0RTc2MDI4MUZGRkZGRkZDNEFENTY2RjMNCi1TMTE4MDdDQjA0NjEwMEZBNkEyRjAxM0YzQzAwMEM0ODZERkYwODI2NkMwMDI4MkYwQ0U0DQotUzExODA3RTAyODZDMDAyQzRFQUIwMEJDRkM1NjJGMkRGRjAwM0YzQzAwMEM0ODZERkZBMw0KLVMxMTgwN0Y1MDgyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMEJDRkMzQTQ4NkRGRjA4ODcNCi1TMTE4MDgwQTI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQTRGQzI2NDg2REZGMDgxRjg2DQotUzExODA4MUYzQzAwMDEyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMDU0NDg2REZGQjgxNQ0KLVMxMTgwODM0NDg2REZGQjQyRjBDMjA2QzAwMTgyODZDMDAxQzRFOTA0ODZERkYwODQyRDgNCi1TMTE4MDg0OTI3MjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDA1NDQyQTcyRjJEMDAzOEYwDQotUzExODA4NUUyRjJEMDAzNDRFNEEwMDBBNDYzMTIwMjAyMDIwMjAyMDIwMjAwMDAyM0E5Qw0KLVMxMTgwODczM0EwMDAyMjkzQTAwMDAwMDMwMjAyMDIwMjAyMDQxNjQ2NDcyNjU3MzczMzcNCi1TMTE4MDg4ODIwMjAyMDIwNDk2NDY1NkU3NDY5NzQ3OTIwMjAyMDIwMjAyMDIwMjA1MzNBDQotUzExODA4OUQ2OTdBNjUyMDIwMjAyMDIwMjAyMDIwNEU2NTc4NzQwMDFENDk2RTc2NjFCMA0KLVMxMTgwOEIyNkM2OTY0MjA3MzY1Njc2RDY1NkU3NDIwNzM3NDYxNzI3NDY5NkU2NzIwMzUNCi1TMTE4MDhDNzYxNzQzQTIwMjAwMDE4NTM2NTY3NkQ2NTZFNzQyMDZDNjk3Mzc0MjA2MzdGDQotUzExODA4REM2RjcyNzI3NTcwNzQ2NTY0M0EyMDAwMDAwMDE4MjAyMDIwNDE3NjYxNjkzQg0KLVMxMTgwOEYxNkM2MTYyNkM2NTIwMjAyMDIwMjAyMDIwMjA1NTczNjU2NDRGRURGRkYyMzANCi1TMTE4MDkwNjlGRkMwMDAwMDAwQTYxMDAwMTU2NDFFQzAwMzAyMERGMjBERjMwREYyMEYxDQotUzExODA5MUIyQzAwMzI1NjgwNEU3NjAyODBGRkZGRkZGQzRBRDU2NjA0NjEwMEY5MEE2Mw0KLVMxMTgwOTMwMjk0MDAwMzIyOTQwMDAzQTYwMDAwMDNFMkI1RkZGRjI0RkVERkZGMjIwMEENCi1TMTE4MDk0NTJDMDAzMjU2ODA0RTc2MDI4MEZGRkZGRkZDNEFENTY2MDQ2MTAwRjhFMDY0DQotUzExODA5NUEyOTQwMDAzQTIwNkMwMDNBMjIwODY2MDQ2MTAwRjhERTQyOTA0MkE4MDA5NA0KLVMxMTgwOTZGMDQ0MkE4MDAwODYwMDAwMDlFNEEyQzAwMzA2NzAwMDAxQTIwNkMwMDNBOEUNCi1TMTE4MDk4NDIwMDg2NjAyNjFCMjQyOTA0MkE4MDAwNDQyQTgwMDA4NjAwMDAwN0UyMDA3DQotUzExODA5OTk2QzAwM0EyMDA4NjYwMjYxOUE0QTkwNjcwMDAwNkUyMjEwMDI4MTAwMDBCMA0KLVMxMTgwOUFFMDAwMzRBODE2NjRBMjIxMDI0MkMwMDM2MDQ4MjAwMDAwMDBDNjgwNDYxOUINCi1TMTE4MDlDMzAwRjg3NEIyODI2RTM0MjIxMDI0MDgwNjgyMDAwMDAwMEM2ODA0NjEwMDFBDQotUzExODA5RDhGODYwQjI4MjZEMjAyMjEwMjQwODkyODI0RTc2MDQ4MTAwMDAwMDBDNEVEOA0KLVMxMTgwOUVENzY0QUQ1NjYwNDYxMDBGODQ0QjJBODAwMDg2QzAwMDAwNjYxMDBGRjNDRTUNCi1TMTE4MEEwMjIwNkMwMDNBMjAwODY2MDQ2MTAwRkYzMDI5NTAwMDNBNjA4NDQyQTcyRjQ0DQotUzExODBBMTcyRDAwMzgyRjJEMDAzNDRFNEE0RTU2MDAwMDUxOEY0MkE3MUYzQzAwMEU2Mw0KLVMxMTgwQTJDNDI2NzQ4N0EwMDEyNDI2NzQyMjcyRjNDMDBCNUU4NkU0RTQ5MDAwRTUwQjcNCi1TMTE4MEE0MThGNEU1RTIwNUYyODVGNEVFODAwMDIyMDdDMDAwMDAwMDA2MDA0MkI1Rjk5DQotUzExODBBNTZGRkYyNEU1RUQxREYyODVGMkYwOEQwRDA0RUQwNDNGQTAwMDREM0ZDMDBBRQ0KLVMxMTgwQTZCMDI3MDRFMkY0OTAwMEE0M0ZBMDAwNEQzRkMwMDAwMDA0MDJGNDkwMDA2NjINCi1TMTE4MEE4MDQxRkEwMDA0RDFGQ0ZGRkZGNTdBMjAyODAwNTY2NjAwMDAyMjIyMDk5MjAxDQotUzExODBBOTU4ODIxNDEwMDU2NDI4MTI0NDhEMjVBQjVDOTZERkE0NDQxRDM2ODAwNUFBRQ0KLVMxMTEwQUFBMUY3QzAwMDEwMDA0NEU3NTQyMkYwMDA0NEU3NTlGDQotUzkwMzAwMDBGQw0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0xLnJvIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTEucm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzM2E3Y2MuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTEucm8KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMi5ybyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0yLnJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDRhNzlkLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0yLnJvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTMucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMy5ybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1OTM0Mi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMy5ybworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5sZCBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5sZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxZTQxMy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDIubGQKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotT1VUUFVUX0ZPUk1BVCgic3JlYyIpCi1TRUNUSU9OUwotewotCi0KLS50ZXh0IDAgOiB7ICooIjkiKSAqKCIxMCIpICooIjExIikgKigiMTIiKSAqKCIxMyIpICooIjE0IikgKigiMTUiKQotCQkqKCI3IikgKigiOCIpICooIjAiKSAqKCIxIikgKigiMiIpICooIjMiKSAqKCI0IikgfQotLmJzcyAgIDogeyAgKigiNSIpICooIjYiKSB9Ci0KLS5QQUZJICAgID0weDAwMDAwMDUwIDsKLS5QQ0hJTyAgID0weDAwMDAwMEQwIDsKLS5QQ0xPICAgID0weDAwMDAwMDU0IDsKLS5QQ1ZCU1YgID0weDAwMDAwMDBFIDsKLS5QQ1ZUU1UgID0weDAwMDAwMDEyIDsKLS5QQ1ZUU1YgID0weDAwMDAwMDE2IDsKLS5QQ1ZUU1ZMID0weDAwMDAwMDFBIDsKLS5QQ1ZUVVMgID0weDAwMDAwMDFFIDsKLS5QRElTICAgID0weDAwMDAwMDIyIDsKLS5QRElTTCAgID0weDAwMDAwMDI2IDsKLS5QRFZKICAgID0weDAwMDAwMDJBIDsKLS5QRUlPICAgID0weDAwMDAwMENDIDsKLS5QRU9GICAgID0weDAwMDAwMDU4IDsKLS5QRU9MICAgID0weDAwMDAwMDVDIDsKLS5QRVFVUyAgID0weDAwMDAwMDJFIDsKLS5QRVFVViAgID0weDAwMDAwMDMyIDsKLS5QRVFVVkwgID0weDAwMDAwMDM2IDsKLS5QRVFVVyAgID0weDAwMDAwMERFIDsKLS5QR0NNICAgID0weDAwMDAwMDY0IDsKLS5QR0VRUyAgID0weDAwMDAwMDNBIDsKLS5QR0VRViAgID0weDAwMDAwMDNFIDsKLS5QR0VRVkwgID0weDAwMDAwMDQyIDsKLS5QR0VUICAgID0weDAwMDAwMDYwIDsKLS5QR1JUUyAgID0weDAwMDAwMDQ2IDsKLS5QR1JUViAgID0weDAwMDAwMDRBIDsKLS5QR1JUVkwgID0weDAwMDAwMDRFIDsKLS5QSUFDVCAgID0weDAwMDAwMDZDIDsKLS5QSUZEICAgID0weDAwMDAwMDY4IDsKLS5QSU5EUyAgID0weDAwMDAwMDUyIDsKLS5QSU5EViAgID0weDAwMDAwMDU2IDsKLS5QSU5EVkwgID0weDAwMDAwMDVBIDsKLS5QSU5EVyAgID0weDAwMDAwMEQ2IDsKLS5QTERDUyAgID0weDAwMDAwMDVFIDsKLS5QTERDViAgID0weDAwMDAwMDYyIDsKLS5QTEVRUyAgID0weDAwMDAwMDY2IDsKLS5QTEVRViAgID0weDAwMDAwMDZBIDsKLS5QTEVRVkwgID0weDAwMDAwMDZFIDsKLS5QTEVTUyAgID0weDAwMDAwMDcyIDsKLS5QTEVTViAgID0weDAwMDAwMDc2IDsKLS5QTEVTVkwgID0weDAwMDAwMDdBIDsKLS5QTE9EUyAgID0weDAwMDAwMDdFIDsKLS5QTE9EViAgID0weDAwMDAwMDgyIDsKLS5QTE9EVkwgID0weDAwMDAwMDg2IDsKLS5QTU9ESiAgID0weDAwMDAwMDhBIDsKLS5QTU9WICAgID0weDAwMDAwMEUyIDsKLS5QTVBKICAgID0weDAwMDAwMDhFIDsKLS5QTkVRUyAgID0weDAwMDAwMDkyIDsKLS5QTkVRViAgID0weDAwMDAwMDk2IDsKLS5QTkVRVkwgID0weDAwMDAwMDlBIDsKLS5QTkVRVyAgID0weDAwMDAwMERBIDsKLS5QUEFHRSAgID0weDAwMDAwMEQ0IDsKLS5QUEVFICAgID0weDAwMDAwMDcwIDsKLS5QUFVUICAgID0weDAwMDAwMDc0IDsKLS5QUkRCICAgID0weDAwMDAwMDc4IDsKLS5QUkRDICAgID0weDAwMDAwMDdDIDsKLS5QUkRIICAgID0weDAwMDAwMDgwIDsKLS5QUkRJICAgID0weDAwMDAwMDg0IDsKLS5QUkRKICAgID0weDAwMDAwMDg4IDsKLS5QUkRSUyAgID0weDAwMDAwMEM4IDsKLS5QUkRTICAgID0weDAwMDAwMDhDIDsKLS5QUkRWICAgID0weDAwMDAwMDkwIDsKLS5QUkxOICAgID0weDAwMDAwMDk0IDsKLS5QUlJBTiAgID0weDAwMDAwMDk4IDsKLS5QUlNUICAgID0weDAwMDAwMDlDIDsKLS5QUldUICAgID0weDAwMDAwMEEwIDsKLS5QU0NPTiAgID0weDAwMDAwMDlFIDsKLS5QU0NPUCAgID0weDAwMDAwMEEyIDsKLS5QU0RFTCAgID0weDAwMDAwMEE2IDsKLS5QU0lOUyAgID0weDAwMDAwMEFBIDsKLS5QU0xFTiAgID0weDAwMDAwMEFFIDsKLS5QU1BPUyAgID0weDAwMDAwMEIyIDsKLS5QU1RDViAgID0weDAwMDAwMEI2IDsKLS5QU1RDVkwgID0weDAwMDAwMEJBIDsKLS5QU1RPUyAgID0weDAwMDAwMEJFIDsKLS5QU1RPViAgID0weDAwMDAwMEMyIDsKLS5QU1RPVkwgID0weDAwMDAwMEM2IDsKLS5QU1RSUyAgID0weDAwMDAwMENBIDsKLS5QU1RSViAgID0weDAwMDAwMENFIDsKLS5QU1RSVkwgID0weDAwMDAwMEQyIDsKLS5QV0xOICAgID0weDAwMDAwMEE0IDsKLS5QV1JBTiAgID0weDAwMDAwMEE4IDsKLS5QV1JCICAgID0weDAwMDAwMEFDIDsKLS5QV1JDICAgID0weDAwMDAwMEIwIDsKLS5QV1JIICAgID0weDAwMDAwMEI0IDsKLS5QV1JJICAgID0weDAwMDAwMEI4IDsKLS5QV1JKICAgID0weDAwMDAwMEJDIDsKLS5QV1JTICAgID0weDAwMDAwMEMwIDsKLS5QV1JWICAgID0weDAwMDAwMEM0IDsKLQotLyoKLS5QQUZJPTB4ICAgPSAweDAwOwotLlBDSElPICAgPTB4IDB4MDAwMDAwOwotLlBDTE8gICAgPTB4IDY0IDsKLS5QQzsKLS5QQ1ZUU1UgID0weCAweDAwMDAwMDsKLS5QQ1ZUU1YgID0weCAweDAwMDAwMDsKLS5QQ1ZUU1ZMID0weCAweDAwMDAwMDsKLS5QQ1ZUVVMgID0weCAxNTggOwotLlA7Ci0uUERJU0wgICA9MHggMHgwMDAwMDA7Ci0uUERWSiAgICA9MHggMHgwMDAwMDA7Ci0uUEVJTyAgICA9MHggMHgwMDAwMDA7Ci0uUEVPRiAgICA9MHggMHgwMDAwMDA7Ci0uUEVPTCAgICA9MHggMHgwMDAwMDA7Ci0uUEVRVVMgICA9MHggMHgwMDAwMDA7Ci0uUEVRVVYgICA9MHggMHgwMDAwMDA7Ci0uUEVRVVZMICA9MHggMHgwMDAwMDA7Ci0uUEVRVVcgICA9MHggMHgwMDAwMDA7Ci0uUEdDTSAgICA9MHggMHgwMDAwMDA7Ci0uUEdFUVMgICA9MHggMHgwMDAwMDA7Ci0uUEdFUVYgICA9MHggMHgwMDAwMDA7Ci0uUEdFUVZMICA9MHggMHgwMDAwMDA7Ci0uUEdFVCAgICA9MHggMHgwMDAwMDA7Ci0uUEdSVFMgICA9MHggMHgwMDAwMDA7Ci0uUEdSVFYgICA9MHggMHgwMDAwMDA7Ci0uUEdSVFZMICA9MHggMHgwMDAwMDA7Ci0uUElBQ1QgICA9MHggMHgwMDAwMDA7Ci0uUElGRCAgICA9MHggMTI2IDsKLS5QOwotLlBJTkRWICAgPTB4IDB4MDAwMDAwOwotLlBJTkRWTCAgPTB4IDB4MDAwMDAwOwotLlBJTkRXICAgPTB4IDB4MDAwMDAwOwotLlBMRENTICAgPTB4IDB4MDAwMDAwOwotLlBMRENWICAgPTB4IDB4MDAwMDAwOwotLlBMRVFTICAgPTB4IDB4MDAwMDAwOwotLlBMRVFWICAgPTB4IDB4MDAwMDAwOwotLlBMRVFWTCAgPTB4IDB4MDAwMDAwOwotLlBMRVNTICAgPTB4IDB4MDAwMDAwOwotLlBMRVNWICAgPTB4IDB4MDAwMDAwOwotLlBMRVNWTCAgPTB4IDB4MDAwMDAwOwotLlBMT0RTICAgPTB4IDB4MDAwMDAwOwotLlBMT0RWICAgPTB4IDB4MDAwMDAwOwotLlBMT0RWTCAgPTB4IDB4MDAwMDAwOwotLlBNT0RKICAgPTB4IDB4MDAwMDAwOwotLlBNT1YgICAgPTB4IDB4MDAwMDAwOwotLlBNUEogICAgPTB4IDB4MDAwMDAwOwotLlBORVFTICAgPTB4IDB4MDAwMDAwOwotLlBORVFWICAgPTB4IDB4MDAwMDAwOwotLlBORVFWTCAgPTB4IDB4MDAwMDAwOwotLlBORVFXICAgPTB4IDB4MDAwMDAwOwotLlBQQUdFICAgPTB4IDB4MDAwMDAwOwotLlBQRUUgICAgPTB4IDB4MDAwMDAwOwotLlBQVVQgICAgPTB4IDB4MDAwMDAwOwotLlBSREIgICAgPTB4IDB4MDAwMDAwOwotLlBSREMgICAgPTB4IDB4MDAwMDAwOwotLlBSREggICAgPTB4IDB4MDAwMDAwOwotLlBSREkgICAgPTB4IDB4MDAwMDAwOwotLlBSREogICAgPTB4IDB4MDAwMDAwOwotLlBSRFJTICAgPTB4IDB4MDAwMDAwOwotLlBSRFMgICAgPTB4IDB4MDAwMDAwOwotLlBSRFYgICAgPTB4IDB4MDAwMDAwOwotLlBSTE4gICAgPTB4IDB4MDAwMDAwOwotLlBSUkFOICAgPTB4IDB4MDAwMDAwOwotLlBSU1QgICAgPTB4IDB4MDAwMDAwOwotLlBSV1QgICAgPTB4IDB4MDAwMDAwOwotLlBTQ09OICAgPTB4IDB4MDAwMDAwOwotLlBTQ09QICAgPTB4IDB4MDAwMDAwOwotLlBTREVMICAgPTB4IDB4MDAwMDAwOwotLlBTSU5TICAgPTB4IDB4MDAwMDAwOwotLlBTTEVOICAgPTB4IDB4MDAwMDAwOwotLlBTUE9TICAgPTB4IDB4MDAwMDAwOwotLlBTVENWICAgPTB4IDB4MDAwMDAwOwotLlBTVENWTCAgPTB4IDB4MDAwMDAwOwotLlBTVE9TICAgPTB4IDB4MDAwMDAwOwotLlBTVE9WICAgPTB4IDB4MDAwMDAwOwotLlBTVE9WTCAgPTB4IDB4MDAwMDAwOwotLlBTVFJTICAgPTB4IDB4MDAwMDAwOwotLlBTVFJWICAgPTB4IDB4MDAwMDAwOwotLlBTVFJWTCAgPTB4IDB4MDAwMDAwOwotLlBXTE4gICAgPTB4IDB4MDAwMDAwOwotLlBXUkFOICAgPTB4IDB4MDAwMDAwOwotLlBXUkIgICAgPTB4IDB4MDAwMDAwOwotLlBXUkMgICAgPTB4IDB4MDAwMDAwOwotLlBXUkggICAgPTB4IDB4MDAwMDAwOwotLlBXUkkgICAgPTB4IDB4MDAwMDAwOwotLlBXUkogICAgPTB4IDB4MDAwMDAwOwotLlBXUlMgICAgPTB4IDB4MDAwMDAwOwotLlBXUlYgICAgPTB4IDB4MDAwMDAwOwotCi0qLwotLyoKLS5QPTB4ICAgICAgPSAwOwotLlBDSElPICAgPTB4IDB4ZmVlZGZhOwotLlBDTE8gICAgPTB4IDB4ZmVlZGZhOwotLlBDVkJTViAgPTB4IDB4ZmVlZGZhOwotLlBDVlRTVSAgPTB4IDB4ZmVlZGZhOwotLlBDVlRTViAgPTB4IDB4ZmVlZGZhOwotLlBDVlRTVkwgPTB4IDB4ZmVlZGZhOwotLlBDVlRVUyAgPTB4IDB4ZmVlZGZhOwotLlBESVMgICAgPTB4IDB4ZmVlZGZhOwotLlBESVNMICAgPTB4IDB4ZmVlZGZhOwotLlBEVkogICAgPTB4IDB4ZmVlZGZhOwotLlBFSU8gICAgPTB4IDB4ZmVlZGZhOwotLlBFT0YgICAgPTB4IDB4ZmVlZGZhOwotLlBFT0wgICAgPTB4IDB4ZmVlZGZhOwotLlBFUVVTICAgPTB4IDB4ZmVlZGZhOwotLlBFUVVWICAgPTB4IDB4ZmVlZGZhOwotLlBFUVVWTCAgPTB4IDB4ZmVlZGZhOwotLlBFUVVXICAgPTB4IDB4ZmVlZGZhOwotLlBHQ00gICAgPTB4IDB4ZmVlZGZhOwotLlBHRVFTICAgPTB4IDB4ZmVlZGZhOwotLlBHRVFWICAgPTB4IDB4ZmVlZGZhOwotLlBHRVFWTCAgPTB4IDB4ZmVlZGZhOwotLlBHRVQgICAgPTB4IDB4ZmVlZGZhOwotLlBHUlRTICAgPTB4IDB4ZmVlZGZhOwotLlBHUlRWICAgPTB4IDB4ZmVlZGZhOwotLlBHUlRWTCAgPTB4IDB4ZmVlZGZhOwotLlBJQUNUICAgPTB4IDB4ZmVlZGZhOwotLlBJRkQgICAgPTB4IDB4ZmVlZGZhOwotLlBJTkRTICAgPTB4IDB4ZmVlZGZhOwotLlBJTkRWICAgPTB4IDB4ZmVlZGZhOwotLlBJTkRWTCAgPTB4IDB4ZmVlZGZhOwotLlBJTkRXICAgPTB4IDB4ZmVlZGZhOwotLlBMRENTICAgPTB4IDB4ZmVlZGZhOwotLlBMRENWICAgPTB4IDB4ZmVlZGZhOwotLlBMRVFTICAgPTB4IDB4ZmVlZGZhOwotLlBMRVFWICAgPTB4IDB4ZmVlZGZhOwotLlBMRVFWTCAgPTB4IDB4ZmVlZGZhOwotLlBMRVNTICAgPTB4IDB4ZmVlZGZhOwotLlBMRVNWICAgPTB4IDB4ZmVlZGZhOwotLlBMRVNWTCAgPTB4IDB4ZmVlZGZhOwotLlBMT0RTICAgPTB4IDB4ZmVlZGZhOwotLlBMT0RWICAgPTB4IDB4ZmVlZGZhOwotLlBMT0RWTCAgPTB4IDB4ZmVlZGZhOwotLlBNT0RKICAgPTB4IDB4ZmVlZGZhOwotLlBNT1YgICAgPTB4IDB4ZmVlZGZhOwotLlBNUEogICAgPTB4IDB4ZmVlZGZhOwotLlBORVFTICAgPTB4IDB4ZmVlZGZhOwotLlBORVFWICAgPTB4IDB4ZmVlZGZhOwotLlBORVFWTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUE5FUVcgICAgID0gMHhmZWVkZmFjZTsKLS5QUEFHRSAgICAgPSAweGZlZWRmYWNlOwotLlBQRUUgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFBVVCAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRCICAgICAgPSAweGZlZWRmYWNlOwotLlBSREMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJESCAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRJICAgICAgPSAweGZlZWRmYWNlOwotLlBSREogICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEUlMgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRTICAgICAgPSAweGZlZWRmYWNlOwotLlBSRFYgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJMTiAgICAgID0gMHhmZWVkZmFjZTsKLS5QUlJBTiAgICAgPSAweGZlZWRmYWNlOwotLlBSU1QgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJXVCAgICAgID0gMHhmZWVkZmFjZTsKLS5QU0NPTiAgICAgPSAweGZlZWRmYWNlOwotLlBTQ09QICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNERUwgICAgID0gMHhmZWVkZmFjZTsKLS5QU0lOUyAgICAgPSAweGZlZWRmYWNlOwotLlBTTEVOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNQT1MgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RDViAgICAgPSAweGZlZWRmYWNlOwotLlBTVENWTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUT1MgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RPViAgICAgPSAweGZlZWRmYWNlOwotLlBTVE9WTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUUlMgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RSViAgICAgPSAweGZlZWRmYWNlOwotLlBTVFJWTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdMTiAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JBTiAgICAgPSAweGZlZWRmYWNlOwotLlBXUkIgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSQyAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JIICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkkgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSSiAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JTICAgICAgPSAweGZlZWRmYWNlOwotLlBXUlYgICAgICA9IDB4ZmVlZGZhY2U7Ci0qLwotCi19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDIub29rIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLm9vawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmMjRhNS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDIub29rCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotUzAxMjAwMDA2OTZFNjk3NDc0NjU3Mzc0NUY2NTcwNjMyRTczNzJDRg0KLVMxMTgwMDAwMDAwMDAwMDA0OTRFNDk1NDU0NDU1MzU0MjAyMDUwNDEzMDM1MjAyMDUyQUINCi1TMTE4MDAxNTMxMzMyRTMzMjAyMDIwMjAyMDIwMjA1MjMxMzMyRTMyMjAyMDIwMjAyMDc3DQotUzExODAwMkEyMDIwMDA5MzRCNUIwMEI1RTZDMTFCMDg5REQ2MDAwMDU0MDAwMDAwMDVGOQ0KLVMxMTgwMDNGNUEwMDAwMDA0ODAwNUMwMEE2MDAwMDAxMEEwMTI2MDAwNDAwMDEwMDAyQ0INCi1TMTE4MDA1NDAwOTAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwNDAyMDIwMDAwMDQ5NEY1RjhBDQotUzExODAwNjk1MjQ1NTM0NTUyNTY0MTUyNTQ0QzQ5NDI0MzRGNEUwMDQwNDg0NTAxMDAzQg0KLVMxMTgwMDdFNTA1RjQxNEM0QzIwMjAyMDIwMjA1MjU0NEM0OTQyNDM0RjRFMDEwMDAwRTMNCi1TMTE4MDA5MzAwMDA5QzAxMDAwMDAwMDAwMDAwMDg1MzQ1NTA0MTUyNDE1NDQ1MDAwODUyDQotUzExODAwQTgwMDA4MDA0MDMxQ0Y1MjU0NEM0OTQyNDM0RjRFMDAwNEU1RUM1MjU0NENEMw0KLVMxMTgwMEJENDk0MjQzNEY0RTAwQjVFODZENTM0MTQ2NDU1MzU0NEY1MjAwMDA0RjI4RDcNCi1TMTE4MDBEMjUzNTk1MzU0NDU0RDQ5NEQwMEI1RTg3MzUzNDE0NjQ1NTM1NDRGNTIwMDIzDQotUzExODAwRTc0MDMxRDI1MjU0NEM0OTQyNDM0RjRFMDAwMDBBN0Q1MjU0NEM0OTQyNTMwOQ0KLVMxMTgwMEZDNTQ1MjAwMTBBNEE4NTI1NDRDNDk0MjQ2NDk0QzAwMDEwMEI1RTZDMDQ5RUMNCi1TMTE4MDExMTRFNDk1NDU0NDU1MzU0MjAyMDAwMDAwNjE2MDIwMDA4MDAwMDAwMDIzMjEwDQotUzExODAxMjYwMDQ4MDAwMDAwMDA0RTU2RkZGMEJBOEY2MzA2MkU0RTYxMDAwMEJDNDE1OQ0KLVMxMTgwMTNCRkEwMEY0NDNFRUZGRjAzMkQ4MkQ3QzAwMDAwMDAxRkZGQzIwNkUwMDA4NTgNCi1TMTE4MDE1MDIwMDg2NjA0NjEwMDAwQkEyMjJFRkZGQzUzODE0QTgxNkMwNDYxMDAwMDJFDQotUzExODAxNjU5RTIyNDhEM0U5RkZGQzQxRjAxODAwQjNDODYzRUU0QTEwNjYwMDAwMDZFNw0KLVMxMTgwMTdBNjAwMDAwNjI0MUVFRkZGMDI2NkMwMDM4NEVBQjAwN0UyMDZFMDAwODIwOTUNCi1TMTE4MDE4RjA4NjYwNDYxMDAwMDdDMjIyRUZGRkM1MzgxNEE4MTZDMDQ2MTAwMDA2MEVEDQotUzExODAxQTQyMjQ4RDNFOUZGRkM0MUYwMTgwMEIzQzg2M0VFMUYxMDNGM0MwMDAxMjYzQg0KLVMxMTgwMUI5NkMwMDM4NEVBQjAwOUU0MUVFRkZGMDcwMEMyNjZDMDAzODRFQUIwMENBQ0INCi1TMTE4MDFDRTUyQUVGRkZDMENBRTAwMDAwMDBBRkZGQzZGMDBGRjcwNDFFRUZGRjA0MzFGDQotUzExODAxRTNFRTAwMEMyMkQ4MjJEODIyRDg0RTVFMjA1RjU4OEY0RUQwMkI1N0ZGRjI3OA0KLVMxMTgwMUY4MkYzQzAwMDAwMDBBNjAwMDAwMUUyQjU3RkZGMjJGM0MwMDAwMDAwRjYwQUUNCi1TMTE4MDIwRDAwMDAxMDJCNTdGRkYyMkYzQzAwMDAwMDEwNjAwMDAwMDIzQjZGMDAwMkNDDQotUzExODAyMjJGRkY2MkYyRDAwMzgyRjJEMDAzNDRFNEM0RTRBMDAwMDRGRURGRUVBMjAzNA0KLVMxMTgwMjM3M0MwMDAwMDA4QTIwNEY0MjU4NTFDOEZGRkM0ODZERkVFQTFGM0MwMDA0Q0YNCi1TMTE4MDI0QzNGM0MwMDAxOUZGQzAwMDAwMDBDMjI0RjQ1RkEwMkQ0MjJEQTIyREEyMkQ2DQotUzExODAyNjFEQTI2NkMwMDQwMkYwQzI4NkMwMDQ0NEVBQjAwNjg0ODZERkZCODQ4NkQ0Mw0KLVMxMTgwMjc2RkZCNDJGMEMyMDZDMDAwODI4NkMwMDBDNEU5MDlGRkMwMDAwMDA1MjJGNTMNCi1TMTE4MDI4QjJERkZDNjJGMEMyMDZDMDAxMDI4NkMwMDE0NEU5MDcwNTIyNjZDMDAzODdGDQotUzExODAyQTA0RUFCMDAxRTQxRkEwMjk0MjY2QzAwMzg0RUFCMDA3RTI2NkMwMDM4NEUwNA0KLVMxMTgwMkI1QUIwMDlFNDFFREZGQkEyNjZDMDAzODRFQUIwMDdFMjY2QzAwMzg0RUFCRkMNCi1TMTE4MDJDQTAwOUUxRjNDMDAyODNGM0MwMDAxMjY2QzAwMzg0RUFCMDA5RTlGRkMwMDgyDQotUzExODAyREYwMDAwNTIzMDJERkZDQTQ4QzAyRjAwMkYwQzIwNkMwMDEwMjg2QzAwMTREOA0KLVMxMTgwMkY0NEU5MDcwNTIyNjZDMDAzODRFQUIwMDFFMjY2QzAwMzg0RUFCMDA5RTQxQ0UNCi1TMTE4MDMwOUZBMDIzNDI2NkMwMDM4NEVBQjAwN0UyNjZDMDAzODRFQUIwMDlFNDFFRERCDQotUzExODAzMUVGRjgwNzAxNjI2NkMwMDM4NEVBQjAwQ0E5RkZDMDAwMDAwMEU2MTAwMDIyOA0KLVMxMTgwMzMzMjg0MUVERkY5RTIwREYyMERGMjBERjMwREY0QTJERkY5RTY3MDAwMDNBRkQNCi1TMTE4MDM0ODU5OEYyRjJERkZBMDJGMkRGRkE4MkYwQzIwNkMwMDE4Mjg2QzAwMUM0RUQ5DQotUzExODAzNUQ5MDAxQjgyQjVGRkY5QTJGMkRGRjlBMkYyREZGQTQyRjJERkZBODJGMENFOQ0KLVMxMTgwMzcyMjA2QzAwMjAyODZDMDAyNDRFOTA2MDAwMDAzNDU5OEYyRjJERkZBMDQ4NzENCi1TMTE4MDM4NzZERkZBODJGMEMyMDZDMDAyODI4NkMwMDJDNEU5MDJCNUZGRjk2MkYyRDQxDQotUzExODAzOUNGRkE0MkYyREZGOTYyRjJERkZBODJGMEMyMDZDMDAyMDI4NkMwMDI0NEVDNA0KLVMxMTgwM0IxOTA0ODZERkVFQTlGRkMwMDAwMDA1MjIwNEY0M0VERkY4MDMwMTk3MjUwRjANCi1TMTE4MDNDNjkyNDA2RjAyNDI0MUQwNDEzMEMwNkYwQTUzNDBFMjQwMzBEOTUxQzhGRjA4DQotUzExODAzREJGQzlGRkMwMDAwMDA1MjIyNEY0NUZBMDE1QzMyREEyNjZDMDA0MDJGMENGQQ0KLVMxMTgwM0YwMjg2QzAwNDQ0RUFCMDA1MDAxMkM0ODZERkVFQTI2NkMwMDQwMkYwQzI4RDQNCi1TMTE4MDQwNTZDMDA0NDRFQUIwMEEwMDExODQ4N0EwMTM0M0YzQ0ZGRkY0ODZERkVFQTZGDQotUzExODA0MUEyNjZDMDA0MDJGMEMyODZDMDA0NDRFQUIwMEMwMDBGQzQ4NkRGRUVBMjY2Qw0KLVMxMTgwNDJGNkMwMDQwMkYwQzI4NkMwMDQ0NEVBQjAwQTQwMEU4NDJBREZGQjAyQjdDMkINCi1TMTE4MDQ0NDAwMDAwMDAxRkZBQzU5OEYyRjJERkZBQzYxMDAwMTdFMkI1RkZGQjAyQkMwDQotUzExODA0NTk0MEZGQjAyRjJERkZBQzNGM0MwMDBBNDg2REZFRUEyNjZDMDA0MDJGMEM2NQ0KLVMxMTgwNDZFMjg2QzAwNDQ0RUFCMDBCQzAwQUU5RkZDMDAwMDAwMEMyRjJERkZCMDYxMjcNCi1TMTE4MDQ4MzAwRkNBODJGMEYzRjNDMDAwQTQ4NkRGRUVBMjY2QzAwNDAyRjBDMjg2Q0JCDQotUzExODA0OTgwMDQ0NEVBQjAwQzAwMDg2REZGQzAwMDAwMDBDNDg2REZFRUEyNjZDMDBCMg0KLVMxMTgwNEFENDAyRjBDMjg2QzAwNDQ0RUFCMDBBNDAwNkM1MkFERkZBQzBDQUQwMDAwNzcNCi1TMTE4MDRDMjAwMEFGRkFDNkY4MjQ4NkRGRUVBMUYzQzAwMDEyNjZDMDA0MDJGMEMyODREDQotUzExODA0RDc2QzAwNDQ0RUFCMDA1NDQ4NkRGRkI4NDg2REZGQjQyRjBDMjA2QzAwMzA0NA0KLVMxMTgwNEVDMjg2QzAwMzQ0RTkwNDg2REZFRUE0MjI3MjY2QzAwNDAyRjBDMjg2QzAwQUENCi1TMTE4MDUwMTQ0NEVBQjAwNTQ0MkE3MkYyRDAwMzgyRjJEMDAzNDRFNEEyQjU3RkZGMjM4DQotUzExODA1MTYyRjNDMDAwMDAwMEM2MDAwRkQwMDJCNTdGRkYyMkYzQzAwMDAwMDY0NjA1Ng0KLVMxMTgwNTJCMDBGQ0YyMDAwQTQ2MzEyMDIwMjAyMDIwMjAyMDIwMDAwMjNBM0EwMDAyRDANCi1TMTE4MDU0MDI5M0EwMDAwMDAxNDIwMjAyMDIwMjAyMDQzNjE3MzY1MjAyMDIwMjA1MjFEDQotUzExODA1NTU2NTczNzU2Qzc0NDFGQTAwMDREMUZDRkZGRkZBQTAyMDI4MDAzQzQzRkFGQg0KLVMxMTgwNTZBMDAwNEQzRkMwMDAwMDFENjQ1RkEwMDA0RDVGQzAwMDAwMjVFMjYwQTU4RDINCi1TMTE4MDU3RjhBRDA4ODU1ODAyMjI4MDA1NjY2MDAwMDJFMjQwODI2NUFENUIwQjgwMDhGDQotUzExODA1OTRCNUMwNkRGNjIyMDk5Mjg4MjE0MTAwNTY0MjgxMjY0OEQyNUJCN0M5NkQyRQ0KLVMxMTgwNUE5RkE0NDQxRDM2ODAwNUExMjNDMDAwMTYwMDAwMDA0NDI0MTFGNDEwMDA0OEINCi1TMTE4MDVCRTJGNjgwMDM0MDAwNjJGNDkwMDBBOTY4OTJGNDMwMDBFNEU3NTRFNTZGRkNDDQotUzExODA1RDNGMDIwMkUwMDA4NDdGQTAwMDREN0ZDMDAwMDAxQTYyMjBCNDFGQTAwMDQ5RQ0KLVMxMTgwNUU4RDFGQzAwMDAwMUI2MkQ1OEZGRjAyRDU4RkZGNDJENThGRkY4MkQ1MEZGOTINCi1TMTE4MDVGREZDNTM4MDc0MDhCNDgwNjUwMDAxMkM0MUZBMDAwNEQxRkMwMDAwMDAwRUJBDQotUzExODA2MTJEMDgwMzAzMDA4MDA0RUZCMDAwMjAwMTIwMDIyMDAzMjAwNDIwMDQ4MDBEQw0KLVMxMTgwNjI3NTgwMDZDMDBBMDAwREM0MUZBMDAwNEQxRkMwMDAwMDExODIwMTA2MDAwQzUNCi1TMTE4MDYzQzAxMDI0N0ZBMDAwNEQ3RkMwMDAwMDEwQzIwMEI2MDAwMDBGMjQxRkEwMEM1DQotUzExODA2NTEwNEQxRkMwMDAwMDExMDIwMTA2MDAwMDBFMjIwMDE2MDAwMDBEQzQ3RkE5RQ0KLVMxMTgwNjY2MDAwNEQ3RkMwMDAwMDEyMDIwMEI2MDAwMDBDQzQzRkEwMDA0RDNGQzAwMUMNCi1TMTE4MDY3QjAwMDBGQTQxRTkwMDBDMjAxMDYwMDAwMEI4MjQyRUZGRjQ0N0ZBMDAwNDY0DQotUzExODA2OTBEN0ZDMDAwMDAwRkVCNDhCNjYwMDAwMTI0N0ZBMDAwNEQ3RkMwMDAwMDFCMA0KLVMxMTgwNkE1MTQyMDBCNjAwMDAwOTQ0N0ZBMDAwNEQ3RkMwMDAwMDEwQTIwMEI2MDAwNUINCi1TMTE4MDZCQTAwODQ0MUZBMDAwNEQxRkMwMDAwMDA4QTIwNTA0N0ZBMDAwNEQ3RkMwMDg1DQotUzExODA2Q0YwMDAwODJCMUNCNjYwMDAwMTI0N0ZBMDAwNEQ3RkMwMDAwMDBFMDIwMEI3OQ0KLVMxMTgwNkU0NjAwMDAwNTg0N0ZBMDAwNEQ3RkMwMDAwMDBEMjIwMEI2MDAwMDA0ODQxNDcNCi1TMTE4MDZGOUZBMDAwNEQxRkMwMDAwMDA0RTQzRkEwMDA0RDNGQzAwMDAwMDNFQjNEMEZFDQotUzExODA3MEU2NjAwMDAxMjQ3RkEwMDA0RDdGQzAwMDAwMEFFMjAwQjYwMDAwMDFFNDdBNA0KLVMxMTgwNzIzRkEwMDA0RDdGQzAwMDAwMEE2MjAwQjYwMDAwMDBFNDdGQTAwMDREN0ZDOTUNCi1TMTE4MDczODAwMDAwMDk4MjAwQjRFNUU0RTc0MDAwNDAwMDA1Mzc1NkU2NTAwMDAwMEQ4DQotUzExODA3NEQwMDA3NDY0Rjc0NzQ2RjAwMDAwMDAwMDAwQTAwMDAwMDBDNTA2NTZDNkNGRA0KLVMxMTgwNzYyNjUwMDAwMDAwNzVFNTM3NDY5NkU2MTAwNEI2MTcyNjk2RTAwMDAwMDAwQzANCi1TMTE4MDc3NzA1MDAwMDA3NjgwMDAwMDAwMzAwMDAwNzZFNTA3NTc0NzQ2NTAwNEI2MUJGDQotUzExODA3OEM2QzZDNjUwMDUzNzQ2OTZFNjEzMTAwMDA0QjYxNzI2OTZFMzEwMDAwMDBDMQ0KLVMxMTgwN0ExMDAwMDMzMDAwMDA3OTAwMDAwMDAxRjAwMDAwNzk4Nzg3OTdBN0EwMDAwRDINCi1TMTE4MDdCNjRGNkM2QzY1MDAwMDM3MDAzODAwNTA2NTc0NjU3MjAwNTM3Njc1NkM2QzE5DQotUzExODA3Q0I2RjAwMDAzOTAwNTM2Qzc1NzQwMDAwMDAwMDAwMDAwMDAwMDc0QzAwMDA3Mg0KLVMxMTUwN0UwMDc2NDAwMDAwNzc4MDAwMDA3ODAwMDAwMDdBNDAwMDAwN0FDMzQNCi1TOTAzMDAwMEZDDQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3ZlcnNhZG9zLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy92ZXJzYWRvcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMmMwNjYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3ZlcnNhZG9zLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgbGQtdmVyc2Fkb3MgdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiAoc2FjQGN5Z251cy5jb20pCi0jCi0KLSMgTWFrZSBzdXJlIHRoYXQgbGQgY2FuIHJlYWQgdmVyc2Fkb3MgaW1hZ2VzIGFuZAotIyBnZW5lcmF0ZSBiaW5hcmllcyB3aGljaCBhcmUgaWRlbnRpY2FsIHRvIHRoZSBjdXN0b21lcidzCi0jIG9sZCBtZXRob2QuCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBpZiBsZCBnZW5lcmF0ZXMgbmF0aXZlIGV4ZWN1dGFibGVzLgotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gb24gNjhrIGNvZmYgdGFyZ2V0cwotIyBTcXVhcmUgYnJhY2tldCBleHByZXNzaW9ucyBzZWVtIHRvIGNvbmZ1c2UgaXN0YXJnZXQuCi1pZiB7ICFbaXN0YXJnZXQgbTY4ay0qLWNvZmYqXSB9IHRoZW4gewotICAgIHJldHVybgotfQotCi1zZXQgdGVzdG5hbWUgIkxEIFZFUlNBRE9TIgotCi0KLXByb2MgaW5zcGVjdCB7IHdoaWNob25lIH0gewotICAgIGdsb2JhbCBvYmpkdW1wCi0gICAgZ2xvYmFsIGV4ZWNfb3V0cHV0Ci0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgdGVzdG5hbWUKLQotICAgIHNlbmRfbG9nICIkb2JqZHVtcCAtcyB0bXBkaXIvJHdoaWNob25lLm91dCA+dG1wZGlyLyR3aGljaG9uZS5kdW1wXG4iCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgLXMgdG1wZGlyLyR3aGljaG9uZS5vdXQgfCBncmVwIC12IHNyZWMgPnRtcGRpci8kd2hpY2hvbmUuZHVtcCIgZXhlY19vdXRwdXQKLQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICRleGVjX291dHB1dAotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0JcmV0dXJuIDAKLSAgICB9Ci0KLSAgICBzZW5kX2xvZyAiJG9iamR1bXAgLXMgJHNyY2Rpci8kc3ViZGlyLyR3aGljaG9uZS5vb2sgPnRtcGRpci8kd2hpY2hvbmUuZG9rXG4iCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgLXMgJHNyY2Rpci8kc3ViZGlyLyR3aGljaG9uZS5vb2sgfCBncmVwIC12IHNyZWMgPnRtcGRpci8kd2hpY2hvbmUuZG9rIiBleGVjX291dHB1dAotCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgJGV4ZWNfb3V0cHV0Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4gMAotICAgIH0KLQotICAgICMgY29tcGFyZSBpdCB3aXRoIHRoZSBjb3JyZWN0IG91dHB1dAotICAgIGNhdGNoICJleGVjIGRpZmYgdG1wZGlyLyR3aGljaG9uZS5kdW1wIHRtcGRpci8kd2hpY2hvbmUuZG9rIiBleGVjX291dHB1dAotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICRleGVjX291dHB1dAotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuIDAKLSAgICB9Ci0KLSAgICByZXR1cm4gMQotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvdDEub3V0IFwKLQkiIC1UICRzcmNkaXIvJHN1YmRpci90MS5sZCAkc3JjZGlyLyRzdWJkaXIvdDEtMS5ybyAgJHNyY2Rpci8kc3ViZGlyL3QxLTIucm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0gZWxzZSB7Ci0gICAgIyBHZXQgYSBkdW1wIG9mIHdoYXQgd2UndmUgZ290LCBhbmQgd2hhdCB3ZSBzaG91bGQgaGF2ZQotICAgIGlmICFbaW5zcGVjdCB0MV0gewotCXJldHVybgotICAgIH0KLX0KLQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCAgdG1wZGlyL3QyLm91dCBcCi0JIiAtVCAkc3JjZGlyLyRzdWJkaXIvdDIubGQgJHNyY2Rpci8kc3ViZGlyL3QyLTIucm8gXAotCSRzcmNkaXIvJHN1YmRpci90Mi0xLnJvICAkc3JjZGlyLyRzdWJkaXIvdDItMy5ybyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfSBlbHNlIHsKLSAgICAjIEdldCBhIGR1bXAgb2Ygd2hhdCB3ZSd2ZSBnb3QsIGFuZCB3aGF0IHdlIHNob3VsZCBoYXZlCi0gICAgaWYgIVtpbnNwZWN0IHQyXSB7Ci0JcmV0dXJuCi0gICAgfQotfQotCi1wYXNzICR0ZXN0bmFtZQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xpYi9sZC1saWIuZXhwIGIvbGQvdGVzdHN1aXRlL2xpYi9sZC1saWIuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJhNDQ2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9saWIvbGQtbGliLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0jCi0jIGRlZmF1bHRfbGRfdmVyc2lvbiAKLSMJZXh0cmFjdCBhbmQgcHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGxkCi0jCi1wcm9jIGRlZmF1bHRfbGRfdmVyc2lvbiB7IGxkIH0gewotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIGlmIHsgW3doaWNoICRsZF0gPT0gMCB9IHRoZW4gewotCXBlcnJvciAiJGxkIGRvZXMgbm90IGV4aXN0IgotCWV4aXQgMQotICAgIH0KLSAgICAKLSAgICBjYXRjaCAiZXhlYyAkbGQgLS12ZXJzaW9uIiB0bXAKLSAgICBzZXQgdG1wIFtwcnVuZV93YXJuaW5ncyAkdG1wXQotICAgIHJlZ2V4cCAiXFteXG5cXSogKGN5Z251cy18KShcWy0wLTkuYS16QS1aLVxdKylcW1xyXG5cXS4qIiAkdG1wIHZlcnNpb24gY3lnIG51bWJlcgotICAgIGlmIFtpbmZvIGV4aXN0cyBudW1iZXJdIHRoZW4gewotCWNsb25lX291dHB1dCAiJGxkICRudW1iZXJcbiIKLSAgICB9Ci19Ci0KLSMKLSMgZGVmYXVsdF9sZF9yZWxvY2F0ZSAKLSMJbGluayBhbiBvYmplY3QgdXNpbmcgcmVsb2NhdGlvbgotIwotcHJvYyBkZWZhdWx0X2xkX3JlbG9jYXRlIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7Ci0gICAgZ2xvYmFsIEhPU1RJTkdfRU1VCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIAotICAgIGlmIHsgW3doaWNoICRsZF0gPT0gMCB9IHRoZW4gewotCXBlcnJvciAiJGxkIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotICAgIAotICAgIHZlcmJvc2UgLWxvZyAiJGxkICRIT1NUSU5HX0VNVSAtbyAkdGFyZ2V0IC1yICRvYmplY3RzIgotICAgIAotICAgIGNhdGNoICJleGVjICRsZCAkSE9TVElOR19FTVUgLW8gJHRhcmdldCAtciAkb2JqZWN0cyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXJldHVybiAwCi0gICAgfQotfQotCi0jIExvb2sgZm9yIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbiBzd2l0Y2hlcyBpbiB0aGUgbXVsdGxpYgotIyBvcHRpb25zIGFuZCB0cmFuc2xhdGUgdGhlc2UgaW50byBhIC1FQiBvciAtRUwgc3dpdGNoLiAgTm90ZQotIyB3ZSBjYW5ub3QgcmVseSB1cG9uIHByb2MgcHJvY2Vzc19tdWx0aWxpYl9vcHRpb25zIHRvIGRvIHRoaXMKLSMgZm9yIHVzIGJlY2F1c2UgZm9yIHNvbWUgdGFyZ2V0cyB0aGUgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydAotIyAtRUIvLUVMIGJ1dCBpdCBkb2VzIHN1cHBvcnQgLW1iaWctZW5kaWFuLy1tbGl0dGxlLWVuZGlhbiwgYW5kCi0jIHRoZSBzaXRlLmV4cCBmaWxlIHdpbGwgaW5jbHVkZSB0aGUgc3dpdGNoICItbWJpZy1lbmRpYW4iCi0jIChyYXRoZXIgdGhhbiAiYmlnLWVuZGlhbiIpIHdoaWNoIGlzIG5vdCBkZXRlY3RlZCBieSBwcm9jCi0jIHByb2Nlc3NfbXVsdGlsaWJfb3B0aW9ucy4KLQotcHJvYyBiaWdfb3JfbGl0dGxlX2VuZGlhbiB7fSB7Ci0gICAgCi0gICAgaWYgW2JvYXJkX2luZm8gW3RhcmdldF9pbmZvIG5hbWVdIGV4aXN0cyBtdWx0aWxpYl9mbGFnc10gewotCXNldCB0bXBfZmxhZ3MgIiBbYm9hcmRfaW5mbyBbdGFyZ2V0X2luZm8gbmFtZV0gbXVsdGlsaWJfZmxhZ3NdIjsKLQotCWZvcmVhY2ggeCAkdG1wX2ZsYWdzIHsKLQkgICAgY2FzZSAkeCBpbiB7Ci0JCXsqYmlnKmVuZGlhbiBlYiBFQn0gewotCQkgICAgc2V0IGZsYWdzICIgLUVCIgotCQkgICAgcmV0dXJuICRmbGFncwotCQl9Ci0JCXsqbGl0dGxlKmVuZGlhbiBlbCBFTH0gewotCQkgICAgc2V0IGZsYWdzICIgLUVMIgotCQkgICAgcmV0dXJuICRmbGFncwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgc2V0IGZsYWdzICIiCi0gICAgcmV0dXJuICRmbGFncwotfQotCi0jCi0jIGRlZmF1bHRfbGRfbGluayAKLSMJbGluayBhIHByb2dyYW0gdXNpbmcgbGQKLSMKLXByb2MgZGVmYXVsdF9sZF9saW5rIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7Ci0gICAgZ2xvYmFsIEhPU1RJTkdfRU1VCi0gICAgZ2xvYmFsIEhPU1RJTkdfQ1JUMAotICAgIGdsb2JhbCBIT1NUSU5HX0xJQlMKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgCi0gICAgc2V0IG9ianMgIiRIT1NUSU5HX0NSVDAgJG9iamVjdHMiCi0gICAgc2V0IGxpYnMgIiRIT1NUSU5HX0xJQlMiCi0gICAgCi0gICAgaWYgeyBbd2hpY2ggJGxkXSA9PSAwIH0gdGhlbiB7Ci0JcGVycm9yICIkbGQgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0gICAgCi0gICAgc2V0IGZsYWdzIFtiaWdfb3JfbGl0dGxlX2VuZGlhbl0KLSAgICAKLSAgICB2ZXJib3NlIC1sb2cgIiRsZCAkSE9TVElOR19FTVUgJGZsYWdzIC1vICR0YXJnZXQgJG9ianMgJGxpYnMiCi0gICAgCi0gICAgY2F0Y2ggImV4ZWMgJGxkICRIT1NUSU5HX0VNVSAkZmxhZ3MgLW8gJHRhcmdldCAkb2JqcyAkbGlicyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXJldHVybiAwCi0gICAgfQotfQotCi0jCi0jIGRlZmF1bHRfbGRfc2ltcGxlX2xpbmsgCi0jCWxpbmsgYSBwcm9ncmFtIHVzaW5nIGxkLCB3aXRob3V0IGluY2x1ZGluZyBhbnkgbGlicmFyaWVzCi0jCi1wcm9jIGRlZmF1bHRfbGRfc2ltcGxlX2xpbmsgeyBsZCB0YXJnZXQgb2JqZWN0cyB9IHsKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgCi0gICAgaWYgeyBbd2hpY2ggJGxkXSA9PSAwIH0gdGhlbiB7Ci0JcGVycm9yICIkbGQgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0gICAgCi0gICAgc2V0IGZsYWdzIFtiaWdfb3JfbGl0dGxlX2VuZGlhbl0KLSAgICAKLSAgICB2ZXJib3NlIC1sb2cgIiRsZCAkZmxhZ3MgLW8gJHRhcmdldCAkb2JqZWN0cyIKLSAgICAKLSAgICBjYXRjaCAiZXhlYyAkbGQgJGZsYWdzIC1vICR0YXJnZXQgJG9iamVjdHMiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLSAgICAjIFdlIGRvbid0IGNhcmUgaWYgd2UgZ2V0IGEgd2FybmluZyBhYm91dCBhIG5vbi1leGlzdGVudCBzdGFydAotICAgICMgc3ltYm9sLCBzaW5jZSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IG1pZ2h0IHVzZSBFTlRSWS4KLSAgICByZWdzdWIgLWFsbCAiKF58XG4pKFxbXlxuXF0qOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2xcW15cblxdKlxuPykiICRleGVjX291dHB1dCAiXFwxIiBleGVjX291dHB1dAotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotIwotIyBkZWZhdWx0X2xkX2NvbXBpbGUgCi0jCWNvbXBpbGUgYW4gb2JqZWN0IHVzaW5nIGNjCi0jCi1wcm9jIGRlZmF1bHRfbGRfY29tcGlsZSB7IGNjIHNvdXJjZSBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIENGTEFHUwotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIGdsb2JhbCBnY2NfZ2FzX2ZsYWcKLQotICAgIHNldCBjY19wcm9nICRjYwotICAgIGlmIHtbbGxlbmd0aCAkY2NfcHJvZ10gPiAxfSB0aGVuIHsKLQlzZXQgY2NfcHJvZyBbbGluZGV4ICRjY19wcm9nIDBdCi0gICAgfQotICAgIGlmIHtbd2hpY2ggJGNjX3Byb2ddID09IDB9IHRoZW4gewotCXBlcnJvciAiJGNjX3Byb2cgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0KLSAgICBjYXRjaCAiZXhlYyBybSAtZiAkb2JqZWN0IiBleGVjX291dHB1dAotCi0gICAgc2V0IGZsYWdzICItSSRzcmNkaXIvJHN1YmRpciAkQ0ZMQUdTIgotCi0gICAgIyBJZiB3ZSBhcmUgY29tcGlsaW5nIHdpdGggZ2NjLCB3ZSB3YW50IHRvIGFkZCBnY2NfZ2FzX2ZsYWcgdG8KLSAgICAjIGZsYWdzLiAgUmF0aGVyIHRoYW4gZGV0ZXJtaW5lIHRoaXMgaW4gc29tZSBjb21wbGV4IHdheSwgd2UgZ3Vlc3MKLSAgICAjIGJhc2VkIG9uIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlci4KLSAgICBpZiB7W3N0cmluZyBtYXRjaCAiKmdjYyoiICRjY10gfHwgW3N0cmluZyBtYXRjaCAiKisrKiIgJGNjXX0gdGhlbiB7Ci0Jc2V0IGZsYWdzICIkZ2NjX2dhc19mbGFnICRmbGFncyIKLSAgICB9Ci0KLSAgICBpZiBbYm9hcmRfaW5mbyBbdGFyZ2V0X2luZm8gbmFtZV0gZXhpc3RzIG11bHRpbGliX2ZsYWdzXSB7Ci0JYXBwZW5kIGZsYWdzICIgW2JvYXJkX2luZm8gW3RhcmdldF9pbmZvIG5hbWVdIG11bHRpbGliX2ZsYWdzXSI7Ci0gICAgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkY2MgJGZsYWdzIC1jICRzb3VyY2UgLW8gJG9iamVjdCIKLQotICAgIGNhdGNoICJleGVjICRjYyAkZmxhZ3MgLWMgJHNvdXJjZSAtbyAkb2JqZWN0IiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlpZiB7IVtmaWxlIGV4aXN0cyAkb2JqZWN0XX0gdGhlbiB7Ci0JICAgIHJlZ2V4cCAiLiovKFxbXi9cXSopJCIgJHNvdXJjZSBhbGwgZG9iagotCSAgICByZWdzdWIgIlxcLmMiICRkb2JqICIubyIgcmVhbG9iagotCSAgICB2ZXJib3NlICJsb29raW5nIGZvciAkcmVhbG9iaiIKLQkgICAgaWYge1tmaWxlIGV4aXN0cyAkcmVhbG9ial19IHRoZW4gewotCQl2ZXJib3NlIC1sb2cgIm12ICRyZWFsb2JqICRvYmplY3QiCi0JCWNhdGNoICJleGVjIG12ICRyZWFsb2JqICRvYmplY3QiIGV4ZWNfb3V0cHV0Ci0JCXNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCQlpZiB7IVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XX0gdGhlbiB7Ci0JCSAgICB2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQkJICAgIHBlcnJvciAiY291bGQgbm90IG1vdmUgJHJlYWxvYmogdG8gJG9iamVjdCIKLQkJICAgIHJldHVybiAwCi0JCX0KLQkgICAgfSBlbHNlIHsKLQkJcGVycm9yICIkb2JqZWN0IG5vdCBmb3VuZCBhZnRlciBjb21waWxhdGlvbiIKLQkJcmV0dXJuIDAKLQkgICAgfQotCX0KLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcGVycm9yICIkc291cmNlOiBjb21waWxhdGlvbiBmYWlsZWQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMKLSMgZGVmYXVsdF9sZF9hc3NlbWJsZQotIwlhc3NlbWJsZSBhIGZpbGUKLSMKLXByb2MgZGVmYXVsdF9sZF9hc3NlbWJsZSB7IGFzIHNvdXJjZSBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIEFTRkxBR1MKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgCi0gICAgaWYge1t3aGljaCAkYXNdID09IDB9IHRoZW4gewotCXBlcnJvciAiJGFzIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBBU0ZMQUdTXSB7IHNldCBBU0ZMQUdTICIiIH0KLQotICAgIHNldCBmbGFncyBbYmlnX29yX2xpdHRsZV9lbmRpYW5dCi0KLSAgICB2ZXJib3NlIC1sb2cgIiRhcyAkZmxhZ3MgJEFTRkxBR1MgLW8gJG9iamVjdCAkc291cmNlIgotCi0gICAgY2F0Y2ggImV4ZWMgJGFzICRmbGFncyAkQVNGTEFHUyAtbyAkb2JqZWN0ICRzb3VyY2UiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlwZXJyb3IgIiRzb3VyY2U6IGFzc2VtYmx5IGZhaWxlZCIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotIwotIyBkZWZhdWx0X2xkX25tCi0jCXJ1biBubSBvbiBhIGZpbGUsIHB1dHRpbmcgdGhlIHJlc3VsdCBpbiB0aGUgYXJyYXkgbm1fb3V0cHV0Ci0jCi1wcm9jIGRlZmF1bHRfbGRfbm0geyBubSBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIE5NRkxBR1MKLSAgICBnbG9iYWwgbm1fb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgaWYge1t3aGljaCAkbm1dID09IDB9IHRoZW4gewotCXBlcnJvciAiJG5tIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotCi0gICAgaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXRdfSB7Ci0gICAgICB1bnNldCBubV9vdXRwdXQKLSAgICB9Ci0KLSAgICBpZiAhW2luZm8gZXhpc3RzIE5NRkxBR1NdIHsgc2V0IE5NRkxBR1MgIiIgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkbm0gJE5NRkxBR1MgJG9iamVjdCA+dG1wZGlyL25tLm91dCIKLQotICAgIGNhdGNoICJleGVjICRubSAkTk1GTEFHUyAkb2JqZWN0ID50bXBkaXIvbm0ub3V0IiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlzZXQgZmlsZSBbb3BlbiB0bXBkaXIvbm0ub3V0IHJdCi0Jd2hpbGUgeyBbZ2V0cyAkZmlsZSBsaW5lXSAhPSAtMSB9IHsKLQkgICAgdmVyYm9zZSAiJGxpbmUiIDIKLQkgICAgaWYgW3JlZ2V4cCAiXihcWzAtOWEtZkEtRlxdKykgXFthLXpBLVowLTlcXSAoLispJCIgJGxpbmUgd2hvbGUgdmFsdWUgbmFtZV0gewotICAgICAgICAgICAgICAgIHNldCBuYW1lIFtzdHJpbmcgdHJpbWxlZnQgJG5hbWUgIl8iXQotCQl2ZXJib3NlICJTZXR0aW5nIG5tX291dHB1dCgkbmFtZSkgdG8gMHgkdmFsdWUiIDIKLQkJc2V0IG5tX291dHB1dCgkbmFtZSkgMHgkdmFsdWUKLQkgICAgfQotCX0KLQljbG9zZSAkZmlsZQotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlwZXJyb3IgIiRvYmplY3Q6IG5tIGZhaWxlZCIKLQlyZXR1cm4gMAotICAgIH0KLX0KLQotIwotIyBzaW1wbGVfZGlmZgotIwljb21wYXJlcyB0d28gZmlsZXMgbGluZS1ieS1saW5lCi0jCXJldHVybnMgZGlmZmVyZW5jZXMgaWYgZXhpc3QKLSMJcmV0dXJucyBudWxsIGlmIGZpbGUocykgY2Fubm90IGJlIG9wZW5lZAotIwotcHJvYyBzaW1wbGVfZGlmZiB7IGZpbGVfMSBmaWxlXzIgfSB7Ci0gICAgZ2xvYmFsIHRhcmdldAotCQotICAgIHNldCBlb2YgLTEKLSAgICBzZXQgZGlmZmVyZW5jZXMgMAotICAgIAotICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8xXSB0aGVuIHsKLQlzZXQgZmlsZV9hIFtvcGVuICRmaWxlXzEgcl0KLSAgICB9IGVsc2UgewotCXdhcm5pbmcgIiRmaWxlXzEgZG9lc24ndCBleGlzdCIKLQlyZXR1cm4KLSAgICB9Ci0gICAgCi0gICAgaWYgW2ZpbGUgZXhpc3RzICRmaWxlXzJdIHRoZW4gewotCXNldCBmaWxlX2IgW29wZW4gJGZpbGVfMiByXQotICAgIH0gZWxzZSB7Ci0JZmFpbCAiJGZpbGVfMiBkb2Vzbid0IGV4aXN0IgotCXJldHVybgotICAgIH0KLSAgICAKLSAgICB2ZXJib3NlICIjIERpZmYnaW5nOiAkZmlsZV8xICRmaWxlXzJcbiIgMgotICAgIAotICAgIHdoaWxlIHsgW2dldHMgJGZpbGVfYSBsaW5lXSAhPSAkZW9mIH0gewotCWlmIFtyZWdleHAgIl4jLiokIiAkbGluZV0gdGhlbiB7Ci0JICAgIGNvbnRpbnVlCi0JfSBlbHNlIHsKLQkgICAgbGFwcGVuZCBsaXN0X2EgJGxpbmUKLQl9Ci0gICAgfQotICAgIGNsb3NlICRmaWxlX2EKLSAgICAKLSAgICB3aGlsZSB7IFtnZXRzICRmaWxlX2IgbGluZV0gIT0gJGVvZiB9IHsKLQlpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4gewotCSAgICBjb250aW51ZQotCX0gZWxzZSB7Ci0JICAgIGxhcHBlbmQgbGlzdF9iICRsaW5lCi0JfQotICAgIH0KLSAgICBjbG9zZSAkZmlsZV9iCi0KLSAgICBmb3IgeyBzZXQgaSAwIH0geyAkaSA8IFtsbGVuZ3RoICRsaXN0X2FdIH0geyBpbmNyIGkgfSB7Ci0Jc2V0IGxpbmVfYSBbbGluZGV4ICRsaXN0X2EgJGldCi0Jc2V0IGxpbmVfYiBbbGluZGV4ICRsaXN0X2IgJGldCi0KLQl2ZXJib3NlICJcdCRmaWxlXzE6ICRpOiAkbGluZV9hXG4iIDMKLQl2ZXJib3NlICJcdCRmaWxlXzI6ICRpOiAkbGluZV9iXG4iIDMKLQlpZiBbc3RyaW5nIGNvbXBhcmUgJGxpbmVfYSAkbGluZV9iXSB0aGVuIHsKLQkgICAgdmVyYm9zZSAtbG9nICJcdCRmaWxlXzE6ICRpOiAkbGluZV9hXG4iCi0JICAgIHZlcmJvc2UgLWxvZyAiXHQkZmlsZV8yOiAkaTogJGxpbmVfYlxuIgotCi0JICAgIGZhaWwgIlRlc3Q6ICR0YXJnZXQiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0gICAgCi0gICAgaWYgeyBbbGxlbmd0aCAkbGlzdF9hXSAhPSBbbGxlbmd0aCAkbGlzdF9iXSB9IHsKLQlmYWlsICJUZXN0OiAkdGFyZ2V0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmICRkaWZmZXJlbmNlczwxIHRoZW4gewotCXBhc3MgIlRlc3Q6ICR0YXJnZXQiCi0gICAgfQotfQotCi0jIFRoaXMgZGVmaW5pdGlvbiBpcyB0YWtlbiBmcm9tIGFuIHVucmVsZWFzZWQgdmVyc2lvbiBvZiBEZWphR251LiAgT25jZQotIyB0aGF0IHZlcnNpb24gZ2V0cyByZWxlYXNlZCwgYW5kIGhhcyBiZWVuIG91dCBpbiB0aGUgd29ybGQgZm9yIGEgZmV3Ci0jIG1vbnRocyBhdCBsZWFzdCwgaXQgbWF5IGJlIHNhZmUgdG8gZGVsZXRlIHRoaXMgY29weS4KLWlmICFbc3RyaW5nIGxlbmd0aCBbaW5mbyBwcm9jIHBydW5lX3dhcm5pbmdzXV0gewotICAgICMKLSAgICAjIHBydW5lX3dhcm5pbmdzIC0tIGRlbGV0ZSB2YXJpb3VzIHN5c3RlbSB2ZXJib3NpdGllcyBmcm9tIFRFWFQKLSAgICAjCi0gICAgIyBBbiBleGFtcGxlIGlzOgotICAgICMgbGQuc286IHdhcm5pbmc6IC91c3IvbGliL2xpYmMuc28uMS44LjEgaGFzIG9sZGVyIHJldmlzaW9uIHRoYW4gZXhwZWN0ZWQgOQotICAgICMKLSAgICAjIFNpdGVzIHdpdGggcGFydGljdWxhciB2ZXJib3NlIG9zJ3MgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcyBpbiBzaXRlLmV4cC4KLSAgICAjCi0gICAgcHJvYyBwcnVuZV93YXJuaW5ncyB7IHRleHQgfSB7Ci0JIyBUaGlzIGlzIGZyb20gc3VuNCdzLiAgRG8gaXQgZm9yIGFsbCBtYWNoaW5lcyBmb3Igbm93LgotCSMgVGhlICJcXDEiIGlzIHRvIHRyeSB0byBwcmVzZXJ2ZSBhICJcbiIgYnV0IG9ubHkgaWYgbmVjZXNzYXJ5LgotCXJlZ3N1YiAtYWxsICIoXnxcbikobGQuc286IHdhcm5pbmc6XFteXG5cXSpcbj8pKyIgJHRleHQgIlxcMSIgdGV4dAotCi0JIyBJdCBtaWdodCBiZSB0ZW1wdGluZyB0byBnZXQgY2FycmllZCBhd2F5IGFuZCBkZWxldGUgYmxhbmsgbGluZXMsIGV0Yy4KLQkjIEp1c3QgZGVsZXRlICpleGFjdGx5KiB3aGF0IHdlJ3JlIGFzayB0bywgYW5kIHRoYXQncyBpdC4KLQlyZXR1cm4gJHRleHQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvQ09QWUlORy5MSUIgYi9saWJpYmVydHkvQ09QWUlORy5MSUIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWEzZDEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L0NPUFlJTkcuTElCCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgR1BMLiAgSXQgaXMKLSBudW1iZXJlZCAyIGJlY2F1c2UgaXQgZ29lcyB3aXRoIHZlcnNpb24gMiBvZiB0aGUgb3JkaW5hcnkgR1BMLl0KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKLWZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KLQotICBUaGlzIGxpY2Vuc2UsIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQotc3BlY2lhbGx5IGRlc2lnbmF0ZWQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlLCBhbmQgdG8gYW55Ci1vdGhlciBsaWJyYXJpZXMgd2hvc2UgYXV0aG9ycyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91IGNhbiB1c2UgaXQgZm9yCi15b3VyIGxpYnJhcmllcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmCi15b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIG9yIGlmIHlvdSBtb2RpZnkgaXQuCi0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKLW9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKLXlvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKLWNvZGUuICBJZiB5b3UgbGluayBhIHByb2dyYW0gd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQotY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KLXdpdGggdGhlIGxpYnJhcnksIGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZwotaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCi0KLSAgT3VyIG1ldGhvZCBvZiBwcm90ZWN0aW5nIHlvdXIgcmlnaHRzIGhhcyB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQKLXRoZSBsaWJyYXJ5LCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCi1wZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KLQotICBBbHNvLCBmb3IgZWFjaCBkaXN0cmlidXRvcidzIHByb3RlY3Rpb24sIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCi10aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQotbGlicmFyeS4gIElmIHRoZSBsaWJyYXJ5IGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbAotdmVyc2lvbiwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbgotdGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgotDAotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IGNvbXBhbmllcyBkaXN0cmlidXRpbmcgZnJlZQotc29mdHdhcmUgd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgdGh1cyBpbiBlZmZlY3QKLXRyYW5zZm9ybWluZyB0aGUgcHJvZ3JhbSBpbnRvIHByb3ByaWV0YXJ5IHNvZnR3YXJlLiAgVG8gcHJldmVudCB0aGlzLAotd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzCi1mcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5Ci1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggd2FzIGRlc2lnbmVkIGZvciB1dGlsaXR5IHByb2dyYW1zLiAgVGhpcwotbGljZW5zZSwgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbgotZGVzaWduYXRlZCBsaWJyYXJpZXMuICBUaGlzIGxpY2Vuc2UgaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5Ci1vbmU7IGJlIHN1cmUgdG8gcmVhZCBpdCBpbiBmdWxsLCBhbmQgZG9uJ3QgYXNzdW1lIHRoYXQgYW55dGhpbmcgaW4gaXQgaXMKLXRoZSBzYW1lIGFzIGluIHRoZSBvcmRpbmFyeSBsaWNlbnNlLgotCi0gIFRoZSByZWFzb24gd2UgaGF2ZSBhIHNlcGFyYXRlIHB1YmxpYyBsaWNlbnNlIGZvciBzb21lIGxpYnJhcmllcyBpcyB0aGF0Ci10aGV5IGJsdXIgdGhlIGRpc3RpbmN0aW9uIHdlIHVzdWFsbHkgbWFrZSBiZXR3ZWVuIG1vZGlmeWluZyBvciBhZGRpbmcgdG8gYQotcHJvZ3JhbSBhbmQgc2ltcGx5IHVzaW5nIGl0LiAgTGlua2luZyBhIHByb2dyYW0gd2l0aCBhIGxpYnJhcnksIHdpdGhvdXQKLWNoYW5naW5nIHRoZSBsaWJyYXJ5LCBpcyBpbiBzb21lIHNlbnNlIHNpbXBseSB1c2luZyB0aGUgbGlicmFyeSwgYW5kIGlzCi1hbmFsb2dvdXMgdG8gcnVubmluZyBhIHV0aWxpdHkgcHJvZ3JhbSBvciBhcHBsaWNhdGlvbiBwcm9ncmFtLiAgSG93ZXZlciwgaW4KLWEgdGV4dHVhbCBhbmQgbGVnYWwgc2Vuc2UsIHRoZSBsaW5rZWQgZXhlY3V0YWJsZSBpcyBhIGNvbWJpbmVkIHdvcmssIGEKLWRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnksIGFuZCB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotdHJlYXRzIGl0IGFzIHN1Y2guCi0KLSAgQmVjYXVzZSBvZiB0aGlzIGJsdXJyZWQgZGlzdGluY3Rpb24sIHVzaW5nIHRoZSBvcmRpbmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBmb3IgbGlicmFyaWVzIGRpZCBub3QgZWZmZWN0aXZlbHkgcHJvbW90ZSBzb2Z0d2FyZQotc2hhcmluZywgYmVjYXVzZSBtb3N0IGRldmVsb3BlcnMgZGlkIG5vdCB1c2UgdGhlIGxpYnJhcmllcy4gIFdlCi1jb25jbHVkZWQgdGhhdCB3ZWFrZXIgY29uZGl0aW9ucyBtaWdodCBwcm9tb3RlIHNoYXJpbmcgYmV0dGVyLgotCi0gIEhvd2V2ZXIsIHVucmVzdHJpY3RlZCBsaW5raW5nIG9mIG5vbi1mcmVlIHByb2dyYW1zIHdvdWxkIGRlcHJpdmUgdGhlCi11c2VycyBvZiB0aG9zZSBwcm9ncmFtcyBvZiBhbGwgYmVuZWZpdCBmcm9tIHRoZSBmcmVlIHN0YXR1cyBvZiB0aGUKLWxpYnJhcmllcyB0aGVtc2VsdmVzLiAgVGhpcyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8KLXBlcm1pdCBkZXZlbG9wZXJzIG9mIG5vbi1mcmVlIHByb2dyYW1zIHRvIHVzZSBmcmVlIGxpYnJhcmllcywgd2hpbGUKLXByZXNlcnZpbmcgeW91ciBmcmVlZG9tIGFzIGEgdXNlciBvZiBzdWNoIHByb2dyYW1zIHRvIGNoYW5nZSB0aGUgZnJlZQotbGlicmFyaWVzIHRoYXQgYXJlIGluY29ycG9yYXRlZCBpbiB0aGVtLiAgKFdlIGhhdmUgbm90IHNlZW4gaG93IHRvIGFjaGlldmUKLXRoaXMgYXMgcmVnYXJkcyBjaGFuZ2VzIGluIGhlYWRlciBmaWxlcywgYnV0IHdlIGhhdmUgYWNoaWV2ZWQgaXQgYXMgcmVnYXJkcwotY2hhbmdlcyBpbiB0aGUgYWN0dWFsIGZ1bmN0aW9ucyBvZiB0aGUgTGlicmFyeS4pICBUaGUgaG9wZSBpcyB0aGF0IHRoaXMKLXdpbGwgbGVhZCB0byBmYXN0ZXIgZGV2ZWxvcG1lbnQgb2YgZnJlZSBsaWJyYXJpZXMuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQotIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKLWZvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hpbGUgdGhlIGxhdHRlciBvbmx5Ci13b3JrcyB0b2dldGhlciB3aXRoIHRoZSBsaWJyYXJ5LgotCi0gIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBsaWJyYXJ5IHRvIGJlIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5Ci1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJhdGhlciB0aGFuIGJ5IHRoaXMgc3BlY2lhbCBvbmUuCi0MCi0JCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IHdoaWNoCi1jb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3Igb3RoZXIgYXV0aG9yaXplZAotcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWJyYXJ5Ci1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuICBFYWNoIGxpY2Vuc2VlIGlzCi1hZGRyZXNzZWQgYXMgInlvdSIuCi0KLSAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQotcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCi0od2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgotCi0gIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCi13aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgotY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKLXBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKLXN0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKLWluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCi0KLSAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKLWFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCi1pbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KLWFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0KLSAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KLXN1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKLXdyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKLWFuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgotICAKLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCi1jb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoteW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KLWFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0Ci1hbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQotd2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKLUxpYnJhcnkuCi0KLSAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKLWFuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKLWZlZS4KLQwKLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubwotICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCi0gICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcwotICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKLSAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKLSAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKLSAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgotICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KLQotICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCi0gICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQotICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55Ci0gICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKLSAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQotICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKLWl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Ci13aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCi10aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCi10aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCi1pbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCi1vcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Ci10aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCi10aGVzZSBub3RpY2VzLgotDAotICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCi10aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAotc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KLQotICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKLXRoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KLQotICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgotZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KLXVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQotaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAotbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCi0KLSAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKLWZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCi1zb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0KLSAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKLUxpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKLWxpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCi13b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCi10aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKLWNyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAotY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKLWxpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgotU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCi0KLSAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKLXRoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQotZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCi1XaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQotbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKLXRocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCi0KLSAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKLXN0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQotZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAotZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQotd29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKLUxpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCi0KLSAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKLWRpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgotQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCi13aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCi0MCi0gIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21waWxlIG9yCi1saW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQotd29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKLXVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKLW1vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQotZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCi0KLSAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCi1MaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKLXRoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKLWR1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCi1jb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCi1kaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCi1vZiB0aGVzZSB0aGluZ3M6Ci0KLSAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZwotICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgotICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCi0gICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKLSAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKLSAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQotICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCi0gICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKLSAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKLSAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgotICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQotCi0gICAgYikgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKLSAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKLSAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCi0gICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgotCi0gICAgYykgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKLSAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKLSAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCi0KLSAgICBkKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKLSAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KLQotICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKLUxpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCi1yZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKLXRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkKLWRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgotY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgotd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwotdGhlIGV4ZWN1dGFibGUuCi0KLSAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKLXJlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKLWFjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKLXVzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKLWRpc3RyaWJ1dGUuCi0MCi0gIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5Ci1mYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCi1saWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KLXRoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQotcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCi0gICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQotICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgIFNlY3Rpb25zIGFib3ZlLgotCi0gICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKLSAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZwotICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KLQotICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQotdGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKLWF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCi1yaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCi1vciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCi10ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKLXN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0MCi0gIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQotcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAotYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCi1pbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKLWdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKLXRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0Ci1zeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCi10byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKLWltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCi1iZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KLQotICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCi1hbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKLXNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cwotZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKLXdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwotdmVyc2lvbnMgb2YgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KLVN1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKLWJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCi0iYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCi1saWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQwKLSAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAotd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKLWNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCi1kZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCi1vZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZwotYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCi1XQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgotRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKLU9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCi1LSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCi1MSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQotVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCi1XUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQotQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKLUZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCi1MSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCi1SRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQotRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgotU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotICAgICBBcHBlbmRpeDogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAotZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCi1yZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLW9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgotCi0gIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKLXNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKLSJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAgICBNQSAwMjExMS0xMzA3LCBVU0EKLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCi0gIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCi0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCmRpZmYgLS1naXQgYS9saWJpYmVydHkvQ2hhbmdlTG9nIGIvbGliaWJlcnR5L0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3MmYxZi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMzI3OCArMCwwIEBACi0xOTk5LTA4LTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZmxvYXRmb3JtYXQuYzogQWRkIGNhc3RzIHRvIGF2b2lkIHNpZ25lZC91bnNpZ25lZCB3YXJuaW5ncy4KLQkqIHBleGVjdXRlLmM6IEFkZCBBVFRSSUJVVEVfVU5VU0VEIGFzIG5lZWRlZCBvbiBVbml4LgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbF90b19saWJkaXIpOiBDaGFuZ2UgJChUQVJHRVRMSUIpLm4gdG8KLQkkKFRBUkdFVExJQiluIHNvIGl0IHdvcmtzIG9uIE1TRE9TLgotCShpbnN0YWxsX3RvX3Rvb2xkaXIpOiBMaWtld2lzZS4KLQotMTk5OS0wNy0yMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIE1hcmsgRWxicmVjaHQ6Ci0JKiBtYWtlZmlsZS5kb3M6IFJlbW92ZTsgb2Jzb2xldGUuCi0JKiBjb25maWd1cmUuYmF0OiBSZW1vdmU7IG9ic29sZXRlLgotCi0xOTk5LTA3LTE0ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcmd2LmM6IEluY2x1ZGUgc3RkbGliLmggYW5kIHN0cmluZy5oIGluc3RlYWQgb2YKLQlwcm90b3R5cGluZyBkaXJlY3RseS4KLQkqIGNob29zZS10ZW1wLmM6IENvbmRpdGlvbmFsbHkgaW5jbHVkZSBzdHJpbmcuaC4KLQotMTk5OS0wNy0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuYyAoc3BsYXlfdHJlZV9pbnNlcnQpOiBBZGQgaW5pdGlhbGl6YXRpb24gdG8gYXZvaWQKLQl3YXJuaW5nLgotCi0xOTk5LTA1LTExICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChtYWluKTogVXNlIHRhYmxlIGxvb2t1cCB0byBkaXN0aW5ndWlzaCBpZGVudGlmaWVyCi0JY2hhcmFjdGVycyBmcm9tIG5vbi1pZGVudGlmaWVyIGNoYXJhY3RlcnMuCi0JKHN0YW5kYXJkX3N5bWJvbF9hbHBoYWJldCwgaHBfc3ltYm9sX2FscGhhYmV0KTogTmV3IGZ1bmN0aW9ucy4KLQotVGh1IE1heSAgNiAyMDozNDo0MiAxOTk5ICBGcmVkIEZpc2ggIDxmbmZAYmUuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHN5cy9yZXNvdXJjZS5oKTogQWRkIHRvIEFDX0NIRUNLX0hFQURFUlMgbGlzdC4KLQkqIGdldHJ1bnRpbWUuYzogT25seSBhdHRlbXB0IHRvIGluY2x1ZGUgc3lzL3Jlc291cmNlLmggYW5kCi0JdXNlIGdldHJ1c2FnZSBpZiBib3RoIEhBVkVfR0VUUlVTQUdFIGFuZCBIQVZFX1NZU19SRVNPVVJDRV9ICi0JYXJlIGRlZmluZWQuCi0KLTE5OTktMDQtMjAgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCUZpeCBmcm9tIERhbGUgSGF3a2luczoKLQkqIGNwbHVzLWRlbS5jIChtb3BfdXApOiBTZXQgdHlwZXZlY19zaXplIHRvIHplcm8sIHNvIGl0J2xsIGJlIAotCXJlYWxsb2NhdGVkIHByb3Blcmx5IGlmIHdlIHVzZSBpdCBhZ2Fpbi4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IENoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bi4gIEJlCi0Jc3RyaWN0ZXIgYWJvdXQgc3ludGF4LiAgQWx3YXlzIG51bGwtdGVybWluYXRlIHN0cmluZy4KLQotCUZpeCBmcm9tIE1hcmN1cyBEYW5pZWxzOgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IERvbid0IHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUKLQlpZGVudGlmaWVyIGxvb2tpbmcgZm9yIGFub3RoZXIgdW5kZXJzY29yZS4KLQotVGh1IEFwciAxNSAyMzowMDo1NSAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY29uZmlndXJlLmluIChjaGVja2Z1bmNzKTogQ2hlY2sgZm9yIHNicmsuCi0JKiBjb25maWcuaW46IFJlYnVpbHQuCi0JKiBjb25maWd1cmU6IExpa2V3aXNlLgotCSogeG1hbGxvYy5jOiBVc2UgSEFWRV9TQlJLIGluc3RlYWQgb2YgdGhlIGhvc3Qgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCi0KLTE5OTktMDQtMTEgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+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+Z2V0Y3dkLgotCSogY29uZmlndXJlLmluOiAgVXNlIGdlbmVyaWMgY2FzZSBmb3IgZXZlcnkgc3lzdGVtLgotCSogY29uZmlnL21oLXtkZWx0YTg4LG1hY2gscnM2MDAwLHN2cjR9OiAgUmVtb3ZlLgotCSogY29uZmlnL21oLXN5c3Y6ICBVc2UgZGVmYXVsdCBoYW5kbGluZywganVzdCBhZGQgLURVU0cuCi0KLVRodSBOb3YgMTQgMTA6NTg6MDUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWcvbWgtZGVmYXVsdDogUmUtZG8gbWFrZSBtYWdpYwotCXNvIHRoYXQgZm9yIHRoZSBkZWZhdWx0ICgiYXV0b21hdGljIikgbW9kZSB3ZSBvbmx5Ci0JY29tcGlsZSB0aGUgZmlsZXMgd2UgYWN0dWFsbHkgbmVlZC4gIERvIHRoaXMgdXNpbmcKLQlhIHJlY3Vyc2l2ZSBtYWtlOiAgVGhlIHRvcC1sZXZlbCBnZW5lcmF0ZXMgdGhlIGxpc3QKLQlvZiBuZWVkZWQgZmlsZXMgKGxvb3NlbHksIHRoZSBvbmVzIG1pc3NpbmcgaW4gbGliYyksCi0JYW5kIHRoZW4gcGFzc2VzIHRoYXQgbGlzdCB0byB0aGUgcmVjdXJzaXZlIG1ha2UuCi0JKiBjb25maWcvbWgtbWFjaDogIFJlbW92ZSBvYnNvbGV0ZSBTVFJFUlJPUi17QyxPfSBtYWNyb3MuCi0KLVR1ZSBOb3YgMTIgMTk6MTA6NTcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQlSUy82MDAwIGhvc3Qgc3VwcG9ydCAoZ3J1bWJsZSkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEJ1aWxkIGFsbG9jYS1jb25mLmggZmlsZSBmcm9tIGFsbG9jYS1ub3JtLmgKLQkoZXZlcnl0aGluZyBlbHNlKSBvciBhbGxvY2EtYm90Y2guaCAocnMvNjAwMCkuCi0JKiBNYWtlZmlsZS5pbjogIEluY2x1ZGUgLiBvbiB0aGUgaW5jbHVkZSBwYXRoLgotCSogZ2V0b3B0LmM6ICBVc2UgYWxsb2NhLWNvbmYuaC4KLQkqIGFsbG9jYS1ub3JtLmg6ICBIb3cgdG8gZGVjbGFyZSBhbGxvY2Egb24gcmVhc29uYWJsZSBtYWNoaW5lcy4KLQkqIGFsbG9jYS1ib3RjaC5oOiBIb3cgdG8gZGVjbGFyZSBhbGxvY2Egb24gYnJhaW5kZWFkIG1hY2hpbmVzLgotCi1UdWUgTm92IDEyIDA5OjIxOjQ4IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25jYXQuYyA6ICBOZXcgZmlsZSwgbGlrZSBjb25jYXQoKSBpbiBnZGIgYnV0IGNhbiB0YWtlIGEKLQl2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIHJhdGhlciB0aGFuIGZpeGVkIGF0IDMgYXJncy4gIEZvcgotCW5vdywgY2xpZW50IGFwcGxpY2F0aW9ucyBtdXN0IHN1cHBseSBhbiB4bWFsbG9jKCksIHdoaWNoIGlzIGEKLQlmcm9udCBlbmQgZnVuY3Rpb24gdG8gbWFsbG9jKCkgdGhhdCBkZWFscyB3aXRoIG91dC1vZi1tZW1vcnkKLQljb25kaXRpb25zLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBjb25jYXQuYyBhbmQgY29uY2F0Lm8gdG8gYXBwcm9wcmlhdGUgbWFjcm9zLgotCi1TYXQgTm92ICA5IDEzOjI5OjU5IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3ZyNDogIEFkZCBzaWdzZXRtYXNrIHRvIGxpc3Qgb2YgcmVxdWlyZWQgZnVuY3Rpb25zLgotCi1TdW4gTm92ICAzIDExOjU3OjU2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiB2c3ByaW50Zi5jOiAgTmV3IGZpbGUuCi0JKiBmdW5jdGlvbnMuZGVmLCBNYWtlZmlsZS5pbjogIEFkZCB2c3ByaW50Zi4KLQotU3VuIE9jdCAyNyAxNjozMToyMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcvbWgtcnM2MDAwOiAgQWRkIHJzLzYwMDAgaG9zdCBzdXBwb3J0LgotCSogTWFrZWZpbGUuaW46ICBDb21waWxlIHdpdGggZGVidWcgaW5mby4KLQotRnJpIE9jdCAyNSAxNzowMToxMiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbiwgYW5kIG5ldyBmaWxlczogZHVtbXkuYywgZnVuY3Rpb25zLmRlZiwKLQljb25maWcvbWYtZGVmYXVsdDogIEFkZGVkIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIG1vZGUsCi0Jd2hpY2ggaW5jbHVkZXMgaW50byBsaWJpYmVydHkuYSBmdW5jdGlvbnMgdGhhdCBhcmUgIm1pc3NpbmciIGluIGxpYmMuCi0JKiBzdHJkdXAuYywgdnByaW50Zi5jLCB2ZnByaW50Zi5jOiBOZXcgZmlsZXMuCi0KLVRodSBPY3QgMjQgMDI6Mjk6MjYgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9obWFrZS1zdnI0OiBOZXcgZmlsZS4KLQotCSogY29uZmlnL2htYWtlLXN5c3Y6IEFkZCBIT1NUX0NGSUxFUyBhbmQgSE9TVF9PRklMRVMuCi0KLQkqIGJhc2VuYW1lLmMsIGJjbXAuYywgYmNvcHkuYywgYnplcm8uYywgZ2V0cGFnZXNpemUuYyBnZXR3ZC5jLAotCWluZGV4LmMsIGluc3F1ZS5jLCByaW5kZXguYywgc3BhY2VzLmMsIHN0cnN0ci5jLCB2Zm9yay5jOiBOZXcKLQlmaWxlcyBjb250YWluaW5nIGVpdGhlciBwb3J0YWJsZSBDIHZlcnNpb25zIG9yIGVtdWxhdGlvbnMgdXNpbmcKLQluYXRpdmUgbGlicmFyeSBjYWxscy4KLQotCSogc3RyZXJyb3IuYzogIEFkZCBjb3B5cmlnaHQsIGludGVybmFsIGRvY3VtZW50YXRpb24sIGV0Yy4KLQotCSogc3RydG9sLmM6ICBSZXBsYWNlIGhhcmR3aXJlZCBoZXggY29uc3RhbnRzIHdpdGggc29tZSBtb3JlCi0JcG9ydGFibGUgbWFjcm9zLiAgUmVtb3ZlIGlsbGVnYWwgKGFjY29yZGluZyB0byBnY2MpIGNhc3QuCi0KLQkqIHN0cnRvdWwuYzogUmVwbGFjZSBoYXJkd2lyZWQgaGV4IGNvbnN0YW50IHdpdGggbW9yZSBwb3J0YWJsZQotCW1hY3JvLgotCi0JKiBNYWtlZmlsZS5pbjogTW92ZSBUQVJHRVRMSUIgYW5kIENGTEFHUyB3aGVyZSBtYWtlZmlsZSBmcmFnbWVudHMKLQljYW4gb3ZlcnJpZGUgdGhlbS4gIEFkZCBuZXcgc291cmNlIGFuZCBvYmplY3QgZmlsZSBuYW1lcyB0byBDRklMRVMKLQlhbmQgT0ZJTEVTIHJlc3BlY3RpdmVseS4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgU1ZSNCBtYWtlZmlsZSBmcmFnbWVudHMuCi0KLVR1ZSBPY3QgMjIgMTk6MDA6MjMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogTW92ZSBSQU5MSUIsIEFSIGFuZCBBUl9GTEFHUyB0byB3aGVyZSB0aGV5IGNhbiBiZQotCW92ZXItcmlkZGVuIGJ5IGNvbmZpZy9obWFrZS0qCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIG04OGtjdnMgdG8gc3lzdiBsaXN0Ci0KLUZyaSBPY3QgIDQgMDE6Mjk6MDggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgTW9zdCBob3N0cyBuZWVkIHN0cmVycm9yLCBidXQgb25lIG9yIHR3byBkb24ndCwKLQlhbmQgdGhleSBvdmVycmlkZSB0aGVzZSBkZWZpbml0aW9ucyBpbiB0aGUgaG9zdC1kZXBlbmRlbnQgbWFrZWZpbGUKLQlmcmFnbWVudC4KLQkqIGNvbmZpZy9obWFrZS1tYWNoOiAgVGhlIG9kZCBtYW4gb3V0IG9uIHN0cmVycm9yIC0tIGl0J3Mgc3VwcGxpZWQuCi0JKiBzdHJlcnJvci5jOiAgTmV3IGZpbGUuCi0KLQkqIHN0cnRvbC5jLCBzdHJ0b3VsLmM6ICBBZGQgc3RydG9sIHRvIGxpYmliZXJ0eSwgc2luY2UgTWFjaCBsYWNrcwotCWl0IGFuZCBiZmQgdXNlcyBpdC4KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW4sIGNvbmZpZy9obWFrZS1tYWNoOiAgT25seSBjb25maWd1cmUKLQlzdHJ0b2wgJiBzdHJvdG91bCBpbiBvbiBNYWNoLgotCi1UdWUgU2VwICAzIDA2OjM2OjIzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jOiAgTWVyZ2Ugd2l0aCBsYXRlc3QgRlNGIHZlcnNpb24uCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9NYWtlZmlsZS5pbiBiL2xpYmliZXJ0eS9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhODBkMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotIwotIyBNYWtlZmlsZQotIyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotIyBMaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0jIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0jIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotIyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIExpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSMgTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotIyB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0jIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBLLiBSaWNoYXJkIFBpeGxleSA8cmljaEBjeWdudXMuY29tPi4KLQotIwotIyBNYWtlZmlsZSBmb3IgbGliaWJlcnR5IGRpcmVjdG9yeQotIwotCi1zcmNkaXIgPSBAc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotCi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWJpbmRpciA9IEBiaW5kaXJACi1saWJkaXIgPSBAbGliZGlyQAotCi1TSEVMTCA9IEBTSEVMTEAKLQotIyBNdWx0aWxpYiBzdXBwb3J0IHZhcmlhYmxlcy4KLU1VTFRJU1JDVE9QID0KLU1VTFRJQlVJTERUT1AgPQotTVVMVElESVJTID0KLU1VTFRJU1VCRElSID0KLU1VTFRJRE8gPSB0cnVlCi1NVUxUSUNMRUFOID0gdHJ1ZQotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLQotQVIgPSBAQVJACi1BUl9GTEFHUyA9IHJjCi0KLUNDID0gQENDQAotQ0ZMQUdTID0gQENGTEFHU0AKLUxJQkNGTEFHUyA9ICQoQ0ZMQUdTKQotUkFOTElCID0gQFJBTkxJQkAKLQotUElDRkxBRyA9Ci0KLU1BS0VPVkVSUklERVMgPQotCi1UQVJHRVRMSUIgPSBsaWJpYmVydHkuYQotCi1MSUJPQkpTID0gQExJQk9CSlNACi1BTExPQ0EgPSBAQUxMT0NBQAotCi0jIEEgY29uZmlndXJhdGlvbiBjYW4gc3BlY2lmeSBleHRyYSAubyBmaWxlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCwKLSMgZXZlbiBpZiB0aGV5IGFyZSBpbiBsaWJjLiAoUGVyaGFwcyB0aGUgbGliYyB2ZXJzaW9uIGlzIGJ1Z2d5LikKLUVYVFJBX09GSUxFUyA9IAotCi0jIEZsYWdzIHRvIHBhc3MgdG8gYSByZWN1cnNpdmUgbWFrZS4KLUZMQUdTX1RPX1BBU1MgPSBcCi0JIkFSPSQoQVIpIiBcCi0JIkFSX0ZMQUdTPSQoQVJfRkxBR1MpIiBcCi0JIkNDPSQoQ0MpIiBcCi0JIkNGTEFHUz0kKENGTEFHUykiIFwKLQkiTElCQ0ZMQUdTPSQoTElCQ0ZMQUdTKSIgXAotCSJFWFRSQV9PRklMRVM9JChFWFRSQV9PRklMRVMpIiBcCi0JIkhERUZJTkVTPSQoSERFRklORVMpIiBcCi0JIklOU1RBTEw9JChJTlNUQUxMKSIgXAotCSJJTlNUQUxMX0RBVEE9JChJTlNUQUxMX0RBVEEpIiBcCi0JIklOU1RBTExfUFJPR1JBTT0kKElOU1RBTExfUFJPR1JBTSkiIFwKLQkiTERGTEFHUz0kKExERkxBR1MpIiBcCi0JIkxPQURMSUJFUz0kKExPQURMSUJFUykiIFwKLQkiUkFOTElCPSQoUkFOTElCKSIgXAotCSJTSEVMTD0kKFNIRUxMKSIKLQotYWxsOiBzdGFtcC1waWNkaXIgJChUQVJHRVRMSUIpIG5lZWRlZC1saXN0IHJlcXVpcmVkLWxpc3QKLQlAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIG11bHRpLWRvIERPPWFsbAotCi0uUEhPTlk6IGNoZWNrIGluc3RhbGxjaGVjawotY2hlY2sgaW5zdGFsbGNoZWNrOgotCi1AaG9zdF9tYWtlZmlsZV9mcmFnQAotCi1JTkNESVI9JChzcmNkaXIpLyQoTVVMVElTUkNUT1ApLi4vaW5jbHVkZQotCi1DT01QSUxFLmMgPSAkKENDKSAtYyBAREVGU0AgJChMSUJDRkxBR1MpIC1JLiAtSSQoSU5DRElSKSAkKEhERUZJTkVTKQotLmMubzoKLQl0ZXN0IHgiJChlbmFibGVfc2hhcmVkKSIgIT0geHllcyB8fCBcCi0JICAkKENPTVBJTEUuYykgJChQSUNGTEFHKSAkPCAtbyBwaWMvJEAKLQkkKENPTVBJTEUuYykgJDwKLQotaW5mbyBpbnN0YWxsLWluZm8gY2xlYW4taW5mbyBkdmk6Ci0KLSMgSW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBpbiB0aGlzIGRpcmVjdG9yeS4KLUhGSUxFUyA9IGFsbG9jYS1jb25mLmgKLQotIyBOT1RFOiBJZiB5b3UgYWRkIG5ldyBmaWxlcyB0byB0aGUgbGlicmFyeSwgYWRkIHRoZW0gdG8gdGhpcyBsaXN0Ci0jIChhbHBoYWJldGljYWwpLCBhbmQgYWRkIHRoZW0gdG8gUkVRVUlSRURfT0ZJTEVTIG9yIGZ1bmNzIGluCi0jIGNvbmZpZ3VyZS5pbi4KLUNGSUxFUyA9IGFzcHJpbnRmLmMgYWxsb2NhLmMgYXJndi5jIGF0ZXhpdC5jIGJhc2VuYW1lLmMgYmNtcC5jIGJjb3B5LmMgXAotCWJ6ZXJvLmMgY2hvb3NlLXRlbXAuYyBjbG9jay5jIGNvbmNhdC5jIGNwbHVzLWRlbS5jIGZkbWF0Y2guYyBcCi0JZm5tYXRjaC5jIGdldGN3ZC5jIGdldG9wdC5jIGdldG9wdDEuYyBnZXRwYWdlc2l6ZS5jIFwKLQlnZXRydW50aW1lLmMgZmxvYXRmb3JtYXQuYyBoZXguYyBpbmRleC5jIGluc3F1ZS5jIG1lbWNoci5jIFwKLQltZW1jbXAuYyBtZW1jcHkuYyBtZW1tb3ZlLmMgbWVtc2V0LmMgbWtzdGVtcHMuYyBvYmphbGxvYy5jIG9ic3RhY2suYyBcCi0JcGV4ZWN1dGUuYyByYW5kb20uYyByZW5hbWUuYyByaW5kZXguYyBzaWdzZXRtYXNrLmMgc3BhY2VzLmMgXAotCXNwbGF5LXRyZWUuYyBzdHJjYXNlY21wLmMgc3RybmNhc2VjbXAuYyBzdHJjaHIuYyBzdHJkdXAuYyBzdHJlcnJvci5jIFwKLQlzdHJyY2hyLmMgc3Ryc2lnbmFsLmMgc3Ryc3RyLmMgc3RydG9kLmMgc3RydG9sLmMgc3RydG91bC5jIFwKLQl0bXBuYW0uYyB2YXNwcmludGYuYyB2Zm9yay5jIHZmcHJpbnRmLmMgdnByaW50Zi5jIHZzcHJpbnRmLmMgXAotCXdhaXRwaWQuYyB4YXRleGl0LmMgeGV4aXQuYyB4bWFsbG9jLmMgeHN0cmR1cC5jIHhzdHJlcnJvci5jCi0KLSMgVGhlc2UgYXJlIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeS4KLVJFUVVJUkVEX09GSUxFUyA9IGFyZ3YubyBjaG9vc2UtdGVtcC5vIGNvbmNhdC5vIGNwbHVzLWRlbS5vIFwKLSAgZmRtYXRjaC5vIGZubWF0Y2gubyBnZXRvcHQubyBnZXRvcHQxLm8gZ2V0cnVudGltZS5vIGhleC5vIFwKLSAgZmxvYXRmb3JtYXQubyBvYmphbGxvYy5vIG9ic3RhY2subyBwZXhlY3V0ZS5vIHNwYWNlcy5vIFwKLSAgc3BsYXktdHJlZS5vIHN0cmVycm9yLm8gc3Ryc2lnbmFsLm8geGF0ZXhpdC5vIHhleGl0Lm8geG1hbGxvYy5vIFwKLSAgeHN0cmR1cC5vIHhzdHJlcnJvci5vCi0KLSQoVEFSR0VUTElCKTogJChSRVFVSVJFRF9PRklMRVMpICQoRVhUUkFfT0ZJTEVTKSAkKExJQk9CSlMpICQoQUxMT0NBKQotCXJtIC1mICQoVEFSR0VUTElCKQotCSQoQVIpICQoQVJfRkxBR1MpICQoVEFSR0VUTElCKSBcCi0JICAkKFJFUVVJUkVEX09GSUxFUykgJChFWFRSQV9PRklMRVMpICQoTElCT0JKUykgJChBTExPQ0EpCi0JJChSQU5MSUIpICQoVEFSR0VUTElCKQotCi1JTlNUQUxMX0RFU1QgPSBASU5TVEFMTF9ERVNUQAotaW5zdGFsbDogaW5zdGFsbF90b18kKElOU1RBTExfREVTVCkKLQotaW5zdGFsbF90b19saWJkaXI6IGFsbAotCSQoSU5TVEFMTF9EQVRBKSAkKFRBUkdFVExJQikgJChsaWJkaXIpJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpbgotCSggY2QgJChsaWJkaXIpJChNVUxUSVNVQkRJUikgOyAkKFJBTkxJQikgJChUQVJHRVRMSUIpbiApCi0JbXYgLWYgJChsaWJkaXIpJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpbiAkKGxpYmRpcikkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQikKLQlAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIG11bHRpLWRvIERPPWluc3RhbGwKLQotaW5zdGFsbF90b190b29sZGlyOiBhbGwKLQkkKElOU1RBTExfREFUQSkgJChUQVJHRVRMSUIpICQodG9vbGRpcikvbGliJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpbgotCSggY2QgJCh0b29sZGlyKS9saWIkKE1VTFRJU1VCRElSKSA7ICQoUkFOTElCKSAkKFRBUkdFVExJQiluICkKLQltdiAtZiAkKHRvb2xkaXIpL2xpYiQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKW4gJCh0b29sZGlyKS9saWIkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQikKLQlAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIG11bHRpLWRvIERPPWluc3RhbGwKLQotIyBuZWVkZWQtbGlzdCBpcyB1c2VkIGJ5IGxpYnN0ZGMrKy4KLW5lZWRlZC1saXN0OiBNYWtlZmlsZQotCWY9IiQoTElCT0JKUykgJChBTExPQ0EpICQoRVhUUkFfT0ZJTEVTKSI7IFwKLQljYXNlICQkZiBpbiBcCi0JICAqYWxsb2NhLm8qKSBmPSIkJGYgeG1hbGxvYy5vIHhleGl0Lm8iIDs7IFwKLQllc2FjOyBcCi0JZWNobyAkJGYgPiBuZWVkZWQtbGlzdAotCi0jIHJlcXVpcmVkLWxpc3Qgd2FzIHVzZWQgd2hlbiBidWlsZGluZyBhIHNoYXJlZCBiZmQvb3Bjb2Rlcy9saWJpYmVydHkKLSMgbGlicmFyeS4gIEkgZG9uJ3Qga25vdyBpZiBpdCB1c2VkIGJ5IGFueXRoaW5nIGN1cnJlbnRseS4KLXJlcXVpcmVkLWxpc3Q6IE1ha2VmaWxlCi0JZWNobyAkKFJFUVVJUkVEX09GSUxFUykgPiByZXF1aXJlZC1saXN0Ci0KLXN0YW1wLXBpY2RpcjoKLQlpZiBbIHgiJChlbmFibGVfc2hhcmVkKSIgPSB4eWVzIF0gJiYgWyAhIC1kIHBpYyBdOyB0aGVuIFwKLQkgIG1rZGlyIHBpYzsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1waWNkaXIKLQotLlBIT05ZOiBhbGwgZXRhZ3MgdGFncyBscyBjbGVhbiBzdGFnZTEgc3RhZ2UyCi0KLWV0YWdzIHRhZ3M6IFRBR1MKLQotVEFHUzogJChDRklMRVMpICQoSEZJTEVTKQotCWV0YWdzIGBmb3IgaSBpbiAkKEhGSUxFUykgJChDRklMRVMpOyBkbyBlY2hvICQoc3JjZGlyKS8kJGkgOyBkb25lYAotCi0jIFRoZSBzdGFuZGFsb25lIGRlbWFuZ2xlciAoYysrZmlsdCkgaGFzIGJlZW4gbW92ZWQgdG8gYmludXRpbHMuCi1kZW1hbmdsZToKLQlAZWNobyAiVGhlIHN0YW5kYWxvbmUgZGVtYW5nbGVyLCBub3cgbmFtZWQgYysrZmlsdCwgaXMgbm93IgotCUBlY2hvICJhIHBhcnQgb2YgYmludXRpbHMuIgotCUBmYWxzZQotCi1sczoKLQlAZWNobyBNYWtlZmlsZSAkKEhGSUxFUykgJChDRklMRVMpCi0KLSMgTmVlZCB0byBkZWFsIHdpdGggcHJvZmlsZWQgbGlicmFyaWVzLCB0b28uCi0KLW1vc3RseWNsZWFuOgotCXJtIC1yZiAqLm8gcGljIGNvcmUgZXJycyBcIyogKi5FIGEub3V0Ci0Jcm0gLWYgbmVlZGVkLmF3ayBuZWVkZWQyLmF3ayBlcnJvcnMgZHVtbXkgbmVlZGVkLWxpc3QgY29uZmlnLmggc3RhbXAtKgotCXJtIC1mICQoQ09ORklHX0gpICQoTkVFREVEX0xJU1QpIHN0YW1wLXBpY2RpcgotCUAkKE1VTFRJQ0xFQU4pIG11bHRpLWNsZWFuIERPPW1vc3RseWNsZWFuCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQlybSAtZiAqLmEgcmVxdWlyZWQtbGlzdCB0bXBtdWx0aS5vdXQKLQlAJChNVUxUSUNMRUFOKSBtdWx0aS1jbGVhbiBETz1jbGVhbgotZGlzdGNsZWFuOiBjbGVhbgotCUAkKE1VTFRJQ0xFQU4pIG11bHRpLWNsZWFuIERPPWRpc3RjbGVhbgotCXJtIC1mICp+IE1ha2VmaWxlIGNvbmZpZy5zdGF0dXMgeGhvc3QtbWtmcmFnIFRBR1MgbXVsdGlsaWIub3V0Ci0Jcm0gLWYgY29uZmlnLmxvZwotbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46IGRpc3RjbGVhbgotCi1mb3JjZToKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCi0JQ09ORklHX0ZJTEVTPU1ha2VmaWxlIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotY29uZmlnLmg6IHN0YW1wLWggOyBAdHJ1ZQotc3RhbXAtaDogY29uZmlnLmluIGNvbmZpZy5zdGF0dXMKLQlDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvY29uZmlnLnRhYmxlCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi0kKFJFUVVJUkVEX09GSUxFUykgJChFWFRSQV9PRklMRVMpICQoTElCT0JKUykgJChBTExPQ0EpOiBzdGFtcC1waWNkaXIKLQotYWxsb2NhLm86IGNvbmZpZy5oCi1hdGV4aXQubzogY29uZmlnLmgKLWFyZ3YubzogY29uZmlnLmggYWxsb2NhLWNvbmYuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWJhc2VuYW1lLm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotY2hvb3NlLXRlbXAubzogY29uZmlnLmgKLWNsb2NrLm86IGNvbmZpZy5oCi1jb25jYXQubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi1jcGx1cy1kZW0ubzogY29uZmlnLmggJChJTkNESVIpL2RlbWFuZ2xlLmgKLWZkbWF0Y2gubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi1mbm1hdGNoLm86IGNvbmZpZy5oICQoSU5DRElSKS9mbm1hdGNoLmgKLWdldGN3ZC5vOiBjb25maWcuaAotZ2V0b3B0Lm86IGNvbmZpZy5oICQoSU5DRElSKS9nZXRvcHQuaAotZ2V0b3B0MS5vOiBjb25maWcuaCAkKElOQ0RJUikvZ2V0b3B0LmgKLWdldHBhZ2VzaXplLm86IGNvbmZpZy5oCi1nZXRydW50aW1lLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAotaGV4Lm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotZmxvYXRmb3JtYXQubzogJChJTkNESVIpL2Zsb2F0Zm9ybWF0LmgKLW1rc3RlbXBzLm86IGNvbmZpZy5oCi1vYmphbGxvYy5vOiAkKElOQ0RJUikvb2JqYWxsb2MuaAotb2JzdGFjay5vOiBjb25maWcuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1wZXhlY3V0ZS5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXNwYWNlcy5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXNwbGF5LXRyZWUubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9zcGxheS10cmVlLmggJChJTkNESVIpL2Fuc2lkZWNsLmgKLXN0cmVycm9yLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAotc3Ryc2lnbmFsLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAoteGF0ZXhpdC5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXhleGl0Lm86ICQoSU5DRElSKS9saWJpYmVydHkuaAoteG1hbGxvYy5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXhzdHJkdXAubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi14c3RyZXJyb3IubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCmRpZmYgLS1naXQgYS9saWJpYmVydHkvUkVBRE1FIGIvbGliaWJlcnR5L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1MjI2YS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIC1saWJlcnR5IGxpYnJhcnkgb2YgZnJlZSBzb2Z0d2FyZS4KLUl0IGlzIGEgY29sbGVjdGlvbiBvZiBzdWJyb3V0aW5lcyB1c2VkIGJ5IHZhcmlvdXMgR05VIHByb2dyYW1zLgotQ3VycmVudCBtZW1iZXJzIGluY2x1ZGU6Ci0KLQlnZXRvcHQgLS0gZ2V0IG9wdGlvbnMgZnJvbSBjb21tYW5kIGxpbmUKLQlvYnN0YWNrIC0tIHN0YWNrcyBvZiBhcmJpdHJhcmlseS1zaXplZCBvYmplY3RzCi0Jc3RyZXJyb3IgLS0gZXJyb3IgbWVzc2FnZSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gZXJybm8KLQlzdHJ0b2wgLS0gc3RyaW5nLXRvLWxvbmcgY29udmVyc2lvbgotCXN0cnRvdWwgLS0gc3RyaW5nLXRvLXVuc2lnbmVkLWxvbmcgY29udmVyc2lvbgotCi1XZSBleHBlY3QgbWFueSBvZiB0aGUgR05VIHN1YnJvdXRpbmVzIHRoYXQgYXJlIGZsb2F0aW5nIGFyb3VuZCB0bwotZXZlbnR1YWxseSBhcnJpdmUgaGVyZS4KLQotVGhlIGxpYnJhcnkgbXVzdCBiZSBjb25maWd1cmVkIGZyb20gdGhlIHRvcCBzb3VyY2UgZGlyZWN0b3J5LiAgRG9uJ3QKLXRyeSB0byBydW4gY29uZmlndXJlIGluIHRoaXMgZGlyZWN0b3J5LiAgRm9sbG93IHRoZSBjb25maWd1cmF0aW9uCi1pbnN0cnVjdGlvbnMgaW4gLi4vUkVBRE1FLgotCi1QbGVhc2UgcmVwb3J0IGJ1Z3MgYW5kIGZpeGVzIHRvICJidWctZ251LXV0aWxzQHByZXAuYWkubWl0LmVkdSIuICBUaGFuayB5b3UuCi0KLUFERElORyBBIE5FVyBGSUxFCi09PT09PT09PT09PT09PT09PQotCi1UaGVyZSBhcmUgdHdvIHNldHMgb2YgZmlsZXM6ICBUaG9zZSB0aGF0IGFyZSAicmVxdWlyZWQiIHdpbGwgYmUKLWluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5IGZvciBhbGwgY29uZmlndXJhdGlvbnMsIHdoaWxlIHRob3NlCi10aGF0IGFyZSAib3B0aW9uYWwiIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkgb25seSBpZiAibmVlZGVkLiIKLQotVG8gYWRkIGEgbmV3IHJlcXVpcmVkIGZpbGUsIGVkaXQgTWFrZWZpbGUgdG8gYWRkIHRoZSBzb3VyY2UgZmlsZQotbmFtZSB0byBDRklMRVMgYW5kIHRoZSBvYmplY3QgZmlsZSB0byBSRVFVSVJFRF9PRklMRVMuCi0KLVRvIGFkZCBhIG5ldyBvcHRpb25hbCBmaWxlLCBpdCBtdXN0IHByb3ZpZGUgYSBzaW5nbGUgZnVuY3Rpb24sIGFuZCB0aGUKLW5hbWUgb2YgdGhlIGZ1bmN0aW9uIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0KLSAgICAqIEFkZCB0aGUgc291cmNlIGZpbGUgbmFtZSB0byBDRklMRVMuCi0KLSAgICAqIEFkZCB0aGUgZnVuY3Rpb24gdG8gbmFtZSB0byB0aGUgZnVuY3Mgc2hlbGwgdmFyaWFibGUgaW4KLSAgICAgIGNvbmZpZ3VyZS5pbi4KLQotICAgICogQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgQUNfQ0hFQ0tfRlVOQ1MgbGlzdHMganVzdCBhZnRlciB0aGUKLSAgICAgIHNldHRpbmcgb2YgdGhlIGZ1bmNzIHNoZWxsIHZhcmlhYmxlLiAgVGhlc2UgQUNfQ0hFQ0tfRlVOQ1MgY2FsbHMKLSAgICAgIGFyZSBuZXZlciBleGVjdXRlZDsgdGhleSBhcmUgdGhlcmUgdG8gbWFrZSBhdXRvaGVhZGVyIHdvcmsKLSAgICAgIGJldHRlci4KLQotICAgICogQ29uc2lkZXIgdGhlIHNwZWNpYWwgY2FzZXMgb2YgYnVpbGRpbmcgbGliaWJlcnR5OyBhcyBvZiB0aGlzCi0gICAgICB3cml0aW5nLCB0aGUgc3BlY2lhbCBjYXNlcyBhcmUgbmV3bGliIGFuZCBWeFdvcmtzLiAgSWYgYQotICAgICAgcGFydGljdWxhciBzcGVjaWFsIGNhc2UgcHJvdmlkZXMgdGhlIGZ1bmN0aW9uLCB5b3UgZG8gbm90IG5lZWQKLSAgICAgIHRvIGRvIGFueXRoaW5nLiAgSWYgaXQgZG9lcyBub3QgcHJvdmlkZSB0aGUgZnVuY3Rpb24sIGFkZCB0aGUKLSAgICAgIG9iamVjdCBmaWxlIHRvIExJQk9CSlMsIGFuZCBhZGQgdGhlIGZ1bmN0aW9uIG5hbWUgdG8gdGhlIGNhc2UKLSAgICAgIGNvbnRyb2xsaW5nIHdoZXRoZXIgdG8gZGVmaW5lIEhBVkVfZnVuYy4KLQotVGhlIG9wdGlvbmFsIGZpbGUgeW91J3ZlIGFkZGVkIChlLmcuIGdldGN3ZC5jKSBzaG91bGQgY29tcGlsZSBhbmQgd29yawotb24gYWxsIGhvc3RzIHdoZXJlIGl0IGlzIG5lZWRlZC4gIEl0IGRvZXMgbm90IGhhdmUgdG8gd29yayBvciBldmVuCi1jb21waWxlIG9uIGhvc3RzIHdoZXJlIGl0IGlzIG5vdCBuZWVkZWQuCi0KLUFERElORyBBIE5FVyBDT05GSUdVUkFUSU9OCi09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1PbiBtb3N0IGhvc3RzIHlvdSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhlIHNjaGVtZSBmb3IgYXV0b21hdGljYWxseQotZmlndXJpbmcgb3V0IHdoaWNoIGZpbGVzIGFyZSBuZWVkZWQuICBJbiB0aGF0IGNhc2UsIHlvdSBwcm9iYWJseQotZG9uJ3QgbmVlZCBhIHNwZWNpYWwgTWFrZWZpbGUgc3R1YiBmb3IgdGhhdCBjb25maWd1cmF0aW9uLgotCi1JZiB0aGUgZnVsbHkgYXV0b21hdGljIHNjaGVtZSBkb2Vzbid0IHdvcmssIHlvdSBtYXkgYmUgYWJsZSB0byBnZXQKLWJ5IHdpdGggZGVmaW5pbmcgRVhUUkFfT0ZJTEVTIGluIHlvdXIgTWFrZWZpbGUgc3R1Yi4gIFRoaXMgaXMKLWEgbGlzdCBvZiBvYmplY3QgZmlsZSBuYW1lcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIHJlcXVpcmVkCi1mb3IgdGhpcyBjb25maWd1cmF0aW9uIC0gdGhleSB3aWxsIGJlIGluY2x1ZGVkIGluIGxpYmliZXJ0eS5hLAotcmVnYXJkbGVzcyBvZiB3aGF0ZXZlciBtaWdodCBiZSBpbiB0aGUgQyBsaWJyYXJ5LgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2FjY29uZmlnLmggYi9saWJpYmVydHkvYWNjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjNTk5ZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYWNjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX2Vycmxpc3QgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0VSUkxJU1QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfbmVyciB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfTkVSUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19zaWdsaXN0IHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19TSUdMSVNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZXJyb3IgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSRVJST1IKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hbGxvY2EtY29uZi5oIGIvbGliaWJlcnR5L2FsbG9jYS1jb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljM2VlYTMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2FsbG9jYS1jb25mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChDX0FMTE9DQSkKLSMgaWZuZGVmIGFsbG9jYQotIyAgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGVuZGlmCi0jZWxzZSAvKiAhIGRlZmluZWQgKF9fR05VQ19fKSAqLwotIyAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICBlbHNlCi0jICBpZiBkZWZpbmVkKEhBVkVfQUxMT0NBX0gpICYmICFkZWZpbmVkKENfQUxMT0NBKQotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZSAvKiAhIGRlZmluZWQgKEhBVkVfQUxMT0NBX0gpICovCi0jICAgaWZkZWYgX19TVERDX18KLWV4dGVybiBQVFIgYWxsb2NhIChzaXplX3QpOwotIyAgIGVsc2UgLyogISBkZWZpbmVkIChfX1NURENfXykgKi8KLWV4dGVybiBQVFIgYWxsb2NhICgpOwotIyAgIGVuZGlmIC8qICEgZGVmaW5lZCAoX19TVERDX18pICovCi0jICBlbmRpZiAvKiAhIGRlZmluZWQgKEhBVkVfQUxMT0NBX0gpICovCi0jICBpZmRlZiBfV0lOMzIKLSMgICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGVuZGlmCi0jIGVuZGlmIC8qICEgZGVmaW5lZCAoX0FJWCkgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKF9fR05VQ19fKSAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2FsbG9jYS5jIGIvbGliaWJlcnR5L2FsbG9jYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjhhMjE1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hbGxvY2EuYworKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKiBhbGxvY2EuYyAtLSBhbGxvY2F0ZSBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZCBtZW1vcnkKLSAgIChNb3N0bHkpIHBvcnRhYmxlIHB1YmxpYy1kb21haW4gaW1wbGVtZW50YXRpb24gLS0gRCBBIEd3eW4KLQotICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUFdCIGxpYnJhcnkgYWxsb2NhIGZ1bmN0aW9uLAotICAgd2hpY2ggaXMgdXNlZCB0byBhbGxvY2F0ZSBzcGFjZSBvZmYgdGhlIHJ1bi10aW1lIHN0YWNrIHNvCi0gICB0aGF0IGl0IGlzIGF1dG9tYXRpY2FsbHkgcmVjbGFpbWVkIHVwb24gcHJvY2VkdXJlIGV4aXQsCi0gICB3YXMgaW5zcGlyZWQgYnkgZGlzY3Vzc2lvbnMgd2l0aCBKLiBRLiBKb2huc29uIG9mIENvcm5lbGwuCi0gICBKLk90dG8gVGVubmFudCA8am90QGNyYXkuY29tPiBjb250cmlidXRlZCB0aGUgQ3JheSBzdXBwb3J0LgotCi0gICBUaGVyZSBhcmUgc29tZSBwcmVwcm9jZXNzb3IgY29uc3RhbnRzIHRoYXQgY2FuCi0gICBiZSBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIGZvciB5b3VyIHNwZWNpZmljIHN5c3RlbSwgZm9yCi0gICBpbXByb3ZlZCBlZmZpY2llbmN5OyBob3dldmVyLCB0aGUgZGVmYXVsdHMgc2hvdWxkIGJlIG9rYXkuCi0KLSAgIFRoZSBnZW5lcmFsIGNvbmNlcHQgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0byBrZWVwCi0gICB0cmFjayBvZiBhbGwgYWxsb2NhLWFsbG9jYXRlZCBibG9ja3MsIGFuZCByZWNsYWltIGFueQotICAgdGhhdCBhcmUgZm91bmQgdG8gYmUgZGVlcGVyIGluIHRoZSBzdGFjayB0aGFuIHRoZSBjdXJyZW50Ci0gICBpbnZvY2F0aW9uLiAgVGhpcyBoZXVyaXN0aWMgZG9lcyBub3QgcmVjbGFpbSBzdG9yYWdlIGFzCi0gICBzb29uIGFzIGl0IGJlY29tZXMgaW52YWxpZCwgYnV0IGl0IHdpbGwgZG8gc28gZXZlbnR1YWxseS4KLQotICAgQXMgYSBzcGVjaWFsIGNhc2UsIGFsbG9jYSgwKSByZWNsYWltcyBzdG9yYWdlIHdpdGhvdXQKLSAgIGFsbG9jYXRpbmcgYW55LiAgSXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlIGFsbG9jYSgwKSBpbgotICAgeW91ciBtYWluIGNvbnRyb2wgbG9vcCwgZXRjLiB0byBmb3JjZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIGVtYWNzCi0jaW5jbHVkZSAiYmxvY2tpbnB1dC5oIgotI2VuZGlmCi0KLS8qIElmIGNvbXBpbGluZyB3aXRoIEdDQyAyLCB0aGlzIGZpbGUncyBub3QgbmVlZGVkLiAgRXhjZXB0IG9mIGNvdXJzZSBpZgotICAgdGhlIEMgYWxsb2NhIGlzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgKi8KLSNpZiBkZWZpbmVkIChVU0VfQ19BTExPQ0EpIHx8ICFkZWZpbmVkIChfX0dOVUNfXykgfHwgX19HTlVDX18gPCAyCi0KLS8qIElmIHNvbWVvbmUgaGFzIGRlZmluZWQgYWxsb2NhIGFzIGEgbWFjcm8sCi0gICB0aGVyZSBtdXN0IGJlIHNvbWUgb3RoZXIgd2F5IGFsbG9jYSBpcyBzdXBwb3NlZCB0byB3b3JrLiAgKi8KLSNpZm5kZWYgYWxsb2NhCi0KLSNpZmRlZiBlbWFjcwotI2lmZGVmIHN0YXRpYwotLyogYWN0dWFsbHksIG9ubHkgd2FudCB0aGlzIGlmIHN0YXRpYyBpcyBkZWZpbmVkIGFzICIiCi0gICAtLSB0aGlzIGlzIGZvciB1c2csIGluIHdoaWNoIGVtYWNzIG11c3QgdW5kZWZpbmUgc3RhdGljCi0gICBpbiBvcmRlciB0byBtYWtlIHVuZXhlYyB3b3JrYWJsZQotICAgKi8KLSNpZm5kZWYgU1RBQ0tfRElSRUNUSU9OCi15b3UKLWxvc2UKLS0tIG11c3Qga25vdyBTVEFDS19ESVJFQ1RJT04gYXQgY29tcGlsZS10aW1lCi0jZW5kaWYgLyogU1RBQ0tfRElSRUNUSU9OIHVuZGVmaW5lZCAqLwotI2VuZGlmIC8qIHN0YXRpYyAqLwotI2VuZGlmIC8qIGVtYWNzICovCi0KLS8qIElmIHlvdXIgc3RhY2sgaXMgYSBsaW5rZWQgbGlzdCBvZiBmcmFtZXMsIHlvdSBoYXZlIHRvCi0gICBwcm92aWRlIGFuICJhZGRyZXNzIG1ldHJpYyIgQUREUkVTU19GVU5DVElPTiBtYWNyby4gICovCi0KLSNpZiBkZWZpbmVkIChDUkFZKSAmJiBkZWZpbmVkIChDUkFZX1NUQUNLU0VHX0VORCkKLWxvbmcgaTAwYWZ1bmMgKCk7Ci0jZGVmaW5lIEFERFJFU1NfRlVOQ1RJT04oYXJnKSAoY2hhciAqKSBpMDBhZnVuYyAoJihhcmcpKQotI2Vsc2UKLSNkZWZpbmUgQUREUkVTU19GVU5DVElPTihhcmcpICYoYXJnKQotI2VuZGlmCi0KLSNpZiBfX1NURENfXwotdHlwZWRlZiB2b2lkICpwb2ludGVyOwotI2Vsc2UKLXR5cGVkZWYgY2hhciAqcG9pbnRlcjsKLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUJTlVMTAkwCi0jZW5kaWYKLQotLyogRGlmZmVyZW50IHBvcnRpb25zIG9mIEVtYWNzIG5lZWQgdG8gY2FsbCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YKLSAgIG1hbGxvYy4gIFRoZSBFbWFjcyBleGVjdXRhYmxlIG5lZWRzIGFsbG9jYSB0byBjYWxsIHhtYWxsb2MsIGJlY2F1c2UKLSAgIG9yZGluYXJ5IG1hbGxvYyBpc24ndCBwcm90ZWN0ZWQgZnJvbSBpbnB1dCBzaWduYWxzLiAgT24gdGhlIG90aGVyCi0gICBoYW5kLCB0aGUgdXRpbGl0aWVzIGluIGxpYi1zcmMgbmVlZCBhbGxvY2EgdG8gY2FsbCBtYWxsb2M7IHNvbWUgb2YKLSAgIHRoZW0gYXJlIHZlcnkgc2ltcGxlLCBhbmQgZG9uJ3QgaGF2ZSBhbiB4bWFsbG9jIHJvdXRpbmUuCi0KLSAgIE5vbi1FbWFjcyBwcm9ncmFtcyBleHBlY3QgdGhpcyB0byBjYWxsIHVzZSB4bWFsbG9jLgotCi0gICBDYWxsZXJzIGJlbG93IHNob3VsZCB1c2UgbWFsbG9jLiAgKi8KLQotI2lmbmRlZiBlbWFjcwotI2RlZmluZSBtYWxsb2MgeG1hbGxvYwotI2VuZGlmCi1leHRlcm4gcG9pbnRlciBtYWxsb2MgKCk7Ci0KLS8qIERlZmluZSBTVEFDS19ESVJFQ1RJT04gaWYgeW91IGtub3cgdGhlIGRpcmVjdGlvbiBvZiBzdGFjawotICAgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseQotICAgZGVkdWNlZCBhdCBydW4tdGltZS4KLQotICAgU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotICAgU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gICBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93biAgKi8KLQotI2lmbmRlZiBTVEFDS19ESVJFQ1RJT04KLSNkZWZpbmUJU1RBQ0tfRElSRUNUSU9OCTAJLyogRGlyZWN0aW9uIHVua25vd24uICAqLwotI2VuZGlmCi0KLSNpZiBTVEFDS19ESVJFQ1RJT04gIT0gMAotCi0jZGVmaW5lCVNUQUNLX0RJUglTVEFDS19ESVJFQ1RJT04JLyogS25vd24gYXQgY29tcGlsZS10aW1lLiAgKi8KLQotI2Vsc2UgLyogU1RBQ0tfRElSRUNUSU9OID09IDA7IG5lZWQgcnVuLXRpbWUgY29kZS4gICovCi0KLXN0YXRpYyBpbnQgc3RhY2tfZGlyOwkJLyogMSBvciAtMSBvbmNlIGtub3duLiAgKi8KLSNkZWZpbmUJU1RBQ0tfRElSCXN0YWNrX2RpcgotCi1zdGF0aWMgdm9pZAotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSBOVUxMOwkvKiBBZGRyZXNzIG9mIGZpcnN0IGBkdW1teScsIG9uY2Uga25vd24uICAqLwotICBhdXRvIGNoYXIgZHVtbXk7CQkvKiBUbyBnZXQgc3RhY2sgYWRkcmVzcy4gICovCi0KLSAgaWYgKGFkZHIgPT0gTlVMTCkKLSAgICB7CQkJCS8qIEluaXRpYWwgZW50cnkuICAqLwotICAgICAgYWRkciA9IEFERFJFU1NfRlVOQ1RJT04gKGR1bW15KTsKLQotICAgICAgZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CS8qIFJlY3Vyc2Ugb25jZS4gICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogU2Vjb25kIGVudHJ5LiAgKi8KLSAgICAgIGlmIChBRERSRVNTX0ZVTkNUSU9OIChkdW1teSkgPiBhZGRyKQotCXN0YWNrX2RpciA9IDE7CQkvKiBTdGFjayBncmV3IHVwd2FyZC4gICovCi0gICAgICBlbHNlCi0Jc3RhY2tfZGlyID0gLTE7CQkvKiBTdGFjayBncmV3IGRvd253YXJkLiAgKi8KLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBTVEFDS19ESVJFQ1RJT04gPT0gMCAqLwotCi0vKiBBbiAiYWxsb2NhIGhlYWRlciIgaXMgdXNlZCB0bzoKLSAgIChhKSBjaGFpbiB0b2dldGhlciBhbGwgYWxsb2NhJ2VkIGJsb2NrczsKLSAgIChiKSBrZWVwIHRyYWNrIG9mIHN0YWNrIGRlcHRoLgotCi0gICBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHNpemVvZihoZWFkZXIpIGFncmVlIHdpdGggbWFsbG9jCi0gICBhbGlnbm1lbnQgY2h1bmsgc2l6ZS4gIFRoZSBmb2xsb3dpbmcgZGVmYXVsdCBzaG91bGQgd29yayBva2F5LiAgKi8KLQotI2lmbmRlZglBTElHTl9TSVpFCi0jZGVmaW5lCUFMSUdOX1NJWkUJc2l6ZW9mKGRvdWJsZSkKLSNlbmRpZgotCi10eXBlZGVmIHVuaW9uIGhkcgotewotICBjaGFyIGFsaWduW0FMSUdOX1NJWkVdOwkvKiBUbyBmb3JjZSBzaXplb2YoaGVhZGVyKS4gICovCi0gIHN0cnVjdAotICAgIHsKLSAgICAgIHVuaW9uIGhkciAqbmV4dDsJCS8qIEZvciBjaGFpbmluZyBoZWFkZXJzLiAgKi8KLSAgICAgIGNoYXIgKmRlZXA7CQkvKiBGb3Igc3RhY2sgZGVwdGggbWVhc3VyZS4gICovCi0gICAgfSBoOwotfSBoZWFkZXI7Ci0KLXN0YXRpYyBoZWFkZXIgKmxhc3RfYWxsb2NhX2hlYWRlciA9IE5VTEw7CS8qIC0+IGxhc3QgYWxsb2NhIGhlYWRlci4gICovCi0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gYXQgbGVhc3QgU0laRSBieXRlcyBvZiBzdG9yYWdlLAotICAgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZCB1cG9uIGV4aXQgZnJvbQotICAgdGhlIHByb2NlZHVyZSB0aGF0IGNhbGxlZCBhbGxvY2EuICBPcmlnaW5hbGx5LCB0aGlzIHNwYWNlCi0gICB3YXMgc3VwcG9zZWQgdG8gYmUgdGFrZW4gZnJvbSB0aGUgY3VycmVudCBzdGFjayBmcmFtZSBvZiB0aGUKLSAgIGNhbGxlciwgYnV0IHRoYXQgbWV0aG9kIGNhbm5vdCBiZSBtYWRlIHRvIHdvcmsgZm9yIHNvbWUKLSAgIGltcGxlbWVudGF0aW9ucyBvZiBDLCBmb3IgZXhhbXBsZSB1bmRlciBHb3VsZCdzIFVUWC8zMi4gICovCi0KLXBvaW50ZXIKLWFsbG9jYSAoc2l6ZSkKLSAgICAgdW5zaWduZWQgc2l6ZTsKLXsKLSAgYXV0byBjaGFyIHByb2JlOwkJLyogUHJvYmVzIHN0YWNrIGRlcHRoOiAqLwotICByZWdpc3RlciBjaGFyICpkZXB0aCA9IEFERFJFU1NfRlVOQ1RJT04gKHByb2JlKTsKLQotI2lmIFNUQUNLX0RJUkVDVElPTiA9PSAwCi0gIGlmIChTVEFDS19ESVIgPT0gMCkJCS8qIFVua25vd24gZ3Jvd3RoIGRpcmVjdGlvbi4gICovCi0gICAgZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0jZW5kaWYKLQotICAvKiBSZWNsYWltIGdhcmJhZ2UsIGRlZmluZWQgYXMgYWxsIGFsbG9jYSdkIHN0b3JhZ2UgdGhhdAotICAgICB3YXMgYWxsb2NhdGVkIGZyb20gZGVlcGVyIGluIHRoZSBzdGFjayB0aGFuIGN1cnJlbnRseS4gICovCi0KLSAgewotICAgIHJlZ2lzdGVyIGhlYWRlciAqaHA7CS8qIFRyYXZlcnNlcyBsaW5rZWQgbGlzdC4gICovCi0KLSNpZmRlZiBlbWFjcwotICAgIEJMT0NLX0lOUFVUOwotI2VuZGlmCi0KLSAgICBmb3IgKGhwID0gbGFzdF9hbGxvY2FfaGVhZGVyOyBocCAhPSBOVUxMOykKLSAgICAgIGlmICgoU1RBQ0tfRElSID4gMCAmJiBocC0+aC5kZWVwID4gZGVwdGgpCi0JICB8fCAoU1RBQ0tfRElSIDwgMCAmJiBocC0+aC5kZWVwIDwgZGVwdGgpKQotCXsKLQkgIHJlZ2lzdGVyIGhlYWRlciAqbnAgPSBocC0+aC5uZXh0OwotCi0JICBmcmVlICgocG9pbnRlcikgaHApOwkvKiBDb2xsZWN0IGdhcmJhZ2UuICAqLwotCi0JICBocCA9IG5wOwkJLyogLT4gbmV4dCBoZWFkZXIuICAqLwotCX0KLSAgICAgIGVsc2UKLQlicmVhazsJCQkvKiBSZXN0IGFyZSBub3QgZGVlcGVyLiAgKi8KLQotICAgIGxhc3RfYWxsb2NhX2hlYWRlciA9IGhwOwkvKiAtPiBsYXN0IHZhbGlkIHN0b3JhZ2UuICAqLwotCi0jaWZkZWYgZW1hY3MKLSAgICBVTkJMT0NLX0lOUFVUOwotI2VuZGlmCi0gIH0KLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHJldHVybiBOVUxMOwkJLyogTm8gYWxsb2NhdGlvbiByZXF1aXJlZC4gICovCi0KLSAgLyogQWxsb2NhdGUgY29tYmluZWQgaGVhZGVyICsgdXNlciBkYXRhIHN0b3JhZ2UuICAqLwotCi0gIHsKLSAgICByZWdpc3RlciBwb2ludGVyIG5ldyA9IG1hbGxvYyAoc2l6ZW9mIChoZWFkZXIpICsgc2l6ZSk7Ci0gICAgLyogQWRkcmVzcyBvZiBoZWFkZXIuICAqLwotCi0gICAgaWYgKG5ldyA9PSAwKQotICAgICAgYWJvcnQoKTsKLQotICAgICgoaGVhZGVyICopIG5ldyktPmgubmV4dCA9IGxhc3RfYWxsb2NhX2hlYWRlcjsKLSAgICAoKGhlYWRlciAqKSBuZXcpLT5oLmRlZXAgPSBkZXB0aDsKLQotICAgIGxhc3RfYWxsb2NhX2hlYWRlciA9IChoZWFkZXIgKikgbmV3OwotCi0gICAgLyogVXNlciBzdG9yYWdlIGJlZ2lucyBqdXN0IGFmdGVyIGhlYWRlci4gICovCi0KLSAgICByZXR1cm4gKHBvaW50ZXIpICgoY2hhciAqKSBuZXcgKyBzaXplb2YgKGhlYWRlcikpOwotICB9Ci19Ci0KLSNpZiBkZWZpbmVkIChDUkFZKSAmJiBkZWZpbmVkIChDUkFZX1NUQUNLU0VHX0VORCkKLQotI2lmZGVmIERFQlVHX0kwMEFGVU5DCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotCi0jaWZuZGVmIENSQVlfU1RBQ0sKLSNkZWZpbmUgQ1JBWV9TVEFDSwotI2lmbmRlZiBDUkFZMgotLyogU3RhY2sgc3RydWN0dXJlcyBmb3IgQ1JBWS0xLCBDUkFZIFgtTVAsIGFuZCBDUkFZIFktTVAgKi8KLXN0cnVjdCBzdGFja19jb250cm9sX2hlYWRlcgotICB7Ci0gICAgbG9uZyBzaGdyb3c6MzI7CQkvKiBOdW1iZXIgb2YgdGltZXMgc3RhY2sgaGFzIGdyb3duLiAgKi8KLSAgICBsb25nIHNoYXNlZzozMjsJCS8qIFNpemUgb2YgaW5jcmVtZW50cyB0byBzdGFjay4gICovCi0gICAgbG9uZyBzaGh3bTozMjsJCS8qIEhpZ2ggd2F0ZXIgbWFyayBvZiBzdGFjay4gICovCi0gICAgbG9uZyBzaHNpemU6MzI7CQkvKiBDdXJyZW50IHNpemUgb2Ygc3RhY2sgKGFsbCBzZWdtZW50cykuICAqLwotICB9OwotCi0vKiBUaGUgc3RhY2sgc2VnbWVudCBsaW5rYWdlIGNvbnRyb2wgaW5mb3JtYXRpb24gb2NjdXJzIGF0Ci0gICB0aGUgaGlnaC1hZGRyZXNzIGVuZCBvZiBhIHN0YWNrIHNlZ21lbnQuICAoVGhlIHN0YWNrCi0gICBncm93cyBmcm9tIGxvdyBhZGRyZXNzZXMgdG8gaGlnaCBhZGRyZXNzZXMuKSAgVGhlIGluaXRpYWwKLSAgIHBhcnQgb2YgdGhlIHN0YWNrIHNlZ21lbnQgbGlua2FnZSBjb250cm9sIGluZm9ybWF0aW9uIGlzCi0gICAwMjAwIChvY3RhbCkgd29yZHMuICBUaGlzIHByb3ZpZGVzIGZvciByZWdpc3RlciBzdG9yYWdlCi0gICBmb3IgdGhlIHJvdXRpbmUgd2hpY2ggb3ZlcmZsb3dzIHRoZSBzdGFjay4gICovCi0KLXN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UKLSAgewotICAgIGxvbmcgc3NbMDIwMF07CQkvKiAwMjAwIG92ZXJmbG93IHdvcmRzLiAgKi8KLSAgICBsb25nIHNzc2l6ZTozMjsJCS8qIE51bWJlciBvZiB3b3JkcyBpbiB0aGlzIHNlZ21lbnQuICAqLwotICAgIGxvbmcgc3NiYXNlOjMyOwkJLyogT2Zmc2V0IHRvIHN0YWNrIGJhc2UuICAqLwotICAgIGxvbmc6MzI7Ci0gICAgbG9uZyBzc3BzZWc6MzI7CQkvKiBPZmZzZXQgdG8gbGlua2FnZSBjb250cm9sIG9mIHByZXZpb3VzCi0JCQkJICAgc2VnbWVudCBvZiBzdGFjay4gICovCi0gICAgbG9uZzozMjsKLSAgICBsb25nIHNzdGNwdDozMjsJCS8qIFBvaW50ZXIgdG8gdGFzayBjb21tb24gYWRkcmVzcyBibG9jay4gICovCi0gICAgbG9uZyBzc2Nzbm07CQkvKiBQcml2YXRlIGNvbnRyb2wgc3RydWN0dXJlIG51bWJlciBmb3IKLQkJCQkgICBtaWNyb3Rhc2tpbmcuICAqLwotICAgIGxvbmcgc3N1c3IxOwkJLyogUmVzZXJ2ZWQgZm9yIHVzZXIuICAqLwotICAgIGxvbmcgc3N1c3IyOwkJLyogUmVzZXJ2ZWQgZm9yIHVzZXIuICAqLwotICAgIGxvbmcgc3N0cGlkOwkJLyogUHJvY2VzcyBJRCBmb3IgcGlkIGJhc2VkIG11bHRpLXRhc2tpbmcuICAqLwotICAgIGxvbmcgc3NndnVwOwkJLyogUG9pbnRlciB0byBtdWx0aXRhc2tpbmcgdGhyZWFkIGdpdmV1cC4gICovCi0gICAgbG9uZyBzc2NyYXlbN107CQkvKiBSZXNlcnZlZCBmb3IgQ3JheSBSZXNlYXJjaC4gICovCi0gICAgbG9uZyBzc2EwOwotICAgIGxvbmcgc3NhMTsKLSAgICBsb25nIHNzYTI7Ci0gICAgbG9uZyBzc2EzOwotICAgIGxvbmcgc3NhNDsKLSAgICBsb25nIHNzYTU7Ci0gICAgbG9uZyBzc2E2OwotICAgIGxvbmcgc3NhNzsKLSAgICBsb25nIHNzczA7Ci0gICAgbG9uZyBzc3MxOwotICAgIGxvbmcgc3NzMjsKLSAgICBsb25nIHNzczM7Ci0gICAgbG9uZyBzc3M0OwotICAgIGxvbmcgc3NzNTsKLSAgICBsb25nIHNzczY7Ci0gICAgbG9uZyBzc3M3OwotICB9OwotCi0jZWxzZSAvKiBDUkFZMiAqLwotLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgdmVjdG9yIG9mIHdvcmRzCi0gICByZXR1cm5lZCBieSB0aGUgU1RLU1RBVCBsaWJyYXJ5IHJvdXRpbmUuICAqLwotc3RydWN0IHN0a19zdGF0Ci0gIHsKLSAgICBsb25nIG5vdzsJCQkvKiBDdXJyZW50IHRvdGFsIHN0YWNrIHNpemUuICAqLwotICAgIGxvbmcgbWF4YzsJCQkvKiBBbW91bnQgb2YgY29udGlndW91cyBzcGFjZSB3aGljaCB3b3VsZAotCQkJCSAgIGJlIHJlcXVpcmVkIHRvIHNhdGlzZnkgdGhlIG1heGltdW0KLQkJCQkgICBzdGFjayBkZW1hbmQgdG8gZGF0ZS4gICovCi0gICAgbG9uZyBoaWdoX3dhdGVyOwkJLyogU3RhY2sgaGlnaC13YXRlciBtYXJrLiAgKi8KLSAgICBsb25nIG92ZXJmbG93czsJCS8qIE51bWJlciBvZiBzdGFjayBvdmVyZmxvdyAoJFNUS09GRU4pIGNhbGxzLiAgKi8KLSAgICBsb25nIGhpdHM7CQkJLyogTnVtYmVyIG9mIGludGVybmFsIGJ1ZmZlciBoaXRzLiAgKi8KLSAgICBsb25nIGV4dGVuZHM7CQkvKiBOdW1iZXIgb2YgYmxvY2sgZXh0ZW5zaW9ucy4gICovCi0gICAgbG9uZyBzdGtvX21hbGxvY3M7CQkvKiBCbG9jayBhbGxvY2F0aW9ucyBieSAkU1RLT0ZFTi4gICovCi0gICAgbG9uZyB1bmRlcmZsb3dzOwkJLyogTnVtYmVyIG9mIHN0YWNrIHVuZGVyZmxvdyBjYWxscyAoJFNUS1JFVE4pLiAgKi8KLSAgICBsb25nIHN0a29fZnJlZTsJCS8qIE51bWJlciBvZiBkZWFsbG9jYXRpb25zIGJ5ICRTVEtSRVROLiAgKi8KLSAgICBsb25nIHN0a21fZnJlZTsJCS8qIE51bWJlciBvZiBkZWFsbG9jYXRpb25zIGJ5ICRTVEtNUkVULiAgKi8KLSAgICBsb25nIHNlZ21lbnRzOwkJLyogQ3VycmVudCBudW1iZXIgb2Ygc3RhY2sgc2VnbWVudHMuICAqLwotICAgIGxvbmcgbWF4czsJCQkvKiBNYXhpbXVtIG51bWJlciBvZiBzdGFjayBzZWdtZW50cyBzbyBmYXIuICAqLwotICAgIGxvbmcgcGFkX3NpemU7CQkvKiBTdGFjayBwYWQgc2l6ZS4gICovCi0gICAgbG9uZyBjdXJyZW50X2FkZHJlc3M7CS8qIEN1cnJlbnQgc3RhY2sgc2VnbWVudCBhZGRyZXNzLiAgKi8KLSAgICBsb25nIGN1cnJlbnRfc2l6ZTsJCS8qIEN1cnJlbnQgc3RhY2sgc2VnbWVudCBzaXplLiAgVGhpcwotCQkJCSAgIG51bWJlciBpcyBhY3R1YWxseSBjb3JydXB0ZWQgYnkgU1RLU1RBVCB0bwotCQkJCSAgIGluY2x1ZGUgdGhlIGZpZnRlZW4gd29yZCB0cmFpbGVyIGFyZWEuICAqLwotICAgIGxvbmcgaW5pdGlhbF9hZGRyZXNzOwkvKiBBZGRyZXNzIG9mIGluaXRpYWwgc2VnbWVudC4gICovCi0gICAgbG9uZyBpbml0aWFsX3NpemU7CQkvKiBTaXplIG9mIGluaXRpYWwgc2VnbWVudC4gICovCi0gIH07Ci0KLS8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggdHJhaWxzCi0gICBhbnkgc3RhY2sgc2VnbWVudC4gIEkgdGhpbmsgdGhhdCB0aGUgZGVzY3JpcHRpb24gaW4gJ2FzZGVmJyBpcwotICAgb3V0IG9mIGRhdGUuICBJIG9ubHkgZGVzY3JpYmUgdGhlIHBhcnRzIHRoYXQgSSBhbSBzdXJlIGFib3V0LiAgKi8KLQotc3RydWN0IHN0a190cmFpbGVyCi0gIHsKLSAgICBsb25nIHRoaXNfYWRkcmVzczsJCS8qIEFkZHJlc3Mgb2YgdGhpcyBibG9jay4gICovCi0gICAgbG9uZyB0aGlzX3NpemU7CQkvKiBTaXplIG9mIHRoaXMgYmxvY2sgKGRvZXMgbm90IGluY2x1ZGUKLQkJCQkgICB0aGlzIHRyYWlsZXIpLiAgKi8KLSAgICBsb25nIHVua25vd24yOwotICAgIGxvbmcgdW5rbm93bjM7Ci0gICAgbG9uZyBsaW5rOwkJCS8qIEFkZHJlc3Mgb2YgdHJhaWxlciBibG9jayBvZiBwcmV2aW91cwotCQkJCSAgIHNlZ21lbnQuICAqLwotICAgIGxvbmcgdW5rbm93bjU7Ci0gICAgbG9uZyB1bmtub3duNjsKLSAgICBsb25nIHVua25vd243OwotICAgIGxvbmcgdW5rbm93bjg7Ci0gICAgbG9uZyB1bmtub3duOTsKLSAgICBsb25nIHVua25vd24xMDsKLSAgICBsb25nIHVua25vd24xMTsKLSAgICBsb25nIHVua25vd24xMjsKLSAgICBsb25nIHVua25vd24xMzsKLSAgICBsb25nIHVua25vd24xNDsKLSAgfTsKLQotI2VuZGlmIC8qIENSQVkyICovCi0jZW5kaWYgLyogbm90IENSQVlfU1RBQ0sgKi8KLQotI2lmZGVmIENSQVkyCi0vKiBEZXRlcm1pbmUgYSAic3RhY2sgbWVhc3VyZSIgZm9yIGFuIGFyYml0cmFyeSBBRERSRVNTLgotICAgSSBkb3VidCB0aGF0ICJsaW50IiB3aWxsIGxpa2UgdGhpcyBtdWNoLiAgKi8KLQotc3RhdGljIGxvbmcKLWkwMGFmdW5jIChsb25nICphZGRyZXNzKQotewotICBzdHJ1Y3Qgc3RrX3N0YXQgc3RhdHVzOwotICBzdHJ1Y3Qgc3RrX3RyYWlsZXIgKnRyYWlsZXI7Ci0gIGxvbmcgKmJsb2NrLCBzaXplOwotICBsb25nIHJlc3VsdCA9IDA7Ci0KLSAgLyogV2Ugd2FudCB0byBpdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBzZWdtZW50cy4gIFRoZSBmaXJzdAotICAgICBzdGVwIGlzIHRvIGdldCB0aGUgc3RhY2sgc3RhdHVzIHN0cnVjdHVyZS4gIFdlIGNvdWxkIGRvIHRoaXMKLSAgICAgbW9yZSBxdWlja2x5IGFuZCBtb3JlIGRpcmVjdGx5LCBwZXJoYXBzLCBieSByZWZlcmVuY2luZyB0aGUKLSAgICAgJExNMDAgY29tbW9uIGJsb2NrLCBidXQgSSBrbm93IHRoYXQgdGhpcyB3b3Jrcy4gICovCi0KLSAgU1RLU1RBVCAoJnN0YXR1cyk7Ci0KLSAgLyogU2V0IHVwIHRoZSBpdGVyYXRpb24uICAqLwotCi0gIHRyYWlsZXIgPSAoc3RydWN0IHN0a190cmFpbGVyICopIChzdGF0dXMuY3VycmVudF9hZGRyZXNzCi0JCQkJICAgICsgc3RhdHVzLmN1cnJlbnRfc2l6ZQotCQkJCSAgICAtIDE1KTsKLQotICAvKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBzdGFjayBzZWdtZW50LiAgVGhlcmVmb3JlIGl0IGlzCi0gICAgIGEgZmF0YWwgZXJyb3IgaWYgInRyYWlsZXIiIGlzIG51bGwuICAqLwotCi0gIGlmICh0cmFpbGVyID09IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogRGlzY2FyZCBzZWdtZW50cyB0aGF0IGRvIG5vdCBjb250YWluIG91ciBhcmd1bWVudCBhZGRyZXNzLiAgKi8KLQotICB3aGlsZSAodHJhaWxlciAhPSAwKQotICAgIHsKLSAgICAgIGJsb2NrID0gKGxvbmcgKikgdHJhaWxlci0+dGhpc19hZGRyZXNzOwotICAgICAgc2l6ZSA9IHRyYWlsZXItPnRoaXNfc2l6ZTsKLSAgICAgIGlmIChibG9jayA9PSAwIHx8IHNpemUgPT0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIHRyYWlsZXIgPSAoc3RydWN0IHN0a190cmFpbGVyICopIHRyYWlsZXItPmxpbms7Ci0gICAgICBpZiAoKGJsb2NrIDw9IGFkZHJlc3MpICYmIChhZGRyZXNzIDwgKGJsb2NrICsgc2l6ZSkpKQotCWJyZWFrOwotICAgIH0KLQotICAvKiBTZXQgdGhlIHJlc3VsdCB0byB0aGUgb2Zmc2V0IGluIHRoaXMgc2VnbWVudCBhbmQgYWRkIHRoZSBzaXplcwotICAgICBvZiBhbGwgcHJlZGVjZXNzb3Igc2VnbWVudHMuICAqLwotCi0gIHJlc3VsdCA9IGFkZHJlc3MgLSBibG9jazsKLQotICBpZiAodHJhaWxlciA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gIGRvCi0gICAgewotICAgICAgaWYgKHRyYWlsZXItPnRoaXNfc2l6ZSA8PSAwKQotCWFib3J0ICgpOwotICAgICAgcmVzdWx0ICs9IHRyYWlsZXItPnRoaXNfc2l6ZTsKLSAgICAgIHRyYWlsZXIgPSAoc3RydWN0IHN0a190cmFpbGVyICopIHRyYWlsZXItPmxpbms7Ci0gICAgfQotICB3aGlsZSAodHJhaWxlciAhPSAwKTsKLQotICAvKiBXZSBhcmUgZG9uZS4gIE5vdGUgdGhhdCBpZiB5b3UgcHJlc2VudCBhIGJvZ3VzIGFkZHJlc3MgKG9uZQotICAgICBub3QgaW4gYW55IHNlZ21lbnQpLCB5b3Ugd2lsbCBnZXQgYSBkaWZmZXJlbnQgbnVtYmVyIGJhY2ssIGZvcm1lZAotICAgICBmcm9tIHN1YnRyYWN0aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBibG9jay4gIFRoaXMgaXMgcHJvYmFibHkKLSAgICAgbm90IHdoYXQgeW91IHdhbnQuICAqLwotCi0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotI2Vsc2UgLyogbm90IENSQVkyICovCi0vKiBTdGFjayBhZGRyZXNzIGZ1bmN0aW9uIGZvciBhIENSQVktMSwgQ1JBWSBYLU1QLCBvciBDUkFZIFktTVAuCi0gICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0aGUgY2VsbCB3aXRoaW4gdGhlIHN0YWNrLAotICAgZ2l2ZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNlbGwuICBUaGUgcHVycG9zZSBvZiB0aGlzCi0gICByb3V0aW5lIGlzIHRvIGxpbmVhcml6ZSwgaW4gc29tZSBzZW5zZSwgc3RhY2sgYWRkcmVzc2VzCi0gICBmb3IgYWxsb2NhLiAgKi8KLQotc3RhdGljIGxvbmcKLWkwMGFmdW5jIChsb25nIGFkZHJlc3MpCi17Ci0gIGxvbmcgc3RrbCA9IDA7Ci0KLSAgbG9uZyBzaXplLCBwc2VnLCB0aGlzX3NlZ21lbnQsIHN0YWNrOwotICBsb25nIHJlc3VsdCA9IDA7Ci0KLSAgc3RydWN0IHN0YWNrX3NlZ21lbnRfbGlua2FnZSAqc3NwdHI7Ci0KLSAgLyogUmVnaXN0ZXIgQjY3IGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlCi0gICAgIGN1cnJlbnQgc3RhY2sgc2VnbWVudC4gIElmIHlvdSAoYXMgYSBzdWJwcm9ncmFtKSBzdG9yZQotICAgICB5b3VyIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2sgYW5kIGZpbmQgdGhhdCB5b3UgYXJlIHBhc3QKLSAgICAgdGhlIGNvbnRlbnRzIG9mIEI2NywgeW91IGhhdmUgb3ZlcmZsb3dlZCB0aGUgc2VnbWVudC4KLQotICAgICBCNjcgYWxzbyBwb2ludHMgdG8gdGhlIHN0YWNrIHNlZ21lbnQgbGlua2FnZSBjb250cm9sCi0gICAgIGFyZWEsIHdoaWNoIGlzIHdoYXQgd2UgYXJlIHJlYWxseSBpbnRlcmVzdGVkIGluLiAgKi8KLQotICBzdGtsID0gQ1JBWV9TVEFDS1NFR19FTkQgKCk7Ci0gIHNzcHRyID0gKHN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UgKikgc3RrbDsKLQotICAvKiBJZiBvbmUgc3VidHJhY3RzICdzaXplJyBmcm9tIHRoZSBlbmQgb2YgdGhlIHNlZ21lbnQsCi0gICAgIG9uZSBoYXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNlZ21lbnQuCi0KLSAgICAgSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IHNlZ21lbnQsICdwc2VnJyB3aWxsIGJlCi0gICAgIG5vbnplcm8uICAqLwotCi0gIHBzZWcgPSBzc3B0ci0+c3Nwc2VnOwotICBzaXplID0gc3NwdHItPnNzc2l6ZTsKLQotICB0aGlzX3NlZ21lbnQgPSBzdGtsIC0gc2l6ZTsKLQotICAvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGNhbGxpbmcgdGhpcyByb3V0aW5lIGl0c2VsZiBjYXVzZWQKLSAgICAgYSBzdGFjayBvdmVyZmxvdy4gIERpc2NhcmQgc3RhY2sgc2VnbWVudHMgd2hpY2ggZG8gbm90Ci0gICAgIGNvbnRhaW4gdGhlIHRhcmdldCBhZGRyZXNzLiAgKi8KLQotICB3aGlsZSAoISh0aGlzX3NlZ21lbnQgPD0gYWRkcmVzcyAmJiBhZGRyZXNzIDw9IHN0a2wpKQotICAgIHsKLSNpZmRlZiBERUJVR19JMDBBRlVOQwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJTAxMW8gJTAxMW8gJTAxMW9cbiIsIHRoaXNfc2VnbWVudCwgYWRkcmVzcywgc3RrbCk7Ci0jZW5kaWYKLSAgICAgIGlmIChwc2VnID09IDApCi0JYnJlYWs7Ci0gICAgICBzdGtsID0gc3RrbCAtIHBzZWc7Ci0gICAgICBzc3B0ciA9IChzdHJ1Y3Qgc3RhY2tfc2VnbWVudF9saW5rYWdlICopIHN0a2w7Ci0gICAgICBzaXplID0gc3NwdHItPnNzc2l6ZTsKLSAgICAgIHBzZWcgPSBzc3B0ci0+c3Nwc2VnOwotICAgICAgdGhpc19zZWdtZW50ID0gc3RrbCAtIHNpemU7Ci0gICAgfQotCi0gIHJlc3VsdCA9IGFkZHJlc3MgLSB0aGlzX3NlZ21lbnQ7Ci0KLSAgLyogSWYgeW91IHN1YnRyYWN0IHBzZWcgZnJvbSB0aGUgY3VycmVudCBlbmQgb2YgdGhlIHN0YWNrLAotICAgICB5b3UgZ2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBwcmV2aW91cyBzdGFjayBzZWdtZW50J3MgZW5kLgotICAgICBUaGlzIHNlZW1zIGEgbGl0dGxlIGNvbnZvbHV0ZWQgdG8gbWUsIGJ1dCBJJ2xsIGJldCB5b3Ugc2F2ZQotICAgICBhIGN5Y2xlIHNvbWV3aGVyZS4gICovCi0KLSAgd2hpbGUgKHBzZWcgIT0gMCkKLSAgICB7Ci0jaWZkZWYgREVCVUdfSTAwQUZVTkMKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiUwMTFvICUwMTFvXG4iLCBwc2VnLCBzaXplKTsKLSNlbmRpZgotICAgICAgc3RrbCA9IHN0a2wgLSBwc2VnOwotICAgICAgc3NwdHIgPSAoc3RydWN0IHN0YWNrX3NlZ21lbnRfbGlua2FnZSAqKSBzdGtsOwotICAgICAgc2l6ZSA9IHNzcHRyLT5zc3NpemU7Ci0gICAgICBwc2VnID0gc3NwdHItPnNzcHNlZzsKLSAgICAgIHJlc3VsdCArPSBzaXplOwotICAgIH0KLSAgcmV0dXJuIChyZXN1bHQpOwotfQotCi0jZW5kaWYgLyogbm90IENSQVkyICovCi0jZW5kaWYgLyogQ1JBWSAqLwotCi0jZW5kaWYgLyogbm8gYWxsb2NhICovCi0jZW5kaWYgLyogbm90IEdDQyB2ZXJzaW9uIDIgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hcmd2LmMgYi9saWJpYmVydHkvYXJndi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTk2ZmZkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hcmd2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyogQ3JlYXRlIGFuZCBkZXN0cm95IGFyZ3VtZW50IHZlY3RvcnMgKGFyZ3YncykKLSAgIENvcHlyaWdodCAoQykgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogIENyZWF0ZSBhbmQgZGVzdHJveSBhcmd1bWVudCB2ZWN0b3JzLiAgQW4gYXJndW1lbnQgdmVjdG9yIGlzIHNpbXBseSBhbgotICAgIGFycmF5IG9mIHN0cmluZyBwb2ludGVycywgdGVybWluYXRlZCBieSBhIE5VTEwgcG9pbnRlci4gKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpZmRlZiBpc3NwYWNlCi0jdW5kZWYgaXNzcGFjZQotI2VuZGlmCi0jZGVmaW5lIGlzc3BhY2UoY2gpICgoY2gpID09ICcgJyB8fCAoY2gpID09ICdcdCcpCi0KLS8qICBSb3V0aW5lcyBpbXBvcnRlZCBmcm9tIHN0YW5kYXJkIEMgcnVudGltZSBsaWJyYXJpZXMuICovCi0KLSNpZmRlZiBfX1NURENfXwotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNlbHNlCS8qICFfX1NURENfXyAqLwotCi0jaWYgIWRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19HTlVDX18KLWV4dGVybiBjaGFyICptZW1jcHkgKCk7CQkvKiBDb3B5IG1lbW9yeSByZWdpb24gKi8KLWV4dGVybiBpbnQgc3RybGVuICgpOwkJLyogQ291bnQgbGVuZ3RoIG9mIHN0cmluZyAqLwotZXh0ZXJuIGNoYXIgKm1hbGxvYyAoKTsJCS8qIFN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0ZXIgKi8KLWV4dGVybiBjaGFyICpyZWFsbG9jICgpOwkvKiBTdGFuZGFyZCBtZW1vcnkgcmVhbGxvY2F0b3IgKi8KLWV4dGVybiB2b2lkIGZyZWUgKCk7CQkvKiBGcmVlIG1hbGxvYydkIG1lbW9yeSAqLwotZXh0ZXJuIGNoYXIgKnN0cmR1cCAoKTsJCS8qIER1cGxpY2F0ZSBhIHN0cmluZyAqLwotI2VuZGlmCi0KLSNlbmRpZgkvKiBfX1NURENfXyAqLwotCi0jaW5jbHVkZSAiYWxsb2NhLWNvbmYuaCIKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgMAotI2VuZGlmCi0KLSNpZm5kZWYgRU9TCi0jZGVmaW5lIEVPUyAnXDAnCi0jZW5kaWYKLQotI2RlZmluZSBJTklUSUFMX01BWEFSR0MgOAkvKiBOdW1iZXIgb2YgYXJncyArIE5VTEwgaW4gaW5pdGlhbCBhcmd2ICovCi0KLQotLyoKLQotTkFNRQotCi0JZHVwYXJndiAtLSBkdXBsaWNhdGUgYW4gYXJndW1lbnQgdmVjdG9yCi0KLVNZTk9QU0lTCi0KLQljaGFyICoqZHVwYXJndiAodmVjdG9yKQotCWNoYXIgKip2ZWN0b3I7Ci0KLURFU0NSSVBUSU9OCi0KLQlEdXBsaWNhdGUgYW4gYXJndW1lbnQgdmVjdG9yLiAgU2ltcGx5IHNjYW5zIHRocm91Z2ggdGhlCi0JdmVjdG9yLCBkdXBsaWNhdGluZyBlYWNoIGFyZ3VtZW50IHVudGlsIHRoZQotCXRlcm1pbmF0aW5nIE5VTEwgaXMgZm91bmQuCi0KLVJFVFVSTlMKLQotCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudCB2ZWN0b3IgaWYKLQlzdWNjZXNzZnVsLiBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0bwotCWNvbXBsZXRlIGJ1aWxkaW5nIHRoZSBhcmd1bWVudCB2ZWN0b3IuCi0KLSovCi0KLWNoYXIgKioKLWR1cGFyZ3YgKGFyZ3YpCi0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYXJnYzsKLSAgY2hhciAqKmNvcHk7Ci0gIAotICBpZiAoYXJndiA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgLyogdGhlIHZlY3RvciAqLwotICBmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2NdICE9IE5VTEw7IGFyZ2MrKyk7Ci0gIGNvcHkgPSAoY2hhciAqKikgbWFsbG9jICgoYXJnYyArIDEpICogc2l6ZW9mIChjaGFyICopKTsKLSAgaWYgKGNvcHkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIC8qIHRoZSBzdHJpbmdzICovCi0gIGZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnY10gIT0gTlVMTDsgYXJnYysrKQotICAgIHsKLSAgICAgIGludCBsZW4gPSBzdHJsZW4gKGFyZ3ZbYXJnY10pOwotICAgICAgY29weVthcmdjXSA9IG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogKGxlbiArIDEpKTsKLSAgICAgIGlmIChjb3B5W2FyZ2NdID09IE5VTEwpCi0JewotCSAgZnJlZWFyZ3YgKGNvcHkpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgc3RyY3B5IChjb3B5W2FyZ2NdLCBhcmd2W2FyZ2NdKTsKLSAgICB9Ci0gIGNvcHlbYXJnY10gPSBOVUxMOwotICByZXR1cm4gY29weTsKLX0KLQotLyoKLQotTkFNRQotCi0JZnJlZWFyZ3YgLS0gZnJlZSBhbiBhcmd1bWVudCB2ZWN0b3IKLQotU1lOT1BTSVMKLQotCXZvaWQgZnJlZWFyZ3YgKHZlY3RvcikKLQljaGFyICoqdmVjdG9yOwotCi1ERVNDUklQVElPTgotCi0JRnJlZSBhbiBhcmd1bWVudCB2ZWN0b3IgdGhhdCB3YXMgYnVpbHQgdXNpbmcgYnVpbGRhcmd2LiAgU2ltcGx5IHNjYW5zCi0JdGhyb3VnaCB0aGUgdmVjdG9yLCBmcmVlaW5nIHRoZSBtZW1vcnkgZm9yIGVhY2ggYXJndW1lbnQgdW50aWwgdGhlCi0JdGVybWluYXRpbmcgTlVMTCBpcyBmb3VuZCwgYW5kIHRoZW4gZnJlZXMgdGhlIHZlY3RvciBpdHNlbGYuCi0KLVJFVFVSTlMKLQotCU5vIHZhbHVlLgotCi0qLwotCi12b2lkIGZyZWVhcmd2ICh2ZWN0b3IpCi1jaGFyICoqdmVjdG9yOwotewotICByZWdpc3RlciBjaGFyICoqc2NhbjsKLQotICBpZiAodmVjdG9yICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChzY2FuID0gdmVjdG9yOyAqc2NhbiAhPSBOVUxMOyBzY2FuKyspCi0JewotCSAgZnJlZSAoKnNjYW4pOwotCX0KLSAgICAgIGZyZWUgKHZlY3Rvcik7Ci0gICAgfQotfQotCi0vKgotCi1OQU1FCi0KLQlidWlsZGFyZ3YgLS0gYnVpbGQgYW4gYXJndW1lbnQgdmVjdG9yIGZyb20gYSBzdHJpbmcKLQotU1lOT1BTSVMKLQotCWNoYXIgKipidWlsZGFyZ3YgKHNwKQotCWNoYXIgKnNwOwotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gYSBwb2ludGVyIHRvIGEgc3RyaW5nLCBwYXJzZSB0aGUgc3RyaW5nIGV4dHJhY3RpbmcgZmllbGRzCi0Jc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgYW5kIG9wdGlvbmFsbHkgZW5jbG9zZWQgd2l0aGluIGVpdGhlciBzaW5nbGUKLQlvciBkb3VibGUgcXVvdGVzICh3aGljaCBhcmUgc3RyaXBwZWQgb2ZmKSwgYW5kIGJ1aWxkIGEgdmVjdG9yIG9mCi0JcG9pbnRlcnMgdG8gY29waWVzIG9mIHRoZSBzdHJpbmcgZm9yIGVhY2ggZmllbGQuICBUaGUgaW5wdXQgc3RyaW5nCi0JcmVtYWlucyB1bmNoYW5nZWQuCi0KLQlBbGwgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHBvaW50ZXIgYXJyYXkgYW5kIGNvcGllcyBvZiB0aGUgc3RyaW5nCi0JaXMgb2J0YWluZWQgZnJvbSBtYWxsb2MuICBBbGwgb2YgdGhlIG1lbW9yeSBjYW4gYmUgcmV0dXJuZWQgdG8gdGhlCi0Jc3lzdGVtIHdpdGggdGhlIHNpbmdsZSBmdW5jdGlvbiBjYWxsIGZyZWVhcmd2LCB3aGljaCB0YWtlcyB0aGUKLQlyZXR1cm5lZCByZXN1bHQgb2YgYnVpbGRhcmd2LCBhcyBpdCdzIGFyZ3VtZW50LgotCi0JVGhlIG1lbW9yeSBmb3IgdGhlIGFyZ3YgYXJyYXkgaXMgZHluYW1pY2FsbHkgZXhwYW5kZWQgYXMgbmVjZXNzYXJ5LgotCi1SRVRVUk5TCi0KLQlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYXJndW1lbnQgdmVjdG9yIGlmIHN1Y2Nlc3NmdWwuIFJldHVybnMgTlVMTAotCWlmIHRoZSBpbnB1dCBzdHJpbmcgcG9pbnRlciBpcyBOVUxMIG9yIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudAotCW1lbW9yeSB0byBjb21wbGV0ZSBidWlsZGluZyB0aGUgYXJndW1lbnQgdmVjdG9yLgotCi1OT1RFUwotCi0JSW4gb3JkZXIgdG8gcHJvdmlkZSBhIHdvcmtpbmcgYnVmZmVyIGZvciBleHRyYWN0aW5nIGFyZ3VtZW50cyBpbnRvLAotCXdpdGggYXBwcm9wcmlhdGUgc3RyaXBwaW5nIG9mIHF1b3RlcyBhbmQgdHJhbnNsYXRpb24gb2YgYmFja3NsYXNoCi0Jc2VxdWVuY2VzLCB3ZSBhbGxvY2F0ZSBhIHdvcmtpbmcgYnVmZmVyIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIGlucHV0Ci0Jc3RyaW5nLiAgVGhpcyBlbnN1cmVzIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIHNwYWNlIGluIHdoaWNoIHRvCi0Jd29yaywgc2luY2UgdGhlIGV4dHJhY3RlZCBhcmcgaXMgbmV2ZXIgbGFyZ2VyIHRoYW4gdGhlIGlucHV0IHN0cmluZy4KLQotCUlmIHRoZSBpbnB1dCBpcyBhIG51bGwgc3RyaW5nIChhcyBvcHBvc2VkIHRvIGEgTlVMTCBwb2ludGVyKSwgdGhlbgotCWJ1aWxkYXJnIHJldHVybnMgYW4gYXJndiB0aGF0IGhhcyBvbmUgYXJnLCBhIG51bGwgc3RyaW5nLgotCi0JQXJndiBpcyBhbHdheXMga2VwdCB0ZXJtaW5hdGVkIHdpdGggYSBOVUxMIGFyZyBwb2ludGVyLCBzbyBpdCBjYW4KLQliZSBwYXNzZWQgdG8gZnJlZWFyZ3YgYXQgYW55IHRpbWUsIG9yIHJldHVybmVkLCBhcyBhcHByb3ByaWF0ZS4KLSovCi0KLWNoYXIgKipidWlsZGFyZ3YgKGlucHV0KQotY2hhciAqaW5wdXQ7Ci17Ci0gIGNoYXIgKmFyZzsKLSAgY2hhciAqY29weWJ1ZjsKLSAgaW50IHNxdW90ZSA9IDA7Ci0gIGludCBkcXVvdGUgPSAwOwotICBpbnQgYnNxdW90ZSA9IDA7Ci0gIGludCBhcmdjID0gMDsKLSAgaW50IG1heGFyZ2MgPSAwOwotICBjaGFyICoqYXJndiA9IE5VTEw7Ci0gIGNoYXIgKipuYXJndjsKLQotICBpZiAoaW5wdXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb3B5YnVmID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGlucHV0KSArIDEpOwotICAgICAgLyogSXMgYSBkb3t9d2hpbGUgdG8gYWx3YXlzIGV4ZWN1dGUgdGhlIGxvb3Agb25jZS4gIEFsd2F5cyByZXR1cm4gYW4KLQkgYXJndiwgZXZlbiBmb3IgbnVsbCBzdHJpbmdzLiAgU2VlIE5PVEVTIGFib3ZlLCB0ZXN0IGNhc2UgYmVsb3cuICovCi0gICAgICBkbwotCXsKLQkgIC8qIFBpY2sgb2ZmIGFyZ3ZbYXJnY10gKi8KLQkgIHdoaWxlIChpc3NwYWNlICgqaW5wdXQpKQotCSAgICB7Ci0JICAgICAgaW5wdXQrKzsKLQkgICAgfQotCSAgaWYgKChtYXhhcmdjID09IDApIHx8IChhcmdjID49IChtYXhhcmdjIC0gMSkpKQotCSAgICB7Ci0JICAgICAgLyogYXJndiBuZWVkcyBpbml0aWFsaXphdGlvbiwgb3IgZXhwYW5zaW9uICovCi0JICAgICAgaWYgKGFyZ3YgPT0gTlVMTCkKLQkJewotCQkgIG1heGFyZ2MgPSBJTklUSUFMX01BWEFSR0M7Ci0JCSAgbmFyZ3YgPSAoY2hhciAqKikgbWFsbG9jIChtYXhhcmdjICogc2l6ZW9mIChjaGFyICopKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG1heGFyZ2MgKj0gMjsKLQkJICBuYXJndiA9IChjaGFyICoqKSByZWFsbG9jIChhcmd2LCBtYXhhcmdjICogc2l6ZW9mIChjaGFyICopKTsKLQkJfQotCSAgICAgIGlmIChuYXJndiA9PSBOVUxMKQotCQl7Ci0JCSAgaWYgKGFyZ3YgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZnJlZWFyZ3YgKGFyZ3YpOwotCQkgICAgICBhcmd2ID0gTlVMTDsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGFyZ3YgPSBuYXJndjsKLQkgICAgICBhcmd2W2FyZ2NdID0gTlVMTDsKLQkgICAgfQotCSAgLyogQmVnaW4gc2Nhbm5pbmcgYXJnICovCi0JICBhcmcgPSBjb3B5YnVmOwotCSAgd2hpbGUgKCppbnB1dCAhPSBFT1MpCi0JICAgIHsKLQkgICAgICBpZiAoaXNzcGFjZSAoKmlucHV0KSAmJiAhc3F1b3RlICYmICFkcXVvdGUgJiYgIWJzcXVvdGUpCi0JCXsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChic3F1b3RlKQotCQkgICAgewotCQkgICAgICBic3F1b3RlID0gMDsKLQkJICAgICAgKmFyZysrID0gKmlucHV0OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCppbnB1dCA9PSAnXFwnKQotCQkgICAgewotCQkgICAgICBic3F1b3RlID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzcXVvdGUpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgqaW5wdXQgPT0gJ1wnJykKLQkJCXsKLQkJCSAgc3F1b3RlID0gMDsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAqYXJnKysgPSAqaW5wdXQ7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoZHF1b3RlKQotCQkgICAgewotCQkgICAgICBpZiAoKmlucHV0ID09ICciJykKLQkJCXsKLQkJCSAgZHF1b3RlID0gMDsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAqYXJnKysgPSAqaW5wdXQ7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoKmlucHV0ID09ICdcJycpCi0JCQl7Ci0JCQkgIHNxdW90ZSA9IDE7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKCppbnB1dCA9PSAnIicpCi0JCQl7Ci0JCQkgIGRxdW90ZSA9IDE7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgKmFyZysrID0gKmlucHV0OwotCQkJfQotCQkgICAgfQotCQkgIGlucHV0Kys7Ci0JCX0KLQkgICAgfQotCSAgKmFyZyA9IEVPUzsKLQkgIGFyZ3ZbYXJnY10gPSBzdHJkdXAgKGNvcHlidWYpOwotCSAgaWYgKGFyZ3ZbYXJnY10gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWVhcmd2IChhcmd2KTsKLQkgICAgICBhcmd2ID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYXJnYysrOwotCSAgYXJndlthcmdjXSA9IE5VTEw7Ci0KLQkgIHdoaWxlIChpc3NwYWNlICgqaW5wdXQpKQotCSAgICB7Ci0JICAgICAgaW5wdXQrKzsKLQkgICAgfQotCX0KLSAgICAgIHdoaWxlICgqaW5wdXQgIT0gRU9TKTsKLSAgICB9Ci0gIHJldHVybiAoYXJndik7Ci19Ci0KLSNpZmRlZiBNQUlOCi0KLS8qIFNpbXBsZSBsaXR0bGUgdGVzdCBkcml2ZXIuICovCi0KLXN0YXRpYyBjaGFyICp0ZXN0c1tdID0KLXsKLSAgImEgc2ltcGxlIGNvbW1hbmQgbGluZSIsCi0gICJhcmcgJ2ZvbycgaXMgc2luZ2xlIHF1b3RlZCIsCi0gICJhcmcgXCJiYXJcIiBpcyBkb3VibGUgcXVvdGVkIiwKLSAgImFyZyBcImZvbyBiYXJcIiBoYXMgZW1iZWRkZWQgd2hpdGVzcGFjZSIsCi0gICJhcmcgJ0phY2sgc2FpZCBcXCdoaVxcJycgaGFzIHNpbmdsZSBxdW90ZXMiLAotICAiYXJnICdKYWNrIHNhaWQgXFxcImhpXFxcIicgaGFzIGRvdWJsZSBxdW90ZXMiLAotICAiYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgbSBuIG8gcCBxIHIgcyB0IHUgdiB3IHggeSB6IDEgMiAzIDQgNSA2IDcgOCA5IiwKLSAgCi0gIC8qIFRoaXMgc2hvdWxkIGJlIGV4cGFuZGVkIGludG8gb25seSBvbmUgYXJndW1lbnQuICAqLwotICAidHJhaWxpbmctd2hpdGVzcGFjZSAiLAotCi0gICIiLAotICBOVUxMCi19OwotCi1tYWluICgpCi17Ci0gIGNoYXIgKiphcmd2OwotICBjaGFyICoqdGVzdDsKLSAgY2hhciAqKnRhcmdzOwotCi0gIGZvciAodGVzdCA9IHRlc3RzOyAqdGVzdCAhPSBOVUxMOyB0ZXN0KyspCi0gICAgewotICAgICAgcHJpbnRmICgiYnVpbGRhcmd2KFwiJXNcIilcbiIsICp0ZXN0KTsKLSAgICAgIGlmICgoYXJndiA9IGJ1aWxkYXJndiAoKnRlc3QpKSA9PSBOVUxMKQotCXsKLQkgIHByaW50ZiAoImZhaWxlZCFcblxuIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvciAodGFyZ3MgPSBhcmd2OyAqdGFyZ3MgIT0gTlVMTDsgdGFyZ3MrKykKLQkgICAgewotCSAgICAgIHByaW50ZiAoIlx0XCIlc1wiXG4iLCAqdGFyZ3MpOwotCSAgICB9Ci0JICBwcmludGYgKCJcbiIpOwotCX0KLSAgICAgIGZyZWVhcmd2IChhcmd2KTsKLSAgICB9Ci0KLX0KLQotI2VuZGlmCS8qIE1BSU4gKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hc3ByaW50Zi5jIGIvbGliaWJlcnR5L2FzcHJpbnRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYWYzMjAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2FzcHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKiBMaWtlIHNwcmludGYgYnV0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBtYWxsb2MnZCBzdG9yYWdlLCB3aGljaCBtdXN0Ci0gICBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWYgZGVmaW5lZCAoQU5TSV9QUk9UT1RZUEVTKSB8fCBkZWZpbmVkIChBTE1PU1RfU1REQykKLSNkZWZpbmUgVVNFX1NUREFSRwotI2VuZGlmCi0KLSNpZmRlZiBVU0VfU1REQVJHCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0vKiBWQVJBUkdTICovCi0jaWZkZWYgVVNFX1NUREFSRwotaW50Ci1hc3ByaW50ZiAoY2hhciAqKmJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0jZWxzZQotaW50Ci1hc3ByaW50ZiAoYnVmLCBmbXQsIHZhX2FsaXN0KQotICAgICBjaGFyICoqYnVmOwotICAgICBjb25zdCBjaGFyICpmbXQ7Ci0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIGludCBzdGF0dXM7Ci0gIHZhX2xpc3QgYXA7Ci0jaWZkZWYgVVNFX1NUREFSRwotICB2YV9zdGFydCAoYXAsIGZtdCk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXApOwotI2VuZGlmCi0gIHN0YXR1cyA9IHZhc3ByaW50ZiAoYnVmLCBmbXQsIGFwKTsKLSAgdmFfZW5kIChhcCk7Ci0gIHJldHVybiBzdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvYXRleGl0LmMgYi9saWJpYmVydHkvYXRleGl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzN2Q5ODUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2F0ZXhpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogV3JhcHBlciB0byBpbXBsZW1lbnQgQU5TSSBDJ3MgYXRleGl0IHVzaW5nIFN1bk9TJ3Mgb25fZXhpdC4gKi8KLS8qIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAtLU1pa2UgU3R1bXAuICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmZGVmIEhBVkVfT05fRVhJVAotCi1pbnQKLWF0ZXhpdChmKQotICAgICB2b2lkICgqZikoKTsKLXsKLSAgLyogSWYgdGhlIHN5c3RlbSBkb2Vzbid0IHByb3ZpZGUgYSBkZWZpbml0aW9uIGZvciBhdGV4aXQsIHVzZSBvbl9leGl0Ci0gICAgIGlmIHRoZSBzeXN0ZW0gcHJvdmlkZXMgdGhhdC4gICovCi0gIG9uX2V4aXQgKGYsIDApOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYmFzZW5hbWUuYyBiL2xpYmliZXJ0eS9iYXNlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQ0Yzg1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9iYXNlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogUmV0dXJuIHRoZSBiYXNlbmFtZSBvZiBhIHBhdGhuYW1lLgotICAgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLwotCi0vKgotTkFNRQotCWJhc2VuYW1lIC0tIHJldHVybiBwb2ludGVyIHRvIGxhc3QgY29tcG9uZW50IG9mIGEgcGF0aG5hbWUKLQotU1lOT1BTSVMKLQljaGFyICpiYXNlbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKLQotREVTQ1JJUFRJT04KLQlHaXZlbiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyBhIHR5cGljYWwgcGF0aG5hbWUKLQkoL3Vzci9zcmMvY21kL2xzL2xzLmMgZm9yIGV4YW1wbGUpLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUKLQlsYXN0IGNvbXBvbmVudCBvZiB0aGUgcGF0aG5hbWUgKCJscy5jIiBpbiB0aGlzIGNhc2UpLgotCi1CVUdTCi0JUHJlc3VtZXMgYSBVTklYIHN0eWxlIHBhdGggd2l0aCBVTklYIHN0eWxlIHNlcGFyYXRvcnMuCi0qLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotY2hhciAqCi1iYXNlbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqYmFzZSA9IG5hbWU7Ci0KLSAgd2hpbGUgKCpuYW1lKQotICAgIHsKLSAgICAgIGlmICgqbmFtZSsrID09ICcvJykKLQl7Ci0JICBiYXNlID0gbmFtZTsKLQl9Ci0gICAgfQotICByZXR1cm4gKGNoYXIgKikgYmFzZTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9iY21wLmMgYi9saWJpYmVydHkvYmNtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWU0NDE3Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9iY21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBiY21wCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLQotTkFNRQotCi0JYmNtcCAtLSBjb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucwotCi1TWU5PUFNJUwotCi0JaW50IGJjbXAgKGNoYXIgKmZyb20sIGNoYXIgKnRvLCBpbnQgY291bnQpCi0KLURFU0NSSVBUSU9OCi0KLQlDb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucyBhbmQgcmV0dXJuIHplcm8gaWYgdGhleSBhcmUgaWRlbnRpY2FsLAotCW5vbi16ZXJvIG90aGVyd2lzZS4gIElmIGNvdW50IGlzIHplcm8sIHJldHVybiB6ZXJvLgotCi1OT1RFUwotCi0JTm8gZ3VhcmFudGVlIGlzIG1hZGUgYWJvdXQgdGhlIG5vbi16ZXJvIHJldHVybmVkIHZhbHVlLiAgSW4KLQlwYXJ0aWN1bGFyLCB0aGUgcmVzdWx0cyBtYXkgYmUgc2lnbmZpY2FudGx5IGRpZmZlcmVudCB0aGFuCi0Jc3RyY21wKCksIHdoZXJlIHRoZSByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSBsZXNzIHRoYW4sCi0JZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvLCBhY2NvcmRpbmcgdG8gbGV4aWNvZ3JhcGhpY2FsCi0Jc29ydGluZyBvZiB0aGUgY29tcGFyZWQgcmVnaW9ucy4KLQotQlVHUwotCi0qLwotCi0KLWludAotYmNtcCAoZnJvbSwgdG8sIGNvdW50KQotICBjaGFyICpmcm9tLCAqdG87Ci0gIGludCBjb3VudDsKLXsKLSAgaW50IHJ0bnZhbCA9IDA7Ci0KLSAgd2hpbGUgKGNvdW50LS0gPiAwKQotICAgIHsKLSAgICAgIGlmICgqZnJvbSsrICE9ICp0bysrKQotCXsKLQkgIHJ0bnZhbCA9IDE7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gKHJ0bnZhbCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9iY29weS5jIGIvbGliaWJlcnR5L2Jjb3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTUzNjMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2Jjb3B5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBiY29weSAtLSBjb3B5IG1lbW9yeSByZWdpb25zIG9mIGFyYml0YXJ5IGxlbmd0aAotCi1OQU1FCi0JYmNvcHkgLS0gY29weSBtZW1vcnkgcmVnaW9ucyBvZiBhcmJpdHJhcnkgbGVuZ3RoCi0KLVNZTk9QU0lTCi0Jdm9pZCBiY29weSAoY2hhciAqaW4sIGNoYXIgKm91dCwgaW50IGxlbmd0aCkKLQotREVTQ1JJUFRJT04KLQlDb3B5IExFTkdUSCBieXRlcyBmcm9tIG1lbW9yeSByZWdpb24gcG9pbnRlZCB0byBieSBJTiB0byBtZW1vcnkKLQlyZWdpb24gcG9pbnRlZCB0byBieSBPVVQuCi0KLUJVR1MKLQlTaWduaWZpY2FudCBzcGVlZCBpbXByb3ZlbWVudHMgY2FuIGJlIG1hZGUgaW4gc29tZSBjYXNlcyBieQotCWltcGxlbWVudGluZyBjb3BpZXMgb2YgbXVsdGlwbGUgYnl0ZXMgc2ltdWx0YW5lb3VzbHksIG9yIHVucm9sbGluZwotCXRoZSBjb3B5IGxvb3AuCi0KLSovCi0KLXZvaWQKLWJjb3B5IChzcmMsIGRlc3QsIGxlbikKLSAgcmVnaXN0ZXIgY2hhciAqc3JjLCAqZGVzdDsKLSAgaW50IGxlbjsKLXsKLSAgaWYgKGRlc3QgPCBzcmMpCi0gICAgd2hpbGUgKGxlbi0tKQotICAgICAgKmRlc3QrKyA9ICpzcmMrKzsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKmxhc3RzID0gc3JjICsgKGxlbi0xKTsKLSAgICAgIGNoYXIgKmxhc3RkID0gZGVzdCArIChsZW4tMSk7Ci0gICAgICB3aGlsZSAobGVuLS0pCi0gICAgICAgICooY2hhciAqKWxhc3RkLS0gPSAqKGNoYXIgKilsYXN0cy0tOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9iemVyby5jIGIvbGliaWJlcnR5L2J6ZXJvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMTY0NGIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2J6ZXJvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBQb3J0YWJsZSB2ZXJzaW9uIG9mIGJ6ZXJvIGZvciBzeXN0ZW1zIHdpdGhvdXQgaXQuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLU5BTUUKLQliemVybyAtLSB6ZXJvIHRoZSBjb250ZW50cyBvZiBhIHNwZWNpZmllZCBtZW1vcnkgcmVnaW9uCi0KLVNZTk9QU0lTCi0Jdm9pZCBiemVybyAoY2hhciAqdG8sIGludCBjb3VudCkKLQotREVTQ1JJUFRJT04KLQlaZXJvIENPVU5UIGJ5dGVzIG9mIG1lbW9yeSBwb2ludGVkIHRvIGJ5IFRPLgotCi1CVUdTCi0JU2lnbmlmaWNhbnQgc3BlZWQgZW5oYW5jZW1lbnRzIG1heSBiZSBtYWRlIGluIHNvbWUgZW52aXJvbm1lbnRzCi0JYnkgemVyb2luZyBtb3JlIHRoYW4gYSBzaW5nbGUgYnl0ZSBhdCBhIHRpbWUsIG9yIGJ5IHVucm9sbGluZyB0aGUKLQlsb29wLgotCi0qLwotCi0KLXZvaWQKLWJ6ZXJvICh0bywgY291bnQpCi0gIGNoYXIgKnRvOwotICBpbnQgY291bnQ7Ci17Ci0gIHdoaWxlIChjb3VudC0tID4gMCkKLSAgICB7Ci0gICAgICAqdG8rKyA9IDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NhbGxvYy5jIGIvbGliaWJlcnR5L2NhbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGMwYTc4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotIAotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi0vKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoaXMgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1QVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi1QVFIKLWNhbGxvYyAobmVsZW0sIGVsc2l6ZSkKLSAgc2l6ZV90IG5lbGVtLCBlbHNpemU7Ci17Ci0gIHJlZ2lzdGVyIFBUUiBwdHI7ICAKLQotICBpZiAobmVsZW0gPT0gMCB8fCBlbHNpemUgPT0gMCkKLSAgICBuZWxlbSA9IGVsc2l6ZSA9IDE7Ci0gIAotICBwdHIgPSBtYWxsb2MgKG5lbGVtICogZWxzaXplKTsKLSAgaWYgKHB0cikgYnplcm8gKHB0ciwgbmVsZW0gKiBlbHNpemUpOwotICAKLSAgcmV0dXJuIHB0cjsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jaG9vc2UtdGVtcC5jIGIvbGliaWJlcnR5L2Nob29zZS10ZW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYWUzMTguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2Nob29zZS10ZW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyogVXRpbGl0eSB0byBwaWNrIGEgdGVtcG9yYXJ5IGZpbGVuYW1lIHByZWZpeC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi13cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBleHBvcnRzIHR3byBmdW5jdGlvbnM6IGNob29zZV90ZW1wX2Jhc2UgYW5kIG1ha2VfdGVtcF9maWxlLiAgKi8KLQotLyogVGhpcyBmaWxlIGxpdmVzIGluIGF0IGxlYXN0IHR3byBwbGFjZXM6IGxpYmliZXJ0eSBhbmQgZ2NjLgotICAgRG9uJ3QgY2hhbmdlIG9uZSB3aXRob3V0IHRoZSBvdGhlci4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+CS8qIE1heSBnZXQgUF90bXBkaXIuICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX0ZJTEVfSAotI2luY2x1ZGUgPHN5cy9maWxlLmg+ICAgLyogTWF5IGdldCBSX09LLCBldGMuIG9uIHNvbWUgc3lzdGVtcy4gICovCi0jZW5kaWYKLQotI2lmbmRlZiBSX09LCi0jZGVmaW5lIFJfT0sgNAotI2RlZmluZSBXX09LIDIKLSNkZWZpbmUgWF9PSyAxCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotZXh0ZXJuIGludCBta3N0ZW1wcyAoKTsKLQotI2lmbmRlZiBJTl9HQ0MKLSNpZiBkZWZpbmVkIChfX01TRE9TX18pIHx8IGRlZmluZWQgKF9XSU4zMikKLSNkZWZpbmUgRElSX1NFUEFSQVRPUiAnXFwnCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIERJUl9TRVBBUkFUT1IKLSNkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKLSNlbmRpZgotCi0vKiBPbiBNU0RPUywgd3JpdGUgdGVtcCBmaWxlcyBpbiBjdXJyZW50IGRpcgotICAgYmVjYXVzZSB0aGVyZSdzIG5vIHBsYWNlIGVsc2Ugd2UgY2FuIGV4cGVjdCB0byB1c2UuICAqLwotLyogPz8/IEFsdGhvdWdoIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyB0cmllZCBhcyBhIGxhc3QgcmVzb3J0LAotICAgdGhpcyBpcyBsZWZ0IGluIHNvIHRoYXQgb24gTVNET1MgaXQgaXMgcHJlZmVycmVkIHRvIC90bXAgb24gdGhlCi0gICBvZmYgY2hhbmNlIHRoYXQgc29tZW9uZSByZXF1aXJlcyB0aGlzLCBzaW5jZSB0aGF0IHdhcyB0aGUgcHJldmlvdXMKLSAgIGJlaGF2aW91ci4gICovCi0jaWZkZWYgX19NU0RPU19fCi0jaWZuZGVmIFBfdG1wZGlyCi0jZGVmaW5lIFBfdG1wZGlyICIuIgotI2VuZGlmCi0jZW5kaWYKLQotLyogTmFtZSBvZiB0ZW1wb3JhcnkgZmlsZS4KLSAgIG1rdGVtcCByZXF1aXJlcyA2IHRyYWlsaW5nIFgncy4gICovCi0jZGVmaW5lIFRFTVBfRklMRSAiY2NYWFhYWFgiCi0KLS8qIFN1YnJvdXRpbmUgb2YgY2hvb3NlX3RlbXBfYmFzZS4KLSAgIElmIEJBU0UgaXMgbm9uLU5VTEwsIHJldHVybiBpdC4KLSAgIE90aGVyd2lzZSBpdCBjaGVja3MgaWYgRElSIGlzIGEgdXNhYmxlIGRpcmVjdG9yeS4KLSAgIElmIHN1Y2Nlc3MsIERJUiBpcyByZXR1cm5lZC4KLSAgIE90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkLiAgKi8KLQotc3RhdGljIGNoYXIgKgotdHJ5IChkaXIsIGJhc2UpCi0gICAgIGNoYXIgKmRpciwgKmJhc2U7Ci17Ci0gIGlmIChiYXNlICE9IDApCi0gICAgcmV0dXJuIGJhc2U7Ci0gIGlmIChkaXIgIT0gMAotICAgICAgJiYgYWNjZXNzIChkaXIsIFJfT0sgfCBXX09LIHwgWF9PSykgPT0gMCkKLSAgICByZXR1cm4gZGlyOwotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIGEgcHJlZml4IGZvciB0ZW1wb3JhcnkgZmlsZSBuYW1lcyBvciBOVUxMIGlmIHVuYWJsZSB0byBmaW5kIG9uZS4KLSAgIFRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBjaG9zZW4gaWYgYWxsIGVsc2UgZmFpbHMgc28gdGhlIHByb2dyYW0gaXMKLSAgIGV4aXRlZCBpZiBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgY2FuJ3QgYmUgZm91bmQgKG1rdGVtcCBmYWlscykuCi0gICBUaGUgYnVmZmVyIGZvciB0aGUgcmVzdWx0IGlzIG9idGFpbmVkIHdpdGggeG1hbGxvYy4gCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5IG9ubHkuICBJdCB1c2UKLSAgIGlzIG5vdCByZWNvbW1lbmRlZC4gICovCi0KLWNoYXIgKgotY2hvb3NlX3RlbXBfYmFzZSAoKQotewotICBjaGFyICpiYXNlID0gMDsKLSAgY2hhciAqdGVtcF9maWxlbmFtZTsKLSAgaW50IGxlbjsKLSAgc3RhdGljIGNoYXIgdG1wW10gPSB7IERJUl9TRVBBUkFUT1IsICd0JywgJ20nLCAncCcsIDAgfTsKLSAgc3RhdGljIGNoYXIgdXNydG1wW10gPSB7IERJUl9TRVBBUkFUT1IsICd1JywgJ3MnLCAncicsIERJUl9TRVBBUkFUT1IsICd0JywgJ20nLCAncCcsIDAgfTsKLQotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJUTVBESVIiKSwgYmFzZSk7Ci0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRNUCIpLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVEVNUCIpLCBiYXNlKTsKLQotI2lmZGVmIFBfdG1wZGlyCi0gIGJhc2UgPSB0cnkgKFBfdG1wZGlyLCBiYXNlKTsKLSNlbmRpZgotCi0gIC8qIFRyeSAvdXNyL3RtcCwgdGhlbiAvdG1wLiAgKi8KLSAgYmFzZSA9IHRyeSAodXNydG1wLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAodG1wLCBiYXNlKTsKLSAKLSAgLyogSWYgYWxsIGVsc2UgZmFpbHMsIHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkhICAqLwotICBpZiAoYmFzZSA9PSAwKQotICAgIGJhc2UgPSAiLiI7Ci0KLSAgbGVuID0gc3RybGVuIChiYXNlKTsKLSAgdGVtcF9maWxlbmFtZSA9IHhtYWxsb2MgKGxlbiArIDEgLypESVJfU0VQQVJBVE9SKi8KLQkJCSAgICsgc3RybGVuIChURU1QX0ZJTEUpICsgMSk7Ci0gIHN0cmNweSAodGVtcF9maWxlbmFtZSwgYmFzZSk7Ci0KLSAgaWYgKGxlbiAhPSAwCi0gICAgICAmJiB0ZW1wX2ZpbGVuYW1lW2xlbi0xXSAhPSAnLycKLSAgICAgICYmIHRlbXBfZmlsZW5hbWVbbGVuLTFdICE9IERJUl9TRVBBUkFUT1IpCi0gICAgdGVtcF9maWxlbmFtZVtsZW4rK10gPSBESVJfU0VQQVJBVE9SOwotICBzdHJjcHkgKHRlbXBfZmlsZW5hbWUgKyBsZW4sIFRFTVBfRklMRSk7Ci0KLSAgbWt0ZW1wICh0ZW1wX2ZpbGVuYW1lKTsKLSAgaWYgKHN0cmxlbiAodGVtcF9maWxlbmFtZSkgPT0gMCkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHRlbXBfZmlsZW5hbWU7Ci19Ci0vKiBSZXR1cm4gYSB0ZW1wb3JhcnkgZmlsZSBuYW1lIChhcyBhIHN0cmluZykgb3IgTlVMTCBpZiB1bmFibGUgdG8gY3JlYXRlCi0gICBvbmUuICAqLwotCi1jaGFyICoKLW1ha2VfdGVtcF9maWxlIChzdWZmaXgpCi0gICAgIGNoYXIgKnN1ZmZpeDsKLXsKLSAgY2hhciAqYmFzZSA9IDA7Ci0gIGNoYXIgKnRlbXBfZmlsZW5hbWU7Ci0gIGludCBiYXNlX2xlbiwgc3VmZml4X2xlbjsKLSAgaW50IGZkOwotICBzdGF0aWMgY2hhciB0bXBbXSA9IHsgRElSX1NFUEFSQVRPUiwgJ3QnLCAnbScsICdwJywgMCB9OwotICBzdGF0aWMgY2hhciB1c3J0bXBbXSA9IHsgRElSX1NFUEFSQVRPUiwgJ3UnLCAncycsICdyJywgRElSX1NFUEFSQVRPUiwgJ3QnLCAnbScsICdwJywgMCB9OwotCi0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRNUERJUiIpLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVE1QIiksIGJhc2UpOwotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJURU1QIiksIGJhc2UpOwotCi0jaWZkZWYgUF90bXBkaXIKLSAgYmFzZSA9IHRyeSAoUF90bXBkaXIsIGJhc2UpOwotI2VuZGlmCi0KLSAgLyogVHJ5IC91c3IvdG1wLCB0aGVuIC90bXAuICAqLwotICBiYXNlID0gdHJ5ICh1c3J0bXAsIGJhc2UpOwotICBiYXNlID0gdHJ5ICh0bXAsIGJhc2UpOwotIAotICAvKiBJZiBhbGwgZWxzZSBmYWlscywgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSEgICovCi0gIGlmIChiYXNlID09IDApCi0gICAgYmFzZSA9ICIuIjsKLQotICBiYXNlX2xlbiA9IHN0cmxlbiAoYmFzZSk7Ci0KLSAgaWYgKHN1ZmZpeCkKLSAgICBzdWZmaXhfbGVuID0gc3RybGVuIChzdWZmaXgpOwotICBlbHNlCi0gICAgc3VmZml4X2xlbiA9IDA7Ci0KLSAgdGVtcF9maWxlbmFtZSA9IHhtYWxsb2MgKGJhc2VfbGVuICsgMSAvKkRJUl9TRVBBUkFUT1IqLwotCQkJICAgKyBzdHJsZW4gKFRFTVBfRklMRSkKLQkJCSAgICsgc3VmZml4X2xlbiArIDEpOwotICBzdHJjcHkgKHRlbXBfZmlsZW5hbWUsIGJhc2UpOwotCi0gIGlmIChiYXNlX2xlbiAhPSAwCi0gICAgICAmJiB0ZW1wX2ZpbGVuYW1lW2Jhc2VfbGVuLTFdICE9ICcvJwotICAgICAgJiYgdGVtcF9maWxlbmFtZVtiYXNlX2xlbi0xXSAhPSBESVJfU0VQQVJBVE9SKQotICAgIHRlbXBfZmlsZW5hbWVbYmFzZV9sZW4rK10gPSBESVJfU0VQQVJBVE9SOwotICBzdHJjcHkgKHRlbXBfZmlsZW5hbWUgKyBiYXNlX2xlbiwgVEVNUF9GSUxFKTsKLQotICBpZiAoc3VmZml4KQotICAgIHN0cmNhdCAodGVtcF9maWxlbmFtZSwgc3VmZml4KTsKLQotICBmZCA9IG1rc3RlbXBzICh0ZW1wX2ZpbGVuYW1lLCBzdWZmaXhfbGVuKTsKLSAgLyogSWYgbWtzdGVtcHMgZmFpbGVkLCB0aGVuIHNvbWV0aGluZyBiYWQgaXMgaGFwcGVuaW5nLiAgTWF5YmUgd2Ugc2hvdWxkCi0gICAgIGlzc3VlIGEgbWVzc2FnZSBhYm91dCBhIHBvc3NpYmxlIHNlY3VyaXR5IGF0dGFjayBpbiBwcm9ncmVzcz8gICovCi0gIGlmIChmZCA9PSAtMSkKLSAgICBhYm9ydCAoKTsKLSAgLyogU2ltaWxhcmx5IGlmIHdlIGNhbiBub3QgY2xvc2UgdGhlIGZpbGUuICAqLwotICBpZiAoY2xvc2UgKGZkKSkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHRlbXBfZmlsZW5hbWU7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvY2xvY2suYyBiL2xpYmliZXJ0eS9jbG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI1MDljLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogQU5TSS1jb21wYXRpYmxlIGNsb2NrIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQotc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCi10ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLUFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGZpbGVzCi1jb21waWxlZCB3aXRoIGEgR05VIGNvbXBpbGVyIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBkb2VzIG5vdCBjYXVzZQotdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQotdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgSEFWRV9HRVRSVVNBR0UKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1RJTUVTCi0jaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3RpbWVzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1NDX0NMS19UQ0sKLSNkZWZpbmUgR05VX0haICBzeXNjb25mKF9TQ19DTEtfVENLKQotI2Vsc2UKLSNpZmRlZiBIWgotI2RlZmluZSBHTlVfSFogIEhaCi0jZWxzZQotI2lmZGVmIENMT0NLU19QRVJfU0VDCi0jZGVmaW5lIEdOVV9IWiAgQ0xPQ0tTX1BFUl9TRUMKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotLyogRklYTUU6IHNob3VsZCBiZSBhYmxlIHRvIGRlY2xhcmUgYXMgY2xvY2tfdC4gKi8KLQotbG9uZwotY2xvY2sgKCkKLXsKLSNpZmRlZiBIQVZFX0dFVFJVU0FHRQotICBzdHJ1Y3QgcnVzYWdlIHJ1c2FnZTsKLQotICBnZXRydXNhZ2UgKDAsICZydXNhZ2UpOwotICByZXR1cm4gKHJ1c2FnZS5ydV91dGltZS50dl9zZWMgKiAxMDAwMDAwICsgcnVzYWdlLnJ1X3V0aW1lLnR2X3VzZWMKLQkgICsgcnVzYWdlLnJ1X3N0aW1lLnR2X3NlYyAqIDEwMDAwMDAgKyBydXNhZ2UucnVfc3RpbWUudHZfdXNlYyk7Ci0jZWxzZQotI2lmZGVmIEhBVkVfVElNRVMKLSAgc3RydWN0IHRtcyB0bXM7Ci0KLSAgdGltZXMgKCZ0bXMpOwotICByZXR1cm4gKHRtcy50bXNfdXRpbWUgKyB0bXMudG1zX3N0aW1lKSAqICgxMDAwMDAwIC8gR05VX0haKTsKLSNlbHNlCi0jaWZkZWYgVk1TCi0gIHN0cnVjdAotICAgIHsKLSAgICAgIGludCBwcm9jX3VzZXJfdGltZTsKLSAgICAgIGludCBwcm9jX3N5c3RlbV90aW1lOwotICAgICAgaW50IGNoaWxkX3VzZXJfdGltZTsKLSAgICAgIGludCBjaGlsZF9zeXN0ZW1fdGltZTsKLSAgICB9IHZtc190aW1lczsKLQotICB0aW1lcyAoJnZtc190aW1lcyk7Ci0gIHJldHVybiAodm1zX3RpbWVzLnByb2NfdXNlcl90aW1lICsgdm1zX3RpbWVzLnByb2Nfc3lzdGVtX3RpbWUpICogMTAwMDA7Ci0jZWxzZQotICAvKiBBIGZhbGxiYWNrLCBpZiBub3RoaW5nIGVsc2UgYXZhaWxhYmxlLiAqLwotICByZXR1cm4gMDsKLSNlbmRpZiAvKiBWTVMgKi8KLSNlbmRpZiAvKiBIQVZFX1RJTUVTICovCi0jZW5kaWYgLyogSEFWRV9HRVRSVVNBR0UgKi8KLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmNhdC5jIGIvbGliaWJlcnR5L2NvbmNhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjEzMmM4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25jYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKiBDb25jYXRlbmF0ZSB2YXJpYWJsZSBudW1iZXIgb2Ygc3RyaW5ncy4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyoKLQotTkFNRQotCi0JY29uY2F0IC0tIGNvbmNhdGVuYXRlIGEgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmluZ3MKLQotU1lOT1BTSVMKLQotCSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0KLQljaGFyICpjb25jYXQgKHMxLCBzMiwgczMsIC4uLiwgTlVMTCkKLQotREVTQ1JJUFRJT04KLQotCUNvbmNhdGVuYXRlIGEgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmluZ3MgYW5kIHJldHVybiB0aGUgcmVzdWx0Ci0JaW4gZnJlc2hseSBtYWxsb2MnZCBtZW1vcnkuCi0KLQlSZXR1cm5zIE5VTEwgaWYgaW5zdWZmaWNpZW50IG1lbW9yeSBpcyBhdmFpbGFibGUuICBUaGUgYXJndW1lbnQKLQlsaXN0IGlzIHRlcm1pbmF0ZWQgYnkgdGhlIGZpcnN0IE5VTEwgcG9pbnRlciBlbmNvdW50ZXJlZC4gIFBvaW50ZXJzCi0JdG8gZW1wdHkgc3RyaW5ncyBhcmUgaWdub3JlZC4KLQotTk9URVMKLQotCVRoaXMgZnVuY3Rpb24gdXNlcyB4bWFsbG9jKCkgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgYSBmcm9udCBlbmQKLQlmdW5jdGlvbiB0byBtYWxsb2MoKSB0aGF0IGRlYWxzIHdpdGggbG93IG1lbW9yeSBzaXR1YXRpb25zLiAgSW4KLQl0eXBpY2FsIHVzZSwgaWYgbWFsbG9jKCkgcmV0dXJucyBOVUxMIHRoZW4geG1hbGxvYygpIGRpdmVydHMgdG8gYW4KLQllcnJvciBoYW5kbGVyIHJvdXRpbmUgd2hpY2ggbmV2ZXIgcmV0dXJucywgYW5kIHRodXMgeG1hbGxvYyB3aWxsCi0JbmV2ZXIgcmV0dXJuIGEgTlVMTCBwb2ludGVyLiAgSWYgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiB3aXNoZXMgdG8KLQlkZWFsIHdpdGggbG93IG1lbW9yeSBzaXR1YXRpb25zIGl0c2VsZiwgaXQgc2hvdWxkIHN1cHBseSBhbiB4bWFsbG9jCi0JdGhhdCBqdXN0IGRpcmVjdGx5IGludm9rZXMgbWFsbG9jIGFuZCBibGluZGx5IHJldHVybnMgd2hhdGV2ZXIKLQltYWxsb2MgcmV0dXJucy4KLSovCi0KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotZXh0ZXJuIHNpemVfdCBzdHJsZW4gKGNvbnN0IGNoYXIgKnMpOwotI2Vsc2UKLWV4dGVybiBpbnQgc3RybGVuICgpOwotI2VuZGlmCi0KLSNkZWZpbmUgTlVMTFAgKGNoYXIgKikwCi0KLS8qIFZBUkFSR1MgKi8KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLWNoYXIgKgotY29uY2F0IChjb25zdCBjaGFyICpmaXJzdCwgLi4uKQotI2Vsc2UKLWNoYXIgKgotY29uY2F0ICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgcmVnaXN0ZXIgaW50IGxlbmd0aDsKLSAgcmVnaXN0ZXIgY2hhciAqbmV3c3RyOwotICByZWdpc3RlciBjaGFyICplbmQ7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmFyZzsKLSAgdmFfbGlzdCBhcmdzOwotI2lmbmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgY29uc3QgY2hhciAqZmlyc3Q7Ci0jZW5kaWYKLQotICAvKiBGaXJzdCBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSByZXN1bHQgYW5kIGdldCBzdWZmaWNpZW50IG1lbW9yeS4gKi8KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotICB2YV9zdGFydCAoYXJncywgZmlyc3QpOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBmaXJzdCA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKTsKLSNlbmRpZgotCi0gIGlmIChmaXJzdCA9PSBOVUxMUCkKLSAgICBsZW5ndGggPSAwOwotICBlbHNlCi0gICAgewotICAgICAgbGVuZ3RoID0gc3RybGVuIChmaXJzdCk7Ci0gICAgICB3aGlsZSAoKGFyZyA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKSkgIT0gTlVMTFApCi0JewotCSAgbGVuZ3RoICs9IHN0cmxlbiAoYXJnKTsKLQl9Ci0gICAgfQotICBuZXdzdHIgPSAoY2hhciAqKSB4bWFsbG9jIChsZW5ndGggKyAxKTsKLSAgdmFfZW5kIChhcmdzKTsKLQotICAvKiBOb3cgY29weSB0aGUgaW5kaXZpZHVhbCBwaWVjZXMgdG8gdGhlIHJlc3VsdCBzdHJpbmcuICovCi0KLSAgaWYgKG5ld3N0ciAhPSBOVUxMUCkKLSAgICB7Ci0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0gICAgICB2YV9zdGFydCAoYXJncywgZmlyc3QpOwotI2Vsc2UKLSAgICAgIHZhX3N0YXJ0IChhcmdzKTsKLSAgICAgIGZpcnN0ID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOwotI2VuZGlmCi0gICAgICBlbmQgPSBuZXdzdHI7Ci0gICAgICBpZiAoZmlyc3QgIT0gTlVMTFApCi0JewotCSAgYXJnID0gZmlyc3Q7Ci0JICB3aGlsZSAoKmFyZykKLQkgICAgewotCSAgICAgICplbmQrKyA9ICphcmcrKzsKLQkgICAgfQotCSAgd2hpbGUgKChhcmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKikpICE9IE5VTExQKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKCphcmcpCi0JCXsKLQkJICAqZW5kKysgPSAqYXJnKys7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgICplbmQgPSAnXDAwMCc7Ci0gICAgICB2YV9lbmQgKGFyZ3MpOwotICAgIH0KLQotICByZXR1cm4gKG5ld3N0cik7Ci19Ci0KLSNpZmRlZiBNQUlOCi0KLS8qIFNpbXBsZSBsaXR0bGUgdGVzdCBkcml2ZXIuICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQKLW1haW4gKCkKLXsKLSAgcHJpbnRmICgiXCJcIiA9IFwiJXNcIlxuIiwgY29uY2F0IChOVUxMUCkpOwotICBwcmludGYgKCJcImFcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYSIsIE5VTExQKSk7Ci0gIHByaW50ZiAoIlwiYWJcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYSIsICJiIiwgTlVMTFApKTsKLSAgcHJpbnRmICgiXCJhYmNcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYSIsICJiIiwgImMiLCBOVUxMUCkpOwotICBwcmludGYgKCJcImFiY2RcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYWIiLCAiY2QiLCBOVUxMUCkpOwotICBwcmludGYgKCJcImFiY2RlXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoImFiIiwgImMiLCAiZGUiLCBOVUxMUCkpOwotICBwcmludGYgKCJcImFiY2RlZlwiID0gXCIlc1wiXG4iLCBjb25jYXQgKCIiLCAiYSIsICIiLCAiYmNkIiwgImVmIiwgTlVMTFApKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy5oLXZtcyBiL2xpYmliZXJ0eS9jb25maWcuaC12bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYWM2YTIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy5oLXZtcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNpZm5kZWYgTkVFRF9zdHJlcnJvcgotI2RlZmluZSBORUVEX3N0cmVycm9yCi0jZW5kaWYKLSNpZm5kZWYgTkVFRF9iYXNlbmFtZQotI2RlZmluZSBORUVEX2Jhc2VuYW1lCi0jZW5kaWYKLSNpZm5kZWYgTkVFRF9wc2lnbmFsCi0jZGVmaW5lIE5FRURfcHNpZ25hbAotI2VuZGlmCi0jaWZuZGVmIE5FRURfb25fZXhpdAotI2RlZmluZSBORUVEX29uX2V4aXQKLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnLmluIGIvbGliaWJlcnR5L2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyNTZjOS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPHN5cy93YWl0Lmg+IHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19XQUlUX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDx2Zm9yay5oPi4gICovCi0jdW5kZWYgSEFWRV9WRk9SS19ICi0KLS8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBwaWRfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIHZmb3JrIGFzIGZvcmsgaWYgdmZvcmsgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgdmZvcmsKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfZXJybGlzdCB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRVJSTElTVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19uZXJyIHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19ORVJSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX3NpZ2xpc3QgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJlcnJvciBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJFUlJPUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGFzcHJpbnRmIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0FTUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYXRleGl0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0FURVhJVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJhc2VuYW1lIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0JBU0VOQU1FCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYmNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9CQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYmNvcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQkNPUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBiemVybyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9CWkVSTwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNhbGxvYyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9DQUxMT0MKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjbG9jayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9DTE9DSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRSVVNBR0UKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpbmRleCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9JTkRFWAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGluc3F1ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9JTlNRVUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1jaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUVNQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01FTUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1lbWNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NRU1DUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1tb3ZlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01FTU1PVkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1zZXQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUVNU0VUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWtzdGVtcHMgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUtTVEVNUFMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBvbl9leGl0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX09OX0VYSVQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwc2lnbmFsIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BTSUdOQUwKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByYW5kb20gZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUkFORE9NCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmVuYW1lIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1JFTkFNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJpbmRleCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9SSU5ERVgKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NCUksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdzZXRtYXNrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NJR1NFVE1BU0sKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZHVwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkRVUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmVycm9yIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkVSUk9SCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RybmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSTkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJzaWduYWwgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSU0lHTkFMCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3Ryc3RyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlNUUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnRvZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJUT0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJ0b2wgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSVE9MCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RydG91bCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJUT1VMCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzY29uZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TWVNDT05GCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZXMgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVElNRVMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0bXBuYW0gZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVE1QTkFNCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdmFzcHJpbnRmIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1ZBU1BSSU5URgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHZmcHJpbnRmIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1ZGUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdnByaW50ZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9WUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdnNwcmludGYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVlNQUklOVEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB3YWl0cGlkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1dBSVRQSUQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRklMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcudGFibGUgYi9saWJpYmVydHkvY29uZmlnLnRhYmxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTEzYjIzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcudGFibGUKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1jYXNlICIke2hvc3R9IiBpbgotICByczYwMDAtaWJtLWFpeDMuMSB8IHJzNjAwMC1pYm0tYWl4KQotICAgICAgICAgICAgICAgICAgICAgICAgZnJhZz1taC1haXggOzsKLSAgKi0qLWN4dXg3KikJCWZyYWc9bWgtY3h1eDcgOzsKLSAgKi0qLWZyZWVic2QyLjEuKikJZnJhZz1taC1mYnNkMjEgOzsKLSAgKi0qLWZyZWVic2QyLjIuWzAxMl0pCWZyYWc9bWgtZmJzZDIxIDs7Ci0gIGlbMzQ1XTg2LSotd2luZG93cyopCWZyYWc9bWgtd2luZG93cyA7OwotICAqLSotYmVvcyopCQlmcmFnPW1oLWJlb3MgOzsKLWVzYWMKLQotZnJhZ3M9JGZyYWcKLQotIyBJZiB0aGV5IGRpZG4ndCBzcGVjaWZ5IC0tZW5hYmxlLXNoYXJlZCwgZG9uJ3QgZ2VuZXJhdGUgc2hhcmVkIGxpYnMuCi1jYXNlICIke2VuYWJsZV9zaGFyZWR9IiBpbgotICB5ZXMpIHNoYXJlZD15ZXMgOzsKLSAgbm8pIHNoYXJlZD1ubyA7OwotICAiIikgc2hhcmVkPW5vIDs7Ci0gICopIHNoYXJlZD15ZXMgOzsKLWVzYWMKLWlmIFsgIiR7c2hhcmVkfSIgPSAieWVzIiBdOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0gICAgKi0qLWN5Z3dpbiopCTs7Ci0gICAgYWxwaGEqLSotbGludXgqKQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLWVsZmFscGhhcGljIiA7OwotICAgIGFybSotKi0qKQkJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC1hcm1waWMiIDs7Ci0gICAgaHBwYSotKi0qKQkJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC1wYXBpYyIgOzsKLSAgICBpWzM0NTZdODYtKi0qKQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLXg4NnBpYyIgOzsKLSAgICBwb3dlcnBjKi0qLWFpeCopCTs7Ci0gICAgcG93ZXJwYyotKi0qKQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLXBwY3BpYyIgOzsKLSAgICAqLSotKikJCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgtJHtob3N0X2NwdX1waWMiIDs7Ci0gIGVzYWMKLWZpCi0KLWVjaG8gIiMgV2FybmluZzogdGhpcyBmcmFnbWVudCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCIgPiB0ZW1wLWZyYWcKLQotZm9yIGZyYWcgaW4gJHtmcmFnc307IGRvCi0gIGNhc2UgJHtmcmFnfSBpbgotICAgIC4uLyogKQotICAgICAgaWYgWyAke3NyY2Rpcn0gPSAuIF07IHRoZW4KLQlbIC1uICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iIF0gJiYgZnJhZz0uLi8ke2ZyYWd9Ci0JWyAtbiAiJHt3aXRoX211bHRpc3JjdG9wfSIgXSAmJiBmcmFnPSR7d2l0aF9tdWx0aXNyY3RvcH0ke2ZyYWd9Ci0gICAgICBmaQotICAgICAgOzsKLSAgZXNhYwotICBmcmFnPSR7c3JjZGlyfS8ke3hzcmNkaXJ9Y29uZmlnLyRmcmFnCi0gIGlmIFsgLWYgJHtmcmFnfSBdOyB0aGVuCi0gICAgZWNobyAiQXBwZW5kaW5nICR7ZnJhZ30gdG8geGhvc3QtbWtmcmFnIgotICAgIGVjaG8gIiMgRm9sbG93aW5nIGZyYWdtZW50IGNvcGllZCBmcm9tICR7ZnJhZ30iID4+IHRlbXAtZnJhZwotICAgIGNhdCAke2ZyYWd9ID4+IHRlbXAtZnJhZwotICBmaQotZG9uZQotCi0jIHJlY29yZCBpZiB3ZSB3YW50IHRvIGJ1aWxkIHNoYXJlZCBsaWJzLgotaWYgWyAiJHtzaGFyZWR9IiA9ICJ5ZXMiIF07IHRoZW4KLSAgZWNobyBlbmFibGVfc2hhcmVkID0geWVzID4+IHRlbXAtZnJhZwotZWxzZQotICBlY2hvIGVuYWJsZV9zaGFyZWQgPSBubyA+PiB0ZW1wLWZyYWcKLWZpCi0KLWZyYWc9eGhvc3QtbWtmcmFnCi0ke0NPTkZJR19TSEVMTH0gJHtsaWJpYmVydHlfdG9wZGlyfS9tb3ZlLWlmLWNoYW5nZSB0ZW1wLWZyYWcgeGhvc3QtbWtmcmFnCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLWFpeCBiL2xpYmliZXJ0eS9jb25maWcvbWgtYWl4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjY0NTA1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcvbWgtYWl4CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jIFRoaXMgZmlsZSBpcyBvbmx5IG5lZWRlZCBieSBBSVggMy4xLgotSERFRklORVMgPSAtRF9fSUVFRV9CSUdfRU5ESUFOCi0KLSMgTW9zdCByZWxlYXNlcyBvZiBBSVggMy4xIGluY2x1ZGUgYW4gaW5jb3JyZWN0IGludGVybmFsIHZlcnNpb24gb2YgY29weXNpZ24KLSMgaW4gbGliYy5hIGZvciB1c2UgYnkgc29tZSBsaWJjIHB1YmxpYyBmdW5jdGlvbnMgaW5jbHVkaW5nIG1vZGYuICBUaGUgcHVibGljCi0jIHZlcnNpb24gb2YgY29weXNpZ24gaW4gbGlibS5hIGlzIHVzYWJsZS4gIEZvciB0aGUgc2FrZSBvZiBsaWJnKysgKHdoaWNoCi0jIHVzZXMgbW9kZiksIHdlIGFkZCBjb3B5c2lnbiBoZXJlLiAgU3VwcG9zZWRseSwgdGhpcyBwcm9ibGVtIGlzIGZpeGVkIGluIEFJWAotIyAzLjEuOCBhbmQgYWJvdmUsIGluY2x1ZGluZyBhbGwgcmVsZWFzZXMgb2YgQUlYIDMuMi4KLUVYVFJBX09GSUxFUyA9IGNvcHlzaWduLm8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcvbWgtYmVvcyBiL2xpYmliZXJ0eS9jb25maWcvbWgtYmVvcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3NWU3ZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLWJlb3MKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgSG9zdCBtYWtlZmlsZSBmcmFnbWVudCBmb3IgQmVPUwotCi0jIFRoaXMgaXMgYSB0ZW1wb3JhcnkgaGFjayB1bnRpbCB0aGUgd2ltcHkgZGVmYXVsdCA2NGsgc3RhY2sKLSMgbGltaXQgaW4gQmVPUyBpcyBlaXRoZXIgaW5jcmVhc2VkIG9yIG1hZGUgdXNlciBzZXR0YWJsZSBzb21laG93LgotIyBUaGlzIHByb2JhYmx5IHdvbid0IGhhcHBlbiB1bnRpbCBhZnRlciB0aGUgRFI5IHJlbGVhc2UuCi0KLUVYVFJBX09GSUxFUyA9IGFsbG9jYS5vCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLWN4dXg3IGIvbGliaWJlcnR5L2NvbmZpZy9taC1jeHV4NwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyNGIwOC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLWN4dXg3CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotSERFRklORVMgPSAtREhBUlJJU19GTE9BVF9GT1JNQVQKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcvbWgtZmJzZDIxIGIvbGliaWJlcnR5L2NvbmZpZy9taC1mYnNkMjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzVhNzguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy9taC1mYnNkMjEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FWFRSQV9PRklMRVM9dmFzcHJpbnRmLm8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcvbWgtd2luZG93cyBiL2xpYmliZXJ0eS9jb25maWcvbWgtd2luZG93cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmNWY3OS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLXdpbmRvd3MKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FWFRSQV9PRklMRVM9YXNwcmludGYubyBzdHJjYXNlY21wLm8gc3RybmNhc2VjbXAubyB2YXNwcmludGYubwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZ3VyZSBiL2xpYmliZXJ0eS9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhYjliNjQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDI5MTYgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC10YXJnZXQtc3ViZGlyPVNVQkRJUiAgICAgIENvbmZpZ3VyaW5nIGluIGEgc3ViZGlyZWN0b3J5IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWNyb3NzLWhvc3Q9SE9TVCAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBhIGNyb3NzIGNvbXBpbGVyIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLW5ld2xpYiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBuZXdsaWIiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPXBleGVjdXRlLmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRzaXRlZmlsZSI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZWxzZQotICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIENPTkZJR19TSVRFPSIkc2l0ZWZpbGUiCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGFyZ2V0LXN1YmRpciBvciAtLXdpdGhvdXQtdGFyZ2V0LXN1YmRpciB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfdGFyZ2V0X3N1YmRpcitzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF90YXJnZXRfc3ViZGlyIgotICA6Ci1maQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWNyb3NzLWhvc3Qgb3IgLS13aXRob3V0LWNyb3NzLWhvc3Qgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2Nyb3NzX2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfY3Jvc3NfaG9zdCIKLSAgOgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1uZXdsaWIgb3IgLS13aXRob3V0LW5ld2xpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbmV3bGliK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX25ld2xpYiIKLSAgOgotZmkKLQotCi1pZiB0ZXN0ICIke3NyY2Rpcn0iID0gIi4iOyB0aGVuCi0gIGlmIHRlc3QgLXogIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLSAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vLi4iCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIjsgdGhlbgotICAgICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9LyR7d2l0aF9tdWx0aXNyY3RvcH0uLi8uLiIKLSAgICBlbHNlCi0gICAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vJHt3aXRoX211bHRpc3JjdG9wfS4uIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8uLiIKLWZpCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkbGliaWJlcnR5X3RvcGRpciAkc3JjZGlyLyRsaWJpYmVydHlfdG9wZGlyOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJGxpYmliZXJ0eV90b3BkaXIgJHNyY2Rpci8kbGliaWJlcnR5X3RvcGRpciIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MDI6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLQotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjI1OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY1MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FSJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUiIgJiYgYWNfY3ZfcHJvZ19BUj0iYXIiCi1maQotZmkKLUFSPSIkYWNfY3ZfcHJvZ19BUiIKLWlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2ODM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcxNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgUkFOTElCPSI6IgotZmkKLWZpCi0KLQotIyBGSVhNRTogV2UgdGVtcG9yYXJpbHkgZGVmaW5lIG91ciBvd24gdmVyc2lvbiBvZiBBQ19QUk9HX0NDLiAgVGhpcyBpcwotIyBjb3BpZWQgZnJvbSBhdXRvY29uZiAyLjEyLCBidXQgZG9lcyBub3QgY2FsbCBBQ19QUk9HX0NDX1dPUktTLiAgV2UKLSMgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIsIHdoaWNoIHdpbGwgbm90IGJlIGFibGUgdG8gZnVsbHkKLSMgbGluayBhbiBleGVjdXRhYmxlLiAgVGhpcyBzaG91bGQgcmVhbGx5IGJlIGZpeGVkIGluIGF1dG9jb25mCi0jIGl0c2VsZi4KLQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NjA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc5MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgzOTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODQ4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi0gIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPQotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg2MzogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotICBpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0gIGVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1PMiIKLSAgZmkKLWVsc2UKLSAgR0NDPQotICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1nIgotZmkKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODkyOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLQotCi0KLQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTMwOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLS4gJHtzcmNkaXJ9L2NvbmZpZy50YWJsZQotaG9zdF9tYWtlZmlsZV9mcmFnPSR7ZnJhZ30KLQotCi0jIEl0J3MgT0sgdG8gY2hlY2sgZm9yIGhlYWRlciBmaWxlcy4gIEFsdGhvdWdoIHRoZSBjb21waWxlciBtYXkgbm90IGJlCi0jIGFibGUgdG8gbGluayBhbnl0aGluZywgaXQgaGFkIGJldHRlciBiZSBhYmxlIHRvIGF0IGxlYXN0IGNvbXBpbGUKLSMgc29tZXRoaW5nLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk5MTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDA2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDEyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDIzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDI5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDQ2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWZvciBhY19oZHIgaW4gc3lzL2ZpbGUuaCBzeXMvcGFyYW0uaCBzdGRsaWIuaCBzdHJpbmcuaCB1bmlzdGQuaCBzdHJpbmdzLmggc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNzQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDc5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDg0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN5cy93YWl0LmggdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMTE6IGNoZWNraW5nIGZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMTYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHN0YXRfdmFsKSAoKHVuc2lnbmVkKShzdGF0X3ZhbCkgPj4gOCkKLSNlbmRpZgotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHN0YXRfdmFsKSAoKChzdGF0X3ZhbCkgJiAyNTUpID09IDApCi0jZW5kaWYKLWludCBtYWluKCkgewotaW50IHM7Ci13YWl0ICgmcyk7Ci1zID0gV0lGRVhJVEVEIChzKSA/IFdFWElUU1RBVFVTIChzKSA6IDE7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEzMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX1dBSVRfSCAxCi1FT0YKLQotZmkKLQotCi0jIFRoaXMgaXMgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHdoaWNoIGxpYmliZXJ0eSB3aWxsIHByb3ZpZGUgaWYgdGhleQotIyBhcmUgbm90IGF2YWlsYWJsZSBvbiB0aGUgaG9zdC4KLQotZnVuY3M9ImFzcHJpbnRmIgotZnVuY3M9IiRmdW5jcyBhdGV4aXQiCi1mdW5jcz0iJGZ1bmNzIGJhc2VuYW1lIgotZnVuY3M9IiRmdW5jcyBiY21wIgotZnVuY3M9IiRmdW5jcyBiY29weSIKLWZ1bmNzPSIkZnVuY3MgYnplcm8iCi1mdW5jcz0iJGZ1bmNzIGNhbGxvYyIKLWZ1bmNzPSIkZnVuY3MgY2xvY2siCi1mdW5jcz0iJGZ1bmNzIGdldGN3ZCIKLWZ1bmNzPSIkZnVuY3MgZ2V0cGFnZXNpemUiCi1mdW5jcz0iJGZ1bmNzIGluZGV4IgotZnVuY3M9IiRmdW5jcyBpbnNxdWUiCi1mdW5jcz0iJGZ1bmNzIG1lbWNociIKLWZ1bmNzPSIkZnVuY3MgbWVtY21wIgotZnVuY3M9IiRmdW5jcyBtZW1jcHkiCi1mdW5jcz0iJGZ1bmNzIG1lbW1vdmUiCi1mdW5jcz0iJGZ1bmNzIG1lbXNldCIKLWZ1bmNzPSIkZnVuY3MgbWtzdGVtcHMiCi1mdW5jcz0iJGZ1bmNzIHJhbmRvbSIKLWZ1bmNzPSIkZnVuY3MgcmVuYW1lIgotZnVuY3M9IiRmdW5jcyByaW5kZXgiCi1mdW5jcz0iJGZ1bmNzIHNpZ3NldG1hc2siCi1mdW5jcz0iJGZ1bmNzIHN0cmNhc2VjbXAiCi1mdW5jcz0iJGZ1bmNzIHN0cmNociIKLWZ1bmNzPSIkZnVuY3Mgc3RyZHVwIgotZnVuY3M9IiRmdW5jcyBzdHJuY2FzZWNtcCIKLWZ1bmNzPSIkZnVuY3Mgc3RycmNociIKLWZ1bmNzPSIkZnVuY3Mgc3Ryc3RyIgotZnVuY3M9IiRmdW5jcyBzdHJ0b2QiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvbCIKLWZ1bmNzPSIkZnVuY3Mgc3RydG91bCIKLWZ1bmNzPSIkZnVuY3MgdG1wbmFtIgotZnVuY3M9IiRmdW5jcyB2YXNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZmcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2cHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2c3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3Mgd2FpdHBpZCIKLQotIyBBbHNvIGluIHRoZSBvbGQgZnVuY3Rpb24uZGVmIGZpbGU6IGFsbG9jYSwgdmZvcmssIGdldG9wdC4KLQotdmFycz0ic3lzX2Vycmxpc3Qgc3lzX25lcnIgc3lzX3NpZ2xpc3QiCi0KLWNoZWNrZnVuY3M9ImdldHJ1c2FnZSBvbl9leGl0IHBzaWduYWwgc3RyZXJyb3Igc3Ryc2lnbmFsIHN5c2NvbmYgdGltZXMgc2JyayIKLQotIyBUaGVzZSBhcmUgbmVpdGhlciBleGVjdXRlZCBub3IgcmVxdWlyZWQsIGJ1dCB0aGV5IGhlbHAga2VlcAotIyBhdXRvaGVhZGVyIGhhcHB5IHdpdGhvdXQgYWRkaW5nIGEgYnVuY2ggb2YgdGV4dCB0byBhY2NvbmZpZy5oLgotaWYgdGVzdCAieCIgPSAieSI7IHRoZW4KLSAgZm9yIGFjX2Z1bmMgaW4gYXNwcmludGYgYXRleGl0IGJhc2VuYW1lIGJjbXAgYmNvcHkgYnplcm8gY2FsbG9jIGNsb2NrIGdldGN3ZAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIwNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIxMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplIGluZGV4IGluc3F1ZSBta3N0ZW1wcyBtZW1jaHIgbWVtY21wIG1lbWNweSBtZW1tb3ZlCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjYxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgZm9yIGFjX2Z1bmMgaW4gbWVtc2V0IHJhbmRvbSByZW5hbWUgcmluZGV4IHNpZ3NldG1hc2sgc3RyY2FzZWNtcAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMxNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTMyMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGZvciBhY19mdW5jIGluIHN0cmNociBzdHJkdXAgc3RybmNhc2VjbXAgc3RycmNociBzdHJzdHIgc3RydG9kIHN0cnRvbAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM3MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM3NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGZvciBhY19mdW5jIGluIHN0cnRvdWwgdG1wbmFtIHZhc3ByaW50ZiB2ZnByaW50ZiB2cHJpbnRmIHZzcHJpbnRmIHdhaXRwaWQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MjY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfRVJSTElTVCAxCi1FT0YKLQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfTkVSUiAxCi1FT0YKLQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfU0lHTElTVCAxCi1FT0YKLQotICBmb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2Ugb25fZXhpdCBwc2lnbmFsIHN0cmVycm9yIHN0cnNpZ25hbCBzeXNjb25mIHRpbWVzCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDkzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDk4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgZm9yIGFjX2Z1bmMgaW4gc2JyawotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU0ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU1MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1maQotCi0jIEZvciBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucywgaWYgdGhlIGhvc3QgZG9lcyBub3QgcHJvdmlkZSB0aGUKLSMgZnVuY3Rpb24gd2Ugd2FudCB0byBwdXQgRk4ubyBpbiBMSUJPQkpTLCBhbmQgaWYgdGhlIGhvc3QgZG9lcwotIyBwcm92aWRlIHRoZSBmdW5jdGlvbiwgd2Ugd2FudCB0byBkZWZpbmUgSEFWRV9GTiBpbiBjb25maWcuaC4gIEFsc28sCi0jIGlmIHRoZSBob3N0IGRvZXMgbm90IHByb3ZpZGUgYWxsb2NhLCB3ZSBzZXQgQUxMT0NBIHRvIGFsbG9jYS5vCi0KLXNldG9ianM9Ci1pZiB0ZXN0IC1uICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCi0KLSAgIyBXZSBhcmUgYmVpbmcgY29uZmlndXJlZCBhcyBhIHRhcmdldCBsaWJyYXJ5LiAgQUNfUkVQTEFDRV9GVU5DUwotICAjIG1heSBub3Qgd29yayBjb3JyZWN0bHksIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG1heSBub3QgYmUgYWJsZSB0bwotICAjIGxpbmsgZXhlY3V0YWJsZXMuICBOb3RlIHRoYXQgd2UgbWF5IHN0aWxsIGJlIGJlaW5nIGNvbmZpZ3VyZWQKLSAgIyBuYXRpdmUuCi0KLSAgIyBJZiB3ZSBhcmUgYmVpbmcgY29uZmlndXJlZCBmb3IgbmV3bGliLCB3ZSBrbm93IHdoaWNoIGZ1bmN0aW9ucwotICAjIG5ld2xpYiBwcm92aWRlIGFuZCB3aGljaCBvbmVzIHdlIHdpbGwgYmUgZXhwZWN0ZWQgdG8gcHJvdmlkZS4KLQotICBpZiB0ZXN0ICJ4JHt3aXRoX25ld2xpYn0iID0gInh5ZXMiOyB0aGVuCi0gICAgQUxMT0NBPSJhbGxvY2EubyIKLSAgICBMSUJPQkpTPSJhc3ByaW50Zi5vIGJhc2VuYW1lLm8gaW5zcXVlLm8gcmFuZG9tLm8gc3RyZHVwLm8gdmFzcHJpbnRmLm8iCi0KLSAgICBmb3IgZiBpbiAkZnVuY3M7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KLQlhc3ByaW50ZiB8IGJhc2VuYW1lIHwgaW5zcXVlIHwgcmFuZG9tIHwgc3RyZHVwIHwgdmFzcHJpbnRmKQotCSAgOzsKLQkqKQotCSAgbj1IQVZFX2BlY2hvICRmIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotCSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJG4gMQotRU9GCi0KLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBuZXdsaWIgZG9lc250IHByb3ZpZGUgYW55IG9mIHRoZSB2YXJpYWJsZXMgaW4gJHZhcnMsIHNvIHdlCi0gICAgIyBkb250IGhhdmUgdG8gY2hlY2sgdGhlbSBoZXJlLgotCi0gICAgIyBPZiB0aGUgZnVuY3Rpb25zIGluICRjaGVja2Z1bmNzLCBuZXdsaWIgb25seSBoYXMgc3RyZXJyb3IuCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RSRVJST1IgMQotRU9GCi0KLQotICAgIHNldG9ianM9eWVzCi0KLSAgZmkKLWZpCi0KLWlmIHRlc3QgLXogIiR7c2V0b2Jqc30iOyB0aGVuCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0KLSAgKi0qLXZ4d29ya3MqKQotICAgICMgSGFuZGxlIFZ4V29ya3MgY29uZmlndXJhdGlvbiBzcGVjaWFsbHksIHNpbmNlIG9uIFZ4V29ya3MgdGhlCi0gICAgIyBsaWJyYXJpZXMgYXJlIGFjdHVhbGx5IG9uIHRoZSB0YXJnZXQgYm9hcmQsIG5vdCBpbiB0aGUgZmlsZQotICAgICMgc3lzdGVtLgotICAgIExJQk9CSlM9ImJhc2VuYW1lLm8gZ2V0cGFnZXNpemUubyBpbnNxdWUubyByYW5kb20ubyBzdHJjYXNlY21wLm8iCi0gICAgTElCT0JKUz0iJExJQk9CSlMgc3RybmNhc2VjbXAubyBzdHJkdXAubyB2Zm9yay5vIHdhaXRwaWQubyB2YXNwcmludGYubyIKLSAgICBmb3IgZiBpbiAkZnVuY3M7IGRvCi0gICAgICBjYXNlICIkZiIgaW4KLQliYXNlbmFtZSB8IGdldHBhZ2VzaXplIHwgaW5zcXVlIHwgcmFuZG9tIHwgc3RyY2FzZWNtcCkKLQkgIDs7Ci0Jc3RybmNhc2VjbXAgfCBzdHJkdXAgfCB2Zm9yayB8IHdhaXRwaWQgfCB2YXNwcmludGYpCi0JICA7OwotCSopCi0JICBuPUhBVkVfYGVjaG8gJGYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0JICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkbiAxCi1FT0YKLQotCSAgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIFZ4V29ya3MgZG9lc24ndCBwcm92aWRlIGFueSBvZiB0aGUgdmFyaWFibGVzIGluICR2YXJzLCBzbyB3ZQotICAgICMgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVtIGhlcmUuCi0KLSAgICAjIE9mIHRoZSBmdW5jdGlvbnMgaW4gJGNoZWNrZnVuY3MsIFZ4V29ya3Mgb25seSBoYXMgc3RyZXJyb3IuCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RSRVJST1IgMQotRU9GCi0KLQotICAgIHNldG9ianM9eWVzCi0gICAgOzsKLQotICBlc2FjCi1maQotCi1pZiB0ZXN0IC16ICIke3NldG9ianN9IjsgdGhlbgotCi0gIGNhc2UgIiR7aG9zdH0iIGluCi0KLSAgKi0qLWN5Z3dpbiopCi0gICAgIyBUaGUgQ3lnd2luIGxpYnJhcnkgYWN0dWFsbHkgdXNlcyBhIGNvdXBsZSBvZiBmaWxlcyBmcm9tCi0gICAgIyBsaWJpYmVydHkgd2hlbiBpdCBpcyBidWlsdC4gIElmIHdlIGFyZSBidWlsZGluZyBhIG5hdGl2ZQotICAgICMgQ3lnd2luLCBhbmQgd2UgcnVuIHRoZSB0ZXN0cywgd2Ugd2lsbCBhcHBlYXIgdG8gaGF2ZSB0aGVzZQotICAgICMgZmlsZXMuICBIb3dldmVyLCB3aGVuIHdlIGdvIG9uIHRvIGJ1aWxkIHdpbnN1cCwgd2Ugd2lsbCB3aW5kIHVwCi0gICAgIyB3aXRoIGEgbGlicmFyeSB3aGljaCBkb2VzIG5vdCBoYXZlIHRoZSBmaWxlcywgc2luY2UgdGhleSBzaG91bGQKLSAgICAjIGhhdmUgY29tZSBmcm9tIGxpYmliZXJ0eS4KLQotICAgICMgV2UgaGFuZGxlIHRoaXMgYnkgcmVtb3ZpbmcgdGhlIGZ1bmN0aW9ucyB0aGUgd2luc3VwIGxpYnJhcnkKLSAgICAjIHByb3ZpZGVzIGZyb20gb3VyIHNoZWxsIHZhcmlhYmxlcywgc28gdGhhdCB0aGV5IGFwcGVhciB0byBiZQotICAgICMgbWlzc2luZy4KLQotICAgIGZ1bmNzPSJgZWNobyAkZnVuY3MgfCBzZWQgLWUgJ3MvcmFuZG9tLy8nYCIKLSAgICBMSUJPQkpTPSIkTElCT0JKUyByYW5kb20ubyIKLSAgICB2YXJzPSJgZWNobyAkdmFycyB8IHNlZCAtZSAncy9zeXNfc2lnbGlzdC8vJ2AiCi0gICAgY2hlY2tmdW5jcz0iYGVjaG8gJGNoZWNrZnVuY3MgfCBzZWQgLWUgJ3Mvc3Ryc2lnbmFsLy8nIC1lICdzL3BzaWduYWwvLydgIgotICAgIDs7Ci0KLSAgKi0qLW1pbmd3MzIqKQotICAgICMgVW5kZXIgbWluZ3czMiwgc3lzX25lcnIgYW5kIHN5c19lcnJsaXN0IGV4aXN0LCBidXQgdGhleSBhcmUKLSAgICAjIG1hY3Jvcywgc28gdGhlIHRlc3QgYmVsb3cgd29uJ3QgZmluZCB0aGVtLgotICAgIHZhcnM9ImBlY2hvICR2YXJzIHwgc2VkIC1lICdzL3N5c19uZXJyLy8nIC1lICdzL3N5c19lcnJsaXN0Ly8nYCIKLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfTkVSUiAxCi1FT0YKLQotICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19FUlJMSVNUIDEKLUVPRgotCi0gICAgOzsKLQotICAqLSotdXdpbiopCi0gICAgIyBVbmRlciBzb21lIHZlcnNpb25zIG9mIHV3aW4sIHZmb3JrIGlzIG5vdG9yaW91c2x5IGJ1Z2d5IGFuZCB0aGUgdGVzdCAKLSAgICAjIGNhbiBoYW5nIGNvbmZpZ3VyZTsgb24gb3RoZXIgdmVyc2lvbnMsIHZmb3JrIGV4aXN0cyBqdXN0IGFzIGEgc3R1Yi4KLSAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgdmZvcmsgaW4gdXdpbidzIHJ1bnRpbWUgaXMgZml4ZWQuCi0gICAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1ubwotICAgIDs7Ci0KLSAgZXNhYwotCi0gICMgV2UgaGF2ZW4ndCBzZXQgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB5ZXQuICBVc2UgdGhlIHN0YW5kYXJkIGF1dG9jb25mCi0gICMgdGVzdHMuICBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBjb21waWxlciB3b3Jrcy4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzM4OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxNzQ5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzgwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi0gIGZvciBhY19mdW5jIGluICRmdW5jcwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc4NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTc5MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1MSUJPQkpTPSIkTElCT0JKUyAke2FjX2Z1bmN9LiR7YWNfb2JqZXh0fSIKLWZpCi1kb25lCi0KLQotICAjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODQ0OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTg0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODU2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3NzogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODgyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5MTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTQyOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk0NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NzI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5NzcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAwMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDI3OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjAzNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA3NjogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA4MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA4OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTA2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE0NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTU2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBpZF90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTgwOiBjaGVja2luZyBmb3IgcGlkX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfcGlkX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXBpZF90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9waWRfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3BpZF90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfcGlkX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfcGlkX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgcGlkX3QgaW50Ci1FT0YKLQotZmkKLQotYWNfc2FmZT1gZWNobyAidmZvcmsuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdmZvcmsuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIxNDogY2hlY2tpbmcgZm9yIHZmb3JrLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHZmb3JrLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMjQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9WRk9SS19IIDEKLUVPRgotCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNDk6IGNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3Zmb3JrX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHZmb3JrIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjU1OiBjaGVja2luZyBmb3IgdmZvcmsiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfdmZvcmsnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjYwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHZmb3JrKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgdmZvcmsoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl92Zm9yaykgfHwgZGVmaW5lZCAoX19zdHViX19fdmZvcmspCi1jaG9rZSBtZQotI2Vsc2UKLXZmb3JrKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyODM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfdmZvcms9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX3Zmb3JrPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18ndmZvcmtgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgOgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9JGFjX2N2X2Z1bmNfdmZvcmsKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBUaGFua3MgdG8gUGF1bCBFZ2dlcnQgZm9yIHRoaXMgdGVzdC4gICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVkZPUktfSAotI2luY2x1ZGUgPHZmb3JrLmg+Ci0jZW5kaWYKLS8qIE9uIHNvbWUgc3BhcmMgc3lzdGVtcywgY2hhbmdlcyBieSB0aGUgY2hpbGQgdG8gbG9jYWwgYW5kIGluY29taW5nCi0gICBhcmd1bWVudCByZWdpc3RlcnMgYXJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgcGFyZW50LgotICAgVGhlIGNvbXBpbGVyIGlzIHRvbGQgYWJvdXQgdGhpcyB3aXRoICNpbmNsdWRlIDx2Zm9yay5oPiwKLSAgIGJ1dCBzb21lIGNvbXBpbGVycyAoZS5nLiBnY2MgLU8pIGRvbid0IGdyb2sgPHZmb3JrLmg+LgotICAgVGVzdCBmb3IgdGhpcyBieSB1c2luZyBhIHN0YXRpYyB2YXJpYWJsZSB3aG9zZSBhZGRyZXNzCi0gICBpcyBwdXQgaW50byBhIHJlZ2lzdGVyIHRoYXQgaXMgY2xvYmJlcmVkIGJ5IHRoZSB2Zm9yay4gICovCi1zdGF0aWMKLSNpZmRlZiBfX2NwbHVzcGx1cwotc3BhcmNfYWRkcmVzc190ZXN0IChpbnQgYXJnKQotI2Vsc2UKLXNwYXJjX2FkZHJlc3NfdGVzdCAoYXJnKSBpbnQgYXJnOwotI2VuZGlmCi17Ci0gIHN0YXRpYyBwaWRfdCBjaGlsZDsKLSAgaWYgKCFjaGlsZCkgewotICAgIGNoaWxkID0gdmZvcmsgKCk7Ci0gICAgaWYgKGNoaWxkIDwgMCkgewotICAgICAgcGVycm9yICgidmZvcmsiKTsKLSAgICAgIF9leGl0KDIpOwotICAgIH0KLSAgICBpZiAoIWNoaWxkKSB7Ci0gICAgICBhcmcgPSBnZXRwaWQoKTsKLSAgICAgIHdyaXRlKC0xLCAiIiwgMCk7Ci0gICAgICBfZXhpdCAoYXJnKTsKLSAgICB9Ci0gIH0KLX0KLW1haW4oKSB7Ci0gIHBpZF90IHBhcmVudCA9IGdldHBpZCAoKTsKLSAgcGlkX3QgY2hpbGQ7Ci0KLSAgc3BhcmNfYWRkcmVzc190ZXN0ICgpOwotCi0gIGNoaWxkID0gdmZvcmsgKCk7Ci0KLSAgaWYgKGNoaWxkID09IDApIHsKLSAgICAvKiBIZXJlIGlzIGFub3RoZXIgdGVzdCBmb3Igc3BhcmMgdmZvcmsgcmVnaXN0ZXIgcHJvYmxlbXMuCi0gICAgICAgVGhpcyB0ZXN0IHVzZXMgbG90cyBvZiBsb2NhbCB2YXJpYWJsZXMsIGF0IGxlYXN0Ci0gICAgICAgYXMgbWFueSBsb2NhbCB2YXJpYWJsZXMgYXMgbWFpbiBoYXMgYWxsb2NhdGVkIHNvIGZhcgotICAgICAgIGluY2x1ZGluZyBjb21waWxlciB0ZW1wb3Jhcmllcy4gIDQgbG9jYWxzIGFyZSBlbm91Z2ggZm9yCi0gICAgICAgZ2NjIDEuNDAuMyBvbiBhIFNvbGFyaXMgNC4xLjMgc3BhcmMsIGJ1dCB3ZSB1c2UgOCB0byBiZSBzYWZlLgotICAgICAgIEEgYnVnZ3kgY29tcGlsZXIgc2hvdWxkIHJldXNlIHRoZSByZWdpc3RlciBvZiBwYXJlbnQKLSAgICAgICBmb3Igb25lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMsIHNpbmNlIGl0IHdpbGwgdGhpbmsgdGhhdAotICAgICAgIHBhcmVudCBjYW4ndCBwb3NzaWJseSBiZSB1c2VkIGFueSBtb3JlIGluIHRoaXMgcm91dGluZS4KLSAgICAgICBBc3NpZ25pbmcgdG8gdGhlIGxvY2FsIHZhcmlhYmxlIHdpbGwgdGh1cyBtdW5nZSBwYXJlbnQKLSAgICAgICBpbiB0aGUgcGFyZW50IHByb2Nlc3MuICAqLwotICAgIHBpZF90Ci0gICAgICBwID0gZ2V0cGlkKCksIHAxID0gZ2V0cGlkKCksIHAyID0gZ2V0cGlkKCksIHAzID0gZ2V0cGlkKCksCi0gICAgICBwNCA9IGdldHBpZCgpLCBwNSA9IGdldHBpZCgpLCBwNiA9IGdldHBpZCgpLCBwNyA9IGdldHBpZCgpOwotICAgIC8qIENvbnZpbmNlIHRoZSBjb21waWxlciB0aGF0IHAuLnA3IGFyZSBsaXZlOyBvdGhlcndpc2UsIGl0IG1pZ2h0Ci0gICAgICAgdXNlIHRoZSBzYW1lIGhhcmR3YXJlIHJlZ2lzdGVyIGZvciBhbGwgOCBsb2NhbCB2YXJpYWJsZXMuICAqLwotICAgIGlmIChwICE9IHAxIHx8IHAgIT0gcDIgfHwgcCAhPSBwMyB8fCBwICE9IHA0Ci0JfHwgcCAhPSBwNSB8fCBwICE9IHA2IHx8IHAgIT0gcDcpCi0gICAgICBfZXhpdCgxKTsKLQotICAgIC8qIE9uIHNvbWUgc3lzdGVtcyAoZS5nLiBJUklYIDMuMyksCi0gICAgICAgdmZvcmsgZG9lc24ndCBzZXBhcmF0ZSBwYXJlbnQgZnJvbSBjaGlsZCBmaWxlIGRlc2NyaXB0b3JzLgotICAgICAgIElmIHRoZSBjaGlsZCBjbG9zZXMgYSBkZXNjcmlwdG9yIGJlZm9yZSBpdCBleGVjcyBvciBleGl0cywKLSAgICAgICB0aGlzIG11bmdlcyB0aGUgcGFyZW50J3MgZGVzY3JpcHRvciBhcyB3ZWxsLgotICAgICAgIFRlc3QgZm9yIHRoaXMgYnkgY2xvc2luZyBzdGRvdXQgaW4gdGhlIGNoaWxkLiAgKi8KLSAgICBfZXhpdChjbG9zZShmaWxlbm8oc3Rkb3V0KSkgIT0gMCk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50IHN0YXR1czsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLQotICAgIHdoaWxlICh3YWl0KCZzdGF0dXMpICE9IGNoaWxkKQotICAgICAgOwotICAgIGV4aXQoCi0JIC8qIFdhcyB0aGVyZSBzb21lIHByb2JsZW0gd2l0aCB2Zm9ya2luZz8gICovCi0JIGNoaWxkIDwgMAotCi0JIC8qIERpZCB0aGUgY2hpbGQgZmFpbD8gIChUaGlzIHNob3VsZG4ndCBoYXBwZW4uKSAgKi8KLQkgfHwgc3RhdHVzCi0KLQkgLyogRGlkIHRoZSB2Zm9yay9jb21waWxlciBidWcgb2NjdXI/ICAqLwotCSB8fCBwYXJlbnQgIT0gZ2V0cGlkKCkKLQotCSAvKiBEaWQgdGhlIGZpbGUgZGVzY3JpcHRvciBidWcgb2NjdXI/ICAqLwotCSB8fCBmc3RhdChmaWxlbm8oc3Rkb3V0KSwgJnN0KSAhPSAwCi0JICk7Ci0gIH0KLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDAwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgdmZvcmsgZm9yawotRU9GCi0KLWZpCi0KLSAgaWYgdGVzdCAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyA9IG5vOyB0aGVuCi0gICAgTElCT0JKUz0iJExJQk9CSlMgdmZvcmsubyIKLSAgZmkKLSAgZm9yIHYgaW4gJHZhcnM7IGRvCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICR2IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDI3OiBjaGVja2luZyBmb3IgJHYiID4mNQotICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsaWJpYmVydHlfY3ZfdmFyXyR2JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1pbnQgKnA7Ci1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgJHY7IHAgPSAmJHY7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQzOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAibGliaWJlcnR5X2N2X3Zhcl8kdj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImxpYmliZXJ0eV9jdl92YXJfJHY9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckbGliaWJlcnR5X2N2X3Zhcl8nJHZgXCIgPSB5ZXMiOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgICBuPUhBVkVfYGVjaG8gJHYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkbiAxCi1FT0YKLQotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190IiJubyIgMT4mNgotICAgIGZpCi0gIGRvbmUKLSAgZm9yIGFjX2Z1bmMgaW4gJGNoZWNrZnVuY3MKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NjU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NzAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ5MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZmkKLQotIyBJbnN0YWxsIGEgbGlicmFyeSBidWlsdCB3aXRoIGEgY3Jvc3MgY29tcGlsZXIgaW4gJCh0b29sZGlyKSByYXRoZXIKLSMgdGhhbiAkKGxpYmRpcikuCi1pZiB0ZXN0IC16ICIke3dpdGhfY3Jvc3NfaG9zdH0iOyB0aGVuCi0gIElOU1RBTExfREVTVD1saWJkaXIKLWVsc2UKLSAgSU5TVEFMTF9ERVNUPXRvb2xkaXIKLWZpCi0KLQotIyBXZSBuZWVkIG11bHRpbGliIHN1cHBvcnQsIGJ1dCBvbmx5IGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgdGFyZ2V0LgotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVAQVJAJSRBUiVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAQ0NAJSRDQyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotL0Bob3N0X21ha2VmaWxlX2ZyYWdAL3IgJGhvc3RfbWFrZWZpbGVfZnJhZwotcyVAaG9zdF9tYWtlZmlsZV9mcmFnQCUlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQExJQk9CSlNAJSRMSUJPQkpTJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBJTlNUQUxMX0RFU1RAJSRJTlNUQUxMX0RFU1QlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi1zcmNkaXI9JHtzcmNkaXJ9Ci1ob3N0PSR7aG9zdH0KLXRhcmdldD0ke3RhcmdldH0KLXdpdGhfdGFyZ2V0X3N1YmRpcj0ke3dpdGhfdGFyZ2V0X3N1YmRpcn0KLXdpdGhfbXVsdGlzdWJkaXI9JHt3aXRoX211bHRpc3ViZGlyfQotYWNfY29uZmlndXJlX2FyZ3M9Ii0tZW5hYmxlLW11bHRpbGliICR7YWNfY29uZmlndXJlX2FyZ3N9IgotQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci1saWJpYmVydHlfdG9wZGlyPSR7bGliaWJlcnR5X3RvcGRpcn0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotaWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgotICAgICMgRklYTUU6IFdlIHNob3VsZG4ndCBuZWVkIHRvIHNldCBhY19maWxlCi0gICAgYWNfZmlsZT1NYWtlZmlsZQotICAgIC4gJHtsaWJpYmVydHlfdG9wZGlyfS9jb25maWctbWwuaW4KLSAgZmkKLWZpCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZ3VyZS5pbiBiL2xpYmliZXJ0eS9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMDMyYTQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdAotCi1BQ19QUkVSRVEoMi4xMi4xKQotQUNfSU5JVChwZXhlY3V0ZS5jKQotCi1kbmwgV2UgdXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZ1bmN0aW9ucyB0byBpbmNsdWRlLgotQUNfQVJHX1dJVEgodGFyZ2V0LXN1YmRpciwKLVsgIC0td2l0aC10YXJnZXQtc3ViZGlyPVNVQkRJUiAgICAgIENvbmZpZ3VyaW5nIGluIGEgc3ViZGlyZWN0b3J5XSkKLUFDX0FSR19XSVRIKGNyb3NzLWhvc3QsCi1bICAtLXdpdGgtY3Jvc3MtaG9zdD1IT1NUICAgICAgICAgICBDb25maWd1cmluZyB3aXRoIGEgY3Jvc3MgY29tcGlsZXJdKQotQUNfQVJHX1dJVEgobmV3bGliLAotWyAgLS13aXRoLW5ld2xpYiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBuZXdsaWJdKQotCi1pZiB0ZXN0ICIke3NyY2Rpcn0iID0gIi4iOyB0aGVuCi0gIGlmIHRlc3QgLXogIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLSAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vLi4iCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIjsgdGhlbgotICAgICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9LyR7d2l0aF9tdWx0aXNyY3RvcH0uLi8uLiIKLSAgICBlbHNlCi0gICAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vJHt3aXRoX211bHRpc3JjdG9wfS4uIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8uLiIKLWZpCi1BQ19DT05GSUdfQVVYX0RJUigkbGliaWJlcnR5X3RvcGRpcikKLQotQUNfQ0FOT05JQ0FMX0hPU1QKLQotZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgYXV0b21ha2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShsaWJpYmVydHksIDEuMCkKLQotZG5sIFRoZXNlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wsIGJlY2F1c2UgaXQgbWF5IHdhbnQKLWRubCB0byBjYWxsIEFDX0NIRUNLX1BST0cuCi1BQ19DSEVDS19UT09MKEFSLCBhcikKLUFDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCi0KLSMgRklYTUU6IFdlIHRlbXBvcmFyaWx5IGRlZmluZSBvdXIgb3duIHZlcnNpb24gb2YgQUNfUFJPR19DQy4gIFRoaXMgaXMKLSMgY29waWVkIGZyb20gYXV0b2NvbmYgMi4xMiwgYnV0IGRvZXMgbm90IGNhbGwgQUNfUFJPR19DQ19XT1JLUy4gIFdlCi0jIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLCB3aGljaCB3aWxsIG5vdCBiZSBhYmxlIHRvIGZ1bGx5Ci0jIGxpbmsgYW4gZXhlY3V0YWJsZS4gIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBmaXhlZCBpbiBhdXRvY29uZgotIyBpdHNlbGYuCi0KLUFDX0RFRlVOKExJQl9BQ19QUk9HX0NDLAotW0FDX0JFRk9SRShbJDBdLCBbQUNfUFJPR19DUFBdKWRubAotQUNfUFJPVklERShbQUNfUFJPR19DQ10pCi1BQ19DSEVDS19QUk9HKENDLCBnY2MsIGdjYykKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgQUNfQ0hFQ0tfUFJPRyhDQywgY2MsIGNjLCAsICwgL3Vzci91Y2IvY2MpCi0gIHRlc3QgLXogIiRDQyIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSF0pCi1maQotCi1BQ19QUk9HX0NDX0dOVQotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1kbmwgQ2hlY2sgd2hldGhlciAtZyB3b3JrcywgZXZlbiBpZiBDRkxBR1MgaXMgc2V0LCBpbiBjYXNlIHRoZSBwYWNrYWdlCi1kbmwgcGxheXMgYXJvdW5kIHdpdGggQ0ZMQUdTIChzdWNoIGFzIHRvIGJ1aWxkIGJvdGggZGVidWdnaW5nIGFuZAotZG5sIG5vcm1hbCB2ZXJzaW9ucyBvZiBhIGxpYnJhcnkpLCB0YXN0ZWxlc3MgYXMgdGhhdCBpZGVhIGlzLgotICBhY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0KLSAgQUNfUFJPR19DQ19HCi0gIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLSAgZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLU8yIgotICBmaQotZWxzZQotICBHQ0M9Ci0gIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0IHx8IENGTEFHUz0iLWciCi1maQotXSkKLQotTElCX0FDX1BST0dfQ0MKLQotQUNfSVNDX1BPU0lYCi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGxpYnRvb2w6Ci1kbmwgRGVmYXVsdCB0byBhIG5vbiBzaGFyZWQgbGlicmFyeS4gIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlCi1kbmwgY29uZmlndXJlIG9wdGlvbiAtLWVuYWJsZS1zaGFyZWQuCi1kbmwgQU1fRElTQUJMRV9TSEFSRUQKLQotZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgbGlidG9vbDoKLWRubCBBTV9QUk9HX0xJQlRPT0wKLQotZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgYXV0b21ha2U6Ci1kbmwgQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi1BQ19DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgYXV0b21ha2U6Ci1kbmwgQU1fTUFJTlRBSU5FUl9NT0RFCi1kbmwgQUNfRVhFRVhUCi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGF1dG9tYWtlOgotZG5sIEFNX1BST0dfSU5TVEFMTAotQUNfUFJPR19JTlNUQUxMCi0KLS4gJHtzcmNkaXJ9L2NvbmZpZy50YWJsZQotaG9zdF9tYWtlZmlsZV9mcmFnPSR7ZnJhZ30KLUFDX1NVQlNUX0ZJTEUoaG9zdF9tYWtlZmlsZV9mcmFnKQotCi0jIEl0J3MgT0sgdG8gY2hlY2sgZm9yIGhlYWRlciBmaWxlcy4gIEFsdGhvdWdoIHRoZSBjb21waWxlciBtYXkgbm90IGJlCi0jIGFibGUgdG8gbGluayBhbnl0aGluZywgaXQgaGFkIGJldHRlciBiZSBhYmxlIHRvIGF0IGxlYXN0IGNvbXBpbGUKLSMgc29tZXRoaW5nLgotQUNfQ0hFQ0tfSEVBREVSUyhzeXMvZmlsZS5oIHN5cy9wYXJhbS5oIHN0ZGxpYi5oIHN0cmluZy5oIHVuaXN0ZC5oIHN0cmluZ3MuaCBzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oKQotQUNfSEVBREVSX1NZU19XQUlUCi0KLSMgVGhpcyBpcyB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgd2hpY2ggbGliaWJlcnR5IHdpbGwgcHJvdmlkZSBpZiB0aGV5Ci0jIGFyZSBub3QgYXZhaWxhYmxlIG9uIHRoZSBob3N0LgotCi1mdW5jcz0iYXNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIGF0ZXhpdCIKLWZ1bmNzPSIkZnVuY3MgYmFzZW5hbWUiCi1mdW5jcz0iJGZ1bmNzIGJjbXAiCi1mdW5jcz0iJGZ1bmNzIGJjb3B5IgotZnVuY3M9IiRmdW5jcyBiemVybyIKLWZ1bmNzPSIkZnVuY3MgY2FsbG9jIgotZnVuY3M9IiRmdW5jcyBjbG9jayIKLWZ1bmNzPSIkZnVuY3MgZ2V0Y3dkIgotZnVuY3M9IiRmdW5jcyBnZXRwYWdlc2l6ZSIKLWZ1bmNzPSIkZnVuY3MgaW5kZXgiCi1mdW5jcz0iJGZ1bmNzIGluc3F1ZSIKLWZ1bmNzPSIkZnVuY3MgbWVtY2hyIgotZnVuY3M9IiRmdW5jcyBtZW1jbXAiCi1mdW5jcz0iJGZ1bmNzIG1lbWNweSIKLWZ1bmNzPSIkZnVuY3MgbWVtbW92ZSIKLWZ1bmNzPSIkZnVuY3MgbWVtc2V0IgotZnVuY3M9IiRmdW5jcyBta3N0ZW1wcyIKLWZ1bmNzPSIkZnVuY3MgcmFuZG9tIgotZnVuY3M9IiRmdW5jcyByZW5hbWUiCi1mdW5jcz0iJGZ1bmNzIHJpbmRleCIKLWZ1bmNzPSIkZnVuY3Mgc2lnc2V0bWFzayIKLWZ1bmNzPSIkZnVuY3Mgc3RyY2FzZWNtcCIKLWZ1bmNzPSIkZnVuY3Mgc3RyY2hyIgotZnVuY3M9IiRmdW5jcyBzdHJkdXAiCi1mdW5jcz0iJGZ1bmNzIHN0cm5jYXNlY21wIgotZnVuY3M9IiRmdW5jcyBzdHJyY2hyIgotZnVuY3M9IiRmdW5jcyBzdHJzdHIiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvZCIKLWZ1bmNzPSIkZnVuY3Mgc3RydG9sIgotZnVuY3M9IiRmdW5jcyBzdHJ0b3VsIgotZnVuY3M9IiRmdW5jcyB0bXBuYW0iCi1mdW5jcz0iJGZ1bmNzIHZhc3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgdmZwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZzcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB3YWl0cGlkIgotCi0jIEFsc28gaW4gdGhlIG9sZCBmdW5jdGlvbi5kZWYgZmlsZTogYWxsb2NhLCB2Zm9yaywgZ2V0b3B0LgotCi12YXJzPSJzeXNfZXJybGlzdCBzeXNfbmVyciBzeXNfc2lnbGlzdCIKLQotY2hlY2tmdW5jcz0iZ2V0cnVzYWdlIG9uX2V4aXQgcHNpZ25hbCBzdHJlcnJvciBzdHJzaWduYWwgc3lzY29uZiB0aW1lcyBzYnJrIgotCi0jIFRoZXNlIGFyZSBuZWl0aGVyIGV4ZWN1dGVkIG5vciByZXF1aXJlZCwgYnV0IHRoZXkgaGVscCBrZWVwCi0jIGF1dG9oZWFkZXIgaGFwcHkgd2l0aG91dCBhZGRpbmcgYSBidW5jaCBvZiB0ZXh0IHRvIGFjY29uZmlnLmguCi1pZiB0ZXN0ICJ4IiA9ICJ5IjsgdGhlbgotICBBQ19DSEVDS19GVU5DUyhhc3ByaW50ZiBhdGV4aXQgYmFzZW5hbWUgYmNtcCBiY29weSBiemVybyBjYWxsb2MgY2xvY2sgZ2V0Y3dkKQotICBBQ19DSEVDS19GVU5DUyhnZXRwYWdlc2l6ZSBpbmRleCBpbnNxdWUgbWtzdGVtcHMgbWVtY2hyIG1lbWNtcCBtZW1jcHkgbWVtbW92ZSkKLSAgQUNfQ0hFQ0tfRlVOQ1MobWVtc2V0IHJhbmRvbSByZW5hbWUgcmluZGV4IHNpZ3NldG1hc2sgc3RyY2FzZWNtcCkKLSAgQUNfQ0hFQ0tfRlVOQ1Moc3RyY2hyIHN0cmR1cCBzdHJuY2FzZWNtcCBzdHJyY2hyIHN0cnN0ciBzdHJ0b2Qgc3RydG9sKQotICBBQ19DSEVDS19GVU5DUyhzdHJ0b3VsIHRtcG5hbSB2YXNwcmludGYgdmZwcmludGYgdnByaW50ZiB2c3ByaW50ZiB3YWl0cGlkKQotICBBQ19ERUZJTkUoSEFWRV9TWVNfRVJSTElTVCkKLSAgQUNfREVGSU5FKEhBVkVfU1lTX05FUlIpCi0gIEFDX0RFRklORShIQVZFX1NZU19TSUdMSVNUKQotICBBQ19DSEVDS19GVU5DUyhnZXRydXNhZ2Ugb25fZXhpdCBwc2lnbmFsIHN0cmVycm9yIHN0cnNpZ25hbCBzeXNjb25mIHRpbWVzKQotICBBQ19DSEVDS19GVU5DUyhzYnJrKQotZmkKLQotIyBGb3IgZWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMsIGlmIHRoZSBob3N0IGRvZXMgbm90IHByb3ZpZGUgdGhlCi0jIGZ1bmN0aW9uIHdlIHdhbnQgdG8gcHV0IEZOLm8gaW4gTElCT0JKUywgYW5kIGlmIHRoZSBob3N0IGRvZXMKLSMgcHJvdmlkZSB0aGUgZnVuY3Rpb24sIHdlIHdhbnQgdG8gZGVmaW5lIEhBVkVfRk4gaW4gY29uZmlnLmguICBBbHNvLAotIyBpZiB0aGUgaG9zdCBkb2VzIG5vdCBwcm92aWRlIGFsbG9jYSwgd2Ugc2V0IEFMTE9DQSB0byBhbGxvY2EubwotCi1zZXRvYmpzPQotaWYgdGVzdCAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgotCi0gICMgV2UgYXJlIGJlaW5nIGNvbmZpZ3VyZWQgYXMgYSB0YXJnZXQgbGlicmFyeS4gIEFDX1JFUExBQ0VfRlVOQ1MKLSAgIyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LCBiZWNhdXNlIHRoZSBjb21waWxlciBtYXkgbm90IGJlIGFibGUgdG8KLSAgIyBsaW5rIGV4ZWN1dGFibGVzLiAgTm90ZSB0aGF0IHdlIG1heSBzdGlsbCBiZSBiZWluZyBjb25maWd1cmVkCi0gICMgbmF0aXZlLgotCi0gICMgSWYgd2UgYXJlIGJlaW5nIGNvbmZpZ3VyZWQgZm9yIG5ld2xpYiwgd2Uga25vdyB3aGljaCBmdW5jdGlvbnMKLSAgIyBuZXdsaWIgcHJvdmlkZSBhbmQgd2hpY2ggb25lcyB3ZSB3aWxsIGJlIGV4cGVjdGVkIHRvIHByb3ZpZGUuCi0KLSAgaWYgdGVzdCAieCR7d2l0aF9uZXdsaWJ9IiA9ICJ4eWVzIjsgdGhlbgotICAgIEFMTE9DQT0iYWxsb2NhLm8iCi0gICAgTElCT0JKUz0iYXNwcmludGYubyBiYXNlbmFtZS5vIGluc3F1ZS5vIHJhbmRvbS5vIHN0cmR1cC5vIHZhc3ByaW50Zi5vIgotCi0gICAgZm9yIGYgaW4gJGZ1bmNzOyBkbwotICAgICAgY2FzZSAiJGYiIGluCi0JYXNwcmludGYgfCBiYXNlbmFtZSB8IGluc3F1ZSB8IHJhbmRvbSB8IHN0cmR1cCB8IHZhc3ByaW50ZikKLQkgIDs7Ci0JKikKLQkgIG49SEFWRV9gZWNobyAkZiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLQkgIEFDX0RFRklORV9VTlFVT1RFRCgkbikKLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBuZXdsaWIgZG9lc250IHByb3ZpZGUgYW55IG9mIHRoZSB2YXJpYWJsZXMgaW4gJHZhcnMsIHNvIHdlCi0gICAgIyBkb250IGhhdmUgdG8gY2hlY2sgdGhlbSBoZXJlLgotCi0gICAgIyBPZiB0aGUgZnVuY3Rpb25zIGluICRjaGVja2Z1bmNzLCBuZXdsaWIgb25seSBoYXMgc3RyZXJyb3IuCi0gICAgQUNfREVGSU5FKEhBVkVfU1RSRVJST1IpCi0KLSAgICBzZXRvYmpzPXllcwotCi0gIGZpCi1maQotCi1pZiB0ZXN0IC16ICIke3NldG9ianN9IjsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotCi0gICotKi12eHdvcmtzKikKLSAgICAjIEhhbmRsZSBWeFdvcmtzIGNvbmZpZ3VyYXRpb24gc3BlY2lhbGx5LCBzaW5jZSBvbiBWeFdvcmtzIHRoZQotICAgICMgbGlicmFyaWVzIGFyZSBhY3R1YWxseSBvbiB0aGUgdGFyZ2V0IGJvYXJkLCBub3QgaW4gdGhlIGZpbGUKLSAgICAjIHN5c3RlbS4KLSAgICBMSUJPQkpTPSJiYXNlbmFtZS5vIGdldHBhZ2VzaXplLm8gaW5zcXVlLm8gcmFuZG9tLm8gc3RyY2FzZWNtcC5vIgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHN0cm5jYXNlY21wLm8gc3RyZHVwLm8gdmZvcmsubyB3YWl0cGlkLm8gdmFzcHJpbnRmLm8iCi0gICAgZm9yIGYgaW4gJGZ1bmNzOyBkbwotICAgICAgY2FzZSAiJGYiIGluCi0JYmFzZW5hbWUgfCBnZXRwYWdlc2l6ZSB8IGluc3F1ZSB8IHJhbmRvbSB8IHN0cmNhc2VjbXApCi0JICA7OwotCXN0cm5jYXNlY21wIHwgc3RyZHVwIHwgdmZvcmsgfCB3YWl0cGlkIHwgdmFzcHJpbnRmKQotCSAgOzsKLQkqKQotCSAgbj1IQVZFX2BlY2hvICRmIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotCSAgQUNfREVGSU5FX1VOUVVPVEVEKCRuKQotCSAgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIFZ4V29ya3MgZG9lc24ndCBwcm92aWRlIGFueSBvZiB0aGUgdmFyaWFibGVzIGluICR2YXJzLCBzbyB3ZQotICAgICMgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVtIGhlcmUuCi0KLSAgICAjIE9mIHRoZSBmdW5jdGlvbnMgaW4gJGNoZWNrZnVuY3MsIFZ4V29ya3Mgb25seSBoYXMgc3RyZXJyb3IuCi0gICAgQUNfREVGSU5FKEhBVkVfU1RSRVJST1IpCi0KLSAgICBzZXRvYmpzPXllcwotICAgIDs7Ci0KLSAgZXNhYwotZmkKLQotaWYgdGVzdCAteiAiJHtzZXRvYmpzfSI7IHRoZW4KLQotICBjYXNlICIke2hvc3R9IiBpbgotCi0gICotKi1jeWd3aW4qKQotICAgICMgVGhlIEN5Z3dpbiBsaWJyYXJ5IGFjdHVhbGx5IHVzZXMgYSBjb3VwbGUgb2YgZmlsZXMgZnJvbQotICAgICMgbGliaWJlcnR5IHdoZW4gaXQgaXMgYnVpbHQuICBJZiB3ZSBhcmUgYnVpbGRpbmcgYSBuYXRpdmUKLSAgICAjIEN5Z3dpbiwgYW5kIHdlIHJ1biB0aGUgdGVzdHMsIHdlIHdpbGwgYXBwZWFyIHRvIGhhdmUgdGhlc2UKLSAgICAjIGZpbGVzLiAgSG93ZXZlciwgd2hlbiB3ZSBnbyBvbiB0byBidWlsZCB3aW5zdXAsIHdlIHdpbGwgd2luZCB1cAotICAgICMgd2l0aCBhIGxpYnJhcnkgd2hpY2ggZG9lcyBub3QgaGF2ZSB0aGUgZmlsZXMsIHNpbmNlIHRoZXkgc2hvdWxkCi0gICAgIyBoYXZlIGNvbWUgZnJvbSBsaWJpYmVydHkuCi0KLSAgICAjIFdlIGhhbmRsZSB0aGlzIGJ5IHJlbW92aW5nIHRoZSBmdW5jdGlvbnMgdGhlIHdpbnN1cCBsaWJyYXJ5Ci0gICAgIyBwcm92aWRlcyBmcm9tIG91ciBzaGVsbCB2YXJpYWJsZXMsIHNvIHRoYXQgdGhleSBhcHBlYXIgdG8gYmUKLSAgICAjIG1pc3NpbmcuCi0KLSAgICBmdW5jcz0iYGVjaG8gJGZ1bmNzIHwgc2VkIC1lICdzL3JhbmRvbS8vJ2AiCi0gICAgTElCT0JKUz0iJExJQk9CSlMgcmFuZG9tLm8iCi0gICAgdmFycz0iYGVjaG8gJHZhcnMgfCBzZWQgLWUgJ3Mvc3lzX3NpZ2xpc3QvLydgIgotICAgIGNoZWNrZnVuY3M9ImBlY2hvICRjaGVja2Z1bmNzIHwgc2VkIC1lICdzL3N0cnNpZ25hbC8vJyAtZSAncy9wc2lnbmFsLy8nYCIKLSAgICA7OwotCi0gICotKi1taW5ndzMyKikKLSAgICAjIFVuZGVyIG1pbmd3MzIsIHN5c19uZXJyIGFuZCBzeXNfZXJybGlzdCBleGlzdCwgYnV0IHRoZXkgYXJlCi0gICAgIyBtYWNyb3MsIHNvIHRoZSB0ZXN0IGJlbG93IHdvbid0IGZpbmQgdGhlbS4KLSAgICB2YXJzPSJgZWNobyAkdmFycyB8IHNlZCAtZSAncy9zeXNfbmVyci8vJyAtZSAncy9zeXNfZXJybGlzdC8vJ2AiCi0gICAgQUNfREVGSU5FKEhBVkVfU1lTX05FUlIpCi0gICAgQUNfREVGSU5FKEhBVkVfU1lTX0VSUkxJU1QpCi0gICAgOzsKLQotICAqLSotdXdpbiopCi0gICAgIyBVbmRlciBzb21lIHZlcnNpb25zIG9mIHV3aW4sIHZmb3JrIGlzIG5vdG9yaW91c2x5IGJ1Z2d5IGFuZCB0aGUgdGVzdCAKLSAgICAjIGNhbiBoYW5nIGNvbmZpZ3VyZTsgb24gb3RoZXIgdmVyc2lvbnMsIHZmb3JrIGV4aXN0cyBqdXN0IGFzIGEgc3R1Yi4KLSAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgdmZvcmsgaW4gdXdpbidzIHJ1bnRpbWUgaXMgZml4ZWQuCi0gICAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1ubwotICAgIDs7Ci0KLSAgZXNhYwotCi0gICMgV2UgaGF2ZW4ndCBzZXQgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB5ZXQuICBVc2UgdGhlIHN0YW5kYXJkIGF1dG9jb25mCi0gICMgdGVzdHMuICBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBjb21waWxlciB3b3Jrcy4KLSAgQUNfUFJPR19DQ19XT1JLUwotICBBQ19SRVBMQUNFX0ZVTkNTKCRmdW5jcykKLSAgQUNfRlVOQ19BTExPQ0EKLSAgQUNfRlVOQ19WRk9SSwotICBpZiB0ZXN0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzID0gbm87IHRoZW4KLSAgICBMSUJPQkpTPSIkTElCT0JKUyB2Zm9yay5vIgotICBmaQotICBmb3IgdiBpbiAkdmFyczsgZG8KLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkdl0pCi0gICAgQUNfQ0FDSEVfVkFMKGxpYmliZXJ0eV9jdl92YXJfJHYsCi0gICAgICBbQUNfVFJZX0xJTksoW2ludCAqcDtdLCBbZXh0ZXJuIGludCAkdjsgcCA9ICYkdjtdLAotCQkgICBbZXZhbCAibGliaWJlcnR5X2N2X3Zhcl8kdj15ZXMiXSwKLQkJICAgW2V2YWwgImxpYmliZXJ0eV9jdl92YXJfJHY9bm8iXSldKQotICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGxpYmliZXJ0eV9jdl92YXJfJyR2YFwiID0geWVzIjsgdGhlbgotICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCi0gICAgICBuPUhBVkVfYGVjaG8gJHYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gICAgICBBQ19ERUZJTkVfVU5RVU9URUQoJG4pCi0gICAgZWxzZQotICAgICAgQUNfTVNHX1JFU1VMVChubykKLSAgICBmaQotICBkb25lCi0gIEFDX0NIRUNLX0ZVTkNTKCRjaGVja2Z1bmNzKQotZmkKLQotIyBJbnN0YWxsIGEgbGlicmFyeSBidWlsdCB3aXRoIGEgY3Jvc3MgY29tcGlsZXIgaW4gJCh0b29sZGlyKSByYXRoZXIKLSMgdGhhbiAkKGxpYmRpcikuCi1pZiB0ZXN0IC16ICIke3dpdGhfY3Jvc3NfaG9zdH0iOyB0aGVuCi0gIElOU1RBTExfREVTVD1saWJkaXIKLWVsc2UKLSAgSU5TVEFMTF9ERVNUPXRvb2xkaXIKLWZpCi1BQ19TVUJTVChJTlNUQUxMX0RFU1QpCi0KLSMgV2UgbmVlZCBtdWx0aWxpYiBzdXBwb3J0LCBidXQgb25seSBpZiBjb25maWd1cmluZyBmb3IgdGhlIHRhcmdldC4KLUFDX09VVFBVVChNYWtlZmlsZSwKLVt0ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotaWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KLSAgaWYgdGVzdCAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgotICAgICMgRklYTUU6IFdlIHNob3VsZG4ndCBuZWVkIHRvIHNldCBhY19maWxlCi0gICAgYWNfZmlsZT1NYWtlZmlsZQotICAgIC4gJHtsaWJpYmVydHlfdG9wZGlyfS9jb25maWctbWwuaW4KLSAgZmkKLWZpXSwKLXNyY2Rpcj0ke3NyY2Rpcn0KLWhvc3Q9JHtob3N0fQotdGFyZ2V0PSR7dGFyZ2V0fQotd2l0aF90YXJnZXRfc3ViZGlyPSR7d2l0aF90YXJnZXRfc3ViZGlyfQotd2l0aF9tdWx0aXN1YmRpcj0ke3dpdGhfbXVsdGlzdWJkaXJ9Ci1hY19jb25maWd1cmVfYXJncz0iLS1lbmFibGUtbXVsdGlsaWIgJHthY19jb25maWd1cmVfYXJnc30iCi1DT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLWxpYmliZXJ0eV90b3BkaXI9JHtsaWJpYmVydHlfdG9wZGlyfQotKQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvcHlzaWduLmMgYi9saWJpYmVydHkvY29weXNpZ24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1ZjhjMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29weXNpZ24uYworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotI2lmZGVmIF9fSUVFRV9CSUdfRU5ESUFOCi0KLXR5cGVkZWYgdW5pb24gCi17Ci0gIGRvdWJsZSB2YWx1ZTsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogMTE7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDo0OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjE6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMjoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24zOjE2OwotICAgIAotICB9IG51bWJlcjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogMTE7Ci0gICAgdW5zaWduZWQgaW50IHF1aWV0OjE7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMDozOwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjE6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMjoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24zOjE2OwotICB9IG5hbjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBtc3c7Ci0gICAgdW5zaWduZWQgbG9uZyBsc3c7Ci0gIH0gcGFydHM7Ci0gICAgbG9uZyBhc2xvbmdbMl07Ci19IF9faWVlZV9kb3VibGVfc2hhcGVfdHlwZTsKLQotI2VuZGlmCi0KLSNpZmRlZiBfX0lFRUVfTElUVExFX0VORElBTgotCi10eXBlZGVmIHVuaW9uIAotewotICBkb3VibGUgdmFsdWU7Ci0gIHN0cnVjdCAKLSAgewotI2lmZGVmIF9fU01BTExfQklURklFTERTCi0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMzoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24yOjE2OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjE6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDogNDsKLSNlbHNlCi0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMTozMjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOjIwOwotI2VuZGlmCi0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50IDoxMTsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiAgICAgOiAxOwotICB9IG51bWJlcjsKLSAgc3RydWN0IAotICB7Ci0jaWZkZWYgX19TTUFMTF9CSVRGSUVMRFMKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24zOjE2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjI6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMToxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjM7Ci0jZWxzZQotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjE6MzI7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMDoxOTsKLSNlbmRpZgotICAgIHVuc2lnbmVkIGludCBxdWlldDoxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogMTE7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICB9IG5hbjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBsc3c7Ci0gICAgdW5zaWduZWQgbG9uZyBtc3c7Ci0gIH0gcGFydHM7Ci0KLSAgbG9uZyBhc2xvbmdbMl07Ci0KLX0gX19pZWVlX2RvdWJsZV9zaGFwZV90eXBlOwotCi0jZW5kaWYKLQotI2lmZGVmIF9fSUVFRV9CSUdfRU5ESUFOCi10eXBlZGVmIHVuaW9uCi17Ci0gIGZsb2F0IHZhbHVlOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiA4OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjA6IDc7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMTogMTY7Ci0gIH0gbnVtYmVyOwotICBzdHJ1Y3QgCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc2lnbjoxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDo4OwotICAgIHVuc2lnbmVkIGludCBxdWlldDoxOwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjA6NjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24xOjE2OwotICB9IG5hbjsKLSAgbG9uZyBwMTsKLSAgCi19IF9faWVlZV9mbG9hdF9zaGFwZV90eXBlOwotI2VuZGlmCi0KLSNpZmRlZiBfX0lFRUVfTElUVExFX0VORElBTgotdHlwZWRlZiB1bmlvbgotewotICBmbG9hdCB2YWx1ZTsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDogNzsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24xOiAxNjsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6IDg7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICB9IG51bWJlcjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMToxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjY7Ci0gICAgdW5zaWduZWQgaW50IHF1aWV0OjE7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50Ojg7Ci0gICAgdW5zaWduZWQgaW50IHNpZ246MTsKLSAgfSBuYW47Ci0gIGxvbmcgcDE7Ci0gIAotfSBfX2llZWVfZmxvYXRfc2hhcGVfdHlwZTsKLSNlbmRpZgotCi0KLWRvdWJsZSBERUZVTihjb3B5c2lnbiwgKHgsIHkpLCBkb3VibGUgeCBBTkQgZG91YmxlIHkpCi17Ci0gIF9faWVlZV9kb3VibGVfc2hhcGVfdHlwZSBhLGI7Ci0gIGIudmFsdWUgPSB5OyAgCi0gIGEudmFsdWUgPSB4OwotICBhLm51bWJlci5zaWduID1iLm51bWJlci5zaWduOwotICByZXR1cm4gYS52YWx1ZTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jcGx1cy1kZW0uYyBiL2xpYmliZXJ0eS9jcGx1cy1kZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlZjU2YS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY3BsdXMtZGVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEwICswLDAgQEAKLS8qIERlbWFuZ2xlciBmb3IgR05VIEMrKwotICAgQ29weXJpZ2h0IDE5ODksIDkxLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEphbWVzIENsYXJrIChqamNAamNsYXJrLnV1Y3ApCi0gICBSZXdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSkgZm9yIEFSTSBhbmQgTHVjaWQgZGVtYW5nbGluZwotICAgTW9kaWZpZWQgYnkgU2F0aXNoIFBhaSAocGFpQGFwb2xsby5ocC5jb20pIGZvciBIUCBkZW1hbmdsaW5nCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgZXhwb3J0cyB0d28gZnVuY3Rpb25zOyBjcGx1c19tYW5nbGVfb3BuYW1lIGFuZCBjcGx1c19kZW1hbmdsZS4KLQotICAgVGhpcyBmaWxlIGltcG9ydHMgeG1hbGxvYyBhbmQgeHJlYWxsb2MsIHdoaWNoIGFyZSBsaWtlIG1hbGxvYyBhbmQKLSAgIHJlYWxsb2MgZXhjZXB0IHRoYXQgdGhleSBnZW5lcmF0ZSBhIGZhdGFsIGVycm9yIGlmIHRoZXJlIGlzIG5vCi0gICBhdmFpbGFibGUgbWVtb3J5LiAgKi8KLQotLyogVGhpcyBmaWxlIGxpdmVzIGluIGJvdGggR0NDIGFuZCBsaWJpYmVydHkuICBXaGVuIG1ha2luZyBjaGFuZ2VzLCBwbGVhc2UKLSAgIHRyeSBub3QgdG8gYnJlYWsgZWl0aGVyLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLWNoYXIgKiBtYWxsb2MgKCk7Ci1jaGFyICogcmVhbGxvYyAoKTsKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZGVtYW5nbGUuaD4KLSN1bmRlZiBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUKLSNkZWZpbmUgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFIHdvcmstPm9wdGlvbnMKLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqbXlzdHJzdHIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbXlzdHJzdHIgKHMxLCBzMikKLSAgICAgY29uc3QgY2hhciAqczEsICpzMjsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcCA9IHMxOwotICByZWdpc3RlciBpbnQgbGVuID0gc3RybGVuIChzMik7Ci0KLSAgZm9yICg7IChwID0gc3RyY2hyIChwLCAqczIpKSAhPSAwOyBwKyspCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKHAsIHMyLCBsZW4pID09IDApCi0JewotCSAgcmV0dXJuIChwKTsKLQl9Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi0vKiBJbiBvcmRlciB0byBhbGxvdyBhIHNpbmdsZSBkZW1hbmdsZXIgZXhlY3V0YWJsZSB0byBkZW1hbmdsZSBzdHJpbmdzCi0gICB1c2luZyB2YXJpb3VzIGNvbW1vbiB2YWx1ZXMgb2YgQ1BMVVNfTUFSS0VSLCBhcyB3ZWxsIGFzIGFueSBzcGVjaWZpYwotICAgb25lIHNldCBhdCBjb21waWxlIHRpbWUsIHdlIG1haW50YWluIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZQotICAgY29tbW9ubHkgdXNlZCBvbmVzLCBhbmQgY2hlY2sgdG8gc2VlIGlmIHRoZSBtYXJrZXIgd2UgYXJlIGxvb2tpbmcgZm9yCi0gICBpcyBpbiB0aGF0IHN0cmluZy4gIENQTFVTX01BUktFUiBpcyB1c3VhbGx5ICckJyBvbiBzeXN0ZW1zIHdoZXJlIHRoZQotICAgYXNzZW1ibGVyIGNhbiBkZWFsIHdpdGggdGhhdC4gIFdoZXJlIHRoZSBhc3NlbWJsZXIgY2FuJ3QsIGl0J3MgdXN1YWxseQotICAgJy4nIChidXQgb24gbWFueSBzeXN0ZW1zICcuJyBpcyB1c2VkIGZvciBvdGhlciB0aGluZ3MpLiAgV2UgcHV0IHRoZQotICAgY3VycmVudCBkZWZpbmVkIENQTFVTX01BUktFUiBmaXJzdCAod2hpY2ggZGVmYXVsdHMgdG8gJyQnKSwgZm9sbG93ZWQKLSAgIGJ5IHRoZSBuZXh0IG1vc3QgY29tbW9uIHZhbHVlLCBmb2xsb3dlZCBieSBhbiBleHBsaWNpdCAnJCcgaW4gY2FzZQotICAgdGhlIHZhbHVlIG9mIENQTFVTX01BUktFUiBpcyBub3QgJyQnLgotCi0gICBXZSBjb3VsZCBhdm9pZCB0aGlzIGlmIHdlIGNvdWxkIGp1c3QgZ2V0IGcrKyB0byB0ZWxsIHVzIHdoYXQgdGhlIGFjdHVhbAotICAgY3BsdXMgbWFya2VyIGNoYXJhY3RlciBpcyBhcyBwYXJ0IG9mIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiwgcGVyaGFwcyBieQotICAgZW5zdXJpbmcgdGhhdCBpdCBpcyB0aGUgY2hhcmFjdGVyIHRoYXQgdGVybWluYXRlcyB0aGUgZ2NjPG4+X2NvbXBpbGVkCi0gICBtYXJrZXIgc3ltYm9sIChGSVhNRSkuICAqLwotCi0jaWYgIWRlZmluZWQgKENQTFVTX01BUktFUikKLSNkZWZpbmUgQ1BMVVNfTUFSS0VSICckJwotI2VuZGlmCi0KLWVudW0gZGVtYW5nbGluZ19zdHlsZXMgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlID0gZ251X2RlbWFuZ2xpbmc7Ci0KLXN0YXRpYyBjaGFyIGNwbHVzX21hcmtlcnNbXSA9IHsgQ1BMVVNfTUFSS0VSLCAnLicsICckJywgJ1wwJyB9OwotCi1zdGF0aWMgY2hhciBjaGFyX3N0clsyXSA9IHsgJ1wwMDAnLCAnXDAwMCcgfTsKLQotdm9pZAotc2V0X2NwbHVzX21hcmtlcl9mb3JfZGVtYW5nbGluZyAoY2gpCi0gICAgIGludCBjaDsKLXsKLSAgY3BsdXNfbWFya2Vyc1swXSA9IGNoOwotfQotCi10eXBlZGVmIHN0cnVjdCBzdHJpbmcJCS8qIEJld2FyZTogdGhlc2UgYXJlbid0IHJlcXVpcmVkIHRvIGJlICovCi17CQkJCS8qICAnXDAnIHRlcm1pbmF0ZWQuICAqLwotICBjaGFyICpiOwkJCS8qIHBvaW50ZXIgdG8gc3RhcnQgb2Ygc3RyaW5nICovCi0gIGNoYXIgKnA7CQkJLyogcG9pbnRlciBhZnRlciBsYXN0IGNoYXJhY3RlciAqLwotICBjaGFyICplOwkJCS8qIHBvaW50ZXIgYWZ0ZXIgZW5kIG9mIGFsbG9jYXRlZCBzcGFjZSAqLwotfSBzdHJpbmc7Ci0KLS8qIFN0dWZmIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gc3ViLXJvdXRpbmVzLgotICAgVXNpbmcgYSBzaGFyZWQgc3RydWN0dXJlIGFsbG93cyBjcGx1c19kZW1hbmdsZSB0byBiZSByZWVudHJhbnQuICAqLwotCi1zdHJ1Y3Qgd29ya19zdHVmZgotewotICBpbnQgb3B0aW9uczsKLSAgY2hhciAqKnR5cGV2ZWM7Ci0gIGNoYXIgKiprdHlwZXZlYzsKLSAgY2hhciAqKmJ0eXBldmVjOwotICBpbnQgbnVtazsKLSAgaW50IG51bWI7Ci0gIGludCBrc2l6ZTsKLSAgaW50IGJzaXplOwotICBpbnQgbnR5cGVzOwotICBpbnQgdHlwZXZlY19zaXplOwotICBpbnQgY29uc3RydWN0b3I7Ci0gIGludCBkZXN0cnVjdG9yOwotICBpbnQgc3RhdGljX3R5cGU7CS8qIEEgc3RhdGljIG1lbWJlciBmdW5jdGlvbiAqLwotICBpbnQgdGVtcF9zdGFydDsgICAgICAgLyogaW5kZXggaW4gZGVtYW5nbGVkIHRvIHN0YXJ0IG9mIHRlbXBsYXRlIGFyZ3MgKi8KLSAgaW50IHR5cGVfcXVhbHM7ICAgICAgIC8qIFRoZSB0eXBlIHF1YWxpZmllcnMuICAqLwotICBpbnQgZGxsaW1wb3J0ZWQ7CS8qIFN5bWJvbCBpbXBvcnRlZCBmcm9tIGEgUEUgRExMICovCi0gIGNoYXIgKip0bXBsX2FyZ3ZlYzsgICAvKiBUZW1wbGF0ZSBmdW5jdGlvbiBhcmd1bWVudHMuICovCi0gIGludCBudG1wbF9hcmdzOyAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHRlbXBsYXRlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gKi8KLSAgaW50IGZvcmdldHRpbmdfdHlwZXM7IC8qIE5vbnplcm8gaWYgd2UgYXJlIG5vdCByZW1lbWJlcmluZyB0aGUgdHlwZXMKLQkJCSAgIHdlIHNlZS4gICovCi0gIHN0cmluZyogcHJldmlvdXNfYXJndW1lbnQ7IC8qIFRoZSBsYXN0IGZ1bmN0aW9uIGFyZ3VtZW50IGRlbWFuZ2xlZC4gICovCi0gIGludCBucmVwZWF0czsgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgcHJldmlvdXMKLQkJCSAgIGFyZ3VtZW50LiAgKi8KLX07Ci0KLSNkZWZpbmUgUFJJTlRfQU5TSV9RVUFMSUZJRVJTICh3b3JrIC0+IG9wdGlvbnMgJiBETUdMX0FOU0kpCi0jZGVmaW5lIFBSSU5UX0FSR19UWVBFUyAgICAgICAod29yayAtPiBvcHRpb25zICYgRE1HTF9QQVJBTVMpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0YWJsZQotewotICBjb25zdCBjaGFyICppbjsKLSAgY29uc3QgY2hhciAqb3V0OwotICBpbnQgZmxhZ3M7Ci19IG9wdGFibGVbXSA9IHsKLSAgeyJudyIsCSAgIiBuZXciLAlETUdMX0FOU0l9LAkvKiBuZXcgKDEuOTIsCSBhbnNpKSAqLwotICB7ImRsIiwJICAiIGRlbGV0ZSIsCURNR0xfQU5TSX0sCS8qIG5ldyAoMS45MiwJIGFuc2kpICovCi0gIHsibmV3IiwJICAiIG5ldyIsCTB9LAkJLyogb2xkICgxLjkxLAkgYW5kIDEueCkgKi8KLSAgeyJkZWxldGUiLAkgICIgZGVsZXRlIiwJMH0sCQkvKiBvbGQgKDEuOTEsCSBhbmQgMS54KSAqLwotICB7InZuIiwJICAiIG5ldyBbXSIsCURNR0xfQU5TSX0sCS8qIEdOVSwgcGVuZGluZyBhbnNpICovCi0gIHsidmQiLAkgICIgZGVsZXRlIFtdIiwJRE1HTF9BTlNJfSwJLyogR05VLCBwZW5kaW5nIGFuc2kgKi8KLSAgeyJhcyIsCSAgIj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7Im5lIiwJICAiIT0iLAkJRE1HTF9BTlNJfSwJLyogb2xkLCBhbnNpICovCi0gIHsiZXEiLAkgICI9PSIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KLSAgeyJnZSIsCSAgIj49IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwJYW5zaSAqLwotICB7Imd0IiwJICAiPiIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KLSAgeyJsZSIsCSAgIjw9IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwJYW5zaSAqLwotICB7Imx0IiwJICAiPCIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KLSAgeyJwbHVzIiwJICAiKyIsCQkwfSwJCS8qIG9sZCAqLwotICB7InBsIiwJICAiKyIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYXBsIiwJICAiKz0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7Im1pbnVzIiwJICAiLSIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im1pIiwJICAiLSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYW1pIiwJICAiLT0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7Im11bHQiLAkgICIqIiwJCTB9LAkJLyogb2xkICovCi0gIHsibWwiLAkgICIqIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhbXUiLAkgICIqPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpIChBUk0vTHVjaWQpICovCi0gIHsiYW1sIiwJICAiKj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAoR05VL2crKykgKi8KLSAgeyJjb252ZXJ0IiwJICAiKyIsCQkwfSwJCS8qIG9sZCAodW5hcnkgKykgKi8KLSAgeyJuZWdhdGUiLAkgICItIiwJCTB9LAkJLyogb2xkICh1bmFyeSAtKSAqLwotICB7InRydW5jX21vZCIsCSAgIiUiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJtZCIsCSAgIiUiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFtZCIsCSAgIiU9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJ0cnVuY19kaXYiLAkgICIvIiwJCTB9LAkJLyogb2xkICovCi0gIHsiZHYiLAkgICIvIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhZHYiLAkgICIvPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsidHJ1dGhfYW5kaWYiLCAiJiYiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJhYSIsCSAgIiYmIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJ0cnV0aF9vcmlmIiwgICJ8fCIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im9vIiwJICAifHwiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InRydXRoX25vdCIsCSAgIiEiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJudCIsCSAgIiEiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InBvc3RpbmNyZW1lbnQiLCIrKyIsCTB9LAkJLyogb2xkICovCi0gIHsicHAiLAkgICIrKyIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsicG9zdGRlY3JlbWVudCIsIi0tIiwJMH0sCQkvKiBvbGQgKi8KLSAgeyJtbSIsCSAgIi0tIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJiaXRfaW9yIiwJICAifCIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im9yIiwJICAifCIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYW9yIiwJICAifD0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImJpdF94b3IiLAkgICJeIiwJCTB9LAkJLyogb2xkICovCi0gIHsiZXIiLAkgICJeIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhZXIiLAkgICJePSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYml0X2FuZCIsCSAgIiYiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJhZCIsCSAgIiYiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFhZCIsCSAgIiY9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJiaXRfbm90IiwJICAifiIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImNvIiwJICAifiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiY2FsbCIsCSAgIigpIiwJCTB9LAkJLyogb2xkICovCi0gIHsiY2wiLAkgICIoKSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYWxzaGlmdCIsCSAgIjw8IiwJCTB9LAkJLyogb2xkICovCi0gIHsibHMiLAkgICI8PCIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYWxzIiwJICAiPDw9IiwJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFyc2hpZnQiLAkgICI+PiIsCQkwfSwJCS8qIG9sZCAqLwotICB7InJzIiwJICAiPj4iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFycyIsCSAgIj4+PSIsCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJjb21wb25lbnQiLAkgICItPiIsCQkwfSwJCS8qIG9sZCAqLwotICB7InB0IiwJICAiLT4iLAkJRE1HTF9BTlNJfSwJLyogYW5zaTsgTHVjaWQgQysrIGZvcm0gKi8KLSAgeyJyZiIsCSAgIi0+IiwJCURNR0xfQU5TSX0sCS8qIGFuc2k7IEFSTS9HTlUgZm9ybSAqLwotICB7ImluZGlyZWN0IiwJICAiKiIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im1ldGhvZF9jYWxsIiwgICItPigpIiwJMH0sCQkvKiBvbGQgKi8KLSAgeyJhZGRyIiwJICAiJiIsCQkwfSwJCS8qIG9sZCAodW5hcnkgJikgKi8KLSAgeyJhcnJheSIsCSAgIltdIiwJCTB9LAkJLyogb2xkICovCi0gIHsidmMiLAkgICJbXSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiY29tcG91bmQiLAkgICIsICIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImNtIiwJICAiLCAiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImNvbmQiLAkgICI/OiIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImNuIiwJICAiPzoiLAkJRE1HTF9BTlNJfSwJLyogcHNldWRvLWFuc2kgKi8KLSAgeyJtYXgiLAkgICI+PyIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im14IiwJICAiPj8iLAkJRE1HTF9BTlNJfSwJLyogcHNldWRvLWFuc2kgKi8KLSAgeyJtaW4iLAkgICI8PyIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im1uIiwJICAiPD8iLAkJRE1HTF9BTlNJfSwJLyogcHNldWRvLWFuc2kgKi8KLSAgeyJub3AiLAkgICIiLAkJMH0sCQkvKiBvbGQgKGZvciBvcGVyYXRvcj0pICovCi0gIHsicm0iLAkgICItPioiLAlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsic3oiLCAgICAgICAgICAic2l6ZW9mICIsICAgIERNR0xfQU5TSX0gICAgICAvKiBwc2V1ZG8tYW5zaSAqLwotfTsKLQotLyogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGluZGljYXRlIHRoZSB2YXJpb3VzIHR5cGUgdmFyaWV0aWVzLgotICAgVGhleSBhcmUgYWxsIG5vbi16ZXJvIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBhcyBgc3VjY2VzcycKLSAgIHZhbHVlcy4gICovCi10eXBlZGVmIGVudW0gdHlwZV9raW5kX3QKLXsKLSAgdGtfbm9uZSwKLSAgdGtfcG9pbnRlciwKLSAgdGtfcmVmZXJlbmNlLAotICB0a19pbnRlZ3JhbCwKLSAgdGtfYm9vbCwKLSAgdGtfY2hhciwKLSAgdGtfcmVhbAotfSB0eXBlX2tpbmRfdDsKLQotI2RlZmluZSBTVFJJTkdfRU1QVFkoc3RyKQkoKHN0cikgLT4gYiA9PSAoc3RyKSAtPiBwKQotI2RlZmluZSBQUkVQRU5EX0JMQU5LKHN0cikJe2lmICghU1RSSU5HX0VNUFRZKHN0cikpIFwKLSAgICBzdHJpbmdfcHJlcGVuZChzdHIsICIgIik7fQotI2RlZmluZSBBUFBFTkRfQkxBTksoc3RyKQl7aWYgKCFTVFJJTkdfRU1QVFkoc3RyKSkgXAotICAgIHN0cmluZ19hcHBlbmQoc3RyLCAiICIpO30KLSNkZWZpbmUgTEVOX1NUUklORyhzdHIpICAgICAgICAgKCAoU1RSSU5HX0VNUFRZKHN0cikpPzA6KChzdHIpLT5wIC0gKHN0ciktPmIpKQotCi0vKiBUaGUgc2NvcGUgc2VwYXJhdG9yIGFwcHJvcHJpYXRlIGZvciB0aGUgbGFuZ3VhZ2UgYmVpbmcgZGVtYW5nbGVkLiAgKi8KLQotI2RlZmluZSBTQ09QRV9TVFJJTkcod29yaykgKCh3b3JrLT5vcHRpb25zICYgRE1HTF9KQVZBKSA/ICIuIiA6ICI6OiIpCi0KLSNkZWZpbmUgQVJNX1ZUQUJMRV9TVFJJTkcgIl9fdnRibF9fIgkvKiBMdWNpZC9BUk0gdmlydHVhbCB0YWJsZSBwcmVmaXggKi8KLSNkZWZpbmUgQVJNX1ZUQUJMRV9TVFJMRU4gOAkJLyogc3RybGVuIChBUk1fVlRBQkxFX1NUUklORykgKi8KLQotLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBjaGFyICoKLW1vcF91cCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBzdHJpbmcgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1zcXVhbmdsZV9tb3BfdXAgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKikpOwotCi0jaWYgMAotc3RhdGljIGludAotZGVtYW5nbGVfbWV0aG9kX2FyZ3MgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqCi1pbnRlcm5hbF9jcGx1c19kZW1hbmdsZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfdGVtcGxhdGVfdGVtcGxhdGVfcGFybSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywKLQkJCQkJIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKiwKLQkJCSAgIHN0cmluZyAqLCBpbnQsIGludCkpOwotCi1zdGF0aWMgaW50Ci1hcm1fcHQgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiosCi0JCWNvbnN0IGNoYXIgKiopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfY2xhc3NfbmFtZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9xdWFsaWZpZWQgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICosCi0JCQkgICAgaW50LCBpbnQpKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfY2xhc3MgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfZnVuZF90eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3NpZ25hdHVyZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9wcmVmaXggUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZ251X3NwZWNpYWwgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotYXJtX3NwZWNpYWwgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19uZWVkIFBBUkFNUyAoKHN0cmluZyAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19kZWxldGUgUEFSQU1TICgoc3RyaW5nICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19pbml0IFBBUkFNUyAoKHN0cmluZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfY2xlYXIgUEFSQU1TICgoc3RyaW5nICopKTsKLQotI2lmIDAKLXN0YXRpYyBpbnQKLXN0cmluZ19lbXB0eSBQQVJBTVMgKChzdHJpbmcgKikpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kIFBBUkFNUyAoKHN0cmluZyAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmRzIFBBUkFNUyAoKHN0cmluZyAqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZG4gUEFSQU1TICgoc3RyaW5nICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZCBQQVJBTVMgKChzdHJpbmcgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZG4gUEFSQU1TICgoc3RyaW5nICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLWdldF9jb3VudCBQQVJBTVMgKChjb25zdCBjaGFyICoqLCBpbnQgKikpOwotCi1zdGF0aWMgaW50Ci1jb25zdW1lX2NvdW50IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiopKTsKLQotc3RhdGljIGludAotY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIFBBUkFNUyAoKGNvbnN0IGNoYXIqKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9hcmdzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX25lc3RlZF9hcmdzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmKiwgY29uc3QgY2hhcioqLCBzdHJpbmcqKSk7Ci0KLXN0YXRpYyBpbnQKLWRvX3R5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZG9fYXJnIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kZW1hbmdsZV9mdW5jdGlvbl9uYW1lIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqLAotCQkJCWNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfQnR5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCkpOwotCi1zdGF0aWMgaW50Ci1yZWdpc3Rlcl9CdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1yZW1lbWJlcl9LdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotZm9yZ2V0X3R5cGVzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICopKTsKLQotc3RhdGljIHZvaWQKLWZvcmdldF9CX2FuZF9LX3R5cGVzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kcyBQQVJBTVMgKChzdHJpbmcgKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiosIGNvbnN0IGNoYXIqKiwKLQkJCQkgICAgICBzdHJpbmcqLCB0eXBlX2tpbmRfdCkpOwotCi1zdGF0aWMgaW50Ci1kb19ocGFjY190ZW1wbGF0ZV9jb25zdF92YWx1ZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLXNuYXJmX251bWVyaWNfbGl0ZXJhbCBQQVJBTVMgKChjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi0vKiBUaGVyZSBpcyBhIFRZUEVfUVVBTCB2YWx1ZSBmb3IgZWFjaCB0eXBlIHF1YWxpZmllci4gIFRoZXkgY2FuIGJlCi0gICBjb21iaW5lZCBieSBiaXR3aXNlLW9yIHRvIGZvcm0gdGhlIGNvbXBsZXRlIHNldCBvZiBxdWFsaWZpZXJzIGZvciBhCi0gICB0eXBlLiAgKi8KLQotI2RlZmluZSBUWVBFX1VOUVVBTElGSUVEICAgMHgwCi0jZGVmaW5lIFRZUEVfUVVBTF9DT05TVCAgICAweDEKLSNkZWZpbmUgVFlQRV9RVUFMX1ZPTEFUSUxFIDB4MgotI2RlZmluZSBUWVBFX1FVQUxfUkVTVFJJQ1QgMHg0Ci0KLXN0YXRpYyBpbnQKLWNvZGVfZm9yX3F1YWxpZmllciBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIGNvbnN0IGNoYXIqCi1xdWFsaWZpZXJfc3RyaW5nIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgY29uc3QgY2hhcioKLWRlbWFuZ2xlX3F1YWxpZmllciBQQVJBTVMgKChpbnQpKTsKLQotLyogVHJhbnNsYXRlIGNvdW50IHRvIGludGVnZXIsIGNvbnN1bWluZyB0b2tlbnMgaW4gdGhlIHByb2Nlc3MuCi0gICBDb252ZXJzaW9uIHRlcm1pbmF0ZXMgb24gdGhlIGZpcnN0IG5vbi1kaWdpdCBjaGFyYWN0ZXIuCi0KLSAgIFRyeWluZyB0byBjb25zdW1lIHNvbWV0aGluZyB0aGF0IGlzbid0IGEgY291bnQgcmVzdWx0cyBpbiBubwotICAgY29uc3VtcHRpb24gb2YgaW5wdXQgYW5kIGEgcmV0dXJuIG9mIC0xLgotCi0gICBPdmVyZmxvdyBjb25zdW1lcyB0aGUgcmVzdCBvZiB0aGUgZGlnaXRzLCBhbmQgcmV0dXJucyAtMS4gICovCi0KLXN0YXRpYyBpbnQKLWNvbnN1bWVfY291bnQgKHR5cGUpCi0gICAgIGNvbnN0IGNoYXIgKip0eXBlOwotewotICBpbnQgY291bnQgPSAwOwotCi0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqdHlwZSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKnR5cGUpKQotICAgIHsKLSAgICAgIGNvdW50ICo9IDEwOwotCi0gICAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuCi0JIFdlIGFzc3VtZSB0aGF0IGNvdW50IGlzIHJlcHJlc2VudGVkIHVzaW5nIHR3bydzLWNvbXBsZW1lbnQ7Ci0JIG5vIHBvd2VyIG9mIHR3byBpcyBkaXZpc2libGUgYnkgdGVuLCBzbyBpZiBhbiBvdmVyZmxvdyBvY2N1cnMKLQkgd2hlbiBtdWx0aXBseWluZyBieSB0ZW4sIHRoZSByZXN1bHQgd2lsbCBub3QgYmUgYSBtdWx0aXBsZSBvZgotCSB0ZW4uICAqLwotICAgICAgaWYgKChjb3VudCAlIDEwKSAhPSAwKQotCXsKLQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKip0eXBlKSkKLQkgICAgKCp0eXBlKSsrOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgY291bnQgKz0gKip0eXBlIC0gJzAnOwotICAgICAgKCp0eXBlKSsrOwotICAgIH0KLQotICByZXR1cm4gKGNvdW50KTsKLX0KLQotCi0vKiBMaWtlIGNvbnN1bWVfY291bnQsIGJ1dCBmb3IgY291bnRzIHRoYXQgYXJlIHByZWNlZGVkIGFuZCBmb2xsb3dlZAotICAgYnkgJ18nIGlmIHRoZXkgYXJlIGdyZWF0ZXIgdGhhbiAxMC4gIEFsc28sIC0xIGlzIHJldHVybmVkIGZvcgotICAgZmFpbHVyZSwgc2luY2UgMCBjYW4gYmUgYSB2YWxpZCB2YWx1ZS4gICovCi0KLXN0YXRpYyBpbnQKLWNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCkKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci17Ci0gIGludCBpZHg7Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnXycpCi0gICAgewotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCXJldHVybiAtMTsKLQotICAgICAgaWR4ID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gICAgICBpZiAoKiptYW5nbGVkICE9ICdfJykKLQkvKiBUaGUgdHJhaWxpbmcgdW5kZXJzY29yZSB3YXMgbWlzc2luZy4gKi8KLQlyZXR1cm4gLTE7Ci0KLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKiptYW5nbGVkIDwgJzAnIHx8ICoqbWFuZ2xlZCA+ICc5JykKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIGlkeCA9ICoqbWFuZ2xlZCAtICcwJzsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogQyBpcyB0aGUgY29kZSBmb3IgYSB0eXBlLXF1YWxpZmllci4gIFJldHVybiB0aGUgVFlQRV9RVUFMCi0gICBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcXVhbGlmaWVyLiAgKi8KLQotc3RhdGljIGludAotY29kZV9mb3JfcXVhbGlmaWVyIChjKQotICBpbnQgYzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdDJzoKLSAgICAgIHJldHVybiBUWVBFX1FVQUxfQ09OU1Q7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgIHJldHVybiBUWVBFX1FVQUxfVk9MQVRJTEU7Ci0KLSAgICBjYXNlICd1JzoKLSAgICAgIHJldHVybiBUWVBFX1FVQUxfUkVTVFJJQ1Q7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEMgd2FzIGFuIGludmFsaWQgcXVhbGlmaWVyLiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHF1YWxpZmllcnMgZ2l2ZW4gYnkKLSAgIFRZUEVfUVVBTFMuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhcioKLXF1YWxpZmllcl9zdHJpbmcgKHR5cGVfcXVhbHMpCi0gICAgIGludCB0eXBlX3F1YWxzOwotewotICBzd2l0Y2ggKHR5cGVfcXVhbHMpCi0gICAgewotICAgIGNhc2UgVFlQRV9VTlFVQUxJRklFRDoKLSAgICAgIHJldHVybiAiIjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX0NPTlNUOgotICAgICAgcmV0dXJuICJjb25zdCI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9WT0xBVElMRToKLSAgICAgIHJldHVybiAidm9sYXRpbGUiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfUkVTVFJJQ1Q6Ci0gICAgICByZXR1cm4gIl9fcmVzdHJpY3QiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfQ09OU1QgfCBUWVBFX1FVQUxfVk9MQVRJTEU6Ci0gICAgICByZXR1cm4gImNvbnN0IHZvbGF0aWxlIjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX0NPTlNUIHwgVFlQRV9RVUFMX1JFU1RSSUNUOgotICAgICAgcmV0dXJuICJjb25zdCBfX3Jlc3RyaWN0IjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX1ZPTEFUSUxFIHwgVFlQRV9RVUFMX1JFU1RSSUNUOgotICAgICAgcmV0dXJuICJ2b2xhdGlsZSBfX3Jlc3RyaWN0IjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX0NPTlNUIHwgVFlQRV9RVUFMX1ZPTEFUSUxFIHwgVFlQRV9RVUFMX1JFU1RSSUNUOgotICAgICAgcmV0dXJuICJjb25zdCB2b2xhdGlsZSBfX3Jlc3RyaWN0IjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogVFlQRV9RVUFMUyB3YXMgYW4gaW52YWxpZCBxdWFsaWZpZXIgc2V0LiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIEMgaXMgdGhlIGNvZGUgZm9yIGEgdHlwZS1xdWFsaWZpZXIuICBSZXR1cm4gdGhlIHN0cmluZwotICAgY29ycmVzcG9uZGluZyB0byB0aGlzIHF1YWxpZmllci4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUKLSAgIGNhbGxlZCB3aXRoIGEgdmFsaWQgcXVhbGlmaWVyIGNvZGUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhcioKLWRlbWFuZ2xlX3F1YWxpZmllciAoYykKLSAgaW50IGM7Ci17Ci0gIHJldHVybiBxdWFsaWZpZXJfc3RyaW5nIChjb2RlX2Zvcl9xdWFsaWZpZXIgKGMpKTsKLX0KLQotaW50Ci1jcGx1c19kZW1hbmdsZV9vcG5hbWUgKG9wbmFtZSwgcmVzdWx0LCBvcHRpb25zKQotICAgICBjb25zdCBjaGFyICpvcG5hbWU7Ci0gICAgIGNoYXIgKnJlc3VsdDsKLSAgICAgaW50IG9wdGlvbnM7Ci17Ci0gIGludCBsZW4sIGxlbjEsIHJldDsKLSAgc3RyaW5nIHR5cGU7Ci0gIHN0cnVjdCB3b3JrX3N0dWZmIHdvcmtbMV07Ci0gIGNvbnN0IGNoYXIgKnRlbTsKLQotICBsZW4gPSBzdHJsZW4ob3BuYW1lKTsKLSAgcmVzdWx0WzBdID0gJ1wwJzsKLSAgcmV0ID0gMDsKLSAgbWVtc2V0ICgoY2hhciAqKSB3b3JrLCAwLCBzaXplb2YgKHdvcmspKTsKLSAgd29yay0+b3B0aW9ucyA9IG9wdGlvbnM7Ci0KLSAgaWYgKG9wbmFtZVswXSA9PSAnXycgJiYgb3BuYW1lWzFdID09ICdfJwotICAgICAgJiYgb3BuYW1lWzJdID09ICdvJyAmJiBvcG5hbWVbM10gPT0gJ3AnKQotICAgIHsKLSAgICAgIC8qIEFOU0kuICAqLwotICAgICAgLyogdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yLiAgKi8KLSAgICAgIHRlbSA9IG9wbmFtZSArIDQ7Ci0gICAgICBpZiAoZG9fdHlwZSAod29yaywgJnRlbSwgJnR5cGUpKQotCXsKLQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IgIik7Ci0JICBzdHJuY2F0IChyZXN1bHQsIHR5cGUuYiwgdHlwZS5wIC0gdHlwZS5iKTsKLQkgIHN0cmluZ19kZWxldGUgKCZ0eXBlKTsKLQkgIHJldCA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAob3BuYW1lWzBdID09ICdfJyAmJiBvcG5hbWVbMV0gPT0gJ18nCi0JICAgJiYgb3BuYW1lWzJdID49ICdhJyAmJiBvcG5hbWVbMl0gPD0gJ3onCi0JICAgJiYgb3BuYW1lWzNdID49ICdhJyAmJiBvcG5hbWVbM10gPD0gJ3onKQotICAgIHsKLSAgICAgIGlmIChvcG5hbWVbNF0gPT0gJ1wwJykKLQl7Ci0JICAvKiBPcGVyYXRvci4gICovCi0JICBzaXplX3QgaTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gMgotCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgb3BuYW1lICsgMiwgMikgPT0gMCkKLQkJewotCQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IiKTsKLQkJICBzdHJjYXQgKHJlc3VsdCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIHJldCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAob3BuYW1lWzJdID09ICdhJyAmJiBvcG5hbWVbNV0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIEFzc2lnbm1lbnQuICAqLwotCSAgICAgIHNpemVfdCBpOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCQl7Ci0JCSAgaWYgKHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gMwotCQkgICAgICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIG9wbmFtZSArIDIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IiKTsKLQkJICAgICAgc3RyY2F0IChyZXN1bHQsIG9wdGFibGVbaV0ub3V0KTsKLQkJICAgICAgcmV0ID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGxlbiA+PSAzCi0JICAgJiYgb3BuYW1lWzBdID09ICdvJwotCSAgICYmIG9wbmFtZVsxXSA9PSAncCcKLQkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsIG9wbmFtZVsyXSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBzZWUgaWYgaXQncyBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gKi8KLSAgICAgIGlmIChsZW4gPj0gMTAgLyogb3AkYXNzaWduXyAqLwotCSAgJiYgbWVtY21wIChvcG5hbWUgKyAzLCAiYXNzaWduXyIsIDcpID09IDApCi0JewotCSAgc2l6ZV90IGk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGxlbjEgPSBsZW4gLSAxMDsKLQkgICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSBsZW4xCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBvcG5hbWUgKyAxMCwgbGVuMSkgPT0gMCkKLQkJewotCQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IiKTsKLQkJICBzdHJjYXQgKHJlc3VsdCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIHN0cmNhdCAocmVzdWx0LCAiPSIpOwotCQkgIHJldCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzaXplX3QgaTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCSAgICB7Ci0JICAgICAgbGVuMSA9IGxlbiAtIDM7Ci0JICAgICAgaWYgKChpbnQpIHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gbGVuMQotCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgb3BuYW1lICsgMywgbGVuMSkgPT0gMCkKLQkJewotCQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IiKTsKLQkJICBzdHJjYXQgKHJlc3VsdCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIHJldCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGxlbiA+PSA1ICYmIG1lbWNtcCAob3BuYW1lLCAidHlwZSIsIDQpID09IDAKLQkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsIG9wbmFtZVs0XSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgKi8KLSAgICAgIHRlbSA9IG9wbmFtZSArIDU7Ci0gICAgICBpZiAoZG9fdHlwZSAod29yaywgJnRlbSwgJnR5cGUpKQotCXsKLQkgIHN0cmNhdCAocmVzdWx0LCAib3BlcmF0b3IgIik7Ci0JICBzdHJuY2F0IChyZXN1bHQsIHR5cGUuYiwgdHlwZS5wIC0gdHlwZS5iKTsKLQkgIHN0cmluZ19kZWxldGUgKCZ0eXBlKTsKLQkgIHJldCA9IDE7Ci0JfQotICAgIH0KLSAgc3F1YW5nbGVfbW9wX3VwICh3b3JrKTsKLSAgcmV0dXJuIHJldDsKLQotfQotLyogVGFrZXMgb3BlcmF0b3IgbmFtZSBhcyBlLmcuICIrKyIgYW5kIHJldHVybnMgbWFuZ2xlZAotICAgb3BlcmF0b3IgbmFtZSAoZS5nLiAicG9zdGluY3JlbWVudF9leHByIiksIG9yIE5VTEwgaWYgbm90IGZvdW5kLgotCi0gICBJZiBPUFRJT05TICYgRE1HTF9BTlNJID09IDEsIHJldHVybiB0aGUgQU5TSSBuYW1lOwotICAgaWYgT1BUSU9OUyAmIERNR0xfQU5TSSA9PSAwLCByZXR1cm4gdGhlIG9sZCBHTlUgbmFtZS4gICovCi0KLWNvbnN0IGNoYXIgKgotY3BsdXNfbWFuZ2xlX29wbmFtZSAob3BuYW1lLCBvcHRpb25zKQotICAgICBjb25zdCBjaGFyICpvcG5hbWU7Ci0gICAgIGludCBvcHRpb25zOwotewotICBzaXplX3QgaTsKLSAgaW50IGxlbjsKLQotICBsZW4gPSBzdHJsZW4gKG9wbmFtZSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotICAgIHsKLSAgICAgIGlmICgoaW50KSBzdHJsZW4gKG9wdGFibGVbaV0ub3V0KSA9PSBsZW4KLQkgICYmIChvcHRpb25zICYgRE1HTF9BTlNJKSA9PSAob3B0YWJsZVtpXS5mbGFncyAmIERNR0xfQU5TSSkKLQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5vdXQsIG9wbmFtZSwgbGVuKSA9PSAwKQotCXJldHVybiBvcHRhYmxlW2ldLmluOwotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KLQotLyogY2hhciAqY3BsdXNfZGVtYW5nbGUgKGNvbnN0IGNoYXIgKm1hbmdsZWQsIGludCBvcHRpb25zKQotCi0gICBJZiBNQU5HTEVEIGlzIGEgbWFuZ2xlZCBmdW5jdGlvbiBuYW1lIHByb2R1Y2VkIGJ5IEdOVSBDKyssIHRoZW4KLSAgIGEgcG9pbnRlciB0byBhIG1hbGxvY2VkIHN0cmluZyBnaXZpbmcgYSBDKysgcmVwcmVzZW50YXRpb24KLSAgIG9mIHRoZSBuYW1lIHdpbGwgYmUgcmV0dXJuZWQ7IG90aGVyd2lzZSBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCi0gICBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGUgc3RyaW5nIHdoaWNoCi0gICBpcyByZXR1cm5lZC4KLQotICAgVGhlIE9QVElPTlMgYXJnIG1heSBjb250YWluIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgYml0czoKLQotICAgCURNR0xfQU5TSQlBTlNJIHF1YWxpZmllcnMgc3VjaCBhcyBgY29uc3QnIGFuZCBgdm9pZCcgYXJlCi0JCQlpbmNsdWRlZC4KLQlETUdMX1BBUkFNUwlGdW5jdGlvbiBwYXJhbWV0ZXJzIGFyZSBpbmNsdWRlZC4KLQotICAgRm9yIGV4YW1wbGUsCi0KLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWkiLCBETUdMX1BBUkFNUykJCT0+ICJBOjpmb28oaW50KSIKLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWkiLCBETUdMX1BBUkFNUyB8IERNR0xfQU5TSSkJPT4gIkE6OmZvbyhpbnQpIgotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBaSIsIDApCQkJPT4gIkE6OmZvbyIKLQotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBZmUiLCBETUdMX1BBUkFNUykJCT0+ICJBOjpmb28oZmxvYXQsLi4uKSIKLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWZlIiwgRE1HTF9QQVJBTVMgfCBETUdMX0FOU0kpPT4gIkE6OmZvbyhmbG9hdCwuLi4pIgotICAgY3BsdXNfZGVtYW5nbGUgKCJmb29fXzFBZmUiLCAwKQkJCT0+ICJBOjpmb28iCi0KLSAgIE5vdGUgdGhhdCBhbnkgbGVhZGluZyB1bmRlcnNjb3Jlcywgb3Igb3RoZXIgc3VjaCBjaGFyYWN0ZXJzIHByZXBlbmRlZCBieQotICAgdGhlIGNvbXBpbGF0aW9uIHN5c3RlbSwgYXJlIHByZXN1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIHN0cmlwcGVkIGZyb20KLSAgIE1BTkdMRUQuICAqLwotCi1jaGFyICoKLWNwbHVzX2RlbWFuZ2xlIChtYW5nbGVkLCBvcHRpb25zKQotICAgICBjb25zdCBjaGFyICptYW5nbGVkOwotICAgICBpbnQgb3B0aW9uczsKLXsKLSAgY2hhciAqcmV0OwotICBzdHJ1Y3Qgd29ya19zdHVmZiB3b3JrWzFdOwotICBtZW1zZXQgKChjaGFyICopIHdvcmssIDAsIHNpemVvZiAod29yaykpOwotICB3b3JrIC0+IG9wdGlvbnMgPSBvcHRpb25zOwotICBpZiAoKHdvcmsgLT4gb3B0aW9ucyAmIERNR0xfU1RZTEVfTUFTSykgPT0gMCkKLSAgICB3b3JrIC0+IG9wdGlvbnMgfD0gKGludCkgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlICYgRE1HTF9TVFlMRV9NQVNLOwotCi0gIHJldCA9IGludGVybmFsX2NwbHVzX2RlbWFuZ2xlICh3b3JrLCBtYW5nbGVkKTsKLSAgc3F1YW5nbGVfbW9wX3VwICh3b3JrKTsKLSAgcmV0dXJuIChyZXQpOwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbW9zdCBvZiB3aGF0IGNwbHVzX2RlbWFuZ2xlIHVzZSB0byBkbywgYnV0Ci0gICB0byBiZSBhYmxlIHRvIGRlbWFuZ2xlIGEgbmFtZSB3aXRoIGEgQiwgSyBvciBuIGNvZGUsIHdlIG5lZWQgdG8KLSAgIGhhdmUgYSBsb25nZXIgdGVybSBtZW1vcnkgb2Ygd2hhdCB0eXBlcyBoYXZlIGJlZW4gc2Vlbi4gVGhlIG9yaWdpbmFsCi0gICBub3cgaW50aWFsaXplcyBhbmQgY2xlYW5zIHVwIHRoZSBzcXVhbmdsZSBjb2RlIGluZm8sIHdoaWxlIGludGVybmFsCi0gICBjYWxscyBnbyBkaXJlY3RseSB0byB0aGlzIHJvdXRpbmUgdG8gYXZvaWQgcmVzZXR0aW5nIHRoYXQgaW5mby4gKi8KLQotc3RhdGljIGNoYXIgKgotaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUgKHdvcmssIG1hbmdsZWQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICptYW5nbGVkOwotewotCi0gIHN0cmluZyBkZWNsOwotICBpbnQgc3VjY2VzcyA9IDA7Ci0gIGNoYXIgKmRlbWFuZ2xlZCA9IE5VTEw7Ci0gIGludCBzMSxzMixzMyxzNDsKLSAgczEgPSB3b3JrLT5jb25zdHJ1Y3RvcjsKLSAgczIgPSB3b3JrLT5kZXN0cnVjdG9yOwotICBzMyA9IHdvcmstPnN0YXRpY190eXBlOwotICBzNCA9IHdvcmstPnR5cGVfcXVhbHM7Ci0gIHdvcmstPmNvbnN0cnVjdG9yID0gd29yay0+ZGVzdHJ1Y3RvciA9IDA7Ci0gIHdvcmstPnR5cGVfcXVhbHMgPSBUWVBFX1VOUVVBTElGSUVEOwotICB3b3JrLT5kbGxpbXBvcnRlZCA9IDA7Ci0KLSAgaWYgKChtYW5nbGVkICE9IE5VTEwpICYmICgqbWFuZ2xlZCAhPSAnXDAnKSkKLSAgICB7Ci0gICAgICBzdHJpbmdfaW5pdCAoJmRlY2wpOwotCi0gICAgICAvKiBGaXJzdCBjaGVjayB0byBzZWUgaWYgZ251IHN0eWxlIGRlbWFuZ2xpbmcgaXMgYWN0aXZlIGFuZCBpZiB0aGUKLQkgc3RyaW5nIHRvIGJlIGRlbWFuZ2xlZCBjb250YWlucyBhIENQTFVTX01BUktFUi4gIElmIHNvLCBhdHRlbXB0IHRvCi0JIHJlY29nbml6ZSBvbmUgb2YgdGhlIGdudSBzcGVjaWFsIGZvcm1zIHJhdGhlciB0aGFuIGxvb2tpbmcgZm9yIGEKLQkgc3RhbmRhcmQgcHJlZml4LiAgSW4gcGFydGljdWxhciwgZG9uJ3Qgd29ycnkgYWJvdXQgd2hldGhlciB0aGVyZQotCSBpcyBhICJfXyIgc3RyaW5nIGluIHRoZSBtYW5nbGVkIHN0cmluZy4gIENvbnNpZGVyICJfJF81X19mb28iIGZvcgotCSBleGFtcGxlLiAgKi8KLQotICAgICAgaWYgKChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpKQotCXsKLQkgIHN1Y2Nlc3MgPSBnbnVfc3BlY2lhbCAod29yaywgJm1hbmdsZWQsICZkZWNsKTsKLQl9Ci0gICAgICBpZiAoIXN1Y2Nlc3MpCi0JewotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3ByZWZpeCAod29yaywgJm1hbmdsZWQsICZkZWNsKTsKLQl9Ci0gICAgICBpZiAoc3VjY2VzcyAmJiAoKm1hbmdsZWQgIT0gJ1wwJykpCi0JewotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3NpZ25hdHVyZSAod29yaywgJm1hbmdsZWQsICZkZWNsKTsKLQl9Ci0gICAgICBpZiAod29yay0+Y29uc3RydWN0b3IgPT0gMikKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgImdsb2JhbCBjb25zdHJ1Y3RvcnMga2V5ZWQgdG8gIik7Ci0gICAgICAgICAgd29yay0+Y29uc3RydWN0b3IgPSAwOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmICh3b3JrLT5kZXN0cnVjdG9yID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICJnbG9iYWwgZGVzdHJ1Y3RvcnMga2V5ZWQgdG8gIik7Ci0gICAgICAgICAgd29yay0+ZGVzdHJ1Y3RvciA9IDA7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHdvcmstPmRsbGltcG9ydGVkID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICJpbXBvcnQgc3R1YiBmb3IgIik7Ci0gICAgICAgICAgd29yay0+ZGxsaW1wb3J0ZWQgPSAwOwotICAgICAgICB9Ci0gICAgICBkZW1hbmdsZWQgPSBtb3BfdXAgKHdvcmssICZkZWNsLCBzdWNjZXNzKTsKLSAgICB9Ci0gIHdvcmstPmNvbnN0cnVjdG9yID0gczE7Ci0gIHdvcmstPmRlc3RydWN0b3IgPSBzMjsKLSAgd29yay0+c3RhdGljX3R5cGUgPSBzMzsKLSAgd29yay0+dHlwZV9xdWFscyA9IHM0OwotICByZXR1cm4gKGRlbWFuZ2xlZCk7Ci19Ci0KLQotLyogQ2xlYXIgb3V0IGFuZCBzcXVhbmdsaW5nIHJlbGF0ZWQgc3RvcmFnZSAqLwotc3RhdGljIHZvaWQKLXNxdWFuZ2xlX21vcF91cCAod29yaykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci17Ci0gIC8qIGNsZWFuIHVwIHRoZSBCIGFuZCBLIHR5cGUgbWFuZ2xpbmcgdHlwZXMuICovCi0gIGZvcmdldF9CX2FuZF9LX3R5cGVzICh3b3JrKTsKLSAgaWYgKHdvcmsgLT4gYnR5cGV2ZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICgoY2hhciAqKSB3b3JrIC0+IGJ0eXBldmVjKTsKLSAgICB9Ci0gIGlmICh3b3JrIC0+IGt0eXBldmVjICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoKGNoYXIgKikgd29yayAtPiBrdHlwZXZlYyk7Ci0gICAgfQotfQotCi0vKiBDbGVhciBvdXQgYW55IG1hbmdsZWQgc3RvcmFnZSAqLwotCi1zdGF0aWMgY2hhciAqCi1tb3BfdXAgKHdvcmssIGRlY2xwLCBzdWNjZXNzKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgc3RyaW5nICpkZWNscDsKLSAgICAgaW50IHN1Y2Nlc3M7Ci17Ci0gIGNoYXIgKmRlbWFuZ2xlZCA9IE5VTEw7Ci0KLSAgLyogRGlzY2FyZCB0aGUgcmVtZW1iZXJlZCB0eXBlcywgaWYgYW55LiAgKi8KLQotICBmb3JnZXRfdHlwZXMgKHdvcmspOwotICBpZiAod29yayAtPiB0eXBldmVjICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoKGNoYXIgKikgd29yayAtPiB0eXBldmVjKTsKLSAgICAgIHdvcmsgLT4gdHlwZXZlYyA9IE5VTEw7Ci0gICAgICB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSA9IDA7Ci0gICAgfQotICBpZiAod29yay0+dG1wbF9hcmd2ZWMpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCB3b3JrLT5udG1wbF9hcmdzOyBpKyspCi0JaWYgKHdvcmstPnRtcGxfYXJndmVjW2ldKQotCSAgZnJlZSAoKGNoYXIqKSB3b3JrLT50bXBsX2FyZ3ZlY1tpXSk7Ci0KLSAgICAgIGZyZWUgKChjaGFyKikgd29yay0+dG1wbF9hcmd2ZWMpOwotICAgICAgd29yay0+dG1wbF9hcmd2ZWMgPSBOVUxMOwotICAgIH0KLSAgaWYgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KQotICAgIHsKLSAgICAgIHN0cmluZ19kZWxldGUgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLSAgICAgIGZyZWUgKChjaGFyKikgd29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICAgICAgd29yay0+cHJldmlvdXNfYXJndW1lbnQgPSBOVUxMOwotICAgIH0KLQotICAvKiBJZiBkZW1hbmdsaW5nIHdhcyBzdWNjZXNzZnVsLCBlbnN1cmUgdGhhdCB0aGUgZGVtYW5nbGVkIHN0cmluZyBpcyBudWxsCi0gICAgIHRlcm1pbmF0ZWQgYW5kIHJldHVybiBpdC4gIE90aGVyd2lzZSwgZnJlZSB0aGUgZGVtYW5nbGluZyBkZWNsLiAgKi8KLQotICBpZiAoIXN1Y2Nlc3MpCi0gICAgewotICAgICAgc3RyaW5nX2RlbGV0ZSAoZGVjbHApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgIiIsIDEpOwotICAgICAgZGVtYW5nbGVkID0gZGVjbHAgLT4gYjsKLSAgICB9Ci0gIHJldHVybiAoZGVtYW5nbGVkKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWRlbWFuZ2xlX3NpZ25hdHVyZSAtLSBkZW1hbmdsZSB0aGUgc2lnbmF0dXJlIHBhcnQgb2YgYSBtYW5nbGVkIG5hbWUKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlkZW1hbmdsZV9zaWduYXR1cmUgKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqbWFuZ2xlZCwKLQkJCSAgICBzdHJpbmcgKmRlY2xwKTsKLQotREVTQ1JJUFRJT04KLQotCUNvbnN1bWUgYW5kIGRlbWFuZ2xlIHRoZSBzaWduYXR1cmUgcG9ydGlvbiBvZiB0aGUgbWFuZ2xlZCBuYW1lLgotCi0JREVDTFAgaXMgdGhlIHN0cmluZyB3aGVyZSBkZW1hbmdsZWQgb3V0cHV0IGlzIGJlaW5nIGJ1aWx0LiAgQXQKLQllbnRyeSBpdCBjb250YWlucyB0aGUgZGVtYW5nbGVkIHJvb3QgbmFtZSBmcm9tIHRoZSBtYW5nbGVkIG5hbWUKLQlwcmVmaXguICBJLkUuIGVpdGhlciBhIGRlbWFuZ2xlZCBvcGVyYXRvciBuYW1lIG9yIHRoZSByb290IGZ1bmN0aW9uCi0JbmFtZS4gIEluIHNvbWUgc3BlY2lhbCBjYXNlcywgaXQgbWF5IGNvbnRhaW4gbm90aGluZy4KLQotCSpNQU5HTEVEIHBvaW50cyB0byB0aGUgY3VycmVudCB1bmNvbnN1bWVkIGxvY2F0aW9uIGluIHRoZSBtYW5nbGVkCi0JbmFtZS4gIEFzIHRva2VucyBhcmUgY29uc3VtZWQgYW5kIGRlbWFuZ2xpbmcgaXMgcGVyZm9ybWVkLCB0aGUKLQlwb2ludGVyIGlzIHVwZGF0ZWQgdG8gY29udGludW91c2x5IHBvaW50IGF0IHRoZSBuZXh0IHRva2VuIHRvCi0JYmUgY29uc3VtZWQuCi0KLQlEZW1hbmdsaW5nIEdOVSBzdHlsZSBtYW5nbGVkIG5hbWVzIGlzIG5hc3R5IGJlY2F1c2UgdGhlcmUgaXMgbm8KLQlleHBsaWNpdCB0b2tlbiB0aGF0IG1hcmtzIHRoZSBzdGFydCBvZiB0aGUgb3V0ZXJtb3N0IGZ1bmN0aW9uCi0JYXJndW1lbnQgbGlzdC4gICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3NpZ25hdHVyZSAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBpbnQgZnVuY19kb25lID0gMDsKLSAgaW50IGV4cGVjdF9mdW5jID0gMDsKLSAgaW50IGV4cGVjdF9yZXR1cm5fdHlwZSA9IDA7Ci0gIGNvbnN0IGNoYXIgKm9sZG1hbmdsZWQgPSBOVUxMOwotICBzdHJpbmcgdHJhd25hbWU7Ci0gIHN0cmluZyB0bmFtZTsKLQotICB3aGlsZSAoc3VjY2VzcyAmJiAoKiptYW5nbGVkICE9ICdcMCcpKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQljYXNlICdRJzoKLQkgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAxLCAwKTsKLQkgIGlmIChzdWNjZXNzKQotCSAgICByZW1lbWJlcl90eXBlICh3b3JrLCBvbGRtYW5nbGVkLCAqbWFuZ2xlZCAtIG9sZG1hbmdsZWQpOwotCSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykKLQkgICAgZXhwZWN0X2Z1bmMgPSAxOwotCSAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICBicmVhazsKLQotICAgICAgICBjYXNlICdLJzoKLQkgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAxLCAwKTsKLQkgIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICBleHBlY3RfZnVuYyA9IDE7Ci0JICAgIH0KLQkgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlICdTJzoKLQkgIC8qIFN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gKi8KLQkgIGlmIChvbGRtYW5nbGVkID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICAgIH0KLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHdvcmsgLT4gc3RhdGljX3R5cGUgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdDJzoKLQljYXNlICdWJzoKLQljYXNlICd1JzoKLQkgIHdvcmstPnR5cGVfcXVhbHMgfD0gY29kZV9mb3JfcXVhbGlmaWVyICgqKm1hbmdsZWQpOwotCi0JICAvKiBhIHF1YWxpZmllZCBtZW1iZXIgZnVuY3Rpb24gKi8KLQkgIGlmIChvbGRtYW5nbGVkID09IE5VTEwpCi0JICAgIG9sZG1hbmdsZWQgPSAqbWFuZ2xlZDsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnTCc6Ci0JICAvKiBMb2NhbCBjbGFzcyBuYW1lIGZvbGxvd3MgYWZ0ZXIgIkxubm5fIiAqLwotCSAgaWYgKEhQX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICB3aGlsZSAoKiptYW5nbGVkICYmICgqKm1hbmdsZWQgIT0gJ18nKSkKLQkJKCptYW5nbGVkKSsrOwotCSAgICAgIGlmICghKiptYW5nbGVkKQotCQlzdWNjZXNzID0gMDsKLQkgICAgICBlbHNlCi0JCSgqbWFuZ2xlZCkrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzdWNjZXNzID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkgIGlmIChvbGRtYW5nbGVkID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICAgIH0KLSAgICAgICAgICB3b3JrLT50ZW1wX3N0YXJ0ID0gLTE7IC8qIHVwcGVybW9zdCBjYWxsIHRvIGRlbWFuZ2xlX2NsYXNzICovCi0JICBzdWNjZXNzID0gZGVtYW5nbGVfY2xhc3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQkgIGlmIChzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgcmVtZW1iZXJfdHlwZSAod29yaywgb2xkbWFuZ2xlZCwgKm1hbmdsZWQgLSBvbGRtYW5nbGVkKTsKLQkgICAgfQotCSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLQkgICAgewotICAgICAgICAgICAgICAvKiBFREcgYW5kIG90aGVycyB3aWxsIGhhdmUgdGhlICJGIiwgc28gd2UgbGV0IHRoZSBsb29wIGN5Y2xlCi0gICAgICAgICAgICAgICAgIGlmIHdlIGFyZSBsb29raW5nIGF0IG9uZS4gKi8KLSAgICAgICAgICAgICAgaWYgKCoqbWFuZ2xlZCAhPSAnRicpCi0gICAgICAgICAgICAgICAgIGV4cGVjdF9mdW5jID0gMTsKLQkgICAgfQotCSAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgJ0InOgotCSAgewotCSAgICBzdHJpbmcgczsKLQkgICAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZzKTsKLQkgICAgaWYgKHN1Y2Nlc3MpCi0JICAgICAgewotCQlzdHJpbmdfYXBwZW5kICgmcywgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0JCXN0cmluZ19wcmVwZW5kcyAoZGVjbHAsICZzKTsKLQkgICAgICB9Ci0JICAgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgICBleHBlY3RfZnVuYyA9IDE7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ0YnOgotCSAgLyogRnVuY3Rpb24gKi8KLQkgIC8qIEFSTS9IUCBzdHlsZSBkZW1hbmdsaW5nIGluY2x1ZGVzIGEgc3BlY2lmaWMgJ0YnIGNoYXJhY3RlciBhZnRlcgotCSAgICAgdGhlIGNsYXNzIG5hbWUuICBGb3IgR05VIHN0eWxlLCBpdCBpcyBqdXN0IGltcGxpZWQuICBTbyB3ZSBjYW4KLQkgICAgIHNhZmVseSBqdXN0IGNvbnN1bWUgYW55ICdGJyBhdCB0aGlzIHBvaW50IGFuZCBiZSBjb21wYXRpYmxlCi0JICAgICB3aXRoIGVpdGhlciBzdHlsZS4gICovCi0KLQkgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgZnVuY19kb25lID0gMTsKLQkgICgqbWFuZ2xlZCkrKzsKLQotCSAgLyogRm9yIGx1Y2lkL0FSTS9IUCBzdHlsZSB3ZSBoYXZlIHRvIGZvcmdldCBhbnkgdHlwZXMgd2UgbWlnaHQKLQkgICAgIGhhdmUgcmVtZW1iZXJlZCB1cCB0byB0aGlzIHBvaW50LCBzaW5jZSB0aGV5IHdlcmUgbm90IGFyZ3VtZW50Ci0JICAgICB0eXBlcy4gIEdOVSBzdHlsZSBjb25zaWRlcnMgYWxsIHR5cGVzIHNlZW4gYXMgYXZhaWxhYmxlIGZvcgotCSAgICAgYmFjayByZWZlcmVuY2VzLiAgU2VlIGNvbW1lbnQgaW4gZGVtYW5nbGVfYXJncygpICovCi0KLQkgIGlmIChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICBmb3JnZXRfdHlwZXMgKHdvcmspOwotCSAgICB9Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCSAgLyogQWZ0ZXIgcGlja2luZyBvZmYgdGhlIGZ1bmN0aW9uIGFyZ3MsIHdlIGV4cGVjdCB0byBlaXRoZXIKLQkgICAgIGZpbmQgdGhlIGZ1bmN0aW9uIHJldHVybiB0eXBlIChwcmVjZWRlZCBieSBhbiAnXycpIG9yIHRoZQotCSAgICAgZW5kIG9mIHRoZSBzdHJpbmcuICovCi0JICBpZiAoc3VjY2VzcyAmJiAoQVVUT19ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKSAmJiAqKm1hbmdsZWQgPT0gJ18nKQotCSAgICB7Ci0JICAgICAgKysoKm1hbmdsZWQpOwotICAgICAgICAgICAgICAvKiBBdCB0aGlzIGxldmVsLCB3ZSBkbyBub3QgY2FyZSBhYm91dCB0aGUgcmV0dXJuIHR5cGUuICovCi0gICAgICAgICAgICAgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdG5hbWUpOwotICAgICAgICAgICAgICBzdHJpbmdfZGVsZXRlICgmdG5hbWUpOwotICAgICAgICAgICAgfQotCi0JICBicmVhazsKLQotCWNhc2UgJ3QnOgotCSAgLyogRysrIFRlbXBsYXRlICovCi0JICBzdHJpbmdfaW5pdCgmdHJhd25hbWUpOwotCSAgc3RyaW5nX2luaXQoJnRuYW1lKTsKLQkgIGlmIChvbGRtYW5nbGVkID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICAgIH0KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgJnRuYW1lLAotCQkJCSAgICAgICAmdHJhd25hbWUsIDEsIDEpOwotCSAgaWYgKHN1Y2Nlc3MpCi0JICAgIHsKLQkgICAgICByZW1lbWJlcl90eXBlICh3b3JrLCBvbGRtYW5nbGVkLCAqbWFuZ2xlZCAtIG9sZG1hbmdsZWQpOwotCSAgICB9Ci0JICBzdHJpbmdfYXBwZW5kICgmdG5hbWUsIFNDT1BFX1NUUklORyAod29yaykpOwotCi0JICBzdHJpbmdfcHJlcGVuZHMoZGVjbHAsICZ0bmFtZSk7Ci0JICBpZiAod29yayAtPiBkZXN0cnVjdG9yICYgMSkKLQkgICAgewotCSAgICAgIHN0cmluZ19wcmVwZW5kICgmdHJhd25hbWUsICJ+Iik7Ci0JICAgICAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmdHJhd25hbWUpOwotCSAgICAgIHdvcmstPmRlc3RydWN0b3IgLT0gMTsKLQkgICAgfQotCSAgaWYgKCh3b3JrLT5jb25zdHJ1Y3RvciAmIDEpIHx8ICh3b3JrLT5kZXN0cnVjdG9yICYgMSkpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZ0cmF3bmFtZSk7Ci0JICAgICAgd29yay0+Y29uc3RydWN0b3IgLT0gMTsKLQkgICAgfQotCSAgc3RyaW5nX2RlbGV0ZSgmdHJhd25hbWUpOwotCSAgc3RyaW5nX2RlbGV0ZSgmdG5hbWUpOwotCSAgb2xkbWFuZ2xlZCA9IE5VTEw7Ci0JICBleHBlY3RfZnVuYyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ18nOgotCSAgaWYgKEdOVV9ERU1BTkdMSU5HICYmIGV4cGVjdF9yZXR1cm5fdHlwZSkKLQkgICAgewotCSAgICAgIC8qIFJlYWQgdGhlIHJldHVybiB0eXBlLiAqLwotCSAgICAgIHN0cmluZyByZXR1cm5fdHlwZTsKLQkgICAgICBzdHJpbmdfaW5pdCAoJnJldHVybl90eXBlKTsKLQotCSAgICAgICgqbWFuZ2xlZCkrKzsKLQkgICAgICBzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJnJldHVybl90eXBlKTsKLQkgICAgICBBUFBFTkRfQkxBTksgKCZyZXR1cm5fdHlwZSk7Ci0KLQkgICAgICBzdHJpbmdfcHJlcGVuZHMgKGRlY2xwLCAmcmV0dXJuX3R5cGUpOwotCSAgICAgIHN0cmluZ19kZWxldGUgKCZyZXR1cm5fdHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgLyogQXQgdGhlIG91dGVybW9zdCBsZXZlbCwgd2UgY2Fubm90IGhhdmUgYSByZXR1cm4gdHlwZSBzcGVjaWZpZWQsCi0JICAgICAgIHNvIGlmIHdlIHJ1biBpbnRvIGFub3RoZXIgJ18nIGF0IHRoaXMgcG9pbnQgd2UgYXJlIGRlYWxpbmcgd2l0aAotCSAgICAgICBhIG1hbmdsZWQgbmFtZSB0aGF0IGlzIGVpdGhlciBib2d1cywgb3IgaGFzIGJlZW4gbWFuZ2xlZCBieQotCSAgICAgICBzb21lIGFsZ29yaXRobSB3ZSBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGguICBTbyBqdXN0Ci0JICAgICAgIHJlamVjdCB0aGUgZW50aXJlIGRlbWFuZ2xpbmcuICAqLwotICAgICAgICAgICAgLyogSG93ZXZlciwgIl9ubm4iIGlzIGFuIGV4cGVjdGVkIHN1ZmZpeCBmb3IgYWx0ZXJuYXRlIGVudHJ5IHBvaW50Ci0gICAgICAgICAgICAgICBudW1iZXJlZCBubm4gZm9yIGEgZnVuY3Rpb24sIHdpdGggSFAgYUNDLCBzbyBza2lwIG92ZXIgdGhhdAotICAgICAgICAgICAgICAgd2l0aG91dCByZXBvcnRpbmcgZmFpbHVyZS4gcGFpLzE5OTctMDktMDQgKi8KLSAgICAgICAgICAgIGlmIChIUF9ERU1BTkdMSU5HKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgICAgICAgICAgIHdoaWxlICgqKm1hbmdsZWQgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLSAgICAgICAgICAgICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdIJzoKLQkgIGlmIChHTlVfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIC8qIEEgRysrIHRlbXBsYXRlIGZ1bmN0aW9uLiAgUmVhZCB0aGUgdGVtcGxhdGUgYXJndW1lbnRzLiAqLwotCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDAsCi0JCQkJCSAgIDApOwotCSAgICAgIGlmICghKHdvcmstPmNvbnN0cnVjdG9yICYgMSkpCi0JCWV4cGVjdF9yZXR1cm5fdHlwZSA9IDE7Ci0JICAgICAgKCptYW5nbGVkKSsrOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCSAgICB7O30KLQotCWRlZmF1bHQ6Ci0JICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgLyogQXNzdW1lIHdlIGhhdmUgc3R1bWJsZWQgb250byB0aGUgZmlyc3Qgb3V0ZXJtb3N0IGZ1bmN0aW9uCi0JCSBhcmd1bWVudCB0b2tlbiwgYW5kIHN0YXJ0IHByb2Nlc3NpbmcgYXJncy4gICovCi0JICAgICAgZnVuY19kb25lID0gMTsKLQkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBOb24tR05VIGRlbWFuZ2xlcnMgdXNlIGEgc3BlY2lmaWMgdG9rZW4gdG8gbWFyayB0aGUgc3RhcnQKLQkJIG9mIHRoZSBvdXRlcm1vc3QgZnVuY3Rpb24gYXJndW1lbnQgdG9rZW5zLiAgVHlwaWNhbGx5ICdGJywKLQkJIGZvciBBUk0vSFAtZGVtYW5nbGluZywgZm9yIGV4YW1wbGUuICBTbyBpZiB3ZSBmaW5kIHNvbWV0aGluZwotCQkgd2UgYXJlIG5vdCBwcmVwYXJlZCBmb3IsIGl0IG11c3QgYmUgYW4gZXJyb3IuICAqLwotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKgotCWlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpCi0JKi8KLSAgICAgIHsKLQlpZiAoc3VjY2VzcyAmJiBleHBlY3RfZnVuYykKLQkgIHsKLQkgICAgZnVuY19kb25lID0gMTsKLSAgICAgICAgICAgICAgaWYgKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZm9yZ2V0X3R5cGVzICh3b3JrKTsKLSAgICAgICAgICAgICAgICB9Ci0JICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JICAgIC8qIFNpbmNlIHRlbXBsYXRlIGluY2x1ZGUgdGhlIG1hbmdsaW5nIG9mIHRoZWlyIHJldHVybiB0eXBlcywKLQkgICAgICAgd2UgbXVzdCBzZXQgZXhwZWN0X2Z1bmMgdG8gMCBzbyB0aGF0IHdlIGRvbid0IHRyeSBkbwotCSAgICAgICBkZW1hbmdsZSBtb3JlIGFyZ3VtZW50cyB0aGUgbmV4dCB0aW1lIHdlIGdldCBoZXJlLiAgKi8KLQkgICAgZXhwZWN0X2Z1bmMgPSAwOwotCSAgfQotICAgICAgfQotICAgIH0KLSAgaWYgKHN1Y2Nlc3MgJiYgIWZ1bmNfZG9uZSkKLSAgICB7Ci0gICAgICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQotCXsKLQkgIC8qIFdpdGggR05VIHN0eWxlIGRlbWFuZ2xpbmcsIGJhcl9fM2ZvbyBpcyAnZm9vOjpiYXIodm9pZCknLCBhbmQKLQkgICAgIGJhcl9fM2Zvb2kgaXMgJ2Zvbzo6YmFyKGludCknLiAgV2UgZ2V0IGhlcmUgd2hlbiB3ZSBmaW5kIHRoZQotCSAgICAgZmlyc3QgY2FzZSwgYW5kIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlICcodm9pZCknIGdldHMgYWRkZWQgdG8KLQkgICAgIHRoZSBjdXJyZW50IGRlY2xwLiAgTm90ZSB0aGF0IHdpdGggQVJNL0hQLCB0aGUgZmlyc3QgY2FzZQotCSAgICAgcmVwcmVzZW50cyB0aGUgbmFtZSBvZiBhIHN0YXRpYyBkYXRhIG1lbWJlciAnZm9vOjpiYXInLAotCSAgICAgd2hpY2ggaXMgaW4gdGhlIGN1cnJlbnQgZGVjbHAsIHNvIHdlIGxlYXZlIGl0IGFsb25lLiAgKi8KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JfQotICAgIH0KLSAgaWYgKHN1Y2Nlc3MgJiYgUFJJTlRfQVJHX1RZUEVTKQotICAgIHsKLSAgICAgIGlmICh3b3JrLT5zdGF0aWNfdHlwZSkKLQlzdHJpbmdfYXBwZW5kIChkZWNscCwgIiBzdGF0aWMiKTsKLSAgICAgIGlmICh3b3JrLT50eXBlX3F1YWxzICE9IFRZUEVfVU5RVUFMSUZJRUQpCi0JewotCSAgQVBQRU5EX0JMQU5LIChkZWNscCk7Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgcXVhbGlmaWVyX3N0cmluZyAod29yay0+dHlwZV9xdWFscykpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotI2lmIDAKLQotc3RhdGljIGludAotZGVtYW5nbGVfbWV0aG9kX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGludCBzdWNjZXNzID0gMDsKLQotICBpZiAod29yayAtPiBzdGF0aWNfdHlwZSkKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQgKyAxKTsKLSAgICAgICptYW5nbGVkICs9IHN0cmxlbiAoKm1hbmdsZWQpOwotICAgICAgc3VjY2VzcyA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLSAgICB9Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCB0bmFtZSkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnRuYW1lOwotewotICBpbnQgaTsKLSAgaW50IHI7Ci0gIGludCBuZWVkX2NvbW1hID0gMDsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBzdHJpbmcgdGVtcDsKLQotICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgInRlbXBsYXRlIDwiKTsKLSAgLyogZ2V0IHNpemUgb2YgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3QgKi8KLSAgaWYgKGdldF9jb3VudCAobWFuZ2xlZCwgJnIpKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCByOyBpKyspCi0JewotCSAgaWYgKG5lZWRfY29tbWEpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiwgIik7Ci0JICAgIH0KLQotCSAgICAvKiBaIGZvciB0eXBlIHBhcmFtZXRlcnMgKi8KLQkgICAgaWYgKCoqbWFuZ2xlZCA9PSAnWicpCi0JICAgICAgewotCQkoKm1hbmdsZWQpKys7Ci0JCXN0cmluZ19hcHBlbmQgKHRuYW1lLCAiY2xhc3MiKTsKLQkgICAgICB9Ci0JICAgICAgLyogeiBmb3IgdGVtcGxhdGUgcGFyYW1ldGVycyAqLwotCSAgICBlbHNlIGlmICgqKm1hbmdsZWQgPT0gJ3onKQotCSAgICAgIHsKLQkJKCptYW5nbGVkKSsrOwotCQlzdWNjZXNzID0KLQkJICBkZW1hbmdsZV90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCB0bmFtZSk7Ci0JCWlmICghc3VjY2VzcykKLQkJICB7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKiB0ZW1wIGlzIGluaXRpYWxpemVkIGluIGRvX3R5cGUgKi8KLQkJc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZ0ZW1wKTsKLQkJaWYgKHN1Y2Nlc3MpCi0JCSAgewotCQkgICAgc3RyaW5nX2FwcGVuZHMgKHRuYW1lLCAmdGVtcCk7Ci0JCSAgfQotCQlzdHJpbmdfZGVsZXRlKCZ0ZW1wKTsKLQkJaWYgKCFzdWNjZXNzKQotCQkgIHsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICBuZWVkX2NvbW1hID0gMTsKLQl9Ci0KLSAgICB9Ci0gIGlmICh0bmFtZS0+cFstMV0gPT0gJz4nKQotICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiICIpOwotICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIj4gY2xhc3MiKTsKLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotc3RhdGljIGludAotZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUgKHdvcmssIG1hbmdsZWQsIHMpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyKiogbWFuZ2xlZDsKLSAgICAgc3RyaW5nKiBzOwotewotICBpbnQgc3VjY2VzczsKLQotICBpZiAoKiptYW5nbGVkID09ICdFJykKLSAgICB7Ci0gICAgICBpbnQgbmVlZF9vcGVyYXRvciA9IDA7Ci0KLSAgICAgIHN1Y2Nlc3MgPSAxOwotICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICIoIiwgMSk7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICB3aGlsZSAoc3VjY2VzcyAmJiAqKm1hbmdsZWQgIT0gJ1cnICYmICoqbWFuZ2xlZCAhPSAnXDAnKQotCXsKLQkgIGlmIChuZWVkX29wZXJhdG9yKQotCSAgICB7Ci0JICAgICAgc2l6ZV90IGk7Ci0JICAgICAgc2l6ZV90IGxlbjsKLQotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCi0JICAgICAgbGVuID0gc3RybGVuICgqbWFuZ2xlZCk7Ci0KLQkgICAgICBmb3IgKGkgPSAwOwotCQkgICBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZSBbMF0pOwotCQkgICArK2kpCi0JCXsKLQkJICBzaXplX3QgbCA9IHN0cmxlbiAob3B0YWJsZVtpXS5pbik7Ci0KLQkJICBpZiAobCA8PSBsZW4KLQkJICAgICAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCAqbWFuZ2xlZCwgbCkgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICIgIiwgMSk7Ci0JCSAgICAgIHN0cmluZ19hcHBlbmQgKHMsIG9wdGFibGVbaV0ub3V0KTsKLQkJICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICIgIiwgMSk7Ci0JCSAgICAgIHN1Y2Nlc3MgPSAxOwotCQkgICAgICAoKm1hbmdsZWQpICs9IGw7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoIXN1Y2Nlc3MpCi0JCWJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIG5lZWRfb3BlcmF0b3IgPSAxOwotCi0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSAod29yaywgbWFuZ2xlZCwgcywKLQkJCQkJCSAgdGtfaW50ZWdyYWwpOwotCX0KLQotICAgICAgaWYgKCoqbWFuZ2xlZCAhPSAnVycpCi0JICBzdWNjZXNzID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgIikiLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQl9Ci0gICAgfQotICBlbHNlIGlmICgqKm1hbmdsZWQgPT0gJ1EnIHx8ICoqbWFuZ2xlZCA9PSAnSycpCi0gICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgcywgMCwgMSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdWNjZXNzID0gMDsKLQotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnbScpCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICItIiwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICptYW5nbGVkLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHN1Y2Nlc3MgPSAxOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHMsIHRrKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyogczsKLSAgICAgdHlwZV9raW5kX3QgdGs7Ci17Ci0gIGludCBzdWNjZXNzID0gMTsKLQotICBpZiAoKiptYW5nbGVkID09ICdZJykKLSAgICB7Ci0gICAgICAvKiBUaGUgbmV4dCBhcmd1bWVudCBpcyBhIHRlbXBsYXRlIHBhcmFtZXRlci4gKi8KLSAgICAgIGludCBpZHg7Ci0KLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIGlkeCA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0gICAgICBpZiAoaWR4ID09IC0xCi0JICB8fCAod29yay0+dG1wbF9hcmd2ZWMgJiYgaWR4ID49IHdvcmstPm50bXBsX2FyZ3MpCi0JICB8fCBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpID09IC0xKQotCXJldHVybiAtMTsKLSAgICAgIGlmICh3b3JrLT50bXBsX2FyZ3ZlYykKLQlzdHJpbmdfYXBwZW5kIChzLCB3b3JrLT50bXBsX2FyZ3ZlY1tpZHhdKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyIGJ1ZlsxMF07Ci0JICBzcHJpbnRmKGJ1ZiwgIlQlZCIsIGlkeCk7Ci0JICBzdHJpbmdfYXBwZW5kIChzLCBidWYpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHRrID09IHRrX2ludGVncmFsKQotICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9pbnRlZ3JhbF92YWx1ZSAod29yaywgbWFuZ2xlZCwgcyk7Ci0gIGVsc2UgaWYgKHRrID09IHRrX2NoYXIpCi0gICAgewotICAgICAgY2hhciB0bXBbMl07Ci0gICAgICBpbnQgdmFsOwotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnbScpCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICItIiwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICInIiwgMSk7Ci0gICAgICB2YWwgPSBjb25zdW1lX2NvdW50KG1hbmdsZWQpOwotICAgICAgaWYgKHZhbCA8PSAwKQotCXN1Y2Nlc3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIHRtcFswXSA9IChjaGFyKXZhbDsKLQkgIHRtcFsxXSA9ICdcMCc7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgJnRtcFswXSwgMSk7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgIiciLCAxKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmICh0ayA9PSB0a19ib29sKQotICAgIHsKLSAgICAgIGludCB2YWwgPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgICAgIGlmICh2YWwgPT0gMCkKLQlzdHJpbmdfYXBwZW5kbiAocywgImZhbHNlIiwgNSk7Ci0gICAgICBlbHNlIGlmICh2YWwgPT0gMSkKLQlzdHJpbmdfYXBwZW5kbiAocywgInRydWUiLCA0KTsKLSAgICAgIGVsc2UKLQlzdWNjZXNzID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHRrID09IHRrX3JlYWwpCi0gICAgewotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnbScpCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICItIiwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICptYW5nbGVkLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQl9Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICcuJykgLyogZnJhY3Rpb24gKi8KLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgIi4iLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICptYW5nbGVkLCAxKTsKLQkgICAgICAoKm1hbmdsZWQpKys7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICdlJykgLyogZXhwb25lbnQgKi8KLQl7Ci0JICBzdHJpbmdfYXBwZW5kbiAocywgImUiLCAxKTsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZG4gKHMsICptYW5nbGVkLCAxKTsKLQkgICAgICAoKm1hbmdsZWQpKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmICh0ayA9PSB0a19wb2ludGVyIHx8IHRrID09IHRrX3JlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBpbnQgc3ltYm9sX2xlbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotICAgICAgaWYgKHN5bWJvbF9sZW4gPT0gLTEpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHN5bWJvbF9sZW4gPT0gMCkKLQlzdHJpbmdfYXBwZW5kbiAocywgIjAiLCAxKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpwID0geG1hbGxvYyAoc3ltYm9sX2xlbiArIDEpLCAqcTsKLQkgIHN0cm5jcHkgKHAsICptYW5nbGVkLCBzeW1ib2xfbGVuKTsKLQkgIHAgW3N5bWJvbF9sZW5dID0gJ1wwJzsKLQkgIC8qIFdlIHVzZSBjcGx1c19kZW1hbmdsZSBoZXJlLCByYXRoZXIgdGhhbgotCSAgICAgaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUsIGJlY2F1c2UgdGhlIG5hbWUgb2YgdGhlIGVudGl0eQotCSAgICAgbWFuZ2xlZCBoZXJlIGRvZXMgbm90IG1ha2UgdXNlIG9mIGFueSBvZiB0aGUgc3F1YW5nbGluZwotCSAgICAgb3IgdHlwZS1jb2RlIGluZm9ybWF0aW9uIHdlIGhhdmUgYnVpbHQgdXAgdGh1cyBmYXI7IGl0IGlzCi0JICAgICBtYW5nbGVkIGluZGVwZW5kZW50bHkuICAqLwotCSAgcSA9IGNwbHVzX2RlbWFuZ2xlIChwLCB3b3JrLT5vcHRpb25zKTsKLQkgIGlmICh0ayA9PSB0a19wb2ludGVyKQotCSAgICBzdHJpbmdfYXBwZW5kbiAocywgIiYiLCAxKTsKLQkgIC8qIEZJWE1FOiBQb2ludGVyLXRvLW1lbWJlciBjb25zdGFudHMgc2hvdWxkIGdldCBhCi0JICAgICAgICAgICAgcXVhbGlmeWluZyBjbGFzcyBuYW1lIGhlcmUuICAqLwotCSAgaWYgKHEpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kIChzLCBxKTsKLQkgICAgICBmcmVlIChxKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzdHJpbmdfYXBwZW5kIChzLCBwKTsKLQkgIGZyZWUgKHApOwotCX0KLSAgICAgICptYW5nbGVkICs9IHN5bWJvbF9sZW47Ci0gICAgfQotCi0gIHJldHVybiBzdWNjZXNzOwotfQotCi0vKiBEZW1hbmdsZSB0aGUgdGVtcGxhdGUgbmFtZSBpbiBNQU5HTEVELiAgVGhlIGZ1bGwgbmFtZSBvZiB0aGUKLSAgIHRlbXBsYXRlIChlLmcuLCBTPGludD4pIGlzIHBsYWNlZCBpbiBUTkFNRS4gIFRoZSBuYW1lIHdpdGhvdXQgdGhlCi0gICB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChlLmcuIFMpIGlzIHBsYWNlZCBpbiBUUkFXTkFNRSBpZiBUUkFXTkFNRSBpcwotICAgbm9uLU5VTEwuICBJZiBJU19UWVBFIGlzIG5vbnplcm8sIHRoaXMgdGVtcGxhdGUgaXMgYSB0eXBlIHRlbXBsYXRlLAotICAgbm90IGEgZnVuY3Rpb24gdGVtcGxhdGUuICBJZiBib3RoIElTX1RZUEUgYW5kIFJFTUVNQkVSIGFyZSBub256ZXJvLAotICAgdGhlIHRtZXBsYXRlIGlzIHJlbWVtYmVyZWQgaW4gdGhlIGxpc3Qgb2YgYmFjay1yZWZlcmVuY2VhYmxlCi0gICB0eXBlcy4gICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCB0bmFtZSwgdHJhd25hbWUsIGlzX3R5cGUsIHJlbWVtYmVyKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqdG5hbWU7Ci0gICAgIHN0cmluZyAqdHJhd25hbWU7Ci0gICAgIGludCBpc190eXBlOwotICAgICBpbnQgcmVtZW1iZXI7Ci17Ci0gIGludCBpOwotICBpbnQgcjsKLSAgaW50IG5lZWRfY29tbWEgPSAwOwotICBpbnQgc3VjY2VzcyA9IDA7Ci0gIGNvbnN0IGNoYXIgKnN0YXJ0OwotICBpbnQgaXNfamF2YV9hcnJheSA9IDA7Ci0gIHN0cmluZyB0ZW1wOwotICBpbnQgYmluZGV4ID0gMDsKLQotICAoKm1hbmdsZWQpKys7Ci0gIGlmIChpc190eXBlKQotICAgIHsKLSAgICAgIGlmIChyZW1lbWJlcikKLQliaW5kZXggPSByZWdpc3Rlcl9CdHlwZSAod29yayk7Ci0gICAgICBzdGFydCA9ICptYW5nbGVkOwotICAgICAgLyogZ2V0IHRlbXBsYXRlIG5hbWUgKi8KLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ3onKQotCXsKLQkgIGludCBpZHg7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICAoKm1hbmdsZWQpKys7Ci0KLQkgIGlkeCA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0JICBpZiAoaWR4ID09IC0xCi0JICAgICAgfHwgKHdvcmstPnRtcGxfYXJndmVjICYmIGlkeCA+PSB3b3JrLT5udG1wbF9hcmdzKQotCSAgICAgIHx8IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCkgPT0gLTEpCi0JICAgIHJldHVybiAoMCk7Ci0KLQkgIGlmICh3b3JrLT50bXBsX2FyZ3ZlYykKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCB3b3JrLT50bXBsX2FyZ3ZlY1tpZHhdKTsKLQkgICAgICBpZiAodHJhd25hbWUpCi0JCXN0cmluZ19hcHBlbmQgKHRyYXduYW1lLCB3b3JrLT50bXBsX2FyZ3ZlY1tpZHhdKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciBidWZbMTBdOwotCSAgICAgIHNwcmludGYoYnVmLCAiVCVkIiwgaWR4KTsKLQkgICAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgYnVmKTsKLQkgICAgICBpZiAodHJhd25hbWUpCi0JCXN0cmluZ19hcHBlbmQgKHRyYXduYW1lLCBidWYpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgociA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpKSA8PSAwCi0JICAgICAgfHwgKGludCkgc3RybGVuICgqbWFuZ2xlZCkgPCByKQotCSAgICB7Ci0JICAgICAgcmV0dXJuICgwKTsKLQkgICAgfQotCSAgaXNfamF2YV9hcnJheSA9ICh3b3JrIC0+IG9wdGlvbnMgJiBETUdMX0pBVkEpCi0JICAgICYmIHN0cm5jbXAgKCptYW5nbGVkLCAiSkFycmF5MVoiLCA4KSA9PSAwOwotCSAgaWYgKCEgaXNfamF2YV9hcnJheSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmRuICh0bmFtZSwgKm1hbmdsZWQsIHIpOwotCSAgICB9Ci0JICBpZiAodHJhd25hbWUpCi0JICAgIHN0cmluZ19hcHBlbmRuICh0cmF3bmFtZSwgKm1hbmdsZWQsIHIpOwotCSAgKm1hbmdsZWQgKz0gcjsKLQl9Ci0gICAgfQotICBpZiAoIWlzX2phdmFfYXJyYXkpCi0gICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICI8Iik7Ci0gIC8qIGdldCBzaXplIG9mIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0ICovCi0gIGlmICghZ2V0X2NvdW50IChtYW5nbGVkLCAmcikpCi0gICAgewotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0gIGlmICghaXNfdHlwZSkKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgYW4gYXJyYXkgZm9yIHNhdmluZyB0aGUgdGVtcGxhdGUgYXJndW1lbnQgdmFsdWVzLiAqLwotICAgICAgd29yay0+dG1wbF9hcmd2ZWMgPSAoY2hhcioqKSB4bWFsbG9jIChyICogc2l6ZW9mIChjaGFyICopKTsKLSAgICAgIHdvcmstPm50bXBsX2FyZ3MgPSByOwotICAgICAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKLQl3b3JrLT50bXBsX2FyZ3ZlY1tpXSA9IDA7Ci0gICAgfQotICBmb3IgKGkgPSAwOyBpIDwgcjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChuZWVkX2NvbW1hKQotCXsKLQkgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiLCAiKTsKLQl9Ci0gICAgICAvKiBaIGZvciB0eXBlIHBhcmFtZXRlcnMgKi8KLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ1onKQotCXsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIC8qIHRlbXAgaXMgaW5pdGlhbGl6ZWQgaW4gZG9fdHlwZSAqLwotCSAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZ0ZW1wKTsKLQkgIGlmIChzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZHMgKHRuYW1lLCAmdGVtcCk7Ci0KLQkgICAgICBpZiAoIWlzX3R5cGUpCi0JCXsKLQkJICAvKiBTYXZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudC4gKi8KLQkJICBpbnQgbGVuID0gdGVtcC5wIC0gdGVtcC5iOwotCQkgIHdvcmstPnRtcGxfYXJndmVjW2ldID0geG1hbGxvYyAobGVuICsgMSk7Ci0JCSAgbWVtY3B5ICh3b3JrLT50bXBsX2FyZ3ZlY1tpXSwgdGVtcC5iLCBsZW4pOwotCQkgIHdvcmstPnRtcGxfYXJndmVjW2ldW2xlbl0gPSAnXDAnOwotCQl9Ci0JICAgIH0KLQkgIHN0cmluZ19kZWxldGUoJnRlbXApOwotCSAgaWYgKCFzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICAvKiB6IGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzICovCi0gICAgICBlbHNlIGlmICgqKm1hbmdsZWQgPT0gJ3onKQotCXsKLQkgIGludCByMjsKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCB0bmFtZSk7Ci0KLQkgIGlmIChzdWNjZXNzCi0JICAgICAgJiYgKHIyID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCkpID4gMAotCSAgICAgICYmIChpbnQpIHN0cmxlbiAoKm1hbmdsZWQpID49IHIyKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICIgIik7Ci0JICAgICAgc3RyaW5nX2FwcGVuZG4gKHRuYW1lLCAqbWFuZ2xlZCwgcjIpOwotCSAgICAgIGlmICghaXNfdHlwZSkKLQkJewotCQkgIC8qIFNhdmUgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LiAqLwotCQkgIGludCBsZW4gPSByMjsKLQkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXSA9IHhtYWxsb2MgKGxlbiArIDEpOwotCQkgIG1lbWNweSAod29yay0+dG1wbF9hcmd2ZWNbaV0sICptYW5nbGVkLCBsZW4pOwotCQkgIHdvcmstPnRtcGxfYXJndmVjW2ldW2xlbl0gPSAnXDAnOwotCQl9Ci0JICAgICAgKm1hbmdsZWQgKz0gcjI7Ci0JICAgIH0KLQkgIGlmICghc3VjY2VzcykKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cmluZyAgcGFyYW07Ci0JICBzdHJpbmcqIHM7Ci0KLQkgIC8qIG90aGVyd2lzZSwgdmFsdWUgcGFyYW1ldGVyICovCi0KLQkgIC8qIHRlbXAgaXMgaW5pdGlhbGl6ZWQgaW4gZG9fdHlwZSAqLwotCSAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZ0ZW1wKTsKLQkgIHN0cmluZ19kZWxldGUoJnRlbXApOwotCSAgaWYgKCFzdWNjZXNzKQotCSAgICBicmVhazsKLQotCSAgaWYgKCFpc190eXBlKQotCSAgICB7Ci0JICAgICAgcyA9ICZwYXJhbTsKLQkgICAgICBzdHJpbmdfaW5pdCAocyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgcyA9IHRuYW1lOwotCi0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSAod29yaywgbWFuZ2xlZCwgcywKLQkJCQkJCSAgKHR5cGVfa2luZF90KSBzdWNjZXNzKTsKLQotCSAgaWYgKCFzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgaWYgKCFpc190eXBlKQotCQlzdHJpbmdfZGVsZXRlIChzKTsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoIWlzX3R5cGUpCi0JICAgIHsKLQkgICAgICBpbnQgbGVuID0gcy0+cCAtIHMtPmI7Ci0JICAgICAgd29yay0+dG1wbF9hcmd2ZWNbaV0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLQkgICAgICBtZW1jcHkgKHdvcmstPnRtcGxfYXJndmVjW2ldLCBzLT5iLCBsZW4pOwotCSAgICAgIHdvcmstPnRtcGxfYXJndmVjW2ldW2xlbl0gPSAnXDAnOwotCi0JICAgICAgc3RyaW5nX2FwcGVuZHMgKHRuYW1lLCBzKTsKLQkgICAgICBzdHJpbmdfZGVsZXRlIChzKTsKLQkgICAgfQotCX0KLSAgICAgIG5lZWRfY29tbWEgPSAxOwotICAgIH0KLSAgaWYgKGlzX2phdmFfYXJyYXkpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICJbXSIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh0bmFtZS0+cFstMV0gPT0gJz4nKQotCXN0cmluZ19hcHBlbmQgKHRuYW1lLCAiICIpOwotICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICI+Iik7Ci0gICAgfQotCi0gIGlmIChpc190eXBlICYmIHJlbWVtYmVyKQotICAgIHJlbWVtYmVyX0J0eXBlICh3b3JrLCB0bmFtZS0+YiwgTEVOX1NUUklORyAodG5hbWUpLCBiaW5kZXgpOwotCi0gIC8qCi0gICAgaWYgKHdvcmsgLT4gc3RhdGljX3R5cGUpCi0gICAgewotICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAqbWFuZ2xlZCArIDEpOwotICAgICptYW5nbGVkICs9IHN0cmxlbiAoKm1hbmdsZWQpOwotICAgIHN1Y2Nlc3MgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0gICAgfQotICAgIH0KLSAgICAqLwotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi1zdGF0aWMgaW50Ci1hcm1fcHQgKHdvcmssIG1hbmdsZWQsIG4sIGFuY2hvciwgYXJncykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKm1hbmdsZWQ7Ci0gICAgIGludCBuOwotICAgICBjb25zdCBjaGFyICoqYW5jaG9yLCAqKmFyZ3M7Ci17Ci0gIC8qIENoZWNrIGlmIEFSTSB0ZW1wbGF0ZSB3aXRoICJfX3B0X18iIGluIGl0ICgicGFyYW1ldGVyaXplZCB0eXBlIikgKi8KLSAgLyogQWxsb3cgSFAgYWxzbyBoZXJlLCBiZWNhdXNlIEhQJ3MgY2Zyb250IGNvbXBpbGVyIGZvbGxvd3MgQVJNIHRvIHNvbWUgZXh0ZW50ICovCi0gIGlmICgoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORykgJiYgKCphbmNob3IgPSBteXN0cnN0ciAobWFuZ2xlZCwgIl9fcHRfXyIpKSkKLSAgICB7Ci0gICAgICBpbnQgbGVuOwotICAgICAgKmFyZ3MgPSAqYW5jaG9yICsgNjsKLSAgICAgIGxlbiA9IGNvbnN1bWVfY291bnQgKGFyZ3MpOwotICAgICAgaWYgKGxlbiA9PSAtMSkKLQlyZXR1cm4gMDsKLSAgICAgIGlmICgqYXJncyArIGxlbiA9PSBtYW5nbGVkICsgbiAmJiAqKmFyZ3MgPT0gJ18nKQotCXsKLQkgICsrKmFyZ3M7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotICAgIHsKLSAgICAgIGlmICgoKmFuY2hvciA9IG15c3Ryc3RyIChtYW5nbGVkLCAiX190bV9fIikpCi0gICAgICAgICAgfHwgKCphbmNob3IgPSBteXN0cnN0ciAobWFuZ2xlZCwgIl9fcHNfXyIpKQotICAgICAgICAgIHx8ICgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX3B0X18iKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbGVuOwotICAgICAgICAgICphcmdzID0gKmFuY2hvciArIDY7Ci0gICAgICAgICAgbGVuID0gY29uc3VtZV9jb3VudCAoYXJncyk7Ci0JICBpZiAobGVuID09IC0xKQotCSAgICByZXR1cm4gMDsKLSAgICAgICAgICBpZiAoKmFyZ3MgKyBsZW4gPT0gbWFuZ2xlZCArIG4gJiYgKiphcmdzID09ICdfJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKysqYXJnczsKLSAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX1MiKSkpCi0gICAgICAgIHsKLSAJICBpbnQgbGVuOwotIAkgICphcmdzID0gKmFuY2hvciArIDM7Ci0gCSAgbGVuID0gY29uc3VtZV9jb3VudCAoYXJncyk7Ci0JICBpZiAobGVuID09IC0xKQotCSAgICByZXR1cm4gMDsKLSAJICBpZiAoKmFyZ3MgKyBsZW4gPT0gbWFuZ2xlZCArIG4gJiYgKiphcmdzID09ICdfJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKysqYXJnczsKLSAJICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIG4sIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIGludCBuOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBjb25zdCBjaGFyICpwOwotICBjb25zdCBjaGFyICphcmdzOwotICBjb25zdCBjaGFyICplID0gKm1hbmdsZWQgKyBuOwotICBzdHJpbmcgYXJnOwotCi0gIC8qIENoZWNrIGZvciBIUCBhQ0MgdGVtcGxhdGUgc3BlYzogY2xhc3NYdDF0MiB3aGVyZSB0MSwgdDIgYXJlCi0gICAgIHRlbXBsYXRlIGFyZ3MgKi8KLSAgaWYgKEhQX0RFTUFOR0xJTkcgJiYgKCgqbWFuZ2xlZClbbl0gPT0gJ1gnKSkKLSAgICB7Ci0gICAgICBjaGFyICpzdGFydF9zcGVjX2FyZ3MgPSBOVUxMOwotCi0gICAgICAvKiBGaXJzdCBjaGVjayBmb3IgYW5kIG9taXQgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gcHNldWRvLWFyZ3VtZW50cywKLSAgICAgICAgIHN1Y2ggYXMgaW4gIlNwZWM8IzEsIzEuKj4iICovCi0gICAgICBzdGFydF9zcGVjX2FyZ3MgPSBzdHJjaHIgKCptYW5nbGVkLCAnPCcpOwotICAgICAgaWYgKHN0YXJ0X3NwZWNfYXJncyAmJiAoc3RhcnRfc3BlY19hcmdzIC0gKm1hbmdsZWQgPCBuKSkKLSAgICAgICAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgc3RhcnRfc3BlY19hcmdzIC0gKm1hbmdsZWQpOwotICAgICAgZWxzZQotICAgICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLSAgICAgICgqbWFuZ2xlZCkgKz0gbiArIDE7Ci0gICAgICBzdHJpbmdfaW5pdCAoJmFyZyk7Ci0gICAgICBpZiAod29yay0+dGVtcF9zdGFydCA9PSAtMSkgLyogbm9uLXJlY3Vyc2l2ZSBjYWxsICovCi0gICAgICAgIHdvcmstPnRlbXBfc3RhcnQgPSBkZWNscC0+cCAtIGRlY2xwLT5iOwotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI8Iik7Ci0gICAgICB3aGlsZSAoMSkKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ19jbGVhciAoJmFyZyk7Ci0gICAgICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgJ1QnOgotICAgICAgICAgICAgICAgIC8qICdUJyBzaWduYWxzIGEgdHlwZSBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgICAgICAgICAgaWYgKCFkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKLSAgICAgICAgICAgICAgICAgIGdvdG8gaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgJ1UnOgotICAgICAgICAgICAgICBjYXNlICdTJzoKLSAgICAgICAgICAgICAgICAvKiAnVScgb3IgJ1MnIHNpZ25hbHMgYW4gaW50ZWdyYWwgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKLSAgICAgICAgICAgICAgICAgIGdvdG8gaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgJ0EnOgotICAgICAgICAgICAgICAgIC8qICdBJyBzaWduYWxzIGEgbmFtZWQgY29uc3RhbnQgZXhwcmVzc2lvbiAobGl0ZXJhbCkgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwgKHdvcmssIG1hbmdsZWQsICZhcmcpKQotICAgICAgICAgICAgICAgICAgZ290byBocGFjY190ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBUb2RheSwgMTk5Ny0wOS0wMywgd2UgaGF2ZSBvbmx5IHRoZSBhYm92ZSB0eXBlcwotICAgICAgICAgICAgICAgICAgIG9mIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICAvKiBGSVhNRTogbWF5YmUgdGhpcyBzaG91bGQgZmFpbCBhbmQgcmV0dXJuIG51bGwgKi8KLSAgICAgICAgICAgICAgICBnb3RvIGhwYWNjX3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZhcmcpOwotICAgICAgICAgLyogQ2hlY2sgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0ZW1wbGF0ZSBhcmdzLgotICAgICAgICAgICAgIDAgaWYgYXQgZW5kIG9mIHN0YXRpYyBtZW1iZXIgb2YgdGVtcGxhdGUgY2xhc3MsCi0gICAgICAgICAgICAgXyBpZiBkb25lIHdpdGggdGVtcGxhdGUgYXJncyBmb3IgYSBmdW5jdGlvbiAqLwotICAgICAgICAgIGlmICgoKiptYW5nbGVkID09ICdcMDAwJykgfHwgKCoqbWFuZ2xlZCA9PSAnXycpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIsIik7Ci0gICAgICAgIH0KLSAgICBocGFjY190ZW1wbGF0ZV9hcmdzX2RvbmU6Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIj4iKTsKLSAgICAgIHN0cmluZ19kZWxldGUgKCZhcmcpOwotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnXycpCi0gICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qIEFSTSB0ZW1wbGF0ZT8gKEFsc28gaGFuZGxlcyBIUCBjZnJvbnQgZXh0ZW5zaW9ucykgKi8KLSAgZWxzZSBpZiAoYXJtX3B0ICh3b3JrLCAqbWFuZ2xlZCwgbiwgJnAsICZhcmdzKSkKLSAgICB7Ci0gICAgICBzdHJpbmcgdHlwZV9zdHI7Ci0KLSAgICAgIHN0cmluZ19pbml0ICgmYXJnKTsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIHAgLSAqbWFuZ2xlZCk7Ci0gICAgICBpZiAod29yay0+dGVtcF9zdGFydCA9PSAtMSkgIC8qIG5vbi1yZWN1cnNpdmUgY2FsbCAqLwotCXdvcmstPnRlbXBfc3RhcnQgPSBkZWNscC0+cCAtIGRlY2xwLT5iOwotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI8Iik7Ci0gICAgICAvKiBzaG91bGQgZG8gZXJyb3IgY2hlY2tpbmcgaGVyZSAqLwotICAgICAgd2hpbGUgKGFyZ3MgPCBlKSB7Ci0Jc3RyaW5nX2NsZWFyICgmYXJnKTsKLQotCS8qIENoZWNrIGZvciB0eXBlIG9yIGxpdGVyYWwgaGVyZSAqLwotCXN3aXRjaCAoKmFyZ3MpCi0JICB7Ci0JICAgIC8qIEhQIGNmcm9udCBleHRlbnNpb25zIHRvIEFSTSBmb3IgdGVtcGxhdGUgYXJncyAqLwotCSAgICAvKiBzcGVjOiBYdDFMdjEgd2hlcmUgdDEgaXMgYSB0eXBlLCB2MSBpcyBhIGxpdGVyYWwgdmFsdWUgKi8KLQkgICAgLyogRklYTUU6IFdlIGhhbmRsZSBvbmx5IG51bWVyaWMgbGl0ZXJhbHMgZm9yIEhQIGNmcm9udCAqLwotICAgICAgICAgIGNhc2UgJ1gnOgotICAgICAgICAgICAgLyogQSB0eXBlZCBjb25zdGFudCB2YWx1ZSBmb2xsb3dzICovCi0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgICBpZiAoIWRvX3R5cGUgKHdvcmssICZhcmdzLCAmdHlwZV9zdHIpKQotCSAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgIHN0cmluZ19hcHBlbmQgKCZhcmcsICIoIik7Ci0gICAgICAgICAgICBzdHJpbmdfYXBwZW5kcyAoJmFyZywgJnR5cGVfc3RyKTsKLSAgICAgICAgICAgIHN0cmluZ19hcHBlbmQgKCZhcmcsICIpIik7Ci0gICAgICAgICAgICBpZiAoKmFyZ3MgIT0gJ0wnKQotICAgICAgICAgICAgICBnb3RvIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgICAvKiBOb3cgc25hcmYgYSBsaXRlcmFsIHZhbHVlIGZvbGxvd2luZyAnTCcgKi8KLSAgICAgICAgICAgIGlmICghc25hcmZfbnVtZXJpY19saXRlcmFsICgmYXJncywgJmFyZykpCi0JICAgICAgZ290byBjZnJvbnRfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICdMJzoKLSAgICAgICAgICAgIC8qIFNuYXJmIGEgbGl0ZXJhbCBmb2xsb3dpbmcgJ0wnICovCi0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgICBpZiAoIXNuYXJmX251bWVyaWNfbGl0ZXJhbCAoJmFyZ3MsICZhcmcpKQotCSAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKiBOb3QgaGFuZGxpbmcgb3RoZXIgSFAgY2Zyb250IHN0dWZmICovCi0gICAgICAgICAgICBpZiAoIWRvX3R5cGUgKHdvcmssICZhcmdzLCAmYXJnKSkKLSAgICAgICAgICAgICAgZ290byBjZnJvbnRfdGVtcGxhdGVfYXJnc19kb25lOwotCSAgfQotCXN0cmluZ19hcHBlbmRzIChkZWNscCwgJmFyZyk7Ci0Jc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIsIik7Ci0gICAgICB9Ci0gICAgY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZToKLSAgICAgIHN0cmluZ19kZWxldGUgKCZhcmcpOwotICAgICAgaWYgKGFyZ3MgPj0gZSkKLQktLWRlY2xwLT5wOyAvKiByZW1vdmUgZXh0cmEgY29tbWEgKi8KLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPiIpOwotICAgIH0KLSAgZWxzZSBpZiAobj4xMCAmJiBzdHJuY21wICgqbWFuZ2xlZCwgIl9HTE9CQUxfIiwgOCkgPT0gMAotCSAgICYmICgqbWFuZ2xlZClbOV0gPT0gJ04nCi0JICAgJiYgKCptYW5nbGVkKVs4XSA9PSAoKm1hbmdsZWQpWzEwXQotCSAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgKCptYW5nbGVkKVs4XSkpCi0gICAgewotICAgICAgLyogQSBtZW1iZXIgb2YgdGhlIGFub255bW91cyBuYW1lc3BhY2UuICAqLwotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJ7YW5vbnltb3VzfSIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICh3b3JrLT50ZW1wX3N0YXJ0ID09IC0xKSAvKiBub24tcmVjdXJzaXZlIGNhbGwgb25seSAqLwotCXdvcmstPnRlbXBfc3RhcnQgPSAwOyAgICAgLyogZGlzYWJsZSBpbiByZWN1cnNpdmUgY2FsbHMgKi8KLSAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotICAgIH0KLSAgKm1hbmdsZWQgKz0gbjsKLX0KLQotLyogRXh0cmFjdCBhIGNsYXNzIG5hbWUsIHBvc3NpYmx5IGEgdGVtcGxhdGUgd2l0aCBhcmd1bWVudHMsIGZyb20gdGhlCi0gICBtYW5nbGVkIHN0cmluZzsgcXVhbGlmaWVycywgbG9jYWwgY2xhc3MgaW5kaWNhdG9ycywgZXRjLiBoYXZlCi0gICBhbHJlYWR5IGJlZW4gZGVhbHQgd2l0aCAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9jbGFzc19uYW1lICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgbjsKLSAgaW50IHN1Y2Nlc3MgPSAwOwotCi0gIG4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgaWYgKG4gPT0gLTEpCi0gICAgcmV0dXJuIDA7Ci0gIGlmICgoaW50KSBzdHJsZW4gKCptYW5nbGVkKSA+PSBuKQotICAgIHsKLSAgICAgIGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgbiwgZGVjbHApOwotICAgICAgc3VjY2VzcyA9IDE7Ci0gICAgfQotCi0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlkZW1hbmdsZV9jbGFzcyAtLSBkZW1hbmdsZSBhIG1hbmdsZWQgY2xhc3Mgc2VxdWVuY2UKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlkZW1hbmdsZV9jbGFzcyAoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiptYW5nbGVkLAotCQkJc3RyaW50ICpkZWNscCkKLQotREVTQ1JJUFRJT04KLQotCURFQ0xQIHBvaW50cyB0byB0aGUgYnVmZmVyIGludG8gd2hpY2ggZGVtYW5nbGluZyBpcyBiZWluZyBkb25lLgotCi0JKk1BTkdMRUQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHRva2VuIHRvIGJlIGRlbWFuZ2xlZC4gIE9uIGlucHV0LAotCWl0IHBvaW50cyB0byBhIG1hbmdsZWQgY2xhc3MgKEkuRS4gIjNmb28iLCAiMTN2ZXJ5bG9uZ2NsYXNzIiwgZXRjLikKLQlPbiBleGl0LCBpdCBwb2ludHMgdG8gdGhlIG5leHQgdG9rZW4gYWZ0ZXIgdGhlIG1hbmdsZWQgY2xhc3Mgb24KLQlzdWNjZXNzLCBvciB0aGUgZmlyc3QgdW5jb25zdW1lZCB0b2tlbiBvbiBmYWlsdXJlLgotCi0JSWYgdGhlIENPTlNUUlVDVE9SIG9yIERFU1RSVUNUT1IgZmxhZ3MgYXJlIHNldCBpbiBXT1JLLCB0aGVuCi0Jd2UgYXJlIGRlbWFuZ2xpbmcgYSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLiAgSW4gdGhpcyBjYXNlCi0Jd2UgcHJlcGVuZCAiY2xhc3M6OmNsYXNzIiBvciAiY2xhc3M6On5jbGFzcyIgdG8gREVDTFAuCi0KLQlPdGhlcndpc2UsIHdlIHByZXBlbmQgImNsYXNzOjoiIHRvIHRoZSBjdXJyZW50IERFQ0xQLgotCi0JUmVzZXQgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZmxhZ3Mgb25jZSB0aGV5IGhhdmUgYmVlbgotCSJjb25zdW1lZCIuICBUaGlzIGFsbG93cyBkZW1hbmdsZV9jbGFzcyB0byBiZSBjYWxsZWQgbGF0ZXIgZHVyaW5nCi0JdGhlIHNhbWUgZGVtYW5nbGluZywgdG8gZG8gbm9ybWFsIGNsYXNzIGRlbWFuZ2xpbmcuCi0KLQlSZXR1cm5zIDEgaWYgZGVtYW5nbGluZyBpcyBzdWNjZXNzZnVsLCAwIG90aGVyd2lzZS4KLQotKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfY2xhc3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGludCBzdWNjZXNzID0gMDsKLSAgaW50IGJ0eXBlOwotICBzdHJpbmcgY2xhc3NfbmFtZTsKLSAgY2hhciAqc2F2ZV9jbGFzc19uYW1lX2VuZCA9IDA7Ci0KLSAgc3RyaW5nX2luaXQgKCZjbGFzc19uYW1lKTsKLSAgYnR5cGUgPSByZWdpc3Rlcl9CdHlwZSAod29yayk7Ci0gIGlmIChkZW1hbmdsZV9jbGFzc19uYW1lICh3b3JrLCBtYW5nbGVkLCAmY2xhc3NfbmFtZSkpCi0gICAgewotICAgICAgc2F2ZV9jbGFzc19uYW1lX2VuZCA9IGNsYXNzX25hbWUucDsKLSAgICAgIGlmICgod29yay0+Y29uc3RydWN0b3IgJiAxKSB8fCAod29yay0+ZGVzdHJ1Y3RvciAmIDEpKQotCXsKLSAgICAgICAgICAvKiBhZGp1c3Qgc28gd2UgZG9uJ3QgaW5jbHVkZSB0ZW1wbGF0ZSBhcmdzICovCi0gICAgICAgICAgaWYgKHdvcmstPnRlbXBfc3RhcnQgJiYgKHdvcmstPnRlbXBfc3RhcnQgIT0gLTEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjbGFzc19uYW1lLnAgPSBjbGFzc19uYW1lLmIgKyB3b3JrLT50ZW1wX3N0YXJ0OwotICAgICAgICAgICAgfQotCSAgc3RyaW5nX3ByZXBlbmRzIChkZWNscCwgJmNsYXNzX25hbWUpOwotCSAgaWYgKHdvcmsgLT4gZGVzdHJ1Y3RvciAmIDEpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfcHJlcGVuZCAoZGVjbHAsICJ+Iik7Ci0gICAgICAgICAgICAgIHdvcmsgLT4gZGVzdHJ1Y3RvciAtPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3b3JrIC0+IGNvbnN0cnVjdG9yIC09IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBjbGFzc19uYW1lLnAgPSBzYXZlX2NsYXNzX25hbWVfZW5kOwotICAgICAgcmVtZW1iZXJfS3R5cGUgKHdvcmssIGNsYXNzX25hbWUuYiwgTEVOX1NUUklORygmY2xhc3NfbmFtZSkpOwotICAgICAgcmVtZW1iZXJfQnR5cGUgKHdvcmssIGNsYXNzX25hbWUuYiwgTEVOX1NUUklORygmY2xhc3NfbmFtZSksIGJ0eXBlKTsKLSAgICAgIHN0cmluZ19wcmVwZW5kIChkZWNscCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0gICAgICBzdHJpbmdfcHJlcGVuZHMgKGRlY2xwLCAmY2xhc3NfbmFtZSk7Ci0gICAgICBzdWNjZXNzID0gMTsKLSAgICB9Ci0gIHN0cmluZ19kZWxldGUgKCZjbGFzc19uYW1lKTsKLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWRlbWFuZ2xlX3ByZWZpeCAtLSBjb25zdW1lIHRoZSBtYW5nbGVkIG5hbWUgcHJlZml4IGFuZCBmaW5kIHNpZ25hdHVyZQotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWRlbWFuZ2xlX3ByZWZpeCAoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiptYW5nbGVkLAotCQkJIHN0cmluZyAqZGVjbHApOwotCi1ERVNDUklQVElPTgotCi0JQ29uc3VtZSBhbmQgZGVtYW5nbGUgdGhlIHByZWZpeCBvZiB0aGUgbWFuZ2xlZCBuYW1lLgotCi0JREVDTFAgcG9pbnRzIHRvIHRoZSBzdHJpbmcgYnVmZmVyIGludG8gd2hpY2ggZGVtYW5nbGVkIG91dHB1dCBpcwotCXBsYWNlZC4gIE9uIGVudHJ5LCB0aGUgYnVmZmVyIGlzIGVtcHR5LiAgT24gZXhpdCBpdCBjb250YWlucwotCXRoZSByb290IGZ1bmN0aW9uIG5hbWUsIHRoZSBkZW1hbmdsZWQgb3BlcmF0b3IgbmFtZSwgb3IgaW4gc29tZQotCXNwZWNpYWwgY2FzZXMgZWl0aGVyIG5vdGhpbmcgb3IgdGhlIGNvbXBsZXRlbHkgZGVtYW5nbGVkIHJlc3VsdC4KLQotCU1BTkdMRUQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHBvaW50ZXIgaW50byB0aGUgbWFuZ2xlZCBuYW1lLiAgQXMgZWFjaAotCXRva2VuIG9mIHRoZSBtYW5nbGVkIG5hbWUgaXMgY29uc3VtZWQsIGl0IGlzIHVwZGF0ZWQuICBVcG9uIGVudHJ5Ci0JdGhlIGN1cnJlbnQgbWFuZ2xlZCBuYW1lIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKLQl0aGUgbWFuZ2xlZCBuYW1lLiAgVXBvbiBleGl0LCBpdCBzaG91bGQgcG9pbnQgdG8gdGhlIGZpcnN0IGNoYXJhY3RlcgotCW9mIHRoZSBzaWduYXR1cmUgaWYgZGVtYW5nbGluZyB3YXMgc3VjY2Vzc2Z1bCwgb3IgdG8gdGhlIGZpcnN0Ci0JdW5jb25zdW1lZCBjaGFyYWN0ZXIgaWYgZGVtYW5nbGluZyBvZiB0aGUgcHJlZml4IHdhcyB1bnN1Y2Nlc3NmdWwuCi0KLQlSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvdGhlcndpc2UuCi0gKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfcHJlZml4ICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIGNvbnN0IGNoYXIgKnNjYW47Ci0gIGludCBpOwotCi0gIGlmIChzdHJsZW4oKm1hbmdsZWQpID4gNgotICAgICAgJiYgKHN0cm5jbXAoKm1hbmdsZWQsICJfaW1wX18iLCA2KSA9PSAwCi0gICAgICAgICAgfHwgc3RybmNtcCgqbWFuZ2xlZCwgIl9faW1wXyIsIDYpID09IDApKQotICAgIHsKLSAgICAgIC8qIGl0J3MgYSBzeW1ib2wgaW1wb3J0ZWQgZnJvbSBhIFBFIGR5bmFtaWMgbGlicmFyeS4gQ2hlY2sgZm9yIGJvdGgKLSAgICAgICAgIG5ldyBzdHlsZSBwcmVmaXggX2ltcF9fIGFuZCBsZWdhY3kgX19pbXBfIHVzZWQgYnkgb2xkZXIgdmVyc2lvbnMKLQkgb2YgZGxsdG9vbC4gKi8KLSAgICAgICgqbWFuZ2xlZCkgKz0gNjsKLSAgICAgIHdvcmstPmRsbGltcG9ydGVkID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmxlbigqbWFuZ2xlZCkgPj0gMTEgJiYgc3RybmNtcCgqbWFuZ2xlZCwgIl9HTE9CQUxfIiwgOCkgPT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICptYXJrZXIgPSBzdHJjaHIgKGNwbHVzX21hcmtlcnMsICgqbWFuZ2xlZClbOF0pOwotICAgICAgaWYgKG1hcmtlciAhPSBOVUxMICYmICptYXJrZXIgPT0gKCptYW5nbGVkKVsxMF0pCi0JewotCSAgaWYgKCgqbWFuZ2xlZClbOV0gPT0gJ0QnKQotCSAgICB7Ci0JICAgICAgLyogaXQncyBhIEdOVSBnbG9iYWwgZGVzdHJ1Y3RvciB0byBiZSBleGVjdXRlZCBhdCBwcm9ncmFtIGV4aXQgKi8KLQkgICAgICAoKm1hbmdsZWQpICs9IDExOwotCSAgICAgIHdvcmstPmRlc3RydWN0b3IgPSAyOwotCSAgICAgIGlmIChnbnVfc3BlY2lhbCAod29yaywgbWFuZ2xlZCwgZGVjbHApKQotCQlyZXR1cm4gc3VjY2VzczsKLQkgICAgfQotCSAgZWxzZSBpZiAoKCptYW5nbGVkKVs5XSA9PSAnSScpCi0JICAgIHsKLQkgICAgICAvKiBpdCdzIGEgR05VIGdsb2JhbCBjb25zdHJ1Y3RvciB0byBiZSBleGVjdXRlZCBhdCBwcm9ncmFtIGluaXQgKi8KLQkgICAgICAoKm1hbmdsZWQpICs9IDExOwotCSAgICAgIHdvcmstPmNvbnN0cnVjdG9yID0gMjsKLQkgICAgICBpZiAoZ251X3NwZWNpYWwgKHdvcmssIG1hbmdsZWQsIGRlY2xwKSkKLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmICgoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgc3RybmNtcCgqbWFuZ2xlZCwgIl9fc3RkX18iLCA3KSA9PSAwKQotICAgIHsKLSAgICAgIC8qIGl0J3MgYSBBUk0gZ2xvYmFsIGRlc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBleGl0ICovCi0gICAgICAoKm1hbmdsZWQpICs9IDc7Ci0gICAgICB3b3JrLT5kZXN0cnVjdG9yID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKChBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKSAmJiBzdHJuY21wKCptYW5nbGVkLCAiX19zdGlfXyIsIDcpID09IDApCi0gICAgewotICAgICAgLyogaXQncyBhIEFSTSBnbG9iYWwgY29uc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBpbml0aWFsICovCi0gICAgICAoKm1hbmdsZWQpICs9IDc7Ci0gICAgICB3b3JrLT5jb25zdHJ1Y3RvciA9IDI7Ci0gICAgfQotCi0gIC8qICBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgYSByZWR1Y3Rpb24gaW4gc3RyZW5ndGggdGltZSBvcHRpbWl6YXRpb24KLSAgICAgIG9mOgotICAgICAgc2NhbiA9IG15c3Ryc3RyICgqbWFuZ2xlZCwgIl9fIik7ICovCi0KLSAgewotICAgIHNjYW4gPSAqbWFuZ2xlZDsKLQotICAgIGRvIHsKLSAgICAgIHNjYW4gPSBzdHJjaHIgKHNjYW4sICdfJyk7Ci0gICAgfSB3aGlsZSAoc2NhbiAhPSBOVUxMICYmICorK3NjYW4gIT0gJ18nKTsKLQotICAgIGlmIChzY2FuICE9IE5VTEwpIC0tc2NhbjsKLSAgfQotCi0gIGlmIChzY2FuICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2UgZm91bmQgYSBzZXF1ZW5jZSBvZiB0d28gb3IgbW9yZSAnXycsIGVuc3VyZSB0aGF0IHdlIHN0YXJ0IGF0Ci0JIHRoZSBsYXN0IHBhaXIgaW4gdGhlIHNlcXVlbmNlLiAgKi8KLSAgICAgIGkgPSBzdHJzcG4gKHNjYW4sICJfIik7Ci0gICAgICBpZiAoaSA+IDIpCi0JewotCSAgc2NhbiArPSAoaSAtIDIpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNjYW4gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdWNjZXNzID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHdvcmsgLT4gc3RhdGljX3R5cGUpCi0gICAgewotICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcilzY2FuWzBdKSAmJiAoc2NhblswXSAhPSAndCcpKQotCXsKLQkgIHN1Y2Nlc3MgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKChzY2FuID09ICptYW5nbGVkKQotCSAgICYmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcilzY2FuWzJdKSB8fCAoc2NhblsyXSA9PSAnUScpCi0JICAgICAgIHx8IChzY2FuWzJdID09ICd0JykgfHwgKHNjYW5bMl0gPT0gJ0snKSB8fCAoc2NhblsyXSA9PSAnSCcpKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgQVJNIHNheXMgbm90aGluZyBhYm91dCB0aGUgbWFuZ2xpbmcgb2YgbG9jYWwgdmFyaWFibGVzLgotCSBCdXQgY2Zyb250IG1hbmdsZXMgbG9jYWwgdmFyaWFibGVzIGJ5IHByZXBlbmRpbmcgX188bmVzdGluZ19sZXZlbD4KLQkgdG8gdGhlbS4gQXMgYW4gZXh0ZW5zaW9uIHRvIEFSTSBkZW1hbmdsaW5nIHdlIGhhbmRsZSB0aGlzIGNhc2UuICAqLwotICAgICAgaWYgKChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcpCi0JICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcilzY2FuWzJdKSkKLQl7Ci0JICAqbWFuZ2xlZCA9IHNjYW4gKyAyOwotCSAgY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQpOwotCSAgKm1hbmdsZWQgKz0gc3RybGVuICgqbWFuZ2xlZCk7Ci0JICBzdWNjZXNzID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQSBHTlUgc3R5bGUgY29uc3RydWN0b3Igc3RhcnRzIHdpdGggX19bMC05UXRdLiAgQnV0IGNmcm9udCB1c2VzCi0JICAgICBuYW1lcyBsaWtlIF9fUTJfM2ZvbzNiYXIgZm9yIG5lc3RlZCB0eXBlIG5hbWVzLiAgU28gZG9uJ3QgYWNjZXB0Ci0JICAgICB0aGlzIHN0eWxlIG9mIGNvbnN0cnVjdG9yIGZvciBjZnJvbnQgZGVtYW5nbGluZy4gIEEgR05VCi0JICAgICBzdHlsZSBtZW1iZXItdGVtcGxhdGUgY29uc3RydWN0b3Igc3RhcnRzIHdpdGggJ0gnLiAqLwotCSAgaWYgKCEoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKSkKLQkgICAgd29yayAtPiBjb25zdHJ1Y3RvciArPSAxOwotCSAgKm1hbmdsZWQgPSBzY2FuICsgMjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChBUk1fREVNQU5HTElORyAmJiBzY2FuWzJdID09ICdwJyAmJiBzY2FuWzNdID09ICd0JykKLSAgICB7Ci0gICAgICAvKiBDZnJvbnQtc3R5bGUgcGFyYW1ldGVyaXplZCB0eXBlLiAgSGFuZGxlZCBsYXRlciBhcyBhIHNpZ25hdHVyZS4gKi8KLSAgICAgIHN1Y2Nlc3MgPSAxOwotCi0gICAgICAvKiBBUk0gdGVtcGxhdGU/ICovCi0gICAgICBkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIHN0cmxlbiAoKm1hbmdsZWQpLCBkZWNscCk7Ci0gICAgfQotICBlbHNlIGlmIChFREdfREVNQU5HTElORyAmJiAoKHNjYW5bMl0gPT0gJ3QnICYmIHNjYW5bM10gPT0gJ20nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHNjYW5bMl0gPT0gJ3AnICYmIHNjYW5bM10gPT0gJ3MnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHNjYW5bMl0gPT0gJ3AnICYmIHNjYW5bM10gPT0gJ3QnKSkpCi0gICAgewotICAgICAgLyogRURHLXN0eWxlIHBhcmFtZXRlcml6ZWQgdHlwZS4gIEhhbmRsZWQgbGF0ZXIgYXMgYSBzaWduYXR1cmUuICovCi0gICAgICBzdWNjZXNzID0gMTsKLQotICAgICAgLyogRURHIHRlbXBsYXRlPyAqLwotICAgICAgZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBzdHJsZW4gKCptYW5nbGVkKSwgZGVjbHApOwotICAgIH0KLSAgZWxzZSBpZiAoKHNjYW4gPT0gKm1hbmdsZWQpICYmICFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcilzY2FuWzJdKQotCSAgICYmIChzY2FuWzJdICE9ICd0JykpCi0gICAgewotICAgICAgLyogTWFuZ2xlZCBuYW1lIHN0YXJ0cyB3aXRoICJfXyIuICBTa2lwIG92ZXIgYW55IGxlYWRpbmcgJ18nIGNoYXJhY3RlcnMsCi0JIHRoZW4gZmluZCB0aGUgbmV4dCAiX18iIHRoYXQgc2VwYXJhdGVzIHRoZSBwcmVmaXggZnJvbSB0aGUgc2lnbmF0dXJlLgotCSAqLwotICAgICAgaWYgKCEoQVJNX0RFTUFOR0xJTkcgfHwgTFVDSURfREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotCSAgfHwgKGFybV9zcGVjaWFsIChtYW5nbGVkLCBkZWNscCkgPT0gMCkpCi0JewotCSAgd2hpbGUgKCpzY2FuID09ICdfJykKLQkgICAgewotCSAgICAgIHNjYW4rKzsKLQkgICAgfQotCSAgaWYgKChzY2FuID0gbXlzdHJzdHIgKHNjYW4sICJfXyIpKSA9PSBOVUxMIHx8ICgqKHNjYW4gKyAyKSA9PSAnXDAnKSkKLQkgICAgewotCSAgICAgIC8qIE5vIHNlcGFyYXRvciAoSS5FLiAiX19ub3RfbWFuZ2xlZCIpLCBvciBlbXB0eSBzaWduYXR1cmUKLQkJIChJLkUuICJfX25vdF9tYW5nbGVkX2VpdGhlcl9fIikgKi8KLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqdG1wOwotCi0gICAgICAgICAgICAgIC8qIExvb2sgZm9yIHRoZSBMQVNUIG9jY3VycmVuY2Ugb2YgX18sIGFsbG93aW5nIG5hbWVzIHRvCi0gICAgICAgICAgICAgICAgIGhhdmUgdGhlICdfXycgc2VxdWVuY2UgZW1iZWRkZWQgaW4gdGhlbS4gKi8KLQkgICAgICBpZiAoIShBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HKSkKLQkJewotCQkgIHdoaWxlICgodG1wID0gbXlzdHJzdHIgKHNjYW4gKyAyLCAiX18iKSkgIT0gTlVMTCkKLQkJICAgIHNjYW4gPSB0bXA7Ci0JCX0KLQkgICAgICBpZiAoKihzY2FuICsgMikgPT0gJ1wwJykKLQkJc3VjY2VzcyA9IDA7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkZW1hbmdsZV9mdW5jdGlvbl9uYW1lICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgc2Nhbik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmICgqKHNjYW4gKyAyKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIC8qIE1hbmdsZWQgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoICJfXyIgYnV0IGRvZXMgaGF2ZSBvbmUgc29tZXdoZXJlCi0JIGluIHRoZXJlIHdpdGggbm9uIGVtcHR5IHN0dWZmIGFmdGVyIGl0LiAgTG9va3MgbGlrZSBhIGdsb2JhbAotCSBmdW5jdGlvbiBuYW1lLiAgKi8KLSAgICAgIGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCBzY2FuKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBEb2Vzbid0IGxvb2sgbGlrZSBhIG1hbmdsZWQgbmFtZSAqLwotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotCi0gIGlmICghc3VjY2VzcyAmJiAod29yay0+Y29uc3RydWN0b3IgPT0gMiB8fCB3b3JrLT5kZXN0cnVjdG9yID09IDIpKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAqbWFuZ2xlZCk7Ci0gICAgICAqbWFuZ2xlZCArPSBzdHJsZW4gKCptYW5nbGVkKTsKLSAgICAgIHN1Y2Nlc3MgPSAxOwotICAgIH0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWdudV9zcGVjaWFsIC0tIHNwZWNpYWwgaGFuZGxpbmcgb2YgZ251IG1hbmdsZWQgc3RyaW5ncwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWdudV9zcGVjaWFsIChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywgY29uc3QgY2hhciAqKm1hbmdsZWQsCi0JCSAgICAgc3RyaW5nICpkZWNscCk7Ci0KLQotREVTQ1JJUFRJT04KLQotCVByb2Nlc3Mgc29tZSBzcGVjaWFsIEdOVSBzdHlsZSBtYW5nbGluZyBmb3JtcyB0aGF0IGRvbid0IGZpdAotCXRoZSBub3JtYWwgcGF0dGVybi4gIEZvciBleGFtcGxlOgotCi0JCV8kXzNmb28JCShkZXN0cnVjdG9yIGZvciBjbGFzcyBmb28pCi0JCV92dCRmb28JCShmb28gdmlydHVhbCB0YWJsZSkKLQkJX3Z0JGZvbyRiYXIJKGZvbzo6YmFyIHZpcnR1YWwgdGFibGUpCi0JCV9fdnRfZm9vCShmb28gdmlydHVhbCB0YWJsZSwgbmV3IHN0eWxlIHdpdGggdGh1bmtzKQotCQlfM2ZvbyR2YXJuYW1lCShzdGF0aWMgZGF0YSBtZW1iZXIpCi0JCV9RMjJyczJ0dSR2dwkoc3RhdGljIGRhdGEgbWVtYmVyKQotCQlfX3Q2dmVjdG9yMVppaQkoY29uc3RydWN0b3Igd2l0aCB0ZW1wbGF0ZSkKLQkJX190aHVua180X18kXzdvc3RyZWFtICh2aXJ0dWFsIGZ1bmN0aW9uIHRodW5rKQotICovCi0KLXN0YXRpYyBpbnQKLWdudV9zcGVjaWFsICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgbjsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBjb25zdCBjaGFyICpwOwotCi0gIGlmICgoKm1hbmdsZWQpWzBdID09ICdfJwotICAgICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCAoKm1hbmdsZWQpWzFdKSAhPSBOVUxMCi0gICAgICAmJiAoKm1hbmdsZWQpWzJdID09ICdfJykKLSAgICB7Ci0gICAgICAvKiBGb3VuZCBhIEdOVSBzdHlsZSBkZXN0cnVjdG9yLCBnZXQgcGFzdCAiXzxDUExVU19NQVJLRVI+XyIgKi8KLSAgICAgICgqbWFuZ2xlZCkgKz0gMzsKLSAgICAgIHdvcmsgLT4gZGVzdHJ1Y3RvciArPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoKCptYW5nbGVkKVswXSA9PSAnXycKLQkgICAmJiAoKCgqbWFuZ2xlZClbMV0gPT0gJ18nCi0JCSYmICgqbWFuZ2xlZClbMl0gPT0gJ3YnCi0JCSYmICgqbWFuZ2xlZClbM10gPT0gJ3QnCi0JCSYmICgqbWFuZ2xlZClbNF0gPT0gJ18nKQotCSAgICAgICB8fCAoKCptYW5nbGVkKVsxXSA9PSAndicKLQkJICAgJiYgKCptYW5nbGVkKVsyXSA9PSAndCcKLQkJICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCAoKm1hbmdsZWQpWzNdKSAhPSBOVUxMKSkpCi0gICAgewotICAgICAgLyogRm91bmQgYSBHTlUgc3R5bGUgdmlydHVhbCB0YWJsZSwgZ2V0IHBhc3QgIl92dDxDUExVU19NQVJLRVI+IgotICAgICAgICAgYW5kIGNyZWF0ZSB0aGUgZGVjbC4gIE5vdGUgdGhhdCB3ZSBjb25zdW1lIHRoZSBlbnRpcmUgbWFuZ2xlZAotCSBpbnB1dCBzdHJpbmcsIHdoaWNoIG1lYW5zIHRoYXQgZGVtYW5nbGVfc2lnbmF0dXJlIGhhcyBubyB3b3JrCi0JIHRvIGRvLiAgKi8KLSAgICAgIGlmICgoKm1hbmdsZWQpWzJdID09ICd2JykKLQkoKm1hbmdsZWQpICs9IDU7IC8qIE5ldyBzdHlsZSwgd2l0aCB0aHVua3M6ICJfX3Z0XyIgKi8KLSAgICAgIGVsc2UKLQkoKm1hbmdsZWQpICs9IDQ7IC8qIE9sZCBzdHlsZSwgbm8gdGh1bmtzOiAiX3Z0PENQTFVTX01BUktFUj4iICovCi0gICAgICB3aGlsZSAoKiptYW5nbGVkICE9ICdcMCcpCi0JewotCSAgc3dpdGNoICgqKm1hbmdsZWQpCi0JICAgIHsKLQkgICAgY2FzZSAnUSc6Ci0JICAgIGNhc2UgJ0snOgotCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAndCc6Ci0JICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSwKLQkJCQkJICAgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKm1hbmdsZWRbMF0pKQotCQl7Ci0JCSAgbiA9IGNvbnN1bWVfY291bnQobWFuZ2xlZCk7Ci0JCSAgLyogV2UgbWF5IGJlIHNlZWluZyBhIHRvby1sYXJnZSBzaXplLCBvciBlbHNlIGEKLQkJICAgICAiLjxkaWdpdHM+IiBpbmRpY2F0aW5nIGEgc3RhdGljIGxvY2FsIHN5bWJvbC4gIEluCi0JCSAgICAgYW55IGNhc2UsIGRlY2xhcmUgdmljdG9yeSBhbmQgbW92ZSBvbjsgKmRvbid0KiB0cnkKLQkJICAgICB0byB1c2UgbiB0byBhbGxvY2F0ZS4gICovCi0JCSAgaWYgKG4gPiAoaW50KSBzdHJsZW4gKCptYW5nbGVkKSkKLQkJICAgIHsKLQkJICAgICAgc3VjY2VzcyA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbiA9IHN0cmNzcG4gKCptYW5nbGVkLCBjcGx1c19tYXJrZXJzKTsKLQkJfQotCSAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotCSAgICAgICgqbWFuZ2xlZCkgKz0gbjsKLQkgICAgfQotCi0JICBwID0gc3RycGJyayAoKm1hbmdsZWQsIGNwbHVzX21hcmtlcnMpOwotCSAgaWYgKHN1Y2Nlc3MgJiYgKChwID09IE5VTEwpIHx8IChwID09ICptYW5nbGVkKSkpCi0JICAgIHsKLQkgICAgICBpZiAocCAhPSBOVUxMKQotCQl7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIFNDT1BFX1NUUklORyAod29yaykpOwotCQkgICgqbWFuZ2xlZCkrKzsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzdWNjZXNzKQotCXN0cmluZ19hcHBlbmQgKGRlY2xwLCAiIHZpcnR1YWwgdGFibGUiKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCgqbWFuZ2xlZClbMF0gPT0gJ18nCi0JICAgJiYgKHN0cmNocigiMDEyMzQ1Njc4OVF0IiwgKCptYW5nbGVkKVsxXSkgIT0gTlVMTCkKLQkgICAmJiAocCA9IHN0cnBicmsgKCptYW5nbGVkLCBjcGx1c19tYXJrZXJzKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBzdGF0aWMgZGF0YSBtZW1iZXIsICJfM2ZvbyR2YXJuYW1lIiBmb3IgZXhhbXBsZSAqLwotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0JewotCWNhc2UgJ1EnOgotCWNhc2UgJ0snOgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxLCAxKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBuID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0JICBpZiAobiA8IDAgfHwgbiA+IHN0cmxlbiAoKm1hbmdsZWQpKQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotCSAgKCptYW5nbGVkKSArPSBuOwotCX0KLSAgICAgIGlmIChzdWNjZXNzICYmIChwID09ICptYW5nbGVkKSkKLQl7Ci0JICAvKiBDb25zdW1lZCBldmVyeXRoaW5nIHVwIHRvIHRoZSBjcGx1c19tYXJrZXIsIGFwcGVuZCB0aGUKLQkgICAgIHZhcmlhYmxlIG5hbWUuICAqLwotCSAgKCptYW5nbGVkKSsrOwotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIFNDT1BFX1NUUklORyAod29yaykpOwotCSAgbiA9IHN0cmxlbiAoKm1hbmdsZWQpOwotCSAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgbik7Ci0JICAoKm1hbmdsZWQpICs9IG47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN1Y2Nlc3MgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKCptYW5nbGVkLCAiX190aHVua18iLCA4KSA9PSAwKQotICAgIHsKLSAgICAgIGludCBkZWx0YTsKLQotICAgICAgKCptYW5nbGVkKSArPSA4OwotICAgICAgZGVsdGEgPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgICAgIGlmIChkZWx0YSA9PSAtMSkKLQlzdWNjZXNzID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICptZXRob2QgPSBpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSAod29yaywgKysqbWFuZ2xlZCk7Ci0KLQkgIGlmIChtZXRob2QpCi0JICAgIHsKLQkgICAgICBjaGFyIGJ1Zls1MF07Ci0JICAgICAgc3ByaW50ZiAoYnVmLCAidmlydHVhbCBmdW5jdGlvbiB0aHVuayAoZGVsdGE6JWQpIGZvciAiLCAtZGVsdGEpOwotCSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBidWYpOwotCSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBtZXRob2QpOwotCSAgICAgIGZyZWUgKG1ldGhvZCk7Ci0JICAgICAgbiA9IHN0cmxlbiAoKm1hbmdsZWQpOwotCSAgICAgICgqbWFuZ2xlZCkgKz0gbjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wICgqbWFuZ2xlZCwgIl9fdCIsIDMpID09IDAKLQkgICAmJiAoKCptYW5nbGVkKVszXSA9PSAnaScgfHwgKCptYW5nbGVkKVszXSA9PSAnZicpKQotICAgIHsKLSAgICAgIHAgPSAoKm1hbmdsZWQpWzNdID09ICdpJyA/ICIgdHlwZV9pbmZvIG5vZGUiIDogIiB0eXBlX2luZm8gZnVuY3Rpb24iOwotICAgICAgKCptYW5nbGVkKSArPSA0OwotICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0JewotCWNhc2UgJ1EnOgotCWNhc2UgJ0snOgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxLCAxKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfZnVuZF90eXBlICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoc3VjY2VzcyAmJiAqKm1hbmdsZWQgIT0gJ1wwJykKLQlzdWNjZXNzID0gMDsKLSAgICAgIGlmIChzdWNjZXNzKQotCXN0cmluZ19hcHBlbmQgKGRlY2xwLCBwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdWNjZXNzID0gMDsKLSAgICB9Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWN1cnNpdmVseV9kZW1hbmdsZSh3b3JrLCBtYW5nbGVkLCByZXN1bHQsIG5hbWVsZW5ndGgpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci0gICAgIGludCBuYW1lbGVuZ3RoOwotewotICBjaGFyICogcmVjdXJzZSA9IChjaGFyICopTlVMTDsKLSAgY2hhciAqIHJlY3Vyc2VfZGVtID0gKGNoYXIgKilOVUxMOwotCi0gIHJlY3Vyc2UgPSAoY2hhciAqKSB4bWFsbG9jIChuYW1lbGVuZ3RoICsgMSk7Ci0gIG1lbWNweSAocmVjdXJzZSwgKm1hbmdsZWQsIG5hbWVsZW5ndGgpOwotICByZWN1cnNlW25hbWVsZW5ndGhdID0gJ1wwMDAnOwotCi0gIHJlY3Vyc2VfZGVtID0gY3BsdXNfZGVtYW5nbGUgKHJlY3Vyc2UsIHdvcmstPm9wdGlvbnMpOwotCi0gIGlmIChyZWN1cnNlX2RlbSkKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIHJlY3Vyc2VfZGVtKTsKLSAgICAgIGZyZWUgKHJlY3Vyc2VfZGVtKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAocmVzdWx0LCAqbWFuZ2xlZCwgbmFtZWxlbmd0aCk7Ci0gICAgfQotICBmcmVlIChyZWN1cnNlKTsKLSAgKm1hbmdsZWQgKz0gbmFtZWxlbmd0aDsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWFybV9zcGVjaWFsIC0tIHNwZWNpYWwgaGFuZGxpbmcgb2YgQVJNL2x1Y2lkIG1hbmdsZWQgc3RyaW5ncwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWFybV9zcGVjaWFsIChjb25zdCBjaGFyICoqbWFuZ2xlZCwKLQkJICAgICBzdHJpbmcgKmRlY2xwKTsKLQotCi1ERVNDUklQVElPTgotCi0JUHJvY2VzcyBzb21lIHNwZWNpYWwgQVJNIHN0eWxlIG1hbmdsaW5nIGZvcm1zIHRoYXQgZG9uJ3QgZml0Ci0JdGhlIG5vcm1hbCBwYXR0ZXJuLiAgRm9yIGV4YW1wbGU6Ci0KLQkJX192dGJsX18zZm9vCQkoZm9vIHZpcnR1YWwgdGFibGUpCi0JCV9fdnRibF9fM2Zvb19fM2JhcgkoYmFyOjpmb28gdmlydHVhbCB0YWJsZSkKLQotICovCi0KLXN0YXRpYyBpbnQKLWFybV9zcGVjaWFsIChtYW5nbGVkLCBkZWNscCkKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGludCBuOwotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIGNvbnN0IGNoYXIgKnNjYW47Ci0KLSAgaWYgKHN0cm5jbXAgKCptYW5nbGVkLCBBUk1fVlRBQkxFX1NUUklORywgQVJNX1ZUQUJMRV9TVFJMRU4pID09IDApCi0gICAgewotICAgICAgLyogRm91bmQgYSBBUk0gc3R5bGUgdmlydHVhbCB0YWJsZSwgZ2V0IHBhc3QgQVJNX1ZUQUJMRV9TVFJJTkcKLSAgICAgICAgIGFuZCBjcmVhdGUgdGhlIGRlY2wuICBOb3RlIHRoYXQgd2UgY29uc3VtZSB0aGUgZW50aXJlIG1hbmdsZWQKLQkgaW5wdXQgc3RyaW5nLCB3aGljaCBtZWFucyB0aGF0IGRlbWFuZ2xlX3NpZ25hdHVyZSBoYXMgbm8gd29yawotCSB0byBkby4gICovCi0gICAgICBzY2FuID0gKm1hbmdsZWQgKyBBUk1fVlRBQkxFX1NUUkxFTjsKLSAgICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSAgICAgICAgLyogZmlyc3QgY2hlY2sgaXQgY2FuIGJlIGRlbWFuZ2xlZCAqLwotICAgICAgICB7Ci0gICAgICAgICAgbiA9IGNvbnN1bWVfY291bnQgKCZzY2FuKTsKLSAgICAgICAgICBpZiAobiA9PSAtMSkKLQkgICAgewotCSAgICAgIHJldHVybiAoMCk7ICAgICAgICAgICAvKiBubyBnb29kICovCi0JICAgIH0KLSAgICAgICAgICBzY2FuICs9IG47Ci0gICAgICAgICAgaWYgKHNjYW5bMF0gPT0gJ18nICYmIHNjYW5bMV0gPT0gJ18nKQotCSAgICB7Ci0JICAgICAgc2NhbiArPSAyOwotCSAgICB9Ci0gICAgICAgIH0KLSAgICAgICgqbWFuZ2xlZCkgKz0gQVJNX1ZUQUJMRV9TVFJMRU47Ci0gICAgICB3aGlsZSAoKiptYW5nbGVkICE9ICdcMCcpCi0JewotCSAgbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotICAgICAgICAgIGlmIChuID09IC0xCi0JICAgICAgfHwgbiA+IHN0cmxlbiAoKm1hbmdsZWQpKQotCSAgICByZXR1cm4gMDsKLQkgIHN0cmluZ19wcmVwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLQkgICgqbWFuZ2xlZCkgKz0gbjsKLQkgIGlmICgoKm1hbmdsZWQpWzBdID09ICdfJyAmJiAoKm1hbmdsZWQpWzFdID09ICdfJykKLQkgICAgewotCSAgICAgIHN0cmluZ19wcmVwZW5kIChkZWNscCwgIjo6Iik7Ci0JICAgICAgKCptYW5nbGVkKSArPSAyOwotCSAgICB9Ci0JfQotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIgdmlydHVhbCB0YWJsZSIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWRlbWFuZ2xlX3F1YWxpZmllZCAtLSBkZW1hbmdsZSAnUScgcXVhbGlmaWVkIG5hbWUgc3RyaW5ncwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWRlbWFuZ2xlX3F1YWxpZmllZCAoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqbWFuZ2xlZCwKLQkJCSAgICBzdHJpbmcgKnJlc3VsdCwgaW50IGlzZnVuY25hbWUsIGludCBhcHBlbmQpOwotCi1ERVNDUklQVElPTgotCi0JRGVtYW5nbGUgYSBxdWFsaWZpZWQgbmFtZSwgc3VjaCBhcyAiUTI1T3V0ZXI1SW5uZXIiIHdoaWNoIGlzCi0JdGhlIG1hbmdsZWQgZm9ybSBvZiAiT3V0ZXI6OklubmVyIi4gIFRoZSBkZW1hbmdsZWQgb3V0cHV0IGlzCi0JcHJlcGVuZGVkIG9yIGFwcGVuZGVkIHRvIHRoZSByZXN1bHQgc3RyaW5nIGFjY29yZGluZyB0byB0aGUKLQlzdGF0ZSBvZiB0aGUgYXBwZW5kIGZsYWcuCi0KLQlJZiBpc2Z1bmNuYW1lIGlzIG5vbnplcm8sIHRoZW4gdGhlIHF1YWxpZmllZCBuYW1lIHdlIGFyZSBidWlsZGluZwotCWlzIGdvaW5nIHRvIGJlIHVzZWQgYXMgYSBtZW1iZXIgZnVuY3Rpb24gbmFtZSwgc28gaWYgaXQgaXMgYQotCWNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgZnVuY3Rpb24sIGFwcGVuZCBhbiBhcHByb3ByaWF0ZQotCWNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgbmFtZS4gIEkuRS4gZm9yIHRoZSBhYm92ZSBleGFtcGxlLAotCXRoZSByZXN1bHQgZm9yIHVzZSBhcyBhIGNvbnN0cnVjdG9yIGlzICJPdXRlcjo6SW5uZXI6OklubmVyIgotCWFuZCB0aGUgcmVzdWx0IGZvciB1c2UgYXMgYSBkZXN0cnVjdG9yIGlzICJPdXRlcjo6SW5uZXI6On5Jbm5lciIuCi0KLUJVR1MKLQotCU51bWVyaWMgY29udmVyc2lvbiBpcyBBU0NJSSBkZXBlbmRlbnQgKEZJWE1FKS4KLQotICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3F1YWxpZmllZCAod29yaywgbWFuZ2xlZCwgcmVzdWx0LCBpc2Z1bmNuYW1lLCBhcHBlbmQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci0gICAgIGludCBpc2Z1bmNuYW1lOwotICAgICBpbnQgYXBwZW5kOwotewotICBpbnQgcXVhbGlmaWVycyA9IDA7Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgY29uc3QgY2hhciAqcDsKLSAgY2hhciBudW1bMl07Ci0gIHN0cmluZyB0ZW1wOwotICBzdHJpbmcgbGFzdF9uYW1lOwotICBpbnQgYmluZGV4ID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOwotCi0gIC8qIFdlIG9ubHkgbWFrZSB1c2Ugb2YgSVNGVU5DTkFNRSBpZiB0aGUgZW50aXR5IGlzIGEgY29uc3RydWN0b3Igb3IKLSAgICAgZGVzdHJ1Y3Rvci4gICovCi0gIGlzZnVuY25hbWUgPSAoaXNmdW5jbmFtZQotCQkmJiAoKHdvcmstPmNvbnN0cnVjdG9yICYgMSkgfHwgKHdvcmstPmRlc3RydWN0b3IgJiAxKSkpOwotCi0gIHN0cmluZ19pbml0ICgmdGVtcCk7Ci0gIHN0cmluZ19pbml0ICgmbGFzdF9uYW1lKTsKLQotICBpZiAoKCptYW5nbGVkKVswXSA9PSAnSycpCi0gICAgewotICAgIC8qIFNxdWFuZ2xpbmcgcXVhbGlmaWVkIG5hbWUgcmV1c2UgKi8KLSAgICAgIGludCBpZHg7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOwotICAgICAgaWYgKGlkeCA9PSAtMSB8fCBpZHggPj0gd29yayAtPiBudW1rKQotICAgICAgICBzdWNjZXNzID0gMDsKLSAgICAgIGVsc2UKLSAgICAgICAgc3RyaW5nX2FwcGVuZCAoJnRlbXAsIHdvcmsgLT4ga3R5cGV2ZWNbaWR4XSk7Ci0gICAgfQotICBlbHNlCi0gICAgc3dpdGNoICgoKm1hbmdsZWQpWzFdKQotICAgIHsKLSAgICBjYXNlICdfJzoKLSAgICAgIC8qIEdOVSBtYW5nbGVkIG5hbWUgd2l0aCBtb3JlIHRoYW4gOSBjbGFzc2VzLiAgVGhlIGNvdW50IGlzIHByZWNlZGVkCi0JIGJ5IGFuIHVuZGVyc2NvcmUgKHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gdGhlIDw9IDkgY2FzZSkgYW5kIGZvbGxvd2VkCi0JIGJ5IGFuIHVuZGVyc2NvcmUuICAqLwotICAgICAgcCA9ICptYW5nbGVkICsgMjsKLSAgICAgIHF1YWxpZmllcnMgPSBhdG9pIChwKTsKLSAgICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKnApIHx8ICpwID09ICcwJykKLQlzdWNjZXNzID0gMDsKLQotICAgICAgLyogU2tpcCB0aGUgZGlnaXRzLiAgKi8KLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqcCkpCi0JKytwOwotCi0gICAgICBpZiAoKnAgIT0gJ18nKQotCXN1Y2Nlc3MgPSAwOwotCi0gICAgICAqbWFuZ2xlZCA9IHAgKyAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc3JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICc5JzoKLSAgICAgIC8qIFRoZSBjb3VudCBpcyBpbiBhIHNpbmdsZSBkaWdpdC4gICovCi0gICAgICBudW1bMF0gPSAoKm1hbmdsZWQpWzFdOwotICAgICAgbnVtWzFdID0gJ1wwJzsKLSAgICAgIHF1YWxpZmllcnMgPSBhdG9pIChudW0pOwotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBhbiB1bmRlcnNjb3JlIGFmdGVyIHRoZSBkaWdpdCwgc2tpcCBpdC4gIFRoaXMgaXMKLQkgc2FpZCB0byBiZSBmb3IgQVJNLXF1YWxpZmllZCBuYW1lcywgYnV0IHRoZSBBUk0gbWFrZXMgbm8KLQkgbWVudGlvbiBvZiBzdWNoIGFuIHVuZGVyc2NvcmUuICBQZXJoYXBzIGNmcm9udCB1c2VzIG9uZS4gICovCi0gICAgICBpZiAoKCptYW5nbGVkKVsyXSA9PSAnXycpCi0JewotCSAgKCptYW5nbGVkKSsrOwotCX0KLSAgICAgICgqbWFuZ2xlZCkgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMCc6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0KLQotICBpZiAoIXN1Y2Nlc3MpCi0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci0KLSAgLyogUGljayBvZmYgdGhlIG5hbWVzIGFuZCBjb2xsZWN0IHRoZW0gaW4gdGhlIHRlbXAgYnVmZmVyIGluIHRoZSBvcmRlcgotICAgICBpbiB3aGljaCB0aGV5IGFyZSBmb3VuZCwgc2VwYXJhdGVkIGJ5ICc6OicuICAqLwotCi0gIHdoaWxlIChxdWFsaWZpZXJzLS0gPiAwKQotICAgIHsKLSAgICAgIGludCByZW1lbWJlcl9LID0gMTsKLSAgICAgIHN0cmluZ19jbGVhciAoJmxhc3RfbmFtZSk7Ci0KLSAgICAgIGlmICgqbWFuZ2xlZFswXSA9PSAnXycpCi0JKCptYW5nbGVkKSsrOwotCi0gICAgICBpZiAoKm1hbmdsZWRbMF0gPT0gJ3QnKQotCXsKLQkgIC8qIEhlcmUgd2UgYWx3YXlzIGFwcGVuZCB0byBURU1QIHNpbmNlIHdlIHdpbGwgd2FudCB0byB1c2UKLQkgICAgIHRoZSB0ZW1wbGF0ZSBuYW1lIHdpdGhvdXQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXMgYQotCSAgICAgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBuYW1lLiAgVGhlIGFwcHJvcHJpYXRlCi0JICAgICAocGFyYW1ldGVyLWxlc3MpIHZhbHVlIGlzIHJldHVybmVkIGJ5IGRlbWFuZ2xlX3RlbXBsYXRlCi0JICAgICBpbiBMQVNUX05BTUUuICBXZSBkbyBub3QgcmVtZW1iZXIgdGhlIHRlbXBsYXRlIHR5cGUgaGVyZSwKLQkgICAgIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBHKysgbWFuZ2xpbmcgYWxnb3JpdGhtLiAgKi8KLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSh3b3JrLCBtYW5nbGVkLCAmdGVtcCwKLQkJCQkgICAgICAmbGFzdF9uYW1lLCAxLCAwKTsKLQkgIGlmICghc3VjY2VzcykKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgZWxzZSBpZiAoKm1hbmdsZWRbMF0gPT0gJ0snKQotCXsKLSAgICAgICAgICBpbnQgaWR4OwotICAgICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgICAgICBpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOwotICAgICAgICAgIGlmIChpZHggPT0gLTEgfHwgaWR4ID49IHdvcmstPm51bWspCi0gICAgICAgICAgICBzdWNjZXNzID0gMDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHJpbmdfYXBwZW5kICgmdGVtcCwgd29yay0+a3R5cGV2ZWNbaWR4XSk7Ci0gICAgICAgICAgcmVtZW1iZXJfSyA9IDA7Ci0KLQkgIGlmICghc3VjY2VzcykgYnJlYWs7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChFREdfREVNQU5HTElORykKLSAgICAgICAgICAgIHsKLQkgICAgICBpbnQgbmFtZWxlbmd0aDsKLSAJICAgICAgLyogTm93IHJlY3Vyc2l2ZWx5IGRlbWFuZ2xlIHRoZSBxdWFsaWZpZXIKLSAJICAgICAgICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZGVhbCB3aXRoIHRlbXBsYXRlcyBpbgotIAkgICAgICAgKiBtYW5nbGluZyBzdHlsZXMgbGlrZSBFREcgKi8KLQkgICAgICBuYW1lbGVuZ3RoID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0JICAgICAgaWYgKG5hbWVsZW5ndGggPT0gLTEpCi0JCXsKLQkJICBzdWNjZXNzID0gMDsKLQkJICBicmVhazsKLQkJfQotIAkgICAgICByZWN1cnNpdmVseV9kZW1hbmdsZSh3b3JrLCBtYW5nbGVkLCAmdGVtcCwgbmFtZWxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJmxhc3RfbmFtZSk7Ci0gICAgICAgICAgICAgIGlmICghc3VjY2VzcykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgc3RyaW5nX2FwcGVuZHMgKCZ0ZW1wLCAmbGFzdF9uYW1lKTsKLSAgICAgICAgICAgIH0KLQl9Ci0KLSAgICAgIGlmIChyZW1lbWJlcl9LKQotCXJlbWVtYmVyX0t0eXBlICh3b3JrLCB0ZW1wLmIsIExFTl9TVFJJTkcgKCZ0ZW1wKSk7Ci0KLSAgICAgIGlmIChxdWFsaWZpZXJzID4gMCkKLQlzdHJpbmdfYXBwZW5kICgmdGVtcCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0gICAgfQotCi0gIHJlbWVtYmVyX0J0eXBlICh3b3JrLCB0ZW1wLmIsIExFTl9TVFJJTkcgKCZ0ZW1wKSwgYmluZGV4KTsKLQotICAvKiBJZiB3ZSBhcmUgdXNpbmcgdGhlIHJlc3VsdCBhcyBhIGZ1bmN0aW9uIG5hbWUsIHdlIG5lZWQgdG8gYXBwZW5kCi0gICAgIHRoZSBhcHByb3ByaWF0ZSAnOjonIHNlcGFyYXRlZCBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG5hbWUuCi0gICAgIFdlIGRvIHRoaXMgaGVyZSBiZWNhdXNlIHRoaXMgaXMgdGhlIG1vc3QgY29udmVuaWVudCBwbGFjZSwgd2hlcmUKLSAgICAgd2UgYWxyZWFkeSBoYXZlIGEgcG9pbnRlciB0byB0aGUgbmFtZSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZS4gICovCi0KLSAgaWYgKGlzZnVuY25hbWUpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAoJnRlbXAsIFNDT1BFX1NUUklORyAod29yaykpOwotICAgICAgaWYgKHdvcmsgLT4gZGVzdHJ1Y3RvciAmIDEpCi0Jc3RyaW5nX2FwcGVuZCAoJnRlbXAsICJ+Iik7Ci0gICAgICBzdHJpbmdfYXBwZW5kcyAoJnRlbXAsICZsYXN0X25hbWUpOwotICAgIH0KLQotICAvKiBOb3cgZWl0aGVyIHByZXBlbmQgdGhlIHRlbXAgYnVmZmVyIHRvIHRoZSByZXN1bHQsIG9yIGFwcGVuZCBpdCwKLSAgICAgZGVwZW5kaW5nIHVwb24gdGhlIHN0YXRlIG9mIHRoZSBhcHBlbmQgZmxhZy4gICovCi0KLSAgaWYgKGFwcGVuZCkKLSAgICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCAmdGVtcCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIVNUUklOR19FTVBUWSAocmVzdWx0KSkKLQlzdHJpbmdfYXBwZW5kICgmdGVtcCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0gICAgICBzdHJpbmdfcHJlcGVuZHMgKHJlc3VsdCwgJnRlbXApOwotICAgIH0KLQotICBzdHJpbmdfZGVsZXRlICgmbGFzdF9uYW1lKTsKLSAgc3RyaW5nX2RlbGV0ZSAoJnRlbXApOwotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JZ2V0X2NvdW50IC0tIGNvbnZlcnQgYW4gYXNjaWkgY291bnQgdG8gaW50ZWdlciwgY29uc3VtaW5nIHRva2VucwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIGludAotCWdldF9jb3VudCAoY29uc3QgY2hhciAqKnR5cGUsIGludCAqY291bnQpCi0KLURFU0NSSVBUSU9OCi0KLQlBc3N1bWUgdGhhdCAqdHlwZSBwb2ludHMgYXQgYSBjb3VudCBpbiBhIG1hbmdsZWQgbmFtZTsgc2V0Ci0JKmNvdW50IHRvIGl0cyB2YWx1ZSwgYW5kIHNldCAqdHlwZSB0byB0aGUgbmV4dCBjaGFyYWN0ZXIgYWZ0ZXIKLQl0aGUgY291bnQuICBUaGVyZSBhcmUgc29tZSB3ZWlyZCBydWxlcyBpbiBlZmZlY3QgaGVyZS4KLQotCUlmICp0eXBlIGRvZXMgbm90IHBvaW50IGF0IGEgc3RyaW5nIG9mIGRpZ2l0cywgcmV0dXJuIHplcm8uCi0KLQlJZiAqdHlwZSBwb2ludHMgYXQgYSBzdHJpbmcgb2YgZGlnaXRzIGZvbGxvd2VkIGJ5IGFuCi0JdW5kZXJzY29yZSwgc2V0ICpjb3VudCB0byB0aGVpciB2YWx1ZSBhcyBhbiBpbnRlZ2VyLCBhZHZhbmNlCi0JKnR5cGUgdG8gcG9pbnQgKmFmdGVyIHRoZSB1bmRlcnNjb3JlLCBhbmQgcmV0dXJuIDEuCi0KLQlJZiAqdHlwZSBwb2ludHMgYXQgYSBzdHJpbmcgb2YgZGlnaXRzIG5vdCBmb2xsb3dlZCBieSBhbgotCXVuZGVyc2NvcmUsIGNvbnN1bWUgb25seSB0aGUgZmlyc3QgZGlnaXQuICBTZXQgKmNvdW50IHRvIGl0cwotCXZhbHVlIGFzIGFuIGludGVnZXIsIGxlYXZlICp0eXBlIHBvaW50aW5nIGFmdGVyIHRoYXQgZGlnaXQsCi0JYW5kIHJldHVybiAxLgotCi0gICAgICAgIFRoZSBleGN1c2UgZm9yIHRoaXMgb2RkIGJlaGF2aW9yOiBpbiB0aGUgQVJNIGFuZCBIUCBkZW1hbmdsaW5nCi0gICAgICAgIHN0eWxlcywgYSB0eXBlIGNhbiBiZSBmb2xsb3dlZCBieSBhIHJlcGVhdCBjb3VudCBvZiB0aGUgZm9ybQotICAgICAgICBgTnh5Jywgd2hlcmU6Ci0KLSAgICAgICAgYHgnIGlzIGEgc2luZ2xlIGRpZ2l0IHNwZWNpZnlpbmcgaG93IG1hbnkgYWRkaXRpb25hbCBjb3BpZXMKLSAgICAgICAgICAgIG9mIHRoZSB0eXBlIHRvIGFwcGVuZCB0byB0aGUgYXJndW1lbnQgbGlzdCwgYW5kCi0KLSAgICAgICAgYHknIGlzIG9uZSBvciBtb3JlIGRpZ2l0cywgc3BlY2lmeWluZyB0aGUgemVyby1iYXNlZCBpbmRleCBvZgotICAgICAgICAgICAgdGhlIGZpcnN0IHJlcGVhdGVkIGFyZ3VtZW50IGluIHRoZSBsaXN0LiAgWWVzLCBhcyB5b3UncmUKLSAgICAgICAgICAgIHVubWFuZ2xpbmcgdGhlIG5hbWUgeW91IGNhbiBmaWd1cmUgdGhpcyBvdXQgeW91cnNlbGYsIGJ1dAotICAgICAgICAgICAgaXQncyB0aGVyZSBhbnl3YXkuCi0KLSAgICAgICAgU28sIGZvciBleGFtcGxlLCBpbiBgYmFyX18zZm9vRlBpTjUxJywgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEKLSAgICAgICAgcG9pbnRlciB0byBhbiBpbnRlZ2VyIChgUGknKSwgYW5kIHRoZW4gdGhlIG5leHQgZml2ZSBhcmd1bWVudHMKLSAgICAgICAgYXJlIHRoZSBzYW1lIChgTjUnKSwgYW5kIHRoZSBmaXJzdCByZXBlYXQgaXMgdGhlIGZ1bmN0aW9uJ3MKLSAgICAgICAgc2Vjb25kIGFyZ3VtZW50IChgMScpLgotKi8KLQotc3RhdGljIGludAotZ2V0X2NvdW50ICh0eXBlLCBjb3VudCkKLSAgICAgY29uc3QgY2hhciAqKnR5cGU7Ci0gICAgIGludCAqY291bnQ7Ci17Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGludCBuOwotCi0gIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKip0eXBlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpjb3VudCA9ICoqdHlwZSAtICcwJzsKLSAgICAgICgqdHlwZSkrKzsKLSAgICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKnR5cGUpKQotCXsKLQkgIHAgPSAqdHlwZTsKLQkgIG4gPSAqY291bnQ7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgbiAqPSAxMDsKLQkgICAgICBuICs9ICpwIC0gJzAnOwotCSAgICAgIHArKzsKLQkgICAgfQotCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSpwKSk7Ci0JICBpZiAoKnAgPT0gJ18nKQotCSAgICB7Ci0JICAgICAgKnR5cGUgPSBwICsgMTsKLQkgICAgICAqY291bnQgPSBuOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuICgxKTsKLX0KLQotLyogUkVTVUxUIHdpbGwgYmUgaW5pdGlhbGlzZWQgaGVyZTsgaXQgd2lsbCBiZSBmcmVlZCBvbiBmYWlsdXJlLiAgVGhlCi0gICB2YWx1ZSByZXR1cm5lZCBpcyByZWFsbHkgYSB0eXBlX2tpbmRfdC4gICovCi0KLXN0YXRpYyBpbnQKLWRvX3R5cGUgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLXsKLSAgaW50IG47Ci0gIGludCBkb25lOwotICBpbnQgc3VjY2VzczsKLSAgc3RyaW5nIGRlY2w7Ci0gIGNvbnN0IGNoYXIgKnJlbWVtYmVyZWRfdHlwZTsKLSAgaW50IHR5cGVfcXVhbHM7Ci0gIHN0cmluZyBidHlwZTsKLSAgdHlwZV9raW5kX3QgdGsgPSB0a19ub25lOwotCi0gIHN0cmluZ19pbml0ICgmYnR5cGUpOwotICBzdHJpbmdfaW5pdCAoJmRlY2wpOwotICBzdHJpbmdfaW5pdCAocmVzdWx0KTsKLQotICBkb25lID0gMDsKLSAgc3VjY2VzcyA9IDE7Ci0gIHdoaWxlIChzdWNjZXNzICYmICFkb25lKQotICAgIHsKLSAgICAgIGludCBtZW1iZXI7Ci0gICAgICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLQl7Ci0KLQkgIC8qIEEgcG9pbnRlciB0eXBlICovCi0JY2FzZSAnUCc6Ci0JY2FzZSAncCc6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBpZiAoISAod29yayAtPiBvcHRpb25zICYgRE1HTF9KQVZBKSkKLQkgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiKiIpOwotCSAgaWYgKHRrID09IHRrX25vbmUpCi0JICAgIHRrID0gdGtfcG9pbnRlcjsKLQkgIGJyZWFrOwotCi0JICAvKiBBIHJlZmVyZW5jZSB0eXBlICovCi0JY2FzZSAnUic6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICImIik7Ci0JICBpZiAodGsgPT0gdGtfbm9uZSkKLQkgICAgdGsgPSB0a19yZWZlcmVuY2U7Ci0JICBicmVhazsKLQotCSAgLyogQW4gYXJyYXkgKi8KLQljYXNlICdBJzoKLQkgIHsKLQkgICAgKysoKm1hbmdsZWQpOwotCSAgICBpZiAoIVNUUklOR19FTVBUWSAoJmRlY2wpCi0JCSYmIChkZWNsLmJbMF0gPT0gJyonIHx8IGRlY2wuYlswXSA9PSAnJicpKQotCSAgICAgIHsKLQkJc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiKCIpOwotCQlzdHJpbmdfYXBwZW5kICgmZGVjbCwgIikiKTsKLQkgICAgICB9Ci0JICAgIHN0cmluZ19hcHBlbmQgKCZkZWNsLCAiWyIpOwotCSAgICBpZiAoKiptYW5nbGVkICE9ICdfJykKLQkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSAod29yaywgbWFuZ2xlZCwgJmRlY2wsCi0JCQkJCQkgICAgICB0a19pbnRlZ3JhbCk7Ci0JICAgIGlmICgqKm1hbmdsZWQgPT0gJ18nKQotCSAgICAgICsrKCptYW5nbGVkKTsKLQkgICAgc3RyaW5nX2FwcGVuZCAoJmRlY2wsICJdIik7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JLyogQSBiYWNrIHJlZmVyZW5jZSB0byBhIHByZXZpb3VzbHkgc2VlbiB0eXBlICovCi0JY2FzZSAnVCc6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJm4pIHx8IG4gPj0gd29yayAtPiBudHlwZXMpCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVtZW1iZXJlZF90eXBlID0gd29yayAtPiB0eXBldmVjW25dOwotCSAgICAgIG1hbmdsZWQgPSAmcmVtZW1iZXJlZF90eXBlOwotCSAgICB9Ci0JICBicmVhazsKLQotCSAgLyogQSBmdW5jdGlvbiAqLwotCWNhc2UgJ0YnOgotCSAgKCptYW5nbGVkKSsrOwotCSAgICBpZiAoIVNUUklOR19FTVBUWSAoJmRlY2wpCi0JCSYmIChkZWNsLmJbMF0gPT0gJyonIHx8IGRlY2wuYlswXSA9PSAnJicpKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiKCIpOwotCSAgICAgIHN0cmluZ19hcHBlbmQgKCZkZWNsLCAiKSIpOwotCSAgICB9Ci0JICAvKiBBZnRlciBwaWNraW5nIG9mZiB0aGUgZnVuY3Rpb24gYXJncywgd2UgZXhwZWN0IHRvIGVpdGhlciBmaW5kIHRoZQotCSAgICAgZnVuY3Rpb24gcmV0dXJuIHR5cGUgKHByZWNlZGVkIGJ5IGFuICdfJykgb3IgdGhlIGVuZCBvZiB0aGUKLQkgICAgIHN0cmluZy4gICovCi0JICBpZiAoIWRlbWFuZ2xlX25lc3RlZF9hcmdzICh3b3JrLCBtYW5nbGVkLCAmZGVjbCkKLQkgICAgICB8fCAoKiptYW5nbGVkICE9ICdfJyAmJiAqKm1hbmdsZWQgIT0gJ1wwJykpCi0JICAgIHsKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaWYgKHN1Y2Nlc3MgJiYgKCoqbWFuZ2xlZCA9PSAnXycpKQotCSAgICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQotCWNhc2UgJ00nOgotCWNhc2UgJ08nOgotCSAgewotCSAgICB0eXBlX3F1YWxzID0gVFlQRV9VTlFVQUxJRklFRDsKLQotCSAgICBtZW1iZXIgPSAqKm1hbmdsZWQgPT0gJ00nOwotCSAgICAoKm1hbmdsZWQpKys7Ci0JICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSAmJiAqKm1hbmdsZWQgIT0gJ3QnKQotCSAgICAgIHsKLQkJc3VjY2VzcyA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBzdHJpbmdfYXBwZW5kICgmZGVjbCwgIikiKTsKLQkgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLQkgICAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JICAgICAgewotCQluID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0JCWlmIChuID09IC0xCi0JCSAgICB8fCAoaW50KSBzdHJsZW4gKCptYW5nbGVkKSA8IG4pCi0JCSAgewotCQkgICAgc3VjY2VzcyA9IDA7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCXN0cmluZ19wcmVwZW5kbiAoJmRlY2wsICptYW5nbGVkLCBuKTsKLQkJKm1hbmdsZWQgKz0gbjsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXN0cmluZyB0ZW1wOwotCQlzdHJpbmdfaW5pdCAoJnRlbXApOwotCQlzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsICZ0ZW1wLAotCQkJCQkgICAgIE5VTEwsIDEsIDEpOwotCQlpZiAoc3VjY2VzcykKLQkJICB7Ci0JCSAgICBzdHJpbmdfcHJlcGVuZG4gKCZkZWNsLCB0ZW1wLmIsIHRlbXAucCAtIHRlbXAuYik7Ci0JCSAgICBzdHJpbmdfY2xlYXIgKCZ0ZW1wKTsKLQkJICB9Ci0JCWVsc2UKLQkJICBicmVhazsKLQkgICAgICB9Ci0JICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgIigiKTsKLQkgICAgaWYgKG1lbWJlcikKLQkgICAgICB7Ci0JCXN3aXRjaCAoKiptYW5nbGVkKQotCQkgIHsKLQkJICBjYXNlICdDJzoKLQkJICBjYXNlICdWJzoKLQkJICBjYXNlICd1JzoKLQkJICAgIHR5cGVfcXVhbHMgfD0gY29kZV9mb3JfcXVhbGlmaWVyICgqKm1hbmdsZWQpOwotCQkgICAgKCptYW5nbGVkKSsrOwotCQkgICAgYnJlYWs7Ci0KLQkJICBkZWZhdWx0OgotCQkgICAgYnJlYWs7Ci0JCSAgfQotCi0JCWlmICgqKCptYW5nbGVkKSsrICE9ICdGJykKLQkJICB7Ci0JCSAgICBzdWNjZXNzID0gMDsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGlmICgobWVtYmVyICYmICFkZW1hbmdsZV9uZXN0ZWRfYXJncyAod29yaywgbWFuZ2xlZCwgJmRlY2wpKQotCQl8fCAqKm1hbmdsZWQgIT0gJ18nKQotCSAgICAgIHsKLQkJc3VjY2VzcyA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgKCptYW5nbGVkKSsrOwotCSAgICBpZiAoISBQUklOVF9BTlNJX1FVQUxJRklFUlMpCi0JICAgICAgewotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGlmICh0eXBlX3F1YWxzICE9IFRZUEVfVU5RVUFMSUZJRUQpCi0JICAgICAgewotCQlBUFBFTkRfQkxBTksgKCZkZWNsKTsKLQkJc3RyaW5nX2FwcGVuZCAoJmRlY2wsIHF1YWxpZmllcl9zdHJpbmcgKHR5cGVfcXVhbHMpKTsKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgICBjYXNlICdHJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnQyc6Ci0JY2FzZSAnVic6Ci0JY2FzZSAndSc6Ci0JICBpZiAoUFJJTlRfQU5TSV9RVUFMSUZJRVJTKQotCSAgICB7Ci0JICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKCZkZWNsKSkKLQkJc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiICIpOwotCi0JICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCBkZW1hbmdsZV9xdWFsaWZpZXIgKCoqbWFuZ2xlZCkpOwotCSAgICB9Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQkgIC8qCi0JICAgIH0KLQkgICAgKi8KLQotCSAgLyogZmFsbCB0aHJvdWdoICovCi0JZGVmYXVsdDoKLQkgIGRvbmUgPSAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoc3VjY2Vzcykgc3dpdGNoICgqKm1hbmdsZWQpCi0gICAgewotICAgICAgLyogQSBxdWFsaWZpZWQgbmFtZSwgc3VjaCBhcyAiT3V0ZXI6OklubmVyIi4gICovCi0gICAgY2FzZSAnUSc6Ci0gICAgY2FzZSAnSyc6Ci0gICAgICB7Ci0gICAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCwgMCwgMSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgLyogQSBiYWNrIHJlZmVyZW5jZSB0byBhIHByZXZpb3VzbHkgc2VlbiBzcXVhbmdsZWQgdHlwZSAqLwotICAgIGNhc2UgJ0InOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWYgKCFnZXRfY291bnQgKG1hbmdsZWQsICZuKSB8fCBuID49IHdvcmsgLT4gbnVtYikKLQlzdWNjZXNzID0gMDsKLSAgICAgIGVsc2UKLQlzdHJpbmdfYXBwZW5kIChyZXN1bHQsIHdvcmstPmJ0eXBldmVjW25dKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWCc6Ci0gICAgY2FzZSAnWSc6Ci0gICAgICAvKiBBIHRlbXBsYXRlIHBhcm0uICBXZSBzdWJzdGl0dXRlIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LiAqLwotICAgICAgewotCWludCBpZHg7Ci0KLQkoKm1hbmdsZWQpKys7Ci0JaWR4ID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKLQotCWlmIChpZHggPT0gLTEKLQkgICAgfHwgKHdvcmstPnRtcGxfYXJndmVjICYmIGlkeCA+PSB3b3JrLT5udG1wbF9hcmdzKQotCSAgICB8fCBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpID09IC0xKQotCSAgewotCSAgICBzdWNjZXNzID0gMDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQlpZiAod29yay0+dG1wbF9hcmd2ZWMpCi0JICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIHdvcmstPnRtcGxfYXJndmVjW2lkeF0pOwotCWVsc2UKLQkgIHsKLQkgICAgY2hhciBidWZbMTBdOwotCSAgICBzcHJpbnRmKGJ1ZiwgIlQlZCIsIGlkeCk7Ci0JICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgYnVmKTsKLQkgIH0KLQotCXN1Y2Nlc3MgPSAxOwotICAgICAgfQotICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9mdW5kX3R5cGUgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCk7Ci0gICAgICBpZiAodGsgPT0gdGtfbm9uZSkKLQl0ayA9ICh0eXBlX2tpbmRfdCkgc3VjY2VzczsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoc3VjY2VzcykKLSAgICB7Ci0gICAgICBpZiAoIVNUUklOR19FTVBUWSAoJmRlY2wpKQotCXsKLQkgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIiAiKTsKLQkgIHN0cmluZ19hcHBlbmRzIChyZXN1bHQsICZkZWNsKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgc3RyaW5nX2RlbGV0ZSAocmVzdWx0KTsKLSAgc3RyaW5nX2RlbGV0ZSAoJmRlY2wpOwotCi0gIGlmIChzdWNjZXNzKQotICAgIC8qIEFzc3VtZSBhbiBpbnRlZ3JhbCB0eXBlLCBpZiB3ZSdyZSBub3Qgc3VyZS4gICovCi0gICAgcmV0dXJuIChpbnQpICgodGsgPT0gdGtfbm9uZSkgPyB0a19pbnRlZ3JhbCA6IHRrKTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBHaXZlbiBhIHBvaW50ZXIgdG8gYSB0eXBlIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgYSBmdW5kYW1lbnRhbCB0eXBlCi0gICBhcmd1bWVudCAoaW50LCBsb25nLCB1bnNpZ25lZCBpbnQsIGV0YykgaW4gVFlQRSwgYSBwb2ludGVyIHRvIHRoZQotICAgc3RyaW5nIGluIHdoaWNoIHRoZSBkZW1hbmdsZWQgb3V0cHV0IGlzIGJlaW5nIGJ1aWx0IGluIFJFU1VMVCwgYW5kCi0gICB0aGUgV09SSyBzdHJ1Y3R1cmUsIGRlY29kZSB0aGUgdHlwZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSByZXN1bHQuCi0KLSAgIEZvciBleGFtcGxlOgotCi0gICAJIkNpIgk9PgkiY29uc3QgaW50IgotCSJTbCIJPT4JInNpZ25lZCBsb25nIgotCSJDVXMiCT0+CSJjb25zdCB1bnNpZ25lZCBzaG9ydCIKLQotICAgVGhlIHZhbHVlIHJldHVybmVkIGlzIHJlYWxseSBhIHR5cGVfa2luZF90LiAgKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfZnVuZF90eXBlICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci17Ci0gIGludCBkb25lID0gMDsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBjaGFyIGJ1ZlsxMF07Ci0gIGludCBkZWMgPSAwOwotICBzdHJpbmcgYnR5cGU7Ci0gIHR5cGVfa2luZF90IHRrID0gdGtfaW50ZWdyYWw7Ci0KLSAgc3RyaW5nX2luaXQgKCZidHlwZSk7Ci0KLSAgLyogRmlyc3QgcGljayBvZmYgYW55IHR5cGUgcXVhbGlmaWVycy4gIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lLiAgKi8KLQotICB3aGlsZSAoIWRvbmUpCi0gICAgewotICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0JewotCWNhc2UgJ0MnOgotCWNhc2UgJ1YnOgotCWNhc2UgJ3UnOgotCSAgaWYgKFBSSU5UX0FOU0lfUVVBTElGSUVSUykKLQkgICAgewotICAgICAgICAgICAgICBpZiAoIVNUUklOR19FTVBUWSAocmVzdWx0KSkKLSAgICAgICAgICAgICAgICBzdHJpbmdfcHJlcGVuZCAocmVzdWx0LCAiICIpOwotCSAgICAgIHN0cmluZ19wcmVwZW5kIChyZXN1bHQsIGRlbWFuZ2xlX3F1YWxpZmllciAoKiptYW5nbGVkKSk7Ci0JICAgIH0KLQkgICgqbWFuZ2xlZCkrKzsKLQkgIGJyZWFrOwotCWNhc2UgJ1UnOgotCSAgKCptYW5nbGVkKSsrOwotCSAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAidW5zaWduZWQiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOiAvKiBzaWduZWQgY2hhciBvbmx5ICovCi0JICAoKm1hbmdsZWQpKys7Ci0JICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0JICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJzaWduZWQiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0onOgotCSAgKCptYW5nbGVkKSsrOwotCSAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiX19jb21wbGV4Iik7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZG9uZSA9IDE7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBwaWNrIG9mZiB0aGUgZnVuZGFtZW50YWwgdHlwZS4gIFRoZXJlIGNhbiBiZSBvbmx5IG9uZS4gICovCi0KLSAgc3dpdGNoICgqKm1hbmdsZWQpCi0gICAgewotICAgIGNhc2UgJ1wwJzoKLSAgICBjYXNlICdfJzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3YnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAidm9pZCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAneCc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJsb25nIGxvbmciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2wnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAibG9uZyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnaSc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJpbnQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAic2hvcnQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2InOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiYm9vbCIpOwotICAgICAgdGsgPSB0a19ib29sOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYyc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJjaGFyIik7Ci0gICAgICB0ayA9IHRrX2NoYXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd3JzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIndjaGFyX3QiKTsKLSAgICAgIHRrID0gdGtfY2hhcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3InOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAibG9uZyBkb3VibGUiKTsKLSAgICAgIHRrID0gdGtfcmVhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiZG91YmxlIik7Ci0gICAgICB0ayA9IHRrX3JlYWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdmJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImZsb2F0Iik7Ci0gICAgICB0ayA9IHRrX3JlYWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdHJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLQl7Ci0JICBzdWNjZXNzID0gMDsKLQkgIGJyZWFrOwotCX0KLSAgICBjYXNlICdJJzoKLSAgICAgICsrKCptYW5nbGVkKTsKLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ18nKQotCXsKLQkgIGludCBpOwotCSAgKysoKm1hbmdsZWQpOwotCSAgZm9yIChpID0gMDsKLQkgICAgICAgKGkgPCBzaXplb2YgKGJ1ZikgLSAxICYmICoqbWFuZ2xlZCAmJiAqKm1hbmdsZWQgIT0gJ18nKTsKLQkgICAgICAgKysoKm1hbmdsZWQpLCArK2kpCi0JICAgIGJ1ZltpXSA9ICoqbWFuZ2xlZDsKLQkgIGlmICgqKm1hbmdsZWQgIT0gJ18nKQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJ1ZltpXSA9ICdcMCc7Ci0JICArKygqbWFuZ2xlZCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cm5jcHkgKGJ1ZiwgKm1hbmdsZWQsIDIpOwotCSAgYnVmWzJdID0gJ1wwJzsKLQkgICptYW5nbGVkICs9IDI7Ci0JfQotICAgICAgc3NjYW5mIChidWYsICIleCIsICZkZWMpOwotICAgICAgc3ByaW50ZiAoYnVmLCAiaW50JWlfdCIsIGRlYyk7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIGJ1Zik7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAvKiBBbiBleHBsaWNpdCB0eXBlLCBzdWNoIGFzICI2bXl0eXBlIiBvciAiN2ludGVnZXIiICovCi0gICAgY2FzZSAnMCc6Ci0gICAgY2FzZSAnMSc6Ci0gICAgY2FzZSAnMic6Ci0gICAgY2FzZSAnMyc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnNyc6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnOSc6Ci0gICAgICB7Ci0gICAgICAgIGludCBiaW5kZXggPSByZWdpc3Rlcl9CdHlwZSAod29yayk7Ci0gICAgICAgIHN0cmluZyBidHlwZTsKLSAgICAgICAgc3RyaW5nX2luaXQgKCZidHlwZSk7Ci0gICAgICAgIGlmIChkZW1hbmdsZV9jbGFzc19uYW1lICh3b3JrLCBtYW5nbGVkLCAmYnR5cGUpKSB7Ci0gICAgICAgICAgcmVtZW1iZXJfQnR5cGUgKHdvcmssIGJ0eXBlLmIsIExFTl9TVFJJTkcgKCZidHlwZSksIGJpbmRleCk7Ci0gICAgICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgICAgIHN0cmluZ19hcHBlbmRzIChyZXN1bHQsICZidHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHN1Y2Nlc3MgPSAwOwotICAgICAgICBzdHJpbmdfZGVsZXRlICgmYnR5cGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICBjYXNlICd0JzoKLSAgICAgIHsKLSAgICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCAmYnR5cGUsIDAsIDEsIDEpOwotICAgICAgICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCAmYnR5cGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHN1Y2Nlc3MgPyAoKGludCkgdGspIDogMDsKLX0KLQotCi0vKiBIYW5kbGUgYSB0ZW1wbGF0ZSdzIHZhbHVlIHBhcmFtZXRlciBmb3IgSFAgYUNDIChleHRlbnNpb24gZnJvbSBBUk0pCi0gICAqKm1hbmdsZWQgcG9pbnRzIHRvICdTJyBvciAnVScgKi8KLQotc3RhdGljIGludAotZG9faHBhY2NfdGVtcGxhdGVfY29uc3RfdmFsdWUgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLXsKLSAgaW50IHVuc2lnbmVkX2NvbnN0OwotCi0gIGlmICgqKm1hbmdsZWQgIT0gJ1UnICYmICoqbWFuZ2xlZCAhPSAnUycpCi0gICAgcmV0dXJuIDA7Ci0KLSAgdW5zaWduZWRfY29uc3QgPSAoKiptYW5nbGVkID09ICdVJyk7Ci0KLSAgKCptYW5nbGVkKSsrOwotCi0gIHN3aXRjaCAoKiptYW5nbGVkKQotICAgIHsKLSAgICAgIGNhc2UgJ04nOgotICAgICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICItIik7Ci0gICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgY2FzZSAnUCc6Ci0gICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdNJzoKLSAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciAtMl4zMSAqLwotICAgICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICItMjE0NzQ4MzY0OCIpOwotICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFdlIGhhdmUgdG8gYmUgbG9va2luZyBhdCBhbiBpbnRlZ2VyIG5vdyAqLwotICBpZiAoIShpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBXZSBvbmx5IGRlYWwgd2l0aCBpbnRlZ3JhbCB2YWx1ZXMgZm9yIHRlbXBsYXRlCi0gICAgIHBhcmFtZXRlcnMgLS0gc28gaXQncyBPSyB0byBsb29rIG9ubHkgZm9yIGRpZ2l0cyAqLwotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLSAgICB7Ci0gICAgICBjaGFyX3N0clswXSA9ICoqbWFuZ2xlZDsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgY2hhcl9zdHIpOwotICAgICAgKCptYW5nbGVkKSsrOwotICAgIH0KLQotICBpZiAodW5zaWduZWRfY29uc3QpCi0gICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiVSIpOwotCi0gIC8qIEZJWE1FPyBTb21lIGRheSB3ZSBtYXkgaGF2ZSA2NC1iaXQgKG9yIGxhcmdlciA6LSkgKSBjb25zdGFudHMKLSAgICAgd2l0aCBMIG9yIExMIHN1ZmZpeGVzLiBwYWkvMTk5Ny0wOS0wMyAqLwotCi0gIHJldHVybiAxOyAvKiBzdWNjZXNzICovCi19Ci0KLS8qIEhhbmRsZSBhIHRlbXBsYXRlJ3MgbGl0ZXJhbCBwYXJhbWV0ZXIgZm9yIEhQIGFDQyAoZXh0ZW5zaW9uIGZyb20gQVJNKQotICAgKiptYW5nbGVkIGlzIHBvaW50aW5nIHRvIHRoZSAnQScgKi8KLQotc3RhdGljIGludAotZG9faHBhY2NfdGVtcGxhdGVfbGl0ZXJhbCAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotewotICBpbnQgbGl0ZXJhbF9sZW4gPSAwOwotICBjaGFyICogcmVjdXJzZTsKLSAgY2hhciAqIHJlY3Vyc2VfZGVtOwotCi0gIGlmICgqKm1hbmdsZWQgIT0gJ0EnKQotICAgIHJldHVybiAwOwotCi0gICgqbWFuZ2xlZCkrKzsKLQotICBsaXRlcmFsX2xlbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCi0gIGlmIChsaXRlcmFsX2xlbiA8PSAwKQotICAgIHJldHVybiAwOwotCi0gIC8qIExpdGVyYWwgcGFyYW1ldGVycyBhcmUgbmFtZXMgb2YgYXJyYXlzLCBmdW5jdGlvbnMsIGV0Yy4gIGFuZCB0aGUKLSAgICAgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIHVzZXMgdGhlIGFkZHJlc3Mgb3BlcmF0b3IgKi8KLSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiJiIpOwotCi0gIC8qIE5vdyByZWN1cnNpdmVseSBkZW1hbmdsZSB0aGUgbGl0ZXJhbCBuYW1lICovCi0gIHJlY3Vyc2UgPSAoY2hhciAqKSB4bWFsbG9jIChsaXRlcmFsX2xlbiArIDEpOwotICBtZW1jcHkgKHJlY3Vyc2UsICptYW5nbGVkLCBsaXRlcmFsX2xlbik7Ci0gIHJlY3Vyc2VbbGl0ZXJhbF9sZW5dID0gJ1wwMDAnOwotCi0gIHJlY3Vyc2VfZGVtID0gY3BsdXNfZGVtYW5nbGUgKHJlY3Vyc2UsIHdvcmstPm9wdGlvbnMpOwotCi0gIGlmIChyZWN1cnNlX2RlbSkKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIHJlY3Vyc2VfZGVtKTsKLSAgICAgIGZyZWUgKHJlY3Vyc2VfZGVtKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAocmVzdWx0LCAqbWFuZ2xlZCwgbGl0ZXJhbF9sZW4pOwotICAgIH0KLSAgKCptYW5nbGVkKSArPSBsaXRlcmFsX2xlbjsKLSAgZnJlZSAocmVjdXJzZSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXNuYXJmX251bWVyaWNfbGl0ZXJhbCAoYXJncywgYXJnKQotICAgICBjb25zdCBjaGFyICoqIGFyZ3M7Ci0gICAgIHN0cmluZyAqIGFyZzsKLXsKLSAgaWYgKCoqYXJncyA9PSAnLScpCi0gICAgewotICAgICAgY2hhcl9zdHJbMF0gPSAnLSc7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChhcmcsIGNoYXJfc3RyKTsKLSAgICAgICgqYXJncykrKzsKLSAgICB9Ci0gIGVsc2UgaWYgKCoqYXJncyA9PSAnKycpCi0gICAgKCphcmdzKSsrOwotCi0gIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiphcmdzKSkKLSAgICByZXR1cm4gMDsKLQotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiphcmdzKSkKLSAgICB7Ci0gICAgICBjaGFyX3N0clswXSA9ICoqYXJnczsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGFyZywgY2hhcl9zdHIpOwotICAgICAgKCphcmdzKSsrOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogRGVtYW5nbGUgdGhlIG5leHQgYXJndW1lbnQsIGdpdmVuIGJ5IE1BTkdMRUQgaW50byBSRVNVTFQsIHdoaWNoCi0gICAqc2hvdWxkIGJlIGFuIHVuaW5pdGlhbGl6ZWQqIHN0cmluZy4gIEl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgaGVyZSwKLSAgIGFuZCBmcmVlJ2Qgc2hvdWxkIGFueXRoaW5nIGdvIHdyb25nLiAgKi8KLQotc3RhdGljIGludAotZG9fYXJnICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci17Ci0gIC8qIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQgc28gdGhhdCB3ZSBjYW4gcmVjb3JkIHRoZSB0eXBlLCBmb3IKLSAgICAgbm9uLXNxdWFuZ2xpbmcgdHlwZSByZW1lbWJlcmluZy4gICovCi0gIGNvbnN0IGNoYXIgKnN0YXJ0ID0gKm1hbmdsZWQ7Ci0KLSAgc3RyaW5nX2luaXQgKHJlc3VsdCk7Ci0KLSAgaWYgKHdvcmstPm5yZXBlYXRzID4gMCkKLSAgICB7Ci0gICAgICAtLXdvcmstPm5yZXBlYXRzOwotCi0gICAgICBpZiAod29yay0+cHJldmlvdXNfYXJndW1lbnQgPT0gMCkKLQlyZXR1cm4gMDsKLQotICAgICAgLyogV2Ugd2FudCB0byByZWlzc3VlIHRoZSBwcmV2aW91cyB0eXBlIGluIHRoaXMgYXJndW1lbnQgbGlzdC4gICovCi0gICAgICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCB3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnbicpCi0gICAgewotICAgICAgLyogQSBzcXVhbmdsaW5nLXN0eWxlIHJlcGVhdC4gICovCi0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICB3b3JrLT5ucmVwZWF0cyA9IGNvbnN1bWVfY291bnQobWFuZ2xlZCk7Ci0KLSAgICAgIGlmICh3b3JrLT5ucmVwZWF0cyA8PSAwKQotCS8qIFRoaXMgd2FzIG5vdCBhIHJlcGVhdCBjb3VudCBhZnRlciBhbGwuICAqLwotCXJldHVybiAwOwotCi0gICAgICBpZiAod29yay0+bnJlcGVhdHMgPiA5KQotCXsKLQkgIGlmICgqKm1hbmdsZWQgIT0gJ18nKQotCSAgICAvKiBUaGUgcmVwZWF0IGNvdW50IHNob3VsZCBiZSBmb2xsb3dlZCBieSBhbiAnXycgaW4gdGhpcwotCSAgICAgICBjYXNlLiAgKi8KLQkgICAgcmV0dXJuIDA7Ci0JICBlbHNlCi0JICAgICgqbWFuZ2xlZCkrKzsKLQl9Ci0KLSAgICAgIC8qIE5vdywgdGhlIHJlcGVhdCBpcyBhbGwgc2V0IHVwLiAgKi8KLSAgICAgIHJldHVybiBkb19hcmcgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCk7Ci0gICAgfQotCi0gIC8qIFNhdmUgdGhlIHJlc3VsdCBpbiBXT1JLLT5wcmV2aW91c19hcmd1bWVudCBzbyB0aGF0IHdlIGNhbiBmaW5kIGl0Ci0gICAgIGlmIGl0J3MgcmVwZWF0ZWQuICBOb3RlIHRoYXQgc2F2aW5nIFNUQVJUIGlzIG5vdCBnb29kIGVub3VnaDogd2UKLSAgICAgZG8gbm90IHdhbnQgdG8gYWRkIGFkZGl0aW9uYWwgdHlwZXMgdG8gdGhlIGJhY2stcmVmZXJlbmNlYWJsZQotICAgICB0eXBlIHZlY3RvciB3aGVuIHByb2Nlc3NpbmcgYSByZXBlYXRlZCB0eXBlLiAgKi8KLSAgaWYgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KQotICAgIHN0cmluZ19jbGVhciAod29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICBlbHNlCi0gICAgewotICAgICAgd29yay0+cHJldmlvdXNfYXJndW1lbnQgPSAoc3RyaW5nKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJpbmcpKTsKLSAgICAgIHN0cmluZ19pbml0ICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gICAgfQotCi0gIGlmICghZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgd29yay0+cHJldmlvdXNfYXJndW1lbnQpKQotICAgIHJldHVybiAwOwotCi0gIHN0cmluZ19hcHBlbmRzIChyZXN1bHQsIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLQotICByZW1lbWJlcl90eXBlICh3b3JrLCBzdGFydCwgKm1hbmdsZWQgLSBzdGFydCk7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfdHlwZSAod29yaywgc3RhcnQsIGxlbikKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0OwotICAgICBpbnQgbGVuOwotewotICBjaGFyICp0ZW07Ci0KLSAgaWYgKHdvcmstPmZvcmdldHRpbmdfdHlwZXMpCi0gICAgcmV0dXJuOwotCi0gIGlmICh3b3JrIC0+IG50eXBlcyA+PSB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yayAtPiB0eXBldmVjX3NpemUgPT0gMCkKLQl7Ci0JICB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSA9IDM7Ci0JICB3b3JrIC0+IHR5cGV2ZWMKLQkgICAgPSAoY2hhciAqKikgeG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogd29yayAtPiB0eXBldmVjX3NpemUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSAqPSAyOwotCSAgd29yayAtPiB0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhyZWFsbG9jICgoY2hhciAqKXdvcmsgLT4gdHlwZXZlYywKLQkJCQkgIHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4gdHlwZXZlY19zaXplKTsKLQl9Ci0gICAgfQotICB0ZW0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgbWVtY3B5ICh0ZW0sIHN0YXJ0LCBsZW4pOwotICB0ZW1bbGVuXSA9ICdcMCc7Ci0gIHdvcmsgLT4gdHlwZXZlY1t3b3JrIC0+IG50eXBlcysrXSA9IHRlbTsKLX0KLQotCi0vKiBSZW1lbWJlciBhIEsgdHlwZSBjbGFzcyBxdWFsaWZpZXIuICovCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfS3R5cGUgKHdvcmssIHN0YXJ0LCBsZW4pCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgaW50IGxlbjsKLXsKLSAgY2hhciAqdGVtOwotCi0gIGlmICh3b3JrIC0+IG51bWsgPj0gd29yayAtPiBrc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yayAtPiBrc2l6ZSA9PSAwKQotCXsKLQkgIHdvcmsgLT4ga3NpemUgPSA1OwotCSAgd29yayAtPiBrdHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IGtzaXplKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yayAtPiBrc2l6ZSAqPSAyOwotCSAgd29yayAtPiBrdHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4cmVhbGxvYyAoKGNoYXIgKil3b3JrIC0+IGt0eXBldmVjLAotCQkJCSAgc2l6ZW9mIChjaGFyICopICogd29yayAtPiBrc2l6ZSk7Ci0JfQotICAgIH0KLSAgdGVtID0geG1hbGxvYyAobGVuICsgMSk7Ci0gIG1lbWNweSAodGVtLCBzdGFydCwgbGVuKTsKLSAgdGVtW2xlbl0gPSAnXDAnOwotICB3b3JrIC0+IGt0eXBldmVjW3dvcmsgLT4gbnVtaysrXSA9IHRlbTsKLX0KLQotLyogUmVnaXN0ZXIgYSBCIGNvZGUsIGFuZCBnZXQgYW4gaW5kZXggZm9yIGl0LiBCIGNvZGVzIGFyZSByZWdpc3RlcmVkCi0gICBhcyB0aGV5IGFyZSBzZWVuLCByYXRoZXIgdGhhbiBhcyB0aGV5IGFyZSBjb21wbGV0ZWQsIHNvIG1hcDx0ZW1wPGNoYXI+ID4KLSAgIHJlZ2lzdGVycyBtYXA8dGVtcDxjaGFyPiA+IGFzIEIwLCBhbmQgdGVtcDxjaGFyPiBhcyBCMSAqLwotCi1zdGF0aWMgaW50Ci1yZWdpc3Rlcl9CdHlwZSAod29yaykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci17Ci0gIGludCByZXQ7Ci0KLSAgaWYgKHdvcmsgLT4gbnVtYiA+PSB3b3JrIC0+IGJzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JrIC0+IGJzaXplID09IDApCi0JewotCSAgd29yayAtPiBic2l6ZSA9IDU7Ci0JICB3b3JrIC0+IGJ0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4gYnNpemUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3b3JrIC0+IGJzaXplICo9IDI7Ci0JICB3b3JrIC0+IGJ0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhyZWFsbG9jICgoY2hhciAqKXdvcmsgLT4gYnR5cGV2ZWMsCi0JCQkJICBzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IGJzaXplKTsKLQl9Ci0gICAgfQotICByZXQgPSB3b3JrIC0+IG51bWIrKzsKLSAgd29yayAtPiBidHlwZXZlY1tyZXRdID0gTlVMTDsKLSAgcmV0dXJuKHJldCk7Ci19Ci0KLS8qIFN0b3JlIGEgdmFsdWUgaW50byBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBCIGNvZGUgdHlwZS4gKi8KLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX0J0eXBlICh3b3JrLCBzdGFydCwgbGVuLCBpbmRleCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0OwotICAgICBpbnQgbGVuLCBpbmRleDsKLXsKLSAgY2hhciAqdGVtOwotCi0gIHRlbSA9IHhtYWxsb2MgKGxlbiArIDEpOwotICBtZW1jcHkgKHRlbSwgc3RhcnQsIGxlbik7Ci0gIHRlbVtsZW5dID0gJ1wwJzsKLSAgd29yayAtPiBidHlwZXZlY1tpbmRleF0gPSB0ZW07Ci19Ci0KLS8qIExvc2UgYWxsIHRoZSBpbmZvIHJlbGF0ZWQgdG8gQiBhbmQgSyB0eXBlIGNvZGVzLiAqLwotc3RhdGljIHZvaWQKLWZvcmdldF9CX2FuZF9LX3R5cGVzICh3b3JrKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLXsKLSAgaW50IGk7Ci0KLSAgd2hpbGUgKHdvcmsgLT4gbnVtayA+IDApCi0gICAgewotICAgICAgaSA9IC0tKHdvcmsgLT4gbnVtayk7Ci0gICAgICBpZiAod29yayAtPiBrdHlwZXZlY1tpXSAhPSBOVUxMKQotCXsKLQkgIGZyZWUgKHdvcmsgLT4ga3R5cGV2ZWNbaV0pOwotCSAgd29yayAtPiBrdHlwZXZlY1tpXSA9IE5VTEw7Ci0JfQotICAgIH0KLQotICB3aGlsZSAod29yayAtPiBudW1iID4gMCkKLSAgICB7Ci0gICAgICBpID0gLS0od29yayAtPiBudW1iKTsKLSAgICAgIGlmICh3b3JrIC0+IGJ0eXBldmVjW2ldICE9IE5VTEwpCi0JewotCSAgZnJlZSAod29yayAtPiBidHlwZXZlY1tpXSk7Ci0JICB3b3JrIC0+IGJ0eXBldmVjW2ldID0gTlVMTDsKLQl9Ci0gICAgfQotfQotLyogRm9yZ2V0IHRoZSByZW1lbWJlcmVkIHR5cGVzLCBidXQgbm90IHRoZSB0eXBlIHZlY3RvciBpdHNlbGYuICAqLwotCi1zdGF0aWMgdm9pZAotZm9yZ2V0X3R5cGVzICh3b3JrKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLXsKLSAgaW50IGk7Ci0KLSAgd2hpbGUgKHdvcmsgLT4gbnR5cGVzID4gMCkKLSAgICB7Ci0gICAgICBpID0gLS0od29yayAtPiBudHlwZXMpOwotICAgICAgaWYgKHdvcmsgLT4gdHlwZXZlY1tpXSAhPSBOVUxMKQotCXsKLQkgIGZyZWUgKHdvcmsgLT4gdHlwZXZlY1tpXSk7Ci0JICB3b3JrIC0+IHR5cGV2ZWNbaV0gPSBOVUxMOwotCX0KLSAgICB9Ci19Ci0KLS8qIFByb2Nlc3MgdGhlIGFyZ3VtZW50IGxpc3QgcGFydCBvZiB0aGUgc2lnbmF0dXJlLCBhZnRlciBhbnkgY2xhc3Mgc3BlYwotICAgaGFzIGJlZW4gY29uc3VtZWQsIGFzIHdlbGwgYXMgdGhlIGZpcnN0ICdGJyBjaGFyYWN0ZXIgKGlmIGFueSkuICBGb3IKLSAgIGV4YW1wbGU6Ci0KLSAgICJfX2Fsc19fM2Zvb1JUMCIJCT0+CXByb2Nlc3MgIlJUMCIKLSAgICJjb21wbGV4ZnVuYzVfX0ZQRlBjX1BGbF9pIgk9Pglwcm9jZXNzICJQRlBjX1BGbF9pIgotCi0gICBERUNMUCBtdXN0IGJlIGFscmVhZHkgaW5pdGlhbGlzZWQsIHVzdWFsbHkgbm9uLWVtcHR5LiAgSXQgd29uJ3QgYmUgZnJlZWQKLSAgIG9uIGZhaWx1cmUuCi0KLSAgIE5vdGUgdGhhdCBnKysgZGlmZmVycyBzaWduaWZpY2FudGx5IGZyb20gQVJNIGFuZCBsdWNpZCBzdHlsZSBtYW5nbGluZwotICAgd2l0aCByZWdhcmRzIHRvIHJlZmVyZW5jZXMgdG8gcHJldmlvdXNseSBzZWVuIHR5cGVzLiAgRm9yIGV4YW1wbGUsIGdpdmVuCi0gICB0aGUgc291cmNlIGZyYWdtZW50OgotCi0gICAgIGNsYXNzIGZvbyB7Ci0gICAgICAgcHVibGljOgotICAgICAgIGZvbzo6Zm9vIChpbnQsIGZvbyAmaWEsIGludCwgZm9vICZpYiwgaW50LCBmb28gJmljKTsKLSAgICAgfTsKLQotICAgICBmb286OmZvbyAoaW50LCBmb28gJmlhLCBpbnQsIGZvbyAmaWIsIGludCwgZm9vICZpYykgeyBpYSA9IGliID0gaWM7IH0KLSAgICAgdm9pZCBmb28gKGludCwgZm9vICZpYSwgaW50LCBmb28gJmliLCBpbnQsIGZvbyAmaWMpIHsgaWEgPSBpYiA9IGljOyB9Ci0KLSAgIGcrKyBwcm9kdWNlcyB0aGUgbmFtZXM6Ci0KLSAgICAgX18zZm9vaVJUMGlUMmlUMgotICAgICBmb29fX0ZpUjNmb29pVDFpVDEKLQotICAgd2hpbGUgbGNjIChhbmQgcHJlc3VtYWJseSBvdGhlciBBUk0gc3R5bGUgY29tcGlsZXJzIGFzIHdlbGwpIHByb2R1Y2VzOgotCi0gICAgIGZvb19fRmlSM2Zvb1QxVDJUMVQyCi0gICAgIF9fY3RfXzNmb29GaVIzZm9vVDFUMlQxVDIKLQotICAgTm90ZSB0aGF0IGcrKyBiYXNlcyBpdHMgdHlwZSBudW1iZXJzIHN0YXJ0aW5nIGF0IHplcm8gYW5kIGNvdW50cyBhbGwKLSAgIHByZXZpb3VzbHkgc2VlbiB0eXBlcywgd2hpbGUgbHVjaWQvQVJNIGJhc2VzIGl0cyB0eXBlIG51bWJlcnMgc3RhcnRpbmcKLSAgIGF0IG9uZSBhbmQgb25seSBjb25zaWRlcnMgdHlwZXMgYWZ0ZXIgaXQgaGFzIHNlZW4gdGhlICdGJyBjaGFyYWN0ZXIKLSAgIGluZGljYXRpbmcgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBhcmdzLiAgRm9yIGx1Y2lkL0FSTSBzdHlsZSwgd2UKLSAgIGFjY291bnQgZm9yIHRoaXMgZGlmZmVyZW5jZSBieSBkaXNjYXJkaW5nIGFueSBwcmV2aW91c2x5IHNlZW4gdHlwZXMgd2hlbgotICAgd2Ugc2VlIHRoZSAnRicgY2hhcmFjdGVyLCBhbmQgc3VidHJhY3Rpbmcgb25lIGZyb20gdGhlIHR5cGUgbnVtYmVyCi0gICByZWZlcmVuY2UuCi0KLSAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBzdHJpbmcgYXJnOwotICBpbnQgbmVlZF9jb21tYSA9IDA7Ci0gIGludCByOwotICBpbnQgdDsKLSAgY29uc3QgY2hhciAqdGVtOwotICBjaGFyIHRlbXB0eXBlOwotCi0gIGlmIChQUklOVF9BUkdfVFlQRVMpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIoIik7Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICdcMCcpCi0JewotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJ2b2lkIik7Ci0JfQotICAgIH0KLQotICB3aGlsZSAoKCoqbWFuZ2xlZCAhPSAnXycgJiYgKiptYW5nbGVkICE9ICdcMCcgJiYgKiptYW5nbGVkICE9ICdlJykKLQkgfHwgd29yay0+bnJlcGVhdHMgPiAwKQotICAgIHsKLSAgICAgIGlmICgoKiptYW5nbGVkID09ICdOJykgfHwgKCoqbWFuZ2xlZCA9PSAnVCcpKQotCXsKLQkgIHRlbXB0eXBlID0gKigqbWFuZ2xlZCkrKzsKLQotCSAgaWYgKHRlbXB0eXBlID09ICdOJykKLQkgICAgewotCSAgICAgIGlmICghZ2V0X2NvdW50IChtYW5nbGVkLCAmcikpCi0JCXsKLQkJICByZXR1cm4gKDApOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHIgPSAxOwotCSAgICB9Ci0gICAgICAgICAgaWYgKChIUF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKSAmJiB3b3JrIC0+IG50eXBlcyA+PSAxMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSAxMCBvciBtb3JlIHR5cGVzIHdlIG1pZ2h0IGhhdmUgbW9yZSB0aGFuIGEgMSBkaWdpdAotICAgICAgICAgICAgICAgICBpbmRleCBzbyB3ZSdsbCBoYXZlIHRvIGNvbnN1bWUgdGhlIHdob2xlIGNvdW50IGhlcmUuIFRoaXMKLSAgICAgICAgICAgICAgICAgd2lsbCBsb3NlIGlmIHRoZSBuZXh0IHRoaW5nIGlzIGEgdHlwZSBuYW1lIHByZWNlZGVkIGJ5IGEKLSAgICAgICAgICAgICAgICAgY291bnQgYnV0IGl0J3MgaW1wb3NzaWJsZSB0byBkZW1hbmdsZSB0aGF0IGNhc2UgcHJvcGVybHkKLSAgICAgICAgICAgICAgICAgYW55d2F5LiBFZyBpZiB3ZSBhbHJlYWR5IGhhdmUgMTIgdHlwZXMgaXMgVDEyUGMgIiguLi4sIHR5cGUxLAotICAgICAgICAgICAgICAgICBQYywgLi4uKSIgIG9yICIoLi4uLCB0eXBlMTIsIGNoYXIgKiwgLi4uKSIgKi8KLSAgICAgICAgICAgICAgaWYgKCh0ID0gY29uc3VtZV9jb3VudChtYW5nbGVkKSkgPD0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJnQpKQotCSAgICAJewotCSAgICAgICAgICByZXR1cm4gKDApOwotCSAgICAJfQotCSAgICB9Ci0JICBpZiAoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgdC0tOwotCSAgICB9Ci0JICAvKiBWYWxpZGF0ZSB0aGUgdHlwZSBpbmRleC4gIFByb3RlY3QgYWdhaW5zdCBpbGxlZ2FsIGluZGljZXMgZnJvbQotCSAgICAgbWFsZm9ybWVkIHR5cGUgc3RyaW5ncy4gICovCi0JICBpZiAoKHQgPCAwKSB8fCAodCA+PSB3b3JrIC0+IG50eXBlcykpCi0JICAgIHsKLQkgICAgICByZXR1cm4gKDApOwotCSAgICB9Ci0JICB3aGlsZSAod29yay0+bnJlcGVhdHMgPiAwIHx8IC0tciA+PSAwKQotCSAgICB7Ci0JICAgICAgdGVtID0gd29yayAtPiB0eXBldmVjW3RdOwotCSAgICAgIGlmIChuZWVkX2NvbW1hICYmIFBSSU5UX0FSR19UWVBFUykKLQkJewotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCAiKTsKLQkJfQotCSAgICAgIGlmICghZG9fYXJnICh3b3JrLCAmdGVtLCAmYXJnKSkKLQkJewotCQkgIHJldHVybiAoMCk7Ci0JCX0KLQkgICAgICBpZiAoUFJJTlRfQVJHX1RZUEVTKQotCQl7Ci0JCSAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmYXJnKTsKLQkJfQotCSAgICAgIHN0cmluZ19kZWxldGUgKCZhcmcpOwotCSAgICAgIG5lZWRfY29tbWEgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChuZWVkX2NvbW1hICYmIFBSSU5UX0FSR19UWVBFUykKLQkgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIsICIpOwotCSAgaWYgKCFkb19hcmcgKHdvcmssIG1hbmdsZWQsICZhcmcpKQotCSAgICByZXR1cm4gKDApOwotCSAgaWYgKFBSSU5UX0FSR19UWVBFUykKLQkgICAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmYXJnKTsKLQkgIHN0cmluZ19kZWxldGUgKCZhcmcpOwotCSAgbmVlZF9jb21tYSA9IDE7Ci0JfQotICAgIH0KLQotICBpZiAoKiptYW5nbGVkID09ICdlJykKLSAgICB7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZiAoUFJJTlRfQVJHX1RZUEVTKQotCXsKLQkgIGlmIChuZWVkX2NvbW1hKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIsIik7Ci0JICAgIH0KLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLi4uIik7Ci0JfQotICAgIH0KLQotICBpZiAoUFJJTlRfQVJHX1RZUEVTKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiKSIpOwotICAgIH0KLSAgcmV0dXJuICgxKTsKLX0KLQotLyogTGlrZSBkZW1hbmdsZV9hcmdzLCBidXQgZm9yIGRlbWFuZ2xpbmcgdGhlIGFyZ3VtZW50IGxpc3RzIG9mIGZ1bmN0aW9uCi0gICBhbmQgbWV0aG9kIHBvaW50ZXJzIG9yIHJlZmVyZW5jZXMsIG5vdCB0b3AtbGV2ZWwgZGVjbGFyYXRpb25zLiAgKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfbmVzdGVkX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIHN0cmluZyogc2F2ZWRfcHJldmlvdXNfYXJndW1lbnQ7Ci0gIGludCByZXN1bHQ7Ci0gIGludCBzYXZlZF9ucmVwZWF0czsKLQotICAvKiBUaGUgRysrIG5hbWUtbWFuZ2xpbmcgYWxnb3JpdGhtIGRvZXMgbm90IHJlbWVtYmVyIHR5cGVzIG9uIG5lc3RlZAotICAgICBhcmd1bWVudCBsaXN0cywgdW5sZXNzIC1mc3F1YW5nbGluZyBpcyB1c2VkLCBhbmQgaW4gdGhhdCBjYXNlIHRoZQotICAgICB0eXBlIHZlY3RvciB1cGRhdGVkIGJ5IHJlbWVtYmVyX3R5cGUgaXMgbm90IHVzZWQuICBTbywgd2UgdHVybgotICAgICBvZmYgcmVtZW1iZXJpbmcgb2YgdHlwZXMgaGVyZS4gICovCi0gICsrd29yay0+Zm9yZ2V0dGluZ190eXBlczsKLQotICAvKiBGb3IgdGhlIHJlcGVhdCBjb2RlcyB1c2VkIHdpdGggLWZzcXVhbmdsaW5nLCB3ZSBtdXN0IGtlZXAgdHJhY2sgb2YKLSAgICAgdGhlIGxhc3QgYXJndW1lbnQuICAqLwotICBzYXZlZF9wcmV2aW91c19hcmd1bWVudCA9IHdvcmstPnByZXZpb3VzX2FyZ3VtZW50OwotICBzYXZlZF9ucmVwZWF0cyA9IHdvcmstPm5yZXBlYXRzOwotICB3b3JrLT5wcmV2aW91c19hcmd1bWVudCA9IDA7Ci0gIHdvcmstPm5yZXBlYXRzID0gMDsKLQotICAvKiBBY3R1YWxseSBkZW1hbmdsZSB0aGUgYXJndW1lbnRzLiAgKi8KLSAgcmVzdWx0ID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCi0gIC8qIFJlc3RvcmUgdGhlIHByZXZpb3VzX2FyZ3VtZW50IGZpZWxkLiAgKi8KLSAgaWYgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KQotICAgIHN0cmluZ19kZWxldGUgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLSAgd29yay0+cHJldmlvdXNfYXJndW1lbnQgPSBzYXZlZF9wcmV2aW91c19hcmd1bWVudDsKLSAgLS13b3JrLT5mb3JnZXR0aW5nX3R5cGVzOwotICB3b3JrLT5ucmVwZWF0cyA9IHNhdmVkX25yZXBlYXRzOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZW1hbmdsZV9mdW5jdGlvbl9uYW1lICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgc2NhbikKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotICAgICBjb25zdCBjaGFyICpzY2FuOwotewotICBzaXplX3QgaTsKLSAgc3RyaW5nIHR5cGU7Ci0gIGNvbnN0IGNoYXIgKnRlbTsKLQotICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICgqbWFuZ2xlZCksIHNjYW4gLSAoKm1hbmdsZWQpKTsKLSAgc3RyaW5nX25lZWQgKGRlY2xwLCAxKTsKLSAgKihkZWNscCAtPiBwKSA9ICdcMCc7Ci0KLSAgLyogQ29uc3VtZSB0aGUgZnVuY3Rpb24gbmFtZSwgaW5jbHVkaW5nIHRoZSAiX18iIHNlcGFyYXRpbmcgdGhlIG5hbWUKLSAgICAgZnJvbSB0aGUgc2lnbmF0dXJlLiAgV2UgYXJlIGd1YXJhbnRlZWQgdGhhdCBTQ0FOIHBvaW50cyB0byB0aGUKLSAgICAgc2VwYXJhdG9yLiAgKi8KLQotICAoKm1hbmdsZWQpID0gc2NhbiArIDI7Ci0gIC8qIFdlIG1heSBiZSBsb29raW5nIGF0IGFuIGluc3RhbnRpYXRpb24gb2YgYSB0ZW1wbGF0ZSBmdW5jdGlvbjoKLSAgICAgZm9vX19YdDF0Ml9GdDN0NCwgd2hlcmUgdDEsIHQyLCAuLi4gYXJlIHRlbXBsYXRlIGFyZ3VtZW50cyBhbmQgYQotICAgICBmb2xsb3dpbmcgX0YgbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuICBIYW5kbGUKLSAgICAgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBmaXJzdC4gKi8KLQotICBpZiAoSFBfREVNQU5HTElORyAmJiAoKiptYW5nbGVkID09ICdYJykpCi0gICAgewotICAgICAgZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCAwLCBkZWNscCk7Ci0gICAgICAvKiBUaGlzIGxlYXZlcyBNQU5HTEVEIHBvaW50aW5nIHRvIHRoZSAnRicgbWFya2luZyBmdW5jIGFyZ3MgKi8KLSAgICB9Ci0KLSAgaWYgKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLSAgICB7Ci0KLSAgICAgIC8qIFNlZSBpZiB3ZSBoYXZlIGFuIEFSTSBzdHlsZSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG9wZXJhdG9yLgotCSBJZiBzbywgdGhlbiBqdXN0IHJlY29yZCBpdCwgY2xlYXIgdGhlIGRlY2wsIGFuZCByZXR1cm4uCi0JIFdlIGNhbid0IGJ1aWxkIHRoZSBhY3R1YWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBkZWNsIHVudGlsIGxhdGVyLAotCSB3aGVuIHdlIHJlY292ZXIgdGhlIGNsYXNzIG5hbWUgZnJvbSB0aGUgc2lnbmF0dXJlLiAgKi8KLQotICAgICAgaWYgKHN0cmNtcCAoZGVjbHAgLT4gYiwgIl9fY3QiKSA9PSAwKQotCXsKLQkgIHdvcmsgLT4gY29uc3RydWN0b3IgKz0gMTsKLQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZGVjbHAgLT4gYiwgIl9fZHQiKSA9PSAwKQotCXsKLQkgIHdvcmsgLT4gZGVzdHJ1Y3RvciArPSAxOwotCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoZGVjbHAtPnAgLSBkZWNscC0+YiA+PSAzCi0gICAgICAmJiBkZWNscC0+YlswXSA9PSAnbycKLSAgICAgICYmIGRlY2xwLT5iWzFdID09ICdwJwotICAgICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCBkZWNscC0+YlsyXSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBzZWUgaWYgaXQncyBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gKi8KLSAgICAgIGlmIChkZWNscC0+cCAtIGRlY2xwLT5iID49IDEwIC8qIG9wJGFzc2lnbl8gKi8KLQkgICYmIG1lbWNtcCAoZGVjbHAtPmIgKyAzLCAiYXNzaWduXyIsIDcpID09IDApCi0JewotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBpbnQgbGVuID0gZGVjbHAtPnAgLSBkZWNscC0+YiAtIDEwOwotCSAgICAgIGlmICgoaW50KSBzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IGxlbgotCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgZGVjbHAtPmIgKyAxMCwgbGVuKSA9PSAwKQotCQl7Ci0JCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciIpOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI9Iik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGludCBsZW4gPSBkZWNscC0+cCAtIGRlY2xwLT5iIC0gMzsKLQkgICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSBsZW4KLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMywgbGVuKSA9PSAwKQotCQl7Ci0JCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciIpOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGRlY2xwLT5wIC0gZGVjbHAtPmIgPj0gNSAmJiBtZW1jbXAgKGRlY2xwLT5iLCAidHlwZSIsIDQpID09IDAKLQkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsIGRlY2xwLT5iWzRdKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvciAqLwotICAgICAgdGVtID0gZGVjbHAtPmIgKyA1OwotICAgICAgaWYgKGRvX3R5cGUgKHdvcmssICZ0ZW0sICZ0eXBlKSkKLQl7Ci0JICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IgIik7Ci0JICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZ0eXBlKTsKLQkgIHN0cmluZ19kZWxldGUgKCZ0eXBlKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChkZWNscC0+YlswXSA9PSAnXycgJiYgZGVjbHAtPmJbMV0gPT0gJ18nCi0JICAgJiYgZGVjbHAtPmJbMl0gPT0gJ28nICYmIGRlY2xwLT5iWzNdID09ICdwJykKLSAgICB7Ci0gICAgICAvKiBBTlNJLiAgKi8KLSAgICAgIC8qIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCi0gICAgICB0ZW0gPSBkZWNscC0+YiArIDQ7Ci0gICAgICBpZiAoZG9fdHlwZSAod29yaywgJnRlbSwgJnR5cGUpKQotCXsKLQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciAiKTsKLQkgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJnR5cGUpOwotCSAgc3RyaW5nX2RlbGV0ZSAoJnR5cGUpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGRlY2xwLT5iWzBdID09ICdfJyAmJiBkZWNscC0+YlsxXSA9PSAnXycKLQkgICAmJiBkZWNscC0+YlsyXSA+PSAnYScgJiYgZGVjbHAtPmJbMl0gPD0gJ3onCi0JICAgJiYgZGVjbHAtPmJbM10gPj0gJ2EnICYmIGRlY2xwLT5iWzNdIDw9ICd6JykKLSAgICB7Ci0gICAgICBpZiAoZGVjbHAtPmJbNF0gPT0gJ1wwJykKLQl7Ci0JICAvKiBPcGVyYXRvci4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IDIKLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMiwgMikgPT0gMCkKLQkJewotCQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGRlY2xwLT5iWzJdID09ICdhJyAmJiBkZWNscC0+Yls1XSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgLyogQXNzaWdubWVudC4gICovCi0JICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JCXsKLQkJICBpZiAoc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSAzCi0JCSAgICAgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgZGVjbHAtPmIgKyAyLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkJICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICJvcGVyYXRvciIpOwotCQkgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogYSBtaW5pIHN0cmluZy1oYW5kbGluZyBwYWNrYWdlICovCi0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfbmVlZCAocywgbikKLSAgICAgc3RyaW5nICpzOwotICAgICBpbnQgbjsKLXsKLSAgaW50IHRlbTsKLQotICBpZiAocy0+YiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChuIDwgMzIpCi0JewotCSAgbiA9IDMyOwotCX0KLSAgICAgIHMtPnAgPSBzLT5iID0geG1hbGxvYyAobik7Ci0gICAgICBzLT5lID0gcy0+YiArIG47Ci0gICAgfQotICBlbHNlIGlmIChzLT5lIC0gcy0+cCA8IG4pCi0gICAgewotICAgICAgdGVtID0gcy0+cCAtIHMtPmI7Ci0gICAgICBuICs9IHRlbTsKLSAgICAgIG4gKj0gMjsKLSAgICAgIHMtPmIgPSB4cmVhbGxvYyAocy0+Yiwgbik7Ci0gICAgICBzLT5wID0gcy0+YiArIHRlbTsKLSAgICAgIHMtPmUgPSBzLT5iICsgbjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfZGVsZXRlIChzKQotICAgICBzdHJpbmcgKnM7Ci17Ci0gIGlmIChzLT5iICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAocy0+Yik7Ci0gICAgICBzLT5iID0gcy0+ZSA9IHMtPnAgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19pbml0IChzKQotICAgICBzdHJpbmcgKnM7Ci17Ci0gIHMtPmIgPSBzLT5wID0gcy0+ZSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfY2xlYXIgKHMpCi0gICAgIHN0cmluZyAqczsKLXsKLSAgcy0+cCA9IHMtPmI7Ci19Ci0KLSNpZiAwCi0KLXN0YXRpYyBpbnQKLXN0cmluZ19lbXB0eSAocykKLSAgICAgc3RyaW5nICpzOwotewotICByZXR1cm4gKHMtPmIgPT0gcy0+cCk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZCAocCwgcykKLSAgICAgc3RyaW5nICpwOwotICAgICBjb25zdCBjaGFyICpzOwotewotICBpbnQgbjsKLSAgaWYgKHMgPT0gTlVMTCB8fCAqcyA9PSAnXDAnKQotICAgIHJldHVybjsKLSAgbiA9IHN0cmxlbiAocyk7Ci0gIHN0cmluZ19uZWVkIChwLCBuKTsKLSAgbWVtY3B5IChwLT5wLCBzLCBuKTsKLSAgcC0+cCArPSBuOwotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZHMgKHAsIHMpCi0gICAgIHN0cmluZyAqcCwgKnM7Ci17Ci0gIGludCBuOwotCi0gIGlmIChzLT5iICE9IHMtPnApCi0gICAgewotICAgICAgbiA9IHMtPnAgLSBzLT5iOwotICAgICAgc3RyaW5nX25lZWQgKHAsIG4pOwotICAgICAgbWVtY3B5IChwLT5wLCBzLT5iLCBuKTsKLSAgICAgIHAtPnAgKz0gbjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kbiAocCwgcywgbikKLSAgICAgc3RyaW5nICpwOwotICAgICBjb25zdCBjaGFyICpzOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKG4gIT0gMCkKLSAgICB7Ci0gICAgICBzdHJpbmdfbmVlZCAocCwgbik7Ci0gICAgICBtZW1jcHkgKHAtPnAsIHMsIG4pOwotICAgICAgcC0+cCArPSBuOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kIChwLCBzKQotICAgICBzdHJpbmcgKnA7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGlmIChzICE9IE5VTEwgJiYgKnMgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBzdHJpbmdfcHJlcGVuZG4gKHAsIHMsIHN0cmxlbiAocykpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19wcmVwZW5kcyAocCwgcykKLSAgICAgc3RyaW5nICpwLCAqczsKLXsKLSAgaWYgKHMtPmIgIT0gcy0+cCkKLSAgICB7Ci0gICAgICBzdHJpbmdfcHJlcGVuZG4gKHAsIHMtPmIsIHMtPnAgLSBzLT5iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZG4gKHAsIHMsIG4pCi0gICAgIHN0cmluZyAqcDsKLSAgICAgY29uc3QgY2hhciAqczsKLSAgICAgaW50IG47Ci17Ci0gIGNoYXIgKnE7Ci0KLSAgaWYgKG4gIT0gMCkKLSAgICB7Ci0gICAgICBzdHJpbmdfbmVlZCAocCwgbik7Ci0gICAgICBmb3IgKHEgPSBwLT5wIC0gMTsgcSA+PSBwLT5iOyBxLS0pCi0JewotCSAgcVtuXSA9IHFbMF07Ci0JfQotICAgICAgbWVtY3B5IChwLT5iLCBzLCBuKTsKLSAgICAgIHAtPnAgKz0gbjsKLSAgICB9Ci19Ci0KLS8qIFRvIGdlbmVyYXRlIGEgc3RhbmRhbG9uZSBkZW1hbmdsZXIgcHJvZ3JhbSBmb3IgdGVzdGluZyBwdXJwb3NlcywKLSAgIGp1c3QgY29tcGlsZSBhbmQgbGluayB0aGlzIGZpbGUgd2l0aCAtRE1BSU4gYW5kIGxpYmliZXJ0eS5hLiAgV2hlbgotICAgcnVuLCBpdCBkZW1hbmdsZXMgZWFjaCBjb21tYW5kIGxpbmUgYXJnLCBvciBlYWNoIHN0ZGluIHN0cmluZywgYW5kCi0gICBwcmludHMgdGhlIHJlc3VsdCBvbiBzdGRvdXQuICAqLwotCi0jaWZkZWYgTUFJTgotCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLXN0YXRpYyBjaGFyICpwcm9ncmFtX25hbWU7Ci1zdGF0aWMgY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gVkVSU0lPTjsKLXN0YXRpYyBpbnQgZmxhZ3MgPSBETUdMX1BBUkFNUyB8IERNR0xfQU5TSTsKLQotc3RhdGljIHZvaWQgZGVtYW5nbGVfaXQgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgZmF0YWwgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kZW1hbmdsZV9pdCAobWFuZ2xlZF9uYW1lKQotICAgICBjaGFyICptYW5nbGVkX25hbWU7Ci17Ci0gIGNoYXIgKnJlc3VsdDsKLQotICByZXN1bHQgPSBjcGx1c19kZW1hbmdsZSAobWFuZ2xlZF9uYW1lLCBmbGFncyk7Ci0gIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlc1xuIiwgbWFuZ2xlZF9uYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCIlc1xuIiwgcmVzdWx0KTsKLSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgIlwKLVVzYWdlOiAlcyBbLV9dIFstbl0gWy1zIHtnbnUsbHVjaWQsYXJtLGhwLGVkZ31dIFstLXN0cmlwLXVuZGVyc2NvcmVzXVxuXAotICAgICAgIFstLW5vLXN0cmlwLXVuZGVyc2NvcmVzXSBbLS1mb3JtYXQ9e2dudSxsdWNpZCxhcm0saHAsZWRnfV1cblwKLSAgICAgIFstLWhlbHBdIFstLXZlcnNpb25dIFthcmcuLi5dXG4iLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLSNkZWZpbmUgTUJVRl9TSVpFIDMyNzY3Ci1jaGFyIG1idWZmZXJbTUJVRl9TSVpFXTsKLQotLyogRGVmaW5lZCBpbiB0aGUgYXV0b21hdGljYWxseS1nZW5lcmF0ZWQgdW5kZXJzY29yZS5jLiAgKi8KLWV4dGVybiBpbnQgcHJlcGVuZHNfdW5kZXJzY29yZTsKLQotaW50IHN0cmlwX3VuZGVyc2NvcmUgPSAwOwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKLSAgeyJzdHJpcC11bmRlcnNjb3JlcyIsIG5vX2FyZ3VtZW50LCAwLCAnXyd9LAotICB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAncyd9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKLSAgeyJqYXZhIiwgbm9fYXJndW1lbnQsIDAsICdqJ30sCi0gIHsibm8tc3RyaXAtdW5kZXJzY29yZXMiLCBub19hcmd1bWVudCwgMCwgJ24nfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICd2J30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLS8qIE1vcmUgJ2ZyaWVuZGx5JyBhYm9ydCB0aGF0IHByaW50cyB0aGUgbGluZSBhbmQgZmlsZS4KLSAgIGNvbmZpZy5oIGNhbiAjZGVmaW5lIGFib3J0IGZhbmN5X2Fib3J0IGlmIHlvdSBsaWtlIHRoYXQgc29ydCBvZiB0aGluZy4gICovCi0KLXZvaWQKLWZhbmN5X2Fib3J0ICgpCi17Ci0gIGZhdGFsICgiSW50ZXJuYWwgZ2NjIGFib3J0LiIpOwotfQotCi0KLS8qIEZpbGwgaW4gVEFCTEUgc28gdGhhdCBUQUJMRVtDXSBpcyB0cnVlIGlmZiBDIChhcyBhbiB1bnNpZ25lZCBjaGFyKQotICAgaXMgYSB2YWxpZCBzeW1ib2wgY29tcG9uZW50LCBpbiB0aGUgc3RhbmRhcmQgYXNzZW1ibGVyIHN5bWJvbAotICAgc3ludGF4LiAgKi8KLXZvaWQKLXN0YW5kYXJkX3N5bWJvbF9hbHBoYWJldCAoY2hhciAqdGFibGUpCi17Ci0gIGludCBjOwotCi0gIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykKLSAgICB0YWJsZVtjXSA9IGlzYWxudW0oYyk7Ci0KLSAgdGFibGVbJ18nXSA9IDE7Ci0gIHRhYmxlWyckJ10gPSAxOwotICB0YWJsZVsnLiddID0gMTsKLX0KLQotCi0vKiBGaWxsIGluIFRBQkxFIHNvIHRoYXQgVEFCTEVbQ10gaXMgdHJ1ZSBpZmYgQyAoYXMgYW4gdW5zaWduZWQgY2hhcikKLSAgIGlzIGEgdmFsaWQgc3ltYm9sIG5hbWUgY29tcG9uZW50IGluIGFuIEhQIG9iamVjdCBmaWxlLgotCi0gICBOb3RlIHRoYXQsIHNpbmNlIEhQJ3MgY29tcGlsZXIgZ2VuZXJhdGVzIG9iamVjdCBjb2RlIHN0cmFpZ2h0IGZyb20KLSAgIEMrKyBzb3VyY2UsIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBhbiBhc3NlbWJsZXIsIGl0cyBtYW5nbGVkCi0gICBpZGVudGlmaWVycyBjYW4gdXNlIGFsbCBzb3J0cyBvZiBjaGFyYWN0ZXJzIHRoYXQgbm8gYXNzZW1ibGVyIHdvdWxkCi0gICB0b2xlcmF0ZSwgc28gdGhlIGFscGhhYmV0IHRoaXMgZnVuY3Rpb24gY3JlYXRlcyBpcyBhIGxpdHRsZSBvZGQuCi0gICBIZXJlIGFyZSBzb21lIHNhbXBsZSBtYW5nbGVkIGlkZW50aWZpZXJzIG9mZmVyZWQgYnkgSFA6Ci0KLQl0eXBlaWQqX19YVDI0QWRkcmVzc0luZEV4cENsYXNzTWVtYmVyXwotCVtWZnRwdHJda2V5Ol9fZHRfXzMyT3JkaW5hcnlDb21wYXJlSW5kRXhwQ2xhc3NNZW1iZXJGdgotCV9fY3RfX1EyXzlFbGY2NF9EeW4xOHt1bm5hbWVkLnVuaW9uLiMxfUZ2Ci0KLSAgIFRoaXMgc3RpbGwgc2VlbXMgcmVhbGx5IHdlaXJkIHRvIG1lLCBzaW5jZSBub3doZXJlIGVsc2UgaW4gdGhpcwotICAgZmlsZSBpcyB0aGVyZSBhbnl0aGluZyB0byByZWNvZ25pemUgY3VybHkgYnJhY2tldHMsIHBhcmVucywgZXRjLgotICAgSSd2ZSB0YWxrZWQgd2l0aCBTcmlrYW50aCA8c3Jpa2FudGhAY3VwLmhwLmNvbT4sIGFuZCBoZSBhc3N1cmVzIG1lCi0gICB0aGlzIGlzIHJpZ2h0LCBidXQgSSBzdGlsbCBzdHJvbmdseSBzdXNwZWN0IHRoYXQgdGhlcmUncyBhCi0gICBtaXN1bmRlcnN0YW5kaW5nIGhlcmUuCi0KLSAgIElmIHdlIGRlY2lkZSBpdCdzIGJldHRlciBmb3IgYysrZmlsdCB0byB1c2UgSFAncyBhc3NlbWJsZXIgc3ludGF4Ci0gICB0byBzY3JhcGUgaWRlbnRpZmllcnMgb3V0IG9mIGl0cyBpbnB1dCwgaGVyZSdzIHRoZSBkZWZpbml0aW9uIG9mCi0gICB0aGUgc3ltYm9sIG5hbWUgc3ludGF4IGZyb20gdGhlIEhQIGFzc2VtYmxlciBtYW51YWw6Ci0KLSAgICAgICBTeW1ib2xzIGFyZSBjb21wb3NlZCBvZiB1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSBsZXR0ZXJzLCBkZWNpbWFsCi0gICAgICAgZGlnaXRzLCBkb2xsYXIgc3ltYm9sLCBwZXJpb2QgKC4pLCBhbXBlcnNhbmQgKCYpLCBwb3VuZCBzaWduKCMpIGFuZAotICAgICAgIHVuZGVyc2NvcmUgKF8pLiBBIHN5bWJvbCBjYW4gYmVnaW4gd2l0aCBhIGxldHRlciwgZGlnaXQgdW5kZXJzY29yZSBvcgotICAgICAgIGRvbGxhciBzaWduLiBJZiBhIHN5bWJvbCBiZWdpbnMgd2l0aCBhIGRpZ2l0LCBpdCBtdXN0IGNvbnRhaW4gYQotICAgICAgIG5vbi1kaWdpdCBjaGFyYWN0ZXIuCi0KLSAgIFNvIGhhdmUgZnVuLiAgKi8KLXZvaWQKLWhwX3N5bWJvbF9hbHBoYWJldCAoY2hhciAqdGFibGUpCi17Ci0gIGNoYXIgKmM7Ci0KLSAgc3RhbmRhcmRfc3ltYm9sX2FscGhhYmV0ICh0YWJsZSk7Ci0KLSAgZm9yIChjID0gIjw+IywqJltdOigpe30iOyAqYzsgYysrKQotICAgIHRhYmxlWyh1bnNpZ25lZCBjaGFyKSAqY10gPSAxOwotfQotCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBjaGFyICpyZXN1bHQ7Ci0gIGludCBjOwotICBjaGFyIHN5bWJvbF9hbHBoYWJldFsyNTZdOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0KLSAgc3RyaXBfdW5kZXJzY29yZSA9IHByZXBlbmRzX3VuZGVyc2NvcmU7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJfbnM6aiIsIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnPyc6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JY2FzZSAnbic6Ci0JICBzdHJpcF91bmRlcnNjb3JlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgcHJpbnRmICgiR05VICVzIChDKysgZGVtYW5nbGVyKSwgdmVyc2lvbiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBwcm9ncmFtX3ZlcnNpb24pOwotCSAgZXhpdCAoMCk7Ci0JY2FzZSAnXyc6Ci0JICBzdHJpcF91bmRlcnNjb3JlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2onOgotCSAgZmxhZ3MgfD0gRE1HTF9KQVZBOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBpZiAoc3RyY21wIChvcHRhcmcsICJnbnUiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlID0gZ251X2RlbWFuZ2xpbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAibHVjaWQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlID0gbHVjaWRfZGVtYW5nbGluZzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJhcm0iKSA9PSAwKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlID0gYXJtX2RlbWFuZ2xpbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAiaHAiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlID0gaHBfZGVtYW5nbGluZzsKLQkgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAiZWRnIikgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlID0gZWRnX2RlbWFuZ2xpbmc7Ci0gICAgICAgICAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogdW5rbm93biBkZW1hbmdsaW5nIHN0eWxlIGAlcydcbiIsCi0JCSAgICAgICBwcm9ncmFtX25hbWUsIG9wdGFyZyk7Ci0JICAgICAgZXhpdCAoMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgZm9yICggOyBvcHRpbmQgPCBhcmdjOyBvcHRpbmQrKykKLQl7Ci0JICBkZW1hbmdsZV9pdCAoYXJndltvcHRpbmRdKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUpCi0JewotCWNhc2UgZ251X2RlbWFuZ2xpbmc6Ci0JY2FzZSBsdWNpZF9kZW1hbmdsaW5nOgotCWNhc2UgYXJtX2RlbWFuZ2xpbmc6Ci0JY2FzZSBlZGdfZGVtYW5nbGluZzoKLQkgIHN0YW5kYXJkX3N5bWJvbF9hbHBoYWJldCAoc3ltYm9sX2FscGhhYmV0KTsKLQkgIGJyZWFrOwotCWNhc2UgaHBfZGVtYW5nbGluZzoKLQkgIGhwX3N5bWJvbF9hbHBoYWJldCAoc3ltYm9sX2FscGhhYmV0KTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAvKiBGb2xrcyBzaG91bGQgZXhwbGljaXRseSBpbmRpY2F0ZSB0aGUgYXBwcm9wcmlhdGUgYWxwaGFiZXQgZm9yCi0JICAgICBlYWNoIGRlbWFuZ2xpbmcuICBQcm92aWRpbmcgYSBkZWZhdWx0IHdvdWxkIGFsbG93IHRoZQotCSAgICAgcXVlc3Rpb24gdG8gZ28gdW5jb25zaWRlcmVkLiAgKi8KLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgZm9yICg7OykKLQl7Ci0JICBpbnQgaSA9IDA7Ci0JICBjID0gZ2V0Y2hhciAoKTsKLQkgIC8qIFRyeSB0byByZWFkIGEgbGFiZWwuICAqLwotCSAgd2hpbGUgKGMgIT0gRU9GICYmIHN5bWJvbF9hbHBoYWJldFtjXSkKLQkgICAgewotCSAgICAgIGlmIChpID49IE1CVUZfU0laRS0xKQotCQlicmVhazsKLQkgICAgICBtYnVmZmVyW2krK10gPSBjOwotCSAgICAgIGMgPSBnZXRjaGFyICgpOwotCSAgICB9Ci0JICBpZiAoaSA+IDApCi0JICAgIHsKLQkgICAgICBpbnQgc2tpcF9maXJzdCA9IDA7Ci0KLQkgICAgICBpZiAobWJ1ZmZlclswXSA9PSAnLicpCi0JCSsrc2tpcF9maXJzdDsKLQkgICAgICBpZiAoc3RyaXBfdW5kZXJzY29yZSAmJiBtYnVmZmVyW3NraXBfZmlyc3RdID09ICdfJykKLQkJKytza2lwX2ZpcnN0OwotCi0JICAgICAgaWYgKHNraXBfZmlyc3QgPiBpKQotCQlza2lwX2ZpcnN0ID0gaTsKLQotCSAgICAgIG1idWZmZXJbaV0gPSAwOwotCi0JICAgICAgcmVzdWx0ID0gY3BsdXNfZGVtYW5nbGUgKG1idWZmZXIgKyBza2lwX2ZpcnN0LCBmbGFncyk7Ci0JICAgICAgaWYgKHJlc3VsdCkKLQkJewotCQkgIGlmIChtYnVmZmVyWzBdID09ICcuJykKLQkJICAgIHB1dGMgKCcuJywgc3Rkb3V0KTsKLQkJICBmcHV0cyAocmVzdWx0LCBzdGRvdXQpOwotCQkgIGZyZWUgKHJlc3VsdCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWZwdXRzIChtYnVmZmVyLCBzdGRvdXQpOwotCi0JICAgICAgZmZsdXNoIChzdGRvdXQpOwotCSAgICB9Ci0JICBpZiAoYyA9PSBFT0YpCi0JICAgIGJyZWFrOwotCSAgcHV0Y2hhciAoYyk7Ci0JfQotICAgIH0KLQotICBleGl0ICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLWZhdGFsIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHN0cik7Ci0gIGV4aXQgKDEpOwotfQotCi1QVFIKLXhtYWxsb2MgKHNpemUpCi0gIHNpemVfdCBzaXplOwotewotICByZWdpc3RlciBQVFIgdmFsdWUgPSAoUFRSKSBtYWxsb2MgKHNpemUpOwotICBpZiAodmFsdWUgPT0gMCkKLSAgICBmYXRhbCAoInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLVBUUgoteHJlYWxsb2MgKHB0ciwgc2l6ZSkKLSAgUFRSIHB0cjsKLSAgc2l6ZV90IHNpemU7Ci17Ci0gIHJlZ2lzdGVyIFBUUiB2YWx1ZSA9IChQVFIpIHJlYWxsb2MgKHB0ciwgc2l6ZSk7Ci0gIGlmICh2YWx1ZSA9PSAwKQotICAgIGZhdGFsICgidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLSNlbmRpZgkvKiBtYWluICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvZmRtYXRjaC5jIGIvbGliaWJlcnR5L2ZkbWF0Y2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmMDM5Zi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvZmRtYXRjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogQ29tcGFyZSB0d28gb3BlbiBmaWxlIGRlc2NyaXB0b3JzIHRvIHNlZSBpZiB0aGV5IHJlZmVyIHRvIHRoZSBzYW1lIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qCi0KLU5BTUUKLQotCWZkbWF0Y2ggLS0gc2VlIGlmIHR3byBmaWxlIGRlc2NyaXB0b3JzIHJlZmVyIHRvIHNhbWUgZmlsZQotCi1TWU5PUFNJUwotCi0JaW50IGZkbWF0Y2ggKGludCBmZDEsIGludCBmZDIpCi0KLURFU0NSSVBUSU9OCi0KLQlDaGVjayB0byBzZWUgaWYgdHdvIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyByZWZlciB0byB0aGUgc2FtZSBmaWxlLgotCVRoaXMgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgd2hlbiB3ZSBoYXZlIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yCi0JZm9yIGFuIHVubmFtZWQgZmlsZSwgYW5kIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IHdlIGJlbGlldmUgdG8gCi0JY29ycmVzcG9uZCB0byB0aGF0IGZkLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYXJlIGV4ZWMnZCB3aXRoCi0JYW4gYWxyZWFkeSBvcGVuIGZpbGUgKHN0ZG91dCBmb3IgZXhhbXBsZSkgb3IgZnJvbSB0aGUgU1ZSNCAvcHJvYwotCWNhbGxzIHRoYXQgcmV0dXJuIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyBmb3IgbWFwcGVkIGFkZHJlc3Mgc3BhY2VzLgotCUFsbCB3ZSBoYXZlIHRvIGRvIGlzIG9wZW4gdGhlIGZpbGUgYnkgbmFtZSBhbmQgY2hlY2sgdGhlIHR3byBmaWxlCi0JZGVzY3JpcHRvcnMgZm9yIGEgbWF0Y2gsIHdoaWNoIGlzIGRvbmUgYnkgY29tcGFyaW5nIG1ham9yJm1pbm9yCi0JZGV2aWNlIG51bWJlcnMgYW5kIGlub2RlIG51bWJlcnMuCi0KLUJVR1MKLQotCShGSVhNRTogZG9lcyB0aGlzIHdvcmsgZm9yIG5ldHdvcmtzPykKLQlJdCB3b3JrcyBmb3IgTkZTLCB3aGljaCBhc3NpZ25zIGEgZGV2aWNlIG51bWJlciB0byBlYWNoIG1vdW50LgotCi0qLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi1pbnQgZmRtYXRjaCAoZmQxLCBmZDIpCi0JaW50IGZkMTsKLQlpbnQgZmQyOwotewotICBzdHJ1Y3Qgc3RhdCBzYnVmMTsKLSAgc3RydWN0IHN0YXQgc2J1ZjI7Ci0KLSAgaWYgKChmc3RhdCAoZmQxLCAmc2J1ZjEpID09IDApICYmCi0gICAgICAoZnN0YXQgKGZkMiwgJnNidWYyKSA9PSAwKSAmJgotICAgICAgKHNidWYxLnN0X2RldiA9PSBzYnVmMi5zdF9kZXYpICYmCi0gICAgICAoc2J1ZjEuc3RfaW5vID09IHNidWYyLnN0X2lubykpCi0gICAgewotICAgICAgcmV0dXJuICgxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9mbG9hdGZvcm1hdC5jIGIvbGliaWJlcnR5L2Zsb2F0Zm9ybWF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOGYxNmQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2Zsb2F0Zm9ybWF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyogSUVFRSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IHJvdXRpbmVzLCBmb3IgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk0LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJmbG9hdGZvcm1hdC5oIgotI2luY2x1ZGUgPG1hdGguaD4JCS8qIGxkZXhwICovCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLWV4dGVybiB2b2lkICptZW1jcHkgKHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4pOwotZXh0ZXJuIHZvaWQgKm1lbXNldCAodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKTsKLSNlbHNlCi1leHRlcm4gY2hhciAqbWVtY3B5ICgpOwotZXh0ZXJuIGNoYXIgKm1lbXNldCAoKTsKLSNlbmRpZgotCi0vKiBUaGUgb2RkcyB0aGF0IENIQVJfQklUIHdpbGwgYmUgYW55dGhpbmcgYnV0IDggYXJlIGxvdyBlbm91Z2ggdGhhdCBJJ20gbm90Ci0gICBnb2luZyB0byBib3RoZXIgd2l0aCB0cnlpbmcgdG8gbXVjayBhcm91bmQgd2l0aCB3aGV0aGVyIGl0IGlzIGRlZmluZWQgaW4KLSAgIGEgc3lzdGVtIGhlYWRlciwgd2hhdCB3ZSBkbyBpZiBub3QsIGV0Yy4gICovCi0jZGVmaW5lIEZMT0FURk9STUFUX0NIQVJfQklUIDgKLQotLyogZmxvYXRmb3JtYXRzIGZvciBJRUVFIHNpbmdsZSBhbmQgZG91YmxlLCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4uICAqLwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfc2luZ2xlX2JpZyA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2JpZywgMzIsIDAsIDEsIDgsIDEyNywgMjU1LCA5LCAyMywgZmxvYXRmb3JtYXRfaW50Yml0X25vCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfc2luZ2xlX2xpdHRsZSA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2xpdHRsZSwgMzIsIDAsIDEsIDgsIDEyNywgMjU1LCA5LCAyMywgZmxvYXRmb3JtYXRfaW50Yml0X25vCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZyA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2JpZywgNjQsIDAsIDEsIDExLCAxMDIzLCAyMDQ3LCAxMiwgNTIsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9saXR0bGUgPQotewotICBmbG9hdGZvcm1hdF9saXR0bGUsIDY0LCAwLCAxLCAxMSwgMTAyMywgMjA0NywgMTIsIDUyLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KLX07Ci0KLS8qIGZsb2F0Zm9ybWF0IGZvciBJRUVFIGRvdWJsZSwgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyLCB3aXRoIGJpZyBlbmRpYW4gd29yZAotICAgb3JkZXJpbmcsIGFzIG9uIHRoZSBBUk0uICAqLwotCi1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlYnl0ZV9iaWd3b3JkID0KLXsKLSAgZmxvYXRmb3JtYXRfbGl0dGxlYnl0ZV9iaWd3b3JkLCA2NCwgMCwgMSwgMTEsIDEwMjMsIDIwNDcsIDEyLCA1MiwgZmxvYXRmb3JtYXRfaW50Yml0X25vCi19OwotCi1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaTM4N19leHQgPQotewotICBmbG9hdGZvcm1hdF9saXR0bGUsIDgwLCAwLCAxLCAxNSwgMHgzZmZmLCAweDdmZmYsIDE2LCA2NCwKLSAgZmxvYXRmb3JtYXRfaW50Yml0X3llcwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9tNjg4ODFfZXh0ID0KLXsKLSAgLyogTm90ZSB0aGF0IHRoZSBiaXRzIGZyb20gMTYgdG8gMzEgYXJlIHVudXNlZC4gICovCi0gIGZsb2F0Zm9ybWF0X2JpZywgOTYsIDAsIDEsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMzIsIDY0LCBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzCi19OwotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2k5NjBfZXh0ID0KLXsKLSAgLyogTm90ZSB0aGF0IHRoZSBiaXRzIGZyb20gMCB0byAxNSBhcmUgdW51c2VkLiAgKi8KLSAgZmxvYXRmb3JtYXRfbGl0dGxlLCA5NiwgMTYsIDE3LCAxNSwgMHgzZmZmLCAweDdmZmYsIDMyLCA2NCwKLSAgZmxvYXRmb3JtYXRfaW50Yml0X3llcwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9tODgxMTBfZXh0ID0KLXsKLSNpZmRlZiBIQVJSSVNfRkxPQVRfRk9STUFUCi0gIC8qIEhhcnJpcyB1c2VzIHJhdyBmb3JtYXQgMTI4IGJ5dGVzIGxvbmcsIGJ1dCB0aGUgbnVtYmVyIGlzIGp1c3QgYW4gaWVlZQotICAgICBkb3VibGUsIGFuZCB0aGUgbGFzdCA2NCBiaXRzIGFyZSB3YXN0ZWQuICovCi0gIGZsb2F0Zm9ybWF0X2JpZywxMjgsIDAsIDEsIDExLCAgMHgzZmYsICAweDdmZiwgMTIsIDUyLAotICBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KLSNlbHNlCi0gIGZsb2F0Zm9ybWF0X2JpZywgODAsIDAsIDEsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMTYsIDY0LAotICBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzCi0jZW5kaWYgLyogSEFSUklTX0ZMT0FUX0ZPUk1BVCAqLwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9hcm1fZXh0ID0KLXsKLSAgLyogQml0cyAxIHRvIDE2IGFyZSB1bnVzZWQuICAqLwotICBmbG9hdGZvcm1hdF9iaWcsIDk2LCAwLCAxNywgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAzMiwgNjQsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMKLX07Ci0MCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfZmllbGQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLAotCQkJCQllbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMsCi0JCQkJCXVuc2lnbmVkIGludCwKLQkJCQkJdW5zaWduZWQgaW50LAotCQkJCQl1bnNpZ25lZCBpbnQpKTsKLQotLyogRXh0cmFjdCBhIGZpZWxkIHdoaWNoIHN0YXJ0cyBhdCBTVEFSVCBhbmQgaXMgTEVOIGJ5dGVzIGxvbmcuICBEQVRBIGFuZAotICAgVE9UQUxfTEVOIGFyZSB0aGUgdGhpbmcgd2UgYXJlIGV4dHJhY3RpbmcgaXQgZnJvbSwgaW4gYnl0ZW9yZGVyIE9SREVSLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1nZXRfZmllbGQgKGRhdGEsIG9yZGVyLCB0b3RhbF9sZW4sIHN0YXJ0LCBsZW4pCi0gICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIGVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyBvcmRlcjsKLSAgICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbjsKLSAgICAgdW5zaWduZWQgaW50IHN0YXJ0OwotICAgICB1bnNpZ25lZCBpbnQgbGVuOwotewotICB1bnNpZ25lZCBsb25nIHJlc3VsdDsKLSAgdW5zaWduZWQgaW50IGN1cl9ieXRlOwotICBpbnQgY3VyX2JpdHNoaWZ0OwotCi0gIC8qIFN0YXJ0IGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCi0gIGN1cl9ieXRlID0gKHN0YXJ0ICsgbGVuKSAvIEZMT0FURk9STUFUX0NIQVJfQklUOwotICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotICAgIGN1cl9ieXRlID0gKHRvdGFsX2xlbiAvIEZMT0FURk9STUFUX0NIQVJfQklUKSAtIGN1cl9ieXRlIC0gMTsKLSAgY3VyX2JpdHNoaWZ0ID0KLSAgICAoKHN0YXJ0ICsgbGVuKSAlIEZMT0FURk9STUFUX0NIQVJfQklUKSAtIEZMT0FURk9STUFUX0NIQVJfQklUOwotICByZXN1bHQgPSAqKGRhdGEgKyBjdXJfYnl0ZSkgPj4gKC1jdXJfYml0c2hpZnQpOwotICBjdXJfYml0c2hpZnQgKz0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0gICAgKytjdXJfYnl0ZTsKLSAgZWxzZQotICAgIC0tY3VyX2J5dGU7Ci0KLSAgLyogTW92ZSB0b3dhcmRzIHRoZSBtb3N0IHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIGZpZWxkLiAgKi8KLSAgd2hpbGUgKCh1bnNpZ25lZCBpbnQpIGN1cl9iaXRzaGlmdCA8IGxlbikKLSAgICB7Ci0gICAgICBpZiAobGVuIC0gY3VyX2JpdHNoaWZ0IDwgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpCi0JLyogVGhpcyBpcyB0aGUgbGFzdCBieXRlOyB6ZXJvIG91dCB0aGUgYml0cyB3aGljaCBhcmUgbm90IHBhcnQgb2YKLQkgICB0aGlzIGZpZWxkLiAgKi8KLQlyZXN1bHQgfD0KLQkgICgqKGRhdGEgKyBjdXJfYnl0ZSkgJiAoKDEgPDwgKGxlbiAtIGN1cl9iaXRzaGlmdCkpIC0gMSkpCi0JICAgIDw8IGN1cl9iaXRzaGlmdDsKLSAgICAgIGVsc2UKLQlyZXN1bHQgfD0gKihkYXRhICsgY3VyX2J5dGUpIDw8IGN1cl9iaXRzaGlmdDsKLSAgICAgIGN1cl9iaXRzaGlmdCArPSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgICAgIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0JKytjdXJfYnl0ZTsKLSAgICAgIGVsc2UKLQktLWN1cl9ieXRlOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLSAgCi0jaWZuZGVmIG1pbgotI2RlZmluZSBtaW4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi0vKiBDb252ZXJ0IGZyb20gRk1UIHRvIGEgZG91YmxlLgotICAgRlJPTSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZXh0ZW5kZWQgZmxvYXQuCi0gICBTdG9yZSB0aGUgZG91YmxlIGluICpUTy4gICovCi0KLXZvaWQKLWZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoZm10LCBmcm9tLCB0bykKLSAgICAgY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICpmbXQ7Ci0gICAgIGNoYXIgKmZyb207Ci0gICAgIGRvdWJsZSAqdG87Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnVmcm9tID0gKHVuc2lnbmVkIGNoYXIgKilmcm9tOwotICBkb3VibGUgZHRvOwotICBsb25nIGV4cG9uZW50OwotICB1bnNpZ25lZCBsb25nIG1hbnQ7Ci0gIHVuc2lnbmVkIGludCBtYW50X2JpdHMsIG1hbnRfb2ZmOwotICBpbnQgbWFudF9iaXRzX2xlZnQ7Ci0gIGludCBzcGVjaWFsX2V4cG9uZW50OwkJLyogSXQncyBhIE5hTiwgZGVub3JtIG9yIHplcm8gKi8KLQotICBleHBvbmVudCA9IGdldF9maWVsZCAodWZyb20sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwKLQkJCWZtdC0+ZXhwX3N0YXJ0LCBmbXQtPmV4cF9sZW4pOwotICAvKiBOb3RlIHRoYXQgaWYgZXhwb25lbnQgaW5kaWNhdGVzIGEgTmFOLCB3ZSBjYW4ndCByZWFsbHkgZG8gYW55dGhpbmcgdXNlZnVsCi0gICAgIChub3Qga25vd2luZyBpZiB0aGUgaG9zdCBoYXMgTmFOJ3MsIG9yIGhvdyB0byBidWlsZCBvbmUpLiAgU28gaXQgd2lsbAotICAgICBlbmQgdXAgYXMgYW4gaW5maW5pdHkgb3Igc29tZXRoaW5nIGNsb3NlOyB0aGF0IGlzIE9LLiAgKi8KLQotICBtYW50X2JpdHNfbGVmdCA9IGZtdC0+bWFuX2xlbjsKLSAgbWFudF9vZmYgPSBmbXQtPm1hbl9zdGFydDsKLSAgZHRvID0gMC4wOwotCi0gIHNwZWNpYWxfZXhwb25lbnQgPSBleHBvbmVudCA9PSAwIHx8ICh1bnNpZ25lZCBsb25nKSBleHBvbmVudCA9PSBmbXQtPmV4cF9uYW47Ci0KLSAgLyogRG9uJ3QgYmlhcyB6ZXJvJ3MsIGRlbm9ybXMgb3IgTmFOcy4gICovCi0gIGlmICghc3BlY2lhbF9leHBvbmVudCkKLSAgICBleHBvbmVudCAtPSBmbXQtPmV4cF9iaWFzOwotCi0gIC8qIEJ1aWxkIHRoZSByZXN1bHQgYWxnZWJyYWljYWxseS4gIE1pZ2h0IGdvIGluZmluaXRlLCB1bmRlcmZsb3csIGV0YzsKLSAgICAgd2hvIGNhcmVzLiAqLwotCi0gIC8qIElmIHRoaXMgZm9ybWF0IHVzZXMgYSBoaWRkZW4gYml0LCBleHBsaWNpdGx5IGFkZCBpdCBpbiBub3cuICBPdGhlcndpc2UsCi0gICAgIGluY3JlbWVudCB0aGUgZXhwb25lbnQgYnkgb25lIHRvIGFjY291bnQgZm9yIHRoZSBpbnRlZ2VyIGJpdC4gICovCi0KLSAgaWYgKCFzcGVjaWFsX2V4cG9uZW50KQotICAgIHsKLSAgICAgIGlmIChmbXQtPmludGJpdCA9PSBmbG9hdGZvcm1hdF9pbnRiaXRfbm8pCi0JZHRvID0gbGRleHAgKDEuMCwgZXhwb25lbnQpOwotICAgICAgZWxzZQotCWV4cG9uZW50Kys7Ci0gICAgfQotCi0gIHdoaWxlIChtYW50X2JpdHNfbGVmdCA+IDApCi0gICAgewotICAgICAgbWFudF9iaXRzID0gbWluIChtYW50X2JpdHNfbGVmdCwgMzIpOwotCi0gICAgICBtYW50ID0gZ2V0X2ZpZWxkICh1ZnJvbSwgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLAotCQkJIG1hbnRfb2ZmLCBtYW50X2JpdHMpOwotCi0gICAgICBkdG8gKz0gbGRleHAgKChkb3VibGUpbWFudCwgZXhwb25lbnQgLSBtYW50X2JpdHMpOwotICAgICAgZXhwb25lbnQgLT0gbWFudF9iaXRzOwotICAgICAgbWFudF9vZmYgKz0gbWFudF9iaXRzOwotICAgICAgbWFudF9iaXRzX2xlZnQgLT0gbWFudF9iaXRzOwotICAgIH0KLQotICAvKiBOZWdhdGUgaXQgaWYgbmVnYXRpdmUuICAqLwotICBpZiAoZ2V0X2ZpZWxkICh1ZnJvbSwgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPnNpZ25fc3RhcnQsIDEpKQotICAgIGR0byA9IC1kdG87Ci0gICp0byA9IGR0bzsKLX0KLQwKLXN0YXRpYyB2b2lkIHB1dF9maWVsZCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycywKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50LAotCQkJICAgICAgIHVuc2lnbmVkIGludCwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nKSk7Ci0KLS8qIFNldCBhIGZpZWxkIHdoaWNoIHN0YXJ0cyBhdCBTVEFSVCBhbmQgaXMgTEVOIGJ5dGVzIGxvbmcuICBEQVRBIGFuZAotICAgVE9UQUxfTEVOIGFyZSB0aGUgdGhpbmcgd2UgYXJlIGV4dHJhY3RpbmcgaXQgZnJvbSwgaW4gYnl0ZW9yZGVyIE9SREVSLiAgKi8KLXN0YXRpYyB2b2lkCi1wdXRfZmllbGQgKGRhdGEsIG9yZGVyLCB0b3RhbF9sZW4sIHN0YXJ0LCBsZW4sIHN0dWZmX3RvX3B1dCkKLSAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzIG9yZGVyOwotICAgICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuOwotICAgICB1bnNpZ25lZCBpbnQgc3RhcnQ7Ci0gICAgIHVuc2lnbmVkIGludCBsZW47Ci0gICAgIHVuc2lnbmVkIGxvbmcgc3R1ZmZfdG9fcHV0OwotewotICB1bnNpZ25lZCBpbnQgY3VyX2J5dGU7Ci0gIGludCBjdXJfYml0c2hpZnQ7Ci0KLSAgLyogU3RhcnQgYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIGZpZWxkLiAgKi8KLSAgY3VyX2J5dGUgPSAoc3RhcnQgKyBsZW4pIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0gICAgY3VyX2J5dGUgPSAodG90YWxfbGVuIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gY3VyX2J5dGUgLSAxOwotICBjdXJfYml0c2hpZnQgPQotICAgICgoc3RhcnQgKyBsZW4pICUgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gICooZGF0YSArIGN1cl9ieXRlKSAmPQotICAgIH4oKCgxIDw8ICgoc3RhcnQgKyBsZW4pICUgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpKSAtIDEpIDw8ICgtY3VyX2JpdHNoaWZ0KSk7Ci0gICooZGF0YSArIGN1cl9ieXRlKSB8PQotICAgIChzdHVmZl90b19wdXQgJiAoKDEgPDwgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gMSkpIDw8ICgtY3VyX2JpdHNoaWZ0KTsKLSAgY3VyX2JpdHNoaWZ0ICs9IEZMT0FURk9STUFUX0NIQVJfQklUOwotICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotICAgICsrY3VyX2J5dGU7Ci0gIGVsc2UKLSAgICAtLWN1cl9ieXRlOwotCi0gIC8qIE1vdmUgdG93YXJkcyB0aGUgbW9zdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCi0gIHdoaWxlICgodW5zaWduZWQgaW50KSBjdXJfYml0c2hpZnQgPCBsZW4pCi0gICAgewotICAgICAgaWYgKGxlbiAtIGN1cl9iaXRzaGlmdCA8IEZMT0FURk9STUFUX0NIQVJfQklUKQotCXsKLQkgIC8qIFRoaXMgaXMgdGhlIGxhc3QgYnl0ZS4gICovCi0JICAqKGRhdGEgKyBjdXJfYnl0ZSkgJj0KLQkgICAgfigoMSA8PCAobGVuIC0gY3VyX2JpdHNoaWZ0KSkgLSAxKTsKLQkgICooZGF0YSArIGN1cl9ieXRlKSB8PSAoc3R1ZmZfdG9fcHV0ID4+IGN1cl9iaXRzaGlmdCk7Ci0JfQotICAgICAgZWxzZQotCSooZGF0YSArIGN1cl9ieXRlKSA9ICgoc3R1ZmZfdG9fcHV0ID4+IGN1cl9iaXRzaGlmdCkKLQkJCSAgICAgICYgKCgxIDw8IEZMT0FURk9STUFUX0NIQVJfQklUKSAtIDEpKTsKLSAgICAgIGN1cl9iaXRzaGlmdCArPSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgICAgIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0JKytjdXJfYnl0ZTsKLSAgICAgIGVsc2UKLQktLWN1cl9ieXRlOwotICAgIH0KLX0KLQotLyogVGhlIGNvbnZlcnNlOiBjb252ZXJ0IHRoZSBkb3VibGUgKkZST00gdG8gYW4gZXh0ZW5kZWQgZmxvYXQKLSAgIGFuZCBzdG9yZSB3aGVyZSBUTyBwb2ludHMuICBOZWl0aGVyIEZST00gbm9yIFRPIGhhdmUgYW55IGFsaWdubWVudAotICAgcmVzdHJpY3Rpb25zLiAgKi8KLQotdm9pZAotZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUgKGZtdCwgZnJvbSwgdG8pCi0gICAgIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqZm10OwotICAgICBkb3VibGUgKmZyb207Ci0gICAgIGNoYXIgKnRvOwotewotICBkb3VibGUgZGZyb207Ci0gIGludCBleHBvbmVudDsKLSAgZG91YmxlIG1hbnQ7Ci0gIHVuc2lnbmVkIGludCBtYW50X2JpdHMsIG1hbnRfb2ZmOwotICBpbnQgbWFudF9iaXRzX2xlZnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKnV0byA9ICh1bnNpZ25lZCBjaGFyICopdG87Ci0KLSAgbWVtY3B5ICgmZGZyb20sIGZyb20sIHNpemVvZiAoZGZyb20pKTsKLSAgbWVtc2V0ICh1dG8sIDAsIGZtdC0+dG90YWxzaXplIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQpOwotICBpZiAoZGZyb20gPT0gMCkKLSAgICByZXR1cm47CQkJLyogUmVzdWx0IGlzIHplcm8gKi8KLSAgaWYgKGRmcm9tICE9IGRmcm9tKQotICAgIHsKLSAgICAgIC8qIEZyb20gaXMgTmFOICovCi0gICAgICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPmV4cF9zdGFydCwKLQkJIGZtdC0+ZXhwX2xlbiwgZm10LT5leHBfbmFuKTsKLSAgICAgIC8qIEJlIHN1cmUgaXQncyBub3QgaW5maW5pdHksIGJ1dCBOYU4gdmFsdWUgaXMgaXJyZWwgKi8KLSAgICAgIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+bWFuX3N0YXJ0LAotCQkgMzIsIDEpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBJZiBuZWdhdGl2ZSwgc2V0IHRoZSBzaWduIGJpdC4gICovCi0gIGlmIChkZnJvbSA8IDApCi0gICAgewotICAgICAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5zaWduX3N0YXJ0LCAxLCAxKTsKLSAgICAgIGRmcm9tID0gLWRmcm9tOwotICAgIH0KLQotICAvKiBIb3cgdG8gdGVsbCBhbiBpbmZpbml0eSBmcm9tIGFuIG9yZGluYXJ5IG51bWJlcj8gIEZJWE1FLXNvbWVkYXkgKi8KLQotICBtYW50ID0gZnJleHAgKGRmcm9tLCAmZXhwb25lbnQpOwotICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPmV4cF9zdGFydCwgZm10LT5leHBfbGVuLAotCSAgICAgZXhwb25lbnQgKyBmbXQtPmV4cF9iaWFzIC0gMSk7Ci0KLSAgbWFudF9iaXRzX2xlZnQgPSBmbXQtPm1hbl9sZW47Ci0gIG1hbnRfb2ZmID0gZm10LT5tYW5fc3RhcnQ7Ci0gIHdoaWxlIChtYW50X2JpdHNfbGVmdCA+IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBtYW50X2xvbmc7Ci0gICAgICBtYW50X2JpdHMgPSBtYW50X2JpdHNfbGVmdCA8IDMyID8gbWFudF9iaXRzX2xlZnQgOiAzMjsKLQotICAgICAgbWFudCAqPSA0Mjk0OTY3Mjk2LjA7Ci0gICAgICBtYW50X2xvbmcgPSAodW5zaWduZWQgbG9uZyltYW50OwotICAgICAgbWFudCAtPSBtYW50X2xvbmc7Ci0KLSAgICAgIC8qIElmIHRoZSBpbnRlZ2VyIGJpdCBpcyBpbXBsaWNpdCwgdGhlbiB3ZSBuZWVkIHRvIGRpc2NhcmQgaXQuCi0JIElmIHdlIGFyZSBkaXNjYXJkaW5nIGEgemVybywgd2Ugc2hvdWxkIGJlIChidXQgYXJlIG5vdCkgY3JlYXRpbmcKLQkgYSBkZW5vcm1hbGl6ZWQJbnVtYmVyIHdoaWNoIG1lYW5zIGFkanVzdGluZyB0aGUgZXhwb25lbnQKLQkgKEkgdGhpbmspLiAgKi8KLSAgICAgIGlmICgodW5zaWduZWQgaW50KSBtYW50X2JpdHNfbGVmdCA9PSBmbXQtPm1hbl9sZW4KLQkgICYmIGZtdC0+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+IHFfYmFjazsKLSAgZWxlbSAtPiBxX2JhY2sgLT4gcV9mb3J3ID0gZWxlbSAtPiBxX2Zvcnc7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWFrZWZpbGUudm1zIGIvbGliaWJlcnR5L21ha2VmaWxlLnZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxYjUxMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgbGliaWJlcnR5IHVuZGVyIG9wZW5WTVMvQWxwaGEKLSMKLSMgRm9yIHVzZSB3aXRoIGdudS1tYWtlIGZvciB2bXMKLSMKLSMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYsIGtrYWVtcGZAcHJvZ2lzLmRlCi0jCi0jCi0KLU9CSlM9YmNvcHkub2JqLGJjbXAub2JqLGdldG9wdC5vYmosb2JzdGFjay5vYmoseGV4aXQub2JqLHhtYWxsb2Mub2JqLGhleC5vYmosXAotICAgZ2V0b3B0MS5vYmosY3BsdXMtZGVtLm9iaixzdHJuY2FzZWNtcC5vYmosc3RyY2FzZWNtcC5vYmosc3RyZHVwLm9iaixcCi0gICBjb25jYXQub2JqLGdldHJ1bnRpbWUub2JqLGdldHBhZ2VzaXplLm9iaixhbGxvY2Eub2JqLHhzdHJlcnJvci5vYmosXAotICAgeHN0cmR1cC5vYmoseGF0ZXhpdC5vYmosY2hvb3NlLXRlbXAub2JqLGZubWF0Y2gub2JqLG9iamFsbG9jLm9iagotCi1pZmVxICgkKENDKSxnY2MpCi1DRkxBR1M9L2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdKQotZWxzZQotIyBhc3N1bWUgZGVjIGMKLUNGTEFHUz0vbm9vcHQvZGVidWcvaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0pL2RlZmluZT0oImNvbnN0PSIpL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jKQotZW5kaWYKLQotbGliaWJlcnR5Lm9sYjogY29uZmlnLmggYWxsb2NhLWNvbmYuaCAkKE9CSlMpCi0JcHVyZ2UKLQlsaWIvY3JlYXRlIGxpYmliZXJ0eSAqLm9iagotCi1jb25maWcuaDogY29uZmlnLmgtdm1zCi0JJChDUCkgJDwgJEAKLQotY2xlYW46Ci0JJCQgcHVyZ2UKLQkkKFJNKSBjb25maWcuaDsKLQkkKFJNKSAqLm9iajsKLQkkKFJNKSBsaWJpYmVydHkub2xiOwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21lbWNoci5jIGIvbGliaWJlcnR5L21lbWNoci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2UzMDAzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tZW1jaHIuYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi1GVU5DVElPTgotCTw8bWVtY2hyPj4tLS1maW5kIGNoYXJhY3RlciBpbiBtZW1vcnkKLQotSU5ERVgKLQltZW1jaHIKLQotQU5TSV9TWU5PUFNJUwotCSNpbmNsdWRlIDxzdHJpbmcuaD4KLQl2b2lkICptZW1jaHIoY29uc3Qgdm9pZCAqPFtzcmNdPiwgaW50IDxbY10+LCBzaXplX3QgPFtsZW5ndGhdPik7Ci0KLVRSQURfU1lOT1BTSVMKLQkjaW5jbHVkZSA8c3RyaW5nLmg+Ci0Jdm9pZCAqbWVtY2hyKDxbc3JjXT4sIDxbY10+LCA8W2xlbmd0aF0+KQotCXZvaWQgKjxbc3JjXT47Ci0Jdm9pZCAqPFtjXT47Ci0Jc2l6ZV90IDxbbGVuZ3RoXT47Ci0KLURFU0NSSVBUSU9OCi0JVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBtZW1vcnkgc3RhcnRpbmcgYXQgPDwqPFtzcmNdPj4+IGZvciB0aGUKLQljaGFyYWN0ZXIgPFtjXT4uICBUaGUgc2VhcmNoIG9ubHkgZW5kcyB3aXRoIHRoZSBmaXJzdAotCW9jY3VycmVuY2Ugb2YgPFtjXT4sIG9yIGFmdGVyIDxbbGVuZ3RoXT4gY2hhcmFjdGVyczsgaW4KLQlwYXJ0aWN1bGFyLCA8PE5VTEw+PiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlIHNlYXJjaC4KLQotUkVUVVJOUwotCUlmIHRoZSBjaGFyYWN0ZXIgPFtjXT4gaXMgZm91bmQgd2l0aGluIDxbbGVuZ3RoXT4gY2hhcmFjdGVycwotCW9mIDw8Kjxbc3JjXT4+PiwgYSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgaXMgcmV0dXJuZWQuIElmCi0JPFtjXT4gaXMgbm90IGZvdW5kLCB0aGVuIDw8TlVMTD4+IGlzIHJldHVybmVkLiAJCi0KLVBPUlRBQklMSVRZCi08PG1lbWNocj4+ICByZXF1aXJlcyBubyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzLgotCi1RVUlDS1JFRgotCW1lbWNociBhbnNpIHB1cmUKLQotKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotUFRSCi1tZW1jaHIgKHNyY192b2lkLCBjLCBsZW5ndGgpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IFBUUiBzcmNfdm9pZDsKLSAgICAgaW50IGM7Ci0gICAgIHNpemVfdCBsZW5ndGg7Ci17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopc3JjX3ZvaWQ7Ci0gIAotICB3aGlsZSAoLS1sZW5ndGggPj0gMCkKLSAgewotICAgIGlmICgqc3JjID09IGMpCi0gICAgIHJldHVybiAoUFRSKXNyYzsKLSAgICBzcmMrKzsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1jbXAuYyBiL2xpYmliZXJ0eS9tZW1jbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI3YWUwYy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtY21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBtZW1jbXAgLS0gY29tcGFyZSB0d28gbWVtb3J5IHJlZ2lvbnMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLU5BTUUKLQltZW1jbXAgLS0gY29tcGFyZSB0d28gbWVtb3J5IHJlZ2lvbnMKLQotU1lOT1BTSVMKLQlpbnQgbWVtY21wIChjb25zdCB2b2lkICpmcm9tLCBjb25zdCB2b2lkICp0bywgc2l6ZV90IGNvdW50KQotCi1ERVNDUklQVElPTgotCUNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zIGFuZCByZXR1cm4gbGVzcyB0aGFuLAotCWVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gemVybywgYWNjb3JkaW5nIHRvIGxleGljb2dyYXBoaWNhbAotCW9yZGVyaW5nIG9mIHRoZSBjb21wYXJlZCByZWdpb25zLgotKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotaW50Ci1ERUZVTihtZW1jbXAsIChzdHIxLCBzdHIyLCBjb3VudCksCi0gICAgICBjb25zdCBQVFIgc3RyMSBBTkQgY29uc3QgUFRSIHN0cjIgQU5EIHNpemVfdCBjb3VudCkKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqczEgPSAodW5zaWduZWQgY2hhciopc3RyMTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqczIgPSAodW5zaWduZWQgY2hhciopc3RyMjsKLQotICB3aGlsZSAoY291bnQtLSA+IDApCi0gICAgewotICAgICAgaWYgKCpzMSsrICE9ICpzMisrKQotCSAgcmV0dXJuIHMxWy0xXSA8IHMyWy0xXSA/IC0xIDogMTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWVtY3B5LmMgYi9saWJpYmVydHkvbWVtY3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwN2E5ZjUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21lbWNweS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogbWVtY3B5ICh0aGUgc3RhbmRhcmQgQyBmdW5jdGlvbikKLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotTkFNRQotCW1lbWNweSAtLSBjb3B5IG1lbW9yeSByZWdpb25zIG9mIGFyYml0YXJ5IGxlbmd0aAotCi1TWU5PUFNJUwotCXZvaWQqIG1lbWNweSAodm9pZCAqb3V0LCBjb25zdCB2b2lkICppbiwgc2l6ZV90IG4pOwotCi1ERVNDUklQVElPTgotCUNvcHkgTEVOR1RIIGJ5dGVzIGZyb20gbWVtb3J5IHJlZ2lvbiBwb2ludGVkIHRvIGJ5IElOIHRvIG1lbW9yeQotCXJlZ2lvbiBwb2ludGVkIHRvIGJ5IE9VVC4KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLVBUUgotREVGVU4obWVtY3B5LCAob3V0LCBpbiwgbGVuZ3RoKSwgUFRSIG91dCBBTkQgY29uc3QgUFRSIGluIEFORCBzaXplX3QgbGVuZ3RoKQotewotICAgIGJjb3B5KGluLCBvdXQsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIG91dDsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1tb3ZlLmMgYi9saWJpYmVydHkvbWVtbW92ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzZjMzI2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tZW1tb3ZlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKiBXcmFwcGVyIHRvIGltcGxlbWVudCBBTlNJIEMncyBtZW1tb3ZlIHVzaW5nIEJTRCdzIGJjb3B5LiAqLwotLyogVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gIC0tUGVyIEJvdGhuZXIuICovCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi1QVFIKLW1lbW1vdmUgKHMxLCBzMiwgbikKLSAgICAgUFRSIHMxOwotICAgICBjb25zdCBQVFIgczI7Ci0gICAgIHNpemVfdCBuOwotewotICBiY29weSAoczIsIHMxLCBuKTsKLSAgcmV0dXJuIHMxOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21lbXNldC5jIGIvbGliaWJlcnR5L21lbXNldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjU0ODMxLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tZW1zZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qIG1lbXNldAotICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLVBUUgotREVGVU4obWVtc2V0LCAoZGVzdCwgdmFsLCBsZW4pLAotICAgICAgUFRSIGRlc3QgQU5EIHJlZ2lzdGVyIGludCB2YWwgQU5EIHJlZ2lzdGVyIHNpemVfdCBsZW4pCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyKilkZXN0OwotICB3aGlsZSAobGVuLS0gPiAwKQotICAgICpwdHIrKyA9IHZhbDsKLSAgcmV0dXJuIGRlc3Q7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWtzdGVtcHMuYyBiL2xpYmliZXJ0eS9ta3N0ZW1wcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmMxNmEyLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9ta3N0ZW1wcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gbWtzdGVtcC5jIGZyb20gdGhlIEdOVSBDIExpYnJhcnkuCi0KLSAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi0gICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19USU1FX0gKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogV2UgbmVlZCB0byBwcm92aWRlIGEgdHlwZSBmb3IgZ2NjX3VpbnQ2NF90LiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgZ2NjX3VpbnQ2NF90OwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBnY2NfdWludDY0X3Q7Ci0jZW5kaWYKLQotI2lmbmRlZiBUTVBfTUFYCi0jZGVmaW5lIFRNUF9NQVggMTYzODQKLSNlbmRpZgotCi0vKiBHZW5lcmF0ZSBhIHVuaXF1ZSB0ZW1wb3JhcnkgZmlsZSBuYW1lIGZyb20gVEVNUExBVEUuCi0KLSAgIFRFTVBMQVRFIGhhcyB0aGUgZm9ybToKLQotICAgPHBhdGg+L2NjWFhYWFhYPHN1ZmZpeD4KLQotICAgU1VGRklYX0xFTiB0ZWxscyB1cyBob3cgbG9uZyA8c3VmZml4PiBpcyAoaXQgY2FuIGJlIHplcm8gbGVuZ3RoKS4KLQotICAgVGhlIGxhc3Qgc2l4IGNoYXJhY3RlcnMgb2YgVEVNUExBVEUgYmVmb3JlIDxzdWZmaXg+IG11c3QgYmUgIlhYWFhYWCI7Ci0gICB0aGV5IGFyZSByZXBsYWNlZCB3aXRoIGEgc3RyaW5nIHRoYXQgbWFrZXMgdGhlIGZpbGVuYW1lIHVuaXF1ZS4KLQotICAgUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBvcGVuIG9uIHRoZSBmaWxlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiAgKi8KLWludAotbWtzdGVtcHMgKHRlbXBsYXRlLCBzdWZmaXhfbGVuKQotICAgICBjaGFyICp0ZW1wbGF0ZTsKLSAgICAgaW50IHN1ZmZpeF9sZW47Ci17Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGxldHRlcnNbXQotICAgID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IjsKLSAgc3RhdGljIGdjY191aW50NjRfdCB2YWx1ZTsKLSNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotICBzdHJ1Y3QgdGltZXZhbCB0djsKLSNlbmRpZgotICBjaGFyICpYWFhYWFg7Ci0gIHNpemVfdCBsZW47Ci0gIGludCBjb3VudDsKLQotICBsZW4gPSBzdHJsZW4gKHRlbXBsYXRlKTsKLQotICBpZiAoKGludCkgbGVuIDwgNiArIHN1ZmZpeF9sZW4KLSAgICAgIHx8IHN0cm5jbXAgKCZ0ZW1wbGF0ZVtsZW4gLSA2IC0gc3VmZml4X2xlbl0sICJYWFhYWFgiLCA2KSkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIFhYWFhYWCA9ICZ0ZW1wbGF0ZVtsZW4gLSA2IC0gc3VmZml4X2xlbl07Ci0KLSNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotICAvKiBHZXQgc29tZSBtb3JlIG9yIGxlc3MgcmFuZG9tIGRhdGEuICAqLwotICBnZXR0aW1lb2ZkYXkgKCZ0diwgTlVMTCk7Ci0gIHZhbHVlICs9ICgoZ2NjX3VpbnQ2NF90KSB0di50dl91c2VjIDw8IDE2KSBeIHR2LnR2X3NlYyBeIGdldHBpZCAoKTsKLSNlbHNlCi0gIHZhbHVlICs9IGdldHBpZCAoKTsKLSNlbmRpZgotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IFRNUF9NQVg7ICsrY291bnQpCi0gICAgewotICAgICAgZ2NjX3VpbnQ2NF90IHYgPSB2YWx1ZTsKLSAgICAgIGludCBmZDsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgcmFuZG9tIGJpdHMuICAqLwotICAgICAgWFhYWFhYWzBdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgICAgdiAvPSA2MjsKLSAgICAgIFhYWFhYWFsxXSA9IGxldHRlcnNbdiAlIDYyXTsKLSAgICAgIHYgLz0gNjI7Ci0gICAgICBYWFhYWFhbMl0gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0gICAgICB2IC89IDYyOwotICAgICAgWFhYWFhYWzNdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgICAgdiAvPSA2MjsKLSAgICAgIFhYWFhYWFs0XSA9IGxldHRlcnNbdiAlIDYyXTsKLSAgICAgIHYgLz0gNjI7Ci0gICAgICBYWFhYWFhbNV0gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0KLSAgICAgIGZkID0gb3BlbiAodGVtcGxhdGUsIE9fUkRXUnxPX0NSRUFUfE9fRVhDTCwgMDYwMCk7Ci0gICAgICBpZiAoZmQgPj0gMCkKLQkvKiBUaGUgZmlsZSBkb2VzIG5vdCBleGlzdC4gICovCi0JcmV0dXJuIGZkOwotCi0gICAgICAvKiBUaGlzIGlzIGEgcmFuZG9tIHZhbHVlLiAgSXQgaXMgb25seSBuZWNlc3NhcnkgdGhhdCB0aGUgbmV4dAotCSBUTVBfTUFYIHZhbHVlcyBnZW5lcmF0ZWQgYnkgYWRkaW5nIDc3NzcgdG8gVkFMVUUgYXJlIGRpZmZlcmVudAotCSB3aXRoIChtb2R1bGUgMl4zMikuICAqLwotICAgICAgdmFsdWUgKz0gNzc3NzsKLSAgICB9Ci0KLSAgLyogV2UgcmV0dXJuIHRoZSBudWxsIHN0cmluZyBpZiB3ZSBjYW4ndCBmaW5kIGEgdW5pcXVlIGZpbGUgbmFtZS4gICovCi0gIHRlbXBsYXRlWzBdID0gJ1wwJzsKLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21wdy1jb25maWcuaW4gYi9saWJpYmVydHkvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyMTgwMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBNUFcgY29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgbGliaWJlcnR5LgotCi1FY2hvICcvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBtcHctY29uZmlndXJlLiAgKi8nCSA+ICJ7b30iY29uZmlnLm5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb25maWcubmV3ICJ7b30iY29uZmlnLmgKLQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbXB3LW1ha2Uuc2VkIGIvbGliaWJlcnR5L21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyYTVlNy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIyBTZWQgY29tbWFuZHMgdG8gZmluaXNoIHRyYW5zbGF0aW5nIGxpYmliZXJ0eSdzIFVuaXggbWFrZWZpbGUgdG8gTVBXIHN5bnRheC4KLQotIyBDb21tZW50IG91dCBhIHVzZWxlc3MgdGhpbmcuCi0vXlwuYWx3YXlzXC4vcy9eLyMvCi0KLSMgUmVwbGFjZSB0aGUgYXV0by1nZW5lcmF0ZWQgbGlzdCB3aXRoIHRoZSBsaXN0IG9mIHdoYXQgd2Uga25vdyB3ZSBuZWVkLgotcy9gY2F0IG5lZWRlZC1saXN0YC8ie299ImFsbG9jYS5jLm8gIntvfSJiY29weS5jLm8gIntvfSJnZXRwYWdlc2l6ZS5jLm8gIntvfSJpbnNxdWUuYy5vICJ7b30ibXB3LmMubyAie299InN0cmNhc2VjbXAuYy5vICJ7b30ic3RyZHVwLmMubyAie299InN0cm5jYXNlY21wLmMuby8KLQotIyBQYXN0ZSBpbiBzb21lIGRlc2lyYWJsZSBkZWZpbml0aW9ucy4KLSMgVGhlIGRlZmF1bHQgcnVsZSBoZXJlIGNvbXBsZXRlbHkgcmVwbGFjZXMgdGhlIHRyaWNreSBzdHVmZiBpbiB0aGUgVW5peAotIyBNYWtlZmlsZS5pbi4KLS9eIyMjJC9hXAotXAotSERFRklORVMgPSAtZCBORUVEX3N5c19zaWdsaXN0IC1kIE5FRURfc3lzX2Vycmxpc3QgLWQgTkVFRF9iYXNlbmFtZSAtZCBORUVEX3N0cmNhc2VjbXAgLWQgTkVFRF9zdHJuY2FzZWNtcFwKLUlOQ0xVREVTID0gLWkgOiAtaSB7SU5DRElSfTogLWkge0lOQ0RJUn06bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6IC1pICJ7c30iXAotXAotLmMubyBcXE9wdGlvbi1mIC5jXAotCXtDQ30gQERBU0hfQ19GTEFHQCB7RGVwRGlyfXtEZWZhdWx0fS5jIHtMSUJDRkxBR1N9IHtJTkNMVURFU30ge0hERUZJTkVTfSBAU0VHTUVOVF9GTEFHKHtEZWZhdWx0fSlAIC1vIHtUYXJnRGlyfXtEZWZhdWx0fS5jLm9cCi0KLSMgUmVtb3ZlIGRlcGVuZGVuY3kgb24gbmVlZGVkLWxpc3QsIHdoaWNoIHdlIGRvbid0IHVzZS4KLS9ET19BTFNPID0vcy9uZWVkZWQtbGlzdC8vCi0KLS9JTkNESVI9L3MvIntzcmNkaXJ9IntNVUxUSVNSQ1RPUH06Oi8ie3RvcHNyY2Rpcn0iLwotCi0jIFdoYWNrIG91dCB0aGUgQ09NUElMRS5jIHRyaWNraW5lc3MuCi0vXkNPTVBJTEUuYyAvLC9eJC9kCi0KLSMgUmVtb3ZlIHRoZSBtdWx0aWRvIHRyaWNraW5lc3MgZnJvbSB0aGUgImFsbCIgdGFyZ2V0LgotL15hbGwgXFxPcHRpb24tZi8sL14kL2NcCi1hbGwgXFxPcHRpb24tZiB7VEFSR0VUTElCfVwKLQotCi0jIFJlbW92ZSB0aGUgUlVMRTEvUlVMRTIgY3J1ZC4KLS9pZiBcWy8sL2ZpL2QKLS9eUlVMRTEgPS8sL1JVTEUyID0vZAotL1JVTEUyL3MvUlVMRTIvVEFSR0VUTElCLwotCi0jIERvbid0IHdhbnQgZmRtYXRjaCBldmVyLgotcy8gIntvfSJmZG1hdGNoLmMuby8vCi0KLSMgRml4IHBhdGhzIHRvIGdlbmVyYXRlZCBmaWxlcy4KLS9jb25maWcuaC9zLyJ7c30iY29uZmlnLmgvIntvfSJjb25maWcuaC8KLQotIyBXaGFjayBvdXQgY29uZmlnIHJlYnVpbGQgcnVsZXMuCi0vXiJ7b30iY29uZmlnLmggXFxPcHRpb24tZi8sL14kL2QKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tcHcuYyBiL2xpYmliZXJ0eS9tcHcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzYWU0MS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbXB3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEwICswLDAgQEAKLS8qIE1QVy1Vbml4IGNvbXBhdGliaWxpdHkgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgc2hvdWxkIG9ubHkgYmUgY29tcGlsZWQgYW5kIGxpbmtlZCB1bmRlciBNUFcuICovCi0KLSNpbmNsdWRlICJtcHcuaCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8VHlwZXMuaD4KLSNpbmNsdWRlIDxGaWxlcy5oPgotCi0jaW5jbHVkZSA8VGltZXIuaD4KLQotLyogSW5pdGlhbGl6ZSB0byAwIGF0IGZpcnN0LCB0aGVuIHNldCB0byBlcnJub19tYXgoKSBsYXRlci4gICovCi0KLWludCBzeXNfbmVyciA9IDA7Ci0KLS8qIERlYnVnIGZsYWcgZm9yIHBhdGhuYW1lIGhhY2tpbmcuICBTZXQgdGhpcyB0byBvbmUgYW5kIHJlYnVpbGQuICovCi0KLWludCBEZWJ1Z1BJID0gLTE7Ci0KLXZvaWQKLW1wd2lmeV9maWxlbmFtZShjaGFyICp1bml4bmFtZSwgY2hhciAqbWFjbmFtZSkKLXsKLSAgaW50IGksIGo7Ci0KLSAgLyogKHNob3VsZCB0cnVuY2F0ZSAyNTUgY2hhcnMgZnJvbSBlbmQgb2YgbmFtZSwgbm90IGJlZ2lubmluZykgKi8KLSAgaWYgKHN0cmxlbiAodW5peG5hbWUpID4gMjU1KQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlBhdGhuYW1lIFwiJXNcIiBpcyB0b28gbG9uZyBmb3IgTWFjcywgdHJ1bmNhdGluZ1xuIiwKLQkgICAgICAgdW5peG5hbWUpOwotICAgIH0KLSAgaiA9IDA7Ci0gIC8qIElmIHlvdSdyZSBnb2luZyB0byBlbmQgdXAgd2l0aCBvbmUgb3IgbW9yZSBjb2xvbnMgaW4gdGhlIG1pZGRsZSBvZiBhCi0gICAgIHBhdGggYWZ0ZXIgYW4gYWxsLVVuaXggcmVsYXRpdmUgcGF0aCBpcyB0cmFuc2xhdGVkLCB5b3UgbXVzdCBhZGQgYQotICAgICBjb2xvbiBvbiB0aGUgZnJvbnQsIHNvIHRoYXQgdGhlIGZpcnN0IGNvbXBvbmVudCBpcyBub3QgdGhvdWdodCB0byBiZQotICAgICBhIGRpc2sgbmFtZS4gICovCi0gIGlmICh1bml4bmFtZVswXSAhPSAnLycgJiYgISBzdHJjaHIgKHVuaXhuYW1lLCAnOicpICYmIHN0cmNociAodW5peG5hbWUsICcvJykpCi0gICAgewotICAgICAgbWFjbmFtZVtqKytdID0gJzonOwotICAgIH0KLSAgZm9yIChpID0gMDsgdW5peG5hbWVbaV0gIT0gJ1wwJyAmJiBpIDwgMjU1OyArK2kpCi0gICAgewotICAgICAgaWYgKGkgPT0gMCAmJiB1bml4bmFtZVtpXSA9PSAnLycpCi0JewotCSAgaWYgKHN0cm5jbXAgKHVuaXhuYW1lLCAiL3RtcC8iLCA1KSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogQSB0ZW1wb3JhcnkgbmFtZSwgbWFrZSBhIG1vcmUgTWFjLWZsYXZvcmVkIHRtcG5hbWUuICovCi0JICAgICAgLyogQSBiZXR0ZXIgY2hvaWNlIHdvdWxkIGJlIHtCb290fVRyYXNoOmZvbywgYnV0Ci0JCSB0aGF0IHdvdWxkIHJlcXVpcmUgYmVpbmcgYWJsZSB0byBpZGVudGlmeSB0aGUKLQkJIGJvb3QgZGlzaydzIGFuZCB0cmFzaGNhbidzIG5hbWUuICBBbm90aGVyIG9wdGlvbgotCQkgd291bGQgYmUgdG8gaGF2ZSBhbiBlbnYgdmFyLCBzbyB1c2VyIGNhbiBwb2ludCBpdAotCQkgYXQgYSByYW1kaXNrLiAqLwotCSAgICAgIG1hY25hbWVbaisrXSA9ICc6JzsKLQkgICAgICBtYWNuYW1lW2orK10gPSAndCc7Ci0JICAgICAgbWFjbmFtZVtqKytdID0gJ20nOwotCSAgICAgIG1hY25hbWVbaisrXSA9ICdwJzsKLQkgICAgICBtYWNuYW1lW2orK10gPSAnXyc7Ci0JICAgICAgaSArPSA0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBEb24ndCBjb3B5IHRoZSBsZWFkaW5nIHNsYXNoLiAqLwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAodW5peG5hbWVbaV0gPT0gJzonICYmIHVuaXhuYW1lW2krMV0gPT0gJy8nKQotCXsKLQkgIG1hY25hbWVbaisrXSA9ICc6JzsKLQkgIGkgKz0gMTsKLQl9Ci0gICAgICBlbHNlIGlmICh1bml4bmFtZVtpXSA9PSAnLicgJiYgdW5peG5hbWVbaSsxXSA9PSAnLycpCi0JewotCSAgbWFjbmFtZVtqKytdID0gJzonOwotCSAgaSArPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHVuaXhuYW1lW2ldID09ICcuJyAmJiB1bml4bmFtZVtpKzFdID09ICcuJyAmJiB1bml4bmFtZVtpKzJdID09ICcvJykKLQl7Ci0JICBtYWNuYW1lW2orK10gPSAnOic7Ci0JICBtYWNuYW1lW2orK10gPSAnOic7Ci0JICBpICs9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAodW5peG5hbWVbaV0gPT0gJy8nKQotCXsKLQkgIG1hY25hbWVbaisrXSA9ICc6JzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWFjbmFtZVtqKytdID0gdW5peG5hbWVbaV07Ci0JfQotICAgIH0KLSAgbWFjbmFtZVtqXSA9ICdcMCc7Ci0gIC8qIEFsbG93IGZvciBnZXR0aW5nIHRoZSBkZWJ1ZyBmbGFnIGZyb20gYW4gZW52IHZhcjsgcXVpdGUgdXNlZnVsLiAqLwotICBpZiAoRGVidWdQSSA8IDApCi0gICAgRGVidWdQSSA9ICgqKGdldGVudiAoIkRFQlVHX1BBVEhOQU1FUyIpKSA9PSAnMScgPyAxIDogMCk7Ci0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgTWFkZSBcIiVzXCJcbiIsIHVuaXhuYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgaW50byBcIiVzXCJcbiIsIG1hY25hbWUpOwotICAgIH0KLX0KLQotLyogTVBXLWZsYXZvcmVkIGJhc2VuYW1lIGZpbmRlci4gKi8KLQotY2hhciAqCi1tcHdfYmFzZW5hbWUgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKmJhc2UgPSBuYW1lOwotCi0gIHdoaWxlICgqbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoKm5hbWUrKyA9PSAnOicpCi0JewotCSAgYmFzZSA9IG5hbWU7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGJhc2U7Ci19Ci0KLS8qIE1peGVkIE1QVy9Vbml4IGJhc2VuYW1lIGZpbmRlci4gIFRoaXMgY2FuIGJlIGxlZCBhc3RyYXkgYnkKLSAgIGZpbGVuYW1lcyB3aXRoIHNsYXNoZXMgaW4gdGhlbSBhbmQgY29tZSB1cCB3aXRoIGEgYmFzZW5hbWUgdGhhdAotICAgZWl0aGVyIGNvcnJlc3BvbmRzIHRvIG5vIGZpbGUgb3IgKHdvcnNlKSB0byBzb21lIG90aGVyIGZpbGUsIHNvCi0gICBzaG91bGQgb25seSBiZSB0cmllZCBpZiBvdGhlciBtZXRob2RzIG9mIGZpbmRpbmcgYSBmaWxlIHZpYSBhCi0gICBiYXNlbmFtZSBoYXZlIGZhaWxlZC4gICovCi0KLWNoYXIgKgotbXB3X21peGVkX2Jhc2VuYW1lIChuYW1lKQotICBjaGFyICpuYW1lOwotewotICBjaGFyICpiYXNlID0gbmFtZTsKLQotICB3aGlsZSAoKm5hbWUpCi0gICAgewotICAgICAgaWYgKCpuYW1lID09ICcvJyB8fCAqbmFtZSA9PSAnOicpCi0JewotCSAgYmFzZSA9IG5hbWUgKyAxOwotCX0KLSAgICAgICsrbmFtZTsKLSAgICB9Ci0gIHJldHVybiBiYXNlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGZvcGVuKCkgbW9kaWZpZWQgdG8gY3JlYXRlIGZpbGVzIHRoYXQgYXJlIHR5cGUgVEVYVAotICAgb3IgJ0JJTiAnLCBhbmQgYWx3YXlzIG9mIHR5cGUgJ01QUyAnLiAgKi8KLQotRklMRSAqCi1tcHdfZm9wZW4gKGNoYXIgKm5hbWUsIGNoYXIgKm1vZGUpCi17Ci0jdW5kZWYgZm9wZW4KLSAgaW50IGVycm51bTsKLSAgRklMRSAqZnA7Ci0gIGNoYXIgdG1wbmFtZVsyNTZdOwotCi0gIG1wd2lmeV9maWxlbmFtZSAobmFtZSwgdG1wbmFtZSk7Ci0gIFBST0dSRVNTICgxKTsKLSAgZnAgPSBmb3BlbiAodG1wbmFtZSwgbW9kZSk7Ci0gIGVycm51bSA9IGVycm5vOwotCi0gIC8qIElmIHdyaXRpbmcsIG5lZWQgdG8gc2V0IHR5cGUgYW5kIGNyZWF0b3IgdXNlZnVsbHkuICovCi0gIGlmIChzdHJjaHIgKG1vZGUsICd3JykpCi0gICAgewotICAgICAgY2hhciAqcG5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAodG1wbmFtZSkgKyAyKTsKLSAgICAgIE9TRXJyIGU7Ci0gICAgICBzdHJ1Y3QgRkluZm8gZmk7Ci0KLSAgICAgIHBuYW1lWzBdID0gc3RybGVuICh0bXBuYW1lKTsKLSAgICAgIHN0cmNweSAocG5hbWUrMSwgdG1wbmFtZSk7Ci0JCi0gICAgICBlID0gR2V0RkluZm8gKChDb25zdFN0cjI1NVBhcmFtKSBwbmFtZSwgMCwgJmZpKTsKLSAgICAgIC8qIHNob3VsZCBkbyBzcGlmZmllciBlcnJvciBoYW5kbGluZyAqLwotICAgICAgaWYgKGUgIT0gMCkKLQlmcHJpbnRmKHN0ZGVyciwgIkdldEZJbmZvIHJldHVybnMgJWRcbiIsIGUpOwotICAgICAgaWYgKHN0cmNociAobW9kZSwgJ2InKSkKLQl7Ci0JICBmaS5mZFR5cGUgPSAoT1NUeXBlKSAnQklOICc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZpLmZkVHlwZSA9IChPU1R5cGUpICdURVhUJzsKLQl9Ci0gICAgICBmaS5mZENyZWF0b3IgPSAoT1NUeXBlKSAnTVBTICc7Ci0gICAgICBlID0gU2V0RkluZm8gKChDb25zdFN0cjI1NVBhcmFtKSBwbmFtZSwgMCwgJmZpKTsKLSAgICAgIGlmIChlICE9IDApCi0JZnByaW50ZihzdGRlcnIsICJTZXRGSW5mbyByZXR1cm5zICVkXG4iLCBlKTsKLSAgICAgIGZyZWUgKHBuYW1lKTsKLSAgICB9Ci0gIGlmIChmcCA9PSBOVUxMKQotICAgIGVycm5vID0gZXJybnVtOwotICByZXR1cm4gZnA7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGZzZWVrKCkgbW9kaWZpZWQgdG8gZmlsbCB0aGUgZmlsZSB3aXRoIHplcm9zCi0gICBpZiBzZWVraW5nIHBhc3QgdGhlIGVuZCBvZiBpdC4gICovCi0KLSNkZWZpbmUgWkVST0JMS1NJWkUgNDA5NgotCi1jaGFyIHplcm9zW1pFUk9CTEtTSVpFXTsKLQotaW50Ci1tcHdfZnNlZWsgKEZJTEUgKmZwLCBpbnQgb2Zmc2V0LCBpbnQgd2hlbmNlKQotewotI3VuZGVmIGZzZWVrCi0gIGludCBjdXJzaXplLCBudW1sZWZ0OwotCi0gIFBST0dSRVNTICgxKTsKLSAgaWYgKHdoZW5jZSA9PSBTRUVLX1NFVCkKLSAgICB7Ci0gICAgICBmc2VlayAoZnAsIDAsIFNFRUtfRU5EKTsKLSAgICAgIGN1cnNpemUgPSBmdGVsbCAoZnApOwotICAgICAgaWYgKG9mZnNldCA+IGN1cnNpemUpCi0JewotCSAgbnVtbGVmdCA9IG9mZnNldCAtIGN1cnNpemU7Ci0JICB3aGlsZSAobnVtbGVmdCA+IFpFUk9CTEtTSVpFKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBtaWdodCBmYWlsLCBzaG91bGQgY2hlY2sgZm9yIHRoYXQuICovCi0JICAgICAgUFJPR1JFU1MgKDEpOwotCSAgICAgIGZ3cml0ZSAoemVyb3MsIDEsIFpFUk9CTEtTSVpFLCBmcCk7Ci0JICAgICAgbnVtbGVmdCAtPSBaRVJPQkxLU0laRTsKLQkgICAgfQotCSAgUFJPR1JFU1MgKDEpOwotCSAgZndyaXRlICh6ZXJvcywgMSwgbnVtbGVmdCwgZnApOwotCSAgZmZsdXNoIChmcCk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGZzZWVrIChmcCwgb2Zmc2V0LCB3aGVuY2UpOwotfQotCi1pbnQKLW1wd19mcmVhZCAoY2hhciAqcHRyLCBpbnQgc2l6ZSwgaW50IG5pdGVtcywgRklMRSAqc3RyZWFtKQotewotI3VuZGVmIGZyZWFkCi0gIGludCByc2x0OwotCi0gIFBST0dSRVNTICgxKTsKLSAgcnNsdCA9IGZyZWFkIChwdHIsIHNpemUsIG5pdGVtcywgc3RyZWFtKTsKLSAgUFJPR1JFU1MgKDEpOwotICByZXR1cm4gcnNsdDsKLX0KLQotaW50Ci1tcHdfZndyaXRlIChjaGFyICpwdHIsIGludCBzaXplLCBpbnQgbml0ZW1zLCBGSUxFICpzdHJlYW0pCi17Ci0jdW5kZWYgZndyaXRlCi0gIGludCByc2x0OwotCi0gIFBST0dSRVNTICgxKTsKLSAgcnNsdCA9IGZ3cml0ZSAocHRyLCBzaXplLCBuaXRlbXMsIHN0cmVhbSk7Ci0gIFBST0dSRVNTICgxKTsKLSAgcmV0dXJuIHJzbHQ7Ci19Ci0KLWludAotbGluayAoKQotewotICBmcHJpbnRmIChzdGRlcnIsICJsaW5rIG5vdCBhdmFpbGFibGUhXG4iKTsKLSAgbXB3X2Fib3J0ICgpOwotfQotCi1pbnQKLWZvcmsgKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZm9yayBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLX0KLQotaW50Ci12Zm9yayAoKQotewotICBmcHJpbnRmIChzdGRlcnIsICJ2Zm9yayBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLWludAotcGlwZSAoaW50ICpmZCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAicGlwZSBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLSNpZm5kZWYgVVNFX01XX0hFQURFUlMKLWludAotZXhlY3ZwIChjaGFyICpmaWxlLCBjaGFyICoqYXJndikKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZXhlY3ZwIG5vdCBhdmFpbGFibGUhXG4iKTsKLSAgbXB3X2Fib3J0ICgpOwotICByZXR1cm4gKC0xKTsKLX0KLQotaW50Ci1leGVjdiAoY2hhciAqcGF0aCwgY2hhciAqKmFyZ3YpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImV4ZWN2IG5vdCBhdmFpbGFibGUhXG4iKTsKLSAgbXB3X2Fib3J0ICgpOwotICByZXR1cm4gKC0xKTsKLX0KLSNlbmRpZgotCi1pbnQKLWtpbGwgKGludCBwaWQsIGludCBzaWcpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImtpbGwgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci0gIHJldHVybiAoLTEpOwotfQotCi1pbnQKLXdhaXQgKGludCAqc3RhdHVzKQotewotICAqc3RhdHVzID0gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZm5kZWYgVVNFX01XX0hFQURFUlMKLWludAotc2xlZXAgKGludCBzZWNvbmRzKQotewotICB1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWUsIG5vdzsKLQotICB0aW1lICgmc3RhcnRfdGltZSk7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgUFJPR1JFU1MgKDEpOwotICAgICAgdGltZSAoJm5vdyk7Ci0gICAgICBpZiAobm93ID4gc3RhcnRfdGltZSArIHNlY29uZHMpCi0JcmV0dXJuIDA7Ci0gICAgfQotfQotI2VuZGlmCi0KLXZvaWQKLXB1dGVudiAoY2hhciAqc3RyKQotewotICAvKiBUaGUgR0NDIGRyaXZlciBjYWxscyB0aGlzIHRvIGRvIHRoaW5ncyBmb3IgY29sbGVjdDIsIGJ1dCB3ZQotICAgICBkb24ndCBjYXJlIGFib3V0IGNvbGxlY3QyLiAqLwotfQotCi1pbnQKLWNobW9kIChjaGFyICpwYXRoLCBpbnQgbW9kZSkKLXsKLSAgLyogUHJldGVuZCBpdCB3YXMgYWxsIE9LLiAqLwotICByZXR1cm4gMDsKLX0KLQotI2lmbmRlZiBVU0VfTVdfSEVBREVSUwotaW50Ci1nZXR1aWQgKCkKLXsKLSAgLyogT25lIHZhbHVlIGlzIGFzIGdvb2QgYXMgYW5vdGhlci4uLiAqLwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1nZXRnaWQgKCkKLXsKLSAgLyogT25lIHZhbHVlIGlzIGFzIGdvb2QgYXMgYW5vdGhlci4uLiAqLwotICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKiBJbnN0ZWFkIG9mIGNvcmVkdW1waW5nLCB3aGljaCBpcyBub3QgYSBub3JtYWwgTWFjIGZhY2lsaXR5LCB3ZQotICAgZHJvcCBpbnRvIE1hY3NidWcuICBJZiB3ZSB0aGVuICJnIiBmcm9tIE1hY3NidWcsIHRoZSBwcm9ncmFtIHdpbGwKLSAgIGV4aXQgY2xlYW5seS4gKi8KLQotdm9pZAotbXB3X2Fib3J0ICgpCi17Ci0gIC8qIE1ha2Ugc3VyZSBubyBvdXRwdXQgc3RpbGwgYnVmZmVyZWQgdXAsIHRoZW4gemFwIGludG8gTWFjc0J1Zy4gKi8KLSAgZmZsdXNoKHN0ZG91dCk7Ci0gIGZmbHVzaChzdGRlcnIpOwotICBwcmludGYoIiMjIEFib3J0ISAjI1xuIik7Ci0jaWZkZWYgTVBXX1NBREUKLSAgU3lzRXJyb3IoODAwNSk7Ci0jZWxzZSAKLSAgRGVidWdnZXIoKTsKLSNlbmRpZgotICAvKiAiZyIgaW4gTWFjc0J1ZyB3aWxsIHRoZW4gY2F1c2UgYSByZWd1bGFyIGVycm9yIGV4aXQuICovCi0gIGV4aXQgKDEpOwotfQotCi0vKiBJbWl0YXRpb24gZ2V0cnVzYWdlIGJhc2VkIG9uIHRoZSBBTlNJIGNsb2NrKCkgZnVuY3Rpb24uICovCi0KLWludAotZ2V0cnVzYWdlIChpbnQgd2hvLCBzdHJ1Y3QgcnVzYWdlICpydXNhZ2UpCi17Ci0gIGludCBjbGsgPSBjbG9jayAoKTsKLQotI2lmIDAKLSAgcnVzYWdlLT5ydV91dGltZS50dl9zZWMgPSBjbGsgLyBDTE9DS1NfUEVSX1NFQzsKLSAgcnVzYWdlLT5ydV91dGltZS50dl91c2VjID0gKChjbGsgKiAxMDAwKSAvIENMT0NLU19QRVJfU0VDKSAqIDEwMDA7Ci0gIHJ1c2FnZS0+cnVfc3RpbWUudHZfc2VjID0gMDsKLSAgcnVzYWdlLT5ydV9zdGltZS50dl91c2VjID0gMDsKLSNlbmRpZgotfQotCi1pbnQKLXNicmsgKCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZm5kZWYgVVNFX01XX0hFQURFUlMKLWludAotaXNhdHR5IChpbnQgZmQpCi17Ci0gIHJldHVybiAwOwotfQotCi0vKiBUaGlzIGlzIGluaGVyaXRlZCBmcm9tIFRpbW90aHkgTXVycmF5J3MgUG9zaXggbGlicmFyeS4gKi8KLQotI2luY2x1ZGUgInV0aW1lLmgiCi0KLWludAotdXRpbWUgKGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgdXRpbWJ1ZiAqdGltZXMpCi17Ci0gIENJbmZvUEJSZWMgY2lwYnI7Ci0gIEhGaWxlSW5mbyAqZnBiID0gKEhGaWxlSW5mbyAqKSAmY2lwYnI7Ci0gIERpckluZm8gKmRwYiA9IChEaXJJbmZvICopICZjaXBicjsKLSAgdW5zaWduZWQgY2hhciBwbmFtZVsyNTZdOwotICBzaG9ydCBlcnI7Ci0gIAotICBzdHJjcHkgKChjaGFyICopIHBuYW1lLCBmaWxlbmFtZSk7Ci0gIGMycHN0ciAocG5hbWUpOwotCi0gIGRwYi0+aW9EckRpcklEID0gMEw7Ci0gIGZwYi0+aW9OYW1lUHRyID0gcG5hbWU7Ci0gIGZwYi0+aW9WUmVmTnVtID0gMDsKLSAgZnBiLT5pb0ZEaXJJbmRleCA9IDA7Ci0gIGZwYi0+aW9GVmVyc051bSA9IDA7Ci0gIGVyciA9IFBCR2V0Q2F0SW5mbyAoJmNpcGJyLCAwKTsKLSAgaWYgKGVyciAhPSBub0VycikgewotICAgIGVycm5vID0gRU5PRU5UOwotICAgIHJldHVybiAtMTsKLSAgfQotICBkcGItPmlvRHJEaXJJRCA9IDBMOwotICBmcGItPmlvRmxNZERhdCA9IHRpbWVzLT5tb2R0aW1lOwotICBmcGItPmlvRmxDckRhdCA9IHRpbWVzLT5hY3RpbWU7Ci0gIGVyciA9IFBCU2V0Q2F0SW5mbyAoJmNpcGJyLCAwKTsKLSAgaWYgKGVyciAhPSBub0VycikgewotICAgIGVycm5vID0gRUFDQ0VTOwotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1ta2RpciAoY2hhciAqcGF0aCwgaW50IG1vZGUpCi17Ci0gIGVycm5vID0gRU5PU1lTOwotICByZXR1cm4gLTE7Ci19Ci0KLWludAotcm1kaXIgKCkKLXsKLSAgZXJybm8gPSBFTk9TWVM7Ci0gIHJldHVybiAtMTsKLX0KLSNlbmRpZgotCi1jaG93biAoKQotewotICBlcnJubyA9IEVOT1NZUzsKLSAgcmV0dXJuIC0xOwotfQotCi1jaGFyICpteWVudmlyb25bXSA9IHtOVUxMfTsKLQotY2hhciAqKmVudmlyb24gPSBteWVudmlyb247Ci0KLSNpZm5kZWYgVVNFX01XX0hFQURFUlMKLQotLyogTWluaW1hbCAnc3RhdCcgZW11bGF0aW9uOiB0ZWxscyBkaXJlY3RvcmllcyBmcm9tIGZpbGVzIGFuZAotICAgZ2l2ZXMgbGVuZ3RoIGFuZCBtdGltZS4KLQotICAgRGVyaXZlZCBmcm9tIGNvZGUgd3JpdHRlbiBieSBHdWlkbyB2YW4gUm9zc3VtLCBDV0ksIEFtc3RlcmRhbQotICAgYW5kIHBsYWNlZCBieSBoaW0gaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi1leHRlcm4gaW50IF9fdWlkLCBfX2dpZDsKLQotaW50IF9fdWlkID0gMDsKLWludCBfX2dpZCA9IDA7Ci0KLS8qIEJpdHMgaW4gaW9GbEF0dHJpYjogKi8KLSNkZWZpbmUgTE9DS0JJVAkoMTw8MCkJCS8qIEZpbGUgbG9ja2VkICovCi0jZGVmaW5lIERJUkJJVAkoMTw8NCkJCS8qIEl0J3MgYSBkaXJlY3RvcnkgKi8KLQotLyogTWFjaWZpZWQgInN0YXQiIGluIHdoaWNoIGZpbGVuYW1lIGlzIGdpdmVuIHJlbGF0aXZlIHRvIGEgZGlyZWN0b3J5LAotICAgc3BlY2lmaWVkIGJ5IGxvbmcgRGlySUQuICAqLwotCi1zdGF0aWMgaW50Ci1fc3RhdCAoY2hhciAqbmFtZSwgbG9uZyBkaXJpZCwgc3RydWN0IHN0YXQgKmJ1ZikKLXsKLSAgQ0luZm9QQlJlYyBjaXBicjsKLSAgSEZpbGVJbmZvICpmcGIgPSAoSEZpbGVJbmZvKikgJmNpcGJyOwotICBEaXJJbmZvICpkcGIgPSAoRGlySW5mbyopICZjaXBicjsKLSAgU3RyMjU1IHBuYW1lOwotICBzaG9ydCBlcnI7Ci0KLSAgLyogTWFrZSBhIHRlbXAgY29weSBvZiB0aGUgbmFtZSBhbmQgcGFzY2FsaXplLiAqLwotICBzdHJjcHkgKChjaGFyICopIHBuYW1lLCBuYW1lKTsKLSAgYzJwc3RyIChwbmFtZSk7Ci0gIAotICBjaXBici5kaXJJbmZvLmlvRHJEaXJJRCA9IGRpcmlkOwotICBjaXBici5oRmlsZUluZm8uaW9OYW1lUHRyID0gcG5hbWU7Ci0gIGNpcGJyLmhGaWxlSW5mby5pb1ZSZWZOdW0gPSAwOwotICBjaXBici5oRmlsZUluZm8uaW9GRGlySW5kZXggPSAwOwotICBjaXBici5oRmlsZUluZm8uaW9GVmVyc051bSA9IDA7Ci0gIGVyciA9IFBCR2V0Q2F0SW5mbyAoJmNpcGJyLCAwKTsKLSAgaWYgKGVyciAhPSBub0VycikKLSAgICB7Ci0gICAgICBlcnJubyA9IEVOT0VOVDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIC8qIE1hYyBmaWxlcyBhcmUgcmVhZGFibGUgaWYgdGhleSBjYW4gYmUgYWNjZXNzZWQgYXQgYWxsLiAqLwotICBidWYtPnN0X21vZGUgPSAwNDQ0OwotICAvKiBNYXJrIHVubG9ja2VkIGZpbGVzIGFzIHdyaXRlYWJsZS4gKi8KLSAgaWYgKCEoZnBiLT5pb0ZsQXR0cmliICYgTE9DS0JJVCkpCi0gICAgYnVmLT5zdF9tb2RlIHw9IDAyMjI7Ci0gIGlmIChmcGItPmlvRmxBdHRyaWIgJiBESVJCSVQpCi0gICAgewotICAgICAgLyogTWFyayBkaXJlY3RvcmllcyBhcyAiZXhlY3V0YWJsZSIuICovCi0gICAgICBidWYtPnN0X21vZGUgfD0gMDExMSB8IFNfSUZESVI7Ci0gICAgICBidWYtPnN0X3NpemUgPSBkcGItPmlvRHJObUZsczsKLSAgICAgIGJ1Zi0+c3RfcnNpemUgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1Zi0+c3RfbW9kZSB8PSBTX0lGUkVHOwotICAgICAgLyogTWFyayBhcHBzIGFzICJleGVjdXRhYmxlIi4gKi8KLSAgICAgIGlmIChmcGItPmlvRmxGbmRySW5mby5mZFR5cGUgPT0gJ0FQUEwnKQotCWJ1Zi0+c3RfbW9kZSB8PSAwMTExOwotICAgICAgLyogRmlsbCBpbiB0aGUgc2l6ZXMgb2YgZGF0YSBhbmQgcmVzb3VyY2UgZm9ya3MuICovCi0gICAgICBidWYtPnN0X3NpemUgPSBmcGItPmlvRmxMZ0xlbjsKLSAgICAgIGJ1Zi0+c3RfcnNpemUgPSBmcGItPmlvRmxSTGdMZW47Ci0gICAgfQotICAvKiBGaWxsIGluIHZhcmlvdXMgdGltZXMuICovCi0gIGJ1Zi0+c3RfYXRpbWUgPSBmcGItPmlvRmxDckRhdDsKLSAgYnVmLT5zdF9tdGltZSA9IGZwYi0+aW9GbE1kRGF0OwotICBidWYtPnN0X2N0aW1lID0gZnBiLT5pb0ZsQ3JEYXQ7Ci0gIC8qIFNldCB1cCBhbiBpbWl0YXRpb24gaW5vZGUgbnVtYmVyLiAqLwotICBidWYtPnN0X2lubyA9ICh1bnNpZ25lZCBzaG9ydCkgZnBiLT5pb0RpcklEOwotICAvKiBTZXQgdXAgYW4gaW1pdGF0aW9uIGRldmljZS4gKi8KLSAgR2V0VlJlZk51bSAoYnVmLT5zdF9pbm8sICZidWYtPnN0X2Rldik7Ci0gIGJ1Zi0+c3RfdWlkID0gX191aWQ7Ci0gIGJ1Zi0+c3RfZ2lkID0gX19naWQ7Ci0vKiAgYnVmLT5zdF9GbEZuZHJJbmZvID0gZnBiLT5pb0ZsRm5kckluZm87ICAqLwotICByZXR1cm4gMDsKLX0KLQotLyogc3RhdCgpIHNldHMgdXAgYW4gZW1wdHkgZGlyaWQuICovCi0KLWludAotc3RhdCAoY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKmJ1ZikKLXsKLSAgbG9uZyByc2x0LCBlcnJudW07Ci0gIGNoYXIgdG1wbmFtZVsyNTZdOwotCi0gIG1wd2lmeV9maWxlbmFtZSAocGF0aCwgdG1wbmFtZSk7Ci0gIGlmIChEZWJ1Z1BJKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiMgc3RhdCAoJXMsICV4KSIsIHRtcG5hbWUsIGJ1Zik7Ci0gIFBST0dSRVNTICgxKTsKLSAgcnNsdCA9IF9zdGF0ICh0bXBuYW1lLCAwTCwgYnVmKTsKLSAgZXJybnVtID0gZXJybm87Ci0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlZCIsIHJzbHQpOwotICAgICAgaWYgKHJzbHQgIT0gMCkKLQlmcHJpbnRmIChzdGRlcnIsICIgKGVycm5vIGlzICVkKSIsIGVycm51bSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgICAgZmZsdXNoIChzdGRlcnIpOwotICAgIH0KLSAgaWYgKHJzbHQgIT0gMCkKLSAgICBlcnJubyA9IGVycm51bTsKLSAgcmV0dXJuIHJzbHQ7Ci19Ci0KLWludAotZnN0YXQgKGludCBmZCwgc3RydWN0IHN0YXQgKmJ1ZikKLXsKLSAgRkNCUEJSZWMgZmNiOwotICBGSUxFICpmcDsKLSAgU3RyMjU1IHBhdGhuYW1lOwotICBsb25nIGRpcmlkID0gMEwsIHRlbXA7Ci0gIGxvbmcgcnNsdCwgZXJybnVtOwotICBzaG9ydCBlcnI7Ci0KLSAgaWYgKERlYnVnUEkgPCAwKQotICAgIERlYnVnUEkgPSAoKihnZXRlbnYgKCJERUJVR19QQVRITkFNRVMiKSkgPT0gJzEnID8gMSA6IDApOwotICBpZiAoRGVidWdQSSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIjIGZzdGF0ICglZCwgJXgpIiwgZmQsIGJ1Zik7Ci0gIFBST0dSRVNTICgxKTsKLSAgcGF0aG5hbWVbMF0gPSAwOwotI2lmZGVmIEZJT0ZOQU1FCi0gIC8qIFVzZSBhbiBNUFctc3BlY2lmaWMgaW9jdGwgdG8gZ2V0IHRoZSBwYXRobmFtZSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgdGhlIGZpbGUgZGVzY3JpcHRvci4gICovCi0gIGlvY3RsIChmZCwgRklPRk5BTUUsIChsb25nICopIHBhdGhuYW1lKTsgCi0jZWxzZQotICB5b3UgbG9zZQotI2VuZGlmCi0gIGlmIChEZWJ1Z1BJKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiAobmFtZSBpcyAlcykiLCBwYXRobmFtZSk7Ci0gIGRpcmlkID0gMEwgLyogZmNiLmlvRkNCUGFySUQgKi8gOwotICByc2x0ID0gX3N0YXQgKChjaGFyICopIHBhdGhuYW1lLCBkaXJpZCwgYnVmKTsKLSAgZXJybnVtID0gZXJybm87Ci0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlZCIsIHJzbHQpOwotICAgICAgaWYgKHJzbHQgIT0gMCkKLQlmcHJpbnRmIChzdGRlcnIsICIgKGVycm5vIGlzICVkKSIsIGVycm51bSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgICAgZmZsdXNoIChzdGRlcnIpOwotICAgIH0KLSAgaWYgKHJzbHQgIT0gMCkKLSAgICBlcnJubyA9IGVycm51bTsKLSAgcmV0dXJuIHJzbHQ7Ci19Ci0KLSNlbmRpZiAvKiBuIFVTRV9NV19IRUFERVJTICovCi0KLWNoZGlyICgpCi17Ci0gIGVycm5vID0gRU5PU1lTOwotICByZXR1cm4gKC0xKTsKLX0KLQotY2hhciAqCi1nZXRjd2QgKGNoYXIgKmJ1ZiwgaW50IHNpemUpCi17Ci0gIGlmIChidWYgPT0gTlVMTCkKLSAgICBidWYgPSAoY2hhciAqKSBtYWxsb2MgKHNpemUpOwotICBzdHJjcHkoYnVmLCAiOiIpOwotICByZXR1cm4gYnVmOwotfQotCi0vKiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBtb3JlIGVsYWJvcmF0ZSBmb3IgTVBXLiAqLwotCi1jaGFyICoKLWdldHB3ZCAoKQotewotICByZXR1cm4gIjoiOwotfQotCi1pbnQKLW1wd19vcGVuIChjaGFyICpmaWxlbmFtZSwgaW50IGFyZzIsIGludCBhcmczKQotewotI3VuZGVmIG9wZW4KLSAgaW50IGZkLCBlcnJudW0gPSAwOwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKGZpbGVuYW1lLCB0bXBuYW1lKTsKLSAgZmQgPSBvcGVuICh0bXBuYW1lLCBhcmcyKTsKLSAgZXJybnVtID0gZXJybm87Ci0KLSAgaWYgKERlYnVnUEkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIyBvcGVuICglcywgJWQsICVkKSIsIHRtcG5hbWUsIGFyZzIsIGFyZzMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIC0+ICVkIiwgZmQpOwotICAgICAgaWYgKGZkID09IC0xKQotCWZwcmludGYgKHN0ZGVyciwgIiAoZXJybm8gaXMgJWQpIiwgZXJybnVtKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotICBpZiAoZmQgPT0gLTEpCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiBmZDsKLX0KLQotaW50Ci1tcHdfYWNjZXNzIChjaGFyICpmaWxlbmFtZSwgdW5zaWduZWQgaW50IGNtZCkKLXsKLSN1bmRlZiBhY2Nlc3MKLQotICBpbnQgcnNsdCwgZXJybnVtID0gMDsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIGNoYXIgdG1wbmFtZVsyNTZdOwotCi0gIG1wd2lmeV9maWxlbmFtZSAoZmlsZW5hbWUsIHRtcG5hbWUpOwotICBpZiAoY21kICYgUl9PSyB8fCBjbWQgJiBYX09LKQotICAgIHsKLSAgICAgIHJzbHQgPSBzdGF0ICh0bXBuYW1lLCAmc3QpOwotICAgICAgZXJybnVtID0gZXJybm87Ci0gICAgICBpZiAocnNsdCA+PSAwKQotCXsKLQkgIGlmICgoKChzdC5zdF9tb2RlICYgMDA0KSA9PSAwKSAmJiAoY21kICYgUl9PSykpCi0JICAgICAgfHwgKCgoc3Quc3RfbW9kZSAmIDAwMikgPT0gMCkgJiYgKGNtZCAmIFdfT0spKQotCSAgICAgIHx8ICgoKHN0LnN0X21vZGUgJiAwMDEpID09IDApICYmIChjbWQgJiBYX09LKSkpCi0JICAgIHsKLQkgICAgICByc2x0ID0gLTE7Ci0JICAgICAgZXJybnVtID0gRUFDQ0VTOwotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKERlYnVnUEkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIyBtcHdfYWNjZXNzICglcywgJWQpIiwgdG1wbmFtZSwgY21kKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlZCIsIHJzbHQpOwotICAgICAgaWYgKHJzbHQgIT0gMCkKLQlmcHJpbnRmIChzdGRlcnIsICIgKGVycm5vIGlzICVkKSIsIGVycm51bSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSAgaWYgKHJzbHQgIT0gMCkKLSAgICBlcnJubyA9IGVycm51bTsKLSAgcmV0dXJuIHJzbHQ7Ci19Ci0KLS8qIFRoZSBNUFcgbGlicmFyeSBjcmVhdCgpIGhhcyBubyBtb2RlIGFyZ3VtZW50LiAqLwotCi1pbnQKLW1wd19jcmVhdCAoY2hhciAqcGF0aCwgLyogbW9kZV90ICovIGludCBtb2RlKQotewotI3VuZGVmIGNyZWF0Ci0KLSNpZmRlZiBVU0VfTVdfSEVBREVSUwotICByZXR1cm4gY3JlYXQgKHBhdGgsIG1vZGUpOwotI2Vsc2UKLSAgcmV0dXJuIGNyZWF0IChwYXRoKTsKLSNlbmRpZgotfQotCi0vKiBUaGlzIGlzIGEgaGFjayB0byBnZXQgY29udHJvbCBpbiBhbiBNUFcgdG9vbCBiZWZvcmUgaXQgY3Jhc2hlcyB0aGUKLSAgIG1hY2hpbmUuICAqLwotCi1tcHdfc3BlY2lhbF9pbml0IChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpZiAoc3Ryc3RyIChuYW1lLCAiREVCVUciKSkKLSAgICBEZWJ1Z1N0cigiXHBhdCBiZWdpbm5pbmcgb2YgcHJvZ3JhbSIpOwotfQotCi1zdGF0aWMgaW50IGN1cnJlbnRfdW1hc2s7Ci0KLWludAotdW1hc2soaW50IG1hc2spCi17Ci0gIGludCBvbGRtYXNrID0gY3VycmVudF91bWFzazsKLQotICBjdXJyZW50X3VtYXNrID0gbWFzazsKLSAgcmV0dXJuIG9sZG1hc2s7Ci19Ci0KLS8qIEN1cnNvci1zcGlubmluZyBzdHVmZiB0aGF0IGluY2x1ZGVzIG1ldGVyaW5nIG9mIHNwaW4gcmF0ZSBhbmQgZGVsYXlzLiAgKi8KLQotLyogTm9uemVybyB3aGVuIGN1cnNvciBzcGlubmluZyBoYXMgYmVlbiBzZXQgdXAgcHJvcGVybHkuICAqLwotCi1pbnQgY3Vyc29yX2luaXRlZDsKLQotLyogTm9uemVybyBpZiBzcGluIHNob3VsZCBiZSBtZWFzdXJlZCBhbmQgZXhjZXNzaXZlIGRlbGF5cyByZXBvcnRlZC4gICovCi0KLWludCBtZWFzdXJlX3NwaW47Ci0KLS8qIE5vbnplcm8gaWYgc3BpbiBoaXN0b2dyYW0gYW5kIHJhdGUgZGF0YSBzaG91bGQgYmUgd3JpdHRlbiBvdXQuICAqLwotCi1pbnQgZHVtcF9zcGluX2RhdGE7Ci0KLWxvbmcgd2FybmluZ190aHJlc2hvbGQgPSA0MDAwMDA7Ci0KLWxvbmcgYnVja2V0X3NpemUgPSAxMDI0OwotCi1sb25nIGJ1Y2tldF9wb3dlciA9IDEwOwotCi1sb25nIG51bWJ1Y2tldHMgPSAzMDA7Ci0KLWludCAqZGVsYXlfY291bnRzOwotCi1pbnQgb3ZlcmZsb3dfY291bnQ7Ci0KLWNoYXIgKmN1cnJlbnRfcHJvZ3Jlc3M7Ci0KLXN0YXRpYyBVbnNpZ25lZFdpZGUgbGFzdF9taWNyb3NlY29uZHM7Ci0KLXN0YXRpYyBjaGFyICpsYXN0X3NwaW5fZmlsZSA9ICIiOwotCi1zdGF0aWMgaW50IGxhc3Rfc3Bpbl9saW5lOwotCi12b2lkCi13YXJuX2lmX3NwaW5fZGVsYXkgKGNoYXIgKmZpbGUsIGludCBsaW5lKQotewotICBsb25nIGRpZmYsIGl4OwotICBVbnNpZ25lZFdpZGUgbm93OwotCi0gIE1pY3Jvc2Vjb25kcygmbm93KTsKLQotICBkaWZmID0gbm93LmxvIC0gbGFzdF9taWNyb3NlY29uZHMubG87Ci0KLSAgaWYgKGRpZmYgPiB3YXJuaW5nX3RocmVzaG9sZCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIjICVzOiAlbGQuJTA2bGQgc2VjIGRlbGF5IGdldHRpbmcgZnJvbSAlczolZCB0byAlczolZFxuIiwKLQkgICAgIChjdXJyZW50X3Byb2dyZXNzID8gY3VycmVudF9wcm9ncmVzcyA6ICIiKSwKLQkgICAgIGRpZmYgLyAxMDAwMDAwLCBkaWZmICUgMTAwMDAwMCwKLQkgICAgIGxhc3Rfc3Bpbl9maWxlLCBsYXN0X3NwaW5fbGluZSwgZmlsZSwgbGluZSk7Ci0gIGlmIChkdW1wX3NwaW5fZGF0YSkKLSAgICB7Ci0gICAgICBpZiAoZGlmZiA+PSAwKQotCXsKLQkgIGl4ID0gZGlmZiA+PiBidWNrZXRfcG93ZXI7Ci0JICBpZiAoaXggPj0gMCAmJiBpeCA8IG51bWJ1Y2tldHMgJiYgZGVsYXlfY291bnRzICE9IE5VTEwpCi0JICAgICsrZGVsYXlfY291bnRzW2l4XTsKLQkgIGVsc2UKLQkgICAgKytvdmVyZmxvd19jb3VudDsKLQl9Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoc3RkZXJyLCAicmF3IGRpZmYgaXMgJWxkICg/KVxuIiwgZGlmZik7Ci0gICAgfQotfQotCi12b2lkCi1yZWNvcmRfZm9yX3NwaW5fZGVsYXkgKGNoYXIgKmZpbGUsIGludCBsaW5lKQotewotICBNaWNyb3NlY29uZHMgKCZsYXN0X21pY3Jvc2Vjb25kcyk7Ci0gIGxhc3Rfc3Bpbl9maWxlID0gZmlsZTsKLSAgbGFzdF9zcGluX2xpbmUgPSBsaW5lOwotfQotCi12b2lkCi1tcHdfc3RhcnRfcHJvZ3Jlc3MgKGNoYXIgKnN0ciwgaW50IG4sIGNoYXIgKmZpbGUsIGludCBsaW5lKQotewotICBpbnQgaTsKLSAgY2hhciAqbWVhc3VyZSwgKnRocmVzaG9sZDsKLQotICBpZiAoIWN1cnNvcl9pbml0ZWQpCi0gICAgewotICAgICAgSW5pdEN1cnNvckN0bCAobmlsKTsKLSAgICAgIGN1cnNvcl9pbml0ZWQgPSAxOwotICAgICAgcmVjb3JkX2Zvcl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKLSAgICAgIG1lYXN1cmUgPSBnZXRlbnYgKCJNRUFTVVJFX1NQSU4iKTsKLSAgICAgIGlmIChtZWFzdXJlICE9IE5VTEwgJiYgbWVhc3VyZVswXSAhPSAnXDAnKQotCXsKLQkgIG1lYXN1cmVfc3BpbiA9IDE7Ci0JICBpZiAoc3RyY21wIChtZWFzdXJlLCAiYWxsIikgPT0gMCkKLQkgICAgZHVtcF9zcGluX2RhdGEgPSAxOwotCX0KLSAgICAgIHRocmVzaG9sZCA9IGdldGVudiAoIlNQSU5fV0FSTl9USFJFU0hPTEQiKTsKLSAgICAgIGlmICh0aHJlc2hvbGQgIT0gTlVMTCAmJiB0aHJlc2hvbGRbMF0gIT0gJ1wwJykKLQl3YXJuaW5nX3RocmVzaG9sZCA9IGF0b2wgKHRocmVzaG9sZCk7Ci0gICAgICBpZiAoZHVtcF9zcGluX2RhdGEpCi0JewotCSAgaWYgKGRlbGF5X2NvdW50cyA9PSBOVUxMKQotCSAgICBkZWxheV9jb3VudHMgPSAoaW50ICopIG1hbGxvYyAobnVtYnVja2V0cyAqIHNpemVvZiAoaW50KSk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgbnVtYnVja2V0czsgKytpKQotCSAgICBkZWxheV9jb3VudHNbaV0gPSAwOwotCSAgb3ZlcmZsb3dfY291bnQgPSAwOwotCX0KLSAgICB9Ci0gIGN1cnJlbnRfcHJvZ3Jlc3MgPSBzdHI7Ci0KLSAgc3lzX25lcnIgPSBlcnJub19tYXggKCk7Ci0KLSAgbXB3X3NwZWNpYWxfaW5pdCAoc3RyKTsKLX0KLQotdm9pZAotbXB3X3Byb2dyZXNzIChpbnQgbikKLXsKLSAgU3BpbkN1cnNvciAoMzIpOwotfQotCi12b2lkCi1tcHdfcHJvZ3Jlc3NfbWVhc3VyZWQgKGludCBuLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgaWYgKG1lYXN1cmVfc3BpbikKLSAgICB3YXJuX2lmX3NwaW5fZGVsYXkgKGZpbGUsIGxpbmUpOwotICBTcGluQ3Vyc29yICgzMik7Ci0gIGlmIChtZWFzdXJlX3NwaW4pCi0gICAgcmVjb3JkX2Zvcl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKLX0KLQotdm9pZAotbXB3X2VuZF9wcm9ncmVzcyAoY2hhciAqc3RyLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgbG9uZyBpLCBkZWxheSwgY291bnQgPSAwLCBzdW0gPSAwLCBhdmdkZWxheSwgc3BpbnJhdGU7Ci0gIGxvbmcgY3VycG93ZXIgPSAwLCBjdXJncm91cCA9IDA7Ci0KLSAgLyogV2FybiBpZiBpdCdzIGJlZW4gYSB3aGlsZSBzaW5jZSB0aGUgbGFzdCBzcGluLiAgKi8KLSAgaWYgKG1lYXN1cmVfc3BpbikKLSAgICB3YXJuX2lmX3NwaW5fZGVsYXkgKGZpbGUsIGxpbmUpOwotCi0gIC8qIER1bXAgYWxsIHRoZSBub256ZXJvIGRlbGF5IGNvdW50cyBhbmQgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgZGVsYXkuICAqLwotICBpZiAoZHVtcF9zcGluX2RhdGEgJiYgZGVsYXlfY291bnRzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJ1Y2tldHM7ICsraSkKLQl7Ci0JICBkZWxheSA9IChpICsgMSkgKiBidWNrZXRfc2l6ZTsKLQkgIHN1bSArPSBkZWxheV9jb3VudHNbaV0gKiAoaSArIDEpOwotCSAgY291bnQgKz0gZGVsYXlfY291bnRzW2ldOwotCSAgaWYgKGRlbGF5IDw9ICgxIDw8IGN1cnBvd2VyKSkKLQkgICAgewotCSAgICAgIGN1cmdyb3VwICs9IGRlbGF5X2NvdW50c1tpXTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGN1cmdyb3VwID4gMCkKLQkJZnByaW50ZiAoc3RkZXJyLAotCQkJICIjICVzOiAlZCBkZWxheXMgYmV0d2VlbiAlbGQuJTA2bGQgYW5kICVsZC4lMDZsZCBzZWNcbiIsCi0JCQkgKHN0ciA/IHN0ciA6ICIiKSwKLQkJCSBjdXJncm91cCwKLQkJCSAoMSA8PCBjdXJwb3dlcikgLyAxMDAwMDAwLAotCQkJICgxIDw8IGN1cnBvd2VyKSAlIDEwMDAwMDAsCi0JCQkgKDEgPDwgKGN1cnBvd2VyICsgMSkpIC8gMTAwMDAwMCwKLQkJCSAoMSA8PCAoY3VycG93ZXIgKyAxKSkgJSAxMDAwMDAwKTsKLQkgICAgICArK2N1cnBvd2VyOwotCSAgICAgIGN1cmdyb3VwID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChjb3VudCA+IDApCi0JewotCSAgYXZnZGVsYXkgPSAoc3VtICogYnVja2V0X3NpemUpIC8gY291bnQ7Ci0JICBzcGlucmF0ZSA9IDEwMDAwMDAgLyBhdmdkZWxheTsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiMgJXM6IEF2ZXJhZ2Ugc3BpbiByYXRlIGlzICVkIHRpbWVzL3NlY1xuIiwKLQkJICAgKHN0ciA/IHN0ciA6ICIiKSwgc3BpbnJhdGUpOwotCX0KLSAgICB9Ci19Ci0KLSNpZmRlZiBQUk9HUkVTU19URVNUCi0KLS8qIFRlc3QgcHJvZ3JhbS4gICovCi0KLW1haW4gKCkKLXsKLSAgaW50IGksIGo7Ci0gIGRvdWJsZSB4ID0gMS4wLCB5ID0gMi40OwotICBsb25nIHN0YXJ0ID0gTWljcm9zZWNvbmRzICgpLCB0bTsgIEZJWE1FCi0KLSAgU1RBUlRfUFJPR1JFU1MgKCJoaSIsIDApOwotCi0gIGZvciAoaSA9IDA7IGkgPCAxMDAwOyArK2kpCi0gICAgewotICAgICAgUFJPR1JFU1MgKDEpOwotCi0gICAgICBmb3IgKGogPSAwOyBqIDwgKGkgKiAxMDApOyArK2opCi0JewotCSAgeCArPSAoeCAqIHkpIC8gajsKLQl9Ci0gICAgfQotICAKLSAgRU5EX1BST0dSRVNTICgiaGkiKTsKLSAgCi0gIHRtID0gTWljcm9zZWNvbmRzICgpIC0gc3RhcnQ7Ci0KLSAgcHJpbnRmICgiVG90YWwgdGltZSBpcyAlZC4lZCBzZWNzXG4iLCB0bSAvIDEwMDAwMDAsIHRtICUgMTAwMDAwMCk7Ci19Ci0KLSNlbmRpZgotCi0jaWZkZWYgVVNFX01XX0hFQURFUlMKLS8qIEVtcHR5IGRlZmluaXRpb25zIGZvciBNZXRyb3dlcmtzJyBTSU9VWCBjb25zb2xlIGxpYnJhcnkuICovCi0KLSNpZm5kZWYgX19DT05TT0xFX18KLSNpbmNsdWRlIDxjb25zb2xlLmg+Ci0jZW5kaWYKLQotc2hvcnQKLUluc3RhbGxDb25zb2xlKHNob3J0IGZkKQotewotI3ByYWdtYSB1bnVzZWQgKGZkKQotCXJldHVybiAwOwotfQotCi12b2lkCi1SZW1vdmVDb25zb2xlKHZvaWQpCi17Ci19Ci0KLWxvbmcKLVdyaXRlQ2hhcnNUb0NvbnNvbGUoY2hhciAqYnVmLCBsb25nIG4pCi17Ci0jcHJhZ21hIHVudXNlZCAoYnVmLCBuKQotCXJldHVybiAwOwotfQotCi1sb25nIFJlYWRDaGFyc0Zyb21Db25zb2xlKGNoYXIgKmJ1ZiwgbG9uZyBuKQotewotI3ByYWdtYSB1bnVzZWQgKGJ1ZiwgbikKLQlyZXR1cm4gMDsKLX0KLQotZXh0ZXJuIGNoYXIgKgotX190dHluYW1lKGxvbmcgZmQpCi17Ci0Jc3RhdGljIGNoYXIgKl9fZGV2aWNlbmFtZSA9ICJudWxsIGRldmljZSI7Ci0KLQlpZiAoZmQgPj0gMCAmJiBmZCA8PSAyKQotCSAgcmV0dXJuIChfX2RldmljZW5hbWUpOwotCXJldHVybiBOVUxMOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tc2Rvcy5jIGIvbGliaWJlcnR5L21zZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2U2NGQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21zZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1jaGFyIG1zZ1tdID0gIk5vIHZmb3JrIGF2YWlsYWJsZSAtIGFib3J0aW5nXG4iOwotdmZvcmsoKQotewotICB3cml0ZSgxLCBtc2csIHNpemVvZihtc2cpKTsKLX0KLQotc2lnc2V0bWFzaygpCi17Ci0gIC8qIG5vIHNpZ25hbHMgc3VwcG9ydCBpbiBnbzMyICh5ZXQpICovCi19Ci0KLXdhaXRwaWQoKQotewotICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvb2JqYWxsb2MuYyBiL2xpYmliZXJ0eS9vYmphbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc1NGE4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9vYmphbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qIG9iamFsbG9jLmMgLS0gcm91dGluZXMgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBvYmplY3RzCi0gICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFNvbHV0aW9ucy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9iamFsbG9jLmgiCi0KLS8qIEdldCBhIGRlZmluaXRpb24gZm9yIE5VTEwuICAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZiBWTVMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bml4bGliLmg+Ci0jZWxzZQotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0vKiBHZXQgYSBkZWZpbml0aW9uIGZvciBzaXplX3QuICAqLwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi0KLS8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhpcyBtdXN0IGJlIGRlY2xhcmVkLiAgKi8KLWV4dGVybiBQVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotZXh0ZXJuIHZvaWQgZnJlZSBQQVJBTVMgKChQVFIpKTsKLSNlbmRpZgotCi0vKiBUaGVzZSByb3V0aW5lcyBhbGxvY2F0ZSBzcGFjZSBmb3IgYW4gb2JqZWN0LiAgRnJlZWluZyBhbGxvY2F0ZWQKLSAgIHNwYWNlIG1heSBvciBtYXkgbm90IGZyZWUgYWxsIG1vcmUgcmVjZW50bHkgYWxsb2NhdGVkIHNwYWNlLgotCi0gICBXZSBoYW5kbGUgbGFyZ2UgYW5kIHNtYWxsIGFsbG9jYXRpb24gcmVxdWVzdHMgZGlmZmVyZW50bHkuICBJZiB3ZQotICAgZG9uJ3QgaGF2ZSBlbm91Z2ggc3BhY2UgaW4gdGhlIGN1cnJlbnQgYmxvY2ssIGFuZCB0aGUgYWxsb2NhdGlvbgotICAgcmVxdWVzdCBpcyBmb3IgbW9yZSB0aGFuIDUxMiBieXRlcywgd2Ugc2ltcGx5IHBhc3MgaXQgdGhyb3VnaCB0bwotICAgbWFsbG9jLiAgKi8KLQotLyogVGhlIG9iamFsbG9jIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIG9iamFsbG9jLmguICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGF0IHRoZSBzdGFydCBvZiBlYWNoIGNodW5rLiAgKi8KLQotc3RydWN0IG9iamFsbG9jX2NodW5rCi17Ci0gIC8qIE5leHQgY2h1bmsuICAqLwotICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKm5leHQ7Ci0gIC8qIElmIHRoaXMgY2h1bmsgY29udGFpbnMgbGFyZ2Ugb2JqZWN0cywgdGhpcyBpcyB0aGUgdmFsdWUgb2YKLSAgICAgY3VycmVudF9wdHIgd2hlbiB0aGlzIGNodW5rIHdhcyBhbGxvY2F0ZWQuICBJZiB0aGlzIGNodW5rCi0gICAgIGNvbnRhaW5zIHNtYWxsIG9iamVjdHMsIHRoaXMgaXMgTlVMTC4gICovCi0gIGNoYXIgKmN1cnJlbnRfcHRyOwotfTsKLQotLyogVGhlIGFsaWduZWQgc2l6ZSBvZiBvYmphbGxvY19jaHVuay4gICovCi0KLSNkZWZpbmUgQ0hVTktfSEVBREVSX1NJWkUJCQkJCVwKLSAgKChzaXplb2YgKHN0cnVjdCBvYmphbGxvY19jaHVuaykgKyBPQkpBTExPQ19BTElHTiAtIDEpCVwKLSAgICZ+IChPQkpBTExPQ19BTElHTiAtIDEpKQotCi0vKiBXZSBhc2sgZm9yIHRoaXMgbXVjaCBtZW1vcnkgZWFjaCB0aW1lIHdlIGNyZWF0ZSBhIGNodW5rIHdoaWNoIGlzIHRvCi0gICBob2xkIHNtYWxsIG9iamVjdHMuICAqLwotCi0jZGVmaW5lIENIVU5LX1NJWkUgKDQwOTYgLSAzMikKLQotLyogQSByZXF1ZXN0IGZvciB0aGlzIGFtb3VudCBvciBtb3JlIGlzIGp1c3QgcGFzc2VkIHRocm91Z2ggdG8gbWFsbG9jLiAgKi8KLQotI2RlZmluZSBCSUdfUkVRVUVTVCAoNTEyKQotCi0vKiBDcmVhdGUgYW4gb2JqYWxsb2Mgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IG9iamFsbG9jICoKLW9iamFsbG9jX2NyZWF0ZSAoKQotewotICBzdHJ1Y3Qgb2JqYWxsb2MgKnJldDsKLSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpjaHVuazsKLQotICByZXQgPSAoc3RydWN0IG9iamFsbG9jICopIG1hbGxvYyAoc2l6ZW9mICpyZXQpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0LT5jaHVua3MgPSAoUFRSKSBtYWxsb2MgKENIVU5LX1NJWkUpOwotICBpZiAocmV0LT5jaHVua3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGNodW5rID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSByZXQtPmNodW5rczsKLSAgY2h1bmstPm5leHQgPSBOVUxMOwotICBjaHVuay0+Y3VycmVudF9wdHIgPSBOVUxMOwotCi0gIHJldC0+Y3VycmVudF9wdHIgPSAoY2hhciAqKSBjaHVuayArIENIVU5LX0hFQURFUl9TSVpFOwotICByZXQtPmN1cnJlbnRfc3BhY2UgPSBDSFVOS19TSVpFIC0gQ0hVTktfSEVBREVSX1NJWkU7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQWxsb2NhdGUgc3BhY2UgZnJvbSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICAqLwotCi1QVFIKLV9vYmphbGxvY19hbGxvYyAobywgbGVuKQotICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuOwotewotICAvKiBXZSBhdm9pZCBjb25mdXNpb24gZnJvbSB6ZXJvIHNpemVkIG9iamVjdHMgYnkgYWx3YXlzIGFsbG9jYXRpbmcKLSAgICAgYXQgbGVhc3QgMSBieXRlLiAgKi8KLSAgaWYgKGxlbiA9PSAwKQotICAgIGxlbiA9IDE7Ci0KLSAgbGVuID0gKGxlbiArIE9CSkFMTE9DX0FMSUdOIC0gMSkgJn4gKE9CSkFMTE9DX0FMSUdOIC0gMSk7Ci0KLSAgaWYgKGxlbiA8PSBvLT5jdXJyZW50X3NwYWNlKQotICAgIHsKLSAgICAgIG8tPmN1cnJlbnRfcHRyICs9IGxlbjsKLSAgICAgIG8tPmN1cnJlbnRfc3BhY2UgLT0gbGVuOwotICAgICAgcmV0dXJuIChQVFIpIChvLT5jdXJyZW50X3B0ciAtIGxlbik7Ci0gICAgfQotCi0gIGlmIChsZW4gPj0gQklHX1JFUVVFU1QpCi0gICAgewotICAgICAgY2hhciAqcmV0OwotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpjaHVuazsKLQotICAgICAgcmV0ID0gKGNoYXIgKikgbWFsbG9jIChDSFVOS19IRUFERVJfU0laRSArIGxlbik7Ci0gICAgICBpZiAocmV0ID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGNodW5rID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSByZXQ7Ci0gICAgICBjaHVuay0+bmV4dCA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOwotICAgICAgY2h1bmstPmN1cnJlbnRfcHRyID0gby0+Y3VycmVudF9wdHI7Ci0KLSAgICAgIG8tPmNodW5rcyA9IChQVFIpIGNodW5rOwotCi0gICAgICByZXR1cm4gKFBUUikgKHJldCArIENIVU5LX0hFQURFUl9TSVpFKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKmNodW5rOwotCi0gICAgICBjaHVuayA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgbWFsbG9jIChDSFVOS19TSVpFKTsKLSAgICAgIGlmIChjaHVuayA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgICAgY2h1bmstPm5leHQgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKLSAgICAgIGNodW5rLT5jdXJyZW50X3B0ciA9IE5VTEw7Ci0KLSAgICAgIG8tPmN1cnJlbnRfcHRyID0gKGNoYXIgKikgY2h1bmsgKyBDSFVOS19IRUFERVJfU0laRTsKLSAgICAgIG8tPmN1cnJlbnRfc3BhY2UgPSBDSFVOS19TSVpFIC0gQ0hVTktfSEVBREVSX1NJWkU7Ci0KLSAgICAgIG8tPmNodW5rcyA9IChQVFIpIGNodW5rOwotCi0gICAgICByZXR1cm4gb2JqYWxsb2NfYWxsb2MgKG8sIGxlbik7Ci0gICAgfQotfQotCi0vKiBGcmVlIGFuIGVudGlyZSBvYmphbGxvYyBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1vYmphbGxvY19mcmVlIChvKQotICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKm87Ci17Ci0gIHN0cnVjdCBvYmphbGxvY19jaHVuayAqbDsKLQotICBsID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7Ci0gIHdoaWxlIChsICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpuZXh0OwotCi0gICAgICBuZXh0ID0gbC0+bmV4dDsKLSAgICAgIGZyZWUgKGwpOwotICAgICAgbCA9IG5leHQ7Ci0gICAgfQotCi0gIGZyZWUgKG8pOwotfQotCi0vKiBGcmVlIGEgYmxvY2sgZnJvbSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICBUaGlzIGFsc28gZnJlZXMgYWxsIG1vcmUKLSAgIHJlY2VudGx5IGFsbG9jYXRlZCBibG9ja3MuICAqLwotCi12b2lkCi1vYmphbGxvY19mcmVlX2Jsb2NrIChvLCBibG9jaykKLSAgICAgc3RydWN0IG9iamFsbG9jICpvOwotICAgICBQVFIgYmxvY2s7Ci17Ci0gIHN0cnVjdCBvYmphbGxvY19jaHVuayAqcCwgKnNtYWxsOwotICBjaGFyICpiID0gKGNoYXIgKikgYmxvY2s7Ci0KLSAgLyogRmlyc3Qgc2V0IFAgdG8gdGhlIGNodW5rIHdoaWNoIGNvbnRhaW5zIHRoZSBibG9jayB3ZSBhcmUgZnJlZWluZywKLSAgICAgYW5kIHNldCBRIHRvIHRoZSBsYXN0IHNtYWxsIG9iamVjdCBjaHVuayB3ZSBzZWUgYmVmb3JlIFAuICAqLwotICBzbWFsbCA9IE5VTEw7Ci0gIGZvciAocCA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChwLT5jdXJyZW50X3B0ciA9PSBOVUxMKQotCXsKLQkgIGlmIChiID4gKGNoYXIgKikgcCAmJiBiIDwgKGNoYXIgKikgcCArIENIVU5LX1NJWkUpCi0JICAgIGJyZWFrOwotCSAgc21hbGwgPSBwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYiA9PSAoY2hhciAqKSBwICsgQ0hVTktfSEVBREVSX1NJWkUpCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgY2FuJ3QgZmluZCB0aGUgY2h1bmssIHRoZSBjYWxsZXIgaGFzIG1hZGUgYSBtaXN0YWtlLiAgKi8KLSAgaWYgKHAgPT0gTlVMTCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAocC0+Y3VycmVudF9wdHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKnE7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKmZpcnN0OwotCi0gICAgICAvKiBUaGUgYmxvY2sgaXMgaW4gYSBjaHVuayBjb250YWluaW5nIHNtYWxsIG9iamVjdHMuICBXZSBjYW4KLQkgZnJlZSBldmVyeSBjaHVuayB0aHJvdWdoIFNNQUxMLCBiZWNhdXNlIHRoZXkgaGF2ZSBjZXJ0YWlubHkKLQkgYmVlbiBhbGxvY2F0ZWQgbW9yZSByZWNlbnRseS4gIEFmdGVyIFNNQUxMLCB3ZSB3aWxsIG5vdCBzZWUKLQkgYW55IGNodW5rcyBjb250YWluaW5nIHNtYWxsIG9iamVjdHM7IHdlIGNhbiBmcmVlIGFueSBiaWcKLQkgY2h1bmsgaWYgdGhlIGN1cnJlbnRfcHRyIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBCLiAgV2UKLQkgY2FuIHRoZW4gcmVzZXQgdGhlIG5ldyBjdXJyZW50X3B0ciB0byBCLiAgKi8KLQotICAgICAgZmlyc3QgPSBOVUxMOwotICAgICAgcSA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOwotICAgICAgd2hpbGUgKHEgIT0gcCkKLQl7Ci0JICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKm5leHQ7Ci0KLQkgIG5leHQgPSBxLT5uZXh0OwotCSAgaWYgKHNtYWxsICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoc21hbGwgPT0gcSkKLQkJc21hbGwgPSBOVUxMOwotCSAgICAgIGZyZWUgKHEpOwotCSAgICB9Ci0JICBlbHNlIGlmIChxLT5jdXJyZW50X3B0ciA+IGIpCi0JICAgIGZyZWUgKHEpOwotCSAgZWxzZSBpZiAoZmlyc3QgPT0gTlVMTCkKLQkgICAgZmlyc3QgPSBxOwotCi0JICBxID0gbmV4dDsKLQl9Ci0KLSAgICAgIGlmIChmaXJzdCA9PSBOVUxMKQotCWZpcnN0ID0gcDsKLSAgICAgIG8tPmNodW5rcyA9IChQVFIpIGZpcnN0OwotCi0gICAgICAvKiBOb3cgc3RhcnQgYWxsb2NhdGluZyBmcm9tIHRoaXMgc21hbGwgYmxvY2sgYWdhaW4uICAqLwotICAgICAgby0+Y3VycmVudF9wdHIgPSBiOwotICAgICAgby0+Y3VycmVudF9zcGFjZSA9ICgoY2hhciAqKSBwICsgQ0hVTktfU0laRSkgLSBiOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqcTsKLSAgICAgIGNoYXIgKmN1cnJlbnRfcHRyOwotCi0gICAgICAvKiBUaGlzIGJsb2NrIGlzIGluIGEgbGFyZ2UgY2h1bmsgYnkgaXRzZWxmLiAgV2UgY2FuIGZyZWUKLSAgICAgICAgIGV2ZXJ5dGhpbmcgb24gdGhlIGxpc3QgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIGJsb2NrLiAgV2UKLSAgICAgICAgIHRoZW4gc3RhcnQgYWxsb2NhdGluZyBmcm9tIHRoZSBuZXh0IGNodW5rIGNvbnRhaW5pbmcgc21hbGwKLSAgICAgICAgIG9iamVjdHMsIHNldHRpbmcgY3VycmVudF9wdHIgZnJvbSB0aGUgdmFsdWUgc3RvcmVkIHdpdGggdGhlCi0gICAgICAgICBsYXJnZSBjaHVuayB3ZSBhcmUgZnJlZWluZy4gICovCi0KLSAgICAgIGN1cnJlbnRfcHRyID0gcC0+Y3VycmVudF9wdHI7Ci0gICAgICBwID0gcC0+bmV4dDsKLQotICAgICAgcSA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOwotICAgICAgd2hpbGUgKHEgIT0gcCkKLQl7Ci0JICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKm5leHQ7Ci0KLQkgIG5leHQgPSBxLT5uZXh0OwotCSAgZnJlZSAocSk7Ci0JICBxID0gbmV4dDsKLQl9Ci0KLSAgICAgIG8tPmNodW5rcyA9IChQVFIpIHA7Ci0KLSAgICAgIHdoaWxlIChwLT5jdXJyZW50X3B0ciAhPSBOVUxMKQotCXAgPSBwLT5uZXh0OwotCi0gICAgICBvLT5jdXJyZW50X3B0ciA9IGN1cnJlbnRfcHRyOwotICAgICAgby0+Y3VycmVudF9zcGFjZSA9ICgoY2hhciAqKSBwICsgQ0hVTktfU0laRSkgLSBjdXJyZW50X3B0cjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvb2JzdGFjay5jIGIvbGliaWJlcnR5L29ic3RhY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzMThiMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvb2JzdGFjay5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8qIG9ic3RhY2suYyAtIHN1YnJvdXRpbmVzIHVzZWQgaW1wbGljaXRseSBieSBvYmplY3Qgc3RhY2sgbWFjcm9zCi0gICBDb3B5cmlnaHQgKEMpIDE5ODgsODksOTAsOTEsOTIsOTMsOTQsOTYsOTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLQotICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KLSAgIEJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BnbnUub3JnLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gICBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotICAgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiBOT1RFIEJFRk9SRSBNT0RJRllJTkcgVEhJUyBGSUxFOiBUaGlzIHZlcnNpb24gbnVtYmVyIG11c3QgYmUKLSAgIGluY3JlbWVudGVkIHdoZW5ldmVyIGNhbGxlcnMgY29tcGlsZWQgdXNpbmcgYW4gb2xkIG9ic3RhY2suaCBjYW4gbm8KLSAgIGxvbmdlciBwcm9wZXJseSBjYWxsIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBvYnN0YWNrLmMuICAqLwotI2RlZmluZSBPQlNUQUNLX0lOVEVSRkFDRV9WRVJTSU9OIDEKLQotLyogQ29tbWVudCBvdXQgYWxsIHRoaXMgY29kZSBpZiB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIExpYnJhcnksIGFuZCBhcmUgbm90Ci0gICBhY3R1YWxseSBjb21waWxpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLCBhbmQgdGhlIGluc3RhbGxlZCBsaWJyYXJ5Ci0gICBzdXBwb3J0cyB0aGUgc2FtZSBsaWJyYXJ5IGludGVyZmFjZSB3ZSBkby4gIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBHTlUKLSAgIEMgTGlicmFyeSwgYnV0IGFsc28gaW5jbHVkZWQgaW4gbWFueSBvdGhlciBHTlUgZGlzdHJpYnV0aW9ucy4gIENvbXBpbGluZwotICAgYW5kIGxpbmtpbmcgaW4gdGhpcyBjb2RlIGlzIGEgd2FzdGUgd2hlbiB1c2luZyB0aGUgR05VIEMgbGlicmFyeQotICAgKGVzcGVjaWFsbHkgaWYgaXQgaXMgYSBzaGFyZWQgbGlicmFyeSkuICBSYXRoZXIgdGhhbiBoYXZpbmcgZXZlcnkgR05VCi0gICBwcm9ncmFtIHVuZGVyc3RhbmQgYGNvbmZpZ3VyZSAtLXdpdGgtZ251LWxpYmMnIGFuZCBvbWl0IHRoZSBvYmplY3QKLSAgIGZpbGVzLCBpdCBpcyBzaW1wbGVyIHRvIGp1c3QgZG8gdGhpcyBpbiB0aGUgc291cmNlIGZvciBlYWNoIHN1Y2ggZmlsZS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgkJLyogUmFuZG9tIHRoaW5nIHRvIGdldCBfX0dOVV9MSUJSQVJZX18uICAqLwotI2lmICFkZWZpbmVkIChfTElCQykgJiYgZGVmaW5lZCAoX19HTlVfTElCUkFSWV9fKSAmJiBfX0dOVV9MSUJSQVJZX18gPiAxCi0jaW5jbHVkZSA8Z251LXZlcnNpb25zLmg+Ci0jaWYgX0dOVV9PQlNUQUNLX0lOVEVSRkFDRV9WRVJTSU9OID09IE9CU1RBQ0tfSU5URVJGQUNFX1ZFUlNJT04KLSNkZWZpbmUgRUxJREVfQ09ERQotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWZuZGVmIEVMSURFX0NPREUKLQotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jZGVmaW5lIFBPSU5URVIgdm9pZCAqCi0jZWxzZQotI2RlZmluZSBQT0lOVEVSIGNoYXIgKgotI2VuZGlmCi0KLS8qIERldGVybWluZSBkZWZhdWx0IGFsaWdubWVudC4gICovCi1zdHJ1Y3QgZm9vYWxpZ24ge2NoYXIgeDsgZG91YmxlIGQ7fTsKLSNkZWZpbmUgREVGQVVMVF9BTElHTk1FTlQgIFwKLSAgKChQVFJfSU5UX1RZUEUpICgoY2hhciAqKSAmKChzdHJ1Y3QgZm9vYWxpZ24gKikgMCktPmQgLSAoY2hhciAqKSAwKSkKLS8qIElmIG1hbGxvYyB3ZXJlIHJlYWxseSBzbWFydCwgaXQgd291bGQgcm91bmQgYWRkcmVzc2VzIHRvIERFRkFVTFRfQUxJR05NRU5ULgotICAgQnV0IGluIGZhY3QgaXQgbWlnaHQgYmUgbGVzcyBzbWFydCBhbmQgcm91bmQgYWRkcmVzc2VzIHRvIGFzIG11Y2ggYXMKLSAgIERFRkFVTFRfUk9VTkRJTkcuICBTbyB3ZSBwcmVwYXJlIGZvciBpdCB0byBkbyB0aGF0LiAgKi8KLXVuaW9uIGZvb3JvdW5kIHtsb25nIHg7IGRvdWJsZSBkO307Ci0jZGVmaW5lIERFRkFVTFRfUk9VTkRJTkcgKHNpemVvZiAodW5pb24gZm9vcm91bmQpKQotCi0vKiBXaGVuIHdlIGNvcHkgYSBsb25nIGJsb2NrIG9mIGRhdGEsIHRoaXMgaXMgdGhlIHVuaXQgdG8gZG8gaXQgd2l0aC4KLSAgIE9uIHNvbWUgbWFjaGluZXMsIGNvcHlpbmcgc3VjY2Vzc2l2ZSBpbnRzIGRvZXMgbm90IHdvcms7Ci0gICBpbiBzdWNoIGEgY2FzZSwgcmVkZWZpbmUgQ09QWUlOR19VTklUIHRvIGBsb25nJyAoaWYgdGhhdCB3b3JrcykKLSAgIG9yIGBjaGFyJyBhcyBhIGxhc3QgcmVzb3J0LiAgKi8KLSNpZm5kZWYgQ09QWUlOR19VTklUCi0jZGVmaW5lIENPUFlJTkdfVU5JVCBpbnQKLSNlbmRpZgotCi0KLS8qIFRoZSBmdW5jdGlvbnMgYWxsb2NhdGluZyBtb3JlIHJvb20gYnkgY2FsbGluZyBgb2JzdGFja19jaHVua19hbGxvYycKLSAgIGp1bXAgdG8gdGhlIGhhbmRsZXIgcG9pbnRlZCB0byBieSBgb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcicuCi0gICBUaGlzIHZhcmlhYmxlIGJ5IGRlZmF1bHQgcG9pbnRzIHRvIHRoZSBpbnRlcm5hbCBmdW5jdGlvbgotICAgYHByaW50X2FuZF9hYm9ydCcuICAqLwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotc3RhdGljIHZvaWQgcHJpbnRfYW5kX2Fib3J0ICh2b2lkKTsKLXZvaWQgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAodm9pZCkgPSBwcmludF9hbmRfYWJvcnQ7Ci0jZWxzZQotc3RhdGljIHZvaWQgcHJpbnRfYW5kX2Fib3J0ICgpOwotdm9pZCAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpID0gcHJpbnRfYW5kX2Fib3J0OwotI2VuZGlmCi0KLS8qIEV4aXQgdmFsdWUgdXNlZCB3aGVuIGBwcmludF9hbmRfYWJvcnQnIGlzIHVzZWQuICAqLwotI2lmIGRlZmluZWQgX19HTlVfTElCUkFSWV9fIHx8IGRlZmluZWQgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZuZGVmIEVYSVRfRkFJTFVSRQotI2RlZmluZSBFWElUX0ZBSUxVUkUgMQotI2VuZGlmCi1pbnQgb2JzdGFja19leGl0X2ZhaWx1cmUgPSBFWElUX0ZBSUxVUkU7Ci0KLS8qIFRoZSBub24tR05VLUMgbWFjcm9zIGNvcHkgdGhlIG9ic3RhY2sgaW50byB0aGlzIGdsb2JhbCB2YXJpYWJsZQotICAgdG8gYXZvaWQgbXVsdGlwbGUgZXZhbHVhdGlvbi4gICovCi0KLXN0cnVjdCBvYnN0YWNrICpfb2JzdGFjazsKLQotLyogRGVmaW5lIGEgbWFjcm8gdGhhdCBlaXRoZXIgY2FsbHMgZnVuY3Rpb25zIHdpdGggdGhlIHRyYWRpdGlvbmFsIG1hbGxvYy9mcmVlCi0gICBjYWxsaW5nIGludGVyZmFjZSwgb3IgY2FsbHMgZnVuY3Rpb25zIHdpdGggdGhlIG1tYWxsb2MvbWZyZWUgaW50ZXJmYWNlCi0gICAodGhhdCBhZGRzIGFuIGV4dHJhIGZpcnN0IGFyZ3VtZW50KSwgYmFzZWQgb24gdGhlIHN0YXRlIG9mIHVzZV9leHRyYV9hcmcuCi0gICBGb3IgZnJlZSwgZG8gbm90IHVzZSA/Oiwgc2luY2Ugc29tZSBjb21waWxlcnMsIGxpa2UgdGhlIE1JUFMgY29tcGlsZXJzLAotICAgZG8gbm90IGFsbG93IChleHByKSA/IHZvaWQgOiB2b2lkLiAgKi8KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotI2RlZmluZSBDQUxMX0NIVU5LRlVOKGgsIHNpemUpIFwKLSAgKCgoaCkgLT4gdXNlX2V4dHJhX2FyZykgXAotICAgPyAoKihoKS0+Y2h1bmtmdW4pICgoaCktPmV4dHJhX2FyZywgKHNpemUpKSBcCi0gICA6ICgqKHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCopIChsb25nKSkgKGgpLT5jaHVua2Z1bikgKChzaXplKSkpCi0KLSNkZWZpbmUgQ0FMTF9GUkVFRlVOKGgsIG9sZF9jaHVuaykgXAotICBkbyB7IFwKLSAgICBpZiAoKGgpIC0+IHVzZV9leHRyYV9hcmcpIFwKLSAgICAgICgqKGgpLT5mcmVlZnVuKSAoKGgpLT5leHRyYV9hcmcsIChvbGRfY2h1bmspKTsgXAotICAgIGVsc2UgXAotICAgICAgKCoodm9pZCAoKikgKHZvaWQgKikpIChoKS0+ZnJlZWZ1bikgKChvbGRfY2h1bmspKTsgXAotICB9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgQ0FMTF9DSFVOS0ZVTihoLCBzaXplKSBcCi0gICgoKGgpIC0+IHVzZV9leHRyYV9hcmcpIFwKLSAgID8gKCooaCktPmNodW5rZnVuKSAoKGgpLT5leHRyYV9hcmcsIChzaXplKSkgXAotICAgOiAoKihzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqKSAoKSkgKGgpLT5jaHVua2Z1bikgKChzaXplKSkpCi0KLSNkZWZpbmUgQ0FMTF9GUkVFRlVOKGgsIG9sZF9jaHVuaykgXAotICBkbyB7IFwKLSAgICBpZiAoKGgpIC0+IHVzZV9leHRyYV9hcmcpIFwKLSAgICAgICgqKGgpLT5mcmVlZnVuKSAoKGgpLT5leHRyYV9hcmcsIChvbGRfY2h1bmspKTsgXAotICAgIGVsc2UgXAotICAgICAgKCoodm9pZCAoKikgKCkpIChoKS0+ZnJlZWZ1bikgKChvbGRfY2h1bmspKTsgXAotICB9IHdoaWxlICgwKQotI2VuZGlmCi0KLQwKLS8qIEluaXRpYWxpemUgYW4gb2JzdGFjayBIIGZvciB1c2UuICBTcGVjaWZ5IGNodW5rIHNpemUgU0laRSAoMCBtZWFucyBkZWZhdWx0KS4KLSAgIE9iamVjdHMgc3RhcnQgb24gbXVsdGlwbGVzIG9mIEFMSUdOTUVOVCAoMCBtZWFucyB1c2UgZGVmYXVsdCkuCi0gICBDSFVOS0ZVTiBpcyB0aGUgZnVuY3Rpb24gdG8gdXNlIHRvIGFsbG9jYXRlIGNodW5rcywKLSAgIGFuZCBGUkVFRlVOIHRoZSBmdW5jdGlvbiB0byBmcmVlIHRoZW0uCi0KLSAgIFJldHVybiBub256ZXJvIGlmIHN1Y2Nlc3NmdWwsIHplcm8gaWYgb3V0IG9mIG1lbW9yeS4KLSAgIFRvIHJlY292ZXIgZnJvbSBhbiBvdXQgb2YgbWVtb3J5IGVycm9yLAotICAgZnJlZSB1cCBzb21lIG1lbW9yeSwgdGhlbiBjYWxsIHRoaXMgYWdhaW4uICAqLwotCi1pbnQKLV9vYnN0YWNrX2JlZ2luIChoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0gICAgIFBPSU5URVIgKCpjaHVua2Z1bikgKGxvbmcpOwotICAgICB2b2lkICgqZnJlZWZ1bikgKHZvaWQgKik7Ci0jZWxzZQotICAgICBQT0lOVEVSICgqY2h1bmtmdW4pICgpOwotICAgICB2b2lkICgqZnJlZWZ1bikgKCk7Ci0jZW5kaWYKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpjaHVuazsgLyogcG9pbnRzIHRvIG5ldyBjaHVuayAqLwotCi0gIGlmIChhbGlnbm1lbnQgPT0gMCkKLSAgICBhbGlnbm1lbnQgPSAoaW50KSBERUZBVUxUX0FMSUdOTUVOVDsKLSAgaWYgKHNpemUgPT0gMCkKLSAgICAvKiBEZWZhdWx0IHNpemUgaXMgd2hhdCBHTlUgbWFsbG9jIGNhbiBmaXQgaW4gYSA0MDk2LWJ5dGUgYmxvY2suICAqLwotICAgIHsKLSAgICAgIC8qIDEyIGlzIHNpemVvZiAobWhlYWQpIGFuZCA0IGlzIEVYVFJBIGZyb20gR05VIG1hbGxvYy4KLQkgVXNlIHRoZSB2YWx1ZXMgZm9yIHJhbmdlIGNoZWNraW5nLCBiZWNhdXNlIGlmIHJhbmdlIGNoZWNraW5nIGlzIG9mZiwKLQkgdGhlIGV4dHJhIGJ5dGVzIHdvbid0IGJlIG1pc3NlZCB0ZXJyaWJseSwgYnV0IGlmIHJhbmdlIGNoZWNraW5nIGlzIG9uCi0JIGFuZCB3ZSB1c2VkIGEgbGFyZ2VyIHJlcXVlc3QsIGEgd2hvbGUgZXh0cmEgNDA5NiBieXRlcyB3b3VsZCBiZQotCSBhbGxvY2F0ZWQuCi0KLQkgVGhlc2UgbnVtYmVyIGFyZSBpcnJlbGV2YW50IHRvIHRoZSBuZXcgR05VIG1hbGxvYy4gIEkgc3VzcGVjdCBpdCBpcwotCSBsZXNzIHNlbnNpdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdC4gICovCi0gICAgICBpbnQgZXh0cmEgPSAoKCgoMTIgKyBERUZBVUxUX1JPVU5ESU5HIC0gMSkgJiB+KERFRkFVTFRfUk9VTkRJTkcgLSAxKSkKLQkJICAgICsgNCArIERFRkFVTFRfUk9VTkRJTkcgLSAxKQotCQkgICAmIH4oREVGQVVMVF9ST1VORElORyAtIDEpKTsKLSAgICAgIHNpemUgPSA0MDk2IC0gZXh0cmE7Ci0gICAgfQotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0gIGgtPmNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqICgqKSh2b2lkICosIGxvbmcpKSBjaHVua2Z1bjsKLSAgaC0+ZnJlZWZ1biA9ICh2b2lkICgqKSAodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKikpIGZyZWVmdW47Ci0jZWxzZQotICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikoKSkgY2h1bmtmdW47Ci0gIGgtPmZyZWVmdW4gPSBmcmVlZnVuOwotI2VuZGlmCi0gIGgtPmNodW5rX3NpemUgPSBzaXplOwotICBoLT5hbGlnbm1lbnRfbWFzayA9IGFsaWdubWVudCAtIDE7Ci0gIGgtPnVzZV9leHRyYV9hcmcgPSAwOwotCi0gIGNodW5rID0gaC0+Y2h1bmsgPSBDQUxMX0NIVU5LRlVOIChoLCBoIC0+IGNodW5rX3NpemUpOwotICBpZiAoIWNodW5rKQotICAgICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKCk7Ci0gIGgtPm5leHRfZnJlZSA9IGgtPm9iamVjdF9iYXNlID0gY2h1bmstPmNvbnRlbnRzOwotICBoLT5jaHVua19saW1pdCA9IGNodW5rLT5saW1pdAotICAgID0gKGNoYXIgKikgY2h1bmsgKyBoLT5jaHVua19zaXplOwotICBjaHVuay0+cHJldiA9IDA7Ci0gIC8qIFRoZSBpbml0aWFsIGNodW5rIG5vdyBjb250YWlucyBubyBlbXB0eSBvYmplY3QuICAqLwotICBoLT5tYXliZV9lbXB0eV9vYmplY3QgPSAwOwotICBoLT5hbGxvY19mYWlsZWQgPSAwOwotICByZXR1cm4gMTsKLX0KLQotaW50Ci1fb2JzdGFja19iZWdpbl8xIChoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuLCBhcmcpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IGFsaWdubWVudDsKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSAgICAgUE9JTlRFUiAoKmNodW5rZnVuKSAoUE9JTlRFUiwgbG9uZyk7Ci0gICAgIHZvaWQgKCpmcmVlZnVuKSAoUE9JTlRFUiwgUE9JTlRFUik7Ci0jZWxzZQotICAgICBQT0lOVEVSICgqY2h1bmtmdW4pICgpOwotICAgICB2b2lkICgqZnJlZWZ1bikgKCk7Ci0jZW5kaWYKLSAgICAgUE9JTlRFUiBhcmc7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqY2h1bms7IC8qIHBvaW50cyB0byBuZXcgY2h1bmsgKi8KLQotICBpZiAoYWxpZ25tZW50ID09IDApCi0gICAgYWxpZ25tZW50ID0gKGludCkgREVGQVVMVF9BTElHTk1FTlQ7Ci0gIGlmIChzaXplID09IDApCi0gICAgLyogRGVmYXVsdCBzaXplIGlzIHdoYXQgR05VIG1hbGxvYyBjYW4gZml0IGluIGEgNDA5Ni1ieXRlIGJsb2NrLiAgKi8KLSAgICB7Ci0gICAgICAvKiAxMiBpcyBzaXplb2YgKG1oZWFkKSBhbmQgNCBpcyBFWFRSQSBmcm9tIEdOVSBtYWxsb2MuCi0JIFVzZSB0aGUgdmFsdWVzIGZvciByYW5nZSBjaGVja2luZywgYmVjYXVzZSBpZiByYW5nZSBjaGVja2luZyBpcyBvZmYsCi0JIHRoZSBleHRyYSBieXRlcyB3b24ndCBiZSBtaXNzZWQgdGVycmlibHksIGJ1dCBpZiByYW5nZSBjaGVja2luZyBpcyBvbgotCSBhbmQgd2UgdXNlZCBhIGxhcmdlciByZXF1ZXN0LCBhIHdob2xlIGV4dHJhIDQwOTYgYnl0ZXMgd291bGQgYmUKLQkgYWxsb2NhdGVkLgotCi0JIFRoZXNlIG51bWJlciBhcmUgaXJyZWxldmFudCB0byB0aGUgbmV3IEdOVSBtYWxsb2MuICBJIHN1c3BlY3QgaXQgaXMKLQkgbGVzcyBzZW5zaXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QuICAqLwotICAgICAgaW50IGV4dHJhID0gKCgoKDEyICsgREVGQVVMVF9ST1VORElORyAtIDEpICYgfihERUZBVUxUX1JPVU5ESU5HIC0gMSkpCi0JCSAgICArIDQgKyBERUZBVUxUX1JPVU5ESU5HIC0gMSkKLQkJICAgJiB+KERFRkFVTFRfUk9VTkRJTkcgLSAxKSk7Ci0gICAgICBzaXplID0gNDA5NiAtIGV4dHJhOwotICAgIH0KLQotI2lmIGRlZmluZWQoX19TVERDX18pICYmIF9fU1REQ19fCi0gIGgtPmNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqICgqKSh2b2lkICosbG9uZykpIGNodW5rZnVuOwotICBoLT5mcmVlZnVuID0gKHZvaWQgKCopICh2b2lkICosIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKSkgZnJlZWZ1bjsKLSNlbHNlCi0gIGgtPmNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqICgqKSgpKSBjaHVua2Z1bjsKLSAgaC0+ZnJlZWZ1biA9IGZyZWVmdW47Ci0jZW5kaWYKLSAgaC0+Y2h1bmtfc2l6ZSA9IHNpemU7Ci0gIGgtPmFsaWdubWVudF9tYXNrID0gYWxpZ25tZW50IC0gMTsKLSAgaC0+ZXh0cmFfYXJnID0gYXJnOwotICBoLT51c2VfZXh0cmFfYXJnID0gMTsKLQotICBjaHVuayA9IGgtPmNodW5rID0gQ0FMTF9DSFVOS0ZVTiAoaCwgaCAtPiBjaHVua19zaXplKTsKLSAgaWYgKCFjaHVuaykKLSAgICAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOwotICBoLT5uZXh0X2ZyZWUgPSBoLT5vYmplY3RfYmFzZSA9IGNodW5rLT5jb250ZW50czsKLSAgaC0+Y2h1bmtfbGltaXQgPSBjaHVuay0+bGltaXQKLSAgICA9IChjaGFyICopIGNodW5rICsgaC0+Y2h1bmtfc2l6ZTsKLSAgY2h1bmstPnByZXYgPSAwOwotICAvKiBUaGUgaW5pdGlhbCBjaHVuayBub3cgY29udGFpbnMgbm8gZW1wdHkgb2JqZWN0LiAgKi8KLSAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMDsKLSAgaC0+YWxsb2NfZmFpbGVkID0gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIEFsbG9jYXRlIGEgbmV3IGN1cnJlbnQgY2h1bmsgZm9yIHRoZSBvYnN0YWNrICpICi0gICBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IExFTkdUSCBieXRlcyBuZWVkIHRvIGJlIGFkZGVkCi0gICB0byB0aGUgY3VycmVudCBvYmplY3QsIG9yIGEgbmV3IG9iamVjdCBvZiBsZW5ndGggTEVOR1RIIGFsbG9jYXRlZC4KLSAgIENvcGllcyBhbnkgcGFydGlhbCBvYmplY3QgZnJvbSB0aGUgZW5kIG9mIHRoZSBvbGQgY2h1bmsKLSAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5ldyBvbmUuICAqLwotCi12b2lkCi1fb2JzdGFja19uZXdjaHVuayAoaCwgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpvbGRfY2h1bmsgPSBoLT5jaHVuazsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpuZXdfY2h1bms7Ci0gIHJlZ2lzdGVyIGxvbmcJbmV3X3NpemU7Ci0gIHJlZ2lzdGVyIGxvbmcgb2JqX3NpemUgPSBoLT5uZXh0X2ZyZWUgLSBoLT5vYmplY3RfYmFzZTsKLSAgcmVnaXN0ZXIgbG9uZyBpOwotICBsb25nIGFscmVhZHk7Ci0KLSAgLyogQ29tcHV0ZSBzaXplIGZvciBuZXcgY2h1bmsuICAqLwotICBuZXdfc2l6ZSA9IChvYmpfc2l6ZSArIGxlbmd0aCkgKyAob2JqX3NpemUgPj4gMykgKyAxMDA7Ci0gIGlmIChuZXdfc2l6ZSA8IGgtPmNodW5rX3NpemUpCi0gICAgbmV3X3NpemUgPSBoLT5jaHVua19zaXplOwotCi0gIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBuZXcgY2h1bmsuICAqLwotICBuZXdfY2h1bmsgPSBDQUxMX0NIVU5LRlVOIChoLCBuZXdfc2l6ZSk7Ci0gIGlmICghbmV3X2NodW5rKQotICAgICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKCk7Ci0gIGgtPmNodW5rID0gbmV3X2NodW5rOwotICBuZXdfY2h1bmstPnByZXYgPSBvbGRfY2h1bms7Ci0gIG5ld19jaHVuay0+bGltaXQgPSBoLT5jaHVua19saW1pdCA9IChjaGFyICopIG5ld19jaHVuayArIG5ld19zaXplOwotCi0gIC8qIE1vdmUgdGhlIGV4aXN0aW5nIG9iamVjdCB0byB0aGUgbmV3IGNodW5rLgotICAgICBXb3JkIGF0IGEgdGltZSBpcyBmYXN0IGFuZCBpcyBzYWZlIGlmIHRoZSBvYmplY3QKLSAgICAgaXMgc3VmZmljaWVudGx5IGFsaWduZWQuICAqLwotICBpZiAoaC0+YWxpZ25tZW50X21hc2sgKyAxID49IERFRkFVTFRfQUxJR05NRU5UKQotICAgIHsKLSAgICAgIGZvciAoaSA9IG9ial9zaXplIC8gc2l6ZW9mIChDT1BZSU5HX1VOSVQpIC0gMTsKLQkgICBpID49IDA7IGktLSkKLQkoKENPUFlJTkdfVU5JVCAqKW5ld19jaHVuay0+Y29udGVudHMpW2ldCi0JICA9ICgoQ09QWUlOR19VTklUICopaC0+b2JqZWN0X2Jhc2UpW2ldOwotICAgICAgLyogV2UgdXNlZCB0byBjb3B5IHRoZSBvZGQgZmV3IHJlbWFpbmluZyBieXRlcyBhcyBvbmUgZXh0cmEgQ09QWUlOR19VTklULAotCSBidXQgdGhhdCBjYW4gY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5IG9uIGEgbWFjaGluZQotCSB3aGljaCBkb2VzIG5vdCBkbyBzdHJpY3QgYWxpZ25tZW50IGZvciBDT1BZSU5HX1VOSVRTLiAgKi8KLSAgICAgIGFscmVhZHkgPSBvYmpfc2l6ZSAvIHNpemVvZiAoQ09QWUlOR19VTklUKSAqIHNpemVvZiAoQ09QWUlOR19VTklUKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhbHJlYWR5ID0gMDsKLSAgLyogQ29weSByZW1haW5pbmcgYnl0ZXMgb25lIGJ5IG9uZS4gICovCi0gIGZvciAoaSA9IGFscmVhZHk7IGkgPCBvYmpfc2l6ZTsgaSsrKQotICAgIG5ld19jaHVuay0+Y29udGVudHNbaV0gPSBoLT5vYmplY3RfYmFzZVtpXTsKLQotICAvKiBJZiB0aGUgb2JqZWN0IGp1c3QgY29waWVkIHdhcyB0aGUgb25seSBkYXRhIGluIE9MRF9DSFVOSywKLSAgICAgZnJlZSB0aGF0IGNodW5rIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgY2hhaW4uCi0gICAgIEJ1dCBub3QgaWYgdGhhdCBjaHVuayBtaWdodCBjb250YWluIGFuIGVtcHR5IG9iamVjdC4gICovCi0gIGlmIChoLT5vYmplY3RfYmFzZSA9PSBvbGRfY2h1bmstPmNvbnRlbnRzICYmICEgaC0+bWF5YmVfZW1wdHlfb2JqZWN0KQotICAgIHsKLSAgICAgIG5ld19jaHVuay0+cHJldiA9IG9sZF9jaHVuay0+cHJldjsKLSAgICAgIENBTExfRlJFRUZVTiAoaCwgb2xkX2NodW5rKTsKLSAgICB9Ci0KLSAgaC0+b2JqZWN0X2Jhc2UgPSBuZXdfY2h1bmstPmNvbnRlbnRzOwotICBoLT5uZXh0X2ZyZWUgPSBoLT5vYmplY3RfYmFzZSArIG9ial9zaXplOwotICAvKiBUaGUgbmV3IGNodW5rIGNlcnRhaW5seSBjb250YWlucyBubyBlbXB0eSBvYmplY3QgeWV0LiAgKi8KLSAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMDsKLX0KLQotLyogUmV0dXJuIG5vbnplcm8gaWYgb2JqZWN0IE9CSiBoYXMgYmVlbiBhbGxvY2F0ZWQgZnJvbSBvYnN0YWNrIEguCi0gICBUaGlzIGlzIGhlcmUgZm9yIGRlYnVnZ2luZy4KLSAgIElmIHlvdSB1c2UgaXQgaW4gYSBwcm9ncmFtLCB5b3UgYXJlIHByb2JhYmx5IGxvc2luZy4gICovCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLS8qIFN1cHByZXNzIC1XbWlzc2luZy1wcm90b3R5cGVzIHdhcm5pbmcuICBXZSBkb24ndCB3YW50IHRvIGRlY2xhcmUgdGhpcyBpbgotICAgb2JzdGFjay5oIGJlY2F1c2UgaXQgaXMganVzdCBmb3IgZGVidWdnaW5nLiAgKi8KLWludCBfb2JzdGFja19hbGxvY2F0ZWRfcCAoc3RydWN0IG9ic3RhY2sgKmgsIFBPSU5URVIgb2JqKTsKLSNlbmRpZgotCi1pbnQKLV9vYnN0YWNrX2FsbG9jYXRlZF9wIChoLCBvYmopCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotICAgICBQT0lOVEVSIG9iajsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpscDsJLyogYmVsb3cgYWRkciBvZiBhbnkgb2JqZWN0cyBpbiB0aGlzIGNodW5rICovCi0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqcGxwOwkvKiBwb2ludCB0byBwcmV2aW91cyBjaHVuayBpZiBhbnkgKi8KLQotICBscCA9IChoKS0+Y2h1bms7Ci0gIC8qIFdlIHVzZSA+PSByYXRoZXIgdGhhbiA+IHNpbmNlIHRoZSBvYmplY3QgY2Fubm90IGJlIGV4YWN0bHkgYXQKLSAgICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2h1bmsgYnV0IG1pZ2h0IGJlIGFuIGVtcHR5IG9iamVjdCBleGFjdGx5Ci0gICAgIGF0IHRoZSBlbmQgb2YgYW4gYWRqYWNlbnQgY2h1bmsuICAqLwotICB3aGlsZSAobHAgIT0gMCAmJiAoKFBPSU5URVIpIGxwID49IG9iaiB8fCAoUE9JTlRFUikgKGxwKS0+bGltaXQgPCBvYmopKQotICAgIHsKLSAgICAgIHBscCA9IGxwLT5wcmV2OwotICAgICAgbHAgPSBwbHA7Ci0gICAgfQotICByZXR1cm4gbHAgIT0gMDsKLX0KLQwKLS8qIEZyZWUgb2JqZWN0cyBpbiBvYnN0YWNrIEgsIGluY2x1ZGluZyBPQkogYW5kIGV2ZXJ5dGhpbmcgYWxsb2NhdGUKLSAgIG1vcmUgcmVjZW50bHkgdGhhbiBPQkouICBJZiBPQkogaXMgemVybywgZnJlZSBldmVyeXRoaW5nIGluIEguICAqLwotCi0jdW5kZWYgb2JzdGFja19mcmVlCi0KLS8qIFRoaXMgZnVuY3Rpb24gaGFzIHR3byBuYW1lcyB3aXRoIGlkZW50aWNhbCBkZWZpbml0aW9ucy4KLSAgIFRoaXMgaXMgdGhlIGZpcnN0IG9uZSwgY2FsbGVkIGZyb20gbm9uLUFOU0kgY29kZS4gICovCi0KLXZvaWQKLV9vYnN0YWNrX2ZyZWUgKGgsIG9iaikKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIFBPSU5URVIgb2JqOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmxwOwkvKiBiZWxvdyBhZGRyIG9mIGFueSBvYmplY3RzIGluIHRoaXMgY2h1bmsgKi8KLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpwbHA7CS8qIHBvaW50IHRvIHByZXZpb3VzIGNodW5rIGlmIGFueSAqLwotCi0gIGxwID0gaC0+Y2h1bms7Ci0gIC8qIFdlIHVzZSA+PSBiZWNhdXNlIHRoZXJlIGNhbm5vdCBiZSBhbiBvYmplY3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNodW5rLgotICAgICBCdXQgdGhlcmUgY2FuIGJlIGFuIGVtcHR5IG9iamVjdCBhdCB0aGF0IGFkZHJlc3MKLSAgICAgYXQgdGhlIGVuZCBvZiBhbm90aGVyIGNodW5rLiAgKi8KLSAgd2hpbGUgKGxwICE9IDAgJiYgKChQT0lOVEVSKSBscCA+PSBvYmogfHwgKFBPSU5URVIpIChscCktPmxpbWl0IDwgb2JqKSkKLSAgICB7Ci0gICAgICBwbHAgPSBscC0+cHJldjsKLSAgICAgIENBTExfRlJFRUZVTiAoaCwgbHApOwotICAgICAgbHAgPSBwbHA7Ci0gICAgICAvKiBJZiB3ZSBzd2l0Y2ggY2h1bmtzLCB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgdGhlIG5ldyBjdXJyZW50Ci0JIGNodW5rIGNvbnRhaW5zIGFuIGVtcHR5IG9iamVjdCwgc28gYXNzdW1lIHRoYXQgaXQgbWF5LiAgKi8KLSAgICAgIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDE7Ci0gICAgfQotICBpZiAobHApCi0gICAgewotICAgICAgaC0+b2JqZWN0X2Jhc2UgPSBoLT5uZXh0X2ZyZWUgPSAoY2hhciAqKSAob2JqKTsKLSAgICAgIGgtPmNodW5rX2xpbWl0ID0gbHAtPmxpbWl0OwotICAgICAgaC0+Y2h1bmsgPSBscDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9iaiAhPSAwKQotICAgIC8qIG9iaiBpcyBub3QgaW4gYW55IG9mIHRoZSBjaHVua3MhICovCi0gICAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmcm9tIEFOU0kgY29kZS4gICovCi0KLXZvaWQKLW9ic3RhY2tfZnJlZSAoaCwgb2JqKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgUE9JTlRFUiBvYmo7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqbHA7CS8qIGJlbG93IGFkZHIgb2YgYW55IG9iamVjdHMgaW4gdGhpcyBjaHVuayAqLwotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKnBscDsJLyogcG9pbnQgdG8gcHJldmlvdXMgY2h1bmsgaWYgYW55ICovCi0KLSAgbHAgPSBoLT5jaHVuazsKLSAgLyogV2UgdXNlID49IGJlY2F1c2UgdGhlcmUgY2Fubm90IGJlIGFuIG9iamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgY2h1bmsuCi0gICAgIEJ1dCB0aGVyZSBjYW4gYmUgYW4gZW1wdHkgb2JqZWN0IGF0IHRoYXQgYWRkcmVzcwotICAgICBhdCB0aGUgZW5kIG9mIGFub3RoZXIgY2h1bmsuICAqLwotICB3aGlsZSAobHAgIT0gMCAmJiAoKFBPSU5URVIpIGxwID49IG9iaiB8fCAoUE9JTlRFUikgKGxwKS0+bGltaXQgPCBvYmopKQotICAgIHsKLSAgICAgIHBscCA9IGxwLT5wcmV2OwotICAgICAgQ0FMTF9GUkVFRlVOIChoLCBscCk7Ci0gICAgICBscCA9IHBscDsKLSAgICAgIC8qIElmIHdlIHN3aXRjaCBjaHVua3MsIHdlIGNhbid0IHRlbGwgd2hldGhlciB0aGUgbmV3IGN1cnJlbnQKLQkgY2h1bmsgY29udGFpbnMgYW4gZW1wdHkgb2JqZWN0LCBzbyBhc3N1bWUgdGhhdCBpdCBtYXkuICAqLwotICAgICAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMTsKLSAgICB9Ci0gIGlmIChscCkKLSAgICB7Ci0gICAgICBoLT5vYmplY3RfYmFzZSA9IGgtPm5leHRfZnJlZSA9IChjaGFyICopIChvYmopOwotICAgICAgaC0+Y2h1bmtfbGltaXQgPSBscC0+bGltaXQ7Ci0gICAgICBoLT5jaHVuayA9IGxwOwotICAgIH0KLSAgZWxzZSBpZiAob2JqICE9IDApCi0gICAgLyogb2JqIGlzIG5vdCBpbiBhbnkgb2YgdGhlIGNodW5rcyEgKi8KLSAgICBhYm9ydCAoKTsKLX0KLQwKLWludAotX29ic3RhY2tfbWVtb3J5X3VzZWQgKGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsqIGxwOwotICByZWdpc3RlciBpbnQgbmJ5dGVzID0gMDsKLQotICBmb3IgKGxwID0gaC0+Y2h1bms7IGxwICE9IDA7IGxwID0gbHAtPnByZXYpCi0gICAgewotICAgICAgbmJ5dGVzICs9IGxwLT5saW1pdCAtIChjaGFyICopIGxwOwotICAgIH0KLSAgcmV0dXJuIG5ieXRlczsKLX0KLQwKLS8qIERlZmluZSB0aGUgZXJyb3IgaGFuZGxlci4gICovCi0jaWZuZGVmIF8KLSMgaWZkZWYgSEFWRV9MSUJJTlRMX0gKLSMgIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgIGlmbmRlZiBfCi0jICAgZGVmaW5lIF8oU3RyKSBnZXR0ZXh0IChTdHIpCi0jICBlbmRpZgotIyBlbHNlCi0jICBkZWZpbmUgXyhTdHIpIChTdHIpCi0jIGVuZGlmCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXByaW50X2FuZF9hYm9ydCAoKQotewotICBmcHV0cyAoXygibWVtb3J5IGV4aGF1c3RlZFxuIiksIHN0ZGVycik7Ci0gIGV4aXQgKG9ic3RhY2tfZXhpdF9mYWlsdXJlKTsKLX0KLQwKLSNpZiAwCi0vKiBUaGVzZSBhcmUgbm93IHR1cm5lZCBvZmYgYmVjYXVzZSB0aGUgYXBwbGljYXRpb25zIGRvIG5vdCB1c2UgaXQKLSAgIGFuZCBpdCB1c2VzIGJjb3B5IHZpYSBvYnN0YWNrX2dyb3csIHdoaWNoIGNhdXNlcyB0cm91YmxlIG9uIHN5c1YuICAqLwotCi0vKiBOb3cgZGVmaW5lIHRoZSBmdW5jdGlvbmFsIHZlcnNpb25zIG9mIHRoZSBvYnN0YWNrIG1hY3Jvcy4KLSAgIERlZmluZSB0aGVtIHRvIHNpbXBseSB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgbWFjcm9zIHRvIGRvIHRoZSBqb2IuICAqLwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0vKiBUaGVzZSBmdW5jdGlvbiBkZWZpbml0aW9ucyBkbyBub3Qgd29yayB3aXRoIG5vbi1BTlNJIHByZXByb2Nlc3NvcnM7Ci0gICB0aGV5IHdvbid0IHBhc3MgdGhyb3VnaCB0aGUgbWFjcm8gbmFtZXMgaW4gcGFyZW50aGVzZXMuICAqLwotCi0vKiBUaGUgZnVuY3Rpb24gbmFtZXMgYXBwZWFyIGluIHBhcmVudGhlc2VzIGluIG9yZGVyIHRvIHByZXZlbnQKLSAgIHRoZSBtYWNyby1kZWZpbml0aW9ucyBvZiB0aGUgbmFtZXMgZnJvbSBiZWluZyBleHBhbmRlZCB0aGVyZS4gICovCi0KLVBPSU5URVIgKG9ic3RhY2tfYmFzZSkgKG9ic3RhY2spCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotewotICByZXR1cm4gb2JzdGFja19iYXNlIChvYnN0YWNrKTsKLX0KLQotUE9JTlRFUiAob2JzdGFja19uZXh0X2ZyZWUpIChvYnN0YWNrKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfbmV4dF9mcmVlIChvYnN0YWNrKTsKLX0KLQotaW50IChvYnN0YWNrX29iamVjdF9zaXplKSAob2JzdGFjaykKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci17Ci0gIHJldHVybiBvYnN0YWNrX29iamVjdF9zaXplIChvYnN0YWNrKTsKLX0KLQotaW50IChvYnN0YWNrX3Jvb20pIChvYnN0YWNrKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfcm9vbSAob2JzdGFjayk7Ci19Ci0KLWludCAob2JzdGFja19tYWtlX3Jvb20pIChvYnN0YWNrLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBpbnQgbGVuZ3RoOwotewotICByZXR1cm4gb2JzdGFja19tYWtlX3Jvb20gKG9ic3RhY2ssIGxlbmd0aCk7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfZ3JvdykgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIFBPSU5URVIgcG9pbnRlcjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgb2JzdGFja19ncm93IChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpOwotfQotCi12b2lkIChvYnN0YWNrX2dyb3cwKSAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgUE9JTlRFUiBwb2ludGVyOwotICAgICBpbnQgbGVuZ3RoOwotewotICBvYnN0YWNrX2dyb3cwIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpOwotfQotCi12b2lkIChvYnN0YWNrXzFncm93KSAob2JzdGFjaywgY2hhcmFjdGVyKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGNoYXJhY3RlcjsKLXsKLSAgb2JzdGFja18xZ3JvdyAob2JzdGFjaywgY2hhcmFjdGVyKTsKLX0KLQotdm9pZCAob2JzdGFja19ibGFuaykgKG9ic3RhY2ssIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIG9ic3RhY2tfYmxhbmsgKG9ic3RhY2ssIGxlbmd0aCk7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfMWdyb3dfZmFzdCkgKG9ic3RhY2ssIGNoYXJhY3RlcikKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBjaGFyYWN0ZXI7Ci17Ci0gIG9ic3RhY2tfMWdyb3dfZmFzdCAob2JzdGFjaywgY2hhcmFjdGVyKTsKLX0KLQotdm9pZCAob2JzdGFja19ibGFua19mYXN0KSAob2JzdGFjaywgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgb2JzdGFja19ibGFua19mYXN0IChvYnN0YWNrLCBsZW5ndGgpOwotfQotCi1QT0lOVEVSIChvYnN0YWNrX2ZpbmlzaCkgKG9ic3RhY2spCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotewotICByZXR1cm4gb2JzdGFja19maW5pc2ggKG9ic3RhY2spOwotfQotCi1QT0lOVEVSIChvYnN0YWNrX2FsbG9jKSAob2JzdGFjaywgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfYWxsb2MgKG9ic3RhY2ssIGxlbmd0aCk7Ci19Ci0KLVBPSU5URVIgKG9ic3RhY2tfY29weSkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIFBPSU5URVIgcG9pbnRlcjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfY29weSAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKTsKLX0KLQotUE9JTlRFUiAob2JzdGFja19jb3B5MCkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIFBPSU5URVIgcG9pbnRlcjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfY29weTAgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCk7Ci19Ci0KLSNlbmRpZiAvKiBfX1NURENfXyAqLwotCi0jZW5kaWYgLyogMCAqLwotCi0jZW5kaWYJLyogIUVMSURFX0NPREUgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9wZXhlY3V0ZS5jIGIvbGliaWJlcnR5L3BleGVjdXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NDRjOTguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3BleGVjdXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzggKzAsMCBAQAotLyogVXRpbGl0aWVzIHRvIGV4ZWN1dGUgYSBwcm9ncmFtIGluIGEgc3VicHJvY2VzcyAocG9zc2libHkgbGlua2VkIGJ5IHBpcGVzCi0gICB3aXRoIG90aGVyIHN1YnByb2Nlc3NlcyksIGFuZCB3YWl0IGZvciBpdC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCi13cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBleHBvcnRzIHR3byBmdW5jdGlvbnM6IHBleGVjdXRlIGFuZCBwd2FpdC4gICovCi0KLS8qIFRoaXMgZmlsZSBsaXZlcyBpbiBhdCBsZWFzdCB0d28gcGxhY2VzOiBsaWJpYmVydHkgYW5kIGdjYy4KLSAgIERvbid0IGNoYW5nZSBvbmUgd2l0aG91dCB0aGUgb3RoZXIuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jZGVmaW5lIElTU1BBQ0UgKHgpIGlzc3BhY2UoeCkKLSNpZmRlZiBIQVZFX1NZU19XQUlUX0gKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2VuZGlmCi0KLSNpZmRlZiB2Zm9yayAvKiBBdXRvY29uZiBtYXkgZGVmaW5lIHRoaXMgdG8gZm9yayBmb3IgdXMuICovCi0jIGRlZmluZSBWRk9SS19TVFJJTkcgImZvcmsiCi0jZWxzZQotIyBkZWZpbmUgVkZPUktfU1RSSU5HICJ2Zm9yayIKLSNlbmRpZgotI2lmZGVmIEhBVkVfVkZPUktfSAotI2luY2x1ZGUgPHZmb3JrLmg+Ci0jZW5kaWYKLSNpZmRlZiBWTVMKLSNkZWZpbmUgdmZvcmsoKSAoZGVjYyQkYWxsb2NfdmZvcmtfYmxvY2tzKCkgPj0gMCA/IFwKLSAgICAgICAgICAgICAgIGxpYiRnZXRfY3VycmVudF9pbnZvX2NvbnRleHQoZGVjYyQkZ2V0X3Zmb3JrX2ptcGJ1ZigpKSA6IC0xKQotI2VuZGlmIC8qIFZNUyAqLwotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpZiAhZGVmaW5lZCAoX19DWUdXSU5fXykgJiYgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotI2RlZmluZSBfX0NZR1dJTl9fIDEKLSNlbmRpZgotCi0vKiBzdGRpbiBmaWxlIG51bWJlci4gICovCi0jZGVmaW5lIFNURElOX0ZJTEVfTk8gMAotCi0vKiBzdGRvdXQgZmlsZSBudW1iZXIuICAqLwotI2RlZmluZSBTVERPVVRfRklMRV9OTyAxCi0KLS8qIHZhbHVlIG9mIGBwaXBlJzogcG9ydCBpbmRleCBmb3IgcmVhZGluZy4gICovCi0jZGVmaW5lIFJFQURfUE9SVCAwCi0KLS8qIHZhbHVlIG9mIGBwaXBlJzogcG9ydCBpbmRleCBmb3Igd3JpdGluZy4gICovCi0jZGVmaW5lIFdSSVRFX1BPUlQgMQotCi1zdGF0aWMgY2hhciAqaW5zdGFsbF9lcnJvcl9tc2cgPSAiaW5zdGFsbGF0aW9uIHByb2JsZW0sIGNhbm5vdCBleGVjIGAlcyciOwotCi0vKiBwZXhlY3V0ZTogZXhlY3V0ZSBhIHByb2dyYW0uCi0KLSAgIFBST0dSQU0gYW5kIEFSR1YgYXJlIHRoZSBhcmd1bWVudHMgdG8gZXhlY3YvZXhlY3ZwLgotCi0gICBUSElTX1BOQU1FIGlzIG5hbWUgb2YgdGhlIGNhbGxpbmcgcHJvZ3JhbSAoaS5lLiBhcmd2WzBdKS4KLQotICAgVEVNUF9CQVNFIGlzIHRoZSBwYXRoIG5hbWUsIHNhbnMgc3VmZml4LCBvZiBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZQotICAgaWYgbmVlZGVkLiAgVGhpcyBpcyBjdXJyZW50bHkgb25seSBuZWVkZWQgZm9yIE1TRE9TIHBvcnRzIHRoYXQgZG9uJ3QgdXNlCi0gICBHTzMyIChkbyBhbnkgc3RpbGwgZXhpc3Q/KS4gIFBvcnRzIHRoYXQgZG9uJ3QgbmVlZCBpdCBjYW4gcGFzcyBOVUxMLgotCi0gICAoRkxBR1MgJiBQRVhFQ1VURV9TRUFSQ0gpIGlzIG5vbi16ZXJvIGlmICRQQVRIIHNob3VsZCBiZSBzZWFyY2hlZAotICAgKD8/PyBJdCdzIG5vdCBjbGVhciB0aGF0IEdDQyBwYXNzZXMgdGhpcyBmbGFnIGNvcnJlY3RseSkuCi0gICAoRkxBR1MgJiBQRVhFQ1VURV9GSVJTVCkgaXMgbm9uemVybyBmb3IgdGhlIGZpcnN0IHByb2Nlc3MgaW4gY2hhaW4uCi0gICAoRkxBR1MgJiBQRVhFQ1VURV9GSVJTVCkgaXMgbm9uemVybyBmb3IgdGhlIGxhc3QgcHJvY2VzcyBpbiBjaGFpbi4KLSAgIEZJUlNUX0xBU1QgY291bGQgYmUgc2ltcGxpZmllZCB0byBvbmx5IG1hcmsgdGhlIGxhc3Qgb2YgYSBjaGFpbiBvZiBwcm9jZXNzZXMKLSAgIGJ1dCB0aGF0IHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYWx3YXlzIG1hcmsgdGhlIGxhc3Qgb25lIChhbmQgbm90IGdpdmUgdXAKLSAgIGVhcmx5IGlmIHNvbWUgZXJyb3Igb2NjdXJzKS4gIEl0J3MgbW9yZSByb2J1c3QgdG8gcmVxdWlyZSB0aGUgY2FsbGVyIHRvCi0gICBtYXJrIGJvdGggZW5kcyBvZiB0aGUgY2hhaW4uCi0KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHBpZCBvbiBzeXN0ZW1zIGxpa2UgVW5peCB3aGVyZSB3ZSBmb3JrL2V4ZWMgYW5kIG9uIHN5c3RlbXMKLSAgIGxpa2UgV0lOMzIgYW5kIE9TMiB3aGVyZSB3ZSB1c2Ugc3Bhd24uICBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHdhaXQgZm9yCi0gICB0aGUgY2hpbGQuCi0KLSAgIFRoZSByZXN1bHQgaXMgdGhlIFdFWElUU1RBVFVTIG9uIHN5c3RlbXMgbGlrZSBNU0RPUyB3aGVyZSB3ZSBzcGF3biBhbmQgd2FpdAotICAgZm9yIHRoZSBjaGlsZCBoZXJlLgotCi0gICBVcG9uIGZhaWx1cmUsIEVSUk1TR19GTVQgYW5kIEVSUk1TR19BUkcgYXJlIHNldCB0byB0aGUgdGV4dCBvZiB0aGUgZXJyb3IKLSAgIG1lc3NhZ2Ugd2l0aCBhbiBvcHRpb25hbCBhcmd1bWVudCAoaWYgbm90IG5lZWRlZCwgRVJSTVNHX0FSRyBpcyBzZXQgdG8KLSAgIE5VTEwpLCBhbmQgLTEgaXMgcmV0dXJuZWQuICBgZXJybm8nIGlzIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvIHVzZS4KLQotICAgcHdhaXQ6IGNvdmVyIGZ1bmN0aW9uIGZvciB3YWl0LgotCi0gICBQSUQgaXMgdGhlIHByb2Nlc3MgaWQgb2YgdGhlIHRhc2sgdG8gd2FpdCBmb3IuCi0gICBTVEFUVVMgaXMgdGhlIGBzdGF0dXMnIGFyZ3VtZW50IHRvIHdhaXQuCi0gICBGTEFHUyBpcyBjdXJyZW50bHkgdW51c2VkIChhbGxvd3MgZnV0dXJlIGVuaGFuY2VtZW50IHdpdGhvdXQgYnJlYWtpbmcKLSAgIHVwd2FyZCBjb21wYXRpYmlsaXR5KS4gIFBhc3MgMCBmb3Igbm93LgotCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBwaWQgb2YgdGhlIGNoaWxkIHJlYXBlZCwKLSAgIG9yIC0xIGZvciBmYWlsdXJlIChlcnJubyBzYXlzIHdoeSkuCi0KLSAgIE9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHdhaXRpbmcgZm9yIGEgcGFydGljdWxhciBjaGlsZCwgUElEIGlzCi0gICBpZ25vcmVkLiAgT24gc3lzdGVtcyBsaWtlIE1TRE9TIHRoYXQgZG9uJ3QgcmVhbGx5IG11bHRpdGFzayBwd2FpdAotICAgaXMganVzdCBhIG1lY2hhbmlzbSB0byBwcm92aWRlIGEgY29uc2lzdGVudCBpbnRlcmZhY2UgZm9yIHRoZSBjYWxsZXIuCi0KLSAgIHBmaW5pc2g6IGZpbmlzaCBnZW5lcmF0aW9uIG9mIHNjcmlwdAotCi0gICBwZmluaXNoIGlzIG5lY2Vzc2FyeSBmb3Igc3lzdGVtcyBsaWtlIE1QVyB3aGVyZSBhIHNjcmlwdCBpcyBnZW5lcmF0ZWQgdGhhdAotICAgcnVucyB0aGUgcmVxdWVzdGVkIHByb2dyYW1zLgotKi8KLQotI2lmZGVmIF9fTVNET1NfXwotCi0vKiBNU0RPUyBkb2Vzbid0IG11bHRpdGFzaywgYnV0IGZvciB0aGUgc2FrZSBvZiBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlCi0gICB0aGUgY29kZSBiZWhhdmVzIGxpa2UgaXQgZG9lcy4gIHBleGVjdXRlIHJ1bnMgdGhlIHByb2dyYW0sIHR1Y2tzIHRoZQotICAgZXhpdCBjb2RlIGF3YXksIGFuZCByZXR1cm5zIGEgInBpZCIuICBwd2FpdCBtdXN0IGJlIGNhbGxlZCB0byBmZXRjaCB0aGUKLSAgIGV4aXQgY29kZS4gICovCi0KLSNpbmNsdWRlIDxwcm9jZXNzLmg+Ci0KLS8qIEZvciBjb21tdW5pY2F0aW5nIGluZm9ybWF0aW9uIGZyb20gcGV4ZWN1dGUgdG8gcHdhaXQuICAqLwotc3RhdGljIGludCBsYXN0X3BpZCA9IDA7Ci1zdGF0aWMgaW50IGxhc3Rfc3RhdHVzID0gMDsKLXN0YXRpYyBpbnQgbGFzdF9yZWFwZWQgPSAwOwotCi1pbnQKLXBleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgICBjaGFyICogY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZTsKLSAgICAgY2hhciAqKmVycm1zZ19mbXQsICoqZXJybXNnX2FyZzsKLSAgICAgaW50IGZsYWdzOwotewotICBpbnQgcmM7Ci0KLSAgbGFzdF9waWQrKzsKLSAgaWYgKGxhc3RfcGlkIDwgMCkKLSAgICBsYXN0X3BpZCA9IDE7Ci0KLSAgaWYgKChmbGFncyAmIFBFWEVDVVRFX09ORSkgIT0gUEVYRUNVVEVfT05FKQotICAgIGFib3J0ICgpOwotCi0jaWZkZWYgX19HTzMyX18KLSAgLyogPz8/IFdoYXQgYXJlIHRoZSBwb3NzaWJsZSByZXR1cm4gdmFsdWVzIGZyb20gc3Bhd252PyAgKi8KLSAgcmMgPSAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyBzcGF3bnZwIDogc3Bhd252KSAoMSwgcHJvZ3JhbSwgYXJndik7Ci0jZWxzZQotICBjaGFyICpzY21kLCAqcmY7Ci0gIEZJTEUgKmFyZ2ZpbGU7Ci0gIGludCBpLCBlbCA9IGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gNCA6IDA7Ci0KLSAgc2NtZCA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocHJvZ3JhbSkgKyBzdHJsZW4gKHRlbXBfYmFzZSkgKyA2ICsgZWwpOwotICByZiA9IHNjbWQgKyBzdHJsZW4ocHJvZ3JhbSkgKyAyICsgZWw7Ci0gIHNwcmludGYgKHNjbWQsICIlcyVzIEAlcy5ncCIsIHByb2dyYW0sCi0JICAgKGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gIi5leGUiIDogIiIpLCB0ZW1wX2Jhc2UpOwotICBhcmdmaWxlID0gZm9wZW4gKHJmLCAidyIpOwotICBpZiAoYXJnZmlsZSA9PSAwKQotICAgIHsKLSAgICAgIGludCBlcnJub19zYXZlID0gZXJybm87Ci0gICAgICBmcmVlIChzY21kKTsKLSAgICAgIGVycm5vID0gZXJybm9fc2F2ZTsKLSAgICAgICplcnJtc2dfZm10ID0gImNhbm5vdCBvcGVuIGAlcy5ncCciOwotICAgICAgKmVycm1zZ19hcmcgPSB0ZW1wX2Jhc2U7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGZvciAoaT0xOyBhcmd2W2ldOyBpKyspCi0gICAgewotICAgICAgY2hhciAqY3A7Ci0gICAgICBmb3IgKGNwID0gYXJndltpXTsgKmNwOyBjcCsrKQotCXsKLQkgIGlmICgqY3AgPT0gJyInIHx8ICpjcCA9PSAnXCcnIHx8ICpjcCA9PSAnXFwnIHx8IElTU1BBQ0UgKCpjcCkpCi0JICAgIGZwdXRjICgnXFwnLCBhcmdmaWxlKTsKLQkgIGZwdXRjICgqY3AsIGFyZ2ZpbGUpOwotCX0KLSAgICAgIGZwdXRjICgnXG4nLCBhcmdmaWxlKTsKLSAgICB9Ci0gIGZjbG9zZSAoYXJnZmlsZSk7Ci0KLSAgcmMgPSBzeXN0ZW0gKHNjbWQpOwotCi0gIHsKLSAgICBpbnQgZXJybm9fc2F2ZSA9IGVycm5vOwotICAgIHJlbW92ZSAocmYpOwotICAgIGZyZWUgKHNjbWQpOwotICAgIGVycm5vID0gZXJybm9fc2F2ZTsKLSAgfQotI2VuZGlmCi0KLSAgaWYgKHJjID09IC0xKQotICAgIHsKLSAgICAgICplcnJtc2dfZm10ID0gaW5zdGFsbF9lcnJvcl9tc2c7Ci0gICAgICAqZXJybXNnX2FyZyA9IHByb2dyYW07Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIFR1Y2sgdGhlIHN0YXR1cyBhd2F5IGZvciBwd2FpdCwgYW5kIHJldHVybiBhICJwaWQiLiAgKi8KLSAgbGFzdF9zdGF0dXMgPSByYyA8PCA4OwotICByZXR1cm4gbGFzdF9waWQ7Ci19Ci0KLWludAotcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKLSAgICAgaW50IHBpZDsKLSAgICAgaW50ICpzdGF0dXM7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgLyogT24gTVNET1MgZWFjaCBwZXhlY3V0ZSBtdXN0IGJlIGZvbGxvd2VkIGJ5IGl0J3MgYXNzb2NpYXRlZCBwd2FpdC4gICovCi0gIGlmIChwaWQgIT0gbGFzdF9waWQKLSAgICAgIC8qIENhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgY2hpbGQ/ICAqLwotICAgICAgfHwgcGlkID09IGxhc3RfcmVhcGVkKQotICAgIHsKLSAgICAgIC8qID8/PyBFQ0hJTEQgd291bGQgYmUgYSBiZXR0ZXIgY2hvaWNlLiAgQ2FuIHdlIHVzZSBpdCBoZXJlPyAgKi8KLSAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgLyogPz8/IEhlcmUncyBhbiBvcHBvcnR1bml0eSB0byBjYW5vbmljYWxpemUgdGhlIHZhbHVlcyBpbiBTVEFUVVMuCi0gICAgIE5lZWRlZD8gICovCi0gICpzdGF0dXMgPSBsYXN0X3N0YXR1czsKLSAgbGFzdF9yZWFwZWQgPSBsYXN0X3BpZDsKLSAgcmV0dXJuIGxhc3RfcGlkOwotfQotCi0jZW5kaWYgLyogTVNET1MgKi8KLQotI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX1VXSU5fXykKLQotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLQotI2lmZGVmIF9fQ1lHV0lOX18KLQotI2RlZmluZSBmaXhfYXJndihhcmd2ZWMpIChhcmd2ZWMpCi0KLWV4dGVybiBpbnQgX3NwYXdudiAoKTsKLWV4dGVybiBpbnQgX3NwYXdudnAgKCk7Ci0KLSNlbHNlIC8qICEgX19DWUdXSU5fXyAqLwotCi0vKiBUaGlzIGlzIGEga2x1ZGdlIHRvIGdldCBhcm91bmQgdGhlIE1pY3Jvc29mdCBDIHNwYXduIGZ1bmN0aW9ucycgcHJvcGVuc2l0eQotICAgdG8gcmVtb3ZlIHRoZSBvdXRlcm1vc3Qgc2V0IG9mIGRvdWJsZSBxdW90ZXMgZnJvbSBhbGwgYXJndW1lbnRzLiAgKi8KLQotY29uc3QgY2hhciAqIGNvbnN0ICoKLWZpeF9hcmd2IChhcmd2ZWMpCi0gICAgIGNoYXIgKiphcmd2ZWM7Ci17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDE7IGFyZ3ZlY1tpXSAhPSAwOyBpKyspCi0gICAgewotICAgICAgaW50IGxlbiwgajsKLSAgICAgIGNoYXIgKnRlbXAsICpuZXd0ZW1wOwotCi0gICAgICB0ZW1wID0gYXJndmVjW2ldOwotICAgICAgbGVuID0gc3RybGVuICh0ZW1wKTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykKLSAgICAgICAgewotICAgICAgICAgIGlmICh0ZW1wW2pdID09ICciJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmV3dGVtcCA9IHhtYWxsb2MgKGxlbiArIDIpOwotICAgICAgICAgICAgICBzdHJuY3B5IChuZXd0ZW1wLCB0ZW1wLCBqKTsKLSAgICAgICAgICAgICAgbmV3dGVtcCBbal0gPSAnXFwnOwotICAgICAgICAgICAgICBzdHJuY3B5ICgmbmV3dGVtcCBbaisxXSwgJnRlbXAgW2pdLCBsZW4taik7Ci0gICAgICAgICAgICAgIG5ld3RlbXAgW2xlbisxXSA9IDA7Ci0gICAgICAgICAgICAgIHRlbXAgPSBuZXd0ZW1wOwotICAgICAgICAgICAgICBsZW4rKzsKLSAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXJndmVjW2ldID0gdGVtcDsKLSAgICAgIH0KLQotICByZXR1cm4gKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBhcmd2ZWM7Ci19Ci0jZW5kaWYgLyogX19DWUdXSU5fXyAqLwotCi0jaW5jbHVkZSA8aW8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKiBtaW5ndzMyIGhlYWRlcnMgbWF5IG5vdCBkZWZpbmUgdGhlIGZvbGxvd2luZy4gICovCi0KLSNpZm5kZWYgX1BfV0FJVAotIyAgZGVmaW5lIF9QX1dBSVQJMAotIyAgZGVmaW5lIF9QX05PV0FJVAkxCi0jICBkZWZpbmUgX1BfT1ZFUkxBWQkyCi0jICBkZWZpbmUgX1BfTk9XQUlUTwkzCi0jICBkZWZpbmUgX1BfREVUQUNICTQKLQotIyAgZGVmaW5lIFdBSVRfQ0hJTEQJMAotIyAgZGVmaW5lIFdBSVRfR1JBTkRDSElMRAkxCi0jZW5kaWYKLQotLyogV2luMzIgc3VwcG9ydHMgcGlwZXMgKi8KLWludAotcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dyYW07Ci0gICAgIGNoYXIgKiBjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlOwotICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGludCBwaWQ7Ci0gIGludCBwZGVzWzJdLCBvcmdfc3RkaW4sIG9yZ19zdGRvdXQ7Ci0gIGludCBpbnB1dF9kZXNjLCBvdXRwdXRfZGVzYzsKLSAgaW50IHJldHJpZXMsIHNsZWVwX2ludGVydmFsOwotCi0gIC8qIFBpcGUgd2FpdGluZyBmcm9tIGxhc3QgcHJvY2VzcywgdG8gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdGhlIG5leHQgb25lLgotICAgICBWYWx1ZSBpcyBTVERJTl9GSUxFX05PIGlmIG5vIHBpcGUgaXMgd2FpdGluZwotICAgICAoaS5lLiB0aGUgbmV4dCBjb21tYW5kIGlzIHRoZSBmaXJzdCBvZiBhIGdyb3VwKS4gICovCi0gIHN0YXRpYyBpbnQgbGFzdF9waXBlX2lucHV0OwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHByb2Nlc3MsIGluaXRpYWxpemUuICAqLwotICBpZiAoZmxhZ3MgJiBQRVhFQ1VURV9GSVJTVCkKLSAgICBsYXN0X3BpcGVfaW5wdXQgPSBTVERJTl9GSUxFX05POwotCi0gIGlucHV0X2Rlc2MgPSBsYXN0X3BpcGVfaW5wdXQ7Ci0KLSAgLyogSWYgdGhpcyBpc24ndCB0aGUgbGFzdCBwcm9jZXNzLCBtYWtlIGEgcGlwZSBmb3IgaXRzIG91dHB1dCwKLSAgICAgYW5kIHJlY29yZCBpdCBhcyB3YWl0aW5nIHRvIGJlIHRoZSBpbnB1dCB0byB0aGUgbmV4dCBwcm9jZXNzLiAgKi8KLSAgaWYgKCEgKGZsYWdzICYgUEVYRUNVVEVfTEFTVCkpCi0gICAgewotICAgICAgaWYgKF9waXBlIChwZGVzLCAyNTYsIE9fQklOQVJZKSA8IDApCi0JewotCSAgKmVycm1zZ19mbXQgPSAicGlwZSI7Ci0JICAqZXJybXNnX2FyZyA9IE5VTEw7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgb3V0cHV0X2Rlc2MgPSBwZGVzW1dSSVRFX1BPUlRdOwotICAgICAgbGFzdF9waXBlX2lucHV0ID0gcGRlc1tSRUFEX1BPUlRdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIExhc3QgcHJvY2Vzcy4gICovCi0gICAgICBvdXRwdXRfZGVzYyA9IFNURE9VVF9GSUxFX05POwotICAgICAgbGFzdF9waXBlX2lucHV0ID0gU1RESU5fRklMRV9OTzsKLSAgICB9Ci0KLSAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKLSAgICB7Ci0gICAgICBvcmdfc3RkaW4gPSBkdXAgKFNURElOX0ZJTEVfTk8pOwotICAgICAgZHVwMiAoaW5wdXRfZGVzYywgU1RESU5fRklMRV9OTyk7Ci0gICAgICBjbG9zZSAoaW5wdXRfZGVzYyk7IAotICAgIH0KLQotICBpZiAob3V0cHV0X2Rlc2MgIT0gU1RET1VUX0ZJTEVfTk8pCi0gICAgewotICAgICAgb3JnX3N0ZG91dCA9IGR1cCAoU1RET1VUX0ZJTEVfTk8pOwotICAgICAgZHVwMiAob3V0cHV0X2Rlc2MsIFNURE9VVF9GSUxFX05PKTsKLSAgICAgIGNsb3NlIChvdXRwdXRfZGVzYyk7Ci0gICAgfQotCi0gIHBpZCA9IChmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/IF9zcGF3bnZwIDogX3NwYXdudikKLSAgICAoX1BfTk9XQUlULCBwcm9ncmFtLCBmaXhfYXJndihhcmd2KSk7Ci0KLSAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKLSAgICB7Ci0gICAgICBkdXAyIChvcmdfc3RkaW4sIFNURElOX0ZJTEVfTk8pOwotICAgICAgY2xvc2UgKG9yZ19zdGRpbik7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfZGVzYyAhPSBTVERPVVRfRklMRV9OTykKLSAgICB7Ci0gICAgICBkdXAyIChvcmdfc3Rkb3V0LCBTVERPVVRfRklMRV9OTyk7Ci0gICAgICBjbG9zZSAob3JnX3N0ZG91dCk7Ci0gICAgfQotCi0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgKmVycm1zZ19mbXQgPSBpbnN0YWxsX2Vycm9yX21zZzsKLSAgICAgICplcnJtc2dfYXJnID0gcHJvZ3JhbTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHBpZDsKLX0KLQotLyogTVMgQ1JURExMIGRvZXNuJ3QgcmV0dXJuIGVub3VnaCBpbmZvcm1hdGlvbiBpbiBzdGF0dXMgdG8gZGVjaWRlIGlmIHRoZQotICAgY2hpbGQgZXhpdGVkIGR1ZSB0byBhIHNpZ25hbCBvciBub3QsIHJhdGhlciBpdCBzaW1wbHkgcmV0dXJucyBhbgotICAgaW50ZWdlciB3aXRoIHRoZSBleGl0IGNvZGUgb2YgdGhlIGNoaWxkOyBlZy4sIGlmIHRoZSBjaGlsZCBleGl0ZWQgd2l0aCAKLSAgIGFuIGFib3J0KCkgY2FsbCBhbmQgZGlkbid0IGhhdmUgYSBoYW5kbGVyIGZvciBTSUdBQlJULCBpdCBzaW1wbHkgcmV0dXJucwotICAgd2l0aCBzdGF0dXMgPSAzLiBXZSBmaXggdGhlIHN0YXR1cyBjb2RlIHRvIGNvbmZvcm0gdG8gdGhlIHVzdWFsIFdJRioKLSAgIG1hY3Jvcy4gTm90ZSB0aGF0IFdJRlNJR05BTEVEIHdpbGwgbmV2ZXIgYmUgdHJ1ZSB1bmRlciBDUlRETEwuICovCi0KLWludAotcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKLSAgICAgaW50IHBpZDsKLSAgICAgaW50ICpzdGF0dXM7Ci0gICAgIGludCBmbGFnczsKLXsKLSNpZmRlZiBfX0NZR1dJTl9fCi0gIHJldHVybiB3YWl0IChzdGF0dXMpOwotI2Vsc2UKLSAgaW50IHRlcm1zdGF0OwotCi0gIHBpZCA9IF9jd2FpdCAoJnRlcm1zdGF0LCBwaWQsIFdBSVRfQ0hJTEQpOwotCi0gIC8qID8/PyBIZXJlJ3MgYW4gb3Bwb3J0dW5pdHkgdG8gY2Fub25pY2FsaXplIHRoZSB2YWx1ZXMgaW4gU1RBVFVTLgotICAgICBOZWVkZWQ/ICAqLwotCi0gIC8qIGN3YWl0IHJldHVybnMgdGhlIGNoaWxkIHByb2Nlc3MgZXhpdCBjb2RlIGluIHRlcm1zdGF0LgotICAgICBBIHZhbHVlIG9mIDMgaW5kaWNhdGVzIHRoYXQgdGhlIGNoaWxkIGNhdWdodCBhIHNpZ25hbCwgYnV0IG5vdAotICAgICB3aGljaCBvbmUuICBTaW5jZSBvbmx5IFNJR0FCUlQsIFNJR0ZQRSBhbmQgU0lHSU5UIGRvIGFueXRoaW5nLCB3ZQotICAgICByZXBvcnQgU0lHQUJSVC4gICovCi0gIGlmICh0ZXJtc3RhdCA9PSAzKQotICAgICpzdGF0dXMgPSBTSUdBQlJUOwotICBlbHNlCi0gICAgKnN0YXR1cyA9ICgoKHRlcm1zdGF0KSAmIDB4ZmYpIDw8IDgpOwotCi0gIHJldHVybiBwaWQ7Ci0jZW5kaWYgLyogX19DWUdXSU5fXyAqLwotfQotCi0jZW5kaWYgLyogX1dJTjMyICYmICEgX19VV0lOX18gKi8KLQotI2lmZGVmIE9TMgotCi0vKiA/Pz8gRG9lcyBPUzIgaGF2ZSBwcm9jZXNzLmg/ICAqLwotZXh0ZXJuIGludCBzcGF3bnYgKCk7Ci1leHRlcm4gaW50IHNwYXdudnAgKCk7Ci0KLWludAotcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dyYW07Ci0gICAgIGNoYXIgKiBjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlOwotICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGludCBwaWQ7Ci0KLSAgaWYgKChmbGFncyAmIFBFWEVDVVRFX09ORSkgIT0gUEVYRUNVVEVfT05FKQotICAgIGFib3J0ICgpOwotICAvKiA/Pz8gUHJlc3VtYWJseSAxID09IF9QX05PV0FJVC4gICovCi0gIHBpZCA9IChmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/IHNwYXdudnAgOiBzcGF3bnYpICgxLCBwcm9ncmFtLCBhcmd2KTsKLSAgaWYgKHBpZCA9PSAtMSkKLSAgICB7Ci0gICAgICAqZXJybXNnX2ZtdCA9IGluc3RhbGxfZXJyb3JfbXNnOwotICAgICAgKmVycm1zZ19hcmcgPSBwcm9ncmFtOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIHBpZDsKLX0KLQotaW50Ci1wd2FpdCAocGlkLCBzdGF0dXMsIGZsYWdzKQotICAgICBpbnQgcGlkOwotICAgICBpbnQgKnN0YXR1czsKLSAgICAgaW50IGZsYWdzOwotewotICAvKiA/Pz8gSGVyZSdzIGFuIG9wcG9ydHVuaXR5IHRvIGNhbm9uaWNhbGl6ZSB0aGUgdmFsdWVzIGluIFNUQVRVUy4KLSAgICAgTmVlZGVkPyAgKi8KLSAgaW50IHBpZCA9IHdhaXQgKHN0YXR1cyk7Ci0gIHJldHVybiBwaWQ7Ci19Ci0KLSNlbmRpZiAvKiBPUzIgKi8KLQotI2lmZGVmIE1QVwotCi0vKiBNUFcgcGV4ZWN1dGUgZG9lc24ndCBhY3R1YWxseSBydW4gYW55dGhpbmc7IGluc3RlYWQsIGl0IHdyaXRlcyBvdXQKLSAgIHNjcmlwdCBjb21tYW5kcyB0aGF0LCB3aGVuIHJ1biwgd2lsbCBkbyB0aGUgYWN0dWFsIGV4ZWN1dGluZy4KLQotICAgRm9yIGV4YW1wbGUsIGluIEdDQydzIGNhc2UsIEdDQyB3aWxsIHdyaXRlIG91dCBzZXZlcmFsIHNjcmlwdCBjb21tYW5kczoKLQotICAgY3BwIC4uLgotICAgY2MxIC4uLgotICAgYXMgLi4uCi0gICBsZCAuLi4KLQotICAgYW5kIHRoZW4gZXhpdC4gIE5vbmUgb2YgdGhlIGFib3ZlIHByb2dyYW1zIHdpbGwgaGF2ZSBydW4geWV0LiAgVGhlIHRhc2sKLSAgIHRoYXQgY2FsbGVkIEdDQyB3aWxsIHRoZW4gZXhlY3V0ZSB0aGUgc2NyaXB0IGFuZCBjYXVzZSBjcHAsZXRjLiB0byBydW4uCi0gICBUaGUgY2FsbGVyIG11c3QgaW52b2tlIHBmaW5pc2ggYmVmb3JlIGNhbGxpbmcgZXhpdC4gIFRoaXMgYWRkcwotICAgdGhlIGZpbmlzaGluZyB0b3VjaGVzIHRvIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LiAgKi8KLQotc3RhdGljIGludCBmaXJzdF90aW1lID0gMTsKLQotaW50Ci1wZXhlY3V0ZSAocHJvZ3JhbSwgYXJndiwgdGhpc19wbmFtZSwgdGVtcF9iYXNlLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqcHJvZ3JhbTsKLSAgICAgY2hhciAqIGNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICp0aGlzX3BuYW1lOwotICAgICBjb25zdCBjaGFyICp0ZW1wX2Jhc2U7Ci0gICAgIGNoYXIgKiplcnJtc2dfZm10LCAqKmVycm1zZ19hcmc7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgY2hhciB0bXBwcm9ncmFtWzI1NV07Ci0gIGNoYXIgKmNwLCAqdG1wbmFtZTsKLSAgaW50IGk7Ci0KLSAgbXB3aWZ5X2ZpbGVuYW1lIChwcm9ncmFtLCB0bXBwcm9ncmFtKTsKLSAgaWYgKGZpcnN0X3RpbWUpCi0gICAgewotICAgICAgcHJpbnRmICgiU2V0IEZhaWxlZCAwXG4iKTsKLSAgICAgIGZpcnN0X3RpbWUgPSAwOwotICAgIH0KLQotICBmcHV0cyAoIklmIHtGYWlsZWR9ID09IDBcbiIsIHN0ZG91dCk7Ci0gIC8qIElmIGJlaW5nIHZlcmJvc2UsIG91dHB1dCBhIGNvcHkgb2YgdGhlIGNvbW1hbmQuICBJdCBzaG91bGQgYmUKLSAgICAgYWNjdXJhdGUgZW5vdWdoIGFuZCBlc2NhcGVkIGVub3VnaCB0byBiZSAiY2xpY2thYmxlIi4gICovCi0gIGlmIChmbGFncyAmIFBFWEVDVVRFX1ZFUkJPU0UpCi0gICAgewotICAgICAgZnB1dHMgKCJcdEVjaG8gIiwgc3Rkb3V0KTsKLSAgICAgIGZwdXRjICgnXCcnLCBzdGRvdXQpOwotICAgICAgZnB1dHMgKHRtcHByb2dyYW0sIHN0ZG91dCk7Ci0gICAgICBmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLSAgICAgIGZwdXRjICgnICcsIHN0ZG91dCk7Ci0gICAgICBmb3IgKGk9MTsgYXJndltpXTsgaSsrKQotCXsKLQkgIGZwdXRjICgnXCcnLCBzdGRvdXQpOwotCSAgLyogU2VlIGlmIHdlIGhhdmUgYW4gYXJndW1lbnQgdGhhdCBuZWVkcyBmaXhpbmcuICAqLwotCSAgaWYgKHN0cmNocihhcmd2W2ldLCAnLycpKQotCSAgICB7Ci0JICAgICAgdG1wbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKDI1Nik7Ci0JICAgICAgbXB3aWZ5X2ZpbGVuYW1lIChhcmd2W2ldLCB0bXBuYW1lKTsKLQkgICAgICBhcmd2W2ldID0gdG1wbmFtZTsKLQkgICAgfQotCSAgZm9yIChjcCA9IGFyZ3ZbaV07ICpjcDsgY3ArKykKLQkgICAgewotCSAgICAgIC8qIFdyaXRlIGFuIE9wdGlvbi1kIGVzY2FwZSBjaGFyIGluIGZyb250IG9mIHNwZWNpYWwgY2hhcnMuICAqLwotCSAgICAgIGlmIChzdHJjaHIoIicrIiwgKmNwKSkKLQkJZnB1dGMgKCdcMjY2Jywgc3Rkb3V0KTsKLQkgICAgICBmcHV0YyAoKmNwLCBzdGRvdXQpOwotCSAgICB9Ci0JICBmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLQkgIGZwdXRjICgnICcsIHN0ZG91dCk7Ci0JfQotICAgICAgZnB1dHMgKCJcbiIsIHN0ZG91dCk7Ci0gICAgfQotICBmcHV0cyAoIlx0Iiwgc3Rkb3V0KTsKLSAgZnB1dHMgKHRtcHByb2dyYW0sIHN0ZG91dCk7Ci0gIGZwdXRjICgnICcsIHN0ZG91dCk7Ci0KLSAgZm9yIChpPTE7IGFyZ3ZbaV07IGkrKykKLSAgICB7Ci0gICAgICAvKiBTZWUgaWYgd2UgaGF2ZSBhbiBhcmd1bWVudCB0aGF0IG5lZWRzIGZpeGluZy4gICovCi0gICAgICBpZiAoc3RyY2hyKGFyZ3ZbaV0sICcvJykpCi0JewotCSAgdG1wbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKDI1Nik7Ci0JICBtcHdpZnlfZmlsZW5hbWUgKGFyZ3ZbaV0sIHRtcG5hbWUpOwotCSAgYXJndltpXSA9IHRtcG5hbWU7Ci0JfQotICAgICAgaWYgKHN0cmNociAoYXJndltpXSwgJyAnKSkKLQlmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLSAgICAgIGZvciAoY3AgPSBhcmd2W2ldOyAqY3A7IGNwKyspCi0JewotCSAgLyogV3JpdGUgYW4gT3B0aW9uLWQgZXNjYXBlIGNoYXIgaW4gZnJvbnQgb2Ygc3BlY2lhbCBjaGFycy4gICovCi0JICBpZiAoc3RyY2hyKCInKyIsICpjcCkpCi0JICAgIGZwdXRjICgnXDI2NicsIHN0ZG91dCk7Ci0JICBmcHV0YyAoKmNwLCBzdGRvdXQpOwotCX0KLSAgICAgIGlmIChzdHJjaHIgKGFyZ3ZbaV0sICcgJykpCi0JZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0gICAgICBmcHV0YyAoJyAnLCBzdGRvdXQpOwotICAgIH0KLQotICBmcHV0cyAoIlxuIiwgc3Rkb3V0KTsKLQotICAvKiBPdXRwdXQgY29tbWFuZHMgdGhhdCBhcnJhbmdlIHRvIGNsZWFuIHVwIGFuZCBleGl0IGlmIGEgZmFpbHVyZSBvY2N1cnMuCi0gICAgIFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBjb2xsZWN0IHRoZSBzdGF0dXMgZnJvbSB0aGUgcHJvZ3JhbSB0aGF0IHdhcwotICAgICBydW4sIHJhdGhlciB0aGFuIHNvbWUgb3RoZXIgc2NyaXB0IGNvbW1hbmQuICBBbHNvLCB3ZSBkb24ndCBleGl0Ci0gICAgIGltbWVkaWF0ZWx5LCBzaW5jZSBuZWNlc3NhcnkgY2xlYW51cHMgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHNjcmlwdC4gICovCi0gIGZwdXRzICgiXHRTZXQgVG1wU3RhdHVzIHtTdGF0dXN9XG4iLCBzdGRvdXQpOwotICBmcHV0cyAoIlx0SWYge1RtcFN0YXR1c30gIT0gMFxuIiwgc3Rkb3V0KTsKLSAgZnB1dHMgKCJcdFx0U2V0IEZhaWxlZCB7VG1wU3RhdHVzfVxuIiwgc3Rkb3V0KTsKLSAgZnB1dHMgKCJcdEVuZFxuIiwgc3Rkb3V0KTsKLSAgZnB1dHMgKCJFbmRcbiIsIHN0ZG91dCk7Ci0KLSAgLyogV2UncmUganVzdCBjb21wb3NpbmcgYSBzY3JpcHQsIGNhbid0IGZhaWwgaGVyZS4gICovCi0gIHJldHVybiAwOwotfQotCi1pbnQKLXB3YWl0IChwaWQsIHN0YXR1cywgZmxhZ3MpCi0gICAgIGludCBwaWQ7Ci0gICAgIGludCAqc3RhdHVzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gICpzdGF0dXMgPSAwOwotICByZXR1cm4gMDsKLX0KLQotLyogV3JpdGUgb3V0IGNvbW1hbmRzIHRoYXQgd2lsbCBleGl0IHdpdGggdGhlIGNvcnJlY3QgZXJyb3IgY29kZQotICAgaWYgc29tZXRoaW5nIGluIHRoZSBzY3JpcHQgZmFpbGVkLiAgKi8KLQotdm9pZAotcGZpbmlzaCAoKQotewotICBwcmludGYgKCJcdEV4aXQgXCJ7RmFpbGVkfVwiXG4iKTsKLX0KLQotI2VuZGlmIC8qIE1QVyAqLwotCi0vKiBpbmNsdWRlIGZvciBVbml4LWxpa2UgZW52aXJvbm1lbnRzIGJ1dCBub3QgZm9yIERvcy1saWtlIGVudmlyb25tZW50cyAqLwotI2lmICEgZGVmaW5lZCAoX19NU0RPU19fKSAmJiAhIGRlZmluZWQgKE9TMikgJiYgISBkZWZpbmVkIChNUFcpIFwKLSAgICAmJiAhIChkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19VV0lOX18pKQotCi1leHRlcm4gaW50IGV4ZWN2ICgpOwotZXh0ZXJuIGludCBleGVjdnAgKCk7Ci0KLWludAotcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dyYW07Ci0gICAgIGNoYXIgKiBjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNoYXIgKiplcnJtc2dfZm10LCAqKmVycm1zZ19hcmc7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgaW50ICgqZnVuYykoKSA9IChmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/IGV4ZWN2cCA6IGV4ZWN2KTsKLSAgaW50IHBpZDsKLSAgaW50IHBkZXNbMl07Ci0gIGludCBpbnB1dF9kZXNjLCBvdXRwdXRfZGVzYzsKLSAgaW50IHJldHJpZXMsIHNsZWVwX2ludGVydmFsOwotICAvKiBQaXBlIHdhaXRpbmcgZnJvbSBsYXN0IHByb2Nlc3MsIHRvIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRoZSBuZXh0IG9uZS4KLSAgICAgVmFsdWUgaXMgU1RESU5fRklMRV9OTyBpZiBubyBwaXBlIGlzIHdhaXRpbmcKLSAgICAgKGkuZS4gdGhlIG5leHQgY29tbWFuZCBpcyB0aGUgZmlyc3Qgb2YgYSBncm91cCkuICAqLwotICBzdGF0aWMgaW50IGxhc3RfcGlwZV9pbnB1dDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBwcm9jZXNzLCBpbml0aWFsaXplLiAgKi8KLSAgaWYgKGZsYWdzICYgUEVYRUNVVEVfRklSU1QpCi0gICAgbGFzdF9waXBlX2lucHV0ID0gU1RESU5fRklMRV9OTzsKLQotICBpbnB1dF9kZXNjID0gbGFzdF9waXBlX2lucHV0OwotCi0gIC8qIElmIHRoaXMgaXNuJ3QgdGhlIGxhc3QgcHJvY2VzcywgbWFrZSBhIHBpcGUgZm9yIGl0cyBvdXRwdXQsCi0gICAgIGFuZCByZWNvcmQgaXQgYXMgd2FpdGluZyB0byBiZSB0aGUgaW5wdXQgdG8gdGhlIG5leHQgcHJvY2Vzcy4gICovCi0gIGlmICghIChmbGFncyAmIFBFWEVDVVRFX0xBU1QpKQotICAgIHsKLSAgICAgIGlmIChwaXBlIChwZGVzKSA8IDApCi0JewotCSAgKmVycm1zZ19mbXQgPSAicGlwZSI7Ci0JICAqZXJybXNnX2FyZyA9IE5VTEw7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgb3V0cHV0X2Rlc2MgPSBwZGVzW1dSSVRFX1BPUlRdOwotICAgICAgbGFzdF9waXBlX2lucHV0ID0gcGRlc1tSRUFEX1BPUlRdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIExhc3QgcHJvY2Vzcy4gICovCi0gICAgICBvdXRwdXRfZGVzYyA9IFNURE9VVF9GSUxFX05POwotICAgICAgbGFzdF9waXBlX2lucHV0ID0gU1RESU5fRklMRV9OTzsKLSAgICB9Ci0KLSAgLyogRm9yayBhIHN1YnByb2Nlc3M7IHdhaXQgYW5kIHJldHJ5IGlmIGl0IGZhaWxzLiAgKi8KLSAgc2xlZXBfaW50ZXJ2YWwgPSAxOwotICBmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgNDsgcmV0cmllcysrKQotICAgIHsKLSAgICAgIHBpZCA9IHZmb3JrICgpOwotICAgICAgaWYgKHBpZCA+PSAwKQotCWJyZWFrOwotICAgICAgc2xlZXAgKHNsZWVwX2ludGVydmFsKTsKLSAgICAgIHNsZWVwX2ludGVydmFsICo9IDI7Ci0gICAgfQotCi0gIHN3aXRjaCAocGlkKQotICAgIHsKLSAgICBjYXNlIC0xOgotICAgICAgewotCSplcnJtc2dfZm10ID0gVkZPUktfU1RSSU5HOwotCSplcnJtc2dfYXJnID0gTlVMTDsKLQlyZXR1cm4gLTE7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDA6IC8qIGNoaWxkICovCi0gICAgICAvKiBNb3ZlIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHBpcGVzIGludG8gcGxhY2UsIGlmIG5lY2Vzc2FyeS4gICovCi0gICAgICBpZiAoaW5wdXRfZGVzYyAhPSBTVERJTl9GSUxFX05PKQotCXsKLQkgIGNsb3NlIChTVERJTl9GSUxFX05PKTsKLQkgIGR1cCAoaW5wdXRfZGVzYyk7Ci0JICBjbG9zZSAoaW5wdXRfZGVzYyk7Ci0JfQotICAgICAgaWYgKG91dHB1dF9kZXNjICE9IFNURE9VVF9GSUxFX05PKQotCXsKLQkgIGNsb3NlIChTVERPVVRfRklMRV9OTyk7Ci0JICBkdXAgKG91dHB1dF9kZXNjKTsKLQkgIGNsb3NlIChvdXRwdXRfZGVzYyk7Ci0JfQotCi0gICAgICAvKiBDbG9zZSB0aGUgcGFyZW50J3MgZGVzY3MgdGhhdCBhcmVuJ3Qgd2FudGVkIGhlcmUuICAqLwotICAgICAgaWYgKGxhc3RfcGlwZV9pbnB1dCAhPSBTVERJTl9GSUxFX05PKQotCWNsb3NlIChsYXN0X3BpcGVfaW5wdXQpOwotCi0gICAgICAvKiBFeGVjIHRoZSBwcm9ncmFtLiAgKi8KLSAgICAgICgqZnVuYykgKHByb2dyYW0sIGFyZ3YpOwotCi0gICAgICAvKiBOb3RlOiBDYWxsaW5nIGZwcmludGYgYW5kIGV4aXQgaGVyZSBkb2Vzbid0IHNlZW0gcmlnaHQgZm9yIHZmb3JrLiAgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCB0aGlzX3BuYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgaW5zdGFsbF9lcnJvcl9tc2csIHByb2dyYW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiOiAlc1xuIiwgeHN0cmVycm9yIChlcnJubykpOwotICAgICAgZXhpdCAoLTEpOwotICAgICAgLyogTk9UUkVBQ0hFRCAqLwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogSW4gdGhlIHBhcmVudCwgYWZ0ZXIgZm9ya2luZy4KLQkgQ2xvc2UgdGhlIGRlc2NyaXB0b3JzIHRoYXQgd2UgbWFkZSBmb3IgdGhpcyBjaGlsZC4gICovCi0gICAgICBpZiAoaW5wdXRfZGVzYyAhPSBTVERJTl9GSUxFX05PKQotCWNsb3NlIChpbnB1dF9kZXNjKTsKLSAgICAgIGlmIChvdXRwdXRfZGVzYyAhPSBTVERPVVRfRklMRV9OTykKLQljbG9zZSAob3V0cHV0X2Rlc2MpOwotCi0gICAgICAvKiBSZXR1cm4gY2hpbGQncyBwcm9jZXNzIG51bWJlci4gICovCi0gICAgICByZXR1cm4gcGlkOwotICAgIH0KLX0KLQotaW50Ci1wd2FpdCAocGlkLCBzdGF0dXMsIGZsYWdzKQotICAgICBpbnQgcGlkOwotICAgICBpbnQgKnN0YXR1czsKLSAgICAgaW50IGZsYWdzIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIC8qID8/PyBIZXJlJ3MgYW4gb3Bwb3J0dW5pdHkgdG8gY2Fub25pY2FsaXplIHRoZSB2YWx1ZXMgaW4gU1RBVFVTLgotICAgICBOZWVkZWQ/ICAqLwotI2lmZGVmIFZNUwotICBwaWQgPSB3YWl0cGlkICgtMSwgc3RhdHVzLCAwKTsKLSNlbHNlCi0gIHBpZCA9IHdhaXQgKHN0YXR1cyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHBpZDsKLX0KLQotI2VuZGlmIC8qICEgX19NU0RPU19fICYmICEgT1MyICYmICEgTVBXICYmICEgKF9XSU4zMiAmJiAhIF9fVVdJTl9fKSAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3JhbmRvbS5jIGIvbGliaWJlcnR5L3JhbmRvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTk1MDcwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9yYW5kb20uYworKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKLSAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCi0gKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCi0gKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCi0gKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQotICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLS8qCi0gKiBUaGlzIGlzIGRlcml2ZWQgZnJvbSB0aGUgQmVya2VsZXkgc291cmNlOgotICoJQCgjKXJhbmRvbS5jCTUuNSAoQmVya2VsZXkpIDcvNi84OAotICogSXQgd2FzIHJld29ya2VkIGZvciB0aGUgR05VIEMgTGlicmFyeSBieSBSb2xhbmQgTWNHcmF0aC4KLSAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2lmIDAKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNlbHNlCi0KLSNkZWZpbmUJVUxPTkdfTUFYICAoKHVuc2lnbmVkIGxvbmcpKH4wTCkpICAgICAvKiAweEZGRkZGRkZGIGZvciAzMi1iaXRzICovCi0jZGVmaW5lCUxPTkdfTUFYICAgKChsb25nKShVTE9OR19NQVggPj4gMSkpICAgLyogMHg3RkZGRkZGRiBmb3IgMzItYml0cyovCi0KLSNpZmRlZiBfX1NURENfXwotIyAgZGVmaW5lIFBUUiB2b2lkICoKLSMgIGlmbmRlZiBOVUxMCi0jICAgIGRlZmluZSBOVUxMICh2b2lkICopIDAKLSMgIGVuZGlmCi0jZWxzZQotIyAgZGVmaW5lIFBUUiBjaGFyICoKLSMgIGlmbmRlZiBOVUxMCi0jICAgIGRlZmluZSBOVUxMICh2b2lkICopIDAKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2VuZGlmCi0KLWxvbmcgaW50IHJhbmRvbSAoKTsKLQotLyogQW4gaW1wcm92ZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIHBhY2thZ2UuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQKLSAgIHJhbmQoKS9zcmFuZCgpIGxpa2UgaW50ZXJmYWNlLCB0aGlzIHBhY2thZ2UgYWxzbyBoYXMgYSBzcGVjaWFsIHN0YXRlIGluZm8KLSAgIGludGVyZmFjZS4gIFRoZSBpbml0c3RhdGUoKSByb3V0aW5lIGlzIGNhbGxlZCB3aXRoIGEgc2VlZCwgYW4gYXJyYXkgb2YKLSAgIGJ5dGVzLCBhbmQgYSBjb3VudCBvZiBob3cgbWFueSBieXRlcyBhcmUgYmVpbmcgcGFzc2VkIGluOyB0aGlzIGFycmF5IGlzCi0gICB0aGVuIGluaXRpYWxpemVkIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gZm9yIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiB3aXRoCi0gICB0aGF0IG11Y2ggc3RhdGUgaW5mb3JtYXRpb24uICBHb29kIHNpemVzIGZvciB0aGUgYW1vdW50IG9mIHN0YXRlCi0gICBpbmZvcm1hdGlvbiBhcmUgMzIsIDY0LCAxMjgsIGFuZCAyNTYgYnl0ZXMuICBUaGUgc3RhdGUgY2FuIGJlIHN3aXRjaGVkIGJ5Ci0gICBjYWxsaW5nIHRoZSBzZXRzdGF0ZSgpIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgYXJyYXkgYXMgd2FzIGluaXRpYWxsaXplZAotICAgd2l0aCBpbml0c3RhdGUoKS4gIEJ5IGRlZmF1bHQsIHRoZSBwYWNrYWdlIHJ1bnMgd2l0aCAxMjggYnl0ZXMgb2Ygc3RhdGUKLSAgIGluZm9ybWF0aW9uIGFuZCBnZW5lcmF0ZXMgZmFyIGJldHRlciByYW5kb20gbnVtYmVycyB0aGFuIGEgbGluZWFyCi0gICBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yLiAgSWYgdGhlIGFtb3VudCBvZiBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBsZXNzIHRoYW4KLSAgIDMyIGJ5dGVzLCBhIHNpbXBsZSBsaW5lYXIgY29uZ3J1ZW50aWFsIFIuTi5HLiBpcyB1c2VkLiAgSW50ZXJuYWxseSwgdGhlCi0gICBzdGF0ZSBpbmZvcm1hdGlvbiBpcyB0cmVhdGVkIGFzIGFuIGFycmF5IG9mIGxvbmdzOyB0aGUgemVyb2V0aCBlbGVtZW50IG9mCi0gICB0aGUgYXJyYXkgaXMgdGhlIHR5cGUgb2YgUi5OLkcuIGJlaW5nIHVzZWQgKHNtYWxsIGludGVnZXIpOyB0aGUgcmVtYWluZGVyCi0gICBvZiB0aGUgYXJyYXkgaXMgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgUi5OLkcuICBUaHVzLCAzMiBieXRlcyBvZgotICAgc3RhdGUgaW5mb3JtYXRpb24gd2lsbCBnaXZlIDcgbG9uZ3Mgd29ydGggb2Ygc3RhdGUgaW5mb3JtYXRpb24sIHdoaWNoIHdpbGwKLSAgIGFsbG93IGEgZGVncmVlIHNldmVuIHBvbHlub21pYWwuICAoTm90ZTogVGhlIHplcm9ldGggd29yZCBvZiBzdGF0ZQotICAgaW5mb3JtYXRpb24gYWxzbyBoYXMgc29tZSBvdGhlciBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gaXQ7IHNlZSBzZXRzdGF0ZQotICAgZm9yIGRldGFpbHMpLiAgVGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiB0ZWNobmlxdWUgaXMgYSBsaW5lYXIgZmVlZGJhY2sKLSAgIHNoaWZ0IHJlZ2lzdGVyIGFwcHJvYWNoLCBlbXBsb3lpbmcgdHJpbm9taWFscyAoc2luY2UgdGhlcmUgYXJlIGZld2VyIHRlcm1zCi0gICB0byBzdW0gdXAgdGhhdCB3YXkpLiAgSW4gdGhpcyBhcHByb2FjaCwgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZiBhbGwKLSAgIHRoZSBudW1iZXJzIGluIHRoZSBzdGF0ZSB0YWJsZSB3aWxsIGFjdCBhcyBhIGxpbmVhciBmZWVkYmFjayBzaGlmdCByZWdpc3RlciwKLSAgIGFuZCB3aWxsIGhhdmUgcGVyaW9kIDJeZGVnIC0gMSAod2hlcmUgZGVnIGlzIHRoZSBkZWdyZWUgb2YgdGhlIHBvbHlub21pYWwKLSAgIGJlaW5nIHVzZWQsIGFzc3VtaW5nIHRoYXQgdGhlIHBvbHlub21pYWwgaXMgaXJyZWR1Y2libGUgYW5kIHByaW1pdGl2ZSkuCi0gICBUaGUgaGlnaGVyIG9yZGVyIGJpdHMgd2lsbCBoYXZlIGxvbmdlciBwZXJpb2RzLCBzaW5jZSB0aGVpciB2YWx1ZXMgYXJlCi0gICBhbHNvIGluZmx1ZW5jZWQgYnkgcHNldWRvLXJhbmRvbSBjYXJyaWVzIG91dCBvZiB0aGUgbG93ZXIgYml0cy4gIFRoZQotICAgdG90YWwgcGVyaW9kIG9mIHRoZSBnZW5lcmF0b3IgaXMgYXBwcm94aW1hdGVseSBkZWcqKDIqKmRlZyAtIDEpOyB0aHVzCi0gICBkb3VibGluZyB0aGUgYW1vdW50IG9mIHN0YXRlIGluZm9ybWF0aW9uIGhhcyBhIHZhc3QgaW5mbHVlbmNlIG9uIHRoZQotICAgcGVyaW9kIG9mIHRoZSBnZW5lcmF0b3IuICBOb3RlOiBUaGUgZGVnKigyKipkZWcgLSAxKSBpcyBhbiBhcHByb3hpbWF0aW9uCi0gICBvbmx5IGdvb2QgZm9yIGxhcmdlIGRlZywgd2hlbiB0aGUgcGVyaW9kIG9mIHRoZSBzaGlmdCByZWdpc3RlciBpcyB0aGUKLSAgIGRvbWluYW50IGZhY3Rvci4gIFdpdGggZGVnIGVxdWFsIHRvIHNldmVuLCB0aGUgcGVyaW9kIGlzIGFjdHVhbGx5IG11Y2gKLSAgIGxvbmdlciB0aGFuIHRoZSA3KigyKio3IC0gMSkgcHJlZGljdGVkIGJ5IHRoaXMgZm9ybXVsYS4gICovCi0KLQotCi0vKiBGb3IgZWFjaCBvZiB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMsIHdlIGhhdmUgYQotICAgYnJlYWsgdmFsdWUgb24gdGhlIGFtb3VudCBvZiBzdGF0ZSBpbmZvcm1hdGlvbiAoeW91IG5lZWQgYXQgbGVhc3QgdGhpCi0gICBieXRlcyBvZiBzdGF0ZSBpbmZvIHRvIHN1cHBvcnQgdGhpcyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciksIGEgZGVncmVlIGZvcgotICAgdGhlIHBvbHlub21pYWwgKGFjdHVhbGx5IGEgdHJpbm9taWFsKSB0aGF0IHRoZSBSLk4uRy4gaXMgYmFzZWQgb24sIGFuZAotICAgc2VwYXJhdGlvbiBiZXR3ZWVuIHRoZSB0d28gbG93ZXIgb3JkZXIgY29lZmZpY2llbnRzIG9mIHRoZSB0cmlub21pYWwuICAqLwotCi0vKiBMaW5lYXIgY29uZ3J1ZW50aWFsLiAgKi8KLSNkZWZpbmUJVFlQRV8wCQkwCi0jZGVmaW5lCUJSRUFLXzAJCTgKLSNkZWZpbmUJREVHXzAJCTAKLSNkZWZpbmUJU0VQXzAJCTAKLQotLyogeCoqNyArIHgqKjMgKyAxLiAgKi8KLSNkZWZpbmUJVFlQRV8xCQkxCi0jZGVmaW5lCUJSRUFLXzEJCTMyCi0jZGVmaW5lCURFR18xCQk3Ci0jZGVmaW5lCVNFUF8xCQkzCi0KLS8qIHgqKjE1ICsgeCArIDEuICAqLwotI2RlZmluZQlUWVBFXzIJCTIKLSNkZWZpbmUJQlJFQUtfMgkJNjQKLSNkZWZpbmUJREVHXzIJCTE1Ci0jZGVmaW5lCVNFUF8yCQkxCi0KLS8qIHgqKjMxICsgeCoqMyArIDEuICAqLwotI2RlZmluZQlUWVBFXzMJCTMKLSNkZWZpbmUJQlJFQUtfMwkJMTI4Ci0jZGVmaW5lCURFR18zCQkzMQotI2RlZmluZQlTRVBfMwkJMwotCi0vKiB4Kio2MyArIHggKyAxLiAgKi8KLSNkZWZpbmUJVFlQRV80CQk0Ci0jZGVmaW5lCUJSRUFLXzQJCTI1NgotI2RlZmluZQlERUdfNAkJNjMKLSNkZWZpbmUJU0VQXzQJCTEKLQotCi0vKiBBcnJheSB2ZXJzaW9ucyBvZiB0aGUgYWJvdmUgaW5mb3JtYXRpb24gdG8gbWFrZSBjb2RlIHJ1biBmYXN0ZXIuCi0gICBSZWxpZXMgb24gZmFjdCB0aGF0IFRZUEVfaSA9PSBpLiAgKi8KLQotI2RlZmluZQlNQVhfVFlQRVMJNQkvKiBNYXggbnVtYmVyIG9mIHR5cGVzIGFib3ZlLiAgKi8KLQotc3RhdGljIGludCBkZWdyZWVzW01BWF9UWVBFU10gPSB7IERFR18wLCBERUdfMSwgREVHXzIsIERFR18zLCBERUdfNCB9Owotc3RhdGljIGludCBzZXBzW01BWF9UWVBFU10gPSB7IFNFUF8wLCBTRVBfMSwgU0VQXzIsIFNFUF8zLCBTRVBfNCB9OwotCi0KLQotLyogSW5pdGlhbGx5LCBldmVyeXRoaW5nIGlzIHNldCB1cCBhcyBpZiBmcm9tOgotCWluaXRzdGF0ZSgxLCByYW5kdGJsLCAxMjgpOwotICAgTm90ZSB0aGF0IHRoaXMgaW5pdGlhbGl6YXRpb24gdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgc3JhbmRvbQotICAgYWR2YW5jZXMgdGhlIGZyb250IGFuZCByZWFyIHBvaW50ZXJzIDEwKnJhbmRfZGVnIHRpbWVzLCBhbmQgaGVuY2UgdGhlCi0gICByZWFyIHBvaW50ZXIgd2hpY2ggc3RhcnRzIGF0IDAgd2lsbCBhbHNvIGVuZCB1cCBhdCB6ZXJvOyB0aHVzIHRoZSB6ZXJvZXRoCi0gICBlbGVtZW50IG9mIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiwgd2hpY2ggY29udGFpbnMgaW5mbyBhYm91dCB0aGUgY3VycmVudAotICAgcG9zaXRpb24gb2YgdGhlIHJlYXIgcG9pbnRlciBpcyBqdXN0Ci0JKE1BWF9UWVBFUyAqIChycHRyIC0gc3RhdGUpKSArIFRZUEVfMyA9PSBUWVBFXzMuICAqLwotCi1zdGF0aWMgbG9uZyBpbnQgcmFuZHRibFtERUdfMyArIDFdID0KLSAgeyBUWVBFXzMsCi0gICAgICAweDlhMzE5MDM5LCAweDMyZDljMDI0LCAweDliNjYzMTgyLCAweDVkYTFmMzQyLCAKLSAgICAgIDB4ZGUzYjgxZTAsIDB4ZGYwYTZmYjUsIDB4ZjEwM2JjMDIsIDB4NDhmMzQwZmIsIAotICAgICAgMHg3NDQ5ZTU2YiwgMHhiZWIxZGJiMCwgMHhhYjVjNTkxOCwgMHg5NDY1NTRmZCwgCi0gICAgICAweDhjMmU2ODBmLCAweGViM2Q3OTlmLCAweGIxMWVlMGI3LCAweDJkNDM2Yjg2LCAKLSAgICAgIDB4ZGE2NzJlMmEsIDB4MTU4OGNhODgsIDB4ZTM2OTczNWQsIDB4OTA0ZjM1ZjcsIAotICAgICAgMHhkNzE1OGZkNiwgMHg2ZmE2ZjA1MSwgMHg2MTZlNmI5NiwgMHhhYzk0ZWZkYywgCi0gICAgICAweDM2NDEzZjkzLCAweGM2MjJjMjk4LCAweGY1YTQyYWI4LCAweDhhODhkNzdiLCAKLSAgICAgIDB4ZjVhZDlkMGUsIDB4ODk5OTIyMGIsIDB4MjdmYjQ3YjkKLSAgICB9OwotCi0vKiBGUFRSIGFuZCBSUFRSIGFyZSB0d28gcG9pbnRlcnMgaW50byB0aGUgc3RhdGUgaW5mbywgYSBmcm9udCBhbmQgYSByZWFyCi0gICBwb2ludGVyLiAgVGhlc2UgdHdvIHBvaW50ZXJzIGFyZSBhbHdheXMgcmFuZF9zZXAgcGxhY2VzIGFwYXJ0cywgYXMgdGhleQotICAgY3ljbGUgdGhyb3VnaCB0aGUgc3RhdGUgaW5mb3JtYXRpb24uICAoWWVzLCB0aGlzIGRvZXMgbWVhbiB3ZSBjb3VsZCBnZXQKLSAgIGF3YXkgd2l0aCBqdXN0IG9uZSBwb2ludGVyLCBidXQgdGhlIGNvZGUgZm9yIHJhbmRvbSBpcyBtb3JlIGVmZmljaWVudAotICAgdGhpcyB3YXkpLiAgVGhlIHBvaW50ZXJzIGFyZSBsZWZ0IHBvc2l0aW9uZWQgYXMgdGhleSB3b3VsZCBiZSBmcm9tIHRoZSBjYWxsOgotCWluaXRzdGF0ZSgxLCByYW5kdGJsLCAxMjgpOwotICAgKFRoZSBwb3NpdGlvbiBvZiB0aGUgcmVhciBwb2ludGVyLCBycHRyLCBpcyByZWFsbHkgMCAoYXMgZXhwbGFpbmVkIGFib3ZlCi0gICBpbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgcmFuZHRibCkgYmVjYXVzZSB0aGUgc3RhdGUgdGFibGUgcG9pbnRlciBpcyBzZXQKLSAgIHRvIHBvaW50IHRvIHJhbmR0YmxbMV0gKGFzIGV4cGxhaW5lZCBiZWxvdykuKSAgKi8KLQotc3RhdGljIGxvbmcgaW50ICpmcHRyID0gJnJhbmR0YmxbU0VQXzMgKyAxXTsKLXN0YXRpYyBsb25nIGludCAqcnB0ciA9ICZyYW5kdGJsWzFdOwotCi0KLQotLyogVGhlIGZvbGxvd2luZyB0aGluZ3MgYXJlIHRoZSBwb2ludGVyIHRvIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiB0YWJsZSwKLSAgIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IGdlbmVyYXRvciwgdGhlIGRlZ3JlZSBvZiB0aGUgY3VycmVudCBwb2x5bm9taWFsCi0gICBiZWluZyB1c2VkLCBhbmQgdGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzLgotICAgTm90ZSB0aGF0IGZvciBlZmZpY2llbmN5IG9mIHJhbmRvbSwgd2UgcmVtZW1iZXIgdGhlIGZpcnN0IGxvY2F0aW9uIG9mCi0gICB0aGUgc3RhdGUgaW5mb3JtYXRpb24sIG5vdCB0aGUgemVyb2V0aC4gIEhlbmNlIGl0IGlzIHZhbGlkIHRvIGFjY2VzcwotICAgc3RhdGVbLTFdLCB3aGljaCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0eXBlIG9mIHRoZSBSLk4uRy4KLSAgIEFsc28sIHdlIHJlbWVtYmVyIHRoZSBsYXN0IGxvY2F0aW9uLCBzaW5jZSB0aGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KLSAgIGluZGV4aW5nIGV2ZXJ5IHRpbWUgdG8gZmluZCB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBlbGVtZW50IHRvIHNlZSBpZgotICAgdGhlIGZyb250IGFuZCByZWFyIHBvaW50ZXJzIGhhdmUgd3JhcHBlZC4gICovCi0KLXN0YXRpYyBsb25nIGludCAqc3RhdGUgPSAmcmFuZHRibFsxXTsKLQotc3RhdGljIGludCByYW5kX3R5cGUgPSBUWVBFXzM7Ci1zdGF0aWMgaW50IHJhbmRfZGVnID0gREVHXzM7Ci1zdGF0aWMgaW50IHJhbmRfc2VwID0gU0VQXzM7Ci0KLXN0YXRpYyBsb25nIGludCAqZW5kX3B0ciA9ICZyYW5kdGJsW3NpemVvZihyYW5kdGJsKSAvIHNpemVvZihyYW5kdGJsWzBdKV07Ci0MCi0vKiBJbml0aWFsaXplIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2VlZC4gIElmIHRoZQotICAgdHlwZSBpcyB0aGUgdHJpdmlhbCBuby1zdGF0ZS1pbmZvcm1hdGlvbiB0eXBlLCBqdXN0IHJlbWVtYmVyIHRoZSBzZWVkLgotICAgT3RoZXJ3aXNlLCBpbml0aWFsaXplcyBzdGF0ZVtdIGJhc2VkIG9uIHRoZSBnaXZlbiAic2VlZCIgdmlhIGEgbGluZWFyCi0gICBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yLiAgVGhlbiwgdGhlIHBvaW50ZXJzIGFyZSBzZXQgdG8ga25vd24gbG9jYXRpb25zCi0gICB0aGF0IGFyZSBleGFjdGx5IHJhbmRfc2VwIHBsYWNlcyBhcGFydC4gIExhc3RseSwgaXQgY3ljbGVzIHRoZSBzdGF0ZQotICAgaW5mb3JtYXRpb24gYSBnaXZlbiBudW1iZXIgb2YgdGltZXMgdG8gZ2V0IHJpZCBvZiBhbnkgaW5pdGlhbCBkZXBlbmRlbmNpZXMKLSAgIGludHJvZHVjZWQgYnkgdGhlIEwuQy5SLk4uRy4gIE5vdGUgdGhhdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgcmFuZHRibFtdCi0gICBmb3IgZGVmYXVsdCB1c2FnZSByZWxpZXMgb24gdmFsdWVzIHByb2R1Y2VkIGJ5IHRoaXMgcm91dGluZS4gICovCi12b2lkCi1zcmFuZG9tICh4KQotICB1bnNpZ25lZCBpbnQgeDsKLXsKLSAgc3RhdGVbMF0gPSB4OwotICBpZiAocmFuZF90eXBlICE9IFRZUEVfMCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBsb25nIGludCBpOwotICAgICAgZm9yIChpID0gMTsgaSA8IHJhbmRfZGVnOyArK2kpCi0Jc3RhdGVbaV0gPSAoMTEwMzUxNTE0NSAqIHN0YXRlW2kgLSAxXSkgKyAxMjM0NTsKLSAgICAgIGZwdHIgPSAmc3RhdGVbcmFuZF9zZXBdOwotICAgICAgcnB0ciA9ICZzdGF0ZVswXTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAxMCAqIHJhbmRfZGVnOyArK2kpCi0JcmFuZG9tKCk7Ci0gICAgfQotfQotDAotLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGUgaW5mb3JtYXRpb24gaW4gdGhlIGdpdmVuIGFycmF5IG9mIE4gYnl0ZXMgZm9yCi0gICBmdXR1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uLiAgQmFzZWQgb24gdGhlIG51bWJlciBvZiBieXRlcyB3ZQotICAgYXJlIGdpdmVuLCBhbmQgdGhlIGJyZWFrIHZhbHVlcyBmb3IgdGhlIGRpZmZlcmVudCBSLk4uRy4ncywgd2UgY2hvb3NlCi0gICB0aGUgYmVzdCAobGFyZ2VzdCkgb25lIHdlIGNhbiBhbmQgc2V0IHRoaW5ncyB1cCBmb3IgaXQuICBzcmFuZG9tIGlzCi0gICB0aGVuIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbi4gIE5vdGUgdGhhdCBvbiByZXR1cm4KLSAgIGZyb20gc3JhbmRvbSwgd2Ugc2V0IHN0YXRlWy0xXSB0byBiZSB0aGUgdHlwZSBtdWx0aXBsZXhlZCB3aXRoIHRoZSBjdXJyZW50Ci0gICB2YWx1ZSBvZiB0aGUgcmVhciBwb2ludGVyOyB0aGlzIGlzIHNvIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gaW5pdHN0YXRlIHdvbid0Ci0gICBsb3NlIHRoaXMgaW5mb3JtYXRpb24gYW5kIHdpbGwgYmUgYWJsZSB0byByZXN0YXJ0IHdpdGggc2V0c3RhdGUuCi0gICBOb3RlOiBUaGUgZmlyc3QgdGhpbmcgd2UgZG8gaXMgc2F2ZSB0aGUgY3VycmVudCBzdGF0ZSwgaWYgYW55LCBqdXN0IGxpa2UKLSAgIHNldHN0YXRlIHNvIHRoYXQgaXQgZG9lc24ndCBtYXR0ZXIgd2hlbiBpbml0c3RhdGUgaXMgY2FsbGVkLgotICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG9sZCBzdGF0ZS4gICovCi1QVFIKLWluaXRzdGF0ZSAoc2VlZCwgYXJnX3N0YXRlLCBuKQotICB1bnNpZ25lZCBpbnQgc2VlZDsKLSAgUFRSIGFyZ19zdGF0ZTsKLSAgdW5zaWduZWQgbG9uZyBuOwotewotICBQVFIgb3N0YXRlID0gKFBUUikgJnN0YXRlWy0xXTsKLQotICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKLSAgICBzdGF0ZVstMV0gPSByYW5kX3R5cGU7Ci0gIGVsc2UKLSAgICBzdGF0ZVstMV0gPSAoTUFYX1RZUEVTICogKHJwdHIgLSBzdGF0ZSkpICsgcmFuZF90eXBlOwotICBpZiAobiA8IEJSRUFLXzEpCi0gICAgewotICAgICAgaWYgKG4gPCBCUkVBS18wKQotCXsKLQkgIGVycm5vID0gRUlOVkFMOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgcmFuZF90eXBlID0gVFlQRV8wOwotICAgICAgcmFuZF9kZWcgPSBERUdfMDsKLSAgICAgIHJhbmRfc2VwID0gU0VQXzA7Ci0gICAgfQotICBlbHNlIGlmIChuIDwgQlJFQUtfMikKLSAgICB7Ci0gICAgICByYW5kX3R5cGUgPSBUWVBFXzE7Ci0gICAgICByYW5kX2RlZyA9IERFR18xOwotICAgICAgcmFuZF9zZXAgPSBTRVBfMTsKLSAgICB9Ci0gIGVsc2UgaWYgKG4gPCBCUkVBS18zKQotICAgIHsKLSAgICAgIHJhbmRfdHlwZSA9IFRZUEVfMjsKLSAgICAgIHJhbmRfZGVnID0gREVHXzI7Ci0gICAgICByYW5kX3NlcCA9IFNFUF8yOwotICAgIH0KLSAgZWxzZSBpZiAobiA8IEJSRUFLXzQpCi0gICAgewotICAgICAgcmFuZF90eXBlID0gVFlQRV8zOwotICAgICAgcmFuZF9kZWcgPSBERUdfMzsKLSAgICAgIHJhbmRfc2VwID0gU0VQXzM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmFuZF90eXBlID0gVFlQRV80OwotICAgICAgcmFuZF9kZWcgPSBERUdfNDsKLSAgICAgIHJhbmRfc2VwID0gU0VQXzQ7Ci0gICAgfQotCi0gIHN0YXRlID0gJigobG9uZyBpbnQgKikgYXJnX3N0YXRlKVsxXTsJLyogRmlyc3QgbG9jYXRpb24uICAqLwotICAvKiBNdXN0IHNldCBFTkRfUFRSIGJlZm9yZSBzcmFuZG9tLiAgKi8KLSAgZW5kX3B0ciA9ICZzdGF0ZVtyYW5kX2RlZ107Ci0gIHNyYW5kb20oc2VlZCk7Ci0gIGlmIChyYW5kX3R5cGUgPT0gVFlQRV8wKQotICAgIHN0YXRlWy0xXSA9IHJhbmRfdHlwZTsKLSAgZWxzZQotICAgIHN0YXRlWy0xXSA9IChNQVhfVFlQRVMgKiAocnB0ciAtIHN0YXRlKSkgKyByYW5kX3R5cGU7Ci0KLSAgcmV0dXJuIG9zdGF0ZTsKLX0KLQwKLS8qIFJlc3RvcmUgdGhlIHN0YXRlIGZyb20gdGhlIGdpdmVuIHN0YXRlIGFycmF5LgotICAgTm90ZTogSXQgaXMgaW1wb3J0YW50IHRoYXQgd2UgYWxzbyByZW1lbWJlciB0aGUgbG9jYXRpb25zIG9mIHRoZSBwb2ludGVycwotICAgaW4gdGhlIGN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24sIGFuZCByZXN0b3JlIHRoZSBsb2NhdGlvbnMgb2YgdGhlIHBvaW50ZXJzCi0gICBmcm9tIHRoZSBvbGQgc3RhdGUgaW5mb3JtYXRpb24uICBUaGlzIGlzIGRvbmUgYnkgbXVsdGlwbGV4aW5nIHRoZSBwb2ludGVyCi0gICBsb2NhdGlvbiBpbnRvIHRoZSB6ZXJvZXRoIHdvcmQgb2YgdGhlIHN0YXRlIGluZm9ybWF0aW9uLiBOb3RlIHRoYXQgZHVlCi0gICB0byB0aGUgb3JkZXIgaW4gd2hpY2ggdGhpbmdzIGFyZSBkb25lLCBpdCBpcyBPSyB0byBjYWxsIHNldHN0YXRlIHdpdGggdGhlCi0gICBzYW1lIHN0YXRlIGFzIHRoZSBjdXJyZW50IHN0YXRlCi0gICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgb2xkIHN0YXRlIGluZm9ybWF0aW9uLiAgKi8KLQotUFRSCi1zZXRzdGF0ZSAoYXJnX3N0YXRlKQotICBQVFIgYXJnX3N0YXRlOwotewotICByZWdpc3RlciBsb25nIGludCAqbmV3X3N0YXRlID0gKGxvbmcgaW50ICopIGFyZ19zdGF0ZTsKLSAgcmVnaXN0ZXIgaW50IHR5cGUgPSBuZXdfc3RhdGVbMF0gJSBNQVhfVFlQRVM7Ci0gIHJlZ2lzdGVyIGludCByZWFyID0gbmV3X3N0YXRlWzBdIC8gTUFYX1RZUEVTOwotICBQVFIgb3N0YXRlID0gKFBUUikgJnN0YXRlWy0xXTsKLQotICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKLSAgICBzdGF0ZVstMV0gPSByYW5kX3R5cGU7Ci0gIGVsc2UKLSAgICBzdGF0ZVstMV0gPSAoTUFYX1RZUEVTICogKHJwdHIgLSBzdGF0ZSkpICsgcmFuZF90eXBlOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBUWVBFXzA6Ci0gICAgY2FzZSBUWVBFXzE6Ci0gICAgY2FzZSBUWVBFXzI6Ci0gICAgY2FzZSBUWVBFXzM6Ci0gICAgY2FzZSBUWVBFXzQ6Ci0gICAgICByYW5kX3R5cGUgPSB0eXBlOwotICAgICAgcmFuZF9kZWcgPSBkZWdyZWVzW3R5cGVdOwotICAgICAgcmFuZF9zZXAgPSBzZXBzW3R5cGVdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFN0YXRlIGluZm8gbXVuZ2VkLiAgKi8KLSAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHN0YXRlID0gJm5ld19zdGF0ZVsxXTsKLSAgaWYgKHJhbmRfdHlwZSAhPSBUWVBFXzApCi0gICAgewotICAgICAgcnB0ciA9ICZzdGF0ZVtyZWFyXTsKLSAgICAgIGZwdHIgPSAmc3RhdGVbKHJlYXIgKyByYW5kX3NlcCkgJSByYW5kX2RlZ107Ci0gICAgfQotICAvKiBTZXQgZW5kX3B0ciB0b28uICAqLwotICBlbmRfcHRyID0gJnN0YXRlW3JhbmRfZGVnXTsKLQotICByZXR1cm4gb3N0YXRlOwotfQotDAotLyogSWYgd2UgYXJlIHVzaW5nIHRoZSB0cml2aWFsIFRZUEVfMCBSLk4uRy4sIGp1c3QgZG8gdGhlIG9sZCBsaW5lYXIKLSAgIGNvbmdydWVudGlhbCBiaXQuICBPdGhlcndpc2UsIHdlIGRvIG91ciBmYW5jeSB0cmlub21pYWwgc3R1ZmYsIHdoaWNoIGlzIHRoZQotICAgc2FtZSBpbiBhbGwgdGhlciBvdGhlciBjYXNlcyBkdWUgdG8gYWxsIHRoZSBnbG9iYWwgdmFyaWFibGVzIHRoYXQgaGF2ZSBiZWVuCi0gICBzZXQgdXAuICBUaGUgYmFzaWMgb3BlcmF0aW9uIGlzIHRvIGFkZCB0aGUgbnVtYmVyIGF0IHRoZSByZWFyIHBvaW50ZXIgaW50bwotICAgdGhlIG9uZSBhdCB0aGUgZnJvbnQgcG9pbnRlci4gIFRoZW4gYm90aCBwb2ludGVycyBhcmUgYWR2YW5jZWQgdG8gdGhlIG5leHQKLSAgIGxvY2F0aW9uIGN5Y2xpY2FsbHkgaW4gdGhlIHRhYmxlLiAgVGhlIHZhbHVlIHJldHVybmVkIGlzIHRoZSBzdW0gZ2VuZXJhdGVkLAotICAgcmVkdWNlZCB0byAzMSBiaXRzIGJ5IHRocm93aW5nIGF3YXkgdGhlICJsZWFzdCByYW5kb20iIGxvdyBiaXQuCi0gICBOb3RlOiBUaGUgY29kZSB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCBib3RoIHRoZSBmcm9udCBhbmQKLSAgIHJlYXIgcG9pbnRlcnMgY2FuJ3Qgd3JhcCBvbiB0aGUgc2FtZSBjYWxsIGJ5IG5vdCB0ZXN0aW5nIHRoZSByZWFyCi0gICBwb2ludGVyIGlmIHRoZSBmcm9udCBvbmUgaGFzIHdyYXBwZWQuICBSZXR1cm5zIGEgMzEtYml0IHJhbmRvbSBudW1iZXIuICAqLwotCi1sb25nIGludAotcmFuZG9tICgpCi17Ci0gIGlmIChyYW5kX3R5cGUgPT0gVFlQRV8wKQotICAgIHsKLSAgICAgIHN0YXRlWzBdID0gKChzdGF0ZVswXSAqIDExMDM1MTUyNDUpICsgMTIzNDUpICYgTE9OR19NQVg7Ci0gICAgICByZXR1cm4gc3RhdGVbMF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBpbnQgaTsKLSAgICAgICpmcHRyICs9ICpycHRyOwotICAgICAgLyogQ2h1Y2tpbmcgbGVhc3QgcmFuZG9tIGJpdC4gICovCi0gICAgICBpID0gKCpmcHRyID4+IDEpICYgTE9OR19NQVg7Ci0gICAgICArK2ZwdHI7Ci0gICAgICBpZiAoZnB0ciA+PSBlbmRfcHRyKQotCXsKLQkgIGZwdHIgPSBzdGF0ZTsKLQkgICsrcnB0cjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKytycHRyOwotCSAgaWYgKHJwdHIgPj0gZW5kX3B0cikKLQkgICAgcnB0ciA9IHN0YXRlOwotCX0KLSAgICAgIHJldHVybiBpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9yZW5hbWUuYyBiL2xpYmliZXJ0eS9yZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyNmUyZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvcmVuYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiByZW5hbWUgLS0gcmVuYW1lIGEgZmlsZQotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLQotLyogUmVuYW1lIGEgZmlsZS4gICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotCi1pbnQKLXJlbmFtZSAoemZyb20sIHp0bykKLSAgICAgY2hhciAqemZyb207Ci0gICAgIGNoYXIgKnp0bzsKLXsKLSAgaWYgKGxpbmsgKHpmcm9tLCB6dG8pIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKQotCXJldHVybiAtMTsKLSAgICAgIGlmICh1bmxpbmsgKHp0bykgPCAwCi0JICB8fCBsaW5rICh6ZnJvbSwgenRvKSA8IDApCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIHVubGluayAoemZyb20pOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3JpbmRleC5jIGIvbGliaWJlcnR5L3JpbmRleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFkMTI2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9yaW5kZXguYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qIFN0dWIgaW1wbGVtZW50YXRpb24gb2YgKG9ic29sZXRlKSByaW5kZXgoKS4gKi8KLQotZXh0ZXJuIGNoYXIgKnN0cnJjaHIgKCk7Ci0KLWNoYXIgKgotcmluZGV4IChzLCBjKQotICBjaGFyICpzOwotICBpbnQgYzsKLXsKLSAgcmV0dXJuIHN0cnJjaHIgKHMsIGMpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3NpZ3NldG1hc2suYyBiL2xpYmliZXJ0eS9zaWdzZXRtYXNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDllNmEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3NpZ3NldG1hc2suYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qIFZlcnNpb24gb2Ygc2lnc2V0bWFzay5jCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvYW1pbi4gKi8KLQotLyogU2V0IHRoZSBjdXJyZW50IHNpZ25hbCBtYXNrIHRvIHRoZSBzZXQgcHJvdmlkZWQsIGFuZCByZXR1cm4gdGhlIAotICAgcHJldmlvdXMgdmFsdWUgKi8KLQotI2RlZmluZSBfUE9TSVhfU09VUkNFCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLS8qIEluY2x1ZGluZyA8c3lzL3R5cGVzLmg+IHNlZW1zIHRvIGJlIG5lZWRlZCBieSBJU0MuICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpZmRlZiBTSUdfU0VUTUFTSwotaW50Ci1ERUZVTihzaWdzZXRtYXNrLChzZXQpLAotICAgICAgaW50IHNldCkKLXsKLSAgICBzaWdzZXRfdCBuZXc7Ci0gICAgc2lnc2V0X3Qgb2xkOwotICAgIAotICAgIHNpZ2VtcHR5c2V0ICgmbmV3KTsKLSAgICBpZiAoc2V0ICE9IDApIHsKLSAgICAgIGFib3J0KCk7CS8qIEZJWE1FLCB3ZSBkb24ndCBrbm93IGhvdyB0byB0cmFuc2xhdGUgb2xkIG1hc2sgdG8gbmV3ICovCi0gICAgfQotICAgIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmbmV3LCAmb2xkKTsKLSAgICByZXR1cm4gMTsJLyogRklYTUUsIHdlIGFsd2F5cyByZXR1cm4gMSBhcyBvbGQgdmFsdWUuICAqLwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3BhY2VzLmMgYi9saWJpYmVydHkvc3BhY2VzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOTI1NzEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3NwYWNlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyogQWxsb2NhdGUgbWVtb3J5IHJlZ2lvbiBmaWxsZWQgd2l0aCBzcGFjZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotCi1OQU1FCi0KLQlzcGFjZXMgLS0gcmV0dXJuIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBmdWxsIG9mIHNwYWNlcwotCi1TWU5PUFNJUwotCi0JY2hhciAqc3BhY2VzIChpbnQgY291bnQpCi0KLURFU0NSSVBUSU9OCi0KLQlSZXR1cm5zIGEgcG9pbnRlciB0byBhIG1lbW9yeSByZWdpb24gZmlsbGVkIHdpdGggdGhlIHNwZWNpZmllZAotCW51bWJlciBvZiBzcGFjZXMgYW5kIG51bGwgdGVybWluYXRlZC4gIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzCi0JdmFsaWQgdW50aWwgYXQgbGVhc3QgdGhlIG5leHQgY2FsbC4KLQkKLUJVR1MKLQotKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpZiBWTVMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bml4bGliLmg+Ci0jZWxzZQotLyogRm9yIHN5c3RlbXMgd2l0aCBsYXJnZXIgcG9pbnRlcnMgdGhhbiBpbnRzLCB0aGVzZSBtdXN0IGJlIGRlY2xhcmVkLiAgKi8KLWV4dGVybiBQVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotZXh0ZXJuIHZvaWQgZnJlZSBQQVJBTVMgKChQVFIpKTsKLSNlbmRpZgotCi1jb25zdCBjaGFyICoKLXNwYWNlcyAoY291bnQpCi0gIGludCBjb3VudDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqdDsKLSAgc3RhdGljIGNoYXIgKmJ1ZjsKLSAgc3RhdGljIGludCBtYXhzaXplOwotCi0gIGlmIChjb3VudCA+IG1heHNpemUpCi0gICAgewotICAgICAgaWYgKGJ1ZikKLQl7Ci0JICBmcmVlIChidWYpOwotCX0KLSAgICAgIGJ1ZiA9IG1hbGxvYyAoY291bnQgKyAxKTsKLSAgICAgIGlmIChidWYgPT0gKGNoYXIgKikgMCkKLQlyZXR1cm4gMDsKLSAgICAgIGZvciAodCA9IGJ1ZiArIGNvdW50IDsgdCAhPSBidWYgOyApCi0JewotCSAgKi0tdCA9ICcgJzsKLQl9Ci0gICAgICBtYXhzaXplID0gY291bnQ7Ci0gICAgICBidWZbY291bnRdID0gJ1wwJzsKLSAgICB9Ci0gIHJldHVybiAoY29uc3QgY2hhciAqKSAoYnVmICsgbWF4c2l6ZSAtIGNvdW50KTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3NwbGF5LXRyZWUuYyBiL2xpYmliZXJ0eS9zcGxheS10cmVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjZiZDkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3NwbGF5LXRyZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKiBBIHNwbGF5LXRyZWUgZGF0YXR5cGUuICAKLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcmsgTWl0Y2hlbGwgKG1hcmtAbWFya21pdGNoZWxsLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLSAgIAotR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRm9yIGFuIGVhc2lseSByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiBzcGxheS10cmVlcywgc2VlOgotCi0gICAgIExld2lzLCBIYXJyeSBSLiBhbmQgRGVuZW5iZXJnLCBMYXJyeS4gIERhdGEgU3RydWN0dXJlcyBhbmQgVGhlaXIKLSAgICAgQWxnb3JpdGhtcy4gIEhhcnBlci1Db2xsaW5zLCBJbmMuICAxOTkxLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzcGxheS10cmVlLmgiCi0KLXN0YXRpYyB2b2lkIHNwbGF5X3RyZWVfZGVsZXRlX2hlbHBlciAgICBQQVJBTVMoKHNwbGF5X3RyZWUsIAotCQkJCQkJc3BsYXlfdHJlZV9ub2RlKSk7Ci1zdGF0aWMgdm9pZCBzcGxheV90cmVlX3NwbGF5ICAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkJc3BsYXlfdHJlZV9rZXkpKTsKLXN0YXRpYyBzcGxheV90cmVlX25vZGUgc3BsYXlfdHJlZV9zcGxheV9oZWxwZXIgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJCXNwbGF5X3RyZWVfa2V5LAotCQkJCQkJc3BsYXlfdHJlZV9ub2RlKiwKLQkJCQkJCXNwbGF5X3RyZWVfbm9kZSosCi0JCQkJCQlzcGxheV90cmVlX25vZGUqKSk7Ci1zdGF0aWMgaW50IHNwbGF5X3RyZWVfZm9yZWFjaF9oZWxwZXIgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfbm9kZSwKLQkJCQkJCXNwbGF5X3RyZWVfZm9yZWFjaF9mbiwKLQkJCQkJCXZvaWQqKSk7Ci0KLS8qIERlYWxsb2NhdGUgTk9ERSAoYSBtZW1iZXIgb2YgU1ApLCBhbmQgYWxsIGl0cyBzdWItdHJlZXMuICAqLwotCi1zdGF0aWMgdm9pZCAKLXNwbGF5X3RyZWVfZGVsZXRlX2hlbHBlciAoc3AsIG5vZGUpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfbm9kZSBub2RlOwotewotICBpZiAoIW5vZGUpCi0gICAgcmV0dXJuOwotCi0gIHNwbGF5X3RyZWVfZGVsZXRlX2hlbHBlciAoc3AsIG5vZGUtPmxlZnQpOwotICBzcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgKHNwLCBub2RlLT5yaWdodCk7Ci0KLSAgaWYgKHNwLT5kZWxldGVfa2V5KQotICAgICgqc3AtPmRlbGV0ZV9rZXkpKG5vZGUtPmtleSk7Ci0gIGlmIChzcC0+ZGVsZXRlX3ZhbHVlKQotICAgICgqc3AtPmRlbGV0ZV92YWx1ZSkobm9kZS0+dmFsdWUpOwotCi0gIGZyZWUgKChjaGFyKikgbm9kZSk7Ci19Ci0KLS8qIEhlbHAgc3BsYXkgU1AgYXJvdW5kIEtFWS4gIFBBUkVOVCBhbmQgR1JBTkRQQVJFTlQgYXJlIHRoZSBwYXJlbnQKLSAgIGFuZCBncmFuZHBhcmVudCwgcmVzcGVjdGl2ZWx5LCBvZiBOT0RFLiAgKi8KLQotc3RhdGljIHNwbGF5X3RyZWVfbm9kZQotc3BsYXlfdHJlZV9zcGxheV9oZWxwZXIgKHNwLCBrZXksIG5vZGUsIHBhcmVudCwgZ3JhbmRwYXJlbnQpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGtleTsKLSAgICAgc3BsYXlfdHJlZV9ub2RlICpub2RlOwotICAgICBzcGxheV90cmVlX25vZGUgKnBhcmVudDsKLSAgICAgc3BsYXlfdHJlZV9ub2RlICpncmFuZHBhcmVudDsKLXsKLSAgc3BsYXlfdHJlZV9ub2RlICpuZXh0OwotICBzcGxheV90cmVlX25vZGUgbjsKLSAgaW50IGNvbXBhcmlzb247Ci0gIAotICBuID0gKm5vZGU7Ci0KLSAgaWYgKCFuKQotICAgIHJldHVybiAqcGFyZW50OwotCi0gIGNvbXBhcmlzb24gPSAoKnNwLT5jb21wKSAoa2V5LCBuLT5rZXkpOwotCi0gIGlmIChjb21wYXJpc29uID09IDApCi0gICAgLyogV2UndmUgZm91bmQgdGhlIHRhcmdldC4gICovCi0gICAgbmV4dCA9IDA7Ci0gIGVsc2UgaWYgKGNvbXBhcmlzb24gPCAwKQotICAgIC8qIFRoZSB0YXJnZXQgaXMgdG8gdGhlIGxlZnQuICAqLwotICAgIG5leHQgPSAmbi0+bGVmdDsKLSAgZWxzZSAKLSAgICAvKiBUaGUgdGFyZ2V0IGlzIHRvIHRoZSByaWdodC4gICovCi0gICAgbmV4dCA9ICZuLT5yaWdodDsKLQotICBpZiAobmV4dCkKLSAgICB7Ci0gICAgICAvKiBDb250aW51ZSBkb3duIHRoZSB0cmVlLiAgKi8KLSAgICAgIG4gPSBzcGxheV90cmVlX3NwbGF5X2hlbHBlciAoc3AsIGtleSwgbmV4dCwgbm9kZSwgcGFyZW50KTsKLQotICAgICAgLyogVGhlIHJlY3Vyc2l2ZSBjYWxsIHdpbGwgY2hhbmdlIHRoZSBwbGFjZSB0byB3aGljaCBOT0RFCi0JIHBvaW50cy4gICovCi0gICAgICBpZiAoKm5vZGUgIT0gbikKLQlyZXR1cm4gbjsKLSAgICB9Ci0KLSAgaWYgKCFwYXJlbnQpCi0gICAgLyogTk9ERSBpcyB0aGUgcm9vdC4gIFdlIGFyZSBkb25lLiAgKi8KLSAgICByZXR1cm4gbjsKLQotICAvKiBGaXJzdCwgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vIGdyYW5kcGFyZW50IChpLmUuLAotICAgICAqUEFSRU5UIGlzIHRoZSByb290IG9mIHRoZSB0cmVlLikgICovCi0gIGlmICghZ3JhbmRwYXJlbnQpIAotICAgIHsKLSAgICAgIGlmIChuID09ICgqcGFyZW50KS0+bGVmdCkKLQl7Ci0JICAqbm9kZSA9IG4tPnJpZ2h0OwotCSAgbi0+cmlnaHQgPSAqcGFyZW50OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqbm9kZSA9IG4tPmxlZnQ7Ci0JICBuLT5sZWZ0ID0gKnBhcmVudDsKLQl9Ci0gICAgICAqcGFyZW50ID0gbjsKLSAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAvKiBOZXh0IGhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgYm90aCBOIGFuZCAqUEFSRU5UIGFyZSBsZWZ0IGNoaWxkcmVuLAotICAgICBvciB3aGVyZSBib3RoIGFyZSByaWdodCBjaGlsZHJlbi4gICovCi0gIGlmIChuID09ICgqcGFyZW50KS0+bGVmdCAmJiAqcGFyZW50ID09ICgqZ3JhbmRwYXJlbnQpLT5sZWZ0KQotICAgIHsKLSAgICAgIHNwbGF5X3RyZWVfbm9kZSBwID0gKnBhcmVudDsKLQotICAgICAgKCpncmFuZHBhcmVudCktPmxlZnQgPSBwLT5yaWdodDsKLSAgICAgIHAtPnJpZ2h0ID0gKmdyYW5kcGFyZW50OwotICAgICAgcC0+bGVmdCA9IG4tPnJpZ2h0OwotICAgICAgbi0+cmlnaHQgPSBwOwotICAgICAgKmdyYW5kcGFyZW50ID0gbjsKLSAgICAgIHJldHVybiBuOyAKLSAgICB9Ci0gIGVsc2UgaWYgIChuID09ICgqcGFyZW50KS0+cmlnaHQgJiYgKnBhcmVudCA9PSAoKmdyYW5kcGFyZW50KS0+cmlnaHQpCi0gICAgewotICAgICAgc3BsYXlfdHJlZV9ub2RlIHAgPSAqcGFyZW50OwotCi0gICAgICAoKmdyYW5kcGFyZW50KS0+cmlnaHQgPSBwLT5sZWZ0OwotICAgICAgcC0+bGVmdCA9ICpncmFuZHBhcmVudDsKLSAgICAgIHAtPnJpZ2h0ID0gbi0+bGVmdDsKLSAgICAgIG4tPmxlZnQgPSBwOwotICAgICAgKmdyYW5kcGFyZW50ID0gbjsKLSAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAvKiBGaW5hbGx5LCBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgTiBpcyBhIGxlZnQgY2hpbGQsIGJ1dCAqUEFSRU5UCi0gICAgIGlzIGEgcmlnaHQgY2hpbGQsIG9yIHZpY2UgdmVyc2EuICAqLwotICBpZiAobiA9PSAoKnBhcmVudCktPmxlZnQpIAotICAgIHsKLSAgICAgICgqcGFyZW50KS0+bGVmdCA9IG4tPnJpZ2h0OwotICAgICAgbi0+cmlnaHQgPSAqcGFyZW50OwotICAgICAgKCpncmFuZHBhcmVudCktPnJpZ2h0ID0gbi0+bGVmdDsKLSAgICAgIG4tPmxlZnQgPSAqZ3JhbmRwYXJlbnQ7Ci0gICAgICAqZ3JhbmRwYXJlbnQgPSBuOwotICAgICAgcmV0dXJuIG47Ci0gICAgfSAKLSAgZWxzZQotICAgIHsKLSAgICAgICgqcGFyZW50KS0+cmlnaHQgPSBuLT5sZWZ0OwotICAgICAgbi0+bGVmdCA9ICpwYXJlbnQ7Ci0gICAgICAoKmdyYW5kcGFyZW50KS0+bGVmdCA9IG4tPnJpZ2h0OwotICAgICAgbi0+cmlnaHQgPSAqZ3JhbmRwYXJlbnQ7Ci0gICAgICAqZ3JhbmRwYXJlbnQgPSBuOwotICAgICAgcmV0dXJuIG47Ci0gICAgfQotfQotCi0vKiBTcGxheSBTUCBhcm91bmQgS0VZLiAgKi8KLQotc3RhdGljIHZvaWQKLXNwbGF5X3RyZWVfc3BsYXkgKHNwLCBrZXkpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGtleTsKLXsKLSAgaWYgKHNwLT5yb290ID09IDApCi0gICAgcmV0dXJuOwotCi0gIHNwbGF5X3RyZWVfc3BsYXlfaGVscGVyIChzcCwga2V5LCAmc3AtPnJvb3QsIAotCQkJICAgLypncmFuZHBhcmVudD0qLzAsIC8qcGFyZW50PSovMCk7IAotfQotCi0vKiBDYWxsIEZOLCBwYXNzaW5nIGl0IHRoZSBEQVRBLCBmb3IgZXZlcnkgbm9kZSBiZWxvdyBOT0RFLCBhbGwgb2YKLSAgIHdoaWNoIGFyZSBmcm9tIFNQLCBmb2xsb3dpbmcgYW4gaW4tb3JkZXIgdHJhdmVyc2FsLiAgSWYgRk4gZXZlcnkKLSAgIHJldHVybnMgYSBub24temVybyB2YWx1ZSwgdGhlIGl0ZXJhdGlvbiBjZWFzZXMgaW1tZWRpYXRlbHksIGFuZCB0aGUKLSAgIHZhbHVlIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMC4gICovCi0KLXN0YXRpYyBpbnQKLXNwbGF5X3RyZWVfZm9yZWFjaF9oZWxwZXIgKHNwLCBub2RlLCBmbiwgZGF0YSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9ub2RlIG5vZGU7Ci0gICAgIHNwbGF5X3RyZWVfZm9yZWFjaF9mbiBmbjsKLSAgICAgdm9pZCogZGF0YTsKLXsKLSAgaW50IHZhbDsKLQotICBpZiAoIW5vZGUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgdmFsID0gc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAoc3AsIG5vZGUtPmxlZnQsIGZuLCBkYXRhKTsKLSAgaWYgKHZhbCkKLSAgICByZXR1cm4gdmFsOwotCi0gIHZhbCA9ICgqZm4pKG5vZGUsIGRhdGEpOwotICBpZiAodmFsKQotICAgIHJldHVybiB2YWw7Ci0KLSAgcmV0dXJuIHNwbGF5X3RyZWVfZm9yZWFjaF9oZWxwZXIgKHNwLCBub2RlLT5yaWdodCwgZm4sIGRhdGEpOwotfQotCi0vKiBBbGxvY2F0ZSBhIG5ldyBzcGxheSB0cmVlLCB1c2luZyBDT01QQVJFX0ZOIHRvIGNvbXBhcmUgbm9kZXMsCi0gICBERUxFVEVfS0VZX0ZOIHRvIGRlYWxsb2NhdGUga2V5cywgYW5kIERFTEVURV9WQUxVRV9GTiB0byBkZWFsbG9jYXRlCi0gICB2YWx1ZXMuICAqLwotCi1zcGxheV90cmVlIAotc3BsYXlfdHJlZV9uZXcgKGNvbXBhcmVfZm4sIGRlbGV0ZV9rZXlfZm4sIGRlbGV0ZV92YWx1ZV9mbikKLSAgICAgc3BsYXlfdHJlZV9jb21wYXJlX2ZuIGNvbXBhcmVfZm47Ci0gICAgIHNwbGF5X3RyZWVfZGVsZXRlX2tleV9mbiBkZWxldGVfa2V5X2ZuOwotICAgICBzcGxheV90cmVlX2RlbGV0ZV92YWx1ZV9mbiBkZWxldGVfdmFsdWVfZm47Ci17Ci0gIHNwbGF5X3RyZWUgc3AgPSAoc3BsYXlfdHJlZSkgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3BsYXlfdHJlZSkpOwotICBzcC0+cm9vdCA9IDA7Ci0gIHNwLT5jb21wID0gY29tcGFyZV9mbjsKLSAgc3AtPmRlbGV0ZV9rZXkgPSBkZWxldGVfa2V5X2ZuOwotICBzcC0+ZGVsZXRlX3ZhbHVlID0gZGVsZXRlX3ZhbHVlX2ZuOwotCi0gIHJldHVybiBzcDsKLX0KLQotLyogRGVhbGxvY2F0ZSBTUC4gICovCi0KLXZvaWQgCi1zcGxheV90cmVlX2RlbGV0ZSAoc3ApCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci17Ci0gIHNwbGF5X3RyZWVfZGVsZXRlX2hlbHBlciAoc3AsIHNwLT5yb290KTsKLSAgZnJlZSAoKGNoYXIqKSBzcCk7Ci19Ci0KLS8qIEluc2VydCBhIG5ldyBub2RlIChhc3NvY2lhdGluZyBLRVkgd2l0aCBEQVRBKSBpbnRvIFNQLiAgSWYgYQotICAgcHJldmlvdXMgbm9kZSB3aXRoIHRoZSBpbmRpY2F0ZWQgS0VZIGV4aXN0cywgaXRzIGRhdGEgaXMgcmVwbGFjZWQKLSAgIHdpdGggdGhlIG5ldyB2YWx1ZS4gICovCi0KLXZvaWQgCi1zcGxheV90cmVlX2luc2VydCAoc3AsIGtleSwgdmFsdWUpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGtleTsKLSAgICAgc3BsYXlfdHJlZV92YWx1ZSB2YWx1ZTsKLXsKLSAgaW50IGNvbXBhcmlzb24gPSAwOwotCi0gIHNwbGF5X3RyZWVfc3BsYXkgKHNwLCBrZXkpOwotCi0gIGlmIChzcC0+cm9vdCkKLSAgICBjb21wYXJpc29uID0gKCpzcC0+Y29tcCkoc3AtPnJvb3QtPmtleSwga2V5KTsKLQotICBpZiAoc3AtPnJvb3QgJiYgY29tcGFyaXNvbiA9PSAwKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSByb290IG9mIHRoZSB0cmVlIGFscmVhZHkgaGFzIHRoZSBpbmRpY2F0ZWQgS0VZLCBqdXN0Ci0JIHJlcGxhY2UgdGhlIHZhbHVlIHdpdGggVkFMVUUuICAqLwotICAgICAgaWYgKHNwLT5kZWxldGVfdmFsdWUpCi0JKCpzcC0+ZGVsZXRlX3ZhbHVlKShzcC0+cm9vdC0+dmFsdWUpOwotICAgICAgc3AtPnJvb3QtPnZhbHVlID0gdmFsdWU7Ci0gICAgfSAKLSAgZWxzZSAKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSwgYW5kIGluc2VydCBpdCBhdCB0aGUgcm9vdC4gICovCi0gICAgICBzcGxheV90cmVlX25vZGUgbm9kZTsKLSAgICAgIAotICAgICAgbm9kZSA9IChzcGxheV90cmVlX25vZGUpIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNwbGF5X3RyZWVfbm9kZSkpOwotICAgICAgbm9kZS0+a2V5ID0ga2V5OwotICAgICAgbm9kZS0+dmFsdWUgPSB2YWx1ZTsKLSAgICAgIAotICAgICAgaWYgKCFzcC0+cm9vdCkKLQlub2RlLT5sZWZ0ID0gbm9kZS0+cmlnaHQgPSAwOwotICAgICAgZWxzZSBpZiAoY29tcGFyaXNvbiA8IDApCi0JewotCSAgbm9kZS0+bGVmdCA9IHNwLT5yb290OwotCSAgbm9kZS0+cmlnaHQgPSBub2RlLT5sZWZ0LT5yaWdodDsKLQkgIG5vZGUtPmxlZnQtPnJpZ2h0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbm9kZS0+cmlnaHQgPSBzcC0+cm9vdDsKLQkgIG5vZGUtPmxlZnQgPSBub2RlLT5yaWdodC0+bGVmdDsKLQkgIG5vZGUtPnJpZ2h0LT5sZWZ0ID0gMDsKLQl9Ci0KLSAgICBzcC0+cm9vdCA9IG5vZGU7Ci0gIH0KLX0KLQotLyogTG9va3VwIEtFWSBpbiBTUCwgcmV0dXJuaW5nIFZBTFVFIGlmIHByZXNlbnQsIGFuZCBOVUxMIAotICAgb3RoZXJ3aXNlLiAgKi8KLQotc3BsYXlfdHJlZV9ub2RlCi1zcGxheV90cmVlX2xvb2t1cCAoc3AsIGtleSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9rZXkga2V5OwotewotICBzcGxheV90cmVlX3NwbGF5IChzcCwga2V5KTsKLQotICBpZiAoc3AtPnJvb3QgJiYgKCpzcC0+Y29tcCkoc3AtPnJvb3QtPmtleSwga2V5KSA9PSAwKQotICAgIHJldHVybiBzcC0+cm9vdDsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBDYWxsIEZOLCBwYXNzaW5nIGl0IHRoZSBEQVRBLCBmb3IgZXZlcnkgbm9kZSBpbiBTUCwgZm9sbG93aW5nIGFuCi0gICBpbi1vcmRlciB0cmF2ZXJzYWwuICBJZiBGTiBldmVyeSByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUsIHRoZQotICAgaXRlcmF0aW9uIGNlYXNlcyBpbW1lZGlhdGVseSwgYW5kIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC4KLSAgIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDAuICAqLwotCi1pbnQKLXNwbGF5X3RyZWVfZm9yZWFjaCAoc3AsIGZuLCBkYXRhKQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX2ZvcmVhY2hfZm4gZm47Ci0gICAgIHZvaWQgKmRhdGE7Ci17Ci0gIHJldHVybiBzcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyIChzcCwgc3AtPnJvb3QsIGZuLCBkYXRhKTsKLX0KLQotLyogU3BsYXktdHJlZSBjb21wYXJpc29uIGZ1bmN0aW9uLCB0cmVhdGluZyB0aGUga2V5cyBhcyBpbnRzLiAgKi8KLQotaW50Ci1zcGxheV90cmVlX2NvbXBhcmVfaW50cyAoazEsIGsyKQotICAgICBzcGxheV90cmVlX2tleSBrMTsKLSAgICAgc3BsYXlfdHJlZV9rZXkgazI7Ci17Ci0gIGlmICgoaW50KSBrMSA8IChpbnQpIGsyKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoKGludCkgazEgPiAoaW50KSBrMikKLSAgICByZXR1cm4gMTsKLSAgZWxzZSAKLSAgICByZXR1cm4gMDsKLX0KLQotLyogU3BsYXktdHJlZSBjb21wYXJpc29uIGZ1bmN0aW9uLCB0cmVhdGluZyB0aGUga2V5cyBhcyBwb2ludGVycy4gICovCi0KLWludAotc3BsYXlfdHJlZV9jb21wYXJlX3BvaW50ZXJzIChrMSwgazIpCi0gICAgIHNwbGF5X3RyZWVfa2V5IGsxOwotICAgICBzcGxheV90cmVlX2tleSBrMjsKLXsKLSAgaWYgKChjaGFyKikgazEgPCAoY2hhciopIGsyKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoKGNoYXIqKSBrMSA+IChjaGFyKikgazIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RyY2FzZWNtcC5jIGIvbGliaWJlcnR5L3N0cmNhc2VjbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhOTMwYi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RyY2FzZWNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4NyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQgYW5kIHRoYXQgZHVlIGNyZWRpdCBpcyBnaXZlbgotICogdG8gdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleS4gVGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkKLSAqIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaGlzIHNvZnR3YXJlCi0gKiBpcyBwcm92aWRlZCBgYGFzIGlzJycgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKi8KLQotI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQotc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKXN0cmNhc2VjbXAuYwk1LjUgKEJlcmtlbGV5KSAxMS8yNC84NyI7Ci0jZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi0vKgotICogVGhpcyBhcnJheSBpcyBkZXNpZ25lZCBmb3IgbWFwcGluZyB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXIKLSAqIHRvZ2V0aGVyIGZvciBhIGNhc2UgaW5kZXBlbmRlbnQgY29tcGFyaXNvbi4gIFRoZSBtYXBwaW5ncyBhcmUKLSAqIGJhc2VkIHVwb24gYXNjaWkgY2hhcmFjdGVyIHNlcXVlbmNlcy4KLSAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVjOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcm1hcFtdID0gewotCSh1YyknXDAwMCcsKHVjKSdcMDAxJywodWMpJ1wwMDInLCh1YyknXDAwMycsKHVjKSdcMDA0JywodWMpJ1wwMDUnLCh1YyknXDAwNicsKHVjKSdcMDA3JywKLQkodWMpJ1wwMTAnLCh1YyknXDAxMScsKHVjKSdcMDEyJywodWMpJ1wwMTMnLCh1YyknXDAxNCcsKHVjKSdcMDE1JywodWMpJ1wwMTYnLCh1YyknXDAxNycsCi0JKHVjKSdcMDIwJywodWMpJ1wwMjEnLCh1YyknXDAyMicsKHVjKSdcMDIzJywodWMpJ1wwMjQnLCh1YyknXDAyNScsKHVjKSdcMDI2JywodWMpJ1wwMjcnLAotCSh1YyknXDAzMCcsKHVjKSdcMDMxJywodWMpJ1wwMzInLCh1YyknXDAzMycsKHVjKSdcMDM0JywodWMpJ1wwMzUnLCh1YyknXDAzNicsKHVjKSdcMDM3JywKLQkodWMpJ1wwNDAnLCh1YyknXDA0MScsKHVjKSdcMDQyJywodWMpJ1wwNDMnLCh1YyknXDA0NCcsKHVjKSdcMDQ1JywodWMpJ1wwNDYnLCh1YyknXDA0NycsCi0JKHVjKSdcMDUwJywodWMpJ1wwNTEnLCh1YyknXDA1MicsKHVjKSdcMDUzJywodWMpJ1wwNTQnLCh1YyknXDA1NScsKHVjKSdcMDU2JywodWMpJ1wwNTcnLAotCSh1YyknXDA2MCcsKHVjKSdcMDYxJywodWMpJ1wwNjInLCh1YyknXDA2MycsKHVjKSdcMDY0JywodWMpJ1wwNjUnLCh1YyknXDA2NicsKHVjKSdcMDY3JywKLQkodWMpJ1wwNzAnLCh1YyknXDA3MScsKHVjKSdcMDcyJywodWMpJ1wwNzMnLCh1YyknXDA3NCcsKHVjKSdcMDc1JywodWMpJ1wwNzYnLCh1YyknXDA3NycsCi0JKHVjKSdcMTAwJywodWMpJ1wxNDEnLCh1YyknXDE0MicsKHVjKSdcMTQzJywodWMpJ1wxNDQnLCh1YyknXDE0NScsKHVjKSdcMTQ2JywodWMpJ1wxNDcnLAotCSh1YyknXDE1MCcsKHVjKSdcMTUxJywodWMpJ1wxNTInLCh1YyknXDE1MycsKHVjKSdcMTU0JywodWMpJ1wxNTUnLCh1YyknXDE1NicsKHVjKSdcMTU3JywKLQkodWMpJ1wxNjAnLCh1YyknXDE2MScsKHVjKSdcMTYyJywodWMpJ1wxNjMnLCh1YyknXDE2NCcsKHVjKSdcMTY1JywodWMpJ1wxNjYnLCh1YyknXDE2NycsCi0JKHVjKSdcMTcwJywodWMpJ1wxNzEnLCh1YyknXDE3MicsKHVjKSdcMTMzJywodWMpJ1wxMzQnLCh1YyknXDEzNScsKHVjKSdcMTM2JywodWMpJ1wxMzcnLAotCSh1YyknXDE0MCcsKHVjKSdcMTQxJywodWMpJ1wxNDInLCh1YyknXDE0MycsKHVjKSdcMTQ0JywodWMpJ1wxNDUnLCh1YyknXDE0NicsKHVjKSdcMTQ3JywKLQkodWMpJ1wxNTAnLCh1YyknXDE1MScsKHVjKSdcMTUyJywodWMpJ1wxNTMnLCh1YyknXDE1NCcsKHVjKSdcMTU1JywodWMpJ1wxNTYnLCh1YyknXDE1NycsCi0JKHVjKSdcMTYwJywodWMpJ1wxNjEnLCh1YyknXDE2MicsKHVjKSdcMTYzJywodWMpJ1wxNjQnLCh1YyknXDE2NScsKHVjKSdcMTY2JywodWMpJ1wxNjcnLAotCSh1YyknXDE3MCcsKHVjKSdcMTcxJywodWMpJ1wxNzInLCh1YyknXDE3MycsKHVjKSdcMTc0JywodWMpJ1wxNzUnLCh1YyknXDE3NicsKHVjKSdcMTc3JywKLQkodWMpJ1wyMDAnLCh1YyknXDIwMScsKHVjKSdcMjAyJywodWMpJ1wyMDMnLCh1YyknXDIwNCcsKHVjKSdcMjA1JywodWMpJ1wyMDYnLCh1YyknXDIwNycsCi0JKHVjKSdcMjEwJywodWMpJ1wyMTEnLCh1YyknXDIxMicsKHVjKSdcMjEzJywodWMpJ1wyMTQnLCh1YyknXDIxNScsKHVjKSdcMjE2JywodWMpJ1wyMTcnLAotCSh1YyknXDIyMCcsKHVjKSdcMjIxJywodWMpJ1wyMjInLCh1YyknXDIyMycsKHVjKSdcMjI0JywodWMpJ1wyMjUnLCh1YyknXDIyNicsKHVjKSdcMjI3JywKLQkodWMpJ1wyMzAnLCh1YyknXDIzMScsKHVjKSdcMjMyJywodWMpJ1wyMzMnLCh1YyknXDIzNCcsKHVjKSdcMjM1JywodWMpJ1wyMzYnLCh1YyknXDIzNycsCi0JKHVjKSdcMjQwJywodWMpJ1wyNDEnLCh1YyknXDI0MicsKHVjKSdcMjQzJywodWMpJ1wyNDQnLCh1YyknXDI0NScsKHVjKSdcMjQ2JywodWMpJ1wyNDcnLAotCSh1YyknXDI1MCcsKHVjKSdcMjUxJywodWMpJ1wyNTInLCh1YyknXDI1MycsKHVjKSdcMjU0JywodWMpJ1wyNTUnLCh1YyknXDI1NicsKHVjKSdcMjU3JywKLQkodWMpJ1wyNjAnLCh1YyknXDI2MScsKHVjKSdcMjYyJywodWMpJ1wyNjMnLCh1YyknXDI2NCcsKHVjKSdcMjY1JywodWMpJ1wyNjYnLCh1YyknXDI2NycsCi0JKHVjKSdcMjcwJywodWMpJ1wyNzEnLCh1YyknXDI3MicsKHVjKSdcMjczJywodWMpJ1wyNzQnLCh1YyknXDI3NScsKHVjKSdcMjc2JywodWMpJ1wyNzcnLAotCSh1YyknXDMwMCcsKHVjKSdcMzQxJywodWMpJ1wzNDInLCh1YyknXDM0MycsKHVjKSdcMzQ0JywodWMpJ1wzNDUnLCh1YyknXDM0NicsKHVjKSdcMzQ3JywKLQkodWMpJ1wzNTAnLCh1YyknXDM1MScsKHVjKSdcMzUyJywodWMpJ1wzNTMnLCh1YyknXDM1NCcsKHVjKSdcMzU1JywodWMpJ1wzNTYnLCh1YyknXDM1NycsCi0JKHVjKSdcMzYwJywodWMpJ1wzNjEnLCh1YyknXDM2MicsKHVjKSdcMzYzJywodWMpJ1wzNjQnLCh1YyknXDM2NScsKHVjKSdcMzY2JywodWMpJ1wzNjcnLAotCSh1YyknXDM3MCcsKHVjKSdcMzcxJywodWMpJ1wzNzInLCh1YyknXDMzMycsKHVjKSdcMzM0JywodWMpJ1wzMzUnLCh1YyknXDMzNicsKHVjKSdcMzM3JywKLQkodWMpJ1wzNDAnLCh1YyknXDM0MScsKHVjKSdcMzQyJywodWMpJ1wzNDMnLCh1YyknXDM0NCcsKHVjKSdcMzQ1JywodWMpJ1wzNDYnLCh1YyknXDM0NycsCi0JKHVjKSdcMzUwJywodWMpJ1wzNTEnLCh1YyknXDM1MicsKHVjKSdcMzUzJywodWMpJ1wzNTQnLCh1YyknXDM1NScsKHVjKSdcMzU2JywodWMpJ1wzNTcnLAotCSh1YyknXDM2MCcsKHVjKSdcMzYxJywodWMpJ1wzNjInLCh1YyknXDM2MycsKHVjKSdcMzY0JywodWMpJ1wzNjUnLCh1YyknXDM2NicsKHVjKSdcMzY3JywKLQkodWMpJ1wzNzAnLCh1YyknXDM3MScsKHVjKSdcMzcyJywodWMpJ1wzNzMnLCh1YyknXDM3NCcsKHVjKSdcMzc1JywodWMpJ1wzNzYnLCh1YyknXDM3NycsCi19OwotCi1pbnQKLXN0cmNhc2VjbXAoczEsIHMyKQotICAgIGNvbnN0IGNoYXIgKnMxLCAqczI7Ci17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciB1MSwgdTI7Ci0KLSAgICBmb3IgKDs7KSB7Ci0JdTEgPSAodW5zaWduZWQgY2hhcikgKnMxKys7Ci0JdTIgPSAodW5zaWduZWQgY2hhcikgKnMyKys7Ci0JaWYgKGNoYXJtYXBbdTFdICE9IGNoYXJtYXBbdTJdKSB7Ci0JICAgIHJldHVybiBjaGFybWFwW3UxXSAtIGNoYXJtYXBbdTJdOwotCX0KLQlpZiAodTEgPT0gJ1wwJykgewotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RyY2hyLmMgYi9saWJpYmVydHkvc3RyY2hyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDQ4MGYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cmNoci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogUG9ydGFibGUgdmVyc2lvbiBvZiBzdHJjaHIoKQotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi1OQU1FCi0Jc3RyY2hyIC0tIHJldHVybiBwb2ludGVyIHRvIGZpcnN0IG9jY3VyYW5jZSBvZiBhIGNoYXJhY3RlcgotCi1TWU5PUFNJUwotCWNoYXIgKnN0cmNociAoY29uc3QgY2hhciAqcywgaW50IGMpCi0KLURFU0NSSVBUSU9OCi0JUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG9jY3VyYW5jZSBvZiBjaGFyYWN0ZXIgQyBpbgotCXN0cmluZyBTLCBvciBhIE5VTEwgcG9pbnRlciBpZiBubyBvY2N1cmFuY2UgaXMgZm91bmQuCi0JCi1CVUdTCi0JQmVoYXZpb3Igd2hlbiBjaGFyYWN0ZXIgaXMgdGhlIG51bGwgY2hhcmFjdGVyIGlzIGltcGxlbWVudGF0aW9uCi0JZGVwZW5kZW50LgotKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLWNoYXIgKgotc3RyY2hyIChzLCBjKQotICByZWdpc3RlciBjb25zdCBjaGFyICpzOwotICBpbnQgYzsKLXsKLSAgZG8gewotICAgIGlmICgqcyA9PSBjKQotICAgICAgewotCXJldHVybiAoY2hhciopczsKLSAgICAgIH0KLSAgfSB3aGlsZSAoKnMrKyk7Ci0gIHJldHVybiAoMCk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RyZHVwLmMgYi9saWJpYmVydHkvc3RyZHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ODViMzQuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cmR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotY2hhciAqCi1zdHJkdXAocykKLSAgICAgY2hhciAqczsKLXsKLSAgICBjaGFyICpyZXN1bHQgPSAoY2hhciopbWFsbG9jKHN0cmxlbihzKSArIDEpOwotICAgIGlmIChyZXN1bHQgPT0gKGNoYXIqKTApCi0JcmV0dXJuIChjaGFyKikwOwotICAgIHN0cmNweShyZXN1bHQsIHMpOwotICAgIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RyZXJyb3IuYyBiL2xpYmliZXJ0eS9zdHJlcnJvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDRjYzc1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJlcnJvci5jCisrKyAvZGV2L251bGwKQEAgLTEsODMxICswLDAgQEAKLS8qIEV4dGVuZGVkIHN1cHBvcnQgZm9yIHVzaW5nIGVycm5vIHZhbHVlcy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAgZm5mQGN5Z251cy5jb20KLSAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gIC0tUGVyIEJvdGhuZXIuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgSEFWRV9TWVNfRVJSTElTVAotLyogTm90ZSB0aGF0IGVycm5vLmggKG5vdCBzdXJlIHdoYXQgT1MpIG9yIHN0ZGlvLmggKEJTRCA0LjQsIGF0IGxlYXN0KQotICAgbWlnaHQgZGVjbGFyZSBzeXNfZXJybGlzdCBpbiBhIHdheSB0aGF0IHRoZSBjb21waWxlciBtaWdodCBjb25zaWRlcgotICAgaW5jb21wYXRpYmxlIHdpdGggb3VyIGxhdGVyIGRlY2xhcmF0aW9uLCBwZXJoYXBzIGJ5IHVzaW5nIGNvbnN0Ci0gICBhdHRyaWJ1dGVzLiAgU28gd2UgaGlkZSB0aGUgZGVjbGFyYXRpb24gaW4gZXJybm8uaCAoaWYgYW55KSB1c2luZyBhCi0gICBtYWNyby4gKi8KLSNkZWZpbmUgc3lzX2Vycmxpc3Qgc3lzX2Vycmxpc3RfXwotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpZmRlZiBIQVZFX1NZU19FUlJMSVNUCi0jdW5kZWYgc3lzX2Vycmxpc3QKLSNlbmRpZgotCi0vKiAgUm91dGluZXMgaW1wb3J0ZWQgZnJvbSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyaWVzLiAqLwotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLWV4dGVybiB2b2lkICptYWxsb2MgKHNpemVfdCBzaXplKTsJCQkJLyogNC4xMC4zLjMgKi8KLWV4dGVybiB2b2lkICptZW1zZXQgKHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CQkJLyogNC4xMS42LjEgKi8KLSNlbHNlCS8qICFfX1NURENfXyAqLwotZXh0ZXJuIGNoYXIgKm1hbGxvYyAoKTsJCS8qIFN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0ZXIgKi8KLWV4dGVybiBjaGFyICptZW1zZXQgKCk7Ci0jZW5kaWYJLyogX19TVERDX18gKi8KLQotI2lmbmRlZiBNQVgKLSMgIGRlZmluZSBNQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGluaXRfZXJyb3JfdGFibGVzIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVHJhbnNsYXRpb24gdGFibGUgZm9yIGVycm5vIHZhbHVlcy4gIFNlZSBpbnRybygyKSBpbiBtb3N0IFVOSVggc3lzdGVtcwotICAgUHJvZ3JhbW1lcnMgUmVmZXJlbmNlIE1hbnVhbHMuCi0KLSAgIE5vdGUgdGhhdCB0aGlzIHRhYmxlIGlzIGdlbmVyYWxseSBvbmx5IGFjY2Vzc2VkIHdoZW4gaXQgaXMgdXNlZCBhdCBydW50aW1lCi0gICB0byBpbml0aWFsaXplIGVycm5vIG5hbWUgYW5kIG1lc3NhZ2UgdGFibGVzIHRoYXQgYXJlIGluZGV4ZWQgYnkgZXJybm8KLSAgIHZhbHVlLgotCi0gICBOb3QgYWxsIG9mIHRoZXNlIGVycm5vcyB3aWxsIGV4aXN0IG9uIGFsbCBzeXN0ZW1zLiAgVGhpcyB0YWJsZSBpcyB0aGUgb25seQotICAgdGhpbmcgdGhhdCBzaG91bGQgaGF2ZSB0byBiZSB1cGRhdGVkIGFzIG5ldyBlcnJvciBudW1iZXJzIGFyZSBpbnRyb2R1Y2VkLgotICAgSXQncyBzb3J0IG9mIHVnbHksIGJ1dCBhdCBsZWFzdCBpdHMgcG9ydGFibGUuICovCi0KLXN0cnVjdCBlcnJvcl9pbmZvCi17Ci0gIGludCB2YWx1ZTsJCS8qIFRoZSBudW1lcmljIHZhbHVlIGZyb20gPGVycm5vLmg+ICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7CS8qIFRoZSBlcXVpdmFsZW50IHN5bWJvbGljIHZhbHVlICovCi0jaWZuZGVmIEhBVkVfU1lTX0VSUkxJU1QKLSAgY29uc3QgY2hhciAqbXNnOwkvKiBTaG9ydCBtZXNzYWdlIGFib3V0IHRoaXMgdmFsdWUgKi8KLSNlbmRpZgotfTsKLQotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0jICAgZGVmaW5lIEVOVFJZKHZhbHVlLCBuYW1lLCBtc2cpCXt2YWx1ZSwgbmFtZSwgbXNnfQotI2Vsc2UKLSMgICBkZWZpbmUgRU5UUlkodmFsdWUsIG5hbWUsIG1zZykJe3ZhbHVlLCBuYW1lfQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXJyb3JfaW5mbyBlcnJvcl90YWJsZVtdID0KLXsKLSNpZiBkZWZpbmVkIChFUEVSTSkKLSAgRU5UUlkoRVBFUk0sICJFUEVSTSIsICJOb3Qgb3duZXIiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0VOVCkKLSAgRU5UUlkoRU5PRU5ULCAiRU5PRU5UIiwgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTUkNIKQotICBFTlRSWShFU1JDSCwgIkVTUkNIIiwgIk5vIHN1Y2ggcHJvY2VzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlOVFIpCi0gIEVOVFJZKEVJTlRSLCAiRUlOVFIiLCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJTykKLSAgRU5UUlkoRUlPLCAiRUlPIiwgIkkvTyBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5YSU8pCi0gIEVOVFJZKEVOWElPLCAiRU5YSU8iLCAiTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRTJCSUcpCi0gIEVOVFJZKEUyQklHLCAiRTJCSUciLCAiQXJnIGxpc3QgdG9vIGxvbmciKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0VYRUMpCi0gIEVOVFJZKEVOT0VYRUMsICJFTk9FWEVDIiwgIkV4ZWMgZm9ybWF0IGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFERikKLSAgRU5UUlkoRUJBREYsICJFQkFERiIsICJCYWQgZmlsZSBudW1iZXIiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDSElMRCkKLSAgRU5UUlkoRUNISUxELCAiRUNISUxEIiwgIk5vIGNoaWxkIHByb2Nlc3NlcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVdPVUxEQkxPQ0spCS8qIFB1dCBiZWZvcmUgRUFHQUlOLCBzb21ldGltZXMgYWxpYXNlZCAqLwotICBFTlRSWShFV09VTERCTE9DSywgIkVXT1VMREJMT0NLIiwgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFHQUlOKQotICBFTlRSWShFQUdBSU4sICJFQUdBSU4iLCAiTm8gbW9yZSBwcm9jZXNzZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT01FTSkKLSAgRU5UUlkoRU5PTUVNLCAiRU5PTUVNIiwgIk5vdCBlbm91Z2ggc3BhY2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVBQ0NFUykKLSAgRU5UUlkoRUFDQ0VTLCAiRUFDQ0VTIiwgIlBlcm1pc3Npb24gZGVuaWVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFRkFVTFQpCi0gIEVOVFJZKEVGQVVMVCwgIkVGQVVMVCIsICJCYWQgYWRkcmVzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVEJMSykKLSAgRU5UUlkoRU5PVEJMSywgIkVOT1RCTEsiLCAiQmxvY2sgZGV2aWNlIHJlcXVpcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQlVTWSkKLSAgRU5UUlkoRUJVU1ksICJFQlVTWSIsICJEZXZpY2UgYnVzeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUVYSVNUKQotICBFTlRSWShFRVhJU1QsICJFRVhJU1QiLCAiRmlsZSBleGlzdHMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVYREVWKQotICBFTlRSWShFWERFViwgIkVYREVWIiwgIkNyb3NzLWRldmljZSBsaW5rIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9ERVYpCi0gIEVOVFJZKEVOT0RFViwgIkVOT0RFViIsICJObyBzdWNoIGRldmljZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVERJUikKLSAgRU5UUlkoRU5PVERJUiwgIkVOT1RESVIiLCAiTm90IGEgZGlyZWN0b3J5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSVNESVIpCi0gIEVOVFJZKEVJU0RJUiwgIkVJU0RJUiIsICJJcyBhIGRpcmVjdG9yeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlOVkFMKQotICBFTlRSWShFSU5WQUwsICJFSU5WQUwiLCAiSW52YWxpZCBhcmd1bWVudCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5GSUxFKQotICBFTlRSWShFTkZJTEUsICJFTkZJTEUiLCAiRmlsZSB0YWJsZSBvdmVyZmxvdyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU1GSUxFKQotICBFTlRSWShFTUZJTEUsICJFTUZJTEUiLCAiVG9vIG1hbnkgb3BlbiBmaWxlcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVFRZKQotICBFTlRSWShFTk9UVFksICJFTk9UVFkiLCAiTm90IGEgdHlwZXdyaXRlciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVRYVEJTWSkKLSAgRU5UUlkoRVRYVEJTWSwgIkVUWFRCU1kiLCAiVGV4dCBmaWxlIGJ1c3kiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVGQklHKQotICBFTlRSWShFRkJJRywgIkVGQklHIiwgIkZpbGUgdG9vIGxhcmdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9TUEMpCi0gIEVOVFJZKEVOT1NQQywgIkVOT1NQQyIsICJObyBzcGFjZSBsZWZ0IG9uIGRldmljZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNQSVBFKQotICBFTlRSWShFU1BJUEUsICJFU1BJUEUiLCAiSWxsZWdhbCBzZWVrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUk9GUykKLSAgRU5UUlkoRVJPRlMsICJFUk9GUyIsICJSZWFkLW9ubHkgZmlsZSBzeXN0ZW0iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVNTElOSykKLSAgRU5UUlkoRU1MSU5LLCAiRU1MSU5LIiwgIlRvbyBtYW55IGxpbmtzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUElQRSkKLSAgRU5UUlkoRVBJUEUsICJFUElQRSIsICJCcm9rZW4gcGlwZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRURPTSkKLSAgRU5UUlkoRURPTSwgIkVET00iLCAiTWF0aCBhcmd1bWVudCBvdXQgb2YgZG9tYWluIG9mIGZ1bmMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVSQU5HRSkKLSAgRU5UUlkoRVJBTkdFLCAiRVJBTkdFIiwgIk1hdGggcmVzdWx0IG5vdCByZXByZXNlbnRhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9NU0cpCi0gIEVOVFJZKEVOT01TRywgIkVOT01TRyIsICJObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlEUk0pCi0gIEVOVFJZKEVJRFJNLCAiRUlEUk0iLCAiSWRlbnRpZmllciByZW1vdmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ0hSTkcpCi0gIEVOVFJZKEVDSFJORywgIkVDSFJORyIsICJDaGFubmVsIG51bWJlciBvdXQgb2YgcmFuZ2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMMk5TWU5DKQotICBFTlRSWShFTDJOU1lOQywgIkVMMk5TWU5DIiwgIkxldmVsIDIgbm90IHN5bmNocm9uaXplZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUwzSExUKQotICBFTlRSWShFTDNITFQsICJFTDNITFQiLCAiTGV2ZWwgMyBoYWx0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMM1JTVCkKLSAgRU5UUlkoRUwzUlNULCAiRUwzUlNUIiwgIkxldmVsIDMgcmVzZXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMTlJORykKLSAgRU5UUlkoRUxOUk5HLCAiRUxOUk5HIiwgIkxpbmsgbnVtYmVyIG91dCBvZiByYW5nZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVVOQVRDSCkKLSAgRU5UUlkoRVVOQVRDSCwgIkVVTkFUQ0giLCAiUHJvdG9jb2wgZHJpdmVyIG5vdCBhdHRhY2hlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PQ1NJKQotICBFTlRSWShFTk9DU0ksICJFTk9DU0kiLCAiTm8gQ1NJIHN0cnVjdHVyZSBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMMkhMVCkKLSAgRU5UUlkoRUwySExULCAiRUwySExUIiwgIkxldmVsIDIgaGFsdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFREVBRExLKQotICBFTlRSWShFREVBRExLLCAiRURFQURMSyIsICJEZWFkbG9jayBjb25kaXRpb24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0xDSykKLSAgRU5UUlkoRU5PTENLLCAiRU5PTENLIiwgIk5vIHJlY29yZCBsb2NrcyBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURFKQotICBFTlRSWShFQkFERSwgIkVCQURFIiwgIkludmFsaWQgZXhjaGFuZ2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURSKQotICBFTlRSWShFQkFEUiwgIkVCQURSIiwgIkludmFsaWQgcmVxdWVzdCBkZXNjcmlwdG9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFWEZVTEwpCi0gIEVOVFJZKEVYRlVMTCwgIkVYRlVMTCIsICJFeGNoYW5nZSBmdWxsIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9BTk8pCi0gIEVOVFJZKEVOT0FOTywgIkVOT0FOTyIsICJObyBhbm9kZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBRFJRQykKLSAgRU5UUlkoRUJBRFJRQywgIkVCQURSUUMiLCAiSW52YWxpZCByZXF1ZXN0IGNvZGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURTTFQpCi0gIEVOVFJZKEVCQURTTFQsICJFQkFEU0xUIiwgIkludmFsaWQgc2xvdCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRURFQURMT0NLKQotICBFTlRSWShFREVBRExPQ0ssICJFREVBRExPQ0siLCAiRmlsZSBsb2NraW5nIGRlYWRsb2NrIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkZPTlQpCi0gIEVOVFJZKEVCRk9OVCwgIkVCRk9OVCIsICJCYWQgZm9udCBmaWxlIGZvcm1hdCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PU1RSKQotICBFTlRSWShFTk9TVFIsICJFTk9TVFIiLCAiRGV2aWNlIG5vdCBhIHN0cmVhbSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PREFUQSkKLSAgRU5UUlkoRU5PREFUQSwgIkVOT0RBVEEiLCAiTm8gZGF0YSBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVUSU1FKQotICBFTlRSWShFVElNRSwgIkVUSU1FIiwgIlRpbWVyIGV4cGlyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1NSKQotICBFTlRSWShFTk9TUiwgIkVOT1NSIiwgIk91dCBvZiBzdHJlYW1zIHJlc291cmNlcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PTkVUKQotICBFTlRSWShFTk9ORVQsICJFTk9ORVQiLCAiTWFjaGluZSBpcyBub3Qgb24gdGhlIG5ldHdvcmsiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1BLRykKLSAgRU5UUlkoRU5PUEtHLCAiRU5PUEtHIiwgIlBhY2thZ2Ugbm90IGluc3RhbGxlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVJFTU9URSkKLSAgRU5UUlkoRVJFTU9URSwgIkVSRU1PVEUiLCAiT2JqZWN0IGlzIHJlbW90ZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PTElOSykKLSAgRU5UUlkoRU5PTElOSywgIkVOT0xJTksiLCAiTGluayBoYXMgYmVlbiBzZXZlcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQURWKQotICBFTlRSWShFQURWLCAiRUFEViIsICJBZHZlcnRpc2UgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTUk1OVCkKLSAgRU5UUlkoRVNSTU5ULCAiRVNSTU5UIiwgIlNybW91bnQgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDT01NKQotICBFTlRSWShFQ09NTSwgIkVDT01NIiwgIkNvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVBST1RPKQotICBFTlRSWShFUFJPVE8sICJFUFJPVE8iLCAiUHJvdG9jb2wgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVNVUxUSUhPUCkKLSAgRU5UUlkoRU1VTFRJSE9QLCAiRU1VTFRJSE9QIiwgIk11bHRpaG9wIGF0dGVtcHRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRURPVERPVCkKLSAgRU5UUlkoRURPVERPVCwgIkVET1RET1QiLCAiUkZTIHNwZWNpZmljIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFETVNHKQotICBFTlRSWShFQkFETVNHLCAiRUJBRE1TRyIsICJOb3QgYSBkYXRhIG1lc3NhZ2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOQU1FVE9PTE9ORykKLSAgRU5UUlkoRU5BTUVUT09MT05HLCAiRU5BTUVUT09MT05HIiwgIkZpbGUgbmFtZSB0b28gbG9uZyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU9WRVJGTE9XKQotICBFTlRSWShFT1ZFUkZMT1csICJFT1ZFUkZMT1ciLCAiVmFsdWUgdG9vIGxhcmdlIGZvciBkZWZpbmVkIGRhdGEgdHlwZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVFVOSVEpCi0gIEVOVFJZKEVOT1RVTklRLCAiRU5PVFVOSVEiLCAiTmFtZSBub3QgdW5pcXVlIG9uIG5ldHdvcmsiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURGRCkKLSAgRU5UUlkoRUJBREZELCAiRUJBREZEIiwgIkZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVSRU1DSEcpCi0gIEVOVFJZKEVSRU1DSEcsICJFUkVNQ0hHIiwgIlJlbW90ZSBhZGRyZXNzIGNoYW5nZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMSUJBQ0MpCi0gIEVOVFJZKEVMSUJBQ0MsICJFTElCQUNDIiwgIkNhbiBub3QgYWNjZXNzIGEgbmVlZGVkIHNoYXJlZCBsaWJyYXJ5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCQkFEKQotICBFTlRSWShFTElCQkFELCAiRUxJQkJBRCIsICJBY2Nlc3NpbmcgYSBjb3JydXB0ZWQgc2hhcmVkIGxpYnJhcnkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMSUJTQ04pCi0gIEVOVFJZKEVMSUJTQ04sICJFTElCU0NOIiwgIi5saWIgc2VjdGlvbiBpbiBhLm91dCBjb3JydXB0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMSUJNQVgpCi0gIEVOVFJZKEVMSUJNQVgsICJFTElCTUFYIiwgIkF0dGVtcHRpbmcgdG8gbGluayBpbiB0b28gbWFueSBzaGFyZWQgbGlicmFyaWVzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTElCRVhFQykKLSAgRU5UUlkoRUxJQkVYRUMsICJFTElCRVhFQyIsICJDYW5ub3QgZXhlYyBhIHNoYXJlZCBsaWJyYXJ5IGRpcmVjdGx5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSUxTRVEpCi0gIEVOVFJZKEVJTFNFUSwgIkVJTFNFUSIsICJJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1NZUykKLSAgRU5UUlkoRU5PU1lTLCAiRU5PU1lTIiwgIk9wZXJhdGlvbiBub3QgYXBwbGljYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxPT1ApCi0gIEVOVFJZKEVMT09QLCAiRUxPT1AiLCAiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVSRVNUQVJUKQotICBFTlRSWShFUkVTVEFSVCwgIkVSRVNUQVJUIiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIHNob3VsZCBiZSByZXN0YXJ0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTVFJQSVBFKQotICBFTlRSWShFU1RSUElQRSwgIkVTVFJQSVBFIiwgIlN0cmVhbXMgcGlwZSBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVEVNUFRZKQotICBFTlRSWShFTk9URU1QVFksICJFTk9URU1QVFkiLCAiRGlyZWN0b3J5IG5vdCBlbXB0eSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVVTRVJTKQotICBFTlRSWShFVVNFUlMsICJFVVNFUlMiLCAiVG9vIG1hbnkgdXNlcnMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RTT0NLKQotICBFTlRSWShFTk9UU09DSywgIkVOT1RTT0NLIiwgIlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRURFU1RBRERSUkVRKQotICBFTlRSWShFREVTVEFERFJSRVEsICJFREVTVEFERFJSRVEiLCAiRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU1TR1NJWkUpCi0gIEVOVFJZKEVNU0dTSVpFLCAiRU1TR1NJWkUiLCAiTWVzc2FnZSB0b28gbG9uZyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVBST1RPVFlQRSkKLSAgRU5UUlkoRVBST1RPVFlQRSwgIkVQUk9UT1RZUEUiLCAiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9QUk9UT09QVCkKLSAgRU5UUlkoRU5PUFJPVE9PUFQsICJFTk9QUk9UT09QVCIsICJQcm90b2NvbCBub3QgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUFJPVE9OT1NVUFBPUlQpCi0gIEVOVFJZKEVQUk9UT05PU1VQUE9SVCwgIkVQUk9UT05PU1VQUE9SVCIsICJQcm90b2NvbCBub3Qgc3VwcG9ydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU09DS1ROT1NVUFBPUlQpCi0gIEVOVFJZKEVTT0NLVE5PU1VQUE9SVCwgIkVTT0NLVE5PU1VQUE9SVCIsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFT1BOT1RTVVBQKQotICBFTlRSWShFT1BOT1RTVVBQLCAiRU9QTk9UU1VQUCIsICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0cmFuc3BvcnQgZW5kcG9pbnQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVQRk5PU1VQUE9SVCkKLSAgRU5UUlkoRVBGTk9TVVBQT1JULCAiRVBGTk9TVVBQT1JUIiwgIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUZOT1NVUFBPUlQpCi0gIEVOVFJZKEVBRk5PU1VQUE9SVCwgIkVBRk5PU1VQUE9SVCIsICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUREUklOVVNFKQotICBFTlRSWShFQUREUklOVVNFLCAiRUFERFJJTlVTRSIsICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUREUk5PVEFWQUlMKQotICBFTlRSWShFQUREUk5PVEFWQUlMLCAiRUFERFJOT1RBVkFJTCIsIkNhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVORVRET1dOKQotICBFTlRSWShFTkVURE9XTiwgIkVORVRET1dOIiwgIk5ldHdvcmsgaXMgZG93biIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5FVFVOUkVBQ0gpCi0gIEVOVFJZKEVORVRVTlJFQUNILCAiRU5FVFVOUkVBQ0giLCAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5FVFJFU0VUKQotICBFTlRSWShFTkVUUkVTRVQsICJFTkVUUkVTRVQiLCAiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gYmVjYXVzZSBvZiByZXNldCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUNPTk5BQk9SVEVEKQotICBFTlRSWShFQ09OTkFCT1JURUQsICJFQ09OTkFCT1JURUQiLCAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDT05OUkVTRVQpCi0gIEVOVFJZKEVDT05OUkVTRVQsICJFQ09OTlJFU0VUIiwgIkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PQlVGUykKLSAgRU5UUlkoRU5PQlVGUywgIkVOT0JVRlMiLCAiTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlTQ09OTikKLSAgRU5UUlkoRUlTQ09OTiwgIkVJU0NPTk4iLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIGFscmVhZHkgY29ubmVjdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9UQ09OTikKLSAgRU5UUlkoRU5PVENPTk4sICJFTk9UQ09OTiIsICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgbm90IGNvbm5lY3RlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNIVVRET1dOKQotICBFTlRSWShFU0hVVERPV04sICJFU0hVVERPV04iLCAiQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVE9PTUFOWVJFRlMpCi0gIEVOVFJZKEVUT09NQU5ZUkVGUywgIkVUT09NQU5ZUkVGUyIsICJUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVElNRURPVVQpCi0gIEVOVFJZKEVUSU1FRE9VVCwgIkVUSU1FRE9VVCIsICJDb25uZWN0aW9uIHRpbWVkIG91dCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUNPTk5SRUZVU0VEKQotICBFTlRSWShFQ09OTlJFRlVTRUQsICJFQ09OTlJFRlVTRUQiLCAiQ29ubmVjdGlvbiByZWZ1c2VkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSE9TVERPV04pCi0gIEVOVFJZKEVIT1NURE9XTiwgIkVIT1NURE9XTiIsICJIb3N0IGlzIGRvd24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVIT1NUVU5SRUFDSCkKLSAgRU5UUlkoRUhPU1RVTlJFQUNILCAiRUhPU1RVTlJFQUNIIiwgIk5vIHJvdXRlIHRvIGhvc3QiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVBTFJFQURZKQotICBFTlRSWShFQUxSRUFEWSwgIkVBTFJFQURZIiwgIk9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSU5QUk9HUkVTUykKLSAgRU5UUlkoRUlOUFJPR1JFU1MsICJFSU5QUk9HUkVTUyIsICJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1RBTEUpCi0gIEVOVFJZKEVTVEFMRSwgIkVTVEFMRSIsICJTdGFsZSBORlMgZmlsZSBoYW5kbGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVVQ0xFQU4pCi0gIEVOVFJZKEVVQ0xFQU4sICJFVUNMRUFOIiwgIlN0cnVjdHVyZSBuZWVkcyBjbGVhbmluZyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVE5BTSkKLSAgRU5UUlkoRU5PVE5BTSwgIkVOT1ROQU0iLCAiTm90IGEgWEVOSVggbmFtZWQgdHlwZSBmaWxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTkFWQUlMKQotICBFTlRSWShFTkFWQUlMLCAiRU5BVkFJTCIsICJObyBYRU5JWCBzZW1hcGhvcmVzIGF2YWlsYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlTTkFNKQotICBFTlRSWShFSVNOQU0sICJFSVNOQU0iLCAiSXMgYSBuYW1lZCB0eXBlIGZpbGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVSRU1PVEVJTykKLSAgRU5UUlkoRVJFTU9URUlPLCAiRVJFTU9URUlPIiwgIlJlbW90ZSBJL08gZXJyb3IiKSwKLSNlbmRpZgotICBFTlRSWSgwLCBOVUxMLCBOVUxMKQotfTsKLQotI2lmZGVmIEVWTVNFUlIKLS8qIFRoaXMgaXMgbm90IGluIHRoZSB0YWJsZSwgYmVjYXVzZSB0aGUgbnVtZXJpYyB2YWx1ZSBvZiBFVk1TRVJSICgzMjc2NykKLSAgIGxpZXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2Ygc3lzX2Vycmxpc3RbXS4gICovCi1zdGF0aWMgc3RydWN0IHsgaW50IHZhbHVlOyBjb25zdCBjaGFyICpuYW1lLCAqbXNnOyB9Ci0gIGV2bXNlcnIgPSB7IEVWTVNFUlIsICJFVk1TRVJSIiwgIlZNUy1zcGVjaWZpYyBlcnJvciIgfTsKLSNlbmRpZgotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGF0IHJ1bnRpbWUuICBJbmRleGVkIGJ5IHRoZQotICAgZXJybm8gdmFsdWUgdG8gZmluZCB0aGUgZXF1aXZhbGVudCBzeW1ib2xpYyB2YWx1ZS4gKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiplcnJvcl9uYW1lczsKLXN0YXRpYyBpbnQgbnVtX2Vycm9yX25hbWVzID0gMDsKLQotLyogVHJhbnNsYXRpb24gdGFibGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBhdCBydW50aW1lLCBpZiBpdCBkb2VzIG5vdAotICAgYWxyZWFkeSBleGlzdCBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudC4gIEluZGV4ZWQgYnkgdGhlIGVycm5vIHZhbHVlIHRvIGZpbmQKLSAgIHRoZSBkZXNjcmlwdGl2ZSBzdHJpbmcuCi0KLSAgIFdlIGRvbid0IGV4cG9ydCBpdCBmb3IgdXNlIGluIG90aGVyIG1vZHVsZXMgYmVjYXVzZSBldmVuIHRob3VnaCBpdCBoYXMgdGhlCi0gICBzYW1lIG5hbWUsIGl0IGRpZmZlcnMgZnJvbSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhhdCBpdCBpcyBkeW5hbWljYWxseQotICAgaW5pdGlhbGl6ZWQgcmF0aGVyIHRoYW4gc3RhdGljYWxseSBpbml0aWFsaXplZC4gKi8KLQotI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLXN0YXRpYyBpbnQgc3lzX25lcnI7Ci1zdGF0aWMgY29uc3QgY2hhciAqKnN5c19lcnJsaXN0OwotCi0jZWxzZQotCi1leHRlcm4gaW50IHN5c19uZXJyOwotZXh0ZXJuIGNoYXIgKnN5c19lcnJsaXN0W107Ci0KLSNlbmRpZgotCi0KLS8qCi0KLU5BTUUKLQotCWluaXRfZXJyb3JfdGFibGVzIC0tIGluaXRpYWxpemUgdGhlIG5hbWUgYW5kIG1lc3NhZ2UgdGFibGVzCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgdm9pZCBpbml0X2Vycm9yX3RhYmxlcyAoKTsKLQotREVTQ1JJUFRJT04KLQotCVVzaW5nIHRoZSBlcnJvcl90YWJsZSwgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgYXQgY29tcGlsZSB0aW1lLCBnZW5lcmF0ZQotCXRoZSBlcnJvcl9uYW1lcyBhbmQgdGhlIHN5c19lcnJsaXN0IChpZiBuZWVkZWQpIHRhYmxlcywgd2hpY2ggYXJlCi0JaW5kZXhlZCBhdCBydW50aW1lIGJ5IGEgc3BlY2lmaWMgZXJybm8gdmFsdWUuCi0KLUJVR1MKLQotCVRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdGFibGVzIG1heSBmYWlsIHVuZGVyIGxvdyBtZW1vcnkgY29uZGl0aW9ucywKLQlpbiB3aGljaCBjYXNlIHdlIGRvbid0IGRvIGFueXRoaW5nIHBhcnRpY3VsYXJseSB1c2VmdWwsIGJ1dCB3ZSBkb24ndAotCWJvbWIgZWl0aGVyLiAgV2hvIGtub3dzLCBpdCBtaWdodCBzdWNjZWVkIGF0IGEgbGF0ZXIgcG9pbnQgaWYgd2UgZnJlZQotCXNvbWUgbWVtb3J5IGluIHRoZSBtZWFudGltZS4gIEluIGFueSBjYXNlLCB0aGUgb3RoZXIgcm91dGluZXMga25vdwotCWhvdyB0byBkZWFsIHdpdGggbGFjayBvZiBhIHRhYmxlIGFmdGVyIHRyeWluZyB0byBpbml0aWFsaXplIGl0LiAgVGhpcwotCW1heSBvciBtYXkgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgYSBidWcsIHRoYXQgd2UgZG9uJ3Qgc3BlY2lmaWNhbGx5Ci0Jd2FybiBhYm91dCB0aGlzIHBhcnRpY3VsYXIgZmFpbHVyZSBtb2RlLgotCi0qLwotCi1zdGF0aWMgdm9pZAotaW5pdF9lcnJvcl90YWJsZXMgKCkKLXsKLSAgY29uc3Qgc3RydWN0IGVycm9yX2luZm8gKmVpcDsKLSAgaW50IG5ieXRlczsKLQotICAvKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgc2Nhbm5lZCB0aGUgZXJyb3JfdGFibGUgb25jZSB0byBmaW5kIHRoZSBtYXhpbXVtCi0gICAgIGVycm5vIHZhbHVlLCB0aGVuIGdvIGZpbmQgaXQgbm93LiAqLwotCi0gIGlmIChudW1fZXJyb3JfbmFtZXMgPT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKGVpcCA9IGVycm9yX3RhYmxlOyBlaXAgLT4gbmFtZSAhPSBOVUxMOyBlaXArKykKLQl7Ci0JICBpZiAoZWlwIC0+IHZhbHVlID49IG51bV9lcnJvcl9uYW1lcykKLQkgICAgewotCSAgICAgIG51bV9lcnJvcl9uYW1lcyA9IGVpcCAtPiB2YWx1ZSArIDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBlcnJvcl9uYW1lcyB0YWJsZSwgemVybyBpdCBvdXQsIGFuZCB0aGVuCi0gICAgIGluaXRpYWxpemUgaXQgZnJvbSB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBlcnJvcl90YWJsZS4gKi8KLQotICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBuYnl0ZXMgPSBudW1fZXJyb3JfbmFtZXMgKiBzaXplb2YgKGNoYXIgKik7Ci0gICAgICBpZiAoKGVycm9yX25hbWVzID0gKGNvbnN0IGNoYXIgKiopIG1hbGxvYyAobmJ5dGVzKSkgIT0gTlVMTCkKLQl7Ci0JICBtZW1zZXQgKGVycm9yX25hbWVzLCAwLCBuYnl0ZXMpOwotCSAgZm9yIChlaXAgPSBlcnJvcl90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JICAgIHsKLQkgICAgICBlcnJvcl9uYW1lc1tlaXAgLT4gdmFsdWVdID0gZWlwIC0+IG5hbWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jaWZuZGVmIEhBVkVfU1lTX0VSUkxJU1QKLQotICAvKiBOb3cgYXR0ZW1wdCB0byBhbGxvY2F0ZSB0aGUgc3lzX2Vycmxpc3QgdGFibGUsIHplcm8gaXQgb3V0LCBhbmQgdGhlbgotICAgICBpbml0aWFsaXplIGl0IGZyb20gdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgZXJyb3JfdGFibGUuICovCi0KLSAgaWYgKHN5c19lcnJsaXN0ID09IE5VTEwpCi0gICAgewotICAgICAgbmJ5dGVzID0gbnVtX2Vycm9yX25hbWVzICogc2l6ZW9mIChjaGFyICopOwotICAgICAgaWYgKChzeXNfZXJybGlzdCA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKG5ieXRlcykpICE9IE5VTEwpCi0JewotCSAgbWVtc2V0IChzeXNfZXJybGlzdCwgMCwgbmJ5dGVzKTsKLQkgIHN5c19uZXJyID0gbnVtX2Vycm9yX25hbWVzOwotCSAgZm9yIChlaXAgPSBlcnJvcl90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JICAgIHsKLQkgICAgICBzeXNfZXJybGlzdFtlaXAgLT4gdmFsdWVdID0gZWlwIC0+IG1zZzsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNlbmRpZgotCi19Ci0KLS8qCi0KLU5BTUUKLQotCWVycm5vX21heCAtLSByZXR1cm4gdGhlIG1heCBlcnJubyB2YWx1ZQotCi1TWU5PUFNJUwotCi0JaW50IGVycm5vX21heCAoKTsKLQotREVTQ1JJUFRJT04KLQotCVJldHVybnMgdGhlIG1heGltdW0gZXJybm8gdmFsdWUgZm9yIHdoaWNoIGEgY29ycmVzcG9uZGluZyBzeW1ib2xpYwotCW5hbWUgb3IgbWVzc2FnZSBpcyBhdmFpbGFibGUuICBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugd2hlcmUKLQl3ZSB1c2UgdGhlIHN5c19lcnJsaXN0IHN1cHBsaWVkIGJ5IHRoZSBzeXN0ZW0sIGl0IGlzIHBvc3NpYmxlIGZvcgotCXRoZXJlIHRvIGJlIG1vcmUgc3ltYm9saWMgbmFtZXMgdGhhbiBtZXNzYWdlcywgb3IgdmljZSB2ZXJzYS4KLQlJbiBmYWN0LCB0aGUgbWFudWFsIHBhZ2UgZm9yIHBlcnJvcigzQykgZXhwbGljaXRseSB3YXJucyB0aGF0IG9uZQotCXNob3VsZCBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgKHN5c19uZXJyKSBiZWZvcmUgaW5kZXhpbmcgaXQsCi0Jc2luY2UgbmV3IGVycm9yIGNvZGVzIG1heSBiZSBhZGRlZCB0byB0aGUgc3lzdGVtIGJlZm9yZSB0aGV5IGFyZQotCWFkZGVkIHRvIHRoZSB0YWJsZS4gIFRodXMgc3lzX25lcnIgbWlnaHQgYmUgc21hbGxlciB0aGFuIHZhbHVlCi0JaW1wbGllZCBieSB0aGUgbGFyZ2VzdCBlcnJubyB2YWx1ZSBkZWZpbmVkIGluIDxlcnJuby5oPi4KLQotCVdlIHJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIG9idGFpbiBhIG1lYW5pbmdmdWwKLQlzeW1ib2xpYyBuYW1lIG9yIG1lc3NhZ2UuCi0KLSovCi0KLWludAotZXJybm9fbWF4ICgpCi17Ci0gIGludCBtYXhzaXplOwotCi0gIGlmIChlcnJvcl9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfZXJyb3JfdGFibGVzICgpOwotICAgIH0KLSAgbWF4c2l6ZSA9IE1BWCAoc3lzX25lcnIsIG51bV9lcnJvcl9uYW1lcyk7Ci0gIHJldHVybiAobWF4c2l6ZSAtIDEpOwotfQotCi0jaWZuZGVmIEhBVkVfU1RSRVJST1IKLQotLyoKLQotTkFNRQotCi0Jc3RyZXJyb3IgLS0gbWFwIGFuIGVycm9yIG51bWJlciB0byBhbiBlcnJvciBtZXNzYWdlIHN0cmluZwotCi1TWU5PUFNJUwotCi0JY2hhciAqc3RyZXJyb3IgKGludCBlcnJub3ZhbCkKLQotREVTQ1JJUFRJT04KLQotCU1hcHMgYW4gZXJybm8gbnVtYmVyIHRvIGFuIGVycm9yIG1lc3NhZ2Ugc3RyaW5nLCB0aGUgY29udGVudHMgb2YKLQl3aGljaCBhcmUgaW1wbGVtZW50YXRpb24gZGVmaW5lZC4gIE9uIHN5c3RlbXMgd2hpY2ggaGF2ZSB0aGUgZXh0ZXJuYWwKLQl2YXJpYWJsZXMgc3lzX25lcnIgYW5kIHN5c19lcnJsaXN0LCB0aGVzZSBzdHJpbmdzIHdpbGwgYmUgdGhlIHNhbWUKLQlhcyB0aGUgb25lcyB1c2VkIGJ5IHBlcnJvcigpLgotCi0JSWYgdGhlIHN1cHBsaWVkIGVycm9yIG51bWJlciBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMKLQlmb3IgdGhlIHN5c19lcnJsaXN0LCBidXQgbm8gbWVzc2FnZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwYXJ0aWN1bGFyCi0JZXJyb3IgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiRXJyb3IgTlVNIiwgd2hlcmUgTlVNIGlzIHRoZQotCWVycm9yIG51bWJlci4KLQotCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgbm90IGEgdmFsaWQgaW5kZXggaW50byBzeXNfZXJybGlzdCwKLQlyZXR1cm5zIE5VTEwuCi0KLQlUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCBvbmx5IHVudGlsIHRoZQotCW5leHQgY2FsbCB0byBzdHJlcnJvci4KLQotKi8KLQotY2hhciAqCi1zdHJlcnJvciAoZXJybm92YWwpCi0gIGludCBlcnJub3ZhbDsKLXsKLSAgY2hhciAqbXNnOwotICBzdGF0aWMgY2hhciBidWZbMzJdOwotCi0jaWZuZGVmIEhBVkVfU1lTX0VSUkxJU1QKLQotICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X2Vycm9yX3RhYmxlcyAoKTsKLSAgICB9Ci0KLSNlbmRpZgotCi0gIGlmICgoZXJybm92YWwgPCAwKSB8fCAoZXJybm92YWwgPj0gc3lzX25lcnIpKQotICAgIHsKLSNpZmRlZiBFVk1TRVJSCi0gICAgICBpZiAoZXJybm92YWwgPT0gZXZtc2Vyci52YWx1ZSkKLQltc2cgPSBldm1zZXJyLm1zZzsKLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgLyogT3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybiBOVUxMICovCi0gICAgICBtc2cgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoKHN5c19lcnJsaXN0ID09IE5VTEwpIHx8IChzeXNfZXJybGlzdFtlcnJub3ZhbF0gPT0gTlVMTCkpCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGJ1dCBubyBzeXNfZXJybGlzdCBvciBubyBlbnRyeSBhdCB0aGlzIGluZGV4LiAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiRXJyb3IgJWQiLCBlcnJub3ZhbCk7Ci0gICAgICBtc2cgPSBidWY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGFuZCBhIHZhbGlkIG1lc3NhZ2UuICBKdXN0IHJldHVybiB0aGUgbWVzc2FnZS4gKi8KLSAgICAgIG1zZyA9IChjaGFyICopIHN5c19lcnJsaXN0W2Vycm5vdmFsXTsKLSAgICB9Ci0gIAotICByZXR1cm4gKG1zZyk7Ci19Ci0KLSNlbmRpZgkvKiAhIEhBVkVfU1RSRVJST1IgKi8KLQotCi0vKgotCi1OQU1FCi0KLQlzdHJlcnJubyAtLSBtYXAgYW4gZXJyb3IgbnVtYmVyIHRvIGEgc3ltYm9saWMgbmFtZSBzdHJpbmcKLQotU1lOT1BTSVMKLQotCWNvbnN0IGNoYXIgKnN0cmVycm5vIChpbnQgZXJybm92YWwpCi0KLURFU0NSSVBUSU9OCi0KLQlHaXZlbiBhbiBlcnJvciBudW1iZXIgcmV0dXJuZWQgZnJvbSBhIHN5c3RlbSBjYWxsICh0eXBpY2FsbHkKLQlyZXR1cm5lZCBpbiBlcnJubyksIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlCi0Jc3ltYm9saWMgbmFtZSBvZiB0aGF0IGVycm9yIG51bWJlciwgYXMgZm91bmQgaW4gPGVycm5vLmg+LgotCi0JSWYgdGhlIHN1cHBsaWVkIGVycm9yIG51bWJlciBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMKLQlmb3Igc3ltYm9saWMgbmFtZXMsIGJ1dCBubyBuYW1lIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBhcnRpY3VsYXIKLQllcnJvciBudW1iZXIsIHRoZW4gcmV0dXJucyB0aGUgc3RyaW5nICJFcnJvciBOVU0iLCB3aGVyZSBOVU0gaXMKLQl0aGUgZXJyb3IgbnVtYmVyLgotCi0JSWYgdGhlIHN1cHBsaWVkIGVycm9yIG51bWJlciBpcyBub3Qgd2l0aGluIHRoZSByYW5nZSBvZiB2YWxpZAotCWluZGljZXMsIHRoZW4gcmV0dXJucyBOVUxMLgotCi1CVUdTCi0KLQlUaGUgY29udGVudHMgb2YgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYXJlIG9ubHkgZ3VhcmFudGVlZCB0byBiZQotCXZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gc3RyZXJybm8uCi0KLSovCi0KLWNvbnN0IGNoYXIgKgotc3RyZXJybm8gKGVycm5vdmFsKQotICBpbnQgZXJybm92YWw7Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN0YXRpYyBjaGFyIGJ1ZlszMl07Ci0KLSAgaWYgKGVycm9yX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9lcnJvcl90YWJsZXMgKCk7Ci0gICAgfQotCi0gIGlmICgoZXJybm92YWwgPCAwKSB8fCAoZXJybm92YWwgPj0gbnVtX2Vycm9yX25hbWVzKSkKLSAgICB7Ci0jaWZkZWYgRVZNU0VSUgotICAgICAgaWYgKGVycm5vdmFsID09IGV2bXNlcnIudmFsdWUpCi0JbmFtZSA9IGV2bXNlcnIubmFtZTsKLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgLyogT3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybiBOVUxMICovCi0gICAgICBuYW1lID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChlcnJvcl9uYW1lcyA9PSBOVUxMKSB8fCAoZXJyb3JfbmFtZXNbZXJybm92YWxdID09IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBidXQgbm8gZXJyb3JfbmFtZXMgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIkVycm9yICVkIiwgZXJybm92YWwpOwotICAgICAgbmFtZSA9IChjb25zdCBjaGFyICopIGJ1ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYW5kIGEgdmFsaWQgbmFtZS4gIEp1c3QgcmV0dXJuIHRoZSBuYW1lLiAqLwotICAgICAgbmFtZSA9IGVycm9yX25hbWVzW2Vycm5vdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIChuYW1lKTsKLX0KLQotLyoKLQotTkFNRQotCi0Jc3RydG9lcnJubyAtLSBtYXAgYSBzeW1ib2xpYyBlcnJubyBuYW1lIHRvIGEgbnVtZXJpYyB2YWx1ZQotCi1TWU5PUFNJUwotCi0JaW50IHN0cnRvZXJybm8gKGNoYXIgKm5hbWUpCi0KLURFU0NSSVBUSU9OCi0KLQlHaXZlbiB0aGUgc3ltYm9saWMgbmFtZSBvZiBhIGVycm9yIG51bWJlciwgbWFwIGl0IHRvIGFuIGVycm5vIHZhbHVlLgotCUlmIG5vIHRyYW5zbGF0aW9uIGlzIGZvdW5kLCByZXR1cm5zIDAuCi0KLSovCi0KLWludAotc3RydG9lcnJubyAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IGVycm5vdmFsID0gMDsKLQotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChlcnJvcl9uYW1lcyA9PSBOVUxMKQotCXsKLQkgIGluaXRfZXJyb3JfdGFibGVzICgpOwotCX0KLSAgICAgIGZvciAoZXJybm92YWwgPSAwOyBlcnJub3ZhbCA8IG51bV9lcnJvcl9uYW1lczsgZXJybm92YWwrKykKLQl7Ci0JICBpZiAoKGVycm9yX25hbWVzW2Vycm5vdmFsXSAhPSBOVUxMKSAmJgotCSAgICAgIChzdHJjbXAgKG5hbWUsIGVycm9yX25hbWVzW2Vycm5vdmFsXSkgPT0gMCkpCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmIChlcnJub3ZhbCA9PSBudW1fZXJyb3JfbmFtZXMpCi0JewotI2lmZGVmIEVWTVNFUlIKLQkgIGlmIChzdHJjbXAgKG5hbWUsIGV2bXNlcnIubmFtZSkgPT0gMCkKLQkgICAgZXJybm92YWwgPSBldm1zZXJyLnZhbHVlOwotCSAgZWxzZQotI2VuZGlmCi0JICBlcnJub3ZhbCA9IDA7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChlcnJub3ZhbCk7Ci19Ci0KLQotLyogQSBzaW1wbGUgbGl0dGxlIG1haW4gdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHByaW50IGFsbCB0aGUgZXJybm8gdHJhbnNsYXRpb25zCi0gICBpZiBNQUlOIGlzIGRlZmluZWQgYW5kIHRoaXMgZmlsZSBpcyBjb21waWxlZCBhbmQgbGlua2VkLiAqLwotCi0jaWZkZWYgTUFJTgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50Ci1tYWluICgpCi17Ci0gIGludCBlcnJuOwotICBpbnQgZXJybm1heDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY2hhciAqbXNnOwotICBjaGFyICpzdHJlcnJvciAoKTsKLQotICBlcnJubWF4ID0gZXJybm9fbWF4ICgpOwotICBwcmludGYgKCIlZCBlbnRyaWVzIGluIG5hbWVzIHRhYmxlLlxuIiwgbnVtX2Vycm9yX25hbWVzKTsKLSAgcHJpbnRmICgiJWQgZW50cmllcyBpbiBtZXNzYWdlcyB0YWJsZS5cbiIsIHN5c19uZXJyKTsKLSAgcHJpbnRmICgiJWQgaXMgbWF4IHVzZWZ1bCBpbmRleC5cbiIsIGVycm5tYXgpOwotCi0gIC8qIEtlZXAgcHJpbnRpbmcgdmFsdWVzIHVudGlsIHdlIGdldCB0byB0aGUgZW5kIG9mICpib3RoKiB0YWJsZXMsIG5vdAotICAgICAqZWl0aGVyKiB0YWJsZS4gIE5vdGUgdGhhdCBrbm93aW5nIHRoZSBtYXhpbXVtIHVzZWZ1bCBpbmRleCBkb2VzICpub3QqCi0gICAgIHJlbGlldmUgdXMgb2YgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRlc3RpbmcgdGhlIHJldHVybiBwb2ludGVyIGZvcgotICAgICBOVUxMLiAqLwotCi0gIGZvciAoZXJybiA9IDA7IGVycm4gPD0gZXJybm1heDsgZXJybisrKQotICAgIHsKLSAgICAgIG5hbWUgPSBzdHJlcnJubyAoZXJybik7Ci0gICAgICBuYW1lID0gKG5hbWUgPT0gTlVMTCkgPyAiPE5VTEw+IiA6IG5hbWU7Ci0gICAgICBtc2cgPSBzdHJlcnJvciAoZXJybik7Ci0gICAgICBtc2cgPSAobXNnID09IE5VTEwpID8gIjxOVUxMPiIgOiBtc2c7Ci0gICAgICBwcmludGYgKCIlLTRkJS0xOHMlc1xuIiwgZXJybiwgbmFtZSwgbXNnKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cm5jYXNlY21wLmMgYi9saWJpYmVydHkvc3RybmNhc2VjbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4NWNhYy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RybmNhc2VjbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODcgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkIGFuZCB0aGF0IGR1ZSBjcmVkaXQgaXMgZ2l2ZW4KLSAqIHRvIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXkuIFRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5Ci0gKiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGhpcyBzb2Z0d2FyZQotICogaXMgcHJvdmlkZWQgYGBhcyBpcycnIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICovCi0KLSNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKLXN0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylzdHJjYXNlY21wLmMJNS41IChCZXJrZWxleSkgMTEvMjQvODciOwotI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotLyoKLSAqIFRoaXMgYXJyYXkgaXMgZGVzaWduZWQgZm9yIG1hcHBpbmcgdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVyCi0gKiB0b2dldGhlciBmb3IgYSBjYXNlIGluZGVwZW5kZW50IGNvbXBhcmlzb24uICBUaGUgbWFwcGluZ3MgYXJlCi0gKiBiYXNlZCB1cG9uIGFzY2lpIGNoYXJhY3RlciBzZXF1ZW5jZXMuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJtYXBbXSA9IHsKLQknXDAwMCcsICdcMDAxJywgJ1wwMDInLCAnXDAwMycsICdcMDA0JywgJ1wwMDUnLCAnXDAwNicsICdcMDA3JywKLQknXDAxMCcsICdcMDExJywgJ1wwMTInLCAnXDAxMycsICdcMDE0JywgJ1wwMTUnLCAnXDAxNicsICdcMDE3JywKLQknXDAyMCcsICdcMDIxJywgJ1wwMjInLCAnXDAyMycsICdcMDI0JywgJ1wwMjUnLCAnXDAyNicsICdcMDI3JywKLQknXDAzMCcsICdcMDMxJywgJ1wwMzInLCAnXDAzMycsICdcMDM0JywgJ1wwMzUnLCAnXDAzNicsICdcMDM3JywKLQknXDA0MCcsICdcMDQxJywgJ1wwNDInLCAnXDA0MycsICdcMDQ0JywgJ1wwNDUnLCAnXDA0NicsICdcMDQ3JywKLQknXDA1MCcsICdcMDUxJywgJ1wwNTInLCAnXDA1MycsICdcMDU0JywgJ1wwNTUnLCAnXDA1NicsICdcMDU3JywKLQknXDA2MCcsICdcMDYxJywgJ1wwNjInLCAnXDA2MycsICdcMDY0JywgJ1wwNjUnLCAnXDA2NicsICdcMDY3JywKLQknXDA3MCcsICdcMDcxJywgJ1wwNzInLCAnXDA3MycsICdcMDc0JywgJ1wwNzUnLCAnXDA3NicsICdcMDc3JywKLQknXDEwMCcsICdcMTQxJywgJ1wxNDInLCAnXDE0MycsICdcMTQ0JywgJ1wxNDUnLCAnXDE0NicsICdcMTQ3JywKLQknXDE1MCcsICdcMTUxJywgJ1wxNTInLCAnXDE1MycsICdcMTU0JywgJ1wxNTUnLCAnXDE1NicsICdcMTU3JywKLQknXDE2MCcsICdcMTYxJywgJ1wxNjInLCAnXDE2MycsICdcMTY0JywgJ1wxNjUnLCAnXDE2NicsICdcMTY3JywKLQknXDE3MCcsICdcMTcxJywgJ1wxNzInLCAnXDEzMycsICdcMTM0JywgJ1wxMzUnLCAnXDEzNicsICdcMTM3JywKLQknXDE0MCcsICdcMTQxJywgJ1wxNDInLCAnXDE0MycsICdcMTQ0JywgJ1wxNDUnLCAnXDE0NicsICdcMTQ3JywKLQknXDE1MCcsICdcMTUxJywgJ1wxNTInLCAnXDE1MycsICdcMTU0JywgJ1wxNTUnLCAnXDE1NicsICdcMTU3JywKLQknXDE2MCcsICdcMTYxJywgJ1wxNjInLCAnXDE2MycsICdcMTY0JywgJ1wxNjUnLCAnXDE2NicsICdcMTY3JywKLQknXDE3MCcsICdcMTcxJywgJ1wxNzInLCAnXDE3MycsICdcMTc0JywgJ1wxNzUnLCAnXDE3NicsICdcMTc3JywKLQknXDIwMCcsICdcMjAxJywgJ1wyMDInLCAnXDIwMycsICdcMjA0JywgJ1wyMDUnLCAnXDIwNicsICdcMjA3JywKLQknXDIxMCcsICdcMjExJywgJ1wyMTInLCAnXDIxMycsICdcMjE0JywgJ1wyMTUnLCAnXDIxNicsICdcMjE3JywKLQknXDIyMCcsICdcMjIxJywgJ1wyMjInLCAnXDIyMycsICdcMjI0JywgJ1wyMjUnLCAnXDIyNicsICdcMjI3JywKLQknXDIzMCcsICdcMjMxJywgJ1wyMzInLCAnXDIzMycsICdcMjM0JywgJ1wyMzUnLCAnXDIzNicsICdcMjM3JywKLQknXDI0MCcsICdcMjQxJywgJ1wyNDInLCAnXDI0MycsICdcMjQ0JywgJ1wyNDUnLCAnXDI0NicsICdcMjQ3JywKLQknXDI1MCcsICdcMjUxJywgJ1wyNTInLCAnXDI1MycsICdcMjU0JywgJ1wyNTUnLCAnXDI1NicsICdcMjU3JywKLQknXDI2MCcsICdcMjYxJywgJ1wyNjInLCAnXDI2MycsICdcMjY0JywgJ1wyNjUnLCAnXDI2NicsICdcMjY3JywKLQknXDI3MCcsICdcMjcxJywgJ1wyNzInLCAnXDI3MycsICdcMjc0JywgJ1wyNzUnLCAnXDI3NicsICdcMjc3JywKLQknXDMwMCcsICdcMzQxJywgJ1wzNDInLCAnXDM0MycsICdcMzQ0JywgJ1wzNDUnLCAnXDM0NicsICdcMzQ3JywKLQknXDM1MCcsICdcMzUxJywgJ1wzNTInLCAnXDM1MycsICdcMzU0JywgJ1wzNTUnLCAnXDM1NicsICdcMzU3JywKLQknXDM2MCcsICdcMzYxJywgJ1wzNjInLCAnXDM2MycsICdcMzY0JywgJ1wzNjUnLCAnXDM2NicsICdcMzY3JywKLQknXDM3MCcsICdcMzcxJywgJ1wzNzInLCAnXDMzMycsICdcMzM0JywgJ1wzMzUnLCAnXDMzNicsICdcMzM3JywKLQknXDM0MCcsICdcMzQxJywgJ1wzNDInLCAnXDM0MycsICdcMzQ0JywgJ1wzNDUnLCAnXDM0NicsICdcMzQ3JywKLQknXDM1MCcsICdcMzUxJywgJ1wzNTInLCAnXDM1MycsICdcMzU0JywgJ1wzNTUnLCAnXDM1NicsICdcMzU3JywKLQknXDM2MCcsICdcMzYxJywgJ1wzNjInLCAnXDM2MycsICdcMzY0JywgJ1wzNjUnLCAnXDM2NicsICdcMzY3JywKLQknXDM3MCcsICdcMzcxJywgJ1wzNzInLCAnXDM3MycsICdcMzc0JywgJ1wzNzUnLCAnXDM3NicsICdcMzc3JywKLX07Ci0KLWludAotc3RybmNhc2VjbXAoczEsIHMyLCBuKQotCWNvbnN0IGNoYXIgKnMxLCAqczI7Ci0JcmVnaXN0ZXIgc2l6ZV90IG47Ci17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciB1MSwgdTI7Ci0KLSAgICBmb3IgKDsgbiAhPSAwOyAtLW4pIHsKLQl1MSA9ICh1bnNpZ25lZCBjaGFyKSAqczErKzsKLQl1MiA9ICh1bnNpZ25lZCBjaGFyKSAqczIrKzsKLQlpZiAoY2hhcm1hcFt1MV0gIT0gY2hhcm1hcFt1Ml0pIHsKLQkgICAgcmV0dXJuIGNoYXJtYXBbdTFdIC0gY2hhcm1hcFt1Ml07Ci0JfQotCWlmICh1MSA9PSAnXDAnKSB7Ci0JICAgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RycmNoci5jIGIvbGliaWJlcnR5L3N0cnJjaHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwNWJjYi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RycmNoci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogUG9ydGFibGUgdmVyc2lvbiBvZiBzdHJyY2hyKCkuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLwotCi0vKgotTkFNRQotCXN0cnJjaHIgLS0gcmV0dXJuIHBvaW50ZXIgdG8gbGFzdCBvY2N1cmFuY2Ugb2YgYSBjaGFyYWN0ZXIKLQotU1lOT1BTSVMKLQljaGFyICpzdHJyY2hyIChjb25zdCBjaGFyICpzLCBpbnQgYykKLQotREVTQ1JJUFRJT04KLQlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbGFzdCBvY2N1cmFuY2Ugb2YgY2hhcmFjdGVyIEMgaW4KLQlzdHJpbmcgUywgb3IgYSBOVUxMIHBvaW50ZXIgaWYgbm8gb2NjdXJhbmNlIGlzIGZvdW5kLgotCQotQlVHUwotCUJlaGF2aW9yIHdoZW4gY2hhcmFjdGVyIGlzIHRoZSBudWxsIGNoYXJhY3RlciBpcyBpbXBsZW1lbnRhdGlvbgotCWRlcGVuZGVudC4KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi1jaGFyICoKLXN0cnJjaHIgKHMsIGMpCi0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7Ci0gIGludCBjOwotewotICBjaGFyICpydG52YWwgPSAwOwotCi0gIGRvIHsKLSAgICBpZiAoKnMgPT0gYykKLSAgICAgIHJ0bnZhbCA9IChjaGFyKikgczsKLSAgfSB3aGlsZSAoKnMrKyk7Ci0gIHJldHVybiAocnRudmFsKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJzaWduYWwuYyBiL2xpYmliZXJ0eS9zdHJzaWduYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdiYjEwYy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3Ryc2lnbmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDQgKzAsMCBAQAotLyogRXh0ZW5kZWQgc3VwcG9ydCBmb3IgdXNpbmcgc2lnbmFsIHZhbHVlcy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAgZm5mQGN5Z251cy5jb20KLSAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLS8qIFdlIG5lZWQgdG8gZGVjbGFyZSBzeXNfc2lnbGlzdCwgYmVjYXVzZSBldmVuIGlmIHRoZSBzeXN0ZW0gcHJvdmlkZXMKLSAgIGl0IHdlIGNhbid0IGFzc3VtZSB0aGF0IGl0IGlzIGRlY2xhcmVkIGluIDxzaWduYWwuaD4gKGZvciBleGFtcGxlLAotICAgU3VuT1MgcHJvdmlkZXMgc3lzX3NpZ2xpc3QsIGJ1dCBpdCBkb2VzIG5vdCBkZWNsYXJlIGl0IGluIGFueQotICAgaGVhZGVyIGZpbGUpLiAgZkhvd2V2ZXIsIHdlIGNhbid0IGRlY2xhcmUgc3lzX3NpZ2xpc3QgcG9ydGFibHksCi0gICBiZWNhdXNlIG9uIHNvbWUgc3lzdGVtcyBpdCBpcyBkZWNsYXJlZCB3aXRoIGNvbnN0IGFuZCBvbiBzb21lCi0gICBzeXN0ZW1zIGl0IGlzIGRlY2xhcmVkIHdpdGhvdXQgY29uc3QuICBJZiB3ZSB3ZXJlIHVzaW5nIGF1dG9jb25mLAotICAgd2UgY291bGQgd29yayBvdXQgdGhlIHJpZ2h0IGRlY2xhcmF0aW9uLiAgVW50aWwsIHRoZW4gd2UganVzdAotICAgaWdub3JlIGFueSBkZWNsYXJhdGlvbiBpbiB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcywgYW5kIGFsd2F5cwotICAgZGVjbGFyZSBpdCBvdXJzZWx2ZXMuICBXaXRoIGx1Y2ssIHRoaXMgd2lsbCBhbHdheXMgd29yay4gICovCi0jZGVmaW5lIHN5c19zaWdsaXN0IG5vX3N1Y2hfc3ltYm9sCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKiAgUm91dGluZXMgaW1wb3J0ZWQgZnJvbSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyaWVzLiAqLwotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLWV4dGVybiB2b2lkICptYWxsb2MgKHNpemVfdCBzaXplKTsJCQkJLyogNC4xMC4zLjMgKi8KLWV4dGVybiB2b2lkICptZW1zZXQgKHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CQkJLyogNC4xMS42LjEgKi8KLSNlbHNlCS8qICFfX1NURENfXyAqLwotZXh0ZXJuIGNoYXIgKm1hbGxvYyAoKTsJCS8qIFN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0ZXIgKi8KLWV4dGVybiBjaGFyICptZW1zZXQgKCk7Ci0jZW5kaWYJLyogX19TVERDX18gKi8KLQotLyogVW5kZWZpbmUgdGhlIG1hY3JvIHdlIHVzZWQgdG8gaGlkZSB0aGUgZGVmaW5pdGlvbiBvZiBzeXNfc2lnbGlzdAotICAgZm91bmQgaW4gdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIHN5c19zaWdsaXN0Ci0KLSNpZm5kZWYgTlVMTAotIyAgaWZkZWYgX19TVERDX18KLSMgICAgZGVmaW5lIE5VTEwgKHZvaWQgKikgMAotIyAgZWxzZQotIyAgICBkZWZpbmUgTlVMTCAwCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgTUFYCi0jICBkZWZpbmUgTUFYKGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBpbml0X3NpZ25hbF90YWJsZXMgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBmb3Igc2lnbmFsIHZhbHVlcy4KLQotICAgTm90ZSB0aGF0IHRoaXMgdGFibGUgaXMgZ2VuZXJhbGx5IG9ubHkgYWNjZXNzZWQgd2hlbiBpdCBpcyB1c2VkIGF0IHJ1bnRpbWUKLSAgIHRvIGluaXRpYWxpemUgc2lnbmFsIG5hbWUgYW5kIG1lc3NhZ2UgdGFibGVzIHRoYXQgYXJlIGluZGV4ZWQgYnkgc2lnbmFsCi0gICB2YWx1ZS4KLQotICAgTm90IGFsbCBvZiB0aGVzZSBzaWduYWxzIHdpbGwgZXhpc3Qgb24gYWxsIHN5c3RlbXMuICBUaGlzIHRhYmxlIGlzIHRoZSBvbmx5Ci0gICB0aGluZyB0aGF0IHNob3VsZCBoYXZlIHRvIGJlIHVwZGF0ZWQgYXMgbmV3IHNpZ25hbCBudW1iZXJzIGFyZSBpbnRyb2R1Y2VkLgotICAgSXQncyBzb3J0IG9mIHVnbHksIGJ1dCBhdCBsZWFzdCBpdHMgcG9ydGFibGUuICovCi0KLXN0cnVjdCBzaWduYWxfaW5mbwotewotICBpbnQgdmFsdWU7CQkvKiBUaGUgbnVtZXJpYyB2YWx1ZSBmcm9tIDxzaWduYWwuaD4gKi8KLSAgY29uc3QgY2hhciAqbmFtZTsJLyogVGhlIGVxdWl2YWxlbnQgc3ltYm9saWMgdmFsdWUgKi8KLSNpZm5kZWYgSEFWRV9TWVNfU0lHTElTVAotICBjb25zdCBjaGFyICptc2c7CS8qIFNob3J0IG1lc3NhZ2UgYWJvdXQgdGhpcyB2YWx1ZSAqLwotI2VuZGlmCi19OwotCi0jaWZuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLSMgICBkZWZpbmUgRU5UUlkodmFsdWUsIG5hbWUsIG1zZykJe3ZhbHVlLCBuYW1lLCBtc2d9Ci0jZWxzZQotIyAgIGRlZmluZSBFTlRSWSh2YWx1ZSwgbmFtZSwgbXNnKQl7dmFsdWUsIG5hbWV9Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaWduYWxfaW5mbyBzaWduYWxfdGFibGVbXSA9Ci17Ci0jaWYgZGVmaW5lZCAoU0lHSFVQKQotICBFTlRSWShTSUdIVVAsICJTSUdIVVAiLCAiSGFuZ3VwIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdJTlQpCi0gIEVOVFJZKFNJR0lOVCwgIlNJR0lOVCIsICJJbnRlcnJ1cHQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1FVSVQpCi0gIEVOVFJZKFNJR1FVSVQsICJTSUdRVUlUIiwgIlF1aXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0lMTCkKLSAgRU5UUlkoU0lHSUxMLCAiU0lHSUxMIiwgIklsbGVnYWwgaW5zdHJ1Y3Rpb24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1RSQVApCi0gIEVOVFJZKFNJR1RSQVAsICJTSUdUUkFQIiwgIlRyYWNlL2JyZWFrcG9pbnQgdHJhcCIpLAotI2VuZGlmCi0vKiBQdXQgU0lHSU9UIGJlZm9yZSBTSUdBQlJULCBzbyB0aGF0IGlmIFNJR0lPVD09U0lHQUJSVCB0aGVuIFNJR0FCUlQKLSAgIG92ZXJyaWRlcyBTSUdJT1QuICBTSUdBQlJUIGlzIGluIEFOU0kgYW5kIFBPU0lYLjEsIGFuZCBTSUdJT1QgaXNuJ3QuICovCi0jaWYgZGVmaW5lZCAoU0lHSU9UKQotICBFTlRSWShTSUdJT1QsICJTSUdJT1QiLCAiSU9UIHRyYXAiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0FCUlQpCi0gIEVOVFJZKFNJR0FCUlQsICJTSUdBQlJUIiwgIkFib3J0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0VNVCkKLSAgRU5UUlkoU0lHRU1ULCAiU0lHRU1UIiwgIkVtdWxhdGlvbiB0cmFwIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdGUEUpCi0gIEVOVFJZKFNJR0ZQRSwgIlNJR0ZQRSIsICJBcml0aG1ldGljIGV4Y2VwdGlvbiIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHS0lMTCkKLSAgRU5UUlkoU0lHS0lMTCwgIlNJR0tJTEwiLCAiS2lsbGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdCVVMpCi0gIEVOVFJZKFNJR0JVUywgIlNJR0JVUyIsICJCdXMgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1NFR1YpCi0gIEVOVFJZKFNJR1NFR1YsICJTSUdTRUdWIiwgIlNlZ21lbnRhdGlvbiBmYXVsdCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHU1lTKQotICBFTlRSWShTSUdTWVMsICJTSUdTWVMiLCAiQmFkIHN5c3RlbSBjYWxsIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdQSVBFKQotICBFTlRSWShTSUdQSVBFLCAiU0lHUElQRSIsICJCcm9rZW4gcGlwZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHQUxSTSkKLSAgRU5UUlkoU0lHQUxSTSwgIlNJR0FMUk0iLCAiQWxhcm0gY2xvY2siKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1RFUk0pCi0gIEVOVFJZKFNJR1RFUk0sICJTSUdURVJNIiwgIlRlcm1pbmF0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1VTUjEpCi0gIEVOVFJZKFNJR1VTUjEsICJTSUdVU1IxIiwgIlVzZXIgZGVmaW5lZCBzaWduYWwgMSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVVNSMikKLSAgRU5UUlkoU0lHVVNSMiwgIlNJR1VTUjIiLCAiVXNlciBkZWZpbmVkIHNpZ25hbCAyIiksCi0jZW5kaWYKLS8qIFB1dCBTSUdDTEQgYmVmb3JlIFNJR0NITEQsIHNvIHRoYXQgaWYgU0lHQ0xEPT1TSUdDSExEIHRoZW4gU0lHQ0hMRAotICAgb3ZlcnJpZGVzIFNJR0NMRC4gIFNJR0NITEQgaXMgaW4gUE9YSVguMSAqLwotI2lmIGRlZmluZWQgKFNJR0NMRCkKLSAgRU5UUlkoU0lHQ0xELCAiU0lHQ0xEIiwgIkNoaWxkIHN0YXR1cyBjaGFuZ2VkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdDSExEKQotICBFTlRSWShTSUdDSExELCAiU0lHQ0hMRCIsICJDaGlsZCBzdGF0dXMgY2hhbmdlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUFdSKQotICBFTlRSWShTSUdQV1IsICJTSUdQV1IiLCAiUG93ZXIgZmFpbC9yZXN0YXJ0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdXSU5DSCkKLSAgRU5UUlkoU0lHV0lOQ0gsICJTSUdXSU5DSCIsICJXaW5kb3cgc2l6ZSBjaGFuZ2VkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdVUkcpCi0gIEVOVFJZKFNJR1VSRywgIlNJR1VSRyIsICJVcmdlbnQgSS9PIGNvbmRpdGlvbiIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHSU8pCi0gIC8qICJJL08gcGVuZGluZyIgaGFzIGFsc28gYmVlbiBzdWdnZXN0ZWQsIGJ1dCBpcyBtaXNsZWFkaW5nIHNpbmNlIHRoZQotICAgICBzaWduYWwgb25seSBoYXBwZW5zIHdoZW4gdGhlIHByb2Nlc3MgaGFzIGFza2VkIGZvciBpdCwgbm90IGV2ZXJ5dGltZQotICAgICBJL08gaXMgcGVuZGluZy4gKi8KLSAgRU5UUlkoU0lHSU8sICJTSUdJTyIsICJJL08gcG9zc2libGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1BPTEwpCi0gIEVOVFJZKFNJR1BPTEwsICJTSUdQT0xMIiwgIlBvbGxhYmxlIGV2ZW50IG9jY3VycmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdTVE9QKQotICBFTlRSWShTSUdTVE9QLCAiU0lHU1RPUCIsICJTdG9wcGVkIChzaWduYWwpIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdUU1RQKQotICBFTlRSWShTSUdUU1RQLCAiU0lHVFNUUCIsICJTdG9wcGVkICh1c2VyKSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHQ09OVCkKLSAgRU5UUlkoU0lHQ09OVCwgIlNJR0NPTlQiLCAiQ29udGludWVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdUVElOKQotICBFTlRSWShTSUdUVElOLCAiU0lHVFRJTiIsICJTdG9wcGVkICh0dHkgaW5wdXQpIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdUVE9VKQotICBFTlRSWShTSUdUVE9VLCAiU0lHVFRPVSIsICJTdG9wcGVkICh0dHkgb3V0cHV0KSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVlRBTFJNKQotICBFTlRSWShTSUdWVEFMUk0sICJTSUdWVEFMUk0iLCAiVmlydHVhbCB0aW1lciBleHBpcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdQUk9GKQotICBFTlRSWShTSUdQUk9GLCAiU0lHUFJPRiIsICJQcm9maWxpbmcgdGltZXIgZXhwaXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHWENQVSkKLSAgRU5UUlkoU0lHWENQVSwgIlNJR1hDUFUiLCAiQ1BVIHRpbWUgbGltaXQgZXhjZWVkZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1hGU1opCi0gIEVOVFJZKFNJR1hGU1osICJTSUdYRlNaIiwgIkZpbGUgc2l6ZSBsaW1pdCBleGNlZWRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHV0lORCkKLSAgRU5UUlkoU0lHV0lORCwgIlNJR1dJTkQiLCAiU0lHV0lORCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUEhPTkUpCi0gIEVOVFJZKFNJR1BIT05FLCAiU0lHUEhPTkUiLCAiU0lHUEhPTkUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0xPU1QpCi0gIEVOVFJZKFNJR0xPU1QsICJTSUdMT1NUIiwgIlJlc291cmNlIGxvc3QiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1dBSVRJTkcpCi0gIEVOVFJZKFNJR1dBSVRJTkcsICJTSUdXQUlUSU5HIiwgIlByb2Nlc3MncyBMV1BzIGFyZSBibG9ja2VkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdMV1ApCi0gIEVOVFJZKFNJR0xXUCwgIlNJR0xXUCIsICJTaWduYWwgTFdQIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdEQU5HRVIpCi0gIEVOVFJZKFNJR0RBTkdFUiwgIlNJR0RBTkdFUiIsICJTd2FwIHNwYWNlIGRhbmdlcm91c2x5IGxvdyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHR1JBTlQpCi0gIEVOVFJZKFNJR0dSQU5ULCAiU0lHR1JBTlQiLCAiTW9uaXRvciBtb2RlIGdyYW50ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1JFVFJBQ1QpCi0gIEVOVFJZKFNJR1JFVFJBQ1QsICJTSUdSRVRSQUNUIiwgIk5lZWQgdG8gcmVsaW5ndWlzaCBtb25pdG9yIG1vZGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR01TRykKLSAgRU5UUlkoU0lHTVNHLCAiU0lHTVNHIiwgIk1vbml0b3IgbW9kZSBkYXRhIGF2YWlsYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHU09VTkQpCi0gIEVOVFJZKFNJR1NPVU5ELCAiU0lHU09VTkQiLCAiU291bmQgY29tcGxldGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdTQUspCi0gIEVOVFJZKFNJR1NBSywgIlNJR1NBSyIsICJTZWN1cmUgYXR0ZW50aW9uIiksCi0jZW5kaWYKLSAgRU5UUlkoMCwgTlVMTCwgTlVMTCkKLX07Ci0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgcnVudGltZS4gIEluZGV4ZWQgYnkgdGhlCi0gICBzaWduYWwgdmFsdWUgdG8gZmluZCB0aGUgZXF1aXZhbGVudCBzeW1ib2xpYyB2YWx1ZS4gKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKipzaWduYWxfbmFtZXM7Ci1zdGF0aWMgaW50IG51bV9zaWduYWxfbmFtZXMgPSAwOwotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGF0IHJ1bnRpbWUsIGlmIGl0IGRvZXMgbm90Ci0gICBhbHJlYWR5IGV4aXN0IGluIHRoZSBob3N0IGVudmlyb25tZW50LiAgSW5kZXhlZCBieSB0aGUgc2lnbmFsIHZhbHVlIHRvIGZpbmQKLSAgIHRoZSBkZXNjcmlwdGl2ZSBzdHJpbmcuCi0KLSAgIFdlIGRvbid0IGV4cG9ydCBpdCBmb3IgdXNlIGluIG90aGVyIG1vZHVsZXMgYmVjYXVzZSBldmVuIHRob3VnaCBpdCBoYXMgdGhlCi0gICBzYW1lIG5hbWUsIGl0IGRpZmZlcnMgZnJvbSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhhdCBpdCBpcyBkeW5hbWljYWxseQotICAgaW5pdGlhbGl6ZWQgcmF0aGVyIHRoYW4gc3RhdGljYWxseSBpbml0aWFsaXplZC4gKi8KLQotI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCi0KLXN0YXRpYyBpbnQgc3lzX25zaWc7Ci1zdGF0aWMgY29uc3QgY2hhciAqKnN5c19zaWdsaXN0OwotCi0jZWxzZQotCi0jaWZkZWYgTlNJRwotc3RhdGljIGludCBzeXNfbnNpZyA9IE5TSUc7Ci0jZWxzZQotI2lmZGVmIF9OU0lHCi1zdGF0aWMgaW50IHN5c19uc2lnID0gX05TSUc7Ci0jZW5kaWYKLSNlbmRpZgotZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBzeXNfc2lnbGlzdFtdOwotCi0jZW5kaWYKLQotCi0vKgotCi1OQU1FCi0KLQlpbml0X3NpZ25hbF90YWJsZXMgLS0gaW5pdGlhbGl6ZSB0aGUgbmFtZSBhbmQgbWVzc2FnZSB0YWJsZXMKLQotU1lOT1BTSVMKLQotCXN0YXRpYyB2b2lkIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKLQotREVTQ1JJUFRJT04KLQotCVVzaW5nIHRoZSBzaWduYWxfdGFibGUsIHdoaWNoIGlzIGluaXRpYWxpemVkIGF0IGNvbXBpbGUgdGltZSwgZ2VuZXJhdGUKLQl0aGUgc2lnbmFsX25hbWVzIGFuZCB0aGUgc3lzX3NpZ2xpc3QgKGlmIG5lZWRlZCkgdGFibGVzLCB3aGljaCBhcmUKLQlpbmRleGVkIGF0IHJ1bnRpbWUgYnkgYSBzcGVjaWZpYyBzaWduYWwgdmFsdWUuCi0KLUJVR1MKLQotCVRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdGFibGVzIG1heSBmYWlsIHVuZGVyIGxvdyBtZW1vcnkgY29uZGl0aW9ucywKLQlpbiB3aGljaCBjYXNlIHdlIGRvbid0IGRvIGFueXRoaW5nIHBhcnRpY3VsYXJseSB1c2VmdWwsIGJ1dCB3ZSBkb24ndAotCWJvbWIgZWl0aGVyLiAgV2hvIGtub3dzLCBpdCBtaWdodCBzdWNjZWVkIGF0IGEgbGF0ZXIgcG9pbnQgaWYgd2UgZnJlZQotCXNvbWUgbWVtb3J5IGluIHRoZSBtZWFudGltZS4gIEluIGFueSBjYXNlLCB0aGUgb3RoZXIgcm91dGluZXMga25vdwotCWhvdyB0byBkZWFsIHdpdGggbGFjayBvZiBhIHRhYmxlIGFmdGVyIHRyeWluZyB0byBpbml0aWFsaXplIGl0LiAgVGhpcwotCW1heSBvciBtYXkgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgYSBidWcsIHRoYXQgd2UgZG9uJ3Qgc3BlY2lmaWNhbGx5Ci0Jd2FybiBhYm91dCB0aGlzIHBhcnRpY3VsYXIgZmFpbHVyZSBtb2RlLgotCi0qLwotCi1zdGF0aWMgdm9pZAotaW5pdF9zaWduYWxfdGFibGVzICgpCi17Ci0gIGNvbnN0IHN0cnVjdCBzaWduYWxfaW5mbyAqZWlwOwotICBpbnQgbmJ5dGVzOwotCi0gIC8qIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSBzY2FubmVkIHRoZSBzaWduYWxfdGFibGUgb25jZSB0byBmaW5kIHRoZSBtYXhpbXVtCi0gICAgIHNpZ25hbCB2YWx1ZSwgdGhlbiBnbyBmaW5kIGl0IG5vdy4gKi8KLQotICBpZiAobnVtX3NpZ25hbF9uYW1lcyA9PSAwKQotICAgIHsKLSAgICAgIGZvciAoZWlwID0gc2lnbmFsX3RhYmxlOyBlaXAgLT4gbmFtZSAhPSBOVUxMOyBlaXArKykKLQl7Ci0JICBpZiAoZWlwIC0+IHZhbHVlID49IG51bV9zaWduYWxfbmFtZXMpCi0JICAgIHsKLQkgICAgICBudW1fc2lnbmFsX25hbWVzID0gZWlwIC0+IHZhbHVlICsgMTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogTm93IGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHNpZ25hbF9uYW1lcyB0YWJsZSwgemVybyBpdCBvdXQsIGFuZCB0aGVuCi0gICAgIGluaXRpYWxpemUgaXQgZnJvbSB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBzaWduYWxfdGFibGUuICovCi0KLSAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG5ieXRlcyA9IG51bV9zaWduYWxfbmFtZXMgKiBzaXplb2YgKGNoYXIgKik7Ci0gICAgICBpZiAoKHNpZ25hbF9uYW1lcyA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKG5ieXRlcykpICE9IE5VTEwpCi0JewotCSAgbWVtc2V0IChzaWduYWxfbmFtZXMsIDAsIG5ieXRlcyk7Ci0JICBmb3IgKGVpcCA9IHNpZ25hbF90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCi0JICAgIHsKLQkgICAgICBzaWduYWxfbmFtZXNbZWlwIC0+IHZhbHVlXSA9IGVpcCAtPiBuYW1lOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCi0KLSAgLyogTm93IGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHN5c19zaWdsaXN0IHRhYmxlLCB6ZXJvIGl0IG91dCwgYW5kIHRoZW4KLSAgICAgaW5pdGlhbGl6ZSBpdCBmcm9tIHRoZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHNpZ25hbF90YWJsZS4gKi8KLQotICBpZiAoc3lzX3NpZ2xpc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBuYnl0ZXMgPSBudW1fc2lnbmFsX25hbWVzICogc2l6ZW9mIChjaGFyICopOwotICAgICAgaWYgKChzeXNfc2lnbGlzdCA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKG5ieXRlcykpICE9IE5VTEwpCi0JewotCSAgbWVtc2V0IChzeXNfc2lnbGlzdCwgMCwgbmJ5dGVzKTsKLQkgIHN5c19uc2lnID0gbnVtX3NpZ25hbF9uYW1lczsKLQkgIGZvciAoZWlwID0gc2lnbmFsX3RhYmxlOyBlaXAgLT4gbmFtZSAhPSBOVUxMOyBlaXArKykKLQkgICAgewotCSAgICAgIHN5c19zaWdsaXN0W2VpcCAtPiB2YWx1ZV0gPSBlaXAgLT4gbXNnOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2VuZGlmCi0KLX0KLQotCi0vKgotCi1OQU1FCi0KLQlzaWdub19tYXggLS0gcmV0dXJuIHRoZSBtYXggc2lnbm8gdmFsdWUKLQotU1lOT1BTSVMKLQotCWludCBzaWdub19tYXggKCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlSZXR1cm5zIHRoZSBtYXhpbXVtIHNpZ25vIHZhbHVlIGZvciB3aGljaCBhIGNvcnJlc3BvbmRpbmcgc3ltYm9saWMKLQluYW1lIG9yIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLiAgTm90ZSB0aGF0IGluIHRoZSBjYXNlIHdoZXJlCi0Jd2UgdXNlIHRoZSBzeXNfc2lnbGlzdCBzdXBwbGllZCBieSB0aGUgc3lzdGVtLCBpdCBpcyBwb3NzaWJsZSBmb3IKLQl0aGVyZSB0byBiZSBtb3JlIHN5bWJvbGljIG5hbWVzIHRoYW4gbWVzc2FnZXMsIG9yIHZpY2UgdmVyc2EuCi0JSW4gZmFjdCwgdGhlIG1hbnVhbCBwYWdlIGZvciBwc2lnbmFsKDNiKSBleHBsaWNpdGx5IHdhcm5zIHRoYXQgb25lCi0Jc2hvdWxkIGNoZWNrIHRoZSBzaXplIG9mIHRoZSB0YWJsZSAoTlNJRykgYmVmb3JlIGluZGV4aW5nIGl0LAotCXNpbmNlIG5ldyBzaWduYWwgY29kZXMgbWF5IGJlIGFkZGVkIHRvIHRoZSBzeXN0ZW0gYmVmb3JlIHRoZXkgYXJlCi0JYWRkZWQgdG8gdGhlIHRhYmxlLiAgVGh1cyBOU0lHIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbiB2YWx1ZQotCWltcGxpZWQgYnkgdGhlIGxhcmdlc3Qgc2lnbm8gdmFsdWUgZGVmaW5lZCBpbiA8c2lnbmFsLmg+LgotCi0JV2UgcmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gb2J0YWluIGEgbWVhbmluZ2Z1bAotCXN5bWJvbGljIG5hbWUgb3IgbWVzc2FnZS4KLQotKi8KLQotaW50Ci1zaWdub19tYXggKCkKLXsKLSAgaW50IG1heHNpemU7Ci0KLSAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKLSAgICB9Ci0gIG1heHNpemUgPSBNQVggKHN5c19uc2lnLCBudW1fc2lnbmFsX25hbWVzKTsKLSAgcmV0dXJuIChtYXhzaXplIC0gMSk7Ci19Ci0KLQotLyoKLQotTkFNRQotCi0Jc3Ryc2lnbmFsIC0tIG1hcCBhIHNpZ25hbCBudW1iZXIgdG8gYSBzaWduYWwgbWVzc2FnZSBzdHJpbmcKLQotU1lOT1BTSVMKLQotCWNvbnN0IGNoYXIgKnN0cnNpZ25hbCAoaW50IHNpZ25vKQotCi1ERVNDUklQVElPTgotCi0JTWFwcyBhbiBzaWduYWwgbnVtYmVyIHRvIGFuIHNpZ25hbCBtZXNzYWdlIHN0cmluZywgdGhlIGNvbnRlbnRzIG9mCi0Jd2hpY2ggYXJlIGltcGxlbWVudGF0aW9uIGRlZmluZWQuICBPbiBzeXN0ZW1zIHdoaWNoIGhhdmUgdGhlIGV4dGVybmFsCi0JdmFyaWFibGUgc3lzX3NpZ2xpc3QsIHRoZXNlIHN0cmluZ3Mgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgb25lcyB1c2VkCi0JYnkgcHNpZ25hbCgpLgotCi0JSWYgdGhlIHN1cHBsaWVkIHNpZ25hbCBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzCi0JZm9yIHRoZSBzeXNfc2lnbGlzdCwgYnV0IG5vIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGFydGljdWxhcgotCXNpZ25hbCBudW1iZXIsIHRoZW4gcmV0dXJucyB0aGUgc3RyaW5nICJTaWduYWwgTlVNIiwgd2hlcmUgTlVNIGlzIHRoZQotCXNpZ25hbCBudW1iZXIuCi0KLQlJZiB0aGUgc3VwcGxpZWQgc2lnbmFsIG51bWJlciBpcyBub3QgYSB2YWxpZCBpbmRleCBpbnRvIHN5c19zaWdsaXN0LAotCXJldHVybnMgTlVMTC4KLQotCVRoZSByZXR1cm5lZCBzdHJpbmcgaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIHZhbGlkIG9ubHkgdW50aWwgdGhlCi0JbmV4dCBjYWxsIHRvIHN0cnNpZ25hbC4KLQotKi8KLQotI2lmbmRlZiBIQVZFX1NUUlNJR05BTAotCi1jb25zdCBjaGFyICoKLXN0cnNpZ25hbCAoc2lnbm8pCi0gIGludCBzaWdubzsKLXsKLSAgY29uc3QgY2hhciAqbXNnOwotICBzdGF0aWMgY2hhciBidWZbMzJdOwotCi0jaWZuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLQotICBpZiAoc2lnbmFsX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9zaWduYWxfdGFibGVzICgpOwotICAgIH0KLQotI2VuZGlmCi0KLSAgaWYgKChzaWdubyA8IDApIHx8IChzaWdubyA+PSBzeXNfbnNpZykpCi0gICAgewotICAgICAgLyogT3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybiBOVUxMICovCi0gICAgICBtc2cgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoKHN5c19zaWdsaXN0ID09IE5VTEwpIHx8IChzeXNfc2lnbGlzdFtzaWdub10gPT0gTlVMTCkpCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGJ1dCBubyBzeXNfc2lnbGlzdCBvciBubyBlbnRyeSBhdCB0aGlzIGluZGV4LiAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiU2lnbmFsICVkIiwgc2lnbm8pOwotICAgICAgbXNnID0gKGNvbnN0IGNoYXIgKikgYnVmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBhbmQgYSB2YWxpZCBtZXNzYWdlLiAgSnVzdCByZXR1cm4gdGhlIG1lc3NhZ2UuICovCi0gICAgICBtc2cgPSAoY29uc3QgY2hhciAqKSBzeXNfc2lnbGlzdFtzaWdub107Ci0gICAgfQotICAKLSAgcmV0dXJuIChtc2cpOwotfQotCi0jZW5kaWYgLyogISBIQVZFX1NUUlNJR05BTCAqLwotCi0vKgotCi1OQU1FCi0KLQlzdHJzaWdubyAtLSBtYXAgYW4gc2lnbmFsIG51bWJlciB0byBhIHN5bWJvbGljIG5hbWUgc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljb25zdCBjaGFyICpzdHJzaWdubyAoaW50IHNpZ25vKQotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gYW4gc2lnbmFsIG51bWJlciwgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZwotCXRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoYXQgc2lnbmFsIG51bWJlciwgYXMgZm91bmQgaW4gPHNpZ25hbC5oPi4KLQotCUlmIHRoZSBzdXBwbGllZCBzaWduYWwgbnVtYmVyIGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgaW5kaWNlcwotCWZvciBzeW1ib2xpYyBuYW1lcywgYnV0IG5vIG5hbWUgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGFydGljdWxhcgotCXNpZ25hbCBudW1iZXIsIHRoZW4gcmV0dXJucyB0aGUgc3RyaW5nICJTaWduYWwgTlVNIiwgd2hlcmUgTlVNIGlzCi0JdGhlIHNpZ25hbCBudW1iZXIuCi0KLQlJZiB0aGUgc3VwcGxpZWQgc2lnbmFsIG51bWJlciBpcyBub3Qgd2l0aGluIHRoZSByYW5nZSBvZiB2YWxpZAotCWluZGljZXMsIHRoZW4gcmV0dXJucyBOVUxMLgotCi1CVUdTCi0KLQlUaGUgY29udGVudHMgb2YgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYXJlIG9ubHkgZ3VhcmFudGVlZCB0byBiZQotCXZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gc3Ryc2lnbm8uCi0KLSovCi0KLWNvbnN0IGNoYXIgKgotc3Ryc2lnbm8gKHNpZ25vKQotICBpbnQgc2lnbm87Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN0YXRpYyBjaGFyIGJ1ZlszMl07Ci0KLSAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKLSAgICB9Ci0KLSAgaWYgKChzaWdubyA8IDApIHx8IChzaWdubyA+PSBudW1fc2lnbmFsX25hbWVzKSkKLSAgICB7Ci0gICAgICAvKiBPdXQgb2YgcmFuZ2UsIGp1c3QgcmV0dXJuIE5VTEwgKi8KLSAgICAgIG5hbWUgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoKHNpZ25hbF9uYW1lcyA9PSBOVUxMKSB8fCAoc2lnbmFsX25hbWVzW3NpZ25vXSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYnV0IG5vIHNpZ25hbF9uYW1lcyBvciBubyBlbnRyeSBhdCB0aGlzIGluZGV4LiAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiU2lnbmFsICVkIiwgc2lnbm8pOwotICAgICAgbmFtZSA9IChjb25zdCBjaGFyICopIGJ1ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYW5kIGEgdmFsaWQgbmFtZS4gIEp1c3QgcmV0dXJuIHRoZSBuYW1lLiAqLwotICAgICAgbmFtZSA9IHNpZ25hbF9uYW1lc1tzaWdub107Ci0gICAgfQotCi0gIHJldHVybiAobmFtZSk7Ci19Ci0KLQotLyoKLQotTkFNRQotCi0Jc3RydG9zaWdubyAtLSBtYXAgYSBzeW1ib2xpYyBzaWduYWwgbmFtZSB0byBhIG51bWVyaWMgdmFsdWUKLQotU1lOT1BTSVMKLQotCWludCBzdHJ0b3NpZ25vIChjaGFyICpuYW1lKQotCi1ERVNDUklQVElPTgotCi0JR2l2ZW4gdGhlIHN5bWJvbGljIG5hbWUgb2YgYSBzaWduYWwsIG1hcCBpdCB0byBhIHNpZ25hbCBudW1iZXIuCi0JSWYgbm8gdHJhbnNsYXRpb24gaXMgZm91bmQsIHJldHVybnMgMC4KLQotKi8KLQotaW50Ci1zdHJ0b3NpZ25vIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgc2lnbm8gPSAwOwotCi0gIGlmIChuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQotCXsKLQkgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKLQl9Ci0gICAgICBmb3IgKHNpZ25vID0gMDsgc2lnbm8gPCBudW1fc2lnbmFsX25hbWVzOyBzaWdubysrKQotCXsKLQkgIGlmICgoc2lnbmFsX25hbWVzW3NpZ25vXSAhPSBOVUxMKSAmJgotCSAgICAgIChzdHJjbXAgKG5hbWUsIHNpZ25hbF9uYW1lc1tzaWdub10pID09IDApKQotCSAgICB7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc2lnbm8gPT0gbnVtX3NpZ25hbF9uYW1lcykKLQl7Ci0JICBzaWdubyA9IDA7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChzaWdubyk7Ci19Ci0KLQotLyoKLQotTkFNRQotCi0JcHNpZ25hbCAtLSBwcmludCBtZXNzYWdlIGFib3V0IHNpZ25hbCB0byBzdGRlcnIKLQotU1lOT1BTSVMKLQotCXZvaWQgcHNpZ25hbCAodW5zaWduZWQgc2lnbm8sIGNoYXIgKm1lc3NhZ2UpOwotCi1ERVNDUklQVElPTgotCi0JUHJpbnQgdG8gdGhlIHN0YW5kYXJkIGVycm9yIHRoZSBtZXNzYWdlLCBmb2xsb3dlZCBieSBhIGNvbG9uLAotCWZvbGxvd2VkIGJ5IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2lnbmFsIHNwZWNpZmllZCBieSBzaWdubywKLQlmb2xsb3dlZCBieSBhIG5ld2xpbmUuCi0qLwotCi0jaWZuZGVmIEhBVkVfUFNJR05BTAotCi12b2lkCi1wc2lnbmFsIChzaWdubywgbWVzc2FnZSkKLSAgdW5zaWduZWQgc2lnbm87Ci0gIGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0gICAgfQotICBpZiAoKHNpZ25vIDw9IDApIHx8IChzaWdubyA+PSBzeXNfbnNpZykpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHVua25vd24gc2lnbmFsXG4iLCBtZXNzYWdlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIG1lc3NhZ2UsIHN5c19zaWdsaXN0W3NpZ25vXSk7Ci0gICAgfQotfQotCi0jZW5kaWYJLyogISBIQVZFX1BTSUdOQUwgKi8KLQotCi0vKiBBIHNpbXBsZSBsaXR0bGUgbWFpbiB0aGF0IGRvZXMgbm90aGluZyBidXQgcHJpbnQgYWxsIHRoZSBzaWduYWwgdHJhbnNsYXRpb25zCi0gICBpZiBNQUlOIGlzIGRlZmluZWQgYW5kIHRoaXMgZmlsZSBpcyBjb21waWxlZCBhbmQgbGlua2VkLiAqLwotCi0jaWZkZWYgTUFJTgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50Ci1tYWluICgpCi17Ci0gIGludCBzaWdubzsKLSAgaW50IG1heHNpZ25vOwotICBjb25zdCBjaGFyICpuYW1lOwotICBjb25zdCBjaGFyICptc2c7Ci0KLSAgbWF4c2lnbm8gPSBzaWdub19tYXggKCk7Ci0gIHByaW50ZiAoIiVkIGVudHJpZXMgaW4gbmFtZXMgdGFibGUuXG4iLCBudW1fc2lnbmFsX25hbWVzKTsKLSAgcHJpbnRmICgiJWQgZW50cmllcyBpbiBtZXNzYWdlcyB0YWJsZS5cbiIsIHN5c19uc2lnKTsKLSAgcHJpbnRmICgiJWQgaXMgbWF4IHVzZWZ1bCBpbmRleC5cbiIsIG1heHNpZ25vKTsKLQotICAvKiBLZWVwIHByaW50aW5nIHZhbHVlcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIGVuZCBvZiAqYm90aCogdGFibGVzLCBub3QKLSAgICAgKmVpdGhlciogdGFibGUuICBOb3RlIHRoYXQga25vd2luZyB0aGUgbWF4aW11bSB1c2VmdWwgaW5kZXggZG9lcyAqbm90KgotICAgICByZWxpZXZlIHVzIG9mIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0ZXN0aW5nIHRoZSByZXR1cm4gcG9pbnRlciBmb3IKLSAgICAgTlVMTC4gKi8KLQotICBmb3IgKHNpZ25vID0gMDsgc2lnbm8gPD0gbWF4c2lnbm87IHNpZ25vKyspCi0gICAgewotICAgICAgbmFtZSA9IHN0cnNpZ25vIChzaWdubyk7Ci0gICAgICBuYW1lID0gKG5hbWUgPT0gTlVMTCkgPyAiPE5VTEw+IiA6IG5hbWU7Ci0gICAgICBtc2cgPSBzdHJzaWduYWwgKHNpZ25vKTsKLSAgICAgIG1zZyA9IChtc2cgPT0gTlVMTCkgPyAiPE5VTEw+IiA6IG1zZzsKLSAgICAgIHByaW50ZiAoIiUtNGQlLTE4cyVzXG4iLCBzaWdubywgbmFtZSwgbXNnKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnN0ci5jIGIvbGliaWJlcnR5L3N0cnN0ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWIzNmUzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJzdHIuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBzdHJzdHIgZm9yIHN5c3RlbXMgd2l0aG91dCBpdC4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotCi1OQU1FCi0KLQlzdHJzdHIgLS0gbG9jYXRlIGZpcnN0IG9jY3VyYW5jZSBvZiBhIHN1YnN0cmluZwotCi1TWU5PUFNJUwotCi0JI2luY2x1ZGUgPHN0cmluZy5oPgotCi0JY2hhciAqc3Ryc3RyIChjaGFyICpzMSwgY2hhciAqczIpCi0KLURFU0NSSVBUSU9OCi0KLQlMb2NhdGVzIHRoZSBmaXJzdCBvY2N1cmFuY2UgaW4gdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IFMxIG9mCi0JdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IFMyLiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN1YnN0cmluZwotCWZvdW5kLCBvciBhIE5VTEwgcG9pbnRlciBpZiBub3QgZm91bmQuICBJZiBTMiBwb2ludHMgdG8gYSBzdHJpbmcKLQl3aXRoIHplcm8gbGVuZ3RoLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBTMS4KLQkKLUJVR1MKLQotKi8KLQotCi0vKiBGSVhNRTogIFRoZSBhYm92ZSBkZXNjcmlwdGlvbiBpcyBBTlNJIGNvbXBpbGlhbnQuICBUaGlzIHJvdXRpbmUgaGFzIG5vdAotICAgYmVlbiB2YWxpZGF0ZWQgdG8gY29tcGx5IHdpdGggaXQuICAtZm5mICovCi0KLWNoYXIgKgotc3Ryc3RyIChzMSwgczIpCi0gIGNoYXIgKnMxLCAqczI7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnAgPSBzMTsKLSAgZXh0ZXJuIGNoYXIgKnN0cmNociAoKTsKLSAgZXh0ZXJuIGludCBzdHJuY21wICgpOwotI2lmIF9fR05VQ19fPT0yCi0gIGV4dGVybiBfX1NJWkVfVFlQRV9fIHN0cmxlbiAoKTsKLSNlbmRpZgotICByZWdpc3RlciBpbnQgbGVuID0gc3RybGVuIChzMik7Ci0KLSAgZm9yICg7IChwID0gc3RyY2hyIChwLCAqczIpKSAhPSAwOyBwKyspCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKHAsIHMyLCBsZW4pID09IDApCi0JewotCSAgcmV0dXJuIChwKTsKLQl9Ci0gICAgfQotICByZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnRvZC5jIGIvbGliaWJlcnR5L3N0cnRvZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODZjNzNkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJ0b2QuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBzdHJ0b2QgZm9yIHN5c3RlbXMgd2l0aCBhdG9mLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQotc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCi10ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLUFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGZpbGVzCi1jb21waWxlZCB3aXRoIGEgR05VIGNvbXBpbGVyIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBkb2VzIG5vdCBjYXVzZQotdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQotdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLWV4dGVybiBkb3VibGUgYXRvZiAoKTsKLQotLyogRGlzY2xhaW1lcjogdGhpcyBpcyBjdXJyZW50bHkganVzdCB1c2VkIGJ5IENISUxMIGluIEdEQiBhbmQgdGhlcmVmb3JlCi0gICBoYXMgbm90IGJlZW4gdGVzdGVkIHdlbGwuICBJdCBtYXkgaGF2ZSBiZWVuIHRlc3RlZCBmb3Igbm90aGluZyBleGNlcHQKLSAgIHRoYXQgaXQgY29tcGlsZXMuICAqLwotCi1kb3VibGUKLXN0cnRvZCAoc3RyLCBwdHIpCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgY2hhciAqKnB0cjsKLXsKLSAgY2hhciAqcDsKLQotICBpZiAocHRyID09IChjaGFyICoqKTApCi0gICAgcmV0dXJuIGF0b2YgKHN0cik7Ci0gIAotICBwID0gc3RyOwotICAKLSAgd2hpbGUgKGlzc3BhY2UgKCpwKSkKLSAgICArK3A7Ci0gIAotICBpZiAoKnAgPT0gJysnIHx8ICpwID09ICctJykKLSAgICArK3A7Ci0KLSAgLyogSU5GIG9yIElORklOSVRZLiAgKi8KLSAgaWYgKChwWzBdID09ICdpJyB8fCBwWzBdID09ICdJJykKLSAgICAgICYmIChwWzFdID09ICduJyB8fCBwWzFdID09ICdOJykKLSAgICAgICYmIChwWzJdID09ICdmJyB8fCBwWzJdID09ICdGJykpCi0gICAgewotICAgICAgaWYgKChwWzNdID09ICdpJyB8fCBwWzNdID09ICdJJykKLQkgICYmIChwWzRdID09ICduJyB8fCBwWzRdID09ICdOJykKLQkgICYmIChwWzVdID09ICdpJyB8fCBwWzVdID09ICdJJykKLQkgICYmIChwWzZdID09ICd0JyB8fCBwWzZdID09ICdUJykKLQkgICYmIChwWzddID09ICd5JyB8fCBwWzddID09ICdZJykpCi0JewotCSAgKnB0ciA9IHAgKyA3OwotCSAgcmV0dXJuIGF0b2YgKHN0cik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICpwdHIgPSBwICsgMzsKLQkgIHJldHVybiBhdG9mIChzdHIpOwotCX0KLSAgICB9Ci0KLSAgLyogTkFOIG9yIE5BTihmb28pLiAgKi8KLSAgaWYgKChwWzBdID09ICduJyB8fCBwWzBdID09ICdOJykKLSAgICAgICYmIChwWzFdID09ICdhJyB8fCBwWzFdID09ICdBJykKLSAgICAgICYmIChwWzJdID09ICduJyB8fCBwWzJdID09ICdOJykpCi0gICAgewotICAgICAgcCArPSAzOwotICAgICAgaWYgKCpwID09ICcoJykKLQl7Ci0JICArK3A7Ci0JICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiAqcCAhPSAnKScpCi0JICAgICsrcDsKLQkgIGlmICgqcCA9PSAnKScpCi0JICAgICsrcDsKLQl9Ci0gICAgICAqcHRyID0gcDsKLSAgICAgIHJldHVybiBhdG9mIChzdHIpOwotICAgIH0KLQotICAvKiBkaWdpdHMsIHdpdGggMCBvciAxIHBlcmlvZHMgaW4gaXQuICAqLwotICBpZiAoaXNkaWdpdCAoKnApIHx8ICpwID09ICcuJykKLSAgICB7Ci0gICAgICBpbnQgZ290X2RvdCA9IDA7Ci0gICAgICB3aGlsZSAoaXNkaWdpdCAoKnApIHx8ICghZ290X2RvdCAmJiAqcCA9PSAnLicpKQotCXsKLQkgIGlmICgqcCA9PSAnLicpCi0JICAgIGdvdF9kb3QgPSAxOwotCSAgKytwOwotCX0KLQotICAgICAgLyogRXhwb25lbnQuICAqLwotICAgICAgaWYgKCpwID09ICdlJyB8fCAqcCA9PSAnRScpCi0JewotCSAgaW50IGk7Ci0JICBpID0gMTsKLQkgIGlmIChwW2ldID09ICcrJyB8fCBwW2ldID09ICctJykKLQkgICAgKytpOwotCSAgaWYgKGlzZGlnaXQgKHBbaV0pKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGlzZGlnaXQgKHBbaV0pKQotCQkrK2k7Ci0JICAgICAgKnB0ciA9IHAgKyBpOwotCSAgICAgIHJldHVybiBhdG9mIChzdHIpOwotCSAgICB9Ci0JfQotICAgICAgKnB0ciA9IHA7Ci0gICAgICByZXR1cm4gYXRvZiAoc3RyKTsKLSAgICB9Ci0gIC8qIERpZG4ndCBmaW5kIGFueSBkaWdpdHMuICBEb2Vzbid0IGxvb2sgbGlrZSBhIG51bWJlci4gICovCi0gICpwdHIgPSBzdHI7Ci0gIHJldHVybiAwLjA7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RydG9sLmMgYi9saWJpYmVydHkvc3RydG9sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZDE3MDYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnRvbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qLQotICogQ29weXJpZ2h0IChjKSAxOTkwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiAwCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBGSVhNRTogSXQnZCBiZSBuaWNlIHRvIGNvbmZpZ3VyZSBhcm91bmQgdGhlc2UsIGJ1dCB0aGUgaW5jbHVkZSBmaWxlcyBhcmUgdG9vCi0gICBwYWluZnVsLiAgVGhlc2UgbWFjcm9zIHNob3VsZCBhdCBsZWFzdCBiZSBtb3JlIHBvcnRhYmxlIHRoYW4gaGFyZHdpcmVkIGhleAotICAgY29uc3RhbnRzLiAqLwotCi0jaWZuZGVmIFVMT05HX01BWAotI2RlZmluZQlVTE9OR19NQVgJKCh1bnNpZ25lZCBsb25nKSh+MEwpKQkJLyogMHhGRkZGRkZGRiAqLwotI2VuZGlmCi0KLSNpZm5kZWYgTE9OR19NQVgKLSNkZWZpbmUJTE9OR19NQVgJKChsb25nKShVTE9OR19NQVggPj4gMSkpCS8qIDB4N0ZGRkZGRkYgKi8KLSNlbmRpZgotCi0jaWZuZGVmIExPTkdfTUlOCi0jZGVmaW5lCUxPTkdfTUlOCSgobG9uZykofkxPTkdfTUFYKSkJCS8qIDB4ODAwMDAwMDAgKi8KLSNlbmRpZgotCi0vKgotICogQ29udmVydCBhIHN0cmluZyB0byBhIGxvbmcgaW50ZWdlci4KLSAqCi0gKiBJZ25vcmVzIGBsb2NhbGUnIHN0dWZmLiAgQXNzdW1lcyB0aGF0IHRoZSB1cHBlciBhbmQgbG93ZXIgY2FzZQotICogYWxwaGFiZXRzIGFuZCBkaWdpdHMgYXJlIGVhY2ggY29udGlndW91cy4KLSAqLwotbG9uZwotc3RydG9sKG5wdHIsIGVuZHB0ciwgYmFzZSkKLQljb25zdCBjaGFyICpucHRyOwotCWNoYXIgKiplbmRwdHI7Ci0JcmVnaXN0ZXIgaW50IGJhc2U7Ci17Ci0JcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IG5wdHI7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBhY2M7Ci0JcmVnaXN0ZXIgaW50IGM7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBjdXRvZmY7Ci0JcmVnaXN0ZXIgaW50IG5lZyA9IDAsIGFueSwgY3V0bGltOwotCi0JLyoKLQkgKiBTa2lwIHdoaXRlIHNwYWNlIGFuZCBwaWNrIHVwIGxlYWRpbmcgKy8tIHNpZ24gaWYgYW55LgotCSAqIElmIGJhc2UgaXMgMCwgYWxsb3cgMHggZm9yIGhleCBhbmQgMCBmb3Igb2N0YWwsIGVsc2UKLQkgKiBhc3N1bWUgZGVjaW1hbDsgaWYgYmFzZSBpcyBhbHJlYWR5IDE2LCBhbGxvdyAweC4KLQkgKi8KLQlkbyB7Ci0JCWMgPSAqcysrOwotCX0gd2hpbGUgKGlzc3BhY2UoYykpOwotCWlmIChjID09ICctJykgewotCQluZWcgPSAxOwotCQljID0gKnMrKzsKLQl9IGVsc2UgaWYgKGMgPT0gJysnKQotCQljID0gKnMrKzsKLQlpZiAoKGJhc2UgPT0gMCB8fCBiYXNlID09IDE2KSAmJgotCSAgICBjID09ICcwJyAmJiAoKnMgPT0gJ3gnIHx8ICpzID09ICdYJykpIHsKLQkJYyA9IHNbMV07Ci0JCXMgKz0gMjsKLQkJYmFzZSA9IDE2OwotCX0KLQlpZiAoYmFzZSA9PSAwKQotCQliYXNlID0gYyA9PSAnMCcgPyA4IDogMTA7Ci0KLQkvKgotCSAqIENvbXB1dGUgdGhlIGN1dG9mZiB2YWx1ZSBiZXR3ZWVuIGxlZ2FsIG51bWJlcnMgYW5kIGlsbGVnYWwKLQkgKiBudW1iZXJzLiAgVGhhdCBpcyB0aGUgbGFyZ2VzdCBsZWdhbCB2YWx1ZSwgZGl2aWRlZCBieSB0aGUKLQkgKiBiYXNlLiAgQW4gaW5wdXQgbnVtYmVyIHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUsIGlmCi0JICogZm9sbG93ZWQgYnkgYSBsZWdhbCBpbnB1dCBjaGFyYWN0ZXIsIGlzIHRvbyBiaWcuICBPbmUgdGhhdAotCSAqIGlzIGVxdWFsIHRvIHRoaXMgdmFsdWUgbWF5IGJlIHZhbGlkIG9yIG5vdDsgdGhlIGxpbWl0Ci0JICogYmV0d2VlbiB2YWxpZCBhbmQgaW52YWxpZCBudW1iZXJzIGlzIHRoZW4gYmFzZWQgb24gdGhlIGxhc3QKLQkgKiBkaWdpdC4gIEZvciBpbnN0YW5jZSwgaWYgdGhlIHJhbmdlIGZvciBsb25ncyBpcwotCSAqIFstMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0N10gYW5kIHRoZSBpbnB1dCBiYXNlIGlzIDEwLAotCSAqIGN1dG9mZiB3aWxsIGJlIHNldCB0byAyMTQ3NDgzNjQgYW5kIGN1dGxpbSB0byBlaXRoZXIKLQkgKiA3IChuZWc9PTApIG9yIDggKG5lZz09MSksIG1lYW5pbmcgdGhhdCBpZiB3ZSBoYXZlIGFjY3VtdWxhdGVkCi0JICogYSB2YWx1ZSA+IDIxNDc0ODM2NCwgb3IgZXF1YWwgYnV0IHRoZSBuZXh0IGRpZ2l0IGlzID4gNyAob3IgOCksCi0JICogdGhlIG51bWJlciBpcyB0b28gYmlnLCBhbmQgd2Ugd2lsbCByZXR1cm4gYSByYW5nZSBlcnJvci4KLQkgKgotCSAqIFNldCBhbnkgaWYgYW55IGBkaWdpdHMnIGNvbnN1bWVkOyBtYWtlIGl0IG5lZ2F0aXZlIHRvIGluZGljYXRlCi0JICogb3ZlcmZsb3cuCi0JICovCi0JY3V0b2ZmID0gbmVnID8gLSh1bnNpZ25lZCBsb25nKUxPTkdfTUlOIDogTE9OR19NQVg7Ci0JY3V0bGltID0gY3V0b2ZmICUgKHVuc2lnbmVkIGxvbmcpYmFzZTsKLQljdXRvZmYgLz0gKHVuc2lnbmVkIGxvbmcpYmFzZTsKLQlmb3IgKGFjYyA9IDAsIGFueSA9IDA7OyBjID0gKnMrKykgewotCQlpZiAoaXNkaWdpdChjKSkKLQkJCWMgLT0gJzAnOwotCQllbHNlIGlmIChpc2FscGhhKGMpKQotCQkJYyAtPSBpc3VwcGVyKGMpID8gJ0EnIC0gMTAgOiAnYScgLSAxMDsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JCWlmIChjID49IGJhc2UpCi0JCQlicmVhazsKLQkJaWYgKGFueSA8IDAgfHwgYWNjID4gY3V0b2ZmIHx8IGFjYyA9PSBjdXRvZmYgJiYgYyA+IGN1dGxpbSkKLQkJCWFueSA9IC0xOwotCQllbHNlIHsKLQkJCWFueSA9IDE7Ci0JCQlhY2MgKj0gYmFzZTsKLQkJCWFjYyArPSBjOwotCQl9Ci0JfQotCWlmIChhbnkgPCAwKSB7Ci0JCWFjYyA9IG5lZyA/IExPTkdfTUlOIDogTE9OR19NQVg7Ci0JCWVycm5vID0gRVJBTkdFOwotCX0gZWxzZSBpZiAobmVnKQotCQlhY2MgPSAtYWNjOwotCWlmIChlbmRwdHIgIT0gMCkKLQkJKmVuZHB0ciA9IChjaGFyICopIChhbnkgPyBzIC0gMSA6IG5wdHIpOwotCXJldHVybiAoYWNjKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJ0b3VsLmMgYi9saWJpYmVydHkvc3RydG91bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjZmMmQ2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJ0b3VsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiAwCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0jaWZuZGVmIFVMT05HX01BWAotI2RlZmluZQlVTE9OR19NQVgJKCh1bnNpZ25lZCBsb25nKSh+MEwpKQkJLyogMHhGRkZGRkZGRiAqLwotI2VuZGlmCi0KLS8qCi0gKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgaW50ZWdlci4KLSAqCi0gKiBJZ25vcmVzIGBsb2NhbGUnIHN0dWZmLiAgQXNzdW1lcyB0aGF0IHRoZSB1cHBlciBhbmQgbG93ZXIgY2FzZQotICogYWxwaGFiZXRzIGFuZCBkaWdpdHMgYXJlIGVhY2ggY29udGlndW91cy4KLSAqLwotdW5zaWduZWQgbG9uZwotc3RydG91bChucHRyLCBlbmRwdHIsIGJhc2UpCi0JY29uc3QgY2hhciAqbnB0cjsKLQljaGFyICoqZW5kcHRyOwotCXJlZ2lzdGVyIGludCBiYXNlOwotewotCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBucHRyOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYWNjOwotCXJlZ2lzdGVyIGludCBjOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgY3V0b2ZmOwotCXJlZ2lzdGVyIGludCBuZWcgPSAwLCBhbnksIGN1dGxpbTsKLQotCS8qCi0JICogU2VlIHN0cnRvbCBmb3IgY29tbWVudHMgYXMgdG8gdGhlIGxvZ2ljIHVzZWQuCi0JICovCi0JZG8gewotCQljID0gKnMrKzsKLQl9IHdoaWxlIChpc3NwYWNlKGMpKTsKLQlpZiAoYyA9PSAnLScpIHsKLQkJbmVnID0gMTsKLQkJYyA9ICpzKys7Ci0JfSBlbHNlIGlmIChjID09ICcrJykKLQkJYyA9ICpzKys7Ci0JaWYgKChiYXNlID09IDAgfHwgYmFzZSA9PSAxNikgJiYKLQkgICAgYyA9PSAnMCcgJiYgKCpzID09ICd4JyB8fCAqcyA9PSAnWCcpKSB7Ci0JCWMgPSBzWzFdOwotCQlzICs9IDI7Ci0JCWJhc2UgPSAxNjsKLQl9Ci0JaWYgKGJhc2UgPT0gMCkKLQkJYmFzZSA9IGMgPT0gJzAnID8gOCA6IDEwOwotCWN1dG9mZiA9ICh1bnNpZ25lZCBsb25nKVVMT05HX01BWCAvICh1bnNpZ25lZCBsb25nKWJhc2U7Ci0JY3V0bGltID0gKHVuc2lnbmVkIGxvbmcpVUxPTkdfTUFYICUgKHVuc2lnbmVkIGxvbmcpYmFzZTsKLQlmb3IgKGFjYyA9IDAsIGFueSA9IDA7OyBjID0gKnMrKykgewotCQlpZiAoaXNkaWdpdChjKSkKLQkJCWMgLT0gJzAnOwotCQllbHNlIGlmIChpc2FscGhhKGMpKQotCQkJYyAtPSBpc3VwcGVyKGMpID8gJ0EnIC0gMTAgOiAnYScgLSAxMDsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JCWlmIChjID49IGJhc2UpCi0JCQlicmVhazsKLQkJaWYgKGFueSA8IDAgfHwgYWNjID4gY3V0b2ZmIHx8IGFjYyA9PSBjdXRvZmYgJiYgYyA+IGN1dGxpbSkKLQkJCWFueSA9IC0xOwotCQllbHNlIHsKLQkJCWFueSA9IDE7Ci0JCQlhY2MgKj0gYmFzZTsKLQkJCWFjYyArPSBjOwotCQl9Ci0JfQotCWlmIChhbnkgPCAwKSB7Ci0JCWFjYyA9IFVMT05HX01BWDsKLQkJZXJybm8gPSBFUkFOR0U7Ci0JfSBlbHNlIGlmIChuZWcpCi0JCWFjYyA9IC1hY2M7Ci0JaWYgKGVuZHB0ciAhPSAwKQotCQkqZW5kcHRyID0gKGNoYXIgKikgKGFueSA/IHMgLSAxIDogbnB0cik7Ci0JcmV0dXJuIChhY2MpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3RtcG5hbS5jIGIvbGliaWJlcnR5L3RtcG5hbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDYxNDY3Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS90bXBuYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZuZGVmIExfdG1wbmFtCi0jZGVmaW5lIExfdG1wbmFtZSAxMDAKLSNlbmRpZgotI2lmbmRlZiBQX3RtcGRpcgotI2RlZmluZSBQX3RtcGRpciAiL3Vzci90bXAiCi0jZW5kaWYKLQotc3RhdGljIGNoYXIgdG1wbmFtX2J1ZmZlcltMX3RtcG5hbV07Ci1zdGF0aWMgaW50IHRtcG5hbV9jb3VudGVyOwotCi1leHRlcm4gaW50IGdldHBpZCAoKTsKLQotY2hhciAqCi10bXBuYW0gKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIGludCBwaWQgPSBnZXRwaWQgKCk7Ci0KLSAgaWYgKHMgPT0gTlVMTCkKLSAgICBzID0gdG1wbmFtX2J1ZmZlcjsKLQotICAvKiAgR2VuZXJhdGUgdGhlIGZpbGVuYW1lIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpc24ndCBvbmUgY2FsbGVkCi0gICAgICBpdCBhbHJlYWR5LiAgKi8KLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBGSUxFICpmOwotICAgICAgc3ByaW50ZiAocywgIiVzLyVzJXguJXgiLCBQX3RtcGRpciwgInQiLCBwaWQsIHRtcG5hbV9jb3VudGVyKTsKLSAgICAgIGYgPSBmb3BlbiAocywgInIiKTsKLSAgICAgIGlmIChmID09IE5VTEwpCi0JYnJlYWs7Ci0gICAgICB0bXBuYW1fY291bnRlcisrOwotICAgICAgZmNsb3NlIChmKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHM7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdmFzcHJpbnRmLmMgYi9saWJpYmVydHkvdmFzcHJpbnRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjgwZTYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3Zhc3ByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qIExpa2UgdnNwcmludGYgYnV0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBtYWxsb2MnZCBzdG9yYWdlLCB3aGljaCBtdXN0Ci0gICBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotI2lmZGVmIFRFU1QKLWludCBnbG9iYWxfdG90YWxfd2lkdGg7Ci0jZW5kaWYKLQotdW5zaWduZWQgbG9uZyBzdHJ0b3VsICgpOwotY2hhciAqbWFsbG9jICgpOwotCi1zdGF0aWMgaW50Ci1pbnRfdmFzcHJpbnRmIChyZXN1bHQsIGZvcm1hdCwgYXJncykKLSAgICAgY2hhciAqKnJlc3VsdDsKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9saXN0ICphcmdzOwotewotICBjb25zdCBjaGFyICpwID0gZm9ybWF0OwotICAvKiBBZGQgb25lIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG5ldmVyIHplcm8sIHdoaWNoIG1pZ2h0IGNhdXNlIG1hbGxvYwotICAgICB0byByZXR1cm4gTlVMTC4gICovCi0gIGludCB0b3RhbF93aWR0aCA9IHN0cmxlbiAoZm9ybWF0KSArIDE7Ci0gIHZhX2xpc3QgYXA7Ci0KLSAgbWVtY3B5ICgoUFRSKSAmYXAsIChQVFIpIGFyZ3MsIHNpemVvZiAodmFfbGlzdCkpOwotCi0gIHdoaWxlICgqcCAhPSAnXDAnKQotICAgIHsKLSAgICAgIGlmICgqcCsrID09ICclJykKLQl7Ci0JICB3aGlsZSAoc3RyY2hyICgiLSsgIzAiLCAqcCkpCi0JICAgICsrcDsKLQkgIGlmICgqcCA9PSAnKicpCi0JICAgIHsKLQkgICAgICArK3A7Ci0JICAgICAgdG90YWxfd2lkdGggKz0gYWJzICh2YV9hcmcgKGFwLCBpbnQpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB0b3RhbF93aWR0aCArPSBzdHJ0b3VsIChwLCAmcCwgMTApOwotCSAgaWYgKCpwID09ICcuJykKLQkgICAgewotCSAgICAgICsrcDsKLQkgICAgICBpZiAoKnAgPT0gJyonKQotCQl7Ci0JCSAgKytwOwotCQkgIHRvdGFsX3dpZHRoICs9IGFicyAodmFfYXJnIChhcCwgaW50KSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JICAgICAgdG90YWxfd2lkdGggKz0gc3RydG91bCAocCwgJnAsIDEwKTsKLQkgICAgfQotCSAgd2hpbGUgKHN0cmNociAoImhsTCIsICpwKSkKLQkgICAgKytwOwotCSAgLyogU2hvdWxkIGJlIGJpZyBlbm91Z2ggZm9yIGFueSBmb3JtYXQgc3BlY2lmaWVyIGV4Y2VwdCAlcyBhbmQgZmxvYXRzLiAgKi8KLQkgIHRvdGFsX3dpZHRoICs9IDMwOwotCSAgc3dpdGNoICgqcCkKLQkgICAgewotCSAgICBjYXNlICdkJzoKLQkgICAgY2FzZSAnaSc6Ci0JICAgIGNhc2UgJ28nOgotCSAgICBjYXNlICd1JzoKLQkgICAgY2FzZSAneCc6Ci0JICAgIGNhc2UgJ1gnOgotCSAgICBjYXNlICdjJzoKLQkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgaW50KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZic6Ci0JICAgIGNhc2UgJ2UnOgotCSAgICBjYXNlICdFJzoKLQkgICAgY2FzZSAnZyc6Ci0JICAgIGNhc2UgJ0cnOgotCSAgICAgICh2b2lkKSB2YV9hcmcgKGFwLCBkb3VibGUpOwotCSAgICAgIC8qIFNpbmNlIGFuIGllZWUgZG91YmxlIGNhbiBoYXZlIGFuIGV4cG9uZW50IG9mIDMwNywgd2UnbGwKLQkJIG1ha2UgdGhlIGJ1ZmZlciB3aWRlIGVub3VnaCB0byBjb3ZlciB0aGUgZ3Jvc3MgY2FzZS4gKi8KLQkgICAgICB0b3RhbF93aWR0aCArPSAzMDc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3MnOgotCSAgICAgIHRvdGFsX3dpZHRoICs9IHN0cmxlbiAodmFfYXJnIChhcCwgY2hhciAqKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3AnOgotCSAgICBjYXNlICduJzoKLQkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgY2hhciAqKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0jaWZkZWYgVEVTVAotICBnbG9iYWxfdG90YWxfd2lkdGggPSB0b3RhbF93aWR0aDsKLSNlbmRpZgotICAqcmVzdWx0ID0gbWFsbG9jICh0b3RhbF93aWR0aCk7Ci0gIGlmICgqcmVzdWx0ICE9IE5VTEwpCi0gICAgcmV0dXJuIHZzcHJpbnRmICgqcmVzdWx0LCBmb3JtYXQsICphcmdzKTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi1pbnQKLXZhc3ByaW50ZiAocmVzdWx0LCBmb3JtYXQsIGFyZ3MpCi0gICAgIGNoYXIgKipyZXN1bHQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSNpZiBkZWZpbmVkIChfQlNEX1ZBX0xJU1RfKSAmJiBkZWZpbmVkIChfX0ZyZWVCU0RfXykKLSAgICAgX0JTRF9WQV9MSVNUXyBhcmdzOwotI2Vsc2UKLSAgICAgdmFfbGlzdCBhcmdzOwotI2VuZGlmCi17Ci0gIHJldHVybiBpbnRfdmFzcHJpbnRmIChyZXN1bHQsIGZvcm1hdCwgJmFyZ3MpOwotfQotCi0jaWZkZWYgVEVTVAotdm9pZAotY2hlY2tpdAotI2lmZGVmIF9fU1REQ19fCi0gICAgIChjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikKLSNlbHNlCi0gICAgICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyICpyZXN1bHQ7Ci0KLSNpZmRlZiBfX1NURENfXwotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSNlbHNlCi0gIGNoYXIgKmZvcm1hdDsKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBmb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7Ci0jZW5kaWYKLSAgdmFzcHJpbnRmICgmcmVzdWx0LCBmb3JtYXQsIGFyZ3MpOwotICBpZiAoc3RybGVuIChyZXN1bHQpIDwgZ2xvYmFsX3RvdGFsX3dpZHRoKQotICAgIHByaW50ZiAoIlBBU1M6ICIpOwotICBlbHNlCi0gICAgcHJpbnRmICgiRkFJTDogIik7Ci0gIHByaW50ZiAoIiVkICVzXG4iLCBnbG9iYWxfdG90YWxfd2lkdGgsIHJlc3VsdCk7Ci19Ci0KLWludAotbWFpbiAoKQotewotICBjaGVja2l0ICgiJWQiLCAweDEyMzQ1Njc4KTsKLSAgY2hlY2tpdCAoIiUyMDBkIiwgNSk7Ci0gIGNoZWNraXQgKCIlLjMwMGQiLCA2KTsKLSAgY2hlY2tpdCAoIiUxMDAuMTUwZCIsIDcpOwotICBjaGVja2l0ICgiJXMiLCAiampqampqampqaWlpaWlpaWlpaWlpaWlpb29vb29vb29vb29vb29vb29wcHBwcHBwcHBwcHBhYVxuXAotNzc3Nzc3Nzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzY2NjY2NjY2NjY2NjIyMjIyMjIyMjIyNzc3Nzc3Nzc3Nzc3NzMzMzMzIik7Ci0gIGNoZWNraXQgKCIlZiVzJWQlcyIsIDEuMCwgImZvbyIsIDc3LCAiYXNkamZmZmZmZmZmZmZmZmZmaWlpaWlpaWlpaWl4eHh4eCIpOwotfQotI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS92Zm9yay5jIGIvbGliaWJlcnR5L3Zmb3JrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YzQ1OTEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3Zmb3JrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLS8qIEVtdWxhdGUgdmZvcmsgdXNpbmcganVzdCBwbGFpbiBmb3JrLCBmb3Igc3lzdGVtcyB3aXRob3V0IGEgcmVhbCB2Zm9yay4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICovCi0KLWludAotdmZvcmsgKCkKLXsKLSAgcmV0dXJuIChmb3JrICgpKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS92ZnByaW50Zi5jIGIvbGliaWJlcnR5L3ZmcHJpbnRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiN2IyZmYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3ZmcHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBQcm92aWRlIGEgdmVyc2lvbiB2ZnByaW50ZiBpbiB0ZXJtcyBvZiBfZG9wcm50LgotICAgQnkgS2F2ZWggR2hhemkgIChnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1KSAgMy8yOS85OAotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICovCi0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotI3VuZGVmIHZmcHJpbnRmCi0KLWludAotdmZwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcCkKLSAgRklMRSAqIHN0cmVhbTsKLSAgY29uc3QgY2hhciAqIGZvcm1hdDsKLSAgdmFfbGlzdCBhcDsKLXsKLSAgcmV0dXJuIF9kb3BybnQgKGZvcm1hdCwgYXAsIHN0cmVhbSk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdm1zYnVpbGQuY29tIGIvbGliaWJlcnR5L3Ztc2J1aWxkLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZlZGUzOC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdm1zYnVpbGQuY29tCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLSQhIGxpYmliZXJ0eS92bXNidWlsZC5jb20gLS0gYnVpbGQgbGliZXJ0eS5vbGIgZm9yIFZNUyBob3N0LCBWTVMgdGFyZ2V0Ci0kIQotJCBDQwk9ICJnY2MgL25vVmVyYm9zZS9EZWJ1Zy9JbmNsPShbXSxbLS5pbmNsdWRlXSkiCi0kIExJQlIJPSAibGlicmFyeSAvT2JqIgotJCBMSU5LCT0gImxpbmsiCi0kIERFTEVURT0gImRlbGV0ZSAvbm9Db25maXJtIgotJCBTRUFSQ0g9ICJzZWFyY2ggL0V4YWN0IgotJCBFQ0hPCT0gIndyaXRlIHN5cyRvdXRwdXQiCi0kIEFCT1JUCT0gImV4aXQgJXgwMDJDIgotJCEKLSQgTElCX05BTUUgPSAibGliZXJ0eS5vbGIiCSF0aGlzIGlzIHdoYXQgd2UncmUgZ29pbmcgdG8gY29uc3RydWN0Ci0kIFdPUktfTElCID0gIm5ldy1saWIub2xiIgkhdXNlZCB0byBndWFyZCBhZ2FpbnN0IGFuIGluY29tcGxldGUgYnVpbGQKLSQKLSQhIG1hbnVhbGx5IGNvcGllZCBmcm9tIE1ha2VmaWxlLmluCi0kIFJFUVVJUkVEX09GSUxFUyA9ICJhcmd2Lm8gYmFzZW5hbWUubyBjaG9vc2UtdGVtcC5vIGNvbmNhdC5vIGNwbHVzLWRlbS5vICItCi0JKyAiZmRtYXRjaC5vIGZubWF0Y2gubyBnZXRvcHQubyBnZXRvcHQxLm8gZ2V0cnVudGltZS5vIGhleC5vICItCi0JKyAiZmxvYXRmb3JtYXQubyBvYmphbGxvYy5vIG9ic3RhY2subyBzcGFjZXMubyBzdHJlcnJvci5vIHN0cnNpZ25hbC5vICItCi0JKyAieGF0ZXhpdC5vIHhleGl0Lm8geG1hbGxvYy5vIHhzdHJkdXAubyB4c3RyZXJyb3IubyIKLSQhIGFueXRoaW5nIG5vdCBjYXVnaHQgYnkgbGluaytzZWFyY2ggb2YgZHVtbXkuKiBzaG91bGQgYmUgYWRkZWQgaGVyZQotJCBFWFRSQV9PRklMRVMgPSAiIgotJCEKLSQhIG1vdmUgdG8gdGhlIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyB0aGlzIGNvbW1hbmQgcHJvY2VkdXJlCi0kIG9sZF9kaXIgPSBmJGVudmlyb24oIkRFRkFVTFQiKQotJCBuZXdfZGlyID0gZiRwYXJzZSgiXy5fOyIsZiRlbnZpcm9uKCJQUk9DRURVUkUiKSkgLSAiXy5fOyIKLSQgc2V0IGRlZmF1bHQgJ25ld19kaXInCi0kCi0kIEVDSE8gIlN0YXJ0aW5nIGxpYmliZXJ0eSBidWlsZC4uLiIKLSQgY3JlYXRlIGNvbmZpZy5oCi0vKiBsaWJpYmVydHkgY29uZmlnLmggZm9yIFZNUyAqLwotI2RlZmluZSBORUVEX3N5c19zaWdsaXN0Ci0jZGVmaW5lIE5FRURfc3Ryc2lnbmFsCi0jZGVmaW5lIE5FRURfcHNpZ25hbAotI2RlZmluZSBORUVEX2Jhc2VuYW1lCi0kIExJQlIgJ1dPUktfTElCJyAvQ3JlYXRlCi0kCi0kISBmaXJzdCBwYXNzOiBjb21waWxlICJyZXF1aXJlZCIgbW9kdWxlcwotJCBvZmlsZXMgPSBSRVFVSVJFRF9PRklMRVMgKyAiICIgKyBFWFRSQV9PRklMRVMKLSQgcGFzcyA9IDEKLSQgZ29zdWIgZG9fb2ZpbGVzCi0kCi0kISBzZWNvbmQgcGFzczogcHJvY2VzcyBkdW1teS5jLCB1c2luZyB0aGUgZmlyc3QgcGFzcycgcmVzdWx0cwotJCBFQ0hPICIgbm93IGNoZWNraW5nIHJ1bi10aW1lIGxpYnJhcnkgZm9yIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSIKLSQgaWYgZiRzZWFyY2goImR1bW15Lm9iaiIpLm5lcy4iIiB0aGVuICBERUxFVEUgZHVtbXkub2JqOyoKLSQgZGVmaW5lL25vTG9nIHN5cyRlcnJvciBfTkw6CSFjYW4ndCB1c2UgL1VzZXJfTW9kZSBoZXJlIGR1ZSB0byBnY2MKLSQgZGVmaW5lL25vTG9nIHN5cyRvdXRwdXQgX05MOgkhIGRyaXZlcidzIHVzZSBvZiBtdWx0aXBsZSBpbWFnZSBhY3RpdmF0aW9uCi0kIG9uIGVycm9yIHRoZW4gY29udGludWUKLSQgJ0NDJyBkdW1teS5jCi0kIGRlYXNzaWduIHN5cyRlcnJvciAgICFyZXN0b3JlLCBtb3JlIG9yIGxlc3MKLSQgZGVhc3NpZ24gc3lzJG91dHB1dAotJCBpZiBmJHNlYXJjaCgiZHVtbXkub2JqIikuZXFzLiIiIHRoZW4gIGdvdG8gcGFzczJfZmFpbHVyZTEKLSQhIGxpbmsgZHVtbXkub2JqLCBjYXB0dXJpbmcgZnVsbCBsaW5rZXIgZmVlZGJhY2sgaW4gZHVtbXkubWFwCi0kIG9sZG1zZyA9IGYkZW52aXJvbigiTUVTU0FHRSIpCi0kIHNldCBtZXNzYWdlIC9GYWNpbGl0eS9TZXZlcml0eS9JZGVudGlmaWNhdGlvbi9UZXh0Ci0kIGRlZmluZS9Vc2VyIHN5cyRvdXRwdXQgX05MOgotJCBkZWZpbmUvVXNlciBzeXMkZXJyb3IgX05MOgotJCBMSU5LL01hcD1kdW1teS5tYXAvbm9FeGUgZHVtbXkub2JqLCdXT1JLX0xJQicvTGliciwtCi0JZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9MaWJyLHN5cyRsaWJyYXJ5OnZheGNydGwub2xiL0xpYnIKLSQgc2V0IG1lc3NhZ2UgJ29sZG1zZycKLSQgaWYgZiRzZWFyY2goImR1bW15Lm1hcCIpLmVxcy4iIiB0aGVuICBnb3RvIHBhc3MyX2ZhaWx1cmUyCi0kIERFTEVURSBkdW1teS5vYmo7KgotJCBTRUFSQ0ggZHVtbXkubWFwICIlTElOSy1JLVVERlNZTSIgL091dHB1dD1kdW1teS5saXN0Ci0kIERFTEVURSBkdW1teS5tYXA7KgotJCBFQ0hPICIgY2hlY2sgY29tcGxldGVkIgotJCEgd2Ugbm93IGhhdmUgYSBmaWxlIHdpdGggb25lIGVudHJ5IHBlciBsaW5lIG9mIHVucmVzb2x2YWJsZSBzeW1ib2xzCi0kIG9maWxlcyA9ICIiCi0kIGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCi0kCW9wZW4vUmVhZCBpZmlsZSQgZHVtbXkubGlzdAotJGlsb29wOiByZWFkL0VuZD1pZG9uZSBpZmlsZSQgaWxpbmUKLSQJaWxpbmUgPSBmJGVkaXQoaWxpbmUsIkNPTVBSRVNTLFRSSU0sTE9XRVJDQVNFIikKLSQJb2ZpbGVzID0gb2ZpbGVzICsgIiAiICsgZiRlbGVtZW50KDEsIiAiLGlsaW5lKSArICIubyIKLSQJZ290byBpbG9vcAotJGlkb25lOiBjbG9zZSBpZmlsZSQKLSQgREVMRVRFIGR1bW15Lmxpc3Q7KgotJCBvbiBlcnJvciB0aGVuIEFCT1JUCi0kCi0kISB0aGlyZCBwYXNzOiBjb21waWxlICJtaXNzaW5nIiBtb2R1bGVzIGNvbGxlY3RlZCBpbiBwYXNzIDIKLSQgcGFzcyA9IDMKLSQgZ29zdWIgZG9fb2ZpbGVzCi0kCi0kISBmaW5pc2ggdXAKLSQgTElCUiAnV09SS19MSUInIC9Db21wcmVzcyAvT3V0cHV0PSdMSUJfTkFNRScJIW5ldy1saWIub2xiIC0+IGxpYmVydHkub2xiCi0kIERFTEVURSAnV09SS19MSUInOyoKLSQKLSQhIGFsbCBkb25lCi0kIEVDSE8gIkNvbXBsZXRlZCBsaWJpYmVydHkgYnVpbGQuIgotJCB0eXBlIHN5cyRpbnB1dDoKLQotICBZb3UgbWFueSB3aXNoIHRvIGRvCi0gICQgQ09QWSBMSUJFUlRZLk9MQiBHTlVfQ0M6WzAwMDAwMF0KLSAgc28gdGhhdCB0aGlzIHJ1bi10aW1lIGxpYnJhcnkgcmVzaWRlcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBnY2MncwotICBzdXBwb3J0IGxpYnJhcnkuICBXaGVuIGJ1aWxkaW5nIGdhcywgYmUgc3VyZSB0byBsZWF2ZSB0aGUgb3JpZ2luYWwKLSAgY29weSBvZiBsaWJlcnR5Lm9sYiBoZXJlIHNvIHRoYXQgZ2FzJ3MgYnVpbGQgcHJvY2VkdXJlIGNhbiBmaW5kIGl0LgotCi0kIHNldCBkZWZhdWx0ICdvbGRfZGlyJwotJCBleGl0Ci0kCi0kIQotJCEgY29tcGlsZSBlYWNoIGVsZW1lbnQgb2YgdGhlIHNwYWNlLWRlbGltaXRlZCBsaXN0ICdvZmlsZXMnCi0kIQotJGRvX29maWxlczoKLSQgb2ZpbGVzID0gZiRlZGl0KG9maWxlcywiQ09NUFJFU1MsVFJJTSIpCi0kIGkgPSAwCi0kb2xvb3A6Ci0kIGYgPSBmJGVsZW1lbnQoaSwiICIsb2ZpbGVzKQotJCBpZiBmLmVxcy4iICIgdGhlbiAgZ290byBvZG9uZQotJCBmID0gZiAtICIubyIJIXN0cmlwIGR1bW15IHN1ZmZpeAotJCBFQ0hPICIgICcnZiciCi0kIHNraXBfZiA9IDAKLSQgaWYgcGFzcy5lcS4zIC5hbmQuIGYkc2VhcmNoKCInJ2YnLmMiKS5lcXMuIiIgdGhlbiAgZ29zdWIgY2hrX2RlZmZ1bmMKLSQgaWYgLm5vdC5za2lwX2YKLSQgdGhlbgotJCAgICdDQycgJ2YnLmMKLSQgICBMSUJSICdXT1JLX0xJQicgJ2YnLm9iaiAvSW5zZXJ0Ci0kICAgREVMRVRFICdmJy5vYmo7KgotJCBlbmRpZgotJCBpID0gaSArIDEKLSQgZ290byBvbG9vcAotJG9kb25lOgotJCByZXR1cm4KLSQKLSQhCi0kISBjaGVjayBmdW5jdGlvbnMuZGVmIGZvciBhIERFRkZVTkMoKSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIG1pc3NpbmcgZmlsZSAnZicuYwotJCEKLSRjaGtfZGVmZnVuYzoKLSQgZGVmaW5lL1VzZXIgc3lzJG91dHB1dCBfTkw6Ci0kIGRlZmluZS9Vc2VyIHN5cyRlcnJvciBfTkw6Ci0kIFNFQVJDSCBmdW5jdGlvbnMuZGVmICJERUZGVU5DIiwiJydmJyIgL01hdGNoPUFORAotJCBpZiAoKCRzdGF0dXMuYW5kLiV4N0ZGRkZGRkYpIC5lcS4gMSkKLSQgdGhlbgotJCAgIHNraXBfZiA9IDEKLSQgICBvcGVuL0FwcGVuZCBjb25maWdfaCBjb25maWcuaAotJCAgIHdyaXRlIGNvbmZpZ19oICIjZGVmaW5lIE5FRURfJydmJyIKLSQgICBjbG9zZSBjb25maWdfaAotJCBlbmRpZgotJCByZXR1cm4KLSQKLSQhCi0kcGFzczJfZmFpbHVyZTE6Ci0kISBpZiB3ZSByZWFjaCBoZXJlLCBkdW1teS5jIGZhaWxlZCB0byBjb21waWxlIGFuZCB3ZSdyZSByZWFsbHkgc3R1Y2sKLSQgdHlwZSBzeXMkaW5wdXQ6Ci0KLSAgQ2Fubm90IGNvbXBpbGUgdGhlIGxpYnJhcnkgY29udGVudHMgY2hlY2tlciAoZHVtbXkuYyArIGZ1bmN0aW9ucy5kZWYpLAotICBzbyBjYW5ub3QgY29udGludWUhCi0KLSQhIGF0dGVtcHQgdGhlIGNvbXBpbGUgYWdhaW4sIHdpdGhvdXQgc3VwcHJlc3NpbmcgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGlzIHRpbWUKLSQgb24gZXJyb3IgdGhlbiBBQk9SVCArMCpmJHZlcmlmeSh2KQotJCB2ID0gZiR2ZXJpZnkoMSkKLSQgJ0NDJyBkdW1teS5jCi0kIEFCT1JUICswKmYkdmVyaWZ5KHYpCSEnZiR2ZXJpZnkoMCknCi0kIQotJHBhc3MyX2ZhaWx1cmUyOgotJCEgc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUuLgotJCB0eXBlIHN5cyRpbnB1dDoKLQotICBDYW5ub3QgbGluayB0aGUgbGlicmFyeSBjb250ZW50cyBjaGVja2VyIChkdW1teS5vYmopLCBzbyBjYW5ub3QgY29udGludWUhCi0KLSQhIGF0dGVtcHQgdGhlIGxpbmsgYWdhaW4sIHdpdGhvdXQgc3VwcHJlc3NpbmcgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGlzIHRpbWUKLSQgb24gZXJyb3IgdGhlbiBBQk9SVCArMCpmJHZlcmlmeSh2KQotJCB2ID0gZiR2ZXJpZnkoMSkKLSQgTElOSy9NYXA9ZHVtbXkubWFwL25vRXhlIGR1bW15Lm9iaiwnV09SS19MSUInL0xpYnIsLQotCWdudV9jYzpbMDAwMDAwXWdjY2xpYi5vbGIvTGlicixzeXMkbGlicmFyeTp2YXhjcnRsLm9sYi9MaWJyCi0kIEFCT1JUICswKmYkdmVyaWZ5KHYpCSEnZiR2ZXJpZnkoMCknCi0kCi0kISBub3QgcmVhY2hlZAotJCBleGl0CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdnByaW50Zi5jIGIvbGliaWJlcnR5L3ZwcmludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViNDI1YS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdnByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSN1bmRlZiB2cHJpbnRmCi1pbnQKLXZwcmludGYgKGZvcm1hdCwgYXApCi0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfbGlzdCBhcDsKLXsKLSAgcmV0dXJuIHZmcHJpbnRmIChzdGRvdXQsIGZvcm1hdCwgYXApOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3ZzcHJpbnRmLmMgYi9saWJpYmVydHkvdnNwcmludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwNzYwYy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdnNwcmludGYuYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB2c3ByaW50ZiBmb3Igc3lzdGVtcyB3aXRob3V0IGl0LgotICAgSGlnaGx5IHN5c3RlbS1kZXBlbmRlbnQsIGJ1dCBzaG91bGQgd29yayBvbiBtb3N0ICJ0cmFkaXRpb25hbCIKLSAgIGltcGxlbWVudGF0aW9ucyBvZiBzdGRpbzsgbmV3ZXIgb25lcyBzaG91bGQgYWxyZWFkeSBoYXZlIHZzcHJpbnRmLgotICAgV3JpdHRlbiBieSBQZXIgQm90aG5lciBvZiBDeWdudXMgU3VwcG9ydC4KLSAgIEJhc2VkIG9uIGxpYmcrKydzICJmb3JtIiAod3JpdHRlbiBieSBEb3VnIExlYTsgZGxAcm9ja3kub3N3ZWdvLmVkdSkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCi1zb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKLXRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggZmlsZXMKLWNvbXBpbGVkIHdpdGggYSBHTlUgY29tcGlsZXIgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzIGRvZXMgbm90IGNhdXNlCi10aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi1UaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5Ci10aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAqLwotCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSN1bmRlZiB2c3ByaW50ZgotCi1pbnQKLXZzcHJpbnRmIChidWYsIGZvcm1hdCwgYXApCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9saXN0IGFwOwotewotICBGSUxFIGI7Ci0gIGludCByZXQ7Ci0jaWZkZWYgVk1TCi0gIGItPl9mbGFnID0gX0lPV1JUfF9JT1NUUkc7Ci0gIGItPl9wdHIgPSBidWY7Ci0gIGItPl9jbnQgPSAxMjAwMDsKLSNlbHNlCi0gIGIuX2ZsYWcgPSBfSU9XUlR8X0lPU1RSRzsKLSAgYi5fcHRyID0gYnVmOwotICBiLl9jbnQgPSAxMjAwMDsKLSNlbmRpZgotICByZXQgPSBfZG9wcm50KGZvcm1hdCwgYXAsICZiKTsKLSAgcHV0YygnXDAnLCAmYik7Ci0gIHJldHVybiByZXQ7Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS93YWl0cGlkLmMgYi9saWJpYmVydHkvd2FpdHBpZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2RiMGI5Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS93YWl0cGlkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1pbnQKLXdhaXRwaWQgKHBpZCwgc3RhdF9sb2MsIG9wdGlvbnMpCi0JaW50IHBpZCwgKnN0YXRfbG9jLCBvcHRpb25zOwotewotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGludCB3cGlkID0gd2FpdChzdGF0X2xvYyk7Ci0gICAgICBpZiAod3BpZCA9PSBwaWQgfHwgd3BpZCA9PSAtMSkKLQlyZXR1cm4gd3BpZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkveGF0ZXhpdC5jIGIvbGliaWJlcnR5L3hhdGV4aXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0NzZjMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkveGF0ZXhpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICVzY2NzLmluY2x1ZGUucmVkaXN0LmMlCi0gKi8KLQotLyogQWRhcHRlZCBmcm9tIG5ld2xpYi9saWJjL3N0ZGxpYi97LGF0fWV4aXQuW2NoXS4KLSAgIElmIHlvdSB1c2UgeGF0ZXhpdCwgeW91IG11c3QgY2FsbCB4ZXhpdCBpbnN0ZWFkIG9mIGV4aXQuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi0vKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoaXMgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1QVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi1zdGF0aWMgdm9pZCB4YXRleGl0X2NsZWFudXAgUEFSQU1TICgodm9pZCkpOwotCi0vKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHJ1biBieSB4ZXhpdC4gICovCi1leHRlcm4gdm9pZCAoKl94ZXhpdF9jbGVhbnVwKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUJWEFURVhJVF9TSVpFIDMyCi0KLXN0cnVjdCB4YXRleGl0IHsKLQlzdHJ1Y3QJeGF0ZXhpdCAqbmV4dDsJCS8qIG5leHQgaW4gbGlzdCAqLwotCWludAlpbmQ7CQkJLyogbmV4dCBpbmRleCBpbiB0aGlzIHRhYmxlICovCi0Jdm9pZAkoKmZuc1tYQVRFWElUX1NJWkVdKSBQQVJBTVMgKCh2b2lkKSk7CS8qIHRoZSB0YWJsZSBpdHNlbGYgKi8KLX07Ci0KLS8qIEFsbG9jYXRlIG9uZSBzdHJ1Y3Qgc3RhdGljYWxseSB0byBndWFyYW50ZWUgdGhhdCB3ZSBjYW4gcmVnaXN0ZXIKLSAgIGF0IGxlYXN0IGEgZmV3IGhhbmRsZXJzLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgeGF0ZXhpdCB4YXRleGl0X2ZpcnN0OwotCi0vKiBQb2ludHMgdG8gaGVhZCBvZiBMSUZPIHN0YWNrLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgeGF0ZXhpdCAqeGF0ZXhpdF9oZWFkID0gJnhhdGV4aXRfZmlyc3Q7Ci0KLS8qIFJlZ2lzdGVyIGZ1bmN0aW9uIEZOIHRvIGJlIHJ1biBieSB4ZXhpdC4KLSAgIFJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIC0xIGlmIG5vdC4gICovCi0KLWludAoteGF0ZXhpdCAoZm4pCi0gICAgIHZvaWQgKCpmbikgUEFSQU1TICgodm9pZCkpOwotewotICByZWdpc3RlciBzdHJ1Y3QgeGF0ZXhpdCAqcDsKLQotICAvKiBUZWxsIHhleGl0IHRvIGNhbGwgeGF0ZXhpdF9jbGVhbnVwLiAgKi8KLSAgaWYgKCFfeGV4aXRfY2xlYW51cCkKLSAgICBfeGV4aXRfY2xlYW51cCA9IHhhdGV4aXRfY2xlYW51cDsKLQotICBwID0geGF0ZXhpdF9oZWFkOwotICBpZiAocC0+aW5kID49IFhBVEVYSVRfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoKHAgPSAoc3RydWN0IHhhdGV4aXQgKikgbWFsbG9jIChzaXplb2YgKnApKSA9PSBOVUxMKQotCXJldHVybiAtMTsKLSAgICAgIHAtPmluZCA9IDA7Ci0gICAgICBwLT5uZXh0ID0geGF0ZXhpdF9oZWFkOwotICAgICAgeGF0ZXhpdF9oZWFkID0gcDsKLSAgICB9Ci0gIHAtPmZuc1twLT5pbmQrK10gPSBmbjsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENhbGwgYW55IGNsZWFudXAgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXhhdGV4aXRfY2xlYW51cCAoKQotewotICByZWdpc3RlciBzdHJ1Y3QgeGF0ZXhpdCAqcDsKLSAgcmVnaXN0ZXIgaW50IG47Ci0KLSAgZm9yIChwID0geGF0ZXhpdF9oZWFkOyBwOyBwID0gcC0+bmV4dCkKLSAgICBmb3IgKG4gPSBwLT5pbmQ7IC0tbiA+PSAwOykKLSAgICAgICgqcC0+Zm5zW25dKSAoKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS94ZXhpdC5jIGIvbGliaWJlcnR5L3hleGl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMWJiZTAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3hleGl0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiB4ZXhpdC5jIC0tIFJ1biBhbnkgZXhpdCBoYW5kbGVycywgdGhlbiBleGl0LgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlCi10byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyogVGhpcyB2YXJpYWJsZSBpcyBzZXQgYnkgeGF0ZXhpdCBpZiBpdCBpcyBjYWxsZWQuICBUaGlzIHdheSwgeG1hbGxvYwotICAgZG9lc24ndCBkcmFnIHhhdGV4aXQgaW50byB0aGUgbGluay4gICovCi12b2lkICgqX3hleGl0X2NsZWFudXApIFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAoteGV4aXQgKGNvZGUpCi0gICAgIGludCBjb2RlOwotewotICBpZiAoX3hleGl0X2NsZWFudXAgIT0gTlVMTCkKLSAgICAoKl94ZXhpdF9jbGVhbnVwKSAoKTsKLSAgZXhpdCAoY29kZSk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkveG1hbGxvYy5jIGIvbGliaWJlcnR5L3htYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyNWM1YS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkveG1hbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIHdpdGggZXJyb3IgY2hlY2tpbmcuCi0gICBDb3B5cmlnaHQgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZGVmaW5lIHB0cmRpZmZfdCBsb25nCi0jZW5kaWYKLQotI2lmIFZNUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXhsaWIuaD4KLSNlbHNlCi0vKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoZXNlIG11c3QgYmUgZGVjbGFyZWQuICAqLwotUFRSIG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLVBUUiByZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci1QVFIgY2FsbG9jIFBBUkFNUyAoKHNpemVfdCwgc2l6ZV90KSk7Ci1QVFIgc2JyayBQQVJBTVMgKChwdHJkaWZmX3QpKTsKLSNlbmRpZgotCi0vKiBUaGUgcHJvZ3JhbSBuYW1lIGlmIHNldC4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9ICIiOwotCi0jaWZkZWYgSEFWRV9TQlJLCi0vKiBUaGUgaW5pdGlhbCBzYnJrLCBzZXQgd2hlbiB0aGUgcHJvZ3JhbSBuYW1lIGlzIHNldC4gTm90IHVzZWQgZm9yIHdpbjMyCi0gICBwb3J0cyBvdGhlciB0aGFuIGN5Z3dpbjMyLiAgKi8KLXN0YXRpYyBjaGFyICpmaXJzdF9icmVhayA9IE5VTEw7Ci0jZW5kaWYgLyogSEFWRV9TQlJLICovCi0KLXZvaWQKLXhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgbmFtZSA9IHM7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gIC8qIFdpbjMyIHBvcnRzIG90aGVyIHRoYW4gY3lnd2luMzIgZG9uJ3QgaGF2ZSBicmsoKSAqLwotICBpZiAoZmlyc3RfYnJlYWsgPT0gTlVMTCkKLSAgICBmaXJzdF9icmVhayA9IChjaGFyICopIHNicmsgKDApOwotI2VuZGlmIC8qIEhBVkVfU0JSSyAqLwotfQotCi1QVFIKLXhtYWxsb2MgKHNpemUpCi0gICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiBuZXdtZW07Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICBzaXplID0gMTsKLSAgbmV3bWVtID0gbWFsbG9jIChzaXplKTsKLSAgaWYgKCFuZXdtZW0pCi0gICAgewotI2lmZGVmIEhBVkVfU0JSSwotICAgICAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotICAgICAgc2l6ZV90IGFsbG9jYXRlZDsKLQotICAgICAgaWYgKGZpcnN0X2JyZWFrICE9IE5VTEwpCi0JYWxsb2NhdGVkID0gKGNoYXIgKikgc2JyayAoMCkgLSBmaXJzdF9icmVhazsKLSAgICAgIGVsc2UKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIChjaGFyICopICZlbnZpcm9uOwotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICAiXG4lcyVzQ2FuIG5vdCBhbGxvY2F0ZSAlbHUgYnl0ZXMgYWZ0ZXIgYWxsb2NhdGluZyAlbHUgYnl0ZXNcbiIsCi0JICAgICAgIG5hbWUsICpuYW1lID8gIjogIiA6ICIiLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc2l6ZSwgKHVuc2lnbmVkIGxvbmcpIGFsbG9jYXRlZCk7Ci0jZWxzZSAvKiBIQVZFX1NCUksgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLSAgICAgICAgICAgICAgIlxuJXMlc0NhbiBub3QgYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLAotICAgICAgICAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUpOwotI2VuZGlmIC8qIEhBVkVfU0JSSyAqLwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLSAgcmV0dXJuIChuZXdtZW0pOwotfQotCi1QVFIKLXhjYWxsb2MgKG5lbGVtLCBlbHNpemUpCi0gIHNpemVfdCBuZWxlbSwgZWxzaXplOwotewotICBQVFIgbmV3bWVtOwotCi0gIGlmIChuZWxlbSA9PSAwIHx8IGVsc2l6ZSA9PSAwKQotICAgIG5lbGVtID0gZWxzaXplID0gMTsKLQotICBuZXdtZW0gPSBjYWxsb2MgKG5lbGVtLCBlbHNpemUpOwotICBpZiAoIW5ld21lbSkKLSAgICB7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gICAgICBleHRlcm4gY2hhciAqKmVudmlyb247Ci0gICAgICBzaXplX3QgYWxsb2NhdGVkOwotCi0gICAgICBpZiAoZmlyc3RfYnJlYWsgIT0gTlVMTCkKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIGZpcnN0X2JyZWFrOwotICAgICAgZWxzZQotCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gKGNoYXIgKikgJmVudmlyb247Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICJcbiVzJXNDYW4gbm90IGFsbG9jYXRlICVsdSBieXRlcyBhZnRlciBhbGxvY2F0aW5nICVsdSBieXRlc1xuIiwKLQkgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSAobmVsZW0gKiBlbHNpemUpLCAodW5zaWduZWQgbG9uZykgYWxsb2NhdGVkKTsKLSNlbHNlIC8qIEhBVkVfU0JSSyAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLAotICAgICAgICAgICAgICAiXG4lcyVzQ2FuIG5vdCBhbGxvY2F0ZSAlbHUgYnl0ZXNcbiIsCi0gICAgICAgICAgICAgIG5hbWUsICpuYW1lID8gIjogIiA6ICIiLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgKG5lbGVtICogZWxzaXplKSk7Ci0jZW5kaWYgLyogSEFWRV9TQlJLICovCi0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotICByZXR1cm4gKG5ld21lbSk7Ci19Ci0KLVBUUgoteHJlYWxsb2MgKG9sZG1lbSwgc2l6ZSkKLSAgICBQVFIgb2xkbWVtOwotICAgIHNpemVfdCBzaXplOwotewotICBQVFIgbmV3bWVtOwotCi0gIGlmIChzaXplID09IDApCi0gICAgc2l6ZSA9IDE7Ci0gIGlmICghb2xkbWVtKQotICAgIG5ld21lbSA9IG1hbGxvYyAoc2l6ZSk7Ci0gIGVsc2UKLSAgICBuZXdtZW0gPSByZWFsbG9jIChvbGRtZW0sIHNpemUpOwotICBpZiAoIW5ld21lbSkKLSAgICB7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gICAgICBleHRlcm4gY2hhciAqKmVudmlyb247Ci0gICAgICBzaXplX3QgYWxsb2NhdGVkOwotCi0gICAgICBpZiAoZmlyc3RfYnJlYWsgIT0gTlVMTCkKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIGZpcnN0X2JyZWFrOwotICAgICAgZWxzZQotCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gKGNoYXIgKikgJmVudmlyb247Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICJcbiVzJXNDYW4gbm90IHJlYWxsb2NhdGUgJWx1IGJ5dGVzIGFmdGVyIGFsbG9jYXRpbmcgJWx1IGJ5dGVzXG4iLAotCSAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUsICh1bnNpZ25lZCBsb25nKSBhbGxvY2F0ZWQpOwotI2Vsc2UgLyogSEFWRV9TQlJLICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0gICAgICAgICAgICAgICJcbiVzJXNDYW4gbm90IHJlYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLAotICAgICAgICAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUpOwotI2VuZGlmIC8qIEhBVkVfU0JSSyAqLwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLSAgcmV0dXJuIChuZXdtZW0pOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hzdHJkdXAuYyBiL2xpYmliZXJ0eS94c3RyZHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNmFiYTAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3hzdHJkdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIHhzdHJkdXAuYyAtLSBEdXBsaWNhdGUgYSBzdHJpbmcgaW4gbWVtb3J5LCB1c2luZyB4bWFsbG9jLgotICAgVGhpcyB0cml2aWFsIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLgotICAgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIERlY2VtYmVyIDE5OTUuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotY2hhciAqCi14c3RyZHVwIChzKQotICBjb25zdCBjaGFyICpzOwotewotICByZWdpc3RlciBzaXplX3QgbGVuID0gc3RybGVuIChzKSArIDE7Ci0gIHJlZ2lzdGVyIGNoYXIgKnJldCA9IHhtYWxsb2MgKGxlbik7Ci0gIG1lbWNweSAocmV0LCBzLCBsZW4pOwotICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hzdHJlcnJvci5jIGIvbGliaWJlcnR5L3hzdHJlcnJvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzBiNjUzLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94c3RyZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qIHhzdHJlcnJvci5jIC0tIGphY2tldCByb3V0aW5lIGZvciBtb3JlIHJvYnVzdCBzdHJlcnJvcigpIHVzYWdlLgotICAgRnJpIEp1biAxNiAxODozMDowMCAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLSAgIFRoaXMgY29kZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBWTVMKLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmICFkZWZpbmVkIChfX1NUUklDVF9BTlNJX18pICYmICFkZWZpbmVkIChfX0hJREVfRk9SQklEREVOX05BTUVTKQotZXh0ZXJuIGNoYXIgKnN0cmVycm9yIFBBUkFNUyAoKGludCwuLi4pKTsKLSNkZWZpbmUgRE9OVF9ERUNMQVJFX1NUUkVSUk9SCi0jZW5kaWYKLSNlbmRpZgkvKiBWTVMgKi8KLQotI2lmbmRlZiBET05UX0RFQ0xBUkVfU1RSRVJST1IKLWV4dGVybiBjaGFyICpzdHJlcnJvciBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotCi0vKiBJZiBzdHJlcnJvciByZXR1cm5zIE5VTEwsIHdlJ2xsIGZvcm1hdCB0aGUgbnVtYmVyIGludG8gYSBzdGF0aWMgYnVmZmVyLiAgKi8KLQotI2RlZmluZSBFUlJTVFJfRk1UICJ1bmRvY3VtZW50ZWQgZXJyb3IgIyVkIgotc3RhdGljIGNoYXIgeHN0cmVycm9yX2J1ZltzaXplb2YgRVJSU1RSX0ZNVCArIDIwXTsKLQotLyogTGlrZSBzdHJlcnJvciwgYnV0IHJlc3VsdCBpcyBuZXZlciBhIG51bGwgcG9pbnRlci4gICovCi0KLWNoYXIgKgoteHN0cmVycm9yIChlcnJudW0pCi0gICAgIGludCBlcnJudW07Ci17Ci0gIGNoYXIgKmVycnN0cjsKLSNpZmRlZiBWTVMKLSAgY2hhciAqKCp2bXNsaWJfc3RyZXJyb3IpIFBBUkFNUyAoKGludCwuLi4pKTsKLQotICAvKiBPdmVycmlkZSBhbnkgcG9zc2libHktY29uZmxpY3RpbmcgZGVjbGFyYXRpb24gZnJvbSBzeXN0ZW0gaGVhZGVyLiAgKi8KLSAgdm1zbGliX3N0cmVycm9yID0gKGNoYXIgKigqKSBQQVJBTVMgKChpbnQsLi4uKSkpIHN0cmVycm9yOwotICAvKiBTZWNvbmQgYXJndW1lbnQgbWF0dGVycyBpZmYgZmlyc3QgaXMgRVZNU0VSUiwgYnV0IGl0J3Mgc2ltcGxlciB0bwotICAgICBwYXNzIGl0IHVuY29uZGl0aW9uYWxseS4gIGB2YXhjJGVycm5vJyBpcyBkZWNsYXJlZCBpbiA8ZXJybm8uaD4KLSAgICAgYW5kIG1haW50YWluZWQgYnkgdGhlIHJ1bi10aW1lIGxpYnJhcnkgaW4gcGFyYWxsZWwgdG8gYGVycm5vJy4KLSAgICAgV2UgYXNzdW1lIHRoYXQgYGVycm51bScgY29ycmVzcG9uZHMgdG8gdGhlIGxhc3QgdmFsdWUgYXNzaWduZWQgdG8KLSAgICAgZXJybm8gYnkgdGhlIHJ1bi10aW1lIGxpYnJhcnksIGhlbmNlIHZheGMkZXJybm8gd2lsbCBiZSByZWxldmFudC4gICovCi0gIGVycnN0ciA9ICgqdm1zbGliX3N0cmVycm9yKSAoZXJybnVtLCB2YXhjJGVycm5vKTsKLSNlbHNlCi0gIGVycnN0ciA9IHN0cmVycm9yIChlcnJudW0pOwotI2VuZGlmCi0KLSAgLyogSWYgYGVycm51bScgaXMgb3V0IG9mIHJhbmdlLCByZXN1bHQgbWlnaHQgYmUgTlVMTC4gIFdlJ2xsIGZpeCB0aGF0LiAgKi8KLSAgaWYgKCFlcnJzdHIpCi0gICAgewotICAgICAgc3ByaW50ZiAoeHN0cmVycm9yX2J1ZiwgRVJSU1RSX0ZNVCwgZXJybnVtKTsKLSAgICAgIGVycnN0ciA9IHhzdHJlcnJvcl9idWY7Ci0gICAgfQotICByZXR1cm4gZXJyc3RyOwotfQpkaWZmIC0tZ2l0IGEvbHRjb25maWcgYi9sdGNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWIzMDRmZC4uMDAwMDAwMAotLS0gYS9sdGNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDI4MjIgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIGx0Y29uZmlnIC0gQ3JlYXRlIGEgc3lzdGVtLXNwZWNpZmljIGxpYnRvb2wuCi0jIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIEEgbG90IG9mIHRoaXMgc2NyaXB0IGlzIHRha2VuIGZyb20gYXV0b2NvbmYtMi4xMC4KLQotIyBDaGVjayB0aGF0IHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLWVjaG89ZWNobwotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KLSAgc2hpZnQKLSAgY2F0IDw8RU9GCi0kKgotRU9GCi0gIGV4aXQgMAotZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4KLSAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQotICA6Ci1lbHNlCi0gICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLSAgZXhlYyAiJFNIRUxMIiAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQotZmkKLQotIyBGaW5kIHRoZSBjb3JyZWN0IFBBVEggc2VwYXJhdG9yLiAgVXN1YWxseSB0aGlzIGlzIGA6JywgYnV0Ci0jIERKR1BQIHVzZXMgYDsnIGxpa2UgRE9TLgotaWYgdGVzdCAiWCR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gIlhzZXQiOyB0aGVuCi0gIFVOQU1FPSR7VU5BTUUtYHVuYW1lIDI+L2Rldi9udWxsYH0KLSAgY2FzZSBYJFVOQU1FIGluCi0gICAgKi1ET1MpIFBBVEhfU0VQQVJBVE9SPSc7JyA7OwotICAgICopICAgICBQQVRIX1NFUEFSQVRPUj0nOicgOzsKLSAgZXNhYwotZmkKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLWlmIHRlc3QgIiR7Q0RQQVRIK3NldH0iID0gc2V0OyB0aGVuIENEUEFUSD07IGV4cG9ydCBDRFBBVEg7IGZpCi0KLWlmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gIlhzZXQiOyB0aGVuCi0gICMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAotICBmb3IgY21kIGluICdzZWQgNTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMnEgIiQwIicgJ2VjaG8gdGVzdCc7IGRvCi0gICAgIyBleHBlY3RlZCBzaXplczogbGVzcyB0aGFuIDJLYiwgMUtiLCA1MTIgYnl0ZXMsIDE2IGJ5dGVzLCAuLi4KLSAgICBpZiAoZWNob190ZXN0X3N0cmluZz0iYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbCAmJgotICAgICAgIGVjaG9fdGVzdF9zdHJpbmc9ImBldmFsICRjbWRgIiAmJgotICAgICAgICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgIT0gJ1hcdCcgfHwKLSAgIHRlc3QgIlhgKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgIT0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCi0gICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKLSAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKLSAgIwotICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCi0KLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCi0gICAgaWYgdGVzdCAtZiAkZGlyL2VjaG8gJiYKLSAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0gICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgZWNobz0iJGRpci9lY2hvIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIGlmIHRlc3QgIlgkZWNobyIgPSBYZWNobzsgdGhlbgotICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgotICAgIGlmIHRlc3QgIlhgKHByaW50IC1yICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIHRlc3QgIlhgKHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KLSAgICAgIGVjaG89J3ByaW50IC1yJwotICAgIGVsaWYgdGVzdCAtZiAvYmluL2tzaCAmJiB0ZXN0ICJYJENPTkZJR19TSEVMTCIgIT0gWC9iaW4va3NoOyB0aGVuCi0gICAgICAjIElmIHdlIGhhdmUga3NoLCB0cnkgcnVubmluZyBsdGNvbmZpZyBhZ2FpbiB3aXRoIGl0LgotICAgICAgT1JJR0lOQUxfQ09ORklHX1NIRUxMPSIke0NPTkZJR19TSEVMTC0vYmluL3NofSIKLSAgICAgIGV4cG9ydCBPUklHSU5BTF9DT05GSUdfU0hFTEwKLSAgICAgIENPTkZJR19TSEVMTD0vYmluL2tzaAotICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLSAgICBlbHNlCi0gICAgICAjIFRyeSB1c2luZyBwcmludGYuCi0gICAgICBlY2hvPSdwcmludGYgIiVzXG4iJwotICAgICAgaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0JIHRlc3QgIlhgKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCSMgQ29vbCwgcHJpbnRmIHdvcmtzCi0JOgotICAgICAgZWxpZiB0ZXN0ICJYYCgiJE9SSUdJTkFMX0NPTkZJR19TSEVMTCIgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0JICAgdGVzdCAiWGAoIiRPUklHSU5BTF9DT05GSUdfU0hFTEwiICIkMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCUNPTkZJR19TSEVMTD0iJE9SSUdJTkFMX0NPTkZJR19TSEVMTCIKLQlleHBvcnQgQ09ORklHX1NIRUxMCi0JU0hFTEw9IiRDT05GSUdfU0hFTEwiCi0JZXhwb3J0IFNIRUxMCi0JZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbGlmIHRlc3QgIlhgKCIkQ09ORklHX1NIRUxMIiAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLQkgICB0ZXN0ICJYYCgiJENPTkZJR19TSEVMTCIgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0JZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCi0gICAgICBlbHNlCi0JIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KLQlwcmV2PToKLQotCWZvciBjbWQgaW4gJ2VjaG8gdGVzdCcgJ3NlZCAycSAiJDAiJyAnc2VkIDEwcSAiJDAiJyAnc2VkIDIwcSAiJDAiJyAnc2VkIDUwcSAiJDAiJzsgZG8KLQkgIGlmICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlhgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsOyB0aGVuCi0JICAgIGJyZWFrCi0JICBmaQotCSAgcHJldj0iJGNtZCIKLQlkb25lCi0KLQlpZiB0ZXN0ICIkcHJldiIgIT0gJ3NlZCA1MHEgIiQwIic7IHRoZW4KLQkgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCi0JICBleHBvcnQgZWNob190ZXN0X3N0cmluZwotCSAgZXhlYyAiJHtPUklHSU5BTF9DT05GSUdfU0hFTEx9IiAiJDAiICR7MSsiJEAifQotCWVsc2UKLQkgICMgT29wcy4gIFdlIGxvc3QgY29tcGxldGVseSwgc28ganVzdCBzdGljayB3aXRoIGVjaG8uCi0JICBlY2hvPWVjaG8KLQlmaQotICAgICAgZmkKLSAgICBmaQotICBmaQotZmkKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9J3NlZCAtZSBzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgJFxcXFxdXCkvXFxcMS9nJwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KLWRvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGBcXFxcXVwpL1xcXDEvZycKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKLSMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KLWRlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCi0KLSMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtLgotcHJvZ25hbWU9YCRlY2hvICJYJDAiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotIyBDb25zdGFudHM6Ci1QUk9HUkFNPWx0Y29uZmlnCi1QQUNLQUdFPWxpYnRvb2wKLVZFUlNJT049MS4yZgotVElNRVNUQU1QPSIgKDEuMzg1IDE5OTkvMDMvMTUgMTc6MjQ6NTQpIgotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuYyAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuYyAkTElCUyAxPiY1Jwotcm09InJtIC1mIgotCi1oZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgR2xvYmFsIHZhcmlhYmxlczoKLWRlZmF1bHRfb2ZpbGU9bGlidG9vbAotY2FuX2J1aWxkX3NoYXJlZD15ZXMKLWVuYWJsZV9zaGFyZWQ9eWVzCi0jIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nLgotZW5hYmxlX3N0YXRpYz15ZXMKLWVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi1lbmFibGVfZGxvcGVuPXVua25vd24KLWx0bWFpbj0KLXNpbGVudD0KLXNyY2Rpcj0KLWFjX2NvbmZpZ19ndWVzcz0KLWFjX2NvbmZpZ19zdWI9Ci1ob3N0PQotbm9ub3B0PQotb2ZpbGU9IiRkZWZhdWx0X29maWxlIgotdmVyaWZ5X2hvc3Q9eWVzCi13aXRoX2djYz1ubwotd2l0aF9nbnVfbGQ9bm8KLW5lZWRfbG9ja3M9eWVzCi1hY19leHQ9Ywotb2JqZXh0PW8KLWxpYmV4dD1hCi1jYWNoZV9maWxlPQotCi1vbGRfQVI9IiRBUiIKLW9sZF9DQz0iJENDIgotb2xkX0NGTEFHUz0iJENGTEFHUyIKLW9sZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotb2xkX0xEPSIkTEQiCi1vbGRfTE5fUz0iJExOX1MiCi1vbGRfTk09IiROTSIKLW9sZF9SQU5MSUI9IiRSQU5MSUIiCi1vbGRfRExMVE9PTD0iJERMTFRPT0wiCi1vbGRfQVM9IiRBUyIKLQotIyBQYXJzZSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi1hcmdzPQotcHJldj0KLWZvciBvcHRpb24KLWRvCi0gIGNhc2UgIiRvcHRpb24iIGluCi0gIC0qPSopIG9wdGFyZz1gZWNobyAiJG9wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBvcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgZXZhbCAiJHByZXY9XCRvcHRpb24iCi0gICAgcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRvcHRpb24iIGluCi0gIC0taGVscCkgY2F0IDw8RU9NCi1Vc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIFtIT1NUIFtMVE1BSU5dXQotCi1HZW5lcmF0ZSBhIHN5c3RlbS1zcGVjaWZpYyBsaWJ0b29sIHNjcmlwdC4KLQotICAgIC0tZGVidWcgICAgICAgICAgICAgICAgZW5hYmxlIHZlcmJvc2Ugc2hlbGwgdHJhY2luZwotICAgIC0tZGlzYWJsZS1zaGFyZWQgICAgICAgZG8gbm90IGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMKLSAgICAtLWRpc2FibGUtc3RhdGljICAgICAgIGRvIG5vdCBidWlsZCBzdGF0aWMgbGlicmFyaWVzCi0gICAgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCBkbyBub3Qgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uCi0gICAgLS1lbmFibGUtZGxvcGVuICAgICAgICBlbmFibGUgZGxvcGVuIHN1cHBvcnQKLSAgICAtLWVuYWJsZS1kbG9wZW4tc2VsZiAgIGVuYWJsZSBzdXBwb3J0IGZvciBkbG9wZW5pbmcgcHJvZ3JhbXMKLSAgICAtLWhlbHAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gICAgLS1uby12ZXJpZnkgICAgICAgICAgICBkbyBub3QgdmVyaWZ5IHRoYXQgSE9TVCBpcyBhIHZhbGlkIGhvc3QgdHlwZQotLW8sIC0tb3V0cHV0PUZJTEUgICAgICAgICAgc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgW2RlZmF1bHQ9JGRlZmF1bHRfb2ZpbGVdCi0gICAgLS1xdWlldCAgICAgICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCi0gICAgLS1zaWxlbnQgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcwotICAgIC0tc3JjZGlyPURJUiAgICAgICAgICAgZmluZCBcYGNvbmZpZy5ndWVzcycgaW4gRElSCi0gICAgLS12ZXJzaW9uICAgICAgICAgICAgICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAgIC0td2l0aC1nY2MgICAgICAgICAgICAgYXNzdW1lIHRoYXQgdGhlIEdOVSBDIGNvbXBpbGVyIHdpbGwgYmUgdXNlZAotICAgIC0td2l0aC1nbnUtbGQgICAgICAgICAgYXNzdW1lIHRoYXQgdGhlIEMgY29tcGlsZXIgdXNlcyB0aGUgR05VIGxpbmtlcgotICAgIC0tZGlzYWJsZS1sb2NrICAgICAgICAgZGlzYWJsZSBmaWxlIGxvY2tpbmcKLSAgICAtLWNhY2hlLWZpbGU9RklMRSAgICAgIGNvbmZpZ3VyZSBjYWNoZSBmaWxlCi0KLUxUTUFJTiBpcyB0aGUgXGBsdG1haW4uc2gnIHNoZWxsIHNjcmlwdCBmcmFnbWVudCBvciBcYGx0bWFpbi5jJyBwcm9ncmFtCi10aGF0IHByb3ZpZGVzIGJhc2ljIGxpYnRvb2wgZnVuY3Rpb25hbGl0eS4KLQotSE9TVCBpcyB0aGUgY2Fub25pY2FsIGhvc3Qgc3lzdGVtIG5hbWUgW2RlZmF1bHQ9Z3Vlc3NlZF0uCi1FT00KLSAgZXhpdCAwCi0gIDs7Ci0KLSAgLS1kZWJ1ZykKLSAgICBlY2hvICIkcHJvZ25hbWU6IGVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCi0gICAgc2V0IC14Ci0gICAgOzsKLQotICAtLWRpc2FibGUtc2hhcmVkKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0KLSAgLS1kaXNhYmxlLXN0YXRpYykgZW5hYmxlX3N0YXRpYz1ubyA7OwotCi0gIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwpIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLQotICAtLWVuYWJsZS1kbG9wZW4pIGVuYWJsZV9kbG9wZW49eWVzIDs7Ci0KLSAgLS1xdWlldCB8IC0tc2lsZW50KSBzaWxlbnQ9eWVzIDs7Ci0KLSAgLS1zcmNkaXIpIHByZXY9c3JjZGlyIDs7Ci0gIC0tc3JjZGlyPSopIHNyY2Rpcj0iJG9wdGFyZyIgOzsKLQotICAtLW5vLXZlcmlmeSkgdmVyaWZ5X2hvc3Q9bm8gOzsKLQotICAtLW91dHB1dCB8IC1vKSBwcmV2PW9maWxlIDs7Ci0gIC0tb3V0cHV0PSopIG9maWxlPSIkb3B0YXJnIiA7OwotCi0gIC0tdmVyc2lvbikgZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04kVElNRVNUQU1QIjsgZXhpdCAwIDs7Ci0KLSAgLS13aXRoLWdjYykgd2l0aF9nY2M9eWVzIDs7Ci0gIC0td2l0aC1nbnUtbGQpIHdpdGhfZ251X2xkPXllcyA7OwotCi0gIC0tZGlzYWJsZS1sb2NrKSBuZWVkX2xvY2tzPW5vIDs7Ci0KLSAgLS1jYWNoZS1maWxlPSopIGNhY2hlX2ZpbGU9IiRvcHRhcmciIDs7Ci0KLSAgLSopCi0gICAgZWNobyAiJHByb2duYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdGlvbiciIDE+JjIKLSAgICBlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC16ICIkbHRtYWluIjsgdGhlbgotICAgICAgbHRtYWluPSIkb3B0aW9uIgotICAgIGVsaWYgdGVzdCAteiAiJGhvc3QiOyB0aGVuCi0jIFRoaXMgZ2VuZXJhdGVzIGFuIHVubmVjZXNzYXJ5IHdhcm5pbmcgZm9yIHNwYXJjLXN1bi1zb2xhcmlzNC4xLjNfVTEKLSMgICAgICBpZiB0ZXN0IC1uICJgZWNobyAkb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotIyAgICAgICAgZWNobyAiJHByb2duYW1lOiB3YXJuaW5nIFxgJG9wdGlvbicgaXMgbm90IGEgdmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0jICAgICAgZmkKLSAgICAgIGhvc3Q9IiRvcHRpb24iCi0gICAgZWxzZQotICAgICAgZWNobyAiJHByb2duYW1lOiB0b28gbWFueSBhcmd1bWVudHMiIDE+JjIKLSAgICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaSA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLXogIiRsdG1haW4iOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIExUTUFJTiBmaWxlIiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotaWYgdGVzdCAhIC1mICIkbHRtYWluIjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IFxgJGx0bWFpbicgZG9lcyBub3QgZXhpc3QiIDE+JjIKLSAgZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1maQotCi0jIFF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1sdGNvbmZpZ19hcmdzPQotZm9yIGFyZwotZG8KLSAgY2FzZSAiJGFyZyIgaW4KLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgbHRjb25maWdfYXJncz0iJGx0Y29uZmlnX2FyZ3MgJyRhcmcnIiA7OwotICAqKSBsdGNvbmZpZ19hcmdzPSIkbHRjb25maWdfYXJncyAkYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgQSByZWxldmFudCBzdWJzZXQgb2YgQUNfSU5JVC4KLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KLSMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCi0jIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotCi1pZiB0ZXN0IC1uICIkY2FjaGVfZmlsZSIgJiYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUgd2l0aGluIGx0Y29uZmlnIgotICAuICRjYWNoZV9maWxlCi1maQotCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICAjIEFzc3VtZSB0aGUgc291cmNlIGRpcmVjdG9yeSBpcyB0aGUgc2FtZSBvbmUgYXMgdGhlIHBhdGggdG8gTFRNQUlOLgotICBzcmNkaXI9YCRlY2hvICJYJGx0bWFpbiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICB0ZXN0ICIkc3JjZGlyIiA9ICIkbHRtYWluIiAmJiBzcmNkaXI9LgotZmkKLQotdHJhcCAiJHJtIGNvbmZ0ZXN0KjsgZXhpdCAxIiAxIDIgMTUKLWlmIHRlc3QgIiR2ZXJpZnlfaG9zdCIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBmb3IgY29uZmlnLmd1ZXNzIGFuZCBjb25maWcuc3ViLgotICBhY19hdXhfZGlyPQotICBmb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9jb25maWcuZ3Vlc3M7IHRoZW4KLSAgICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIGlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IGZpbmQgY29uZmlnLmd1ZXNzIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyCi0gICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLSAgYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotICBhY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLQotICAjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi0gIGlmICRTSEVMTCAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjIKLSAgICBlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotCi0gIGhvc3RfYWxpYXM9JGhvc3QKLSAgY2FzZSAiJGhvc3RfYWxpYXMiIGluCi0gICIiKQotICAgIGlmIGhvc3RfYWxpYXM9YCRTSEVMTCAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZQotICAgICAgZWNobyAiJHByb2duYW1lOiBjYW5ub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMgotICAgICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpIDs7Ci0gIGVzYWMKLSAgaG9zdD1gJFNIRUxMICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotICBlY2hvICIkYWNfdCRob3N0IiAxPiY2Ci0KLSAgIyBNYWtlIHN1cmUgdGhlIGhvc3QgdmVyaWZpZWQuCi0gIHRlc3QgLXogIiRob3N0IiAmJiBleGl0IDEKLQotZWxpZiB0ZXN0IC16ICIkaG9zdCI7IHRoZW4KLSAgZWNobyAiJHByb2duYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgaG9zdCB0eXBlIGlmIHlvdSB1c2UgXGAtLW5vLXZlcmlmeSciIDE+JjIKLSAgZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1lbHNlCi0gIGhvc3RfYWxpYXM9JGhvc3QKLWZpCi0KLSMgVHJhbnNmb3JtIGxpbnV4KiB0byAqLSotbGludXgtZ251KiwgdG8gc3VwcG9ydCBvbGQgY29uZmlndXJlIHNjcmlwdHMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWxpbnV4LWdudSopIDs7Ci1saW51eCopIGhvc3Q9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoLiotLiotbGludXhcKVwoLipcKSQvXDEtZ251XDIvJ2AKLWVzYWMKLQotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi0KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4MyopCi0gICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotICBpZiB0ZXN0ICIke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gc2V0OyB0aGVuCi0gICAgQ09MTEVDVF9OQU1FUz0KLSAgICBleHBvcnQgQ09MTEVDVF9OQU1FUwotICBmaQotICA7OwotZXNhYwotCi0jIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KLW9sZF9hcmNoaXZlX2NtZHM9JyRBUiBjcnUgJG9sZGxpYiRvbGRvYmpzJwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJwotb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KLQotIyBTZXQgYSBzYW5lIGRlZmF1bHQgZm9yIGBBUicuCi10ZXN0IC16ICIkQVIiICYmIEFSPWFyCi0KLSMgSWYgUkFOTElCIGlzIG5vdCBzZXQsIHRoZW4gcnVuIHRoZSB0ZXN0LgotaWYgdGVzdCAiJHtSQU5MSUIrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgcmVzdWx0PW5vCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJhbmxpYi4uLiAkYWNfYyIgMT4mNgotICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci9yYW5saWI7IHRoZW4KLSAgICAgIFJBTkxJQj0icmFubGliIgotICAgICAgcmVzdWx0PSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgZWNobyAiJGFjX3QkcmVzdWx0IiAxPiY2Ci1maQotCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKLSAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IlwkUkFOTElCIFwkb2xkbGlifiRvbGRfcG9zdGluc3RhbGxfY21kcyIKLWZpCi0KLSMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIGBETExUT09MJyBhbmQgYEFTJywgdXNlZCBvbiBjeWd3aW4uCi10ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCi10ZXN0IC16ICIkQVMiICYmIEFTPWFzCi0KLSMgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSB1c2luZyBHQ0MuCi1pZiB0ZXN0ICIkd2l0aF9nY2MiICE9IHllcyB8fCB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgSWYgQ0MgaXMgbm90IHNldCwgdGhlbiB0cnkgdG8gZmluZCBHQ0Mgb3IgYSB1c2FibGUgQ0MuCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2NjLi4uICRhY19jIiAxPiY2Ci0gICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9nY2M7IHRoZW4KLQlDQz0iZ2NjIgotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRzYXZlX2lmcyIKLQotICAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgICAgIGVjaG8gIiRhY190JENDIiAxPiY2Ci0gICAgZWxzZQotICAgICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICAgIGZpCi0gIGZpCi0KLSAgIyBOb3QgImdjYyIsIHNvIHRyeSAiY2MiLCByZWplY3RpbmcgIi91c3IvdWNiL2NjIi4KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYy4uLiAkYWNfYyIgMT4mNgotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgotICAgIGNjX3JlamVjdGVkPW5vCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvY2M7IHRoZW4KLQlpZiB0ZXN0ICIkZGlyL2NjIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLQkgIGNjX3JlamVjdGVkPXllcwotCSAgY29udGludWUKLQlmaQotCUNDPSJjYyIKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgaWYgdGVzdCAkY2NfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgICAgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgICAgIHNldCBkdW1teSAkQ0MKLSAgICAgIHNoaWZ0Ci0gICAgICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0JIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0JIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0JIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLQlzaGlmdAotCXNldCBkdW1teSAiJGRpci9jYyIgIiRAIgotCXNoaWZ0Ci0JQ0M9IiRAIgotICAgICAgZmkKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICAgICAgZWNobyAiJGFjX3QkQ0MiIDE+JjYKLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gICAgZmkKLQotICAgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotICBmaQotCi0gICMgTm93IHNlZSBpZiB0aGUgY29tcGlsZXIgaXMgcmVhbGx5IEdDQy4KLSAgd2l0aF9nY2M9bm8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMuLi4gJGFjX2MiIDE+JjYKLSAgZWNobyAiJHByb2duYW1lOjU2NDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotCi0gICRybSBjb25mdGVzdC5jCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotICBpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NTcyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICB3aXRoX2djYz15ZXMKLSAgZmkKLSAgJHJtIGNvbmZ0ZXN0LmMKLSAgZWNobyAiJGFjX3Qkd2l0aF9nY2MiIDE+JjYKLWZpCi0KLSMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCi1zZXQgZHVtbXkgJENDCi1jb21waWxlcj0iJDIiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvYmplY3Qgc3VmZml4Li4uICRhY19jIiAxPiY2Ci0kcm0gY29uZnRlc3QqCi1lY2hvICdpbnQgaSA9IDE7JyA+IGNvbmZ0ZXN0LmMKLWVjaG8gIiRwcm9nbmFtZTo1ODY6IGNoZWNraW5nIGZvciBvYmplY3Qgc3VmZml4IiA+JiA1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjU4NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH07IHRoZW4KLSAgIyBBcHBlbmQgYW55IHdhcm5pbmdzIHRvIHRoZSBjb25maWcubG9nLgotICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLQotICBmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLmMpIDs7Ci0gICAgKikgb2JqZXh0PWBlY2hvICRhY19maWxlIHwgc2VkIC1lIHMvY29uZnRlc3QuLy9gIDs7Ci0gICAgZXNhYwotICBkb25lCi1lbHNlCi0gIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYyA+JjUKLWZpCi0kcm0gY29uZnRlc3QqCi1lY2hvICIkYWNfdCRvYmpleHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gJGFjX2MiIDE+JjYKLXBpY19mbGFnPQotc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzPQotd2w9Ci1saW5rX3N0YXRpY19mbGFnPQotbm9fYnVpbHRpbl9mbGFnPQotCi1pZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gIHdsPSctV2wsJwotICBsaW5rX3N0YXRpY19mbGFnPSctc3RhdGljJwotCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBiZW9zKiB8IGlyaXg1KiB8IGlyaXg2KiB8IG9zZjMqIHwgb3NmNCopCi0gICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCi0gICAgOzsKLSAgYWl4KikKLSAgICAjIEJlbG93IHRoZXJlIGlzIGEgZGlydHkgaGFjayB0byBmb3JjZSBub3JtYWwgc3RhdGljIGxpbmtpbmcgd2l0aCAtbGRsCi0gICAgIyBUaGUgcHJvYmxlbSBpcyBiZWNhdXNlIGxpYmRsIGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoIGJvdGggbGliYyBhbmQKLSAgICAjIGxpYkMgKEFJWCBDKysgbGlicmFyeSksIHdoaWNoIG9idmlvdXNseSBkb2Vzbid0IGluY2x1ZGVkIGluIGxpYnJhcmllcwotICAgICMgbGlzdCBieSBnY2MuIFRoaXMgY2F1c2UgdW5kZWZpbmVkIHN5bWJvbHMgd2l0aCAtc3RhdGljIGZsYWdzLgotICAgICMgVGhpcyBoYWNrIGFsbG93cyBDIHByb2dyYW1zIHRvIGJlIGxpbmtlZCB3aXRoICItc3RhdGljIC1sZGwiLCBidXQKLSAgICAjIHdlIG5vdCBzdXJlIGFib3V0IEMrKyBwcm9ncmFtcy4KLSAgICBsaW5rX3N0YXRpY19mbGFnPSIkbGlua19zdGF0aWNfZmxhZyAke3dsfS1sQyIKLSAgICA7OwotICBjeWd3aW4qIHwgbWluZ3cqIHwgb3MyKikKLSAgICAjIFdlIGNhbiBidWlsZCBETExzIGZyb20gbm9uLVBJQy4KLSAgICA7OwotICBhbWlnYW9zKikKLSAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0Ci0gICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCi0gICAgIyBsaWtlIGAtbTY4MDQwJy4KLSAgICBwaWNfZmxhZz0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JwotICAgIDs7Ci0gICopCi0gICAgcGljX2ZsYWc9Jy1mUElDJwotICAgIDs7Ci0gIGVzYWMKLWVsc2UKLSAgIyBQT1JUTUUgQ2hlY2sgZm9yIFBJQyBmbGFncyBmb3IgdGhlIHN5c3RlbSBjb21waWxlci4KLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqIHwgYWl4NCopCi0gICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKLSAgICA7OwotCi0gIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgICMgSXMgdGhlcmUgYSBiZXR0ZXIgbGlua19zdGF0aWNfZmxhZyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/Ci0gICAgd2w9Jy1XbCwnCi0gICAgbGlua19zdGF0aWNfZmxhZz0iJHt3bH0tYSAke3dsfWFyY2hpdmUiCi0gICAgcGljX2ZsYWc9JytaJwotICAgIDs7Ci0KLSAgaXJpeDUqIHwgaXJpeDYqKQotICAgIHdsPSctV2wsJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1ub25fc2hhcmVkJwotICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyogfCBvczIqKQotICAgICMgV2UgY2FuIGJ1aWxkIERMTHMgZnJvbSBub24tUElDLgotICAgIDs7Ci0KLSAgb3NmMyogfCBvc2Y0KikKLSAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KLSAgICB3bD0nLVdsLCcKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctbm9uX3NoYXJlZCcKLSAgICA7OwotCi0gIHNjbzMuMnY1KikKLSAgICBwaWNfZmxhZz0nLUtwaWMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLWRuJwotICAgIHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0nLWJlbGYnCi0gICAgOzsKLQotICBzb2xhcmlzKikKLSAgICBwaWNfZmxhZz0nLUtQSUMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCi0gICAgd2w9Jy1XbCwnCi0gICAgOzsKLQotICBzdW5vczQqKQotICAgIHBpY19mbGFnPSctUElDJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIHdsPSctUW9wdGlvbiBsZCAnCi0gICAgOzsKLQotICBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQotICAgIHBpY19mbGFnPSctS1BJQycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICB3bD0nLVdsLCcKLSAgICA7OwotCi0gIHV0czQqKQotICAgIHBpY19mbGFnPSctcGljJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIDs7Ci0KLSAgKikKLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgOzsKLSAgZXNhYwotZmkKLQotaWYgdGVzdCAtbiAiJHBpY19mbGFnIjsgdGhlbgotICBlY2hvICIkYWNfdCRwaWNfZmxhZyIgMT4mNgotCi0gICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwaWNfZmxhZyBhY3R1YWxseSB3b3Jrcy4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRwaWNfZmxhZyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3QqCi0gIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuYwotICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTICRwaWNfZmxhZyAtRFBJQyIKLSAgZWNobyAiJHByb2duYW1lOjcxNzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRwaWNfZmxhZyB3b3JrcyIgPiY1Ci0gIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NzE4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRvYmpleHQ7IHRoZW4KLSAgICAjIEFwcGVuZCBhbnkgd2FybmluZ3MgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgCi0gICAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgICAjIE9uIEhQLVVYLCBib3RoIENDIGFuZCBHQ0Mgb25seSB3YXJuIHRoYXQgUElDIGlzIHN1cHBvcnRlZC4uLiB0aGVuIHRoZXkKLSAgICAgICMgY3JlYXRlIG5vbi1QSUMgb2JqZWN0cy4gIFNvLCBpZiB0aGVyZSB3ZXJlIGFueSB3YXJuaW5ncywgd2UgYXNzdW1lIHRoYXQKLSAgICAgICMgUElDIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotCWVjaG8gIiRhY190Im5vIDE+JjYKLQljYW5fYnVpbGRfc2hhcmVkPW5vCi0JcGljX2ZsYWc9Ci0gICAgICBlbHNlCi0JZWNobyAiJGFjX3QieWVzIDE+JjYKLQlwaWNfZmxhZz0iICRwaWNfZmxhZyIKLSAgICAgIGZpCi0gICAgICA7OwotICAgICopCi0gICAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgotICAgICAgcGljX2ZsYWc9IiAkcGljX2ZsYWciCi0gICAgICA7OwotICAgIGVzYWMKLSAgZWxzZQotICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIHBpY19mbGFnPQotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCi0gICRybSBjb25mdGVzdCoKLWVsc2UKLSAgZWNobyAiJGFjX3Qibm9uZSAxPiY2Ci1maQotCi0jIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1vIGFuZCAtYyBhcmUgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyCi1lY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5vLi4uICRhY19jIiAxPiY2Ci0kcm0gY29uZnRlc3QqCi1lY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LmMKLXNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPSIkQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0Mi5vIgotZWNobyAiJHByb2duYW1lOjc2MDogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUubyIgPiY1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjc2MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDIubzsgdGhlbgotCi0gICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCi0gICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gICAgICBjb21waWxlcl9jX289bm8KLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgotICAgICAgY29tcGlsZXJfY19vPXllcwotICAgIGZpCi1lbHNlCi0gICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICBjb21waWxlcl9jX289bm8KLSAgZWNobyAiJGFjX3Qibm8gMT4mNgotZmkKLUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotJHJtIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0IHgiJGNvbXBpbGVyX2NfbyIgPSB4InllcyI7IHRoZW4KLSAgIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIHdyaXRlIHRvIGEgLmxvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLmxvLi4uICRhY19jIiAxPiY2Ci0gICRybSBjb25mdGVzdCoKLSAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC5jCi0gIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWMgLW8gY29uZnRlc3QubG8iCi0gIGVjaG8gIiRwcm9nbmFtZTo3ODg6IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLmxvIiA+JjUKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6Nzg5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LmxvOyB0aGVuCi0KLSAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLQllY2hvICIkYWNfdCJubyAxPiY2Ci0JY29tcGlsZXJfb19sbz1ubwotICAgICAgZWxzZQotCWVjaG8gIiRhY190InllcyAxPiY2Ci0JY29tcGlsZXJfb19sbz15ZXMKLSAgICAgIGZpCi0gIGVsc2UKLSAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgIGNvbXBpbGVyX29fbG89bm8KLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi0gIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotICAkcm0gY29uZnRlc3QqCi1lbHNlCi0gIGNvbXBpbGVyX29fbG89bm8KLWZpCi0KLSMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBkbyBoYXJkIGxpbmtzIHRvIGxvY2sgc29tZSBmaWxlcyBpZiBuZWVkZWQKLWhhcmRfbGlua3M9Im5vdHRlc3RlZCIKLWlmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0gICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgotICBlY2hvICRhY19uICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gJGFjX2MiIDE+JjYKLSAgaGFyZF9saW5rcz15ZXMKLSAgJHJtIGNvbmZ0ZXN0KgotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubwotICB0b3VjaCBjb25mdGVzdC5hCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgZWNobyAiJGFjX3QkaGFyZF9saW5rcyIgMT4mNgotICAkcm0gY29uZnRlc3QqCi0gIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCi0gICAgZWNobyAiKioqIFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMgotICAgIG5lZWRfbG9ja3M9d2FybgotICBmaQotZWxzZQotICBuZWVkX2xvY2tzPW5vCi1maQotCi1pZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgdG8gc2VlIGlmIG9wdGlvbnMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyBhcmUgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIC4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3QqCi0gIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuYwotICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMgLWMgY29uZnRlc3QuYyIKLSAgZWNobyAiJHByb2duYW1lOjg0MDogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiID4mNQotICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjg0MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC5vOyB0aGVuCi0KLSAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncwotICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLQllY2hvICIkYWNfdCJubyAxPiY2Ci0JY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCi0gICAgICBlbHNlCi0JZWNobyAiJGFjX3QieWVzIDE+JjYKLQljb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9eWVzCi0gICAgICBmaQotICBlbHNlCi0gICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICBjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi0gIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotICAkcm0gY29uZnRlc3QqCi0KLSAgaWYgdGVzdCAiJGNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPSAieWVzIjsgdGhlbgotICAgIG5vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbiAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zJwotICBlbHNlCi0gICAgbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJwotICBmaQotICAKLWZpCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIHNoYXJlZCBsaWJyYXJ5IGNvbXBpbGF0aW9uIGZsYWdzLgotaWYgdGVzdCAtbiAiJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncyI7IHRoZW4KLSAgZWNobyAiJHByb2duYW1lOiB3YXJuaW5nOiBcYCRDQycgcmVxdWlyZXMgXGAkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzJyB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0gIGlmIGVjaG8gIiRvbGRfQ0MgJG9sZF9DRkxBR1MgIiB8IGVncmVwIC1lICJbIAldJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFnc1sgCV0iID4vZGV2L251bGw7IHRoZW4gOgotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBhZGQgXGAkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzJyB0byB0aGUgQ0Mgb3IgQ0ZMQUdTIGVudiB2YXJpYWJsZSBhbmQgcmVjb25maWd1cmUiIDE+JjIKLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gIGZpCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGxpbmtfc3RhdGljX2ZsYWcgd29ya3MuLi4gJGFjX2MiIDE+JjYKLSRybSBjb25mdGVzdCoKLWVjaG8gJ21haW4oKXtyZXR1cm4oMCk7fScgPiBjb25mdGVzdC5jCi1zYXZlX0xERkxBR1M9IiRMREZMQUdTIgotTERGTEFHUz0iJExERkxBR1MgJGxpbmtfc3RhdGljX2ZsYWciCi1lY2hvICIkcHJvZ25hbWU6ODg0OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGxpbmtfc3RhdGljX2ZsYWcgd29ya3MiID4mNQotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo4ODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBlY2hvICIkYWNfdCRsaW5rX3N0YXRpY19mbGFnIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190Im5vbmUgMT4mNgotICBsaW5rX3N0YXRpY19mbGFnPQotZmkKLUxERkxBR1M9IiRzYXZlX0xERkxBR1MiCi0kcm0gY29uZnRlc3QqCi0KLWlmIHRlc3QgLXogIiRMTl9TIjsgdGhlbgotICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gdXNlIGxuIC1zLCBvciB3ZSBuZWVkIGhhcmQgbGlua3MuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MuLi4gJGFjX2MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0ZGF0YQotICBpZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbDsgdGhlbgotICAgICRybSBjb25mdGVzdGRhdGEKLSAgICBMTl9TPSJsbiAtcyIKLSAgZWxzZQotICAgIExOX1M9bG4KLSAgZmkKLSAgaWYgdGVzdCAiJExOX1MiID0gImxuIC1zIjsgdGhlbgotICAgIGVjaG8gIiRhY190InllcyAxPiY2Ci0gIGVsc2UKLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi1maQotCi0jIE1ha2Ugc3VyZSBMRCBpcyBhbiBhYnNvbHV0ZSBwYXRoLgotaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBhY19wcm9nPWxkCi0gIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MuLi4gJGFjX2MiIDE+JjYKLSAgICBlY2hvICIkcHJvZ25hbWU6OTE3OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAgICIiKQotICAgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZSBub3QgdXNpbmcgR0NDLgotICAgICAgYWNfcHJvZz1sZAotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gJGFjX2MiIDE+JjYKLSAgICBlY2hvICIkcHJvZ25hbWU6OTQxOiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLSAgZWxzZQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLSAgICBlY2hvICIkcHJvZ25hbWU6OTQ0OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci0gIGZpCi0KLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgotICAgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLQlMRD0iJGFjX2Rpci8kYWNfcHJvZyIKLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0JIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotCSMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotCWlmICIkTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0JZWxzZQotCSAgdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLQlmaQotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIGZpCi0KLSAgaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICAgIGVjaG8gIiRhY190JExEIiAxPiY2Ci0gIGVsc2UKLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi0KLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICAgIGVjaG8gIiRwcm9nbmFtZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi1maQotCi0jIENoZWNrIHRvIHNlZSBpZiBpdCByZWFsbHkgaXMgb3IgaXMgbm90IEdOVSBsZC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICRhY19jIiAxPiY2Ci0jIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi1lY2hvICIkYWNfdCR3aXRoX2dudV9sZCIgMT4mNgotCi0jIFNlZSBpZiB0aGUgbGlua2VyIHN1cHBvcnRzIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkYWNfYyIgMT4mNgotCi1hbGxvd191bmRlZmluZWRfZmxhZz0KLW5vX3VuZGVmaW5lZF9mbGFnPQotbmVlZF9saWJfcHJlZml4PXVua25vd24KLW5lZWRfdmVyc2lvbj11bmtub3duCi0jIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KLSMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cwotYXJjaGl2ZV9jbWRzPQotYXJjaGl2ZV9leHBzeW1fY21kcz0KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9Ci1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Ci13aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Ci1oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQotaGFyZGNvZGVfZGlyZWN0PW5vCi1oYXJkY29kZV9taW51c19MPW5vCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCi1ydW5wYXRoX3Zhcj0KLWFsd2F5c19leHBvcnRfc3ltYm9scz1ubwotZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKLSMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKLSMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0Ci1pbmNsdWRlX2V4cHN5bXM9Ci0jIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZWdyZXAgcmVndWxhciBleHByZXNzaW9uIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQotIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgotIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAotIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCi1leGNsdWRlX2V4cHN5bXM9Ci0KLWNhc2UgIiRob3N0X29zIiBpbgotY3lnd2luKiB8IG1pbmd3KikKLSAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQotICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZwotICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICBpZiB0ZXN0ICIkd2l0aF9nY2MiICE9IHllczsgdGhlbgotICAgIHdpdGhfZ251X2xkPW5vCi0gIGZpCi0gIDs7Ci0KLWZyZWVic2QyKiB8IHN1bm9zNCopCi0gIGV4Y2x1ZGVfZXhwc3ltcz0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgotICA7OwotCi1lc2FjCi0KLWxkX3NobGlicz15ZXMKLWlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKLSAgd2xhcmM9JyR7d2x9JwotCi0gICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYWl4MyogfCBhaXg0KikKLSAgICAjIE9uIEFJWCwgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KLSAgICBsZF9zaGxpYnM9bm8KLSAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCi0qKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KLSoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQotKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAotKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KLQotRU9GCi0gICAgOzsKLQotICBhbWlnYW9zKikKLSAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgY3J1ICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgOzsKLQotICBzdW5vczQqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIHdsYXJjPQotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIGJlb3MqKQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGxkX3NobGlicz1ubwotICAgIGZpCi0gICAgOzsKLQotICBjeWd3aW4qIHwgbWluZ3cqKQotICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKLQotICAgICMgRXh0cmFjdCB0aGUgc3ltYm9sIGV4cG9ydCBsaXN0IGZyb20gYW4gYC0tZXhwb3J0LWFsbCcgZGVmIGZpbGUsCi0gICAgIyB0aGVuIHJlZ2VuZXJhdGUgdGhlIGRlZiBmaWxlIGZyb20gdGhlIHN5bWJvbCBleHBvcnQgbGlzdCwgc28gdGhhdAotICAgICMgdGhlIGNvbXBpbGVkIGRsbCBvbmx5IGV4cG9ydHMgdGhlIHN5bWJvbCBleHBvcnQgbGlzdC4KLSAgICBleHBvcnRfc3ltYm9sc19jbWRzPSdybSAtZiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuY34KLSAgICAgIHNlZCAtZSAiL14jIFwvXCogbHRkbGwuYyBzdGFydHMgaGVyZSBcKlwvLywvXiMgXC9cKiBsdGRsbC5jIGVuZHMgaGVyZSBcKlwvLyB7IHMvXiMgLy87IHA7IH0iIC1lIGQgPCAkMCA+ICRvYmpkaXIvJHNvbmFtZS1sdGRsbC5jfgotICAgICAgKGNkICRvYmpkaXIgJiYgJENDIC1jICRzb25hbWUtbHRkbGwuYyl+Ci0gICAgICAkRExMVE9PTCAtLWV4cG9ydC1hbGwgLS1leGNsdWRlLXN5bWJvbHMgRGxsTWFpbkAxMixfY3lnd2luX2RsbF9lbnRyeUAxMixfY3lnd2luX25vbmN5Z3dpbl9kbGxfZW50cnlAMTIgLS1vdXRwdXQtZGVmICRvYmpkaXIvJHNvbmFtZS1kZWYgICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0ICRsaWJvYmpzfgotICAgICAgc2VkIC1lICIxLC9FWFBPUlRTL2QiIC1lICJzLyBAIFswLTldKiA7ICovLyIgPCAkb2JqZGlyLyRzb25hbWUtZGVmID4gJGV4cG9ydF9zeW1ib2xzJwotCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nZWNobyBFWFBPUlRTID4gJG9iamRpci8kc29uYW1lLWRlZn4KLSAgICAgIF9sdF9oaW50PTE7Ci0gICAgICBmb3Igc3ltYm9sIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8KLSAgICAgICAgZWNobyAiCVwkc3ltYm9sIEAgXCRfbHRfaGludCA7ICIgPj4gJG9iamRpci8kc29uYW1lLWRlZjsKLQlfbHRfaGludD1gZXhwciAxICsgXCRfbHRfaGludGA7Ci0gICAgICBkb25lfgotICAgICAgJENDIC1XbCwtLWJhc2UtZmlsZSwkb2JqZGlyLyRzb25hbWUtYmFzZSAtV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyAtV2wsLWUsX19jeWd3aW5fZGxsX2VudHJ5QDEyIC1vICRsaWIgJG9iamRpci8kc29uYW1lLWx0ZGxsLiRvYmpleHQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzfgotICAgICAgJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1leGNsdWRlLXN5bWJvbHMgRGxsTWFpbkAxMixfY3lnd2luX2RsbF9lbnRyeUAxMixfY3lnd2luX25vbmN5Z3dpbl9kbGxfZW50cnlAMTIgLS1kZWYgJG9iamRpci8kc29uYW1lLWRlZiAtLWJhc2UtZmlsZSAkb2JqZGlyLyRzb25hbWUtYmFzZSAtLW91dHB1dC1leHAgJG9iamRpci8kc29uYW1lLWV4cH4KLSAgICAgICRDQyAtV2wsLS1iYXNlLWZpbGUsJG9iamRpci8kc29uYW1lLWJhc2UgJG9iamRpci8kc29uYW1lLWV4cCAtV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyAtV2wsLWUsX19jeWd3aW5fZGxsX2VudHJ5QDEyIC1vICRsaWIgJG9iamRpci8kc29uYW1lLWx0ZGxsLiRvYmpleHQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzfgotICAgICAgJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1leGNsdWRlLXN5bWJvbHMgRGxsTWFpbkAxMixfY3lnd2luX2RsbF9lbnRyeUAxMixfY3lnd2luX25vbmN5Z3dpbl9kbGxfZW50cnlAMTIgLS1kZWYgJG9iamRpci8kc29uYW1lLWRlZiAtLWJhc2UtZmlsZSAkb2JqZGlyLyRzb25hbWUtYmFzZSAtLW91dHB1dC1leHAgJG9iamRpci8kc29uYW1lLWV4cH4KLSAgICAgICRDQyAkb2JqZGlyLyRzb25hbWUtZXhwIC1XbCwtLWRsbCAtbm9zdGFydGZpbGVzIC1XbCwtZSxfX2N5Z3dpbl9kbGxfZW50cnlAMTIgLW8gJGxpYiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0KLSAgICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JyRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZGVmICRvYmpkaXIvJHNvbmFtZS1kZWYgLS1vdXRwdXQtbGliICRvYmpkaXIvJGxpYm5hbWUuYScKLSAgICA7OwotCi0gICopCi0gICAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGxkX3NobGlicz1ubwotICAgIGZpCi0gICAgOzsKLSAgZXNhYwotCi0gIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0geWVzOyB0aGVuCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJwotICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJwotICBmaQotZWxzZQotICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBhaXgzKikKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKLSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckTEQgLW8gJG9iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSIGNydSAkbGliICRvYmpkaXIvJHNvbmFtZScKLSAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQotICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0gICAgICAjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKLSAgICAgICMgYnJva2VuIGNvbGxlY3QyLgotICAgICAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCi0gICAgZmkKLSAgICA7OwotCi0gIGFpeDQqKQotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPQotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAgIGlmIHN0cmluZ3MgYCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgIHwgXAotCSBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAotICAgICAgdGhlbgotCSMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgotCWhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICAgIGVsc2UKLQkjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCi0JaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCi0gICAgICBmaQotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1ibm9lbnRyeSAtbyAkb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGVsc2UKLSAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKLSAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtbyAkb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyAke3dsfS1iTTpTUkUgJHt3bH0tYm5vZW50cnknCi0gICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgZmkKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICMgVGhvdWdoIExJQlBBVEggdmFyaWFibGUgaGFyZGNvZGVzIHNobGlicGF0aCBpbnRvIGV4ZWN1dGFibGUsCi0gICAgIyBpdCBkb2Vzbid0IGFmZmVjdCBzZWFyY2hpbmcgZm9yIC1sKiBsaWJyYXJpZXM7IHRoaXMgY29uZnVzZXMKLSAgICAjIHRlc3RzIGluIG1kZW1vLgotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICA7OwotCi0gIGFtaWdhb3MqKQotICAgIGFyY2hpdmVfY21kcz0nJHJtICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiBjcnUgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICA7OwotCi0gIGN5Z3dpbiogfCBtaW5ndyopCi0gICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgotICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKLSAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgotICAgIGxpYmV4dD1saWIKLSAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCi0gICAgYXJjaGl2ZV9jbWRzPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkbGlua29wdHMgYGVjaG8gIiRkZXBsaWJzIiB8IHNlZCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JwotICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0ndHJ1ZScKLSAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgotICAgIG9sZF9hcmNoaXZlX2NtZHM9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcycKLSAgICBmaXhfc3JjZmlsZV9wYXRoPSdgY3lncGF0aCAtdyAkc3JjZmlsZWAnCi0gICAgOzsKLQotICBmcmVlYnNkMSopCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIDs7Ci0KLSAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCi0gICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubwotICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgIyBleHRyYSBzcGFjZSkuCi0gIGZyZWVic2QyLjIqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC91c3IvbGliL2MrK3J0MC5vJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD1ubyAjIHZlcmlmaWVkIG9uIDIuMi42Ci0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgotICBmcmVlYnNkMiopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgotICBmcmVlYnNkKikKLSAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIGhwdXg5KikKLSAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyLyRzb25hbWV+JExEIC1iICtzICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzfnRlc3QgJG9iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb2JqZGlyLyRzb25hbWUgJGxpYicKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgOzsKLQotICBocHV4MTAqIHwgaHB1eDExKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYiAraCAkc29uYW1lICtzICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCi0gICAgOzsKLQotICBpcml4NSogfCBpcml4NiopCi0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgIC1vICRsaWInCi0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtbyAkbGliJwotICAgIGZpCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgIDs7Ci0KLSAgbmV0YnNkKikKLSAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycgICMgYS5vdXQKLSAgICBlbHNlCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJyAgICAgICMgRUxGCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgb3BlbmJzZCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBvczIqKQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYXJjaGl2ZV9jbWRzPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG9iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gREFUQSA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIEVYUE9SVFMgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAkb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSdlbXhpbXAgLW8gJG9iamRpci8kbGlibmFtZS5hICRvYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgIDs7Ci0KLSAgb3NmMyogfCBvc2Y0KikKLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJwotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC1vICRsaWInCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06Ci0gICAgOzsKLQotICBzY28zLjJ2NSopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIDs7Ci0KLSAgc29sYXJpcyopCi0gICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiB0ZXh0JwotICAgICMgJENDIC1zaGFyZWQgd2l0aG91dCBHTlUgbGQgd2lsbCBub3QgY3JlYXRlIGEgbGlicmFyeSBmcm9tIEMrKwotICAgICMgb2JqZWN0IGZpbGVzIGFuZCBhIHN0YXRpYyBsaWJzdGRjKyssIGJldHRlciBhdm9pZCBpdCBieSBub3cKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KLQkJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c34kcm0gJGxpYi5leHAnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIHN1bm9zNCopCi0gICAgIyBXaHkgZG8gd2UgbmVlZCAtQnN0YXRpYz8gIFRvIGF2b2lkIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzLCBtYXliZS4uLgotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAgICMgVXNlIC1mUElDIGhlcmUgYmVjYXVzZSBsaWJnY2MgaXMgbXVsdGlsaWJiZWQKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQnN0YXRpYyAtZlBJQyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBlbHNlCi0gICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBzeXN2NC4zKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2RpcmVjdD1ubwotICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSctQmV4cG9ydCcKLSAgICA7OwotCi0gIHV0czQqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD1ubwotICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBkZ3V4KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICBoYXJkY29kZV9taW51c19MPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgKikKLSAgICBsZF9zaGxpYnM9bm8KLSAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCi0gICAgOzsKLSAgZXNhYwotZmkKLWVjaG8gIiRhY190JGxkX3NobGlicyIgMT4mNgotCi1pZiB0ZXN0IC16ICIkTk0iOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubS4uLiAkYWNfYyIgMT4mNgotICBjYXNlICIkTk0iIGluCi0gIC8qIHwgW0EtWmEtel06Wy9cXF0qKSA7OyAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgKikKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvdWNiIC91c3IvY2NzL2JpbiAvYmluOyBkbwotICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0JIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotCWlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCSAgTk09IiRhY19kaXIvbm0gLUIiCi0JICBicmVhawotCWVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JICBOTT0iJGFjX2Rpci9ubSAtcCIKLQkgIGJyZWFrCi0JZWxzZQotCSAgTk09JHtOTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCSAgY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLQlmaQotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gICAgdGVzdCAteiAiJE5NIiAmJiBOTT1ubQotICAgIDs7Ci0gIGVzYWMKLSAgZWNobyAiJGFjX3QkTk0iIDE+JjYKLWZpCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1lY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQuLi4gJGFjX2MiIDE+JjYKLQotIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLXN5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLXN5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikgIyBJdHMgbGlua2VyIGRpc3Rpbmd1aXNoZXMgZGF0YSBmcm9tIGNvZGUgc3ltYm9scwotICBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBzeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIHN5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBzeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgotICBnbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkc3ltY29kZVwpWyAJXVsgCV0qXCgkYWNfc3ltcHJmeFwpJHN5bXBhdCQvJHN5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIHBpcGVfd29ya3M9bm8KLSAgJHJtIGNvbmZ0ZXN0KgotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQotRU9GCi0KLSAgZWNobyAiJHByb2duYW1lOjE0NDc6IGNoZWNraW5nIGlmIGdsb2JhbF9zeW1ib2xfcGlwZSB3b3JrcyIgPiY1Ci0gIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MTQ0ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRvYmpleHQ7IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBubGlzdD1jb25mdGVzdC5ubQotICAgIGlmIHsgZWNobyAiJHByb2duYW1lOjE0NTE6IGV2YWwgXCIkTk0gY29uZnRlc3QuJG9iamV4dCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPiAkbmxpc3RcIiIgPiY1OyBldmFsICIkTk0gY29uZnRlc3QuJG9iamV4dCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPiAkbmxpc3QgMj4mNSI7IH0gJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KLQltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJG5saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQkgIHNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRubGlzdCIgPj4gY29uZnRlc3QuYwotCSAgY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJG9iamV4dCBjb25mdGVzdG0uJG9iamV4dAotCSAgc2F2ZV9MSUJTPSIkTElCUyIKLQkgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRvYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToxNTAzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0JICBmaQotCSAgTElCUz0iJHNhdmVfTElCUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGdsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0gIGZpCi0gICRybSBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBnbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1lY2hvICIkYWNfdCRwaXBlX3dvcmtzIiAxPiY2Ci0KLWlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9Ci1maQotCi0jIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gJGFjX2MiIDE+JjYKLWhhcmRjb2RlX2FjdGlvbj0KLWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8fCBcCi0gICB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0KLSAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgotICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSBubyAmJiBcCi0gICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSBubyAmJiBcCi0gICAgIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiAhPSBubzsgdGhlbgotCi0gICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KLSAgICBoYXJkY29kZV9hY3Rpb249cmVsaW5rCi0gIGVsc2UKLSAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgotICAgIGhhcmRjb2RlX2FjdGlvbj1pbW1lZGlhdGUKLSAgZmkKLWVsc2UKLSAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKLSAgIyBkaXJlY3Rvcmllcy4KLSAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCi1maQotZWNobyAiJGFjX3QkaGFyZGNvZGVfYWN0aW9uIiAxPiY2Ci0KLQotcmVsb2FkX2ZsYWc9Ci1yZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzLi4uICRhY19jIiAxPiY2Ci0jIFBPUlRNRSBTb21lIGxpbmtlcnMgbWF5IG5lZWQgYSBkaWZmZXJlbnQgcmVsb2FkIGZsYWcuCi1yZWxvYWRfZmxhZz0nLXInCi1lY2hvICIkYWNfdCRyZWxvYWRfZmxhZyIgMT4mNgotdGVzdCAtbiAiJHJlbG9hZF9mbGFnIiAmJiByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIKLQotIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcwotbGlicmFyeV9uYW1lc19zcGVjPQotbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKLXNvbmFtZV9zcGVjPQotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KLXZlcnNpb25fdHlwZT1ub25lCi1keW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLWZpbGVfbWFnaWNfY21kPQotZmlsZV9tYWdpY190ZXN0X2ZpbGU9Ci1kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKLSMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAotIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgotIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCi0jIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KLSMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KLSMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KLSMgJ2ZpbGVfbWFnaWMgW3JlZ2V4XScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCi0jIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGVncmVwIHJlZ2V4LgotIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCi0jIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICRhY19jIiAxPiY2Ci1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeDMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0KLSAgIyBBSVggaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICA7OwotCi1haXg0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gICMgQUlYIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKLSAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bwotICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgotICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aG91Z2ggQUlYNC4yCi0gICMgYW5kIGxhdGVyIGxpbmtlciBzdXBwb3J0cyAuc28KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCi0gIDs7Ci0KLWFtaWdhb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJwotICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgotICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgIihjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSI7IChjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSB8fCBleGl0IDE7IGRvbmUnCi0gIDs7Ci0KLWJlb3MqKQotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0uc28nCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLSAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKLSAgOzsKLQotYnNkaTQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LnNvJG1ham9yICR7bGlibmFtZX0uc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9LnNvJwotICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiAzMi1iaXQgTFNCIHNoYXJlZCBvYmplY3QnCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKLSAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKLSAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93Ci0gICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcwotICA7OwotCi1jeWd3aW4qIHwgbWluZ3cqKQotICB2ZXJzaW9uX3R5cGU9d2luZG93cwotICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8IHNlZCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsICRsaWJuYW1lLmEnCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgc2VkIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fS5kbGwgJGxpYm5hbWUubGliJwotICBmaQotICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJwotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZWkqLWkzODYuKmFyY2hpdGVjdHVyZTogaTM4NicKLSAgZmlsZV9tYWdpY19jbWQ9J29iamR1bXAgLWYnCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KLSAgc2hsaWJwYXRoX3Zhcj1QQVRICi0gIDs7Ci0KLWZyZWVic2QxKikKLSAgZHluYW1pY19saW5rZXI9bm8KLSAgOzsKLSAgCi1mcmVlYnNkKikKLSAgb2JqZm9ybWF0PWB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdCAmJiAvdXNyL2Jpbi9vYmpmb3JtYXQgfHwgZWNobyBhb3V0YAotICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0Ci0gIGNhc2UgIiR2ZXJzaW9uX3R5cGUiIGluCi0gICAgZnJlZWJzZC1lbGYqKQotICAgICAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0Igc2hhcmVkIG9iamVjdCcKLSAgICAgIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgICAgIGZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCi0gICAgICBuZWVkX3ZlcnNpb249bm8KLSAgICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICAgICAgOzsKLSAgICBmcmVlYnNkLSopCi0gICAgICBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCi0gICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAkbGlibmFtZS5zbyR2ZXJzdWZmaXgnCi0gICAgICBuZWVkX3ZlcnNpb249eWVzCi0gICAgICA7OwotICBlc2FjCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovc2JpbiIgT0JKRk9STUFUPSInIiRvYmpmb3JtYXQiJyIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotZ251KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCi0gICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkbWFqb3IgJGxpYm5hbWUuc2wnCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCRtYWpvcicKLSAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJwotICA7OwotCi1pcml4NSopCi0gIHZlcnNpb25fdHlwZT1pcml4Ci0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbycKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiAzMi1iaXQgTVNCIGR5bmFtaWMgbGliIE1JUFMgLSB2ZXJzaW9uIDEiICMgb3Igc2hvdWxkIGl0IGJlIHBhc3NfYWxsPwotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9saWIvbGliYy5zbypgCi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICA7OwotCi1pcml4NiopCi0gIHZlcnNpb25fdHlwZT1pcml4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKLSAgY2FzZSAiJExEIiBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECi0gICotMzJ8KiItMzIgIikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OwotICAqLW4zMnwqIi1uMzIgIikgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7Ci0gICotNjR8KiItNjQgIikgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKLSAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7Ci0gIGVzYWMKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gICMgZXZlbiB0aG91Z2ggL3Vzci9sb2NhbC9saWIgaXMgYWx3YXlzIHNlYXJjaGVkLCB0aGUgbWFuLXBhZ2Ugc2F5cwotICAjIHNoYXJlZCBsaWJyYXJpZXMgc2hvdWxkIG5vdCBiZSBpbnN0YWxsZWQgdGhlcmUgaWYgdGhleSB1c2UgYW4gQUJJCi0gICMgZGlmZmVyZW50IGZyb20gLTMyLCBzbyB3ZSdkIGJldHRlciBub3Qgc2VhcmNoIGZvciBzaGFyZWQgbGlicmFyaWVzCi0gICMgdGhlcmUgZWl0aGVyCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiR7bGlic3VmZn0gL3Vzci9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIke2xpYnN1ZmZ9IC91c3IvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiAke2xpYm1hZ2ljfSBNU0IgbWlwcy1bMTIzNF0gZHluYW1pYyBsaWIgTUlQUyAtIHZlcnNpb24gMSIgIyBvciBzaG91bGQgaXQgYmUgcGFzc19hbGw/Ci0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYiR7bGlic3VmZn0vbGliYy5zbypgCi0gIDs7Ci0KLSMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KLWxpbnV4LWdudW9sZGxkKiB8IGxpbnV4LWdudWFvdXQqIHwgbGludXgtZ251Y29mZiopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4LWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYi9saWJjLnNvKiAvbGliL2xpYmMtKi5zb2AKLQotICBpZiB0ZXN0IC1mIC9saWIvbGQuc28uMTsgdGhlbgotICAgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCi0gIGVsc2UKLSAgICAjIE9ubHkgdGhlIEdOVSBsZC5zbyBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIG9uIE1rTGludXguCi0gICAgY2FzZSAiJGhvc3RfY3B1IiBpbgotICAgIHBvd2VycGMqKSBkeW5hbWljX2xpbmtlcj1ubyA7OwotICAgICopIGR5bmFtaWNfbGlua2VyPSdMaW51eCBsZC5zbycgOzsKLSAgICBlc2FjCi0gIGZpCi0gIDs7Ci0KLW5ldGJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCi0gICAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKLSAgZWxzZQotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICR7bGlibmFtZX0uc28nCi0gICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJwotICBmaQotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1vcGVuYnNkKikKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICBuZWVkX3ZlcnNpb249bm8KLSAgZmkKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLW9zMiopCi0gIGxpYm5hbWVfc3BlYz0nJG5hbWUnCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbCAkbGlibmFtZS5hJwotICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICA7OwotCi1vc2YzKiB8IG9zZjQqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbycKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gICMgZGVwbGlic19jaGVja19tZXRob2Q9J3Bhc3NfYWxsJwotICAjIEFsdGhvdWdoIHBhc3NfYWxsIGFwcGVhcnMgdG8gd29yaywgaXQgY29waWVzIHN5bWJvbHMgZnJvbSBzdGF0aWMgbGlicmFyaWVzCi0gICMgaW50byBzaGFyZWQgb25lcyBhbmQgZXhwb3J0cyB0aGVtLiAgU28sIHdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIHR3bwotICAjIG9yIG1vcmUgbGlicmFyaWVzIHRoYXQgaGF2ZSBnb3QgY29waWVzIG9mIHRoZSBzYW1lIHN5bWJvbHMsIGxpbmsgZmFpbHMKLSAgIyBUaGlzIHdhcyBvbmx5IHRlc3RlZCBvbiBvc2Y0OgotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBDT0ZGIGZvcm1hdCBhbHBoYSBzaGFyZWQgbGlicmFyeScKLSAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbwotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgotICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKLSAgOzsKLQotc2NvMy4ydjUqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLXNvbGFyaXMqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCi0gICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCi0gIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldLWJpdCBbTE1dU0IgZHluYW1pYyBsaWIiCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKLSAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgbmVlZF9saWJfcHJlZml4PW5vCi0gIGZpCi0gIG5lZWRfdmVyc2lvbj15ZXMKLSAgOzsKLQotc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIGNhc2UgIiRob3N0X3ZlbmRvciIgaW4KLSAgICBuY3IpCi0gICAgICBkZXBsaWJzX2NoZWNrX21ldGhvZD0ncGFzc19hbGwnCi0gICAgICA7OwotICBlc2FjCi0gIDs7Ci0KLXV0czQqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotZGd1eCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci1lc2FjCi1lY2hvICIkYWNfdCRkeW5hbWljX2xpbmtlciIgMT4mNgotdGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KLQotIyBSZXBvcnQgdGhlIGZpbmFsIGNvbnNlcXVlbmNlcy4KLWVjaG8gImNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkY2FuX2J1aWxkX3NoYXJlZCIgMT4mNgotCi1pZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiICYmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX2NtZCI7IHRoZW4KLSAgY2FzZSAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiBpbgotICAiZmlsZV9tYWdpYyAiKikKLSAgICBmaWxlX21hZ2ljX3JlZ2V4PSJgZXhwciBcIiRkZXBsaWJzX2NoZWNrX21ldGhvZFwiIDogXCJmaWxlX21hZ2ljIFwoLipcKVwiYCIKLSAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8Ci0gICAgICAgZWdyZXAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgOgotICAgIGVsc2UKLSAgICAgIGNhdCA8PEVPRiAxPiYyCi0KLSoqKiBXYXJuaW5nOiB0aGUgY29tbWFuZCBsaWJ0b29sIHVzZXMgdG8gZGV0ZWN0IHNoYXJlZCBsaWJyYXJpZXMsCi0qKiogJGZpbGVfbWFnaWNfY21kLCBwcm9kdWNlcyBvdXRwdXQgdGhhdCBsaWJ0b29sIGNhbm5vdCByZWNvZ25pemUuCi0qKiogVGhlIHJlc3VsdCBpcyB0aGF0IGxpYnRvb2wgbWF5IGZhaWwgdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMKLSoqKiBhcyBzdWNoLiAgVGhpcyB3aWxsIGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMgdGhhdAotKioqIGRlcGVuZCBvbiBzaGFyZWQgbGlicmFyaWVzLCBidXQgcHJvZ3JhbXMgbGlua2VkIHdpdGggc3VjaCBsaWJ0b29sCi0qKiogbGlicmFyaWVzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHRoaXMgcHJvYmxlbS4gIE5ldmVydGhlbGVzcywgeW91Ci0qKiogbWF5IHdhbnQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHlvdXIgc3lzdGVtIG1hbmFnZXIgYW5kL29yIHRvCi0qKiogYnVnLWxpYnRvb2xAZ251Lm9yZwotCi1FT0YKLSAgICBmaSA7OwotICBlc2FjCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGFjX2MiIDE+JjYKLXRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubwotCi0jIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKLSMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4MyopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgotICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKLSAgZmkKLSAgOzsKLQotYWl4NCopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIDs7Ci1lc2FjCi0KLWVjaG8gIiRhY190JGVuYWJsZV9zaGFyZWQiIDE+JjYKLQotIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKLQotZWNobyAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICRlbmFibGVfc3RhdGljIiAxPiY2Ci0KLWlmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi1lbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8Ci0gICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCi0gICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICRhY19jIiAxPiY2Ci1ybSAtZiAubGlicyAyPi9kZXYvbnVsbAotbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKLWlmIHRlc3QgLWQgLmxpYnM7IHRoZW4KLSAgb2JqZGlyPS5saWJzCi1lbHNlCi0gICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCi0gIG9iamRpcj1fbGlicwotZmkKLXJtZGlyIC5saWJzIDI+L2Rldi9udWxsCi1lY2hvICIkYWNfdCRvYmpkaXIiIDE+JjYKLQotaWYgdGVzdCAieCRlbmFibGVfZGxvcGVuIiAhPSB4eWVzOyB0aGVuCi0gIGVuYWJsZV9kbG9wZW49dW5rbm93bgotICBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93bgotICBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KLWVsc2UKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9kbG9wZW4nK3NldH0nYFwiICE9IHNldCI7IHRoZW4KLSAgbHRfY3ZfZGxvcGVuPW5vIGx0X2N2X2Rsb3Blbl9saWJzPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MTk3NzogY2hlY2tpbmcgZm9yIGRsb3BlbiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19kbG9wZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTgyICJsdGNvbmZpZyIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGRsb3BlbigpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGRsb3BlbigpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViX2Rsb3BlbikgfHwgZGVmaW5lZCAoX19zdHViX19fZGxvcGVuKQotY2hva2UgbWUKLSNlbHNlCi1kbG9wZW4oKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjAwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19kbG9wZW49eWVzIgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX2Rsb3Blbj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ2Rsb3BlbmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIwMjI6IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGRsJ18nZGxvcGVuIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwMzAgImx0Y29uZmlnIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBkbG9wZW4oKTsKLQotaW50IG1haW4oKSB7Ci1kbG9wZW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIwNDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIwNTk6IGNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGRsZCdfJ2RsZF9saW5rIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGRsZCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDY3ICJsdGNvbmZpZyIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZGxkX2xpbmsoKTsKLQotaW50IG1haW4oKSB7Ci1kbGRfbGluaygpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjA3NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaGxfbG9hZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjA5NjogY2hlY2tpbmcgZm9yIHNobF9sb2FkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3NobF9sb2FkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjEwMSAibHRjb25maWciCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBzaGxfbG9hZCgpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHNobF9sb2FkKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfc2hsX2xvYWQpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3NobF9sb2FkKQotY2hva2UgbWUKLSNlbHNlCi1zaGxfbG9hZCgpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMTIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX3NobF9sb2FkPXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19zaGxfbG9hZD1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ3NobF9sb2FkYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExvYWRMaWJyYXJ5IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToyMTQxOiBjaGVja2luZyBmb3IgTG9hZExpYnJhcnkiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfTG9hZExpYnJhcnknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTQ2ICJsdGNvbmZpZyIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIExvYWRMaWJyYXJ5KCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgTG9hZExpYnJhcnkoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl9Mb2FkTGlicmFyeSkgfHwgZGVmaW5lZCAoX19zdHViX19fTG9hZExpYnJhcnkpCi1jaG9rZSBtZQotI2Vsc2UKLUxvYWRMaWJyYXJ5KCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIxNjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfTG9hZExpYnJhcnk9eWVzIgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX0xvYWRMaWJyYXJ5PW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nTG9hZExpYnJhcnlgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAKLWZpCi0KLSAgICAKLWZpCi0KLSAgCi1maQotCi0KLWZpCi0KLWZpCi0KLSAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgotICAgIGVuYWJsZV9kbG9wZW49eWVzCi0gIGZpCi0KLSAgY2FzZSAiJGx0X2N2X2Rsb3BlbiIgaW4KLSAgZGxvcGVuKQotZm9yIGFjX2hkciBpbiBkbGZjbi5oOyBkbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjIxMDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMTUgImx0Y29uZmlnIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1pbnQgZm5vcmQgPSAwOwotRU9GCi1hY190cnk9IiRhY19jb21waWxlIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjIyMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgIGlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllczsgdGhlbgotICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfRExGQ05fSCIKLSAgICBmaQotICAgIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLSAgICBMSUJTPSIkbHRfY3ZfZGxvcGVuX2xpYnMgJExJQlMiCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIyNDg6IGNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKLWlmIHRlc3QgIiR7bHRfY3ZfZGxvcGVuX3NlbGYrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcwotICBlbHNlCi0gICAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2xpbmUgMjI1NiAibHRjb25maWciCi0KLSNpZiBIQVZFX0RMRkNOX0gKLSNpbmNsdWRlIDxkbGZjbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgUlRMRF9HTE9CQUwKLSMgZGVmaW5lIExURExfR0xPQkFMCVJUTERfR0xPQkFMCi0jZWxzZQotIyBpZmRlZiBETF9HTE9CQUwKLSMgIGRlZmluZSBMVERMX0dMT0JBTAlETF9HTE9CQUwKLSMgZWxzZQotIyAgZGVmaW5lIExURExfR0xPQkFMCTAKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRETF9MQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCi0gICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCi0jaWZuZGVmIExURExfTEFaWV9PUl9OT1cKLSMgaWZkZWYgUlRMRF9MQVpZCi0jICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlSVExEX0xBWlkKLSMgZWxzZQotIyAgaWZkZWYgRExfTEFaWQotIyAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCURMX0xBWlkKLSMgIGVsc2UKLSMgICBpZmRlZiBSVExEX05PVwotIyAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlSVExEX05PVwotIyAgIGVsc2UKLSMgICAgaWZkZWYgRExfTk9XCi0jICAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlETF9OT1cKLSMgICAgZWxzZQotIyAgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJMAotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWZub3JkKCkgeyBpbnQgaT00Mjt9Ci1tYWluKCkgeyB2b2lkICpzZWxmLCAqcHRyMSwgKnB0cjI7IHNlbGY9ZGxvcGVuKDAsTFRETF9HTE9CQUx8TFRETF9MQVpZX09SX05PVyk7Ci0gICAgaWYoc2VsZikgeyBwdHIxPWRsc3ltKHNlbGYsImZub3JkIik7IHB0cjI9ZGxzeW0oc2VsZiwiX2Zub3JkIik7Ci0JICAgICAgIGlmKHB0cjEgfHwgcHRyMikgZXhpdCgwKTsgfSBleGl0KDEpOyB9IAotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjMwMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2Rsb3Blbl9zZWxmIiAxPiY2Ci0KLSAgaWYgdGVzdCAiJGx0X2N2X2Rsb3Blbl9zZWxmIiA9IHllczsgdGhlbgotICAgIExERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjMyMTogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQotaWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MKLSAgZWxzZQotICAgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNsaW5lIDIzMjkgImx0Y29uZmlnIgotCi0jaWYgSEFWRV9ETEZDTl9ICi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFJUTERfR0xPQkFMCi0jIGRlZmluZSBMVERMX0dMT0JBTAlSVExEX0dMT0JBTAotI2Vsc2UKLSMgaWZkZWYgRExfR0xPQkFMCi0jICBkZWZpbmUgTFRETF9HTE9CQUwJRExfR0xPQkFMCi0jIGVsc2UKLSMgIGRlZmluZSBMVERMX0dMT0JBTAkwCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExURExfTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQotICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLwotI2lmbmRlZiBMVERMX0xBWllfT1JfTk9XCi0jIGlmZGVmIFJUTERfTEFaWQotIyAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJUlRMRF9MQVpZCi0jIGVsc2UKLSMgIGlmZGVmIERMX0xBWlkKLSMgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlETF9MQVpZCi0jICBlbHNlCi0jICAgaWZkZWYgUlRMRF9OT1cKLSMgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJUlRMRF9OT1cKLSMgICBlbHNlCi0jICAgIGlmZGVmIERMX05PVwotIyAgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJRExfTk9XCi0jICAgIGVsc2UKLSMgICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCTAKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1mbm9yZCgpIHsgaW50IGk9NDI7fQotbWFpbigpIHsgdm9pZCAqc2VsZiwgKnB0cjEsICpwdHIyOyBzZWxmPWRsb3BlbigwLExURExfR0xPQkFMfExURExfTEFaWV9PUl9OT1cpOwotICAgIGlmKHNlbGYpIHsgcHRyMT1kbHN5bShzZWxmLCJmbm9yZCIpOyBwdHIyPWRsc3ltKHNlbGYsIl9mbm9yZCIpOwotICAgIGlmKHB0cjEgfHwgcHRyMikgZXhpdCgwKTsgfSBleGl0KDEpOyB9IAotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjM3NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiAxPiY2Ci1maQotICAgIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkbHRfY3ZfZGxvcGVuX3NlbGYiIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OwotICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgaW4KLSAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7Ci0gIGVzYWMKLWZpCi0KLSMgQ29weSBlY2hvIGFuZCBxdW90ZSB0aGUgY29weSwgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwsIGJlY2F1c2UgaXQgaXMKLSMgdXNlZCBsYXRlci4KLWx0ZWNobz0iJGVjaG8iCi1pZiB0ZXN0ICJYJGx0ZWNobyIgPSAiWCRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIjsgdGhlbgotICAgbHRlY2hvPSIkQ09ORklHX1NIRUxMIFwkMCAtLWZhbGxiYWNrLWVjaG8iCi1maQotTFRTSEVMTD0iJFNIRUxMIgotCi1MVENPTkZJR19WRVJTSU9OPSIkVkVSU0lPTiIKLQotIyBPbmx5IHF1b3RlIHZhcmlhYmxlcyBpZiB3ZSdyZSB1c2luZyBsdG1haW4uc2guCi1jYXNlICIkbHRtYWluIiBpbgotKi5zaCkKLSAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycy4KLSAgZm9yIHZhciBpbiBsdGVjaG8gb2xkX0NDIG9sZF9DRkxBR1Mgb2xkX0NQUEZMQUdTIG9sZF9MRCBvbGRfTk0gb2xkX1JBTkxJQiBcCi0gICAgb2xkX0xOX1Mgb2xkX0RMTFRPT0wgb2xkX0FTIEFSIENDIExEIExOX1MgTk0gTFRTSEVMTCBMVENPTkZJR19WRVJTSU9OIFwKLSAgICByZWxvYWRfZmxhZyByZWxvYWRfY21kcyB3bCBcCi0gICAgcGljX2ZsYWcgbGlua19zdGF0aWNfZmxhZyBub19idWlsdGluX2ZsYWcgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIFwKLSAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgbGlibmFtZV9zcGVjIFwKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgXAotICAgIFJBTkxJQiBvbGRfYXJjaGl2ZV9jbWRzIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgXAotICAgIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgYXJjaGl2ZV9jbWRzIGFyY2hpdmVfZXhwc3ltX2NtZHMgcG9zdGluc3RhbGxfY21kcyBwb3N0dW5pbnN0YWxsX2NtZHMgXAotICAgIGZpbGVfbWFnaWNfY21kIGV4cG9ydF9zeW1ib2xzX2NtZHMgZGVwbGlic19jaGVja19tZXRob2QgYWxsb3dfdW5kZWZpbmVkX2ZsYWcgbm9fdW5kZWZpbmVkX2ZsYWcgXAotICAgIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIGdsb2JhbF9zeW1ib2xfcGlwZSBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgIFwKLSAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAotICAgIGNvbXBpbGVyX2NfbyBjb21waWxlcl9vX2xvIG5lZWRfbG9ja3MgZXhjbHVkZV9leHBzeW1zIGluY2x1ZGVfZXhwc3ltczsgZG8KLQotICAgIGNhc2UgIiR2YXIiIGluCi0gICAgcmVsb2FkX2NtZHMgfCBvbGRfYXJjaGl2ZV9jbWRzIHwgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyB8IFwKLSAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kcyB8IGFyY2hpdmVfY21kcyB8IGFyY2hpdmVfZXhwc3ltX2NtZHMgfCBcCi0gICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKLSAgICBmaW5pc2hfY21kcyB8IHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQotICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgotICAgICAgZXZhbCAiJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgIiR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0KLSAgY2FzZSAiJGx0ZWNobyIgaW4KLSAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCi0gICAgbHRlY2hvPWAkZWNobyAiWCRsdGVjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKLSAgICA7OwotICBlc2FjCi0KLSAgdHJhcCAiJHJtIFwiJG9maWxlXCI7IGV4aXQgMSIgMSAyIDE1Ci0gIGVjaG8gImNyZWF0aW5nICRvZmlsZSIKLSAgJHJtICIkb2ZpbGUiCi0gIGNhdCA8PEVPRiA+ICIkb2ZpbGUiCi0jISAkU0hFTEwKLQotIyBgJGVjaG8gIiRvZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVApCi0jIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0Y29uZmlnIG9yIGx0bWFpbi5zaC4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCi1Yc2VkPSJzZWQgLWUgcy9eWC8vIgotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotaWYgdGVzdCAiXCR7Q0RQQVRIK3NldH0iID0gc2V0OyB0aGVuIENEUEFUSD07IGV4cG9ydCBDRFBBVEg7IGZpCi0KLSMjIyBCRUdJTiBMSUJUT09MIENPTkZJRwotRU9GCi0gIGNmZ2ZpbGU9IiRvZmlsZSIKLSAgOzsKLQotKikKLSAgIyBEb3VibGUtcXVvdGUgdGhlIHZhcmlhYmxlcyB0aGF0IG5lZWQgaXQgKGZvciBhZXN0aGV0aWNzKS4KLSAgZm9yIHZhciBpbiBvbGRfQ0Mgb2xkX0NGTEFHUyBvbGRfQ1BQRkxBR1Mgb2xkX0xEIG9sZF9OTSBvbGRfUkFOTElCIFwKLSAgICBvbGRfTE5fUyBvbGRfRExMVE9PTCBvbGRfQVM7IGRvCi0gICAgZXZhbCAiJHZhcj1cXFwiXCR2YXJcXFwiIgotICBkb25lCi0KLSAgIyBKdXN0IGNyZWF0ZSBhIGNvbmZpZyBmaWxlLgotICBjZmdmaWxlPSIkb2ZpbGUuY2ZnIgotICB0cmFwICIkcm0gXCIkY2ZnZmlsZVwiOyBleGl0IDEiIDEgMiAxNQotICBlY2hvICJjcmVhdGluZyAkY2ZnZmlsZSIKLSAgJHJtICIkY2ZnZmlsZSIKLSAgY2F0IDw8RU9GID4gIiRjZmdmaWxlIgotIyBgJGVjaG8gIiRjZmdmaWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIExpYnRvb2wgY29uZmlndXJhdGlvbiBmaWxlLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCkKLUVPRgotICA7OwotZXNhYwotCi1jYXQgPDxFT0YgPj4gIiRjZmdmaWxlIgotIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyBDQz0kb2xkX0NDIENGTEFHUz0kb2xkX0NGTEFHUyBDUFBGTEFHUz0kb2xkX0NQUEZMQUdTIFxcCi0jIExEPSRvbGRfTEQgTk09JG9sZF9OTSBSQU5MSUI9JG9sZF9SQU5MSUIgTE5fUz0kb2xkX0xOX1MgXFwKLSMgRExMVE9PTD0iJG9sZF9ETExUT09MIiBBUz0iJG9sZF9BUyIgXFwKLSMgICAkMCRsdGNvbmZpZ19hcmdzCi0jCi0jIENvbXBpbGVyIGFuZCBvdGhlciB0ZXN0IG91dHB1dCBwcm9kdWNlZCBieSAkcHJvZ25hbWUsIHVzZWZ1bCBmb3IKLSMgZGVidWdnaW5nICRwcm9nbmFtZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotIyBUaGUgdmVyc2lvbiBvZiAkcHJvZ25hbWUgdGhhdCBnZW5lcmF0ZWQgdGhpcyBzY3JpcHQuCi1MVENPTkZJR19WRVJTSU9OPSRMVENPTkZJR19WRVJTSU9OCi0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSRMVFNIRUxMCi0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KLWJ1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCi1idWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KLWZhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAotCi0jIFRoZSBob3N0IHN5c3RlbS4KLWhvc3RfYWxpYXM9JGhvc3RfYWxpYXMKLWhvc3Q9JGhvc3QKLQotIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi1lY2hvPSRsdGVjaG8KLQotIyBUaGUgYXJjaGl2ZXIuCi1BUj0kQVIKLQotIyBUaGUgZGVmYXVsdCBDIGNvbXBpbGVyLgotQ0M9JENDCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSRMRAotCi0jIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCi1MTl9TPSRMTl9TCi0KLSMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgotTk09JE5NCi0KLSMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgotRExMVE9PTD0iJERMTFRPT0wiCi0KLSMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KLUFTPSIkQVMiCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgotb2JqZGlyPSRvYmpkaXIKLQotIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgotcmVsb2FkX2ZsYWc9JHJlbG9hZF9mbGFnCi1yZWxvYWRfY21kcz0kcmVsb2FkX2NtZHMKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9JHdsCi0KLSMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgotb2JqZXh0PSIkb2JqZXh0IgotCi0jIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KLWxpYmV4dD0iJGxpYmV4dCIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0kcGljX2ZsYWcKLQotIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnMKLWNvbXBpbGVyX2Nfbz0kY29tcGlsZXJfY19vCi0KLSMgQ2FuIHdlIHdyaXRlIGRpcmVjdGx5IHRvIGEgLmxvID8KLWNvbXBpbGVyX29fbG89JGNvbXBpbGVyX29fbG8KLQotIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbiA/Ci1uZWVkX2xvY2tzPSRuZWVkX2xvY2tzCi0KLSMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KLW5lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4Ci0KLSMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KLW5lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCi0KLSMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgotZGxvcGVuPSRlbmFibGVfZGxvcGVuCi0KLSMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgotZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSRsaW5rX3N0YXRpY19mbGFnCi0KLSMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KLW5vX2J1aWx0aW5fZmxhZz0kbm9fYnVpbHRpbl9mbGFnCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KLWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjCi0KLSMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgotdGhyZWFkX3NhZmVfZmxhZ19zcGVjPSR0aHJlYWRfc2FmZV9mbGFnX3NwZWMKLQotIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KLXZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCi0KLSMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCi1saWJuYW1lX3NwZWM9JGxpYm5hbWVfc3BlYwotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9JGxpYnJhcnlfbmFtZXNfc3BlYwotCi0jIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgotc29uYW1lX3NwZWM9JHNvbmFtZV9zcGVjCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KLVJBTkxJQj0kUkFOTElCCi1vbGRfYXJjaGl2ZV9jbWRzPSRvbGRfYXJjaGl2ZV9jbWRzCi1vbGRfcG9zdGluc3RhbGxfY21kcz0kb2xkX3Bvc3RpbnN0YWxsX2NtZHMKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KLWFyY2hpdmVfY21kcz0kYXJjaGl2ZV9jbWRzCi1hcmNoaXZlX2V4cHN5bV9jbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCi1wb3N0aW5zdGFsbF9jbWRzPSRwb3N0aW5zdGFsbF9jbWRzCi1wb3N0dW5pbnN0YWxsX2NtZHM9JHBvc3R1bmluc3RhbGxfY21kcwotCi0jIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgotZGVwbGlic19jaGVja19tZXRob2Q9JGRlcGxpYnNfY2hlY2tfbWV0aG9kCi0KLSMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljCi1maWxlX21hZ2ljX2NtZD0kZmlsZV9tYWdpY19jbWQKLQotIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KLWFsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZwotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0kbm9fdW5kZWZpbmVkX2ZsYWcKLQotIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCi1maW5pc2hfY21kcz0kZmluaXNoX2NtZHMKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgotZmluaXNoX2V2YWw9JGZpbmlzaF9ldmFsCi0KLSMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KLWdsb2JhbF9zeW1ib2xfcGlwZT0kZ2xvYmFsX3N5bWJvbF9waXBlCi0KLSMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kZ2xvYmFsX3N5bWJvbF90b19jZGVjbAotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KLXJ1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgotCi0jIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCi1zaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCi0KLSMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPwotc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKLQotIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KLWhhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uCi0KLSMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgotIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYwotCi0jIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcgotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUuc28gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3QKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0wKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bwotIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXIKLQotIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCi0KLSMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKLXN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYwotCi0jIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCi1maXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aCIKLQotIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkCi1hbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9scwotCi0jIFRoZSBjb21tYW5kIHRvIGV4dHJhY3QgZXhwb3J0ZWQgc3ltYm9scwotZXhwb3J0X3N5bWJvbHNfY21kcz0kZXhwb3J0X3N5bWJvbHNfY21kcwotCi0jIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMKLWV4Y2x1ZGVfZXhwc3ltcz0kZXhjbHVkZV9leHBzeW1zCi0KLSMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkCi1pbmNsdWRlX2V4cHN5bXM9JGluY2x1ZGVfZXhwc3ltcwotCi1FT0YKLQotY2FzZSAiJGx0bWFpbiIgaW4KLSouc2gpCi0gIGVjaG8gJyMjIyBFTkQgTElCVE9PTCBDT05GSUcnID4+ICIkb2ZpbGUiCi0gIGVjaG8gPj4gIiRvZmlsZSIKLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqKQotICAgIGNhdCA8PFxFT0YgPj4gIiRvZmlsZSIKLQotIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0jIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKLSMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLWlmIHRlc3QgIiR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgQ09MTEVDVF9OQU1FUz0KLSAgZXhwb3J0IENPTExFQ1RfTkFNRVMKLWZpCi1FT0YKLSAgICA7OwotICBlc2FjCi0KLSAgIyBBcHBlbmQgdGhlIGx0bWFpbi5zaCBzY3JpcHQuCi0gIGNhdCAiJGx0bWFpbiIgPj4gIiRvZmlsZSIgfHwgKHJtIC1mICIkb2ZpbGUiOyBleGl0IDEpCi0KLSAgY2htb2QgK3ggIiRvZmlsZSIKLSAgOzsKLQotKikKLSAgIyBDb21waWxlIHRoZSBsaWJ0b29sIHByb2dyYW0uCi0gIGVjaG8gIkZJWE1FOiB3b3VsZCBjb21waWxlICRsdG1haW4iCi0gIDs7Ci1lc2FjCi0KLXRlc3QgLW4gIiRjYWNoZV9maWxlIiB8fCBleGl0IDAKLQotIyBBQ19DQUNIRV9TQVZFCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotZXhpdCAwCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOnNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjoyCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2x0bWFpbi5zaCBiL2x0bWFpbi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4Nzg3YS4uMDAwMDAwMAotLS0gYS9sdG1haW4uc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNzgyICswLDAgQEAKLSMgbHRtYWluLnNoIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIE5PVEU6IENoYW5naW5nIHRoaXMgZmlsZSB3aWxsIG5vdCBhZmZlY3QgYW55dGhpbmcgdW50aWwgeW91IHJlcnVuIGx0Y29uZmlnLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBDaGVjayB0aGF0IHdlIGhhdmUgYSB3b3JraW5nICRlY2hvLgotaWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KLSAgc2hpZnQKLWVsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KLSAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KLSAgc2hpZnQKLSAgY2F0IDw8RU9GCi0kKgotRU9GCi0gIGV4aXQgMAotZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4KLSAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQotICA6Ci1lbHNlCi0gICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgJGVjaG8gd2lsbCB3b3JrLgotICBleGVjICRTSEVMTCAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQotZmkKLQotIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW0uCi1wcm9nbmFtZT1gJGVjaG8gIiQwIiB8IHNlZCAncyVeLiovJSUnYAotbW9kZW5hbWU9IiRwcm9nbmFtZSIKLQotIyBDb25zdGFudHMuCi1QUk9HUkFNPWx0bWFpbi5zaAotUEFDS0FHRT1saWJ0b29sCi1WRVJTSU9OPTEuMmYKLVRJTUVTVEFNUD0iICgxLjMzIDE5OTkvMDQvMjYgMTY6Mjg6NTMpIgotCi1kZWZhdWx0X21vZGU9Ci1oZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi1tYWdpYz0iJSUlTUFHSUMgdmFyaWFibGUlJSUiCi1ta2Rpcj0ibWtkaXIiCi1tdj0ibXYgLWYiCi1ybT0icm0gLWYiCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgMXMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXGBcXCIkXFxcXF1cKS9cXFwxL2cnCi1TUDJOTD0ndHIgXDA0MCBcMDEyJwotTkwyU1A9J3RyIFwwMTIgXDA0MCcKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KLSMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCi0jIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIFdlIHNhdmUgdGhlIG9sZCB2YWx1ZXMgdG8gcmVzdG9yZSBkdXJpbmcgZXhlY3V0ZSBtb2RlLgotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgc2F2ZV9MQ19BTEw9IiRMQ19BTEwiOyBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTAotZmkKLWlmIHRlc3QgIiR7TEFORytzZXR9IiA9IHNldDsgdGhlbgotICBzYXZlX0xBTkc9IiRMQU5HIjsgTEFORz1DOyBleHBvcnQgTEFORwotZmkKLQotaWYgdGVzdCAiJExUQ09ORklHX1ZFUlNJT04iICE9ICIkVkVSU0lPTiI7IHRoZW4KLSAgZWNobyAiJG1vZGVuYW1lOiBsdGNvbmZpZyB2ZXJzaW9uIFxgJExUQ09ORklHX1ZFUlNJT04nIGRvZXMgbm90IG1hdGNoICRQUk9HUkFNIHZlcnNpb24gXGAkVkVSU0lPTiciIDE+JjIKLSAgZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgZXhpdCAxCi1maQotCi1pZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KLSAgZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBidWlsZCBhbnkga2luZCBvZiBsaWJyYXJ5IiAxPiYyCi0gIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBHbG9iYWwgdmFyaWFibGVzLgotbW9kZT0kZGVmYXVsdF9tb2RlCi1ub25vcHQ9Ci1wcmV2PQotcHJldm9wdD0KLXJ1bj0KLXNob3c9IiRlY2hvIgotc2hvd19oZWxwPQotZXhlY3V0ZV9kbGZpbGVzPQotbG8ybz0icy9cXC5sb1wkLy4ke29iamV4dH0vIgotCi0jIFBhcnNlIG91ciBjb21tYW5kIGxpbmUgb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5Lgotd2hpbGUgdGVzdCAkIyAtZ3QgMAotZG8KLSAgYXJnPSIkMSIKLSAgc2hpZnQKLQotICBjYXNlICIkYXJnIiBpbgotICAtKj0qKSBvcHRhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIG9wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICBjYXNlICIkcHJldiIgaW4KLSAgICBleGVjdXRlX2RsZmlsZXMpCi0gICAgICBldmFsICIkcHJldj1cIlwkJHByZXYgXCRhcmdcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgIiRwcmV2PVwkYXJnIgotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBwcmV2PQotICAgIHByZXZvcHQ9Ci0gICAgY29udGludWUKLSAgZmkKLQotICAjIEhhdmUgd2Ugc2VlbiBhIG5vbi1vcHRpb25hbCBhcmd1bWVudCB5ZXQ/Ci0gIGNhc2UgIiRhcmciIGluCi0gIC0taGVscCkKLSAgICBzaG93X2hlbHA9eWVzCi0gICAgOzsKLQotICAtLXZlcnNpb24pCi0gICAgZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04kVElNRVNUQU1QIgotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgLS1jb25maWcpCi0gICAgc2VkIC1lICcxLC9eIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHL2QnIC1lICcvXiMjIyBFTkQgTElCVE9PTCBDT05GSUcvLCRkJyAkMAotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgLS1kZWJ1ZykKLSAgICBlY2hvICIkcHJvZ25hbWU6IGVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCi0gICAgc2V0IC14Ci0gICAgOzsKLQotICAtLWRyeS1ydW4gfCAtbikKLSAgICBydW49OgotICAgIDs7Ci0KLSAgLS1mZWF0dXJlcykKLSAgICBlY2hvICJob3N0OiAkaG9zdCIKLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgZWNobyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgZWNobyAiZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGZpCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgotICAgIGZpCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAtLWZpbmlzaCkgbW9kZT0iZmluaXNoIiA7OwotCi0gIC0tbW9kZSkgcHJldm9wdD0iLS1tb2RlIiBwcmV2PW1vZGUgOzsKLSAgLS1tb2RlPSopIG1vZGU9IiRvcHRhcmciIDs7Ci0KLSAgLS1xdWlldCB8IC0tc2lsZW50KQotICAgIHNob3c9OgotICAgIDs7Ci0KLSAgLWRsb3BlbikKLSAgICBwcmV2b3B0PSItZGxvcGVuIgotICAgIHByZXY9ZXhlY3V0ZV9kbGZpbGVzCi0gICAgOzsKLQotICAtKikKLSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJGFyZyciIDE+JjIKLSAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgbm9ub3B0PSIkYXJnIgotICAgIGJyZWFrCi0gICAgOzsKLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkcHJldm9wdCI7IHRoZW4KLSAgJGVjaG8gIiRtb2RlbmFtZTogb3B0aW9uIFxgJHByZXZvcHQnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICRlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLWZpCi0KLWlmIHRlc3QgLXogIiRzaG93X2hlbHAiOyB0aGVuCi0KLSAgIyBJbmZlciB0aGUgb3BlcmF0aW9uIG1vZGUuCi0gIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgotICAgIGNhc2UgIiRub25vcHQiIGluCi0gICAgKmNjIHwgKisrIHwgZ2NjKiB8ICotZ2NjKikKLSAgICAgIG1vZGU9bGluawotICAgICAgZm9yIGFyZwotICAgICAgZG8KLQljYXNlICIkYXJnIiBpbgotCS1jKQotCSAgIG1vZGU9Y29tcGlsZQotCSAgIGJyZWFrCi0JICAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgICpkYiB8ICpkYnggfCAqc3RyYWNlIHwgKnRydXNzKQotICAgICAgbW9kZT1leGVjdXRlCi0gICAgICA7OwotICAgICppbnN0YWxsKnxjcHxtdikKLSAgICAgIG1vZGU9aW5zdGFsbAotICAgICAgOzsKLSAgICAqcm0pCi0gICAgICBtb2RlPXVuaW5zdGFsbAotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBJZiB3ZSBoYXZlIG5vIG1vZGUsIGJ1dCBkbGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIGRvIGV4ZWN1dGUgbW9kZS4KLSAgICAgIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIG1vZGU9ZXhlY3V0ZQotCi0gICAgICAjIEp1c3QgdXNlIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtb2RlLgotICAgICAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJG5vbm9wdCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSBmcm9tIFxgJG5vbm9wdCciIDE+JjIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgd2l0aG91dCBNT0RFLUFSR1MiIDE+JjIKLQlmaQotICAgICAgZmkKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotCi0gICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCi0gIGlmIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIHRlc3QgIiRtb2RlIiAhPSBleGVjdXRlOyB0aGVuCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0KLSAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgotICBnZW5lcmljX2hlbHA9IiRoZWxwIgotICBoZWxwPSJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0gICMgVGhlc2UgbW9kZXMgYXJlIGluIG9yZGVyIG9mIGV4ZWN1dGlvbiBmcmVxdWVuY3kgc28gdGhhdCB0aGV5IHJ1biBxdWlja2x5LgotICBjYXNlICIkbW9kZSIgaW4KLSAgIyBsaWJ0b29sIGNvbXBpbGUgbW9kZQotICBjb21waWxlKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGNvbXBpbGUiCi0gICAgIyBHZXQgdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQgYW5kIHRoZSBzb3VyY2UgZmlsZS4KLSAgICBiYXNlX2NvbXBpbGU9Ci0gICAgbGFzdGFyZz0KLSAgICBzcmNmaWxlPSIkbm9ub3B0IgotICAgIHN1cHByZXNzX291dHB1dD0KLQotICAgIHVzZXJfdGFyZ2V0PW5vCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICAjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLW8pCi0JaWYgdGVzdCAiJHVzZXJfdGFyZ2V0IiAhPSAibm8iOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgY2Fubm90IHNwZWNpZnkgXGAtbycgbW9yZSB0aGFuIG9uY2UiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0JdXNlcl90YXJnZXQ9bmV4dAotCTs7Ci0KLSAgICAgIC1zdGF0aWMpCi0JYnVpbGRfb2xkX2xpYnM9eWVzCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBjYXNlICIkdXNlcl90YXJnZXQiIGluCi0gICAgICBuZXh0KQotCSMgVGhlIG5leHQgb25lIGlzIHRoZSAtbyB0YXJnZXQgbmFtZQotCXVzZXJfdGFyZ2V0PXllcwotCWNvbnRpbnVlCi0JOzsKLSAgICAgIHllcykKLQkjIFdlIGdvdCB0aGUgb3V0cHV0IGZpbGUKLQl1c2VyX3RhcmdldD1zZXQKLQlsaWJvYmo9IiRhcmciCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCi0gICAgICBsYXN0YXJnPSIkc3JjZmlsZSIKLSAgICAgIHNyY2ZpbGU9IiRhcmciCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgcHJldmlvdXMgYXJndW1lbnQuCi0KLSAgICAgICMgQmFja3NsYXNoaWZ5IGFueSBiYWNrc2xhc2hlcywgZG91YmxlIHF1b3RlcywgYW5kIGRvbGxhciBzaWducy4KLSAgICAgICMgVGhlc2UgYXJlIHRoZSBvbmx5IGNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgc3BlY2lhbGx5Ci0gICAgICAjIGludGVycHJldGVkIGluc2lkZSBvZiBkb3VibGUtcXVvdGVkIHNjcmluZ3MuCi0gICAgICBsYXN0YXJnPWAkZWNobyAiWCRsYXN0YXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQotICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkgaW4gc2NhbgotICAgICAgIyBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCi0gICAgICBjYXNlICIkbGFzdGFyZyIgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWxhc3Rhcmc9IlwiJGxhc3RhcmdcIiIKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFkZCB0aGUgcHJldmlvdXMgYXJndW1lbnQgdG8gYmFzZV9jb21waWxlLgotICAgICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLQliYXNlX2NvbXBpbGU9IiRsYXN0YXJnIgotICAgICAgZWxzZQotCWJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgY2FzZSAiJHVzZXJfdGFyZ2V0IiBpbgotICAgIHNldCkKLSAgICAgIDs7Ci0gICAgbm8pCi0gICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCi0gICAgICBsaWJvYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2l0aCBcYC1vJyIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCi0gICAgIyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgLW8gZmlsZS5vLCBpdCBpcyByZXBsYWNlZCB3aXRoIGZpbGUubG8KLSAgICB4Zm9ybT0nW2NDRlNmbXNvXScKLSAgICBjYXNlICIkbGlib2JqIiBpbgotICAgICouYWRhKSB4Zm9ybT1hZGEgOzsKLSAgICAqLmFkYikgeGZvcm09YWRiIDs7Ci0gICAgKi5hZHMpIHhmb3JtPWFkcyA7OwotICAgICouYXNtKSB4Zm9ybT1hc20gOzsKLSAgICAqLmMrKykgeGZvcm09YysrIDs7Ci0gICAgKi5jYykgeGZvcm09Y2MgOzsKLSAgICAqLmNwcCkgeGZvcm09Y3BwIDs7Ci0gICAgKi5jeHgpIHhmb3JtPWN4eCA7OwotICAgICouZjkwKSB4Zm9ybT1mOTAgOzsKLSAgICAqLmZvcikgeGZvcm09Zm9yIDs7Ci0gICAgZXNhYwotCi0gICAgbGlib2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgInMvXC4keGZvcm0kLy5sby8iYAotCi0gICAgY2FzZSAiJGxpYm9iaiIgaW4KLSAgICAqLmxvKSBvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAiJGxvMm8iYCA7OwotICAgICopCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxpYm9iaiIKLSAgICBlbHNlCi0gICAgICByZW1vdmVsaXN0PSIkbGlib2JqIgotICAgIGZpCi0KLSAgICAkcnVuICRybSAkcmVtb3ZlbGlzdAotICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0IDEiIDEgMiAxNQotCi0gICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKLSAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKLSAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCi0gICAgICBvdXRwdXRfb2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MlXC4uKiQlJSdgLiR7b2JqZXh0fQotICAgICAgbG9ja2ZpbGU9IiRvdXRwdXRfb2JqLmxvY2siCi0gICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkb3V0cHV0X29iaiAkbG9ja2ZpbGUiCi0gICAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAxIiAxIDIgMTUKLSAgICBlbHNlCi0gICAgICBuZWVkX2xvY2tzPW5vCi0gICAgICBsb2NrZmlsZT0KLSAgICBmaQotCi0gICAgIyBMb2NrIHRoaXMgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCBpcyBuZWVkZWQKLSAgICAjIFdlIHVzZSB0aGlzIHNjcmlwdCBmaWxlIHRvIG1ha2UgdGhlIGxpbmssIGl0IGF2b2lkcyBjcmVhdGluZyBhIG5ldyBmaWxlCi0gICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0geWVzOyB0aGVuCi0gICAgICB1bnRpbCBsbiAiJDAiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbwotCSRzaG93ICJXYWl0aW5nIGZvciAkbG9ja2ZpbGUgdG8gYmUgcmVtb3ZlZCIKLQlzbGVlcCAyCi0gICAgICBkb25lCi0gICAgZWxpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuOyB0aGVuCi0gICAgICBpZiB0ZXN0IC1mICIkbG9ja2ZpbGUiOyB0aGVuCi0JZWNobyAiXAotKioqIEVSUk9SLCAkbG9ja2ZpbGUgZXhpc3RzIGFuZCBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0gICAgICBlY2hvICRzcmNmaWxlID4gIiRsb2NrZmlsZSIKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJGZpeF9zcmNmaWxlX3BhdGgiOyB0aGVuCi0gICAgICBldmFsIHNyY2ZpbGU9XCIkZml4X3NyY2ZpbGVfcGF0aFwiCi0gICAgZmkKLQotICAgICMgT25seSBidWlsZCBhIFBJQyBvYmplY3QgaWYgd2UgYXJlIGJ1aWxkaW5nIGxpYnRvb2wgbGlicmFyaWVzLgotICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAjIFdpdGhvdXQgdGhpcyBhc3NpZ25tZW50LCBiYXNlX2NvbXBpbGUgZ2V0cyBlbXB0aWVkLgotICAgICAgZmJzZF9oaWRlb3VzX3NoX2J1Zz0kYmFzZV9jb21waWxlCi0KLSAgICAgICMgQWxsIHBsYXRmb3JtcyB1c2UgLURQSUMsIHRvIG5vdGlmeSBwcmVwcm9jZXNzZWQgYXNzZW1ibGVyIGNvZGUuCi0gICAgICBjb21tYW5kPSIkYmFzZV9jb21waWxlICRwaWNfZmxhZyAtRFBJQyAkc3JjZmlsZSIKLSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQlsb19saWJvYmo9IiRsaWJvYmoiCi0JZGlyPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQlpZiB0ZXN0ICJYJGRpciIgPSAiWCRsaWJvYmoiOyB0aGVuCi0JICBkaXI9IiRvYmpkaXIiCi0JZWxzZQotCSAgZGlyPSIkZGlyLyRvYmpkaXIiCi0JZmkKLQlsaWJvYmo9IiRkaXIvImAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotCWlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCi0JICAkc2hvdyAiJHJtICRsaWJvYmoiCi0JICAkcnVuICRybSAkbGlib2JqCi0JZWxzZQotCSAgJHNob3cgIiRta2RpciAkZGlyIgotCSAgJHJ1biAkbWtkaXIgJGRpcgotCSAgc3RhdHVzPSQ/Ci0JICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRkaXI7IHRoZW4KLQkgICAgZXhpdCAkc3RhdHVzCi0JICBmaQotCWZpCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX29fbG8iID0geWVzOyB0aGVuCi0Jb3V0cHV0X29iaj0iJGxpYm9iaiIKLQljb21tYW5kPSIkY29tbWFuZCAtbyAkb3V0cHV0X29iaiIKLSAgICAgIGVsaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KLQlvdXRwdXRfb2JqPSIkb2JqIgotCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvdXRwdXRfb2JqIgotICAgICAgZmkKLQotICAgICAgJHNob3cgIiRjb21tYW5kIgotICAgICAgaWYgJHJ1biBldmFsICIkY29tbWFuZCI7IHRoZW4gOgotICAgICAgZWxzZQotCXRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiAkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgotCSB0ZXN0IHgiYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSB4IiRzcmNmaWxlIjsgdGhlbgotCWVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLWJ1dCBpdCBzaG91bGQgY29udGFpbjoKLSRzcmNmaWxlCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQsIHRoZW4gZ28gb24gdG8gY29tcGlsZSB0aGUgbmV4dCBvbmUKLSAgICAgIGlmIHRlc3QgeCIkb3V0cHV0X29iaiIgIT0geCIkbGlib2JqIjsgdGhlbgotCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJGxpYm9iaiIKLQlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkbGlib2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgSWYgd2UgaGF2ZSBubyBwaWNfZmxhZywgdGhlbiBjb3B5IHRoZSBvYmplY3QgaW50byBwbGFjZSBhbmQgZmluaXNoLgotICAgICAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JIyBSZW5hbWUgdGhlIC5sbyBmcm9tIHdpdGhpbiBvYmpkaXIgdG8gb2JqCi0JaWYgdGVzdCAtZiAkb2JqOyB0aGVuCi0JICAkc2hvdyAkcm0gJG9iagotCSAgJHJ1biAkcm0gJG9iagotCWZpCi0KLQkkc2hvdyAiJG12ICRsaWJvYmogJG9iaiIKLQlpZiAkcnVuICRtdiAkbGlib2JqICRvYmo7IHRoZW4gOgotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotCi0JIyBOb3cgYXJyYW5nZSB0aGF0IG9iaiBhbmQgbG9fbGlib2JqIGJlY29tZSB0aGUgc2FtZSBmaWxlCi0JJHNob3cgIiRMTl9TICRvYmogJGxvX2xpYm9iaiIKLQlpZiAkcnVuICRMTl9TICRvYmogJGxvX2xpYm9iajsgdGhlbgotCSAgZXhpdCAwCi0JZWxzZQotCSAgZXJyb3I9JD8KLQkgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JICBleGl0ICRlcnJvcgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIEFsbG93IGVycm9yIG1lc3NhZ2VzIG9ubHkgZnJvbSB0aGUgZmlyc3QgY29tcGlsYXRpb24uCi0gICAgICBzdXBwcmVzc19vdXRwdXQ9JyA+L2Rldi9udWxsIDI+JjEnCi0gICAgZmkKLQotICAgICMgT25seSBidWlsZCBhIHBvc2l0aW9uLWRlcGVuZGVudCBvYmplY3QgaWYgd2UgYnVpbGQgb2xkIGxpYnJhcmllcy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICBjb21tYW5kPSIkYmFzZV9jb21waWxlICRzcmNmaWxlIgotICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KLQljb21tYW5kPSIkY29tbWFuZCAtbyAkb2JqIgotCW91dHB1dF9vYmo9IiRvYmoiCi0gICAgICBmaQotCi0gICAgICAjIFN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBpZiB3ZSBhbHJlYWR5IGRpZCBhIFBJQyBjb21waWxhdGlvbi4KLSAgICAgIGNvbW1hbmQ9IiRjb21tYW5kJHN1cHByZXNzX291dHB1dCIKLSAgICAgICRzaG93ICIkY29tbWFuZCIKLSAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKLSAgICAgIGVsc2UKLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgotCSB0ZXN0IHgiYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSB4IiRzcmNmaWxlIjsgdGhlbgotCWVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgotYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCi0KLWJ1dCBpdCBzaG91bGQgY29udGFpbjoKLSRzcmNmaWxlCi0KLVRoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKLXRlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKLXlvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKLXJlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKLWF2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCi1jb21waWxlci4iCi0KLQkkcnVuICRybSAkcmVtb3ZlbGlzdAotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQKLSAgICAgIGlmIHRlc3QgeCIkb3V0cHV0X29iaiIgIT0geCIkb2JqIjsgdGhlbgotCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJG9iaiIKLQlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkb2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvIG5vdAotICAgICAgIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotCSRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCi0JJHJ1biBldmFsICJlY2hvIHRpbWVzdGFtcCA+IFwkbGlib2JqIiB8fCBleGl0ICQ/Ci0gICAgICBlbHNlCi0JIyBNb3ZlIHRoZSAubG8gZnJvbSB3aXRoaW4gb2JqZGlyCi0JJHNob3cgIiRtdiAkbGlib2JqICRsb19saWJvYmoiCi0JaWYgJHJ1biAkbXYgJGxpYm9iaiAkbG9fbGlib2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLSAgICAgIGZpCi0gICAgZmkKLQotICAgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKLSAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KLSAgICAgICRybSAiJGxvY2tmaWxlIgotICAgIGZpCi0KLSAgICBleGl0IDAKLSAgICA7OwotCi0gICMgbGlidG9vbCBsaW5rIG1vZGUKLSAgbGluaykKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBsaW5rIgotICAgIENfY29tcGlsZXI9IiRDQyIgIyBzYXZlIGl0LCB0byBjb21waWxlIGdlbmVyYXRlZCBDIHNvdXJjZXMKLSAgICAjIENZR05VUyBMT0NBTDogdHJvbWV5L2phdmEKLSAgICAjIEFsd2F5cyByZXNwZWN0IHRoZSBDQyBjb25maWd1cmVkIGluIGJ5IGx0Y29uZmlnLgotICAgICMgQ0M9IiRub25vcHQiCi0gICAgIyBFTkQgQ1lHTlVTIExPQ0FMCi0gICAgY2FzZSAiJGhvc3QiIGluCi0gICAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLW9zMiopCi0gICAgICAjIEl0IGlzIGltcG9zc2libGUgdG8gbGluayBhIGRsbCB3aXRob3V0IHRoaXMgc2V0dGluZywgYW5kCi0gICAgICAjIHdlIHNob3VsZG4ndCBmb3JjZSB0aGUgbWFrZWZpbGUgbWFpbnRhaW5lciB0byBmaWd1cmUgb3V0Ci0gICAgICAjIHdoaWNoIHN5c3RlbSB3ZSBhcmUgY29tcGlsaW5nIGZvciBpbiBvcmRlciB0byBwYXNzIGFuIGV4dHJhCi0gICAgICAjIGZsYWcgZm9yIGV2ZXJ5IGxpYnRvb2wgaW52b2thdGlvbi4KLSAgICAgICMgYWxsb3dfdW5kZWZpbmVkPW5vCi0KLSAgICAgICMgRklYTUU6IFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSBhYm92ZSB3aGVuIHRyeWluZwotICAgICAgIyB0byBtYWtlIGEgZGxsIHdoaWNoIGhhcyB1bmRlZmluZWQgc3ltYm9scywgaW4gd2hpY2ggY2FzZSBub3QKLSAgICAgICMgZXZlbiBhIHN0YXRpYyBsaWJyYXJ5IGlzIGJ1aWx0LiAgRm9yIG5vdywgd2UgbmVlZCB0byBzcGVjaWZ5Ci0gICAgICAjIC1uby11bmRlZmluZWQgb24gdGhlIGxpYnRvb2wgbGluayBsaW5lIHdoZW4gd2UgY2FuIGJlIGNlcnRhaW4KLSAgICAgICMgdGhhdCBhbGwgc3ltYm9scyBhcmUgc2F0aXNmaWVkLCBvdGhlcndpc2Ugd2UgZ2V0IGEgc3RhdGljIGxpYnJhcnkuCi0gICAgICBhbGxvd191bmRlZmluZWQ9eWVzCi0KLSAgICAgICMgVGhpcyBpcyBhIHNvdXJjZSBwcm9ncmFtIHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgZGxscyBvbiBXaW5kb3dzCi0gICAgICAjIERvbid0IHJlbW92ZSBub3IgbW9kaWZ5IHRoZSBzdGFydGluZyBhbmQgY2xvc2luZyBjb21tZW50cwotIyAvKiBsdGRsbC5jIHN0YXJ0cyBoZXJlICovCi0jICNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyAjaW5jbHVkZSA8d2luZG93cy5oPgotIyAjdW5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyAjaW5jbHVkZSA8c3RkaW8uaD4KLSMKLSMgQk9PTCBBUElFTlRSWSBEbGxNYWluIChISU5TVEFOQ0UgaEluc3QsIERXT1JEIHJlYXNvbiwgTFBWT0lEIHJlc2VydmVkKTsKLSMKLSMgI2luY2x1ZGUgPGN5Z3dpbi9jeWd3aW5fZGxsLmg+Ci0jIERFQ0xBUkVfQ1lHV0lOX0RMTCggRGxsTWFpbiApOwotIyBISU5TVEFOQ0UgX19oRGxsSW5zdGFuY2VfYmFzZTsKLSMKLSMgQk9PTCBBUElFTlRSWQotIyBEbGxNYWluIChISU5TVEFOQ0UgaEluc3QsIERXT1JEIHJlYXNvbiwgTFBWT0lEIHJlc2VydmVkKQotIyB7Ci0jICAgX19oRGxsSW5zdGFuY2VfYmFzZSA9IGhJbnN0OwotIyAgIHJldHVybiBUUlVFOwotIyB9Ci0jIC8qIGx0ZGxsLmMgZW5kcyBoZXJlICovCi0gICAgICAjIFRoaXMgaXMgYSBzb3VyY2UgcHJvZ3JhbSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIGltcG9ydCBsaWJyYXJpZXMKLSAgICAgICMgb24gV2luZG93cyBmb3IgZGxscyB3aGljaCBsYWNrIHRoZW0uIERvbid0IHJlbW92ZSBub3IgbW9kaWZ5IHRoZQotICAgICAgIyBzdGFydGluZyBhbmQgY2xvc2luZyBjb21tZW50cwotIyAvKiBpbXBnZW4uYyBzdGFydHMgaGVyZSAqLwotIyAvKiAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgCi0jICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgbGlidG9vbC4KLSMgCi0jICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIyAgKi8KLSMgCi0jICAjaW5jbHVkZSA8c3RkaW8uaD4JCS8qIGZvciBwcmludGYoKSAqLwotIyAgI2luY2x1ZGUgPHVuaXN0ZC5oPgkJLyogZm9yIG9wZW4oKSwgbHNlZWsoKSwgcmVhZCgpICovCi0jICAjaW5jbHVkZSA8ZmNudGwuaD4JCS8qIGZvciBPX1JET05MWSwgT19CSU5BUlkgKi8KLSMgICNpbmNsdWRlIDxzdHJpbmcuaD4JCS8qIGZvciBzdHJkdXAoKSAqLwotIyAKLSMgIHN0YXRpYyB1bnNpZ25lZCBpbnQKLSMgIHBlX2dldDE2IChmZCwgb2Zmc2V0KQotIyAgICAgICBpbnQgZmQ7Ci0jICAgICAgIGludCBvZmZzZXQ7Ci0jICB7Ci0jICAgIHVuc2lnbmVkIGNoYXIgYlsyXTsKLSMgICAgbHNlZWsgKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKLSMgICAgcmVhZCAoZmQsIGIsIDIpOwotIyAgICByZXR1cm4gYlswXSArIChiWzFdPDw4KTsKLSMgIH0KLSMgCi0jICBzdGF0aWMgdW5zaWduZWQgaW50Ci0jICBwZV9nZXQzMiAoZmQsIG9mZnNldCkKLSMgICAgICBpbnQgZmQ7Ci0jICAgICAgaW50IG9mZnNldDsKLSMgIHsKLSMgICAgdW5zaWduZWQgY2hhciBiWzRdOwotIyAgICBsc2VlayAoZmQsIG9mZnNldCwgU0VFS19TRVQpOwotIyAgICByZWFkIChmZCwgYiwgNCk7Ci0jICAgIHJldHVybiBiWzBdICsgKGJbMV08PDgpICsgKGJbMl08PDE2KSArIChiWzNdPDwyNCk7Ci0jICB9Ci0jIAotIyAgc3RhdGljIHVuc2lnbmVkIGludAotIyAgcGVfYXMzMiAocHRyKQotIyAgICAgICB2b2lkICpwdHI7Ci0jICB7Ci0jICAgIHVuc2lnbmVkIGNoYXIgKmIgPSBwdHI7Ci0jICAgIHJldHVybiBiWzBdICsgKGJbMV08PDgpICsgKGJbMl08PDE2KSArIChiWzNdPDwyNCk7Ci0jICB9Ci0jIAotIyAgaW50Ci0jICBtYWluIChhcmdjLCBhcmd2KQotIyAgICAgIGludCBhcmdjOwotIyAgICAgIGNoYXIgKmFyZ3ZbXTsKLSMgIHsKLSMgICAgICBpbnQgZGxsOwotIyAgICAgIHVuc2lnbmVkIGxvbmcgcGVfaGVhZGVyX29mZnNldCwgb3B0aGRyX29mcywgbnVtX2VudHJpZXMsIGk7Ci0jICAgICAgdW5zaWduZWQgbG9uZyBleHBvcnRfcnZhLCBleHBvcnRfc2l6ZSwgbnNlY3Rpb25zLCBzZWNwdHIsIGV4cHB0cjsKLSMgICAgICB1bnNpZ25lZCBsb25nIG5hbWVfcnZhcywgbmV4cDsKLSMgICAgICB1bnNpZ25lZCBjaGFyICpleHBkYXRhLCAqZXJ2YTsKLSMgICAgICBjaGFyICpmaWxlbmFtZSwgKmRsbF9uYW1lOwotIyAKLSMgICAgICBmaWxlbmFtZSA9IGFyZ3ZbMV07Ci0jIAotIyAgICAgIGRsbCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZfE9fQklOQVJZKTsKLSMgICAgICBpZiAoIWRsbCkKLSMgIAlyZXR1cm4gMTsKLSMgCi0jICAgICAgZGxsX25hbWUgPSBmaWxlbmFtZTsKLSMgICAgCi0jICAgICAgZm9yIChpPTA7IGZpbGVuYW1lW2ldOyBpKyspCi0jICAJaWYgKGZpbGVuYW1lW2ldID09ICcvJyB8fCBmaWxlbmFtZVtpXSA9PSAnXFwnICB8fCBmaWxlbmFtZVtpXSA9PSAnOicpCi0jICAJICAgIGRsbF9uYW1lID0gZmlsZW5hbWUgKyBpICsxOwotIyAKLSMgICAgICBwZV9oZWFkZXJfb2Zmc2V0ID0gcGVfZ2V0MzIgKGRsbCwgMHgzYyk7Ci0jICAgICAgb3B0aGRyX29mcyA9IHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMjA7Ci0jICAgICAgbnVtX2VudHJpZXMgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgOTIpOwotIyAKLSMgICAgICBpZiAobnVtX2VudHJpZXMgPCAxKSAvKiBubyBleHBvcnRzICovCi0jICAJcmV0dXJuIDE7Ci0jIAotIyAgICAgIGV4cG9ydF9ydmEgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgOTYpOwotIyAgICAgIGV4cG9ydF9zaXplID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDEwMCk7Ci0jICAgICAgbnNlY3Rpb25zID0gcGVfZ2V0MTYgKGRsbCwgcGVfaGVhZGVyX29mZnNldCArIDQgKzIpOwotIyAgICAgIHNlY3B0ciA9IChwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwICsKLSMgIAkgICAgICBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDE2KSk7Ci0jIAotIyAgICAgIGV4cHB0ciA9IDA7Ci0jICAgICAgZm9yIChpID0gMDsgaSA8IG5zZWN0aW9uczsgaSsrKQotIyAgICAgIHsKLSMgIAljaGFyIHNuYW1lWzhdOwotIyAgCXVuc2lnbmVkIGxvbmcgc2VjcHRyMSA9IHNlY3B0ciArIDQwICogaTsKLSMgIAl1bnNpZ25lZCBsb25nIHZhZGRyID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDEyKTsKLSMgIAl1bnNpZ25lZCBsb25nIHZzaXplID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDE2KTsKLSMgIAl1bnNpZ25lZCBsb25nIGZwdHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMjApOwotIyAgCWxzZWVrKGRsbCwgc2VjcHRyMSwgU0VFS19TRVQpOwotIyAgCXJlYWQoZGxsLCBzbmFtZSwgOCk7Ci0jICAJaWYgKHZhZGRyIDw9IGV4cG9ydF9ydmEgJiYgdmFkZHIrdnNpemUgPiBleHBvcnRfcnZhKQotIyAgCXsKLSMgIAkgICAgZXhwcHRyID0gZnB0ciArIChleHBvcnRfcnZhIC0gdmFkZHIpOwotIyAgCSAgICBpZiAoZXhwb3J0X3J2YSArIGV4cG9ydF9zaXplID4gdmFkZHIgKyB2c2l6ZSkKLSMgIAkJZXhwb3J0X3NpemUgPSB2c2l6ZSAtIChleHBvcnRfcnZhIC0gdmFkZHIpOwotIyAgCSAgICBicmVhazsKLSMgIAl9Ci0jICAgICAgfQotIyAKLSMgICAgICBleHBkYXRhID0gKHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhleHBvcnRfc2l6ZSk7Ci0jICAgICAgbHNlZWsgKGRsbCwgZXhwcHRyLCBTRUVLX1NFVCk7Ci0jICAgICAgcmVhZCAoZGxsLCBleHBkYXRhLCBleHBvcnRfc2l6ZSk7Ci0jICAgICAgZXJ2YSA9IGV4cGRhdGEgLSBleHBvcnRfcnZhOwotIyAKLSMgICAgICBuZXhwID0gcGVfYXMzMiAoZXhwZGF0YSsyNCk7Ci0jICAgICAgbmFtZV9ydmFzID0gcGVfYXMzMiAoZXhwZGF0YSszMik7Ci0jIAotIyAgICAgIHByaW50ZiAoIkVYUE9SVFNcbiIpOwotIyAgICAgIGZvciAoaSA9IDA7IGk8bmV4cDsgaSsrKQotIyAgICAgIHsKLSMgIAl1bnNpZ25lZCBsb25nIG5hbWVfcnZhID0gcGVfYXMzMiAoZXJ2YStuYW1lX3J2YXMraSo0KTsKLSMgIAlwcmludGYgKCJcdCVzIEAgJWxkIDtcbiIsIGVydmErbmFtZV9ydmEsIDErIGkpOwotIyAgICAgIH0KLSMgCi0jICAgICAgcmV0dXJuIDA7Ci0jICB9Ci0jIC8qIGltcGdlbi5jIGVuZHMgaGVyZSAqLwotICAgICAgOzsKLSAgICAqKQotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgY29tcGlsZV9jb21tYW5kPSIkQ0MiCi0gICAgZmluYWxpemVfY29tbWFuZD0iJENDIgotCi0gICAgY29tcGlsZV9ycGF0aD0KLSAgICBmaW5hbGl6ZV9ycGF0aD0KLSAgICBjb21waWxlX3NobGlicGF0aD0KLSAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9Ci0gICAgY29udmVuaWVuY2U9Ci0gICAgb2xkX2NvbnZlbmllbmNlPQotICAgIGRlcGxpYnM9Ci0gICAgbGlua29wdHM9Ci0KLSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgICMgZ2V0IHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJHNobGlicGF0aF92YXIKLSAgICAgIGV2YWwgbGliX3NlYXJjaF9wYXRoPVxgXCRlY2hvIFwiWCBcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFhzZWQgLWUgXCdzLzovIC9nXCdcYAotICAgIGVsc2UKLSAgICAgIGxpYl9zZWFyY2hfcGF0aD0KLSAgICBmaQotICAgICMgbm93IHByZXBlbmQgdGhlIHN5c3RlbS1zcGVjaWZpYyBvbmVzCi0gICAgZXZhbCBsaWJfc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXCRsaWJfc2VhcmNoX3BhdGhcIgotICAgIGV2YWwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoPVwiJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXCIKLSAgICAKLSAgICBhdm9pZF92ZXJzaW9uPW5vCi0gICAgZGxmaWxlcz0KLSAgICBkbHByZWZpbGVzPQotICAgIGRsc2VsZj1ubwotICAgIGV4cG9ydF9keW5hbWljPW5vCi0gICAgZXhwb3J0X3N5bWJvbHM9Ci0gICAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9Ci0gICAgZ2VuZXJhdGVkPQotICAgIGxpYm9ianM9Ci0gICAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0KLSAgICBsdGxpYnM9Ci0gICAgbW9kdWxlPW5vCi0gICAgb2Jqcz0KLSAgICBwcmVsb2FkPW5vCi0gICAgcHJldj0KLSAgICBwcmV2YXJnPQotICAgIHJlbGVhc2U9Ci0gICAgcnBhdGg9Ci0gICAgeHJwYXRoPQotICAgIHBlcm1fcnBhdGg9Ci0gICAgdGVtcF9ycGF0aD0KLSAgICB0aHJlYWRfc2FmZT1ubwotICAgIHZpbmZvPQotCi0gICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYykKLQlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1hbGwtc3RhdGljIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY29tcGxldGUgc3RhdGljIGxpbmtpbmcgaXMgaW1wb3NzaWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iIDE+JjIKLQlmaQotCWJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWJ1aWxkX29sZF9saWJzPXllcwotCWJyZWFrCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIFNlZSBpZiBvdXIgc2hhcmVkIGFyY2hpdmVzIGRlcGVuZCBvbiBzdGF0aWMgYXJjaGl2ZXMuCi0gICAgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIGJ1aWxkX29sZF9saWJzPXllcwotCi0gICAgIyBHbyB0aHJvdWdoIHRoZSBhcmd1bWVudHMsIHRyYW5zZm9ybWluZyB0aGVtIG9uIHRoZSB3YXkuCi0gICAgd2hpbGUgdGVzdCAkIyAtZ3QgMDsgZG8KLSAgICAgIGFyZz0iJDEiCi0gICAgICBzaGlmdAotCi0gICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotCWNhc2UgIiRwcmV2IiBpbgotCW91dHB1dCkKLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAT1VUUFVUQCIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBPVVRQVVRAIgotCSAgOzsKLQllc2FjCi0KLQljYXNlICIkcHJldiIgaW4KLQlkbGZpbGVzfGRscHJlZmlsZXMpCi0JICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSBubzsgdGhlbgotCSAgICAjIEFkZCB0aGUgc3ltYm9sIG9iamVjdCBpbnRvIHRoZSBsaW5raW5nIGNvbW1hbmRzLgotCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQFNZTUZJTEVAIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAU1lNRklMRUAiCi0JICAgIHByZWxvYWQ9eWVzCi0JICBmaQotCSAgY2FzZSAiJGFyZyIgaW4KLQkgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCi0JICBzZWxmKQotCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAgICAgZGxzZWxmPXllcwotCSAgICBlbGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXMgJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiAhPSB5ZXM7IHRoZW4KLQkgICAgICBkbHNlbGY9eWVzCi0JICAgIGZpCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICAgIDs7Ci0JICAqKQotCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgotCSAgICB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICAgIHByZXY9Ci0JICAgIDs7Ci0JICBlc2FjCi0JICA7OwotCWV4cHN5bXMpCi0JICBleHBvcnRfc3ltYm9scz0iJGFyZyIKLQkgIGlmIHRlc3QgISAtZiAiJGFyZyI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogc3ltYm9sIGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKLQkgICAgZXhpdCAxCi0JICBmaQotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCWV4cHN5bXNfcmVnZXgpCi0JICBleHBvcnRfc3ltYm9sc19yZWdleD0iJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlyZWxlYXNlKQotCSAgcmVsZWFzZT0iLSRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcnBhdGgpCi0JICBycGF0aD0iJHJwYXRoICRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JeHJwYXRoKQotCSAgeHJwYXRoPSIkeHJwYXRoICRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JKikKLQkgIGV2YWwgIiRwcmV2PVwiXCRhcmdcIiIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQllc2FjCi0gICAgICBmaQotCi0gICAgICBwcmV2YXJnPSIkYXJnIgotCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLWFsbC1zdGF0aWMpCi0JaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLQkgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKLQlmaQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWFsbG93LXVuZGVmaW5lZCkKLQkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAtYWxsb3ctdW5kZWZpbmVkJyBpcyBkZXByZWNhdGVkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiIDE+JjIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1hdm9pZC12ZXJzaW9uKQotCWF2b2lkX3ZlcnNpb249eWVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZGxvcGVuKQotCXByZXY9ZGxmaWxlcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRscHJlb3BlbikKLQlwcmV2PWRscHJlZmlsZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1leHBvcnQtZHluYW1pYykKLQlpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiICE9IHllczsgdGhlbgotCSAgZXhwb3J0X2R5bmFtaWM9eWVzCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBldmFsIGFyZz1cIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotCSAgZWxzZQotCSAgICBhcmc9Ci0JICBmaQotCWZpCi0JOzsKLQotICAgICAgLWV4cG9ydC1zeW1ib2xzIHwgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4KQotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGhhdmUgbW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyIKLQkgIGV4aXQgMQotCWZpCi0JaWYgdGVzdCAiJGFyZyIgPSAiLWV4cG9ydC1zeW1ib2xzIjsgdGhlbgotCSAgcHJldj1leHBzeW1zCi0JZWxzZQotCSAgcHJldj1leHBzeW1zX3JlZ2V4Ci0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1MKikKLQlkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyVeLUxcKC4qXCkkJVwxJSdgCi0JY2FzZSAiJGRpciIgaW4KLQkvKiB8IFtBLVphLXpdOlsvXFxdKikKLQkgICMgQWRkIHRoZSBjb3JyZXNwb25kaW5nIGhhcmRjb2RlX2xpYmRpcl9mbGFnLCBpZiBpdCBpcyBub3QgaWRlbnRpY2FsLgotCSAgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAtTCRkaXInIGNhbm5vdCBzcGVjaWZ5IGEgcmVsYXRpdmUgZGlyZWN0b3J5IiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCWNhc2UgIiAkZGVwbGlicyAiIGluCi0JKiIgJGFyZyAiKikgOzsKLQkqKSBkZXBsaWJzPSIkZGVwbGlicyAkYXJnIjs7Ci0JZXNhYwotCWNhc2UgIiAkbGliX3NlYXJjaF9wYXRoICIgaW4KLQkqIiAkZGlyICIqKSA7OwotCSopIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIjs7Ci0JZXNhYwotCWNhc2UgIiRob3N0IiBpbgotCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1vczIqKQotCSAgZGxsc2VhcmNoZGlyPWBjZCAiJGRpciIgJiYgcHdkIHx8IGVjaG8gIiRkaXIiYAotCSAgY2FzZSAiOiRkbGxzZWFyY2hwYXRoOiIgaW4KLQkgIDo6KSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNoZGlyIjs7Ci0JICAqIjokZGxsc2VhcmNoZGlyOiIqKSA7OwotCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGRsbHNlYXJjaGRpciI7OwotCSAgZXNhYwotCSAgOzsKLQllc2FjCi0JOzsKLQotICAgICAgLWwqKQotCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCi0JOzsKLQotICAgICAgLW1vZHVsZSkKLQlpZiB0ZXN0ICIkbW9kdWxlIiAhPSB5ZXM7IHRoZW4KLQkgIG1vZHVsZT15ZXMKLQkgIGlmIHRlc3QgLW4gIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiOyB0aGVuCi0JICAgIGV2YWwgYXJnPVwiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0JICBlbHNlCi0JICAgIGFyZz0KLQkgIGZpCi0JZmkKLQk7OwotCQotICAgICAgLW5vLXVuZGVmaW5lZCkKLQlhbGxvd191bmRlZmluZWQ9bm8KLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1vKSBwcmV2PW91dHB1dCA7OwotCi0gICAgICAtcmVsZWFzZSkKLQlwcmV2PXJlbGVhc2UKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1ycGF0aCkKLQlwcmV2PXJwYXRoCi0JY29udGludWUKLQk7OwotCi0gICAgICAtUikKLQlwcmV2PXhycGF0aAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVIqKQotCXhycGF0aD0iJHhycGF0aCAiYCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JY29udGludWUKLQk7OwotCi0gICAgICAtc3RhdGljKQotCSMgSWYgd2UgaGF2ZSBubyBwaWNfZmxhZywgdGhlbiB0aGlzIGlzIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljLgotCWlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLQkgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKLQlmaQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXRocmVhZC1zYWZlKQotCXRocmVhZF9zYWZlPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXZlcnNpb24taW5mbykKLQlwcmV2PXZpbmZvCi0JY29udGludWUKLQk7OwotCi0gICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgZmxhZy4KLSAgICAgIC0qIHwgKyopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAiJGFyZyIgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLQk7OwotCi0gICAgICAqLm8gfCAqLm9iaiB8ICouYSB8ICoubGliKQotCSMgQSBzdGFuZGFyZCBvYmplY3QuCi0Jb2Jqcz0iJG9ianMgJGFyZyIKLQk7OwotCi0gICAgICAqLmxvKQotCSMgQSBsaWJyYXJ5IG9iamVjdC4KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCi0JICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgotCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3BlbiIgPSB5ZXM7IHRoZW4KLQkgICAgcHJldj0KLQkgICAgY29udGludWUKLQkgIGVsc2UKLQkgICAgIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkgICAgcHJldj1kbHByZWZpbGVzCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCi0JICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAiYCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgcHJldj0KLQlmaQotCWxpYm9ianM9IiRsaWJvYmpzICRhcmciCi0JOzsKLQotICAgICAgKi5sYSkKLQkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCi0KLQlkbG5hbWU9Ci0JbGliZGlyPQotCWxpYnJhcnlfbmFtZXM9Ci0Jb2xkX2xpYnJhcnk9Ci0KLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWlmIChzZWQgLWUgJzJxJyAkYXJnIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCSMgSWYgdGhlIGxpYnJhcnkgd2FzIGluc3RhbGxlZCB3aXRoIGFuIG9sZCByZWxlYXNlIG9mIGxpYnRvb2wsCi0JIyBpdCB3aWxsIG5vdCByZWRlZmluZSB2YXJpYWJsZSBpbnN0YWxsZWQuCi0JaW5zdGFsbGVkPXllcwotCi0JIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JY2FzZSAiJGFyZyIgaW4KLQkqLyogfCAqXFwqKSAuICRhcmcgOzsKLQkqKSAuIC4vJGFyZyA7OwotCWVzYWMKLQotCSMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KLQlsaW5rbGliPQotCWZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KLQkgIGxpbmtsaWI9IiRsIgotCWRvbmUKLQotCWlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGFyZyciIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQkjIEZpbmQgdGhlIHJlbGV2YW50IG9iamVjdCBkaXJlY3RvcnkgYW5kIGxpYnJhcnkgbmFtZS4KLQluYW1lPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJyAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAotCi0JaWYgdGVzdCAiWCRpbnN0YWxsZWQiID0gWHllczsgdGhlbgotCSAgZGlyPSIkbGliZGlyIgotCWVsc2UKLQkgIGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JICBpZiB0ZXN0ICJYJGRpciIgPSAiWCRhcmciOyB0aGVuCi0JICAgIGRpcj0iJG9iamRpciIKLQkgIGVsc2UKLQkgICAgZGlyPSIkZGlyLyRvYmpkaXIiCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0IC1uICIkZGVwZW5kZW5jeV9saWJzIjsgdGhlbgotCSAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCi0JICB0ZW1wX2RlcGxpYnM9Ci0JICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCi0JICAgIGNhc2UgIiRkZXBsaWIiIGluCi0JICAgIC1SKikgdGVtcF94cnBhdGg9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLVIvLydgCi0JCSBjYXNlICIgJHJwYXRoICR4cnBhdGggIiBpbgotCQkgKiIgJHRlbXBfeHJwYXRoICIqKSA7OwotCQkgKikgeHJwYXRoPSIkeHJwYXRoICR0ZW1wX3hycGF0aCI7OwotCQkgZXNhYzs7Ci0JICAgIC1MKikgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAkdGVtcF9kZXBsaWJzICIgaW4KLQkJICoiICRkZXBsaWIgIiopIDs7Ci0JCSAqKSB0ZW1wX2RlcGxpYnM9IiR0ZW1wX2RlcGxpYnMgJGRlcGxpYiI7OwotCQkgZXNhYzs7Ci0JICAgICopIHRlbXBfZGVwbGlicz0iJHRlbXBfZGVwbGlicyAkZGVwbGliIjs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQkgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfZGVwbGlicyIKLQlmaQotCi0JaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLQkgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KLQkgIGNvbnZlbmllbmNlPSIkY29udmVuaWVuY2UgJGRpci8kb2xkX2xpYnJhcnkiCi0JICBvbGRfY29udmVuaWVuY2U9IiRvbGRfY29udmVuaWVuY2UgJGRpci8kb2xkX2xpYnJhcnkiCi0JICBkZXBsaWJzPSIkZGVwbGlicyRkZXBlbmRlbmN5X2xpYnMiCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kb2xkX2xpYnJhcnkkZGVwZW5kZW5jeV9saWJzIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGRpci8kb2xkX2xpYnJhcnkkZGVwZW5kZW5jeV9saWJzIgotCSAgY29udGludWUKLQlmaQotCi0JIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCi0JaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgIGlmIHRlc3QgLXogIiRkbG5hbWUiIHx8IHRlc3QgIiRkbG9wZW4iICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCi0JICAgICMgSWYgdGhlcmUgaXMgbm8gZGxuYW1lLCBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nIHN0YXRpY2FsbHksCi0JICAgICMgd2UgbmVlZCB0byBwcmVsb2FkLgotCSAgICBwcmV2PWRscHJlZmlsZXMKLQkgIGVsc2UKLQkgICAgIyBXZSBzaG91bGQgbm90IGNyZWF0ZSBhIGRlcGVuZGVuY3kgb24gdGhpcyBsaWJyYXJ5LCBidXQgd2UKLQkgICAgIyBtYXkgbmVlZCBhbnkgbGlicmFyaWVzIGl0IHJlcXVpcmVzLgotCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICBmaQotCWZpCi0KLQkjIFRoZSBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgotCWlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KLQkgICMgUHJlZmVyIHVzaW5nIGEgc3RhdGljIGxpYnJhcnkgKHNvIHRoYXQgbm8gc2lsbHkgX0RZTkFNSUMgc3ltYm9scwotCSAgIyBhcmUgcmVxdWlyZWQgdG8gbGluaykuCi0JICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgZWxzZQotCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGlyLyRsaW5rbGliIgotCSAgZmkKLQkgIHByZXY9Ci0JZmkKLQotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgotCSAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0iJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMgJGFyZyIKLQkgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotCSAgICAjIE1ha2Ugc3VyZSB0aGUgcnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCi0JICAgIGNhc2UgIiR0ZW1wX3JwYXRoICIgaW4KLQkgICAgKiIgJGRpciAiKikgOzsKLQkgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGggJGRpciIgOzsKLQkgICAgZXNhYwotCSAgZmkKLQotCSAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0JICBjYXNlICIkZGlyIiBpbgotCSAgLyogfCBbQS1aYS16XTpbL1xcXSopIGFic2Rpcj0iJGRpciIgOzsKLQkgICopCi0JICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLQkgICAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGxpYmRpciciIDE+JjIKLQkgICAgICBleGl0IDEKLQkgICAgZmkKLQkgICAgOzsKLQkgIGVzYWMKLQkgIAotCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgotCSAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQotCSAgIyBzZWFyY2ggcGF0aCwgdW5sZXNzIHRoZXkgaGF2ZSBiZWVuIHJlcXVlc3RlZCB3aXRoIC1SLgotCSAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgotIAkgICoiICRhYnNkaXIgIiopIDs7Ci0JICAqKQotCSAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCi0JICAgICoiICRhYnNkaXIgIiopIDs7Ci0JICAgICopIGNvbXBpbGVfcnBhdGg9IiRjb21waWxlX3JwYXRoICRhYnNkaXIiIAotCSAgICBlc2FjCi0JICAgIDs7Ci0gCSAgZXNhYwotCi0JICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCi0gCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCi0JICAgICoiICRsaWJkaXIgIiopIDs7Ci0JICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKLQkgICAgZXNhYwotCSAgICA7OwotIAkgIGVzYWMKLQotCSAgbGliX2xpbmtlZD15ZXMKLQkgIGNhc2UgIiRoYXJkY29kZV9hY3Rpb24iIGluCi0JICBpbW1lZGlhdGUgfCB1bnN1cHBvcnRlZCkKLQkgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSBubzsgdGhlbgotCSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzICRkaXIvJGxpbmtsaWIiCi0JICAgICAgY2FzZSAiJGhvc3QiIGluCi0JICAgICAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLW9zMiopCi0JCWRsbHNlYXJjaGRpcj1gY2QgIiRkaXIiICYmIHB3ZCB8fCBlY2hvICIkZGlyImAKLQkJaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCi0JCSAgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGRsbHNlYXJjaGRpciIKLQkJZWxzZQotCQkgIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hkaXIiCi0JCWZpCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCi0JICAgICAgY2FzZSAiJGhvc3QiIGluCi0JICAgICAgKi0qLXN1bm9zKikKLQkJY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRkaXI6IgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgICAqIiAtTCRkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGRpciI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtTCRkaXIgLWwkbmFtZSIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSBubzsgdGhlbgotCSAgICAgIGNhc2UgIjokY29tcGlsZV9zaGxpYnBhdGg6IiBpbgotCSAgICAgICoiOiRkaXI6IiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRkaXI6Ijs7Ci0JICAgICAgZXNhYwotCSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtbCRuYW1lIgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1sJG5hbWUiCi0JICAgIGVsc2UKLQkgICAgICBsaWJfbGlua2VkPW5vCi0JICAgIGZpCi0JICAgIDs7Ci0KLQkgIHJlbGluaykKLQkgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFic2Rpci8kbGlua2xpYiIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAkYWJzZGlyLyRsaW5rbGliIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotCSAgICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgotCSAgICAgICoiIC1MJGFic2RpciAiKikgOzsKLQkgICAgICAqKSBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkYWJzZGlyIjs7Ci0JICAgICAgZXNhYwotCSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtbCRuYW1lIgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1MJGFic2RpciAtbCRuYW1lIgotCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCSAgICAgIGNhc2UgIjokY29tcGlsZV9zaGxpYnBhdGg6IiBpbgotCSAgICAgICoiOiRhYnNkaXI6IiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRhYnNkaXI6Ijs7Ci0JICAgICAgZXNhYwotCSAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtbCRuYW1lIgotCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1sJG5hbWUiCi0JICAgIGVsc2UKLQkgICAgICBsaWJfbGlua2VkPW5vCi0JICAgIGZpCi0JICAgIDs7Ci0KLQkgICopCi0JICAgIGxpYl9saW5rZWQ9bm8KLQkgICAgOzsKLQkgIGVzYWMKLQotCSAgaWYgdGVzdCAiJGxpYl9saW5rZWQiICE9IHllczsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjb25maWd1cmF0aW9uIGVycm9yOiB1bnN1cHBvcnRlZCBoYXJkY29kZSBwcm9wZXJ0aWVzIgotCSAgICBleGl0IDEKLQkgIGZpCi0KLQkgICMgRmluYWxpemUgY29tbWFuZCBmb3IgYm90aCBpcyBzaW1wbGU6IGp1c3QgaGFyZGNvZGUgaXQuCi0JICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGliZGlyLyRsaW5rbGliIgotCSAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KLQkgICAgY2FzZSAiJGZpbmFsaXplX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtTCRsaWJkaXIgIiopIDs7Ci0JICAgICopIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1MJGxpYmRpciI7OwotCSAgICBlc2FjCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1sJG5hbWUiCi0JICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotCSAgICBjYXNlICI6JGZpbmFsaXplX3NobGlicGF0aDoiIGluCi0JICAgICoiOiRsaWJkaXI6IiopIDs7Ci0JICAgICopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6Ijs7Ci0JICAgIGVzYWMKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLWwkbmFtZSIKLQkgIGVsc2UKLQkgICAgIyBXZSBjYW5ub3Qgc2VlbSB0byBoYXJkY29kZSBpdCwgZ3Vlc3Mgd2UnbGwgZmFrZSBpdC4KLQkgICAgY2FzZSAiJGZpbmFsaXplX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtTCRkaXIgIiopIDs7Ci0JICAgICopIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1MJGxpYmRpciI7OwotCSAgICBlc2FjCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1sJG5hbWUiCi0JICBmaQotCWVsc2UKLQkgICMgVHJhbnNmb3JtIGRpcmVjdGx5IHRvIG9sZCBhcmNoaXZlcyBpZiB3ZSBkb24ndCBidWlsZCBuZXcgbGlicmFyaWVzLgotCSAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIiAmJiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIHN0YXRpYyBsaWJyYXJ5IGZvciBcYCRhcmcnIiAxPiYyCi0JICAgIGV4aXQgMQotCSAgZmkKLQotCSAgIyBIZXJlIHdlIGFzc3VtZSB0aGF0IG9uZSBvZiBoYXJkY29kZV9kaXJlY3Qgb3IgaGFyZGNvZGVfbWludXNfTAotCSAgIyBpcyBub3QgdW5zdXBwb3J0ZWQuICBUaGlzIGlzIHZhbGlkIG9uIGFsbCBrbm93biBzdGF0aWMgYW5kCi0JICAjIHNoYXJlZCBwbGF0Zm9ybXMuCi0JICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB1bnN1cHBvcnRlZDsgdGhlbgotCSAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGxpbmtsaWI9IiRvbGRfbGlicmFyeSIKLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJGxpbmtsaWIiCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRkaXIvJGxpbmtsaWIiCi0JICBlbHNlCi0JICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtTCRkaXIgIiopIDs7Ci0JICAgICopIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRkaXIiOzsKLQkgICAgZXNhYwotCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgY2FzZSAiJGZpbmFsaXplX2NvbW1hbmQgIiBpbgotCSAgICAqIiAtTCRkaXIgIiopIDs7Ci0JICAgICopIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1MJGRpciI7OwotCSAgICBlc2FjCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1sJG5hbWUiCi0JICBmaQotCWZpCi0KLQkjIEFkZCBpbiBhbnkgbGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGFyZ3VtZW50LgotICAgICAgKikKLQkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKLQkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgotCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLQljYXNlICIkYXJnIiBpbgotCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCSAgYXJnPSJcIiRhcmdcIiIKLQkgIDs7Ci0JZXNhYwotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KLQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKLQlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgotICAgICAgZmkKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2YXJnJyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIG9sZGxpYnM9Ci0gICAgIyBjYWxjdWxhdGUgdGhlIG5hbWUgb2YgdGhlIGZpbGUsIHdpdGhvdXQgaXRzIGRpcmVjdG9yeQotICAgIG91dHB1dG5hbWU9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotICAgIGxpYm9ianNfc2F2ZT0iJGxpYm9ianMiCi0KLSAgICBjYXNlICIkb3V0cHV0IiBpbgotICAgICIiKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQgZmlsZSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0KLSAgICAqLmEgfCAqLmxpYikKLSAgICAgIGlmIHRlc3QgLW4gIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBsaWJ0b29sIGxpYnJhcmllcyBpbnRvIGFyY2hpdmVzIiAxPiYyCi0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGVwbGlicyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtUicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWV4cG9ydC1zeW1ib2xzJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLSAgICAgIG9sZGxpYnM9IiRvdXRwdXQiCi0gICAgICA7OwotCi0gICAgKi5sYSkKLSAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KLSAgICAgIGNhc2UgIiRvdXRwdXRuYW1lIiBpbgotICAgICAgbGliKikKLQluYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCi0JZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JOzsKLSAgICAgICopCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSBubzsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgbXVzdCBiZWdpbiB3aXRoIFxgbGliJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCWlmIHRlc3QgIiRuZWVkX2xpYl9wcmVmaXgiICE9IG5vOyB0aGVuCi0JICAjIEFkZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzIGlmIHJlcXVpcmVkCi0JICBuYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nYAotCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCi0JZWxzZQotCSAgbGlibmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJ2AKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgIG91dHB1dF9vYmpkaXI9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiWCRvdXRwdXRfb2JqZGlyIiA9ICJYJG91dHB1dCI7IHRoZW4KLQlvdXRwdXRfb2JqZGlyPSIkb2JqZGlyIgotICAgICAgZWxzZQotCW91dHB1dF9vYmpkaXI9IiRvdXRwdXRfb2JqZGlyLyRvYmpkaXIiCi0gICAgICBmaQotCi0gICAgICAjIEFsbCB0aGUgbGlicmFyeS1zcGVjaWZpYyB2YXJpYWJsZXMgKGluc3RhbGxfbGliZGlyIGlzIHNldCBhYm92ZSkuCi0gICAgICBsaWJyYXJ5X25hbWVzPQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICBkbG5hbWU9Ci0KLSAgICAgIGlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHM6JG9ianMiIDI+JjEKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgICMgSG93IHRoZSBoZWNrIGFyZSB3ZSBzdXBwb3NlZCB0byB3cml0ZSBhIHdyYXBwZXIgZm9yIGEgc2hhcmVkIGxpYnJhcnk/Ci0gICAgICBpZiB0ZXN0IC1uICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KLQkgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IGNhbm5vdCBsaW5rIHNoYXJlZCBsaWJyYXJpZXMgaW50byBsaWJ0b29sIGxpYnJhcmllcyIgMT4mMgotCSBleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBsaWJ0b29sIGxpYnJhcmllcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgc2V0IGR1bW15ICRycGF0aAotICAgICAgaWYgdGVzdCAkIyAtZ3QgMjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IiAxPiYyCi0gICAgICBmaQotICAgICAgaW5zdGFsbF9saWJkaXI9IiQyIgotCi0gICAgICBvbGRsaWJzPQotICAgICAgaWYgdGVzdCAteiAiJHJwYXRoIjsgdGhlbgotCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIEJ1aWxkaW5nIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LgotCSAgbGliZXh0PWFsCi0JICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0ICRvbGRsaWJzIgotCSAgYnVpbGRfbGlidG9vbF9saWJzPWNvbnZlbmllbmNlCi0JICBidWlsZF9vbGRfbGlicz15ZXMKLQlmaQotCWRlcGVuZGVuY3lfbGlicz0iJGRlcGxpYnMiCi0KLQlpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgotCWZpCi0KLQlpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgotCWZpCi0gICAgICBlbHNlCi0KLQkjIFBhcnNlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFyZ3VtZW50LgotCUlGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzonCi0Jc2V0IGR1bW15ICR2aW5mbyAwIDAgMAotCUlGUz0iJHNhdmVfaWZzIgotCi0JaWYgdGVzdCAtbiAiJDgiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB0b28gbWFueSBwYXJhbWV0ZXJzIHRvIFxgLXZlcnNpb24taW5mbyciIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCWN1cnJlbnQ9IiQyIgotCXJldmlzaW9uPSIkMyIKLQlhZ2U9IiQ0IgotCi0JIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KLQljYXNlICIkY3VycmVudCIgaW4KLQkwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogQ1VSUkVOVCBcYCRjdXJyZW50JyBpcyBub3QgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0KLQljYXNlICIkcmV2aXNpb24iIGluCi0JMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IFJFVklTSU9OIFxgJHJldmlzaW9uJyBpcyBub3QgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0KLQljYXNlICIkYWdlIiBpbgotCTAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBpcyBub3QgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0KLQlpZiB0ZXN0ICRhZ2UgLWd0ICRjdXJyZW50OyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgaW50ZXJmYWNlIG51bWJlciBcYCRjdXJyZW50JyIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JIyBDYWxjdWxhdGUgdGhlIHZlcnNpb24gdmFyaWFibGVzLgotCW1ham9yPQotCXZlcnN1ZmZpeD0KLQl2ZXJzdHJpbmc9Ci0JY2FzZSAiJHZlcnNpb25fdHlwZSIgaW4KLQlub25lKSA7OwotCi0JaXJpeCkKLQkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZSArIDFgCi0JICB2ZXJzdWZmaXg9IiRtYWpvci4kcmV2aXNpb24iCi0JICB2ZXJzdHJpbmc9InNnaSRtYWpvci4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRyZXZpc2lvbgotCSAgd2hpbGUgdGVzdCAkbG9vcCAhPSAwOyBkbwotCSAgICBpZmFjZT1gZXhwciAkcmV2aXNpb24gLSAkbG9vcGAKLQkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCi0JICAgIHZlcnN0cmluZz0ic2dpJG1ham9yLiRpZmFjZTokdmVyc3RyaW5nIgotCSAgZG9uZQotCSAgOzsKLQotCWxpbnV4KQotCSAgbWFqb3I9LmBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgotCSAgOzsKLQotCW9zZikKLQkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgotCSAgdmVyc3RyaW5nPSIkY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKLQotCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KLQkgIGxvb3A9JGFnZQotCSAgd2hpbGUgdGVzdCAkbG9vcCAhPSAwOyBkbwotCSAgICBpZmFjZT1gZXhwciAkY3VycmVudCAtICRsb29wYAotCSAgICBsb29wPWBleHByICRsb29wIC0gMWAKLQkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7aWZhY2V9LjAiCi0JICBkb25lCi0KLQkgICMgTWFrZSBleGVjdXRhYmxlcyBkZXBlbmQgb24gb3VyIGN1cnJlbnQgdmVyc2lvbi4KLQkgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2N1cnJlbnR9LjAiCi0JICA7OwotCi0Jc3Vub3MpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIgotCSAgOzsKLQotCWZyZWVic2QtYW91dCkKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iOwotCSAgOzsKLQotCWZyZWVic2QtZWxmKQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50IjsKLQkgIDs7Ci0KLQl3aW5kb3dzKQotCSAgIyBMaWtlIExpbnV4LCBidXQgd2l0aCAnLScgcmF0aGVyIHRoYW4gJy4nLCBzaW5jZSB3ZSBvbmx5Ci0JICAjIHdhbnQgb25lIGV4dGVuc2lvbiBvbiBXaW5kb3dzIDk1LgotCSAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotCSAgdmVyc3VmZml4PSItJG1ham9yLSRhZ2UtJHJldmlzaW9uIgotCSAgOzsKLQotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIGxpYnJhcnkgdmVyc2lvbiB0eXBlIFxgJHZlcnNpb25fdHlwZSciIDE+JjIKLQkgIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JIyBDbGVhciB0aGUgdmVyc2lvbiBpbmZvIGlmIHdlIGRlZmF1bHRlZCwgYW5kIHRoZXkgc3BlY2lmaWVkIGEgcmVsZWFzZS4KLQlpZiB0ZXN0IC16ICIkdmluZm8iICYmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSAgbWFqb3I9Ci0JICB2ZXJzdHJpbmc9IjAuMCIKLQkgIGlmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgICAgdmVyc3VmZml4PQotCSAgZWxzZQotCSAgICB2ZXJzdWZmaXg9Ii4wLjAiCi0JICBmaQotCWZpCi0KLQkjIFJlbW92ZSB2ZXJzaW9uIGluZm8gZnJvbSBuYW1lIGlmIHZlcnNpb25pbmcgc2hvdWxkIGJlIGF2b2lkZWQKLQlpZiB0ZXN0ICIkYXZvaWRfdmVyc2lvbiIgPSB5ZXMgJiYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgotCSAgbWFqb3I9Ci0JICB2ZXJzdWZmaXg9Ci0JICB2ZXJzdHJpbmc9IiIKLQlmaQotCQotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcmNoaXZlIHdpbGwgaGF2ZSB1bmRlZmluZWQgc3ltYm9scy4KLQlpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiA9IHVuc3VwcG9ydGVkOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHVuZGVmaW5lZCBzeW1ib2xzIG5vdCBhbGxvd2VkIGluICRob3N0IHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLQkgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgZmkKLQllbHNlCi0JICAjIERvbid0IGFsbG93IHVuZGVmaW5lZCBzeW1ib2xzLgotCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKLQlmaQotCi0JZGVwZW5kZW5jeV9saWJzPSIkZGVwbGlicyIKLQljYXNlICIkaG9zdCIgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotb3MyKikKLQkgICMgdGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgYyBsaWJyYXJ5IChhcyBzdWNoKSEKLQkgIDs7Ci0JKikKLQkgICMgQWRkIGxpYmMgdG8gZGVwbGlicyBvbiBhbGwgb3RoZXIgc3lzdGVtcy4KLQkgIGRlcGxpYnM9IiRkZXBsaWJzIC1sYyIKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLQotICAgICAgIyBDcmVhdGUgdGhlIG91dHB1dCBkaXJlY3RvcnksIG9yIHJlbW92ZSBvdXIgb3V0cHV0cyBpZiB3ZSBuZWVkIHRvLgotICAgICAgaWYgdGVzdCAtZCAkb3V0cHV0X29iamRpcjsgdGhlbgotCSRzaG93ICIke3JtfXIgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qIgotCSRydW4gJHtybX1yICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKgotICAgICAgZWxzZQotCSRzaG93ICIkbWtkaXIgJG91dHB1dF9vYmpkaXIiCi0JJHJ1biAkbWtkaXIgJG91dHB1dF9vYmpkaXIKLQlzdGF0dXM9JD8KLQlpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRvdXRwdXRfb2JqZGlyOyB0aGVuCi0JICBleGl0ICRzdGF0dXMKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IGNvbnZlbmllbmNlIDsgdGhlbgotCW9sZGxpYnM9IiRvbGRsaWJzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0KLQkjIFRyYW5zZm9ybSAubG8gZmlsZXMgdG8gLm8gZmlsZXMuCi0Jb2xkb2Jqcz0iJG9ianMgImAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JyQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JIyBUcmFuc2Zvcm0gZGVwbGlicyBpbnRvIG9ubHkgZGVwbGlicyB0aGF0IGNhbiBiZSBsaW5rZWQgaW4gc2hhcmVkLgotCW5hbWVfc2F2ZT0kbmFtZQotCWxpYm5hbWVfc2F2ZT0kbGlibmFtZQotCXJlbGVhc2Vfc2F2ZT0kcmVsZWFzZQotCXZlcnN1ZmZpeF9zYXZlPSR2ZXJzdWZmaXgKLQltYWpvcl9zYXZlPSRtYWpvcgotCSMgSSdtIG5vdCBzdXJlIGlmIEknbSB0cmVhdGluZyB0aGUgcmVsZWFzZSBjb3JyZWN0bHkuICBJIHRoaW5rCi0JIyByZWxlYXNlIHNob3VsZCBzaG93IHVwIGluIHRoZSAtbCAoaWUgLWxnbXA1KSBzbyB3ZSBkb24ndCB3YW50IHRvCi0JIyBhZGQgaXQgaW4gdHdpY2UuICBJcyB0aGF0IGNvcnJlY3Q/Ci0JcmVsZWFzZT0iIgotCXZlcnN1ZmZpeD0iIgotCW1ham9yPSIiCi0JbmV3ZGVwbGlicz0KLQlkcm9wcGVkZGVwcz1ubwotCWNhc2UgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgaW4KLQlwYXNzX2FsbCkKLQkgIG5ld2RlcGxpYnM9JGRlcGxpYnMKLQkJICAgIDs7ICMgRG9uJ3QgY2hlY2sgZm9yIHNoYXJlZC9zdGF0aWMuICBFdmVyeXRoaW5nIHdvcmtzLgotCQkgICAgICAgIyBUaGlzIG1pZ2h0IGJlIGEgbGl0dGxlIG5haXZlLiAgV2UgbWlnaHQgd2FudCB0byBjaGVjawotCQkgICAgICAgIyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGV4aXN0cyBvciBub3QuICBCdXQgdGhpcyBpcyBvbgotCQkgICAgICAgIyBvc2YzICYgb3NmNCBhbmQgSSdtIG5vdCByZWFsbHkgc3VyZS4uLiBKdXN0Ci0JCSAgICAgICAjIGltcGxlbWVudGluZyB3aGF0IHdhcyBhbHJlYWR5IHRoZSBiZWhhdmlvdXIuCi0JdGVzdF9jb21waWxlKQotCSAgIyBUaGlzIGNvZGUgc3RyZXNzZXMgdGhlICJsaWJyYXJpZXMgYXJlIHByb2dyYW1zIiBwYXJhZGlnbSB0byBpdHMKLQkgICMgbGltaXRzLiBNYXliZSBldmVuIGJyZWFrcyBpdC4gIFdlIGNvbXBpbGUgYSBwcm9ncmFtLCBsaW5raW5nIGl0Ci0JICAjIGFnYWluc3QgdGhlIGRlcGxpYnMgYXMgYSBwcm94eSBmb3IgdGhlIGxpYnJhcnkuICBUaGVuIHdlIGNhbiBjaGVjawotCSAgIyB3aGV0aGVyIHRoZXkgbGlua2VkIGluIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBsZGQuCi0JICAkcm0gY29uZnRlc3QuYwotCSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotCSAgaW50IG1haW4oKSB7IHJldHVybiAwOyB9Ci1FT0YKLQkgICRybSBjb25mdGVzdAotCSAgJENfY29tcGlsZXIgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkZGVwbGlicwotCSAgaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KLQkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAotCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KLQkgICAgICBuYW1lPSJgZXhwciAkaSA6ICctbFwoLipcKSdgIgotCSAgICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotCSAgICAgIGlmIHRlc3QgIiRuYW1lIiAhPSAiIiA7IHRoZW4KLQkJbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCQlkZXBsaWJfbWF0Y2hlcz1gZXZhbCBcXCRlY2hvIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiYAotCQlzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCi0JCWRlcGxpYl9tYXRjaD0kMgotCQlpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCi0JCSAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCWVsc2UKLQkJICBkcm9wcGVkZGVwcz15ZXMKLQkJICBlY2hvCi0JCSAgZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGkuIgotCQkgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCi0JCSAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgotCQlmaQotCSAgICAgIGVsc2UKLQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZWxzZQotCSAgICAjIEVycm9yIG9jY3VyZWQgaW4gdGhlIGZpcnN0IGNvbXBpbGUuICBMZXQncyB0cnkgdG8gc2FsdmFnZSB0aGUgc2l0dWF0aW9uOgotCSAgICAjIENvbXBpbGUgYSBzZXBlcmF0ZSBwcm9ncmFtIGZvciBlYWNoIGxpYnJhcnkuCi0JICAgIGZvciBpIGluICRkZXBsaWJzOyBkbwotCSAgICAgIG5hbWU9ImBleHByICRpIDogJy1sXCguKlwpJ2AiCi0JICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLQkgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgOyB0aGVuCi0JCSRybSBjb25mdGVzdAotCQkkQ19jb21waWxlciAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRpCi0JCSMgRGlkIGl0IHdvcms/Ci0JCWlmIHRlc3QgJD8gLWVxIDAgOyB0aGVuCi0JCSAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAotCQkgICAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCQkgICAgZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKLQkJICAgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXMKLQkJICAgIGRlcGxpYl9tYXRjaD0kMgotCQkgICAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgotCQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkJICAgIGVsc2UKLQkJICAgICAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgICAgIGVjaG8KLQkJICAgICAgZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGkuIgotCQkgICAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkgICAgICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQkgICAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgotCQkgICAgZmkKLQkJZWxzZQotCQkgIGRyb3BwZWRkZXBzPXllcwotCQkgIGVjaG8KLQkJICBlY2hvICIqKiogV2FybmluZyEgIExpYnJhcnkgJGkgaXMgbmVlZGVkIGJ5IHRoaXMgbGlicmFyeSBidXQgSSB3YXMgbm90IGFibGUgdG8iCi0JCSAgZWNobyAiKioqICBtYWtlIGl0IGxpbmsgaW4hICBZb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgaXQgb3Igc29tZSIKLQkJICBlY2hvICIqKiogbGlicmFyeSB0aGF0IGl0IGRlcGVuZHMgb24gYmVmb3JlIHRoaXMgbGlicmFyeSB3aWxsIGJlIGZ1bGx5IgotCQkgIGVjaG8gIioqKiBmdW5jdGlvbmFsLiAgSW5zdGFsbGluZyBpdCBiZWZvcmUgY29udGludWluZyB3b3VsZCBiZSBldmVuIGJldHRlci4iCi0JCWZpCi0JICAgICAgZWxzZQotCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBmaQotCSAgZGVwbGlicz0kbmV3ZGVwbGlicwotCSAgOzsKLQlmaWxlX21hZ2ljKikKLQkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2QKLQkgIGZpbGVfbWFnaWNfcmVnZXg9ImBleHByIFwiJGRlcGxpYnNfY2hlY2tfbWV0aG9kXCIgOiBcIiQyIFwoLipcKVwiYCIKLQkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KLQkgICAgbmFtZT0iYGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AiCi0JICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgotCSAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgOyB0aGVuCi0JICAgICAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAotCSAgICAgIGZvciBpIGluICRsaWJfc2VhcmNoX3BhdGg7IGRvCi0JCSAgICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKLQkJICAgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KLQkJICAgICAgIyBGb2xsb3cgc29mdCBsaW5rcy4KLQkJICAgICAgaWYgbHMgLWxMZCAiJHBvdGxpYiIgMj4vZGV2L251bGwgXAotCQkJIHwgZ3JlcCAiIC0+ICIgPi9kZXYvbnVsbDsgdGhlbgotCQkJY29udGludWUgCi0JCSAgICAgIGZpCi0JCSAgICAgICMgVGhlIHN0YXRlbWVudCBhYm92ZSB0cmllcyB0byBhdm9pZCBlbnRlcmluZyBhbgotCQkgICAgICAjIGVuZGxlc3MgbG9vcCBiZWxvdywgaW4gY2FzZSBvZiBjeWNsaWMgbGlua3MuCi0JCSAgICAgICMgV2UgbWlnaHQgc3RpbGwgZW50ZXIgYW4gZW5kbGVzcyBsb29wLCBzaW5jZSBhIGxpbmsKLQkJICAgICAgIyBsb29wIGNhbiBiZSBjbG9zZWQgd2hpbGUgd2UgZm9sbG93IGxpbmtzLAotCQkgICAgICAjIGJ1dCBzbyB3aGF0PwotCQkgICAgICBwb3RsaWI9IiRwb3RlbnRfbGliIgotCQkgICAgICB3aGlsZSB0ZXN0IC1oICIkcG90bGliIiAyPi9kZXYvbnVsbDsgZG8KLQkJCXBvdGxpYmxpbms9YGxzIC1sZCAkcG90bGliIHwgc2VkICdzLy4qIC0+IC8vJ2AKLQkJCWNhc2UgIiRwb3RsaWJsaW5rIiBpbgotCQkJLyopIHBvdGxpYj0iJHBvdGxpYmxpbmsiOzsKLQkJCSopIHBvdGxpYj1gJGVjaG8gIlgkcG90bGliIiB8ICRYc2VkIC1lICdzLFteL10qJCwsJ2AiJHBvdGxpYmxpbmsiOzsKLQkJCWVzYWMKLQkJICAgICAgZG9uZQotCQkgICAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkcG90bGliXCIgXAotCQkJIHwgc2VkIDEwcSBcCi0JCQkgfCBlZ3JlcCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCi0JCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JCQlhX2RlcGxpYj0iIgotCQkJYnJlYWsgMgotCQkgICAgICBmaQotCQkgICAgZG9uZQotCSAgICAgIGRvbmUKLQkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgotCQlkcm9wcGVkZGVwcz15ZXMKLQkJZWNobwotCQllY2hvICIqKiogV2FybmluZzogVGhpcyBsaWJyYXJ5IG5lZWRzIHNvbWUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSAkYV9kZXBsaWIuIgotCQllY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQllY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgotCQllY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgotCSAgICAgIGZpCi0JICAgIGVsc2UKLQkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgotCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKLQkgICAgZmkKLQkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCi0JICA7OwotCW5vbmUgfCB1bmtub3duIHwgKikgbmV3ZGVwbGlicz0iIgotCSAgaWYgJGVjaG8gIlggJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyQvLycgXAotCSAgICAgICAtZSAncy8gLVtMUl1bXiBdKi8vZycgLWUgJ3MvWyAJXS8vZycgfAotCSAgICAgZ3JlcCAuID4vZGV2L251bGw7IHRoZW4KLQkgICAgZWNobwotCSAgICBpZiB0ZXN0ICJYJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9ICJYbm9uZSI7IHRoZW4KLQkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCi0JICAgIGVsc2UKLQkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgotCSAgICBmaQotCSAgICBlY2hvICIqKiogQWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBkcm9wcGVkLiIKLQkgICAgZHJvcHBlZGRlcHM9eWVzCi0JICBmaQotCSAgOzsKLQllc2FjCi0JdmVyc3VmZml4PSR2ZXJzdWZmaXhfc2F2ZQotCW1ham9yPSRtYWpvcl9zYXZlCi0JcmVsZWFzZT0kcmVsZWFzZV9zYXZlCi0JbGlibmFtZT0kbGlibmFtZV9zYXZlCi0JbmFtZT0kbmFtZV9zYXZlCi0KLQlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCi0JICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgotCSAgICBlY2hvCi0JICAgIGVjaG8gIioqKiBXYXJuaW5nOiBsaWJ0b29sIGNvdWxkIG5vdCBzYXRpc2Z5IGFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IgotCSAgICBlY2hvICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKLQkgICAgZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCi0JICAgIGVjaG8gIioqKiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnLiIKLQkgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgICAgICBlY2hvCi0JICAgICAgZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCi0JICAgICAgZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKLQkgICAgICBlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCi0JICAgICAgZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgotCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQotCSAgICAgIGJ1aWxkX29sZF9saWJzPXllcwotCSAgICBlbHNlCi0JICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0JICAgIGZpCi0JICAgIGRsbmFtZT0KLQkgICAgbGlicmFyeV9uYW1lcz0KLQkgIGVsc2UKLQkgICAgZWNobyAiKioqIFRoZSBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkIGhlcmUgd2lsbCBiZSIKLQkgICAgZWNobyAiKioqIGF1dG9tYXRpY2FsbHkgYWRkZWQgd2hlbmV2ZXIgYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIHRoaXMgbGlicmFyeSIKLQkgICAgZWNobyAiKioqIG9yIGlzIGRlY2xhcmVkIHRvIC1kbG9wZW4gaXQuIgotCSAgZmkKLQlmaQotICAgICAgZmkKLQotICAgICAgIyB0ZXN0IGFnYWluLCB3ZSBtYXkgaGF2ZSBkZWNpZGVkIG5vdCB0byBidWlsZCBpdCBhbnkgbW9yZQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlkZXBsaWJzPSRuZXdkZXBsaWJzCi0JIyBEb25lIGNoZWNraW5nIGRlcGxpYnMhCi0gCi0JIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCi0JZXZhbCBsaWJyYXJ5X25hbWVzPVwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiCi0Jc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCi0JcmVhbG5hbWU9IiQyIgotCXNoaWZ0OyBzaGlmdAotCi0JaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgotCSAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgotCWVsc2UKLQkgIHNvbmFtZT0iJHJlYWxuYW1lIgotCWZpCi0KLQlsaWI9IiRvdXRwdXRfb2JqZGlyLyRyZWFsbmFtZSIKLQlmb3IgbGluawotCWRvCi0JICBsaW5rbmFtZXM9IiRsaW5rbmFtZXMgJGxpbmsiCi0JZG9uZQotCi0JIyBFbnN1cmUgdGhhdCB3ZSBoYXZlIC5vIG9iamVjdHMgZm9yIGxpbmtlcnMgd2hpY2ggZGlzbGlrZSAubG8KLQkjIChlLmcuIGFpeCkgaW5jYXNlIHdlIGFyZSBydW5uaW5nIC0tZGlzYWJsZS1zdGF0aWMKLQlmb3Igb2JqIGluICRsaWJvYmpzOyBkbwotCSAgb2xkb2JqPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIHRlc3QgLWYgJG9sZG9iaiB8fCAke0xOX1N9ICRvYmogJG9sZG9iagotCWRvbmUKLQotCSMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgcGljCi0JdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0KLQlpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCi0JICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgotCSAgZmkKLQllbHNlCi0JICBmb3IgeGxpYiBpbiAkY29udmVuaWVuY2U7IGRvCi0JICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KLQkgICAgeGRpcj0iJHhsaWIieAotCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJHhkaXIiCi0JICAgIHhsaWI9YCRlY2hvICJYJHhsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotCSAgICAkc2hvdyAiJHtybX1yICR4ZGlyIgotCSAgICAkcnVuICR7cm19ciAiJHhkaXIiCi0JICAgICRzaG93ICJta2RpciAkeGRpciIKLQkgICAgJHJ1biBta2RpciAiJHhkaXIiCi0JICAgIHN0YXR1cz0kPwotCSAgICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkeGRpciI7IHRoZW4KLQkgICAgICBleGl0ICRzdGF0dXMKLQkgICAgZmkKLQkgICAgJHNob3cgIihjZCAkeGRpciAmJiAkQVIgeCAuLi8keGxpYikiCi0JICAgICRydW4gZXZhbCAiKGNkIFwkeGRpciAmJiAkQVIgeCAuLi9cJHhsaWIpIiB8fCBleGl0ICQ/Ci0KLQkgICAgbGlib2Jqcz0iJGxpYm9ianMgImBmaW5kICR4ZGlyIC1uYW1lIFwqLm8gLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICROTDJTUGAKLQkgIGRvbmUKLQlmaQotCi0JaWYgdGVzdCAiJHRocmVhZF9zYWZlIiA9IHllcyAmJiB0ZXN0IC1uICIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgZXZhbCBmbGFnPVwiJHRocmVhZF9zYWZlX2ZsYWdfc3BlY1wiCi0KLQkgIGxpbmtvcHRzPSIkbGlua29wdHMgJGZsYWciCi0JZmkKLQotCSMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCi0JaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgotCSAgaWYgdGVzdCAiJGFsd2F5c19leHBvcnRfc3ltYm9scyIgPSB5ZXMgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCi0JICAgIGV4cG9ydF9zeW1ib2xzPSIkb2JqZGlyLyRsaWJuYW1lLmV4cCIKLQkgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgIGV2YWwgY21kcz1cIiRleHBvcnRfc3ltYm9sc19jbWRzXCIKLQkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAgICRzaG93ICJlZ3JlcCAtZSBcIiRleHBvcnRfc3ltYm9sc19yZWdleFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIgPiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIgotCSAgICAgICRydW4gZXZhbCAnZWdyZXAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKLQkgICAgICAkc2hvdyAiJG12IFwiJHtleHBvcnRfc3ltYm9sc31UXCIgXCIkZXhwb3J0X3N5bWJvbHNcIiIKLQkgICAgICAkcnVuIGV2YWwgJyRtdiAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKLQkgICAgZmkKLQkgIGZpCi0JZmkKLQotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICRydW4gZXZhbCAnJGVjaG8gIlgkaW5jbHVkZV9leHBzeW1zIiB8ICRTUDJOTCA+PiAiJGV4cG9ydF9zeW1ib2xzIicKLQlmaQotCi0JIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCi0JICBldmFsIGNtZHM9XCIkYXJjaGl2ZV9leHBzeW1fY21kc1wiCi0JZWxzZQotCSAgZXZhbCBjbWRzPVwiJGFyY2hpdmVfY21kc1wiCi0JZmkKLQlJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCWZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgICRzaG93ICIkY21kIgotCSAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotCi0JIyBDcmVhdGUgbGlua3MgdG8gdGhlIHJlYWwgbGlicmFyeS4KLQlmb3IgbGlua25hbWUgaW4gJGxpbmtuYW1lczsgZG8KLQkgIGlmIHRlc3QgIiRyZWFsbmFtZSIgIT0gIiRsaW5rbmFtZSI7IHRoZW4KLQkgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgotCSAgICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpJyB8fCBleGl0ICQ/Ci0JICBmaQotCWRvbmUKLQotCSMgSWYgLW1vZHVsZSBvciAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCi0JaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgfHwgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgotCSAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCi0JICBkbG5hbWU9IiRzb25hbWUiCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotCi0gICAgKi5sbyB8ICoubyB8ICoub2JqKQotICAgICAgaWYgdGVzdCAtbiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IGNhbm5vdCBsaW5rIGxpYnRvb2wgbGlicmFyaWVzIGludG8gb2JqZWN0cyIgMT4mMgotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgIiRvdXRwdXQiIGluCi0gICAgICAqLmxvKQotCWlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGJ1aWxkIGxpYnJhcnkgb2JqZWN0IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCWxpYm9iaj0iJG91dHB1dCIKLQlvYmo9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCTs7Ci0gICAgICAqKQotCWxpYm9iaj0KLQlvYmo9IiRvdXRwdXQiCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBEZWxldGUgdGhlIG9sZCBvYmplY3RzLgotICAgICAgJHJ1biAkcm0gJG9iaiAkbGlib2JqCi0KLSAgICAgICMgQ3JlYXRlIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotICAgICAgcmVsb2FkX29ianM9IiRvYmpzICJgJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSQnL2QnIC1lICcvXC5saWIkL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0KLSAgICAgIG91dHB1dD0iJG9iaiIKLSAgICAgIGV2YWwgY21kcz1cIiRyZWxvYWRfY21kc1wiCi0gICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQlJRlM9IiRzYXZlX2lmcyIKLQkkc2hvdyAiJGNtZCIKLQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJHNhdmVfaWZzIgotCi0gICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KLSAgICAgIHRlc3QgLXogIiRsaWJvYmoiICYmIGV4aXQgMAotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLQkjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkb24ndAotCSMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCi0JJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKLQkkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIgfHwgZXhpdCAkPwotCWV4aXQgMAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIjsgdGhlbgotCSMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCi0JcmVsb2FkX29ianM9IiRsaWJvYmpzIgotCW91dHB1dD0iJGxpYm9iaiIKLQlldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgotCUlGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgJHNob3cgIiRjbWQiCi0JICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLQlkb25lCi0JSUZTPSIkc2F2ZV9pZnMiCi0gICAgICBlbHNlCi0JIyBKdXN0IGNyZWF0ZSBhIHN5bWxpbmsuCi0JJHNob3cgJHJtICRsaWJvYmoKLQkkcnVuICRybSAkbGlib2JqCi0JJHNob3cgIiRMTl9TICRvYmogJGxpYm9iaiIKLQkkcnVuICRMTl9TICRvYmogJGxpYm9iaiB8fCBleGl0ICQ/Ci0gICAgICBmaQotCi0gICAgICBleGl0IDAKLSAgICAgIDs7Ci0KLSAgICAjIEFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlIGEgcHJvZ3JhbS4KLSAgICAqKQotICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0ICIkZGxvcGVuIiA9IHVua25vd24gJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiA9IHVua25vd24gJiYKLQkgICB0ZXN0ICIkZGxvcGVuX3NlbGZfc3RhdGljIiA9IHVua25vd247IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgQUNfTElCVE9PTF9ETE9QRU4nIG5vdCB1c2VkLiBBc3N1bWluZyBubyBkbG9wZW4gc3VwcG9ydC4iCi0JZmkgCi0gICAgICBmaQotICAgIAotICAgICAgaWYgdGVzdCAiJGRsc2VsZiIgPSB5ZXMgJiYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IG5vOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IFxgLWRsb3BlbiBzZWxmJyByZXF1aXJlcyBcYC1leHBvcnQtZHluYW1pYyciIDE+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCR4cnBhdGgiOyB0aGVuCi0JIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgotCWZvciBsaWJkaXIgaW4gJHJwYXRoICR4cnBhdGg7IGRvCi0JICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCi0JICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQkgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWRvbmUKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCi0gICAgICBycGF0aD0KLSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9Ci0gICAgICBmb3IgbGliZGlyIGluICRjb21waWxlX3JwYXRoICRmaW5hbGl6ZV9ycGF0aDsgZG8KLQlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgotCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgotCSAgICBlbHNlCi0JICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgotCSAgICAgIGNhc2UgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgaW4KLQkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCi0JCTs7Ci0JICAgICAgKikKLQkJaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCTs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgZWxzZQotCSAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0KLQkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKLQkgIGZpCi0JZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0JICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotICAgICAgZG9uZQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KLSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgotCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KLQlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgotCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotICAgICAgZmkKLSAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIGluCi0JICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQk7OwotCSAgICAgICopCi0JCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCi0JICAgIHJwYXRoPSIkcnBhdGggJGZsYWciCi0JICBmaQotCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCSAgY2FzZSAiJGZpbmFsaXplX3Blcm1fcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3Blcm1fcnBhdGg9IiRmaW5hbGl6ZV9wZXJtX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0gICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKLQlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLSAgICAgIGZpCi0gICAgICBmaW5hbGl6ZV9ycGF0aD0iJHJwYXRoIgotCi0gICAgICBvdXRwdXRfb2JqZGlyPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIlgkb3V0cHV0X29iamRpciIgPSAiWCRvdXRwdXQiOyB0aGVuCi0Jb3V0cHV0X29iamRpcj0iJG9iamRpciIKLSAgICAgIGVsc2UKLQlvdXRwdXRfb2JqZGlyPSIkb3V0cHV0X29iamRpci8kb2JqZGlyIgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGxpYm9ianMiICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkjIFRyYW5zZm9ybSBhbGwgdGhlIGxpYnJhcnkgb2JqZWN0cyBpbnRvIHN0YW5kYXJkIG9iamVjdHMuCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0gICAgICBmaQotCi0gICAgICBkbHN5bXM9Ci0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgotCWlmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLQkgIGRsc3ltcz0iJHtvdXRwdXRuYW1lfVMuYyIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiIDE+JjIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsc3ltcyI7IHRoZW4KLQljYXNlICIkZGxzeW1zIiBpbgotCSIiKSA7OwotCSouYykKLQkgICMgRGlzY292ZXIgdGhlIG5saXN0IG9mIGVhY2ggb2YgdGhlIGRsZmlsZXMuCi0JICBubGlzdD0iJG9iamRpci8ke291dHB1dH0ubm0iCi0KLQkgIGlmIHRlc3QgLWQgJG9iamRpcjsgdGhlbgotCSAgICAkc2hvdyAiJHJtICRubGlzdCAke25saXN0fVMgJHtubGlzdH1UIgotCSAgICAkcnVuICRybSAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIgotCSAgZWxzZQotCSAgICAkc2hvdyAiJG1rZGlyICRvYmpkaXIiCi0JICAgICRydW4gJG1rZGlyICRvYmpkaXIKLQkgICAgc3RhdHVzPSQ/Ci0JICAgIGlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgJG9iamRpcjsgdGhlbgotCSAgICAgIGV4aXQgJHN0YXR1cwotCSAgICBmaQotCSAgZmkKLQotCSAgIyBQYXJzZSB0aGUgbmFtZSBsaXN0IGludG8gYSBzb3VyY2UgZmlsZS4KLQkgICRzaG93ICJjcmVhdGluZyAkb2JqZGlyLyRkbHN5bXMiCi0KLQkgICRlY2hvID4gIiRvYmpkaXIvJGRsc3ltcyIgIlwKLS8qICRkbHN5bXMgLSBzeW1ib2wgcmVzb2x1dGlvbiB0YWJsZSBmb3IgXGAkb3V0cHV0bmFtZScgZGxzeW0gZW11bGF0aW9uLiAqLwotLyogR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiBcIkNcIiB7Ci0jZW5kaWYKLQotLyogUHJldmVudCB0aGUgb25seSBraW5kIG9mIGRlY2xhcmF0aW9uIGNvbmZsaWN0cyB3ZSBjYW4gbWFrZS4gKi8KLSNkZWZpbmUgbHRfcHJlbG9hZGVkX3N5bWJvbHMgc29tZV9vdGhlcl9zeW1ib2wKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNvbXBpbGVyLiAqL1wKLSIKLQotCSAgaWYgdGVzdCAiJGRsc2VsZiIgPSB5ZXM7IHRoZW4KLQkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJG91dHB1dCciCi0KLQkgICAgZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCi0KLQkgICAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHN5bWJvbCBsaXN0LgotCSAgICBwcm9nZmlsZXM9YCRlY2hvICJYJG9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQkgICAgZm9yIGFyZyBpbiAkcHJvZ2ZpbGVzOyBkbwotCSAgICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgICAgICRydW4gZXZhbCAiJE5NICRhcmcgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgotCSAgICBkb25lCi0KLQkgICAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCi0JICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICBmaQotCSAgICAKLQkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgotCSAgICAgICRydW4gZXZhbCAnZWdyZXAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCi0JICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICBmaQotCi0JICAgICMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCi0JICAgIGlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KLQkgICAgICBleHBvcnRfc3ltYm9scz0iJG9iamRpci8kb3V0cHV0LmV4cCIKLQkgICAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKLQkgICAgICAkcnVuIGV2YWwgInNlZCAtbiAtZSAnL146IEBQUk9HUkFNQCQvZCcgLWUgJ3MvXi4qIFwoLipcKSQvXDEvcCcgIic8ICIkbmxpc3QiID4gIiRleHBvcnRfc3ltYm9scyInCi0JICAgIGVsc2UKLQkgICAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKLQkgICAgICAkcnVuIGV2YWwgInNlZCAtZSAncy9cKFtdWy4qXiRdXCkvXFxcMS9nJyAtZSAncy9eLyAvJyAtZSAncy8kLyQvJyInIDwgIiRleHBvcnRfc3ltYm9scyIgPiAiJG9iamRpci8kb3V0cHV0LmV4cCInCi0JICAgICAgJHJ1biBldmFsICdncmVwIC1mICIkb2JqZGlyLyRvdXRwdXQuZXhwIiA8ICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnbXYgIiRubGlzdCJUICIkbmxpc3QiJwotCSAgICBmaQotCSAgZmkKLQotCSAgZm9yIGFyZyBpbiAkZGxwcmVmaWxlczsgZG8KLQkgICAgJHNob3cgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGFyZyciCi0JICAgIG5hbWU9YGVjaG8gIiRhcmciIHwgc2VkIC1lICdzJV4uKi8lJSdgCi0JICAgICRydW4gZXZhbCAnZWNobyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJwotCSAgICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKLQkgIGRvbmUKLQotCSAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBhbiBlbXB0eSBmaWxlLgotCSAgICB0ZXN0IC1mICIkbmxpc3QiIHx8IDogPiAiJG5saXN0IgotCi0JICAgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICAgICAgZWdyZXAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVAotCSAgICAgICRtdiAiJG5saXN0IlQgIiRubGlzdCIKLQkgICAgZmkKLQotCSAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotCSAgICBpZiBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgfCBzb3J0ICsyIHwgdW5pcSA+ICIkbmxpc3QiUzsgdGhlbgotCSAgICAgIDoKLQkgICAgZWxzZQotCSAgICAgIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiA+ICIkbmxpc3QiUwotCSAgICBmaQotCi0JICAgIGlmIHRlc3QgLWYgIiRubGlzdCJTOyB0aGVuCi0JICAgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiUyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyInCi0JICAgIGVsc2UKLQkgICAgICBlY2hvICcvKiBOT05FICovJyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIKLQkgICAgZmkKLQotCSAgICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLQotI3VuZGVmIGx0X3ByZWxvYWRlZF9zeW1ib2xzCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXtcCi0iCi0KLQkgICAgc2VkIC1uIC1lICdzL146IFwoW14gXSpcKSAkLyAge1wiXDFcIiwgKGx0X3B0cl90KSAwfSwvcCcgXAotCQktZSAncy9eLiBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC9wJyBcCi0JCSAgPCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIKLQotCSAgICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLS8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLwotI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAotc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKLSAgcmV0dXJuIGx0X3ByZWxvYWRlZF9zeW1ib2xzOwotfQotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmXAotIgotCSAgZmkKLQotCSAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPQotICAgICAgICAgIGNhc2UgIiRob3N0IiBpbgotCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCi0JICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKLQkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKLQkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgotCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KLQkgICotKi1mcmVlYnNkMip8Ki0qLWZyZWVic2QzLjAqKQotCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLXN0YXRpYyAiKikgOzsKLQkgICAgKikgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIC1EUElDIC1ERlJFRUJTRF9XT1JLQVJPVU5EIjs7Ci0JICAgIGVzYWMKLQkgIGVzYWMKLQotCSAgIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KLQkgICRzaG93ICIoY2QgJG9iamRpciAmJiAkQ19jb21waWxlciAtYyRub19idWlsdGluX2ZsYWckcGljX2ZsYWdfZm9yX3N5bXRhYmxlIFwiJGRsc3ltc1wiKSIKLQkgICRydW4gZXZhbCAnKGNkICRvYmpkaXIgJiYgJENfY29tcGlsZXIgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSAiJGRsc3ltcyIpJyB8fCBleGl0ICQ/Ci0KLQkgICMgVHJhbnNmb3JtIHRoZSBzeW1ib2wgZmlsZSBpbnRvIHRoZSBjb3JyZWN0IG5hbWUuCi0JICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG9iamRpci8ke291dHB1dH1TLiR7b2JqZXh0fSUiYAotCSAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG9iamRpci8ke291dHB1dH1TLiR7b2JqZXh0fSUiYAotCSAgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBzdWZmaXggZm9yIFxgJGRsc3ltcyciIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0gICAgICBlbHNlCi0JIyBXZSBrZWVwIGdvaW5nIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBkaWRuJ3QgcmVmZXIgdG8KLQkjIGx0X3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCi0JIyByZWFsbHkgd2FzIHJlcXVpcmVkLgotCi0JIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KLQljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotCWZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLXogIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIiB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLQkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCi0JbGlua19jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0KLQkjIFdlIGhhdmUgbm8gdW5pbnN0YWxsZWQgbGlicmFyeSBkZXBlbmRlbmNpZXMsIHNvIGZpbmFsaXplIHJpZ2h0IG5vdy4KLQkkc2hvdyAiJGxpbmtfY29tbWFuZCIKLQkkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiCi0JZXhpdCAkPwotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0JIyBXZSBzaG91bGQgc2V0IHRoZSBzaGxpYnBhdGhfdmFyCi0JcnBhdGg9Ci0JZm9yIGRpciBpbiAkdGVtcF9ycGF0aDsgZG8KLQkgIGNhc2UgIiRkaXIiIGluCi0JICAvKiB8IFtBLVphLXpdOlsvXFxdKikKLQkgICAgIyBBYnNvbHV0ZSBwYXRoLgotCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICAgIDs7Ci0JICAqKQotCSAgICAjIFJlbGF0aXZlIHBhdGg6IGFkZCBhIHRoaXNkaXIgZW50cnkuCi0JICAgIHJwYXRoPSIkcnBhdGhcJHRoaXNkaXIvJGRpcjoiCi0JICAgIDs7Ci0JICBlc2FjCi0JZG9uZQotCXRlbXBfcnBhdGg9IiRycGF0aCIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IC1uICIkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgotCWZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKLSAgICAgIGZpCi0KLSAgICAgIGNvbXBpbGVfdmFyPQotICAgICAgZmluYWxpemVfdmFyPQotICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCWlmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgotCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgIHJwYXRoPQotCSAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgZG9uZQotCSAgY29tcGlsZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgotCWZpCi0JaWYgdGVzdCAtbiAiJGZpbmFsaXplX3Blcm1fcnBhdGgiOyB0aGVuCi0JICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgotCSAgcnBhdGg9Ci0JICBmb3IgZGlyIGluICRmaW5hbGl6ZV9wZXJtX3JwYXRoOyBkbwotCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCi0JICBkb25lCi0JICBmaW5hbGl6ZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgotCWZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgotCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCi0JCi0JIyBBR0ghIEZsYW1lIHRoZSBBSVggYW5kIEhQLVVYIHBlb3BsZSBmb3IgbWUsIHdpbGwgeWE/Ci0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBsaWtlIHVuaW5zdGFsbGVkIHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRvdXRwdXQnIHdpbGwgYmUgcmVsaW5rZWQgZHVyaW5nIGluc3RhbGxhdGlvbiIgMT4mMgotICAgICAgZWxzZQotCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiICE9IG5vOyB0aGVuCi0JICBsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkY29tcGlsZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJVwkcHJvZ2Rpci9cJGZpbGUlZydgCi0JICBlbHNlCi0JICAgICMgZmFzdF9pbnN0YWxsIGlzIHNldCB0byBuZWVkbGVzcwotCSAgICByZWxpbmtfY29tbWFuZD0KLQkgIGZpCi0JZWxzZQotCSAgbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCi0JICByZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0gICAgICBsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIiclZydgCi0gICAgICAKLSAgICAgICMgQ3JlYXRlIHRoZSBiaW5hcnkgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnksIHRoZW4gd3JhcCBpdC4KLSAgICAgIGlmIHRlc3QgISAtZCAkb3V0cHV0X29iamRpcjsgdGhlbgotCSRzaG93ICIkbWtkaXIgJG91dHB1dF9vYmpkaXIiCi0JJHJ1biAkbWtkaXIgJG91dHB1dF9vYmpkaXIKLQlzdGF0dXM9JD8KLQlpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRvYmpkaXI7IHRoZW4KLQkgIGV4aXQgJHN0YXR1cwotCWZpCi0gICAgICBmaQotCi0gICAgICAjIERlbGV0ZSB0aGUgb2xkIG91dHB1dCBmaWxlLgotICAgICAgJHJ1biAkcm0gJG91dHB1dCAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci9sdC0kb3V0cHV0bmFtZQotCi0gICAgICAkc2hvdyAiJGxpbmtfY29tbWFuZCIKLSAgICAgICRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIgfHwgZXhpdCAkPwotCi0gICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgotICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgICMgUXVvdGUgdGhlIHJlbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQlyZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZmkKLQotICAgICAgIyBRdW90ZSAkZWNobyBmb3Igc2hpcHBpbmcuCi0gICAgICBpZiB0ZXN0ICJYJGVjaG8iID0gIlgkU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIjsgdGhlbgotCWNhc2UgIiQwIiBpbgotCS8qIHwgW0EtWmEtel06Wy9cXF0qKSBxZWNobz0iJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7OwotCSopIHFlY2hvPSIkU0hFTEwgYHB3ZGAvJDAgLS1mYWxsYmFjay1lY2hvIjs7Ci0JZXNhYwotCXFlY2hvPWAkZWNobyAiWCRxZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBlbHNlCi0JcWVjaG89YCRlY2hvICJYJGVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZmkKLQotICAgICAgIyBPbmx5IGFjdHVhbGx5IGRvIHRoaW5ncyBpZiBvdXIgcnVuIGNvbW1hbmQgaXMgbm9uLW51bGwuCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcwotCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCi0JY2FzZSAkb3V0cHV0IGluCi0JICAqLmV4ZSkgb3V0cHV0PWBlY2hvICRvdXRwdXR8c2VkICdzLC5leGUkLCwnYCA7OwotCWVzYWMKLQkkcm0gJG91dHB1dAotCXRyYXAgIiRybSAkb3V0cHV0OyBleGl0IDEiIDEgMiAxNQotCi0JJGVjaG8gPiAkb3V0cHV0ICJcCi0jISAkU0hFTEwKLQotIyAkb3V0cHV0IC0gdGVtcG9yYXJ5IHdyYXBwZXIgc2NyaXB0IGZvciAkb2JqZGlyLyRvdXRwdXRuYW1lCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKLSMKLSMgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCi0jIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KLSMKLSMgVGhpcyB3cmFwcGVyIHNjcmlwdCBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIHRoZSBidWlsZCBkaXJlY3RvcnkuCi0jIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9J3NlZCAtZSAxcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JwotCi0jIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAotIyBpZiBDRFBBVEggaXMgc2V0LgotaWYgdGVzdCBcIlwke0NEUEFUSCtzZXR9XCIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTsgZXhwb3J0IENEUEFUSDsgZmkKLQotcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIgotCi0jIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZGV0ZXJtaW5lcyBvdXIgb3BlcmF0aW9uIG1vZGUuCi1pZiB0ZXN0IFwiXCRsaWJ0b29sX2luc3RhbGxfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgIyBpbnN0YWxsIG1vZGUgbmVlZHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZToKLSAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0nJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMnCi1lbHNlCi0gICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRlY2hvIGFyZSBhbHJlYWR5IHNldC4KLSAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgIGVjaG89XCIkcWVjaG9cIgotICAgIGZpbGU9XCJcJDBcIgotICAgICMgTWFrZSBzdXJlIGVjaG8gd29ya3MuCi0gICAgaWYgdGVzdCBcIlhcJDFcIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgotICAgICAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gICAgICBzaGlmdAotICAgIGVsaWYgdGVzdCBcIlhcYChcJGVjaG8gJ1x0JykgMj4vZGV2L251bGxcYFwiID0gJ1hcdCc7IHRoZW4KLSAgICAgICMgWWlwcGVlLCBcJGVjaG8gd29ya3MhCi0gICAgICA6Ci0gICAgZWxzZQotICAgICAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSBcJGVjaG8gd2lsbCB3b3JrLgotICAgICAgZXhlYyAkU0hFTEwgXCJcJDBcIiAtLW5vLXJlZXhlYyBcJHsxK1wiXCRAXCJ9Ci0gICAgZmkKLSAgZmlcCi0iCi0JJGVjaG8gPj4gJG91dHB1dCAiXAotCi0gICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCi0gIHRoaXNkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qJCUlJ1xgCi0gIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KLQotICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KLSAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgc2VkIC1uICdzLy4qLT4gLy9wJ1xgCi0gIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KLSAgICBkZXN0ZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKlwkJSUnXGAKLQotICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KLSAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCi0gICAgICBjYXNlIFwiXCRkZXN0ZGlyXCIgaW4KLSAgICAgIC8qIHwgW0EtWmEtel06Wy9cXF0qKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKLSAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotCi0gICAgZmlsZT1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyVeLiovJSUnXGAKLSAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgc2VkIC1uICdzLy4qLT4gLy9wJ1xgCi0gIGRvbmUKLQotICAjIFRyeSB0byBnZXQgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLgotICBhYnNkaXI9XGBjZCBcIlwkdGhpc2RpclwiICYmIHB3ZFxgCi0gIHRlc3QgLW4gXCJcJGFic2RpclwiICYmIHRoaXNkaXI9XCJcJGFic2RpclwiCi0iCi0KLQlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgotCSAgZWNobyA+PiAkb3V0cHV0ICJcCi0gIHByb2dyYW09bHQtJyRvdXRwdXRuYW1lJwotICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgotICAKLSAgaWYgdGVzdCAhIC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIHx8IFxcCi0gICAgIHsgZmlsZT1cYGxzIC0xZHQgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCJcJHByb2dkaXIvLi4vXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfCBzZWQgMXFcYDsgXFwKLSAgICAgICB0ZXN0IFwiWFwkZmlsZVwiICE9IFwiWFwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfTsgdGhlbgotCi0gICAgZmlsZT1cIlwkXCQtXCRwcm9ncmFtXCIKLQotICAgIGlmIHRlc3QgISAtZCBcIlwkcHJvZ2RpclwiOyB0aGVuCi0gICAgICAkbWtkaXIgXCJcJHByb2dkaXJcIgotICAgIGVsc2UKLSAgICAgICRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotICAgIGZpIgotCi0JICBlY2hvID4+ICRvdXRwdXQgIlwKLQotICAgICMgcmVsaW5rIGV4ZWN1dGFibGUgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgdGVzdCAtbiBcIlwkcmVsaW5rX2NvbW1hbmRcIjsgdGhlbgotICAgICAgaWYgKGNkIFwiXCR0aGlzZGlyXCIgJiYgZXZhbCBcJHJlbGlua19jb21tYW5kKTsgdGhlbiA6Ci0gICAgICBlbHNlCi0JJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCi0JZXhpdCAxCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAkbXYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfHwKLSAgICB7ICRybSBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsKLSAgICAgICRtdiBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfQotICAgICRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotICBmaSIKLQllbHNlCi0JICBlY2hvID4+ICRvdXRwdXQgIlwKLSAgcHJvZ3JhbT0nJG91dHB1dG5hbWUnCi0gIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCi0iCi0JZmkKLQotCWVjaG8gPj4gJG91dHB1dCAiXAotCi0gIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCi0KLQkjIEV4cG9ydCBvdXIgc2hsaWJwYXRoX3ZhciBpZiB3ZSBoYXZlIG9uZS4KLQlpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgIyBBZGQgb3VyIG93biBsaWJyYXJ5IHBhdGggdG8gJHNobGlicGF0aF92YXIKLSAgICAkc2hsaWJwYXRoX3Zhcj1cIiR0ZW1wX3JwYXRoXCQkc2hsaWJwYXRoX3ZhclwiCi0KLSAgICAjIFNvbWUgc3lzdGVtcyBjYW5ub3QgY29wZSB3aXRoIGNvbG9uLXRlcm1pbmF0ZWQgJHNobGlicGF0aF92YXIKLSAgICAjIFRoZSBzZWNvbmQgY29sb24gaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBCZU9TIFI0IHNlZAotICAgICRzaGxpYnBhdGhfdmFyPVxgXCRlY2hvIFwiWFwkJHNobGlicGF0aF92YXJcIiB8IFwkWHNlZCAtZSAncy86OipcJC8vJ1xgCi0KLSAgICBleHBvcnQgJHNobGlicGF0aF92YXIKLSIKLQlmaQotCi0JIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KLQlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAjIEFkZCB0aGUgZGxsIHNlYXJjaCBwYXRoIGNvbXBvbmVudHMgdG8gdGhlIGV4ZWN1dGFibGUgUEFUSAotICAgIFBBVEg9JGRsbHNlYXJjaHBhdGg6XCRQQVRICi0iCi0JZmkKLQotCSRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCi0gICAgICAjIFJ1biB0aGUgYWN0dWFsIHByb2dyYW0gd2l0aCBvdXIgYXJndW1lbnRzLgotIgotCWNhc2UgJGhvc3QgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyB8ICotKi1vczIqKQotCSAgIyB3aW4zMiBzeXN0ZW1zIG5lZWQgdG8gdXNlIHRoZSBwcm9nIHBhdGggZm9yIGRsbAotCSAgIyBsb29rdXAgdG8gd29yawotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICAgZXhlYyBcJHByb2dkaXJcXFxcXCRwcm9ncmFtIFwkezErXCJcJEBcIn0KLSIKLQkgIDs7Ci0JKikKLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgICMgRXhwb3J0IHRoZSBwYXRoIHRvIHRoZSBwcm9ncmFtLgotICAgICAgUEFUSD1cIlwkcHJvZ2RpcjpcJFBBVEhcIgotICAgICAgZXhwb3J0IFBBVEgKLQotICAgICAgZXhlYyBcJHByb2dyYW0gXCR7MStcIlwkQFwifQotIgotCSAgOzsKLQllc2FjCi0JJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICAgXCRlY2hvIFwiXCQwOiBjYW5ub3QgZXhlYyBcJHByb2dyYW0gXCR7MStcIlwkQFwifVwiCi0gICAgICBleGl0IDEKLSAgICBmaQotICBlbHNlCi0gICAgIyBUaGUgcHJvZ3JhbSBkb2Vzbid0IGV4aXN0LgotICAgIFwkZWNobyBcIlwkMDogZXJyb3I6IFwkcHJvZ2Rpci9cJHByb2dyYW0gZG9lcyBub3QgZXhpc3RcIiAxPiYyCi0gICAgXCRlY2hvIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCi0gICAgZWNobyBcIlNlZSB0aGUgJFBBQ0tBR0UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi1maVwKLSIKLQljaG1vZCAreCAkb3V0cHV0Ci0gICAgICBmaQotICAgICAgZXhpdCAwCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgU2VlIGlmIHdlIG5lZWQgdG8gYnVpbGQgYW4gb2xkLWZhc2hpb25lZCBhcmNoaXZlLgotICAgIGZvciBvbGRsaWIgaW4gJG9sZGxpYnM7IGRvCi0KLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gY29udmVuaWVuY2U7IHRoZW4KLQlvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgotCWFkZGxpYnM9IiRjb252ZW5pZW5jZSIKLQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLSAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG1vZHVsZTsgdGhlbgotCSAgb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKLQkgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCWVsc2UKLQkgIG9sZG9ianM9IiRvYmpzICJgJGVjaG8gIlgkbGlib2Jqc19zYXZlIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JyQvZCcgLWUgJy9cLmxpYiQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAKLQlmaQotCWFkZGxpYnM9IiRvbGRfY29udmVuaWVuY2UiCi0gICAgICBmaQotCi0gICAgICAjIEFkZCBpbiBtZW1iZXJzIGZyb20gY29udmVuaWVuY2UgYXJjaGl2ZXMuCi0gICAgICBmb3IgeGxpYiBpbiAkYWRkbGliczsgZG8KLQkjIEV4dHJhY3QgdGhlIG9iamVjdHMuCi0JeGRpcj0iJHhsaWIieAotCWdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkeGRpciIKLQl4bGliPWAkZWNobyAiWCR4bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLQkkc2hvdyAiJHtybX1yICR4ZGlyIgotCSRydW4gJHtybX1yICIkeGRpciIKLQkkc2hvdyAibWtkaXIgJHhkaXIiCi0JJHJ1biBta2RpciAiJHhkaXIiCi0Jc3RhdHVzPSQ/Ci0JaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJHhkaXIiOyB0aGVuCi0JICBleGl0ICRzdGF0dXMKLQlmaQotCSRzaG93ICIoY2QgJHhkaXIgJiYgJEFSIHggLi4vJHhsaWIpIgotCSRydW4gZXZhbCAiKGNkIFwkeGRpciAmJiAkQVIgeCAuLi9cJHhsaWIpIiB8fCBleGl0ICQ/Ci0KLQlvbGRvYmpzPSIkb2xkb2JqcyAiYGZpbmQgJHhkaXIgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAotICAgICAgZG9uZQotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXCIKLSAgICAgIGVsc2UKLQlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCi0gICAgICBmaQotICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JSUZTPSIkc2F2ZV9pZnMiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC1uICIkZ2VuZXJhdGVkIjsgdGhlbgotICAgICAgJHNob3cgIiR7cm19ciRnZW5lcmF0ZWQiCi0gICAgICAkcnVuICR7cm19ciRnZW5lcmF0ZWQKLSAgICBmaQotCi0gICAgIyBOb3cgY3JlYXRlIHRoZSBsaWJ0b29sIGFyY2hpdmUuCi0gICAgY2FzZSAiJG91dHB1dCIgaW4KLSAgICAqLmxhKQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIG9sZF9saWJyYXJ5PSIkbGlibmFtZS4kbGliZXh0IgotICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCi0JdGVtcF94cnBhdGg9Ci0JZm9yIGxpYmRpciBpbiAkeHJwYXRoOyBkbwotCSAgdGVtcF94cnBhdGg9IiR0ZW1wX3hycGF0aCAtUiRsaWJkaXIiCi0JZG9uZQotCWRlcGVuZGVuY3lfbGlicz0iJHRlbXBfeHJwYXRoICRkZXBlbmRlbmN5X2xpYnMiCi0gICAgICBmaQotCi0gICAgICAjIE9ubHkgY3JlYXRlIHRoZSBvdXRwdXQgaWYgbm90IGEgZHJ5IHJ1bi4KLSAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JJGVjaG8gPiAkb3V0cHV0ICJcCi0jICRvdXRwdXQgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCi0jIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKLQotIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCi1kbG5hbWU9JyRkbG5hbWUnCi0KLSMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgotbGlicmFyeV9uYW1lcz0nJGxpYnJhcnlfbmFtZXMnCi0KLSMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgotb2xkX2xpYnJhcnk9JyRvbGRfbGlicmFyeScKLQotIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCi1kZXBlbmRlbmN5X2xpYnM9JyRkZXBlbmRlbmN5X2xpYnMnCi0KLSMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCi1jdXJyZW50PSRjdXJyZW50Ci1hZ2U9JGFnZQotcmV2aXNpb249JHJldmlzaW9uCi0KLSMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PwotaW5zdGFsbGVkPW5vCi0KLSMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKLWxpYmRpcj0nJGluc3RhbGxfbGliZGlyJ1wKLSIKLQotCSRybSAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaQotCXNlZCAncy9eaW5zdGFsbGVkPW5vJC9pbnN0YWxsZWQ9eWVzLycgXAotCSAgPCAiJG91dHB1dCIgPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaSB8fCBleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgICMgRG8gYSBzeW1ib2xpYyBsaW5rIHNvIHRoYXQgdGhlIGxpYnRvb2wgYXJjaGl2ZSBjYW4gYmUgZm91bmQgaW4KLSAgICAgICMgTERfTElCUkFSWV9QQVRIIGJlZm9yZSB0aGUgcHJvZ3JhbSBpcyBpbnN0YWxsZWQuCi0gICAgICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkb3V0cHV0bmFtZSAmJiAkTE5fUyAuLi8kb3V0cHV0bmFtZSAkb3V0cHV0bmFtZSkiCi0gICAgICAkcnVuIGV2YWwgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpIiB8fCBleGl0ICQ/Ci0gICAgICA7OwotICAgIGVzYWMKLSAgICBleGl0IDAKLSAgICA7OwotCi0gICMgbGlidG9vbCBpbnN0YWxsIG1vZGUKLSAgaW5zdGFsbCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBpbnN0YWxsIgotCi0gICAgIyBUaGVyZSBtYXkgYmUgYW4gb3B0aW9uYWwgc2goMSkgYXJndW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgICMgaW5zdGFsbF9wcm9nIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MgTlQpLgotICAgIGlmIHRlc3QgIiRub25vcHQiID0gIiRTSEVMTCIgfHwgdGVzdCAiJG5vbm9wdCIgPSAvYmluL3NoOyB0aGVuCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgICBhcmc9YCRlY2hvICJYJG5vbm9wdCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkYXJnICIKLSAgICAgIGFyZz0iJDEiCi0gICAgICBzaGlmdAotICAgIGVsc2UKLSAgICAgIGluc3RhbGxfcHJvZz0KLSAgICAgIGFyZz0iJG5vbm9wdCIKLSAgICBmaQotCi0gICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgotICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgY2FzZSAiJGFyZyIgaW4KLSAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLSAgICAgIGFyZz0iXCIkYXJnXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2ckYXJnIgotCi0gICAgIyBXZSBuZWVkIHRvIGFjY2VwdCBhdCBsZWFzdCBhbGwgdGhlIEJTRCBpbnN0YWxsIGZsYWdzLgotICAgIGRlc3Q9Ci0gICAgZmlsZXM9Ci0gICAgb3B0cz0KLSAgICBwcmV2PQotICAgIGluc3RhbGxfdHlwZT0KLSAgICBpc2Rpcj1ubwotICAgIHN0cmlwbWU9Ci0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBpZiB0ZXN0IC1uICIkZGVzdCI7IHRoZW4KLQlmaWxlcz0iJGZpbGVzICRkZXN0IgotCWRlc3Q9IiRhcmciCi0JY29udGludWUKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtZCkgaXNkaXI9eWVzIDs7Ci0gICAgICAtZikgcHJldj0iLWYiIDs7Ci0gICAgICAtZykgcHJldj0iLWciIDs7Ci0gICAgICAtbSkgcHJldj0iLW0iIDs7Ci0gICAgICAtbykgcHJldj0iLW8iIDs7Ci0gICAgICAtcykKLQlzdHJpcG1lPSIgLXMiCi0JY29udGludWUKLQk7OwotICAgICAgLSopIDs7Ci0KLSAgICAgICopCi0JIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgotCWlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotCSAgcHJldj0KLQllbHNlCi0JICBkZXN0PSIkYXJnIgotCSAgY29udGludWUKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCi0gICAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nICRhcmciCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJGluc3RhbGxfcHJvZyI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXogIiRmaWxlcyI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogIiRkZXN0IjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IG5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIiAxPiYyCi0gICAgICBlbHNlCi0JJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIiAxPiYyCi0gICAgICBmaQotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCi0gICAgZGVzdD1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvJCUlJ2AKLQotICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgotICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKLSAgICBpZiB0ZXN0ICIkaXNkaXIiID0geWVzOyB0aGVuCi0gICAgICBkZXN0ZGlyPSIkZGVzdCIKLSAgICAgIGRlc3RuYW1lPQotICAgIGVsc2UKLSAgICAgIGRlc3RkaXI9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRkZXN0IiAmJiBkZXN0ZGlyPS4KLSAgICAgIGRlc3RuYW1lPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSAgICAgICMgTm90IGEgZGlyZWN0b3J5LCBzbyBjaGVjayB0byBzZWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBmaWxlIHNwZWNpZmllZC4KLSAgICAgIHNldCBkdW1teSAkZmlsZXMKLSAgICAgIGlmIHRlc3QgJCMgLWd0IDI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0gICAgZmkKLSAgICBjYXNlICIkZGVzdGRpciIgaW4KLSAgICAvKiB8IFtBLVphLXpdOlsvXFxdKikgOzsKLSAgICAqKQotICAgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotCWNhc2UgIiRmaWxlIiBpbgotCSoubG8pIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCi0gICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCi0KLSAgICBzdGF0aWNsaWJzPQotICAgIGZ1dHVyZV9saWJkaXJzPQotICAgIGN1cnJlbnRfbGliZGlycz0KLSAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0KLSAgICAgICMgRG8gZWFjaCBpbnN0YWxsYXRpb24uCi0gICAgICBjYXNlICIkZmlsZSIgaW4KLSAgICAgICouYSB8ICoubGliKQotCSMgRG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbGF0ZXIuCi0Jc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGZpbGUiCi0JOzsKLQotICAgICAgKi5sYSkKLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQlsaWJyYXJ5X25hbWVzPQotCW9sZF9saWJyYXJ5PQotCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCWNhc2UgIiRmaWxlIiBpbgotCSovKiB8ICpcXCopIC4gJGZpbGUgOzsKLQkqKSAuIC4vJGZpbGUgOzsKLQllc2FjCi0KLQkjIEFkZCB0aGUgbGliZGlyIHRvIGN1cnJlbnRfbGliZGlycyBpZiBpdCBpcyB0aGUgZGVzdGluYXRpb24uCi0JaWYgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGxpYmRpciI7IHRoZW4KLQkgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGN1cnJlbnRfbGliZGlycz0iJGN1cnJlbnRfbGliZGlycyAkbGliZGlyIiA7OwotCSAgZXNhYwotCWVsc2UKLQkgICMgTm90ZSB0aGUgbGliZGlyIGFzIGEgZnV0dXJlIGxpYmRpci4KLQkgIGNhc2UgIiRmdXR1cmVfbGliZGlycyAiIGluCi0JICAqIiAkbGliZGlyICIqKSA7OwotCSAgKikgZnV0dXJlX2xpYmRpcnM9IiRmdXR1cmVfbGliZGlycyAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0KLQlkaXI9ImAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgLyIKLQl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlLyIgJiYgZGlyPQotCWRpcj0iJGRpciRvYmpkaXIiCi0KLQkjIFNlZSB0aGUgbmFtZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgotCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcwotCWlmIHRlc3QgLW4gIiQyIjsgdGhlbgotCSAgcmVhbG5hbWU9IiQyIgotCSAgc2hpZnQKLQkgIHNoaWZ0Ci0KLQkgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRkaXIvJHJlYWxuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIKLQkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZGlyLyRyZWFsbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiIHx8IGV4aXQgJD8KLQkgIHRlc3QgIlgkZGxuYW1lIiA9ICJYJHJlYWxuYW1lIiAmJiBkbG5hbWU9Ci0KLQkgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLQkgICAgIyBEZWxldGUgdGhlIG9sZCBzeW1saW5rcywgYW5kIGNyZWF0ZSBuZXcgb25lcy4KLQkgICAgZm9yIGxpbmtuYW1lCi0JICAgIGRvCi0JICAgICAgdGVzdCAiWCRkbG5hbWUiID0gIlgkbGlua25hbWUiICYmIGRsbmFtZT0KLQkgICAgICBpZiB0ZXN0ICIkbGlua25hbWUiICE9ICIkcmVhbG5hbWUiOyB0aGVuCi0JCSRzaG93ICIoY2QgJGRlc3RkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKLQkJJHJ1biBldmFsICIoY2QgJGRlc3RkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKLQkgICAgICBmaQotCSAgICBkb25lCi0JICBmaQotCi0JICBpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgotCSAgICAjIEluc3RhbGwgdGhlIGR5bmFtaWNhbGx5LWxvYWRhYmxlIGxpYnJhcnkuCi0JICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSAkZGVzdGRpci8kZGxuYW1lIgotCSAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lICRkZXN0ZGlyLyRkbG5hbWUiIHx8IGV4aXQgJD8KLQkgIGZpCi0KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KLQkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgotCSAgZXZhbCBjbWRzPVwiJHBvc3RpbnN0YWxsX2NtZHNcIgotCSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAkc2hvdyAiJGNtZCIKLQkgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JICBkb25lCi0JICBJRlM9IiRzYXZlX2lmcyIKLQlmaQotCi0JIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCi0JbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCWluc3RuYW1lPSIkZGlyLyRuYW1lImkKLQlpZiB0ZXN0ICEgLWYgIiRpbnN0bmFtZSI7IHRoZW4KLQkgICMgSnVzdCBpbiBjYXNlIGl0IHdhcyByZW1vdmVkLi4uCi0JICAkc2hvdyAiQ3JlYXRpbmcgJGluc3RuYW1lIgotCSAgJHJtICIkaW5zdG5hbWUiCi0JICBzZWQgJ3MvXmluc3RhbGxlZD1ubyQvaW5zdGFsbGVkPXllcy8nICIkZmlsZSIgPiAiJGluc3RuYW1lIgotCWZpCi0JJHNob3cgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIgotCSRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiIHx8IGV4aXQgJD8KLQotCSMgTWF5YmUgaW5zdGFsbCB0aGUgc3RhdGljIGxpYnJhcnksIHRvby4KLQl0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBJbnN0YWxsIChpLmUuIGNvcHkpIGEgbGlidG9vbCBvYmplY3QuCi0KLQkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKLQllbHNlCi0JICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKLQlmaQotCi0JIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KLQljYXNlICIkZGVzdGZpbGUiIGluCi0JKi5sbykKLQkgIHN0YXRpY2Rlc3Q9YCRlY2hvICJYJGRlc3RmaWxlIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JICA7OwotCSoubyB8ICoub2JqKQotCSAgc3RhdGljZGVzdD0iJGRlc3RmaWxlIgotCSAgZGVzdGZpbGU9Ci0JICA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgY29weSBhIGxpYnRvb2wgb2JqZWN0IHRvIFxgJGRlc3RmaWxlJyIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JIyBJbnN0YWxsIHRoZSBsaWJ0b29sIG9iamVjdCBpZiByZXF1ZXN0ZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RmaWxlIjsgdGhlbgotCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIgfHwgZXhpdCAkPwotCWZpCi0KLQkjIEluc3RhbGwgdGhlIG9sZCBvYmplY3QgaWYgZW5hYmxlZC4KLQlpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JICAjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgb2xkLXN0eWxlIG9iamVjdCBmaWxlLgotCSAgc3RhdGljb2JqPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRzdGF0aWNvYmogJHN0YXRpY2Rlc3QiCi0JICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRzdGF0aWNvYmogXCRzdGF0aWNkZXN0IiB8fCBleGl0ICQ/Ci0JZmkKLQlleGl0IDAKLQk7OwotCi0gICAgICAqKQotCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KLQlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgotCWVsc2UKLQkgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0JICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgotCWZpCi0KLQkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCi0JaWYgKHNlZCAtZSAnNHEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICBsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzPQotCSAgcmVsaW5rX2NvbW1hbmQ9Ci0KLQkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCSAgY2FzZSAiJGZpbGUiIGluCi0JICAqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JICAqKSAuIC4vJGZpbGUgOzsKLQkgIGVzYWMKLQotCSAgIyBDaGVjayB0aGUgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBzZXQuCi0JICBpZiB0ZXN0IC16ICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IFxgJGZpbGUnIiAxPiYyCi0JICAgIGV4aXQgMQotCSAgZmkKLQotCSAgZmluYWxpemU9eWVzCi0JICBmb3IgbGliIGluICRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzOyBkbwotCSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IGVhY2ggbGlicmFyeSBpcyBpbnN0YWxsZWQuCi0JICAgIGxpYmRpcj0KLQkgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KLQkgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgICAgICBjYXNlICIkbGliIiBpbgotCSAgICAgICovKiB8ICpcXCopIC4gJGxpYiA7OwotCSAgICAgICopIC4gLi8kbGliIDs7Ci0JICAgICAgZXNhYwotCSAgICBmaQotCSAgICBsaWJmaWxlPSIkbGliZGlyL2AkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlZydgIgotCSAgICBpZiB0ZXN0IC1uICIkbGliZGlyIiAmJiB0ZXN0ICEgLWYgIiRsaWJmaWxlIjsgdGhlbgotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGxpYicgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBpbiBcYCRsaWJkaXInIiAxPiYyCi0JICAgICAgZmluYWxpemU9bm8KLQkgICAgZmkKLQkgIGRvbmUKLQotCSAgb3V0cHV0bmFtZT0KLQkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0gbm8gJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgotCSAgICBpZiB0ZXN0ICIkZmluYWxpemUiID0geWVzOyB0aGVuCi0JICAgICAgb3V0cHV0bmFtZT0iL3RtcC8kJC0kZmlsZSIKLQkgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0JICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dG5hbWUiJyVnJ2AKLQotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbGlua2luZyBcYCRmaWxlJyBvbiBiZWhhbGYgb2YgeW91ciBidWdneSBzeXN0ZW0gbGlua2VyIiAxPiYyCi0JICAgICAgJHNob3cgIiRyZWxpbmtfY29tbWFuZCIKLQkgICAgICBpZiAkcnVuIGV2YWwgIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4gOgotCSAgICAgIGVsc2UKLQkJJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IiAxPiYyCi0JCWNvbnRpbnVlCi0JICAgICAgZmkKLQkgICAgICBmaWxlPSIkb3V0cHV0bmFtZSIKLQkgICAgZWxzZQotCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCByZWxpbmsgXGAkZmlsZScgb24gYmVoYWxmIG9mIHlvdXIgYnVnZ3kgc3lzdGVtIGxpbmtlciIgMT4mMgotCSAgICBmaQotCSAgZWxzZQotCSAgICAjIEluc3RhbGwgdGhlIGJpbmFyeSB0aGF0IHdlIGNvbXBpbGVkIGVhcmxpZXIuCi0JICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgInMlXChbXi9dKlwpJCUkb2JqZGlyL1wxJSJgCi0JICBmaQotCWZpCi0KLQkkc2hvdyAiJGluc3RhbGxfcHJvZyRzdHJpcG1lICRmaWxlICRkZXN0ZmlsZSIKLQkkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2dcJHN0cmlwbWUgXCRmaWxlIFwkZGVzdGZpbGUiIHx8IGV4aXQgJD8KLQl0ZXN0IC1uICIkb3V0cHV0bmFtZSIgJiYgJHJtICRvdXRwdXRuYW1lCi0JOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KLSAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgIyBTZXQgdXAgdGhlIHJhbmxpYiBwYXJhbWV0ZXJzLgotICAgICAgb2xkbGliPSIkZGVzdGRpci8kbmFtZSIKLQotICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJG9sZGxpYiIKLSAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiIHx8IGV4aXQgJD8KLQotICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgotICAgICAgZXZhbCBjbWRzPVwiJG9sZF9wb3N0aW5zdGFsbF9jbWRzXCIKLSAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCUlGUz0iJHNhdmVfaWZzIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVtZW1iZXIgdG8gcnVuIFxgJHByb2duYW1lIC0tZmluaXNoJGZ1dHVyZV9saWJkaXJzJyIgMT4mMgotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgotICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KLSAgICAgIHRlc3QgLW4gIiRydW4iICYmIGN1cnJlbnRfbGliZGlycz0iIC1uJGN1cnJlbnRfbGliZGlycyIKLSAgICAgIGV4ZWMgJFNIRUxMICQwIC0tZmluaXNoJGN1cnJlbnRfbGliZGlycwotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGZpbmlzaCBtb2RlCi0gIGZpbmlzaCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBmaW5pc2giCi0gICAgbGliZGlycz0iJG5vbm9wdCIKLSAgICBhZG1pbmNtZHM9Ci0KLSAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgotICAgICAgZm9yIGRpcgotICAgICAgZG8KLQlsaWJkaXJzPSIkbGliZGlycyAkZGlyIgotICAgICAgZG9uZQotCi0gICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwotCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KLQkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCi0JICBldmFsIGNtZHM9XCIkZmluaXNoX2NtZHNcIgotCSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAkc2hvdyAiJGNtZCIKLQkgICAgJHJ1biBldmFsICIkY21kIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKLSAgICAgICAkY21kIgotCSAgZG9uZQotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JZmkKLQlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCi0JICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCi0JICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgotCSAgJHJ1biBldmFsICIkY21kcyIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCi0gICAgICAgJGNtZHMiCi0JZmkKLSAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCi0gICAgdGVzdCAiJHNob3ciID0gOiAmJiBleGl0IDAKLQotICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgZWNobyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgotICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0gICAgICBlY2hvICIgICAkbGliZGlyIgotICAgIGRvbmUKLSAgICBlY2hvCi0gICAgZWNobyAiSWYgeW91IGV2ZXIgaGFwcGVuIHRvIHdhbnQgdG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMiCi0gICAgZWNobyAiaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwgeW91IG11c3QgZWl0aGVyIHVzZSBsaWJ0b29sLCBhbmQiCi0gICAgZWNobyAic3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgbGlicmFyeSwgb3IgdXNlIFxgLUxMSUJESVInIgotICAgIGVjaG8gImZsYWcgZHVyaW5nIGxpbmtpbmcgYW5kIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKLSAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkc2hsaWJwYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICBlY2hvICIgICAgIGR1cmluZyBleGVjdXRpb24iCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKLSAgICAgIGVjaG8gIiAgICAgZHVyaW5nIGxpbmtpbmciCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KLSAgICAgIGxpYmRpcj1MSUJESVIKLSAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQotICAgICAgZWNobyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJGFkbWluY21kcyI7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJ1biB0aGVzZSBjb21tYW5kczokYWRtaW5jbWRzIgotICAgIGZpCi0gICAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KLSAgICAgIGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGFkZCBMSUJESVIgdG8gXGAvZXRjL2xkLnNvLmNvbmYnIgotICAgIGZpCi0gICAgZWNobwotICAgIGVjaG8gIlNlZSBhbnkgb3BlcmF0aW5nIHN5c3RlbSBkb2N1bWVudGF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMgZm9yIgotICAgIGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgotICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgZXhlY3V0ZSBtb2RlCi0gIGV4ZWN1dGUpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZXhlY3V0ZSIKLQotICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCi0gICAgY21kPSIkbm9ub3B0IgotICAgIGlmIHRlc3QgLXogIiRjbWQiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgQ09NTUFORCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgICMgSGFuZGxlIC1kbG9wZW4gZmxhZ3MgaW1tZWRpYXRlbHkuCi0gICAgZm9yIGZpbGUgaW4gJGV4ZWN1dGVfZGxmaWxlczsgZG8KLSAgICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgZmlsZSIgMT4mMgotCSRlY2hvICIkaGVscCIgMT4mMgotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgZGlyPQotICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAqLmxhKQotCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0JaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JIyBSZWFkIHRoZSBsaWJ0b29sIGxpYnJhcnkuCi0JZGxuYW1lPQotCWxpYnJhcnlfbmFtZXM9Ci0KLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICIkZmlsZSIgaW4KLQkqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JKikgLiAuLyRmaWxlIDs7Ci0JZXNhYwotCi0JIyBTa2lwIHRoaXMgbGlicmFyeSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQuCi0JaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KLQkgICMgV2FybiBpZiBpdCB3YXMgYSBzaGFyZWQgbGlicmFyeS4KLQkgIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJiAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRmaWxlJyB3YXMgbm90IGxpbmtlZCB3aXRoIFxgLWV4cG9ydC1keW5hbWljJyIKLQkgIGNvbnRpbnVlCi0JZmkKLQotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0KLQlpZiB0ZXN0IC1mICIkZGlyLyRvYmpkaXIvJGRsbmFtZSI7IHRoZW4KLQkgIGRpcj0iJGRpci8kb2JqZGlyIgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCi0JZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KLQk7OwotCi0gICAgICAqKQotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmcgXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiIDE+JjIKLQljb250aW51ZQotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KLSAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKLSAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKLQotICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KLSAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCi0JZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgotICAgICAgZWxzZQotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgotICAgICAgZmkKLSAgICBkb25lCi0KLSAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKLSAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCi0gICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCi0KLSAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCi0gICAgYXJncz0KLSAgICBmb3IgZmlsZQotICAgIGRvCi0gICAgICBjYXNlICIkZmlsZSIgaW4KLSAgICAgIC0qKSA7OwotICAgICAgKikKLQkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCi0JaWYgKHNlZCAtZSAnNHEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgIiRmaWxlIiBpbgotCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSAgKikgLiAuLyRmaWxlIDs7Ci0JICBlc2FjCi0KLQkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCi0JICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKLQlmaQotCTs7Ci0gICAgICBlc2FjCi0gICAgICAjIFF1b3RlIGFyZ3VtZW50cyAodG8gcHJlc2VydmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMpLgotICAgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBhcmdzPSIkYXJncyBcIiRmaWxlXCIiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLSAgICAgICMgRXhwb3J0IHRoZSBzaGxpYnBhdGhfdmFyLgotICAgICAgZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotCi0gICAgICAjIFJlc3RvcmUgc2F2ZWQgZW52aXJvbWVudCB2YXJpYWJsZXMKLSAgICAgIGlmIHRlc3QgIiR7c2F2ZV9MQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KLQlMQ19BTEw9IiRzYXZlX0xDX0FMTCI7IGV4cG9ydCBMQ19BTEwKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIke3NhdmVfTEFORytzZXR9IiA9IHNldDsgdGhlbgotCUxBTkc9IiRzYXZlX0xBTkciOyBleHBvcnQgTEFORwotICAgICAgZmkKLQotICAgICAgIyBOb3cgYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KLSAgICAgIGV2YWwgImV4ZWMgXCRjbWQkYXJncyIKLQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGV4ZWMgXCRjbWQkYXJncyIKLSAgICAgIGV4aXQgMQotICAgIGVsc2UKLSAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCi0gICAgICBldmFsICJcJGVjaG8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgotICAgICAgJGVjaG8gImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLSAgICAgICRlY2hvICIkY21kJGFyZ3MiCi0gICAgICBleGl0IDAKLSAgICBmaQotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIHVuaW5zdGFsbCBtb2RlCi0gIHVuaW5zdGFsbCkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiB1bmluc3RhbGwiCi0gICAgcm09IiRub25vcHQiCi0gICAgZmlsZXM9Ci0KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtKikgcm09IiRybSAkYXJnIiA7OwotICAgICAgKikgZmlsZXM9IiRmaWxlcyAkYXJnIiA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRybSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotICAgICAgZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICB0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgotICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICBybWZpbGVzPSIkZmlsZSIKLQotICAgICAgY2FzZSAiJG5hbWUiIGluCi0gICAgICAqLmxhKQotCSMgUG9zc2libHkgYSBsaWJ0b29sIGFyY2hpdmUsIHNvIHZlcmlmeSBpdC4KLQlpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgIC4gJGRpci8kbmFtZQotCi0JICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgotCSAgZm9yIG4gaW4gJGxpYnJhcnlfbmFtZXM7IGRvCi0JICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG4iCi0JICAgIHRlc3QgIlgkbiIgPSAiWCRkbG5hbWUiICYmIGRsbmFtZT0KLQkgIGRvbmUKLQkgIHRlc3QgLW4gIiRkbG5hbWUiICYmIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJGRsbmFtZSIKLQkgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCi0KLQkgICRzaG93ICIkcm0gJHJtZmlsZXMiCi0JICAkcnVuICRybSAkcm1maWxlcwotCi0JICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KLQkgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3R1bmluc3RhbGwgY29tbWFuZHMuCi0JICAgIGV2YWwgY21kcz1cIiRwb3N0dW5pbnN0YWxsX2NtZHNcIgotCSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAgICRzaG93ICIkY21kIgotCSAgICAgICRydW4gZXZhbCAiJGNtZCIKLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgIGZpCi0KLQkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLQkgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIG9sZF9wb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICBldmFsIGNtZHM9XCIkb2xkX3Bvc3R1bmluc3RhbGxfY21kc1wiCi0JICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgJHNob3cgIiRjbWQiCi0JICAgICAgJHJ1biBldmFsICIkY21kIgotCSAgICBkb25lCi0JICAgIElGUz0iJHNhdmVfaWZzIgotCSAgZmkKLQotCSAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCi0JZmkKLQk7OwotCi0gICAgICAqLmxvKQotCWlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLQkgIG9sZG9iaj1gJGVjaG8gIlgkbmFtZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kb2xkb2JqIgotCWZpCi0JJHNob3cgIiRybSAkcm1maWxlcyIKLQkkcnVuICRybSAkcm1maWxlcwotCTs7Ci0KLSAgICAgICopCi0JJHNob3cgIiRybSAkcm1maWxlcyIKLQkkcnVuICRybSAkcm1maWxlcwotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIiIpCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIE1PREUiIDE+JjIKLSAgICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgotICAgIGV4aXQgMQotICAgIDs7Ci0gIGVzYWMKLQotICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCi0gICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkgIyB0ZXN0IC16ICIkc2hvd19oZWxwIgotCi0jIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KLWNhc2UgIiRtb2RlIiBpbgotIiIpICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KLQotUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0KLSAgICAtLWNvbmZpZyAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcwotICAgIC0tZGVidWcgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKLS1uLCAtLWRyeS1ydW4gICAgICAgICBkaXNwbGF5IGNvbW1hbmRzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueSBmaWxlcwotICAgIC0tZmVhdHVyZXMgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotICAgIC0tZmluaXNoICAgICAgICAgIHNhbWUgYXMgXGAtLW1vZGU9ZmluaXNoJwotICAgIC0taGVscCAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKLSAgICAtLW1vZGU9TU9ERSAgICAgICB1c2Ugb3BlcmF0aW9uIG1vZGUgTU9ERSBbZGVmYXVsdD1pbmZlcnJlZCBmcm9tIE1PREUtQVJHU10KLSAgICAtLXF1aWV0ICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCi0gICAgLS1zaWxlbnQgICAgICAgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcwotICAgIC0tdmVyc2lvbiAgICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KLQotTU9ERSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgICBjb21waWxlICAgICAgICAgY29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIG9iamVjdAotICAgICAgZXhlY3V0ZSAgICAgICAgIGF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtCi0gICAgICBmaW5pc2ggICAgICAgICAgY29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcwotICAgICAgaW5zdGFsbCAgICAgICAgIGluc3RhbGwgbGlicmFyaWVzIG9yIGV4ZWN1dGFibGVzCi0gICAgICBsaW5rICAgICAgICAgICAgY3JlYXRlIGEgbGlicmFyeSBvciBhbiBleGVjdXRhYmxlCi0gICAgICB1bmluc3RhbGwgICAgICAgcmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxlZCBkaXJlY3RvcnkKLQotTU9ERS1BUkdTIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBNT0RFLiAgVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9TU9ERScgZm9yCi1hIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4iCi0gIGV4aXQgMAotICA7OwotCi1jb21waWxlKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y29tcGlsZSBDT01QSUxFLUNPTU1BTkQuLi4gU09VUkNFRklMRQotCi1Db21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgbGlicmFyeSBvYmplY3QuCi0KLVRoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgotCi0gIC1vIE9VVFBVVC1GSUxFICAgIHNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSB0byBPVVRQVVQtRklMRQotICAtc3RhdGljICAgICAgICAgICBhbHdheXMgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZwotCi1DT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQotZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KLQotVGhlIG91dHB1dCBmaWxlIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSByZW1vdmluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBmcm9tCi1TT1VSQ0VGSUxFLCB0aGVuIHN1YnN0aXR1dGluZyB0aGUgQyBzb3VyY2UgY29kZSBzdWZmaXggXGAuYycgd2l0aCB0aGUKLWxpYnJhcnkgb2JqZWN0IHN1ZmZpeCwgXGAubG8nLiIKLSAgOzsKLQotZXhlY3V0ZSkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWV4ZWN1dGUgQ09NTUFORCBbQVJHU10uLi4KLQotQXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0uCi0KLVRoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgotCi0gIC1kbG9wZW4gRklMRSAgICAgIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRklMRSB0byB0aGUgbGlicmFyeSBwYXRoCi0KLVRoaXMgbW9kZSBzZXRzIHRoZSBsaWJyYXJ5IHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIFxgLWRsb3BlbicKLWZsYWdzLgotCi1JZiBhbnkgb2YgdGhlIEFSR1MgYXJlIGxpYnRvb2wgZXhlY3V0YWJsZSB3cmFwcGVycywgdGhlbiB0aGV5IGFyZSB0cmFuc2xhdGVkCi1pbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdW5pbnN0YWxsZWQgYmluYXJ5LCBhbmQgYW55IG9mIHRoZWlyIHJlcXVpcmVkIGxpYnJhcnkKLWRpcmVjdG9yaWVzIGFyZSBhZGRlZCB0byB0aGUgbGlicmFyeSBwYXRoLgotCi1UaGVuLCBDT01NQU5EIGlzIGV4ZWN1dGVkLCB3aXRoIEFSR1MgYXMgYXJndW1lbnRzLiIKLSAgOzsKLQotZmluaXNoKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZmluaXNoIFtMSUJESVJdLi4uCi0KLUNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMuCi0KLUVhY2ggTElCRElSIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgbGlidG9vbCBsaWJyYXJpZXMuCi0KLVRoZSBjb21tYW5kcyB0aGF0IHRoaXMgbW9kZSBleGVjdXRlcyBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4gIFVzZQotdGhlIFxgLS1kcnktcnVuJyBvcHRpb24gaWYgeW91IGp1c3Qgd2FudCB0byBzZWUgd2hhdCB3b3VsZCBiZSBleGVjdXRlZC4iCi0gIDs7Ci0KLWluc3RhbGwpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1pbnN0YWxsIElOU1RBTEwtQ09NTUFORC4uLgotCi1JbnN0YWxsIGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcy4KLQotSU5TVEFMTC1DT01NQU5EIGlzIHRoZSBpbnN0YWxsYXRpb24gY29tbWFuZC4gIFRoZSBmaXJzdCBjb21wb25lbnQgc2hvdWxkIGJlCi1laXRoZXIgdGhlIFxgaW5zdGFsbCcgb3IgXGBjcCcgcHJvZ3JhbS4KLQotVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKLUJTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgotICA7OwotCi1saW5rKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KLQotTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bwotY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KLQotTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCi1hIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KLQotVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6Ci0KLSAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCi0gIC1hdm9pZC12ZXJzaW9uICAgIGRvIG5vdCBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCBpZiBwb3NzaWJsZQotICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKLSAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gbHRfcHJlbG9hZGVkX3N5bWJvbHMKLSAgLWV4cG9ydC1keW5hbWljICAgYWxsb3cgc3ltYm9scyBmcm9tIE9VVFBVVC1GSUxFIHRvIGJlIHJlc29sdmVkIHdpdGggZGxzeW0oMykKLSAgLWV4cG9ydC1zeW1ib2xzIFNZTUZJTEUKLQkJICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBsaXN0ZWQgaW4gU1lNRklMRQotICAtTExJQkRJUiAgICAgICAgICBzZWFyY2ggTElCRElSIGZvciByZXF1aXJlZCBpbnN0YWxsZWQgbGlicmFyaWVzCi0gIC1sTkFNRSAgICAgICAgICAgIE9VVFBVVC1GSUxFIHJlcXVpcmVzIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBsaWJOQU1FCi0gIC1tb2R1bGUgICAgICAgICAgIGJ1aWxkIGEgbGlicmFyeSB0aGF0IGNhbiBkbG9wZW5lZAotICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKLSAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCi0gIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCi0gIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKLSAgLVJbIF1MSUJESVIgICAgICAgYWRkIExJQkRJUiB0byB0aGUgcnVudGltZSBwYXRoIG9mIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKLSAgLXN0YXRpYyAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKLSAgLXZlcnNpb24taW5mbyBDVVJSRU5UWzpSRVZJU0lPTls6QUdFXV0KLQkJICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KLQotQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KLQotRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKLXRyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5Ci1vYmplY3QgZmlsZXMuCi0KLUlmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLAotb25seSBsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcwotcmVxdWlyZWQsIGV4Y2VwdCB3aGVuIGNyZWF0aW5nIGEgY29udmVuaWVuY2UgbGlicmFyeS4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJyBvciBcYC5saWInLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkCi11c2luZyBcYGFyJyBhbmQgXGByYW5saWInLCBvciBvbiBXaW5kb3dzIHVzaW5nIFxgbGliJy4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAuJHtvYmpleHR9JywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUKLWlzIGNyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCi0gIDs7Ci0KLXVuaW5zdGFsbCkKLSAgJGVjaG8KLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT11bmluc3RhbGwgUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgotCi1SZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQotUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCi0odHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCi10byBSTS4KLQotSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGRlbGV0ZWQuCi1PdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCi0gIDs7Ci0KLSopCi0gICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKLSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotICA7OwotZXNhYwotCi1lY2hvCi0kZWNobyAiVHJ5IFxgJG1vZGVuYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMuIgotCi1leGl0IDAKLQotIyBMb2NhbCBWYXJpYWJsZXM6Ci0jIG1vZGU6c2hlbGwtc2NyaXB0Ci0jIHNoLWluZGVudGF0aW9uOjIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvbWFrZWZpbGUudm1zIGIvbWFrZWZpbGUudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWUzNjM0Li4wMDAwMDAwCi0tLSBhL21ha2VmaWxlLnZtcworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLSMKLSMgbWFrZWZpbGUgZm9yIGJmZCwgYmludXRpbHMgYW5kIGdhcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0jCi0jIFlvdSBtdXN0IHVzZSBWZXJzaW9uIDMuNzYgb2YgR05VIE1ha2UKLSMKLSMKLQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLUNDID0gZ2NjCi1HQVNDQyA9ICQoQ0MpCi1lbHNlCi1DQyA9IGNjCi1HQVNDQyA9IGdjYwotZW5kaWYKLQotaWZlcSAoJChDQyksY2MpCi0gIENIRUNLLUNPTVBJTEVSID0gY2hlY2tfY29tcGlsZXIKLWVsc2UKLSAgQ0hFQ0stQ09NUElMRVIgPQotZW5kaWYKLQotYWxsOgljaGVja19jYyAkKENIRUNLLUNPTVBJTEVSKSBbLmJpbnV0aWxzXW1ha2VmaWxlLnZtcwotCSQoQ0QpIFsuYmZkXQotCUBnbWFrZSAiQ0M9JChDQykiCi0JJChDRCkgWy0ub3Bjb2Rlc10KLQlAZ21ha2UgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLmxpYmliZXJ0eV0KLQlAZ21ha2UgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLmJpbnV0aWxzXQotCUBnbWFrZSAiQ0M9JChDQykiCi0JJChDRCkgWy0uZ2FzXQotCUBnbWFrZSAiQ0M9JChHQVNDQykiCi0JJChDRCkgWy1dCi0KLWNoZWNrX2NjOgotaWZlcSAoJENDLCkKLQlAJChFQ0hPKSAiUGxlYXNlIGVkaXQgTUFLRUZJTEUuVk1TIGFuZCBzZWxlY3QgYSBDIENvbXBpbGVyLiIKLQlzdG9wCi1lbmRpZgotCi1jaGVja19jb21waWxlcjoKLQlAJChFQ0hPKSAiUGVyZm9ybSBhICckJCBAc2V0dXAnIGJlZm9yZSBzdGFydGluZyBtYWtlIgotCi1bLmJpbnV0aWxzXW1ha2VmaWxlLnZtczoKLQkkKENEKSBbLmJpbnV0aWxzXQotCSQkIEBjb25maWd1cmUKLQkkKENEKSBbLV0KLQotaW5zdGFsbDogYWxsCi0JJChDRCkgWy5iaW51dGlsc10KLQlAZ21ha2UgIkNDPSQoQ0MpIiBpbnN0YWxsCi0JJChDRCkgWy1dCi0JJChDRCkgWy5nYXNdCi0JQGdtYWtlICJDQz0kKEdBU0NDKSIgaW5zdGFsbAotCSQoQ0QpIFstXQotCi1jbGVhbjoKLQkkKENEKSBbLmJmZF0KLQlAZ21ha2UgY2xlYW4KLQkkKENEKSBbLS5vcGNvZGVzXQotCUBnbWFrZSBjbGVhbgotCSQoQ0QpIFstLmxpYmliZXJ0eV0KLQlAZ21ha2UgY2xlYW4KLQkkKENEKSBbLS5iaW51dGlsc10KLQlAZ21ha2UgY2xlYW4KLQkkKENEKSBbLS5nYXNdCi0JQGdtYWtlIGNsZWFuCi0JJChDRCkgWy1dCi0KZGlmZiAtLWdpdCBhL21pc3NpbmcgYi9taXNzaW5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Nzg5NjUyLi4wMDAwMDAwCi0tLSBhL21pc3NpbmcKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb21tb24gc3R1YiBmb3IgYSBmZXcgbWlzc2luZyBHTlUgcHJvZ3JhbXMgd2hpbGUgaW5zdGFsbGluZy4KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGcmFuYyxvaXMgUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4sIDE5OTYuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotIyAwMjExMS0xMzA3LCBVU0EuCi0KLWlmIHRlc3QgJCMgLWVxIDA7IHRoZW4KLSAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgotICBleGl0IDEKLWZpCi0KLWNhc2UgIiQxIiBpbgotCi0gIC1ofC0taHwtLWhlfC0taGVsfC0taGVscCkKLSAgICBlY2hvICJcCi0kMCBbT1BUSU9OXS4uLiBQUk9HUkFNIFtBUkdVTUVOVF0uLi4KLQotSGFuZGxlIFxgUFJPR1JBTSBbQVJHVU1FTlRdLi4uJyBmb3Igd2hlbiBQUk9HUkFNIGlzIG1pc3NpbmcsIG9yIHJldHVybiBhbgotZXJyb3Igc3RhdHVzIGlmIHRoZXJlIGlzIG5vIGtub3duIGhhbmRsaW5nIGZvciBQUk9HUkFNLgotCi1PcHRpb25zOgotICAtaCwgLS1oZWxwICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0KLVN1cHBvcnRlZCBQUk9HUkFNIHZhbHVlczoKLSAgYWNsb2NhbCAgICAgIHRvdWNoIGZpbGUgXGBhY2xvY2FsLm00JwotICBhdXRvY29uZiAgICAgdG91Y2ggZmlsZSBcYGNvbmZpZ3VyZScKLSAgYXV0b2hlYWRlciAgIHRvdWNoIGZpbGUgXGBjb25maWcuaC5pbicKLSAgYXV0b21ha2UgICAgIHRvdWNoIGFsbCBcYE1ha2VmaWxlLmluJyBmaWxlcwotICBiaXNvbiAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCi0gIGZsZXggICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCi0gIGxleCAgICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCi0gIG1ha2VpbmZvICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKLSAgeWFjYyAgICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXSIKLSAgICA7OwotCi0gIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKLSAgICBlY2hvICJtaXNzaW5nIC0gR05VIGxpYml0IDAuMCIKLSAgICA7OwotCi0gIC0qKQotICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgotICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gIGFjbG9jYWwpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGBjb25maWd1cmUuaW4nLiAgWW91IG1pZ2h0IHdhbnQKLSAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KLSAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICB0b3VjaCBhY2xvY2FsLm00Ci0gICAgOzsKLQotICBhdXRvY29uZikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgY29uZmlndXJlLmluJy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCi0gICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQotICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKLSAgICB0b3VjaCBjb25maWd1cmUKLSAgICA7OwotCi0gIGF1dG9oZWFkZXIpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjY29uZmlnLmgnIG9yIFxgY29uZmlndXJlLmluJy4gIFlvdSBtaWdodCB3YW50Ci0gICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtCi0gICAgICAgICBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaWxlcz1gc2VkIC1uICdzL15bIF0qQVtDTV1fQ09ORklHX0hFQURFUihcKFteKV0qXCkpLiovXDEvcCcgY29uZmlndXJlLmluYAotICAgIHRlc3QgLXogIiRmaWxlcyIgJiYgZmlsZXM9ImNvbmZpZy5oIgotICAgIHRvdWNoX2ZpbGVzPQotICAgIGZvciBmIGluICRmaWxlczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKLQkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7Ci0gICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICAgIHRvdWNoICR0b3VjaF9maWxlcwotICAgIDs7Ci0KLSAgYXV0b21ha2UpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYE1ha2VmaWxlLmFtJywgXGBhY2luY2x1ZGUubTQnIG9yIFxgY29uZmlndXJlLmluJy4KLSAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLgotICAgICAgICAgR3JhYiB0aGVtIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbmQgLiAtdHlwZSBmIC1uYW1lIE1ha2VmaWxlLmFtIC1wcmludCB8Ci0JICAgc2VkICdzL1wuYW0kLy5pbi8nIHwKLQkgICB3aGlsZSByZWFkIGY7IGRvIHRvdWNoICIkZiI7IGRvbmUKLSAgICA7OwotCi0gIGJpc29ufHlhY2MpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnknIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgQmlzb24nIHBhY2thZ2UKLSAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKLSAgICAgICAgIFxgQmlzb24nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHJtIC1mIHkudGFiLmMgeS50YWIuaAotICAgIGlmIFsgJCMgLW5lIDEgXTsgdGhlbgotICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKLQljYXNlICIkTEFTVEFSRyIgaW4KLQkqLnkpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9jLydgCi0JICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCi0JICAgIGZpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCi0JICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5oCi0JICAgIGZpCi0JICA7OwotCWVzYWMKLSAgICBmaQotICAgIGlmIFsgISAtZiB5LnRhYi5oIF07IHRoZW4KLQllY2hvID55LnRhYi5oCi0gICAgZmkKLSAgICBpZiBbICEgLWYgeS50YWIuYyBdOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCi0gICAgZmkKLSAgICA7OwotCi0gIGxleHxmbGV4KQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC5sJyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEZsZXgnIHBhY2thZ2UKLSAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKLSAgICAgICAgIFxgRmxleCcgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgcm0gLWYgbGV4Lnl5LmMKLSAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAiJExBU1RBUkciIGluCi0JKi5sKQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MvbCQvYy8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgbGV4Lnl5LmMKLQkgICAgZmkKLQkgIDs7Ci0JZXNhYwotICAgIGZpCi0gICAgaWYgWyAhIC1mIGxleC55eS5jIF07IHRoZW4KLQllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPmxleC55eS5jCi0gICAgZmkKLSAgICA7OwotCi0gIG1ha2VpbmZvKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC50ZXhpJyBvciBcYC50ZXhpbmZvJyBmaWxlLCBvciBhbnkgb3RoZXIgZmlsZQotICAgICAgICAgaW5kaXJlY3RseSBhZmZlY3RpbmcgdGhlIGFzcGVjdCBvZiB0aGUgbWFudWFsLiAgVGhlIHNwdXJpb3VzCi0gICAgICAgICBjYWxsIG1pZ2h0IGFsc28gYmUgdGhlIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgYnVnZ3kgXGBtYWtlJyAoQUlYLAotICAgICAgICAgRFUsIElSSVgpLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBUZXhpbmZvJyBwYWNrYWdlIG9yCi0gICAgICAgICB0aGUgXGBHTlUgbWFrZScgcGFja2FnZS4gIEdyYWIgZWl0aGVyIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAotICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgotICAgICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAotICAgICAgZmlsZT1gc2VkIC1uICcvXkBzZXRmaWxlbmFtZS8geyBzLy4qIFwoW14gXSpcKSAqJC9cMS87IHA7IHE7IH0nICRmaWxlYAotICAgIGZpCi0gICAgdG91Y2ggJGZpbGUKLSAgICA7OwotCi0gICopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGFuZCB5b3UgZG8gbm90IHNlZW0gdG8gaGF2ZSBpdCBoYW5keSBvbiB5b3VyCi0gICAgICAgICBzeXN0ZW0uICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQotICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uICBDaGVjayB0aGUgXGBSRUFETUUnIGZpbGUsCi0gICAgICAgICBpdCBvZnRlbiB0ZWxscyB5b3UgYWJvdXQgdGhlIG5lZWRlZCBwcmVyZXF1aXJlbWVudHMgZm9yIGluc3RhbGxpbmcKLSAgICAgICAgIHRoaXMgcGFja2FnZS4gIFlvdSBtYXkgYWxzbyBwZWVrIGF0IGFueSBHTlUgYXJjaGl2ZSBzaXRlLCBpbiBjYXNlCi0gICAgICAgICBzb21lIG90aGVyIHBhY2thZ2Ugd291bGQgY29udGFpbiB0aGlzIG1pc3NpbmcgXGAkMScgcHJvZ3JhbS4iCi0gICAgZXhpdCAxCi0gICAgOzsKLWVzYWMKLQotZXhpdCAwCmRpZmYgLS1naXQgYS9ta2RlcCBiL21rZGVwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYzViNTA4Li4wMDAwMDAwCi0tLSBhL21rZGVwCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotIyEvYmluL3NoIC0KLSMKLSMgQ29weXJpZ2h0IChjKSAxOTg3IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0jIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQotIyBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAotIyBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCi0jIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKLSMgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkuICBUaGUgbmFtZSBvZiB0aGUKLSMgVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSMgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotIyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0jCi0jCUAoIylta2RlcC5zaAk1LjEyIChCZXJrZWxleSkgNi8zMC84OAotIwotCi1NQUtFPU1ha2VmaWxlCQkJIyBkZWZhdWx0IG1ha2VmaWxlIG5hbWUgaXMgIk1ha2VmaWxlIgotCi13aGlsZSA6Ci0JZG8gY2FzZSAiJDEiIGluCi0JCSMgLWYgYWxsb3dzIHlvdSB0byBzZWxlY3QgYSBtYWtlZmlsZSBuYW1lCi0JCS1mKQotCQkJTUFLRT0kMgotCQkJc2hpZnQ7IHNoaWZ0IDs7Ci0KLQkJIyB0aGUgLXAgZmxhZyBwcm9kdWNlcyAicHJvZ3JhbTogcHJvZ3JhbS5jIiBzdHlsZSBkZXBlbmRlbmNpZXMKLQkJIyBzbyAubydzIGRvbid0IGdldCBwcm9kdWNlZAotCQktcCkKLQkJCVNFRD0ncztcLm87OycKLQkJCXNoaWZ0IDs7Ci0JCSopCi0JCQlicmVhayA7OwotCWVzYWMKLWRvbmUKLQotaWYgWyAkIyA9IDAgXSA7IHRoZW4KLQllY2hvICd1c2FnZTogbWtkZXAgWy1wXSBbLWYgbWFrZWZpbGVdIFtmbGFnc10gZmlsZSAuLi4nCi0JZXhpdCAxCi1maQotCi1pZiBbICEgLXcgJE1BS0UgXTsgdGhlbgotCWVjaG8gIm1rZGVwOiBubyB3cml0ZWFibGUgZmlsZSBcIiRNQUtFXCIiCi0JZXhpdCAxCi1maQotCi1UTVA9L3RtcC9ta2RlcCQkCi0KLXRyYXAgJ3JtIC1mICRUTVAgOyBleGl0IDEnIDEgMiAzIDEzIDE1Ci0KLWNwICRNQUtFICR7TUFLRX0uYmFrCi0KLXNlZCAtZSAnL0RPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkZCcgPCAkTUFLRSA+ICRUTVAKLQotY2F0IDw8IF9FT0ZfID4+ICRUTVAKLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLQotX0VPRl8KLQotIyBJZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3QgaGF2ZSAtTSwgYWRkIGl0LiAgSWYgeW91IGNhbid0LCB0aGUgbmV4dCB0d28KLSMgbGluZXMgd2lsbCB0cnkgYW5kIHJlcGxhY2UgdGhlICJjYyAtTSIuICBUaGUgcmVhbCBwcm9ibGVtIGlzIHRoYXQgdGhpcwotIyBoYWNrIGNhbid0IGRlYWwgd2l0aCBhbnl0aGluZyB0aGF0IHJlcXVpcmVzIGEgc2VhcmNoIHBhdGgsIGFuZCBkb2Vzbid0Ci0jIGV2ZW4gdHJ5IGZvciBhbnl0aGluZyB1c2luZyBicmFja2V0ICg8Pikgc3ludGF4LgotIwotIyBlZ3JlcCAnXiNpbmNsdWRlWyAJXSoiLioiJyAvZGV2L251bGwgJCogfAotIyBzZWQgLWUgJ3MvOlteIl0qIlwoW14iXSpcKSIuKi86IFwxLycgLWUgJ3MvXC5jLy5vLycgfAotCi1nY2MgLU1NICQqIHwKLXNlZCAiCi0JczsgXC4vOyA7ZwotCSRTRUQiID4+ICRUTVAKLQotY2F0IDw8IF9FT0ZfID4+ICRUTVAKLQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCi1fRU9GXwotCi0jIGNvcHkgdG8gcHJlc2VydmUgcGVybWlzc2lvbnMKLWNwICRUTVAgJE1BS0UKLXJtIC1mICR7TUFLRX0uYmFrICRUTVAKLWV4aXQgMAotCi0KZGlmZiAtLWdpdCBhL21raW5zdGFsbGRpcnMgYi9ta2luc3RhbGxkaXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzg3ODNlLi4wMDAwMDAwCi0tLSBhL21raW5zdGFsbGRpcnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jISAvYmluL3NoCi0jIG1raW5zdGFsbGRpcnMgLS0tIG1ha2UgZGlyZWN0b3J5IGhpZXJhcmNoeQotIyBBdXRob3I6IE5vYWggRnJpZWRtYW4gPGZyaWVkbWFuQHByZXAuYWkubWl0LmVkdT4KLSMgQ3JlYXRlZDogMTk5My0wNS0xNgotIyBMYXN0IG1vZGlmaWVkOiAxOTk0LTAzLTI1Ci0jIFB1YmxpYyBkb21haW4KLQotZXJyc3RhdHVzPTAKLQotZm9yIGZpbGUgaW4gJHsxKyIkQCJ9IDsgZG8gCi0gICBzZXQgZm5vcmQgYGVjaG8gIjokZmlsZSIgfCBzZWQgLW5lICdzL146XC8vIy87cy9eOi8vO3MvXC8vIC9nO3MvXiMvXC8vO3AnYAotICAgc2hpZnQKLQotICAgcGF0aGNvbXA9Ci0gICBmb3IgZCBpbiAkezErIiRAIn0gOyBkbwotICAgICBwYXRoY29tcD0iJHBhdGhjb21wJGQiCi0gICAgIGNhc2UgIiRwYXRoY29tcCIgaW4KLSAgICAgICAtKiApIHBhdGhjb21wPS4vJHBhdGhjb21wIDs7Ci0gICAgIGVzYWMKLQotICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KLSAgICAgICAgZWNobyAibWtkaXIgJHBhdGhjb21wIiAxPiYyCi0gICAgICAgIG1rZGlyICIkcGF0aGNvbXAiID4gL2Rldi9udWxsIDI+JjEgfHwgbGFzdGVycj0kPwotICAgICBmaQotCi0gICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgotCWVycnN0YXR1cz0kbGFzdGVycgotICAgICBmaQotCi0gICAgIHBhdGhjb21wPSIkcGF0aGNvbXAvIgotICAgZG9uZQotZG9uZQotCi1leGl0ICRlcnJzdGF0dXMKLQotIyBta2luc3RhbGxkaXJzIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvbW92ZS1pZi1jaGFuZ2UgYi9tb3ZlLWlmLWNoYW5nZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWUxYjM0OC4uMDAwMDAwMAotLS0gYS9tb3ZlLWlmLWNoYW5nZQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotaWYKLXRlc3QgLXIgJDIKLXRoZW4KLWlmCi1jbXAgJDEgJDIgPiAvZGV2L251bGwKLXRoZW4KLWVjaG8gJDIgaXMgdW5jaGFuZ2VkCi1ybSAtZiAkMQotZWxzZQotbXYgLWYgJDEgJDIKLWZpCi1lbHNlCi1tdiAtZiAkMSAkMgotZmkKZGlmZiAtLWdpdCBhL21wdy1SRUFETUUgYi9tcHctUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjcxNDBiLi4wMDAwMDAwCi0tLSBhL21wdy1SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotVGhpcyBpcyBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTWFjaW50b3NoKHRtKSBNUFcodG0pIHBvcnQgb2YgdGhlCi1HTlUgdG9vbHMuICBUaGUgaW5mb3JtYXRpb24gYmVsb3cgYXBwbGllcyB0byBib3RoIG5hdGl2ZSBhbmQgY3Jvc3MKLWNvbXBpbGVycy4KLQotKFBsZWFzZSBub3RlIHRoYXQgdGhlcmUgYXJlIHR3byB2ZXJzaW9ucyBvZiB0aGlzIGZpbGU7ICJtcHctUkVBRE1FIgotaXMgdGhlIHNvdXJjZSBmb3JtLCBhbmQgIlJlYWQgTWUgZm9yIE1QVyIgaXMgdGhlIGRpc3RyaWJ1dGlvbiBmb3JtLgotIlJlYWQgTWUgZm9yIE1QVyIgaGFzIDgtYml0IGNoYXJzIHN1Y2ggYXMgXE9wdGlvbi1kIGVtYmVkZGVkIGluIGl0LikKLQotSU5TVEFMTElORyBHTlUgVE9PTFMKLQotKiBTeXN0ZW0gUmVxdWlyZW1lbnRzCi0KLVRvIHVzZSB0aGVzZSB0b29scywgeW91IHdpbGwgbmVlZCBhIE1hYyB3aXRoIGEgNjgwMjAgb3IgYmV0dGVyIG9yIGVsc2UKLWFueSBQb3dlck1hYywgU3lzdGVtIDcuMSBvciBsYXRlciwgYW5kIE1QVyAzLjMgb3IgMy40LiAgWW91IHdpbGwgKm5vdCoKLW5lZWQgYW55IG90aGVyIE1QVyBjb21waWxlciB1bmxlc3MgeW91IHdhbnQgdG8gcmVidWlsZCBmcm9tIHNvdXJjZXMsCi1ub3IgZXZlbiBhbnkgaW5jbHVkZSBmaWxlcywgdW5sZXNzIHlvdSBhcmUgYnVpbGRpbmcgYWN0dWFsIE1hYwotYXBwbGljYXRpb25zLiAgRm9yIFBvd2VyTWFjIG5hdGl2ZSB5b3Ugd2lsbCBuZWVkIFBQQ0xpbmssIGhvd2V2ZXI7Ci1hbHNvIHRoZSBleGVjdXRhYmxlcyBhcmUgUG93ZXJQQy1vbmx5LgotCi0qIEF1dG9tYXRlZCBJbnN0YWxsYXRpb24KLQotVGhlIHNpbXBsZXN0IHdheSB0byBpbnN0YWxsIEdOVSB0b29scyBpcyB0byBydW4gdGhlIEluc3RhbGwgc2NyaXB0LgotVGhlIHNjcmlwdCB3aWxsIGNvcHkgdGhpbmdzIHRvIHdoZXJlIHlvdSB3YW50IHRvIGtlZXAgdGhlbSwgd2lsbCBidWlsZAotYSBVc2VyU3RhcnR1cCBmaWxlIHdpdGggc2V0dGluZ3MgY29ycmVzcG9uZGluZyB0byB3aGVyZSB0aGluZ3Mgd2VyZQotY29waWVkLCBhbmQgb2ZmZXIgdG8gcHV0IHRoYXQgVXNlclN0YXJ0dXAgZmlsZSBpbiB5b3VyIE1QVyBmb2xkZXIuCi0KLVRoZSBJbnN0YWxsIHNjcmlwdCBkb2VzIG5vdCBhbHRlciBhbnl0aGluZyBpbiB0aGUgU3lzdGVtIEZvbGRlciwgYW5kCi1pdCBkb2VzIG5vdCB0YWtlIGFueSBhY3Rpb24gd2l0aG91dCBjb25maXJtYXRpb24uCi0KLVRoZSBJbnN0YWxsIHNjcmlwdCB3aWxsIGJlIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGJpbmFyeQotZGlzdHJpYnV0aW9uLCBvciBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBvYmplY3QgZGlyZWN0b3J5IGlmCi1yZWJ1aWxkaW5nIGZyb20gc291cmNlLiAgKFRoZSBzb3VyY2VzIGluY2x1ZGUgYSBmaWxlIGNhbGxlZAotIm1wdy1pbnN0YWxsIiBhdCB0aGUgdG9wIGxldmVsLCBidXQgaXQgaXMgdGhlIHNvdXJjZSB0byB0aGUgSW5zdGFsbAotc2NyaXB0IGFuZCBjYW5ub3QgYmUgcnVuIGRpcmVjdGx5LikKLQotKiBNYW51YWwgSW5zdGFsbGF0aW9uCi0KLUlmIHlvdSBkb24ndCB3YW50IHRvIHJ1biB0aGUgSW5zdGFsbCBzY3JpcHQsIHlvdSBjYW4gZG8gaW5zdGFsbGF0aW9uCi1tYW51YWxseTsgdGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgc3RlcHMgaW52b2x2ZWQuCi0KLVRoZSBHTlUgdG9vbHMgY2FuIGdvIGluIGFueSBkaXJlY3RvcnkgdGhhdCBpcyBpbiB5b3VyIHtDb21tYW5kc30gbGlzdC4KLVdlIGdlbmVyYWxseSBwdXQgYWxsIHRoZSB0b29scyBzb21ld2hlcmUgbGlrZSB7Qm9vdH1DeWdudXM6bGF0ZXN0OmJpbiwKLWFuZCB0aGVuIGFkZCB0byBhIFVzZXJTdGFydHVwIGZpbGU6Ci0KLQlzZXQgQ29tbWFuZHMgIntCb290fUN5Z251czpsYXRlc3Q6YmluOix7Q29tbWFuZHN9IgotCi1Ib3dldmVyLCB0aGUgY3BwIGFuZCBjYzEgcHJvZ3JhbXMgb2YgR0NDIGFyZSBub3Qgbm9ybWFsbHkgc3RvcmVkIGhlcmUuCi1JbnN0ZWFkLCB0aGV5IHdpbGwgYmUgaW4gYSAibGliIiBkaXJlY3RvcnkgdGhhdCBpcyBhbG9uZ3NpZGUgImJpbiIsCi1hbmQgb3JnYW5pemVkIGJ5IHRhcmdldCBhbmQgdmVyc2lvbiB1bmRlcm5lYXRoLCB3aXRoIG5hbWVzIGxpa2UKLQotCTpsaWI6Z2NjLWxpYjo8dGFyZ2V0PjpjeWdudXMtPHZlcnNpb24+OgotCi1JZiB5b3UgYnVpbGQgYW5kIGluc3RhbGwgZXZlcnl0aGluZyB5b3Vyc2VsZiBhY2NvcmRpbmcgdG8gdGhlIGJ1aWxkCi1pbnN0cnVjdGlvbnMgYmVsb3csIHRoZW4geW91IHdpbGwgbm90IGhhdmUgYW55IHByb2JsZW1zLiAgSG93ZXZlciwgeW91Ci1tYXkgZGlzY292ZXIgdGhhdCBHQ0Mgc2VlbXMgdW5hYmxlIHRvIGZpbmQgdGhlIHJpZ2h0IGNwcCBhbmQgY2MxOwotdXN1YWxseSB0aGlzIHdpbGwgYmUgYmVjYXVzZSBkaXJlY3RvcnkgbmFtZXMgaGF2ZSBjaGFuZ2VkLiAgKEV2ZW4KLXJlbmFtaW5nIHlvdXIgaGFyZCBkaXNrIHdpbGwgbWFrZSB0aGlzIGhhcHBlbi4pICBJbiBzdWNoIGNhc2VzLCB5b3UKLWhhdmUgc2V2ZXJhbCBjaG9pY2VzLiAgT25lIGlzIGp1c3QgdG8gYWRkIHRoaXMgZGlyZWN0b3J5IHRvCi17Q29tbWFuZHN9LCBidXQgdGhlbiB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBnZXQgYW55IG90aGVyIGNwcCBvciBjYzEsCi1zdWNoIGFzIHRob3NlIHVzZWQgYnkgYSBkaWZmZXJlbnQgdGFyZ2V0IG9yIHZlcnNpb24uICBBbm90aGVyIHdheSBpcwotdG8gcmVuYW1lIHlvdXIgZGlzayBhbmQgZGlyZWN0b3JpZXMgdG8gbWF0Y2ggdGhlIHByZWZpeCB1c2VkIHdoZW4gdGhlCi10b29scyB3ZXJlIGNvbXBpbGVkLiAgRmluYWxseSwgeW91IGNhbiBzZXQgdGhlIHZhcmlhYmxlCi1HQ0NfRVhFQ19QUkVGSVggdG8gcG9pbnQgdG8gdGhlIGxpYnJhcnkgZGlyZWN0b3J5OgotCi0Jc2V0IEdDQ19FWEVDX1BSRUZJWCBNeURpc2s6U3R1ZmY6bGliOmdjYy1saWI6Ci0JZXhwb3J0IEdDQ19FWEVDX1BSRUZJWAotCi1Zb3UgbWF5IGFsc28gd2FudCB0byBlZGl0IE1QVydzIEhFWEEgMTI4IHJlc291cmNlLiAgV2hlbiBHQ0MgaXMgYnVpbHQKLXVzaW5nIGEgbmF0aXZlIEdDQywgaXQgaXMgY29tcGlsZWQgdG8gdXNlIGEgc3BlY2lhbCBzdGFjayBhbGxvY2F0b3IKLWZ1bmN0aW9uIGFsbG9jYSgpLiAgV2hpbGUgdGhpcyBpcyB2ZXJ5IGVmZmljaWVudCwgaXQgbWVhbnMgdGhhdCBHQ0MKLXdpbGwgbmVlZCBjb25zaWRlcmFibGUgc3RhY2sgc3BhY2UgdG8gcnVuLCBlc3BlY2lhbGx5IHdoZW4gY29tcGlsaW5nCi1sYXJnZSBwcm9ncmFtcyB3aXRoIG9wdGltaXphdGlvbiB0dXJuZWQgb24uICBZb3UgZ2l2ZSBNUFcgbW9yZSBzdGFjawotYnkgZWRpdGluZyB0aGUgSEVYQSAxMjggcmVzb3VyY2Ugb2YgdGhlIE1QVyBTaGVsbC4gIEEgdmFsdWUgb2YgIjAwMDgKLTAwMDAiIGdpdmVzIDUxMksgb2Ygc3RhY2sgc2l6ZSwgd2hpY2ggaXMgdXN1YWxseSBzdWZmaWNpZW50LgotCi1VU0lORyBHTlUgVE9PTFMKLQotKiBVc2luZyBOYXRpdmUgUG93ZXJNYWMgR0NDCi0KLVVzaW5nIGEgbmF0aXZlIFBvd2VyTWFjIEdDQyB0byBwcm9kdWNlIE1QVyB0b29scyBvciBNYWNPUyBhcHBsaWNhdGlvbnMKLWlzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBqdXN0ICJnQyBmb28uYyIsIGFsdGhvdWdoIG5vIG1vcmUgY29tcGxpY2F0ZWQKLXRoYW4gd2l0aCBvdGhlciBNYWMgY29tcGlsZXJzLgotCi1UbyBidWlsZCBhIG5hdGl2ZSBQb3dlck1hYyBNUFcgdG9vbCwgdXNlIHRoaXMgc2VxdWVuY2UsIHdoZXJlIGhlbGxvLmMKLWlzIHRoZSB1c3VhbCAiaGVsbG8gd29ybGQiIHByb2dyYW0sIGFuZCBnZW5lcmljY2ZyZy5yIGlzIHRoZSBSZXogZmlsZQotd2l0aCB0aGUgY29kZSBmcmFnbWVudCByZXNvdXJjZToKLQotZ0MgLUl7Q0luY2x1ZGVzfSAtZm5vLWJ1aWx0aW4gLURwYXNjYWw9IC1jIC1nIGhlbGxvLmMKLVBQQ0xpbmsgaGVsbG8ubyAtbyBoZWxsbyBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iU3RkQ1J1bnRpbWUubyBcT3B0aW9uLWQKLQkie1NoYXJlZExpYnJhcmllc30iSW50ZXJmYWNlTGliIFxPcHRpb24tZAotCSJ7U2hhcmVkTGlicmFyaWVzfSJTdGRDTGliIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENUb29sTGlicy5vIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJQUENDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7R0NDUFBDTGlicmFyaWVzfSJsaWJnY2MueGNvZmYKLXJleiAtZCBBUFBOQU1FPSciJ2hlbGxvJyInIEdlbmVyaWNDRlJHLnIgLW8gaGVsbG8KLXNldGZpbGUgLXQgJ01QU1QnIC1jICdNUFMgJyBoZWxsbwotCi1UaGUgc2FtZSBzZXF1ZW5jZSB3b3JrcyB0byBidWlsZCBhIE1hY09TIGFwcGxpY2F0aW9uLCBidXQgeW91IHNldCB0aGUgZmlsZQotdHlwZSB0byAnQVBQTCcgYW5kIGRvbid0IGxpbmsgaW4gUFBDVG9vbExpYnMuby4gIEZvciBmdXJ0aGVyIGRldGFpbHMgb24KLXVzaW5nIE1QVyB0byBidWlsZCBNYWMgYXBwbGljYXRpb25zLCBzZWUgdGhlIGdlbmVyYWwgTVBXIGRvY3VtZW50YXRpb24uCi0KLVJlY2VudCB2ZXJzaW9ucyBvZiBQUENMaW5rIGhhdmUgYW4gb3B0aW9uIHRvIGdlbmVyYXRlIHRoZSBjb2RlCi1mcmFnbWVudCByZXNvdXJjZSBhbmQgYXV0b21hdGljYWxseSBzZXQgY3JlYXRvciBhbmQgZmlsZSB0eXBlOwotaGVyZSBpcyB3aGF0IEdlbmVyaWNDRlJHLnIgc2hvdWxkIGxvb2sgbGlrZSBpZiB5b3UgaGF2ZSBhbiBvbGRlcgotUFBDTGluayBvciBhcmUgdXNpbmcgR05VIGxkOgotCi0jaW5jbHVkZSAiQ29kZUZyYWdtZW50VHlwZXMuciIKLQotcmVzb3VyY2UgJ2NmcmcnICgwKSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBrUG93ZXJQQywKLSAgICAgICAgICAgICAgICBrRnVsbExpYiwKLSAgICAgICAgICAgICAgICBrTm9WZXJzaW9uTnVtLGtOb1ZlcnNpb25OdW0sCi0gICAgICAgICAgICAgICAgMCwwLAotICAgICAgICAgICAgICAgIGtJc0FwcCxrT25EaXNrRmxhdCxrWmVyb09mZnNldCxrV2hvbGVGb3JrLAotICAgICAgICAgICAgICAgIEFQUE5BTUUgLy8gbXVzdCBiZSBkZWZpbmVkIG9uIFJleiBjb21tYW5kIGxpbmUgd2l0aCAtZCBvcHRpb24KLSAgICAgICAgfQotfTsKLQotSW4gZ2VuZXJhbCB0aGlzIHBvcnQgb2YgR0NDIHN1cHBvcnRzIHRoZSBzYW1lIG9wdGlvbiBzeW50YXggYW5kCi1iZWhhdmlvciBhcyBpdHMgVW5peCBjb3VudGVycGFydC4gIEl0IGFsc28gaGFzIHNpbWlsYXIgY29tcGlsYXRpb24KLXJ1bGVzLCBzbyBpdCB3aWxsIHJ1biB0aGUgYXNzZW1ibGVyIG9uIC5zIGZpbGVzIGFuZCBzbyBmb3J0aC4KLQotVGhlIEdDQyBtYW51YWwgaW5jbHVkZXMgZnVsbCBpbmZvcm1hdGlvbiBvbiB0aGUgYXZhaWxhYmxlIG9wdGlvbnMuCi1PbmUgb3B0aW9uIHRoYXQgbWF5IGJlIGVzcGVjaWFsbHkgdXNlZnVsIGlzICItdiIsIHdoaWNoIHNob3dzIHlvdSB3aGF0Ci10b29scyBhbmQgb3B0aW9ucyBhcmUgYmVpbmcgdXNlZDsgdW5saWtlIG1vc3QgTWFjIEMgY29tcGlsZXJzLCBHQ0MKLWRpcmVjdHMgYXNzZW1ibHkgYW5kIGxpbmtpbmcgaW4gYWRkaXRpb24gdG8gY29tcGlsYXRpb24uCi0KLU1QVyBHQ0MgZG9lcyBmZWF0dXJlIHR3byBleHRlbnNpb25zIHRvIHRoZSBvcHRpb24gc3ludGF4OyAnLWQgbWFjcm89bmFtZScKLXdvcmtzIGp1c3QgYXMgJy1EbWFjcm89bmFtZScgZG9lcyBpbiBVbml4LCBhbmQgJy1pIGRpcmVjdG9yeScgd29ya3MgdGhlCi1zYW1lIGFzICctSWRpcmVjdG9yeScuCi0KLU1QVyBHQ0Mgc3VwcG9ydHMgdGhlIHVzdWFsIFBhc2NhbC1zdHlsZSBzdHJpbmdzIGFuZCBhbGlnbm1lbnQgcHJhZ21hcy4KLQotVG8gZmluZCBzdGFuZGFyZCBpbmNsdWRlIGZpbGVzIHlvdSBjYW4gc2V0IHRoZSB2YXJpYWJsZSBHQ0NJbmNsdWRlczoKLQotCXNldCBHQ0NJbmNsdWRlcyBNeURpc2s6TXlJbmNsdWRlczoKLQlleHBvcnQgR0NDSW5jbHVkZXMKLQotR0NDSW5jbHVkZXMgaXMgc2ltaWxhciB0byBNUFcncyBDSW5jbHVkZXMgb3IgQ1cncyBNV0NJbmNsdWRlcy4gIEluCi1vcmRlciB0byB1c2UgTVBXJ3MgdXN1YWwgaW5jbHVkZSBmaWxlcywganVzdCBzYXk6Ci0KLQlzZXQgR0NDSW5jbHVkZXMgIntDSW5jbHVkZXN9IgotCWV4cG9ydCBHQ0NJbmNsdWRlcwotCi0qIFVzaW5nIEdDQyBhcyBhIENyb3NzLUNvbXBpbGVyCi0KLUlmIHlvdSBoYXZlIGEgY3Jvc3MtY29tcGlsZXIsIGFuZCB5b3UgaGF2ZSBhbGwgb2YgdGhlIGNvcnJlY3QKLXRhcmdldC1zaWRlIGNydDAgYW5kIGxpYnJhcmllcyBhdmFpbGFibGUsIHRoZW4gdG8gY29tcGlsZSBhbmQgbGluayBhCi1maWxlICJmb28uYyIsIHlvdSBjYW4gc2F5IGp1c3QKLQotCWdDIGZvby5jCi0KLVRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlIGFuIE1QVyBiaW5hcnkgZmlsZSBuYW1lZCAiYS5vdXQiOyB0aGUgZm9ybWF0Ci1vZiB0aGUgY29udGVudHMgd2lsbCBkZXBlbmQgb24gd2hpY2ggdGFyZ2V0IGlzIGluIHVzZSwgc28gZm9yIGluc3RhbmNlCi1hIE1JUFMtdGFyZ2V0aW5nIEdDQyB3aWxsIHByb2R1Y2UgRUNPRkYgb3IgRUxGIGV4ZWN1dGFibGVzLgotCi1Ob3RlIHRoYXQgdXNpbmcgTVBXIGluY2x1ZGUgZmlsZXMgd2l0aCBhIGNyb3NzLWNvbXBpbGVyIGlzIHNvbWV3aGF0Ci1kYW5nZXJvdXMuCi0KLSogVXNpbmcgdGhlIEFzc2VtYmxlciBhbmQgRnJpZW5kcwotCi1UaGUgYXNzZW1ibGVyICgiYXMiKSBhbmQgbGlua2VyICgibGQiKSBhcmUgZmFpdGhmdWwgcG9ydHMgb2YgdGhlaXIKLVVuaXggY291bnRlcnBhcnRzLiAgU2ltaWxhcmx5LCB0aGUgYmludXRpbHMgImFyIiwgImNwbHVzZmlsdCIsICJubSIsCi0ib2JqY29weSIsICJvYmpkdW1wIiwgInJhbmxpYiIsICJzaXplIiwgInN0cmluZ3MiLCBhbmQgInN0cmlwIiBhcmUgYWxsCi1saWtlIHRoZXkgYXJlIHVuZGVyIFVuaXguICAoTm90ZSB0aGF0ICJjcGx1c2ZpbHQiIGlzIHVzdWFsbHkgY2FsbGVkCi0iYysrZmlsdCIgdW5kZXIgVW5peC4pCi0KLSogVXNpbmcgR0RCCi0KLVRoZXJlIGFyZSB0d28gZmxhdm9ycyBvZiBHREIuICAiZ2RiIiBpcyBhbiBNUFcgdG9vbCB0aGF0IHdvcmtzIHZlcnkKLW11Y2ggbGlrZSBpdCBkb2VzIGluIFVuaXg7IHB1dCBhIGNvbW1hbmQgaW50byB0aGUgTVBXIHdvcmtzaGVldCBhbmQKLXR5cGUgdGhlIDxlbnRlcj4ga2V5IHRvIHNlbmQgaXQgdG8gR0RCLiAgV2hpbGUgImdkYiIgaXMgcnVubmluZywgeW91Ci1jYW5ub3QgZG8gYW55dGhpbmcgZWxzZSBpbiBNUFcsIGFsdGhvdWdoIHlvdSBjYW4gc3dpdGNoIHRvIG90aGVyCi1NYWMgYXBwbGljYXRpb25zIGFuZCB1c2UgdGhlbS4KLQotIlNpb3dHREIiIGlzIGFsc28gYSBNYWMgYXBwbGljYXRpb24sIGJ1dCBpdCBpcyBHREIgdXNpbmcgdGhlIFNJT1cKLXBhY2thZ2UgdG8gcHJvdmlkZSBjb25zb2xlIGVtdWxhdGlvbi4gIENvbW1hbmRzIGFyZSBleGFjdGx5IGFzIGZvciB0aGUKLU1QVyB0b29sLCBidXQgc2luY2UgdGhpcyBpcyBpdHMgb3duIGFwcGxpY2F0aW9uLCB5b3UgY2FuIHN3aXRjaAotYmV0d2VlbiBpdCBhbmQgTVBXLgotCi1CVUlMRElORyBHTlUgVE9PTFMKLQotVGhpcyBwb3J0IG9mIHRoZSBHTlUgdG9vbHMgdXNlcyBhIGNvbmZpZ3VyZSBzY3JpcHQgc2ltaWxhciB0bwotdGhhdCB1c2VkIGZvciBHTlUgdG9vbHMgdW5kZXIgVW5peCwgYnV0IHJld3JpdHRlbiBmb3IgTVBXLiAgQXMgd2l0aAotVW5peCBjb25maWd1cmF0aW9uLCB0aGVyZSBpcyBhbiAib2JqZWN0IiBkaXJlY3RvcnkgdGhhdCBtYXkgYmUKLWRpZmZlcmVudCBmcm9tIHRoZSAic291cmNlIiBkaXJlY3RvcnkuICBJbiB0aGUgZXhhbXBsZSBjb21tYW5kcyBiZWxvdywKLXdlIHdpbGwgYXNzdW1lIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeSwgYW5kIHRoYXQKLXRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzICJ7Qm9vdH1DeWdudXM6c3JjOiIuCi0KLSogUmVxdWlyZW1lbnRzIGZvciBCdWlsZGluZwotCi1JbiBhZGRpdGlvbiB0byB0aGUgc291cmNlcywgeW91IHdpbGwgbmVlZCBhIHNldCBvZiB0b29scyB0aGF0IHRoZQotY29uZmlndXJlIGFuZCBidWlsZCBzY3JpcHRzIGFzc3VtZSB0byBiZSBhdmFpbGFibGUuICBUaGVzZSB0b29scwotKGFuZCB0aGVpciB2ZXJzaW9ucywgaWYgcmVsZXZhbnQpIGFyZSBhcyBmb2xsb3dzOgotCi0JYnlhY2MgdG9vbAotCWZsZXggKDIuMy43KSB0b29sIChhbmQgRmxleC5za2VsIGZpbGUpCi0JZm9yd2FyZC1pbmNsdWRlIHNjcmlwdAotCU1vdmVJZkNoYW5nZSBzY3JpcHQKLQltcHctdG91Y2ggc2NyaXB0Ci0JbXB3LXRydWUgc2NyaXB0Ci0JTmV3Rm9sZGVyUmVjdXJzaXZlIHNjcmlwdAotCW51bGwtY29tbWFuZCBzY3JpcHQKLQlvcGVuLWJyYWNlIHNjcmlwdAotCXNlZCAoMS4xMykgdG9vbAotCXRyLTd0bzggc2NyaXB0Ci0JdHJ1ZSBzY3JpcHQKLQotVGhlIHNjcmlwdHMgYXJlIGluIHRoZSBzb3VyY2VzLCB1bmRlciB1dGlsczptcHc6LiBZb3UgbXVzdCBhcnJhbmdlIHRvCi1nZXQgdGhlIG90aGVyIHRvb2xzIHlvdXJzZWxmICh0aGV5IGFyZSByZWFkaWx5IGF2YWlsYWJsZSBmcm9tIHRoZQotInVzdWFsIiBuZXQgc2l0ZXMsIGFuZCBhcmUgYWxzbyBvbiBtYW55IENEUk9NUykuICBJbiBhZGRpdGlvbiwgdGhlcmUKLXdpbGwgdXN1YWxseSBiZSBhIHNldCBvZiB0aGVzZSBhdmFpbGFibGUgYXQgZnRwLmN5Z251cy5jb20sIGluIHB1Yi9tYWMuCi0KLVlvdSBtYXkgcHV0IHRoZSBidWlsZCB0b29scyBpbiB5b3VyIHVzdWFsIFRvb2xzIG9yIFNjcmlwdHMKLWRpcmVjdG9yaWVzLCBvciBrZWVwIHRoZW0gaW4gYSBzZXBhcmF0ZSBkaXJlY3Rvcmllcy4gIFdlIHByZWZlciB0bwotbWFrZSBhIGRpcmVjdG9yeSBjYWxsZWQgImJ1aWxkdG9vbHMiIGFuZCB3ZSBwdXQgdGhpcyBpbiBvbmUgb2Ygb3VyCi1Vc2VyU3RhcnR1cCBmaWxlczoKLQotCXNldCBDb21tYW5kcyAie0Jvb3R9Q3lnbnVzOmJ1aWxkdG9vbHM6LHtDb21tYW5kc30iCi0KLUZsZXggdXNlcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBGTEVYX1NLRUxFVE9OIHRvIGxvY2F0ZSBpdHMgc2tlbGV0b24KLWZpbGUsIHNvIHlvdSBuZWVkIHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoaXMsIHByZWZlcmFibHkgaW4gYSBVc2VyU3RhcnR1cDoKLQotCVNldCBGTEVYX1NLRUxFVE9OICJ7Qm9vdH0iQ3lnbnVzOmJ1aWxkdG9vbHM6RmxleC5za2VsCi0JRXhwb3J0IEZMRVhfU0tFTEVUT04KLQotKiBDb25maWd1cmluZwotCi1CZWZvcmUgeW91IGNhbiBidWlsZCBhbnl0aGluZywgeW91IG11c3QgY29uZmlndXJlLiAgWW91IGRvIHRoaXMgYnkKLWNyZWF0aW5nIGFuIGRpcmVjdG9yeSB3aGVyZSBvYmplY3QgZmlsZXMgd2lsbCBiZSBzdG9yZWQsIHNldGRpcmVjdG9yeQotdG8gdGhhdCBkaXJlY3RvcnkgYW5kIGRvIGEgY29uZmlndXJlIGNvbW1hbmQ6Ci0KLQl7Qm9vdH1DeWdudXM6c3JjOm1wdy1jb25maWd1cmUgLS10YXJnZXQgPG5hbWU+IC0tY2MgPGNvbXBpbGVyPiAtLXNyY2RpciB7Qm9vdH1DeWdudXM6c3JjOiAtLXByZWZpeCA8d2hhdGV2ZXI+Ci0KLUlmIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzIG5vdCBpbiB5b3VyIHtDb21tYW5kc30gbGlzdCwgdGhlbiB5b3UgbXVzdAotc3VwcGx5IGEgZnVsbCBwYXRobmFtZSB0byBtcHctY29uZmlndXJlLCBzaW5jZSBtcHctY29uZmlndXJlIGludm9rZXMKLWl0c2VsZiBhZnRlciBzd2l0Y2hpbmcgaW50byBlYWNoIHN1YmRpcmVjdG9yeS4gIFVzaW5nIGEgcmVsYXRpdmUKLXBhdGhuYW1lLCBldmVuIHNvbWV0aGluZyBsaWtlICc6bXB3LWNvbmZpZ3VyZScsIHdpbGwgdGhlcmVmb3JlIG5vdCB3b3JrLgotCi08bmFtZT4gbXVzdCBiZSBhIGtub3duIHRhcmdldC4gIFZhbGlkIG9uZXMgaW5jbHVkZSAibTY4ay1hcHBsZS1tYWNvcyIsCi0icG93ZXJwYy1hcHBsZS1tYWNvcyIsICJpMzg2LXVua25vd24tZ28zMiIsICJtaXBzLWlkdC1lY29mZiIsIGFuZAotInNoLWhpdGFjaGktaG1zIi4gIE5vdCBhbGwgdGFyZ2V0IHR5cGVzIGFyZSBhY2NlcHRlZCBmb3IgYWxsIG9mIHRoZQotdG9vbHMgeWV0LgotCi08Y29tcGlsZXI+IG11c3QgYmUgdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVyIHRvIHVzZS4gIEl0IGRlZmF1bHRzIHRvICJtcHdjIi4KLQotCShtNjhrKQotCW1wd2MJTVBXIEMKLQlzYzY4awlTeW1hbnRlYyBDCi0JbXdjNjhrCU1ldHJvd2Vya3MgQyAoQ29kZXdhcnJpb3IpCi0JZ2NjNjhrCUdDQwotCi0JKHBvd2VycGMpCi0JcHBjYwlQUENDCi0JbXJjCU1hY2ludG9zaCBvbiBSaXNDIChNaXN0ZXIgQywgYWthKD8pIEZyYW5rZW5zdGVpbikKLQlzY3BwYwlTeW1hbnRlYyBDCi0JbXdjcHBjCU1ldHJvd2Vya3MgQyAoQ29kZXdhcnJpb3IpCi0JZ2NjcHBjCUdDQwotCi1Ob3QgYWxsIGNvbXBpbGVycyB3aWxsIGNvbXBpbGUgYWxsIHRvb2xzIGVxdWFsbHkgd2VsbCEgIEZvciBtNjhrIE1hY3MsCi1NUFcgQyBoYXMgdGhlIGJlc3QgcmVjb3JkIHNvIGZhciAoaXQgaGFzIHByb2JsZW1zLCBidXQgdGhleSBjYW4gYmUKLXdvcmtlZCBhcm91bmQpLCB3aGlsZSBmb3IgUG93ZXJNYWNzLCBDb2RlV2FycmlvciBpcyB0aGUgb25seSBjb21waWxlcgotdGhhdCBoYXMgc3VjY2Vzc2Z1bGx5IGNvbXBpbGVkIGV2ZXJ5dGhpbmcgaW50byBydW5uaW5nIGNvZGUuCi0KLTxwcmVmaXg+IGlzIHRoZSBwYXRoIHRoYXQgImdjYyIgd2lsbCBwcmVwZW5kIHdoZW4gbG9va2luZyBmb3IgdG9vbHMKLXRvIGV4ZWN1dGUuICBHQ0NfRVhFQ19QUkVGSVggb3ZlcnJpZGVzIHRoaXMgdmFsdWUsIHNvIHlvdSBuZWVkIG5vdAotaW5jbHVkZSBpdCBpZiB5b3UgcGxhbiB0byB1c2UgR0NDX0VYRUNfUFJFRklYLgotCi1BcyBhbiBleGFtcGxlLCBoZXJlIGlzIHRoZSBjb25maWd1cmUgbGluZSB0aGF0IHlvdSBjb3VsZCB1c2UgdG8gYnVpbGQKLW5hdGl2ZSBQb3dlck1hYyBHQ0M6Ci0KLSJ7Qm9vdH0iQ3lnbnVzOnNyYzptcHctY29uZmlndXJlIC0tY2MgbXdjcHBjIC0tdGFyZ2V0IHBvd2VycGMtYXBwbGUtbWFjb3MgLS1zcmNkaXIgIntCb290fSJDeWdudXM6c3JjOiAtLXByZWZpeCAie0Jvb3R9IkdOVVRvb2xzOgotCi0qIEJ1aWxkaW5nCi0KLUlmIHlvdSB1c2UgQ29kZVdhcnJpb3IsIHlvdSAqbXVzdCogZmlyc3Qgc2V0IE1XQ0luY2x1ZGVzIHRvCi17Q0luY2x1ZGVzfS4gIFRoaXMgaXMgYmVjYXVzZSB5b3Ugd2lsbCBiZSBidWlsZGluZyBNUFcgdG9vbHMsIGFuZAotdGhlaXIgc3RhbmRhcmQgSS9PIHdvcmtzIGJ5IG1ha2luZyByZWZlcmVuY2VzIHRvIGRhdGEgdGhhdCBpcyBwYXJ0IG9mCi10aGUgTVBXIFNoZWxsLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjb2RlIG11c3QgYmUgY29tcGlsZWQgYW5kIGxpbmtlZAotd2l0aCBtYWNyb3MgdGhhdCByZWZlciB0byB0aGF0IGRhdGEsIGFuZCB0aG9zZSBtYWNyb3MgYXJlIGluCi17Q0luY2x1ZGVzfSwgbm90IHRoZSBkZWZhdWx0IHtNV0NJbmNsdWRlc30uICBXaXRob3V0IHRoaXMgY2hhbmdlLCB5b3UKLXdpbGwgZW5jb3VudGVyIHByb2JsZW1zIGNvbXBpbGluZyBsaWJpYmVydHkvbXB3LmMsIGJ1dCB0d2Vha2luZyB0aGF0Ci1maWxlIG9ubHkgbWFza3MgdGhlIHJlYWwgcHJvYmxlbSwgYW5kIGRvZXMgbm90IGZpeCBpdC4KLQotVGhlIGNvbW1hbmQKLQotCW1wdy1idWlsZAotCi13aWxsIGJ1aWxkIGV2ZXJ5dGhpbmcuIEJ1aWxkaW5nIHdpbGwgdGFrZSBvdmVyIGFuIGhvdXIgb24gYSBRdWFkcmEgODAwCi1vciBQb3dlck1hYyA4MTAwLzExMCwgbG9uZ2VyIGlmIHRoZSBzb3VyY2VzIGFyZSBvbiBhIHNoYXJlZCB2b2x1bWUuCi0KLVlvdSBtYXkgc2VlIHNvbWUgd2FybmluZ3M7IHRoZXNlIGFyZSBtb3N0bHkgbGlrZWx5IGJlbmlnbiwgdHlwaWNhbGx5Ci1kaXNhZ3JlZW1lbnRzIGFib3V0IGRlY2xhcmF0aW9ucyBvZiBsaWJyYXJ5IGFuZCBzeXN0ZW0gZnVuY3Rpb25zLgotCi0qIEluc3RhbGxpbmcKLQotVG8gaW5zdGFsbCB0aGUganVzdC1idWlsdCB0b29scywgdXNlIHRoZSBjb21tYW5kCi0KLQltcHctYnVpbGQgaW5zdGFsbAotCi1UaGlzIHBhcnQgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUganVzdCBjb3BpZXMgZmlsZXMgdG8gdGhlCi1sb2NhdGlvbiBzcGVjaWZpZWQgYXQgY29uZmlndXJlIHRpbWUgYnkgPHByZWZpeD4sIGFuZCwgaW4gc29tZSBjYXNlcywKLXJlbmFtZXMgdGhlbSBmcm9tIHRlbXBvcmFyeSBpbnRlcm5hbCBuYW1lcyB0byB0aGVpciB1c3VhbCBuYW1lcy4gVGhpcwotaW5zdGFsbCBwcm9jZXNzIGlzICpub3QqIHRoZSBzYW1lIGFzIHdoYXQgdGhlIEluc3RhbGwgc2NyaXB0IGRvZXM7Ci1JbnN0YWxsIGNhbiBjb3B5IHRvb2xzIGZyb20gdGhlIGluc3RhbGxhdGlvbiBsb2NhdGlvbiBjaG9zZW4gYXQKLWNvbmZpZ3VyYXRpb24gdGltZSB0byBhIHVzZXItY2hvc2VuIHBsYWNlLCBhbmQgc2V0cyB1cCBhIFVzZXJTdGFydHVwCi1maWxlLiAgTm90ZSB0aGF0IHdoaWxlIHRoZSBJbnN0YWxsIHNjcmlwdCBpcyBvcHRpb25hbCwgdGhlIGluc3RhbGwKLWJ1aWxkIGFjdGlvbiBwZXJmb3JtcyBzb21lIHRhc2tzIHdvdWxkIGJlIHZlcnkgaGFyZCB0byByZXBsaWNhdGUKLW1hbnVhbGx5LCBzbyB5b3Ugc2hvdWxkIGFsd2F5cyBkbyBpdCBiZWZvcmUgdXNpbmcgdGhlIHRvb2xzLgotCi0qIEtub3duIFByb2JsZW1zIFdpdGggVXNpbmcgVmFyaW91cyBDb21waWxlcnMgdG8gQnVpbGQKLQotTW9zdCB2ZXJzaW9ucyBvZiBNUFcgQyBoYXZlIHByb2JsZW1zIHdpdGggY29tcGlsaW5nIEdOVSBzb2Z0d2FyZS4KLQotTVBXIEMgMy4yLnggaGFzIHByZXByb2Nlc3NpbmcgYnVncyB0aGF0IHJlbmRlciBpdCBpbmNhcGFibGUgb2YKLWNvbXBpbGluZyB0aGUgQkZEIGxpYnJhcnksIHNvIGl0IGNhbid0IGJlIHVzZWQgYXQgYWxsIGZvciBidWlsZGluZyBCRkQuCi0KLU1QVyBDIDMuMywgMy4zLjEsIGFuZCAzLjMuMiB3aWxsIHNwb250YW5lb3VzbHkgY2xhaW0gdG8gaGF2ZSBmb3VuZAotZXJyb3JzIGluIHRoZSBzb3VyY2UgY29kZSwgYnV0IGluIGZhY3QgdGhlIGNvZGUgaXMgcGVyZmVjdGx5IGZpbmUuICBJZgotdGhpcyBoYXBwZW5zLCBqdXN0IHNldCB0aGUgd29ya2luZyBkaXJlY3RvcnkgYmFjayB0byB0aGUgdG9wLWxldmVsCi1vYmpkaXIgKHdoZXJlIHRoZSBjb25maWd1cmUgY29tbWFuZCBhYm92ZSB3YXMgcGVyZm9ybWVkKSwgYW5kIHR5cGUKLSJtcHctYnVpbGQgYWxsIiBhZ2Fpbi4gIElmIGl0IGdvZXMgb24gdGhyb3VnaCB0aGUgc3VwcG9zZWQgZXJyb3IsIHRoZW4KLXlvdSBnb3Qgb25lIG9mIHRoZSBzcHVyaW91cyBlcnJvcnMuICBBIGZ1bGwgYnVpbGQgbWF5IHJlcXVpcmUgYSBudW1iZXIKLW9mIHRoZXNlIHJlc3RhcnRzLgotCi1NUFcgQyAzLjMuMyBzZWVtcyB0byB3b3JrIE9LLCBhdCBsZWFzdCB3aXRoIHRoZSBhaWQgb2YgYSBudW1iZXIgb2YKLXdvcmthcm91bmRzIHRoYXQgYXJlIGluIHRoZSBzb3VyY2VzIChsb29rIGZvciAjaWZkZWYgTVBXX0MpLgotCi1WZXJzaW9ucyBvZiBNUFcgTWFrZSBlYXJsaWVyIHRoYW4gNC4wZDIgaGF2ZSBleGhpYml0ZWQgYml6YXJyZSBiZWhhdmlvciwKLWZhaWx1cmUgdG8gc3Vic3RpdHV0ZSB2YXJpYWJsZXMgYW5kIHRoZSBsaWtlLgotCi1NZXRyb3dlcmtzIENXNiBQUEMgbGlua2VyIChNV0xpbmtQUEMpIHNlZW1zIHRvIGRvIGJhZCB0aGluZ3Mgd2l0aCBtZW1vcnkKLWlmIHRoZSAiTW9kZXJuIE1lbW9yeSBNYW5hZ2VyIiBpcyB0dXJuZWQgb24gKGluIHRoZSBNZW1vcnkgY29udHJvbCBwYW5lbCksCi1idXQgd29ya3MgT0sgaWYgaXQgaXMgdHVybmVkIG9mZi4KLQotTWV0cm93ZXJrcyBDVzYgbG9zZXMgYmlndGltZSBjb21waWxpbmcgb3Bjb2RlczpwcGMtb3BjLmMsIHdoaWNoIGhhcwotc29tZSBkZWVwbHkgbmVzdGVkIG1hY3Jvcy4gIChDVzcgaXMgT0suKSAgVGhlcmUgaXMgYSB3YXkgdG8gcGF0Y2ggdGhlCi1maWxlLCBieSBzdWJzdGl0dXRpbmcgY29uc3RhbnQgdmFsdWVzLiAgSWYgeW91IG5lZWQgdG8gZG8gdGhpcywKLWNvbnRhY3Qgc2hlYnNAY3lnbnVzLmNvbSBmb3IgZGV0YWlscy4KLQotPEdlc3RhbHQuaD4gaXMgbWlzc2luZyBmcm9tIHtDSW5jbHVkZXN9IGluIHRoZSBNUFcgdmVyc2lvbiB0aGF0IGNvbWVzCi13aXRoIENXNy4gIFlvdSBjYW4ganVzdCBjb3B5IHRoZSBvbmUgaW4gQ1c3J3Mge01XQ0luY2x1ZGVzfS4KLQotQ1c4IGFuZCBsYXRlciBoYXZlIGNoYW5nZXMgdG8gaGVhZGVycyBhbmQgc3VjaCB0aGF0IHdpbGwgcmVxdWlyZSBjaGFuZ2VzCi10byB0aGUgc291cmNlIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gdXNlIHRoZW0gdG8gcmVidWlsZC4KLQotS05PV04gQlVHUwotCi1UaGUgZGVjbGFyYXRpb25zIGZvciBtZW1jcHkgYW5kIG1lbWNtcCBpbiBzb21lIHZlcnNpb25zIG9mIGhlYWRlciBmaWxlcwotbWF5IGNvbmZsaWN0IHdpdGggR0NDJ3MgYnVpbHRpbiBkZWZpbml0aW9uLiAgRWl0aGVyIHVzZSAtZm5vLWJ1aWx0aW4KLW9yIGlnbm9yZSB0aGUgd2FybmluZ3MuCi0KLVRoaXMgaXMgbm90IGEgYnVnLCBidXQgLSB3YXRjaCBvdXQgZm9yIGNyL25sIHRyYW5zbGF0aW9uISAgRm9yIGluc3RhbmNlLAotaWYgY29uZmlnL21wdy1taC1tcHcgaXMgbm90IHByb3Blcmx5IHRyYW5zbGF0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbgotY29waWVkIG9yIHVwZGF0ZWQgc2VwYXJhdGVseSwgdGhlbiBldmVyeXRoaW5nIHdpbGwgYWxtb3N0IGJ1aWxkLCBidXQKLXlvdSB3aWxsIGdldCBwdXp6bGluZyBlcnJvciBtZXNzYWdlcyBmcm9tIG1ha2Ugb3IgdGhlIGNvbXBpbGVyLgotCi0nLycgb3IgJyAnIGVtYmVkZGVkIGluIGFueSBkZXZpY2UsIGRpcmVjdG9yeSwgb3IgZmlsZSBuYW1lIG1heSBvciBtYXkKLW5vdCB3b3JrLgotCi1vYmpjb3B5IC1PIHNyZWMgZm9vLm8gbWFrZXMgcmFuZG9tIG91dHB1dCBmaWxlbmFtZXMuCi0KLU1hYy14LW1pcHMgcmVxdWlyZXMgLW1nYXMgYnV0IFVuaXggaG9zdHMgZG9uJ3QuCi0KLUdEQiB3aWxsIGZyZXF1ZW50bHkgcmVxdWlyZSBhICcvJyBvbiB0aGUgZnJvbnQgb2YgYSBkZXZpY2UgbmFtZSBpbiBvcmRlcgotdG8gcmVjb2duaXplIGl0IGFzIGFuIGFic29sdXRlIHJhdGhlciB0aGFuIGEgcmVsYXRpdmUgcGF0aG5hbWUuCi0KLUdEQiBkb2Vzbid0IHNlZW0gdG8gdXNlIHRoZSBwcmludGVyIHBvcnQgY29ycmVjdGx5LCBhbHRob3VnaCBpdCB0cmllcy4KLQotVGhlIGN1cnNvciBkb2Vzbid0IGFsd2F5cyBzcGluIGFzIG11Y2ggYXMgaXQgc2hvdWxkLiAgVG8gZ2V0IGVsYWJvcmF0ZQotc3RhdGlzdGljcyBhbmQgd2FybmluZ3MgYWJvdXQgc3BpbiByYXRlcywgYWRkIHRoaXMgdG8gVXNlclN0YXJ0dXA6Ci0KLQlzZXQgTUVBU1VSRV9TUElOIGFsbAotCWV4cG9ydCBNRUFTVVJFX1NQSU4KZGlmZiAtLWdpdCBhL21wdy1idWlsZC5pbiBiL21wdy1idWlsZC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZkOTUzMC4uMDAwMDAwMAotLS0gYS9tcHctYnVpbGQuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotIyBUb3AtbGV2ZWwgc2NyaXB0IGZyYWdtZW50IHRvIGJ1aWxkIGV2ZXJ5dGhpbmcgZm9yIE1QVy4KLQotU2V0IHNhdmVkaXIgImBEaXJlY3RvcnlgIgotCi0jU2V0IEVjaG8gMQotCi1TZXQgVGhpc1NjcmlwdCAiezB9IgotCi1TZXQgb2JqZGlyICI6IgotCi1TZXQgdmVyaWZ5IDAKLQotU2V0IEJ1aWxkVGFyZ2V0ICJub25lIgotCi0jIFBhcnNlIGFyZ3VtZW50cy4KLQotTG9vcAotCUJyZWFrIElmIHsjfSA9PSAwCi0JCUlmICJ7QnVpbGRUYXJnZXR9IiA9fiAvbm9uZS8KLQkJCVNldCBCdWlsZFRhcmdldCAiezF9IgotCQlFbHNlCi0JCQlFY2hvIE9ubHkgb25lIGJ1aWxkIHRhcmdldCBhbGxvd2VkLCBpZ25vcmluZyAiezF9IgotCQlFbmQgSWYKLQlTaGlmdCAxCi1FbmQgTG9vcAotCi1JZiAie0J1aWxkVGFyZ2V0fSIgPX4gL25vbmUvCi0JU2V0IEJ1aWxkVGFyZ2V0ICJhbGwiCi1FbmQgSWYKLQotSWYge3ZlcmlmeX0gPT0gMQotCUVjaG8gIiMiIERvaW5nICJ7VGhpc1NjcmlwdH0iICJ7QnVpbGRUYXJnZXR9IiBpbiAiYERpcmVjdG9yeWAiIC4uLiAKLUVuZCBJZgotCi1TZXQgcmFubWFrZSAwCi0KLUlmICJgRXhpc3RzIE1ha2VmaWxlYCIgIT0gIiIKLQlFY2hvICJTZXQgRWNobyAxIiA+e0J1aWxkVGFyZ2V0fS5tYWtlb3V0Ci0JTWFrZSAtZiBNYWtlZmlsZSB7QnVpbGRUYXJnZXR9ID4+e0J1aWxkVGFyZ2V0fS5tYWtlb3V0Ci0Je0J1aWxkVGFyZ2V0fS5tYWtlb3V0Ci0JRGVsZXRlIHtCdWlsZFRhcmdldH0ubWFrZW91dAotCVNldCByYW5tYWtlIDEKLUVuZCBJZgotCi1JZiAiYEV4aXN0cyBNYWtlZmlsZS5QUENgIiAhPSAiIgotCUVjaG8gIlNldCBFY2hvIDEiID57QnVpbGRUYXJnZXR9Lm1ha2VvdXQucHBjCi0JTWFrZSAtZiBNYWtlZmlsZS5QUEMge0J1aWxkVGFyZ2V0fSA+PntCdWlsZFRhcmdldH0ubWFrZW91dC5wcGMKLQl7QnVpbGRUYXJnZXR9Lm1ha2VvdXQucHBjCi0JRGVsZXRlIHtCdWlsZFRhcmdldH0ubWFrZW91dC5wcGMKLQlTZXQgcmFubWFrZSAxCi1FbmQgSWYKLQotSWYge3Jhbm1ha2V9ID09IDEKLQlFeGl0Ci1FbmQgSWYKLQotIyBEaXNwYXRjaCBvbiB2YXJpb3VzIHBzZXVkby10YXJnZXRzLgotCi1JZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC8KLQlFY2hvIFN0YXJ0ZWQgYERhdGVgCi0JIntUaGlzU2NyaXB0fSIgYWxsLWdjYwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1nZGIKLQlFY2hvIEZpbmlzaGVkIGBEYXRlYAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1saWJpYmVydHkvCi0JIntUaGlzU2NyaXB0fSIgZG8tbGliaWJlcnR5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWJmZC8KLQkie1RoaXNTY3JpcHR9IiBkby1iZmQKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtb3Bjb2Rlcy8KLQkie1RoaXNTY3JpcHR9IiBkby1vcGNvZGVzCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWJ5YWNjLwotCSJ7VGhpc1NjcmlwdH0iIGRvLWJ5YWNjCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWZsZXgvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGRvLWZsZXgKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtYmludXRpbHMvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKLQkie1RoaXNTY3JpcHR9IiBhbGwtb3Bjb2RlcwotCSJ7VGhpc1NjcmlwdH0iIGRvLWJpbnV0aWxzCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWdhcy8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgYWxsLWJmZAotCSJ7VGhpc1NjcmlwdH0iIGFsbC1vcGNvZGVzCi0JIntUaGlzU2NyaXB0fSIgZG8tZ2FzCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWdjYy8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgYWxsLWdhcwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iaW51dGlscwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1sZAotCSJ7VGhpc1NjcmlwdH0iIGRvLWdjYwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1nZGIvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKLQkie1RoaXNTY3JpcHR9IiBhbGwtb3Bjb2RlcwotCSJ7VGhpc1NjcmlwdH0iIGRvLWdkYgotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1ncmV6LwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmZkCi0JIntUaGlzU2NyaXB0fSIgZG8tZ3JlegotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1sZC8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgYWxsLWJmZAotCSJ7VGhpc1NjcmlwdH0iIGFsbC1vcGNvZGVzCi0JIntUaGlzU2NyaXB0fSIgZG8tbGQKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1ieWFjYy8KLQlTZXREaXJlY3RvcnkgOmJ5YWNjOgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWZsZXgvCi0JU2V0RGlyZWN0b3J5IDpmbGV4OgotCTo6bXB3LWJ1aWxkIF9ib290c3RyYXAKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1iZmQvCi0JU2V0RGlyZWN0b3J5IDpiZmQ6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tbGliaWJlcnR5LwotCVNldERpcmVjdG9yeSA6bGliaWJlcnR5OgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLW9wY29kZXMvCi0JU2V0RGlyZWN0b3J5IDpvcGNvZGVzOgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWJpbnV0aWxzLwotCVNldERpcmVjdG9yeSA6YmludXRpbHM6Ci0JOjptcHctYnVpbGQgc3RhbXBzCi0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tZ2FzLwotCVNldERpcmVjdG9yeSA6Z2FzOgotCTo6bXB3LWJ1aWxkIHN0YW1wcwotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWdjYy8KLQlTZXREaXJlY3RvcnkgOmdjYzoKLQk6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWdkYi8KLQlTZXREaXJlY3RvcnkgOmdkYjoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1ncmV6LwotCVNldERpcmVjdG9yeSA6Z3JlejoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1sZC8KLQlTZXREaXJlY3RvcnkgOmxkOgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLW5ld2xpYi8KLQlTZXREaXJlY3RvcnkgOm5ld2xpYjoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS10b3AKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWJpbnV0aWxzCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1nYXMKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWdjYwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtbGQKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWdkYgotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtYmludXRpbHMvCi0JU2V0RGlyZWN0b3J5IDpiaW51dGlsczoKLQk6Om1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1nYXMvCi0JU2V0RGlyZWN0b3J5IDpnYXM6Ci0JOjptcHctYnVpbGQgaW5zdGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtZ2NjLwotCVNldERpcmVjdG9yeSA6Z2NjOgotCTptcHctYnVpbGQgaW5zdGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtZ2RiLwotCVNldERpcmVjdG9yeSA6Z2RiOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWdyZXovCi0JU2V0RGlyZWN0b3J5IDpncmV6OgotCTo6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWxkLwotCVNldERpcmVjdG9yeSA6bGQ6Ci0JOjptcHctYnVpbGQgaW5zdGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS8KLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktdG9wCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWJpbnV0aWxzCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWdhcwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1nY2MKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktZ2RiCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWxkCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWJpbnV0aWxzLwotCVNldERpcmVjdG9yeSA6YmludXRpbHM6Ci0JOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWdhcy8KLQlTZXREaXJlY3RvcnkgOmdhczoKLQk6Om1wdy1idWlsZCBpbnN0YWxsLW9ubHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktZ2NjLwotCVNldERpcmVjdG9yeSA6Z2NjOgotCTptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWdkYi8KLQlTZXREaXJlY3RvcnkgOmdkYjoKLQk6Om1wdy1idWlsZCBpbnN0YWxsLW9ubHkKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktZ3Jlei8KLQlTZXREaXJlY3RvcnkgOmdyZXo6Ci0JOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWxkLwotCVNldERpcmVjdG9yeSA6bGQ6Ci0JOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LXRvcC8KLQlOZXdGb2xkZXJSZWN1cnNpdmUgIntwcmVmaXh9IgotCUlmICJ7cHJlZml4fSIgIT0gImBEaXJlY3RvcnlgIgotCQlEdXBsaWNhdGUgLXkgJ1JlYWQgTWUgZm9yIE1QVycgIntwcmVmaXh9IidSZWFkIE1lIGZvciBNUFcnCi0JCUR1cGxpY2F0ZSAteSBJbnN0YWxsICJ7cHJlZml4fSJJbnN0YWxsCi0JRW5kIElmCi1FbHNlCi0JRWNobyB7QnVpbGRUYXJnZXR9IG5vdCB1bmRlcnN0b29kLCBpZ25vcmluZwotRW5kIElmCi0KLVNldERpcmVjdG9yeSAie3NhdmVkaXJ9IgpkaWZmIC0tZ2l0IGEvbXB3LWNvbmZpZy5pbiBiL21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMjg3MzcuLjAwMDAwMDAKLS0tIGEvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIEN5Z251cyBzb3VyY2UgdHJlZS4KLQotIyBDaGVjayB0aGF0IHdlIGNhbiBmaW5kIGFsbCB0aGUgc3BlY2lhbCB0b29scyB0aGF0IHdlIHdpbGwgbmVlZC4KLSMgVGhlIHRlc3QgZm9yIHNlZCBpcyBzZW1pLXBvaW50bGVzcywgYmVjYXVzZSBpdCdzIGFscmVhZHkgYmVlbiBpbnZva2VkCi0jIGJ5IHRoZSBjYWxjdWxhdGlvbiBvZiB0YXJnZXRfY3B1IGluIHRoZSBtYWluIGNvbmZpZ3VyZSBzY3JpcHQsIGJ1dAotIyB0aGUgdGVzdCB3aWxsIGFsc28gc2hvdyB3aGljaCBvbmUgaXMgYmVpbmcgdXNlZC4KLQotU2V0IEV4aXQgMAotRWNobyBieWFjYyBpcyBgV2hpY2ggYnlhY2NgCi1FY2hvIGZsZXggaXMgYFdoaWNoIGZsZXhgCi1FY2hvIGZvcndhcmQtaW5jbHVkZSBpcyBgV2hpY2ggZm9yd2FyZC1pbmNsdWRlYAotRWNobyBNb3ZlSWZDaGFuZ2UgaXMgYFdoaWNoIE1vdmVJZkNoYW5nZWAKLUVjaG8gbXB3LXRvdWNoIGlzIGBXaGljaCBtcHctdG91Y2hgCi1FY2hvIG1wdy10cnVlIGlzIGBXaGljaCBtcHctdHJ1ZWAKLUVjaG8gTmV3Rm9sZGVyUmVjdXJzaXZlIGlzIGBXaGljaCBOZXdGb2xkZXJSZWN1cnNpdmVgCi1FY2hvIG51bGwtY29tbWFuZCBpcyBgV2hpY2ggbnVsbC1jb21tYW5kYAotRWNobyBvcGVuLWJyYWNlIGlzIGBXaGljaCBvcGVuLWJyYWNlYAotRWNobyBzZWQgaXMgYFdoaWNoIHNlZGAKLUVjaG8gJ3RyLTd0bzgnIGlzIGBXaGljaCB0ci03dG84YAotRWNobyB0cnVlIGlzIGBXaGljaCB0cnVlYAotU2V0IEV4aXQgMQotCi1TZXQgaG9zdF9saWJzICJtbWFsbG9jIGxpYmliZXJ0eSBvcGNvZGVzIGJmZCByZWFkbGluZSBnYXNoIHRjbCB0ayB0Y2xYIgotCi1TZXQgaG9zdF90b29scyAidGV4aW5mbyBieWFjYyBmbGV4IGJpc29uIGJpbnV0aWxzIGxkIGdhcyBnY2MgZ2RiIG1ha2UgcGF0Y2ggXE9wdGlvbi1kCi0JICAgIHBybXMgc2VuZC1wciBncHJvZiBnZGJ0ZXN0IHRnYXMgZXRjIGV4cGVjdCBkZWphZ251IHNpbSBiYXNoIFxPcHRpb24tZAotCSAgICBtNCBhdXRvY29uZiBpc3BlbGwgZ3JlcCBkaWZmIHJjcyBjdnMgZmlsZXV0aWxzIHNoZWxsdXRpbHMgdGltZSBcT3B0aW9uLWQKLQkgICAgdGV4dHV0aWxzIHdkaWZmIGZpbmQgZW1hY3MgZW1hY3MxOSB1dWRlY29kZSBoZWxsbyB0YXIgZ3ppcCBpbmRlbnQgXE9wdGlvbi1kCi0JICAgIHJlY29kZSByZWxlYXNlIHNlZCB1dGlscyBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGdhd2siCi0KLVNldCB0YXJnZXRfbGlicyAibmV3bGliIgotCi1TZXQgdGFyZ2V0X3Rvb2xzICJleGFtcGxlcyIKLQotIyBDb25maWd1cmUgdGhlIHJlc291cmNlIGNvbXBpbGVyIGlmIHRhcmdldGluZyBNYWNzLgotSWYge3RhcmdldF9vc30gPX4gL21hY29zLyB8fCB7dGFyZ2V0X29zfSA9fiAvbXB3LwotCVNldCBob3N0X3Rvb2xzICJ7aG9zdF90b29sc30gZ3JleiIKLUVuZCBJZgotCQotU2V0IGNvbmZpZ2RpcnMgIntob3N0X2xpYnN9IHtob3N0X3Rvb2xzfSB7dGFyZ2V0X2xpYnN9IHt0YXJnZXRfdG9vbHN9IgotRXhwb3J0IGNvbmZpZ2RpcnMKLQotIyBNYWtlIHVwIGEgc3BlY2lhbCBpbmNsdWRlIGRpcmVjdG9yeSB0aGF0IHRvb2xzIHdpbGwgc2hhcmUuCi0KLUlmICJgRXhpc3RzICJ7b2JqZGlyfSJleHRyYS1pbmNsdWRlYCIgPT0gIiIKLQlOZXdGb2xkZXIgIntvYmpkaXJ9ImV4dHJhLWluY2x1ZGUKLUVuZCBJZgotCi1TZXQgZWRpciAie29iamRpcn1leHRyYS1pbmNsdWRlOiIKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6ZmlsZS5oICJ7ZWRpcn0iJ3N5cy9maWxlLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czppb2N0bC5oICJ7ZWRpcn0iJ3N5cy9pb2N0bC5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6cGFyYW0uaCAie2VkaXJ9IidzeXMvcGFyYW0uaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOnJlc291cmNlLmggIntlZGlyfSInc3lzL3Jlc291cmNlLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czpzdGF0LmggIntlZGlyfSInc3lzL3N0YXQuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOnRpbWUuaCAie2VkaXJ9IidzeXMvdGltZS5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6dHlwZXMuaCAie2VkaXJ9IidzeXMvdHlwZXMuaCcKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OmFvdXQ2NC5oICJ7ZWRpcn0iJ2FvdXQvYW91dDY0LmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6YXIuaCAie2VkaXJ9Iidhb3V0L2FyLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6cmFubGliLmggIntlZGlyfSInYW91dC9yYW5saWIuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDpyZWxvYy5oICJ7ZWRpcn0iJ2FvdXQvcmVsb2MuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDpzdGFiLmRlZiAie2VkaXJ9Iidhb3V0L3N0YWIuZGVmJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OnN0YWJfZ251LmggIntlZGlyfSInYW91dC9zdGFiX2dudS5oJwotCi1JZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDoie3RhcmdldF9jcHV9Ii5oYCIgIT0gIiIKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6Int0YXJnZXRfY3B1fSIuaCAie2VkaXJ9Iidhb3V0Lycie3RhcmdldF9jcHV9IicuaCcKLUVuZCBJZgotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6ZWNvZmYuaCAie2VkaXJ9Iidjb2ZmL2Vjb2ZmLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6aW50ZXJuYWwuaCAie2VkaXJ9Iidjb2ZmL2ludGVybmFsLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6c3ltLmggIntlZGlyfSInY29mZi9zeW0uaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjpzeW1jb25zdC5oICJ7ZWRpcn0iJ2NvZmYvc3ltY29uc3QuaCcKLQotSWYgImBFeGlzdHMgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6Int0YXJnZXRfY3B1fSIuaGAiICE9ICIiCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOiJ7dGFyZ2V0X2NwdX0iLmggIntlZGlyfSInY29mZi8nInt0YXJnZXRfY3B1fSInLmgnCi1FbmQgSWYKLUlmICJ7dGFyZ2V0X2NwdX0iID1+IC9wb3dlcnBjLwotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjpyczYwMDAuaCAie2VkaXJ9Iidjb2ZmL3JzNjAwMC5oJwotRW5kIElmCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOmNvbW1vbi5oICJ7ZWRpcn0iJ2VsZi9jb21tb24uaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOmR3YXJmLmggIntlZGlyfSInZWxmL2R3YXJmLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjpkd2FyZjIuaCAie2VkaXJ9IidlbGYvZHdhcmYyLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjpleHRlcm5hbC5oICJ7ZWRpcn0iJ2VsZi9leHRlcm5hbC5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6aW50ZXJuYWwuaCAie2VkaXJ9IidlbGYvaW50ZXJuYWwuaCcKLQotIyBCZWxpZXZlIGl0IG9yIG5vdCwgR0RCIG5lZWRzIHRoaXMgZm9yIGFsbCB0YXJnZXRzLgotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6bWlwcy5oICJ7ZWRpcn0iJ2VsZi9taXBzLmgnCi0KLUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6Int0YXJnZXRfY3B1fSIuaGAiICE9ICIiCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6Int0YXJnZXRfY3B1fSIuaCAie2VkaXJ9IidlbGYvJyJ7dGFyZ2V0X2NwdX0iJy5oJwotRW5kIElmCi1JZiAie3RhcmdldF9jcHV9IiA9fiAvcG93ZXJwYy8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjpwcGMuaCAie2VkaXJ9IidlbGYvcHBjLmgnCi1FbmQgSWYKLQotSWYgImBFeGlzdHMgIntzcmNyb290fSJpbmNsdWRlOm9wY29kZToie3RhcmdldF9jcHV9Ii5oYCIgIT0gIiIKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOm9wY29kZToie3RhcmdldF9jcHV9Ii5oICJ7ZWRpcn0iJ29wY29kZS8nInt0YXJnZXRfY3B1fSInLmgnCi1FbmQgSWYKLUlmICJ7dGFyZ2V0X2NwdX0iID1+IC9wb3dlcnBjLwotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6b3Bjb2RlOnBwYy5oICJ7ZWRpcn0iJ29wY29kZS9wcGMuaCcKLUVuZCBJZgotCi0jIEFkZCBzb21lIGJmZCBpbmNsdWRlcyB0aGF0IGdldCBtZW50aW9uZWQgb3V0c2lkZSB0aGUgYmZkIGRpci4KLQkKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImJmZDpsaWJjb2ZmLmggIntlZGlyfSInYmZkL2xpYmNvZmYuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImJmZDpsaWJlY29mZi5oICJ7ZWRpcn0iJ2JmZC9saWJlY29mZi5oJwotCi0jIFRyYW5zbGF0ZSByYW5kb20gZmlsZXMgaW50byBNUFctb25seSBjaGFyYWN0ZXIgc2V0LgotCi10ci03dG84ICJ7c3JjZGlyfSJtcHctUkVBRE1FID4gIntvYmpkaXJ9UmVhZCBNZSBmb3IgTVBXIgotdHItN3RvOCAie3NyY2Rpcn0ibXB3LWluc3RhbGwgPiAie29iamRpcn0iSW5zdGFsbApkaWZmIC0tZ2l0IGEvbXB3LWNvbmZpZ3VyZSBiL21wdy1jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNDUxNDguLjAwMDAwMDAKLS0tIGEvbXB3LWNvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gc2NyaXB0Ci0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMjIyBXQVJOSU5HCi0jIyMgVGhpcyBzY3JpcHQgbXVzdCBOT1QgdXNlIGFueSA4LWJpdCBjaGFycyEKLSMjIyBXQVJOSU5HCi0KLSMgVGhpcyBpcyBhbiBNUFcgU2hlbGwgc2NyaXB0IHRoYXQgc2V0cyBldmVyeXRoaW5nIHVwIGZvciBjb21waWxhdGlvbiwKLSMgbWFpbmx5IGNyZWF0aW5nIGRpcmVjdG9yaWVzLCBhbmQgZWRpdGluZyBjb3BpZXMgb2YgZmlsZXMuCi0KLVNldCBzYXZlZGlyICJgRGlyZWN0b3J5YCIKLQotI1NldCBFY2hvIDEKLQotU2V0IFRoaXNTY3JpcHQgInswfSIKLQotU2V0IHNyY3Jvb3QgIi0tLS0tLS0tIgotCi1TZXQgc3JjZGlyICI6IgotCi1TZXQgb2JqZGlyICI6IgotCi1TZXQgcHJlZml4ICJ7TVBXfSI6R05VVG9vbHM6Ci0KLVNldCBleGVjX3ByZWZpeCAiIgotCi1TZXQgYmluZGlyICIiCi0KLVNldCBob3N0X2FsaWFzICJtNjhrLWFwcGxlLW1wdyIKLQotU2V0IHRhcmdldF9hbGlhcyB7aG9zdF9hbGlhc30KLQotU2V0IGhvc3RfY2MgIm1wd2MiCi0KLVNldCB3aXRoX2dudV9sZCAwCi0KLVNldCBoZWxwb3V0cHV0IDAKLQotU2V0IHJlY3Vyc2UgMQotCi1TZXQgdmVyaWZ5IDAKLVNldCB2ZXJpZnlzdHIgIiIKLQotU2V0IGVuYWJsZV9vcHRpb25zICIiCi1TZXQgZGlzYWJsZV9vcHRpb25zICIiCi0KLSMgUGFyc2UgYXJndW1lbnRzLgotCi1Mb29wCi0JQnJlYWsgSWYgeyN9ID09IDAKLQlJZiAiezF9IiA9fiAvLS1jYy8KLQkJU2V0IGhvc3RfY2MgInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0tYmluZGlyLwotCQlTZXQgYmluZGlyICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLWRpc2FibGUtPysvCi0JCVNldCBgRWNobyB7MX0gfCBzZWQgLWUgJ3MvLS1kaXNhYmxlLS9lbmFibGVfLydgIG5vCi0JCVNldCBkaXNhYmxlX29wdGlvbnMgIntkaXNhYmxlX29wdGlvbnN9ICd7MX0nIgotCUVsc2UgSWYgInsxfSIgPX4gLy0tZW5hYmxlLT8rLwotCQlTZXQgYEVjaG8gezF9IHwgc2VkIC1lICdzLy0tZW5hYmxlLS9lbmFibGVfLydgIHllcwotCQlTZXQgZW5hYmxlX29wdGlvbnMgIntlbmFibGVfb3B0aW9uc30gJ3sxfSciCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1leGVjLXByZWZpeC8KLQkJU2V0IGV4ZWNfcHJlZml4ICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLWhlbHAvCi0JCVNldCBoZWxwb3V0cHV0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLWhvc3QvCi0JCVNldCBob3N0X2FsaWFzICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLW5vcmVjdXJzaW9uLwotCQlTZXQgcmVjdXJzZSAwCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1wcmVmaXgvCi0JCVNldCBwcmVmaXggInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy0tc3JjZGlyLwotCQlTZXQgc3JjZGlyICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLXNyY3Jvb3QvCi0JCVNldCBzcmNyb290ICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLXRhcmdldC8KLQkJU2V0IHRhcmdldF9hbGlhcyAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLXYvCi0JCVNldCB2ZXJpZnkgMQotCQlTZXQgdmVyaWZ5c3RyICItdiIKLQlFbHNlIElmICJ7MX0iID1+IC8tLXdpdGgtZ251LWxkLwotCQlTZXQgd2l0aF9nbnVfbGQgMQotCUVsc2UKLQkJRWNobyAtbiAnbXB3LWNvbmZpZ3VyZTogVW5yZWNvZ25pemVkIG9wdGlvbjogIicKLQkJRWNobyAtbiAiezF9IgotCQlFY2hvICciOyB1c2UgLS1oZWxwIGZvciB1c2FnZS4nCi0JCUV4aXQgMQotCUVuZCBJZgotCVNoaWZ0IDEKLUVuZCBMb29wCi0KLUlmIHtoZWxwb3V0cHV0fSA9PSAxCi0JRWNobyAiVXNhZ2U6IG1wdy1jb25maWd1cmUgW09QVElPTlNdIgotCUVjaG8gIiIKLQlFY2hvICJPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHNdIgotCUVjaG8gIi0tYmluZGlyIERJUiAgICAgIGRpcmVjdG9yeSBmb3IgYmluYXJpZXMgW10iCi0JRWNobyAiLS1jYyBDQyAgICAgICAgICAgdXNlIEMgY29tcGlsZXIgQ0MgW21wd2NdIgotCUVjaG8gIi0tZGlzYWJsZS1GT08gICAgIGRvIG5vdCBpbmNsdWRlIGZlYXR1cmUgRk9PIgotCUVjaG8gIi0tZW5hYmxlLUZPTyAgICAgIGluY2x1ZGUgZmVhdHVyZSBGT08iCi0JRWNobyAiLS1leGVjLXByZWZpeCBESVIgaW5zdGFsbCBob3N0LWRlcGVuZGVudCBmaWxlcyBpbnRvIERJUiBbXSIKLQlFY2hvICItLWhlbHAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UiCi0JRWNobyAiLS1ob3N0IEhPU1QgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFttNjhrLWFwcGxlLW1wd10iCi0JRWNobyAiLS1ub3JlY3Vyc2lvbiAgICAgY29uZmlndXJlIHRoaXMgZGlyZWN0b3J5IG9ubHkgW3JlY3Vyc2VdIgotCUVjaG8gIi0tcHJlZml4IERJUiAgICAgIGluc3RhbGwgaW50byBESVIgW3tNUFd9OkdOVVRvb2xzOl0iCi0JRWNobyAiLS1zcmNkaXIgRElSICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgWzpdIgotCUVjaG8gIi0tc3Jjcm9vdCBESVIgICAgIGZpbmQgdGhlIHRvcGxldmVsIHNvdXJjZXMgaW4gRElSIFs6XSIKLQlFY2hvICItLXRhcmdldCBUQVJHRVQgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdIgotCUVjaG8gIi12ICAgICAgICAgICAgICAgIHZlcmJvc2UiCi0JRWNobyAiLS13aXRoLWdudS1sZCAgICAgbGluayB1c2luZyBHTlUgbGQgW25vXSIKLQlFeGl0IDAKLUVuZCBJZgotCi1TZXQgRXhpdCAwCi0KLSMgRGVmYXVsdCBleGVjX3ByZWZpeCBmcm9tIHByZWZpeC4KLQotSWYgIntleGVjX3ByZWZpeH0iID09ICIiCi0JU2V0IGV4ZWNfcHJlZml4ICJ7cHJlZml4fSIKLUVuZCBJZgotCi1JZiAie2JpbmRpcn0iID09ICIiCi0JU2V0IGJpbmRpciAie3ByZWZpeH0iYmluOgotRW5kIElmCi0KLSMgUG9pbnQgdG8gdGhlIGNvcnJlY3Qgc2V0IG9mIHRvb2xzIHRvIHVzZSB3aXRoIHRoZSBjaG9zZW4gY29tcGlsZXIuCi0KLUlmICJ7aG9zdF9jY30iID1+IC9tcHdjLwotCVNldCBob3N0X2FsaWFzICJtNjhrLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX01QV19DfScKLQlTZXQgc2VnbWVudF9mbGFnICctcyAnCi0JU2V0IGFyX25hbWUgJ3tBUl9MSUJ9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX0xJTkt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCi0JU2V0IHJlel9uYW1lICd7UkVaXzY4S30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9zYzY4ay8KLQlTZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19TQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLXMgJwotCVNldCBhcl9uYW1lICd7QVJfTElCfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9MSU5LfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX0N9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX05VTEx9JwotCVNldCByZXpfbmFtZSAne1JFWl82OEt9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvbXdjNjhrLwotCVNldCBob3N0X2FsaWFzICJtNjhrLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX01XQzY4S30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLXMgJwotCVNldCBhcl9uYW1lICd7QVJfTVdMSU5LNjhLfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9NV0xJTks2OEt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfTVdDNjhLfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfNjhLfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL2djYzY4ay8KLQlTZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ182OEtfR0NDfScKLQlTZXQgc2VnbWVudF9mbGFnICctcyAnCi0JU2V0IGFyX25hbWUgJ3tBUl82OEtfQVJ9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9SQU5MSUJ9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfNjhLX0dDQ30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF82OEt9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19DfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfNjhLfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL3BwY2MvCi0JU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfUFBDQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLWQgX19fc19lX2dfX189JwotCVNldCBhcl9uYW1lICd7QVJfUFBDTElOS30nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfUFBDTElOS30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF9YQ09GRn0nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX1BQQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfUFBDfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfUFBDfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL21yYy8KLQlTZXQgaG9zdF9hbGlhcyAicG93ZXJwYy1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19NUkN9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKLQlTZXQgYXJfbmFtZSAne0FSX1BQQ0xJTkt9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX1BQQ0xJTkt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfWENPRkZ9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19QUEN9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX1BQQ30nCi0JU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9zY3BwYy8KLQlTZXQgaG9zdF9hbGlhcyAicG93ZXJwYy1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19TQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLWQgX19fc19lX2dfX189JwotCVNldCBhcl9uYW1lICd7QVJfUFBDTElOS30nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfUFBDTElOS30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF9YQ09GRn0nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX1BQQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfUFBDfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfUFBDfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL213Y3BwYy8KLQlTZXQgaG9zdF9hbGlhcyAicG93ZXJwYy1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19NV0NQUEN9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKLQlTZXQgYXJfbmFtZSAne0FSX01XTElOS1BQQ30nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfTVdMSU5LUFBDfScKLQkjIE1pc2xlYWRpbmcsIGJ1dCB3ZSBkb24ndCBuZWVkIGEgUEVGIHN0ZXAuCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF82OEt9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19NV0NQUEN9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX05VTEx9JwotCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvZ2NjcHBjLwotCVNldCBob3N0X2FsaWFzICJwb3dlcnBjLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX1BQQ19HQ0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKLQlTZXQgYXJfbmFtZSAne0FSX1BQQ0xJTkt9JwotCUlmIHt3aXRoX2dudV9sZH0gPT0gMQotCQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfUkFOTElCfScKLQkJU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9HTER9JwotCUVsc2UKLQkJU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX1BQQ0xJTkt9JwotCUVuZCBJZgotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfWENPRkZ9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19QUEN9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX1BQQ30nCi0JU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCi1FbHNlCi0JRWNobyAie2hvc3RfY2N9IiBpcyBub3QgYSBrbm93biBNUFcgY29tcGlsZXIgdHlwZQotRW5kIElmCi0KLVNldCBkYXNoX2NfZmxhZyAnJwotSWYgIntob3N0X2NjfSIgPX4gL2djYzY4ay8KLQlTZXQgZGFzaF9jX2ZsYWcgJy1jJwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvZ2NjcHBjLwotCVNldCBkYXNoX2NfZmxhZyAnLWMnCi1FbmQgSWYKLQotIyAoc2hvdWxkIGludGVycHJldCBhbGlhc2VzIGlmIG5vdCBpbiBjYW5vbmljYWwgZm9ybSkKLQotU2V0IGhvc3RfY2Fub25pY2FsICJ7aG9zdF9hbGlhc30iCi0KLVNldCB0YXJnZXRfY2Fub25pY2FsICJ7dGFyZ2V0X2FsaWFzfSIKLQotU2V0IGNvbmZpZ2RpcnMgIiIKLQotSWYgIntzcmNyb290fSIgPX4gLy0tLS0tLS0tLwotCVNldCBzcmNyb290ICJ7c3JjZGlyfSIKLUVuZCBJZgotSWYgImBFeGlzdHMgIntzcmNkaXJ9ImAiID09ICIiCi0JRWNobyBTb3VyY2UgZGlyZWN0b3J5IHtzcmNkaXJ9IGRvZXMgbm90IGV4aXN0IQotCUV4aXQgMQotRW5kIElmCi1JZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImAiID09ICIiCi0JRWNobyBUb3AtbGV2ZWwgc291cmNlIGRpcmVjdG9yeSB7c3Jjcm9vdH0gZG9lcyBub3QgZXhpc3QhCi0JRXhpdCAxCi1FbmQgSWYKLQotU2V0IHRhcmdldF9jcHUgImBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAncy9eXCguKlwpLVwoLipcKS1cKC4qXCkkL1wxLydgIgotU2V0IHRhcmdldF92ZW5kb3IgImBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAncy9eXCguKlwpLVwoLipcKS1cKC4qXCkkL1wyLydgIgotU2V0IHRhcmdldF9vcyAiYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkICdzL15cKC4qXCktXCguKlwpLVwoLipcKSQvXDMvJ2AiCi0KLSMgQ3JlYXRlIGEgZmlsZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgb2xkZXIgdGhhbiBhbnkgb3RoZXIgaGVyZS4KLQotSWYgImBFeGlzdHMgIntvYmpkaXJ9Il9vbGRlc3RgIiA9PSAiIgotCW1wdy10b3VjaCBfb2xkZXN0Ci1FbmQgSWYKLQotIyBSZWNvcmQgdGhpcyBiZWZvcmUgY3JlYXRpbmcgYW55IGZpbGVzLCBtYWtlZmlsZXMgc29tZXRpbWVzIG1lbnRpb24KLSMgZGVwZW5kZW5jaWVzIG9uIGNvbmZpZy5zdGF0dXMuCi0KLUVjaG8gIiMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93czoiID5jb25maWcubmV3Ci1FY2hvICJ7VGhpc1NjcmlwdH0gLS1ob3N0IHtob3N0X2FsaWFzfSAtLXRhcmdldCB7dGFyZ2V0X2FsaWFzfSAtLXNyY2RpciB7c3JjZGlyfSAgLS1zcmNyb290IHtzcmNyb290fSAgLS1wcmVmaXgge3ByZWZpeH0gLS1jYyB7aG9zdF9jY30ge3ZlcmlmeXN0cn0ge2VuYWJsZV9vcHRpb25zfSB7ZGlzYWJsZV9vcHRpb25zfSAtLW5vcmVjdXJzaW9uIiA+PmNvbmZpZy5uZXcKLU1vdmVJZkNoYW5nZSBjb25maWcubmV3IGNvbmZpZy5zdGF0dXMKLQotSWYgImBFeGlzdHMgIntzcmNkaXJ9Im1wdy1jb25maWcuaW5gIiAhPSAiIgotCXRyLTd0bzggIntzcmNkaXJ9Im1wdy1jb25maWcuaW4gPiJ7b2JqZGlyfSJtcHctY29uZmlnLmluCi0JRXhlY3V0ZSAie29iamRpcn0ibXB3LWNvbmZpZy5pbgotRW5kIElmCi0KLSMgU3RhcnQgTWFrZWZpbGUgY29uc3RydWN0aW9uIGJ5IGRlZmluaW5nIGFsbCB0aGUgdmFyaWFibGVzIGNob3NlbiBieQotIyBjb25maWd1cmF0aW9uLgotCi1FY2hvICIjIFRoaXMgTWFrZWZpbGUgcHJvZHVjZWQgYnkgbXB3LWNvbmZpZ3VyZS4gIENoYW5nZXMgbWF5IGdldCBsb3N0ISIgPiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJzcmNyb290ID0gIiB7c3Jjcm9vdH0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0b3BzcmNkaXIgPSAiIHtzcmNyb290fQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInNyY2RpciA9ICIge3NyY2Rpcn0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJtcHdfcHJlZml4ID0gIiB7cHJlZml4fQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIm1wd19leGVjX3ByZWZpeCA9ICIge2V4ZWNfcHJlZml4fQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAibXB3X2JpbmRpciA9ICIge2JpbmRpcn0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJob3N0X2FsaWFzID0gIiB7aG9zdF9hbGlhc30JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF9hbGlhcyA9ICIge3RhcmdldF9hbGlhc30JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF9jcHUgPSAiIHt0YXJnZXRfY3B1fQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X3ZlbmRvciA9ICIge3RhcmdldF92ZW5kb3J9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfb3MgPSAiIHt0YXJnZXRfb3N9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X2Nhbm9uaWNhbCA9ICIge3RhcmdldF9jYW5vbmljYWx9CT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gImhvc3RfbWFrZWZpbGVfZnJhZyA9ICIJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfbWFrZWZpbGVfZnJhZyA9ICIJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJDQyA9ICIge2NjX25hbWV9CQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIkFSID0gIiB7YXJfbmFtZX0JCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiUkFOTElCID0gIiB7cmFubGliX25hbWV9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiQ0NfTEQgPSAiIHtjY19sZF9uYW1lfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIlBST0dfRVhUID0gIiB7cHJvZ19leHRfbmFtZX0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIkVYVFJBTElCUyA9ICIge2V4dHJhbGlic19uYW1lfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiTUFLRVBFRiA9ICIge21ha2VwZWZfbmFtZX0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIlJFWiA9ICIge3Jlel9uYW1lfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQotSWYge2hvc3RfY2N9ID1+IC9nY2NwcGMvCi0JRWNobyAtbiAiZHEgPVxPcHRpb24tZFxPcHRpb24tZFxPcHRpb24tZCIgPiAie29iamRpcn0iTWFrZWZpbGUudGVtMAotCUVjaG8gJyInIAkJCQkgPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTAKLQl0ci03dG84ICAie29iamRpcn0iTWFrZWZpbGUudGVtMAk+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVsc2UKLQlFY2hvIC1uICJkcSA9JyIgCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUVjaG8gLW4gJyInIAkJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi0JRWNobyAgICAiJyIgCQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVuZCBJZgotCi0jIEFwcGVuZCB0aGUgbWFzdGVyIHNldCBvZiBkZWZpbml0aW9ucyBmb3IgdGhlIHZhcmlvdXMgY29tcGlsZXJzLgotCi1JZiAiYEV4aXN0cyAie3NyY2Rpcn0iY29uZmlnOm1wdy1taC1tcHdgIiAhPSAiIgotCXRyLTd0bzggIntzcmNkaXJ9ImNvbmZpZzptcHctbWgtbXB3ID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWxzZSBJZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImNvbmZpZzptcHctbWgtbXB3YCIgIT0gIiIKLQl0ci03dG84ICJ7c3Jjcm9vdH0iY29uZmlnOm1wdy1taC1tcHcgPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi1FbHNlCi0JRWNobyAiY2FuJ3QgZmluZCBhIGhvc3QgY29uZmlnIGZpbGUhIgotCUV4aXQgMAotRW5kIElmCi0KLSMgQXBwZW5kIGFueXRoaW5nIHByb2R1Y2VkIGJ5IHRoZSBkaXJlY3RvcnkncyBtcHctY29uZmlnLmluLgotCi1JZiAiYEV4aXN0cyAie29iamRpcn0ibWsudG1wYCIgIT0gIiIKLQlDYXRlbmF0ZSAie29iamRpcn0ibWsudG1wID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCSMgQW4gbXB3LWNvbmZpZy5pbiBtaWdodCBjaGFuZ2Ugc28gYXMgbm90IHRvIGNyZWF0ZSB0aGlzCi0JIyBhbnltb3JlLCBzbyBnZXQgcmlkIG9mIGl0IG5vdyB0byBiZSBzYWZlLgotCURlbGV0ZSAtaSAteSAie29iamRpcn0ibWsudG1wCi1FbmQgSWYKLQotIyBJZiB0aGVyZSBhcmUgc2VkIHNjcmlwdHMgdG8gZWRpdCB0aGUgVW5peCBNYWtlZmlsZS5pbiwgdXNlIHRoZW07IG90aGVyd2lzZQotIyB1c2UgYW4gbXB3LW1ha2UuaW4gaWYgcHJlc2VudC4KLQotSWYgImBFeGlzdHMgIntzcmNkaXJ9Im1wdy1tYWtlLnNlZGAiICE9ICIiCi0JSWYgImBFeGlzdHMgIntvYmpkaXJ9ImhhY2tlZF9NYWtlZmlsZS5pbmAiICE9ICIiCi0JCVNldCBNYWtlZmlsZUluICJ7b2JqZGlyfSJoYWNrZWRfTWFrZWZpbGUuaW4KLQlFbHNlCi0JCVNldCBNYWtlZmlsZUluICJ7c3JjZGlyfSJNYWtlZmlsZS5pbgotCUVuZCBJZgotCSMgRmluZCB0aGUgZ2VuZXJpYyBtYWtlZmlsZSBlZGl0aW5nIHNjcmlwdC4KLQlJZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImNvbmZpZzptcHc6Zy1tcHctbWFrZS5zZWRgIiAhPSAiIgotCQlzZWQgLWYgIntzcmNyb290fSJjb25maWc6bXB3OmctbXB3LW1ha2Uuc2VkICJ7TWFrZWZpbGVJbn0iID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQotCUVsc2UgSWYgImBFeGlzdHMgIntzcmNyb290fSJ1dGlsczptcHc6Zy1tcHctbWFrZS5zZWRgIiAhPSAiIgotCQlzZWQgLWYgIntzcmNyb290fSJ1dGlsczptcHc6Zy1tcHctbWFrZS5zZWQgIntNYWtlZmlsZUlufSIgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xCi0JRWxzZSBJZiAiYEV4aXN0cyAie3NyY2Rpcn0iZy1tcHctbWFrZS5zZWRgIiAhPSAiIgotCQlzZWQgLWYgIntzcmNkaXJ9ImctbXB3LW1ha2Uuc2VkICJ7TWFrZWZpbGVJbn0iID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQotCUVsc2UKLQkJRWNobyBXYXJuaW5nOiBnLW1wdy1tYWtlLnNlZCBub3QgZm91bmQsIGNvcHlpbmcgIntNYWtlZmlsZUlufSIgdmVyYmF0aW0uLi4KLQkJQ2F0ZW5hdGUgIntNYWtlZmlsZUlufSIgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xCi0JRW5kIElmCi0Jc2VkIC1mICJ7c3JjZGlyfSJtcHctbWFrZS5zZWQgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yCi0Jc2VkIC1lICdzL15wcmVmaXggPSAuKiQvcHJlZml4ID0ge21wd19wcmVmaXh9L2cnIC1lICdzL15leGVjX3ByZWZpeCA9IC4qJC9leGVjX3ByZWZpeCA9IHttcHdfZXhlY19wcmVmaXh9L2cnIC1lICdzL15iaW5kaXIgPSBAYmluZGlyQC9iaW5kaXIgPSB7bXB3X2JpbmRpcn0vZycgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIgPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0zCi0Jc2VkIC1lICJzL0BEQVNIX0NfRkxBR0Ave2Rhc2hfY19mbGFnfS8iIC1lICJzL0BTRUdNRU5UX0ZMQUcoXChbXildKlwpKUAve3NlZ21lbnRfZmxhZ31cMS8iICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0zID4ie29iamRpcn0ibXB3LW1ha2UuaW4KLQl0ci03dG84ICJ7b2JqZGlyfSJtcHctbWFrZS5pbiA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQlJZiAiYEV4aXN0cyAie29iamRpcn0ibWsuc2VkYCIgIT0gIiIKLQkJc2VkIC1mICJ7b2JqZGlyfSJtay5zZWQgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbSA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIKLQkJUmVuYW1lIC15ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQlFbmQgSWYKLQlNb3ZlSWZDaGFuZ2UgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbSAie29iamRpcn0iTWFrZWZpbGUKLQlEZWxldGUgLWkgLXkgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbVsxMl0KLQlJZiB7dmVyaWZ5fSA9PSAxCi0JCUVjaG8gQ3JlYXRlZCBNYWtlZmlsZSBpbiAiYERpcmVjdG9yeWAiCi0JRW5kIElmCi1FbHNlIElmICJgRXhpc3RzICJ7c3JjZGlyfSJtcHctbWFrZS5pbmAiICE9ICIiCi0Jc2VkIC1lICdzL15wcmVmaXggPSAuKiQvcHJlZml4ID0ge21wd19wcmVmaXh9L2cnICJ7c3JjZGlyfSJtcHctbWFrZS5pbiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKLQlzZWQgLWUgInMvQERBU0hfQ19GTEFHQC97ZGFzaF9jX2ZsYWd9LyIgLWUgInMvQFNFR01FTlRfRkxBRyhcKFteKV0qXCkpQC97c2VnbWVudF9mbGFnfX1cMS8iICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xID4ie29iamRpcn0iTWFrZWZpbGUudGVtMgotCXRyLTd0bzggIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIgPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi0JSWYgImBFeGlzdHMgIntvYmpkaXJ9Im1rLnNlZGAiICE9ICIiCi0JCXNlZCAtZiAie29iamRpcn0ibWsuc2VkICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0gPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yCi0JCVJlbmFtZSAteSAie29iamRpcn0iTWFrZWZpbGUudGVtMiAie29iamRpcn0iTWFrZWZpbGUudGVtCi0JRW5kIElmCi0JTW92ZUlmQ2hhbmdlICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0gIntvYmpkaXJ9Ik1ha2VmaWxlCi0JRGVsZXRlIC1pIC15ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW1bMTJdCi0JSWYge3ZlcmlmeX0gPT0gMQotCQlFY2hvIENyZWF0ZWQgTWFrZWZpbGUgaW4gImBEaXJlY3RvcnlgIgotCUVuZCBJZgotRW5kIElmCi0KLSMgUHJvZHVjZSBhIGJ1aWxkIHNjcmlwdCBpZiB0aGUgc291cmNlIGlzIGRlZmluZWQuCi0KLUlmICJgRXhpc3RzICJ7c3JjZGlyfSJtcHctYnVpbGQuaW5gIiAhPSAiIgotCUVjaG8gIlNldCBzcmNyb290ICIge3NyY3Jvb3R9ID4gIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KLQlFY2hvICJTZXQgc3JjZGlyICIge3NyY2Rpcn0gPj4gIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KLQlFY2hvICJTZXQgdGFyZ2V0X2Nhbm9uaWNhbCAiIHt0YXJnZXRfY2Fub25pY2FsfSA+PiAie29iamRpcn0ibXB3LWJ1aWxkLnRlbQotCUVjaG8gIlNldCBwcmVmaXggIiB7cHJlZml4fSA+PiAie29iamRpcn0ibXB3LWJ1aWxkLnRlbQotCXRyLTd0bzggIntzcmNkaXJ9Im1wdy1idWlsZC5pbiA+PiJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCi0JTW92ZUlmQ2hhbmdlICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtICJ7b2JqZGlyfSJtcHctYnVpbGQKLQlJZiB7dmVyaWZ5fSA9PSAxCi0JCUVjaG8gQ3JlYXRlZCBtcHctYnVpbGQgaW4gImBEaXJlY3RvcnlgIgotCUVuZCBJZgotRW5kIElmCi0KLSMgQXBwbHkgb3Vyc2VsdmVzIHJlY3Vyc2l2ZWx5IHRvIHRoZSBsaXN0IG9mIHN1YmRpcmVjdG9yaWVzIHRvIGNvbmZpZ3VyZS4KLQotSWYge3JlY3Vyc2V9ID09IDEKLQlGb3Igc3ViZGlyIEluIHtjb25maWdkaXJzfQotCQlTZXQgc2F2ZWRpciAiYERpcmVjdG9yeWAiCi0JCUlmICJgRXhpc3RzICJ7c3JjZGlyfXtzdWJkaXJ9OiJgIiA9PSAiIgotCQkJSWYge3ZlcmlmeX0gPT0gMQotCQkJCUVjaG8gTm8gIntzcmNkaXJ9e3N1YmRpcn06IiBmb3VuZCwgc2tpcHBpbmcKLQkJCUVuZCBJZgotCQkJQ29udGludWUKLQkJRW5kIElmCi0JCUlmIHt2ZXJpZnl9ID09IDEKLQkJCUVjaG8gQ29uZmlndXJpbmcge3N1YmRpcn0uLi4KLQkJRW5kIElmCi0JCUlmICJgRXhpc3RzICJ7b2JqZGlyfXtzdWJkaXJ9OiJgIiA9PSAiIgotCQkJTmV3Rm9sZGVyICJ7b2JqZGlyfXtzdWJkaXJ9IgotCQlFbmQgSWYKLQkJU2V0RGlyZWN0b3J5ICJ7b2JqZGlyfXtzdWJkaXJ9OiIKLQkJIntUaGlzU2NyaXB0fSIgLS10YXJnZXQgInt0YXJnZXRfY2Fub25pY2FsfSIgLS1zcmNkaXIgIntzcmNkaXJ9e3N1YmRpcn06IiAtLXNyY3Jvb3QgIntzcmNyb290fSIgLS1wcmVmaXggIntwcmVmaXh9IiAtLWNjICJ7aG9zdF9jY30iIHt2ZXJpZnlzdHJ9IHtlbmFibGVfb3B0aW9uc30ge2Rpc2FibGVfb3B0aW9uc30KLQkJU2V0RGlyZWN0b3J5ICJ7c2F2ZWRpcn0iCi0JRW5kIEZvcgotRW5kIElmCi0KLVNldERpcmVjdG9yeSAie3NhdmVkaXJ9IgpkaWZmIC0tZ2l0IGEvbXB3LWluc3RhbGwgYi9tcHctaW5zdGFsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjNWFhYy4uMDAwMDAwMAotLS0gYS9tcHctaW5zdGFsbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0jIEdOVSBJbnN0YWxsIHNjcmlwdCBmb3IgTVBXLgotCi1TZXQgT2xkRXhpdCAie0V4aXR9IgotU2V0IEV4aXQgMAotCi1TZXQgVGVtcFVzZXJTdGFydHVwICJ7VGVtcEZvbGRlcn0iX190ZW1wX19Vc2VyU3RhcnR1cAotCi1FY2hvICcjIFVzZXJTdGFydHVwIGdlbmVyYXRlZCBieSBHTlUgSW5zdGFsbCBzY3JpcHQnID4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAnJwkJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLQotIyAoc2hvdWxkKSBDaGVjayB0aGF0IGRpc2sgc3BhY2UgaXMgc3VmZmljaWVudCBmb3IgaW5zdGFsbGF0aW9uLgotCi0jIEFzc3VtZSB0aGF0IHRoZSBpbnN0YWxsIHNjcmlwdCBpcyB3aGVyZSBldmVyeXRoaW5nIGVsc2UgaXMuCi0KLVNldCB0aGlzZGlyICJgRGlyZWN0b3J5YCIKLQotIyBDb3B5IHRoZSBiaW5hcmllcyB0byB0aGUgZGVzaXJlZCBwbGFjZS4KLQotQ29uZmlybSAtdCAiQ29weSB0aGUgYmluYXJpZXMgdG8gc29tZXdoZXJlIGVsc2U/IgotU2V0IFRtcFN0YXR1cyB7U3RhdHVzfQotSWYge1RtcFN0YXR1c30gPT0gMAotCVNldCBiaW5kZXN0ICJgR2V0RmlsZU5hbWUgLWQgLW0gIldoZXJlIHRvIGluc3RhbGwgdGhlIGJpbmFyaWVzPyJgIgotCUlmIHtTdGF0dXN9ID09IDAKLQkJSWYgImBFeGlzdHMgInt0aGlzZGlyfWJpbiJgIiAhPSAiIgotCQkJRm9yIGFmaWxlIEluICJ7dGhpc2Rpcn0iYmluOlxPcHRpb24teAotCQkJCUR1cGxpY2F0ZSAteSAie2FmaWxlfSIgIntiaW5kZXN0fSIKLQkJCUVuZCBGb3IKLQkJRWxzZQotCQkJRWNobyAiYmluIGRpcmVjdG9yeSBub3QgZm91bmQsIGV4aXRpbmciCi0JCQlFeGl0IDEKLQkJRW5kIElmCi0JRWxzZQotCQlFY2hvICJObyBkZXN0aW5hdGlvbiBzdXBwbGllZCwgZXhpdGluZyIKLQkJRXhpdCAxCi0JRW5kIElmCi1FbHNlIElmIHtUbXBTdGF0dXN9ID09IDQKLQkjIFVzZSB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5LgotCVNldCBiaW5kZXN0ICJ7dGhpc2Rpcn1iaW46IgotRWxzZQotCSMgQ2FuY2VsbGVkIGZyb20gY29uZmlybWF0aW9uLCBlc2NhcGUgYWx0b2dldGhlci4KLQlFeGl0IDEKLUVuZCBJZgotCi0jIENvcHkgdGhlIGxpYnJhcmllcyB0byB0aGUgZGVzaXJlZCBwbGFjZS4KLQotQ29uZmlybSAtdCAiQ29weSB0aGUgbGlicmFyaWVzIHRvIHNvbWV3aGVyZSBlbHNlPyIKLVNldCBUbXBTdGF0dXMge1N0YXR1c30KLUlmIHtUbXBTdGF0dXN9ID09IDAKLQlTZXQgbGliZGVzdCAiYEdldEZpbGVOYW1lIC1kIC1tICJXaGVyZSB0byBpbnN0YWxsIHRoZSBsaWJyYXJpZXM/ImAiCi0JSWYge1N0YXR1c30gPT0gMAotCQlJZiAiYEV4aXN0cyAie3RoaXNkaXJ9bGliOiJgIiAhPSAiIgotCQkJRm9yIGFmaWxlIEluICJ7dGhpc2Rpcn0ibGliOlxPcHRpb24teAotCQkJCUR1cGxpY2F0ZSAteSAie2FmaWxlfSIgIntsaWJkZXN0fSIKLQkJCUVuZCBGb3IKLQkJRWxzZQotCQkJRWNobyAibGliIGRpcmVjdG9yeSBub3QgZm91bmQsIGV4aXRpbmciCi0JCQlFeGl0IDEKLQkJRW5kIElmCi0JRWxzZQotCQlFY2hvICJObyBkZXN0aW5hdGlvbiBzdXBwbGllZCwgZXhpdGluZyIKLQkJRXhpdCAxCi0JRW5kIElmCi1FbHNlIElmIHtUbXBTdGF0dXN9ID09IDQKLQkjIFVzZSB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5LgotCVNldCBsaWJkZXN0ICJ7dGhpc2Rpcn1saWI6IgotRWxzZQotCSMgQ2FuY2VsbGVkIGZyb20gY29uZmlybWF0aW9uLCBlc2NhcGUgYWx0b2dldGhlci4KLQlFeGl0IDEKLUVuZCBJZgotCi0KLSMgQWRkIHRoZSBsb2NhdGlvbiBvZiB0aGUgYmluYXJpZXMgdG8gdGhlIGNvbW1hbmQgcGF0aC4KLQotRWNobyAtbiAnU2V0IENvbW1hbmRzICInCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAtbiAie2JpbmRlc3R9IgkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICAgICcse0NvbW1hbmRzfSInCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gJycJCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi0KLSMgU2V0IHVwIEdDQyBleGVjIHByZWZpeC4KLQotU2V0IGdjY2xpYmRpciAie2xpYmRlc3R9ImdjYy1saWI6Ci0KLUVjaG8gLW4gJ1NldCBHQ0NfRVhFQ19QUkVGSVggIicJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvIC1uICJ7Z2NjbGliZGlyfSIJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAgICAnIicJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gIkV4cG9ydCBHQ0NfRVhFQ19QUkVGSVgiCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAnJwkJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLQotIyBTZXQgdXAgcGF0aCB0byBsaWJnY2MueGNvZmYgZXRjLgotCi1FY2hvIC1uICdTZXQgR0NDUFBDTGlicmFyaWVzICInCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAtbiAie2xpYmRlc3R9IgkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICAgICciJwkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAiRXhwb3J0IEdDQ1BQQ0xpYnJhcmllcyIJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICcnCQkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotCi0jIERpc3BsYXkgY29udGVudHMgb2YgVXNlclN0YXJ0dXAsIGNvbmZpcm0gaW5zdGFsbGF0aW9uLgotCi1TZXQgVXNlclN0YXJ0dXBOYW1lICJVc2VyU3RhcnR1cFxPcHRpb24tOEdOVSIKLQotRWNobyAiQ29udGVudHMgb2YiIHtVc2VyU3RhcnR1cE5hbWV9ICJ3aWxsIGJlOiIKLUNhdGVuYXRlICJ7VGVtcFVzZXJTdGFydHVwfSIKLQotQ29uZmlybSAiSW5zdGFsbCB7VXNlclN0YXJ0dXBOYW1lfSBpbnRvIHRoZSBNUFcgZm9sZGVyIHtNUFd9ID8iCi1JZiB7U3RhdHVzfSA9PSAwCi0JRHVwbGljYXRlICJ7VGVtcFVzZXJTdGFydHVwfSIgIntNUFd9e1VzZXJTdGFydHVwTmFtZX0iCi0JRGVsZXRlIC15ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVsc2UKLQlFY2hvICJ7VXNlclN0YXJ0dXBOYW1lfSBmaWxlIG5vdCBpbnN0YWxsZWQiCi1FbmQgSWYKLQotIyAoc2hvdWxkKSBDaGVjayBIRVhBIHJlc291cmNlLCB3YXJuIGlmIGxvdy4KLQotIyAoc2hvdWxkKSBDaGVjayBmb3Igc3BhY2VzIGluIHBhdGhuYW1lcywgd2FybiBpZiBmb3VuZC4KLQotRWNobyAiSW5zdGFsbGF0aW9uIHdhcyBzdWNjZXNzZnVsLiIKLUVjaG8gIiIKLUVjaG8gIkJlIHN1cmUgdG8gcmV2aWV3IHRoZSB1c2FnZSBub3RlcyBpbiAnUmVhZCBNZSBmb3IgTVBXJyBiZWZvcmUgcHJvY2VlZGluZyEiCi0KLSMgUmVzdG9yZSBwcmV2aW91cyBzZXR0aW5ncy4KLQotU2V0IEV4aXQgIntPbGRFeGl0fSIKZGlmZiAtLWdpdCBhL29wY29kZXMvQ2hhbmdlTG9nIGIvb3Bjb2Rlcy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjIyZDAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUwICswLDAgQEAKLVdlZCBEZWMgIDEgMDM6MzQ6NTMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtMTAzMDAtb3BjLmMsIG0xMDMwMC1kaXMuYzogQWRkIGFtMzMgc3VwcG9ydC4KLQotV2VkIE5vdiAyNCAyMDoyOTo1OCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmMgKHVuaXRfY29uZF9uYW1lcyk6IEFkZCBQQTIuMCB1bml0IGNvbmRpdGlvbiBuYW1lcy4KLQkocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdCJyBvcGVyYW5kLgotCi0xOTk5LTExLTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jOiBGaXggcGF0dGVybiBmb3IgImNwZmcsZnswfDF9LGMiIGluc3RydWN0aW9uLgotCi0xOTk5LTExLTE4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoSTUpOiBOZXcuCi0JKGFicy5wcyxhZGQucHMsYWxudi5wcyxjLkNPTkQucHMsY3Z0LnMucGwsY3Z0LnMucHUsY3Z0LnBzLnMKLQltYWRkLnBzLG1vdmYucHMsbW92dC5wcyxtdWwucHMsbmV0LnBzLG5tYWRkLnBzLG5tc3ViLnBzLAotCXBsbC5wcyxwbHUucHMscHVsLnBzLHB1dS5wcyxzdWIucHMsc3V4YzEsbHV4YzEpOiBOZXcuCi0KLU1vbiBOb3YgMTUgMTk6MzQ6NTggMTk5OSAgRG9uYWxkIExpbmRzYXkgIDxkbGluZHNheUBjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogQWRkZWQgZ2VuZXJhbCBwdXJwb3NlICdYJyBmb3JtYXQuCi0JKiBhcm0tb3BjLmggKHByaW50X2luc25fYXJtKTogQWRkZWQgY29tbWVudCBkb2N1bWVudGluZwotCXRoZSAnWCcgZm9ybWF0IGp1c3QgYWRkZWQgdG8gYXJtLWRpcy5jLgotCi0xOTk5LTExLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAobGEpOiBDcmVhdGUgYSB2ZXJzaW9uIHRoYXQganVzdCB1c2VzIGFkZGl1IGRpcmVjdGx5LgotCShkbGEpOiBFeHBhbmQgdG8gZGFkZGl1IGlmIHBvc3NpYmxlLgotCi0xOTk5LTExLTExICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgc3Nub3AgcGF0dGVybi4KLQotMTk5OS0xMS0wMSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBVc2UgT1BDT0RFX0lTX01FTUJFUi4KLQotMTk5OS0xMC0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAobXZ0YWNjKTogVXNlIGZvcm1hdCBTSE9SVF9BUiBub3QgU0hPUlRfQUEKLQkoZDMwdl9mb3JtYXRfdGFiKTogRGVmaW5lIHRoZSBTSE9SVF9BUiBmb3JtYXQuCi0KLTE5OTktMTAtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLWRpcy5jOiBSZW1vdmUgc3B1cmlvdXMgY29kZSBpbnRyb2R1Y2VkIGluIHByZXZpb3VzIGRlbHRhLiAKLQotMTk5OS0xMC0yNyAgU2NvdHQgQmFtYnJvdWdoICA8c2NvdHRiQG5ldHdpbmRlci5vcmc+Ci0KLQkqIGFybS1kaXMuYzogSW5jbHVkZSBzeXNkZXAuaCB0byBwcmV2ZW50IGNvbXBpbGUgdGltZSB3YXJuaW5ncy4KLQotMTk5OS0xMC0xOCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLW9wYy5jIChhbHBoYV9vcGVyYW5kcyk6IEZpbGwgaW4gbWlzc2luZyBpbml0aWFsaXplci4KLQkoYWxwaGFfbnVtX29wZXJhbmRzKTogQ29udmVydCB0byB1bnNpZ25lZC4KLQkoYWxwaGFfbnVtX29wY29kZXMpOiBEaXR0by4KLQkoaW5zZXJ0X3JiYSk6IERlY2xhcmUgdW51c2VkIGFyZ3VtZW50cyBBVFRSSUJVVEVfVU5VU0VELgotCShpbnNlcnRfcmNhKTogRGl0dG8uCi0JKGluc2VydF96YSk6IERpdHRvLgotCShpbnNlcnRfemIpOiBEaXR0by4KLQkoaW5zZXJ0X3pjKTogRGl0dG8uCi0JKGV4dHJhY3RfYmRpc3ApOiBEaXR0by4KLQkoZXh0cmFjdF9qaGludCk6IERpdHRvLgotCShleHRyYWN0X2V2Nmh3amhpbnQpOiBEaXR0by4KLQotU3VuIE9jdCAxMCAwMTo0ODowMSAxOTk5ICBKZXJyeSBRdWlubiA8amVycnkucXVpbm4uYWR2OTFAYWx1bS5kYXJ0bW91dGgub3JnPgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiAgQWRkIG5ldyBjb2RlcyAnY2MnLCAnY2QnLCAnY0MnLAotCSdjbycsICdAJy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogUmVtb3ZlZCB1bnVzZWQgYXJncy4gIEZpeCAnP1cnLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiAgSW1wbGVtZW50IGNvZGVzICI/TiIsICI/USIuCi0KLVRodSBPY3QgIDcgMDA6MTI6NDMgTURUIDE5OTkJRGllZ28gTm92aWxsbyA8ZG5vdmlsbG9AY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGVyYW5kcyk6IEFkZCBSRVNUUklDVEVEX05VTTMgZmxhZyBmb3IKLQlyYWMvcmFjaGkgaW5zdHJ1Y3Rpb25zLgotCShkMTB2X29wY29kZXMpOiBBZGRlZCBzZXZlbiBuZXcgaW5zdHJ1Y3Rpb25zIGxkLCBsZDJ3LCBzYWMsIHNhY2hpLAotCXNsYWUsIHN0IGFuZCBzdDJ3LgotCi0xOTk5LTEwLTA0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kZXNjLmg6IFJlYnVpbGQuCi0JKiBtMzJyLWFzbS5jLG0zMnItZGVzYy5jLG0zMnItZGVzYy5oOiBSZWJ1aWxkLiAgQWRkIG0zMnJ4IHN1cHBvcnQuCi0JKiBtMzJyLWRpcy5jLG0zMnItaWJsZC5jLG0zMnItb3BjLmMsbTMyci1vcGMuaCxtMzJyLW9waW5zdC5jOiBEaXR0by4KLQotMTk5OS0wOS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmg6IEZpeCBiaXQgcGF0dGVybnMgZm9yIHNldmVyYWwgbG9hZCBhbmQgc3RvcmUKLQlpbnN0cnVjdGlvbnMuICAKLQotVGh1IFNlcCAyMyAwODoyNzoyMCAxOTk5ICBKZXJyeSBRdWlubiA8amVycnkucXVpbm4uYWR2OTFAYWx1bS5kYXJ0bW91dGgub3JnCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFJlcGxhY2UgJ0InLCAnTScsICdnJyBhbmQgJ2wnIHdpdGgKLQljbGVhbmVyIGNvZGUgdXNpbmcgY29tcGxldGVyIHByZWZpeGVzLiAgQWRkICdZJy4KLQotU3VuIFNlcCAxOSAxMDo0MToyNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmM6IChwcmludF9pbnNuX2hwcGEpOiBDb3JyZWN0ICdjSicsICdjYycuCi0KLQkqIGhwcGEtZGlzLmMgKGV4dHJhY3RfMjIpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnSicsICdLJywgYW5kICdjYycuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnZmUnIGFuZCAnY0onLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJyMnLCAnZCcsIGFuZCAnY3EnLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ20nLCAnaCcsICc9Jy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdYJyBvcGVyYW5kLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ0InIG9wZXJhbmQuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnTScgYW5kICdMJyBvcGVyYW5kcy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdsJyBvcGVyYW5kLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ2cnIG9wZXJhbmQuCi0KLVNhdCBTZXAgMTggMTE6MzY6MTIgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBPdXRwdXQgYSBzcGFjZSBhZnRlciAnWCcgY29tcGxldGVyLgotCi0JKiBocHBhLWRpcy5jOiAocHJpbnRfaW5zbl9ocHBhKTogRG8gb3V0cHV0IGEgc3BhY2UgYmVmb3JlIGEgJ3YnCi0Jb3BlcmFuZC4KLQotCSogaHBwYS1kaXMuYzogKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnZlgnLgotCi0JKiBocHBhLWRpcy5jOiAocHJpbnRfaW5zbl9ocHBhKTogQWRkIG1pc3NpbmcgYnJlYWsgYWZ0ZXIKLQlGUCByZWdpc3RlciBjYXNlLgotCi0JKiBocHBhLWRpcy5jOiBGaW5pc2ggY29uc3RpZnlpbmcgdmFyaW91cyBjb21wbGV0ZXJzLCByZWdpc3RlcgotCW5hbWVzLCBldGMgZXRjLgotCi0xOTk5LTA5LTE0ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChDYW5vbmljYWxpemF0aW9uIG9mIHRhcmdldCBuYW1lcyk6IFJlbW92ZSBhZGRpbmcKLQkke0NPTkZJR19TSEVMTH0gaW4gZnJvbnQgb2YgJGFjX2NvbmZpZ19zdWIsIHNpbmNlIGF1dG9jb25maWcgMi4xNAotCWdlbmVyYXRlcyAkYWNfY29uZmlnX3N1YiB3aXRoIGEgJHtDT05GSUdfU0hFTEx9IGFscmVhZHkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBTZXAgIDcgMTM6NTA6MzIgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBFc2NhcGUgJyUnIGluIG91dHB1dCBzdHJpbmdzLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ1onIGFyZ3VtZW50LgotCi0xOTk5LTA5LTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaDogQWRkIG11bHUudyBhbmQgbXVscy53IHBhdHRlcm5zLiAgVGhlc2UgYXJlIHRoZSBjb3JyZWN0Ci0JbmFtZXMgZm9yIHRoZSBtdWx1IGFuZCBtdWxzIHBhdHRlcm5zLgotCi0xOTk5LTA5LTA0ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bwb2JveC5jb20+Ci0KLQkqIHBqLW9wYy5jOiBOZXcgZmlsZS4KLQkqIHBqLWRpcy5jOiBOZXcgZmlsZS4KLQkqIGRpc2Fzc2VtYmxlLmMJKGRpc2Fzc2VtYmxlcik6IEhhbmRsZSBiZmRfYXJjaF9wai4KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGJmZF9wal9hcmNoLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBBZGQgcGotZGlzLmMgYW5kIHBqLW9wYy5jLgotCShBTExfTUFDSElORVMpOiBBZGQgcGotZGlzLmxvIGFuZCBwai1vcGMubG8uCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA5LTA0ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25faTM4Nik6IFNldCBieXRlc19wZXJfbGluZSB0byA3LgotCi1Nb24gQXVnIDMwIDE4OjU2OjE0IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLW9wYy5jIChmZXRjaCwgZmV0Y2hfbSwgZWNiLCB3aDY0KTogUkEgbXVzdCBiZSBSMzEuCi0KLTE5OTktMDgtMDQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRlc2MuaCxmcjMwLWRpcy5jLGZyMzAtaWJsZC5jLGZyMzAtb3BjLmM6IFJlYnVpbGQuCi0JKiBtMzJyLWFzbS5jLG0zMnItZGVzYy5oLG0zMnItZGlzLmMsbTMyci1pYmxkLmMsbTMyci1vcGMuYzogUmVidWlsZC4KLQkqIG0zMnItb3BpbnN0LmM6IFJlYnVpbGQuCi0KLVNhdCBBdWcgMjggMDA6Mjc6MjQgMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLSAgICAgICAgKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBSZXBsYWNlICdmJyBieSAndicuICBQcmVmaXggZmxvYXQKLQlyZWdpc3RlciBhcmdzIGJ5ICdmJy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogQWRkIGFyZ3MgcSwgJSwgISwgYW5kIHwuCi0KLQkqIGhwcGEtZGlzLmMgKE1BU0tfMTAsIHJlYWRfd3JpdGVfbmFtZXMsIGFkZF9jb21wbF9uYW1lcywKLQlleHRyYWN0XzEwVV9zdG9yZSk6ICBOZXcuCi0JKHByaW50X2luc25faHBwYSk6ICBBZGQgbmV3IGNvbXBsZXRlcnMuCi0KLQkqIGhwcGEtZGlzLmMgKHNpZ25lZF91bnNpZ25lZF9uYW1lcyxtaXhfaGFsZl9uYW1lcywKLQlzYXR1cmF0aW9uX25hbWVzKTogIE5ldy4KLQkocHJpbnRfaW5zbl9ocHBhKTogQWRkIGNvbXBsZXRlciBjb2RlcyAnYScsICdjaCcsICdjSCcsICdjUycsIGFuZCAnYyonLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBQbGFjZSBjb21wbGV0ZXJzIGJlaGluZCBwcmVmaXggJ2MnLiAKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogQWRkIGNhc2VzIGZvciAnLicsICd+Jy4gJyQnLiBhbmQgJyEnCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6ICBMb29rIGF0IG5leHQgYXJnIGluc3RlYWQgb2YgYml0cwotCXRvIGRlY2lkZSB0byBwcmludCBhIHNwYWNlLgotCi0xOTk5LTA4LTIxICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmM6IEFkZCBBTUQgYXRobG9uIGluc3RydWN0aW9uIHN1cHBvcnQuCi0KLTE5OTktMDgtMTAgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBXYWxseSBJaW11cmEgPGlpbXVyYUBtaWNyb3VuaXR5LmNvbT46Ci0JKiBkaXMtYnVmLmMgKGJ1ZmZlcl9yZWFkX21lbW9yeSk6IFJld3JpdGUgZXhwcmVzc2lvbiB0byBhdm9pZAotCW92ZXJmbG93IGF0IGVuZCBvZiBhZGRyZXNzIHNwYWNlLgotCShnZW5lcmljX3ByaW50X2FkZHJlc3MpOiBVc2Ugc3ByaW50Zl92bWEuCi0KLTE5OTktMDgtMDggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVuYW1lIC5kZXAqIGZpbGVzIHRvIERFUCouICBDaGFuZ2UgREVQIHZhcmlhYmxlIHRvCi0JTUtERVAuICBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXVnICA2IDA5OjQ2OjM1IDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCi0JKiBocHBhLWRpcy5jIChjb21wYXJlX2NvbmRfNjRfbmFtZXMsIGNtcGliX2NvbmRfNjRfbmFtZXMsCi0JYWRkX2NvbmRfNjRfbmFtZXMsIHdpZGVfYWRkX2NvbmRfbmFtZXMsIGxvZ2ljYWxfY29uZF82NF9uYW1lcywKLQl1bml0X2NvbmRfNjRfbmFtZXMsIHNoaWZ0X2NvbmRfNjRfbmFtZXMsIGJiX2NvbmRfNjRfbmFtZXMpOiBOZXcuCi0JKHByaW50X2luc25faHBwYSk6IEFkZCA2NCBiaXQgY29uZGl0aW9uIGNvbXBsZXRlcnMuCi0KLVRodSBBdWcgIDUgMTY6NTk6NTggMTk5OSAgSmVycnkgUXVpbm4gPGpxdWlubkBub3J0ZWxuZXR3b3Jrcy5jb20+Ci0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IENoYW5nZSBjb25kaXRpb24gYXJncyB0byB1c2UKLQknPycgcHJlZml4LgotCi1XZWQgSnVsIDI4IDA0OjMzOjU4IDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBSZW1vdmUgdW5uZWNlc3NhcnkgdGVzdCBpbiAnRScKLQljb2RlLgotCi0xOTk5LTA3LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gTWFyayBFbGJyZWNodDoKLQkqIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZTsgb2Jzb2xldGUuCi0KLTE5OTktMDctMTEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkaXMtYnVmLmM6IEFkZCBBVFRSSUJVVEVfVU5VU0VEIGFzIGFwcHJvcHJpYXRlLgotCShnZW5lcmljX3N0cmNhdF9hZGRyZXNzKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkqIGkzODYtZGlzLmM6IEluaXRpYWxpemUgYWxsIHN0cnVjdHVyZSBmaWVsZHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JQWRkIEFUVFJJQlVURV9VTlVTRUQgYXMgYXBwcm9wcmlhdGUuCi0KLTE5OTktMDctMDggIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBEaWZmZXJlbnRpYXRlIGJldHdlZW4KLQlhZGRpdGlvbiBhbmQgb3Jpbmcgd2hlbiBndWVzc2luZyBzeW1ib2wgZm9yIGNvbW1lbnQuCi0KLTE5OTktMDctMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBEaXNwbGF5IGhleCBlcXVpdmFsZW50IG9mIHJvdGF0ZWQKLQljb25zdGFudC4gCi0KLTE5OTktMDYtMjMgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYzogTWVudGlvbiBpbnRlbCBtb2RlIHNwZWNpYWxzIGluIG1hY3JvIGNoYXIgY29tbWVudC4KLQotMTk5OS0wNi0yMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFscGhhLWRpcy5jOiBEb24ndCBpbmNsdWRlIDxzdGRsaWIuaD4uCi0JKiBhcm0tZGlzLmM6IEluY2x1ZGUgInN5c2RlcC5oIi4KLQkqIHRpYzMwLWRpcy5jOiBEb24ndCBpbmNsdWRlIDxzdGRsaWIuaD4gb3IgPHN0cmluZy5oPi4gIEluY2x1ZGUKLQkic3lzZGVwLmgiLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDYtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBBZGQgZGV0ZWN0aW9uIG9mIElNQiBhbmQgSU1CUmFuZ2UKLQlTV0lzLiAKLQotMTk5OS0wNi0xNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4gJiBEcmV3IE1vc2xleSA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChhcm1fcmVnbmFtZXMpOiBUdXJuIGludG8gYSBwb2ludGVyIHRvIGEgcmVnaXN0ZXIKLQluYW1lIHNldC4KLQkoYXJtX3JlZ25hbWVzX3N0YW5kYXJkKTogTmV3IHZhcmlhYmxlOiBBcnJheSBvZiBBUk0gcmVnaXN0ZXIKLQluYW1lcyBhY2NvcmRpbmcgdG8gQVJNIGluc3RydWN0aW9uIHNldCBub21lbmNsYXR1cmUuIAotCShhcm1fcmVnbmFtZXNfYXBjcyk6IE5ldyB2YXJpYWJsZTogQXJyYXkgb2YgQVJNIHJlZ2lzdGVyIG5hbWVzCi0JYWNjb3JkaW5nIHRvIEFSTSBQcm9jZWR1cmUgQ2FsbCBTdGFuZGFyZC4KLQkoYXJtX3JlZ25hbWVzX3Jhdyk6IE5ldyB2YXJpYWJsZTogQXJyYXkgb2YgQVJNIHJlZ2lzdGVyIG5hbWVzCi0JdXNpbmcganVzdCAncicgYW5kIHRoZSByZWdpc3RlciBudW1iZXIuCi0JKGFybV90b2dnbGVfcmVnbmFtZXMpOiBOZXcgZnVuY3Rpb246IFRvZ2dsZSB0aGUgY2hvc2VuIHJlZ2lzdGVyIHNldAotCW5hbWluZyBzY2hlbWUuCi0JKHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb25zKTogTmV3IGZ1bmN0aW9uOiBQYXJzZSBhbnkgdGFyZ2V0Ci0JZGlzYXNzZW1ibGVyIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCShwcmludF9pbnNuX2JpZ19hcm0pOiBDYWxsIHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb25zIGlmIGFueQotCWFyZSBkZWZpbmVkLgotCShwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBDYWxsIHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb25zIGlmIGFueQotCWFyZSBkZWZpbmVkLgotCi0xOTk5LTA2LTEzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogaTM4Ni1kaXMuYyAoRldBSVRfT1BDT0RFKTogRGVmaW5lLgotCSh1c2VkX3ByZWZpeGVzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZmV0Y2hfZGF0YSk6IERvbid0IHByaW50IGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgaGF2ZSBhbHJlYWR5Ci0JZmV0Y2hlZCBzb21lIGJ5dGVzIHN1Y2Nlc3NmdWxseS4KLQkoY2twcmVmaXgpOiBDbGVhciB1c2VkX3ByZWZpeGVzLiAgVXNlIEZXQUlUX09QQ09ERSwgbm90IDB4OWIuCi0JKHByZWZpeF9uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHJpbnRfaW5zbl9pMzg2KTogSWYgc2V0am1wIGZhaWxzLCBpbmRpY2F0aW5nIGEgZGF0YSBlcnJvciwgYnV0Ci0Jd2UgaGF2ZSBtYW5hZ2VkIHRvIGZldGNoIHNvbWUgYnl0ZXMsIHByaW50IHRoZSBmaXJzdCBvbmUgYXMgYQotCXByZWZpeCBvciBhIC5ieXRlIHBzZXVkby1vcC4gIElmIGZ3YWl0IGlzIGZvbGxvd2VkIGJ5IGEgbm9uCi0JZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24sIHByaW50IHRoZSBmaXJzdCBwcmVmaXguICBTZXQKLQl1c2VkX3ByZWZpeGVzIHdoZW4gcHJlZml4ZXMgYXJlIHVzZWQuICBJZiBhbnkgcHJlZml4ZXMgd2VyZSBub3QKLQl1c2VkIGFmdGVyIGRpc2Fzc2VtYmxpbmcgdGhlIGluc3RydWN0aW9uLCBwcmludCB0aGUgZmlyc3QgcHJlZml4Ci0JaW5zdGVhZCBvZiBwcmludGluZyB0aGUgaW5zdHJ1Y3Rpb24uCi0JKHB1dG9wKTogU2V0IHVzZWRfcHJlZml4ZXMgd2hlbiBwcmVmaXhlcyBhcmUgdXNlZC4KLQkoYXBwZW5kX3NlZywgT1BfRSwgT1BfRywgT1BfUkVHLCBPUF9JLCBPUF9zSSwgT1BfSik6IExpa2V3aXNlLgotCShPUF9ESVIsIE9QX1NJTURfU3VmZml4KTogTGlrZXdpc2UuCi0KLTE5OTktMDYtMDcgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogc3BhcmMtb3BjLmM6IEZpeCB1cCBzZXQsIHNldHN3LCBzZXR1dyBvcGVyYW5kIGtpbmRzLgotCVN1cHBvcnQgc2lnbnggJXJlZywgY2xydXcgJXJlZy4KLQotMTk5OS0wNi0wNyAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBzcGFyYy1vcGMuYzogQWRkIGFsaWFzZXMgU29sYXJpcyBhcyBzdXBwb3J0cy4KLQotTW9uIEp1biAgNyAxMjowNDo1MiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmFtIChDRklMRVMpOiBBZGQgYXJjLXtkaXMsb3BjfS5jIGFuZCB2ODUwLXtkaXMsb3BjfS5jLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgotCi0xOTk5LTA2LTAzICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogTWFrZSBMRFJIL0xEUkIgY29uc2lzdGVudCB3aXRoIExEUgotCXdoZW4gdGFyZ2V0IGlzIFBDLXJlbGF0aXZlLgotCi0xOTk5LTA1LTI4ICBMaW51cyBOb3JkYmVyZyAgPGxpbnVzLm5vcmRiZXJnQGNhbml0LnNlPgotCi0JKiBtNjhrLW9wYy5jOiBSZW5hbWUgTUFDTC9NU0FDTCB0byBNQUMvTVNBQy4gIEFkZCBNQUNNL01TQUNNLiAgQWRkCi0JTU9WRSBNQUNTUixDQ1IuCi0KLQkqIG02OGstZGlzLmMgKGZldGNoX2FyZyk6IEFkZCBwbGFjZXMgYG4nLCBgbycuCi0KLQkqIG02OGstb3BjLmM6IEFkZCBNU0FDLCBNQUNMLCBNT1ZFIHRvL2Zyb20gQUNDLCBNQUNTUiwgTUFTSy4KLQlBZGQgbWNmNTIwNmUgdG8gYXBwcm9wcmlhdGUgaW5zdHJ1Y3Rpb25zLgotCUFkZCBhbGlhcyBmb3IgTUFDLCBNU0FDLgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEFkZCBmb3JtYXRzIGBFJywgYEcnLCBgSCcgYW5kIHBsYWNlCi0JYE4nLgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBBZGQgZGl2c3csIGRpdnNsLCBkaXZ1dywgZGl2dWwsIG1hY2wsCi0JbWFjdywgcmVtc2wsIHJlbXVsIGZvciBtY2Y1MzA3LiAgQ2hhbmdlIG1jZjUyMDAgLS0+IG1jZi4KLQotCSogbTY4ay1kaXMuYzogQWRkIGZvcm1hdCBgdScgYW5kIHBsYWNlcyBgaCcsIGBtJywgYE0nLgotCi0xOTk5LTA1LTE4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKEVkKTogRGVmaW5lLgotCShkaXMzODZfdHdvYnl0ZV9hdHQsIGRpczM4Nl90d29ieXRlX2ludGVsKTogVXNlIEVkIGZvciBtb3ZkLgotCShSdyk6IFJlbW92ZS4KLQkoT1Bfcm0pOiBSZW5hbWUgdG8gT1BfUmQuCi0JKE9ORSk6IFJlbW92ZS4KLQkoT1BfT05FKTogUmVtb3ZlLgotCShwdXRvcCk6IEFkZCBjb25zdCB0byB0ZW1wbGF0ZSBhbmQgcC4KLQkocHJpbnRfaW5zbl94ODYpOiBEZWxldGUuCi0JKHByaW50X2luc25faTM4Nik6IE1lcmdlIG9sZCBmdW5jdGlvbiBwcmludF9pbnNuX3g4Ni4gIEFkZCBjb25zdAotCXRvIGRwLgotCShzdHJ1Y3QgZGlzMzg2KTogQWRkIGNvbnN0IHRvIG5hbWUuCi0JKGRpczM4Nl9hdHQsIGRpczM4Nl9pbnRlbCk6IEFkZCBjb25zdC4KLQkoZGlzMzg2X3R3b2J5dGVfYXR0LCBkaXMzODZfdHdvYnl0ZV9pbnRlbCk6IEFkZCBjb25zdC4KLQkobmFtZXMzMiwgbmFtZXMxNiwgbmFtZXM4LCBuYW1lc19zZWcsIGluZGV4MTYpOiBBZGQgY29uc3QuCi0JKGdycHMsIHByZWZpeF91c2VyX3RhYmxlLCBmbG9hdF9yZWcpOiBBZGQgY29uc3QuCi0JKGZsb2F0X21lbV9hdHQsIGZsb2F0X21lbV9pbnRlbCk6IEFkZCBjb25zdC4KLQkob2FwcGVuZCk6IEFkZCBjb25zdCB0byBzLgotCShPUF9SRUcpOiBBZGQgY29uc3QgdG8gcy4KLQkocHRyX3JlZyk6IEFkZCBjb25zdCB0byBzLgotCShkb2Zsb2F0KTogQWRkIGNvbnN0IHRvIGRwLgotCShPUF9DKTogRG9uJ3Qgc2tpcCBtb2RybSwgaXQncyBub3cgZG9uZSBpbiBPUF9SZC4KLQkoT1BfRCk6IERpdHRvLgotCShPUF9UKTogRGl0dG8uCi0JKE9QX1JkKTogQ2hlY2sgZm9yIHZhbGlkIG1vZC4gIENhbGwgT3BfRSB0byBwcmludC4KLQkoT1BfRSk6IEhhbmRsZSBkX21vZGUgYXJnLiAgQ2hlY2sgZm9yIGJhZCBzZmVuY2UsbGVhLGxkcyBldGMuCi0JKE9QX01TKTogQ2hlY2sgZm9yIHZhbGlkIG1vZC4gIENhbGwgT3BfRU0gdG8gcHJpbnQuCi0JKE9QXzNETm93U3VmZml4KTogU2V0IG9idWZwIGFuZCB1c2Ugb2FwcGVuZCByYXRoZXIgdGhhbgotCXN0cmNhdC4gIENhbGwgQmFkT3AoKSBmb3IgZXJyb3JzLgotCShPUF9TSU1EX1N1ZmZpeCk6IExpa2V3aXNlLgotCShCYWRPcCk6IE5ldyBmdW5jdGlvbi4KLQotMTk5OS0wNS0xMiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODZfaW50ZWwpOiBSZW1vdmUgbWFjcm8gY2hhcnMsIGV4Y2VwdCBmb3IKLQlqRWN4ei4gIENoYW5nZSBjV3RSIGFuZCBjUnRkIHRvIGNXIGFuZCBjUi4KLQkoZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiBSZW1vdmUgbWFjcm8gY2hhcnMgaGVyZSB0b28uCi0JKHB1dG9wKTogSGFuZGxlIFIgYW5kIFcgbWFjcm9zIGZvciBpbnRlbCBtb2RlLgotCi0JKiBpMzg2LWRpcy5jIChTSU1EX0ZpeHVwKTogTmV3IGZ1bmN0aW9uLgotCShkaXMzODZfdHdvYnl0ZV9hdHQpOiBVc2UgaXQgb24gbW92bHBzIGFuZCBtb3ZocHMsIGFuZCBjaGFuZ2UKLQlFdiB0byBFWCBvbiB0aGVzZSBpbnNucy4gIENoYW5nZSBtb3Ztc2twcyBFdiwgWE0gdG8gR3YsIEVYLgotCShkaXMzODZfdHdvYnl0ZV9pbnRlbCk6IFNhbWUgaGVyZS4KLQotCSogaTM4Ni1kaXMuYyAoQXYpOiBSZW1vdmUuCi0JKEFwKTogcmVtb3ZlIGxwdHIuCi0JKGxwdHIpOiBSZW1vdmUuCi0JKE9QU0lNRCk6IERlZmluZS4KLQkoT1BfU0lNRF9TdWZmaXgpOiBOZXcgZnVuY3Rpb24uCi0JKE9QX0RJUik6IFJlbW92ZSBkZWFkIGNvZGUuCi0JKGVBWF9yZWcuLmVESV9yZWcpOiBSZW51bWJlci4KLQkob25lYnl0ZV9oYXNfbW9kcm0pOiBUYWJsZSBudW1iZXJpbmcgY29tbWVudHMuCi0JKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik6IE1vdmUgdG8gYmVmb3JlIHByaW50X2luc25feDg2LgotCShwcmludF9pbnNuX3g4Nik6IE1vdmUgYWxsIHByZWZpeCBvYXBwZW5kcyB0byBhZnRlciB1c2VzX2YzX3ByZWZpeAotCWNoZWNrcy4gIFByaW50IGVycm9yIG9uIGludmFsaWQgZHAtPmJ5dGVtb2RlMi4gIFJlbW92ZSBzaW1kX2NtcCwKLQlhbmQgaGFuZGxlIFNJTUQgY21wIGluc25zIGluIE9QX1NJTURfU3VmZml4LgotCShpbmZvLT5ieXRlc19wZXJfbGluZSk6IEJ1bXAgZnJvbSA1IHRvIDYuCi0JKE9QX05vbmUpOiBSZW1vdmUuCi0JKE9QX0UpOiBVc2UgSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SLiAgSGFuZGxlIHNmZW5jZS4KLQkoT1BfM0ROb3dTdWZmaXgpOiBFbnN1cmUgbW5lbW9uaWMgaW5kZXggdW5zaWduZWQuCi0KLQlQSUlJIFNJTUQgc3VwcG9ydCBmcm9tIERvdWcgTGVkZm9yZCA8ZGxlZGZvcmRAcmVkaGF0LmNvbT4KLQkqIGkzODYtZGlzLmMgKFhNLCBFWCwgTm9uZSk6IERlZmluZS4KLQkoT1BfWE1NLCBPUF9FWCwgT1BfTm9uZSk6IE5ldyBmdW5jdGlvbnMuCi0JKFVTRV9HUk9VUFMsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRSk6IERlZmluZS4KLQkoR1JQMTQpOiBSZW5hbWUgdG8gR1JQQU1ELgotCShHUlAqKTogQWRkIFVTRV9HUk9VUFMgZmxhZy4KLQkoUFJFR1JQKik6IERlZmluZS4KLQkoZGlzMzg2X3R3b2J5dGVfYXR0LCBkaXMzODZfdHdvYnl0ZV9pbnRlbCk6IEFkZCBTSU1EIGluc25zLgotCSh0d29ieXRlX2hhc19tb2RybSk6IEFkZCBTSU1EIGVudHJpZXMuCi0JKHR3b2J5dGVfdXNlc19mM19wcmVmaXgsIHNpbWRfY21wX29wLCBwcmVmaXhfdXNlcl90YWJsZSk6IE5ldy4KLQkoZ3Jwcyk6IEFkZCBTSU1EIGluc25zLgotCShwcmludF9pbnNuX3g4Nik6IE5ldyB2YXJzIHVzZXNfZjNfcHJlZml4IGFuZCBzaW1kX2NtcC4gIERvbid0Ci0Jb2FwcGVuZCByZXB6IGlmIHVzZXNfZjNfcHJlZml4LiAgQWRkIGNvZGUgdG8gaGFuZGxlIG5ldyBncm91cHMgZm9yCi0JU0lNRCBpbnNucy4KLQotCUZyb20gTWFjaWVqIFcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+Ci0JKiBpMzg2LWRpcy5jIChkaXMzODZfYXR0LCBkaXMzODZfaW50ZWwpOiBDaGFuZ2UgMHhFOCBjYWxsIGluc24KLQlvcGVyYW5kIGZyb20gQXYgdG8gSnYuCi0KLTE5OTktMDUtMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLWRpcy5jIChwcmludF9pbnNuX21jb3JlKTogVXNlIC5zaG9ydCB0byBkaXNwbGF5Ci0JdW5pZGVudGlmaWVkIGluc3RydWN0aW9ucywgbm90IC53b3JkLgotCi0xOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KLQotMTk5OS0wNC0xNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLWRlc2MuYyxmcjMwLWRlc2MuaCxmcjMwLWRpcy5jLGZyMzAtaWJsZC5jLGZyMzAtb3BjLmM6IFJlYnVpbGQuCi0JKiBtMzJyLWRlc2MuYyxtMzJyLWRlc2MuaCxtMzJyLWRpcy5jLG0zMnItaWJsZC5jLG0zMnItb3BjLmM6IFJlYnVpbGQuCi0KLU1vbiBBcHIgMTIgMjM6NDY6MTcgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEsIGNhc2UgJzMnKTogTmV3IGNhc2UgZm9yIFBBMi4wCi0JaW5zdHJ1Y3Rpb25zLgotCi0xOTk5LTA0LTEwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtZGVzYy5jLGZyMzAtZGVzYy5oLGZyMzAtaWJsZC5jOiBSZWJ1aWxkLgotCSogbTMyci1kZXNjLmMsbTMyci1kZXNjLmgsbTMyci1vcGluc3QuYzogUmVidWlsZC4KLQotMTk5OS0wNC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG9waW50bC5oIChMQ19NRVNTQUdFUyk6IE5ldmVyIGRlZmluZS4KLQotMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKGludGVsX3N5bnRheCwgb3Blbl9jaGFyLCBjbG9zZV9jaGFyKTogTWFrZSBzdGF0aWMuCi0JKHNlcGFyYXRvcl9jaGFyLCBzY2FsZV9jaGFyKTogTGlrZXdpc2UuCi0JKHByaW50X2luc25feDg2KTogTGlrZXdpc2UuCi0JKHByaW50X2luc25faTM4Nik6IExpa2V3aXNlLiAgQWRkIGRlY2xhcmF0aW9uLgotCi0xOTk5LTAzLTI2ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtZGlzLmM6IFJlYnVpbGQuCi0JKiBtMzJyLWRpcy5jOiBSZWJ1aWxkLgotCi0xOTk5LTAzLTIzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogbTY4ay1vcGMuYzogQ2hhbmdlIGNvbXBhcmUgaW5zdHJ1Y3Rpb25zIHRvIHVzZSAiQHMiIHJhdGhlciB0aGFuCi0JIjtzIiB3aGVuIHVzZWQgd2l0aCBhbiBpbW1lZGlhdGUgb3BlcmFuZC4KLQotMTk5OS0wMy0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX3NldF9jcHUpOiBEZWxldGUuCi0JKGNnZW5fbG9va3VwX2luc24pOiBtYXhfaW5zbl9zaXplIHJlbmFtZWQgdG8gbWF4X2luc25fYml0c2l6ZS4KLQkqIGZyMzAtZGVzYy5jLGZyMzAtZGVzYy5oLGZyMzAtZGlzLmMsZnIzMC1pYmxkLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOgotCVJlYnVpbGQuCi0JKiBtMzJyLWRlc2MuYyxtMzJyLWRlc2MuaCxtMzJyLWRpcy5jLG0zMnItaWJsZC5jLG0zMnItb3BjLmMsbTMyci1vcGMuaDoKLQlSZWJ1aWxkLgotCSogcG8vb3Bjb2Rlcy5wb3Q6IFJlYnVpbGQuCi0KLTE5OTktMDMtMTYgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChtdnRzeXMpOiBSZW1vdmUgRkxBR19MS1IuCi0KLTE5OTktMDMtMTEgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYyAoY2dlbl9zZXRfY3B1KTogTmV3IGFyZyBgaXNhJy4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0JKGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbmFtZSxjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSk6IE5ldyBmbnMuCi0JKGNnZW5fZ2V0X2luc25fb3BlcmFuZHMpOiBSZXdyaXRlIHRlc3QgZm9yIGhhcmRjb2RlZC9vcGVyYW5kIGluZGV4LgotCSogZnIzMC1hc20uYyxmcjMwLWRlc2MuYyxmcjMwLWRlc2MuaCxmcjMwLWRpcy5jLGZyMzAtaWJsZC5jOiBSZWJ1aWxkLgotCSogbTMyci1hc20uYyxtMzJyLWRlc2MuYyxtMzJyLWRlc2MuaCxtMzJyLWRpcy5jLG0zMnItaWJsZC5jOiBSZWJ1aWxkLgotCSogbTMyci1vcGluc3QuYzogUmVidWlsZC4KLQotMTk5OS0wMi0yNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX2h3X2xvb2t1cF9ieV9uYW1lKTogUmV3cml0ZS4KLQkoY2dlbl9od19sb29rdXBfYnlfbnVtKTogUmV3cml0ZS4KLQkqIGZyMzAtZGVzYy5jLGZyMzAtZGVzYy5oLGZyMzAtZGlzLmMsZnIzMC1pYmxkLmMsZnIzMC1vcGMuYzogUmVidWlsZC4KLQkqIG0zMnItZGVzYy5jLG0zMnItZGVzYy5oLG0zMnItZGlzLmMsbTMyci1pYmxkLmMsbTMyci1vcGMuYzogUmVidWlsZC4KLQkqIG0zMnItb3BpbnN0LmM6IFJlYnVpbGQuCi0KLVNhdCBGZWIgMTMgMTQ6MDY6MTkgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmM6IEFkZCBzcXJ0K2ZsYWdzIHBhdHRlcm5zLiAgQWRkIEVWNiBQQUxjb2RlIGluc25zLgotCShpbnNlcnRfamhpbnQpOiBGaXggaW5zZXJ0aW9uIG1hc2suCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IERpc2Fzc2VtYmxlIEVWNiBQQUxjb2RlIGluc25zLgotCi0xOTk5LTAyLTEwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTAyLTA5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGk5NjBjLWFzbS5jLGk5NjBjLWRpcy5jLGk5NjBjLW9wYy5jLGk5NjBjLW9wYy5oOiBEZWxldGUuCi0JKiBpOTYwLWRpcy5jIChwcmludF9pbnNuX2k5NjApOiBSZW5hbWUgZnJvbSBwcmludF9pbnNuX2k5NjBfb3JpZy4KLQkqIE1ha2VmaWxlLmFtOiBSZW1vdmUgcmVmZXJlbmNlcyB0byB0aGVtLgotCShIRklMRVMpOiBBZGQgZnIzMC1kZXNjLmgsbTMyci1kZXNjLmguCi0JKENGSUxFUyk6IEFkZCBmcjMwLWRlc2MuYyxmcjMwLWlibGQuYyxtMzJyLWRlc2MuYyxtMzJyLWlibGQuYywKLQltMzJyLW9waW5zdC5jLgotCShBTExfTUFDSElORVMpOiBVcGRhdGUuCi0JKiBjb25maWd1cmUuaW46IFJlZG8gaGFuZGxpbmcgb2YgY2dlbl9maWxlcy4KLQkoYmZkX2k5NjBfYXJjaCk6IERlbGV0ZSBpOTYwYy0qLmxvIGZpbGVzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogY2dlbi1hc20uYyAoKik6IENHRU5fT1BDT0RFX0RFU0MgcmVuYW1lZCB0byBDR0VOX0NQVV9ERVNDLgotCShoYXNoX2luc25fYXJyYXkpOiBSZXdyaXRlLgotCSogY2dlbi1kaXMuYyAoKik6IENHRU5fT1BDT0RFX0RFU0MgcmVuYW1lZCB0byBDR0VOX0NQVV9ERVNDLgotCShoYXNoX2luc25fYXJyYXkpOiBSZXdyaXRlLgotCSogY2dlbi1vcGMuYyAoKik6IENHRU5fT1BDT0RFX0RFU0MgcmVuYW1lZCB0byBDR0VOX0NQVV9ERVNDLgotCShjZ2VuX2xvb2t1cF9pbnNuLGNnZW5fZ2V0X2luc25fb3BlcmFuZHMpOiBEZWZpbmUgaGVyZS4KLQkoY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMpOiBEaXR0by4KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGUuCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oOiBSZWdlbmVyYXRlLgotCSogcG8vUE9URklMRVMuaW46IFJlYnVpbGQuCi0JKiBwby9vcGNvZGVzLnBvdDogUmVidWlsZC4KLQotRnJpIEZlYiAgNSAwMDowNDoyNCAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoSEZJTEVTKTogQWRkIGZyMzAtb3BjLmguCi0JKENGSUxFUyk6IEFkZCBmcjMwLWFzbS5jLCBmcjMwLWRpcy5jLCBmcjMwLW9wYy5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIEFDX1BSRVJFUSB0byAyLjEzLiAgUmVtb3ZlIEFNX0NZR1dJTjMyLgotCUNoYW5nZSBBTV9FWEVFWFQgdG8gQUNfRVhFRVhUIGFuZCBBTV9QUk9HX0lOU1RBTEwgdG8KLQlBQ19QUk9HX0lOU1RBTEwuCi0JKiBhY2NvbmZpZy5oOiBSZW1vdmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBjdXJyZW50IGF1dG9jb25mL2F1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTGlrZXdpc2UuCi0JKiBjb25maWcuaW46IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IExpa2V3aXNlLgotCi1UaHUgRmViICA0IDEzOjQ4OjUyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogQ29ycmVjdCBtb3ZlIChub3QgbW92ZXcpIHRvIHN0YXR1cyB3b3JkIG9uIDUyMDAuCi0KLU1vbiBGZWIgIDEgMjA6NTQ6MzYgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiAgSGFuZGxlIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXguCi0gICAgICAgICogaTM4Ni1kaXMuYyAoeF9tb2RlKTogIERlZmluZS4KLSAgICAgICAgKGRpczM4Nik6ICBSZW1vdmUuCi0gICAgICAgIChkaXMzODZfYXR0KTogIE5ldy4KLSAgICAgICAgKGRpczM4Nl9pbnRlbCk6ICBOZXcuCi0gICAgICAgIChkaXMzODZfdHdvYnl0ZSk6ICBSZW1vdmUuCi0gICAgICAgIChkaXMzODZfdHdvYnl0ZV9hdHQpOiAgTmV3LgotICAgICAgICAoZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiAgTmV3LgotICAgICAgICAocHJpbnRfaW5zbl94ODYpOiAgVXNlIG5ldyBhcnJheXMuCi0gICAgICAgIChmbG9hdF9tZW0pOiAgUmVtb3ZlLgotICAgICAgICAoZmxvYXRfbWVtX2ludGVsKTogIE5ldy4KLSAgICAgICAgKGZsb2F0X21lbV9hdHQpOiAgTmV3LgotICAgICAgICAoZG9mbG9hdCk6ICBVc2UgbmV3IGZsb2F0X21lbSBhcnJheXMuCi0gICAgICAgIChwcmludF9pbnNuX2kzODZfYXR0KTogIE5ldy4KLSAgICAgICAgKHByaW50X2luc25faTM4Nl9pbnRlbCk6ICBOZXcuCi0gICAgICAgIChwcmludF9pbnNuX2kzODYpOiAgSGFuZGxlIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXguCi0gICAgICAgIChwdXRvcCk6ICBIYW5kbGUgaW50ZWwgc3ludGF4LgotICAgICAgICAoT1BfaW5kaXJFKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCi0gICAgICAgIChPUF9FKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCi0gICAgICAgIChPUF9JKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCi0gICAgICAgIChPUF9zSSk6ICBIYW5kbGUgaW50ZWwgc3ludGF4LgotICAgICAgICAoT1BfT0ZGKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCi0KLQotCi0xOTk5LTAxLTI3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmgsZnIzMC1vcGMuYzogUmVidWlsZC4KLQkqIGk5NjBjLW9wYy5oLGk5NjBjLW9wYy5jOiBSZWJ1aWxkLgotCSogbTMyci1vcGMuYzogUmVidWlsZC4KLQotVHVlIEphbiAxOSAxODowMTo1NCAxOTk5ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCSogaHBwYS1kaXMuYzogcmV2ZXJ0IEhQIG1lcmdlIGNoYW5nZXMgdW50aWwgSFAgZ2l2ZXMgdXMKLQlhbiB1cGRhdGVkIGZpbGUuCi0JCi0xOTk5LTAxLTE5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogRGlzcGxheSBBUk0gc3ludGF4IGZvciBQQyByZWxhdGl2ZQotCW9mZnNldHMgYXMgd2VsbCBhcyBzeW1ibG9pYyBhZGRyZXNzLgotCi1UdWUgSmFuIDE5IDEwOjUxOjAxIDE5OTkgIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JKiBocHBhLWRpcy5jOiBmaXggY29tbWVudHMgYW5kIHNvbWUgaW5kZW50YXRpb24uCi0KLTE5OTktMDEtMTIgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYyxpOTYwYy1vcGMuYzogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMS0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTA2ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDEtMDUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmgsZnIzMC1vcGMuYzogUmVnZW5lcmF0ZS4KLQkqIGk5NjBjLWFzbS5jLGk5NjBjLWRpcy5jLGk5NjBjLW9wYy5oLGk5NjBjLW9wYy5jOiBSZWdlbmVyYXRlLgotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmgsbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMS0wNCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXV0b2NvbmYgMi4xMi4xIG9yIGhpZ2hlci4KLQotMTk5OC0xMi0zMCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMxNi1vcGMuYzogTWFyayBicmFuY2ggaW5zbnMgd2l0aCBNSVBTMTZfSU5TTl9CUkFOQ0guCi0KLVdlZCBEZWMgMTYgMTY6MTc6NDkgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQotMTk5OC0xMi0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHNldF9taXBzX2lzYV90eXBlKTogSGFuZGxlIGJmZF9tYWNoX21pcHM0MTExLgotCi0xOTk4LTEyLTE1ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLTE5OTgtMTItMTQgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IERlYyAxMCAxODozOTo0NiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBEZWMgMTAgMTI6NDk6MjQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotVHVlIERlYyAgOCAxMzo1NjoxOCAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCSogZGlzLWJ1Zi5jIChnZW5lcmljX3N0cmNhdF9hZGRyZXNzKTogcmVmb3JtYXQgdG8gR05VIGNvZGluZwotCWNvbnZlbnRpb25zLiAgY2hhbmdlIHNwcmludGYgY2FsbCB0byBhbiBzcHJpbnRmX3ZtYSBjYWxsLgotCi1UdWUgRGVjICA4IDEzOjEyOjQ0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBEZWMgIDggMTA6NTA6NDYgMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQlUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGJ5Ci0JRWxlbmEgWmFubm9uaSA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+LAotCURhdmlkIFRheWxvciA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+LCBhbmQKLQlFZGl0aCBFcHN0ZWluIDxlZXBzdGVpbkBzb3BoaWEuY3lnbnVzLmNvbT4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8KLQltZXJnZSBpbiBjaGFuZ2VzIGJ5IEhQOyBIUCBkaWQgbm90IGNyZWF0ZSBDaGFuZ2VMb2cgZW50cmllcy4KLQotCSogZGlzLWJ1Zi5jIChnZW5lcmljX3N0cmNhdF9hZGRyZXNzKTogbmV3IGZ1bmN0aW9uLgotCi0JKiBocHBhLWRpcy5jOiBDaGFuZ2VzIHRvIGltcHJvdmUgaHBwYSBkaXNhc3NlbWJseS4KLQkgIENoYW5nZWQgZm9ybWF0dGluZyBpbiA6IHJlZ19uYW1lcywgZnBfcmVnX25hbWVzLGNvbnRyb2xfcmVnLCAKLQkgIE5ldyB2YXJpYWJsZXMgOiBzaWduX2V4dGVuc2lvbl9uYW1lcywgZGVwb3NpdF9uYW1lcywgY29udmVyc2lvbl9uYW1lcwotCSAgICBmbG9hdF90ZXN0X25hbWVzLCBjb21wYXJlX2NvbmRfbmFtZXNfZG91YmxlLCBhZGRfY29uZF9uYW1lc19kb3VibGUsCi0JICAgIGxvZ2ljYWxfY29uZF9uYW1lc19kb3VibGUsIHVuaXRfY29uZF9uYW1lc19kb3VibGUsIAotCSAgICBicmFuY2hfcHVzaF9wb3BfbmFtZXMsIHNhdHVyYXRpb25fbmFtZXMsIHNoaWZ0X25hbWVzLCBtaXhfbmFtZXMsCi0JICBOZXcgTWFjcm9zIDogICBHRVRfQ09NUExfTywgR0VUX1BVU0hfUE9QLE1FUkdFRF9SRUcgCi0JICBNb3ZlIHNvbWUgZGVmaW5pdGlvbnMgdG8gbGliaHBwYS5oOiBHRVRfRklFTEQsIEdFVF9CSVQKLQkgIChmcHV0X2NvbnN0KTogcmVuYW1lZCBhcyBmcHV0X2hleF9jb25zdAotCSAgKHByaW50X2luc25faHBwYSk6Ci0JICAgLSB1c2UgdGhlIG1hY3JvcyBmcHV0c19maWx0ZXJlZCBhbmQKLQkgICAgIGZwdXRfZGVjaW1hbF9jb25zdCB3aGVuZXZlciBwb3NzaWJsZTsgY2FsbHMgdG8gc2lnbl9leHRlbmQgcmVxdWlyZQotCSAgICAgMiBwYXJhbXMgLS0gYWRkIGEgbWlzc2luZyBzZWNvbmQgcGFyYW0gb2YgMC4KLQkgICAtIFNvbWUgbmV3IGNvZGUgaWZkZWZlZCBmb3IgTE9DQUxfT05MWSwgYWxsIHJlbGF0ZWQgdG8gZmlndXJpbmcgb3V0Ci0JICAgICBhcmNoaXRlY3R1cmUgdmVyc2lvbiBudW1iZXIgb2YgY3VycmVudCBtYWNoaW5lLiBIUCBmb2xrcyBhcmUKLQkgICAgIHRyeWluZyB0byBoYW5kbGUgc2l0dWF0aW9uIHdoZXJlIHRoZSB0YXJnZXQgcHJvZ3JhbSB3YXMgY29tcGlsZWQKLQkgICAgIGZvciBQQSAxLnggKDMyLWJpdCksIGJ1dCBpcyBydW5uaW5nIG9uIGEgUEEgMi4wIG1hY2hpbmUgYW5kIAotCSAgICAgdmlzYSB2ZXJzYS4KLQkgICAtIGFkZGVkIG5ldyBjYXNlcyA6ICdnJywgJ0InLCAnbScKLQkgICAtIGFkZGVkIGNhc2VzIHNwZWNpZmljYWxseSBmb3IgUEEgMi4wCi0JICAgLSBjaGFuZ2VkIHRoZSBmb2xsb3dpbmcgY2FzZXMgOiAnIicsICduJywgJ04nLCAncCcsICdaJywgCi0JICAgLSBjYWxscyB0byBmcHV0X2NvbnN0IGJlY29tZSBjYWxscyB0byBmcHV0X2hleF9jb25zdAotCi0xOTk4LTEyLTA3ICBKYW1lcyBFIFdpbHNvbiAgPHdpbHNvbkB3aWxzb24tcGMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENGSUxFUyk6IEFkZCBpOTYwYy1hc20sIGk5NjBjLWRpcy5jLCBpOTYwYy1vcGMuYy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIGk5NjBjLWFzbS5sbywgaTk2MGMtZGlzLmxvLCBpOTYwLW9wYy5sby4KLQkoaTk2MC1hc20ubG8sIGk5NjBjLWRpcy5sbywgaTk2MGMtb3BjLmxvKTogTmV3IE1ha2VmaWxlIHJ1bGVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCi0JKiBjb25maWd1cmUuaW4gKGJmZF9pOTYwX2FyY2gpOiBBZGQgaTk2MGMtb3BjLmxvLCBpOTYwLWFzbS5vLAotCWk5NjAtZGlzLmMgdG8gdGEuCi0JKiBpOTYwLWRpcy5jIChwcmludF9pbnNuX2k5NjApOiBSZW5hbWUgdG8gcHJpbnRfaW5zbl9pOTYwX29yaWcuCi0JKiBpOTYwYy1hc20uYywgaTk2MGMtZGlzLmMsIGk5NjBjLW9wYy5jLCBpOTYwYy1vcGMuaDogTmV3IGZpbGVzLgotCQotTW9uIERlYyAgNyAxNDozMzo0NCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi1TdW4gRGVjICA2IDE0OjA2OjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAobWlwc19idWlsdGluX29wY29kZXMpOiBBZGQgZG1mYzIgYW5kIGRtdGMyLgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IEFkZCBQb3dlclBDNDAzIEdDW1hdIGluc3RydWN0aW9ucy4KLQlGcm9tIFNhaXRvaCBNYXNhbm9idSA8bXNhaXRvaEBzcGEuaXMudWVjLmFjLmpwPi4KLQotRnJpIERlYyAgNCAxNzo0NTo1MSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1GcmkgRGVjICA0IDE3OjA4OjA4IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBEZWMgIDMgMTQ6MjY6MjAgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotVGh1IERlYyAgMyAwMDowOToxNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlLgotCi0xOTk4LTExLTMwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tZGlzLmMgKGhhc2hfaW5zbl9hcnJheSk6IENHRU5fSU5TTl9WQUxVRSAtPgotCUNHRU5fSU5TTl9CQVNFX1ZBTFVFLgotCSogbTMyci1vcGMuYyxtMzJyLW9wYy5oLG0zMnItYXNtLmMsbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQkqIGZyMzAtb3BjLmMsZnIzMC1vcGMuaCxmcjMwLWFzbS5jLGZyMzAtZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLVRodSBOb3YgMjYgMTE6MjY6MzIgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBOb3YgMjQgMTE6MjA6NTQgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmM6IFJlZ2VuZXJhdGVkLgotCi1Nb24gTm92IDIzIDE4OjI4OjQ4IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLTE5OTgtMTEtMjAgIERvdWcgRXZhbnMgIDxkZXZhbnNAdG9ib3IudG8uY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0KLVRodSBOb3YgMTkgMTY6MDI6NDYgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1kaXMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLWFzbS5jOiBSZWdlbmVyYXRlZC4KLQotVGh1IE5vdiAxOSAwNzo1NDoxNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoc3luYy5wLHN5bmMubCk6IFN3YXAgaW5zbiB2YWx1ZXMuCi0KLTE5OTgtMTEtMTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAdG9ib3IudG8uY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZS4KLQotV2VkIE5vdiAxOCAyMTozNjozNyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLTE5OTgtMTEtMTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmM6IFJlYnVpbGQuCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYzogUmVidWlsZC4KLQotV2VkIE5vdiAxOCAxMTozMDowNCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCi1Nb24gTm92IDE2IDE5OjIxOjQ4IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQkKLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLWRpcy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtYXNtLmM6IFJlZ2VuZXJhdGVkLgotCi1UaHUgTm92IDEyIDE5OjI0OjE4IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vb3Bjb2Rlcy5wb3Q6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtZGlzLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1hc20uYzogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBOb3YgMTAgMTU6MjY6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogQWRkIHN1cHBvcnQgZm9yIEZSMzAgdGFyZ2V0LgotCQotVHVlIE5vdiAxMCAxMTowMDowNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLWRpcy5jLG0zMnItb3BjLmMsbTMyci1vcGMuaDogUmVidWlsZC4KLQkqIGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWJ1aWxkLgotCi1Nb24gTm92ICA5IDE4OjIyOjU1IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vb3Bjb2Rlcy5wb3Q6IFJlZ2VuZXJhdGUuCi0JKiBwby9QT1RGSUxFUy5pbjogUmVnZW5lcmF0ZS4KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGUuCi0JKiBmcjMwLW9wYy5oOiBSZWdlbmVyYXRlLgotCi1GcmkgTm92ICA2IDE3OjIxOjM4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmM6IFJlZ2VuZXJhdGUuCi0KLVdlZCBOb3YgIDQgMTg6NDY6NDcgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGNhc2UgZm9yIGJmZF9mcjMwX2FyY2guCi0JKiBNYWtlZmlsZS5hbSAoQ0ZJTEVTKTogQWRkZWQgZnIzMC1hc20uYywgZnIzMC1kaXMuYywgZnIzMC1vcGMuYy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkZWQgZnIzMC1hc20ubG8sIGZyMzAtZGlzLmxvLCBmcjMwLW9wYy5sby4KLQkoQ0xFQU5GSUxFUyk6IEFkZGVkIHN0YW1wLWZyMzAuCi0JKEZSMzBfREVQUyk6IEFkZGVkLgotCSogZnIzMC1hc20uYzogTmV3IGZpbGUuCi0JKiBmcjMwLWRpcy5jOiBOZXcgZmlsZS4KLQkqIGZyMzAtb3BjLmM6IE5ldyBmaWxlLgotCSogZnIzMC1vcGMuaDogTmV3IGZpbGUuCi0JKiBwby9QT1RGSUxFUy5pbjogUmVnZW5lcmF0ZWQKLQkqIHBvL29wY29kZXMucG90OiBSZWdlbmVyYXRlZAotCi1Nb24gTm92ICAyIDE1OjA1OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IGRldGVjdCBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqCi0gICAgICAgICogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVR1ZSBPY3QgMjcgMDg6NTg6MzcgMTk5OCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKElTX00pOiBBZGRlZC4KLQotTW9uIE9jdCAxOSAxMzowMzoxOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYyxtMzJyLW9wYy5oLG0zMnItYXNtLmMsbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotRnJpIE9jdCAgOSAxNDowMTo1NiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCxtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1TdW4gT2N0ICA0IDIxOjAxOjQ0IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoT1BfM0ROb3dTdWZmaXgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShPUFNVRik6IERlZmluZS4KLQkoR1JQMTQpOiBEZWZpbmUuCi0JKGRpczM4Nl90d29ieXRlKTogQWRkIEdSUDE0LCBmZW1tcywgYW5kIDNETm93IGVudHJpZXMuCi0JKHR3b2J5dGVfaGFzX21vZHJtKTogU2V0IGVudHJpZXMgY29ycmVzcG9uZGluZyB0byBHUlAxNCwgM0ROb3cuCi0JKGluc25fY29kZXApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcmludF9pbnNuX3g4Nik6IEluaXQgaW5zbl9jb2RlcCBhZnRlciBwcmVmaXhlcy4KLQkoZ3Jwcyk6IEFkZCBHUlAxNCBlbnRyaWVzIGZvciBwcmVmZXRjaCwgcHJlZmV0Y2h3LgotCShPUF9SRUcpOiBSZWZvcm1hdC4KLQotCUZyb20gSmVmZiBCIEVwbGVyIDxqZXBsZXJAdXNncy5nb3Y+Ci0JKiBpMzg2LWRpcy5jIChTdWZmaXgzRE5vdyk6IE5ldyB0YWJsZS4KLQotV2VkIFNlcCAzMCAxMDoxNzo1MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jOiBUcmVhdCBUUkFQIGFzIGlmIGl0IHdlcmUgYSBicmFuY2ggdHlwZSBpbnN0cnVjdGlvbi4KLQotTW9uIFNlcCAyOCAxNDozNTo0MyAxOTk4ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogZDEwdi1kaXMuYyAocHJpbnRfb3BlcmFuZCk6IElmIG51bSBpcyBub256ZXJvLCB0aGVuCi0JYWRkIE9QRVJBTkRfQUNDMSwgbm90IE9QRVJBTkRfQUNDMC4KLQotVGh1IFNlcCAyNCAwOToyMDowMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jOiBBZGQgRkxBR19KU1IgYXR0cmlidXRlIHRvIERCVCwgUkVJVCwgUlRELCBhbmQgVFJBUAotCWluc25zLiAKLQotVHVlIFNlcCAyMiAxNzo1NToxNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jOiBBZGQgdXNlIG9mIEVJVEhFUl9CVVRfUFJFRkVSX01VIGV4ZWN1dGlvbiB1bml0Ci0JY2xhc3MuIAotCi1UdWUgU2VwIDE1IDE1OjE0OjQ1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmgsbTMyci1vcGMuYzogQWRkIGJicGMsYmJwc3cgc3VwcG9ydC4KLQotMTk5OC0wOS0wOSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogQWRkIHN1cHBvcnQgZm9yIFBvd2VyUEMgNzUwIG1vdmUKLQl0by9mcm9tIFNQUnMuCi0KLUZyaSBTZXAgIDQgMTk6NDI6NTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2JpZ19hcm0pOiBEZXRlY3QgVGh1bWIgc3ltYm9scyBpbiBlbGYKLQlvYmplY3QgZmlsZXMuCi0JKHByaW50X2luc25fbGl0dGxlX2FybSk6IERldGVjdCBUaHVtYiBzeW1ib2xzIGluIGVsZiBvYmplY3QKLQlmaWxlcy4gCi0KLVNhdCBBdWcgMjkgMjI6MjQ6MDkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBVc2UgdGhlIG1hY2hpbmUgdHlwZSB0bwotCWRlY2lkZSB3aGljaCBQQUxjb2RlIHNldCB0byBpbmNsdWRlLgotCi1TdW4gQXVnIDIzIDAyOjE2OjE4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChGQlJYKTogRml4IHR5cG8gaW4gIixhLHBuICVmY2MzIiBjYXNlLgotCi1GcmkgQXVnIDIxIDE2OjA3OjUyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlKTogQWRkIEZMQUdfTVVMMzIgdG8gTUFDLCBNQUNTLAotCU1TVUIgYW5kIE1TVUJTIGluc3RydWN0aW9ucy4KLQotVGh1IEF1ZyAxMyAxNjoyMzowNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGVyYW5kcyk6IE9taXQgcGFyZW5zIGFyb3VuZCBhZGRpdGlvbnMgaW4KLQlvcGVyYW5kIG5hbWUgbWFjcm9zLgotCi1XZWQgQXVnIDEyIDE0OjAwOjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gUGV0ZXIgSmVyZW15IDxwZXRlci5qZXJlbXlAYXVzczIuYWxjYXRlbC5jb20uYXU+OgotCSogbTY4ay1vcGMuYzogQ29ycmVjdCBtdWxzbCBhbmQgbXVsdWwgdG8gdXNlIHEgcmF0aGVyIHRoYW4gRCwgYSwKLQkrLCAtLCBhbmQgZCBmb3IgQ29sZEZpcmUuCi0KLQlGcm9tIFBldGVyIFRoaWVtYW5uIDx0aGllbWFubkBpbmZvcm1hdGlrLnVuaS10dWViaW5nZW4uZGU+OgotCSogcHBjLW9wYy5jIChpbnNlcnRfbWJlKTogSGFuZGxlIHdyYXBwaW5nIGJpdG1hc2tzLgotCShleHRyYWN0X21iZSk6IExpa2V3aXNlLgotCi1XZWQgQXVnIDEyIDExOjExOjM0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbTEwMzAwLW9wYy5jOiBGaXggdHlwbyBpbiB1ZGYyMCAuLiB1ZGYyNSBpbnN0cnVjdGlvbiBvcGNvZGVzLgotCi0JKiBtMTAzMDAtb3BjLmM6IEZpcnN0IGN1dCBhdCBVREYgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gQXVnIDEwIDE0OjA4OjIyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUgKHJlbW92ZSBzZW1hbnRpYyBkZXNjcmlwdGlvbnMpLgotCi1Nb24gQXVnIDEwIDEyOjUxOjEyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLWRpcy5jIChwcmludF9pbnNuX2JpZ19hcm0pOiAgRml4IGluZGVudGF0aW9uLgotICAgICAgICAocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogTGlrZXdpc2UuCi0KLVN1biBBdWcgIDkgMjA6MTc6MjggMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSk6ICBDaGVjayBmb3IgdGh1bWIgc3ltYm9sCi0gICAgICAgIGF0dHJpYnV0ZXMuCi0gICAgICAgIChwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBMaWtld2lzZS4KLQotTW9uIEF1ZyAgMyAxMjo0MzoxNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCU1vdmUgYWxsIGdsb2JhbCBzdGF0ZSBkYXRhIGludG8gb3Bjb2RlIHRhYmxlIHN0cnVjdCwgYW5kIHRyZWF0Ci0Jb3Bjb2RlIHRhYmxlIGFzIHNvbWV0aGluZyB0aGF0IGlzICJvcGVuZWQvY2xvc2VkIi4KLQkqIGNnZW4tYXNtLmMgKGFsbCBmbnMpOiBOZXcgZmlyc3QgYXJnIG9mIG9wY29kZSB0YWJsZSBkZXNjcmlwdG9yLgotCShjZ2VuX2FzbV9pbml0KTogRGVsZXRlLgotCShjZ2VuX3NldF9wYXJzZV9vcGVyYW5kX2ZuKTogTmV3IGZ1bmN0aW9uLgotCSogY2dlbi1kaXMuYyAoYWxsIGZucyk6IE5ldyBmaXJzdCBhcmcgb2Ygb3Bjb2RlIHRhYmxlIGRlc2NyaXB0b3IuCi0JKGNnZW5fZGlzX2luaXQpOiBEZWxldGUuCi0JKiBjZ2VuLW9wYy5jIChhbGwgZm5zKTogTmV3IGZpcnN0IGFyZyBvZiBvcGNvZGUgdGFibGUgZGVzY3JpcHRvci4KLQkoY2dlbl9jdXJyZW50X3tvcGNvZGVfdGFibGVfbWFjaCxlbmRpYW59KTogRGVsZXRlLgotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmMsbTMyci1vcGMuaDogUmVnZW5lcmF0ZS4KLQotVGh1IEp1bCAzMCAyMTo0MToxMCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSk6IEFkZCBuZXcgIkxLUiIgZmxhZyB0byBzb21lCi0JaW5zdHJ1Y3Rpb25zLgotCi1UdWUgSnVsIDI4IDExOjAwOjA5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbTEwMzAwLW9wYy5jOiBBZGQgZW50cmllcyBmb3IgIm5vX21hdGNoX29wZXJhbmRzIiBmaWVsZCBpbgotCXRoZSBvcGNvZGUgdGFibGUuCi0KLUZyaSBKdWwgMjQgMTE6NDE6MzcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1hc20uYyxtMzJyLW9wYy5jOiBSZWdlbmVyYXRlICgtV2FsbCBjbGVhbnVwcykuCi0KLVR1ZSBKdWwgMjEgMTM6NDE6MDcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmgsbTMyci1vcGMuYyxtMzJyLWFzbS5jLG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLU1vbiBKdWwgMTMgMTQ6NTM6NTkgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChja3ByZWZpeCk6IEhhbmRsZSBmd2FpdCBzcGVjaWFsbHkgb25seSB3aGVuIGl0IGlzbid0Ci0JdGhlIGZpcnN0IHByZWZpeC4KLQkoZG9mbG9hdCk6IENvcnJlY3QgdGVzdCBmb3IgZm5zdHN3LiAgUHJpbnQgYGZuc3RzdyAlYXgnIHJhdGhlcgotCXRoYW4gYGZuc3RzdyAlZWF4Jy4KLQkoT1BfSik6IFJlbW92ZSB1bm5lY2Vzc2FyeSBzdWJ0cmFjdGlvbiB3aGVuIDE2LWJpdCBkaXNwbGFjZW1lbnQKLQl3aWxsIGJlIG1hc2tlZCBsYXRlci4KLQotVGh1IEp1bCAgMiAxNzoxMToyNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCAoQ0dFTl9NSU5fSU5TTl9TSVpFKTogTmV3ICNkZWZpbmUuCi0KLVdlZCBKdWwgIDEgMTY6MTE6MTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5jLG0zMnItb3BjLmg6IFJlZ2VuZXJhdGUuCi0KLUZyaSBKdW4gMjYgMTE6MDg6NTUgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtMTAzMDAtZGlzLmM6IE9ubHkgcmVjb2duaXplIGluc3RydWN0aW9ucyBmcm9tIHRoZSBjdXJyZW50bHkKLQlzZWxlY3RlZCBtYWNoaW5lLgotCSogbTEwMzAwLW9wYy5jOiBBZGQgZmllbGQgaW5kaWNhdGluZyB0aGUgcGFydGljdWxhciB2YXJpYW50IG9mCi0JdGhlIG1uMTAzMDAgZWFjaCBpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUgb24uCi0KLUZyaSBKdW4gMjYgMTI6MDQ6MjEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEZvciBiZmRfdmF4X2FyY2gsIGJ1aWxkIHZheC1kaXMubG8uCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShDRklMRVMpOiBBZGQgdmF4LWRpcy5jLgotCShBTExfTUFDSElORVMpOiBBZGQgdmF4LWRpcy5sby4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBjdXJyZW50IGxpYnRvb2wuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgSnVuIDI2IDEyOjAzOjIwIDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiB2YXgtZGlzLmM6IE5ldyBmaWxlLCBmcm9tIHdvcmsgYnkgUGF1bGluZSBNaWRkZWxpbmsKLQk8bWlkZGVsaW5AcG9seXdhcmUuaWFmLm5sPi4KLQkqIGRpc2Fzc2VtYmxlLmMgKEFSQ0hfdmF4KTogRGVmaW5lIGlmIEFSQ0hfYWxsLgotCShkaXNhc3NlbWJsZXIpOiBBZGQgY2FzZSBmb3IgQVJDSF92YXguCi0JKiBtYWtlZmlsZS52bXM6IFN1cHBvcnQgY29tcGlsYXRpb24gb24gdm1zL3ZheC4KLQotVHVlIEp1biAyMyAxOTo0MjoxOCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIG0xMDIwMC1kaXMuYyAocHJpbnRfaW5zbl9tbjEwMjAwKTogRml4IHZhcmlvdXMgbm9uLXBvcnRhYmlsaXRpZXMKLQlyZWxhdGVkIHRvIHNpZ24gZXh0ZW5zaW9uIGFuZCB0aGUgc2l6ZSBvZiBpbnRzLgotCi1UdWUgSnVuIDIzIDEwOjU5OjI2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbTEwMzAwLW9wYy5jOiBTdXBwb3J0IG9uZSBvcGVyYW5kICJhc3IiLCAibHNyIiBhbmQgImFzbCIKLQlpbnN0cnVjdGlvbnMuICBTdXBwb3J0IChzcCkgYWRkcmVzc2luZyBtb2RlIGJ5IGV4cGFuZGluZyBpdCBpbnRvCi0JKDAsc3ApLgotCi1TYXQgSnVuIDIwIDE0OjQ2OjIwIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBGaXggYXJndW1lbnQgaW50ZXJjaGFuZ2UgdHlwby4KLQotRnJpIEp1biAxOSAwOToxNjo0MiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIG0xMDIwMC1kaXMuYyAocHJpbnRfaW5zbl9tbjEwMjAwKTogUmVjb2duaXplICdicmVhaycgcHNldWRvLW9wLgotCi0xOTk4LTA2LTE4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYzogQWRkIHN1cHBvcnQgZm9yIGZ4c2F2ZSwgZnhyc3Rvciwgc3lzZW50ZXIgYW5kCi0Jc3lzZXhpdC4KLQotVGh1IEp1biAxOCAxMDoyMjoyNCAxOTk4ICBKb2huIE1ldHpsZXIgIDxqbWV0emxlckBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2xpdHRsZV9taXBzKTogUHJldmlvdXNseSwgaW5zdHJ1Y3Rpb24KLSAJcHJpbnRpbmcgcmVmZXJlbmNlcyB0aGUgc3ltYm9sIHRhYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQotIAlpbnN0cnVjdGlvbiByZXNpZGVzIGluIGEgYmxvY2sgcmVndWxhciBpbnN0cnVjdGlvbnMgb3IgbWlwczE2Ci0gCWluc3RydWN0aW9ucy4gSG93ZXZlciwgd2hlbiB0aGUgZGlzYXNzZW1ibGVyIGdldHMgdXNlZCBpbiBvdGhlcgotIAllbnZpcm9ubWVudHMgd2hlcmUgdGhlIHN5bWJvbCB0YWJsZSBpcyBub3QgcHJlc2VudCwgd2Ugbm8gbG9uZ2VyCi0gCXJlbHkgaW4gdGhlIHN5bWJvbCB0YWJsZSwgcmF0aGVyLCB1c2UgdGhlIGxvdyBiaXQgb2YgdGhlCi0gCWluc3RydWN0aW9ucyBhZGRyZXNzIHRvIGd1ZXNzLiBUaGVyZSBzaG91bGQgYmUgbm8gY2hhbmdlIGZvciB1c2FnZQotIAlvZiB0aGUgZGlzYXNzZW1ibGVyIGluIGhvc3QgYmFzZWQgcHJvZ3JhbXMsIGdkYiwgb2JqZHVtcC4KLQkocHJpbnRfaW5zbl9iaWdfbWlwcyk6IGRpdHRvLgotCShwcmludF9pbnNuX21pcHMpOiBkaXR0bwotCi1XZWQgSnVuIDE3IDIxOjE5OjAxIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogbTEwMjAwLWRpcy5jIChwcmludF9pbnNuX21uMTAyMDApOiBEb24ndCBib21iIG9uIHVua25vd24gb3Bjb2Rlcy4KLQotV2VkIEp1biAxNyAxNzo0OToyMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG0xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogQ2hhbmdlIG9wY29kZSBmb3IgInN5c2NhbGwiLgotCi1UdWUgSnVuIDE2IDEzOjEwOjUxIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoaW5kZXgxNik6IEFkZCAnJScgdG8gcmVnaXN0ZXIgbmFtZXMuICBVc2UgJywnCi0JaW5zdGVhZCBvZiAnKycuCi0KLVNhdCBKdW4gMTMgMTE6MzM6NTUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jOiBEb24ndCBwcmludCBvcGNvZGUgc3VmZml4IHdoZW4gd2UgY2FuIGZpZ3VyZSBvdXQgdGhlCi0Jc2l6ZSAoYW5kIGdhcyBjYW4hKSBieSByZWdpc3RlciBvcGVyYW5kcywgb3IgZnJvbSB0aGUgZGVmYXVsdAotCXNpemUuCi0JKHB1dG9wKTogSGFuZGxlICdBJywgJ0InLCAnTCcsICdQJywgJ1EnLCAnUicgbWFjcm9zLiAgUmVuYW1lICdDJwotCW1hY3JvIHRvICdFJy4KLQkoZGlzMzg2LCBkaXMzODZfdHdvYnl0ZSwgZ3Jwcyk6IFVzZSBuZXcgc3VmZml4IG1hY3Jvcy4KLQkoZGlzMzg2KTogQ29ycmVjdCBpbXVsIEliIHRvIGltdWwgc0liLiAgQ2hhbmdlIGpubCB0byBqZ2UgdG8gYmUKLQljb25zaXN0ZW50LiAgQWRkIHN1ZmZpeCBmb3IgY2FsbCwgam1wLCBsY2FsbCwgbGptcCwgaXJldC4gIFJldmVyc2UKLQlvcmRlciBvZiBjbXBzIG9wZXJhbmRzIHRvIGFncmVlIHdpdGggSW50ZWwgZG9jcy4gIENvcnJlY3Qgb3BlcmFuZAotCW9mIGFhZCBhbmQgYWFtIChJYiAtPiBzSWIpLiAgQ2hhbmdlIHVkMmIgZnJvbSAwZmI4IHRvIDBmYjkgdG8KLQlhZ3JlZSB3aXRoIEludGVsIGRvY3MuCi0JKHByaW50X2luc25feDg2KTogUHJpbnQgb3JwaGFuIGZ3YWl0IGJlZm9yZSBvdGhlciBwcmVmaXhlcy4KLQlSZXR1cm4gY29ycmVjdCBieXRlIGNvdW50IGZvciBvcnBoYW4gZndhaXQgd2l0aCBwcmVmaXhlcy4gIERvbid0Ci0JcHJpbnQgYGJvdW5kJyBvcGVyYW5kcyBpbiByZXZlcnNlIG9yZGVyLgotCShja3ByZWZpeCk6IFN0b3AgYWNjdW11bGF0aW5nIHByZWZpeGVzIGlmIHdlIGdldCBmd2FpdC4KLQkoT1BfRElSKTogUHJpbnQgYCQnIGJlZm9yZSBBcCBvcGVyYW5kcyBvZiBsam1wLCBsY2FsbC4KLQotRnJpIEp1biAxMiAxMzo0MDozOCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBJZiBtYWludGFpbmVyIG1vZGUsIGRlcGVuZCBvbiAucG90IGZpbGUuCi0JKCQoUEFDS0FHRSkucG90KTogVW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBQT1RGSUxFUy4KLQotRnJpIEp1biAxMiAxMTowNDowNiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCUZpeCBwcm9ibGVtcyB3aGVuIGJmZF92bWEgaXMgd2lkZXIgdGhhbiBsb25nLgotCSogaTM4Ni1kaXMuYzogTWFrZSBvcF9hZGRyZXNzIGFuZCBzdGFydF9wYyB1bnNpZ25lZC4KLQkoc2V0X29wKTogTWFrZSBwYXJhbWV0ZXIgdW5zaWduZWQuCi0JKHByaW50X2luc25feDg2KTogQ2FzdCB0byBiZmRfdm1hIHdoZW4gcGFzc2luZyBhIHZhbHVlIHRvCi0JcHJpbnRfYWRkcmVzc19mdW5jLgotCSogbnMzMmstZGlzLmMgKENPUkVfQUREUik6IERvbid0IGRlZmluZS4KLSAJKHByaW50X2luc25fbnMzMmspOiBDaGFuZ2UgdHlwZSBvZiBhZGRyIHRvIGJmZF92bWEuICBVc2UKLQliZmRfc2Nhbl92bWEgdG8gcmVhZCBiYWNrIGFkZHJlc3MuCi0JKHByaW50X2luc25fYXJnKTogQ2hhbmdlIHR5cGUgb2YgYWRkciB0byBiZmRfdm1hLiAgVXNlIHNwcmludGZfdm1hCi0JdG8gZm9ybWF0IGl0LgotCSogbTY4ay1kaXMuYyAoQ09FUkNFMzIpOiBDYXN0IHRvIGJmZF9zaWduZWRfdm1hIHRvIGF2b2lkIG92ZXJmbG93LgotCShORVhUVUxPTkcpOiBOZXcgZGVmaW5pdGlvbi4KLQkocHJpbnRfaW5zbl9tNjhrKTogQXZvaWQgb3ZlcmZsb3cgd2hlbiBjb21wdXRpbmcgdGhpcmQgYXJndW1lbnQgb2YKLQlwcmludF9pbnNuX2FyZy4KLQkocHJpbnRfaW5zbl9hcmcpOiBVc2UgTkVYVFVMT05HIHRvIGZldGNoIDMyIGJpdCBhZGRyZXNzIHZhbHVlcy4KLQlVc2UgZGlzcCBpbnN0ZWFkIG9mIHZhbCB0byBzdG9yZSBvZmZzZXQgdmFsdWVzLgotCShwcmludF9pbmRleGVkKTogVXNlIGJhc2VfZGlzcCBpbnN0ZWFkIG9mIHdvcmQgdG8gc3RvcmUgYmFzZQotCWRpc3BsYWNlbWVudCwgdG8gYXZvaWQgb3ZlcmZsb3cuCi0JKiBtMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogQ2FzdCB2YWx1ZSB0byBsb25nIHdoZW4gY29tcHV0aW5nCi0JcGMtcmVsYXRpdmUgYWRkcmVzcywgdG8gZ2V0IGNvcnJlY3Qgc2lnbiBleHRlbnNpb24uCi0KLVdlZCBKdW4gMTAgMTU6NTg6MzcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotVHVlIEp1biAgOSAxNDoyNzo1NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tb3BjLmggKHRodW1iX29wY29kZXMpOiBEaXNwbGF5ICdhZGQgcngsIHJZLCAjMCcgaW5zbnMgYXMKLQknbW92IHJYLCByWScuICBQYXRjaCBjb3VydGVzeSBvZiBUb255IFRob21wc29uIDxUb255LlRob21wc29uQGFybS5jb20+Ci0KLU1vbiBKdW4gIDggMTg6MTc6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYzogUmVtb3ZlIEZBTEdfTVVMMzIgYXR0cmlieXRlIGZyb20gTVVMWDJIIGluc24uCi0KLUZyaSBKdW4gIDUgMjM6NDc6NTUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jOiAgQ29tYmluZSBhZmxhZyBhbmQgZGZsYWcgaW50byBzaXplZmxhZy4gIENoYW5nZSBPUF8qCi0JZnVuY3Rpb25zIHRvIHZvaWQuCi0JKE9QX0RTcmVnKTogUmVuYW1lIGZyb20gT1BfRFNTSS4KLQkoT1BfRVNyZWcpOiBSZW5hbWUgZnJvbSBPUF9FU0RJLgotCShYYiwgWHYsIFliLCBZdik6IFVzZSBpbmRleCByZWcgY29kZSwgbm90IGJfbW9kZSBvciB2X21vZGUuCi0JKERTQlgpOiBEZWZpbmUuCi0JKGFwcGVuZF9zZWcpOiBSZW5hbWUgZnJvbSBhcHBlbmRfcHJlZml4LgotCShwdHJfcmVnKTogTmV3IGZ1bmN0aW9uLgotCShkaXMzODYpOiBBZGQgUyBzdWZmaXggdG8gcHVzaGYsIHBvcGYsIHJldCwgbHJldCwgZW50ZXIsIGxlYXZlLgotCUFkZCBEU0JYIGZvciB4bGF0LgotCShQUkVGSVhfQUREUik6IFJlbmFtZSBmcm9tIFBSRUZJWF9BRFIuCi0JKGZsb2F0X3JlZyk6IEFkZCBub24tYnJva2VuIG9wY29kZXMgZm9yIHBlb3BsZSB3aG8gZG9uJ3Qgd2FudAotCVVOSVhXQVJFX0NPTVBBVC4KLQotRnJpIEp1biAgNSAxOToxNTowNCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1vcGMuYyAodHN0YiwgdHN0dywgdHN0bCk6IERvbid0IGFsbG93IHBjcmVsIG9uCi0JNjgwMDAvNjgwMDgvNjgwMTAuCi0KLVdlZCBKdW4gIDMgMTg6NTY6MjIgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODYpOiBDaGFuZ2UgMHg2MCB0byAicHVzaGFTIiwgMHg2MSB0byAicG9wYVMiLgotCi1UdWUgSnVuICAyIDE1OjA2OjQ2IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19tYWNyb3MpOiBTdXBwb3J0IHNoaWZ0cyBhbmQgcm90YXRlcyBvZiBzaXplCi0JMDsgcHJvZHVjZSBlcnJvciBtZXNzYWdlIGZvciBzaGlmdHMgb2Ygc2l6ZSAzMiAob3IgNjQgZm9yIDY0LWJpdAotCXNoaWZ0cyksIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGRvZXNuJ3Qgc3VwcG9ydCB0aGVtLgotCi1XZWQgTWF5IDI3IDE1OjI5OjEzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmM6IEFkZCBuZXcgb3BlcmFuZDogUmEzLiAgQ2hhbmdlIFNIT1JUX0IzLCBTSE9SVF9CM2IsCi0JTE9OR18yLCBMT05HXzJiIGZvcm1hdHMgdG8gdXNlIHRoaXMgbmV3IG9wZXJhbmQuCi0KLVR1ZSBNYXkgMjYgMjA6NDc6NDggMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChjb21wdXRlX2FyY2hfbWFzayk6IEFkZGVkIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZS4KLQotVHVlIE1heSAyNiAyMDo0NTozMyAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogYmlnIGVuZGlhbiBpbnN0cnVjdGlvbiAvIGxpdHRsZQotCWVuZGlhbiBkYXRhIHN1cHBvcnQuCi0KLVR1ZSBNYXkgMjYgMTY6MTQ6MzkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9mb3JtYXRfdGFibGUpOiBDaGFuZ2UgZGVmaW5pdGlvbiBvZiBTSE9SVF9CMwotCWFuZCBTSE9SVF9CM2IgZm9ybWF0cyB0byB1c2UgUmIgaW5zdGVhZCBvZiBSYS4KLQotCUFkZCBGTEFHX01VTDE2IHRvIE1VTDJYSCBvcGNvZGUuCi0KLQlBZGQgRkxBR19BRERTVUJwcHAgdG8gU1JDIGFuZCBTQVRIcCBvcGNvZGVzIHRvIGltcGxlbWVudCBleHRlbnNpb24KLQl0byBleGlzdGluZyAxLjEuMSBwYXJhbGxlbGlzYXRpb24gcHJvaGliaXRpb24gcHJvY2VkdXJlLgotCi1GcmkgTWF5IDIyIDE2OjAwOjAwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotVHVlIE1heSAxOSAxNzozNjowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X21pcHMxNl9pbnNuX2FyZyk6IEhhbmRsZSB0eXBlICddJyBjb3JyZWN0bHkKLQl3aXRoIGEgc2hpZnQgY291bnQgb2YgMC4KLQotRnJpIE1heSAxNSAxNDo1ODozMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYyAoY2dlbl9od19sb29rdXBfYnlfbmFtZSk6IFJlbmFtZWQgZnJvbSBjZ2VuX2h3X2xvb2t1cC4KLQkoY2dlbl9od19sb29rdXBfYnlfbnVtKTogTmV3IGZ1bmN0aW9uLgotCi1XZWQgTWF5IDEzIDE3OjAzOjU5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmM6IFJlZ2VuZXJhdGUgKGhhbmRsZSB1cHBlcmNhc2UgSElHSC9TSElHSC9MT1cvU0RBKS4KLQotV2VkIE1heSAxMyAxNDozNDozMSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogQWx3YXlzIGZldGNoIGluc3RydWN0aW9ucwotCWFzIGJpZy1lbmRpYW4gb24gU1BBUkNsaXRlLgotCi1UdWUgTWF5IDEyIDExOjQ2OjMxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVyKTogUmVtb3ZlIGFsaWFzIGZvciByMC4KLQotU3VuIE1heSAxMCAyMjozNzoyMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHBvL01ha2UtaW4gKGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXQuCi0KLVRodSBNYXkgIDcgMTc6MTU6NTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKFdJTjMyTElCQUREKTogQWRkIC1saW50bCBvbiBjeWd3aW4zMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE1heSAgNyAxMjo0OTo0NiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jICh0ZXEsdGdlLHRnZXUsdGx0LHRsdHUsdG5lKTogQWRkZWQgdGhyZWUtb3BlcmFuZAotIAl2YXJpZXR5IG9mIElTQTIgaW5zdHJ1Y3Rpb25zIHRvIHNldCBib3R0b20gdGVuIGJpdHMgb2YgdHJhcCBjb2RlLgotCi1UaHUgTWF5ICA3IDExOjU0OjI1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNvbmZpZy5zdGF0dXMpOiBBZGQgZXhwbGljaXQgdGFyZ2V0IHNvIHRoYXQKLQljb25maWcuc3RhdHVzIGRlcGVuZHMgdXBvbiBiZmQvY29uZmlndXJlLmluLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBNYXkgIDcgMDk6MzM6MDIgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoYnJlYWssIHNkYmJwKTogQWRkZWQgdHdvLW9wZXJhbmQgdmFyaWV0eSBvZiBJU0ExCi0JaW5zdHJ1Y3Rpb25zIHRvIHNldCBib3R0b20gdGVuIGJpdHMgb2YgYnJlYWsgY29kZS4KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogSW1wbGVtZW50ICdxJyBvcGVyYW5kIGZvcm1hdCB1c2VkCi0JZm9yIGFib3ZlIG9wdGlvbmFsIGFyZ3VtZW50LgotCi1XZWQgTWF5ICA2IDE1OjMwOjA2IDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFJ1biBkZWMgYyB3aXRoIC9ub2RlYnVnLgotCi1Nb24gTWF5ICA0IDEwOjE5OjU3IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCi0JKiBNYWtlZmlsZS5hbTogUmVnZW5lcmF0ZWQgZGVwZW5kZW5jaWVzIHdpdGggbWtkZXAuCi0KLQkqIG9waW50bC5oIChfKTogRGVmaW5lIGFzIGRnZXR0ZXh0LgotCi1UdWUgQXByIDI4IDE0OjEyOjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTMyci1hc20uYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtMzJyLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG0zMnItb3BjLmM6IEludGVybmF0aW9uYWxpc2VkLgotCi0JKiBhY2xvY2FsLm00OiBSZWdlbmVyYXRlZC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBNYWtlZmlsZS5hbSAoUE9URklMRVMpOiBSZW1vdmUgaW5jbHVzaW9uIG9mIEJGRF9ILgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBwby9QT1RGSUxFUy5pbjogUmVidWlsdCB1c2luZyBydWxlIGluIE1ha2VmaWxlLmluLgotCSogcG8vb3Bjb2Rlcy5wb3Q6IFJlYnVpbHQgYWZ0ZXIgY2hhbmdpbmcgUE9URklMRVMuaW4uCi0KLVR1ZSBBcHIgMjggMTM6MTM6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfSVNDX1BPU0lYIG5lYXIgc3RhcnQuICBNb3ZlIENZX0dOVV9HRVRURVhUCi0JYWZ0ZXIgQUNfUFJPR19DQy4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGN1cnJlbnQgdG9vbHMuCi0KLU1vbiBBcHIgMjcgMTQ6MzE6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb3BpbnRsLmg6IE5ldyBmaWxlIC0gY29udGFpbnMgaW50ZXJuYXRpb25hbGlzYXRpb24gbWFjcm9zIHVzZWQKLQlieSBzb3VyY2UgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkuCi0JKiBwby86IE5ldyBzdWJkaXJlY3RvcnkgLSBjb250YWlucyBpbnRlcm5hdGlvbmFsaXNhdGlvbiBmaWxlcy4KLQkqIHBvL01ha2UtaW46IE5ldyBmaWxlIC0gTWFrZWZpbGUgY29uc3RydWN0b3IuCi0JKiBwby9QT1RGSUxFUy5pbjogTmV3IGZpbGUgLSBsaXN0IG9mIGZpbGVzIGluIG9wY29kZXMgZGlyZWN0b3J5Ci0JdGhhdCBzaG91bGQgYmUgc2NhbiBmb3IgaW50ZXJuYXRpb25hbGlzYXRpb24gbWFjcm9zLgotCSogcG8vb3Bjb2Rlcy5wb3Q6IE5ldyBmaWxlIC0gbGlzdCBvZiBpbnRlcm5hdGlvbmlzYXRpb24gc3RyaW5ncwotCWZvdW5kIGluIGZpbGVzIG1lbnRpb25lZCBpbiBwby9QT1RGSUxFUy5pbi4KLQkqIE1ha2VmaWxlLmFtOiBBZGQgcnVsZSB0byBidWlsZCBwby9QT1RGSUxFUy5pbi4gIEFkZCBTVUJESVJTCi0JZW50cnkuICBBZGQgaW50bCBkaXJlY3RvcnkgdG8gaW5jbHVkZSBwYXRocy4KLQkqIGFjY29uZmlnLmg6IEFkZCBFTkFCTEVfTkxTLCBIQVZFX0NBVEdFVFMsIEhBVkVfR0VURVhULAotCUhBVkVfU1RSQ1BZLCBIQVZFX0xDX01FU1NBR0VTCi0JKiBjb25maWd1cmUuaW46IEFkZCBydWxlIHRvIGJ1aWxkIE1ha2VmaWxlIGluIHBvIHN1YmRpcmVjdG9yeS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgotCSogYWNsb2NhbC5tNDogUmVidWlsdC4KLQkqIGNvbmZpZy5pbjogUmVidWlsdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQkqIGFscGhhLW9wYy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGFyYy1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBhcmMtb3BjLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogYXJtLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGNnZW4tYXNtLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogZDMwdi1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBkaXMtYnVmLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogaDgzMDAtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogaDg1MDAtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogaTM4Ni1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtMTAyMDAtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTEwMzAwLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG02OGstZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTg4ay1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtaXBzLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG5zMzJrLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG9waW50bC5oOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIHBwYy1vcGMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBzcGFyYy1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiB2ODUwLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIHY4NTAtb3BjLmM6IEludGVybmF0aW9uYWxpc2VkLgotCi1Nb24gQXByIDI3IDEwOjMzOjU2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jIChjZ2VuX2N1cnJlbnRfb3Bjb2RlX3RhYmxlKTogUmVuYW1lZCBmcm9tIC4uLl9kYXRhLgotCShhc21faGFzaF90YWJsZV9lbnRyaWVzKTogTmV3IHZhcmlhYmxlLgotCShjZ2VuX2FzbV9pbml0KTogRnJlZSBhc21faGFzaF90YWJsZV9lbnRyaWVzLgotCShoYXNoX2luc25fYXJyYXksaGFzaF9pbnNuX2xpc3QpOiBOZXcgZnVuY3Rpb25zLgotCShidWlsZF9hc21faGFzaF90YWJsZSk6IFVzZSB0aGVtLiAgSGFzaCBtYWNybyBpbnNucyBhcyB3ZWxsLgotCShjZ2VuX2FzbV9sb29rdXBfaW5zbik6IFVwZGF0ZS4KLQkqIGNnZW5fZGlzLmMgKGNnZW5fY3VycmVudF9vcGNvZGVfdGFibGUpOiBSZW5hbWVkIGZyb20gLi4uX2RhdGEuCi0JKGRpc19oYXNoX3RhYmxlX2VudHJpZXMpOiBOZXcgdmFyaWFibGUuCi0JKGNnZW5fZGlzX2luaXQpOiBGcmVlIGRpc19oYXNoX3RhYmxlX2VudHJpZXMuCi0JKGhhc2hfaW5zbl9hcnJheSxoYXNoX2luc25fbGlzdCk6IE5ldyBmdW5jdGlvbnMuCi0JKGJ1aWxkX2Rpc19oYXNoX3RhYmxlKTogVXNlIHRoZW0uICBIYXNoIG1hY3JvIGluc25zIGFzIHdlbGwuCi0JKGNnZW5fZGlzX2xvb2t1cF9pbnNuKTogVXBkYXRlLgotCSogY2dlbi1vcGMuYyAoY2dlbl9jdXJyZW50X29wY29kZV90YWJsZSk6IFJlbmFtZWQgZnJvbSAuLi5fZGF0YS4KLQkoY2dlbl9zZXRfY3B1LGNnZW5faHdfbG9va3VwLGNnZW5faW5zbl9jb3VudCk6IFVwZGF0ZS4KLQkoY2dlbl9tYWNyb19pbnNuX2NvdW50KTogTmV3IGZ1bmN0aW9uLgotCSogbTMyci1vcGMuaCxtMzJyLW9wYy5jLG0zMnItYXNtLmMsbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotRnJpIEFwciAyNCAxNjowNzo1NyAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKE9QX0RTU0kpOiBQcmludCBzZWdtZW50IG92ZXJyaWRlLgotCi1Nb24gQXByIDEzIDE2OjU5OjM5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBBZGQgIl9hbGwiIGV4dGVuc2lvbiB0byAnQycKLQlvcGVyYXRvci4KLQotTW9uIEFwciAxMyAxNjo1MDoyNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJvcGNvZGVzX2xhX0xJQkFERCk6IEFkZCBAV0lOMzJMSUJBRERALgotCShsaWJvcGNvZGVzX2xhX0xERkxBR1MpOiBBZGQgQFdJTjMyTERGTEFHU0AuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBhbmQgc3Vic3RpdHV0ZSBXSU4zMkxERkxBR1MgYW5kCi0JV0lOMzJMSUJBREQuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXByIDEwIDE4OjE0OjMxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLVN1biBBcHIgIDUgMTY6MDQ6MzkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAoc3RhbXAtbGliKTogQ2hlY2sgdGhhdCAubGlicy9saWJvcGNvZGVzLmEgZXhpc3RzCi0JYmVmb3JlIHRyeWluZyB0byBjb3B5IGl0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBBcHIgIDIgMTc6MjU6NDkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogVXNlIHNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIGZvciBDTVBVSSBpbnN0cnVjdGlvbi4KLQotV2VkIEFwciAgMSAxNjoyMDoyNyAxOTk4ICBJYW4gRGFsbCAgPElhbi5EYWxsQGRzdG8uZGVmZW5jZS5nb3YuYXU+Ci0KLSAgICAgICAgKiBuczMyay1kaXMuYyAoYml0X2V4dHJhY3Rfc2ltcGxlKTogTmV3IGZ1bmN0aW9uIHRvIGV4dHJhY3QgYml0cwotICAgICAgICBmcm9tIGFuIGFyYml0cmFyeSB2YWxpZCBidWZmZXIgaW5zdGVhZCBvZiBmZXRjaGluZyB0aGVtIG9uIGRlbWFuZAotICAgICAgICB1c2luZyBmZXRjaF9kYXRhKCkuCi0gICAgICAgIChpbnZhbGlkX2Zsb2F0KTogdXNlIGJpdF9leHRyYWN0X3NpbXBsZSgpIGluc3RlYWQgb2YgYml0X2V4dHJhY3QoKS4KLQotVHVlIE1hciAzMSAxMTowOTowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKLQkqIGkzODYtZGlzLmMgKGRpczM4Nik6IENoYW5nZSAweDhjIGFuZCAweDhlIHRvIG1vdlMsIGFuZCBjaGFuZ2UgRXcKLQl0byBFdiBmb3IgYm90aC4KLQotTW9uIE1hciAzMCAxNzozMjowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KLQotTW9uIE1hciAzMCAxNToxODowMCAxOTk4ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZDMwdi1kaXMuYyAocHJpbnRfaW5zbl9kMzB2KTogRG9uJ3QgdXNlIHVuaW5pdGlhbGl6ZWQgIm51bSIgd2hlbgotCWRpc2Fzc2VtYmxpbmcgbGFzdCA0IGJ5dGVzIG9mIGEgc2VjdGlvbi4KLQotRnJpIE1hciAyNyAxODowODoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBhcmMtZGlzLmMgKHByaW50X2luc24pOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX2tleXdvcmRfbG9va3VwX25hbWUpOiBMaWtld2lzZS4KLQkqIGQxMHYtZGlzLmMgKGRpc19sb25nLCBkaXNfMl9zaG9ydCk6IExpa2V3aXNlLgotCSogbTEwMjAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IExpa2V3aXNlLgotCSogbTEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IExpa2V3aXNlLgotCSogbnMzMmstZGlzLmMgKHByaW50X2luc25fbnMzMmspOiBMaWtld2lzZS4KLQkqIHBwYy1vcGMuYyAoaW5zZXJ0X3JhbCwgaW5zZXJ0X3JhbSk6IExpa2V3aXNlLgotCSogY2dlbi1kaXMuYyAoYnVpbGRfZGlzX2hhc2hfdGFibGUpOiBSZW1vdmUgdXNlZCBsb2NhbCB2YXJpYWJsZXMuCi0JKiBjZ2VuLW9wYy5jIChjZ2VuX2tleXdvcmRfc2VhcmNoX25leHQpOiBMaWtld2lzZS4KLQkqIGQxMHYtZGlzLmMgKGRpc19sb25nLCBkaXNfMl9zaG9ydCk6IExpa2V3aXNlLgotCSogZDMwdi1kaXMuYyAocHJpbnRfaW5zbl9kMzB2LCBsb29rdXBfb3Bjb2RlKTogTGlrZXdpc2UuCi0JKiBuczMyay1kaXMuYyAoYml0X2V4dHJhY3QsIHByaW50X2luc25fbnMzMmspOiBMaWtld2lzZS4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9vbmVfaW5zdHJ1Y3Rpb24pOiBMaWtld2lzZS4KLQkqIHc2NS1kaXMuYyAocHJpbnRfb3BlcmFuZCk6IExpa2V3aXNlLgotCSogejhrLWRpcy5jIChmZXRjaF9kYXRhKTogTGlrZXdpc2UuCi0JKiBhMjlrLWRpcy5jOiBBZGQgcmV0dXJuIHR5cGUgZm9yIGZpbmRfYnl0ZV9mdW5jX3R5cGUuCi0JKiBhcmMtb3BjLmM6IEluY2x1ZGUgPHN0ZGlvLmg+LiAgUmVtb3ZlIGRlY2xhcmF0aW9ucyBvZgotCWluc2VydF9tdWx0c2hpZnQgYW5kIGV4dHJhY3RfbXVsdHNoaWZ0LgotCSogZDMwdi1kaXMuYyAobG9va3VwX29wY29kZSk6IFBhcmVudGhlc2l6ZSBhc3NpZ25tZW50cyBpbgotCWNvbmRpdGlvbmFscy4KLQkoZXh0cmFjdF92YWx1ZSk6IEZ1bGx5IHBhcmVudGhlc2l6ZSBleHByZXNzaW9uLgotCSogaDg1MDAtZGlzLmMgKHByaW50X2luc25faDg1MDApOiBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcy4KLQkqIGg4NTAwLW9wYy5oIChoODUwMF90YWJsZSk6IEZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6ZXIuCi0JKiB3NjUtb3BjLmggKG9wdGFibGUpOiBMaWtld2lzZS4KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25feDg2KTogRGVjbGFyZSBhZmxhZyBhbmQgZmxhZyBwYXJhbWV0ZXJzLgotCSogaTM4Ni1kaXMuYyAoT1BfRSk6IEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzLgotCSogbTEwMjAwLWRpcy5jIChwcmludF9pbnNuX21uMTAyMDApOiBMaWtld2lzZS4KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fbWlwczE2KTogTGlrZXdpc2UuCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBMaWtld2lzZS4KLQkqIHY4NTAtZGlzLmMgKHByaW50X2luc25fdjg1MCk6IExpa2V3aXNlLgotCSogbnMzMmstZGlzLmMgKHByaW50X2luc25fYXJnKTogRGVjbGFyZS4KLQkoZ2V0X2Rpc3BsYWNlbWVudCwgaW52YWxpZF9mbG9hdCk6IERlY2xhcmUuCi0JKGxpc3Rfc2VhcmNoLCBzaWduX2V4dGVuZCwgZmxpcF9ieXRlcyk6IERlY2xhcmUgcmV0dXJuIHR5cGUuCi0JKGdldF9kaXNwbGFjZW1lbnQpOiBMaWtld2lzZS4KLQkocHJpbnRfaW5zbl9hcmcpOiBMaWtld2lzZS4gIE1ha2UgZCBpbnQuICBGaXggc3ByaW50ZiBmb3JtYXQKLQlzdHJpbmcuCi0JKHByaW50X2luc25fbnMzMmspOiBNYWtlIGkgdW5zaWduZWQuCi0JKGludmFsaWRfZmxvYXQpOiBNYWtlIHN0YXRpYy4gIERlY2xhcmUgdHlwZSBvZiB2YWwuCi0JKiB0aWMzMC1kaXMuYyAocHJpbnRfcGFyX2luc24pOiBNYWtlIGkgc2l6ZV90LiAgRG9uJ3QgY2hlY2sgc3RybGVuCi0Jb24gZWFjaCBmb3IgaXRlcmF0aW9uLgotCSogdGljMzAtZGlzLmMgKGdldF9pbmRpcmVjdF9vcGVyYW5kKTogTGlrZXdpc2UuCi0JKiB6OGstZGlzLmMgKHByaW50X2luc25fejgwMDEpOiBEZWNsYXJlIHJldHVybiB0eXBlLgotCShwcmludF9pbnNuX3o4MDAyKTogTGlrZXdpc2UuCi0JKHVucGFyc2VfaW5zdHIpOiBGaXggc3ByaW50ZiBmb3JtYXQgc3RyaW5ncy4KLQotRnJpIE1hciAyNyAwMDowNToyMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEFkZCAic3luYy5sIiBhbmQgInN5bmMucCIuCi0KLVdlZCBNYXIgMjUgMTQ6MzI6NDggMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fbTY4ayk6IFVzZSBpbmZvLT5tYWNoIHRvIHNlbGVjdCB0aGUKLQlkZWZhdWx0IG02OGsgdmFyaWFudCB0byByZWNvZ25pemUuCi0KLQkqIGk5NjAtZGlzLmMgKHBpbnNuKTogQ2hhbmdlIHR5cGUgb2YgZmlyc3QgYXJndW1lbnQgdG8gYmZkX3ZtYS4KLQkoY3RybCwgY29iciwgbWVtLCBlYSk6IExpa2V3aXNlLgotCShwcmludF9hZGRyKTogTGlrZXdpc2UuICBSZW1vdmUgY2FzdC4KLQkoZWEpOiBDYXN0IGFyZ3VtZW50IG9mIHByaW50X2FkZHIgdG8gYmZkX3ZtYS4KLQotCSogY2dlbi1hc20uYyAoY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlcik6IEZpeCB0eXBlIG9mIGxvY2FsCi0JdmFyaWFibGUgdmFsdWUuCi0JKGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlcik6IExpa2V3aXNlLgotCShjZ2VuX3BhcnNlX2FkZHJlc3MpOiBMaWtld2lzZS4KLQotV2VkIE1hciAyNSAxNDozMTozMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAtZGlzLmMgKGN0cmwpOiBBZGQgZnVsbCBicmFjZXMgdG8gc3RydWN0dXJlIGluaXRpYWxpemF0aW9uLgotCShjb2JyLCBtZW0sIHJlZyk6IExpa2V3aXNlLgotCShlYSk6IENvcnJlY3QgcGFyZW50aGVzaXphdGlvbiBpbiBleHByZXNzaW9uLgotCi0JKiBjZ2VuLWFzbS5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkoYnVpbGRfYXNtX2hhc2hfdGFibGUpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCi0JKGNnZW5fcGFyc2Vfa2V5d29yZCk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2JpZ19hcm0pOiBPbmx5IGNhbGwgY29mZnN5bWJvbCBmb3IgYSBDT0ZGCi0Jc3ltYm9sLiAgRml4IGluZGVudGF0aW9uLgotCShwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBMaWtld2lzZS4KLQotRnJpIE1hciAyMCAxODo1NToxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEFNX0RJU0FCTEVfU0hBUkVELgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCi0KLVRodSBNYXIgMTkgMTU6NDY6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVRoZXNlIHBhdGNoZXMgYXJlIGNvdXJ0ZXN5IG9mIEpvbmF0aGFuIFdhbHRvbiBhbmQgVG9ueSBUaG9tcHNvbgotCShhdGhvbXBzb0BjYW1icmlkZ2UuYXJtLmNvbSkuCi0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl90aHVtYik6IElnbm9yZSBib3R0b20gdHdvIGJpdHMgb2YgUEMKLQlyZWxhdGl2ZSBhZGRyZXNzZXMuCi0KLQkqIGFybS1vcGMuaCAodGh1bWJfb3Bjb2Rlcyk6IEFubm90YXRlIFBDIHJlbGF0aXZlIGFkZHJlc3NlcyB3aXRoCi0JYm90aCB0aGUgb2Zmc2V0IGFuZCB0aGUgbGFiZWwgY2xvc2VzdCB0byB0aGUgZGVzdGluYXRpb24uCi0KLVNhdCBNYXIgMTQgMjM6NDc6MTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmg6IFJlZ2VuZXJhdGUuCi0KLVdlZCBNYXIgIDQgMTI6MDg6MTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuaCxtMzJyLW9wYy5jLG0zMnItYXNtLmMsbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotU2F0IEZlYiAyOCAxNjowMjozNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSwgcHJpbnRfaW5zbl9saXR0bGVfYXJtKTogRG8gbm90Ci0JYXNzdW1lIHRoYXQgaW5mby0+c3ltYm9scyBpcyBub24tZW1wdHkuCi0KLVNhdCBGZWIgMjggMTI6MTk6MDUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmMgKGN2dHFzKSBUaGVyZSBpcyBubyBzdWNoIHRoaW5nLgotCShjdnR0cSk6IE1pc3NpbmcgbW9zdCBvZiB0aGUgLypkIHZhcmlhbnRzLgotCi1UaHUgRmViIDI2IDE1OjUzOjA5IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSk6IEluZGljYXRlIHdoaWNoIGluc3RydWN0aW9ucyBhcmUKLQlkZWxheWVkIGJyYW5jaGVzIG9yIGp1bXBzLgotCi1UdWUgRmViIDI0IDEwOjQ2OjQ0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl97YmlnLGxpdHRsZX1fYXJtKTogaW5mby0+c3ltYm9sIGNoYW5nZWQKLQl0byAqaW5mby0+c3ltYm9scy4KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fe2JpZyxsaXR0bGV9X21pcHMpOiBMaWtld2lzZS4KLQkqIHRpYzMwLWRpcy5jIChwcmludF9icmFuY2gpOiBMaWtld2lzZS4KLQotVHVlIEZlYiAyNCAxMTowNjoxOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSwgcHJpbnRfaW5zbl9saXR0bGVfYXJtKTogUmVtb3ZlCi0Jc2F2ZWRfc3ltYm9sIGNvZGUgYXMgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQotTW9uIEZlYiAyMyAxMzoxNjoxNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYzogSW5jbHVkZSBzeW1jYXQuaC4KLQkqIGNnZW4tZGlzLmMsY2dlbi1vcGMuYzogRGl0dG8uCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuaCxtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1Nb24gRmViIDIzIDEwOjM0OjU4IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBEbyBub3QgcHJlZml4ICdQJyBhcmd1bWVudHMgd2l0aCAnJCcuCi0KLVRodSBGZWIgMTkgMTY6NTE6MTMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuW2NoXTogUmVnZW5lcmF0ZS4KLQotVHVlIEZlYiAxNyAxNzoxNDo1MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYyAoY2dlbl9wYXJzZV97c2lnbmVkLHVuc2lnbmVkfV9pbnRlZ2VyKTogRGVsZXRlIG1pbixtYXgKLQlhcmd1bWVudHMuICBEb24ndCBwZXJmb3JtIHZhbGlkYXRpb24gaGVyZS4KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1GcmkgRmViIDEzIDE0OjI2OjA2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLUZyaSBGZWIgMTMgMTQ6NTM6MDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBhdXRvbWFrZSAxLjJlLgotCi1GcmkgRmViIDEzIDEwOjIxOjA5IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogbTEwMzAwLWRpcy5jIChwcmludF9pbnNuX21uMTAzMDApOiBSZWNvZ25pemUgYnJlYWsgaW5zdHJ1Y3Rpb24uCi0KLUZyaSBGZWIgMTMgMTM6MTI6MTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEdldCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbSBCRkQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQlGcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKLQkqIE1ha2VmaWxlLmFtIChsaWJvcGNvZGVzX2xhX0xERkxBR1MpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEZlYiAxMyAwOTo1MDozMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCSogbTMyci1vcGMuaDogUmVnZW5lcmF0ZS4KLQotVGh1IEZlYiAxMiAxMTowMTo0MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1UaHUgRmViIDEyIDAzOjQxOjAwIDE5OTggIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQlGaXggcmFjIHRvIGFjY2VwdCBvbmx5IGEwOgotCSogZDEwdi1vcGMuYyAoZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycywgZDEwdl9vcGVyYW5kcywgZDEwdl9vcGNvZGVzKToKLQlTcGxpdCBPUEVSQU5EX0FDQyBpbnRvIE9QRVJBTkRfQUNDMCBhbmQgT1BFUkFORF9BQ0MxLgotCUludHJvZHVjZSBPUEVSQU5EX0dQUi4KLQkqIGQxMHYtZGlzLmMgKHByaW50X29wZXJhbmQpOiBMaWtld2lzZS4KLQotV2VkIEZlYiAxMSAxODo1ODozNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYyAoY2dlbl9zZXRfY3B1KTogRGVsZXRlIGluaXQgb2YgaHcgbGlzdCBgbmV4dCcgY2hhaW4uCi0JKGNnZW5faHdfbG9va3VwKTogTWFrZSByZXN1bHQgY29uc3QuCi0JKiBtMzJyLW9wYy5oLCBtMzJyLW9wYy5jLCBtMzJyLWFzbS5jLCBtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1TYXQgRmViICA3IDE1OjMwOjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVRodSBGZWIgIDUgMTc6NTY6MTAgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKHJlcGVhdHssaX0gaW5zdHJ1Y3Rpb25zKTogUmVwZWF0L3JlcGVhdGkKLQlpbnN0cnVjdGlvbnMgdXNlIGEgUEMgcmVsYXRpdmUgYnJhbmNoLCBub3QgYWJzb2x1dGUuCi0KLVdlZCBGZWIgIDQgMTk6MTc6MzcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBsaWJ0b29sX2VuYWJsZV9zaGFyZWQgcmF0aGVyIHRoYW4KLQlsaWJ0b29sX3NoYXJlZC4gIFJlbW92ZSBkaXZlcnNpb24gaGFjay4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotVHVlIEZlYiAgMyAxNzoxOTo0MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYyAoY2dlbl9zZXRfY3B1KTogSW5pdGlhbGl6ZSBoYXJkd2FyZSB0YWJsZS4KLQkqIG0zMnItb3BjLmgsIG0zMnItb3BjLmMsIG0zMnItYXNtLmMsIG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLU1vbiBGZWIgIDIgMTk6MjI6MTUgMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCSogdGljMzAtZGlzLmM6IE5ldyBmaWxlLgotCSogZGlzYXNzZW1ibGUuYwkoZGlzYXNzZW1ibGVyKTogQWRkIGJmZF9hcmNoX3RpYzMwIGNhc2UuCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBiZmRfdGljMzBfYXJjaC4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIHRpYzMwLWRpcy5jCi0JKEFMTF9NQUNISU5FUyk6IEFkZCB0aWMzMC1kaXMubG8uCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgSmFuIDI5IDEzOjAyOjU2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmggKEhBVkVfQ1BVX00zMlIpOiBEZWZpbmUuCi0KLVdlZCBKYW4gMjggMDk6NTU6MDMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0aW9uIHJvdXRpbmVzKTogSWYgYm90aCBhbGlnbm1lbnQgYW5kIHNpemUgaXMKLQl3cm9uZyB0aGVuIHJlcG9ydCB0aGlzLgotCi1UdWUgSmFuIDI3IDIxOjUyOjU5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IFNldCB0YXJnZXRfcHJvY2Vzc29yIGFzIGFwcHJvcHJpYXRlLgotCU9ubHkgcmVjb2duaXplIGluc3RydWN0aW9ucyBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0X3Byb2Nlc3Nvci4KLQotVGh1IEphbiAyMiAxNjoyMDoxNyAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZDEwdi1kaXMuYyAoUENfTUFTSyk6IENvcnJlY3QgdmFsdWUuCi0JKHByaW50X29wZXJhbmQpOiBJZiB0aGVyZSdzIGEgcmVsb2MsIGRvbid0IGNhbGN1bGF0ZSB0aGUKLSAJYWRkcmVzcyBiZWNhdXNlIHRoZXkgY291bGQgYmUgaW4gZGlmZmVyZW50IHNlY3Rpb25zLgotCi1GcmkgSmFuIDE2IDE1OjI5OjExIDE5OTggIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAobWlwc19idWlsdGluX29wY29kZXMpOiBNb3ZlIDQwMTAncyAiYWRkY2l1IgotIAlpbnN0cnVjdGlvbiBhZnRlciB0aGUgNDY1MCdzICJtdWwiIGluc3RydWN0aW9uOyBub2JvZHkncyB1c2luZyB0aGUKLSAJNDAxMCB0aGVzZSBkYXlzLiAgSWYgb2JqZWN0IGZpbGVzIHNvbWVkYXkgaW5kaWNhdGUgd2hpY2ggcHJvY2Vzc29yCi0JdmFyaWFudCB0aGV5J3JlIGludGVuZGVkIGZvciwgd2UgY2FuIGRvIGEgYmV0dGVyIGpvYiBhdCB0aGlzLgotCi1Nb24gSmFuIDEyIDE0OjQzOjU0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jIChidWlsZF9hc21faGFzaF90YWJsZSk6IFRyYXZlcnNlIGNvbXBpbGVkIGluIHRhYmxlIHVzaW5nCi0JdGFibGUgcHJvdmlkZWQgZW50cnkgc2l6ZS4gIFVzZSBDR0VOX0lOU05fTU5FTU9OSUMuCi0JKGNnZW5fcGFyc2Vfa2V5d29yZCk6IFJld3JpdGUuCi0JKiBjZ2VuLWRpcy5jIChidWlsZF9kaXNfaGFzaF90YWJsZSk6IFRyYXZlcnNlIGNvbXBpbGVkIGluIHRhYmxlIHVzaW5nCi0JdGFibGUgcHJvdmlkZWQgZW50cnkgc2l6ZS4gIFVzZSBDR0VOX0lOU05fTUFTS19CSVRTSVpFLgotCSogY2dlbi1vcGMuYzogQ2xlYW4gdXAgcGFzcyBvdmVyIGBzdHJ1Y3QgZm9vJyB1c2FnZS4KLQkoY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZSk6IEhhbmRsZSAiIiBlbnRyeS4KLQkoY2dlbl9rZXl3b3JkX2FkZCk6IExpa2V3aXNlLgotCi1Nb24gRGVjIDIyIDEyOjM3OjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIEZQX0QgdG8gcy5kIGluc3RydWN0aW9uIGZsYWdzLgotCi1XZWQgRGVjIDE3IDExOjM4OjI5IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLW9wYy5jIChoYWx0LCBwdWxzZSk6IEVuYWJsZSB0aGVtIG9uIHRoZSA2ODA2MC4KLQotVHVlIERlYyAxNiAxNToyMjo1MyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX29wY29kZXMpOiBSZXZlcnQgY2hhbmdlIHRoYXQgcHV0IHRoZSAzMiBiaXQKLQlQQyByZWxhdGl2ZSBvZmZzZXQgZm9ybXMgYmVmb3JlIHRoZSAxNSBiaXQgZm9ybXMuICBBbiBhc3NlbWJsZXIgY29tbWFuZAotCWxpbmUgb3B0aW9uIG5vdyBjaG9vc2VzIHRoZSBkZWZhdWx0LgotCi1UdWUgRGVjIDE2IDE1OjIyOjUxIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSk6IFNldCBuZXcgZmxhZ3MgYml0cwotCUZMQUdfezJXT1JELE1VTHsxNiwzMn0sQUREU1VCcHBwfSwgaW4gYXBwcm9wcmlhdGUgaW5zdHJ1Y3Rpb25zLgotCi0xOTk3LTEyLTE1ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogT25seSBidWlsZCBsaWJvcGNvZGVzIHNoYXJlZCBpZiAtLWVuYWJsZS1zaGFyZWQncyB2YWx1ZQotCXdhcyBgeWVzJywgb3Igd2FzIHNldCB0byBgKm9wY29kZXMqJy4KLQkqIGFjbG9jYWwubTQ6IExpa2V3aXNlLgotCSogTk9URTogdGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgZml4ZWQgaW4gbGlidG9vbC9saWJ0b29sLm00LCB0aGUKLQlvcmlnaW5hbCBzb3VyY2Ugb2YgdGhpcyBiaXQgb2YgY29kZS4gIEl0J3Mgbm90IGNsZWFyIHdoYXQgdGhlIGJlc3QgZml4Ci0Jd291bGQgYmUsIHRob3VnaC4KLQotRnJpIERlYyAxMiAxMTo1NzowNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKE9GRl9TTF9QQywgT0ZGX1NMX0JSKTogTWlub3IgZm9ybWF0dGluZyBjaGFuZ2UuCi0JKHRpYzgwX29wY29kZXMpOiBSZW9yZGVyIHRhYmxlIGVudHJpZXMgdG8gcHV0IHRoZSAzMiBiaXQgUEMgcmVsYXRpdmUKLSAJb2Zmc2V0IGZvcm1zIGJlZm9yZSB0aGUgMTUgYml0IGZvcm1zLCB0byBkZWZhdWx0IHRvIHRoZSBsb25nIGZvcm1zLgotCi1GcmkgRGVjIDEyIDAxOjMyOjMwIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLW9wYy5jIChjdnR0cS8qdSopOiBSZW1vdmUsIGFzIHRoYXQgc3VmZml4IGlzIGludmFsaWQuCi0KLVdlZCBEZWMgMTAgMTc6NDI6MzUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBQcmV2ZW50IGV4YW1pbmF0aW9uIG9mIHN0b3JlZAotCXN5bWJvbCBpZiBub25lIGlzIHByZXNlbnQuCi0JKHByaW50X2luc25fYmlnX2FybSk6ICBQcmV2ZW50IGV4YW1pbmF0aW9uIG9mIHN0b3JlZCBzeW1ib2wgaWYKLQlub25lIGlzIHByZXNlbnQuCi0KLVRodSBPY3QgMjMgMjE6MTM6MzcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3Bjb2Rlcyk6IENvcnJlY3QgZW50cnkgZm9yIFJURS4KLQotTW9uIERlYyAgOCAxMToyMTowNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXNhc3NlbWJsZS5jOiBSZW1vdmUgZGlzYXNtX3N5bWFkZHIoKSBmdW5jdGlvbi4KLQotCSogYXJtLWRpcy5jOiBVc2UgaW5mby0+c3ltYm9sIGluc3RlYWQgb2YgaW5mby0+ZmxhZ3MgdG8gZGV0ZXJtaW5lCi0JaWYgZGlzYXNzbWJseSBzaG91bGQgYmUgaW4gVGh1bWIgb3IgQXJtIG1vZGUuCi0KLVR1ZSBEZWMgIDIgMDk6NTQ6MjcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jOiBBZGQgc3VwcG9ydCBmb3IgZGlzYXNzZW1ibGluZyBUaHVtYiBvcGNvZGVzLgotCShwcmludF9pbnNuX3RodW1iKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc21fc3ltYWRkcik6IE5ldyBmdW5jdGlvbi4KLQotCSogYXJtLW9wYy5oOiBEaXNwbGF5IG5vcCBwc2V1ZG8gb3BzIGFsb25nc2lkZSBlcXVpdmFsZW50IGRpc2Fzc2VtYmx5LgotCSh0aHVtYl9vcGNvZGVzKTogVGFibGUgb2YgVGh1bWIgb3Bjb2Rlcy4KLQotTW9uIERlYyAgMSAxMjoyNTo1NyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1vcGMuYyAoYnRzdCk6IENoYW5nZSBEZEBzIHRvIERkO2IuCi0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogUmVjb2duaXplICdtJywgJ24nLCAnbycsICdwJywgJ3EnLAotCWFuZCAndicgYXMgb3BlcmFuZCB0eXBlcy4KLQotTW9uIERlYyAgMSAxMTo1Njo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IEFkZCBhcmd1bWVudCBmb3IgbHBzdG9wLiAgRnJvbSBPbGl2aWVyIENhcm1vbmEKLQk8b2xpdmllci5jYXJtb25hQGRpLmVwZmwuY2g+LgotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9tNjhrKTogSGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBscHN0b3AsCi0Jd2hpY2ggaGFzIGEgdHdvIHdvcmQgb3Bjb2RlIHdpdGggYSBvbmUgd29yZCBhcmd1bWVudC4KLQotU3VuIE5vdiAyMyAyMjoyNToyMSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9vcGNvZGVfdGFibGUsIGNhc2UgY21wdSk6IEltbWVkaWF0ZSBmaWVsZCBpcwotCXVuc2lnbmVkLCBub3Qgc2lnbmVkLgotCShkMzB2X2Zvcm1hdF90YWJsZSk6IEFkZCBTSE9SVF9DTVBVIGNhc2VzIGZvciBjbXB1LgotCi1UdWUgTm92IDE4IDIzOjEwOjAzIDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGQxMHYtZGlzLmMgKHByaW50X29wZXJhbmQpOgotCVNwbGl0IE9QRVJBTkRfRkxBRyBpbnRvIE9QRVJBTkRfRkZMQUcgYW5kIE9QRVJBTkRfQ0ZMQUcuCi0KLVR1ZSBOb3YgMTggMTg6NDU6MTQgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogZDEwdi1vcGMuYyAoT1BFUkFORF9GTEFHKTogU3BsaXQgaW50bzoKLQkoT1BFUkFORF9GRkxBRywgT1BFUkFORF9DRkxBRykgLgotCShGU1JDKTogU3BsaXQgaW50bzoKLQkoRkZTUkMsIENGU1JDKS4KLQotVGh1IE5vdiAxMyAxMTowNTozMyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogTW92ZSB0aGUgSU5TTl9NQUNSTyBJU0EgdmFsdWUgdG8gdGhlIG1lbWJlcnNoaXAKLQlmaWVsZCBmb3IgYWxsIElOU05fTUFDUk8ncy4KLQkqIG1pcHMxNi1vcGMuYzogc2FtZQotCi1XZWQgTm92IDEyIDEwOjE2OjU3IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChzeW5jLGNhY2hlKTogVGhlc2UgYXJlIDM5MDAgaW5zbnMuCi0KLVR1ZSBOb3YgMTEgMjM6NTM6NDEgMTk5NyAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0Jc2gtb3BjLmggKHNoX3RhYmxlKTogUmVtb3ZlIGZ0c3QvbmFuLgotCi1UdWUgT2N0IDI4IDE3OjU5OjMyIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChmZmMsIGZmcyk6IEZpeCBtYXNrLgotCi1UdWUgT2N0IDI4IDE2OjM0OjU0IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBBZGQgZWl0X3ZiLCBpbnRfcywgYW5kIGludF9tCi0JY29udHJvbCByZWdpc3RlcnMuCi0KLU1vbiBPY3QgMjcgMjI6MzQ6MDMgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEZpeCBidWcgaW4gbWFzayBmb3IgIm5vdCIgcHNldWRvLWluc3RydWN0aW9uLgotCShXUl9ISUxPLCBSRF9ISUxPLCBNT0RfSElMTyk6IE5ldyBtYWNyb3MuCi0KLU1vbiBPY3QgMjcgMjI6MzQ6MDMgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEZpeCBidWcgaW4gbWFzayBmb3IgIm5vdCIgcHNldWRvLWluc3RydWN0aW9uLgotCShXUl9ISUxPLCBSRF9ISUxPLCBNT0RfSElMTyk6IE5ldyBtYWNyb3MuCi0KLVRodSBPY3QgMjMgMTQ6NTc6NTggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBSZXBsYWNlIC8vIHdpdGggLyogLi4uICovCi0KLVdlZCBPY3QgMjIgMTc6MzM6MjEgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmM6IEFkZCB3ciAmIHJkIGZvciB2OWEgYXNyJ3MuCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IFJlY29nbml6ZSAnXycgYW5kICcvJyBmb3IgdjlhIGFzcidzLgotCSh2OWFfYXNyX3JlZ19uYW1lcyk6IE5ldyB2YXJpYWJsZS4KLQlQYXRjaCBmcm9tIERhdmlkIE1pbGxlciA8ZGF2ZW1Admdlci5ydXRnZXJzLmVkdT4uCi0KLVdlZCBPY3QgMjIgMTc6MTg6MDIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHY5bm90djlhKTogTmV3IGluc24gdHlwZS4KLQkoSU1QREVQKTogTW92ZSB0byB0aGUgZW5kIHRvIG5vdCBjb25mbGljdCB3aXRoIGVkZ2U4IGV0IGFsLgotCVBhdGNoIGZyb20gRGF2aWQgTWlsbGVyIDxkYXZlbUB2Z2VyLnJ1dGdlcnMuZWR1Pi4KLQotRnJpIE9jdCAxNyAxMzoxODo1MyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoYm5lemwsYmVxemwpOiBNYXJrIHRoZXNlIGFzIGFsc28gdHgzOS4KLQotVGh1IE9jdCAxNiAxMTo1NToyMCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogTm90ZSB0aGF0ICdqYWx4JyBpcyAocHJvYmFibHkgaW5jb3JyZWN0bHkpIG1hcmtlZCBJMS4KLQotVHVlIE9jdCAxNCAxNjoxMDozMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFVzZSBuZXcgc3ltYm9sX2F0X2FkZHJlc3NfZnVuYygpIGZpZWxkCi0Jb2YgZGlzYXNzZW1ibGVfaW5mbyBzdHJ1Y3R1cmUgdG8gZGV0ZXJtaW5lIGlmIGFuIG92ZXJsYXkgYWRkcmVzcwotCWhhcyBhIG1hdGNoaW5nIHN5bWJvbCBpbiBsb3cgbWVtb3J5LgotCi0JKiBkaXMtYnVmLmMgKGdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MpOiBOZXcgKGR1bW15KSBmdW5jdGlvbiBmb3IKLQluZXcgc3ltYm9sX2F0X2FkZHJlc3NfZnVuYyBmaWVsZCBpbiBkaXNhc3NlbWJsZV9pbmZvIHN0cnVjdHVyZS4KLQotRnJpIE9jdCAxMCAxNjo0NDo1MiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jIChleHRyYWN0X2QyMik6IFVzZSBzaWduZWQgYXJpdGhtYXRpYy4KLQotVHVlIE9jdCAgNyAyMzo0MDo0MyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogVGhyZWUgb3AgbXVsdCBpcyBub3QgYW4gSVNBIGluc24uCi0KLVR1ZSBPY3QgIDcgMjM6Mzc6MjEgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEZpeCBmb3JtYXR0aW5nLgotCi1GcmkgT2N0ICAzIDE3OjI2OjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAoT1BfRSk6IEV4cGxpY2l0bHkgc2lnbiBleHRlbmQgOCBiaXQgdmFsdWVzLCByYXRoZXIKLSAJdGhhbiBhc3N1bWluZyB0aGF0IGNoYXIgaXMgc2lnbmVkLiAgRXhwbGljaXRseSBzaWduIGV4dGVuZCAxNiBiaXQKLQl2YWx1ZXMsIHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoYXQgc2hvcnQgaXMgMTYgYml0cy4KLQkoT1Bfc0ksIE9QX0osIE9QX0RJUik6IExpa2V3aXNlLgotCi1UaHUgT2N0ICAyIDEzOjM2OjQ1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKHY4NTBfc3JlZ19uYW1lcyk6IFVzZSBzeW1ib2xpYyBuYW1lcyBmb3IgaGlnaGVyCi0Jc3lzdGVtIHJlZ2lzdGVycy4KLQotV2VkIE9jdCAgMSAxNjo1ODo1NCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jOiBGaXggdHlwbyBpbiBjb21tZW50LgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEFkZCB0ZXN0IG9mIHByb2Nlc3NvciB0eXBlIHdoZW4KLQlkZXRlcm1pbmluZyBvcGNvZGVzLgotCi1XZWQgT2N0ICAxIDE0OjEwOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgYSBkaXZlcnNpb24gdG8gc2V0IGVuYWJsZV9zaGFyZWQgYmVmb3JlIHRoZQotCWFyZ3VtZW50cyBhcmUgcGFyc2VkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgU2VwIDI1IDEzOjA0OjU5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAoVEJMMSk6IFVzZSAhIHJhdGhlciB0aGFuIGAuCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFJlbW92ZSBgIG9wZXJhbmQgc3BlY2lmaWVyLgotCi1XZWQgU2VwIDI0IDExOjI5OjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogQ29ycmVjdCBiY2hnLCBiY2xyLCBic2V0LCBhbmQgYnRzdCBvbiBDb2xkRmlyZS4KLQotCSogbTY4ay1vcGMuYzogQWNjZXB0IHRzdHtiLHcsbH0gd2l0aCBpbW1lZGlhdGUgb3BlcmFuZHMgb24gY3B1MzIuCi0KLQkqIG02OGstb3BjLmM6IENvcnJlY3QgbW92ZXcgb2YgYW4gaW1tZWRpYXRlIG9wZXJhbmQgdG8gJXNyIG9yICVjY3IKLQlmb3IgbWNmNTIwMC4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NIRUNLX1RPT0wgYmVmb3JlIEFNX1BST0dfTElCVE9PTC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIFNlcCAxOSAxMTo0NTo0OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKCJjbW92Iik6IE9yZGVyIHJlZyBwYXJhbSByMSwgcjIgbm90IHIyLCByMi4KLQotVGh1IFNlcCAxOCAxMToyMTo0MyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNsZXRfY3ByZWdfdGFibGUpOiBBZGQgJWNjc3IyLCAlY2NjcnIsICVjY3JzdHIuCi0KLVR1ZSBTZXAgMTYgMTU6MTg6MjAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRnVydGhlciByZWFycmFuZ2VtZW50cy4KLQotVHVlIFNlcCAxNiAxNjoxMjoxMSAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAocm90MmgsIHNyYTJoLCBzcmwyaCBpbnNucyk6IFJldmVydCBsYXN0IGNoYW5nZS4KLQotVHVlIFNlcCAxNiAwOTo0ODo1MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGaWVsZHMgcmVvcmRlcmVkIHRvIGFsbG93IGFzc2VtYmxlcgotCXBhcnNlciB0byB3b3JrLgotCi1UdWUgU2VwIDE2IDEwOjAxOjAwIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGRlZCB0eDM5IGluc25zIHNkYmJwLCByZmUsIGFuZCBkZXJldC4KLQotTW9uIFNlcCAxNSAxODozMTo1MiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jOiBJbml0aWFsaXNlIHByb2Nlc3NvcnMgZmllbGQgb2Ygdjg1MF9vcGNvZGUgc3RydWN0dXJlLgotCi1XZWQgQXVnIDI3IDIxOjQyOjM5IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTWVyZ2UgY2hhbmdlcyBmcm9tIE1hcnRpbiBIdW50OgotCi0JKiBkMzB2LW9wYy5jOiBDaGFuZ2UgbXZmYWNjIHRvIGFjY2VwdCA2LWJpdCB1bnNpZ25lZCB2YWx1ZXMuCi0KLQkqIGQzMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IEFkZCBjb250cm9sIHJlZ2lzdGVycyBmcm9tIDAtNjMuCi0JKGQzMHZfb3Bjb2RlX3RhYmVsKTogQWRkIGRidCwgcnRkLCBzcmFoLCBhbmQgc3JsaCBpbnN0cnVjdGlvbnMuIEZpeAotCXJvdDJoLCBzcmEyaCwgYW5kIHNybDJoIHRvIHVzZSBuZXcgU0hPUlRfQTVTIGZvcm1hdC4KLQotCSogZDMwdi1kaXMuYyAocHJpbnRfaW5zbik6IEZpeCBkaXNhc3NlbWJseSBvZiBTSE9SVF9EMiBvcGNvZGVzLgotCi0JKiBkMzB2LWRpcy5jIChwcmludF9pbnNuKTogRmlyc3Qgb3BlcmFuZCBvZiBkKmkgKGRlbGF5ZWQKLQlicmFuY2gpIGluc3RydWN0aW9ucyBpcyByZWxhdGl2ZS4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9vcGNvZGVfdGFibGUpOiBDaGFuZ2UgZm9ybSBmb3IgcmVwZWF0aS4KLQkoZDMwdl9vcGVyYW5kX3RhYmxlKTogQWRkIElNTTZTMyB0eXBlLgotCShkMzB2X2Zvcm1hdF90YWJsZSk6IENoYW5nZSBTSE9SVF9EMi4gQWRkIExPTkdfRGIuCi0KLQkqIGQzMHYtZGlzLmM6IEZpeCBidWcgd2l0aCAiLnMiIGFuZCAiLmwiIGV4dGVuc2lvbnMKLQlhbmQgY21wIGluc3RydWN0aW9ucy4KLQotCSogZDMwdi1vcGMuYzogQ29ycmVjdCBlbnRyaWVzIGZvciByZXBlYXQqLCBhbmQgc2F0Ki4KLQlNYWtlIElNTTUgdW5zaWduZWQuIENyZWF0ZSBJTU02VSBhbmQgSU1NMTJTM1Ugb3BlcmFuZAotCXR5cGVzLiBDb3JyZWN0IHNldmVyYWwgZm9ybWF0cy4KLQotCSogZDMwdi1vcGMuYzogKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IEFkZCBkcHN3IGFuZCBkcGMuCi0KLQkqIGQzMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IENoYW5nZSBjb250cm9sIHJlZ2lzdGVycy4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9mb3JtYXRfdGFibGUpOiBDb3JyZWN0IFNIT1JUX0MxIGFuZAotCVNIT1JUX0MyLiAgTWFudWFsIHdhcyBpbmNvcnJlY3QuCi0KLQkqIGQzMHYtZGlzLmMgKGxvb2t1cF9vcGNvZGUpOiAgUmV0dXJuIHZhbHVlIG5vdyBpbmRpY2F0ZXMKLQlpZiBhbiBvcGNvZGUgaGFzIGEgc2hvcnQgYW5kIGEgbG9uZyBmb3JtLiAgVXNlZCBmb3IgZGVjaWRpbmcKLQl0byBhcHBlbmQgYSAiLnMiIG9yICIubCIuCi0JKHByaW50X2luc24pOiBBcHBlbmQgYSAiLnMiIHRvIGFuIGluc3RydWN0aW9uIGlmIGl0IGlzCi0gCXRoZSBzaG9ydCBmb3JtIGFuZCAiLmwiIGlmIGl0IGlzIGEgbG9uZyBmb3JtLiBEbyBub3QgYXBwZW5kCi0JYW55dGhpbmcgaWYgdGhlIGluc3RydWN0aW9uIGhhcyBvbmx5IG9uZSBwb3NzaWJsZSBzaXplLgotCi0JKiBkMzB2LW9wYy5jOiBDaGFuZ2UgbXVseDJoIHRvIHJlcXVpcmUgYW4gZXZlbiByZWdpc3Rlci4KLQlOZXcgZm9ybTogU0hPUlRfQTI7IGEgU0hPUlRfQSBmb3JtIHRoYXQgbmVlZHMgYW4gZXZlbgotCXJlZ2lzdGVyIGFzIHRoZSBmaXJzdCBvcGVyYW5kLgotCi0JKiBkMzB2LWRpcy5jIChwcmludF9pbnNuX2QzMHYpOiBGaXggcHJvYmxlbSB3aGVyZSB0aGUgbGFzdAotCWluc3RydWN0aW9uIHdhcyBub3QgYmVpbmcgZGlzYXNzZW1ibGVkIGlmIHRoZXJlIHdlcmUgYW4gb2RkCi0JbnVtYmVyIG9mIGluc3RydWN0aW9ucy4KLQotCSogZDMwdi1vcGMuYyAoU0hPUlRfTTIsIExPTkdfTTIpOiAgVHdvIG5ldyBmb3Jtcy4KLQotRnJpIFNlcCAxMiAxMTo0Mzo1NCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEltcHJvdmVkIGRpc3BsYXkgb2YgcmVnaXN0ZXIgbGlzdHMuCi0KLVRodSBTZXAgMTEgMTc6MzU6MTAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBGaXggYXNzZW1ibGVyIGFyZ3MgdG8KLQlmemVyb3MsIGZvbmVzLCBmc3JjMSwgZnNyYzFzLCBmc3JjMnMsIGZub3QxLCBmbm90MXMsIGZub3QycywKLQlmb3JzLCBmbm9ycywgZmFuZHMsIGZuYW5kcywgZnhvcnMsIGZ4bm9ycywgZm9ybm90MXMsIGZvcm5vdDJzLAotCWZhbmRub3QxcywgZmFuZG5vdDJzLgotCi1UdWUgU2VwICA5IDEwOjAzOjQ5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRml4IG9wMyBmaWVsZCBmb3IgZmNtcHEvZmNtcGVxLgotCi1Nb24gU2VwICA4IDE0OjA2OjU5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmMgKGNnZW5fcGFyc2VfYWRkcmVzcyk6IE5ldyBhcmd1bWVudCByZXN1bHRwLgotCUFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0JKiBtMzJyLWFzbS5jIChwYXJzZV9oX2hpMTYpOiBSaWdodCBzaGlmdCBudW1iZXJzIGJ5IDE2LgotCi1UdWUgU2VwICAyIDE4OjM5OjA4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIG1uMTAyMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIGFyZQotICAgICAgICByZWxhdGl2ZSB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgbm90IHRoZSBjdXJyZW50IGluc3RydWN0aW9uLgotCi1UdWUgU2VwICAyIDE1OjQxOjU1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogT25seSBzaWduZWQgZXh0ZW5kIHZhbHVlcyB0aGF0IGFyZSBub3QKLQlyZXR1cm5lZCBieSBleHRyYWN0IGZ1bmN0aW9ucy4KLQlSZW1vdmUgdXNlIG9mIFY4NTBfT1BFUkFORF9BREpVU1RfU0hPUlRfTUVNT1JZIGZsYWcuCi0KLVR1ZSBTZXAgIDIgMTU6Mzk6NDAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYzogVXBkYXRlIGNvbW1lbnRzLiAgUmVtb3ZlIHVzZSBvZgotCVY4NTBfT1BFUkFORF9BREpVU1RfU0hPUlRfTUVNT1JZLiAgRml4IHNldmVyYWwgb3BlcmFuZCBwYXR0ZXJucy4KLQotVHVlIEF1ZyAyNiAwOTo0MjoyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jIChNT1ZISSk6IEltbWVkaWF0ZSBwYXJhbWV0ZXIgaXMgdW5zaWduZWQuCi0KLU1vbiBBdWcgMjUgMTU6NTg6MDcgMTk5NyAgQ2hyaXN0b3BoZXIgUHJvdmVuemFubyAgPHByb3ZlbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbHQgd2l0aCBsYXRlc3QgZGV2byBhdXRvY29uZiBmb3IgTlQgc3VwcG9ydC4KLQotRnJpIEF1ZyAyMiAxMDozNToxNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFVzZSBjdXJseSBicmFjZSBzeW50YXggZm9yIHJlZ2lzdGVyCi0JbGlzdHMuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlc1tdKTogQWRkIE5PVF9SMCBmbGFnIHRvIGRlY2VjdCBjYXNlcwotCXdoZXJlIHIwIGlzIGJlaW5nIHVzZWQgYXMgYSBkZXN0aW5hdGlvbiByZWdpc3Rlci4KLQotVGh1IEF1ZyAyMSAxMTowOTowOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXNbXSk6IE1vdmUgZGl2aCBvcGNvZGVzIG5leHQgdG8gZWFjaCBvdGhlci4KLQotVHVlIEF1ZyAxOSAxMDo1OTo1OSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1vcGMuYyAoYWxwaGFfb3Bjb2Rlcyk6IEZpeCBod19yZWlfc3RhbGwgbXVuZ2FnZS4KLQotTW9uIEF1ZyAxOCAxMToxMDowMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXNbXSk6IFJlbW92ZSB1c2Ugb2YgZmxhZyBmaWVsZC4KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlc1tdKTogQWRkIHN1cHBvcnQgZm9yIHJldmVyc2VkIHNob3J0IGxvYWQKLQlvcGNvZGVzLi4KLQotTW9uIEF1ZyAxOCAxMTowODoyNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUgKGNnZW5fZmlsZXMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChjZ2VuX2ZpbGVzKTogIEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLU1vbiBBdWcgMTggMTE6MDg6MjUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlIChjZ2VuX2ZpbGVzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKGNnZW5fZmlsZXMpOiAgQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLUZyaSBBdWcgMTUgMDU6MTc6NDggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChiZmRfYXJjX2FyY2gpOiBBZGQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5hbSAoQUxMX01BQ0hJTkVTKTogQWRkIGFyYy1kaXMubG8sIGFyYy1vcGMubG8uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGFyYy1kaXMuYywgYXJjLW9wYy5jOiBOZXcgZmlsZXMuCi0JKiBkaXNhc3NlbWJsZS5jIChBUkNIX2FsbCk6IERlZmluZSBBUkNIX2FyYy4KLQkoZGlzYXNzZW1ibGVyKTogQWRkIEFSQyBzdXBwb3J0LgotCi1XZWQgQXVnIDEzIDE4OjUyOjExIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBFQSBpbnN0cnVjdGlvbnMuCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9pNWRpdiwgZXh0cmFjdF9pNWRpdik6IE5ldyBGdW5jdGlvbnMuCi0JKHY4NTBfb3Bjb2Rlcyk6IEFkZCB2ODUwRUEgaW5zdHJ1Y3Rpb25zLgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEFkZCBzdXBwb3J0IGZvciB2ODUwRSBpbnN0cnVjdGlvbnMuCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kNV80LCBleHRyYWN0X2Q1XzQsIGluc2VydF9kMTZfMTYsCi0JZXh0cmFjdF9kMTZfMTYsIGluc2VydF9pOSwgZXh0cmFjdF9pOSwgaW5zZXJ0X3U5LCBleHRyYWN0X3U5LAotCWluc2VydF9zcGUsIGV4dHJhY3Rfc3BlKTogTmV3IEZ1bmN0aW9ucy4KLQkodjg1MF9vcGNvZGVzKTogQWRkIHY4NTBFIGluc3RydWN0aW9ucy4KLQotCSogdjg1MC1vcGMuYzogUmVvcmdhbmlzZWQgYW5kIHJlLWxheWVkIG91dCB0byBpbXByb3ZlIHJlYWRhYmlsaXR5Ci0JYW5kIHBvcnRhYmlsaXR5LgotCi1UdWUgQXVnICA1IDIzOjA5OjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4xLgotCi1Nb24gQXVnICA0IDEyOjAyOjE2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbmV3IGF1dG9tYWtlIHBhdGNoZXMuCi0KLUZyaSBBdWcgIDEgMTM6MDI6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBlbmFibGVfc2hhcmVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wuCi0JKiBhY2luY2x1ZGUubTQ6IEp1c3QgaW5jbHVkZSBhY2luY2x1ZGUubTQgZnJvbSBCRkQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBKdWwgMzEgMjE6NDQ6NDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogYWNpbmNsdWRlLm00OiBOZXcgZmlsZS4KLQkqIHN0YW1wLWguaW46IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFNX0lOSVRfQVVUT01BS0UgYW5kIEFNX1BST0dfTElCVE9PTC4KLQlSZW1vdmVkIHNoYXJlZCBsaWJyYXJ5IGhhbmRsaW5nOyBub3cgaGFuZGxlZCBieSBsaWJ0b29sLiAgUmVwbGFjZQotCUFDX0NPTkZJR19IRUFERVIgd2l0aCBBTV9DT05GSUdfSEVBREVSLiAgQ2FsbCBBTV9NQUlOVEFJTkVSX01PREUsCi0JQU1fQ1lHV0lOMzIsIGFuZCBBTV9FWEVFWFQuICBSZXBsYWNlIEFDX1BST0dfSU5TVEFMTCB3aXRoCi0JQU1fUFJPR19JTlNUQUxMLiAgQ2hhbmdlIGFsbCAubyBmaWxlcyB0byAubG8uICBSZW1vdmUgc3RhbXAtaAotCWhhbmRsaW5nIGluIEFDX09VVFBVVC4KLQkqIGRlcC1pbi5zZWQ6IENoYW5nZSAubyB0byAubG8uCi0JKiBNYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBOb3cgYnVpbHQgd2l0aCBhY2xvY2FsLgotCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBKdWwgMjggMjE6NTI6MjQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBGaXggdHlwby90aGlua28gaW4gImVyZXQiIGluc3RydWN0aW9uLgotCi1UaHUgSnVsIDI0IDEzOjAzOjI2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRml4IHNwZWxsaW5nIG9uIGZwYWRkWCwgZnBzdWJYIGluc25zLgotCU1ha2UgYXJyYXkgY29uc3QuCi0JKiBzcGFyYy1kaXMuYyAoc29ydGVkX29wY29kZXMpOiBOZXcgc3RhdGljIGxvY2FsLgotCShzdHJ1Y3Qgb3Bjb2RlX2hhc2gpOiBgb3Bjb2RlJyBpcyBwb2ludGVyIHRvIGNvbnN0IGVsZW1lbnQuCi0JKGJ1aWxkX2hhc2gpOiBGaXJzdCBhcmcgaXMgbm93IHRhYmxlIG9mIHNvcnRlZCBwb2ludGVycy4KLQkocHJpbnRfaW5zbl9zcGFyYyk6IFNvcnQgb3Bjb2RlcyBieSBzb3J0aW5nIHRhYmxlIG9mIHBvaW50ZXJzLgotCShjb21wYXJlX29wY29kZXMpOiBVcGRhdGUuCi0KLVR1ZSBKdWwgMTUgMTI6MDU6MjMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYzogI2luY2x1ZGUgPGN0eXBlLmg+LgotCShoYXNoX2tleXdvcmRfbmFtZSk6IE5ldyBhcmcgYGNhc2Vfc2Vuc2l0aXZlX3AnLiAgQ2FsbGVycyB1cGRhdGVkLgotCUhhbmRsZSBjYXNlIGluc2Vuc2l0aXZlIGhhc2hpbmcuCi0JKGhhc2hfa2V5d29yZF92YWx1ZSk6IENoYW5nZSB0eXBlIG9mIGB2YWx1ZScgdG8gdW5zaWduZWQgaW50LgotCi1UaHUgSnVsIDEwIDEyOjU2OjEwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYyAobWlwc19idWlsdGluX29wY29kZXMpOiBJZiBhbiBpbnNuIHVzZXMgc2luZ2xlCi0JcHJlY2lzaW9uIEZQLCBtYXJrIGl0IGFzIHN1Y2guICBMaWtld2lzZSBmb3IgZG91YmxlIHByZWNpc2lvbgotCUZQLiAgTWFyayBJU0ExIGluc25zLiAgQ29uc29saWRhdGUgZHVwbGljYXRlIG9wY29kZXMgd2hlcmUKLQlwb3NzaWJsZS4KLQotV2VkIEp1biAyNSAxNToyNTo1NyAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGNpcmRhbi5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKGV4dHJhY3RfbnNpKTogbWFrZSB1bnNpZ25lZCBleHByZXNzaW9uIHNpZ25lZCBiZWZvcmUKLSAJbmVnYXRpbmcgaXQuCi0JKFVOVVNFRCk6IHJlbW92ZSBvbmUgbGV2ZWwgb2YgcGFyZW5zLCBzbyBNU1ZDIGRvZXNuJ3QgY2hva2Ugb24KLSAJbmVzdGluZyBkZXB0aCB3aGVuIGFsbCB0aGUgbWFjcm9zIGFyZSBleHBhbmRlZC4KLQotVHVlIEp1biAxNyAxNzowMjoxNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jOiBUaGUgZmNtcCB2OWEgaW5zdHJ1Y3Rpb25zIHRha2UgYW4gaW50ZWdlciByZWdpc3RlcgotCWFzIGEgZGVzdGluYXRpb24sIG5vdCBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgRnJvbSBDaHJpc3RpYW4KLQlLdWVobmtlIDxDaHJpc3RpYW4uS3VlaG5rZUBhcmJpLkluZm9ybWF0aWsuVW5pLU9sZGVuYnVyZy5ERT4uCi0KLU1vbiBKdW4gMTYgMTQ6MTM6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFByaW50IGNhc2UgNy4yIHVzaW5nICVwY0AoKQotCXN5bnRheC4gIEZyb20gUm9tYW4gSG9kZWsKLQk8cm5ob2Rla0BmYXVpMjJjLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPi4KLQotCSogaTM4Ni1kaXMuYyAodHdvYnl0ZV9oYXNfbW9kcm0pOiBGaXggcGFuZC4KLQotTW9uIEp1biAxNiAxNDowODozOCAxOTk3ICBNaWNoYWVsIFRheWxvciAgPG1idEBtaXQuZWR1PgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODZfdHdvYnl0ZSk6IEZpeCBwYW5kIGFuZCBwYW5kbi4KLQotVHVlIEp1biAxMCAxMToyNjo0NyAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBhcm0tZGlzLmM6IEFkZCBwcm90b3R5cGVzIGZvciBhcm1fZGVjb2RlX3NoaWZ0IGFuZAotCXByaW50X2luc25fYXJtLgotCi1Nb24gSnVuICAyIDExOjM5OjA0IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgcjM5MDAgaW5zbnMuCi0KLVR1ZSBNYXkgMjcgMTU6NTU6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBDaGFuZ2UgcmVsbWFzayB0byBiZmRfdm1hLiAgRG9uJ3QKLQlwcmludCBkZWxheSBzbG90IGluc3RydWN0aW9ucyBvbiB0aGUgc2FtZSBsaW5lLiAgV2hlbiB1c2luZyBhIFBDCi0JcmVsYXRpdmUgbG9hZCwgYWRkIGEgY29tbWVudCB3aXRoIHRoZSB2YWx1ZSBiZWluZyBsb2FkZWQgaWYgaXQgY2FuCi0JYmUgb2J0YWluZWQuCi0KLVR1ZSBNYXkgMjcgMTE6MDI6MDggMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODZbXSwgZGlzMzg2X3R3b2J5dGVbXSk6IGNoYW5nZSBwdXNobC9wb3BsCi0JdG8gcHVzaFMvcG9wUyBmb3Igc2VnbWVudCByZWdzIGFuZCBieXRlIGNvbnN0YW50IHNvIHRoYXQKLQlwdXNody9wb3B3IHByaW50ZWQgd2hlbiBpbiAxNiBiaXQgZGF0YSBtb2RlLgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODZbXSk6IGNoYW5nZSBjd3RsLCBjbHRkIHRvIGNXdFMsIGNTdGQgdG8KLQlwcmludCBjYnR3LCBjd3RkIGluIDE2IGJpdCBkYXRhIG1vZGUuCi0JKiBpMzg2LWRpcy5jIChwdXRvcCk6IGV4dHJhIGNhc2UgVyB0byBzdXBwb3J0IGFib3ZlLgotCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX3g4Nik6IHByaW50IGFkZHIzMiBwcmVmaXggd2hlbiBnaXZlbgotCWFkZHJlc3Mgc2l6ZSBwcmVmaXggaW4gMTYgYml0IGFkZHJlc3MgbW9kZS4KLQotRnJpIE1heSAyMyAxNjo0NzoyMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNoLWRpcy5jOiBSZWluZGVudC4gIFJlbmFtZSBsb2NhbCB2YXJpYWJsZSBmcHJpbnRmIHRvCi0JZnByaW50Zl9mbi4KLQotVGh1IE1heSAyMiAxNDowNjowMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jIChtMzJyX2NnZW5faW5zbl90YWJsZSwgY21wdWkpOiBVbmRvIHBhdGNoIG9mIE1heSAyLgotCi1UdWUgTWF5IDIwIDExOjI2OjI3IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChtaXBzX2J1aWx0aW5fb3Bjb2Rlcyk6IE1vdmVkIElOU05fSVNBIGZpZWxkIGludG8gbmV3Ci0JICBmaWVsZCBtZW1iZXJzaGlwLgotCSogbWlwczE2LW9wYy5jIChtaXAxNl9vcGNvZGVzKTogc2FtZS4KLQotTW9uIE1heSAxMiAxNToxMDo1MyAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG1vdmViKTogQ2hhbmdlICRkIHRvICVkLgotCi1Nb24gTWF5ICA1IDE0OjI4OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYzogKGRpczM4Nl90d29ieXRlKTogQWRkIE1NWCBpbnN0cnVjdGlvbnMuCi0JKHR3b2J5dGVfaGFzX21vZHJtKTogTGlrZXdpc2UuCi0JKGdycHMpOiBMaWtld2lzZS4KLQkoT1BfTU1YLCBPUF9FTSwgT1BfTVMpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQotCSogaTM4Ni1kaXMuYzogUmV2ZXJ0IHBhdGNoIG9mIEFwcmlsIDQuICBUaGUgb3V0cHV0IG5vdyBtYXRjaGVzCi0Jd2hhdCBnY2MgZ2VuZXJhdGVzLgotCi1GcmkgTWF5ICAyIDEyOjQ4OjM3IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmMgKG0zMnJfY2dlbl9pbnNuX3RhYmxlLCBjbXB1aSk6IFVzZSAkdWltbTE2IGluc3RlYWQKLQlvZiAkc2ltbTE2LgotCi1UaHUgTWF5ICAxIDE1OjM0OjE1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmggKENHRU5fQVJDSCk6IFJlbmFtZWQgZnJvbSBDR0VOX0NQVS4KLQotVHVlIEFwciAxNSAxMjo0MDowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuCi0JKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KLQotTW9uIEFwciAxNCAxMjoxMzo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT46Ci0JKiBjb25maWd1cmUuaW46IFVzZSAke0NPTkZJR19TSEVMTH0gd2hlbiBydW5uaW5nICRhY19jb25maWdfc3ViLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TdW4gQXByIDEzIDE3OjUwOjQxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tKi5jLCBtMzJyLSouYzogI2luY2x1ZGUgc3lzZGVwLmggaW5zdGVhZCBvZiBjb25maWcuaC4KLQlEZWxldGUgc3RyaW5neyxzfS5oIHN1cHBvcnQuCi0KLVRodSBBcHIgMTAgMTQ6NDQ6NTYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYyAoY2dlbl9wYXJzZV9vcGVyYW5kX2ZuKTogTmV3IGdsb2JhbC4KLQkoY2dlbl9wYXJzZV97eyx1bn1zaWduZWRfaW50ZWdlcixhZGRyZXNzfSk6IFVwZGF0ZSBjYWxsIHRvCi0JY2dlbl9wYXJzZV9vcGVyYW5kX2ZuLgotCShjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCk6IE5ldyBmdW5jdGlvbi4KLQkqIG0zMnItYXNtLmMgKHBhcnNlX2luc25fbm9ybWFsKTogY2dlbl9pbml0X3BhcnNlX29wZXJhbmQgcmVuYW1lZAotCWZyb20gY2dlbl9hc21faW5pdF9wYXJzZS4KLQkobTMycl9jZ2VuX2Fzc2VtYmxlX2luc24pOiBOZXcgb3BlcmFuZCBgZXJybXNnJy4KLQlEZWxldGUgY2FsbCB0byBhc19iYWQsIHJldHVybiBlcnJvciBtZXNzYWdlIHRvIGNhbGxlci4KLQkobTMycl9jZ2VuX2FzbV9oYXNoX2tleXdvcmRzKTogI2lmIDAgb3V0LgotCi1XZWQgQXByICA5IDEyOjA1OjI1IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZykgW2Nhc2UgJ2QnXTogUHJpbnQgYXMgYWRkcmVzcyByZWdpc3RlciwKLQlub3QgZGF0YSByZWdpc3Rlci4KLQlbY2FzZSAnSiddOiBGaXggdHlwbyBpbiByZWdpc3RlciBuYW1lLgotCi1Nb24gQXByICA3IDE2OjQ4OjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIFNITElCX0xJQlMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoU0hMSUJfTElCUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChTSExJQikpOiBVc2UgJChTSExJQl9MSUJTKS4KLQotTW9uIEFwciAgNyAxMTo0NTo0NCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWRpcy5jIChidWlsZF9kaXNfaGFzaF90YWJsZSk6IEZpeCB4bWFsbG9jIHNpemUgY29tcHV0YXRpb24uCi0KLQkqIGNnZW4tb3BjLmMgKGhhc2hfa2V5d29yZF9uYW1lKTogSW1wcm92ZSBhbGdvcml0aG0uCi0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IEhhbmRsZSBtMzJyLgotCi1GcmkgQXByICA0IDEyOjI5OjM4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmMsIG0zMnItZGlzLmMsIG0zMnItb3BjLmMsIG0zMnItb3BjLmg6IE5ldyBmaWxlcy4KLQkqIGNnZW4tYXNtLmMsIGNnZW4tZGlzLmMsIGNnZW4tb3BjLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgdGhlbS4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIHRoZW0uCi0JKGRlcGVuZGVuY2llcyk6IFJlZ2VuZXJhdGUuCi0JKiBjb25maWd1cmUuaW4gKGNnZW5fZmlsZXMpOiBOZXcgdmFyaWFibGUuCi0JKGJmZF9tMzJyX2FyY2gpOiBBZGQgZW50cnkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLUZyaSBBcHIgIDQgMTQ6MDQ6MTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENvcnJlY3QgZmlsZSBuYW1lcyBmb3IgYmZkX21uMTBbMjNdMDBfYXJjaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBkMTB2LWRpcy5jOiBJbmNsdWRlICJhbnNpZGVjbC5oIiBiZWZvcmUgIm9wY29kZS9kMTB2LmgiLgotCi0JKiBpMzg2LWRpcy5jIChmbG9hdF9yZWcpOiBTd2FwIGZzdWJycCBhbmQgZnN1YnAuICBTd2FwIGZkaXZycCBhbmQKLQlmZGl2cC4KLQotVGh1IEFwciAgMyAxMzoyMjo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOC4KLQotV2VkIEFwciAgMiAxMjoyMzo1MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG0xMDIwMC1kaXMuYzogUmVuYW1lIGZyb20gbW4xMDIwMC1kaXMuYy4KLQkqIG0xMDIwMC1vcGMuYzogUmVuYW1lIGZyb20gbW4xMDIwMC1vcGMuYy4KLQkqIG0xMDMwMC1kaXMuYzogUmVuYW1lIGZyb20gbW4xMDMwMC1kaXMuYwotCSogbTEwMzAwLW9wYy5jOiBSZW5hbWUgZnJvbSBtbjEwMzAwLW9wYy5jLgotCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotCSogbWlwczE2LW9wYy5jOiBBZGQgbXVsIGFuZCBkbXVsIG1hY3Jvcy4KLQotVHVlIEFwciAgMSAxNjoyNzo0NSAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgQ0ZMQUdTLCBhZGQgY2xlYW4gdGFyZ2V0LgotCi1GcmkgTWFyIDI4IDEyOjEwOjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkICJ3YWl0Ii4gIEZyb20gUmFsZiBCYWVjaGxlCi0JPHJhbGZAZ251LmFpLm1pdC5lZHU+LgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdGRsaWIuaCB0byBBQ19DSEVDS19IRUFERVJTIGxpc3QuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIHN5c2RlcC5oOiBJbmNsdWRlIDxzdGRsaWIuaD4gaWYgaXQgZXhpc3RzLgotCSogc3BhcmMtZGlzLmM6IEluY2x1ZGUgPHN0ZGlvLmg+IGFuZCAic3lzZGVwLmgiLiAgRG9uJ3QgaW5jbHVkZQotCTxzdHJpbmcuaD4uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLVRodSBNYXIgMjcgMTQ6MjQ6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmM6IEFkZCBQUEMgNDAzIGluc3RydWN0aW9ucyBhbmQgZXh0ZW5kZWQgb3Bjb2Rlcy4gIEZyb20KLQlBbmRyZXcgQnJheSA8YW5keUBtYWRob3VzZS5kZW1vbi5jby51az4uCi0KLQkqIG1pcHMtb3BjLmM6IEFkZCBjYXN0IHdoZW4gc2V0dGluZyBtaXBzX29wY29kZXMuCi0KLVR1ZSBNYXIgMjUgMjM6MDQ6MDAgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiAgRml4IHNpZ24gZXh0ZW5zaW9uIHByb2JsZW0uCi0JKiB2ODUwLW9wYy5jIChleHRyYWN0X2QqKTogIEZpeCBzaWduIGV4dGVuc2lvbiBwcm9ibGVtcyB0byBtYWtlCi0JZGlzYXNzZW1ibHkgY2FsY3VsYXRlIGJyYW5jaCBvZmZzZXRzIGNvcnJlY3RseS4KLQotTW9uIE1hciAyNCAxMzoyMjoxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oOiBBZGQgYmYvcyBhbmQgYnQvcyBhcyBzeW5vbnltcyBmb3IgYmYucyBhbmQgYnQucy4KLQotCSogbWlwcy1vcGMuYzogQWRkIGRjdHIgYW5kIGRjdHcuCi0KLVN1biBNYXIgMjMgMTg6MDg6MTAgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQzMHYtZGlzLmMgKHByaW50X2luc24pOiBDaGFuZ2UgdGhlIHdheSBzaWduZWQgY29uc3RhbnRzCi0JYXJlIGRpc3BsYXllZC4KLQotRnJpIE1hciAyMSAxNDozNzo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCRkRfSCk6IE5ldyB2YXJpYWJsZS4KLQkoSEZJTEVTKTogTmV3IHZhcmlhYmxlLgotCShDRklMRVMpOiBBZGQgYWxsIEMgZmlsZXMuCi0JKC5kZXAsIC5kZXAxLCBkZXAuc2VkLCBkZXAsIGRlcC1pbik6IE5ldyB0YXJnZXRzLgotCURlbGV0ZSBvbGQgZGVwZW5kZW5jaWVzLCBhbmQgYnVpbGQgbmV3IG9uZXMuCi0JKiBkZXAtaW4uc2VkOiBOZXcgZmlsZS4KLQotVGh1IE1hciAyMCAxOTowMzozMCAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZV9hbGlhc2VzKTogQWRkZWQgYmxvIGFuZCBibG97cyxiLHcsbH0uCi0KLVR1ZSBNYXIgMTggMTQ6MTc6MDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jOiBDaGFuZ2UgInRyYXAiIHRvICJzeXNjYWxsIi4KLQkqIG1uMTAzMDAtb3BjLmM6IEFkZCBuZXcgInN5c2NhbGwiIGluc3RydWN0aW9uLgotCi1Nb24gTWFyIDE3IDA4OjQ4OjAzIDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BiZWF1dHkuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogUHJvdmlkZSBjb3JyZWN0IGVudHJpZXMgZm9yIG11bHNsIGFuZAotIAltdWx1bCBpbnNucyBvbiB0aGUgY29sZGZpcmUuCi0KLVNhdCBNYXIgMTUgMTc6MTM6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogRG9uJ3QgcHJpbnQgaW5zdHJ1Y3Rpb24gYnl0ZXMuCi0JKHByaW50X2luc25fYmlnX2FybSk6IFNldCBieXRlc19wZXJfY2h1bmsgYW5kIGRpc3BsYXlfZW5kaWFuLgotCShwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBMaWtld2lzZS4KLQotRnJpIE1hciAxNCAxNTowODo1OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz46Ci0JKiBpMzg2LWRpcy5jIChmZXRjaF9kYXRhKTogQWRkIHByb3RvdHlwZS4KLQkqIG02OGstZGlzLmMgKGZldGNoX2RhdGEpOiBBZGQgcHJvdG90eXBlLgotCShkdW1teV9wcmludF9hZGRyZXNzKTogQWRkIHByb3RvdHlwZS4gIE1ha2Ugc3RhdGljLgotCSogcHBjLW9wYy5jICh2YWxpZF9ibyk6IEFkZCBwcm90b3R5cGUuCi0JKiBzcGFyYy1kaXMuYyAoYnVpbGRfaGFzaF90YWJsZSk6IEFkZCBwcm90b3R5cGUuCi0JKGlzX2RlbGF5ZWRfYnJhbmNoLCBjb21wdXRlX2FyY2hfbWFzayk6IEFkZCBwcm90b3R5cGVzLgotCShwcmludF9pbnNuX3NwYXJjKTogTWFrZSBzZXZlcmFsIGxvY2FsIHZhcmlhYmxlcyBjb25zdC4KLQkoY29tcGFyZV9vcGNvZGVzKTogQ2hhbmdlIGFyZ3VtZW50cyB0byBjb25zdCBQVFIuICBBZGQgcHJvdG90eXBlLgotCSogc3BhcmMtb3BjLmMgKGFyZyk6IENoYW5nZSBuYW1lIGZpZWxkIHRvIGJlIGNvbnN0LgotCShsb29rdXBfbmFtZSwgbG9va3VwX3ZhbHVlKTogQWRkIHByb3RvdHlwZXMuICBDaGFuZ2UgdGFibGUgYW5kCi0JbmFtZSBwYXJhbWV0ZXJzIHRvIGJlIGNvbnN0LgotCShzcGFyY19lbmNvZGVfYXNpKTogQ2hhbmdlIG5hbWUgcGFyYW1ldGVyIHRvIGJlIGNvbnN0LgotCShzcGFyY19lbmNvZGVfbWVtYmFyLCBzcGFyY19lbmNvZGVfcHJlZmV0Y2gpOiBMaWtld2lzZS4KLQkoc3BhcmNfZW5jb2RlX3NwYXJjbGV0X2NwcmVnKTogTGlrZXdpc2UuCi0JKHNwYXJjX2RlY29kZV9hc2kpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYmUgY29uc3QuCi0JKHNwYXJjX2RlY29kZV9tZW1iYXIsIHNwYXJjX2RlY29kZV9wcmVmZXRjaCk6IExpa2V3aXNlLgotCShzcGFyY19kZWNvZGVfc3BhcmNsZXRfY3ByZWcpOiBMaWtld2lzZS4KLQotRnJpIE1hciAgNyAxMDo1MTo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKFNITElOSykpOiBKdXN0IHVzZSBsbiAtcywgbm90IGxuIC1zZiwgc2luY2UKLQlTb2xhcmlzIGRvZXNuJ3QgbGlrZSB0aGUgY29tYmluZWQgb3B0aW9ucywgYW5kIHRoZSAtZiBpcwotCXVubmVjZXNzYXJ5LgotCShzdGFtcC10c2hsaW5rLCBpbnN0YWxsKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgIDYgMTY6NTE6MTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChJTU0xNl9QQ1JFTCwgU0Q4Tl9QQ1JFTCwgRDE2X1NISUZUKTogTWFyayB0aGVzZQotCWFzIHJlbGF4YWJsZS4KLQotVHVlIE1hciAgNCAwNjoxMDozNiAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogRml4IGxhc3QgY2hhbmdlIGZvciB0aGUgbWM2ODAxMC4KLQotTW9uIE1hciAgMyAwNzo0NToyMCAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQWRkZWQgZW50cmllcyBmb3IgdGhlIHRzdCBpbnNucyBvbgotIAl0aGUgbWM2ODAwMC4KLQotVGh1IEZlYiAyNyAxNDowNDozMiAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBBZGRlZCBzd2JlZ2wgcHNldWRvLWluc3RydWN0aW9uLgotCi1UaHUgRmViIDI3IDExOjM2OjQxIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IFNldCBpbmZvLT5ieXRlc19wZXJfbGluZSB0byA4LgotCi1XZWQgRmViIDI2IDE1OjM0OjQ4IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogRGVmaW5lIHIyNSBwcm9wZXJseS4KLQotV2VkIEZlYiAyNiAxMzozODozMCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1kaXMuYyAoTkVYVFNJTkdMRSwgTkVYVERPVUJMRSwgTkVYVEVYVEVORCk6IFVzZQotCWZsb2F0Zm9ybWF0X3RvX2RvdWJsZSB0byBtYWtlIHBvcnRhYmxlLgotCShwcmludF9pbnNuX2FyZyk6IFVzZSBORVhURVhURU5EIG1hY3JvIHdoZW4gZXh0cmFjdGluZyBleHRlbmRlZAotCXByZWNpc2lvbiBmbG9hdC4KLQotTW9uIEZlYiAyNCAxOToyNjoxMiAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEluaXRpYWxpemUgbWlwc19vcGNvZGVzIHRvIG1pcHNfYnVpbHRpbl9vcGNvZGVzLAotCWFuZCBiZmRfbWlwc19udW1fb3Bjb2RlcyB0byBiZmRfbWlwc19udW1fYnVpbHRpbl9vcGNvZGVzLgotCi1Nb24gRmViIDI0IDE1OjE5OjAxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LWRpcy5jLCBkMTB2LW9wYy5jOiBDaGFuZ2UgcHJlX2RlZmluZWRfcmVnaXN0ZXJzIHRvCi0JZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycyBhbmQgcmVnX25hbWVfY250IHRvIGQxMHZfcmVnX25hbWVfY250LgotCi1Nb24gRmViIDI0IDE0OjMzOjI2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAoTFNJX1NDQUxFRCk6IFJlbmFtZWQgZnJvbSB0aGlzIC4uLgotCShPRkZfU0xfQlJfU0NBTEVEKTogLi4uIHRvIHRoaXMsIGFuZCBhZGRlZCB0aGUgZmxhZwotCVRJQzgwX09QRVJBTkRfQkFTRVJFTCB0byB0aGUgZmxhZ3Mgd29yZC4KLQkodGljODBfb3Bjb2Rlcyk6IFJlcGxhY2UgYWxsIG9jY3VyYW5jZXMgb2YgTFNJX1NDQUxFRCB3aXRoCi0JT0ZGX1NMX0JSX1NDQUxFRC4KLQotU2F0IEZlYiAyMiAyMToyNTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCBtYWNyb3MgZm9yIGNvcDAsIGNvcDEgY29wMiBhbmQgY29wMy4KLQlDaGFuZ2UgbWlwc19vcGNvZGVzIGZyb20gY29uc3QgYXJyYXkgdG8gYSBwb2ludGVyLAotCWFuZCBjaGFuZ2UgYmZkX21pcHNfbnVtX29wY29kZXMgZnJvbSBjb25zdCBpbnQgdG8gaW50LAotCXNvIHRoYXQgd2UgY2FuIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBtaXBzIG9wY29kZXMgdGFibGUKLQlkeW5hbWljYWxseS4KLQotU2F0IEZlYiAyMiAyMTowMzo0NyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyk6IFJldmVydCBjaGFuZ2UgdG8KLQlzdG9yZSBCSVROVU0gdmFsdWVzIGluIHRoZSB0YWJsZSBpbiBvbmUncyBjb21wbGVtZW50IGZvcm0KLQl0byBtYXRjaCBiZWhhdmlvciB3aGVuIGFzc2VtYmxlciBpcyBnaXZlbiBhIHJhdyBudW1lcmljCi0JdmFsdWUgZm9yIGEgQklUTlVNIG9wZXJhbmQuCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfb3BlcmFuZF9iaXRudW0pOiBEaXR0by4KLQotRnJpIEZlYiAyMSAxNjozMToxOCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYzogUmVtb3ZlZCByZWZlcmVuY2VzIHRvIEZMQUdfWC4KLQotV2VkIEZlYiAxOSAxNDo1MToyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jaWVzIG9uIC4uL2JmZC9iZmQuaCBhcyByZXF1aXJlZC4KLQotVHVlIEZlYiAxOCAxNzo0Mzo0MyAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZGVkIGQzMHYgb2JqZWN0IGZpbGVzLgotCSogY29uZmlndXJlOiAoYmZkX2QzMHZfYXJjaCkgUmVidWlsdC4KLQkqIGNvbmZpZ3VyZS5pbjogKGJmZF9kMzB2X2FyY2gpIEFkZGVkIG5ldyBjYXNlLgotCSogZDMwdi1kaXMuYzogTmV3IGZpbGUuCi0JKiBkMzB2LW9wYy5jOiBOZXcgZmlsZS4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcikgQWRkIGVudHJ5IGZvciBkMzB2LgotCi1UdWUgRmViIDE4IDE2OjMyOjA4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogQWRkIHN5bWJvbGljCi0JcmVwcmVzZW50YXRpb25zIGZvciB0aGUgZmxvYXRpbmcgcG9pbnQgQklUTlVNIHZhbHVlcy4KLQotRnJpIEZlYiAxNCAxMjoxNDowNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyk6IFN0b3JlIEJJVE5VTSB2YWx1ZXMKLQlpbiB0aGUgdGFibGUgaW4gb25lJ3MgY29tcGxlbWVudCBmb3JtLCBhcyB0aGV5IGFwcGVhciBpbiB0aGUKLQlhY3R1YWwgaW5zdHJ1Y3Rpb24uCi0JKHRpYzgwX3N5bWJvbF90b192YWx1ZSk6IFVzZSBtYWNyb3MgdG8gYWNjZXNzIHByZWRlZmluZWQKLQlzeW1ib2wgZmllbGRzLgotCSh0aWM4MF92YWx1ZV90b19zeW1ib2wpOiBEaXR0by4KLQkodGljODBfbmV4dF9wcmVkZWZpbmVkX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9vcGVyYW5kX2JpdG51bSk6IFJlbW92ZSBjb2RlIHRoYXQgZGlkCi0Jb25lJ3MgY29tcGxlbWVudCBmb3IgQklUTlVNIHZhbHVlcy4KLQotVGh1IEZlYiAxMyAyMTo1Njo1MSAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBSZW1vdmUgOCBiaXQgY2hhcmFjdGVycy4gIFVwZGF0ZSB0byBsYXRlc3QKLQlnY2MgcmVsZWFzZS4KLQotVGh1IEZlYiAxMyAyMDo0MToyMiAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBBZGQgc3diZWcgcHNldWRvLWluc3RydWN0aW9uLgotCi1UaHUgRmViIDEzIDE2OjMwOjAyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYyAoSU1NMTZfUENSRUwpOiBUaGlzIGlzIGEgc2lnbmVkIG9wZXJhbmQuCi0JKElNTTI0X1BDUkVMKTogTGlrZXdpc2UuCi0KLVRodSBGZWIgMTMgMTM6Mjg6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9taXBzMTZfaW5zbl9hcmcpOiBVc2UgbWVtYWRkciAtIDIgYXMgdGhlIGJhc2UKLQlhZGRyZXNzIGZvciBhbiBleHRlbmRlZCBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbiB0aGF0IGlzIG5vdCBhCi0JYnJhbmNoLgotCi1XZWQgRmViIDEyIDEyOjI3OjQwIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX202OGspOiBTZXQgYnl0ZXNfcGVyX2NodW5rIGFuZAotCWJ5dGVzX3Blcl9saW5lLgotCi1UdWUgRmViIDExIDE2OjM2OjMxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBGaXggdHlwbyAnKycgLT4gJ3wnLgotCSh0aWM4MF9vcGNvZGVzKTogU29ydCBlbnRyaWVzIHNvIHRoYXQgbG9uZyBpbW1lZGlhdGUgZm9ybXMKLQljb21lIGFmdGVyIHNob3J0IGltbWVkaWF0ZSBmb3JtcywgbWFraW5nIGl0IGVhc2llciBmb3IKLQlhc3NlbWJsZXIgdG8gc2VsZWN0IHRoZSByaWdodCBvbmUgZm9yIGEgZ2l2ZW4gb3BlcmFuZC4KLQotVHVlIEZlYiAxMSAxNToyNjo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBTZXQgYnl0ZXNfcGVyX2NodW5rIGFuZAotCWRpc3BsYXlfZW5kaWFuLgotCShwcmludF9pbnNuX21pcHMxNik6IExpa2V3aXNlLgotCi1Nb24gRmViIDEwIDEwOjEyOjQxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfc3ltYm9sX3RvX3ZhbHVlKTogQ2hhbmdlZCB0byBhY2NlcHQKLQlhIHN5bWJvbCBjbGFzcyB0aGF0IHJlc3RyaWN0cyB0cmFuc2xhdGlvbiB0byBqdXN0IHRoYXQKLQljbGFzcyAoZ2VuZXJhbCByZWdpc3RlciwgY29uZGl0aW9uIGNvZGUsIGV0YykuCi0KLVRodSBGZWIgIDYgMTc6MzQ6MDkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IEFkZCBSRUdfMF9FLCBSRUdfMjJfRSwKLQlhbmQgUkVHX0RFU1RfRSBmb3IgcmVnaXN0ZXIgb3BlcmFuZHMgdGhhdCBoYXZlIHRvIGJlCi0JYW4gZXZlbiBudW1iZXJlZCByZWdpc3Rlci4gIEFkZCBSRUdfRlBBIGZvciBvcGVyYW5kcyB0aGF0Ci0JYXJlIG9uZSBvZiB0aGUgZmxvYXRpbmcgcG9pbnQgYWNjdW11bGF0b3IgcmVnaXN0ZXJzLgotCUFkZCBUSUM4MF9PUEVSQU5EX01BU0sgdG8gZmxhZ3MgZm9yIEVORE1BU0sgb3BlcmFuZC4KLQkodGljODBfb3Bjb2Rlcyk6IENoYW5nZSBlbnRyaWVzIHRoYXQgbmVlZCBldmVuIG51bWJlcmVkCi0JcmVnaXN0ZXIgb3BlcmFuZHMgdG8gdXNlIHRoZSBuZXcgb3BlcmFuZCB0YWJsZSBlbnRyaWVzLgotCUFkZCAib3IiIGVudHJpZXMgdGhhdCBhcmUgaWRlbnRpY2FsIHRvICJvci50dCIgZW50cmllcy4KLQotV2VkIEZlYiAgNSAxMToxMjo0NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMxNi1vcGMuYzogQWRkIG5ldyBjYXNlcyBvZiBleGl0IGluc3RydWN0aW9uIGZvcgotCWRpc2Fzc2VtYmxlci4KLQkqIG1pcHMtZGlzLmMgKHByaW50X21pcHMxNl9pbnNuX2FyZyk6IERpc3BsYXkgZmxvYXRpbmcgcG9pbnQKLQlyZWdpc3RlcnMgaW4gb3BlcmFuZHMgb2YgZXhpdCBpbnN0cnVjdGlvbi4gIFByaW50IGAkJyBiZWZvcmUKLQlyZWdpc3RlciBuYW1lcyBpbiBvcGVyYW5kcyBvZiBlbnRyeSBhbmQgZXhpdCBpbnN0cnVjdGlvbnMuCi0KLVRodSBKYW4gMzAgMTQ6MDk6MDMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBUYWJsZSBvZiBuYW1lL3ZhbHVlCi0JcGFpcnMgZm9yIGFsbCBwcmVkZWZpbmVkIHN5bWJvbHMgcmVjb2duaXplZCBieSB0aGUgYXNzZW1ibGVyLgotCUFsc28gdXNlZCBieSB0aGUgZGlzYXNzZW1ibGluZyByb3V0aW5lcy4KLQkodGljODBfc3ltYm9sX3RvX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCSh0aWM4MF92YWx1ZV90b19zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfb3BlcmFuZF9jb250cm9sX3JlZ2lzdGVyLAotIAlwcmludF9vcGVyYW5kX2NvbmRpdGlvbl9jb2RlLCBwcmludF9vcGVyYW5kX2JpdG51bSk6Ci0JUmVtb3ZlIHByaXZhdGUgdGFibGVzIGFuZCB1c2UgdGljODBfdmFsdWVfdG9fc3ltYm9sIGZ1bmN0aW9uLgotCi1UaHUgSmFuIDMwIDExOjMwOjQ1IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LWRpcy5jIChwcmludF9vcGVyYW5kKTogQ2hhbmdlIGFkZHJlc3MgcHJpbnRpbmcKLQl0byBjb3JyZWN0bHkgaGFuZGxlIFBDIHdyYXBwaW5nLiAgRml4ZXMgUFIxMTQ5MC4KLQotV2VkIEphbiAyOSAwOTozOToxNyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmMgKG1uMTAyMDBfb3BlcmFuZHMpOiBNYWtlIDggYW5kIDE2IGJpdCBwYy1yZWxhdGl2ZQotCWJyYW5jaGVzIHJlbGF4YWJsZS4KLQotVHVlIEphbiAyOCAxNTo1NzozNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fbWlwczE2KTogU2V0IGluc25faW5mbyBpbmZvcm1hdGlvbi4KLQkocHJpbnRfbWlwczE2X2luc25fYXJnKTogTGlrZXdpc2UuCi0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fbWlwczE2KTogQmV0dGVyIGhhbmRsaW5nIG9mIGFuIGV4dGVuZAotIAlvcGNvZGUgZm9sbG93ZWQgYnkgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggY2FuIG5vdCBiZSBleHRlbmRlZC4KLQotRnJpIEphbiAyNCAxMjowODoyMSAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQ2hhbmdlZCBvcGVyYW5kIHNwZWNpZmllciBmb3IgdGhlCi0gCWNvbGRmaXJlIG1vdmViIGluc3RydWN0aW9uIHRvIG5vdCBhbGxvdyBhbiBhZGRyZXNzIHJlZ2lzdGVyIGFzCi0gCWRlc3RpbmF0aW9uLiAgQWx0aG91Z2ggdGhlIGRvY3VtZW50YXRpb24gZG9lcyBub3QgaW5kaWNhdGUgdGhhdAotCXRoaXMgaXMgaW52YWxpZCwgZXhwZXJpbWVudHMgdW5jb3ZlcmVkIHVuZXhwZWN0ZWQgYmVoYXZpb3IuCi0JQWRkZWQgYSBjb21tZW50IGV4cGxhaW5pbmcgdGhlIHNpdHVhdGlvbi4gIFRoYW5rcyB0byBBbmRyZWFzCi0JU2Nod2FiIGZvciBwb2ludGluZyB0aGlzIG91dCB0byBtZS4KLQotV2VkIEphbiAyMiAyMDoxMzo1MSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX29wY29kZXMpOiBFeHBhbmQgY29tbWVudCB0byBub3RlIHRoYXQgdGhlCi0gCWVudHJpZXMgYXJlIHByZXNvcnRlZCBzbyB0aGF0IGVudHJpZXMgd2l0aCB0aGUgc2FtZSBtbmVtb25pYyBhcmUKLQlhZGphY2VudCB0byBlYWNoIG90aGVyIGluIHRoZSB0YWJsZS4gIFNvcnQgdGhlIGVudHJpZXMgZm9yIGVhY2gKLQlpbnN0cnVjdGlvbiBzbyB0aGF0IHRoaXMgaXMgdHJ1ZS4KLQotTW9uIEphbiAyMCAxMjo0ODo1NyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1kaXMuYzogSW5jbHVkZSA8bGliaWJlcnR5Lmg+LgotCShwcmludF9pbnNuX202OGspOiBTb3J0IHRoZSBvcGNvZGUgdGFibGUgb24gdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLQluaWJibGUgb2YgdGhlIG9wY29kZS4KLQotU2F0IEphbiAxOCAxNToxNTowNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKHRpYzgwX29wY29kZXMpOiBBZGQgIndyY3IiLCAidm1weSIsICJ2cm5kIiwKLQkidnN1YiIsICJ2c3QiLCAieG5vciIsIGFuZCAieG9yIiBpbnN0cnVjdGlvbnMuCi0JKFZfYTEpOiBSZW5hbWVkIGZyb20gVl9hLCBtc2Igb2YgYWNjdW11bGF0b3IgcmVnIG51bWJlci4KLQkoVl9hMCk6IEFkZCBtYWNybywgbHNiIG9mIGFjY3VtdWxhdG9yIHJlZyBudW1iZXIuCi0KLUZyaSBKYW4gMTcgMTg6MjQ6MzEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogQnJva2UgZXhjZXNzaXZlbHkgbG9uZwotCWZ1bmN0aW9uIHVwIGludG8gc2V2ZXJhbCBzbWFsbGVyIG9uZXMgYW5kIGFycmFuZ2VkIGZvcgotCXRoZSBpbnN0cnVjdGlvbiBwcmludGluZyBmdW5jdGlvbiB0byBiZSBjYWxsYWJsZSByZWN1cnNpdmVseQotCXRvIHByaW50IHZlY3RvciBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIGJvdGggYSBsb2FkIGFuZCBhCi0JbWF0aCBpbnN0cnVjdGlvbiBwYWNrZWQgaW50byBhIHNpbmdsZSBvcGNvZGUuCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3Bjb2Rlcyk6IEV4cGFuZCBjb21tZW50IGZvciB2bGQgb3Bjb2RlCi0JdG8gZXhwbGFpbiB3aHkgaXQgY29tZXMgYWZ0ZXIgdGhlIG90aGVyIHZlY3RvciBvcGNvZGVzLgotCi1GcmkgSmFuIDE3IDE2OjE5OjE1IDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BiZWF1dHkuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogYWRkIGIsIHcsIG9yIGwgc3BlY2lmaWVyIHRvIGNvbGRmaXJlCi0JbW92ZSBpbnNucyB0byBoYW5kbGUgaW1tZWRpYXRlIG9wZXJhbmRzLgotCi1UaHUgSmFuIDE3IDE2OjE5OjAwIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBEZWxldGUgZHVwbGljYXRlIGVudHJ5IGZvciAiY21waWwiLgotCWZpeCBvcGVyYW5kIG1hc2sgaW4gdGhlICJtb3ZlbWwiIGVudHJpZXMgZm9yIHRoZSBjb2xkZmlyZS4KLQotVGh1IEphbiAxNiAyMDo1NDo0MCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKFZfYSwgVl9tLCBWX1MsIFZfWiwgVl9wLCBPUF9WLCBNQVNLX1YpOgotCU5ldyBtYWNyb3MgZm9yIGJ1aWxkaW5nIHZlY3RvciBpbnN0cnVjdGlvbiBvcGNvZGVzLgotCSh0aWM4MF9vcGNvZGVzKTogUmVtb3ZlIGFsbCB1c2VzIG9mIEZNVF9TSSwgRk1UX1JFRywgYW5kCi0JRk1UX0xJLCB3aGljaCB3ZXJlIHVudXNlZC4gIFRoZSBmaWVsZCBpcyBub3cgYSBmbGFncyBmaWVsZC4KLQlSZW1vdmUgc29tZSBvcGNvZGVzIHRoYXQgYXJlIHBvc3NpYmxlLCBidXQgaWxsZWdhbCwgc3VjaAotCWFzIGxvbmcgaW1tZWRpYXRlIGluc3RydWN0aW9ucyB3aXRoIGRvdWJsZXMgZm9yIGltbWVkaWF0ZQotCXZhbHVlcy4gIEFkZCAidmFkZCIgYW5kICJ2bGQiIGluc3RydWN0aW9ucy4KLQotV2VkIEphbiAxNSAxODo1OTo1MSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX29wZXJhbmRzKTogUmVvcmRlciBzb21lIHRhYmxlIGVudHJpZXMgdG8gbWFrZQotCXRoZSBvcmRlciBtb3JlIGxvZ2ljYWwuICBNb3ZlIHRoZSBzaGlmdCBhbGlhcyBpbnN0cnVjdGlvbnMgKCJyb3RsIiwKLQkic2hsIiwgImlucyIsICJyb3RyIiwgImV4dHUiLCAiZXh0cyIsICJzcmwiLCBhbmQgInNyYSIgdG8gYmUKLSAJaW50ZXJzcGVyc2VkIHdpdGggdGhlIHJlZ3VsYXIgc3IueCBhbmQgc2wueCBpbnN0cnVjdGlvbnMuICBBZGQKLQlhbmQgdGVzdCBuZXcgaW5zdHJ1Y3Rpb24gb3Bjb2RlcyBmb3IgInNsIiwgInNsaSIsICJzciIsICJzcmkiLCAic3QiLAotIAkic3ViIiwgInN1YnUiLCAic3djciIsIGFuZCAidHJhcCIuCi0KLVR1ZSBKYW4gMTQgMTk6NDI6NTAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jIChPRkZfU1NfUEMpOiBSZW5hbWVkIGZyb20gT0ZGX1NTLgotCShPRkZfU0xfUEMpOiBSZW5hbWVkIGZyb20gT0ZGX1NMLgotCShPRkZfU1NfQlIpOiBOZXcgb3BlcmFuZCB0eXBlIGZvciBiYXNlIHJlbGF0aXZlIG9wZXJhbmQuCi0JKE9GRl9TTF9CUik6IE5ldyBvcGVyYW5kIHR5cGUgZm9yIGJhc2UgcmVsYXRpdmUgb3BlcmFuZC4KLQkoUkVHX0JBU0UpOiBOZXcgb3BlcmFuZCB0eXBlIGZvciBiYXNlIHJlZ2lzdGVyIG9wZXJhbmQuCi0JKHRpYzgwX29wY29kZXMpOiBBZGQgYW5kIHRlc3QgImZtcHkiLCAiZnJuZG0iLCAiZnJuZG4iLCAiZnJuZHAiLAotCSJmcm5keiIsICJmc3FydCIsICJmc3ViIiwgImlsbG9wMCIsICJpbGxvcEYiLCAiaW5zIiwgImpzciIsCi0JImxkIiwgImxkLnUiLCAibG1vIiwgIm9yIiwgInJkY3IiLCAicm1vIiwgInJvdGwiLCBhbmQgInJvdHIiCi0JaW5zdHJ1Y3Rpb25zLgotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBQcmludCBvcGNvZGUgbmFtZSB3aXRoIGZpeGVkIHdpZHRoCi0gCTEwIGNoYXIgZmllbGQsIHBhZGRlZCB3aXRoIHNwYWNlcyBvbiByaHMsIHJhdGhlciB0aGFuIGEgc3RyaW5nCi0gCWZvbGxvd2VkIGJ5IGEgdGFiLiAgVXNlIHJlbmFtZWQgVElDODBfT1BFUkFORF9QQ1JFTCBmbGFnIGJpdCByYXRoZXIKLSAJdGhhbiBvbGQgVElDODBfT1BFUkFORF9SRUxBVElWRS4gIEFkZCBzdXBwb3J0IGZvciBuZXcKLQlUSUM4MF9PUEVSQU5EX0JBU0VSRUwgZmxhZyBiaXQuCi0KLU1vbiBKYW4gMTMgMTU6NTg6NTYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogUHJpbnQgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZHMKLQlhcyBmbG9hdHMuCi0JKiB0aWM4MC1vcGMuYyAoU1BGSSk6IEFkZCBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50Ci0JaW1tZWRpYXRlIG9wZXJhbmQgdHlwZS4KLQkoUk9UQVRFKTogQWRkIHJvdGF0ZSBvcGVyYW5kIHR5cGUgZm9yIHNoaWZ0cy4KLQkoRU5ETUFTSyk6IEFkZCBmb3Igc2hpZnRzLgotCShuKTogTWFjcm8gZm9yIHRoZSAnbicgYml0LgotCShpKTogTWFjcm8gZm9yIHRoZSAnaScgYml0LgotCShQRCk6IE1hY3JvIGZvciB0aGUgJ1BEJyBmaWVsZC4KLQkoUDIpOiBNYWNybyBmb3IgdGhlICdQMicgZmllbGQuCi0JKFAxKTogTWFjcm8gZm9yIHRoZSAnUDEnIGZpZWxkLgotCSh0aWM4MF9vcGNvZGVzKTogQWRkIGVudHJpZXMgZm9yICJleHRzIiwgImV4dHUiLCAiZmFkZCIsCi0JImZjbXAiLCBhbmQgImZkaXYiLgotCi1Nb24gSmFuICA2IDE1OjA2OjU1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBNYXNrIG9mZiB1bndhbnRlZCBiaXRzIGFmdGVyCi0JYWRkaW5nIGluIGN1cnJlbnQgYWRkcmVzcyBmb3IgcGMtcmVsYXRpdmUgb3BlcmFuZHMuCi0KLU1vbiBKYW4gIDYgMTA6NTY6MjUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jIChSX1NDQUxFRCk6IEFkZCBtYWNybyB0byB0ZXN0IGZvciAiOnMiIG1vZGlmaWVyIGJpdC4KLQkocHJpbnRfaW5zbl90aWM4MCk6IElmIFJfU0NBTEVEIHRoZW4gcHJpbnQgIjpzIiBtb2RpZmllciBmb3Igb3BlcmFuZC4KLQkqIHRpYzgwLW9wYy5jIChSRUcwLCBSRUcyMiwgUkVHMjcsIFNTT0ZGLCBMU09GRik6IE5hbWVzCi0JY2hhbmdlZCB0byBSRUdfMCwgUkVHXzIyLCBSRUdfREVTVCwgT0ZGX1NTLCBPRkZfU0wgcmVzcGVjdGl2ZWx5LgotCShTSUNSLCBMSUNSLCBSRUdNX1NJLCBSRUdNX0xJKTogTmFtZXMgY2hhbmdlZCB0byBDUl9TSSwgQ1JfTEksCi0JUkVHX0JBU0VfTV9TSSwgUkVHX0JBU0VfTV9MSSByZXNwZWN0aXZlbHkuCi0JKFJFR19TQ0FMRUQsIExTSV9TQ0FMRUQpOiBOZXcgb3BlcmFuZCB0eXBlcy4KLQkoRSk6IE5ldyBtYWNybyBmb3IgJ0UnIGJpdCBhdCBiaXQgMjcuCi0JKHRpYzgwX29wY29kZXMpOiBBZGQgYW5kIHRlc3QgZGxkLCBkbGQudSwgZHN0LCBlc3RvcCwgYW5kIGV0cmFwCi0Jb3Bjb2RlcywgaW5jbHVkaW5nIHRoZSB2YXJpb3VzIHNpemUgZmxhdm9ycyAoYixoLHcsZCkgZm9yCi0JdGhlIGRpcmVjdCBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMuCi0KLVN1biBKYW4gIDUgMTI6MTg6MTQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jIChNX1NJLCBNX0xJKTogQWRkIG1hY3JvcyB0byB0ZXN0IGZvciAiOm0iIG1vZGlmaWVyIGJpdAotIAlpbiBhbiBpbnN0cnVjdGlvbi4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogQ2hhbmdlIGNvbW1hIGFuZCBwYXJlbiBoYW5kbGluZy4KLSAgCVVzZSBNX1NJIGFuZCBNX0xJIG1hY3JvcyB0byBjaGVjayBmb3IgIjptIiBtb2RpZmllciBmb3IgR1BSIG9wZXJhbmRzLgotCSogdGljODAtb3BjLmMgKHRpYzgwX29wZXJhbmRzKTogQWRkIFJFR01fU0kgYW5kIFJFR01fTEkgb3BlcmFuZHMuCi0JKEYsIE1fUkVHLCBNX0xJLCBNX1NJLCBTWl9SRUcsIFNaX0xJLCBTWl9TSSwgRCwgUyk6IE5ldwliaXQtdHdpZGRsZXJzLgotCShNQVNLX0xJX00sIE1BU0tfU0lfTSwgTUFTS19SRUdfTSk6IFJlbW92ZSBhbmQgcmVwbGFjZSBpbiBvcGNvZGUKLQltYXNrcyB3aXRoICJNQVNLXyogJiB+TV8qIiB0byBnZXQgdGhlIE0gYml0IHJlc2V0LgotCSh0aWM4MF9vcGNvZGVzKTogQWRkIGJzciwgYnNyLmEsIGNtbmQsIGNtcCwgZGNhY2hlYywgYW5kIGRjYWNoZWYuCi0KLVNhdCBKYW4gIDQgMTk6MDU6MDUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogUHJpbnQgVElDODBfT1BFUkFORF9SRUxBVElWRQotCWNvcnJlY3RseS4gIEFkZCBzdXBwb3J0IGZvciBwcmludGluZyBUSUM4MF9PUEVSQU5EX0JJVE5VTSBhbmQKLQlUSUM4MF9PUEVSQU5EX0NDLCBhbmQgVElDODBfT1BFUkFORF9DUiBvcGVyYW5kcyBpbiBzeW1ib2xpYwotCWZvcm0uCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBBZGQgU1NPRkYsIExTT0ZGLCBCSVROVU0sCi0JQ0MsIFNJQ1IsIGFuZCBMSUNSIHRhYmxlIGVudHJpZXMuCi0JKHRpYzgwX29wY29kZXMpOiBBZGQgYW5kIHRlc3QgIm5vcCIsICJiciIsICJiYm8iLCAiYmJ6IiwKLQkiYmNuZCIsIGFuZCAiYnJjciIgb3Bjb2Rlcy4KLQotRnJpIEphbiAgMyAxODozMjoxMSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogTWFrZSBjb21tZW50IG1hdGNoIHRoZQotCWFjdHVhbCBmaWVsZHMgKG5vIHNoaWZ0IGZpZWxkKS4KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRG9jdW1lbnQgd2h5IHRoaXMgY2Fubm90IGJlICJjb25zdCIuCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IFJlcGxhY2UgYWJvcnQgc3R1YiB3aXRoIGEKLQlwYXJ0aWFsIGltcGxlbWVudGF0aW9uLCB3b3JrIGluIHByb2dyZXNzLgotCSogdGljODAtb3BjLmMgKHRpYzgwX29wZXJhbmRzKTogQmVnaW4gY29uc3RydWN0aW9uIG9wZXJhbmRzIHRhYmxlLgotCSh0aWM4MF9vcGNvZGVzKTogQ29udGludWUgcG9wdWxhdGluZyBvcGNvZGVzIHRhYmxlIGFuZCBzdGFydAotCWZpbGxpbmcgaW4gdGhlIG9wZXJhbmQgaW5kaWNlcy4KLQkodGljODBfbnVtX29wY29kZXMpOiBBZGQgdGhpcy4KLQotRnJpIEphbiAgMyAxMjoxMzo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IEFkZCAjQiBjYXNlIGZvciBtb3ZlcS4KLQotVGh1IEphbiAgMiAxMjoxNDoyOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogTWFrZSBzdXJlIGFsbCB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkCi0JYmVmb3JlIHRoZXkgYXJlIHVzZWQuCi0KLVR1ZSBEZWMgMzEgMTI6MjA6MzggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBQdXQgY3VybHktYnJhY2VzIGFyb3VuZCBvcGVyYW5kcwotCWZvciAiYnJlYWtwb2ludCIgaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBEZWMgMzEgMTU6Mzg6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IEFkZCAtRF9HTlVfU09VUkNFLgotCShkZXApOiBVc2UgQUxMX0NGTEFHUyByYXRoZXIgdGhhbiBDRkxBR1MuCi0KLVR1ZSBEZWMgMzEgMTU6MDk6MTYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jIChEOF97Niw3fSk6IFNldCBWODUwX09QRVJBTkRfQURKVVNUX1NIT1JUX01FTU9SWQotCWZsYWcuCi0KLU1vbiBEZWMgMzAgMTc6MDI6MTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtNjhrLW9wYy5vLCBhbHBoYS1vcGMubyk6IFJlbW92ZSBkaXMtYXNtLmggZGVwZW5kZW5jeS4KLQkodGljODAtZGlzLm8sIHRpYzgwLW9wYy5vKTogQWRkIHJ1bGVzIHBlciBjb21tZW50IGluIE1ha2VmaWxlLmluLgotCi1Nb24gRGVjIDMwIDExOjM4OjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwczE2LW9wYy5jOiBBZGQgImFicyIuCi0KLVN1biBEZWMgMjkgMTA6NTg6MjIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgdGljODAtZGlzLm8gYW5kIHRpYzgwLW9wYy5vLgotCSogZGlzYXNzZW1ibGUuYyAoQVJDSF90aWM4MCk6IERlZmluZSBpZiBBUkNIX2FsbCBpcyBkZWZpbmVkLgotCShkaXNhc3NlbWJsZXIpOiBBZGQgYmZkX2FyY2hfdGljODAgc3VwcG9ydCB0byBzZXQgZGlzYXNzZW1ibGUKLSAJdG8gcHJpbnRfaW5zbl90aWM4MC4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogQWRkIHN0dWIuCi0KLUZyaSBEZWMgMjcgMjI6MzA6NTcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYXJjaCBpbiAkc2VsYXJjaHMpOiBBZGQgYmZkX3RpYzgwX2FyY2ggZW50cnkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KLQkqIHRpYzgwLWRpcy5jOiBBZGQgZmlsZS4KLQkqIHRpYzgwLW9wYy5jOiBBZGQgZmlsZS4KLQotRnJpIERlYyAyMCAxNDozMDoxOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogIEFkZCBjclswLTE1XSwgZHBjLCBkcHN3LCBsaW5rLgotCi1Nb24gRGVjIDE2IDEzOjAwOjE1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGVyYW5kcyk6IEFkZCBTSU1NMTZOLgotCShtbjEwMjAwX29wY29kZXMpOiBVc2UgaXQgZm9yIHNvbWUgbG9naWNhbHMgYW5kIGJ0c3QgaW5zbnMuCi0JQWRkICJicmVhayIgYW5kICJ0cmFwIiBpbnN0cnVjdGlvbnMuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEFkZCAiYnJlYWsiIGluc3RydWN0aW9uLgotCi0JKiBtbjEwMjAwLW9wYy5jOiBBZGQgcHNldWRvLW9wcyBmb3IgIm1vdiAoYW4pLGFtIiBhbmQgIm1vdiBhbiwoYW0pIi4KLQotU2F0IERlYyAxNCAyMjozNjoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X21pcHMxNl9pbnNuX2FyZyk6IFRoZSBiYXNlIGFkZHJlc3Mgb2YgYSBQQwotCXJlbGF0aXZlIGxvYWQgb3IgYWRkIG5vdyBkZXBlbmRzIHVwb24gd2hldGhlciB0aGUgaW5zdHJ1Y3Rpb24gaXMKLQlpbiBhIGRlbGF5IHNsb3QuCi0KLVdlZCBEZWMgMTEgMDk6MjM6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLWRpcy5jOiBGaW5pc2ggd3JpdGluZyBkaXNhc3NlbWJsZXIuCi0JKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wY29kZXMpOiBGaXggbWFzayBmb3IgIm1vdiBpbW04LGRuIi4KLQlGaXggbWFzayBmb3IgImptcCAoYW4pIi4KLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUsIHByaW50X2luc25fbW4xMDMwMCk6IENvcnJlbnRseQotCWhhbmRsZSBlbmRpYW5uZXNzIGlzc3VlcyBmb3IgbW4xMDMwMC4KLQotCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGNvZGVzKTogRml4IG9wZXJhbmRzIGZvciAibW92YiBkbSwoYW4pIi4KLQotVHVlIERlYyAxMCAxMjowODowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmMgKG1uMTAyMDBfb3Bjb2Rlcyk6ICJtb3YgaW1tOCxkMCIgaXMgYSBmb3JtYXQgMgotCWluc3RydWN0aW9uLiAgRml4IG9wY29kZSBmaWVsZCBmb3IgIm1vdmIgKGltbTI0KSxkbiIuCi0KLQkqIG1uMTAyMDAtb3BjLmMgKG1uMTAyMDBfb3BlcmFuZHMpOiBGaXggaW5zZXJ0aW9uIHBvc2l0aW9uCi0JZm9yIERJIG9wZXJhbmQuCi0KLU1vbiBEZWMgIDkgMTY6NDI6NDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jOiBDcmVhdGUgbW4xMDIwMCBvcGNvZGUgdGFibGUuCi0JKiBtbjEwMjAwLWRpcy5jOiBGbGVzaCBvdXQgbW4xMDIwMCBkaXNhc3NlbWJsZXIuICBOb3QgcmVhZHksCi0JYnV0IG1vdmluZyBhbG9uZyBuaWNlbHkuCi0KLVN1biBEZWMgIDggMDQ6Mjg6MzEgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogIEFkZCBtaXBzMTYtb3BjLm8uCi0KLUZyaSBEZWMgIDYgMTY6NDc6NDAgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJoaW5vLmN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IFJldmVydCBjaGFuZ2UgdG8gdXNlIDwgYW5kID4KLQlzcGVjaWZpZXJzIGZvciBmbW92ZW0qIGluc3RydWN0aW9ucy4KLQotRnJpIERlYyAgNiAxNDo0ODowOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogUmVtb3ZlICckJyByZWdpc3RlciBwcmVmaXhpbmcuCi0KLUZyaSBEZWMgIDYgMTc6MzQ6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzMTYtb3BjLmM6IENoYW5nZSBvcGNvZGUgZm9yIGVudHJ5L2V4aXQgdG8gYXZvaWQgY29uZmxpY3RpbmcKLQl3aXRoIGRzcmwuCi0KLUZyaSBEZWMgIDYgMTQ6NDg6MDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jOiBBZGQgc29tZSBjb21tZW50cyBleHBsYWluaW5nIHRoZSB2YXJpb3VzCi0gCW9wZXJhbmRzIGFuZCBzdWNoLgotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEZpeCBtaW5vciBnY2MgLVdhbGwgd2FybmluZ3MuCi0KLVRodSBEZWMgIDUgMTI6MDk6NDggMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSBuZXcgPCBhbmQgPiBvcGVyYW5kCi0Jc3BlY2lmaWVycy4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogU2ltcGxpZnkgdGFibGUgYnkgdXNpbmcgPCBhbmQgPgotCW9wZXJhbmQgc3BlY2lmaWVycyBpbiBmbW92bSogaW5zdHJ1Y3Rpb25zLgotCi1XZWQgRGVjICA0IDE0OjUyOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChpbnNlcnRfbGkpOiBHaXZlIGFuIGVycm9yIGlmIHRoZSBvZmZzZXQgaGFzIHRoZSB0d28KLQlsZWFzdCBzaWduaWZpY2FudCBiaXRzIHNldC4KLQotV2VkIE5vdiAyNyAxMzowOTowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fbWlwczE2KTogU2VwYXJhdGUgdGhlIGluc3RydWN0aW9uIGZyb20KLQl0aGUgYXJndW1lbnRzIHdpdGggYSB0YWIsIG5vdCBhIHNwYWNlLgotCi1UdWUgTm92IDI2IDEzOjI0OjE3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNlbWJsZSk6IEZpbmlzaCBjb252ZXJzaW9uIHRvICckJyBhcwotCXJlZ2lzdGVyIHByZWZpeC4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRml4IG1hc2sgZmllbGQgZm9yCi0JbW92IGFtLChpbW0zMixzcCkuCi0KLVR1ZSBOb3YgMjYgMTA6NTM6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgotCi0JQWRkIHN1cHBvcnQgZm9yIG1pcHMxNiAoMTYgYml0IE1JUFMgaW1wbGVtZW50YXRpb24pOgotCSogbWlwczE2LW9wYy5jOiBOZXcgZmlsZS4KLQkqIG1pcHMtZGlzLmM6IEluY2x1ZGUgImVsZi1iZmQuaCIgYW5kICJlbGYvbWlwcy5oIi4KLQkobWlwczE2X3JlZ19uYW1lcyk6IE5ldyBzdGF0aWMgYXJyYXkuCi0JKHByaW50X2luc25fYmlnX21pcHMpOiBVc2UgcHJpbnRfaW5zbl9taXBzMTYgaW4gMTYgYml0IG1vZGUgb3IKLQlhZnRlciBzZWVpbmcgYSAxNiBiaXQgc3ltYm9sLgotCShwcmludF9pbnNuX2xpdHRsZV9taXBzKTogTGlrZXdpc2UuCi0JKHByaW50X2luc25fbWlwczE2KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHJpbnRfbWlwczE2X2luc25fYXJnKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIG1pcHMtb3BjLmM6IEFkZCBqYWx4IGluc3RydWN0aW9uLgotCSogTWFrZWZpbGUuaW4gKG1pcHMxNi1vcGMubyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IFVzZSBtaXBzMTYtb3BjLm8gZm9yIGJmZF9taXBzX2FyY2guCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBOb3YgMjUgMTY6MTU6MTcgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IFNpbXBsaWZ5IHRhYmxlIGJ5IHVzaW5nIDwgYW5kID4KLSAJb3BlcmFuZCBzcGVjaWZpZXJzIGluICpzYXZlLCAqcmVzdG9yZSBhbmQgbW92ZW0qIGluc3RydWN0aW9ucy4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogRml4IG1vdmUgYW5kIG1vdmVtIGluc3RydWN0aW9ucyBmb3IKLSAJdGhlIGNvbGRmaXJlLgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBUaGUgY29sZGZpcmUgKG1jZjUyMDApIGNhbiBvbmx5IHVzZQotIAlyZWdpc3RlciBvcGVyYW5kcyBmb3IgaW1tZWRpYXRlIGFyaXRobWV0aWMsIG5vdCwgbmVnLCBuZWd4LCBhbmQKLQlzZXQgYWNjb3JkaW5nIHRvIGNvbmRpdGlvbiBpbnN0cnVjdGlvbnMuCi0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IENvbnNpc3RhbnRseSBVc2UgInMiIGFzIHRoZSBzdG9yYWdlCi0gCXNwZWNpZmllciBvZiB0aGUgZWZmZWN0aXZlLWFkZHJlc3Mgb3BlcmFuZCBpbiBpbW1lZGlhdGUgZm9ybXMgb2YKLSAJYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMuICBUaGUgc3BlY2lmaWVyIGZvciB0aGUgaW1tZWRpYXRlIG9wZXJhbmQKLSAJbm90ZXMgaG93IGFuZCB3aGVyZSB0aGUgY29uc3RhbnQgd2lsbCBiZSBzdG9yZWQuCi0KLU1vbiBOb3YgMjUgMTE6MTc6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBSZW1vdmUgcmVkdW5kYW50ICJsY2MiCi0Jb3Bjb2RlLgotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFVzZSAnJCcgaW5zdGVhZCBvZiAnJScgZm9yCi0JcmVnaXN0ZXIgcHJlZml4LgotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFByZWZpeCByZWdpc3RlcnMgd2l0aCAnJScuCi0KLVdlZCBOb3YgMjAgMTA6Mzc6MTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEhhbmRsZSByZWdpc3RlciBsaXN0cy4KLQotCSogbW4xMDMwMC1vcGMuYzogRml4IGhhbmRsaW5nIG9mIHJlZ2lzdGVyIGxpc3Qgb3BlcmFuZCBmb3IKLQkiY2FsbCIsICJyZXQiLCBhbmQgInJldHMiIGluc3RydWN0aW9ucy4KLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBQcmludCBQQy1yZWxhdGl2ZSBhbmQgbWVtb3J5Ci0JYWRkcmVzc2VzIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4KLQkqIG1uMTAzMDAtb3BjLmM6IERpc3Rpbmd1aXNoIGJldHdlZW4gYWJzb2x1dGUgbWVtb3J5IGFkZHJlc3NlcywKLQlwYy1yZWxhdGl2ZSBvZmZzZXRzICYgcmFuZG9tIGltbWVkaWF0ZXMuCi0KLQkqIG1uMTAzMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDMwMCk6IEZpeCBmZXRjaCBvZiBsYXN0IGJ5dGUKLQlpbiA3IGJ5dGUgaW5zbnMuCi0JKGRpc2Fzc2VtYmxlKTogSGFuZGxlIFNQTElUIGFuZCBFWFRFTkRFRCBvcGVyYW5kcy4KLQotVHVlIE5vdiAxOSAxMzozMzowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtZGlzLmM6IFJvdWdoIGN1dCBhdCBwcmludGluZyBzb21lIG9wZXJhbmRzLgotCi0JKiBtbjEwMzAwLWRpcy5jOiBTdGFydCB3b3JraW5nIG9uIGRpc2Fzc2VtYmxlciBzdXBwb3J0LgotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRml4IG1hc2tzIG9uIHNldmVyYWwgaW5zbnMuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBBZGQgIlJFR1MiIGZvciBhIHJlZ2lzdGVyCi0JbGlzdC4KLQkobW4xMDMwMF9vcGNvZGVzKTogVXNlIFJFR1MgZm9yIHJlZ2lzdGVyIGxpc3QgaW4gIm1vdm0iIGluc3RydWN0aW9ucy4KLQotTW9uIE5vdiAxOCAxNToyMDozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3Bjb2Rlcyk6IEFkZDMgc2V0cyB0aGUgY2FycnkuCi0KLUZyaSBOb3YgMTUgMTM6NDM6MTkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBEZW1hbmQgcGFyZW5zIGFyb3VuZAotCXJlZ2lzdGVyIGFyZ3VtZW50IGlzIGNhbGxzIGFuZCBqbXAgaW5zdHJ1Y3Rpb25zLgotCi1UaHUgTm92ICA3IDAwOjI2OjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogVXNlIEROMDEgZm9yIHB1dHggYW5kCi0JZ2V0eCBvcGVyYW5kLiAgRml4IG9wY29kZSBmb3IgbXVscXUgaW1tLGRuLgotCi1XZWQgTm92ICA2IDEzOjQyOjMyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEhpamFjayAiYml0cyIgZmllbGQKLQlpbiBNTjEwMzAwX09QRVJBTkRfU1BMSVQgb3BlcmFuZHMgZm9yIGhvdyBtYW55IGJpdHMKLQlhcHBlYXIgaW4gdGhlIGJhc2ljIGluc24gd29yZC4gIEFkZCBJTU0zMl9ISUdIMjQsCi0JSU1NMzJfSElHSDI0X0xPV1NISUZUOCwgSU1NOEVfU0hJRlQ4LgotCShtbjEwMzAwX29wY29kZXMpOiBVc2UgbmV3IG9wZXJhbmRzIGFzIG5lZWRlZC4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEFkZCBJTU0zMl9MT1dTSElGVDgKLQlmb3IgYnNldCwgYmNsciwgYnRzdCBpbnN0cnVjdGlvbnMuCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IFVzZSBuZXcgSU1NMzJfTE9XU0hJRlQ4IGFzIG5lZWRlZC4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IFJlbW92ZSBtYW55IHJlZHVuZGFudAotCW9wZXJhbmRzLiAgVXBkYXRlIG9wY29kZSB0YWJsZSBhcyBhcHByb3ByaWF0ZS4KLQkoSU1NMzIpOiBBZGQgTU4xMDMwMF9PUEVSQU5EX1NQTElUIGZsYWcuCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCBzaW5nbGUgYml0IGVycm9yIGluIG1vdiBpbW0zMixkbiBpbnNuLgotCi1UdWUgTm92ICA1IDEzOjI2OjU4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEFkZCBETjIsIERNMiwgQU4yLCBBTTIKLQlvcGVyYW5kcyAoZm9yIGluZGV4ZWQgbG9hZC9zdG9yZXMpLiAgRml4IGJpdHBvcyBmb3IgREkKLQlvcGVyYW5kLiAgQWRkIFNOOE5fU0hJRlQ4LCBJTU04X1NISUZUOCwgYW5kIEQxNl9TSElGVCBmb3IgdGhlCi0JZmV3IGluc3RydWN0aW9ucyB0aGF0IGluc2VydCBpbW1lZGlhdGVzL2Rpc3BsYWNlbWVudHMgaW4gdGhlCi0JbWlkZGxlIG9mIHRoZSBpbnN0cnVjdGlvbi4gIEFkZCBJTU04RSBmb3IgOCBiaXQgaW1tZWRpYXRlIGluCi0JdGhlIGV4dGVuZGVkIHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24uCi0JKG1uMTAzMDBfb3BlcmFuZHMpOiBVc2UgbmV3IG9wY29kZXMgYXMgYXBwcm9wcmlhdGUuCi0KLVR1ZSBOb3YgIDUgMTA6MzA6NTEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3Bjb2Rlcyk6IERlY2xhcmUgdGhlIHRyYXAgaW5zdHJ1Y3Rpb24KLSAJc2VxdWVudGlhbCBzbyB0aGUgYXNzZW1ibGVyIG5ldmVyIHBhcmFsbGVsaXplcyBpdCB3aXRoCi0Jb3RoZXIgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gTm92ICA0IDEyOjUwOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEFkZCBETjAxIGFuZCBBTjAxIGZvcgotCWEgZGF0YS9hZGRyZXNzIHJlZ2lzdGVyIHRoYXQgYXBwZWFycyBpbiByZWdpc3RlciBmaWVsZCAwCi0JYW5kIHJlZ2lzdGVyIGZpZWxkIDEuCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IFVzZSBETjAxIGFuZCBBTjAxIGZvciBtb3YvY21wIGltbTgsRE4vQU4KLQotRnJpIE5vdiAgMSAxMDoyOToxMSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBVc2UgbmV3IE5PUEFMIG1hc2sgZm9yCi0Jc3RhbmRhcmQgZGlzYXNzZW1ibHkuCi0KLQkqIGFscGhhLW9wYy5jIChhbHBoYV9vcGVyYW5kcyk6IFJlYXJyYW5nZSBmbGFncyBzbG90LgotCShhbHBoYV9vcGNvZGVzKTogQWRkIG5ldyBCV1gsIENJWCwgYW5kIE1BWCBpbnN0cnVjdGlvbnMuCi0JUmVjYXRlZ29yaXplIFBBTGNvZGUgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgT2N0IDMwIDE2OjQ2OjU4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQWRkIHJlbGF4aW5nICJqYnIiLgotCi1UdWUgT2N0IDI5IDE2OjMwOjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IERvbid0IHByaW50IGEgdHJhaWxpbmcgdGFiIGlmCi0JdGhlcmUgYXJlIG5vIG9wZXJhbmQgdHlwZXMuCi0KLVR1ZSBPY3QgMjkgMTI6MjI6MjEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jIChEOV9SRUxBWCk6IFJlbmFtZWQgZnJvbSBEOSwgYWxsIHJlZmVyZW5jZXMKLQljaGFuZ2VkLgotCSh2ODUwX29wZXJhbmRzKTogTWFrZSBzdXJlIEQyMiBpbW1lZGlhdGVseSBmb2xsb3dzIEQ5X1JFTEFYLgotCi1GcmkgT2N0IDI1IDEyOjEyOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl94ODYpOiBTZXQgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgdG8gNS4KLQotVGh1IE9jdCAyNCAxNzo1Mzo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kOF82KTogRml4IG9wZXJhbmQgaW5zZXJ0aW9uIGZvciBzbGQudwotCWFuZCBzc3QudyBpbnN0cnVjdGlvbnMuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEFkZCAiakNDIiBpbnN0cnVjdGlvbnMgKGFsaWFzZXMgZm9yCi0JImJDQyJpbnN0cnVjdGlvbnMpLgotCi1UaHUgT2N0IDI0IDE3OjIxOjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IFVzZSBhIHRhYiBiZXR3ZWVuIHRoZSBpbnN0cnVjdGlvbgotCWFuZCB0aGUgYXJndW1lbnRzLgotCi1UdWUgT2N0IDIyIDIzOjMyOjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChQUENQV1IyKTogRGVmaW5lLgotCShwb3dlcnBjX29wY29kZXMpOiBVc2UgUFBDUFdSMiBmb3IgZnNxcnQsIHJhdGhlciB0aGFuIGR1cGxpY2F0aW5nCi0JaXQuCi0KLUZyaSBPY3QgMTEgMTY6MDM6NDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggdHlwbyBpbiBvcGNvZGUKLQlmaWVsZCBmb3IgbW92aHUgaW5zdHJ1Y3Rpb24uCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogRm9yIFY4NTBfT1BFUkFORF9TSUdORUQgb3BlcmFuZHMsCi0JY2FzdCB2YWx1ZSB0byAibG9uZyIgbm90ICJzaWduZWQgbG9uZyIgdG8ga2VlcCBocHV4MTAKLQljb21waWxlciBxdWlldC4KLQotVGh1IE9jdCAxMCAxMDoyNTo1OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCB0eXBvIGluIG9wY29kZSBmaWVsZAotCWZvciBtb3YgKGFiczE2KSxETi4KLQotCSogbW4xMDMwMC1vcGMuYyAoRk1UKik6IFJlbW92ZSBkZWZpbml0aW9ucy4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRml4IGRlc3RpbmF0aW9uIHJlZ2lzdGVyCi0JZm9yIHNoaWZ0LWJ5LXJlZ2lzdGVyIG9wY29kZXMuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBCcmVhayBETiwgRE0sIEFOLCBBTQotCWludG8gW0FEXVtNTl1bMDFdIGZvciBlbmNvZGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIHJlZ2lzdGVyCi0JaW4gdGhlIG9wY29kZS4KLQotV2VkIE9jdCAgOSAxMToxOToyNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEFkZCAiZXh0ZW5kZWQiIGluc3RydWN0aW9ucywKLQkicHV0eCIsICJnZXR4IiwgIm11bHEiLCAibXVscXUiLCAic2F0MTYiLCAic2F0MjQiLCAiYnNjaCIuCi0KLVR1ZSBPY3QgIDggMTE6NTU6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogUmVtb3ZlICJSRUdTIiBvcGVyYW5kLgotCUZpeCB2YXJpb3VzIHR5cG9zLiAgQWRkICJQQVJFTiIgb3BlcmFuZC4KLQkoTUVNLCBNRU0yKTogRGVmaW5lLgotCShtbjEwMzAwX29wY29kZXMpOiBTdXJyb3VuZCBhbGwgbWVtb3J5IGFkZHJlc3NlcyB3aXRoICJQQVJFTiIKLQlvcGVyYW5kcy4gIEZpeCBzZXZlcmFsIHR5cG9zLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggdHlwb3MgaW4geWVzdGVyZGF5J3MKLQljaGFuZ2VzLgotCi1Nb24gT2N0ICA3IDE2OjQ4OjQ1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAoRk1UX1hYKTogUmVudW1iZXIgc3RhcnRpbmcgYXQgb25lLgotCShtbjEwMzAwX29wZXJhbmRzKTogUm91Z2ggY3V0LiAgRW5vdWdoIHRvIHBhcnNlICJtb3YiIGluc3RydWN0aW9ucwotCWF0IHRoaXMgdGltZS4KLQkobW4xMDMwMF9vcGNvZGVzKTogQnJlYWsgb3Bjb2RlIGZvcm1hdCBvdXQgaW50byBpdHMgb3duIGZpZWxkLgotCVVwZGF0ZSBtYW55IG9wZXJhbmQgZmllbGRzIHRvIGRlYWwgd2l0aCBzaWduZWQgdnMgdW5zaWduZWQKLQlpc3N1ZXMuICBGaXggb25lIG9yIHR3byB0eXBvcyBpbiB0aGUgIm1vdiIgaW5zdHJ1Y3Rpb24KLQlvcGNvZGUsIG1hc2sgYW5kL29yIG9wZXJhbmQgZmllbGRzLgotCi1Nb24gT2N0ICA3IDExOjM5OjQ5IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLW9wYy5jIChwbHVzaGEpOiBQcmVmZXIgZW5jb2RpbmcgZm9yIG02ODA0MHVwLCBpbiBjYXNlCi0JbTY4ODUxIHdhc24ndCByZXNldC4KLQotVGh1IE9jdCAgMyAxNzoxNzowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEFkZCBvcGNvZGUgJiBtYXNrcyBmb3IKLQlhbGwgb3Bjb2Rlcy4gIFZlcnkgcm91Z2ggY3V0IGF0IG9wZXJhbmRzIGZvciBhbGwgb3Bjb2Rlcy4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogU3RhcnQgZmxlc2hpbmcgb3V0IHRoZQotCW9wY29kZSB0YWJsZS4KLQotVGh1IE9jdCAgMyAxMDowNjowNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmMsIG1uMTAzMDAtb3BjLmM6IE5ldyBmaWxlcy4KLQkqIG1uMTAyMDAtZGlzLmMsIG1uMTAzMDAtZGlzLmM6IE5ldyBmaWxlcy4KLQkqIG1uMTB4MDAtb3BjLmMsIG1uMTB4MDAtZGlzLmM6IERlbGV0ZWQuCi0JKiBkaXNhc3NlbWJsZS5jOiBCcmVhayBtbjEweDAwIHN1cHBvcnQgaW50byAxMDIwMCBhbmQgMTAzMDAKLQlzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotVGh1IE9jdCAgMyAxNTo1OToxMiAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoTU9TVExZQ0xFQU4pOiBNb3ZlIGNvbmZpZy5sb2cgdG8gZGlzdGNsZWFuLgotCi1XZWQgT2N0ICAyIDIzOjI4OjQyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMHgwMC1vcGMuYywgbW4xMHgwMC1kaXMuYzogTmV3IGZpbGVzIGZvciBNYXRzdXNoaXRhCi0JTU4xMHgwMCBwcm9jZXNzb3JzLgotCSogZGlzYXNzZW1ibGUgKEFSQ0hfbW4xMHgwMCk6IERlZmluZS4KLQkoZGlzYXNzZW1ibGVyKTogSGFuZGxlIGJmZF9hcmNoX21uMTB4MDAuCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBiZmRfbW4xMHgwMF9hcmNoLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1UdWUgT2N0ICAxIDEwOjQ5OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAob3BfcnRuKTogQ2hhbmdlIHRvIGJlIGEgcG9pbnRlci4gIEFkanVzdCB1c2VzCi0JYWNjb3JkaW5nbHkuICBEb24ndCBkZWNsYXJlIGZ1bmN0aW9ucyB1c2luZyBvcF9ydG4uCi0KLUZyaSBTZXAgMjcgMTg6Mjg6NTkgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiAgQWRkIG1lbWFkZHIgYXJndW1lbnQuICBSZS1hcnJhbmdlCi0JcGFyYW1zIHRvIGJlIG1vcmUgc3RhbmRhcmQuCi0JKiAoZGlzYXNzZW1ibGUpOiAgUHJpbnQgYWJzb2x1dGUgYWRkcmVzc2VzIGFuZCBzeW1ib2xpYyBuYW1lcyBmb3IKLQlicmFuY2ggYW5kIGp1bXAgdGFyZ2V0cy4KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZCk6ICBBZGQgZGlzcGxhY2VtZW50IGZsYWcgdG8gOSBhbmQgMjIKLQliaXQgb3BlcmFuZHMuCi0JKiAodjg1MF9vcGNvZGVzKTogIEFkZCBicmVha3BvaW50IGluc24uCi0KLU1vbiBTZXAgMjMgMTI6MzI6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBNb3ZlIHRoZSBmbW92ZW14IGRhdGEgcmVnaXN0ZXIgY2FzZXMgYmVmb3JlIHRoZQotIAlvdGhlciBjYXNlcywgc28gdGhhdCB0aGV5IGdldCByZWNvZ25pemVkIGJlZm9yZSB0aGUgZGF0YSByZWdpc3RlcgotIAlkb2VzIGdldHMgdHJlYXRlZCBhcyBhIGRlZ2VuZXJhdGUgcmVnaXN0ZXIgbGlzdC4KLQotVHVlIFNlcCAxNyAxMjowNjo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCBhIGNhc2UgZm9yICJkaXYiIGFuZCAiZGl2dSIgd2l0aCB0d28gcmVnaXN0ZXJzCi0JYW5kIGEgZGVzdGluYXRpb24gb2YgJDAuCi0KLVR1ZSBTZXAgMTAgMTY6MTI6MzkgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQHJ0bC5jeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEFkZCBwcm90b3R5cGUuCi0JKF9wcmludF9pbnNuX21pcHMpOiBEaXR0by4KLQotTW9uIFNlcCAgOSAxNDoyNjoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogUHJpbnQgY29uZGl0aW9uIGNvZGUgcmVnaXN0ZXJzIGFzCi0gCSRmY2NOLgotCi1UdWUgU2VwICAzIDEyOjA5OjQ2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogQWRkIHNldHV3LCBzZXRzdywgc2V0eC4KLQotVHVlIFNlcCAgMyAxMjowNToyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogTWFrZSBzdGF0aWMuICBQcm92aWRlIHByb3RvdHlwZS4KLQotU3VuIFNlcCAgMSAyMjozMDo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kOSwgaW5zZXJ0X2QyMik6IEZpeCBib3VuZGFyeSBjYXNlCi0JaW4gcmFuZ2UgY2hlY2tzLgotCi1TYXQgQXVnIDMxIDAxOjI3OjI2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBIYW5kbGUgaW5zZXJ0aW9uIG9mICcsJywgJ1snIGFuZAotCSddJyBjaGFyYWN0ZXJzIGludG8gdGhlIG91dHB1dCBzdHJlYW0uCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXM6IFJlbW92ZSBzaXplIGZpZWxkIGZyb20gYWxsIG9wY29kZXMuCi0JQWRkICJtZW1vcCIgZmllbGQgdG8gYWxsIG9wY29kZXMgKGZvciB0aGUgZGlzYXNzZW1ibGVyKS4KLQlSZW9yZGVyIG9wY29kZXMgc28gdGhhdCAibm9wIiBjb21lcyBiZWZvcmUgIm1vdiIgYW5kICJqciIKLQljb21lcyBiZWZvcmUgImphcmwiLgotCi0JKiB2ODUwLWRpcy5jIChwcmludF9pbnNuX3Y4NTApOiBGaXggdHlwbyBpbiBsYXN0IGNoYW5nZS4KLQotCSogdjg1MC1kaXMuYyAocHJpbnRfaW5zbl92ODUwKTogUHJvcGVybHkgaGFuZGxlIGRpc2Fzc2VtYmxpbmcKLQlhIHR3byBieXRlIGluc24gYXQgdGhlIGVuZCBvZiBhIG1lbW9yeSByZWdpb24gd2hlbiB0aGUgbWVtb3J5Ci0JcmVnaW9uJ3Mgc2l6ZSBpcyBvbmx5IHR3byBieXRlIGFsaWduZWQuCi0KLQkqIHY4NTAtZGlzLmMgKHY4NTBfY2NfbmFtZXMpOiBGaXggc3R1cGlkIHRoaW5rb3MuCi0KLQkqIHY4NTAtZGlzLmMgKHY4NTBfcmVnX25hbWVzKTogRGVmaW5lLgotCSh2ODUwX3NyZWdfbmFtZXMsIHY4NTBfY2NfbmFtZXMpOiBMaWtld2lzZS4KLQkoZGlzYXNzZW1ibGUpOiBWZXJ5IHJvdWdoIGN1dCBhdCBwcmludGluZyBvcGVyYW5kcyAodW5mb3JtYXR0ZWQpLgotCi0JKiB2ODUwLW9wYy5jIChCT1BfTUFTSyk6IEZpeC4KLQkodjg1MF9vcGNvZGVzKTogRml4IG1hc2sgZm9yIGphcmwgYW5kIGpyLgotCi0JKiB2ODUwLWRpcy5jOiBOZXcgZmlsZS4gIFNrZWxldG9uIGZvciBkaXNhc3NlbWJsZXIgc3VwcG9ydC4KLQkqIE1ha2VmaWxlLmluIFJlbW92ZSB2ODUwIHJlZmVyZW5jZXMsIHRoZXkncmUgbm90IG5lZWRlZCBoZXJlLgotCSogY29uZmlndXJlLmluOiBBZGQgdjg1MC1kaXMubyB3aGVuIGJ1aWxkaW5nIHY4NTAgdG9vbGNoYWlucy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IENhbGwgdjg1MCBkaXNhc3NlbWJsZXIuCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kOF83LCBleHRyYWN0X2Q4XzcpOiBOZXcgZnVuY3Rpb25zLgotCShpbnNlcnRfZDhfNiwgZXh0cmFjdF9kOF82KTogTmV3IGZ1bmN0aW9ucy4KLQkodjg1MF9vcGVyYW5kcyk6IFJlbmFtZSBEN1MgdG8gRDc7IG9wZXJhbmQgZm9yIEQ3IGlzIHVuc2lnbmVkLgotCVJlbmFtZSBEOCB0byBEOF83LCB1c2Uge2luc2VydCxleHRyYWN0fV9kOF83IHJvdXRpbmVzLgotCUFkZCBEOF82LgotCShJRjRBLCBJRjRCKTogVXNlICJENyIgaW5zdGVhZCBvZiAiRDdTIi4KLQkoSUY0QywgSUY0RCk6IFVzZSAiRDhfNyIgaW5zdGVhZCBvZiAiRDgiLgotCShJRjRFLCBJRjRGKTogTmV3LiAgVXNlICJEOF82Ii4KLQkodjg1MF9vcGNvZGVzKTogVXNlIElGNEEvSUY0QiBmb3Igc2xkLmIvc3N0LmIuICBVc2UgSUY0Qy9JRjREIGZvcgotCXNsZC5oL3NzdC5oLiAgVXNlIElGNEUvSUY0RiBmb3Igc2xkLncvc3N0LncuCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kMTZfMTUsIGV4dHJhY3RfZDE2XzE1KTogTmV3IGZ1bmN0aW9ucy4KLQkodjg1MF9vcGVyYW5kcyk6IENoYW5nZSBEMTYgdG8gRDE2XzE1LCB1c2Ugc3BlY2lhbCBpbnNlcnQvZXh0cmFjdAotCXJvdXRpbmVzLiAgTmV3IG5ldyBEMTYgdGhhdCB1c2VzIHRoZSBnZW5lcmljIGluc2VydC9leHRyYWN0IGNvZGUuCi0JKElGN0EsIElGN0IpOiBVc2UgRDE2XzE1LgotCShJRjdDLCBJRjdEKTogTmV3LiAgVXNlIEQxNi4KLQkodjg1MF9vcGNvZGVzKTogVXNlIElGN0MgYW5kIElGN0QgZm9yIGxkLmIgYW5kIHN0LmIuCi0KLQkqIHY4NTAtb3BjLmMgKGluc2VydF9kOSwgaW5zZXJ0X2QyMik6IFNsaWdodGx5IGltcHJvdmUgZXJyb3IKLQltZXNzYWdlLiAgSXNzdWUgYW4gZXJyb3IgaWYgdGhlIGJyYW5jaCBvZmZzZXQgaXMgb2RkLgotCi0JKiB2ODUwLW9wYy5jOiBBZGQgbm90ZXMgYWJvdXQgbmVlZGluZyBzcGVjaWFsIGluc2VydC9leHRyYWN0Ci0JZm9yIGFsbCB0aGUgbG9hZC9zdG9yZSBpbnNucywgZXhjZXB0ICJsZC5iIiBhbmQgInN0LmIiLgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDIyLCBleHRyYWN0X2QyMik6IE5ldyBmdW5jdGlvbnMuCi0JKHY4NTBfb3BlcmFuZHMpOiBVc2UgaW5zZXJ0X2QyMiBhbmQgZXh0cmFjdF9kMjIgZm9yCi0JRDIyIG9wZXJhbmRzLgotCShpbnNlcnRfZDkpOiBGaXggcmFuZ2UgY2hlY2suCi0KLUZyaSBBdWcgMzAgMTg6MDE6MDIgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBBZGQgVjg1MF9PUEVSQU5EX1NJR05FRCBmbGFnCi0JYW5kIHNldCBiaXRzIGZpZWxkIHRvIEQ5IGFuZCBEMjIgb3BlcmFuZHMuCi0KLVRodSBBdWcgMjkgMTE6MTA6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogRGVmaW5lIFNSMiBvcGVyYW5kLgotCSh2ODUwX29wY29kZXMpOiAibGRzciIgdXNlcyBSMSxTUjIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEZpeCBvcGNvZGUgc3BlY3MgZm9yCi0Jc2xkLncsIHNzdC5iLCBzc3QuaCwgc3N0LncsIGFuZCBub3AuCi0KLVdlZCBBdWcgMjggMTU6NTU6NDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBBZGQgbnVsbCBvcGNvZGUgdG8gbWFyayB0aGUKLQllbmQgb2YgdGhlIG9wY29kZSB0YWJsZS4KLQotTW9uIEF1ZyAyNiAxMzozNTo1MyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQWRkZWQgcmVnaXN0ZXIgcGFpcnMsCi0JInIwLXIxIiwgInIyLXIzIiwgZXRjLgotCi1GcmkgQXVnIDIzIDAwOjI3OjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IE1ha2UgSTE2IGJlIGEgc2lnbmVkIG9wZXJhbmQuCi0JQ3JlYXRlIEkxNlUgZm9yIGFuIHVuc2lnbmVkIDE2Yml0IG1tZWRpYXRlIG9wZXJhbmQuCi0JKHY4NTBfb3Bjb2Rlcyk6IFVzZSBJMTZVIGZvciAib3JpIiwgImFuZGkiIGFuZCAieG9yaSIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBEZWZpbmUgRVAgb3BlcmFuZC4KLQkoSUY0QSwgSUY0QiwgSUY0QywgSUY0RCk6IFVzZSBFUC4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRml4IG9wY29kZSBudW1iZXJzIGZvciAibW92IgotCXdpdGggaW1tZWRpYXRlIG9wZXJhbmQsICJtb3ZoaSIuICBUd2VhayAibGRzciIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEdldCBsZC5bYmh3XSBhbmQgc3QuW2Jod10KLQljb3JyZWN0LiAgR2V0IHNsZC5bYmh3XSBhbmQgc3N0LltiaHddIGNsb3Nlci4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6ICJub3QiIGlzIGEgdHdvIGJ5dGUgaW5zbgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBDb3JyZWN0IGJpdCBwYXR0ZXJuIGZvciBzZXRmLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogRDE2IGluc2VydHMgYXQgb2Zmc2V0IDE2IQotCi0JKiB2ODUwLW9wYy5jICh0d28pOiBHZXQgb3JkZXIgb2Ygd29yZHMgY29ycmVjdC4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEkxNiBpbnNlcnRzIGF0IG9mZnNldCAxNiEKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEFkZCAiU1IxIiBhbmQgIlNSMiIgZm9yIHN5c3RlbQotCXJlZ2lzdGVyIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gb3BlcmFuZHMuCi0JKHY4NTBfb3Bjb2Rlcyk6IFVzZSBTUjEgYW5kIFNSMiBmb3IgImxkc3IiIGFuZCAic3RzciIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEZpeCB0aGlua28gaW4gImptcCIgb3Bjb2RlLiAgRml4Ci0Jc2FtZSB0aGlua28gaW4gInRyYXAiIG9wY29kZS4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQWRkIGluaXRpYWxpemVyIGZvciBzaXplIGZpZWxkCi0Jb24gYWxsIG9wY29kZXMuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBENiAtPiBEUzcuICBSZWZlcmVuY2VzIGNoYW5nZWQuCi0JQWRkIEQ4IGZvciA4LWJpdCB1bnNpZ25lZCBmaWVsZCBpbiBzaG9ydCBsb2FkL3N0b3JlIGluc25zLgotCShJRjRBLCBJRjREKTogVGhlc2UgYm90aCBuZWVkIHR3byByZWdpc3RlcnMuCi0JKElGNEMsIElGNEQpOiBEZWZpbmUuICBVc2UgOC1iaXQgdW5zaWduZWQgZmllbGQuCi0JKHY4NTBfb3Bjb2Rlcyk6IEZvciAic2xkLmgiLCAic2xkLnciLCAic3N0LmgiLCAic3N0LnciLCB1c2UKLQlJRjRDICYgSUY0RC4gIEZvciAidHJhcCIgdXNlIEk1VSwgbm90IEk1LiAgQWRkIElGMSBvcGVyYW5kCi0JZm9yICJsZHNyIiBhbmQgInN0c3IiLgotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IDMtYml0IGltbWVkaWF0ZSBmb3IgYml0IGluc25zCi0JaXMgdW5zaWduZWQuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IENvcnJlY3Qgc2hvcnQgc3RvcmUgaGFsZiAoc3N0LmgpIGFuZAotCXNob3J0IHN0b3JlIHdvcmQgKHNzdC53KS4KLQotVGh1IEF1ZyAyMiAxNjo1NzoyNyAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBBZGRlZCBpbnNlcnQgYW5kIGV4dHJhY3QgZmllbGRzLAotIAlwb2ludGVycyB0byBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdW51c3VhbCBvcGVyYW5kIGVuY29kaW5ncy4KLQotVGh1IEF1ZyAyMiAwMTowNToyNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEVuYWJsZSAidHJhcCIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEZpeCBvcmRlciBvZiBkaXNwbGFjZW1lbnQKLQlhbmQgcmVnaXN0ZXIgZm9yICJzZXQxIiwgImNscjEiLCAibm90MSIsIGFuZCAidHN0MSIuCi0KLVdlZCBBdWcgMjEgMTg6NDY6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogQWRkICJCMyIgc3VwcG9ydC4KLQkodjg1MF9vcGNvZGVzKTogRml4IGFuZCBlbmFibGUgInNldDEiLCAiY2xyMSIsICJub3QxIgotCWFuZCAidHN0MSIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6ICJqbXAiIGhhcyBvbmx5IGFuIFIxIG9wZXJhbmQuCi0KLQkqIHY4NTAtb3BjLmM6IENsb3NlIHVudGVybWluYXRlZCBjb21tZW50LgotCi1XZWQgQXVnIDIxIDE3OjMxOjI2IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogQWRkIGZsYWdzIGZpZWxkLgotIAkodjg1MF9vcGNvZGVzKTogYWRkIG1vdmUgb3Bjb2Rlcy4KLQotVHVlIEF1ZyAyMCAxNDo0MTowMyAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCB2ODUwLW9wYy5vLgotCSogY29uZmlndXJlOiAoYmZkX3Y4NTB2X2FyY2gpIEFkZCBuZXcgY2FzZS4KLQkqIGNvbmZpZ3VyZS5pbjogKGJmZF92ODUwX2FyY2gpIEFkZCBuZXcgY2FzZS4KLQkqIHY4NTAtb3BjLmM6IE5ldyBmaWxlLgotCi1Nb24gQXVnIDE5IDE1OjIxOjM4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogSGFuZGxlIGxpdHRsZSBlbmRpYW4gc3BhcmNzLgotCi1UaHUgQXVnIDE1IDEzOjE0OjQzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jOiBBZGQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgb3Bjb2RlCi0JdGFibGUgdG8gaGVscCBkZXRlcm1pbmluZSB3aGljaCBpbnN0cnVjdGlvbnMgY2FuIGJlIGRvbmUKLQlpbiBwYXJhbGxlbC4KLQotVGh1IEF1ZyAxNSAxMzoxMToxMyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogVXBkYXRlIGVkaXRpbmcgb2YgaW5jbHVkZSBwYXRobmFtZXMgdG8gYmUKLQltb3JlIGdlbmVyYWwuCi0KLVRodSBBdWcgMTUgMTY6Mjg6NDEgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBhcm0tb3BjLmg6IEFkZGVkICJieCIgaW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbi4KLQotV2VkIEF1ZyAxNCAxNzowMDowNCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEtb3BjLmMgKEVWNEVYVEhXSU5ERVgpOiBGaWVsZCB3aWR0aCBzaG91bGQgYmUgOCBub3QgNS4KLQotTW9uIEF1ZyAxMiAxNDozMDozNyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogTWlub3IgZml4ZXMgdG8gYWRkaSBhbmQgYmwubC4KLQotRnJpIEF1ZyAgOSAxMzoyMTo1OSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogQ29ycmVjdCAnbXYnIHVuaXQgZW50cnkgdG8gRUlUSEVSLgotCi1UaHUgQXVnICA4IDEyOjQzOjUyIDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSBmb3IgYWxwaGEtb3BjIGNoYW5nZXMuCi0KLVdlZCBBdWcgIDcgMTE6NTU6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX2kzODYpOiBBY3R1YWxseSByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUuCi0gCShPTkUsIE9QX09ORSk6ICNpZmRlZiBvdXQ7IG5vdCB1c2VkLgotCi1GcmkgQXVnICAyIDE3OjQ3OjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBBZGRlZCAyIGFjY3VtdWxhdG9yIHN1YiBpbnN0cnVjdGlvbnMuCi0JQ2hhbmdlZCBzdWJpIG9wZXJhbmQgdHlwZSB0byB0cmVhdCAwIGFzIDE2LgotCi1XZWQgSnVsIDMxIDE2OjIxOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogQWRkIGNwdXNobCBmb3IgdGhlIG1jZjUyMDAuICBGcm9tIEtlbiBSb3NlCi0JPHJvc2VAbmV0Y29tLmNvbT4uCi0KLVdlZCBKdWwgMzEgMTQ6Mzk6MjcgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBhcm0tb3BjLmg6IChhcm1fb3Bjb2Rlcyk6IEFkZGVkIGhhbGZ3b3JkIGFuZCBzaWduLWV4dGVuc2lvbgotIAltZW1vcnkgdHJhbnNmZXIgaW5zdHJ1Y3Rpb25zLiBBZGQgbmV3IGZvcm1hdCBzdHJpbmcgZW50cmllcyAlaCBhbmQgJXMuCi0JKiBhcm0tZGlzLmM6IChwcmludF9pbnNuX2FybSk6IFByb3ZpZGUgZGVjb2Rpbmcgb2YgdGhlIG5ldwotCWZvcm1hdHMgJWggYW5kICVzLgotCi1GcmkgSnVsIDI2IDExOjQ1OjA0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wZXJhbmRzKTogQWRkZWQgVU5VTTRTOyBhIDQtYml0IGFjY3VtdWxhdG9yIHNoaWZ0LgotIAkoZDEwdl9vcGNvZGVzKTogTW9kaWZpZWQgYWNjdW11bGF0b3Igc2hpZnQgaW5zdHJ1Y3Rpb25zIHRvIHVzZSBVTlVNNFMuCi0KLUZyaSBKdWwgMjYgMTQ6MDE6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYV9vc2YpOiBSZW1vdmUuCi0JKHByaW50X2luc25fYWxwaGFfdm1zKTogUmVtb3ZlLgotCShwcmludF9pbnNuX2FscGhhKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgQ2hvc2UgdGhlIHJlZ2lzdGVyCi0JbmFtZXMgYmFzZWQgb24gaW5mby0+Zmxhdm91ci4KLQkqIGRpc2Fzc2VtYmxlLmM6IEFsd2F5cyByZXR1cm4gcHJpbnRfaW5zbl9hbHBoYSBmb3IgdGhlIGFscGhhLgotCi1UaHUgSnVsIDI1IDE1OjI0OjE3IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LWRpcy5jIChkaXNfbG9uZyk6IEhhbmRsZSB1bmtub3duIG9wY29kZXMuCi0KLVRodSBKdWwgMjUgMTI6MDg6MDkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmM6IENoYW5nZXMgdG8gc3VwcG9ydCBzaWduZWQgYW5kIHVuc2lnbmVkIG51bWJlcnMuCi0JQWxsIGluc3RydWN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgdGhhdCBoYXZlIGxvbmcgYW5kIHNob3J0IGZvcm1zCi0Jbm93IGVuZCBpbiAiLmwiIG9yICIucyIuICBEaXZzIGFkZGVkLgotCSogZDEwdi1kaXMuYzogQ2hhbmdlcyB0byBzdXBwb3J0IHNpZ25lZCBhbmQgdW5zaWduZWQgbnVtYmVycy4KLQotVHVlIEp1bCAyMyAxMTowMjo1MyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1kaXMuYzogQ2hhbmdlIGFsbCBmdW5jdGlvbnMgdG8gdXNlIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYy4KLQotTW9uIEp1bCAyMiAxNTozODo1MyAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogTWFrZSBvcGNvZGUgbWFza3MgZm9yIHRoZSBDb2xkRmlyZQotIAltb3ZlIGNjci9zciBpbnNucyBtb3JlIHN0cmljdCBzbyB0aGF0IHRoZSBkaXNhc3NlbWJsZXIgb25seQotIAlzZWxlY3RzIHRoZW0gd2hlbiB0aGUgYWRkcmVzc2luZyBtb2RlIGlzIGRhdGEgcmVnaXN0ZXIuCi0KLU1vbiBKdWwgMjIgMTE6MjU6MjQgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0gICAgICAgICogZDEwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogIERlY2xhcmUuCi0gICAgICAgICogZDEwdi1kaXMuYyAocHJpbnRfb3BlcmFuZCk6IE5vdyB1c2VzIHByZV9kZWZpbmVkX3JlZ2lzdGVycwotICAgICAgICB0byBwaWNrIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSByZWdpc3RlcnMuCi0KLU1vbiBKdWwgMjIgMTM6NDc6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYzogRml4IG9wY29kZSB2YWx1ZXMgZm9yIGZwYWNrMTYsIGFuZCBmcGFja2ZpeC4gIEZpeAotCW9wZXJhbmRzIGZvciBmZXhwYW5kIGFuZCBmcG1lcmdlLiAgRnJvbSBDaHJpc3RpYW4gS3VlaG5rZQotCTxDaHJpc3RpYW4uS3VlaG5rZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZT4uCi0KLU1vbiBKdWwgMjIgMTM6MTc6MDYgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogTm8gbG9uZ2VyIHRoZSB1c2VyLXZpc2libGUKLQlwcmludCByb3V0aW5lLiAgVGFrZSBuZXcgcmVnbmFtZXMgYW5kIGNwdW1hc2sgYXJndW1lbnRzLgotCUtpbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5vbnNlbnNlLgotCShwcmludF9pbnNuX2FscGhhX29zZik6IE5ldyBmdW5jdGlvbi4gIERvIE9TRi8xIHN0eWxlIHJlZ25hbWVzLgotCShwcmludF9pbnNuX2FscGhhX3Ztcyk6IE5ldyBmdW5jdGlvbi4gIERvIFZNUyBzdHlsZSByZWduYW1lcy4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IFRlc3QgYmZkIGZsYXZvdXIgdG8gcGljawotCWJldHdlZW4gT1NGIGFuZCBWTVMgcm91dGluZXMuICBEZWZhdWx0IHRvIE9TRi4KLQotVGh1IEp1bCAxOCAxNzoxOTozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19TVUJTVCAoSU5TVEFMTF9TSExJQikuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFVzZSBASU5TVEFMTF9TSExJQkAuCi0KLVdlZCBKdWwgMTcgMTQ6Mzk6MDUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogKGJmZF9kMTB2X2FyY2gpIEFkZCBuZXcgY2FzZS4KLQkqIGNvbmZpZ3VyZS5pbjogKGJmZF9kMTB2X2FyY2gpIEFkZCBuZXcgY2FzZS4KLQkqIGQxMHYtZGlzLmM6IE5ldyBmaWxlLgotCSogZDEwdi1vcGMuYzogTmV3IGZpbGUuCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpIEFkZCBlbnRyeSBmb3IgZDEwdi4KLQotV2VkIEp1bCAxNyAxMDoxMjowNSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEZpeCBidWdzIGluIGNvbGRmaXJlIGluc25zIHJlbGF0aW5nCi0gCXRvIGJjYywgdHJhcGZsLCBzdWJ4bCwgYW5kIHdkZGF0YSBkaXNjb3ZlcmVkIGJ5IEFuZHJlYXMgU2Nod2FiLgotCi1Nb24gSnVsIDE1IDE2OjU5OjU1IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGkzODYtZGlzLmM6ICBHZXQgcmlkIG9mIHByaW50X2luc25faTgwODYuICBVc2UgaW5mby5tYWNoIHRvCi0JZGlzdGluZ3Vpc2ggYmV0d2VlbiB2YXJpYW50cyBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2V0LgotCSogc3BhcmMtZGlzLmM6ICBHZXQgcmlkIG9mIHByaW50X2luc25fc3BhcmNsaXRlLiAgVXNlIGluZm8ubWFjaCB0bwotCWRpc3Rpbmd1aXNoIGJldHdlZW4gdmFyaWFudHMgb2YgdGhlIGluc3RydWN0aW9uIHNldC4KLQotRnJpIEp1bCAxMiAxMDoxMjowMSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX2k4MDg2KTogIE5ldyByb3V0aW5lIHRvIGRpc2Fzc2VtYmxlIHVzaW5nCi0JdGhlIDgwODYgaW5zdHJ1Y3Rpb24gc2V0LgotCSogaTM4Ni1kaXMuYzogIEdlbmVyYWwgY2xlYW51cHMuICBNYWtlIG1vc3QgdGhpbmdzIHN0YXRpYy4gIEFkZAotCXByb3RvdHlwZXMuICBHZXQgcmlkIG9mIHN0YXRpYyB2YXJpYWJsZXMgYWZsYWdzIGFuZCBkZmxhZ3MuICBQYXNzCi0JdGhlbSBhcyBhcmdzICh0byBhbG1vc3QgZXZlcnl0aGluZykuCi0KLVRodSBKdWwgMTEgMTE6NTg6NDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogSGFuZGxlIG1hY3JlZ3MgaW4gbGRtYWMgaW5zbnMuCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBIYW5kbGUgImxkbS5sIiBhbmQgInN0bS5sIi4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6ICJhYnMiIGlzIGltcGxpY2l0bHkgdHdvCi0JaWYgdGhlIG5leHQgYXJnIGlzIG1hcmtlZCB3aXRoIFNSQ19JTl9EU1QuICBHcm9zcy4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IFByaW50ICJleHIiIHdoZW4KLQl3ZSdyZSBsb29raW5nIGZvciBhbmQgZmluZCBFWFIuCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBXZSBkb24ndCBoYXZlIGEgbWF0Y2gKLQlpZiB3ZSdyZSBsb29raW5nIGZvciBLQklUIGFuZCB3ZSBkb24ndCBmaW5kIGl0LgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogTWFzayBvZmYgdW53YW50ZWQgYml0cwotCWZvciBMXzMgYW5kIExfMi4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IERvbid0IHNldCBwbGVuIGZvcgotCTNiaXQgaW1tZWRpYXRlIG9wZXJhbmRzLgotCi1UdWUgSnVsICA5IDEwOjU1OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogUmVsZWFzZWQgYmludXRpbHMgMi43LgotCi0JKiBhbHBoYS1vcGMuYzogQWRkIG5ldyBjYXNlIG9mICJtb3YiLiAgRnJvbSBLbGF1cyBLYWVtcGYKLQk8a2thZW1wZkBwcm9naXMuYWMtbmV0LmRlPi4KLQotVGh1IEp1bCAgNCAxMTo0Mjo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLW9wYy5jOiBDb3JyZWN0IHNlY29uZCBjYXNlIG9mICJtb3YiIHRvIHVzZSBPUFJMLgotCi1XZWQgSnVsICAzIDE2OjAzOjQ3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjbGl0ZSk6ICBOZXcgcm91dGluZSB0byBwcmludAotCXNwYXJjbGl0ZSBpbnN0cnVjdGlvbnMuCi0KLVdlZCBKdWwgIDMgMTQ6MjE6MTggMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBBZGQgY29sZGZpcmUgc3VwcG9ydC4KLQotRnJpIEp1biAyOCAxNTo1Mzo1MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoYXNpX3RhYmxlKTogQWRkICNBU0lfTiwgI0FTSV9OX0wsICNBU0lfTlVDTEVVUywKLQkjQVNJX05VQ0xFVVNfTElUVExFLiAgUmVuYW1lICNBU0lfQVNfSUZfVVNFUl97UFJJTUFSWSxTRUNPTkRBUll9X0wKLQl0byAjQVNJX0FTX0lGX1VTRVJfe1BSSU1BUlksU0VDT05EQVJZfV9MSVRUTEUuCi0KLVR1ZSBKdW4gMjUgMjI6NTg6MzEgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIpOgotCVVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgotCShkb2NkaXIsIG9sZGluY2x1ZGVkaXIpOiBSZW1vdmVkLgotCSogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgotCi1GcmkgSnVuIDIxIDEzOjUzOjM2IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS1vcGMuYzogTmV3IGZpbGUuCi0JKiBhbHBoYS1vcGMuaDogUmVtb3ZlLgotCSogYWxwaGEtZGlzLmM6IENvbXBsZXRlIHJld3JpdGUgdG8gdXNlIG5ldyBvcGNvZGUgdGFibGUuCi0JKiBjb25maWd1cmUuaW46IEZvciBiZmRfYWxwaGFfYXJjaCwgdXNlIGFscGhhLW9wYy5vLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgYWxwaGEtb3BjLm8uCi0JKGFscGhhLWRpcy5vKTogRGVwZW5kIHVwb24gJChJTkNESVIpL29wY29kZS9hbHBoYS5oLCBub3QKLQlhbHBoYS1vcGMuaC4KLQkoYWxwaGEtb3BjLm8pOiBOZXcgdGFyZ2V0LgotCi1XZWQgSnVuIDE5IDE1OjU1OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCi0JU2V0IGltbV9hZGRlZF90b19yczEgZXZlbiBpZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiByZWdpc3RlcgotCWFyZSBub3QgdGhlIHNhbWUuCi0KLQkqIHNwYXJjLW9wYy5jOiBBZGQgc29tZSB0d28gb3BlcmFuZCBmb3JtcyBvZiB0aGUgd3IgaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBKdW4gMTggMTU6NTg6MjcgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBSZW5hbWUgImhtb2RlIiBhcmd1bWVudAotCXRvIGp1c3QgIm1vZGUiLgotCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBIYW5kbGUgSDgvUy4KLQkqIGg4MzAwLWRpcy5jIChwcmludF9pbnNuX2g4MzAwcyk6IE5ldyBmdW5jdGlvbiBmb3IgSDgvUy4KLQotVHVlIEp1biAxOCAxODowNjo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jOiBBZGQgYmVxL3RlcSBhcyBhbGlhc2VzIGZvciBiZS90ZS4KLQotCSogcHBjLW9wYy5jOiBGaXggZmNtcG8gb3Bjb2RlLiAgRnJvbSBTZXJnZWkgU3Rlc2hlbmtvCi0JPHNlcmdlaUBtc2lsLnNwcy5tb3QuY29tPi4KLQotVHVlIEp1biAxOCAxNTowODo1NCAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBOZXcgZmlsZS4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBQcmludCBsZGEgcmEsbGl0KHJ6KSBhcyBtb3YuCi0KLU1vbiBKdW4gMTAgMTg6NTA6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogQWx3YXlzIHByaW50IEFCUzhNRU0gd2l0aCA6OCwKLQlyZWdhcmRsZXNzIG9mIHBsZW4uCi0KLVR1ZSBKdW4gIDQgMDk6MTU6NTMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAoT1BfT0ZGKTogQ2FsbCBhcHBlbmRfcHJlZml4LgotCi1UaHUgTWF5IDIzIDE1OjE4OjIzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChpbnN0cnVjdGlvbiBlbmNvZGluZyBtYWNyb3MpOiBBZGQgZXhwbGljaXQgY2FzdHMgdG8KLQl1bnNpZ25lZCBsb25nIHRvIHNpbGVuY2UgYSB3YXJuaW5nIGZyb20gdGhlIFNvbGFyaXMgUG93ZXJQQwotCWNvbXBpbGVyLgotCi1UaHUgQXByIDI1IDE5OjMzOjMyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogQWRkIHVsdHJhc3BhcmMgdmlzIGV4dGVuc2lvbnMuCi0KLU1vbiBBcHIgMjIgMTc6MTI6MzUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBibHVlcy5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAoWF9JTU0sWF9TSU1NKTogTmV3IG1hY3Jvcy4KLQkoWF9JTU0xMyk6IERlbGV0ZS4KLQkocHJpbnRfaW5zbl9zcGFyYyk6IE1lcmdlIGNhc2VzIGksSSxqIHRvZ2V0aGVyLiAgTmV3IGNhc2VzIFgsWS4KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogVXNlIFggZm9yIDUgYml0IHNoaWZ0IGNvbnN0YW50cywKLQlZIGZvciA2IGJpdCBzaGlmdCBjb25zdGFudHMuICBSZXdyaXRlIGVudHJpZXMgZm9yIGNyZGN4dCwgY3dyY3h0LAotCWNwdXNoLCBjcHVzaGEsIGNwdWxsIHNwYXJjbGV0IGluc25zLgotCi1XZWQgQXByIDE3IDE0OjIwOjIyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChjb21wdXRlX2FyY2hfbWFzayk6IFJlcGxhY2UgQU5TSSBzdHlsZSBkZWYgd2l0aCBLJlIuCi0KLVRodSBBcHIgMTEgMTc6MzA6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYzogU2V0IEZfRkJSIG9uIGZsb2F0aW5nIHBvaW50IGJyYW5jaCBpbnN0cnVjdGlvbnMuCi0JU2V0IEZfRkxPQVQgb24gb3RoZXIgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gQXByICA4IDE3OjAyOjQ4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChQUEM4NjApOiBNYWNybyBmb3IgODYwLzgyMSBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYW5kCi0JcmVnaXN0ZXJzLgotIAkocG93ZXJwY19vcGNvZGVzKTogQWRkIDg2MC84MjEgc3BlY2lmaWMgU1BScy4KLQotTW9uIEFwciAgOCAxNDowMDo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgotCWRpcmVjdG9yaWVzLiAgU2V0IGFuZCBzdWJzdGl0dXRlIEJGRF9QSUNMSVNULgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEJGRF9QSUNMSVNUKTogUmVuYW1lIGZyb20gQkZEX0xJU1QuICBDaGFuZ2UgYWxsCi0JdXNlcy4gIFNldCB0byBAQkZEX1BJQ0xJU1RALgotCi1GcmkgQXByICA1IDE3OjEyOjI3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IFVzZSAiYml0IiBmb3IgTF8zIGltbWVkaWF0ZXMsCi0Jbm90ICJhYnMiLCB3aGljaCBtYXkgYmUgbmVlZGVkIGZvciB0aGUgYWJzb2x1dGUgaW4gc29tZXRoaW5nCi0JbGlrZSBidHN0ICMwLEAxMDo4LiAgUHJpbnQgTF8zIGltbWVkaWF0ZXMgc2VwYXJhdGVseSBmcm9tIG90aGVyCi0JaW1tZWRpYXRlcy4gIENoYW5nZSBBQlNNT1YgcmVmZXJlbmNlIHRvIEFCUzhNRU0uCi0KLVdlZCBBcHIgIDMgMTA6NDA6NDUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKG9wY29kZXNfaW5pdGlhbGl6ZWQpOiBNb3ZlIGluc2lkZSBwcmludF9pbnNuX3NwYXJjLgotCShjdXJyZW50X2FyY2hfbWFzayk6IE5ldyBzdGF0aWMgZ2xvYmFsLgotCShjb21wdXRlX2FyY2hfbWFzayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHByaW50X2luc25fc3BhcmMpOiBEZWxldGUgc3BhcmNfdjlfcC4gIE5ldyBzdGF0aWMgbG9jYWwKLQljdXJyZW50X21hY2guICBSZXNvcnQgb3Bjb2RlIHRhYmxlIGlmIGN1cnJlbnRfbWFjaCBjaGFuZ2VzLgotCUdlbmVyYWxpemUgImluc24gbm90IHN1cHBvcnRlZCIgdGVzdC4KLQkoY29tcGFyZV9vcGNvZGVzKTogUHJlZmVyIHN1cHBvcnRlZCBvcGNvZGVzIHRvIG5vbnN1cHBvcnRlZCBvbmVzLgotCURlbGV0ZSB0ZXN0IGZvciB2OS8hdjkuCi0JKiBzcGFyYy1vcGMuYyAoTUFTS18qKTogVXNlIFNQQVJDX09QQ09ERV9BUkNIX01BU0suCi0JKHY2bm90bGV0KTogRGVmaW5lLgotCShicmZjKTogU3BsaXQgaW50byBDQlIgYW5kIEZCUiBmb3IgY29wcm9jZXNzb3IvZnAgYnJhbmNoZXMuCi0JKGJyZmN4KTogUmVuYW1lZCB0byBGQlJYLgotCShjb25kZmMpOiBSZW5hbWVkIHRvIENPTkRGQy4gIFBhc3MgdjZub3RsZXQgdG8gQ0JSIChzdGFuZGFyZAotCWNvcHJvY2Vzc29yIG1uZW1vbmljcyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGUgc3BhcmNsZXQpLgotCShjb25kZik6IFJlbmFtZWQgdG8gQ09OREYuCi0JKFNMQ0JDQzIpOiBEZWxldGUgRl9BTElBUyBmbGFnLgotCi1TYXQgTWFyIDMwIDIxOjQ1OjU5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogcmQgbXVzdCBiZSAwIGZvcgotCW1vdiBmb28seyV5LCVwc3IsJXdpbSwldGJyfS4gIFN1cHBvcnQgbW92IGZvbywlYXNyWC4KLQotRnJpIE1hciAyOSAxMzowMjo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjb25maWcuc3RhdHVzKTogRGVwZW5kIHVwb24gQkZEIFZFUlNJT04gZmlsZSwgc28KLQl0aGF0IHRoZSBzaGFyZWQgbGlicmFyeSB2ZXJzaW9uIG51bWJlciBpcyBzZXQgY29ycmVjdGx5LgotCi1UdWUgTWFyIDI2IDE1OjQ3OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgQUNfQ0hFQ0tfVE9PTCB0byBmaW5kIGFyIGFuZCByYW5saWIuICBGcm9tCi0JTWlsZXMgQmFkZXIgPG1pbGVzQGdudS5haS5taXQuZWR1Pi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotU2F0IE1hciAxNiAxMzowNDowNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogejhrZ2VuLmMgKGludGVybmFsLCBnYXMpOiBDYWxsIHhtYWxsb2MgcmF0aGVyIHRoYW4gdW5jaGVja2VkCi0JbWFsbG9jLgotCi1UdWUgTWFyIDEyIDEyOjE0OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi44LgotCi1UaHUgTWFyICA3IDE1OjExOjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IEhhbmRsZSAnTycgb3BlcmFuZCBjaGFyIGxpa2UgJ3InLgotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBVc2UgJ08nIG9wZXJhbmQgY2hhciBmb3IgYG5lZyByZWcnLgotCi1UdWUgTWFyICA1IDE1OjUxOjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBzZXQgU0hMSUIgb3IgU0hMSU5LIHRvIGFuIGVtcHR5IHN0cmluZywKLQlzaW5jZSB0aGV5IGFwcGVhciBhcyB0YXJnZXRzIGluIE1ha2VmaWxlLmluLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gRmViIDI2IDEzOjAzOjQwIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IG91dCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGJpdHMuCi0KLVR1ZSBGZWIgMjAgMjA6NDg6MjggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jICh2OCx2Nm5vdHY5KTogQWRkIE1BU0tfU1BBUkNMRVQuCi0JKHNwYXJjX29wY29kZV9hcmNocyk6IEFkZCBNQVNLX1Y4IHRvIHNwYXJjbGV0IGVudHJ5LgotCShzcGFyY19vcGNvZGVzKTogQWRkIHNwYXJjbGV0IGluc25zLgotCShzcGFyY2xldF9jcHJlZ190YWJsZSk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV9zcGFyY2xldF9jcHJlZyk6IE5ldyBmdW5jdGlvbnMuCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IEhhbmRsZSBzcGFyY2xldCBjcHJlZ3MuCi0KLVR1ZSBGZWIgMjAgMTE6MDI6NDQgMTk5NiAgQWxhbiBNb2RyYSAgPGFsYW5AbXVsbGV0LkxldmVscy5VbmlTQS5FZHUuQXU+Ci0KLQkqIGkzODYtZGlzLmMgKGluZGV4MTYpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwdXRvcCk6IFByaW50IGplY3h6IGZvciAzMiBiaXQgY2FzZSwgamN4eiBmb3IgMTYgYml0LCBub3QgdGhlCi0Jb3RoZXIgd2F5IGFyb3VuZC4KLQkoT1BfaW5kaXJFKTogUmV0dXJuIHJlc3VsdCBvZiBPUF9FLgotCShPUF9FKTogQ2hlY2sgZm9yIDE2IGJpdCBhZGRyZXNzaW5nIG1vZGUsIGFuZCBkaXNhc3NlbWJsZQotCWNvcnJlY3RseS4gIE9wdGltaXNlZCAzMiBiaXQgY2FzZSBhIGxpdHRsZS4gIERvbid0IHByaW50Ci0JIihiYXNlLGluZGV4LHNjYWxlKSIgd2hlbiBzaWIgc3BlY2lmaWVzIG9ubHkgYW4gb2Zmc2V0LgotCi1Nb24gRmViIDE5IDEyOjMyOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgYW5kIHN1YnN0aXR1dGUgU0hMSUJfREVQLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKFNITElCX0RFUCk6IE5ldyB2YXJpYWJsZS4KLQkoTElCSUJFUlRZX0xJU1RTLCBCRkRfTElTVCk6IE5ldyB2YXJpYWJsZXMuCi0JKHN0YW1wLXBpY2xpc3QpOiBEZXBlbmQgdXBvbiBMSUJJQkVSVFlfTElTVFMgYW5kIEJGRF9MSVNULiAgSWYKLQlDT01NT05fU0hMSUIsIGFkZCB0aGVtIHRvIHBpY2xpc3Qgd2l0aCBhcHByb3ByaWF0ZSBtb2RpZmljYXRpb25zLgotCSgkKFNITElCKSk6IERlcGVuZCB1cG9uICQoU0hMSUJfREVQKS4gIERvbid0IGNoZWNrIENPTU1PTl9TSExJQgotCWhlcmU6IGp1c3QgdXNlIHBpY2xpc3QuCi0KLU1vbiBGZWIgMTkgMDI6MDM6NTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChNQVNLX1Y5LFY5X09OTFlfUCxWOV9QKTogRGVmaW5lLgotCShwcmludF9pbnNuX3NwYXJjKTogUmV3cml0ZSB2OS9ub3QtdjkgdGVzdHMuCi0JKGNvbXBhcmVfb3Bjb2Rlcyk6IExpa2V3aXNlLgotCSogc3BhcmMtb3BjLmMgKE1BU0tfPEFSQ0g+KTogRGVmaW5lLgotCSh2Nix2Nyx2OCxzcGFyY2xpdGUsdjksdjlhKTogUmVkZWZpbmUuCi0JKHNwYXJjbGV0LHY2bm90djkpOiBEZWZpbmUuCi0JKHNwYXJjX29wY29kZV9hcmNocyk6IERlbGV0ZSBtZW1iZXIgYGNvbmZsaWN0cycuICBBZGQgYHN1cHBvcnRlZCcuCi0JKHNwYXJjX29wY29kZXMpOiBEZWxldGUgRl9OT1RWOSwgdXNlIHY2bm90djkgaW5zdGVhZC4KLQotVGh1IEZlYiAxNSAxNDo0NTowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19QUk9HX0NDIGJlZm9yZSBjb25maWd1cmUuaG9zdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuaW4gKFNPTkFNRSk6IFJlbW92ZSBsZWFkaW5nIC4uL2JmZC8gZnJvbSAkKFNITElCKS4KLQotV2VkIEZlYiAxNCAxOTowMToyNyAxOTk2ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKG9uZWJ5dGVfaGFzX21vZHJtKTogTmV3IHN0YXRpYyBhcnJheS4KLQkodHdvYnl0ZV9oYXNfbW9kcm0pOiBOZXcgc3RhdGljIGFycmF5LgotCShwcmludF9pbnNuX2kzODYpOiBPbmx5IGZldGNoIHRoZSBtb2QvcmVnL3JtIGJ5dGUgaWYgaXQgaXMgbmVlZGVkLgotCi1UdWUgRmViIDEzIDE1OjE1OjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoU0hMSU5LKSk6IENoZWNrIHRzIGFnYWluc3QgJChTSExJQiksIG5vdAotCSQoU0hMSU5LKS4KLQotTW9uIEZlYiAxMiAxNjoyNjowNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoUFBDKTogVW5kZWYsIHNvIGRlZmF1bHQgZGVmaW5hdGlvbiBvbiBXaW5kb3dzIE5UCi0JZG9lc24ndCBjb25mbGljdC4KLQotV2VkIEZlYiAgNyAxMzo1OTo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IFRoZSBia3B0IGluc3RydWN0aW9uIGlzIHN1cHBvcnRlZCBvbgotCW02ODAxMHVwLCBub3QganVzdCBtNjgwMjB1cCB8IGNwdTMyLgotCi0JKiBNYWtlZmlsZS5pbiAoU09OQU1FKTogTmV3IHZhcmlhYmxlLgotCSgkKFNITElOSykpOiBNYWtlIGEgbGluayB0byB0aGUgdHJhbnNmb3JtZWQgbmFtZSwgYXMgd2VsbC4KLQkoc3RhbXAtdHNobGluayk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwpOiBTa2lwIHN0YW1wLXRzaGxpbmsgZHVyaW5nIGluc3RhbGwuCi0KLVR1ZSBGZWIgIDYgMTI6Mjg6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQVJHX1BST0dSQU0uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSk6IE5ldyB2YXJpYWJsZS4KLQkoaW5zdGFsbCk6IFRyYW5zZm9ybSBsaWJyYXJ5IG5hbWUgYmVmb3JlIGluc3RhbGxpbmcgaXQuCi0KLU1vbiBGZWIgIDUgMTY6MTQ6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpOTYwLWRpcy5jIChtZW0pOiBBZGQgSFggZGNpbnZhIGluc3RydWN0aW9uLgotCi0JU3VwcG9ydCBmb3IgYnVpbGRpbmcgYXMgYSBzaGFyZWQgbGlicmFyeSwgYmFzZWQgb24gcGF0Y2hlcyBmcm9tCi0JQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogY29uZmlndXJlLmluOiBBZGQgQUNfQVJHX0VOQUJMRSBmb3Igc2hhcmVkIGFuZCBjb21tb25iZmRsaWIuCi0JTmV3IHN1YnN0aXR1dGlvbnM6IEFMTExJQlMsIFBJQ0ZMQUcsIFNITElCLCBTSExJQl9DQywKLQlTSExJQl9DRkxBR1MsIENPTU1PTl9TSExJQiwgU0hMSU5LLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKEFMTExJQlMpOiBOZXcgdmFyaWFibGUuCi0JKFBJQ0ZMQUcsIFNITElCLCBTSExJQl9DQywgU0hMSUJfQ0ZMQUdTKTogTmV3IHZhcmlhYmxlcy4KLQkoQ09NTU9OX1NITElCLCBTSExJTkspOiBOZXcgdmFyaWFibGVzLgotCSguYy5vKTogSWYgUElDRkxBRyBpcyBzZXQsIGNvbXBpbGUgdHdpY2UsIG9uY2UgUElDLCBvbmNlIG5vcm1hbC4KLQkoU1RBR0VTVFVGRik6IFJlbW92ZSB2YXJpYWJsZS4KLQkoYWxsKTogRGVwZW5kIHVwb24gJChBTExMSUJTKSByYXRoZXIgdGhhbiAkKFRBUkdFVExJQikuCi0JKHN0YW1wLXBpY2xpc3QsIHBpY2xpc3QpOiBOZXcgdGFyZ2V0cy4KLQkoJChTSExJQiksICQoU0hMSU5LKSk6IE5ldyB0YXJnZXRzLgotCSgkKE9GSUxFUykpOiBEZXBlbmQgdXBvbiBzdGFtcC1waWNkaXIuCi0JKGRpc2Fzc2VtYmxlLm8pOiBCdWlsZCB0d2ljZSBpZiBQSUNGTEFHIGlzIHNldC4KLQkoTU9TVExZQ0xFQU4pOiBBZGQgcGljLyouby4KLQkoY2xlYW4pOiBSZW1vdmUgJChTSExJQiksICQoU0hMSU5LKSwgcGljbGlzdCwgYW5kIHN0YW1wLXBpY2xpc3QuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSBwaWMgYW5kIHN0YW1wLXBpY2Rpci4KLQkoaW5zdGFsbCk6IEluc3RhbGwgc2hhcmVkIGxpYnJhcmllcy4KLQkoc3RhbXAtcGljZGlyKTogTmV3IHRhcmdldC4KLQotRnJpIEZlYiAgMiAxNzoxNToyNSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBEZWxldGUgRElTQVNNX1JBV19JTlNOIHN1cHBvcnQuCi0JUHJpbnQgdW5rbm93biBpbnN0cnVjdGlvbiBhcyAidW5rbm93biIsIHJhdGhlciB0aGFuIGluIGhleC4KLQotVHVlIEphbiAzMCAxNDowNjowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1idWYuYzogSW5jbHVkZSAic3lzZGVwLmgiIGJlZm9yZSAiZGlzLWFzbS5oIi4KLQotVGh1IEphbiAyNSAyMDoyNDowNyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZV9hcmNocyk6IE1hcmsgdjgvc3BhcmNsaXRlIGFzIGNvbmZsaWN0aW5nLgotCi1UaHUgSmFuIDI1IDExOjU2OjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl9pMzg2KTogT25seSBmZXRjaCB0aGUgbW9kL3JlZy9ybSBieXRlCi0Jd2hlbiBuZWNlc3NhcnkuICBGcm9tIFVscmljaCBEcmVwcGVyCi0JPGRyZXBwZXJAbXl3YXJlLnJ6LnVuaS1rYXJsc3J1aGUuZGU+LgotCi1UaHUgSmFuIDI1IDAzOjM5OjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IE5VTU9QQ09ERVMgcmVwbGFjZWQgd2l0aAotCXNwYXJjX251bV9vcGNvZGVzLiAgVXBkYXRlIGFyY2hpdGVjdHVyZSBlbnVtIHZhbHVlcy4KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVfYXJjaHMpOiBSZXBsYWNlcyBhcmNoaXRlY3R1cmVfcG5hbWUuCi0JKHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfbnVtX29wY29kZXMpOiBSZW5hbWVkIGZyb20gYmZkX3NwYXJjX251bV9vcGNvZGVzLgotCShzcGFyY19vcGNvZGVzKTogQWRkIHY5YSBzaHV0ZG93biBpbnNuLgotCi1Nb24gSmFuIDIyIDA4OjI5OjU5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IFJlbmFtZWQgZnJvbSBwcmludF9pbnNuLgotCUlmIERJU0FTTV9SQVdfSU5TTiwgcHJpbnQgaW5zbiBpbiBoZXguICBIYW5kbGUgdjlhIGFzIG9wY29kZQotCWFyY2hpdGVjdHVyZS4KLQkocHJpbnRfaW5zbl9zcGFyYzY0KTogRGVsZXRlZC4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlciwgY2FzZSBiZmRfYXJjaF9zcGFyYyk6IEFsd2F5cyB1c2UKLQlwcmludF9pbnNuX3NwYXJjLgotCi0JKiBzcGFyYy1vcGMuYyAoYXJjaGl0ZWN0dXJlX3BuYW1lKTogQWRkIHY5YS4KLQotRnJpIEphbiAxMiAxNDozNTo1OCAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBBWlN0YXJOZXQuY29tPgotCi0JKiBhbHBoYS1vcGMuaCAoYWxwaGFfaW5zbl9zZXQpOiBWQVggZmxvYXRpbmcgcG9pbnQgb3Bjb2RlIHdhcwotIAlpbmNvcnJlY3RseSBkZWZpbmVkIGFzIDB4MTYgd2hlbiBpdCBzaG91bGQgYmUgMHgxNS4KLQkoRkxPQVRfRk9STUFUX01BU0spOiBmdW5jdGlvbiBjb2RlIGlzIDExIGJpdHMsIG5vdCBqdXN0IDcgYml0cyEKLQkoYWxwaGFfaW5zbl9zZXQpOiBhZGRlZCBjdnRzdCBhbmQgY3Z0dHEgZmxvYXQgb3BzLiAgQWxzbyBhZGRlZAotIAlleGNiIChleGNlcHRpb24gYmFycmllcikgd2hpY2ggaXMgZGVmaW5lZCBpbiB0aGUgQWxwaGEKLSAJQXJjaGl0ZWN0dXJlIEhhbmRib29rIHZlcnNpb24gMi4KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogRml4ZWQgc3BlY2lhbC1jYXNlIGRlY29kaW5nIGZvcgotIAlPUEVSQVRFX0ZPUk1BVF9DT0RFIHR5cGUgaW5zdHJ1Y3Rpb25zLiAgVGhlIGJ1ZyBjYXVzZWQgbXVscSB0byBiZQotIAlkaXNhc3NlbWJsZWQgYXMgb3IsIGZvciBleGFtcGxlLgotCi1XZWQgSmFuIDEwIDEyOjM3OjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBQcmludCBjYXNlcyAnaScgYW5kICd1JyBpbiBoZXguCi0JKF9wcmludF9pbnNuX21pcHMpOiBDaGFuZ2UgaSBmcm9tIGludCB0byB1bnNpZ25lZCBpbnQuCi0KLVRodSBKYW4gIDQgMTc6MjE6MTAgMTk5NiAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+Ci0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogdGxiaSBQT1dFUiBvcGNvZGUgZm9ybSBkaWZmZXJlbnQKLQlmcm9tIHRsYmllIFBvd2VyUEMgb3Bjb2RlLiAgQWRkIFBQQzYwMyB0bGJsZCBhbmQgdGxibGkuCi0KLVRodSBEZWMgMjggMTM6Mjk6MTkgMTk5NSAgSm9obiBIYXNzZXkgIDxoYXNzZXlAcnRwLmRnLmNvbT4KLQotCSogaTM4Ni1kaXMuYzogQWRkZWQgUGVudGl1bSBQcm8gaW5zdHJ1Y3Rpb25zLgotCi1UdWUgRGVjIDE5IDIyOjU2OjM1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChmc3FydHssLn0pOiBEdXBsaWNhdGUgZm9yIFBvd2VyUEMgaW4gYWRkaXRpb24gdG8KLQliZWluZyBmb3IgUG93ZXIyLgotCi1GcmkgRGVjIDE1IDE0OjE0OjE1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKHNoX25pYmJsZV90eXBlKTogQWRkZWQgUkVHX0IuCi0JKHNoX2FyZ190eXBlKTogQWRkZWQgQV9SRUdfQi4KLQkoc2hfdGFibGUpOiBBZGRlZCBwcmVmIGFuZCBiYW5rIHJlZyB2ZXJzaW9ucyBvZiBsZGMsIGxkYy5sLCBzdGMKLSAJYW5kIHN0Yy5sIG9wY29kZXMuCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBBZGRlZCBjYXNlcyBmb3IgUkVHX0IgYW5kIEFfUkVHX0IuCi0KLUZyaSBEZWMgMTUgMTY6NDQ6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBVc2UgbmV3IGJmZF9iaWdfZW5kaWFuIG1hY3JvLgotCi1UdWUgRGVjIDEyIDEyOjIyOjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBzdGFtcC1oLiAgRnJvbSBSb25hbGQKLQlGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT4uCi0KLVR1ZSBEZWMgIDUgMTM6NDI6NDQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JRnJvbSBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPjoKLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogZml4ZWQgZGVjb2Rpbmcgb2YgY3B5cwotIAlpbnN0cnVjdGlvbi4KLQotTW9uIERlYyAgNCAxMjoyOTowNSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChzaF9hcmdfdHlwZSk6IEFkZGVkIEFfU1NSIGFuZCBBX1NQQy4KLQkoc2hfdGFibGUpOiBBZGRlZCBtYW55IFNIMyBvcGNvZGVzLgotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogQWRkZWQgY2FzZXMgZm9yIEFfU1NSIGFuZCBBX1NQQy4KLQotRnJpIERlYyAgMSAwNzo0MjoxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoc3ViZmMuLCBzdWJmY28pOiBNYXJrIHRoaXMgUFBDQ09NLCBub3QgUFBDLgotCShzdWJjbyxzdWJjby4pOiBNYXJrIHRoaXMgUFBDLCBub3QgUFBDQ09NLgotCi1Nb24gTm92IDI3IDEzOjA5OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi43LgotCi1UdWUgTm92IDIxIDE4OjI4OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi42LgotCi1XZWQgTm92IDE1IDE5OjAyOjUzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNvcnQgbGlzdCBvZiBhcmNoaXRlY3R1cmVzLiAgQWNjZXB0IGJ1dCBkbyBub3RoaW5nCi0JZm9yIGFsbGlhbnQsIGNvbnZleCwgcHlyYW1pZCwgcm9tcCwgYW5kIHRhaG9lLgotCi1XZWQgTm92ICA4IDIwOjE4OjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYTI5ay1kaXMuYyAocHJpbnRfc3BlY2lhbCk6IENoYW5nZSBudW0gdG8gdW5zaWduZWQgaW50LgotCi1XZWQgTm92ICA4IDIwOjEwOjM1IDE5OTUgIEVyaWMgRnJldWRlbnRoYWwgPGZyZXVkZW50aGFsQG55dS5lZHU+Ci0KLQkqIGEyOWstZGlzLmMgKHByaW50X2luc24pOiBDYXN0IGluc24yNCB0byB1bnNpZ25lZCBsb25nIHdoZW4KLQlzaGlmdGluZyBpdC4KLQotVHVlIE5vdiAgNyAxNToyMTowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DSEVDS19QUk9HIHRvIGZpbmQgYW5kIGNhY2hlIEFSLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gTm92ICA2IDE3OjM5OjQ3IDE5OTUgIEhhcnJ5IERvbGFuICA8ZG9sYW5Ac3NkLmludGVsLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgY2FzZSBmb3IgYmZkX2k4NjBfYXJjaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE5vdiAgMyAxMjo0NTozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IENvcnJlY3QgZm1vdmVtbCBvcGVyYW5kcy4KLQkqIG02OGstZGlzLmMgKE5FWFRTSU5HTEUpOiBDaGFuZ2UgaSB0byB1bnNpZ25lZCBpbnQuCi0JKE5FWFRET1VCTEUpOiBMaWtld2lzZS4KLQkocHJpbnRfaW5zbl9tNjhrKTogRG9uJ3QgbWF0Y2ggZm1vdmVtbCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lCi0JcmVnaXN0ZXIgaW4gdGhlIGxpc3QuCi0JKHByaW50X2luc25fYXJnKTogSGFuZGxlIGEgcGxhY2Ugb2YgJzgnIGZvciBhIHR5cGUgb2YgJ0wnLgotCi1UaHUgTm92ICAyIDIzOjA2OjMzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogVXNlICNXIHJhdGhlciB0aGFuICN3LgotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgbmV3ICdXJyBwbGFjZS4KLQotV2VkIE5vdiAgMSAxMzozMDoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGQgZGJmdyBhcyBhbiBhbGlhcyBmb3IgZGJmLAotCWFuZCBsaWtld2lzZSBmb3IgYWxsIHRoZSBkYnh4IG9wY29kZXMuCi0KLU1vbiBPY3QgMzAgMjA6NTA6NDAgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGFyYy1kaXMuYzogSW5jbHVkZSBlbGYtYmZkLmggcmF0aGVyIHRoYW4gbGliZWxmLmguCi0KLU1vbiBPY3QgMjMgMTE6MTE6MzQgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAcGFzYW5kYS5jeWdudXMuY28udWs+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZGVkIHNob3J0aGFuZCAoVjEpIGZvciBJTlNOXzQxMDAgbWFuaWZlc3QuIEFkZGVkCi0gCXRoZSBWUjQxMDAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBtaXBzX29wY29kZXMgc3RydWN0dXJlLgotCi1UaHUgT2N0IDE5IDExOjA1OjIzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbiwgbXB3LW1ha2Uuc2VkOiBSZW1vdmUgdWdseSB3b3JrYXJvdW5kIGZvcgotCXVnbHkgTWV0cm93ZXJrcyBidWcgaW4gQ1c2LCBpcyBmaXhlZCBpbiBDVzcuCi0KLU1vbiBPY3QgMTYgMTI6NTk6MDEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKHdob2xlIGZpbGUpOiBBZGQgZmxhZ3MgZm9yIGNvbW1vbi9hbnkgc3VwcG9ydC4KLQotVHVlIE9jdCAxMCAxMTowNjowNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OKTogUmVtb3ZlIG1hY3JvLgotCShGTEFHU19UT19QQVNTKTogUmVtb3ZlIEJJU09OLgotCi1GcmkgT2N0ICA2IDE2OjI2OjQ1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9tNjhrKTogUmVjb2duaXplIGFsbCB0d28td29yZAotCWluc3RydWN0aW9ucyB0aGF0IHRha2Ugbm8gYXJncyBieSBsb29raW5nIGF0IHRoZSBtYXRjaCBtYXNrLgotICAJKHByaW50X2luc25fYXJnKTogQWx3YXlzIHByaW50ICIlIiBiZWZvcmUgcmVnaXN0ZXIgbmFtZXMuCi0JW2Nhc2UgJ2MnXTogVXNlICJuYyIgZm9yIHRoZSBuby1jYWNoZSBjYXNlLCBhcyByZWNvZ25pemVkIGJ5IGdhcy4KLQlbY2FzZSAnXyddOiBEb24ndCBwcmludCAiQCMiIGJlZm9yZSBhZGRyZXNzLgotCVtjYXNlICdKJ106IFVzZSAiJXMiIGFzIGZvcm1hdCBzdHJpbmcsIG5vdCByZWdpc3RlciBuYW1lLgotCVtjYXNlICdCJ106IFRyZWF0IHBsYWNlID09ICdDJyBsaWtlICdsJyBhbmQgJ0wnLgotCi1UaHUgT2N0ICA1IDIyOjE2OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpMzg2LWRpcy5jOiBEZXNjcmliZSBjbXB4Y2hnOGIgb3BlcmFuZCwgYW5kIHNwZWxsIHRoZSBvcGNvZGUKLQluYW1lIGNvcnJlY3RseS4KLQotVHVlIE9jdCAgMyAwODozMDoyMCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JRnJvbSBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBhbHBoYS1vcGMuaCAoTUVNT1JZX0ZVTkNUSU9OX0ZPUk1BVF9NQVNLKTogYWRkZWQuCi0gIAkoYWxwaGFfaW5zbl9zZXQpOiBhZGRlZCBkZWZpbml0aW9ucyBmb3IgVkFYIGZsb2F0aW5nIHBvaW50Ci0gCWluc3RydWN0aW9ucyAoVW5peCBjb21waWxlcnMgZG9uJ3QgZ2VuZXJhdGUgdGhlc2UsIGJ1dCBoYW5kY29kZWQKLSAJYXNzZW1ibHkgbWlnaHQgc3RpbGwgdXNlIHRoZW0pLgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IGFkZGVkIHN1cHBvcnQgZm9yIGRpc2Fzc2VtYmxpbmcKLSAJdGhlIG1pc2NlbGxhbmVvdXMgaW5zdHJ1Y3Rpb25zIGluIHRoZSBBbHBoYSBpbnN0cnVjdGlvbiBzZXQuCi0KLVR1ZSBTZXAgMjYgMTg6NDc6MjAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgbTY4ay1vcGMuYy5vIHRvIEJGRF9NQUNISU5FUyBmb3IgbTY4aywKLQlubyBsb25nZXIgY3JlYXRlIHN5c2RlcC5oLCBzZWQgcHBjLW9wYy5jIHRvIHdvcmsgYXJvdW5kIGEKLQlzZXJpb3VzIE1ldHJvd2Vya3MgQyBidWcuCi0JKiBtcHctbWFrZS5pbjogUmVtb3ZlLgotCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgdXNlZCBieSBtcHctY29uZmlndXJlIHRvIGVkaXQKLQlNYWtlZmlsZS5pbiBpbnRvIGFuIE1QVyBtYWtlZmlsZS4KLQotV2VkIFNlcCAyMCAxMjo1NToyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KLQotVHVlIFNlcCAxOSAxNToyODozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IFNwbGl0IHBtb3ZlIHBhdHRlcm5zIHdoaWNoIHVzZSAnUCcgaW50byBwYXR0ZXJucwotCXdoaWNoIHVzZSAnMCcsICcxJywgYW5kICcyJyBpbnN0ZWFkLiAgU3BlY2lmeSB0aGUgcHJvcGVyIHNpemUgZm9yCi0JYSBwbW92ZSBpbW1lZGlhdGUgb3BlcmFuZC4gIENvcnJlY3QgdGhlIHBtb3ZlZmQgcGF0dGVybnMgdG8gYmUKLQltb3ZlcyB0byBhIHJlZ2lzdGVyLCBub3QgZnJvbSBhIHJlZ2lzdGVyLgotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBSZXBsYWNlICdQJyB3aXRoICcwJywgJzEnLCAnMicuCi0KLVRodSBTZXAgMTQgMTE6NTg6MjIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBNYXJrIGFsbCBpbnNucyB0aGF0IHJlZmVyZW5jZQotCSVwc3IsICV3aW0sICV0YnIgYXMgRl9OT1RWOS4KLQotRnJpIFNlcCAgOCAwMTowNzozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IEp1c3QgcmVidWlsZCBNYWtlZmlsZSB3aGVuIHJ1bm5pbmcKLQljb25maWcuc3RhdHVzLgotCShjb25maWcuaCwgc3RhbXAtaCk6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NPTkZJR19IRUFERVIgYW5kIEFDX0NBTk9OSUNBTF9TWVNURU0KLQllYXJsaWVyLiAgRG9uJ3QgYm90aGVyIHRvIGNhbGwgQUNfQVJHX1BST0dSQU0uICBUb3VjaCBzdGFtcC1oIHdoZW4KLQlyZWJ1aWxkaW5nIGNvbmZpZy5oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBtaXBzLW9wYy5jOiBDaGFuZ2UgdW5hbGlnbmVkIGxvYWRzIGFuZCBzdG9yZXMgd2l0aCAidCxBIgotCW9wZXJhbmRzIHRvIHVzZSAidCxBKGIpIi4KLQotVGh1IFNlcCAgNyAxOTowMjo0NiAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IEFkZCBGX0ZSMCBzdXBwb3J0LgotCi1UaHUgU2VwICA3IDE5OjAyOjQ2IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogQ2hhbmdlIGxvb3Agb3ZlciBvcC0+YXJnW25dIHRvIGl0ZXJhdGUKLQl1bnRpbCAzIGluc3RlYWQgb2YgdW50aWwgMi4KLQotV2VkIFNlcCAgNiAyMToyMTozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogRGVmaW5lLgotCSguYy5vLCBkaXNhc3NlbWJsZS5vKTogVXNlICQoQUxMX0NGTEFHUykuCi0JKE1PU1RMWUNMRUFOKTogQWRkIGNvbmZpZy5sb2cuCi0JKGRpc3RjbGVhbik6IERvbid0IHJlbW92ZSBjb25maWcubG9nLgotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIEhERUZJTkVTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgU2VwICA2IDE1OjA4OjA5IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKHNoX2FyZ190eXBlKTogQWRkIEZfRlIwLgotCShzaF90YWJsZSwgY2FzZSBmbWFjKTogQWRkIEZfRlIwIGFzIGZpcnN0IGFyZ3VtZW50LgotCi1XZWQgU2VwICA2IDE1OjA4OjA5IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKHNoX29wY29kZV9pbmZvKTogSW5jcmVhc2UgYXJnIGFycmF5IHNpemUgdG8gNC4KLQotVHVlIFNlcCAgNSAxODoyODoxMCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYzogUmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIE5PX1Y5LgotCi1UdWUgU2VwICA1IDIwOjAzOjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogSnVzdCBpbmNsdWRlIC4uL2JmZC9hY2xvY2FsLm00LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwICA1IDE2OjA5OjU5IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChYX0RJU1AxOSk6IERlZmluZS4KLQkocHJpbnRfaW5zbiwgY2FzZSAnRycpOiBVc2UgaXQuCi0JKHByaW50X2luc24sIGNhc2UgJ0wnKTogU2lnbiBleHRlbmQgZGlzcGxhY2VtZW50LgotCi1Nb24gU2VwICA0IDE0OjI4OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSdW4gLi4vYmZkL2NvbmZpZ3VyZS5ob3N0IGJlZm9yZSBBQ19QUk9HX0NDLgotCVN1YnNpdHV0ZSBDRkxBR1MgYW5kIEFSLiAgQ2FsbCBBQ19QUk9HX0lOU1RBTEwuICBEb24ndCBzdWJzdGl0dXRlCi0JaG9zdF9tYWtlZmlsZV9mcmFnIG9yIGZyYWdzLgotCSogYWNsb2NhbC5tNDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfUFJPR1JBTSk6IFNldCB0byBASU5TVEFMTF9QUk9HUkFNQC4KLQkoSU5TVEFMTF9EQVRBKTogU2V0IHRvIEBJTlNUQUxMX0RBVEFALgotCShBUik6IFNldCB0byBAQVJALgotCShBUl9GTEFHUyk6IFNldCB0byByYyByYXRoZXIgdGhhbiBxYy4KLQkoQ0MpOiBEZWZpbmUgYXMgQENDQC4KLQkoQ0ZMQUdTKTogU2V0IHRvIEBDRkxBR1NALgotCShAaG9zdF9tYWtlZmlsZV9mcmFnQCk6IFJlbW92ZS4KLQkoY29uZmlnLnN0YXR1cyk6IFJlbW92ZSBkZXBlbmRlbmN5IHVwb24gQGZyYWdzQC4KLQotCSogY29uZmlndXJlLmluOiAuLi9iZmQvY29uZmlnLmJmZCBub3cganVzdCBzZXRzIHNoZWxsIHZhcmlhYmxlcy4KLQlVc2UgdGhlbSByYXRoZXIgdGhhbiBsb29raW5nIHRocm91Z2ggdGFyZ2V0IE1ha2VmaWxlIGZyYWdtZW50cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEF1ZyAzMSAxMjozNTozMiAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChmdHJjKTogQ2hhbmdlIEZQVUxfTiB0byBGUFVMX00uCi0KLVdlZCBBdWcgMzAgMTM6NTI6MjggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBEZWxldGUgZHVwbGljYXRlIHdyICV5IGluc24uCi0JQWRkIGNscngsIGlwcmVmZXRjaCwgc2lnbngsIGNscnV3LCBjYXMsIGNhc2wsIGNhc3gsIGNhc3hsIHN5bnRoZXRpYwotCXNwYXJjNjQgaW5zbnMuCi0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRml4IHByZWZldGNoYSBpbnNuLgotCShsb29rdXBfe25hbWUsdmFsdWV9KTogTmV3IGZ1bmN0aW9ucy4KLQkocHJlZmV0Y2hfdGFibGUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShzcGFyY197ZW5jb2RlLGRlY29kZX1fcHJlZmV0Y2gpOiBOZXcgZnVuY3Rpb25zLgotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc24pOiBIYW5kbGUgJyonIGFyZyAocHJlZmV0Y2ggZnVuY3Rpb24pLgotCi1XZWQgQXVnIDMwIDExOjExOjU4IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmg6IEFkZCBibGFuayBsaW5lcyB0byBpbXByb3ZlIHJlYWRhYmlsaWx0eSBvZiBzaDNlCi0JaW5zdHJ1Y3Rpb25zLgotCi1XZWQgQXVnIDMwIDExOjA5OjM4IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtZGlzLmM6IENvcnJlY3QgY29tbWVudCBvbiBmaXJzdCBsaW5lIG9mIGZpbGUuCi0KLVR1ZSBBdWcgMjkgMTU6Mzc6MTggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogSGFuZGxlIGJmZF9tYWNoX3NwYXJjNjQuCi0KLQkqIHNwYXJjLW9wYy5jIChhc2ksIG1lbWJhcik6IE5ldyBzdGF0aWMgbG9jYWxzLgotCShzcGFyY197ZW5jb2RlLGRlY29kZX1fe2FzaSxtZW1iYXJ9KTogTmV3IGZ1bmN0aW9ucy4KLQkoc3BhcmNfb3Bjb2RlcywgbWVtYmFyIGluc24pOiBGaXguCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbik6IENhbGwgc3BhcmNfZGVjb2RlX2FzaS4KLQlTdXBwb3J0IGRlY29kaW5nIG9mIG1lbWJhciBtYXNrcy4KLQkoWF9NRU1CQVIpOiBEZWZpbmUuCi0KLVNhdCBBdWcgMjYgMjE6MjI6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZV9hbGlhc2VzKTogQWRkIGJyLCBicnMsIGJyYiwgYnJ3LCBicmwuCi0KLU1vbiBBdWcgMjEgMTc6MzM6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZV9hbGlhc2VzKTogQWRkIGJoaWIgYXMgYW4gYWxpYXMgZm9yIGJoaXMsCi0JYW5kIGxpa2V3aXNlIGZvciB0aGUgb3RoZXIgYnJhbmNoZXMuICBBZGQgYmhzIGFzIGFuIGFsaWFzIGZvciBiY2MsCi0JYW5kIGxpa2V3aXNlIGZvciB0aGUgc2l6ZSB2YXJpYW50cy4gIEFkZCBkYmhzIGFzIGFuIGFsaWFzIGZvcgotCWRiY2MuCi0KLUZyaSBBdWcgMTEgMTM6NDA6MjQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNoLW9wYy5oIChGUCBzdHMgaW5zdHJ1Y3Rpb25zKTogVXBkYXRlIHRvIG1hdGNoIHJlYWxpdHkuCi0KLU1vbiBBdWcgIDcgMTY6MTI6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jOiAoZnBjcl9uYW1lcyk6IEFkZCAlIGJlZm9yZSBhbGwgcmVnaXN0ZXIgbmFtZXMuCi0JKHJlZ19uYW1lcyk6IExpa2V3aXNlLgotCShwcmludF9pbnNuX2FyZyk6IERvbid0IGV4cGxpY2l0bHkgcHJpbnQgJSBiZWZvcmUgcmVnaXN0ZXIgbmFtZXMuCi0JQWRkICUgYmVmb3JlIHJlZ2lzdGVyIG5hbWVzIGluIHN0YXRpYyBhcnJheSBuYW1lcy4gIEluIGNhc2UgJ3InLAotCXByaW50IGRhdGEgcmVnaXN0ZXJzIGFzIGBAKERuKScsIG5vdCBgRG5AJy4gIFdoZW4gcHJpbnRpbmcgYQotCW1lbW9yeSBhZGRyZXNzLCBkb24ndCBwcmludCBAIyBiZWZvcmUgaXQuCi0JKHByaW50X2luZGV4ZWQpOiBDaGFuZ2UgYmFzZV9kaXNwIGFuZCBvdXRlcl9kaXNwIGZyb20gaW50IHRvCi0JYmZkX3ZtYS4gIFByaW50IHVzaW5nIE1JVCBzeW50YXgsIG5vdCBtdXRhbnQgaW52YWxpZCBNb3Rvcm9sYQotCXN5bnRheC4gIFNpZ24gZXh0ZW5kIDggYnl0ZSBkaXNwbGFjZW1lbnQgY29ycmVjdGx5LgotCShwcmludF9iYXNlKTogUHJpbnQgdXNpbmcgTUlUIHN5bnRheC4gIFByaW50IHpwYyB3aGVuIGFwcHJvcHJpYXRlLgotCUNoYW5nZSBwYXJhbWV0ZXIgZGlzcCBmcm9tIGludCB0byBiZmRfdm1hLgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZV9hbGlhc2VzKTogQWRkIGpzcmwgYW5kIGpzcnMgYXMgYWxpYXNlcwotCWZvciBqc3IuCi0KLU1vbiBBdWcgIDcgMDI6MjE6NDAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlcyBGX1JFR19OLAotCUZfUkVHX00sIEZQU0NSX00sIEZQU0NSX04sIEZQVUxfTSBhbmQgRlBVTF9OLgotCSogc2gtb3BjLmggKHNoX2FyZ190eXBlKTogQWRkIG5ldyBvcGVyYW5kIHR5cGVzLgotCShzaF90YWJsZSk6IEFkZCBuZXcgb3Bjb2RlcyBmcm9tIFNIM0UgRmxvYXRpbmcgUG9pbnQgSVNBLgotCi1TYXQgQXVnICA1IDE2OjUwOjE0IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIGdlbmVyYXRlZCBmaWxlIGNvbmZpZy5oLgotCi1TYXQgQXVnICA1IDE2OjUwOjE0IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIGdlbmVyYXRlZCBmaWxlIGNvbmZpZy5oLgotCi1XZWQgQXVnICAyIDE4OjMzOjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogTmV3IGZpbGUsIGhvbGRpbmcgdGFibGVzIGZyb20gaW5jbHVkZS9vcGNvZGUvbTY4ay5oLgotCUNsZWFuIHVwIHRhYmxlcy4KLQkqIG02OGstZGlzLmM6IFJlbW92ZSBCUkVBS19VUF9CSUdfREVDTCBzdHVmZi4KLQkob3Bjb2RlKTogUmVtb3ZlLgotCShwcmludF9pbnNuX202OGspOiBDaGFuZ2UgZCB0byBiZSBjb25zdC4gIFVzZSBtNjhrX251bW9wY29kZXMKLQlyYXRoZXIgdGhhbiBudW1vcGNvZGVzLiAgVXNlIG02OGtfb3Bjb2RlcyByYXRoZXIgdGhhbiByZW1vdmVkCi0Jb3Bjb2RlIGZ1bmN0aW9uLiAgRG9uJ3QgY2hlY2sgRl9BTElBUy4KLQkocHJpbnRfaW5zbl9hcmcpOiBDaGFuZ2UgZmlyc3QgcGFyYW1ldGVyIHRvIGJlIGNvbnN0IGNoYXIgKi4KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgbTY4ay1vcGMuby4KLQkobTY4ay1vcGMubyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIG02OGstb3BjLm8gZm9yIGJmZF9tNjhrX2FyY2guCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBBdWcgIDIgMDg6MjM6MzggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKEhBU0hfU0laRSwgSEFTSF9JTlNOKTogRGVmaW5lLgotCShvcGNvZGVfYml0cywgb3Bjb2RlX2hhc2hfdGFibGUpOiBOZXcgdmFyaWFibGVzLgotCShvcGNvZGVzX2luaXRpYWxpemVkKTogUmVuYW1lZCBmcm9tIG9wY29kZXNfc29ydGVkLgotCShidWlsZF9oYXNoX3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCShpc19kZWxheWVkX2JyYW5jaCk6IFVzZSBoYXNoIHRhYmxlLgotCShwcmludF9pbnNuKTogUmVuYW1lZCBmcm9tIHByaW50X2luc25fc3BhcmMsIG1hZGUgc3RhdGljLgotCUJ1aWxkIGFuZCB1c2UgaGFzaCB0YWJsZS4gIElmICFzcGFyYzY0LCBpZ25vcmUgc3BhcmM2NCBpbnNucywKLQlhbmQgdmljZS12ZXJzYSBpZiBzcGFyYzY0LgotCShwcmludF9pbnNuX3NwYXJjLCBwcmludF9pbnNuX3NwYXJjNjQpOiBOZXcgZnVuY3Rpb25zLgotCShjb21wYXJlX29wY29kZXMpOiBNb3ZlIHNwYXJjNjQgb3Bjb2RlcyB0byBlbmQuCi0JUHJpbnQgY29tbXV0YXRpdmUgaW5zbnMgd2l0aCBjb25zdGFudCBzZWNvbmQuCi0JKiBzcGFyYy1vcGMuYyAoYWxsIG5vbi12OSBpbnNucyk6IFVzZSBmbGFnIEZfTk9UVjkgaW5zdGVhZCBvZiBGX0FMSUFTLgotCi1UdWUgQXVnICAxIDAwOjEyOjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogUmVtb3ZlIHVudXNlZCBsb2NhbCBkc2xvdC4gIFVzZQotCXByaW50X2FkZHJlc3NfZnVuYyBmb3IgQV9CRElTUDEyIGFuZCBBX0JESVNQOC4gIENvcnJlY3QgdGVzdCB3aGljaAotCWF2b2lkcyBwcmludGluZyBhIGRlbGF5IHNsb3QgaW4gYSBkZWxheSBzbG90LgotCSogc2gtb3BjLmggKHNoX3RhYmxlKTogRnVsbHkgYnJhY2tldCBsYXN0IGVudHJ5LgotCi1Nb24gSnVsIDMxIDEyOjA0OjQ3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzbGx4LCBzcmF4LCBzcmx4KTogRml4IGRpc2Fzc2VtYmx5LgotCi1XZWQgSnVsIDEyIDAwOjU5OjM0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1wYy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEdldCBob3N0X21ha2VmaWxlX2ZyYWcgZnJvbSAke3NyY2Rpcn0uCi0KLQkqIGNvbmZpZ3VyZS5pbjogQXV0b2NvbmZpc2NhdGVkLiAgQ2hlY2sgZm9yIHN0cmluZ1tzXS5oLiAgQ3JlYXRlCi0JY29uZmlnLmggZnJvbSBjb25maWcuaW4uICBEb24ndCBzZXQgdXAgc3lzZGVwLmggbGluay4KLQkqIHN5c2RlcC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBOZXcgZmlsZXMsIGdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5pbi4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIHRvIGJlIHByb2Nlc3NlZCBhdXRvY29uZi1zdHlsZS4KLQkoZGlzdGNsZWFuKTogS2VlcCBzeXNkZXAuaC4gIFJlbW92ZSBjb25maWcubG9nIGFuZCBjb25maWcuY2FjaGUuCi0JKE1ha2VmaWxlKTogRGVwZW5kIG9uIGNvbmZpZy5zdGF0dXMuCi0JKGNvbmZpZy5zdGF0dXMpOiBOZXcgcnVsZS4KLQkqIGNvbmZpZ3VyZS5iYXQ6IFVwZGF0ZSBNYWtlZmlsZSBzdWJzdGl0dXRpb25zLgotCi1UdWUgSnVsIDExIDE0OjIzOjM3IDE5OTUgIEplZmYgU3BpZWdlbCAgPGplZmZzQGxzaWwuY29tPgotCi0JKiBtaXBzLW9wYy5jIChMMSk6IERlZmluZS4KLQkobWlwc19vcGNvZGVzKTogQWRkIFI0MDEwIGluc3RydWN0aW9uczogZmx1c2hpLCBmbHVzaGQsIGZsdXNoaWQsCi0JYWRkY2l1LCBtYWRkLCBtYWRkdSwgZmZjLCBmZnMsIG1zdWIsIG1zdWJ1LCBzZWxzaSwgc2Vsc3IsIHdhaXRpLAotCWFuZCB3Yi4KLQotVHVlIEp1bCAxMSAxMTo0OTo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfb3Bjb2Rlcyk6IEZvciB0aGUgbW92ZSBwc2V1ZG8tb3AsIHByZWZlciBkYWRkdQotCWlmIElTQSAzIGFuZCBhZGR1IG90aGVyd2lzZSwgcmVwbGFjaW5nIG9yLCBzaW5jZSBzb21lIE1JUFMgY2hpcHMKLQloYXZlIG11bHRpcGxlIGFkZCB1bml0cyBidXQgb25seSBhIHNpbmdsZSBsb2dpY2FsIHVuaXQuCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGVyYW5kcyk6IENoYW5nZSBDUiB0byB1c2UgYSBiaXRzaXplIG9mIDMsCi0Jc2hpZnRlZCBieSAxOCwgd2l0aG91dCBhbnkgaW5zZXJ0aW9uIG9yIGV4dHJhY3Rpb24gZnVuY3Rpb24uCi0JKGluc2VydF9jciwgZXh0cmFjdF9jcik6IFJlbW92ZS4KLQotV2VkIEp1biAyMSAyMDowNTozOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZywgcHJpbnRfaW5kZXhlZCk6IFByaW50ICIlIiBiZWZvcmUKLQlyZWdpc3RlciBuYW1lcy4KLQotVGh1IEp1biAxNSAxNzoyMzozMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBzaCBhbmQgaTM4NiBjb25maWdzLCByZW1vdmUgc3BhcmMgY29uZmlnLgotCSogc2gtb3BjLmg6IEFkZCBjb3B5cmlnaHQuCi0KLU1vbiBKdW4gIDUgMDM6MzA6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY3J1bmNoLW02OGspOiBEZWxldGUgZXh0cmEgdGFyZ2V0IGFjY2lkZW50YWxseQotCWNoZWNrZWQgaW4gYSB3aGlsZSBhZ28uCi0KLVdlZCBNYXkgMjQgMTY6MjI6MTMgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoc2hfdGFibGUpOiBBZGQgU0gzIHN1cHBvcnQuCi0KLVdlZCBNYXkgMjQgMTQ6MTY6MDggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmg6IEFkZGVkIGJzcmYgYW5kIGJyYWYuCi0KLVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIGFybS1vcGMuaCAoYXJtX29wY29kZXMpOiBBZGQgNjQtYml0IG11bHRpcGx5IHBhdHRlcm5zLiAgRGVsZXRlCi0JYm9ndXMgW2xzXWZte2VhLGZkfSBwYXR0ZXJucy4KLQotCSogYXJtLW9wYy5oIChhcm1fb3Bjb2Rlcyk6IENvcnJlY3QgdHlwb3MgaW4gc3RtLCBsZG0sIHN0ZCwgYW5kIGxkYy4KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBNYWtlIEdJVkVOIGEgcGFyYW1ldGVyLCBkb24ndCB0cnkgYW5kCi0JaW5pdGlhbGl6ZSBpdCBmcm9tIG1lbW9yeS4gIE1ha2UgZnVuY3Rpb24gc3RhdGljLgotCShwcmludF9pbnNuX3tiaWcsbGl0dGxlfV9hcm0pOiBOZXcgZnVuY3Rpb25zLgotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyLCBjYXNlIGJmZF9hcmNoX2FybSk6IERpc2Fzc2VtYmxlIGZvcgotCXRoZSBjb3JyZWN0IGVuZGlhbm5lc3MuCi0KLU1vbiBBcHIgMjQgMTQ6MTg6MDUgMTk5NSAgSmFzb24gTW9sZW5kYSAgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoc2hfbmliYmxlX3R5cGUsIHNoX2FyZ190eXBlKTogcmVtb3ZlIHRyYWlsaW5nICwgZnJvbQotCWVudW0gbGlzdC4KLQotV2VkIEFwciAxOSAxNDowNzowMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmMgKG9wY29kZSk6IEZpbmlzaCBjaGFuZ2UgbWFkZSBieSBLdW5nIEhzdSBvbiBBcHJpbAotCTE3dGgsIHNvIHRoYXQgaXQgYnVpbGRzIGFnYWluIHVzaW5nIEdDQyBhcyB0aGUgY29tcGlsZXIuCi0KLVR1ZSBBcHIgMTggMTI6MTQ6NTEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9saXR0bGVfbWlwcyk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20KLQliZmRfZ2V0bDMyIGZyb20gYmZkX3ZtYSB0byB1bnNpZ25lZCBsb25nLCBiZWNhdXNlIF9wcmludF9pbnNuX21pcHMKLQlleHBlY3RzIGFuIHVuc2lnbmVkIGxvbmcsIGFuZCB0aGF0IG1pZ2h0IGJlIGZld2VyIHdvcmRzIG9mCi0JYXJndW1lbnQgc3RvcmFnZSAoZS5nLiwgaWYgYmZkX3ZtYSBpcyBsb25nIGxvbmcgb24gYSAzMi1iaXQKLQltYWNoaW5lKS4KLQkocHJpbnRfaW5zbl9iaWdfbWlwcyk6IExpa2V3aXNlIHdpdGggYmZkX2dldGIzMiB2YWx1ZS4KLQkoX3ByaW50X2luc25fbWlwcyk6IE5vdyBzdGF0aWMuCi0KLU1vbiBBcHIgMTcgMTI6MjM6MjggMTk5NSAgS3VuZyBIc3UgIDxrdW5nQHJ0bC5jeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jOiBUYWtlIG91dCAjZGVmaW5lIEJSRUFLX1VQX0JJR19ERUNMIGtsdWRnZSwgYmVjYXVzZQotCWdjYyBtZW1vcnkgaG9nIHByb2JsZW0gd2l0aCBpbml0aWFsaXplciBpcyBmaXhlZC4KLQotTW9uIEFwciAxMCAxNTo1NTowMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlNZXJnZSBpbiBzdXBwb3J0IGZvciBNYWMgTVBXIGFzIGEgaG9zdC4KLQkoT2xkIGNoYW5nZSBkZXNjcmlwdGlvbnMgcmV0YWluZWQgZm9yIGluZm9ybWF0aW9uYWwgdmFsdWUuKQotCi0JKiBtcHctY29uZmlnLmluIChhcmNobmFtZSk6IENvbXB1dGUgZnJvbSB0aGUgY29uZmlnLgotCShCRkRfTUFDSElORVMsIEFSQ0hERUZTKTogUHV0IGludG8gbWsudG1wLgotCi0JKiBtcHctY29uZmlnLmluICh0YXJnZXRfYXJjaCk6IENvbXB1dGUgZnJvbSBjYW5vbmljYWwgdGFyZ2V0LgotCShtNjhrLCBtaXBzLCBwb3dlcnBjLCBzcGFyYyk6IEFkZCBhcmNoaXRlY3R1cmVzLgotCSogbXB3LW1ha2UuaW4gKGRpc2Fzc2VtYmxlLmMubyk6IEFkZC4KLQkoQUxMX0NGTEFHUyk6IFJlbW92ZSBzcGVjaWFsIGZsYWdzICgtbWM2ODAyMCAtbWM2ODg4MSAtbW9kZWwgZmFyKS4KLQotCSogbXB3LWNvbmZpZy5pbiAoQkZEX01BQ0hJTkVTKTogU2V0IHRvIGEgZGVmYXVsdCB2YWx1ZS4KLQkqIG1wdy1tYWtlLmluIChCRkRfTUFDSElORVMpOiBSZW1vdmUgd2lyZWQtaW4gdmFsdWUuCi0KLQkqIG1wdy1tYWtlLmluIChDU0VBUkNIKTogQWRkIGV4dHJhLWluY2x1ZGUgdG8gc2VhcmNoIHBhdGguCi0KLQkqIG1wdy1jb25maWcuaW4gKHZhcmFyZ3MuaCk6IERvbid0IGNyZWF0ZS4KLQkoc3lzZGVwLmgpOiBDcmVhdGUgdXNpbmcgZm9yd2FyZC1pbmNsdWRlLgotCSogbXB3LW1ha2UuaW4gKENTRUFSQ0gpOiBBZGQgaW5jbHVkZS9tcHcgdG8gc2VhcmNoIHBhdGguCi0KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBjb25maWd1cmUuaW4uCi0JKiBtcHctbWFrZS5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIE1ha2VmaWxlLmluLgotCi1GcmkgTWFyIDMxIDE0OjIzOjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogUHV0IGVtcHR5IHN0YXRlbWVudCBhZnRlcgotCWRlZmF1bHQgbGFiZWwuCi0KLVR1ZSBNYXIgMjEgMTA6NTE6NDAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmMgKHNpZ25fZXh0ZW5kKTogRGVsZXRlLCByZWR1bmRhbnQgd2l0aCBsaWJocHBhLmggdmVyc2lvbi4KLQkobG93X3NpZ25fZXh0ZW5kKTogTGlrZXdpc2UuCi0JKGdldF9maWVsZCk6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKHNldF9maWVsZCwgZGVwb3NpdF8xNCwgZGVwb3NpdF8yMSk6IExpa2V3aXNlLgotCi1GcmkgTWFyIDE3IDE1OjU1OjUzIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYzogU3VwcG9ydCBmb3IgbW9yZSBwZW50aXVtIG9wY29kZXMuICBGcm9tIEd1eSBIYXJyaXMKLQkgIChndXlAbmV0YXBwLmNvbSkuCi0KLVR1ZSBNYXIgMTQgMDA6NTI6NTcgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQlTYXQgRmViIDExIDE3OjIyOjQxIDE5OTUgIEtsYXVzIEthZW1wZiAgKGtrYWVtcGZAZGlkeW11cy5ybWkuZGUpCi0KLQkqIGFscGhhLW9wYy5oIChPU0ZfQVNNQ09ERSk6IGRlZmluZQotCXByaW50IHBhbC1jb2RlIG5hbWVzIGFzIGRlZmluZWQgaW4gQXBwIEMgb2YgdGhlCi0JQWxwaGEgQXJjaGl0ZWN0dXJlIFJlZmVyZW5jZSBNYW51YWwKLQotCSogYWxwaGEtZGlzLmM6IGNsZWFuZWQgdXAgb3V0cHV0Ci0JcHJpbnQgc3R5bGl6ZWQgY29kZSBmb3JtcyBhcyBkZWZpbmVkIGluIEFwcCBBLjQuMyBvZiB0aGUKLQlBbHBoYSBBcmNoaXRlY3R1cmUgUmVmZXJlbmNlIE1hbnVhbAotCi1XZWQgTWFyICA4IDE1OjIxOjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIG5ldyBtaXBzNCBpbnN0cnVjdGlvbnMuICBEb24ndCBzZXQgSU5TTl9SRkUgZm9yCi0JYHJmZScuCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSBuZXcgYXJndW1lbnQgdHlwZXMgJ2gnLCAnUicsCi0JJ04nLCBhbmQgJ00nLgotCi1XZWQgTWFyICA4IDAyOjU0OjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG02OGstZGlzLmMgKG9wY29kZSk6IE5ldyBmdW5jdGlvbi4gIFJldHVybnMgYWRkcmVzcyBvZiBvcGNvZGUKLQl0YWJsZSBlbnRyeSBnaXZlbiBpbmRleCwgZXZlbiBpZiB0aGUgb3Bjb2RlIHRhYmxlIHdhcyBzcGxpdCB0bwotCXdvcmsgYXJvdW5kIGdjYyBidWdzLgotCShwcmludF9pbnNuX202OGspOiBDYWxsIG9wY29kZSBpbnN0ZWFkIG9mIHJlZmVyZW5jaW5nIG02OGtfb3Bjb2RlcwotCWRpcmVjdGx5LgotCShCUkVBS19VUF9CSUdfREVDTCk6IE1ha2Ugc2Vjb25kYXJ5IGFycmF5IHN0YXRpYyBhbmQgY29uc3QuCi0JKHJlZ19uYW1lcyk6IE5vdyBjb25zdC4KLQkocHJpbnRfaW5zbl9hcmcpOiBBcnJheXMgY2FjaGVGaWVsZE5hbWUgYW5kIG5hbWVzIG5vdyBjb25zdC4KLQkocHJpbnRfaW5kZXhlZCk6IEFycmF5IHNjYWxlcyBub3cgY29uc3QuCi0KLVR1ZSBNYXIgIDcgMTY6NDE6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmM6IFNvcnQgcmVjZW50bHkgYWRkZWQgaW5zdHJ1Y3Rpb25zIGJ5IG1pbm9yIG9wY29kZQotCW51bWJlciB3aXRoaW4gbWFqb3Igb3Bjb2RlIG51bWJlci4KLQotTW9uIE1hciAgNiAxMDowNDozNiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYzogSW5jbHVkZSBsaWJocHBhLmguCi0KLUZyaSBGZWIgMjQgMTk6MTU6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBDaGFuZ2UgZGxpIHRvIHVzZSBNX0RMSSwgYW5kIGFkZCBkbGEuCi0KLU1vbiBGZWIgMjAgMjM6NTQ6MzggMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogIEFkZCB3NjUtZGlzLm8uCi0KLVRodSBGZWIgMTYgMTc6MzQ6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgcjQ2NTAgbXVsIGluc3RydWN0aW9uLgotCi1XZWQgRmViIDE1IDE1OjQ1OjIwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIHVsZCBhbmQgdXNkIG1hY3JvcyBmb3IgdW5hbGlnbmVkIGRvdWJsZSBsb2FkIGFuZAotICAgICAgICBzdG9yZS4KLQotVHVlIEZlYiAxNCAxMzoxNzozNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogQWRkIDQwM0dBIG9wY29kZXMgcmZjaSwgZGNjY2ksCi0JbWZkY3IsIG10ZGNyLCBpY2J0LCBpY2NjaS4KLQotVGh1IEZlYiAgOSAxMjoyODoxMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGk5NjAtZGlzLmMgKHN0cnVjdCB0YWJlbnQsIHN0cnVjdCBzcGFyc2VfdGFiZW50KTogQ2hhbmdlIHRoZQotICAgICAgICBzaWduZWQgY2hhciBmaWVsZHMgdG8gc2hvcnRzLCBtb3JlIHBvcnRhYmxlLgotCi1XZWQgRmViICA4IDE3OjI5OjI5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogaTk2MC1kaXMuYyAoc3RydWN0IHRhYmVudCwgc3RydWN0IHNwYXJzZV90YWJlbnQpOiBEZWNsYXJlIHRoZQotICAgICAgICBjaGFyIGZpZWxkcyBhcyBzaWduZWQgY2hhcnMsIHNpbmNlIHRoZXkgbWF5IGhhdmUgbmVnYXRpdmUgdmFsdWVzLgotCi1Nb24gRmViICA2IDEwOjUyOjA2IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2X3R3b2J5dGUpOiBBZGQgY3B1aWQsIEZyb20gQ2hhcmxlcyBIYW5udW0KLQkgIChteWNyb2Z0QG5ldGJzZC5vcmcpLgotCi1Nb24gSmFuIDMwIDEyOjM4OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gIkxvZ2csIEVkIiA8ZWxvZ2dAZWEuY29tPjoKLQkqIHBwYy1vcGMuYyAoZXh0cmFjdF9iZG0pOiBDb3JyZWN0IHBhcmVudGhlemlzYXRpb24uCi0JKiBwcGMtZGlzLmMgKHByaW50X2luc25fcG93ZXJwYyk6IFByaW50IC5sb25nIGJlZm9yZSB1bnJlY29nbml6ZWQKLQl2YWx1ZS4KLQotVGh1IEphbiAyNiAxODozMjowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYzogQ2hhbmdlcyBiYXNlZCBvbiBwYXRjaCBmcm9tIERhdmlkIEVkZWxzb2huCi0JPGVkZWxzb2huQG1ocGNjLmVkdT4uCi0JKHBvd2VycGNfb3BlcmFuZHMpOiBBZGQgb3BlcmFuZHMgU1BSQkFUIGFuZCBTUFJHLiBTcGxpdCBUQlIgb3V0IG9mCi0JU1BSLgotCShGWE1fTUFTSyk6IERlZmluZS4KLQkoaW5zZXJ0X3Ricik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGV4dHJhY3RfdGJyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoWEZYRlhNX01BU0ssIFhGWE0pOiBEZWZpbmUuCi0JKFhTUFJCQVRfTUFTSywgWFNQUkdfTUFTSyk6IERlZmluZS4KLQkocG93ZXJwY19vcGNvZGVzKTogQWRkIGluc3RydWN0aW9ucyB0byBhY2Nlc3Mgc3BlY2lhbCByZWdpc3RlcnMgYnkKLQluYW1lLiAgQWRkIG10Y3IgYW5kIG1mdGJ1LgotCi1UdWUgSmFuIDE3IDEwOjU2OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoUDMpOiBEZWZpbmUuCi0JKG1pcHNfb3Bjb2Rlcyk6IEFkZCBtYWQgYW5kIG1hZHUuCi0KLVN1biBKYW4gMTUgMTY6MzI6NTkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIFc2NSBzdXBwb3J0LgotCSogZGlzYXNzZW1ibGUuYzogTGlrZXdpc2UuCi0JKiB3NjUtb3BjLmgsIHc2NS1kaXMuYzogTmV3IGZpbGVzLgotCi1XZWQgRGVjIDI4IDIyOjE1OjMzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBBZGQgc3VwcG9ydCBmb3IgMiBiaXQKLQlpbW1lZGlhdGVzLgotCi1UdWUgRGVjIDIwIDExOjI1OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIGRsaSBhcyBhIHN5bm9ueW0gZm9yIGxpLgotCi1UaHUgRGVjICA4IDE4OjIzOjMxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogSGFuZGxlIGNhbGxfcGFsIGluc3RydWN0aW9uLCBhbmQKLQlwcmludCBzb21ldGhpbmcgZm9yIHJlc2VydmVkIG9wY29kZSB2YWx1ZXMsIGV2ZW4gaWYgaXQgd29uJ3QKLQlhc3NlbWJsZSBhZ2Fpbi4KLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IFdoZW4gaW5pdGlhbGl6aW5nLCBzaGlmdCByaWdodAotCWFuZCBtYXNrLCB0byBhdm9pZCBzaWduIGV4dGVuc2lvbiBwcm9ibGVtcyBvbiB0aGUgQWxwaGEuCi0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnLCBjYXNlICdKJyk6IEhhbmRsZSBidXNjciBhbmQgcGNyCi0JY29udHJvbCByZWdpc3RlcnMuCi0KLVdlZCBOb3YgMjMgMjI6MzQ6NTEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogc2gtb3BjLmggKG1vdi5sIGdicik6IEdldCBkaXJlY3Rpb24gcmlnaHQuCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBOZXcgZnVuY3Rpb24uCi0JKHByaW50X2luc25fc2hsLCBwcmludF9pbnNuX3NoKTogQ2FsbCBwcmludF9pbnNuX3NoeCB0bwotCXByaW50IG9wY29kZXMgd2l0aCByaWdodCBieXRlIG9yZGVyLgotCi1UaHUgTm92ICAzIDE5OjMyOjIyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG5zMzJrLWRpcy5jIChzdHJ1Y3QgbnMzMmtfb3B0aW9uKTogUmVuYW1lZCBmcm9tIHN0cnVjdCBvcHRpb24sCi0JdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggZ2V0b3B0LgotCi1Nb24gT2N0IDMxIDE4OjQ4OjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogUmVhZCB0aGUgaW5zdHJ1Y3Rpb24gdXNpbmcKLQliZmRfZ2V0YjMyLCBzbyB0aGF0IGl0IHdvcmtzIG9uIGEgbGl0dGxlIGVuZGlhbiBvciA2NCBiaXQgaG9zdC4KLQlSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIG9wLgotCi1UdWUgT2N0IDI1IDE3OjA3OjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogVXNlIG9yIGluc3RlYWQgb2YgYWRkdSBmb3IgcHNldWRvLW9wIG1vdmUsIHNpbmNlCi0JYWRkdSBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBpZiAtbWlwczMuCi0KLVdlZCBPY3QgMTkgMTM6NDA6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhMjlrLWRpcy5jIChwcmludF9zcGVjaWFsKTogQWRkIHNwZWNpYWwgcmVnaXN0ZXIgbmFtZXMgZGVmaW5lZAotCW9uIDI5MDMwLCAyOTA0MCBhbmQgMjkwNTAuCi0JKHByaW50X2luc24pOiBIYW5kbGUgbmV3IG9wZXJhbmQgdHlwZSAnSScuCi0KLVdlZCBPY3QgMTIgMTE6NTk6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFVzZSB0b3AgbGV2ZWwgaW5zdGFsbC5zaCBzY3JpcHQuCi0KLVdlZCBPY3QgIDUgMTk6MTY6MjkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYzogUmV3cml0ZSB0byB1c2UgYml0ZmllbGRzLCByYXRoZXIgdGhhbiBhIHVuaW9uLCBzbwotCXRoYXQgaXQgd29ya3Mgb24gYSBsaXR0bGUgZW5kaWFuIGhvc3QuCi0KLVR1ZSBPY3QgIDQgMTI6MTQ6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAke2NvbmZpZ19zaGVsbH0gd2hlbiBydW5uaW5nIGNvbmZpZy5iZmQuCi0KLVdlZCBTZXAgMjEgMTg6NDk6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jIChtaXBzX29wY29kZXMpOiAiZGFicyIgaXMgb25seSBhdmFpbGFibGUgd2l0aCAtbWlwczMuCi0KLVRodSBTZXAgMTUgMTY6MzA6MjIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhMjlrLWRpcy5jIChwcmludF9pbnNuKTogUHJpbnQgdGhlIG9wY29kZS4KLQotV2VkIFNlcCAxNCAxNzo1MjoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfb3Bjb2Rlcyk6IFNldCBXUl90IGZvciBzYyBhbmQgc2NkLgotCi1TdW4gU2VwIDExIDIyOjMyOjE3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jIChyZWdfbmFtZXMpOiBVc2UgcjI2LXIyMyBmb3IgYXJnMC1hcmczLgotCi1UdWUgU2VwICA2IDExOjM3OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogU2V0IElOU05fU1RPUkVfTUVNT1JZIGZsYWcgZm9yIGFsbCBpbnN0cnVjdGlvbnMKLQl3aGljaCBzdG9yZSBhIHZhbHVlIGludG8gbWVtb3J5LgotCi1TdW4gU2VwIDA0IDE3OjU4OjEwIDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW4sIGRpc2Fzc2VtYmxlLmM6IEFkZCBzdXBwb3J0IGZvciB0aGUgQVJNLgotCSogYXJtLWRpcy5jLCBhcm0tb3BjLmg6IE5ldyBmaWxlcy4KLQotRnJpIEF1ZyAgNSAxNDowMDowNSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChuczMyay1kaXMubyk6IEFkZCBkZXBlbmRlbmN5LgotCSogbnMzMmstZGlzLmMgKHByaW50X2luc25fYXJnKTogRGVjbGFyZSBpbml0aWFsaXplZCBsb2NhbCBhcwotCXN0cmluZywgbm90IGFzIGFycmF5IG9mIGNoYXJzLgotCi1UaHUgSnVsIDI4IDE4OjE0OjE2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGUgJ3gnLgotCi0JKiBzcGFyYy1vcGMuYzogQWRkZWQgc3BhcmNsaXRlIGV4dGVuZGVkIEZQIG9wZXJhdGlvbnMsIGFuZAotCXZlcnNpb25zIG9mIHY5IGltcGRlcCogaW5zdHJ1Y3Rpb25zIHBlcm1pdHRpbmcgc3BlY2lmaWNhdGlvbiBvZgotCXRoZSBPUEYgZmllbGQuCi0KLVR1ZSBKdWwgMjYgMTY6MzY6MDMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaTk2MC1kaXMuYyAocmVnX25hbWVzKTogTm93IGNvbnN0LgotCShzdHJ1Y3Qgc3BhcnNlX3RhYmVudCk6IE5ldyB0eXBlLCBjb3BpZWQgZnJvbSBhcnJheSB0eXBlIGluIG1lbQotCWZ1bmN0aW9uLgotCShjdHJsKTogTG9jYWwgc3RhdGljIGFycmF5IGN0cmxfdGFiIG5vdyBjb25zdC4KLQkoY29icik6IExvY2FsIHN0YXRpYyBhcnJheSBjb2JyX3RhYiBub3cgY29uc3QuCi0JKG1lbSk6IExvY2FsIHZhcmlhYmxlcyByZWcxLCByZWcyLCByZWczIG5vdyBwb2ludCB0byBjb25zdC4gIExvY2FsCi0Jc3RhdGljIHZhcmlhYmxlIG1lbV90YWIgbm8gbG9uZ2VyIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQuICBDaGFuZ2VkCi0JbWVtX2luaXQgdG8gY29uc3QgYXJyYXkgb2Ygc3RydWN0IHNwYXJzZV90YWJlbnQuCi0JKHJlZyk6IExvY2FsIHN0YXRpYyB2YXJpYWJsZSByZWdfdGFiIG5vIGxvbmdlciBleHBsaWNpdGx5Ci0JaW5pdGlhbGl6ZWQuICBDaGFuZ2VkIHJlZ19pbml0IHRvIGNvbnN0IGFycmF5IG9mIHN0cnVjdAotCXNwYXJzZV90YWJlbnQuCi0JKGVhKTogTG9jYWwgc3RhdGljIGFycmF5IHNjYWxlX3RhYiBub3cgY29uc3QuCi0KLQkqIGk5NjAtZGlzLmMgKHJlZyk6IEFkZGVkIGk5NjBKWCBpbnN0cnVjdGlvbnMgdG8gcmVnX2luaXQgdGFibGUuCi0JKFJFR19NQVgpOiBVcGRhdGVkLgotCi1UdWUgSnVsIDE5IDIxOjAwOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogY29uZmlndXJlLmJhdDogdGhlIGRpc2Fzc2VtYmVyIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yCi0JIm9iamR1bXAgLWQiIHRvIHdvcmsgaW4gZGpncHAuCi0KLVdlZCBKdWwgMTMgMTg6MDE6NTggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbnMzMmstZGlzLmM6IERlbGV0ZWQgYWxsIGNvZGUgaW4gIiNpZmRlZiBHREIiLgotCShpbnZhbGlkX2Zsb2F0KTogRW5hYmxlZCBnZW5lcmFsIHZlcnNpb24sIGRvZXNuJ3QgcmVxdWlyZSBydW5uaW5nCi0Jb24gbnMzMmsgaG9zdC4gIENoYW5nZWQgdG8gdGFrZSBjaGFyKiBhcmd1bWVudCwgYW5kIHRlc3QgZm9yCi0JZXhwbGljaXRseSBzcGVjaWZpZWQgc2l6ZXMsIGluc3RlYWQgb2YgdXNpbmcgc2l6ZW9mKCkgb24gaG9zdCBDUFUKLQl0eXBlcy4KLQkoSU5WQUxJRF9GTE9BVCk6IENhc3QgZmlyc3QgYXJndW1lbnQuCi0JKG9wdF91LCBvcHRfVSwgb3B0X08sIG9wdF9DLCBvcHRfUywgbGlzdF9QNTMyLCBsaXN0X001MzIsCi0JbGlzdF9QMDMyLCBsaXN0X00wMzIpOiBOb3cgY29uc3QuCi0JKG9wdGxpc3QsIGxpc3Rfc2VhcmNoKTogTWFkZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMgbm93IHBvaW50IHRvCi0JY29uc3QuCi0JKHByaW50X2luc25fYXJnKTogQ2hhbmdlZCBzdGF0aWMgYXJyYXkgb2Ygb25lLWNoYXJhY3Rlci1zdHJpbmcKLQlwb2ludGVycyBpbnRvIGEgc3RhdGljIGNvbnN0IGFycmF5IG9mIGNoYXJhY3RlcnM7IGZpeGVkIHNwcmludGYKLQlzdGF0ZW1lbnQgYWNjb3JkaW5nbHkuCi0KLVN1biBKdWwgMTAgMDA6Mjc6NDcgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIG9wY29kZXMvbnMzMmstZGlzLmM6IFNlbWktbmV3IGZpbGUuICBIYWQgYXBwYXJlbnRseSBiZWVuIGRyb3BwZWQKLQlmcm9tIGRpc3RyaWJ1dGlvbi4gQSBuczMyay1kaXMuYyBmcm9tIGEgcHJldmlvdXMgZGlzdHJpYnV0aW9uIGhhcwotCWJlZW4gYnJvdWdodCB1cCB0byBkYXRlIGFuZCBzdXBwb3J0cyB0aGUgbmV3IGludGVyZmFjZS4KLQotCSogZGlzYXNzZW1ibGUuYzogZGVmaW5lIEFSQ0hfbnMzMmsgYW5kIGFkZCBjYXNlIGJmZF9hcmNoX25zMzJrLgotCi0JKiBjb25maWd1cmUuaW46IGFkZCBiZmRfbnMzMmtfYXJjaCB0YXJnZXQgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW46IGFkZCBuczMyay1kaXMubyB0byBBTExfTUFDSElORVMuCi0JQWRkIG5zMzJrLWRpcy5jIHRvIENGSUxFUy4gQWRkIGRlcGVuZGVuY2llcyBmb3IgbnMzMmstZGlzLm8uCi0KLVdlZCBKdW4gMjkgMjI6MTA6MzcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IEdldCAxNmJpdCBicmFuY2gKLQlkaXNhc3NlbWJseSByaWdodC4KLQotVHVlIEp1biAyOCAxMzoyMjowNiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jLCBtaXBzLWRpcy5jOiBEb24ndCB1c2UgdHJ1ZSBhbmQgZmFsc2UuCi0KLVRodSBKdW4gMjMgMTI6NTM6MTkgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSAtLXdpdGgtdGFyZ2V0cyB0byAtLWVuYWJsZS10YXJnZXRzLgotCi1XZWQgSnVuIDIyIDEzOjM4OjMyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IEJ1aWxkIGEgc3RhdGljIGhhc2ggdGFibGUgbWFwcGluZwotCW9wY29kZXMgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIHdpdGggdGhhdCBvcGNvZGUsIHRvIHNwZWVkCi0JZGlzYXNzZW1ibHkgb2YgbGFyZ2UgZmlsZXMuICBGcm9tIHJhbHBoY0BweXJhbWlkLmNvbSAoUmFscGgKLQlDYW1wYmVsbCkuCi0KLVR1ZSBKdW4gIDcgMTI6NDk6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBGaXggdHlwbyAod2FzIG1vc3R5Y2xlYW4pLgotCi1XZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogY29uZmlndXJlLmJhdDogdXBkYXRlIHRvIGxhdGVzdCBtYWtlZmlsZS5pbgotCi1TYXQgTWF5ICA3IDE3OjEzOjIxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGEyOWstZGlzLmMgKHByaW50X2luc24pOiBQcmludCAneCcgdHlwZSBvcGVyYW5kIGluIGhleC4KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBQcmludCAxNmJpdCByZWxzIGNvcnJlY3RseS4KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoKTogRG9uJ3QgcmVjdXIgZW5kbGVzc2x5IGlmIGRlbGF5Ci0Jc2xvdCBpbnNuIGlzIGluIGEgZGVsYXkgc2xvdC4KLQkqIHo4ay1vcGMuaDogKHJlc2ZsZyk6IEZpeCBwYXR0ZXJucy4KLQkqIGg4NTAwLW9wYy5oIEZpeCBDUiBpbnNuIHBhdHRlcm5zLgotCi1GcmkgTWF5ICA2IDE0OjM0OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBQdXQgUG93ZXJQQyB2ZXJzaW9ucyBvZiAiY21wIiBhbmQKLQkiY21wbCIgYmVmb3JlIFBPV0VSIHZlcnNpb25zLCBzbyB0aGF0IGdhcyAtbWFueSB1c2VzIHRoZW0uCi0KLVRodSBBcHIgMjggMTg6MzI6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZGlzYXNzZW1ibGUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoT0ZJTEVTKTogQWRkIGRpc2Fzc2VtYmxlLm8uCi0JKGRpc2Fzc2VtYmxlLm8pOiBQcm92aWRlIGRlcGVuZGVuY2llczsgY29tcGlsZSB3aXRoICQoQVJDSERFRlMpLgotCSogY29uZmlndXJlLmluOiBEZWZpbmUgQVJDSERFRlMgaW4gTWFrZWZpbGUuICBDb2RlIHRha2VuIGZyb20KLQliaW51dGlscy9jb25maWd1cmUuaW4uCi0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fbTY4ayk6IElmIEZfQUxJQVMgZmxhZyBpcyBzZXQsIHNraXAgdGhlCi0Jb3Bjb2RlIGJlaW5nIGV4YW1pbmVkLgotCi1UaHUgQXByIDIxIDE3OjA4OjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogQWRkZWQgUkFMLCBSQU0gYW5kIFJBUy4KLQkoaW5zZXJ0X3JhbCwgaW5zZXJ0X3JhbSwgaW5zZXJ0X3Jhcyk6IE5ldyBmdW5jdGlvbnMuCi0JKHBvd2VycGNfb3Bjb2Rlcyk6IFVzZSBSQUwgZm9yIGxvYWQgd2l0aCB1cGRhdGUsIFJBTSBmb3IgbG13LCBhbmQKLQlSQVMgZm9yIHN0b3JlIHdpdGggdXBkYXRlLgotCi1TYXQgQXByIDE2IDIzOjQxOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBDb3JyZWN0IGZjaXIuICBGcm9tIERhdmlkIEVkZWxzb2huCi0JKGVkZWxzb2huQG5wYWMuc3lyLmVkdSkuCi0KLVdlZCBBcHIgIDYgMTc6MTE6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jIChtaXBzX29wY29kZXMpOiBDb3JyZWN0IG9wZXJhbmRzIG9mICJub3IiIHdpdGggYW4KLQlpbW1lZGlhdGUgYXJndW1lbnQuCi0KLU1vbiBBcHIgIDQgMTY6MzA6NDYgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBGaXggInJkICVmcHJzLCVsMCIuCi0KLU1vbiBBcHIgIDQgMTM6MjI6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBUaGUgc2lnbmVkcCBmaWVsZCBoYXMgYmVlbgotCXJlbW92ZWQsIHNvIGRvbid0IGluaXRpYWxpemUgaXQuICBTZXQgdGhlIFBQQ19PUEVSQU5EX1NJR05FRCBmbGFnCi0JaW5zdGVhZC4gIEFkZCBuZXcgb3BlcmFuZCBTSVNJR05PUFQuCi0JKHBvd2VycGNfb3Bjb2Rlcyk6IEZvciBsaXMsIGxpdSwgYWRkaXMsIGFuZCBjYXUgdXNlIFNJU0lHTk9QVC4KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIERhdmlkIEVkZWxzb2huIChlZGVsc29obkBucGFjLnN5ci5lZHUpLgotCSogcHBjLWRpcy5jIChwcmludF9pbnNuX3Bvd2VycGMpOiBDaGVjayBQUENfT1BFUkFORF9TSUdORUQgcmF0aGVyCi0JdGhhbiBzaWduZWRwIGZpZWxkLgotCi1XZWQgTWFyIDMwIDAwOjMxOjQ5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaTM4Ni1kaXMuYyAoc3RydWN0IHByaXZhdGUpOiAgUmVuYW1lZCB0byBkaXNfcHJpdmF0ZS4gYHByaXZhdGUnCi0JaXMgYSByZXNlcnZlZCB3b3JkIGZvciBkeW5peCBjYy4KLQotTW9uIE1hciAyOCAxMzowMDoxNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGVycm9yIG1lc3NhZ2UgdG8gcmVmZXIgdG8gYmZkL2NvbmZpZy5iZmQKLQlyYXRoZXIgdGhhbiBiZmQvY29uZmlndXJlLmluLgotCi1Nb24gTWFyIDI4IDEyOjI4OjMwIDE5OTQgIERhdmlkIEVkZWxzb2huICAoZWRlbHNvaG5AbnBhYy5zeXIuZWR1KQotCi0JKiBwcGMtb3BjLmM6IERlZmluZSBQT1dFUjIgYXMgc2hvcnQgYWxpYXMgZmxhZy4KLQkocG93ZXJwY19vcGNvZGVzKTogQWRkIFBPV0VSLzIgb3Bjb2RlcyBsZnEqLCBzdGZxKiwgZmNpclt6XSwgYW5kCi0JZnNxcnQuCi0KLVdlZCBNYXIgMjMgMTI6MjM6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpOTYwLWRpcy5jIChwcmludF9pbnNuX2k5NjApOiBEb24ndCByZWFkIGEgc2Vjb25kIHdvcmQgZm9yCi0Jb3Bjb2RlcyAwLCAxLCAyIGFuZCAzLgotCi1XZWQgTWFyIDE2IDE1OjM3OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBtNjg4ODEtZXh0Lm8gZm9yIGJmZF9tNjhrX2FyY2guCi0KLU1vbiBNYXIgMTQgMTQ6NTM6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtNjg4ODEtZXh0LmM6IFJlbW92ZWQ7IG5vIGxvbmdlciB1c2VkLgotCSogTWFrZWZpbGUuaW46IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0KLQkqIG02OGstZGlzLmMgKGV4dF9mb3JtYXRfNjg4ODEpOiBEb24ndCBkZWNsYXJlLgotCShwcmludF9pbnNuX202OGspOiBJZiBhbiBpbnN0cnVjdGlvbiB1c2VzIHBsYWNlICdpJywgaXQgdXNlcyBhdAotCWxlYXN0IGZvdXIgZml4ZWQgYnl0ZXMuCi0JKHByaW50X2luc25fYXJnKTogRG9uJ3QgYnVtcCBwIGJ5IDIgZm9yIGNhc2UgJ0knLCBwbGFjZSAnaScuICBGb3IKLQlleHRlbmRlZCBmbG9hdCwgY29udmVydCB0byBkb3VibGUgdXNpbmcgZmxvYXRmb3JtYXRfdG9fZG91YmxlLCBub3QKLQlpZWVlX2V4dGVuZGVkX3RvX2RvdWJsZSwgYW5kIGZldGNoIHRoZSBkYXRhIGJlZm9yZSBjb252ZXJ0aW5nIGl0LgotCi1UdWUgTWFyICA4IDE4OjEyOjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogSXQncyBzcXJ0LnMsIG5vdCBzcXJ0LncuICBGcm9tCi0JZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKS4KLQotVHVlIEZlYiAgOCAxNjo1NToyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogVGhlIFBPV0VSIHVzZXMgYmRuW2xdW2FdIHdoZXJlIHRoZQotCVBvd2VyUEMgdXNlcyBiZG56W2xdW2FdLgotCi1UdWUgRmViICA4IDAwOjMyOjI4IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZGlzLWJ1Zi5jLCBpMzg2LWRpcy5jOiAgSW5jbHVkZSBzeXNkZXAuaC4KLQotTW9uIEZlYiAgNyAxOToyMjoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX3Bvd2VycGNfYXJjaCk6IFVzZSBwcGMtZGlzLm8gYW5kIHBwYy1vcGMuby4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBNYXJrIFBPV0VSIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQKLQlieSBNb3Rvcm9sYSBQb3dlclBDIDYwMSB3aXRoIFBQQ19PUENPREVfNjAxLgotCSogcHBjLWRpcy5jIChwcmludF9pbnNuX2JpZ19wb3dlcnBjLCBwcmludF9pbnNuX2xpdHRsZV9wb3dlcnBjKToKLQlEaXNhc3NlbWJsZSBNb3Rvcm9sYSBQb3dlclBDIDYwMSBpbnN0cnVjdGlvbnMgYXMgd2VsbCBhcyBub3JtYWwKLQlQb3dlclBDIGluc3RydWN0aW9ucy4KLQotU3VuIEZlYiAgNiAwNzo0NToxNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaTk2MC1kaXMuYyAocmVnLCBtZW0pOiBKdXN0IHVzZSBhIHN0YXRpYyBhcnJheSBpbnN0ZWFkIG9mCi0JY2FsbGluZyB4bWFsbG9jLgotCi1TYXQgRmViICA1IDAwOjA0OjAyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBGb3IgJz8nIGFuZCAnQCcgb25seSBhZGp1c3QgdGhlCi0JY29uZGl0aW9uIG5hbWUgaW5kZXggaWYgdGhpcyBpcyBmb3IgYSBuZWdhdGVkIGNvbmRpdGlvbi4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogTm8gc3BhY2UgYmVmb3JlICdIJyBvcGVyYW5kLgotCUZsb2F0aW5nIHBvaW50IGZvcm1hdCBmb3IgJ0gnIG9wZXJhbmQgaXMgYmFja3dhcmRzIGZyb20gbm9ybWFsCi0JY2FzZSAoMCA9PSBkb3VibGUsIDEgPT0gc2luZ2xlKS4gIEZvciAnNCcsICc2JywgJzcnLCAnOScsIGFuZCAnOCcKLQlvcGVyYW5kcyAoZm1weWFkZCBhbmQgZm1weXN1YiksIGhhbmRsZSBiaXphcnJlIHJlZ2lzdGVyCi0JdHJhbnNsYXRpb24gY29ycmVjdGx5IGZvciBzaW5nbGUgcHJlY2lzaW9uIGZvcm1hdC4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogRG8gbm90IGVtaXQgYSBzcGFjZSBhZnRlciAnRicKLQlvciAnSScgb3BlcmFuZHMgaWYgdGhlIG5leHQgZm9ybWF0IHNwZWNpZmllciBpcyAnTScgKGZjbXAKLQljb25kaXRpb24gY29tcGxldGVyKS4KLQotRmViICA0IDIzOjM4OjAzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogTmV3IG9wZXJhbmQgdHlwZSBNQkUgdG8gaGFuZGxlIGEKLQlzaW5nbGUgbnVtYmVyIGdpdmluZyBhIGJpdG1hc2sgZm9yIHRoZSBNQiBhbmQgTUUgZmllbGRzIG9mIGFuIE0KLQlmb3JtIGluc3RydWN0aW9uLiAgQ2hhbmdlIE5CIHRvIGFjY2VwdCAzMiwgYW5kIHR1cm4gaXQgaW50byAwOwotCWFsc28gdHVybiAwIGludG8gMzIgd2hlbiBkaXNhc3NlbWJsaW5nLiAgU2VwZXJhdGVkIFNIIGZyb20gTkIuCi0JKGluc2VydF9tYmUsIGV4dHJhY3RfbWJlKTogTmV3IGZ1bmN0aW9ucy4KLQkoaW5zZXJ0X25iLCBleHRyYWN0X25iKTogTmV3IGZ1bmN0aW9ucy4KLQkoU0NfTUFTSyk6IE1hc2sgb3V0IFNBIGFuZCBMSyBiaXRzLgotCShwb3dlcnBjX29wY29kZXMpOiBDaGFuZ2UgImNhbCIgdG8gdXNlIFJULCBELCBSQSByYXRoZXIgdGhhbiBSVCwKLQlSQSwgU0kuICBDaGFuZ2UgImxpdSIgYW5kICJjYXUiIHRvIHVzZSBVSSByYXRoZXIgdGhhbiBTSS4gIE1hcmsKLQkiYmN0ciIgYW5kICJiY3RybCIgYXMgYWNjZXB0ZWQgYnkgUE9XRVIuICBDaGFuZ2UgInJsd2ltaSIsCi0JInJsaW1pIiwgInJsd2ltaS4iLCAicmxpbWkuIiwgInJsd2lubSIsICJybGlubSIsICJybHdpbm0uIiwKLQkicmxpbm0uIiwgInJsbWkiLCAicmxtaS4iLCAicmx3bm0iLCAicmxubSIsICJybHdubS4iLCAicmxubS4iIHRvCi0JdXNlIE1CRSByYXRoZXIgdGhhbiBNQi4gIEFkZCAibWZtcSIgYW5kICJtdG1xIiBQT1dFUiBpbnN0cnVjdGlvbnMuCi0JKHBvd2VycGNfbWFjcm9zKTogRGVmaW5lIHRhYmxlIG9mIG1hY3JvIGRlZmluaXRpb25zLgotCShwb3dlcnBjX251bV9tYWNyb3MpOiBEZWZpbmUuCi0KLQkqIHBwYy1kaXMuYyAocHJpbnRfaW5zbl9wb3dlcnBjKTogRG9uJ3Qgc2tpcCBvcHRpb25hbCBvcGVyYW5kcwotCWlmIFBQQ19PUEVSQU5EX05FWFQgaXMgc2V0LgotCi1TYXQgSmFuIDIyIDIzOjEwOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTk2MC1kaXMuYyAocHJpbnRfaW5zbl9pOTYwKTogTWFrZSBidWZmZXIgYmZkX2J5dGUgaW5zdGVhZCBvZgotCWNoYXIuICBSZXRyaWV2ZSBjb250ZW50cyB1c2luZyBiZmRfZ2V0bDMyIGluc3RlYWQgb2Ygc2hpZnRpbmcuCi0KLUZyaSBKYW4gMjEgMTk6MDE6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmM6IE5ldyBmaWxlLiAgT3Bjb2RlIHRhYmxlIGZvciBQb3dlclBDLCBpbmNsdWRpbmcKLQlvcGNvZGVzIGZvciBQT1dFUiAoUlMvNjAwMCkuCi0JKiBwcGMtZGlzLmM6IE5ldyBmaWxlLiAgUG93ZXJQQyBhbmQgUG93ZXIgKFJTLzYwMDApIGRpc2Fzc2VtYmxlci4KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgcHBjLWRpcy5vIGFuZCBwcGMtb3BjLm8uCi0JKENGSUxFUyk6IEFkZCBwcGMtZGlzLmMuCi0JKHBwYy1kaXMubywgcHBjLW9wYy5vKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIHBwYy1kaXMubyBhbmQgcHBjLW9wYy5vIGZvciBiZmRfcnM2MDAwX2FyY2guCi0KLU1vbiBKYW4gMTcgMjA6MDU6NDkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnTicgaW4gYXNzZW1ibGVyIHRlbXBsYXRlLgotCU5vIHNwYWNlIGJlZm9yZSAndScsICdmJywgb3IgJ04nLgotCi1TdW4gSmFuIDE2IDE0OjIwOjE2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX2kzODYpOiBBZGQgRklYTUUgY29tbWVudCByZWdhcmRpbmcgcmVhZGluZwotCWZhcnRoZXIgdGhhbiB3ZSBzaG91bGQuCi0KLQkqIGkzODYtZGlzLmMgKGRpczM4Nik6IFVzZSBZYiBhbmQgWXYgZm9yIHNjYXNiIGFuZCBzY2FzUy4KLQotVGh1IEphbiAgNiAxMjozODowNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jIG02OGstZGlzLmMgYWxwaGEtZGlzLmMgYTI5ay1kaXMuYzogRml4IGNvbW1lbnRzLgotCi1XZWQgSmFuICA1IDExOjU2OjIxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaTk2MC1kaXMuYyAocHJpbnRfaW5zbl9pOTYwKTogT25seSByZWFkIHdvcmQyIGlmIHRoZSBpbnN0cnVjdGlvbgotCW5lZWRzIGl0LCB0byBwcmV2ZW50IHJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4KLQotV2VkIE5vdiAxNyAxNzoyMDoxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmg6IFVzZSBtYWNybyBmb3IgaiBpbnN0cnVjdGlvbiwgdG8gc3VwcG9ydCBTVlI0IFBJQy4KLQlSZW1vdmVkIHQsQSBjYXNlIGZvciBsYTsgYWx3YXlzIHVzZSB0LEEoYikgY2FzZS4KLQotTW9uIE5vdiAgOCAxMjozNzozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlGcm9tIFRlZCBMZW1lbiA8bWVsbG9uQHBlcHBlci5uY2QuY29tPgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgJ2snLgotCSogbWlwcy1vcGMuYzogTWFrZSBjYWNoZSB1c2Ugaywgbm90IHQuCi0KLVN1biBOb3YgIDcgMjM6NTI6MzQgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhbHBoYS1vcGMuaCwgYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiAgQWRkCi0JRkxPQVRfTUVNT1JZX0ZPUk1BVF9DT0RFLCBGTE9BVF9CUkFOQ0hfRk9STUFUX0NPREUsIGNvcnJlY3QKLQlGTE9BVF9GT1JNQVRfQ09ERSB0byBwdXQgb3V0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG5hbWVzLgotCi1Nb24gTm92ICAxIDE4OjE3OjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogVXNlIG1hY3JvcyBmb3IgamFsIHZhcmlhbnRzLCB0byBzdXBwb3J0IFNWUjQgUElDLgotCi1UaHUgT2N0IDI4IDE3OjQyOjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYTI5ay1kaXMuYyAocHJpbnRfaW5zbik6IFVzZSAweCUwOHgsIG5vdCAweCU4eC4KLQotV2VkIE9jdCAyNyAxMTo0ODowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmMgKGRzbGwsIGRzcmEsIGRzcmwpOiBBZGRlZCAnPicgY2FzZXMgZm9yIHNoaWZ0IGNvdW50cwotCWxhcmdlciB0aGFuIDMyLiAgTW92ZWQgZHN4eDMyIHZhcmlhbnRzIGZpcnN0IGZvciBkaXNhc3NlbWJsZXIuCi0KLU1vbiBPY3QgMjUgMTE6MzM6MTQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogejhrZ2VuLmMsIHo4ay1vcGMuaDogQWRkIGZ1bGwgbGRhIGluZm9ybWF0aW9uLgotCi1UdWUgT2N0IDE5IDEyOjM5OjI1IDE5OTMgIEplZmZyZXkgQSBMYXcgIChsYXdAY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IERvIG5vdCBlbWl0IGEgc3BhY2UgYWZ0ZXIKLQltb3ZiIGluc3RydWN0aW9ucy4gIEFueSBuZWNlc3Nhcnkgc3BhY2Ugd2lsbCBiZSBlbWl0dGVkIGJ5Ci0JdGhlIGNvZGUgdG8gaGFuZGxlIG51bGxpZmljYXRpb24gY29tcGxldGVycy4KLQotV2VkIE9jdCAxMyAxNjoxOTowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IE1vdmVkIGwuZCBkb3duIHNvIHRoYXQgaXQgZGlzYXNzZW1ibGVzIGFzIGxkYzEuCi0KLUZyaSBPY3QgIDggMDI6MzQ6MjEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhbHBoYS1vcGMuaDogIEFkZCBsZGxfbCwgZml4IHR5cG8gZm9yIGxkcV91LgotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiAgQWRkIGNvZGUgZm9yIFBBTF9GT1JNQVRfQ09ERS4KLQotVHVlIE9jdCAgNSAxNzo0Nzo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IENvcnJlY3QgbHd1IG9wY29kZSB2YWx1ZSAoYm9vayBoYWQgaXQgd3JvbmcpLgotCi1UaHUgU2VwIDMwIDExOjI2OjE4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYyAoRkVUQ0hfREFUQSk6IGdldCBqdXN0IHRoZSByaWdodCBhbW91bnQgb2YgZGF0YS4KLQkodW5wYWNrX2luc3RyKTogQ29wZSB3aXRoIEFSR19JTU00TTEgdHlwZSBpbnN0cnVjdGlvbnMuCi0KLVdlZCBTZXAgMjkgMTY6MjQ6NDkgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBtODhrLWRpcy5jIChtODhrZGlzKTogY29tbWVudCBjaGFuZ2UuICBSZW1vdmUgc3BhY2UgYWZ0ZXIKLQkgIHByaW50aW5nIG1uZW1vbmljLgotCSAgKHByaW50b3ApOiBoYW5kbGUgbmV3IGFyZyB0eXBlcyBERUMgYW5kIFhSRUcgZm9yIG04ODExMC4KLQotVHVlIFNlcCAyOCAxOToyMDoxNiAxOTkzICBKZWZmcmV5IEEgTGF3IChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAneicgb3BlcmFuZAotCXR5cGUgZm9yIGFic29sdXRlIGJyYW5jaCBhZGRyZXNzZXMuICBEZWxldGUgc3BlY2lhbAotCSJibGUiIGFuZCAiYmUiIGNvZGUgaW4gJ1cnIG9wZXJhbmQgY29kZS4KLQotRnJpIFNlcCAyNCAxNDowODozMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IFNldCBoYXphcmQgaW5mb3JtYXRpb24gY29ycmVjdGx5IGZvciBicmFuY2gKLQlsaWtlbHkgaW5zdHJ1Y3Rpb25zLgotCi1GcmkgU2VwIDE3IDA0OjQxOjE3IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpLCBhbHBoYS1vcGMuaDogIEZpeCBidWdzLCB1c2UKLQlpbmZvLT5mcHJpbnRmX2Z1bmMgZm9yIHByaW50aW5nIGFuZCBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgZm9yCi0JYWRkcmVzcyBvdXRwdXQuCi0KLVdlZCBTZXAgMTUgMTI6MTI6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBTZXQgSU5TTl9UUkFQIGZvciB0WFggaW5zdHJ1Y3Rpb25zLgotCi1UaHUgU2VwICA5IDEwOjExOjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogRnJvbSBkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOgotCUNvcnJlY3RlZCBzZWNvbmQgY2FzZSBvZiAiYiIgZm9yIGRpc2Fzc2VtYmxlci4KLQotVHVlIFNlcCAgNyAxNDoyNToxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMsIG04OGstZGlzLmM6IERvbid0IGluY2x1ZGUgbGliYmZkLmguICBDaGFuZ2VkIGNhbGxzCi0JdG8gQkZEIHN3YXBwaW5nIHJvdXRpbmVzIHRvIGNvcnJlc3BvbmQgdG8gQkZEIG5hbWUgY2hhbmdlcy4KLQotVGh1IFNlcCAgMiAxMDozNToyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IENoYW5nZSBkaXYgbWFjaGluZSBpbnN0cnVjdGlvbiB0byBiZSB6LHMsdCByYXRoZXIKLQl0aGFuIHMsdC4gIENoYW5nZSBkaXYgbWFjcm8gdG8gYmUgZCx2LHQgcmF0aGVyIHRoYW4gZCxzLHQuCi0JTGlrZXdpc2UgZm9yIGRpdnUsIGRkaXYsIGRkaXZ1LiAgQWRkZWQgeixzLHQgY2FzZSBmb3IgZHJlbSwgZHJlbXUsCi0JcmVtIGFuZCByZW11IHdoaWNoIGdlbmVyYXRlcyBvbmx5IHRoZSBjb3JyZXNwb25kaW5nIGRpdgotCWluc3RydWN0aW9uLiAgVGhpcyBpcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBNSVBTIGFzc2VtYmxlciwKLQl3aGljaCBvbmx5IGdlbmVyYXRlcyB0aGUgc2ltcGxlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gd2hlbiBhbgotCWV4cGxpY2l0IGRlc3RpbmF0aW9uIG9mICQwIGlzIHVzZWQuCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSAneicgKGFsd2F5cyByZWdpc3RlciB6ZXJvKS4KLQotVGh1IEF1ZyAyNiAxNzo0MTo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEZyb20gZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKTogU2V0Ci0JV1JfMzEgaGF6YXJkIGZvciBiYWwsIGJnZXphbCwgYmx0emFsLgotCi1UaHUgQXVnIDI2IDE3OjIwOjAyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBVc2UgcHJpbnQgZnVuY3Rpb24KLQlmcm9tIHdpdGhpbiB0aGUgZGlzYXNzZW1ibGVfaW5mbywgbm90IGZwcmludGZfZmlsdGVyZWQuCi0KLVdlZCBBdWcgMjUgMTM6NTE6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ3wnIGxpa2UgJz4nLiAgKEZyb20gSmVmZgotCUxhdywgbGF3QGNzLnV0YWguZWR1LikKLQotTW9uIEF1ZyAyMyAxMjo0NDowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmMgKCJhYnN1Iik6IFJlbW92ZWQuCi0JKCJkYWJzIik6IEFkZGVkLgotCi1GcmkgQXVnIDIwIDEwOjUyOjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogQWRkZWQgcjYwMDAgYW5kIHI0MDAwIGluc3RydWN0aW9ucyBhbmQgbWFjcm9zLgotCUNoYW5nZWQgaGF6YXJkIGluZm9ybWF0aW9uIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbWVtb3J5IGxvYWQKLQlkZWxheXMgYW5kIGNvcHJvY2Vzc29yIGxvYWQgZGVsYXlzLgotCi1XZWQgQXVnIDE4IDE1OjM5OjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogbGkuZCB1c2VzICJULEwiLCBub3QgIlMsRiIuICBBZGRlZCBsaS5zLgotCi1UdWUgQXVnIDE3IDA5OjQ0OjQyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCBwYXNzIGNwdSB0byBjb25maWcuYmZkLgotCi1UdWUgQXVnIDE3IDEyOjIzOjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTg4ay1kaXMuYyAobTg4a2Rpcyk6IE1ha2UgY2xhc3MgdW5zaWduZWQuCi0KLVRodSBBdWcgMTIgMTU6MDg6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IE9uZSBicmFuY2ggZm9ybWF0IGNhc2Ugd2FzCi0JbWlzc2luZyB0aGUgaW5zdHJ1Y3Rpb24gbmFtZS4KLQotV2VkIEF1ZyAxMSAxOToyOTozOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBSZW5hbWVkIGZyb20gRElTX0xJQlMuCi0JQWRkIHRoZSBhcmNoLXNwZWNpZmljIGF1eGlsaWFyeSBmaWxlcy4KLQkoT0ZJTEVTKTogUmVtb3ZlIHRoZSBhcmNoLXNwZWNpZmljIGF1eGlsaWFyeSBmaWxlcwotCWFuZCB1c2UgQkZEX01BQ0hJTkVTIGluc3RlYWQgb2YgRElTX0xJQlMuCi0JKiBjb25maWd1cmUuaW46IFNldCBCRkRfTUFDSElORVMgYmFzZWQgb24gLS13aXRoLXRhcmdldHMgb3B0aW9uLgotCi1UaHUgQXVnIDEyIDEyOjA0OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogQWRkZWQgbHdjMSBFLEEoYikgdG8gZ28gd2l0aCBsd2MxIFQsQShiKS4gIFNpbWlsYXJseQotCWZvciBzd2MxLgotCi1TdW4gQXVnICA4IDE1OjA5OjMwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYzogQ2hhbmdlIENPTlNUIHRvIGNvbnN0IHRvIGRlYWwgd2l0aCBnY2MKLQktRGNvbnN0PV9fY29uc3QgLXRyYWRpdGlvbmFsLgotCi1GcmkgQXVnICA2IDEwOjU4OjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogRnJvbSBkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOiBUb29rCi0JY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIG91dCBvZiAjaWYgMCwgYW5kIG1hZGUgdGhlbSB1c2UgbmV3Ci0JYXJndW1lbnQgdHlwZSAiQyIuCi0KLVRodSBBdWcgIDUgMTc6MTE6MDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jOiBJbmNsdWRlIGFuc2lkZWNsLmggYmVmb3JlIG9wY29kZXMvc3BhcmMuaC4KLQotRnJpIEp1bCAzMCAxODo0ODoxNSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmM6ICBBZGQgRl9KU1IsIEZfVU5CUiwgb3IgRl9DT05EQlIgZmxhZ3MgdG8gZWFjaCBicmFuY2gKLQlpbnN0cnVjdGlvbiwgZm9yIHVzZSBieSB0aGUgZGlzYXNzZW1ibGVyLgotCi0JKiBzcGFyYy1kaXMuYyAoU0VYKTogIEFkZCBzaWduIGV4dGVuc2lvbiBtYWNyby4gIFJlcGxhY2UgbWFueQotCWhhbmQtY29kZWQgc2lnbiBleHRlbnNpb25zIHRoYXQgZGVwZW5kZWQgb24gMzItYml0IGhvc3QgaW50cy4KLQlGSVhNRSwgd2Ugc3RpbGwgZGVwZW5kIG9uIGJpZy1lbmRpYW4gaG9zdCBiaXRmaWVsZCBvcmRlcmluZy4KLQkoc3BhcmNfcHJpbnRfaW5zbik6ICBTZXQgdGhlIGluc25faW5mb192YWxpZCBmaWVsZCwgYW5kIHRoZQotCW90aGVyIGZpZWxkcyB0aGF0IGRlc2NyaWJlIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBwcmludGVkLgotCi1UdWUgSnVsIDI3IDE3OjA0OjU4IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmMgKGNhbGwpOiBBY2NlcHQgYWxsIDYgYWRkcmVzc2luZyBtb2RlcyB2YWxpZCBmb3IKLQlgam1wJyBpbnN0ZWFkIG9mIGp1c3Qgb25lIG9mIHRoZW0uCi0KLVdlZCBKdWwgMjEgMTE6NDM6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmM6IE1vdmUgZmxvYXRpbmcgcmVnaXN0ZXJzIGZyb20gcmVnX25hbWVzIHRvIGZwX3JlZ19uYW1lcy4KLQkoZnB1dF9mcF9yZWdfcik6IFJlbmFtZWQgZnJvbSBmcHV0X3JlZ19yLgotCShmcHV0X2ZwX3JlZyk6IE5ldyBmdW5jdGlvbi4KLQkocHJpbnRfaW5zbl9ocHBhKTogVXNlIGZwdXRfZnBfcmVneyxfcn0gd2hlcmUgYXBwcm9wcmlhdGUuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSwgY2FzZXMgJ2EnLCAnZCcpOiBQcmludCBzcGFjZSBhZnRlcndhcmRzLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEsIGNhc2UgJ2QnKTogVXNlIEdFVF9DT05EIG5vdCBHRVRfRklFTEQuCi0KLU1vbiBKdWwgMTkgMTM6NTI6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFVzZSBleHRyYWN0XzVyX3N0b3JlIGZvciAncicuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSwgY2FzZSAnPicpOiBJZiBuZXh0IGNoYXJhY3RlciBpcyAnbicsCi0JZG9uJ3Qgb3V0cHV0IGEgc3BhY2UuCi0KLQkqIGhwcGEtZGlzLmMgKGZsb2F0X2Zvcm1hdF9uYW1lcyk6IDEwIGlzIHVuZGVmaW5lZCwgYW5kIDExIGlzIHF1YWQuCi0KLVN1biBKdWwgMTggMTY6MzA6MDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBOZXcgZmlsZSwgY29udGFpbmluZyBvcGNvZGUgdGFibGUgZnJvbQotCS4uL2luY2x1ZGUvb3Bjb2RlL21pcHMuaC4KLQkqIE1ha2VmaWxlLmluOiBBZGQgaXQuCi0KLVRodSBKdWwgMTUgMTI6Mzc6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtODhrLWRpcy5jOiBOZXcgZmlsZSwgbW92ZWQgaW4gZnJvbSBnZGIgYW5kIGNoYW5nZWQgdG8gdXNlIHRoZQotCW5ldyBkaXMtYXNtLmggZGlzYXNzZW1ibGVyIGludGVyZmFjZS4KLQkqIE1ha2VmaWxlLmluIChESVNfTElCUyk6IEFkZGVkIG04OGstZGlzLm8uCi0JKG04OGstZGlzLm8pOiBOZXcgdGFyZ2V0LgotCi1UdWUgSnVsIDEzIDEwOjA0OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcsIF9wcmludF9pbnNuX21pcHMpOiBNYWRlIHBvaW50ZXIgdG8KLQlhcmd1bWVudCBzdHJpbmcgY29uc3QgY2hhciAqIHRvIGNvcnJlc3BvbmQgdG8gb3Bjb2RlL21pcHMuaC4KLQotVHVlIEp1bCAgNiAxNToxODozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmM6IFVwZGF0ZWQgdG8gYWNjb3VudCBmb3IgbmFtZSBjaGFuZ2VzIGluIG5ldyB2ZXJzaW9uCi0Jb2Ygb3Bjb2RlL21pcHMuaC4KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBoZWFkZXIgZmlsZSBkZXBlbmRlbmNpZXMuCi0KLVNhdCBKdWwgIDMgMjM6NDc6NTYgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IENvcnJlY3QgZmV0Y2hpbmcgb2YgaW5zdHJ1Y3Rpb24uCi0KLVRodSBKdWwgIDEgMTI6MjM6MzggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG02OGstZGlzLmMgKE5FWFRXT1JELCBORVhUTE9ORyk6IFVzZSAoKHgpIF4gMHg4MDAwKSAtIDB4ODAwMCB0byBzaWduCi0JZXh0ZW5kLCByYXRoZXIgdGhhbiBzaGlmdHMuCi0KLVN1biBKdW4gMjAgMjA6NTY6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBVbmRvIDE1IEp1bmUgY2hhbmdlLgotCi1GcmkgSnVuIDE4IDE0OjE1OjE1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6ICBDaGFuZ2UgcmV0dXJuIHZhbHVlIHRvIGJ5dGUgY291bnQKLQlvciBlcnJvciBjb2RlLgotCSogbTY4ay1kaXMuYzogIFJlLXdyaXRlIHRvIGRldGVjdCBpbnZhbGlkIG9wZXJhbmRzIGJlZm9yZQotCXByaW50aW5nIGFueXRoaW5nLCBzbyB3ZSBjYW4gaGFuZGxlIHRoaXMgdGhlIHNhbWUgd2F5IHdlCi0JaGFuZGxlIGludmFsaWQgb3Bjb2Rlcy4KLQotVGh1IEp1biAxNyAxNTowMTozNiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBzaC1kaXMuYywgc2gtb3BjLmg6IFVuZGVyc3RhbmQgc29tZSBtb3JlIG9wY29kZXMuCi0KLVdlZCBKdW4gMTYgMTM6NDg6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jOiBJbmNsdWRlIDxhbnNpZGVjbC5oPiBhbmQgc3lzZGVwLmggYmVmb3JlIG90aGVyCi0JaGVhZGVyIGZpbGVzLgotCi1UdWUgSnVuIDE1IDIxOjQ1OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmM6IERvbid0IGRlY2xhcmUgcXNvcnQsIHNpbmNlIHN5c2RlcC5oIG1pZ2h0LgotCi0JKiBjb25maWd1cmUuaW46IERvIG1ha2Ugc3lzZGVwLmggbGluay4KLQkqIE1ha2VmaWxlLmluOiBTZWFyY2ggLi4vaW5jbHVkZS4gIERvbid0IHNlYXJjaCAuLi9iZmQuCi0KLVR1ZSBKdW4gMTUgMTM6MzY6MTAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgZnJvbSBKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1OgotCSogaHBwYS1kaXMuYzogRml4IHR5cG8uICAnYScgYW5kICdkJyB3ZXJlIHJldmVyc2VkLgotCURvIG5vdCBwcmludCBhIHNwYWNlIGJlZm9yZSB0aGUgY29tcGxldGVycyBzcGVjaWZpZWQgYnkKLQknYScgYW5kICdkJy4KLQotRnJpIEp1biAxMSAxODo0MDoyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYzogTm8gbG9uZ2VyIG5lZWQgdG8gYm9tYiBvdXQgaWYgSE9TVF82NF9CSVQgaXMKLQlkZWZpbmVkLCBzaW5jZSBnZGIgaGFzIGJlZW4gZml4ZWQuCi0KLQlDaGFuZ2VzIGZyb20gSmVmZiBMYXcsIGxhd0Bjcy51dGFoLmVkdToKLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IExhc3QgYXJndW1lbnQgdG8gZnB1dF9yZWcsCi0JZnB1dF9yZWdfciwgZnB1dF9jcmVnLCBmcHV0X2NvbnN0LCBhbmQgZnB1dHNfZmlsdGVyZWQgc2hvdWxkCi0JYmUgYSAqZGlzYXNzZW1ibGVfaW5mbywgbm90IGEgKkZJTEUuCi0JKiBocHBhLWRpcy5jOiBTdXBwb3J0ICdkJywgJyEnLCBhbmQgJ2EnLgotCSogaHBwYS1kaXMuYzogU3VwcG9ydCAncycgdG8gZXh0cmFjdCBhIDIgYml0IHNwYWNlIHJlZ2lzdGVyLgotCSogaHBwYS1kaXMuYzogRGVsZXRlIGNhc2VzIHdoaWNoIGFyZSBubyBsb25nZXIgbmVlZGVkLgotCi1GcmkgSnVuIDExIDA3OjUzOjQ4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX3ttNjhrLGFyZ30pOiBBZGQgTU1VIGNvZGVzLgotCi1UdWUgSnVuICA4IDEyOjI1OjAxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jOiBOZXcgZmlsZSwgcmVtb3ZlZCBmcm9tIGJmZC9jcHUtaDgzMDAuYywgd2l0aAotCUg4LzMwMC1IIG9wY29kZXMuCi0KLU1vbiBKdW4gIDcgMTI6NTg6NDkgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ1NFQVJDSCk6IEFkZCAtSS4uL2JmZCBmb3Igc3lzZGVwLmggYW5kIGJmZC5oLgotCSogY29uZmlndXJlLmluOiAgTm8gbG9uZ2VyIG5lZWQgdG8gY29uZmlndXJlIHRvIGdldCBzeXNkZXAuaC4KLQotVGh1IEp1biAgMyAxNTo1Njo0OSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBQYXRjaGVzIGZyb20gSmVmZnJleSBMYXcgPGxhd0Bjcy51dGFoLmVkdT4uCi0JKiBocHBhLWRpcy5jOiBTdXBwb3J0ICdJJywgJ0onLCBhbmQgJ0snIGluIG91dHB1dAotCXRlbXBsYXRlcyBmb3IgMS4xIEZQIGNvbXB1dGF0aW9uYWwgaW5zdHJ1Y3Rpb25zLgotCi1UdWUgTWF5IDI1IDEzOjA1OjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaDg1MDAtZGlzLmMgKHByaW50X2luc25faDg1MDApOiBBZGRyZXNzIGFyZ3VtZW50IGlzIHR5cGUKLQliZmRfdm1hLgotCSogejhrLWRpcy5jIChwcmludF9pbnNuX3o4aywgcHJpbnRfaW5zbl96ODAwMSwgcHJpbnRfaW5zbl96ODAwMik6Ci0JRGl0dG8uCi0KLQkqIGg4NTAwLW9wYy5oIChhZGRyX2NsYXNzX3R5cGUpOiBObyBjb21tYSBhdCBlbmQgb2YgZW51bWVyYXRvci4KLQkqIHNoLW9wYy5oIChzaF9uaWJibGVfdHlwZSwgc2hfYXJnX3R5cGUpOiBEaXR0by4KLQotCSogc3BhcmMtZGlzLmMgKGNvbXBhcmVfb3Bjb2Rlcyk6IE1vdmUgc3RhdGljIGRlY2xhcmF0aW9uIHRvCi0JdG9wLWxldmVsLgotCi1GcmkgTWF5IDIxIDE0OjE3OjM3IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBJbXBsZW1lbnQgJ24nIGFyZ3VtZW50IGZvciB1bmltcAotCWluc3RydWN0aW9uLCByZW1vdmUgdW5pbXAgaGFjayBmcm9tICdsJyBhcmd1bWVudC4KLQotV2VkIE1heSAxOSAxNTozNTo1NCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmMgKGZldGNoX2RhdGEpOiAgVXNlIHVuc2lnbmVkIGNoYXIgdG8gbWFrZSBhbmNpZW50IGdjYydzCi0JaGFwcHkuCi0KLUZyaSBNYXkgMTQgMTU6MjI6NDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBCYXNlZCBvbiBwYXRjaGVzIGZyb20gZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKToKLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlICdDJyBmb3IgZ2VuZXJhbCBjb3Byb2Nlc3NvcgotCWluc3RydWN0aW9ucy4KLQotRnJpIE1heSAxNCAwMDowOToxNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmM6IEluY2x1ZGUgZGlzLWFzbS5oIGJlZm9yZSBzeXNkZXAuaC4gIENoYW5nZWQgc29tZQotCWFycmF5cyBvZiBzdHJpbmcgcG9pbnRlcnMgdG8gMi1kIGFycmF5cyBvZiBjaGFycywgdG8gc2F2ZQotCXNwYWNlLgotCi1UaHUgTWF5ICA2IDIwOjUxOjE3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBhMjlrLWRpcy5jLCBhbHBoYS1kaXMuYywgaTk2MC1kaXMuYywgc3BhcmMtZGlzLmMsIHo4ay1kaXMuYzoKLQlDYXN0IHNlY29uZCBhcmcgdG8gcmVhZF9tZW1vcnlfZnVuYyB0byAiYmZkX2J5dGUgKiIsIGFzIG5lY2Vzc2FyeS4KLQotVHVlIE1heSAgNCAyMDozMToxMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGhwcGEtZGlzLmM6IE5ldyBmaWxlIGZyb20gVXRhaCwgYWRhcHRlZCB0byBuZXcgZGlzYXNzZW1ibGVyCi0JY2FsbGluZyBpbnRlcmZhY2UuCi0JKiBNYWtlZmlsZS5pbjogSW5jbHVkZSBpdC4KLQotTW9uIEFwciAyNiAxODoxNzo0MiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc2gtZGlzLmMsIHNoLW9wYy5oOiBOZXcgZmlsZXMuCi0KLUZyaSBBcHIgMjMgMTg6NTE6MjIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFscGhhLWRpcy5jLCBhbHBoYS1vcGMuaDogTmV3IGZpbGVzLgotCi1UdWUgQXByICA2IDEyOjU0OjA4IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogbWlwcy1kaXMuYzogU2lnbiBleHRlbmQgJ2onIGFuZCAnYicgYXJndW1lbnRzLCBkZWx0YSBpcyBhIHNpZ25lZAotCXZhbHVlLgotCi1Nb24gQXByICA1IDE3OjM3OjM3IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYzogTWFrZSAidGEiIHRoZSBkZWZhdWx0IHRyYXAgaW5zdHJ1Y3Rpb24sICJ0IiB0aGUgYWxpYXMuCi0KLUZyaSBBcHIgIDIgMDc6MjQ6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhMjlrLWRpcy5jLCBzcGFyYy1kaXMuYywgc3BhcmMtb3BjLmM6IFVzZSBDT05TVCByYXRoZXIgdGhhbgotCWNvbnN0LgotCi1UaHUgQXByICAxIDExOjIwOjQzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYzogVXNlIGZwcmludGZfZnVuYyBhIGZldyBwbGFjZXMgd2hlcmUgSSBmb3Jnb3QsCi0JYW5kIGRvdWJsZSBwZXJjZW50IHNpZ25zIGEgZmV3IHBsYWNlcy4KLQotCSogYTI5ay1kaXMuYywgaTk2MC1kaXMuYzogTmV3LCBtZXJnZWQgZnJvbSBnZGIgYW5kIGJpbnV0aWxzLgotCi0JKiBpMzg2LWRpcy5jLCBtNjhrLWRpcy5jLCBtaXBzLWRpcy5jLCBzcGFyYy1kaXMuYzoKLQlVc2UgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIG5vdCBwcmludF9hZGRyZXNzLgotCi0JKiBkaXMtYnVmLmMgKGdlbmVyaWNfcHJpbnRfYWRkcmVzcyk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIE1hciAzMSAxMDowNzowNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBzcGFyYy1kaXMuYy4KLQlzcGFyYy1kaXMuYzogTmV3IGZpbGUsIG1lcmdlcyBiaW51dGlscyBhbmQgZ2RiIHZlcnNpb25zIGFzIGZvbGxvd3M6Ci0JRnJvbSBHREI6Ci0JICAgIEFkZCBgYWRkJyBpbnN0cnVjdGlvbiB0byB0aGUgc2V0IHRoYXQgZ2V0IGNoZWNrZWQKLQkgICAgZm9yIGEgcHJlY2VkaW5nIGBzZXRoaScgaW4gb3JkZXIgdG8gcHJpbnQgYW4gYWJzb2x1dGUgYWRkcmVzcy4KLQkgICAgKiAocHJpbnRfaW5zbik6ICBEaXNhc3NlbWJseSBwcmVmZXJzIHJlYWwgaW5zdHJ1Y3Rpb25zLgotCSAgICAoaXNfZGVsYXllZF9icmFuY2gpOiAgU3BlZWQgdXAuCi0JICAgICogc3BhcmMtb3Bjb2RlLmg6IEFkZCBBTElBUyBiaXQgdG8gYWxpYXNlcy4gIEZpeCB1cCBvcGNvZGUgdGFibGVzLgotCSAgICBTdGlsbCBtaXNzaW5nIHNvbWUgZmxvYXQgb3BzLCBhbmQgbmVlZHMgdGVzdGluZy4KLQkgICAgKiBzcGFyYy1waW5zbi5jIChwcmludF9pbnNuKTogRWxpbWluYXRlICdzZXQnIHRlc3QsIHN1YnN1bWVkIGJ5Ci0JICAgIEZfQUxJQVMuICBVc2UgcHJpbnRmLCBub3QgZnByaW50Ziwgd2hlbiBub3QgcGFzc2luZyBhIGZpbGUKLQkgICAgcG9pbnRlci4uLgotCSAgICAoY29tcGFyZV9vcGNvZGVzKTogQ2hlY2sgdGhhdCBpZGVudGljYWwgaW5zdHJ1Y3Rpb25zIGhhdmUKLQkgICAgaWRlbnRpY2FsIG9wY29kZXMsIGNvbXBsYWluIG90aGVyd2lzZS4KLQlGcm9tIGJpbnV0aWxzOgotCSAgICAqIE5ldyAnbScgYXJnLgotCSAgICAqIEluY2x1ZGUgcmVnX25hbWVzLgotCUZyb20gbmVpdGhlcjoKLQkgICAgVXNlIGRpcy1hc20uaC9yZWFkX21lbW9yeV9mdW5jIGludGVyZmFjZS4KLQotV2VkIE1hciAzMSAyMDo0OTowNiAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGg4NTAwLWRpcy5jLCBpMzg2LWRpcy5jLCBtNjhrLWRpcy5jLCB6OGstZGlzLmMgKGZldGNoX2RhdGEpOgotCSAgZGVsaWJlcmF0ZWx5IHJldHVybiBub24temVybyB0byBzZXRqbXAgZnJvbSBsb25nam1wLiAgT3RoZXJ3aXNlCi0JICB0aGlzIGNvZGUgZmFpbHMgdG8gY29tcGlsZS4KLQotV2VkIE1hciAzMSAxNzowNDozMSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBtNjhrLWRpcy5jOiAgRml4IHByb3RvdHlwZSBmb3IgZmV0Y2hfYXJnKCkuCi0KLVdlZCBNYXIgMzEgMTA6MDc6MDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGRpcy1idWYuYzogTmV3IGZpbGUsIGZvciBuZXcgcmVhZF9tZW1vcnlfZnVuYyBpbnRlcmZhY2UuCi0JTWFrZWZpbGUuaW4gKE9GSUxFUyk6IEluY2x1ZGUgaXQuCi0JbTY4ay1kaXMuYywgaTM4Ni1kaXMuYywgaDg1MDAtZGlzLmMsIG1pcHMtZGlzLmMsIHo4ay1kaXMuYzoKLQlVc2UgbmV3IHJlYWRfbWVtb3J5X2Z1bmMgaW50ZXJmYWNlLgotCi1Nb24gTWFyIDI5IDE0OjAyOjE3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBoODUwMC1kaXMuYyAocHJpbnRfaW5zbl9oODUwMCk6IEdldCBzaWduIG9mIGZwIG9mZnNldHMgcmlnaHQuCi0JKiBoODUwMC1vcGMuaDogRml4IGNvdXBsZSBvZiBvcGNvZGVzLgotCi1XZWQgTWFyIDI0IDAyOjAzOjM2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGR2aSAmIGluc3RhbGxjaGVjayB0YXJnZXRzCi0KLU1vbiBNYXIgMjIgMTg6NTU6MDQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIGZvciBoODUwMC1kaXMuYy4KLQotRnJpIE1hciAxOSAxNDoyNzoxNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaDg1MDAtZGlzLmMsIGg4NTAwLW9wYy5oOiBOZXcgZmlsZXMKLQotVGh1IE1hciAxOCAxNDoxMjozNyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMsIHo4ay1kaXMuYzogIENvbnZlcnRlZCB0byB1c2UgaW50ZXJmYWNlIGRlZmluZWQgaW4KLQkuLi9pbmNsdWRlL2Rpcy1hc20uaC4KLQkqIG02OGstZGlzLmM6ICBOZXcgZmlsZSAobWVyZ2Ugb2YgLi4vYmludXRpbHMvbTY4ay1waW5zbi5jCi0JYW5kIC4uL2dkYi9tNjhrLXBpbnNuLmMpLgotCSogaTM4Ni1kaXMuYzogIE5ldyBmaWxlIChtZXJnZSBvZiAuLi9iaW51dGlscy9pMzg2LXBpbnNuLmMKLQlhbmQgLi4vZ2RiL2kzODYtcGluc24uYykuCi0JKiBtNjg4ODEtZXh0LmM6ICBOZXcgZmlsZS4gIE1vdmVkIGRlZmluaXRpb24gb2YKLQlleHRfZm9ybWF0IGV4dF9mb3JtYXRfNjg4ODEgZnJvbSAuLi9nZGIvbTY4ay10ZGVwLmMuCi0JKiBNYWtlZmlsZS5pbjogIEFkanVzdCBmb3IgbmV3IGZpbGVzLgotCSogaTM4Ni1kaXMuYzogIFBhdGNoZXMgZnJvbSBKb2huIEhhc3NleSAoaGFzc2V5QGRnLXJ0cC5kZy5jb20pLgotCSogbTY4ay1kaXMuYzogIFJlY29nbml6ZSAnOScgcGxhY2VtZW50IGNvZGUsIHNvIChzYXkpIHBmbHVzaAotCWNhbiBiZSBkaXMtYXNzZW1ibGVkLgotCi1XZWQgRmViIDE3IDA5OjE5OjQ3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBOb3cgcmV0dXJucyB2b2lkLgotCi1Nb24gSmFuIDExIDE2OjA5OjE2IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jIChhbnNpZGVjbC5oKTogIEluY2x1ZGUgZm9yIGJlbmVmaXQgb2Ygc3lzZGVwLmgKLQlmaWxlcyB0aGF0IHVzZSB0aGUgbWFjcm9zLgotCi1UaHUgSmFuICA3IDEzOjE1OjE3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYzogTmV3IGZpbGUsIGZyb20gZ2RiL21pcHMtcGluc24uYy4KLQkqIE1ha2VmaWxlLmluIChESVNfTElCUyk6IEFkZGVkIG1pcHMtZGlzLm8uCi0JKENGSUxFUyk6IEFkZGVkIG1pcHMtZGlzLmMuCi0KLVRodSBKYW4gIDcgMDc6MzY6MzMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLSAgICAJKiB6OGstZGlzLmMgKHByaW50X2luc25fejgwMDEsIHByaW50X2luc25fejgwMDIpOiBuZXcgcm91dGluZXMKLQkqIHo4a2dlbi5jLCB6OGstb3BjLmg6IGZpeCBzaXplcyBvZiBzb21lIHNoaWZ0cy4KLQotVHVlIERlYyAyMiAxNTo0Mjo0NCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgSW1wcm92ZSAqY2xlYW4gcnVsZXMuCi0JKiBjb25maWd1cmUuaW46ICBBbGxvdyBhIGRlZmF1bHQgaG9zdC4KLQotVHVlIE5vdiAxNyAxOTo1Mzo1NCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbHNvIHVzZSAtSSQoc3JjZGlyKS8uLi9iZmQsIHNpbmNlIHNvbWUgc3lzZGVwCi0JZmlsZXMgaW5jbHVkZSBvdGhlciBzeXNkZXAgZmlsZXMKLQotVGh1IE5vdiAxMiAxNjoxMDozNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jIHo4ay1vcGMuaCB6OGtnZW4uYzogY2hlY2twb2ludAotCi1GcmkgT2N0ICA5IDA0OjU2OjA1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBGb3IgaG9zdCBzdXBwb3J0LCB1c2UgLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0Jc28gaXQgc3RheXMgaW4gc3luYyB3aXRoIHRoZSAuLi9iZmQvaG9zdHMgZGF0YWJhc2UuCi0KLVRodSBPY3QgIDEgMjM6Mzg6NTQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBjcHUtdmVuZG9yLW9zIHRyaXBsZSBpbnN0ZWFkIG9mIG5lc3RlZCBjYXNlcwotCi1XZWQgU2VwIDMwIDE2OjA5OjIwIDE5OTIgIE1pY2hhZWwgV2VybmVyICAobXR3QGN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYyAodW5wYXJzZV9pbnN0cik6IGZpeCBidWcgd2hlcmUgb3Bjb2RlIHJldHVybmVkIHdhcwotCSphbHdheXMqIHRoZSB3cm9uZyBvbmUuCi0KLVdlZCBTZXAgMzAgMDc6NDI6MTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHo4a2dlbi5jOiBhZGRlZCBjb3B5cmlnaHQgaW5mbwotCi1UdWUgU2VwIDI5IDEyOjIwOjIxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmMgKHVucGFyc2VfaW5zdHIpOiBwcmV0dGllciB0YWJzCi0JKiB6OGtnZW4uYyAtPiB6OGstb3BjLmg6IGJ1ZyBmaXhlcyBpbiB0YWJsZXMKLQotRnJpIFNlcCAyNSAxMjo1MDozMiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgbmNyKiBjb25maWd1cmF0aW9uLgotCSogejhrLWRpcy5jIChzdHJ1Y3QgaW5zdHJfZGF0YV9zKTogIE1ha2UgaW5zdHJfYXNtc3JjIGNoYXIgdG8gbWFrZQotCXBpY2F5dW5lIEFOU0kgY29tcGlsZXJzIGhhcHB5LgotCi1TZXAgMjAgMDg6NTA6NTUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Nik6ICBNYWtlIGkzODYgYW5kIGk0ODYgc3lub255bW91cyBmb3Igbm93LgotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc3lzdjQpOiAgQWRkIG15X2hvc3QgZGVmaW5pdGlvbi4KLQotRnJpIFNlcCAxOCAxNzowMToyMyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRml4IHR5cG8uCi0KLUZyaSBTZXAgMTggMDI6MDQ6MjQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtYWtlKTogIFJlbW92ZSBvYnNvbGV0ZSBjcnVkLgotCShzcGFyYy1vcGMubyk6ICBBdm9pZCBTdW4gTWFrZSBWUEFUSCBidWcuCi0KLVR1ZSBTZXAgIDggMTc6Mjk6MjcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogc2luY2UgdGhlcmUgYXJlIG5vIFNVQkRJUlMsIHJlbW92ZSBydWxlIGFuZAotCXJlZmVyZW5jZXMgb2Ygc3ViZGlyX2RvLgotCi1UdWUgU2VwICA4IDE3OjAyOjU4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBHZXQgdGhlIGxpYnJhcnkgbmFtZSByaWdodCBoZXJlIHRvby4KLQlEb24ndCBpbnN0YWxsIGJmZC5oLCBzaW5jZSBpdCdzIHVucmVsYXRlZCB0byB0aGlzIGxpYnJhcnkuICBObwotCXN1YmRpcnMgdG8gcmVjdXJzZSBpbnRvLCBlaXRoZXIuCi0JKENGSUxFUyk6IFRoZSBzb3VyY2UgZmlsZSBoYXMgYSAuYyBzdWZmaXgsIG5vdCAuby4KLQotCSogc3BhcmMtb3BjLmM6IE5ldyBmaWxlLCBtb3ZlZCBmcm9tIEJGRC4KLQkqIE1ha2VmaWxlLmluIChPRklMRVMpOiBCdWlsZCBpdC4KLQotVGh1IFNlcCAgMyAxNjo1OToyMCAxOTkyICBNaWNoYWVsIFdlcm5lciAgKG10d0BjeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmM6IGZpeGVkIGZvcndhcmQgcmVmZmVyZW5jZXMgb2Ygc29tZSBkZWNsYXJhdGlvbnMuCi0KLU1vbiBBdWcgMzEgMTY6MDk6NDUgMTk5MiAgTWljaGFlbCBXZXJuZXIgIChtdHdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSByaWdodAotCi1Nb24gQXVnIDMxIDEzOjQ3OjM1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmM6IGtub3dzIGhvdyB0byBkaXNhc3NlbWJsZSB6OGsgc3R1ZmYKLQkqIHo4ay1vcGMuaDogbmV3IGZpbGUgZnVsbCBvZiB6ODAwMCBvcGNvZGVzCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL29wY29kZXMvTWFrZWZpbGUuYW0gYi9vcGNvZGVzL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGQxN2Y2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLVNVQkRJUlMgPSBwbwotCi1JTkNESVIgPSAkKHNyY2RpcikvLi4vaW5jbHVkZQotQkZERElSID0gJChzcmNkaXIpLy4uL2JmZAotTUtERVAgPSBta2RlcAotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJvcGNvZGVzLmxhCi0KLSMgVGhpcyBpcyB3aGVyZSBiZmQuaCBsaXZlcy4KLUJGRF9IID0gLi4vYmZkL2JmZC5oCi0KLSMgSGVhZGVyIGZpbGVzLgotSEZJTEVTID0gXAotCWFybS1vcGMuaCBcCi0JZnIzMC1kZXNjLmggZnIzMC1vcGMuaCBcCi0JaDg1MDAtb3BjLmggXAotCW0zMnItZGVzYy5oIG0zMnItb3BjLmggXAotCW1jb3JlLW9wYy5oIFwKLQlzaC1vcGMuaCBcCi0Jc3lzZGVwLmggXAotCXc2NS1vcGMuaCBcCi0JejhrLW9wYy5oCi0KLSMgQyBzb3VyY2UgZmlsZXMgdGhhdCBjb3JyZXNwb25kIHRvIC5vJ3MuCi1DRklMRVMgPSBcCi0JYTI5ay1kaXMuYyBcCi0JYWxwaGEtZGlzLmMgXAotCWFscGhhLW9wYy5jIFwKLQlhcmMtZGlzLmMgXAotCWFyYy1vcGMuYyBcCi0JYXJtLWRpcy5jIFwKLQljZ2VuLWFzbS5jIFwKLQljZ2VuLWRpcy5jIFwKLQljZ2VuLW9wYy5jIFwKLQlkMTB2LWRpcy5jIFwKLQlkMTB2LW9wYy5jIFwKLQlkMzB2LWRpcy5jIFwKLQlkMzB2LW9wYy5jIFwKLQlkaXMtYnVmLmMgXAotCWRpc2Fzc2VtYmxlLmMgXAotCWZyMzAtYXNtLmMgXAotCWZyMzAtZGVzYy5jIFwKLQlmcjMwLWRpcy5jIFwKLQlmcjMwLWlibGQuYyBcCi0JZnIzMC1vcGMuYyBcCi0JaDgzMDAtZGlzLmMgXAotCWg4NTAwLWRpcy5jIFwKLQlocHBhLWRpcy5jIFwKLQlpMzg2LWRpcy5jIFwKLQlpOTYwLWRpcy5jIFwKLQltMzJyLWFzbS5jIFwKLQltMzJyLWRlc2MuYyBcCi0JbTMyci1kaXMuYyBcCi0JbTMyci1pYmxkLmMgXAotCW0zMnItb3BjLmMgXAotCW0zMnItb3BpbnN0LmMgXAotCW02OGstZGlzLmMgXAotCW02OGstb3BjLmMgXAotCW04OGstZGlzLmMgXAotCW1jb3JlLWRpcy5jIFwKLQltaXBzLWRpcy5jIFwKLQltaXBzLW9wYy5jIFwKLQltaXBzMTYtb3BjLmMgXAotCW0xMDIwMC1kaXMuYyBcCi0JbTEwMjAwLW9wYy5jIFwKLQltMTAzMDAtZGlzLmMgXAotCW0xMDMwMC1vcGMuYyBcCi0JbnMzMmstZGlzLmMgXAotCXBqLWRpcy5jIFwKLQlwai1vcGMuYyBcCi0JcHBjLWRpcy5jIFwKLQlwcGMtb3BjLmMgXAotCXNoLWRpcy5jIFwKLQlzcGFyYy1kaXMuYyBcCi0Jc3BhcmMtb3BjLmMgXAotCXRpYzMwLWRpcy5jIFwKLQl0aWM4MC1kaXMuYyBcCi0JdGljODAtb3BjLmMgXAotCXY4NTAtZGlzLmMgXAotCXY4NTAtb3BjLmMgXAotCXZheC1kaXMuYyBcCi0JdzY1LWRpcy5jIFwKLQl6OGstZGlzLmMgXAotCXo4a2dlbi5jCi0KLUFMTF9NQUNISU5FUyA9IFwKLQlhMjlrLWRpcy5sbyBcCi0JYWxwaGEtZGlzLmxvIFwKLQlhbHBoYS1vcGMubG8gXAotCWFyYy1kaXMubG8gXAotCWFyYy1vcGMubG8gXAotCWFybS1kaXMubG8gXAotCWNnZW4tYXNtLmxvIFwKLQljZ2VuLWRpcy5sbyBcCi0JY2dlbi1vcGMubG8gXAotCWQxMHYtZGlzLmxvIFwKLQlkMTB2LW9wYy5sbyBcCi0JZDMwdi1kaXMubG8gXAotCWQzMHYtb3BjLmxvIFwKLQlmcjMwLWFzbS5sbyBcCi0JZnIzMC1kZXNjLmxvIFwKLQlmcjMwLWRpcy5sbyBcCi0JZnIzMC1pYmxkLmxvIFwKLQlmcjMwLW9wYy5sbyBcCi0JaDgzMDAtZGlzLmxvIFwKLQloODUwMC1kaXMubG8gXAotCWhwcGEtZGlzLmxvIFwKLQlpMzg2LWRpcy5sbyBcCi0JaTk2MC1kaXMubG8gXAotCW0zMnItYXNtLmxvIFwKLQltMzJyLWRlc2MubG8gXAotCW0zMnItZGlzLmxvIFwKLQltMzJyLWlibGQubG8gXAotCW0zMnItb3BjLmxvIFwKLQltMzJyLW9waW5zdC5sbyBcCi0JbTY4ay1kaXMubG8gXAotCW02OGstb3BjLmxvIFwKLQltODhrLWRpcy5sbyBcCi0JbTEwMjAwLWRpcy5sbyBcCi0JbTEwMjAwLW9wYy5sbyBcCi0JbTEwMzAwLWRpcy5sbyBcCi0JbTEwMzAwLW9wYy5sbyBcCi0JbWNvcmUtZGlzLmxvIFwKLQltaXBzLWRpcy5sbyBcCi0JbWlwcy1vcGMubG8gXAotCW1pcHMxNi1vcGMubG8gXAotCXBqLWRpcy5sbyBcCi0JcGotb3BjLmxvIFwKLQlwcGMtZGlzLmxvIFwKLQlwcGMtb3BjLmxvIFwKLQluczMyay1kaXMubG8gXAotCXNoLWRpcy5sbyBcCi0Jc3BhcmMtZGlzLmxvIFwKLQlzcGFyYy1vcGMubG8gXAotCXRpYzMwLWRpcy5sbyBcCi0JdGljODAtZGlzLmxvIFwKLQl0aWM4MC1vcGMubG8gXAotCXY4NTAtZGlzLmxvIFwKLQl2ODUwLW9wYy5sbyBcCi0JdmF4LWRpcy5sbyBcCi0JdzY1LWRpcy5sbyBcCi0JejhrLWRpcy5sbwotCi1PRklMRVMgPSBAQkZEX01BQ0hJTkVTQAotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChJTkNESVIpIC1JJChCRkRESVIpIEBIREVGSU5FU0AgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwKLQotZGlzYXNzZW1ibGUubG86IGRpc2Fzc2VtYmxlLmMgJChJTkNESVIpL2Rpcy1hc20uaAotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyBAYXJjaGRlZnNAICQoc3JjZGlyKS9kaXNhc3NlbWJsZS5jCi0KLWxpYm9wY29kZXNfbGFfU09VUkNFUyA9ICBkaXMtYnVmLmMgZGlzYXNzZW1ibGUuYwotbGlib3Bjb2Rlc19sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykKLWxpYm9wY29kZXNfbGFfTElCQUREID0gJChPRklMRVMpIEBXSU4zMkxJQkFEREAKLWxpYm9wY29kZXNfbGFfTERGTEFHUyA9IC1yZWxlYXNlICQoVkVSU0lPTikgQFdJTjMyTERGTEFHU0AKLQotIyBsaWJ0b29sIHdpbGwgYnVpbGQgLmxpYnMvbGlib3Bjb2Rlcy5hLiAgV2UgY3JlYXRlIGxpYm9wY29kZXMuYSBpbgotIyB0aGUgYnVpbGQgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUKLSMgcHJvZ3JhbXMgdGhhdCB1c2UgbGlib3Bjb2Rlcy5hIHNpbXVsdGFuZW91c2x5LiAgVGhpcyBpcyBhIGhhY2sgd2hpY2gKLSMgc2hvdWxkIGJlIHJlbW92ZWQgaWYgZXZlcnl0aGluZyBlbHNlIHN0YXJ0cyB1c2luZyBsaWJ0b29sLiAgRklYTUUuCi0KLW5vaW5zdF9MSUJSQVJJRVMgPSBsaWJvcGNvZGVzLmEKLQotc3RhbXAtbGliOiBsaWJvcGNvZGVzLmxhCi0JaWYgWyAtZiAubGlicy9saWJvcGNvZGVzLmEgXTsgdGhlbiBcCi0JICBjcCAubGlicy9saWJvcGNvZGVzLmEgbGlib3Bjb2Rlcy50bXA7IFwKLQkgICQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJvcGNvZGVzLnRtcCBsaWJvcGNvZGVzLmE7IFwKLQllbHNlIHRydWU7IGZpCi0JdG91Y2ggc3RhbXAtbGliCi0KLWxpYm9wY29kZXMuYTogc3RhbXAtbGliIDsgQHRydWUKLQotUE9URklMRVMgPSAkKEhGSUxFUykgJChDRklMRVMpCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi0jIFdlIHNob3VsZCByZWNvbmZpZ3VyZSB3aGVuZXZlciBiZmQvY29uZmlndXJlLmluIGNoYW5nZXMsIGJlY2F1c2UKLSMgdGhhdCdzIHdoZXJlIHRoZSB2ZXJzaW9uIG51bWJlciBjb21lcyBmcm9tLgotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvLi4vYmZkL2NvbmZpZ3VyZS5pbgotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotQ0xFQU5GSUxFUyA9IFwKLQlsaWJvcGNvZGVzLmEgc3RhbXAtbGliIGRlcC5zZWQgREVQIERFUDEKLQotCi0KLSMgVGhlIHN0YXJ0IG1hcmtlciBpcyB3cml0dGVuIHRoaXMgd2F5IHRvIHBhc3MgdGhyb3VnaCBhdXRvbWFrZSB1bnNjYXRoZWQuCi0KLQotCi0KLSMgVGhpcyBkZXBlbmRlbmN5IHN0dWZmIGlzIGNvcGllZCBmcm9tIEJGRC4KLQotREVQOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgY29uZmlnLmgKLQlybSAtZiBERVAxCi0JJChNQUtFKSBNS0RFUD0kKE1LREVQKSBERVAxCi0Jc2VkIC1mIGRlcC5zZWQgPCBERVAxID4gREVQCi0KLURFUDE6ICQoQ0ZJTEVTKQotCXJtIC1mIERFUDIgREVQMmEKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IERFUDIKLQllY2hvID4gREVQMmEKLQkkKE1LREVQKSAtZiBERVAyYSAkKElOQ0xVREVTKSAkKENGTEFHUykgJD8KLQlzZWQgLWUgJy9ETyBOT1QgREVMRVRFL2QnIC1lICcvXiQkL2QnIDwgREVQMmEgPj4gREVQMgotCXJtIC1mIERFUDJhCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIERFUDIgREVQMQotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKLQkJLWUgJ3MhQEJGRF9IQCEkKEJGRF9IKSEnCVwKLQkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAotCQktZSAncyFAQkZERElSQCEkKEJGRERJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCi0KLWRlcDogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCBERVAgPj4gdG1wLU1ha2VmaWxlCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IERFUAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi0uUEhPTlk6IGRlcCBkZXAtaW4gZGVwLWFtCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi1hMjlrLWRpcy5sbzogYTI5ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLWFscGhhLWRpcy5sbzogYWxwaGEtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaAotYWxwaGEtb3BjLmxvOiBhbHBoYS1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggXAotICAkKEJGRF9IKSBvcGludGwuaAotYXJjLWRpcy5sbzogYXJjLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIG9waW50bC5oCi1hcmMtb3BjLmxvOiBhcmMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hcmMuaCBcCi0gIG9waW50bC5oCi1hcm0tZGlzLmxvOiBhcm0tZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oIGFybS1vcGMuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIG9waW50bC5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLWNnZW4tYXNtLmxvOiBjZ2VuLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG9waW50bC5oCi1jZ2VuLWRpcy5sbzogY2dlbi1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmgKLWNnZW4tb3BjLmxvOiBjZ2VuLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaAotZDEwdi1kaXMubG86IGQxMHYtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1kMTB2LW9wYy5sbzogZDEwdi1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaAotZDMwdi1kaXMubG86IGQzMHYtZGlzLmMgJChJTkNESVIpL29wY29kZS9kMzB2LmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIG9waW50bC5oCi1kMzB2LW9wYy5sbzogZDMwdi1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaAotZGlzLWJ1Zi5sbzogZGlzLWJ1Zi5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSBvcGludGwuaAotZGlzYXNzZW1ibGUubG86IGRpc2Fzc2VtYmxlLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1mcjMwLWFzbS5sbzogZnIzMC1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtZGVzYy5sbzogZnIzMC1kZXNjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWRpcy5sbzogZnIzMC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1pYmxkLmxvOiBmcjMwLWlibGQuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1vcGMubG86IGZyMzAtb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oCi1oODMwMC1kaXMubG86IGg4MzAwLWRpcy5jICQoSU5DRElSKS9vcGNvZGUvaDgzMDAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWg4NTAwLWRpcy5sbzogaDg1MDAtZGlzLmMgaDg1MDAtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIG9waW50bC5oCi1ocHBhLWRpcy5sbzogaHBwYS1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotaTM4Ni1kaXMubG86IGkzODYtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIGNvbmZpZy5oIG9waW50bC5oCi1pOTYwLWRpcy5sbzogaTk2MC1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmgKLW0zMnItYXNtLmxvOiBtMzJyLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1kZXNjLmxvOiBtMzJyLWRlc2MuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItZGlzLmxvOiBtMzJyLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWlibGQubG86IG0zMnItaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLW9wYy5sbzogbTMyci1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmgKLW0zMnItb3BpbnN0LmxvOiBtMzJyLW9waW5zdC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaAotbTY4ay1kaXMubG86IG02OGstZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9mbG9hdGZvcm1hdC5oIG9waW50bC5oIFwKLSAgJChJTkNESVIpL29wY29kZS9tNjhrLmgKLW02OGstb3BjLmxvOiBtNjhrLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oCi1tODhrLWRpcy5sbzogbTg4ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tODhrLmggb3BpbnRsLmgKLW1jb3JlLWRpcy5sbzogbWNvcmUtZGlzLmMgbWNvcmUtb3BjLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi1taXBzLWRpcy5sbzogbWlwcy1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9taXBzLmggb3BpbnRsLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotbWlwcy1vcGMubG86IG1pcHMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9taXBzLmgKLW1pcHMxNi1vcGMubG86IG1pcHMxNi1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaAotbTEwMjAwLWRpcy5sbzogbTEwMjAwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotbTEwMjAwLW9wYy5sbzogbTEwMjAwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi1tMTAzMDAtZGlzLmxvOiBtMTAzMDAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi1tMTAzMDAtb3BjLmxvOiBtMTAzMDAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmgKLW5zMzJrLWRpcy5sbzogbnMzMmstZGlzLmMgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCi0gIG9waW50bC5oCi1wai1kaXMubG86IHBqLWRpcy5jICQoSU5DRElSKS9vcGNvZGUvcGouaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXBqLW9wYy5sbzogcGotb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9wai5oCi1wcGMtZGlzLmxvOiBwcGMtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvcHBjLmgKLXBwYy1vcGMubG86IHBwYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oIFwKLSAgb3BpbnRsLmgKLXNoLWRpcy5sbzogc2gtZGlzLmMgc2gtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oCi1zcGFyYy1kaXMubG86IHNwYXJjLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvbGliaWJlcnR5Lmggb3BpbnRsLmgKLXNwYXJjLW9wYy5sbzogc3BhcmMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oCi10aWMzMC1kaXMubG86IHRpYzMwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLXRpYzgwLWRpcy5sbzogdGljODAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotdGljODAtb3BjLmxvOiB0aWM4MC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmgKLXY4NTAtZGlzLmxvOiB2ODUwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotdjg1MC1vcGMubG86IHY4NTAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS92ODUwLmggXAotICBvcGludGwuaAotdmF4LWRpcy5sbzogdmF4LWRpcy5jICQoSU5DRElSKS9vcGNvZGUvdmF4LmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oCi13NjUtZGlzLmxvOiB3NjUtZGlzLmMgdzY1LW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaAotejhrLWRpcy5sbzogejhrLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSB6OGstb3BjLmgKLXo4a2dlbi5sbzogejhrZ2VuLmMgc3lzZGVwLmggY29uZmlnLmgKLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9NYWtlZmlsZS5pbiBiL29wY29kZXMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxODNhYzcuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDg3MyArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQkZEX01BQ0hJTkVTID0gQEJGRF9NQUNISU5FU0AKLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUNDID0gQENDQAotQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRVhFRVhUID0gQEVYRUVYVEAKLUVYRUVYVF9GT1JfQlVJTEQgPSBARVhFRVhUX0ZPUl9CVUlMREAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSERFRklORVMgPSBASERFRklORVNACi1JTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi1JTlRMREVQUyA9IEBJTlRMREVQU0AKLUlOVExMSUJTID0gQElOVExMSUJTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTk0gPSBATk1ACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1QT0ZJTEVTID0gQFBPRklMRVNACi1QT1NVQiA9IEBQT1NVQkAKLVJBTkxJQiA9IEBSQU5MSUJACi1VU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKLVVTRV9OTFMgPSBAVVNFX05MU0AKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRSA9IEBVU0VfU1lNQk9MX1VOREVSU0NPUkVACi1WRVJTSU9OID0gQFZFUlNJT05ACi1XSU4zMkxERkxBR1MgPSBAV0lOMzJMREZMQUdTQAotV0lOMzJMSUJBREQgPSBAV0lOMzJMSUJBRERACi1hcmNoZGVmcyA9IEBhcmNoZGVmc0AKLWwgPSBAbEAKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1TVUJESVJTID0gcG8KLQotSU5DRElSID0gJChzcmNkaXIpLy4uL2luY2x1ZGUKLUJGRERJUiA9ICQoc3JjZGlyKS8uLi9iZmQKLU1LREVQID0gbWtkZXAKLQotbGliX0xUTElCUkFSSUVTID0gbGlib3Bjb2Rlcy5sYQotCi0jIFRoaXMgaXMgd2hlcmUgYmZkLmggbGl2ZXMuCi1CRkRfSCA9IC4uL2JmZC9iZmQuaAotCi0jIEhlYWRlciBmaWxlcy4KLUhGSUxFUyA9IFwKLQlhcm0tb3BjLmggXAotCWZyMzAtZGVzYy5oIGZyMzAtb3BjLmggXAotCWg4NTAwLW9wYy5oIFwKLQltMzJyLWRlc2MuaCBtMzJyLW9wYy5oIFwKLQltY29yZS1vcGMuaCBcCi0Jc2gtb3BjLmggXAotCXN5c2RlcC5oIFwKLQl3NjUtb3BjLmggXAotCXo4ay1vcGMuaAotCi0KLSMgQyBzb3VyY2UgZmlsZXMgdGhhdCBjb3JyZXNwb25kIHRvIC5vJ3MuCi1DRklMRVMgPSBcCi0JYTI5ay1kaXMuYyBcCi0JYWxwaGEtZGlzLmMgXAotCWFscGhhLW9wYy5jIFwKLQlhcmMtZGlzLmMgXAotCWFyYy1vcGMuYyBcCi0JYXJtLWRpcy5jIFwKLQljZ2VuLWFzbS5jIFwKLQljZ2VuLWRpcy5jIFwKLQljZ2VuLW9wYy5jIFwKLQlkMTB2LWRpcy5jIFwKLQlkMTB2LW9wYy5jIFwKLQlkMzB2LWRpcy5jIFwKLQlkMzB2LW9wYy5jIFwKLQlkaXMtYnVmLmMgXAotCWRpc2Fzc2VtYmxlLmMgXAotCWZyMzAtYXNtLmMgXAotCWZyMzAtZGVzYy5jIFwKLQlmcjMwLWRpcy5jIFwKLQlmcjMwLWlibGQuYyBcCi0JZnIzMC1vcGMuYyBcCi0JaDgzMDAtZGlzLmMgXAotCWg4NTAwLWRpcy5jIFwKLQlocHBhLWRpcy5jIFwKLQlpMzg2LWRpcy5jIFwKLQlpOTYwLWRpcy5jIFwKLQltMzJyLWFzbS5jIFwKLQltMzJyLWRlc2MuYyBcCi0JbTMyci1kaXMuYyBcCi0JbTMyci1pYmxkLmMgXAotCW0zMnItb3BjLmMgXAotCW0zMnItb3BpbnN0LmMgXAotCW02OGstZGlzLmMgXAotCW02OGstb3BjLmMgXAotCW04OGstZGlzLmMgXAotCW1jb3JlLWRpcy5jIFwKLQltaXBzLWRpcy5jIFwKLQltaXBzLW9wYy5jIFwKLQltaXBzMTYtb3BjLmMgXAotCW0xMDIwMC1kaXMuYyBcCi0JbTEwMjAwLW9wYy5jIFwKLQltMTAzMDAtZGlzLmMgXAotCW0xMDMwMC1vcGMuYyBcCi0JbnMzMmstZGlzLmMgXAotCXBqLWRpcy5jIFwKLQlwai1vcGMuYyBcCi0JcHBjLWRpcy5jIFwKLQlwcGMtb3BjLmMgXAotCXNoLWRpcy5jIFwKLQlzcGFyYy1kaXMuYyBcCi0Jc3BhcmMtb3BjLmMgXAotCXRpYzMwLWRpcy5jIFwKLQl0aWM4MC1kaXMuYyBcCi0JdGljODAtb3BjLmMgXAotCXY4NTAtZGlzLmMgXAotCXY4NTAtb3BjLmMgXAotCXZheC1kaXMuYyBcCi0JdzY1LWRpcy5jIFwKLQl6OGstZGlzLmMgXAotCXo4a2dlbi5jCi0KLQotQUxMX01BQ0hJTkVTID0gXAotCWEyOWstZGlzLmxvIFwKLQlhbHBoYS1kaXMubG8gXAotCWFscGhhLW9wYy5sbyBcCi0JYXJjLWRpcy5sbyBcCi0JYXJjLW9wYy5sbyBcCi0JYXJtLWRpcy5sbyBcCi0JY2dlbi1hc20ubG8gXAotCWNnZW4tZGlzLmxvIFwKLQljZ2VuLW9wYy5sbyBcCi0JZDEwdi1kaXMubG8gXAotCWQxMHYtb3BjLmxvIFwKLQlkMzB2LWRpcy5sbyBcCi0JZDMwdi1vcGMubG8gXAotCWZyMzAtYXNtLmxvIFwKLQlmcjMwLWRlc2MubG8gXAotCWZyMzAtZGlzLmxvIFwKLQlmcjMwLWlibGQubG8gXAotCWZyMzAtb3BjLmxvIFwKLQloODMwMC1kaXMubG8gXAotCWg4NTAwLWRpcy5sbyBcCi0JaHBwYS1kaXMubG8gXAotCWkzODYtZGlzLmxvIFwKLQlpOTYwLWRpcy5sbyBcCi0JbTMyci1hc20ubG8gXAotCW0zMnItZGVzYy5sbyBcCi0JbTMyci1kaXMubG8gXAotCW0zMnItaWJsZC5sbyBcCi0JbTMyci1vcGMubG8gXAotCW0zMnItb3BpbnN0LmxvIFwKLQltNjhrLWRpcy5sbyBcCi0JbTY4ay1vcGMubG8gXAotCW04OGstZGlzLmxvIFwKLQltMTAyMDAtZGlzLmxvIFwKLQltMTAyMDAtb3BjLmxvIFwKLQltMTAzMDAtZGlzLmxvIFwKLQltMTAzMDAtb3BjLmxvIFwKLQltY29yZS1kaXMubG8gXAotCW1pcHMtZGlzLmxvIFwKLQltaXBzLW9wYy5sbyBcCi0JbWlwczE2LW9wYy5sbyBcCi0JcGotZGlzLmxvIFwKLQlwai1vcGMubG8gXAotCXBwYy1kaXMubG8gXAotCXBwYy1vcGMubG8gXAotCW5zMzJrLWRpcy5sbyBcCi0Jc2gtZGlzLmxvIFwKLQlzcGFyYy1kaXMubG8gXAotCXNwYXJjLW9wYy5sbyBcCi0JdGljMzAtZGlzLmxvIFwKLQl0aWM4MC1kaXMubG8gXAotCXRpYzgwLW9wYy5sbyBcCi0Jdjg1MC1kaXMubG8gXAotCXY4NTAtb3BjLmxvIFwKLQl2YXgtZGlzLmxvIFwKLQl3NjUtZGlzLmxvIFwKLQl6OGstZGlzLmxvCi0KLQotT0ZJTEVTID0gQEJGRF9NQUNISU5FU0AKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoSU5DRElSKSAtSSQoQkZERElSKSBASERFRklORVNAIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsCi0KLWxpYm9wY29kZXNfbGFfU09VUkNFUyA9IGRpcy1idWYuYyBkaXNhc3NlbWJsZS5jCi1saWJvcGNvZGVzX2xhX0RFUEVOREVOQ0lFUyA9ICQoT0ZJTEVTKQotbGlib3Bjb2Rlc19sYV9MSUJBREQgPSAkKE9GSUxFUykgQFdJTjMyTElCQUREQAotbGlib3Bjb2Rlc19sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSBAV0lOMzJMREZMQUdTQAotCi0jIGxpYnRvb2wgd2lsbCBidWlsZCAubGlicy9saWJvcGNvZGVzLmEuICBXZSBjcmVhdGUgbGlib3Bjb2Rlcy5hIGluCi0jIHRoZSBidWlsZCBkaXJlY3Rvcnkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNvbnZlcnQgYWxsIHRoZQotIyBwcm9ncmFtcyB0aGF0IHVzZSBsaWJvcGNvZGVzLmEgc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGEgaGFjayB3aGljaAotIyBzaG91bGQgYmUgcmVtb3ZlZCBpZiBldmVyeXRoaW5nIGVsc2Ugc3RhcnRzIHVzaW5nIGxpYnRvb2wuICBGSVhNRS4KLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYm9wY29kZXMuYQotCi1QT1RGSUxFUyA9ICQoSEZJTEVTKSAkKENGSUxFUykKLQotQ0xFQU5GSUxFUyA9IFwKLQlsaWJvcGNvZGVzLmEgc3RhbXAtbGliIGRlcC5zZWQgREVQIERFUDEKLQotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAKLUxJQlJBUklFUyA9ICAkKG5vaW5zdF9MSUJSQVJJRVMpCi0KLQotREVGUyA9IEBERUZTQCAtSS4gLUkkKHNyY2RpcikgLUkuCi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLUxJQlMgPSBATElCU0AKLWxpYm9wY29kZXNfYV9MSUJBREQgPSAKLWxpYm9wY29kZXNfYV9TT1VSQ0VTID0gbGlib3Bjb2Rlcy5hLmMKLWxpYm9wY29kZXNfYV9PQkpFQ1RTID0gIGxpYm9wY29kZXMuYS5vCi1MVExJQlJBUklFUyA9ICAkKGxpYl9MVExJQlJBUklFUykKLQotbGlib3Bjb2Rlc19sYV9PQkpFQ1RTID0gIGRpcy1idWYubG8gZGlzYXNzZW1ibGUubG8KLUNGTEFHUyA9IEBDRkxBR1NACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotRElTVF9DT01NT04gPSAgLi9zdGFtcC1oLmluIENoYW5nZUxvZyBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbiBcCi1hY2luY2x1ZGUubTQgYWNsb2NhbC5tNCBjb25maWcuaW4gY29uZmlndXJlIGNvbmZpZ3VyZS5pbgotCi0KLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi0KLVRBUiA9IGd0YXIKLUdaSVBfRU5WID0gLS1iZXN0Ci1TT1VSQ0VTID0gbGlib3Bjb2Rlcy5hLmMgJChsaWJvcGNvZGVzX2xhX1NPVVJDRVMpCi1PQkpFQ1RTID0gbGlib3Bjb2Rlcy5hLm8gJChsaWJvcGNvZGVzX2xhX09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5sbyAubyAucwotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBNYWtlZmlsZQotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9JEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0kKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIGNvbmZpZ3VyZS5pbiAgYWNpbmNsdWRlLm00Ci0JY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkKLSQoc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKQotCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQotCi1jb25maWcuaDogc3RhbXAtaAotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiBzdGFtcC1oOyBcCi0JCSQoTUFLRSkgc3RhbXAtaDsgXAotCWVsc2UgOjsgZmkKLXN0YW1wLWg6ICQoc3JjZGlyKS9jb25maWcuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gXAotCSAgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0JQGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaCAyPiAvZGV2L251bGwKLSQoc3JjZGlyKS9jb25maWcuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2Rpcikvc3RhbXAtaC5pbgotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCQkkKE1BS0UpICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JZWxzZSA6OyBmaQotJChzcmNkaXIpL3N0YW1wLWguaW46ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCi0JQGVjaG8gdGltZXN0YW1wID4gJChzcmNkaXIpL3N0YW1wLWguaW4gMj4gL2Rldi9udWxsCi0KLW1vc3RseWNsZWFuLWhkcjoKLQotY2xlYW4taGRyOgotCi1kaXN0Y2xlYW4taGRyOgotCS1ybSAtZiBjb25maWcuaAotCi1tYWludGFpbmVyLWNsZWFuLWhkcjoKLQotbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi1jbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0JLXRlc3QgLXogIiQobm9pbnN0X0xJQlJBUklFUykiIHx8IHJtIC1mICQobm9pbnN0X0xJQlJBUklFUykKLQotZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLW1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTOgotCi1jbGVhbi1saWJMVExJQlJBUklFUzoKLQktdGVzdCAteiAiJChsaWJfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKGxpYl9MVExJQlJBUklFUykKLQotZGlzdGNsZWFuLWxpYkxUTElCUkFSSUVTOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTOgotCi1pbnN0YWxsLWxpYkxUTElCUkFSSUVTOiAkKGxpYl9MVExJQlJBUklFUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikKLQlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJCRwICQoREVTVERJUikkKGxpYmRpcikvJCRwIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQotdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICAkKExJQlRPT0wpICAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvJCRwOyBcCi0JZG9uZQotCi1saWJvcGNvZGVzLmxhOiAkKGxpYm9wY29kZXNfbGFfT0JKRUNUUykgJChsaWJvcGNvZGVzX2xhX0RFUEVOREVOQ0lFUykKLQkkKExJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJvcGNvZGVzX2xhX0xERkxBR1MpICQobGlib3Bjb2Rlc19sYV9PQkpFQ1RTKSAkKGxpYm9wY29kZXNfbGFfTElCQUREKSAkKExJQlMpCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0KLUBTRVRfTUFLRUAKLQotYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi1jaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JcmV2PScnOyBsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAiLiIgJiYgZG90X3NlZW49eWVzOyBcCi0JZG9uZTsgXAotCXRlc3QgIiQkZG90X3NlZW4iID0gIm5vIiAmJiByZXY9Ii4gJCRyZXYiOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLQotdGFnczogVEFHUwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaGVyZT1gcHdkYCAmJiBjZCAkKHNyY2RpcikgXAotCSAgJiYgbWtpZCAtZiQkaGVyZS9JRCAkJHVuaXF1ZSAkKExJU1ApCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotICAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLSAgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpY29uZmlnLmluJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCi0JICB8fCAoY2QgJChzcmNkaXIpICYmIGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzIGNvbmZpZy5pbiAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQotCi1tb3N0bHljbGVhbi10YWdzOgotCi1jbGVhbi10YWdzOgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRAotCi1tYWludGFpbmVyLWNsZWFuLXRhZ3M6Ci0KLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSB6eGYgJChkaXN0ZGlyKS50YXIuZ3oKLQlta2RpciAkKGRpc3RkaXIpLz1idWlsZAotCW1rZGlyICQoZGlzdGRpcikvPWluc3QKLQlkY19pbnN0YWxsX2Jhc2U9YGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYDsgXAotCWNkICQoZGlzdGRpcikvPWJ1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUBiYW5uZXI9IiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iOyBcCi0JZGFzaGVzPWBlY2hvICIkJGJhbm5lciIgfCBzZWQgcy8uLz0vZ2A7IFwKLQllY2hvICIkJGRhc2hlcyI7IFwKLQllY2hvICIkJGJhbm5lciI7IFwKLQllY2hvICIkJGRhc2hlcyIKLWRpc3Q6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0LWFsbDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikKLQktY2htb2QgNzc3ICQoZGlzdGRpcikKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZWxzZSBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAotCSAgZmk7IFwKLQlkb25lCi0JZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICAgIGNobW9kIDc3NyAkKGRpc3RkaXIpLyQkc3ViZGlyOyBcCi0JICAgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0uLi8kKGRpc3RkaXIpIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBkaXN0ZGlyKSBcCi0JICAgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWluZm8tYW06Ci1pbmZvOiBpbmZvLXJlY3Vyc2l2ZQotZHZpLWFtOgotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQotYWxsLXJlY3Vyc2l2ZS1hbTogY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1saWJMVExJQlJBUklFUwotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCi0KLWluc3RhbGwtZGF0YS1hbToKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCi11bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKLWFsbC1hbTogTWFrZWZpbGUgJChMSUJSQVJJRVMpICQoTFRMSUJSQVJJRVMpIGNvbmZpZy5oCi1hbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKLWluc3RhbGxkaXJzLWFtOgotCSQobWtpbnN0YWxsZGlycykgICQoREVTVERJUikkKGxpYmRpcikKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCi0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLW1vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4taGRyIG1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi0JCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JCW1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTIG1vc3RseWNsZWFuLXRhZ3MgXAotCQltb3N0bHljbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKLQotY2xlYW4tYW06ICBjbGVhbi1oZHIgY2xlYW4tbm9pbnN0TElCUkFSSUVTIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCi0JCWNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLXRhZ3MgY2xlYW4tZ2VuZXJpYyBcCi0JCW1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1yZWN1cnNpdmUKLQotZGlzdGNsZWFuLWFtOiAgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLQkJZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0KLQktcm0gLWYgbGlidG9vbAotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi1tYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi0JCW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgXAotCQltYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTIG1haW50YWluZXItY2xlYW4tdGFncyBcCi0JCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVMgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBcCi1jbGVhbi1ub2luc3RMSUJSQVJJRVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotbW9zdGx5Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tY29tcGlsZSBjbGVhbi1jb21waWxlIFwKLW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJ0b29sIFwKLWNsZWFuLWxpYnRvb2wgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTIFwKLWRpc3RjbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJMVExJQlJBUklFUyBcCi1tYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUyBcCi1pbnN0YWxsLWxpYkxUTElCUkFSSUVTIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgdW5pbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLWluc3RhbGwtZXhlYy1yZWN1cnNpdmUgdW5pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBcCi11bmluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlIHRhZ3MgdGFncy1yZWN1cnNpdmUgbW9zdGx5Y2xlYW4tdGFncyBcCi1kaXN0Y2xlYW4tdGFncyBjbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tdGFncyBkaXN0ZGlyIGluZm8tYW0gaW5mbyBcCi1kdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgaW5zdGFsbC1pbmZvLWFtIFwKLWluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgXAotaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBcCi1hbGwtcmVkaXJlY3QgYWxsLWFtIGFsbCBpbnN0YWxsZGlycy1hbSBpbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIFwKLWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIFwKLW1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotZGlzYXNzZW1ibGUubG86IGRpc2Fzc2VtYmxlLmMgJChJTkNESVIpL2Rpcy1hc20uaAotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyBAYXJjaGRlZnNAICQoc3JjZGlyKS9kaXNhc3NlbWJsZS5jCi0KLXN0YW1wLWxpYjogbGlib3Bjb2Rlcy5sYQotCWlmIFsgLWYgLmxpYnMvbGlib3Bjb2Rlcy5hIF07IHRoZW4gXAotCSAgY3AgLmxpYnMvbGlib3Bjb2Rlcy5hIGxpYm9wY29kZXMudG1wOyBcCi0JICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGlib3Bjb2Rlcy50bXAgbGlib3Bjb2Rlcy5hOyBcCi0JZWxzZSB0cnVlOyBmaQotCXRvdWNoIHN0YW1wLWxpYgotCi1saWJvcGNvZGVzLmE6IHN0YW1wLWxpYiA7IEB0cnVlCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi0jIFdlIHNob3VsZCByZWNvbmZpZ3VyZSB3aGVuZXZlciBiZmQvY29uZmlndXJlLmluIGNoYW5nZXMsIGJlY2F1c2UKLSMgdGhhdCdzIHdoZXJlIHRoZSB2ZXJzaW9uIG51bWJlciBjb21lcyBmcm9tLgotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvLi4vYmZkL2NvbmZpZ3VyZS5pbgotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotIyBUaGUgc3RhcnQgbWFya2VyIGlzIHdyaXR0ZW4gdGhpcyB3YXkgdG8gcGFzcyB0aHJvdWdoIGF1dG9tYWtlIHVuc2NhdGhlZC4KLQotIyBUaGlzIGRlcGVuZGVuY3kgc3R1ZmYgaXMgY29waWVkIGZyb20gQkZELgotCi1ERVA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIERFUDEKLQkkKE1BS0UpIE1LREVQPSQoTUtERVApIERFUDEKLQlzZWQgLWYgZGVwLnNlZCA8IERFUDEgPiBERVAKLQotREVQMTogJChDRklMRVMpCi0Jcm0gLWYgREVQMiBERVAyYQotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gREVQMgotCWVjaG8gPiBERVAyYQotCSQoTUtERVApIC1mIERFUDJhICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPwotCXNlZCAtZSAnL0RPIE5PVCBERUxFVEUvZCcgLWUgJy9eJCQvZCcgPCBERVAyYSA+PiBERVAyCi0Jcm0gLWYgREVQMmEKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgREVQMiBERVAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFAQkZEX0hAISQoQkZEX0gpIScJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBCRkRESVJAISQoQkZERElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiBERVAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IERFUCA+PiB0bXAtTWFrZWZpbGUKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogREVQCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgREVQID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWEyOWstZGlzLmxvOiBhMjlrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotYWxwaGEtZGlzLmxvOiBhbHBoYS1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9hbHBoYS5oCi1hbHBoYS1vcGMubG86IGFscGhhLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoQkZEX0gpIG9waW50bC5oCi1hcmMtZGlzLmxvOiBhcmMtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgb3BpbnRsLmgKLWFyYy1vcGMubG86IGFyYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oIFwKLSAgb3BpbnRsLmgKLWFybS1kaXMubG86IGFybS1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggYXJtLW9wYy5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggb3BpbnRsLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotY2dlbi1hc20ubG86IGNnZW4tYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgb3BpbnRsLmgKLWNnZW4tZGlzLmxvOiBjZ2VuLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaAotY2dlbi1vcGMubG86IGNnZW4tb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oCi1kMTB2LWRpcy5sbzogZDEwdi1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWQxMHYtb3BjLmxvOiBkMTB2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oCi1kMzB2LWRpcy5sbzogZDMwdi1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWQzMHYtb3BjLmxvOiBkMzB2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi1kaXMtYnVmLmxvOiBkaXMtYnVmLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpIG9waW50bC5oCi1kaXNhc3NlbWJsZS5sbzogZGlzYXNzZW1ibGUuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWZyMzAtYXNtLmxvOiBmcjMwLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1kZXNjLmxvOiBmcjMwLWRlc2MuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtZGlzLmxvOiBmcjMwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWlibGQubG86IGZyMzAtaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLW9wYy5sbzogZnIzMC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmgKLWg4MzAwLWRpcy5sbzogaDgzMDAtZGlzLmMgJChJTkNESVIpL29wY29kZS9oODMwMC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAotaDg1MDAtZGlzLmxvOiBoODUwMC1kaXMuYyBoODUwMC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWhwcGEtZGlzLmxvOiBocHBhLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCi1pMzg2LWRpcy5sbzogaTM4Ni1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggY29uZmlnLmggb3BpbnRsLmgKLWk5NjAtZGlzLmxvOiBpOTYwLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaAotbTMyci1hc20ubG86IG0zMnItYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWRlc2MubG86IG0zMnItZGVzYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1kaXMubG86IG0zMnItZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItaWJsZC5sbzogbTMyci1pYmxkLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItb3BjLmxvOiBtMzJyLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaAotbTMyci1vcGluc3QubG86IG0zMnItb3BpbnN0LmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oCi1tNjhrLWRpcy5sbzogbTY4ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2Zsb2F0Zm9ybWF0Lmggb3BpbnRsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL202OGsuaAotbTY4ay1vcGMubG86IG02OGstb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tNjhrLmgKLW04OGstZGlzLmxvOiBtODhrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL204OGsuaCBvcGludGwuaAotbWNvcmUtZGlzLmxvOiBtY29yZS1kaXMuYyBtY29yZS1vcGMuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLW1pcHMtZGlzLmxvOiBtaXBzLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBvcGludGwuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1taXBzLW9wYy5sbzogbWlwcy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaAotbWlwczE2LW9wYy5sbzogbWlwczE2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oCi1tMTAyMDAtZGlzLmxvOiBtMTAyMDAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi1tMTAyMDAtb3BjLmxvOiBtMTAyMDAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKLW0xMDMwMC1kaXMubG86IG0xMDMwMC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgb3BpbnRsLmgKLW0xMDMwMC1vcGMubG86IG0xMDMwMC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaAotbnMzMmstZGlzLmxvOiBuczMyay1kaXMuYyAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChJTkNESVIpL29wY29kZS9uczMyay5oIFwKLSAgb3BpbnRsLmgKLXBqLWRpcy5sbzogcGotZGlzLmMgJChJTkNESVIpL29wY29kZS9wai5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaAotcGotb3BjLmxvOiBwai1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3BqLmgKLXBwYy1kaXMubG86IHBwYy1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9wcGMuaAotcHBjLW9wYy5sbzogcHBjLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmggXAotICBvcGludGwuaAotc2gtZGlzLmxvOiBzaC1kaXMuYyBzaC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXNwYXJjLWRpcy5sbzogc3BhcmMtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9saWJpYmVydHkuaCBvcGludGwuaAotc3BhcmMtb3BjLmxvOiBzcGFyYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLXRpYzMwLWRpcy5sbzogdGljMzAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotdGljODAtZGlzLmxvOiB0aWM4MC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi10aWM4MC1vcGMubG86IHRpYzgwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotdjg1MC1kaXMubG86IHY4NTAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS92ODUwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi12ODUwLW9wYy5sbzogdjg1MC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaCBcCi0gIG9waW50bC5oCi12YXgtZGlzLmxvOiB2YXgtZGlzLmMgJChJTkNESVIpL29wY29kZS92YXguaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXc2NS1kaXMubG86IHc2NS1kaXMuYyB3NjUtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oCi16OGstZGlzLmxvOiB6OGstZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpIHo4ay1vcGMuaAotejhrZ2VuLmxvOiB6OGtnZW4uYyBzeXNkZXAuaCBjb25maWcuaAotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL29wY29kZXMvYTI5ay1kaXMuYyBiL29wY29kZXMvYTI5ay1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5NTljOS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2EyOWstZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gcHJpbnRpbmcgY29kZSBmb3IgdGhlIEFNRCAyOTAwMAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuICBXcml0dGVuIGJ5IEppbSBLaW5nZG9uLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2EyOWsuaCIKLQotLyogUHJpbnQgYSBzeW1ib2xpYyByZXByZXNlbnRhdGlvbiBvZiBhIGdlbmVyYWwtcHVycG9zZQotICAgcmVnaXN0ZXIgbnVtYmVyIE5VTSBvbiBTVFJFQU0uCi0gICBOVU0gaXMgYSBudW1iZXIgYXMgZm91bmQgaW4gdGhlIGluc3RydWN0aW9uLCBub3QgYXMgZm91bmQgaW4KLSAgIGRlYnVnZ2luZyBzeW1ib2xzOyBpdCBtdXN0IGJlIGluIHRoZSByYW5nZSAwLTI1NS4gICovCi1zdGF0aWMgdm9pZAotcHJpbnRfZ2VuZXJhbCAobnVtLCBpbmZvKQotICAgICBpbnQgbnVtOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKG51bSA8IDEyOCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImdyJWQiLCBudW0pOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJsciVkIiwgbnVtIC0gMTI4KTsKLX0KLQotLyogTGlrZSBwcmludF9nZW5lcmFsIGJ1dCBhIHNwZWNpYWwtcHVycG9zZSByZWdpc3Rlci4KLSAgIAotICAgVGhlIG1uZW1vbmljcyB1c2VkIGJ5IHRoZSBBTUQgYXNzZW1ibGVyIGFyZSBub3QgcXVpdGUgdGhlIHNhbWUKLSAgIGFzIHRoZSBvbmVzIGluIHRoZSBVc2VyJ3MgTWFudWFsLiAgV2UgdXNlIHRoZSBvbmVzIHRoYXQgdGhlCi0gICBhc3NlbWJsZXIgdXNlcy4gICovCi1zdGF0aWMgdm9pZAotcHJpbnRfc3BlY2lhbCAobnVtLCBpbmZvKQotICAgICB1bnNpZ25lZCBpbnQgbnVtOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgLyogUmVnaXN0ZXIgbmFtZXMgb2YgcmVnaXN0ZXJzIDAtU1BFQzBfTlVNLTEuICAqLwotICBzdGF0aWMgY2hhciAqc3BlYzBfbmFtZXNbXSA9IHsKLSAgICAidmFiIiwgIm9wcyIsICJjcHMiLCAiY2ZnIiwgImNoYSIsICJjaGQiLCAiY2hjIiwgInJicCIsICJ0bWMiLCAidG1yIiwKLSAgICAicGMwIiwgInBjMSIsICJwYzIiLCAibW11IiwgImxydSIsICJyc24iLCAicm1hMCIsICJybWMwIiwgInJtYTEiLCAicm1jMSIsCi0gICAgInNwYzAiLCAic3BjMSIsICJzcGMyIiwgImliYTAiLCAiaWJjMCIsICJpYmExIiwgImliYzEiLCAiZGJhIiwgImRiYyIsCi0gICAgImNpciIsICJjZHIiCi0gICAgfTsKLSNkZWZpbmUgU1BFQzBfTlVNICgoc2l6ZW9mIHNwZWMwX25hbWVzKSAvIChzaXplb2Ygc3BlYzBfbmFtZXNbMF0pKQotCi0gIC8qIFJlZ2lzdGVyIG5hbWVzIG9mIHJlZ2lzdGVycyAxMjgtMTI4K1NQRUMxMjhfTlVNLTEuICAqLwotICBzdGF0aWMgY2hhciAqc3BlYzEyOF9uYW1lc1tdID0gewotICAgICJpcGMiLCAiaXBhIiwgImlwYiIsICJxIiwgImFsdSIsICJicCIsICJmYyIsICJjciIKLSAgICB9OwotI2RlZmluZSBTUEVDMTI4X05VTSAoKHNpemVvZiBzcGVjMTI4X25hbWVzKSAvIChzaXplb2Ygc3BlYzEyOF9uYW1lc1swXSkpCi0KLSAgLyogUmVnaXN0ZXIgbmFtZXMgb2YgcmVnaXN0ZXJzIDE2MC0xNjArU1BFQzE2MF9OVU0tMS4gICovCi0gIHN0YXRpYyBjaGFyICpzcGVjMTYwX25hbWVzW10gPSB7Ci0gICAgImZwZSIsICJpbnRlIiwgImZwcyIsICJzcjE2MyIsICJleG9wIgotICAgIH07Ci0jZGVmaW5lIFNQRUMxNjBfTlVNICgoc2l6ZW9mIHNwZWMxNjBfbmFtZXMpIC8gKHNpemVvZiBzcGVjMTYwX25hbWVzWzBdKSkKLQotICBpZiAobnVtIDwgU1BFQzBfTlVNKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBzcGVjMF9uYW1lc1tudW1dKTsKLSAgZWxzZSBpZiAobnVtID49IDEyOCAmJiBudW0gPCAxMjggKyBTUEVDMTI4X05VTSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgc3BlYzEyOF9uYW1lc1tudW0tMTI4XSk7Ci0gIGVsc2UgaWYgKG51bSA+PSAxNjAgJiYgbnVtIDwgMTYwICsgU1BFQzE2MF9OVU0pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHNwZWMxNjBfbmFtZXNbbnVtLTE2MF0pOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJzciVkIiwgbnVtKTsKLX0KLQotLyogSXMgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBPUENPREUgYSBkZWxheWVkIGJyYW5jaD8gICovCi1zdGF0aWMgaW50Ci1pc19kZWxheWVkX2JyYW5jaCAob3Bjb2RlKQotICAgICBpbnQgb3Bjb2RlOwotewotICByZXR1cm4gKG9wY29kZSA9PSAweGE4IHx8IG9wY29kZSA9PSAweGE5IHx8IG9wY29kZSA9PSAweGEwIHx8IG9wY29kZSA9PSAweGExCi0JICB8fCBvcGNvZGUgPT0gMHhhNCB8fCBvcGNvZGUgPT0gMHhhNQotCSAgfHwgb3Bjb2RlID09IDB4YjQgfHwgb3Bjb2RlID09IDB4YjUKLQkgIHx8IG9wY29kZSA9PSAweGM0IHx8IG9wY29kZSA9PSAweGMwCi0JICB8fCBvcGNvZGUgPT0gMHhhYyB8fCBvcGNvZGUgPT0gMHhhZAotCSAgfHwgb3Bjb2RlID09IDB4Y2MpOwotfQotCi0vKiBOb3cgZmluZCB0aGUgZm91ciBieXRlcyBvZiBJTlNOIGFuZCBwdXQgdGhlbSBpbiAqSU5TTnswLDgsMTYsMjR9LiAgKi8KLXN0YXRpYyB2b2lkCi1maW5kX2J5dGVzX2JpZyAoaW5zbiwgaW5zbjAsIGluc244LCBpbnNuMTYsIGluc24yNCkKLSAgICAgY2hhciAqaW5zbjsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjA7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc244OwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMTY7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24yNDsKLXsKLSAgKmluc24yNCA9IGluc25bMF07Ci0gICppbnNuMTYgPSBpbnNuWzFdOwotICAqaW5zbjggID0gaW5zblsyXTsKLSAgKmluc24wICA9IGluc25bM107Ci19Ci0KLXN0YXRpYyB2b2lkCi1maW5kX2J5dGVzX2xpdHRsZSAoaW5zbiwgaW5zbjAsIGluc244LCBpbnNuMTYsIGluc24yNCkKLSAgICAgY2hhciAqaW5zbjsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjA7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc244OwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMTY7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24yNDsKLXsKLSAgKmluc24yNCA9IGluc25bM107Ci0gICppbnNuMTYgPSBpbnNuWzJdOwotICAqaW5zbjggPSBpbnNuWzFdOwotICAqaW5zbjAgPSBpbnNuWzBdOwotfQotCi10eXBlZGVmIHZvaWQgKCpmaW5kX2J5dGVfZnVuY190eXBlKQotICAgICBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLAotCSAgICAgIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKSk7Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIE1FTUFERFIgb24gSU5GTy0+U1RSRUFNLgotICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiAoYWx3YXlzIDQgb24gYTI5aykuICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAvKiBUaGUgcmF3IGluc3RydWN0aW9uLiAgKi8KLSAgY2hhciBpbnNuWzRdOwotCi0gIC8qIFRoZSBmb3VyIGJ5dGVzIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgaW5zbjI0LCBpbnNuMTYsIGluc244LCBpbnNuMDsKLQotICBmaW5kX2J5dGVfZnVuY190eXBlIGZpbmRfYnl0ZV9mdW5jID0gKGZpbmRfYnl0ZV9mdW5jX3R5cGUpaW5mby0+cHJpdmF0ZV9kYXRhOwotCi0gIHN0cnVjdCBhMjlrX29wY29kZSBDT05TVCAqIG9wY29kZTsKLQotICB7Ci0gICAgaW50IHN0YXR1cyA9Ci0gICAgICAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCAoYmZkX2J5dGUgKikgJmluc25bMF0sIDQsIGluZm8pOwotICAgIGlmIChzdGF0dXMgIT0gMCkKLSAgICAgIHsKLQkoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQlyZXR1cm4gLTE7Ci0gICAgICB9Ci0gIH0KLQotICAoKmZpbmRfYnl0ZV9mdW5jKSAoaW5zbiwgJmluc24wLCAmaW5zbjgsICZpbnNuMTYsICZpbnNuMjQpOwotCi0gIHByaW50ZiAoIiUwMnglMDJ4JTAyeCUwMnggIiwgaW5zbjI0LCBpbnNuMTYsIGluc244LCBpbnNuMCk7Ci0KLSAgLyogSGFuZGxlIHRoZSBub3AgKGFzZXEgMHg0MCxncjEsZ3IxKSBzcGVjaWFsbHkgKi8KLSAgaWYgKChpbnNuMjQ9PTB4NzApICYmIChpbnNuMTY9PTB4NDApICYmIChpbnNuOD09MHgwMSkgJiYgKGluc24wPT0weDAxKSkgewotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCJub3AiKTsKLSAgICByZXR1cm4gNDsKLSAgfQotCi0gIC8qIFRoZSBvcGNvZGUgaXMgYWx3YXlzIGluIGluc24yNC4gICovCi0gIGZvciAob3Bjb2RlID0gJmEyOWtfb3Bjb2Rlc1swXTsKLSAgICAgICBvcGNvZGUgPCAmYTI5a19vcGNvZGVzW251bV9vcGNvZGVzXTsKLSAgICAgICArK29wY29kZSkKLSAgICB7Ci0gICAgICBpZiAoKCh1bnNpZ25lZCBsb25nKSBpbnNuMjQgPDwgMjQpID09IG9wY29kZS0+b3Bjb2RlKQotCXsKLQkgIGNoYXIgKnM7Ci0JICAKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwgb3Bjb2RlLT5uYW1lKTsKLQkgIGZvciAocyA9IG9wY29kZS0+YXJnczsgKnMgIT0gJ1wwJzsgKytzKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqcykKLQkJewotCQljYXNlICdhJzoKLQkJICBwcmludF9nZW5lcmFsIChpbnNuOCwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgJ2InOgotCQkgIHByaW50X2dlbmVyYWwgKGluc24wLCBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICdjJzoKLQkJICBwcmludF9nZW5lcmFsIChpbnNuMTYsIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2knOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAneCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgKGluc24xNiA8PCA4KSArIGluc24wKTsKLQkJICBicmVhazsKLQotCQljYXNlICdoJzoKLQkJICAvKiBUaGlzIHVzZWQgdG8gYmUgJXggZm9yIGJpbnV0aWxzLiAgKi8KLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJCSAgICAoaW5zbjE2IDw8IDI0KSArIChpbnNuMCA8PCAxNikpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1gnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJCSAgICAoKGluc24xNiA8PCA4KSArIGluc24wKSB8IDB4ZmZmZjAwMDApOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1AnOgotCQkgIC8qIFRoaXMgb3V0cHV0IGxvb2tzIGp1c3QgbGlrZSBhYnNvbHV0ZSBhZGRyZXNzaW5nLCBidXQKLQkJICAgICBtYXliZSB0aGF0J3MgT0sgKGl0J3Mgd2hhdCB0aGUgR0RCIG02OGsgYW5kIEVCTU9OCi0JCSAgICAgYTI5ayBkaXNhc3NlbWJsZXJzIGRvKS4gICovCi0JCSAgLyogQWxsIHRoZSBzaGlmdGluZyBpcyB0byBzaWduLWV4dGVuZCBpdC4gIHAqLwotCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCQkgICAgKG1lbWFkZHIgKwotCQkgICAgICgoKGludCkoKGluc24xNiA8PCAxMCkgKyAoaW5zbjAgPDwgMikpIDw8IDE0KSA+PiAxNCksCi0JCSAgICAgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnQSc6Ci0JCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JCSAgICAoKGluc24xNiA8PCAxMCkgKyAoaW5zbjAgPDwgMiksIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2UnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMTYgPj4gNyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnbic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgaW5zbjE2ICYgMHg3Zik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAndic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgaW5zbjE2KTsKLQkJICBicmVhazsKLQotCQljYXNlICdzJzoKLQkJICBwcmludF9zcGVjaWFsIChpbnNuOCwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAndSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24wID4+IDcpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3InOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCAoaW5zbjAgPj4gNCkgJiA3KTsKLQkJICBicmVhazsKLQotCQljYXNlICdJJzoKLQkJICBpZiAoKGluc24xNiAmIDMpICE9IDApCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjE2ICYgMyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIChpbnNuMCA+PiAyKSAmIDMpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2YnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMCAmIDMpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0YnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCAoaW5zbjE2ID4+IDIpICYgMTUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0MnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMTYgJiAzKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCAqcyk7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBOb3cgd2UgbG9vayBmb3IgYSBjb25zdCxjb25zdGggcGFpciBvZiBpbnN0cnVjdGlvbnMsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIHRyeSB0byBwcmludCB0aGUgc3ltYm9saWMgYWRkcmVzcy4gICovCi0JICBpZiAoaW5zbjI0ID09IDIpICAvKiBjb25zdGggKi8KLQkgICAgewotCSAgICAgIGludCBlcnJjb2RlOwotCSAgICAgIGNoYXIgcHJldl9pbnNuWzRdOwotCSAgICAgIHVuc2lnbmVkIGNoYXIgcHJldl9pbnNuMCwgcHJldl9pbnNuOCwgcHJldl9pbnNuMTYsIHByZXZfaW5zbjI0OwotCSAgICAgIAotCSAgICAgIGVycmNvZGUgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyIC0gNCwKLQkJCQkJCSAgIChiZmRfYnl0ZSAqKSAmcHJldl9pbnNuWzBdLAotCQkJCQkJICAgNCwKLQkJCQkJCSAgIGluZm8pOwotCSAgICAgIGlmIChlcnJjb2RlID09IDApCi0JCXsKLQkJICAvKiBJZiBpdCBpcyBhIGRlbGF5ZWQgYnJhbmNoLCB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlCi0JCSAgICAgaW5zdHJ1Y3Rpb24gYmVmb3JlIHRoZSBkZWxheWVkIGJyYWNoIHRvIGhhbmRsZQotCQkgICAgIHRoaW5ncyBsaWtlCi0JCSAgICAgCi0JCSAgICAgY29uc3QgX2ZvbwotCQkgICAgIGNhbGwgX3ByaW50ZgotCQkgICAgIGNvbnN0aCBfZm9vCi0JCSAgICAgKi8KLQkJICAoKmZpbmRfYnl0ZV9mdW5jKSAocHJldl9pbnNuLCAmcHJldl9pbnNuMCwgJnByZXZfaW5zbjgsCi0JCQkJICAgICAmcHJldl9pbnNuMTYsICZwcmV2X2luc24yNCk7Ci0JCSAgaWYgKGlzX2RlbGF5ZWRfYnJhbmNoIChwcmV2X2luc24yNCkpCi0JCSAgICB7Ci0JCSAgICAgIGVycmNvZGUgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JCQkobWVtYWRkciAtIDgsIChiZmRfYnl0ZSAqKSAmcHJldl9pbnNuWzBdLCA0LCBpbmZvKTsKLQkJICAgICAgKCpmaW5kX2J5dGVfZnVuYykgKHByZXZfaW5zbiwgJnByZXZfaW5zbjAsICZwcmV2X2luc244LAotCQkJCQkgJnByZXZfaW5zbjE2LCAmcHJldl9pbnNuMjQpOwotCQkgICAgfQotCQl9Ci0JCSAgCi0JICAgICAgLyogSWYgdGhlcmUgd2FzIGEgcHJvYmxlbSByZWFkaW5nIG1lbW9yeSwgdGhlbiBhc3N1bWUKLQkJIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgbm90IGNvbnN0LiAgKi8KLQkgICAgICBpZiAoZXJyY29kZSA9PSAwKQotCQl7Ci0JCSAgLyogSXMgaXQgY29uc3QgdG8gdGhlIHNhbWUgcmVnaXN0ZXI/ICAqLwotCQkgIGlmIChwcmV2X2luc24yNCA9PSAzCi0JCSAgICAgICYmIHByZXZfaW5zbjggPT0gaW5zbjgpCi0JCSAgICB7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQ7ICIpOwotCQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkJCSgoKGluc24xNiA8PCAyNCkgKyAoaW5zbjAgPDwgMTYpCi0JCQkgICsgKHByZXZfaW5zbjE2IDw8IDgpICsgKHByZXZfaW5zbjApKSwKLQkJCSBpbmZvKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIHJldHVybiA0OwotCX0KLSAgICB9Ci0gIC8qIFRoaXMgdXNlZCB0byBiZSAlOHggZm9yIGJpbnV0aWxzLiAgKi8KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0gICAgKGluZm8tPnN0cmVhbSwgIi53b3JkIDB4JTA4eCIsCi0gICAgIChpbnNuMjQgPDwgMjQpICsgKGluc24xNiA8PCAxNikgKyAoaW5zbjggPDwgOCkgKyBpbnNuMCk7Ci0gIHJldHVybiA0OwotfQotCi0vKiBEaXNhc3NlbWJsZSBhbiBiaWctZW5kaWFuIGEyOWsgaW5zdHJ1Y3Rpb24uICAqLwotaW50Ci1wcmludF9pbnNuX2JpZ19hMjlrIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSBmaW5kX2J5dGVzX2JpZzsKLSAgcmV0dXJuIHByaW50X2luc24gKG1lbWFkZHIsIGluZm8pOwotfQotCi0vKiBEaXNhc3NlbWJsZSBhIGxpdHRsZS1lbmRpYW4gYTI5ayBpbnN0cnVjdGlvbi4gICovCi1pbnQKLXByaW50X2luc25fbGl0dGxlX2EyOWsgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpIGZpbmRfYnl0ZXNfbGl0dGxlOwotICByZXR1cm4gcHJpbnRfaW5zbiAobWVtYWRkciwgaW5mbyk7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2FjaW5jbHVkZS5tNCBiL29wY29kZXMvYWNpbmNsdWRlLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWIwOWI5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvYWNpbmNsdWRlLm00CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2luY2x1ZGUoLi4vYmZkL2FjaW5jbHVkZS5tNCkKZGlmZiAtLWdpdCBhL29wY29kZXMvYWNsb2NhbC5tNCBiL29wY29kZXMvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4NzExZC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTExICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40Ci0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KLSMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgotIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBzZXJpYWwgMQotCi1kbmwgVXNhZ2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQotCi1BQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi1QQUNLQUdFPVskMV0KLUFDX1NVQlNUKFBBQ0tBR0UpCi1WRVJTSU9OPVskMl0KLUFDX1NVQlNUKFZFUlNJT04pCi1kbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotaWZlbHNlKFskM10sLAotQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQotZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgotIwotCi1BQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotcm0gLWYgY29uZnRlc3QqCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi1kbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKLWRubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCi1BQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCi1bQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgJDE9JDIKLSAgIEFDX01TR19SRVNVTFQoZm91bmQpCi1lbHNlCi0gICAkMT0iJDMvbWlzc2luZyAkMiIKLSAgIEFDX01TR19SRVNVTFQobWlzc2luZykKLWZpCi1BQ19TVUJTVCgkMSldKQotCi0KLSMgc2VyaWFsIDM1IEFDX1BST0dfTElCVE9PTAotQUNfREVGVU4oQUNfUFJPR19MSUJUT09MLAotW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLUFDX0NBQ0hFX1NBVkUKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLUFDX0NBQ0hFX0xPQUQKLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLUFDX1NVQlNUKExJQlRPT0wpZG5sCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLUFDX0RFRlVOKEFDX0xJQlRPT0xfU0VUVVAsCi1bQUNfUFJFUkVRKDIuMTMpZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotZG5sCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKLSAgICBbQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gIEFDX1NZU19MSUJUT09MX0NZR1dJTgotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLVsgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZ10sCi1uZWVkX2xvY2tzPSRlbmFibGV2YWwsCi1uZWVkX2xvY2tzPXllcykKLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi1dKQotCi0jIEFDX0xJQlRPT0xfRExPUEVOIC0gY2hlY2sgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW2x0X2Rsb3Blbj15ZXNdKQotCi0jIEFDX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TSEFSRUQsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc2hhcmVkLAotY2hhbmdlcXVvdGUoPDwsID4+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+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0jIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLSMgRnJvbSBKaW0gTWV5ZXJpbmcKLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCi0gIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAotICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKLVsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQotICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQotICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICBBQ19TVUJTVChNQUlOVClkbmwKLV0KLSkKLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLQotQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCi1bQUNfU1VCU1QoJDFfVFJVRSkKLUFDX1NVQlNUKCQxX0ZBTFNFKQotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmldKQotCi0jIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKLSMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLQotIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMwotCi1BQ19ERUZVTihDWV9XSVRIX05MUywKLSAgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUwotICAgIEFDX0FSR19FTkFCTEUobmxzLAotICAgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCi0gICAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQotICAgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCi0gICAgQUNfU1VCU1QoVVNFX05MUykKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCi0gICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTLCAxLCBbRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQotICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKLSAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAotICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQotICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAotICAgICAgICBkbmwgdG8gdXNlLiAgSWYgZ2V0dGV4dCBvciBjYXRnZXRzIGFyZSBhdmFpbGFibGUgKGluIHRoaXMgb3JkZXIpIHdlCi0gICAgICAgIGRubCB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgotCWRubCBjYXRnZXRzIGlzIG9ubHkgdXNlZCBpZiBwZXJtaXR0ZWQgYnkgb3B0aW9uIC0td2l0aC1jYXRnZXRzLgotCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlBQ19DSEVDS19IRUFERVIobGliaW50bC5oLAotCSAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMsCi0JICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD5dLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JICAgICAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcywgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8pXSkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIEFDX0NIRUNLX0xJQihpbnRsLCBiaW5kdGV4dGRvbWFpbiwKLQkgICAgICAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsLAotCQkgW0FDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMsCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubyldKV0pCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCwgMSwKLQkJCVtEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC5dKQotCSAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCi0JCVt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbm8pZG5sCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlBQ19DSEVDS19GVU5DUyhkY2dldHRleHQpCi0JCUFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotCQlBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0JCUFDX1RSWV9MSU5LKCwgW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cl0sCi0JCSAgW0NBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlXSwKLQkJICBbQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWJdKQotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JXSkKLQotCWRubCBJbiB0aGUgc3RhbmRhcmQgZ2V0dGV4dCwgd2Ugd291bGQgbm93IGNoZWNrIGZvciBjYXRnZXRzLgotICAgICAgICBkbmwgSG93ZXZlciwgd2UgbmV2ZXIgd2FudCB0byB1c2UgY2F0Z2V0cyBmb3Igb3VyIHJlbGVhc2VzLgotCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICBkbmwgTmVpdGhlciBnZXR0ZXh0IG5vciBjYXRnZXRzIGluIGluY2x1ZGVkIGluIHRoZSBDIGxpYnJhcnkuCi0JICBkbmwgRmFsbCBiYWNrIG9uIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0JICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KLSAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbXNnZm10KQotICAgICAgICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKLSAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCi0JICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCi0gICAgICAgIEFDX1NVQlNUKE1TR0ZNVCkKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCi0gICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCWRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKLQlkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgotCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIEFDX01TR19SRVNVTFQoCi0JICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICBkbmwgVGhlc2UgcnVsZXMgYXJlIHNvbGVseSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBnb2FsLiAgV2hpbGUgZG9pbmcgdGhpcwotICAgIGRubCB3ZSBvbmx5IGhhdmUgdG8ga2VlcCBleGFjdGx5IG9uZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgY2F0YWxvZ3MKLSAgICBkbmwgaW4gY29uZmlndXJlLmluLgotICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCi0gICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCi0gICAgQUNfU1VCU1QoQ0FUQUxPR1MpCi0gICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQotICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQotICAgIEFDX1NVQlNUKEdNT0ZJTEVTKQotICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCi0gICAgQUNfU1VCU1QoSU5UTERFUFMpCi0gICAgQUNfU1VCU1QoSU5UTExJQlMpCi0gICAgQUNfU1VCU1QoSU5UTE9CSlMpCi0gICAgQUNfU1VCU1QoUE9GSUxFUykKLSAgICBBQ19TVUJTVChQT1NVQikKLSAgXSkKLQotQUNfREVGVU4oQ1lfR05VX0dFVFRFWFQsCi0gIFtBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAotICAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19GVU5DX01NQVBdKWRubAotCi0gICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaF0pCi0gICBBQ19DSEVDS19GVU5DUyhbZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dF0pCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5KQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIEFDX0RFRklORShIQVZFX1NUUENQWSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uXSkKLSAgIGZpCi0KLSAgIEFNX0xDX01FU1NBR0VTCi0gICBDWV9XSVRIX05MUwotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkKQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgQUNfTVNHX1JFU1VMVCgkTElOR1VBUykKLSAgICAgZmkKLQotICAgICBkbmwgQ29uc3RydWN0IGxpc3Qgb2YgbmFtZXMgb2YgY2F0YWxvZyBmaWxlcyB0byBiZSBjb25zdHJ1Y3RlZC4KLSAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgZG5sIFRoZSByZWZlcmVuY2UgdG8gPGxvY2FsZS5oPiBpbiB0aGUgaW5zdGFsbGVkIDxsaWJpbnRsLmg+IGZpbGUKLSAgIGRubCBtdXN0IGJlIHJlc29sdmVkIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdCB0aGUgdXNlcnMgb2YgdGhpcwotICAgZG5sIHRvIGRlZmluZSBIQVZFX0xPQ0FMRV9ILgotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICBBQ19TVUJTVChJTkNMVURFX0xPQ0FMRV9IKQotCi0gICBkbmwgRGV0ZXJtaW5lIHdoaWNoIGNhdGFsb2cgZm9ybWF0IHdlIGhhdmUgKGlmIGFueSBpcyBuZWVkZWQpCi0gICBkbmwgRm9yIG5vdyB3ZSBrbm93IGFib3V0IHR3byBkaWZmZXJlbnQgZm9ybWF0czoKLSAgIGRubCAgIExpbnV4IGxpYmMtNSBhbmQgdGhlIG5vcm1hbCBYL09wZW4gZm9ybWF0Ci0gICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgbXNnZm9ybWF0PWxpbnV4LCBtc2dmb3JtYXQ9eG9wZW4pCi0KLQkgZG5sIFRyYW5zZm9ybSB0aGUgU0VEIHNjcmlwdHMgd2hpbGUgY29weWluZyBiZWNhdXNlIHNvbWUgZHVtYiBTRURzCi0gICAgICAgICBkbmwgY2Fubm90IGhhbmRsZSBjb21tZW50cy4KLQkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgZG5sIHBvMnRibC5zZWQgaXMgYWx3YXlzIG5lZWRlZC4KLSAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICBkbmwgSW4gdGhlIGludGwvTWFrZWZpbGUuaW4gd2UgaGF2ZSBhIHNwZWNpYWwgZGVwZW5kZW5jeSB3aGljaCBtYWtlcwotICAgZG5sIG9ubHkgc2Vuc2UgZm9yIGdldHRleHQuICBXZSBjb21tZW50IHRoaXMgb3V0IGZvciBub24tZ2V0dGV4dAotICAgZG5sIHBhY2thZ2VzLgotICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIEFDX1NVQlNUKEdUX05PKQotICAgQUNfU1VCU1QoR1RfWUVTKQotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQotCi0gICBkbmwgKioqIEZvciBub3cgdGhlIGxpYnRvb2wgc3VwcG9ydCBpbiBpbnRsL01ha2VmaWxlIGlzIG5vdCBmb3IgcmVhbC4KLSAgIGw9Ci0gICBBQ19TVUJTVChsKQotCi0gICBkbmwgR2VuZXJhdGUgbGlzdCBvZiBmaWxlcyB0byBiZSBwcm9jZXNzZWQgYnkgeGdldHRleHQgd2hpY2ggd2lsbAotICAgZG5sIGJlIGluY2x1ZGVkIGluIHBvL01ha2VmaWxlLiAgQnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgcG8gZGlyZWN0b3J5Ci0gICBkbmwgZXhpc3RzIGluIHNyY2Rpci4KLSAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICBdKQotCi0jIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1kbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCi1kbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCi1BQ19ERUZVTihBTV9QQVRIX1BST0dfV0lUSF9URVNULAotWyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKLUFDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAotW2Nhc2UgIlskXSQxIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgWyQzXTsgdGhlbgotCWFjX2N2X3BhdGhfJDE9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWRubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCi1kbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KLWlmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCi1dKWRubAotICA7OwotZXNhY10pZG5sCi0kMT0iJGFjX2N2X3BhdGhfJDEiCi1pZiB0ZXN0IC1uICJbJF0kMSI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVChbJF0kMSkKLWVsc2UKLSAgQUNfTVNHX1JFU1VMVChubykKLWZpCi1BQ19TVUJTVCgkMSlkbmwKLV0pCi0KLSMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTENfTUVTU0FHRVMsCi0gIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAotICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCi0gICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCi0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUywgMSwKLQkJW0RlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuXSkKLSAgICBmaQotICBmaV0pCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvYWxwaGEtZGlzLmMgYi9vcGNvZGVzL2FscGhhLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjJkOGZhLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvYWxwaGEtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyogYWxwaGEtZGlzLmMgLS0gRGlzYXNzZW1ibGUgQWxwaGEgQVhQIGluc3RydWN0aW9ucwotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PiwKLSAgIHBhdHRlcm5lZCBhZnRlciB0aGUgUFBDIG9wY29kZSBoYW5kbGluZyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0yLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvYWxwaGEuaCIKLQotLyogT1NGIHJlZ2lzdGVyIG5hbWVzLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvc2ZfcmVnbmFtZXNbNjRdID0KLXsKLSAgInYwIiwgInQwIiwgInQxIiwgInQyIiwgInQzIiwgInQ0IiwgInQ1IiwgInQ2IiwKLSAgInQ3IiwgInMwIiwgInMxIiwgInMyIiwgInMzIiwgInM0IiwgInM1IiwgImZwIiwKLSAgImEwIiwgImExIiwgImEyIiwgImEzIiwgImE0IiwgImE1IiwgInQ4IiwgInQ5IiwKLSAgInQxMCIsICJ0MTEiLCAicmEiLCAidDEyIiwgImF0IiwgImdwIiwgInNwIiwgInplcm8iLAotICAiJGYwIiwgIiRmMSIsICIkZjIiLCAiJGYzIiwgIiRmNCIsICIkZjUiLCAiJGY2IiwgIiRmNyIsCi0gICIkZjgiLCAiJGY5IiwgIiRmMTAiLCAiJGYxMSIsICIkZjEyIiwgIiRmMTMiLCAiJGYxNCIsICIkZjE1IiwKLSAgIiRmMTYiLCAiJGYxNyIsICIkZjE4IiwgIiRmMTkiLCAiJGYyMCIsICIkZjIxIiwgIiRmMjIiLCAiJGYyMyIsCi0gICIkZjI0IiwgIiRmMjUiLCAiJGYyNiIsICIkZjI3IiwgIiRmMjgiLCAiJGYyOSIsICIkZjMwIiwgIiRmMzEiCi19OwotCi0vKiBWTVMgcmVnaXN0ZXIgbmFtZXMuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZtc19yZWduYW1lc1s2NF0gPQotewotICAiUjAiLCAiUjEiLCAiUjIiLCAiUjMiLCAiUjQiLCAiUjUiLCAiUjYiLCAiUjciLAotICAiUjgiLCAiUjkiLCAiUjEwIiwgIlIxMSIsICJSMTIiLCAiUjEzIiwgIlIxNCIsICJSMTUiLAotICAiUjE2IiwgIlIxNyIsICJSMTgiLCAiUjE5IiwgIlIyMCIsICJSMjEiLCAiUjIyIiwgIlIyMyIsCi0gICJSMjQiLCAiQUkiLCAiUkEiLCAiUFYiLCAiQVQiLCAiRlAiLCAiU1AiLCAiUloiLAotICAiRjAiLCAiRjEiLCAiRjIiLCAiRjMiLCAiRjQiLCAiRjUiLCAiRjYiLCAiRjciLAotICAiRjgiLCAiRjkiLCAiRjEwIiwgIkYxMSIsICJGMTIiLCAiRjEzIiwgIkYxNCIsICJGMTUiLAotICAiRjE2IiwgIkYxNyIsICJGMTgiLCAiRjE5IiwgIkYyMCIsICJGMjEiLCAiRjIyIiwgIkYyMyIsCi0gICJGMjQiLCAiRjI1IiwgIkYyNiIsICJGMjciLCAiRjI4IiwgIkYyOSIsICJGMzAiLCAiRloiCi19OwotCi0vKiBEaXNhc3NlbWJsZSBBbHBoYSBpbnN0cnVjdGlvbnMuICAqLwotCi1pbnQKLXByaW50X2luc25fYWxwaGEgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGVfaW5kZXhbQVhQX05PUFMrMV07Ci0gIGNvbnN0IGNoYXIgKiBjb25zdCAqIHJlZ25hbWVzOwotICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGUsICpvcGNvZGVfZW5kOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4OwotICB1bnNpZ25lZCBpbnNuLCBvcCwgaXNhX21hc2s7Ci0gIGludCBuZWVkX2NvbW1hOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIG1ham9yb3AgdGFibGUgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCAqLwotICBpZiAoIW9wY29kZV9pbmRleFswXSkKLSAgICB7Ci0gICAgICBvcGNvZGUgPSBhbHBoYV9vcGNvZGVzOwotICAgICAgb3Bjb2RlX2VuZCA9IG9wY29kZSArIGFscGhhX251bV9vcGNvZGVzOwotCi0gICAgICBmb3IgKG9wID0gMDsgb3AgPCBBWFBfTk9QUzsgKytvcCkKLSAgICAgICAgewotICAgICAgICAgIG9wY29kZV9pbmRleFtvcF0gPSBvcGNvZGU7Ci0gICAgICAgICAgd2hpbGUgKG9wY29kZSA8IG9wY29kZV9lbmQgJiYgb3AgPT0gQVhQX09QIChvcGNvZGUtPm9wY29kZSkpCi0JICAgICsrb3Bjb2RlOwotICAgICAgICB9Ci0gICAgICBvcGNvZGVfaW5kZXhbb3BdID0gb3Bjb2RlOwotICAgIH0KLQotICBpZiAoaW5mby0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cikKLSAgICByZWduYW1lcyA9IHZtc19yZWduYW1lczsKLSAgZWxzZQotICAgIHJlZ25hbWVzID0gb3NmX3JlZ25hbWVzOwotCi0gIGlzYV9tYXNrID0gQVhQX09QQ09ERV9OT1BBTDsKLSAgc3dpdGNoIChpbmZvLT5tYWNoKQotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX2FscGhhX2V2NDoKLSAgICAgIGlzYV9tYXNrIHw9IEFYUF9PUENPREVfRVY0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9hbHBoYV9ldjU6Ci0gICAgICBpc2FfbWFzayB8PSBBWFBfT1BDT0RFX0VWNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfYWxwaGFfZXY2OgotICAgICAgaXNhX21hc2sgfD0gQVhQX09QQ09ERV9FVjY7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogUmVhZCB0aGUgaW5zbiBpbnRvIGEgaG9zdCB3b3JkICovCi0gIHsKLSAgICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gICAgaW50IHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKQotICAgICAgewotICAgICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgIGluc24gPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotICB9Ci0KLSAgLyogR2V0IHRoZSBtYWpvciBvcGNvZGUgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgb3AgPSBBWFBfT1AgKGluc24pOwotCi0gIC8qIEZpbmQgdGhlIGZpcnN0IG1hdGNoIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotICBvcGNvZGVfZW5kID0gb3Bjb2RlX2luZGV4W29wKzFdOwotICBmb3IgKG9wY29kZSA9IG9wY29kZV9pbmRleFtvcF07IG9wY29kZSA8IG9wY29kZV9lbmQ7ICsrb3Bjb2RlKQotICAgIHsKLSAgICAgIGlmICgoaW5zbiAmIG9wY29kZS0+bWFzaykgIT0gb3Bjb2RlLT5vcGNvZGUpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICghKG9wY29kZS0+ZmxhZ3MgJiBpc2FfbWFzaykpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIE1ha2UgdHdvIHBhc3NlcyBvdmVyIHRoZSBvcGVyYW5kcy4gIEZpcnN0IHNlZSBpZiBhbnkgb2YgdGhlbQotCSBoYXZlIGV4dHJhY3Rpb24gZnVuY3Rpb25zLCBhbmQsIGlmIHRoZXkgZG8sIG1ha2Ugc3VyZSB0aGUKLQkgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLwotICAgICAgewotICAgICAgICBpbnQgaW52YWxpZCA9IDA7Ci0gICAgICAgIGZvciAob3BpbmRleCA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4ICE9IDA7IG9waW5kZXgrKykKLQkgIHsKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kID0gYWxwaGFfb3BlcmFuZHMgKyAqb3BpbmRleDsKLQkgICAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCi0JICAgICAgKCpvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgJmludmFsaWQpOwotCSAgfQotICAgICAgICBpZiAoaW52YWxpZCkKLQkgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvKiBUaGUgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLwotICAgICAgZ290byBmb3VuZDsKLSAgICB9Ci0KLSAgLyogTm8gaW5zdHJ1Y3Rpb24gZm91bmQgKi8KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubG9uZyAlIzA4eCIsIGluc24pOwotICAgIAotICByZXR1cm4gNDsKLQotZm91bmQ6Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvcGNvZGUtPm5hbWUpOwotICBpZiAob3Bjb2RlLT5vcGVyYW5kc1swXSAhPSAwKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKLQotICAvKiBOb3cgZXh0cmFjdCBhbmQgcHJpbnQgdGhlIG9wZXJhbmRzLiAgKi8KLSAgbmVlZF9jb21tYSA9IDA7Ci0gIGZvciAob3BpbmRleCA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4ICE9IDA7IG9waW5kZXgrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZCA9IGFscGhhX29wZXJhbmRzICsgKm9waW5kZXg7Ci0gICAgICBpbnQgdmFsdWU7Ci0KLSAgICAgIC8qIE9wZXJhbmRzIHRoYXQgYXJlIG1hcmtlZCBGQUtFIGFyZSBzaW1wbHkgaWdub3JlZC4gIFdlCi0JIGFscmVhZHkgbWFkZSBzdXJlIHRoYXQgdGhlIGV4dHJhY3QgZnVuY3Rpb24gY29uc2lkZXJlZAotCSB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUgdmFsaWQuICAqLwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX0ZBS0UpICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCXZhbHVlID0gKCpvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgKGludCAqKSBOVUxMKTsKLSAgICAgIGVsc2UKLQl7Ci0JICB2YWx1ZSA9IChpbnNuID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfU0lHTkVEKQotCSAgICB7Ci0JICAgICAgaW50IHNpZ25iaXQgPSAxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSk7Ci0JICAgICAgdmFsdWUgPSAodmFsdWUgXiBzaWduYml0KSAtIHNpZ25iaXQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChuZWVkX2NvbW1hICYmCi0JICAoKG9wZXJhbmQtPmZsYWdzICYgKEFYUF9PUEVSQU5EX1BBUkVOU3xBWFBfT1BFUkFORF9DT01NQSkpCi0JICAgIT0gQVhQX09QRVJBTkRfUEFSRU5TKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQl9Ci0gICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9QQVJFTlMpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoIik7Ci0KLSAgICAgIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBmbGFncy4gICovCi0gICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9JUikKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnbmFtZXNbdmFsdWVdKTsKLSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfRlBSKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWduYW1lc1t2YWx1ZSszMl0pOwotICAgICAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9SRUxBVElWRSkKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKG1lbWFkZHIgKyA0ICsgdmFsdWUsIGluZm8pOwotICAgICAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9TSUdORUQpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIHZhbHVlKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUjeCIsIHZhbHVlKTsKLQotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfUEFSRU5TKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotICAgICAgbmVlZF9jb21tYSA9IDE7Ci0gICAgfQotCi0gIHJldHVybiA0OwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hbHBoYS1vcGMuYyBiL29wY29kZXMvYWxwaGEtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOGNhNTkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hbHBoYS1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NDYgKzAsMCBAQAotLyogYWxwaGEtb3BjLmMgLS0gQWxwaGEgQVhQIG9wY29kZSBsaXN0Ci0gICBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQGN5Z251cy5jb20+LAotICAgcGF0dGVybmVkIGFmdGVyIHRoZSBQUEMgb3Bjb2RlIGhhbmRsaW5nIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvci4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi0gICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi0gICB0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAgIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci0gICB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLSAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2FscGhhLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIFRoaXMgZmlsZSBob2xkcyB0aGUgQWxwaGEgQVhQIG9wY29kZSB0YWJsZS4gIFRoZSBvcGNvZGUgdGFibGUgaW5jbHVkZXMKLSAgIGFsbW9zdCBhbGwgb2YgdGhlIGV4dGVuZGVkIGluc3RydWN0aW9uIG1uZW1vbmljcy4gIFRoaXMgcGVybWl0cyB0aGUKLSAgIGRpc2Fzc2VtYmxlciB0byB1c2UgdGhlbSwgYW5kIHNpbXBsaWZpZXMgdGhlIGFzc2VtYmxlciBsb2dpYywgYXQgdGhlCi0gICBjb3N0IG9mIGluY3JlYXNpbmcgdGhlIHRhYmxlIHNpemUuICBUaGUgdGFibGUgaXMgc3RyaWN0bHkgY29uc3RhbnQKLSAgIGRhdGEsIHNvIHRoZSBjb21waWxlciBzaG91bGQgYmUgYWJsZSB0byBwdXQgaXQgaW4gdGhlIC50ZXh0IHNlY3Rpb24uCi0KLSAgIFRoaXMgZmlsZSBhbHNvIGhvbGRzIHRoZSBvcGVyYW5kIHRhYmxlLiAgQWxsIGtub3dsZWRnZSBhYm91dCBpbnNlcnRpbmcKLSAgIG9wZXJhbmRzIGludG8gaW5zdHJ1Y3Rpb25zIGFuZCB2aWNlLXZlcnNhIGlzIGtlcHQgaW4gdGhpcyBmaWxlLgotCi0gICBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBiYXNlIGluc3RydWN0aW9uIHNldCB3YXMgY29tcGlsZWQgZnJvbSB0aGUKLSAgIF9BbHBoYSBBcmNoaXRlY3R1cmUgSGFuZGJvb2tfLCBEaWdpdGFsIE9yZGVyIE51bWJlciBFQy1RRDJLQi1URSwKLSAgIHZlcnNpb24gMi4KLQotICAgVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgcG9zdC1ldjUgYXJjaGl0ZWN0dXJlIGV4dGVuc2lvbnMgQldYLCBDSVggYW5kCi0gICBNQVggY2FtZSBmcm9tIHZlcnNpb24gMyBvZiB0aGlzIHNhbWUgZG9jdW1lbnQsIHdoaWNoIGlzIGFsc28gYXZhaWxhYmxlCi0gICBvbi1saW5lIGF0IGh0dHA6Ly9mdHAuZGlnaXRhbC5jb20vcHViL0RpZ2l0YWwvaW5mby9zZW1pY29uZHVjdG9yCi0gICAvbGl0ZXJhdHVyZS9hbHBoYWhiMi5wZGYKLQotICAgVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgRVY0IFBBTGNvZGUgaW5zdHJ1Y3Rpb25zIHdhcyBjb21waWxlZCBmcm9tCi0gICBfREVDY2hpcCAyMTA2NCBhbmQgREVDY2hpcCAyMTA2NEEgQWxwaGEgQVhQIE1pY3JvcHJvY2Vzc29ycyBIYXJkd2FyZQotICAgUmVmZXJlbmNlIE1hbnVhbF8sIERpZ2l0YWwgT3JkZXIgTnVtYmVyIEVDLVE5WlVBLVRFLCBwcmVsaW1pbmFyeQotICAgcmV2aXNpb24gZGF0ZWQgSnVuZSAxOTk0LgotCi0gICBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBFVjUgUEFMY29kZSBpbnN0cnVjdGlvbnMgd2FzIGNvbXBpbGVkIGZyb20KLSAgIF9BbHBoYSAyMTE2NCBNaWNyb3Byb2Nlc3NvciBIYXJkd2FyZSBSZWZlcmVuY2UgTWFudWFsXywgRGlnaXRhbAotICAgT3JkZXIgTnVtYmVyIEVDLVFBRVFCLVRFLCBwcmVsaW1pbmFyeSByZXZpc2lvbiBkYXRlZCBBcHJpbCAxOTk1LiAgKi8KLQwKLS8qIExvY2FsIGluc2VydGlvbiBhbmQgZXh0cmFjdGlvbiBmdW5jdGlvbnMgKi8KLQotc3RhdGljIHVuc2lnbmVkIGluc2VydF9yYmEgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X3JjYSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfemEgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X3piIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF96YyBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfYmRpc3AgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X2poaW50IFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF9ldjZod2poaW50IFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotCi1zdGF0aWMgaW50IGV4dHJhY3RfcmJhIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfcmNhIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfemEgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF96YiBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X3pjIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfYmRpc3AgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF9qaGludCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X2V2Nmh3amhpbnQgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlICAqLwotCi1jb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCBhbHBoYV9vcGVyYW5kc1tdID0KLXsKLSAgLyogVGhlIGZpZWxkcyBhcmUgYml0cywgc2hpZnQsIGluc2VydCwgZXh0cmFjdCwgZmxhZ3MgKi8KLSAgLyogVGhlIHplcm8gaW5kZXggaXMgdXNlZCB0byBpbmRpY2F0ZSBlbmQtb2YtbGlzdCAqLwotI2RlZmluZSBVTlVTRUQJCTAKLSAgeyAwLCAwLCAwLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIHBsYWluIGludGVnZXIgcmVnaXN0ZXIgZmllbGRzICovCi0jZGVmaW5lIFJBCQkoVU5VU0VEICsgMSkKLSAgeyA1LCAyMSwgMCwgQVhQX09QRVJBTkRfSVIsIDAsIDAgfSwKLSNkZWZpbmUgUkIJCShSQSArIDEpCi0gIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0lSLCAwLCAwIH0sCi0jZGVmaW5lIFJDCQkoUkIgKyAxKQotICB7IDUsIDAsIDAsIEFYUF9PUEVSQU5EX0lSLCAwLCAwIH0sCi0KLSAgLyogVGhlIHBsYWluIGZwIHJlZ2lzdGVyIGZpZWxkcyAqLwotI2RlZmluZSBGQQkJKFJDICsgMSkKLSAgeyA1LCAyMSwgMCwgQVhQX09QRVJBTkRfRlBSLCAwLCAwIH0sCi0jZGVmaW5lIEZCCQkoRkEgKyAxKQotICB7IDUsIDE2LCAwLCBBWFBfT1BFUkFORF9GUFIsIDAsIDAgfSwKLSNkZWZpbmUgRkMJCShGQiArIDEpCi0gIHsgNSwgMCwgMCwgQVhQX09QRVJBTkRfRlBSLCAwLCAwIH0sCi0KLSAgLyogVGhlIGludGVnZXIgcmVnaXN0ZXJzIHdoZW4gdGhleSBhcmUgWkVSTyAqLwotI2RlZmluZSBaQQkJKEZDICsgMSkKLSAgeyA1LCAyMSwgMCwgQVhQX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3phLCBleHRyYWN0X3phIH0sCi0jZGVmaW5lIFpCCQkoWkEgKyAxKQotICB7IDUsIDE2LCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfemIsIGV4dHJhY3RfemIgfSwKLSNkZWZpbmUgWkMJCShaQiArIDEpCi0gIHsgNSwgMCwgMCwgQVhQX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3pjLCBleHRyYWN0X3pjIH0sCi0KLSAgLyogVGhlIFJCIGZpZWxkIHdoZW4gaXQgbmVlZHMgcGFyZW50aGVzZXMgKi8KLSNkZWZpbmUgUFJCCQkoWkMgKyAxKQotICB7IDUsIDE2LCAwLCBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9QQVJFTlMsIDAsIDAgfSwKLQotICAvKiBUaGUgUkIgZmllbGQgd2hlbiBpdCBuZWVkcyBwYXJlbnRoZXNlcyBfYW5kXyBhIHByZWNlZGluZyBjb21tYSAqLwotI2RlZmluZSBDUFJCCQkoUFJCICsgMSkKLSAgeyA1LCAxNiwgMCwKLSAgICBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9QQVJFTlN8QVhQX09QRVJBTkRfQ09NTUEsIDAsIDAgfSwKLQotICAvKiBUaGUgUkIgZmllbGQgd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBSQSBmaWVsZCAqLwotI2RlZmluZSBSQkEJCShDUFJCICsgMSkKLSAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3JiYSwgZXh0cmFjdF9yYmEgfSwKLQotICAvKiBUaGUgUkMgZmllbGQgd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBSQiBmaWVsZCAqLwotI2RlZmluZSBSQ0EJCShSQkEgKyAxKQotICB7IDUsIDAsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF9yY2EsIGV4dHJhY3RfcmNhIH0sCi0KLSAgLyogVGhlIFJDIGZpZWxkIHdoZW4gaXQgY2FuICpkZWZhdWx0KiB0byBSQSAqLwotI2RlZmluZSBEUkMxCQkoUkNBICsgMSkKLSAgeyA1LCAwLCAwLAotICAgIEFYUF9PUEVSQU5EX0lSfEFYUF9PUEVSQU5EX0RFRkFVTFRfRklSU1QsIDAsIDAgfSwKLQotICAvKiBUaGUgUkMgZmllbGQgd2hlbiBpdCBjYW4gKmRlZmF1bHQqIHRvIFJCICovCi0jZGVmaW5lIERSQzIJCShEUkMxICsgMSkKLSAgeyA1LCAwLCAwLAotICAgIEFYUF9PUEVSQU5EX0lSfEFYUF9PUEVSQU5EX0RFRkFVTFRfU0VDT05ELCAwLCAwIH0sCi0KLSAgLyogVGhlIEZDIGZpZWxkIHdoZW4gaXQgY2FuICpkZWZhdWx0KiB0byBSQSAqLwotI2RlZmluZSBERkMxCQkoRFJDMiArIDEpCi0gIHsgNSwgMCwgMCwKLSAgICBBWFBfT1BFUkFORF9GUFJ8QVhQX09QRVJBTkRfREVGQVVMVF9GSVJTVCwgMCwgMCB9LAotCi0gIC8qIFRoZSBGQyBmaWVsZCB3aGVuIGl0IGNhbiAqZGVmYXVsdCogdG8gUkIgKi8KLSNkZWZpbmUgREZDMgkJKERGQzEgKyAxKQotICB7IDUsIDAsIDAsCi0gICAgQVhQX09QRVJBTkRfRlBSfEFYUF9PUEVSQU5EX0RFRkFVTFRfU0VDT05ELCAwLCAwIH0sCi0KLSAgLyogVGhlIHVuc2lnbmVkIDgtYml0IGxpdGVyYWwgb2YgT3BlcmF0ZSBmb3JtYXQgaW5zbnMgKi8KLSNkZWZpbmUgTElUCQkoREZDMiArIDEpCi0gIHsgOCwgMTMsIC1MSVQsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIHNpZ25lZCAxNi1iaXQgZGlzcGxhY2VtZW50IG9mIE1lbW9yeSBmb3JtYXQgaW5zbnMuICBGcm9tIGhlcmUKLSAgICAgd2UgY2FuJ3QgdGVsbCB3aGF0IHJlbG9jYXRpb24gc2hvdWxkIGJlIHVzZWQsIHNvIGRvbid0IHVzZSBhIGRlZmF1bHQuICovCi0jZGVmaW5lIE1ESVNQCQkoTElUICsgMSkKLSAgeyAxNiwgMCwgLU1ESVNQLCBBWFBfT1BFUkFORF9TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgc2lnbmVkICIyMy1iaXQiIGFsaWduZWQgZGlzcGxhY2VtZW50IG9mIEJyYW5jaCBmb3JtYXQgaW5zbnMgKi8KLSNkZWZpbmUgQkRJU1AJCShNRElTUCArIDEpCi0gIHsgMjEsIDAsIEJGRF9SRUxPQ18yM19QQ1JFTF9TMiwgCi0gICAgQVhQX09QRVJBTkRfUkVMQVRJVkUsIGluc2VydF9iZGlzcCwgZXh0cmFjdF9iZGlzcCB9LAotCi0gIC8qIFRoZSAyNi1iaXQgUEFMY29kZSBmdW5jdGlvbiAqLwotI2RlZmluZSBQQUxGTgkJKEJESVNQICsgMSkKLSAgeyAyNiwgMCwgLVBBTEZOLCBBWFBfT1BFUkFORF9VTlNJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSBvcHRpb25hbCBzaWduZWQgIjE2LWJpdCIgYWxpZ25lZCBkaXNwbGFjZW1lbnQgb2YgdGhlIEpNUC9KU1IgaGludCAqLwotI2RlZmluZSBKTVBISU5UCQkoUEFMRk4gKyAxKQotICB7IDE0LCAwLCBCRkRfUkVMT0NfQUxQSEFfSElOVCwKLSAgICBBWFBfT1BFUkFORF9SRUxBVElWRXxBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk98QVhQX09QRVJBTkRfTk9PVkVSRkxPVywKLSAgICBpbnNlcnRfamhpbnQsIGV4dHJhY3RfamhpbnQgfSwKLQotICAvKiBUaGUgb3B0aW9uYWwgaGludCB0byBSRVQvSlNSX0NPUk9VVElORSAqLwotI2RlZmluZSBSRVRISU5UCQkoSk1QSElOVCArIDEpCi0gIHsgMTQsIDAsIC1SRVRISU5ULAotICAgIEFYUF9PUEVSQU5EX1VOU0lHTkVEfEFYUF9PUEVSQU5EX0RFRkFVTFRfWkVSTywgMCwgMCB9LAotCi0gIC8qIFRoZSAxMi1iaXQgZGlzcGxhY2VtZW50IGZvciB0aGUgZXZbNDZdIGh3X3tsZCxzdH0gKHBhbDFiL3BhbDFmKSBpbnNucyAqLwotI2RlZmluZSBFVjRIV0RJU1AJKFJFVEhJTlQgKyAxKQotI2RlZmluZSBFVjZIV0RJU1AJKEVWNEhXRElTUCkKLSAgeyAxMiwgMCwgLUVWNEhXRElTUCwgQVhQX09QRVJBTkRfU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDUtYml0IGluZGV4IGZvciB0aGUgZXY0IGh3X21bZnRdcHIgKHBhbDE5L3BhbDFkKSBpbnNucyAqLwotI2RlZmluZSBFVjRIV0lOREVYCShFVjRIV0RJU1AgKyAxKQotICB7IDUsIDAsIC1FVjRIV0lOREVYLCBBWFBfT1BFUkFORF9VTlNJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSA4LWJpdCBpbmRleCBmb3IgdGhlIG9kZGx5IHVucXVhbGlmaWVkIGh3X21bdGZdcHIgaW5zbnMKLSAgICAgdGhhdCBvY2N1ciBpbiBERUMgUEFMY29kZS4gICovCi0jZGVmaW5lIEVWNEVYVEhXSU5ERVgJKEVWNEhXSU5ERVggKyAxKQotICB7IDgsIDAsIC1FVjRFWFRIV0lOREVYLCBBWFBfT1BFUkFORF9VTlNJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSAxMC1iaXQgZGlzcGxhY2VtZW50IGZvciB0aGUgZXY1IGh3X3tsZCxzdH0gKHBhbDFiL3BhbDFmKSBpbnNucyAqLwotI2RlZmluZSBFVjVIV0RJU1AJKEVWNEVYVEhXSU5ERVggKyAxKQotICB7IDEwLCAwLCAtRVY1SFdESVNQLCBBWFBfT1BFUkFORF9TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgMTYtYml0IGluZGV4IGZvciB0aGUgZXY1IGh3X21bZnRdcHIgKHBhbDE5L3BhbDFkKSBpbnNucyAqLwotI2RlZmluZSBFVjVIV0lOREVYCShFVjVIV0RJU1AgKyAxKQotICB7IDE2LCAwLCAtRVY1SFdJTkRFWCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgMTYtYml0IGNvbWJpbmVkIGluZGV4L3Njb3JlYm9hcmQgbWFzayBmb3IgdGhlIGV2NgotICAgICBod19tW2Z0XXByIChwYWwxOS9wYWwxZCkgaW5zbnMgKi8KLSNkZWZpbmUgRVY2SFdJTkRFWAkoRVY1SFdJTkRFWCArIDEpCi0gIHsgMTYsIDAsIC1FVjZIV0lOREVYLCBBWFBfT1BFUkFORF9VTlNJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSAxMy1iaXQgYnJhbmNoIGhpbnQgZm9yIHRoZSBldjYgaHdfam1wL2pzciAocGFsMWUpIGluc24gKi8KLSNkZWZpbmUgRVY2SFdKTVBISU5UCShFVjZIV0lOREVYKyAxKQotICB7IDgsIDAsIC1FVjZIV0pNUEhJTlQsCi0gICAgQVhQX09QRVJBTkRfUkVMQVRJVkV8QVhQX09QRVJBTkRfREVGQVVMVF9aRVJPfEFYUF9PUEVSQU5EX05PT1ZFUkZMT1csCi0gICAgaW5zZXJ0X2V2Nmh3amhpbnQsIGV4dHJhY3RfZXY2aHdqaGludCB9Ci19OwotCi1jb25zdCB1bnNpZ25lZCBhbHBoYV9udW1fb3BlcmFuZHMgPSBzaXplb2YoYWxwaGFfb3BlcmFuZHMpL3NpemVvZigqYWxwaGFfb3BlcmFuZHMpOwotCi0vKiBUaGUgUkIgZmllbGQgd2hlbiBpdCBpcyB0aGUgc2FtZSBhcyB0aGUgUkEgZmllbGQgaW4gdGhlIHNhbWUgaW5zbi4KLSAgIFRoaXMgb3BlcmFuZCBpcyBtYXJrZWQgZmFrZS4gIFRoZSBpbnNlcnRpb24gZnVuY3Rpb24ganVzdCBjb3BpZXMKLSAgIHRoZSBSQSBmaWVsZCBpbnRvIHRoZSBSQiBmaWVsZCwgYW5kIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGp1c3QKLSAgIGNoZWNrcyB0aGF0IHRoZSBmaWVsZHMgYXJlIHRoZSBzYW1lLiAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X3JiYShpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gaW5zbiB8ICgoKGluc24gPj4gMjEpICYgMHgxZikgPDwgMTYpOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3JiYShpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuID4+IDIxKSAmIDB4MWYpICE9ICgoaW5zbiA+PiAxNikgJiAweDFmKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFRoZSBzYW1lIGZvciB0aGUgUkMgZmllbGQgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9yY2EoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50IHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAoKGluc24gPj4gMjEpICYgMHgxZik7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfcmNhKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gKGluc24gJiAweDFmKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIEZha2UgYXJndW1lbnRzIGluIHdoaWNoIHRoZSByZWdpc3RlcnMgbXVzdCBiZSBzZXQgdG8gWkVSTyAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X3phKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiBpbnNuIHwgKDMxIDw8IDIxKTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF96YShpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gMzEpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF96YihpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICByZXR1cm4gaW5zbiB8ICgzMSA8PCAxNik7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfemIoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwgJiYgKChpbnNuID4+IDE2KSAmIDB4MWYpICE9IDMxKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfemMoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50IHZhbHVlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIGluc24gfCAzMTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF96YyhpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCAmJiAoaW5zbiAmIDB4MWYpICE9IDMxKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogVGhlIGRpc3BsYWNlbWVudCBmaWVsZCBvZiBhIEJyYW5jaCBmb3JtYXQgaW5zbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X2JkaXNwKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKilOVUxMICYmICh2YWx1ZSAmIDMpKQotICAgICplcnJtc2cgPSBfKCJicmFuY2ggb3BlcmFuZCB1bmFsaWduZWQiKTsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlIC8gNCkgJiAweDFGRkZGRik7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotZXh0cmFjdF9iZGlzcChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDQgKiAoKChpbnNuICYgMHgxRkZGRkYpIF4gMHgxMDAwMDApIC0gMHgxMDAwMDApOwotfQotCi0KLS8qIFRoZSBoaW50IGZpZWxkIG9mIGEgSk1QL0pTUiBpbnNuLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkCi1pbnNlcnRfamhpbnQoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50IHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKU5VTEwgJiYgKHZhbHVlICYgMykpCi0gICAgKmVycm1zZyA9IF8oImp1bXAgaGludCB1bmFsaWduZWQiKTsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlIC8gNCkgJiAweDNGRkYpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfamhpbnQoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHJldHVybiA0ICogKCgoaW5zbiAmIDB4M0ZGRikgXiAweDIwMDApIC0gMHgyMDAwKTsKLX0KLQotLyogVGhlIGhpbnQgZmllbGQgb2YgYW4gRVY2IEhXX0pNUC9KU1IgaW5zbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X2V2Nmh3amhpbnQoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50IHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKU5VTEwgJiYgKHZhbHVlICYgMykpCi0gICAgKmVycm1zZyA9IF8oImp1bXAgaGludCB1bmFsaWduZWQiKTsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlIC8gNCkgJiAweDFGRkYpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfZXY2aHdqaGludChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDQgKiAoKChpbnNuICYgMHgxRkZGKSBeIDB4MTAwMCkgLSAweDEwMDApOwotfQotCi0MCi0vKiBNYWNyb3MgdXNlZCB0byBmb3JtIG9wY29kZXMgKi8KLQotLyogVGhlIG1haW4gb3Bjb2RlICovCi0jZGVmaW5lIE9QKHgpCQkoKCh4KSAmIDB4M0YpIDw8IDI2KQotI2RlZmluZSBPUF9NQVNLCQkweEZDMDAwMDAwCi0KLS8qIEJyYW5jaCBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIEJSQV8ob28pCU9QKG9vKQotI2RlZmluZSBCUkFfTUFTSwlPUF9NQVNLCi0jZGVmaW5lIEJSQShvbykJCUJSQV8ob28pLCBCUkFfTUFTSwotCi0vKiBGbG9hdGluZyBwb2ludCBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIEZQXyhvbyxmZmYpCShPUChvbykgfCAoKChmZmYpICYgMHg3RkYpIDw8IDUpKQotI2RlZmluZSBGUF9NQVNLCQkoT1BfTUFTSyB8IDB4RkZFMCkKLSNkZWZpbmUgRlAob28sZmZmKQlGUF8ob28sZmZmKSwgRlBfTUFTSwotCi0vKiBNZW1vcnkgZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBNRU1fKG9vKQlPUChvbykKLSNkZWZpbmUgTUVNX01BU0sJT1BfTUFTSwotI2RlZmluZSBNRU0ob28pCQlNRU1fKG9vKSwgTUVNX01BU0sKLQotLyogTWVtb3J5L0Z1bmMgQ29kZSBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIE1GQ18ob28sZmZmZikJKE9QKG9vKSB8ICgoZmZmZikgJiAweEZGRkYpKQotI2RlZmluZSBNRkNfTUFTSwkoT1BfTUFTSyB8IDB4RkZGRikKLSNkZWZpbmUgTUZDKG9vLGZmZmYpCU1GQ18ob28sZmZmZiksIE1GQ19NQVNLCi0KLS8qIE1lbW9yeS9CcmFuY2ggZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBNQlJfKG9vLGgpCShPUChvbykgfCAoKChoKSAmIDMpIDw8IDE0KSkKLSNkZWZpbmUgTUJSX01BU0sJKE9QX01BU0sgfCAweEMwMDApCi0jZGVmaW5lIE1CUihvbyxoKQlNQlJfKG9vLGgpLCBNQlJfTUFTSwotCi0vKiBPcGVyYXRlIGZvcm1hdCBpbnN0cnVjdGlvbnMuICBUaGUgT1BSTCB2YXJpYW50IHNwZWNpZmllcyBhCi0gICBsaXRlcmFsIHNlY29uZCBhcmd1bWVudC4gKi8KLSNkZWZpbmUgT1BSXyhvbyxmZikJKE9QKG9vKSB8ICgoKGZmKSAmIDB4N0YpIDw8IDUpKQotI2RlZmluZSBPUFJMXyhvbyxmZikJKE9QUl8oKG9vKSwoZmYpKSB8IDB4MTAwMCkKLSNkZWZpbmUgT1BSX01BU0sJKE9QX01BU0sgfCAweDFGRTApCi0jZGVmaW5lIE9QUihvbyxmZikJT1BSXyhvbyxmZiksIE9QUl9NQVNLCi0jZGVmaW5lIE9QUkwob28sZmYpCU9QUkxfKG9vLGZmKSwgT1BSX01BU0sKLQotLyogR2VuZXJpYyBQQUxjb2RlIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgUENEXyhvbykJT1Aob28pCi0jZGVmaW5lIFBDRF9NQVNLCU9QX01BU0sKLSNkZWZpbmUgUENEKG9vKQkJUENEXyhvbyksIFBDRF9NQVNLCi0KLS8qIFNwZWNpZmljIFBBTGNvZGUgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFNQQ0RfKG9vLGZmZmYpCShPUChvbykgfCAoKGZmZmYpICYgMHgzRkZGRkZGKSkKLSNkZWZpbmUgU1BDRF9NQVNLCTB4RkZGRkZGRkYKLSNkZWZpbmUgU1BDRChvbyxmZmZmKQlTUENEXyhvbyxmZmZmKSwgU1BDRF9NQVNLCi0KLS8qIEhhcmR3YXJlIG1lbW9yeSAoaHdfe2xkLHN0fSkgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIEVWNEhXTUVNXyhvbyxmKQkoT1Aob28pIHwgKCgoZikgJiAweEYpIDw8IDEyKSkKLSNkZWZpbmUgRVY0SFdNRU1fTUFTSwkoT1BfTUFTSyB8IDB4RjAwMCkKLSNkZWZpbmUgRVY0SFdNRU0ob28sZikJRVY0SFdNRU1fKG9vLGYpLCBFVjRIV01FTV9NQVNLCi0KLSNkZWZpbmUgRVY1SFdNRU1fKG9vLGYpCShPUChvbykgfCAoKChmKSAmIDB4M0YpIDw8IDEwKSkKLSNkZWZpbmUgRVY1SFdNRU1fTUFTSwkoT1BfTUFTSyB8IDB4RjgwMCkKLSNkZWZpbmUgRVY1SFdNRU0ob28sZikJRVY1SFdNRU1fKG9vLGYpLCBFVjVIV01FTV9NQVNLCi0KLSNkZWZpbmUgRVY2SFdNRU1fKG9vLGYpCShPUChvbykgfCAoKChmKSAmIDB4RikgPDwgMTIpKQotI2RlZmluZSBFVjZIV01FTV9NQVNLCShPUF9NQVNLIHwgMHhGMDAwKQotI2RlZmluZSBFVjZIV01FTShvbyxmKQlFVjZIV01FTV8ob28sZiksIEVWNkhXTUVNX01BU0sKLQotI2RlZmluZSBFVjZIV01CUl8ob28saCkJKE9QKG9vKSB8ICgoKGgpICYgNykgPDwgMTMpKQotI2RlZmluZSBFVjZIV01CUl9NQVNLCShPUF9NQVNLIHwgMHhFMDAwKQotI2RlZmluZSBFVjZIV01CUihvbyxoKQlFVjZIV01CUl8ob28saCksIEVWNkhXTUJSX01BU0sKLQotLyogQWJicmV2aWF0aW9ucyBmb3IgaW5zdHJ1Y3Rpb24gc3Vic2V0cy4gICovCi0jZGVmaW5lIEJBU0UJCQlBWFBfT1BDT0RFX0JBU0UKLSNkZWZpbmUgRVY0CQkJQVhQX09QQ09ERV9FVjQKLSNkZWZpbmUgRVY1CQkJQVhQX09QQ09ERV9FVjUKLSNkZWZpbmUgRVY2CQkJQVhQX09QQ09ERV9FVjYKLSNkZWZpbmUgQldYCQkJQVhQX09QQ09ERV9CV1gKLSNkZWZpbmUgQ0lYCQkJQVhQX09QQ09ERV9DSVgKLSNkZWZpbmUgTUFYCQkJQVhQX09QQ09ERV9NQVgKLQotLyogQ29tbW9uIGNvbWJpbmF0aW9ucyBvZiBhcmd1bWVudHMgKi8KLSNkZWZpbmUgQVJHX05PTkUJCXsgMCB9Ci0jZGVmaW5lIEFSR19CUkEJCQl7IFJBLCBCRElTUCB9Ci0jZGVmaW5lIEFSR19GQlJBCQl7IEZBLCBCRElTUCB9Ci0jZGVmaW5lIEFSR19GUAkJCXsgRkEsIEZCLCBERkMxIH0KLSNkZWZpbmUgQVJHX0ZQWjEJCXsgWkEsIEZCLCBERkMxIH0KLSNkZWZpbmUgQVJHX01FTQkJCXsgUkEsIE1ESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfRk1FTQkJeyBGQSwgTURJU1AsIFBSQiB9Ci0jZGVmaW5lIEFSR19PUFIJCQl7IFJBLCBSQiwgRFJDMSB9Ci0jZGVmaW5lIEFSR19PUFJMCQl7IFJBLCBMSVQsIERSQzEgfQotI2RlZmluZSBBUkdfT1BSWjEJCXsgWkEsIFJCLCBEUkMxIH0KLSNkZWZpbmUgQVJHX09QUkxaMQkJeyBaQSwgTElULCBSQyB9Ci0jZGVmaW5lIEFSR19QQ0QJCQl7IFBBTEZOIH0KLSNkZWZpbmUgQVJHX0VWNEhXTUVNCQl7IFJBLCBFVjRIV0RJU1AsIFBSQiB9Ci0jZGVmaW5lIEFSR19FVjRIV01QUgkJeyBSQSwgUkJBLCBFVjRIV0lOREVYIH0KLSNkZWZpbmUgQVJHX0VWNUhXTUVNCQl7IFJBLCBFVjVIV0RJU1AsIFBSQiB9Ci0jZGVmaW5lIEFSR19FVjZIV01FTQkJeyBSQSwgRVY2SFdESVNQLCBQUkIgfQotDAotLyogVGhlIG9wY29kZSB0YWJsZS4KLQotICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgotCi0gICBOQU1FIE9QQ09ERSBNQVNLIHsgT1BFUkFORFMgfQotCi0gICBOQU1FCQlpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLSAgIE9QQ09ERQlpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgotCi0gICBNQVNLCQlpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKLSAgICAgICAgICAgIAl3aGljaCBiaXRzIGluIHRoZSBhY3R1YWwgb3Bjb2RlIG11c3QgbWF0Y2ggT1BDT0RFLgotCi0gICBPUEVSQU5EUwlpcyB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KLQotICAgVGhlIHByZWNlZGluZyBtYWNyb3MgbWVyZ2UgdGhlIHRleHQgb2YgdGhlIE9QQ09ERSBhbmQgTUFTSyBmaWVsZHMuCi0KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0Ci0gICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQotICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLgotCi0gICBPdGhlcndpc2UsIGl0IGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgYW5kIG1pbm9yIGZ1bmN0aW9uIGNvZGUuCi0KLSAgIFRoZXJlIGFyZSB0aHJlZSBjbGFzc2VzIG9mIG5vdC1yZWFsbHktaW5zdHJ1Y3Rpb25zIGluIHRoaXMgdGFibGU6Ci0KLSAgIEFMSUFTCWlzIGFub3RoZXIgbmFtZSBmb3IgYW5vdGhlciBpbnN0cnVjdGlvbi4gIFNvbWUgb2YKLQkJdGhlc2UgY29tZSBmcm9tIHRoZSBBcmNoaXRlY3R1cmUgSGFuZGJvb2ssIHNvbWUKLQkJY29tZSBmcm9tIHRoZSBvcmlnaW5hbCBnYXMgb3Bjb2RlIHRhYmxlcy4gIEluIGFsbAotCQljYXNlcywgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIG9wY29kZSBpcyB1bmNoYW5nZWQuCi0KLSAgIFBTRVVETwlhIHN0eWxpemVkIGNvZGUgZm9ybSBlbmRvcnNlZCBieSBDaGFwdGVyIEEuNCBvZiB0aGUKLQkJQXJjaGl0ZWN0dXJlIEhhbmRib29rLgotCi0gICBFWFRSQQlhIHN0eWxpemVkIGNvZGUgZm9ybSBmb3VuZCBpbiB0aGUgb3JpZ2luYWwgZ2FzIHRhYmxlcy4KLQotICAgQW5kIHR3byBhbm5vdGF0aW9uczoKLQotICAgRVY1NiBCVVQJb3Bjb2RlcyB0aGF0IGFyZSBvZmZpY2lhbGx5IGludHJvZHVjZWQgYXMgb2YgdGhlIGV2NTYsCi0gICAJCWJ1dCB3aXRoIGRlZmluZWQgcmVzdWx0cyBvbiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbnMuCi0KLSAgIEVWNTYgVU5BCW9wY29kZXMgdGhhdCB3ZXJlIGludHJvZHVjZWQgYXMgb2YgdGhlIGV2NTYgd2l0aAotICAgCQlwcmVzdW1hYmx5IHVuZGVmaW5lZCByZXN1bHRzIG9uIHByZXZpb3VzIGltcGxlbWVudGF0aW9ucwotCQl0aGF0IHdlcmUgbm90IGFzc2lnbmVkIHRvIGEgcGFydGljdWxhciBleHRlbnNpb24uCi0qLwotCi1jb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlIGFscGhhX29wY29kZXNbXSA9IHsKLSAgeyAiaGFsdCIsCQlTUENEKDB4MDAsMHgwMDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiZHJhaW5hIiwJCVNQQ0QoMHgwMCwweDAwMDIpLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJicHQiLAkJU1BDRCgweDAwLDB4MDA4MCksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImNhbGxzeXMiLAkJU1BDRCgweDAwLDB4MDA4MyksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImNobWsiLCAJCVNQQ0QoMHgwMCwweDAwODMpLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJpbWIiLAkJU1BDRCgweDAwLDB4MDA4NiksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImNhbGxfcGFsIiwJCVBDRCgweDAwKSwgQkFTRSwgQVJHX1BDRCB9LAotICB7ICJwYWwiLAkJUENEKDB4MDApLCBCQVNFLCBBUkdfUENEIH0sCQkvKiBhbGlhcyAqLwotCi0gIHsgImxkYSIsCQlNRU0oMHgwOCksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAibGRhaCIsCQlNRU0oMHgwOSksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAibGRidSIsCQlNRU0oMHgwQSksIEJXWCwgQVJHX01FTSB9LAotICB7ICJ1bm9wIiwJCU1FTSgweDBCKSwgQkFTRSwgeyBaQSB9IH0sCQkvKiBwc2V1ZG8gKi8KLSAgeyAibGRxX3UiLAkJTUVNKDB4MEIpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkd3UiLAkJTUVNKDB4MEMpLCBCV1gsIEFSR19NRU0gfSwKLSAgeyAic3R3IiwJCU1FTSgweDBEKSwgQldYLCBBUkdfTUVNIH0sCi0gIHsgInN0YiIsCQlNRU0oMHgwRSksIEJXWCwgQVJHX01FTSB9LAotICB7ICJzdHFfdSIsCQlNRU0oMHgwRiksIEJBU0UsIEFSR19NRU0gfSwKLQotICB7ICJzZXh0bCIsCQlPUFIoMHgxMCwweDAwKSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzZXh0bCIsCQlPUFJMKDB4MTAsMHgwMCksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCi0gIHsgImFkZGwiLAkJT1BSKDB4MTAsMHgwMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYWRkbCIsCQlPUFJMKDB4MTAsMHgwMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInM0YWRkbCIsCQlPUFIoMHgxMCwweDAyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzNGFkZGwiLAkJT1BSTCgweDEwLDB4MDIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJuZWdsIiwJCU9QUigweDEwLDB4MDkpLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogcHNldWRvICovCi0gIHsgIm5lZ2wiLAkJT1BSTCgweDEwLDB4MDkpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJsIiwJCU9QUigweDEwLDB4MDkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInN1YmwiLAkJT1BSTCgweDEwLDB4MDkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNHN1YmwiLAkJT1BSKDB4MTAsMHgwQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRzdWJsIiwJCU9QUkwoMHgxMCwweDBCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21wYmdlIiwJCU9QUigweDEwLDB4MEYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtcGJnZSIsCQlPUFJMKDB4MTAsMHgwRiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInM4YWRkbCIsCQlPUFIoMHgxMCwweDEyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzOGFkZGwiLAkJT1BSTCgweDEwLDB4MTIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzOHN1YmwiLAkJT1BSKDB4MTAsMHgxQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczhzdWJsIiwJCU9QUkwoMHgxMCwweDFCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21wdWx0IiwJCU9QUigweDEwLDB4MUQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtcHVsdCIsCQlPUFJMKDB4MTAsMHgxRCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImFkZHEiLAkJT1BSKDB4MTAsMHgyMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYWRkcSIsCQlPUFJMKDB4MTAsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInM0YWRkcSIsCQlPUFIoMHgxMCwweDIyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzNGFkZHEiLAkJT1BSTCgweDEwLDB4MjIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJuZWdxIiwgCQlPUFIoMHgxMCwweDI5KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJuZWdxIiwgCQlPUFJMKDB4MTAsMHgyOSksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YnEiLAkJT1BSKDB4MTAsMHgyOSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAic3VicSIsCQlPUFJMKDB4MTAsMHgyOSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInM0c3VicSIsCQlPUFIoMHgxMCwweDJCKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzNHN1YnEiLAkJT1BSTCgweDEwLDB4MkIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbXBlcSIsCQlPUFIoMHgxMCwweDJEKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXBlcSIsCQlPUFJMKDB4MTAsMHgyRCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInM4YWRkcSIsCQlPUFIoMHgxMCwweDMyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzOGFkZHEiLAkJT1BSTCgweDEwLDB4MzIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzOHN1YnEiLAkJT1BSKDB4MTAsMHgzQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczhzdWJxIiwJCU9QUkwoMHgxMCwweDNCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21wdWxlIiwJCU9QUigweDEwLDB4M0QpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtcHVsZSIsCQlPUFJMKDB4MTAsMHgzRCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImFkZGwvdiIsCQlPUFIoMHgxMCwweDQwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJhZGRsL3YiLAkJT1BSTCgweDEwLDB4NDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJuZWdsL3YiLAkJT1BSKDB4MTAsMHg0OSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAibmVnbC92IiwJCU9QUkwoMHgxMCwweDQ5KSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VibC92IiwJCU9QUigweDEwLDB4NDkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInN1YmwvdiIsCQlPUFJMKDB4MTAsMHg0OSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcGx0IiwJCU9QUigweDEwLDB4NEQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtcGx0IiwJCU9QUkwoMHgxMCwweDREKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiYWRkcS92IiwJCU9QUigweDEwLDB4NjApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImFkZHEvdiIsCQlPUFJMKDB4MTAsMHg2MCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm5lZ3EvdiIsCQlPUFIoMHgxMCwweDY5KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJuZWdxL3YiLAkJT1BSTCgweDEwLDB4NjkpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJxL3YiLAkJT1BSKDB4MTAsMHg2OSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAic3VicS92IiwJCU9QUkwoMHgxMCwweDY5KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21wbGUiLAkJT1BSKDB4MTAsMHg2RCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21wbGUiLAkJT1BSTCgweDEwLDB4NkQpLCBCQVNFLCBBUkdfT1BSTCB9LAotCi0gIHsgImFuZCIsCQlPUFIoMHgxMSwweDAwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJhbmQiLAkJT1BSTCgweDExLDB4MDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJhbmRub3QiLAkJT1BSKDB4MTEsMHgwOCksIEJBU0UsIEFSR19PUFIgfSwJLyogYWxpYXMgKi8KLSAgeyAiYW5kbm90IiwJCU9QUkwoMHgxMSwweDA4KSwgQkFTRSwgQVJHX09QUkwgfSwJLyogYWxpYXMgKi8KLSAgeyAiYmljIiwJCU9QUigweDExLDB4MDgpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImJpYyIsCQlPUFJMKDB4MTEsMHgwOCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZsYnMiLAkJT1BSKDB4MTEsMHgxNCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmxicyIsCQlPUFJMKDB4MTEsMHgxNCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZsYmMiLAkJT1BSKDB4MTEsMHgxNiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmxiYyIsCQlPUFJMKDB4MTEsMHgxNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm5vcCIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgeyBaQSwgWkIsIFpDIH0gfSwgLyogcHNldWRvICovCi0gIHsgImNsciIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgeyBaQSwgWkIsIFJDIH0gfSwgLyogcHNldWRvICovCi0gIHsgIm1vdiIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgeyBaQSwgUkIsIFJDIH0gfSwgLyogcHNldWRvICovCi0gIHsgIm1vdiIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgeyBSQSwgUkJBLCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJtb3YiLAkJT1BSTCgweDExLDB4MjApLCBCQVNFLCB7IFpBLCBMSVQsIFJDIH0gfSwgLyogcHNldWRvICovCi0gIHsgIm9yIiwJCU9QUigweDExLDB4MjApLCBCQVNFLCBBUkdfT1BSIH0sCS8qIGFsaWFzICovCi0gIHsgIm9yIiwJCU9QUkwoMHgxMSwweDIwKSwgQkFTRSwgQVJHX09QUkwgfSwJLyogYWxpYXMgKi8KLSAgeyAiYmlzIiwJCU9QUigweDExLDB4MjApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImJpcyIsCQlPUFJMKDB4MTEsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZlcSIsCQlPUFIoMHgxMSwweDI0KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbW92ZXEiLAkJT1BSTCgweDExLDB4MjQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bmUiLAkJT1BSKDB4MTEsMHgyNiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdm5lIiwJCU9QUkwoMHgxMSwweDI2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibm90IiwJCU9QUigweDExLDB4MjgpLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogcHNldWRvICovCi0gIHsgIm5vdCIsCQlPUFJMKDB4MTEsMHgyOCksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCi0gIHsgIm9ybm90IiwJCU9QUigweDExLDB4MjgpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm9ybm90IiwJCU9QUkwoMHgxMSwweDI4KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAieG9yIiwJCU9QUigweDExLDB4NDApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInhvciIsCQlPUFJMKDB4MTEsMHg0MCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZsdCIsCQlPUFIoMHgxMSwweDQ0KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbW92bHQiLAkJT1BSTCgweDExLDB4NDQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92Z2UiLAkJT1BSKDB4MTEsMHg0NiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmdlIiwJCU9QUkwoMHgxMSwweDQ2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXF2IiwJCU9QUigweDExLDB4NDgpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImVxdiIsCQlPUFJMKDB4MTEsMHg0OCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInhvcm5vdCIsCQlPUFIoMHgxMSwweDQ4KSwgQkFTRSwgQVJHX09QUiB9LAkvKiBhbGlhcyAqLwotICB7ICJ4b3Jub3QiLAkJT1BSTCgweDExLDB4NDgpLCBCQVNFLCBBUkdfT1BSTCB9LAkvKiBhbGlhcyAqLwotICB7ICJhbWFzayIsCQlPUFIoMHgxMSwweDYxKSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIGV2NTYgYnV0ICovCi0gIHsgImFtYXNrIiwJCU9QUkwoMHgxMSwweDYxKSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBldjU2IGJ1dCAqLwotICB7ICJjbW92bGUiLAkJT1BSKDB4MTEsMHg2NCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmxlIiwJCU9QUkwoMHgxMSwweDY0KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdmd0IiwJCU9QUigweDExLDB4NjYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZndCIsCQlPUFJMKDB4MTEsMHg2NiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImltcGx2ZXIiLAkJT1BSTF8oMHgxMSwweDZDKXwoMzE8PDIxKXwoMTw8MTMpLAotICAgIAkJCTB4RkZGRkZGRTAsIEJBU0UsIHsgUkMgfSB9LAkJLyogZXY1NiBidXQgKi8KLQotICB7ICJtc2tibCIsCQlPUFIoMHgxMiwweDAyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2tibCIsCQlPUFJMKDB4MTIsMHgwMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImV4dGJsIiwJCU9QUigweDEyLDB4MDYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImV4dGJsIiwJCU9QUkwoMHgxMiwweDA2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW5zYmwiLAkJT1BSKDB4MTIsMHgwQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiaW5zYmwiLAkJT1BSTCgweDEyLDB4MEIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2t3bCIsCQlPUFIoMHgxMiwweDEyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2t3bCIsCQlPUFJMKDB4MTIsMHgxMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImV4dHdsIiwJCU9QUigweDEyLDB4MTYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImV4dHdsIiwJCU9QUkwoMHgxMiwweDE2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW5zd2wiLAkJT1BSKDB4MTIsMHgxQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiaW5zd2wiLAkJT1BSTCgweDEyLDB4MUIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2tsbCIsCQlPUFIoMHgxMiwweDIyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2tsbCIsCQlPUFJMKDB4MTIsMHgyMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImV4dGxsIiwJCU9QUigweDEyLDB4MjYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImV4dGxsIiwJCU9QUkwoMHgxMiwweDI2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW5zbGwiLAkJT1BSKDB4MTIsMHgyQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiaW5zbGwiLAkJT1BSTCgweDEyLDB4MkIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJ6YXAiLAkJT1BSKDB4MTIsMHgzMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiemFwIiwJCU9QUkwoMHgxMiwweDMwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiemFwbm90IiwJCU9QUigweDEyLDB4MzEpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInphcG5vdCIsCQlPUFJMKDB4MTIsMHgzMSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm1za3FsIiwJCU9QUigweDEyLDB4MzIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm1za3FsIiwJCU9QUkwoMHgxMiwweDMyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAic3JsIiwJCU9QUigweDEyLDB4MzQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInNybCIsCQlPUFJMKDB4MTIsMHgzNCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImV4dHFsIiwJCU9QUigweDEyLDB4MzYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImV4dHFsIiwJCU9QUkwoMHgxMiwweDM2KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAic2xsIiwJCU9QUigweDEyLDB4MzkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInNsbCIsCQlPUFJMKDB4MTIsMHgzOSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3FsIiwJCU9QUigweDEyLDB4M0IpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3FsIiwJCU9QUkwoMHgxMiwweDNCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAic3JhIiwJCU9QUigweDEyLDB4M0MpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInNyYSIsCQlPUFJMKDB4MTIsMHgzQyksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm1za3doIiwJCU9QUigweDEyLDB4NTIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm1za3doIiwJCU9QUkwoMHgxMiwweDUyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW5zd2giLAkJT1BSKDB4MTIsMHg1NyksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiaW5zd2giLAkJT1BSTCgweDEyLDB4NTcpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHR3aCIsCQlPUFIoMHgxMiwweDVBKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHR3aCIsCQlPUFJMKDB4MTIsMHg1QSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm1za2xoIiwJCU9QUigweDEyLDB4NjIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm1za2xoIiwJCU9QUkwoMHgxMiwweDYyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW5zbGgiLAkJT1BSKDB4MTIsMHg2NyksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiaW5zbGgiLAkJT1BSTCgweDEyLDB4NjcpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRsaCIsCQlPUFIoMHgxMiwweDZBKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRsaCIsCQlPUFJMKDB4MTIsMHg2QSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm1za3FoIiwJCU9QUigweDEyLDB4NzIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm1za3FoIiwJCU9QUkwoMHgxMiwweDcyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiaW5zcWgiLAkJT1BSKDB4MTIsMHg3NyksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiaW5zcWgiLAkJT1BSTCgweDEyLDB4NzcpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRxaCIsCQlPUFIoMHgxMiwweDdBKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRxaCIsCQlPUFJMKDB4MTIsMHg3QSksIEJBU0UsIEFSR19PUFJMIH0sCi0KLSAgeyAibXVsbCIsCQlPUFIoMHgxMywweDAwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtdWxsIiwJCU9QUkwoMHgxMywweDAwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXVscSIsCQlPUFIoMHgxMywweDIwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtdWxxIiwJCU9QUkwoMHgxMywweDIwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAidW11bGgiLAkJT1BSKDB4MTMsMHgzMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAidW11bGgiLAkJT1BSTCgweDEzLDB4MzApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtdWxsL3YiLAkJT1BSKDB4MTMsMHg0MCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXVsbC92IiwJCU9QUkwoMHgxMywweDQwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXVscS92IiwJCU9QUigweDEzLDB4NjApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm11bHEvdiIsCQlPUFJMKDB4MTMsMHg2MCksIEJBU0UsIEFSR19PUFJMIH0sCi0KLSAgeyAiaXRvZnMiLAkJRlAoMHgxNCwweDAwNCksIENJWCwgeyBSQSwgWkIsIEZDIH0gfSwKLSAgeyAic3FydGYvYyIsCQlGUCgweDE0LDB4MDBBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9jIiwJCUZQKDB4MTQsMHgwMEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgIml0b2ZmIiwJCUZQKDB4MTQsMHgwMTQpLCBDSVgsIHsgUkEsIFpCLCBGQyB9IH0sCi0gIHsgIml0b2Z0IiwJCUZQKDB4MTQsMHgwMjQpLCBDSVgsIHsgUkEsIFpCLCBGQyB9IH0sCi0gIHsgInNxcnRnL2MiLAkJRlAoMHgxNCwweDAyQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvYyIsCQlGUCgweDE0LDB4MDJCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9tIiwJCUZQKDB4MTQsMHgwNEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L20iLAkJRlAoMHgxNCwweDA2QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGYiLAkJRlAoMHgxNCwweDA4QSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMiLAkJRlAoMHgxNCwweDA4QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGciLAkJRlAoMHgxNCwweDBBQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQiLAkJRlAoMHgxNCwweDBBQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvZCIsCQlGUCgweDE0LDB4MENCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9kIiwJCUZQKDB4MTQsMHgwRUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3VjIiwJCUZQKDB4MTQsMHgxMEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3VjIiwJCUZQKDB4MTQsMHgxMEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnL3VjIiwJCUZQKDB4MTQsMHgxMkEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3VjIiwJCUZQKDB4MTQsMHgxMkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3VtIiwJCUZQKDB4MTQsMHgxNEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3VtIiwJCUZQKDB4MTQsMHgxNkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3UiLAkJRlAoMHgxNCwweDE4QSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvdSIsCQlGUCgweDE0LDB4MThCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy91IiwJCUZQKDB4MTQsMHgxQUEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3UiLAkJRlAoMHgxNCwweDFBQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvdWQiLAkJRlAoMHgxNCwweDFDQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvdWQiLAkJRlAoMHgxNCwweDFFQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGYvc2MiLAkJRlAoMHgxNCwweDQwQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGcvc2MiLAkJRlAoMHgxNCwweDQyQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGYvcyIsCQlGUCgweDE0LDB4NDhBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy9zIiwJCUZQKDB4MTQsMHg0QUEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3N1YyIsCUZQKDB4MTQsMHg1MEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1YyIsCUZQKDB4MTQsMHg1MEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnL3N1YyIsCUZQKDB4MTQsMHg1MkEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1YyIsCUZQKDB4MTQsMHg1MkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1bSIsCUZQKDB4MTQsMHg1NEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1bSIsCUZQKDB4MTQsMHg1NkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3N1IiwJCUZQKDB4MTQsMHg1OEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1IiwJCUZQKDB4MTQsMHg1OEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnL3N1IiwJCUZQKDB4MTQsMHg1QUEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1IiwJCUZQKDB4MTQsMHg1QUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1ZCIsCUZQKDB4MTQsMHg1Q0IpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1ZCIsCUZQKDB4MTQsMHg1RUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1aWMiLAlGUCgweDE0LDB4NzBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWljIiwJRlAoMHgxNCwweDcyQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VpbSIsCUZQKDB4MTQsMHg3NEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1aW0iLAlGUCgweDE0LDB4NzZCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWkiLAlGUCgweDE0LDB4NzhCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWkiLAlGUCgweDE0LDB4N0FCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWlkIiwJRlAoMHgxNCwweDdDQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VpZCIsCUZQKDB4MTQsMHg3RUIpLCBDSVgsIEFSR19GUFoxIH0sCi0KLSAgeyAiYWRkZi9jIiwJCUZQKDB4MTUsMHgwMDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi9jIiwJCUZQKDB4MTUsMHgwMDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi9jIiwJCUZQKDB4MTUsMHgwMDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zi9jIiwJCUZQKDB4MTUsMHgwMDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvYyIsCQlGUCgweDE1LDB4MDFFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZy9jIiwJCUZQKDB4MTUsMHgwMjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZy9jIiwJCUZQKDB4MTUsMHgwMjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy9jIiwJCUZQKDB4MTUsMHgwMjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zy9jIiwJCUZQKDB4MTUsMHgwMjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2YvYyIsCQlGUCgweDE1LDB4MDJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2QvYyIsCQlGUCgweDE1LDB4MDJEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3EvYyIsCQlGUCgweDE1LDB4MDJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWYvYyIsCQlGUCgweDE1LDB4MDNDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWcvYyIsCQlGUCgweDE1LDB4MDNFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZiIsCQlGUCgweDE1LDB4MDgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ2YiLAkJRlAoMHgxNSwweDA4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJmIiwJCUZQKDB4MTUsMHgwODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZiIsCQlGUCgweDE1LDB4MDgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYiLAkJRlAoMHgxNSwweDA4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZyIsCQlGUCgweDE1LDB4MDlFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZyIsCQlGUCgweDE1LDB4MEEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ2ciLAkJRlAoMHgxNSwweDBBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJnIiwJCUZQKDB4MTUsMHgwQTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZyIsCQlGUCgweDE1LDB4MEEyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmciLAkJRlAoMHgxNSwweDBBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXBnZXEiLAkJRlAoMHgxNSwweDBBNSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXBnbHQiLAkJRlAoMHgxNSwweDBBNiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXBnbGUiLAkJRlAoMHgxNSwweDBBNyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZiIsCQlGUCgweDE1LDB4MEFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2QiLAkJRlAoMHgxNSwweDBBRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxIiwJCUZQKDB4MTUsMHgwQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxZiIsCQlGUCgweDE1LDB4MEJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWciLAkJRlAoMHgxNSwweDBCRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvdWMiLAkJRlAoMHgxNSwweDEwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL3VjIiwJCUZQKDB4MTUsMHgxMDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi91YyIsCQlGUCgweDE1LDB4MTAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvdWMiLAkJRlAoMHgxNSwweDEwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy91YyIsCQlGUCgweDE1LDB4MTFFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZy91YyIsCQlGUCgweDE1LDB4MTIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmcvdWMiLAkJRlAoMHgxNSwweDEyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3VjIiwJCUZQKDB4MTUsMHgxMjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zy91YyIsCQlGUCgweDE1LDB4MTIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3VjIiwJCUZQKDB4MTUsMHgxMkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC91YyIsCQlGUCgweDE1LDB4MTJEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3EvdmMiLAkJRlAoMHgxNSwweDEyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvdSIsCQlGUCgweDE1LDB4MTgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvdSIsCQlGUCgweDE1LDB4MTgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvdSIsCQlGUCgweDE1LDB4MTgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvdSIsCQlGUCgweDE1LDB4MTgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL3UiLAkJRlAoMHgxNSwweDE5RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvdSIsCQlGUCgweDE1LDB4MUEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmcvdSIsCQlGUCgweDE1LDB4MUExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGcvdSIsCQlGUCgweDE1LDB4MUEyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvdSIsCQlGUCgweDE1LDB4MUEzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3UiLAkJRlAoMHgxNSwweDFBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL3UiLAkJRlAoMHgxNSwweDFBRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3YiLAkJRlAoMHgxNSwweDFBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvc2MiLAkJRlAoMHgxNSwweDQwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL3NjIiwJCUZQKDB4MTUsMHg0MDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi9zYyIsCQlGUCgweDE1LDB4NDAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvc2MiLAkJRlAoMHgxNSwweDQwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy9zYyIsCQlGUCgweDE1LDB4NDFFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZy9zYyIsCQlGUCgweDE1LDB4NDIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1Ymcvc2MiLAkJRlAoMHgxNSwweDQyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3NjIiwJCUZQKDB4MTUsMHg0MjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zy9zYyIsCQlGUCgweDE1LDB4NDIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3NjIiwJCUZQKDB4MTUsMHg0MkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zYyIsCQlGUCgweDE1LDB4NDJEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3Evc2MiLAkJRlAoMHgxNSwweDQyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvcyIsCQlGUCgweDE1LDB4NDgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ2YvcyIsCQlGUCgweDE1LDB4NDgxKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YmYvcyIsCQlGUCgweDE1LDB4NDgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvcyIsCQlGUCgweDE1LDB4NDgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvcyIsCQlGUCgweDE1LDB4NDgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL3MiLAkJRlAoMHgxNSwweDQ5RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvcyIsCQlGUCgweDE1LDB4NEEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ2cvcyIsCQlGUCgweDE1LDB4NEExKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YmcvcyIsCQlGUCgweDE1LDB4NEExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGcvcyIsCQlGUCgweDE1LDB4NEEyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvcyIsCQlGUCgweDE1LDB4NEEzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcGdlcS9zIiwJCUZQKDB4MTUsMHg0QTUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2x0L3MiLAkJRlAoMHgxNSwweDRBNiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXBnbGUvcyIsCQlGUCgweDE1LDB4NEE3KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3MiLAkJRlAoMHgxNSwweDRBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL3MiLAkJRlAoMHgxNSwweDRBRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3MiLAkJRlAoMHgxNSwweDRBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvc3VjIiwJCUZQKDB4MTUsMHg1MDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi9zdWMiLAkJRlAoMHgxNSwweDUwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3N1YyIsCQlGUCgweDE1LDB4NTAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvc3VjIiwJCUZQKDB4MTUsMHg1MDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvc3VjIiwJRlAoMHgxNSwweDUxRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvc3VjIiwJCUZQKDB4MTUsMHg1MjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZy9zdWMiLAkJRlAoMHgxNSwweDUyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3N1YyIsCQlGUCgweDE1LDB4NTIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvc3VjIiwJCUZQKDB4MTUsMHg1MjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2Yvc3VjIiwJRlAoMHgxNSwweDUyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL3N1YyIsCUZQKDB4MTUsMHg1MkQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS9zdmMiLAlGUCgweDE1LDB4NTJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZi9zdSIsCQlGUCgweDE1LDB4NTgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvc3UiLAkJRlAoMHgxNSwweDU4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3N1IiwJCUZQKDB4MTUsMHg1ODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zi9zdSIsCQlGUCgweDE1LDB4NTgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL3N1IiwJCUZQKDB4MTUsMHg1OUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3N1IiwJCUZQKDB4MTUsMHg1QTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZy9zdSIsCQlGUCgweDE1LDB4NUExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGcvc3UiLAkJRlAoMHgxNSwweDVBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3N1IiwJCUZQKDB4MTUsMHg1QTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2Yvc3UiLAkJRlAoMHgxNSwweDVBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL3N1IiwJCUZQKDB4MTUsMHg1QUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS9zdiIsCQlGUCgweDE1LDB4NUFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLQotICB7ICJhZGRzL2MiLAkJRlAoMHgxNiwweDAwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL2MiLAkJRlAoMHgxNiwweDAwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL2MiLAkJRlAoMHgxNiwweDAwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL2MiLAkJRlAoMHgxNiwweDAwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L2MiLAkJRlAoMHgxNiwweDAyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L2MiLAkJRlAoMHgxNiwweDAyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L2MiLAkJRlAoMHgxNiwweDAyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L2MiLAkJRlAoMHgxNiwweDAyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9jIiwJCUZQKDB4MTYsMHgwMkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9jIiwJCUZQKDB4MTYsMHgwMkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9jIiwJCUZQKDB4MTYsMHgwM0MpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9jIiwJCUZQKDB4MTYsMHgwM0UpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL20iLAkJRlAoMHgxNiwweDA0MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL20iLAkJRlAoMHgxNiwweDA0MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL20iLAkJRlAoMHgxNiwweDA0MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL20iLAkJRlAoMHgxNiwweDA0MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L20iLAkJRlAoMHgxNiwweDA2MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L20iLAkJRlAoMHgxNiwweDA2MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L20iLAkJRlAoMHgxNiwweDA2MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L20iLAkJRlAoMHgxNiwweDA2MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9tIiwJCUZQKDB4MTYsMHgwNkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9tIiwJCUZQKDB4MTYsMHgwNkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9tIiwJCUZQKDB4MTYsMHgwN0MpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9tIiwJCUZQKDB4MTYsMHgwN0UpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzIiwJCUZQKDB4MTYsMHgwODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVncyIsIAkJRlAoMHgxNiwweDA4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJzIiwJCUZQKDB4MTYsMHgwODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscyIsCQlGUCgweDE2LDB4MDgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMiLAkJRlAoMHgxNiwweDA4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0IiwJCUZQKDB4MTYsMHgwQTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVndCIsIAkJRlAoMHgxNiwweDBBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJ0IiwJCUZQKDB4MTYsMHgwQTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdCIsCQlGUCgweDE2LDB4MEEyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQiLAkJRlAoMHgxNiwweDBBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0dW4iLAkJRlAoMHgxNiwweDBBNCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0ZXEiLAkJRlAoMHgxNiwweDBBNSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0bHQiLAkJRlAoMHgxNiwweDBBNiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0bGUiLAkJRlAoMHgxNiwweDBBNyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cyIsCQlGUCgweDE2LDB4MEFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEiLAkJRlAoMHgxNiwweDBBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFzIiwJCUZQKDB4MTYsMHgwQkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdCIsCQlGUCgweDE2LDB4MEJFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9kIiwJCUZQKDB4MTYsMHgwQzApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9kIiwJCUZQKDB4MTYsMHgwQzEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9kIiwJCUZQKDB4MTYsMHgwQzIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9kIiwJCUZQKDB4MTYsMHgwQzMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9kIiwJCUZQKDB4MTYsMHgwRTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9kIiwJCUZQKDB4MTYsMHgwRTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9kIiwJCUZQKDB4MTYsMHgwRTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9kIiwJCUZQKDB4MTYsMHgwRTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvZCIsCQlGUCgweDE2LDB4MEVDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvZCIsCQlGUCgweDE2LDB4MEVGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvZCIsCQlGUCgweDE2LDB4MEZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvZCIsCQlGUCgweDE2LDB4MEZFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy91YyIsCQlGUCgweDE2LDB4MTAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvdWMiLAkJRlAoMHgxNiwweDEwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3VjIiwJCUZQKDB4MTYsMHgxMDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy91YyIsCQlGUCgweDE2LDB4MTAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvdWMiLAkJRlAoMHgxNiwweDEyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3VjIiwJCUZQKDB4MTYsMHgxMjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC91YyIsCQlGUCgweDE2LDB4MTIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvdWMiLAkJRlAoMHgxNiwweDEyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy91YyIsCQlGUCgweDE2LDB4MTJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvdmMiLAkJRlAoMHgxNiwweDEyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvdW0iLAkJRlAoMHgxNiwweDE0MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3VtIiwJCUZQKDB4MTYsMHgxNDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy91bSIsCQlGUCgweDE2LDB4MTQyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvdW0iLAkJRlAoMHgxNiwweDE0MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3VtIiwJCUZQKDB4MTYsMHgxNjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC91bSIsCQlGUCgweDE2LDB4MTYxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvdW0iLAkJRlAoMHgxNiwweDE2MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3VtIiwJCUZQKDB4MTYsMHgxNjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvdW0iLAkJRlAoMHgxNiwweDE2QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3ZtIiwJCUZQKDB4MTYsMHgxNkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3UiLAkJRlAoMHgxNiwweDE4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3UiLAkJRlAoMHgxNiwweDE4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3UiLAkJRlAoMHgxNiwweDE4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3UiLAkJRlAoMHgxNiwweDE4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3UiLAkJRlAoMHgxNiwweDFBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3UiLAkJRlAoMHgxNiwweDFBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3UiLAkJRlAoMHgxNiwweDFBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3UiLAkJRlAoMHgxNiwweDFBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy91IiwJCUZQKDB4MTYsMHgxQUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS92IiwJCUZQKDB4MTYsMHgxQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3VkIiwJCUZQKDB4MTYsMHgxQzApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy91ZCIsCQlGUCgweDE2LDB4MUMxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvdWQiLAkJRlAoMHgxNiwweDFDMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3VkIiwJCUZQKDB4MTYsMHgxQzMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC91ZCIsCQlGUCgweDE2LDB4MUUwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvdWQiLAkJRlAoMHgxNiwweDFFMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3VkIiwJCUZQKDB4MTYsMHgxRTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC91ZCIsCQlGUCgweDE2LDB4MUUzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3VkIiwJCUZQKDB4MTYsMHgxRUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS92ZCIsCQlGUCgweDE2LDB4MUVGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0c3QiLAkJRlAoMHgxNiwweDJBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VjIiwJCUZQKDB4MTYsMHg1MDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWMiLAkJRlAoMHgxNiwweDUwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1YyIsCQlGUCgweDE2LDB4NTAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VjIiwJCUZQKDB4MTYsMHg1MDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWMiLAkJRlAoMHgxNiwweDUyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1YyIsCQlGUCgweDE2LDB4NTIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VjIiwJCUZQKDB4MTYsMHg1MjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWMiLAkJRlAoMHgxNiwweDUyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWMiLAlGUCgweDE2LDB4NTJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZjIiwJRlAoMHgxNiwweDUyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VtIiwJCUZQKDB4MTYsMHg1NDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdW0iLAkJRlAoMHgxNiwweDU0MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1bSIsCQlGUCgweDE2LDB4NTQyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VtIiwJCUZQKDB4MTYsMHg1NDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdW0iLAkJRlAoMHgxNiwweDU2MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1bSIsCQlGUCgweDE2LDB4NTYxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VtIiwJCUZQKDB4MTYsMHg1NjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdW0iLAkJRlAoMHgxNiwweDU2MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdW0iLAlGUCgweDE2LDB4NTZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZtIiwJRlAoMHgxNiwweDU2RiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3UiLAkJRlAoMHgxNiwweDU4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdzL3N1IiwJCUZQKDB4MTYsMHg1ODEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3Vicy9zdSIsCQlGUCgweDE2LDB4NTgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3UiLAkJRlAoMHgxNiwweDU4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1IiwJCUZQKDB4MTYsMHg1ODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdSIsCQlGUCgweDE2LDB4NUEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3Qvc3UiLAkJRlAoMHgxNiwweDVBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJ0L3N1IiwJCUZQKDB4MTYsMHg1QTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9zdSIsCQlGUCgweDE2LDB4NUEyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3UiLAkJRlAoMHgxNiwweDVBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0dW4vc3UiLAlGUCgweDE2LDB4NUE0KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcHRlcS9zdSIsCUZQKDB4MTYsMHg1QTUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGx0L3N1IiwJRlAoMHgxNiwweDVBNiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0bGUvc3UiLAlGUCgweDE2LDB4NUE3KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3N1IiwJCUZQKDB4MTYsMHg1QUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9zdiIsCQlGUCgweDE2LDB4NUFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9zdWQiLAkJRlAoMHgxNiwweDVDMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3N1ZCIsCQlGUCgweDE2LDB4NUMxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VkIiwJCUZQKDB4MTYsMHg1QzIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdWQiLAkJRlAoMHgxNiwweDVDMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1ZCIsCQlGUCgweDE2LDB4NUUwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvc3VkIiwJCUZQKDB4MTYsMHg1RTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9zdWQiLAkJRlAoMHgxNiwweDVFMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1ZCIsCQlGUCgweDE2LDB4NUUzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3N1ZCIsCUZQKDB4MTYsMHg1RUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS9zdmQiLAlGUCgweDE2LDB4NUVGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0c3QvcyIsCQlGUCgweDE2LDB4NkFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9zdWljIiwJRlAoMHgxNiwweDcwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3N1aWMiLAlGUCgweDE2LDB4NzAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VpYyIsCUZQKDB4MTYsMHg3MDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdWljIiwJRlAoMHgxNiwweDcwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1aWMiLAlGUCgweDE2LDB4NzIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvc3VpYyIsCUZQKDB4MTYsMHg3MjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9zdWljIiwJRlAoMHgxNiwweDcyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1aWMiLAlGUCgweDE2LDB4NzIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3N1aWMiLAlGUCgweDE2LDB4NzJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZpYyIsCUZQKDB4MTYsMHg3MkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9zdWljIiwJRlAoMHgxNiwweDczQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0L3N1aWMiLAlGUCgweDE2LDB4NzNFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9zdWltIiwJRlAoMHgxNiwweDc0MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3N1aW0iLAlGUCgweDE2LDB4NzQxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VpbSIsCUZQKDB4MTYsMHg3NDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdWltIiwJRlAoMHgxNiwweDc0MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1aW0iLAlGUCgweDE2LDB4NzYwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvc3VpbSIsCUZQKDB4MTYsMHg3NjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9zdWltIiwJRlAoMHgxNiwweDc2MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1aW0iLAlGUCgweDE2LDB4NzYzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3N1aW0iLAlGUCgweDE2LDB4NzZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZpbSIsCUZQKDB4MTYsMHg3NkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9zdWltIiwJRlAoMHgxNiwweDc3QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0L3N1aW0iLAlGUCgweDE2LDB4NzdFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9zdWkiLAkJRlAoMHgxNiwweDc4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdzL3N1aSIsIAlGUCgweDE2LDB4NzgxKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YnMvc3VpIiwJCUZQKDB4MTYsMHg3ODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdWkiLAkJRlAoMHgxNiwweDc4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1aSIsCQlGUCgweDE2LDB4NzgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VpIiwJCUZQKDB4MTYsMHg3QTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVndC9zdWkiLCAJRlAoMHgxNiwweDdBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJ0L3N1aSIsCQlGUCgweDE2LDB4N0ExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpIiwJCUZQKDB4MTYsMHg3QTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWkiLAkJRlAoMHgxNiwweDdBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWkiLAlGUCgweDE2LDB4N0FDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZpIiwJRlAoMHgxNiwweDdBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFzL3N1aSIsCUZQKDB4MTYsMHg3QkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWkiLAlGUCgweDE2LDB4N0JFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9zdWlkIiwJRlAoMHgxNiwweDdDMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3N1aWQiLAlGUCgweDE2LDB4N0MxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VpZCIsCUZQKDB4MTYsMHg3QzIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdWlkIiwJRlAoMHgxNiwweDdDMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1aWQiLAlGUCgweDE2LDB4N0UwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvc3VpZCIsCUZQKDB4MTYsMHg3RTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9zdWlkIiwJRlAoMHgxNiwweDdFMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1aWQiLAlGUCgweDE2LDB4N0UzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3N1aWQiLAlGUCgweDE2LDB4N0VDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZpZCIsCUZQKDB4MTYsMHg3RUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9zdWlkIiwJRlAoMHgxNiwweDdGQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0L3N1aWQiLAlGUCgweDE2LDB4N0ZFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLQotICB7ICJjdnRscSIsCQlGUCgweDE3LDB4MDEwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiZm5vcCIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgeyBaQSwgWkIsIFpDIH0gfSwJLyogcHNldWRvICovCi0gIHsgImZjbHIiLAkJRlAoMHgxNywweDAyMCksIEJBU0UsIHsgWkEsIFpCLCBGQyB9IH0sCS8qIHBzZXVkbyAqLwotICB7ICJmYWJzIiwJCUZQKDB4MTcsMHgwMjApLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAiZm1vdiIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgeyBGQSwgUkJBLCBGQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJjcHlzIiwJCUZQKDB4MTcsMHgwMjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZm5lZyIsCQlGUCgweDE3LDB4MDIxKSwgQkFTRSwgeyBGQSwgUkJBLCBGQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJjcHlzbiIsCQlGUCgweDE3LDB4MDIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNweXNlIiwJCUZQKDB4MTcsMHgwMjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXRfZnBjciIsCQlGUCgweDE3LDB4MDI0KSwgQkFTRSwgeyBGQSwgUkJBLCBSQ0EgfSB9LAotICB7ICJtZl9mcGNyIiwJCUZQKDB4MTcsMHgwMjUpLCBCQVNFLCB7IEZBLCBSQkEsIFJDQSB9IH0sCi0gIHsgImZjbW92ZXEiLAkJRlAoMHgxNywweDAyQSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJmY21vdm5lIiwJCUZQKDB4MTcsMHgwMkIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZmNtb3ZsdCIsCQlGUCgweDE3LDB4MDJDKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZjbW92Z2UiLAkJRlAoMHgxNywweDAyRCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJmY21vdmxlIiwJCUZQKDB4MTcsMHgwMkUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZmNtb3ZndCIsCQlGUCgweDE3LDB4MDJGKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHFsIiwJCUZQKDB4MTcsMHgwMzApLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxbC92IiwJCUZQKDB4MTcsMHgxMzApLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxbC9zdiIsCQlGUCgweDE3LDB4NTMwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLQotICB7ICJ0cmFwYiIsCQlNRkMoMHgxOCwweDAwMDApLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJkcmFpbnQiLAkJTUZDKDB4MTgsMHgwMDAwKSwgQkFTRSwgQVJHX05PTkUgfSwJLyogYWxpYXMgKi8KLSAgeyAiZXhjYiIsCQlNRkMoMHgxOCwweDA0MDApLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJtYiIsCQlNRkMoMHgxOCwweDQwMDApLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJ3bWIiLAkJTUZDKDB4MTgsMHg0NDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiZmV0Y2giLAkJTUZDKDB4MTgsMHg4MDAwKSwgQkFTRSwgeyBaQSwgUFJCIH0gfSwKLSAgeyAiZmV0Y2hfbSIsCQlNRkMoMHgxOCwweEEwMDApLCBCQVNFLCB7IFpBLCBQUkIgfSB9LAotICB7ICJycGNjIiwJCU1GQygweDE4LDB4QzAwMCksIEJBU0UsIHsgUkEgfSB9LAotICB7ICJyYyIsCQlNRkMoMHgxOCwweEUwMDApLCBCQVNFLCB7IFJBIH0gfSwKLSAgeyAiZWNiIiwJCU1GQygweDE4LDB4RTgwMCksIEJBU0UsIHsgWkEsIFBSQiB9IH0sCS8qIGV2NTYgdW5hICovCi0gIHsgInJzIiwJCU1GQygweDE4LDB4RjAwMCksIEJBU0UsIHsgUkEgfSB9LAotICB7ICJ3aDY0IiwJCU1GQygweDE4LDB4RjgwMCksIEJBU0UsIHsgWkEsIFBSQiB9IH0sCS8qIGV2NTYgdW5hICovCi0KLSAgeyAiaHdfbWZwciIsCQlPUFIoMHgxOSwweDAwKSwgRVY0LCB7IFJBLCBSQkEsIEVWNEVYVEhXSU5ERVggfSB9LAotICB7ICJod19tZnByIiwJCU9QKDB4MTkpLCBPUF9NQVNLLCBFVjUsIHsgUkEsIFJCQSwgRVY1SFdJTkRFWCB9IH0sCi0gIHsgImh3X21mcHIiLAkJT1AoMHgxOSksIE9QX01BU0ssIEVWNiwgeyBSQSwgWkIsIEVWNkhXSU5ERVggfSB9LAotICB7ICJod19tZnByL2kiLAlPUFIoMHgxOSwweDAxKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9hIiwJT1BSKDB4MTksMHgwMiksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvYWkiLAlPUFIoMHgxOSwweDAzKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9wIiwJT1BSKDB4MTksMHgwNCksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvcGkiLAlPUFIoMHgxOSwweDA1KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9wYSIsCU9QUigweDE5LDB4MDYpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tZnByL3BhaSIsCU9QUigweDE5LDB4MDcpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJwYWwxOSIsCQlQQ0QoMHgxOSksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJqbXAiLAkJTUJSKDB4MUEsMCksIEJBU0UsIHsgUkEsIENQUkIsIEpNUEhJTlQgfSB9LAotICB7ICJqc3IiLAkJTUJSKDB4MUEsMSksIEJBU0UsIHsgUkEsIENQUkIsIEpNUEhJTlQgfSB9LAotICB7ICJyZXQiLAkJTUJSKDB4MUEsMiksIEJBU0UsIHsgUkEsIENQUkIsIFJFVEhJTlQgfSB9LAotICB7ICJqY3IiLAkJTUJSKDB4MUEsMyksIEJBU0UsIHsgUkEsIENQUkIsIFJFVEhJTlQgfSB9LCAvKiBhbGlhcyAqLwotICB7ICJqc3JfY29yb3V0aW5lIiwJTUJSKDB4MUEsMyksIEJBU0UsIHsgUkEsIENQUkIsIFJFVEhJTlQgfSB9LAotCi0gIHsgImh3X2xkbCIsCQlFVjRIV01FTSgweDFCLDB4MCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbCIsCQlFVjVIV01FTSgweDFCLDB4MDApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwiLAkJRVY2SFdNRU0oMHgxQiwweDgpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvYSIsCQlFVjRIV01FTSgweDFCLDB4NCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9hIiwJCUVWNUhXTUVNKDB4MUIsMHgxMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hIiwJCUVWNkhXTUVNKDB4MUIsMHhDKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2FsIiwJRVY1SFdNRU0oMHgxQiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2FyIiwJRVY0SFdNRU0oMHgxQiwweDYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvYXYiLAlFVjVIV01FTSgweDFCLDB4MTIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXZsIiwJRVY1SFdNRU0oMHgxQiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F3IiwJRVY1SFdNRU0oMHgxQiwweDE4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F3bCIsCUVWNUhXTUVNKDB4MUIsMHgxOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hd3YiLAlFVjVIV01FTSgweDFCLDB4MWEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgxYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wIiwJCUVWNEhXTUVNKDB4MUIsMHg4KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3AiLAkJRVY1SFdNRU0oMHgxQiwweDIwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3AiLAkJRVY2SFdNRU0oMHgxQiwweDApLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvcGEiLAlFVjRIV01FTSgweDFCLDB4QyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYSIsCUVWNUhXTUVNKDB4MUIsMHgzMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYWwiLAlFVjVIV01FTSgweDFCLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGFyIiwJRVY0SFdNRU0oMHgxQiwweEUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDMyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhdmwiLAlFVjVIV01FTSgweDFCLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDM4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3Bhd2wiLAlFVjVIV01FTSgweDFCLDB4MzkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgzYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wbCIsCUVWNUhXTUVNKDB4MUIsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wciIsCUVWNEhXTUVNKDB4MUIsMHhBKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B2IiwJRVY1SFdNRU0oMHgxQiwweDIyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B2bCIsCUVWNUhXTUVNKDB4MUIsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wdyIsCUVWNUhXTUVNKDB4MUIsMHgyOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wd2wiLAlFVjVIV01FTSgweDFCLDB4MjkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B3dmwiLAlFVjVIV01FTSgweDFCLDB4MmIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvciIsCQlFVjRIV01FTSgweDFCLDB4MiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC92IiwJCUVWNUhXTUVNKDB4MUIsMHgwMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC92IiwJCUVWNkhXTUVNKDB4MUIsMHg0KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3ZsIiwJRVY1SFdNRU0oMHgxQiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3ciLAkJRVY1SFdNRU0oMHgxQiwweDA4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3ciLAkJRVY2SFdNRU0oMHgxQiwweEEpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvd2EiLAlFVjZIV01FTSgweDFCLDB4RSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbC93bCIsCUVWNUhXTUVNKDB4MUIsMHgwOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC93diIsCUVWNUhXTUVNKDB4MUIsMHgwYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC93dmwiLAlFVjVIV01FTSgweDFCLDB4MGIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbCIsCQlFVjVIV01FTSgweDFCLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9hIiwJRVY1SFdNRU0oMHgxQiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvYXYiLAlFVjVIV01FTSgweDFCLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9hdyIsCUVWNUhXTUVNKDB4MUIsMHgxOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3AiLAlFVjVIV01FTSgweDFCLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wIiwJRVY2SFdNRU0oMHgxQiwweDIpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGxfbC9wYSIsCUVWNUhXTUVNKDB4MUIsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3BhdiIsCUVWNUhXTUVNKDB4MUIsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3BhdyIsCUVWNUhXTUVNKDB4MUIsMHgzOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3Bhd3YiLAlFVjVIV01FTSgweDFCLDB4M2IpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wdiIsCUVWNUhXTUVNKDB4MUIsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3B3IiwJRVY1SFdNRU0oMHgxQiwweDI5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvdiIsCUVWNUhXTUVNKDB4MUIsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3ciLAlFVjVIV01FTSgweDFCLDB4MDkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC93diIsCUVWNUhXTUVNKDB4MUIsMHgwYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcSIsCQlFVjRIV01FTSgweDFCLDB4MSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcSIsCQlFVjVIV01FTSgweDFCLDB4MDQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEiLAkJRVY2SFdNRU0oMHgxQiwweDkpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvYSIsCQlFVjRIV01FTSgweDFCLDB4NSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9hIiwJCUVWNUhXTUVNKDB4MUIsMHgxNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hIiwJCUVWNkhXTUVNKDB4MUIsMHhEKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2FsIiwJRVY1SFdNRU0oMHgxQiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2FyIiwJRVY0SFdNRU0oMHgxQiwweDcpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvYXYiLAlFVjVIV01FTSgweDFCLDB4MTYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXZsIiwJRVY1SFdNRU0oMHgxQiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F3IiwJRVY1SFdNRU0oMHgxQiwweDFjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F3bCIsCUVWNUhXTUVNKDB4MUIsMHgxZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hd3YiLAlFVjVIV01FTSgweDFCLDB4MWUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgxZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wIiwJCUVWNEhXTUVNKDB4MUIsMHg5KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3AiLAkJRVY1SFdNRU0oMHgxQiwweDI0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3AiLAkJRVY2SFdNRU0oMHgxQiwweDEpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvcGEiLAlFVjRIV01FTSgweDFCLDB4RCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYSIsCUVWNUhXTUVNKDB4MUIsMHgzNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYWwiLAlFVjVIV01FTSgweDFCLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGFyIiwJRVY0SFdNRU0oMHgxQiwweEYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDM2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhdmwiLAlFVjVIV01FTSgweDFCLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDNjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3Bhd2wiLAlFVjVIV01FTSgweDFCLDB4M2QpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgzZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wbCIsCUVWNUhXTUVNKDB4MUIsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wciIsCUVWNEhXTUVNKDB4MUIsMHhCKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B2IiwJRVY1SFdNRU0oMHgxQiwweDI2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B2bCIsCUVWNUhXTUVNKDB4MUIsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wdyIsCUVWNUhXTUVNKDB4MUIsMHgyYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wd2wiLAlFVjVIV01FTSgweDFCLDB4MmQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B3dmwiLAlFVjVIV01FTSgweDFCLDB4MmYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvciIsCQlFVjRIV01FTSgweDFCLDB4MyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS92IiwJCUVWNUhXTUVNKDB4MUIsMHgwNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS92IiwJCUVWNkhXTUVNKDB4MUIsMHg1KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3ZsIiwJRVY1SFdNRU0oMHgxQiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3ciLAkJRVY1SFdNRU0oMHgxQiwweDBjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3ciLAkJRVY2SFdNRU0oMHgxQiwweEIpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvd2EiLAlFVjZIV01FTSgweDFCLDB4RiksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcS93bCIsCUVWNUhXTUVNKDB4MUIsMHgwZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS93diIsCUVWNUhXTUVNKDB4MUIsMHgwZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS93dmwiLAlFVjVIV01FTSgweDFCLDB4MGYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbCIsCQlFVjVIV01FTSgweDFCLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9hIiwJRVY1SFdNRU0oMHgxQiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvYXYiLAlFVjVIV01FTSgweDFCLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9hdyIsCUVWNUhXTUVNKDB4MUIsMHgxZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3AiLAlFVjVIV01FTSgweDFCLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wIiwJRVY2SFdNRU0oMHgxQiwweDMpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHFfbC9wYSIsCUVWNUhXTUVNKDB4MUIsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3BhdiIsCUVWNUhXTUVNKDB4MUIsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3BhdyIsCUVWNUhXTUVNKDB4MUIsMHgzZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3Bhd3YiLAlFVjVIV01FTSgweDFCLDB4M2YpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wdiIsCUVWNUhXTUVNKDB4MUIsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3B3IiwJRVY1SFdNRU0oMHgxQiwweDJkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvdiIsCUVWNUhXTUVNKDB4MUIsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3ciLAlFVjVIV01FTSgweDFCLDB4MGQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC93diIsCUVWNUhXTUVNKDB4MUIsMHgwZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkIiwJCUVWNEhXTUVNKDB4MUIsMHgwKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQiLAkJRVY1SFdNRU0oMHgxQiwweDAwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYSIsCQlFVjRIV01FTSgweDFCLDB4NCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL2EiLAkJRVY1SFdNRU0oMHgxQiwweDEwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYWwiLAkJRVY1SFdNRU0oMHgxQiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXEiLAkJRVY0SFdNRU0oMHgxQiwweDUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9hcSIsCQlFVjVIV01FTSgweDFCLDB4MTQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hcWwiLAlFVjVIV01FTSgweDFCLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hcXYiLAlFVjVIV01FTSgweDFCLDB4MTYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hcXZsIiwJRVY1SFdNRU0oMHgxQiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXIiLAkJRVY0SFdNRU0oMHgxQiwweDYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9hcnEiLAlFVjRIV01FTSgweDFCLDB4NyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL2F2IiwJCUVWNUhXTUVNKDB4MUIsMHgxMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F2bCIsCUVWNUhXTUVNKDB4MUIsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3IiwJCUVWNUhXTUVNKDB4MUIsMHgxOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3bCIsCUVWNUhXTUVNKDB4MUIsMHgxOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3cSIsCUVWNUhXTUVNKDB4MUIsMHgxYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3cWwiLAlFVjVIV01FTSgweDFCLDB4MWQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3F2IiwJRVY1SFdNRU0oMHgxQiwweDFlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXdxdmwiLAlFVjVIV01FTSgweDFCLDB4MWYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3YiLAlFVjVIV01FTSgweDFCLDB4MWEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDFiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvbCIsCQlFVjVIV01FTSgweDFCLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wIiwJCUVWNEhXTUVNKDB4MUIsMHg4KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcCIsCQlFVjVIV01FTSgweDFCLDB4MjApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYSIsCQlFVjRIV01FTSgweDFCLDB4QyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3BhIiwJCUVWNUhXTUVNKDB4MUIsMHgzMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhbCIsCUVWNUhXTUVNKDB4MUIsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcSIsCUVWNEhXTUVNKDB4MUIsMHhEKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFxIiwJRVY1SFdNRU0oMHgxQiwweDM0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFxbCIsCUVWNUhXTUVNKDB4MUIsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcXYiLAlFVjVIV01FTSgweDFCLDB4MzYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXF2bCIsCUVWNUhXTUVNKDB4MUIsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhciIsCUVWNEhXTUVNKDB4MUIsMHhFKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFycSIsCUVWNEhXTUVNKDB4MUIsMHhGKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDMyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF2bCIsCUVWNUhXTUVNKDB4MUIsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhdyIsCUVWNUhXTUVNKDB4MUIsMHgzOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd2wiLAlFVjVIV01FTSgweDFCLDB4MzkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXdxIiwJRVY1SFdNRU0oMHgxQiwweDNjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3cWwiLAlFVjVIV01FTSgweDFCLDB4M2QpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXdxdiIsCUVWNUhXTUVNKDB4MUIsMHgzZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3F2bCIsCUVWNUhXTUVNKDB4MUIsMHgzZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3YiLAlFVjVIV01FTSgweDFCLDB4M2EpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgzYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BsIiwJCUVWNUhXTUVNKDB4MUIsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BxIiwJCUVWNEhXTUVNKDB4MUIsMHg5KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHEiLAkJRVY1SFdNRU0oMHgxQiwweDI0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHFsIiwJRVY1SFdNRU0oMHgxQiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHF2IiwJRVY1SFdNRU0oMHgxQiwweDI2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHF2bCIsCUVWNUhXTUVNKDB4MUIsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3ByIiwJCUVWNEhXTUVNKDB4MUIsMHhBKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHJxIiwJRVY0SFdNRU0oMHgxQiwweEIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wdiIsCQlFVjVIV01FTSgweDFCLDB4MjIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wdmwiLAlFVjVIV01FTSgweDFCLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wdyIsCQlFVjVIV01FTSgweDFCLDB4MjgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd2wiLAlFVjVIV01FTSgweDFCLDB4MjkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3EiLAlFVjVIV01FTSgweDFCLDB4MmMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3FsIiwJRVY1SFdNRU0oMHgxQiwweDJkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHdxdiIsCUVWNUhXTUVNKDB4MUIsMHgyZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3cXZsIiwJRVY1SFdNRU0oMHgxQiwweDJmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHd2bCIsCUVWNUhXTUVNKDB4MUIsMHgyYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3EiLAkJRVY0SFdNRU0oMHgxQiwweDEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9xIiwJCUVWNUhXTUVNKDB4MUIsMHgwNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3FsIiwJCUVWNUhXTUVNKDB4MUIsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3F2IiwJCUVWNUhXTUVNKDB4MUIsMHgwNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3F2bCIsCUVWNUhXTUVNKDB4MUIsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3IiLAkJRVY0SFdNRU0oMHgxQiwweDIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9ycSIsCQlFVjRIV01FTSgweDFCLDB4MyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3YiLAkJRVY1SFdNRU0oMHgxQiwweDAyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvdmwiLAkJRVY1SFdNRU0oMHgxQiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvdyIsCQlFVjVIV01FTSgweDFCLDB4MDgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93bCIsCQlFVjVIV01FTSgweDFCLDB4MDkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93cSIsCQlFVjVIV01FTSgweDFCLDB4MGMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93cWwiLAlFVjVIV01FTSgweDFCLDB4MGQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93cXYiLAlFVjVIV01FTSgweDFCLDB4MGUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93cXZsIiwJRVY1SFdNRU0oMHgxQiwweDBmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3YiLAkJRVY1SFdNRU0oMHgxQiwweDBhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDBiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAicGFsMWIiLAkJUENEKDB4MUIpLCBCQVNFLCBBUkdfUENEIH0sCi0KLSAgeyAic2V4dGIiLAkJT1BSKDB4MUMsIDB4MDApLCBCV1gsIEFSR19PUFJaMSB9LAotICB7ICJzZXh0dyIsCQlPUFIoMHgxQywgMHgwMSksIEJXWCwgQVJHX09QUloxIH0sCi0gIHsgImN0cG9wIiwJCU9QUigweDFDLCAweDMwKSwgQ0lYLCBBUkdfT1BSWjEgfSwKLSAgeyAicGVyciIsCQlPUFIoMHgxQywgMHgzMSksIE1BWCwgQVJHX09QUiB9LAotICB7ICJjdGx6IiwJCU9QUigweDFDLCAweDMyKSwgQ0lYLCBBUkdfT1BSWjEgfSwKLSAgeyAiY3R0eiIsCQlPUFIoMHgxQywgMHgzMyksIENJWCwgQVJHX09QUloxIH0sCi0gIHsgInVucGtidyIsCQlPUFIoMHgxQywgMHgzNCksIE1BWCwgQVJHX09QUloxIH0sCi0gIHsgInVucGtibCIsCQlPUFIoMHgxQywgMHgzNSksIE1BWCwgQVJHX09QUloxIH0sCi0gIHsgInBrd2IiLAkJT1BSKDB4MUMsIDB4MzYpLCBNQVgsIEFSR19PUFJaMSB9LAotICB7ICJwa2xiIiwJCU9QUigweDFDLCAweDM3KSwgTUFYLCBBUkdfT1BSWjEgfSwKLSAgeyAibWluc2I4IiwgCQlPUFIoMHgxQywgMHgzOCksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtaW5zYjgiLCAJCU9QUkwoMHgxQywgMHgzOCksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWluc3c0IiwgCQlPUFIoMHgxQywgMHgzOSksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtaW5zdzQiLCAJCU9QUkwoMHgxQywgMHgzOSksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWludWI4IiwgCQlPUFIoMHgxQywgMHgzQSksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtaW51YjgiLCAJCU9QUkwoMHgxQywgMHgzQSksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWludXc0IiwgCQlPUFIoMHgxQywgMHgzQiksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtaW51dzQiLCAJCU9QUkwoMHgxQywgMHgzQiksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWF4dWI4IiwJCU9QUigweDFDLCAweDNDKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1heHViOCIsCQlPUFJMKDB4MUMsIDB4M0MpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1heHV3NCIsCQlPUFIoMHgxQywgMHgzRCksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtYXh1dzQiLAkJT1BSTCgweDFDLCAweDNEKSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtYXhzYjgiLAkJT1BSKDB4MUMsIDB4M0UpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWF4c2I4IiwJCU9QUkwoMHgxQywgMHgzRSksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWF4c3c0IiwJCU9QUigweDFDLCAweDNGKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1heHN3NCIsCQlPUFJMKDB4MUMsIDB4M0YpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgImZ0b2l0IiwJCUZQKDB4MUMsIDB4NzApLCBDSVgsIHsgRkEsIFpCLCBSQyB9IH0sCi0gIHsgImZ0b2lzIiwJCUZQKDB4MUMsIDB4NzgpLCBDSVgsIHsgRkEsIFpCLCBSQyB9IH0sCi0KLSAgeyAiaHdfbXRwciIsCQlPUFIoMHgxRCwweDAwKSwgRVY0LCB7IFJBLCBSQkEsIEVWNEVYVEhXSU5ERVggfSB9LAotICB7ICJod19tdHByIiwJCU9QKDB4MUQpLCBPUF9NQVNLLCBFVjUsIHsgUkEsIFJCQSwgRVY1SFdJTkRFWCB9IH0sCi0gIHsgImh3X210cHIiLAkJT1AoMHgxRCksIE9QX01BU0ssIEVWNiwgeyBaQSwgUkIsIEVWNkhXSU5ERVggfSB9LAotICB7ICJod19tdHByL2kiLCAJT1BSKDB4MUQsMHgwMSksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvYSIsIAlPUFIoMHgxRCwweDAyKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9haSIsCU9QUigweDFELDB4MDMpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL3AiLCAJT1BSKDB4MUQsMHgwNCksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvcGkiLAlPUFIoMHgxRCwweDA1KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9wYSIsCU9QUigweDFELDB4MDYpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL3BhaSIsCU9QUigweDFELDB4MDcpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJwYWwxZCIsCQlQQ0QoMHgxRCksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJod19yZWkiLAkJU1BDRCgweDFFLDB4M0ZGODAwMCksIEVWNHxFVjUsIEFSR19OT05FIH0sCi0gIHsgImh3X3JlaV9zdGFsbCIsCVNQQ0QoMHgxRSwweDNGRkMwMDApLCBFVjUsIEFSR19OT05FIH0sCi0gIHsgImh3X2ptcCIsIAkJRVY2SFdNQlIoMHgxRSwweDApLCBFVjYsIHsgWkEsIFBSQiwgRVY2SFdKTVBISU5UIH0gfSwKLSAgeyAiaHdfanNyIiwgCQlFVjZIV01CUigweDFFLDB4MiksIEVWNiwgeyBaQSwgUFJCLCBFVjZIV0pNUEhJTlQgfSB9LAotICB7ICJod19yZXQiLCAJCUVWNkhXTUJSKDB4MUUsMHg0KSwgRVY2LCB7IFpBLCBQUkIgfSB9LAotICB7ICJod19qY3IiLCAJCUVWNkhXTUJSKDB4MUUsMHg2KSwgRVY2LCB7IFpBLCBQUkIgfSB9LAotICB7ICJod19jb3JvdXRpbmUiLAlFVjZIV01CUigweDFFLDB4NiksIEVWNiwgeyBaQSwgUFJCIH0gfSwgLyogYWxpYXMgKi8KLSAgeyAiaHdfam1wL3N0YWxsIiwJRVY2SFdNQlIoMHgxRSwweDEpLCBFVjYsIHsgWkEsIFBSQiwgRVY2SFdKTVBISU5UIH0gfSwKLSAgeyAiaHdfanNyL3N0YWxsIiwgCUVWNkhXTUJSKDB4MUUsMHgzKSwgRVY2LCB7IFpBLCBQUkIsIEVWNkhXSk1QSElOVCB9IH0sCi0gIHsgImh3X3JldC9zdGFsbCIsCUVWNkhXTUJSKDB4MUUsMHg1KSwgRVY2LCB7IFpBLCBQUkIgfSB9LAotICB7ICJod19qY3Ivc3RhbGwiLCAJRVY2SFdNQlIoMHgxRSwweDcpLCBFVjYsIHsgWkEsIFBSQiB9IH0sCi0gIHsgImh3X2Nvcm91dGluZS9zdGFsbCIsIEVWNkhXTUJSKDB4MUUsMHg3KSwgRVY2LCB7IFpBLCBQUkIgfSB9LCAvKiBhbGlhcyAqLwotICB7ICJwYWwxZSIsCQlQQ0QoMHgxRSksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJod19zdGwiLAkJRVY0SFdNRU0oMHgxRiwweDApLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwiLAkJRVY1SFdNRU0oMHgxRiwweDAwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsIiwJCUVWNkhXTUVNKDB4MUYsMHg0KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwgLyogPz8/IDggKi8KLSAgeyAiaHdfc3RsL2EiLAkJRVY0SFdNRU0oMHgxRiwweDQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwvYSIsCQlFVjVIV01FTSgweDFGLDB4MTApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvYSIsCQlFVjZIV01FTSgweDFGLDB4QyksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0bC9hYyIsCUVWNUhXTUVNKDB4MUYsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9hciIsCUVWNEhXTUVNKDB4MUYsMHg2KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2F2IiwJRVY1SFdNRU0oMHgxRiwweDEyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2F2YyIsCUVWNUhXTUVNKDB4MUYsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9jIiwJCUVWNUhXTUVNKDB4MUYsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wIiwJCUVWNEhXTUVNKDB4MUYsMHg4KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3AiLAkJRVY1SFdNRU0oMHgxRiwweDIwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3AiLAkJRVY2SFdNRU0oMHgxRiwweDApLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdGwvcGEiLAlFVjRIV01FTSgweDFGLDB4QyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYSIsCUVWNUhXTUVNKDB4MUYsMHgzMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYWMiLAlFVjVIV01FTSgweDFGLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDMyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3BhdmMiLAlFVjVIV01FTSgweDFGLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcGMiLAlFVjVIV01FTSgweDFGLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcHIiLAlFVjRIV01FTSgweDFGLDB4QSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC9wdiIsCUVWNUhXTUVNKDB4MUYsMHgyMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wdmMiLAlFVjVIV01FTSgweDFGLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvciIsCQlFVjRIV01FTSgweDFGLDB4MiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC92IiwJCUVWNUhXTUVNKDB4MUYsMHgwMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC92YyIsCUVWNUhXTUVNKDB4MUYsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jIiwJCUVWNUhXTUVNKDB4MUYsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL2EiLAlFVjVIV01FTSgweDFGLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9hdiIsCUVWNUhXTUVNKDB4MUYsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3AiLAlFVjVIV01FTSgweDFGLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9wIiwJRVY2SFdNRU0oMHgxRiwweDIpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdGxfYy9wYSIsCUVWNUhXTUVNKDB4MUYsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3BhdiIsCUVWNUhXTUVNKDB4MUYsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3B2IiwJRVY1SFdNRU0oMHgxRiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvdiIsCUVWNUhXTUVNKDB4MUYsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cSIsCQlFVjRIV01FTSgweDFGLDB4MSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cSIsCQlFVjVIV01FTSgweDFGLDB4MDQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEiLAkJRVY2SFdNRU0oMHgxRiwweDUpLCBFVjYsIEFSR19FVjZIV01FTSB9LCAvKiA/Pz8gOSAqLwotICB7ICJod19zdHEvYSIsCQlFVjRIV01FTSgweDFGLDB4NSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9hIiwJCUVWNUhXTUVNKDB4MUYsMHgxNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9hIiwJCUVWNkhXTUVNKDB4MUYsMHhEKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2FjIiwJRVY1SFdNRU0oMHgxRiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2FyIiwJRVY0SFdNRU0oMHgxRiwweDcpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvYXYiLAlFVjVIV01FTSgweDFGLDB4MTYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvYXZjIiwJRVY1SFdNRU0oMHgxRiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2MiLAkJRVY1SFdNRU0oMHgxRiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3AiLAkJRVY0SFdNRU0oMHgxRiwweDkpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvcCIsCQlFVjVIV01FTSgweDFGLDB4MjQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcCIsCQlFVjZIV01FTSgweDFGLDB4MSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYSIsCUVWNEhXTUVNKDB4MUYsMHhEKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhIiwJRVY1SFdNRU0oMHgxRiwweDM0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhYyIsCUVWNUhXTUVNKDB4MUYsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYXIiLAlFVjRIV01FTSgweDFGLDB4RSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYXIiLAlFVjRIV01FTSgweDFGLDB4RiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcGF2YyIsCUVWNUhXTUVNKDB4MUYsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYyIsCUVWNUhXTUVNKDB4MUYsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wciIsCUVWNEhXTUVNKDB4MUYsMHhCKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3B2IiwJRVY1SFdNRU0oMHgxRiwweDI2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3B2YyIsCUVWNUhXTUVNKDB4MUYsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9yIiwJCUVWNEhXTUVNKDB4MUYsMHgzKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3YiLAkJRVY1SFdNRU0oMHgxRiwweDA2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3ZjIiwJRVY1SFdNRU0oMHgxRiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MiLAkJRVY1SFdNRU0oMHgxRiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvYSIsCUVWNUhXTUVNKDB4MUYsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL2F2IiwJRVY1SFdNRU0oMHgxRiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvcCIsCUVWNUhXTUVNKDB4MUYsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3AiLAlFVjZIV01FTSgweDFGLDB4MyksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3BhIiwJRVY1SFdNRU0oMHgxRiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvcHYiLAlFVjVIV01FTSgweDFGLDB4MjcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy92IiwJRVY1SFdNRU0oMHgxRiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QiLAkJRVY0SFdNRU0oMHgxRiwweDApLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdCIsCQlFVjVIV01FTSgweDFGLDB4MDApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hIiwJCUVWNEhXTUVNKDB4MUYsMHg0KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvYSIsCQlFVjVIV01FTSgweDFGLDB4MTApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hYyIsCQlFVjVIV01FTSgweDFGLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hcSIsCQlFVjRIV01FTSgweDFGLDB4NSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L2FxIiwJCUVWNUhXTUVNKDB4MUYsMHgxNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FxYyIsCUVWNUhXTUVNKDB4MUYsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FxdiIsCUVWNUhXTUVNKDB4MUYsMHgxNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FxdmMiLAlFVjVIV01FTSgweDFGLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hciIsCQlFVjRIV01FTSgweDFGLDB4NiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L2FycSIsCUVWNEhXTUVNKDB4MUYsMHg3KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXYiLAkJRVY1SFdNRU0oMHgxRiwweDEyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXZjIiwJRVY1SFdNRU0oMHgxRiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYyIsCQlFVjVIV01FTSgweDFGLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wIiwJCUVWNEhXTUVNKDB4MUYsMHg4KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcCIsCQlFVjVIV01FTSgweDFGLDB4MjApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYSIsCQlFVjRIV01FTSgweDFGLDB4QyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3BhIiwJCUVWNUhXTUVNKDB4MUYsMHgzMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhYyIsCUVWNUhXTUVNKDB4MUYsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcSIsCUVWNEhXTUVNKDB4MUYsMHhEKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFxIiwJRVY1SFdNRU0oMHgxRiwweDM0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFxYyIsCUVWNUhXTUVNKDB4MUYsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcXYiLAlFVjVIV01FTSgweDFGLDB4MzYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYXF2YyIsCUVWNUhXTUVNKDB4MUYsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhciIsCUVWNEhXTUVNKDB4MUYsMHhFKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFycSIsCUVWNEhXTUVNKDB4MUYsMHhGKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDMyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGF2YyIsCUVWNUhXTUVNKDB4MUYsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BjIiwJCUVWNUhXTUVNKDB4MUYsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BxIiwJCUVWNEhXTUVNKDB4MUYsMHg5KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHEiLAkJRVY1SFdNRU0oMHgxRiwweDI0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHFjIiwJRVY1SFdNRU0oMHgxRiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHF2IiwJRVY1SFdNRU0oMHgxRiwweDI2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHF2YyIsCUVWNUhXTUVNKDB4MUYsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3ByIiwJCUVWNEhXTUVNKDB4MUYsMHhBKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHJxIiwJRVY0SFdNRU0oMHgxRiwweEIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wdiIsCQlFVjVIV01FTSgweDFGLDB4MjIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wdmMiLAlFVjVIV01FTSgweDFGLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9xIiwJCUVWNEhXTUVNKDB4MUYsMHgxKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcSIsCQlFVjVIV01FTSgweDFGLDB4MDQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9xYyIsCQlFVjVIV01FTSgweDFGLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9xdiIsCQlFVjVIV01FTSgweDFGLDB4MDYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9xdmMiLAlFVjVIV01FTSgweDFGLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9yIiwJCUVWNEhXTUVNKDB4MUYsMHgyKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvdiIsCQlFVjVIV01FTSgweDFGLDB4MDIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC92YyIsCQlFVjVIV01FTSgweDFGLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJwYWwxZiIsCQlQQ0QoMHgxRiksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJsZGYiLAkJTUVNKDB4MjApLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJsZGciLAkJTUVNKDB4MjEpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJsZHMiLAkJTUVNKDB4MjIpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJsZHQiLAkJTUVNKDB4MjMpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJzdGYiLAkJTUVNKDB4MjQpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJzdGciLAkJTUVNKDB4MjUpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJzdHMiLAkJTUVNKDB4MjYpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJzdHQiLAkJTUVNKDB4MjcpLCBCQVNFLCBBUkdfRk1FTSB9LAotCi0gIHsgImxkbCIsCQlNRU0oMHgyOCksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAibGRxIiwJCU1FTSgweDI5KSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJsZGxfbCIsCQlNRU0oMHgyQSksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAibGRxX2wiLAkJTUVNKDB4MkIpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgInN0bCIsCQlNRU0oMHgyQyksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAic3RxIiwJCU1FTSgweDJEKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJzdGxfYyIsCQlNRU0oMHgyRSksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAic3RxX2MiLAkJTUVNKDB4MkYpLCBCQVNFLCBBUkdfTUVNIH0sCi0KLSAgeyAiYnIiLAkJQlJBKDB4MzApLCBCQVNFLCB7IFpBLCBCRElTUCB9IH0sCS8qIHBzZXVkbyAqLwotICB7ICJiciIsCQlCUkEoMHgzMCksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiZmJlcSIsCQlCUkEoMHgzMSksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImZibHQiLAkJQlJBKDB4MzIpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJmYmxlIiwJCUJSQSgweDMzKSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiYnNyIiwJCUJSQSgweDM0KSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJmYm5lIiwJCUJSQSgweDM1KSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiZmJnZSIsCQlCUkEoMHgzNiksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImZiZ3QiLAkJQlJBKDB4MzcpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJibGJjIiwJCUJSQSgweDM4KSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJiZXEiLAkJQlJBKDB4MzkpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJsdCIsCQlCUkEoMHgzQSksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmxlIiwJCUJSQSgweDNCKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJibGJzIiwJCUJSQSgweDNDKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJibmUiLAkJQlJBKDB4M0QpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJnZSIsCQlCUkEoMHgzRSksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmd0IiwJCUJSQSgweDNGKSwgQkFTRSwgQVJHX0JSQSB9LAotfTsKLQotY29uc3QgdW5zaWduZWQgYWxwaGFfbnVtX29wY29kZXMgPSBzaXplb2YoYWxwaGFfb3Bjb2Rlcykvc2l6ZW9mKCphbHBoYV9vcGNvZGVzKTsKZGlmZiAtLWdpdCBhL29wY29kZXMvYXJjLWRpcy5jIGIvb3Bjb2Rlcy9hcmMtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMmIwN2IuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hcmMtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gcHJpbnRpbmcgY29kZSBmb3IgdGhlIEFSQy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2FyYy5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvYXJjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9hcmNfYmFzZV9saXR0bGUgUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgaW50IHByaW50X2luc25fYXJjX2Jhc2VfYmlnIFBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgaW50IHByaW50X2luc24gUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqLCBpbnQsIGludCkpOwotCi0vKiBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uICg0IG9yIDggZm9yIHRoZSBBUkMpLiAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuIChwYywgaW5mbywgbWFjaCwgYmlnX3ApCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGludCBtYWNoOwotICAgICBpbnQgYmlnX3A7Ci17Ci0gIGNvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICpvcGNvZGU7Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBmcHJpbnRmX2Z0eXBlIGZ1bmMgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0gIGludCBzdGF0dXM7Ci0gIC8qIEZpcnN0IGVsZW1lbnQgaXMgaW5zbiwgc2Vjb25kIGVsZW1lbnQgaXMgbGltbSAoaWYgcHJlc2VudCkuICAqLwotICBhcmNfaW5zbiBpbnNuWzJdOwotICBpbnQgZ290X2xpbW1fcCA9IDA7Ci0gIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwotICBzdGF0aWMgaW50IGN1cnJlbnRfbWFjaCA9IDA7Ci0KLSAgaWYgKCFpbml0aWFsaXplZCB8fCBtYWNoICE9IGN1cnJlbnRfbWFjaCkKLSAgICB7Ci0gICAgICBpbml0aWFsaXplZCA9IDE7Ci0gICAgICBjdXJyZW50X21hY2ggPSBhcmNfZ2V0X29wY29kZV9tYWNoIChtYWNoLCBiaWdfcCk7Ci0gICAgICBhcmNfb3Bjb2RlX2luaXRfdGFibGVzIChjdXJyZW50X21hY2gpOwotICAgIH0KLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYywgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGlmIChiaWdfcCkKLSAgICBpbnNuWzBdID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgZWxzZQotICAgIGluc25bMF0gPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0gICgqZnVuYykgKHN0cmVhbSwgIiUwOGx4XHQiLCBpbnNuWzBdKTsKLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gbGlzdHMgaGFzaGVkIGJ5IHRoZSBpbnNuIGNvZGUKLSAgICAgKHRob3VnaCB3ZSBuZWVkbid0IGNhcmUgaG93IHRoZXkncmUgaGFzaGVkKS4gICovCi0KLSAgb3Bjb2RlID0gYXJjX29wY29kZV9sb29rdXBfZGlzIChpbnNuWzBdKTsKLSAgZm9yICggOyBvcGNvZGUgIT0gTlVMTDsgb3Bjb2RlID0gQVJDX09QQ09ERV9ORVhUX0RJUyAob3Bjb2RlKSkKLSAgICB7Ci0gICAgICBjaGFyICpzeW47Ci0gICAgICBpbnQgbW9kcyxpbnZhbGlkOwotICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqb3B2YWw7Ci0KLSAgICAgIC8qIEJhc2ljIGJpdCBtYXNrIG11c3QgYmUgY29ycmVjdC4gICovCi0gICAgICBpZiAoKGluc25bMF0gJiBvcGNvZGUtPm1hc2spICE9IG9wY29kZS0+dmFsdWUpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFN1cHBvcnRlZCBieSB0aGlzIGNwdT8gICovCi0gICAgICBpZiAoISBhcmNfb3Bjb2RlX3N1cHBvcnRlZCAob3Bjb2RlKSkKLQljb250aW51ZTsKLQotICAgICAgLyogTWFrZSB0d28gcGFzc2VzIG92ZXIgdGhlIG9wZXJhbmRzLiAgRmlyc3Qgc2VlIGlmIGFueSBvZiB0aGVtCi0JIGhhdmUgZXh0cmFjdGlvbiBmdW5jdGlvbnMsIGFuZCwgaWYgdGhleSBkbywgbWFrZSBzdXJlIHRoZQotCSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCi0KLSAgICAgIGFyY19vcGNvZGVfaW5pdF9leHRyYWN0ICgpOwotICAgICAgaW52YWxpZCA9IDA7Ci0KLSAgICAgIC8qID8/PyBHcmFudGVkLCB0aGlzIGlzIHNsb3dlciB0aGFuIHRoZSBgcHBjJyB3YXkuICBNYXliZSB3aGVuIHRoaXMgaXMKLQkgZG9uZSBpdCdsbCBiZSBjbGVhciB3aGF0IHRoZSByaWdodCB3YXkgdG8gZG8gdGhpcyBpcy4gICovCi0gICAgICAvKiBJbnN0cnVjdGlvbnMgbGlrZSAiYWRkLmYgcjAscjEsMSIgYXJlIHRyaWNreSBiZWNhdXNlIHRoZSAiLmYiIGdldHMKLQkgcHJpbnRlZCBmaXJzdCwgYnV0IHdlIGRvbid0IGtub3cgaG93IHRvIHByaW50IGl0IHVudGlsIHdlJ3ZlIHByb2Nlc3NlZAotCSB0aGUgcmVncy4gIFNpbmNlIHdlJ3JlIHNjYW5uaW5nIGFsbCB0aGUgYXJncyBiZWZvcmUgcHJpbnRpbmcgdGhlIGluc24KLQkgYW55d2F5cywgaXQncyBhY3R1YWxseSBxdWl0ZSBlYXN5LiAgKi8KLQotICAgICAgZm9yIChzeW4gPSBvcGNvZGUtPnN5bnRheDsgKnN5bjsgKytzeW4pCi0JewotCSAgaW50IGM7Ci0KLQkgIGlmICgqc3luICE9ICclJyB8fCAqKytzeW4gPT0gJyUnKQotCSAgICBjb250aW51ZTsKLQkgIG1vZHMgPSAwOwotCSAgYyA9ICpzeW47Ci0JICB3aGlsZSAoQVJDX01PRF9QIChhcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwW2NdXS5mbGFncykpCi0JICAgIHsKLQkgICAgICBtb2RzIHw9IGFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbY11dLmZsYWdzICYgQVJDX01PRF9CSVRTOwotCSAgICAgICsrc3luOwotCSAgICAgIGMgPSAqc3luOwotCSAgICB9Ci0JICBvcGVyYW5kID0gYXJjX29wZXJhbmRzICsgYXJjX29wZXJhbmRfbWFwW2NdOwotCSAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCi0JICAgICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIG9wZXJhbmQsIG1vZHMsCi0JCQkJIChjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKiopIE5VTEwsCi0JCQkJICZpbnZhbGlkKTsKLQl9Ci0gICAgICBpZiAoaW52YWxpZCkKLQljb250aW51ZTsKLQotICAgICAgLyogVGhlIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLQotICAgICAgLyogSWYgd2UgaGF2ZSBhbiBpbnNuIHdpdGggYSBsaW1tLCBmZXRjaCBpdCBub3cuICBTY2FubmluZyB0aGUgaW5zbnMKLQkgdHdpY2UgbGV0cyB1cyBkbyB0aGlzLiAgKi8KLSAgICAgIGlmIChhcmNfb3Bjb2RlX2xpbW1fcCAoTlVMTCkpCi0JewotCSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMgKyA0LCBidWZmZXIsIDQsIGluZm8pOwotCSAgaWYgKHN0YXR1cyAhPSAwKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgaWYgKGJpZ19wKQotCSAgICBpbnNuWzFdID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLQkgIGVsc2UKLQkgICAgaW5zblsxXSA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0JICBnb3RfbGltbV9wID0gMTsKLQl9Ci0KLSAgICAgIGZvciAoc3luID0gb3Bjb2RlLT5zeW50YXg7ICpzeW47ICsrc3luKQotCXsKLQkgIGludCBjOwotCi0JICBpZiAoKnN5biAhPSAnJScgfHwgKisrc3luID09ICclJykKLQkgICAgewotCSAgICAgICgqZnVuYykgKHN0cmVhbSwgIiVjIiwgKnN5bik7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kLiAgRmV0Y2ggYW55IHNwZWNpYWwgbW9kaWZpZXJzLiAgKi8KLQkgIG1vZHMgPSAwOwotCSAgYyA9ICpzeW47Ci0JICB3aGlsZSAoQVJDX01PRF9QIChhcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwW2NdXS5mbGFncykpCi0JICAgIHsKLQkgICAgICBtb2RzIHw9IGFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbY11dLmZsYWdzICYgQVJDX01PRF9CSVRTOwotCSAgICAgICsrc3luOwotCSAgICAgIGMgPSAqc3luOwotCSAgICB9Ci0JICBvcGVyYW5kID0gYXJjX29wZXJhbmRzICsgYXJjX29wZXJhbmRfbWFwW2NdOwotCi0JICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICBvcHZhbCA9IE5VTEw7Ci0JICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQkgICAgewotCSAgICAgIHZhbHVlID0gKCpvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgb3BlcmFuZCwgbW9kcywKLQkJCQkJICAgJm9wdmFsLCAoaW50ICopIE5VTEwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpCi0JCSAgJiYgKHZhbHVlICYgKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkpKQotCQl2YWx1ZSAtPSAxIDw8IG9wZXJhbmQtPmJpdHM7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgc3VmZml4IG9wZXJhbmQsIHNldCBgb3B2YWwnLiAgKi8KLQkgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TVUZGSVgpCi0JCW9wdmFsID0gYXJjX29wY29kZV9sb29rdXBfc3VmZml4IChvcGVyYW5kLCB2YWx1ZSk7Ci0JICAgIH0KLQotCSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGZsYWdzLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0ZBS0UpCi0JICAgIDsgLyogbm90aGluZyB0byBkbyAoPz8/IGF0IGxlYXN0IG5vdCB5ZXQpICovCi0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NVRkZJWCkKLQkgICAgewotCSAgICAgIC8qIERlZmF1bHQgc3VmZml4ZXMgYXJlbid0IHByaW50ZWQuICBGb3J0dW5hdGVseSwgdGhleSBhbGwgaGF2ZQotCQkgemVybyB2YWx1ZXMuICBBbHNvLCB6ZXJvIHZhbHVlcyBmb3IgYm9vbGVhbiBzdWZmaXhlcyBhcmUKLQkJIHJlcHJlc2VudGVkIGJ5IHRoZSBhYnNlbmNlIG9mIHRleHQuICAqLwotCi0JICAgICAgaWYgKHZhbHVlICE9IDApCi0JCXsKLQkJICAvKiA/Pz8gT1BWQUwgc2hvdWxkIGhhdmUgYSB2YWx1ZS4gIElmIGl0IGRvZXNuJ3QganVzdCBjb3BlCi0JCSAgICAgYXMgd2Ugd2FudCBkaXNhc3NlbWJseSB0byBiZSByZWFzb25hYmx5IHJvYnVzdC4KLQkJICAgICBBbHNvIHJlbWVtYmVyIHRoYXQgc2V2ZXJhbCBjb25kaXRpb24gY29kZSB2YWx1ZXMgKDE2LTMxKQotCQkgICAgIGFyZW4ndCBkZWZpbmVkIHlldC4gIEZvciB0aGVzZSBjYXNlcyBqdXN0IHByaW50IHRoZQotCQkgICAgIG51bWJlciBzdWl0YWJseSBkZWNvcmF0ZWQuICAqLwotCQkgIGlmIChvcHZhbCkKLQkJICAgICgqZnVuYykgKHN0cmVhbSwgIiVzJXMiLAotCQkJICAgICBtb2RzICYgQVJDX01PRF9ET1QgPyAiLiIgOiAiIiwKLQkJCSAgICAgb3B2YWwtPm5hbWUpOwotCQkgIGVsc2UKLQkJICAgICgqZnVuYykgKHN0cmVhbSwgIiVzJWMlZCIsCi0JCQkgICAgIG1vZHMgJiBBUkNfTU9EX0RPVCA/ICIuIiA6ICIiLAotCQkJICAgICBvcGVyYW5kLT5mbXQsIHZhbHVlKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1JFTEFUSVZFX0JSQU5DSCkKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChwYyArIDQgKyB2YWx1ZSwgaW5mbyk7Ci0JICAvKiA/Pz8gTm90IGFsbCBjYXNlcyBvZiB0aGlzIGFyZSBjdXJyZW50bHkgY2F1Z2h0LiAgKi8KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfQUJTT0xVVEVfQlJBTkNIKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSB2YWx1ZSAmIDB4ZmZmZmZmZmYsIGluZm8pOwotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9BRERSRVNTKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSB2YWx1ZSAmIDB4ZmZmZmZmZmYsIGluZm8pOwotCSAgZWxzZSBpZiAob3B2YWwpCi0JICAgIC8qIE5vdGUgdGhhdCB0aGlzIGNhc2UgY2F0Y2hlcyBib3RoIG5vcm1hbCBhbmQgYXV4aWxpYXJ5IHJlZ3MuICAqLwotCSAgICAoKmZ1bmMpIChzdHJlYW0sICIlcyIsIG9wdmFsLT5uYW1lKTsKLQkgIGVsc2UKLQkgICAgKCpmdW5jKSAoc3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBmb3VuZCBhbmQgcHJpbnRlZCBhbiBpbnN0cnVjdGlvbjsgcmV0dXJuLiAgKi8KLSAgICAgIHJldHVybiBnb3RfbGltbV9wID8gOCA6IDQ7Ci0gICAgfQotCi0gICgqZnVuYykgKHN0cmVhbSwgXygiKnVua25vd24qIikpOwotICByZXR1cm4gNDsKLX0KLQotLyogR2l2ZW4gTUFDSCwgb25lIG9mIGJmZF9tYWNoX2FyY194eHgsIHJldHVybiB0aGUgcHJpbnRfaW5zbiBmdW5jdGlvbiB0byB1c2UuCi0gICBUaGlzIGRvZXMgdGhpbmdzIGEgbm9uLXN0YW5kYXJkIHdheSAodGhlICJzdGFuZGFyZCIgd2F5IHdvdWxkIGJlIHRvIGNvcHkKLSAgIHRoaXMgY29kZSBpbnRvIGRpc2Fzc2VtYmxlLmMpLiAgU2luY2UgdGhlcmUgYXJlIG1vcmUgdGhhbiBhIGNvdXBsZSBvZgotICAgdmFyaWFudHMsIGhpZGluZyBhbGwgdGhpcyBjcnVkIGhlcmUgc2VlbXMgY2xlYW5lci4gICovCi0KLWRpc2Fzc2VtYmxlcl9mdHlwZQotYXJjX2dldF9kaXNhc3NlbWJsZXIgKG1hY2gsIGJpZ19wKQotICAgICBpbnQgbWFjaDsKLSAgICAgaW50IGJpZ19wOwotewotICBzd2l0Y2ggKG1hY2gpCi0gICAgewotICAgIGNhc2UgYmZkX21hY2hfYXJjX2Jhc2U6Ci0gICAgICByZXR1cm4gYmlnX3AgPyBwcmludF9pbnNuX2FyY19iYXNlX2JpZyA6IHByaW50X2luc25fYXJjX2Jhc2VfbGl0dGxlOwotICAgIH0KLSAgcmV0dXJuIHByaW50X2luc25fYXJjX2Jhc2VfbGl0dGxlOwotfQotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyY19iYXNlX2xpdHRsZSAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuIChwYywgaW5mbywgYmZkX21hY2hfYXJjX2Jhc2UsIDApOwotfQotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyY19iYXNlX2JpZyAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuIChwYywgaW5mbywgYmZkX21hY2hfYXJjX2Jhc2UsIDEpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hcmMtb3BjLmMgYi9vcGNvZGVzL2FyYy1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4ZjY4OS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FyYy1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDExMzEgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciB0aGUgQVJDLgotICAgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgotICAgCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9hcmMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgMAotI2VuZGlmCi0KLSNkZWZpbmUgSU5TRVJUX0ZOKGZuKSBcCi1zdGF0aWMgYXJjX2luc24gZm4gUEFSQU1TICgoYXJjX2luc24sIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqLCBcCi0JCQkgICAgaW50LCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKiwgbG9uZywgXAotCQkJICAgIGNvbnN0IGNoYXIgKiopKQotI2RlZmluZSBFWFRSQUNUX0ZOKGZuKSBcCi1zdGF0aWMgbG9uZyBmbiBQQVJBTVMgKChhcmNfaW5zbiAqLCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKiwgXAotCQkJaW50LCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKiosIGludCAqKSkKLQotSU5TRVJUX0ZOIChpbnNlcnRfcmVnKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X3NoaW1tZmluaXNoKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2xpbW1maW5pc2gpOwotSU5TRVJUX0ZOIChpbnNlcnRfc2hpbW1vZmZzZXQpOwotSU5TRVJUX0ZOIChpbnNlcnRfc2hpbW16ZXJvKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2ZsYWcpOwotSU5TRVJUX0ZOIChpbnNlcnRfZmxhZ2ZpbmlzaCk7Ci1JTlNFUlRfRk4gKGluc2VydF9jb25kKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2ZvcmNlbGltbSk7Ci1JTlNFUlRfRk4gKGluc2VydF9yZWxhZGRyKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2Fic2FkZHIpOwotSU5TRVJUX0ZOIChpbnNlcnRfdW5vcG1hY3JvKTsKLQotRVhUUkFDVF9GTiAoZXh0cmFjdF9yZWcpOwotRVhUUkFDVF9GTiAoZXh0cmFjdF9mbGFnKTsKLUVYVFJBQ1RfRk4gKGV4dHJhY3RfY29uZCk7Ci1FWFRSQUNUX0ZOIChleHRyYWN0X3JlbGFkZHIpOwotRVhUUkFDVF9GTiAoZXh0cmFjdF91bm9wbWFjcm8pOwotCi0vKiBWYXJpb3VzIHR5cGVzIG9mIEFSQyBvcGVyYW5kcywgaW5jbHVkaW5nIGluc24gc3VmZml4ZXMuICAqLwotCi0vKiBJbnNuIGZvcm1hdCB2YWx1ZXM6Ci0KLSAgICdhJwlSRUdBCQlyZWdpc3RlciBBIGZpZWxkCi0gICAnYicJUkVHQgkJcmVnaXN0ZXIgQiBmaWVsZAotICAgJ2MnCVJFR0MJCXJlZ2lzdGVyIEMgZmllbGQKLSAgICdTJwlTSElNTUZJTklTSAlmaW5pc2ggaW5zZXJ0aW5nIGEgc2hpbW0gdmFsdWUKLSAgICdMJwlMSU1NRklOSVNICWZpbmlzaCBpbnNlcnRpbmcgYSBsaW1tIHZhbHVlCi0gICAnZCcJU0hJTU1PRkZTRVQJc2hpbW0gb2Zmc2V0IGluIGxkLHN0IGluc25zCi0gICAnMCcJU0hJTU1aRVJPCTAgc2hpbW0gdmFsdWUgaW4gbGQsc3QgaW5zbnMKLSAgICdmJwlGTEFHCQlGIGZsYWcKLSAgICdGJwlGTEFHRklOSVNICWZpbmlzaCBpbnNlcnRpbmcgdGhlIEYgZmxhZwotICAgJ0cnCUZMQUdJTlNOCWluc2VydCBGIGZsYWcgaW4gImZsYWciIGluc24KLSAgICduJwlERUxBWQkJTiBmaWVsZCAobnVsbGlmeSBmaWVsZCkKLSAgICdxJwlDT05ECQljb25kaXRpb24gY29kZSBmaWVsZAotICAgJ1EnCUZPUkNFTElNTQlzZXQgYGNvbmRfcCcgdG8gMSB0byBlbnN1cmUgYSBjb25zdGFudCBpcyBhIGxpbW0KLSAgICdCJwlCUkFOQ0gJCWJyYW5jaCBhZGRyZXNzICgyMiBiaXQgcGMgcmVsYXRpdmUpCi0gICAnSicJSlVNUAkJanVtcCBhZGRyZXNzICgyNiBiaXQgYWJzb2x1dGUpCi0gICAneicJU0laRTEJCXNpemUgZmllbGQgaW4gbGQgYSxbYixjXQotICAgJ1onCVNJWkUxMAkJc2l6ZSBmaWVsZCBpbiBsZCBhLFtiLHNoaW1tXQotICAgJ3knCVNJWkUyMgkJc2l6ZSBmaWVsZCBpbiBzdCBjLFtiLHNoaW1tXQotICAgJ3gnCVNJR04wCQlzaWduIGV4dGVuZCBmaWVsZCBsZCBhLFtiLGNdCi0gICAnWCcJU0lHTjkJCXNpZ24gZXh0ZW5kIGZpZWxkIGxkIGEsW2Isc2hpbW1dCi0gICAndycJQUREUkVTUzMJd3JpdGUtYmFjayBmaWVsZCBpbiBsZCBhLFtiLGNdCi0gICAnVycJQUREUkVTUzEyCXdyaXRlLWJhY2sgZmllbGQgaW4gbGQgYSxbYixzaGltbV0KLSAgICd2JwlBRERSRVNTMjQJd3JpdGUtYmFjayBmaWVsZCBpbiBzdCBjLFtiLHNoaW1tXQotICAgJ2UnCUNBQ0hFQllQQVNTNQljYWNoZSBieXBhc3MgaW4gbGQgYSxbYixjXQotICAgJ0UnCUNBQ0hFQllQQVNTMTQJY2FjaGUgYnlwYXNzIGluIGxkIGEsW2Isc2hpbW1dCi0gICAnRCcJQ0FDSEVCWVBBU1MyNgljYWNoZSBieXBhc3MgaW4gc3QgYyxbYixzaGltbV0KLSAgICdVJwlVTk9QTUFDUk8JZmFrZSBvcGVyYW5kIHRvIGNvcHkgUkVHQiB0byBSRUdDIGZvciB1bm9wIG1hY3JvcwotCi0gICBUaGUgZm9sbG93aW5nIG1vZGlmaWVycyBtYXkgYXBwZWFyIGJldHdlZW4gdGhlICUgYW5kIGNoYXIgKGVnOiAlLmYpOgotCi0gICAnLicJTU9ERE9UCQknLicgcHJlZml4IG11c3QgYmUgcHJlc2VudAotICAgJ3InCVJFRwkJZ2VuZXJpYyByZWdpc3RlciB2YWx1ZSwgZm9yIHJlZ2lzdGVyIHRhYmxlCi0gICAnQScJQVVYUkVHCQlhdXhpbGlhcnkgcmVnaXN0ZXIgaW4gbHIgYSxbYl0sIHNyIGMsW2JdCi0KLSAgIEZpZWxkcyBhcmU6Ci0KLSAgIENIQVIgQklUUyBTSElGVCBGTEFHUyBJTlNFUlRfRk4gRVhUUkFDVF9GTgotKi8KLQotY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kIGFyY19vcGVyYW5kc1tdID0KLXsKLS8qIHBsYWNlIGhvbGRlciAoPz8/IG5vdCBzdXJlIGlmIG5lZWRlZCkgKi8KLSNkZWZpbmUgVU5VU0VEIDAKLSAgeyAwIH0sCi0KLS8qIHJlZ2lzdGVyIEEgb3Igc2hpbW0vbGltbSBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgUkVHQSAoVU5VU0VEICsgMSkKLSAgeyAnYScsIDYsIEFSQ19TSElGVF9SRUdBLCBBUkNfT1BFUkFORF9TSUdORUQsIGluc2VydF9yZWcsIGV4dHJhY3RfcmVnIH0sCi0KLS8qIHJlZ2lzdGVyIEIgb3Igc2hpbW0vbGltbSBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgUkVHQiAoUkVHQSArIDEpCi0gIHsgJ2InLCA2LCBBUkNfU0hJRlRfUkVHQiwgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfcmVnLCBleHRyYWN0X3JlZyB9LAotCi0vKiByZWdpc3RlciBDIG9yIHNoaW1tL2xpbW0gaW5kaWNhdG9yICovCi0jZGVmaW5lIFJFR0MgKFJFR0IgKyAxKQotICB7ICdjJywgNiwgQVJDX1NISUZUX1JFR0MsIEFSQ19PUEVSQU5EX1NJR05FRCwgaW5zZXJ0X3JlZywgZXh0cmFjdF9yZWcgfSwKLQotLyogZmFrZSBvcGVyYW5kIHVzZWQgdG8gaW5zZXJ0IHNoaW1tIHZhbHVlIGludG8gbW9zdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgU0hJTU1GSU5JU0ggKFJFR0MgKyAxKQotICB7ICdTJywgOSwgMCwgQVJDX09QRVJBTkRfU0lHTkVEICsgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3NoaW1tZmluaXNoLCAwIH0sCi0KLS8qIGZha2Ugb3BlcmFuZCB1c2VkIHRvIGluc2VydCBsaW1tIHZhbHVlIGludG8gbW9zdCBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBMSU1NRklOSVNIIChTSElNTUZJTklTSCArIDEpCi0gIHsgJ0wnLCAzMiwgMzIsIEFSQ19PUEVSQU5EX0FERFJFU1MgKyBBUkNfT1BFUkFORF9MSU1NICsgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X2xpbW1maW5pc2gsIDAgfSwKLQotLyogc2hpbW0gb3BlcmFuZCB3aGVuIHRoZXJlIGlzIG5vIHJlZyBpbmRpY2F0b3IgKGxkLHN0KSAqLwotI2RlZmluZSBTSElNTU9GRlNFVCAoTElNTUZJTklTSCArIDEpCi0gIHsgJ2QnLCA5LCAwLCBBUkNfT1BFUkFORF9TSUdORUQsIGluc2VydF9zaGltbW9mZnNldCwgMCB9LAotCi0vKiAwIHNoaW1tIG9wZXJhbmQgZm9yIGxkLHN0IGluc25zICovCi0jZGVmaW5lIFNISU1NWkVSTyAoU0hJTU1PRkZTRVQgKyAxKQotICB7ICcwJywgOSwgMCwgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3NoaW1temVybywgMCB9LAotCi0vKiBmbGFnIHVwZGF0ZSBiaXQgKGluc2VydGlvbiBpcyBkZWZlcmVkIHVudGlsIHdlIGtub3cgaG93KSAqLwotI2RlZmluZSBGTEFHIChTSElNTVpFUk8gKyAxKQotICB7ICdmJywgMSwgOCwgQVJDX09QRVJBTkRfU1VGRklYLCBpbnNlcnRfZmxhZywgZXh0cmFjdF9mbGFnIH0sCi0KLS8qIGZha2UgdXRpbGl0eSBvcGVyYW5kIHRvIGZpbmlzaCAnZicgc3VmZml4IGhhbmRsaW5nICovCi0jZGVmaW5lIEZMQUdGSU5JU0ggKEZMQUcgKyAxKQotICB7ICdGJywgMSwgOCwgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X2ZsYWdmaW5pc2gsIDAgfSwKLQotLyogZmFrZSB1dGlsaXR5IG9wZXJhbmQgdG8gc2V0IHRoZSAnZicgZmxhZyBmb3IgdGhlICJmbGFnIiBpbnNuICovCi0jZGVmaW5lIEZMQUdJTlNOIChGTEFHRklOSVNIICsgMSkKLSAgeyAnRycsIDEsIDgsIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9mbGFnLCAwIH0sCi0KLS8qIGJyYW5jaCBkZWxheSB0eXBlcyAqLwotI2RlZmluZSBERUxBWSAoRkxBR0lOU04gKyAxKQotICB7ICduJywgMiwgNSwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGNvbmRpdGlvbnMgKi8KLSNkZWZpbmUgQ09ORCAoREVMQVkgKyAxKQotICB7ICdxJywgNSwgMCwgQVJDX09QRVJBTkRfU1VGRklYLCBpbnNlcnRfY29uZCwgZXh0cmFjdF9jb25kIH0sCi0KLS8qIHNldCBgY29uZF9wJyB0byAxIHRvIGVuc3VyZSBhIGNvbnN0YW50IGlzIHRyZWF0ZWQgYXMgYSBsaW1tICovCi0jZGVmaW5lIEZPUkNFTElNTSAoQ09ORCArIDEpCi0gIHsgJ1EnLCAwLCAwLCBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfZm9yY2VsaW1tIH0sCi0KLS8qIGJyYW5jaCBhZGRyZXNzOyBiLCBibCwgYW5kIGxwIGluc25zICovCi0jZGVmaW5lIEJSQU5DSCAoRk9SQ0VMSU1NICsgMSkKLSAgeyAnQicsIDIwLCA3LCBBUkNfT1BFUkFORF9SRUxBVElWRV9CUkFOQ0ggKyBBUkNfT1BFUkFORF9TSUdORUQsIGluc2VydF9yZWxhZGRyLCBleHRyYWN0X3JlbGFkZHIgfSwKLQotLyoganVtcCBhZGRyZXNzOyBqIGluc24gKHRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzICdMJyBleGNlcHQgdGhhdCB0aGUKLSAgIHZhbHVlIGlzIHJpZ2h0IHNoaWZ0ZWQgYnkgMikgKi8KLSNkZWZpbmUgSlVNUCAoQlJBTkNIICsgMSkKLSAgeyAnSicsIDI0LCAzMiwgQVJDX09QRVJBTkRfQUJTT0xVVEVfQlJBTkNIICsgQVJDX09QRVJBTkRfTElNTSArIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9hYnNhZGRyIH0sCi0KLS8qIHNpemUgZmllbGQsIHN0b3JlZCBpbiBiaXQgMSwyICovCi0jZGVmaW5lIFNJWkUxIChKVU1QICsgMSkKLSAgeyAneicsIDIsIDEsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBzaXplIGZpZWxkLCBzdG9yZWQgaW4gYml0IDEwLDExICovCi0jZGVmaW5lIFNJWkUxMCAoU0laRTEgKyAxKQotICB7ICdaJywgMiwgMTAsIEFSQ19PUEVSQU5EX1NVRkZJWCwgfSwKLQotLyogc2l6ZSBmaWVsZCwgc3RvcmVkIGluIGJpdCAyMiwyMyAqLwotI2RlZmluZSBTSVpFMjIgKFNJWkUxMCArIDEpCi0gIHsgJ3knLCAyLCAyMiwgQVJDX09QRVJBTkRfU1VGRklYLCB9LAotCi0vKiBzaWduIGV4dGVuZCBmaWVsZCwgc3RvcmVkIGluIGJpdCAwICovCi0jZGVmaW5lIFNJR04wIChTSVpFMjIgKyAxKQotICB7ICd4JywgMSwgMCwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIHNpZ24gZXh0ZW5kIGZpZWxkLCBzdG9yZWQgaW4gYml0IDkgKi8KLSNkZWZpbmUgU0lHTjkgKFNJR04wICsgMSkKLSAgeyAnWCcsIDEsIDksIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBhZGRyZXNzIHdyaXRlIGJhY2ssIHN0b3JlZCBpbiBiaXQgMyAqLwotI2RlZmluZSBBRERSRVNTMyAoU0lHTjkgKyAxKQotICB7ICd3JywgMSwgMywgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGFkZHJlc3Mgd3JpdGUgYmFjaywgc3RvcmVkIGluIGJpdCAxMiAqLwotI2RlZmluZSBBRERSRVNTMTIgKEFERFJFU1MzICsgMSkKLSAgeyAnVycsIDEsIDEyLCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogYWRkcmVzcyB3cml0ZSBiYWNrLCBzdG9yZWQgaW4gYml0IDI0ICovCi0jZGVmaW5lIEFERFJFU1MyNCAoQUREUkVTUzEyICsgMSkKLSAgeyAndicsIDEsIDI0LCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogY2FjaGUgYnlwYXNzLCBzdG9yZWQgaW4gYml0IDUgKi8KLSNkZWZpbmUgQ0FDSEVCWVBBU1M1IChBRERSRVNTMjQgKyAxKQotICB7ICdlJywgMSwgNSwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGNhY2hlIGJ5cGFzcywgc3RvcmVkIGluIGJpdCAxNCAqLwotI2RlZmluZSBDQUNIRUJZUEFTUzE0IChDQUNIRUJZUEFTUzUgKyAxKQotICB7ICdFJywgMSwgMTQsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBjYWNoZSBieXBhc3MsIHN0b3JlZCBpbiBiaXQgMjYgKi8KLSNkZWZpbmUgQ0FDSEVCWVBBU1MyNiAoQ0FDSEVCWVBBU1MxNCArIDEpCi0gIHsgJ0QnLCAxLCAyNiwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIHVub3AgbWFjcm8sIHVzZWQgdG8gY29weSBSRUdCIHRvIFJFR0MgKi8KLSNkZWZpbmUgVU5PUE1BQ1JPIChDQUNIRUJZUEFTUzI2ICsgMSkKLSAgeyAnVScsIDYsIEFSQ19TSElGVF9SRUdDLCBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfdW5vcG1hY3JvLCBleHRyYWN0X3Vub3BtYWNybyB9LAotCi0vKiAnLicgbW9kaWZpZXIgKCcuJyByZXF1aXJlZCkuICAqLwotI2RlZmluZSBNT0RET1QgKFVOT1BNQUNSTyArIDEpCi0gIHsgJy4nLCAxLCAwLCBBUkNfTU9EX0RPVCB9LAotCi0vKiBEdW1teSAncicgbW9kaWZpZXIgZm9yIHRoZSByZWdpc3RlciB0YWJsZS4KLSAgIEl0J3MgY2FsbGVkIGEgImR1bW15IiBiZWNhdXNlIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gaW5zZXJ0aW5nIGFuICdyJyBpbnRvIGFsbAotICAgdGhlICVhLyViLyVjIG9jY3VycmVuY2VzIGluIHRoZSBpbnNuIHRhYmxlLiAgKi8KLSNkZWZpbmUgUkVHIChNT0RET1QgKyAxKQotICB7ICdyJywgNiwgMCwgQVJDX01PRF9SRUcgfSwKLQotLyogS25vd24gYXV4aWxpYXJ5IHJlZ2lzdGVyIG1vZGlmaWVyIChzdG9yZWQgaW4gc2hpbW0gZmllbGQpLiAgKi8KLSNkZWZpbmUgQVVYUkVHIChSRUcgKyAxKQotICB7ICdBJywgOSwgMCwgQVJDX01PRF9BVVhSRUcgfSwKLQotLyogZW5kIG9mIGxpc3QgcGxhY2UgaG9sZGVyICovCi0gIHsgMCB9Ci19OwotDAotLyogR2l2ZW4gYSBmb3JtYXQgbGV0dGVyLCB5aWVsZHMgdGhlIGluZGV4IGludG8gYGFyY19vcGVyYW5kcycuCi0gICBlZzogYXJjX29wZXJhbmRfbWFwWydhJ10gPSBSRUdBLiAgKi8KLXVuc2lnbmVkIGNoYXIgYXJjX29wZXJhbmRfbWFwWzI1Nl07Ci0KLSNkZWZpbmUgSSh4KSAoKCh4KSAmIDMxKSA8PCAyNykKLSNkZWZpbmUgQSh4KSAoKCh4KSAmIEFSQ19NQVNLX1JFRykgPDwgQVJDX1NISUZUX1JFR0EpCi0jZGVmaW5lIEIoeCkgKCgoeCkgJiBBUkNfTUFTS19SRUcpIDw8IEFSQ19TSElGVF9SRUdCKQotI2RlZmluZSBDKHgpICgoKHgpICYgQVJDX01BU0tfUkVHKSA8PCBBUkNfU0hJRlRfUkVHQykKLSNkZWZpbmUgUih4LGIsbSkgKCgoeCkgJiAobSkpIDw8IChiKSkJLyogdmFsdWUgWCwgbWFzayBNLCBhdCBiaXQgQiAqLwotCi0vKiBBUkMgaW5zdHJ1Y3Rpb25zLgotCi0gICBMb25nZXIgdmVyc2lvbnMgb2YgaW5zbnMgbXVzdCBhcHBlYXIgYmVmb3JlIHNob3J0ZXIgb25lcyAoaWYgZ2FzIHNlZXMKLSAgICJsc3IgcjIscjMsMSIgd2hlbiBpdCdzIHBhcnNpbmcgImxzciAlYSwlYiIgaXQgd2lsbCB0aGluayB0aGUgIiwxIiBpcwotICAganVuaykuICBUaGlzIGlzbid0IG5lY2Vzc2FyeSBmb3IgYGxkJyBiZWNhdXNlIG9mIHRoZSB0cmFpbGluZyAnXScuCi0KLSAgIEluc3RydWN0aW9ucyB0aGF0IGFyZSByZWFsbHkgbWFjcm9zIGJhc2VkIG9uIG90aGVyIGluc25zIG11c3QgYXBwZWFyCi0gICBiZWZvcmUgdGhlIHJlYWwgaW5zbiBzbyB0aGV5J3JlIGNob3NlbiB3aGVuIGRpc2Fzc2VtYmxpbmcuICBFZzogVGhlIGBtb3YnCi0gICBpbnNuIGlzIHJlYWxseSB0aGUgYGFuZCcgaW5zbi4KLQotICAgVGhpcyB0YWJsZSBpcyBiZXN0IHZpZXdlZCBvbiBhIHdpZGUgc2NyZWVuICgxNjEgY29sdW1ucykuICBJJ2QgcHJlZmVyIHRvCi0gICBrZWVwIGl0IHRoaXMgd2F5LiAgVGhlIHJlc3Qgb2YgdGhlIGZpbGUsIGhvd2V2ZXIsIHNob3VsZCBiZSB2aWV3YWJsZSBvbiBhbgotICAgODAgY29sdW1uIHRlcm1pbmFsLiAgKi8KLQotLyogPz8/IFRoaXMgdGFibGUgYWxzbyBpbmNsdWRlcyBtYWNyb3M6IGFzbCwgbHNsLCBhbmQgbW92LiAgVGhlIHBwYyBwb3J0IGhhcwotICAgYSBtb3JlIGdlbmVyYWwgZmFjaWxpdHkgZm9yIGRlYWxpbmcgd2l0aCBtYWNyb3Mgd2hpY2ggY291bGQgYmUgdXNlZCBpZgotICAgd2UgbmVlZCB0by4gICovCi0KLS8qIFRoaXMgdGFibGUgY2FuJ3QgYmUgYGNvbnN0JyBiZWNhdXNlIG1lbWJlcnMgYG5leHRfYXNtJyBhbmQgYG5leHRfZGlzJyBhcmUKLSAgIGNvbXB1dGVkIGF0IHJ1bi10aW1lLiAgV2UgY291bGQgc3BsaXQgdGhpcyBpbnRvIHR3bywgYnV0IHRoYXQgZG9lc24ndCBzZWVtCi0gICB3b3J0aCBpdC4gICovCi0KLXN0cnVjdCBhcmNfb3Bjb2RlIGFyY19vcGNvZGVzW10gPSB7Ci0KLSAgLyogTWFjcm9zIGFwcGVhciBmaXJzdC4gICovCi0gIC8qICJtb3YiIGlzIHJlYWxseSBhbiAiYW5kIi4gICovCi0gIHsgIm1vdiUucSUuZiAlYSwlYiVGJVMlTCVVIiwJCUkoLTEpLAkJSSgxMikgfSwKLSAgLyogImFzbCIgaXMgcmVhbGx5IGFuICJhZGQiLiAgKi8KLSAgeyAiYXNsJS5xJS5mICVhLCViJUYlUyVMJVUiLAkJSSgtMSksCQlJKDgpIH0sCi0gIC8qICJsc2wiIGlzIHJlYWxseSBhbiAiYWRkIi4gICovCi0gIHsgImxzbCUucSUuZiAlYSwlYiVGJVMlTCVVIiwJCUkoLTEpLAkJSSg4KSB9LAotICAvKiAibm9wIiBpcyByZWFsbHkgYW4gInhvciIuICAqLwotICB7ICJub3AiLAkJCQkweGZmZmZmZmZmLAkweDdmZmZmZmZmIH0sCi0gIC8qICJybGMiIGlzIHJlYWxseSBhbiAiYWRjIi4gICovCi0gIHsgInJsYyUucSUuZiAlYSwlYiVGJVMlTCVVIiwJCUkoLTEpLAkJSSg5KSB9LAotCi0gIC8qIFRoZSByZXN0IG9mIHRoZXNlIG5lZWRuJ3QgYmUgc29ydGVkLCBidXQgaXQgaGVscHMgdG8gZmluZCB0aGVtIGlmIHRoZXkgYXJlLiAgKi8KLSAgeyAiYWRjJS5xJS5mICVhLCViLCVjJUYlUyVMIiwJCUkoLTEpLAkJSSg5KSB9LAotICB7ICJhZGQlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDgpIH0sCi0gIHsgImFuZCUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTIpIH0sCi0gIHsgImFzciUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDEpIH0sCi0gIHsgImJpYyUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTQpIH0sCi0gIHsgImIlcSUubiAlQiIsCQkJSSgtMSksCQlJKDQpLAkJQVJDX09QQ09ERV9DT05EX0JSQU5DSCB9LAotICB7ICJibCVxJS5uICVCIiwJCQlJKC0xKSwJCUkoNSksCQlBUkNfT1BDT0RFX0NPTkRfQlJBTkNIIH0sCi0gIHsgImV4dGIlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQyg3KSB9LAotICB7ICJleHR3JS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoOCkgfSwKLSAgeyAiZmxhZyUucSAlYiVHJVMlTCIsCQkJSSgtMSkrQSgtMSkrQygtMSksCQlJKDMpK0EoQVJDX1JFR19TSElNTV9VUERBVEUpK0MoMCkgfSwKLSAgLyogJVE6IGZvcmNlIGNvbmRfcD0xIC0tPiBubyBzaGltbSB2YWx1ZXMgKi8KLSAgLyogPz8/IFRoaXMgaW5zbiBhbGxvd3MgYW4gb3B0aW9uYWwgZmxhZ3Mgc3BlYy4gICovCi0gIHsgImolcSVRJS5uJS5mICViJUoiLAkJCUkoLTEpK0EoLTEpK0MoLTEpK1IoLTEsNywxKSwJSSg3KStBKDApK0MoMCkrUigwLDcsMSkgfSwKLSAgLyogUHV0IG9wY29kZSAxIGxkIGluc25zIGZpcnN0IHNvIHNoaW1tIGdldHMgcHJlZmVyZWQgb3ZlciBsaW1tLiAgKi8KLSAgLyogIlslYl0iIGlzIGJlZm9yZSAiWyViLCVkXSIgc28gMCBvZmZzZXRzIGRvbid0IGdldCBwcmludGVkLiAgKi8KLSAgeyAibGQlWiUuWCUuVyUuRSAlMCVhLFslYl0lTCIsCUkoLTEpK1IoLTEsMTMsMSkrUigtMSwwLDUxMSksCUkoMSkrUigwLDEzLDEpK1IoMCwwLDUxMSkgfSwKLSAgeyAibGQlWiUuWCUuVyUuRSAlYSxbJWIsJWRdJVMlTCIsCUkoLTEpK1IoLTEsMTMsMSksCQlJKDEpK1IoMCwxMywxKSB9LAotICB7ICJsZCV6JS54JS53JS5lJVEgJWEsWyViLCVjXSVMIiwJSSgtMSkrUigtMSw0LDEpK1IoLTEsNiw3KSwJSSgwKStSKDAsNCwxKStSKDAsNiw3KSB9LAotICB7ICJscCVxJS5uICVCIiwJCQlJKC0xKSwJCUkoNiksIH0sCi0gIHsgImxyICVhLFslQWJdJVMlTCIsCQkJSSgtMSkrQygtMSksCUkoMSkrQygweDEwKSB9LAotICB7ICJsc3IlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQygyKSB9LAotICB7ICJvciUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTMpIH0sCi0gIHsgInJvciUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDMpIH0sCi0gIHsgInJyYyUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDQpIH0sCi0gIHsgInNiYyUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTEpIH0sCi0gIHsgInNleGIlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQyg1KSB9LAotICB7ICJzZXh3JS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoNikgfSwKLSAgeyAic3IgJWMsWyVBYl0lUyVMIiwJCQlJKC0xKStBKC0xKSwJSSgyKStBKDB4MTApIH0sCi0gIC8qICJbJWJdIiBpcyBiZWZvcmUgIlslYiwlZF0iIHNvIDAgb2Zmc2V0cyBkb24ndCBnZXQgcHJpbnRlZC4gICovCi0gIHsgInN0JXklLnYlLkQlUSAlMCVjLFslYl0lTCIsCQlJKC0xKStSKC0xLDI1LDEpK1IoLTEsMjEsMSkrUigtMSwwLDUxMSksCUkoMikrUigwLDI1LDEpK1IoMCwyMSwxKStSKDAsMCw1MTEpIH0sCi0gIHsgInN0JXklLnYlLkQgJWMsWyViLCVkXSVTJUwiLAlJKC0xKStSKC0xLDI1LDEpK1IoLTEsMjEsMSksCQkJSSgyKStSKDAsMjUsMSkrUigwLDIxLDEpIH0sCi0gIHsgInN1YiUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTApIH0sCi0gIHsgInhvciUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoMTUpIH0KLX07Ci1jb25zdCBpbnQgYXJjX29wY29kZXNfY291bnQgPSBzaXplb2YgKGFyY19vcGNvZGVzKSAvIHNpemVvZiAoYXJjX29wY29kZXNbMF0pOwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3JlZ19uYW1lc1tdID0KLXsKLSAgLyogU29ydCB0aGlzIHNvIHRoYXQgdGhlIGZpcnN0IDYxIGVudHJpZXMgYXJlIHNlcXVlbnRpYWwuCi0gICAgIElFOiBGb3IgZWFjaCBpIChpPDYxKSwgYXJjX3JlZ19uYW1lc1tpXS52YWx1ZSA9PSBpLiAgKi8KLQotICB7ICJyMCIsIDAsIFJFRyB9LCB7ICJyMSIsIDEsIFJFRyB9LCB7ICJyMiIsIDIsIFJFRyB9LCB7ICJyMyIsIDMsIFJFRyB9LAotICB7ICJyNCIsIDQsIFJFRyB9LCB7ICJyNSIsIDUsIFJFRyB9LCB7ICJyNiIsIDYsIFJFRyB9LCB7ICJyNyIsIDcsIFJFRyB9LAotICB7ICJyOCIsIDgsIFJFRyB9LCB7ICJyOSIsIDksIFJFRyB9LCB7ICJyMTAiLCAxMCwgUkVHIH0sIHsgInIxMSIsIDExLCBSRUcgfSwKLSAgeyAicjEyIiwgMTIsIFJFRyB9LCB7ICJyMTMiLCAxMywgUkVHIH0sIHsgInIxNCIsIDE0LCBSRUcgfSwgeyAicjE1IiwgMTUsIFJFRyB9LAotICB7ICJyMTYiLCAxNiwgUkVHIH0sIHsgInIxNyIsIDE3LCBSRUcgfSwgeyAicjE4IiwgMTgsIFJFRyB9LCB7ICJyMTkiLCAxOSwgUkVHIH0sCi0gIHsgInIyMCIsIDIwLCBSRUcgfSwgeyAicjIxIiwgMjEsIFJFRyB9LCB7ICJyMjIiLCAyMiwgUkVHIH0sIHsgInIyMyIsIDIzLCBSRUcgfSwKLSAgeyAicjI0IiwgMjQsIFJFRyB9LCB7ICJyMjUiLCAyNSwgUkVHIH0sIHsgInIyNiIsIDI2LCBSRUcgfSwgeyAiZnAiLCAyNywgUkVHIH0sCi0gIHsgInNwIiwgMjgsIFJFRyB9LCB7ICJpbGluazEiLCAyOSwgUkVHIH0sIHsgImlsaW5rMiIsIDMwLCBSRUcgfSwgeyAiYmxpbmsiLCAzMSwgUkVHIH0sCi0gIHsgInIzMiIsIDMyLCBSRUcgfSwgeyAicjMzIiwgMzMsIFJFRyB9LCB7ICJyMzQiLCAzNCwgUkVHIH0sIHsgInIzNSIsIDM1LCBSRUcgfSwKLSAgeyAicjM2IiwgMzYsIFJFRyB9LCB7ICJyMzciLCAzNywgUkVHIH0sIHsgInIzOCIsIDM4LCBSRUcgfSwgeyAicjM5IiwgMzksIFJFRyB9LAotICB7ICJyNDAiLCA0MCwgUkVHIH0sIHsgInI0MSIsIDQxLCBSRUcgfSwgeyAicjQyIiwgNDIsIFJFRyB9LCB7ICJyNDMiLCA0MywgUkVHIH0sCi0gIHsgInI0NCIsIDQ0LCBSRUcgfSwgeyAicjQ1IiwgNDUsIFJFRyB9LCB7ICJyNDYiLCA0NiwgUkVHIH0sIHsgInI0NyIsIDQ3LCBSRUcgfSwKLSAgeyAicjQ4IiwgNDgsIFJFRyB9LCB7ICJyNDkiLCA0OSwgUkVHIH0sIHsgInI1MCIsIDUwLCBSRUcgfSwgeyAicjUxIiwgNTEsIFJFRyB9LAotICB7ICJyNTIiLCA1MiwgUkVHIH0sIHsgInI1MyIsIDUzLCBSRUcgfSwgeyAicjU0IiwgNTQsIFJFRyB9LCB7ICJyNTUiLCA1NSwgUkVHIH0sCi0gIHsgInI1NiIsIDU2LCBSRUcgfSwgeyAicjU3IiwgNTcsIFJFRyB9LCB7ICJyNTgiLCA1OCwgUkVHIH0sIHsgInI1OSIsIDU5LCBSRUcgfSwKLSAgeyAibHBfY291bnQiLCA2MCwgUkVHIH0sCi0KLSAgLyogSSdkIHByZWZlciB0byBvdXRwdXQgdGhlc2UgYXMgImZwIiBhbmQgInNwIiBieSBkZWZhdWx0LCBidXQgd2Ugc3RpbGwgbmVlZAotICAgICB0byByZWNvZ25pemUgdGhlIGNhbm9uaWNhbCB2YWx1ZXMuICAqLwotICB7ICJyMjciLCAyNywgUkVHIH0sIHsgInIyOCIsIDI4LCBSRUcgfSwKLQotICAvKiBTb21lb25lIG1heSB3aXNoIHRvIHJlZmVyIHRvIHRoZXNlIGluIHRoaXMgd2F5LCBhbmQgaXQncyBwcm9iYWJseSBhCi0gICAgIGdvb2QgaWRlYSB0byByZXNlcnZlIHRoZW0gYXMgc3VjaCBhbnl3YXkuICAqLwotICB7ICJyMjkiLCAyOSwgUkVHIH0sIHsgInIzMCIsIDMwLCBSRUcgfSwgeyAicjMxIiwgMzEsIFJFRyB9LCB7ICJyNjAiLCA2MCwgUkVHIH0sCi0KLSAgLyogU3RhbmRhcmQgYXV4aWxpYXJ5IHJlZ2lzdGVycy4gICovCi0gIHsgInN0YXR1cyIsCTAsIEFVWFJFRyB9LAotICB7ICJzZW1hcGhvcmUiLCAxLCBBVVhSRUcgfSwKLSAgeyAibHBfc3RhcnQiLAkyLCBBVVhSRUcgfSwKLSAgeyAibHBfZW5kIiwJMywgQVVYUkVHIH0sCi0gIHsgImlkZW50aXR5IiwJNCwgQVVYUkVHIH0sCi0gIHsgImRlYnVnIiwJNSwgQVVYUkVHIH0sCi19OwotY29uc3QgaW50IGFyY19yZWdfbmFtZXNfY291bnQgPSBzaXplb2YgKGFyY19yZWdfbmFtZXMpIC8gc2l6ZW9mIChhcmNfcmVnX25hbWVzWzBdKTsKLQotLyogVGhlIHN1ZmZpeCB0YWJsZS4KLSAgIE9wZXJhbmRzIHdpdGggdGhlIHNhbWUgbmFtZSBtdXN0IGJlIHN0b3JlZCB0b2dldGhlci4gICovCi0KLWNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSBhcmNfc3VmZml4ZXNbXSA9Ci17Ci0gIC8qIEVudHJ5IDAgaXMgc3BlY2lhbCwgZGVmYXVsdCB2YWx1ZXMgYXJlbid0IHByaW50ZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gICovCi0gIHsgIiIsIDAsIC0xIH0sCi0gIHsgImFsIiwgMCwgQ09ORCB9LAotICB7ICJyYSIsIDAsIENPTkQgfSwKLSAgeyAiZXEiLCAxLCBDT05EIH0sCi0gIHsgInoiLCAxLCBDT05EIH0sCi0gIHsgIm5lIiwgMiwgQ09ORCB9LAotICB7ICJueiIsIDIsIENPTkQgfSwKLSAgeyAicCIsIDMsIENPTkQgfSwKLSAgeyAicGwiLCAzLCBDT05EIH0sCi0gIHsgIm4iLCA0LCBDT05EIH0sCi0gIHsgIm1pIiwgNCwgQ09ORCB9LAotICB7ICJjIiwgNSwgQ09ORCB9LAotICB7ICJjcyIsIDUsIENPTkQgfSwKLSAgeyAibG8iLCA1LCBDT05EIH0sCi0gIHsgIm5jIiwgNiwgQ09ORCB9LAotICB7ICJjYyIsIDYsIENPTkQgfSwKLSAgeyAiaHMiLCA2LCBDT05EIH0sCi0gIHsgInYiLCA3LCBDT05EIH0sCi0gIHsgInZzIiwgNywgQ09ORCB9LAotICB7ICJudiIsIDgsIENPTkQgfSwKLSAgeyAidmMiLCA4LCBDT05EIH0sCi0gIHsgImd0IiwgOSwgQ09ORCB9LAotICB7ICJnZSIsIDEwLCBDT05EIH0sCi0gIHsgImx0IiwgMTEsIENPTkQgfSwKLSAgeyAibGUiLCAxMiwgQ09ORCB9LAotICB7ICJoaSIsIDEzLCBDT05EIH0sCi0gIHsgImxzIiwgMTQsIENPTkQgfSwKLSAgeyAicG56IiwgMTUsIENPTkQgfSwKLSAgeyAiZiIsIDEsIEZMQUcgfSwKLSAgeyAibmQiLCBBUkNfREVMQVlfTk9ORSwgREVMQVkgfSwKLSAgeyAiZCIsIEFSQ19ERUxBWV9OT1JNQUwsIERFTEFZIH0sCi0gIHsgImpkIiwgQVJDX0RFTEFZX0pVTVAsIERFTEFZIH0sCi0vKnsgImIiLCA3LCBTSVpFRVhUIH0sKi8KLS8qeyAiYiIsIDUsIFNJWkVTRVggfSwqLwotICB7ICJiIiwgMSwgU0laRTEgfSwKLSAgeyAiYiIsIDEsIFNJWkUxMCB9LAotICB7ICJiIiwgMSwgU0laRTIyIH0sCi0vKnsgInciLCA4LCBTSVpFRVhUIH0sKi8KLS8qeyAidyIsIDYsIFNJWkVTRVggfSwqLwotICB7ICJ3IiwgMiwgU0laRTEgfSwKLSAgeyAidyIsIDIsIFNJWkUxMCB9LAotICB7ICJ3IiwgMiwgU0laRTIyIH0sCi0gIHsgIngiLCAxLCBTSUdOMCB9LAotICB7ICJ4IiwgMSwgU0lHTjkgfSwKLSAgeyAiYSIsIDEsIEFERFJFU1MzIH0sCi0gIHsgImEiLCAxLCBBRERSRVNTMTIgfSwKLSAgeyAiYSIsIDEsIEFERFJFU1MyNCB9LAotICB7ICJkaSIsIDEsIENBQ0hFQllQQVNTNSB9LAotICB7ICJkaSIsIDEsIENBQ0hFQllQQVNTMTQgfSwKLSAgeyAiZGkiLCAxLCBDQUNIRUJZUEFTUzI2IH0sCi19OwotY29uc3QgaW50IGFyY19zdWZmaXhlc19jb3VudCA9IHNpemVvZiAoYXJjX3N1ZmZpeGVzKSAvIHNpemVvZiAoYXJjX3N1ZmZpeGVzWzBdKTsKLQotLyogSW5kZXhlZCBieSBmaXJzdCBsZXR0ZXIgb2Ygb3Bjb2RlLiAgUG9pbnRzIHRvIGNoYWluIG9mIG9wY29kZXMgd2l0aCBzYW1lCi0gICBmaXJzdCBsZXR0ZXIuICAqLwotc3RhdGljIHN0cnVjdCBhcmNfb3Bjb2RlICpvcGNvZGVfbWFwWzI2ICsgMV07Ci0KLS8qIEluZGV4ZWQgYnkgaW5zbiBjb2RlLiAgUG9pbnRzIHRvIGNoYWluIG9mIG9wY29kZXMgd2l0aCBzYW1lIGluc24gY29kZS4gICovCi1zdGF0aWMgc3RydWN0IGFyY19vcGNvZGUgKmljb2RlX21hcFszMl07Ci0MCi0vKiBDb25maWd1cmF0aW9uIGZsYWdzLiAgKi8KLQotLyogVmFyaW91cyBBUkNfSEFWRV9YWFggYml0cy4gICovCi1zdGF0aWMgaW50IGNwdV90eXBlOwotCi0vKiBUcmFuc2xhdGUgYSBiZmRfbWFjaF9hcmNfeHh4IHZhbHVlIHRvIGEgQVJDX01BQ0hfWFhYIHZhbHVlLiAgKi8KLQotaW50Ci1hcmNfZ2V0X29wY29kZV9tYWNoIChiZmRfbWFjaCwgYmlnX3ApCi0gICAgIGludCBiZmRfbWFjaCwgYmlnX3A7Ci17Ci0gIHN0YXRpYyBpbnQgbWFjaF90eXBlX21hcFtdID0KLSAgICB7Ci0gICAgICBBUkNfTUFDSF9CQVNFCi0gICAgfTsKLQotICByZXR1cm4gbWFjaF90eXBlX21hcFtiZmRfbWFjaF0gfCAoYmlnX3AgPyBBUkNfTUFDSF9CSUcgOiAwKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhbnkgdGFibGVzIHRoYXQgbmVlZCBpdC4KLSAgIE11c3QgYmUgY2FsbGVkIG9uY2UgYXQgc3RhcnQgdXAgKG9yIHdoZW4gZmlyc3QgbmVlZGVkKS4KLQotICAgRkxBR1MgaXMgYSBzZXQgb2YgYml0cyB0aGF0IHNheSB3aGF0IHZlcnNpb24gb2YgdGhlIGNwdSB3ZSBoYXZlLAotICAgYW5kIGluIHBhcnRpY3VsYXIgYXQgbGVhc3QgKG9uZSBvZikgQVJDX01BQ0hfWFhYLiAgKi8KLQotdm9pZAotYXJjX29wY29kZV9pbml0X3RhYmxlcyAoZmxhZ3MpCi0gICAgIGludCBmbGFnczsKLXsKLSAgc3RhdGljIGludCBpbml0X3AgPSAwOwotCi0gIGNwdV90eXBlID0gZmxhZ3M7Ci0KLSAgLyogV2UgbWF5IGJlIGludGVudGlvbmFsbHkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIChmb3IgZXhhbXBsZSBnZGIgd2lsbCBjYWxsCi0gICAgIHVzIGVhY2ggdGltZSB0aGUgdXNlciBzd2l0Y2hlcyBjcHUpLiAgVGhlc2UgdGFibGVzIG9ubHkgbmVlZCB0byBiZSBpbml0J2QKLSAgICAgb25jZSB0aG91Z2guICAqLwotICAvKiA/Pz8gV2UgY2FuIHJlbW92ZSB0aGUgbmVlZCBmb3IgYXJjX29wY29kZV9zdXBwb3J0ZWQgYnkgdGFraW5nIGl0IGludG8KLSAgICAgYWNjb3VudCBoZXJlLCBidXQgSSdtIG5vdCBzdXJlIEkgd2FudCB0byBkbyB0aGF0IHlldCAoaWYgZXZlcikuICAqLwotICBpZiAoIWluaXRfcCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgaSxuOwotCi0gICAgICBtZW1zZXQgKGFyY19vcGVyYW5kX21hcCwgMCwgc2l6ZW9mIChhcmNfb3BlcmFuZF9tYXApKTsKLSAgICAgIG4gPSBzaXplb2YgKGFyY19vcGVyYW5kcykgLyBzaXplb2YgKGFyY19vcGVyYW5kc1swXSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotCWFyY19vcGVyYW5kX21hcFthcmNfb3BlcmFuZHNbaV0uZm10XSA9IGk7Ci0KLSAgICAgIG1lbXNldCAob3Bjb2RlX21hcCwgMCwgc2l6ZW9mIChvcGNvZGVfbWFwKSk7Ci0gICAgICBtZW1zZXQgKGljb2RlX21hcCwgMCwgc2l6ZW9mIChpY29kZV9tYXApKTsKLSAgICAgIC8qIFNjYW4gdGhlIHRhYmxlIGJhY2t3YXJkcyBzbyBtYWNyb3MgYXBwZWFyIGF0IHRoZSBmcm9udC4gICovCi0gICAgICBmb3IgKGkgPSBhcmNfb3Bjb2Rlc19jb3VudCAtIDE7IGkgPj0gMDsgLS1pKQotCXsKLQkgIGludCBvcGNvZGVfaGFzaCA9IEFSQ19IQVNIX09QQ09ERSAoYXJjX29wY29kZXNbaV0uc3ludGF4KTsKLQkgIGludCBpY29kZV9oYXNoID0gQVJDX0hBU0hfSUNPREUgKGFyY19vcGNvZGVzW2ldLnZhbHVlKTsKLQotCSAgYXJjX29wY29kZXNbaV0ubmV4dF9hc20gPSBvcGNvZGVfbWFwW29wY29kZV9oYXNoXTsKLQkgIG9wY29kZV9tYXBbb3Bjb2RlX2hhc2hdID0gJmFyY19vcGNvZGVzW2ldOwotCi0JICBhcmNfb3Bjb2Rlc1tpXS5uZXh0X2RpcyA9IGljb2RlX21hcFtpY29kZV9oYXNoXTsKLQkgIGljb2RlX21hcFtpY29kZV9oYXNoXSA9ICZhcmNfb3Bjb2Rlc1tpXTsKLQl9Ci0KLSAgICAgIGluaXRfcCA9IDE7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgT1BDT0RFIGlzIHN1cHBvcnRlZCBvbiB0aGUgc3BlY2lmaWVkIGNwdS4KLSAgIENwdSBzZWxlY3Rpb24gaXMgbWFkZSB3aGVuIGNhbGxpbmcgYGFyY19vcGNvZGVfaW5pdF90YWJsZXMnLiAgKi8KLQotaW50Ci1hcmNfb3Bjb2RlX3N1cHBvcnRlZCAob3Bjb2RlKQotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqb3Bjb2RlOwotewotICBpZiAoQVJDX09QQ09ERV9DUFUgKG9wY29kZS0+ZmxhZ3MpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChBUkNfT1BDT0RFX0NQVSAob3Bjb2RlLT5mbGFncykgJiBBUkNfSEFWRV9DUFUgKGNwdV90eXBlKSkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBub24temVybyBpZiBPUFZBTCBpcyBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmllZCBjcHUuCi0gICBDcHUgc2VsZWN0aW9uIGlzIG1hZGUgd2hlbiBjYWxsaW5nIGBhcmNfb3Bjb2RlX2luaXRfdGFibGVzJy4gICovCi0KLWludAotYXJjX29wdmFsX3N1cHBvcnRlZCAob3B2YWwpCi0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqb3B2YWw7Ci17Ci0gIGlmIChBUkNfT1BWQUxfQ1BVIChvcHZhbC0+ZmxhZ3MpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChBUkNfT1BWQUxfQ1BVIChvcHZhbC0+ZmxhZ3MpICYgQVJDX0hBVkVfQ1BVIChjcHVfdHlwZSkpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpcnN0IGluc24gaW4gdGhlIGNoYWluIGZvciBhc3NlbWJsaW5nIElOU04uICAqLwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqCi1hcmNfb3Bjb2RlX2xvb2t1cF9hc20gKGluc24pCi0gICAgIGNvbnN0IGNoYXIgKmluc247Ci17Ci0gIHJldHVybiBvcGNvZGVfbWFwW0FSQ19IQVNIX09QQ09ERSAoaW5zbildOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpcnN0IGluc24gaW4gdGhlIGNoYWluIGZvciBkaXNhc3NlbWJsaW5nIElOU04uICAqLwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqCi1hcmNfb3Bjb2RlX2xvb2t1cF9kaXMgKGluc24pCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotewotICByZXR1cm4gaWNvZGVfbWFwW0FSQ19IQVNIX0lDT0RFIChpbnNuKV07Ci19Ci0MCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIHNlZW4gYW4gJ2YnIHN1ZmZpeCAoaW4gY2VydGFpbiBpbnNucykuICAqLwotc3RhdGljIGludCBmbGFnX3A7Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgZmluaXNoZWQgcHJvY2Vzc2luZyB0aGUgJ2YnIHN1ZmZpeC4gICovCi1zdGF0aWMgaW50IGZsYWdzaGltbV9oYW5kbGVkX3A7Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgc2VlbiBhICdxJyBzdWZmaXggKGNvbmRpdGlvbiBjb2RlKS4gICovCi1zdGF0aWMgaW50IGNvbmRfcDsKLQotLyogTm9uemVybyBpZiB3ZSd2ZSBpbnNlcnRlZCBhIHNoaW1tLiAgKi8KLXN0YXRpYyBpbnQgc2hpbW1fcDsKLQotLyogVGhlIHZhbHVlIG9mIHRoZSBzaGltbSB3ZSBpbnNlcnRlZCAoZWFjaCBpbnNuIG9ubHkgZ2V0cyBvbmUgYnV0IGl0IGNhbgotICAgYXBwZWFyIG11bHRpcGxlIHRpbWVzLiAgKi8KLXN0YXRpYyBpbnQgc2hpbW07Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgaW5zZXJ0ZWQgYSBsaW1tIChkdXJpbmcgYXNzZW1ibHkpIG9yIHNlZW4gYSBsaW1tCi0gICAoZHVyaW5nIGRpc2Fzc2VtYmx5KS4gICovCi1zdGF0aWMgaW50IGxpbW1fcDsKLQotLyogVGhlIHZhbHVlIG9mIHRoZSBsaW1tIHdlIGluc2VydGVkLiAgRWFjaCBpbnNuIG9ubHkgZ2V0cyBvbmUgYnV0IGl0IGNhbgotICAgYXBwZWFyIG11bHRpcGxlIHRpbWVzLiAgKi8KLXN0YXRpYyBsb25nIGxpbW07Ci0MCi0vKiBJbnNlcnRpb24gZnVuY3Rpb25zLiAgKi8KLQotLyogQ2FsbGVkIGJ5IHRoZSBhc3NlbWJsZXIgYmVmb3JlIHBhcnNpbmcgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi12b2lkCi1hcmNfb3Bjb2RlX2luaXRfaW5zZXJ0ICgpCi17Ci0gIGZsYWdfcCA9IDA7Ci0gIGZsYWdzaGltbV9oYW5kbGVkX3AgPSAwOwotICBjb25kX3AgPSAwOwotICBzaGltbV9wID0gMDsKLSAgbGltbV9wID0gMDsKLX0KLQotLyogQ2FsbGVkIGJ5IHRoZSBhc3NlbWJsZXIgdG8gc2VlIGlmIHRoZSBpbnNuIGhhcyBhIGxpbW0gb3BlcmFuZC4KLSAgIEFsc28gY2FsbGVkIGJ5IHRoZSBkaXNhc3NlbWJsZXIgdG8gc2VlIGlmIHRoZSBpbnNuIGNvbnRhaW5zIGEgbGltbS4gICovCi0KLWludAotYXJjX29wY29kZV9saW1tX3AgKGxpbW1wKQotICAgICBsb25nICpsaW1tcDsKLXsKLSAgaWYgKGxpbW1wKQotICAgICpsaW1tcCA9IGxpbW07Ci0gIHJldHVybiBsaW1tX3A7Ci19Ci0KLS8qIEluc2VydCBhIHZhbHVlIGludG8gYSByZWdpc3RlciBmaWVsZC4KLSAgIElmIFJFRyBpcyBOVUxMLCB0aGVuIHRoaXMgaXMgYWN0dWFsbHkgYSBjb25zdGFudC4KLQotICAgV2UgbXVzdCBhbHNvIGhhbmRsZSBhdXhpbGlhcnkgcmVnaXN0ZXJzIGZvciBsci9zciBpbnNucy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X3JlZyAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0KLSAgaWYgKHJlZyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYSBjb25zdGFudCB0aGF0IGFsc28gcmVxdWlyZXMgYSB2YWx1ZSBzdG9yZWQgaW4gYSByZWdpc3RlcgotCSBmaWVsZC4gIEhhbmRsZSB0aGVzZSBieSB1cGRhdGluZyB0aGUgcmVnaXN0ZXIgZmllbGQgYW5kIHNhdmluZyB0aGUKLQkgdmFsdWUgZm9yIGxhdGVyIGhhbmRsaW5nIGJ5IGVpdGhlciAlUyAoc2hpbW0pIG9yICVMIChsaW1tKS4gICovCi0KLSAgICAgIC8qIFRyeSB0byB1c2UgYSBzaGltbSB2YWx1ZSBiZWZvcmUgYSBsaW1tIG9uZS4gICovCi0gICAgICBpZiAoQVJDX1NISU1NX0NPTlNUX1AgKHZhbHVlKQotCSAgLyogSWYgd2UndmUgc2VlbiBhIGNvbmRpdGlvbmFsIHN1ZmZpeCB3ZSBoYXZlIHRvIHVzZSBhIGxpbW0uICAqLwotCSAgJiYgIWNvbmRfcAotCSAgLyogSWYgd2UgYWxyZWFkeSBoYXZlIGEgc2hpbW0gdmFsdWUgdGhhdCBpcyBkaWZmZXJlbnQgdGhhbiBvdXJzCi0JICAgICB3ZSBoYXZlIHRvIHVzZSBhIGxpbW0uICAqLwotCSAgJiYgKCFzaGltbV9wIHx8IHNoaW1tID09IHZhbHVlKSkKLQl7Ci0JICBpbnQgbWFya2VyID0gZmxhZ19wID8gQVJDX1JFR19TSElNTV9VUERBVEUgOiBBUkNfUkVHX1NISU1NOwotCSAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7Ci0JICBzaGltbV9wID0gMTsKLQkgIHNoaW1tID0gdmFsdWU7Ci0JICBpbnNuIHw9IG1hcmtlciA8PCBvcGVyYW5kLT5zaGlmdDsKLQkgIC8qIGluc24gfD0gdmFsdWUgJiA1MTE7IC0gZG9uZSBsYXRlciAqLwotCX0KLSAgICAgIC8qIFdlIGhhdmUgdG8gdXNlIGEgbGltbS4gIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiBvbmUgdGhleSBtdXN0IG1hdGNoLiAgKi8KLSAgICAgIGVsc2UgaWYgKCFsaW1tX3AgfHwgbGltbSA9PSB2YWx1ZSkKLQl7Ci0JICBsaW1tX3AgPSAxOwotCSAgbGltbSA9IHZhbHVlOwotCSAgaW5zbiB8PSBBUkNfUkVHX0xJTU0gPDwgb3BlcmFuZC0+c2hpZnQ7Ci0JICAvKiBUaGUgY29uc3RhbnQgaXMgc3RvcmVkIGxhdGVyLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmVycm1zZyA9IF8oInVuYWJsZSB0byBmaXQgZGlmZmVyZW50IHZhbHVlZCBjb25zdGFudHMgaW50byBpbnN0cnVjdGlvbiIpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIHRvIGhhbmRsZSBib3RoIG5vcm1hbCBhbmQgYXV4aWxpYXJ5IHJlZ2lzdGVycy4gICovCi0KLSAgICAgIGlmIChyZWctPnR5cGUgPT0gQVVYUkVHKQotCXsKLQkgIGlmICghKG1vZHMgJiBBUkNfTU9EX0FVWFJFRykpCi0JICAgICplcnJtc2cgPSBfKCJhdXhpbGlhcnkgcmVnaXN0ZXIgbm90IGFsbG93ZWQgaGVyZSIpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW5zbiB8PSBBUkNfUkVHX1NISU1NIDw8IG9wZXJhbmQtPnNoaWZ0OwotCSAgICAgIGluc24gfD0gcmVnLT52YWx1ZSA8PCBhcmNfb3BlcmFuZHNbcmVnLT50eXBlXS5zaGlmdDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGFuIGludmFsaWQgcmVnaXN0ZXIgbnVtYmVyIGhlcmUuICAqLwotCSAgaWYgKCh1bnNpZ25lZCBpbnQpIHJlZy0+dmFsdWUgPiA2MCkKLQkgICAgewotCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgICAgc3ByaW50ZiAoYnVmLCBfKCJpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciBgJWQnIiksIHJlZy0+dmFsdWUpOwotCSAgICAgICplcnJtc2cgPSBidWY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgaW5zbiB8PSByZWctPnZhbHVlIDw8IG9wZXJhbmQtPnNoaWZ0OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHdlIHNlZSBhbiAnZicgZmxhZy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2ZsYWcgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIC8qIFdlIGNhbid0IHN0b3JlIGFueXRoaW5nIGluIHRoZSBpbnNuIHVudGlsIHdlJ3ZlIHBhcnNlZCB0aGUgcmVnaXN0ZXJzLgotICAgICBKdXN0IHJlY29yZCB0aGUgZmFjdCB0aGF0IHdlJ3ZlIGdvdCB0aGlzIGZsYWcuICBgaW5zZXJ0X3JlZycgd2lsbCB1c2UgaXQKLSAgICAgdG8gc3RvcmUgdGhlIGNvcnJlY3QgdmFsdWUgKEFSQ19SRUdfU0hJTU1fVVBEQVRFIG9yIGJpdCAweDEwMCkuICAqLwotICBmbGFnX3AgPSAxOwotCi0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgYWZ0ZXIgY29tcGxldGVseSBidWlsZGluZyBhbiBpbnNuIHRvIGVuc3VyZSB0aGUgJ2YnIGZsYWcgZ2V0cyBzZXQKLSAgIHByb3Blcmx5LiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdyB0byBzZXQgdGhpcyBmbGFnIHVudGlsCi0gICB3ZSd2ZSBwYXJzZWQgdGhlIHJlZ2lzdGVycy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2ZsYWdmaW5pc2ggKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChmbGFnX3AgJiYgIWZsYWdzaGltbV9oYW5kbGVkX3ApCi0gICAgewotICAgICAgaWYgKHNoaW1tX3ApCi0JYWJvcnQgKCk7Ci0gICAgICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMTsKLSAgICAgIGluc24gfD0gKDEgPDwgb3BlcmFuZC0+c2hpZnQpOwotICAgIH0KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHdlIHNlZSBhIGNvbmRpdGlvbmFsIGZsYWcgKGVnOiAuZXEpLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfY29uZCAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgY29uZF9wID0gMTsKLSAgaW5zbiB8PSAodmFsdWUgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBVc2VkIGluIHRoZSAiaiIgaW5zdHJ1Y3Rpb24gdG8gcHJldmVudCBjb25zdGFudHMgZnJvbSBiZWluZyBpbnRlcnByZXRlZCBhcwotICAgc2hpbW0gdmFsdWVzICh3aGljaCB0aGUganVtcCBpbnNuIGRvZXNuJ3QgYWNjZXB0KS4gIFRoaXMgY2FuIGFsc28gYmUgdXNlZAotICAgdG8gZm9yY2UgdGhlIHVzZSBvZiBsaW1tIHZhbHVlcyBpbiBvdGhlciBzaXR1YXRpb25zIChlZzogbGQgcjAsW2Zvb10gdXNlcwotICAgdGhpcykuCi0gICA/Pz8gVGhlIG1lY2hhbmlzbSBpcyBzb3VuZC4gIEFjY2VzcyB0byBpdCBpcyBhIGJpdCBrbHVua3kgcmlnaHQgbm93LiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfZm9yY2VsaW1tIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBjb25kX3AgPSAxOwotICByZXR1cm4gaW5zbjsKLX0KLQotLyogVXNlZCBpbiBsZC9zdCBpbnNucyB0byBoYW5kbGUgdGhlIHNoaW1tIG9mZnNldCBmaWVsZC4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X3NoaW1tb2Zmc2V0IChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBsb25nIG1pbnZhbCwgbWF4dmFsOwotICBzdGF0aWMgY2hhciBidWZbMTAwXTsKLQotICBpZiAocmVnICE9IE5VTEwpCi0gICAgewotICAgICAgKmVycm1zZyA9ICJyZWdpc3RlciBhcHBlYXJzIHdoZXJlIHNoaW1tIHZhbHVlIGV4cGVjdGVkIjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzICp3YXkqIG1vcmUgZ2VuZXJhbCB0aGFuIG5lY2Vzc2FyeSwgYnV0IG1heWJlIHNvbWUgZGF5IGl0J2xsCi0JIGJlIHVzZWZ1bC4gICovCi0gICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpCi0JewotCSAgbWludmFsID0gLSgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCSAgbWF4dmFsID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtaW52YWwgPSAwOwotCSAgbWF4dmFsID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCX0KLSAgICAgIGlmICh2YWx1ZSA8IG1pbnZhbCB8fCB2YWx1ZSA+IG1heHZhbCkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgc3ByaW50ZiAoYnVmLCBfKCJ2YWx1ZSB3b24ndCBmaXQgaW4gcmFuZ2UgJWxkIC0gJWxkIiksCi0JCSAgIG1pbnZhbCwgbWF4dmFsKTsKLQkgICplcnJtc2cgPSBidWY7Ci0JfQotICAgICAgZWxzZQotCWluc24gfD0gKHZhbHVlICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0OwotICAgIH0KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIFVzZWQgaW4gbGQvc3QgaW5zbnMgd2hlbiB0aGUgc2hpbW0gb2Zmc2V0IGlzIDAuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9zaGltbXplcm8gKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHNoaW1tX3AgPSAxOwotICBzaGltbSA9IDA7Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiBwcm9jZXNzaW5nIG5vcm1hbCBpbnNucyAoZWc6IGFkZCkgdG8gaW5zZXJ0IGEgc2hpbW0KLSAgIHZhbHVlIChpZiBwcmVzZW50KSBpbnRvIHRoZSBpbnNuLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfc2hpbW1maW5pc2ggKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChzaGltbV9wKQotICAgIGluc24gfD0gKHNoaW1tICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0OwotICByZXR1cm4gaW5zbjsKLX0KLQotLyogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZyBub3JtYWwgaW5zbnMgKGVnOiBhZGQpIHRvIGluc2VydCBhIGxpbW0KLSAgIHZhbHVlIChpZiBwcmVzZW50KSBpbnRvIHRoZSBpbnNuLgotCi0gICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGludGVuZGVkIHRvIGhhbmRsZSBpbnN0cnVjdGlvbnMgKHdpdGggNCBieXRlCi0gICBpbW1lZGlhdGUgb3BlcmFuZHMpLiAgSXQgaXMgbm90IGludGVuZGVkIHRvIGhhbmRsZSBkYXRhLiAgKi8KLQotLyogPz8/IEFjdHVhbGx5LCB0aGVyZSdzIG5vdGhpbmcgZm9yIHVzIHRvIGRvIGFzIHdlIGNhbid0IGNhbGwgZnJhZ19tb3JlLCB0aGUKLSAgIGNhbGxlciBtdXN0IGRvIHRoYXQuICBUaGUgZXh0cmFjdCBmbnMgdGFrZSBhIHBvaW50ZXIgdG8gdHdvIHdvcmRzLiAgVGhlCi0gICBpbnNlcnQgZm5zIGNvdWxkIGJlIGNvbnZlcnRlZCBhbmQgdGhlbiB3ZSBjb3VsZCBkbyBzb21ldGhpbmcgdXNlZnVsLCBidXQKLSAgIHRoZW4gdGhlIHJlbG9jIGhhbmRsZXJzIHdvdWxkIGhhdmUgdG8ga25vdyB0byB3b3JrIG9uIHRoZSBzZWNvbmQgd29yZCBvZgotICAgYSAyIHdvcmQgcXVhbnRpdHkuICBUaGF0J3MgdG9vIG11Y2ggc28gd2UgZG9uJ3QgaGFuZGxlIHRoZW0uICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9saW1tZmluaXNoIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAobGltbV9wKQotICAgIDsgLyogbm90aGluZyB0byBkbywgZ2FzIGRvZXMgaXQgKi8KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIHVuYXJ5IG9wZXJhbmQgbWFjcm9zIHRvIGNvcHkgdGhlIEIgZmllbGQgdG8gQy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X3Vub3BtYWNybyAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaW5zbiB8PSAoKGluc24gPj4gQVJDX1NISUZUX1JFR0IpICYgQVJDX01BU0tfUkVHKSA8PCBvcGVyYW5kLT5zaGlmdDsKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIEluc2VydCBhIHJlbGF0aXZlIGFkZHJlc3MgZm9yIGEgYnJhbmNoIGluc24gKGIsIGJsLCBvciBscCkuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9yZWxhZGRyIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAodmFsdWUgJiAzKQotICAgICplcnJtc2cgPSBfKCJicmFuY2ggYWRkcmVzcyBub3Qgb24gNCBieXRlIGJvdW5kYXJ5Iik7Ci0gIGluc24gfD0gKCh2YWx1ZSA+PiAyKSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdDsKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIEluc2VydCBhIGxpbW0gdmFsdWUgYXMgYSAyNiBiaXQgYWRkcmVzcyByaWdodCBzaGlmdGVkIDIgaW50byB0aGUgaW5zbi4KLQotICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCB0byBoYW5kbGUgaW5zdHJ1Y3Rpb25zICh3aXRoIDQgYnl0ZQotICAgaW1tZWRpYXRlIG9wZXJhbmRzKS4gIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBoYW5kbGUgZGF0YS4gICovCi0KLS8qID8/PyBBY3R1YWxseSwgdGhlcmUncyBub3RoaW5nIGZvciB1cyB0byBkbyBhcyB3ZSBjYW4ndCBjYWxsIGZyYWdfbW9yZSwgdGhlCi0gICBjYWxsZXIgbXVzdCBkbyB0aGF0LiAgVGhlIGV4dHJhY3QgZm5zIHRha2UgYSBwb2ludGVyIHRvIHR3byB3b3Jkcy4gIFRoZQotICAgaW5zZXJ0IGZucyBjb3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHRoZW4gd2UgY291bGQgZG8gc29tZXRoaW5nIHVzZWZ1bCwgYnV0Ci0gICB0aGVuIHRoZSByZWxvYyBoYW5kbGVycyB3b3VsZCBoYXZlIHRvIGtub3cgdG8gd29yayBvbiB0aGUgc2Vjb25kIHdvcmQgb2YKLSAgIGEgMiB3b3JkIHF1YW50aXR5LiAgVGhhdCdzIHRvbyBtdWNoIHNvIHdlIGRvbid0IGhhbmRsZSB0aGVtLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfYWJzYWRkciAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGxpbW1fcCkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgcmV0dXJuIGluc247Ci19Ci0MCi0vKiBFeHRyYWN0aW9uIGZ1bmN0aW9ucy4KLQotICAgVGhlIHN1ZmZpeCBleHRyYWN0aW9uIGZ1bmN0aW9ucycgcmV0dXJuIHZhbHVlIGlzIHJlZHVuZGFudCBzaW5jZSBpdCBjYW4gYmUKLSAgIG9idGFpbmVkIGZyb20gKCpPUFZBTCktPnZhbHVlLiAgSG93ZXZlciwgdGhlIGJvb2xlYW4gc3VmZml4ZXMgZG9uJ3QgaGF2ZQotICAgYSBzdWZmaXggdGFibGUgZW50cnkgZm9yIHRoZSAiZmFsc2UiIGNhc2UsIHNvIHZhbHVlcyBvZiB6ZXJvIG11c3QgYmUKLSAgIG9idGFpbmVkIGZyb20gdGhlIHJldHVybiB2YWx1ZSAoKk9QVkFMID09IE5VTEwpLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqbG9va3VwX3JlZ2lzdGVyIChpbnQgdHlwZSwgbG9uZyByZWdubyk7Ci0KLS8qIENhbGxlZCBieSB0aGUgZGlzYXNzZW1ibGVyIGJlZm9yZSBwcmludGluZyBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXZvaWQKLWFyY19vcGNvZGVfaW5pdF9leHRyYWN0ICgpCi17Ci0gIGZsYWdfcCA9IDA7Ci0gIGZsYWdzaGltbV9oYW5kbGVkX3AgPSAwOwotICBzaGltbV9wID0gMDsKLSAgbGltbV9wID0gMDsKLX0KLQotLyogQXMgd2UncmUgZXh0cmFjdGluZyByZWdpc3RlcnMsIGtlZXAgYW4gZXllIG91dCBmb3IgdGhlICdmJyBpbmRpY2F0b3IKLSAgIChBUkNfUkVHX1NISU1NX1VQREFURSkuICBJZiB3ZSBmaW5kIGEgcmVnaXN0ZXIgKG5vdCBhIGNvbnN0YW50IG1hcmtlciwKLSAgIGxpa2UgQVJDX1JFR19TSElNTSksIHNldCBPUFZBTCBzbyBvdXIgY2FsbGVyIHdpbGwga25vdyB0aGlzIGlzIGEgcmVnaXN0ZXIuCi0KLSAgIFdlIG11c3QgYWxzbyBoYW5kbGUgYXV4aWxpYXJ5IHJlZ2lzdGVycyBmb3IgbHIvc3IgaW5zbnMuICBUaGV5IGFyZSBqdXN0Ci0gICBjb25zdGFudHMgd2l0aCBzcGVjaWFsIG5hbWVzLiAgKi8KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfcmVnIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGludCByZWdubzsKLSAgbG9uZyB2YWx1ZTsKLQotICAvKiBHZXQgdGhlIHJlZ2lzdGVyIG51bWJlci4gICovCi0gIHJlZ25vID0gKGluc25bMF0gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0KLSAgLyogSXMgaXQgYSBjb25zdGFudCBtYXJrZXI/ICAqLwotICBpZiAocmVnbm8gPT0gQVJDX1JFR19TSElNTSkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGluc25bMF0gJiA1MTE7Ci0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotCSAgJiYgKHZhbHVlICYgMjU2KSkKLQl2YWx1ZSAtPSA1MTI7Ci0gICAgICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlZ25vID09IEFSQ19SRUdfU0hJTU1fVVBEQVRFKQotICAgIHsKLSAgICAgIHZhbHVlID0gaW5zblswXSAmIDUxMTsKLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpCi0JICAmJiAodmFsdWUgJiAyNTYpKQotCXZhbHVlIC09IDUxMjsKLSAgICAgIGZsYWdfcCA9IDE7Ci0gICAgICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlZ25vID09IEFSQ19SRUdfTElNTSkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGluc25bMV07Ci0gICAgICBsaW1tX3AgPSAxOwotICAgIH0KLSAgLyogSXQncyBhIHJlZ2lzdGVyLCBzZXQgT1BWQUwgKHRoYXQncyB0aGUgb25seSB3YXkgd2UgZGlzdGluZ3Vpc2ggcmVnaXN0ZXJzCi0gICAgIGZyb20gY29uc3RhbnRzIGhlcmUpLiAgKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnID0gbG9va3VwX3JlZ2lzdGVyIChSRUcsIHJlZ25vKTsKLQotICAgICAgaWYgKHJlZyA9PSBOVUxMKQotCWFib3J0ICgpOwotICAgICAgaWYgKG9wdmFsICE9IE5VTEwpCi0JKm9wdmFsID0gcmVnOwotICAgICAgdmFsdWUgPSByZWdubzsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBmaWVsZCB0YWtlcyBhbiBhdXhpbGlhcnkgcmVnaXN0ZXIsIHNlZSBpZiBpdCdzIGEga25vd24gb25lLiAgKi8KLSAgaWYgKChtb2RzICYgQVJDX01PRF9BVVhSRUcpCi0gICAgICAmJiBBUkNfUkVHX0NPTlNUQU5UX1AgKHJlZ25vKSkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZyA9IGxvb2t1cF9yZWdpc3RlciAoQVVYUkVHLCB2YWx1ZSk7Ci0KLSAgICAgIC8qIFRoaXMgaXMgcmVhbGx5IGEgY29uc3RhbnQsIGJ1dCB0ZWxsIHRoZSBjYWxsZXIgaXQgaGFzIGEgc3BlY2lhbAotCSBuYW1lLiAgKi8KLSAgICAgIGlmIChyZWcgIT0gTlVMTCAmJiBvcHZhbCAhPSBOVUxMKQotCSpvcHZhbCA9IHJlZzsKLSAgICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAiZmxhZyB1cGRhdGUiIGZpZWxkIGZvciBzaGltbSBpbnNucy4KLSAgIFRoaXMgdmFsdWUgaXMgYWN0dWFsbHkgc3RvcmVkIGluIHRoZSByZWdpc3RlciBmaWVsZC4gICovCi0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2ZsYWcgKGluc24sIG9wZXJhbmQsIG1vZHMsIG9wdmFsLCBpbnZhbGlkKQotICAgICBhcmNfaW5zbiAqaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWw7Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaW50IGY7Ci0gIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqdmFsOwotCi0gIGlmIChmbGFnc2hpbW1faGFuZGxlZF9wKQotICAgIGYgPSBmbGFnX3AgIT0gMDsKLSAgZWxzZQotICAgIGYgPSAoaW5zblswXSAmICgxIDw8IG9wZXJhbmQtPnNoaWZ0KSkgIT0gMDsKLQotICAvKiBUaGVyZSBpcyBubyB0ZXh0IGZvciB6ZXJvIHZhbHVlcy4gICovCi0gIGlmIChmID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgdmFsID0gYXJjX29wY29kZV9sb29rdXBfc3VmZml4IChvcGVyYW5kLCAxKTsKLSAgaWYgKG9wdmFsICE9IE5VTEwgJiYgdmFsICE9IE5VTEwpCi0gICAgKm9wdmFsID0gdmFsOwotICByZXR1cm4gdmFsLT52YWx1ZTsKLX0KLQotLyogRXh0cmFjdCB0aGUgY29uZGl0aW9uIGNvZGUgKGlmIGl0IGV4aXN0cykuCi0gICBJZiB3ZSd2ZSBzZWVuIGEgc2hpbW0gdmFsdWUgaW4gdGhpcyBpbnNuIChtZWFuaW5nIHRoYXQgdGhlIGluc24gY2FuJ3QgaGF2ZQotICAgYSBjb25kaXRpb24gY29kZSBmaWVsZCksIHRoZW4gd2UgZG9uJ3Qgc3RvcmUgYW55dGhpbmcgaW4gT1BWQUwgYW5kIHJldHVybgotICAgemVyby4gICovCi0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2NvbmQgKGluc24sIG9wZXJhbmQsIG1vZHMsIG9wdmFsLCBpbnZhbGlkKQotICAgICBhcmNfaW5zbiAqaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWw7Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgbG9uZyBjb25kOwotICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnZhbDsKLQotICBpZiAoZmxhZ3NoaW1tX2hhbmRsZWRfcCkKLSAgICByZXR1cm4gMDsKLQotICBjb25kID0gKGluc25bMF0gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0gIHZhbCA9IGFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAob3BlcmFuZCwgY29uZCk7Ci0KLSAgLyogSWdub3JlIE5VTEwgdmFsdWVzIG9mIGB2YWwnLiAgU2V2ZXJhbCBjb25kaXRpb24gY29kZSB2YWx1ZXMgYXJlCi0gICAgIHJlc2VydmVkIGZvciBleHRlbnNpb25zLiAgKi8KLSAgaWYgKG9wdmFsICE9IE5VTEwgJiYgdmFsICE9IE5VTEwpCi0gICAgKm9wdmFsID0gdmFsOwotICByZXR1cm4gY29uZDsKLX0KLQotLyogRXh0cmFjdCBhIGJyYW5jaCBhZGRyZXNzLgotICAgV2UgcmV0dXJuIHRoZSB2YWx1ZSBhcyBhIHJlYWwgYWRkcmVzcyAobm90IHJpZ2h0IHNoaWZ0ZWQgYnkgMikuICAqLwotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9yZWxhZGRyIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgYWRkcjsKLQotICBhZGRyID0gKGluc25bMF0gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0gIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpCi0gICAgICAmJiAoYWRkciAmICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpKSkKLSAgICBhZGRyIC09IDEgPDwgb3BlcmFuZC0+Yml0czsKLQotICByZXR1cm4gYWRkciA8PCAyOwotfQotCi0vKiBUaGUgb25seSB0aGluZyB0aGlzIGRvZXMgaXMgc2V0IHRoZSBgaW52YWxpZCcgZmxhZyBpZiBCICE9IEMuCi0gICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSAibW92IiBtYWNybyBhcHBlYXJzIGJlZm9yZSBpdCdzIHJlYWwgaW5zbiAiYW5kIgotICAgYW5kIHdlIGRvbid0IHdhbnQgdGhlIGRpc2Fzc2VtYmxlciB0byBjb25mdXNlIHRoZW0uICAqLwotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF91bm9wbWFjcm8gKGluc24sIG9wZXJhbmQsIG1vZHMsIG9wdmFsLCBpbnZhbGlkKQotICAgICBhcmNfaW5zbiAqaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWw7Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgLyogVGhpcyBtaXNzZXMgdGhlIGNhc2Ugd2hlcmUgQiA9PSBBUkNfUkVHX1NISU1NX1VQREFURSAmJgotICAgICBDID09IEFSQ19SRUdfU0hJTU0gKG9yIHZpY2UgdmVyc2EpLiAgTm8gYmlnIGRlYWwuICBUaG9zZSBpbnNucyB3aWxsIGdldAotICAgICBwcmludGVkIGFzICJhbmQicy4gICovCi0gIGlmICgoKGluc25bMF0gPj4gQVJDX1NISUZUX1JFR0IpICYgQVJDX01BU0tfUkVHKQotICAgICAgIT0gKChpbnNuWzBdID4+IEFSQ19TSElGVF9SRUdDKSAmIEFSQ19NQVNLX1JFRykpCi0gICAgaWYgKGludmFsaWQgIT0gTlVMTCkKLSAgICAgICppbnZhbGlkID0gMTsKLQotICByZXR1cm4gMDsKLX0KLQotLyogVXRpbGl0eSBmb3IgdGhlIGV4dHJhY3Rpb24gZnVuY3Rpb25zIHRvIHJldHVybiB0aGUgaW5kZXggaW50bwotICAgYGFyY19zdWZmaXhlcycuICAqLwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKgotYXJjX29wY29kZV9sb29rdXBfc3VmZml4ICh0eXBlLCB2YWx1ZSkKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICp0eXBlOwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqdiwqZW5kOwotCi0gIC8qID8/PyBUaGlzIGlzIGEgbGl0dGxlIHNsb3cgYW5kIGNhbiBiZSBzcGVlZGVkIHVwLiAgKi8KLQotICBmb3IgKHYgPSBhcmNfc3VmZml4ZXMsIGVuZCA9IGFyY19zdWZmaXhlcyArIGFyY19zdWZmaXhlc19jb3VudDsgdiA8IGVuZDsgKyt2KQotICAgIGlmICh0eXBlID09ICZhcmNfb3BlcmFuZHNbdi0+dHlwZV0KLQkmJiB2YWx1ZSA9PSB2LT52YWx1ZSkKLSAgICAgIHJldHVybiB2OwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqCi1sb29rdXBfcmVnaXN0ZXIgKHR5cGUsIHJlZ25vKQotICAgICBpbnQgdHlwZTsKLSAgICAgbG9uZyByZWdubzsKLXsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyLCplbmQ7Ci0KLSAgaWYgKHR5cGUgPT0gUkVHKQotICAgIHJldHVybiAmYXJjX3JlZ19uYW1lc1tyZWdub107Ci0KLSAgLyogPz8/IFRoaXMgaXMgYSBsaXR0bGUgc2xvdyBhbmQgY2FuIGJlIHNwZWVkZWQgdXAuICAqLwotCi0gIGZvciAociA9IGFyY19yZWdfbmFtZXMsIGVuZCA9IGFyY19yZWdfbmFtZXMgKyBhcmNfcmVnX25hbWVzX2NvdW50OwotICAgICAgIHIgPCBlbmQ7ICsrcikKLSAgICBpZiAodHlwZSA9PSByLT50eXBlCSYmIHJlZ25vID09IHItPnZhbHVlKQotICAgICAgcmV0dXJuIHI7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hcm0tZGlzLmMgYi9vcGNvZGVzL2FybS1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM0NGJmOC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FybS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDk2OSArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBwcmludGluZyBjb2RlIGZvciB0aGUgQVJNCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0gICBNb2RpZmljYXRpb24gYnkgSmFtZXMgRy4gU21pdGggKGpzbWl0aEBjeWdudXMuY28udWspCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYm9wY29kZXMuIAotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgotdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLiAKLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi1BTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLW1vcmUgZGV0YWlscy4gCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgImFybS1vcGMuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBGSVhNRTogVGhpcyBzaG91bGRuJ3QgYmUgZG9uZSBoZXJlICovCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImVsZi9hcm0uaCIKLQotc3RhdGljIGNoYXIgKiBhcm1fY29uZGl0aW9uYWxbXSA9Ci17ImVxIiwgIm5lIiwgImNzIiwgImNjIiwgIm1pIiwgInBsIiwgInZzIiwgInZjIiwKLSAiaGkiLCAibHMiLCAiZ2UiLCAibHQiLCAiZ3QiLCAibGUiLCAiIiwgIm52In07Ci0KLXN0YXRpYyBjaGFyICogYXJtX3JlZ25hbWVzX3Jhd1tdID0KLXsicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLAotICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSJ9OwotCi1zdGF0aWMgY2hhciAqIGFybV9yZWduYW1lc19zdGFuZGFyZFtdID0KLXsicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLAotICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJzcCIsICJsciIsICJwYyJ9OwotCi1zdGF0aWMgY2hhciAqIGFybV9yZWduYW1lc19hcGNzW10gPQoteyJhMSIsICJhMiIsICJhMyIsICJhNCIsICJ2MSIsICJ2MiIsICJ2MyIsICJ2NCIsCi0gInY1IiwgInY2IiwgInNsIiwgImZwIiwgImlwIiwgInNwIiwgImxyIiwgInBjIn07Ci0KLS8qIENob29zZSB3aGljaCByZWdpc3RlciBuYW1lIHNldCB0byB1c2UuICAqLwotc3RhdGljIGNoYXIgKiogYXJtX3JlZ25hbWVzID0gYXJtX3JlZ25hbWVzX3N0YW5kYXJkOwotCi1zdGF0aWMgY2hhciAqIGFybV9mcF9jb25zdFtdID0KLXsiMC4wIiwgIjEuMCIsICIyLjAiLCAiMy4wIiwgIjQuMCIsICI1LjAiLCAiMC41IiwgIjEwLjAifTsKLQotc3RhdGljIGNoYXIgKiBhcm1fc2hpZnRbXSA9IAoteyJsc2wiLCAibHNyIiwgImFzciIsICJyb3IifTsKLQotc3RhdGljIGludCBwcmludF9pbnNuX2FybQotICBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci0KLXN0YXRpYyB2b2lkCi1hcm1fZGVjb2RlX3NoaWZ0IChnaXZlbiwgZnVuYywgc3RyZWFtKQotICAgICBsb25nIGdpdmVuOwotICAgICBmcHJpbnRmX2Z0eXBlIGZ1bmM7Ci0gICAgIHZvaWQgKiBzdHJlYW07Ci17Ci0gIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW2dpdmVuICYgMHhmXSk7Ci0gIAotICBpZiAoKGdpdmVuICYgMHhmZjApICE9IDApCi0gICAgewotICAgICAgaWYgKChnaXZlbiAmIDB4MTApID09IDApCi0JewotCSAgaW50IGFtb3VudCA9IChnaXZlbiAmIDB4ZjgwKSA+PiA3OwotCSAgaW50IHNoaWZ0ID0gKGdpdmVuICYgMHg2MCkgPj4gNTsKLQkgIAotCSAgaWYgKGFtb3VudCA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHNoaWZ0ID09IDMpCi0JCXsKLQkJICBmdW5jIChzdHJlYW0sICIsIHJyeCIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIAotCSAgICAgIGFtb3VudCA9IDMyOwotCSAgICB9Ci0JICAKLQkgIGZ1bmMgKHN0cmVhbSwgIiwgJXMgIyVkIiwgYXJtX3NoaWZ0W3NoaWZ0XSwgYW1vdW50KTsKLQl9Ci0gICAgICBlbHNlCi0JZnVuYyAoc3RyZWFtLCAiLCAlcyAlcyIsIGFybV9zaGlmdFsoZ2l2ZW4gJiAweDYwKSA+PiA1XSwKLQkgICAgICBhcm1fcmVnbmFtZXNbKGdpdmVuICYgMHhmMDApID4+IDhdKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIFBDIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKGFsd2F5cyA0IG9uIEFSTSkuICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fYXJtIChwYywgaW5mbywgZ2l2ZW4pCi0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLSAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICBnaXZlbjsKLXsKLSAgc3RydWN0IGFybV9vcGNvZGUgKiAgaW5zbjsKLSAgdm9pZCAqICAgICAgICAgICAgICAgc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBmcHJpbnRmX2Z0eXBlICAgICAgICBmdW5jICAgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0KLSAgZm9yIChpbnNuID0gYXJtX29wY29kZXM7IGluc24tPmFzc2VtYmxlcjsgaW5zbisrKQotICAgIHsKLSAgICAgIGlmICgoZ2l2ZW4gJiBpbnNuLT5tYXNrKSA9PSBpbnNuLT52YWx1ZSkKLQl7Ci0JICBjaGFyICogYzsKLQkgIAotCSAgZm9yIChjID0gaW5zbi0+YXNzZW1ibGVyOyAqYzsgYysrKQotCSAgICB7Ci0JICAgICAgaWYgKCpjID09ICclJykKLQkJewotCQkgIHN3aXRjaCAoKisrYykKLQkJICAgIHsKLQkJICAgIGNhc2UgJyUnOgotCQkgICAgICBmdW5jIChzdHJlYW0sICIlJSIpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnYSc6Ci0JCSAgICAgIGlmICgoKGdpdmVuICYgMHgwMDBmMDAwMCkgPT0gMHgwMDBmMDAwMCkKLQkJCSAgJiYgKChnaXZlbiAmIDB4MDIwMDAwMDApID09IDApKQotCQkJewotCQkJICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmZjsKLQkJCSAgCi0JCQkgIGZ1bmMgKHN0cmVhbSwgIltwYyIpOwotIAotCQkJICBpZiAoZ2l2ZW4gJiAweDAxMDAwMDAwKQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCW9mZnNldCA9IC0gb2Zmc2V0OwotCQkJICAKLQkJCSAgICAgIC8qIHByZS1pbmRleGVkICovCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIsICMleF0iLCBvZmZzZXQpOwotCi0JCQkgICAgICBvZmZzZXQgKz0gcGMgKyA4OwotCi0JCQkgICAgICAvKiBDb3BlIHdpdGggdGhlIHBvc3NpYmlsaXR5IG9mIHdyaXRlLWJhY2sgYmVpbmcgdXNlZC4KLQkJCQkgUHJvYmFibHkgYSB2ZXJ5IGRhbmdlcm91cyB0aGluZyBmb3IgdGhlIHByb2dyYW1tZXIKLQkJCQkgdG8gZG8sIGJ1dCB3aG8gYXJlIHdlIHRvIGFyZ3VlID8gICovCi0JCQkgICAgICBpZiAoZ2l2ZW4gJiAweDAwMjAwMDAwKQotCQkJCWZ1bmMgKHN0cmVhbSwgIiEiKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBwb3N0IGluZGV4ZWQgKi8KLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIl0sICMleCIsIG9mZnNldCk7Ci0KLQkJCSAgICAgIG9mZnNldCA9IHBjICsgODsgIC8qIGllIGlnbm9yZSB0aGUgb2Zmc2V0ICovCi0JCQkgICAgfQotCQkJICAKLQkJCSAgZnVuYyAoc3RyZWFtLCAiXHQ7ICIpOwotCQkJICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKG9mZnNldCwgaW5mbyk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgZnVuYyAoc3RyZWFtLCAiWyVzIiwgCi0JCQkJYXJtX3JlZ25hbWVzWyhnaXZlbiA+PiAxNikgJiAweGZdKTsKLQkJCSAgaWYgKChnaXZlbiAmIDB4MDEwMDAwMDApICE9IDApCi0JCQkgICAgewotCQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDIwMDAwMDApID09IDApCi0JCQkJewotCQkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZmY7Ci0JCQkJICBpZiAob2Zmc2V0KQotCQkJCSAgICBmdW5jIChzdHJlYW0sICIsICVzIyVkIiwKLQkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBmdW5jIChzdHJlYW0sICIsICVzIiwKLQkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgPyAiLSIgOiAiIikpOwotCQkJCSAgYXJtX2RlY29kZV9zaGlmdCAoZ2l2ZW4sIGZ1bmMsIHN0cmVhbSk7Ci0JCQkJfQotCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICJdJXMiLCAKLQkJCQkgICAgKChnaXZlbiAmIDB4MDAyMDAwMDApICE9IDApID8gIiEiIDogIiIpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSA9PSAwKQotCQkJCXsKLQkJCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmZmOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSwgJXMjJWQiLAotCQkJCQkgICgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJICAgPyAiLSIgOiAiIiksIG9mZnNldCk7Ci0JCQkJICBlbHNlIAotCQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIGZ1bmMgKHN0cmVhbSwgIl0sICVzIiwKLQkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKSAKLQkJCQkJID8gIi0iIDogIiIpKTsKLQkJCQkgIGFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0pOwotCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdzJzoKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdpdmVuICYgMHgwMDRmMDAwMCkgPT0gMHgwMDRmMDAwMCkKLQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUEMgcmVsYXRpdmUgd2l0aCBpbW1lZGlhdGUgb2Zmc2V0ICovCi0JCQkgIGludCBvZmZzZXQgPSAoKGdpdmVuICYgMHhmMDApID4+IDQpIHwgKGdpdmVuICYgMHhmKTsKLQkJCSAgCi0JCQkgIGlmICgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJICAgIG9mZnNldCA9IC1vZmZzZXQ7Ci0JCQkgIAotCQkJICBmdW5jIChzdHJlYW0sICJbcGMsICMleF1cdDsgIiwgb2Zmc2V0KTsKLQkJCSAgCi0JCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCQkJICAgIChvZmZzZXQgKyBwYyArIDgsIGluZm8pOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIlslcyIsIAotCQkJCWFybV9yZWduYW1lc1soZ2l2ZW4gPj4gMTYpICYgMHhmXSk7Ci0JCQkgIGlmICgoZ2l2ZW4gJiAweDAxMDAwMDAwKSAhPSAwKQotCQkJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZS1pbmRleGVkICovCi0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDQwMDAwMCkgPT0gMHgwMDQwMDAwMCkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9ICgoZ2l2ZW4gJiAweGYwMCkgPj4gNCkgfCAoZ2l2ZW4gJiAweGYpOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyMlZCIsCi0JCQkJCSAgKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgICA/ICItIiA6ICIiKSwgb2Zmc2V0KTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyICovCi0JCQkJICBmdW5jIChzdHJlYW0sICIsICVzJXMiLAotCQkJCQkoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSA/ICItIiA6ICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fcmVnbmFtZXNbZ2l2ZW4gJiAweGZdKTsKLQkJCQl9Ci0KLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIl0lcyIsIAotCQkJCSAgICAoKGdpdmVuICYgMHgwMDIwMDAwMCkgIT0gMCkgPyAiISIgOiAiIik7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdC1pbmRleGVkICovCi0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDQwMDAwMCkgPT0gMHgwMDQwMDAwMCkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9ICgoZ2l2ZW4gJiAweGYwMCkgPj4gNCkgfCAoZ2l2ZW4gJiAweGYpOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSwgJXMjJWQiLAotCQkJCQkgICgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJICAgPyAiLSIgOiAiIiksIG9mZnNldCk7Ci0JCQkJICBlbHNlIAotCQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciAqLwotCQkJCSAgZnVuYyAoc3RyZWFtLCAiXSwgJXMlcyIsCi0JCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJID8gIi0iIDogIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9yZWduYW1lc1tnaXZlbiAmIDB4Zl0pOwotCQkJCX0KLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkJICAKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkJCShCRElTUCAoZ2l2ZW4pICogNCArIHBjICsgOCwgaW5mbyk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdjJzoKLQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLAotCQkJICAgIGFybV9jb25kaXRpb25hbCBbKGdpdmVuID4+IDI4KSAmIDB4Zl0pOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnbSc6Ci0JCSAgICAgIHsKLQkJCWludCBzdGFydGVkID0gMDsKLQkJCWludCByZWc7Ci0KLQkJCWZ1bmMgKHN0cmVhbSwgInsiKTsKLQkJCWZvciAocmVnID0gMDsgcmVnIDwgMTY7IHJlZysrKQotCQkJICBpZiAoKGdpdmVuICYgKDEgPDwgcmVnKSkgIT0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoc3RhcnRlZCkKLQkJCQlmdW5jIChzdHJlYW0sICIsICIpOwotCQkJICAgICAgc3RhcnRlZCA9IDE7Ci0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLQkJCSAgICB9Ci0JCQlmdW5jIChzdHJlYW0sICJ9Iik7Ci0JCSAgICAgIH0KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ28nOgotCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMjAwMDAwMCkgIT0gMCkKLQkJCXsKLQkJCSAgaW50IHJvdGF0ZSA9IChnaXZlbiAmIDB4ZjAwKSA+PiA3OwotCQkJICBpbnQgaW1tZWQgPSAoZ2l2ZW4gJiAweGZmKTsKLQkJCSAgaW1tZWQgPSAoKChpbW1lZCA8PCAoMzIgLSByb3RhdGUpKQotCQkJCSAgICB8IChpbW1lZCA+PiByb3RhdGUpKSAmIDB4ZmZmZmZmZmYpOwotCQkJICBmdW5jIChzdHJlYW0sICIjJWRcdDsgMHgleCIsIGltbWVkLCBpbW1lZCk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCWFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0pOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAncCc6Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwMDBmMDAwKSA9PSAweDAwMDBmMDAwKQotCQkJZnVuYyAoc3RyZWFtLCAicCIpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAndCc6Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAxMjAwMDAwKSA9PSAweDAwMjAwMDAwKQotCQkJZnVuYyAoc3RyZWFtLCAidCIpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnaCc6Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwMDAwMDIwKSA9PSAweDAwMDAwMDIwKQotCQkJZnVuYyAoc3RyZWFtLCAiaCIpOwotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgImIiKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ0EnOgotCQkgICAgICBmdW5jIChzdHJlYW0sICJbJXMiLCBhcm1fcmVnbmFtZXMgWyhnaXZlbiA+PiAxNikgJiAweGZdKTsKLQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDEwMDAwMDApICE9IDApCi0JCQl7Ci0JCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmY7Ci0JCQkgIGlmIChvZmZzZXQpCi0JCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyMlZF0lcyIsCi0JCQkJICAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCA/ICItIiA6ICIiKSwKLQkJCQkgIG9mZnNldCAqIDQsCi0JCQkJICAoKGdpdmVuICYgMHgwMDIwMDAwMCkgIT0gMCA/ICIhIiA6ICIiKSk7Ci0JCQkgIGVsc2UKLQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZjsKLQkJCSAgaWYgKG9mZnNldCkKLQkJCSAgICBmdW5jIChzdHJlYW0sICJdLCAlcyMlZCIsCi0JCQkJICAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCA/ICItIiA6ICIiKSwKLQkJCQkgIG9mZnNldCAqIDQpOwotCQkJICBlbHNlCi0JCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOwotCQkJfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnQyc6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDAwMDkwMDAwKQotCQkJewotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiXz8/PyIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg5MDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiX2FsbCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgxMDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiX2N0bCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg4MDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiX2ZsZyIpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ0YnOgotCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHgwMDQwODAwMCkKLQkJCXsKLQkJCWNhc2UgMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiNCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg4MDAwOgotCQkJICBmdW5jIChzdHJlYW0sICIxIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDAwNDAwMDAwOgotCQkJICBmdW5jIChzdHJlYW0sICIyIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiMyIpOwotCQkJfQotCQkgICAgICBicmVhazsKLQkJCQotCQkgICAgY2FzZSAnUCc6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDAwMDgwMDgwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBmdW5jIChzdHJlYW0sICJzIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDgwOgotCQkJICBmdW5jIChzdHJlYW0sICJkIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDAwMDgwMDAwOgotCQkJICBmdW5jIChzdHJlYW0sICJlIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgZnVuYyAoc3RyZWFtLCBfKCI8aWxsZWdhbCBwcmVjaXNpb24+IikpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdRJzoKLQkJICAgICAgc3dpdGNoIChnaXZlbiAmIDB4MDA0MDgwMDApCi0JCQl7Ci0JCQljYXNlIDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInMiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4ODAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgwMDQwMDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZSIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInAiKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUic6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDYwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBicmVhazsKLQkJCWNhc2UgMHgyMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAicCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg0MDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAibSIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInoiKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IAotCQkgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotCQkgICAgICB7Ci0JCQlpbnQgYml0c3RhcnQgPSAqYysrIC0gJzAnOwotCQkJaW50IGJpdGVuZCA9IDA7Ci0JCQl3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLQkJCSAgYml0c3RhcnQgPSAoYml0c3RhcnQgKiAxMCkgKyAqYysrIC0gJzAnOwotCi0JCQlzd2l0Y2ggKCpjKQotCQkJICB7Ci0JCQkgIGNhc2UgJy0nOgotCQkJICAgIGMrKzsKLQkJCSAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLQkJCSAgICAgIGJpdGVuZCA9IChiaXRlbmQgKiAxMCkgKyAqYysrIC0gJzAnOwotCQkJICAgIGlmICghYml0ZW5kKQotCQkJICAgICAgYWJvcnQgKCk7Ci0JCQkgICAgc3dpdGNoICgqYykKLQkJCSAgICAgIHsKLQkJCSAgICAgIGNhc2UgJ3InOgotCQkJCXsKLQkJCQkgIGxvbmcgcmVnOwotCQkJCSAgcmVnID0gZ2l2ZW4gPj4gYml0c3RhcnQ7Ci0JCQkJICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotCQkJCSAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAnZCc6Ci0JCQkJewotCQkJCSAgbG9uZyByZWc7Ci0JCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLQkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0JCQkJICBmdW5jIChzdHJlYW0sICIlZCIsIHJlZyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAneCc6Ci0JCQkJewotCQkJCSAgbG9uZyByZWc7Ci0JCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLQkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0JCQkJICBmdW5jIChzdHJlYW0sICIweCUwOHgiLCByZWcpOwotCQkJCSAgCi0JCQkJICAvKiBTb21lIFNXSSBpbnN0cnVjdGlvbnMgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzLiAgKi8KLQkJCQkgIGlmICgoZ2l2ZW4gJiAweDBmZmZmZmZmKSA9PSAweDBGRjAwMDAwKQotCQkJCSAgICBmdW5jIChzdHJlYW0sICJcdDsgSU1CIik7Ci0JCQkJICBlbHNlIGlmICgoZ2l2ZW4gJiAweDBmZmZmZmZmKSA9PSAweDBGRjAwMDAxKQotCQkJCSAgICBmdW5jIChzdHJlYW0sICJcdDsgSU1CUmFuZ2UiKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlICdYJzoKLQkJCQl7Ci0JCQkJICBsb25nIHJlZzsKLQkJCQkgIHJlZyA9IGdpdmVuID4+IGJpdHN0YXJ0OwotCQkJCSAgcmVnICY9ICgyIDw8IChiaXRlbmQgLSBiaXRzdGFydCkpIC0gMTsKLQkJCQkgIGZ1bmMgKHN0cmVhbSwgIiUwMXgiLCByZWcgJiAweGYpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgJ2YnOgotCQkJCXsKLQkJCQkgIGxvbmcgcmVnOwotCQkJCSAgcmVnID0gZ2l2ZW4gPj4gYml0c3RhcnQ7Ci0JCQkJICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotCQkJCSAgaWYgKHJlZyA+IDcpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiMlcyIsCi0JCQkJCSAgYXJtX2ZwX2NvbnN0W3JlZyAmIDddKTsKLQkJCQkgIGVsc2UKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiZiVkIiwgcmVnKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBkZWZhdWx0OgotCQkJCWFib3J0ICgpOwotCQkJICAgICAgfQotCQkJICAgIGJyZWFrOwotCQkJICBjYXNlICdgJzoKLQkJCSAgICBjKys7Ci0JCQkgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgPT0gMCkKLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOwotCQkJICAgIGJyZWFrOwotCQkJICBjYXNlICdcJyc6Ci0JCQkgICAgYysrOwotCQkJICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLQkJCSAgICBicmVhazsKLQkJCSAgY2FzZSAnPyc6Ci0JCQkgICAgKytjOwotCQkJICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKyspOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKisrYyk7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGRlZmF1bHQ6Ci0JCQkgICAgYWJvcnQgKCk7Ci0JCQkgIH0KLQkJCWJyZWFrOwotCi0JCSAgICAgIGRlZmF1bHQ6Ci0JCQlhYm9ydCAoKTsKLQkJICAgICAgfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQlmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLQkgICAgfQotCSAgcmV0dXJuIDQ7Ci0JfQotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIFBDIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fdGh1bWIgKHBjLCBpbmZvLCBnaXZlbikKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgIGdpdmVuOwotewotICBzdHJ1Y3QgdGh1bWJfb3Bjb2RlICogaW5zbjsKLSAgdm9pZCAqICAgICAgICAgICAgICAgIHN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByaW50Zl9mdHlwZSAgICAgICAgIGZ1bmMgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0KLSAgZm9yIChpbnNuID0gdGh1bWJfb3Bjb2RlczsgaW5zbi0+YXNzZW1ibGVyOyBpbnNuKyspCi0gICAgewotICAgICAgaWYgKChnaXZlbiAmIGluc24tPm1hc2spID09IGluc24tPnZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciAqIGMgPSBpbnNuLT5hc3NlbWJsZXI7Ci0KLSAgICAgICAgICAvKiBTcGVjaWFsIHByb2Nlc3NpbmcgZm9yIFRodW1iIDIgaW5zdHJ1Y3Rpb24gQkwgc2VxdWVuY2U6ICovCi0gICAgICAgICAgaWYgKCEqYykgLyogY2hlY2sgZm9yIGVtcHR5IChub3QgTlVMTCkgYXNzZW1ibGVyIHN0cmluZyAqLwotICAgICAgICAgICAgewotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDQ7Ci0JICAgICAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgID0gNDsKLQkgICAgICAKLSAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJTA0eFx0YmxcdCIsIGdpdmVuICYgMHhmZmZmKTsKLSAgICAgICAgICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0gICAgICAgICAgICAgICAgKEJESVNQMjMgKGdpdmVuKSAqIDIgKyBwYyArIDQsIGluZm8pOwotICAgICAgICAgICAgICByZXR1cm4gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0JICAgICAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gMjsKLQkgICAgICBpbmZvLT5ieXRlc19wZXJfbGluZSAgPSA0OwotCSAgCSAgICAgIAotICAgICAgICAgICAgICBnaXZlbiAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiUwNHhcdCIsIGdpdmVuKTsKLQkgICAgICAKLSAgICAgICAgICAgICAgZm9yICg7ICpjOyBjKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCpjID09ICclJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGludCBkb21hc2twYyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgaW50IGRvbWFza2xyID0gMDsKLQkJICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgqKytjKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnJSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiUlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IChnaXZlbiA+PiAzKSAmIDB4NzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2l2ZW4gJiAoMSA8PCA2KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyArPSA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVnOwotCQkJICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGdpdmVuICYgMHg3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnaXZlbiAmICgxIDw8IDcpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgKz0gODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX2NvbmRpdGlvbmFsIFsoZ2l2ZW4gPj4gOCkgJiAweGZdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ04nOgotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2l2ZW4gJiAoMSA8PCA4KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21hc2tsciA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqYyA9PSAnTycgJiYgKGdpdmVuICYgKDEgPDwgOCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFza3BjID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGVkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVnOwotCQkJICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgInsiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHNwb3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZXMsIGFuZCBnZW5lcmF0ZSB0aGUgclMtckUgZm9ybWF0OiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocmVnID0gMDsgKHJlZyA8IDgpOyByZWcrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCByZWcpKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9tYXNrbHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICJsciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbWFza3BjKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICJwYyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAifSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzogCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0c3RhcnQgPSAqYysrIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRlbmQgPSAwOwotCQkJICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqYyA+PSAnMCcgJiYgKmMgPD0gJzknKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RhcnQgPSAoYml0c3RhcnQgKiAxMCkgKyAqYysrIC0gJzAnOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgqYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy0nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZWc7Ci0JCQkJICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpjID49ICcwJyAmJiAqYyA8PSAnOScpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRlbmQgPSAoYml0ZW5kICogMTApICsgKmMrKyAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJpdGVuZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGdpdmVuID4+IGJpdHN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgqYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlZCIsIHJlZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdIJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWQiLCByZWcgPDwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdXJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWQiLCByZWcgPDwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhJzoKLQkJCQkgICAgICAvKiBQQy1yZWxhdGl2ZSBhZGRyZXNzIC0tIHRoZSBib3R0b20gdHdvCi0JCQkJCSBiaXRzIG9mIHRoZSBhZGRyZXNzIGFyZSBkcm9wcGVkIGJlZm9yZQotCQkJCQkgdGhlIGNhbGN1bGF0aW9uLiAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jCi0JCQkJCSgoKHBjICsgNCkgJiB+MykgKyAocmVnIDw8IDIpLCBpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIweCUwNHgiLCByZWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9ICgocmVnIF4gKDEgPDwgYml0ZW5kKSkgLSAoMSA8PCBiaXRlbmQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWQiLCByZWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9ICgocmVnIF4gKDEgPDwgYml0ZW5kKSkgLSAoMSA8PCBiaXRlbmQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlZyAqIDIgKyBwYyArIDQsIGluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdpdmVuICYgKDEgPDwgYml0c3RhcnQpKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqKytjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICB9Ci0gICAgfQotCi0gIC8qIG5vIG1hdGNoICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBTZWxlY3QgYSBkaWZmZXJlbnQgcmVnaXN0ZXIgbmFtZSBzZXQuCi0gICBSZXR1cm5zIHRydWUgaWYgdGhlIG5hbWUgc2V0IHNlbGVjdGVkIGlzIHRoZSBBUENTIG5hbWUgc2V0LiAgKi8KLWludAotYXJtX3RvZ2dsZV9yZWduYW1lcyAoKQotewotICBpZiAoYXJtX3JlZ25hbWVzID09IGFybV9yZWduYW1lc19zdGFuZGFyZCkKLSAgICBhcm1fcmVnbmFtZXMgPSBhcm1fcmVnbmFtZXNfYXBjczsKLSAgZWxzZQotICAgIGFybV9yZWduYW1lcyA9IGFybV9yZWduYW1lc19zdGFuZGFyZDsKLQotICByZXR1cm4gYXJtX3JlZ25hbWVzID09IGFybV9yZWduYW1lc19hcGNzOwotfQotCi1zdGF0aWMgdm9pZAotcGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbnMgKG9wdGlvbnMpCi0gICAgIGNoYXIgKiBvcHRpb25zOwotewotICBpZiAob3B0aW9ucyA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgICAgIAotICBpZiAoc3RybmNtcCAob3B0aW9ucywgInJlZy1uYW1lcy0iLCAxMCkgPT0gMCkKLSAgICB7Ci0gICAgICBvcHRpb25zICs9IDEwOwotICAgICAgCi0gICAgICBpZiAoc3RyY21wIChvcHRpb25zLCAic3RkIikgPT0gMCkKLQlhcm1fcmVnbmFtZXMgPSBhcm1fcmVnbmFtZXNfc3RhbmRhcmQ7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG9wdGlvbnMsICJhcGNzIikgPT0gMCkKLQlhcm1fcmVnbmFtZXMgPSBhcm1fcmVnbmFtZXNfYXBjczsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAob3B0aW9ucywgInJhdyIpID09IDApCi0JYXJtX3JlZ25hbWVzID0gYXJtX3JlZ25hbWVzX3JhdzsKLSAgICAgIGVsc2UKLQlmcHJpbnRmIChzdGRlcnIsICJVbnJlY29nbmlzZWQgcmVnaXN0ZXIgbmFtZSBzZXQ6ICVzXG4iLCBvcHRpb25zKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsICJVbnJlY29nbmlzZWQgZGlzYXNzZW1ibGVyIG9wdGlvbjogJXNcbiIsIG9wdGlvbnMpOwotICAKLSAgcmV0dXJuOwotfQotCi0vKiBOT1RFOiBUaGVyZSBhcmUgbm8gY2hlY2tzIGluIHRoZXNlIHJvdXRpbmVzIHRoYXQgdGhlIHJlbGV2YW50IG51bWJlciBvZiBkYXRhIGJ5dGVzIGV4aXN0ICovCi0KLWludAotcHJpbnRfaW5zbl9iaWdfYXJtIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOwotewotICB1bnNpZ25lZCBjaGFyICAgICAgYls0XTsKLSAgbG9uZyAgICAgICAgICAgICAgIGdpdmVuOwotICBpbnQgICAgICAgICAgICAgICAgc3RhdHVzOwotICBjb2ZmX3N5bWJvbF90eXBlICogY3M7Ci0gIGVsZl9zeW1ib2xfdHlwZSAqICBlczsKLSAgaW50ICAgICAgICAgICAgICAgIGlzX3RodW1iOwotICAKLSAgaWYgKGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zKQotICAgIHsKLSAgICAgIHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb25zIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucyk7Ci0gICAgICAKLSAgICAgIC8qIFRvIGF2b2lkIHJlcGVhdGVkIHBhcnNpbmcgb2YgdGhpcyBvcHRpb24sIHdlIHJlbW92ZSBpdCBoZXJlLiAgKi8KLSAgICAgIGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zID0gTlVMTDsKLSAgICB9Ci0gIAotICBpc190aHVtYiA9IGZhbHNlOwotICBpZiAoaW5mby0+c3ltYm9scyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyICgqaW5mby0+c3ltYm9scykgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0JewotCSAgY3MgPSBjb2Zmc3ltYm9sICgqaW5mby0+c3ltYm9scyk7Ci0JICBpc190aHVtYiA9ICggICBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CRVhUCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJTVEFUCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJMQUJFTAotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CRVhURlVOQwotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CU1RBVEZVTkMpOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKCppbmZvLT5zeW1ib2xzKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXsKLQkgIGVzID0gKihlbGZfc3ltYm9sX3R5cGUgKiopKGluZm8tPnN5bWJvbHMpOwotCSAgaXNfdGh1bWIgPSBFTEZfU1RfVFlQRSAoZXMtPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbykgPT0KLQkgICAgU1RUX0FSTV9URlVOQzsKLQl9Ci0gICAgfQotCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDQ7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gQkZEX0VORElBTl9CSUc7Ci0KLSAgLyogQWx3YXlzIGZldGNoIHdvcmQgYWxpZ25lZCB2YWx1ZXMuICAqLwotICAKLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMgJiB+IDB4MywgKGJmZF9ieXRlICopICZiWzBdLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGlzX3RodW1iKQotICAgIHsKLSAgICAgIGlmIChwYyAmIDB4MikKLQl7Ci0JICBnaXZlbiA9IChiWzJdIDw8IDgpIHwgYlszXTsKLQotCSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAoKHBjICsgNCkgJiB+IDB4MywgKGJmZF9ieXRlICopIGIsIDQsIGluZm8pOwotCSAgaWYgKHN0YXR1cyAhPSAwKQotCSAgICB7Ci0JICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgcGMgKyA0LCBpbmZvKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgIAotCSAgZ2l2ZW4gfD0gKGJbMF0gPDwgMjQpIHwgKGJbMV0gPDwgMTYpOwotCX0KLSAgICAgIGVsc2UKLQlnaXZlbiA9IChiWzBdIDw8IDgpIHwgYlsxXSB8IChiWzJdIDw8IDI0KSB8IChiWzNdIDw8IDE2KTsKLSAgICB9Ci0gIGVsc2UKLSAgICBnaXZlbiA9IChiWzBdIDw8IDI0KSB8IChiWzFdIDw8IDE2KSB8IChiWzJdIDw8IDgpIHwgKGJbM10pOwotCi0gIGlmIChpc190aHVtYikKLSAgICBzdGF0dXMgPSBwcmludF9pbnNuX3RodW1iIChwYywgaW5mbywgZ2l2ZW4pOwotICBlbHNlCi0gICAgc3RhdHVzID0gcHJpbnRfaW5zbl9hcm0gKHBjLCBpbmZvLCBnaXZlbik7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotaW50Ci1wcmludF9pbnNuX2xpdHRsZV9hcm0gKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci17Ci0gIHVuc2lnbmVkIGNoYXIgICAgICBiWzRdOwotICBsb25nICAgICAgICAgICAgICAgZ2l2ZW47Ci0gIGludCAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKiBjczsKLSAgZWxmX3N5bWJvbF90eXBlICogIGVzOwotICBpbnQgICAgICAgICAgICAgICAgaXNfdGh1bWI7Ci0KLSAgaWYgKGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zKQotICAgIHsKLSAgICAgIHBhcnNlX2Rpc2Fzc2VtYmxlcl9vcHRpb25zIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucyk7Ci0gICAgICAKLSAgICAgIC8qIFRvIGF2b2lkIHJlcGVhdGVkIHBhcnNpbmcgb2YgdGhpcyBvcHRpb24sIHdlIHJlbW92ZSBpdCBoZXJlLiAgKi8KLSAgICAgIGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zID0gTlVMTDsKLSAgICB9Ci0gIAotICBpc190aHVtYiA9IGZhbHNlOwotICAKLSAgaWYgKGluZm8tPnN5bWJvbHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoKmluZm8tPnN5bWJvbHMpID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotCXsKLQkgIGNzID0gY29mZnN5bWJvbCAoKmluZm8tPnN5bWJvbHMpOwotCSAgaXNfdGh1bWIgPSAoICAgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQkVYVAotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CU1RBVAotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CTEFCRUwKLQkJICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQkVYVEZVTkMKLQkJICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DKTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyICgqaW5mby0+c3ltYm9scykgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQl7Ci0JICBlcyA9ICooZWxmX3N5bWJvbF90eXBlICoqKShpbmZvLT5zeW1ib2xzKTsKLQkgIGlzX3RodW1iID0gRUxGX1NUX1RZUEUgKGVzLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8pID09Ci0JICAgIFNUVF9BUk1fVEZVTkM7Ci0JfQotICAgIH0KLSAgCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDQ7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gQkZEX0VORElBTl9MSVRUTEU7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMsIChiZmRfYnl0ZSAqKSAmYlswXSwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCAmJiBpc190aHVtYikKLSAgICB7Ci0gICAgICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAyOwotCi0gICAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChwYywgKGJmZF9ieXRlICopIGIsIDIsIGluZm8pOwotICAgICAgYlszXSA9IGJbMl0gPSAwOwotICAgIH0KLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgZ2l2ZW4gPSAoYlswXSkgfCAoYlsxXSA8PCA4KSB8IChiWzJdIDw8IDE2KSB8IChiWzNdIDw8IDI0KTsKLQotICBpZiAoaXNfdGh1bWIpCi0gICAgc3RhdHVzID0gcHJpbnRfaW5zbl90aHVtYiAocGMsIGluZm8sIGdpdmVuKTsKLSAgZWxzZQotICAgIHN0YXR1cyA9IHByaW50X2luc25fYXJtIChwYywgaW5mbywgZ2l2ZW4pOwotCi0gIHJldHVybiBzdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2FybS1vcGMuaCBiL29wY29kZXMvYXJtLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWEzZTEzLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvYXJtLW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBmb3IgdGhlIEFSTS4KLQotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotc3RydWN0IGFybV9vcGNvZGUgewotICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUsIG1hc2s7CS8qIHJlY29nbmlzZSBpbnN0cnVjdGlvbiBpZiAob3AmbWFzayk9PXZhbHVlICovCi0gICAgY2hhciAqYXNzZW1ibGVyOwkJLyogaG93IHRvIGRpc2Fzc2VtYmxlIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KLX07Ci0KLXN0cnVjdCB0aHVtYl9vcGNvZGUKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgbWFzazsJLyogcmVjb2duaXNlIGluc3RydWN0aW9uIGlmIChvcCZtYXNrKT09dmFsdWUgKi8KLSAgICBjaGFyICogYXNzZW1ibGVyOwkJLyogaG93IHRvIGRpc2Fzc2VtYmxlIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KLX07Ci0KLS8qIGZvcm1hdCBvZiB0aGUgYXNzZW1ibGVyIHN0cmluZyA6Ci0gICAKLSAgICUlCQkJJQotICAgJTxiaXRmaWVsZD5kCQlwcmludCB0aGUgYml0ZmllbGQgaW4gZGVjaW1hbAotICAgJTxiaXRmaWVsZD54CQlwcmludCB0aGUgYml0ZmllbGQgaW4gaGV4Ci0gICAlPGJpdGZpZWxkPlgJCXByaW50IHRoZSBiaXRmaWVsZCBhcyAxIGhleCBkaWdpdCB3aXRob3V0IGxlYWRpbmcgIjB4IgotICAgJTxiaXRmaWVsZD5yCQlwcmludCBhcyBhbiBBUk0gcmVnaXN0ZXIKLSAgICU8Yml0ZmllbGQ+ZgkJcHJpbnQgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBpZiA+NyBlbHNlIGEKLQkJCWZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyCi0gICAlYwkJCXByaW50IGNvbmRpdGlvbiBjb2RlIChhbHdheXMgYml0cyAyOC0zMSkKLSAgICVQCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGFyaXRobWV0aWMgaW5zbgotICAgJVEJCQlwcmludCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaW4gbGRmL3N0ZiBpbnNuCi0gICAlUgkJCXByaW50IGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIG1vZGUKLSAgICU8Yml0bnVtPidjCQlwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0IGlzIG9uZQotICAgJTxiaXRudW0+YGMJCXByaW50IHNwZWNpZmllZCBjaGFyIGlmZiBiaXQgaXMgemVybwotICAgJTxiaXRudW0+P2FiCQlwcmludCBhIGlmIGJpdCBpcyBvbmUgZWxzZSBwcmludCBiCi0gICAlcAkJCXByaW50ICdwJyBpZmYgYml0cyAxMi0xNSBhcmUgMTUKLSAgICV0CQkJcHJpbnQgJ3QnIGlmZiBiaXQgMjEgc2V0IGFuZCBiaXQgMjQgY2xlYXIKLSAgICVoICAgICAgICAgICAgICAgICAgIHByaW50ICdoJyBpZmYgYml0IDUgc2V0LCBlbHNlIHByaW50ICdiJwotICAgJW8JCQlwcmludCBvcGVyYW5kMiAoaW1tZWRpYXRlIG9yIHJlZ2lzdGVyICsgc2hpZnQpCi0gICAlYQkJCXByaW50IGFkZHJlc3MgZm9yIGxkci9zdHIgaW5zdHJ1Y3Rpb24KLSAgICVzICAgICAgICAgICAgICAgICAgIHByaW50IGFkZHJlc3MgZm9yIGxkci9zdHIgaGFsZndvcmQvc2lnbmV4dGVuZCBpbnN0cnVjdGlvbgotICAgJWIJCQlwcmludCBicmFuY2ggZGVzdGluYXRpb24KLSAgICVBCQkJcHJpbnQgYWRkcmVzcyBmb3IgbGRjL3N0Yy9sZGYvc3RmIGluc3RydWN0aW9uCi0gICAlbQkJCXByaW50IHJlZ2lzdGVyIG1hc2sgZm9yIGxkbS9zdG0gaW5zdHJ1Y3Rpb24KLSAgICVDCQkJcHJpbnQgdGhlIFBTUiBzdWIgdHlwZS4KLSAgICVGCQkJcHJpbnQgdGhlIENPVU5UIGZpZWxkIG9mIGEgTEZNL1NGTSBpbnN0cnVjdGlvbi4KLVRodW1iIHNwZWNpZmljIGZvcm1hdCBvcHRpb25zOgotICAgJUQgICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgKGJpdHMgMC4uMiBhcyBoaWdoIG51bWJlciBpZiBiaXQgNyBzZXQpCi0gICAlUyAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiByZWdpc3RlciAoYml0cyAzLi41IGFzIGhpZ2ggbnVtYmVyIGlmIGJpdCA2IHNldCkKLSAgICU8Yml0ZmllbGQ+SSAgICAgICAgIHByaW50IGJpdGZpZWxkIGFzIGEgc2lnbmVkIGRlY2ltYWwKLSAgIAkJCQkodG9wIGJpdCBvZiByYW5nZSBiZWluZyB0aGUgc2lnbiBiaXQpCi0gICAlTSAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiByZWdpc3RlciBtYXNrCi0gICAlTiAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiByZWdpc3RlciBtYXNrICh3aXRoIExSKQotICAgJU8gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzayAod2l0aCBQQykKLSAgICVUICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIGNvbmRpdGlvbiBjb2RlIChhbHdheXMgYml0cyA4LTExKQotICAgJTxiaXRmaWVsZD5CICAgICAgICAgcHJpbnQgVGh1bWIgYnJhbmNoIGRlc3RpbmF0aW9uIChzaWduZWQgZGlzcGxhY2VtZW50KQotICAgJTxiaXRmaWVsZD5XICAgICAgICAgcHJpbnQgKGJpdGZpZWxkICogNCkgYXMgYSBkZWNpbWFsCi0gICAlPGJpdGZpZWxkPkggICAgICAgICBwcmludCAoYml0ZmllbGQgKiAyKSBhcyBhIGRlY2ltYWwKLSAgICU8Yml0ZmllbGQ+YSAgICAgICAgIHByaW50IChiaXRmaWVsZCAqIDQpIGFzIGEgcGMtcmVsIG9mZnNldCArIGRlY29kZWQgc3ltYm9sCi0qLwotCi0vKiBOb3RlOiBUaGVyZSBpcyBhIHBhcnRpYWwgb3JkZXJpbmcgaW4gdGhpcyB0YWJsZSAtIGl0IG11c3QgYmUgc2VhcmNoZWQgZnJvbQotICAgdGhlIHRvcCB0byBvYnRhaW4gYSBjb3JyZWN0IG1hdGNoLiAqLwotCi1zdGF0aWMgc3RydWN0IGFybV9vcGNvZGUgYXJtX29wY29kZXNbXSA9IHsKLSAgICAvKiBBUk0gaW5zdHJ1Y3Rpb25zICovCi0gICAgezB4ZTFhMDAwMDAsIDB4ZmZmZmZmZmYsICJub3BcdFx0XHQobW92IHIwLHIwKSJ9LAotICAgIHsweDAxMkZGRjEwLCAweDBmZmZmZmYwLCAiYnglY1x0JTAtM3IifSwKLSAgICB7MHgwMDAwMDA5MCwgMHgwZmUwMDBmMCwgIm11bCVjJTIwJ3NcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKLSAgICB7MHgwMDIwMDA5MCwgMHgwZmUwMDBmMCwgIm1sYSVjJTIwJ3NcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIsICUxMi0xNXIifSwKLSAgICB7MHgwMTAwMDA5MCwgMHgwZmIwMGZmMCwgInN3cCVjJTIyJ2JcdCUxMi0xNXIsICUwLTNyLCBbJTE2LTE5cl0ifSwKLSAgICB7MHgwMDgwMDA5MCwgMHgwZmEwMDBmMCwgIiUyMj9zdW11bGwlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCi0gICAgezB4MDBhMDAwOTAsIDB4MGZhMDAwZjAsICIlMjI/c3VtbGFsJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAotICAgIHsweDAwMDAwMDkwLCAweDBlMTAwMDkwLCAic3RyJWMlNidzJWhcdCUxMi0xNXIsICVzIn0sCi0gICAgezB4MDAxMDAwOTAsIDB4MGUxMDAwOTAsICJsZHIlYyU2J3MlaFx0JTEyLTE1ciwgJXMifSwKLSAgICB7MHgwMDAwMDAwMCwgMHgwZGUwMDAwMCwgImFuZCVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDAyMDAwMDAsIDB4MGRlMDAwMDAsICJlb3IlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwNDAwMDAwLCAweDBkZTAwMDAwLCAic3ViJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMDYwMDAwMCwgMHgwZGUwMDAwMCwgInJzYiVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDA4MDAwMDAsIDB4MGRlMDAwMDAsICJhZGQlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwYTAwMDAwLCAweDBkZTAwMDAwLCAiYWRjJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMGMwMDAwMCwgMHgwZGUwMDAwMCwgInNiYyVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDBlMDAwMDAsIDB4MGRlMDAwMDAsICJyc2MlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxMjBmMDAwLCAweDBkYjZmMDAwLCAibXNyJWNcdCUyMj9zY3BzciVDLCAlbyJ9LAotICAgIHsweDAxMGYwMDAwLCAweDBmYmYwZmZmLCAibXJzJWNcdCUxMi0xNXIsICUyMj9zY3BzciJ9LAotICAgIHsweDAxMDAwMDAwLCAweDBkZTAwMDAwLCAidHN0JWMlcFx0JTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMTIwMDAwMCwgMHgwZGUwMDAwMCwgInRlcSVjJXBcdCUxNi0xOXIsICVvIn0sCi0gICAgezB4MDE0MDAwMDAsIDB4MGRlMDAwMDAsICJjbXAlYyVwXHQlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxNjAwMDAwLCAweDBkZTAwMDAwLCAiY21uJWMlcFx0JTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMTgwMDAwMCwgMHgwZGUwMDAwMCwgIm9yciVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDFhMDAwMDAsIDB4MGRlMDAwMDAsICJtb3YlYyUyMCdzXHQlMTItMTVyLCAlbyJ9LAotICAgIHsweDAxYzAwMDAwLCAweDBkZTAwMDAwLCAiYmljJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMWUwMDAwMCwgMHgwZGUwMDAwMCwgIm12biVjJTIwJ3NcdCUxMi0xNXIsICVvIn0sCi0gICAgezB4MDQwMDAwMDAsIDB4MGUxMDAwMDAsICJzdHIlYyUyMidiJXRcdCUxMi0xNXIsICVhIn0sCi0gICAgezB4MDYwMDAwMDAsIDB4MGUxMDBmZjAsICJzdHIlYyUyMidiJXRcdCUxMi0xNXIsICVhIn0sCi0gICAgezB4MDQwMDAwMDAsIDB4MGMxMDAwMTAsICJzdHIlYyUyMidiJXRcdCUxMi0xNXIsICVhIn0sCi0gICAgezB4MDYwMDAwMTAsIDB4MGUwMDAwMTAsICJ1bmRlZmluZWQifSwKLSAgICB7MHgwNDEwMDAwMCwgMHgwYzEwMDAwMCwgImxkciVjJTIyJ2IldFx0JTEyLTE1ciwgJWEifSwKLSAgICB7MHgwODAwMDAwMCwgMHgwZTEwMDAwMCwgInN0bSVjJTIzP2lkJTI0P2JhXHQlMTYtMTlyJTIxJyEsICVtJTIyJ14ifSwKLSAgICB7MHgwODEwMDAwMCwgMHgwZTEwMDAwMCwgImxkbSVjJTIzP2lkJTI0P2JhXHQlMTYtMTlyJTIxJyEsICVtJTIyJ14ifSwKLSAgICB7MHgwYTAwMDAwMCwgMHgwZTAwMDAwMCwgImIlMjQnbCVjXHQlYiJ9LAotICAgIHsweDBmMDAwMDAwLCAweDBmMDAwMDAwLCAic3dpJWNcdCUwLTIzeCJ9LAotCi0gICAgLyogRmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCi0gICAgezB4MGUwMDAxMDAsIDB4MGZmMDhmMTAsICJhZGYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGUxMDAxMDAsIDB4MGZmMDhmMTAsICJtdWYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGUyMDAxMDAsIDB4MGZmMDhmMTAsICJzdWYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGUzMDAxMDAsIDB4MGZmMDhmMTAsICJyc2YlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU0MDAxMDAsIDB4MGZmMDhmMTAsICJkdmYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU1MDAxMDAsIDB4MGZmMDhmMTAsICJyZGYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU2MDAxMDAsIDB4MGZmMDhmMTAsICJwb3clYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU3MDAxMDAsIDB4MGZmMDhmMTAsICJycHclYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU4MDAxMDAsIDB4MGZmMDhmMTAsICJybWYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGU5MDAxMDAsIDB4MGZmMDhmMTAsICJmbWwlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGVhMDAxMDAsIDB4MGZmMDhmMTAsICJmZHYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGViMDAxMDAsIDB4MGZmMDhmMTAsICJmcmQlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGVjMDAxMDAsIDB4MGZmMDhmMTAsICJwb2wlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGUwMDgxMDAsIDB4MGZmMDhmMTAsICJtdmYlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGUxMDgxMDAsIDB4MGZmMDhmMTAsICJtbmYlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGUyMDgxMDAsIDB4MGZmMDhmMTAsICJhYnMlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGUzMDgxMDAsIDB4MGZmMDhmMTAsICJybmQlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU0MDgxMDAsIDB4MGZmMDhmMTAsICJzcXQlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU1MDgxMDAsIDB4MGZmMDhmMTAsICJsb2clYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU2MDgxMDAsIDB4MGZmMDhmMTAsICJsZ24lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU3MDgxMDAsIDB4MGZmMDhmMTAsICJleHAlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU4MDgxMDAsIDB4MGZmMDhmMTAsICJzaW4lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGU5MDgxMDAsIDB4MGZmMDhmMTAsICJjb3MlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVhMDgxMDAsIDB4MGZmMDhmMTAsICJ0YW4lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGViMDgxMDAsIDB4MGZmMDhmMTAsICJhc24lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVjMDgxMDAsIDB4MGZmMDhmMTAsICJhY3MlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVkMDgxMDAsIDB4MGZmMDhmMTAsICJhdG4lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVlMDgxMDAsIDB4MGZmMDhmMTAsICJ1cmQlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGVmMDgxMDAsIDB4MGZmMDhmMTAsICJucm0lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCi0gICAgezB4MGUwMDAxMTAsIDB4MGZmMDBmMWYsICJmbHQlYyVQJVJcdCUxNi0xOGYsICUxMi0xNXIifSwKLSAgICB7MHgwZTEwMDExMCwgMHgwZmZmMGY5OCwgImZpeCVjJVJcdCUxMi0xNXIsICUwLTJmIn0sCi0gICAgezB4MGUyMDAxMTAsIDB4MGZmZjBmZmYsICJ3ZnMlY1x0JTEyLTE1ciJ9LAotICAgIHsweDBlMzAwMTEwLCAweDBmZmYwZmZmLCAicmZzJWNcdCUxMi0xNXIifSwKLSAgICB7MHgwZTQwMDExMCwgMHgwZmZmMGZmZiwgIndmYyVjXHQlMTItMTVyIn0sCi0gICAgezB4MGU1MDAxMTAsIDB4MGZmZjBmZmYsICJyZmMlY1x0JTEyLTE1ciJ9LAotICAgIHsweDBlOTBmMTEwLCAweDBmZjhmZmYwLCAiY21mJWNcdCUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGViMGYxMTAsIDB4MGZmOGZmZjAsICJjbmYlY1x0JTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWQwZjExMCwgMHgwZmY4ZmZmMCwgImNtZmUlY1x0JTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwZWYwZjExMCwgMHgwZmY4ZmZmMCwgImNuZmUlY1x0JTE2LTE4ZiwgJTAtM2YifSwKLSAgICB7MHgwYzAwMDEwMCwgMHgwZTEwMGYwMCwgInN0ZiVjJVFcdCUxMi0xNGYsICVBIn0sCi0gICAgezB4MGMxMDAxMDAsIDB4MGUxMDBmMDAsICJsZGYlYyVRXHQlMTItMTRmLCAlQSJ9LAotICAgIHsweDBjMDAwMjAwLCAweDBlMTAwZjAwLCAic2ZtJWNcdCUxMi0xNGYsICVGLCAlQSJ9LAotICAgIHsweDBjMTAwMjAwLCAweDBlMTAwZjAwLCAibGZtJWNcdCUxMi0xNGYsICVGLCAlQSJ9LAotCi0gICAgLyogR2VuZXJpYyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgKi8KLSAgICB7MHgwZTAwMDAwMCwgMHgwZjAwMDAxMCwgImNkcCVjXHQlOC0xMWQsICUyMC0yM2QsIGNyJTEyLTE1ZCwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9In0sCi0gICAgezB4MGUxMDAwMTAsIDB4MGYxMDAwMTAsICJtcmMlY1x0JTgtMTFkLCAlMjEtMjNkLCAlMTItMTVyLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0ifSwKLSAgICB7MHgwZTAwMDAxMCwgMHgwZjEwMDAxMCwgIm1jciVjXHQlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSJ9LAotICAgIHsweDBjMDAwMDAwLCAweDBlMTAwMDAwLCAic3RjJWMlMjInbFx0JTgtMTFkLCBjciUxMi0xNWQsICVBIn0sCi0gICAgezB4MGMxMDAwMDAsIDB4MGUxMDAwMDAsICJsZGMlYyUyMidsXHQlOC0xMWQsIGNyJTEyLTE1ZCwgJUEifSwKLSAgICAvKiB0aGUgcmVzdCAqLwotICAgIHsweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAidW5kZWZpbmVkIGluc3RydWN0aW9uICUwLTMxeCJ9LAotICAgIHsweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfQotfTsKLQotI2RlZmluZSBCRElTUCh4KSAoKCgoeCkgJiAweGZmZmZmZikgXiAweDgwMDAwMCkgLSAweDgwMDAwMCkgLyogMjYgYml0ICovCi0KLXN0YXRpYyBzdHJ1Y3QgdGh1bWJfb3Bjb2RlIHRodW1iX29wY29kZXNbXSA9Ci17Ci0gIC8qIFRodW1iIGluc3RydWN0aW9ucyAqLwotICB7MHg0NkMwLCAweEZGRkYsICJub3BcdFx0XHQobW92IHI4LHI4KSJ9LCAvKiBmb3JtYXQgNSBpbnN0cnVjdGlvbnMgZG8gbm90IHVwZGF0ZSB0aGUgUFNSICovCi0gIHsweDFDMDAsIDB4RkZDMCwgIm1vdlx0JTAtMnIsICUzLTVyXHRcdChhZGQgJTAtMnIsICUzLTVyLCAjJTYtOGQpIn0sCi0gIC8qIGZvcm1hdCA0ICovCi0gIHsweDQwMDAsIDB4RkZDMCwgImFuZFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQwNDAsIDB4RkZDMCwgImVvclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQwODAsIDB4RkZDMCwgImxzbFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQwQzAsIDB4RkZDMCwgImxzclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxMDAsIDB4RkZDMCwgImFzclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxNDAsIDB4RkZDMCwgImFkY1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxODAsIDB4RkZDMCwgInNiY1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQxQzAsIDB4RkZDMCwgInJvclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyMDAsIDB4RkZDMCwgInRzdFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyNDAsIDB4RkZDMCwgIm5lZ1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyODAsIDB4RkZDMCwgImNtcFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQyQzAsIDB4RkZDMCwgImNtblx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzMDAsIDB4RkZDMCwgIm9yclx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzNDAsIDB4RkZDMCwgIm11bFx0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzODAsIDB4RkZDMCwgImJpY1x0JTAtMnIsICUzLTVyIn0sCi0gIHsweDQzQzAsIDB4RkZDMCwgIm12blx0JTAtMnIsICUzLTVyIn0sCi0gIC8qIGZvcm1hdCAxMyAqLwotICB7MHhCMDAwLCAweEZGODAsICJhZGRcdHNwLCAjJTAtNlcifSwKLSAgezB4QjA4MCwgMHhGRjgwLCAic3ViXHRzcCwgIyUwLTZXIn0sCi0gIC8qIGZvcm1hdCA1ICovCi0gIHsweDQ3MDAsIDB4RkY4MCwgImJ4XHQlUyJ9LAotICB7MHg0NDAwLCAweEZGMDAsICJhZGRcdCVELCAlUyJ9LAotICB7MHg0NTAwLCAweEZGMDAsICJjbXBcdCVELCAlUyJ9LAotICB7MHg0NjAwLCAweEZGMDAsICJtb3ZcdCVELCAlUyJ9LAotICAvKiBmb3JtYXQgMTQgKi8KLSAgezB4QjQwMCwgMHhGRTAwLCAicHVzaFx0JU4ifSwKLSAgezB4QkMwMCwgMHhGRTAwLCAicG9wXHQlTyJ9LAotICAvKiBmb3JtYXQgMiAqLwotICB7MHgxODAwLCAweEZFMDAsICJhZGRcdCUwLTJyLCAlMy01ciwgJTYtOHIifSwKLSAgezB4MUEwMCwgMHhGRTAwLCAic3ViXHQlMC0yciwgJTMtNXIsICU2LThyIn0sCi0gIHsweDFDMDAsIDB4RkUwMCwgImFkZFx0JTAtMnIsICUzLTVyLCAjJTYtOGQifSwKLSAgezB4MUUwMCwgMHhGRTAwLCAic3ViXHQlMC0yciwgJTMtNXIsICMlNi04ZCJ9LAotICAvKiBmb3JtYXQgOCAqLwotICB7MHg1MjAwLCAweEZFMDAsICJzdHJoXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKLSAgezB4NUEwMCwgMHhGRTAwLCAibGRyaFx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIHsweDU2MDAsIDB4RjYwMCwgImxkcyUxMT9oYlx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIC8qIGZvcm1hdCA3ICovCi0gIHsweDUwMDAsIDB4RkEwMCwgInN0ciUxMCdiXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKLSAgezB4NTgwMCwgMHhGQTAwLCAibGRyJTEwJ2JcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAotICAvKiBmb3JtYXQgMSAqLwotICB7MHgwMDAwLCAweEY4MDAsICJsc2xcdCUwLTJyLCAlMy01ciwgIyU2LTEwZCJ9LAotICB7MHgwODAwLCAweEY4MDAsICJsc3JcdCUwLTJyLCAlMy01ciwgIyU2LTEwZCJ9LAotICB7MHgxMDAwLCAweEY4MDAsICJhc3JcdCUwLTJyLCAlMy01ciwgIyU2LTEwZCJ9LAotICAvKiBmb3JtYXQgMyAqLwotICB7MHgyMDAwLCAweEY4MDAsICJtb3ZcdCU4LTEwciwgIyUwLTdkIn0sCi0gIHsweDI4MDAsIDB4RjgwMCwgImNtcFx0JTgtMTByLCAjJTAtN2QifSwKLSAgezB4MzAwMCwgMHhGODAwLCAiYWRkXHQlOC0xMHIsICMlMC03ZCJ9LAotICB7MHgzODAwLCAweEY4MDAsICJzdWJcdCU4LTEwciwgIyUwLTdkIn0sCi0gIC8qIGZvcm1hdCA2ICovCi0gIHsweDQ4MDAsIDB4RjgwMCwgImxkclx0JTgtMTByLCBbcGMsICMlMC03V11cdCglMC03YSkifSwgIC8qIFRPRE86IERpc2Fzc2VtYmxlIFBDIHJlbGF0aXZlICJMRFIgckQsPTxzeW1ib2xpYz4iICovCi0gIC8qIGZvcm1hdCA5ICovCi0gIHsweDYwMDAsIDB4RjgwMCwgInN0clx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgezB4NjgwMCwgMHhGODAwLCAibGRyXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBXXSJ9LAotICB7MHg3MDAwLCAweEY4MDAsICJzdHJiXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBkXSJ9LAotICB7MHg3ODAwLCAweEY4MDAsICJsZHJiXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBkXSJ9LAotICAvKiBmb3JtYXQgMTAgKi8KLSAgezB4ODAwMCwgMHhGODAwLCAic3RyaFx0JTAtMnIsIFslMy01ciwgIyU2LTEwSF0ifSwKLSAgezB4ODgwMCwgMHhGODAwLCAibGRyaFx0JTAtMnIsIFslMy01ciwgIyU2LTEwSF0ifSwKLSAgLyogZm9ybWF0IDExICovCi0gIHsweDkwMDAsIDB4RjgwMCwgInN0clx0JTgtMTByLCBbc3AsICMlMC03V10ifSwKLSAgezB4OTgwMCwgMHhGODAwLCAibGRyXHQlOC0xMHIsIFtzcCwgIyUwLTdXXSJ9LAotICAvKiBmb3JtYXQgMTIgKi8KLSAgezB4QTAwMCwgMHhGODAwLCAiYWRkXHQlOC0xMHIsIHBjLCAjJTAtN1dcdChhZHIgJTgtMTByLCUwLTdhKSJ9LAotICB7MHhBODAwLCAweEY4MDAsICJhZGRcdCU4LTEwciwgc3AsICMlMC03VyJ9LAotICAvKiBmb3JtYXQgMTUgKi8KLSAgezB4QzAwMCwgMHhGODAwLCAic3RtaWFcdCU4LTEwciEsJU0ifSwKLSAgezB4QzgwMCwgMHhGODAwLCAibGRtaWFcdCU4LTEwciEsJU0ifSwKLSAgLyogZm9ybWF0IDE4ICovCi0gIHsweEUwMDAsIDB4RjgwMCwgImJcdCUwLTEwQiJ9LAotICB7MHhFODAwLCAweEY4MDAsICJ1bmRlZmluZWQifSwKLSAgLyogZm9ybWF0IDE5ICovCi0gIHsweEYwMDAsIDB4RjgwMCwgIiJ9LCAvKiBzcGVjaWFsIHByb2Nlc3NpbmcgcmVxdWlyZWQgaW4gZGlzYXNzZW1ibGVyICovCi0gIHsweEY4MDAsIDB4RjgwMCwgInNlY29uZCBoYWxmIG9mIEJMIGluc3RydWN0aW9uICUwLTE1eCJ9LAotICAvKiBmb3JtYXQgMTYgKi8KLSAgezB4RDAwMCwgMHhGRjAwLCAiYmVxXHQlMC03QiJ9LAotICB7MHhEMTAwLCAweEZGMDAsICJibmVcdCUwLTdCIn0sCi0gIHsweEQyMDAsIDB4RkYwMCwgImJjc1x0JTAtN0IifSwKLSAgezB4RDMwMCwgMHhGRjAwLCAiYmNjXHQlMC03QiJ9LAotICB7MHhENDAwLCAweEZGMDAsICJibWlcdCUwLTdCIn0sCi0gIHsweEQ1MDAsIDB4RkYwMCwgImJwbFx0JTAtN0IifSwKLSAgezB4RDYwMCwgMHhGRjAwLCAiYnZzXHQlMC03QiJ9LAotICB7MHhENzAwLCAweEZGMDAsICJidmNcdCUwLTdCIn0sCi0gIHsweEQ4MDAsIDB4RkYwMCwgImJoaVx0JTAtN0IifSwKLSAgezB4RDkwMCwgMHhGRjAwLCAiYmxzXHQlMC03QiJ9LAotICB7MHhEQTAwLCAweEZGMDAsICJiZ2VcdCUwLTdCIn0sCi0gIHsweERCMDAsIDB4RkYwMCwgImJsdFx0JTAtN0IifSwKLSAgezB4REMwMCwgMHhGRjAwLCAiYmd0XHQlMC03QiJ9LAotICB7MHhERDAwLCAweEZGMDAsICJibGVcdCUwLTdCIn0sCi0gIC8qIGZvcm1hdCAxNyAqLwotICB7MHhERTAwLCAweEZGMDAsICJ1bmRlZmluZWQifSwKLSAgezB4REYwMCwgMHhGRjAwLCAic3dpXHQlMC03ZCJ9LAotICAvKiBmb3JtYXQgOSAqLwotICB7MHg2MDAwLCAweEY4MDAsICJzdHJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMFddIn0sCi0gIHsweDY4MDAsIDB4RjgwMCwgImxkclx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgezB4NzAwMCwgMHhGODAwLCAic3RyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgezB4NzgwMCwgMHhGODAwLCAibGRyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgLyogdGhlIHJlc3QgKi8KLSAgezB4MDAwMCwgMHgwMDAwLCAidW5kZWZpbmVkIGluc3RydWN0aW9uICUwLTE1eCJ9LAotICB7MHgwMDAwLCAweDAwMDAsIDB9Ci19OwotCi0jZGVmaW5lIEJESVNQMjMoeCkgKCgoKCgoeCkgJiAweDA3ZmYpIDw8IDExKSB8ICgoKHgpICYgMHgwN2ZmMDAwMCkgPj4gMTYpKSBcCi0gICAgICAgICAgICAgICAgICAgICBeIDB4MjAwMDAwKSAtIDB4MjAwMDAwKSAvKiAyM2JpdCAqLwotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2NnZW4tYXNtLmMgYi9vcGNvZGVzL2NnZW4tYXNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZDY5MzYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jZ2VuLWFzbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qIENHRU4gZ2VuZXJpYyBhc3NlbWJsZXIgc3VwcG9ydCBjb2RlLgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIFNldCB0aGUgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuIGNhbGxiYWNrLiAgKi8KLQotdm9pZAotY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbiAoY2QsIGZuKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gZm47Ci17Ci0gIGNkLT5wYXJzZV9vcGVyYW5kX2ZuID0gZm47Ci19Ci0KLS8qIENhbGxlZCB3aGVuZXZlciBzdGFydGluZyB0byBwYXJzZSBhbiBpbnNuLiAgKi8KLQotdm9pZAotY2dlbl9pbml0X3BhcnNlX29wZXJhbmQgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICAvKiBUaGlzIHRlbGxzIHRoZSBjYWxsYmFjayB0byByZS1pbml0aWFsaXplLiAgKi8KLSAgKHZvaWQpICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQotICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOSVQsIE5VTEwsIDAsIDAsIE5VTEwsIE5VTEwpOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGJ1aWxkX2FzbV9oYXNoX3RhYmxlIHRvIGFkZCBJTlNOUyB0byB0aGUgaGFzaCB0YWJsZS4KLQotICAgQ09VTlQgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBJTlNOUy4KLSAgIEVOVFNJWkUgaXMgc2l6ZW9mIChDR0VOX0lCQVNFKSBmb3IgdGhlIHRhcmdldC4KLSAgID8/PyBObyBsb25nZXIgdXNlZCBidXQgbGVhdmUgaW4gZm9yIG5vdy4KLSAgIEhUQUJMRSBwb2ludHMgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBIRU5UQlVGIGlzIGEgcG9pbnRlciB0byBzdWZmaWNpZW50bHkgbGFyZ2UgYnVmZmVyIG9mIGhhc2ggZW50cmllcy4KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGVudHJ5IHRvIHVzZS4KLQotICAgVGhlIHRhYmxlIGlzIHNjYW5uZWQgYmFja3dhcmRzIGFzIGFkZGl0aW9ucyBhcmUgbWFkZSB0byB0aGUgZnJvbnQgb2YgdGhlCi0gICBsaXN0IGFuZCB3ZSB3YW50IGVhcmxpZXIgb25lcyB0byBiZSBwcmVmZXJlZC4gICovCi0KLXN0YXRpYyBDR0VOX0lOU05fTElTVCAqCi1oYXNoX2luc25fYXJyYXkgKGNkLCBpbnNucywgY291bnQsIGVudHNpemUsIGh0YWJsZSwgaGVudGJ1ZikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuczsKLSAgICAgaW50IGNvdW50OwotICAgICBpbnQgZW50c2l6ZTsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKipodGFibGU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICpoZW50YnVmOwotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgLS1pLCArK2hlbnRidWYpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2g7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSAmaW5zbnNbaV07Ci0KLSAgICAgIGlmICghICgqIGNkLT5hc21faGFzaF9wKSAoaW5zbikpCi0JY29udGludWU7Ci0gICAgICBoYXNoID0gKCogY2QtPmFzbV9oYXNoKSAoQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSk7Ci0gICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlW2hhc2hdOwotICAgICAgaGVudGJ1Zi0+aW5zbiA9IGluc247Ci0gICAgICBodGFibGVbaGFzaF0gPSBoZW50YnVmOwotICAgIH0KLQotICByZXR1cm4gaGVudGJ1ZjsKLX0KLQotLyogU3Vicm91dGluZSBvZiBidWlsZF9hc21faGFzaF90YWJsZSB0byBhZGQgSU5TTlMgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBoYXNoX2luc25fYXJyYXkgZXhjZXB0IHRoZSBpbnNucyBhcmUKLSAgIGluIGEgbGlzdC4gICovCi0KLXN0YXRpYyBDR0VOX0lOU05fTElTVCAqCi1oYXNoX2luc25fbGlzdCAoY2QsIGluc25zLCBodGFibGUsIGhlbnRidWYpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuczsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKipodGFibGU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICpoZW50YnVmOwotewotICBjb25zdCBDR0VOX0lOU05fTElTVCAqaWxpc3Q7Ci0KLSAgZm9yIChpbGlzdCA9IGluc25zOyBpbGlzdCAhPSBOVUxMOyBpbGlzdCA9IGlsaXN0LT5uZXh0LCArKyBoZW50YnVmKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBoYXNoOwotCi0gICAgICBpZiAoISAoKiBjZC0+YXNtX2hhc2hfcCkgKGlsaXN0LT5pbnNuKSkKLQljb250aW51ZTsKLSAgICAgIGhhc2ggPSAoKiBjZC0+YXNtX2hhc2gpIChDR0VOX0lOU05fTU5FTU9OSUMgKGlsaXN0LT5pbnNuKSk7Ci0gICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlW2hhc2hdOwotICAgICAgaGVudGJ1Zi0+aW5zbiA9IGlsaXN0LT5pbnNuOwotICAgICAgaHRhYmxlW2hhc2hdID0gaGVudGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIGhlbnRidWY7Ci19Ci0KLS8qIEJ1aWxkIHRoZSBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24gaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9hc21faGFzaF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBjb3VudCA9IGNnZW5faW5zbl9jb3VudCAoY2QpICsgY2dlbl9tYWNyb19pbnNuX2NvdW50IChjZCk7Ci0gIENHRU5fSU5TTl9UQUJMRSAqaW5zbl90YWJsZSA9ICZjZC0+aW5zbl90YWJsZTsKLSAgQ0dFTl9JTlNOX1RBQkxFICptYWNyb19pbnNuX3RhYmxlID0gJmNkLT5tYWNyb19pbnNuX3RhYmxlOwotICB1bnNpZ25lZCBpbnQgaGFzaF9zaXplID0gY2QtPmFzbV9oYXNoX3NpemU7Ci0gIENHRU5fSU5TTl9MSVNUICpoYXNoX2VudHJ5X2J1ZjsKLSAgQ0dFTl9JTlNOX0xJU1QgKiphc21faGFzaF90YWJsZTsKLSAgQ0dFTl9JTlNOX0xJU1QgKmFzbV9oYXNoX3RhYmxlX2VudHJpZXM7Ci0KLSAgLyogVGhlIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIGhhc2ggdGFibGUgY29uc2lzdHMgb2YgdHdvIHBhcnRzOgotICAgICB0aGUgaGFzaCB0YWJsZSBhbmQgdGhlIGhhc2ggbGlzdHMuICAqLwotCi0gIGFzbV9oYXNoX3RhYmxlID0gKENHRU5fSU5TTl9MSVNUICoqKQotICAgIHhtYWxsb2MgKGhhc2hfc2l6ZSAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QgKikpOwotICBtZW1zZXQgKGFzbV9oYXNoX3RhYmxlLCAwLCBoYXNoX3NpemUgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUICopKTsKLSAgYXNtX2hhc2hfdGFibGVfZW50cmllcyA9IGhhc2hfZW50cnlfYnVmID0gKENHRU5fSU5TTl9MSVNUICopCi0gICAgeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUKSk7Ci0KLSAgLyogQWRkIGNvbXBpbGVkIGluIGluc25zLgotICAgICBEb24ndCBpbmNsdWRlIHRoZSBmaXJzdCBvbmUgYXMgaXQgaXMgYSByZXNlcnZlZCBlbnRyeS4gICovCi0gIC8qID8/PyBJdCB3YXMgdGhlIGVuZCBvZiBhbGwgaGFzaCBjaGFpbnMsIGFuZCBhbHNvIHRoZSBzcGVjaWFsCi0gICAgICJpbnZhbGlkIGluc24iIG1hcmtlci4gIE1heSBiZSBhYmxlIHRvIGRvIGl0IGRpZmZlcmVudGx5IG5vdy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fYXJyYXkgKGNkLAotCQkJCSAgICBpbnNuX3RhYmxlLT5pbml0X2VudHJpZXMgKyAxLAotCQkJCSAgICBpbnNuX3RhYmxlLT5udW1faW5pdF9lbnRyaWVzIC0gMSwKLQkJCQkgICAgaW5zbl90YWJsZS0+ZW50cnlfc2l6ZSwKLQkJCQkgICAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgY29tcGlsZWQgaW4gbWFjcm8taW5zbnMuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2FycmF5IChjZCwgbWFjcm9faW5zbl90YWJsZS0+aW5pdF9lbnRyaWVzLAotCQkJCSAgICBtYWNyb19pbnNuX3RhYmxlLT5udW1faW5pdF9lbnRyaWVzLAotCQkJCSAgICBtYWNyb19pbnNuX3RhYmxlLT5lbnRyeV9zaXplLAotCQkJCSAgICBhc21faGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIC8qIEFkZCBydW50aW1lIGFkZGVkIGluc25zLgotICAgICBMYXRlciBhZGRlZCBpbnNucyB3aWxsIGJlIHByZWZlcmVkIG92ZXIgZWFybGllciBvbmVzLiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9saXN0IChjZCwgaW5zbl90YWJsZS0+bmV3X2VudHJpZXMsCi0JCQkJICAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgcnVudGltZSBhZGRlZCBtYWNyby1pbnNucy4gICovCi0KLSAgaGFzaF9pbnNuX2xpc3QgKGNkLCBtYWNyb19pbnNuX3RhYmxlLT5uZXdfZW50cmllcywKLQkJICBhc21faGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIGNkLT5hc21faGFzaF90YWJsZSA9IGFzbV9oYXNoX3RhYmxlOwotICBjZC0+YXNtX2hhc2hfdGFibGVfZW50cmllcyA9IGFzbV9oYXNoX3RhYmxlX2VudHJpZXM7Ci19Ci0KLS8qIFJldHVybiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGhhc2ggbGlzdCBmb3IgSU5TTi4gICovCi0KLUNHRU5fSU5TTl9MSVNUICoKLWNnZW5fYXNtX2xvb2t1cF9pbnNuIChjZCwgaW5zbikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqaW5zbjsKLXsKLSAgdW5zaWduZWQgaW50IGhhc2g7Ci0KLSAgaWYgKGNkLT5hc21faGFzaF90YWJsZSA9PSBOVUxMKQotICAgIGJ1aWxkX2FzbV9oYXNoX3RhYmxlIChjZCk7Ci0KLSAgaGFzaCA9ICgqIGNkLT5hc21faGFzaCkgKGluc24pOwotICByZXR1cm4gY2QtPmFzbV9oYXNoX3RhYmxlW2hhc2hdOwotfQotDAotLyogS2V5d29yZCBwYXJzZXIuCi0gICBUaGUgcmVzdWx0IGlzIE5VTEwgdXBvbiBzdWNjZXNzIG9yIGFuIGVycm9yIG1lc3NhZ2UuCi0gICBJZiBzdWNjZXNzZnVsLCAqU1RSUCBpcyB1cGRhdGVkIHRvIHBvaW50IHBhc3NlZCB0aGUga2V5d29yZC4KLQotICAgPz8/IEF0IHByZXNlbnQgd2UgaGF2ZSBhIHN0YXRpYyBub3Rpb24gb2YgaG93IHRvIHBpY2sgb3V0IGEga2V5d29yZC4KLSAgIExhdGVyIHdlIGNhbiBhbGxvdyBhIHRhcmdldCB0byBjdXN0b21pemUgdGhpcyBpZiBuZWNlc3NhcnkgW3NheSBieQotICAgcmVjb3JkaW5nIHNvbWV0aGluZyBpbiB0aGUga2V5d29yZCB0YWJsZV0uICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsIGtleXdvcmRfdGFibGUsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIENHRU5fS0VZV09SRCAqa2V5d29yZF90YWJsZTsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotICBjaGFyIGJ1ZlsyNTZdOwotICBjb25zdCBjaGFyICpwLCpzdGFydDsKLQotICBwID0gc3RhcnQgPSAqc3RycDsKLQotICAvKiBBbGxvdyBhbnkgZmlyc3QgY2hhcmFjdGVyLgotICAgICBOb3RlIHRoYXQgdGhpcyBhbGxvd3MgcmVjb2duaXppbmcgIixhIiBmb3IgdGhlIGFubnVsIGZsYWcgaW4gc3BhcmMKLSAgICAgZXZlbiB0aG91Z2ggIiwiIGlzIHN1YnNlcXVlbnRseSBub3QgYSB2YWxpZCBrZXl3b3JkIGNoYXIuICAqLwotICBpZiAoKnApCi0gICAgKytwOwotCi0gIC8qIE5vdyBhbGxvdyBsZXR0ZXJzLCBkaWdpdHMsIGFuZCBfLiAgKi8KLSAgd2hpbGUgKCgocCAtIHN0YXJ0KSA8IChpbnQpIHNpemVvZiAoYnVmKSkKLQkgJiYgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcCkgfHwgKnAgPT0gJ18nKSkKLSAgICArK3A7Ci0KLSAgaWYgKHAgLSBzdGFydCA+PSAoaW50KSBzaXplb2YgKGJ1ZikpCi0gICAgcmV0dXJuIF8oInVucmVjb2duaXplZCBrZXl3b3JkL3JlZ2lzdGVyIG5hbWUiKTsKLQotICBtZW1jcHkgKGJ1Ziwgc3RhcnQsIHAgLSBzdGFydCk7Ci0gIGJ1ZltwIC0gc3RhcnRdID0gMDsKLQotICBrZSA9IGNnZW5fa2V5d29yZF9sb29rdXBfbmFtZSAoa2V5d29yZF90YWJsZSwgYnVmKTsKLQotICBpZiAoa2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqdmFsdWVwID0ga2UtPnZhbHVlOwotICAgICAgLyogRG9uJ3QgYWR2YW5jZSBwb2ludGVyIGlmIHdlIHJlY29nbml6ZWQgdGhlIG51bGwga2V5d29yZC4gICovCi0gICAgICBpZiAoa2UtPm5hbWVbMF0gIT0gMCkKLQkqc3RycCA9IHA7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICJ1bnJlY29nbml6ZWQga2V5d29yZC9yZWdpc3RlciBuYW1lIjsKLX0KLQotLyogUGFyc2UgYSBzbWFsbCBzaWduZWQgaW50ZWdlciBwYXJzZXIuCi0gICA/Pz8gVkFMVUVQIGlzIG5vdCBhIGJmZF92bWEgKiBvbiBwdXJwb3NlLCB0aG91Z2ggdGhpcyBpcyBjb25mdXNpbmcuCi0gICBOb3RlIHRoYXQgaWYgdGhlIGNhbGxlciBleHBlY3RzIGEgYmZkX3ZtYSByZXN1bHQsIGl0IHNob3VsZCBjYWxsCi0gICBjZ2VuX3BhcnNlX2FkZHJlc3MuICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBiZmRfdm1hIHZhbHVlOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0OwotICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgZXJybXNnID0gKCogY2QtPnBhcnNlX29wZXJhbmRfZm4pCi0gICAgKGNkLCBDR0VOX1BBUlNFX09QRVJBTkRfSU5URUdFUiwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX05PTkUsCi0gICAgICZyZXN1bHQsICZ2YWx1ZSk7Ci0gIC8qIEZJWE1FOiBFeGFtaW5lIGByZXN1bHQnLiAgKi8KLSAgaWYgKCFlcnJtc2cpCi0gICAgKnZhbHVlcCA9IHZhbHVlOwotICByZXR1cm4gZXJybXNnOwotfQotCi0vKiBQYXJzZSBhIHNtYWxsIHVuc2lnbmVkIGludGVnZXIgcGFyc2VyLgotICAgPz8/IFZBTFVFUCBpcyBub3QgYSBiZmRfdm1hICogb24gcHVycG9zZSwgdGhvdWdoIHRoaXMgaXMgY29uZnVzaW5nLgotICAgTm90ZSB0aGF0IGlmIHRoZSBjYWxsZXIgZXhwZWN0cyBhIGJmZF92bWEgcmVzdWx0LCBpdCBzaG91bGQgY2FsbAotICAgY2dlbl9wYXJzZV9hZGRyZXNzLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotewotICBiZmRfdm1hIHZhbHVlOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0OwotICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgZXJybXNnID0gKCogY2QtPnBhcnNlX29wZXJhbmRfZm4pCi0gICAgKGNkLCBDR0VOX1BBUlNFX09QRVJBTkRfSU5URUdFUiwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX05PTkUsCi0gICAgICZyZXN1bHQsICZ2YWx1ZSk7Ci0gIC8qIEZJWE1FOiBFeGFtaW5lIGByZXN1bHQnLiAgKi8KLSAgaWYgKCFlcnJtc2cpCi0gICAgKnZhbHVlcCA9IHZhbHVlOwotICByZXR1cm4gZXJybXNnOwotfQotCi0vKiBBZGRyZXNzIHBhcnNlci4gICovCi0KLWNvbnN0IGNoYXIgKgotY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgb3BpbmZvLCByZXN1bHRwLCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgaW50IG9waW5mbzsKLSAgICAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0ICpyZXN1bHRwOwotICAgICBiZmRfdm1hICp2YWx1ZXA7Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHRfdHlwZTsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gIGVycm1zZyA9ICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQotICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0FERFJFU1MsIHN0cnAsIG9waW5kZXgsIG9waW5mbywKLSAgICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOwotICAvKiBGSVhNRTogRXhhbWluZSBgcmVzdWx0Jy4gICovCi0gIGlmICghZXJybXNnKQotICAgIHsKLSAgICAgIGlmIChyZXN1bHRwICE9IE5VTEwpCi0JKnJlc3VsdHAgPSByZXN1bHRfdHlwZTsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICB9Ci0gIHJldHVybiBlcnJtc2c7Ci19Ci0MCi0vKiBTaWduZWQgaW50ZWdlciB2YWxpZGF0aW9uIHJvdXRpbmUuICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fdmFsaWRhdGVfc2lnbmVkX2ludGVnZXIgKHZhbHVlLCBtaW4sIG1heCkKLSAgICAgbG9uZyB2YWx1ZSwgbWluLCBtYXg7Ci17Ci0gIGlmICh2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkKLSAgICB7Ci0gICAgICBzdGF0aWMgY2hhciBidWZbMTAwXTsKLQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsZCBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKSwKLQkJICAgICAgdmFsdWUsIG1pbiwgbWF4KTsKLSAgICAgIHJldHVybiBidWY7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVbnNpZ25lZCBpbnRlZ2VyIHZhbGlkYXRpb24gcm91dGluZS4KLSAgIFN1cHBseWluZyBgbWluJyBoZXJlIG1heSBzZWVtIHVubmVjZXNzYXJ5LCBidXQgd2UgYWxzbyB3YW50IHRvIGhhbmRsZQotICAgY2FzZXMgd2hlcmUgbWluICE9IDAgKGFuZCBtYXggPiBMT05HX01BWCkuICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fdmFsaWRhdGVfdW5zaWduZWRfaW50ZWdlciAodmFsdWUsIG1pbiwgbWF4KQotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBtaW4sIG1heDsKLXsKLSAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KQotICAgIHsKLSAgICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMDBdOwotCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgc3ByaW50ZiAoYnVmLCBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuICVsdSBhbmQgJWx1KSIpLAotCSAgICAgICB2YWx1ZSwgbWluLCBtYXgpOwotICAgICAgcmV0dXJuIGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2NnZW4tZGlzLmMgYi9vcGNvZGVzL2NnZW4tZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YjFjZDkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jZ2VuLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qIENHRU4gZ2VuZXJpYyBkaXNhc3NlbWJsZXIgc3VwcG9ydCBjb2RlLgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJvcGNvZGUvY2dlbi5oIgotCi0vKiBTdWJyb3V0aW5lIG9mIGJ1aWxkX2Rpc19oYXNoX3RhYmxlIHRvIGFkZCBJTlNOUyB0byB0aGUgaGFzaCB0YWJsZS4KLQotICAgQ09VTlQgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBJTlNOUy4KLSAgIEVOVFNJWkUgaXMgc2l6ZW9mIChDR0VOX0lCQVNFKSBmb3IgdGhlIHRhcmdldC4KLSAgID8/PyBObyBsb25nZXIgdXNlZCBidXQgbGVhdmUgaW4gZm9yIG5vdy4KLSAgIEhUQUJMRSBwb2ludHMgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBIRU5UQlVGIGlzIGEgcG9pbnRlciB0byBzdWZmaWNpZW50bHkgbGFyZ2UgYnVmZmVyIG9mIGhhc2ggZW50cmllcy4KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGVudHJ5IHRvIHVzZS4KLQotICAgVGhlIHRhYmxlIGlzIHNjYW5uZWQgYmFja3dhcmRzIGFzIGFkZGl0aW9ucyBhcmUgbWFkZSB0byB0aGUgZnJvbnQgb2YgdGhlCi0gICBsaXN0IGFuZCB3ZSB3YW50IGVhcmxpZXIgb25lcyB0byBiZSBwcmVmZXJlZC4gICovCi0KLXN0YXRpYyBDR0VOX0lOU05fTElTVCAqCi1oYXNoX2luc25fYXJyYXkgKGNkLCBpbnNucywgY291bnQsIGVudHNpemUsIGh0YWJsZSwgaGVudGJ1ZikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbnM7Ci0gICAgIGludCBjb3VudDsKLSAgICAgaW50IGVudHNpemU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICoqIGh0YWJsZTsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKiBoZW50YnVmOwotewotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IGNvdW50IC0gMTsgaSA+PSAwOyAtLWksICsraGVudGJ1ZikKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaDsKLSAgICAgIGNoYXIgYnVmIFs0XTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSAmaW5zbnNbaV07Ci0KLSAgICAgIGlmICghICgqIGNkLT5kaXNfaGFzaF9wKSAoaW5zbikpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgdGFyZ2V0IHVzZXMgdGhlIGJ1ZmZlciBvciB0aGUgYmFzZSBpbnNuCi0JIHRvIGhhc2ggb24sIHNvIHNldCBib3RoIHVwLiAgKi8KLQotICAgICAgdmFsdWUgPSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbik7Ci0gICAgICBzd2l0Y2ggKENHRU5fSU5TTl9NQVNLX0JJVFNJWkUgKGluc24pKQotCXsKLQljYXNlIDg6Ci0JICBidWZbMF0gPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMTY6Ci0JICBpZiAoYmlnX3ApCi0JICAgIGJmZF9wdXRiMTYgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGVsc2UKLQkgICAgYmZkX3B1dGwxNiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgYnJlYWs7Ci0JY2FzZSAzMjoKLQkgIGlmIChiaWdfcCkKLQkgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgZWxzZQotCSAgICBiZmRfcHV0bDMyICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBoYXNoID0gKCogY2QtPmRpc19oYXNoKSAoYnVmLCB2YWx1ZSk7Ci0gICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlW2hhc2hdOwotICAgICAgaGVudGJ1Zi0+aW5zbiA9IGluc247Ci0gICAgICBodGFibGVbaGFzaF0gPSBoZW50YnVmOwotICAgIH0KLQotICByZXR1cm4gaGVudGJ1ZjsKLX0KLQotLyogU3Vicm91dGluZSBvZiBidWlsZF9kaXNfaGFzaF90YWJsZSB0byBhZGQgSU5TTlMgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBoYXNoX2luc25fYXJyYXkgZXhjZXB0IHRoZSBpbnNucyBhcmUKLSAgIGluIGEgbGlzdC4gICovCi0KLXN0YXRpYyBDR0VOX0lOU05fTElTVCAqCi1oYXNoX2luc25fbGlzdCAoY2QsIGluc25zLCBodGFibGUsIGhlbnRidWYpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuczsKLSAgICAgQ0dFTl9JTlNOX0xJU1QgKipodGFibGU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICpoZW50YnVmOwotewotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0gIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbGlzdDsKLQotICBmb3IgKGlsaXN0ID0gaW5zbnM7IGlsaXN0ICE9IE5VTEw7IGlsaXN0ID0gaWxpc3QtPm5leHQsICsrIGhlbnRidWYpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2g7Ci0gICAgICBjaGFyIGJ1Zls0XTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLSAgICAgIGlmICghICgqIGNkLT5kaXNfaGFzaF9wKSAoaWxpc3QtPmluc24pKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIHRhcmdldCB1c2VzIHRoZSBidWZmZXIgb3IgdGhlIGJhc2UgaW5zbgotCSB0byBoYXNoIG9uLCBzbyBzZXQgYm90aCB1cC4gICovCi0KLSAgICAgIHZhbHVlID0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGlsaXN0LT5pbnNuKTsKLSAgICAgIHN3aXRjaCAoQ0dFTl9JTlNOX01BU0tfQklUU0laRSAoaWxpc3QtPmluc24pKQotCXsKLQljYXNlIDg6Ci0JICBidWZbMF0gPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMTY6Ci0JICBpZiAoYmlnX3ApCi0JICAgIGJmZF9wdXRiMTYgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGVsc2UKLQkgICAgYmZkX3B1dGwxNiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgYnJlYWs7Ci0JY2FzZSAzMjoKLQkgIGlmIChiaWdfcCkKLQkgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgZWxzZQotCSAgICBiZmRfcHV0bDMyICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBoYXNoID0gKCogY2QtPmRpc19oYXNoKSAoYnVmLCB2YWx1ZSk7Ci0gICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlIFtoYXNoXTsKLSAgICAgIGhlbnRidWYtPmluc24gPSBpbGlzdC0+aW5zbjsKLSAgICAgIGh0YWJsZSBbaGFzaF0gPSBoZW50YnVmOwotICAgIH0KLQotICByZXR1cm4gaGVudGJ1ZjsKLX0KLQotLyogQnVpbGQgdGhlIGRpc2Fzc2VtYmxlciBpbnN0cnVjdGlvbiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2Rpc19oYXNoX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGNvdW50ID0gY2dlbl9pbnNuX2NvdW50IChjZCkgKyBjZ2VuX21hY3JvX2luc25fY291bnQgKGNkKTsKLSAgQ0dFTl9JTlNOX1RBQkxFICppbnNuX3RhYmxlID0gJiBjZC0+aW5zbl90YWJsZTsKLSAgQ0dFTl9JTlNOX1RBQkxFICptYWNyb19pbnNuX3RhYmxlID0gJiBjZC0+bWFjcm9faW5zbl90YWJsZTsKLSAgdW5zaWduZWQgaW50IGhhc2hfc2l6ZSA9IGNkLT5kaXNfaGFzaF9zaXplOwotICBDR0VOX0lOU05fTElTVCAqaGFzaF9lbnRyeV9idWY7Ci0gIENHRU5fSU5TTl9MSVNUICoqZGlzX2hhc2hfdGFibGU7Ci0gIENHRU5fSU5TTl9MSVNUICpkaXNfaGFzaF90YWJsZV9lbnRyaWVzOwotCi0gIC8qIFRoZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RzIG9mIHR3byBwYXJ0czoKLSAgICAgdGhlIGhhc2ggdGFibGUgYW5kIHRoZSBoYXNoIGxpc3RzLiAgKi8KLQotICBkaXNfaGFzaF90YWJsZSA9IChDR0VOX0lOU05fTElTVCAqKikKLSAgICB4bWFsbG9jIChoYXNoX3NpemUgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUICopKTsKLSAgbWVtc2V0IChkaXNfaGFzaF90YWJsZSwgMCwgaGFzaF9zaXplICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCAqKSk7Ci0gIGRpc19oYXNoX3RhYmxlX2VudHJpZXMgPSBoYXNoX2VudHJ5X2J1ZiA9IChDR0VOX0lOU05fTElTVCAqKQotICAgIHhtYWxsb2MgKGNvdW50ICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCkpOwotCi0gIC8qIEFkZCBjb21waWxlZCBpbiBpbnNucy4KLSAgICAgRG9uJ3QgaW5jbHVkZSB0aGUgZmlyc3Qgb25lIGFzIGl0IGlzIGEgcmVzZXJ2ZWQgZW50cnkuICAqLwotICAvKiA/Pz8gSXQgd2FzIHRoZSBlbmQgb2YgYWxsIGhhc2ggY2hhaW5zLCBhbmQgYWxzbyB0aGUgc3BlY2lhbAotICAgICAiaW52YWxpZCBpbnNuIiBtYXJrZXIuICBNYXkgYmUgYWJsZSB0byBkbyBpdCBkaWZmZXJlbnRseSBub3cuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2FycmF5IChjZCwKLQkJCQkgICAgaW5zbl90YWJsZS0+aW5pdF9lbnRyaWVzICsgMSwKLQkJCQkgICAgaW5zbl90YWJsZS0+bnVtX2luaXRfZW50cmllcyAtIDEsCi0JCQkJICAgIGluc25fdGFibGUtPmVudHJ5X3NpemUsCi0JCQkJICAgIGRpc19oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIGNvbXBpbGVkIGluIG1hY3JvLWluc25zLiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9hcnJheSAoY2QsIG1hY3JvX2luc25fdGFibGUtPmluaXRfZW50cmllcywKLQkJCQkgICAgbWFjcm9faW5zbl90YWJsZS0+bnVtX2luaXRfZW50cmllcywKLQkJCQkgICAgbWFjcm9faW5zbl90YWJsZS0+ZW50cnlfc2l6ZSwKLQkJCQkgICAgZGlzX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgcnVudGltZSBhZGRlZCBpbnNucy4KLSAgICAgTGF0ZXIgYWRkZWQgaW5zbnMgd2lsbCBiZSBwcmVmZXJlZCBvdmVyIGVhcmxpZXIgb25lcy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fbGlzdCAoY2QsIGluc25fdGFibGUtPm5ld19lbnRyaWVzLAotCQkJCSAgIGRpc19oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIHJ1bnRpbWUgYWRkZWQgbWFjcm8taW5zbnMuICAqLwotCi0gIGhhc2hfaW5zbl9saXN0IChjZCwgbWFjcm9faW5zbl90YWJsZS0+bmV3X2VudHJpZXMsCi0JCSAgZGlzX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICBjZC0+ZGlzX2hhc2hfdGFibGUgPSBkaXNfaGFzaF90YWJsZTsKLSAgY2QtPmRpc19oYXNoX3RhYmxlX2VudHJpZXMgPSBkaXNfaGFzaF90YWJsZV9lbnRyaWVzOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBoYXNoIGxpc3QgZm9yIElOU04uICAqLwotCi1DR0VOX0lOU05fTElTVCAqCi1jZ2VuX2Rpc19sb29rdXBfaW5zbiAoY2QsIGJ1ZiwgdmFsdWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKiBidWY7Ci0gICAgIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoOwotCi0gIGlmIChjZC0+ZGlzX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9kaXNfaGFzaF90YWJsZSAoY2QpOwotCi0gIGhhc2ggPSAoKiBjZC0+ZGlzX2hhc2gpIChidWYsIHZhbHVlKTsKLQotICByZXR1cm4gY2QtPmRpc19oYXNoX3RhYmxlW2hhc2hdOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jZ2VuLW9wYy5jIGIvb3Bjb2Rlcy9jZ2VuLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njg0MGE2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvY2dlbi1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDU5NyArMCwwIEBACi0vKiBDR0VOIGdlbmVyaWMgb3Bjb2RlIHN1cHBvcnQuCi0KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKLQotc3RhdGljIHVuc2lnbmVkIGludCBoYXNoX2tleXdvcmRfbmFtZQotICBQQVJBTVMgKChjb25zdCBDR0VOX0tFWVdPUkQgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaGFzaF9rZXl3b3JkX3ZhbHVlCi0gIFBBUkFNUyAoKGNvbnN0IENHRU5fS0VZV09SRCAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIGJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMKLSAgUEFSQU1TICgoQ0dFTl9LRVlXT1JEICopKTsKLQotLyogUmV0dXJuIG51bWJlciBvZiBoYXNoIHRhYmxlIGVudHJpZXMgdG8gdXNlIGZvciBOIGVsZW1lbnRzLiAgKi8KLSNkZWZpbmUgS0VZV09SRF9IQVNIX1NJWkUobikgKChuKSA8PSAzMSA/IDE3IDogMzEpCi0KLS8qIExvb2sgdXAgKk5BTUVQIGluIHRoZSBrZXl3b3JkIHRhYmxlIEtULgotICAgVGhlIHJlc3VsdCBpcyB0aGUga2V5d29yZCBlbnRyeSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqCi1jZ2VuX2tleXdvcmRfbG9va3VwX25hbWUgKGt0LCBuYW1lKQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotICBjb25zdCBjaGFyICpwLCpuOwotCi0gIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOwotCi0gIGtlID0ga3QtPm5hbWVfaGFzaF90YWJsZVtoYXNoX2tleXdvcmRfbmFtZSAoa3QsIG5hbWUsIDApXTsKLQotICAvKiBXZSBkbyBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb25zLgotICAgICBJZiB0aGF0IGV2ZXIgYmVjb21lcyBhIHByb2JsZW0sIGFkZCBhbiBhdHRyaWJ1dGUgdGhhdCBkZW5vdGVzCi0gICAgICJkbyBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29ucyIuICAqLwotCi0gIHdoaWxlIChrZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIG4gPSBuYW1lOwotICAgICAgcCA9IGtlLT5uYW1lOwotCi0gICAgICB3aGlsZSAoKnAKLQkgICAgICYmICgqcCA9PSAqbgotCQkgfHwgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSAqcCkKLQkJICAgICAmJiAodG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpICpwKQotCQkJID09IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqbikpKSkpCi0JKytuLCArK3A7Ci0KLSAgICAgIGlmICghKnAgJiYgISpuKQotCXJldHVybiBrZTsKLQotICAgICAga2UgPSBrZS0+bmV4dF9uYW1lOwotICAgIH0KLQotICBpZiAoa3QtPm51bGxfZW50cnkpCi0gICAgcmV0dXJuIGt0LT5udWxsX2VudHJ5OwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogTG9vayB1cCBWQUxVRSBpbiB0aGUga2V5d29yZCB0YWJsZSBLVC4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIGtleXdvcmQgZW50cnkgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKgotY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZSAoa3QsIHZhbHVlKQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqa2U7Ci0KLSAgaWYgKGt0LT5uYW1lX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9rZXl3b3JkX2hhc2hfdGFibGVzIChrdCk7Ci0KLSAga2UgPSBrdC0+dmFsdWVfaGFzaF90YWJsZVtoYXNoX2tleXdvcmRfdmFsdWUgKGt0LCB2YWx1ZSldOwotCi0gIHdoaWxlIChrZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICh2YWx1ZSA9PSBrZS0+dmFsdWUpCi0JcmV0dXJuIGtlOwotICAgICAga2UgPSBrZS0+bmV4dF92YWx1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFkZCBhbiBlbnRyeSB0byBhIGtleXdvcmQgdGFibGUuICAqLwotCi12b2lkCi1jZ2VuX2tleXdvcmRfYWRkIChrdCwga2UpCi0gICAgIENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIENHRU5fS0VZV09SRF9FTlRSWSAqa2U7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoOwotCi0gIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOwotCi0gIGhhc2ggPSBoYXNoX2tleXdvcmRfbmFtZSAoa3QsIGtlLT5uYW1lLCAwKTsKLSAga2UtPm5leHRfbmFtZSA9IGt0LT5uYW1lX2hhc2hfdGFibGVbaGFzaF07Ci0gIGt0LT5uYW1lX2hhc2hfdGFibGVbaGFzaF0gPSBrZTsKLQotICBoYXNoID0gaGFzaF9rZXl3b3JkX3ZhbHVlIChrdCwga2UtPnZhbHVlKTsKLSAga2UtPm5leHRfdmFsdWUgPSBrdC0+dmFsdWVfaGFzaF90YWJsZVtoYXNoXTsKLSAga3QtPnZhbHVlX2hhc2hfdGFibGVbaGFzaF0gPSBrZTsKLQotICBpZiAoa2UtPm5hbWVbMF0gPT0gMCkKLSAgICBrdC0+bnVsbF9lbnRyeSA9IGtlOwotfQotCi0vKiBGSVhNRTogTmVlZCBmdW5jdGlvbiB0byByZXR1cm4gY291bnQgb2Yga2V5d29yZHMuICAqLwotCi0vKiBJbml0aWFsaXplIGEga2V5d29yZCB0YWJsZSBzZWFyY2guCi0gICBTUEVDIGlzIGEgc3BlY2lmaWNhdGlvbiBvZiB3aGF0IHRvIHNlYXJjaCBmb3IuCi0gICBBIHZhbHVlIG9mIE5VTEwgbWVhbnMgdG8gZmluZCBldmVyeSBrZXl3b3JkLgotICAgQ3VycmVudGx5IE5VTEwgaXMgdGhlIG9ubHkgYWNjZXB0YWJsZSB2YWx1ZSBbZnVydGhlciBzcGVjaWZpY2F0aW9uCi0gICBkZWZlcnJlZF0uCi0gICBUaGUgcmVzdWx0IGlzIGFuIG9wYXF1ZSBkYXRhIGl0ZW0gdXNlZCB0byByZWNvcmQgdGhlIHNlYXJjaCBzdGF0dXMuCi0gICBJdCBpcyBwYXNzZWQgdG8gZWFjaCBjYWxsIHRvIGNnZW5fa2V5d29yZF9zZWFyY2hfbmV4dC4gICovCi0KLUNHRU5fS0VZV09SRF9TRUFSQ0gKLWNnZW5fa2V5d29yZF9zZWFyY2hfaW5pdCAoa3QsIHNwZWMpCi0gICAgIENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIGNvbnN0IGNoYXIgKnNwZWM7Ci17Ci0gIENHRU5fS0VZV09SRF9TRUFSQ0ggc2VhcmNoOwotCi0gIC8qIEZJWE1FOiBOZWVkIHRvIHNwZWNpZnkgZm9ybWF0IG9mIFBBUkFNUy4gICovCi0gIGlmIChzcGVjICE9IE5VTEwpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGt0LT5uYW1lX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9rZXl3b3JkX2hhc2hfdGFibGVzIChrdCk7Ci0KLSAgc2VhcmNoLnRhYmxlID0ga3Q7Ci0gIHNlYXJjaC5zcGVjID0gc3BlYzsKLSAgc2VhcmNoLmN1cnJlbnRfaGFzaCA9IDA7Ci0gIHNlYXJjaC5jdXJyZW50X2VudHJ5ID0gTlVMTDsKLSAgcmV0dXJuIHNlYXJjaDsKLX0KLQotLyogUmV0dXJuIHRoZSBuZXh0IGtleXdvcmQgc3BlY2lmaWVkIGJ5IFNFQVJDSC4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIG5leHQgZW50cnkgb3IgTlVMTCBpZiB0aGVyZSBhcmUgbm8gbW9yZS4gICovCi0KLWNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqCi1jZ2VuX2tleXdvcmRfc2VhcmNoX25leHQgKHNlYXJjaCkKLSAgICAgQ0dFTl9LRVlXT1JEX1NFQVJDSCAqc2VhcmNoOwotewotICAvKiBIYXMgc2VhcmNoIGZpbmlzaGVkPyAgKi8KLSAgaWYgKHNlYXJjaC0+Y3VycmVudF9oYXNoID09IHNlYXJjaC0+dGFibGUtPmhhc2hfdGFibGVfc2l6ZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBTZWFyY2ggaW4gcHJvZ3Jlc3M/ICAqLwotICBpZiAoc2VhcmNoLT5jdXJyZW50X2VudHJ5ICE9IE5VTEwKLSAgICAgIC8qIEFueXRoaW5nIGxlZnQgb24gdGhpcyBoYXNoIGNoYWluPyAgKi8KLSAgICAgICYmIHNlYXJjaC0+Y3VycmVudF9lbnRyeS0+bmV4dF9uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgc2VhcmNoLT5jdXJyZW50X2VudHJ5ID0gc2VhcmNoLT5jdXJyZW50X2VudHJ5LT5uZXh0X25hbWU7Ci0gICAgICByZXR1cm4gc2VhcmNoLT5jdXJyZW50X2VudHJ5OwotICAgIH0KLQotICAvKiBNb3ZlIHRvIG5leHQgaGFzaCBjaGFpbiBbdW5sZXNzIHdlIGhhdmVuJ3Qgc3RhcnRlZCB5ZXRdLiAgKi8KLSAgaWYgKHNlYXJjaC0+Y3VycmVudF9lbnRyeSAhPSBOVUxMKQotICAgICsrc2VhcmNoLT5jdXJyZW50X2hhc2g7Ci0KLSAgd2hpbGUgKHNlYXJjaC0+Y3VycmVudF9oYXNoIDwgc2VhcmNoLT50YWJsZS0+aGFzaF90YWJsZV9zaXplKQotICAgIHsKLSAgICAgIHNlYXJjaC0+Y3VycmVudF9lbnRyeSA9IHNlYXJjaC0+dGFibGUtPm5hbWVfaGFzaF90YWJsZVtzZWFyY2gtPmN1cnJlbnRfaGFzaF07Ci0gICAgICBpZiAoc2VhcmNoLT5jdXJyZW50X2VudHJ5ICE9IE5VTEwpCi0JcmV0dXJuIHNlYXJjaC0+Y3VycmVudF9lbnRyeTsKLSAgICAgICsrc2VhcmNoLT5jdXJyZW50X2hhc2g7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBSZXR1cm4gZmlyc3QgZW50cnkgaW4gaGFzaCBjaGFpbiBmb3IgTkFNRS4KLSAgIElmIENBU0VfU0VOU0lUSVZFX1AgaXMgbm9uLXplcm8sIHJldHVybiBhIGNhc2Ugc2Vuc2l0aXZlIGhhc2guICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1oYXNoX2tleXdvcmRfbmFtZSAoa3QsIG5hbWUsIGNhc2Vfc2Vuc2l0aXZlX3ApCi0gICAgIGNvbnN0IENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBjYXNlX3NlbnNpdGl2ZV9wOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoY2FzZV9zZW5zaXRpdmVfcCkKLSAgICBmb3IgKGhhc2ggPSAwOyAqbmFtZTsgKytuYW1lKQotICAgICAgaGFzaCA9IChoYXNoICogOTcpICsgKHVuc2lnbmVkIGNoYXIpICpuYW1lOwotICBlbHNlCi0gICAgZm9yIChoYXNoID0gMDsgKm5hbWU7ICsrbmFtZSkKLSAgICAgIGhhc2ggPSAoaGFzaCAqIDk3KSArICh1bnNpZ25lZCBjaGFyKSB0b2xvd2VyICgqbmFtZSk7Ci0gIHJldHVybiBoYXNoICUga3QtPmhhc2hfdGFibGVfc2l6ZTsKLX0KLQotLyogUmV0dXJuIGZpcnN0IGVudHJ5IGluIGhhc2ggY2hhaW4gZm9yIFZBTFVFLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotaGFzaF9rZXl3b3JkX3ZhbHVlIChrdCwgdmFsdWUpCi0gICAgIGNvbnN0IENHRU5fS0VZV09SRCAqa3Q7Ci0gICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLXsKLSAgcmV0dXJuIHZhbHVlICUga3QtPmhhc2hfdGFibGVfc2l6ZTsKLX0KLQotLyogQnVpbGQgYSBrZXl3b3JkIHRhYmxlJ3MgaGFzaCB0YWJsZXMuCi0gICBXZSBwcm9iYWJseSBuZWVkbid0IGJ1aWxkIHRoZSB2YWx1ZSBoYXNoIHRhYmxlIGZvciB0aGUgYXNzZW1ibGVyIHdoZW4KLSAgIHdlJ3JlIHVzaW5nIHRoZSBkaXNhc3NlbWJsZXIsIGJ1dCB3ZSBrZWVwIHRoaW5ncyBzaW1wbGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpCi0gICAgIENHRU5fS0VZV09SRCAqa3Q7Ci17Ci0gIGludCBpOwotICAvKiBVc2UgdGhlIG51bWJlciBvZiBjb21waWxlZCBpbiBlbnRyaWVzIGFzIGFuIGVzdGltYXRlIGZvciB0aGUKLSAgICAgdHlwaWNhbCBzaXplZCB0YWJsZSBbbm90IHRvbyBtYW55IGFkZGVkIGF0IHJ1bnRpbWVdLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemUgPSBLRVlXT1JEX0hBU0hfU0laRSAoa3QtPm51bV9pbml0X2VudHJpZXMpOwotCi0gIGt0LT5oYXNoX3RhYmxlX3NpemUgPSBzaXplOwotICBrdC0+bmFtZV9oYXNoX3RhYmxlID0gKENHRU5fS0VZV09SRF9FTlRSWSAqKikKLSAgICB4bWFsbG9jIChzaXplICogc2l6ZW9mIChDR0VOX0tFWVdPUkRfRU5UUlkgKikpOwotICBtZW1zZXQgKGt0LT5uYW1lX2hhc2hfdGFibGUsIDAsIHNpemUgKiBzaXplb2YgKENHRU5fS0VZV09SRF9FTlRSWSAqKSk7Ci0gIGt0LT52YWx1ZV9oYXNoX3RhYmxlID0gKENHRU5fS0VZV09SRF9FTlRSWSAqKikKLSAgICB4bWFsbG9jIChzaXplICogc2l6ZW9mIChDR0VOX0tFWVdPUkRfRU5UUlkgKikpOwotICBtZW1zZXQgKGt0LT52YWx1ZV9oYXNoX3RhYmxlLCAwLCBzaXplICogc2l6ZW9mIChDR0VOX0tFWVdPUkRfRU5UUlkgKikpOwotCi0gIC8qIFRoZSB0YWJsZSBpcyBzY2FubmVkIGJhY2t3YXJkcyBhcyB3ZSB3YW50IGtleXdvcmRzIGFwcGVhcmluZyBlYXJsaWVyIHRvCi0gICAgIGJlIHByZWZlcmVkIG92ZXIgbGF0ZXIgb25lcy4gICovCi0gIGZvciAoaSA9IGt0LT5udW1faW5pdF9lbnRyaWVzIC0gMTsgaSA+PSAwOyAtLWkpCi0gICAgY2dlbl9rZXl3b3JkX2FkZCAoa3QsICZrdC0+aW5pdF9lbnRyaWVzW2ldKTsKLX0KLQwKLS8qIEhhcmR3YXJlIHN1cHBvcnQuICAqLwotCi0vKiBMb29rdXAgYSBoYXJkd2FyZSBlbGVtZW50IGJ5IGl0cyBuYW1lLgotICAgUmV0dXJucyBOVUxMIGlmIE5BTUUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gICBtYWNoL2lzYS4gICovCi0KLWNvbnN0IENHRU5fSFdfRU5UUlkgKgotY2dlbl9od19sb29rdXBfYnlfbmFtZSAoY2QsIG5hbWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBpOwotICBjb25zdCBDR0VOX0hXX0VOVFJZICoqaHcgPSBjZC0+aHdfdGFibGUuZW50cmllczsKLQotICBmb3IgKGkgPSAwOyBpIDwgY2QtPmh3X3RhYmxlLm51bV9lbnRyaWVzOyArK2kpCi0gICAgaWYgKGh3W2ldICYmIHN0cmNtcCAobmFtZSwgaHdbaV0tPm5hbWUpID09IDApCi0gICAgICByZXR1cm4gaHdbaV07Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIExvb2t1cCBhIGhhcmR3YXJlIGVsZW1lbnQgYnkgaXRzIG51bWJlci4KLSAgIEhhcmR3YXJlIGVsZW1lbnRzIGFyZSBlbnVtZXJhdGVkLCBob3dldmVyIGl0IG1heSBiZSBwb3NzaWJsZSB0byBhZGQgc29tZQotICAgYXQgcnVudGltZSwgdGh1cyBIV05VTSBpcyBub3QgYW4gZW51bSB0eXBlIGJ1dCByYXRoZXIgYW4gaW50LgotICAgUmV0dXJucyBOVUxMIGlmIEhXTlVNIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtYWNoLiAgKi8KLQotY29uc3QgQ0dFTl9IV19FTlRSWSAqCi1jZ2VuX2h3X2xvb2t1cF9ieV9udW0gKGNkLCBod251bSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IGh3bnVtOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKmh3ID0gY2QtPmh3X3RhYmxlLmVudHJpZXM7Ci0KLSAgLyogPz8/IFRoaXMgY2FuIGJlIHNwZWVkZWQgdXAuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgY2QtPmh3X3RhYmxlLm51bV9lbnRyaWVzOyArK2kpCi0gICAgaWYgKGh3W2ldICYmIGh3bnVtID09IGh3W2ldLT50eXBlKQotICAgICAgcmV0dXJuIGh3W2ldOwotCi0gIHJldHVybiBOVUxMOwotfQotDAotLyogT3BlcmFuZCBzdXBwb3J0LiAgKi8KLQotLyogTG9va3VwIGFuIG9wZXJhbmQgYnkgaXRzIG5hbWUuCi0gICBSZXR1cm5zIE5VTEwgaWYgTkFNRSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAgIG1hY2gvaXNhLiAgKi8KLQotY29uc3QgQ0dFTl9PUEVSQU5EICoKLWNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbmFtZSAoY2QsIG5hbWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBpOwotICBjb25zdCBDR0VOX09QRVJBTkQgKipvcCA9IGNkLT5vcGVyYW5kX3RhYmxlLmVudHJpZXM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNkLT5vcGVyYW5kX3RhYmxlLm51bV9lbnRyaWVzOyArK2kpCi0gICAgaWYgKG9wW2ldICYmIHN0cmNtcCAobmFtZSwgb3BbaV0tPm5hbWUpID09IDApCi0gICAgICByZXR1cm4gb3BbaV07Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIExvb2t1cCBhbiBvcGVyYW5kIGJ5IGl0cyBudW1iZXIuCi0gICBPcGVyYW5kcyBhcmUgZW51bWVyYXRlZCwgaG93ZXZlciBpdCBtYXkgYmUgcG9zc2libGUgdG8gYWRkIHNvbWUKLSAgIGF0IHJ1bnRpbWUsIHRodXMgT1BOVU0gaXMgbm90IGFuIGVudW0gdHlwZSBidXQgcmF0aGVyIGFuIGludC4KLSAgIFJldHVybnMgTlVMTCBpZiBPUE5VTSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAgIG1hY2gvaXNhLiAgKi8KLQotY29uc3QgQ0dFTl9PUEVSQU5EICoKLWNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtIChjZCwgb3BudW0pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcG51bTsKLXsKLSAgcmV0dXJuIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJpZXNbb3BudW1dOwotfQotDAotLyogSW5zdHJ1Y3Rpb24gc3VwcG9ydC4gICovCi0KLS8qIFJldHVybiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpbmNsdWRlcyBhbnkgYWRkZWQgYXQgcnVudGltZS4gICovCi0KLWludAotY2dlbl9pbnNuX2NvdW50IChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGNvdW50ID0gY2QtPmluc25fdGFibGUubnVtX2luaXRfZW50cmllczsKLSAgQ0dFTl9JTlNOX0xJU1QgKnJ0X2luc25zID0gY2QtPmluc25fdGFibGUubmV3X2VudHJpZXM7Ci0KLSAgZm9yICggOyBydF9pbnNucyAhPSBOVUxMOyBydF9pbnNucyA9IHJ0X2luc25zLT5uZXh0KQotICAgICsrY291bnQ7Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKiBSZXR1cm4gbnVtYmVyIG9mIG1hY3JvLWluc3RydWN0aW9ucy4KLSAgIFRoaXMgaW5jbHVkZXMgYW55IGFkZGVkIGF0IHJ1bnRpbWUuICAqLwotCi1pbnQKLWNnZW5fbWFjcm9faW5zbl9jb3VudCAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBjb3VudCA9IGNkLT5tYWNyb19pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXM7Ci0gIENHRU5fSU5TTl9MSVNUICpydF9pbnNucyA9IGNkLT5tYWNyb19pbnNuX3RhYmxlLm5ld19lbnRyaWVzOwotCi0gIGZvciAoIDsgcnRfaW5zbnMgIT0gTlVMTDsgcnRfaW5zbnMgPSBydF9pbnNucy0+bmV4dCkKLSAgICArK2NvdW50OwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyogQ292ZXIgZnVuY3Rpb24gdG8gcmVhZCBhbmQgcHJvcGVybHkgYnl0ZXN3YXAgYW4gaW5zbiB2YWx1ZS4gICovCi0KLUNHRU5fSU5TTl9JTlQKLWNnZW5fZ2V0X2luc25fdmFsdWUgKGNkLCBidWYsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmOwotICAgICBpbnQgbGVuZ3RoOwotewotICBDR0VOX0lOU05fSU5UIHZhbHVlOwotCi0gIHN3aXRjaCAobGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB2YWx1ZSA9ICpidWY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCi0JdmFsdWUgPSBiZmRfZ2V0YjE2IChidWYpOwotICAgICAgZWxzZQotCXZhbHVlID0gYmZkX2dldGwxNiAoYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoY2QtPmluc25fZW5kaWFuID09IENHRU5fRU5ESUFOX0JJRykKLQl2YWx1ZSA9IGJmZF9nZXRiMzIgKGJ1Zik7Ci0gICAgICBlbHNlCi0JdmFsdWUgPSBiZmRfZ2V0bDMyIChidWYpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIENvdmVyIGZ1bmN0aW9uIHRvIHN0b3JlIGFuIGluc24gdmFsdWUgcHJvcGVybHkgYnl0ZXN3YXBwZWQuICAqLwotCi12b2lkCi1jZ2VuX3B1dF9pbnNuX3ZhbHVlIChjZCwgYnVmLCBsZW5ndGgsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIGludCBsZW5ndGg7Ci0gICAgIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci17Ci0gIHN3aXRjaCAobGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICBidWZbMF0gPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoY2QtPmluc25fZW5kaWFuID09IENHRU5fRU5ESUFOX0JJRykKLQliZmRfcHV0YjE2ICh2YWx1ZSwgYnVmKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDE2ICh2YWx1ZSwgYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoY2QtPmluc25fZW5kaWFuID09IENHRU5fRU5ESUFOX0JJRykKLQliZmRfcHV0YjMyICh2YWx1ZSwgYnVmKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyICh2YWx1ZSwgYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0MCi0vKiBMb29rIHVwIGluc3RydWN0aW9uIElOU05fKl9WQUxVRSBhbmQgZXh0cmFjdCBpdHMgZmllbGRzLgotICAgSU5TTl9JTlRfVkFMVUUgaXMgdXNlZCBpZiBDR0VOX0lOVF9JTlNOX1AuCi0gICBPdGhlcndpc2UgSU5TTl9CWVRFU19WQUxVRSBpcyB1c2VkLgotICAgSU5TTiwgaWYgbm9uLW51bGwsIGlzIHRoZSBpbnNuIHRhYmxlIGVudHJ5LgotICAgT3RoZXJ3aXNlIElOU05fKl9WQUxVRSBpcyBleGFtaW5lZCB0byBjb21wdXRlIGl0LgotICAgTEVOR1RIIGlzIHRoZSBiaXQgbGVuZ3RoIG9mIElOU05fKl9WQUxVRSBpZiBrbm93biwgb3RoZXJ3aXNlIDAuCi0gICAwIGlzIG9ubHkgdmFsaWQgaWYgYGluc24gPT0gTlVMTCAmJiAhIENHRU5fSU5UX0lOU05fUCcuCi0gICBJZiBJTlNOICE9IE5VTEwsIExFTkdUSCBtdXN0IGJlIHZhbGlkLgotICAgQUxJQVNfUCBpcyBub24temVybyBpZiBhbGlhcyBpbnNucyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaC4KLQotICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGluc24gdGFibGUgZW50cnksIG9yIE5VTEwgaWYgdGhlIGluc3RydWN0aW9uCi0gICB3YXNuJ3QgcmVjb2duaXplZC4gICovCi0KLS8qID8/PyBXaWxsIG5lZWQgdG8gYmUgcmV2aXNpdGVkIGZvciBWTElXIGFyY2hpdGVjdHVyZXMuICAqLwotCi1jb25zdCBDR0VOX0lOU04gKgotY2dlbl9sb29rdXBfaW5zbiAoY2QsIGluc24sIGluc25faW50X3ZhbHVlLCBpbnNuX2J5dGVzX3ZhbHVlLCBsZW5ndGgsIGZpZWxkcywKLQkJICBhbGlhc19wKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl9pbnRfdmFsdWU7Ci0gICAgIC8qID8/PyBDR0VOX0lOU05fQllURVMgd291bGQgYmUgYSBuaWNlIHR5cGUgbmFtZSB0byB1c2UgaGVyZS4gICovCi0gICAgIHVuc2lnbmVkIGNoYXIgKmluc25fYnl0ZXNfdmFsdWU7Ci0gICAgIGludCBsZW5ndGg7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGludCBhbGlhc19wOwotewotICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gIENHRU5fSU5TTl9JTlQgYmFzZV9pbnNuOwotICBDR0VOX0VYVFJBQ1RfSU5GTyBleF9pbmZvOwotICBDR0VOX0VYVFJBQ1RfSU5GTyAqaW5mbzsKLQotICBpZiAoY2QtPmludF9pbnNuX3ApCi0gICAgewotICAgICAgaW5mbyA9IE5VTEw7Ci0gICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSBhbGxvY2EgKGNkLT5tYXhfaW5zbl9iaXRzaXplIC8gOCk7Ci0gICAgICBjZ2VuX3B1dF9pbnNuX3ZhbHVlIChjZCwgYnVmLCBsZW5ndGgsIGluc25faW50X3ZhbHVlKTsKLSAgICAgIGJhc2VfaW5zbiA9IGluc25faW50X3ZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluZm8gPSAmZXhfaW5mbzsKLSAgICAgIGV4X2luZm8uZGlzX2luZm8gPSBOVUxMOwotICAgICAgZXhfaW5mby5pbnNuX2J5dGVzID0gaW5zbl9ieXRlc192YWx1ZTsKLSAgICAgIGV4X2luZm8udmFsaWQgPSAtMTsKLSAgICAgIGJ1ZiA9IGluc25fYnl0ZXNfdmFsdWU7Ci0gICAgICBiYXNlX2luc24gPSBjZ2VuX2dldF9pbnNuX3ZhbHVlIChjZCwgYnVmLCBsZW5ndGgpOwotICAgIH0KLQotICBpZiAoIWluc24pCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmluc25fbGlzdDsKLQotICAgICAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGhhc2ggbGlzdHMuCi0JIFBpY2sgdGhlIGZpcnN0IG9uZSBhbmQga2VlcCB0cnlpbmcgdW50aWwgd2UgZmluZCB0aGUgcmlnaHQgb25lLiAgKi8KLQotICAgICAgaW5zbl9saXN0ID0gY2dlbl9kaXNfbG9va3VwX2luc24gKGNkLCBidWYsIGJhc2VfaW5zbik7Ci0gICAgICB3aGlsZSAoaW5zbl9saXN0ICE9IE5VTEwpCi0JewotCSAgaW5zbiA9IGluc25fbGlzdC0+aW5zbjsKLQotCSAgaWYgKGFsaWFzX3AKLQkgICAgICAvKiBGSVhNRTogRW5zdXJlIEFMSUFTIGF0dHJpYnV0ZSBhbHdheXMgaGFzIHNhbWUgaW5kZXguICAqLwotCSAgICAgIHx8ICEgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9BTElBUykpCi0JICAgIHsKLQkgICAgICAvKiBCYXNpYyBiaXQgbWFzayBtdXN0IGJlIGNvcnJlY3QuICAqLwotCSAgICAgIC8qID8/PyBNYXkgd2lzaCB0byBhbGxvdyB0YXJnZXQgdG8gZGVmZXIgdGhpcyBjaGVjayB1bnRpbCB0aGUKLQkJIGV4dHJhY3QgaGFuZGxlci4gICovCi0JICAgICAgaWYgKChiYXNlX2luc24gJiBDR0VOX0lOU05fQkFTRV9NQVNLIChpbnNuKSkKLQkJICA9PSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbikpCi0JCXsKLQkJICAvKiA/Pz8gMCBpcyBwYXNzZWQgZm9yIGBwYycgKi8KLQkJICBpbnQgZWxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCi0JCSAgICAoY2QsIGluc24sIGluZm8sIGJhc2VfaW5zbiwgZmllbGRzLCAoYmZkX3ZtYSkgMCk7Ci0JCSAgaWYgKGVsZW5ndGggPiAwKQotCQkgICAgewotCQkgICAgICAvKiBzYW5pdHkgY2hlY2sgKi8KLQkJICAgICAgaWYgKGxlbmd0aCAhPSAwICYmIGxlbmd0aCAhPSBlbGVuZ3RoKQotCQkJYWJvcnQgKCk7Ci0JCSAgICAgIHJldHVybiBpbnNuOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaW5zbl9saXN0ID0gaW5zbl9saXN0LT5uZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTYW5pdHkgY2hlY2s6IGNhbid0IHBhc3MgYW4gYWxpYXMgaW5zbiBpZiAhIGFsaWFzX3AuICAqLwotICAgICAgaWYgKCEgYWxpYXNfcAotCSAgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9BTElBUykpCi0JYWJvcnQgKCk7Ci0gICAgICAvKiBTYW5pdHkgY2hlY2s6IGxlbmd0aCBtdXN0IGJlIGNvcnJlY3QuICAqLwotICAgICAgaWYgKGxlbmd0aCAhPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbikpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIC8qID8/PyAwIGlzIHBhc3NlZCBmb3IgYHBjJyAqLwotICAgICAgbGVuZ3RoID0gQ0dFTl9FWFRSQUNUX0ZOIChjZCwgaW5zbikKLQkoY2QsIGluc24sIGluZm8sIGJhc2VfaW5zbiwgZmllbGRzLCAoYmZkX3ZtYSkgMCk7Ci0gICAgICAvKiBTYW5pdHkgY2hlY2s6IG11c3Qgc3VjY2VlZC4KLQkgQ291bGQgcmVsYXggdGhpcyBsYXRlciBpZiBpdCBldmVyIHByb3ZlcyB1c2VmdWwuICAqLwotICAgICAgaWYgKGxlbmd0aCA9PSAwKQotCWFib3J0ICgpOwotICAgICAgcmV0dXJuIGluc247Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBGaWxsIGluIHRoZSBvcGVyYW5kIGluc3RhbmNlcyB1c2VkIGJ5IElOU04gd2hvc2Ugb3BlcmFuZHMgYXJlIEZJRUxEUy4KLSAgIElORElDRVMgaXMgYSBwb2ludGVyIHRvIGEgYnVmZmVyIG9mIE1BWF9PUEVSQU5EX0lOU1RBTkNFUyBpbnRzIHRvIGJlIGZpbGxlZAotICAgaW4uICAqLwotCi12b2lkCi1jZ2VuX2dldF9pbnNuX29wZXJhbmRzIChjZCwgaW5zbiwgZmllbGRzLCBpbmRpY2VzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGludCAqaW5kaWNlczsKLXsKLSAgY29uc3QgQ0dFTl9PUElOU1QgKm9waW5zdDsKLSAgaW50IGk7Ci0KLSAgaWYgKGluc24tPm9waW5zdCA9PSBOVUxMKQotICAgIGFib3J0ICgpOwotICBmb3IgKGkgPSAwLCBvcGluc3QgPSBpbnNuLT5vcGluc3Q7IG9waW5zdC0+dHlwZSAhPSBDR0VOX09QSU5TVF9FTkQ7ICsraSwgKytvcGluc3QpCi0gICAgewotICAgICAgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSBvcF90eXBlID0gb3BpbnN0LT5vcF90eXBlOwotICAgICAgaWYgKG9wX3R5cGUgPT0gQ0dFTl9PUEVSQU5EX05JTCkKLQlpbmRpY2VzW2ldID0gb3BpbnN0LT5pbmRleDsKLSAgICAgIGVsc2UKLQlpbmRpY2VzW2ldID0gKCpjZC0+Z2V0X2ludF9vcGVyYW5kKSAoY2QsIG9wX3R5cGUsIGZpZWxkcyk7Ci0gICAgfQotfQotCi0vKiBDb3ZlciBmdW5jdGlvbiB0byBjZ2VuX2dldF9pbnNuX29wZXJhbmRzIHdoZW4gZWl0aGVyIElOU04gb3IgRklFTERTCi0gICBpc24ndCBrbm93bi4KLSAgIFRoZSBJTlNOLCBJTlNOXypfVkFMVUUsIGFuZCBMRU5HVEggYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8KLSAgIGNnZW5fbG9va3VwX2luc24gdW5jaGFuZ2VkLgotICAgSU5TTl9JTlRfVkFMVUUgaXMgdXNlZCBpZiBDR0VOX0lOVF9JTlNOX1AuCi0gICBPdGhlcndpc2UgSU5TTl9CWVRFU19WQUxVRSBpcyB1c2VkLgotCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBpbnNuIHRhYmxlIGVudHJ5IG9yIE5VTEwgaWYgdGhlIGluc3RydWN0aW9uIHdhc24ndAotICAgcmVjb2duaXplZC4gICovCi0KLWNvbnN0IENHRU5fSU5TTiAqCi1jZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcyAoY2QsIGluc24sIGluc25faW50X3ZhbHVlLCBpbnNuX2J5dGVzX3ZhbHVlLAotCQkJICAgICAgIGxlbmd0aCwgaW5kaWNlcywgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl9pbnRfdmFsdWU7Ci0gICAgIC8qID8/PyBDR0VOX0lOU05fQllURVMgd291bGQgYmUgYSBuaWNlIHR5cGUgbmFtZSB0byB1c2UgaGVyZS4gICovCi0gICAgIHVuc2lnbmVkIGNoYXIgKmluc25fYnl0ZXNfdmFsdWU7Ci0gICAgIGludCBsZW5ndGg7Ci0gICAgIGludCAqaW5kaWNlczsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLXsKLSAgLyogUGFzcyBub24temVybyBmb3IgQUxJQVNfUCBvbmx5IGlmIElOU04gIT0gTlVMTC4KLSAgICAgSWYgSU5TTiA9PSBOVUxMLCB3ZSB3YW50IGEgcmVhbCBpbnNuLiAgKi8KLSAgaW5zbiA9IGNnZW5fbG9va3VwX2luc24gKGNkLCBpbnNuLCBpbnNuX2ludF92YWx1ZSwgaW5zbl9ieXRlc192YWx1ZSwKLQkJCSAgIGxlbmd0aCwgZmllbGRzLCBpbnNuICE9IE5VTEwpOwotICBpZiAoISBpbnNuKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNnZW5fZ2V0X2luc25fb3BlcmFuZHMgKGNkLCBpbnNuLCBmaWVsZHMsIGluZGljZXMpOwotICByZXR1cm4gaW5zbjsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlnLmluIGIvb3Bjb2Rlcy9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MGEzMjEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MT0NBTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUFMTE9DX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlndXJlIGIvb3Bjb2Rlcy9jb25maWd1cmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2ZTUwMjkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NzYwICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiAgIGJ1aWxkIHNoYXJlZCBCRkQvb3Bjb2Rlcy9saWJpYmVydHkgbGlicmFyeSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9ejhrLWRpcy5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkc2l0ZWZpbGUiOyB0aGVuCi0gIGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGVsc2UKLSAgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBmaQotICBmaQotZWxzZQotICBDT05GSUdfU0lURT0iJHNpdGVmaWxlIgotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYwNTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MjY6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0NDogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjY5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2OTk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc4MjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgNzkzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Nzk4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyNDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyOTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODM4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg1NzogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg4OTogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLSMgV2UgY3VycmVudGx5IG9ubHkgdXNlIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIG5hbWUgb2YgYW55IHNoYXJlZAotIyBsaWJyYXJ5LiAgRm9yIHVzZXIgY29udmVuaWVuY2UsIHdlIGFsd2F5cyB1c2UgdGhlIHNhbWUgdmVyc2lvbgotIyBudW1iZXIgdGhhdCBCRkQgaXMgdXNpbmcuCi1CRkRfVkVSU0lPTj1gZ3JlcCBJTklUX0FVVE9NQUtFICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmluIHwgc2VkIC1uIC1lICdzL1sgCV0vL2cnIC1lICdzL14uKixcKC4qXCkpLiokL1wxL3AnYAotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkyNzogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5ODA6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KLSAgIGZpCi0KLSAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9Ci1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAzNzogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1Ci1zZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgotYWxsOgotCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCi1FT0YKLSMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgotZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCi1pZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcwotZWxzZQotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0bWFrZQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgU0VUX01BS0U9Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCi1maQotCi0KLVBBQ0tBR0U9b3Bjb2RlcwotCi1WRVJTSU9OPSR7QkZEX1ZFUlNJT059Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotRU9GCi0KLQotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYWNsb2NhbCAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFDTE9DQUw9YWNsb2NhbAotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBQ0xPQ0FMPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhY2xvY2FsIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDk2OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPQ09ORj1hdXRvY29uZgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMDk6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9NQUtFPWF1dG9tYWtlCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTIyOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvaGVhZGVyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0hFQURFUj1hdXRvaGVhZGVyCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9IRUFERVI9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9oZWFkZXIiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMzU6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIE1BS0VJTkZPPW1ha2VpbmZvCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi0KLQotaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KLSAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KLWVsc2UKLSAgYWNfdG9vbF9wcmVmaXg9Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE1ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FSJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUiIgJiYgYWNfY3ZfcHJvZ19BUj0iYXIiCi1maQotZmkKLUFSPSIkYWNfY3ZfcHJvZ19BUiIKLWlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTkwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjIyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBSQU5MSUI9IjoiCi1maQotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzI4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKLSAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNjc6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM5MTogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzk0OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTEQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi10ZXN0IC16ICIkTEQiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotCi1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQzMDogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ251X2xkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2dudV9sZCIgMT4mNgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ0NjogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX05NJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maQotZmkKLQotTk09IiRhY19jdl9wYXRoX05NIgotZWNobyAiJGFjX3QiIiROTSIgMT4mNgotCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1lY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0ODQ6IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qIAlcKCRhY19zeW1jb2RlXCkgCSAJKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1NDc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1NTE6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYwMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0JICAgIGNhdCBjb25mdGVzdC5jID4mNQotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC5jID4mNQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi0KLWZpCi0KLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1lY2hvICIkYWNfdCIiJGFjX3Jlc3VsdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY0OTogY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY1ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjYxOiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYyA+JjUKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlIiAxPiY2Ci1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2ODc6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKLXRoZW4KLSAgcm0gLWYgY29uZnRlc3RkYXRhCi0gIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCi1lbHNlCi0gIGFjX2N2X3Byb2dfTE5fUz1sbgotZmkKLWZpCi1MTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgotaWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSAxNzIzICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzI0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NDU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNzUwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzU3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc4MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9ImRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiICYmIGFjX2N2X3Byb2dfRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBETExUT09MPSJmYWxzZSIKLWZpCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg0NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9ImFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyIgJiYgYWNfY3ZfcHJvZ19BUz0iZmFsc2UiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgQVM9ImZhbHNlIgotZmkKLWZpCi0KLQotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0gIG5lZWRfbG9ja3M9JGVuYWJsZXZhbAotZWxzZQotICBuZWVkX2xvY2tzPXllcwotZmkKLQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLQotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9Ci0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tbW9uYmZkbGliIG9yIC0tZGlzYWJsZS1jb21tb25iZmRsaWIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY29tbW9uYmZkbGliK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21tb25iZmRsaWIiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3Igb3Bjb2RlcyBjb21tb25iZmRsaWIgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLWZpCi0KLQotCi0KLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDU4OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKLSAgCi0KLWlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA4MTogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA4NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA5NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjExNDogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTE5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEyNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTQ1OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTU1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi0jIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6Ci0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE4MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIxMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyNjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyOTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDIzMDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzEwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMzY6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzQxOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzUwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNjk6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLQotQUxMX0xJTkdVQVM9Ci1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQwMzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDE4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDI0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDM1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDQxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDUyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDU4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDgzOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDg4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDk2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTUyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU4NzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTkyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NDE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY2MjogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjY5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY3NjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MDI6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3MDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjczNTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzcwOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc3NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzgyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgwMzogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODA4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4MzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODY4OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4OTg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5MDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjkyNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTUzOiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk2MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTgwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwMDU6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDE1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwNDQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA3MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA5NzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzEwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI0NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNzM6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjc4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjgzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzMxMzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzMxOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzQxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzcwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzc1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzOTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQzMjogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDM3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NjU6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ4NTogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTA0OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNTA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM1MTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTMxOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MzYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1NDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU1OTogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1NjcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTc4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTk0OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1OTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzYzNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY2ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzY3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzIzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc1OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNzkxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzk5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzgzMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4NjU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTAxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTkxOiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDE5OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MDI0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQwMjk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi0uICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmhvc3QKLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxMDY6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotZm9yIGFjX2hkciBpbiBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTYzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDE2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE3MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotCi11c2luZ19jZ2VuPW5vCi0KLSMgSG9ycmlibGUgaGFja3MgdG8gYnVpbGQgRExMcyBvbiBXaW5kb3dzLgotV0lOMzJMREZMQUdTPQotV0lOMzJMSUJBREQ9Ci1jYXNlICIke2hvc3R9IiBpbgotKi0qLWN5Z3dpbiopCi0gIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCi0gICAgV0lOMzJMREZMQUdTPSItbm8tdW5kZWZpbmVkIgotICAgIFdJTjMyTElCQUREPSItTGBwd2RgLy4uL2JmZCAtbGJmZCAtTGBwd2RgLy4uL2xpYmliZXJ0eSAtbGliZXJ0eSAtTGBwd2RgLy4uL2ludGwgLWxpbnRsIC1sY3lnd2luIgotICBmaQotICA7OwotZXNhYwotCi0KLQotIyB0YXJnZXQtc3BlY2lmaWMgc3R1ZmY6Ci0KLSMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotaWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIiA7IHRoZW4KLSAgICBmb3IgdGFyZyBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotICAgIGRvCi0JcmVzdWx0PWAkYWNfY29uZmlnX3N1YiAkdGFyZyAyPi9kZXYvbnVsbGAKLQlpZiB0ZXN0IC1uICIkcmVzdWx0IiA7IHRoZW4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKLQllbHNlCi0JICAgICMgQWxsb3cgdGFyZ2V0cyB0aGF0IGNvbmZpZy5zdWIgZG9lc24ndCByZWNvZ25pemUsIGxpa2UgImFsbCIuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0YXJnIgotCWZpCi0gICAgZG9uZQotZmkKLQotYWxsX3RhcmdldHM9ZmFsc2UKLXNlbGFyY2hzPQotZm9yIHRhcmcgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cwotZG8KLSAgICBpZiB0ZXN0ICJ4JHRhcmciID0gInhhbGwiIDsgdGhlbgotICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCi0gICAgZWxzZQotCS4gJHNyY2Rpci8uLi9iZmQvY29uZmlnLmJmZAotCXNlbGFyY2hzPSIkc2VsYXJjaHMgJHRhcmdfYXJjaHMiCi0gICAgZmkKLWRvbmUJCi0KLSMgVXRpbGl0eSB2YXIsIGRvY3VtZW50cyBnZW5lcmljIGNnZW4gc3VwcG9ydCBmaWxlcy4KLQotY2dlbl9maWxlcz0iY2dlbi1vcGMubG8gY2dlbi1hc20ubG8gY2dlbi1kaXMubG8iCi0KLSMgV2UgZG9uJ3QgZG8gYW55IGxpbmtzIGJhc2VkIG9uIHRoZSB0YXJnZXQgc3lzdGVtLCBqdXN0IG1ha2VmaWxlIGNvbmZpZy4KLQotaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4ZmFsc2UgOyB0aGVuCi0KLSAgICAjIFRhcmdldCBhcmNoaXRlY3R1cmUgLm8gZmlsZXMuCi0gICAgdGE9Ci0KLSAgICBmb3IgYXJjaCBpbiAkc2VsYXJjaHMKLSAgICBkbwotCWFkPWBlY2hvICRhcmNoIHwgc2VkIC1lIHMvYmZkXy8vZyAtZSBzL19hcmNoLy9nYAotCWFyY2hkZWZzPSIkYXJjaGRlZnMgLURBUkNIXyRhZCIKLQljYXNlICIkYXJjaCIgaW4KLQliZmRfYTI5a19hcmNoKQkJdGE9IiR0YSBhMjlrLWRpcy5sbyIgOzsKLQliZmRfYWxsaWFudF9hcmNoKQk7OwotCWJmZF9hbHBoYV9hcmNoKQkJdGE9IiR0YSBhbHBoYS1kaXMubG8gYWxwaGEtb3BjLmxvIiA7OwotCWJmZF9hcmNfYXJjaCkJCXRhPSIkdGEgYXJjLWRpcy5sbyBhcmMtb3BjLmxvIiA7OwotCWJmZF9hcm1fYXJjaCkJCXRhPSIkdGEgYXJtLWRpcy5sbyIgOzsKLQliZmRfY29udmV4X2FyY2gpCTs7Ci0JYmZkX2QxMHZfYXJjaCkJCXRhPSIkdGEgZDEwdi1kaXMubG8gZDEwdi1vcGMubG8iIDs7Ci0JYmZkX2QzMHZfYXJjaCkJCXRhPSIkdGEgZDMwdi1kaXMubG8gZDMwdi1vcGMubG8iIDs7Ci0JYmZkX2ZyMzBfYXJjaCkgICAgICAgICAgdGE9IiR0YSBmcjMwLWFzbS5sbyBmcjMwLWRlc2MubG8gZnIzMC1kaXMubG8gZnIzMC1pYmxkLmxvIGZyMzAtb3BjLmxvIiB1c2luZ19jZ2VuPXllcyA7OwotCWJmZF9oODMwMF9hcmNoKQkJdGE9IiR0YSBoODMwMC1kaXMubG8iIDs7Ci0JYmZkX2g4NTAwX2FyY2gpCQl0YT0iJHRhIGg4NTAwLWRpcy5sbyIgOzsKLQliZmRfaHBwYV9hcmNoKQkJdGE9IiR0YSBocHBhLWRpcy5sbyIgOzsKLQliZmRfaTM4Nl9hcmNoKQkJdGE9IiR0YSBpMzg2LWRpcy5sbyIgOzsKLQliZmRfaTg2MF9hcmNoKQkJOzsKLQliZmRfaTk2MF9hcmNoKQkJdGE9IiR0YSBpOTYwLWRpcy5sbyIgOzsKLQliZmRfbTMycl9hcmNoKQkJdGE9IiR0YSBtMzJyLWFzbS5sbyBtMzJyLWRlc2MubG8gbTMyci1kaXMubG8gbTMyci1pYmxkLmxvIG0zMnItb3BjLmxvIG0zMnItb3BpbnN0LmxvIiB1c2luZ19jZ2VuPXllcyA7OwotCWJmZF9tNjhrX2FyY2gpCQl0YT0iJHRhIG02OGstZGlzLmxvIG02OGstb3BjLmxvIiA7OwotCWJmZF9tODhrX2FyY2gpCQl0YT0iJHRhIG04OGstZGlzLmxvIiA7OwotCWJmZF9tY29yZV9hcmNoKQkJdGE9IiR0YSBtY29yZS1kaXMubG8iIDs7Ci0JYmZkX21pcHNfYXJjaCkJCXRhPSIkdGEgbWlwcy1kaXMubG8gbWlwcy1vcGMubG8gbWlwczE2LW9wYy5sbyIgOzsKLQliZmRfbW4xMDIwMF9hcmNoKQl0YT0iJHRhIG0xMDIwMC1kaXMubG8gbTEwMjAwLW9wYy5sbyIgOzsKLQliZmRfbW4xMDMwMF9hcmNoKQl0YT0iJHRhIG0xMDMwMC1kaXMubG8gbTEwMzAwLW9wYy5sbyIgOzsKLQliZmRfbnMzMmtfYXJjaCkJCXRhPSIkdGEgbnMzMmstZGlzLmxvIiA7OwotCWJmZF9wal9hcmNoKQkgICAgICAgIHRhPSIkdGEgcGotZGlzLmxvIHBqLW9wYy5sbyIgOzsKLQliZmRfcG93ZXJwY19hcmNoKQl0YT0iJHRhIHBwYy1kaXMubG8gcHBjLW9wYy5sbyIgOzsKLQliZmRfcHlyYW1pZF9hcmNoKQk7OwotCWJmZF9yb21wX2FyY2gpCQk7OwotCWJmZF9yczYwMDBfYXJjaCkJdGE9IiR0YSBwcGMtZGlzLmxvIHBwYy1vcGMubG8iIDs7Ci0JYmZkX3NoX2FyY2gpCQl0YT0iJHRhIHNoLWRpcy5sbyIgOzsKLQliZmRfc3BhcmNfYXJjaCkJCXRhPSIkdGEgc3BhcmMtZGlzLmxvIHNwYXJjLW9wYy5sbyIgOzsKLQliZmRfdGFob2VfYXJjaCkJCTs7Ci0JYmZkX3RpYzMwX2FyY2gpCQl0YT0iJHRhIHRpYzMwLWRpcy5sbyIgOzsKLQliZmRfdGljODBfYXJjaCkJCXRhPSIkdGEgdGljODAtZGlzLmxvIHRpYzgwLW9wYy5sbyIgOzsKLQliZmRfdjg1MF9hcmNoKQkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdjg1MGVfYXJjaCkJCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3Y4NTBlYV9hcmNoKQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92YXhfYXJjaCkJCXRhPSIkdGEgdmF4LWRpcy5sbyIgOzsKLQliZmRfdzY1X2FyY2gpCQl0YT0iJHRhIHc2NS1kaXMubG8iIDs7Ci0JYmZkX3dlMzJrX2FyY2gpCQk7OwotCWJmZF96OGtfYXJjaCkJCXRhPSIkdGEgejhrLWRpcy5sbyIgOzsKLQotCSIiKQkJCTs7Ci0JKikJCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogKioqIHVua25vd24gdGFyZ2V0IGFyY2hpdGVjdHVyZSAkYXJjaCIgMT4mMjsgZXhpdCAxOyB9IDs7Ci0JZXNhYwotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0JdGE9IiR0YSAkY2dlbl9maWxlcyIKLSAgICBmaQotCi0gICAgIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi0gICAgZj0iIgotICAgIGZvciBpIGluICR0YSA7IGRvCi0JY2FzZSAiICRmICIgaW4KLQkqIiAkaSAiKikgOzsKLQkqKSBmPSIkZiAkaSIgOzsKLQllc2FjCi0gICAgZG9uZQotICAgIHRhPSIkZiIKLQotICAgICMgQW5kIGR1cGxpY2F0ZSAtRCBmbGFncy4KLSAgICBmPSIiCi0gICAgZm9yIGkgaW4gJGFyY2hkZWZzIDsgZG8KLQljYXNlICIgJGYgIiBpbgotCSoiICRpICIqKSA7OwotCSopIGY9IiRmICRpIiA7OwotCWVzYWMKLSAgICBkb25lCi0gICAgYXJjaGRlZnM9IiRmIgotCi0gICAgQkZEX01BQ0hJTkVTPSIkdGEiCi0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICAgYXJjaGRlZnM9LURBUkNIX2FsbAotICAgIEJGRF9NQUNISU5FUz0nJChBTExfTUFDSElORVMpJwotZmkKLQotCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBQQUNLQUdFQCUkUEFDS0FHRSVnCi1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCi1zJUBBQ0xPQ0FMQCUkQUNMT0NBTCVnCi1zJUBBVVRPQ09ORkAlJEFVVE9DT05GJWcKLXMlQEFVVE9NQUtFQCUkQVVUT01BS0UlZwotcyVAQVVUT0hFQURFUkAlJEFVVE9IRUFERVIlZwotcyVATUFLRUlORk9AJSRNQUtFSU5GTyVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQExEQCUkTEQlZwotcyVATk1AJSROTSVnCi1zJUBVU0VfU1lNQk9MX1VOREVSU0NPUkVAJSRVU0VfU1lNQk9MX1VOREVSU0NPUkUlZwotcyVATE5fU0AlJExOX1MlZwotcyVARExMVE9PTEAlJERMTFRPT0wlZwotcyVAQVNAJSRBUyVnCi1zJUBMSUJUT09MQCUkTElCVE9PTCVnCi1zJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBXSU4zMkxERkxBR1NAJSRXSU4zMkxERkxBR1MlZwotcyVAV0lOMzJMSUJBRERAJSRXSU4zMkxJQkFERCVnCi1zJUBhcmNoZGVmc0AlJGFyY2hkZWZzJWcKLXMlQEJGRF9NQUNISU5FU0AlJEJGRF9NQUNISU5FUyVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLXNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlndXJlLmluIGIvb3Bjb2Rlcy9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzk0YjIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwKLQotQUNfUFJFUkVRKDIuMTMpCi1BQ19JTklUKHo4ay1kaXMuYykKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotQUNfSVNDX1BPU0lYCi0KLSMgV2UgY3VycmVudGx5IG9ubHkgdXNlIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIG5hbWUgb2YgYW55IHNoYXJlZAotIyBsaWJyYXJ5LiAgRm9yIHVzZXIgY29udmVuaWVuY2UsIHdlIGFsd2F5cyB1c2UgdGhlIHNhbWUgdmVyc2lvbgotIyBudW1iZXIgdGhhdCBCRkQgaXMgdXNpbmcuCi1jaGFuZ2VxdW90ZSgsKWRubAotQkZEX1ZFUlNJT049YGdyZXAgSU5JVF9BVVRPTUFLRSAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5pbiB8IHNlZCAtbiAtZSAncy9bIAldLy9nJyAtZSAncy9eLiosXCguKlwpKS4qJC9cMS9wJ2AKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQotQU1fSU5JVF9BVVRPTUFLRShvcGNvZGVzLCAke0JGRF9WRVJTSU9OfSkKLQotZG5sIFRoZXNlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wsIGJlY2F1c2UgaXQgbWF5IHdhbnQKLWRubCB0byBjYWxsIEFDX0NIRUNLX1BST0cuCi1BQ19DSEVDS19UT09MKEFSLCBhcikKLUFDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCi0KLWRubCBEZWZhdWx0IHRvIGEgbm9uIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUKLWRubCBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLXNoYXJlZC4KLUFNX0RJU0FCTEVfU0hBUkVECi0KLUFNX1BST0dfTElCVE9PTAotCi1BQ19BUkdfRU5BQkxFKHRhcmdldHMsCi1bICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnNdLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIEFDX0VSUk9SKGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnKQotICAgICAgICAgICAgOzsKLSAgbm8pICAgICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKSAgICAgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhY10pZG5sCi1BQ19BUkdfRU5BQkxFKGNvbW1vbmJmZGxpYiwKLVsgIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiAgIGJ1aWxkIHNoYXJlZCBCRkQvb3Bjb2Rlcy9saWJpYmVydHkgbGlicmFyeV0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7Ci0gIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7Ci0gICopICAgQUNfTVNHX0VSUk9SKFtiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBvcGNvZGVzIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OwotZXNhY10pZG5sCi0KLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLUFDX0FSR19QUk9HUkFNCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi0KLSMgaG9zdC1zcGVjaWZpYyBzdHVmZjoKLQotQUNfUFJPR19DQwotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLS4gJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdAotCi1BQ19TVUJTVChIREVGSU5FUykKLUFDX1BST0dfSU5TVEFMTAotCi1BQ19DSEVDS19IRUFERVJTKHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCkKLQotCi11c2luZ19jZ2VuPW5vCi0KLSMgSG9ycmlibGUgaGFja3MgdG8gYnVpbGQgRExMcyBvbiBXaW5kb3dzLgotV0lOMzJMREZMQUdTPQotV0lOMzJMSUJBREQ9Ci1jYXNlICIke2hvc3R9IiBpbgotKi0qLWN5Z3dpbiopCi0gIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCi0gICAgV0lOMzJMREZMQUdTPSItbm8tdW5kZWZpbmVkIgotICAgIFdJTjMyTElCQUREPSItTGBwd2RgLy4uL2JmZCAtbGJmZCAtTGBwd2RgLy4uL2xpYmliZXJ0eSAtbGliZXJ0eSAtTGBwd2RgLy4uL2ludGwgLWxpbnRsIC1sY3lnd2luIgotICBmaQotICA7OwotZXNhYwotQUNfU1VCU1QoV0lOMzJMREZMQUdTKQotQUNfU1VCU1QoV0lOMzJMSUJBREQpCi0KLSMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgotCi0jIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gICAgZm9yIHRhcmcgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLSAgICBkbwotCXJlc3VsdD1gJGFjX2NvbmZpZ19zdWIgJHRhcmcgMj4vZGV2L251bGxgCi0JaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1zZWxhcmNocz0KLWZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKLWRvCi0gICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIiA7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvLi4vYmZkL2NvbmZpZy5iZmQKLQlzZWxhcmNocz0iJHNlbGFyY2hzICR0YXJnX2FyY2hzIgotICAgIGZpCi1kb25lCQotCi0jIFV0aWxpdHkgdmFyLCBkb2N1bWVudHMgZ2VuZXJpYyBjZ2VuIHN1cHBvcnQgZmlsZXMuCi0KLWNnZW5fZmlsZXM9ImNnZW4tb3BjLmxvIGNnZW4tYXNtLmxvIGNnZW4tZGlzLmxvIgotCi0jIFdlIGRvbid0IGRvIGFueSBsaW5rcyBiYXNlZCBvbiB0aGUgdGFyZ2V0IHN5c3RlbSwganVzdCBtYWtlZmlsZSBjb25maWcuCi0KLWlmIHRlc3QgeCR7YWxsX3RhcmdldHN9ID0geGZhbHNlIDsgdGhlbgotCi0gICAgIyBUYXJnZXQgYXJjaGl0ZWN0dXJlIC5vIGZpbGVzLgotICAgIHRhPQotCi0gICAgZm9yIGFyY2ggaW4gJHNlbGFyY2hzCi0gICAgZG8KLQlhZD1gZWNobyAkYXJjaCB8IHNlZCAtZSBzL2JmZF8vL2cgLWUgcy9fYXJjaC8vZ2AKLQlhcmNoZGVmcz0iJGFyY2hkZWZzIC1EQVJDSF8kYWQiCi0JY2FzZSAiJGFyY2giIGluCi0JYmZkX2EyOWtfYXJjaCkJCXRhPSIkdGEgYTI5ay1kaXMubG8iIDs7Ci0JYmZkX2FsbGlhbnRfYXJjaCkJOzsKLQliZmRfYWxwaGFfYXJjaCkJCXRhPSIkdGEgYWxwaGEtZGlzLmxvIGFscGhhLW9wYy5sbyIgOzsKLQliZmRfYXJjX2FyY2gpCQl0YT0iJHRhIGFyYy1kaXMubG8gYXJjLW9wYy5sbyIgOzsKLQliZmRfYXJtX2FyY2gpCQl0YT0iJHRhIGFybS1kaXMubG8iIDs7Ci0JYmZkX2NvbnZleF9hcmNoKQk7OwotCWJmZF9kMTB2X2FyY2gpCQl0YT0iJHRhIGQxMHYtZGlzLmxvIGQxMHYtb3BjLmxvIiA7OwotCWJmZF9kMzB2X2FyY2gpCQl0YT0iJHRhIGQzMHYtZGlzLmxvIGQzMHYtb3BjLmxvIiA7OwotCWJmZF9mcjMwX2FyY2gpICAgICAgICAgIHRhPSIkdGEgZnIzMC1hc20ubG8gZnIzMC1kZXNjLmxvIGZyMzAtZGlzLmxvIGZyMzAtaWJsZC5sbyBmcjMwLW9wYy5sbyIgdXNpbmdfY2dlbj15ZXMgOzsKLQliZmRfaDgzMDBfYXJjaCkJCXRhPSIkdGEgaDgzMDAtZGlzLmxvIiA7OwotCWJmZF9oODUwMF9hcmNoKQkJdGE9IiR0YSBoODUwMC1kaXMubG8iIDs7Ci0JYmZkX2hwcGFfYXJjaCkJCXRhPSIkdGEgaHBwYS1kaXMubG8iIDs7Ci0JYmZkX2kzODZfYXJjaCkJCXRhPSIkdGEgaTM4Ni1kaXMubG8iIDs7Ci0JYmZkX2k4NjBfYXJjaCkJCTs7Ci0JYmZkX2k5NjBfYXJjaCkJCXRhPSIkdGEgaTk2MC1kaXMubG8iIDs7Ci0JYmZkX20zMnJfYXJjaCkJCXRhPSIkdGEgbTMyci1hc20ubG8gbTMyci1kZXNjLmxvIG0zMnItZGlzLmxvIG0zMnItaWJsZC5sbyBtMzJyLW9wYy5sbyBtMzJyLW9waW5zdC5sbyIgdXNpbmdfY2dlbj15ZXMgOzsKLQliZmRfbTY4a19hcmNoKQkJdGE9IiR0YSBtNjhrLWRpcy5sbyBtNjhrLW9wYy5sbyIgOzsKLQliZmRfbTg4a19hcmNoKQkJdGE9IiR0YSBtODhrLWRpcy5sbyIgOzsKLQliZmRfbWNvcmVfYXJjaCkJCXRhPSIkdGEgbWNvcmUtZGlzLmxvIiA7OwotCWJmZF9taXBzX2FyY2gpCQl0YT0iJHRhIG1pcHMtZGlzLmxvIG1pcHMtb3BjLmxvIG1pcHMxNi1vcGMubG8iIDs7Ci0JYmZkX21uMTAyMDBfYXJjaCkJdGE9IiR0YSBtMTAyMDAtZGlzLmxvIG0xMDIwMC1vcGMubG8iIDs7Ci0JYmZkX21uMTAzMDBfYXJjaCkJdGE9IiR0YSBtMTAzMDAtZGlzLmxvIG0xMDMwMC1vcGMubG8iIDs7Ci0JYmZkX25zMzJrX2FyY2gpCQl0YT0iJHRhIG5zMzJrLWRpcy5sbyIgOzsKLQliZmRfcGpfYXJjaCkJICAgICAgICB0YT0iJHRhIHBqLWRpcy5sbyBwai1vcGMubG8iIDs7Ci0JYmZkX3Bvd2VycGNfYXJjaCkJdGE9IiR0YSBwcGMtZGlzLmxvIHBwYy1vcGMubG8iIDs7Ci0JYmZkX3B5cmFtaWRfYXJjaCkJOzsKLQliZmRfcm9tcF9hcmNoKQkJOzsKLQliZmRfcnM2MDAwX2FyY2gpCXRhPSIkdGEgcHBjLWRpcy5sbyBwcGMtb3BjLmxvIiA7OwotCWJmZF9zaF9hcmNoKQkJdGE9IiR0YSBzaC1kaXMubG8iIDs7Ci0JYmZkX3NwYXJjX2FyY2gpCQl0YT0iJHRhIHNwYXJjLWRpcy5sbyBzcGFyYy1vcGMubG8iIDs7Ci0JYmZkX3RhaG9lX2FyY2gpCQk7OwotCWJmZF90aWMzMF9hcmNoKQkJdGE9IiR0YSB0aWMzMC1kaXMubG8iIDs7Ci0JYmZkX3RpYzgwX2FyY2gpCQl0YT0iJHRhIHRpYzgwLWRpcy5sbyB0aWM4MC1vcGMubG8iIDs7Ci0JYmZkX3Y4NTBfYXJjaCkJCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3Y4NTBlX2FyY2gpCQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92ODUwZWFfYXJjaCkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdmF4X2FyY2gpCQl0YT0iJHRhIHZheC1kaXMubG8iIDs7Ci0JYmZkX3c2NV9hcmNoKQkJdGE9IiR0YSB3NjUtZGlzLmxvIiA7OwotCWJmZF93ZTMya19hcmNoKQkJOzsKLQliZmRfejhrX2FyY2gpCQl0YT0iJHRhIHo4ay1kaXMubG8iIDs7Ci0KLQkiIikJCQk7OwotCSopCQlBQ19NU0dfRVJST1IoKioqIHVua25vd24gdGFyZ2V0IGFyY2hpdGVjdHVyZSAkYXJjaCkgOzsKLQllc2FjCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KLQl0YT0iJHRhICRjZ2VuX2ZpbGVzIgotICAgIGZpCi0KLSAgICAjIFdlZWQgb3V0IGR1cGxpY2F0ZSAubyBmaWxlcy4KLSAgICBmPSIiCi0gICAgZm9yIGkgaW4gJHRhIDsgZG8KLQljYXNlICIgJGYgIiBpbgotCSoiICRpICIqKSA7OwotCSopIGY9IiRmICRpIiA7OwotCWVzYWMKLSAgICBkb25lCi0gICAgdGE9IiRmIgotCi0gICAgIyBBbmQgZHVwbGljYXRlIC1EIGZsYWdzLgotICAgIGY9IiIKLSAgICBmb3IgaSBpbiAkYXJjaGRlZnMgOyBkbwotCWNhc2UgIiAkZiAiIGluCi0JKiIgJGkgIiopIDs7Ci0JKikgZj0iJGYgJGkiIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgICBhcmNoZGVmcz0iJGYiCi0KLSAgICBCRkRfTUFDSElORVM9IiR0YSIKLQotZWxzZQkjIGFsbF90YXJnZXRzIGlzIHRydWUKLSAgICBhcmNoZGVmcz0tREFSQ0hfYWxsCi0gICAgQkZEX01BQ0hJTkVTPSckKEFMTF9NQUNISU5FUyknCi1maQotCi1BQ19TVUJTVChhcmNoZGVmcykKLUFDX1NVQlNUKEJGRF9NQUNISU5FUykKLQotQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL29wY29kZXMvZDEwdi1kaXMuYyBiL29wY29kZXMvZDEwdi1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxYTdkMy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2QxMHYtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgRDEwViBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9kMTB2LmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotLyogdGhlIFBDIHdyYXBzIGF0IDE4IGJpdHMsIGV4Y2VwdCBmb3IgdGhlIHNlZ21lbnQgbnVtYmVyICovCi0vKiBzbyB1c2UgdGhpcyBtYXNrIHRvIGtlZXAgdGhlIHBhcnRzIHdlIHdhbnQgKi8KLSNkZWZpbmUgUENfTUFTSwkweDAzMDNGRkZGCi0KLXN0YXRpYyB2b2lkIGRpc18yX3Nob3J0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zbiwgYmZkX3ZtYSBtZW1hZGRyLCAKLQkJCQkgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8sIGludCBvcmRlcikpOwotc3RhdGljIHZvaWQgZGlzX2xvbmcgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnNuLCBiZmRfdm1hIG1lbWFkZHIsIAotCQkJICAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKLQotaW50IAotcHJpbnRfaW5zbl9kMTB2IChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgc3RhdHVzOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLQotICBzdGF0dXMgPSBpbnNuICYgRk0xMTsKLSAgc3dpdGNoIChzdGF0dXMpIHsKLSAgY2FzZSAwOgotICAgIGRpc18yX3Nob3J0IChpbnNuLCBtZW1hZGRyLCBpbmZvLCAyKTsKLSAgICBicmVhazsKLSAgY2FzZSBGTTAxOgotICAgIGRpc18yX3Nob3J0IChpbnNuLCBtZW1hZGRyLCBpbmZvLCAwKTsKLSAgICBicmVhazsKLSAgY2FzZSBGTTEwOgotICAgIGRpc18yX3Nob3J0IChpbnNuLCBtZW1hZGRyLCBpbmZvLCAxKTsKLSAgICBicmVhazsKLSAgY2FzZSBGTTExOgotICAgIGRpc19sb25nIChpbnNuLCBtZW1hZGRyLCBpbmZvKTsKLSAgICBicmVhazsKLSAgfQotICByZXR1cm4gNDsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmQgKG9wZXIsIGluc24sIG9wLCBtZW1hZGRyLCBpbmZvKQotICAgICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcGVyOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3A7Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBudW0sIHNoaWZ0OwotCi0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUTUlOVVMpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJALSIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfTUlOVVMpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItIik7ICAgCi0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9QTFVTKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKyIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRTSUdOKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRQQVIpCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAKCIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzaGlmdCA9IG9wZXItPnNoaWZ0OwotCi0gIC8qIHRoZSBMT05HX0wgZm9ybWF0IHNoaWZ0cyByZWdpc3RlcnMgb3ZlciBieSAxNSAqLwotICBpZiAob3AtPmZvcm1hdCA9PSBMT05HX0wgJiYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9SRUcpKQotICAgIHNoaWZ0ICs9IDE1OwotCi0gIG51bSA9IChpbnNuID4+IHNoaWZ0KSAmICgweDdGRkZGRkZGID4+ICgzMSAtIG9wZXItPmJpdHMpKTsKLQotICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1JFRykKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBtYXRjaD0wOwotICAgICAgbnVtICs9IChvcGVyLT5mbGFncwotCSAgICAgICYgKE9QRVJBTkRfR1BSfE9QRVJBTkRfRkZMQUd8T1BFUkFORF9DRkxBR3xPUEVSQU5EX0NPTlRST0wpKTsKLSAgICAgIGlmIChvcGVyLT5mbGFncyAmIChPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxKSkKLQludW0gKz0gbnVtID8gT1BFUkFORF9BQ0MxIDogT1BFUkFORF9BQ0MwOwotICAgICAgZm9yIChpID0gMDsgaSA8IGQxMHZfcmVnX25hbWVfY250KCk7IGkrKykKLQl7Ci0JICBpZiAobnVtID09IGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbaV0udmFsdWUpCi0JICAgIHsKLQkgICAgICBpZiAoZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSk7Ci0JICAgICAgZWxzZQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIixkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW2ldLm5hbWUpOwotCSAgICAgIG1hdGNoPTE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAobWF0Y2ggPT0gMCkKLQl7Ci0JICAvKiB0aGlzIHdvdWxkIG9ubHkgZ2V0IGV4ZWN1dGVkIGlmIGEgcmVnaXN0ZXIgd2FzIG5vdCBpbiB0aGUgCi0JICAgICByZWdpc3RlciB0YWJsZSAqLwotCSAgaWYgKG9wZXItPmZsYWdzICYgKE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzEpKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImEiKTsKLQkgIGVsc2UgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9DT05UUk9MKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImNyIik7Ci0JICBlbHNlIGlmKG9wZXItPmZsYWdzICYgT1BFUkFORF9SRUcpCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiciIpOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsbnVtKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogYWRkcmVzc2VzIGFyZSByaWdodC1zaGlmdGVkIGJ5IDIgKi8KLSAgICAgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfQUREUikKLQl7Ci0JICBsb25nIG1heDsKLQkgIGludCBuZWc9MDsKLQkgIG1heCA9ICgxIDw8IChvcGVyLT5iaXRzIC0gMSkpOwotCSAgaWYgKG51bSAmIG1heCkKLQkgICAgewotCSAgICAgIG51bSA9IC1udW0gJiAoKDEgPDwgb3Blci0+Yml0cyktMSk7Ci0JICAgICAgbmVnID0gMTsKLQkgICAgfQotCSAgbnVtID0gbnVtPDwyOwotCSAgaWYgKGluZm8tPmZsYWdzICYgSU5TTl9IQVNfUkVMT0MpCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAobnVtICYgUENfTUFTSywgaW5mbyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAobmVnKQotCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChtZW1hZGRyIC0gbnVtKSAmIFBDX01BU0ssIGluZm8pOwotCSAgICAgIGVsc2UKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciArIG51bSkgJiBQQ19NQVNLLCBpbmZvKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCkKLQkgICAgewotCSAgICAgIGludCBtYXggPSAoMSA8PCAob3Blci0+Yml0cyAtIDEpKTsKLQkgICAgICBpZiAobnVtICYgbWF4KQotCQl7Ci0JCSAgbnVtID0gLW51bSAmICgoMSA8PCBvcGVyLT5iaXRzKS0xKTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0iKTsKLQkJfQotCSAgICB9Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLG51bSk7Ci0JfQotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotZGlzX2xvbmcgKGluc24sIG1lbWFkZHIsIGluZm8pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGk7Ci0gIGNoYXIgYnVmWzMyXTsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKilkMTB2X29wY29kZXM7Ci0gIHN0cnVjdCBkMTB2X29wZXJhbmQgKm9wZXI7Ci0gIGludCBuZWVkX3BhcmVuID0gMDsKLSAgaW50IG1hdGNoID0gMDsKLQotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKChvcC0+Zm9ybWF0ICYgTE9OR19PUENPREUpICYmICgob3AtPm1hc2sgJiBpbnNuKSA9PSBvcC0+b3Bjb2RlKSkKLQl7Ci0JICBtYXRjaCA9IDE7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzXHQiLCBvcC0+bmFtZSk7ICAgCi0JICBmb3IgKCBpPTA7IG9wLT5vcGVyYW5kc1tpXTsgaSsrKQotCSAgICB7Ci0JICAgICAgb3BlciA9IChzdHJ1Y3QgZDEwdl9vcGVyYW5kICopJmQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2ldXTsKLQkgICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFBBUikKLQkJbmVlZF9wYXJlbiA9IDE7Ci0JICAgICAgcHJpbnRfb3BlcmFuZCAob3BlciwgaW5zbiwgb3AsIG1lbWFkZHIsIGluZm8pOwotCSAgICAgIGlmIChvcC0+b3BlcmFuZHNbaSsxXSAmJiBvcGVyLT5iaXRzICYmCi0JCSAgZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaSsxXV0uZmxhZ3MgIT0gT1BFUkFORF9QTFVTICYmCi0JCSAgZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaSsxXV0uZmxhZ3MgIT0gT1BFUkFORF9NSU5VUykKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsICIpOyAgIAotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBpZiAoIW1hdGNoKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JTA4eCIsaW5zbik7ICAgCi0KLSAgaWYgKG5lZWRfcGFyZW4pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7ICAgCi19Ci0KLXN0YXRpYyB2b2lkCi1kaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgb3JkZXIpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IG9yZGVyOwotewotICBpbnQgaSxqOwotICBjaGFyIGFzdHJbMl1bMzJdOwotICB1bnNpZ25lZCBpbnQgaW5zWzJdOwotICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wOwotICBjaGFyIGJ1ZlszMl07Ci0gIGludCBtYXRjaCwgbnVtX21hdGNoPTA7Ci0gIHN0cnVjdCBkMTB2X29wZXJhbmQgKm9wZXI7Ci0gIGludCBuZWVkX3BhcmVuID0gMDsKLQotICBpbnNbMF0gPSAoaW5zbiAmIDB4M0ZGRkZGRkYpID4+IDE1OwotICBpbnNbMV0gPSBpbnNuICYgMHgwMDAwN0ZGRjsKLQotICBmb3Ioaj0wO2o8MjtqKyspCi0gICAgewotICAgICAgb3AgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopZDEwdl9vcGNvZGVzOwotICAgICAgbWF0Y2g9MDsKLSAgICAgIHdoaWxlIChvcC0+bmFtZSkKLQl7Ci0JICBpZiAoKG9wLT5mb3JtYXQgJiBTSE9SVF9PUENPREUpICYmICgob3AtPm1hc2sgJiBpbnNbal0pID09IG9wLT5vcGNvZGUpKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0IixvcC0+bmFtZSk7ICAgCi0JICAgICAgZm9yIChpPTA7IG9wLT5vcGVyYW5kc1tpXTsgaSsrKQotCQl7Ci0JCSAgb3BlciA9IChzdHJ1Y3QgZDEwdl9vcGVyYW5kICopJmQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2ldXTsKLQkJICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFBBUikKLQkJICAgIG5lZWRfcGFyZW4gPSAxOwotCQkgIHByaW50X29wZXJhbmQgKG9wZXIsIGluc1tqXSwgb3AsIG1lbWFkZHIsIGluZm8pOwotCQkgIGlmIChvcC0+b3BlcmFuZHNbaSsxXSAmJiBvcGVyLT5iaXRzICYmIAotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfUExVUyAmJgotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfTUlOVVMpCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwgIik7ICAgCi0JCX0KLQkgICAgICBtYXRjaCA9IDE7Ci0JICAgICAgbnVtX21hdGNoKys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIG9wKys7Ci0JfQotICAgICAgaWYgKCFtYXRjaCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInVua25vd24iKTsgICAKLQotICAgICAgc3dpdGNoIChvcmRlcikKLQl7Ci0JY2FzZSAwOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdC0+XHQiKTsgICAKLQkgIG9yZGVyID0gLTE7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0PC1cdCIpOyAgIAotCSAgb3JkZXIgPSAtMTsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHR8fFx0Iik7ICAgCi0JICBvcmRlciA9IC0xOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG51bV9tYXRjaCA9PSAwKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JTA4eCIsaW5zbik7ICAgCi0KLSAgaWYgKG5lZWRfcGFyZW4pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7ICAgCi19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2QxMHYtb3BjLmMgYi9vcGNvZGVzL2QxMHYtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YmIwOTguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kMTB2LW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qIGQxMHYtb3BjLmMgLS0gRDEwViBvcGNvZGUgbGlzdAotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50LCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9kMTB2LmgiCi0KLQotLyogICBUaGUgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KLWNvbnN0IHN0cnVjdCBwZF9yZWcgZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiYTAiLCBOVUxMLCBPUEVSQU5EX0FDQzArMCB9LAotICB7ICJhMSIsIE5VTEwsIE9QRVJBTkRfQUNDMSsxIH0sCi0gIHsgImJwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszIH0sCi0gIHsgImJwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMSB9LAotICB7ICJjIiwgTlVMTCwgT1BFUkFORF9DRkxBRyszIH0sCi0gIHsgImNyMCIsICJwc3ciLCBPUEVSQU5EX0NPTlRST0wgfSwKLSAgeyAiY3IxIiwgImJwc3ciLCBPUEVSQU5EX0NPTlRST0wrMSB9LAotICB7ICJjcjEwIiwgIm1vZF9zIiwgT1BFUkFORF9DT05UUk9MKzEwIH0sCi0gIHsgImNyMTEiLCAibW9kX2UiLCBPUEVSQU5EX0NPTlRST0wrMTEgfSwKLSAgeyAiY3IxMiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMiB9LAotICB7ICJjcjEzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEzIH0sCi0gIHsgImNyMTQiLCAiaWJhIiwgT1BFUkFORF9DT05UUk9MKzE0IH0sCi0gIHsgImNyMTUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTUgfSwKLSAgeyAiY3IyIiwgInBjIiwgT1BFUkFORF9DT05UUk9MKzIgfSwKLSAgeyAiY3IzIiwgImJwYyIsIE9QRVJBTkRfQ09OVFJPTCszIH0sCi0gIHsgImNyNCIsICJkcHN3IiwgT1BFUkFORF9DT05UUk9MKzQgfSwKLSAgeyAiY3I1IiwgImRwYyIsIE9QRVJBTkRfQ09OVFJPTCs1IH0sCi0gIHsgImNyNiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2IH0sCi0gIHsgImNyNyIsICJycHRfYyIsIE9QRVJBTkRfQ09OVFJPTCs3IH0sCi0gIHsgImNyOCIsICJycHRfcyIsIE9QRVJBTkRfQ09OVFJPTCs4IH0sCi0gIHsgImNyOSIsICJycHRfZSIsIE9QRVJBTkRfQ09OVFJPTCs5IH0sCi0gIHsgImRwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1IH0sCi0gIHsgImRwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNCB9LAotICB7ICJmMCIsIE5VTEwsIE9QRVJBTkRfRkZMQUcrMCB9LAotICB7ICJmMSIsIE5VTEwsIE9QRVJBTkRfRkZMQUcrMSB9LAotICB7ICJpYmEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTQgfSwKLSAgeyAibGluayIsICJyMTMiLCBPUEVSQU5EX0dQUisxMyB9LAotICB7ICJtb2RfZSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMSB9LAotICB7ICJtb2RfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMCB9LAotICB7ICJwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyIH0sCi0gIHsgInBzdyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCswIH0sCi0gIHsgInIwIiwgTlVMTCwgT1BFUkFORF9HUFIrMCB9LAotICB7ICJyMC1yMSIsIE5VTEwsIE9QRVJBTkRfR1BSKzB9LAotICB7ICJyMSIsIE5VTEwsIE9QRVJBTkRfR1BSKzEgfSwKLSAgeyAicjEiLCBOVUxMLCBPUEVSQU5EX0dQUisxIH0sCi0gIHsgInIxMCIsIE5VTEwsIE9QRVJBTkRfR1BSKzEwIH0sCi0gIHsgInIxMC1yMTEiLCBOVUxMLCBPUEVSQU5EX0dQUisxMCB9LAotICB7ICJyMTEiLCBOVUxMLCBPUEVSQU5EX0dQUisxMSB9LAotICB7ICJyMTIiLCBOVUxMLCBPUEVSQU5EX0dQUisxMiB9LAotICB7ICJyMTItcjEzIiwgTlVMTCwgT1BFUkFORF9HUFIrMTIgfSwKLSAgeyAicjEzIiwgTlVMTCwgT1BFUkFORF9HUFIrMTMgfSwKLSAgeyAicjE0IiwgTlVMTCwgT1BFUkFORF9HUFIrMTQgfSwKLSAgeyAicjE0LXIxNSIsIE5VTEwsIE9QRVJBTkRfR1BSKzE0IH0sCi0gIHsgInIxNSIsICJzcCIsIE9QRVJBTkRfR1BSKzE1IH0sCi0gIHsgInIyIiwgTlVMTCwgT1BFUkFORF9HUFIrMiB9LAotICB7ICJyMi1yMyIsIE5VTEwsIE9QRVJBTkRfR1BSKzIgfSwKLSAgeyAicjMiLCBOVUxMLCBPUEVSQU5EX0dQUiszIH0sCi0gIHsgInI0IiwgTlVMTCwgT1BFUkFORF9HUFIrNCB9LAotICB7ICJyNC1yNSIsIE5VTEwsIE9QRVJBTkRfR1BSKzQgfSwKLSAgeyAicjUiLCBOVUxMLCBPUEVSQU5EX0dQUis1IH0sCi0gIHsgInI2IiwgTlVMTCwgT1BFUkFORF9HUFIrNiB9LAotICB7ICJyNi1yNyIsIE5VTEwsIE9QRVJBTkRfR1BSKzYgfSwKLSAgeyAicjciLCBOVUxMLCBPUEVSQU5EX0dQUis3IH0sCi0gIHsgInI4IiwgTlVMTCwgT1BFUkFORF9HUFIrOCB9LAotICB7ICJyOC1yOSIsIE5VTEwsIE9QRVJBTkRfR1BSKzggfSwKLSAgeyAicjkiLCBOVUxMLCBPUEVSQU5EX0dQUis5IH0sCi0gIHsgInJwdF9jIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzcgfSwKLSAgeyAicnB0X2UiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrOSB9LAotICB7ICJycHRfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs4IH0sCi0gIHsgInNwIiwgTlVMTCwgT1BFUkFORF9HUFIrMTUgfSwKLX07Ci0KLWludCAKLWQxMHZfcmVnX25hbWVfY250KCkKLXsKLSAgcmV0dXJuIChzaXplb2YoZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHBkX3JlZykpOwotfQotCi1jb25zdCBzdHJ1Y3QgZDEwdl9vcGVyYW5kIGQxMHZfb3BlcmFuZHNbXSA9Ci17Ci0jZGVmaW5lIFVOVVNFRAkoMCkKLSAgeyAwLCAwLCAwIH0sCi0jZGVmaW5lIFJTUkMJKFVOVVNFRCArIDEpCi0gIHsgNCwgMSwgT1BFUkFORF9HUFJ8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUkRTVAkoUlNSQyArIDEpCi0gIHsgNCwgNSwgT1BFUkFORF9ERVNUfE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFTUkMJKFJEU1QgKyAxKQotICB7IDEsIDQsIE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgQVNSQzBPTkxZIChBU1JDICsgMSkKLSAgeyAxLCA0LCBPUEVSQU5EX0FDQzB8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgQURTVAkoQVNSQzBPTkxZICsgMSkKLSAgeyAxLCA4LCBPUEVSQU5EX0RFU1R8T1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMXxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSU1JDRQkoQURTVCArIDEpCi0gIHsgNCwgMSwgT1BFUkFORF9FVkVOfE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJEU1RFCShSU1JDRSArIDEpCi0gIHsgNCwgNSwgT1BFUkFORF9FVkVOfE9QRVJBTkRfREVTVHxPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBOVU0xNgkoUkRTVEUgKyAxKQotICB7IDE2LCAwLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBOVU0zCShOVU0xNiArIDEpCQkJLyogcmFjLCByYWNoaSAqLwotICB7IDMsIDEsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEfFJFU1RSSUNURURfTlVNMyB9LAotI2RlZmluZSBOVU00CShOVU0zICsgMSkKLSAgeyA0LCAxLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBVTlVNNAkoTlVNNCArIDEpCi0gIHsgNCwgMSwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgVU5VTTRTCShVTlVNNCArIDEpCQkJLyogYWRkaSwgc2xsaSwgc3JhaSwgc3JsaSwgc3ViaSAqLwotICB7IDQsIDEsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0hJRlQgfSwKLSNkZWZpbmUgVU5VTTgJKFVOVU00UyArIDEpCQkJLyogcmVwaSAqLwotICB7IDgsIDE2LCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBVTlVNMTYJKFVOVU04ICsgMSkJCQkvKiBjbXB1aSAqLwotICB7IDE2LCAwLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBBTlVNMTYJKFVOVU0xNiArIDEpCi0gIHsgMTYsIDAsIE9QRVJBTkRfQUREUnxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBBTlVNOAkoQU5VTTE2ICsgMSkKLSAgeyA4LCAwLCBPUEVSQU5EX0FERFJ8T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgQVNSQzIJKEFOVU04ICsgMSkKLSAgeyAxLCA4LCBPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJTUkMyCShBU1JDMiArIDEpCi0gIHsgNCwgNSwgT1BFUkFORF9HUFJ8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUlNSQzJFCShSU1JDMiArIDEpCi0gIHsgNCwgNSwgT1BFUkFORF9HUFJ8T1BFUkFORF9SRUd8T1BFUkFORF9FVkVOIH0sCi0jZGVmaW5lIEFTUkMwCShSU1JDMkUgKyAxKQotICB7IDEsIDAsIE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgQURTVDAJKEFTUkMwICsgMSkKLSAgeyAxLCAwLCBPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxfE9QRVJBTkRfUkVHfE9QRVJBTkRfREVTVCB9LAotI2RlZmluZSBGRlNSQwkoQURTVDAgKyAxKQotICB7IDIsIDEsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9GRkxBRyB9LAotI2RlZmluZSBDRlNSQwkoRkZTUkMgKyAxKQotICB7IDIsIDEsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9DRkxBRyB9LAotI2RlZmluZSBGRFNUCShDRlNSQyArIDEpCi0gIHsgMSwgNSwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0ZGTEFHIHwgT1BFUkFORF9ERVNUfSwKLSNkZWZpbmUgQVRTSUdOCShGRFNUICsgMSkKLSAgeyAwLCAwLCBPUEVSQU5EX0FUU0lHTn0sCi0jZGVmaW5lIEFUUEFSCShBVFNJR04gKyAxKQkvKiAiQCgiICovCi0gIHsgMCwgMCwgT1BFUkFORF9BVFBBUn0sCi0jZGVmaW5lIFBMVVMJKEFUUEFSICsgMSkJLyogcG9zdGluY3JlbWVudCAqLwotICB7IDAsIDAsIE9QRVJBTkRfUExVU30sCi0jZGVmaW5lIE1JTlVTCShQTFVTICsgMSkJLyogcG9zdGRlY3JlbWVudCAqLwotICB7IDAsIDAsIE9QRVJBTkRfTUlOVVN9LAotI2RlZmluZSBBVE1JTlVTCShNSU5VUyArIDEpCS8qIHByZWRlY3JlbWVudCAqLwotICB7IDAsIDAsIE9QRVJBTkRfQVRNSU5VU30sCi0jZGVmaW5lIENTUkMJKEFUTUlOVVMgKyAxKQkvKiBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgNCwgMSwgT1BFUkFORF9SRUd8T1BFUkFORF9DT05UUk9MfSwKLSNkZWZpbmUgQ0RTVAkoQ1NSQyArIDEpCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyA0LCA1LCBPUEVSQU5EX1JFR3xPUEVSQU5EX0NPTlRST0x8T1BFUkFORF9ERVNUfSwKLX07Ci0KLWNvbnN0IHN0cnVjdCBkMTB2X29wY29kZSBkMTB2X29wY29kZXNbXSA9IHsKLSAgeyAiYWJzIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDQ2MDcsIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAiYWJzIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4NTYwNywgMHg3ZWZmLCB7IEFEU1QgfSB9LAotICB7ICJhZGQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXQ0FSLCAweDAyMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAiYWRkIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxMjAxLCAweDdlZTMsIHsgQURTVCwgUlNSQ0UgfSB9LAotICB7ICJhZGQiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDEyMDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAiYWRkMnciLCBTSE9SVF8yLCAyLCBJVSwgUEFSfFdDQVIsIDB4MTIwMCwgMHg3ZTIzLCB7IFJEU1RFLCBSU1JDRSB9IH0sCi0gIHsgImFkZDMiLCBMT05HX0wsIDEsIE1VLCBTRVF8V0NBUiwgMHgxMDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIFJTUkMsIE5VTTE2IH0gfSwKLSAgeyAiYWRkYWMzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAwMjAwLCAweDNmZmZmZTIyLCB7IFJEU1RFLCBSU1JDRSwgQVNSQzAgfSB9LAotICB7ICJhZGRhYzMiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDAyMDIsIDB4M2ZmZmZlMmUsIHsgUkRTVEUsIEFTUkMsIEFTUkMwIH0gfSwKLSAgeyAiYWRkYWMzcyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMTIwMCwgMHgzZmZmZmUyMiwgeyBSRFNURSwgUlNSQ0UsIEFTUkMwIH0gfSwKLSAgeyAiYWRkYWMzcyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMTIwMiwgMHgzZmZmZmUyZSwgeyBSRFNURSwgQVNSQywgQVNSQzAgfSB9LAotICB7ICJhZGRpIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0NBUiwgIDB4MjAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTRTIH0gfSwKLSAgeyAiYW5kIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4YzAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgImFuZDMiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4NjAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBSU1JDLCBOVU0xNiB9IH0sCi0gIHsgImJjbHJpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHhjMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgImJsIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMCwgOCwgMTYsIDAgfSB9LAotICB7ICJibC5zIiwgU0hPUlRfQiwgMywgTVUsIEJSQU5DSF9MSU5LfFBBUiwgMHg0OTAwLCAweDdmMDAsIHsgQU5VTTggfSB9LAotICB7ICJibC5sIiwgTE9OR19CLCAzLCBNVSwgQlJBTkNIX0xJTkt8U0VRLCAweDI0ODAwMDAwLCAweDNmZmYwMDAwLCB7IEFOVU0xNiB9IH0sCi0gIHsgImJub3RpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHhhMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgImJyYSIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDAsIDgsIDE2LCAwIH0gfSwKLSAgeyAiYnJhLnMiLCBTSE9SVF9CLCAzLCBNVSwgQlJBTkNIfFBBUiwgMHg0ODAwLCAweDdmMDAsIHsgQU5VTTggfSB9LAotICB7ICJicmEubCIsIExPTkdfQiwgMywgTVUsIEJSQU5DSHxTRVEsIDB4MjQwMDAwMDAsIDB4M2ZmZjAwMDAsIHsgQU5VTTE2IH0gfSwKLSAgeyAiYnJmMGYiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAwLCA4LCAxNiwgMCB9IH0sCi0gIHsgImJyZjBmLnMiLCBTSE9SVF9CLCAzLCBNVSwgQlJBTkNIfFBBUnxSRjAsIDB4NGEwMCwgMHg3ZjAwLCB7IEFOVU04IH0gfSwKLSAgeyAiYnJmMGYubCIsIExPTkdfQiwgMywgTVUsIFNFUSwgMHgyNTAwMDAwMCwgMHgzZmZmMDAwMCwgeyBBTlVNMTYgfSB9LAotICB7ICJicmYwdCIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDAsIDgsIDE2LCAwIH0gfSwKLSAgeyAiYnJmMHQucyIsIFNIT1JUX0IsIDMsIE1VLCBCUkFOQ0h8UEFSfFJGMCwgMHg0YjAwLCAweDdmMDAsIHsgQU5VTTggfSB9LAotICB7ICJicmYwdC5sIiwgTE9OR19CLCAzLCBNVSwgU0VRLCAweDI1ODAwMDAwLCAweDNmZmYwMDAwLCB7IEFOVU0xNiB9IH0sCi0gIHsgImJzZXRpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg4MDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgImJ0c3RpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4ZTAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAotICB7ICJjbHJhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTYwMSwgMHg3ZWZmLCB7IEFEU1QgfSB9LAotICB7ICJjbXAiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NjAwLCAweDdlMDEsIHsgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJjbXAiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgxNjAzLCAweDdlZWYsIHsgQVNSQzIsIEFTUkMgfSB9LAotICB7ICJjbXBlcSIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg0MDAsIDB4N2UwMSwgeyBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgImNtcGVxIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MTQwMywgMHg3ZWVmLCB7IEFTUkMyLCBBU1JDIH0gfSwKLSAgeyAiY21wZXFpIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMSwgNCwgMTYsIDAgfSB9LAotICB7ICJjbXBlcWkucyIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg0MDEsIDB4N2UwMSwgeyBSU1JDMiwgTlVNNCB9IH0sCi0gIHsgImNtcGVxaS5sIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDIwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIE5VTTE2IH0gfSwKLSAgeyAiY21waSIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDEsIDQsIDE2LCAwIH0gfSwKLSAgeyAiY21waS5zIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDYwMSwgMHg3ZTAxLCB7IFJTUkMyLCBOVU00IH0gfSwKLSAgeyAiY21waS5sIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDMwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIE5VTTE2IH0gfSwKLSAgeyAiY21wdSIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg0NjAwLCAweDdlMDEsIHsgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJjbXB1aSIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgyMzAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgVU5VTTE2IH0gfSwKLSAgeyAiY3BmZyIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NGUwZiwgMHg3ZmRmLCB7IEZEU1QsIENGU1JDIH0gfSwKLSAgeyAiY3BmZyIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NGUwOSwgMHg3ZmQ5LCB7IEZEU1QsIEZGU1JDIH0gfSwKLSAgeyAiZGJ0IiwgU0hPUlRfMiwgNSwgTVUsIFBBUiwgMHg1ZjIwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImRpdnMiLCBMT05HX0wsIDEsIEJPVEgsIFNFUSwgMHgxNDAwMjgwMCwgMHgzZjEwZmUyMSwgeyBSRFNURSwgUlNSQyB9IH0sCi0gIHsgImV4ZWYwZiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTA0LCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZWYwdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTI0LCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZWYxZiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTQwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZWYxdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTQyLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZWZhZiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTAwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZWZhdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTAyLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZXRhZiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTIwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZXRhdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTIyLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4cCIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNTAwMmEwMCwgMHgzZmZmZmUwMywgeyBSRFNULCBSU1JDRSB9IH0sCi0gIHsgImV4cCIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNTAwMmEwMiwgMHgzZmZmZmUwZiwgeyBSRFNULCBBU1JDIH0gfSwKLSAgeyAiamwiLCBTSE9SVF8yLCAzLCBNVSwgQlJBTkNIX0xJTkt8UEFSLCAweDRkMDAsIDB4N2ZlMSwgeyBSU1JDIH0gfSwKLSAgeyAiam1wIiwgU0hPUlRfMiwgMywgTVUsIEJSQU5DSHxQQVIsIDB4NGMwMCwgMHg3ZmUxLCB7IFJTUkMgfSB9LAotICB7ICJsZCIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzMDAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJsZCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2NDAxLCAweDdlMDEsIHsgUkRTVCwgQVRTSUdOLCBSU1JDLCBNSU5VUyB9IH0sCi0gIHsgImxkIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDYwMDEsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMsIFBMVVMgfSB9LAotICB7ICJsZCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2MDAwLCAweDdlMDEsIHsgUkRTVCwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAibGQiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzIwMTAwMDAsIDB4M2YwZjAwMDAsIHsgUkRTVCwgQVRTSUdOLCBOVU0xNiB9IH0sCi0gIHsgImxkMnciLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzEwMDAwMDAsIDB4M2YxMDAwMDAsIHsgUkRTVEUsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgImxkMnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NjYwMSwgMHg3ZTIxLCB7IFJEU1RFLCBBVFNJR04sIFJTUkMsIE1JTlVTIH0gfSwKLSAgeyAibGQydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2MjAxLCAweDdlMjEsIHsgUkRTVEUsIEFUU0lHTiwgUlNSQywgUExVUyB9IH0sCi0gIHsgImxkMnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NjIwMCwgMHg3ZTIxLCB7IFJEU1RFLCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJsZDJ3IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDMzMDEwMDAwLCAweDNmMWYwMDAwLCB7IFJEU1RFLCBBVFNJR04sIE5VTTE2IH0gfSwKLSAgeyAibGRiIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM4MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgImxkYiIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg3MDAwLCAweDdlMDEsIHsgUkRTVCwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAibGRpIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMSwgNCwgMTYsIDAgfSB9LAotICB7ICJsZGkucyIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFJNRU0sIDB4NDAwMSwgMHg3ZTAxICwgeyBSRFNULCBOVU00IH0gfSwKLSAgeyAibGRpLmwiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MjAwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUkRTVCwgTlVNMTYgfSB9LAotICB7ICJsZHViIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM5MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgImxkdWIiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NzIwMCwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgIm1hYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MmEwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm1hY3N1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxYTAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibWFjdSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2EwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm1heCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDI2MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibWF4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MzYwMCwgMHg3ZWUzLCB7IEFEU1QsIFJTUkNFIH0gfSwKLSAgeyAibWF4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MzYwMiwgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJtaW4iLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgyNjAxLCAweDdlMDEgLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtaW4iLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgzNjAxLCAweDdlZTMgLCB7IEFEU1QsIFJTUkNFIH0gfSwKLSAgeyAibWluIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MzYwMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJtc2IiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDI4MDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtc2JzdSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTgwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm1zYnUiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDM4MDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtdWwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDJlMDAsIDB4N2UwMSAsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm11bHgiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDJjMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtdWx4c3UiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFjMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtdWx4dSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2MwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm12IiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4NDAwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtdjJ3IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg1MDAwLCAweDdlMjMsIHsgUkRTVEUsIFJTUkNFIH0gfSwKLSAgeyAibXYyd2ZhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2UwMCwgMHg3ZTJmLCB7IFJEU1RFLCBBU1JDIH0gfSwKLSAgeyAibXYyd3RhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2UwMSwgMHg3ZWUzLCB7IFJTUkNFLCBBRFNUIH0gfSwKLSAgeyAibXZhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4M2UwMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJtdmIiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDU0MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibXZmMGYiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxSRjAsIDB4NDQwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtdmYwdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFJGMCwgMHg0NDAxLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm12ZmFjZyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUwNCwgMHg3ZTBmLCB7IFJEU1QsIEFTUkMgfSB9LAotICB7ICJtdmZhY2hpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTAwLCAweDdlMGYsIHsgUkRTVCwgQVNSQyB9IH0sCi0gIHsgIm12ZmFjbG8iLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlMDIsIDB4N2UwZiwgeyBSRFNULCBBU1JDIH0gfSwKLSAgeyAibXZmYyIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NTIwMCwgMHg3ZTAxLCB7IFJEU1QsIENTUkMgfSB9LAotICB7ICJtdnRhY2ciLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlNDEsIDB4N2VlMSwgeyBSU1JDLCBBRFNUIH0gfSwKLSAgeyAibXZ0YWNoaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUwMSwgMHg3ZWUxLCB7IFJTUkMsIEFEU1QgfSB9LAotICB7ICJtdnRhY2xvIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTIxLCAweDdlZTEsIHsgUlNSQywgQURTVCB9IH0sCi0gIHsgIm12dGMiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDU2MDAsIDB4N2UwMSwgeyBSU1JDLCBDRFNUIH0gfSwKLSAgeyAibXZ1YiIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTQwMSwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJuZWciLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg0NjA1LCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgIm5lZyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTYwNSwgMHg3ZWZmLCB7IEFEU1QgfSB9LAotICB7ICJub3AiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg1ZTAwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgIm5vdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweDQ2MDMsIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAib3IiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg4MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAib3IzIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDQwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUkRTVCwgUlNSQywgTlVNMTYgfSB9LAotICAvKiBTcGVjaWFsIGNhc2UuIHNhYyZzYWNoaSBtdXN0IG9jY3VyIGJlZm9yZSByYWMmcmFjaGkgYmVjYXVzZSB0aGV5IGhhdmUKLSAgICAgaW50ZXJzZWN0aW5nIG1hc2tzISBUaGUgbWFza3MgZm9yIHJhYyZyYWNoaSB3aWxsIG1hdGNoIHNhYyZzYWNoaSBidXQKLSAgICAgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLgotICAgKi8KLSAgeyAic2FjIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxSRjB8V0YwLCAweDUyMDksIDB4N2UyZiwgeyBSRFNURSwgQVNSQyB9IH0sCi0gIHsgInNhY2hpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxSRjB8V0YwLCAweDQyMDksIDB4N2UwZiwgeyBSRFNULCBBU1JDIH0gfSwKLSAgeyAicmFjIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4NTIwMSwgMHg3ZTIxLCB7IFJEU1RFLCBBU1JDME9OTFksIE5VTTMgfSB9LAotICB7ICJyYWNoaSIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDQyMDEsIDB4N2UwMSwgeyBSRFNULCBBU1JDLCBOVU0zIH0gfSwKLSAgeyAicmVwIiwgTE9OR19MLCAyLCBNVSwgU0VRLCAweDI3MDAwMDAwLCAweDNmZjAwMDAwLCB7IFJTUkMsIEFOVU0xNiB9IH0sCi0gIHsgInJlcGkiLCBMT05HX0wsIDIsIE1VLCBTRVEsIDB4MmYwMDAwMDAsIDB4M2YwMDAwMDAsIHsgVU5VTTgsIEFOVU0xNiB9IH0sCi0gIHsgInJ0ZCIsIFNIT1JUXzIsIDMsIE1VLCBQQVIsIDB4NWY2MCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJydGUiLCBTSE9SVF8yLCAzLCBNVSwgUEFSLCAweDVmNDAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAic2FkZCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTIyMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJzZXRmMGYiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJGMCwgMHg0NjExLCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgInNldGYwdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8UkYwLCAweDQ2MTMsIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAic2xhZSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzIyMCwgMHg3ZWUxLCB7IEFEU1QsIFJTUkMgfSB9LAotICB7ICJzbGVlcCIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NWZjMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJzbGwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIyMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAic2xsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzMjAwLCAweDdlZTEsIHsgQURTVCwgUlNSQyB9IH0sCi0gIHsgInNsbGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIyMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgInNsbGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDMyMDEsIDB4N2VlMSwgeyBBRFNULCBVTlVNNFMgfSB9LAotICB7ICJzbHgiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFJGMCwgMHg0NjBiLCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgInNyYSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjQwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJzcmEiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDM0MDAsIDB4N2VlMSwgeyBBRFNULCBSU1JDIH0gfSwKLSAgeyAic3JhaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjQwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAic3JhaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzQwMSwgMHg3ZWUxLCB7IEFEU1QsIFVOVU00UyB9IH0sCi0gIHsgInNybCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjAwMCwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJzcmwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDMwMDAsIDB4N2VlMSwgeyBBRFNULCBSU1JDIH0gfSwKLSAgeyAic3JsaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MjAwMSwgMHg3ZTAxLCB7IFJEU1QsIFVOVU00IH0gfSwKLSAgeyAic3JsaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzAwMSwgMHg3ZWUxLCB7IEFEU1QsIFVOVU00UyB9IH0sCi0gIHsgInNyeCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8UkYwLCAweDQ2MDksIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAic3QiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzQwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUlNSQzIsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgInN0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDY4MDAsIDB4N2UwMSwgeyBSU1JDMiwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAic3QiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmMxZiwgMHg3ZTFmLCB7IFJTUkMyLCBBVE1JTlVTLCBSU1JDIH0gfSwKLSAgeyAic3QiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NjgwMSwgMHg3ZTAxLCB7IFJTUkMyLCBBVFNJR04sIFJTUkMsIFBMVVMgfSB9LAotICB7ICJzdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2YzAxLCAweDdlMDEsIHsgUlNSQzIsIEFUU0lHTiwgUlNSQywgTUlOVVMgfSB9LAotICB7ICJzdCIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzNjAxMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgQVRTSUdOLCBOVU0xNiB9IH0sCi0gIHsgInN0MnciLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4MzUwMDAwMDAsIDB4M2YxMDAwMDAsIHsgUlNSQzJFLCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJzdDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZhMDAsIDB4N2UyMSwgeyBSU1JDMkUsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgInN0MnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmUxZiwgMHg3ZTNmLCB7IFJTUkMyRSwgQVRNSU5VUywgUlNSQyB9IH0sCi0gIHsgInN0MnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmEwMSwgMHg3ZTIxLCB7IFJTUkMyRSwgQVRTSUdOLCBSU1JDLCBQTFVTIH0gfSwKLSAgeyAic3QydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2ZTAxLCAweDdlMjEsIHsgUlNSQzJFLCBBVFNJR04sIFJTUkMsIE1JTlVTIH0gfSwKLSAgeyAic3QydyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzNzAxMDAwMCwgMHgzZjFmMDAwMCwgeyBSU1JDMkUsIEFUU0lHTiwgTlVNMTYgfSB9LAotICB7ICJzdGIiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4M2MwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUlNSQzIsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgInN0YiIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg3ODAwLCAweDdlMDEsIHsgUlNSQzIsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgInN0b3AiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDVmZTAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAic3ViIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0NBUiwgMHgwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgInN1YiIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTAwMSwgMHg3ZWUzLCB7IEFEU1QsIFJTUkMgfSB9LAotICB7ICJzdWIiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDEwMDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAic3ViMnciLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdDQVIsIDB4MTAwMCwgMHg3ZTIzLCB7IFJEU1RFLCBSU1JDRSB9IH0sCi0gIHsgInN1YmFjMyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMDAwMCwgMHgzZmZmZmUyMiwgeyBSRFNURSwgUlNSQ0UsIEFTUkMwIH0gfSwKLSAgeyAic3ViYWMzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAwMDAyLCAweDNmZmZmZTJlLCB7IFJEU1RFLCBBU1JDLCBBU1JDMCB9IH0sCi0gIHsgInN1YmFjM3MiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDEwMDAsIDB4M2ZmZmZlMjIsIHsgUkRTVEUsIFJTUkNFLCBBU1JDMCB9IH0sCi0gIHsgInN1YmFjM3MiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDEwMDIsIDB4M2ZmZmZlMmUsIHsgUkRTVEUsIEFTUkMsIEFTUkMwIH0gfSwKLSAgeyAic3ViaSIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNFMgfSB9LAotICB7ICJ0cmFwIiwgU0hPUlRfMiwgNSwgTVUsIEJSQU5DSF9MSU5LfFBBUiwgMHg1ZjAwLCAweDdmZTEsIHsgVU5VTTQgfSB9LAotICB7ICJ0c3QwaSIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHg3MDAwMDAwLCAweDNmMGYwMDAwLCB7IFJTUkMyLCBOVU0xNiB9IH0sCi0gIHsgInRzdDFpIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweGYwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIE5VTTE2IH0gfSwKLSAgeyAid2FpdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NWY4MCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJ4b3IiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHhhMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAieG9yMyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHg1MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIFJTUkMsIE5VTTE2IH0gfSwKLSAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCB7IDAgfSB9LAotfTsKLQotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2QzMHYtZGlzLmMgYi9vcGNvZGVzL2QzMHYtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNThiNzUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kMzB2LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIEQzMFYgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJvcGNvZGUvZDMwdi5oIiAKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSNkZWZpbmUgUENfTUFTSyAweEZGRkZGRkZGCi0KLXN0YXRpYyBpbnQgbG9va3VwX29wY29kZSBQQVJBTVMgKCggc3RydWN0IGQzMHZfaW5zbiAqaW5zbiwgbG9uZyBudW0sIGludCBpc19sb25nICkpOwotc3RhdGljIHZvaWQgcHJpbnRfaW5zbiBQQVJBTVMgKCggc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8sIGJmZF92bWEgbWVtYWRkciwgbG9uZyBsb25nIG51bSwgCi0JCQkJIHN0cnVjdCBkMzB2X2luc24gKmluc24sIGludCBpc19sb25nLCBpbnQgc2hvd19leHQgKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfdmFsdWUgUEFSQU1TICgoIGxvbmcgbG9uZyBudW0sIHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wZXIsIGludCBpc19sb25nICkpOwotCi1pbnQgCi1wcmludF9pbnNuX2QzMHYgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBzdGF0dXMsIHJlc3VsdDsKLSAgYmZkX2J5dGUgYnVmZmVyWzEyXTsKLSAgdW5zaWduZWQgbG9uZyBpbjEsaW4yOwotICBzdHJ1Y3QgZDMwdl9pbnNuIGluc247Ci0gIGxvbmcgbG9uZyBudW07Ci0KLSAgaW5zbi5mb3JtID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKU5VTEw7Ci0KLSAgaW5mby0+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+IHNoaWZ0KSAmIG1hc2s7Ci0KLSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9TSElGVCkKLSAgICB2YWwgPDw9IDM7Ci0KLSAgcmV0dXJuIHZhbDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvZDMwdi1vcGMuYyBiL29wY29kZXMvZDMwdi1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4ZmNjMC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2QzMHYtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotLyogZDMwdi1vcGMuYyAtLSBEMzBWIG9wY29kZSBsaXN0Ci0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWFydGluIEh1bnQsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0yLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2QzMHYuaCIKLQotCi0vKiBUaGlzIHRhYmxlIGlzIHNvcnRlZC4gKi8KLS8qIElmIHlvdSBhZGQgYW55dGhpbmcsIGl0IE1VU1QgYmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyICovCi0vKiBUaGUgZmlyc3QgZmllbGQgaXMgdGhlIG5hbWUgdGhlIGFzc2VtYmxlciB1c2VzIHdoZW4gbG9va2luZyAqLwotLyogdXAgb3Jjb2Rlcy4gIFRoZSBzZWNvbmQgZmllbGQgaXMgdGhlIG5hbWUgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIHVzZS4gKi8KLS8qIFRoaXMgYWxsb3dzIHRoZSBhc3NlbWJsZXIgdG8gYXNzZW1ibGUgcmVmZXJlbmNlcyB0byByNjMgKGZvciBleGFtcGxlKSAqLwotLyogb3IgInNwIi4gIFRoZSBkaXNhc3NlbWJsZXIgd2lsbCBhbHdheXMgdXNlIHRoZSBwcmVmZXJyZWQgZm9ybSAoc3ApICovCi1jb25zdCBzdHJ1Y3QgcGRfcmVnIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiYTAiLCBOVUxMLCBPUEVSQU5EX0FDQyswIH0sCi0gIHsgImExIiwgTlVMTCwgT1BFUkFORF9BQ0MrMSB9LAotICB7ICJicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMyB9LAotICB7ICJicHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEgfSwKLSAgeyAiYyIsICJjIiwgT1BFUkFORF9GTEFHKzcgfSwKLSAgeyAiY3IwIiwgInBzdyIsIE9QRVJBTkRfQ09OVFJPTCB9LAotICB7ICJjcjEiLCAiYnBzdyIsIE9QRVJBTkRfQ09OVFJPTCsxIH0sCi0gIHsgImNyMTAiLCAibW9kX3MiLCBPUEVSQU5EX0NPTlRST0wrMTAgfSwKLSAgeyAiY3IxMSIsICJtb2RfZSIsIE9QRVJBTkRfQ09OVFJPTCsxMSB9LAotICB7ICJjcjEyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEyIH0sCi0gIHsgImNyMTMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTMgfSwKLSAgeyAiY3IxNCIsICJpYmEiLCBPUEVSQU5EX0NPTlRST0wrMTQgfSwKLSAgeyAiY3IxNSIsICJlaXRfdmIiLCBPUEVSQU5EX0NPTlRST0wrMTUgfSwKLSAgeyAiY3IxNiIsICJpbnRfcyIsIE9QRVJBTkRfQ09OVFJPTCsxNiB9LAotICB7ICJjcjE3IiwgImludF9tIiwgT1BFUkFORF9DT05UUk9MKzE3IH0sCi0gIHsgImNyMTgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTggfSwKLSAgeyAiY3IxOSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxOSB9LAotICB7ICJjcjIiLCAicGMiLCBPUEVSQU5EX0NPTlRST0wrMiB9LAotICB7ICJjcjIwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIwIH0sCi0gIHsgImNyMjEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjEgfSwKLSAgeyAiY3IyMiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyMiB9LAotICB7ICJjcjIzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIzIH0sCi0gIHsgImNyMjQiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjQgfSwKLSAgeyAiY3IyNSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyNSB9LAotICB7ICJjcjI2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI2IH0sCi0gIHsgImNyMjciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjcgfSwKLSAgeyAiY3IyOCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyOCB9LAotICB7ICJjcjI5IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI5IH0sCi0gIHsgImNyMyIsICJicGMiLCBPUEVSQU5EX0NPTlRST0wrMyB9LAotICB7ICJjcjMwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMwIH0sCi0gIHsgImNyMzEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzEgfSwKLSAgeyAiY3IzMiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszMiB9LAotICB7ICJjcjMzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMzIH0sCi0gIHsgImNyMzQiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzQgfSwKLSAgeyAiY3IzNSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszNSB9LAotICB7ICJjcjM2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM2IH0sCi0gIHsgImNyMzciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzcgfSwKLSAgeyAiY3IzOCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszOCB9LAotICB7ICJjcjM5IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM5IH0sCi0gIHsgImNyNCIsICJkcHN3IiwgT1BFUkFORF9DT05UUk9MKzQgfSwKLSAgeyAiY3I0MCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0MCB9LAotICB7ICJjcjQxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQxIH0sCi0gIHsgImNyNDIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDIgfSwKLSAgeyAiY3I0MyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0MyB9LAotICB7ICJjcjQ0IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ0IH0sCi0gIHsgImNyNDUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDUgfSwKLSAgeyAiY3I0NiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0NiB9LAotICB7ICJjcjQ3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ3IH0sCi0gIHsgImNyNDgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDggfSwKLSAgeyAiY3I0OSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0OSB9LAotICB7ICJjcjUiLCJkcGMiLCBPUEVSQU5EX0NPTlRST0wrNSB9LAotICB7ICJjcjUwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUwIH0sCi0gIHsgImNyNTEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTEgfSwKLSAgeyAiY3I1MiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1MiB9LAotICB7ICJjcjUzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUzIH0sCi0gIHsgImNyNTQiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTQgfSwKLSAgeyAiY3I1NSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1NSB9LAotICB7ICJjcjU2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU2IH0sCi0gIHsgImNyNTciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTcgfSwKLSAgeyAiY3I1OCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1OCB9LAotICB7ICJjcjU5IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU5IH0sCi0gIHsgImNyNiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2IH0sCi0gIHsgImNyNjAiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNjAgfSwKLSAgeyAiY3I2MSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2MSB9LAotICB7ICJjcjYyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYyIH0sCi0gIHsgImNyNjMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNjMgfSwKLSAgeyAiY3I3IiwgInJwdF9jIiwgT1BFUkFORF9DT05UUk9MKzcgfSwKLSAgeyAiY3I4IiwgInJwdF9zIiwgT1BFUkFORF9DT05UUk9MKzggfSwKLSAgeyAiY3I5IiwgInJwdF9lIiwgT1BFUkFORF9DT05UUk9MKzkgfSwKLSAgeyAiZHBjIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUgfSwKLSAgeyAiZHBzdyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0IH0sCi0gIHsgImVpdF92YiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNSB9LAotICB7ICJmMCIsIE5VTEwsIE9QRVJBTkRfRkxBRyswIH0sCi0gIHsgImYxIiwgTlVMTCwgT1BFUkFORF9GTEFHKzEgfSwKLSAgeyAiZjIiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrMiB9LAotICB7ICJmMyIsIE5VTEwsIE9QRVJBTkRfRkxBRyszIH0sCi0gIHsgImY0IiwgInMiLCBPUEVSQU5EX0ZMQUcrNCB9LAotICB7ICJmNSIsICJ2IiwgT1BFUkFORF9GTEFHKzUgfSwKLSAgeyAiZjYiLCAidmEiLCBPUEVSQU5EX0ZMQUcrNiB9LAotICB7ICJmNyIsICJjIiwgT1BFUkFORF9GTEFHKzcgfSwKLSAgeyAiaWJhIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE0IH0sCi0gIHsgImludF9tIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE3IH0sCi0gIHsgImludF9zIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE2IH0sCi0gIHsgImxpbmsiLCAicjYyIiwgNjIgfSwKLSAgeyAibW9kX2UiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTEgfSwKLSAgeyAibW9kX3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTAgfSwKLSAgeyAicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMiB9LAotICB7ICJwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wgfSwKLSAgeyAicHN3aCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCtNQVhfQ09OVFJPTF9SRUcrMiB9LAotICB7ICJwc3dsIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MK01BWF9DT05UUk9MX1JFRysxIH0sCi0gIHsgInIwIiwgTlVMTCwgMCB9LAotICB7ICJyMSIsIE5VTEwsIDEgfSwKLSAgeyAicjEwIiwgTlVMTCwgMTAgfSwKLSAgeyAicjExIiwgTlVMTCwgMTEgfSwKLSAgeyAicjEyIiwgTlVMTCwgMTIgfSwKLSAgeyAicjEzIiwgTlVMTCwgMTMgfSwKLSAgeyAicjE0IiwgTlVMTCwgMTQgfSwKLSAgeyAicjE1IiwgTlVMTCwgMTUgfSwKLSAgeyAicjE2IiwgTlVMTCwgMTYgfSwKLSAgeyAicjE3IiwgTlVMTCwgMTcgfSwKLSAgeyAicjE4IiwgTlVMTCwgMTggfSwKLSAgeyAicjE5IiwgTlVMTCwgMTkgfSwKLSAgeyAicjIiLCBOVUxMLCAyIH0sCi0gIHsgInIyMCIsIE5VTEwsIDIwIH0sCi0gIHsgInIyMSIsIE5VTEwsIDIxIH0sCi0gIHsgInIyMiIsIE5VTEwsIDIyIH0sCi0gIHsgInIyMyIsIE5VTEwsIDIzIH0sCi0gIHsgInIyNCIsIE5VTEwsIDI0IH0sCi0gIHsgInIyNSIsIE5VTEwsIDI1IH0sCi0gIHsgInIyNiIsIE5VTEwsIDI2IH0sCi0gIHsgInIyNyIsIE5VTEwsIDI3IH0sCi0gIHsgInIyOCIsIE5VTEwsIDI4IH0sCi0gIHsgInIyOSIsIE5VTEwsIDI5IH0sCi0gIHsgInIzIiwgTlVMTCwgMyB9LAotICB7ICJyMzAiLCBOVUxMLCAzMCB9LAotICB7ICJyMzEiLCBOVUxMLCAzMSB9LAotICB7ICJyMzIiLCBOVUxMLCAzMiB9LAotICB7ICJyMzMiLCBOVUxMLCAzMyB9LAotICB7ICJyMzQiLCBOVUxMLCAzNCB9LAotICB7ICJyMzUiLCBOVUxMLCAzNSB9LAotICB7ICJyMzYiLCBOVUxMLCAzNiB9LAotICB7ICJyMzciLCBOVUxMLCAzNyB9LAotICB7ICJyMzgiLCBOVUxMLCAzOCB9LAotICB7ICJyMzkiLCBOVUxMLCAzOSB9LAotICB7ICJyNCIsIE5VTEwsIDQgfSwKLSAgeyAicjQwIiwgTlVMTCwgNDAgfSwKLSAgeyAicjQxIiwgTlVMTCwgNDEgfSwKLSAgeyAicjQyIiwgTlVMTCwgNDIgfSwKLSAgeyAicjQzIiwgTlVMTCwgNDMgfSwKLSAgeyAicjQ0IiwgTlVMTCwgNDQgfSwKLSAgeyAicjQ1IiwgTlVMTCwgNDUgfSwKLSAgeyAicjQ2IiwgTlVMTCwgNDYgfSwKLSAgeyAicjQ3IiwgTlVMTCwgNDcgfSwKLSAgeyAicjQ4IiwgTlVMTCwgNDggfSwKLSAgeyAicjQ5IiwgTlVMTCwgNDkgfSwKLSAgeyAicjUiLCBOVUxMLCA1IH0sCi0gIHsgInI1MCIsIE5VTEwsIDUwIH0sCi0gIHsgInI1MSIsIE5VTEwsIDUxIH0sCi0gIHsgInI1MiIsIE5VTEwsIDUyIH0sCi0gIHsgInI1MyIsIE5VTEwsIDUzIH0sCi0gIHsgInI1NCIsIE5VTEwsIDU0IH0sCi0gIHsgInI1NSIsIE5VTEwsIDU1IH0sCi0gIHsgInI1NiIsIE5VTEwsIDU2IH0sCi0gIHsgInI1NyIsIE5VTEwsIDU3IH0sCi0gIHsgInI1OCIsIE5VTEwsIDU4IH0sCi0gIHsgInI1OSIsIE5VTEwsIDU5IH0sCi0gIHsgInI2IiwgTlVMTCwgNiB9LAotICB7ICJyNjAiLCBOVUxMLCA2MCB9LAotICB7ICJyNjEiLCBOVUxMLCA2MSB9LAotICB7ICJyNjIiLCAibGluayIsIDYyIH0sCi0gIHsgInI2MyIsICJzcCIsIDYzIH0sCi0gIHsgInI3IiwgTlVMTCwgNyB9LAotICB7ICJyOCIsIE5VTEwsIDggfSwKLSAgeyAicjkiLCBOVUxMLCA5IH0sCi0gIHsgInJwdF9jIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzcgfSwKLSAgeyAicnB0X2UiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrOSB9LAotICB7ICJycHRfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs4IH0sCi0gIHsgInMiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrNCB9LAotICB7ICJzcCIsIE5VTEwsIDYzIH0sCi0gIHsgInYiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrNSB9LAotICB7ICJ2YSIsIE5VTEwsIE9QRVJBTkRfRkxBRys2IH0sCi19OwotCi1pbnQgCi1yZWdfbmFtZV9jbnQoKQotewotICByZXR1cm4gKHNpemVvZihwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCBwZF9yZWcpKTsKLX0KLQotLyogT1BDT0RFIFRBQkxFICovCi0vKiBUaGUgZm9ybWF0IG9mIHRoaXMgdGFibGUgaXMgZGVmaW5lZCBpbiBvcGNvZGUvZDMwdi5oICovCi1jb25zdCBzdHJ1Y3QgZDMwdl9vcGNvZGUgZDMwdl9vcGNvZGVfdGFibGVbXSA9IHsKLSAgeyAiYWJzIiwgSUFMVTEsIDB4OCwgeyBTSE9SVF9VIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhZGQiLCBJQUxVMSwgMHgwLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGQyaCIsIElBTFUxLCAweDEsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhZGRjIiwgSUFMVTEsIDB4NCwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19DLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGxsbCIsIElBTFUxLCAweDEwLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhsbGgiLCBJQUxVMSwgMHgxMSwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRobGhsIiwgSUFMVTEsIDB4MTIsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGxoaCIsIElBTFUxLCAweDEzLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhobGwiLCBJQUxVMSwgMHgxNCwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRoaGxoIiwgSUFMVTEsIDB4MTUsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGhobCIsIElBTFUxLCAweDE2LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhoaGgiLCBJQUxVMSwgMHgxNywgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRzIiwgSUFMVTEsIDB4NiwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZHMyaCIsIElBTFUxLCAweDcsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYW5kIiwgTE9HSUMsIDB4MTgsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYW5kZmciLCBMT0dJQywgMHg4LCB7IFNIT1JUX0YgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImF2ZyIsIElBTFUxLCAweGEsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhdmcyaCIsIElBTFUxLCAweGIsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJiY2xyIiwgTE9HSUMsIDB4MywgeyBTSE9SVF9BIH0sIEVJVEhFUl9CVVRfUFJFRkVSX01VLCAwLCAwLCAwIH0sCi0gIHsgImJub3QiLCBMT0dJQywgMHgxLCB7IFNIT1JUX0EgfSwgRUlUSEVSX0JVVF9QUkVGRVJfTVUsIDAsIDAsIDAgfSwKLSAgeyAiYnJhIiwgQlJBLCAwLCB7IFNIT1JUX0IxLCBTSE9SVF9CMiwgTE9OR19VIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiYnJhdG56IiwgQlJBLCAweDQsIHsgU0hPUlRfQjNiLCBMT05HXzJiIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiYnJhdHpyIiwgQlJBLCAweDQsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJzZXQiLCBMT0dJQywgMHgyLCB7IFNIT1JUX0EgfSwgRUlUSEVSX0JVVF9QUkVGRVJfTVUsIDAsIDAsIDAgfSwKLSAgeyAiYnNyIiwgQlJBLCAweDIsIHsgU0hPUlRfQjEsIFNIT1JUX0IyLCBMT05HX1UgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJic3J0bnoiLCBCUkEsIDB4NiwgeyBTSE9SVF9CM2IsIExPTkdfMmIgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJic3J0enIiLCBCUkEsIDB4NiwgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiYnRzdCIsIExPR0lDLCAwLCB7IFNIT1JUX0FGIH0sIEVJVEhFUl9CVVRfUFJFRkVSX01VLCAwLCAwLCAwIH0sCi0gIHsgImNtcCIsIExPR0lDLCAweEMsIHsgU0hPUlRfQ01QLCBMT05HX0NNUCB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiY21wdSIsIExPR0lDLCAweEQsIHsgU0hPUlRfQ01QVSwgTE9OR19DTVAgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImRicmEiLCBCUkEsIDB4MTAsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KTVAgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJkYnJhaSIsIEJSQSwgMHgxNCwgeyBTSE9SVF9EMiwgTE9OR19EIH0sIE1VLCBGTEFHX0pNUCB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImRic3IiLCBCUkEsIDB4MTIsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KU1IgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJkYnNyaSIsIEJSQSwgMHgxNiwgeyBTSE9SVF9EMiwgTE9OR19EIH0sIE1VLCBGTEFHX0pTUiB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImRidCIsIEJSQSwgMHhiLCB7IFNIT1JUX05PTkUgfSwgTVUsIEZMQUdfSlNSLCBGTEFHX0xLUiwgMCB9LAotICB7ICJkam1wIiwgQlJBLCAweDExLCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSk1QIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfQUJTIH0sCi0gIHsgImRqbXBpIiwgQlJBLCAweDE1LCB7IFNIT1JUX0QyLCBMT05HX0QgfSwgTVUsIEZMQUdfSk1QIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfQUJTIH0sCi0gIHsgImRqc3IiLCBCUkEsIDB4MTMsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KU1IgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19BQlMgfSwKLSAgeyAiZGpzcmkiLCBCUkEsIDB4MTcsIHsgU0hPUlRfRDIsIExPTkdfRCB9LCBNVSwgRkxBR19KU1IgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19BQlMgfSwKLSAgeyAiam1wIiwgQlJBLCAweDEsIHsgU0hPUlRfQjEsIFNIT1JUX0IyLCBMT05HX1UgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAiam1wdG56IiwgQlJBLCAweDUsIHsgU0hPUlRfQjNiLCBMT05HXzJiIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfQUJTIH0sCi0gIHsgImptcHR6ciIsIEJSQSwgMHg1LCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAiam9pbmxsIiwgSUFMVTEsIDB4QywgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJqb2lubGgiLCBJQUxVMSwgMHhELCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImpvaW5obCIsIElBTFUxLCAweEUsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiam9pbmhoIiwgSUFMVTEsIDB4RiwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJqc3IiLCBCUkEsIDB4MywgeyBTSE9SVF9CMSwgU0hPUlRfQjIsIExPTkdfVSB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJqc3J0bnoiLCBCUkEsIDB4NywgeyBTSE9SVF9CM2IsIExPTkdfMmIgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAianNydHpyIiwgQlJBLCAweDcsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJsZDJoIiwgSU1FTSwgMHgzLCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZDJ3IiwgSU1FTSwgMHg2LCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCBGTEFHX01FTSB8IEZMQUdfMldPUkQsIDAsIDAgfSwKLSAgeyAibGQ0YmgiLCBJTUVNLCAweDUsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIEZMQUdfTUVNIHwgRkxBR18yV09SRCwgMCwgMCB9LAotICB7ICJsZDRiaHUiLCBJTUVNLCAweGQsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkYiIsIElNRU0sIDAsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZGJ1IiwgSU1FTSwgMHg5LCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGRoIiwgSU1FTSwgMHgyLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGRoaCIsIElNRU0sIDB4MSwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkaHUiLCBJTUVNLCAweGEsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZHciLCBJTUVNLCAweDQsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJtYWMwIiwgSUFMVTIsIDB4MTQsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtYWMxIiwgSUFMVTIsIDB4MTQsIHsgU0hPUlRfQTEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibWFjczAiLCBJQUxVMiwgMHgxNSwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1hY3MxIiwgSUFMVTIsIDB4MTUsIHsgU0hPUlRfQTEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibW9kZGVjIiwgSU1FTSwgMHg3LCB7IFNIT1JUX01PRERFQyB9LCBNVSwgMCwgMCwgMCB9LAotICB7ICJtb2RpbmMiLCBJTUVNLCAweDcsIHsgU0hPUlRfTU9ESU5DIH0sIE1VLCAwLCAwLCAwIH0sCi0gIHsgIm1zdWIwIiwgSUFMVTIsIDB4MTYsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtc3ViMSIsIElBTFUyLCAweDE2LCB7IFNIT1JUX0ExIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1zdWJzMCIsIElBTFUyLCAweDE3LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXN1YnMxIiwgSUFMVTIsIDB4MTcsIHsgU0hPUlRfQTEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXVsIiwgSUFMVTIsIDB4MTAsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtdWwyaCIsIElBTFUyLCAwLCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKLSAgeyAibXVsaHhsbCIsIElBTFUyLCAweDQsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWxoeGxoIiwgSUFMVTIsIDB4NSwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bGh4aGwiLCBJQUxVMiwgMHg2LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKLSAgeyAibXVsaHhoaCIsIElBTFUyLCAweDcsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWx4IiwgSUFMVTIsIDB4MTgsIHsgU0hPUlRfQUEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXVseDJoIiwgSUFMVTIsIDB4MSwgeyBTSE9SVF9BMiB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWx4cyIsIElBTFUyLCAweDE5LCB7IFNIT1JUX0FBIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm12ZmFjYyIsIElBTFUyLCAweDFmLCB7IFNIT1JUX1JBIH0sIElVLCAwLCAwLCAwIH0sCi0gIHsgIm12ZnN5cyIsIEJSQSwgMHgxZSwgeyBTSE9SVF9DMSB9LCBNVSwgRkxBR19BTEwsIEZMQUdfQUxMLCAwIH0sCi0gIHsgIm12dGFjYyIsIElBTFUyLCAweGYsIHsgU0hPUlRfQVIgfSwgSVUsIDAsIDAsIDAgfSwKLSAgeyAibXZ0c3lzIiwgQlJBLCAweGUsIHsgU0hPUlRfQzIgfSwgTVUsIEZMQUdfQUxMLCBGTEFHX0FMTCwgMCB9LAotICB7ICJub3AiLCBCUkEsIDB4RiwgeyBTSE9SVF9OT05FIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJub3QiLCBMT0dJQywgMHgxOSwgeyBTSE9SVF9VIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJub3RmZyIsIExPR0lDLCAweDksIHsgU0hPUlRfVUYgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgIm9yIiwgTE9HSUMsIDB4MWEsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAib3JmZyIsIExPR0lDLCAweGEsIHsgU0hPUlRfRiB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAicmVpdCIsIEJSQSwgMHg4LCB7IFNIT1JUX05PTkUgfSwgTVUsIEZMQUdfU00gfCBGTEFHX0pNUCwgRkxBR19TTSB8IEZMQUdfTEtSLCAwIH0sCi0gIHsgInJlcGVhdCIsIEJSQSwgMHgxOCwgeyBTSE9SVF9EMSwgTE9OR18yIH0sIE1VLCBGTEFHX1JQLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJyZXBlYXRpIiwgQlJBLCAweDFhLCB7IFNIT1JUX0QyQiwgTE9OR19EYiB9LCBNVSwgRkxBR19SUCwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAicm90IiwgTE9HSUMsIDB4MTQsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAicm90MmgiLCBMT0dJQywgMHgxNSwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJydGQiLCBCUkEsIDB4YSwgeyBTSE9SVF9OT05FIH0sIE1VLCBGTEFHX0pNUCwgRkxBR19MS1IsIDAgfSwKLSAgeyAic2F0IiwgSUFMVTIsIDB4OCwgeyBTSE9SVF9BNSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJzYXQyaCIsIElBTFUyLCAweDksIHsgU0hPUlRfQTUgfSwgSVUsIDAsIDAsIDAgfSwKLSAgeyAic2F0aGwiLCBJQUxVMiwgMHgxYywgeyBTSE9SVF9BNSB9LCBJVSwgRkxBR19BRERTVUJwcHAsIDAsIDAgfSwKLSAgeyAic2F0aGgiLCBJQUxVMiwgMHgxZCwgeyBTSE9SVF9BNSB9LCBJVSwgRkxBR19BRERTVUJwcHAsIDAsIDAgfSwKLSAgeyAic2F0eiIsIElBTFUyLCAweGEsIHsgU0hPUlRfQTUgfSwgSVUsIDAsIDAsIDAgfSwKLSAgeyAic2F0ejJoIiwgSUFMVTIsIDB4YiwgeyBTSE9SVF9BNSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJzcmEiLCBMT0dJQywgMHgxMCwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmEyaCIsIExPR0lDLCAweDExLCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNyYWhoIiwgTE9HSUMsIDB4NSwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmFobCIsIExPR0lDLCAweDQsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JjIiwgTE9HSUMsIDB4MTYsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCAwLCAwIH0sCi0gIHsgInNybCIsIExPR0lDLCAweDEyLCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNybDJoIiwgTE9HSUMsIDB4MTMsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JsaGgiLCBMT0dJQywgMHg3LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNybGhsIiwgTE9HSUMsIDB4NiwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzdDJoIiwgSU1FTSwgMHgxMywgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgMCwgRkxBR19NRU0sIDAgfSwKLSAgeyAic3QydyIsIElNRU0sIDB4MTYsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIDAsIEZMQUdfTUVNIHwgRkxBR18yV09SRCwgMCB9LAotICB7ICJzdDRoYiIsIElNRU0sIDB4MTUsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIDAsIEZMQUdfTUVNIHwgRkxBR18yV09SRCwgMCB9LAotICB7ICJzdGIiLCBJTUVNLCAweDEwLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgMCwgRkxBR19NRU0sIDAgfSwKLSAgeyAic3RoIiwgSU1FTSwgMHgxMiwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIDAsIEZMQUdfTUVNLCAwIH0sCi0gIHsgInN0aGgiLCBJTUVNLCAweDExLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgMCwgRkxBR19NRU0sIDAgfSwKLSAgeyAic3R3IiwgSU1FTSwgMHgxNCwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIDAsIEZMQUdfTUVNLCAwIH0sCi0gIHsgInN1YiIsIElBTFUxLCAweDIsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YjJoIiwgSUFMVTEsIDB4MywgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInN1YmIiLCBJQUxVMSwgMHg1LCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQywgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhsbGwiLCBJQUxVMSwgMHgxOCwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhsbGgiLCBJQUxVMSwgMHgxOSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhsaGwiLCBJQUxVMSwgMHgxYSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhsaGgiLCBJQUxVMSwgMHgxYiwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhobGwiLCBJQUxVMSwgMHgxYywgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhobGgiLCBJQUxVMSwgMHgxZCwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhoaGwiLCBJQUxVMSwgMHgxZSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhoaGgiLCBJQUxVMSwgMHgxZiwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInRyYXAiLCBCUkEsIDB4OSwgeyBTSE9SVF9CMSwgU0hPUlRfVH0sIE1VLCBGTEFHX0pTUiwgRkxBR19TTSB8IEZMQUdfTEtSLCAwIH0sCi0gIHsgInhvciIsIExPR0lDLCAweDFiLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInhvcmZnIiwgTE9HSUMsIDB4YiwgeyBTSE9SVF9GIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7IE5VTEwsIDAsIDAsIHsgMCB9LCAwLCAwLCAwLCAwIH0sCi19OwotCi0KLS8qIG5vdyBkZWZpbmUgdGhlIG9wZXJhbmQgdHlwZXMgKi8KLS8qIGZvcm1hdCBpcyBsZW5ndGgsIGJpdHMsIHBvc2l0aW9uLCBmbGFncyAqLwotY29uc3Qgc3RydWN0IGQzMHZfb3BlcmFuZCBkMzB2X29wZXJhbmRfdGFibGVbXSA9Ci17Ci0jZGVmaW5lIFVOVVNFRAkoMCkKLSAgeyAwLCAwLCAwLCAwIH0sCi0jZGVmaW5lIFJhCShVTlVTRUQgKyAxKQotICB7IDYsIDYsIDAsIE9QRVJBTkRfUkVHfE9QRVJBTkRfREVTVCB9LAotI2RlZmluZSBSYTIJKFJhICsgMSkKLSAgeyA2LCA2LCAwLCBPUEVSQU5EX1JFR3xPUEVSQU5EX0RFU1R8T1BFUkFORF8yUkVHIH0sCi0jZGVmaW5lIFJhMwkoUmEyICsgMSkKLSAgeyA2LCA2LCAwLCBPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSYgkoUmEzICsgMSkKLSAgeyA2LCA2LCA2LCBPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSYwkoUmIgKyAxKQotICB7IDYsIDYsIDEyLCBPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBBYQkoUmMgKyAxKQotICB7IDYsIDEsIDAsIE9QRVJBTkRfQUNDfE9QRVJBTkRfUkVHfE9QRVJBTkRfREVTVCB9LAotI2RlZmluZSBBYgkoQWEgKyAxKQotICB7IDYsIDEsIDYsIE9QRVJBTkRfQUNDfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIElNTTUJKEFiICsgMSkKLSAgeyA2LCA1LCAxMiwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgSU1NNVUJKElNTTUgKyAxKQotICB7IDYsIDUsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBJTU01UzMJKElNTTVVICsgMSkKLSAgeyA2LCA1LCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgSU1NNgkoSU1NNVMzICsgMSkKLSAgeyA2LCA2LCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgSU1NNlUJKElNTTYgKyAxKQotICB7IDYsIDYsIDAsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIElNTTZVMgkoSU1NNlUgKyAxKQotICB7IDYsIDYsIDEyLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBJTU02UzMJKElNTTZVMiArIDEpCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9OVU18T1BFUkFORF9TSElGVCB9LAotI2RlZmluZSBJTU0xMlMzCShJTU02UzMgKyAxKQotICB7IDEyLCAxMiwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEfE9QRVJBTkRfU0hJRlQgfSwKLSNkZWZpbmUgSU1NMTJTM1UgKElNTTEyUzMgKyAxKQotICB7IDEyLCAxMiwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0hJRlQgfSwKLSNkZWZpbmUgSU1NMThTMwkoSU1NMTJTM1UgKyAxKQotICB7IDE4LCAxOCwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEfE9QRVJBTkRfU0hJRlQgfSwKLSNkZWZpbmUgSU1NMzIJKElNTTE4UzMgKyAxKQotICB7IDMyLCAzMiwgMCwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgRmEJKElNTTMyICsgMSkKLSAgeyA2LCAzLCAwLCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkxBRyB8IE9QRVJBTkRfREVTVCB9LAotI2RlZmluZSBGYgkoRmEgKyAxKQotICB7IDYsIDMsIDYsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9GTEFHIH0sCi0jZGVmaW5lIEZjCShGYiArIDEpCi0gIHsgNiwgMywgMTIsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9GTEFHIH0sCi0jZGVmaW5lIEFUU0lHTgkoRmMgKyAxKQotICB7IDAsIDAsIDAsIE9QRVJBTkRfQVRTSUdOfSwKLSNkZWZpbmUgQVRQQVIJKEFUU0lHTiArIDEpCS8qICJAKCIgKi8KLSAgeyAwLCAwLCAwLCBPUEVSQU5EX0FUUEFSfSwKLSNkZWZpbmUgUExVUwkoQVRQQVIgKyAxKQkvKiBwb3N0aW5jcmVtZW50ICovCi0gIHsgMCwgMCwgMCwgT1BFUkFORF9QTFVTfSwKLSNkZWZpbmUgTUlOVVMJKFBMVVMgKyAxKQkvKiBwb3N0ZGVjcmVtZW50ICovCi0gIHsgMCwgMCwgMCwgT1BFUkFORF9NSU5VU30sCi0jZGVmaW5lIEFUTUlOVVMJKE1JTlVTICsgMSkJLyogcHJlZGVjcmVtZW50ICovCi0gIHsgMCwgMCwgMCwgT1BFUkFORF9BVE1JTlVTfSwKLSNkZWZpbmUgQ2EJKEFUTUlOVVMgKyAxKQkvKiBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9SRUd8T1BFUkFORF9DT05UUk9MfE9QRVJBTkRfREVTVH0sCi0jZGVmaW5lIENiCShDYSArIDEpCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyA2LCA2LCA2LCBPUEVSQU5EX1JFR3xPUEVSQU5EX0NPTlRST0x9LAotI2RlZmluZSBDQwkoQ2IgKyAxKQkvKiBjb25kaXRpb24gY29kZSAoQ01QY2MgYW5kIENNUFVjYykgKi8KLSAgeyAzLCAzLCAtMywgT1BFUkFORF9OQU1FfSwKLSNkZWZpbmUgRmEyCShDQyArIDEpCS8qIGZsYWcgcmVnaXN0ZXIgKENNUGNjIGFuZCBDTVBVY2MpICovCi0gIHsgMywgMywgMCwgT1BFUkFORF9SRUd8T1BFUkFORF9GTEFHfE9QRVJBTkRfREVTVH0sCi0jZGVmaW5lIEZha2UJKEZhMiArIDEpCS8qIHBsYWNlIGhvbGRlciBmb3IgImlkIiBmaWVsZCBpbiBtdmZzeXMgYW5kIG12dHN5cyAqLwotICB7IDYsIDIsIDEyLCBPUEVSQU5EX1NQRUNJQUx9LAotfTsKLQotLyogbm93IHdlIG5lZWQgdG8gZGVmaW5lIHRoZSBpbnN0cnVjdGlvbiBmb3JtYXRzICovCi1jb25zdCBzdHJ1Y3QgZDMwdl9mb3JtYXQgZDMwdl9mb3JtYXRfdGFibGVbXSA9Ci17Ci0gIHsgMCwgMCwgeyAwIH0gfSwKLSAgeyBTSE9SVF9NLCAwLCB7IFJhLCBBVFBBUiwgUmIsIFJjIH0gfSwJLyogUmEsQChSYixSYykgKi8KLSAgeyBTSE9SVF9NLCAxLCB7IFJhLCBBVFBBUiwgUmIsIFBMVVMsIFJjIH0gfSwJLyogUmEsQChSYissUmMpICovCi0gIHsgU0hPUlRfTSwgMiwgeyBSYSwgQVRQQVIsIFJiLCBJTU02IH0gfSwJLyogUmEsQChSYixpbW02KSAqLwotICB7IFNIT1JUX00sIDMsIHsgUmEsIEFUUEFSLCBSYiwgTUlOVVMsIFJjIH0gfSwJLyogUmEsQChSYi0sUmMpICovCi0gIHsgU0hPUlRfTTIsIDAsIHsgUmEyLCBBVFBBUiwgUmIsIFJjIH0gfSwJLyogUmEsQChSYixSYykgKi8KLSAgeyBTSE9SVF9NMiwgMSwgeyBSYTIsIEFUUEFSLCBSYiwgUExVUywgUmMgfSB9LAkvKiBSYSxAKFJiKyxSYykgKi8KLSAgeyBTSE9SVF9NMiwgMiwgeyBSYTIsIEFUUEFSLCBSYiwgSU1NNiB9IH0sCS8qIFJhLEAoUmIsaW1tNikgKi8KLSAgeyBTSE9SVF9NMiwgMywgeyBSYTIsIEFUUEFSLCBSYiwgTUlOVVMsIFJjIH0gfSwJLyogUmEsQChSYi0sUmMpICovCi0gIHsgU0hPUlRfQSwgMCwgeyBSYSwgUmIsIFJjIH0gfSwJCS8qIFJhLFJiLFJjICovCi0gIHsgU0hPUlRfQSwgMiwgeyBSYSwgUmIsIElNTTYgfSB9LAkJLyogUmEsUmIsaW1tNiAqLwotICB7IFNIT1JUX0IxLCAwLCB7IFJjIH0gfSwJCQkvKiBSYyAqLwotICB7IFNIT1JUX0IyLCAyLCB7IElNTTE4UzMgfSB9LAkJCS8qIGltbTE4ICovCi0gIHsgU0hPUlRfQjMsIDAsIHsgUmEzLCBSYyB9IH0sCQkJLyogUmEsUmMgKi8KLSAgeyBTSE9SVF9CMywgMiwgeyBSYTMsIElNTTEyUzMgfSB9LAkJLyogUmEsaW1tMTIgKi8KLSAgeyBTSE9SVF9CM2IsIDEsIHsgUmEzLCBSYyB9IH0sCQkvKiBSYSxSYyAqLwotICB7IFNIT1JUX0IzYiwgMywgeyBSYTMsIElNTTEyUzMgfSB9LAkJLyogUmEsaW1tMTIgKi8KLSAgeyBTSE9SVF9EMSwgMCwgeyBSYSwgUmMgfSB9LAkJCS8qIFJhLFJjICovCi0gIHsgU0hPUlRfRDEsIDIsIHsgUmEsIElNTTEyUzMgfSB9LAkJLyogUmEsaW1tMTJzMyAqLwotICB7IFNIT1JUX0QyLCAwLCB7IElNTTZTMywgUmMgfSB9LAkJLyogaW1tNnMzLFJjICovCi0gIHsgU0hPUlRfRDIsIDIsIHsgSU1NNlMzLCBJTU0xMlMzIH0gfSwJCS8qIGltbTZzMyxpbW0xMnMzICovCi0gIHsgU0hPUlRfRDJCLCAwLCB7IElNTTZVLCBSYyB9IH0sCQkvKiBpbW02dSxSYyAqLwotICB7IFNIT1JUX0QyQiwgMiwgeyBJTU02VSwgSU1NMTJTM1UgfSB9LAkvKiBpbW02dSxpbW0xMnMzdSAqLwotICB7IFNIT1JUX1UsIDAsIHsgUmEsIFJiIH0gfSwJCQkvKiBSYSxSYiAqLwotICB7IFNIT1JUX1UsIDIsIHsgUmEsIElNTTEyUzMgfSB9LAkJLyogUmEsaW1tMTIgKHJlcGVhdCkgKi8KLSAgeyBTSE9SVF9GLCAwLCB7IEZhLCBGYiwgRmMgfSB9LAkJLyogRmEsRmIsRmMgIChvcmZnLCB4b3JmZykgKi8KLSAgeyBTSE9SVF9GLCAyLCB7IEZhLCBGYiwgSU1NNiB9IH0sCQkvKiBGYSxGYixpbW02ICovCi0gIHsgU0hPUlRfQUYsIDAsIHsgRmEsIFJiLCBSYyB9IH0sCQkvKiBGYSxSYixSYyAqLwotICB7IFNIT1JUX0FGLCAyLCB7IEZhLCBSYiwgSU1NNiB9IH0sCQkvKiBGYSxSYixpbW02ICovCi0gIHsgU0hPUlRfVCwgMiwgeyBJTU01IH0gfSwJCQkvKiBpbW01czMgICAodHJhcCkgKi8KLSAgeyBTSE9SVF9BNSwgMCwgeyBSYSwgUmIsIFJjIH0gfSwJCS8qIFJhLFJiLFJjICovCi0gIHsgU0hPUlRfQTUsIDIsIHsgUmEsIFJiLCBJTU01IH0gfSwJCS8qIFJhLFJiLGltbTUgICAgKHNhdCopICovCi0gIHsgU0hPUlRfQ01QLCAwLCB7IENDLCBGYTIsIFJiLCBSY30gfSwJCS8qIENDICBGYTIsUmIsUmMgKi8KLSAgeyBTSE9SVF9DTVAsIDIsIHsgQ0MsIEZhMiwgUmIsIElNTTZ9IH0sCS8qIENDICBGYTIsUmIsaW1tNiAqLwotICB7IFNIT1JUX0NNUFUsIDAsIHsgQ0MsIEZhMiwgUmIsIFJjfSB9LAkvKiBDQyAgRmEyLFJiLFJjICovCi0gIHsgU0hPUlRfQ01QVSwgMiwgeyBDQywgRmEyLCBSYiwgSU1NNlUyfSB9LAkvKiBDQyAgRmEyLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9BMSwgMSwgeyBSYSwgUmIsIFJjIH0gfSwJCS8qIFJhLFJiLFJjIGZvciBNQUMgd2hlcmUgYT0xICovCi0gIHsgU0hPUlRfQTEsIDMsIHsgUmEsIFJiLCBJTU02IH0gfSwJCS8qIFJhLFJiLGltbTYgZm9yIE1BQyB3aGVyZSBhPTEgKi8KLSAgeyBTSE9SVF9BQSwgMCwgeyBBYSwgUmIsIFJjIH0gfSwJCS8qIEFhLFJiLFJjICovCi0gIHsgU0hPUlRfQUEsIDIsIHsgQWEsIFJiLCBJTU02IH0gfSwJCS8qIEFhLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9SQSwgMCwgeyBSYSwgQWIsIFJjIH0gfSwJCS8qIFJhLEFiLFJjICovCi0gIHsgU0hPUlRfUkEsIDIsIHsgUmEsIEFiLCBJTU02VTIgfSB9LAkJLyogUmEsQWIsaW1tNnUgKi8KLSAgeyBTSE9SVF9NT0RJTkMsIDEsIHsgUmIsIElNTTUgfSB9LAkJLyogUmIsaW1tNSAobW9kaW5jKSAqLwotICB7IFNIT1JUX01PRERFQywgMywgeyBSYiwgSU1NNSB9IH0sCQkvKiBSYixpbW01IChtb2RkZWMpICovCi0gIHsgU0hPUlRfQzEsIDAsIHsgUmEsIENiLCBGYWtlIH0gfSwJCS8qIFJhLENiIChtdmZzeXMpICovCi0gIHsgU0hPUlRfQzIsIDAsIHsgQ2EsIFJiLCBGYWtlIH0gfSwJCS8qIENhLFJiIChtdnRzeXMpICovCi0gIHsgU0hPUlRfVUYsIDAsIHsgRmEsIEZiIH0gfSwJCQkvKiBGYSxGYiAgKG5vdGZnKSAqLwotICB7IFNIT1JUX0EyLCAwLCB7IFJhMiwgUmIsIFJjIH0gfSwJCS8qIFJhMixSYixSYyAqLwotICB7IFNIT1JUX0EyLCAyLCB7IFJhMiwgUmIsIElNTTYgfSB9LAkJLyogUmEyLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9BNVMsIDAsIHsgUmEsIFJiLCBSYyB9IH0sCQkvKiBSYSxSYixSYyAqLwotICB7IFNIT1JUX0E1UywgMiwgeyBSYSwgUmIsIElNTTVVIH0gfSwJCS8qIFJhLFJiLGltbTV1ICAgKHNoaWZ0cykgKi8KLSAgeyBTSE9SVF9OT05FLCAwLCB7IDAgfSB9LAkJCS8qIG5vIG9wZXJhbmRzIChub3AsIHJlaXQpICovCi0gIHsgTE9ORywgMiwgeyBSYSwgUmIsIElNTTMyIH0gfSwJCS8qIFJhLFJiLGltbTMyICovCi0gIHsgTE9OR19VLCAyLCB7IElNTTMyIH0gfSwJCQkvKiBpbW0zMiAqLwotICB7IExPTkdfQUYsIDIsIHsgRmEsIFJiLCBJTU0zMiB9IH0sCQkvKiBGYSxSYixpbW0zMiAqLwotICB7IExPTkdfQ01QLCAyLCB7IENDLCBGYTIsIFJiLCBJTU0zMn0gfSwJLyogQ0MgIEZhMixSYixpbW0zMiAqLwotICB7IExPTkdfTSwgMiwgeyBSYSwgQVRQQVIsIFJiLCBJTU0zMiB9IH0sCS8qIFJhLEAoUmIsaW1tMzIpICovCi0gIHsgTE9OR19NMiwgMiwgeyBSYTIsIEFUUEFSLCBSYiwgSU1NMzIgfSB9LAkvKiBSYSxAKFJiLGltbTMyKSAqLwotICB7IExPTkdfMiwgMiwgeyBSYTMsIElNTTMyIH0gfSwJCS8qIFJhLGltbTMyICovCi0gIHsgTE9OR18yYiwgMywgeyBSYTMsIElNTTMyIH0gfSwJCS8qIFJhLGltbTMyICovCi0gIHsgTE9OR19ELCAyLCB7IElNTTZTMywgSU1NMzIgfSB9LAkJLyogaW1tNnMzLGltbTMyICovCi0gIHsgTE9OR19EYiwgMiwgeyBJTU02VSwgSU1NMzIgfSB9LAkJLyogaW1tNixpbW0zMiAqLwotICB7IFNIT1JUX0FSLCAwLCB7IEFhLCBSYiwgUmMgfSB9LAkJLyogQWEsUmIsUmMgKi8KLSAgeyAwLCAwLCB7IDAgfSB9LAotfTsKLQotY29uc3QgY2hhciAqZDMwdl9lY2NfbmFtZXNbXSA9Ci17Ci0gICJhbCIsCi0gICJ0eCIsCi0gICJmeCIsCi0gICJ4dCIsCi0gICJ4ZiIsCi0gICJ0dCIsCi0gICJ0ZiIsCi0gICJyZXMiCi19OwotCi1jb25zdCBjaGFyICpkMzB2X2NjX25hbWVzW10gPQotewotICAiZXEiLAotICAibmUiLAotICAiZ3QiLAotICAiZ2UiLAotICAibHQiLAotICAibGUiLAotICAicHMiLAotICAibmciLAotICBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kZXAtaW4uc2VkIGIvb3Bjb2Rlcy9kZXAtaW4uc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzBkZWU1Ni4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2RlcC1pbi5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi06bG9vcAotL1xcJC9OCi1zL1xcXG4gKi8gL2cKLXQgbG9vcAotCi1zIVwubzohLmxvOiEKLXMhIEBCRkRfSEAhICQoQkZEX0gpIWcKLXMhQElOQ0RJUkAhJChJTkNESVIpIWcKLXMhQEJGRERJUkAhJChCRkRESVIpIWcKLXMhQFNSQ0RJUkAvISFnCi0KLXMvXFxcbiAqLyAvZwotCi1zLyAqJC8vCi1zLyAgKi8gL2cKLXMvICo6LzovZwotLzokL2QKLQotcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKLSAgL2cKZGlmZiAtLWdpdCBhL29wY29kZXMvZGlzLWJ1Zi5jIGIvb3Bjb2Rlcy9kaXMtYnVmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyM2ZlNzIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kaXMtYnVmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgZnJvbSBhIGJ1ZmZlciwgZm9yIEdOVS4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBHZXQgTEVOR1RIIGJ5dGVzIGZyb20gaW5mbydzIGJ1ZmZlciwgYXQgdGFyZ2V0IGFkZHJlc3MgbWVtYWRkci4KLSAgIFRyYW5zZmVyIHRoZW0gdG8gbXlhZGRyLiAgKi8KLWludAotYnVmZmVyX3JlYWRfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbmd0aCwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBiZmRfYnl0ZSAqbXlhZGRyOwotICAgICBpbnQgbGVuZ3RoOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKG1lbWFkZHIgPCBpbmZvLT5idWZmZXJfdm1hCi0gICAgICB8fCBtZW1hZGRyIC0gaW5mby0+YnVmZmVyX3ZtYSArIGxlbmd0aCA+IGluZm8tPmJ1ZmZlcl9sZW5ndGgpCi0gICAgLyogT3V0IG9mIGJvdW5kcy4gIFVzZSBFSU8gYmVjYXVzZSBHREIgdXNlcyBpdC4gICovCi0gICAgcmV0dXJuIEVJTzsKLSAgbWVtY3B5IChteWFkZHIsIGluZm8tPmJ1ZmZlciArIChtZW1hZGRyIC0gaW5mby0+YnVmZmVyX3ZtYSksIGxlbmd0aCk7Ci0gIHJldHVybiAwOwotfQotCi0vKiBQcmludCBhbiBlcnJvciBtZXNzYWdlLiAgV2UgY2FuIGFzc3VtZSB0aGF0IHRoaXMgaXMgaW4gcmVzcG9uc2UgdG8KLSAgIGFuIGVycm9yIHJldHVybiBmcm9tIGJ1ZmZlcl9yZWFkX21lbW9yeS4gICovCi12b2lkCi1wZXJyb3JfbWVtb3J5IChzdGF0dXMsIG1lbWFkZHIsIGluZm8pCi0gICAgIGludCBzdGF0dXM7Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGlmIChzdGF0dXMgIT0gRUlPKQotICAgIC8qIENhbid0IGhhcHBlbi4gICovCi0gICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sIF8oIlVua25vd24gZXJyb3IgJWRcbiIpLCBzdGF0dXMpOwotICBlbHNlCi0gICAgLyogQWN0dWFsbHksIGFkZHJlc3MgYmV0d2VlbiBtZW1hZGRyIGFuZCBtZW1hZGRyICsgbGVuIHdhcwotICAgICAgIG91dCBvZiBib3VuZHMuICAqLwotICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLAotCQkJXygiQWRkcmVzcyAweCV4IGlzIG91dCBvZiBib3VuZHMuXG4iKSwgbWVtYWRkcik7Ci19Ci0KLS8qIFRoaXMgY291bGQgYmUgaW4gYSBzZXBhcmF0ZSBmaWxlLCB0byBzYXZlIG1pbmlzY3VsZSBhbW91bnRzIG9mIHNwYWNlCi0gICBpbiBzdGF0aWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcy4gICovCi0KLS8qIEp1c3QgcHJpbnQgdGhlIGFkZHJlc3MgaXMgaGV4LiAgVGhpcyBpcyBpbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzIGV2ZW4KLSAgIHRob3VnaCBib3RoIEdEQiBhbmQgb2JqZHVtcCBwcm92aWRlIHRoZWlyIG93biAodG8gcHJpbnQgc3ltYm9saWMKLSAgIGFkZHJlc3NlcykuICAqLwotCi12b2lkCi1nZW5lcmljX3ByaW50X2FkZHJlc3MgKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGNoYXIgYnVmWzMwXTsKLQotICBzcHJpbnRmX3ZtYSAoYnVmLCBhZGRyKTsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVzIiwgYnVmKTsKLX0KLQotLyogSnVzdCBjb25jYXRlbmF0ZSB0aGUgYWRkcmVzcyBhcyBoZXguICBUaGlzIGlzIGluY2x1ZGVkIGZvcgotICAgY29tcGxldGVuZXNzIGV2ZW4gdGhvdWdoIGJvdGggR0RCIGFuZCBvYmpkdW1wIHByb3ZpZGUgdGhlaXIgb3duICh0bwotICAgcHJpbnQgc3ltYm9saWMgYWRkcmVzc2VzKS4gICovCi0KLXZvaWQKLWdlbmVyaWNfc3RyY2F0X2FkZHJlc3MgKGFkZHIsIGJ1ZiwgbGVuKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGxlbjsKLXsKLSAgaWYgKGJ1ZiAhPSAoY2hhciAqKU5VTEwgJiYgbGVuID4gMCkKLSAgICB7Ci0gICAgICBjaGFyIHRtcEJ1ZlszMF07Ci0KLSAgICAgIHNwcmludGZfdm1hICh0bXBCdWYsIGFkZHIpOwotICAgICAgaWYgKChzdHJsZW4gKGJ1ZikgKyBzdHJsZW4gKHRtcEJ1ZikpIDw9ICh1bnNpZ25lZCBpbnQpIGxlbikKLQlzdHJjYXQgKGJ1ZiwgdG1wQnVmKTsKLSAgICAgIGVsc2UKLQlzdHJuY2F0IChidWYsIHRtcEJ1ZiwgKGxlbiAtIHN0cmxlbihidWYpKSk7Ci0gICAgfQotICByZXR1cm47Ci19Ci0KLS8qIEp1c3QgcmV0dXJuIHRoZSBnaXZlbiBhZGRyZXNzLiAgKi8KLQotaW50Ci1nZW5lcmljX3N5bWJvbF9hdF9hZGRyZXNzIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHIgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2Rpc2Fzc2VtYmxlLmMgYi9vcGNvZGVzL2Rpc2Fzc2VtYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OTQ3ZjAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kaXNhc3NlbWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qIFNlbGVjdCBkaXNhc3NlbWJseSByb3V0aW5lIGZvciBzcGVjaWZpZWQgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLSNpZmRlZiBBUkNIX2FsbAotI2RlZmluZSBBUkNIX2EyOWsKLSNkZWZpbmUgQVJDSF9hbHBoYQotI2RlZmluZSBBUkNIX2FyYwotI2RlZmluZSBBUkNIX2FybQotI2RlZmluZSBBUkNIX2QxMHYKLSNkZWZpbmUgQVJDSF9kMzB2Ci0jZGVmaW5lIEFSQ0hfaDgzMDAKLSNkZWZpbmUgQVJDSF9oODUwMAotI2RlZmluZSBBUkNIX2hwcGEKLSNkZWZpbmUgQVJDSF9pMzg2Ci0jZGVmaW5lIEFSQ0hfaTk2MAotI2RlZmluZSBBUkNIX2ZyMzAKLSNkZWZpbmUgQVJDSF9tMzJyCi0jZGVmaW5lIEFSQ0hfbTY4awotI2RlZmluZSBBUkNIX204OGsKLSNkZWZpbmUgQVJDSF9tY29yZQotI2RlZmluZSBBUkNIX21pcHMKLSNkZWZpbmUgQVJDSF9tbjEwMjAwCi0jZGVmaW5lIEFSQ0hfbW4xMDMwMAotI2RlZmluZSBBUkNIX25zMzJrCi0jZGVmaW5lIEFSQ0hfcGoKLSNkZWZpbmUgQVJDSF9wb3dlcnBjCi0jZGVmaW5lIEFSQ0hfcnM2MDAwCi0jZGVmaW5lIEFSQ0hfc2gKLSNkZWZpbmUgQVJDSF9zcGFyYwotI2RlZmluZSBBUkNIX3RpYzMwCi0jZGVmaW5lIEFSQ0hfdGljODAKLSNkZWZpbmUgQVJDSF92ODUwCi0jZGVmaW5lIEFSQ0hfdmF4Ci0jZGVmaW5lIEFSQ0hfdzY1Ci0jZGVmaW5lIEFSQ0hfejhrCi0jZW5kaWYKLQotCi1kaXNhc3NlbWJsZXJfZnR5cGUKLWRpc2Fzc2VtYmxlciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYSA9IGJmZF9nZXRfYXJjaCAoYWJmZCk7Ci0gIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZTsKLQotICBzd2l0Y2ggKGEpCi0gICAgewotICAgICAgLyogSWYgeW91IGFkZCBhIGNhc2UgdG8gdGhpcyB0YWJsZSwgYWxzbyBhZGQgaXQgdG8gdGhlCi0JIEFSQ0hfYWxsIGRlZmluaXRpb24gcmlnaHQgYWJvdmUgdGhpcyBmdW5jdGlvbi4gICovCi0jaWZkZWYgQVJDSF9hMjlrCi0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgLyogQXMgZmFyIGFzIEkga25vdyB3ZSBvbmx5IGhhbmRsZSBiaWctZW5kaWFuIDI5ayBvYmplY3RzLiAgKi8KLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9iaWdfYTI5azsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9hbHBoYQotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYWxwaGE7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfYXJjCi0gICAgY2FzZSBiZmRfYXJjaF9hcmM6Ci0gICAgICB7Ci0JZGlzYXNzZW1ibGUgPSBhcmNfZ2V0X2Rpc2Fzc2VtYmxlciAoYmZkX2dldF9tYWNoIChhYmZkKSwKLQkJCQkJICAgIGJmZF9iaWdfZW5kaWFuIChhYmZkKSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2FybQotICAgIGNhc2UgYmZkX2FyY2hfYXJtOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYmlnX2FybTsKLSAgICAgIGVsc2UKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbGl0dGxlX2FybTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9kMTB2Ci0gICAgY2FzZSBiZmRfYXJjaF9kMTB2OgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2QxMHY7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfZDMwdgotICAgIGNhc2UgYmZkX2FyY2hfZDMwdjoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9kMzB2OwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2g4MzAwCi0gICAgY2FzZSBiZmRfYXJjaF9oODMwMDoKLSAgICAgIGlmIChiZmRfZ2V0X21hY2goYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBoKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9oODMwMGg7Ci0gICAgICBlbHNlIGlmIChiZmRfZ2V0X21hY2goYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9oODMwMHM7Ci0gICAgICBlbHNlIAotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9oODMwMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9oODUwMAotICAgIGNhc2UgYmZkX2FyY2hfaDg1MDA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDg1MDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfaHBwYQotICAgIGNhc2UgYmZkX2FyY2hfaHBwYToKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9ocHBhOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2kzODYKLSAgICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgICBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4KQotICAgICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faTM4Nl9pbnRlbDsKLSAgICAgIGVsc2UKLSAgICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2kzODZfYXR0OwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2k5NjAKLSAgICBjYXNlIGJmZF9hcmNoX2k5NjA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faTk2MDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9mcjMwCi0gICAgY2FzZSBiZmRfYXJjaF9mcjMwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2ZyMzA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbTMycgotICAgIGNhc2UgYmZkX2FyY2hfbTMycjoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tMzJyOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX202OGsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbTY4azsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tODhrCi0gICAgY2FzZSBiZmRfYXJjaF9tODhrOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX204OGs7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbnMzMmsKLSAgICBjYXNlIGJmZF9hcmNoX25zMzJrOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX25zMzJrOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX21jb3JlCi0gICAgY2FzZSBiZmRfYXJjaF9tY29yZToKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tY29yZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9taXBzCi0gICAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYmlnX21pcHM7Ci0gICAgICBlbHNlCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2xpdHRsZV9taXBzOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX21uMTAyMDAKLSAgICBjYXNlIGJmZF9hcmNoX21uMTAyMDA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbW4xMDIwMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tbjEwMzAwCi0gICAgY2FzZSBiZmRfYXJjaF9tbjEwMzAwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX21uMTAzMDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfcGoKLSAgICBjYXNlIGJmZF9hcmNoX3BqOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3BqOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3Bvd2VycGMKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9iaWdfcG93ZXJwYzsKLSAgICAgIGVsc2UKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbGl0dGxlX3Bvd2VycGM7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfcnM2MDAwCi0gICAgY2FzZSBiZmRfYXJjaF9yczYwMDA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fcnM2MDAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3NoCi0gICAgY2FzZSBiZmRfYXJjaF9zaDoKLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3NoOwotICAgICAgZWxzZQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9zaGw7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfc3BhcmMKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3NwYXJjOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3RpYzMwCi0gICAgY2FzZSBiZmRfYXJjaF90aWMzMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl90aWMzMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF90aWM4MAotICAgIGNhc2UgYmZkX2FyY2hfdGljODA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fdGljODA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfdjg1MAotICAgIGNhc2UgYmZkX2FyY2hfdjg1MDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl92ODUwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3c2NQotICAgIGNhc2UgYmZkX2FyY2hfdzY1OgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3c2NTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF96OGsKLSAgICBjYXNlIGJmZF9hcmNoX3o4azoKLSAgICAgIGlmIChiZmRfZ2V0X21hY2goYWJmZCkgPT0gYmZkX21hY2hfejgwMDEpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3o4MDAxOwotICAgICAgZWxzZSAKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fejgwMDI7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfdmF4Ci0gICAgY2FzZSBiZmRfYXJjaF92YXg6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fdmF4OwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gZGlzYXNzZW1ibGU7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtYXNtLmMgYi9vcGNvZGVzL2ZyMzAtYXNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMzhkYmIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9mcjMwLWFzbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcxICswLDAgQEAKLS8qIEFzc2VtYmxlciBpbnRlcmZhY2UgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTi4gLSotIEMgLSotCi0gICBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0tIHRoZSByZXN1bHRhbnQgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCwgY2dlbi1hc20uaW4gaXNuJ3QKLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgotICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAiZnIzMC1kZXNjLmgiCi0jaW5jbHVkZSAiZnIzMC1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI3VuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI3VuZGVmIG1heAotI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotCi1zdGF0aWMgY29uc3QgY2hhciAqIHBhcnNlX2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLCBjb25zdCBjaGFyICoqLCBDR0VOX0ZJRUxEUyAqKSk7Ci0MCi0vKiAtLSBhc3NlbWJsZXIgcm91dGluZXMgaW5zZXJ0ZWQgaGVyZSAqLwotCi0vKiAtLSBhc20uYyAqLwotLyogSGFuZGxlIHJlZ2lzdGVyIGxpc3RzIGZvciBMRE14IGFuZCBTVE14ICAqLwotCi1zdGF0aWMgaW50Ci1wYXJzZV9yZWdpc3Rlcl9udW1iZXIgKHN0cnApCi0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotewotICBpbnQgcmVnbm87Ci0gIGlmICgqKnN0cnAgPCAnMCcgfHwgKipzdHJwID4gJzknKQotICAgIHJldHVybiAtMTsgLyogZXJyb3IgKi8KLSAgcmVnbm8gPSAqKnN0cnAgLSAnMCc7Ci0gICsrKnN0cnA7Ci0KLSAgaWYgKCoqc3RycCA+PSAnMCcgJiYgKipzdHJwIDw9ICc5JykKLSAgICB7Ci0gICAgICByZWdubyA9IHJlZ25vICogMTAgKyAoKipzdHJwIC0gJzAnKTsKLSAgICAgICsrKnN0cnA7Ci0gICAgfQotCi0gIHJldHVybiByZWdubzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfcmVnaXN0ZXJfbGlzdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgaGlnaF9sb3csIGxvYWRfc3RvcmUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotICAgICBpbnQgaGlnaF9sb3c7ICAgLyogMCA9PSBoaWdoLCAxID09IGxvdyAqLwotICAgICBpbnQgbG9hZF9zdG9yZTsgLyogMCA9PSBsb2FkLCAxID09IHN0b3JlICovCi17Ci0gIGludCByZWdubzsKLSAgKnZhbHVlcCA9IDA7Ci0gIHdoaWxlICgqKnN0cnAgJiYgKipzdHJwICE9ICcpJykKLSAgICB7Ci0gICAgICBpZiAoKipzdHJwICE9ICdSJyAmJiAqKnN0cnAgIT0gJ3InKQotCWJyZWFrOwotICAgICAgKysqc3RycDsKLQotICAgICAgcmVnbm8gPSBwYXJzZV9yZWdpc3Rlcl9udW1iZXIgKHN0cnApOwotICAgICAgaWYgKHJlZ25vID09IC0xKQotCXJldHVybiAiUmVnaXN0ZXIgbnVtYmVyIGlzIG5vdCB2YWxpZCI7Ci0gICAgICBpZiAocmVnbm8gPiA3ICYmICFoaWdoX2xvdykKLQlyZXR1cm4gIlJlZ2lzdGVyIG11c3QgYmUgYmV0d2VlbiByMCBhbmQgcjciOwotICAgICAgaWYgKHJlZ25vIDwgOCAmJiBoaWdoX2xvdykKLQlyZXR1cm4gIlJlZ2lzdGVyIG11c3QgYmUgYmV0d2VlbiByOCBhbmQgcjE1IjsKLQotICAgICAgaWYgKGhpZ2hfbG93KQotCXJlZ25vIC09IDg7Ci0KLSAgICAgIGlmIChsb2FkX3N0b3JlKSAvKiBtYXNrIGlzIHJldmVyc2VkIGZvciBzdG9yZSAqLwotCSp2YWx1ZXAgfD0gMHg4MCA+PiByZWdubzsKLSAgICAgIGVsc2UKLQkqdmFsdWVwIHw9IDEgPDwgcmVnbm87Ci0KLSAgICAgIGlmICgqKnN0cnAgPT0gJywnKQotCXsKLQkgIGlmICgqKCpzdHJwICsgMSkgPT0gJyknKQotCSAgICBicmVhazsKLQkgICsrKnN0cnA7Ci0JfQotICAgIH0KLQotICBpZiAoISpzdHJwIHx8ICoqc3RycCAhPSAnKScpCi0gICAgcmV0dXJuICJSZWdpc3RlciBsaXN0IGlzIG5vdCB2YWxpZCI7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2xvd19yZWdpc3Rlcl9saXN0X2xkIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgcmV0dXJuIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDAvKmxvdyovLCAwLypsb2FkKi8pOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9oaV9yZWdpc3Rlcl9saXN0X2xkIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgcmV0dXJuIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDEvKmhpZ2gqLywgMC8qbG9hZCovKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfbG93X3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotewotICByZXR1cm4gcGFyc2VfcmVnaXN0ZXJfbGlzdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMC8qbG93Ki8sIDEvKnN0b3JlKi8pOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9oaV9yZWdpc3Rlcl9saXN0X3N0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgcmV0dXJuIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDEvKmhpZ2gqLywgMS8qc3RvcmUqLyk7Ci19Ci0KLS8qIC0tICovCi0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIG9wZXJhbmQgcGFyc2luZy4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwYXJzZV9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHBhcnNlX2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLgotKi8KLQotY29uc3QgY2hhciAqCi1mcjMwX2NnZW5fcGFyc2Vfb3BlcmFuZCAoY2QsIG9waW5kZXgsIHN0cnAsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGNvbnN0IGNoYXIgKiogc3RycDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci17Ci0gIGNvbnN0IGNoYXIgKiBlcnJtc2cgPSBOVUxMOwotICAvKiBVc2VkIGJ5IHNjYWxhciBvcGVyYW5kcyB0aGF0IHN0aWxsIG5lZWQgdG8gYmUgcGFyc2VkLiAgKi8KLSAgbG9uZyBqdW5rOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzLCAmIGZpZWxkcy0+Zl9DUmkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzLCAmIGZpZWxkcy0+Zl9DUmopOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2hfcjEzLCAmIGp1bmspOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2hfcjE0LCAmIGp1bmspOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2hfcjE1LCAmIGp1bmspOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX1JpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfUmljKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9Saik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX1JqYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXMsICYgZmllbGRzLT5mX1JzMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXMsICYgZmllbGRzLT5mX1JzMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfQ0MsICZmaWVsZHMtPmZfY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9DQ0MsICZmaWVsZHMtPmZfY2NjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVIxMCwgJmZpZWxkcy0+Zl9kaXIxMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVI4LCAmZmllbGRzLT5mX2RpcjgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElSOSwgJmZpZWxkcy0+Zl9kaXI5KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJU1AxMCwgJmZpZWxkcy0+Zl9kaXNwMTApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVNQOCwgJmZpZWxkcy0+Zl9kaXNwOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJU1A5LCAmZmllbGRzLT5mX2Rpc3A5KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfSTIwLCAmZmllbGRzLT5mX2kyMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0kzMiwgJmZpZWxkcy0+Zl9pMzIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0k4LCAmZmllbGRzLT5mX2k4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfTEFCRUwxMiwgMCwgTlVMTCwgICYgdmFsdWUpOwotICAgICAgICBmaWVsZHMtPmZfcmVsMTIgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICB7Ci0gICAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9MQUJFTDksIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX3JlbDkgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfTTQsICZmaWVsZHMtPmZfbTQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfaF9wcywgJiBqdW5rKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgZXJybXNnID0gcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xELCAmZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV9oaV9yZWdpc3Rlcl9saXN0X3N0IChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QsICZmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV9sb3dfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCwgJmZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV9sb3dfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCwgJmZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9TMTAsICZmaWVsZHMtPmZfczEwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVTEwLCAmZmllbGRzLT5mX3UxMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVTQsICZmaWVsZHMtPmZfdTQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9VNEMsICZmaWVsZHMtPmZfdTRjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9VOCwgJmZpZWxkcy0+Zl91OCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1VESVNQNiwgJmZpZWxkcy0+Zl91ZGlzcDYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBwYXJzaW5nLlxuIiksIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gZXJybXNnOwotfQotCi1jZ2VuX3BhcnNlX2ZuICogY29uc3QgZnIzMF9jZ2VuX3BhcnNlX2hhbmRsZXJzW10gPSAKLXsKLSAgcGFyc2VfaW5zbl9ub3JtYWwsCi19OwotCi12b2lkCi1mcjMwX2NnZW5faW5pdF9hc20gKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBmcjMwX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKTsKLSAgZnIzMF9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpOwotICBjZC0+cGFyc2VfaGFuZGxlcnMgPSAmIGZyMzBfY2dlbl9wYXJzZV9oYW5kbGVyc1swXTsKLSAgY2QtPnBhcnNlX29wZXJhbmQgPSBmcjMwX2NnZW5fcGFyc2Vfb3BlcmFuZDsKLX0KLQotDAotLyogRGVmYXVsdCBpbnNuIHBhcnNlci4KLQotICAgVGhlIHN5bnRheCBzdHJpbmcgaXMgc2Nhbm5lZCBhbmQgb3BlcmFuZHMgYXJlIHBhcnNlZCBhbmQgc3RvcmVkIGluIEZJRUxEUy4KLSAgIFJlbG9jcyBhcmUgcXVldWVkIGFzIHdlIGdvIHZpYSBvdGhlciBjYWxsYmFja3MuCi0KLSAgID8/PyBOb3RlIHRoYXQgdGhpcyBpcyBjdXJyZW50bHkgYW4gYWxsLW9yLW5vdGhpbmcgcGFyc2VyLiAgSWYgd2UgZmFpbCB0bwotICAgcGFyc2UgdGhlIGluc3RydWN0aW9uLCB3ZSByZXR1cm4gMCBhbmQgdGhlIGNhbGxlciB3aWxsIHN0YXJ0IG92ZXIgZnJvbQotICAgdGhlIGJlZ2lubmluZy4gIEJhY2t0cmFja2luZyB3aWxsIGJlIG5lY2Vzc2FyeSBpbiBwYXJzaW5nIHN1YmV4cHJlc3Npb25zLAotICAgYnV0IHRoYXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuICBOb3QgaGFuZGxpbmcgYmFja3RyYWNraW5nIGhlcmUgbWF5IGdldAotICAgZXhwZW5zaXZlIGluIHRoZSBjYXNlIG9mIHRoZSBtNjhrLiAgRGVhbCB3aXRoIGxhdGVyLgotCi0gICBSZXR1cm5zIE5VTEwgZm9yIHN1Y2Nlc3MsIGFuIGVycm9yIG1lc3NhZ2UgZm9yIGZhaWx1cmUuCi0qLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9pbnNuX25vcm1hbCAoY2QsIGluc24sIHN0cnAsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLXsKLSAgLyogPz8/IFJ1bnRpbWUgYWRkZWQgaW5zbnMgbm90IGhhbmRsZWQgeWV0LiAgKi8KLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBjb25zdCBjaGFyICpzdHIgPSAqc3RycDsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotICBjb25zdCBjaGFyICpwOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3luOwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgLyogRklYTUU6IHdpcCAqLwotICBpbnQgcGFzdF9vcGNvZGVfcDsKLSNlbmRpZgotCi0gIC8qIEZvciBub3cgd2UgYXNzdW1lIHRoZSBtbmVtb25pYyBpcyBmaXJzdCAodGhlcmUgYXJlIG5vIGxlYWRpbmcgb3BlcmFuZHMpLgotICAgICBXZSBjYW4gcGFyc2UgaXQgd2l0aG91dCBuZWVkaW5nIHRvIHNldCB1cCBvcGVyYW5kIHBhcnNpbmcuCi0gICAgIEdBUydzIGlucHV0IHNjcnViYmVyIHdpbGwgZW5zdXJlIG1uZW1vbmljcyBhcmUgbG93ZXJjYXNlLCBidXQgd2UgbWF5Ci0gICAgIG5vdCBiZSBjYWxsZWQgZnJvbSBHQVMuICAqLwotICBwID0gQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKTsKLSAgd2hpbGUgKCpwICYmIHRvbG93ZXIgKCpwKSA9PSB0b2xvd2VyICgqc3RyKSkKLSAgICArK3AsICsrc3RyOwotCi0gIGlmICgqIHApCi0gICAgcmV0dXJuIF8oInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOwotCi0jaWZuZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgaWYgKCogc3RyICYmICFpc3NwYWNlICgqIHN0cikpCi0gICAgcmV0dXJuIF8oInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOwotI2VuZGlmCi0KLSAgQ0dFTl9JTklUX1BBUlNFIChjZCk7Ci0gIGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kIChjZCk7Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotICBwYXN0X29wY29kZV9wID0gMDsKLSNlbmRpZgotCi0gIC8qIFdlIGRvbid0IGNoZWNrIGZvciAoKnN0ciAhPSAnXDAnKSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0byBwYXJzZQotICAgICBhbnkgdHJhaWxpbmcgZmFrZSBhcmd1bWVudHMgaW4gdGhlIHN5bnRheCBzdHJpbmcuICAqLwotICBzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7Ci0KLSAgLyogTW5lbW9uaWNzIGNvbWUgZmlyc3QgZm9yIG5vdywgZW5zdXJlIHZhbGlkIHN0cmluZy4gICovCi0gIGlmICghIENHRU5fU1lOVEFYX01ORU1PTklDX1AgKCogc3luKSkKLSAgICBhYm9ydCAoKTsKLQotICArK3N5bjsKLQotICB3aGlsZSAoKiBzeW4gIT0gMCkKLSAgICB7Ci0gICAgICAvKiBOb24gb3BlcmFuZCBjaGFycyBtdXN0IG1hdGNoIGV4YWN0bHkuICAqLwotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKiBzeW4pKQotCXsKLQkgIC8qIEZJWE1FOiBXaGlsZSB3ZSBhbGxvdyBmb3Igbm9uLUdBUyBjYWxsZXJzIGFib3ZlLCB3ZSBhc3N1bWUgdGhlCi0JICAgICBmaXJzdCBjaGFyIGFmdGVyIHRoZSBtbmVtb25pYyBwYXJ0IGlzIGEgc3BhY2UuICAqLwotCSAgLyogRklYTUU6IFdlIGFsc28gdGFrZSBpbmFwcHJvcHJpYXRlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0Ci0JICAgICBHQVMncyBpbnB1dCBzY3J1YmJlciB3aWxsIHJlbW92ZSBleHRyYW5lb3VzIGJsYW5rcy4gICovCi0JICBpZiAoKnN0ciA9PSBDR0VOX1NZTlRBWF9DSEFSICgqIHN5bikpCi0JICAgIHsKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0JICAgICAgaWYgKCogc3luID09ICcgJykKLQkJcGFzdF9vcGNvZGVfcCA9IDE7Ci0jZW5kaWYKLQkgICAgICArKyBzeW47Ci0JICAgICAgKysgc3RyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTeW50YXggY2hhciBkaWRuJ3QgbWF0Y2guICBDYW4ndCBiZSB0aGlzIGluc24uICAqLwotCSAgICAgIC8qIEZJWE1FOiB3b3VsZCBsaWtlIHRvIHJldHVybiBzb21ldGhpbmcgbGlrZQotCQkgImV4cGVjdGVkIGNoYXIgYGMnIiAqLwotCSAgICAgIHJldHVybiBfKCJzeW50YXggZXJyb3IiKTsKLQkgICAgfQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQgb2Ygc29tZSBzb3J0LiAgKi8KLSAgICAgIGVycm1zZyA9IGZyMzBfY2dlbl9wYXJzZV9vcGVyYW5kIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCQkgICZzdHIsIGZpZWxkcyk7Ci0gICAgICBpZiAoZXJybXNnKQotCXJldHVybiBlcnJtc2c7Ci0KLSAgICAgIC8qIERvbmUgd2l0aCB0aGlzIG9wZXJhbmQsIGNvbnRpbnVlIHdpdGggbmV4dCBvbmUuICAqLwotICAgICAgKysgc3luOwotICAgIH0KLQotICAvKiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzeW50YXggc3RyaW5nLCB3ZSdyZSBkb25lLiAgKi8KLSAgaWYgKCogc3luID09ICdcMCcpCi0gICAgewotICAgICAgLyogRklYTUU6IEZvciB0aGUgbW9tZW50IHdlIGFzc3VtZSBhIHZhbGlkIGBzdHInIGNhbiBvbmx5IGNvbnRhaW4KLQkgYmxhbmtzIG5vdy4gIElFOiBXZSBuZWVkbid0IHRyeSBhZ2FpbiB3aXRoIGEgbG9uZ2VyIHZlcnNpb24gb2YKLQkgdGhlIGluc24gYW5kIGl0IGlzIGFzc3VtZWQgdGhhdCBsb25nZXIgdmVyc2lvbnMgb2YgaW5zbnMgYXBwZWFyCi0JIGJlZm9yZSBzaG9ydGVyIG9uZXMgKGVnOiBsc3IgcjIscjMsMSB2cyBsc3IgcjIscjMpLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCi0JKysgc3RyOwotCi0gICAgICBpZiAoKiBzdHIgIT0gJ1wwJykKLQlyZXR1cm4gXygianVuayBhdCBlbmQgb2YgbGluZSIpOyAvKiBGSVhNRTogd291bGQgbGlrZSB0byBpbmNsdWRlIGBzdHInICovCi0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBjb3VsZG4ndCBwYXJzZSBpdC4gICovCi0gIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLX0KLQwKLS8qIE1haW4gZW50cnkgcG9pbnQuCi0gICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBlYWNoIGluc3RydWN0aW9uIHRvIGJlIGFzc2VtYmxlZC4KLSAgIFNUUiBwb2ludHMgdG8gdGhlIGluc24gdG8gYmUgYXNzZW1ibGVkLgotICAgV2UgYXNzdW1lIGFsbCBuZWNlc3NhcnkgdGFibGVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KLSAgIFRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24sIGxlc3MgYW55IGZpeHVwcywgaXMgc3RvcmVkIGluIEJVRi4KLSAgIFJlbWVtYmVyIHRoYXQgaWYgQ0dFTl9JTlRfSU5TTl9QIHRoZW4gQlVGIGlzIGFuIGludCBhbmQgdGh1cyB0aGUgdmFsdWUKLSAgIHN0aWxsIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byB0YXJnZXQgYnl0ZSBvcmRlciwgb3RoZXJ3aXNlIEJVRiBpcyBhbiBhcnJheQotICAgb2YgYnl0ZXMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuCi0gICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgaW5zbidzIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUsCi0gICBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VyZWQgKGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBoYXZlIGFscmVhZHkgYmVlbgotICAgcHJpbnRlZCkuCi0KLSAgIE5vdGUgdGhhdCB3aGVuIHByb2Nlc3NpbmcgKG5vbi1hbGlhcykgbWFjcm8taW5zbnMsCi0gICB0aGlzIGZ1bmN0aW9uIHJlY3Vyc2VzLgotCi0gICA/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+aW5zbl90YWJsZS5pbml0X2VudHJpZXMpOwotICBpZiAoY2QtPmh3X3RhYmxlLmVudHJpZXMpCi0gICAgZnJlZSAoKENHRU5fSFdfRU5UUlkgKikgY2QtPmh3X3RhYmxlLmVudHJpZXMpOwotICBmcmVlIChjZCk7Ci19Ci0KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1kZXNjLmggYi9vcGNvZGVzL2ZyMzAtZGVzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2UyOWNkLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1kZXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyogQ1BVIGRhdGEgaGVhZGVyIGZvciBmcjMwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIEZSMzBfQ1BVX0gKLSNkZWZpbmUgRlIzMF9DUFVfSAotCi0jZGVmaW5lIENHRU5fQVJDSCBmcjMwCi0KLS8qIEdpdmVuIHN5bWJvbCBTLCByZXR1cm4gZnIzMF9jZ2VuXzxTPi4gICovCi0jZGVmaW5lIENHRU5fU1lNKHMpIENPTkNBVDMgKGZyMzAsX2NnZW5fLHMpCi0KLS8qIFNlbGVjdGVkIGNwdSBmYW1pbGllcy4gICovCi0jZGVmaW5lIEhBVkVfQ1BVX0ZSMzBCRgotCi0jZGVmaW5lIENHRU5fSU5TTl9MU0IwX1AgMAotCi0vKiBNaW5pbXVtIHNpemUgb2YgYW55IGluc24gKGluIGJ5dGVzKS4gICovCi0jZGVmaW5lIENHRU5fTUlOX0lOU05fU0laRSAyCi0KLS8qIE1heGltdW0gc2l6ZSBvZiBhbnkgaW5zbiAoaW4gYnl0ZXMpLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSU5TTl9TSVpFIDYKLQotI2RlZmluZSBDR0VOX0lOVF9JTlNOX1AgMAotCi0vKiBGSVhNRTogTmVlZCB0byBjb21wdXRlIENHRU5fTUFYX1NZTlRBWF9CWVRFUy4gICovCi0KLS8qIENHRU5fTU5FTU9OSUNfT1BFUkFORFMgaXMgZGVmaW5lZCBpZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcy4KLSAgIGUuZy4gSW4gImIsYSBmb28iIHRoZSAiLGEiIGlzIGFuIG9wZXJhbmQuICBJZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcwotICAgd2UgY2FuJ3QgaGFzaCBvbiBldmVyeXRoaW5nIHVwIHRvIHRoZSBzcGFjZS4gICovCi0jZGVmaW5lIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLQotLyogTWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgYW55IGluc24gb3IgbWFjcm8taW5zbiBoYXMuICAqLwotI2RlZmluZSBDR0VOX01BWF9JTlNOX09QRVJBTkRTIDE2Ci0KLS8qIE1heGltdW0gbnVtYmVyIG9mIGZpZWxkcyBpbiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lGTVRfT1BFUkFORFMgNwotCi0vKiBFbnVtcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3AxIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wMSB7Ci0gIE9QMV8wLCBPUDFfMSwgT1AxXzIsIE9QMV8zCi0gLCBPUDFfNCwgT1AxXzUsIE9QMV82LCBPUDFfNwotICwgT1AxXzgsIE9QMV85LCBPUDFfQSwgT1AxX0IKLSAsIE9QMV9DLCBPUDFfRCwgT1AxX0UsIE9QMV9GCi19IElOU05fT1AxOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wMiBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDIgewotICBPUDJfMCwgT1AyXzEsIE9QMl8yLCBPUDJfMwotICwgT1AyXzQsIE9QMl81LCBPUDJfNiwgT1AyXzcKLSAsIE9QMl84LCBPUDJfOSwgT1AyX0EsIE9QMl9CCi0gLCBPUDJfQywgT1AyX0QsIE9QMl9FLCBPUDJfRgotfSBJTlNOX09QMjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcDMgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3AzIHsKLSAgT1AzXzAsIE9QM18xLCBPUDNfMiwgT1AzXzMKLSAsIE9QM180LCBPUDNfNSwgT1AzXzYsIE9QM183Ci0gLCBPUDNfOCwgT1AzXzksIE9QM19BLCBPUDNfQgotICwgT1AzX0MsIE9QM19ELCBPUDNfRSwgT1AzX0YKLX0gSU5TTl9PUDM7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3A0IGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wNCB7Ci0gIE9QNF8wCi19IElOU05fT1A0OwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wNSBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDUgewotICBPUDVfMCwgT1A1XzEKLX0gSU5TTl9PUDU7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gY2MgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fY2MgewotICBDQ19SQSwgQ0NfTk8sIENDX0VRLCBDQ19ORQotICwgQ0NfQywgQ0NfTkMsIENDX04sIENDX1AKLSAsIENDX1YsIENDX05WLCBDQ19MVCwgQ0NfR0UKLSAsIENDX0xFLCBDQ19HVCwgQ0NfTFMsIENDX0hJCi19IElOU05fQ0M7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIC4gICovCi10eXBlZGVmIGVudW0gZ3JfbmFtZXMgewotICBIX0dSX1IwID0gMCwgSF9HUl9SMSA9IDEsIEhfR1JfUjIgPSAyLCBIX0dSX1IzID0gMwotICwgSF9HUl9SNCA9IDQsIEhfR1JfUjUgPSA1LCBIX0dSX1I2ID0gNiwgSF9HUl9SNyA9IDcKLSAsIEhfR1JfUjggPSA4LCBIX0dSX1I5ID0gOSwgSF9HUl9SMTAgPSAxMCwgSF9HUl9SMTEgPSAxMQotICwgSF9HUl9SMTIgPSAxMiwgSF9HUl9SMTMgPSAxMywgSF9HUl9SMTQgPSAxNCwgSF9HUl9SMTUgPSAxNQotICwgSF9HUl9BQyA9IDEzLCBIX0dSX0ZQID0gMTQsIEhfR1JfU1AgPSAxNQotfSBHUl9OQU1FUzsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgLiAgKi8KLXR5cGVkZWYgZW51bSBjcl9uYW1lcyB7Ci0gIEhfQ1JfQ1IwLCBIX0NSX0NSMSwgSF9DUl9DUjIsIEhfQ1JfQ1IzCi0gLCBIX0NSX0NSNCwgSF9DUl9DUjUsIEhfQ1JfQ1I2LCBIX0NSX0NSNwotICwgSF9DUl9DUjgsIEhfQ1JfQ1I5LCBIX0NSX0NSMTAsIEhfQ1JfQ1IxMQotICwgSF9DUl9DUjEyLCBIX0NSX0NSMTMsIEhfQ1JfQ1IxNCwgSF9DUl9DUjE1Ci19IENSX05BTUVTOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwotdHlwZWRlZiBlbnVtIGRyX25hbWVzIHsKLSAgSF9EUl9UQlIsIEhfRFJfUlAsIEhfRFJfU1NQLCBIX0RSX1VTUAotICwgSF9EUl9NREgsIEhfRFJfTURMCi19IERSX05BTUVTOwotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbWFjaGluZSB0eXBlIHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gbWFjaF9hdHRyIHsKLSAgTUFDSF9CQVNFLCBNQUNIX0ZSMzAsIE1BQ0hfTUFYCi19IE1BQ0hfQVRUUjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zdHJ1Y3Rpb24gc2V0IHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gaXNhX2F0dHIgewotICBJU0FfRlIzMCwgSVNBX01BWAotfSBJU0FfQVRUUjsKLQotLyogTnVtYmVyIG9mIGFyY2hpdGVjdHVyZSB2YXJpYW50cy4gICovCi0jZGVmaW5lIE1BWF9JU0FTICAxCi0jZGVmaW5lIE1BWF9NQUNIUyAoKGludCkgTUFDSF9NQVgpCi0KLS8qIElmaWVsZCBzdXBwb3J0LiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBjZ2VuX2lmbGQgZnIzMF9jZ2VuX2lmbGRfdGFibGVbXTsKLQotLyogSWZpZWxkIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pZmxkIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2lmbGRfYXR0ciB7Ci0gIENHRU5fSUZMRF9WSVJUVUFMLCBDR0VOX0lGTERfUENSRUxfQUREUiwgQ0dFTl9JRkxEX0FCU19BRERSLCBDR0VOX0lGTERfUkVTRVJWRUQKLSAsIENHRU5fSUZMRF9TSUdOX09QVCwgQ0dFTl9JRkxEX1NJR05FRCwgQ0dFTl9JRkxEX0VORF9CT09MUywgQ0dFTl9JRkxEX1NUQVJUX05CT09MUyA9IDMxCi0gLCBDR0VOX0lGTERfTUFDSCwgQ0dFTl9JRkxEX0VORF9OQk9PTFMKLX0gQ0dFTl9JRkxEX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2lmbGRfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSUZMRF9OQk9PTF9BVFRSUyAoQ0dFTl9JRkxEX0VORF9OQk9PTFMgLSBDR0VOX0lGTERfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgZnIzMCBpZmllbGQgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGlmaWVsZF90eXBlIHsKLSAgRlIzMF9GX05JTCwgRlIzMF9GX09QMSwgRlIzMF9GX09QMiwgRlIzMF9GX09QMwotICwgRlIzMF9GX09QNCwgRlIzMF9GX09QNSwgRlIzMF9GX0NDLCBGUjMwX0ZfQ0NDCi0gLCBGUjMwX0ZfUkosIEZSMzBfRl9SSSwgRlIzMF9GX1JTMSwgRlIzMF9GX1JTMgotICwgRlIzMF9GX1JKQywgRlIzMF9GX1JJQywgRlIzMF9GX0NSSiwgRlIzMF9GX0NSSQotICwgRlIzMF9GX1U0LCBGUjMwX0ZfVTRDLCBGUjMwX0ZfSTQsIEZSMzBfRl9NNAotICwgRlIzMF9GX1U4LCBGUjMwX0ZfSTgsIEZSMzBfRl9JMjBfNCwgRlIzMF9GX0kyMF8xNgotICwgRlIzMF9GX0kyMCwgRlIzMF9GX0kzMiwgRlIzMF9GX1VESVNQNiwgRlIzMF9GX0RJU1A4Ci0gLCBGUjMwX0ZfRElTUDksIEZSMzBfRl9ESVNQMTAsIEZSMzBfRl9TMTAsIEZSMzBfRl9VMTAKLSAsIEZSMzBfRl9SRUw5LCBGUjMwX0ZfRElSOCwgRlIzMF9GX0RJUjksIEZSMzBfRl9ESVIxMAotICwgRlIzMF9GX1JFTDEyLCBGUjMwX0ZfUkVHTElTVF9ISV9TVCwgRlIzMF9GX1JFR0xJU1RfTE9XX1NULCBGUjMwX0ZfUkVHTElTVF9ISV9MRAotICwgRlIzMF9GX1JFR0xJU1RfTE9XX0xELCBGUjMwX0ZfTUFYCi19IElGSUVMRF9UWVBFOwotCi0jZGVmaW5lIE1BWF9JRkxEICgoaW50KSBGUjMwX0ZfTUFYKQotCi0vKiBIYXJkd2FyZSBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faHcgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faHdfYXR0ciB7Ci0gIENHRU5fSFdfVklSVFVBTCwgQ0dFTl9IV19DQUNIRV9BRERSLCBDR0VOX0hXX1BDLCBDR0VOX0hXX1BST0ZJTEUKLSAsIENHRU5fSFdfRU5EX0JPT0xTLCBDR0VOX0hXX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0hXX01BQ0gsIENHRU5fSFdfRU5EX05CT09MUwotfSBDR0VOX0hXX0FUVFI7Ci0KLS8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2h3X2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0hXX05CT09MX0FUVFJTIChDR0VOX0hXX0VORF9OQk9PTFMgLSBDR0VOX0hXX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGZyMzAgaGFyZHdhcmUgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faHdfdHlwZSB7Ci0gIEhXX0hfTUVNT1JZLCBIV19IX1NJTlQsIEhXX0hfVUlOVCwgSFdfSF9BRERSCi0gLCBIV19IX0lBRERSLCBIV19IX1BDLCBIV19IX0dSLCBIV19IX0NSCi0gLCBIV19IX0RSLCBIV19IX1BTLCBIV19IX1IxMywgSFdfSF9SMTQKLSAsIEhXX0hfUjE1LCBIV19IX05CSVQsIEhXX0hfWkJJVCwgSFdfSF9WQklUCi0gLCBIV19IX0NCSVQsIEhXX0hfSUJJVCwgSFdfSF9TQklULCBIV19IX1RCSVQKLSAsIEhXX0hfRDBCSVQsIEhXX0hfRDFCSVQsIEhXX0hfQ0NSLCBIV19IX1NDUgotICwgSFdfSF9JTE0sIEhXX01BWAotfSBDR0VOX0hXX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX0hXICgoaW50KSBIV19NQVgpCi0KLS8qIE9wZXJhbmQgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX29wZXJhbmQgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5fb3BlcmFuZF9hdHRyIHsKLSAgQ0dFTl9PUEVSQU5EX1ZJUlRVQUwsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSLCBDR0VOX09QRVJBTkRfQUJTX0FERFIsIENHRU5fT1BFUkFORF9TSUdOX09QVAotICwgQ0dFTl9PUEVSQU5EX1NJR05FRCwgQ0dFTl9PUEVSQU5EX05FR0FUSVZFLCBDR0VOX09QRVJBTkRfUkVMQVgsIENHRU5fT1BFUkFORF9TRU1fT05MWQotICwgQ0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYLCBDR0VOX09QRVJBTkRfRU5EX0JPT0xTLCBDR0VOX09QRVJBTkRfU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fT1BFUkFORF9NQUNICi0gLCBDR0VOX09QRVJBTkRfRU5EX05CT09MUwotfSBDR0VOX09QRVJBTkRfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5fb3BlcmFuZF9hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTIChDR0VOX09QRVJBTkRfRU5EX05CT09MUyAtIENHRU5fT1BFUkFORF9TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBmcjMwIG9wZXJhbmQgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5fb3BlcmFuZF90eXBlIHsKLSAgRlIzMF9PUEVSQU5EX1BDLCBGUjMwX09QRVJBTkRfUkksIEZSMzBfT1BFUkFORF9SSiwgRlIzMF9PUEVSQU5EX1JJQwotICwgRlIzMF9PUEVSQU5EX1JKQywgRlIzMF9PUEVSQU5EX0NSSSwgRlIzMF9PUEVSQU5EX0NSSiwgRlIzMF9PUEVSQU5EX1JTMQotICwgRlIzMF9PUEVSQU5EX1JTMiwgRlIzMF9PUEVSQU5EX1IxMywgRlIzMF9PUEVSQU5EX1IxNCwgRlIzMF9PUEVSQU5EX1IxNQotICwgRlIzMF9PUEVSQU5EX1BTLCBGUjMwX09QRVJBTkRfVTQsIEZSMzBfT1BFUkFORF9VNEMsIEZSMzBfT1BFUkFORF9VOAotICwgRlIzMF9PUEVSQU5EX0k4LCBGUjMwX09QRVJBTkRfVURJU1A2LCBGUjMwX09QRVJBTkRfRElTUDgsIEZSMzBfT1BFUkFORF9ESVNQOQotICwgRlIzMF9PUEVSQU5EX0RJU1AxMCwgRlIzMF9PUEVSQU5EX1MxMCwgRlIzMF9PUEVSQU5EX1UxMCwgRlIzMF9PUEVSQU5EX0kzMgotICwgRlIzMF9PUEVSQU5EX000LCBGUjMwX09QRVJBTkRfSTIwLCBGUjMwX09QRVJBTkRfRElSOCwgRlIzMF9PUEVSQU5EX0RJUjkKLSAsIEZSMzBfT1BFUkFORF9ESVIxMCwgRlIzMF9PUEVSQU5EX0xBQkVMOSwgRlIzMF9PUEVSQU5EX0xBQkVMMTIsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRAotICwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QsIEZSMzBfT1BFUkFORF9DQwotICwgRlIzMF9PUEVSQU5EX0NDQywgRlIzMF9PUEVSQU5EX05CSVQsIEZSMzBfT1BFUkFORF9WQklULCBGUjMwX09QRVJBTkRfWkJJVAotICwgRlIzMF9PUEVSQU5EX0NCSVQsIEZSMzBfT1BFUkFORF9JQklULCBGUjMwX09QRVJBTkRfU0JJVCwgRlIzMF9PUEVSQU5EX1RCSVQKLSAsIEZSMzBfT1BFUkFORF9EMEJJVCwgRlIzMF9PUEVSQU5EX0QxQklULCBGUjMwX09QRVJBTkRfQ0NSLCBGUjMwX09QRVJBTkRfU0NSCi0gLCBGUjMwX09QRVJBTkRfSUxNLCBGUjMwX09QRVJBTkRfTUFYCi19IENHRU5fT1BFUkFORF9UWVBFOwotCi0vKiBOdW1iZXIgb2Ygb3BlcmFuZHMgdHlwZXMuICAqLwotI2RlZmluZSBNQVhfT1BFUkFORFMgKChpbnQpIEZSMzBfT1BFUkFORF9NQVgpCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIHJlZmVyZW5jZWQgYnkgYW55IGluc24uICAqLwotI2RlZmluZSBNQVhfT1BFUkFORF9JTlNUQU5DRVMgOAotCi0vKiBJbnNuIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pbnNuIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2luc25fYXR0ciB7Ci0gIENHRU5fSU5TTl9BTElBUywgQ0dFTl9JTlNOX1ZJUlRVQUwsIENHRU5fSU5TTl9VTkNPTkRfQ1RJLCBDR0VOX0lOU05fQ09ORF9DVEkKLSAsIENHRU5fSU5TTl9TS0lQX0NUSSwgQ0dFTl9JTlNOX0RFTEFZX1NMT1QsIENHRU5fSU5TTl9SRUxBWEFCTEUsIENHRU5fSU5TTl9SRUxBWAotICwgQ0dFTl9JTlNOX05PX0RJUywgQ0dFTl9JTlNOX1BCQiwgQ0dFTl9JTlNOX05PVF9JTl9ERUxBWV9TTE9ULCBDR0VOX0lOU05fRU5EX0JPT0xTCi0gLCBDR0VOX0lOU05fU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSU5TTl9NQUNILCBDR0VOX0lOU05fRU5EX05CT09MUwotfSBDR0VOX0lOU05fQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faW5zbl9hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX05CT09MX0FUVFJTIChDR0VOX0lOU05fRU5EX05CT09MUyAtIENHRU5fSU5TTl9TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBjZ2VuLmggdXNlcyB0aGluZ3Mgd2UganVzdCBkZWZpbmVkLiAgKi8KLSNpbmNsdWRlICJvcGNvZGUvY2dlbi5oIgotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2hhcmR3YXJlX2F0dHJfdGFibGVbXTsKLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2lmaWVsZF9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9vcGVyYW5kX2F0dHJfdGFibGVbXTsKLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2luc25fYXR0cl90YWJsZVtdOwotCi0vKiBIYXJkd2FyZSBkZWNscy4gICovCi0KLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lczsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcHM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3IxMzsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcjE0OwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTU7Ci0KLQotCi0KLSNlbmRpZiAvKiBGUjMwX0NQVV9IICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtZGlzLmMgYi9vcGNvZGVzL2ZyMzAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MjkxNWIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9mcjMwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMwICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlciBpbnRlcmZhY2UgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTi4gLSotIEMgLSotCi0gICBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0tIHRoZSByZXN1bHRhbnQgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCwgY2dlbi1kaXMuaW4gaXNuJ3QKLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgotICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJmcjMwLWRlc2MuaCIKLSNpbmNsdWRlICJmcjMwLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBEZWZhdWx0IHRleHQgdG8gcHJpbnQgaWYgYW4gaW5zdHJ1Y3Rpb24gaXNuJ3QgcmVjb2duaXplZC4gICovCi0jZGVmaW5lIFVOS05PV05fSU5TTl9NU0cgXygiKnVua25vd24qIikKLQotc3RhdGljIHZvaWQgcHJpbnRfbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgbG9uZywgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2FkZHJlc3MKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBiZmRfdm1hLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRfa2V5d29yZAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIENHRU5fS0VZV09SRCAqLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHByaW50X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgY29uc3QgQ0dFTl9JTlNOICosIENHRU5fRklFTERTICosCi0JICAgICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgaW50IHByaW50X2luc24gUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgYmZkX3ZtYSwKLQkJCSAgICAgICBkaXNhc3NlbWJsZV9pbmZvICosIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGRlZmF1bHRfcHJpbnRfaW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQwKLS8qIC0tIGRpc2Fzc2VtYmxlciByb3V0aW5lcyBpbnNlcnRlZCBoZXJlICovCi0KLS8qIC0tIGRpcy5jICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9yZWdpc3Rlcl9saXN0IChkaXNfaW5mbywgdmFsdWUsIG9mZnNldCwgbG9hZF9zdG9yZSkKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgaW50IGxvYWRfc3RvcmU7IC8qIDAgPT0gbG9hZCwgMSA9PSBzdG9yZSAqLwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gZGlzX2luZm87Ci0gIGludCBtYXNrOwotICBpbnQgaW5kZXggPSAwOwotICBjaGFyKiBjb21tYSA9ICIiOwotCi0gIGlmIChsb2FkX3N0b3JlKQotICAgIG1hc2sgPSAweDgwOwotICBlbHNlCi0gICAgbWFzayA9IDE7Ci0KLSAgaWYgKHZhbHVlICYgbWFzaykKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIlaSIsIGluZGV4ICsgb2Zmc2V0KTsKLSAgICAgIGNvbW1hID0gIiwiOwotICAgIH0KLSAgICAKLSAgZm9yIChpbmRleCA9IDE7IGluZGV4IDw9IDc7ICsraW5kZXgpCi0gICAgewotICAgICAgaWYgKGxvYWRfc3RvcmUpCi0JbWFzayA+Pj0gMTsKLSAgICAgIGVsc2UKLQltYXNrIDw8PSAxOwotCi0gICAgICBpZiAodmFsdWUgJiBtYXNrKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNyJWkiLCBjb21tYSwgaW5kZXggKyBvZmZzZXQpOwotCSAgY29tbWEgPSAiLCI7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2hpX3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCA4LCAwLypsb2FkKi8pOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfbG93X3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCAwLCAwLypsb2FkKi8pOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBwcmludF9yZWdpc3Rlcl9saXN0IChkaXNfaW5mbywgdmFsdWUsIDgsIDEvKnN0b3JlKi8pOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfbG93X3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCAwLCAxLypzdG9yZSovKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X200IChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci19Ci0vKiAtLSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBwcmludGluZyBvcGVyYW5kcy4KLSAgIFhJTkZPIGlzIGEgYHZvaWQgKicgYW5kIG5vdCBhIGBkaXNhc3NlbWJsZV9pbmZvIConIHRvIG5vdCBwdXQgYSByZXF1aXJlbWVudAotICAgb2YgZGlzLWFzbS5oIG9uIGNnZW4uaC4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwcmludF9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHByaW50X2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLgotKi8KLQotdm9pZAotZnIzMF9jZ2VuX3ByaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCB4aW5mbywgZmllbGRzLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIFBUUiB4aW5mbzsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgdm9pZCBjb25zdCAqYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIHhpbmZvOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgZmllbGRzLT5mX0NSaSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzLCBmaWVsZHMtPmZfQ1JqLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTMsIDAsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNCwgMCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2hfcjE1LCAwLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX1JpLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9SaWMsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfUmosIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX1JqYywgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCBmaWVsZHMtPmZfUnMxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXMsIGZpZWxkcy0+Zl9SczIsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2NjLCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfY2NjLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXIxMCwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXI4LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2RpcjksIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwMTAsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwOCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2Rpc3A5LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2kyMCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKXwoMTw8Q0dFTl9PUEVSQU5EX1ZJUlRVQUwpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfaTMyLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpfCgxPDxDR0VOX09QRVJBTkRfU0lHTl9PUFQpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9pOCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVsMTIsIDB8KDE8PENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWw5LCAwfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgcHJpbnRfbTQgKGNkLCBpbmZvLCBmaWVsZHMtPmZfbTQsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3BzLCAwLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgcHJpbnRfaGlfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkLCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgcHJpbnRfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIHByaW50X2xvd19yZWdpc3Rlcl9saXN0X2xkIChjZCwgaW5mbywgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkLCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIHByaW50X2xvd19yZWdpc3Rlcl9saXN0X3N0IChjZCwgaW5mbywgZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfczEwLCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3UxMCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdTQsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91NGMsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3U4LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWRpc3A2LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcHJpbnRpbmcgaW5zbi5cbiIpLAotCSAgICAgICBvcGluZGV4KTsKLSAgICBhYm9ydCAoKTsKLSAgfQotfQotCi1jZ2VuX3ByaW50X2ZuICogY29uc3QgZnIzMF9jZ2VuX3ByaW50X2hhbmRsZXJzW10gPSAKLXsKLSAgcHJpbnRfaW5zbl9ub3JtYWwsCi19OwotCi0KLXZvaWQKLWZyMzBfY2dlbl9pbml0X2RpcyAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGZyMzBfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpOwotICBmcjMwX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCk7Ci0gIGNkLT5wcmludF9oYW5kbGVycyA9ICYgZnIzMF9jZ2VuX3ByaW50X2hhbmRsZXJzWzBdOwotICBjZC0+cHJpbnRfb3BlcmFuZCA9IGZyMzBfY2dlbl9wcmludF9vcGVyYW5kOwotfQotCi0MCi0vKiBEZWZhdWx0IHByaW50IGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfbm9ybWFsIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLQotI2lmZGVmIENHRU5fUFJJTlRfTk9STUFMCi0gIENHRU5fUFJJTlRfTk9STUFMIChjZCwgaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBhdHRyaWJ1dGVzLiAgKi8KLSAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZKSkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0lHTkVEKSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCB2YWx1ZSk7Ci19Ci0KLS8qIERlZmF1bHQgYWRkcmVzcyBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FkZHJlc3MgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotCi0jaWZkZWYgQ0dFTl9QUklOVF9BRERSRVNTCi0gIENHRU5fUFJJTlRfQUREUkVTUyAoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgYXR0cmlidXRlcy4gICovCi0gIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TRU1fT05MWSkpCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpKQotICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9BQlNfQUREUikpCi0gICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NJR05FRCkpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCAobG9uZykgdmFsdWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsIChsb25nKSB2YWx1ZSk7Ci19Ci0KLS8qIEtleXdvcmQgcHJpbnQgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9rZXl3b3JkIChjZCwgZGlzX2luZm8sIGtleXdvcmRfdGFibGUsIHZhbHVlLCBhdHRycykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBDR0VOX0tFWVdPUkQgKmtleXdvcmRfdGFibGU7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotCi0gIGtlID0gY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZSAoa2V5d29yZF90YWJsZSwgdmFsdWUpOwotICBpZiAoa2UgIT0gTlVMTCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwga2UtPm5hbWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI/Pz8iKTsKLX0KLQwKLS8qIERlZmF1bHQgaW5zbiBwcmludGVyLgotCi0gICBESVNfSU5GTyBpcyBkZWZpbmVkIGFzIGBQVFInIHNvIHRoZSBkaXNhc3NlbWJsZXIgbmVlZG4ndCBrbm93IGFueXRoaW5nCi0gICBhYm91dCBkaXNhc3NlbWJsZV9pbmZvLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2luc25fbm9ybWFsIChjZCwgZGlzX2luZm8sIGluc24sIGZpZWxkcywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47Ci0KLSAgQ0dFTl9JTklUX1BSSU5UIChjZCk7Ci0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICpzeW47ICsrc3luKQotICAgIHsKLSAgICAgIGlmIChDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqc3luKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgQ0dFTl9TWU5UQVhfQ0hBUiAoKnN5bikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQuICAqLwotICAgICAgZnIzMF9jZ2VuX3ByaW50X29wZXJhbmQgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksIGluZm8sCi0JCQkJIGZpZWxkcywgQ0dFTl9JTlNOX0FUVFJTIChpbnNuKSwgcGMsIGxlbmd0aCk7Ci0gICAgfQotfQotDAotLyogVXRpbGl0eSB0byBwcmludCBhbiBpbnNuLgotICAgQlVGIGlzIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24sIHRhcmdldCBieXRlIG9yZGVyLCBCVUZMRU4gYnl0ZXMgbG9uZy4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnMgZmV0Y2hpbmcgZGF0YSAobWVtb3J5X2Vycm9yX2Z1bmMgd2lsbCBoYXZlCi0gICBiZWVuIGNhbGxlZCkuICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgYnVmbGVuKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBidWZsZW47Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbl92YWx1ZTsKLSAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmluc25fbGlzdDsKLSAgQ0dFTl9FWFRSQUNUX0lORk8gZXhfaW5mbzsKLQotICBleF9pbmZvLmRpc19pbmZvID0gaW5mbzsKLSAgZXhfaW5mby52YWxpZCA9ICgxIDw8IChjZC0+YmFzZV9pbnNuX2JpdHNpemUgLyA4KSkgLSAxOwotICBleF9pbmZvLmluc25fYnl0ZXMgPSBidWY7Ci0KLSAgc3dpdGNoIChidWZsZW4pCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGluc25fdmFsdWUgPSBidWZbMF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIxNiAoYnVmKSA6IGJmZF9nZXRsMTYgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIzMiAoYnVmKSA6IGJmZF9nZXRsMzIgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoIGxpc3RzLgotICAgICBQaWNrIHRoZSBmaXJzdCBvbmUgYW5kIGtlZXAgdHJ5aW5nIHVudGlsIHdlIGZpbmQgdGhlIHJpZ2h0IG9uZS4gICovCi0KLSAgaW5zbl9saXN0ID0gQ0dFTl9ESVNfTE9PS1VQX0lOU04gKGNkLCBidWYsIGluc25fdmFsdWUpOwotICB3aGlsZSAoaW5zbl9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gaW5zbl9saXN0LT5pbnNuOwotICAgICAgQ0dFTl9GSUVMRFMgZmllbGRzOwotICAgICAgaW50IGxlbmd0aDsKLQotI2lmIDAgLyogbm90IG5lZWRlZCBhcyBpbnNuIHNob3VsZG4ndCBiZSBpbiBoYXNoIGxpc3RzIGlmIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgIC8qIFN1cHBvcnRlZCBieSB0aGlzIGNwdT8gICovCi0gICAgICBpZiAoISBmcjMwX2NnZW5faW5zbl9zdXBwb3J0ZWQgKGNkLCBpbnNuKSkKLQljb250aW51ZTsKLSNlbmRpZgotCi0gICAgICAvKiBCYXNpYyBiaXQgbWFzayBtdXN0IGJlIGNvcnJlY3QuICAqLwotICAgICAgLyogPz8/IE1heSB3aXNoIHRvIGFsbG93IHRhcmdldCB0byBkZWZlciB0aGlzIGNoZWNrIHVudGlsIHRoZSBleHRyYWN0Ci0JIGhhbmRsZXIuICAqLwotICAgICAgaWYgKChpbnNuX3ZhbHVlICYgQ0dFTl9JTlNOX0JBU0VfTUFTSyAoaW5zbikpCi0JICA9PSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbikpCi0JewotCSAgLyogUHJpbnRpbmcgaXMgaGFuZGxlZCBpbiB0d28gcGFzc2VzLiAgVGhlIGZpcnN0IHBhc3MgcGFyc2VzIHRoZQotCSAgICAgbWFjaGluZSBpbnNuIGFuZCBleHRyYWN0cyB0aGUgZmllbGRzLiAgVGhlIHNlY29uZCBwYXNzIHByaW50cwotCSAgICAgdGhlbS4gICovCi0KLQkgIGxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCi0JICAgIChjZCwgaW5zbiwgJmV4X2luZm8sIGluc25fdmFsdWUsICZmaWVsZHMsIHBjKTsKLQkgIC8qIGxlbmd0aCA8IDAgLT4gZXJyb3IgKi8KLQkgIGlmIChsZW5ndGggPCAwKQotCSAgICByZXR1cm4gbGVuZ3RoOwotCSAgaWYgKGxlbmd0aCA+IDApCi0JICAgIHsKLQkgICAgICBDR0VOX1BSSU5UX0ZOIChjZCwgaW5zbikgKGNkLCBpbmZvLCBpbnNuLCAmZmllbGRzLCBwYywgbGVuZ3RoKTsKLQkgICAgICAvKiBsZW5ndGggaXMgaW4gYml0cywgcmVzdWx0IGlzIGluIGJ5dGVzICovCi0JICAgICAgcmV0dXJuIGxlbmd0aCAvIDg7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluc25fbGlzdCA9IENHRU5fRElTX05FWFRfSU5TTiAoaW5zbl9saXN0KTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIERlZmF1bHQgdmFsdWUgZm9yIENHRU5fUFJJTlRfSU5TTi4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cmVkIGZldGNoaW5nIGJ5dGVzLiAgKi8KLQotI2lmbmRlZiBDR0VOX1BSSU5UX0lOU04KLSNkZWZpbmUgQ0dFTl9QUklOVF9JTlNOIGRlZmF1bHRfcHJpbnRfaW5zbgotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWRlZmF1bHRfcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjaGFyIGJ1ZltDR0VOX01BWF9JTlNOX1NJWkVdOwotICBpbnQgc3RhdHVzOwotCi0gIC8qIFJlYWQgdGhlIGJhc2UgcGFydCBvZiB0aGUgaW5zbi4gICovCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMsIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiBwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCk7Ci19Ci0KLS8qIE1haW4gZW50cnkgcG9pbnQuCi0gICBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChpbiBieXRlcykuICAqLwotCi1pbnQKLXByaW50X2luc25fZnIzMCAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHN0YXRpYyBDR0VOX0NQVV9ERVNDIGNkID0gMDsKLSAgc3RhdGljIHByZXZfaXNhLHByZXZfbWFjaCxwcmV2X2VuZGlhbjsKLSAgaW50IGxlbmd0aDsKLSAgaW50IGlzYSxtYWNoOwotICBpbnQgZW5kaWFuID0gKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRwotCQk/IENHRU5fRU5ESUFOX0JJRwotCQk6IENHRU5fRU5ESUFOX0xJVFRMRSk7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qID8/PyBnZGIgd2lsbCBzZXQgbWFjaCBidXQgbGVhdmUgdGhlIGFyY2hpdGVjdHVyZSBhcyAidW5rbm93biIgKi8KLSNpZm5kZWYgQ0dFTl9CRkRfQVJDSAotI2RlZmluZSBDR0VOX0JGRF9BUkNIIGJmZF9hcmNoX2ZyMzAKLSNlbmRpZgotICBhcmNoID0gaW5mby0+YXJjaDsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBhcmNoID0gQ0dFTl9CRkRfQVJDSDsKLSAgICAgIAotICAvKiBUaGVyZSdzIG5vIHN0YW5kYXJkIHdheSB0byBjb21wdXRlIHRoZSBpc2EgbnVtYmVyIChlLmcuIGZvciBhcm0gdGh1bWIpCi0gICAgIHNvIHdlIGxlYXZlIGl0IHRvIHRoZSB0YXJnZXQuICAqLwotI2lmZGVmIENHRU5fQ09NUFVURV9JU0EKLSAgaXNhID0gQ0dFTl9DT01QVVRFX0lTQSAoaW5mbyk7Ci0jZWxzZQotICBpc2EgPSAwOwotI2VuZGlmCi0KLSAgbWFjaCA9IGluZm8tPm1hY2g7Ci0KLSAgLyogSWYgd2UndmUgc3dpdGNoZWQgY3B1J3MsIGNsb3NlIHRoZSBjdXJyZW50IHRhYmxlIGFuZCBvcGVuIGEgbmV3IG9uZS4gICovCi0gIGlmIChjZAotICAgICAgJiYgKGlzYSAhPSBwcmV2X2lzYQotCSAgfHwgbWFjaCAhPSBwcmV2X21hY2gKLQkgIHx8IGVuZGlhbiAhPSBwcmV2X2VuZGlhbikpCi0gICAgewotICAgICAgZnIzMF9jZ2VuX2NwdV9jbG9zZSAoY2QpOwotICAgICAgY2QgPSAwOwotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHlldCwgaW5pdGlhbGl6ZSB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgaWYgKCEgY2QpCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoX3R5cGUgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2gpOwotICAgICAgY29uc3QgY2hhciAqbWFjaF9uYW1lOwotCi0gICAgICBpZiAoIWFyY2hfdHlwZSkKLQlhYm9ydCAoKTsKLSAgICAgIG1hY2hfbmFtZSA9IGFyY2hfdHlwZS0+cHJpbnRhYmxlX25hbWU7Ci0KLSAgICAgIHByZXZfaXNhID0gaXNhOwotICAgICAgcHJldl9tYWNoID0gbWFjaDsKLSAgICAgIHByZXZfZW5kaWFuID0gZW5kaWFuOwotICAgICAgY2QgPSBmcjMwX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fSVNBUywgcHJldl9pc2EsCi0JCQkJIENHRU5fQ1BVX09QRU5fQkZETUFDSCwgbWFjaF9uYW1lLAotCQkJCSBDR0VOX0NQVV9PUEVOX0VORElBTiwgcHJldl9lbmRpYW4sCi0JCQkJIENHRU5fQ1BVX09QRU5fRU5EKTsKLSAgICAgIGlmICghY2QpCi0JYWJvcnQgKCk7Ci0gICAgICBmcjMwX2NnZW5faW5pdF9kaXMgKGNkKTsKLSAgICB9Ci0KLSAgLyogV2UgdHJ5IHRvIGhhdmUgYXMgbXVjaCBjb21tb24gY29kZSBhcyBwb3NzaWJsZS4KLSAgICAgQnV0IGF0IHRoaXMgcG9pbnQgc29tZSB0YXJnZXRzIG5lZWQgdG8gdGFrZSBvdmVyLiAgKi8KLSAgLyogPz8/IFNvbWUgdGFyZ2V0cyBtYXkgbmVlZCBhIGhvb2sgZWxzZXdoZXJlLiAgVHJ5IHRvIGF2b2lkIHRoaXMsCi0gICAgIGJ1dCBpZiBub3QgcG9zc2libGUgdHJ5IHRvIG1vdmUgdGhpcyBob29rIGVsc2V3aGVyZSByYXRoZXIgdGhhbgotICAgICBoYXZlIHR3byBob29rcy4gICovCi0gIGxlbmd0aCA9IENHRU5fUFJJTlRfSU5TTiAoY2QsIHBjLCBpbmZvKTsKLSAgaWYgKGxlbmd0aCA+IDApCi0gICAgcmV0dXJuIGxlbmd0aDsKLSAgaWYgKGxlbmd0aCA8IDApCi0gICAgcmV0dXJuIC0xOwotCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBVTktOT1dOX0lOU05fTVNHKTsKLSAgcmV0dXJuIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSAvIDg7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtaWJsZC5jIGIvb3Bjb2Rlcy9mcjMwLWlibGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhNDQ1OC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtaWJsZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5MyArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBidWlsZGluZy9leHRyYWN0aW9uIHN1cHBvcnQgZm9yIGZyMzAuIC0qLSBDIC0qLQotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4taWJsZC5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAiZnIzMC1kZXNjLmgiCi0jaW5jbHVkZSAiZnIzMC1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI3VuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI3VuZGVmIG1heAotI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotCi0vKiBVc2VkIGJ5IHRoZSBpZmllbGQgcnR4IGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgRkxEKGYpIChmaWVsZHMtPmYpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBsb25nLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIENHRU5fSU5TTl9CWVRFU19QVFIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLAotCSAgICAgIENHRU5fRklFTERTICosIENHRU5fSU5TTl9CWVRFU19QVFIsIGJmZF92bWEpKTsKLQotc3RhdGljIGludCBleHRyYWN0X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLCBDR0VOX0lOU05fSU5ULAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgbG9uZyAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosIENHRU5fRVhUUkFDVF9JTkZPICosCi0JICAgICAgQ0dFTl9JTlNOX0lOVCwgQ0dFTl9GSUVMRFMgKiwgYmZkX3ZtYSkpOwotDAotLyogT3BlcmFuZCBpbnNlcnRpb24uICAqLwotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotLyogU3Vicm91dGluZSBvZiBpbnNlcnRfbm9ybWFsLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIHZvaWQKLWluc2VydF8xIChjZCwgdmFsdWUsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICBpbnQgc3RhcnQsbGVuZ3RoLHdvcmRfbGVuZ3RoOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZwOwotewotICB1bnNpZ25lZCBsb25nIHgsbWFzazsKLSAgaW50IHNoaWZ0OwotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB4ID0gKmJ1ZnA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjE2IChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JeCA9IChidWZwWzBdIDw8IDE2KSB8IGJmZF9nZXRiMTYgKGJ1ZnAgKyAxKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCkgfCAoYnVmcFsyXSA8PCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjMyIChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwzMiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLSAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgZWxzZQotICAgIHNoaWZ0ID0gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gIHggPSAoeCAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICAqYnVmcCA9IHg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCWJmZF9wdXRiMTYgKHgsIGJ1ZnApOwotICAgICAgZWxzZQotCWJmZF9wdXRsMTYgKHgsIGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXsKLQkgIGJ1ZnBbMF0gPSB4ID4+IDE2OwotCSAgYmZkX3B1dGIxNiAoeCwgYnVmcCArIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0bDE2ICh4LCBidWZwKTsKLQkgIGJ1ZnBbMl0gPSB4ID4+IDE2OwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JYmZkX3B1dGIzMiAoeCwgYnVmcCk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwzMiAoeCwgYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLS8qIERlZmF1bHQgaW5zZXJ0aW9uIHJvdXRpbmUuCi0KLSAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLgotICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KLSAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgotICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KLSAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLwotCi0vKiA/Pz8gVGhpcyBkdXBsaWNhdGVzIGZ1bmN0aW9uYWxpdHkgd2l0aCBiZmQncyBob3d0byB0YWJsZSBhbmQKLSAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICAqLwotLyogPz8/IFRoaXMgZG9lc24ndCBoYW5kbGUgYmZkX3ZtYSdzLiAgQ3JlYXRlIGFub3RoZXIgZnVuY3Rpb24gd2hlbgotICAgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCBhdHRycywgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLAotCSAgICAgICB0b3RhbF9sZW5ndGgsIGJ1ZmZlcikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICB1bnNpZ25lZCBpbnQgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGg7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotewotICBzdGF0aWMgY2hhciBlcnJidWZbMTAwXTsKLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotICAvKiBJZiBMRU5HVEggaXMgemVybywgdGhpcyBvcGVyYW5kIGRvZXNuJ3QgY29udHJpYnV0ZSB0byB0aGUgdmFsdWUuICAqLwotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKENHRU5fSU5UX0lOU05fUAotICAgICAgJiYgd29yZF9vZmZzZXQgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAod29yZF9sZW5ndGggPiAzMikKLSAgICBhYm9ydCAoKTsKLQotICAvKiBGb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGluc25zIHNtYWxsZXIgdGhhbiB0aGUgYmFzZS1pbnNuLWJpdHNpemUsCi0gICAgIHdvcmRfbGVuZ3RoIG1heSBiZSB0b28gYmlnLiAgKi8KLSAgaWYgKGNkLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JkX29mZnNldCA9PSAwCi0JICAmJiB3b3JkX2xlbmd0aCA+IHRvdGFsX2xlbmd0aCkKLQl3b3JkX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKLSAgICB9Ci0KLSAgLyogRW5zdXJlIFZBTFVFIHdpbGwgZml0LiAgKi8KLSAgaWYgKCEgQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX0lGTERfU0lHTkVEKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG1heHZhbCA9IG1hc2s7Ci0gICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlID4gbWF4dmFsKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBzcHJpbnRmIChlcnJidWYsCi0JCSAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gMCBhbmQgJWx1KSIpLAotCQkgICB2YWx1ZSwgbWF4dmFsKTsKLQkgIHJldHVybiBlcnJidWY7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgbWludmFsID0gLSAoMUwgPDwgKGxlbmd0aCAtIDEpKTsKLSAgICAgIGxvbmcgbWF4dmFsID0gKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxOwotICAgICAgaWYgKHZhbHVlIDwgbWludmFsIHx8IHZhbHVlID4gbWF4dmFsKQotCXsKLQkgIHNwcmludGYKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgKGVycmJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsZCBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKSwKLQkgICAgIHZhbHVlLCBtaW52YWwsIG1heHZhbCk7Ci0JICByZXR1cm4gZXJyYnVmOwotCX0KLSAgICB9Ci0KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLQotICB7Ci0gICAgaW50IHNoaWZ0OwotCi0gICAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICAgIGVsc2UKLSAgICAgIHNoaWZ0ID0gd29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpOwotICAgICpidWZmZXIgPSAoKmJ1ZmZlciAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKLSAgfQotCi0jZWxzZSAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZwID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyICsgd29yZF9vZmZzZXQgLyA4OwotCi0gICAgaW5zZXJ0XzEgKGNkLCB2YWx1ZSwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnApOwotICB9Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBEZWZhdWx0IGluc24gYnVpbGRlciAoaW5zZXJ0IGhhbmRsZXIpLgotICAgVGhlIGluc3RydWN0aW9uIGlzIHJlY29yZGVkIGluIENHRU5fSU5UX0lOU05fUCBieXRlIG9yZGVyCi0gICAobWVhbmluZyB0aGF0IGlmIENHRU5fSU5UX0lOU05fUCBCVUZGRVIgaXMgYW4gaW50ICogYW5kIHRodXMgdGhlIHZhbHVlIGlzCi0gICByZWNvcmRlZCBpbiBob3N0IGJ5dGUgb3JkZXIsIG90aGVyd2lzZSBCVUZGRVIgaXMgYW4gYXJyYXkgb2YgYnl0ZXMgYW5kIHRoZQotICAgdmFsdWUgaXMgcmVjb3JkZWQgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIpLgotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWluc2VydF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGZpZWxkcywgYnVmZmVyLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzeW47Ci0KLSAgQ0dFTl9JTklUX0lOU0VSVCAoY2QpOwotICB2YWx1ZSA9IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbnNuKTsKLQotICAvKiBJZiB3ZSdyZSByZWNvcmRpbmcgaW5zbnMgYXMgbnVtYmVycyAocmF0aGVyIHRoYW4gYSBzdHJpbmcgb2YgYnl0ZXMpLAotICAgICB0YXJnZXQgYnl0ZSBvcmRlciBoYW5kbGluZyBpcyBkZWZlcnJlZCB1bnRpbCBsYXRlci4gICovCi0KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLQotICAqYnVmZmVyID0gdmFsdWU7Ci0KLSNlbHNlCi0KLSAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZmZlciwgbWluIChjZC0+YmFzZV9pbnNuX2JpdHNpemUsCi0JCQkJCUNHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykpLAotCQkgICAgICAgdmFsdWUpOwotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICAvKiA/Pz8gSXQgd291bGQgYmUgYmV0dGVyIHRvIHNjYW4gdGhlIGZvcm1hdCdzIGZpZWxkcy4KLSAgICAgU3RpbGwgbmVlZCB0byBiZSBhYmxlIHRvIGluc2VydCBhIHZhbHVlIGJhc2VkIG9uIHRoZSBvcGVyYW5kIHRob3VnaDsKLSAgICAgZS5nLiBzdG9yaW5nIGEgYnJhbmNoIGRpc3BsYWNlbWVudCB0aGF0IGdvdCByZXNvbHZlZCBsYXRlci4KLSAgICAgTmVlZHMgbW9yZSB0aG91Z2h0IGZpcnN0LiAgKi8KLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKiBzeW4gIT0gJ1wwJzsgKysgc3luKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKiBzeW4pKQotCWNvbnRpbnVlOwotCi0gICAgICBlcnJtc2cgPSAoKiBjZC0+aW5zZXJ0X29wZXJhbmQpIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCSAgICAgICBmaWVsZHMsIGJ1ZmZlciwgcGMpOwotICAgICAgaWYgKGVycm1zZykKLQlyZXR1cm4gZXJybXNnOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQwKLS8qIE9wZXJhbmQgZXh0cmFjdGlvbi4gICovCi0KLSNpZiAhIENHRU5fSU5UX0lOU05fUAotCi0vKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLgotICAgRW5zdXJlIHN1ZmZpY2llbnQgYnl0ZXMgYXJlIGNhY2hlZCBpbiBFWF9JTkZPLgotICAgT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgotICAgQllURVMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgbmVlZGVkIHZhbHVlLgotICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIGludAotZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIG9mZnNldCwgYnl0ZXMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgaW50IG9mZnNldCwgYnl0ZXM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIC8qIEl0J3MgZG91YnRmdWwgdGhhdCB0aGUgbWlkZGxlIHBhcnQgaGFzIGFscmVhZHkgYmVlbiBmZXRjaGVkIHNvCi0gICAgIHdlIGRvbid0IG9wdGltaXplIHRoYXQgY2FzZS4gIGtpc3MuICAqLwotICBpbnQgbWFzazsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGV4X2luZm8tPmRpc19pbmZvOwotCi0gIC8qIEZpcnN0IGRvIGEgcXVpY2sgY2hlY2suICAqLwotICBtYXNrID0gKDEgPDwgYnl0ZXMpIC0gMTsKLSAgaWYgKCgoZXhfaW5mby0+dmFsaWQgPj4gb2Zmc2V0KSAmIG1hc2spID09IG1hc2spCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgYnl0ZSB3ZSBuZWVkIHRvIHJlYWQuICAqLwotICBmb3IgKG1hc2sgPSAxIDw8IG9mZnNldDsgYnl0ZXMgPiAwOyAtLWJ5dGVzLCArK29mZnNldCwgbWFzayA8PD0gMSkKLSAgICBpZiAoISAobWFzayAmIGV4X2luZm8tPnZhbGlkKSkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChieXRlcykKLSAgICB7Ci0gICAgICBpbnQgc3RhdHVzOwotCi0gICAgICBwYyArPSBvZmZzZXQ7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JKHBjLCBleF9pbmZvLT5pbnNuX2J5dGVzICsgb2Zmc2V0LCBieXRlcywgaW5mbyk7Ci0KLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGV4X2luZm8tPnZhbGlkIHw9ICgoMSA8PCBieXRlcykgLSAxKSA8PCBvZmZzZXQ7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIGxvbmcKLWV4dHJhY3RfMSAoY2QsIGV4X2luZm8sIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIGludCBzdGFydCxsZW5ndGgsd29yZF9sZW5ndGg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnA7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgeCxtYXNrOwotICBpbnQgc2hpZnQ7Ci0gIGludCBiaWdfcCA9IENHRU5fQ1BVX0lOU05fRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotCi0gIHN3aXRjaCAod29yZF9sZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgIHggPSAqYnVmcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMTYgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gKGJ1ZnBbMF0gPDwgMTYpIHwgYmZkX2dldGIxNiAoYnVmcCArIDEpOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKSB8IChidWZwWzJdIDw8IDE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMzIgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDMyIChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLSAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICBlbHNlCi0gICAgc2hpZnQgPSAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgcmV0dXJuICh4ID4+IHNoaWZ0KSAmIG1hc2s7Ci19Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0vKiBEZWZhdWx0IGV4dHJhY3Rpb24gcm91dGluZS4KLQotICAgSU5TTl9WQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBvZiB0aGUgaW5zbiBpbiBob3N0IG9yZGVyLAotICAgb3Igc29tZXRpbWVzIGxlc3MgZm9yIGNhc2VzIGxpa2UgdGhlIG0zMnIgd2hlcmUgdGhlIGJhc2UgaW5zbiBzaXplIGlzIDMyCi0gICBidXQgc29tZSBpbnNucyBhcmUgMTYgYml0cy4KLSAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLiAgV2Ugb25seSBuZWVkIGBTSUdORUQnLAotICAgYnV0IGZvciBnZW5lcmFsaXR5IHdlIHRha2UgYSBiaXRtYXNrIG9mIGFsbCBvZiB0aGVtLgotICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KLSAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgotICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KLSAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLS8qID8/PyBUaGUgcmV0dXJuIGNvZGUgaXNuJ3QgcHJvcGVybHkgdXNlZC4gIHdpcC4gICovCi0KLS8qID8/PyBUaGlzIGRvZXNuJ3QgaGFuZGxlIGJmZF92bWEncy4gIENyZWF0ZSBhbm90aGVyIGZ1bmN0aW9uIHdoZW4KLSAgIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgYXR0cnMsIHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLAotCQl3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoLCBwYywgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIHVuc2lnbmVkIGludCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBDR0VOX0lOU05fSU5UIHZhbHVlOwotCi0gIC8qIElmIExFTkdUSCBpcyB6ZXJvLCB0aGlzIG9wZXJhbmQgZG9lc24ndCBjb250cmlidXRlIHRvIHRoZSB2YWx1ZQotICAgICBzbyBnaXZlIGl0IGEgc3RhbmRhcmQgdmFsdWUgb2YgemVyby4gICovCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAqdmFsdWVwID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoQ0dFTl9JTlRfSU5TTl9QCi0gICAgICAmJiB3b3JkX29mZnNldCAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotICAgIGFib3J0ICgpOwotCi0gIC8qIEZvciBhcmNoaXRlY3R1cmVzIHdpdGggaW5zbnMgc21hbGxlciB0aGFuIHRoZSBpbnNuLWJhc2UtYml0c2l6ZSwKLSAgICAgd29yZF9sZW5ndGggbWF5IGJlIHRvbyBiaWcuICAqLwotICBpZiAoY2QtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCi0gICAgewotICAgICAgaWYgKHdvcmRfb2Zmc2V0ID09IDAKLQkgICYmIHdvcmRfbGVuZ3RoID4gdG90YWxfbGVuZ3RoKQotCXdvcmRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOwotICAgIH0KLQotICAvKiBEb2VzIHRoZSB2YWx1ZSByZXNpZGUgaW4gSU5TTl9WQUxVRT8gICovCi0KLSAgaWYgKHdvcmRfb2Zmc2V0ID09IDApCi0gICAgewotICAgICAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgICAgIENHRU5fSU5TTl9JTlQgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLSAgICAgIGlmIChDR0VOX0lOU05fTFNCMF9QKQotCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAoKHN0YXJ0ICsgMSkgLSBsZW5ndGgpOwotICAgICAgZWxzZQotCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgICAgIHZhbHVlICY9IG1hc2s7Ci0gICAgICAvKiBzaWduIGV4dGVuZD8gKi8KLSAgICAgIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fSUZMRF9TSUdORUQpCi0JICAmJiAodmFsdWUgJiAoMUwgPDwgKGxlbmd0aCAtIDEpKSkpCi0JdmFsdWUgfD0gfm1hc2s7Ci0gICAgfQotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqYnVmcCA9IGV4X2luZm8tPmluc25fYnl0ZXMgKyB3b3JkX29mZnNldCAvIDg7Ci0KLSAgICAgIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIHdvcmRfb2Zmc2V0IC8gOCwgd29yZF9sZW5ndGggLyA4LCBwYykgPT0gMCkKLQlyZXR1cm4gMDsKLQotICAgICAgdmFsdWUgPSBleHRyYWN0XzEgKGNkLCBleF9pbmZvLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCwgcGMpOwotICAgIH0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgKnZhbHVlcCA9IHZhbHVlOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBEZWZhdWx0IGluc24gZXh0cmFjdG9yLgotCi0gICBJTlNOX1ZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzLCB0cmFuc2xhdGVkIHRvIGhvc3Qgb3JkZXIuCi0gICBUaGUgZXh0cmFjdGVkIGZpZWxkcyBhcmUgc3RvcmVkIGluIEZJRUxEUy4KLSAgIEVYX0lORk8gaXMgdXNlZCB0byBoYW5kbGUgcmVhZGluZyB2YXJpYWJsZSBsZW5ndGggaW5zbnMuCi0gICBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLCBvciAwIGlmIG5vIG1hdGNoLAotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzIGZldGNoaW5nIGRhdGEgKG1lbW9yeV9lcnJvcl9mdW5jIHdpbGwgaGF2ZQotICAgYmVlbiBjYWxsZWQpLiAgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47Ci0KLSAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLQotICBDR0VOX0lOSVRfRVhUUkFDVCAoY2QpOwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqc3luOyArK3N5bikKLSAgICB7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKLQljb250aW51ZTsKLQotICAgICAgbGVuZ3RoID0gKCogY2QtPmV4dHJhY3Rfb3BlcmFuZCkgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCi0JCQkJCWV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpOwotICAgICAgaWYgKGxlbmd0aCA8PSAwKQotCXJldHVybiBsZW5ndGg7Ci0gICAgfQotCi0gIC8qIFdlIHJlY29nbml6ZWQgYW5kIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgdGhpcyBpbnNuLiAgKi8KLSAgcmV0dXJuIENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLX0KLQwKLS8qIG1hY2hpbmUgZ2VuZXJhdGVkIGNvZGUgYWRkZWQgaGVyZSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGluc2VydGlvbi4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwYXJzZV9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHBhcnNlX2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLiAgSXQncyBhbHNvIG5lZWRlZCBieSBHQVMgdG8gaW5zZXJ0IG9wZXJhbmRzIHRoYXQgY291bGRuJ3QgYmUKLSAgIHJlc29sdmVkIGR1cmluZyBwYXJzaW5nLgotKi8KLQotY29uc3QgY2hhciAqCi1mcjMwX2NnZW5faW5zZXJ0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIGJ1ZmZlciwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IGNoYXIgKiBlcnJtc2cgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuZ3RoID0gQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX0NSaSwgMCwgMTYsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfQ1JqLCAwLCAxNiwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUmksIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUmljLCAwLCAxNiwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JqLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUmpjLCAwLCAxNiwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JzMSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JzMiwgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2NjLCAwLCAwLCA0LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfY2NjLCAwLCAxNiwgMCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXIxMDsKLSAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgKHZhbHVlKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfZGlyOCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpcjk7Ci0gICAgICAgIHZhbHVlID0gKCh1bnNpZ25lZCBpbnQpICh2YWx1ZSkgPj4gKDEpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTA7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICh2YWx1ZSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfZGlzcDgsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A5OwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAodmFsdWUpID4+ICgxKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgewotewotICBGTEQgKGZfaTIwXzQpID0gKCh1bnNpZ25lZCBpbnQpIChGTEQgKGZfaTIwKSkgPj4gKDE2KSk7Ci0gIEZMRCAoZl9pMjBfMTYpID0gKChGTEQgKGZfaTIwKSkgJiAoNjU1MzUpKTsKLX0KLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9pMjBfNCwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgICAgaWYgKGVycm1zZykKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9pMjBfMTYsIDAsIDE2LCAwLCAxNiwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgICAgaWYgKGVycm1zZykKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2kzMiwgMHwoMTw8Q0dFTl9JRkxEX1NJR05fT1BUKSwgMTYsIDAsIDMyLCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9pOCwgMCwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3JlbDEyOwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAoKChwYykgKyAoMikpKSkpID4+ICgxKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgNSwgMTEsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3JlbDk7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICgoKHZhbHVlKSAtICgoKHBjKSArICgyKSkpKSkgPj4gKDEpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX200OwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpICYgKDE1KSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfczEwOwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAodmFsdWUpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3UxMDsKLSAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgKHZhbHVlKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3U0LCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdTRjLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdTgsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3VkaXNwNjsKLSAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgKHZhbHVlKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGJ1aWxkaW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiBlcnJtc2c7Ci19Ci0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIG9wZXJhbmQgZXh0cmFjdGlvbi4KLSAgIFRoZSByZXN1bHQgaXMgPD0gMCBmb3IgZXJyb3IsID4wIGZvciBzdWNjZXNzLgotICAgPz8/IEFjdHVhbCB2YWx1ZXMgYXJlbid0IHdlbGwgZGVmaW5lZCByaWdodCBub3cuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcHJpbnRfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwcmludF9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLWludAotZnIzMF9jZ2VuX2V4dHJhY3Rfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgLyogQXNzdW1lIHN1Y2Nlc3MgKGZvciB0aG9zZSBvcGVyYW5kcyB0aGF0IGFyZSBub3BzKS4gICovCi0gIGludCBsZW5ndGggPSAxOwotICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuZ3RoID0gQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX0NSaSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAxNiwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX0NSaik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUmkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUmljKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JqKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUmpjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9SczEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9SczIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDAsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9jY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfZGlyMTAgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfZGlyOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDEpKTsKLSAgICAgICAgZmllbGRzLT5mX2RpcjkgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDEwID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfZGlzcDgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDEpKTsKLSAgICAgICAgZmllbGRzLT5mX2Rpc3A5ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgewotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9pMjBfNCk7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDAsIDE2LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTIwXzE2KTsKLXsKLSAgRkxEIChmX2kyMCkgPSAoKCgoRkxEIChmX2kyMF80KSkgPDwgKDE2KSkpIHwgKEZMRCAoZl9pMjBfMTYpKSk7Ci19Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTl9PUFQpLCAxNiwgMCwgMzIsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9pMzIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgNSwgMTEsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgxKSkpICsgKCgocGMpICsgKDIpKSkpOwotICAgICAgICBmaWVsZHMtPmZfcmVsMTIgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgoKCh2YWx1ZSkgPDwgKDEpKSkgKyAoKChwYykgKyAoMikpKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9yZWw5ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIHwgKCgoLTEpIDw8ICg0KSkpKTsKLSAgICAgICAgZmllbGRzLT5mX200ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfczEwID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfdTEwID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91NCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3U0Yyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91OCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOwotICAgICAgICBmaWVsZHMtPmZfdWRpc3A2ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGRlY29kaW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotY2dlbl9pbnNlcnRfZm4gKiBjb25zdCBmcjMwX2NnZW5faW5zZXJ0X2hhbmRsZXJzW10gPSAKLXsKLSAgaW5zZXJ0X2luc25fbm9ybWFsLAotfTsKLQotY2dlbl9leHRyYWN0X2ZuICogY29uc3QgZnIzMF9jZ2VuX2V4dHJhY3RfaGFuZGxlcnNbXSA9IAotewotICBleHRyYWN0X2luc25fbm9ybWFsLAotfTsKLQotLyogR2V0dGluZyB2YWx1ZXMgZnJvbSBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCi0gICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IHJldHVybi4KLSAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgcmVzdWx0IHR5cGUKLSAgIG5vdCBhcHByb3ByaWF0ZS4gICovCi0KLWludAotZnIzMF9jZ2VuX2dldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGNvbnN0IENHRU5fRklFTERTICogZmllbGRzOwotewotICBpbnQgdmFsdWU7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfQ1JpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX0NSajsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JpYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JqOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JqYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SczE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUnMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfY2M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfY2NjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlyMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpcjg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpcjk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pMjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlbDEyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlbDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9tNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfczEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3UxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U0YzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VkaXNwNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyBpbnQgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotYmZkX3ZtYQotZnIzMF9jZ2VuX2dldF92bWFfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGNvbnN0IENHRU5fRklFTERTICogZmllbGRzOwotewotICBiZmRfdm1hIHZhbHVlOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX0NSaTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9DUmo7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaWM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SajsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SamM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUnMxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2RpcjEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTIwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2kzMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2k4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWwxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWw5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3MxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91MTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NGM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ZGlzcDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgdm1hIG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIFN0dWZmaW5nIHZhbHVlcyBpbiBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCi0gICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IGFjY2VwdC4KLSAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgYXJndW1lbnQgdHlwZQotICAgbm90IGFwcHJvcHJpYXRlLiAgKi8KLQotdm9pZAotZnIzMF9jZ2VuX3NldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcywgdmFsdWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgaW50IHZhbHVlOwotewotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICBmaWVsZHMtPmZfQ1JpID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgZmllbGRzLT5mX0NSaiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgZmllbGRzLT5mX1JpID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgZmllbGRzLT5mX1JpYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgZmllbGRzLT5mX1JqID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgZmllbGRzLT5mX1JqYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIGZpZWxkcy0+Zl9SczEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICBmaWVsZHMtPmZfUnMyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICBmaWVsZHMtPmZfY2MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBmaWVsZHMtPmZfY2NjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICBmaWVsZHMtPmZfZGlyMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgZmllbGRzLT5mX2RpcjggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgZmllbGRzLT5mX2RpcjkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIGZpZWxkcy0+Zl9pMjAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBmaWVsZHMtPmZfaTMyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICBmaWVsZHMtPmZfaTggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgZmllbGRzLT5mX3JlbDkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIGZpZWxkcy0+Zl9tNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICBmaWVsZHMtPmZfczEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgZmllbGRzLT5mX3UxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgZmllbGRzLT5mX3U0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgZmllbGRzLT5mX3U0YyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgZmllbGRzLT5mX3U4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgZmllbGRzLT5mX3VkaXNwNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIGludCBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci19Ci0KLXZvaWQKLWZyMzBfY2dlbl9zZXRfdm1hX29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIGZpZWxkcy0+Zl9DUmkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICBmaWVsZHMtPmZfQ1JqID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBmaWVsZHMtPmZfUmkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBmaWVsZHMtPmZfUmljID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBmaWVsZHMtPmZfUmogPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBmaWVsZHMtPmZfUmpjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgZmllbGRzLT5mX1JzMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIGZpZWxkcy0+Zl9SczIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIGZpZWxkcy0+Zl9jYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIGZpZWxkcy0+Zl9jY2MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIGZpZWxkcy0+Zl9kaXIxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlyOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICBmaWVsZHMtPmZfZGlyOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgZmllbGRzLT5mX2Rpc3A5ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgZmllbGRzLT5mX2kyMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIGZpZWxkcy0+Zl9pMzIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGZpZWxkcy0+Zl9pOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICBmaWVsZHMtPmZfcmVsMTIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICBmaWVsZHMtPmZfcmVsOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgZmllbGRzLT5mX200ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIGZpZWxkcy0+Zl9zMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICBmaWVsZHMtPmZfdTEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBmaWVsZHMtPmZfdTQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBmaWVsZHMtPmZfdTRjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBmaWVsZHMtPmZfdTggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICBmaWVsZHMtPmZfdWRpc3A2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgdm1hIG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLX0KLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIGluc3RydWN0aW9uIGJ1aWxkZXIgdGFibGVzLiAgKi8KLQotdm9pZAotZnIzMF9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGNkLT5pbnNlcnRfaGFuZGxlcnMgPSAmIGZyMzBfY2dlbl9pbnNlcnRfaGFuZGxlcnNbMF07Ci0gIGNkLT5leHRyYWN0X2hhbmRsZXJzID0gJiBmcjMwX2NnZW5fZXh0cmFjdF9oYW5kbGVyc1swXTsKLQotICBjZC0+aW5zZXJ0X29wZXJhbmQgPSBmcjMwX2NnZW5faW5zZXJ0X29wZXJhbmQ7Ci0gIGNkLT5leHRyYWN0X29wZXJhbmQgPSBmcjMwX2NnZW5fZXh0cmFjdF9vcGVyYW5kOwotCi0gIGNkLT5nZXRfaW50X29wZXJhbmQgPSBmcjMwX2NnZW5fZ2V0X2ludF9vcGVyYW5kOwotICBjZC0+c2V0X2ludF9vcGVyYW5kID0gZnIzMF9jZ2VuX3NldF9pbnRfb3BlcmFuZDsKLSAgY2QtPmdldF92bWFfb3BlcmFuZCA9IGZyMzBfY2dlbl9nZXRfdm1hX29wZXJhbmQ7Ci0gIGNkLT5zZXRfdm1hX29wZXJhbmQgPSBmcjMwX2NnZW5fc2V0X3ZtYV9vcGVyYW5kOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLW9wYy5jIGIvb3Bjb2Rlcy9mcjMwLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWE3ZTBhLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNjggKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIHRhYmxlIGZvciBmcjMwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJmcjMwLWRlc2MuaCIKLSNpbmNsdWRlICJmcjMwLW9wYy5oIgotCi0vKiBUaGUgaGFzaCBmdW5jdGlvbnMgYXJlIHJlY29yZGVkIGhlcmUgdG8gaGVscCBrZWVwIGFzc2VtYmxlciBjb2RlIG91dCBvZgotICAgdGhlIGRpc2Fzc2VtYmxlciBhbmQgdmljZSB2ZXJzYS4gICovCi0KLXN0YXRpYyBpbnQgYXNtX2hhc2hfaW5zbl9wIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGFzbV9oYXNoX2luc24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGRpc19oYXNoX2luc25fcCBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBkaXNfaGFzaF9pbnNuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgQ0dFTl9JTlNOX0lOVCkpOwotCi0vKiBJbnN0cnVjdGlvbiBmb3JtYXRzLiAgKi8KLQotI2RlZmluZSBGKGYpICYgZnIzMF9jZ2VuX2lmbGRfdGFibGVbQ09OQ0FUMiAoRlIzMF8sZildCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9lbXB0eSA9IHsKLSAgMCwgMCwgMHgwLCB7IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkopLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkaSA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfVTQpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkMiA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfTTQpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZGl2MHMgPSB7Ci0gIDE2LCAxNiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kaXYzID0gewotICAxNiwgMTYsIDB4ZmZmZiwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX09QNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTggPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9JOCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkyMCA9IHsKLSAgMTYsIDMyLCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX0kyMCksIEYgKEZfT1AyKSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTMyID0gewotICAxNiwgNDgsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfSTMyKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHIxNCA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0RJU1AxMCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHIxNHVoID0gewotICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfRElTUDkpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTR1YiA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0RJU1A4KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkcjE1ID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9VRElTUDYpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTVkciA9IHsKLSAgMTYsIDE2LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9SUzIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tb3ZkciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUlMxKSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NhbGwgPSB7Ci0gIDE2LCAxNiwgMHhmODAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDUpLCBGIChGX1JFTDEyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfaW50ID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9VOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JyYWQgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9DQyksIEYgKEZfUkVMOSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2Rtb3ZyMTMgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX0RJUjEwKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZG1vdnIxM2ggPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX0RJUjkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kbW92cjEzYiA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfRElSOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NvcG9wID0gewotICAxNiwgMzIsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfQ0NDKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfQ1JKKSwgRiAoRl9VNEMpLCBGIChGX0NSSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NvcGxkID0gewotICAxNiwgMzIsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfQ0NDKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUkpDKSwgRiAoRl9VNEMpLCBGIChGX0NSSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NvcHN0ID0gewotICAxNiwgMzIsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfQ0NDKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfQ1JKKSwgRiAoRl9VNEMpLCBGIChGX1JJQyksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZHNwID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9TMTApLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZG0wID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SRUdMSVNUX0xPV19MRCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkbTEgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JFR0xJU1RfSElfTEQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdG0wID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SRUdMSVNUX0xPV19TVCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0bTEgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JFR0xJU1RfSElfU1QpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9lbnRlciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfVTEwKSwgMCB9Ci19OwotCi0jdW5kZWYgRgotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKLSNkZWZpbmUgTU5FTSBDR0VOX1NZTlRBWF9NTkVNT05JQyAvKiBzeW50YXggdmFsdWUgZm9yIG1uZW1vbmljICovCi0jZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKEZSMzBfT1BFUkFORF8sb3ApCi0jZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QQ09ERSBmcjMwX2NnZW5faW5zbl9vcGNvZGVfdGFibGVbTUFYX0lOU05TXSA9Ci17Ci0gIC8qIFNwZWNpYWwgbnVsbCBmaXJzdCBlbnRyeS4KLSAgICAgQSBgbnVtJyB2YWx1ZSBvZiB6ZXJvIGlzIHRodXMgaW52YWxpZC4KLSAgICAgQWxzbywgdGhlIHNwZWNpYWwgYGludmFsaWQnIGluc24gcmVzaWRlcyBoZXJlLiAgKi8KLSAgeyB7IDAgfSB9LAotLyogYWRkICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGE2MDAgfQotICB9LAotLyogYWRkICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhhNDAwIH0KLSAgfSwKLS8qIGFkZDIgJG00LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKE00KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMiwgeyAweGE1MDAgfQotICB9LAotLyogYWRkYyAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhNzAwIH0KLSAgfSwKLS8qIGFkZG4gJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YTIwMCB9Ci0gIH0sCi0vKiBhZGRuICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhhMDAwIH0KLSAgfSwKLS8qIGFkZG4yICRtNCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChNNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZDIsIHsgMHhhMTAwIH0KLSAgfSwKLS8qIHN1YiAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhYzAwIH0KLSAgfSwKLS8qIHN1YmMgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YWQwMCB9Ci0gIH0sCi0vKiBzdWJuICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFlMDAgfQotICB9LAotLyogY21wICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFhMDAgfQotICB9LAotLyogY21wICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhhODAwIH0KLSAgfSwKLS8qIGNtcDIgJG00LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKE00KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMiwgeyAweGE5MDAgfQotICB9LAotLyogYW5kICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDgyMDAgfQotICB9LAotLyogb3IgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OTIwMCB9Ci0gIH0sCi0vKiBlb3IgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OWEwMCB9Ci0gIH0sCi0vKiBhbmQgJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ODQwMCB9Ci0gIH0sCi0vKiBhbmRoICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDg1MDAgfQotICB9LAotLyogYW5kYiAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4NjAwIH0KLSAgfSwKLS8qIG9yICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDk0MDAgfQotICB9LAotLyogb3JoICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDk1MDAgfQotICB9LAotLyogb3JiICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDk2MDAgfQotICB9LAotLyogZW9yICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDljMDAgfQotICB9LAotLyogZW9yaCAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5ZDAwIH0KLSAgfSwKLS8qIGVvcmIgJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OWUwMCB9Ci0gIH0sCi0vKiBiYW5kbCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4ODAwMCB9Ci0gIH0sCi0vKiBib3JsICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg5MDAwIH0KLSAgfSwKLS8qIGJlb3JsICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg5ODAwIH0KLSAgfSwKLS8qIGJhbmRoICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg4MTAwIH0KLSAgfSwKLS8qIGJvcmggJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDkxMDAgfQotICB9LAotLyogYmVvcmggJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDk5MDAgfQotICB9LAotLyogYnRzdGwgJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDg4MDAgfQotICB9LAotLyogYnRzdGggJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDg5MDAgfQotICB9LAotLyogbXVsICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFmMDAgfQotICB9LAotLyogbXVsdSAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhYjAwIH0KLSAgfSwKLS8qIG11bGggJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YmYwMCB9Ci0gIH0sCi0vKiBtdWx1aCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhiYjAwIH0KLSAgfSwKLS8qIGRpdjBzICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTc0MCB9Ci0gIH0sCi0vKiBkaXYwdSAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3NTAgfQotICB9LAotLyogZGl2MSAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3NjAgfQotICB9LAotLyogZGl2MiAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3NzAgfQotICB9LAotLyogZGl2MyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWY2MCB9Ci0gIH0sCi0vKiBkaXY0cyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWY3MCB9Ci0gIH0sCi0vKiBsc2wgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YjYwMCB9Ci0gIH0sCi0vKiBsc2wgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGI0MDAgfQotICB9LAotLyogbHNsMiAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YjUwMCB9Ci0gIH0sCi0vKiBsc3IgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YjIwMCB9Ci0gIH0sCi0vKiBsc3IgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGIwMDAgfQotICB9LAotLyogbHNyMiAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YjEwMCB9Ci0gIH0sCi0vKiBhc3IgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YmEwMCB9Ci0gIH0sCi0vKiBhc3IgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGI4MDAgfQotICB9LAotLyogYXNyMiAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YjkwMCB9Ci0gIH0sCi0vKiBsZGk6OCAkaTgsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTgpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGk4LCB7IDB4YzAwMCB9Ci0gIH0sCi0vKiBsZGk6MjAgJGkyMCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJMjApLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGkyMCwgeyAweDliMDAgfQotICB9LAotLyogbGRpOjMyICRpMzIsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTMyKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMzIsIHsgMHg5ZjgwIH0KLSAgfSwKLS8qIGxkIEAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDQwMCB9Ci0gIH0sCi0vKiBsZHVoIEAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDUwMCB9Ci0gIH0sCi0vKiBsZHViIEAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDYwMCB9Ci0gIH0sCi0vKiBsZCBAKCRSMTMsJFJqKSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDAgfQotICB9LAotLyogbGR1aCBAKCRSMTMsJFJqKSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwMCB9Ci0gIH0sCi0vKiBsZHViIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjAwIH0KLSAgfSwKLS8qIGxkIEAoJFIxNCwkZGlzcDEwKSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDEwKSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNCwgeyAweDIwMDAgfQotICB9LAotLyogbGR1aCBAKCRSMTQsJGRpc3A5KSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDkpLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE0dWgsIHsgMHg0MDAwIH0KLSAgfSwKLS8qIGxkdWIgQCgkUjE0LCRkaXNwOCksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1A4KSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNHViLCB7IDB4NjAwMCB9Ci0gIH0sCi0vKiBsZCBAKCRSMTUsJHVkaXNwNiksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxNSksICcsJywgT1AgKFVESVNQNiksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTUsIHsgMHgzMDAgfQotICB9LAotLyogbGQgQCRSMTUrLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjE1KSwgJysnLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDcwMCB9Ci0gIH0sCi0vKiBsZCBAJFIxNSssJFJzMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjE1KSwgJysnLCAnLCcsIE9QIChSUzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTVkciwgeyAweDc4MCB9Ci0gIH0sCi0vKiBsZCBAJFIxNSssJHBzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTUpLCAnKycsICcsJywgT1AgKFBTKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg3OTAgfQotICB9LAotLyogc3QgJFJpLEAkUmogKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCBPUCAoUkopLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTQwMCB9Ci0gIH0sCi0vKiBzdGggJFJpLEAkUmogKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCBPUCAoUkopLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTUwMCB9Ci0gIH0sCi0vKiBzdGIgJFJpLEAkUmogKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCBPUCAoUkopLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTYwMCB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjEzLCRSaikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwMDAgfQotICB9LAotLyogc3RoICRSaSxAKCRSMTMsJFJqKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTEwMCB9Ci0gIH0sCi0vKiBzdGIgJFJpLEAoJFIxMywkUmopICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMjAwIH0KLSAgfSwKLS8qIHN0ICRSaSxAKCRSMTQsJGRpc3AxMCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQMTApLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNCwgeyAweDMwMDAgfQotICB9LAotLyogc3RoICRSaSxAKCRSMTQsJGRpc3A5KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1A5KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTR1aCwgeyAweDUwMDAgfQotICB9LAotLyogc3RiICRSaSxAKCRSMTQsJGRpc3A4KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1A4KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTR1YiwgeyAweDcwMDAgfQotICB9LAotLyogc3QgJFJpLEAoJFIxNSwkdWRpc3A2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxNSksICcsJywgT1AgKFVESVNQNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE1LCB7IDB4MTMwMCB9Ci0gIH0sCi0vKiBzdCAkUmksQC0kUjE1ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJy0nLCBPUCAoUjE1KSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4MTcwMCB9Ci0gIH0sCi0vKiBzdCAkUnMyLEAtJFIxNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJTMiksICcsJywgJ0AnLCAnLScsIE9QIChSMTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTVkciwgeyAweDE3ODAgfQotICB9LAotLyogc3QgJHBzLEAtJFIxNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFBTKSwgJywnLCAnQCcsICctJywgT1AgKFIxNSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4MTc5MCB9Ci0gIH0sCi0vKiBtb3YgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OGIwMCB9Ci0gIH0sCi0vKiBtb3YgJFJzMSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSUzEpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9tb3ZkciwgeyAweGI3MDAgfQotICB9LAotLyogbW92ICRwcywkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChQUyksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4MTcxMCB9Ci0gIH0sCi0vKiBtb3YgJFJpLCRSczEgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgT1AgKFJTMSksIDAgfSB9LAotICAgICYgaWZtdF9tb3ZkciwgeyAweGIzMDAgfQotICB9LAotLyogbW92ICRSaSwkcHMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgT1AgKFBTKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4NzEwIH0KLSAgfSwKLS8qIGptcCBAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3MDAgfQotICB9LAotLyogam1wOmQgQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5ZjAwIH0KLSAgfSwKLS8qIGNhbGwgQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzEwIH0KLSAgfSwKLS8qIGNhbGw6ZCBAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDlmMTAgfQotICB9LAotLyogY2FsbCAkbGFiZWwxMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMMTIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY2FsbCwgeyAweGQwMDAgfQotICB9LAotLyogY2FsbDpkICRsYWJlbDEyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUwxMiksIDAgfSB9LAotICAgICYgaWZtdF9jYWxsLCB7IDB4ZDgwMCB9Ci0gIH0sCi0vKiByZXQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDk3MjAgfQotICB9LAotLyogcmV0OmQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmMjAgfQotICB9LAotLyogaW50ICR1OCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU4KSwgMCB9IH0sCi0gICAgJiBpZm10X2ludCwgeyAweDFmMDAgfQotICB9LAotLyogaW50ZSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWYzMCB9Ci0gIH0sCi0vKiByZXRpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5NzMwIH0KLSAgfSwKLS8qIGJyYTpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGYwMDAgfQotICB9LAotLyogYnJhICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGUwMDAgfQotICB9LAotLyogYm5vOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjEwMCB9Ci0gIH0sCi0vKiBibm8gJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTEwMCB9Ci0gIH0sCi0vKiBiZXE6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmMjAwIH0KLSAgfSwKLS8qIGJlcSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlMjAwIH0KLSAgfSwKLS8qIGJuZTpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGYzMDAgfQotICB9LAotLyogYm5lICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGUzMDAgfQotICB9LAotLyogYmM6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmNDAwIH0KLSAgfSwKLS8qIGJjICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU0MDAgfQotICB9LAotLyogYm5jOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjUwMCB9Ci0gIH0sCi0vKiBibmMgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTUwMCB9Ci0gIH0sCi0vKiBibjpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY2MDAgfQotICB9LAotLyogYm4gJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTYwMCB9Ci0gIH0sCi0vKiBicDpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY3MDAgfQotICB9LAotLyogYnAgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTcwMCB9Ci0gIH0sCi0vKiBidjpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY4MDAgfQotICB9LAotLyogYnYgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTgwMCB9Ci0gIH0sCi0vKiBibnY6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmOTAwIH0KLSAgfSwKLS8qIGJudiAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlOTAwIH0KLSAgfSwKLS8qIGJsdDpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZhMDAgfQotICB9LAotLyogYmx0ICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGVhMDAgfQotICB9LAotLyogYmdlOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmIwMCB9Ci0gIH0sCi0vKiBiZ2UgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWIwMCB9Ci0gIH0sCi0vKiBibGU6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmYzAwIH0KLSAgfSwKLS8qIGJsZSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlYzAwIH0KLSAgfSwKLS8qIGJndDpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZkMDAgfQotICB9LAotLyogYmd0ICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGVkMDAgfQotICB9LAotLyogYmxzOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmUwMCB9Ci0gIH0sCi0vKiBibHMgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWUwMCB9Ci0gIH0sCi0vKiBiaGk6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmZjAwIH0KLSAgfSwKLS8qIGJoaSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlZjAwIH0KLSAgfSwKLS8qIGRtb3YgJFIxMyxAJGRpcjEwICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUjEzKSwgJywnLCAnQCcsIE9QIChESVIxMCksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzLCB7IDB4MTgwMCB9Ci0gIH0sCi0vKiBkbW92aCAkUjEzLEAkZGlyOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFIxMyksICcsJywgJ0AnLCBPUCAoRElSOSksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzaCwgeyAweDE5MDAgfQotICB9LAotLyogZG1vdmIgJFIxMyxAJGRpcjggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSMTMpLCAnLCcsICdAJywgT1AgKERJUjgpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2IsIHsgMHgxYTAwIH0KLSAgfSwKLS8qIGRtb3YgQCRSMTMrLEAkZGlyMTAgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxMyksICcrJywgJywnLCAnQCcsIE9QIChESVIxMCksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzLCB7IDB4MWMwMCB9Ci0gIH0sCi0vKiBkbW92aCBAJFIxMyssQCRkaXI5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTMpLCAnKycsICcsJywgJ0AnLCBPUCAoRElSOSksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzaCwgeyAweDFkMDAgfQotICB9LAotLyogZG1vdmIgQCRSMTMrLEAkZGlyOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAnLCcsICdAJywgT1AgKERJUjgpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxM2IsIHsgMHgxZTAwIH0KLSAgfSwKLS8qIGRtb3YgQCRSMTUrLEAkZGlyMTAgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxNSksICcrJywgJywnLCAnQCcsIE9QIChESVIxMCksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzLCB7IDB4MWIwMCB9Ci0gIH0sCi0vKiBkbW92IEAkZGlyMTAsJFIxMyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSMTApLCAnLCcsIE9QIChSMTMpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweDgwMCB9Ci0gIH0sCi0vKiBkbW92aCBAJGRpcjksJFIxMyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSOSksICcsJywgT1AgKFIxMyksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzaCwgeyAweDkwMCB9Ci0gIH0sCi0vKiBkbW92YiBAJGRpcjgsJFIxMyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoRElSOCksICcsJywgT1AgKFIxMyksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzYiwgeyAweGEwMCB9Ci0gIH0sCi0vKiBkbW92IEAkZGlyMTAsQCRSMTMrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVIxMCksICcsJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweGMwMCB9Ci0gIH0sCi0vKiBkbW92aCBAJGRpcjksQCRSMTMrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVI5KSwgJywnLCAnQCcsIE9QIChSMTMpLCAnKycsIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzaCwgeyAweGQwMCB9Ci0gIH0sCi0vKiBkbW92YiBAJGRpcjgsQCRSMTMrICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVI4KSwgJywnLCAnQCcsIE9QIChSMTMpLCAnKycsIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzYiwgeyAweGUwMCB9Ci0gIH0sCi0vKiBkbW92IEAkZGlyMTAsQC0kUjE1ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVIxMCksICcsJywgJ0AnLCAnLScsIE9QIChSMTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfZG1vdnIxMywgeyAweGIwMCB9Ci0gIH0sCi0vKiBsZHJlcyBAJFJpKywkdTQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJJKSwgJysnLCAnLCcsIE9QIChVNCksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YmMwMCB9Ci0gIH0sCi0vKiBzdHJlcyAkdTQsQCRSaSsgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAnKycsIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YmQwMCB9Ci0gIH0sCi0vKiBjb3BvcCAkdTRjLCRjY2MsJENSaiwkQ1JpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTRDKSwgJywnLCBPUCAoQ0NDKSwgJywnLCBPUCAoQ1JKKSwgJywnLCBPUCAoQ1JJKSwgMCB9IH0sCi0gICAgJiBpZm10X2NvcG9wLCB7IDB4OWZjMCB9Ci0gIH0sCi0vKiBjb3BsZCAkdTRjLCRjY2MsJFJqYywkQ1JpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTRDKSwgJywnLCBPUCAoQ0NDKSwgJywnLCBPUCAoUkpDKSwgJywnLCBPUCAoQ1JJKSwgMCB9IH0sCi0gICAgJiBpZm10X2NvcGxkLCB7IDB4OWZkMCB9Ci0gIH0sCi0vKiBjb3BzdCAkdTRjLCRjY2MsJENSaiwkUmljICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTRDKSwgJywnLCBPUCAoQ0NDKSwgJywnLCBPUCAoQ1JKKSwgJywnLCBPUCAoUklDKSwgMCB9IH0sCi0gICAgJiBpZm10X2NvcHN0LCB7IDB4OWZlMCB9Ci0gIH0sCi0vKiBjb3BzdiAkdTRjLCRjY2MsJENSaiwkUmljICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTRDKSwgJywnLCBPUCAoQ0NDKSwgJywnLCBPUCAoQ1JKKSwgJywnLCBPUCAoUklDKSwgMCB9IH0sCi0gICAgJiBpZm10X2NvcHN0LCB7IDB4OWZmMCB9Ci0gIH0sCi0vKiBub3AgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDlmYTAgfQotICB9LAotLyogYW5kY2NyICR1OCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU4KSwgMCB9IH0sCi0gICAgJiBpZm10X2ludCwgeyAweDgzMDAgfQotICB9LAotLyogb3JjY3IgJHU4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfaW50LCB7IDB4OTMwMCB9Ci0gIH0sCi0vKiBzdGlsbSAkdTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVOCksIDAgfSB9LAotICAgICYgaWZtdF9pbnQsIHsgMHg4NzAwIH0KLSAgfSwKLS8qIGFkZHNwICRzMTAgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTMTApLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkc3AsIHsgMHhhMzAwIH0KLSAgfSwKLS8qIGV4dHNiICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTc4MCB9Ci0gIH0sCi0vKiBleHR1YiAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3OTAgfQotICB9LAotLyogZXh0c2ggJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5N2EwIH0KLSAgfSwKLS8qIGV4dHVoICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTdiMCB9Ci0gIH0sCi0vKiBsZG0wICgkcmVnbGlzdF9sb3dfbGQpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnKCcsIE9QIChSRUdMSVNUX0xPV19MRCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkbTAsIHsgMHg4YzAwIH0KLSAgfSwKLS8qIGxkbTEgKCRyZWdsaXN0X2hpX2xkKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJygnLCBPUCAoUkVHTElTVF9ISV9MRCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkbTEsIHsgMHg4ZDAwIH0KLSAgfSwKLS8qIHN0bTAgKCRyZWdsaXN0X2xvd19zdCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICcoJywgT1AgKFJFR0xJU1RfTE9XX1NUKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RtMCwgeyAweDhlMDAgfQotICB9LAotLyogc3RtMSAoJHJlZ2xpc3RfaGlfc3QpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnKCcsIE9QIChSRUdMSVNUX0hJX1NUKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RtMSwgeyAweDhmMDAgfQotICB9LAotLyogZW50ZXIgJHUxMCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFUxMCksIDAgfSB9LAotICAgICYgaWZtdF9lbnRlciwgeyAweGYwMCB9Ci0gIH0sCi0vKiBsZWF2ZSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWY5MCB9Ci0gIH0sCi0vKiB4Y2hiIEAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDhhMDAgfQotICB9LAotfTsKLQotI3VuZGVmIEEKLSN1bmRlZiBNTkVNCi0jdW5kZWYgT1BFUkFORAotI3VuZGVmIE9QCi0KLS8qIEZvcm1hdHMgZm9yIEFMSUFTIG1hY3JvLWluc25zLiAgKi8KLQotI2RlZmluZSBGKGYpICYgZnIzMF9jZ2VuX2lmbGRfdGFibGVbQ09OQ0FUMiAoRlIzMF8sZildCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGk4bSA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0k4KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTIwbSA9IHsKLSAgMTYsIDMyLCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkkpLCBGIChGX0kyMCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTMybSA9IHsKLSAgMTYsIDQ4LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9SSSksIEYgKEZfSTMyKSwgMCB9Ci19OwotCi0jdW5kZWYgRgotCi0vKiBFYWNoIG5vbi1zaW1wbGUgbWFjcm8gZW50cnkgcG9pbnRzIHRvIGFuIGFycmF5IG9mIGV4cGFuc2lvbiBwb3NzaWJpbGl0aWVzLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE1ORU0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMgLyogc3ludGF4IHZhbHVlIGZvciBtbmVtb25pYyAqLwotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChGUjMwX09QRVJBTkRfLG9wKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgbWFjcm8gaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JQkFTRSBmcjMwX2NnZW5fbWFjcm9faW5zbl90YWJsZVtdID0KLXsKLS8qIGxkaTggJGk4LCRSaSAqLwotICB7Ci0gICAgLTEsICJsZGk4bSIsICJsZGk4IiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaTIwICRpMjAsJFJpICovCi0gIHsKLSAgICAtMSwgImxkaTIwbSIsICJsZGkyMCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGkzMiAkaTMyLCRSaSAqLwotICB7Ci0gICAgLTEsICJsZGkzMm0iLCAibGRpMzIiLCA0OCwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotfTsKLQotLyogVGhlIG1hY3JvIGluc3RydWN0aW9uIG9wY29kZSB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QQ09ERSBmcjMwX2NnZW5fbWFjcm9faW5zbl9vcGNvZGVfdGFibGVbXSA9Ci17Ci0vKiBsZGk4ICRpOCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJOCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaThtLCB7IDB4YzAwMCB9Ci0gIH0sCi0vKiBsZGkyMCAkaTIwLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEkyMCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaTIwbSwgeyAweDliMDAgfQotICB9LAotLyogbGRpMzIgJGkzMiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJMzIpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGkzMm0sIHsgMHg5ZjgwIH0KLSAgfSwKLX07Ci0KLSN1bmRlZiBBCi0jdW5kZWYgTU5FTQotI3VuZGVmIE9QRVJBTkQKLSN1bmRlZiBPUAotCi0jaWZuZGVmIENHRU5fQVNNX0hBU0hfUAotI2RlZmluZSBDR0VOX0FTTV9IQVNIX1AoaW5zbikgMQotI2VuZGlmCi0KLSNpZm5kZWYgQ0dFTl9ESVNfSEFTSF9QCi0jZGVmaW5lIENHRU5fRElTX0hBU0hfUChpbnNuKSAxCi0jZW5kaWYKLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIElOU04gaXMgdG8gYmUgYWRkZWQgdG8gdGhlIGhhc2ggdGFibGUuCi0gICBUYXJnZXRzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIENHRU5fe0FTTSxESVN9X0hBU0hfUCBpbiB0aGUgLm9wYyBmaWxlLiAgKi8KLQotc3RhdGljIGludAotYXNtX2hhc2hfaW5zbl9wIChpbnNuKQotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci17Ci0gIHJldHVybiBDR0VOX0FTTV9IQVNIX1AgKGluc24pOwotfQotCi1zdGF0aWMgaW50Ci1kaXNfaGFzaF9pbnNuX3AgKGluc24pCi0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLXsKLSAgLyogSWYgYnVpbGRpbmcgdGhlIGhhc2ggdGFibGUgYW5kIHRoZSBOTy1ESVMgYXR0cmlidXRlIGlzIHByZXNlbnQsCi0gICAgIGlnbm9yZS4gICovCi0gIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX05PX0RJUykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBDR0VOX0RJU19IQVNIX1AgKGluc24pOwotfQotCi0jaWZuZGVmIENHRU5fQVNNX0hBU0gKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSF9TSVpFIDEyNwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSChtbmVtKSAoKih1bnNpZ25lZCBjaGFyICopIChtbmVtKSAlIENHRU5fQVNNX0hBU0hfU0laRSkKLSNlbHNlCi0jZGVmaW5lIENHRU5fQVNNX0hBU0gobW5lbSkgKCoodW5zaWduZWQgY2hhciAqKSAobW5lbSkgJSBDR0VOX0FTTV9IQVNIX1NJWkUpIC8qRklYTUUqLwotI2VuZGlmCi0jZW5kaWYKLQotLyogSXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UgdG8gcHJvdmlkZSBhIGRlZmF1bHQgaGVyZSwKLSAgIGJ1dCB3aGlsZSB0aGlzIGlzIHVuZGVyIGRldmVsb3BtZW50IHdlIGRvLgotICAgQlVGRkVSIGlzIGEgcG9pbnRlciB0byB0aGUgYnl0ZXMgb2YgdGhlIGluc24sIHRhcmdldCBvcmRlci4KLSAgIFZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIGFzIGFuIGludCBpbiBob3N0IG9yZGVyLiAgKi8KLQotI2lmbmRlZiBDR0VOX0RJU19IQVNICi0jZGVmaW5lIENHRU5fRElTX0hBU0hfU0laRSAyNTYKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSChidWYsIHZhbHVlKSAoKih1bnNpZ25lZCBjaGFyICopIChidWYpKQotI2VuZGlmCi0KLS8qIFRoZSByZXN1bHQgaXMgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIGluc24uCi0gICBUYXJnZXRzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIENHRU5fe0FTTSxESVN9X0hBU0ggaW4gdGhlIC5vcGMgZmlsZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWFzbV9oYXNoX2luc24gKG1uZW0pCi0gICAgIGNvbnN0IGNoYXIgKiBtbmVtOwotewotICByZXR1cm4gQ0dFTl9BU01fSEFTSCAobW5lbSk7Ci19Ci0KLS8qIEJVRiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ5dGVzIG9mIHRoZSBpbnNuLCB0YXJnZXQgb3JkZXIuCi0gICBWQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBhcyBhbiBpbnQgaW4gaG9zdCBvcmRlci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWRpc19oYXNoX2luc24gKGJ1ZiwgdmFsdWUpCi0gICAgIGNvbnN0IGNoYXIgKiBidWY7Ci0gICAgIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci17Ci0gIHJldHVybiBDR0VOX0RJU19IQVNIIChidWYsIHZhbHVlKTsKLX0KLQotLyogU2V0IHRoZSByZWNvcmRlZCBsZW5ndGggb2YgdGhlIGluc24gaW4gdGhlIENHRU5fRklFTERTIHN0cnVjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfZmllbGRzX2JpdHNpemUgKGZpZWxkcywgc2l6ZSkKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgaW50IHNpemU7Ci17Ci0gIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBzaXplOwotfQotCi0vKiBGdW5jdGlvbiB0byBjYWxsIGJlZm9yZSB1c2luZyB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZS4KLSAgIFRoaXMgcGx1Z3MgdGhlIG9wY29kZSBlbnRyaWVzIGFuZCBtYWNybyBpbnN0cnVjdGlvbnMgaW50byB0aGUgY3B1IHRhYmxlLiAgKi8KLQotdm9pZAotZnIzMF9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBudW1fbWFjcm9zID0gKHNpemVvZiAoZnIzMF9jZ2VuX21hY3JvX2luc25fdGFibGUpIC8KLQkJICAgIHNpemVvZiAoZnIzMF9jZ2VuX21hY3JvX2luc25fdGFibGVbMF0pKTsKLSAgY29uc3QgQ0dFTl9JQkFTRSAqaWIgPSAmIGZyMzBfY2dlbl9tYWNyb19pbnNuX3RhYmxlWzBdOwotICBjb25zdCBDR0VOX09QQ09ERSAqb2MgPSAmIGZyMzBfY2dlbl9tYWNyb19pbnNuX29wY29kZV90YWJsZVswXTsKLSAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgeG1hbGxvYyAobnVtX21hY3JvcyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIG1lbXNldCAoaW5zbnMsIDAsIG51bV9tYWNyb3MgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX21hY3JvczsgKytpKQotICAgIHsKLSAgICAgIGluc25zW2ldLmJhc2UgPSAmaWJbaV07Ci0gICAgICBpbnNuc1tpXS5vcGNvZGUgPSAmb2NbaV07Ci0gICAgfQotICBjZC0+bWFjcm9faW5zbl90YWJsZS5pbml0X2VudHJpZXMgPSBpbnNuczsKLSAgY2QtPm1hY3JvX2luc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBudW1fbWFjcm9zOwotCi0gIG9jID0gJiBmcjMwX2NnZW5faW5zbl9vcGNvZGVfdGFibGVbMF07Ci0gIGluc25zID0gKENHRU5fSU5TTiAqKSBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXM7Ci0gIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKLSAgICBpbnNuc1tpXS5vcGNvZGUgPSAmb2NbaV07Ci0KLSAgY2QtPnNpemVvZl9maWVsZHMgPSBzaXplb2YgKENHRU5fRklFTERTKTsKLSAgY2QtPnNldF9maWVsZHNfYml0c2l6ZSA9IHNldF9maWVsZHNfYml0c2l6ZTsKLQotICBjZC0+YXNtX2hhc2hfcCA9IGFzbV9oYXNoX2luc25fcDsKLSAgY2QtPmFzbV9oYXNoID0gYXNtX2hhc2hfaW5zbjsKLSAgY2QtPmFzbV9oYXNoX3NpemUgPSBDR0VOX0FTTV9IQVNIX1NJWkU7Ci0KLSAgY2QtPmRpc19oYXNoX3AgPSBkaXNfaGFzaF9pbnNuX3A7Ci0gIGNkLT5kaXNfaGFzaCA9IGRpc19oYXNoX2luc247Ci0gIGNkLT5kaXNfaGFzaF9zaXplID0gQ0dFTl9ESVNfSEFTSF9TSVpFOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLW9wYy5oIGIvb3Bjb2Rlcy9mcjMwLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg3ZWQ1Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBvcGNvZGUgaGVhZGVyIGZvciBmcjMwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIEZSMzBfT1BDX0gKLSNkZWZpbmUgRlIzMF9PUENfSAotCi0vKiAtLSBvcGMuaCAqLwotCi0vKiA/Pz8gVGhpcyBjYW4gYmUgaW1wcm92ZWQgdXBvbi4gICovCi0jdW5kZWYgQ0dFTl9ESVNfSEFTSF9TSVpFCi0jZGVmaW5lIENHRU5fRElTX0hBU0hfU0laRSAxNgotI3VuZGVmIENHRU5fRElTX0hBU0gKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSChidWZmZXIsIHZhbHVlKSAoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVswXSA+PiA0KQotCi0vKiAtLSAqLwotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgZnIzMCBpbnN0cnVjdGlvbiB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pbnNuX3R5cGUgewotICBGUjMwX0lOU05fSU5WQUxJRCwgRlIzMF9JTlNOX0FERCwgRlIzMF9JTlNOX0FEREksIEZSMzBfSU5TTl9BREQyCi0gLCBGUjMwX0lOU05fQUREQywgRlIzMF9JTlNOX0FERE4sIEZSMzBfSU5TTl9BREROSSwgRlIzMF9JTlNOX0FERE4yCi0gLCBGUjMwX0lOU05fU1VCLCBGUjMwX0lOU05fU1VCQywgRlIzMF9JTlNOX1NVQk4sIEZSMzBfSU5TTl9DTVAKLSAsIEZSMzBfSU5TTl9DTVBJLCBGUjMwX0lOU05fQ01QMiwgRlIzMF9JTlNOX0FORCwgRlIzMF9JTlNOX09SCi0gLCBGUjMwX0lOU05fRU9SLCBGUjMwX0lOU05fQU5ETSwgRlIzMF9JTlNOX0FOREgsIEZSMzBfSU5TTl9BTkRCCi0gLCBGUjMwX0lOU05fT1JNLCBGUjMwX0lOU05fT1JILCBGUjMwX0lOU05fT1JCLCBGUjMwX0lOU05fRU9STQotICwgRlIzMF9JTlNOX0VPUkgsIEZSMzBfSU5TTl9FT1JCLCBGUjMwX0lOU05fQkFOREwsIEZSMzBfSU5TTl9CT1JMCi0gLCBGUjMwX0lOU05fQkVPUkwsIEZSMzBfSU5TTl9CQU5ESCwgRlIzMF9JTlNOX0JPUkgsIEZSMzBfSU5TTl9CRU9SSAotICwgRlIzMF9JTlNOX0JUU1RMLCBGUjMwX0lOU05fQlRTVEgsIEZSMzBfSU5TTl9NVUwsIEZSMzBfSU5TTl9NVUxVCi0gLCBGUjMwX0lOU05fTVVMSCwgRlIzMF9JTlNOX01VTFVILCBGUjMwX0lOU05fRElWMFMsIEZSMzBfSU5TTl9ESVYwVQotICwgRlIzMF9JTlNOX0RJVjEsIEZSMzBfSU5TTl9ESVYyLCBGUjMwX0lOU05fRElWMywgRlIzMF9JTlNOX0RJVjRTCi0gLCBGUjMwX0lOU05fTFNMLCBGUjMwX0lOU05fTFNMSSwgRlIzMF9JTlNOX0xTTDIsIEZSMzBfSU5TTl9MU1IKLSAsIEZSMzBfSU5TTl9MU1JJLCBGUjMwX0lOU05fTFNSMiwgRlIzMF9JTlNOX0FTUiwgRlIzMF9JTlNOX0FTUkkKLSAsIEZSMzBfSU5TTl9BU1IyLCBGUjMwX0lOU05fTERJOCwgRlIzMF9JTlNOX0xESTIwLCBGUjMwX0lOU05fTERJMzIKLSAsIEZSMzBfSU5TTl9MRCwgRlIzMF9JTlNOX0xEVUgsIEZSMzBfSU5TTl9MRFVCLCBGUjMwX0lOU05fTERSMTMKLSAsIEZSMzBfSU5TTl9MRFIxM1VILCBGUjMwX0lOU05fTERSMTNVQiwgRlIzMF9JTlNOX0xEUjE0LCBGUjMwX0lOU05fTERSMTRVSAotICwgRlIzMF9JTlNOX0xEUjE0VUIsIEZSMzBfSU5TTl9MRFIxNSwgRlIzMF9JTlNOX0xEUjE1R1IsIEZSMzBfSU5TTl9MRFIxNURSCi0gLCBGUjMwX0lOU05fTERSMTVQUywgRlIzMF9JTlNOX1NULCBGUjMwX0lOU05fU1RILCBGUjMwX0lOU05fU1RCCi0gLCBGUjMwX0lOU05fU1RSMTMsIEZSMzBfSU5TTl9TVFIxM0gsIEZSMzBfSU5TTl9TVFIxM0IsIEZSMzBfSU5TTl9TVFIxNAotICwgRlIzMF9JTlNOX1NUUjE0SCwgRlIzMF9JTlNOX1NUUjE0QiwgRlIzMF9JTlNOX1NUUjE1LCBGUjMwX0lOU05fU1RSMTVHUgotICwgRlIzMF9JTlNOX1NUUjE1RFIsIEZSMzBfSU5TTl9TVFIxNVBTLCBGUjMwX0lOU05fTU9WLCBGUjMwX0lOU05fTU9WRFIKLSAsIEZSMzBfSU5TTl9NT1ZQUywgRlIzMF9JTlNOX01PVjJEUiwgRlIzMF9JTlNOX01PVjJQUywgRlIzMF9JTlNOX0pNUAotICwgRlIzMF9JTlNOX0pNUEQsIEZSMzBfSU5TTl9DQUxMUiwgRlIzMF9JTlNOX0NBTExSRCwgRlIzMF9JTlNOX0NBTEwKLSAsIEZSMzBfSU5TTl9DQUxMRCwgRlIzMF9JTlNOX1JFVCwgRlIzMF9JTlNOX1JFVF9ELCBGUjMwX0lOU05fSU5UCi0gLCBGUjMwX0lOU05fSU5URSwgRlIzMF9JTlNOX1JFVEksIEZSMzBfSU5TTl9CUkFELCBGUjMwX0lOU05fQlJBCi0gLCBGUjMwX0lOU05fQk5PRCwgRlIzMF9JTlNOX0JOTywgRlIzMF9JTlNOX0JFUUQsIEZSMzBfSU5TTl9CRVEKLSAsIEZSMzBfSU5TTl9CTkVELCBGUjMwX0lOU05fQk5FLCBGUjMwX0lOU05fQkNELCBGUjMwX0lOU05fQkMKLSAsIEZSMzBfSU5TTl9CTkNELCBGUjMwX0lOU05fQk5DLCBGUjMwX0lOU05fQk5ELCBGUjMwX0lOU05fQk4KLSAsIEZSMzBfSU5TTl9CUEQsIEZSMzBfSU5TTl9CUCwgRlIzMF9JTlNOX0JWRCwgRlIzMF9JTlNOX0JWCi0gLCBGUjMwX0lOU05fQk5WRCwgRlIzMF9JTlNOX0JOViwgRlIzMF9JTlNOX0JMVEQsIEZSMzBfSU5TTl9CTFQKLSAsIEZSMzBfSU5TTl9CR0VELCBGUjMwX0lOU05fQkdFLCBGUjMwX0lOU05fQkxFRCwgRlIzMF9JTlNOX0JMRQotICwgRlIzMF9JTlNOX0JHVEQsIEZSMzBfSU5TTl9CR1QsIEZSMzBfSU5TTl9CTFNELCBGUjMwX0lOU05fQkxTCi0gLCBGUjMwX0lOU05fQkhJRCwgRlIzMF9JTlNOX0JISSwgRlIzMF9JTlNOX0RNT1ZSMTMsIEZSMzBfSU5TTl9ETU9WUjEzSAotICwgRlIzMF9JTlNOX0RNT1ZSMTNCLCBGUjMwX0lOU05fRE1PVlIxM1BJLCBGUjMwX0lOU05fRE1PVlIxM1BJSCwgRlIzMF9JTlNOX0RNT1ZSMTNQSUIKLSAsIEZSMzBfSU5TTl9ETU9WUjE1UEksIEZSMzBfSU5TTl9ETU9WMlIxMywgRlIzMF9JTlNOX0RNT1YyUjEzSCwgRlIzMF9JTlNOX0RNT1YyUjEzQgotICwgRlIzMF9JTlNOX0RNT1YyUjEzUEksIEZSMzBfSU5TTl9ETU9WMlIxM1BJSCwgRlIzMF9JTlNOX0RNT1YyUjEzUElCLCBGUjMwX0lOU05fRE1PVjJSMTVQRAotICwgRlIzMF9JTlNOX0xEUkVTLCBGUjMwX0lOU05fU1RSRVMsIEZSMzBfSU5TTl9DT1BPUCwgRlIzMF9JTlNOX0NPUExECi0gLCBGUjMwX0lOU05fQ09QU1QsIEZSMzBfSU5TTl9DT1BTViwgRlIzMF9JTlNOX05PUCwgRlIzMF9JTlNOX0FORENDUgotICwgRlIzMF9JTlNOX09SQ0NSLCBGUjMwX0lOU05fU1RJTE0sIEZSMzBfSU5TTl9BRERTUCwgRlIzMF9JTlNOX0VYVFNCCi0gLCBGUjMwX0lOU05fRVhUVUIsIEZSMzBfSU5TTl9FWFRTSCwgRlIzMF9JTlNOX0VYVFVILCBGUjMwX0lOU05fTERNMAotICwgRlIzMF9JTlNOX0xETTEsIEZSMzBfSU5TTl9TVE0wLCBGUjMwX0lOU05fU1RNMSwgRlIzMF9JTlNOX0VOVEVSCi0gLCBGUjMwX0lOU05fTEVBVkUsIEZSMzBfSU5TTl9YQ0hCLCBGUjMwX0lOU05fTUFYCi19IENHRU5fSU5TTl9UWVBFOwotCi0vKiBJbmRleCBvZiBgaW52YWxpZCcgaW5zbiBwbGFjZSBob2xkZXIuICAqLwotI2RlZmluZSBDR0VOX0lOU05fSU5WQUxJRCBGUjMwX0lOU05fSU5WQUxJRAotCi0vKiBUb3RhbCBudW1iZXIgb2YgaW5zbnMgaW4gdGFibGUuICAqLwotI2RlZmluZSBNQVhfSU5TTlMgKChpbnQpIEZSMzBfSU5TTl9NQVgpCi0KLS8qIFRoaXMgc3RydWN0IHJlY29yZHMgZGF0YSBwcmlvciB0byBpbnNlcnRpb24gb3IgYWZ0ZXIgZXh0cmFjdGlvbi4gICovCi1zdHJ1Y3QgY2dlbl9maWVsZHMKLXsKLSAgaW50IGxlbmd0aDsKLSAgbG9uZyBmX25pbDsKLSAgbG9uZyBmX29wMTsKLSAgbG9uZyBmX29wMjsKLSAgbG9uZyBmX29wMzsKLSAgbG9uZyBmX29wNDsKLSAgbG9uZyBmX29wNTsKLSAgbG9uZyBmX2NjOwotICBsb25nIGZfY2NjOwotICBsb25nIGZfUmo7Ci0gIGxvbmcgZl9SaTsKLSAgbG9uZyBmX1JzMTsKLSAgbG9uZyBmX1JzMjsKLSAgbG9uZyBmX1JqYzsKLSAgbG9uZyBmX1JpYzsKLSAgbG9uZyBmX0NSajsKLSAgbG9uZyBmX0NSaTsKLSAgbG9uZyBmX3U0OwotICBsb25nIGZfdTRjOwotICBsb25nIGZfaTQ7Ci0gIGxvbmcgZl9tNDsKLSAgbG9uZyBmX3U4OwotICBsb25nIGZfaTg7Ci0gIGxvbmcgZl9pMjBfNDsKLSAgbG9uZyBmX2kyMF8xNjsKLSAgbG9uZyBmX2kyMDsKLSAgbG9uZyBmX2kzMjsKLSAgbG9uZyBmX3VkaXNwNjsKLSAgbG9uZyBmX2Rpc3A4OwotICBsb25nIGZfZGlzcDk7Ci0gIGxvbmcgZl9kaXNwMTA7Ci0gIGxvbmcgZl9zMTA7Ci0gIGxvbmcgZl91MTA7Ci0gIGxvbmcgZl9yZWw5OwotICBsb25nIGZfZGlyODsKLSAgbG9uZyBmX2Rpcjk7Ci0gIGxvbmcgZl9kaXIxMDsKLSAgbG9uZyBmX3JlbDEyOwotICBsb25nIGZfcmVnbGlzdF9oaV9zdDsKLSAgbG9uZyBmX3JlZ2xpc3RfbG93X3N0OwotICBsb25nIGZfcmVnbGlzdF9oaV9sZDsKLSAgbG9uZyBmX3JlZ2xpc3RfbG93X2xkOwotfTsKLQotI2RlZmluZSBDR0VOX0lOSVRfUEFSU0Uob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9JTlNFUlQob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9FWFRSQUNUKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfUFJJTlQob2QpIFwKLXtcCi19Ci0KLQotI2VuZGlmIC8qIEZSMzBfT1BDX0ggKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvaDgzMDAtZGlzLmMgYi9vcGNvZGVzL2g4MzAwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc1M2E5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvaDgzMDAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgaDgzMDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIERFRklORV9UQUJMRQotCi0jZGVmaW5lIGg4X29wY29kZXMgaDhvcHMKLSNpbmNsdWRlICJvcGNvZGUvaDgzMDAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLQotLyogUnVuIHRocm91Z2ggdGhlIG9wY29kZXMgYW5kIHNvcnQgdGhlbSBpbnRvIG9yZGVyIHRvIG1ha2UgdGhlbSBlYXN5Ci0gICB0byBkaXNhc3NlbWJsZQotICovCi1zdGF0aWMgdm9pZAotYmZkX2g4X2Rpc2Fzc2VtYmxlX2luaXQgKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLQotICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOwotCi0gIGZvciAocCA9IGg4X29wY29kZXM7IHAtPm5hbWU7IHArKykKLSAgICB7Ci0gICAgICBpbnQgbjEgPSAwOwotICAgICAgaW50IG4yID0gMDsKLQotICAgICAgaWYgKChpbnQpIHAtPmRhdGEubmliWzBdIDwgMTYpCi0JewotCSAgbjEgPSAoaW50KSBwLT5kYXRhLm5pYlswXTsKLQl9Ci0gICAgICBlbHNlCi0JbjEgPSAwOwotICAgICAgaWYgKChpbnQpIHAtPmRhdGEubmliWzFdIDwgMTYpCi0JewotCSAgbjIgPSAoaW50KSBwLT5kYXRhLm5pYlsxXTsKLQl9Ci0gICAgICBlbHNlCi0JbjIgPSAwOwotCi0gICAgICAvKiBKdXN0IG1ha2Ugc3VyZSB0aGVyZSBhcmUgYW4gZXZlbiBudW1iZXIgb2YgbmliYmxlcyBpbiBpdCwgYW5kCi0JIHRoYXQgdGhlIGNvdW50IGlzIHRoZSBzYW1lIHMgdGhlIGxlbmd0aCAqLwotICAgICAgZm9yIChpID0gMDsgcC0+ZGF0YS5uaWJbaV0gIT0gRTsgaSsrKQotCS8qRU1QVFkqLyA7Ci0gICAgICBpZiAoaSAmIDEpCi0JYWJvcnQgKCk7Ci0gICAgICBwLT5sZW5ndGggPSBpIC8gMjsKLSAgICB9Ci0KLX0KLQotCi11bnNpZ25lZCBpbnQKLWJmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbywgbW9kZSkKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBpbnQgbW9kZTsKLXsKLSAgLyogRmluZCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHRhYmxlIGZvciB0aGlzIG9wY29kZSAqLwotICBzdGF0aWMgQ09OU1QgY2hhciAqcmVnbmFtZXNbXSA9Ci0gICAgewotICAgICAgInIwaCIsICJyMWgiLCAicjJoIiwgInIzaCIsICJyNGgiLCAicjVoIiwgInI2aCIsICJyN2giLAotICAgICAgInIwbCIsICJyMWwiLCAicjJsIiwgInIzbCIsICJyNGwiLCAicjVsIiwgInI2bCIsICJyN2wifTsKLSAgCi0gIHN0YXRpYyBDT05TVCBjaGFyICp3cmVnbmFtZXNbXSA9Ci0gICAgewotICAgICAgInIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwKLSAgICAgICJlMCIsICJlMSIsICJlMiIsICJlMyIsICJlNCIsICJlNSIsICJlNiIsICJlNyIKLSAgICAgIH07Ci0gIAotICBzdGF0aWMgQ09OU1QgY2hhciAqbHJlZ25hbWVzW10gPQotICAgIHsKLSAgICAgICJlcjAiLCAiZXIxIiwgImVyMiIsICJlcjMiLCAiZXI0IiwgImVyNSIsICJlcjYiLCAiZXI3IiwKLSAgICAgICJlcjAiLCAiZXIxIiwgImVyMiIsICJlcjMiLCAiZXI0IiwgImVyNSIsICJlcjYiLCAiZXI3IgotICAgICAgfQotICA7Ci0KLSAgaW50IHJzID0gMDsKLSAgaW50IHJkID0gMDsKLSAgaW50IHJkaXNwID0gMDsKLSAgaW50IGFicyA9IDA7Ci0gIGludCBiaXQgPSAwOwotICBpbnQgcGxlbiA9IDA7Ci0gIHN0YXRpYyBib29sZWFuIGluaXQgPSAwOwotICBzdHJ1Y3QgaDhfb3Bjb2RlICpxID0gaDhfb3Bjb2RlczsKLSAgY2hhciBDT05TVCAqKnByZWduYW1lcyA9IG1vZGUgIT0gMCA/IGxyZWduYW1lcyA6IHdyZWduYW1lczsKLSAgaW50IHN0YXR1czsKLSAgaW50IGw7Ci0gIAotICB1bnNpZ25lZCBjaGFyIGRhdGFbMjBdOyAgCi0gIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByaW50Zl9mdHlwZSBmcHJpbnRmID0gaW5mby0+ZnByaW50Zl9mdW5jOwotCi0gIGlmICghaW5pdCkKLSAgICB7Ci0gICAgICBiZmRfaDhfZGlzYXNzZW1ibGVfaW5pdCAoKTsKLSAgICAgIGluaXQgPSAxOwotICAgIH0KLQotICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jKGFkZHIsIGRhdGEsIDIsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApIAotICAgIHsKLSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKHN0YXR1cywgYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBmb3IgKGwgPSAyOyBzdGF0dXMgPT0gMCAmJiBsIDwgMTA7IGwrPTIpCi0gICAgewotICAgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyhhZGRyK2wsIGRhdGErbCwgMiwgaW5mbyk7Ci0gICAgfQotICAKLSAgCi0KLSAgLyogRmluZCB0aGUgZXhhY3Qgb3Bjb2RlL2FyZyBjb21ibyAqLwotICB3aGlsZSAocS0+bmFtZSkKLSAgICB7Ci0gICAgICBvcF90eXBlICpuaWI7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuID0gMDsKLQotICAgICAgbmliID0gcS0+ZGF0YS5uaWI7Ci0gICAgICAKLSAgICAgIHdoaWxlICgxKQotCXsKLQkgIG9wX3R5cGUgbG9va2luZ19mb3IgPSAqbmliOwotCSAgaW50IHRoaXNuaWIgPSBkYXRhW2xlbiA+PiAxXTsKLQkgIAotCSAgdGhpc25pYiA9IChsZW4gJiAxKSA/ICh0aGlzbmliICYgMHhmKSA6ICgodGhpc25pYiA+PiA0KSAmIDB4Zik7Ci0JICAKLQkgIGlmIChsb29raW5nX2ZvciA8IDE2ICYmIGxvb2tpbmdfZm9yID49MCkgCi0JICAgIHsKLQkgICAgICAKLQkgICAgICBpZiAobG9va2luZ19mb3IgIT0gdGhpc25pYikgCi0JCWdvdG8gZmFpbDsKLQkgICAgfQotCSAgCi0JICBlbHNlIAotCSAgICB7Ci0JICAgICAgCi0JICAgICAgaWYgKChpbnQpIGxvb2tpbmdfZm9yICYgKGludCkgQjMxKQotCQl7Ci0JCSAgaWYgKCEgKCgoaW50KSB0aGlzbmliICYgMHg4KSAhPSAwKSkgCi0JCSAgICBnb3RvIGZhaWw7Ci0JCSAgbG9va2luZ19mb3IgPSAob3BfdHlwZSkgKChpbnQpIGxvb2tpbmdfZm9yICYgfihpbnQpIEIzMSk7Ci0JCX0KLQkgICAgICBpZiAoKGludCkgbG9va2luZ19mb3IgJiAoaW50KSBCMzApCi0JCXsKLQkJICBpZiAoISgoKGludCkgdGhpc25pYiAmIDB4OCkgPT0gMCkpIAotCQkgICAgZ290byBmYWlsOwotCQkgIGxvb2tpbmdfZm9yID0gKG9wX3R5cGUpICgoaW50KSBsb29raW5nX2ZvciAmIH4oaW50KSBCMzApOwotCQl9Ci0KLQkgICAgICBpZiAobG9va2luZ19mb3IgJiBEQklUKQotCQl7Ci0JCSAgaWYgKChsb29raW5nX2ZvciAmIDUpICE9ICh0aGlzbmliICY1KSkgZ290byBmYWlsOwotCQkgIGFicyA9ICh0aGlzbmliICYgMHg4KSA/IDIgOiAxOwotCQl9CQkgIAotCSAgICAgIAotCSAgICAgIGVsc2UgIGlmIChsb29raW5nX2ZvciAmIChSRUcgfCBJTkR8SU5DfERFQykpCi0JCXsKLQkJICBpZiAobG9va2luZ19mb3IgJiBTUkMpCi0JCSAgICB7Ci0JCSAgICAgIHJzID0gdGhpc25pYjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHJkID0gdGhpc25pYjsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8xNikKLQkJewotCQkgIGFicyA9IChkYXRhW2xlbiA+PiAxXSkgKiAyNTYgKyBkYXRhWyhsZW4gKyAyKSA+PiAxXTsKLQkJICBwbGVuID0gMTY7Ci0JICAgICAgCi0JCX0KLQkgICAgICBlbHNlIGlmKGxvb2tpbmdfZm9yICYgQUJTSk1QKQotCQl7Ci0JCSAgYWJzID0KLQkJICAgIChkYXRhWzFdIDw8IDE2KQotCQkgICAgICB8IChkYXRhWzJdIDw8IDgpCi0JCQl8IChkYXRhWzNdKTsKLQkJfQotCSAgICAgIGVsc2UgaWYobG9va2luZ19mb3IgJiBNRU1JTkQpCi0JCXsKLQkJICBhYnMgPSBkYXRhWzFdOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzMyKQotCQl7Ci0JCSAgaW50IGkgPSBsZW4gPj4gMTsKLQkJICBhYnMgPSAoZGF0YVtpXSA8PCAyNCkKLQkJICAgIHwgKGRhdGFbaSArIDFdIDw8IDE2KQotCQkgICAgICB8IChkYXRhW2kgKyAyXSA8PCA4KQotCQkJfCAoZGF0YVtpKyAzXSk7Ci0KLQkJICBwbGVuID0zMjsKLQkgICAgICAKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8yNCkKLQkJewotCQkgIGludCBpID0gbGVuID4+IDE7Ci0JCSAgYWJzID0gKGRhdGFbaV0gPDwgMTYpIHwgKGRhdGFbaSArIDFdIDw8IDgpfCAgKGRhdGFbaSsyXSk7Ci0JCSAgcGxlbiA9MjQ7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIElHTk9SRSkKLQkJewotCQkgIAotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBESVNQUkVHKQotCQl7Ci0JCSAgcmRpc3AgPSB0aGlzbmliOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBLQklUKQotCQl7Ci0JCSAgc3dpdGNoICh0aGlzbmliKSAKLQkJICAgIHsKLQkJICAgIGNhc2UgOToKLQkJICAgICAgYWJzID0gNDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDg6Ci0JCSAgICAgIGFicyA9IDI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAwOgotCQkgICAgICBhYnMgPSAxOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGdvdG8gZmFpbDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF84KQotCQl7Ci0JCSAgcGxlbiA9IDg7CQkgIAotCQkgIGFicyA9IGRhdGFbbGVuID4+IDFdOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzMpCi0JCXsKLQkJICBiaXQgPSB0aGlzbmliICYgMHg3OwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzIpCi0JCXsKLQkJICBwbGVuID0gMjsKLQkJICBhYnMgPSB0aGlzbmliICYgMHgzOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBNQUNSRUcpCi0JCXsKLQkJICBhYnMgPSAodGhpc25pYiA9PSAzKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yID09IEUpCi0JCXsKLQotCQkgIHsKLQkJICAgIGludCBpOwotCi0JCSAgICBmb3IgKGkgPSAwOyBpIDwgcS0+bGVuZ3RoOyBpKyspCi0JCSAgICAgIHsKLQkJCWZwcmludGYgKHN0cmVhbSwgIiUwMnggIiwgZGF0YVtpXSk7Ci0JCSAgICAgIH0KLQkJICAgIGZvciAoOyBpIDwgNjsgaSsrKQotCQkgICAgICB7Ci0JCQlmcHJpbnRmIChzdHJlYW0sICIgICAiKTsKLQkJICAgICAgfQotCQkgIH0KLQkJICBmcHJpbnRmIChzdHJlYW0sICIlc1x0IiwgcS0+bmFtZSk7Ci0KLQkJICAvKiBHcm9zcy4gIERpc2d1c3RpbmcuICAqLwotCQkgIGlmIChzdHJjbXAgKHEtPm5hbWUsICJsZG0ubCIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGludCBjb3VudCwgaGlnaDsKLQotCQkgICAgICBjb3VudCA9IChkYXRhWzFdID4+IDQpICYgMHgzOwotCQkgICAgICBoaWdoID0gZGF0YVszXSAmIDB4NzsKLQotCQkgICAgICBmcHJpbnRmIChzdHJlYW0sICJAc3ArLGVyJWQtZXIlZCIsIGhpZ2ggLSBjb3VudCwgaGlnaCk7Ci0JCSAgICAgIHJldHVybiBxLT5sZW5ndGg7Ci0JCSAgICB9Ci0KLQkJICBpZiAoc3RyY21wIChxLT5uYW1lLCAic3RtLmwiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBpbnQgY291bnQsIGxvdzsKLQotCQkgICAgICBjb3VudCA9IChkYXRhWzFdID4+IDQpICYgMHgzOwotCQkgICAgICBsb3cgPSBkYXRhWzNdICYgMHg3OwotCi0JCSAgICAgIGZwcmludGYgKHN0cmVhbSwgImVyJWQtZXIlZCxALXNwIiwgbG93LCBsb3cgKyBjb3VudCk7Ci0JCSAgICAgIHJldHVybiBxLT5sZW5ndGg7Ci0JCSAgICB9Ci0KLQkJICAvKiBGaWxsIGluIHRoZSBhcmdzICovCi0JCSAgewotCQkgICAgb3BfdHlwZSAqYXJncyA9IHEtPmFyZ3MubmliOwotCQkgICAgaW50IGhhZG9uZSA9IDA7Ci0KLQotCQkgICAgd2hpbGUgKCphcmdzICE9IEUpCi0JCSAgICAgIHsKLQkJCWludCB4ID0gKmFyZ3M7Ci0JCQlpZiAoaGFkb25lKQotCQkJICBmcHJpbnRmIChzdHJlYW0sICIsIik7Ci0KLQotCQkJaWYgKHggJiBMXzMpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICIjMHgleCIsICh1bnNpZ25lZCkgYml0KTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIChJTU18S0JJVHxEQklUKSkKLQkJCSAgewotCQkJICAgIC8qIEJsZXRjaC4gIEZvciBzaGFsICMyLGVyMCBhbmQgZnJpZW5kcy4gICovCi0JCQkgICAgaWYgKCooYXJncysxKSAmIFNSQ19JTl9EU1QpCi0JCQkgICAgICBhYnMgPSAyOwotCi0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiIzB4JXgiLCAodW5zaWduZWQpIGFicyk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBSRUcpCi0JCQkgIHsKLQkJCSAgICBpbnQgcm4gPSAoeCAmIERTVCkgPyByZCA6IHJzOwotCQkJICAgIHN3aXRjaCAoeCAmIFNJWkUpCi0JCQkgICAgICB7Ci0JCQkgICAgICBjYXNlIExfODoKLQkJCQlmcHJpbnRmIChzdHJlYW0sICIlcyIsIHJlZ25hbWVzW3JuXSk7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlIExfMTY6Ci0JCQkJZnByaW50ZiAoc3RyZWFtLCAiJXMiLCB3cmVnbmFtZXNbcm5dKTsKLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgTF9QOgotCQkJICAgICAgY2FzZSBMXzMyOgotCQkJCWZwcmludGYgKHN0cmVhbSwgIiVzIiwgbHJlZ25hbWVzW3JuXSk7Ci0JCQkJYnJlYWs7Ci0JCSAgICAKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIE1BQ1JFRykKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIm1hYyVjIiwgYWJzID8gJ2wnIDogJ2gnKTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIElOQykKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAlcysiLCBwcmVnbmFtZXNbcnNdKTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIERFQykKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAtJXMiLCBwcmVnbmFtZXNbcmRdKTsKLQkJCSAgfQotCi0JCQllbHNlIGlmICh4ICYgSU5EKQotCQkJICB7Ci0JCQkgICAgaW50IHJuID0gKHggJiBEU1QpID8gcmQgOiByczsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAJXMiLCBwcmVnbmFtZXNbcm5dKTsKLQkJCSAgfQotCi0JCQllbHNlIGlmICh4ICYgQUJTOE1FTSkKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAweCV4OjgiLCAodW5zaWduZWQpIGFicyk7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIChBQlN8QUJTSk1QKSkKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAweCV4OiVkIiwgKHVuc2lnbmVkKSBhYnMsIHBsZW4pOwotCQkJICB9Ci0KLQkJCWVsc2UgaWYgKHggJiBNRU1JTkQpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAQCVkICgleCkiLCBhYnMsIGFicyk7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIFBDUkVMKQotCQkJICB7Ci0JCQkgICAgaWYgKHggJiBMXzE2KSAKLQkJCSAgICAgIHsKLQkJCQlhYnMgICs9MjsKLQkJCQlmcHJpbnRmIChzdHJlYW0sICIuJXMlZCAoJXgpIiwgKHNob3J0KSBhYnMgPiAwID8gIisiIDogIiIsIChzaG9ydCkgYWJzLAotCQkJCQkgYWRkciArIChzaG9ydCkgYWJzICsgMik7Ci0JCQkgICAgICB9Ci0JCQkgICAgZWxzZSB7Ci0JCQkgICAgICBmcHJpbnRmIChzdHJlYW0sICIuJXMlZCAoJXgpIiwgKGNoYXIpIGFicyA+IDAgPyAiKyIgOiAiIiwgKGNoYXIpIGFicywKLQkJCQkgICAgICAgYWRkciArIChjaGFyKSBhYnMgKyAyKTsKLQkJCSAgICB9Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBESVNQKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQCgweCV4OiVkLCVzKSIsIGFicyxwbGVuLCBwcmVnbmFtZXNbcmRpc3BdKTsKLQkJCSAgfQotCi0JCQllbHNlIGlmICh4ICYgQ0NSKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiY2NyIik7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKHggJiBFWFIpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJleHIiKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJICBmcHJpbnRmIChzdHJlYW0sIF8oIkhtbW1tICV4IiksIHgpOwotCQkJaGFkb25lID0gMTsKLQkJCWFyZ3MrKzsKLQkJICAgICAgfQotCQkgIH0KLQkJICByZXR1cm4gcS0+bGVuZ3RoOwotCQl9Ci0KLSAgICAgIAotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSAgZnByaW50ZiAoc3RyZWFtLCBfKCJEb24ndCB1bmRlcnN0YW5kICV4IFxuIiksIGxvb2tpbmdfZm9yKTsKLQkJfQotCSAgICB9Ci0JICAKLQkgIGxlbisrOwotCSAgbmliKys7Ci0JfQotICAgICAgCi0gICAgZmFpbDoKLSAgICAgIHErKzsKLSAgICB9Ci0KLSAgLyogRmVsbCBvZiB0aGUgZW5kICovCi0gIGZwcmludGYgKHN0cmVhbSwgIiUwMnggJTAyeCAgICAgICAgLndvcmRcdEgnJXgsSCcleCIsCi0JICAgZGF0YVswXSwgZGF0YVsxXSwKLQkgICBkYXRhWzBdLCBkYXRhWzFdKTsKLSAgcmV0dXJuIDI7Ci19Ci0KLWludCAKLXByaW50X2luc25faDgzMDAgKGFkZHIsIGluZm8pCi1iZmRfdm1hIGFkZHI7IAotZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGJmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbyAsIDApOwotfQotCi1pbnQgCi1wcmludF9pbnNuX2g4MzAwaCAoYWRkciwgaW5mbykKLWJmZF92bWEgYWRkcjsKLWRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBiZmRfaDhfZGlzYXNzZW1ibGUgKGFkZHIsIGluZm8gLCAxKTsKLX0KLQotaW50IAotcHJpbnRfaW5zbl9oODMwMHMgKGFkZHIsIGluZm8pCi1iZmRfdm1hIGFkZHI7Ci1kaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gYmZkX2g4X2Rpc2Fzc2VtYmxlIChhZGRyLCBpbmZvICwgMik7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2g4NTAwLWRpcy5jIGIvb3Bjb2Rlcy9oODUwMC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4NThjOS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2g4NTAwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIGg4NTAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBESVNBU1NFTUJMRVJfVEFCTEUKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0KLSNpbmNsdWRlICJoODUwMC1vcGMuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIE1heGltdW0gbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDgKLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi1zdHJ1Y3QgcHJpdmF0ZQotewotICAvKiBQb2ludHMgdG8gZmlyc3QgYnl0ZSBub3QgZmV0Y2hlZC4gICovCi0gIGJmZF9ieXRlICptYXhfZmV0Y2hlZDsKLSAgYmZkX2J5dGUgdGhlX2J1ZmZlcltNQVhMRU5dOwotICBiZmRfdm1hIGluc25fc3RhcnQ7Ci0gIGptcF9idWYgYmFpbG91dDsKLX07Ci0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKLSAgKChhZGRyKSA8PSAoKHN0cnVjdCBwcml2YXRlICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCi0gICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChhZGRyKSkpCi0KLXN0YXRpYyBpbnQKLWZldGNoX2RhdGEgKGluZm8sIGFkZHIpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgaW50IHN0YXR1czsKLSAgc3RydWN0IHByaXZhdGUgKnByaXYgPSAoc3RydWN0IHByaXZhdGUgKikgaW5mby0+cHJpdmF0ZV9kYXRhOwotICBiZmRfdm1hIHN0YXJ0ID0gcHJpdi0+aW5zbl9zdGFydCArIChwcml2LT5tYXhfZmV0Y2hlZCAtIHByaXYtPnRoZV9idWZmZXIpOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHN0YXJ0LAotCQkJCSAgICAgIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGFkZHIgLSBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHN0YXJ0LCBpbmZvKTsKLSAgICAgIGxvbmdqbXAgKHByaXYtPmJhaWxvdXQsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHByaXYtPm1heF9mZXRjaGVkID0gYWRkcjsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICpjcm5hbWVbXSA9Ci17InNyIiwgImNjciIsICIqIiwgImJyIiwgImVwIiwgImRwIiwgIioiLCAidHAifTsKLQotaW50Ci1wcmludF9pbnNuX2g4NTAwIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByaW50Zl9mdHlwZSBmdW5jID0gaW5mby0+ZnByaW50Zl9mdW5jOwotCi0gIHN0cnVjdCBwcml2YXRlIHByaXY7Ci0gIGJmZF9ieXRlICpidWZmZXIgPSBwcml2LnRoZV9idWZmZXI7Ci0KLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJiBwcml2OwotICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOwotICBwcml2Lmluc25fc3RhcnQgPSBhZGRyOwotICBpZiAoc2V0am1wIChwcml2LmJhaWxvdXQpICE9IDApCi0gICAgLyogRXJyb3IgcmV0dXJuLiAgKi8KLSAgICByZXR1cm4gLTE7Ci0KLWlmICgwKSAgewotICAgIHN0YXRpYyAgICBpbnQgb25lOwotICAgIGlmICghb25lICkgCi0gICAgICB7Ci0Jb25lID0gMTsKLQlmb3IgKG9wY29kZSA9IGg4NTAwX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotCSAgewotCSAgICBpZiAoKG9wY29kZS0+Ynl0ZXNbMF0uY29udGVudHMgJiAweDgpID09IDApCi0JICAgICAgcHJpbnRmKCIlc1xuIiwgb3Bjb2RlLT5uYW1lKTsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0KLSAgLyogUnVuIGRvd24gdGhlIHRhYmxlIHRvIGZpbmQgdGhlIG9uZSB3aGljaCBtYXRjaGVzICovCi0gIGZvciAob3Bjb2RlID0gaDg1MDBfdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgaW50IGJ5dGU7Ci0gICAgICBpbnQgcm4gPSAwOwotICAgICAgaW50IHJkID0gMDsKLSAgICAgIGludCBycyA9IDA7Ci0gICAgICBpbnQgZGlzcCA9IDA7Ci0gICAgICBpbnQgYWJzID0gMDsKLSAgICAgIGludCBpbW0gPSAwOwotICAgICAgaW50IHBjcmVsID0gMDsKLSAgICAgIGludCBxaW0gPSAwOwotICAgICAgaW50IGk7Ci0gICAgICBpbnQgY3IgPSAwOwotICAgICAgZm9yIChieXRlID0gMDsgYnl0ZSA8IG9wY29kZS0+bGVuZ3RoOyBieXRlKyspCi0JewotCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDEpOwotCSAgaWYgKChidWZmZXJbYnl0ZV0gJiBvcGNvZGUtPmJ5dGVzW2J5dGVdLm1hc2spCi0JICAgICAgIT0gKG9wY29kZS0+Ynl0ZXNbYnl0ZV0uY29udGVudHMpKQotCSAgICB7Ci0JICAgICAgZ290byBuZXh0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBleHRyYWN0IGFueSBpbmZvIHBhcnRzICovCi0JICAgICAgc3dpdGNoIChvcGNvZGUtPmJ5dGVzW2J5dGVdLmluc2VydCkKLQkJewotCQljYXNlIDA6Ci0JCWNhc2UgRlA6Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBmdW5jIChzdHJlYW0sIF8oImNhbid0IGNvcGUgd2l0aCBpbnNlcnQgJWRcbiIpLAotCQkJb3Bjb2RlLT5ieXRlc1tieXRlXS5pbnNlcnQpOwotCQkgIGJyZWFrOwotCQljYXNlIFJOOgotCQkgIHJuID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGJyZWFrOwotCQljYXNlIFJTOgotCQkgIHJzID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGJyZWFrOwotCQljYXNlIENSQjoKLQkJICBjciA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKLQkJICBpZiAoY3IgPT0gMCkKLQkJICAgIGdvdG8gbmV4dDsKLQkJICBicmVhazsKLQkJY2FzZSBDUlc6Ci0JCSAgY3IgPSBidWZmZXJbYnl0ZV0gJiAweDc7Ci0JCSAgaWYgKGNyICE9IDApCi0JCSAgICBnb3RvIG5leHQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgRElTUDE2OgotCQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAyKTsKLQkJICBkaXNwID0gKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKTsKLQkJICBicmVhazsKLQkJY2FzZSBGUElORF9EODoKLQkJY2FzZSBESVNQODoKLQkJICBkaXNwID0gKChjaGFyKSAoYnVmZmVyW2J5dGVdKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUkQ6Ci0JCWNhc2UgUkRJTkQ6Ci0JCSAgcmQgPSBidWZmZXJbYnl0ZV0gJiAweDc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMjQ6Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDMpOwotCQkgIGFicyA9Ci0JCSAgICAoYnVmZmVyW2J5dGVdIDw8IDE2KQotCQkgICAgfCAoYnVmZmVyW2J5dGUgKyAxXSA8PCA4KQotCQkgICAgfCAoYnVmZmVyW2J5dGUgKyAyXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMTY6Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDIpOwotCQkgIGFicyA9IChidWZmZXJbYnl0ZV0gPDwgOCkgfCAoYnVmZmVyW2J5dGUgKyAxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTODoKLQkJICBhYnMgPSAoYnVmZmVyW2J5dGVdKTsKLQkJICBicmVhazsKLQkJY2FzZSBJTU0xNjoKLQkJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMik7Ci0JCSAgaW1tID0gKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKTsKLQkJICBicmVhazsKLQkJY2FzZSBJTU00OgotCQkgIGltbSA9IChidWZmZXJbYnl0ZV0pICYgMHhmOwotCQkgIGJyZWFrOwotCQljYXNlIElNTTg6Ci0JCWNhc2UgUkxJU1Q6Ci0JCSAgaW1tID0gKGJ1ZmZlcltieXRlXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUENSRUwxNjoKLQkJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMik7Ci0JCSAgcGNyZWwgPSAoYnVmZmVyW2J5dGVdIDw8IDgpIHwgKGJ1ZmZlcltieXRlICsgMV0pOwotCQkgIGJyZWFrOwotCQljYXNlIFBDUkVMODoKLQkJICBwY3JlbCA9IChidWZmZXJbYnl0ZV0pOwotCQkgIGJyZWFrOwotCQljYXNlIFFJTToKLQkJICBzd2l0Y2ggKGJ1ZmZlcltieXRlXSAmIDB4NykKLQkJICAgIHsKLQkJICAgIGNhc2UgMDoKLQkJICAgICAgcWltID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDE6Ci0JCSAgICAgIHFpbSA9IDI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSA0OgotCQkgICAgICBxaW0gPSAtMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDU6Ci0JCSAgICAgIHFpbSA9IC0yOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBXZSBnZXQgaGVyZSB3aGVuIGFsbCB0aGUgbWFza3MgaGF2ZSBwYXNzZWQgc28gd2UgY2FuIG91dHB1dCB0aGUKLQkgb3BlcmFuZHMqLwotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgb3Bjb2RlLT5sZW5ndGgpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG9wY29kZS0+bGVuZ3RoOyBpKyspCi0JewotCSAgKGZ1bmMpIChzdHJlYW0sICIlMDJ4ICIsIGJ1ZmZlcltpXSk7Ci0JfQotICAgICAgZm9yICg7IGkgPCA2OyBpKyspCi0JewotCSAgKGZ1bmMpIChzdHJlYW0sICIgICAiKTsKLQl9Ci0gICAgICAoZnVuYykgKHN0cmVhbSwgIiVzXHQiLCBvcGNvZGUtPm5hbWUpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG9wY29kZS0+bmFyZ3M7IGkrKykKLQl7Ci0JICBpZiAoaSkKLQkgICAgKGZ1bmMpIChzdHJlYW0sICIsIik7Ci0JICBzd2l0Y2ggKG9wY29kZS0+YXJnX3R5cGVbaV0pCi0JICAgIHsKLQkgICAgY2FzZSBGUDoKLQkgICAgICBmdW5jIChzdHJlYW0sICJmcCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOSU5EX0QxNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6MTYsciVkKSIsIGRpc3AsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklORF9EODoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6OCAoJWQpLHIlZCkiLCBkaXNwICYgMHhmZiwgZGlzcCwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJESU5EX0QxNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6MTYsciVkKSIsIGRpc3AsIHJkKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRElORF9EODoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6OCAoJWQpLCByJWQpIiwgZGlzcCAmIDB4ZmYsIGRpc3AsIHJkKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGUElORF9EODoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAKDB4JXg6OCAoJWQpLCBmcCkiLCBkaXNwICYgMHhmZiwgZGlzcCwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENSQjoKLQkgICAgY2FzZSBDUlc6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBjcm5hbWVbY3JdKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTjoKLQkgICAgICBmdW5jIChzdHJlYW0sICJyJWQiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkQ6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiciVkIiwgcmQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJTOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgInIlZCIsIHJzKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTkRFQzoKLQkgICAgICBmdW5jIChzdHJlYW0sICJALXIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklOQzoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAciVkKyIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTklORDoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJESU5EOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkByJWQiLCByZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1BJTkM6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQHNwKyIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNQREVDOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAtc3AiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlMyNDoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAMHglMHg6MjQiLCBhYnMpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzE2OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAweCUweDoxNiIsIGFicyAmIDB4ZmZmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTODoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAMHglMHg6OCIsIGFicyAmIDB4ZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTTE2OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMweCUweDoxNiIsIGltbSAmIDB4ZmZmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkxJU1Q6Ci0JICAgICAgewotCQlpbnQgaTsKLQkJaW50IG5jID0gMDsKLQkJZnVuYyAoc3RyZWFtLCAiKCIpOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkgIHsKLQkJICAgIGlmIChpbW0gJiAoMSA8PCBpKSkKLQkJICAgICAgewotCQkJZnVuYyAoc3RyZWFtLCAiciVkIiwgaSk7Ci0JCQlpZiAobmMpCi0JCQkgIGZ1bmMgKHN0cmVhbSwgIiwiKTsKLQkJCW5jID0gMTsKLQkJICAgICAgfQotCQkgIH0KLQkJZnVuYyAoc3RyZWFtLCAiKSIpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU04OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMweCUweDo4IiwgaW1tICYgMHhmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUwxNjoKLQkgICAgICBmdW5jIChzdHJlYW0sICIweCUweDoxNiIsIChwY3JlbCArIGFkZHIgKyBvcGNvZGUtPmxlbmd0aCkgJiAweGZmZmYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMODoKLQkgICAgICBmdW5jIChzdHJlYW0sICIjMHglMHg6OCIsCi0JCSAgICAoKGNoYXIpIHBjcmVsICsgYWRkciArIG9wY29kZS0+bGVuZ3RoKSAmIDB4ZmZmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUUlNOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMlZDpxIiwgcWltKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU00OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMlZDo0IiwgaW1tKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiBvcGNvZGUtPmxlbmd0aDsKLSAgICBuZXh0OjsKLSAgICB9Ci0KLSAgLyogQ291bGRuJ3QgdW5kZXJzdGFuZCBhbnl0aGluZyAqLwotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmdW5jIChzdHJlYW0sIF8oIiUwMnhcdFx0KnVua25vd24qIiksIGJ1ZmZlclswXSk7Ci0gIHJldHVybiAxOwotCi19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2g4NTAwLW9wYy5oIGIvb3Bjb2Rlcy9oODUwMC1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5NDlhZi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2g4NTAwLW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzgzNiArMCwwIEBACi10eXBlZGVmIGVudW0KLXsKLSAgR1IwLEdSMSxHUjIsR1IzLEdSNCxHUjUsR1I2LEdSNywKLSAgR1BSMCwgR1BSMSwgR1BSMiwgR1BSMywgR1BSNCwgR1BSNSwgR1BSNiwgR1BSNywKLSAgR0NDUiwgR1BDLCAKLSAgR1NFR0MsIEdTRUdELCBHU0VHRSwgR1NFR1QsR0xBU1QKLX0gZ2RicmVnX3R5cGU7Ci0jZGVmaW5lIE9fWE9SQyAxCi0jZGVmaW5lIE9fWE9SIDIKLSNkZWZpbmUgT19YQ0ggMwotI2RlZmluZSBPX1VOTEsgNAotI2RlZmluZSBPX1RTVCA1Ci0jZGVmaW5lIE9fVFJBUEEgNgotI2RlZmluZSBPX1RSQVBfVlMgNwotI2RlZmluZSBPX1RBUyA4Ci0jZGVmaW5lIE9fU1dBUCA5Ci0jZGVmaW5lIE9fU1VCWCAxMAotI2RlZmluZSBPX1NVQlMgMTEKLSNkZWZpbmUgT19TVUIgMTIKLSNkZWZpbmUgT19TVE0gMTMKLSNkZWZpbmUgT19TVEMgMTQKLSNkZWZpbmUgT19TTEVFUCAxNQotI2RlZmluZSBPX1NITFIgMTYKLSNkZWZpbmUgT19TSExMIDE3Ci0jZGVmaW5lIE9fU0hBUiAxOAotI2RlZmluZSBPX1NIQUwgMTkKLSNkZWZpbmUgT19TQ0JfTkUgMjAKLSNkZWZpbmUgT19TQ0JfRiAyMQotI2RlZmluZSBPX1NDQl9FUSAyMgotI2RlZmluZSBPX1JUUyAyMwotI2RlZmluZSBPX1JURCAyNAotI2RlZmluZSBPX1JPVFhSIDI1Ci0jZGVmaW5lIE9fUk9UWEwgMjYKLSNkZWZpbmUgT19ST1RSIDI3Ci0jZGVmaW5lIE9fUk9UTCAyOAotI2RlZmluZSBPX1BSVFMgMjkKLSNkZWZpbmUgT19QUlREIDMwCi0jZGVmaW5lIE9fUEpTUiAzMQotI2RlZmluZSBPX1BKTVAgMzIKLSNkZWZpbmUgT19PUkMgMzMKLSNkZWZpbmUgT19PUiAzNAotI2RlZmluZSBPX05PVCAzNQotI2RlZmluZSBPX05PUCAzNgotI2RlZmluZSBPX05FRyAzNwotI2RlZmluZSBPX01VTFhVIDM4Ci0jZGVmaW5lIE9fTU9WVFBFIDM5Ci0jZGVmaW5lIE9fTU9WRlBFIDQwCi0jZGVmaW5lIE9fTU9WIDQxCi0jZGVmaW5lIE9fTElOSyA0MgotI2RlZmluZSBPX0xETSA0MwotI2RlZmluZSBPX0xEQyA0NAotI2RlZmluZSBPX0pTUiA0NQotI2RlZmluZSBPX0pNUCA0NgotI2RlZmluZSBPX0VYVFUgNDcKLSNkZWZpbmUgT19FWFRTIDQ4Ci0jZGVmaW5lIE9fRFNVQiA0OQotI2RlZmluZSBPX0RJVlhVIDUwCi0jZGVmaW5lIE9fREFERCA1MQotI2RlZmluZSBPX0NNUCA1MgotI2RlZmluZSBPX0NMUiA1MwotI2RlZmluZSBPX0JWUyA1NAotI2RlZmluZSBPX0JWQyA1NQotI2RlZmluZSBPX0JUU1QgNTYKLSNkZWZpbmUgT19CVCA1NwotI2RlZmluZSBPX0JTUiA1OAotI2RlZmluZSBPX0JTRVQgNTkKLSNkZWZpbmUgT19CUk4gNjAKLSNkZWZpbmUgT19CUkEgNjEKLSNkZWZpbmUgT19CUFQgNjIKLSNkZWZpbmUgT19CUEwgNjMKLSNkZWZpbmUgT19CTk9UIDY0Ci0jZGVmaW5lIE9fQk5FIDY1Ci0jZGVmaW5lIE9fQk1JIDY2Ci0jZGVmaW5lIE9fQkxUIDY3Ci0jZGVmaW5lIE9fQkxTIDY4Ci0jZGVmaW5lIE9fQkxPIDY5Ci0jZGVmaW5lIE9fQkxFIDcwCi0jZGVmaW5lIE9fQkhTIDcxCi0jZGVmaW5lIE9fQkhJIDcyCi0jZGVmaW5lIE9fQkdUIDczCi0jZGVmaW5lIE9fQkdFIDc0Ci0jZGVmaW5lIE9fQkYgNzUKLSNkZWZpbmUgT19CRVEgNzYKLSNkZWZpbmUgT19CQ1MgNzcKLSNkZWZpbmUgT19CQ0xSIDc4Ci0jZGVmaW5lIE9fQkNDIDc5Ci0jZGVmaW5lIE9fQU5EQyA4MAotI2RlZmluZSBPX0FORCA4MQotI2RlZmluZSBPX0FERFggODIKLSNkZWZpbmUgT19BRERTIDgzCi0jZGVmaW5lIE9fQUREIDg0Ci0jZGVmaW5lIE9fQllURSAxMjgKLSNkZWZpbmUgT19XT1JEIDB4MDAwCi0jZGVmaW5lIE9fVU5TWiAweDAwMAotI2RlZmluZSBGUElORF9EOAkxMAotI2RlZmluZSBSRElORF9EMTYJMTEKLSNkZWZpbmUgUkRJTkRfRDgJMTIKLSNkZWZpbmUgU1BERUMJMTMKLSNkZWZpbmUgUkRJTkQJMTQKLSNkZWZpbmUgUk4JMTUKLSNkZWZpbmUgUk5JTkRfRDgJMTYKLSNkZWZpbmUgUk5JTkRfRDE2CTE3Ci0jZGVmaW5lIFJOREVDCTE4Ci0jZGVmaW5lIFJOSU5DCTE5Ci0jZGVmaW5lIFJOSU5ECTIwCi0jZGVmaW5lIFNQSU5DCTIxCi0jZGVmaW5lIEFCUzE2CTIyCi0jZGVmaW5lIEFCUzI0CTIzCi0jZGVmaW5lIFBDUkVMMTYJMjQKLSNkZWZpbmUgUENSRUw4CTI1Ci0jZGVmaW5lIEFCUzgJMjYKLSNkZWZpbmUgQ1JCCTI3Ci0jZGVmaW5lIENSCTI4Ci0jZGVmaW5lIENSVwkyOQotI2RlZmluZSBESVNQMTYJMzAKLSNkZWZpbmUgRElTUDgJMzEKLSNkZWZpbmUgRlAJMzIKLSNkZWZpbmUgSU1NMTYJMzMKLSNkZWZpbmUgSU1NNAkzNAotI2RlZmluZSBJTU04CTM1Ci0jZGVmaW5lIFJMSVNUCTM2Ci0jZGVmaW5lIFFJTQkzNwotI2RlZmluZSBSRAkzOAotI2RlZmluZSBSUwkzOQotI2RlZmluZSBTUAk0MAotdHlwZWRlZiBlbnVtIHsgQUNfQkFELCBBQ19FSSwgQUNfUkksIEFDX0QsIEFDXyxBQ19FUlIsIEFDX1gsQUNfQiwgQUNfRUUsQUNfUlIsQUNfSUUsCi0gQUNfUkUsQUNfRSwgQUNfSSwgQUNfRVIsQUNfSVJSLCBBQ19JUiwgQUNfUkVSLCBBQ19FUkUsQUNfRUlFIH0gYWRkcl9jbGFzc190eXBlOyAKLXR5cGVkZWYgc3RydWN0IHsKLQlzaG9ydCBpbnQgaWR4OwotCWNoYXIgZmxhZ3Msc3JjMSxzcmMyLGRzdDsKLQl1bnNpZ25lZCBjaGFyIGZsYXZvcjsKLQljaGFyICpuYW1lOwotCWludCBuYXJnczsKLQlpbnQgYXJnX3R5cGVbMl07Ci0JaW50IGxlbmd0aDsKLQlzdHJ1Y3QgeyB1bnNpZ25lZCBjaGFyIGNvbnRlbnRzO3Vuc2lnbmVkIGNoYXIgbWFzazsgY2hhciBpbnNlcnQ7IH0gYnl0ZXNbNl07Ci19IGg4NTAwX29wY29kZV9pbmZvOwotaDg1MDBfb3Bjb2RlX2luZm8gaDg1MDBfdGFibGVbXQotI2lmZGVmIEFTU0VNQkxFUl9UQUJMRQotI2lmZGVmIERFRklORV9UQUJMRQotPXsKLS8qCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sCi0JCQkJCQkJCSAgIHsweDAwLDB4MDAsQUJTMTYgfSwKLQkJCQkJCQkJICAgezB4MDAsMHgwMCwgfSwKLQkJCQkJCQkJICAgezB4MDcsMHhmZiwgfSwKLQkJCQkJCQkJICAgezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwqLwotCi17MSwncycsJ0UnLCdDJywnQycsT19YT1JDfE9fV09SRCwieG9yYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsQ1JXIH19fSwKLXsyLCdzJywnRScsJ0MnLCdDJyxPX1hPUkN8T19CWVRFLCJ4b3JjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg2OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs2LCctJywnWCcsJyEnLCchJyxPX1hDSHxPX1dPUkQsInhjaC53IiwyLHtSUyxSRH0sMiwJe3sweGE4LDB4ZjgsUlMgfSx7MHg5MCwweGY4LFJEIH19fSwKLXs3LCctJywnWCcsJyEnLCchJyxPX1hDSHxPX1VOU1osInhjaCIsMix7UlMsUkR9LDIsCXt7MHhhOCwweGY4LFJTIH0sezB4OTAsMHhmOCxSRCB9fX0sCi17OCwnLScsJ0InLCchJywnIScsT19VTkxLfE9fVU5TWiwidW5sayIsMSx7RlAsMH0sMSwJe3sweDBmLDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezEyLCctJywnSScsJyEnLCchJyxPX1RSQVBBfE9fVU5TWiwidHJhcGEiLDEse0lNTTQsMH0sMiwJe3sweDA4LDB4ZmYsIH0sezB4MTAsMHhmMCxJTU00IH19fSwKLXsxMywnLScsJ0InLCchJywnIScsT19UUkFQX1ZTfE9fVU5TWiwidHJhcC92cyIsMCx7MCwwfSwxLAl7ezB4MDksMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MTYsJ20nLCdEJywnIScsJ0QnLE9fU1dBUHxPX0JZVEUsInN3YXAuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMCwweGZmLCB9fX0sCi17MTcsJ20nLCdEJywnIScsJ0QnLE9fU1dBUHxPX1VOU1osInN3YXAiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTAsMHhmZiwgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI3LCctJywnSScsJyEnLCdFJyxPX1NUTXxPX1VOU1osInN0bSIsMix7UkxJU1QsU1BERUN9LDIsCXt7MHgxMiwweGZmLCB9LHsweDAwLDB4MDAsUkxJU1QgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsUk59LDIsCQl7ezB4YTgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTn0sMiwJCXt7MHhhMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMSwnLScsJyEnLCchJywnIScsT19TTEVFUHxPX1VOU1osInNsZWVwIiwwLHswLDB9LDEsCXt7MHgxYSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0NCwnLScsJ0InLCdTJywnUycsT19TQ0JfTkV8T19VTlNaLCJzY2IvbmUiLDIse1JTLFBDUkVMOH0sMywJe3sweDA2LDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs0NSwnLScsJ0InLCdTJywnUycsT19TQ0JfRnxPX1VOU1osInNjYi9mIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwMSwweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NDYsJy0nLCdCJywnUycsJ1MnLE9fU0NCX0VRfE9fVU5TWiwic2NiL2VxIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwNywweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NDcsJy0nLCdCJywnIScsJyEnLE9fUlRTfE9fVU5TWiwicnRzIiwwLHswLDB9LDEsCXt7MHgxOSwweGZmLCB9fX0sCi17NDgsJy0nLCdCJywnIScsJyEnLE9fUlREfE9fVU5TWiwicnRkIiwxLHtJTU04LDB9LDIsCXt7MHgxNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17NDgsJy0nLCdCJywnIScsJyEnLE9fUlREfE9fVU5TWiwicnRkIiwxLHtJTU0xNiwwfSwzLAl7ezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjEsJy0nLCdCJywnIScsJyEnLE9fUFJUU3xPX1VOU1osInBydHMiLDAsezAsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4MTksMHhmZiwgfX19LAotezYyLCctJywnQicsJyEnLCchJyxPX1BSVER8T19VTlNaLCJwcnRkIiwxLHtJTU04LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs2MiwnLScsJ0InLCchJywnIScsT19QUlREfE9fVU5TWiwicHJ0ZCIsMSx7SU1NMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4MWMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezYzLCctJywnSicsJyEnLCchJyxPX1BKU1J8T19VTlNaLCJwanNyIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhjOCwweGY4LFJESU5EIH19fSwKLXs2MywnLScsJ0onLCchJywnIScsT19QSlNSfE9fVU5TWiwicGpzciIsMSx7QUJTMjQsMH0sNCwJe3sweDAzLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMyNCB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezY0LCctJywnSicsJyEnLCchJyxPX1BKTVB8T19VTlNaLCJwam1wIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhjMCwweGY4LFJESU5EIH19fSwKLXs2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7QUJTMjQsMH0sNCwJe3sweDEzLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMyNCB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezY1LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX1dPUkQsIm9yYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsQ1JXIH19fSwKLXs2NiwncycsJ0knLCdDJywnQycsT19PUkN8T19CWVRFLCJvcmMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDQ4LDB4ZjgsQ1JCIH19fSwKLXs2NywncycsJ0knLCdDJywnQycsT19PUkN8T19VTlNaLCJvcmMiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0OCwweGY4LENSQiB9fX0sCi17NjcsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fVU5TWiwib3JjIiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsQ1JXIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzQsJy0nLCchJywnIScsJyEnLE9fTk9QfE9fVU5TWiwibm9wIiwwLHswLDB9LDEsCXt7MHgwMCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk4sUkR9LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkMsUkR9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkQsUkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5ERUMsUkR9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7SU1NOCxSRH0sNCwJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7QUJTOCxSRH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkRfRDgsUkR9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0FCUzE2LFJEfSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORF9EMTYsUkR9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTixSRH0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5JTkMsUkR9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOSU5ELFJEfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTkRFQyxSRH0sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7SU1NOCxSRH0sNCwJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse0FCUzgsUkR9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTklORF9EOCxSRH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse0FCUzE2LFJEfSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5JTkRfRDE2LFJEfSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpzLnciLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4NiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6cy5iIiwyLHtSUyxBQlM4fSwyLAl7ezB4NzAsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODcsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OnMiLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4OCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6bC53IiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODksJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmwuYiIsMix7QUJTOCxSRH0sMiwJe3sweDYwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezkwLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpsIiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17OTEsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmkudyIsMix7SU1NMTYsUkR9LDMsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MiwnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6aSIsICAyLHtJTU0xNixSRH0sMywJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOLFJEfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORF9EOH0sNSx7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNix7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxSTkRFQ30sMywJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5JTkN9LDMsCXt7MHhjOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsQUJTOH0sNCwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTYsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmYudyIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5OCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTYsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmYudyIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTcsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmYuYiIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5MCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTcsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmYuYiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4MCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTgsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmYiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTgsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk4LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpmIiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDg4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5OSwnbScsJ0knLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6ZS5iIiwyLHtJTU04LFJEfSwyLAl7ezB4NTAsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAwLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjplIiwyLHtJTU04LFJEfSwyLAl7ezB4NTAsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0FCUzgsUkR9LDIsCXt7MHg2OCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4MCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxBQlM4fSwyLAl7ezB4NzAsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5MCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7QUJTOCxSRH0sMiwJe3sweDYwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezEwMiwnbScsJ0knLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7QUJTOCxSRH0sMiwJe3sweDY4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDg4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLS8qezEwMywnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsUkR9LDIsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwqLwotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUkR9LDMsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA0LCctJywnUycsJ0knLCchJyxPX0xJTkt8T19VTlNaLCJsaW5rIiwyLHtGUCxJTU04fSwyLAl7ezB4MTcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NMTZ9LDMsCXt7MHgxZiwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA1LCctJywnRScsJyEnLCdDJyxPX0xETXxPX1VOU1osImxkbSIsMix7U1BJTkMsUkxJU1R9LDIsCXt7MHgwMiwweGZmLCB9LHsweDAwLDB4MDAsUkxJU1QgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk4sQ1JXfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtSTklORCxDUld9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5JTkMsQ1JXfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOREVDLENSV30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtBQlM4LENSV30sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5JTkRfRDgsQ1JXfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse0FCUzE2LENSV30sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5JTkRfRDE2LENSV30sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk4sQ1JCfSwyLAkJe3sweGEwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTkRFQyxDUkJ9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkMsQ1JCfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5ELENSQn0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7QUJTOCxDUkJ9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5EX0Q4LENSQn0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7QUJTMTYsQ1JCfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORF9EMTYsQ1JCfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk4sQ1JXfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTixDUkJ9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5DLENSV30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkQsQ1JCfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTkRFQyxDUld9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5ELENSV30sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5ERUMsQ1JCfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklOQyxDUkJ9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0FCUzgsQ1JXfSwzLAkJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0FCUzgsQ1JCfSwzLAkJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0lNTTgsQ1JCfSwzLAkJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5EX0Q4LENSV30sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5EX0Q4LENSQn0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0FCUzE2LENSQn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0FCUzE2LENSV30sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5EX0QxNixDUld9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EMTYsQ1JCfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4ZDgsMHhmOCxSRCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7QUJTMTYsMH0sMywJe3sweDE4LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EOCwwfSwzLAl7ezB4MTEsMHhmZiwgfSx7MHhlOCwweGY4LFJESU5EX0Q4IH0sezB4MDAsMHgwMCwgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5EX0QxNiwwfSw0LAl7ezB4MTEsMHhmZiwgfSx7MHhmOCwweGY4LFJESU5EX0QxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQwLDB4ZjgsUkQgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse0FCUzE2LDB9LDMsCXt7MHgxMCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTAsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjAsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTEsJ3MnLCdEJywnIScsJ0QnLE9fRVhUVXxPX0JZVEUsImV4dHUuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMiwweGZmLCB9fX0sCi17MTEyLCdzJywnRCcsJyEnLCdEJyxPX0VYVFV8T19VTlNaLCJleHR1IiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEyLDB4ZmYsIH19fSwKLXsxMTMsJ3MnLCdEJywnIScsJ0QnLE9fRVhUU3xPX0JZVEUsImV4dHMuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMSwweGZmLCB9fX0sCi17MTE0LCdzJywnRCcsJyEnLCdEJyxPX0VYVFN8T19VTlNaLCJleHRzIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDExLDB4ZmYsIH19fSwKLXsxMTUsJ3MnLCdEJywnIScsJyEnLE9fRFNVQnxPX1VOU1osImRzdWIiLDIse1JTLFJEfSwzLAl7ezB4YTAsMHhmOCxSUyB9LHsweDAwLDB4ZmYsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTksJ3MnLCdEJywnIScsJyEnLE9fREFERHxPX1VOU1osImRhZGQiLDIse1JTLFJEfSwzLAl7ezB4YTAsMHhmOCxSUyB9LHsweDAwLDB4ZmYsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTIwLCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDppLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIxLCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDppIiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOfSw0LAl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUse3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOLFJEfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk59LDQsCXt7MHhhOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixSTklORF9EMTZ9LDYse3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjUsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmUuYiIsMix7SU1NOCxSRH0sMiwJe3sweDQwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyNiwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZSIsMix7SU1NOCxSRH0sMiwJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk4sUkR9LDIsCQl7ezB4YTgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0QnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUkR9LDMsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOfSw0LAl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYse3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOLFJEfSwyLAkJe3sweGEwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJEfSwyLAl7ezB4NDAsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NOCxSRH0sMiwJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJEfSwzLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0FCUzgsUkR9LDMsCQl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTn0sNCwJCXt7MHhhOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMzLCctJywnQicsJyEnLCchJyxPX0JWU3xPX1dPUkQsImJ2cy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzQsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fQllURSwiYnZzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM1LCctJywnQicsJyEnLCchJyxPX0JWU3xPX1VOU1osImJ2cyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzUsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fVU5TWiwiYnZzIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzYsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fV09SRCwiYnZjLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM4LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezEzNywnLScsJ0InLCchJywnIScsT19CVkN8T19CWVRFLCJidmMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzgsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fVU5TWiwiYnZjIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI4LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezEzOCwnLScsJ0InLCchJywnIScsT19CVkN8T19VTlNaLCJidmMiLDEse1BDUkVMMTYsMH0sMywJe3sweDM4LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDIsJy0nLCdCJywnIScsJyEnLE9fQlR8T19XT1JELCJidC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDMsJy0nLCdCJywnIScsJyEnLE9fQlR8T19CWVRFLCJidC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE0NCwnLScsJ0InLCchJywnIScsT19CVHxPX1VOU1osImJ0IiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE0NCwnLScsJ0InLCchJywnIScsT19CVHxPX1VOU1osImJ0IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNDUsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fV09SRCwiYnNyLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDFlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE0NiwnLScsJ0InLCchJywnIScsT19CU1J8T19CWVRFLCJic3IuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgwZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNDcsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fVU5TWiwiYnNyIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDBlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE0NywnLScsJ0InLCchJywnIScsT19CU1J8T19VTlNaLCJic3IiLDEse1BDUkVMMTYsMH0sMywJe3sweDFlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNTEsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fV09SRCwiYnJuLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1MiwnLScsJ0InLCchJywnIScsT19CUk58T19CWVRFLCJicm4uYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTMsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fVU5TWiwiYnJuIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE1MywnLScsJ0InLCchJywnIScsT19CUk58T19VTlNaLCJicm4iLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1NCwnLScsJ0InLCchJywnIScsT19CUkF8T19XT1JELCJicmEudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTU1LCctJywnQicsJyEnLCchJyxPX0JSQXxPX0JZVEUsImJyYS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE1NiwnLScsJ0InLCchJywnIScsT19CUkF8T19VTlNaLCJicmEiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTU2LCctJywnQicsJyEnLCchJyxPX0JSQXxPX1VOU1osImJyYSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTU3LCctJywnIScsJyEnLCchJyxPX0JQVHxPX1VOU1osImJwdCIsMCx7MCwwfSwxLAl7ezB4MGIsMHhmZiwgfX19LAotezE1OCwnLScsJ0InLCchJywnIScsT19CUEx8T19XT1JELCJicGwudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2EsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTU5LCctJywnQicsJyEnLCchJyxPX0JQTHxPX0JZVEUsImJwbC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2MCwnLScsJ0InLCchJywnIScsT19CUEx8T19VTlNaLCJicGwiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTYwLCctJywnQicsJyEnLCchJyxPX0JQTHxPX1VOU1osImJwbCIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2EsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2NCwnLScsJ0InLCchJywnIScsT19CTkV8T19XT1JELCJibmUudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY1LCctJywnQicsJyEnLCchJyxPX0JORXxPX0JZVEUsImJuZS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2NiwnLScsJ0InLCchJywnIScsT19CTkV8T19VTlNaLCJibmUiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY2LCctJywnQicsJyEnLCchJyxPX0JORXxPX1VOU1osImJuZSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTY3LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1dPUkQsImJtaS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNjgsJy0nLCdCJywnIScsJyEnLE9fQk1JfE9fQllURSwiYm1pLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY5LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1VOU1osImJtaSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjksJy0nLCdCJywnIScsJyEnLE9fQk1JfE9fVU5TWiwiYm1pIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzAsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fV09SRCwiYmx0LnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3MSwnLScsJ0InLCchJywnIScsT19CTFR8T19CWVRFLCJibHQuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzIsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fVU5TWiwiYmx0IiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3MiwnLScsJ0InLCchJywnIScsT19CTFR8T19VTlNaLCJibHQiLDEse1BDUkVMMTYsMH0sMywJe3sweDNkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3MywnLScsJ0InLCchJywnIScsT19CTFN8T19XT1JELCJibHMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTc0LCctJywnQicsJyEnLCchJyxPX0JMU3xPX0JZVEUsImJscy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3NSwnLScsJ0InLCchJywnIScsT19CTFN8T19VTlNaLCJibHMiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTc1LCctJywnQicsJyEnLCchJyxPX0JMU3xPX1VOU1osImJscyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTc2LCctJywnQicsJyEnLCchJyxPX0JMT3xPX1dPUkQsImJsby53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzcsJy0nLCdCJywnIScsJyEnLE9fQkxPfE9fQllURSwiYmxvLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTc4LCctJywnQicsJyEnLCchJyxPX0JMT3xPX1VOU1osImJsbyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzgsJy0nLCdCJywnIScsJyEnLE9fQkxPfE9fVU5TWiwiYmxvIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzksJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fV09SRCwiYmxlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4MCwnLScsJ0InLCchJywnIScsT19CTEV8T19CWVRFLCJibGUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODEsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fVU5TWiwiYmxlIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4MSwnLScsJ0InLCchJywnIScsT19CTEV8T19VTlNaLCJibGUiLDEse1BDUkVMMTYsMH0sMywJe3sweDNmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4MiwnLScsJ0InLCchJywnIScsT19CSFN8T19XT1JELCJiaHMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTgzLCctJywnQicsJyEnLCchJyxPX0JIU3xPX0JZVEUsImJocy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4NCwnLScsJ0InLCchJywnIScsT19CSFN8T19VTlNaLCJiaHMiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg0LCctJywnQicsJyEnLCchJyxPX0JIU3xPX1VOU1osImJocyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg1LCctJywnQicsJyEnLCchJyxPX0JISXxPX1dPUkQsImJoaS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODYsJy0nLCdCJywnIScsJyEnLE9fQkhJfE9fQllURSwiYmhpLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg3LCctJywnQicsJyEnLCchJyxPX0JISXxPX1VOU1osImJoaSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODcsJy0nLCdCJywnIScsJyEnLE9fQkhJfE9fVU5TWiwiYmhpIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODgsJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fV09SRCwiYmd0LnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4OSwnLScsJ0InLCchJywnIScsT19CR1R8T19CWVRFLCJiZ3QuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTAsJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fVU5TWiwiYmd0IiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5MCwnLScsJ0InLCchJywnIScsT19CR1R8T19VTlNaLCJiZ3QiLDEse1BDUkVMMTYsMH0sMywJe3sweDNlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5MSwnLScsJ0InLCchJywnIScsT19CR0V8T19XT1JELCJiZ2UudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2MsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTkyLCctJywnQicsJyEnLCchJyxPX0JHRXxPX0JZVEUsImJnZS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5MywnLScsJ0InLCchJywnIScsT19CR0V8T19VTlNaLCJiZ2UiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTkzLCctJywnQicsJyEnLCchJyxPX0JHRXxPX1VOU1osImJnZSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2MsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTk0LCctJywnQicsJyEnLCchJyxPX0JGfE9fV09SRCwiYmYudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTk1LCctJywnQicsJyEnLCchJyxPX0JGfE9fQllURSwiYmYuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTYsJy0nLCdCJywnIScsJyEnLE9fQkZ8T19VTlNaLCJiZiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTYsJy0nLCdCJywnIScsJyEnLE9fQkZ8T19VTlNaLCJiZiIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTk3LCctJywnQicsJyEnLCchJyxPX0JFUXxPX1dPUkQsImJlcS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTgsJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fQllURSwiYmVxLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTk5LCctJywnQicsJyEnLCchJyxPX0JFUXxPX1VOU1osImJlcSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTksJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fVU5TWiwiYmVxIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDAsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fV09SRCwiYmNzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwMSwnLScsJ0InLCchJywnIScsT19CQ1N8T19CWVRFLCJiY3MuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDIsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fVU5TWiwiYmNzIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezIwMiwnLScsJ0InLCchJywnIScsT19CQ1N8T19VTlNaLCJiY3MiLDEse1BDUkVMMTYsMH0sMywJe3sweDM1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDYsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fV09SRCwiYmNjLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwNywnLScsJ0InLCchJywnIScsT19CQ0N8T19CWVRFLCJiY2MuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDgsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fVU5TWiwiYmNjIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezIwOCwnLScsJ0InLCchJywnIScsT19CQ0N8T19VTlNaLCJiY2MiLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwOSwncycsJ0knLCdTJywnUycsT19BTkRDfE9fV09SRCwiYW5kYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsQ1JXIH19fSwKLXsyMTAsJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX0JZVEUsImFuZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDU4LDB4ZjgsQ1JCIH19fSwKLXsyMTEsJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX1VOU1osImFuZGMiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1OCwweGY4LENSQiB9fX0sCi17MjExLCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19VTlNaLCJhbmRjIiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsQ1JXIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotMCwwLDB9Ci0jZW5kaWYKLTsKLSNlbmRpZgotI2lmZGVmIERJU0FTU0VNQkxFUl9UQUJMRQotI2lmZGVmIERFRklORV9UQUJMRQotPXsKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17NiwnLScsJ1gnLCchJywnIScsT19YQ0h8T19XT1JELCJ4Y2gudyIsMix7UlMsUkR9LDIsCXt7MHhhOCwweGY4LFJTIH0sezB4OTAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezE2LCdtJywnRCcsJyEnLCdEJyxPX1NXQVB8T19XT1JELCJzd2FwLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTAsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNywweGZmLCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MiwncycsJ0UnLCdDJywnQycsT19YT1JDfE9fQllURSwieG9yYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjgsMHhmOCxDUkIgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNywweGZmLCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNywweGZmLCB9fX0sCi17MTIsJy0nLCdJJywnIScsJyEnLE9fVFJBUEF8T19VTlNaLCJ0cmFwYSIsMSx7SU1NNCwwfSwyLAl7ezB4MDgsMHhmZiwgfSx7MHgxMCwweGYwLElNTTQgfX19LAotezEzLCctJywnQicsJyEnLCchJyxPX1RSQVBfVlN8T19VTlNaLCJ0cmFwL3ZzIiwwLHswLDB9LDEsCXt7MHgwOSwweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezEsJ3MnLCdFJywnQycsJ0MnLE9fWE9SQ3xPX1dPUkQsInhvcmMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LENSVyB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCi17OCwnLScsJ0InLCchJywnIScsT19VTkxLfE9fVU5TWiwidW5sayIsMSx7RlAsMH0sMSwJe3sweDBmLDB4ZmYsIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI3LCctJywnSScsJyEnLCdFJyxPX1NUTXxPX1VOU1osInN0bSIsMix7UkxJU1QsU1BERUN9LDIsCXt7MHgxMiwweGZmLCB9LHsweDAwLDB4MDAsUkxJU1QgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYiwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWIsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezMxLCctJywnIScsJyEnLCchJyxPX1NMRUVQfE9fVU5TWiwic2xlZXAiLDAsezAsMH0sMSwJe3sweDFhLDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWUsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezQ1LCctJywnQicsJ1MnLCdTJyxPX1NDQl9GfE9fVU5TWiwic2NiL2YiLDIse1JTLFBDUkVMOH0sMywJe3sweDAxLDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWUsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezQ0LCctJywnQicsJ1MnLCdTJyxPX1NDQl9ORXxPX1VOU1osInNjYi9uZSIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDYsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezQ2LCctJywnQicsJ1MnLCdTJyxPX1NDQl9FUXxPX1VOU1osInNjYi9lcSIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDcsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCi17NDgsJy0nLCdCJywnIScsJyEnLE9fUlREfE9fVU5TWiwicnRkIiwxLHtJTU0xNiwwfSwzLAl7ezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NOCwwfSwyLAl7ezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0NywnLScsJ0InLCchJywnIScsT19SVFN8T19VTlNaLCJydHMiLDAsezAsMH0sMSwJe3sweDE5LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17OTksJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmUuYiIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk3LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODAsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk2LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODgsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk3LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTAsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk2LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTgsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkxLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjppLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17ODksJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmwuYiIsMix7QUJTOCxSRH0sMiwJe3sweDYwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg4LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpsLnciLDIse0FCUzgsUkR9LDIsCXt7MHg2OCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4NiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6cy5iIiwyLHtSUyxBQlM4fSwyLAl7ezB4NzAsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OnMudyIsMix7UlMsQUJTOH0sMiwJe3sweDc4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTixSRH0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTkRFQyxSRH0sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTUsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MywnLScsJ0onLCchJywnIScsT19QSlNSfE9fVU5TWiwicGpzciIsMSx7QUJTMjQsMH0sNCwJe3sweDAzLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMyNCB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjYsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fQllURSwib3JjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0OCwweGY4LENSQiB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTQsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWMsMHhmZiwgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17NzQsJy0nLCchJywnIScsJyEnLE9fTk9QfE9fVU5TWiwibm9wIiwwLHswLDB9LDEsCXt7MHgwMCwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjUsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fV09SRCwib3JjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxDUlcgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWQsMHhmZiwgfX19LAotezY0LCctJywnSicsJyEnLCchJyxPX1BKTVB8T19VTlNaLCJwam1wIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhjMCwweGY4LFJESU5EIH19fSwKLXs2MywnLScsJ0onLCchJywnIScsT19QSlNSfE9fVU5TWiwicGpzciIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzgsMHhmOCxSRElORCB9fX0sCi17NjIsJy0nLCdCJywnIScsJyEnLE9fUFJURHxPX1VOU1osInBydGQiLDEse0lNTTgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezYxLCctJywnQicsJyEnLCchJyxPX1BSVFN8T19VTlNaLCJwcnRzIiwwLHswLDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs2MiwnLScsJ0InLCchJywnIScsT19QUlREfE9fVU5TWiwicHJ0ZCIsMSx7SU1NMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4MWMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezY0LCctJywnSicsJyEnLCchJyxPX1BKTVB8T19VTlNaLCJwam1wIiwxLHtBQlMyNCwwfSw0LAl7ezB4MTMsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzI0IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweDAwLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORCxSRH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklOQyxSRH0sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORF9EOCxSRH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5EX0QxNixSRH0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7SU1NOCxSRH0sNCwJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7QUJTOCxSRH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi0KLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi0KLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtBQlMxNixSRH0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXsxMjUsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmUuYiIsMix7SU1NOCxSRH0sMiwJe3sweDQwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTn0sNCwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTixDUkJ9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEyMCwnYScsJ0QnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6aS53IiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOSwncycsJ0QnLCchJywnIScsT19EQUREfE9fVU5TWiwiZGFkZCIsMix7UlMsUkR9LDMsCXt7MHhhMCwweGY4LFJTIH0sezB4MDAsMHhmZiwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxMTUsJ3MnLCdEJywnIScsJyEnLE9fRFNVQnxPX1VOU1osImRzdWIiLDIse1JTLFJEfSwzLAl7ezB4YTAsMHhmOCxSUyB9LHsweDAwLDB4ZmYsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTEzLCdzJywnRCcsJyEnLCdEJyxPX0VYVFN8T19CWVRFLCJleHRzLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTEsMHhmZiwgfX19LAotezExMSwncycsJ0QnLCchJywnRCcsT19FWFRVfE9fQllURSwiZXh0dS5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEyLDB4ZmYsIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5EX0Q4LENSQn0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkRfRDE2LENSQn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse0FCUzE2LDB9LDMsCXt7MHgxMCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4ZDAsMHhmOCxSRCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4ZDgsMHhmOCxSRCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTAsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EOCwwfSwzLAl7ezB4MTEsMHhmZiwgfSx7MHhlOCwweGY4LFJESU5EX0Q4IH0sezB4MDAsMHgwMCwgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5EX0QxNiwwfSw0LAl7ezB4MTEsMHhmZiwgfSx7MHhmMCwweGY4LFJESU5EX0QxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5EX0QxNiwwfSw0LAl7ezB4MTEsMHhmZiwgfSx7MHhmOCwweGY4LFJESU5EX0QxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse0FCUzE2LDB9LDMsCXt7MHgxOCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtBQlMxNixDUkJ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5DLENSQn0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORCxDUkJ9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0FCUzgsQ1JCfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5ERUMsQ1JCfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMDUsJy0nLCdFJywnIScsJ0MnLE9fTERNfE9fVU5TWiwibGRtIiwyLHtTUElOQyxSTElTVH0sMiwJe3sweDAyLDB4ZmYsIH0sezB4MDAsMHgwMCxSTElTVCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NMTZ9LDMsCXt7MHgxZiwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA0LCctJywnUycsJ0knLCchJyxPX0xJTkt8T19VTlNaLCJsaW5rIiwyLHtGUCxJTU04fSwyLAl7ezB4MTcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxMywweGZmLCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxMywweGZmLCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzNywnLScsJ0InLCchJywnIScsT19CVkN8T19CWVRFLCJidmMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzQsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fQllURSwiYnZzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM2LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX1dPUkQsImJ2Yy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMzMsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fV09SRCwiYnZzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDYsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fQllURSwiYnNyLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MGUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0NSwnLScsJ0InLCchJywnIScsT19CU1J8T19XT1JELCJic3IudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MWUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMCwncycsJ0knLCdTJywnUycsT19BTkRDfE9fQllURSwiYW5kYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NTgsMHhmOCxDUkIgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDksJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX1dPUkQsImFuZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LENSVyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MTU3LCctJywnIScsJyEnLCchJyxPX0JQVHxPX1VOU1osImJwdCIsMCx7MCwwfSwxLAl7ezB4MGIsMHhmZiwgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezE1NSwnLScsJ0InLCchJywnIScsT19CUkF8T19CWVRFLCJicmEuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE1MiwnLScsJ0InLCchJywnIScsT19CUk58T19CWVRFLCJicm4uYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODYsJy0nLCdCJywnIScsJyEnLE9fQkhJfE9fQllURSwiYmhpLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTc0LCctJywnQicsJyEnLCchJyxPX0JMU3xPX0JZVEUsImJscy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezIwNywnLScsJ0InLCchJywnIScsT19CQ0N8T19CWVRFLCJiY2MuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsyMDEsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fQllURSwiYmNzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY1LCctJywnQicsJyEnLCchJyxPX0JORXxPX0JZVEUsImJuZS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5OCwnLScsJ0InLCchJywnIScsT19CRVF8T19CWVRFLCJiZXEuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTksJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fQllURSwiYnBsLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY4LCctJywnQicsJyEnLCchJyxPX0JNSXxPX0JZVEUsImJtaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJiLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5MiwnLScsJ0InLCchJywnIScsT19CR0V8T19CWVRFLCJiZ2UuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzEsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fQllURSwiYmx0LmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg5LCctJywnQicsJyEnLCchJyxPX0JHVHxPX0JZVEUsImJndC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4MCwnLScsJ0InLCchJywnIScsT19CTEV8T19CWVRFLCJibGUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTQsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fV09SRCwiYnJhLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE1MSwnLScsJ0InLCchJywnIScsT19CUk58T19XT1JELCJicm4udyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg1LCctJywnQicsJyEnLCchJyxPX0JISXxPX1dPUkQsImJoaS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzMsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fV09SRCwiYmxzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwNiwnLScsJ0InLCchJywnIScsT19CQ0N8T19XT1JELCJiY2MudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjAwLCctJywnQicsJyEnLCchJyxPX0JDU3xPX1dPUkQsImJjcy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNjQsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fV09SRCwiYm5lLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5NywnLScsJ0InLCchJywnIScsT19CRVF8T19XT1JELCJiZXEudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTU4LCctJywnQicsJyEnLCchJyxPX0JQTHxPX1dPUkQsImJwbC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNjcsJy0nLCdCJywnIScsJyEnLE9fQk1JfE9fV09SRCwiYm1pLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNiLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5MSwnLScsJ0InLCchJywnIScsT19CR0V8T19XT1JELCJiZ2UudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2MsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTcwLCctJywnQicsJyEnLCchJyxPX0JMVHxPX1dPUkQsImJsdC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODgsJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fV09SRCwiYmd0LnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3OSwnLScsJ0InLCchJywnIScsT19CTEV8T19XT1JELCJibGUudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2YsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0vKiAKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixSTiAgJ3MnLCdDJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk5ERUMgICdzJywnQycsJyEnLCdFJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOSU5DICAncycsJ0MnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixSTklORCAgJ3MnLCdDJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk5JTkRfRDggICdzJywnQycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk5JTkRfRDE2ICAncycsJ0MnLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1SUyxSRCAgJy0nLCdYJywnIScsJyEnCi1STiwwICAnYScsJ0UnLCchJywnIScKLVJTLFJEICAnLScsJ1gnLCchJywnIScKLVJOLDAgICdhJywnRScsJyEnLCchJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJyEnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQywwICAnYScsJ0UnLCchJywnIScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLDAgICdhJywnRScsJyEnLCchJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCwwICAnYScsJ0UnLCchJywnIScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnIScKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STiwwICAnYScsJ0UnLCchJywnIScKLVJOSU5ELDAgICdhJywnRScsJyEnLCchJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJyEnCi1STklOQywwICAnYScsJ0UnLCchJywnIScKLUFCUzgsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnIScKLVJELDAgICdtJywnRCcsJyEnLCdEJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1STiwwICAncycsJ0UnLCchJywnRScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLDAgICdzJywnRScsJyEnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORCwwICAncycsJ0UnLCchJywnRScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LDAgICdzJywnRScsJyEnLCdFJwotUk4sMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORCwwICAncycsJ0UnLCchJywnRScKLVJOSU5DLDAgICdzJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ3MnLCdFJywnIScsJ0UnCi1JTU04LDAgICdzJywnRScsJyEnLCdFJwotQUJTOCwwICAncycsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdzJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ3MnLCdFJywnIScsJ0UnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1SRCwwICAnbScsJ0QnLCchJywnRCcKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsMCAgJ3MnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnYScsJ0UnLCchJywnIScKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnIScKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU04LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTgsQ1JCICAncycsJ0UnLCdDJywnQycKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NOCwwICAnYScsJ0UnLCchJywnIScKLUlNTTgsMCAgJ3MnLCdFJywnIScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsQUJTOCAgJ3MnLCdDJywnIScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsMCAgJ2EnLCdFJywnIScsJyEnCi1BQlM4LDAgICdzJywnRScsJyEnLCdFJwotUk4sUkQgICctJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICctJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NNCwwICAnLScsJ0knLCchJywnIScKLTAsMCAgJy0nLCdCJywnIScsJyEnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixDUlcgICdzJywnRScsJ0MnLCdDJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsMCAgJ2EnLCdFJywnIScsJyEnCi1GUCwwICAnLScsJ0InLCchJywnIScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixBQlMxNiAgJ3MnLCdDJywnIScsJ0UnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STElTVCxTUERFQyAgJy0nLCdJJywnIScsJ0UnCi1DUlcsUk4gICdzJywnQycsJyEnLCdFJwotQ1JXLFJOREVDICAncycsJ0MnLCchJywnRScKLUNSVyxSTklOQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkQgICdzJywnQycsJyEnLCdFJwotQ1JXLEFCUzggICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EX0Q4ICAncycsJ0MnLCchJywnRScKLUNSVyxBQlMxNiAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkRfRDE2ICAncycsJ0MnLCchJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LDAgICdhJywnRScsJyEnLCchJwotQUJTMTYsMCAgJ3MnLCdFJywnIScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnIScKLUNSVyxSTiAgJ3MnLCdDJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLUNSQixSTkRFQyAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkQgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5DICAncycsJ0MnLCchJywnRScKLUNSVyxSTkRFQyAgJ3MnLCdDJywnIScsJ0UnCi1DUkIsUk5JTkQgICdzJywnQycsJyEnLCdFJwotQ1JCLFJOSU5DICAncycsJ0MnLCchJywnRScKLUNSVyxSTklORF9EOCAgJ3MnLCdDJywnIScsJ0UnCi1DUkIsQUJTOCAgJ3MnLCdDJywnIScsJ0UnCi1DUkIsUk5JTkRfRDggICdzJywnQycsJyEnLCdFJwotQ1JXLEFCUzggICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLUNSQixBQlMxNiAgJ3MnLCdDJywnIScsJ0UnCi1DUkIsUk5JTkRfRDE2ICAncycsJ0MnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1DUlcsQUJTMTYgICdzJywnQycsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLUNSQixSTiAgJ3MnLCdDJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLTAsMCAgJy0nLCchJywnIScsJyEnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJTLFBDUkVMOCAgJy0nLCdCJywnUycsJ1MnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUlMsUENSRUw4ICAnLScsJ0InLCdTJywnUycKLVJTLFBDUkVMOCAgJy0nLCdCJywnUycsJ1MnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJy0nLCdCJywnIScsJyEnCi1JTU04LDAgICctJywnQicsJyEnLCchJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotMCwwICAnLScsJ0InLCchJywnIScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsUkQgICdtJywnSScsJyEnLCdEJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdJJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOLFJEICAnLScsJ0UnLCchJywnRCcKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUk5ERUMsUkQgICctJywnRScsJyEnLCdEJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJTLFJOICAnLScsJ1MnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STiwwICAnYScsJ0UnLCchJywnRScKLVJOLDAgICdtJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STiwwICAnYScsJ0UnLCchJywnRScKLVJOLDAgICdtJywnRScsJyEnLCdFJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5ERUMgICctJywnUycsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnYScsJ0UnLCchJywnRScKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2EnLCdFJywnIScsJ0UnCi1STkRFQywwICAnbScsJ0UnLCchJywnRScKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOREVDLDAgICdtJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnYScsJ0UnLCchJywnRScKLVJOSU5DLDAgICdtJywnRScsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJ0UnCi1JTU04LENSQiAgJ3MnLCdJJywnQycsJ0MnCi1JTU0xNixDUlcgICdzJywnSScsJ0MnLCdDJwotUk5JTkMsMCAgJ20nLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELDAgICdhJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELDAgICdhJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMjQsMCAgJy0nLCdKJywnIScsJyEnCi1JTU04LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTgsQ1JCICAncycsJ0knLCdDJywnQycKLUlNTTgsMCAgJ2EnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnbScsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdtJywnRScsJyEnLCdFJwotUk4sMCAgJ20nLCdFJywnIScsJ0UnCi1STklORCwwICAnbScsJ0UnLCchJywnRScKLVJOREVDLDAgICdtJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlM4LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnbScsJ0UnLCchJywnRScKLUlNTTE2LDAgICdtJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdtJywnRScsJyEnLCdFJwotSU1NOCxSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotMCwwICAnLScsJyEnLCchJywnIScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixDUlcgICdzJywnSScsJ0MnLCdDJwotSU1NMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnbScsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlM4LDAgICdhJywnRScsJyEnLCdFJwotQUJTOCwwICAnbScsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1SRElORCwwICAnLScsJ0onLCchJywnIScKLVJESU5ELDAgICctJywnSicsJyEnLCchJwotSU1NOCwwICAnLScsJ0InLCchJywnIScKLTAsMCAgJy0nLCdCJywnIScsJyEnCi1JTU0xNiwwICAnLScsJ0InLCchJywnIScKLUFCUzI0LDAgICctJywnSicsJyEnLCchJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk4sMCAgJ2EnLCdFJywnIScsJ0UnCi1STkRFQywwICAnYScsJ0UnLCchJywnRScKLVJOSU5DLDAgICdhJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnRScKLUlNTTE2LDAgICdhJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCdFJwotUk5ERUMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdwJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAncCcsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJTLEFCUzE2ICAnbScsJ1MnLCchJywnRScKLUFCUzE2LFJEICAncCcsJ0UnLCdEJywnRCcKLVJOLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAncCcsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdwJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAncCcsJ0UnLCdEJywnRCcKLVJTLFJOSU5DICAnLScsJ1MnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUlMsUk5JTkQgICctJywnUycsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxSTklORF9EOCAgJy0nLCdTJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnLScsJ1MnLCchJywnRScKLVJTLEFCUzggICctJywnUycsJyEnLCdFJwotUlMsUk4gICctJywnUycsJyEnLCdFJwotUlMsUk5ERUMgICctJywnUycsJyEnLCdFJwotUlMsUk5JTkQgICctJywnUycsJyEnLCdFJwotUlMsUk5JTkMgICctJywnUycsJyEnLCdFJwotUlMsQUJTOCAgJy0nLCdTJywnIScsJ0UnCi1STklORCxSRCAgJy0nLCdFJywnIScsJ0QnCi1SUyxBQlMxNiAgJy0nLCdTJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICctJywnUycsJyEnLCdFJwotUk5JTkMsUkQgICctJywnRScsJyEnLCdEJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICctJywnUycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICctJywnRScsJyEnLCdEJwotSU1NOCxSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EMTYsUkQgICctJywnRScsJyEnLCdEJwotSU1NOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCchJywnRCcKLVJOLFJEICAnLScsJ0UnLCchJywnRCcKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsUkQgICctJywnRScsJyEnLCdEJwotUk5ERUMsUkQgICctJywnRScsJyEnLCdEJwotSU1NOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCchJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCchJywnRCcKLUFCUzE2LFJEICAnLScsJ0UnLCchJywnRCcKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnIScsJ0QnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STkRFQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnSScsJyEnLCdEJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOSU5DLFJEICAnLScsJ0UnLCchJywnRCcKLUlNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotSU1NOCxSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LFJOSU5EICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EICAnbScsJ0knLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUlNTTE2LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsUkQgICdtJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLUlNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnIScsJ0QnCi1SUyxBQlMxNiAgJy0nLCdTJywnIScsJ0UnCi1JTU04LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUFCUzE2LDAgICdhJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1BQlMxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU04LFJOSU5EICAnbScsJ0knLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5DICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotSU1NOCxBQlM4ICAnbScsJ0knLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1BQlMxNiwwICAnbScsJ0UnLCchJywnRScKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzE2LDAgICdtJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsUkQgICdtJywnSScsJyEnLCdEJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5DICAnbScsJ1MnLCchJywnRScKLVJTLFJOREVDICAnbScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLVJOLFJEICAnbScsJ0UnLCchJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnSScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORCAgJ20nLCdJJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJyEnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzggICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU04LFJEICAnbScsJ0knLCchJywnRCcKLUlNTTgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LFJOSU5EICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUlNTTgsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxBQlM4ICAnbScsJ0knLCchJywnRScKLVJTLEFCUzE2ICAnbScsJ1MnLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotRlBJTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NOCxSRCAgJ20nLCdJJywnIScsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LFJOSU5EICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUkQgICdtJywnSScsJyEnLCdEJwotSU1NOCxBQlM4ICAnbScsJ0knLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1JTU0xNixSTklORCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU04LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzggICdtJywnSScsJyEnLCdFJwotSU1NOCxSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUlNTTgsUkQgICdhJywnRCcsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTiAgJ2EnLCdFJywnSScsJyEnCi1STixDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkQsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5DLENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STkRFQyxDUlcgICdzJywnRScsJyEnLCdDJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDgsQ1JXICAncycsJ0UnLCchJywnQycKLUlNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKLUFCUzE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EMTYsQ1JXICAncycsJ0UnLCchJywnQycKLVJOLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlM4LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1JTU0xNixSRCAgJ2EnLCdEJywnSScsJyEnCi1STixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1SUyxSRCAgJ3MnLCdEJywnIScsJyEnCi1SUyxSRCAgJ3MnLCdEJywnIScsJyEnCi1SRCwwICAncycsJ0QnLCchJywnRCcKLVJELDAgICdzJywnRCcsJyEnLCdEJwotUk4sUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsQ1JCICAncycsJ0UnLCchJywnQycKLVJOLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklOQyxDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkQsQ1JCICAncycsJ0UnLCchJywnQycKLVJOREVDLENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklORCxDUlcgICdzJywnRScsJyEnLCdDJwotUk5ERUMsQ1JCICAncycsJ0UnLCchJywnQycKLVJOSU5DLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlM4LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1BQlM4LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1JTU04LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EOCxDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDgsQ1JCICAncycsJ0UnLCchJywnQycKLUFCUzE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlMxNixDUlcgICdzJywnRScsJyEnLCdDJwotSU1NMTYsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5EX0QxNixDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EMTYsQ1JCICAncycsJ0UnLCchJywnQycKLUFCUzE2LDAgICctJywnQicsJyEnLCchJwotUkRJTkQsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORCwwICAnLScsJ0InLCchJywnIScKLVJESU5EX0Q4LDAgICctJywnQicsJyEnLCchJwotUkRJTkRfRDgsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORF9EMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORF9EMTYsMCAgJy0nLCdCJywnIScsJyEnCi1BQlMxNiwwICAnLScsJ0InLCchJywnIScKLVJELDAgICdzJywnRCcsJyEnLCdEJwotQUJTMTYsQ1JCICAncycsJ0UnLCchJywnQycKLVJELDAgICdzJywnRCcsJyEnLCdEJwotUk4sQ1JXICAncycsJ0UnLCchJywnQycKLVJOREVDLFJEICAncycsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5DLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklOQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORCxDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkQsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1JTU04LFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdzJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdzJywnRScsJ0QnLCdEJwotUk4sUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTOCxDUkIgICdzJywnRScsJyEnLCdDJwotQUJTOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdEJywnSScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STkRFQyxDUkIgICdzJywnRScsJyEnLCdDJwotSU1NOCxSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk5JTkQgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkQgICdhJywnRScsJ0knLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1TUElOQyxSTElTVCAgJy0nLCdFJywnIScsJ0MnCi1JTU04LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxBQlM4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzggICdhJywnRScsJ0knLCchJwotSU1NMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsQ1JXICAncycsJ0UnLCchJywnQycKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1BQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1GUCxJTU0xNiAgJy0nLCdTJywnSScsJyEnCi1STixSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOREVDICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlM4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1GUCxJTU04ICAnLScsJ1MnLCdJJywnIScKLUlNTTgsUkQgICdhJywnRCcsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUkQgICdhJywnRCcsJ0knLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORCAgJ2EnLCdFJywnSScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk4gICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJwotUk4sUkQgICdhJywnRCcsJ0UnLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSRCAgJ2EnLCdEJywnSScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJOICAnYScsJ0UnLCdJJywnIScKLUlNTTgsUk5JTkQgICdhJywnRScsJ0knLCchJwotSU1NOCxSTklOQyAgJ2EnLCdFJywnSScsJyEnCi1JTU04LFJOREVDICAnYScsJ0UnLCdJJywnIScKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LEFCUzggICdhJywnRScsJ0knLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU04LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1STixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJEICAnYScsJ0QnLCdJJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLVJOREVDLFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdJJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk4gICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5ERUMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkQgICdhJywnRScsJ0knLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LEFCUzggICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1STiwwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1STkRFQywwICAnYycsJyEnLCchJywnRScKLVJOSU5DLDAgICdjJywnIScsJyEnLCdFJwotUk5JTkQsMCAgJ2MnLCchJywnIScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EOCwwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU04LDAgICdjJywnIScsJyEnLCdFJwotQUJTOCwwICAnYycsJyEnLCchJywnRScKLVJOLDAgICdjJywnIScsJyEnLCdFJwotUk5JTkQsMCAgJ2MnLCchJywnIScsJ0UnCi1STklOQywwICAnYycsJyEnLCchJywnRScKLVJOREVDLDAgICdjJywnIScsJyEnLCdFJwotQUJTOCwwICAnYycsJyEnLCchJywnRScKLVJOSU5EX0Q4LDAgICdjJywnIScsJyEnLCdFJwotSU1NMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1BQlMxNiwwICAnYycsJyEnLCchJywnRScKLVJOSU5EX0QxNiwwICAnYycsJyEnLCchJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVJOREVDLDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDgsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotSU1NMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1BQlM4LDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1BQlMxNiwwICAnYycsJyEnLCchJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotQUJTMTYsMCAgJ2MnLCchJywnIScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJOLDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUk5JTkMsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUk5JTkQsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVFJTSxSTiAgJ2EnLCdJJywnRScsJ0UnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICctJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotUUlNLFJOREVDICAnYScsJ0knLCdFJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkMsUkQgICctJywnRScsJ0QnLCdEJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVFJTSxSTklOQyAgJ2EnLCdJJywnRScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EICAnYScsJ0knLCdFJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk5JTkRfRDggICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU04LENSQiAgJ3MnLCdJJywnUycsJ1MnCi1JTU0xNixDUlcgICdzJywnSScsJ1MnLCdTJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU04LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTgsQ1JCICAncycsJ0knLCdTJywnUycKLUlNTTgsUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU0xNixDUlcgICdzJywnSScsJ1MnLCdTJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVFJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi0wLDAgICctJywnIScsJyEnLCchJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLUFCUzE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVFJTSxSTiAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkRfRDggICdhJywnSScsJ0UnLCdFJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EICAnYScsJ0knLCdFJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sQUJTMTYgICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTiAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EICAnYScsJ0knLCdFJywnRScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5JTkRfRDggICdhJywnSScsJ0UnLCdFJwotSU1NOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJwotUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk4gICdhJywnSScsJ0UnLCdFJwotUUlNLFJOREVDICAnYScsJ0knLCdFJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sQUJTMTYgICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLSovIAotezAsMCwwfX0KLSNlbmRpZgotOwotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL2hwcGEtZGlzLmMgYi9vcGNvZGVzL2hwcGEtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMzRmZGMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9ocHBhLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExMiArMCwwIEBACi0vKiBEaXNhc3NlbWJsZXIgZm9yIHRoZSBQQS1SSVNDLiBTb21ld2hhdCBkZXJpdmVkIGZyb20gc3BhcmMtcGluc24uYy4KLSAgIENvcHlyaWdodCAxOTg5LCAxOTkwLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJsaWJocHBhLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2hwcGEuaCIKLQotLyogSW50ZWdlciByZWdpc3RlciBuYW1lcywgaW5kZXhlZCBieSB0aGUgbnVtYmVycyB3aGljaCBhcHBlYXIgaW4gdGhlCi0gICBvcGNvZGVzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCByZWdfbmFtZXNbXSA9IAotIHsiZmxhZ3MiLCAicjEiLCAicnAiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLCAicjgiLCAicjkiLAotICAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUiLCAicjE2IiwgInIxNyIsICJyMTgiLCAicjE5IiwKLSAgInIyMCIsICJyMjEiLCAicjIyIiwgInIyMyIsICJyMjQiLCAicjI1IiwgInIyNiIsICJkcCIsICJyZXQwIiwgInJldDEiLAotICAic3AiLCAicjMxIn07Ci0KLS8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG5hbWVzLCBpbmRleGVkIGJ5IHRoZSBudW1iZXJzIHdoaWNoIGFwcGVhciBpbiB0aGUKLSAgIG9wY29kZXMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZwX3JlZ19uYW1lc1tdID0gCi0geyJmcHNyIiwgImZwZTIiLCAiZnBlNCIsICJmcGU2IiwgCi0gICJmcjQiLCAiZnI1IiwgImZyNiIsICJmcjciLCAiZnI4IiwgCi0gICJmcjkiLCAiZnIxMCIsICJmcjExIiwgImZyMTIiLCAiZnIxMyIsICJmcjE0IiwgImZyMTUiLCAKLSAgImZyMTYiLCAiZnIxNyIsICJmcjE4IiwgImZyMTkiLCAiZnIyMCIsICJmcjIxIiwgImZyMjIiLCAiZnIyMyIsCi0gICJmcjI0IiwgImZyMjUiLCAiZnIyNiIsICJmcjI3IiwgImZyMjgiLCAiZnIyOSIsICJmcjMwIiwgImZyMzEifTsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgQ09SRV9BRERSOwotCi0vKiBHZXQgYXQgdmFyaW91cyByZWxldmVudCBmaWVsZHMgb2YgYW4gaW5zdHJ1Y3Rpb24gd29yZC4gKi8KLQotI2RlZmluZSBNQVNLXzUgMHgxZgotI2RlZmluZSBNQVNLXzEwIDB4M2ZmCi0jZGVmaW5lIE1BU0tfMTEgMHg3ZmYKLSNkZWZpbmUgTUFTS18xNCAweDNmZmYKLSNkZWZpbmUgTUFTS18yMSAweDFmZmZmZgotCi0vKiBUaGlzIG1hY3JvIGdldHMgYml0IGZpZWxkcyB1c2luZyBIUCdzIG51bWJlcmluZyAoTVNCID0gMCkgKi8KLQotI2RlZmluZSBHRVRfRklFTEQoWCwgRlJPTSwgVE8pIFwKLSAgKChYKSA+PiAoMzEgLSAoVE8pKSAmICgoMSA8PCAoKFRPKSAtIChGUk9NKSArIDEpKSAtIDEpKQotCi0vKiBTb21lIG9mIHRoZXNlIGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gMi1kIGFycmF5cyBiZWNhdXNlIHRoZXkKLSAgIGNvbnN1bWUgbGVzcyBzdG9yYWdlIHRoaXMgd2F5LiAgSWYgdGhlIG1haW50ZW5hbmNlIGJlY29tZXMgYQotICAgcHJvYmxlbSwgY29udmVydCB0aGVtIGJhY2sgdG8gY29uc3QgMS1kIHBvaW50ZXIgYXJyYXlzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb250cm9sX3JlZ1tdID0gewotICAicmN0ciIsICJjcjEiLCAiY3IyIiwgImNyMyIsICJjcjQiLCAiY3I1IiwgImNyNiIsICJjcjciLAotICAicGlkcjEiLCAicGlkcjIiLCAiY2NyIiwgInNhciIsICJwaWRyMyIsICJwaWRyNCIsCi0gICJpdmEiLCAiZWllbSIsICJpdG1yIiwgInBjc3EiLCAicGNvcSIsICJpaXIiLCAiaXNyIiwKLSAgImlvciIsICJpcHN3IiwgImVpcnIiLCAidHIwIiwgInRyMSIsICJ0cjIiLCAidHIzIiwKLSAgInRyNCIsICJ0cjUiLCAidHI2IiwgInRyNyIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb21wYXJlX2NvbmRfbmFtZXNbXSA9IHsKLSAgIiIsICIsPSIsICIsPCIsICIsPD0iLCAiLDw8IiwgIiw8PD0iLCAiLHN2IiwgIixvZCIsCi0gICIsdHIiLCAiLDw+IiwgIiw+PSIsICIsPiIsICIsPj49IiwgIiw+PiIsICIsbnN2IiwgIixldiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29tcGFyZV9jb25kXzY0X25hbWVzW10gPSB7Ci0gICIiLCAiLCo9IiwgIiwqPCIsICIsKjw9IiwgIiwqPDwiLCAiLCo8PD0iLCAiLCpzdiIsICIsKm9kIiwKLSAgIiwqdHIiLCAiLCo8PiIsICIsKj49IiwgIiwqPiIsICIsKj4+PSIsICIsKj4+IiwgIiwqbnN2IiwgIiwqZXYiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNtcGliX2NvbmRfNjRfbmFtZXNbXSA9IHsKLSAgIiwqPDwiLCAiLCo9IiwgIiwqPCIsICIsKjw9IiwgIiwqPj49IiwgIiwqPD4iLCAiLCo+PSIsICIsKj4iCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFkZF9jb25kX25hbWVzW10gPSB7Ci0gICIiLCAiLD0iLCAiLDwiLCAiLDw9IiwgIixudXYiLCAiLHpudiIsICIsc3YiLCAiLG9kIiwKLSAgIix0ciIsICIsPD4iLCAiLD49IiwgIiw+IiwgIix1diIsICIsdm56IiwgIixuc3YiLCAiLGV2IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhZGRfY29uZF82NF9uYW1lc1tdID0gewotICAiIiwgIiwqPSIsICIsKjwiLCAiLCo8PSIsICIsKm51diIsICIsKnpudiIsICIsKnN2IiwgIiwqb2QiLAotICAiLCp0ciIsICIsKjw+IiwgIiwqPj0iLCAiLCo+IiwgIiwqdXYiLCAiLCp2bnoiLCAiLCpuc3YiLCAiLCpldiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgd2lkZV9hZGRfY29uZF9uYW1lc1tdID0gewotICAiIiwgIiw9IiwgIiw8IiwgIiw8PSIsICIsbnV2IiwgIiwqPSIsICIsKjwiLCAiLCo8PSIsCi0gICIsdHIiLCAiLDw+IiwgIiw+PSIsICIsPiIsICIsdXYiLCAiLCo8PiIsICIsKj49IiwgIiwqPiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbG9naWNhbF9jb25kX25hbWVzW10gPSB7Ci0gICIiLCAiLD0iLCAiLDwiLCAiLDw9IiwgMCwgMCwgMCwgIixvZCIsCi0gICIsdHIiLCAiLDw+IiwgIiw+PSIsICIsPiIsIDAsIDAsIDAsICIsZXYifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBsb2dpY2FsX2NvbmRfNjRfbmFtZXNbXSA9IHsKLSAgIiIsICIsKj0iLCAiLCo8IiwgIiwqPD0iLCAwLCAwLCAwLCAiLCpvZCIsCi0gICIsKnRyIiwgIiwqPD4iLCAiLCo+PSIsICIsKj4iLCAwLCAwLCAwLCAiLCpldiJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHVuaXRfY29uZF9uYW1lc1tdID0gewotICAiIiwgIixzd3oiLCAiLHNieiIsICIsc2h6IiwgIixzZGMiLCAiLHN3YyIsICIsc2JjIiwgIixzaGMiLAotICAiLHRyIiwgIixud3oiLCAiLG5ieiIsICIsbmh6IiwgIixuZGMiLCAiLG53YyIsICIsbmJjIiwgIixuaGMiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHVuaXRfY29uZF82NF9uYW1lc1tdID0gewotICAiIiwgIiwqc3d6IiwgIiwqc2J6IiwgIiwqc2h6IiwgIiwqc2RjIiwgIiwqc3djIiwgIiwqc2JjIiwgIiwqc2hjIiwKLSAgIiwqdHIiLCAiLCpud3oiLCAiLCpuYnoiLCAiLCpuaHoiLCAiLCpuZGMiLCAiLCpud2MiLCAiLCpuYmMiLCAiLCpuaGMiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNoaWZ0X2NvbmRfbmFtZXNbXSA9IHsKLSAgIiIsICIsPSIsICIsPCIsICIsb2QiLCAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLGV2IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzaGlmdF9jb25kXzY0X25hbWVzW10gPSB7Ci0gICIiLCAiLCo9IiwgIiwqPCIsICIsKm9kIiwgIiwqdHIiLCAiLCo8PiIsICIsKj49IiwgIiwqZXYiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGJiX2NvbmRfNjRfbmFtZXNbXSA9IHsKLSAgIiwqPCIsICIsKj49IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBpbmRleF9jb21wbF9uYW1lc1tdID0geyIiLCAiLG0iLCAiLHMiLCAiLHNtIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2hvcnRfbGRzdF9jb21wbF9uYW1lc1tdID0geyIiLCAiLG1hIiwgIiIsICIsbWIifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzaG9ydF9ieXRlc19jb21wbF9uYW1lc1tdID0gewotICAiIiwgIixiLG0iLCAiLGUiLCAiLGUsbSIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZmxvYXRfZm9ybWF0X25hbWVzW10gPSB7IixzZ2wiLCAiLGRibCIsICIiLCAiLHF1YWQifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmbG9hdF9jb21wX25hbWVzW10gPQotewotICAiLGZhbHNlPyIsICIsZmFsc2UiLCAiLD8iLCAiLCE8PT4iLCAiLD0iLCAiLD10IiwgIiw/PSIsICIsITw+IiwKLSAgIiwhPz49IiwgIiw8IiwgIiw/PCIsICIsIT49IiwgIiwhPz4iLCAiLDw9IiwgIiw/PD0iLCAiLCE+IiwKLSAgIiwhPzw9IiwgIiw+IiwgIiw/PiIsICIsITw9IiwgIiwhPzwiLCAiLD49IiwgIiw/Pj0iLCAiLCE8IiwKLSAgIiwhPz0iLCAiLDw+IiwgIiwhPSIsICIsIT10IiwgIiwhPyIsICIsPD0+IiwgIix0cnVlPyIsICIsdHJ1ZSIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2lnbmVkX3Vuc2lnbmVkX25hbWVzW10gPSB7Iix1IiwgIixzIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWl4X2hhbGZfbmFtZXNbXSA9IHsiLGwiLCAiLHIifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzYXR1cmF0aW9uX25hbWVzW10gPSB7Iix1cyIsICIsc3MiLCAwLCAiIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcmVhZF93cml0ZV9uYW1lc1tdID0geyIsciIsICIsdyJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFkZF9jb21wbF9uYW1lc1tdID0geyAwLCAiIiwgIixsIiwgIix0c3YiIH07Ci0KLS8qIEZvciBhIGJ1bmNoIG9mIGRpZmZlcmVudCBpbnN0cnVjdGlvbnMgZm9ybSBhbiBpbmRleCBpbnRvIGEgCi0gICBjb21wbGV0ZXIgbmFtZSB0YWJsZS4gKi8KLSNkZWZpbmUgR0VUX0NPTVBMKGluc24pIChHRVRfRklFTEQgKGluc24sIDI2LCAyNikgfCBcCi0JCQkgR0VUX0ZJRUxEIChpbnNuLCAxOCwgMTgpIDw8IDEpCi0KLSNkZWZpbmUgR0VUX0NPTkQoaW5zbikgKEdFVF9GSUVMRCAoKGluc24pLCAxNiwgMTgpICsgXAotCQkJKEdFVF9GSUVMRCAoKGluc24pLCAxOSwgMTkpID8gOCA6IDApKQotCi0vKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByaW50IHJlZ2lzdGVycy4gIFB1dCB0aGVzZSBmaXJzdCwgc28gZ2NjJ3MgZnVuY3Rpb24KLSAgIGlubGluaW5nIGNhbiBkbyBpdHMgc3R1ZmYuICAqLwotCi0jZGVmaW5lIGZwdXRzX2ZpbHRlcmVkKFNUUixGKQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgU1RSKQotCi1zdGF0aWMgdm9pZAotZnB1dF9yZWcgKHJlZywgaW5mbykKLSAgICAgdW5zaWduZWQgcmVnOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgcmVnID8gcmVnX25hbWVzW3JlZ10gOiAicjAiKTsKLX0KLQotc3RhdGljIHZvaWQKLWZwdXRfZnBfcmVnIChyZWcsIGluZm8pCi0gICAgIHVuc2lnbmVkIHJlZzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHJlZyA/IGZwX3JlZ19uYW1lc1tyZWddIDogImZyMCIpOwotfQotCi1zdGF0aWMgdm9pZAotZnB1dF9mcF9yZWdfciAocmVnLCBpbmZvKQotICAgICB1bnNpZ25lZCByZWc7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIC8qIFNwZWNpYWwgY2FzZSBmbG9hdGluZyBwb2ludCBleGNlcHRpb24gcmVnaXN0ZXJzLiAgKi8KLSAgaWYgKHJlZyA8IDQpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJmcGUlZCIsIHJlZyAqIDIgKyAxKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNSIiwgcmVnID8gZnBfcmVnX25hbWVzW3JlZ10gCi0JCQkJCQkgICAgOiAiZnIwIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mcHV0X2NyZWcgKHJlZywgaW5mbykKLSAgICAgdW5zaWduZWQgcmVnOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgY29udHJvbF9yZWdbcmVnXSk7Ci19Ci0KLS8qIHByaW50IGNvbnN0YW50cyB3aXRoIHNpZ24gKi8KLQotc3RhdGljIHZvaWQKLWZwdXRfY29uc3QgKG51bSwgaW5mbykKLSAgICAgdW5zaWduZWQgbnVtOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpZiAoKGludCludW0gPCAwKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSV4IiwgLShpbnQpbnVtKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXgiLCBudW0pOwotfQotCi0vKiBSb3V0aW5lcyB0byBleHRyYWN0IHZhcmlvdXMgc2l6ZWQgY29uc3RhbnRzIG91dCBvZiBocHBhCi0gICBpbnN0cnVjdGlvbnMuICovCi0KLS8qIGV4dHJhY3QgYSAzLWJpdCBzcGFjZSByZWdpc3RlciBudW1iZXIgZnJvbSBhIGJlLCBibGUsIG10c3Agb3IgbWZzcCAqLwotc3RhdGljIGludAotZXh0cmFjdF8zICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gR0VUX0ZJRUxEICh3b3JkLCAxOCwgMTgpIDw8IDIgfCBHRVRfRklFTEQgKHdvcmQsIDE2LCAxNyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfNV9sb2FkICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gbG93X3NpZ25fZXh0ZW5kICh3b3JkID4+IDE2ICYgTUFTS181LCA1KTsKLX0KLQotLyogZXh0cmFjdCB0aGUgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSBzdHtiaHd9cyBpbnN0cnVjdGlvbiAqLwotc3RhdGljIGludAotZXh0cmFjdF81X3N0b3JlICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gbG93X3NpZ25fZXh0ZW5kICh3b3JkICYgTUFTS181LCA1KTsKLX0KLQotLyogZXh0cmFjdCB0aGUgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSBicmVhayBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0XzVyX3N0b3JlICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gKHdvcmQgJiBNQVNLXzUpOwotfQotCi0vKiBleHRyYWN0IHRoZSBpbW1lZGlhdGUgZmllbGQgZnJvbSBhIHtzcn1zbSBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0XzVSX3N0b3JlICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gKHdvcmQgPj4gMTYgJiBNQVNLXzUpOwotfQotCi0vKiBleHRyYWN0IHRoZSAxMCBiaXQgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSB7c3J9c20gaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB1bnNpZ25lZAotZXh0cmFjdF8xMFVfc3RvcmUgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiAod29yZCA+PiAxNiAmIE1BU0tfMTApOwotfQotCi0vKiBleHRyYWN0IHRoZSBpbW1lZGlhdGUgZmllbGQgZnJvbSBhIGJiIGluc3RydWN0aW9uICovCi1zdGF0aWMgdW5zaWduZWQKLWV4dHJhY3RfNVFfc3RvcmUgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiAod29yZCA+PiAyMSAmIE1BU0tfNSk7Ci19Ci0KLS8qIGV4dHJhY3QgYW4gMTEgYml0IGltbWVkaWF0ZSBmaWVsZCAqLwotc3RhdGljIGludAotZXh0cmFjdF8xMSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIGxvd19zaWduX2V4dGVuZCAod29yZCAmIE1BU0tfMTEsIDExKTsKLX0KLQotLyogZXh0cmFjdCBhIDE0IGJpdCBpbW1lZGlhdGUgZmllbGQgKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMTQgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBsb3dfc2lnbl9leHRlbmQgKHdvcmQgJiBNQVNLXzE0LCAxNCk7Ci19Ci0KLS8qIGV4dHJhY3QgYSAyMSBiaXQgY29uc3RhbnQgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF8yMSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgaW50IHZhbDsKLQotICB3b3JkICY9IE1BU0tfMjE7Ci0gIHdvcmQgPDw9IDExOwotICB2YWwgPSBHRVRfRklFTEQgKHdvcmQsIDIwLCAyMCk7Ci0gIHZhbCA8PD0gMTE7Ci0gIHZhbCB8PSBHRVRfRklFTEQgKHdvcmQsIDksIDE5KTsKLSAgdmFsIDw8PSAyOwotICB2YWwgfD0gR0VUX0ZJRUxEICh3b3JkLCA1LCA2KTsKLSAgdmFsIDw8PSA1OwotICB2YWwgfD0gR0VUX0ZJRUxEICh3b3JkLCAwLCA0KTsKLSAgdmFsIDw8PSAyOwotICB2YWwgfD0gR0VUX0ZJRUxEICh3b3JkLCA3LCA4KTsKLSAgcmV0dXJuIHNpZ25fZXh0ZW5kICh2YWwsIDIxKSA8PCAxMTsKLX0KLQotLyogZXh0cmFjdCBhIDEyIGJpdCBjb25zdGFudCBmcm9tIGJyYW5jaCBpbnN0cnVjdGlvbnMgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF8xMiAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIHNpZ25fZXh0ZW5kIChHRVRfRklFTEQgKHdvcmQsIDE5LCAyOCkgfAotICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCAod29yZCwgMjksIDI5KSA8PCAxMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgKHdvcmQgJiAweDEpIDw8IDExLCAxMikgPDwgMjsKLX0KLQotLyogZXh0cmFjdCBhIDE3IGJpdCBjb25zdGFudCBmcm9tIGJyYW5jaCBpbnN0cnVjdGlvbnMsIHJldHVybmluZyB0aGUKLSAgIDE5IGJpdCBzaWduZWQgdmFsdWUuICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMTcgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBzaWduX2V4dGVuZCAoR0VUX0ZJRUxEICh3b3JkLCAxOSwgMjgpIHwKLSAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQgKHdvcmQsIDI5LCAyOSkgPDwgMTAgfAotICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCAod29yZCwgMTEsIDE1KSA8PCAxMSB8Ci0gICAgICAgICAgICAgICAgICAgICAgKHdvcmQgJiAweDEpIDw8IDE2LCAxNykgPDwgMjsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF8yMiAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIHNpZ25fZXh0ZW5kIChHRVRfRklFTEQgKHdvcmQsIDE5LCAyOCkgfAotICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCAod29yZCwgMjksIDI5KSA8PCAxMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEICh3b3JkLCAxMSwgMTUpIDw8IDExIHwKLSAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQgKHdvcmQsIDYsIDEwKSA8PCAxNiB8Ci0gICAgICAgICAgICAgICAgICAgICAgKHdvcmQgJiAweDEpIDw8IDIxLCAyMikgPDwgMjsKLX0KLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uLiAgKi8KLWludAotcHJpbnRfaW5zbl9ocHBhIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdW5zaWduZWQgaW50IGluc24sIGk7Ci0KLSAgewotICAgIGludCBzdGF0dXMgPQotICAgICAgKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksIGluZm8pOwotICAgIGlmIChzdGF0dXMgIT0gMCkKLSAgICAgIHsKLQkoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQlyZXR1cm4gLTE7Ci0gICAgICB9Ci0gIH0KLQotICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNT1BDT0RFUzsgKytpKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBwYV9vcGNvZGUgKm9wY29kZSA9ICZwYV9vcGNvZGVzW2ldOwotICAgICAgaWYgKChpbnNuICYgb3Bjb2RlLT5tYXNrKSA9PSBvcGNvZGUtPm1hdGNoKQotCXsKLQkgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7Ci0JICAKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvcGNvZGUtPm5hbWUpOwotCi0JICBpZiAoIXN0cmNociAoImNmQ1k/LStuSE5aRkl1diIsIG9wY29kZS0+YXJnc1swXSkpCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCSAgZm9yIChzID0gb3Bjb2RlLT5hcmdzOyAqcyAhPSAnXDAnOyArK3MpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKCpzKQotCQl7Ci0JCWNhc2UgJ3gnOgotCQkgIGZwdXRfcmVnIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdhJzoKLQkJY2FzZSAnYic6Ci0JCSAgZnB1dF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnXic6Ci0JCSAgZnB1dF9jcmVnIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3QnOgotCQkgIGZwdXRfcmVnIChHRVRfRklFTEQgKGluc24sIDI3LCAzMSksIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCS8qIEhhbmRsZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMuICAqLwotCQljYXNlICdmJzoKLQkJICBzd2l0Y2ggKCorK3MpCi0JCSAgICB7Ci0JCSAgICBjYXNlICd0JzoKLQkJICAgICAgZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSwgaW5mbyk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnVCc6Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI1LCAyNSkpCi0JCQlmcHV0X2ZwX3JlZ19yIChHRVRfRklFTEQgKGluc24sIDI3LCAzMSksIGluZm8pOwotCQkgICAgICBlbHNlCi0JCQlmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpLCBpbmZvKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdhJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKLQkJCWZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICAgICAgZWxzZQotCQkJZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIC8qICdmQScgd2lsbCBub3QgZ2VuZXJhdGUgYSBzcGFjZSBiZWZvcmUgdGhlIHJlZ3NpdGVyCi0JCQluYW1lLiAgTm9ybWFsbHkgdGhhdCBpcyBmaW5lLiAgRXhjZXB0IHRoYXQgaXQKLQkJCWNhdXNlcyBwcm9ibGVtcyB3aXRoIHhtcHl1IHdoaWNoIGhhcyBubyBGUCBmb3JtYXQKLQkJCWNvbXBsZXRlci4gICovCi0JCSAgICBjYXNlICdYJzoKLQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIgIiwgaW5mbyk7Ci0KLQkJICAgIC8qIEZBTExUSFJVICovCi0KLQkJICAgIGNhc2UgJ0EnOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNCwgMjQpKQotCQkJZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOwotCQkgICAgICBlbHNlCi0JCQlmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOwotCQkgICAgICAKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdiJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKLQkJCWZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgICAgIGVsc2UKLQkJCWZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ0InOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAxOSwgMTkpKQotCQkJZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICAgICAgZWxzZQotCQkJZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnQyc6Ci0JCSAgICAgIHsKLQkJCWludCByZWcgPSBHRVRfRklFTEQgKGluc24sIDIxLCAyMik7Ci0JCQlyZWcgfD0gR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpIDw8IDI7Ci0JCQlpZiAoR0VUX0ZJRUxEIChpbnNuLCAyMywgMjMpICE9IDApCi0JCQkgIGZwdXRfZnBfcmVnX3IgKHJlZywgaW5mbyk7Ci0JCQllbHNlCi0JCQkgIGZwdXRfZnBfcmVnIChyZWcsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGNhc2UgJ2knOgotCQkgICAgICB7Ci0JCQlpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCk7Ci0KLQkJCXJlZyB8PSAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpIDw8IDQpOwotCQkJZnB1dF9mcF9yZWcgKHJlZywgaW5mbyk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgY2FzZSAnaic6Ci0JCSAgICAgIHsKLQkJCWludCByZWcgPSBHRVRfRklFTEQgKGluc24sIDExLCAxNSk7Ci0KLQkJCXJlZyB8PSAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpIDw8IDQpOwotCQkJZnB1dF9mcF9yZWcgKHJlZywgaW5mbyk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgY2FzZSAnayc6Ci0JCSAgICAgIHsKLQkJCWludCByZWcgPSBHRVRfRklFTEQgKGluc24sIDI3LCAzMSk7Ci0KLQkJCXJlZyB8PSAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpIDw8IDQpOwotCQkJZnB1dF9mcF9yZWcgKHJlZywgaW5mbyk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgY2FzZSAnbCc6Ci0JCSAgICAgIHsKLQkJCWludCByZWcgPSBHRVRfRklFTEQgKGluc24sIDIxLCAyNSk7Ci0KLQkJCXJlZyB8PSAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpIDw8IDQpOwotCQkJZnB1dF9mcF9yZWcgKHJlZywgaW5mbyk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgY2FzZSAnbSc6Ci0JCSAgICAgIHsKLQkJCWludCByZWcgPSBHRVRfRklFTEQgKGluc24sIDE2LCAyMCk7Ci0KLQkJCXJlZyB8PSAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpIDw8IDQpOwotCQkJZnB1dF9mcF9yZWcgKHJlZywgaW5mbyk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgY2FzZSAnZSc6Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI1LCAyNSkpCi0JCQlmcHV0X2ZwX3JlZ19yIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgICAgICBlbHNlCi0JCQlmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICc1JzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzVfbG9hZCAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdzJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwKLQkJCQkJICJzciVkIiwgR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTcpKTsKLQkJICBicmVhazsKLQotCQljYXNlICdTJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInNyJWQiLCBleHRyYWN0XzMgKGluc24pKTsKLQkJICBicmVhazsKLQotCQkvKiBIYW5kbGUgY29tcGxldGVycy4gICovCi0JCWNhc2UgJ2MnOgotCQkgIHN3aXRjaCAoKisrcykKLQkJICAgIHsKLQkJICAgIGNhc2UgJ3gnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgaW5kZXhfY29tcGxfbmFtZXNbR0VUX0NPTVBMIChpbnNuKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ20nOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgc2hvcnRfbGRzdF9jb21wbF9uYW1lc1tHRVRfQ09NUEwgKGluc24pXSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncyc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICBzaG9ydF9ieXRlc19jb21wbF9uYW1lc1tHRVRfQ09NUEwgKGluc24pXSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnYyc6Ci0JCSAgICBjYXNlICdDJzoKLQkJICAgICAgc3dpdGNoIChHRVRfRklFTEQgKGluc24sIDIwLCAyMSkpCi0JCQl7Ci0JCQljYXNlIDE6Ci0JCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLGJjICIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMjoKLQkJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsc2wgIik7Ci0JCQkgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnZCc6Ci0JCSAgICAgIHN3aXRjaCAoR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjEpKQotCQkJewotCQkJY2FzZSAxOgotCQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixjbyAiKTsKLQkJCSAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdvJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsbyIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2cnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixnYXRlIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncCc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLGwscHVzaCIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1AnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixwb3AiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdsJzoKLQkJICAgIGNhc2UgJ0wnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixsIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAndyc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICByZWFkX3dyaXRlX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1cnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIix3Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAncic6Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDIzLCAyNikgPT0gNSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHIiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdaJzoKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLG0gIik7Ci0JCSAgICAgIGVsc2UKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2knOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNSwgMjUpKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsaSIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3onOgotCQkgICAgICBpZiAoIUdFVF9GSUVMRCAoaW5zbiwgMjEsIDIxKSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHoiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdhJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkoaW5mby0+c3RyZWFtLCAiJXMiLCBhZGRfY29tcGxfbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJICAgIChpbnNuLCAyMCwgMjEpXSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnWSc6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkJKGluZm8tPnN0cmVhbSwgIixkYyVzIiwgYWRkX2NvbXBsX25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAgICAoaW5zbiwgMjAsIDIxKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3knOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJCShpbmZvLT5zdHJlYW0sICIsYyVzIiwgYWRkX2NvbXBsX25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAgIChpbnNuLCAyMCwgMjEpXSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAndic6Ci0JCSAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDIwLCAyMCkpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIix0c3YiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICd0JzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsdGMiKTsKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjAsIDIwKSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHRzdiIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ0InOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixkYiIpOwotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjApKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsdHN2Iik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnYic6Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLGIiKTsKLQkJICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjAsIDIwKSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLHRzdiIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1QnOgotCQkgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNSwgMjUpKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsdGMiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdTJzoKLQkJICAgICAgLyogRVhUUkQvVyBoYXMgYSBmb2xsb3dpbmcgY29uZGl0aW9uLiAgKi8KLQkJICAgICAgaWYgKCoocyArIDEpID09ICc/JykKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkJICAoaW5mby0+c3RyZWFtLCAiJXMiLCBzaWduZWRfdW5zaWduZWRfbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJCSAgICAoaW5zbiwgMjEsIDIxKV0pOwotCQkgICAgICBlbHNlCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykKLQkJCSAgKGluZm8tPnN0cmVhbSwgIiVzICIsIHNpZ25lZF91bnNpZ25lZF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkJICAgICAoaW5zbiwgMjEsIDIxKV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2gnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJCSAgKGluZm8tPnN0cmVhbSwgIiVzIiwgbWl4X2hhbGZfbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJICAgICAoaW5zbiwgMTcsIDE3KV0pOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ0gnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJCSAgKGluZm8tPnN0cmVhbSwgIiVzIiwgc2F0dXJhdGlvbl9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAgKGluc24sIDI0LCAyNSldKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICcqJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIsJWQlZCVkJWQgIiwKLQkJCSAgIEdFVF9GSUVMRCAoaW5zbiwgMTcsIDE4KSwgR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjEpLAotCQkJICAgR0VUX0ZJRUxEIChpbnNuLCAyMiwgMjMpLCBHRVRfRklFTEQgKGluc24sIDI0LCAyNSkpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAncSc6Ci0JCSAgICAgIHsKLQkJCWludCBtLCBhOwotCi0JCQltID0gR0VUX0ZJRUxEIChpbnNuLCAyOCwgMjgpOwotCQkJYSA9IEdFVF9GSUVMRCAoaW5zbiwgMjksIDI5KTsKLQotCQkJaWYgKG0gJiYgIWEpCi0JCQkgIGZwdXRzX2ZpbHRlcmVkICgiLG1hICIsIGluZm8pOwotCQkJZWxzZSBpZiAobSAmJiBhKQotCQkJICBmcHV0c19maWx0ZXJlZCAoIixtYiAiLCBpbmZvKTsKLQkJCWVsc2UKLQkJCSAgZnB1dHNfZmlsdGVyZWQgKCIgIiwgaW5mbyk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCi0JCSAgICBjYXNlICdKJzoKLQkJICAgICAgewotCQkJaW50IG9wY29kZSA9IEdFVF9GSUVMRCAoaW5zbiwgMCwgNSk7Ci0KLQkJCWlmIChvcGNvZGUgPT0gMHgxNiB8fCBvcGNvZGUgPT0gMHgxZSkKLQkJCSAgewotCQkJICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI5LCAyOSkgPT0gMCkKLQkJCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiLG1hICIsIGluZm8pOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiLG1iICIsIGluZm8pOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQotCQkgICAgY2FzZSAnZSc6Ci0JCSAgICAgIHsKLQkJCWludCBvcGNvZGUgPSBHRVRfRklFTEQgKGluc24sIDAsIDUpOwotCi0JCQlpZiAob3Bjb2RlID09IDB4MTMgfHwgb3Bjb2RlID09IDB4MWIpCi0JCQkgIHsKLQkJCSAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAxOCwgMTgpID09IDEpCi0JCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIixtYiAiLCBpbmZvKTsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIixtYSAiLCBpbmZvKTsKLQkJCSAgfQotCQkJZWxzZSBpZiAob3Bjb2RlID09IDB4MTcgfHwgb3Bjb2RlID09IDB4MWYpCi0JCQkgIHsKLQkJCSAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAzMSwgMzEpID09IDEpCi0JCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIixtYSAiLCBpbmZvKTsKLQkJCSAgICBlbHNlCi0JCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIixtYiAiLCBpbmZvKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICBmcHV0c19maWx0ZXJlZCAoIiAiLCBpbmZvKTsKLQotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIH0KLQkJICBicmVhazsKLQotCQkvKiBIYW5kbGUgY29uZGl0aW9ucy4gICovCi0JCWNhc2UgJz8nOgotCQkgIHsKLQkJICAgIHMrKzsKLQkJICAgIHN3aXRjaCAoKnMpCi0JCSAgICAgIHsKLQkJICAgICAgY2FzZSAnZic6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICBmbG9hdF9jb21wX25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAgICAoaW5zbiwgMjcsIDMxKV0pOwotCQkJYnJlYWs7Ci0KLQkJICAgICAgLyogdGhlc2UgZm91ciBjb25kaXRpb25zIGFyZSBmb3IgdGhlIHNldCBvZiBpbnN0cnVjdGlvbnMKLQkJCSAgIHdoaWNoIGRpc3Rpbmd1aXNoIHRydWUvZmFsc2UgY29uZGl0aW9ucyBieSBvcGNvZGUKLQkJCSAgIHJhdGhlciB0aGFuIGJ5IHRoZSAnZicgYml0IChzaWdoKTogY29tYiwgY29taWIsCi0JCQkgICBhZGRiLCBhZGRpYiAqLwotCQkgICAgICBjYXNlICd0JzoKLQkJCWZwdXRzX2ZpbHRlcmVkIChjb21wYXJlX2NvbmRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpXSwKLQkJCQkJaW5mbyk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnbic6Ci0JCQlmcHV0c19maWx0ZXJlZCAoY29tcGFyZV9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KQotCQkJCQkrIEdFVF9GSUVMRCAoaW5zbiwgNCwgNCkgKiA4XSwgaW5mbyk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnTic6Ci0JCQlmcHV0c19maWx0ZXJlZCAoY29tcGFyZV9jb25kXzY0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KQotCQkJCQkrIEdFVF9GSUVMRCAoaW5zbiwgMiwgMikgKiA4XSwgaW5mbyk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnUSc6Ci0JCQlmcHV0c19maWx0ZXJlZCAoY21waWJfY29uZF82NF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCldLAotCQkJCQlpbmZvKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdAJzoKLQkJCWZwdXRzX2ZpbHRlcmVkIChhZGRfY29uZF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCkKLQkJCQkJKyBHRVRfRklFTEQgKGluc24sIDQsIDQpICogOF0sIGluZm8pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ3MnOgotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgICAgY29tcGFyZV9jb25kX25hbWVzW0dFVF9DT05EIChpbnNuKV0pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ1MnOgotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgICAgY29tcGFyZV9jb25kXzY0X25hbWVzW0dFVF9DT05EIChpbnNuKV0pOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ2EnOgotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICAgICAgYWRkX2NvbmRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnQSc6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgICAgICBhZGRfY29uZF82NF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdkJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLAotCQkJCQkgICAgICAgYWRkX2NvbmRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpXSk7Ci0JCQlicmVhazsKLQotCQkgICAgICBjYXNlICdXJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAKLQkJCSAgKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkJCSAgIHdpZGVfYWRkX2NvbmRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpICsgCi0JCQkJCSAgICAgIEdFVF9GSUVMRCAoaW5zbiwgNCwgNCkgKiA4XSk7Ci0JCQlicmVhazsKLQotCQkgICAgICBjYXNlICdsJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIGxvZ2ljYWxfY29uZF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdMJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIGxvZ2ljYWxfY29uZF82NF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICd1JzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIHVuaXRfY29uZF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdVJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIHVuaXRfY29uZF82NF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICd5JzoKLQkJICAgICAgY2FzZSAneCc6Ci0JCSAgICAgIGNhc2UgJ2InOgotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCQkgIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkgICBzaGlmdF9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0pOwotCi0JCQkvKiBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gYXJncyBpcyAnbicsIGl0IHdpbGwgaGFuZGxlCi0JCQkgICBwdXR0aW5nIG91dCB0aGUgc3BhY2UuICAqLwotCQkJaWYgKHNbMV0gIT0gJ24nKQotCQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlICdYJzoKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgICAgIHNoaWZ0X2NvbmRfNjRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpXSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnQic6Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykKLQkJCSAgKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkJCSAgIGJiX2NvbmRfNjRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTYpXSk7Ci0KLQkJCS8qIElmIHRoZSBuZXh0IGNoYXJhY3RlciBpbiBhcmdzIGlzICduJywgaXQgd2lsbCBoYW5kbGUKLQkJCSAgIHB1dHRpbmcgb3V0IHRoZSBzcGFjZS4gICovCi0JCQlpZiAoc1sxXSAhPSAnbicpCi0JCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGJyZWFrOwotCQkgIH0KLQotCQljYXNlICdWJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzVfc3RvcmUgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAncic6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81cl9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdSJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzVSX3N0b3JlIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1UnOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfMTBVX3N0b3JlIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0InOgotCQljYXNlICdRJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzVRX3N0b3JlIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2knOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfMTEgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnaic6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF8xNCAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdrJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzIxIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ24nOgotCQkgIGlmIChpbnNuICYgMHgyKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsbiAiKTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJICBicmVhazsKLQkJY2FzZSAnTic6Ci0JCSAgaWYgKChpbnNuICYgMHgyMCkgJiYgc1sxXSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLG4gIik7Ci0JCSAgZWxzZSBpZiAoaW5zbiAmIDB4MjApCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixuIik7Ci0JCSAgZWxzZSBpZiAoc1sxXSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCQkgIGJyZWFrOwotCQljYXNlICd3JzoKLQkJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKG1lbWFkZHIgKyA4ICsgZXh0cmFjdF8xMiAoaW5zbiksCi0JCQkJCSAgICAgICBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnVyc6Ci0JCSAgLyogMTcgYml0IFBDLXJlbGF0aXZlIGJyYW5jaC4gICovCi0JCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciArIDggCi0JCQkJCQkrIGV4dHJhY3RfMTcgKGluc24pKSwKLQkJCQkJICAgICAgIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICd6JzoKLQkJICAvKiAxNyBiaXQgZGlzcGxhY2VtZW50LiAgVGhpcyBpcyBhbiBvZmZzZXQgZnJvbSBhIHJlZ2lzdGVyCi0JCSAgICAgc28gaXQgZ2V0cyBkaXNhc3NzZW1ibGVkIGFzIGp1c3QgYSBudW1iZXIsIG5vdCBhbnkgc29ydAotCQkgICAgIG9mIGFkZHJlc3MuICAqLwotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfMTcgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICdaJzoKLQkJICAvKiBhZGRpbCAlcjEgaW1wbGljaXQgb3V0cHV0LiAgKi8KLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlcjEiKTsKLQkJICBicmVhazsKLQotCQljYXNlICdZJzoKLQkJICAvKiBiZSxsICVzcjAsJXIzMSBpbXBsaWNpdCBvdXRwdXQuICAqLwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVzcjAsJSVyMzEiKTsKLQkJICBicmVhazsKLQkJICAKLQkJY2FzZSAnQCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIwIik7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnLic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkJICAgIEdFVF9GSUVMRCAoaW5zbiwgMjQsIDI1KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJyonOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJCSAgICBHRVRfRklFTEQgKGluc24sIDIyLCAyNSkpOwotCQkgIGJyZWFrOwotCQljYXNlICchJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlc2FyIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3AnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJCSAgICAzMSAtIEdFVF9GSUVMRCAoaW5zbiwgMjIsIDI2KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ34nOgotCQkgIHsKLQkJICAgIGludCBudW07Ci0JCSAgICBudW0gPSBHRVRfRklFTEQgKGluc24sIDIwLCAyMCkgPDwgNTsKLQkJICAgIG51bSB8PSBHRVRfRklFTEQgKGluc24sIDIyLCAyNik7Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgNjMgLSBudW0pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQljYXNlICdQJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCQkgICAgR0VUX0ZJRUxEIChpbnNuLCAyMiwgMjYpKTsKLQkJICBicmVhazsKLQkJY2FzZSAncSc6Ci0JCSAgewotCQkgICAgaW50IG51bTsKLQkJICAgIG51bSA9IEdFVF9GSUVMRCAoaW5zbiwgMjAsIDIwKSA8PCA1OwotCQkgICAgbnVtIHw9IEdFVF9GSUVMRCAoaW5zbiwgMjIsIDI2KTsKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBudW0pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQljYXNlICdUJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCQkgICAgMzIgLSBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpOwotCQkgIGJyZWFrOwotCQljYXNlICclJzoKLQkJICB7Ci0JCSAgICBpbnQgbnVtOwotCQkgICAgbnVtID0gKEdFVF9GSUVMRCAoaW5zbiwgMjMsIDIzKSArIDEpICogMzI7Ci0JCSAgICBudW0gLT0gR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpOwotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIG51bSk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCWNhc2UgJ3wnOgotCQkgIHsKLQkJICAgIGludCBudW07Ci0JCSAgICBudW0gPSAoR0VUX0ZJRUxEIChpbnNuLCAxOSwgMTkpICsgMSkgKiAzMjsKLQkJICAgIG51bSAtPSBHRVRfRklFTEQgKGluc24sIDI3LCAzMSk7Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgbnVtKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJY2FzZSAnJCc6Ci0JCSAgZnB1dF9jb25zdCAoR0VUX0ZJRUxEIChpbnNuLCAyMCwgMjgpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnQSc6Ci0JCSAgZnB1dF9jb25zdCAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxOCksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdEJzoKLQkJICBmcHV0X2NvbnN0IChHRVRfRklFTEQgKGluc24sIDYsIDMxKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3YnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVkIiwgR0VUX0ZJRUxEIChpbnNuLCAyMywgMjUpKTsKLQkJICBicmVhazsKLQkJY2FzZSAnTyc6Ci0JCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgNiwyMCkgPDwgNSB8Ci0JCQkgICAgICAgR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ28nOgotCQkgIGZwdXRfY29uc3QgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMjApLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnMic6Ci0JCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgNiwgMjIpIDw8IDUgfAotCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICcxJzoKLQkJICBmcHV0X2NvbnN0ICgoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMjApIDw8IDUgfAotCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICcwJzoKLQkJICBmcHV0X2NvbnN0ICgoR0VUX0ZJRUxEIChpbnNuLCAxNiwgMjApIDw8IDUgfAotCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICd1JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlZCIsIEdFVF9GSUVMRCAoaW5zbiwgMjMsIDI1KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0YnOgotCQkgIC8qIGlmIG5vIGRlc3RpbmF0aW9uIGNvbXBsZXRlciBhbmQgbm90IGJlZm9yZSBhIGNvbXBsZXRlcgotCQkgICAgIGZvciBmY21wLCBuZWVkIGEgc3BhY2UgaGVyZSAqLwotCQkgIGlmIChzWzFdID09ICdHJyB8fCBzWzFdID09ICc/JykKLQkJICAgIGZwdXRzX2ZpbHRlcmVkIChmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxOSwgMjApXSwKLQkJCQkgICAgaW5mbyk7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgICBmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxECi0JCQkJCQkJICAgICAgKGluc24sIDE5LCAyMCldKTsKLQkJICBicmVhazsKLQkJY2FzZSAnRyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCSAgICBmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLAotCQkJCQkJCQkgIDE3LCAxOCldKTsKLQkJICBicmVhazsKLQkJY2FzZSAnSCc6Ci0JCSAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA9PSAxKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCSAgICBmbG9hdF9mb3JtYXRfbmFtZXNbMF0pOwotCQkgIGVsc2UKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgZmxvYXRfZm9ybWF0X25hbWVzWzFdKTsKLQkJICBicmVhazsKLQkJY2FzZSAnSSc6Ci0JCSAgLyogaWYgbm8gZGVzdGluYXRpb24gY29tcGxldGVyIGFuZCBub3QgYmVmb3JlIGEgY29tcGxldGVyCi0JCSAgICAgZm9yIGZjbXAsIG5lZWQgYSBzcGFjZSBoZXJlICovCi0JCSAgaWYgKHNbMV0gPT0gJz8nKQotCQkgICAgZnB1dHNfZmlsdGVyZWQgKGZsb2F0X2Zvcm1hdF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDIwLCAyMCldLAotCQkJCSAgICBpbmZvKTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgIGZsb2F0X2Zvcm1hdF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAoaW5zbiwgMjAsIDIwKV0pOwotCQkgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnSic6Ci0gICAgICAgICAgICAgICAgICBmcHV0X2NvbnN0IChleHRyYWN0XzE0IChpbnNuKSwgaW5mbyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLQotCQljYXNlICcjJzoKLQkJICB7Ci0JCSAgICBpbnQgc2lnbiA9IEdFVF9GSUVMRCAoaW5zbiwgMzEsIDMxKTsKLQkJICAgIGludCBpbW0xMCA9IEdFVF9GSUVMRCAoaW5zbiwgMTgsIDI3KTsKLQkJICAgIGludCBkaXNwOwotCi0JCSAgICBpZiAoc2lnbikKLQkJICAgICAgZGlzcCA9ICgtMSA8PCAxMCkgfCBpbW0xMDsKLQkJICAgIGVsc2UKLQkJICAgICAgZGlzcCA9IGltbTEwOwotCi0JCSAgICBkaXNwIDw8PSAzOwotCQkgICAgZnB1dF9jb25zdCAoZGlzcCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnSyc6Ci0JCWNhc2UgJ2QnOgotCQkgIHsKLQkJICAgIGludCBzaWduID0gR0VUX0ZJRUxEIChpbnNuLCAzMSwgMzEpOwotCQkgICAgaW50IGltbTExID0gR0VUX0ZJRUxEIChpbnNuLCAxOCwgMjgpOwotCQkgICAgaW50IGRpc3A7Ci0KLQkJICAgIGlmIChzaWduKQotCQkgICAgICBkaXNwID0gKC0xIDw8IDExKSB8IGltbTExOwotCQkgICAgZWxzZQotCQkgICAgICBkaXNwID0gaW1tMTE7Ci0KLQkJICAgIGRpc3AgPDw9IDI7Ci0JCSAgICBmcHV0X2NvbnN0IChkaXNwLCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQotCQkvKiA/IT8gRklYTUUgKi8KLQkJY2FzZSAnXyc6Ci0JCWNhc2UgJ3snOgotCQkgIGZwdXRzX2ZpbHRlcmVkICgiRGlzYXNzZW1ibGVyIGJvdGNoLlxuIiwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnbSc6Ci0JCSAgewotCQkgICAgaW50IHkgPSBHRVRfRklFTEQgKGluc24sIDE2LCAxOCk7Ci0KLQkJICAgIGlmICh5ICE9IDEpCi0JCSAgICAgIGZwdXRfY29uc3QgKCh5IF4gMSkgLSAxLCBpbmZvKTsKLQkJICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnaCc6Ci0JCSAgewotCQkgICAgaW50IGNiaXQ7Ci0KLQkJICAgIGNiaXQgPSBHRVRfRklFTEQgKGluc24sIDE2LCAxOCk7Ci0KLQkJICAgIGlmIChjYml0ID4gMCkKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJWQiLCBjYml0IC0gMSk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJY2FzZSAnPSc6Ci0JCSAgewotCQkgICAgaW50IGNvbmQgPSBHRVRfRklFTEQgKGluc24sIDI3LCAzMSk7Ci0KLQkJICAgIGlmIChjb25kID09IDApCi0JCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGluZm8pOwotCQkgICAgZWxzZSBpZiAoY29uZCA9PSAxKQotCQkgICAgICBmcHV0c19maWx0ZXJlZCAoImFjYyAiLCBpbmZvKTsKLQkJICAgIGVsc2UgaWYgKGNvbmQgPT0gMikKLQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCJyZWogIiwgaW5mbyk7Ci0JCSAgICBlbHNlIGlmIChjb25kID09IDUpCi0JCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiYWNjOCAiLCBpbmZvKTsKLQkJICAgIGVsc2UgaWYgKGNvbmQgPT0gNikKLQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCJyZWo4ICIsIGluZm8pOwotCQkgICAgZWxzZSBpZiAoY29uZCA9PSA5KQotCQkgICAgICBmcHV0c19maWx0ZXJlZCAoImFjYzYgIiwgaW5mbyk7Ci0JCSAgICBlbHNlIGlmIChjb25kID09IDEzKQotCQkgICAgICBmcHV0c19maWx0ZXJlZCAoImFjYzQgIiwgaW5mbyk7Ci0JCSAgICBlbHNlIGlmIChjb25kID09IDE3KQotCQkgICAgICBmcHV0c19maWx0ZXJlZCAoImFjYzIgIiwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJY2FzZSAnWCc6Ci0JCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciArIDggCi0JCQkJCQkrIGV4dHJhY3RfMjIgKGluc24pKSwKLQkJCQkJICAgICAgIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdMJzoKLQkJICBmcHV0c19maWx0ZXJlZCAoIiwlcjIiLCBpbmZvKTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgKnMpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIHJldHVybiBzaXplb2YoaW5zbik7Ci0JfQotICAgIH0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJTh4IiwgaW5zbik7Ci0gIHJldHVybiBzaXplb2YoaW5zbik7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2kzODYtZGlzLmMgYi9vcGNvZGVzL2kzODYtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMThiN2IuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9pMzg2LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc1OSArMCwwIEBACi0vKiBQcmludCBpMzg2IGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTg4LCA4OSwgOTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiA4MDM4NiBpbnN0cnVjdGlvbiBwcmludGVyIGJ5IFBhY2UgV2lsbGlzc29uIChwYWNlQHByZXAuYWkubWl0LmVkdSkKLSAqIEp1bHkgMTk4OAotICogIG1vZGlmaWVkIGJ5IEpvaG4gSGFzc2V5IChoYXNzZXlAZGctcnRwLmRnLmNvbSkKLSAqLwotCi0vKgotICogVGhlIG1haW4gdGFibGVzIGRlc2NyaWJpbmcgdGhlIGluc3RydWN0aW9ucyBpcyBlc3NlbnRpYWxseSBhIGNvcHkKLSAqIG9mIHRoZSAiT3Bjb2RlIE1hcCIgY2hhcHRlciAoQXBwZW5kaXggQSkgb2YgdGhlIEludGVsIDgwMzg2Ci0gKiBQcm9ncmFtbWVycyBNYW51YWwuICBVc3VhbGx5LCB0aGVyZSBpcyBhIGNhcGl0YWwgbGV0dGVyLCBmb2xsb3dlZAotICogYnkgYSBzbWFsbCBsZXR0ZXIuICBUaGUgY2FwaXRhbCBsZXR0ZXIgdGVsbCB0aGUgYWRkcmVzc2luZyBtb2RlLAotICogYW5kIHRoZSBzbWFsbCBsZXR0ZXIgdGVsbHMgYWJvdXQgdGhlIG9wZXJhbmQgc2l6ZS4gIFJlZmVyIHRvCi0gKiB0aGUgSW50ZWwgbWFudWFsIGZvciBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSNkZWZpbmUgTUFYTEVOIDIwCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotI2lmbmRlZiBVTklYV0FSRV9DT01QQVQKLS8qIFNldCBub24temVybyBmb3IgYnJva2VuLCBjb21wYXRpYmxlIGluc3RydWN0aW9ucy4gIFNldCB0byB6ZXJvIGZvcgotICAgbm9uLWJyb2tlbiBvcGNvZGVzLiAgKi8KLSNkZWZpbmUgVU5JWFdBUkVfQ09NUEFUIDEKLSNlbmRpZgotCi1zdGF0aWMgaW50IGZldGNoX2RhdGEgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX2J5dGUgKikpOwotCi1zdHJ1Y3QgZGlzX3ByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0vKiBUaGUgb3Bjb2RlIGZvciB0aGUgZndhaXQgaW5zdHJ1Y3Rpb24sIHdoaWNoIHdlIHRyZWF0IGFzIGEgcHJlZml4Ci0gICB3aGVuIHdlIGNhbi4gICovCi0jZGVmaW5lIEZXQUlUX09QQ09ERSAoMHg5YikKLQotLyogRmxhZ3MgZm9yIHRoZSBwcmVmaXhlcyBmb3IgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICBTZWUgYmVsb3cuICAqLwotc3RhdGljIGludCBwcmVmaXhlczsKLQotLyogRmxhZ3MgZm9yIHByZWZpeGVzIHdoaWNoIHdlIHNvbWVob3cgaGFuZGxlZCB3aGVuIHByaW50aW5nIHRoZQotICAgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgaW50IHVzZWRfcHJlZml4ZXM7Ci0KLS8qIEZsYWdzIHN0b3JlZCBpbiBQUkVGSVhFUy4gICovCi0jZGVmaW5lIFBSRUZJWF9SRVBaIDEKLSNkZWZpbmUgUFJFRklYX1JFUE5aIDIKLSNkZWZpbmUgUFJFRklYX0xPQ0sgNAotI2RlZmluZSBQUkVGSVhfQ1MgOAotI2RlZmluZSBQUkVGSVhfU1MgMHgxMAotI2RlZmluZSBQUkVGSVhfRFMgMHgyMAotI2RlZmluZSBQUkVGSVhfRVMgMHg0MAotI2RlZmluZSBQUkVGSVhfRlMgMHg4MAotI2RlZmluZSBQUkVGSVhfR1MgMHgxMDAKLSNkZWZpbmUgUFJFRklYX0RBVEEgMHgyMDAKLSNkZWZpbmUgUFJFRklYX0FERFIgMHg0MDAKLSNkZWZpbmUgUFJFRklYX0ZXQUlUIDB4ODAwCi0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKLSAgKChhZGRyKSA8PSAoKHN0cnVjdCBkaXNfcHJpdmF0ZSAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAoYWRkcikpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBhZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGludCBzdGF0dXM7Ci0gIHN0cnVjdCBkaXNfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgZGlzX3ByaXZhdGUgKilpbmZvLT5wcml2YXRlX2RhdGE7Ci0gIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCi0JCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgLyogSWYgd2UgZGlkIG1hbmFnZSB0byByZWFkIGF0IGxlYXN0IG9uZSBieXRlLCB0aGVuCi0gICAgICAgICBwcmludF9pbnNuX2kzODYgd2lsbCBkbyBzb21ldGhpbmcgc2Vuc2libGUuICBPdGhlcndpc2UsIHByaW50Ci0gICAgICAgICBhbiBlcnJvci4gIFdlIGRvIHRoYXQgaGVyZSBiZWNhdXNlIHRoaXMgaXMgd2hlcmUgd2Uga25vdwotICAgICAgICAgU1RBVFVTLiAgKi8KLSAgICAgIGlmIChwcml2LT5tYXhfZmV0Y2hlZCA9PSBwcml2LT50aGVfYnVmZmVyKQotCSgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHN0YXJ0LCBpbmZvKTsKLSAgICAgIGxvbmdqbXAgKHByaXYtPmJhaWxvdXQsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHByaXYtPm1heF9mZXRjaGVkID0gYWRkcjsKLSAgcmV0dXJuIDE7Ci19Ci0KLSNkZWZpbmUgWFggTlVMTCwgMAotCi0jZGVmaW5lIEViIE9QX0UsIGJfbW9kZQotI2RlZmluZSBpbmRpckViIE9QX2luZGlyRSwgYl9tb2RlCi0jZGVmaW5lIEdiIE9QX0csIGJfbW9kZQotI2RlZmluZSBFdiBPUF9FLCB2X21vZGUKLSNkZWZpbmUgRWQgT1BfRSwgZF9tb2RlCi0jZGVmaW5lIGluZGlyRXYgT1BfaW5kaXJFLCB2X21vZGUKLSNkZWZpbmUgRXcgT1BfRSwgd19tb2RlCi0jZGVmaW5lIE1hIE9QX0UsIHZfbW9kZQotI2RlZmluZSBNIE9QX0UsIDAJCS8qIGxlYSAqLwotI2RlZmluZSBNcCBPUF9FLCAwCQkvKiAzMiBvciA0OCBiaXQgbWVtb3J5IG9wZXJhbmQgZm9yIExEUywgTEVTIGV0YyAqLwotI2RlZmluZSBHdiBPUF9HLCB2X21vZGUKLSNkZWZpbmUgR3cgT1BfRywgd19tb2RlCi0jZGVmaW5lIFJkIE9QX1JkLCBkX21vZGUKLSNkZWZpbmUgSWIgT1BfSSwgYl9tb2RlCi0jZGVmaW5lIHNJYiBPUF9zSSwgYl9tb2RlCS8qIHNpZ24gZXh0ZW5lZCBieXRlICovCi0jZGVmaW5lIEl2IE9QX0ksIHZfbW9kZQotI2RlZmluZSBJdyBPUF9JLCB3X21vZGUKLSNkZWZpbmUgSmIgT1BfSiwgYl9tb2RlCi0jZGVmaW5lIEp2IE9QX0osIHZfbW9kZQotI2RlZmluZSBDZCBPUF9DLCBkX21vZGUKLSNkZWZpbmUgRGQgT1BfRCwgZF9tb2RlCi0jZGVmaW5lIFRkIE9QX1QsIGRfbW9kZQotCi0jZGVmaW5lIGVBWCBPUF9SRUcsIGVBWF9yZWcKLSNkZWZpbmUgZUJYIE9QX1JFRywgZUJYX3JlZwotI2RlZmluZSBlQ1ggT1BfUkVHLCBlQ1hfcmVnCi0jZGVmaW5lIGVEWCBPUF9SRUcsIGVEWF9yZWcKLSNkZWZpbmUgZVNQIE9QX1JFRywgZVNQX3JlZwotI2RlZmluZSBlQlAgT1BfUkVHLCBlQlBfcmVnCi0jZGVmaW5lIGVTSSBPUF9SRUcsIGVTSV9yZWcKLSNkZWZpbmUgZURJIE9QX1JFRywgZURJX3JlZwotI2RlZmluZSBBTCBPUF9SRUcsIGFsX3JlZwotI2RlZmluZSBDTCBPUF9SRUcsIGNsX3JlZwotI2RlZmluZSBETCBPUF9SRUcsIGRsX3JlZwotI2RlZmluZSBCTCBPUF9SRUcsIGJsX3JlZwotI2RlZmluZSBBSCBPUF9SRUcsIGFoX3JlZwotI2RlZmluZSBDSCBPUF9SRUcsIGNoX3JlZwotI2RlZmluZSBESCBPUF9SRUcsIGRoX3JlZwotI2RlZmluZSBCSCBPUF9SRUcsIGJoX3JlZwotI2RlZmluZSBBWCBPUF9SRUcsIGF4X3JlZwotI2RlZmluZSBEWCBPUF9SRUcsIGR4X3JlZwotI2RlZmluZSBpbmRpckRYIE9QX1JFRywgaW5kaXJfZHhfcmVnCi0KLSNkZWZpbmUgU3cgT1BfU0VHLCB3X21vZGUKLSNkZWZpbmUgQXAgT1BfRElSLCAwCi0jZGVmaW5lIE9iIE9QX09GRiwgYl9tb2RlCi0jZGVmaW5lIE92IE9QX09GRiwgdl9tb2RlCi0jZGVmaW5lIFhiIE9QX0RTcmVnLCBlU0lfcmVnCi0jZGVmaW5lIFh2IE9QX0RTcmVnLCBlU0lfcmVnCi0jZGVmaW5lIFliIE9QX0VTcmVnLCBlRElfcmVnCi0jZGVmaW5lIFl2IE9QX0VTcmVnLCBlRElfcmVnCi0jZGVmaW5lIERTQlggT1BfRFNyZWcsIGVCWF9yZWcKLQotI2RlZmluZSBlcyBPUF9SRUcsIGVzX3JlZwotI2RlZmluZSBzcyBPUF9SRUcsIHNzX3JlZwotI2RlZmluZSBjcyBPUF9SRUcsIGNzX3JlZwotI2RlZmluZSBkcyBPUF9SRUcsIGRzX3JlZwotI2RlZmluZSBmcyBPUF9SRUcsIGZzX3JlZwotI2RlZmluZSBncyBPUF9SRUcsIGdzX3JlZwotCi0jZGVmaW5lIE1YIE9QX01NWCwgMAotI2RlZmluZSBYTSBPUF9YTU0sIDAKLSNkZWZpbmUgRU0gT1BfRU0sIHZfbW9kZQotI2RlZmluZSBFWCBPUF9FWCwgdl9tb2RlCi0jZGVmaW5lIE1TIE9QX01TLCB2X21vZGUKLSNkZWZpbmUgTm9uZSBPUF9FLCAwCi0jZGVmaW5lIE9QU1VGIE9QXzNETm93U3VmZml4LCAwCi0jZGVmaW5lIE9QU0lNRCBPUF9TSU1EX1N1ZmZpeCwgMAotCi0vKiBiaXRzIGluIHNpemVmbGFnICovCi0jaWYgMCAvKiBsZWF2ZSB1bmRlZmluZWQgdW50aWwgc29tZW9uZSBhZGRzIHRoZSBleHRyYSBmbGFnIHRvIG9iamR1bXAgKi8KLSNkZWZpbmUgU1VGRklYX0FMV0FZUyA0Ci0jZW5kaWYKLSNkZWZpbmUgQUZMQUcgMgotI2RlZmluZSBERkxBRyAxCi0KLXR5cGVkZWYgdm9pZCAoKm9wX3J0bikgUEFSQU1TICgoaW50IGJ5dGVtb2RlLCBpbnQgc2l6ZWZsYWcpKTsKLQotc3RhdGljIHZvaWQgT1BfRSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfSSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfaW5kaXJFIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9zSSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfUkVHIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9KIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9ESVIgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX09GRiBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRVNyZWcgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0RTcmVnIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9TRUcgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0MgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1JkIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9TVCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfU1RpICBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfTU1YIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9YTU0gUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0VNIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9FWCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfTVMgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QXzNETm93U3VmZml4IFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9TSU1EX1N1ZmZpeCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgU0lNRF9GaXh1cCBQQVJBTVMgKChpbnQsIGludCkpOwotCi1zdGF0aWMgdm9pZCBhcHBlbmRfc2VnIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHNldF9vcCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgb3ApKTsKLXN0YXRpYyB2b2lkIHB1dG9wIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnRlbXBsYXRlLCBpbnQgc2l6ZWZsYWcpKTsKLXN0YXRpYyB2b2lkIGRvZmxvYXQgUEFSQU1TICgoaW50IHNpemVmbGFnKSk7Ci1zdGF0aWMgaW50IGdldDE2IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZ2V0MzIgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgY2twcmVmaXggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKnByZWZpeF9uYW1lIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwdHJfcmVnIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBCYWRPcCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgYl9tb2RlIDEKLSNkZWZpbmUgdl9tb2RlIDIKLSNkZWZpbmUgd19tb2RlIDMKLSNkZWZpbmUgZF9tb2RlIDQKLSNkZWZpbmUgeF9tb2RlIDUKLQotI2RlZmluZSBlc19yZWcgMTAwCi0jZGVmaW5lIGNzX3JlZyAxMDEKLSNkZWZpbmUgc3NfcmVnIDEwMgotI2RlZmluZSBkc19yZWcgMTAzCi0jZGVmaW5lIGZzX3JlZyAxMDQKLSNkZWZpbmUgZ3NfcmVnIDEwNQotCi0jZGVmaW5lIGVBWF9yZWcgMTA4Ci0jZGVmaW5lIGVDWF9yZWcgMTA5Ci0jZGVmaW5lIGVEWF9yZWcgMTEwCi0jZGVmaW5lIGVCWF9yZWcgMTExCi0jZGVmaW5lIGVTUF9yZWcgMTEyCi0jZGVmaW5lIGVCUF9yZWcgMTEzCi0jZGVmaW5lIGVTSV9yZWcgMTE0Ci0jZGVmaW5lIGVESV9yZWcgMTE1Ci0KLSNkZWZpbmUgYWxfcmVnIDExNgotI2RlZmluZSBjbF9yZWcgMTE3Ci0jZGVmaW5lIGRsX3JlZyAxMTgKLSNkZWZpbmUgYmxfcmVnIDExOQotI2RlZmluZSBhaF9yZWcgMTIwCi0jZGVmaW5lIGNoX3JlZyAxMjEKLSNkZWZpbmUgZGhfcmVnIDEyMgotI2RlZmluZSBiaF9yZWcgMTIzCi0KLSNkZWZpbmUgYXhfcmVnIDEyNAotI2RlZmluZSBjeF9yZWcgMTI1Ci0jZGVmaW5lIGR4X3JlZyAxMjYKLSNkZWZpbmUgYnhfcmVnIDEyNwotI2RlZmluZSBzcF9yZWcgMTI4Ci0jZGVmaW5lIGJwX3JlZyAxMjkKLSNkZWZpbmUgc2lfcmVnIDEzMAotI2RlZmluZSBkaV9yZWcgMTMxCi0KLSNkZWZpbmUgaW5kaXJfZHhfcmVnIDE1MAotCi0jZGVmaW5lIFVTRV9HUk9VUFMgMQotI2RlZmluZSBVU0VfUFJFRklYX1VTRVJfVEFCTEUgMgotCi0jZGVmaW5lIEdSUDFiIE5VTEwsIE5VTEwsIDAsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMVMgTlVMTCwgTlVMTCwgMSwgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlAxU3MgTlVMTCwgTlVMTCwgMiwgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlAyYiBOVUxMLCBOVUxMLCAzLCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDJTIE5VTEwsIE5VTEwsIDQsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMmJfb25lIE5VTEwsIE5VTEwsIDUsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMlNfb25lIE5VTEwsIE5VTEwsIDYsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMmJfY2wgTlVMTCwgTlVMTCwgNywgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlAyU19jbCBOVUxMLCBOVUxMLCA4LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDNiIE5VTEwsIE5VTEwsIDksIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQM1MgTlVMTCwgTlVMTCwgMTAsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQNCAgTlVMTCwgTlVMTCwgMTEsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQNSAgTlVMTCwgTlVMTCwgMTIsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQNiAgTlVMTCwgTlVMTCwgMTMsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQNyBOVUxMLCBOVUxMLCAxNCwgTlVMTCwgVVNFX0dST1VQUywgTlVMTCwgMAotI2RlZmluZSBHUlA4IE5VTEwsIE5VTEwsIDE1LCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0jZGVmaW5lIEdSUDkgTlVMTCwgTlVMTCwgMTYsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTAgTlVMTCwgTlVMTCwgMTcsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTEgTlVMTCwgTlVMTCwgMTgsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTIgTlVMTCwgTlVMTCwgMTksIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTMgTlVMTCwgTlVMTCwgMjAsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQMTQgTlVMTCwgTlVMTCwgMjEsIE5VTEwsIFVTRV9HUk9VUFMsIE5VTEwsIDAKLSNkZWZpbmUgR1JQQU1EIE5VTEwsIE5VTEwsIDIyLCBOVUxMLCBVU0VfR1JPVVBTLCBOVUxMLCAwCi0KLSNkZWZpbmUgUFJFR1JQMCBOVUxMLCBOVUxMLCAwLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMSBOVUxMLCBOVUxMLCAxLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMiBOVUxMLCBOVUxMLCAyLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMyBOVUxMLCBOVUxMLCAzLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQNCBOVUxMLCBOVUxMLCA0LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQNSBOVUxMLCBOVUxMLCA1LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQNiBOVUxMLCBOVUxMLCA2LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQNyBOVUxMLCBOVUxMLCA3LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQOCBOVUxMLCBOVUxMLCA4LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQOSBOVUxMLCBOVUxMLCA5LCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMTAgTlVMTCwgTlVMTCwgMTAsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRSwgTlVMTCwgMAotI2RlZmluZSBQUkVHUlAxMSBOVUxMLCBOVUxMLCAxMSwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0jZGVmaW5lIFBSRUdSUDEyIE5VTEwsIE5VTEwsIDEyLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUsIE5VTEwsIDAKLSNkZWZpbmUgUFJFR1JQMTMgTlVMTCwgTlVMTCwgMTMsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRSwgTlVMTCwgMAotI2RlZmluZSBQUkVHUlAxNCBOVUxMLCBOVUxMLCAxNCwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFLCBOVUxMLCAwCi0KLSNkZWZpbmUgRkxPQVRDT0RFIDUwCi0jZGVmaW5lIEZMT0FUIE5VTEwsIE5VTEwsIEZMT0FUQ09ERSwgTlVMTCwgMCwgTlVMTCwgMAotCi1zdHJ1Y3QgZGlzMzg2IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgb3BfcnRuIG9wMTsKLSAgaW50IGJ5dGVtb2RlMTsKLSAgb3BfcnRuIG9wMjsKLSAgaW50IGJ5dGVtb2RlMjsKLSAgb3BfcnRuIG9wMzsKLSAgaW50IGJ5dGVtb2RlMzsKLX07Ci0KLS8qIFVwcGVyIGNhc2UgbGV0dGVycyBpbiB0aGUgaW5zdHJ1Y3Rpb24gbmFtZXMgaGVyZSBhcmUgbWFjcm9zLgotICAgJ0EnID0+IHByaW50ICdiJyBpZiBubyByZWdpc3RlciBvcGVyYW5kcyBvciBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdCJyA9PiBwcmludCAnYicgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnRScgPT4gcHJpbnQgJ2UnIGlmIDMyLWJpdCBmb3JtIG9mIGpjeHoKLSAgICdMJyA9PiBwcmludCAnbCcgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnTicgPT4gcHJpbnQgJ24nIGlmIGluc3RydWN0aW9uIGhhcyBubyB3YWl0ICJwcmVmaXgiCi0gICAnUCcgPT4gcHJpbnQgJ3cnIG9yICdsJyBpZiBpbnN0cnVjdGlvbiBoYXMgYW4gb3BlcmFuZCBzaXplIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZQotICAgJ1EnID0+IHByaW50ICd3JyBvciAnbCcgaWYgbm8gcmVnaXN0ZXIgb3BlcmFuZHMgb3Igc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnUicgPT4gcHJpbnQgJ3cnIG9yICdsJyAoIndkIiBvciAiZHEiIGluIGludGVsIG1vZGUpCi0gICAnUycgPT4gcHJpbnQgJ3cnIG9yICdsJyBpZiBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdXJyA9PiBwcmludCAnYicgb3IgJ3cnICgidyIgb3IgImRlIiBpbiBpbnRlbCBtb2RlKQotKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZGlzMzg2X2F0dFtdID0gewotICAvKiAwMCAqLwotICB7ICJhZGRCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhZGRTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJhZGRCIiwJR2IsIEViLCBYWCB9LAotICB7ICJhZGRTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhZGRCIiwJQUwsIEliLCBYWCB9LAotICB7ICJhZGRTIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAicHVzaFAiLAllcywgWFgsIFhYIH0sCi0gIHsgInBvcFAiLAllcywgWFgsIFhYIH0sCi0gIC8qIDA4ICovCi0gIHsgIm9yQiIsCUViLCBHYiwgWFggfSwKLSAgeyAib3JTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJvckIiLAlHYiwgRWIsIFhYIH0sCi0gIHsgIm9yUyIsCUd2LCBFdiwgWFggfSwKLSAgeyAib3JCIiwJQUwsIEliLCBYWCB9LAotICB7ICJvclMiLAllQVgsIEl2LCBYWCB9LAotICB7ICJwdXNoUCIsCWNzLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCS8qIDB4MGYgZXh0ZW5kZWQgb3Bjb2RlIGVzY2FwZSAqLwotICAvKiAxMCAqLwotICB7ICJhZGNCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhZGNTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJhZGNCIiwJR2IsIEViLCBYWCB9LAotICB7ICJhZGNTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhZGNCIiwJQUwsIEliLCBYWCB9LAotICB7ICJhZGNTIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAicHVzaFAiLAlzcywgWFgsIFhYIH0sCi0gIHsgInBvcFAiLAlzcywgWFgsIFhYIH0sCi0gIC8qIDE4ICovCi0gIHsgInNiYkIiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInNiYlMiLAlFdiwgR3YsIFhYIH0sCi0gIHsgInNiYkIiLAlHYiwgRWIsIFhYIH0sCi0gIHsgInNiYlMiLAlHdiwgRXYsIFhYIH0sCi0gIHsgInNiYkIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgInNiYlMiLAllQVgsIEl2LCBYWCB9LAotICB7ICJwdXNoUCIsCWRzLCBYWCwgWFggfSwKLSAgeyAicG9wUCIsCWRzLCBYWCwgWFggfSwKLSAgLyogMjAgKi8KLSAgeyAiYW5kQiIsCUViLCBHYiwgWFggfSwKLSAgeyAiYW5kUyIsCUV2LCBHdiwgWFggfSwKLSAgeyAiYW5kQiIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYW5kUyIsCUd2LCBFdiwgWFggfSwKLSAgeyAiYW5kQiIsCUFMLCBJYiwgWFggfSwKLSAgeyAiYW5kUyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBFUyBwcmVmaXggKi8KLSAgeyAiZGFhIiwJWFgsIFhYLCBYWCB9LAotICAvKiAyOCAqLwotICB7ICJzdWJCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJzdWJTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJzdWJCIiwJR2IsIEViLCBYWCB9LAotICB7ICJzdWJTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJzdWJCIiwJQUwsIEliLCBYWCB9LAotICB7ICJzdWJTIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogU0VHIENTIHByZWZpeCAqLwotICB7ICJkYXMiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIDMwICovCi0gIHsgInhvckIiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInhvclMiLAlFdiwgR3YsIFhYIH0sCi0gIHsgInhvckIiLAlHYiwgRWIsIFhYIH0sCi0gIHsgInhvclMiLAlHdiwgRXYsIFhYIH0sCi0gIHsgInhvckIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgInhvclMiLAllQVgsIEl2LCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBTRUcgU1MgcHJlZml4ICovCi0gIHsgImFhYSIsCVhYLCBYWCwgWFggfSwKLSAgLyogMzggKi8KLSAgeyAiY21wQiIsCUViLCBHYiwgWFggfSwKLSAgeyAiY21wUyIsCUV2LCBHdiwgWFggfSwKLSAgeyAiY21wQiIsCUdiLCBFYiwgWFggfSwKLSAgeyAiY21wUyIsCUd2LCBFdiwgWFggfSwKLSAgeyAiY21wQiIsCUFMLCBJYiwgWFggfSwKLSAgeyAiY21wUyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBEUyBwcmVmaXggKi8KLSAgeyAiYWFzIiwJWFgsIFhYLCBYWCB9LAotICAvKiA0MCAqLwotICB7ICJpbmNTIiwJZUFYLCBYWCwgWFggfSwKLSAgeyAiaW5jUyIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgImluY1MiLAllRFgsIFhYLCBYWCB9LAotICB7ICJpbmNTIiwJZUJYLCBYWCwgWFggfSwKLSAgeyAiaW5jUyIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgImluY1MiLAllQlAsIFhYLCBYWCB9LAotICB7ICJpbmNTIiwJZVNJLCBYWCwgWFggfSwKLSAgeyAiaW5jUyIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDQ4ICovCi0gIHsgImRlY1MiLAllQVgsIFhYLCBYWCB9LAotICB7ICJkZWNTIiwJZUNYLCBYWCwgWFggfSwKLSAgeyAiZGVjUyIsCWVEWCwgWFgsIFhYIH0sCi0gIHsgImRlY1MiLAllQlgsIFhYLCBYWCB9LAotICB7ICJkZWNTIiwJZVNQLCBYWCwgWFggfSwKLSAgeyAiZGVjUyIsCWVCUCwgWFgsIFhYIH0sCi0gIHsgImRlY1MiLAllU0ksIFhYLCBYWCB9LAotICB7ICJkZWNTIiwJZURJLCBYWCwgWFggfSwKLSAgLyogNTAgKi8KLSAgeyAicHVzaFMiLAllQVgsIFhYLCBYWCB9LAotICB7ICJwdXNoUyIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgInB1c2hTIiwJZURYLCBYWCwgWFggfSwKLSAgeyAicHVzaFMiLAllQlgsIFhYLCBYWCB9LAotICB7ICJwdXNoUyIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgInB1c2hTIiwJZUJQLCBYWCwgWFggfSwKLSAgeyAicHVzaFMiLAllU0ksIFhYLCBYWCB9LAotICB7ICJwdXNoUyIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDU4ICovCi0gIHsgInBvcFMiLAllQVgsIFhYLCBYWCB9LAotICB7ICJwb3BTIiwJZUNYLCBYWCwgWFggfSwKLSAgeyAicG9wUyIsCWVEWCwgWFgsIFhYIH0sCi0gIHsgInBvcFMiLAllQlgsIFhYLCBYWCB9LAotICB7ICJwb3BTIiwJZVNQLCBYWCwgWFggfSwKLSAgeyAicG9wUyIsCWVCUCwgWFgsIFhYIH0sCi0gIHsgInBvcFMiLAllU0ksIFhYLCBYWCB9LAotICB7ICJwb3BTIiwJZURJLCBYWCwgWFggfSwKLSAgLyogNjAgKi8KLSAgeyAicHVzaGFQIiwJWFgsIFhYLCBYWCB9LAotICB7ICJwb3BhUCIsCVhYLCBYWCwgWFggfSwKLSAgeyAiYm91bmRTIiwJR3YsIE1hLCBYWCB9LAotICB7ICJhcnBsIiwJRXcsIEd3LCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBzZWcgZnMgKi8KLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogc2VnIGdzICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIG9wIHNpemUgcHJlZml4ICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIGFkciBzaXplIHByZWZpeCAqLwotICAvKiA2OCAqLwotICB7ICJwdXNoUCIsCUl2LCBYWCwgWFggfSwJCS8qIDM4NiBib29rIHdyb25nICovCi0gIHsgImltdWxTIiwJR3YsIEV2LCBJdiB9LAotICB7ICJwdXNoUCIsCXNJYiwgWFgsIFhYIH0sCS8qIHB1c2ggb2YgYnl0ZSByZWFsbHkgcHVzaGVzIDIgb3IgNCBieXRlcyAqLwotICB7ICJpbXVsUyIsCUd2LCBFdiwgc0liIH0sCi0gIHsgImluc2IiLAlZYiwgaW5kaXJEWCwgWFggfSwKLSAgeyAiaW5zUiIsCVl2LCBpbmRpckRYLCBYWCB9LAotICB7ICJvdXRzYiIsCWluZGlyRFgsIFhiLCBYWCB9LAotICB7ICJvdXRzUiIsCWluZGlyRFgsIFh2LCBYWCB9LAotICAvKiA3MCAqLwotICB7ICJqbyIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5vIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqYiIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamFlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5lIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqYmUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImphIiwJSmIsIFhYLCBYWCB9LAotICAvKiA3OCAqLwotICB7ICJqcyIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5zIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqcCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiam5wIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamdlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbGUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpnIiwJSmIsIFhYLCBYWCB9LAotICAvKiA4MCAqLwotICB7IEdSUDFiIH0sCi0gIHsgR1JQMVMgfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIHsgR1JQMVNzIH0sCi0gIHsgInRlc3RCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJ0ZXN0UyIsCUV2LCBHdiwgWFggfSwKLSAgeyAieGNoZ0IiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInhjaGdTIiwJRXYsIEd2LCBYWCB9LAotICAvKiA4OCAqLwotICB7ICJtb3ZCIiwJRWIsIEdiLCBYWCB9LAotICB7ICJtb3ZTIiwJRXYsIEd2LCBYWCB9LAotICB7ICJtb3ZCIiwJR2IsIEViLCBYWCB9LAotICB7ICJtb3ZTIiwJR3YsIEV2LCBYWCB9LAotICB7ICJtb3ZRIiwJRXYsIFN3LCBYWCB9LAotICB7ICJsZWFTIiwJR3YsIE0sIFhYIH0sCi0gIHsgIm1vdlEiLAlTdywgRXYsIFhYIH0sCi0gIHsgInBvcFEiLAlFdiwgWFgsIFhYIH0sCi0gIC8qIDkwICovCi0gIHsgIm5vcCIsCVhYLCBYWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllQ1gsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllRFgsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllQlgsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllU1AsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllQlAsIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllU0ksIGVBWCwgWFggfSwKLSAgeyAieGNoZ1MiLAllREksIGVBWCwgWFggfSwKLSAgLyogOTggKi8KLSAgeyAiY1d0UiIsCVhYLCBYWCwgWFggfSwKLSAgeyAiY1J0ZCIsCVhYLCBYWCwgWFggfSwKLSAgeyAibGNhbGxQIiwJQXAsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCS8qIGZ3YWl0ICovCi0gIHsgInB1c2hmUCIsCVhYLCBYWCwgWFggfSwKLSAgeyAicG9wZlAiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInNhaGYiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxhaGYiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIGEwICovCi0gIHsgIm1vdkIiLAlBTCwgT2IsIFhYIH0sCi0gIHsgIm1vdlMiLAllQVgsIE92LCBYWCB9LAotICB7ICJtb3ZCIiwJT2IsIEFMLCBYWCB9LAotICB7ICJtb3ZTIiwJT3YsIGVBWCwgWFggfSwKLSAgeyAibW92c2IiLAlZYiwgWGIsIFhYIH0sCi0gIHsgIm1vdnNSIiwJWXYsIFh2LCBYWCB9LAotICB7ICJjbXBzYiIsCVhiLCBZYiwgWFggfSwKLSAgeyAiY21wc1IiLAlYdiwgWXYsIFhYIH0sCi0gIC8qIGE4ICovCi0gIHsgInRlc3RCIiwJQUwsIEliLCBYWCB9LAotICB7ICJ0ZXN0UyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInN0b3NCIiwJWWIsIEFMLCBYWCB9LAotICB7ICJzdG9zUyIsCVl2LCBlQVgsIFhYIH0sCi0gIHsgImxvZHNCIiwJQUwsIFhiLCBYWCB9LAotICB7ICJsb2RzUyIsCWVBWCwgWHYsIFhYIH0sCi0gIHsgInNjYXNCIiwJQUwsIFliLCBYWCB9LAotICB7ICJzY2FzUyIsCWVBWCwgWXYsIFhYIH0sCi0gIC8qIGIwICovCi0gIHsgIm1vdkIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlDTCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlETCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlCTCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlBSCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlDSCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlESCwgSWIsIFhYIH0sCi0gIHsgIm1vdkIiLAlCSCwgSWIsIFhYIH0sCi0gIC8qIGI4ICovCi0gIHsgIm1vdlMiLAllQVgsIEl2LCBYWCB9LAotICB7ICJtb3ZTIiwJZUNYLCBJdiwgWFggfSwKLSAgeyAibW92UyIsCWVEWCwgSXYsIFhYIH0sCi0gIHsgIm1vdlMiLAllQlgsIEl2LCBYWCB9LAotICB7ICJtb3ZTIiwJZVNQLCBJdiwgWFggfSwKLSAgeyAibW92UyIsCWVCUCwgSXYsIFhYIH0sCi0gIHsgIm1vdlMiLAllU0ksIEl2LCBYWCB9LAotICB7ICJtb3ZTIiwJZURJLCBJdiwgWFggfSwKLSAgLyogYzAgKi8KLSAgeyBHUlAyYiB9LAotICB7IEdSUDJTIH0sCi0gIHsgInJldFAiLAlJdywgWFgsIFhYIH0sCi0gIHsgInJldFAiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxlc1MiLAlHdiwgTXAsIFhYIH0sCi0gIHsgImxkc1MiLAlHdiwgTXAsIFhYIH0sCi0gIHsgIm1vdkEiLAlFYiwgSWIsIFhYIH0sCi0gIHsgIm1vdlEiLAlFdiwgSXYsIFhYIH0sCi0gIC8qIGM4ICovCi0gIHsgImVudGVyUCIsCUl3LCBJYiwgWFggfSwKLSAgeyAibGVhdmVQIiwJWFgsIFhYLCBYWCB9LAotICB7ICJscmV0UCIsCUl3LCBYWCwgWFggfSwKLSAgeyAibHJldFAiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImludDMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImludCIsCUliLCBYWCwgWFggfSwKLSAgeyAiaW50byIsCVhYLCBYWCwgWFh9LAotICB7ICJpcmV0UCIsCVhYLCBYWCwgWFggfSwKLSAgLyogZDAgKi8KLSAgeyBHUlAyYl9vbmUgfSwKLSAgeyBHUlAyU19vbmUgfSwKLSAgeyBHUlAyYl9jbCB9LAotICB7IEdSUDJTX2NsIH0sCi0gIHsgImFhbSIsCXNJYiwgWFgsIFhYIH0sCi0gIHsgImFhZCIsCXNJYiwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB7ICJ4bGF0IiwJRFNCWCwgWFgsIFhYIH0sCi0gIC8qIGQ4ICovCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICAvKiBlMCAqLwotICB7ICJsb29wbmUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImxvb3BlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJsb29wIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqRWN4eiIsCUpiLCBYWCwgWFggfSwKLSAgeyAiaW5CIiwJQUwsIEliLCBYWCB9LAotICB7ICJpblMiLAllQVgsIEliLCBYWCB9LAotICB7ICJvdXRCIiwJSWIsIEFMLCBYWCB9LAotICB7ICJvdXRTIiwJSWIsIGVBWCwgWFggfSwKLSAgLyogZTggKi8KLSAgeyAiY2FsbFAiLAlKdiwgWFgsIFhYIH0sCi0gIHsgImptcFAiLAlKdiwgWFgsIFhYIH0sCi0gIHsgImxqbXBQIiwJQXAsIFhYLCBYWCB9LAotICB7ICJqbXAiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImluQiIsCUFMLCBpbmRpckRYLCBYWCB9LAotICB7ICJpblMiLAllQVgsIGluZGlyRFgsIFhYIH0sCi0gIHsgIm91dEIiLAlpbmRpckRYLCBBTCwgWFggfSwKLSAgeyAib3V0UyIsCWluZGlyRFgsIGVBWCwgWFggfSwKLSAgLyogZjAgKi8KLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogbG9jayBwcmVmaXggKi8KLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIHJlcG5lICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIHJlcHogKi8KLSAgeyAiaGx0IiwJWFgsIFhYLCBYWCB9LAotICB7ICJjbWMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgR1JQM2IgfSwKLSAgeyBHUlAzUyB9LAotICAvKiBmOCAqLwotICB7ICJjbGMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInN0YyIsCVhYLCBYWCwgWFggfSwKLSAgeyAiY2xpIiwJWFgsIFhYLCBYWCB9LAotICB7ICJzdGkiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImNsZCIsCVhYLCBYWCwgWFggfSwKLSAgeyAic3RkIiwJWFgsIFhYLCBYWCB9LAotICB7IEdSUDQgfSwKLSAgeyBHUlA1IH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRpczM4NiBkaXMzODZfaW50ZWxbXSA9IHsKLSAgLyogMDAgKi8KLSAgeyAiYWRkIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhZGQiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImFkZCIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYWRkIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhZGQiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImFkZCIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2giLAllcywgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVzLCBYWCwgWFggfSwKLSAgLyogMDggKi8KLSAgeyAib3IiLAlFYiwgR2IsIFhYIH0sCi0gIHsgIm9yIiwJRXYsIEd2LCBYWCB9LAotICB7ICJvciIsCUdiLCBFYiwgWFggfSwKLSAgeyAib3IiLAlHdiwgRXYsIFhYIH0sCi0gIHsgIm9yIiwJQUwsIEliLCBYWCB9LAotICB7ICJvciIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2giLAljcywgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkvKiAweDBmIGV4dGVuZGVkIG9wY29kZSBlc2NhcGUgKi8KLSAgLyogMTAgKi8KLSAgeyAiYWRjIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhZGMiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImFkYyIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYWRjIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhZGMiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImFkYyIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2giLAlzcywgWFgsIFhYIH0sCi0gIHsgInBvcCIsCXNzLCBYWCwgWFggfSwKLSAgLyogMTggKi8KLSAgeyAic2JiIiwJRWIsIEdiLCBYWCB9LAotICB7ICJzYmIiLAlFdiwgR3YsIFhYIH0sCi0gIHsgInNiYiIsCUdiLCBFYiwgWFggfSwKLSAgeyAic2JiIiwJR3YsIEV2LCBYWCB9LAotICB7ICJzYmIiLAlBTCwgSWIsIFhYIH0sCi0gIHsgInNiYiIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgInB1c2giLAlkcywgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWRzLCBYWCwgWFggfSwKLSAgLyogMjAgKi8KLSAgeyAiYW5kIiwJRWIsIEdiLCBYWCB9LAotICB7ICJhbmQiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImFuZCIsCUdiLCBFYiwgWFggfSwKLSAgeyAiYW5kIiwJR3YsIEV2LCBYWCB9LAotICB7ICJhbmQiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImFuZCIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBFUyBwcmVmaXggKi8KLSAgeyAiZGFhIiwJWFgsIFhYLCBYWCB9LAotICAvKiAyOCAqLwotICB7ICJzdWIiLAlFYiwgR2IsIFhYIH0sCi0gIHsgInN1YiIsCUV2LCBHdiwgWFggfSwKLSAgeyAic3ViIiwJR2IsIEViLCBYWCB9LAotICB7ICJzdWIiLAlHdiwgRXYsIFhYIH0sCi0gIHsgInN1YiIsCUFMLCBJYiwgWFggfSwKLSAgeyAic3ViIiwJZUFYLCBJdiwgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogU0VHIENTIHByZWZpeCAqLwotICB7ICJkYXMiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIDMwICovCi0gIHsgInhvciIsCUViLCBHYiwgWFggfSwKLSAgeyAieG9yIiwJRXYsIEd2LCBYWCB9LAotICB7ICJ4b3IiLAlHYiwgRWIsIFhYIH0sCi0gIHsgInhvciIsCUd2LCBFdiwgWFggfSwKLSAgeyAieG9yIiwJQUwsIEliLCBYWCB9LAotICB7ICJ4b3IiLAllQVgsIEl2LCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBTRUcgU1MgcHJlZml4ICovCi0gIHsgImFhYSIsCVhYLCBYWCwgWFggfSwKLSAgLyogMzggKi8KLSAgeyAiY21wIiwJRWIsIEdiLCBYWCB9LAotICB7ICJjbXAiLAlFdiwgR3YsIFhYIH0sCi0gIHsgImNtcCIsCUdiLCBFYiwgWFggfSwKLSAgeyAiY21wIiwJR3YsIEV2LCBYWCB9LAotICB7ICJjbXAiLAlBTCwgSWIsIFhYIH0sCi0gIHsgImNtcCIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIFNFRyBEUyBwcmVmaXggKi8KLSAgeyAiYWFzIiwJWFgsIFhYLCBYWCB9LAotICAvKiA0MCAqLwotICB7ICJpbmMiLAllQVgsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllQ1gsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllRFgsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllQlgsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllU1AsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllQlAsIFhYLCBYWCB9LAotICB7ICJpbmMiLAllU0ksIFhYLCBYWCB9LAotICB7ICJpbmMiLAllREksIFhYLCBYWCB9LAotICAvKiA0OCAqLwotICB7ICJkZWMiLAllQVgsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllQ1gsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllRFgsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllQlgsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllU1AsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllQlAsIFhYLCBYWCB9LAotICB7ICJkZWMiLAllU0ksIFhYLCBYWCB9LAotICB7ICJkZWMiLAllREksIFhYLCBYWCB9LAotICAvKiA1MCAqLwotICB7ICJwdXNoIiwJZUFYLCBYWCwgWFggfSwKLSAgeyAicHVzaCIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgInB1c2giLAllRFgsIFhYLCBYWCB9LAotICB7ICJwdXNoIiwJZUJYLCBYWCwgWFggfSwKLSAgeyAicHVzaCIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgInB1c2giLAllQlAsIFhYLCBYWCB9LAotICB7ICJwdXNoIiwJZVNJLCBYWCwgWFggfSwKLSAgeyAicHVzaCIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDU4ICovCi0gIHsgInBvcCIsCWVBWCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVDWCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVEWCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVCWCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVTUCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVCUCwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVTSSwgWFgsIFhYIH0sCi0gIHsgInBvcCIsCWVESSwgWFgsIFhYIH0sCi0gIC8qIDYwICovCi0gIHsgInB1c2hhIiwJWFgsIFhYLCBYWCB9LAotICB7ICJwb3BhIiwJWFgsIFhYLCBYWCB9LAotICB7ICJib3VuZCIsCUd2LCBNYSwgWFggfSwKLSAgeyAiYXJwbCIsCUV3LCBHdywgWFggfSwKLSAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCQkJLyogc2VnIGZzICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIHNlZyBncyAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBvcCBzaXplIHByZWZpeCAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiBhZHIgc2l6ZSBwcmVmaXggKi8KLSAgLyogNjggKi8KLSAgeyAicHVzaCIsCUl2LCBYWCwgWFggfSwJCS8qIDM4NiBib29rIHdyb25nICovCi0gIHsgImltdWwiLAlHdiwgRXYsIEl2IH0sCi0gIHsgInB1c2giLAlzSWIsIFhYLCBYWCB9LAkvKiBwdXNoIG9mIGJ5dGUgcmVhbGx5IHB1c2hlcyAyIG9yIDQgYnl0ZXMgKi8KLSAgeyAiaW11bCIsCUd2LCBFdiwgc0liIH0sCi0gIHsgImlucyIsCVliLCBpbmRpckRYLCBYWCB9LAotICB7ICJpbnMiLAlZdiwgaW5kaXJEWCwgWFggfSwKLSAgeyAib3V0cyIsCWluZGlyRFgsIFhiLCBYWCB9LAotICB7ICJvdXRzIiwJaW5kaXJEWCwgWHYsIFhYIH0sCi0gIC8qIDcwICovCi0gIHsgImpvIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbm8iLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpiIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqYWUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImplIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbmUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpiZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamEiLAlKYiwgWFgsIFhYIH0sCi0gIC8qIDc4ICovCi0gIHsgImpzIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbnMiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpwIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqbnAiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpsIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqZ2UiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImpsZSIsCUpiLCBYWCwgWFggfSwKLSAgeyAiamciLAlKYiwgWFgsIFhYIH0sCi0gIC8qIDgwICovCi0gIHsgR1JQMWIgfSwKLSAgeyBHUlAxUyB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgeyBHUlAxU3MgfSwKLSAgeyAidGVzdCIsCUViLCBHYiwgWFggfSwKLSAgeyAidGVzdCIsCUV2LCBHdiwgWFggfSwKLSAgeyAieGNoZyIsCUViLCBHYiwgWFggfSwKLSAgeyAieGNoZyIsCUV2LCBHdiwgWFggfSwKLSAgLyogODggKi8KLSAgeyAibW92IiwJRWIsIEdiLCBYWCB9LAotICB7ICJtb3YiLAlFdiwgR3YsIFhYIH0sCi0gIHsgIm1vdiIsCUdiLCBFYiwgWFggfSwKLSAgeyAibW92IiwJR3YsIEV2LCBYWCB9LAotICB7ICJtb3YiLAlFdiwgU3csIFhYIH0sCi0gIHsgImxlYSIsCUd2LCBNLCBYWCB9LAotICB7ICJtb3YiLAlTdywgRXYsIFhYIH0sCi0gIHsgInBvcCIsCUV2LCBYWCwgWFggfSwKLSAgLyogOTAgKi8KLSAgeyAibm9wIiwJWFgsIFhYLCBYWCB9LAotICB7ICJ4Y2hnIiwJZUNYLCBlQVgsIFhYIH0sCi0gIHsgInhjaGciLAllRFgsIGVBWCwgWFggfSwKLSAgeyAieGNoZyIsCWVCWCwgZUFYLCBYWCB9LAotICB7ICJ4Y2hnIiwJZVNQLCBlQVgsIFhYIH0sCi0gIHsgInhjaGciLAllQlAsIGVBWCwgWFggfSwKLSAgeyAieGNoZyIsCWVTSSwgZUFYLCBYWCB9LAotICB7ICJ4Y2hnIiwJZURJLCBlQVgsIFhYIH0sCi0gIC8qIDk4ICovCi0gIHsgImNXIiwJWFgsIFhYLCBYWCB9LAkJLyogY3dkZSBhbmQgY2J3ICovCi0gIHsgImNSIiwJWFgsIFhYLCBYWCB9LAkJLyogY2RxIGFuZCBjd2QgKi8KLSAgeyAibGNhbGwiLAlBcCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJLyogZndhaXQgKi8KLSAgeyAicHVzaGYiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInBvcGYiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInNhaGYiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxhaGYiLAlYWCwgWFgsIFhYIH0sCi0gIC8qIGEwICovCi0gIHsgIm1vdiIsCUFMLCBPYiwgWFggfSwKLSAgeyAibW92IiwJZUFYLCBPdiwgWFggfSwKLSAgeyAibW92IiwJT2IsIEFMLCBYWCB9LAotICB7ICJtb3YiLAlPdiwgZUFYLCBYWCB9LAotICB7ICJtb3ZzIiwJWWIsIFhiLCBYWCB9LAotICB7ICJtb3ZzIiwJWXYsIFh2LCBYWCB9LAotICB7ICJjbXBzIiwJWGIsIFliLCBYWCB9LAotICB7ICJjbXBzIiwJWHYsIFl2LCBYWCB9LAotICAvKiBhOCAqLwotICB7ICJ0ZXN0IiwJQUwsIEliLCBYWCB9LAotICB7ICJ0ZXN0IiwJZUFYLCBJdiwgWFggfSwKLSAgeyAic3RvcyIsCVliLCBBTCwgWFggfSwKLSAgeyAic3RvcyIsCVl2LCBlQVgsIFhYIH0sCi0gIHsgImxvZHMiLAlBTCwgWGIsIFhYIH0sCi0gIHsgImxvZHMiLAllQVgsIFh2LCBYWCB9LAotICB7ICJzY2FzIiwJQUwsIFliLCBYWCB9LAotICB7ICJzY2FzIiwJZUFYLCBZdiwgWFggfSwKLSAgLyogYjAgKi8KLSAgeyAibW92IiwJQUwsIEliLCBYWCB9LAotICB7ICJtb3YiLAlDTCwgSWIsIFhYIH0sCi0gIHsgIm1vdiIsCURMLCBJYiwgWFggfSwKLSAgeyAibW92IiwJQkwsIEliLCBYWCB9LAotICB7ICJtb3YiLAlBSCwgSWIsIFhYIH0sCi0gIHsgIm1vdiIsCUNILCBJYiwgWFggfSwKLSAgeyAibW92IiwJREgsIEliLCBYWCB9LAotICB7ICJtb3YiLAlCSCwgSWIsIFhYIH0sCi0gIC8qIGI4ICovCi0gIHsgIm1vdiIsCWVBWCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVDWCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVEWCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVCWCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVTUCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVCUCwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVTSSwgSXYsIFhYIH0sCi0gIHsgIm1vdiIsCWVESSwgSXYsIFhYIH0sCi0gIC8qIGMwICovCi0gIHsgR1JQMmIgfSwKLSAgeyBHUlAyUyB9LAotICB7ICJyZXQiLAlJdywgWFgsIFhYIH0sCi0gIHsgInJldCIsCVhYLCBYWCwgWFggfSwKLSAgeyAibGVzIiwJR3YsIE1wLCBYWCB9LAotICB7ICJsZHMiLAlHdiwgTXAsIFhYIH0sCi0gIHsgIm1vdiIsCUViLCBJYiwgWFggfSwKLSAgeyAibW92IiwJRXYsIEl2LCBYWCB9LAotICAvKiBjOCAqLwotICB7ICJlbnRlciIsCUl3LCBJYiwgWFggfSwKLSAgeyAibGVhdmUiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImxyZXQiLAlJdywgWFgsIFhYIH0sCi0gIHsgImxyZXQiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImludDMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImludCIsCUliLCBYWCwgWFggfSwKLSAgeyAiaW50byIsCVhYLCBYWCwgWFggfSwKLSAgeyAiaXJldCIsCVhYLCBYWCwgWFggfSwKLSAgLyogZDAgKi8KLSAgeyBHUlAyYl9vbmUgfSwKLSAgeyBHUlAyU19vbmUgfSwKLSAgeyBHUlAyYl9jbCB9LAotICB7IEdSUDJTX2NsIH0sCi0gIHsgImFhbSIsCXNJYiwgWFgsIFhYIH0sCi0gIHsgImFhZCIsCXNJYiwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB7ICJ4bGF0IiwJRFNCWCwgWFgsIFhYIH0sCi0gIC8qIGQ4ICovCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICAvKiBlMCAqLwotICB7ICJsb29wbmUiLAlKYiwgWFgsIFhYIH0sCi0gIHsgImxvb3BlIiwJSmIsIFhYLCBYWCB9LAotICB7ICJsb29wIiwJSmIsIFhYLCBYWCB9LAotICB7ICJqRWN4eiIsCUpiLCBYWCwgWFggfSwKLSAgeyAiaW4iLAlBTCwgSWIsIFhYIH0sCi0gIHsgImluIiwJZUFYLCBJYiwgWFggfSwKLSAgeyAib3V0IiwJSWIsIEFMLCBYWCB9LAotICB7ICJvdXQiLAlJYiwgZUFYLCBYWCB9LAotICAvKiBlOCAqLwotICB7ICJjYWxsIiwJSnYsIFhYLCBYWCB9LAotICB7ICJqbXAiLAlKdiwgWFgsIFhYIH0sCi0gIHsgImxqbXAiLAlBcCwgWFgsIFhYIH0sCi0gIHsgImptcCIsCUpiLCBYWCwgWFggfSwKLSAgeyAiaW4iLAlBTCwgaW5kaXJEWCwgWFggfSwKLSAgeyAiaW4iLAllQVgsIGluZGlyRFgsIFhYIH0sCi0gIHsgIm91dCIsCWluZGlyRFgsIEFMLCBYWCB9LAotICB7ICJvdXQiLAlpbmRpckRYLCBlQVgsIFhYIH0sCi0gIC8qIGYwICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAkJCS8qIGxvY2sgcHJlZml4ICovCi0gIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiByZXBuZSAqLwotICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwJCQkvKiByZXB6ICovCi0gIHsgImhsdCIsCVhYLCBYWCwgWFggfSwKLSAgeyAiY21jIiwJWFgsIFhYLCBYWCB9LAotICB7IEdSUDNiIH0sCi0gIHsgR1JQM1MgfSwKLSAgLyogZjggKi8KLSAgeyAiY2xjIiwJWFgsIFhYLCBYWCB9LAotICB7ICJzdGMiLAlYWCwgWFgsIFhYIH0sCi0gIHsgImNsaSIsCVhYLCBYWCwgWFggfSwKLSAgeyAic3RpIiwJWFgsIFhYLCBYWCB9LAotICB7ICJjbGQiLAlYWCwgWFgsIFhYIH0sCi0gIHsgInN0ZCIsCVhYLCBYWCwgWFggfSwKLSAgeyBHUlA0IH0sCi0gIHsgR1JQNSB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZGlzMzg2X3R3b2J5dGVfYXR0W10gPSB7Ci0gIC8qIDAwICovCi0gIHsgR1JQNiB9LAotICB7IEdSUDcgfSwKLSAgeyAibGFyUyIsIEd2LCBFdywgWFggfSwKLSAgeyAibHNsUyIsIEd2LCBFdywgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJjbHRzIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogMDggKi8KLSAgeyAiaW52ZCIsIFhYLCBYWCwgWFggfSwKLSAgeyAid2JpbnZkIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAidWQyYSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgR1JQQU1EIH0sCi0gIHsgImZlbW1zIiwgWFgsIFhYLCBYWCB9LAotICB7ICIiLCBNWCwgRU0sIE9QU1VGIH0sIC8qIFNlZSBPUF8zRE5vd1N1ZmZpeCAqLwotICAvKiAxMCAqLwotICB7IFBSRUdSUDggfSwKLSAgeyBQUkVHUlA5IH0sCi0gIHsgIm1vdmxwcyIsIFhNLCBFWCwgU0lNRF9GaXh1cCwgJ2gnIH0sICAvKiByZWFsbHkgb25seSAyIG9wZXJhbmRzICovCi0gIHsgIm1vdmxwcyIsIEVYLCBYTSwgU0lNRF9GaXh1cCwgJ2gnIH0sCi0gIHsgInVucGNrbHBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJ1bnBja2hwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAibW92aHBzIiwgWE0sIEVYLCBTSU1EX0ZpeHVwLCAnbCcgfSwKLSAgeyAibW92aHBzIiwgRVgsIFhNLCBTSU1EX0ZpeHVwLCAnbCcgfSwKLSAgLyogMTggKi8KLSAgeyBHUlAxNCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogMjAgKi8KLSAgLyogdGhlc2UgYXJlIGFsbCBiYWNrd2FyZCBpbiBhcHBlbmRpeCBBIG9mIHRoZSBpbnRlbCBib29rICovCi0gIHsgIm1vdkwiLCBSZCwgQ2QsIFhYIH0sCi0gIHsgIm1vdkwiLCBSZCwgRGQsIFhYIH0sCi0gIHsgIm1vdkwiLCBDZCwgUmQsIFhYIH0sCi0gIHsgIm1vdkwiLCBEZCwgUmQsIFhYIH0sCi0gIHsgIm1vdkwiLCBSZCwgVGQsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZMIiwgVGQsIFJkLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogMjggKi8KLSAgeyAibW92YXBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJtb3ZhcHMiLCBFWCwgWE0sIFhYIH0sCi0gIHsgUFJFR1JQMiB9LAotICB7ICJtb3ZudHBzIiwgRXYsIFhNLCBYWCB9LAotICB7IFBSRUdSUDQgfSwKLSAgeyBQUkVHUlAzIH0sCi0gIHsgInVjb21pc3MiLCBYTSwgRVgsIFhYIH0sCi0gIHsgImNvbWlzcyIsIFhNLCBFWCwgWFggfSwKLSAgLyogMzAgKi8KLSAgeyAid3Jtc3IiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInJkdHNjIiwgWFgsIFhYLCBYWCB9LAotICB7ICJyZG1zciIsIFhYLCBYWCwgWFggfSwKLSAgeyAicmRwbWMiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInN5c2VudGVyIiwgWFgsIFhYLCBYWCB9LAotICB7ICJzeXNleGl0IiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDM4ICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgLyogNDAgKi8KLSAgeyAiY21vdm8iLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZubyIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmIiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZhZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmUiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZuZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmJlIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92YSIsIEd2LCBFdiwgWFggfSwKLSAgLyogNDggKi8KLSAgeyAiY21vdnMiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZucyIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdnAiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZucCIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmwiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZnZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmxlIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92ZyIsIEd2LCBFdiwgWFggfSwKLSAgLyogNTAgKi8KLSAgeyAibW92bXNrcHMiLCBHdiwgRVgsIFhYIH0sCi0gIHsgUFJFR1JQMTMgfSwKLSAgeyBQUkVHUlAxMiB9LAotICB7IFBSRUdSUDExIH0sCi0gIHsgImFuZHBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJhbmRucHMiLCBYTSwgRVgsIFhYIH0sCi0gIHsgIm9ycHMiLCBYTSwgRVgsIFhYIH0sCi0gIHsgInhvcnBzIiwgWE0sIEVYLCBYWCB9LAotICAvKiA1OCAqLwotICB7IFBSRUdSUDAgfSwKLSAgeyBQUkVHUlAxMCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgUFJFR1JQMTQgfSwKLSAgeyBQUkVHUlA3IH0sCi0gIHsgUFJFR1JQNSB9LAotICB7IFBSRUdSUDYgfSwKLSAgLyogNjAgKi8KLSAgeyAicHVucGNrbGJ3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwdW5wY2tsd2QiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInB1bnBja2xkcSIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFja3Nzd2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBndGIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBndHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBndGQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhY2t1c3diIiwgTVgsIEVNLCBYWCB9LAotICAvKiA2OCAqLwotICB7ICJwdW5wY2toYnciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInB1bnBja2h3ZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHVucGNraGRxIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWNrc3NkdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZkIiwgTVgsIEVkLCBYWCB9LAotICB7ICJtb3ZxIiwgTVgsIEVNLCBYWCB9LAotICAvKiA3MCAqLwotICB7ICJwc2h1ZnciLCBNWCwgRU0sIEliIH0sCi0gIHsgR1JQMTAgfSwKLSAgeyBHUlAxMSB9LAotICB7IEdSUDEyIH0sCi0gIHsgInBjbXBlcWIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBlcXciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBjbXBlcWQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgImVtbXMiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDc4ICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIm1vdmQiLCBFZCwgTVgsIFhYIH0sCi0gIHsgIm1vdnEiLCBFTSwgTVgsIFhYIH0sCi0gIC8qIDgwICovCi0gIHsgImpvIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbm8iLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpiIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqYWUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImplIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbmUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpiZSIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamEiLCBKdiwgWFgsIFhYIH0sCi0gIC8qIDg4ICovCi0gIHsgImpzIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbnMiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpwIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbnAiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpsIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqZ2UiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpsZSIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamciLCBKdiwgWFgsIFhYIH0sCi0gIC8qIDkwICovCi0gIHsgInNldG8iLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldG5vIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRiIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRhZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0ZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bmUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGJlIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRhIiwgRWIsIFhYLCBYWCB9LAotICAvKiA5OCAqLwotICB7ICJzZXRzIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRucyIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0cCIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bnAiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGwiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGdlIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRsZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0ZyIsIEViLCBYWCwgWFggfSwKLSAgLyogYTAgKi8KLSAgeyAicHVzaFAiLCBmcywgWFgsIFhYIH0sCi0gIHsgInBvcFAiLCBmcywgWFgsIFhYIH0sCi0gIHsgImNwdWlkIiwgWFgsIFhYLCBYWCB9LAotICB7ICJidFMiLCBFdiwgR3YsIFhYIH0sCi0gIHsgInNobGRTIiwgRXYsIEd2LCBJYiB9LAotICB7ICJzaGxkUyIsIEV2LCBHdiwgQ0wgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICAvKiBhOCAqLwotICB7ICJwdXNoUCIsIGdzLCBYWCwgWFggfSwKLSAgeyAicG9wUCIsIGdzLCBYWCwgWFggfSwKLSAgeyAicnNtIiwgWFgsIFhYLCBYWCB9LAotICB7ICJidHNTIiwgRXYsIEd2LCBYWCB9LAotICB7ICJzaHJkUyIsIEV2LCBHdiwgSWIgfSwKLSAgeyAic2hyZFMiLCBFdiwgR3YsIENMIH0sCi0gIHsgR1JQMTMgfSwKLSAgeyAiaW11bFMiLCBHdiwgRXYsIFhYIH0sCi0gIC8qIGIwICovCi0gIHsgImNtcHhjaGdCIiwgRWIsIEdiLCBYWCB9LAotICB7ICJjbXB4Y2hnUyIsIEV2LCBHdiwgWFggfSwKLSAgeyAibHNzUyIsIEd2LCBNcCwgWFggfSwKLSAgeyAiYnRyUyIsIEV2LCBHdiwgWFggfSwKLSAgeyAibGZzUyIsIEd2LCBNcCwgWFggfSwKLSAgeyAibGdzUyIsIEd2LCBNcCwgWFggfSwKLSAgeyAibW92emJSIiwgR3YsIEViLCBYWCB9LAotICB7ICJtb3Z6d1IiLCBHdiwgRXcsIFhYIH0sIC8qIHllcywgdGhlcmUgcmVhbGx5IGlzIG1vdnp3dyAhICovCi0gIC8qIGI4ICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJ1ZDJiIiwgWFgsIFhYLCBYWCB9LAotICB7IEdSUDggfSwKLSAgeyAiYnRjUyIsIEV2LCBHdiwgWFggfSwKLSAgeyAiYnNmUyIsIEd2LCBFdiwgWFggfSwKLSAgeyAiYnNyUyIsIEd2LCBFdiwgWFggfSwKLSAgeyAibW92c2JSIiwgR3YsIEViLCBYWCB9LAotICB7ICJtb3Zzd1IiLCBHdiwgRXcsIFhYIH0sIC8qIHllcywgdGhlcmUgcmVhbGx5IGlzIG1vdnN3dyAhICovCi0gIC8qIGMwICovCi0gIHsgInhhZGRCIiwgRWIsIEdiLCBYWCB9LAotICB7ICJ4YWRkUyIsIEV2LCBHdiwgWFggfSwKLSAgeyBQUkVHUlAxIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwaW5zcnciLCBNWCwgRXYsIEliIH0sCi0gIHsgInBleHRydyIsIEV2LCBNWCwgSWIgfSwKLSAgeyAic2h1ZnBzIiwgWE0sIEVYLCBJYiB9LAotICB7IEdSUDkgfSwKLSAgLyogYzggKi8KLSAgeyAiYnN3YXAiLCBlQVgsIFhYLCBYWCB9LAkvKiBic3dhcCBkb2Vzbid0IHN1cHBvcnQgMTYgYml0IHJlZ3MgKi8KLSAgeyAiYnN3YXAiLCBlQ1gsIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVEWCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZUJYLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlU1AsIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVCUCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZVNJLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlREksIFhYLCBYWCB9LAotICAvKiBkMCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicHNybHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzcmxkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3JscSIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBtdWxsdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBtb3Ztc2tiIiwgRXYsIE1YLCBYWCB9LAotICAvKiBkOCAqLwotICB7ICJwc3VidXNiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3VidXN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbWludWIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhbmQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGR1c2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGR1c3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtYXh1YiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFuZG4iLCBNWCwgRU0sIFhYIH0sCi0gIC8qIGUwICovCi0gIHsgInBhdmdiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3JhdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNyYWQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhdmd3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbXVsaHV3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbXVsaHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZudHEiLCBFdiwgTVgsIFhYIH0sCi0gIC8qIGU4ICovCi0gIHsgInBzdWJzYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHN1YnN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwbWluc3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBvciIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHNiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkc3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtYXhzdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHhvciIsIE1YLCBFTSwgWFggfSwKLSAgLyogZjAgKi8KLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBzbGx3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc2xsZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNsbHEiLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwbWFkZHdkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc2FkYnciLCBNWCwgRU0sIFhYIH0sCi0gIHsgIm1hc2ttb3ZxIiwgTVgsIEVNLCBYWCB9LAotICAvKiBmOCAqLwotICB7ICJwc3ViYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHN1YnciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzdWJkIiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicGFkZGIiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGR3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IGRpczM4Nl90d29ieXRlX2ludGVsW10gPSB7Ci0gIC8qIDAwICovCi0gIHsgR1JQNiB9LAotICB7IEdSUDcgfSwKLSAgeyAibGFyIiwgR3YsIEV3LCBYWCB9LAotICB7ICJsc2wiLCBHdiwgRXcsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiY2x0cyIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDA4ICovCi0gIHsgImludmQiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIndiaW52ZCIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInVkMmEiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7IEdSUEFNRCB9LAotICB7ICJmZW1tcyIgLCBYWCwgWFgsIFhYfSwKLSAgeyAiIiwgTVgsIEVNLCBPUFNVRiB9LCAvKiBTZWUgT1BfM0ROb3dTdWZmaXggKi8KLSAgLyogMTAgKi8KLSAgeyBQUkVHUlA4IH0sCi0gIHsgUFJFR1JQOSB9LAotICB7ICJtb3ZscHMiLCBYTSwgRVgsIFNJTURfRml4dXAsICdoJyB9LCAgLyogcmVhbGx5IG9ubHkgMiBvcGVyYW5kcyAqLwotICB7ICJtb3ZscHMiLCBFWCwgWE0sIFNJTURfRml4dXAsICdoJyB9LAotICB7ICJ1bnBja2xwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAidW5wY2tocHMiLCBYTSwgRVgsIFhYIH0sCi0gIHsgIm1vdmhwcyIsIFhNLCBFWCwgU0lNRF9GaXh1cCwgJ2wnIH0sCi0gIHsgIm1vdmhwcyIsIEVYLCBYTSwgU0lNRF9GaXh1cCwgJ2wnIH0sCi0gIC8qIDE4ICovCi0gIHsgR1JQMTQgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDIwICovCi0gIC8qIHRoZXNlIGFyZSBhbGwgYmFja3dhcmQgaW4gYXBwZW5kaXggQSBvZiB0aGUgaW50ZWwgYm9vayAqLwotICB7ICJtb3YiLCBSZCwgQ2QsIFhYIH0sCi0gIHsgIm1vdiIsIFJkLCBEZCwgWFggfSwKLSAgeyAibW92IiwgQ2QsIFJkLCBYWCB9LAotICB7ICJtb3YiLCBEZCwgUmQsIFhYIH0sCi0gIHsgIm1vdiIsIFJkLCBUZCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIm1vdiIsIFRkLCBSZCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDI4ICovCi0gIHsgIm1vdmFwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAibW92YXBzIiwgRVgsIFhNLCBYWCB9LAotICB7IFBSRUdSUDIgfSwKLSAgeyAibW92bnRwcyIsIEV2LCBYTSwgWFggfSwKLSAgeyBQUkVHUlA0IH0sCi0gIHsgUFJFR1JQMyB9LAotICB7ICJ1Y29taXNzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJjb21pc3MiLCBYTSwgRVgsIFhYIH0sCi0gIC8qIDMwICovCi0gIHsgIndybXNyIiwgWFgsIFhYLCBYWCB9LAotICB7ICJyZHRzYyIsIFhYLCBYWCwgWFggfSwKLSAgeyAicmRtc3IiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInJkcG1jIiwgWFgsIFhYLCBYWCB9LAotICB7ICJzeXNlbnRlciIsIFhYLCBYWCwgWFggfSwKLSAgeyAic3lzZXhpdCIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICAvKiAzOCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIDQwICovCi0gIHsgImNtb3ZvIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bm8iLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZiIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92YWUiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZlIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bmUiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZiZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmEiLCBHdiwgRXYsIFhYIH0sCi0gIC8qIDQ4ICovCi0gIHsgImNtb3ZzIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bnMiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZwIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92bnAiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZsIiwgR3YsIEV2LCBYWCB9LAotICB7ICJjbW92Z2UiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImNtb3ZsZSIsIEd2LCBFdiwgWFggfSwKLSAgeyAiY21vdmciLCBHdiwgRXYsIFhYIH0sCi0gIC8qIDUwICovCi0gIHsgIm1vdm1za3BzIiwgR3YsIEVYLCBYWCB9LAotICB7IFBSRUdSUDEzIH0sCi0gIHsgUFJFR1JQMTIgfSwKLSAgeyBQUkVHUlAxMSB9LAotICB7ICJhbmRwcyIsIFhNLCBFWCwgWFggfSwKLSAgeyAiYW5kbnBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJvcnBzIiwgWE0sIEVYLCBYWCB9LAotICB7ICJ4b3JwcyIsIFhNLCBFWCwgWFggfSwKLSAgLyogNTggKi8KLSAgeyBQUkVHUlAwIH0sCi0gIHsgUFJFR1JQMTAgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7IFBSRUdSUDE0IH0sCi0gIHsgUFJFR1JQNyB9LAotICB7IFBSRUdSUDUgfSwKLSAgeyBQUkVHUlA2IH0sCi0gIC8qIDYwICovCi0gIHsgInB1bnBja2xidyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHVucGNrbHdkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwdW5wY2tsZHEiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhY2tzc3diIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZ3RiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZ3R3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZ3RkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWNrdXN3YiIsIE1YLCBFTSwgWFggfSwKLSAgLyogNjggKi8KLSAgeyAicHVucGNraGJ3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwdW5wY2tod2QiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInB1bnBja2hkcSIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFja3NzZHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAibW92ZCIsIE1YLCBFZCwgWFggfSwKLSAgeyAibW92cSIsIE1YLCBFTSwgWFggfSwKLSAgLyogNzAgKi8KLSAgeyAicHNodWZ3IiwgTVgsIEVNLCBJYiB9LAotICB7IEdSUDEwIH0sCi0gIHsgR1JQMTEgfSwKLSAgeyBHUlAxMiB9LAotICB7ICJwY21wZXFiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZXF3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwY21wZXFkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJlbW1zIiwgWFgsIFhYLCBYWCB9LAotICAvKiA3OCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJtb3ZkIiwgRWQsIE1YLCBYWCB9LAotICB7ICJtb3ZxIiwgRU0sIE1YLCBYWCB9LAotICAvKiA4MCAqLwotICB7ICJqbyIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5vIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqYiIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamFlIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqZSIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5lIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqYmUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImphIiwgSnYsIFhYLCBYWCB9LAotICAvKiA4OCAqLwotICB7ICJqcyIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5zIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqcCIsIEp2LCBYWCwgWFggfSwKLSAgeyAiam5wIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbCIsIEp2LCBYWCwgWFggfSwKLSAgeyAiamdlIiwgSnYsIFhYLCBYWCB9LAotICB7ICJqbGUiLCBKdiwgWFgsIFhYIH0sCi0gIHsgImpnIiwgSnYsIFhYLCBYWCB9LAotICAvKiA5MCAqLwotICB7ICJzZXRvIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRubyIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0YiIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0YWUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldG5lIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRiZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0YSIsIEViLCBYWCwgWFggfSwKLSAgLyogOTggKi8KLSAgeyAic2V0cyIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bnMiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldHAiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldG5wIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRsIiwgRWIsIFhYLCBYWCB9LAotICB7ICJzZXRnZSIsIEViLCBYWCwgWFggfSwKLSAgeyAic2V0bGUiLCBFYiwgWFgsIFhYIH0sCi0gIHsgInNldGciLCBFYiwgWFgsIFhYIH0sCi0gIC8qIGEwICovCi0gIHsgInB1c2giLCBmcywgWFgsIFhYIH0sCi0gIHsgInBvcCIsIGZzLCBYWCwgWFggfSwKLSAgeyAiY3B1aWQiLCBYWCwgWFgsIFhYIH0sCi0gIHsgImJ0IiwgRXYsIEd2LCBYWCB9LAotICB7ICJzaGxkIiwgRXYsIEd2LCBJYiB9LAotICB7ICJzaGxkIiwgRXYsIEd2LCBDTCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIC8qIGE4ICovCi0gIHsgInB1c2giLCBncywgWFgsIFhYIH0sCi0gIHsgInBvcCIsIGdzLCBYWCwgWFggfSwKLSAgeyAicnNtIiAsIFhYLCBYWCwgWFh9LAotICB7ICJidHMiLCBFdiwgR3YsIFhYIH0sCi0gIHsgInNocmQiLCBFdiwgR3YsIEliIH0sCi0gIHsgInNocmQiLCBFdiwgR3YsIENMIH0sCi0gIHsgR1JQMTMgfSwKLSAgeyAiaW11bCIsIEd2LCBFdiwgWFggfSwKLSAgLyogYjAgKi8KLSAgeyAiY21weGNoZyIsIEViLCBHYiwgWFggfSwKLSAgeyAiY21weGNoZyIsIEV2LCBHdiwgWFggfSwKLSAgeyAibHNzIiwgR3YsIE1wLCBYWCB9LAotICB7ICJidHIiLCBFdiwgR3YsIFhYIH0sCi0gIHsgImxmcyIsIEd2LCBNcCwgWFggfSwKLSAgeyAibGdzIiwgR3YsIE1wLCBYWCB9LAotICB7ICJtb3Z6eCIsIEd2LCBFYiwgWFggfSwKLSAgeyAibW92engiLCBHdiwgRXcsIFhYIH0sCi0gIC8qIGI4ICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJ1ZDJiIiwgWFgsIFhYLCBYWCB9LAotICB7IEdSUDggfSwKLSAgeyAiYnRjIiwgRXYsIEd2LCBYWCB9LAotICB7ICJic2YiLCBHdiwgRXYsIFhYIH0sCi0gIHsgImJzciIsIEd2LCBFdiwgWFggfSwKLSAgeyAibW92c3giLCBHdiwgRWIsIFhYIH0sCi0gIHsgIm1vdnN4IiwgR3YsIEV3LCBYWCB9LAotICAvKiBjMCAqLwotICB7ICJ4YWRkIiwgRWIsIEdiLCBYWCB9LAotICB7ICJ4YWRkIiwgRXYsIEd2LCBYWCB9LAotICB7IFBSRUdSUDEgfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBpbnNydyIsIE1YLCBFdiwgSWIgfSwKLSAgeyAicGV4dHJ3IiwgRXYsIE1YLCBJYiB9LAotICB7ICJzaHVmcHMiLCBYTSwgRVgsIEliIH0sCi0gIHsgR1JQOSB9LAotICAvKiBjOCAqLwotICB7ICJic3dhcCIsIGVBWCwgWFgsIFhYIH0sCS8qIGJzd2FwIGRvZXNuJ3Qgc3VwcG9ydCAxNiBiaXQgcmVncyAqLwotICB7ICJic3dhcCIsIGVDWCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZURYLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlQlgsIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVTUCwgWFgsIFhYIH0sCi0gIHsgImJzd2FwIiwgZUJQLCBYWCwgWFggfSwKLSAgeyAiYnN3YXAiLCBlU0ksIFhYLCBYWCB9LAotICB7ICJic3dhcCIsIGVESSwgWFgsIFhYIH0sCi0gIC8qIGQwICovCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwc3JsdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHNybGQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzcmxxIiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicG11bGx3IiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicG1vdm1za2IiLCBFdiwgTVgsIFhYIH0sCi0gIC8qIGQ4ICovCi0gIHsgInBzdWJ1c2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzdWJ1c3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtaW51YiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFuZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHVzYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHVzdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicG1heHViIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYW5kbiIsIE1YLCBFTSwgWFggfSwKLSAgLyogZTAgKi8KLSAgeyAicGF2Z2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzcmF3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3JhZCIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGF2Z3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtdWxodXciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtdWxodyIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgIm1vdm50cSIsIEV2LCBNWCwgWFggfSwKLSAgLyogZTggKi8KLSAgeyAicHN1YnNiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3Vic3ciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBtaW5zdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicG9yIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwYWRkc2IiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGRzdyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicG1heHN3IiwgTVgsIEVNLCBYWCB9LAotICB7ICJweG9yIiwgTVgsIEVNLCBYWCB9LAotICAvKiBmMCAqLwotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgeyAicHNsbHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzbGxkIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc2xscSIsIE1YLCBFTSwgWFggfSwKLSAgeyAiKGJhZCkiLCBYWCwgWFgsIFhYIH0sCi0gIHsgInBtYWRkd2QiLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBzYWRidyIsIE1YLCBFTSwgWFggfSwKLSAgeyAibWFza21vdnEiLCBNWCwgRU0sIFhYIH0sCi0gIC8qIGY4ICovCi0gIHsgInBzdWJiIiwgTVgsIEVNLCBYWCB9LAotICB7ICJwc3VidyIsIE1YLCBFTSwgWFggfSwKLSAgeyAicHN1YmQiLCBNWCwgRU0sIFhYIH0sCi0gIHsgIihiYWQpIiwgWFgsIFhYLCBYWCB9LAotICB7ICJwYWRkYiIsIE1YLCBFTSwgWFggfSwKLSAgeyAicGFkZHciLCBNWCwgRU0sIFhYIH0sCi0gIHsgInBhZGRkIiwgTVgsIEVNLCBYWCB9LAotICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgb25lYnl0ZV9oYXNfbW9kcm1bMjU2XSA9IHsKLSAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KLSAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KLSAgLyogMDAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMDAgKi8KLSAgLyogMTAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMTAgKi8KLSAgLyogMjAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMjAgKi8KLSAgLyogMzAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMzAgKi8KLSAgLyogNDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNDAgKi8KLSAgLyogNTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNTAgKi8KLSAgLyogNjAgKi8gMCwwLDEsMSwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwgLyogNjAgKi8KLSAgLyogNzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNzAgKi8KLSAgLyogODAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogODAgKi8KLSAgLyogOTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOTAgKi8KLSAgLyogYTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYTAgKi8KLSAgLyogYjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYjAgKi8KLSAgLyogYzAgKi8gMSwxLDAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwgLyogYzAgKi8KLSAgLyogZDAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwgLyogZDAgKi8KLSAgLyogZTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZTAgKi8KLSAgLyogZjAgKi8gMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDEsMSAgLyogZjAgKi8KLSAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KLSAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHR3b2J5dGVfaGFzX21vZHJtWzI1Nl0gPSB7Ci0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qIDAwICovIDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsIC8qIDBmICovCi0gIC8qIDEwICovIDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsIC8qIDFmICovCi0gIC8qIDIwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDJmICovCi0gIC8qIDMwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDNmICovCi0gIC8qIDQwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDRmICovCi0gIC8qIDUwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDEsIC8qIDVmICovCi0gIC8qIDYwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDEsIC8qIDZmICovCi0gIC8qIDcwICovIDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwxLDEsIC8qIDdmICovCi0gIC8qIDgwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDhmICovCi0gIC8qIDkwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDlmICovCi0gIC8qIGEwICovIDAsMCwwLDEsMSwxLDEsMSwwLDAsMCwxLDEsMSwxLDEsIC8qIGFmICovCi0gIC8qIGIwICovIDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxLDEsMSwxLDEsIC8qIGJmICovCi0gIC8qIGMwICovIDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsIC8qIGNmICovCi0gIC8qIGQwICovIDAsMSwxLDEsMCwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIGRmICovCi0gIC8qIGUwICovIDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIGVmICovCi0gIC8qIGYwICovIDAsMSwxLDEsMCwxLDEsMSwxLDEsMSwwLDEsMSwxLDAgIC8qIGZmICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0d29ieXRlX3VzZXNfZjNfcHJlZml4WzI1Nl0gPSB7Ci0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qIDAwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDBmICovCi0gIC8qIDEwICovIDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDFmICovCi0gIC8qIDIwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwwLDAsIC8qIDJmICovCi0gIC8qIDMwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDNmICovCi0gIC8qIDQwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDRmICovCi0gIC8qIDUwICovIDAsMSwxLDEsMCwwLDAsMCwxLDEsMCwwLDEsMSwxLDEsIC8qIDVmICovCi0gIC8qIDYwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDZmICovCi0gIC8qIDcwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDdmICovCi0gIC8qIDgwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDhmICovCi0gIC8qIDkwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDlmICovCi0gIC8qIGEwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGFmICovCi0gIC8qIGIwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGJmICovCi0gIC8qIGMwICovIDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGNmICovCi0gIC8qIGQwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGRmICovCi0gIC8qIGUwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGVmICovCi0gIC8qIGYwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgIC8qIGZmICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi19OwotCi1zdGF0aWMgY2hhciBvYnVmWzEwMF07Ci1zdGF0aWMgY2hhciAqb2J1ZnA7Ci1zdGF0aWMgY2hhciBzY3JhdGNoYnVmWzEwMF07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqc3RhcnRfY29kZXA7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqaW5zbl9jb2RlcDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpjb2RlcDsKLXN0YXRpYyBkaXNhc3NlbWJsZV9pbmZvICp0aGVfaW5mbzsKLXN0YXRpYyBpbnQgbW9kOwotc3RhdGljIGludCBybTsKLXN0YXRpYyBpbnQgcmVnOwotc3RhdGljIHZvaWQgb2FwcGVuZCBQQVJBTVMgKChjb25zdCBjaGFyICpzKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpuYW1lczMyW109ewotICAiJWVheCIsIiVlY3giLCIlZWR4IiwiJWVieCIsICIlZXNwIiwiJWVicCIsIiVlc2kiLCIlZWRpIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqbmFtZXMxNltdID0gewotICAiJWF4IiwiJWN4IiwiJWR4IiwiJWJ4IiwiJXNwIiwiJWJwIiwiJXNpIiwiJWRpIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqbmFtZXM4W10gPSB7Ci0gICIlYWwiLCIlY2wiLCIlZGwiLCIlYmwiLCIlYWgiLCIlY2giLCIlZGgiLCIlYmgiLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpuYW1lc19zZWdbXSA9IHsKLSAgIiVlcyIsIiVjcyIsIiVzcyIsIiVkcyIsIiVmcyIsIiVncyIsIiU/IiwiJT8iLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICppbmRleDE2W10gPSB7Ci0gICIlYngsJXNpIiwiJWJ4LCVkaSIsIiVicCwlc2kiLCIlYnAsJWRpIiwiJXNpIiwiJWRpIiwiJWJwIiwiJWJ4IgotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZ3Jwc1tdWzhdID0gewotICAvKiBHUlAxYiAqLwotICB7Ci0gICAgeyAiYWRkQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJvckEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAiYWRjQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJzYmJBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgImFuZEEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAic3ViQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJ4b3JBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgImNtcEEiLAlFYiwgSWIsIFhYIH0KLSAgfSwKLSAgLyogR1JQMVMgKi8KLSAgewotICAgIHsgImFkZFEiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAib3JRIiwJRXYsIEl2LCBYWCB9LAotICAgIHsgImFkY1EiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAic2JiUSIsCUV2LCBJdiwgWFggfSwKLSAgICB7ICJhbmRRIiwJRXYsIEl2LCBYWCB9LAotICAgIHsgInN1YlEiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAieG9yUSIsCUV2LCBJdiwgWFggfSwKLSAgICB7ICJjbXBRIiwJRXYsIEl2LCBYWCB9Ci0gIH0sCi0gIC8qIEdSUDFTcyAqLwotICB7Ci0gICAgeyAiYWRkUSIsCUV2LCBzSWIsIFhYIH0sCi0gICAgeyAib3JRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJhZGNRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJzYmJRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJhbmRRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJzdWJRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJ4b3JRIiwJRXYsIHNJYiwgWFggfSwKLSAgICB7ICJjbXBRIiwJRXYsIHNJYiwgWFggfQotICB9LAotICAvKiBHUlAyYiAqLwotICB7Ci0gICAgeyAicm9sQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJyb3JBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgInJjbEEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAicmNyQSIsCUViLCBJYiwgWFggfSwKLSAgICB7ICJzaGxBIiwJRWIsIEliLCBYWCB9LAotICAgIHsgInNockEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAic2FyQSIsCUViLCBJYiwgWFggfSwKLSAgfSwKLSAgLyogR1JQMlMgKi8KLSAgewotICAgIHsgInJvbFEiLAlFdiwgSWIsIFhYIH0sCi0gICAgeyAicm9yUSIsCUV2LCBJYiwgWFggfSwKLSAgICB7ICJyY2xRIiwJRXYsIEliLCBYWCB9LAotICAgIHsgInJjclEiLAlFdiwgSWIsIFhYIH0sCi0gICAgeyAic2hsUSIsCUV2LCBJYiwgWFggfSwKLSAgICB7ICJzaHJRIiwJRXYsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInNhclEiLAlFdiwgSWIsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDJiX29uZSAqLwotICB7Ci0gICAgeyAicm9sQSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICJyb3JBIiwJRWIsIFhYLCBYWCB9LAotICAgIHsgInJjbEEiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAicmNyQSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICJzaGxBIiwJRWIsIFhYLCBYWCB9LAotICAgIHsgInNockEiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAic2FyQSIsCUViLCBYWCwgWFggfSwKLSAgfSwKLSAgLyogR1JQMlNfb25lICovCi0gIHsKLSAgICB7ICJyb2xRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgInJvclEiLAlFdiwgWFgsIFhYIH0sCi0gICAgeyAicmNsUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICJyY3JRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgInNobFEiLAlFdiwgWFgsIFhYIH0sCi0gICAgeyAic2hyUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFh9LAotICAgIHsgInNhclEiLAlFdiwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDJiX2NsICovCi0gIHsKLSAgICB7ICJyb2xBIiwJRWIsIENMLCBYWCB9LAotICAgIHsgInJvckEiLAlFYiwgQ0wsIFhYIH0sCi0gICAgeyAicmNsQSIsCUViLCBDTCwgWFggfSwKLSAgICB7ICJyY3JBIiwJRWIsIENMLCBYWCB9LAotICAgIHsgInNobEEiLAlFYiwgQ0wsIFhYIH0sCi0gICAgeyAic2hyQSIsCUViLCBDTCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJzYXJBIiwJRWIsIENMLCBYWCB9LAotICB9LAotICAvKiBHUlAyU19jbCAqLwotICB7Ci0gICAgeyAicm9sUSIsCUV2LCBDTCwgWFggfSwKLSAgICB7ICJyb3JRIiwJRXYsIENMLCBYWCB9LAotICAgIHsgInJjbFEiLAlFdiwgQ0wsIFhYIH0sCi0gICAgeyAicmNyUSIsCUV2LCBDTCwgWFggfSwKLSAgICB7ICJzaGxRIiwJRXYsIENMLCBYWCB9LAotICAgIHsgInNoclEiLAlFdiwgQ0wsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAic2FyUSIsCUV2LCBDTCwgWFggfQotICB9LAotICAvKiBHUlAzYiAqLwotICB7Ci0gICAgeyAidGVzdEEiLAlFYiwgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAibm90QSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICJuZWdBIiwJRWIsIFhYLCBYWCB9LAotICAgIHsgIm11bEIiLAlBTCwgRWIsIFhYIH0sCi0gICAgeyAiaW11bEIiLAlBTCwgRWIsIFhYIH0sCi0gICAgeyAiZGl2QiIsCUFMLCBFYiwgWFggfSwKLSAgICB7ICJpZGl2QiIsCUFMLCBFYiwgWFggfQotICB9LAotICAvKiBHUlAzUyAqLwotICB7Ci0gICAgeyAidGVzdFEiLAlFdiwgSXYsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAibm90USIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICJuZWdRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgIm11bFMiLAllQVgsIEV2LCBYWCB9LAotICAgIHsgImltdWxTIiwJZUFYLCBFdiwgWFggfSwKLSAgICB7ICJkaXZTIiwJZUFYLCBFdiwgWFggfSwKLSAgICB7ICJpZGl2UyIsCWVBWCwgRXYsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDQgKi8KLSAgewotICAgIHsgImluY0EiLAlFYiwgWFgsIFhYIH0sCi0gICAgeyAiZGVjQSIsCUViLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgfSwKLSAgLyogR1JQNSAqLwotICB7Ci0gICAgeyAiaW5jUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICJkZWNRIiwJRXYsIFhYLCBYWCB9LAotICAgIHsgImNhbGxQIiwJaW5kaXJFdiwgWFgsIFhYIH0sCi0gICAgeyAiY2FsbFAiLAlpbmRpckV2LCBYWCwgWFggfSwKLSAgICB7ICJqbXBQIiwJaW5kaXJFdiwgWFgsIFhYIH0sCi0gICAgeyAibGptcFAiLAlpbmRpckV2LCBYWCwgWFggfSwKLSAgICB7ICJwdXNoUSIsCUV2LCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgfSwKLSAgLyogR1JQNiAqLwotICB7Ci0gICAgeyAic2xkdCIsCUV3LCBYWCwgWFggfSwKLSAgICB7ICJzdHIiLAlFdywgWFgsIFhYIH0sCi0gICAgeyAibGxkdCIsCUV3LCBYWCwgWFggfSwKLSAgICB7ICJsdHIiLAlFdywgWFgsIFhYIH0sCi0gICAgeyAidmVyciIsCUV3LCBYWCwgWFggfSwKLSAgICB7ICJ2ZXJ3IiwJRXcsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9Ci0gIH0sCi0gIC8qIEdSUDcgKi8KLSAgewotICAgIHsgInNnZHQiLCBFdywgWFgsIFhYIH0sCi0gICAgeyAic2lkdCIsIEV3LCBYWCwgWFggfSwKLSAgICB7ICJsZ2R0IiwgRXcsIFhYLCBYWCB9LAotICAgIHsgImxpZHQiLCBFdywgWFgsIFhYIH0sCi0gICAgeyAic21zdyIsIEV3LCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsIFhYLCBYWCwgWFggfSwKLSAgICB7ICJsbXN3IiwgRXcsIFhYLCBYWCB9LAotICAgIHsgImludmxwZyIsIEV3LCBYWCwgWFggfSwKLSAgfSwKLSAgLyogR1JQOCAqLwotICB7Ci0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiYnRRIiwJRXYsIEliLCBYWCB9LAotICAgIHsgImJ0c1EiLAlFdiwgSWIsIFhYIH0sCi0gICAgeyAiYnRyUSIsCUV2LCBJYiwgWFggfSwKLSAgICB7ICJidGNRIiwJRXYsIEliLCBYWCB9LAotICB9LAotICAvKiBHUlA5ICovCi0gIHsKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJjbXB4Y2hnOGIiLCBFdiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDEwICovCi0gIHsKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJwc3JsdyIsCU1TLCBJYiwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJwc3JhdyIsCU1TLCBJYiwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICJwc2xsdyIsCU1TLCBJYiwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgfSwKLSAgLyogR1JQMTEgKi8KLSAgewotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInBzcmxkIiwJTVMsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInBzcmFkIiwJTVMsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICAgIHsgInBzbGxkIiwJTVMsIEliLCBYWCB9LAotICAgIHsgIihiYWQpIiwJWFgsIFhYLCBYWCB9LAotICB9LAotICAvKiBHUlAxMiAqLwotICB7Ci0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAicHNybHEiLAlNUywgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAicHNsbHEiLAlNUywgSWIsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDEzICovCi0gIHsKLSAgICB7ICJmeHNhdmUiLCBFdiwgWFgsIFhYIH0sCi0gICAgeyAiZnhyc3RvciIsIEV2LCBYWCwgWFggfSwKLSAgICB7ICJsZG14Y3NyIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgInN0bXhjc3IiLCBFdiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAic2ZlbmNlIiwgTm9uZSwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIEdSUDE0ICovCi0gIHsKLSAgICB7ICJwcmVmZXRjaG50YSIsIEV2LCBYWCwgWFggfSwKLSAgICB7ICJwcmVmZXRjaHQwIiwgRXYsIFhYLCBYWCB9LAotICAgIHsgInByZWZldGNodDEiLCBFdiwgWFgsIFhYIH0sCi0gICAgeyAicHJlZmV0Y2h0MiIsIEV2LCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgfSwKLSAgLyogR1JQQU1EICovCi0gIHsKLSAgICB7ICJwcmVmZXRjaCIsIEViLCBYWCwgWFggfSwKLSAgICB7ICJwcmVmZXRjaHciLCBFYiwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0KLQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgcHJlZml4X3VzZXJfdGFibGVbXVsyXSA9IHsKLSAgLyogUFJFR1JQMCAqLwotICB7Ci0gICAgeyAiYWRkcHMiLCBYTSwgRVgsIFhYIH0sCi0gICAgeyAiYWRkc3MiLCBYTSwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDEgKi8KLSAgewotICAgIHsgIiIsIFhNLCBFWCwgT1BTSU1EIH0sCS8qIFNlZSBPUF9TSU1EX1NVRkZJWCAqLwotICAgIHsgIiIsIFhNLCBFWCwgT1BTSU1EIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDIgKi8KLSAgewotICAgIHsgImN2dHBpMnBzIiwgWE0sIEVNLCBYWCB9LAotICAgIHsgImN2dHNpMnNzIiwgWE0sIEV2LCBYWCB9LAotICB9LAotICAvKiBQUkVHUlAzICovCi0gIHsKLSAgICB7ICJjdnRwczJwaSIsIE1YLCBFWCwgWFggfSwKLSAgICB7ICJjdnRzczJzaSIsIEd2LCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQNCAqLwotICB7Ci0gICAgeyAiY3Z0dHBzMnBpIiwgTVgsIEVYLCBYWCB9LAotICAgIHsgImN2dHRzczJzaSIsIEd2LCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQNSAqLwotICB7Ci0gICAgeyAiZGl2cHMiLCBYTSwgRVgsIFhYIH0sCi0gICAgeyAiZGl2c3MiLCBYTSwgRVgsIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDYgKi8KLSAgewotICAgIHsgIm1heHBzIiwgWE0sIEVYLCBYWCB9LAotICAgIHsgIm1heHNzIiwgWE0sIEVYLCBYWCB9LAotICB9LAotICAvKiBQUkVHUlA3ICovCi0gIHsKLSAgICB7ICJtaW5wcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJtaW5zcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQOCAqLwotICB7Ci0gICAgeyAibW92dXBzIiwgWE0sIEVYLCBYWCB9LAotICAgIHsgIm1vdnNzIiwgWE0sIEVYLCBYWCB9LAotICB9LAotICAvKiBQUkVHUlA5ICovCi0gIHsKLSAgICB7ICJtb3Z1cHMiLCBFWCwgWE0sIFhYIH0sCi0gICAgeyAibW92c3MiLCBFWCwgWE0sIFhYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDEwICovCi0gIHsKLSAgICB7ICJtdWxwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJtdWxzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQMTEgKi8KLSAgewotICAgIHsgInJjcHBzIiwgWE0sIEVYLCBYWCB9LAotICAgIHsgInJjcHNzIiwgWE0sIEVYLCBYWCB9LAotICB9LAotICAvKiBQUkVHUlAxMiAqLwotICB7Ci0gICAgeyAicnNxcnRwcyIsIFhNLCBFWCwgWFggfSwKLSAgICB7ICJyc3FydHNzIiwgWE0sIEVYLCBYWCB9LAotICB9LAotICAvKiBQUkVHUlAxMyAqLwotICB7Ci0gICAgeyAic3FydHBzIiwgWE0sIEVYLCBYWCB9LAotICAgIHsgInNxcnRzcyIsIFhNLCBFWCwgWFggfSwKLSAgfSwKLSAgLyogUFJFR1JQMTQgKi8KLSAgewotICAgIHsgInN1YnBzIiwgWE0sIEVYLCBYWCB9LAotICAgIHsgInN1YnNzIiwgWE0sIEVYLCBYWCB9LAotICB9Ci19OwotCi0jZGVmaW5lIElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUiBfKCI8aW50ZXJuYWwgZGlzYXNzZW1ibGVyIGVycm9yPiIpCi0KLXN0YXRpYyB2b2lkCi1ja3ByZWZpeCAoKQotewotICBwcmVmaXhlcyA9IDA7Ci0gIHVzZWRfcHJlZml4ZXMgPSAwOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKLSAgICAgIHN3aXRjaCAoKmNvZGVwKQotCXsKLQljYXNlIDB4ZjM6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfUkVQWjsKLQkgIGJyZWFrOwotCWNhc2UgMHhmMjoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9SRVBOWjsKLQkgIGJyZWFrOwotCWNhc2UgMHhmMDoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9MT0NLOwotCSAgYnJlYWs7Ci0JY2FzZSAweDJlOgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0NTOwotCSAgYnJlYWs7Ci0JY2FzZSAweDM2OgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX1NTOwotCSAgYnJlYWs7Ci0JY2FzZSAweDNlOgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0RTOwotCSAgYnJlYWs7Ci0JY2FzZSAweDI2OgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0VTOwotCSAgYnJlYWs7Ci0JY2FzZSAweDY0OgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0ZTOwotCSAgYnJlYWs7Ci0JY2FzZSAweDY1OgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0dTOwotCSAgYnJlYWs7Ci0JY2FzZSAweDY2OgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0RBVEE7Ci0JICBicmVhazsKLQljYXNlIDB4Njc6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfQUREUjsKLQkgIGJyZWFrOwotCWNhc2UgRldBSVRfT1BDT0RFOgotCSAgLyogZndhaXQgaXMgcmVhbGx5IGFuIGluc3RydWN0aW9uLiAgSWYgdGhlcmUgYXJlIHByZWZpeGVzCi0JICAgICBiZWZvcmUgdGhlIGZ3YWl0LCB0aGV5IGJlbG9uZyB0byB0aGUgZndhaXQsICpub3QqIHRvIHRoZQotCSAgICAgZm9sbG93aW5nIGluc3RydWN0aW9uLiAgKi8KLQkgIGlmIChwcmVmaXhlcykKLQkgICAgewotCSAgICAgIHByZWZpeGVzIHw9IFBSRUZJWF9GV0FJVDsKLQkgICAgICBjb2RlcCsrOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgcHJlZml4ZXMgPSBQUkVGSVhfRldBSVQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuOwotCX0KLSAgICAgIGNvZGVwKys7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByZWZpeCBieXRlIFBSRUYsIG9yIE5VTEwgaWYgUFJFRiBpcyBub3QgYQotICAgcHJlZml4IGJ5dGUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wcmVmaXhfbmFtZSAocHJlZiwgc2l6ZWZsYWcpCi0gICAgIGludCBwcmVmOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHN3aXRjaCAocHJlZikKLSAgICB7Ci0gICAgY2FzZSAweGYzOgotICAgICAgcmV0dXJuICJyZXB6IjsKLSAgICBjYXNlIDB4ZjI6Ci0gICAgICByZXR1cm4gInJlcG56IjsKLSAgICBjYXNlIDB4ZjA6Ci0gICAgICByZXR1cm4gImxvY2siOwotICAgIGNhc2UgMHgyZToKLSAgICAgIHJldHVybiAiY3MiOwotICAgIGNhc2UgMHgzNjoKLSAgICAgIHJldHVybiAic3MiOwotICAgIGNhc2UgMHgzZToKLSAgICAgIHJldHVybiAiZHMiOwotICAgIGNhc2UgMHgyNjoKLSAgICAgIHJldHVybiAiZXMiOwotICAgIGNhc2UgMHg2NDoKLSAgICAgIHJldHVybiAiZnMiOwotICAgIGNhc2UgMHg2NToKLSAgICAgIHJldHVybiAiZ3MiOwotICAgIGNhc2UgMHg2NjoKLSAgICAgIHJldHVybiAoc2l6ZWZsYWcgJiBERkxBRykgPyAiZGF0YTE2IiA6ICJkYXRhMzIiOwotICAgIGNhc2UgMHg2NzoKLSAgICAgIHJldHVybiAoc2l6ZWZsYWcgJiBBRkxBRykgPyAiYWRkcjE2IiA6ICJhZGRyMzIiOwotICAgIGNhc2UgRldBSVRfT1BDT0RFOgotICAgICAgcmV0dXJuICJmd2FpdCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgb3Axb3V0WzEwMF0sIG9wMm91dFsxMDBdLCBvcDNvdXRbMTAwXTsKLXN0YXRpYyBpbnQgb3BfYWQsIG9wX2luZGV4WzNdOwotc3RhdGljIHVuc2lnbmVkIGludCBvcF9hZGRyZXNzWzNdOwotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydF9wYzsKLQotDAotLyoKLSAqICAgT24gdGhlIDM4NidzIG9mIDE5ODgsIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbiBpcyAxNSBieXRlcy4KLSAqICAgKHNlZSB0b3BpYyAiUmVkdW5kYW50IHByZWZpeGVzIiBpbiB0aGUgIkRpZmZlcmVuY2VzIGZyb20gODA4NiIKLSAqICAgc2VjdGlvbiBvZiB0aGUgIlZpcnR1YWwgODA4NiBNb2RlIiBjaGFwdGVyLikKLSAqICdwYycgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24sIGl0IHdpbGwKLSAqICAgYmUgdXNlZCB0byBwcmludCB0aGUgdGFyZ2V0IGFkZHJlc3MgaWYgdGhpcyBpcyBhIHJlbGF0aXZlIGp1bXAgb3IgY2FsbAotICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGlzIGluc3RydWN0aW9uIGluIGJ5dGVzLgotICovCi0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9pMzg2Ci0gIFBBUkFNUyAoKGJmZF92bWEgcGMsIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKLQotc3RhdGljIGNoYXIgaW50ZWxfc3ludGF4Owotc3RhdGljIGNoYXIgb3Blbl9jaGFyOwotc3RhdGljIGNoYXIgY2xvc2VfY2hhcjsKLXN0YXRpYyBjaGFyIHNlcGFyYXRvcl9jaGFyOwotc3RhdGljIGNoYXIgc2NhbGVfY2hhcjsKLQotaW50Ci1wcmludF9pbnNuX2kzODZfYXR0IChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50ZWxfc3ludGF4ID0gMDsKLSAgb3Blbl9jaGFyID0gJygnOwotICBjbG9zZV9jaGFyID0gICcpJzsKLSAgc2VwYXJhdG9yX2NoYXIgPSAnLCc7Ci0gIHNjYWxlX2NoYXIgPSAnLCc7Ci0KLSAgcmV0dXJuIHByaW50X2luc25faTM4NiAocGMsIGluZm8pOwotfQotCi1pbnQKLXByaW50X2luc25faTM4Nl9pbnRlbCAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludGVsX3N5bnRheCA9IDE7Ci0gIG9wZW5fY2hhciA9ICdbJzsKLSAgY2xvc2VfY2hhciA9ICddJzsKLSAgc2VwYXJhdG9yX2NoYXIgPSAnKyc7Ci0gIHNjYWxlX2NoYXIgPSAnKic7Ci0KLSAgcmV0dXJuIHByaW50X2luc25faTM4NiAocGMsIGluZm8pOwotfQotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2kzODYgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjb25zdCBzdHJ1Y3QgZGlzMzg2ICpkcDsKLSAgaW50IGk7Ci0gIGludCB0d29fc291cmNlX29wczsKLSAgY2hhciAqZmlyc3QsICpzZWNvbmQsICp0aGlyZDsKLSAgaW50IG5lZWRjb21tYTsKLSAgdW5zaWduZWQgY2hhciBuZWVkX21vZHJtOwotICB1bnNpZ25lZCBjaGFyIHVzZXNfZjNfcHJlZml4OwotICBWT0xBVElMRSBpbnQgc2l6ZWZsYWc7Ci0gIFZPTEFUSUxFIGludCBvcmlnX3NpemVmbGFnOwotCi0gIHN0cnVjdCBkaXNfcHJpdmF0ZSBwcml2OwotICBiZmRfYnl0ZSAqaW5idWYgPSBwcml2LnRoZV9idWZmZXI7Ci0KLSAgaWYgKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaTM4Nl9pMzg2Ci0gICAgICB8fCBpbmZvLT5tYWNoID09IGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXgpCi0gICAgc2l6ZWZsYWcgPSBBRkxBR3xERkxBRzsKLSAgZWxzZSBpZiAoaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9pMzg2X2k4MDg2KQotICAgIHNpemVmbGFnID0gMDsKLSAgZWxzZQotICAgIGFib3J0ICgpOwotICBvcmlnX3NpemVmbGFnID0gc2l6ZWZsYWc7Ci0KLSAgLyogVGhlIG91dHB1dCBsb29rcyBiZXR0ZXIgaWYgd2UgcHV0IDcgYnl0ZXMgb24gYSBsaW5lLCBzaW5jZSB0aGF0Ci0gICAgIHB1dHMgbW9zdCBsb25nIHdvcmQgaW5zdHJ1Y3Rpb25zIG9uIGEgc2luZ2xlIGxpbmUuICAqLwotICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDc7Ci0KLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJnByaXY7Ci0gIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7Ci0gIHByaXYuaW5zbl9zdGFydCA9IHBjOwotCi0gIG9idWZbMF0gPSAwOwotICBvcDFvdXRbMF0gPSAwOwotICBvcDJvdXRbMF0gPSAwOwotICBvcDNvdXRbMF0gPSAwOwotCi0gIG9wX2luZGV4WzBdID0gb3BfaW5kZXhbMV0gPSBvcF9pbmRleFsyXSA9IC0xOwotCi0gIHRoZV9pbmZvID0gaW5mbzsKLSAgc3RhcnRfcGMgPSBwYzsKLSAgc3RhcnRfY29kZXAgPSBpbmJ1ZjsKLSAgY29kZXAgPSBpbmJ1ZjsKLQotICBpZiAoc2V0am1wIChwcml2LmJhaWxvdXQpICE9IDApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgLyogR2V0dGluZyBoZXJlIG1lYW5zIHdlIHRyaWVkIGZvciBkYXRhIGJ1dCBkaWRuJ3QgZ2V0IGl0LiAgVGhhdAotICAgICAgICAgbWVhbnMgd2UgaGF2ZSBhbiBpbmNvbXBsZXRlIGluc3RydWN0aW9uIG9mIHNvbWUgc29ydC4gIEp1c3QKLSAgICAgICAgIHByaW50IHRoZSBmaXJzdCBieXRlIGFzIGEgcHJlZml4IG9yIGEgLmJ5dGUgcHNldWRvLW9wLiAgKi8KLSAgICAgIGlmIChjb2RlcCA+IGluYnVmKQotCXsKLQkgIG5hbWUgPSBwcmVmaXhfbmFtZSAoaW5idWZbMF0sIG9yaWdfc2l6ZWZsYWcpOwotCSAgaWYgKG5hbWUgIT0gTlVMTCkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG5hbWUpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSnVzdCBwcmludCB0aGUgZmlyc3QgYnl0ZSBhcyBhIC5ieXRlIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5ieXRlIDB4JXgiLAotCQkJCSAgICAgKHVuc2lnbmVkIGludCkgaW5idWZbMF0pOwotCSAgICB9Ci0KLQkgIHJldHVybiAxOwotCX0KLQotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBja3ByZWZpeCAoKTsKLQotICBpbnNuX2NvZGVwID0gY29kZXA7Ci0KLSAgRkVUQ0hfREFUQSAoaW5mbywgY29kZXAgKyAxKTsKLSAgdHdvX3NvdXJjZV9vcHMgPSAoKmNvZGVwID09IDB4NjIpIHx8ICgqY29kZXAgPT0gMHhjOCk7Ci0KLSAgb2J1ZnAgPSBvYnVmOwotCi0gIGlmICgocHJlZml4ZXMgJiBQUkVGSVhfRldBSVQpCi0gICAgICAmJiAoKCpjb2RlcCA8IDB4ZDgpIHx8ICgqY29kZXAgPiAweGRmKSkpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgLyogZndhaXQgbm90IGZvbGxvd2VkIGJ5IGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uLiAgUHJpbnQgdGhlCi0gICAgICAgICBmaXJzdCBwcmVmaXgsIHdoaWNoIGlzIHByb2JhYmx5IGZ3YWl0IGl0c2VsZi4gICovCi0gICAgICBuYW1lID0gcHJlZml4X25hbWUgKGluYnVmWzBdLCBvcmlnX3NpemVmbGFnKTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JbmFtZSA9IElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUjsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoKmNvZGVwID09IDB4MGYpCi0gICAgewotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgY29kZXAgKyAyKTsKLSAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgIGRwID0gJmRpczM4Nl90d29ieXRlX2ludGVsWyorK2NvZGVwXTsKLSAgICAgIGVsc2UKLSAgICAgICAgZHAgPSAmZGlzMzg2X3R3b2J5dGVfYXR0WyorK2NvZGVwXTsKLSAgICAgIG5lZWRfbW9kcm0gPSB0d29ieXRlX2hhc19tb2RybVsqY29kZXBdOwotICAgICAgdXNlc19mM19wcmVmaXggPSB0d29ieXRlX3VzZXNfZjNfcHJlZml4Wypjb2RlcF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgZHAgPSAmZGlzMzg2X2ludGVsWypjb2RlcF07Ci0gICAgICBlbHNlCi0gICAgICAgIGRwID0gJmRpczM4Nl9hdHRbKmNvZGVwXTsKLSAgICAgIG5lZWRfbW9kcm0gPSBvbmVieXRlX2hhc19tb2RybVsqY29kZXBdOwotICAgICAgdXNlc19mM19wcmVmaXggPSAwOwotICAgIH0KLSAgY29kZXArKzsKLQotICBpZiAoIXVzZXNfZjNfcHJlZml4ICYmIChwcmVmaXhlcyAmIFBSRUZJWF9SRVBaKSkKLSAgICB7Ci0gICAgICBvYXBwZW5kICgicmVweiAiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX1JFUFo7Ci0gICAgfQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfUkVQTlopCi0gICAgewotICAgICAgb2FwcGVuZCAoInJlcG56ICIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfUkVQTlo7Ci0gICAgfQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfTE9DSykKLSAgICB7Ci0gICAgICBvYXBwZW5kICgibG9jayAiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0xPQ0s7Ci0gICAgfQotCi0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKQotICAgIHNpemVmbGFnIF49IERGTEFHOwotCi0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9BRERSKQotICAgIHsKLSAgICAgIHNpemVmbGFnIF49IEFGTEFHOwotICAgICAgaWYgKHNpemVmbGFnICYgQUZMQUcpCi0gICAgICAgIG9hcHBlbmQgKCJhZGRyMzIgIik7Ci0gICAgICBlbHNlCi0Jb2FwcGVuZCAoImFkZHIxNiAiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0FERFI7Ci0gICAgfQotCi0gIGlmIChuZWVkX21vZHJtKQotICAgIHsKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGNvZGVwICsgMSk7Ci0gICAgICBtb2QgPSAoKmNvZGVwID4+IDYpICYgMzsKLSAgICAgIHJlZyA9ICgqY29kZXAgPj4gMykgJiA3OwotICAgICAgcm0gPSAqY29kZXAgJiA3OwotICAgIH0KLQotICBpZiAoZHAtPm5hbWUgPT0gTlVMTCAmJiBkcC0+Ynl0ZW1vZGUxID09IEZMT0FUQ09ERSkKLSAgICB7Ci0gICAgICBkb2Zsb2F0IChzaXplZmxhZyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGRwLT5uYW1lID09IE5VTEwpCi0JewotCSAgc3dpdGNoKGRwLT5ieXRlbW9kZTIpCi0JICAgIHsKLQkgICAgICBjYXNlIFVTRV9HUk9VUFM6Ci0JICAgICAgICBkcCA9ICZncnBzW2RwLT5ieXRlbW9kZTFdW3JlZ107Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgVVNFX1BSRUZJWF9VU0VSX1RBQkxFOgotCQlkcCA9ICZwcmVmaXhfdXNlcl90YWJsZVtkcC0+Ynl0ZW1vZGUxXVtwcmVmaXhlcyAmIFBSRUZJWF9SRVBaID8gMSA6IDBdOwotCQl1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9SRVBaKTsKLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHB1dG9wIChkcC0+bmFtZSwgc2l6ZWZsYWcpOwotCi0gICAgICBvYnVmcCA9IG9wMW91dDsKLSAgICAgIG9wX2FkID0gMjsKLSAgICAgIGlmIChkcC0+b3AxKQotCSgqZHAtPm9wMSkoZHAtPmJ5dGVtb2RlMSwgc2l6ZWZsYWcpOwotCi0gICAgICBvYnVmcCA9IG9wMm91dDsKLSAgICAgIG9wX2FkID0gMTsKLSAgICAgIGlmIChkcC0+b3AyKQotCSgqZHAtPm9wMikoZHAtPmJ5dGVtb2RlMiwgc2l6ZWZsYWcpOwotCi0gICAgICBvYnVmcCA9IG9wM291dDsKLSAgICAgIG9wX2FkID0gMDsKLSAgICAgIGlmIChkcC0+b3AzKQotCSgqZHAtPm9wMykoZHAtPmJ5dGVtb2RlMywgc2l6ZWZsYWcpOwotICAgIH0KLQotICAvKiBTZWUgaWYgYW55IHByZWZpeGVzIHdlcmUgbm90IHVzZWQuICBJZiBzbywgcHJpbnQgdGhlIGZpcnN0IG9uZQotICAgICBzZXBhcmF0ZWx5LiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgd2UnbGwgd2luZCB1cCBwcmludGluZyBhbgotICAgICBpbnN0cnVjdGlvbiBzdHJlYW0gd2hpY2ggZG9lcyBub3QgcHJlY2lzZWx5IGNvcnJlc3BvbmQgdG8gdGhlCi0gICAgIGJ5dGVzIHdlIGFyZSBkaXNhc3NlbWJsaW5nLiAgKi8KLSAgaWYgKChwcmVmaXhlcyAmIH51c2VkX3ByZWZpeGVzKSAhPSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIG5hbWUgPSBwcmVmaXhfbmFtZSAoaW5idWZbMF0sIG9yaWdfc2l6ZWZsYWcpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQluYW1lID0gSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG5hbWUpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIG9idWZwID0gb2J1ZiArIHN0cmxlbiAob2J1Zik7Ci0gIGZvciAoaSA9IHN0cmxlbiAob2J1Zik7IGkgPCA2OyBpKyspCi0gICAgb2FwcGVuZCAoIiAiKTsKLSAgb2FwcGVuZCAoIiAiKTsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9idWYpOwotCi0gIC8qIFRoZSBlbnRlciBhbmQgYm91bmQgaW5zdHJ1Y3Rpb25zIGFyZSBwcmludGVkIHdpdGggb3BlcmFuZHMgaW4gdGhlIHNhbWUKLSAgICAgb3JkZXIgYXMgdGhlIGludGVsIGJvb2s7IGV2ZXJ5dGhpbmcgZWxzZSBpcyBwcmludGVkIGluIHJldmVyc2Ugb3JkZXIuICAqLwotICBpZiAoaW50ZWxfc3ludGF4IHx8IHR3b19zb3VyY2Vfb3BzKQotICAgIHsKLSAgICAgIGZpcnN0ID0gb3Axb3V0OwotICAgICAgc2Vjb25kID0gb3Ayb3V0OwotICAgICAgdGhpcmQgPSBvcDNvdXQ7Ci0gICAgICBvcF9hZCA9IG9wX2luZGV4WzBdOwotICAgICAgb3BfaW5kZXhbMF0gPSBvcF9pbmRleFsyXTsKLSAgICAgIG9wX2luZGV4WzJdID0gb3BfYWQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZmlyc3QgPSBvcDNvdXQ7Ci0gICAgICBzZWNvbmQgPSBvcDJvdXQ7Ci0gICAgICB0aGlyZCA9IG9wMW91dDsKLSAgICB9Ci0gIG5lZWRjb21tYSA9IDA7Ci0gIGlmICgqZmlyc3QpCi0gICAgewotICAgICAgaWYgKG9wX2luZGV4WzBdICE9IC0xKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIG9wX2FkZHJlc3Nbb3BfaW5kZXhbMF1dLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgZmlyc3QpOwotICAgICAgbmVlZGNvbW1hID0gMTsKLSAgICB9Ci0gIGlmICgqc2Vjb25kKQotICAgIHsKLSAgICAgIGlmIChuZWVkY29tbWEpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0gICAgICBpZiAob3BfaW5kZXhbMV0gIT0gLTEpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgb3BfYWRkcmVzc1tvcF9pbmRleFsxXV0sIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBzZWNvbmQpOwotICAgICAgbmVlZGNvbW1hID0gMTsKLSAgICB9Ci0gIGlmICgqdGhpcmQpCi0gICAgewotICAgICAgaWYgKG5lZWRjb21tYSkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLSAgICAgIGlmIChvcF9pbmRleFsyXSAhPSAtMSkKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSBvcF9hZGRyZXNzW29wX2luZGV4WzJdXSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHRoaXJkKTsKLSAgICB9Ci0gIHJldHVybiBjb2RlcCAtIGluYnVmOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZmxvYXRfbWVtX2F0dFtdID0gewotICAvKiBkOCAqLwotICAiZmFkZHMiLAotICAiZm11bHMiLAotICAiZmNvbXMiLAotICAiZmNvbXBzIiwKLSAgImZzdWJzIiwKLSAgImZzdWJycyIsCi0gICJmZGl2cyIsCi0gICJmZGl2cnMiLAotICAvKiAgZDkgKi8KLSAgImZsZHMiLAotICAiKGJhZCkiLAotICAiZnN0cyIsCi0gICJmc3RwcyIsCi0gICJmbGRlbnYiLAotICAiZmxkY3ciLAotICAiZk5zdGVudiIsCi0gICJmTnN0Y3ciLAotICAvKiBkYSAqLwotICAiZmlhZGRsIiwKLSAgImZpbXVsbCIsCi0gICJmaWNvbWwiLAotICAiZmljb21wbCIsCi0gICJmaXN1YmwiLAotICAiZmlzdWJybCIsCi0gICJmaWRpdmwiLAotICAiZmlkaXZybCIsCi0gIC8qIGRiICovCi0gICJmaWxkbCIsCi0gICIoYmFkKSIsCi0gICJmaXN0bCIsCi0gICJmaXN0cGwiLAotICAiKGJhZCkiLAotICAiZmxkdCIsCi0gICIoYmFkKSIsCi0gICJmc3RwdCIsCi0gIC8qIGRjICovCi0gICJmYWRkbCIsCi0gICJmbXVsbCIsCi0gICJmY29tbCIsCi0gICJmY29tcGwiLAotICAiZnN1YmwiLAotICAiZnN1YnJsIiwKLSAgImZkaXZsIiwKLSAgImZkaXZybCIsCi0gIC8qIGRkICovCi0gICJmbGRsIiwKLSAgIihiYWQpIiwKLSAgImZzdGwiLAotICAiZnN0cGwiLAotICAiZnJzdG9yIiwKLSAgIihiYWQpIiwKLSAgImZOc2F2ZSIsCi0gICJmTnN0c3ciLAotICAvKiBkZSAqLwotICAiZmlhZGQiLAotICAiZmltdWwiLAotICAiZmljb20iLAotICAiZmljb21wIiwKLSAgImZpc3ViIiwKLSAgImZpc3ViciIsCi0gICJmaWRpdiIsCi0gICJmaWRpdnIiLAotICAvKiBkZiAqLwotICAiZmlsZCIsCi0gICIoYmFkKSIsCi0gICJmaXN0IiwKLSAgImZpc3RwIiwKLSAgImZibGQiLAotICAiZmlsZGxsIiwKLSAgImZic3RwIiwKLSAgImZpc3RwbGwiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmZsb2F0X21lbV9pbnRlbFtdID0gewotICAvKiBkOCAqLwotICAiZmFkZCIsCi0gICJmbXVsIiwKLSAgImZjb20iLAotICAiZmNvbXAiLAotICAiZnN1YiIsCi0gICJmc3ViciIsCi0gICJmZGl2IiwKLSAgImZkaXZyIiwKLSAgLyogIGQ5ICovCi0gICJmbGQiLAotICAiKGJhZCkiLAotICAiZnN0IiwKLSAgImZzdHAiLAotICAiZmxkZW52IiwKLSAgImZsZGN3IiwKLSAgImZOc3RlbnYiLAotICAiZk5zdGN3IiwKLSAgLyogZGEgKi8KLSAgImZpYWRkIiwKLSAgImZpbXVsIiwKLSAgImZpY29tIiwKLSAgImZpY29tcCIsCi0gICJmaXN1YiIsCi0gICJmaXN1YnIiLAotICAiZmlkaXYiLAotICAiZmlkaXZyIiwKLSAgLyogZGIgKi8KLSAgImZpbGQiLAotICAiKGJhZCkiLAotICAiZmlzdCIsCi0gICJmaXN0cCIsCi0gICIoYmFkKSIsCi0gICJmbGQiLAotICAiKGJhZCkiLAotICAiZnN0cCIsCi0gIC8qIGRjICovCi0gICJmYWRkIiwKLSAgImZtdWwiLAotICAiZmNvbSIsCi0gICJmY29tcCIsCi0gICJmc3ViIiwKLSAgImZzdWJyIiwKLSAgImZkaXYiLAotICAiZmRpdnIiLAotICAvKiBkZCAqLwotICAiZmxkIiwKLSAgIihiYWQpIiwKLSAgImZzdCIsCi0gICJmc3RwIiwKLSAgImZyc3RvciIsCi0gICIoYmFkKSIsCi0gICJmTnNhdmUiLAotICAiZk5zdHN3IiwKLSAgLyogZGUgKi8KLSAgImZpYWRkIiwKLSAgImZpbXVsIiwKLSAgImZpY29tIiwKLSAgImZpY29tcCIsCi0gICJmaXN1YiIsCi0gICJmaXN1YnIiLAotICAiZmlkaXYiLAotICAiZmlkaXZyIiwKLSAgLyogZGYgKi8KLSAgImZpbGQiLAotICAiKGJhZCkiLAotICAiZmlzdCIsCi0gICJmaXN0cCIsCi0gICJmYmxkIiwKLSAgImZpbGQiLAotICAiZmJzdHAiLAotICAiZmlzdHBsbCIsCi19OwotCi0jZGVmaW5lIFNUIE9QX1NULCAwCi0jZGVmaW5lIFNUaSBPUF9TVGksIDAKLQotI2RlZmluZSBGR1JQZDlfMiBOVUxMLCBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwCi0jZGVmaW5lIEZHUlBkOV80IE5VTEwsIE5VTEwsIDEsIE5VTEwsIDAsIE5VTEwsIDAKLSNkZWZpbmUgRkdSUGQ5XzUgTlVMTCwgTlVMTCwgMiwgTlVMTCwgMCwgTlVMTCwgMAotI2RlZmluZSBGR1JQZDlfNiBOVUxMLCBOVUxMLCAzLCBOVUxMLCAwLCBOVUxMLCAwCi0jZGVmaW5lIEZHUlBkOV83IE5VTEwsIE5VTEwsIDQsIE5VTEwsIDAsIE5VTEwsIDAKLSNkZWZpbmUgRkdSUGRhXzUgTlVMTCwgTlVMTCwgNSwgTlVMTCwgMCwgTlVMTCwgMAotI2RlZmluZSBGR1JQZGJfNCBOVUxMLCBOVUxMLCA2LCBOVUxMLCAwLCBOVUxMLCAwCi0jZGVmaW5lIEZHUlBkZV8zIE5VTEwsIE5VTEwsIDcsIE5VTEwsIDAsIE5VTEwsIDAKLSNkZWZpbmUgRkdSUGRmXzQgTlVMTCwgTlVMTCwgOCwgTlVMTCwgMCwgTlVMTCwgMAotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRpczM4NiBmbG9hdF9yZWdbXVs4XSA9IHsKLSAgLyogZDggKi8KLSAgewotICAgIHsgImZhZGQiLAlTVCwgU1RpLCBYWCB9LAotICAgIHsgImZtdWwiLAlTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjb20iLAlTVGksIFhYLCBYWCB9LAotICAgIHsgImZjb21wIiwJU1RpLCBYWCwgWFggfSwKLSAgICB7ICJmc3ViIiwJU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmc3ViciIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiZmRpdiIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiZmRpdnIiLAlTVCwgU1RpLCBYWCB9LAotICB9LAotICAvKiBkOSAqLwotICB7Ci0gICAgeyAiZmxkIiwJU1RpLCBYWCwgWFggfSwKLSAgICB7ICJmeGNoIiwJU1RpLCBYWCwgWFggfSwKLSAgICB7IEZHUlBkOV8yIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyBGR1JQZDlfNCB9LAotICAgIHsgRkdSUGQ5XzUgfSwKLSAgICB7IEZHUlBkOV82IH0sCi0gICAgeyBGR1JQZDlfNyB9LAotICB9LAotICAvKiBkYSAqLwotICB7Ci0gICAgeyAiZmNtb3ZiIiwJU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmY21vdmUiLAlTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjbW92YmUiLFNULCBTVGksIFhYIH0sCi0gICAgeyAiZmNtb3Z1IiwJU1QsIFNUaSwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7IEZHUlBkYV81IH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIGRiICovCi0gIHsKLSAgICB7ICJmY21vdm5iIixTVCwgU1RpLCBYWCB9LAotICAgIHsgImZjbW92bmUiLFNULCBTVGksIFhYIH0sCi0gICAgeyAiZmNtb3ZuYmUiLFNULCBTVGksIFhYIH0sCi0gICAgeyAiZmNtb3ZudSIsU1QsIFNUaSwgWFggfSwKLSAgICB7IEZHUlBkYl80IH0sCi0gICAgeyAiZnVjb21pIiwJU1QsIFNUaSwgWFggfSwKLSAgICB7ICJmY29taSIsCVNULCBTVGksIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gIH0sCi0gIC8qIGRjICovCi0gIHsKLSAgICB7ICJmYWRkIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmbXVsIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSNpZiBVTklYV0FSRV9DT01QQVQKLSAgICB7ICJmc3ViIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmc3ViciIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZmRpdiIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZmRpdnIiLAlTVGksIFNULCBYWCB9LAotI2Vsc2UKLSAgICB7ICJmc3ViciIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZnN1YiIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiZmRpdnIiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZkaXYiLAlTVGksIFNULCBYWCB9LAotI2VuZGlmCi0gIH0sCi0gIC8qIGRkICovCi0gIHsKLSAgICB7ICJmZnJlZSIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiZnN0IiwJU1RpLCBYWCwgWFggfSwKLSAgICB7ICJmc3RwIiwJU1RpLCBYWCwgWFggfSwKLSAgICB7ICJmdWNvbSIsCVNUaSwgWFgsIFhYIH0sCi0gICAgeyAiZnVjb21wIiwJU1RpLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgfSwKLSAgLyogZGUgKi8KLSAgewotICAgIHsgImZhZGRwIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmbXVscCIsCVNUaSwgU1QsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyBGR1JQZGVfMyB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAotICAgIHsgImZzdWJwIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmc3VicnAiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZkaXZwIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmZGl2cnAiLAlTVGksIFNULCBYWCB9LAotI2Vsc2UKLSAgICB7ICJmc3VicnAiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZzdWJwIiwJU1RpLCBTVCwgWFggfSwKLSAgICB7ICJmZGl2cnAiLAlTVGksIFNULCBYWCB9LAotICAgIHsgImZkaXZwIiwJU1RpLCBTVCwgWFggfSwKLSNlbmRpZgotICB9LAotICAvKiBkZiAqLwotICB7Ci0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyAiKGJhZCkiLAlYWCwgWFgsIFhYIH0sCi0gICAgeyBGR1JQZGZfNCB9LAotICAgIHsgImZ1Y29taXAiLFNULCBTVGksIFhYIH0sCi0gICAgeyAiZmNvbWlwIiwgU1QsIFNUaSwgWFggfSwKLSAgICB7ICIoYmFkKSIsCVhYLCBYWCwgWFggfSwKLSAgfSwKLX07Ci0KLQotc3RhdGljIGNoYXIgKmZncnBzW11bOF0gPSB7Ci0gIC8qIGQ5XzIgIDAgKi8KLSAgewotICAgICJmbm9wIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAotICB9LAotCi0gIC8qIGQ5XzQgIDEgKi8KLSAgewotICAgICJmY2hzIiwiZmFicyIsIihiYWQpIiwiKGJhZCkiLCJmdHN0IiwiZnhhbSIsIihiYWQpIiwiKGJhZCkiLAotICB9LAotCi0gIC8qIGQ5XzUgIDIgKi8KLSAgewotICAgICJmbGQxIiwiZmxkbDJ0IiwiZmxkbDJlIiwiZmxkcGkiLCJmbGRsZzIiLCJmbGRsbjIiLCJmbGR6IiwiKGJhZCkiLAotICB9LAotCi0gIC8qIGQ5XzYgIDMgKi8KLSAgewotICAgICJmMnhtMSIsImZ5bDJ4IiwiZnB0YW4iLCJmcGF0YW4iLCJmeHRyYWN0IiwiZnByZW0xIiwiZmRlY3N0cCIsImZpbmNzdHAiLAotICB9LAotCi0gIC8qIGQ5XzcgIDQgKi8KLSAgewotICAgICJmcHJlbSIsImZ5bDJ4cDEiLCJmc3FydCIsImZzaW5jb3MiLCJmcm5kaW50IiwiZnNjYWxlIiwiZnNpbiIsImZjb3MiLAotICB9LAotCi0gIC8qIGRhXzUgIDUgKi8KLSAgewotICAgICIoYmFkKSIsImZ1Y29tcHAiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAotICB9LAotCi0gIC8qIGRiXzQgIDYgKi8KLSAgewotICAgICJmZW5pKDI4NyBvbmx5KSIsImZkaXNpKDI4NyBvbmx5KSIsImZOY2xleCIsImZOaW5pdCIsCi0gICAgImZOc2V0cG0oMjg3IG9ubHkpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkZV8zICA3ICovCi0gIHsKLSAgICAiKGJhZCkiLCJmY29tcHAiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAotICB9LAotCi0gIC8qIGRmXzQgIDggKi8KLSAgewotICAgICJmTnN0c3ciLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCi0gIH0sCi19OwotCi1zdGF0aWMgdm9pZAotZG9mbG9hdCAoc2l6ZWZsYWcpCi0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgY29uc3Qgc3RydWN0IGRpczM4NiAqZHA7Ci0gIHVuc2lnbmVkIGNoYXIgZmxvYXRvcDsKLQotICBmbG9hdG9wID0gY29kZXBbLTFdOwotCi0gIGlmIChtb2QgIT0gMykKLSAgICB7Ci0gICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICBwdXRvcCAoZmxvYXRfbWVtX2ludGVsWyhmbG9hdG9wIC0gMHhkOCApICogOCArIHJlZ10sIHNpemVmbGFnKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcHV0b3AgKGZsb2F0X21lbV9hdHRbKGZsb2F0b3AgLSAweGQ4ICkgKiA4ICsgcmVnXSwgc2l6ZWZsYWcpOwotICAgICAgb2J1ZnAgPSBvcDFvdXQ7Ci0gICAgICBpZiAoZmxvYXRvcCA9PSAweGRiKQotICAgICAgICBPUF9FICh4X21vZGUsIHNpemVmbGFnKTsKLSAgICAgIGVsc2UgaWYgKGZsb2F0b3AgPT0gMHhkZCkKLSAgICAgICAgT1BfRSAoZF9tb2RlLCBzaXplZmxhZyk7Ci0gICAgICBlbHNlCi0gICAgICAgIE9QX0UgKHZfbW9kZSwgc2l6ZWZsYWcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgY29kZXArKzsKLQotICBkcCA9ICZmbG9hdF9yZWdbZmxvYXRvcCAtIDB4ZDhdW3JlZ107Ci0gIGlmIChkcC0+bmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHB1dG9wIChmZ3Jwc1tkcC0+Ynl0ZW1vZGUxXVtybV0sIHNpemVmbGFnKTsKLQotICAgICAgLyogaW5zdHJ1Y3Rpb24gZm5zdHN3IGlzIG9ubHkgb25lIHdpdGggc3RyYW5nZSBhcmcgKi8KLSAgICAgIGlmIChmbG9hdG9wID09IDB4ZGYgJiYgY29kZXBbLTFdID09IDB4ZTApCi0Jc3RyY3B5IChvcDFvdXQsIG5hbWVzMTZbMF0pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHB1dG9wIChkcC0+bmFtZSwgc2l6ZWZsYWcpOwotCi0gICAgICBvYnVmcCA9IG9wMW91dDsKLSAgICAgIGlmIChkcC0+b3AxKQotCSgqZHAtPm9wMSkoZHAtPmJ5dGVtb2RlMSwgc2l6ZWZsYWcpOwotICAgICAgb2J1ZnAgPSBvcDJvdXQ7Ci0gICAgICBpZiAoZHAtPm9wMikKLQkoKmRwLT5vcDIpKGRwLT5ieXRlbW9kZTIsIHNpemVmbGFnKTsKLSAgICB9Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfU1QgKGlnbm9yZSwgc2l6ZWZsYWcpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIG9hcHBlbmQgKCIlc3QiKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9TVGkgKGlnbm9yZSwgc2l6ZWZsYWcpCi0gICAgIGludCBpZ25vcmUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJXN0KCVkKSIsIHJtKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLQotLyogY2FwaXRhbCBsZXR0ZXJzIGluIHRlbXBsYXRlIGFyZSBtYWNyb3MgKi8KLXN0YXRpYyB2b2lkCi1wdXRvcCAodGVtcGxhdGUsIHNpemVmbGFnKQotICAgICBjb25zdCBjaGFyICp0ZW1wbGF0ZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBjb25zdCBjaGFyICpwOwotCi0gIGZvciAocCA9IHRlbXBsYXRlOyAqcDsgcCsrKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKnApCi0JewotCWRlZmF1bHQ6Ci0JICAqb2J1ZnArKyA9ICpwOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotCSAgaWYgKG1vZCAhPSAzCi0jaWZkZWYgU1VGRklYX0FMV0FZUwotCSAgICAgIHx8IChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0jZW5kaWYKLQkgICAgICApCi0JICAgICpvYnVmcCsrID0gJ2InOwotCSAgYnJlYWs7Ci0JY2FzZSAnQic6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgIGlmIChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0JICAgICpvYnVmcCsrID0gJ2InOwotI2VuZGlmCi0JICBicmVhazsKLQljYXNlICdFJzoJCS8qIEZvciBqY3h6L2plY3h6ICovCi0JICBpZiAoc2l6ZWZsYWcgJiBBRkxBRykKLQkgICAgKm9idWZwKysgPSAnZSc7Ci0JICBicmVhazsKLQljYXNlICdMJzoKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgU1VGRklYX0FMV0FZUwotCSAgaWYgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKLQkgICAgKm9idWZwKysgPSAnbCc7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCWNhc2UgJ04nOgotCSAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9GV0FJVCkgPT0gMCkKLQkgICAgKm9idWZwKysgPSAnbic7Ci0JICBlbHNlCi0JICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0ZXQUlUOwotCSAgYnJlYWs7Ci0JY2FzZSAnUCc6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotCSAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKQotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgICAgICB8fCAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotI2VuZGlmCi0JICAgICAgKQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCSpvYnVmcCsrID0gJ2wnOwotCSAgICAgIGVsc2UKLQkJKm9idWZwKysgPSAndyc7Ci0JICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ1EnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLQkgIGlmIChtb2QgIT0gMwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgICAgICB8fCAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotI2VuZGlmCi0JICAgICAgKQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCSpvYnVmcCsrID0gJ2wnOwotCSAgICAgIGVsc2UKLQkJKm9idWZwKysgPSAndyc7Ci0JICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ1InOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0JICAgIHsKLQkgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkJewotCQkgICpvYnVmcCsrID0gJ2QnOwotCQkgICpvYnVmcCsrID0gJ3EnOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKm9idWZwKysgPSAndyc7Ci0JCSAgKm9idWZwKysgPSAnZCc7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCSpvYnVmcCsrID0gJ2wnOwotCSAgICAgIGVsc2UKLQkJKm9idWZwKysgPSAndyc7Ci0JICAgIH0KLQkgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgIGlmIChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0JICAgIHsKLQkgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkJKm9idWZwKysgPSAnbCc7Ci0JICAgICAgZWxzZQotCQkqb2J1ZnArKyA9ICd3JzsKLQkgICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLQkgICAgfQotI2VuZGlmCi0JICBicmVhazsKLQljYXNlICdXJzoKLQkgIC8qIG9wZXJhbmQgc2l6ZSBmbGFnIGZvciBjd3RsLCBjYnR3ICovCi0JICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkgICAgKm9idWZwKysgPSAndyc7Ci0JICBlbHNlCi0JICAgICpvYnVmcCsrID0gJ2InOwotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0JICAgIHsKLQkgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkJewotCQkgICpvYnVmcCsrID0gJ2QnOwotCQkgICpvYnVmcCsrID0gJ2UnOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKm9idWZwKysgPSAndyc7Ci0JCX0KLQkgICAgfQotCSAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICAqb2J1ZnAgPSAwOwotfQotCi1zdGF0aWMgdm9pZAotb2FwcGVuZCAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgc3RyY3B5IChvYnVmcCwgcyk7Ci0gIG9idWZwICs9IHN0cmxlbiAocyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hcHBlbmRfc2VnICgpCi17Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9DUykKLSAgICB7Ci0gICAgICBvYXBwZW5kICgiJWNzOiIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfQ1M7Ci0gICAgfQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfRFMpCi0gICAgewotICAgICAgb2FwcGVuZCAoIiVkczoiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0RTOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX1NTKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCIlc3M6Iik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9TUzsKLSAgICB9Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9FUykKLSAgICB7Ci0gICAgICBvYXBwZW5kICgiJWVzOiIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfRVM7Ci0gICAgfQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfRlMpCi0gICAgewotICAgICAgb2FwcGVuZCAoIiVmczoiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0ZTOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0dTKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCIlZ3M6Iik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9HUzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9pbmRpckUgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmICghaW50ZWxfc3ludGF4KQotICAgIG9hcHBlbmQgKCIqIik7Ci0gIE9QX0UgKGJ5dGVtb2RlLCBzaXplZmxhZyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpbnQgZGlzcDsKLQotICAvKiBza2lwIG1vZC9ybSBieXRlICovCi0gIGNvZGVwKys7Ci0KLSAgaWYgKG1vZCA9PSAzKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYnl0ZW1vZGUpCi0JewotCWNhc2UgYl9tb2RlOgotCSAgb2FwcGVuZCAobmFtZXM4W3JtXSk7Ci0JICBicmVhazsKLQljYXNlIHdfbW9kZToKLQkgIG9hcHBlbmQgKG5hbWVzMTZbcm1dKTsKLQkgIGJyZWFrOwotCWNhc2UgZF9tb2RlOgotCSAgb2FwcGVuZCAobmFtZXMzMltybV0pOwotCSAgYnJlYWs7Ci0JY2FzZSB2X21vZGU6Ci0JICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQkgICAgb2FwcGVuZCAobmFtZXMzMltybV0pOwotCSAgZWxzZQotCSAgICBvYXBwZW5kIChuYW1lczE2W3JtXSk7Ci0JICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLQkgIGJyZWFrOwotCWNhc2UgMDoKLQkgIGlmICggIShjb2RlcFstMl0gPT0gMHhBRSAmJiBjb2RlcFstMV0gPT0gMHhGOCAvKiBzZmVuY2UgKi8pKQotCSAgICBCYWRPcCgpOwkvKiBiYWQgc2ZlbmNlLGxlYSxsZHMsbGVzLGxmcyxsZ3MsbHNzIG1vZHJtICovCi0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZGlzcCA9IDA7Ci0gIGFwcGVuZF9zZWcgKCk7Ci0KLSAgaWYgKHNpemVmbGFnICYgQUZMQUcpIC8qIDMyIGJpdCBhZGRyZXNzIG1vZGUgKi8KLSAgICB7Ci0gICAgICBpbnQgaGF2ZXNpYjsKLSAgICAgIGludCBoYXZlYmFzZTsKLSAgICAgIGludCBiYXNlOwotICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgIGludCBzY2FsZSA9IDA7Ci0KLSAgICAgIGhhdmVzaWIgPSAwOwotICAgICAgaGF2ZWJhc2UgPSAxOwotICAgICAgYmFzZSA9IHJtOwotCi0gICAgICBpZiAoYmFzZSA9PSA0KQotCXsKLQkgIGhhdmVzaWIgPSAxOwotCSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0JICBzY2FsZSA9ICgqY29kZXAgPj4gNikgJiAzOwotCSAgaW5kZXggPSAoKmNvZGVwID4+IDMpICYgNzsKLQkgIGJhc2UgPSAqY29kZXAgJiA3OwotCSAgY29kZXArKzsKLQl9Ci0KLSAgICAgIHN3aXRjaCAobW9kKQotCXsKLQljYXNlIDA6Ci0JICBpZiAoYmFzZSA9PSA1KQotCSAgICB7Ci0JICAgICAgaGF2ZWJhc2UgPSAwOwotCSAgICAgIGRpc3AgPSBnZXQzMiAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0JICBkaXNwID0gKmNvZGVwKys7Ci0JICBpZiAoKGRpc3AgJiAweDgwKSAhPSAwKQotCSAgICBkaXNwIC09IDB4MTAwOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgZGlzcCA9IGdldDMyICgpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoIWludGVsX3N5bnRheCkKLSAgICAgICAgaWYgKG1vZCAhPSAwIHx8IGJhc2UgPT0gNSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIGRpc3ApOwotICAgICAgICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgICAgICAgfQotCi0gICAgICBpZiAoaGF2ZWJhc2UgfHwgKGhhdmVzaWIgJiYgKGluZGV4ICE9IDQgfHwgc2NhbGUgIT0gMCkpKQotCXsKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIGJfbW9kZToKLSAgICAgICAgICAgICAgICAgIG9hcHBlbmQoIkJZVEUgUFRSICIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSB3X21vZGU6Ci0gICAgICAgICAgICAgICAgICBvYXBwZW5kKCJXT1JEIFBUUiAiKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Ugdl9tb2RlOgotICAgICAgICAgICAgICAgICAgb2FwcGVuZCgiRFdPUkQgUFRSICIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBkX21vZGU6Ci0gICAgICAgICAgICAgICAgICBvYXBwZW5kKCJRV09SRCBQVFIgIik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIHhfbW9kZToKLSAgICAgICAgICAgICAgICAgIG9hcHBlbmQoIlhXT1JEIFBUUiAiKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotCSAgKm9idWZwKysgPSBvcGVuX2NoYXI7Ci0gICAgICAgICAgKm9idWZwID0gJ1wwJzsKLQkgIGlmIChoYXZlYmFzZSkKLQkgICAgb2FwcGVuZCAobmFtZXMzMltiYXNlXSk7Ci0JICBpZiAoaGF2ZXNpYikKLQkgICAgewotCSAgICAgIGlmIChpbmRleCAhPSA0KQotCQl7Ci0gICAgICAgICAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmViYXNlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAqb2J1ZnArKyA9IHNlcGFyYXRvcl9jaGFyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAqb2J1ZnAgPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlcyIsIG5hbWVzMzJbaW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotCQkgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiwlcyIsIG5hbWVzMzJbaW5kZXhdKTsKLQkJICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLQkJfQotICAgICAgICAgICAgICBpZiAoIWludGVsX3N5bnRheAotICAgICAgICAgICAgICAgICAgfHwgKGludGVsX3N5bnRheAotICAgICAgICAgICAgICAgICAgICAgICYmIGJ5dGVtb2RlICE9IGJfbW9kZQotICAgICAgICAgICAgICAgICAgICAgICYmIGJ5dGVtb2RlICE9IHdfbW9kZQotICAgICAgICAgICAgICAgICAgICAgICYmIGJ5dGVtb2RlICE9IHZfbW9kZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgKm9idWZwKysgPSBzY2FsZV9jaGFyOwotICAgICAgICAgICAgICAgICAgKm9idWZwID0gJ1wwJzsKLQkgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgMSA8PCBzY2FsZSk7Ci0JICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgICAgICAgIH0KLQkgICAgfQotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBpZiAobW9kICE9IDAgfHwgYmFzZSA9PSA1KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRG9uJ3QgcHJpbnQgemVybyBkaXNwbGFjZW1lbnRzICovCi0gICAgICAgICAgICAgICAgaWYgKGRpc3AgPiAwKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiKyVkIiwgZGlzcCk7Ci0gICAgICAgICAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRpc3AgPCAwKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJWQiLCBkaXNwKTsKLSAgICAgICAgICAgICAgICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLQotCSAgKm9idWZwKysgPSBjbG9zZV9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JfQotICAgICAgZWxzZSBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1vZCAhPSAwIHx8IGJhc2UgPT0gNSkKLSAgICAgICAgICAgIHsKLQkgICAgICBpZiAocHJlZml4ZXMgJiAoUFJFRklYX0NTIHwgUFJFRklYX1NTIHwgUFJFRklYX0RTCi0JCQkgICAgICB8IFBSRUZJWF9FUyB8IFBSRUZJWF9GUyB8IFBSRUZJWF9HUykpCi0JCTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBvYXBwZW5kIChuYW1lc19zZWdbM10pOwotCQkgIG9hcHBlbmQgKCI6Iik7Ci0JCX0KLSAgICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBkaXNwKTsKLSAgICAgICAgICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gIGVsc2UKLSAgICB7IC8qIDE2IGJpdCBhZGRyZXNzIG1vZGUgKi8KLSAgICAgIHN3aXRjaCAobW9kKQotCXsKLQljYXNlIDA6Ci0JICBpZiAocm0gPT0gNikKLQkgICAgewotCSAgICAgIGRpc3AgPSBnZXQxNiAoKTsKLQkgICAgICBpZiAoKGRpc3AgJiAweDgwMDApICE9IDApCi0JCWRpc3AgLT0gMHgxMDAwMDsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0JICBkaXNwID0gKmNvZGVwKys7Ci0JICBpZiAoKGRpc3AgJiAweDgwKSAhPSAwKQotCSAgICBkaXNwIC09IDB4MTAwOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgZGlzcCA9IGdldDE2ICgpOwotCSAgaWYgKChkaXNwICYgMHg4MDAwKSAhPSAwKQotCSAgICBkaXNwIC09IDB4MTAwMDA7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghaW50ZWxfc3ludGF4KQotICAgICAgICBpZiAobW9kICE9IDAgfHwgcm0gPT0gNikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJWQiLCBkaXNwKTsKLSAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgIH0KLQotICAgICAgaWYgKG1vZCAhPSAwIHx8IHJtICE9IDYpCi0JewotCSAgKm9idWZwKysgPSBvcGVuX2NoYXI7Ci0gICAgICAgICAgKm9idWZwID0gJ1wwJzsKLQkgIG9hcHBlbmQgKGluZGV4MTZbcm1dKTsKLSAgICAgICAgICAqb2J1ZnArKyA9IGNsb3NlX2NoYXI7Ci0gICAgICAgICAgKm9idWZwID0gJ1wwJzsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotT1BfRyAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgc3dpdGNoIChieXRlbW9kZSkKLSAgICB7Ci0gICAgY2FzZSBiX21vZGU6Ci0gICAgICBvYXBwZW5kIChuYW1lczhbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHdfbW9kZToKLSAgICAgIG9hcHBlbmQgKG5hbWVzMTZbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGRfbW9kZToKLSAgICAgIG9hcHBlbmQgKG5hbWVzMzJbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHZfbW9kZToKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCW9hcHBlbmQgKG5hbWVzMzJbcmVnXSk7Ci0gICAgICBlbHNlCi0Jb2FwcGVuZCAobmFtZXMxNltyZWddKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWdldDMyICgpCi17Ci0gIGludCB4ID0gMDsKLQotICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyA0KTsKLSAgeCA9ICpjb2RlcCsrICYgMHhmZjsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCA4OwotICB4IHw9ICgqY29kZXArKyAmIDB4ZmYpIDw8IDE2OwotICB4IHw9ICgqY29kZXArKyAmIDB4ZmYpIDw8IDI0OwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIGludAotZ2V0MTYgKCkKLXsKLSAgaW50IHggPSAwOwotCi0gIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDIpOwotICB4ID0gKmNvZGVwKysgJiAweGZmOwotICB4IHw9ICgqY29kZXArKyAmIDB4ZmYpIDw8IDg7Ci0gIHJldHVybiB4OwotfQotCi1zdGF0aWMgdm9pZAotc2V0X29wIChvcCkKLSAgICAgdW5zaWduZWQgaW50IG9wOwotewotICBvcF9pbmRleFtvcF9hZF0gPSBvcF9hZDsKLSAgb3BfYWRkcmVzc1tvcF9hZF0gPSBvcDsKLX0KLQotc3RhdGljIHZvaWQKLU9QX1JFRyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIGluZGlyX2R4X3JlZzoKLSAgICAgIHMgPSAiKCVkeCkiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBheF9yZWc6IGNhc2UgY3hfcmVnOiBjYXNlIGR4X3JlZzogY2FzZSBieF9yZWc6Ci0gICAgY2FzZSBzcF9yZWc6IGNhc2UgYnBfcmVnOiBjYXNlIHNpX3JlZzogY2FzZSBkaV9yZWc6Ci0gICAgICBzID0gbmFtZXMxNltjb2RlIC0gYXhfcmVnXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgZXNfcmVnOiBjYXNlIHNzX3JlZzogY2FzZSBjc19yZWc6Ci0gICAgY2FzZSBkc19yZWc6IGNhc2UgZnNfcmVnOiBjYXNlIGdzX3JlZzoKLSAgICAgIHMgPSBuYW1lc19zZWdbY29kZSAtIGVzX3JlZ107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGFsX3JlZzogY2FzZSBhaF9yZWc6IGNhc2UgY2xfcmVnOiBjYXNlIGNoX3JlZzoKLSAgICBjYXNlIGRsX3JlZzogY2FzZSBkaF9yZWc6IGNhc2UgYmxfcmVnOiBjYXNlIGJoX3JlZzoKLSAgICAgIHMgPSBuYW1lczhbY29kZSAtIGFsX3JlZ107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGVBWF9yZWc6IGNhc2UgZUNYX3JlZzogY2FzZSBlRFhfcmVnOiBjYXNlIGVCWF9yZWc6Ci0gICAgY2FzZSBlU1BfcmVnOiBjYXNlIGVCUF9yZWc6IGNhc2UgZVNJX3JlZzogY2FzZSBlRElfcmVnOgotICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JcyA9IG5hbWVzMzJbY29kZSAtIGVBWF9yZWddOwotICAgICAgZWxzZQotCXMgPSBuYW1lczE2W2NvZGUgLSBlQVhfcmVnXTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHMgPSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1I7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIG9hcHBlbmQgKHMpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfSSAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IG9wOwotCi0gIHN3aXRjaCAoYnl0ZW1vZGUpCi0gICAgewotICAgIGNhc2UgYl9tb2RlOgotICAgICAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gICAgICBvcCA9ICpjb2RlcCsrICYgMHhmZjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugdl9tb2RlOgotICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0Jb3AgPSBnZXQzMiAoKTsKLSAgICAgIGVsc2UKLQlvcCA9IGdldDE2ICgpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHdfbW9kZToKLSAgICAgIG9wID0gZ2V0MTYgKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGludGVsX3N5bnRheCkKLSAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIG9wKTsKLSAgZWxzZQotICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIkMHgleCIsIG9wKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gIHNjcmF0Y2hidWZbMF0gPSAnXDAnOwotfQotCi1zdGF0aWMgdm9pZAotT1Bfc0kgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBvcDsKLQotICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgIHsKLSAgICBjYXNlIGJfbW9kZToKLSAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAgICAgb3AgPSAqY29kZXArKzsKLSAgICAgIGlmICgob3AgJiAweDgwKSAhPSAwKQotCW9wIC09IDB4MTAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB2X21vZGU6Ci0gICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQlvcCA9IGdldDMyICgpOwotICAgICAgZWxzZQotCXsKLQkgIG9wID0gZ2V0MTYoKTsKLQkgIGlmICgob3AgJiAweDgwMDApICE9IDApCi0JICAgIG9wIC09IDB4MTAwMDA7Ci0JfQotICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHdfbW9kZToKLSAgICAgIG9wID0gZ2V0MTYgKCk7Ci0gICAgICBpZiAoKG9wICYgMHg4MDAwKSAhPSAwKQotCW9wIC09IDB4MTAwMDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChpbnRlbF9zeW50YXgpCi0gICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgb3ApOwotICBlbHNlCi0gICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiQweCV4Iiwgb3ApOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0ogKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBkaXNwOwotICBpbnQgbWFzayA9IC0xOwotCi0gIHN3aXRjaCAoYnl0ZW1vZGUpCi0gICAgewotICAgIGNhc2UgYl9tb2RlOgotICAgICAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gICAgICBkaXNwID0gKmNvZGVwKys7Ci0gICAgICBpZiAoKGRpc3AgJiAweDgwKSAhPSAwKQotCWRpc3AgLT0gMHgxMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHZfbW9kZToKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCWRpc3AgPSBnZXQzMiAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBkaXNwID0gZ2V0MTYgKCk7Ci0JICAvKiBmb3Igc29tZSByZWFzb24sIGEgZGF0YTE2IHByZWZpeCBvbiBhIGp1bXAgaW5zdHJ1Y3Rpb24KLQkgICAgIG1lYW5zIHRoYXQgdGhlIHBjIGlzIG1hc2tlZCB0byAxNiBiaXRzIGFmdGVyIHRoZQotCSAgICAgZGlzcGxhY2VtZW50IGlzIGFkZGVkISAgKi8KLQkgIG1hc2sgPSAweGZmZmY7Ci0JfQotICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGRpc3AgPSAoc3RhcnRfcGMgKyBjb2RlcCAtIHN0YXJ0X2NvZGVwICsgZGlzcCkgJiBtYXNrOwotICBzZXRfb3AgKGRpc3ApOwotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIGRpc3ApOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9TRUcgKGR1bW15LCBzaXplZmxhZykKLSAgICAgaW50IGR1bW15IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzdGF0aWMgY2hhciAqc3JlZ1tdID0gewotICAgICIlZXMiLCIlY3MiLCIlc3MiLCIlZHMiLCIlZnMiLCIlZ3MiLCIlPyIsIiU/IiwKLSAgfTsKLQotICBvYXBwZW5kIChzcmVnW3JlZ10pOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX0RJUiAoZHVtbXksIHNpemVmbGFnKQotICAgICBpbnQgZHVtbXkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpbnQgc2VnLCBvZmZzZXQ7Ci0KLSAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0gICAgewotICAgICAgb2Zmc2V0ID0gZ2V0MzIgKCk7Ci0gICAgICBzZWcgPSBnZXQxNiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvZmZzZXQgPSBnZXQxNiAoKTsKLSAgICAgIHNlZyA9IGdldDE2ICgpOwotICAgIH0KLSAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIkMHgleCwkMHgleCIsIHNlZywgb2Zmc2V0KTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfT0ZGIChpZ25vcmUsIHNpemVmbGFnKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IG9mZjsKLQotICBhcHBlbmRfc2VnICgpOwotCi0gIGlmIChzaXplZmxhZyAmIEFGTEFHKQotICAgIG9mZiA9IGdldDMyICgpOwotICBlbHNlCi0gICAgb2ZmID0gZ2V0MTYgKCk7Ci0KLSAgaWYgKGludGVsX3N5bnRheCkKLSAgICB7Ci0gICAgICBpZiAoIShwcmVmaXhlcyAmIChQUkVGSVhfQ1MgfCBQUkVGSVhfU1MgfCBQUkVGSVhfRFMKLQkJICAgICAgICB8IFBSRUZJWF9FUyB8IFBSRUZJWF9GUyB8IFBSRUZJWF9HUykpKQotCXsKLQkgIG9hcHBlbmQgKG5hbWVzX3NlZ1szXSk7Ci0JICBvYXBwZW5kICgiOiIpOwotCX0KLSAgICB9Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIweCV4Iiwgb2ZmKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wdHJfcmVnIChjb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGNvZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgY29uc3QgY2hhciAqczsKLSAgb2FwcGVuZCAoIigiKTsKLSAgaWYgKHNpemVmbGFnICYgQUZMQUcpCi0gICAgcyA9IG5hbWVzMzJbY29kZSAtIGVBWF9yZWddOwotICBlbHNlCi0gICAgcyA9IG5hbWVzMTZbY29kZSAtIGVBWF9yZWddOwotICBvYXBwZW5kIChzKTsKLSAgb2FwcGVuZCAoIikiKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0VTcmVnIChjb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGNvZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgb2FwcGVuZCAoIiVlczoiKTsKLSAgcHRyX3JlZyAoY29kZSwgc2l6ZWZsYWcpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfRFNyZWcgKGNvZGUsIHNpemVmbGFnKQotICAgICBpbnQgY29kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAoKHByZWZpeGVzCi0gICAgICAgJiAoUFJFRklYX0NTCi0JICB8IFBSRUZJWF9EUwotCSAgfCBQUkVGSVhfU1MKLQkgIHwgUFJFRklYX0VTCi0JICB8IFBSRUZJWF9GUwotCSAgfCBQUkVGSVhfR1MpKSA9PSAwKQotICAgIHByZWZpeGVzIHw9IFBSRUZJWF9EUzsKLSAgYXBwZW5kX3NlZygpOwotICBwdHJfcmVnIChjb2RlLCBzaXplZmxhZyk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfQyAoZHVtbXksIHNpemVmbGFnKQotICAgICBpbnQgZHVtbXkgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJWNyJWQiLCByZWcpOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9EIChkdW1teSwgc2l6ZWZsYWcpCi0gICAgIGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUlZGIlZCIsIHJlZyk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX1QgKGR1bW15LCBzaXplZmxhZykKLSAgICAgaW50IGR1bW15IEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSV0ciVkIiwgcmVnKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9SZCAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaWYgKG1vZCA9PSAzKQotICAgIE9QX0UgKGJ5dGVtb2RlLCBzaXplZmxhZyk7Ci0gIGVsc2UKLSAgICBCYWRPcCgpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfTU1YIChpZ25vcmUsIHNpemVmbGFnKQotICAgICBpbnQgaWdub3JlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVtbSVkIiwgcmVnKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9YTU0gKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlIEFUVFJJQlVURV9VTlVTRUQ7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSV4bW0lZCIsIHJlZyk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfRU0gKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmIChtb2QgIT0gMykKLSAgICB7Ci0gICAgICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjb2RlcCsrOwotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVtbSVkIiwgcm0pOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0VYIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAobW9kICE9IDMpCi0gICAgewotICAgICAgT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29kZXArKzsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUleG1tJWQiLCBybSk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfTVMgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmIChtb2QgPT0gMykKLSAgICBPUF9FTSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKLSAgZWxzZQotICAgIEJhZE9wKCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpTdWZmaXgzRE5vd1tdID0gewotLyogMDAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDA0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAwOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMEMgKi8JInBpMmZ3IiwJInBpMmZkIiwJTlVMTCwJCU5VTEwsCi0vKiAxMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDE4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAxQyAqLwkicGYyaXciLAkicGYyaWQiLAlOVUxMLAkJTlVMTCwKLS8qIDIwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAyNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMjggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDJDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAzMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMzQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDM4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAzQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNDAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDQ0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA0OCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNEMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDUwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA1NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNTggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDVDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA2MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNjQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDY4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA2QyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNzAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDc0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA3OCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogN0MgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDgwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA4NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogODggKi8JTlVMTCwJCU5VTEwsCQkicGZuYWNjIiwJTlVMTCwKLS8qIDhDICovCU5VTEwsCQlOVUxMLAkJInBmcG5hY2MiLAlOVUxMLAotLyogOTAgKi8JInBmY21wZ2UiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA5NCAqLwkicGZtaW4iLAlOVUxMLAkJInBmcmNwIiwJInBmcnNxcnQiLAotLyogOTggKi8JTlVMTCwJCU5VTEwsCQkicGZzdWIiLAlOVUxMLAotLyogOUMgKi8JTlVMTCwJCU5VTEwsCQkicGZhZGQiLAlOVUxMLAotLyogQTAgKi8JInBmY21wZ3QiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBBNCAqLwkicGZtYXgiLAlOVUxMLAkJInBmcmNwaXQxIiwJInBmcnNxaXQxIiwKLS8qIEE4ICovCU5VTEwsCQlOVUxMLAkJInBmc3ViciIsCU5VTEwsCi0vKiBBQyAqLwlOVUxMLAkJTlVMTCwJCSJwZmFjYyIsCU5VTEwsCi0vKiBCMCAqLwkicGZjbXBlcSIsCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEI0ICovCSJwZm11bCIsCU5VTEwsCQkicGZyY3BpdDIiLAkicGZtdWxocnciLAotLyogQjggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJInBzd2FwZCIsCi0vKiBCQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQkicGF2Z3VzYiIsCi0vKiBDMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogQzQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEM4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBDQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRDAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEQ0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBEOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogREMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEUwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBFNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRTggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEVDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBGMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRjQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEY4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBGQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotfTsKLQotc3RhdGljIHZvaWQKLU9QXzNETm93U3VmZml4IChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZSBBVFRSSUJVVEVfVU5VU0VEOwotICAgICBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRDsKLXsKLSAgY29uc3QgY2hhciAqbW5lbW9uaWM7Ci0KLSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gIC8qIEFNRCAzRE5vdyEgaW5zdHJ1Y3Rpb25zIGFyZSBzcGVjaWZpZWQgYnkgYW4gb3Bjb2RlIHN1ZmZpeCBpbiB0aGUKLSAgICAgcGxhY2Ugd2hlcmUgYW4gOC1iaXQgaW1tZWRpYXRlIHdvdWxkIG5vcm1hbGx5IGdvLiAgaWUuIHRoZSBsYXN0Ci0gICAgIGJ5dGUgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgb2J1ZnAgPSBvYnVmICsgc3RybGVuKG9idWYpOwotICBtbmVtb25pYyA9IFN1ZmZpeDNETm93Wypjb2RlcCsrICYgMHhmZl07Ci0gIGlmIChtbmVtb25pYykKLSAgICBvYXBwZW5kIChtbmVtb25pYyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTaW5jZSBhIHZhcmlhYmxlIHNpemVkIG1vZHJtL3NpYiBjaHVuayBpcyBiZXR3ZWVuIHRoZSBzdGFydAotCSBvZiB0aGUgb3Bjb2RlICgweDBmMGYpIGFuZCB0aGUgb3Bjb2RlIHN1ZmZpeCwgd2UgbmVlZCB0byBkbwotCSBhbGwgdGhlIG1vZHJtIHByb2Nlc3NpbmcgZmlyc3QsIGFuZCBkb24ndCBrbm93IHVudGlsIG5vdyB0aGF0Ci0JIHdlIGhhdmUgYSBiYWQgb3Bjb2RlLiAgVGhpcyBuZWNlc3NpdGF0ZXMgc29tZSBjbGVhbmluZyB1cC4gICovCi0gICAgICBvcDFvdXRbMF0gPSAnXDAnOwotICAgICAgb3Ayb3V0WzBdID0gJ1wwJzsKLSAgICAgIEJhZE9wKCk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzaW1kX2NtcF9vcCBbXSA9IHsKLSAgImVxIiwKLSAgImx0IiwKLSAgImxlIiwKLSAgInVub3JkIiwKLSAgIm5lcSIsCi0gICJubHQiLAotICAibmxlIiwKLSAgIm9yZCIKLX07Ci0KLXN0YXRpYyB2b2lkCi1PUF9TSU1EX1N1ZmZpeCAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGUgQVRUUklCVVRFX1VOVVNFRDsKLSAgICAgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQ7Ci17Ci0gIHVuc2lnbmVkIGludCBjbXBfdHlwZTsKLQotICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKLSAgb2J1ZnAgPSBvYnVmICsgc3RybGVuKG9idWYpOwotICBjbXBfdHlwZSA9ICpjb2RlcCsrICYgMHhmZjsKLSAgaWYgKGNtcF90eXBlIDwgOCkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiY21wJXMlY3MiLAotCSAgICAgICBzaW1kX2NtcF9vcFtjbXBfdHlwZV0sCi0JICAgICAgIHByZWZpeGVzICYgUFJFRklYX1JFUFogPyAncycgOiAncCcpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfUkVQWik7Ci0gICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGEgYmFkIGV4dGVuc2lvbiBieXRlLiAgQ2xlYW4gdXAuICAqLwotICAgICAgb3Axb3V0WzBdID0gJ1wwJzsKLSAgICAgIG9wMm91dFswXSA9ICdcMCc7Ci0gICAgICBCYWRPcCgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLVNJTURfRml4dXAgKGV4dHJhY2hhciwgc2l6ZWZsYWcpCi0gICAgIGludCBleHRyYWNoYXI7Ci0gICAgIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEOwotewotICAvKiBDaGFuZ2UgbW92bHBzL21vdmhwcyB0byBtb3ZobHBzL21vdmxocHMgZm9yIDIgcmVnaXN0ZXIgb3BlcmFuZAotICAgICBmb3JtcyBvZiB0aGVzZSBpbnN0cnVjdGlvbnMuICAqLwotICBpZiAobW9kID09IDMpCi0gICAgewotICAgICAgY2hhciAqcCA9IG9idWYgKyBzdHJsZW4ob2J1Zik7Ci0gICAgICAqKHArMSkgPSAnXDAnOwotICAgICAgKnAgICAgID0gKihwLTEpOwotICAgICAgKihwLTEpID0gKihwLTIpOwotICAgICAgKihwLTIpID0gKihwLTMpOwotICAgICAgKihwLTMpID0gZXh0cmFjaGFyOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgQmFkT3AgKHZvaWQpCi17Ci0gIGNvZGVwID0gaW5zbl9jb2RlcCArIDE7CS8qIHRocm93IGF3YXkgcHJlZml4ZXMgYW5kIDFzdC4gb3Bjb2RlIGJ5dGUgKi8KLSAgb2FwcGVuZCAoIihiYWQpIik7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2k5NjAtZGlzLmMgYi9vcGNvZGVzL2k5NjAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYmQ4NDguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9pOTYwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTE0ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIGk4MDk2MCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MywgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJlZ19uYW1lc1tdID0gewotLyogIDAgKi8JInBmcCIsICJzcCIsICAicmlwIiwgInIzIiwgICJyNCIsICAicjUiLCAgInI2IiwgICJyNyIsIAotLyogIDggKi8JInI4IiwgICJyOSIsICAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUiLAotLyogMTYgKi8JImcwIiwgICJnMSIsICAiZzIiLCAgImczIiwgICJnNCIsICAiZzUiLCAgImc2IiwgICJnNyIsIAotLyogMjQgKi8JImc4IiwgICJnOSIsICAiZzEwIiwgImcxMSIsICJnMTIiLCAiZzEzIiwgImcxNCIsICJmcCIsIAotLyogMzIgKi8JInBjIiwgICJhYyIsICAiaXAiLCAgInRjIiwgICJmcDAiLCAiZnAxIiwgImZwMiIsICJmcDMiIAotfTsKLQotCi1zdGF0aWMgRklMRSAqc3RyZWFtOwkJLyogT3V0cHV0IGdvZXMgaGVyZSAqLwotc3RhdGljIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotc3RhdGljIHZvaWQgcHJpbnRfYWRkcigpOwotc3RhdGljIHZvaWQgY3RybCgpOwotc3RhdGljIHZvaWQgY29icigpOwotc3RhdGljIHZvaWQgcmVnKCk7Ci1zdGF0aWMgaW50IG1lbSgpOwotc3RhdGljIHZvaWQgZWEoKTsKLXN0YXRpYyB2b2lkIGRzdG9wKCk7Ci1zdGF0aWMgdm9pZCByZWdvcCgpOwotc3RhdGljIHZvaWQgaW52YWxpZCgpOwotc3RhdGljIGludCBwaW5zbigpOwotc3RhdGljIHZvaWQgcHV0X2FicygpOwotCi0KLS8qIFByaW50IHRoZSBpOTYwIGluc3RydWN0aW9uIGF0IGFkZHJlc3MgJ21lbWFkZHInIGluIGRlYnVnZ2VkIG1lbW9yeSwKLSAgIG9uIElORk8tPlNUUkVBTS4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMuICAqLwotCi1pbnQKLXByaW50X2luc25faTk2MCAobWVtYWRkciwgaW5mb19hcmcpCi0gICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvX2FyZzsKLXsKLSAgdW5zaWduZWQgaW50IHdvcmQxLCB3b3JkMiA9IDB4ZGVhZGJlZWY7Ci0gIGJmZF9ieXRlIGJ1ZmZlcls4XTsKLSAgaW50IHN0YXR1czsKLQotICBpbmZvID0gaW5mb19hcmc7Ci0gIHN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLQotICAvKiBSZWFkIHdvcmQxLiAgT25seSByZWFkIHdvcmQyIGlmIHRoZSBpbnN0cnVjdGlvbgotICAgICBuZWVkcyBpdCwgdG8gcHJldmVudCByZWFkaW5nIHBhc3QgdGhlIGVuZCBvZiBhIHNlY3Rpb24uICAqLwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIChiZmRfYnl0ZSAqKSBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHdvcmQxID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQotICAvKiBEaXZpZGUgaW5zdHJ1Y3Rpb24gc2V0IGludG8gY2xhc3NlcyBiYXNlZCBvbiBoaWdoIDQgYml0cyBvZiBvcGNvZGUuICAqLwotICBzd2l0Y2ggKCAod29yZDEgPj4gMjgpICYgMHhmICkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg4OgotICAgIGNhc2UgMHg5OgotICAgIGNhc2UgMHhhOgotICAgIGNhc2UgMHhiOgotICAgIGNhc2UgMHhjOgotICAgICAgLyogUmVhZCB3b3JkMi4gICovCi0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JKG1lbWFkZHIgKyA0LCAoYmZkX2J5dGUgKikgKGJ1ZmZlciArIDQpLCA0LCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICB3b3JkMiA9IGJmZF9nZXRsMzIgKGJ1ZmZlciArIDQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBwaW5zbiggbWVtYWRkciwgd29yZDEsIHdvcmQyICk7Ci19Ci0MCi0jZGVmaW5lIElOX0dEQgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCUFsbCBjb2RlIGJlbG93IHRoaXMgcG9pbnQgc2hvdWxkIGJlIGlkZW50aWNhbCB3aXRoIHRoYXQgb2YKLSAqCXRoZSBkaXNhc3NlbWJsZXIgaW4gZ2RtcDk2MC4KLQotIEEgbm9ibGUgc2VudGltZW50LCBidXQgYXQgbGVhc3QgaW4gY29zbWV0aWMgd2F5cyAoaW5mby0+ZnByaW50Zl9mdW5jKSwgaXQKLSBqdXN0IGFpbid0IHNvLiAta2luZ2RvbiwgMzEgTWFyIDkzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCB0YWJlbnQgewotICBjaGFyICpuYW1lOwotICBzaG9ydCBudW1vcHM7Ci19OwotCi1zdHJ1Y3Qgc3BhcnNlX3RhYmVudCB7Ci0gIGludCBvcGNvZGU7Ci0gIGNoYXIgKm5hbWU7Ci0gIHNob3J0IG51bW9wczsKLX07Ci0KLXN0YXRpYyBpbnQKLXBpbnNuKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIgKQotICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICB1bnNpZ25lZCBsb25nIHdvcmQxLCB3b3JkMjsKLXsKLQlpbnQgaW5zdHJfbGVuOwotCi0JaW5zdHJfbGVuID0gNDsKLQlwdXRfYWJzKCB3b3JkMSwgd29yZDIgKTsKLQotCS8qIERpdmlkZSBpbnN0cnVjdGlvbiBzZXQgaW50byBjbGFzc2VzIGJhc2VkIG9uIGhpZ2ggNCBiaXRzIG9mIG9wY29kZSovCi0Jc3dpdGNoICggKHdvcmQxID4+IDI4KSAmIDB4ZiApewotCWNhc2UgMHgwOgotCWNhc2UgMHgxOgotCQljdHJsKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIgKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDI6Ci0JY2FzZSAweDM6Ci0JCWNvYnIoIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApOwotCQlicmVhazsKLQljYXNlIDB4NToKLQljYXNlIDB4NjoKLQljYXNlIDB4NzoKLQkJcmVnKCB3b3JkMSApOwotCQlicmVhazsKLQljYXNlIDB4ODoKLQljYXNlIDB4OToKLQljYXNlIDB4YToKLQljYXNlIDB4YjoKLQljYXNlIDB4YzoKLQkJaW5zdHJfbGVuID0gbWVtKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIsIDAgKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogaW52YWxpZCBpbnN0cnVjdGlvbiwgcHJpbnQgYXMgZGF0YSB3b3JkICovIAotCQlpbnZhbGlkKCB3b3JkMSApOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIGluc3RyX2xlbjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBDVFJMIGZvcm1hdAkJCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotY3RybCggbWVtYWRkciwgd29yZDEsIHdvcmQyICkKLSAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7Ci17Ci0JaW50IGk7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCB0YWJlbnQgY3RybF90YWJbXSA9IHsKLQkgIHsgTlVMTCwJCTAsIH0sCS8qIDB4MDAgKi8KLQkgIHsgTlVMTCwJCTAsIH0sCS8qIDB4MDEgKi8KLQkgIHsgTlVMTCwJCTAsIH0sCS8qIDB4MDIgKi8KLQkgIHsgTlVMTCwJCTAsIH0sCS8qIDB4MDMgKi8KLQkgIHsgTlVMTCwJCTAsIH0sCS8qIDB4MDQgKi8KLQkgIHsgTlVMTCwJCTAsIH0sCS8qIDB4MDUgKi8KLQkgIHsgTlVMTCwJCTAsIH0sCS8qIDB4MDYgKi8KLQkgIHsgTlVMTCwJCTAsIH0sCS8qIDB4MDcgKi8KLQkgIHsgImIiLAkJMSwgfSwJLyogMHgwOCAqLwotCSAgeyAiY2FsbCIsCQkxLCB9LAkvKiAweDA5ICovCi0JICB7ICJyZXQiLAkJMCwgfSwJLyogMHgwYSAqLwotCSAgeyAiYmFsIiwJCTEsIH0sCS8qIDB4MGIgKi8KLQkgIHsgTlVMTCwJCTAsIH0sCS8qIDB4MGMgKi8KLQkgIHsgTlVMTCwJCTAsIH0sCS8qIDB4MGQgKi8KLQkgIHsgTlVMTCwJCTAsIH0sCS8qIDB4MGUgKi8KLQkgIHsgTlVMTCwJCTAsIH0sCS8qIDB4MGYgKi8KLQkgIHsgImJubyIsCQkxLCB9LAkvKiAweDEwICovCi0JICB7ICJiZyIsCQkxLCB9LAkvKiAweDExICovCi0JICB7ICJiZSIsCQkxLCB9LAkvKiAweDEyICovCi0JICB7ICJiZ2UiLAkJMSwgfSwJLyogMHgxMyAqLwotCSAgeyAiYmwiLAkJMSwgfSwJLyogMHgxNCAqLwotCSAgeyAiYm5lIiwJCTEsIH0sCS8qIDB4MTUgKi8KLQkgIHsgImJsZSIsCQkxLCB9LAkvKiAweDE2ICovCi0JICB7ICJibyIsCQkxLCB9LAkvKiAweDE3ICovCi0JICB7ICJmYXVsdG5vIiwJCTAsIH0sCS8qIDB4MTggKi8KLQkgIHsgImZhdWx0ZyIsCQkwLCB9LAkvKiAweDE5ICovCi0JICB7ICJmYXVsdGUiLAkJMCwgfSwJLyogMHgxYSAqLwotCSAgeyAiZmF1bHRnZSIsCQkwLCB9LAkvKiAweDFiICovCi0JICB7ICJmYXVsdGwiLAkJMCwgfSwJLyogMHgxYyAqLwotCSAgeyAiZmF1bHRuZSIsCQkwLCB9LAkvKiAweDFkICovCi0JICB7ICJmYXVsdGxlIiwJCTAsIH0sCS8qIDB4MWUgKi8KLQkgIHsgImZhdWx0byIsCQkwLCB9LAkvKiAweDFmICovCi0JfTsKLQotCWkgPSAod29yZDEgPj4gMjQpICYgMHhmZjsKLQlpZiAoIChjdHJsX3RhYltpXS5uYW1lID09IE5VTEwpIHx8ICgod29yZDEgJiAxKSAhPSAwKSApewotCQlpbnZhbGlkKCB3b3JkMSApOwotCQlyZXR1cm47Ci0JfQotCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpICggc3RyZWFtLCBjdHJsX3RhYltpXS5uYW1lICk7Ci0JaWYgKCB3b3JkMSAmIDIgKXsJCS8qIFByZWRpY3RzIGJyYW5jaCBub3QgdGFrZW4gKi8KLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpICggc3RyZWFtLCAiLmYiICk7Ci0JfQotCi0JaWYgKCBjdHJsX3RhYltpXS5udW1vcHMgPT0gMSApewotCQkvKiBFWFRSQUNUIERJU1BMQUNFTUVOVCBBTkQgQ09OVkVSVCBUTyBBRERSRVNTICovCi0JCXdvcmQxICY9IDB4MDBmZmZmZmY7Ci0JCWlmICggd29yZDEgJiAweDAwODAwMDAwICl7CQkvKiBTaWduIGJpdCBpcyBzZXQgKi8KLQkJCXdvcmQxIHw9ICgtMSAmIH4weGZmZmZmZik7CS8qIFNpZ24gZXh0ZW5kICovCi0JCX0KLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJcdCIgKTsKLQkJcHJpbnRfYWRkciggd29yZDEgKyBtZW1hZGRyICk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIENPQlIgZm9ybWF0CQkJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1jb2JyKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIgKQotICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICB1bnNpZ25lZCBsb25nIHdvcmQxLCB3b3JkMjsKLXsKLQlpbnQgc3JjMTsKLQlpbnQgc3JjMjsKLQlpbnQgaTsKLQotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGFiZW50IGNvYnJfdGFiW10gPSB7Ci0JICB7ICJ0ZXN0bm8iLAkxLCB9LAkvKiAweDIwICovCi0JICB7ICJ0ZXN0ZyIsCTEsIH0sCS8qIDB4MjEgKi8KLQkgIHsgInRlc3RlIiwJMSwgfSwJLyogMHgyMiAqLwotCSAgeyAidGVzdGdlIiwJMSwgfSwJLyogMHgyMyAqLwotCSAgeyAidGVzdGwiLAkxLCB9LAkvKiAweDI0ICovCi0JICB7ICJ0ZXN0bmUiLAkxLCB9LAkvKiAweDI1ICovCi0JICB7ICJ0ZXN0bGUiLAkxLCB9LAkvKiAweDI2ICovCi0JICB7ICJ0ZXN0byIsCTEsIH0sCS8qIDB4MjcgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyOCAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDI5ICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmEgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyYiAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJjICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmQgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyZSAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJmICovCi0JICB7ICJiYmMiLAkzLCB9LAkvKiAweDMwICovCi0JICB7ICJjbXBvYmciLAkzLCB9LAkvKiAweDMxICovCi0JICB7ICJjbXBvYmUiLAkzLCB9LAkvKiAweDMyICovCi0JICB7ICJjbXBvYmdlIiwJMywgfSwJLyogMHgzMyAqLwotCSAgeyAiY21wb2JsIiwJMywgfSwJLyogMHgzNCAqLwotCSAgeyAiY21wb2JuZSIsCTMsIH0sCS8qIDB4MzUgKi8KLQkgIHsgImNtcG9ibGUiLAkzLCB9LAkvKiAweDM2ICovCi0JICB7ICJiYnMiLAkzLCB9LAkvKiAweDM3ICovCi0JICB7ICJjbXBpYm5vIiwJMywgfSwJLyogMHgzOCAqLwotCSAgeyAiY21waWJnIiwJMywgfSwJLyogMHgzOSAqLwotCSAgeyAiY21waWJlIiwJMywgfSwJLyogMHgzYSAqLwotCSAgeyAiY21waWJnZSIsCTMsIH0sCS8qIDB4M2IgKi8KLQkgIHsgImNtcGlibCIsCTMsIH0sCS8qIDB4M2MgKi8KLQkgIHsgImNtcGlibmUiLAkzLCB9LAkvKiAweDNkICovCi0JICB7ICJjbXBpYmxlIiwJMywgfSwJLyogMHgzZSAqLwotCSAgeyAiY21waWJvIiwJMywgfSwJLyogMHgzZiAqLwotCX07Ci0KLQlpID0gKCh3b3JkMSA+PiAyNCkgJiAweGZmKSAtIDB4MjA7Ci0JaWYgKCBjb2JyX3RhYltpXS5uYW1lID09IE5VTEwgKXsKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJcmV0dXJuOwotCX0KLQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoIHN0cmVhbSwgY29icl90YWJbaV0ubmFtZSApOwotCWlmICggd29yZDEgJiAyICl7CQkvKiBQcmVkaWN0cyBicmFuY2ggbm90IHRha2VuICovCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoIHN0cmVhbSwgIi5mIiApOwotCX0KLQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIlx0IiApOwotCi0Jc3JjMSA9ICh3b3JkMSA+PiAxOSkgJiAweDFmOwotCXNyYzIgPSAod29yZDEgPj4gMTQpICYgMHgxZjsKLQotCWlmICggd29yZDEgJiAweDAyMDAwICl7CQkvKiBNMSBpcyAxICovCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJWQiLCBzcmMxICk7Ci0JfSBlbHNlIHsJCQkvKiBNMSBpcyAwICovCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCByZWdfbmFtZXNbc3JjMV0gKTsKLQl9Ci0KLQlpZiAoIGNvYnJfdGFiW2ldLm51bW9wcyA+IDEgKXsKLQkJaWYgKCB3b3JkMSAmIDEgKXsJCS8qIFMyIGlzIDEgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLHNmJWQsIiwgc3JjMiApOwotCQl9IGVsc2UgewkJCS8qIFMxIGlzIDAgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLCVzLCIsIHJlZ19uYW1lc1tzcmMyXSApOwotCQl9Ci0KLQkJLyogRXh0cmFjdCBkaXNwbGFjZW1lbnQgYW5kIGNvbnZlcnQgdG8gYWRkcmVzcwotCQkgKi8KLQkJd29yZDEgJj0gMHgwMDAwMWZmYzsKLQkJaWYgKCB3b3JkMSAmIDB4MDAwMDEwMDAgKXsJLyogTmVnYXRpdmUgZGlzcGxhY2VtZW50ICovCi0JCQl3b3JkMSB8PSAoLTEgJiB+MHgxZmZmKTsJLyogU2lnbiBleHRlbmQgKi8KLQkJfQotCQlwcmludF9hZGRyKCBtZW1hZGRyICsgd29yZDEgKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogTUVNIGZvcm1hdAkJCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50CQkJCS8qIHJldHVybnMgaW5zdHJ1Y3Rpb24gbGVuZ3RoOiA0IG9yIDggKi8KLW1lbSggbWVtYWRkciwgd29yZDEsIHdvcmQyLCBub3ByaW50ICkKLSAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7Ci0gICAgaW50IG5vcHJpbnQ7CQkvKiBJZiBUUlVFLCByZXR1cm4gaW5zdHJ1Y3Rpb24gbGVuZ3RoLCBidXQKLQkJCQkgKiBkb24ndCBvdXRwdXQgYW55IHRleHQuCi0JCQkJICovCi17Ci0JaW50IGksIGo7Ci0JaW50IGxlbjsKLQlpbnQgbW9kZTsKLQlpbnQgb2Zmc2V0OwotCWNvbnN0IGNoYXIgKnJlZzEsICpyZWcyLCAqcmVnMzsKLQotCS8qIFRoaXMgbG9va3VwIHRhYmxlIGlzIHRvbyBzcGFyc2UgdG8gbWFrZSBpdCB3b3J0aCB0eXBpbmcgaW4sIGJ1dCBub3QKLQkgICBzbyBsYXJnZSBhcyB0byBtYWtlIGEgc3BhcnNlIGFycmF5IG5lY2Vzc2FyeS4gIFdlIGNyZWF0ZSB0aGUgdGFibGUKLQkgICBhdCBydW50aW1lLiAgKi8KLQotCS8qCi0JICogTk9URTogSW4gdGhpcyB0YWJsZSwgdGhlIG1lYW5pbmcgb2YgJ251bW9wcycgaXM6Ci0JICoJIDE6IHNpbmdsZSBvcGVyYW5kCi0JICoJIDI6IDIgb3BlcmFuZHMsIGxvYWQgaW5zdHJ1Y3Rpb24KLQkgKgktMjogMiBvcGVyYW5kcywgc3RvcmUgaW5zdHJ1Y3Rpb24KLQkgKi8KLQlzdGF0aWMgc3RydWN0IHRhYmVudCAqbWVtX3RhYjsKLS8qIE9wY29kZXMgb2YgMHg4WCwgOVgsIGFYLCBiWCwgYW5kIGNYIG11c3QgYmUgaW4gdGhlIHRhYmxlLiAgKi8KLSNkZWZpbmUgTUVNX01JTgkweDgwCi0jZGVmaW5lIE1FTV9NQVgJMHhjZgotI2RlZmluZSBNRU1fU0laCSggKiBzaXplb2Yoc3RydWN0IHRhYmVudCkpCi0KLQlzdGF0aWMgY29uc3Qgc3RydWN0IHNwYXJzZV90YWJlbnQgbWVtX2luaXRbXSA9IHsKLQkgIHsgMHg4MCwJImxkb2IiLAkgMiB9LAotCSAgeyAweDgyLAkic3RvYiIsCS0yIH0sCi0JICB7IDB4ODQsCSJieCIsCSAxIH0sCi0JICB7IDB4ODUsCSJiYWx4IiwJIDIgfSwKLQkgIHsgMHg4NiwJImNhbGx4IiwgMSB9LAotCSAgeyAweDg4LAkibGRvcyIsCSAyIH0sCi0JICB7IDB4OGEsCSJzdG9zIiwJLTIgfSwKLQkgIHsgMHg4YywJImxkYSIsCSAyIH0sCi0JICB7IDB4OTAsCSJsZCIsCSAyIH0sCi0JICB7IDB4OTIsCSJzdCIsCS0yIH0sCi0JICB7IDB4OTgsCSJsZGwiLAkgMiB9LAotCSAgeyAweDlhLAkic3RsIiwJLTIgfSwKLQkgIHsgMHhhMCwJImxkdCIsCSAyIH0sCi0JICB7IDB4YTIsCSJzdHQiLAktMiB9LAotCSAgeyAweGFjLAkiZGNpbnZhIiwgMSB9LAotCSAgeyAweGIwLAkibGRxIiwJIDIgfSwKLQkgIHsgMHhiMiwJInN0cSIsCS0yIH0sCi0JICB7IDB4YzAsCSJsZGliIiwJIDIgfSwKLQkgIHsgMHhjMiwJInN0aWIiLAktMiB9LAotCSAgeyAweGM4LAkibGRpcyIsCSAyIH0sCi0JICB7IDB4Y2EsCSJzdGlzIiwJLTIgfSwKLQkgIHsgMCwJCU5VTEwsCTAgfQotCX07Ci0Jc3RhdGljIHN0cnVjdCB0YWJlbnQgbWVtX3RhYl9idWZbTUVNX01BWCAtIE1FTV9NSU4gKyAxXTsKLQotCWlmICggbWVtX3RhYiA9PSBOVUxMICl7Ci0JCW1lbV90YWIgPSBtZW1fdGFiX2J1ZjsKLQkJZm9yICggaSA9IDA7IG1lbV9pbml0W2ldLm9wY29kZSAhPSAwOyBpKysgKXsKLQkJCWogPSBtZW1faW5pdFtpXS5vcGNvZGUgLSBNRU1fTUlOOwotCQkJbWVtX3RhYltqXS5uYW1lID0gbWVtX2luaXRbaV0ubmFtZTsKLQkJCW1lbV90YWJbal0ubnVtb3BzID0gbWVtX2luaXRbaV0ubnVtb3BzOwotCQl9Ci0JfQotCi0JaSA9ICgod29yZDEgPj4gMjQpICYgMHhmZikgLSBNRU1fTUlOOwotCW1vZGUgPSAod29yZDEgPj4gMTApICYgMHhmOwotCi0JaWYgKCAobWVtX3RhYltpXS5uYW1lICE9IE5VTEwpCQkvKiBWYWxpZCBpbnN0cnVjdGlvbiAqLwotCSYmICAgKChtb2RlID09IDUpIHx8IChtb2RlID49MTIpKSApewkvKiBXaXRoIDMyLWJpdCBkaXNwbGFjZW1lbnQgKi8KLQkJbGVuID0gODsKLQl9IGVsc2UgewotCQlsZW4gPSA0OwotCX0KLQotCWlmICggbm9wcmludCApewotCQlyZXR1cm4gbGVuOwotCX0KLQotCWlmICggKG1lbV90YWJbaV0ubmFtZSA9PSBOVUxMKSB8fCAobW9kZSA9PSA2KSApewotCQlpbnZhbGlkKCB3b3JkMSApOwotCQlyZXR1cm4gbGVuOwotCX0KLQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJXNcdCIsIG1lbV90YWJbaV0ubmFtZSApOwotCi0JcmVnMSA9IHJlZ19uYW1lc1sgKHdvcmQxID4+IDE5KSAmIDB4MWYgXTsJLyogTUVNQiBvbmx5ICovCi0JcmVnMiA9IHJlZ19uYW1lc1sgKHdvcmQxID4+IDE0KSAmIDB4MWYgXTsKLQlyZWczID0gcmVnX25hbWVzWyB3b3JkMSAmIDB4MWYgXTsJCS8qIE1FTUIgb25seSAqLwotCW9mZnNldCA9IHdvcmQxICYgMHhmZmY7CQkJCS8qIE1FTUEgb25seSAgKi8KLQotCXN3aXRjaCAoIG1lbV90YWJbaV0ubnVtb3BzICl7Ci0KLQljYXNlIDI6IC8qIExPQUQgSU5TVFJVQ1RJT04gKi8KLQkJaWYgKCBtb2RlICYgNCApewkJCS8qIE1FTUIgRk9STUFUICovCi0JCQllYSggbWVtYWRkciwgbW9kZSwgcmVnMiwgcmVnMywgd29yZDEsIHdvcmQyICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwlcyIsIHJlZzEgKTsKLQkJfSBlbHNlIHsJCQkJLyogTUVNQSBGT1JNQVQgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiMHgleCIsICh1bnNpZ25lZCkgb2Zmc2V0ICk7Ci0JCQlpZiAobW9kZSAmIDgpIHsKLQkJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7Ci0JCQl9Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwlcyIsIHJlZzEgKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgLTI6IC8qIFNUT1JFIElOU1RSVUNUSU9OICovCi0JCWlmICggbW9kZSAmIDQgKXsJCQkvKiBNRU1CIEZPUk1BVCAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlcywiLCByZWcxICk7Ci0JCQllYSggbWVtYWRkciwgbW9kZSwgcmVnMiwgcmVnMywgd29yZDEsIHdvcmQyICk7Ci0JCX0gZWxzZSB7CQkJCS8qIE1FTUEgRk9STUFUICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVzLDB4JXgiLCByZWcxLCAodW5zaWduZWQpIG9mZnNldCApOwotCQkJaWYgKG1vZGUgJiA4KSB7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAxOiAvKiBCWC9DQUxMWCBJTlNUUlVDVElPTiAqLwotCQlpZiAoIG1vZGUgJiA0ICl7CQkJLyogTUVNQiBGT1JNQVQgKi8KLQkJCWVhKCBtZW1hZGRyLCBtb2RlLCByZWcyLCByZWczLCB3b3JkMSwgd29yZDIgKTsKLQkJfSBlbHNlIHsJCQkJLyogTUVNQSBGT1JNQVQgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiMHgleCIsICh1bnNpZ25lZCkgb2Zmc2V0ICk7Ci0JCQlpZiAobW9kZSAmIDgpIHsKLQkJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGxlbjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBSRUcgZm9ybWF0CQkJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1yZWcoIHdvcmQxICkKLSAgICB1bnNpZ25lZCBsb25nIHdvcmQxOwotewotCWludCBpLCBqOwotCWludCBvcGNvZGU7Ci0JaW50IGZwOwotCWludCBtMSwgbTIsIG0zOwotCWludCBzMSwgczI7Ci0JaW50IHNyYywgc3JjMiwgZHN0OwotCWNoYXIgKm1uZW1wOwotCi0JLyogVGhpcyBsb29rdXAgdGFibGUgaXMgdG9vIHNwYXJzZSB0byBtYWtlIGl0IHdvcnRoIHR5cGluZyBpbiwgYnV0IG5vdAotCSAgIHNvIGxhcmdlIGFzIHRvIG1ha2UgYSBzcGFyc2UgYXJyYXkgbmVjZXNzYXJ5LiAgV2UgY3JlYXRlIHRoZSB0YWJsZQotCSAgIGF0IHJ1bnRpbWUuICAqLwotCi0JLyoKLQkgKiBOT1RFOiBJbiB0aGlzIHRhYmxlLCB0aGUgbWVhbmluZyBvZiAnbnVtb3BzJyBpczoKLQkgKgkgMTogc2luZ2xlIG9wZXJhbmQsIHdoaWNoIGlzIE5PVCBhIGRlc3RpbmF0aW9uLgotCSAqCS0xOiBzaW5nbGUgb3BlcmFuZCwgd2hpY2ggSVMgYSBkZXN0aW5hdGlvbi4KLQkgKgkgMjogMiBvcGVyYW5kcywgdGhlIDJuZCBvZiB3aGljaCBpcyBOT1QgYSBkZXN0aW5hdGlvbi4KLQkgKgktMjogMiBvcGVyYW5kcywgdGhlIDJuZCBvZiB3aGljaCBJUyBhIGRlc3RpbmF0aW9uLgotCSAqCSAzOiAzIG9wZXJhbmRzCi0JICoKLQkgKglJZiBhbiBvcGNvZGUgbW5lbW9uaWMgYmVnaW5zIHdpdGggIkYiLCBpdCBpcyBhIGZsb2F0aW5nLXBvaW50Ci0JICoJb3Bjb2RlICh0aGUgIkYiIGlzIG5vdCBwcmludGVkKS4KLQkgKi8KLQotCXN0YXRpYyBzdHJ1Y3QgdGFiZW50ICpyZWdfdGFiOwotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BhcnNlX3RhYmVudCByZWdfaW5pdFtdID0gewotI2RlZmluZSBSRUdfTUlOCTB4NTgwCi0JICB7IDB4NTgwLAkibm90Yml0IiwJMyB9LAotCSAgeyAweDU4MSwJImFuZCIsCQkzIH0sCi0JICB7IDB4NTgyLAkiYW5kbm90IiwJMyB9LAotCSAgeyAweDU4MywJInNldGJpdCIsCTMgfSwKLQkgIHsgMHg1ODQsCSJub3RhbmQiLAkzIH0sCi0JICB7IDB4NTg2LAkieG9yIiwJCTMgfSwKLQkgIHsgMHg1ODcsCSJvciIsCQkzIH0sCi0JICB7IDB4NTg4LAkibm9yIiwJCTMgfSwKLQkgIHsgMHg1ODksCSJ4bm9yIiwJCTMgfSwKLQkgIHsgMHg1OGEsCSJub3QiLAkJLTIgfSwKLQkgIHsgMHg1OGIsCSJvcm5vdCIsCTMgfSwKLQkgIHsgMHg1OGMsCSJjbHJiaXQiLAkzIH0sCi0JICB7IDB4NThkLAkibm90b3IiLAkzIH0sCi0JICB7IDB4NThlLAkibmFuZCIsCQkzIH0sCi0JICB7IDB4NThmLAkiYWx0ZXJiaXQiLAkzIH0sCi0JICB7IDB4NTkwLCAJImFkZG8iLAkJMyB9LAotCSAgeyAweDU5MSwgCSJhZGRpIiwJCTMgfSwKLQkgIHsgMHg1OTIsIAkic3VibyIsCQkzIH0sCi0JICB7IDB4NTkzLCAJInN1YmkiLAkJMyB9LAotCSAgeyAweDU5NCwJImNtcG9iIiwJMiB9LAotCSAgeyAweDU5NSwJImNtcGliIiwJMiB9LAotCSAgeyAweDU5NiwJImNtcG9zIiwJMiB9LAotCSAgeyAweDU5NywJImNtcGlzIiwJMiB9LAotCSAgeyAweDU5OCwgCSJzaHJvIiwJCTMgfSwKLQkgIHsgMHg1OWEsIAkic2hyZGkiLAkzIH0sCi0JICB7IDB4NTliLCAJInNocmkiLAkJMyB9LAotCSAgeyAweDU5YywgCSJzaGxvIiwJCTMgfSwKLQkgIHsgMHg1OWQsIAkicm90YXRlIiwJMyB9LAotCSAgeyAweDU5ZSwgCSJzaGxpIiwJCTMgfSwKLQkgIHsgMHg1YTAsIAkiY21wbyIsCQkyIH0sCi0JICB7IDB4NWExLCAJImNtcGkiLAkJMiB9LAotCSAgeyAweDVhMiwgCSJjb25jbXBvIiwJMiB9LAotCSAgeyAweDVhMywgCSJjb25jbXBpIiwJMiB9LAotCSAgeyAweDVhNCwgCSJjbXBpbmNvIiwJMyB9LAotCSAgeyAweDVhNSwgCSJjbXBpbmNpIiwJMyB9LAotCSAgeyAweDVhNiwgCSJjbXBkZWNvIiwJMyB9LAotCSAgeyAweDVhNywgCSJjbXBkZWNpIiwJMyB9LAotCSAgeyAweDVhYywgCSJzY2FuYnl0ZSIsCTIgfSwKLQkgIHsgMHg1YWQsCSJic3dhcCIsCS0yIH0sCi0JICB7IDB4NWFlLCAJImNoa2JpdCIsCTIgfSwKLQkgIHsgMHg1YjAsIAkiYWRkYyIsCQkzIH0sCi0JICB7IDB4NWIyLCAJInN1YmMiLAkJMyB9LAotCSAgeyAweDViNCwJImludGRpcyIsCTAgfSwKLQkgIHsgMHg1YjUsCSJpbnRlbiIsCTAgfSwKLQkgIHsgMHg1Y2MsCSJtb3YiLAkJLTIgfSwKLQkgIHsgMHg1ZDgsCSJlc2hybyIsCTMgfSwKLQkgIHsgMHg1ZGMsCSJtb3ZsIiwJCS0yIH0sCi0JICB7IDB4NWVjLAkibW92dCIsCQktMiB9LAotCSAgeyAweDVmYywJIm1vdnEiLAkJLTIgfSwKLQkgIHsgMHg2MDAsCSJzeW5tb3YiLAkyIH0sCi0JICB7IDB4NjAxLAkic3lubW92bCIsCTIgfSwKLQkgIHsgMHg2MDIsCSJzeW5tb3ZxIiwJMiB9LAotCSAgeyAweDYwMywJImNtcHN0ciIsCTMgfSwKLQkgIHsgMHg2MDQsCSJtb3Zxc3RyIiwJMyB9LAotCSAgeyAweDYwNSwJIm1vdnN0ciIsCTMgfSwKLQkgIHsgMHg2MTAsCSJhdG1vZCIsCTMgfSwKLQkgIHsgMHg2MTIsCSJhdGFkZCIsCTMgfSwKLQkgIHsgMHg2MTMsCSJpbnNwYWNjIiwJLTIgfSwKLQkgIHsgMHg2MTQsCSJsZHBoeSIsCS0yIH0sCi0JICB7IDB4NjE1LAkic3lubGQiLAktMiB9LAotCSAgeyAweDYxNywJImZpbGwiLAkJMyB9LAotCSAgeyAweDYzMCwJInNkbWEiLAkJMyB9LAotCSAgeyAweDYzMSwJInVkbWEiLAkJMCB9LAotCSAgeyAweDY0MCwJInNwYW5iaXQiLAktMiB9LAotCSAgeyAweDY0MSwJInNjYW5iaXQiLAktMiB9LAotCSAgeyAweDY0MiwJImRhZGRjIiwJMyB9LAotCSAgeyAweDY0MywJImRzdWJjIiwJMyB9LAotCSAgeyAweDY0NCwJImRtb3Z0IiwJLTIgfSwKLQkgIHsgMHg2NDUsCSJtb2RhYyIsCTMgfSwKLQkgIHsgMHg2NDYsCSJjb25kcmVjIiwJLTIgfSwKLQkgIHsgMHg2NTAsCSJtb2RpZnkiLAkzIH0sCi0JICB7IDB4NjUxLAkiZXh0cmFjdCIsCTMgfSwKLQkgIHsgMHg2NTQsCSJtb2R0YyIsCTMgfSwKLQkgIHsgMHg2NTUsCSJtb2RwYyIsCTMgfSwKLQkgIHsgMHg2NTYsCSJyZWNlaXZlIiwJLTIgfSwKLQkgIHsgMHg2NTgsCSJpbnRjdGwiLAktMiB9LAotCSAgeyAweDY1OSwJInN5c2N0bCIsCTMgfSwKLQkgIHsgMHg2NWIsCSJpY2N0bCIsCTMgfSwKLQkgIHsgMHg2NWMsCSJkY2N0bCIsCTMgfSwKLQkgIHsgMHg2NWQsCSJoYWx0IiwJCTAgfSwKLQkgIHsgMHg2NjAsCSJjYWxscyIsCTEgfSwKLQkgIHsgMHg2NjIsCSJzZW5kIiwJCTMgfSwKLQkgIHsgMHg2NjMsCSJzZW5kc2VydiIsCTEgfSwKLQkgIHsgMHg2NjQsCSJyZXN1bXByY3MiLAkxIH0sCi0JICB7IDB4NjY1LAkic2NoZWRwcmNzIiwJMSB9LAotCSAgeyAweDY2NiwJInNhdmVwcmNzIiwJMCB9LAotCSAgeyAweDY2OCwJImNvbmR3YWl0IiwJMSB9LAotCSAgeyAweDY2OSwJIndhaXQiLAkJMSB9LAotCSAgeyAweDY2YSwJInNpZ25hbCIsCTEgfSwKLQkgIHsgMHg2NmIsCSJtYXJrIiwJCTAgfSwKLQkgIHsgMHg2NmMsCSJmbWFyayIsCTAgfSwKLQkgIHsgMHg2NmQsCSJmbHVzaHJlZyIsCTAgfSwKLQkgIHsgMHg2NmYsCSJzeW5jZiIsCTAgfSwKLQkgIHsgMHg2NzAsCSJlbXVsIiwJCTMgfSwKLQkgIHsgMHg2NzEsCSJlZGl2IiwJCTMgfSwKLQkgIHsgMHg2NzMsIAkibGR0aW1lIiwJLTEgfSwKLQkgIHsgMHg2NzQsCSJGY3Z0aXIiLAktMiB9LAotCSAgeyAweDY3NSwJIkZjdnRpbHIiLAktMiB9LAotCSAgeyAweDY3NiwJIkZzY2FsZXJsIiwJMyB9LAotCSAgeyAweDY3NywJIkZzY2FsZXIiLAkzIH0sCi0JICB7IDB4NjgwLAkiRmF0YW5yIiwJMyB9LAotCSAgeyAweDY4MSwJIkZsb2dlcHIiLAkzIH0sCi0JICB7IDB4NjgyLAkiRmxvZ3IiLAkzIH0sCi0JICB7IDB4NjgzLAkiRnJlbXIiLAkzIH0sCi0JICB7IDB4Njg0LAkiRmNtcG9yIiwJMiB9LAotCSAgeyAweDY4NSwJIkZjbXByIiwJMiB9LAotCSAgeyAweDY4OCwJIkZzcXJ0ciIsCS0yIH0sCi0JICB7IDB4Njg5LAkiRmV4cHIiLAktMiB9LAotCSAgeyAweDY4YSwJIkZsb2dibnIiLAktMiB9LAotCSAgeyAweDY4YiwJIkZyb3VuZHIiLAktMiB9LAotCSAgeyAweDY4YywJIkZzaW5yIiwJLTIgfSwKLQkgIHsgMHg2OGQsCSJGY29zciIsCS0yIH0sCi0JICB7IDB4NjhlLAkiRnRhbnIiLAktMiB9LAotCSAgeyAweDY4ZiwJIkZjbGFzc3IiLAkxIH0sCi0JICB7IDB4NjkwLAkiRmF0YW5ybCIsCTMgfSwKLQkgIHsgMHg2OTEsCSJGbG9nZXBybCIsCTMgfSwKLQkgIHsgMHg2OTIsCSJGbG9ncmwiLAkzIH0sCi0JICB7IDB4NjkzLAkiRnJlbXJsIiwJMyB9LAotCSAgeyAweDY5NCwJIkZjbXBvcmwiLAkyIH0sCi0JICB7IDB4Njk1LAkiRmNtcHJsIiwJMiB9LAotCSAgeyAweDY5OCwJIkZzcXJ0cmwiLAktMiB9LAotCSAgeyAweDY5OSwJIkZleHBybCIsCS0yIH0sCi0JICB7IDB4NjlhLAkiRmxvZ2JucmwiLAktMiB9LAotCSAgeyAweDY5YiwJIkZyb3VuZHJsIiwJLTIgfSwKLQkgIHsgMHg2OWMsCSJGc2lucmwiLAktMiB9LAotCSAgeyAweDY5ZCwJIkZjb3NybCIsCS0yIH0sCi0JICB7IDB4NjllLAkiRnRhbnJsIiwJLTIgfSwKLQkgIHsgMHg2OWYsCSJGY2xhc3NybCIsCTEgfSwKLQkgIHsgMHg2YzAsCSJGY3Z0cmkiLAktMiB9LAotCSAgeyAweDZjMSwJIkZjdnRyaWwiLAktMiB9LAotCSAgeyAweDZjMiwJIkZjdnR6cmkiLAktMiB9LAotCSAgeyAweDZjMywJIkZjdnR6cmlsIiwJLTIgfSwKLQkgIHsgMHg2YzksCSJGbW92ciIsCS0yIH0sCi0JICB7IDB4NmQ5LAkiRm1vdnJsIiwJLTIgfSwKLQkgIHsgMHg2ZTEsIAkiRm1vdnJlIiwJLTIgfSwKLQkgIHsgMHg2ZTIsIAkiRmNweXNyZSIsCTMgfSwKLQkgIHsgMHg2ZTMsIAkiRmNweXJzcmUiLAkzIH0sCi0JICB7IDB4NzAxLAkibXVsbyIsCQkzIH0sCi0JICB7IDB4NzA4LAkicmVtbyIsCQkzIH0sCi0JICB7IDB4NzBiLAkiZGl2byIsCQkzIH0sCi0JICB7IDB4NzQxLAkibXVsaSIsCQkzIH0sCi0JICB7IDB4NzQ4LAkicmVtaSIsCQkzIH0sCi0JICB7IDB4NzQ5LAkibW9kaSIsCQkzIH0sCi0JICB7IDB4NzRiLAkiZGl2aSIsCQkzIH0sCi0JICB7IDB4NzgwLAkiYWRkb25vIiwJMyB9LAotCSAgeyAweDc4MSwJImFkZGlubyIsCTMgfSwKLQkgIHsgMHg3ODIsCSJzdWJvbm8iLAkzIH0sCi0JICB7IDB4NzgzLAkic3ViaW5vIiwJMyB9LAotCSAgeyAweDc4NCwJInNlbG5vIiwJMyB9LAotCSAgeyAweDc4YiwJIkZkaXZyIiwJMyB9LAotCSAgeyAweDc4YywJIkZtdWxyIiwJMyB9LAotCSAgeyAweDc4ZCwJIkZzdWJyIiwJMyB9LAotCSAgeyAweDc4ZiwJIkZhZGRyIiwJMyB9LAotCSAgeyAweDc5MCwJImFkZG9nIiwJMyB9LAotCSAgeyAweDc5MSwJImFkZGlnIiwgICAgICAgIDMgfSwKLQkgIHsgMHg3OTIsCSJzdWJvZyIsCTMgfSwKLQkgIHsgMHg3OTMsCSJzdWJpZyIsCTMgfSwKLQkgIHsgMHg3OTQsCSJzZWxnIiwJCTMgfSwKLQkgIHsgMHg3OWIsCSJGZGl2cmwiLAkzIH0sCi0JICB7IDB4NzljLAkiRm11bHJsIiwJMyB9LAotCSAgeyAweDc5ZCwJIkZzdWJybCIsCTMgfSwKLQkgIHsgMHg3OWYsCSJGYWRkcmwiLAkzIH0sCi0JICB7IDB4N2EwLAkiYWRkb2UiLAkzIH0sCi0JICB7IDB4N2ExLAkiYWRkaWUiLCAgICAgICAgMyB9LAotCSAgeyAweDdhMiwJInN1Ym9lIiwJMyB9LAotCSAgeyAweDdhMywJInN1YmllIiwJMyB9LAotCSAgeyAweDdhNCwJInNlbGUiLAkJMyB9LAotCSAgeyAweDdiMCwJImFkZG9nZSIsCTMgfSwKLQkgIHsgMHg3YjEsCSJhZGRpZ2UiLAkzIH0sCi0JICB7IDB4N2IyLAkic3Vib2dlIiwJMyB9LAotCSAgeyAweDdiMywJInN1YmlnZSIsCTMgfSwKLQkgIHsgMHg3YjQsCSJzZWxnZSIsCTMgfSwKLQkgIHsgMHg3YzAsCSJhZGRvbCIsCTMgfSwKLQkgIHsgMHg3YzEsCSJhZGRpbCIsCTMgfSwKLQkgIHsgMHg3YzIsCSJzdWJvbCIsCTMgfSwKLQkgIHsgMHg3YzMsCSJzdWJpbCIsCTMgfSwKLQkgIHsgMHg3YzQsCSJzZWxsIiwJCTMgfSwKLQkgIHsgMHg3ZDAsCSJhZGRvbmUiLAkzIH0sCi0JICB7IDB4N2QxLAkiYWRkaW5lIiwJMyB9LAotCSAgeyAweDdkMiwJInN1Ym9uZSIsCTMgfSwKLQkgIHsgMHg3ZDMsCSJzdWJpbmUiLAkzIH0sCi0JICB7IDB4N2Q0LAkic2VsbmUiLAkzIH0sCi0JICB7IDB4N2UwLAkiYWRkb2xlIiwJMyB9LAotCSAgeyAweDdlMSwJImFkZGlsZSIsCTMgfSwKLQkgIHsgMHg3ZTIsCSJzdWJvbGUiLAkzIH0sCi0JICB7IDB4N2UzLAkic3ViaWxlIiwJMyB9LAotCSAgeyAweDdlNCwJInNlbGxlIiwJMyB9LAotCSAgeyAweDdmMCwJImFkZG9vIiwJMyB9LAotCSAgeyAweDdmMSwJImFkZGlvIiwJMyB9LAotCSAgeyAweDdmMiwJInN1Ym9vIiwJMyB9LAotCSAgeyAweDdmMywJInN1YmlvIiwJMyB9LAotCSAgeyAweDdmNCwJInNlbG8iLAkJMyB9LAotI2RlZmluZSBSRUdfTUFYIDB4N2Y0Ci0JICB7IDAsCQlOVUxMLAkJMCB9Ci0JfTsKLQlzdGF0aWMgc3RydWN0IHRhYmVudCByZWdfdGFiX2J1ZltSRUdfTUFYIC0gUkVHX01JTiArIDFdOwotCi0JaWYgKCByZWdfdGFiID09IE5VTEwgKXsKLQkJcmVnX3RhYiA9IHJlZ190YWJfYnVmOwotCQlmb3IgKCBpID0gMDsgcmVnX2luaXRbaV0ub3Bjb2RlICE9IDA7IGkrKyApewotCQkJaiA9IHJlZ19pbml0W2ldLm9wY29kZSAtIFJFR19NSU47Ci0JCQlyZWdfdGFiW2pdLm5hbWUgPSByZWdfaW5pdFtpXS5uYW1lOwotCQkJcmVnX3RhYltqXS5udW1vcHMgPSByZWdfaW5pdFtpXS5udW1vcHM7Ci0JCX0KLQl9Ci0KLQlvcGNvZGUgPSAoKHdvcmQxID4+IDIwKSAmIDB4ZmYwKSB8ICgod29yZDEgPj4gNykgJiAweGYpOwotCWkgPSBvcGNvZGUgLSBSRUdfTUlOOwotCi0JaWYgKCAob3Bjb2RlPFJFR19NSU4pIHx8IChvcGNvZGU+UkVHX01BWCkgfHwgKHJlZ190YWJbaV0ubmFtZT09TlVMTCkgKXsKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJcmV0dXJuOwotCX0KLQotCW1uZW1wID0gcmVnX3RhYltpXS5uYW1lOwotCWlmICggKm1uZW1wID09ICdGJyApewotCQlmcCA9IDE7Ci0JCW1uZW1wKys7Ci0JfSBlbHNlIHsKLQkJZnAgPSAwOwotCX0KLQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCBtbmVtcCApOwotCi0JczEgICA9ICh3b3JkMSA+PiA1KSAgJiAxOwotCXMyICAgPSAod29yZDEgPj4gNikgICYgMTsKLQltMSAgID0gKHdvcmQxID4+IDExKSAmIDE7Ci0JbTIgICA9ICh3b3JkMSA+PiAxMikgJiAxOwotCW0zICAgPSAod29yZDEgPj4gMTMpICYgMTsKLQlzcmMgID0gIHdvcmQxICAgICAgICAmIDB4MWY7Ci0Jc3JjMiA9ICh3b3JkMSA+PiAxNCkgJiAweDFmOwotCWRzdCAgPSAod29yZDEgPj4gMTkpICYgMHgxZjsKLQotCWlmICAoIHJlZ190YWJbaV0ubnVtb3BzICE9IDAgKXsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJcdCIgKTsKLQotCQlzd2l0Y2ggKCByZWdfdGFiW2ldLm51bW9wcyApewotCQljYXNlIDE6Ci0JCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7Ci0JCQlicmVhazsKLQkJY2FzZSAtMToKLQkJCWRzdG9wKCBtMywgZHN0LCBmcCApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCXJlZ29wKCBtMSwgczEsIHNyYywgZnAgKTsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLCIgKTsKLQkJCXJlZ29wKCBtMiwgczIsIHNyYzIsIGZwICk7Ci0JCQlicmVhazsKLQkJY2FzZSAtMjoKLQkJCXJlZ29wKCBtMSwgczEsIHNyYywgZnAgKTsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLCIgKTsKLQkJCWRzdG9wKCBtMywgZHN0LCBmcCApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCXJlZ29wKCBtMSwgczEsIHNyYywgZnAgKTsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLCIgKTsKLQkJCXJlZ29wKCBtMiwgczIsIHNyYzIsIGZwICk7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7Ci0JCQlkc3RvcCggbTMsIGRzdCwgZnAgKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi0KLS8qCi0gKiBQcmludCBvdXQgZWZmZWN0aXZlIGFkZHJlc3MgZm9yIG1lbWIgaW5zdHJ1Y3Rpb25zLgotICovCi1zdGF0aWMgdm9pZAotZWEoIG1lbWFkZHIsIG1vZGUsIHJlZzIsIHJlZzMsIHdvcmQxLCB3b3JkMiApCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgaW50IG1vZGU7Ci0gICAgIGNoYXIgKnJlZzIsICpyZWczOwotICAgICBpbnQgd29yZDE7Ci0gICAgIHVuc2lnbmVkIGludCB3b3JkMjsKLXsKLQlpbnQgc2NhbGU7Ci0Jc3RhdGljIGNvbnN0IGludCBzY2FsZV90YWJbXSA9IHsgMSwgMiwgNCwgOCwgMTYgfTsKLQotCXNjYWxlID0gKHdvcmQxID4+IDcpICYgMHgwNzsKLQlpZiAoIChzY2FsZSA+IDQpIHx8ICgoKHdvcmQxID4+IDUpICYgMHgwMykgIT0gMCkgKXsKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJcmV0dXJuOwotCX0KLQlzY2FsZSA9IHNjYWxlX3RhYltzY2FsZV07Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIDQ6CSAJCQkJCS8qIChyZWcpICovCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKSIsIHJlZzIgKTsKLQkJYnJlYWs7Ci0JY2FzZSA1OgkJCQkJCS8qIGRpc3BsKzgoaXApICovCi0JCXByaW50X2FkZHIoIHdvcmQyKzgrbWVtYWRkciApOwotCQlicmVhazsKLQljYXNlIDc6CQkJCQkJLyogKHJlZylbaW5kZXgqc2NhbGVdICovCi0JCWlmIChzY2FsZSA9PSAxKSB7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcylbJXNdIiwgcmVnMiwgcmVnMyApOwotCQl9IGVsc2UgewotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpWyVzKiVkXSIscmVnMixyZWczLHNjYWxlKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDEyOgkJCQkJLyogZGlzcGxhY2VtZW50ICovCi0JCXByaW50X2FkZHIoIChiZmRfdm1hKXdvcmQyICk7Ci0JCWJyZWFrOwotCWNhc2UgMTM6CQkJCQkvKiBkaXNwbChyZWcpICovCi0JCXByaW50X2FkZHIoIChiZmRfdm1hKXdvcmQyICk7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKSIsIHJlZzIgKTsKLQkJYnJlYWs7Ci0JY2FzZSAxNDoJCQkJCS8qIGRpc3BsW2luZGV4KnNjYWxlXSAqLwotCQlwcmludF9hZGRyKCAoYmZkX3ZtYSl3b3JkMiApOwotCQlpZiAoc2NhbGUgPT0gMSkgewotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJbJXNdIiwgcmVnMyApOwotCQl9IGVsc2UgewotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJbJXMqJWRdIiwgcmVnMywgc2NhbGUgKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDE1OgkJCQkvKiBkaXNwbChyZWcpW2luZGV4KnNjYWxlXSAqLwotCQlwcmludF9hZGRyKCAoYmZkX3ZtYSl3b3JkMiApOwotCQlpZiAoc2NhbGUgPT0gMSkgewotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpWyVzXSIsIHJlZzIsIHJlZzMgKTsKLQkJfSBlbHNlIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKVslcyolZF0iLHJlZzIscmVnMyxzY2FsZSApOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFJlZ2lzdGVyIEluc3RydWN0aW9uIE9wZXJhbmQgIAkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotcmVnb3AoIG1vZGUsIHNwZWMsIHJlZywgZnAgKQotICAgIGludCBtb2RlLCBzcGVjLCByZWcsIGZwOwotewotCWlmICggZnAgKXsJCQkJLyogRkxPQVRJTkcgUE9JTlQgSU5TVFJVQ1RJT04gKi8KLQkJaWYgKCBtb2RlID09IDEgKXsJCQkvKiBGUCBvcGVyYW5kICovCi0JCQlzd2l0Y2ggKCByZWcgKXsKLQkJCWNhc2UgMDogICgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiZnAwIiApOwotCQkJICBicmVhazsKLQkJCWNhc2UgMTogICgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiZnAxIiApOwotCQkJICBicmVhazsKLQkJCWNhc2UgMjogICgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiZnAyIiApOwotCQkJICBicmVhazsKLQkJCWNhc2UgMzogICgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiZnAzIiApOwotCQkJICBicmVhazsKLQkJCWNhc2UgMTY6ICgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiMGYwLjAiICk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAyMjogKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIwZjEuMCIgKTsKLQkJCSAgYnJlYWs7Ci0JCQlkZWZhdWx0OiAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIj8iICk7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQl9IGVsc2UgewkJCQkvKiBOb24tRlAgcmVnaXN0ZXIgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCByZWdfbmFtZXNbcmVnXSApOwotCQl9Ci0JfSBlbHNlIHsJCQkJLyogTk9UIEZMT0FUSU5HIFBPSU5UICovCi0JCWlmICggbW9kZSA9PSAxICl7CQkJLyogTGl0ZXJhbCAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlZCIsIHJlZyApOwotCQl9IGVsc2UgewkJCQkvKiBSZWdpc3RlciAqLwotCQkJaWYgKCBzcGVjID09IDAgKXsKLQkJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgcmVnX25hbWVzW3JlZ10gKTsKLQkJCX0gZWxzZSB7Ci0JCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJzZiVkIiwgcmVnICk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBSZWdpc3RlciBJbnN0cnVjdGlvbiBEZXN0aW5hdGlvbiBPcGVyYW5kCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWRzdG9wKCBtb2RlLCByZWcsIGZwICkKLSAgICBpbnQgbW9kZSwgcmVnLCBmcDsKLXsKLQkvKiAnZHN0JyBvcGVyYW5kIGNhbid0IGJlIGEgbGl0ZXJhbC4gT24gbm9uLUZQIGluc3RydWN0aW9ucywgIHJlZ2lzdGVyCi0JICogbW9kZSBpcyBhc3N1bWVkIGFuZCAibTMiIGFjdHMgYXMgaWYgd2VyZSAiczMiOyAgb24gRlAtaW5zdHJ1Y3Rpb25zLAotCSAqIHNmIHJlZ2lzdGVycyBhcmUgbm90IGFsbG93ZWQgc28gbTMgYWN0cyBub3JtYWxseS4KLQkgKi8KLQkgaWYgKCBmcCApewotCQlyZWdvcCggbW9kZSwgMCwgcmVnLCBmcCApOwotCSB9IGVsc2UgewotCQlyZWdvcCggMCwgbW9kZSwgcmVnLCBmcCApOwotCSB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWludmFsaWQoIHdvcmQxICkKLSAgICBpbnQgd29yZDE7Ci17Ci0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIud29yZFx0MHglMDh4IiwgKHVuc2lnbmVkKSB3b3JkMSApOwotfQkKLQotc3RhdGljIHZvaWQKLXByaW50X2FkZHIoYSkKLWJmZF92bWEgYTsKLXsKLSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhLCBpbmZvKTsKLX0KLQotc3RhdGljIHZvaWQKLXB1dF9hYnMoIHdvcmQxLCB3b3JkMiApCi0gICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7Ci17Ci0jaWZkZWYgSU5fR0RCCi0JcmV0dXJuOwotI2Vsc2UKLQlpbnQgbGVuOwotCi0Jc3dpdGNoICggKHdvcmQxID4+IDI4KSAmIDB4ZiApewotCWNhc2UgMHg4OgotCWNhc2UgMHg5OgotCWNhc2UgMHhhOgotCWNhc2UgMHhiOgotCWNhc2UgMHhjOgotCQkvKiBNRU0gZm9ybWF0IGluc3RydWN0aW9uICovCi0JCWxlbiA9IG1lbSggMCwgd29yZDEsIHdvcmQyLCAxICk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWxlbiA9IDQ7Ci0JCWJyZWFrOwotCX0KLQotCWlmICggbGVuID09IDggKXsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlMDh4ICUwOHhcdCIsIHdvcmQxLCB3b3JkMiApOwotCX0gZWxzZSB7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJTA4eCAgICAgICAgIFx0Iiwgd29yZDEgKTsKLQl9Ci07Ci0KLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMTAyMDAtZGlzLmMgYi9vcGNvZGVzL20xMDIwMC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYzdlMy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20xMDIwMC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBNTjEwMjAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL21uMTAyMDAuaCIgCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi1zdGF0aWMgdm9pZCBkaXNhc3NlbWJsZSBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLAotCQkJCSB1bnNpZ25lZCBsb25nIGluc24sIHVuc2lnbmVkIGxvbmcsCi0JCQkJIHVuc2lnbmVkIGludCkpOwotCi1pbnQgCi1wcmludF9pbnNuX21uMTAyMDAgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBzdGF0dXM7Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICB1bnNpZ25lZCBsb25nIGV4dGVuc2lvbiA9IDA7Ci0gIHVuc2lnbmVkIGludCBjb25zdW1lOwotCi0gIC8qIEZpcnN0IGZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgb3Bjb2RlIGlzLiAgKi8KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpbnNuID0gKih1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcjsKLQotICAvKiBUaGVzZSBhcmUgb25lIGJ5dGUgaW5zbnMuICAqLwotICBpZiAoKGluc24gJiAweGYwKSA9PSAweDAwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4MTAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHgyMAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDMwCi0gICAgICB8fCAoKGluc24gJiAweGYwKSA9PSAweDgwCi0JICAmJiAoaW5zbiAmIDB4MGMpID4+IDIgIT0gKGluc24gJiAweDAzKSkKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg5MAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweGEwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YjAKLSAgICAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhlYgotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY2Ci0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmUKLSAgICAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmZikKLSAgICB7Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgY29uc3VtZSA9IDE7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSB0d28gYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmMCkgPT0gMHg0MAotCSAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg1MAotCSAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg2MAotCSAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg3MAotCSAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg4MAotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkMAotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkNAotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkOAotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhlMAotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhlNAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhlOAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhlOQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhlYQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMgotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGNvbnN1bWUgPSAyOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgdGhyZWUgYnl0ZSBpbnNucyB3aXRoIGEgMTZiaXQgb3BlcmFuZCBpbiBsaXR0bGUKLSAgICAgZW5kaWFuIGZvcm0uICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZjApID09IDB4YzAKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZGMKLQkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZWMKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjgKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjkKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmEKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmIKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmMKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmQpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA8PD0gMTY7Ci0gICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgY29uc3VtZSA9IDM7Ci0gICAgfQotICAvKiBUaGVzZSBhcmUgdGhyZWUgYnl0ZSBpbnNucyB0b28sIGJ1dCB3ZSBkb24ndCBoYXZlIHRvIG1lc3Mgd2l0aAotICAgICBlbmRpYW5uZXNzIHN0dWZmLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGY1KQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPDw9IDE2OwotICAgICAgaW5zbiB8PSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGNvbnN1bWUgPSAzOwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgZm91ciBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGY3KQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBpbnNuIDw8PSAxNjsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gfD0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBjb25zdW1lID0gNDsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIGZpdmUgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmNCkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICAgICAgaW5zbiA8PD0gMTY7Ci0KLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA0LCBidWZmZXIsIDEsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gfD0gKCoodW5zaWduZWQgY2hhciAqKWJ1ZmZlciA8PCA4KSAmIDB4ZmYwMDsKLQotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDMsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiB8PSAoKih1bnNpZ25lZCBjaGFyICopYnVmZmVyKSAmIDB4ZmY7Ci0KLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAyLCBidWZmZXIsIDEsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGV4dGVuc2lvbiA9ICgqKHVuc2lnbmVkIGNoYXIgKilidWZmZXIpICYgMHhmZjsKLSAgICAgIGNvbnN1bWUgPSA1OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCJ1bmtub3duXHQweCUwMngiKSwgaW5zbik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24sIGV4dGVuc2lvbiwgY29uc3VtZSk7Ci0KLSAgcmV0dXJuIGNvbnN1bWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgZXh0ZW5zaW9uLCBzaXplKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgZXh0ZW5zaW9uOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IG1uMTAyMDBfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKiltbjEwMjAwX29wY29kZXM7Ci0gIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gIGludCBtYXRjaCA9IDA7Ci0KLSAgLyogRmluZCB0aGUgb3Bjb2RlLiAgKi8KLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGludCBteXNpemUsIGV4dHJhX3NoaWZ0OwotCi0gICAgICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMSkKLQlteXNpemUgPSAxOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMgotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF80KQotCW15c2l6ZSA9IDI7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF8zCi0JICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UXzUpCi0JbXlzaXplID0gMzsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzYpCi0JbXlzaXplID0gNDsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzcpCi0JbXlzaXplID0gNTsKLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQkKLSAgICAgIGlmIChvcC0+Zm9ybWF0ID09IEZNVF8yIHx8IG9wLT5mb3JtYXQgPT0gRk1UXzUpCi0JZXh0cmFfc2hpZnQgPSA4OwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMwotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF82Ci0JICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UXzcpCi0JZXh0cmFfc2hpZnQgPSAxNjsKLSAgICAgIGVsc2UKLQlleHRyYV9zaGlmdCA9IDA7Ci0KLSAgICAgIGlmICgob3AtPm1hc2sgJiBpbnNuKSA9PSBvcC0+b3Bjb2RlCi0JICAmJiBzaXplID09ICh1bnNpZ25lZCBpbnQpIG15c2l6ZSkKLQl7Ci0JICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4X3B0cjsKLQkgIHVuc2lnbmVkIGludCBub2NvbW1hOwotCSAgaW50IHBhcmVuID0gMDsKLQkgIAotCSAgbWF0Y2ggPSAxOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0Iiwgb3AtPm5hbWUpOwotCi0JICAvKiBOb3cgcHJpbnQgdGhlIG9wZXJhbmRzLiAgKi8KLQkgIGZvciAob3BpbmRleF9wdHIgPSBvcC0+b3BlcmFuZHMsIG5vY29tbWEgPSAxOwotCSAgICAgICAqb3BpbmRleF9wdHIgIT0gMDsKLQkgICAgICAgb3BpbmRleF9wdHIrKykKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLQkgICAgICBvcGVyYW5kID0gJm1uMTAyMDBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfRVhURU5ERUQpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9IChpbnNuICYgMHhmZmZmKSA8PCA4OwotCQkgIHZhbHVlIHw9IGV4dGVuc2lvbjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCkpCi0JCQkgICAmICgoMUwgPDwgb3BlcmFuZC0+Yml0cykgLSAxTCkpOwotCQl9Ci0KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCkgIT0gMCkKLQkJdmFsdWUgPSAoKGxvbmcpKHZhbHVlIDw8ICgzMiAtIG9wZXJhbmQtPmJpdHMpKQotCQkJICA+PiAoMzIgLSBvcGVyYW5kLT5iaXRzKSk7Ci0KLQkgICAgICBpZiAoIW5vY29tbWEKLQkJICAmJiAoIXBhcmVuCi0JCSAgICAgIHx8ICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUEFSRU4pID09IDApKSkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0KLQkgICAgICBub2NvbW1hID0gMDsKLQkJCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9EUkVHKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0ICsgZXh0cmFfc2hpZnQpKQotCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkJWQiLCB2YWx1ZSk7Ci0JCX0KLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9BUkVHKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0ICsgZXh0cmFfc2hpZnQpKQotCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhJWQiLCB2YWx1ZSk7Ci0JCX0KLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QU1cpICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAicHN3Iik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfTURSKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIm1kciIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BBUkVOKSAhPSAwKQotCQl7Ci0JCSAgaWYgKHBhcmVuKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIigiKTsKLQkJICAgICAgbm9jb21tYSA9IDE7Ci0JCSAgICB9Ci0JCSAgcGFyZW4gPSAhcGFyZW47Ci0JCX0KLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QQ1JFTCkgIT0gMCkKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgodmFsdWUgKyBtZW1hZGRyICsgbXlzaXplKSAmIDB4ZmZmZmZmLCBpbmZvKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9NRU1BRERSKSAhPSAwKQotCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKLQotCSAgICAgIGVsc2UgCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotCSAgICB9Ci0JICAvKiBBbGwgZG9uZS4gKi8KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9wKys7Ci0gICAgfQotCi0gIGlmICghbWF0Y2gpCi0gICAgewotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCJ1bmtub3duXHQweCUwNGx4IiksIGluc24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTEwMjAwLW9wYy5jIGIvb3Bjb2Rlcy9tMTAyMDAtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNzBiOTAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMTAyMDAtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyogQXNzZW1ibGUgTWF0c3VzaGl0YSBNTjEwMjAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL21uMTAyMDAuaCIKLQotDAotY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCBtbjEwMjAwX29wZXJhbmRzW10gPSB7Ci0jZGVmaW5lIFVOVVNFRAkwCi0gIHswLCAwLCAwfSwgCi0KLS8qIGRuIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE4wICAgICAgKFVOVVNFRCsxKQotICB7MiwgMCwgTU4xMDIwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETjEgICAgICAoRE4wKzEpCi0gIHsyLCAyLCBNTjEwMjAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRtIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE0wICAgICAgKEROMSsxKQotICB7MiwgMCwgTU4xMDIwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbSByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETTEgICAgICAoRE0wKzEpCi0gIHsyLCAyLCBNTjEwMjAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU4wICAgICAgKERNMSsxKQotICB7MiwgMCwgTU4xMDIwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbiByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTjEgICAgICAoQU4wKzEpCi0gIHsyLCAyLCBNTjEwMjAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFtIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU0wICAgICAgKEFOMSsxKQotICB7MiwgMCwgTU4xMDIwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTTEgICAgICAoQU0wKzEpCi0gIHsyLCAyLCBNTjEwMjAwX09QRVJBTkRfQVJFR30sCi0KLS8qIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byBhIDE2Yml0Ci0gICB1bnNpZ25lZCBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBJTU04ICAgIChBTTErMSkKLSAgezgsIDAsIE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byBhIDMyYml0Ci0gICB1bnNpZ25lZCBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBJTU0xNiAgICAoSU1NOCsxKQotICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHBjLXJlbGF0aXZlIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byBhIDE2Yml0Ci0gICBwYy1yZWxhdGl2ZSBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBJTU0xNl9QQ1JFTCAgICAoSU1NMTYrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfUENSRUwgfCBNTjEwMjAwX09QRVJBTkRfUkVMQVggfCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEfSwKLQotLyogMTZiaXQgdW5zaWduZWQgZGlzcGFjZW1lbnQgaW4gYSBtZW1vcnkgb3BlcmF0aW9uIHdoaWNoCi0gICBtYXkgcHJvbW90ZSB0byBhIDMyYml0IGRpc3BsYWNlbWVudC4gICovCi0jZGVmaW5lIElNTTE2X01FTSAgICAoSU1NMTZfUENSRUwrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAyMDBfT1BFUkFORF9NRU1BRERSfSwKLQotLyogMjQgaW1tZWRpYXRlLCBsb3cgMTYgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbgotICAgd29yZCwgOCBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQuICAqLwotCi0jZGVmaW5lIElNTTI0ICAgIChJTU0xNl9NRU0rMSkKLSAgezI0LCAwLCBNTjEwMjAwX09QRVJBTkRfRVhURU5ERUR9LAotCi0vKiAzMmJpdCBwYy1yZWxhdGl2ZSBvZmZzZXQuICAqLwotI2RlZmluZSBJTU0yNF9QQ1JFTCAgICAoSU1NMjQrMSkKLSAgezI0LCAwLCBNTjEwMjAwX09QRVJBTkRfRVhURU5ERUQgfCBNTjEwMjAwX09QRVJBTkRfUENSRUwgfCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEfSwKLQotLyogMzJiaXQgbWVtb3J5IG9mZnNldC4gICovCi0jZGVmaW5lIElNTTI0X01FTSAgICAoSU1NMjRfUENSRUwrMSkKLSAgezI0LCAwLCBNTjEwMjAwX09QRVJBTkRfRVhURU5ERUQgfCBNTjEwMjAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIFByb2Nlc3NvciBzdGF0dXMgd29yZC4gICovCi0jZGVmaW5lIFBTVyAgICAoSU1NMjRfTUVNKzEpCi0gIHswLCAwLCBNTjEwMjAwX09QRVJBTkRfUFNXfSwKLQotLyogTURSIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTURSICAgIChQU1crMSkKLSAgezAsIDAsIE1OMTAyMDBfT1BFUkFORF9NRFJ9LAotCi0vKiBJbmRleCByZWdpc3Rlci4gICovCi0jZGVmaW5lIERJIChNRFIrMSkKLSAgezIsIDQsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKLQotLyogOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCwgbWF5IHByb21vdGUgdG8gMTZiaXQgc2lnbmVkIGRpc3BhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0Q4ICAgIChESSsxKQotICB7OCwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQsIG1heSBwcm9tb3RlIHRvIDMyYml0IGRpc3BhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0QxNiAgICAoU0Q4KzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogOCBiaXQgcGMtcmVsYXRpdmUgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0Q4Tl9QQ1JFTCAgICAoU0QxNisxKQotICB7OCwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAyMDBfT1BFUkFORF9SRUxBWH0sCi0KLS8qIDggYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gMTZiaXQgc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIFNJTU04ICAgIChTRDhOX1BDUkVMKzEpCi0gIHs4LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byAzMmJpdCAgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgU0lNTTE2ICAgIChTSU1NOCsxKQotICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBub3QgcHJvbW90ZS4gICovCi0jZGVmaW5lIFNJTU0xNk4gICAgKFNJTU0xNisxKQotICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfTk9DSEVDS30sCi0KLS8qIEVpdGhlciBhbiBvcGVuIHBhcmVuIG9yIGNsb3NlIHBhcmVuLiAgKi8KLSNkZWZpbmUgUEFSRU4JKFNJTU0xNk4rMSkKLSAgezAsIDAsIE1OMTAyMDBfT1BFUkFORF9QQVJFTn0sIAotCi0vKiBkbiByZWdpc3RlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcmVnaXN0ZXIgcG9zaXRpb25zLiAgKi8KLSNkZWZpbmUgRE4wMSAgICAgKFBBUkVOKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfRFJFRyB8IE1OMTAyMDBfT1BFUkFORF9SRVBFQVRFRH0sCi0KLS8qIGFuIHJlZ2lzdGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgZmlyc3QgYW5kIHNlY29uZCByZWdpc3RlciBwb3NpdGlvbnMuICAqLwotI2RlZmluZSBBTjAxICAgICAoRE4wMSsxKQotICB7MiwgMCwgTU4xMDIwMF9PUEVSQU5EX0FSRUcgfCBNTjEwMjAwX09QRVJBTkRfUkVQRUFURUR9LAotfSA7IAotCi0jZGVmaW5lIE1FTShBRERSKSBQQVJFTiwgQUREUiwgUEFSRU4gCi0jZGVmaW5lIE1FTTIoQUREUjEsQUREUjIpIFBBUkVOLCBBRERSMSwgQUREUjIsIFBBUkVOIAotDAotLyogVGhlIG9wY29kZSB0YWJsZS4KLQotICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgotCi0gICBOQU1FCQlPUENPREUJCU1BU0sJCXsgT1BFUkFORFMgfQotCi0gICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QQ09ERSBpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgotICAgTUFTSyBpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKLSAgICAgd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLSAgIE9QRVJBTkRTIGlzIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotCi0gICBUaGUgZGlzYXNzZW1ibGVyIHJlYWRzIHRoZSB0YWJsZSBpbiBvcmRlciBhbmQgcHJpbnRzIHRoZSBmaXJzdAotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF0Y2hlcywgc28gdGhpcyB0YWJsZSBpcyBzb3J0ZWQgdG8gcHV0IG1vcmUKLSAgIHNwZWNpZmljIGluc3RydWN0aW9ucyBiZWZvcmUgbW9yZSBnZW5lcmFsIGluc3RydWN0aW9ucy4gIEl0IGlzIGFsc28KLSAgIHNvcnRlZCBieSBtYWpvciBvcGNvZGUuICAqLwotCi1jb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgbW4xMDIwMF9vcGNvZGVzW10gPSB7Ci17ICJtb3YiLAkweDgwMDAsCQkweGYwMDAsCQlGTVRfMiwge1NJTU04LCBETjAxfX0sCi17ICJtb3YiLAkweDgwLAkJMHhmMCwJCUZNVF8xLCB7RE4xLCBETTB9fSwKLXsgIm1vdiIsCTB4ZjIzMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE0xLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjJmMCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBETTB9fSwKLXsgIm1vdiIsCTB4ZjI3MCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBBTTB9fSwKLXsgIm1vdiIsCTB4ZjNmMCwJCTB4ZmZmYywJCUZNVF80LCB7UFNXLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjNkMCwJCTB4ZmZmMywJCUZNVF80LCB7RE4xLCBQU1d9fSwKLXsgIm1vdiIsCTB4ZjNlMCwJCTB4ZmZmYywJCUZNVF80LCB7TURSLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjNjMCwJCTB4ZmZmMywJCUZNVF80LCB7RE4xLCBNRFJ9fSwKLXsgIm1vdiIsCTB4MjAsCQkweGYwLAkJRk1UXzEsIHtNRU0oQU4xKSwgRE0wfX0sCi17ICJtb3YiLAkweDYwMDAsCQkweGYwMDAsCQlGTVRfMiwge01FTTIoU0Q4LCBBTjEpLCBETTB9fSwKLXsgIm1vdiIsCTB4ZjdjMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBETTB9fSwKLXsgIm1vdiIsCTB4ZjQ4MDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7TUVNMihJTU0yNCxBTjEpLCBETTB9fSwKLXsgIm1vdiIsCTB4ZjE0MCwJCTB4ZmZjMCwJCUZNVF80LCB7TUVNMihESSwgQU4xKSwgRE0wfX0sCi17ICJtb3YiLAkweGM4MDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7TUVNKElNTTE2X01FTSksIEROMH19LAoteyAibW92IiwJMHhmNGMwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtNRU0oSU1NMjRfTUVNKSwgRE4wfX0sCi17ICJtb3YiLAkweDcwMDAsCQkweGYwMDAsCQlGTVRfMiwge01FTTIoU0Q4LEFOMSksIEFNMH19LAoteyAibW92IiwJMHg3MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtNRU0oQU4xKSwgQU0wfX0sCi17ICJtb3YiLAkweGY3YjAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge01FTTIoU0QxNiwgQU4xKSwgQU0wfX0sCi17ICJtb3YiLAkweGY0ZjAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgQU0wfX0sCi17ICJtb3YiLAkweGYxMDAsCQkweGZmYzAsCQlGTVRfNCwge01FTTIoREksIEFOMSksIEFNMH19LAoteyAibW92IiwJMHhmNzMwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtNRU0oSU1NMTZfTUVNKSwgQU4wfX0sCi17ICJtb3YiLAkweGY0ZDAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge01FTShJTU0yNF9NRU0pLCBBTjB9fSwKLXsgIm1vdiIsCTB4MDAsCQkweGYwLAkJRk1UXzEsIHtETTAsIE1FTShBTjEpfX0sCi17ICJtb3YiLAkweDQwMDAsCQkweGYwMDAsCQlGTVRfMiwge0RNMCwgTUVNMihTRDgsIEFOMSl9fSwKLXsgIm1vdiIsCTB4Zjc4MDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7RE0wLCBNRU0yKFNEMTYsIEFOMSl9fSwKLXsgIm1vdiIsCTB4ZjQwMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7RE0wLCBNRU0yKElNTTI0LCBBTjEpfX0sCi17ICJtb3YiLAkweGYxYzAsCQkweGZmYzAsCQlGTVRfNCwge0RNMCwgTUVNMihESSwgQU4xKX19LAoteyAibW92IiwJMHhjMDAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge0ROMCwgTUVNKElNTTE2X01FTSl9fSwKLXsgIm1vdiIsCTB4ZjQ0MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7RE4wLCBNRU0oSU1NMjRfTUVNKX19LAoteyAibW92IiwJMHg1MDAwLAkJMHhmMDAwLAkJRk1UXzIsIHtBTTAsIE1FTTIoU0Q4LCBBTjEpfX0sCi17ICJtb3YiLAkweDUwMDAsCQkweGYwMDAsCQlGTVRfMiwge0FNMCwgTUVNKEFOMSl9fSwKLXsgIm1vdiIsCTB4ZjdhMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7QU0wLCBNRU0yKFNEMTYsIEFOMSl9fSwKLXsgIm1vdiIsCTB4ZjQxMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7QU0wLCBNRU0yKElNTTI0LEFOMSl9fSwKLXsgIm1vdiIsCTB4ZjE4MCwJCTB4ZmZjMCwJCUZNVF80LCB7QU0wLCBNRU0yKERJLCBBTjEpfX0sCi17ICJtb3YiLAkweGY3MjAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge0FOMCwgTUVNKElNTTE2X01FTSl9fSwKLXsgIm1vdiIsCTB4ZjQ1MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7QU4wLCBNRU0oSU1NMjRfTUVNKX19LAoteyAibW92IiwJMHhmODAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge1NJTU0xNiwgRE4wfX0sCi17ICJtb3YiLAkweGY0NzAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBETjB9fSwKLXsgIm1vdiIsCTB4ZGMwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtJTU0xNiwgQU4wfX0sCi17ICJtb3YiLAkweGY0NzQwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBBTjB9fSwKLQoteyAibW92eCIsCTB4ZjU3MDAwLAkweGZmZjAwMCwJRk1UXzUsIHtNRU0yKFNEOCwgQU4xKSwgRE0wfX0sCi17ICJtb3Z4IiwJMHhmNzcwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIERNMH19LAoteyAibW92eCIsCTB4ZjRiMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7TUVNMihJTU0yNCxBTjEpLCBETTB9fSwKLXsgIm1vdngiLAkweGY1NTAwMCwJMHhmZmYwMDAsCUZNVF81LCB7RE0wLCBNRU0yKFNEOCwgQU4xKX19LAoteyAibW92eCIsCTB4Zjc2MDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7RE0wLCBNRU0yKFNEMTYsIEFOMSl9fSwKLXsgIm1vdngiLAkweGY0MzAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge0RNMCwgTUVNMihJTU0yNCwgQU4xKX19LAotCi17ICJtb3ZiIiwJMHhmNTIwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge01FTTIoU0Q4LCBBTjEpLCBETTB9fSwKLXsgIm1vdmIiLAkweGY3ZDAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge01FTTIoU0QxNiwgQU4xKSwgRE0wfX0sCi17ICJtb3ZiIiwJMHhmNGEwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIERNMH19LAoteyAibW92YiIsCTB4ZjA0MCwJCTB4ZmZjMCwJCUZNVF80LCB7TUVNMihESSwgQU4xKSwgRE0wfX0sCi17ICJtb3ZiIiwJMHhmNGM0MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtNRU0oSU1NMjRfTUVNKSwgRE4wfX0sCi17ICJtb3ZiIiwJMHgxMCwJCTB4ZjAsCQlGTVRfMSwge0RNMCwgTUVNKEFOMSl9fSwKLXsgIm1vdmIiLAkweGY1MTAwMCwJMHhmZmYwMDAsCUZNVF81LCB7RE0wLCBNRU0yKFNEOCwgQU4xKX19LAoteyAibW92YiIsCTB4Zjc5MDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7RE0wLCBNRU0yKFNEMTYsIEFOMSl9fSwKLXsgIm1vdmIiLAkweGY0MjAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge0RNMCwgTUVNMihJTU0yNCwgQU4xKX19LAoteyAibW92YiIsCTB4ZjBjMCwJCTB4ZmZjMCwJCUZNVF80LCB7RE0wLCBNRU0yKERJLCBBTjEpfX0sCi17ICJtb3ZiIiwJMHhjNDAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge0ROMCwgTUVNKElNTTE2X01FTSl9fSwKLXsgIm1vdmIiLAkweGY0NDQwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0ROMCwgTUVNKElNTTI0X01FTSl9fSwKLQoteyAibW92YnUiLAkweDMwLAkJMHhmMCwJCUZNVF8xLCB7TUVNKEFOMSksIERNMH19LAoteyAibW92YnUiLAkweGY1MzAwMCwJMHhmZmYwMDAsCUZNVF81LCB7TUVNMihTRDgsIEFOMSksIERNMH19LAoteyAibW92YnUiLAkweGY3NTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge01FTTIoU0QxNiwgQU4xKSwgRE0wfX0sCi17ICJtb3ZidSIsCTB4ZjQ5MDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7TUVNMihJTU0yNCxBTjEpLCBETTB9fSwKLXsgIm1vdmJ1IiwJMHhmMDgwLAkJMHhmZmMwLAkJRk1UXzQsIHtNRU0yKERJLCBBTjEpLCBETTB9fSwKLXsgIm1vdmJ1IiwJMHhjYzAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge01FTShJTU0xNl9NRU0pLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmNGM4MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtNRU0oSU1NMjRfTUVNKSwgRE4wfX0sCi0KLXsgImV4dCIsCTB4ZjNjMSwJCTB4ZmZmMywJCUZNVF80LCB7RE4xfX0sCi17ICJleHR4IiwJMHhiMCwgCQkweGZjLAkJRk1UXzEsIHtETjB9fSwKLXsgImV4dHh1IiwJMHhiNCwJCTB4ZmMsCQlGTVRfMSwge0ROMH19LAoteyAiZXh0eGIiLAkweGI4LAkJMHhmYywJCUZNVF8xLCB7RE4wfX0sCi17ICJleHR4YnUiLAkweGJjLAkJMHhmYywJCUZNVF8xLCB7RE4wfX0sCi0KLXsgImFkZCIsCTB4OTAsCQkweGYwLAkJRk1UXzEsIHtETjEsIERNMH19LAoteyAiYWRkIiwJMHhmMjAwLAkJMHhmZmYwLAkJRk1UXzQsIHtETTEsIEFOMH19LAoteyAiYWRkIiwJMHhmMmMwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIERNMH19LAoteyAiYWRkIiwJMHhmMjQwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIEFNMH19LAoteyAiYWRkIiwJMHhkNDAwLAkJMHhmYzAwLAkJRk1UXzIsIHtTSU1NOCwgRE4wfX0sCi17ICJhZGQiLAkweGY3MTgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNiwgRE4wfX0sCi17ICJhZGQiLAkweGY0NjAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBETjB9fSwKLXsgImFkZCIsCTB4ZDAwMCwJCTB4ZmMwMCwJCUZNVF8yLCB7U0lNTTgsIEFOMH19LAoteyAiYWRkIiwJMHhmNzA4MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTYsIEFOMH19LAoteyAiYWRkIiwJMHhmNDY0MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgQU4wfX0sCi17ICJhZGRjIiwJMHhmMjgwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAoteyAiYWRkbmYiLAkweGY1MGMwMCwJMHhmZmZjMDAsCUZNVF81LCB7U0lNTTgsIEFOMH19LAotCi17ICJzdWIiLAkweGEwLAkJMHhmMCwJCUZNVF8xLCB7RE4xLCBETTB9fSwKLXsgInN1YiIsCTB4ZjIxMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBBTjB9fSwKLXsgInN1YiIsCTB4ZjJkMCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBETTB9fSwKLXsgInN1YiIsCTB4ZjI1MCwJCTB4ZmZmMCwJCUZNVF80LCB7QU4xLCBBTTB9fSwKLXsgInN1YiIsCTB4ZjcxYzAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7SU1NMTYsIEROMH19LAoteyAic3ViIiwJMHhmNDY4MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgRE4wfX0sCi17ICJzdWIiLAkweGY3MGMwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge0lNTTE2LCBBTjB9fSwKLXsgInN1YiIsCTB4ZjQ2YzAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEFOMH19LAoteyAic3ViYyIsCTB4ZjI5MCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLQoteyAibXVsIiwJMHhmMzQwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAoteyAibXVsdSIsCTB4ZjM1MCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLQoteyAiZGl2dSIsCTB4ZjM2MCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLQoteyAiY21wIiwJMHhmMzkwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAoteyAiY21wIiwJMHhmMjIwLAkJMHhmZmYwLAkJRk1UXzQsIHtETTEsIEFOMH19LAoteyAiY21wIiwJMHhmMmUwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIERNMH19LAoteyAiY21wIiwJMHhmMjYwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIEFNMH19LAoteyAiY21wIiwJMHhkODAwLAkJMHhmYzAwLAkJRk1UXzIsIHtTSU1NOCwgRE4wfX0sCi17ICJjbXAiLAkweGY3NDgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNiwgRE4wfX0sCi17ICJjbXAiLAkweGY0NzgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBETjB9fSwKLXsgImNtcCIsCTB4ZWMwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtJTU0xNiwgQU4wfX0sCi17ICJjbXAiLAkweGY0N2MwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBBTjB9fSwKLQoteyAiYW5kIiwJMHhmMzAwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAoteyAiYW5kIiwJMHhmNTAwMDAsCTB4ZmZmYzAwLAlGTVRfNSwge0lNTTgsIEROMH19LAoteyAiYW5kIiwJMHhmNzAwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBETjB9fSwKLXsgImFuZCIsCTB4ZjcxMDAwMDAsCTB4ZmZmZjAwMDAsCUZNVF82LCB7U0lNTTE2TiwgUFNXfX0sCi17ICJvciIsCQkweGYzMTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJvciIsCQkweGY1MDgwMCwJMHhmZmZjMDAsCUZNVF81LCB7SU1NOCwgRE4wfX0sCi17ICJvciIsCQkweGY3NDAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNk4sIEROMH19LAoteyAib3IiLAkJMHhmNzE0MDAwMCwJMHhmZmZmMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBQU1d9fSwKLXsgInhvciIsCTB4ZjMyMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgInhvciIsCTB4Zjc0YzAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2TiwgRE4wfX0sCi17ICJub3QiLAkweGYzZTQsCQkweGZmZmMsCQlGTVRfNCwge0ROMH19LAotCi17ICJhc3IiLAkweGYzMzgsCQkweGZmZmMsCQlGTVRfNCwge0ROMH19LAoteyAibHNyIiwJMHhmMzNjLAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKLXsgInJvciIsCTB4ZjMzNCwJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCi17ICJyb2wiLAkweGYzMzAsCQkweGZmZmMsCQlGTVRfNCwge0ROMH19LAotCi17ICJidHN0IiwJMHhmNTA0MDAsCTB4ZmZmYzAwLAlGTVRfNSwge0lNTTgsIEROMH19LAoteyAiYnRzdCIsCTB4ZjcwNDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2TiwgRE4wfX0sCi17ICJic2V0IiwJMHhmMDIwLAkJMHhmZmYwLAkJRk1UXzQsIHtETTAsIE1FTShBTjEpfX0sCi17ICJiY2xyIiwJMHhmMDMwLAkJMHhmZmYwLAkJRk1UXzQsIHtETTAsIE1FTShBTjEpfX0sCi0KLXsgImJlcSIsCTB4ZTgwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5lIiwJMHhlOTAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJibHQiLAkweGUwMDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJsZSIsCTB4ZTMwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmdlIiwJMHhlMjAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJiZ3QiLAkweGUxMDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJjcyIsCTB4ZTQwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmxzIiwJMHhlNzAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJiY2MiLAkweGU2MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJoaSIsCTB4ZTUwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYnZjIiwJMHhmNWZjMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJ2cyIsCTB4ZjVmZDAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibmMiLAkweGY1ZmUwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5zIiwJMHhmNWZmMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJyYSIsCTB4ZWEwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAotCi17ICJiZXF4IiwJMHhmNWU4MDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJuZXgiLAkweGY1ZTkwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmx0eCIsCTB4ZjVlMDAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibGV4IiwJMHhmNWUzMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJnZXgiLAkweGY1ZTIwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmd0eCIsCTB4ZjVlMTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJiY3N4IiwJMHhmNWU0MDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJsc3giLAkweGY1ZTcwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmNjeCIsCTB4ZjVlNjAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJiaGl4IiwJMHhmNWU1MDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJ2Y3giLAkweGY1ZWMwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYnZzeCIsCTB4ZjVlZDAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibmN4IiwJMHhmNWVlMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJuc3giLAkweGY1ZWYwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAotCi17ICJqbXAiLAkweGZjMDAwMCwJMHhmZjAwMDAsCUZNVF8zLCB7SU1NMTZfUENSRUx9fSwKLXsgImptcCIsCTB4ZjRlMDAwMDAsCTB4ZmZmZjAwMDAsCUZNVF83LCB7SU1NMjRfUENSRUx9fSwKLXsgImptcCIsCTB4ZjAwMCwJCTB4ZmZmMywJCUZNVF80LCB7UEFSRU4sQU4xLFBBUkVOfX0sCi17ICJqc3IiLAkweGZkMDAwMCwJMHhmZjAwMDAsCUZNVF8zLCB7SU1NMTZfUENSRUx9fSwKLXsgImpzciIsCTB4ZjRlMTAwMDAsCTB4ZmZmZjAwMDAsCUZNVF83LCB7SU1NMjRfUENSRUx9fSwKLXsgImpzciIsCTB4ZjAwMSwJCTB4ZmZmMywJCUZNVF80LCB7UEFSRU4sQU4xLFBBUkVOfX0sCi0KLXsgIm5vcCIsCTB4ZjYsCQkweGZmLAkJRk1UXzEsIHtVTlVTRUR9fSwKLQoteyAicnRzIiwJMHhmZSwJCTB4ZmYsCQlGTVRfMSwge1VOVVNFRH19LAoteyAicnRpIiwJMHhlYiwJCTB4ZmYsCQlGTVRfMSwge1VOVVNFRH19LAotCi0vKiBFeHRlbnNpb24uICBXZSBuZWVkIHNvbWUgaW5zdHJ1Y3Rpb24gdG8gdHJpZ2dlciAiZW11bGF0ZWQgc3lzY2FsbHMiCi0gICBmb3Igb3VyIHNpbXVsYXRvci4gICovCi17ICJzeXNjYWxsIiwJMHhmMDEwLAkJMHhmZmZmLAkJRk1UXzQsIHtVTlVTRUR9fSwKLQotLyogRXh0ZW5zaW9uLiAgV2hlbiB0YWxraW5nIHRvIHRoZSBzaW11bGF0b3IsIGdkYiByZXF1aXJlcyBzb21lIGluc3RydWN0aW9uCi0gICB0aGF0IHdpbGwgdHJpZ2dlciBhICJicmVha3BvaW50IiAocmVhbGx5IGp1c3QgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpc24ndAotICAgb3RoZXJ3aXNlIHVzZWQgYnkgdGhlIHRvb2xzLiAgVGhpcyBpbnN0cnVjdGlvbiBtdXN0IGJlIHRoZSBzYW1lIHNpemUKLSAgIGFzIHRoZSBzbWFsbGVzdCBpbnN0cnVjdGlvbiBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuICBJbiB0aGUgY2FzZSBvZiB0aGUKLSAgIG1uMTB4MDAgdGhlICJicmVhayIgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBvbmUgYnl0ZS4gIDB4ZmYgaXMgYXZhaWxhYmxlIG9uCi0gICBib3RoIG1uMTB4MDAgYXJjaGl0ZWN0dXJlcy4gICovCi17ICJicmVhayIsICAgICAgMHhmZiwgICAgICAgICAgIDB4ZmYsICAgICAgICAgICBGTVRfMSwge1VOVVNFRH19LAotCi17IDAsIDAsIDAsIDAsIHswfX0sCi0KLX0gOwotCi1jb25zdCBpbnQgbW4xMDIwMF9udW1fb3Bjb2RlcyA9Ci0gIHNpemVvZiAobW4xMDIwMF9vcGNvZGVzKSAvIHNpemVvZiAobW4xMDIwMF9vcGNvZGVzWzBdKTsKLQotDApkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMTAzMDAtZGlzLmMgYi9vcGNvZGVzL20xMDMwMC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3Zjc0Yy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20xMDMwMC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDY4MiArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBNTjEwMzAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL21uMTAzMDAuaCIgCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi1zdGF0aWMgdm9pZCBkaXNhc3NlbWJsZSBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLAotCQkJCSB1bnNpZ25lZCBsb25nIGluc24sIHVuc2lnbmVkIGludCkpOwotCi1pbnQgCi1wcmludF9pbnNuX21uMTAzMDAgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBzdGF0dXM7Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICB1bnNpZ25lZCBpbnQgY29uc3VtZTsKLQotICAvKiBGaXJzdCBmaWd1cmUgb3V0IGhvdyBiaWcgdGhlIG9wY29kZSBpcy4gICovCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGluc24gPSAqKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyOwotCi0gIC8qIFRoZXNlIGFyZSBvbmUgYnl0ZSBpbnNucy4gICovCi0gIGlmICgoaW5zbiAmIDB4ZjMpID09IDB4MDAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHgxMAotICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweDNjCi0gICAgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDEKLSAgICAgIHx8IChpbnNuICYgMHhmMykgPT0gMHg0MAotICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweDUwCi0gICAgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4NTQKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg2MAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDcwCi0gICAgICB8fCAoKGluc24gJiAweGYwKSA9PSAweDgwCi0JICAmJiAoaW5zbiAmIDB4MGMpID4+IDIgIT0gKGluc24gJiAweDAzKSkKLSAgICAgIHx8ICgoaW5zbiAmIDB4ZjApID09IDB4OTAKLQkgICYmIChpbnNuICYgMHgwYykgPj4gMiAhPSAoaW5zbiAmIDB4MDMpKQotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHhhMAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoKGluc24gJiAweGYwKSA9PSAweGIwCi0JICAmJiAoaW5zbiAmIDB4MGMpID4+IDIgIT0gKGluc24gJiAweDAzKSkKLSAgICAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhjYgotICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQwCi0gICAgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDQKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkOAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweGUwCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmYpCi0gICAgewotICAgICAgY29uc3VtZSA9IDE7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSB0d28gYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmMCkgPT0gMHg4MAotCSAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg5MAotCSAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHhhMAotCSAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHhiMAotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHgyMAotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHgyOAotCSAgIHx8IChpbnNuICYgMHhmMykgPT0gMHg0MwotCSAgIHx8IChpbnNuICYgMHhmMykgPT0gMHg0MgotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHg1OAotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHg1YwotCSAgIHx8ICgoaW5zbiAmIDB4ZjApID09IDB4YzAKLQkgICAgICAgJiYgKGluc24gJiAweGZmKSAhPSAweGNiCi0JICAgICAgICYmIChpbnNuICYgMHhmZikgIT0gMHhjYwotCSAgICAgICAmJiAoaW5zbiAmIDB4ZmYpICE9IDB4Y2QpCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGYwCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGYxCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGYyCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGYzCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY0Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY1Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY2KQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICAgICAgY29uc3VtZSA9IDI7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSB0aHJlZSBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGY4Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGNjIAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmOQotCSAgIHx8IChpbnNuICYgMHhmMykgPT0gMHgwMQotCSAgIHx8IChpbnNuICYgMHhmMykgPT0gMHgwMgotCSAgIHx8IChpbnNuICYgMHhmMykgPT0gMHgwMwotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHgyNAotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHgyYwotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHgzMAotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHgzNAotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHgzOAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhkZQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhkZgotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmOQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhjYykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICAgICAgaW5zbiA8PD0gODsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAyLCBidWZmZXIsIDEsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gfD0gKih1bnNpZ25lZCBjaGFyICopYnVmZmVyOwotICAgICAgY29uc3VtZSA9IDM7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSBmb3VyIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4ZmEKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjcKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmIpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgICAgIGNvbnN1bWUgPSA0OwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgZml2ZSBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGNkCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGRjKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gNTsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIHNpeCBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGZkCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZjKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgICAgIGNvbnN1bWUgPSA2OwotICAgIH0KLQotICAvKiBFbHNlIGl0cyBhIHNldmVuIGJ5dGUgaW5zbnMgKGluIHRoZW9yeSkuICAqLwotICBlbHNlCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICAgICAgY29uc3VtZSA9IDc7Ci0gICAgfQotCi0gIGRpc2Fzc2VtYmxlIChtZW1hZGRyLCBpbmZvLCBpbnNuLCBjb25zdW1lKTsKLQotICByZXR1cm4gY29uc3VtZTsKLX0KLQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlIChtZW1hZGRyLCBpbmZvLCBpbnNuLCBzaXplKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKm9wID0gKHN0cnVjdCBtbjEwMzAwX29wY29kZSAqKW1uMTAzMDBfb3Bjb2RlczsKLSAgY29uc3Qgc3RydWN0IG1uMTAzMDBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB1bnNpZ25lZCBsb25nIGV4dGVuc2lvbiA9IDA7Ci0gIGludCBzdGF0dXMsIG1hdGNoID0gMDsKLQotICAvKiBGaW5kIHRoZSBvcGNvZGUuICAqLwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaW50IG15c2l6ZSwgZXh0cmFfc2hpZnQ7Ci0KLSAgICAgIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9TMCkKLQlteXNpemUgPSAxOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfUzEKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfRDApCi0JbXlzaXplID0gMjsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX1MyCi0JICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0QxKQotCW15c2l6ZSA9IDM7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9TNCkKLQlteXNpemUgPSA1OwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDIpCi0JbXlzaXplID0gNDsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0Q0KQotCW15c2l6ZSA9IDY7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9ENikKLQlteXNpemUgPSAzOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDcgfHwgb3AtPmZvcm1hdCA9PSBGTVRfRDEwKQotCW15c2l6ZSA9IDQ7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9EOCkKLQlteXNpemUgPSA2OwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDkpCi0JbXlzaXplID0gNzsKLSAgICAgIGVsc2UKLQlteXNpemUgPSA3OwotCQotICAgICAgaWYgKChvcC0+bWFzayAmIGluc24pID09IG9wLT5vcGNvZGUKLQkgICYmIHNpemUgPT0gKHVuc2lnbmVkIGludCkgbXlzaXplCi0JICAmJiAob3AtPm1hY2hpbmUgPT0gMAotCSAgICAgIHx8IG9wLT5tYWNoaW5lID09IGluZm8tPm1hY2gpKQotCXsKLQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXhfcHRyOwotCSAgdW5zaWduZWQgaW50IG5vY29tbWE7Ci0JICBpbnQgcGFyZW4gPSAwOwotCSAgCi0JICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDEgfHwgb3AtPmZvcm1hdCA9PSBGTVRfUzEpCi0JICAgIGV4dHJhX3NoaWZ0ID0gODsKLQkgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0QyIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0Q0Ci0JCSAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX1MyIHx8IG9wLT5mb3JtYXQgPT0gRk1UX1M0Ci0JCSAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX1M2IHx8IG9wLT5mb3JtYXQgPT0gRk1UX0Q1KQotCSAgICBleHRyYV9zaGlmdCA9IDE2OwotCSAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDcKLQkJICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfRDgKLQkJICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfRDkpCi0JICAgIGV4dHJhX3NoaWZ0ID0gODsKLQkgIGVsc2UKLQkgICAgZXh0cmFfc2hpZnQgPSAwOwotCi0JICBpZiAoc2l6ZSA9PSAxIHx8IHNpemUgPT0gMikKLQkgICAgewotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gMwotCQkgICAmJiAob3AtPmZvcm1hdCA9PSBGTVRfRDEKLQkJICAgICAgIHx8IG9wLT5vcGNvZGUgPT0gMHhkZjAwMDAKLQkJICAgICAgIHx8IG9wLT5vcGNvZGUgPT0gMHhkZTAwMDApKQotCSAgICB7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSAzCi0JCSAgICYmIG9wLT5mb3JtYXQgPT0gRk1UX0Q2KQotCSAgICB7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSAzKQotCSAgICB7Ci0JICAgICAgaW5zbiAmPSAweGZmMDAwMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCAyLCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQotCSAgICAgIGluc24gfD0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDQKLQkJICAgJiYgKG9wLT5vcGNvZGUgPT0gMHhmYWY4MDAwMAotCQkgICAgICAgfHwgb3AtPm9wY29kZSA9PSAweGZhZjAwMDAwCi0JCSAgICAgICB8fCBvcC0+b3Bjb2RlID09IDB4ZmFmNDAwMDApKQotCSAgICB7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA0Ci0JCSAgICYmIChvcC0+Zm9ybWF0ID09IEZNVF9ENwotCQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfRDEwKSkKLQkgICAgewotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNCkKLQkgICAgewotCSAgICAgIGluc24gJj0gMHhmZmZmMDAwMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAyLCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQotCSAgICAgIGluc24gfD0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDUgJiYgb3AtPm9wY29kZSA9PSAweGRjMDAwMDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCA0LCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICB0ZW1wIHw9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLQkgICAgICBpbnNuICY9IDB4ZmYwMDAwMDA7Ci0JICAgICAgaW5zbiB8PSAodGVtcCAmIDB4ZmZmZmZmMDApID4+IDg7Ci0JICAgICAgZXh0ZW5zaW9uID0gdGVtcCAmIDB4ZmY7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdGVtcCB8PSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCi0JICAgICAgaW5zbiAmPSAweGZmMDAwMGZmOwotCSAgICAgIGluc24gfD0gdGVtcCA8PCA4OwotCi0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDQsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgZXh0ZW5zaW9uID0gKih1bnNpZ25lZCBjaGFyICopYnVmZmVyOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDYgJiYgb3AtPmZvcm1hdCA9PSBGTVRfRDgpCi0JICAgIHsKLQkgICAgICBpbnNuICY9IDB4ZmZmZmZmMDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDUsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgaW5zbiB8PSAqKHVuc2lnbmVkIGNoYXIgKilidWZmZXI7Ci0KLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMywgYnVmZmVyLCAyLCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBleHRlbnNpb24gPSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDYpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAyLCBidWZmZXIsIDQsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIHRlbXAgfD0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQotCSAgICAgIGluc24gJj0gMHhmZmZmMDAwMDsKLQkgICAgICBpbnNuIHw9ICh0ZW1wID4+IDE2KSAmIDB4ZmZmZjsKLQkgICAgICBleHRlbnNpb24gPSB0ZW1wICYgMHhmZmZmOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDcgJiYgb3AtPmZvcm1hdCA9PSBGTVRfRDkpCi0JICAgIHsKLQkgICAgICBpbnNuICY9IDB4ZmZmZmZmMDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDMsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgZXh0ZW5zaW9uID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQkgICAgICBpbnNuIHw9IChleHRlbnNpb24gJiAweGZmMDAwMDAwKSA+PiAyNDsKLQkgICAgICBleHRlbnNpb24gJj0gMHhmZmZmZmY7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNyAmJiBvcC0+b3Bjb2RlID09IDB4ZGQwMDAwMDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDQsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIHRlbXAgfD0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQotCSAgICAgIGluc24gJj0gMHhmZjAwMDAwMDsKLQkgICAgICBpbnNuIHw9ICh0ZW1wID4+IDgpICYgMHhmZmZmZmY7Ci0JICAgICAgZXh0ZW5zaW9uID0gKHRlbXAgJiAweGZmKSA8PCAxNjsKLQkgICAgICAKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgNSwgYnVmZmVyLCAyLCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBleHRlbnNpb24gfD0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA3KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCA0LCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICB0ZW1wIHw9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLQkgICAgICBpbnNuICY9IDB4ZmZmZjAwMDA7Ci0JICAgICAgaW5zbiB8PSAodGVtcCA+PiAxNikgJiAweGZmZmY7Ci0JICAgICAgZXh0ZW5zaW9uID0gKHRlbXAgJiAweGZmZmYpIDw8IDg7Ci0JICAgICAgCi0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDYsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgZXh0ZW5zaW9uIHw9ICoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKLQkgICAgfQotCi0JICBtYXRjaCA9IDE7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzXHQiLCBvcC0+bmFtZSk7Ci0KLQkgIC8qIE5vdyBwcmludCB0aGUgb3BlcmFuZHMuICAqLwotCSAgZm9yIChvcGluZGV4X3B0ciA9IG9wLT5vcGVyYW5kcywgbm9jb21tYSA9IDE7Ci0JICAgICAgICpvcGluZGV4X3B0ciAhPSAwOwotCSAgICAgICBvcGluZGV4X3B0cisrKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotCSAgICAgIG9wZXJhbmQgPSAmbW4xMDMwMF9vcGVyYW5kc1sqb3BpbmRleF9wdHJdOwotCi0JICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGlzIGEgUExVUyAoYXV0b2luY3JlbWVudCksIHRoZW4gZG8gbm90IGVtaXQKLQkJIGEgY29tbWEgYmVmb3JlIGVtaXR0aW5nIHRoZSBwbHVzLiAgKi8KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BMVVMpICE9IDApCi0JCW5vY29tbWEgPSAxOwotCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TUExJVCkgIT0gMCkKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgdGVtcDsKLQkJICB2YWx1ZSA9IGluc24gJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQkJICB2YWx1ZSA8PD0gKDMyIC0gb3BlcmFuZC0+Yml0cyk7Ci0JCSAgdGVtcCA9IGV4dGVuc2lvbiA+PiBvcGVyYW5kLT5zaGlmdDsKLQkJICB0ZW1wICY9ICgoMSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkgLSAxKTsKLQkJICB2YWx1ZSB8PSB0ZW1wOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EXzI0QklUKSAhPSAwKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotCQkgIHZhbHVlID0gaW5zbiAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCQkgIHZhbHVlIDw8PSAoMjQgLSBvcGVyYW5kLT5iaXRzKTsKLQkJICB0ZW1wID0gZXh0ZW5zaW9uID4+IG9wZXJhbmQtPnNoaWZ0OwotCQkgIHRlbXAgJj0gKCgxIDw8ICgyNCAtIG9wZXJhbmQtPmJpdHMpKSAtIDEpOwotCQkgIHZhbHVlIHw9IHRlbXA7Ci0JCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JCSAgICB2YWx1ZSA9ICgodmFsdWUgJiAweGZmZmZmZikgXiAofjB4N2ZmZmZmKSkgKyAweDgwMDAwMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9FWFRFTkRFRCkgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChleHRlbnNpb24gPj4gKG9wZXJhbmQtPnNoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQl9Ci0KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCkgIT0gMAotCQkgICAvKiBUaGVzZSBhcmUgcHJvcGVybHkgZXh0ZW5kZWQgYnkgdGhlIGNvZGUgYWJvdmUuICAqLwotCQkgICAmJiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EXzI0QklUKSA9PSAwKQotCQkgICkKLQkJdmFsdWUgPSAoKGxvbmcpKHZhbHVlIDw8ICgzMiAtIG9wZXJhbmQtPmJpdHMpKQotCQkJICA+PiAoMzIgLSBvcGVyYW5kLT5iaXRzKSk7Ci0KLQkgICAgICBpZiAoIW5vY29tbWEKLQkJICAmJiAoIXBhcmVuCi0JCSAgICAgIHx8ICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUEFSRU4pID09IDApKSkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0KLQkgICAgICBub2NvbW1hID0gMDsKLQkJCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9EUkVHKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0ICsgZXh0cmFfc2hpZnQpKQotCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkJWQiLCB2YWx1ZSk7Ci0JCX0KLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9BUkVHKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0ICsgZXh0cmFfc2hpZnQpKQotCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhJWQiLCB2YWx1ZSk7Ci0JCX0KLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TUCkgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJzcCIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BTVykgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJwc3ciKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9NRFIpICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAibWRyIik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUlJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgIGlmICh2YWx1ZSA8IDgpCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIlZCIsIHZhbHVlKTsKLQkJICBlbHNlIGlmICh2YWx1ZSA8IDEyKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhJWQiLCB2YWx1ZSAtIDgpOwotCQkgIGVsc2UKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZCVkIiwgdmFsdWUgLSAxMik7Ci0JCX0KLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9YUlJFRykgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCArIGV4dHJhX3NoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQkgIGlmICh2YWx1ZSA9PSAwKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJzcCIsIHZhbHVlKTsKLQkJICBlbHNlCi0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ4ciVkIiwgdmFsdWUpOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfVVNQKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInVzcCIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NTUCkgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJzc3AiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9NU1ApICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAibXNwIik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUEMpICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAicGMiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9FUFNXKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImVwc3ciKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QTFVTKSAhPSAwKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisiKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQVJFTikgIT0gMCkKLQkJewotCQkgIGlmIChwYXJlbikKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoIik7Ci0JCSAgICAgIG5vY29tbWEgPSAxOwotCQkgICAgfQotCQkgIHBhcmVuID0gIXBhcmVuOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUENSRUwpICE9IDApCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGxvbmcpIHZhbHVlICsgbWVtYWRkciwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfTUVNQUREUikgIT0gMCkKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QpICE9IDApCi0JCXsKLQkJICBpbnQgY29tbWEgPSAwOwotCi0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJbIik7Ci0JCSAgaWYgKHZhbHVlICYgMHg4MCkKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkMiIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDQwKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkMyIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDIwKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhMiIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDEwKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhMyIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDA4KQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJvdGhlciIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDA0KQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJleHJlZzAiKTsKLQkJICAgICAgY29tbWEgPSAxOwotCQkgICAgfQotCQkgIGlmICh2YWx1ZSAmIDB4MDIpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjb21tYSkKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4cmVnMSIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbHVlICYgMHgwMSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbW1hKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZXhvdGhlciIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJdIik7Ci0JCX0KLQotCSAgICAgIGVsc2UgCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCB2YWx1ZSk7Ci0JICAgIH0KLQkgIC8qIEFsbCBkb25lLiAqLwotCSAgYnJlYWs7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIF8oInVua25vd25cdDB4JTA0eCIpLCBpbnNuKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20xMDMwMC1vcGMuYyBiL29wY29kZXMvbTEwMzAwLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODE4NDE3Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTEwMzAwLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQyNyArMCwwIEBACi0vKiBBc3NlbWJsZSBNYXRzdXNoaXRhIE1OMTAzMDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgZm9ybWF0dGVkIGF0ID4gODAgY29sdW1ucy4gIEF0dGVtcHRpbmcgdG8gcmVhZCBpdCBvbiBhCi0gICBzY3JlZWVuIHdpdGggbGVzcyB0aGFuIDgwIGNvbHVtbnMgd2lsbCBiZSBkaWZmaWN1bHQuICAqLwotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL21uMTAzMDAuaCIKLQotDAotY29uc3Qgc3RydWN0IG1uMTAzMDBfb3BlcmFuZCBtbjEwMzAwX29wZXJhbmRzW10gPSB7Ci0jZGVmaW5lIFVOVVNFRAkwCi0gIHswLCAwLCAwfSwgCi0KLS8qIGRuIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE4wICAgICAgKFVOVVNFRCsxKQotICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETjEgICAgICAoRE4wKzEpCi0gIHsyLCAyLCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRuIHJlZ2lzdGVyIGluIHRoZSB0aGlyZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE4yICAgICAgKEROMSsxKQotICB7MiwgNCwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbSByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMCAgICAgIChETjIrMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE0xICAgICAgKERNMCsxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbSByZWdpc3RlciBpbiB0aGUgdGhpcmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMiAgICAgIChETTErMSkKLSAgezIsIDQsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogYW4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTjAgICAgICAoRE0yKzEpCi0gIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFOMSAgICAgIChBTjArMSkKLSAgezIsIDIsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW4gcmVnaXN0ZXIgaW4gdGhlIHRoaXJkIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTjIgICAgICAoQU4xKzEpCi0gIHsyLCA0LCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFtIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU0wICAgICAgKEFOMisxKQotICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTTEgICAgICAoQU0wKzEpCi0gIHsyLCAyLCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFtIHJlZ2lzdGVyIGluIHRoZSB0aGlyZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU0yICAgICAgKEFNMSsxKQotICB7MiwgNCwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAxNmJpdAotICAgdW5zaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NOCAgICAoQU0yKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAzMmJpdAotICAgdW5zaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NMTYgICAgKElNTTgrMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBwYy1yZWxhdGl2ZSBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAxNmJpdAotICAgcGMtcmVsYXRpdmUgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NMTZfUENSRUwgICAgKElNTTE2KzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDMwMF9PUEVSQU5EX1JFTEFYIHwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDE2Yml0IHVuc2lnbmVkIGRpc3BhY2VtZW50IGluIGEgbWVtb3J5IG9wZXJhdGlvbiB3aGljaAotICAgbWF5IHByb21vdGUgdG8gYSAzMmJpdCBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBJTU0xNl9NRU0gICAgKElNTTE2X1BDUkVMKzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEUgfCBNTjEwMzAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIDMyYml0IGltbWVkaWF0ZSwgaGlnaCAxNiBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCAxNmJpdHMgaW4gdGhlIGV4dGVuc2lvbiB3b3JkLiAKLQotICAgVGhlICJiaXRzIiBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgaW4gdGhlCi0gICBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVCEgICovCi0jZGVmaW5lIElNTTMyICAgIChJTU0xNl9NRU0rMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVR9LAotCi0vKiAzMmJpdCBwYy1yZWxhdGl2ZSBvZmZzZXQuICAqLwotI2RlZmluZSBJTU0zMl9QQ1JFTCAgICAoSU1NMzIrMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfUENSRUx9LAotCi0vKiAzMmJpdCBtZW1vcnkgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgSU1NMzJfTUVNICAgIChJTU0zMl9QQ1JFTCsxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9NRU1BRERSfSwKLQotLyogMzJiaXQgaW1tZWRpYXRlLCBoaWdoIDE2IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KLSAgIHdvcmQsIDE2Yml0cyBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQsIGxvdyAxNmJpdHMgYXJlIGxlZnQKLSAgIHNoaWZ0ZWQgOCBwbGFjZXMuIAotCi0gICBUaGUgImJpdHMiIGZpZWxkIGluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSBpbiB0aGUKLSAgIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElUISAgKi8KLSNkZWZpbmUgSU1NMzJfTE9XU0hJRlQ4ICAgIChJTU0zMl9NRU0rMSkKLSAgezE2LCA4LCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIDMyYml0IGltbWVkaWF0ZSwgaGlnaCAyNCBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCA4IGluIHRoZSBleHRlbnNpb24gd29yZC4KLQotICAgVGhlICJiaXRzIiBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgaW4gdGhlCi0gICBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVCEgICovCi0jZGVmaW5lIElNTTMyX0hJR0gyNCAgICAoSU1NMzJfTE9XU0hJRlQ4KzEpCi0gIHsyNCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMfSwKLQotLyogMzJiaXQgaW1tZWRpYXRlLCBoaWdoIDI0IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KLSAgIHdvcmQsIDggaW4gdGhlIGV4dGVuc2lvbiB3b3JkLCBsb3cgOCBiaXRzIGFyZSBsZWZ0Ci0gICBzaGlmdGVkIDE2IHBsYWNlcy4gCi0KLSAgIFRoZSAiYml0cyIgZmllbGQgaW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIGluIHRoZQotICAgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQhICAqLwotI2RlZmluZSBJTU0zMl9ISUdIMjRfTE9XU0hJRlQxNiAgICAoSU1NMzJfSElHSDI0KzEpCi0gIHsyNCwgMTYsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9QQ1JFTH0sCi0KLS8qIFN0YWNrIHBvaW50ZXIuICAqLwotI2RlZmluZSBTUCAgICAoSU1NMzJfSElHSDI0X0xPV1NISUZUMTYrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TUH0sCi0KLS8qIFByb2Nlc3NvciBzdGF0dXMgd29yZC4gICovCi0jZGVmaW5lIFBTVyAgICAoU1ArMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9QU1d9LAotCi0vKiBNRFIgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNRFIgICAgKFBTVysxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX01EUn0sCi0KLS8qIEluZGV4IHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgREkgKE1EUisxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50LCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgZGlzcGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDggICAgKERJKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCwgbWF5IHByb21vdGUgdG8gMzJiaXQgZGlzcGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDE2ICAgIChTRDgrMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50IHRoYXQgY2FuIG5vdCBwcm9tb3RlLiAgKi8KLSNkZWZpbmUgU0Q4TiAgICAoU0QxNisxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDggYml0IHBjLXJlbGF0aXZlIGRpc3BsYWNlbWVudC4gICovCi0jZGVmaW5lIFNEOE5fUENSRUwgICAgKFNEOE4rMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMzAwX09QRVJBTkRfUENSRUwgfCBNTjEwMzAwX09QRVJBTkRfUkVMQVh9LAotCi0vKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50IHNoaWZ0ZWQgbGVmdCA4IGJpdHMgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0Q4Tl9TSElGVDggICAgKFNEOE5fUENSRUwrMSkKLSAgezgsIDgsIE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiA4IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIDE2Yml0IHNpZ25lZCBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBTSU1NOCAgICAoU0Q4Tl9TSElGVDgrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIDMyYml0ICBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBTSU1NMTYgICAgKFNJTU04KzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogRWl0aGVyIGFuIG9wZW4gcGFyZW4gb3IgY2xvc2UgcGFyZW4uICAqLwotI2RlZmluZSBQQVJFTgkoU0lNTTE2KzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfUEFSRU59LCAKLQotLyogZG4gcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHJlZ2lzdGVyIHBvc2l0aW9ucy4gICovCi0jZGVmaW5lIEROMDEgICAgIChQQVJFTisxKQotICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0RSRUcgfCBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUR9LAotCi0vKiBhbiByZWdpc3RlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcmVnaXN0ZXIgcG9zaXRpb25zLiAgKi8KLSNkZWZpbmUgQU4wMSAgICAgKEROMDErMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9BUkVHIHwgTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLQotLyogMTZiaXQgcGMtcmVsYXRpdmUgZGlzcGxhY2VtZW50IHdoaWNoIG1heSBwcm9tb3RlIHRvIDMyYml0IHBjLXJlbGF0aXZlCi0gICBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBEMTZfU0hJRlQgKEFOMDErMSkKLSAgezE2LCA4LCBNTjEwMzAwX09QRVJBTkRfUENSRUwgfCBNTjEwMzAwX09QRVJBTkRfUkVMQVggfCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEfSwKLQotLyogOCBiaXQgaW1tZWRpYXRlIGZvdW5kIGluIHRoZSBleHRlbnNpb24gd29yZC4gICovCi0jZGVmaW5lIElNTThFICAgIChEMTZfU0hJRlQrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9FWFRFTkRFRH0sCi0KLS8qIFJlZ2lzdGVyIGxpc3QgZm91bmQgaW4gdGhlIGV4dGVuc2lvbiB3b3JkIHNoaWZ0ZWQgOCBiaXRzIGxlZnQuICAqLwotI2RlZmluZSBSRUdTRV9TSElGVDggICAgKElNTThFKzEpCi0gIHs4LCA4LCBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQgfCBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1R9LAotCi0vKiBSZWdpc3RlciBsaXN0IHNoaWZ0ZWQgOCBiaXRzIGxlZnQuICAqLwotI2RlZmluZSBSRUdTX1NISUZUOCAoUkVHU0VfU0hJRlQ4ICsgMSkKLSAgezgsIDgsIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVH0sCi0KLS8qIFJlaWdzdGVyIGxpc3QuICAqLwotI2RlZmluZSBSRUdTICAgIChSRUdTX1NISUZUOCsxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUfSwKLQotLyogVVN0YWNrIHBvaW50ZXIuICAqLwotI2RlZmluZSBVU1AgICAgKFJFR1MrMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9VU1B9LAotCi0vKiBTU3RhY2sgcG9pbnRlci4gICovCi0jZGVmaW5lIFNTUCAgICAoVVNQKzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfU1NQfSwKLQotLyogTVN0YWNrIHBvaW50ZXIuICAqLwotI2RlZmluZSBNU1AgICAgKFNTUCsxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX01TUH0sCi0KLS8qIFBDIC4gICovCi0jZGVmaW5lIFBDICAgIChNU1ArMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9QQ30sCi0KLS8qIDQgYml0IGltbWVkaWF0ZSBmb3Igc3lzY2FsbC4gICovCi0jZGVmaW5lIElNTTQgICAgKFBDKzEpCi0gIHs0LCAwLCAwfSwKLQotLyogUHJvY2Vzc29yIHN0YXR1cyB3b3JkLiAgKi8KLSNkZWZpbmUgRVBTVyAgICAoSU1NNCsxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX0VQU1d9LAotCi0vKiBybiByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIFJOMCAgICAgIChFUFNXKzEpCi0gIHs0LCAwLCBNTjEwMzAwX09QRVJBTkRfUlJFR30sCi0KLS8qIHJuIHJlZ2lzdGVyIGluIHRoZSBmb3VydGggcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIFJOMiAgICAgIChSTjArMSkKLSAgezQsIDQsIE1OMTAzMDBfT1BFUkFORF9SUkVHfSwKLQotLyogcm0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBSTTAgICAgICAoUk4yKzEpCi0gIHs0LCAwLCBNTjEwMzAwX09QRVJBTkRfUlJFR30sCi0KLS8qIHJtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIFJNMSAgICAgIChSTTArMSkKLSAgezQsIDIsIE1OMTAzMDBfT1BFUkFORF9SUkVHfSwKLQotLyogcm0gcmVnaXN0ZXIgaW4gdGhlIHRoaXJkIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBSTTIgICAgICAoUk0xKzEpCi0gIHs0LCA0LCBNTjEwMzAwX09QRVJBTkRfUlJFR30sCi0KLSNkZWZpbmUgUk4wMiAgICAgIChSTTIrMSkKLSAgezQsIDAsIE1OMTAzMDBfT1BFUkFORF9SUkVHIHwgTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLQotI2RlZmluZSBYUk4wICAgICAgKFJOMDIrMSkKLSAgezQsIDAsIE1OMTAzMDBfT1BFUkFORF9YUlJFR30sCi0KLSNkZWZpbmUgWFJNMiAgICAgIChYUk4wKzEpCi0gIHs0LCA0LCBNTjEwMzAwX09QRVJBTkRfWFJSRUd9LAotCi0vKiArIGZvciBhdXRvaW5jcmVtZW50ICovCi0jZGVmaW5lIFBMVVMJKFhSTTIrMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9QTFVTfSwgCi0KLSNkZWZpbmUgWFJOMDIgICAgICAoUExVUysxKQotICB7NCwgMCwgTU4xMDMwMF9PUEVSQU5EX1hSUkVHIHwgTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLQotLyogSWNrICovCi0jZGVmaW5lIFJEMCAgICAgIChYUk4wMisxKQotICB7NCwgLTgsIE1OMTAzMDBfT1BFUkFORF9SUkVHfSwKLQotI2RlZmluZSBSRDIgICAgICAoUkQwKzEpCi0gIHs0LCAtNCwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0vKiA4IHVuc2lnbmVkIGRpc3BhY2VtZW50IGluIGEgbWVtb3J5IG9wZXJhdGlvbiB3aGljaAotICAgbWF5IHByb21vdGUgdG8gYSAzMmJpdCBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBJTU04X01FTSAgICAoUkQyKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAzMDBfT1BFUkFORF9NRU1BRERSfSwKLQotLyogSW5kZXggcmVnaXN0ZXIuICAqLwotI2RlZmluZSBSSSAoSU1NOF9NRU0rMSkKLSAgezQsIDQsIE1OMTAzMDBfT1BFUkFORF9SUkVHfSwKLQotLyogMjQgYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQsIG1heSBwcm9tb3RlIHRvIDMyYml0IGRpc3BhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0QyNCAgICAoUkkrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF8yNEJJVCB8IE1OMTAzMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDI0IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAzMmJpdAotICAgdW5zaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgSU1NMjQgICAgKFNEMjQrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF8yNEJJVCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMjQgYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gYSAzMmJpdAotICAgc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIFNJTU0yNCAgICAoSU1NMjQrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF8yNEJJVCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDE2Yml0IHVuc2lnbmVkIGRpc3BhY2VtZW50IGluIGEgbWVtb3J5IG9wZXJhdGlvbiB3aGljaAotICAgbWF5IHByb21vdGUgdG8gYSAzMmJpdCBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBJTU0yNF9NRU0gICAgKFNJTU0yNCsxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EXzI0QklUIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEUgfCBNTjEwMzAwX09QRVJBTkRfTUVNQUREUn0sCi0vKiAzMmJpdCBpbW1lZGlhdGUsIGhpZ2ggMjQgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbgotICAgd29yZCwgOCBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQuCi0KLSAgIFRoZSAiYml0cyIgZmllbGQgaW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIGluIHRoZQotICAgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQhICAqLwotI2RlZmluZSBJTU0zMl9ISUdIOCAgICAoSU1NMjRfTUVNKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVR9LAotCi0vKiBTaW1pbGFybHksIGJ1dCBhIG1lbW9yeSBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgSU1NMzJfSElHSDhfTUVNICAoSU1NMzJfSElHSDgrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9NRU1BRERSfSwKLQotLyogcm0gcmVnaXN0ZXIgaW4gdGhlIHNldmVudGggcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIFJNNiAgICAgIChJTU0zMl9ISUdIOF9NRU0rMSkKLSAgezQsIDEyLCBNTjEwMzAwX09QRVJBTkRfUlJFR30sCi0KLS8qIHJtIHJlZ2lzdGVyIGluIHRoZSBmaWZ0aCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgUk40ICAgICAgKFJNNisxKQotICB7NCwgOCwgTU4xMDMwMF9PUEVSQU5EX1JSRUd9LAotCi0vKiA0IGJpdCBpbW1lZGlhdGUgZm9yIGRzcCBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBJTU00XzIgICAgKFJONCsxKQotICB7NCwgNCwgMH0sCi0KLS8qIDQgYml0IGltbWVkaWF0ZSBmb3IgZHNwIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIFNJTU00XzIgICAgKElNTTRfMisxKQotICB7NCwgNCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDQgYml0IGltbWVkaWF0ZSBmb3IgZHNwIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIFNJTU00XzYgICAgKFNJTU00XzIrMSkKLSAgezQsIDEyLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEfSwKLQotfSA7IAotCi0jZGVmaW5lIE1FTShBRERSKSBQQVJFTiwgQUREUiwgUEFSRU4gCi0jZGVmaW5lIE1FTUlOQyhBRERSKSBQQVJFTiwgQUREUiwgUExVUywgUEFSRU4gCi0jZGVmaW5lIE1FTUlOQzIoQUREUixJTkMpIFBBUkVOLCBBRERSLCBQTFVTLCBJTkMsIFBBUkVOIAotI2RlZmluZSBNRU0yKEFERFIxLEFERFIyKSBQQVJFTiwgQUREUjEsIEFERFIyLCBQQVJFTiAKLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRQkJT1BDT0RFCQlNQVNLCU1BVENIX01BU0ssIEZPUk1BVCwgUFJPQ0VTU09SCXsgT1BFUkFORFMgfQotCi0gICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QQ09ERSBpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgotICAgTUFTSyBpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKLSAgICAgd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLSAgIE9QRVJBTkRTIGlzIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotCi0gICBUaGUgZGlzYXNzZW1ibGVyIHJlYWRzIHRoZSB0YWJsZSBpbiBvcmRlciBhbmQgcHJpbnRzIHRoZSBmaXJzdAotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF0Y2hlcywgc28gdGhpcyB0YWJsZSBpcyBzb3J0ZWQgdG8gcHV0IG1vcmUKLSAgIHNwZWNpZmljIGluc3RydWN0aW9ucyBiZWZvcmUgbW9yZSBnZW5lcmFsIGluc3RydWN0aW9ucy4gIEl0IGlzIGFsc28KLSAgIHNvcnRlZCBieSBtYWpvciBvcGNvZGUuICAqLwotCi1jb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgbW4xMDMwMF9vcGNvZGVzW10gPSB7Ci17ICJtb3YiLAkweDgwMDAsCSAgICAgMHhmMDAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NJTU04LCBETjAxfX0sCi17ICJtb3YiLAkweDgwLAkgICAgIDB4ZjAsCSAgMHgzLCAgRk1UX1MwLCAwLAl7RE0xLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjFlMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjFkMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBETjB9fSwKLXsgIm1vdiIsCTB4OTAwMCwJICAgICAweGYwMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7SU1NOCwgQU4wMX19LAoteyAibW92IiwJMHg5MCwJICAgICAweGYwLAkgIDB4MywgIEZNVF9TMCwgMCwJe0FNMSwgQU4wfX0sCi17ICJtb3YiLAkweDNjLAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7U1AsIEFOMH19LAoteyAibW92IiwJMHhmMmYwLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIFNQfX0sCi17ICJtb3YiLAkweGYyZTQsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe1BTVywgRE4wfX0sCi17ICJtb3YiLAkweGYyZjMsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgUFNXfX0sCi17ICJtb3YiLAkweGYyZTAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe01EUiwgRE4wfX0sCi17ICJtb3YiLAkweGYyZjIsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTURSfX0sCi17ICJtb3YiLAkweDcwLAkgICAgIDB4ZjAsCSAgMCwgICAgRk1UX1MwLCAwLAl7TUVNKEFNMCksIEROMX19LAoteyAibW92IiwJMHg1ODAwLAkgICAgIDB4ZmNmZiwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0oU1ApLCBETjB9fSwKLXsgIm1vdiIsCTB4MzAwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7TUVNKElNTTE2X01FTSksIEROMH19LAoteyAibW92IiwJMHhmMDAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0oQU0wKSwgQU4xfX0sCi17ICJtb3YiLAkweDVjMDAsCSAgICAgMHhmY2ZmLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTShTUCksIEFOMH19LAoteyAibW92IiwJMHhmYWEwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0oSU1NMTZfTUVNKSwgQU4wfX0sCi17ICJtb3YiLAkweDYwLAkgICAgIDB4ZjAsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE0xLCBNRU0oQU4wKX19LAoteyAibW92IiwJMHg0MjAwLAkgICAgIDB4ZjNmZiwJICAwLCAgICBGTVRfUzEsIDAsCXtETTEsIE1FTShTUCl9fSwKLXsgIm1vdiIsCTB4MDEwMDAwLCAgICAweGYzMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7RE0xLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92IiwJMHhmMDEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIE1FTShBTjApfX0sCi17ICJtb3YiLAkweDQzMDAsCSAgICAgMHhmM2ZmLAkgIDAsICAgIEZNVF9TMSwgMCwJe0FNMSwgTUVNKFNQKX19LAoteyAibW92IiwJMHhmYTgwMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtBTTEsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3YiLAkweDVjMDAsCSAgICAgMHhmYzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTTIoSU1NOCwgU1ApLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjgwMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihTRDgsIEFNMCksIEROMX19LAoteyAibW92IiwJMHhmYTAwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKFNEMTYsIEFNMCksIEROMX19LAoteyAibW92IiwJMHg1ODAwLAkgICAgIDB4ZmMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0yKElNTTgsIFNQKSwgRE4wfX0sCi17ICJtb3YiLAkweGZhYjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoSU1NMTYsIFNQKSwgRE4wfX0sCi17ICJtb3YiLAkweGYzMDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEROMn19LAoteyAibW92IiwJMHhmODIwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKFNEOCxBTTApLCBBTjF9fSwKLXsgIm1vdiIsCTB4ZmEyMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihTRDE2LCBBTTApLCBBTjF9fSwKLXsgIm1vdiIsCTB4ZmFiMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihJTU0xNiwgU1ApLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjM4MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNMihESSwgQU0wKSwgQU4yfX0sCi17ICJtb3YiLAkweDQzMDAsCSAgICAgMHhmMzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe0FNMSwgTUVNMihJTU04LCBTUCl9fSwKLXsgIm1vdiIsCTB4ZjgxMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKFNEOCwgQU4wKX19LAoteyAibW92IiwJMHhmYTEwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoU0QxNiwgQU4wKX19LAoteyAibW92IiwJMHg0MjAwLAkgICAgIDB4ZjMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtETTEsIE1FTTIoSU1NOCwgU1ApfX0sCi17ICJtb3YiLAkweGZhOTEwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihJTU0xNiwgU1ApfX0sCi17ICJtb3YiLAkweGYzNDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMiwgTUVNMihESSwgQU4wKX19LAoteyAibW92IiwJMHhmODMwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtBTTEsIE1FTTIoU0Q4LCBBTjApfX0sCi17ICJtb3YiLAkweGZhMzAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0FNMSwgTUVNMihTRDE2LCBBTjApfX0sCi17ICJtb3YiLAkweGZhOTAwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0FNMSwgTUVNMihJTU0xNiwgU1ApfX0sCi17ICJtb3YiLAkweGYzYzAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMiwgTUVNMihESSwgQU4wKX19LAotCi17ICJtb3YiLAkweGYwMjAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe1VTUCwgQU4wfX0sCi17ICJtb3YiLAkweGYwMjQsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe1NTUCwgQU4wfX0sCi17ICJtb3YiLAkweGYwMjgsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe01TUCwgQU4wfX0sCi17ICJtb3YiLAkweGYwMmMsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe1BDLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjAzMCwJICAgICAweGZmZjMsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7QU4xLCBVU1B9fSwKLXsgIm1vdiIsCTB4ZjAzMSwJICAgICAweGZmZjMsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7QU4xLCBTU1B9fSwKLXsgIm1vdiIsCTB4ZjAzMiwJICAgICAweGZmZjMsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7QU4xLCBNU1B9fSwKLXsgIm1vdiIsCTB4ZjJlYywJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7RVBTVywgRE4wfX0sCi17ICJtb3YiLAkweGYyZjEsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0RNMSwgRVBTV319LAoteyAibW92IiwJMHhmNTAwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtBTTIsIFJOMH19LAoteyAibW92IiwJMHhmNTQwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtETTIsIFJOMH19LAoteyAibW92IiwJMHhmNTgwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtSTTEsIEFOMH19LAoteyAibW92IiwJMHhmNWMwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtSTTEsIEROMH19LAoteyAibW92IiwJMHhmOTA4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibW92IiwJMHhmOWU4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtYUk0yLCBSTjB9fSwKLXsgIm1vdiIsCTB4ZjlmODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBYUk4wfX0sCi17ICJtb3YiLAkweGY5MGEwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe01FTShSTTApLCBSTjJ9fSwKLXsgIm1vdiIsCTB4Zjk4YTAwLCAgICAweGZmZmYwZiwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7TUVNKFNQKSwgUk4yfX0sCi17ICJtb3YiLAkweGY5NmEwMCwgICAgMHhmZmZmMDAsICAgIDB4MTIsIEZNVF9ENiwgQU0zMywJe01FTUlOQyhSTTApLCBSTjJ9fSwKLXsgIm1vdiIsCTB4ZmIwZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNKElNTThfTUVNKSwgUk4yfX0sCi17ICJtb3YiLAkweGZkMGUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe01FTShJTU0yNF9NRU0pLCBSTjJ9fSwKLXsgIm1vdiIsCTB4ZjkxYTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBNRU0oUk4wKX19LAoteyAibW92IiwJMHhmOTlhMDAsICAgIDB4ZmZmZjBmLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIE1FTShTUCl9fSwKLXsgIm1vdiIsCTB4Zjk3YTAwLCAgICAweGZmZmYwMCwgICAgMCwJRk1UX0Q2LCBBTTMzLAl7Uk0yLCBNRU1JTkMoUk4wKX19LAoteyAibW92IiwJMHhmYjFlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTShJTU04X01FTSl9fSwKLXsgIm1vdiIsCTB4ZmQxZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0oSU1NMjRfTUVNKX19LAoteyAibW92IiwJMHhmYjBhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFNEOCwgUk0wKSwgUk4yfX0sCi17ICJtb3YiLAkweGZkMGEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe01FTTIoU0QyNCwgUk0wKSwgUk4yfX0sCi17ICJtb3YiLAkweGZiOGUwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTTIoUkksIFJNMCksIFJEMn19LAoteyAibW92IiwJMHhmYjFhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTTIoU0Q4LCBSTjApfX0sCi17ICJtb3YiLAkweGZkMWEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1JNMiwgTUVNMihTRDI0LCBSTjApfX0sCi17ICJtb3YiLAkweGZiOGEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTTIoU0Q4LCBTUCksIFJOMn19LAoteyAibW92IiwJMHhmZDhhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0yKFNEMjQsIFNQKSwgUk4yfX0sCi17ICJtb3YiLAkweGZiOWEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgTUVNMihTRDgsIFNQKX19LAoteyAibW92IiwJMHhmZDlhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTTIoU0QyNCwgU1ApfX0sCi17ICJtb3YiLAkweGZiOWUwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JEMiwgTUVNMihSSSwgUk4wKX19LAoteyAibW92IiwJMHhmYjZhMDAwMCwgIDB4ZmZmZjAwMDAsICAweDIyLCBGTVRfRDcsIEFNMzMsCXtNRU1JTkMyIChSTTAsIFNJTU04KSwgUk4yfX0sCi17ICJtb3YiLAkweGZiN2EwMDAwLCAgMHhmZmZmMDAwMCwgIDAsCUZNVF9ENywgQU0zMywJe1JNMiwgTUVNSU5DMiAoUk4wLCBTSU1NOCl9fSwKLXsgIm1vdiIsCTB4ZmQ2YTAwMDAsICAweGZmZmYwMDAwLCAgMHgyMiwgRk1UX0Q4LCBBTTMzLAl7TUVNSU5DMiAoUk0wLCBJTU0yNCksIFJOMn19LAoteyAibW92IiwJMHhmZDdhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLAlGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTUlOQzIgKFJOMCwgSU1NMjQpfX0sCi17ICJtb3YiLAkweGZlNmEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MjIsIEZNVF9EOSwgQU0zMywJe01FTUlOQzIgKFJNMCwgSU1NMzJfSElHSDgpLCBSTjJ9fSwKLXsgIm1vdiIsCTB4ZmU3YTAwMDAsICAweGZmZmYwMDAwLCAgMCwJRk1UX0Q5LCBBTTMzLAl7Uk4yLCBNRU1JTkMyIChSTTAsIElNTTMyX0hJR0g4KX19LAotLyogVGhlc2UgbXVzdCBjb21lIGFmdGVyIG1vc3Qgb2YgdGhlIG90aGVyIG1vdmUgaW5zdHJ1Y3Rpb25zIHRvIGF2b2lkIG1hdGNoaW5nCi0gICBhIHN5bWJvbGljIG5hbWUgd2l0aCBJTU14eCBvcGVyYW5kcy4gIFVnaC4gICovCi17ICJtb3YiLAkweDJjMDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe1NJTU0xNiwgRE4wfX0sCi17ICJtb3YiLAkweGZjY2MwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgIm1vdiIsCTB4MjQwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7SU1NMTYsIEFOMH19LAoteyAibW92IiwJMHhmY2RjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgQU4wfX0sCi17ICJtb3YiLAkweGZjYTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTShJTU0zMl9NRU0pLCBETjB9fSwKLXsgIm1vdiIsCTB4ZmNhMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNKElNTTMyX01FTSksIEFOMH19LAoteyAibW92IiwJMHhmYzgxMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTShJTU0zMl9NRU0pfX0sCi17ICJtb3YiLAkweGZjODAwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0FNMSwgTUVNKElNTTMyX01FTSl9fSwKLXsgIm1vdiIsCTB4ZmMwMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMixBTTApLCBETjF9fSwKLXsgIm1vdiIsCTB4ZmNiNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMiwgU1ApLCBETjB9fSwKLXsgIm1vdiIsCTB4ZmMyMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMixBTTApLCBBTjF9fSwKLXsgIm1vdiIsCTB4ZmNiMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMiwgU1ApLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZmMxMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLEFOMCl9fSwKLXsgIm1vdiIsCTB4ZmM5MTAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLCBTUCl9fSwKLXsgIm1vdiIsCTB4ZmMzMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7QU0xLCBNRU0yKElNTTMyLEFOMCl9fSwKLXsgIm1vdiIsCTB4ZmM5MDAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7QU0xLCBNRU0yKElNTTMyLCBTUCl9fSwKLS8qIFRoZXNlIG5vbi1wcm9tb3RpbmcgdmFyaWFudHMgbmVlZCB0byBjb21lIGFmdGVyIGFsbCB0aGUgb3RoZXIgbWVtb3J5Ci0gICBtb3Zlcy4gICovCi17ICJtb3YiLAkweGY4ZjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMCwJe01FTTIoU0Q4TiwgQU0wKSwgU1B9fSwKLXsgIm1vdiIsCTB4ZjhmNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMwLAl7U1AsIE1FTTIoU0Q4TiwgQU4wKX19LAotLyogVGhlc2UgYXJlIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBub24tcHJvbW90aW5nIHZlcnNpb25zLiAgVGhlIGFtMzMKLSAgIGRvZXMgbm90IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBvZmZzZXRzIHVzZWQgdG8gbG9hZC9zdG9yZSB0aGUgc3RhY2sKLSAgIHBvaW50ZXIuICAqLwoteyAibW92IiwJMHhmOGYwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzMsCXtNRU0yKFNEOCwgQU0wKSwgU1B9fSwKLXsgIm1vdiIsCTB4ZjhmNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMzLAl7U1AsIE1FTTIoU0Q4LCBBTjApfX0sCi0vKiBUaGVzZSBtdXN0IGNvbWUgbGFzdCBzbyB0aGF0IHdlIGZhdm9yIHNob3J0ZXIgbW92ZSBpbnN0cnVjdGlvbnMgZm9yCi0gICBsb2FkaW5nIGltbWVkaWF0ZXMgaW50byBkMC1kMy9hMC1hMy4gICovCi17ICJtb3YiLAkweGZiMDgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBSTjAyfX0sCi17ICJtb3YiLAkweGZkMDgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAibW92IiwJMHhmZTA4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAibW92IiwJMHhmYmY4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgWFJOMDJ9fSwKLXsgIm1vdiIsCTB4ZmRmODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBYUk4wMn19LAoteyAibW92IiwJMHhmZWY4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgWFJOMDJ9fSwKLXsgIm1vdiIsCTB4ZmUwZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7TUVNKElNTTMyX0hJR0g4X01FTSksIFJOMn19LAoteyAibW92IiwJMHhmZTFlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTShJTU0zMl9ISUdIOF9NRU0pfX0sCi17ICJtb3YiLAkweGZlMGEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe01FTTIoSU1NMzJfSElHSDgsUk0wKSwgUk4yfX0sCi17ICJtb3YiLAkweGZlMWEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe1JNMiwgTUVNMihJTU0zMl9ISUdIOCwgUk4wKX19LAoteyAibW92IiwJMHhmZThhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0yKElNTTMyX0hJR0g4LCBTUCksIFJOMn19LAoteyAibW92IiwJMHhmZTlhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTTIoSU1NMzJfSElHSDgsIFNQKX19LAotCi17ICJtb3Z1IiwJMHhmYjE4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJtb3Z1IiwJMHhmZDE4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAibW92dSIsCTB4ZmUxODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAibWNzdDkiLAkweGY2MzAsICAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0ROMDF9fSwKLXsgIm1jc3Q0OCIsCTB4ZjY2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7RE4wMX19LAoteyAic3dhcCIsCTB4ZjY4MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7RE0xLCBETjB9fSwKLXsgInN3YXAiLAkweGY5Y2IwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJzd2FwaCIsCTB4ZjY5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7RE0xLCBETjB9fSwKLXsgInN3YXBoIiwJMHhmOWRiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiZ2V0Y2h4IiwJMHhmNmMwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzMsCXtETjAxfX0sCi17ICJnZXRjbHgiLAkweGY2ZDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMywJe0ROMDF9fSwKLXsgIm1hYyIsCTB4ZmIwZjAwMDAsICAweGZmZmYwMDAwLCAgMHhjLCAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMiwgUkQwfX0sCi17ICJtYWMiLAkweGY5MGIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJtYWMiLAkweGZiMGIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBSTjAyfX0sCi17ICJtYWMiLAkweGZkMGIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAibWFjIiwJMHhmZTBiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAibWFjdSIsCTB4ZmIxZjAwMDAsICAweGZmZmYwMDAwLCAgMHhjLCAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMiwgUkQwfX0sCi17ICJtYWN1IiwJMHhmOTFiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibWFjdSIsCTB4ZmIxYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAibWFjdSIsCTB4ZmQxYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgIm1hY3UiLAkweGZlMWIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJtYWNiIiwJMHhmYjJmMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJtYWNiIiwJMHhmOTJiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibWFjYiIsCTB4ZmIyYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgIm1hY2IiLAkweGZkMmIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAibWFjYiIsCTB4ZmUyYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgIm1hY2J1IiwJMHhmYjNmMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJtYWNidSIsCTB4ZjkzYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm1hY2J1IiwJMHhmYjNiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJtYWNidSIsCTB4ZmQzYjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgIm1hY2J1IiwJMHhmZTNiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAibWFjaCIsCTB4ZmI0ZjAwMDAsICAweGZmZmYwMDAwLCAgMHhjLCAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMiwgUkQwfX0sCi17ICJtYWNoIiwJMHhmOTRiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibWFjaCIsCTB4ZmI0YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7U0lNTTgsIFJOMDJ9fSwKLXsgIm1hY2giLAkweGZkNGIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAibWFjaCIsCTB4ZmU0YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgIm1hY2h1IiwJMHhmYjVmMDAwMCwgIDB4ZmZmZjAwMDAsICAweGMsICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyLCBSRDB9fSwKLXsgIm1hY2h1IiwJMHhmOTViMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibWFjaHUiLAkweGZiNWIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgIm1hY2h1IiwJMHhmZDViMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAibWFjaHUiLAkweGZlNWIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJkbWFjaCIsCTB4ZmI2ZjAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAiZG1hY2giLAkweGY5NmIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJkbWFjaCIsCTB4ZmU2YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgImRtYWNodSIsCTB4ZmI3ZjAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAiZG1hY2h1IiwJMHhmOTdiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiZG1hY2h1IiwJMHhmZTdiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAiZG11bGgiLAkweGZiOGYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YywgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDIsIFJEMH19LAoteyAiZG11bGgiLAkweGY5OGIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJkbXVsaCIsCTB4ZmU4YjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgImRtdWxodSIsCTB4ZmI5ZjAwMDAsICAweGZmZmYwMDAwLCAgMHhjLCAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMiwgUkQwfX0sCi17ICJkbXVsaHUiLAkweGY5OWIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJkbXVsaHUiLAkweGZlOWIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi17ICJtY3N0ZSIsCTB4ZjliYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm1jc3RlIiwJMHhmYmJiMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJzd2h3IiwJMHhmOWViMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAotCi17ICJtb3ZidSIsCTB4ZjA0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNKEFNMCksIEROMX19LAoteyAibW92YnUiLAkweGY4NDAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LCBBTTApLCBETjF9fSwKLXsgIm1vdmJ1IiwJMHhmYTQwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKFNEMTYsIEFNMCksIEROMX19LAoteyAibW92YnUiLAkweGY4YjgwMCwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTShTUCksIEROMH19LAoteyAibW92YnUiLAkweGY4YjgwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoSU1NOCwgU1ApLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmYWI4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKElNTTE2LCBTUCksIEROMH19LAoteyAibW92YnUiLAkweGY0MDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEROMn19LAoteyAibW92YnUiLAkweDM0MDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe01FTShJTU0xNl9NRU0pLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmMDUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1FTShBTjApfX0sCi17ICJtb3ZidSIsCTB4Zjg1MDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKFNEOCwgQU4wKX19LAoteyAibW92YnUiLAkweGZhNTAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihTRDE2LCBBTjApfX0sCi17ICJtb3ZidSIsCTB4Zjg5MjAwLCAgICAweGZmZjNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0oU1ApfX0sCi17ICJtb3ZidSIsCTB4Zjg5MjAwLCAgICAweGZmZjMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKElNTTgsIFNQKX19LAoteyAibW92YnUiLAkweGZhOTIwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihJTU0xNiwgU1ApfX0sCi17ICJtb3ZidSIsCTB4ZjQ0MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0yLCBNRU0yKERJLCBBTjApfX0sCi17ICJtb3ZidSIsCTB4MDIwMDAwLCAgICAweGYzMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7RE0xLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92YnUiLAkweGY5MmEwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe01FTShSTTApLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmOTNhMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIE1FTShSTjApfX0sCi17ICJtb3ZidSIsCTB4ZjlhYTAwLCAgICAweGZmZmYwZiwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7TUVNKFNQKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZjliYTAwLCAgICAweGZmZmYwZiwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBNRU0oU1ApfX0sCi17ICJtb3ZidSIsCTB4ZmIyYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNMihTRDgsIFJNMCksIFJOMn19LAoteyAibW92YnUiLAkweGZkMmEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe01FTTIoU0QyNCwgUk0wKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmIzYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU0yKFNEOCwgUk4wKX19LAoteyAibW92YnUiLAkweGZkM2EwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1JNMiwgTUVNMihTRDI0LCBSTjApfX0sCi17ICJtb3ZidSIsCTB4ZmJhYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNMihTRDgsIFNQKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmRhYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7TUVNMihTRDI0LCBTUCksIFJOMn19LAoteyAibW92YnUiLAkweGZiYmEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgTUVNMihTRDgsIFNQKX19LAoteyAibW92YnUiLAkweGZkYmEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1JNMiwgTUVNMihTRDI0LCBTUCl9fSwKLXsgIm1vdmJ1IiwJMHhmYjJlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0oSU1NOF9NRU0pLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmZDJlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0oSU1NMjRfTUVNKSwgUk4yfX0sCi17ICJtb3ZidSIsCTB4ZmIzZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU0oSU1NOF9NRU0pfX0sCi17ICJtb3ZidSIsCTB4ZmQzZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0oSU1NMjRfTUVNKX19LAoteyAibW92YnUiLAkweGZiYWUwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTTIoUkksIFJNMCksIFJEMn19LAoteyAibW92YnUiLAkweGZiYmUwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JEMiwgTUVNMihSSSwgUk4wKX19LAoteyAibW92YnUiLAkweGZjNDAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsQU0wKSwgRE4xfX0sCi17ICJtb3ZidSIsCTB4ZmNiODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMiwgU1ApLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmY2E4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0oSU1NMzJfTUVNKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZmM1MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLEFOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmYzkyMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsIFNQKX19LAoteyAibW92YnUiLAkweGZjODIwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNKElNTTMyX01FTSl9fSwKLXsgIm1vdmJ1IiwJMHhmZTJhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0yKElNTTMyX0hJR0g4LFJNMCksIFJOMn19LAoteyAibW92YnUiLAkweGZlM2EwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe1JNMiwgTUVNMihJTU0zMl9ISUdIOCwgUk4wKX19LAoteyAibW92YnUiLAkweGZlYWEwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe01FTTIoSU1NMzJfSElHSDgsU1ApLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmZWJhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTTIoSU1NMzJfSElHSDgsIFNQKX19LAoteyAibW92YnUiLAkweGZlMmUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe01FTShJTU0zMl9ISUdIOF9NRU0pLCBSTjJ9fSwKLXsgIm1vdmJ1IiwJMHhmZTNlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTShJTU0zMl9ISUdIOF9NRU0pfX0sCi0KLXsgIm1vdmh1IiwJMHhmMDYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0oQU0wKSwgRE4xfX0sCi17ICJtb3ZodSIsCTB4Zjg2MDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihTRDgsIEFNMCksIEROMX19LAoteyAibW92aHUiLAkweGZhNjAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoU0QxNiwgQU0wKSwgRE4xfX0sCi17ICJtb3ZodSIsCTB4ZjhiYzAwLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNKFNQKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZjhiYzAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihJTU04LCBTUCksIEROMH19LAoteyAibW92aHUiLAkweGZhYmMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoSU1NMTYsIFNQKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZjQ4MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNMihESSwgQU0wKSwgRE4yfX0sCi17ICJtb3ZodSIsCTB4MzgwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7TUVNKElNTTE2X01FTSksIEROMH19LAoteyAibW92aHUiLAkweGYwNzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKLXsgIm1vdmh1IiwJMHhmODcwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTTIoU0Q4LCBBTjApfX0sCi17ICJtb3ZodSIsCTB4ZmE3MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKFNEMTYsIEFOMCl9fSwKLXsgIm1vdmh1IiwJMHhmODkzMDAsICAgIDB4ZmZmM2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTShTUCl9fSwKLXsgIm1vdmh1IiwJMHhmODkzMDAsICAgIDB4ZmZmMzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTTIoSU1NOCwgU1ApfX0sCi17ICJtb3ZodSIsCTB4ZmE5MzAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKElNTTE2LCBTUCl9fSwKLXsgIm1vdmh1IiwJMHhmNGMwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTIsIE1FTTIoREksIEFOMCl9fSwKLXsgIm1vdmh1IiwJMHgwMzAwMDAsICAgIDB4ZjMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtETTEsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3ZodSIsCTB4Zjk0YTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7TUVNKFJNMCksIFJOMn19LAoteyAibW92aHUiLAkweGY5NWEwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgTUVNKFJOMCl9fSwKLXsgIm1vdmh1IiwJMHhmOWNhMDAsICAgIDB4ZmZmZjBmLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtNRU0oU1ApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmOWRhMDAsICAgIDB4ZmZmZjBmLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIE1FTShTUCl9fSwKLXsgIm1vdmh1IiwJMHhmOWVhMDAsICAgIDB4ZmZmZjAwLCAgICAweDEyLCBGTVRfRDYsIEFNMzMsCXtNRU1JTkMoUk0wKSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZjlmYTAwLCAgICAweGZmZmYwMCwgICAgMCwJRk1UX0Q2LCBBTTMzLAl7Uk0yLCBNRU1JTkMoUk4wKX19LAoteyAibW92aHUiLAkweGZiNGEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTTIoU0Q4LCBSTTApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmZDRhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtNRU0yKFNEMjQsIFJNMCksIFJOMn19LAoteyAibW92aHUiLAkweGZiNWEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgTUVNMihTRDgsIFJOMCl9fSwKLXsgIm1vdmh1IiwJMHhmZDVhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTTIoU0QyNCwgUk4wKX19LAoteyAibW92aHUiLAkweGZiY2EwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTTIoU0Q4LCBTUCksIFJOMn19LAoteyAibW92aHUiLAkweGZkY2EwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe01FTTIoU0QyNCwgU1ApLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmYmRhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTTIoU0Q4LCBTUCl9fSwKLXsgIm1vdmh1IiwJMHhmZGRhMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTTIoU0QyNCwgU1ApfX0sCi17ICJtb3ZodSIsCTB4ZmI0ZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNKElNTThfTUVNKSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZmQ0ZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7TUVNKElNTTI0X01FTSksIFJOMn19LAoteyAibW92aHUiLAkweGZiY2UwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTTIoUkksIFJNMCksIFJEMn19LAoteyAibW92aHUiLAkweGZiZGUwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JEMiwgTUVNMihSSSwgUk4wKX19LAoteyAibW92aHUiLAkweGZjNjAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsQU0wKSwgRE4xfX0sCi17ICJtb3ZodSIsCTB4ZmNiYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMiwgU1ApLCBETjB9fSwKLXsgIm1vdmh1IiwJMHhmY2FjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0oSU1NMzJfTUVNKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZmM3MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLEFOMCl9fSwKLXsgIm1vdmh1IiwJMHhmYzkzMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsIFNQKX19LAoteyAibW92aHUiLAkweGZjODMwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNKElNTTMyX01FTSl9fSwKLXsgIm1vdmh1IiwJMHhmZTRhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0yKElNTTMyX0hJR0g4LFJNMCksIFJOMn19LAoteyAibW92aHUiLAkweGZlNWEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe1JNMiwgTUVNMihJTU0zMl9ISUdIOCwgUk4wKX19LAoteyAibW92aHUiLAkweGZlY2EwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe01FTTIoSU1NMzJfSElHSDgsIFNQKSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZmVkYTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7Uk0yLCBNRU0yKElNTTMyX0hJR0g4LCBTUCl9fSwKLXsgIm1vdmh1IiwJMHhmZTRlMDAwMCwgIDB4ZmZmZjBmMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0oSU1NMzJfSElHSDhfTUVNKSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZmI1ZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU0oSU1NOF9NRU0pfX0sCi17ICJtb3ZodSIsCTB4ZmQ1ZTAwMDAsICAweGZmZmYwZjAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0oSU1NMjRfTUVNKX19LAoteyAibW92aHUiLAkweGZlNWUwMDAwLCAgMHhmZmZmMGYwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe1JNMiwgTUVNKElNTTMyX0hJR0g4X01FTSl9fSwKLXsgIm1vdmh1IiwJMHhmYmVhMDAwMCwgIDB4ZmZmZjAwMDAsICAweDIyLCBGTVRfRDcsIEFNMzMsCXtNRU1JTkMyIChSTTAsIFNJTU04KSwgUk4yfX0sCi17ICJtb3ZodSIsCTB4ZmJmYTAwMDAsICAweGZmZmYwMDAwLCAgMCwJRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU1JTkMyIChSTjAsIFNJTU04KX19LAoteyAibW92aHUiLAkweGZkZWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MjIsIEZNVF9EOCwgQU0zMywJe01FTUlOQzIgKFJNMCwgSU1NMjQpLCBSTjJ9fSwKLXsgIm1vdmh1IiwJMHhmZGZhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLAlGTVRfRDgsIEFNMzMsCXtSTTIsIE1FTUlOQzIgKFJOMCwgSU1NMjQpfX0sCi17ICJtb3ZodSIsCTB4ZmVlYTAwMDAsICAweGZmZmYwMDAwLCAgMHgyMiwgRk1UX0Q5LCBBTTMzLAl7TUVNSU5DMiAoUk0wLCBJTU0zMl9ISUdIOCksIFJOMn19LAoteyAibW92aHUiLAkweGZlZmEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsCUZNVF9EOSwgQU0zMywJe1JOMiwgTUVNSU5DMiAoUk0wLCBJTU0zMl9ISUdIOCl9fSwKLQoteyAiZXh0IiwJMHhmMmQwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtETjB9fSwKLXsgImV4dCIsCTB4ZjkxODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJleHRiIiwJMHhmOTI4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiZXh0YiIsCTB4MTAsIAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4wfX0sCi17ICJleHRiIiwJMHhmOTI4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImV4dGJ1IiwJMHhmOTM4MDAsICAgIDB4ZmZmZjAwLAkgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJleHRidSIsCTB4MTQsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLXsgImV4dGJ1IiwJMHhmOTM4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImV4dGgiLAkweGY5NDgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJleHRoIiwJMHgxOCwJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMH19LAoteyAiZXh0aCIsCTB4Zjk0ODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJleHRodSIsCTB4Zjk1ODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImV4dGh1IiwJMHgxYywJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMH19LAoteyAiZXh0aHUiLAkweGY5NTgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAibW92bSIsCTB4Y2UwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7TUVNKFNQKSwgUkVHU319LAoteyAibW92bSIsCTB4Y2YwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7UkVHUywgTUVNKFNQKX19LAoteyAibW92bSIsCTB4ZjhjZTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMzLAl7TUVNKFVTUCksIFJFR1N9fSwKLXsgIm1vdm0iLAkweGY4Y2YwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMywJe1JFR1MsIE1FTShVU1ApfX0sCi0KLXsgImNsciIsCTB4MDAsCSAgICAgMHhmMywJICAwLCAgICBGTVRfUzAsIDAsCXtETjF9fSwKLXsgImNsciIsCTB4Zjk2ODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJhZGQiLAkweGZiN2MwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgImFkZCIsCTB4ZTAsCSAgICAgMHhmMCwJICAwLCAgICBGTVRfUzAsIDAsCXtETTEsIEROMH19LAoteyAiYWRkIiwJMHhmMTYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEFOMH19LAoteyAiYWRkIiwJMHhmMTUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEROMH19LAoteyAiYWRkIiwJMHhmMTcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEFOMH19LAoteyAiYWRkIiwJMHgyODAwLAkgICAgIDB4ZmMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJhZGQiLAkweGZhYzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe1NJTU0xNiwgRE4wfX0sCi17ICJhZGQiLAkweDIwMDAsCSAgICAgMHhmYzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NJTU04LCBBTjB9fSwKLXsgImFkZCIsCTB4ZmFkMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7U0lNTTE2LCBBTjB9fSwKLXsgImFkZCIsCTB4ZjhmZTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIFNQfX0sCi17ICJhZGQiLAkweGZhZmUwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe1NJTU0xNiwgU1B9fSwKLXsgImFkZCIsCTB4Zjk3ODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImFkZCIsCTB4ZmNjMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAiYWRkIiwJMHhmY2QwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgQU4wfX0sCi17ICJhZGQiLAkweGZjZmUwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBTUH19LAoteyAiYWRkIiwJMHhmYjc4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAiYWRkIiwJMHhmZDc4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFJOMDJ9fSwKLXsgImFkZCIsCTB4ZmU3ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAiYWRkYyIsCTB4ZmI4YzAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAiYWRkYyIsCTB4ZjE0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgImFkZGMiLAkweGY5ODgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJhZGRjIiwJMHhmYjg4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAiYWRkYyIsCTB4ZmQ4ODAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7U0lNTTI0LCBSTjAyfX0sCi17ICJhZGRjIiwJMHhmZTg4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJzdWIiLAkweGZiOWMwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgInN1YiIsCTB4ZjEwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInN1YiIsCTB4ZjEyMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBBTjB9fSwKLXsgInN1YiIsCTB4ZjExMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBETjB9fSwKLXsgInN1YiIsCTB4ZjEzMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBBTjB9fSwKLXsgInN1YiIsCTB4Zjk5ODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgInN1YiIsCTB4ZmNjNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAic3ViIiwJMHhmY2Q0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgQU4wfX0sCi17ICJzdWIiLAkweGZiOTgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBSTjAyfX0sCi17ICJzdWIiLAkweGZkOTgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAic3ViIiwJMHhmZTk4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJzdWJjIiwJMHhmYThjMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJzdWJjIiwJMHhmMTgwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAic3ViYyIsCTB4ZjlhODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgInN1YmMiLAkweGZiYTgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBSTjAyfX0sCi17ICJzdWJjIiwJMHhmZGE4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtTSU1NMjQsIFJOMDJ9fSwKLXsgInN1YmMiLAkweGZlYTgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi0KLXsgIm11bCIsCTB4ZmJhZDAwMDAsICAweGZmZmYwMDAwLCAgMHhjLCAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMiwgUkQwfX0sCi17ICJtdWwiLAkweGYyNDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJtdWwiLAkweGY5YTkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJtdWwiLAkweGZiYTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBSTjAyfX0sCi17ICJtdWwiLAkweGZkYTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAibXVsIiwJMHhmZWE5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJtdWx1IiwJMHhmYmJkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGMsICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyLCBSRDB9fSwKLXsgIm11bHUiLAkweGYyNTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJtdWx1IiwJMHhmOWI5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAibXVsdSIsCTB4ZmJiOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAibXVsdSIsCTB4ZmRiOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgIm11bHUiLAkweGZlYjkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi0KLXsgImRpdiIsCTB4ZjI2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgImRpdiIsCTB4ZjljOTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLQoteyAiZGl2dSIsCTB4ZjI3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgImRpdnUiLAkweGY5ZDkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi0KLXsgImluYyIsCTB4NDAsCSAgICAgMHhmMywJICAwLCAgICBGTVRfUzAsIDAsCXtETjF9fSwKLXsgImluYyIsCTB4NDEsCSAgICAgMHhmMywJICAwLCAgICBGTVRfUzAsIDAsCXtBTjF9fSwKLXsgImluYyIsCTB4ZjliODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJpbmM0IiwJMHg1MCwJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0FOMH19LAoteyAiaW5jNCIsCTB4ZjljODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJjbXAiLAkweGEwMDAsCSAgICAgMHhmMDAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NJTU04LCBETjAxfX0sCi17ICJjbXAiLAkweGEwLAkgICAgIDB4ZjAsCSAgMHgzLCAgRk1UX1MwLCAwLAl7RE0xLCBETjB9fSwKLXsgImNtcCIsCTB4ZjFhMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBBTjB9fSwKLXsgImNtcCIsCTB4ZjE5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBETjB9fSwKLXsgImNtcCIsCTB4YjAwMCwJICAgICAweGYwMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7SU1NOCwgQU4wMX19LAoteyAiY21wIiwJMHhiMCwJICAgICAweGYwLAkgIDB4MywgIEZNVF9TMCwgMCwJe0FNMSwgQU4wfX0sCi17ICJjbXAiLAkweGZhYzgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe1NJTU0xNiwgRE4wfX0sCi17ICJjbXAiLAkweGZhZDgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBBTjB9fSwKLXsgImNtcCIsCTB4ZjlkODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImNtcCIsCTB4ZmNjODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAiY21wIiwJMHhmY2Q4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgQU4wfX0sCi17ICJjbXAiLAkweGZiZDgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe1NJTU04LCBSTjAyfX0sCi17ICJjbXAiLAkweGZkZDgwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1NJTU0yNCwgUk4wMn19LAoteyAiY21wIiwJMHhmZWQ4MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJhbmQiLAkweGZiMGQwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgImFuZCIsCTB4ZjIwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgImFuZCIsCTB4ZjhlMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJhbmQiLAkweGZhZTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBETjB9fSwKLXsgImFuZCIsCTB4ZmFmYzAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIFBTV319LAoteyAiYW5kIiwJMHhmY2ZjMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDQsIEFNMzMsCXtJTU0zMiwgRVBTV319LAoteyAiYW5kIiwJMHhmOTA5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiYW5kIiwJMHhmY2UwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJhbmQiLAkweGZiMDkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgImFuZCIsCTB4ZmQwOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgImFuZCIsCTB4ZmUwOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLQoteyAib3IiLAkJMHhmYjFkMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJvciIsCQkweGYyMTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJvciIsCQkweGY4ZTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAib3IiLAkJMHhmYWU0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgRE4wfX0sCi17ICJvciIsCQkweGZhZmQwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBQU1d9fSwKLXsgIm9yIiwJCTB4ZmNmZDAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q0LCBBTTMzLAl7SU1NMzIsIEVQU1d9fSwKLXsgIm9yIiwJCTB4ZjkxOTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgIm9yIiwJCTB4ZmNlNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAib3IiLAkJMHhmYjE5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJvciIsCQkweGZkMTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe0lNTTI0LCBSTjAyfX0sCi17ICJvciIsCQkweGZlMTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe0lNTTMyX0hJR0g4LCBSTjAyfX0sCi0KLXsgInhvciIsCTB4ZmIyZDAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAieG9yIiwJMHhmMjIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAieG9yIiwJMHhmYWU4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgRE4wfX0sCi17ICJ4b3IiLAkweGY5MjkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJ4b3IiLAkweGZjZTgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInhvciIsCTB4ZmIyOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAieG9yIiwJMHhmZDI5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAieG9yIiwJMHhmZTI5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAotCi17ICJub3QiLAkweGYyMzAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe0ROMH19LAoteyAibm90IiwJMHhmOTM5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgImJ0c3QiLAkweGY4ZWMwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAiYnRzdCIsCTB4ZmFlYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIEROMH19LAoteyAiYnRzdCIsCTB4ZmNlYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAotLyogUGxhY2UgdGhlc2UgYmVmb3JlIHRoZSBvbmVzIHdpdGggSU1NOEUgYW5kIFNEOE5fU0hJRlQ4IHNpbmNlIHdlIHdhbnQgdGhlCi0gICB0aGVtIHRvIG1hdGNoIGxhc3Qgc2luY2UgdGhleSBkbyBub3QgcHJvbW90ZS4gICovCi17ICJidHN0IiwJMHhmYmU5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtJTU04LCBSTjAyfX0sCi17ICJidHN0IiwJMHhmZGU5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAiYnRzdCIsCTB4ZmVlOTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgImJ0c3QiLAkweGZlMDIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENSwgMCwJe0lNTThFLCBNRU0oSU1NMzJfTE9XU0hJRlQ4KX19LAoteyAiYnRzdCIsCTB4ZmFmODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAJe0lNTTgsIE1FTTIoU0Q4Tl9TSElGVDgsIEFOMCl9fSwKLQoteyAiYnNldCIsCTB4ZjA4MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBNRU0oQU4wKX19LAoteyAiYnNldCIsCTB4ZmUwMDAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q1LCAwLAl7SU1NOEUsIE1FTShJTU0zMl9MT1dTSElGVDgpfX0sCi17ICJic2V0IiwJMHhmYWYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU04LCBNRU0yKFNEOE5fU0hJRlQ4LCBBTjApfX0sCi0KLXsgImJjbHIiLAkweGYwOTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKLXsgImJjbHIiLAkweGZlMDEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENSwgMCwJe0lNTThFLCBNRU0oSU1NMzJfTE9XU0hJRlQ4KX19LAoteyAiYmNsciIsCTB4ZmFmNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NOCwgTUVNMihTRDhOX1NISUZUOCxBTjApfX0sCi0KLXsgImFzciIsCTB4ZmI0ZDAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBSTjAsIFJEMn19LAoteyAiYXNyIiwJMHhmMmIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAiYXNyIiwJMHhmOGM4MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgImFzciIsCTB4Zjk0OTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLXsgImFzciIsCTB4ZmI0OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7SU1NOCwgUk4wMn19LAoteyAiYXNyIiwJMHhmZDQ5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAiYXNyIiwJMHhmZTQ5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAiYXNyIiwJMHhmOGM4MDEsICAgIDB4ZmZmY2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETjB9fSwKLXsgImFzciIsCTB4ZmI0OTAwMDEsICAweGZmZmYwMGZmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk4wMn19LAotCi17ICJsc3IiLAkweGZiNWQwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JNMiwgUk4wLCBSRDJ9fSwKLXsgImxzciIsCTB4ZjJhMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgImxzciIsCTB4ZjhjNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJsc3IiLAkweGY5NTkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgUk4wfX0sCi17ICJsc3IiLAkweGZiNTkwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENywgQU0zMywJe0lNTTgsIFJOMDJ9fSwKLXsgImxzciIsCTB4ZmQ1OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7SU1NMjQsIFJOMDJ9fSwKLXsgImxzciIsCTB4ZmU1OTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7SU1NMzJfSElHSDgsIFJOMDJ9fSwKLXsgImxzciIsCTB4ZjhjNDAxLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE4wfX0sCi17ICJsc3IiLAkweGZiNTkwMDAxLCAgMHhmZmZmMDBmZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JOMDJ9fSwKLQoteyAiYXNsIiwJMHhmYjZkMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJhc2wiLAkweGYyOTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJhc2wiLAkweGY4YzAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAiYXNsIiwJMHhmOTY5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAoteyAiYXNsIiwJMHhmYjY5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtTSU1NOCwgUk4wMn19LAoteyAiYXNsIiwJMHhmZDY5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDgsIEFNMzMsCXtJTU0yNCwgUk4wMn19LAoteyAiYXNsIiwJMHhmZTY5MDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtJTU0zMl9ISUdIOCwgUk4wMn19LAoteyAiYXNsIiwJMHhmOGMwMDEsICAgIDB4ZmZmY2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETjB9fSwKLXsgImFzbCIsCTB4ZmI2OTAwMDEsICAweGZmZmYwMGZmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk4wMn19LAotCi17ICJhc2wyIiwJMHg1NCwJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMH19LAoteyAiYXNsMiIsCTB4Zjk3OTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk4wMn19LAotCi17ICJyb3IiLAkweGYyODQsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe0ROMH19LAoteyAicm9yIiwJMHhmOTg5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTjAyfX0sCi0KLXsgInJvbCIsCTB4ZjI4MCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE4wfX0sCi17ICJyb2wiLAkweGY5OTkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JOMDJ9fSwKLQoteyAiYmVxIiwJMHhjODAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibmUiLAkweGM5MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJndCIsCTB4YzEwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmdlIiwJMHhjMjAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibGUiLAkweGMzMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJsdCIsCTB4YzAwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmhpIiwJMHhjNTAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJiY2MiLAkweGM2MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJscyIsCTB4YzcwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmNzIiwJMHhjNDAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJidmMiLAkweGY4ZTgwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJ2cyIsCTB4ZjhlOTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYm5jIiwJMHhmOGVhMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibnMiLAkweGY4ZWIwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJyYSIsCTB4Y2EwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAotCi17ICJsZXEiLAkweGQ4LAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsbmUiLAkweGQ5LAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsZ3QiLAkweGQxLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsZ2UiLAkweGQyLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsbGUiLAkweGQzLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsbHQiLAkweGQwLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsaGkiLAkweGQ1LAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsY2MiLAkweGQ2LAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsbHMiLAkweGQ3LAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJsY3MiLAkweGQ0LAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJscmEiLAkweGRhLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi17ICJzZXRsYiIsCTB4ZGIsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLQoteyAiam1wIiwJMHhmMGY0LAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtQQVJFTixBTjAsUEFSRU59fSwKLXsgImptcCIsCTB4Y2MwMDAwLCAgICAweGZmMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7SU1NMTZfUENSRUx9fSwKLXsgImptcCIsCTB4ZGMwMDAwMDAsICAweGZmMDAwMDAwLCAgMCwgICAgRk1UX1M0LCAwLAl7SU1NMzJfSElHSDI0fX0sCi17ICJjYWxsIiwJMHhjZDAwMDAwMCwgIDB4ZmYwMDAwMDAsICAwLCAgICBGTVRfUzQsIDAsCXtEMTZfU0hJRlQsUkVHUyxJTU04RX19LAoteyAiY2FsbCIsCTB4ZGQwMDAwMDAsICAweGZmMDAwMDAwLCAgMCwgICAgRk1UX1M2LCAwLAl7SU1NMzJfSElHSDI0X0xPV1NISUZUMTYsIFJFR1NFX1NISUZUOCxJTU04RX19LAoteyAiY2FsbHMiLAkweGYwZjAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe1BBUkVOLEFOMCxQQVJFTn19LAoteyAiY2FsbHMiLAkweGZhZmYwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2X1BDUkVMfX0sCi17ICJjYWxscyIsCTB4ZmNmZjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzJfUENSRUx9fSwKLQoteyAicmV0IiwJMHhkZjAwMDAsICAgIDB4ZmYwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtSRUdTX1NISUZUOCwgSU1NOH19LAoteyAicmV0ZiIsCTB4ZGUwMDAwLCAgICAweGZmMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7UkVHU19TSElGVDgsIElNTTh9fSwKLXsgInJldHMiLAkweGYwZmMsCSAgICAgMHhmZmZmLAkgIDAsICAgIEZNVF9EMCwgMCwJe1VOVVNFRH19LAoteyAicnRpIiwJMHhmMGZkLAkgICAgIDB4ZmZmZiwJICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLXsgInRyYXAiLAkweGYwZmUsCSAgICAgMHhmZmZmLAkgIDAsICAgIEZNVF9EMCwgMCwJe1VOVVNFRH19LAoteyAicnRtIiwJMHhmMGZmLAkgICAgIDB4ZmZmZiwJICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLXsgIm5vcCIsCTB4Y2IsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLQotLyogVURGIGluc3RydWN0aW9ucy4gICovCi17ICJ1ZGYwMCIsCTB4ZjYwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjAwIiwJMHhmOTAwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwMCIsCTB4ZmIwMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDAiLAkweGZkMDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjAxIiwJMHhmNjEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDEiLAkweGY5MTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjAxIiwJMHhmYjEwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwMSIsCTB4ZmQxMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDIiLAkweGY2MjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwMiIsCTB4ZjkyMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDIiLAkweGZiMjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjAyIiwJMHhmZDIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwMyIsCTB4ZjYzMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjAzIiwJMHhmOTMwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwMyIsCTB4ZmIzMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDMiLAkweGZkMzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA0IiwJMHhmNjQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDQiLAkweGY5NDAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA0IiwJMHhmYjQwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwNCIsCTB4ZmQ0MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDUiLAkweGY2NTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwNSIsCTB4Zjk1MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDUiLAkweGZiNTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA1IiwJMHhmZDUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwNiIsCTB4ZjY2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA2IiwJMHhmOTYwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwNiIsCTB4ZmI2MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDYiLAkweGZkNjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA3IiwJMHhmNjcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDciLAkweGY5NzAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA3IiwJMHhmYjcwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwNyIsCTB4ZmQ3MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDgiLAkweGY2ODAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwOCIsCTB4Zjk4MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDgiLAkweGZiODAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA4IiwJMHhmZDgwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwOSIsCTB4ZjY5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA5IiwJMHhmOTkwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwOSIsCTB4ZmI5MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDkiLAkweGZkOTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjEwIiwJMHhmNmEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTAiLAkweGY5YTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjEwIiwJMHhmYmEwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxMCIsCTB4ZmRhMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTEiLAkweGY2YjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxMSIsCTB4ZjliMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTEiLAkweGZiYjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjExIiwJMHhmZGIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxMiIsCTB4ZjZjMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjEyIiwJMHhmOWMwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxMiIsCTB4ZmJjMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTIiLAkweGZkYzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjEzIiwJMHhmNmQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTMiLAkweGY5ZDAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjEzIiwJMHhmYmQwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxMyIsCTB4ZmRkMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTQiLAkweGY2ZTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxNCIsCTB4ZjllMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTQiLAkweGZiZTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjE0IiwJMHhmZGUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxNSIsCTB4ZjZmMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjE1IiwJMHhmOWYwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxNSIsCTB4ZmJmMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTUiLAkweGZkZjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjIwIiwJMHhmNTAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjEiLAkweGY1MTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyMiIsCTB4ZjUyMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjIzIiwJMHhmNTMwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjQiLAkweGY1NDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyNSIsCTB4ZjU1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI2IiwJMHhmNTYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjciLAkweGY1NzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyOCIsCTB4ZjU4MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI5IiwJMHhmNTkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzAiLAkweGY1YTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzMSIsCTB4ZjViMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjMyIiwJMHhmNWMwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzMiLAkweGY1ZDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzNCIsCTB4ZjVlMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjM1IiwJMHhmNWYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmdTAwIiwJMHhmOTA0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwMCIsCTB4ZmIwNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDAiLAkweGZkMDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwMSIsCTB4ZjkxNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDEiLAkweGZiMTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTAxIiwJMHhmZDE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDIiLAkweGY5MjQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTAyIiwJMHhmYjI0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwMiIsCTB4ZmQyNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTAzIiwJMHhmOTM0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwMyIsCTB4ZmIzNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDMiLAkweGZkMzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwNCIsCTB4Zjk0NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDQiLAkweGZiNDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA0IiwJMHhmZDQ0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDUiLAkweGY5NTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA1IiwJMHhmYjU0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwNSIsCTB4ZmQ1NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA2IiwJMHhmOTY0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwNiIsCTB4ZmI2NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDYiLAkweGZkNjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwNyIsCTB4Zjk3NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDciLAkweGZiNzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA3IiwJMHhmZDc0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDgiLAkweGY5ODQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA4IiwJMHhmYjg0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwOCIsCTB4ZmQ4NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA5IiwJMHhmOTk0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwOSIsCTB4ZmI5NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDkiLAkweGZkOTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxMCIsCTB4ZjlhNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTAiLAkweGZiYTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTEwIiwJMHhmZGE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTEiLAkweGY5YjQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTExIiwJMHhmYmI0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxMSIsCTB4ZmRiNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTEyIiwJMHhmOWM0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxMiIsCTB4ZmJjNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTIiLAkweGZkYzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxMyIsCTB4ZjlkNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTMiLAkweGZiZDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTEzIiwJMHhmZGQ0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTQiLAkweGY5ZTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTE0IiwJMHhmYmU0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxNCIsCTB4ZmRlNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTE1IiwJMHhmOWY0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxNSIsCTB4ZmJmNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTUiLAkweGZkZjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLQoteyAicHV0eCIsCTB4ZjUwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE4wMX19LAoteyAiZ2V0eCIsCTB4ZjZmMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE4wMX19LAoteyAibXVscSIsCTB4ZjYwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE0xLCBETjB9fSwKLXsgIm11bHEiLAkweGY5MDAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMCwJe1NJTU04LCBETjB9fSwKLXsgIm11bHEiLAkweGZiMDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgQU0zMCwJe1NJTU0xNiwgRE4wfX0sCi17ICJtdWxxIiwJMHhmZDAwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIEFNMzAsCXtJTU0zMiwgRE4wfX0sCi17ICJtdWxxdSIsCTB4ZjYxMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE0xLCBETjB9fSwKLXsgIm11bHF1IiwJMHhmOTE0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzAsCXtTSU1NOCwgRE4wfX0sCi17ICJtdWxxdSIsCTB4ZmIxNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCBBTTMwLAl7U0lNTTE2LCBETjB9fSwKLXsgIm11bHF1IiwJMHhmZDE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIEFNMzAsCXtJTU0zMiwgRE4wfX0sCi17ICJzYXQxNiIsCTB4ZjY0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE0xLCBETjB9fSwKLXsgInNhdDE2IiwJMHhmOWFiMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDYsIEFNMzMsCXtSTTIsIFJOMH19LAotCi17ICJzYXQyNCIsCTB4ZjY1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE0xLCBETjB9fSwKLXsgInNhdDI0IiwJMHhmYmFmMDAwMCwgIDB4ZmZmZjAwZmYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMH19LAotCi17ICJic2NoIiwJMHhmYmZmMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIFJOMCwgUkQyfX0sCi17ICJic2NoIiwJMHhmNjcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETTEsIEROMH19LAoteyAiYnNjaCIsCTB4ZjlmYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBSTjB9fSwKLQotLyogRXh0ZW5zaW9uLiAgV2UgbmVlZCBzb21lIGluc3RydWN0aW9uIHRvIHRyaWdnZXIgImVtdWxhdGVkIHN5c2NhbGxzIgotICAgZm9yIG91ciBzaW11bGF0b3IuICAqLwoteyAic3lzY2FsbCIsCTB4ZjBlMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMzLAl7SU1NNH19LAoteyAic3lzY2FsbCIsICAgIDB4ZjBjMCwgICAgICAweGZmZmYsICAgICAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCi0KLS8qIEV4dGVuc2lvbi4gIFdoZW4gdGFsa2luZyB0byB0aGUgc2ltdWxhdG9yLCBnZGIgcmVxdWlyZXMgc29tZSBpbnN0cnVjdGlvbgotICAgdGhhdCB3aWxsIHRyaWdnZXIgYSAiYnJlYWtwb2ludCIgKHJlYWxseSBqdXN0IGFuIGluc3RydWN0aW9uIHRoYXQgaXNuJ3QKLSAgIG90aGVyd2lzZSB1c2VkIGJ5IHRoZSB0b29scy4gIFRoaXMgaW5zdHJ1Y3Rpb24gbXVzdCBiZSB0aGUgc2FtZSBzaXplCi0gICBhcyB0aGUgc21hbGxlc3QgaW5zdHJ1Y3Rpb24gb24gdGhlIHRhcmdldCBtYWNoaW5lLiAgSW4gdGhlIGNhc2Ugb2YgdGhlCi0gICBtbjEweDAwIHRoZSAiYnJlYWsiIGluc3RydWN0aW9uIG11c3QgYmUgb25lIGJ5dGUuICAweGZmIGlzIGF2YWlsYWJsZSBvbgotICAgYm90aCBtbjEweDAwIGFyY2hpdGVjdHVyZXMuICAqLwoteyAiYnJlYWsiLAkweGZmLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi0KLXsgImFkZF9hZGQiLAkweGY3MDAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfYWRkIiwJMHhmNzEwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9hZGQiLAkweGY3MDQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX2FkZCIsCTB4ZjcxNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYWRkX3N1YiIsCTB4ZjcyMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9zdWIiLAkweGY3MzAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYWRkX3N1YiIsCTB4ZjcyNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfc3ViIiwJMHhmNzM0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhZGRfY21wIiwJMHhmNzQwMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX2NtcCIsCTB4Zjc1MDAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJhZGRfY21wIiwJMHhmNzQ0MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9jbXAiLAkweGY3NTQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9tb3YiLAkweGY3NjAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhZGRfbW92IiwJMHhmNzcwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFkZF9tb3YiLAkweGY3NjQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYWRkX21vdiIsCTB4Zjc3NDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiYWRkX2FzciIsCTB4Zjc4MDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9hc3IiLAkweGY3OTAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJhZGRfYXNyIiwJMHhmNzg0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9hc3IiLAkweGY3OTQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiYWRkX2xzciIsCTB4ZjdhMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9sc3IiLAkweGY3YjAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJhZGRfbHNyIiwJMHhmN2E0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9sc3IiLAkweGY3YjQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiYWRkX2FzbCIsCTB4ZjdjMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9hc2wiLAkweGY3ZDAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJhZGRfYXNsIiwJMHhmN2M0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFkZF9hc2wiLAkweGY3ZDQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiY21wX2FkZCIsCTB4ZjcwMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9hZGQiLAkweGY3MTEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiY21wX2FkZCIsCTB4ZjcwNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfYWRkIiwJMHhmNzE1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJjbXBfc3ViIiwJMHhmNzIxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX3N1YiIsCTB4ZjczMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJjbXBfc3ViIiwJMHhmNzI1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9zdWIiLAkweGY3MzUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9tb3YiLAkweGY3NjEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJjbXBfbW92IiwJMHhmNzcxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImNtcF9tb3YiLAkweGY3NjUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAiY21wX21vdiIsCTB4Zjc3NTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiY21wX2FzciIsCTB4Zjc4MTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9hc3IiLAkweGY3OTEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJjbXBfYXNyIiwJMHhmNzg1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9hc3IiLAkweGY3OTUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiY21wX2xzciIsCTB4ZjdhMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9sc3IiLAkweGY3YjEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJjbXBfbHNyIiwJMHhmN2E1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9sc3IiLAkweGY3YjUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiY21wX2FzbCIsCTB4ZjdjMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9hc2wiLAkweGY3ZDEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJjbXBfYXNsIiwJMHhmN2M1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImNtcF9hc2wiLAkweGY3ZDUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic3ViX2FkZCIsCTB4ZjcwMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9hZGQiLAkweGY3MTIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3ViX2FkZCIsCTB4ZjcwNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfYWRkIiwJMHhmNzE2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzdWJfc3ViIiwJMHhmNzIyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX3N1YiIsCTB4ZjczMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzdWJfc3ViIiwJMHhmNzI2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9zdWIiLAkweGY3MzYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9jbXAiLAkweGY3NDIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfY21wIiwJMHhmNzUyMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9jbXAiLAkweGY3NDYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX2NtcCIsCTB4Zjc1NjAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3ViX21vdiIsCTB4Zjc2MjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN1Yl9tb3YiLAkweGY3NzIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3ViX21vdiIsCTB4Zjc2NjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzdWJfbW92IiwJMHhmNzc2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzdWJfYXNyIiwJMHhmNzgyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX2FzciIsCTB4Zjc5MjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9hc3IiLAkweGY3ODYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX2FzciIsCTB4Zjc5NjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzdWJfbHNyIiwJMHhmN2EyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX2xzciIsCTB4ZjdiMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9sc3IiLAkweGY3YTYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX2xzciIsCTB4ZjdiNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzdWJfYXNsIiwJMHhmN2MyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX2FzbCIsCTB4ZjdkMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInN1Yl9hc2wiLAkweGY3YzYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3ViX2FzbCIsCTB4ZjdkNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJtb3ZfYWRkIiwJMHhmNzAzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X2FkZCIsCTB4ZjcxMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJtb3ZfYWRkIiwJMHhmNzA3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9hZGQiLAkweGY3MTcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9zdWIiLAkweGY3MjMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3Zfc3ViIiwJMHhmNzMzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9zdWIiLAkweGY3MjcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X3N1YiIsCTB4ZjczNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAibW92X2NtcCIsCTB4Zjc0MzAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9jbXAiLAkweGY3NTMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAibW92X2NtcCIsCTB4Zjc0NzAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfY21wIiwJMHhmNzU3MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJtb3ZfbW92IiwJMHhmNzYzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAibW92X21vdiIsCTB4Zjc3MzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJtb3ZfbW92IiwJMHhmNzY3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm1vdl9tb3YiLAkweGY3NzcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9hc3IiLAkweGY3ODMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfYXNyIiwJMHhmNzkzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAibW92X2FzciIsCTB4Zjc4NzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfYXNyIiwJMHhmNzk3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9sc3IiLAkweGY3YTMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfbHNyIiwJMHhmN2IzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAibW92X2xzciIsCTB4ZjdhNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfbHNyIiwJMHhmN2I3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgIm1vdl9hc2wiLAkweGY3YzMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfYXNsIiwJMHhmN2QzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAibW92X2FzbCIsCTB4ZjdjNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF82LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJtb3ZfYXNsIiwJMHhmN2Q3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImFuZF9hZGQiLAkweGY3MDgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhbmRfYWRkIiwJMHhmNzE4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFuZF9zdWIiLAkweGY3MjgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhbmRfc3ViIiwJMHhmNzM4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFuZF9jbXAiLAkweGY3NDgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhbmRfY21wIiwJMHhmNzU4MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFuZF9tb3YiLAkweGY3NjgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhbmRfbW92IiwJMHhmNzc4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImFuZF9hc3IiLAkweGY3ODgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJhbmRfYXNyIiwJMHhmNzk4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAiYW5kX2xzciIsCTB4ZjdhODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImFuZF9sc3IiLAkweGY3YjgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJhbmRfYXNsIiwJMHhmN2M4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiYW5kX2FzbCIsCTB4ZjdkODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgImRtYWNoX2FkZCIsCTB4ZjcwOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImRtYWNoX2FkZCIsCTB4ZjcxOTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJkbWFjaF9zdWIiLAkweGY3MjkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJkbWFjaF9zdWIiLAkweGY3MzkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAiZG1hY2hfY21wIiwJMHhmNzQ5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAiZG1hY2hfY21wIiwJMHhmNzU5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgImRtYWNoX21vdiIsCTB4Zjc2OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgImRtYWNoX21vdiIsCTB4Zjc3OTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJkbWFjaF9hc3IiLAkweGY3ODkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJkbWFjaF9hc3IiLAkweGY3OTkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJkbWFjaF9sc3IiLAkweGY3YTkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJkbWFjaF9sc3IiLAkweGY3YjkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJkbWFjaF9hc2wiLAkweGY3YzkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJkbWFjaF9hc2wiLAkweGY3ZDkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJ4b3JfYWRkIiwJMHhmNzBhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAieG9yX2FkZCIsCTB4ZjcxYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJ4b3Jfc3ViIiwJMHhmNzJhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAieG9yX3N1YiIsCTB4ZjczYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJ4b3JfY21wIiwJMHhmNzRhMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAieG9yX2NtcCIsCTB4Zjc1YTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJ4b3JfbW92IiwJMHhmNzZhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAieG9yX21vdiIsCTB4Zjc3YTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJ4b3JfYXNyIiwJMHhmNzhhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAieG9yX2FzciIsCTB4Zjc5YTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgInhvcl9sc3IiLAkweGY3YWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJ4b3JfbHNyIiwJMHhmN2JhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAieG9yX2FzbCIsCTB4ZjdjYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInhvcl9hc2wiLAkweGY3ZGEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzd2h3X2FkZCIsCTB4ZjcwYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN3aHdfYWRkIiwJMHhmNzFiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN3aHdfc3ViIiwJMHhmNzJiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3dod19zdWIiLAkweGY3M2IwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic3dod19jbXAiLAkweGY3NGIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzd2h3X2NtcCIsCTB4Zjc1YjAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzd2h3X21vdiIsCTB4Zjc2YjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN3aHdfbW92IiwJMHhmNzdiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInN3aHdfYXNyIiwJMHhmNzhiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic3dod19hc3IiLAkweGY3OWIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzd2h3X2xzciIsCTB4ZjdhYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInN3aHdfbHNyIiwJMHhmN2JiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic3dod19hc2wiLAkweGY3Y2IwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzd2h3X2FzbCIsCTB4ZjdkYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgSU1NNF8yLCBSTjB9fSwKLXsgIm9yX2FkZCIsCTB4ZjcwYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm9yX2FkZCIsCTB4ZjcxYzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJvcl9zdWIiLAkweGY3MmMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJvcl9zdWIiLAkweGY3M2MwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAib3JfY21wIiwJMHhmNzRjMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAib3JfY21wIiwJMHhmNzVjMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgIm9yX21vdiIsCTB4Zjc2YzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgIm9yX21vdiIsCTB4Zjc3YzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJvcl9hc3IiLAkweGY3OGMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJvcl9hc3IiLAkweGY3OWMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJvcl9sc3IiLAkweGY3YWMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJvcl9sc3IiLAkweGY3YmMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJvcl9hc2wiLAkweGY3Y2MwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJvcl9hc2wiLAkweGY3ZGMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIElNTTRfMiwgUk4wfX0sCi17ICJzYXQxNl9hZGQiLAkweGY3MGQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzYXQxNl9hZGQiLAkweGY3MWQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic2F0MTZfc3ViIiwJMHhmNzJkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic2F0MTZfc3ViIiwJMHhmNzNkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBTSU1NNF8yLCBSTjB9fSwKLXsgInNhdDE2X2NtcCIsCTB4Zjc0ZDAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgUk0yLCBSTjB9fSwKLXsgInNhdDE2X2NtcCIsCTB4Zjc1ZDAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTYsIFJONCwgU0lNTTRfMiwgUk4wfX0sCi17ICJzYXQxNl9tb3YiLAkweGY3NmQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFJNMiwgUk4wfX0sCi17ICJzYXQxNl9tb3YiLAkweGY3N2QwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk02LCBSTjQsIFNJTU00XzIsIFJOMH19LAoteyAic2F0MTZfYXNyIiwJMHhmNzhkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic2F0MTZfYXNyIiwJMHhmNzlkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic2F0MTZfbHNyIiwJMHhmN2FkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic2F0MTZfbHNyIiwJMHhmN2JkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAoteyAic2F0MTZfYXNsIiwJMHhmN2NkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBSTTIsIFJOMH19LAoteyAic2F0MTZfYXNsIiwJMHhmN2RkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNNiwgUk40LCBJTU00XzIsIFJOMH19LAotLyogVWdoLiAgU3ludGhldGljIGluc3RydWN0aW9ucy4gICovCi17ICJhZGRfYW5kIiwJMHhmNzA4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX2FuZCIsCTB4ZjcxODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfZG1hY2giLAkweGY3MDkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfZG1hY2giLAkweGY3MTkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX29yIiwJMHhmNzBjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYWRkX29yIiwJMHhmNzFjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF9zYXQxNiIsCTB4ZjcwZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF9zYXQxNiIsCTB4ZjcxZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfc3dodyIsCTB4ZjcwYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF9zd2h3IiwJMHhmNzFiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFkZF94b3IiLAkweGY3MGEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhZGRfeG9yIiwJMHhmNzFhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9hZGQiLAkweGY3YzAwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfYWRkIiwJMHhmN2QwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX2FkZCIsCTB4ZjdjNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc2xfYWRkIiwJMHhmN2Q0MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzbF9hbmQiLAkweGY3YzgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfYW5kIiwJMHhmN2Q4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX2NtcCIsCTB4ZjdjMTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9jbXAiLAkweGY3ZDEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40LCB9fSwKLXsgImFzbF9jbXAiLAkweGY3YzUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNsX2NtcCIsCTB4ZjdkNTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc2xfZG1hY2giLAkweGY3YzkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfZG1hY2giLAkweGY3ZDkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfbW92IiwJMHhmN2MzMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX21vdiIsCTB4ZjdkMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9tb3YiLAkweGY3YzcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNsX21vdiIsCTB4ZjdkNzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc2xfb3IiLAkweGY3Y2MwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfb3IiLAkweGY3ZGMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfc2F0MTYiLAkweGY3Y2QwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfc2F0MTYiLAkweGY3ZGQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc2xfc3ViIiwJMHhmN2MyMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX3N1YiIsCTB4ZjdkMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9zdWIiLAkweGY3YzYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNsX3N1YiIsCTB4ZjdkNjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc2xfc3dodyIsCTB4ZjdjYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF9zd2h3IiwJMHhmN2RiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNsX3hvciIsCTB4ZjdjYTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzbF94b3IiLAkweGY3ZGEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfYWRkIiwJMHhmNzgwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX2FkZCIsCTB4Zjc5MDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9hZGQiLAkweGY3ODQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNyX2FkZCIsCTB4Zjc5NDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJhc3JfYW5kIiwJMHhmNzg4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX2FuZCIsCTB4Zjc5ODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9jbXAiLAkweGY3ODEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfY21wIiwJMHhmNzkxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONCwgfX0sCi17ICJhc3JfY21wIiwJMHhmNzg1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzcl9jbXAiLAkweGY3OTUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNyX2RtYWNoIiwJMHhmNzg5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX2RtYWNoIiwJMHhmNzk5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX21vdiIsCTB4Zjc4MzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9tb3YiLAkweGY3OTMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfbW92IiwJMHhmNzg3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzcl9tb3YiLAkweGY3OTcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNyX29yIiwJMHhmNzhjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX29yIiwJMHhmNzljMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX3NhdDE2IiwJMHhmNzhkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX3NhdDE2IiwJMHhmNzlkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiYXNyX3N1YiIsCTB4Zjc4MjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl9zdWIiLAkweGY3OTIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3Jfc3ViIiwJMHhmNzg2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImFzcl9zdWIiLAkweGY3OTYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAiYXNyX3N3aHciLAkweGY3OGIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3Jfc3dodyIsCTB4Zjc5YjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImFzcl94b3IiLAkweGY3OGEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJhc3JfeG9yIiwJMHhmNzlhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX2FuZCIsCTB4Zjc0ODAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9hbmQiLAkweGY3NTgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX2RtYWNoIiwJMHhmNzQ5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX2RtYWNoIiwJMHhmNzU5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9vciIsCTB4Zjc0YzAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImNtcF9vciIsCTB4Zjc1YzAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfc2F0MTYiLAkweGY3NGQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfc2F0MTYiLAkweGY3NWQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX3N3aHciLAkweGY3NGIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfc3dodyIsCTB4Zjc1YjAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJjbXBfeG9yIiwJMHhmNzRhMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAiY21wX3hvciIsCTB4Zjc1YTAwMDAsICAweGZmZmYwMDAwLCAgMHgwLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfYWRkIiwJMHhmN2EwMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX2FkZCIsCTB4ZjdiMDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9hZGQiLAkweGY3YTQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAibHNyX2FkZCIsCTB4ZjdiNDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgU0lNTTRfNiwgUk40fX0sCi17ICJsc3JfYW5kIiwJMHhmN2E4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX2FuZCIsCTB4ZjdiODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9jbXAiLAkweGY3YTEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfY21wIiwJMHhmN2IxMDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONCwgfX0sCi17ICJsc3JfY21wIiwJMHhmN2E1MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImxzcl9jbXAiLAkweGY3YjUwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAibHNyX2RtYWNoIiwJMHhmN2E5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX2RtYWNoIiwJMHhmN2I5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX21vdiIsCTB4ZjdhMzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9tb3YiLAkweGY3YjMwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfbW92IiwJMHhmN2E3MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImxzcl9tb3YiLAkweGY3YjcwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAibHNyX29yIiwJMHhmN2FjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX29yIiwJMHhmN2JjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX3NhdDE2IiwJMHhmN2FkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX3NhdDE2IiwJMHhmN2JkMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibHNyX3N1YiIsCTB4ZjdhMjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl9zdWIiLAkweGY3YjIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3Jfc3ViIiwJMHhmN2E2MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBTSU1NNF82LCBSTjR9fSwKLXsgImxzcl9zdWIiLAkweGY3YjYwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7SU1NNF8yLCBSTjAsIFNJTU00XzYsIFJONH19LAoteyAibHNyX3N3aHciLAkweGY3YWIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3Jfc3dodyIsCTB4ZjdiYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgImxzcl94b3IiLAkweGY3YWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJsc3JfeG9yIiwJMHhmN2JhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X2FuZCIsCTB4Zjc2ODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9hbmQiLAkweGY3NzgwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X2RtYWNoIiwJMHhmNzY5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X2RtYWNoIiwJMHhmNzc5MDAwMCwgIDB4ZmZmZjAwMDAsICAweDAsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9vciIsCTB4Zjc2YzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9vciIsCTB4Zjc3YzAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3Zfc2F0MTYiLAkweGY3NmQwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3Zfc2F0MTYiLAkweGY3N2QwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X3N3aHciLAkweGY3NmIwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3Zfc3dodyIsCTB4Zjc3YjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJtb3ZfeG9yIiwJMHhmNzZhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAibW92X3hvciIsCTB4Zjc3YTAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfYW5kIiwJMHhmNzI4MDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX2FuZCIsCTB4ZjczODAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfZG1hY2giLAkweGY3MjkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfZG1hY2giLAkweGY3MzkwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MCwgIEZNVF9EMTAsIEFNMzMsCSB7U0lNTTRfMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX29yIiwJMHhmNzJjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1JNMiwgUk4wLCBSTTYsIFJONH19LAoteyAic3ViX29yIiwJMHhmNzNjMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl9zYXQxNiIsCTB4ZjcyZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl9zYXQxNiIsCTB4ZjczZDAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtTSU1NNF8yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfc3dodyIsCTB4ZjcyYjAwMDAsICAweGZmZmYwMDAwLCAgMHhhLCAgRk1UX0QxMCwgQU0zMywJIHtSTTIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl9zd2h3IiwJMHhmNzNiMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgInN1Yl94b3IiLAkweGY3MmEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4YSwgIEZNVF9EMTAsIEFNMzMsCSB7Uk0yLCBSTjAsIFJNNiwgUk40fX0sCi17ICJzdWJfeG9yIiwJMHhmNzNhMDAwMCwgIDB4ZmZmZjAwMDAsICAweGEsICBGTVRfRDEwLCBBTTMzLAkge1NJTU00XzIsIFJOMCwgUk02LCBSTjR9fSwKLXsgIm1vdl9sbHQiLAkweGY3ZTAwMDAwLCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgIm1vdl9sZ3QiLAkweGY3ZTAwMDAxLCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgIm1vdl9sZ2UiLAkweGY3ZTAwMDAyLCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgIm1vdl9sbGUiLAkweGY3ZTAwMDAzLCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgIm1vdl9sY3MiLAkweGY3ZTAwMDA0LCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgIm1vdl9saGkiLAkweGY3ZTAwMDA1LCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgIm1vdl9sY2MiLAkweGY3ZTAwMDA2LCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgIm1vdl9sbHMiLAkweGY3ZTAwMDA3LCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgIm1vdl9sZXEiLAkweGY3ZTAwMDA4LCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgIm1vdl9sbmUiLAkweGY3ZTAwMDA5LCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgIm1vdl9scmEiLAkweGY3ZTAwMDBhLCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgImxsdF9tb3YiLAkweGY3ZTAwMDAwLCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgImxndF9tb3YiLAkweGY3ZTAwMDAxLCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgImxnZV9tb3YiLAkweGY3ZTAwMDAyLCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgImxsZV9tb3YiLAkweGY3ZTAwMDAzLCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgImxjc19tb3YiLAkweGY3ZTAwMDA0LCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgImxoaV9tb3YiLAkweGY3ZTAwMDA1LCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgImxjY19tb3YiLAkweGY3ZTAwMDA2LCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgImxsc19tb3YiLAkweGY3ZTAwMDA3LCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgImxlcV9tb3YiLAkweGY3ZTAwMDA4LCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgImxuZV9tb3YiLAkweGY3ZTAwMDA5LCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLXsgImxyYV9tb3YiLAkweGY3ZTAwMDBhLCAgMHhmZmZmMDAwZiwgIDB4MjIsIEZNVF9EMTAsIEFNMzMsCSB7TUVNSU5DMiAoUk40LFNJTU00XzIpLCBSTTZ9fSwKLSAKLXsgMCwgMCwgMCwgMCwgMCwgMCwgezB9fSwKLQotfSA7Ci0KLWNvbnN0IGludCBtbjEwMzAwX251bV9vcGNvZGVzID0KLSAgc2l6ZW9mIChtbjEwMzAwX29wY29kZXMpIC8gc2l6ZW9mIChtbjEwMzAwX29wY29kZXNbMF0pOwotCi0MCmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItYXNtLmMgYi9vcGNvZGVzL20zMnItYXNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkM2JkOTYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLWFzbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTc5ICswLDAgQEAKLS8qIEFzc2VtYmxlciBpbnRlcmZhY2UgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTi4gLSotIEMgLSotCi0gICBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0tIHRoZSByZXN1bHRhbnQgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCwgY2dlbi1hc20uaW4gaXNuJ3QKLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgotICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAibTMyci1kZXNjLmgiCi0jaW5jbHVkZSAibTMyci1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI3VuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI3VuZGVmIG1heAotI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotCi1zdGF0aWMgY29uc3QgY2hhciAqIHBhcnNlX2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLCBjb25zdCBjaGFyICoqLCBDR0VOX0ZJRUxEUyAqKSk7Ci0MCi0vKiAtLSBhc3NlbWJsZXIgcm91dGluZXMgaW5zZXJ0ZWQgaGVyZSAqLwotCi0vKiAtLSBhc20uYyAqLwotCi0vKiBIYW5kbGUgJyMnIHByZWZpeGVzIChpLmUuIHNraXAgb3ZlciB0aGVtKS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2hhc2ggKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotewotICBpZiAoKipzdHJwID09ICcjJykKLSAgICArKypzdHJwOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSGFuZGxlIHNoaWdoKCksIGhpZ2goKS4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2hpMTYgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOwotewotICBjb25zdCBjaGFyICplcnJtc2c7Ci0gIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHRfdHlwZTsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICBpZiAoKipzdHJwID09ICcjJykKLSAgICArKypzdHJwOwotCi0gIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJoaWdoKCIsIDUpID09IDApCi0gICAgewotICAgICAgKnN0cnAgKz0gNTsKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPLAotCQkJCSAgICZyZXN1bHRfdHlwZSwgJnZhbHVlKTsKLSAgICAgIGlmICgqKnN0cnAgIT0gJyknKQotCXJldHVybiAibWlzc2luZyBgKSciOwotICAgICAgKysqc3RycDsKLSAgICAgIGlmIChlcnJtc2cgPT0gTlVMTAotICAJICAmJiByZXN1bHRfdHlwZSA9PSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX05VTUJFUikKLQl2YWx1ZSA+Pj0gMTY7Ci0gICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICByZXR1cm4gZXJybXNnOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzdHJwLCAic2hpZ2goIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICAqc3RycCArPSA2OwotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8sCi0gCQkJCSAgICZyZXN1bHRfdHlwZSwgJnZhbHVlKTsKLSAgICAgIGlmICgqKnN0cnAgIT0gJyknKQotCXJldHVybiAibWlzc2luZyBgKSciOwotICAgICAgKysqc3RycDsKLSAgICAgIGlmIChlcnJtc2cgPT0gTlVMTAotCSAgJiYgcmVzdWx0X3R5cGUgPT0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9OVU1CRVIpCi0JdmFsdWUgPSAodmFsdWUgPj4gMTYpICsgKHZhbHVlICYgMHg4MDAwID8gMSA6IDApOwotICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgICAgcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgcmV0dXJuIGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCk7Ci19Ci0KLS8qIEhhbmRsZSBsb3coKSBpbiBhIHNpZ25lZCBjb250ZXh0LiAgQWxzbyBoYW5kbGUgc2RhKCkuCi0gICBUaGUgc2lnbmVkbmVzcyBvZiB0aGUgdmFsdWUgZG9lc24ndCBtYXR0ZXIgdG8gbG93KCksIGJ1dCB0aGlzIGFsc28KLSAgIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgbG93KCkgaXNuJ3QgcHJlc2VudC4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX3NsbzE2IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGxvbmcgKnZhbHVlcDsKLXsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0X3R5cGU7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgaWYgKCoqc3RycCA9PSAnIycpCi0gICAgKysqc3RycDsKLQotICBpZiAoc3RybmNhc2VjbXAgKCpzdHJwLCAibG93KCIsIDQpID09IDApCi0gICAgewotICAgICAgKnN0cnAgKz0gNDsKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19NMzJSX0xPMTYsCi0JCQkJICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOwotICAgICAgaWYgKCoqc3RycCAhPSAnKScpCi0JcmV0dXJuICJtaXNzaW5nIGApJyI7Ci0gICAgICArKypzdHJwOwotICAgICAgaWYgKGVycm1zZyA9PSBOVUxMCi0JICAmJiByZXN1bHRfdHlwZSA9PSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX05VTUJFUikKLQl2YWx1ZSAmPSAweGZmZmY7Ci0gICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICByZXR1cm4gZXJybXNnOwotICAgIH0KLQotICBpZiAoc3RybmNhc2VjbXAgKCpzdHJwLCAic2RhKCIsIDQpID09IDApCi0gICAgewotICAgICAgKnN0cnAgKz0gNDsKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19NMzJSX1NEQTE2LAotCQkJCSAgIE5VTEwsICZ2YWx1ZSk7Ci0gICAgICBpZiAoKipzdHJwICE9ICcpJykKLQlyZXR1cm4gIm1pc3NpbmcgYCknIjsKLSAgICAgICsrKnN0cnA7Ci0gICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICByZXR1cm4gZXJybXNnOwotICAgIH0KLQotICByZXR1cm4gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCk7Ci19Ci0KLS8qIEhhbmRsZSBsb3coKSBpbiBhbiB1bnNpZ25lZCBjb250ZXh0LgotICAgVGhlIHNpZ25lZG5lc3Mgb2YgdGhlIHZhbHVlIGRvZXNuJ3QgbWF0dGVyIHRvIGxvdygpLCBidXQgdGhpcyBhbHNvCi0gICBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGxvdygpIGlzbid0IHByZXNlbnQuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV91bG8xNiAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdF90eXBlOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIGlmICgqKnN0cnAgPT0gJyMnKQotICAgICsrKnN0cnA7Ci0KLSAgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgImxvdygiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgICpzdHJwICs9IDQ7Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9MTzE2LAotCQkJCSAgICZyZXN1bHRfdHlwZSwgJnZhbHVlKTsKLSAgICAgIGlmICgqKnN0cnAgIT0gJyknKQotCXJldHVybiAibWlzc2luZyBgKSciOwotICAgICAgKysqc3RycDsKLSAgICAgIGlmIChlcnJtc2cgPT0gTlVMTAotCSAgJiYgcmVzdWx0X3R5cGUgPT0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9OVU1CRVIpCi0JdmFsdWUgJj0gMHhmZmZmOwotICAgICAgKnZhbHVlcCA9IHZhbHVlOwotICAgICAgcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgcmV0dXJuIGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCk7Ci19Ci0KLS8qIC0tICovCi0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIG9wZXJhbmQgcGFyc2luZy4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwYXJzZV9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHBhcnNlX2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLgotKi8KLQotY29uc3QgY2hhciAqCi1tMzJyX2NnZW5fcGFyc2Vfb3BlcmFuZCAoY2QsIG9waW5kZXgsIHN0cnAsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGNvbnN0IGNoYXIgKiogc3RycDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci17Ci0gIGNvbnN0IGNoYXIgKiBlcnJtc2cgPSBOVUxMOwotICAvKiBVc2VkIGJ5IHNjYWxhciBvcGVyYW5kcyB0aGF0IHN0aWxsIG5lZWQgdG8gYmUgcGFyc2VkLiAgKi8KLSAgbG9uZyBqdW5rOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zLCAmIGZpZWxkcy0+Zl9hY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDRCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtcywgJiBmaWVsZHMtPmZfYWNjZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NTIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zLCAmIGZpZWxkcy0+Zl9hY2NzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0RJU1AxNiwgMCwgTlVMTCwgICYgdmFsdWUpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfRElTUDI0LCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwMjQgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0RJU1A4LCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX3IxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgZXJybXNnID0gcGFyc2VfaGFzaCAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9IQVNILCAmanVuayk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX2hpMTYgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfSEkxNiwgJmZpZWxkcy0+Zl9oaTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0lNTTEgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0lNTTEsICZmaWVsZHMtPmZfaW1tMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXMsICYgZmllbGRzLT5mX3IyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1NJTU0xNiwgJmZpZWxkcy0+Zl9zaW1tMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9TSU1NOCwgJmZpZWxkcy0+Zl9zaW1tOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV9zbG8xNiAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9TTE8xNiwgJmZpZWxkcy0+Zl9zaW1tMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX3IyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX3IxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX3IyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfVUlNTTE2LCAmZmllbGRzLT5mX3VpbW0xNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfVUlNTTI0LCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl91aW1tMjQgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VSU1NNCwgJmZpZWxkcy0+Zl91aW1tNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfVUlNTTUsICZmaWVsZHMtPmZfdWltbTUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgZXJybXNnID0gcGFyc2VfdWxvMTYgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfVUxPMTYsICZmaWVsZHMtPmZfdWltbTE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcGFyc2luZy5cbiIpLCBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotY2dlbl9wYXJzZV9mbiAqIGNvbnN0IG0zMnJfY2dlbl9wYXJzZV9oYW5kbGVyc1tdID0gCi17Ci0gIHBhcnNlX2luc25fbm9ybWFsLAotfTsKLQotdm9pZAotbTMycl9jZ2VuX2luaXRfYXNtIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgbTMycl9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCk7Ci0gIG0zMnJfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKTsKLSAgY2QtPnBhcnNlX2hhbmRsZXJzID0gJiBtMzJyX2NnZW5fcGFyc2VfaGFuZGxlcnNbMF07Ci0gIGNkLT5wYXJzZV9vcGVyYW5kID0gbTMycl9jZ2VuX3BhcnNlX29wZXJhbmQ7Ci19Ci0KLQwKLS8qIERlZmF1bHQgaW5zbiBwYXJzZXIuCi0KLSAgIFRoZSBzeW50YXggc3RyaW5nIGlzIHNjYW5uZWQgYW5kIG9wZXJhbmRzIGFyZSBwYXJzZWQgYW5kIHN0b3JlZCBpbiBGSUVMRFMuCi0gICBSZWxvY3MgYXJlIHF1ZXVlZCBhcyB3ZSBnbyB2aWEgb3RoZXIgY2FsbGJhY2tzLgotCi0gICA/Pz8gTm90ZSB0aGF0IHRoaXMgaXMgY3VycmVudGx5IGFuIGFsbC1vci1ub3RoaW5nIHBhcnNlci4gIElmIHdlIGZhaWwgdG8KLSAgIHBhcnNlIHRoZSBpbnN0cnVjdGlvbiwgd2UgcmV0dXJuIDAgYW5kIHRoZSBjYWxsZXIgd2lsbCBzdGFydCBvdmVyIGZyb20KLSAgIHRoZSBiZWdpbm5pbmcuICBCYWNrdHJhY2tpbmcgd2lsbCBiZSBuZWNlc3NhcnkgaW4gcGFyc2luZyBzdWJleHByZXNzaW9ucywKLSAgIGJ1dCB0aGF0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLiAgTm90IGhhbmRsaW5nIGJhY2t0cmFja2luZyBoZXJlIG1heSBnZXQKLSAgIGV4cGVuc2l2ZSBpbiB0aGUgY2FzZSBvZiB0aGUgbTY4ay4gIERlYWwgd2l0aCBsYXRlci4KLQotICAgUmV0dXJucyBOVUxMIGZvciBzdWNjZXNzLCBhbiBlcnJvciBtZXNzYWdlIGZvciBmYWlsdXJlLgotKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaW5zbl9ub3JtYWwgKGNkLCBpbnNuLCBzdHJwLCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci17Ci0gIC8qID8/PyBSdW50aW1lIGFkZGVkIGluc25zIG5vdCBoYW5kbGVkIHlldC4gICovCi0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgY29uc3QgY2hhciAqc3RyID0gKnN0cnA7Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgY29uc3QgY2hhciAqcDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqIHN5bjsKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0gIC8qIEZJWE1FOiB3aXAgKi8KLSAgaW50IHBhc3Rfb3Bjb2RlX3A7Ci0jZW5kaWYKLQotICAvKiBGb3Igbm93IHdlIGFzc3VtZSB0aGUgbW5lbW9uaWMgaXMgZmlyc3QgKHRoZXJlIGFyZSBubyBsZWFkaW5nIG9wZXJhbmRzKS4KLSAgICAgV2UgY2FuIHBhcnNlIGl0IHdpdGhvdXQgbmVlZGluZyB0byBzZXQgdXAgb3BlcmFuZCBwYXJzaW5nLgotICAgICBHQVMncyBpbnB1dCBzY3J1YmJlciB3aWxsIGVuc3VyZSBtbmVtb25pY3MgYXJlIGxvd2VyY2FzZSwgYnV0IHdlIG1heQotICAgICBub3QgYmUgY2FsbGVkIGZyb20gR0FTLiAgKi8KLSAgcCA9IENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbik7Ci0gIHdoaWxlICgqcCAmJiB0b2xvd2VyICgqcCkgPT0gdG9sb3dlciAoKnN0cikpCi0gICAgKytwLCArK3N0cjsKLQotICBpZiAoKiBwKQotICAgIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLQotI2lmbmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0gIGlmICgqIHN0ciAmJiAhaXNzcGFjZSAoKiBzdHIpKQotICAgIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLSNlbmRpZgotCi0gIENHRU5fSU5JVF9QQVJTRSAoY2QpOwotICBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCAoY2QpOwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgcGFzdF9vcGNvZGVfcCA9IDA7Ci0jZW5kaWYKLQotICAvKiBXZSBkb24ndCBjaGVjayBmb3IgKCpzdHIgIT0gJ1wwJykgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gcGFyc2UKLSAgICAgYW55IHRyYWlsaW5nIGZha2UgYXJndW1lbnRzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KLSAgc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOwotCi0gIC8qIE1uZW1vbmljcyBjb21lIGZpcnN0IGZvciBub3csIGVuc3VyZSB2YWxpZCBzdHJpbmcuICAqLwotICBpZiAoISBDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqIHN5bikpCi0gICAgYWJvcnQgKCk7Ci0KLSAgKytzeW47Ci0KLSAgd2hpbGUgKCogc3luICE9IDApCi0gICAgewotICAgICAgLyogTm9uIG9wZXJhbmQgY2hhcnMgbXVzdCBtYXRjaCBleGFjdGx5LiAgKi8KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCogc3luKSkKLQl7Ci0JICAvKiBGSVhNRTogV2hpbGUgd2UgYWxsb3cgZm9yIG5vbi1HQVMgY2FsbGVycyBhYm92ZSwgd2UgYXNzdW1lIHRoZQotCSAgICAgZmlyc3QgY2hhciBhZnRlciB0aGUgbW5lbW9uaWMgcGFydCBpcyBhIHNwYWNlLiAgKi8KLQkgIC8qIEZJWE1FOiBXZSBhbHNvIHRha2UgaW5hcHByb3ByaWF0ZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdAotCSAgICAgR0FTJ3MgaW5wdXQgc2NydWJiZXIgd2lsbCByZW1vdmUgZXh0cmFuZW91cyBibGFua3MuICAqLwotCSAgaWYgKCpzdHIgPT0gQ0dFTl9TWU5UQVhfQ0hBUiAoKiBzeW4pKQotCSAgICB7Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotCSAgICAgIGlmICgqIHN5biA9PSAnICcpCi0JCXBhc3Rfb3Bjb2RlX3AgPSAxOwotI2VuZGlmCi0JICAgICAgKysgc3luOwotCSAgICAgICsrIHN0cjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU3ludGF4IGNoYXIgZGlkbid0IG1hdGNoLiAgQ2FuJ3QgYmUgdGhpcyBpbnNuLiAgKi8KLQkgICAgICAvKiBGSVhNRTogd291bGQgbGlrZSB0byByZXR1cm4gc29tZXRoaW5nIGxpa2UKLQkJICJleHBlY3RlZCBjaGFyIGBjJyIgKi8KLQkgICAgICByZXR1cm4gXygic3ludGF4IGVycm9yIik7Ci0JICAgIH0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kIG9mIHNvbWUgc29ydC4gICovCi0gICAgICBlcnJtc2cgPSBtMzJyX2NnZW5fcGFyc2Vfb3BlcmFuZCAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKLQkJCQkJICAmc3RyLCBmaWVsZHMpOwotICAgICAgaWYgKGVycm1zZykKLQlyZXR1cm4gZXJybXNnOwotCi0gICAgICAvKiBEb25lIHdpdGggdGhpcyBvcGVyYW5kLCBjb250aW51ZSB3aXRoIG5leHQgb25lLiAgKi8KLSAgICAgICsrIHN5bjsKLSAgICB9Ci0KLSAgLyogSWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgc3ludGF4IHN0cmluZywgd2UncmUgZG9uZS4gICovCi0gIGlmICgqIHN5biA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBGb3IgdGhlIG1vbWVudCB3ZSBhc3N1bWUgYSB2YWxpZCBgc3RyJyBjYW4gb25seSBjb250YWluCi0JIGJsYW5rcyBub3cuICBJRTogV2UgbmVlZG4ndCB0cnkgYWdhaW4gd2l0aCBhIGxvbmdlciB2ZXJzaW9uIG9mCi0JIHRoZSBpbnNuIGFuZCBpdCBpcyBhc3N1bWVkIHRoYXQgbG9uZ2VyIHZlcnNpb25zIG9mIGluc25zIGFwcGVhcgotCSBiZWZvcmUgc2hvcnRlciBvbmVzIChlZzogbHNyIHIyLHIzLDEgdnMgbHNyIHIyLHIzKS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQotCSsrIHN0cjsKLQotICAgICAgaWYgKCogc3RyICE9ICdcMCcpCi0JcmV0dXJuIF8oImp1bmsgYXQgZW5kIG9mIGxpbmUiKTsgLyogRklYTUU6IHdvdWxkIGxpa2UgdG8gaW5jbHVkZSBgc3RyJyAqLwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgY291bGRuJ3QgcGFyc2UgaXQuICAqLwotICByZXR1cm4gXygidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIik7Ci19Ci0MCi0vKiBNYWluIGVudHJ5IHBvaW50LgotICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuCi0gICBTVFIgcG9pbnRzIHRvIHRoZSBpbnNuIHRvIGJlIGFzc2VtYmxlZC4KLSAgIFdlIGFzc3VtZSBhbGwgbmVjZXNzYXJ5IHRhYmxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICBUaGUgYXNzZW1ibGVkIGluc3RydWN0aW9uLCBsZXNzIGFueSBmaXh1cHMsIGlzIHN0b3JlZCBpbiBCVUYuCi0gICBSZW1lbWJlciB0aGF0IGlmIENHRU5fSU5UX0lOU05fUCB0aGVuIEJVRiBpcyBhbiBpbnQgYW5kIHRodXMgdGhlIHZhbHVlCi0gICBzdGlsbCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gdGFyZ2V0IGJ5dGUgb3JkZXIsIG90aGVyd2lzZSBCVUYgaXMgYW4gYXJyYXkKLSAgIG9mIGJ5dGVzIGluIHRhcmdldCBieXRlIG9yZGVyLgotICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGluc24ncyBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlLAotICAgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cmVkIChhbiBlcnJvciBtZXNzYWdlIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgIHByaW50ZWQpLgotCi0gICBOb3RlIHRoYXQgd2hlbiBwcm9jZXNzaW5nIChub24tYWxpYXMpIG1hY3JvLWluc25zLAotICAgdGhpcyBmdW5jdGlvbiByZWN1cnNlcy4KLQotICAgPz8/IEl0J3MgcG9zc2libGUgdG8gbWFrZSB0aGlzIGNwdS1pbmRlcGVuZGVudC4KLSAgIE9uZSB3b3VsZCBoYXZlIHRvIGRlYWwgd2l0aCBhIGZldyBtaW5vciB0aGluZ3MuCi0gICBBdCB0aGlzIHBvaW50IGluIHRpbWUgZG9pbmcgc28gd291bGQgYmUgbW9yZSBvZiBhIGN1cmlvc2l0eSB0aGFuIHVzZWZ1bAotICAgW2ZvciBleGFtcGxlIHRoaXMgZmlsZSBpc24ndCBfdGhhdF8gYmlnXSwgYnV0IGtlZXBpbmcgdGhlIHBvc3NpYmlsaXR5IGluCi0gICBtaW5kIGhlbHBzIGtlZXAgdGhlIGRlc2lnbiBjbGVhbi4gICovCi0KLWNvbnN0IENHRU5fSU5TTiAqCi1tMzJyX2NnZW5fYXNzZW1ibGVfaW5zbiAoY2QsIHN0ciwgZmllbGRzLCBidWYsIGVycm1zZykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqc3RyOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZjsKLSAgICAgY2hhciAqKmVycm1zZzsKLXsKLSAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gIENHRU5fSU5TTl9MSVNUICppbGlzdDsKLQotICAvKiBTa2lwIGxlYWRpbmcgd2hpdGUgc3BhY2UuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQotICAgICsrIHN0cjsKLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gaGFzaGVkIGxpc3RzLgotICAgICBHZXQgdGhlIGZpcnN0IGluIHRoZSBsaXN0LiAgKi8KLSAgaWxpc3QgPSBDR0VOX0FTTV9MT09LVVBfSU5TTiAoY2QsIHN0cik7Ci0KLSAgLyogS2VlcCBsb29raW5nIHVudGlsIHdlIGZpbmQgYSBtYXRjaC4gICovCi0KLSAgc3RhcnQgPSBzdHI7Ci0gIGZvciAoIDsgaWxpc3QgIT0gTlVMTCA7IGlsaXN0ID0gQ0dFTl9BU01fTkVYVF9JTlNOIChpbGlzdCkpCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gaWxpc3QtPmluc247Ci0KLSNpZiAwIC8qIG5vdCBuZWVkZWQgYXMgdW5zdXBwb3J0ZWQgb3Bjb2RlcyBzaG91bGRuJ3QgYmUgaW4gdGhlIGhhc2ggbGlzdHMgKi8KLSAgICAgIC8qIElzIHRoaXMgaW5zbiBzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIGNwdT8gICovCi0gICAgICBpZiAoISBtMzJyX2NnZW5faW5zbl9zdXBwb3J0ZWQgKGNkLCBpbnNuKSkKLQljb250aW51ZTsKLSNlbmRpZgotCi0gICAgICAvKiBJZiB0aGUgUkVMQVggYXR0cmlidXRlIGlzIHNldCwgdGhpcyBpcyBhbiBpbnNuIHRoYXQgc2hvdWxkbid0IGJlCi0JIGNob3NlbiBpbW1lZGlhdGVseS4gIEluc3RlYWQsIGl0IGlzIHVzZWQgZHVyaW5nIGFzc2VtYmxlci9saW5rZXIKLQkgcmVsYXhhdGlvbiBpZiBwb3NzaWJsZS4gICovCi0gICAgICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9SRUxBWCkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgc3RyID0gc3RhcnQ7Ci0KLSAgICAgIC8qIEFsbG93IHBhcnNlL2luc2VydCBoYW5kbGVycyB0byBvYnRhaW4gbGVuZ3RoIG9mIGluc24uICAqLwotICAgICAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLQotICAgICAgaWYgKCEgQ0dFTl9QQVJTRV9GTiAoY2QsIGluc24pIChjZCwgaW5zbiwgJiBzdHIsIGZpZWxkcykpCi0JewotCSAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCi0JICBpZiAoQ0dFTl9JTlNFUlRfRk4gKGNkLCBpbnNuKSAoY2QsIGluc24sIGZpZWxkcywgYnVmLCAoYmZkX3ZtYSkgMCkKLQkgICAgICAhPSBOVUxMKQotCSAgICBjb250aW51ZTsKLQkgIC8qIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gYWN0dWFsbHkgb3V0cHV0IHRoZSBpbnNuIGFuZCBhbnkKLQkgICAgIHF1ZXVlZCByZWxvY3MuICAqLwotCSAgcmV0dXJuIGluc247Ci0JfQotCi0gICAgICAvKiBUcnkgdGhlIG5leHQgZW50cnkuICAqLwotICAgIH0KLQotICAvKiBGSVhNRTogV2UgY2FuIHJldHVybiBhIGJldHRlciBlcnJvciBtZXNzYWdlIHRoYW4gdGhpcy4KLSAgICAgTmVlZCB0byB0cmFjayB3aHkgaXQgZmFpbGVkIGFuZCBwaWNrIHRoZSByaWdodCBvbmUuICAqLwotICB7Ci0gICAgc3RhdGljIGNoYXIgZXJyYnVmWzEwMF07Ci0gICAgaWYgKHN0cmxlbiAoc3RhcnQpID4gNTApCi0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgc3ByaW50ZiAoZXJyYnVmLCBfKCJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzLi4uJyIpLCBzdGFydCk7Ci0gICAgZWxzZSAKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChlcnJidWYsIF8oImJhZCBpbnN0cnVjdGlvbiBgJS41MHMnIiksIHN0YXJ0KTsKLSAgICAgIAotICAgICplcnJtc2cgPSBlcnJidWY7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQwKLSNpZiAwIC8qIFRoaXMgY2FsbHMgYmFjayB0byBHQVMgd2hpY2ggd2UgY2FuJ3QgZG8gd2l0aG91dCBjYXJlLiAgKi8KLQotLyogUmVjb3JkIGVhY2ggbWVtYmVyIG9mIE9QVkFMUyBpbiB0aGUgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlLgotICAgVGhpcyBsZXRzIEdBUyBwYXJzZSByZWdpc3RlcnMgZm9yIHVzLgotICAgPz8/IEludGVyZXN0aW5nIGlkZWEgYnV0IG5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLS8qIFJlY29yZCBlYWNoIG1lbWJlciBvZiBPUFZBTFMgaW4gdGhlIGFzc2VtYmxlcidzIHN5bWJvbCB0YWJsZS4KLSAgIEZJWE1FOiBOb3QgY3VycmVudGx5IHVzZWQuICAqLwotCi12b2lkCi1tMzJyX2NnZW5fYXNtX2hhc2hfa2V5d29yZHMgKGNkLCBvcHZhbHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fS0VZV09SRCAqb3B2YWxzOwotewotICBDR0VOX0tFWVdPUkRfU0VBUkNIIHNlYXJjaCA9IGNnZW5fa2V5d29yZF9zZWFyY2hfaW5pdCAob3B2YWxzLCBOVUxMKTsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICoga2U7Ci0KLSAgd2hpbGUgKChrZSA9IGNnZW5fa2V5d29yZF9zZWFyY2hfbmV4dCAoJiBzZWFyY2gpKSAhPSBOVUxMKQotICAgIHsKLSNpZiAwIC8qIFVubmVjZXNzYXJ5LCBzaG91bGQgYmUgZG9uZSBpbiB0aGUgc2VhcmNoIHJvdXRpbmUuICAqLwotICAgICAgaWYgKCEgbTMycl9jZ2VuX29wdmFsX3N1cHBvcnRlZCAoa2UpKQotCWNvbnRpbnVlOwotI2VuZGlmCi0gICAgICBjZ2VuX2FzbV9yZWNvcmRfcmVnaXN0ZXIgKGNkLCBrZS0+bmFtZSwga2UtPnZhbHVlKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAwICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItZGVzYy5jIGIvb3Bjb2Rlcy9tMzJyLWRlc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxY2ZhOS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItZGVzYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM3MSArMCwwIEBACi0vKiBDUFUgZGF0YSBmb3IgbTMyci4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIEF0dHJpYnV0ZXMuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIGJvb2xfYXR0cltdID0KLXsKLSAgeyAiI2YiLCAwIH0sCi0gIHsgIiN0IiwgMSB9LAotICB7IDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBNQUNIX2F0dHJbXSA9Ci17Ci0gIHsgImJhc2UiLCBNQUNIX0JBU0UgfSwKLSAgeyAibTMyciIsIE1BQ0hfTTMyUiB9LAotICB7ICJtMzJyeCIsIE1BQ0hfTTMyUlggfSwKLSAgeyAibWF4IiwgTUFDSF9NQVggfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgSVNBX2F0dHJbXSA9Ci17Ci0gIHsgIm0zMnIiLCBJU0FfTTMyUiB9LAotICB7ICJtYXgiLCBJU0FfTUFYIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIFBJUEVfYXR0cltdID0KLXsKLSAgeyAiTk9ORSIsIFBJUEVfTk9ORSB9LAotICB7ICJPIiwgUElQRV9PIH0sCi0gIHsgIlMiLCBQSVBFX1MgfSwKLSAgeyAiT1MiLCBQSVBFX09TIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2lmaWVsZF9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFU0VSVkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdOLU9QVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxPQyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faGFyZHdhcmVfYXR0cl90YWJsZVtdID0KLXsKLSAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkNBQ0hFLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBDIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQUk9GSUxFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9vcGVyYW5kX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQ1JFTC1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJBQlMtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTi1PUFQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR05FRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiTkVHQVRJVkUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTEFYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTRU0tT05MWSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMT0MiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkhBU0gtUFJFRklYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9pbnNuX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJQSVBFIiwgJiBQSVBFX2F0dHJbMF0gfSwKLSAgeyAiQUxJQVMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlVOQ09ORC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkNPTkQtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTS0lQLUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiREVMQVktU0xPVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMQVhBQkxFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiTk8tRElTIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQkIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkZJTEwtU0xPVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU1BFQ0lBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLS8qIEluc3RydWN0aW9uIHNldCB2YXJpYW50cy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lTQSBtMzJyX2NnZW5faXNhX3RhYmxlW10gPSB7Ci0gIHsgIm0zMnIiLCAzMiwgMzIsIDE2LCAzMiwgIH0sCi0gIHsgMCB9Ci19OwotCi0vKiBNYWNoaW5lIHZhcmlhbnRzLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fTUFDSCBtMzJyX2NnZW5fbWFjaF90YWJsZVtdID0gewotICB7ICJtMzJyIiwgIm0zMnIiLCBNQUNIX00zMlIgfSwKLSAgeyAibTMycngiLCAibTMycngiLCBNQUNIX00zMlJYIH0sCi0gIHsgMCB9Ci19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lc19lbnRyaWVzW10gPQotewotICB7ICJmcCIsIDEzIH0sCi0gIHsgImxyIiwgMTQgfSwKLSAgeyAic3AiLCAxNSB9LAotICB7ICJyMCIsIDAgfSwKLSAgeyAicjEiLCAxIH0sCi0gIHsgInIyIiwgMiB9LAotICB7ICJyMyIsIDMgfSwKLSAgeyAicjQiLCA0IH0sCi0gIHsgInI1IiwgNSB9LAotICB7ICJyNiIsIDYgfSwKLSAgeyAicjciLCA3IH0sCi0gIHsgInI4IiwgOCB9LAotICB7ICJyOSIsIDkgfSwKLSAgeyAicjEwIiwgMTAgfSwKLSAgeyAicjExIiwgMTEgfSwKLSAgeyAicjEyIiwgMTIgfSwKLSAgeyAicjEzIiwgMTMgfSwKLSAgeyAicjE0IiwgMTQgfSwKLSAgeyAicjE1IiwgMTUgfQotfTsKLQotQ0dFTl9LRVlXT1JEIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcyA9Ci17Ci0gICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzX2VudHJpZXNbMF0sCi0gIDE5Ci19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lc19lbnRyaWVzW10gPQotewotICB7ICJwc3ciLCAwIH0sCi0gIHsgImNiciIsIDEgfSwKLSAgeyAic3BpIiwgMiB9LAotICB7ICJzcHUiLCAzIH0sCi0gIHsgImJwYyIsIDYgfSwKLSAgeyAiYmJwc3ciLCA4IH0sCi0gIHsgImJicGMiLCAxNCB9LAotICB7ICJjcjAiLCAwIH0sCi0gIHsgImNyMSIsIDEgfSwKLSAgeyAiY3IyIiwgMiB9LAotICB7ICJjcjMiLCAzIH0sCi0gIHsgImNyNCIsIDQgfSwKLSAgeyAiY3I1IiwgNSB9LAotICB7ICJjcjYiLCA2IH0sCi0gIHsgImNyNyIsIDcgfSwKLSAgeyAiY3I4IiwgOCB9LAotICB7ICJjcjkiLCA5IH0sCi0gIHsgImNyMTAiLCAxMCB9LAotICB7ICJjcjExIiwgMTEgfSwKLSAgeyAiY3IxMiIsIDEyIH0sCi0gIHsgImNyMTMiLCAxMyB9LAotICB7ICJjcjE0IiwgMTQgfSwKLSAgeyAiY3IxNSIsIDE1IH0KLX07Ci0KLUNHRU5fS0VZV09SRCBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXMgPQotewotICAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lc19lbnRyaWVzWzBdLAotICAyMwotfTsKLQotc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXNfZW50cmllc1tdID0KLXsKLSAgeyAiYTAiLCAwIH0sCi0gIHsgImExIiwgMSB9Ci19OwotCi1DR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zID0KLXsKLSAgJiBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXNfZW50cmllc1swXSwKLSAgMgotfTsKLQotCi0KLS8qIFRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0hXXyxhKSkKLQotY29uc3QgQ0dFTl9IV19FTlRSWSBtMzJyX2NnZW5faHdfdGFibGVbXSA9Ci17Ci0gIHsgImgtbWVtb3J5IiwgSFdfSF9NRU1PUlksIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1zaW50IiwgSFdfSF9TSU5ULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtdWludCIsIEhXX0hfVUlOVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWFkZHIiLCBIV19IX0FERFIsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1pYWRkciIsIEhXX0hfSUFERFIsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1wYyIsIEhXX0hfUEMsIENHRU5fQVNNX05PTkUsIDAsIHsgMHxBKFBST0ZJTEUpfEEoUEMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWhpMTYiLCBIV19IX0hJMTYsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1zbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC11bG8xNiIsIEhXX0hfVUxPMTYsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1nciIsIEhXX0hfR1IsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCB7IDB8QShDQUNIRV9BRERSKXxBKFBST0ZJTEUpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWNyIiwgSFdfSF9DUiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXMsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1hY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1hY2N1bXMiLCBIV19IX0FDQ1VNUywgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBtMzJyX2NnZW5fb3B2YWxfaF9hY2N1bXMsIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCkgfSB9IH0sCi0gIHsgImgtY29uZCIsIEhXX0hfQ09ORCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXBzdyIsIEhXX0hfUFNXLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYnBzdyIsIEhXX0hfQlBTVywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWJicHN3IiwgSFdfSF9CQlBTVywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWxvY2siLCBIV19IX0xPQ0ssIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiBmaWVsZCB0YWJsZS4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lGTERfLGEpKQotCi1jb25zdCBDR0VOX0lGTEQgbTMycl9jZ2VuX2lmbGRfdGFibGVbXSA9Ci17Ci0gIHsgTTMyUl9GX05JTCwgImYtbmlsIiwgMCwgMCwgMCwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfT1AxLCAiZi1vcDEiLCAwLCAzMiwgMCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfT1AyLCAiZi1vcDIiLCAwLCAzMiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfQ09ORCwgImYtY29uZCIsIDAsIDMyLCA0LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9SMSwgImYtcjEiLCAwLCAzMiwgNCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfUjIsICJmLXIyIiwgMCwgMzIsIDEyLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9TSU1NOCwgImYtc2ltbTgiLCAwLCAzMiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfU0lNTTE2LCAiZi1zaW1tMTYiLCAwLCAzMiwgMTYsIDE2LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9TSElGVF9PUDIsICJmLXNoaWZ0LW9wMiIsIDAsIDMyLCA4LCAzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9VSU1NNCwgImYtdWltbTQiLCAwLCAzMiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1VJTU01LCAiZi11aW1tNSIsIDAsIDMyLCAxMSwgNSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfVUlNTTE2LCAiZi11aW1tMTYiLCAwLCAzMiwgMTYsIDE2LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9VSU1NMjQsICJmLXVpbW0yNCIsIDAsIDMyLCA4LCAyNCwgeyAwfEEoUkVMT0MpfEEoQUJTX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfSEkxNiwgImYtaGkxNiIsIDAsIDMyLCAxNiwgMTYsIHsgMHxBKFNJR05fT1BUKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0RJU1A4LCAiZi1kaXNwOCIsIDAsIDMyLCA4LCA4LCB7IDB8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0RJU1AxNiwgImYtZGlzcDE2IiwgMCwgMzIsIDE2LCAxNiwgeyAwfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9ESVNQMjQsICJmLWRpc3AyNCIsIDAsIDMyLCA4LCAyNCwgeyAwfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9PUDIzLCAiZi1vcDIzIiwgMCwgMzIsIDksIDMsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX09QMywgImYtb3AzIiwgMCwgMzIsIDE0LCAyLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9BQ0MsICJmLWFjYyIsIDAsIDMyLCA4LCAxLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9BQ0NTLCAiZi1hY2NzIiwgMCwgMzIsIDEyLCAyLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9BQ0NELCAiZi1hY2NkIiwgMCwgMzIsIDQsIDIsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0JJVFM2NywgImYtYml0czY3IiwgMCwgMzIsIDYsIDIsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0JJVDE0LCAiZi1iaXQxNCIsIDAsIDMyLCAxNCwgMSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfSU1NMSwgImYtaW1tMSIsIDAsIDMyLCAxNSwgMSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLS8qIFRoZSBvcGVyYW5kIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fT1BFUkFORF8sYSkpCi0jZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKE0zMlJfT1BFUkFORF8sb3ApCi0KLWNvbnN0IENHRU5fT1BFUkFORCBtMzJyX2NnZW5fb3BlcmFuZF90YWJsZVtdID0KLXsKLS8qIHBjOiBwcm9ncmFtIGNvdW50ZXIgKi8KLSAgeyAicGMiLCBNMzJSX09QRVJBTkRfUEMsIEhXX0hfUEMsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNyOiBzb3VyY2UgcmVnaXN0ZXIgKi8KLSAgeyAic3IiLCBNMzJSX09QRVJBTkRfU1IsIEhXX0hfR1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkcjogZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLSAgeyAiZHIiLCBNMzJSX09QRVJBTkRfRFIsIEhXX0hfR1IsIDQsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNyYzE6IHNvdXJjZSByZWdpc3RlciAxICovCi0gIHsgInNyYzEiLCBNMzJSX09QRVJBTkRfU1JDMSwgSFdfSF9HUiwgNCwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc3JjMjogc291cmNlIHJlZ2lzdGVyIDIgKi8KLSAgeyAic3JjMiIsIE0zMlJfT1BFUkFORF9TUkMyLCBIV19IX0dSLCAxMiwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2NyOiBzb3VyY2UgY29udHJvbCByZWdpc3RlciAqLwotICB7ICJzY3IiLCBNMzJSX09QRVJBTkRfU0NSLCBIV19IX0NSLCAxMiwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGNyOiBkZXN0aW5hdGlvbiBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgImRjciIsIE0zMlJfT1BFUkFORF9EQ1IsIEhXX0hfQ1IsIDQsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNpbW04OiA4IGJpdCBzaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInNpbW04IiwgTTMyUl9PUEVSQU5EX1NJTU04LCBIV19IX1NJTlQsIDgsIDgsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNpbW0xNjogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAic2ltbTE2IiwgTTMyUl9PUEVSQU5EX1NJTU0xNiwgSFdfSF9TSU5ULCAxNiwgMTYsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHVpbW00OiA0IGJpdCB0cmFwIG51bWJlciAqLwotICB7ICJ1aW1tNCIsIE0zMlJfT1BFUkFORF9VSU1NNCwgSFdfSF9VSU5ULCAxMiwgNCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdWltbTU6IDUgYml0IHNoaWZ0IGNvdW50ICovCi0gIHsgInVpbW01IiwgTTMyUl9PUEVSQU5EX1VJTU01LCBIV19IX1VJTlQsIDExLCA1LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1aW1tMTY6IDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAidWltbTE2IiwgTTMyUl9PUEVSQU5EX1VJTU0xNiwgSFdfSF9VSU5ULCAxNiwgMTYsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGltbTE6IDEgYml0IGltbWVkaWF0ZSAqLwotICB7ICJpbW0xIiwgTTMyUl9PUEVSQU5EX0lNTTEsIEhXX0hfVUlOVCwgMTUsIDEsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX00zMlJYKSB9IH0gIH0sCi0vKiBhY2NkOiBhY2N1bXVsYXRvciBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotICB7ICJhY2NkIiwgTTMyUl9PUEVSQU5EX0FDQ0QsIEhXX0hfQUNDVU1TLCA0LCAyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCkgfSB9ICB9LAotLyogYWNjczogYWNjdW11bGF0b3Igc291cmNlIHJlZ2lzdGVyICovCi0gIHsgImFjY3MiLCBNMzJSX09QRVJBTkRfQUNDUywgSFdfSF9BQ0NVTVMsIDEyLCAyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCkgfSB9ICB9LAotLyogYWNjOiBhY2N1bXVsYXRvciByZWcgKGQpICovCi0gIHsgImFjYyIsIE0zMlJfT1BFUkFORF9BQ0MsIEhXX0hfQUNDVU1TLCA4LCAxLAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCkgfSB9ICB9LAotLyogaGFzaDogIyBwcmVmaXggKi8KLSAgeyAiaGFzaCIsIE0zMlJfT1BFUkFORF9IQVNILCBIV19IX1NJTlQsIDAsIDAsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGhpMTY6IGhpZ2ggMTYgYml0IGltbWVkaWF0ZSwgc2lnbiBvcHRpb25hbCAqLwotICB7ICJoaTE2IiwgTTMyUl9PUEVSQU5EX0hJMTYsIEhXX0hfSEkxNiwgMTYsIDE2LAotICAgIHsgMHxBKFNJR05fT1BUKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzbG8xNjogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUsIGZvciBsb3coKSAqLwotICB7ICJzbG8xNiIsIE0zMlJfT1BFUkFORF9TTE8xNiwgSFdfSF9TTE8xNiwgMTYsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1bG8xNjogMTYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSwgZm9yIGxvdygpICovCi0gIHsgInVsbzE2IiwgTTMyUl9PUEVSQU5EX1VMTzE2LCBIV19IX1VMTzE2LCAxNiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHVpbW0yNDogMjQgYml0IGFkZHJlc3MgKi8KLSAgeyAidWltbTI0IiwgTTMyUl9PUEVSQU5EX1VJTU0yNCwgSFdfSF9BRERSLCA4LCAyNCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCl8QShSRUxPQyl8QShBQlNfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlzcDg6IDggYml0IGRpc3BsYWNlbWVudCAqLwotICB7ICJkaXNwOCIsIE0zMlJfT1BFUkFORF9ESVNQOCwgSFdfSF9JQUREUiwgOCwgOCwKLSAgICB7IDB8QShSRUxBWCl8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwMTY6IDE2IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSAgeyAiZGlzcDE2IiwgTTMyUl9PUEVSQU5EX0RJU1AxNiwgSFdfSF9JQUREUiwgMTYsIDE2LAotICAgIHsgMHxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpc3AyNDogMjQgYml0IGRpc3BsYWNlbWVudCAqLwotICB7ICJkaXNwMjQiLCBNMzJSX09QRVJBTkRfRElTUDI0LCBIV19IX0lBRERSLCA4LCAyNCwKLSAgICB7IDB8QShSRUxBWCl8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBjb25kYml0OiBjb25kaXRpb24gYml0ICovCi0gIHsgImNvbmRiaXQiLCBNMzJSX09QRVJBTkRfQ09OREJJVCwgSFdfSF9DT05ELCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBhY2N1bTogYWNjdW11bGF0b3IgKi8KLSAgeyAiYWNjdW0iLCBNMzJSX09QRVJBTkRfQUNDVU0sIEhXX0hfQUNDVU0sIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JQkFTRSBtMzJyX2NnZW5faW5zbl90YWJsZVtNQVhfSU5TTlNdID0KLXsKLSAgLyogU3BlY2lhbCBudWxsIGZpcnN0IGVudHJ5LgotICAgICBBIGBudW0nIHZhbHVlIG9mIHplcm8gaXMgdGh1cyBpbnZhbGlkLgotICAgICBBbHNvLCB0aGUgc3BlY2lhbCBgaW52YWxpZCcgaW5zbiByZXNpZGVzIGhlcmUuICAqLwotICB7IDAsIDAsIDAgfSwKLS8qIGFkZCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQURELCAiYWRkIiwgImFkZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGFkZDMgJGRyLCRzciwkaGFzaCRzbG8xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FERDMsICJhZGQzIiwgImFkZDMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGFuZCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQU5ELCAiYW5kIiwgImFuZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGFuZDMgJGRyLCRzciwkdWltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQU5EMywgImFuZDMiLCAiYW5kMyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogb3IgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX09SLCAib3IiLCAib3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBvcjMgJGRyLCRzciwkaGFzaCR1bG8xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX09SMywgIm9yMyIsICJvcjMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHhvciAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fWE9SLCAieG9yIiwgInhvciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIHhvcjMgJGRyLCRzciwkdWltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fWE9SMywgInhvcjMiLCAieG9yMyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYWRkaSAkZHIsJHNpbW04ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQURESSwgImFkZGkiLCAiYWRkaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGFkZHYgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FERFYsICJhZGR2IiwgImFkZHYiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBhZGR2MyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BRERWMywgImFkZHYzIiwgImFkZHYzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBhZGR4ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BRERYLCAiYWRkeCIsICJhZGR4IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogYmMucyAkZGlzcDggKi8KLSAgewotICAgIE0zMlJfSU5TTl9CQzgsICJiYzgiLCAiYmMucyIsIDE2LAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogYmMubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkMyNCwgImJjMjQiLCAiYmMubCIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmVxICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CRVEsICJiZXEiLCAiYmVxIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBiZXF6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CRVFaLCAiYmVxeiIsICJiZXF6IiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBiZ2V6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CR0VaLCAiYmdleiIsICJiZ2V6IiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBiZ3R6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CR1RaLCAiYmd0eiIsICJiZ3R6IiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBibGV6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTEVaLCAiYmxleiIsICJibGV6IiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBibHR6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTFRaLCAiYmx0eiIsICJibHR6IiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBibmV6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTkVaLCAiYm5leiIsICJibmV6IiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBibC5zICRkaXNwOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JMOCwgImJsOCIsICJibC5zIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBibC5sICRkaXNwMjQgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTDI0LCAiYmwyNCIsICJibC5sIiwgMzIsCi0gICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJjbC5zICRkaXNwOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JDTDgsICJiY2w4IiwgImJjbC5zIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJjbC5sICRkaXNwMjQgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CQ0wyNCwgImJjbDI0IiwgImJjbC5sIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYm5jLnMgJGRpc3A4ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5DOCwgImJuYzgiLCAiYm5jLnMiLCAxNiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJuYy5sICRkaXNwMjQgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTkMyNCwgImJuYzI0IiwgImJuYy5sIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBibmUgJHNyYzEsJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JORSwgImJuZSIsICJibmUiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJyYS5zICRkaXNwOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JSQTgsICJicmE4IiwgImJyYS5zIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBicmEubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQlJBMjQsICJicmEyNCIsICJicmEubCIsIDMyLAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBibmNsLnMgJGRpc3A4ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5DTDgsICJibmNsOCIsICJibmNsLnMiLCAxNiwKLSAgICB7IDB8QShGSUxMX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PIH0gfQotICB9LAotLyogYm5jbC5sICRkaXNwMjQgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTkNMMjQsICJibmNsMjQiLCAiYm5jbC5sIiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogY21wICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQ01QLCAiY21wIiwgImNtcCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIGNtcGkgJHNyYzIsJHNpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUEksICJjbXBpIiwgImNtcGkiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGNtcHUgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9DTVBVLCAiY21wdSIsICJjbXB1IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogY21wdWkgJHNyYzIsJHNpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUFVJLCAiY21wdWkiLCAiY21wdWkiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGNtcGVxICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQ01QRVEsICJjbXBlcSIsICJjbXBlcSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBjbXB6ICRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQ01QWiwgImNtcHoiLCAiY21weiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBkaXYgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0RJViwgImRpdiIsICJkaXYiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGRpdnUgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0RJVlUsICJkaXZ1IiwgImRpdnUiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHJlbSAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fUkVNLCAicmVtIiwgInJlbSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogcmVtdSAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fUkVNVSwgInJlbXUiLCAicmVtdSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogZGl2aCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fRElWSCwgImRpdmgiLCAiZGl2aCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGpjICRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0pDLCAiamMiLCAiamMiLCAxNiwKLSAgICB7IDB8QShTUEVDSUFMKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGpuYyAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9KTkMsICJqbmMiLCAiam5jIiwgMTYsCi0gICAgeyAwfEEoU1BFQ0lBTCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBqbCAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9KTCwgImpsIiwgImpsIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBqbXAgJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fSk1QLCAiam1wIiwgImptcCIsIDE2LAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZCAkZHIsQCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xELCAibGQiLCAibGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGxkICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERfRCwgImxkLWQiLCAibGQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkYiAkZHIsQCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEQiwgImxkYiIsICJsZGIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGxkYiAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEQl9ELCAibGRiLWQiLCAibGRiIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZGggJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MREgsICJsZGgiLCAibGRoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZGggJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MREhfRCwgImxkaC1kIiwgImxkaCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGR1YiAkZHIsQCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEVUIsICJsZHViIiwgImxkdWIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRFVCX0QsICJsZHViLWQiLCAibGR1YiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGR1aCAkZHIsQCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEVUgsICJsZHVoIiwgImxkdWgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRFVIX0QsICJsZHVoLWQiLCAibGR1aCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGQgJGRyLEAkc3IrICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERfUExVUywgImxkLXBsdXMiLCAibGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGxkMjQgJGRyLCR1aW1tMjQgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRDI0LCAibGQyNCIsICJsZDI0IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZGk4ICRkciwkc2ltbTggKi8KLSAgewotICAgIE0zMlJfSU5TTl9MREk4LCAibGRpOCIsICJsZGk4IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogbGRpMTYgJGRyLCRoYXNoJHNsbzE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERJMTYsICJsZGkxNiIsICJsZGkxNiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbG9jayAkZHIsQCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xPQ0ssICJsb2NrIiwgImxvY2siLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIG1hY2hpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDSEksICJtYWNoaSIsICJtYWNoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjaGkgJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ0hJX0EsICJtYWNoaS1hIiwgIm1hY2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjbG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNMTywgIm1hY2xvIiwgIm1hY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtYWNsbyAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDTE9fQSwgIm1hY2xvLWEiLCAibWFjbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtYWN3aGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNXSEksICJtYWN3aGkiLCAibWFjd2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtYWN3aGkgJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ1dISV9BLCAibWFjd2hpLWEiLCAibWFjd2hpIiwgMTYsCi0gICAgeyAwfEEoU1BFQ0lBTCksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtYWN3bG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNXTE8sICJtYWN3bG8iLCAibWFjd2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtYWN3bG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ1dMT19BLCAibWFjd2xvLWEiLCAibWFjd2xvIiwgMTYsCi0gICAgeyAwfEEoU1BFQ0lBTCksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdWwgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTCwgIm11bCIsICJtdWwiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG11bGhpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMSEksICJtdWxoaSIsICJtdWxoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsaGkgJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTEhJX0EsICJtdWxoaS1hIiwgIm11bGhpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXVsbG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxMTywgIm11bGxvIiwgIm11bGxvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdWxsbyAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMTE9fQSwgIm11bGxvLWEiLCAibXVsbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdWx3aGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxXSEksICJtdWx3aGkiLCAibXVsd2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdWx3aGkgJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTFdISV9BLCAibXVsd2hpLWEiLCAibXVsd2hpIiwgMTYsCi0gICAgeyAwfEEoU1BFQ0lBTCksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdWx3bG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxXTE8sICJtdWx3bG8iLCAibXVsd2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdWx3bG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTFdMT19BLCAibXVsd2xvLWEiLCAibXVsd2xvIiwgMTYsCi0gICAgeyAwfEEoU1BFQ0lBTCksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdiAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVYsICJtdiIsICJtdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIG12ZmFjaGkgJGRyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZGQUNISSwgIm12ZmFjaGkiLCAibXZmYWNoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbXZmYWNoaSAkZHIsJGFjY3MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVkZBQ0hJX0EsICJtdmZhY2hpLWEiLCAibXZmYWNoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12ZmFjbG8gJGRyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZGQUNMTywgIm12ZmFjbG8iLCAibXZmYWNsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbXZmYWNsbyAkZHIsJGFjY3MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVkZBQ0xPX0EsICJtdmZhY2xvLWEiLCAibXZmYWNsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12ZmFjbWkgJGRyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZGQUNNSSwgIm12ZmFjbWkiLCAibXZmYWNtaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbXZmYWNtaSAkZHIsJGFjY3MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVkZBQ01JX0EsICJtdmZhY21pLWEiLCAibXZmYWNtaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12ZmMgJGRyLCRzY3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVkZDLCAibXZmYyIsICJtdmZjIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBtdnRhY2hpICRzcmMxICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZUQUNISSwgIm12dGFjaGkiLCAibXZ0YWNoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogbXZ0YWNoaSAkc3JjMSwkYWNjcyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WVEFDSElfQSwgIm12dGFjaGktYSIsICJtdnRhY2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbXZ0YWNsbyAkc3JjMSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WVEFDTE8sICJtdnRhY2xvIiwgIm12dGFjbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12dGFjbG8gJHNyYzEsJGFjY3MgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVlRBQ0xPX0EsICJtdnRhY2xvLWEiLCAibXZ0YWNsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG12dGMgJHNyLCRkY3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVlRDLCAibXZ0YyIsICJtdnRjIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBuZWcgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX05FRywgIm5lZyIsICJuZWciLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBub3AgKi8KLSAgewotICAgIE0zMlJfSU5TTl9OT1AsICJub3AiLCAibm9wIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogbm90ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9OT1QsICJub3QiLCAibm90IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogcmFjICovCi0gIHsKLSAgICBNMzJSX0lOU05fUkFDLCAicmFjIiwgInJhYyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSwgUElQRV9TIH0gfQotICB9LAotLyogcmFjICRhY2NkLCRhY2NzLCRpbW0xICovCi0gIHsKLSAgICBNMzJSX0lOU05fUkFDX0RTSSwgInJhYy1kc2kiLCAicmFjIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogcmFjaCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JBQ0gsICJyYWNoIiwgInJhY2giLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUiksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIHJhY2ggJGFjY2QsJGFjY3MsJGltbTEgKi8KLSAgewotICAgIE0zMlJfSU5TTl9SQUNIX0RTSSwgInJhY2gtZHNpIiwgInJhY2giLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBydGUgKi8KLSAgewotICAgIE0zMlJfSU5TTl9SVEUsICJydGUiLCAicnRlIiwgMTYsCi0gICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHNldGggJGRyLCRoYXNoJGhpMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TRVRILCAic2V0aCIsICJzZXRoIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBzbGwgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NMTCwgInNsbCIsICJzbGwiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHNsbDMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0xMMywgInNsbDMiLCAic2xsMyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc2xsaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0xMSSwgInNsbGkiLCAic2xsaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3JhICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkEsICJzcmEiLCAic3JhIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzcmEzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NSQTMsICJzcmEzIiwgInNyYTMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHNyYWkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NSQUksICJzcmFpIiwgInNyYWkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHNybCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JMLCAic3JsIiwgInNybCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3JsMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkwzLCAic3JsMyIsICJzcmwzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBzcmxpICRkciwkdWltbTUgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkxJLCAic3JsaSIsICJzcmxpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVCwgInN0IiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVF9ELCAic3QtZCIsICJzdCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc3RiICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUQiwgInN0YiIsICJzdGIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVEJfRCwgInN0Yi1kIiwgInN0YiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc3RoICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUSCwgInN0aCIsICJzdGgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVEhfRCwgInN0aC1kIiwgInN0aCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCskc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUX1BMVVMsICJzdC1wbHVzIiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxALSRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RfTUlOVVMsICJzdC1taW51cyIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3ViICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVUIsICJzdWIiLCAic3ViIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX09TIH0gfQotICB9LAotLyogc3VidiAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1VCViwgInN1YnYiLCAic3VidiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PUyB9IH0KLSAgfSwKLS8qIHN1YnggJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NVQlgsICJzdWJ4IiwgInN1YngiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiB0cmFwICR1aW1tNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1RSQVAsICJ0cmFwIiwgInRyYXAiLCAxNiwKLSAgICB7IDB8QShGSUxMX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHVubG9jayAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9VTkxPQ0ssICJ1bmxvY2siLCAidW5sb2NrIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzYXRiICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TQVRCLCAic2F0YiIsICJzYXRiIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc2F0aCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0FUSCwgInNhdGgiLCAic2F0aCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHNhdCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0FULCAic2F0IiwgInNhdCIsIDMyLAotICAgIHsgMHxBKFNQRUNJQUwpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogcGNtcGJ6ICRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fUENNUEJaLCAicGNtcGJ6IiwgInBjbXBieiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBzYWRkICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0FERCwgInNhZGQiLCAic2FkZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIG1hY3d1MSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ1dVMSwgIm1hY3d1MSIsICJtYWN3dTEiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtc2JsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01TQkxPLCAibXNibG8iLCAibXNibG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiBtdWx3dTEgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxXVTEsICJtdWx3dTEiLCAibXVsd3UxIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9TIH0gfQotICB9LAotLyogbWFjbGgxICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDTEgxLCAibWFjbGgxIiwgIm1hY2xoMSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIHNjICovCi0gIHsKLSAgICBNMzJSX0lOU05fU0MsICJzYyIsICJzYyIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpfEEoU0tJUF9DVEkpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PIH0gfQotICB9LAotLyogc25jICovCi0gIHsKLSAgICBNMzJSX0lOU05fU05DLCAic25jIiwgInNuYyIsIDE2LAotICAgIHsgMHxBKFNQRUNJQUwpfEEoU0tJUF9DVEkpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9PIH0gfQotICB9LAotfTsKLQotI3VuZGVmIEEKLSN1bmRlZiBNTkVNCi0jdW5kZWYgT1AKLQotLyogSW5pdGlhbGl6ZSBhbnl0aGluZyBuZWVkZWQgdG8gYmUgZG9uZSBvbmNlLCBiZWZvcmUgYW55IGNwdV9vcGVuIGNhbGwuICAqLwotCi1zdGF0aWMgdm9pZAotaW5pdF90YWJsZXMgKCkKLXsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gbG9vayB1cCBhIG1hY2ggdmlhIGl0cyBiZmQgbmFtZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX01BQ0ggKgotbG9va3VwX21hY2hfdmlhX2JmZF9uYW1lICh0YWJsZSwgbmFtZSkKLSAgICAgY29uc3QgQ0dFTl9NQUNIICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgd2hpbGUgKHRhYmxlLT5uYW1lKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHRhYmxlLT5iZmRfbmFtZSkgPT0gMCkKLQlyZXR1cm4gdGFibGU7Ci0gICAgICArK3RhYmxlOwotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9od190YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBtYWNocyA9IGNkLT5tYWNoczsKLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqaW5pdCA9ICYgbTMycl9jZ2VuX2h3X3RhYmxlWzBdOwotICAvKiBNQVhfSFcgaXMgb25seSBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVudHJpZXMuCi0gICAgIEhvd2V2ZXIgZWFjaCBlbnRyeSBpcyBpbmRleGVkIGJ5IGl0J3MgZW51bSBzbyB0aGVyZSBjYW4gYmUgaG9sZXMgaW4KLSAgICAgdGhlIHRhYmxlLiAgKi8KLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKnNlbGVjdGVkID0KLSAgICAoY29uc3QgQ0dFTl9IV19FTlRSWSAqKikgeG1hbGxvYyAoTUFYX0hXICogc2l6ZW9mIChDR0VOX0hXX0VOVFJZICopKTsKLQotICBjZC0+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+aW5zbl90YWJsZS5pbml0X2VudHJpZXMpOwotICBpZiAoY2QtPmh3X3RhYmxlLmVudHJpZXMpCi0gICAgZnJlZSAoKENHRU5fSFdfRU5UUlkgKikgY2QtPmh3X3RhYmxlLmVudHJpZXMpOwotICBmcmVlIChjZCk7Ci19Ci0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1kZXNjLmggYi9vcGNvZGVzL20zMnItZGVzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTBmYWM2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1kZXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyogQ1BVIGRhdGEgaGVhZGVyIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIE0zMlJfQ1BVX0gKLSNkZWZpbmUgTTMyUl9DUFVfSAotCi0jZGVmaW5lIENHRU5fQVJDSCBtMzJyCi0KLS8qIEdpdmVuIHN5bWJvbCBTLCByZXR1cm4gbTMycl9jZ2VuXzxTPi4gICovCi0jZGVmaW5lIENHRU5fU1lNKHMpIENPTkNBVDMgKG0zMnIsX2NnZW5fLHMpCi0KLS8qIFNlbGVjdGVkIGNwdSBmYW1pbGllcy4gICovCi0jZGVmaW5lIEhBVkVfQ1BVX00zMlJCRgotI2RlZmluZSBIQVZFX0NQVV9NMzJSWEYKLQotI2RlZmluZSBDR0VOX0lOU05fTFNCMF9QIDAKLQotLyogTWluaW11bSBzaXplIG9mIGFueSBpbnNuIChpbiBieXRlcykuICAqLwotI2RlZmluZSBDR0VOX01JTl9JTlNOX1NJWkUgMgotCi0vKiBNYXhpbXVtIHNpemUgb2YgYW55IGluc24gKGluIGJ5dGVzKS4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lOU05fU0laRSA0Ci0KLSNkZWZpbmUgQ0dFTl9JTlRfSU5TTl9QIDEKLQotLyogRklYTUU6IE5lZWQgdG8gY29tcHV0ZSBDR0VOX01BWF9TWU5UQVhfQllURVMuICAqLwotCi0vKiBDR0VOX01ORU1PTklDX09QRVJBTkRTIGlzIGRlZmluZWQgaWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMuCi0gICBlLmcuIEluICJiLGEgZm9vIiB0aGUgIixhIiBpcyBhbiBvcGVyYW5kLiAgSWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMKLSAgIHdlIGNhbid0IGhhc2ggb24gZXZlcnl0aGluZyB1cCB0byB0aGUgc3BhY2UuICAqLwotI2RlZmluZSBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIGFueSBpbnNuIG9yIG1hY3JvLWluc24gaGFzLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSU5TTl9PUEVSQU5EUyAxNgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBmaWVsZHMgaW4gYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBDR0VOX01BWF9JRk1UX09QRVJBTkRTIDcKLQotLyogRW51bXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIGZvcm1hdCBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDEgewotICBPUDFfMCwgT1AxXzEsIE9QMV8yLCBPUDFfMwotICwgT1AxXzQsIE9QMV81LCBPUDFfNiwgT1AxXzcKLSAsIE9QMV84LCBPUDFfOSwgT1AxXzEwLCBPUDFfMTEKLSAsIE9QMV8xMiwgT1AxXzEzLCBPUDFfMTQsIE9QMV8xNQotfSBJTlNOX09QMTsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3Igb3AyIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wMiB7Ci0gIE9QMl8wLCBPUDJfMSwgT1AyXzIsIE9QMl8zCi0gLCBPUDJfNCwgT1AyXzUsIE9QMl82LCBPUDJfNwotICwgT1AyXzgsIE9QMl85LCBPUDJfMTAsIE9QMl8xMQotICwgT1AyXzEyLCBPUDJfMTMsIE9QMl8xNCwgT1AyXzE1Ci19IElOU05fT1AyOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwotdHlwZWRlZiBlbnVtIGdyX25hbWVzIHsKLSAgSF9HUl9GUCA9IDEzLCBIX0dSX0xSID0gMTQsIEhfR1JfU1AgPSAxNSwgSF9HUl9SMCA9IDAKLSAsIEhfR1JfUjEgPSAxLCBIX0dSX1IyID0gMiwgSF9HUl9SMyA9IDMsIEhfR1JfUjQgPSA0Ci0gLCBIX0dSX1I1ID0gNSwgSF9HUl9SNiA9IDYsIEhfR1JfUjcgPSA3LCBIX0dSX1I4ID0gOAotICwgSF9HUl9SOSA9IDksIEhfR1JfUjEwID0gMTAsIEhfR1JfUjExID0gMTEsIEhfR1JfUjEyID0gMTIKLSAsIEhfR1JfUjEzID0gMTMsIEhfR1JfUjE0ID0gMTQsIEhfR1JfUjE1ID0gMTUKLX0gR1JfTkFNRVM7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIC4gICovCi10eXBlZGVmIGVudW0gY3JfbmFtZXMgewotICBIX0NSX1BTVyA9IDAsIEhfQ1JfQ0JSID0gMSwgSF9DUl9TUEkgPSAyLCBIX0NSX1NQVSA9IDMKLSAsIEhfQ1JfQlBDID0gNiwgSF9DUl9CQlBTVyA9IDgsIEhfQ1JfQkJQQyA9IDE0LCBIX0NSX0NSMCA9IDAKLSAsIEhfQ1JfQ1IxID0gMSwgSF9DUl9DUjIgPSAyLCBIX0NSX0NSMyA9IDMsIEhfQ1JfQ1I0ID0gNAotICwgSF9DUl9DUjUgPSA1LCBIX0NSX0NSNiA9IDYsIEhfQ1JfQ1I3ID0gNywgSF9DUl9DUjggPSA4Ci0gLCBIX0NSX0NSOSA9IDksIEhfQ1JfQ1IxMCA9IDEwLCBIX0NSX0NSMTEgPSAxMSwgSF9DUl9DUjEyID0gMTIKLSAsIEhfQ1JfQ1IxMyA9IDEzLCBIX0NSX0NSMTQgPSAxNCwgSF9DUl9DUjE1ID0gMTUKLX0gQ1JfTkFNRVM7Ci0KLS8qIEF0dHJpYnV0ZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtYWNoaW5lIHR5cGUgc2VsZWN0aW9uLiAgKi8KLXR5cGVkZWYgZW51bSBtYWNoX2F0dHIgewotICBNQUNIX0JBU0UsIE1BQ0hfTTMyUiwgTUFDSF9NMzJSWCwgTUFDSF9NQVgKLX0gTUFDSF9BVFRSOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnN0cnVjdGlvbiBzZXQgc2VsZWN0aW9uLiAgKi8KLXR5cGVkZWYgZW51bSBpc2FfYXR0ciB7Ci0gIElTQV9NMzJSLCBJU0FfTUFYCi19IElTQV9BVFRSOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBwYXJhbGxlbCBleGVjdXRpb24gcGlwZWxpbmUgc2VsZWN0aW9uLiAgKi8KLXR5cGVkZWYgZW51bSBwaXBlX2F0dHIgewotICBQSVBFX05PTkUsIFBJUEVfTywgUElQRV9TLCBQSVBFX09TCi19IFBJUEVfQVRUUjsKLQotLyogTnVtYmVyIG9mIGFyY2hpdGVjdHVyZSB2YXJpYW50cy4gICovCi0jZGVmaW5lIE1BWF9JU0FTICAxCi0jZGVmaW5lIE1BWF9NQUNIUyAoKGludCkgTUFDSF9NQVgpCi0KLS8qIElmaWVsZCBzdXBwb3J0LiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBjZ2VuX2lmbGQgbTMycl9jZ2VuX2lmbGRfdGFibGVbXTsKLQotLyogSWZpZWxkIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pZmxkIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2lmbGRfYXR0ciB7Ci0gIENHRU5fSUZMRF9WSVJUVUFMLCBDR0VOX0lGTERfUENSRUxfQUREUiwgQ0dFTl9JRkxEX0FCU19BRERSLCBDR0VOX0lGTERfUkVTRVJWRUQKLSAsIENHRU5fSUZMRF9TSUdOX09QVCwgQ0dFTl9JRkxEX1NJR05FRCwgQ0dFTl9JRkxEX1JFTE9DLCBDR0VOX0lGTERfRU5EX0JPT0xTCi0gLCBDR0VOX0lGTERfU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSUZMRF9NQUNILCBDR0VOX0lGTERfRU5EX05CT09MUwotfSBDR0VOX0lGTERfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faWZsZF9hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JRkxEX05CT09MX0FUVFJTIChDR0VOX0lGTERfRU5EX05CT09MUyAtIENHRU5fSUZMRF9TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtMzJyIGlmaWVsZCB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gaWZpZWxkX3R5cGUgewotICBNMzJSX0ZfTklMLCBNMzJSX0ZfT1AxLCBNMzJSX0ZfT1AyLCBNMzJSX0ZfQ09ORAotICwgTTMyUl9GX1IxLCBNMzJSX0ZfUjIsIE0zMlJfRl9TSU1NOCwgTTMyUl9GX1NJTU0xNgotICwgTTMyUl9GX1NISUZUX09QMiwgTTMyUl9GX1VJTU00LCBNMzJSX0ZfVUlNTTUsIE0zMlJfRl9VSU1NMTYKLSAsIE0zMlJfRl9VSU1NMjQsIE0zMlJfRl9ISTE2LCBNMzJSX0ZfRElTUDgsIE0zMlJfRl9ESVNQMTYKLSAsIE0zMlJfRl9ESVNQMjQsIE0zMlJfRl9PUDIzLCBNMzJSX0ZfT1AzLCBNMzJSX0ZfQUNDCi0gLCBNMzJSX0ZfQUNDUywgTTMyUl9GX0FDQ0QsIE0zMlJfRl9CSVRTNjcsIE0zMlJfRl9CSVQxNAotICwgTTMyUl9GX0lNTTEsIE0zMlJfRl9NQVgKLX0gSUZJRUxEX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX0lGTEQgKChpbnQpIE0zMlJfRl9NQVgpCi0KLS8qIEhhcmR3YXJlIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9odyBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9od19hdHRyIHsKLSAgQ0dFTl9IV19WSVJUVUFMLCBDR0VOX0hXX0NBQ0hFX0FERFIsIENHRU5fSFdfUEMsIENHRU5fSFdfUFJPRklMRQotICwgQ0dFTl9IV19FTkRfQk9PTFMsIENHRU5fSFdfU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSFdfTUFDSCwgQ0dFTl9IV19FTkRfTkJPT0xTCi19IENHRU5fSFdfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faHdfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSFdfTkJPT0xfQVRUUlMgKENHRU5fSFdfRU5EX05CT09MUyAtIENHRU5fSFdfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbTMyciBoYXJkd2FyZSB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9od190eXBlIHsKLSAgSFdfSF9NRU1PUlksIEhXX0hfU0lOVCwgSFdfSF9VSU5ULCBIV19IX0FERFIKLSAsIEhXX0hfSUFERFIsIEhXX0hfUEMsIEhXX0hfSEkxNiwgSFdfSF9TTE8xNgotICwgSFdfSF9VTE8xNiwgSFdfSF9HUiwgSFdfSF9DUiwgSFdfSF9BQ0NVTQotICwgSFdfSF9BQ0NVTVMsIEhXX0hfQ09ORCwgSFdfSF9QU1csIEhXX0hfQlBTVwotICwgSFdfSF9CQlBTVywgSFdfSF9MT0NLLCBIV19NQVgKLX0gQ0dFTl9IV19UWVBFOwotCi0jZGVmaW5lIE1BWF9IVyAoKGludCkgSFdfTUFYKQotCi0vKiBPcGVyYW5kIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9vcGVyYW5kIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX29wZXJhbmRfYXR0ciB7Ci0gIENHRU5fT1BFUkFORF9WSVJUVUFMLCBDR0VOX09QRVJBTkRfUENSRUxfQUREUiwgQ0dFTl9PUEVSQU5EX0FCU19BRERSLCBDR0VOX09QRVJBTkRfU0lHTl9PUFQKLSAsIENHRU5fT1BFUkFORF9TSUdORUQsIENHRU5fT1BFUkFORF9ORUdBVElWRSwgQ0dFTl9PUEVSQU5EX1JFTEFYLCBDR0VOX09QRVJBTkRfU0VNX09OTFkKLSAsIENHRU5fT1BFUkFORF9SRUxPQywgQ0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYLCBDR0VOX09QRVJBTkRfRU5EX0JPT0xTLCBDR0VOX09QRVJBTkRfU1RBUlRfTkJPT0xTID0gMzEKLSAsIENHRU5fT1BFUkFORF9NQUNILCBDR0VOX09QRVJBTkRfRU5EX05CT09MUwotfSBDR0VOX09QRVJBTkRfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5fb3BlcmFuZF9hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTIChDR0VOX09QRVJBTkRfRU5EX05CT09MUyAtIENHRU5fT1BFUkFORF9TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtMzJyIG9wZXJhbmQgdHlwZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5fb3BlcmFuZF90eXBlIHsKLSAgTTMyUl9PUEVSQU5EX1BDLCBNMzJSX09QRVJBTkRfU1IsIE0zMlJfT1BFUkFORF9EUiwgTTMyUl9PUEVSQU5EX1NSQzEKLSAsIE0zMlJfT1BFUkFORF9TUkMyLCBNMzJSX09QRVJBTkRfU0NSLCBNMzJSX09QRVJBTkRfRENSLCBNMzJSX09QRVJBTkRfU0lNTTgKLSAsIE0zMlJfT1BFUkFORF9TSU1NMTYsIE0zMlJfT1BFUkFORF9VSU1NNCwgTTMyUl9PUEVSQU5EX1VJTU01LCBNMzJSX09QRVJBTkRfVUlNTTE2Ci0gLCBNMzJSX09QRVJBTkRfSU1NMSwgTTMyUl9PUEVSQU5EX0FDQ0QsIE0zMlJfT1BFUkFORF9BQ0NTLCBNMzJSX09QRVJBTkRfQUNDCi0gLCBNMzJSX09QRVJBTkRfSEFTSCwgTTMyUl9PUEVSQU5EX0hJMTYsIE0zMlJfT1BFUkFORF9TTE8xNiwgTTMyUl9PUEVSQU5EX1VMTzE2Ci0gLCBNMzJSX09QRVJBTkRfVUlNTTI0LCBNMzJSX09QRVJBTkRfRElTUDgsIE0zMlJfT1BFUkFORF9ESVNQMTYsIE0zMlJfT1BFUkFORF9ESVNQMjQKLSAsIE0zMlJfT1BFUkFORF9DT05EQklULCBNMzJSX09QRVJBTkRfQUNDVU0sIE0zMlJfT1BFUkFORF9NQVgKLX0gQ0dFTl9PUEVSQU5EX1RZUEU7Ci0KLS8qIE51bWJlciBvZiBvcGVyYW5kcyB0eXBlcy4gICovCi0jZGVmaW5lIE1BWF9PUEVSQU5EUyAoKGludCkgTTMyUl9PUEVSQU5EX01BWCkKLQotLyogTWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgcmVmZXJlbmNlZCBieSBhbnkgaW5zbi4gICovCi0jZGVmaW5lIE1BWF9PUEVSQU5EX0lOU1RBTkNFUyAxMQotCi0vKiBJbnNuIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pbnNuIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2luc25fYXR0ciB7Ci0gIENHRU5fSU5TTl9BTElBUywgQ0dFTl9JTlNOX1ZJUlRVQUwsIENHRU5fSU5TTl9VTkNPTkRfQ1RJLCBDR0VOX0lOU05fQ09ORF9DVEkKLSAsIENHRU5fSU5TTl9TS0lQX0NUSSwgQ0dFTl9JTlNOX0RFTEFZX1NMT1QsIENHRU5fSU5TTl9SRUxBWEFCTEUsIENHRU5fSU5TTl9SRUxBWAotICwgQ0dFTl9JTlNOX05PX0RJUywgQ0dFTl9JTlNOX1BCQiwgQ0dFTl9JTlNOX0ZJTExfU0xPVCwgQ0dFTl9JTlNOX1NQRUNJQUwKLSAsIENHRU5fSU5TTl9FTkRfQk9PTFMsIENHRU5fSU5TTl9TVEFSVF9OQk9PTFMgPSAzMSwgQ0dFTl9JTlNOX01BQ0gsIENHRU5fSU5TTl9QSVBFCi0gLCBDR0VOX0lOU05fRU5EX05CT09MUwotfSBDR0VOX0lOU05fQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faW5zbl9hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX05CT09MX0FUVFJTIChDR0VOX0lOU05fRU5EX05CT09MUyAtIENHRU5fSU5TTl9TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBjZ2VuLmggdXNlcyB0aGluZ3Mgd2UganVzdCBkZWZpbmVkLiAgKi8KLSNpbmNsdWRlICJvcGNvZGUvY2dlbi5oIgotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2hhcmR3YXJlX2F0dHJfdGFibGVbXTsKLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2lmaWVsZF9hdHRyX3RhYmxlW107Ci1leHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9vcGVyYW5kX2F0dHJfdGFibGVbXTsKLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2luc25fYXR0cl90YWJsZVtdOwotCi0vKiBIYXJkd2FyZSBkZWNscy4gICovCi0KLWV4dGVybiBDR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtczsKLQotCi0KLQotI2VuZGlmIC8qIE0zMlJfQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1kaXMuYyBiL29wY29kZXMvbTMyci1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4MDc4NC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjkgKzAsMCBAQAotLyogRGlzYXNzZW1ibGVyIGludGVyZmFjZSBmb3IgdGFyZ2V0cyB1c2luZyBDR0VOLiAtKi0gQyAtKi0KLSAgIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IKLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLS0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWRpcy5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIERlZmF1bHQgdGV4dCB0byBwcmludCBpZiBhbiBpbnN0cnVjdGlvbiBpc24ndCByZWNvZ25pemVkLiAgKi8KLSNkZWZpbmUgVU5LTk9XTl9JTlNOX01TRyBfKCIqdW5rbm93bioiKQotCi1zdGF0aWMgdm9pZCBwcmludF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBsb25nLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRfYWRkcmVzcwotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGJmZF92bWEsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9rZXl3b3JkCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgQ0dFTl9LRVlXT1JEICosIGxvbmcsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBjb25zdCBDR0VOX0lOU04gKiwgQ0dFTl9GSUVMRFMgKiwKLQkgICAgICBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBpbnQgcHJpbnRfaW5zbiBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBiZmRfdm1hLAotCQkJICAgICAgIGRpc2Fzc2VtYmxlX2luZm8gKiwgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgZGVmYXVsdF9wcmludF9pbnNuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotDAotLyogLS0gZGlzYXNzZW1ibGVyIHJvdXRpbmVzIGluc2VydGVkIGhlcmUgKi8KLQotLyogLS0gZGlzLmMgKi8KLQotLyogSW1tZWRpYXRlIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCAnIycuICAqLwotCi0jZGVmaW5lIENHRU5fUFJJTlRfTk9STUFMKGNkLCBpbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpIFwKLWRvIHsgXAotICBpZiAoQ0dFTl9CT09MX0FUVFIgKChhdHRycyksIENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCkpIFwKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMiKTsgXAotfSB3aGlsZSAoMCkKLQotLyogSGFuZGxlICcjJyBwcmVmaXhlcyBhcyBvcGVyYW5kcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9oYXNoIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjIik7Ci19Ci0KLSN1bmRlZiBDR0VOX1BSSU5UX0lOU04KLSNkZWZpbmUgQ0dFTl9QUklOVF9JTlNOIG15X3ByaW50X2luc24KLQotc3RhdGljIGludAotbXlfcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjaGFyIGJ1ZmZlcltDR0VOX01BWF9JTlNOX1NJWkVdOwotICBjaGFyICpidWYgPSBidWZmZXI7Ci0gIGludCBzdGF0dXM7Ci0gIGludCBidWZsZW4gPSAocGMgJiAzKSA9PSAwID8gNCA6IDI7Ci0KLSAgLyogUmVhZCB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBpbnNuLiAgKi8KLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYywgYnVmLCBidWZsZW4sIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiAzMiBiaXQgaW5zbj8gICovCi0gIGlmICgocGMgJiAzKSA9PSAwICYmIChidWZbMF0gJiAweDgwKSAhPSAwKQotICAgIHJldHVybiBwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgYnVmbGVuKTsKLQotICAvKiBQcmludCB0aGUgZmlyc3QgaW5zbi4gICovCi0gIGlmICgocGMgJiAzKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgMikgPT0gMCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7Ci0gICAgICBidWYgKz0gMjsKLSAgICB9Ci0KLSAgaWYgKGJ1ZlswXSAmIDB4ODApCi0gICAgewotICAgICAgLyogUGFyYWxsZWwuICAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgfHwgIik7Ci0gICAgICBidWZbMF0gJj0gMHg3ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAtPiAiKTsKLQotICAvKiBUaGUgIiYgMyIgaXMgdG8gcGFzcyBhIGNvbnNpc3RlbnQgYWRkcmVzcy4KLSAgICAgUGFyYWxsZWwgaW5zbnMgYXJndWFibHkgYm90aCBiZWdpbiBvbiB0aGUgd29yZCBib3VuZGFyeS4KLSAgICAgQWxzbywgYnJhbmNoIGluc25zIGFyZSBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIHRoZSB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKHByaW50X2luc24gKGNkLCBwYyAmIH4gKGJmZF92bWEpIDMsIGluZm8sIGJ1ZiwgMikgPT0gMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7Ci0KLSAgcmV0dXJuIChwYyAmIDMpID8gMiA6IDQ7Ci19Ci0KLS8qIC0tICovCi0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIHByaW50aW5nIG9wZXJhbmRzLgotICAgWElORk8gaXMgYSBgdm9pZCAqJyBhbmQgbm90IGEgYGRpc2Fzc2VtYmxlX2luZm8gKicgdG8gbm90IHB1dCBhIHJlcXVpcmVtZW50Ci0gICBvZiBkaXMtYXNtLmggb24gY2dlbi5oLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHByaW50X2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcHJpbnRfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi12b2lkCi1tMzJyX2NnZW5fcHJpbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIHhpbmZvLCBmaWVsZHMsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgUFRSIHhpbmZvOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICB2b2lkIGNvbnN0ICphdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgeGluZm87Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0MgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zLCBmaWVsZHMtPmZfYWNjLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ0QgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2hfYWNjdW1zLCBmaWVsZHMtPmZfYWNjZCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0NTIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9oX2FjY3VtcywgZmllbGRzLT5mX2FjY3MsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgZmllbGRzLT5mX3IxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICBwcmludF9hZGRyZXNzIChjZCwgaW5mbywgZmllbGRzLT5mX2Rpc3AxNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX1JFTE9DKXwoMTw8Q0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICBwcmludF9hZGRyZXNzIChjZCwgaW5mbywgZmllbGRzLT5mX2Rpc3AyNCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1JFTEFYKXwoMTw8Q0dFTl9PUEVSQU5EX1JFTE9DKXwoMTw8Q0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDgsIDB8KDE8PENHRU5fT1BFUkFORF9SRUxBWCl8KDE8PENHRU5fT1BFUkFORF9SRUxPQyl8KDE8PENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9yMSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIHByaW50X2hhc2ggKGNkLCBpbmZvLCAwLCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9oaTE2LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTl9PUFQpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0lNTTEgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2ltbTEsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgZmllbGRzLT5mX3IyLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfc2ltbTE2LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfc2ltbTgsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9zaW1tMTYsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX3IyLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfcjEsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9yMiwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW0xNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tMjQsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCl8KDE8PENHRU5fT1BFUkFORF9SRUxPQyl8KDE8PENHRU5fT1BFUkFORF9BQlNfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW00LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tNSwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWltbTE2LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcHJpbnRpbmcgaW5zbi5cbiIpLAotCSAgICAgICBvcGluZGV4KTsKLSAgICBhYm9ydCAoKTsKLSAgfQotfQotCi1jZ2VuX3ByaW50X2ZuICogY29uc3QgbTMycl9jZ2VuX3ByaW50X2hhbmRsZXJzW10gPSAKLXsKLSAgcHJpbnRfaW5zbl9ub3JtYWwsCi19OwotCi0KLXZvaWQKLW0zMnJfY2dlbl9pbml0X2RpcyAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIG0zMnJfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpOwotICBtMzJyX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCk7Ci0gIGNkLT5wcmludF9oYW5kbGVycyA9ICYgbTMycl9jZ2VuX3ByaW50X2hhbmRsZXJzWzBdOwotICBjZC0+cHJpbnRfb3BlcmFuZCA9IG0zMnJfY2dlbl9wcmludF9vcGVyYW5kOwotfQotCi0MCi0vKiBEZWZhdWx0IHByaW50IGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfbm9ybWFsIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLQotI2lmZGVmIENHRU5fUFJJTlRfTk9STUFMCi0gIENHRU5fUFJJTlRfTk9STUFMIChjZCwgaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBhdHRyaWJ1dGVzLiAgKi8KLSAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZKSkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0lHTkVEKSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCB2YWx1ZSk7Ci19Ci0KLS8qIERlZmF1bHQgYWRkcmVzcyBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FkZHJlc3MgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotCi0jaWZkZWYgQ0dFTl9QUklOVF9BRERSRVNTCi0gIENHRU5fUFJJTlRfQUREUkVTUyAoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgYXR0cmlidXRlcy4gICovCi0gIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TRU1fT05MWSkpCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpKQotICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9BQlNfQUREUikpCi0gICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NJR05FRCkpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCAobG9uZykgdmFsdWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsIChsb25nKSB2YWx1ZSk7Ci19Ci0KLS8qIEtleXdvcmQgcHJpbnQgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9rZXl3b3JkIChjZCwgZGlzX2luZm8sIGtleXdvcmRfdGFibGUsIHZhbHVlLCBhdHRycykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBDR0VOX0tFWVdPUkQgKmtleXdvcmRfdGFibGU7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotCi0gIGtlID0gY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZSAoa2V5d29yZF90YWJsZSwgdmFsdWUpOwotICBpZiAoa2UgIT0gTlVMTCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwga2UtPm5hbWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI/Pz8iKTsKLX0KLQwKLS8qIERlZmF1bHQgaW5zbiBwcmludGVyLgotCi0gICBESVNfSU5GTyBpcyBkZWZpbmVkIGFzIGBQVFInIHNvIHRoZSBkaXNhc3NlbWJsZXIgbmVlZG4ndCBrbm93IGFueXRoaW5nCi0gICBhYm91dCBkaXNhc3NlbWJsZV9pbmZvLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2luc25fbm9ybWFsIChjZCwgZGlzX2luZm8sIGluc24sIGZpZWxkcywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47Ci0KLSAgQ0dFTl9JTklUX1BSSU5UIChjZCk7Ci0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICpzeW47ICsrc3luKQotICAgIHsKLSAgICAgIGlmIChDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqc3luKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgQ0dFTl9TWU5UQVhfQ0hBUiAoKnN5bikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQuICAqLwotICAgICAgbTMycl9jZ2VuX3ByaW50X29wZXJhbmQgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksIGluZm8sCi0JCQkJIGZpZWxkcywgQ0dFTl9JTlNOX0FUVFJTIChpbnNuKSwgcGMsIGxlbmd0aCk7Ci0gICAgfQotfQotDAotLyogVXRpbGl0eSB0byBwcmludCBhbiBpbnNuLgotICAgQlVGIGlzIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24sIHRhcmdldCBieXRlIG9yZGVyLCBCVUZMRU4gYnl0ZXMgbG9uZy4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnMgZmV0Y2hpbmcgZGF0YSAobWVtb3J5X2Vycm9yX2Z1bmMgd2lsbCBoYXZlCi0gICBiZWVuIGNhbGxlZCkuICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgYnVmbGVuKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBidWZsZW47Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbl92YWx1ZTsKLSAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmluc25fbGlzdDsKLSAgQ0dFTl9FWFRSQUNUX0lORk8gZXhfaW5mbzsKLQotICBleF9pbmZvLmRpc19pbmZvID0gaW5mbzsKLSAgZXhfaW5mby52YWxpZCA9ICgxIDw8IChjZC0+YmFzZV9pbnNuX2JpdHNpemUgLyA4KSkgLSAxOwotICBleF9pbmZvLmluc25fYnl0ZXMgPSBidWY7Ci0KLSAgc3dpdGNoIChidWZsZW4pCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGluc25fdmFsdWUgPSBidWZbMF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIxNiAoYnVmKSA6IGJmZF9nZXRsMTYgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIzMiAoYnVmKSA6IGJmZF9nZXRsMzIgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoIGxpc3RzLgotICAgICBQaWNrIHRoZSBmaXJzdCBvbmUgYW5kIGtlZXAgdHJ5aW5nIHVudGlsIHdlIGZpbmQgdGhlIHJpZ2h0IG9uZS4gICovCi0KLSAgaW5zbl9saXN0ID0gQ0dFTl9ESVNfTE9PS1VQX0lOU04gKGNkLCBidWYsIGluc25fdmFsdWUpOwotICB3aGlsZSAoaW5zbl9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gaW5zbl9saXN0LT5pbnNuOwotICAgICAgQ0dFTl9GSUVMRFMgZmllbGRzOwotICAgICAgaW50IGxlbmd0aDsKLQotI2lmIDAgLyogbm90IG5lZWRlZCBhcyBpbnNuIHNob3VsZG4ndCBiZSBpbiBoYXNoIGxpc3RzIGlmIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgIC8qIFN1cHBvcnRlZCBieSB0aGlzIGNwdT8gICovCi0gICAgICBpZiAoISBtMzJyX2NnZW5faW5zbl9zdXBwb3J0ZWQgKGNkLCBpbnNuKSkKLQljb250aW51ZTsKLSNlbmRpZgotCi0gICAgICAvKiBCYXNpYyBiaXQgbWFzayBtdXN0IGJlIGNvcnJlY3QuICAqLwotICAgICAgLyogPz8/IE1heSB3aXNoIHRvIGFsbG93IHRhcmdldCB0byBkZWZlciB0aGlzIGNoZWNrIHVudGlsIHRoZSBleHRyYWN0Ci0JIGhhbmRsZXIuICAqLwotICAgICAgaWYgKChpbnNuX3ZhbHVlICYgQ0dFTl9JTlNOX0JBU0VfTUFTSyAoaW5zbikpCi0JICA9PSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbikpCi0JewotCSAgLyogUHJpbnRpbmcgaXMgaGFuZGxlZCBpbiB0d28gcGFzc2VzLiAgVGhlIGZpcnN0IHBhc3MgcGFyc2VzIHRoZQotCSAgICAgbWFjaGluZSBpbnNuIGFuZCBleHRyYWN0cyB0aGUgZmllbGRzLiAgVGhlIHNlY29uZCBwYXNzIHByaW50cwotCSAgICAgdGhlbS4gICovCi0KLQkgIGxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCi0JICAgIChjZCwgaW5zbiwgJmV4X2luZm8sIGluc25fdmFsdWUsICZmaWVsZHMsIHBjKTsKLQkgIC8qIGxlbmd0aCA8IDAgLT4gZXJyb3IgKi8KLQkgIGlmIChsZW5ndGggPCAwKQotCSAgICByZXR1cm4gbGVuZ3RoOwotCSAgaWYgKGxlbmd0aCA+IDApCi0JICAgIHsKLQkgICAgICBDR0VOX1BSSU5UX0ZOIChjZCwgaW5zbikgKGNkLCBpbmZvLCBpbnNuLCAmZmllbGRzLCBwYywgbGVuZ3RoKTsKLQkgICAgICAvKiBsZW5ndGggaXMgaW4gYml0cywgcmVzdWx0IGlzIGluIGJ5dGVzICovCi0JICAgICAgcmV0dXJuIGxlbmd0aCAvIDg7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluc25fbGlzdCA9IENHRU5fRElTX05FWFRfSU5TTiAoaW5zbl9saXN0KTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIERlZmF1bHQgdmFsdWUgZm9yIENHRU5fUFJJTlRfSU5TTi4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cmVkIGZldGNoaW5nIGJ5dGVzLiAgKi8KLQotI2lmbmRlZiBDR0VOX1BSSU5UX0lOU04KLSNkZWZpbmUgQ0dFTl9QUklOVF9JTlNOIGRlZmF1bHRfcHJpbnRfaW5zbgotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWRlZmF1bHRfcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjaGFyIGJ1ZltDR0VOX01BWF9JTlNOX1NJWkVdOwotICBpbnQgc3RhdHVzOwotCi0gIC8qIFJlYWQgdGhlIGJhc2UgcGFydCBvZiB0aGUgaW5zbi4gICovCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMsIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiBwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCk7Ci19Ci0KLS8qIE1haW4gZW50cnkgcG9pbnQuCi0gICBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChpbiBieXRlcykuICAqLwotCi1pbnQKLXByaW50X2luc25fbTMyciAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHN0YXRpYyBDR0VOX0NQVV9ERVNDIGNkID0gMDsKLSAgc3RhdGljIHByZXZfaXNhLHByZXZfbWFjaCxwcmV2X2VuZGlhbjsKLSAgaW50IGxlbmd0aDsKLSAgaW50IGlzYSxtYWNoOwotICBpbnQgZW5kaWFuID0gKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRwotCQk/IENHRU5fRU5ESUFOX0JJRwotCQk6IENHRU5fRU5ESUFOX0xJVFRMRSk7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qID8/PyBnZGIgd2lsbCBzZXQgbWFjaCBidXQgbGVhdmUgdGhlIGFyY2hpdGVjdHVyZSBhcyAidW5rbm93biIgKi8KLSNpZm5kZWYgQ0dFTl9CRkRfQVJDSAotI2RlZmluZSBDR0VOX0JGRF9BUkNIIGJmZF9hcmNoX20zMnIKLSNlbmRpZgotICBhcmNoID0gaW5mby0+YXJjaDsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBhcmNoID0gQ0dFTl9CRkRfQVJDSDsKLSAgICAgIAotICAvKiBUaGVyZSdzIG5vIHN0YW5kYXJkIHdheSB0byBjb21wdXRlIHRoZSBpc2EgbnVtYmVyIChlLmcuIGZvciBhcm0gdGh1bWIpCi0gICAgIHNvIHdlIGxlYXZlIGl0IHRvIHRoZSB0YXJnZXQuICAqLwotI2lmZGVmIENHRU5fQ09NUFVURV9JU0EKLSAgaXNhID0gQ0dFTl9DT01QVVRFX0lTQSAoaW5mbyk7Ci0jZWxzZQotICBpc2EgPSAwOwotI2VuZGlmCi0KLSAgbWFjaCA9IGluZm8tPm1hY2g7Ci0KLSAgLyogSWYgd2UndmUgc3dpdGNoZWQgY3B1J3MsIGNsb3NlIHRoZSBjdXJyZW50IHRhYmxlIGFuZCBvcGVuIGEgbmV3IG9uZS4gICovCi0gIGlmIChjZAotICAgICAgJiYgKGlzYSAhPSBwcmV2X2lzYQotCSAgfHwgbWFjaCAhPSBwcmV2X21hY2gKLQkgIHx8IGVuZGlhbiAhPSBwcmV2X2VuZGlhbikpCi0gICAgewotICAgICAgbTMycl9jZ2VuX2NwdV9jbG9zZSAoY2QpOwotICAgICAgY2QgPSAwOwotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHlldCwgaW5pdGlhbGl6ZSB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgaWYgKCEgY2QpCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoX3R5cGUgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2gpOwotICAgICAgY29uc3QgY2hhciAqbWFjaF9uYW1lOwotCi0gICAgICBpZiAoIWFyY2hfdHlwZSkKLQlhYm9ydCAoKTsKLSAgICAgIG1hY2hfbmFtZSA9IGFyY2hfdHlwZS0+cHJpbnRhYmxlX25hbWU7Ci0KLSAgICAgIHByZXZfaXNhID0gaXNhOwotICAgICAgcHJldl9tYWNoID0gbWFjaDsKLSAgICAgIHByZXZfZW5kaWFuID0gZW5kaWFuOwotICAgICAgY2QgPSBtMzJyX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fSVNBUywgcHJldl9pc2EsCi0JCQkJIENHRU5fQ1BVX09QRU5fQkZETUFDSCwgbWFjaF9uYW1lLAotCQkJCSBDR0VOX0NQVV9PUEVOX0VORElBTiwgcHJldl9lbmRpYW4sCi0JCQkJIENHRU5fQ1BVX09QRU5fRU5EKTsKLSAgICAgIGlmICghY2QpCi0JYWJvcnQgKCk7Ci0gICAgICBtMzJyX2NnZW5faW5pdF9kaXMgKGNkKTsKLSAgICB9Ci0KLSAgLyogV2UgdHJ5IHRvIGhhdmUgYXMgbXVjaCBjb21tb24gY29kZSBhcyBwb3NzaWJsZS4KLSAgICAgQnV0IGF0IHRoaXMgcG9pbnQgc29tZSB0YXJnZXRzIG5lZWQgdG8gdGFrZSBvdmVyLiAgKi8KLSAgLyogPz8/IFNvbWUgdGFyZ2V0cyBtYXkgbmVlZCBhIGhvb2sgZWxzZXdoZXJlLiAgVHJ5IHRvIGF2b2lkIHRoaXMsCi0gICAgIGJ1dCBpZiBub3QgcG9zc2libGUgdHJ5IHRvIG1vdmUgdGhpcyBob29rIGVsc2V3aGVyZSByYXRoZXIgdGhhbgotICAgICBoYXZlIHR3byBob29rcy4gICovCi0gIGxlbmd0aCA9IENHRU5fUFJJTlRfSU5TTiAoY2QsIHBjLCBpbmZvKTsKLSAgaWYgKGxlbmd0aCA+IDApCi0gICAgcmV0dXJuIGxlbmd0aDsKLSAgaWYgKGxlbmd0aCA8IDApCi0gICAgcmV0dXJuIC0xOwotCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBVTktOT1dOX0lOU05fTVNHKTsKLSAgcmV0dXJuIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSAvIDg7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItaWJsZC5jIGIvb3Bjb2Rlcy9tMzJyLWlibGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkYzczZi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItaWJsZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIwMCArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBidWlsZGluZy9leHRyYWN0aW9uIHN1cHBvcnQgZm9yIG0zMnIuIC0qLSBDIC0qLQotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4taWJsZC5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAibTMyci1kZXNjLmgiCi0jaW5jbHVkZSAibTMyci1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI3VuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI3VuZGVmIG1heAotI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotCi0vKiBVc2VkIGJ5IHRoZSBpZmllbGQgcnR4IGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgRkxEKGYpIChmaWVsZHMtPmYpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBsb25nLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIENHRU5fSU5TTl9CWVRFU19QVFIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLAotCSAgICAgIENHRU5fRklFTERTICosIENHRU5fSU5TTl9CWVRFU19QVFIsIGJmZF92bWEpKTsKLQotc3RhdGljIGludCBleHRyYWN0X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLCBDR0VOX0lOU05fSU5ULAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgbG9uZyAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosIENHRU5fRVhUUkFDVF9JTkZPICosCi0JICAgICAgQ0dFTl9JTlNOX0lOVCwgQ0dFTl9GSUVMRFMgKiwgYmZkX3ZtYSkpOwotDAotLyogT3BlcmFuZCBpbnNlcnRpb24uICAqLwotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotLyogU3Vicm91dGluZSBvZiBpbnNlcnRfbm9ybWFsLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIHZvaWQKLWluc2VydF8xIChjZCwgdmFsdWUsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICBpbnQgc3RhcnQsbGVuZ3RoLHdvcmRfbGVuZ3RoOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZwOwotewotICB1bnNpZ25lZCBsb25nIHgsbWFzazsKLSAgaW50IHNoaWZ0OwotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB4ID0gKmJ1ZnA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjE2IChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JeCA9IChidWZwWzBdIDw8IDE2KSB8IGJmZF9nZXRiMTYgKGJ1ZnAgKyAxKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCkgfCAoYnVmcFsyXSA8PCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjMyIChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwzMiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLSAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgZWxzZQotICAgIHNoaWZ0ID0gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gIHggPSAoeCAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICAqYnVmcCA9IHg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCWJmZF9wdXRiMTYgKHgsIGJ1ZnApOwotICAgICAgZWxzZQotCWJmZF9wdXRsMTYgKHgsIGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXsKLQkgIGJ1ZnBbMF0gPSB4ID4+IDE2OwotCSAgYmZkX3B1dGIxNiAoeCwgYnVmcCArIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0bDE2ICh4LCBidWZwKTsKLQkgIGJ1ZnBbMl0gPSB4ID4+IDE2OwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JYmZkX3B1dGIzMiAoeCwgYnVmcCk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwzMiAoeCwgYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLS8qIERlZmF1bHQgaW5zZXJ0aW9uIHJvdXRpbmUuCi0KLSAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLgotICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KLSAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgotICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KLSAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLwotCi0vKiA/Pz8gVGhpcyBkdXBsaWNhdGVzIGZ1bmN0aW9uYWxpdHkgd2l0aCBiZmQncyBob3d0byB0YWJsZSBhbmQKLSAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICAqLwotLyogPz8/IFRoaXMgZG9lc24ndCBoYW5kbGUgYmZkX3ZtYSdzLiAgQ3JlYXRlIGFub3RoZXIgZnVuY3Rpb24gd2hlbgotICAgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCBhdHRycywgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLAotCSAgICAgICB0b3RhbF9sZW5ndGgsIGJ1ZmZlcikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICB1bnNpZ25lZCBpbnQgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGg7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotewotICBzdGF0aWMgY2hhciBlcnJidWZbMTAwXTsKLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotICAvKiBJZiBMRU5HVEggaXMgemVybywgdGhpcyBvcGVyYW5kIGRvZXNuJ3QgY29udHJpYnV0ZSB0byB0aGUgdmFsdWUuICAqLwotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKENHRU5fSU5UX0lOU05fUAotICAgICAgJiYgd29yZF9vZmZzZXQgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAod29yZF9sZW5ndGggPiAzMikKLSAgICBhYm9ydCAoKTsKLQotICAvKiBGb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGluc25zIHNtYWxsZXIgdGhhbiB0aGUgYmFzZS1pbnNuLWJpdHNpemUsCi0gICAgIHdvcmRfbGVuZ3RoIG1heSBiZSB0b28gYmlnLiAgKi8KLSAgaWYgKGNkLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JkX29mZnNldCA9PSAwCi0JICAmJiB3b3JkX2xlbmd0aCA+IHRvdGFsX2xlbmd0aCkKLQl3b3JkX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKLSAgICB9Ci0KLSAgLyogRW5zdXJlIFZBTFVFIHdpbGwgZml0LiAgKi8KLSAgaWYgKCEgQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX0lGTERfU0lHTkVEKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG1heHZhbCA9IG1hc2s7Ci0gICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlID4gbWF4dmFsKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBzcHJpbnRmIChlcnJidWYsCi0JCSAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gMCBhbmQgJWx1KSIpLAotCQkgICB2YWx1ZSwgbWF4dmFsKTsKLQkgIHJldHVybiBlcnJidWY7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgbWludmFsID0gLSAoMUwgPDwgKGxlbmd0aCAtIDEpKTsKLSAgICAgIGxvbmcgbWF4dmFsID0gKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxOwotICAgICAgaWYgKHZhbHVlIDwgbWludmFsIHx8IHZhbHVlID4gbWF4dmFsKQotCXsKLQkgIHNwcmludGYKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgKGVycmJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsZCBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKSwKLQkgICAgIHZhbHVlLCBtaW52YWwsIG1heHZhbCk7Ci0JICByZXR1cm4gZXJyYnVmOwotCX0KLSAgICB9Ci0KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLQotICB7Ci0gICAgaW50IHNoaWZ0OwotCi0gICAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICAgIGVsc2UKLSAgICAgIHNoaWZ0ID0gd29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpOwotICAgICpidWZmZXIgPSAoKmJ1ZmZlciAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKLSAgfQotCi0jZWxzZSAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZwID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyICsgd29yZF9vZmZzZXQgLyA4OwotCi0gICAgaW5zZXJ0XzEgKGNkLCB2YWx1ZSwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnApOwotICB9Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBEZWZhdWx0IGluc24gYnVpbGRlciAoaW5zZXJ0IGhhbmRsZXIpLgotICAgVGhlIGluc3RydWN0aW9uIGlzIHJlY29yZGVkIGluIENHRU5fSU5UX0lOU05fUCBieXRlIG9yZGVyCi0gICAobWVhbmluZyB0aGF0IGlmIENHRU5fSU5UX0lOU05fUCBCVUZGRVIgaXMgYW4gaW50ICogYW5kIHRodXMgdGhlIHZhbHVlIGlzCi0gICByZWNvcmRlZCBpbiBob3N0IGJ5dGUgb3JkZXIsIG90aGVyd2lzZSBCVUZGRVIgaXMgYW4gYXJyYXkgb2YgYnl0ZXMgYW5kIHRoZQotICAgdmFsdWUgaXMgcmVjb3JkZWQgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIpLgotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWluc2VydF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGZpZWxkcywgYnVmZmVyLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzeW47Ci0KLSAgQ0dFTl9JTklUX0lOU0VSVCAoY2QpOwotICB2YWx1ZSA9IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbnNuKTsKLQotICAvKiBJZiB3ZSdyZSByZWNvcmRpbmcgaW5zbnMgYXMgbnVtYmVycyAocmF0aGVyIHRoYW4gYSBzdHJpbmcgb2YgYnl0ZXMpLAotICAgICB0YXJnZXQgYnl0ZSBvcmRlciBoYW5kbGluZyBpcyBkZWZlcnJlZCB1bnRpbCBsYXRlci4gICovCi0KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLQotICAqYnVmZmVyID0gdmFsdWU7Ci0KLSNlbHNlCi0KLSAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZmZlciwgbWluIChjZC0+YmFzZV9pbnNuX2JpdHNpemUsCi0JCQkJCUNHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykpLAotCQkgICAgICAgdmFsdWUpOwotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICAvKiA/Pz8gSXQgd291bGQgYmUgYmV0dGVyIHRvIHNjYW4gdGhlIGZvcm1hdCdzIGZpZWxkcy4KLSAgICAgU3RpbGwgbmVlZCB0byBiZSBhYmxlIHRvIGluc2VydCBhIHZhbHVlIGJhc2VkIG9uIHRoZSBvcGVyYW5kIHRob3VnaDsKLSAgICAgZS5nLiBzdG9yaW5nIGEgYnJhbmNoIGRpc3BsYWNlbWVudCB0aGF0IGdvdCByZXNvbHZlZCBsYXRlci4KLSAgICAgTmVlZHMgbW9yZSB0aG91Z2h0IGZpcnN0LiAgKi8KLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKiBzeW4gIT0gJ1wwJzsgKysgc3luKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKiBzeW4pKQotCWNvbnRpbnVlOwotCi0gICAgICBlcnJtc2cgPSAoKiBjZC0+aW5zZXJ0X29wZXJhbmQpIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCSAgICAgICBmaWVsZHMsIGJ1ZmZlciwgcGMpOwotICAgICAgaWYgKGVycm1zZykKLQlyZXR1cm4gZXJybXNnOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQwKLS8qIE9wZXJhbmQgZXh0cmFjdGlvbi4gICovCi0KLSNpZiAhIENHRU5fSU5UX0lOU05fUAotCi0vKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLgotICAgRW5zdXJlIHN1ZmZpY2llbnQgYnl0ZXMgYXJlIGNhY2hlZCBpbiBFWF9JTkZPLgotICAgT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgotICAgQllURVMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgbmVlZGVkIHZhbHVlLgotICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIGludAotZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIG9mZnNldCwgYnl0ZXMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgaW50IG9mZnNldCwgYnl0ZXM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIC8qIEl0J3MgZG91YnRmdWwgdGhhdCB0aGUgbWlkZGxlIHBhcnQgaGFzIGFscmVhZHkgYmVlbiBmZXRjaGVkIHNvCi0gICAgIHdlIGRvbid0IG9wdGltaXplIHRoYXQgY2FzZS4gIGtpc3MuICAqLwotICBpbnQgbWFzazsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGV4X2luZm8tPmRpc19pbmZvOwotCi0gIC8qIEZpcnN0IGRvIGEgcXVpY2sgY2hlY2suICAqLwotICBtYXNrID0gKDEgPDwgYnl0ZXMpIC0gMTsKLSAgaWYgKCgoZXhfaW5mby0+dmFsaWQgPj4gb2Zmc2V0KSAmIG1hc2spID09IG1hc2spCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgYnl0ZSB3ZSBuZWVkIHRvIHJlYWQuICAqLwotICBmb3IgKG1hc2sgPSAxIDw8IG9mZnNldDsgYnl0ZXMgPiAwOyAtLWJ5dGVzLCArK29mZnNldCwgbWFzayA8PD0gMSkKLSAgICBpZiAoISAobWFzayAmIGV4X2luZm8tPnZhbGlkKSkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChieXRlcykKLSAgICB7Ci0gICAgICBpbnQgc3RhdHVzOwotCi0gICAgICBwYyArPSBvZmZzZXQ7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JKHBjLCBleF9pbmZvLT5pbnNuX2J5dGVzICsgb2Zmc2V0LCBieXRlcywgaW5mbyk7Ci0KLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGV4X2luZm8tPnZhbGlkIHw9ICgoMSA8PCBieXRlcykgLSAxKSA8PCBvZmZzZXQ7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIGxvbmcKLWV4dHJhY3RfMSAoY2QsIGV4X2luZm8sIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIGludCBzdGFydCxsZW5ndGgsd29yZF9sZW5ndGg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnA7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgeCxtYXNrOwotICBpbnQgc2hpZnQ7Ci0gIGludCBiaWdfcCA9IENHRU5fQ1BVX0lOU05fRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotCi0gIHN3aXRjaCAod29yZF9sZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgIHggPSAqYnVmcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMTYgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gKGJ1ZnBbMF0gPDwgMTYpIHwgYmZkX2dldGIxNiAoYnVmcCArIDEpOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKSB8IChidWZwWzJdIDw8IDE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMzIgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDMyIChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLSAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICBlbHNlCi0gICAgc2hpZnQgPSAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgcmV0dXJuICh4ID4+IHNoaWZ0KSAmIG1hc2s7Ci19Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0vKiBEZWZhdWx0IGV4dHJhY3Rpb24gcm91dGluZS4KLQotICAgSU5TTl9WQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBvZiB0aGUgaW5zbiBpbiBob3N0IG9yZGVyLAotICAgb3Igc29tZXRpbWVzIGxlc3MgZm9yIGNhc2VzIGxpa2UgdGhlIG0zMnIgd2hlcmUgdGhlIGJhc2UgaW5zbiBzaXplIGlzIDMyCi0gICBidXQgc29tZSBpbnNucyBhcmUgMTYgYml0cy4KLSAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLiAgV2Ugb25seSBuZWVkIGBTSUdORUQnLAotICAgYnV0IGZvciBnZW5lcmFsaXR5IHdlIHRha2UgYSBiaXRtYXNrIG9mIGFsbCBvZiB0aGVtLgotICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KLSAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgotICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KLSAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLS8qID8/PyBUaGUgcmV0dXJuIGNvZGUgaXNuJ3QgcHJvcGVybHkgdXNlZC4gIHdpcC4gICovCi0KLS8qID8/PyBUaGlzIGRvZXNuJ3QgaGFuZGxlIGJmZF92bWEncy4gIENyZWF0ZSBhbm90aGVyIGZ1bmN0aW9uIHdoZW4KLSAgIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgYXR0cnMsIHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLAotCQl3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoLCBwYywgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIHVuc2lnbmVkIGludCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBDR0VOX0lOU05fSU5UIHZhbHVlOwotCi0gIC8qIElmIExFTkdUSCBpcyB6ZXJvLCB0aGlzIG9wZXJhbmQgZG9lc24ndCBjb250cmlidXRlIHRvIHRoZSB2YWx1ZQotICAgICBzbyBnaXZlIGl0IGEgc3RhbmRhcmQgdmFsdWUgb2YgemVyby4gICovCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAqdmFsdWVwID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoQ0dFTl9JTlRfSU5TTl9QCi0gICAgICAmJiB3b3JkX29mZnNldCAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotICAgIGFib3J0ICgpOwotCi0gIC8qIEZvciBhcmNoaXRlY3R1cmVzIHdpdGggaW5zbnMgc21hbGxlciB0aGFuIHRoZSBpbnNuLWJhc2UtYml0c2l6ZSwKLSAgICAgd29yZF9sZW5ndGggbWF5IGJlIHRvbyBiaWcuICAqLwotICBpZiAoY2QtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCi0gICAgewotICAgICAgaWYgKHdvcmRfb2Zmc2V0ID09IDAKLQkgICYmIHdvcmRfbGVuZ3RoID4gdG90YWxfbGVuZ3RoKQotCXdvcmRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOwotICAgIH0KLQotICAvKiBEb2VzIHRoZSB2YWx1ZSByZXNpZGUgaW4gSU5TTl9WQUxVRT8gICovCi0KLSAgaWYgKHdvcmRfb2Zmc2V0ID09IDApCi0gICAgewotICAgICAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgICAgIENHRU5fSU5TTl9JTlQgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLSAgICAgIGlmIChDR0VOX0lOU05fTFNCMF9QKQotCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAoKHN0YXJ0ICsgMSkgLSBsZW5ndGgpOwotICAgICAgZWxzZQotCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgICAgIHZhbHVlICY9IG1hc2s7Ci0gICAgICAvKiBzaWduIGV4dGVuZD8gKi8KLSAgICAgIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fSUZMRF9TSUdORUQpCi0JICAmJiAodmFsdWUgJiAoMUwgPDwgKGxlbmd0aCAtIDEpKSkpCi0JdmFsdWUgfD0gfm1hc2s7Ci0gICAgfQotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqYnVmcCA9IGV4X2luZm8tPmluc25fYnl0ZXMgKyB3b3JkX29mZnNldCAvIDg7Ci0KLSAgICAgIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIHdvcmRfb2Zmc2V0IC8gOCwgd29yZF9sZW5ndGggLyA4LCBwYykgPT0gMCkKLQlyZXR1cm4gMDsKLQotICAgICAgdmFsdWUgPSBleHRyYWN0XzEgKGNkLCBleF9pbmZvLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCwgcGMpOwotICAgIH0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgKnZhbHVlcCA9IHZhbHVlOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBEZWZhdWx0IGluc24gZXh0cmFjdG9yLgotCi0gICBJTlNOX1ZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzLCB0cmFuc2xhdGVkIHRvIGhvc3Qgb3JkZXIuCi0gICBUaGUgZXh0cmFjdGVkIGZpZWxkcyBhcmUgc3RvcmVkIGluIEZJRUxEUy4KLSAgIEVYX0lORk8gaXMgdXNlZCB0byBoYW5kbGUgcmVhZGluZyB2YXJpYWJsZSBsZW5ndGggaW5zbnMuCi0gICBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLCBvciAwIGlmIG5vIG1hdGNoLAotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzIGZldGNoaW5nIGRhdGEgKG1lbW9yeV9lcnJvcl9mdW5jIHdpbGwgaGF2ZQotICAgYmVlbiBjYWxsZWQpLiAgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47Ci0KLSAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLQotICBDR0VOX0lOSVRfRVhUUkFDVCAoY2QpOwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqc3luOyArK3N5bikKLSAgICB7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKLQljb250aW51ZTsKLQotICAgICAgbGVuZ3RoID0gKCogY2QtPmV4dHJhY3Rfb3BlcmFuZCkgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCi0JCQkJCWV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpOwotICAgICAgaWYgKGxlbmd0aCA8PSAwKQotCXJldHVybiBsZW5ndGg7Ci0gICAgfQotCi0gIC8qIFdlIHJlY29nbml6ZWQgYW5kIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgdGhpcyBpbnNuLiAgKi8KLSAgcmV0dXJuIENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLX0KLQwKLS8qIG1hY2hpbmUgZ2VuZXJhdGVkIGNvZGUgYWRkZWQgaGVyZSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGluc2VydGlvbi4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwYXJzZV9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHBhcnNlX2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLiAgSXQncyBhbHNvIG5lZWRlZCBieSBHQVMgdG8gaW5zZXJ0IG9wZXJhbmRzIHRoYXQgY291bGRuJ3QgYmUKLSAgIHJlc29sdmVkIGR1cmluZyBwYXJzaW5nLgotKi8KLQotY29uc3QgY2hhciAqCi1tMzJyX2NnZW5faW5zZXJ0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIGJ1ZmZlciwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IGNoYXIgKiBlcnJtc2cgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuZ3RoID0gQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2FjYywgMCwgMCwgOCwgMSwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ0QgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9hY2NkLCAwLCAwLCA0LCAyLCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDUyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2FjY3MsIDAsIDAsIDEyLCAyLCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjEsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxNjsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKCgodmFsdWUpIC0gKHBjKSkpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMjQ7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICgoKHZhbHVlKSAtIChwYykpKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDI0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAoKChwYykgJiAoLTQpKSkpKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDgsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IxLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaGkxNiwgMHwoMTw8Q0dFTl9JRkxEX1NJR05fT1BUKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSU1NMSA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfaW1tMTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSAtICgxKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMCwgMCwgMTUsIDEsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yMiwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9zaW1tMTYsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3NpbW04LCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgOCwgOCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfc2ltbTE2LCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yMiwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjEsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjIsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdWltbTE2LCAwLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91aW1tMjQsIDB8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9BQlNfQUREUiksIDAsIDgsIDI0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91aW1tNCwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW01LCAwLCAwLCAxMSwgNSwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdWltbTE2LCAwLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGJ1aWxkaW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiBlcnJtc2c7Ci19Ci0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIG9wZXJhbmQgZXh0cmFjdGlvbi4KLSAgIFRoZSByZXN1bHQgaXMgPD0gMCBmb3IgZXJyb3IsID4wIGZvciBzdWNjZXNzLgotICAgPz8/IEFjdHVhbCB2YWx1ZXMgYXJlbid0IHdlbGwgZGVmaW5lZCByaWdodCBub3cuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcHJpbnRfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwcmludF9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLWludAotbTMycl9jZ2VuX2V4dHJhY3Rfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgLyogQXNzdW1lIHN1Y2Nlc3MgKGZvciB0aG9zZSBvcGVyYW5kcyB0aGF0IGFyZSBub3BzKS4gICovCi0gIGludCBsZW5ndGggPSAxOwotICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuZ3RoID0gQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDEsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9hY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDRCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDQsIDIsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9hY2NkKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ1MgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgMiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2FjY3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCgoKHZhbHVlKSA8PCAoMikpKSArIChwYykpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDI0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCgoKHZhbHVlKSA8PCAoMikpKSArIChwYykpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDI0ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgOCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgoKCh2YWx1ZSkgPDwgKDIpKSkgKyAoKChwYykgJiAoLTQpKSkpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdOX09QVCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2hpMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSU1NMSA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTUsIDEsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSArICgxKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9pbW0xID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9zaW1tMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgOCwgOCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3NpbW04KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3NpbW0xNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX0FCU19BRERSKSwgMCwgOCwgMjQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tMjQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3VpbW00KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTEsIDUsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tNSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3VpbW0xNik7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGRlY29kaW5nIGluc24uXG4iKSwKLQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotY2dlbl9pbnNlcnRfZm4gKiBjb25zdCBtMzJyX2NnZW5faW5zZXJ0X2hhbmRsZXJzW10gPSAKLXsKLSAgaW5zZXJ0X2luc25fbm9ybWFsLAotfTsKLQotY2dlbl9leHRyYWN0X2ZuICogY29uc3QgbTMycl9jZ2VuX2V4dHJhY3RfaGFuZGxlcnNbXSA9IAotewotICBleHRyYWN0X2luc25fbm9ybWFsLAotfTsKLQotLyogR2V0dGluZyB2YWx1ZXMgZnJvbSBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCi0gICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IHJldHVybi4KLSAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgcmVzdWx0IHR5cGUKLSAgIG5vdCBhcHByb3ByaWF0ZS4gICovCi0KLWludAotbTMycl9jZ2VuX2dldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGNvbnN0IENHRU5fRklFTERTICogZmllbGRzOwotewotICBpbnQgdmFsdWU7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfYWNjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDRCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9hY2NkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDUyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9hY2NzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2hpMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9JTU0xIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2ltbTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW01OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTE2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIGludCBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1iZmRfdm1hCi1tMzJyX2NnZW5fZ2V0X3ZtYV9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgY29uc3QgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfYWNjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDRCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9hY2NkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDUyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9hY2NzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICB2YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2hpMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9JTU0xIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2ltbTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW01OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTE2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIHZtYSBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBTdHVmZmluZyB2YWx1ZXMgaW4gY2dlbl9maWVsZHMgaXMgaGFuZGxlZCBieSBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zLgotICAgVGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgdHlwZSBvZiB0aGUgVkFMVUUgYXJndW1lbnQgdGhleSBhY2NlcHQuCi0gICBUT0RPOiBmbG9hdGluZyBwb2ludCwgaW5saW5pbmcgc3VwcG9ydCwgcmVtb3ZlIGNhc2VzIHdoZXJlIGFyZ3VtZW50IHR5cGUKLSAgIG5vdCBhcHByb3ByaWF0ZS4gICovCi0KLXZvaWQKLW0zMnJfY2dlbl9zZXRfaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9BQ0MgOgotICAgICAgZmllbGRzLT5mX2FjYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDRCA6Ci0gICAgICBmaWVsZHMtPmZfYWNjZCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDUyA6Ci0gICAgICBmaWVsZHMtPmZfYWNjcyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDI0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIGZpZWxkcy0+Zl9oaTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9JTU0xIDoKLSAgICAgIGZpZWxkcy0+Zl9pbW0xID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgZmllbGRzLT5mX3NpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgZmllbGRzLT5mX3NpbW04ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBmaWVsZHMtPmZfc2ltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgZmllbGRzLT5mX3IxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTI0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tNSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgZmllbGRzLT5mX3VpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIGludCBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci19Ci0KLXZvaWQKLW0zMnJfY2dlbl9zZXRfdm1hX29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfQUNDIDoKLSAgICAgIGZpZWxkcy0+Zl9hY2MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ0QgOgotICAgICAgZmllbGRzLT5mX2FjY2QgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0FDQ1MgOgotICAgICAgZmllbGRzLT5mX2FjY3MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgZmllbGRzLT5mX2Rpc3AyNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBmaWVsZHMtPmZfaGkxNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSU1NMSA6Ci0gICAgICBmaWVsZHMtPmZfaW1tMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgZmllbGRzLT5mX3NpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgZmllbGRzLT5mX3VpbW0yNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgZmllbGRzLT5mX3VpbW00ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTUgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyB2bWEgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotfQotCi0vKiBGdW5jdGlvbiB0byBjYWxsIGJlZm9yZSB1c2luZyB0aGUgaW5zdHJ1Y3Rpb24gYnVpbGRlciB0YWJsZXMuICAqLwotCi12b2lkCi1tMzJyX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgY2QtPmluc2VydF9oYW5kbGVycyA9ICYgbTMycl9jZ2VuX2luc2VydF9oYW5kbGVyc1swXTsKLSAgY2QtPmV4dHJhY3RfaGFuZGxlcnMgPSAmIG0zMnJfY2dlbl9leHRyYWN0X2hhbmRsZXJzWzBdOwotCi0gIGNkLT5pbnNlcnRfb3BlcmFuZCA9IG0zMnJfY2dlbl9pbnNlcnRfb3BlcmFuZDsKLSAgY2QtPmV4dHJhY3Rfb3BlcmFuZCA9IG0zMnJfY2dlbl9leHRyYWN0X29wZXJhbmQ7Ci0KLSAgY2QtPmdldF9pbnRfb3BlcmFuZCA9IG0zMnJfY2dlbl9nZXRfaW50X29wZXJhbmQ7Ci0gIGNkLT5zZXRfaW50X29wZXJhbmQgPSBtMzJyX2NnZW5fc2V0X2ludF9vcGVyYW5kOwotICBjZC0+Z2V0X3ZtYV9vcGVyYW5kID0gbTMycl9jZ2VuX2dldF92bWFfb3BlcmFuZDsKLSAgY2QtPnNldF92bWFfb3BlcmFuZCA9IG0zMnJfY2dlbl9zZXRfdm1hX29wZXJhbmQ7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItb3BjLmMgYi9vcGNvZGVzL20zMnItb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZWZlY2MuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4NSArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBvcGNvZGUgdGFibGUgZm9yIG0zMnIuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0KLS8qIFRoZSBoYXNoIGZ1bmN0aW9ucyBhcmUgcmVjb3JkZWQgaGVyZSB0byBoZWxwIGtlZXAgYXNzZW1ibGVyIGNvZGUgb3V0IG9mCi0gICB0aGUgZGlzYXNzZW1ibGVyIGFuZCB2aWNlIHZlcnNhLiAgKi8KLQotc3RhdGljIGludCBhc21faGFzaF9pbnNuX3AgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXNtX2hhc2hfaW5zbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgZGlzX2hhc2hfaW5zbl9wIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGRpc19oYXNoX2luc24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBDR0VOX0lOU05fSU5UKSk7Ci0KLS8qIEluc3RydWN0aW9uIGZvcm1hdHMuICAqLwotCi0jZGVmaW5lIEYoZikgJiBtMzJyX2NnZW5faWZsZF90YWJsZVtDT05DQVQyIChNMzJSXyxmKV0KLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2VtcHR5ID0gewotICAwLCAwLCAweDAsIHsgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGQzID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hbmQzID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9VSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9vcjMgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1VJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZGkgPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfU0lNTTgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGR2MyA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmM4ID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmMyNCA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmVxID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9ESVNQMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iZXF6ID0gewotICAzMiwgMzIsIDB4ZmZmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9ESVNQMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jbXAgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NtcGkgPSB7Ci0gIDMyLCAzMiwgMHhmZmYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NtcHogPSB7Ci0gIDE2LCAxNiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2RpdiA9IHsKLSAgMzIsIDMyLCAweGYwZjBmZmZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfamMgPSB7Ci0gIDE2LCAxNiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkMjQgPSB7Ci0gIDMyLCAzMiwgMHhmMDAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX1VJTU0yNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTE2ID0gewotICAzMiwgMzIsIDB4ZjBmZjAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tYWNoaV9hID0gewotICAxNiwgMTYsIDB4ZjA3MCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0FDQyksIEYgKEZfT1AyMyksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdmZhY2hpID0gewotICAxNiwgMTYsIDB4ZjBmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdmZhY2hpX2EgPSB7Ci0gIDE2LCAxNiwgMHhmMGYzLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9BQ0NTKSwgRiAoRl9PUDMpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdmZjID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdnRhY2hpID0gewotICAxNiwgMTYsIDB4ZjBmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdnRhY2hpX2EgPSB7Ci0gIDE2LCAxNiwgMHhmMGYzLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9BQ0NTKSwgRiAoRl9PUDMpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdnRjID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ub3AgPSB7Ci0gIDE2LCAxNiwgMHhmZmZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3JhY19kc2kgPSB7Ci0gIDE2LCAxNiwgMHhmM2YyLCB7IEYgKEZfT1AxKSwgRiAoRl9BQ0NEKSwgRiAoRl9CSVRTNjcpLCBGIChGX09QMiksIEYgKEZfQUNDUyksIEYgKEZfQklUMTQpLCBGIChGX0lNTTEpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zZXRoID0gewotICAzMiwgMzIsIDB4ZjBmZjAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9ISTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc2xsaSA9IHsKLSAgMTYsIDE2LCAweGYwZTAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9TSElGVF9PUDIpLCBGIChGX1VJTU01KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RfZCA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfdHJhcCA9IHsKLSAgMTYsIDE2LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1VJTU00KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc2F0YiA9IHsKLSAgMzIsIDMyLCAweGYwZjBmZmZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfVUlNTTE2KSwgMCB9Ci19OwotCi0jdW5kZWYgRgotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKLSNkZWZpbmUgTU5FTSBDR0VOX1NZTlRBWF9NTkVNT05JQyAvKiBzeW50YXggdmFsdWUgZm9yIG1uZW1vbmljICovCi0jZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKE0zMlJfT1BFUkFORF8sb3ApCi0jZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QQ09ERSBtMzJyX2NnZW5faW5zbl9vcGNvZGVfdGFibGVbTUFYX0lOU05TXSA9Ci17Ci0gIC8qIFNwZWNpYWwgbnVsbCBmaXJzdCBlbnRyeS4KLSAgICAgQSBgbnVtJyB2YWx1ZSBvZiB6ZXJvIGlzIHRodXMgaW52YWxpZC4KLSAgICAgQWxzbywgdGhlIHNwZWNpYWwgYGludmFsaWQnIGluc24gcmVzaWRlcyBoZXJlLiAgKi8KLSAgeyB7IDAgfSB9LAotLyogYWRkICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGEwIH0KLSAgfSwKLS8qIGFkZDMgJGRyLCRzciwkaGFzaCRzbG8xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChIQVNIKSwgT1AgKFNMTzE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZDMsIHsgMHg4MGEwMDAwMCB9Ci0gIH0sCi0vKiBhbmQgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YzAgfQotICB9LAotLyogYW5kMyAkZHIsJHNyLCR1aW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoVUlNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2FuZDMsIHsgMHg4MGMwMDAwMCB9Ci0gIH0sCi0vKiBvciAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhlMCB9Ci0gIH0sCi0vKiBvcjMgJGRyLCRzciwkaGFzaCR1bG8xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChIQVNIKSwgT1AgKFVMTzE2KSwgMCB9IH0sCi0gICAgJiBpZm10X29yMywgeyAweDgwZTAwMDAwIH0KLSAgfSwKLS8qIHhvciAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhkMCB9Ci0gIH0sCi0vKiB4b3IzICRkciwkc3IsJHVpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChVSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYW5kMywgeyAweDgwZDAwMDAwIH0KLSAgfSwKLS8qIGFkZGkgJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU0lNTTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDQwMDAgfQotICB9LAotLyogYWRkdiAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4MCB9Ci0gIH0sCi0vKiBhZGR2MyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZHYzLCB7IDB4ODA4MDAwMDAgfQotICB9LAotLyogYWRkeCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5MCB9Ci0gIH0sCi0vKiBiYy5zICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOCwgeyAweDdjMDAgfQotICB9LAotLyogYmMubCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjQsIHsgMHhmYzAwMDAwMCB9Ci0gIH0sCi0vKiBiZXEgJHNyYzEsJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcSwgeyAweGIwMDAwMDAwIH0KLSAgfSwKLS8qIGJlcXogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmVxeiwgeyAweGIwODAwMDAwIH0KLSAgfSwKLS8qIGJnZXogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmVxeiwgeyAweGIwYjAwMDAwIH0KLSAgfSwKLS8qIGJndHogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmVxeiwgeyAweGIwZDAwMDAwIH0KLSAgfSwKLS8qIGJsZXogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmVxeiwgeyAweGIwYzAwMDAwIH0KLSAgfSwKLS8qIGJsdHogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmVxeiwgeyAweGIwYTAwMDAwIH0KLSAgfSwKLS8qIGJuZXogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmVxeiwgeyAweGIwOTAwMDAwIH0KLSAgfSwKLS8qIGJsLnMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmM4LCB7IDB4N2UwMCB9Ci0gIH0sCi0vKiBibC5sICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNCwgeyAweGZlMDAwMDAwIH0KLSAgfSwKLS8qIGJjbC5zICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOCwgeyAweDc4MDAgfQotICB9LAotLyogYmNsLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0LCB7IDB4ZjgwMDAwMDAgfQotICB9LAotLyogYm5jLnMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmM4LCB7IDB4N2QwMCB9Ci0gIH0sCi0vKiBibmMubCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjQsIHsgMHhmZDAwMDAwMCB9Ci0gIH0sCi0vKiBibmUgJHNyYzEsJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcSwgeyAweGIwMTAwMDAwIH0KLSAgfSwKLS8qIGJyYS5zICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOCwgeyAweDdmMDAgfQotICB9LAotLyogYnJhLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0LCB7IDB4ZmYwMDAwMDAgfQotICB9LAotLyogYm5jbC5zICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOCwgeyAweDc5MDAgfQotICB9LAotLyogYm5jbC5sICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNCwgeyAweGY5MDAwMDAwIH0KLSAgfSwKLS8qIGNtcCAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDQwIH0KLSAgfSwKLS8qIGNtcGkgJHNyYzIsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21waSwgeyAweDgwNDAwMDAwIH0KLSAgfSwKLS8qIGNtcHUgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHg1MCB9Ci0gIH0sCi0vKiBjbXB1aSAkc3JjMiwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9jbXBpLCB7IDB4ODA1MDAwMDAgfQotICB9LAotLyogY21wZXEgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHg2MCB9Ci0gIH0sCi0vKiBjbXB6ICRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXB6LCB7IDB4NzAgfQotICB9LAotLyogZGl2ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdiwgeyAweDkwMDAwMDAwIH0KLSAgfSwKLS8qIGRpdnUgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2LCB7IDB4OTAxMDAwMDAgfQotICB9LAotLyogcmVtICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdiwgeyAweDkwMjAwMDAwIH0KLSAgfSwKLS8qIHJlbXUgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2LCB7IDB4OTAzMDAwMDAgfQotICB9LAotLyogZGl2aCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9kaXYsIHsgMHg5MDAwMDAxMCB9Ci0gIH0sCi0vKiBqYyAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9qYywgeyAweDFjYzAgfQotICB9LAotLyogam5jICRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2pjLCB7IDB4MWRjMCB9Ci0gIH0sCi0vKiBqbCAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9qYywgeyAweDFlYzAgfQotICB9LAotLyogam1wICRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2pjLCB7IDB4MWZjMCB9Ci0gIH0sCi0vKiBsZCAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMGMwIH0KLSAgfSwKLS8qIGxkICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZDMsIHsgMHhhMGMwMDAwMCB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjA4MCB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweGEwODAwMDAwIH0KLSAgfSwKLS8qIGxkaCAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMGEwIH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4YTBhMDAwMDAgfQotICB9LAotLyogbGR1YiAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMDkwIH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweGEwOTAwMDAwIH0KLSAgfSwKLS8qIGxkdWggJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjBiMCB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZDMsIHsgMHhhMGIwMDAwMCB9Ci0gIH0sCi0vKiBsZCAkZHIsQCRzcisgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAnKycsIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMGUwIH0KLSAgfSwKLS8qIGxkMjQgJGRyLCR1aW1tMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFVJTU0yNCksIDAgfSB9LAotICAgICYgaWZtdF9sZDI0LCB7IDB4ZTAwMDAwMDAgfQotICB9LAotLyogbGRpOCAkZHIsJHNpbW04ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTSU1NOCksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4NjAwMCB9Ci0gIH0sCi0vKiBsZGkxNiAkZHIsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEhBU0gpLCBPUCAoU0xPMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMTYsIHsgMHg5MGYwMDAwMCB9Ci0gIH0sCi0vKiBsb2NrICRkcixAJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwZDAgfQotICB9LAotLyogbWFjaGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDQwIH0KLSAgfSwKLS8qIG1hY2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKEFDQyksIDAgfSB9LAotICAgICYgaWZtdF9tYWNoaV9hLCB7IDB4MzA0MCB9Ci0gIH0sCi0vKiBtYWNsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwNTAgfQotICB9LAotLyogbWFjbG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoQUNDKSwgMCB9IH0sCi0gICAgJiBpZm10X21hY2hpX2EsIHsgMHgzMDUwIH0KLSAgfSwKLS8qIG1hY3doaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwNjAgfQotICB9LAotLyogbWFjd2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKEFDQyksIDAgfSB9LAotICAgICYgaWZtdF9tYWNoaV9hLCB7IDB4MzA2MCB9Ci0gIH0sCi0vKiBtYWN3bG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDcwIH0KLSAgfSwKLS8qIG1hY3dsbyAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChBQ0MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbWFjaGlfYSwgeyAweDMwNzAgfQotICB9LAotLyogbXVsICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwNjAgfQotICB9LAotLyogbXVsaGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDAwIH0KLSAgfSwKLS8qIG11bGhpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKEFDQyksIDAgfSB9LAotICAgICYgaWZtdF9tYWNoaV9hLCB7IDB4MzAwMCB9Ci0gIH0sCi0vKiBtdWxsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwMTAgfQotICB9LAotLyogbXVsbG8gJHNyYzEsJHNyYzIsJGFjYyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoQUNDKSwgMCB9IH0sCi0gICAgJiBpZm10X21hY2hpX2EsIHsgMHgzMDEwIH0KLSAgfSwKLS8qIG11bHdoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwMjAgfQotICB9LAotLyogbXVsd2hpICRzcmMxLCRzcmMyLCRhY2MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKEFDQyksIDAgfSB9LAotICAgICYgaWZtdF9tYWNoaV9hLCB7IDB4MzAyMCB9Ci0gIH0sCi0vKiBtdWx3bG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDMwIH0KLSAgfSwKLS8qIG11bHdsbyAkc3JjMSwkc3JjMiwkYWNjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChBQ0MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbWFjaGlfYSwgeyAweDMwMzAgfQotICB9LAotLyogbXYgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTA4MCB9Ci0gIH0sCi0vKiBtdmZhY2hpICRkciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgMCB9IH0sCi0gICAgJiBpZm10X212ZmFjaGksIHsgMHg1MGYwIH0KLSAgfSwKLS8qIG12ZmFjaGkgJGRyLCRhY2NzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChBQ0NTKSwgMCB9IH0sCi0gICAgJiBpZm10X212ZmFjaGlfYSwgeyAweDUwZjAgfQotICB9LAotLyogbXZmYWNsbyAkZHIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksIDAgfSB9LAotICAgICYgaWZtdF9tdmZhY2hpLCB7IDB4NTBmMSB9Ci0gIH0sCi0vKiBtdmZhY2xvICRkciwkYWNjcyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoQUNDUyksIDAgfSB9LAotICAgICYgaWZtdF9tdmZhY2hpX2EsIHsgMHg1MGYxIH0KLSAgfSwKLS8qIG12ZmFjbWkgJGRyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYWNoaSwgeyAweDUwZjIgfQotICB9LAotLyogbXZmYWNtaSAkZHIsJGFjY3MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEFDQ1MpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYWNoaV9hLCB7IDB4NTBmMiB9Ci0gIH0sCi0vKiBtdmZjICRkciwkc2NyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTQ1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYywgeyAweDEwOTAgfQotICB9LAotLyogbXZ0YWNoaSAkc3JjMSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZ0YWNoaSwgeyAweDUwNzAgfQotICB9LAotLyogbXZ0YWNoaSAkc3JjMSwkYWNjcyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChBQ0NTKSwgMCB9IH0sCi0gICAgJiBpZm10X212dGFjaGlfYSwgeyAweDUwNzAgfQotICB9LAotLyogbXZ0YWNsbyAkc3JjMSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZ0YWNoaSwgeyAweDUwNzEgfQotICB9LAotLyogbXZ0YWNsbyAkc3JjMSwkYWNjcyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChBQ0NTKSwgMCB9IH0sCi0gICAgJiBpZm10X212dGFjaGlfYSwgeyAweDUwNzEgfQotICB9LAotLyogbXZ0YyAkc3IsJGRjciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSKSwgJywnLCBPUCAoRENSKSwgMCB9IH0sCi0gICAgJiBpZm10X212dGMsIHsgMHgxMGEwIH0KLSAgfSwKLS8qIG5lZyAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgzMCB9Ci0gIH0sCi0vKiBub3AgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfbm9wLCB7IDB4NzAwMCB9Ci0gIH0sCi0vKiBub3QgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YjAgfQotICB9LAotLyogcmFjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X25vcCwgeyAweDUwOTAgfQotICB9LAotLyogcmFjICRhY2NkLCRhY2NzLCRpbW0xICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoQUNDRCksICcsJywgT1AgKEFDQ1MpLCAnLCcsIE9QIChJTU0xKSwgMCB9IH0sCi0gICAgJiBpZm10X3JhY19kc2ksIHsgMHg1MDkwIH0KLSAgfSwKLS8qIHJhY2ggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfbm9wLCB7IDB4NTA4MCB9Ci0gIH0sCi0vKiByYWNoICRhY2NkLCRhY2NzLCRpbW0xICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoQUNDRCksICcsJywgT1AgKEFDQ1MpLCAnLCcsIE9QIChJTU0xKSwgMCB9IH0sCi0gICAgJiBpZm10X3JhY19kc2ksIHsgMHg1MDgwIH0KLSAgfSwKLS8qIHJ0ZSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHgxMGQ2IH0KLSAgfSwKLS8qIHNldGggJGRyLCRoYXNoJGhpMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEhBU0gpLCBPUCAoSEkxNiksIDAgfSB9LAotICAgICYgaWZtdF9zZXRoLCB7IDB4ZDBjMDAwMDAgfQotICB9LAotLyogc2xsICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwNDAgfQotICB9LAotLyogc2xsMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZHYzLCB7IDB4OTBjMDAwMDAgfQotICB9LAotLyogc2xsaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChVSU1NNSksIDAgfSB9LAotICAgICYgaWZtdF9zbGxpLCB7IDB4NTA0MCB9Ci0gIH0sCi0vKiBzcmEgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTAyMCB9Ci0gIH0sCi0vKiBzcmEzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkdjMsIHsgMHg5MGEwMDAwMCB9Ci0gIH0sCi0vKiBzcmFpICRkciwkdWltbTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFVJTU01KSwgMCB9IH0sCi0gICAgJiBpZm10X3NsbGksIHsgMHg1MDIwIH0KLSAgfSwKLS8qIHNybCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDAwIH0KLSAgfSwKLS8qIHNybDMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hZGR2MywgeyAweDkwODAwMDAwIH0KLSAgfSwKLS8qIHNybGkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoVUlNTTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfc2xsaSwgeyAweDUwMDAgfQotICB9LAotLyogc3QgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgyMDQwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RfZCwgeyAweGEwNDAwMDAwIH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwMDAgfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RfZCwgeyAweGEwMDAwMDAwIH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwMjAgfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RfZCwgeyAweGEwMjAwMDAwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEArJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcrJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjA2MCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxALSRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnLScsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwNzAgfQotICB9LAotLyogc3ViICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwIH0KLSAgfSwKLS8qIHN1YnYgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MCB9Ci0gIH0sCi0vKiBzdWJ4ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwIH0KLSAgfSwKLS8qIHRyYXAgJHVpbW00ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVUlNTTQpLCAwIH0gfSwKLSAgICAmIGlmbXRfdHJhcCwgeyAweDEwZjAgfQotICB9LAotLyogdW5sb2NrICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjA1MCB9Ci0gIH0sCi0vKiBzYXRiICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X3NhdGIsIHsgMHg4MDYwMDMwMCB9Ci0gIH0sCi0vKiBzYXRoICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X3NhdGIsIHsgMHg4MDYwMDIwMCB9Ci0gIH0sCi0vKiBzYXQgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfc2F0YiwgeyAweDgwNjAwMDAwIH0KLSAgfSwKLS8qIHBjbXBieiAkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21weiwgeyAweDM3MCB9Ci0gIH0sCi0vKiBzYWRkICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X25vcCwgeyAweDUwZTQgfQotICB9LAotLyogbWFjd3UxICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4NTBiMCB9Ci0gIH0sCi0vKiBtc2JsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDUwZDAgfQotICB9LAotLyogbXVsd3UxICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4NTBhMCB9Ci0gIH0sCi0vKiBtYWNsaDEgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHg1MGMwIH0KLSAgfSwKLS8qIHNjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X25vcCwgeyAweDc0MDEgfQotICB9LAotLyogc25jICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X25vcCwgeyAweDc1MDEgfQotICB9LAotfTsKLQotI3VuZGVmIEEKLSN1bmRlZiBNTkVNCi0jdW5kZWYgT1BFUkFORAotI3VuZGVmIE9QCi0KLS8qIEZvcm1hdHMgZm9yIEFMSUFTIG1hY3JvLWluc25zLiAgKi8KLQotI2RlZmluZSBGKGYpICYgbTMycl9jZ2VuX2lmbGRfdGFibGVbQ09OQ0FUMiAoTTMyUl8sZildCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iYzhyID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmMyNHIgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JsOHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ibDI0ciA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmNsOHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iY2wyNHIgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JuYzhyID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYm5jMjRyID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9icmE4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JyYTI0ciA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYm5jbDhyID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYm5jbDI0ciA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkYl8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGJfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaF8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGhfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkdWJfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGR1Yl9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGR1aF8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHVoX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9wb3AgPSB7Ci0gIDE2LCAxNiwgMHhmMGZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaThhID0gewotICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX1NJTU04KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpMTZhID0gewotICAzMiwgMzIsIDB4ZjBmZjAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1IxKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9yYWNfZCA9IHsKLSAgMTYsIDE2LCAweGYzZmYsIHsgRiAoRl9PUDEpLCBGIChGX0FDQ0QpLCBGIChGX0JJVFM2NyksIEYgKEZfT1AyKSwgRiAoRl9BQ0NTKSwgRiAoRl9CSVQxNCksIEYgKEZfSU1NMSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3JhY19kcyA9IHsKLSAgMTYsIDE2LCAweGYzZjMsIHsgRiAoRl9PUDEpLCBGIChGX0FDQ0QpLCBGIChGX0JJVFM2NyksIEYgKEZfT1AyKSwgRiAoRl9BQ0NTKSwgRiAoRl9CSVQxNCksIEYgKEZfSU1NMSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3JhY2hfZCA9IHsKLSAgMTYsIDE2LCAweGYzZmYsIHsgRiAoRl9PUDEpLCBGIChGX0FDQ0QpLCBGIChGX0JJVFM2NyksIEYgKEZfT1AyKSwgRiAoRl9BQ0NTKSwgRiAoRl9CSVQxNCksIEYgKEZfSU1NMSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3JhY2hfZHMgPSB7Ci0gIDE2LCAxNiwgMHhmM2YzLCB7IEYgKEZfT1AxKSwgRiAoRl9BQ0NEKSwgRiAoRl9CSVRTNjcpLCBGIChGX09QMiksIEYgKEZfQUNDUyksIEYgKEZfQklUMTQpLCBGIChGX0lNTTEpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdF8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SMSksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdF9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RiXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0Yl9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RoXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0aF9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1IxKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfcHVzaCA9IHsKLSAgMTYsIDE2LCAweGYwZmYsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUjEpLCBGIChGX1IyKSwgMCB9Ci19OwotCi0jdW5kZWYgRgotCi0vKiBFYWNoIG5vbi1zaW1wbGUgbWFjcm8gZW50cnkgcG9pbnRzIHRvIGFuIGFycmF5IG9mIGV4cGFuc2lvbiBwb3NzaWJpbGl0aWVzLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCi0jZGVmaW5lIE1ORU0gQ0dFTl9TWU5UQVhfTU5FTU9OSUMgLyogc3ludGF4IHZhbHVlIGZvciBtbmVtb25pYyAqLwotI2RlZmluZSBPUEVSQU5EKG9wKSBDT05DQVQyIChNMzJSX09QRVJBTkRfLG9wKQotI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQotCi0vKiBUaGUgbWFjcm8gaW5zdHJ1Y3Rpb24gdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JQkFTRSBtMzJyX2NnZW5fbWFjcm9faW5zbl90YWJsZVtdID0KLXsKLS8qIGJjICRkaXNwOCAqLwotICB7Ci0gICAgLTEsICJiYzhyIiwgImJjIiwgMTYsCi0gICAgeyAwfEEoUkVMQVhBQkxFKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogYmMgJGRpc3AyNCAqLwotICB7Ci0gICAgLTEsICJiYzI0ciIsICJiYyIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYmwgJGRpc3A4ICovCi0gIHsKLSAgICAtMSwgImJsOHIiLCAiYmwiLCAxNiwKLSAgICB7IDB8QShSRUxBWEFCTEUpfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBibCAkZGlzcDI0ICovCi0gIHsKLSAgICAtMSwgImJsMjRyIiwgImJsIiwgMzIsCi0gICAgeyAwfEEoUkVMQVgpfEEoVU5DT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGJjbCAkZGlzcDggKi8KLSAgewotICAgIC0xLCAiYmNsOHIiLCAiYmNsIiwgMTYsCi0gICAgeyAwfEEoUkVMQVhBQkxFKXxBKEZJTExfU0xPVCl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBiY2wgJGRpc3AyNCAqLwotICB7Ci0gICAgLTEsICJiY2wyNHIiLCAiYmNsIiwgMzIsCi0gICAgeyAwfEEoUkVMQVgpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX00zMlJYKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYm5jICRkaXNwOCAqLwotICB7Ci0gICAgLTEsICJibmM4ciIsICJibmMiLCAxNiwKLSAgICB7IDB8QShSRUxBWEFCTEUpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBibmMgJGRpc3AyNCAqLwotICB7Ci0gICAgLTEsICJibmMyNHIiLCAiYm5jIiwgMzIsCi0gICAgeyAwfEEoUkVMQVgpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBicmEgJGRpc3A4ICovCi0gIHsKLSAgICAtMSwgImJyYThyIiwgImJyYSIsIDE2LAotICAgIHsgMHxBKFJFTEFYQUJMRSl8QShGSUxMX1NMT1QpfEEoVU5DT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJyYSAkZGlzcDI0ICovCi0gIHsKLSAgICAtMSwgImJyYTI0ciIsICJicmEiLCAzMiwKLSAgICB7IDB8QShSRUxBWCl8QShVTkNPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogYm5jbCAkZGlzcDggKi8KLSAgewotICAgIC0xLCAiYm5jbDhyIiwgImJuY2wiLCAxNiwKLSAgICB7IDB8QShSRUxBWEFCTEUpfEEoRklMTF9TTE9UKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGJuY2wgJGRpc3AyNCAqLwotICB7Ci0gICAgLTEsICJibmNsMjRyIiwgImJuY2wiLCAzMiwKLSAgICB7IDB8QShSRUxBWCl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZCAkZHIsQCgkc3IpICovCi0gIHsKLSAgICAtMSwgImxkLTIiLCAibGQiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJsZC1kMiIsICJsZCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkYiAkZHIsQCgkc3IpICovCi0gIHsKLSAgICAtMSwgImxkYi0yIiwgImxkYiIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGxkYiAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJsZGItZDIiLCAibGRiIiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogbGRoICRkcixAKCRzcikgKi8KLSAgewotICAgIC0xLCAibGRoLTIiLCAibGRoIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogbGRoICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgImxkaC1kMiIsICJsZGgiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZHViICRkcixAKCRzcikgKi8KLSAgewotICAgIC0xLCAibGR1Yi0yIiwgImxkdWIiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBsZHViICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgImxkdWItZDIiLCAibGR1YiIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZHVoLTIiLCAibGR1aCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAibGR1aC1kMiIsICJsZHVoIiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogcG9wICRkciAqLwotICB7Ci0gICAgLTEsICJwb3AiLCAicG9wIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBsZGkgJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgLTEsICJsZGk4YSIsICJsZGkiLCAxNiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfT1MgfSB9Ci0gIH0sCi0vKiBsZGkgJGRyLCRoYXNoJHNsbzE2ICovCi0gIHsKLSAgICAtMSwgImxkaTE2YSIsICJsZGkiLCAzMiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHJhYyAkYWNjZCAqLwotICB7Ci0gICAgLTEsICJyYWMtZCIsICJyYWMiLCAxNiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiByYWMgJGFjY2QsJGFjY3MgKi8KLSAgewotICAgIC0xLCAicmFjLWRzIiwgInJhYyIsIDE2LAotICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIHJhY2ggJGFjY2QgKi8KLSAgewotICAgIC0xLCAicmFjaC1kIiwgInJhY2giLCAxNiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfTTMyUlgpLCBQSVBFX1MgfSB9Ci0gIH0sCi0vKiByYWNoICRhY2NkLCRhY2NzICovCi0gIHsKLSAgICAtMSwgInJhY2gtZHMiLCAicmFjaCIsIDE2LAotICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9NMzJSWCksIFBJUEVfUyB9IH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICAtMSwgInN0LTIiLCAic3QiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX08gfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAic3QtZDIiLCAic3QiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIC0xLCAic3RiLTIiLCAic3RiIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9PIH0gfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJzdGItZDIiLCAic3RiIiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSwgUElQRV9OT05FIH0gfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICAtMSwgInN0aC0yIiwgInN0aCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTyB9IH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAic3RoLWQyIiwgInN0aCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSksIFBJUEVfTk9ORSB9IH0KLSAgfSwKLS8qIHB1c2ggJHNyYzEgKi8KLSAgewotICAgIC0xLCAicHVzaCIsICJwdXNoIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpLCBQSVBFX05PTkUgfSB9Ci0gIH0sCi19OwotCi0vKiBUaGUgbWFjcm8gaW5zdHJ1Y3Rpb24gb3Bjb2RlIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fT1BDT0RFIG0zMnJfY2dlbl9tYWNyb19pbnNuX29wY29kZV90YWJsZVtdID0KLXsKLS8qIGJjICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOHIsIHsgMHg3YzAwIH0KLSAgfSwKLS8qIGJjICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNHIsIHsgMHhmYzAwMDAwMCB9Ci0gIH0sCi0vKiBibCAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9ibDhyLCB7IDB4N2UwMCB9Ci0gIH0sCi0vKiBibCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JsMjRyLCB7IDB4ZmUwMDAwMDAgfQotICB9LAotLyogYmNsICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjbDhyLCB7IDB4NzgwMCB9Ci0gIH0sCi0vKiBiY2wgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iY2wyNHIsIHsgMHhmODAwMDAwMCB9Ci0gIH0sCi0vKiBibmMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYm5jOHIsIHsgMHg3ZDAwIH0KLSAgfSwKLS8qIGJuYyAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JuYzI0ciwgeyAweGZkMDAwMDAwIH0KLSAgfSwKLS8qIGJyYSAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9icmE4ciwgeyAweDdmMDAgfQotICB9LAotLyogYnJhICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhMjRyLCB7IDB4ZmYwMDAwMDAgfQotICB9LAotLyogYm5jbCAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9ibmNsOHIsIHsgMHg3OTAwIH0KLSAgfSwKLS8qIGJuY2wgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9ibmNsMjRyLCB7IDB4ZjkwMDAwMDAgfQotICB9LAotLyogbGQgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRfMiwgeyAweDIwYzAgfQotICB9LAotLyogbGQgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRfZDIsIHsgMHhhMGMwMDAwMCB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRiXzIsIHsgMHgyMDgwIH0KLSAgfSwKLS8qIGxkYiAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZGJfZDIsIHsgMHhhMDgwMDAwMCB9Ci0gIH0sCi0vKiBsZGggJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRoXzIsIHsgMHgyMGEwIH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZGhfZDIsIHsgMHhhMGEwMDAwMCB9Ci0gIH0sCi0vKiBsZHViICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkdWJfMiwgeyAweDIwOTAgfQotICB9LAotLyogbGR1YiAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHViX2QyLCB7IDB4YTA5MDAwMDAgfQotICB9LAotLyogbGR1aCAkZHIsQCgkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHVoXzIsIHsgMHgyMGIwIH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGR1aF9kMiwgeyAweGEwYjAwMDAwIH0KLSAgfSwKLS8qIHBvcCAkZHIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksIDAgfSB9LAotICAgICYgaWZtdF9wb3AsIHsgMHgyMGVmIH0KLSAgfSwKLS8qIGxkaSAkZHIsJHNpbW04ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTSU1NOCksIDAgfSB9LAotICAgICYgaWZtdF9sZGk4YSwgeyAweDYwMDAgfQotICB9LAotLyogbGRpICRkciwkaGFzaCRzbG8xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoSEFTSCksIE9QIChTTE8xNiksIDAgfSB9LAotICAgICYgaWZtdF9sZGkxNmEsIHsgMHg5MGYwMDAwMCB9Ci0gIH0sCi0vKiByYWMgJGFjY2QgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChBQ0NEKSwgMCB9IH0sCi0gICAgJiBpZm10X3JhY19kLCB7IDB4NTA5MCB9Ci0gIH0sCi0vKiByYWMgJGFjY2QsJGFjY3MgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChBQ0NEKSwgJywnLCBPUCAoQUNDUyksIDAgfSB9LAotICAgICYgaWZtdF9yYWNfZHMsIHsgMHg1MDkwIH0KLSAgfSwKLS8qIHJhY2ggJGFjY2QgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChBQ0NEKSwgMCB9IH0sCi0gICAgJiBpZm10X3JhY2hfZCwgeyAweDUwODAgfQotICB9LAotLyogcmFjaCAkYWNjZCwkYWNjcyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEFDQ0QpLCAnLCcsIE9QIChBQ0NTKSwgMCB9IH0sCi0gICAgJiBpZm10X3JhY2hfZHMsIHsgMHg1MDgwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RfMiwgeyAweDIwNDAgfQotICB9LAotLyogc3QgJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdF9kMiwgeyAweGEwNDAwMDAwIH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAKCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0Yl8yLCB7IDB4MjAwMCB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdGJfZDIsIHsgMHhhMDAwMDAwMCB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdGhfMiwgeyAweDIwMjAgfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RoX2QyLCB7IDB4YTAyMDAwMDAgfQotICB9LAotLyogcHVzaCAkc3JjMSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAwIH0gfSwKLSAgICAmIGlmbXRfcHVzaCwgeyAweDIwN2YgfQotICB9LAotfTsKLQotI3VuZGVmIEEKLSN1bmRlZiBNTkVNCi0jdW5kZWYgT1BFUkFORAotI3VuZGVmIE9QCi0KLSNpZm5kZWYgQ0dFTl9BU01fSEFTSF9QCi0jZGVmaW5lIENHRU5fQVNNX0hBU0hfUChpbnNuKSAxCi0jZW5kaWYKLQotI2lmbmRlZiBDR0VOX0RJU19IQVNIX1AKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSF9QKGluc24pIDEKLSNlbmRpZgotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgSU5TTiBpcyB0byBiZSBhZGRlZCB0byB0aGUgaGFzaCB0YWJsZS4KLSAgIFRhcmdldHMgYXJlIGZyZWUgdG8gb3ZlcnJpZGUgQ0dFTl97QVNNLERJU31fSEFTSF9QIGluIHRoZSAub3BjIGZpbGUuICAqLwotCi1zdGF0aWMgaW50Ci1hc21faGFzaF9pbnNuX3AgKGluc24pCi0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLXsKLSAgcmV0dXJuIENHRU5fQVNNX0hBU0hfUCAoaW5zbik7Ci19Ci0KLXN0YXRpYyBpbnQKLWRpc19oYXNoX2luc25fcCAoaW5zbikKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotewotICAvKiBJZiBidWlsZGluZyB0aGUgaGFzaCB0YWJsZSBhbmQgdGhlIE5PLURJUyBhdHRyaWJ1dGUgaXMgcHJlc2VudCwKLSAgICAgaWdub3JlLiAgKi8KLSAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fTk9fRElTKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIENHRU5fRElTX0hBU0hfUCAoaW5zbik7Ci19Ci0KLSNpZm5kZWYgQ0dFTl9BU01fSEFTSAotI2RlZmluZSBDR0VOX0FTTV9IQVNIX1NJWkUgMTI3Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotI2RlZmluZSBDR0VOX0FTTV9IQVNIKG1uZW0pICgqKHVuc2lnbmVkIGNoYXIgKikgKG1uZW0pICUgQ0dFTl9BU01fSEFTSF9TSVpFKQotI2Vsc2UKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSChtbmVtKSAoKih1bnNpZ25lZCBjaGFyICopIChtbmVtKSAlIENHRU5fQVNNX0hBU0hfU0laRSkgLypGSVhNRSovCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBJdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB0byBwcm92aWRlIGEgZGVmYXVsdCBoZXJlLAotICAgYnV0IHdoaWxlIHRoaXMgaXMgdW5kZXIgZGV2ZWxvcG1lbnQgd2UgZG8uCi0gICBCVUZGRVIgaXMgYSBwb2ludGVyIHRvIHRoZSBieXRlcyBvZiB0aGUgaW5zbiwgdGFyZ2V0IG9yZGVyLgotICAgVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgYXMgYW4gaW50IGluIGhvc3Qgb3JkZXIuICAqLwotCi0jaWZuZGVmIENHRU5fRElTX0hBU0gKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSF9TSVpFIDI1NgotI2RlZmluZSBDR0VOX0RJU19IQVNIKGJ1ZiwgdmFsdWUpICgqKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZikpCi0jZW5kaWYKLQotLyogVGhlIHJlc3VsdCBpcyB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUgaW5zbi4KLSAgIFRhcmdldHMgYXJlIGZyZWUgdG8gb3ZlcnJpZGUgQ0dFTl97QVNNLERJU31fSEFTSCBpbiB0aGUgLm9wYyBmaWxlLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotYXNtX2hhc2hfaW5zbiAobW5lbSkKLSAgICAgY29uc3QgY2hhciAqIG1uZW07Ci17Ci0gIHJldHVybiBDR0VOX0FTTV9IQVNIIChtbmVtKTsKLX0KLQotLyogQlVGIGlzIGEgcG9pbnRlciB0byB0aGUgYnl0ZXMgb2YgdGhlIGluc24sIHRhcmdldCBvcmRlci4KLSAgIFZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIGFzIGFuIGludCBpbiBob3N0IG9yZGVyLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotZGlzX2hhc2hfaW5zbiAoYnVmLCB2YWx1ZSkKLSAgICAgY29uc3QgY2hhciAqIGJ1ZjsKLSAgICAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKLXsKLSAgcmV0dXJuIENHRU5fRElTX0hBU0ggKGJ1ZiwgdmFsdWUpOwotfQotCi0vKiBTZXQgdGhlIHJlY29yZGVkIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiB0aGUgQ0dFTl9GSUVMRFMgc3RydWN0LiAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9maWVsZHNfYml0c2l6ZSAoZmllbGRzLCBzaXplKQotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IHNpemU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGNhbGwgYmVmb3JlIHVzaW5nIHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlLgotICAgVGhpcyBwbHVncyB0aGUgb3Bjb2RlIGVudHJpZXMgYW5kIG1hY3JvIGluc3RydWN0aW9ucyBpbnRvIHRoZSBjcHUgdGFibGUuICAqLwotCi12b2lkCi1tMzJyX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgaTsKLSAgaW50IG51bV9tYWNyb3MgPSAoc2l6ZW9mIChtMzJyX2NnZW5fbWFjcm9faW5zbl90YWJsZSkgLwotCQkgICAgc2l6ZW9mIChtMzJyX2NnZW5fbWFjcm9faW5zbl90YWJsZVswXSkpOwotICBjb25zdCBDR0VOX0lCQVNFICppYiA9ICYgbTMycl9jZ2VuX21hY3JvX2luc25fdGFibGVbMF07Ci0gIGNvbnN0IENHRU5fT1BDT0RFICpvYyA9ICYgbTMycl9jZ2VuX21hY3JvX2luc25fb3Bjb2RlX3RhYmxlWzBdOwotICBDR0VOX0lOU04gKmluc25zID0gKENHRU5fSU5TTiAqKSB4bWFsbG9jIChudW1fbWFjcm9zICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLSAgbWVtc2V0IChpbnNucywgMCwgbnVtX21hY3JvcyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1fbWFjcm9zOyArK2kpCi0gICAgewotICAgICAgaW5zbnNbaV0uYmFzZSA9ICZpYltpXTsKLSAgICAgIGluc25zW2ldLm9wY29kZSA9ICZvY1tpXTsKLSAgICB9Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLmluaXRfZW50cmllcyA9IGluc25zOwotICBjZC0+bWFjcm9faW5zbl90YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0lCQVNFKTsKLSAgY2QtPm1hY3JvX2luc25fdGFibGUubnVtX2luaXRfZW50cmllcyA9IG51bV9tYWNyb3M7Ci0KLSAgb2MgPSAmIG0zMnJfY2dlbl9pbnNuX29wY29kZV90YWJsZVswXTsKLSAgaW5zbnMgPSAoQ0dFTl9JTlNOICopIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllczsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JTlNOUzsgKytpKQotICAgIGluc25zW2ldLm9wY29kZSA9ICZvY1tpXTsKLQotICBjZC0+c2l6ZW9mX2ZpZWxkcyA9IHNpemVvZiAoQ0dFTl9GSUVMRFMpOwotICBjZC0+c2V0X2ZpZWxkc19iaXRzaXplID0gc2V0X2ZpZWxkc19iaXRzaXplOwotCi0gIGNkLT5hc21faGFzaF9wID0gYXNtX2hhc2hfaW5zbl9wOwotICBjZC0+YXNtX2hhc2ggPSBhc21faGFzaF9pbnNuOwotICBjZC0+YXNtX2hhc2hfc2l6ZSA9IENHRU5fQVNNX0hBU0hfU0laRTsKLQotICBjZC0+ZGlzX2hhc2hfcCA9IGRpc19oYXNoX2luc25fcDsKLSAgY2QtPmRpc19oYXNoID0gZGlzX2hhc2hfaW5zbjsKLSAgY2QtPmRpc19oYXNoX3NpemUgPSBDR0VOX0RJU19IQVNIX1NJWkU7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItb3BjLmggYi9vcGNvZGVzL20zMnItb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmEzMzIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qIEluc3RydWN0aW9uIG9wY29kZSBoZWFkZXIgZm9yIG0zMnIuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpZm5kZWYgTTMyUl9PUENfSAotI2RlZmluZSBNMzJSX09QQ19ICi0KLS8qIC0tIG9wYy5oICovCi0KLSN1bmRlZiBDR0VOX0RJU19IQVNIX1NJWkUKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSF9TSVpFIDI1NgotI3VuZGVmIENHRU5fRElTX0hBU0gKLSNkZWZpbmUgWChiKSAoKCh1bnNpZ25lZCBjaGFyICopIChiKSlbMF0gJiAweGYwKQotI2RlZmluZSBDR0VOX0RJU19IQVNIKGJ1ZmZlciwgdmFsdWUpIFwKLShYIChidWZmZXIpIHwgXAotIChYIChidWZmZXIpID09IDB4NDAgfHwgWCAoYnVmZmVyKSA9PSAweGUwIHx8IFggKGJ1ZmZlcikgPT0gMHg2MCB8fCBYIChidWZmZXIpID09IDB4NTAgPyAwIFwKLSAgOiBYIChidWZmZXIpID09IDB4NzAgfHwgWCAoYnVmZmVyKSA9PSAweGYwID8gKCgodW5zaWduZWQgY2hhciAqKSAoYnVmZmVyKSlbMF0gJiAweGYpIFwKLSAgOiBYIChidWZmZXIpID09IDB4MzAgPyAoKCgodW5zaWduZWQgY2hhciAqKSAoYnVmZmVyKSlbMV0gJiAweDcwKSA+PiA0KSBcCi0gIDogKCgoKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZmZlcikpWzFdICYgMHhmMCkgPj4gNCkpKQotCi0vKiAtLSAqLwotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbTMyciBpbnN0cnVjdGlvbiB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9pbnNuX3R5cGUgewotICBNMzJSX0lOU05fSU5WQUxJRCwgTTMyUl9JTlNOX0FERCwgTTMyUl9JTlNOX0FERDMsIE0zMlJfSU5TTl9BTkQKLSAsIE0zMlJfSU5TTl9BTkQzLCBNMzJSX0lOU05fT1IsIE0zMlJfSU5TTl9PUjMsIE0zMlJfSU5TTl9YT1IKLSAsIE0zMlJfSU5TTl9YT1IzLCBNMzJSX0lOU05fQURESSwgTTMyUl9JTlNOX0FERFYsIE0zMlJfSU5TTl9BRERWMwotICwgTTMyUl9JTlNOX0FERFgsIE0zMlJfSU5TTl9CQzgsIE0zMlJfSU5TTl9CQzI0LCBNMzJSX0lOU05fQkVRCi0gLCBNMzJSX0lOU05fQkVRWiwgTTMyUl9JTlNOX0JHRVosIE0zMlJfSU5TTl9CR1RaLCBNMzJSX0lOU05fQkxFWgotICwgTTMyUl9JTlNOX0JMVFosIE0zMlJfSU5TTl9CTkVaLCBNMzJSX0lOU05fQkw4LCBNMzJSX0lOU05fQkwyNAotICwgTTMyUl9JTlNOX0JDTDgsIE0zMlJfSU5TTl9CQ0wyNCwgTTMyUl9JTlNOX0JOQzgsIE0zMlJfSU5TTl9CTkMyNAotICwgTTMyUl9JTlNOX0JORSwgTTMyUl9JTlNOX0JSQTgsIE0zMlJfSU5TTl9CUkEyNCwgTTMyUl9JTlNOX0JOQ0w4Ci0gLCBNMzJSX0lOU05fQk5DTDI0LCBNMzJSX0lOU05fQ01QLCBNMzJSX0lOU05fQ01QSSwgTTMyUl9JTlNOX0NNUFUKLSAsIE0zMlJfSU5TTl9DTVBVSSwgTTMyUl9JTlNOX0NNUEVRLCBNMzJSX0lOU05fQ01QWiwgTTMyUl9JTlNOX0RJVgotICwgTTMyUl9JTlNOX0RJVlUsIE0zMlJfSU5TTl9SRU0sIE0zMlJfSU5TTl9SRU1VLCBNMzJSX0lOU05fRElWSAotICwgTTMyUl9JTlNOX0pDLCBNMzJSX0lOU05fSk5DLCBNMzJSX0lOU05fSkwsIE0zMlJfSU5TTl9KTVAKLSAsIE0zMlJfSU5TTl9MRCwgTTMyUl9JTlNOX0xEX0QsIE0zMlJfSU5TTl9MREIsIE0zMlJfSU5TTl9MREJfRAotICwgTTMyUl9JTlNOX0xESCwgTTMyUl9JTlNOX0xESF9ELCBNMzJSX0lOU05fTERVQiwgTTMyUl9JTlNOX0xEVUJfRAotICwgTTMyUl9JTlNOX0xEVUgsIE0zMlJfSU5TTl9MRFVIX0QsIE0zMlJfSU5TTl9MRF9QTFVTLCBNMzJSX0lOU05fTEQyNAotICwgTTMyUl9JTlNOX0xESTgsIE0zMlJfSU5TTl9MREkxNiwgTTMyUl9JTlNOX0xPQ0ssIE0zMlJfSU5TTl9NQUNISQotICwgTTMyUl9JTlNOX01BQ0hJX0EsIE0zMlJfSU5TTl9NQUNMTywgTTMyUl9JTlNOX01BQ0xPX0EsIE0zMlJfSU5TTl9NQUNXSEkKLSAsIE0zMlJfSU5TTl9NQUNXSElfQSwgTTMyUl9JTlNOX01BQ1dMTywgTTMyUl9JTlNOX01BQ1dMT19BLCBNMzJSX0lOU05fTVVMCi0gLCBNMzJSX0lOU05fTVVMSEksIE0zMlJfSU5TTl9NVUxISV9BLCBNMzJSX0lOU05fTVVMTE8sIE0zMlJfSU5TTl9NVUxMT19BCi0gLCBNMzJSX0lOU05fTVVMV0hJLCBNMzJSX0lOU05fTVVMV0hJX0EsIE0zMlJfSU5TTl9NVUxXTE8sIE0zMlJfSU5TTl9NVUxXTE9fQQotICwgTTMyUl9JTlNOX01WLCBNMzJSX0lOU05fTVZGQUNISSwgTTMyUl9JTlNOX01WRkFDSElfQSwgTTMyUl9JTlNOX01WRkFDTE8KLSAsIE0zMlJfSU5TTl9NVkZBQ0xPX0EsIE0zMlJfSU5TTl9NVkZBQ01JLCBNMzJSX0lOU05fTVZGQUNNSV9BLCBNMzJSX0lOU05fTVZGQwotICwgTTMyUl9JTlNOX01WVEFDSEksIE0zMlJfSU5TTl9NVlRBQ0hJX0EsIE0zMlJfSU5TTl9NVlRBQ0xPLCBNMzJSX0lOU05fTVZUQUNMT19BCi0gLCBNMzJSX0lOU05fTVZUQywgTTMyUl9JTlNOX05FRywgTTMyUl9JTlNOX05PUCwgTTMyUl9JTlNOX05PVAotICwgTTMyUl9JTlNOX1JBQywgTTMyUl9JTlNOX1JBQ19EU0ksIE0zMlJfSU5TTl9SQUNILCBNMzJSX0lOU05fUkFDSF9EU0kKLSAsIE0zMlJfSU5TTl9SVEUsIE0zMlJfSU5TTl9TRVRILCBNMzJSX0lOU05fU0xMLCBNMzJSX0lOU05fU0xMMwotICwgTTMyUl9JTlNOX1NMTEksIE0zMlJfSU5TTl9TUkEsIE0zMlJfSU5TTl9TUkEzLCBNMzJSX0lOU05fU1JBSQotICwgTTMyUl9JTlNOX1NSTCwgTTMyUl9JTlNOX1NSTDMsIE0zMlJfSU5TTl9TUkxJLCBNMzJSX0lOU05fU1QKLSAsIE0zMlJfSU5TTl9TVF9ELCBNMzJSX0lOU05fU1RCLCBNMzJSX0lOU05fU1RCX0QsIE0zMlJfSU5TTl9TVEgKLSAsIE0zMlJfSU5TTl9TVEhfRCwgTTMyUl9JTlNOX1NUX1BMVVMsIE0zMlJfSU5TTl9TVF9NSU5VUywgTTMyUl9JTlNOX1NVQgotICwgTTMyUl9JTlNOX1NVQlYsIE0zMlJfSU5TTl9TVUJYLCBNMzJSX0lOU05fVFJBUCwgTTMyUl9JTlNOX1VOTE9DSwotICwgTTMyUl9JTlNOX1NBVEIsIE0zMlJfSU5TTl9TQVRILCBNMzJSX0lOU05fU0FULCBNMzJSX0lOU05fUENNUEJaCi0gLCBNMzJSX0lOU05fU0FERCwgTTMyUl9JTlNOX01BQ1dVMSwgTTMyUl9JTlNOX01TQkxPLCBNMzJSX0lOU05fTVVMV1UxCi0gLCBNMzJSX0lOU05fTUFDTEgxLCBNMzJSX0lOU05fU0MsIE0zMlJfSU5TTl9TTkMsIE0zMlJfSU5TTl9NQVgKLX0gQ0dFTl9JTlNOX1RZUEU7Ci0KLS8qIEluZGV4IG9mIGBpbnZhbGlkJyBpbnNuIHBsYWNlIGhvbGRlci4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9JTlZBTElEIE0zMlJfSU5TTl9JTlZBTElECi0KLS8qIFRvdGFsIG51bWJlciBvZiBpbnNucyBpbiB0YWJsZS4gICovCi0jZGVmaW5lIE1BWF9JTlNOUyAoKGludCkgTTMyUl9JTlNOX01BWCkKLQotLyogVGhpcyBzdHJ1Y3QgcmVjb3JkcyBkYXRhIHByaW9yIHRvIGluc2VydGlvbiBvciBhZnRlciBleHRyYWN0aW9uLiAgKi8KLXN0cnVjdCBjZ2VuX2ZpZWxkcwotewotICBpbnQgbGVuZ3RoOwotICBsb25nIGZfbmlsOwotICBsb25nIGZfb3AxOwotICBsb25nIGZfb3AyOwotICBsb25nIGZfY29uZDsKLSAgbG9uZyBmX3IxOwotICBsb25nIGZfcjI7Ci0gIGxvbmcgZl9zaW1tODsKLSAgbG9uZyBmX3NpbW0xNjsKLSAgbG9uZyBmX3NoaWZ0X29wMjsKLSAgbG9uZyBmX3VpbW00OwotICBsb25nIGZfdWltbTU7Ci0gIGxvbmcgZl91aW1tMTY7Ci0gIGxvbmcgZl91aW1tMjQ7Ci0gIGxvbmcgZl9oaTE2OwotICBsb25nIGZfZGlzcDg7Ci0gIGxvbmcgZl9kaXNwMTY7Ci0gIGxvbmcgZl9kaXNwMjQ7Ci0gIGxvbmcgZl9vcDIzOwotICBsb25nIGZfb3AzOwotICBsb25nIGZfYWNjOwotICBsb25nIGZfYWNjczsKLSAgbG9uZyBmX2FjY2Q7Ci0gIGxvbmcgZl9iaXRzNjc7Ci0gIGxvbmcgZl9iaXQxNDsKLSAgbG9uZyBmX2ltbTE7Ci19OwotCi0jZGVmaW5lIENHRU5fSU5JVF9QQVJTRShvZCkgXAote1wKLX0KLSNkZWZpbmUgQ0dFTl9JTklUX0lOU0VSVChvZCkgXAote1wKLX0KLSNkZWZpbmUgQ0dFTl9JTklUX0VYVFJBQ1Qob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9QUklOVChvZCkgXAote1wKLX0KLQotCi0jZW5kaWYgLyogTTMyUl9PUENfSCAqLwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLW9waW5zdC5jIGIvb3Bjb2Rlcy9tMzJyLW9waW5zdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjk2NTFmLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1vcGluc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDY3MyArMCwwIEBACi0vKiBTZW1hbnRpYyBvcGVyYW5kIGluc3RhbmNlcyBmb3IgbTMyci4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAibTMyci1kZXNjLmgiCi0jaW5jbHVkZSAibTMyci1vcGMuaCIKLQotLyogT3BlcmFuZCByZWZlcmVuY2VzLiAgKi8KLQotI2RlZmluZSBJTlBVVCBDR0VOX09QSU5TVF9JTlBVVAotI2RlZmluZSBPVVRQVVQgQ0dFTl9PUElOU1RfT1VUUFVUCi0jZGVmaW5lIEVORCBDR0VOX09QSU5TVF9FTkQKLSNkZWZpbmUgQ09ORF9SRUYgQ0dFTl9PUElOU1RfQ09ORF9SRUYKLSNkZWZpbmUgT1BfRU5UKG9wKSBDT05DQVQyIChNMzJSX09QRVJBTkRfLG9wKQotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9lbXB0eV9vcHNbXSA9IHsKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYWRkX29wc1tdID0gewotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYWRkM19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9hbmQzX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJ1aW1tMTYiLCBIV19IX1VJTlQsIENHRU5fTU9ERV9VSU5ULCBPUF9FTlQgKFVJTU0xNiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfb3IzX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJ1bG8xNiIsIEhXX0hfVUxPMTYsIENHRU5fTU9ERV9VSU5ULCBPUF9FTlQgKFVMTzE2KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9hZGRpX29wc1tdID0gewotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzaW1tOCIsIEhXX0hfU0lOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTSU1NOCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYWRkdl9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2FkZHYzX29wc1tdID0gewotICB7IElOUFVULCAic2ltbTE2IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU0xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9hZGR4X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9iYzhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImRpc3A4IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQOCksIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9iYzI0X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9iZXFfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkaXNwMTYiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AxNiksIDAsIENPTkRfUkVGIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9iZXF6X29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDE2IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMTYpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmw4X29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDgiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1A4KSwgMCwgMCB9LAotICB7IElOUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9ncl8xNCIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgMCwgMTQsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmwyNF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3AyNCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDI0KSwgMCwgMCB9LAotICB7IElOUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9ncl8xNCIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgMCwgMTQsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfYmNsOF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiZGlzcDgiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1A4KSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBPVVRQVVQsICJoX2dyXzE0IiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCAwLCAxNCwgQ09ORF9SRUYgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2JjbDI0X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIENPTkRfUkVGIH0sCi0gIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAiaF9ncl8xNCIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgMCwgMTQsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9icmE4X29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDgiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1A4KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9icmEyNF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3AyNCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDI0KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9jbXBfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2NtcGlfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzaW1tMTYiLCBIV19IX1NJTlQsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0lNTTE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9jbXB6X29wc1tdID0gewotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9kaXZfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIENPTkRfUkVGIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2pjX29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9qbF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9ncl8xNCIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgMCwgMTQsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfam1wX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2xkX29wc1tdID0gewotICB7IElOUFVULCAiaF9tZW1vcnlfc3IiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X2xkX2Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9hZGRfX0RGTFRfc3Jfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbGRfcGx1c19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X3NyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9sZDI0X29wc1tdID0gewotICB7IElOUFVULCAidWltbTI0IiwgSFdfSF9BRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFVJTU0yNCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbGRpOF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNpbW04IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU04KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9sZGkxNl9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbG9ja19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X3NyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbG9jayIsIEhXX0hfTE9DSywgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X21hY2hpX29wc1tdID0gewotICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tYWNoaV9hX29wc1tdID0gewotICB7IElOUFVULCAiYWNjIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgT1BfRU5UIChBQ0MpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgT1BfRU5UIChBQ0MpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X211bGhpX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X211bGhpX2Ffb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgT1BfRU5UIChBQ0MpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X212X29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X212ZmFjaGlfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdmZhY2hpX2Ffb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2NzIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgT1BfRU5UIChBQ0NTKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tdmZjX29wc1tdID0gewotICB7IElOUFVULCAic2NyIiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTQ1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X212dGFjaGlfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X212dGFjaGlfYV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjY3MiLCBIV19IX0FDQ1VNUywgQ0dFTl9NT0RFX0RJLCBPUF9FTlQgKEFDQ1MpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjcyIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIE9QX0VOVCAoQUNDUyksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfbXZ0Y19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRjciIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRENSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9ub3Bfb3BzW10gPSB7Ci0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3JhY19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfcmFjX2RzaV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjY3MiLCBIV19IX0FDQ1VNUywgQ0dFTl9NT0RFX0RJLCBPUF9FTlQgKEFDQ1MpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJpbW0xIiwgSFdfSF9VSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKElNTTEpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjZCIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIE9QX0VOVCAoQUNDRCksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfcnRlX29wc1tdID0gewotICB7IElOUFVULCAiaF9iYnBzdyIsIEhXX0hfQkJQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImhfYnBzdyIsIEhXX0hfQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiaF9jcl8xNCIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDE0LCAwIH0sCi0gIHsgSU5QVVQsICJoX2NyXzYiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCA2LCAwIH0sCi0gIHsgT1VUUFVULCAiaF9icHN3IiwgSFdfSF9CUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9jcl82IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgNiwgMCB9LAotICB7IE9VVFBVVCwgImhfcHN3IiwgSFdfSF9QU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc2V0aF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhpMTYiLCBIV19IX0hJMTYsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChISTE2KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zbGwzX29wc1tdID0gewotICB7IElOUFVULCAic2ltbTE2IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU0lNTTE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3NsbGlfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInVpbW01IiwgSFdfSF9VSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFVJTU01KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zdF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3RfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9hZGRfX0RGTFRfc3JjMl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3RiX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9RSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9zcmMyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9RSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zdGJfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfUUksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9hZGRfX0RGTFRfc3JjMl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfUUksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3RoX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9ISSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9zcmMyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9ISSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zdGhfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfSEksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9hZGRfX0RGTFRfc3JjMl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfSEksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc3RfcGx1c19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9uZXdfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3RyYXBfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX2Jwc3ciLCBIV19IX0JQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImhfY3JfNiIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDYsIDAgfSwKLSAgeyBJTlBVVCwgImhfcHN3IiwgSFdfSF9QU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAidWltbTQiLCBIV19IX1VJTlQsIENHRU5fTU9ERV9VSU5ULCBPUF9FTlQgKFVJTU00KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfYmJwc3ciLCBIV19IX0JCUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9icHN3IiwgSFdfSF9CUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9jcl8xNCIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDE0LCAwIH0sCi0gIHsgT1VUUFVULCAiaF9jcl82IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgNiwgMCB9LAotICB7IE9VVFBVVCwgImhfcHN3IiwgSFdfSF9QU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF91bmxvY2tfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX2xvY2siLCBIV19IX0xPQ0ssIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSQzIpLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgImhfbG9jayIsIEhXX0hfTE9DSywgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3NhdGJfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIHNmbXRfc2F0X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X3NhZGRfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX2FjY3Vtc18wIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiaF9hY2N1bXNfMSIsIEhXX0hfQUNDVU1TLCBDR0VOX01PREVfREksIDAsIDEsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2FjY3Vtc18wIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9tYWN3dTFfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX2FjY3Vtc18xIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgMCwgMSwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfYWNjdW1zXzEiLCBIV19IX0FDQ1VNUywgQ0dFTl9NT0RFX0RJLCAwLCAxLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBzZm10X211bHd1MV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2FjY3Vtc18xIiwgSFdfSF9BQ0NVTVMsIENHRU5fTU9ERV9ESSwgMCwgMSwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1Qgc2ZtdF9zY19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi0jdW5kZWYgSU5QVVQKLSN1bmRlZiBPVVRQVVQKLSN1bmRlZiBFTkQKLSN1bmRlZiBDT05EX1JFRgotI3VuZGVmIE9QX0VOVAotCi0vKiBPcGVyYW5kIGluc3RhbmNlIGxvb2t1cCB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCAqbTMycl9jZ2VuX29waW5zdF90YWJsZVtNQVhfSU5TTlNdID0gewotICAwLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X2FkZDNfb3BzWzBdLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X2FuZDNfb3BzWzBdLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X29yM19vcHNbMF0sCi0gICYgc2ZtdF9hZGRfb3BzWzBdLAotICAmIHNmbXRfYW5kM19vcHNbMF0sCi0gICYgc2ZtdF9hZGRpX29wc1swXSwKLSAgJiBzZm10X2FkZHZfb3BzWzBdLAotICAmIHNmbXRfYWRkdjNfb3BzWzBdLAotICAmIHNmbXRfYWRkeF9vcHNbMF0sCi0gICYgc2ZtdF9iYzhfb3BzWzBdLAotICAmIHNmbXRfYmMyNF9vcHNbMF0sCi0gICYgc2ZtdF9iZXFfb3BzWzBdLAotICAmIHNmbXRfYmVxel9vcHNbMF0sCi0gICYgc2ZtdF9iZXF6X29wc1swXSwKLSAgJiBzZm10X2JlcXpfb3BzWzBdLAotICAmIHNmbXRfYmVxel9vcHNbMF0sCi0gICYgc2ZtdF9iZXF6X29wc1swXSwKLSAgJiBzZm10X2JlcXpfb3BzWzBdLAotICAmIHNmbXRfYmw4X29wc1swXSwKLSAgJiBzZm10X2JsMjRfb3BzWzBdLAotICAmIHNmbXRfYmNsOF9vcHNbMF0sCi0gICYgc2ZtdF9iY2wyNF9vcHNbMF0sCi0gICYgc2ZtdF9iYzhfb3BzWzBdLAotICAmIHNmbXRfYmMyNF9vcHNbMF0sCi0gICYgc2ZtdF9iZXFfb3BzWzBdLAotICAmIHNmbXRfYnJhOF9vcHNbMF0sCi0gICYgc2ZtdF9icmEyNF9vcHNbMF0sCi0gICYgc2ZtdF9iY2w4X29wc1swXSwKLSAgJiBzZm10X2JjbDI0X29wc1swXSwKLSAgJiBzZm10X2NtcF9vcHNbMF0sCi0gICYgc2ZtdF9jbXBpX29wc1swXSwKLSAgJiBzZm10X2NtcF9vcHNbMF0sCi0gICYgc2ZtdF9jbXBpX29wc1swXSwKLSAgJiBzZm10X2NtcF9vcHNbMF0sCi0gICYgc2ZtdF9jbXB6X29wc1swXSwKLSAgJiBzZm10X2Rpdl9vcHNbMF0sCi0gICYgc2ZtdF9kaXZfb3BzWzBdLAotICAmIHNmbXRfZGl2X29wc1swXSwKLSAgJiBzZm10X2Rpdl9vcHNbMF0sCi0gICYgc2ZtdF9kaXZfb3BzWzBdLAotICAmIHNmbXRfamNfb3BzWzBdLAotICAmIHNmbXRfamNfb3BzWzBdLAotICAmIHNmbXRfamxfb3BzWzBdLAotICAmIHNmbXRfam1wX29wc1swXSwKLSAgJiBzZm10X2xkX29wc1swXSwKLSAgJiBzZm10X2xkX2Rfb3BzWzBdLAotICAmIHNmbXRfbGRfb3BzWzBdLAotICAmIHNmbXRfbGRfZF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9kX29wc1swXSwKLSAgJiBzZm10X2xkX29wc1swXSwKLSAgJiBzZm10X2xkX2Rfb3BzWzBdLAotICAmIHNmbXRfbGRfb3BzWzBdLAotICAmIHNmbXRfbGRfZF9vcHNbMF0sCi0gICYgc2ZtdF9sZF9wbHVzX29wc1swXSwKLSAgJiBzZm10X2xkMjRfb3BzWzBdLAotICAmIHNmbXRfbGRpOF9vcHNbMF0sCi0gICYgc2ZtdF9sZGkxNl9vcHNbMF0sCi0gICYgc2ZtdF9sb2NrX29wc1swXSwKLSAgJiBzZm10X21hY2hpX29wc1swXSwKLSAgJiBzZm10X21hY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbWFjaGlfb3BzWzBdLAotICAmIHNmbXRfbWFjaGlfYV9vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tYWNoaV9hX29wc1swXSwKLSAgJiBzZm10X21hY2hpX29wc1swXSwKLSAgJiBzZm10X21hY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X211bGhpX29wc1swXSwKLSAgJiBzZm10X211bGhpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXVsaGlfb3BzWzBdLAotICAmIHNmbXRfbXVsaGlfYV9vcHNbMF0sCi0gICYgc2ZtdF9tdWxoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdWxoaV9hX29wc1swXSwKLSAgJiBzZm10X211bGhpX29wc1swXSwKLSAgJiBzZm10X211bGhpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXZfb3BzWzBdLAotICAmIHNmbXRfbXZmYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdmZhY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXZmYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdmZhY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXZmYWNoaV9vcHNbMF0sCi0gICYgc2ZtdF9tdmZhY2hpX2Ffb3BzWzBdLAotICAmIHNmbXRfbXZmY19vcHNbMF0sCi0gICYgc2ZtdF9tdnRhY2hpX29wc1swXSwKLSAgJiBzZm10X212dGFjaGlfYV9vcHNbMF0sCi0gICYgc2ZtdF9tdnRhY2hpX29wc1swXSwKLSAgJiBzZm10X212dGFjaGlfYV9vcHNbMF0sCi0gICYgc2ZtdF9tdnRjX29wc1swXSwKLSAgJiBzZm10X212X29wc1swXSwKLSAgJiBzZm10X25vcF9vcHNbMF0sCi0gICYgc2ZtdF9tdl9vcHNbMF0sCi0gICYgc2ZtdF9yYWNfb3BzWzBdLAotICAmIHNmbXRfcmFjX2RzaV9vcHNbMF0sCi0gICYgc2ZtdF9yYWNfb3BzWzBdLAotICAmIHNmbXRfcmFjX2RzaV9vcHNbMF0sCi0gICYgc2ZtdF9ydGVfb3BzWzBdLAotICAmIHNmbXRfc2V0aF9vcHNbMF0sCi0gICYgc2ZtdF9hZGRfb3BzWzBdLAotICAmIHNmbXRfc2xsM19vcHNbMF0sCi0gICYgc2ZtdF9zbGxpX29wc1swXSwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9zbGwzX29wc1swXSwKLSAgJiBzZm10X3NsbGlfb3BzWzBdLAotICAmIHNmbXRfYWRkX29wc1swXSwKLSAgJiBzZm10X3NsbDNfb3BzWzBdLAotICAmIHNmbXRfc2xsaV9vcHNbMF0sCi0gICYgc2ZtdF9zdF9vcHNbMF0sCi0gICYgc2ZtdF9zdF9kX29wc1swXSwKLSAgJiBzZm10X3N0Yl9vcHNbMF0sCi0gICYgc2ZtdF9zdGJfZF9vcHNbMF0sCi0gICYgc2ZtdF9zdGhfb3BzWzBdLAotICAmIHNmbXRfc3RoX2Rfb3BzWzBdLAotICAmIHNmbXRfc3RfcGx1c19vcHNbMF0sCi0gICYgc2ZtdF9zdF9wbHVzX29wc1swXSwKLSAgJiBzZm10X2FkZF9vcHNbMF0sCi0gICYgc2ZtdF9hZGR2X29wc1swXSwKLSAgJiBzZm10X2FkZHhfb3BzWzBdLAotICAmIHNmbXRfdHJhcF9vcHNbMF0sCi0gICYgc2ZtdF91bmxvY2tfb3BzWzBdLAotICAmIHNmbXRfc2F0Yl9vcHNbMF0sCi0gICYgc2ZtdF9zYXRiX29wc1swXSwKLSAgJiBzZm10X3NhdF9vcHNbMF0sCi0gICYgc2ZtdF9jbXB6X29wc1swXSwKLSAgJiBzZm10X3NhZGRfb3BzWzBdLAotICAmIHNmbXRfbWFjd3UxX29wc1swXSwKLSAgJiBzZm10X21hY2hpX29wc1swXSwKLSAgJiBzZm10X211bHd1MV9vcHNbMF0sCi0gICYgc2ZtdF9tYWN3dTFfb3BzWzBdLAotICAmIHNmbXRfc2Nfb3BzWzBdLAotICAmIHNmbXRfc2Nfb3BzWzBdLAotfTsKLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUuICAqLwotCi12b2lkCi1tMzJyX2NnZW5faW5pdF9vcGluc3RfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9PUElOU1QgKipvaSA9ICYgbTMycl9jZ2VuX29waW5zdF90YWJsZVswXTsKLSAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05TOyArK2kpCi0gICAgaW5zbnNbaV0ub3BpbnN0ID0gb2lbaV07Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL202OGstZGlzLmMgYi9vcGNvZGVzL202OGstZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZDNhODIxLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTY4ay1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMDggKzAsMCBAQAotLyogUHJpbnQgTW90b3JvbGEgNjhrIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAxOTg2LCA4NywgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiZmxvYXRmb3JtYXQuaCIKLSNpbmNsdWRlIDxsaWJpYmVydHkuaD4KLSNpbmNsdWRlICJvcGludGwuaCIKLQotI2luY2x1ZGUgIm9wY29kZS9tNjhrLmgiCi0KLS8qIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfYnl0ZSAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1teV9wcmludF9hZGRyZXNzIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGludAotZmV0Y2hfYXJnIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYmFzZSBQQVJBTVMgKChpbnQsIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXByaW50X2luZGV4ZWQgUEFSQU1TICgoaW50LCB1bnNpZ25lZCBjaGFyICosIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyZyBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLAotCQkJYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLUNPTlNUIGNoYXIgKiBDT05TVCBmcGNyX25hbWVzW10gPSB7Ci0gICIiLCAiJWZwaWFyIiwgIiVmcHNyIiwgIiVmcGlhci8lZnBzciIsICIlZnBjciIsCi0gICIlZnBpYXIvJWZwY3IiLCAiJWZwc3IvJWZwY3IiLCAiJWZwaWFyLyVmcHNyLyVmcGNyIn07Ci0KLXN0YXRpYyBjaGFyICpjb25zdCByZWdfbmFtZXNbXSA9IHsKLSAgIiVkMCIsICIlZDEiLCAiJWQyIiwgIiVkMyIsICIlZDQiLCAiJWQ1IiwgIiVkNiIsICIlZDciLAotICAiJWEwIiwgIiVhMSIsICIlYTIiLCAiJWEzIiwgIiVhNCIsICIlYTUiLCAiJWZwIiwgIiVzcCIsCi0gICIlcHMiLCAiJXBjIn07Ci0KLS8qIFNpZ24tZXh0ZW5kIGFuICh1bnNpZ25lZCBjaGFyKS4gKi8KLSNpZiBfX1NURENfXyA9PSAxCi0jZGVmaW5lIENPRVJDRV9TSUdORURfQ0hBUihjaCkgKChzaWduZWQgY2hhcikoY2gpKQotI2Vsc2UKLSNkZWZpbmUgQ09FUkNFX1NJR05FRF9DSEFSKGNoKSAoKGludCkoKChjaCkgXiAweDgwKSAmIDB4RkYpIC0gMTI4KQotI2VuZGlmCi0KLS8qIEdldCBhIDEgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIE5FWFRCWVRFKHApICAocCArPSAyLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgQ09FUkNFX1NJR05FRF9DSEFSKHBbLTFdKSkKLQotLyogR2V0IGEgMiBieXRlIHNpZ25lZCBpbnRlZ2VyLiAgKi8KLSNkZWZpbmUgQ09FUkNFMTYoeCkgKChpbnQpICgoKHgpIF4gMHg4MDAwKSAtIDB4ODAwMCkpCi0jZGVmaW5lIE5FWFRXT1JEKHApICBcCi0gIChwICs9IDIsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICBDT0VSQ0UxNiAoKHBbLTJdIDw8IDgpICsgcFstMV0pKQotCi0vKiBHZXQgYSA0IGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBDT0VSQ0UzMih4KSAoKGJmZF9zaWduZWRfdm1hKSAoKHgpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKQotI2RlZmluZSBORVhUTE9ORyhwKSAgXAotICAocCArPSA0LCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICAgKENPRVJDRTMyICgoKCgoKHBbLTRdIDw8IDgpICsgcFstM10pIDw8IDgpICsgcFstMl0pIDw8IDgpICsgcFstMV0pKSkKLQotLyogR2V0IGEgNCBieXRlIHVuc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBORVhUVUxPTkcocCkgIFwKLSAgKHAgKz0gNCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgICh1bnNpZ25lZCBpbnQpICgoKCgoKHBbLTRdIDw8IDgpICsgcFstM10pIDw8IDgpICsgcFstMl0pIDw8IDgpICsgcFstMV0pKQotCi0vKiBHZXQgYSBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0LiAgKi8KLSNkZWZpbmUgTkVYVFNJTkdMRSh2YWwsIHApIFwKLSAgKHAgKz0gNCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X2llZWVfc2luZ2xlX2JpZywgKGNoYXIgKikgcCAtIDQsICZ2YWwpKQotCi0vKiBHZXQgYSBkb3VibGUgcHJlY2lzaW9uIGZsb2F0LiAgKi8KLSNkZWZpbmUgTkVYVERPVUJMRSh2YWwsIHApIFwKLSAgKHAgKz0gOCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZywgKGNoYXIgKikgcCAtIDgsICZ2YWwpKQotCi0vKiBHZXQgYW4gZXh0ZW5kZWQgcHJlY2lzaW9uIGZsb2F0LiAgKi8KLSNkZWZpbmUgTkVYVEVYVEVORCh2YWwsIHApIFwKLSAgKHAgKz0gMTIsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9tNjg4ODFfZXh0LCAoY2hhciAqKSBwIC0gMTIsICZ2YWwpKQotCi0vKiBOZWVkIGEgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIHBhY2tlZCB0byBkb3VibGUKLSAgIHByZWNpc2lvbi4gICBBY3R1YWxseSwgaXQncyBlYXNpZXIgdG8gcHJpbnQgYQotICAgcGFja2VkIG51bWJlciB0aGFuIGEgZG91YmxlIGFueXdheSwgc28gbWF5YmUKLSAgIHRoZXJlIHNob3VsZCBiZSBhIHNwZWNpYWwgY2FzZSB0byBoYW5kbGUgdGhpcy4uLiAqLwotI2RlZmluZSBORVhUUEFDS0VEKHApIFwKLSAgKHAgKz0gMTIsIEZFVENIX0RBVEEgKGluZm8sIHApLCAwLjApCi0KLQwKLS8qIE1heGltdW0gbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDIyCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotc3RydWN0IHByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0vKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+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+bmV4dCA9IGhhc2h0YWJsZVtpXTsKLSAgaGFzaHRhYmxlW2ldID0gaW5zdHB0cjsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbWFrZWZpbGUudm1zIGIvb3Bjb2Rlcy9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODcwNDguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBsaWJvcGNvZGVzIHVuZGVyIG9wZW5WTVMgVkFYIGFuZCBBbHBoYQotIwotIyBGb3IgdXNlIHdpdGggZ251LW1ha2UgZm9yIHZtcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiwga2thZW1wZkBwcm9naXMuZGUKLSMKLSMKLWlmZXEgKCQoQVJDSCksYWxwaGEpCi1PQkpTPWFscGhhLWRpcy5vYmosYWxwaGEtb3BjLm9iaixkaXMtYnVmLm9iaixkaXNhc3NlbWJsZS5vYmoKLUZPUk1BVD1PQkpfRVZBWAotQVJDSERFRj0iQVJDSF9hbHBoYSIKLWVsc2UKLU9CSlM9dmF4LWRpcy5vYmosZGlzLWJ1Zi5vYmosZGlzYXNzZW1ibGUub2JqCi1GT1JNQVQ9T0JKX1ZBWAotQVJDSERFRj0iQVJDSF92YXgiCi1lbmRpZgotCi1pZmVxICgkKENDKSxnY2MpCi1ERUZTPS9kZWZpbmU9KCQoRk9STUFUKSkKLUNGTEFHUz0vaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0sWy0uYmZkXSkkKERFRlMpCi1lbHNlCi1ERUZTPS9kZWZpbmU9KCQoRk9STUFUKSwiY29uc3Q9IikKLUNGTEFHUz0vbm9vcHQvZGVidWcvaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0sWy0uYmZkXSkkKERFRlMpXAotL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLGxvbmdleHRlcm4pCi1lbmRpZgotCi1saWJvcGNvZGVzLm9sYjogc3lzZGVwLmggJChPQkpTKQotCXB1cmdlCi0JbGliL2NyZWF0ZSBsaWJvcGNvZGVzICoub2JqCi0KLWRpc2Fzc2VtYmxlLm9iajogZGlzYXNzZW1ibGUuYwotCSQoQ0MpJChDRkxBR1MpL2RlZmluZT0oJChBUkNIREVGKSkgJDwKLQotc3lzZGVwLmg6IFstLmJmZC5ob3N0c10kKEFSQ0gpdm1zLmgKLQkkKENQKSAkPCAkQAotCi1jbGVhbjoKLQkkJCBwdXJnZQotCSQoUk0pICoub2JqOwotCSQoUk0pIHN5c2RlcC5oOwotCSQoUk0pIGxpYm9wY29kZXMub2xiOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tY29yZS1kaXMuYyBiL29wY29kZXMvbWNvcmUtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5M2RlNjguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tY29yZS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBNb3Rvcm9sbGEgTSpDb3JlIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIFNUQVRJQ19UQUJMRQotI2RlZmluZSBERUZJTkVfVEFCTEUKLQotI2luY2x1ZGUgIm1jb3JlLW9wYy5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotLyogTWFzayBmb3IgZWFjaCBtY29yZV9vcGNsYXNzOiAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGltc2tbXSA9Ci17Ci0gICAgLyogTzAgICovIDB4RkZGRiwKLSAgICAvKiBPVCAgKi8gMHhGRkZDLAotICAgIC8qIE8xICAqLyAweEZGRjAsCi0gICAgLyogT0MgICovIDB4RkZFMCwKLSAgICAvKiBPMiAgKi8gMHhGRjAwLAotICAgIC8qIFgxICAqLyAweEZGRjAsCi0gICAgLyogT0kgICovIDB4RkUwMCwKLSAgICAvKiBPQiAgKi8gMHhGRTAwLAotCSAgICAgIAotICAgIC8qIE9NYSAqLyAweEZGRjAsCi0gICAgLyogU0kgICovIDB4RkUwMCwKLSAgICAvKiBJNyAgKi8gMHhGODAwLAotICAgIC8qIExTICAqLyAweEYwMDAsCi0gICAgLyogQlIgICovIDB4RjgwMCwKLSAgICAvKiBCTCAgKi8gMHhGRjAwLAotICAgIC8qIExSICAqLyAweEYwMDAsCi0gICAgLyogTEogICovIDB4RkYwMCwKLQkgICAgICAKLSAgICAvKiBSTSAgKi8gMHhGRkYwLAotICAgIC8qIFJRICAqLyAweEZGRjAsCi0gICAgLyogSlNSICovIDB4RkZGMCwKLSAgICAvKiBKTVAgKi8gMHhGRkYwLAotICAgIC8qIE9CUmEqLyAweEZGRjAsCi0gICAgLyogT0JSYiovIDB4RkY4MCwKLSAgICAvKiBPQlJjKi8gMHhGRjAwLAotICAgIC8qIE9CUjIqLyAweEZFMDAsCi0JICAgICAgCi0gICAgLyogTzFSMSovIDB4RkZGMCwKLSAgICAvKiBPTWIgKi8gMHhGRjgwLAotICAgIC8qIE9NYyAqLyAweEZGMDAsCi0gICAgLyogU0lhICovIDB4RkUwMCwKLQotICAgIC8qIEpDICAqLyAwLAkJLyogSkMsSlUsSkwgZG9uJ3QgYXBwZWFyIGluIG9iamVjdCAqLwotICAgIC8qIEpVICAqLyAwLAotICAgIC8qIEpMICAqLyAwLAotICAgIC8qIFJTSSAqLyAwLAotICAgIC8qIERPMjEqLyAwLAotICAgIC8qIE9CMiAqLyAwIAkJLyogT0IyIHdvbid0IGFwcGVhciBpbiBvYmplY3QuICovCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGdybmFtZVtdID0KLXsKLSAicjAiLCAgInIxIiwgICJyMiIsICAicjMiLCAgInI0IiwgICJyNSIsICAicjYiLCAgInI3IiwKLSAicjgiLCAgInI5IiwgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgWFtdID0gIj8/IjsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjcm5hbWVbXSA9Ci17Ci0gICJwc3IiLCAgInZiciIsICJlcHNyIiwgImZwc3IiLCAiZXBjIiwgICJmcGMiLCAgInNzMCIsICAic3MxIiwKLSAgInNzMiIsICAic3MzIiwgInNzNCIsICAiZ2NyIiwgICJnc3IiLCAgICAgWCwgICAgICBYLCAgICAgIFgsCi0gICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgIFgsICAgICAgWCwgICAgICBYLAotICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICBYLCAgICAgIFgsICAgICAgWAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGlzaXpbXSA9IHsgMiwgMCwgMSwgMCB9OwotCi1pbnQgCi1wcmludF9pbnNuX21jb3JlIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLXsKLSAgdW5zaWduZWQgY2hhciAgICAgICBpYnl0ZXNbNF07Ci0gIGZwcmludGZfZnR5cGUgICAgICAgZnByaW50ZiA9IGluZm8tPmZwcmludGZfZnVuYzsKLSAgdm9pZCAqICAgICAgICAgICAgICBzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIHVuc2lnbmVkIHNob3J0ICAgICAgaW5zdDsKLSAgbWNvcmVfb3Bjb2RlX2luZm8gKiBvcDsKLSAgaW50ICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gMjsKLQotICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyLCBpYnl0ZXMsIDIsIGluZm8pOwotCi0gIGlmIChzdGF0dXMgIT0gMCkgCi0gICAgewotICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaW5zdCA9IChpYnl0ZXNbMF0gPDwgOCkgfCBpYnl0ZXNbMV07Ci0KLSAgLyogSnVzdCBhIGxpbmVhciBzZWFyY2ggb2YgdGhlIHRhYmxlLiAgKi8KLSAgZm9yIChvcCA9IG1jb3JlX3RhYmxlOyBvcC0+bmFtZSAhPSAwOyBvcCArKykKLSAgICBpZiAob3AtPmluc3QgPT0gKGluc3QgJiBpbXNrW29wLT5vcGNsYXNzXSkpCi0gICAgICBicmVhazsKLQotICBpZiAob3AtPm5hbWUgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sICIuc2hvcnQgMHglMDR4IiwgaW5zdCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICogbmFtZSA9IGdybmFtZVtpbnN0ICYgMHgwRl07Ci0gICAgICAKLSAgICAgIGZwcmludGYgKHN0cmVhbSwgIiVzIiwgb3AtPm5hbWUpOwotICAgICAgCi0gICAgICBzd2l0Y2ggKG9wLT5vcGNsYXNzKQotCXsKLQljYXNlIE8wOiBicmVhazsKLQljYXNlIE9UOiBmcHJpbnRmIChzdHJlYW0sICJcdCVkIiwgaW5zdCAmIDB4Myk7IGJyZWFrOwotCWNhc2UgTzE6Ci0JY2FzZSBKTVA6Ci0JY2FzZSBKU1I6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMiLCBuYW1lKTsgYnJlYWs7Ci0JY2FzZSBPQzogIGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICVzIiwgbmFtZSwgY3JuYW1lWyhpbnN0ID4+IDQpICYgMHgxRl0pOyBicmVhazsKLQljYXNlIE8xUjE6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsIHIxIiwgbmFtZSk7IGJyZWFrOwotCWNhc2UgTzI6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICVzIiwgbmFtZSwgZ3JuYW1lWyhpbnN0ID4+IDQpICYgMHhGXSk7IGJyZWFrOwotCWNhc2UgWDE6IGZwcmludGYgKHN0cmVhbSwgIlx0cjEsICVzIiwgbmFtZSk7IGJyZWFrOwotCWNhc2UgT0k6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICVkIiwgbmFtZSwgKChpbnN0ID4+IDQpICYgMHgxRikgKyAxKTsgYnJlYWs7Ci0JY2FzZSBSTTogZnByaW50ZiAoc3RyZWFtLCAiXHQlcy1yMTUsIChyMCkiLCBuYW1lKTsgYnJlYWs7Ci0JY2FzZSBSUTogZnByaW50ZiAoc3RyZWFtLCAiXHRyNC1yNywgKCVzKSIsIG5hbWUpOyBicmVhazsKLQljYXNlIE9COgotCWNhc2UgT0JSYToKLQljYXNlIE9CUmI6Ci0JY2FzZSBPQlJjOgotCWNhc2UgU0k6Ci0JY2FzZSBTSWE6Ci0JY2FzZSBPTWE6Ci0JY2FzZSBPTWI6Ci0JY2FzZSBPTWM6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICVkIiwgbmFtZSwgKGluc3QgPj4gNCkgJiAweDFGKTsgYnJlYWs7Ci0JY2FzZSBJNzogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgJWQiLCBuYW1lLCAoaW5zdCA+PiA0KSAmIDB4N0YpOyBicmVhazsKLQljYXNlIExTOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAoJXMsICVkKSIsIGdybmFtZVsoaW5zdCA+PiA4KSAmIDB4Rl0sCi0JCQkgIG5hbWUsICgoaW5zdCA+PiA0KSAmIDB4RikgPDwgaXNpelsoaW5zdCA+PiAxMykgJiAzXSk7Ci0JICBicmVhazsKLQkgIAotCWNhc2UgQlI6Ci0JICB7Ci0JICAgIGxvbmcgdmFsID0gaW5zdCAmIDB4M0ZGOwotCSAgICAKLQkgICAgaWYgKGluc3QgJiAweDQwMCkKLQkgICAgICB2YWwgfD0gMHhGRkZGRkMwMDsKLQkgICAgCi0JICAgIGZwcmludGYgKHN0cmVhbSwgIlx0MHgleCIsIG1lbWFkZHIgKyAyICsgKHZhbDw8MSkpOwotCSAgICAKLQkgICAgaWYgKHN0cmNtcCAob3AtPm5hbWUsICJic3IiKSA9PSAwKQotCSAgICAgIHsKLQkJLyogZm9yIGJzciwgd2UnbGwgdHJ5IHRvIGdldCBhIHN5bWJvbCBmb3IgdGhlIHRhcmdldCAqLwotCQl2YWwgPSBtZW1hZGRyICsgMiArICh2YWwgPDwgMSk7Ci0JCQotCQlpZiAoaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICYmIHZhbCAhPSAwKQotCQkgIHsKLQkJICAgIGZwcmludGYgKHN0cmVhbSwgIlx0Ly8gIik7Ci0JCSAgICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKHZhbCwgaW5mbyk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBCTDoKLQkgIHsKLQkgICAgbG9uZyB2YWw7Ci0JICAgIHZhbCA9IChpbnN0ICYgMHgwMDBGKTsKLQkgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgMHgleCIsCi0JCSAgICBncm5hbWVbKGluc3QgPj4gNCkgJiAweEZdLCBtZW1hZGRyIC0gKHZhbCA8PCAxKSk7Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgTFI6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgICAKLQkgICAgdmFsID0gKG1lbWFkZHIgKyAyICsgKChpbnN0ICYgMHhGRikgPDwgMikpICYgMHhGRkZGRkZGQzsKLQkgICAgCi0JICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKHZhbCwgaWJ5dGVzLCA0LCBpbmZvKTsKLQkgICAgaWYgKHN0YXR1cyAhPSAwKSAKLQkgICAgICB7Ci0JCWluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIAotCSAgICAgIHZhbCA9IChpYnl0ZXNbMF0gPDwgMjQpIHwgKGlieXRlc1sxXSA8PCAxNikKLQkJfCAoaWJ5dGVzWzJdIDw8IDgpIHwgKGlieXRlc1szXSk7Ci0JICAgIAotCSAgICAvKiBSZW1vdmVkIFtdIGFyb3VuZCBsaXRlcmFsIHZhbHVlIHRvIG1hdGNoIEFCSSBzeW50YXggMTIvOTUuICAqLwotCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAweCVYIiwgZ3JuYW1lWyhpbnN0ID4+IDgpICYgMHhGXSwgdmFsKTsKLQotCSAgICBpZiAodmFsID09IDApCi0JICAgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQvLyBmcm9tIGFkZHJlc3MgcG9vbCBhdCAweCV4IiwKLQkJICAgICAgIChtZW1hZGRyICsgMiArICgoaW5zdCAmIDB4RkYpIDw8IDIpKSAmIDB4RkZGRkZGRkMpOwotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQljYXNlIExKOgotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgICAgCi0JICAgIHZhbCA9IChtZW1hZGRyICsgMiArICgoaW5zdCAmIDB4RkYpIDw8IDIpKSAmIDB4RkZGRkZGRkM7Ci0JICAgIAotCSAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jICh2YWwsIGlieXRlcywgNCwgaW5mbyk7Ci0JICAgIGlmIChzdGF0dXMgIT0gMCkgCi0JICAgICAgewotCQlpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgICAgdmFsID0gKGlieXRlc1swXSA8PCAyNCkgfCAoaWJ5dGVzWzFdIDw8IDE2KQotCQl8IChpYnl0ZXNbMl0gPDwgOCkgfCAoaWJ5dGVzWzNdKTsKLQkgICAgCi0JICAgIC8qIFJlbW92ZWQgW10gYXJvdW5kIGxpdGVyYWwgdmFsdWUgdG8gbWF0Y2ggQUJJIHN5bnRheCAxMi85NS4gICovCi0JICAgIGZwcmludGYgKHN0cmVhbSwgIlx0MHglWCIsIHZhbCk7Ci0JICAgIC8qIEZvciBqbXBpL2pzcmksIHdlJ2xsIHRyeSB0byBnZXQgYSBzeW1ib2wgZm9yIHRoZSB0YXJnZXQuICAqLwotCSAgICBpZiAoaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICYmIHZhbCAhPSAwKQotCSAgICAgIHsKLQkJZnByaW50ZiAoc3RyZWFtLCAiXHQvLyAiKTsKLQkJaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICh2YWwsIGluZm8pOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZnByaW50ZiAoc3RyZWFtLCAiXHQvLyBmcm9tIGFkZHJlc3MgcG9vbCBhdCAweCV4IiwKLQkJCSAobWVtYWRkciArIDIgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDKTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWRlZmF1bHQ6Ci0JICAvKiBpZiB0aGUgZGlzYXNzZW1ibGVyIGxhZ3MgdGhlIGluc3RydWN0aW9uIHNldCAqLwotCSAgZnByaW50ZiAoc3RyZWFtLCAiXHR1bmRlY29kZWQgb3BlcmFuZHMsIGluc3QgaXMgMHglMDR4IiwgaW5zdCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICAKLSAgLyogU2F5IGhvdyBtYW55IGJ5dGVzIHdlIGNvbnN1bWVkPyAqLwotICByZXR1cm4gMjsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbWNvcmUtb3BjLmggYi9vcGNvZGVzL21jb3JlLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDZiYTg0Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWNvcmUtb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyogQXNzZW1ibGVyIGluc3RydWN0aW9ucyBmb3IgTW90b3JvbGxhJ3MgTWNvcmUgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLXR5cGVkZWYgZW51bQotewotICBPMCwgICAgT1QsICAgTzEsICAgT0MsICAgTzIsICAgIFgxLCAgICBPSSwgICAgT0IsCi0gIE9NYSwgICBTSSwgICBJNywgICBMUywgICBCUiwgICAgQkwsICAgIExSLCAgICBMSiwKLSAgUk0sICAgIFJRLCAgIEpTUiwgIEpNUCwgIE9CUmEsICBPQlJiLCAgT0JSYywgIE9CUjIsCi0gIE8xUjEsICBPTWIsICBPTWMsICBTSWEsCi0gIEpDLCAgICBKVSwgICBKTCwgICBSU0ksICBETzIxLCAgT0IyCi19Ci1tY29yZV9vcGNsYXNzOwotCi10eXBlZGVmIHN0cnVjdCBpbnN0Ci17Ci0gIGNoYXIgKiAgICAgICAgIG5hbWU7Ci0gIG1jb3JlX29wY2xhc3MgIG9wY2xhc3M7Ci0gIHVuc2lnbmVkIGNoYXIgIHRyYW5zZmVyOwotICB1bnNpZ25lZCBzaG9ydCBpbnN0OwotfQotbWNvcmVfb3Bjb2RlX2luZm87Ci0KLSNpZmRlZiBERUZJTkVfVEFCTEUKLW1jb3JlX29wY29kZV9pbmZvIG1jb3JlX3RhYmxlW10gPQotewotICB7ICJia3B0IiwJTzAsCTAsCTB4MDAwMCB9LAotICB7ICJzeW5jIiwJTzAsCTAsCTB4MDAwMSB9LAotICB7ICJydGUiLAlPMCwJMSwJMHgwMDAyIH0sCi0gIHsgInJmZSIsCU8wLAkxLAkweDAwMDIgfSwKLSAgeyAicmZpIiwJTzAsCTEsCTB4MDAwMyB9LAotICB7ICJzdG9wIiwJTzAsCTAsCTB4MDAwNCB9LAotICB7ICJ3YWl0IiwJTzAsCTAsCTB4MDAwNSB9LAotICB7ICJkb3plIiwJTzAsCTAsCTB4MDAwNiB9LAotICB7ICJ0cmFwIiwJT1QsCTAsCTB4MDAwOCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDAwMEMgLSAweDAwMEYgKi8KLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwIC0gMHgwMDFGICovCi0gIHsgIm12YyIsCU8xLAkwLAkweDAwMjAgfSwKLSAgeyAibXZjdiIsCU8xLAkwLAkweDAwMzAgfSwKLSAgeyAibGRxIiwJUlEsCTAsCTB4MDA0MCB9LAotICB7ICJzdHEiLAlSUSwJMCwJMHgwMDUwIH0sCi0gIHsgImxkbSIsCVJNLAkwLAkweDAwNjAgfSwKLSAgeyAic3RtIiwJUk0sCTAsCTB4MDA3MCB9LAotICB7ICJkZWN0IiwJTzEsCTAsCTB4MDA4MCB9LAotICB7ICJkZWNmIiwJTzEsCTAsCTB4MDA5MCB9LAotICB7ICJpbmN0IiwJTzEsCTAsCTB4MDBBMCB9LAotICB7ICJpbmNmIiwJTzEsCTAsCTB4MDBCMCB9LAotICB7ICJqbXAiLAlKTVAsCTIsCTB4MDBDMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0pNUAkweDAwQzAKLSAgeyAianNyIiwJSlNSLAkwLAkweDAwRDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9KU1IJMHgwMEUwCi0gIHsgImZmMSIsCU8xLAkwLAkweDAwRTAgfSwKLSAgeyAiYnJldiIsCU8xLAkwLAkweDAwRjAgfSwKLSAgeyAieHRyYjMiLAlYMSwJMCwJMHgwMTAwIH0sCi0gIHsgInh0cmIyIiwJWDEsCTAsCTB4MDExMCB9LAotICB7ICJ4dHJiMSIsCVgxLAkwLAkweDAxMjAgfSwKLSAgeyAieHRyYjAiLAlYMSwJMCwJMHgwMTMwIH0sCi0gIHsgInpleHRiIiwJTzEsCTAsCTB4MDE0MCB9LAotICB7ICJzZXh0YiIsCU8xLAkwLAkweDAxNTAgfSwKLSAgeyAiemV4dGgiLAlPMSwJMCwJMHgwMTYwIH0sCi0gIHsgInNleHRoIiwJTzEsCTAsCTB4MDE3MCB9LAotICB7ICJkZWNsdCIsCU8xLAkwLAkweDAxODAgfSwKLSAgeyAidHN0bmJ6IiwJTzEsCTAsCTB4MDE5MCB9LAotICB7ICJkZWNndCIsCU8xLAkwLAkweDAxQTAgfSwKLSAgeyAiZGVjbmUiLAlPMSwJMCwJMHgwMUIwIH0sCi0gIHsgImNscnQiLAlPMSwJMCwJMHgwMUMwIH0sCi0gIHsgImNscmYiLAlPMSwJMCwJMHgwMUQwIH0sCi0gIHsgImFicyIsCU8xLAkwLAkweDAxRTAgfSwKLSAgeyAibm90IiwJTzEsCTAsCTB4MDFGMCB9LAotICB7ICJtb3Z0IiwJTzIsCTAsCTB4MDIwMCB9LAotICB7ICJtdWx0IiwJTzIsCTAsCTB4MDMwMCB9LAotICB7ICJsb29wdCIsCUJMLAkwLAkweDA0MDAgfSwKLSAgeyAic3VidSIsCU8yLAkwLAkweDA1MDAgfSwKLSAgeyAic3ViIiwJTzIsCTAsCTB4MDUwMCB9LCAvKiBPZmZpY2lhbCBhbGlhcy4gICovCi0gIHsgImFkZGMiLAlPMiwJMCwJMHgwNjAwIH0sCi0gIHsgInN1YmMiLAlPMiwJMCwJMHgwNzAwIH0sCi0vKiBTUEFDRTogMHgwODAwLTB4MDhmZiBmb3IgYSBkaWFkaWMgb3BlcmF0aW9uICovCi0vKiBTUEFDRTogMHgwOTAwLTB4MDlmZiBmb3IgYSBkaWFkaWMgb3BlcmF0aW9uICovCi0gIHsgIm1vdmYiLAlPMiwJMCwJMHgwQTAwIH0sCi0gIHsgImxzciIsCU8yLAkwLAkweDBCMDAgfSwKLSAgeyAiY21waHMiLAlPMiwJMCwJMHgwQzAwIH0sCi0gIHsgImNtcGx0IiwJTzIsCTAsCTB4MEQwMCB9LAotICB7ICJ0c3QiLAlPMiwJMCwJMHgwRTAwIH0sCi0gIHsgImNtcG5lIiwJTzIsCTAsCTB4MEYwMCB9LAotICB7ICJtZmNyIiwJT0MsCTAsCTB4MTAwMCB9LAotICB7ICJtb3YiLAlPMiwJMCwJMHgxMjAwIH0sCi0gIHsgImJnZW5yIiwJTzIsCTAsCTB4MTMwMCB9LAotICB7ICJyc3ViIiwJTzIsCTAsCTB4MTQwMCB9LAotICB7ICJpeHciLAlPMiwJMCwJMHgxNTAwIH0sCi0gIHsgImFuZCIsCU8yLAkwLAkweDE2MDAgfSwKLSAgeyAieG9yIiwJTzIsCTAsCTB4MTcwMCB9LAotICB7ICJtdGNyIiwJT0MsCTAsCTB4MTgwMCB9LAotICB7ICJhc3IiLAlPMiwJMCwJMHgxQTAwIH0sCi0gIHsgImxzbCIsCU8yLAkwLAkweDFCMDAgfSwKLSAgeyAiYWRkdSIsCU8yLAkwLAkweDFDMDAgfSwKLSAgeyAiaXhoIiwJTzIsCTAsCTB4MUQwMCB9LAotICB7ICJvciIsCU8yLAkwLAkweDFFMDAgfSwKLSAgeyAiYW5kbiIsCU8yLAkwLAkweDFGMDAgfSwKLSAgeyAiYWRkaSIsCU9JLAkwLAkweDIwMDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9BRERJCTB4MjAwMAotICB7ICJjbXBsdGkiLAlPSSwJMCwJMHgyMjAwIH0sCi0gIHsgInN1YmkiLAlPSSwJMCwJMHgyNDAwIH0sCi0vKiBTUEFDRTogMHgyNjAwLTB4MjdmZiBvcGVuIGZvciBhIHJlZ2lzdGVyK2ltbWVkaWF0ZSAgb3BlcmF0aW9uICovCi0gIHsgInJzdWJpIiwJT0IsCTAsCTB4MjgwMCB9LAotICB7ICJjbXBuZWkiLAlPQiwJMCwJMHgyQTAwIH0sCi0gIHsgImJtYXNraSIsCU9NYSwJMCwJMHgyQzAwIH0sCi0gIHsgImRpdnUiLAlPMVIxLAkwLAkweDJDMTAgfSwKLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHgyYzIwIC0gMHgyYzdmICovICAKLSAgeyAiYm1hc2tpIiwJT01iLAkwLAkweDJDODAgfSwKLSAgeyAiYm1hc2tpIiwJT01jLAkwLAkweDJEMDAgfSwKLSAgeyAiYW5kaSIsCU9CLAkwLAkweDJFMDAgfSwKLSAgeyAiYmNscmkiLAlPQiwJMCwJMHgzMDAwIH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MzIwMCAtIDB4MzIwZiAqLwotICB7ICJkaXZzIiwJTzFSMSwJMCwJMHgzMjEwIH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MzIyMCAtIDB4MzI2ZiAqLyAgCi0gIHsgImJnZW5pIiwJT0JSYSwJMCwJMHgzMjcwIH0sCi0gIHsgImJnZW5pIiwJT0JSYiwJMCwJMHgzMjgwIH0sCi0gIHsgImJnZW5pIiwJT0JSYywJMCwJMHgzMzAwIH0sCi0gIHsgImJzZXRpIiwJT0IsCTAsCTB4MzQwMCB9LAotICB7ICJidHN0aSIsCU9CLAkwLAkweDM2MDAgfSwKLSAgeyAieHNyIiwJTzEsCTAsCTB4MzgwMCB9LAotICB7ICJyb3RsaSIsCVNJYSwJMCwJMHgzODAwIH0sCi0gIHsgImFzcmMiLAlPMSwJMCwJMHgzQTAwIH0sCi0gIHsgImFzcmkiLAlTSWEsCTAsCTB4M0EwMCB9LAotICB7ICJsc2xjIiwJTzEsCTAsCTB4M0MwMCB9LAotICB7ICJsc2xpIiwJU0lhLAkwLAkweDNDMDAgfSwKLSAgeyAibHNyYyIsCU8xLAkwLAkweDNFMDAgfSwKLSAgeyAibHNyaSIsCVNJYSwJMCwJMHgzRTAwIH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAtIDB4NWZmZiAqLwotICB7ICJtb3ZpIiwJSTcsCTAsCTB4NjAwMCB9LAotI2RlZmluZSBNQ09SRV9JTlNUX0JNQVNLSV9BTFQJMHg2MDAwCi0jZGVmaW5lIE1DT1JFX0lOU1RfQkdFTklfQUxUCTB4NjAwMAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDY5MDAgLSAweDZGRkYgKi8KLSAgeyAiam1waSIsCUxKLAkxLAkweDcwMDAgfSwKLSAgeyAianNyaSIsCUxKLAkwLAkweDdGMDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9KTVBJCTB4NzAwMAotICB7ICJscnciLAlMUiwJMCwJMHg3MDAwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfSlNSSQkweDdGMDAKLSAgeyAibGQiLAlMUywJMCwJMHg4MDAwIH0sCi0gIHsgImxkdyIsCUxTLAkwLAkweDgwMDAgfSwKLSAgeyAibGQudyIsCUxTLAkwLAkweDgwMDAgfSwKLSAgeyAic3QiLAlMUywJMCwJMHg5MDAwIH0sCi0gIHsgInN0dyIsCUxTLAkwLAkweDkwMDAgfSwKLSAgeyAic3QudyIsCUxTLAkwLAkweDkwMDAgfSwKLSAgeyAibGRiIiwJTFMsCTAsCTB4QTAwMCB9LAotICB7ICJsZC5iIiwJTFMsCTAsCTB4QTAwMCB9LAotICB7ICJzdGIiLAlMUywJMCwJMHhCMDAwIH0sCi0gIHsgInN0LmIiLAlMUywJMCwJMHhCMDAwIH0sCi0gIHsgImxkaCIsCUxTLAkwLAkweEMwMDAgfSwKLSAgeyAibGQuaCIsCUxTLAkwLAkweEMwMDAgfSwKLSAgeyAic3RoIiwJTFMsCTAsCTB4RDAwMCB9LAotICB7ICJzdC5oIiwJTFMsCTAsCTB4RDAwMCB9LAotICB7ICJidCIsCUJSLAkwLAkweEUwMDAgfSwKLSAgeyAiYmYiLAlCUiwJMCwJMHhFODAwIH0sCi0gIHsgImJyIiwJQlIsCTEsCTB4RjAwMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0JSCTB4RjAwMAotICB7ICJic3IiLAlCUiwJMCwJMHhGODAwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfQlNSCTB4RjgwMAotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSByZWxheGFibGUgYnJhbmNoZXMgKi8KLSAgeyAiamJ0IiwJSkMsCTAsCTB4RTAwMCB9LAotICB7ICJqYmYiLAlKQywJMCwJMHhFODAwIH0sCi0gIHsgImpiciIsCUpVLAkxLAkweEYwMDAgfSwKLSAgeyAiamJzciIsCUpMLAkwLAkweEY4MDAgfSwKLQotLyogVGhlIGZvbGxvd2luZyBhcmUgYWxpYXNlcyBmb3Igb3RoZXIgaW5zdHJ1Y3Rpb25zICovCi0gIHsgInJ0cyIsCU8wLAkyLAkweDAwQ0YgfSwgIC8qIGptcCByMTUgKi8KLSAgeyAicm9sYyIsCURPMjEsCTAsCTB4MDYwMCB9LCAgLyogYWRkYyByZCxyZCAqLwotICB7ICJyb3RsYyIsCURPMjEsICAgMCwJMHgwNjAwIH0sICAvKiBhZGRjIHJkLHJkICovCi0gIHsgInNldGMiLAlPMCwJMCwJMHgwQzAwIH0sICAvKiBjbXBocyByMCxyMCAqLwotICB7ICJjbHJjIiwJTzAsCTAsCTB4MEYwMCB9LCAgLyogY21wbmUgcjAscjAgKi8KLSAgeyAidHN0bGUiLAlPMSwJMCwJMHgyMjAwIH0sICAvKiBjbXBsdGkgcmQsMSAqLwotICB7ICJjbXBsZWkiLAlPQiwJMCwJMHgyMjAwIH0sICAvKiBjbXBsZWkgcmQsWCAtPiBjbXBsdGkgcmQsWCsxICovCi0gIHsgIm5lZyIsCU8xLAkwLAkweDI4MDAgfSwgIC8qIHJzdWJpIHJkLDAgKi8KLSAgeyAidHN0bmUiLAlPMSwJMCwJMHgyQTAwIH0sICAvKiBjbXBuZWkgcmQsMCAqLwotICB7ICJ0c3RsdCIsCU8xLAkwLAkweDM3RjAgfSwgIC8qIGJ0c3RpIHJ4LDMxICovCi0gIHsgIm1jbHJpIiwJT0IyLAkwLAkweDMwMDAgfSwgIC8qIGJjbHJpIHJ4LGxvZzIoaW1tKSAqLwotICB7ICJtZ2VuaSIsCU9CUjIsCTAsCTB4MzIwMCB9LCAgLyogYmdlbmkgcngsbG9nMihpbW0pICovCi0gIHsgIm1zZXRpIiwJT0IyLAkwLAkweDM0MDAgfSwgIC8qIGJzZXRpIHJ4LGxvZzIoaW1tKSAqLwotICB7ICJtdHN0aSIsCU9CMiwJMCwJMHgzNjAwIH0sICAvKiBidHN0aSByeCxsb2cyKGltbSkgKi8KLSAgeyAicm9yaSIsCVJTSSwJMCwJMHgzODAwIH0sCi0gIHsgInJvdHJpIiwJUlNJLCAgICAwLAkweDM4MDAgfSwKLSAgeyAibm9wIiwJTzAsICAgICAwLAkweDEyMDAgfSwgIC8qIG1vdiByMCwgcjAgKi8KLSAgeyAwLAkJMCwJMCwgICAgICAwIH0KLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvbWlwcy1kaXMuYyBiL29wY29kZXMvbWlwcy1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiZDYyZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21pcHMtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ4ICswLDAgQEAKLS8qIFByaW50IG1pcHMgaW5zdHJ1Y3Rpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIsIG9yIGZvciBvYmpkdW1wLgotICAgQ29weXJpZ2h0IChjKSAxOTg5LCA5MS05NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE5vYnV5dWtpIEhpa2ljaGkoaGlraWNoaUBzcmEuY28uanApLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBGSVhNRTogVGhlc2UgYXJlIG5lZWRlZCB0byBmaWd1cmUgb3V0IGlmIHRoZSBjb2RlIGlzIG1pcHMxNiBvcgotICAgbm90LiBUaGUgbG93IGJpdCBvZiB0aGUgYWRkcmVzcyBpcyBvZnRlbiBhIGdvb2QgaW5kaWNhdG9yLiAgTm8KLSAgIHN5bWJvbCB0YWJsZSBpcyBhdmFpbGFibGUgd2hlbiB0aGlzIGNvZGUgcnVucyBvdXQgaW4gYW4gZW1iZWRkZWQKLSAgIHN5c3RlbSBhcyB3aGVuIGl0IGlzIHVzZWQgZm9yIGRpc2Fzc2VtYmxlciBzdXBwb3J0IGluIGEgbW9uaXRvci4gKi8KLQotI2lmICFkZWZpbmVkKEVNQkVEREVEX0VOVikKLSNkZWZpbmUgU1lNVEFCX0FWQUlMQUJMRSAxCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0jZW5kaWYKLQotc3RhdGljIGludCBwcmludF9pbnNuX21pcHMxNiBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9taXBzMTZfaW5zbl9hcmcKLSAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKiwgaW50LCBib29sZWFuLCBpbnQsIGJmZF92bWEsCi0JICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0vKiBNaXBzIGluc3RydWN0aW9ucyBhcmUgbmV2ZXIgbG9uZ2VyIHRoYW4gdGhpcyBtYW55IGJ5dGVzLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDQKLQotc3RhdGljIHZvaWQgcHJpbnRfaW5zbl9hcmcgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBiZmRfdm1hLAotCQkJCSAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgaW50IF9wcmludF9pbnNuX21pcHMgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgbG9uZyBpbnQsCi0JCQkJICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLQwKLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBnZGIgc29tZWhvdy4gICovCi0jZGVmaW5lIFJFR0lTVEVSX05BTUVTIAlcCi0gICAgewkiemVybyIsCSJhdCIsCSJ2MCIsCSJ2MSIsCSJhMCIsCSJhMSIsCSJhMiIsCSJhMyIsIFwKLQkidDAiLAkidDEiLAkidDIiLAkidDMiLAkidDQiLAkidDUiLAkidDYiLAkidDciLCBcCi0JInMwIiwJInMxIiwJInMyIiwJInMzIiwJInM0IiwJInM1IiwJInM2IiwJInM3IiwgXAotCSJ0OCIsCSJ0OSIsCSJrMCIsCSJrMSIsCSJncCIsCSJzcCIsCSJzOCIsCSJyYSIsIFwKLQkic3IiLAkibG8iLAkiaGkiLAkiYmFkIiwJImNhdXNlIiwicGMiLCAgICBcCi0JImYwIiwgICAiZjEiLCAgICJmMiIsICAgImYzIiwgICAiZjQiLCAgICJmNSIsICAgImY2IiwgICAiZjciLCBcCi0JImY4IiwgICAiZjkiLCAgICJmMTAiLCAgImYxMSIsICAiZjEyIiwgICJmMTMiLCAgImYxNCIsICAiZjE1IiwgXAotCSJmMTYiLCAgImYxNyIsICAiZjE4IiwgICJmMTkiLCAgImYyMCIsICAiZjIxIiwgICJmMjIiLCAgImYyMyIsXAotCSJmMjQiLCAgImYyNSIsICAiZjI2IiwgICJmMjciLCAgImYyOCIsICAiZjI5IiwgICJmMzAiLCAgImYzMSIsXAotCSJmc3IiLCAgImZpciIsICAiZnAiLCAgICJpbngiLCAgInJhbmQiLCAidGxibG8iLCJjdHh0IiwgInRsYmhpIixcCi0JImVwYyIsICAicHJpZCJcCi0gICAgfQotCi1zdGF0aWMgQ09OU1QgY2hhciAqIENPTlNUIHJlZ19uYW1lc1tdID0gUkVHSVNURVJfTkFNRVM7Ci0KLS8qIFRoZSBtaXBzMTYgcmVnaXN0ZXIgbmFtZXMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaXBzMTZfcmVnX25hbWVzW10gPQotewotICAiczAiLCAiczEiLCAidjAiLCAidjEiLCAiYTAiLCAiYTEiLCAiYTIiLCAiYTMiCi19OwotDAotLyogc3Vicm91dGluZSAqLwotc3RhdGljIHZvaWQKLXByaW50X2luc25fYXJnIChkLCBsLCBwYywgaW5mbykKLSAgICAgY29uc3QgY2hhciAqZDsKLSAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBpbnQgbDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBkZWx0YTsKLQotICBzd2l0Y2ggKCpkKQotICAgIHsKLSAgICBjYXNlICcsJzoKLSAgICBjYXNlICcoJzoKLSAgICBjYXNlICcpJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCAqZCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ2InOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ3YnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICByZWdfbmFtZXNbKGwgPj4gT1BfU0hfUlMpICYgT1BfTUFTS19SU10pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICBjYXNlICd3JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgcmVnX25hbWVzWyhsID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlRdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaSc6Ci0gICAgY2FzZSAndSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJKGwgPj4gT1BfU0hfSU1NRURJQVRFKSAmIE9QX01BU0tfSU1NRURJQVRFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaic6IC8qIHNhbWUgYXMgaSwgYnV0IHNpZ24tZXh0ZW5kZWQgKi8KLSAgICBjYXNlICdvJzoKLSAgICAgIGRlbHRhID0gKGwgPj4gT1BfU0hfREVMVEEpICYgT1BfTUFTS19ERUxUQTsKLSAgICAgIGlmIChkZWx0YSAmIDB4ODAwMCkKLQlkZWx0YSB8PSB+MHhmZmZmOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkgICAgIGRlbHRhKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJICAgICAodW5zaWduZWQgaW50KSAoKGwgPj4gT1BfU0hfUFJFRlgpCi0JCQkJCSAgICAgJiBPUF9NQVNLX1BSRUZYKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2snOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKHVuc2lnbmVkIGludCkgKChsID4+IE9QX1NIX0NBQ0hFKQotCQkJCQkgICAgICYgT1BfTUFTS19DQUNIRSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdhJzoKLSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCSgoKHBjICYgMHhGMDAwMDAwMCkgfCAoKChsID4+IE9QX1NIX1RBUkdFVCkgJiBPUF9NQVNLX1RBUkdFVCkgPDwgMikpLAotCSBpbmZvKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgICAvKiBzaWduIGV4dGVuZCB0aGUgZGlzcGxhY2VtZW50ICovCi0gICAgICBkZWx0YSA9IChsID4+IE9QX1NIX0RFTFRBKSAmIE9QX01BU0tfREVMVEE7Ci0gICAgICBpZiAoZGVsdGEgJiAweDgwMDApCi0JZGVsdGEgfD0gfjB4ZmZmZjsKLSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCSgoZGVsdGEgPDwgMikgKyBwYyArIDQsCi0JIGluZm8pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgcmVnX25hbWVzWyhsID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkRdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsIHJlZ19uYW1lc1swXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzwnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfU0hBTVQpICYgT1BfTUFTS19TSEFNVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2MnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfQ09ERSkgJiBPUF9NQVNLX0NPREUpOwotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgJ3EnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfQ09ERTIpICYgT1BfTUFTS19DT0RFMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0MnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfQ09QWikgJiBPUF9NQVNLX0NPUFopOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdCJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgIChsID4+IE9QX1NIX1NZU0NBTEwpICYgT1BfTUFTS19TWVNDQUxMKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6Ci0gICAgY2FzZSAnVic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9GUykgJiBPUF9NQVNLX0ZTKTsKLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlICdUJzoKLSAgICBjYXNlICdXJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGYlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0ZUKSAmIE9QX01BU0tfRlQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdEJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGYlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0ZEKSAmIE9QX01BU0tfRkQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdSJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGYlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0ZSKSAmIE9QX01BU0tfRlIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdFJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmY2MlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0JDQykgJiBPUF9NQVNLX0JDQyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ00nOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZmNjJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9DQ0MpICYgT1BfTUFTS19DQ0MpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdQJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9QRVJGUkVHKSAmIE9QX01BU0tfUEVSRlJFRyk7Ci0gICAgICBicmVhazsKLQotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwKLQkJCSAgICAgXygiIyBpbnRlcm5hbCBlcnJvciwgdW5kZWZpbmVkIG1vZGlmaWVyKCVjKSIpLAotCQkJICAgICAqZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0MCi0jaWYgU1lNVEFCX0FWQUlMQUJMRQotCi0vKiBGaWd1cmUgb3V0IHRoZSBNSVBTIElTQSBhbmQgQ1BVIGJhc2VkIG9uIHRoZSBtYWNoaW5lIG51bWJlci4KLSAgIEZJWE1FOiBXaGF0IGRvZXMgdGhpcyBoYXZlIHRvIGRvIHdpdGggU1lNVEFCX0FWQUlMQUJMRT8gICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfbWlwc19pc2FfdHlwZSAobWFjaCwgaXNhLCBjcHV0eXBlKQotICAgICBpbnQgbWFjaDsKLSAgICAgaW50ICppc2E7Ci0gICAgIGludCAqY3B1dHlwZTsKLXsKLSAgaW50IHRhcmdldF9wcm9jZXNzb3IgPSAwOwotICBpbnQgbWlwc19pc2EgPSAwOwotCi0gIHN3aXRjaCAobWFjaCkKLSAgICB7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHMzMDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSAzMDAwOwotCW1pcHNfaXNhID0gMTsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczM5MDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDM5MDA7Ci0JbWlwc19pc2EgPSAxOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDAwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDAwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDEwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0MDEwOwotCW1pcHNfaXNhID0gMjsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQxMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQxMDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDExMToKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDEwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0MzAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0MzAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQ0MDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQ0MDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDYwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDYwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjUwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0NjUwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczUwMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDUwMDA7Ci0JbWlwc19pc2EgPSA0OwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNjAwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNjAwMDsKLQltaXBzX2lzYSA9IDI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM4MDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA4MDAwOwotCW1pcHNfaXNhID0gNDsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczEwMDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSAxMDAwMDsKLQltaXBzX2lzYSA9IDQ7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHMxNjoKLQl0YXJnZXRfcHJvY2Vzc29yID0gMTY7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gMzAwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0KLSAgICB9Ci0KLSAgKmlzYSA9IG1pcHNfaXNhOwotICAqY3B1dHlwZSA9IHRhcmdldF9wcm9jZXNzb3I7Ci19Ci0KLSNlbmRpZiAvKiBTWU1UQUJfQVZBSUxBQkxFICovCi0KLS8qIFByaW50IHRoZSBtaXBzIGluc3RydWN0aW9uIGF0IGFkZHJlc3MgTUVNQUREUiBpbiBkZWJ1Z2dlZCBtZW1vcnksCi0gICBvbiB1c2luZyBJTkZPLiAgUmV0dXJucyBsZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLCBpbiBieXRlcywgd2hpY2ggaXMKLSAgIGFsd2F5cyA0LiAgQklHRU5ESUFOIG11c3QgYmUgMSBpZiB0aGlzIGlzIGJpZy1lbmRpYW4gY29kZSwgMCBpZgotICAgdGhpcyBpcyBsaXR0bGUtZW5kaWFuIGNvZGUuICAqLwotCi1zdGF0aWMgaW50Ci1fcHJpbnRfaW5zbl9taXBzIChtZW1hZGRyLCB3b3JkLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW50IHdvcmQ7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm9wOwotICBpbnQgdGFyZ2V0X3Byb2Nlc3NvciwgbWlwc19pc2E7Ci0gIHN0YXRpYyBib29sZWFuIGluaXQgPSAwOwotICBzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICptaXBzX2hhc2hbT1BfTUFTS19PUCArIDFdOwotCi0gIC8qIEJ1aWxkIGEgaGFzaCB0YWJsZSB0byBzaG9ydGVuIHRoZSBzZWFyY2ggdGltZS4gICovCi0gIGlmICghIGluaXQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPD0gT1BfTUFTS19PUDsgaSsrKQotCXsKLQkgIGZvciAob3AgPSBtaXBzX29wY29kZXM7IG9wIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXTsgb3ArKykKLQkgICAgewotCSAgICAgIGlmIChvcC0+cGluZm8gPT0gSU5TTl9NQUNSTykKLQkJY29udGludWU7Ci0JICAgICAgaWYgKGkgPT0gKChvcC0+bWF0Y2ggPj4gT1BfU0hfT1ApICYgT1BfTUFTS19PUCkpCi0JCXsKLQkJICBtaXBzX2hhc2hbaV0gPSBvcDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0gICAgICAgIH0KLQotICAgICAgaW5pdCA9IDE7Ci0gICAgfQotCi0jaWYgISBTWU1UQUJfQVZBSUxBQkxFCi0gIC8qIFRoaXMgaXMgcnVubmluZyBvdXQgb24gYSB0YXJnZXQgbWFjaGluZSwgbm90IGluIGEgaG9zdCB0b29sLgotICAgICBGSVhNRTogV2hlcmUgZG9lcyBtaXBzX3RhcmdldF9pbmZvIGNvbWUgZnJvbT8gICovCi0gIHRhcmdldF9wcm9jZXNzb3IgPSBtaXBzX3RhcmdldF9pbmZvLnByb2Nlc3NvcjsKLSAgbWlwc19pc2EgPSBtaXBzX3RhcmdldF9pbmZvLmlzYTsKLSNlbHNlICAKLSAgc2V0X21pcHNfaXNhX3R5cGUgKGluZm8tPm1hY2gsICZtaXBzX2lzYSwgJnRhcmdldF9wcm9jZXNzb3IpOwotI2VuZGlmICAKLQotICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSA0OwotICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IGluZm8tPmVuZGlhbjsKLQotICBvcCA9IG1pcHNfaGFzaFsod29yZCA+PiBPUF9TSF9PUCkgJiBPUF9NQVNLX09QXTsKLSAgaWYgKG9wICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yICg7IG9wIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXTsgb3ArKykKLQl7Ci0JICBpZiAob3AtPnBpbmZvICE9IElOU05fTUFDUk8gJiYgKHdvcmQgJiBvcC0+bWFzaykgPT0gb3AtPm1hdGNoKQotCSAgICB7Ci0JICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZDsKLQotCSAgICAgIGlmICghIE9QQ09ERV9JU19NRU1CRVIgKG9wLCBtaXBzX2lzYSwgdGFyZ2V0X3Byb2Nlc3NvcikpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wLT5uYW1lKTsKLQotCSAgICAgIGQgPSBvcC0+YXJnczsKLQkgICAgICBpZiAoZCAhPSBOVUxMICYmICpkICE9ICdcMCcpCi0JCXsKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKLQkJICBmb3IgKDsgKmQgIT0gJ1wwJzsgZCsrKQotCQkgICAgICBwcmludF9pbnNuX2FyZyAoZCwgd29yZCwgbWVtYWRkciwgaW5mbyk7Ci0JCX0KLQotCSAgICAgIHJldHVybiA0OwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBIYW5kbGUgdW5kZWZpbmVkIGluc3RydWN0aW9ucy4gICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIHdvcmQpOwotICByZXR1cm4gNDsKLX0KLQotCi0vKiBJbiBhbiBlbnZpcm9ubWVudCB3aGVyZSB3ZSBkbyBub3Qga25vdyB0aGUgc3ltYm9sIHR5cGUgb2YgdGhlCi0gICBpbnN0cnVjdGlvbiB3ZSBhcmUgZm9yY2VkIHRvIGFzc3VtZSB0aGF0IHRoZSBsb3cgb3JkZXIgYml0IG9mIHRoZQotICAgaW5zdHJ1Y3Rpb25zJyBhZGRyZXNzIG1heSBtYXJrIGl0IGFzIGEgbWlwczE2IGluc3RydWN0aW9uLiAgSWYgd2UKLSAgIGFyZSBzaW5nbGUgc3RlcHBpbmcsIG9yIHRoZSBwYyBpcyB3aXRoaW4gdGhlIGRpc2Fzc2VtYmxlZCBmdW5jdGlvbiwKLSAgIHRoaXMgd29ya3MuICBPdGhlcndpc2UsIHdlIG5lZWQgYSBjbHVlLiAgU29tZXRpbWVzLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX2JpZ19taXBzIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIGludCBzdGF0dXM7Ci0KLSNpZiAxCi0gIC8qIEZJWE1FOiBJZiBvZGQgYWRkcmVzcywgdGhpcyBpcyBDTEVBUkxZIGEgbWlwcyAxNiBpbnN0cnVjdGlvbi4gICovCi0gIC8qIE9ubHkgYSBmZXcgdG9vbHMgd2lsbCB3b3JrIHRoaXMgd2F5LiAgKi8KLSAgaWYgKG1lbWFkZHIgJiAweDAxKQotICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7Ci0jZW5kaWYgIAotCi0jaWYgU1lNVEFCX0FWQUlMQUJMRQotICBpZiAoaW5mby0+bWFjaCA9PSAxNgotICAgICAgfHwgKGluZm8tPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCSAgJiYgaW5mby0+c3ltYm9scyAhPSBOVUxMCi0JICAmJiAoKCooZWxmX3N5bWJvbF90eXBlICoqKSBpbmZvLT5zeW1ib2xzKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcgotCSAgICAgID09IFNUT19NSVBTMTYpKSkKLSAgICByZXR1cm4gcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pOwotI2VuZGlmICAKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgcmV0dXJuIF9wcmludF9pbnNuX21pcHMgKG1lbWFkZHIsICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0YjMyIChidWZmZXIpLAotCQkJICAgICBpbmZvKTsKLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotaW50Ci1wcmludF9pbnNuX2xpdHRsZV9taXBzIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIGludCBzdGF0dXM7Ci0KLQotI2lmIDEKLSAgaWYgKG1lbWFkZHIgJiAweDAxKQotICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7Ci0jZW5kaWYgIAotCi0jaWYgU1lNVEFCX0FWQUlMQUJMRQotICBpZiAoaW5mby0+bWFjaCA9PSAxNgotICAgICAgfHwgKGluZm8tPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCSAgJiYgaW5mby0+c3ltYm9scyAhPSBOVUxMCi0JICAmJiAoKCooZWxmX3N5bWJvbF90eXBlICoqKSBpbmZvLT5zeW1ib2xzKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcgotCSAgICAgID09IFNUT19NSVBTMTYpKSkKLSAgICByZXR1cm4gcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pOwotI2VuZGlmICAKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgcmV0dXJuIF9wcmludF9pbnNuX21pcHMgKG1lbWFkZHIsICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0bDMyIChidWZmZXIpLAotCQkJICAgICBpbmZvKTsKLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQwKLS8qIERpc2Fzc2VtYmxlIG1pcHMxNiBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1czsKLSAgYmZkX2J5dGUgYnVmZmVyWzJdOwotICBpbnQgbGVuZ3RoOwotICBpbnQgaW5zbjsKLSAgYm9vbGVhbiB1c2VfZXh0ZW5kOwotICBpbnQgZXh0ZW5kID0gMDsKLSAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcCwgKm9wZW5kOwotCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gaW5mby0+ZW5kaWFuOwotCi0gIGluZm8tPmluc25faW5mb192YWxpZCA9IDE7Ci0gIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDA7Ci0gIGluZm8tPmRhdGFfc2l6ZSA9IDA7Ci0gIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25icmFuY2g7Ci0gIGluZm8tPnRhcmdldCA9IDA7Ci0gIGluZm8tPnRhcmdldDIgPSAwOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgbGVuZ3RoID0gMjsKLQotICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICBlbHNlCi0gICAgaW5zbiA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0KLSAgLyogSGFuZGxlIHRoZSBleHRlbmQgb3Bjb2RlIHNwZWNpYWxseS4gICovCi0gIHVzZV9leHRlbmQgPSBmYWxzZTsKLSAgaWYgKChpbnNuICYgMHhmODAwKSA9PSAweGYwMDApCi0gICAgewotICAgICAgdXNlX2V4dGVuZCA9IHRydWU7Ci0gICAgICBleHRlbmQgPSBpbnNuICYgMHg3ZmY7Ci0KLSAgICAgIG1lbWFkZHIgKz0gMjsKLQotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4dGVuZCAweCV4IiwKLQkJCQkgKHVuc2lnbmVkIGludCkgZXh0ZW5kKTsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRykKLQlpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGVsc2UKLQlpbnNuID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQotICAgICAgLyogQ2hlY2sgZm9yIGFuIGV4dGVuZCBvcGNvZGUgZm9sbG93ZWQgYnkgYW4gZXh0ZW5kIG9wY29kZS4gICovCi0gICAgICBpZiAoKGluc24gJiAweGY4MDApID09IDB4ZjAwMCkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4dGVuZCAweCV4IiwKLQkJCQkgKHVuc2lnbmVkIGludCkgZXh0ZW5kKTsKLQkgIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOwotCSAgcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLSAgICAgIGxlbmd0aCArPSAyOwotICAgIH0KLQotICAvKiBGSVhNRTogU2hvdWxkIHByb2JhYmx5IHVzZSBhIGhhc2ggdGFibGUgb24gdGhlIG1ham9yIG9wY29kZSBoZXJlLiAgKi8KLQotICBvcGVuZCA9IG1pcHMxNl9vcGNvZGVzICsgYmZkX21pcHMxNl9udW1fb3Bjb2RlczsKLSAgZm9yIChvcCA9IG1pcHMxNl9vcGNvZGVzOyBvcCA8IG9wZW5kOyBvcCsrKQotICAgIHsKLSAgICAgIGlmIChvcC0+cGluZm8gIT0gSU5TTl9NQUNSTyAmJiAoaW5zbiAmIG9wLT5tYXNrKSA9PSBvcC0+bWF0Y2gpCi0JewotCSAgY29uc3QgY2hhciAqczsKLQotCSAgaWYgKHN0cmNociAob3AtPmFyZ3MsICdhJykgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICh1c2VfZXh0ZW5kKQotCQl7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJleHRlbmQgMHgleCIsCi0JCQkJCSAodW5zaWduZWQgaW50KSBleHRlbmQpOwotCQkgIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOwotCQkgIHJldHVybiBsZW5ndGggLSAyOwotCQl9Ci0KLQkgICAgICB1c2VfZXh0ZW5kID0gZmFsc2U7Ci0KLQkgICAgICBtZW1hZGRyICs9IDI7Ci0KLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsCi0JCQkJCQkgIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgPT0gMCkKLQkJewotCQkgIHVzZV9leHRlbmQgPSB0cnVlOwotCQkgIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCi0JCSAgICBleHRlbmQgPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotCQkgIGVsc2UKLQkJICAgIGV4dGVuZCA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0JCSAgbGVuZ3RoICs9IDI7Ci0JCX0KLQkgICAgfQotCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3AtPm5hbWUpOwotCSAgaWYgKG9wLT5hcmdzWzBdICE9ICdcMCcpCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKLQotCSAgZm9yIChzID0gb3AtPmFyZ3M7ICpzICE9ICdcMCc7IHMrKykKLQkgICAgewotCSAgICAgIGlmICgqcyA9PSAnLCcKLQkJICAmJiBzWzFdID09ICd3JwotCQkgICYmICgoKGluc24gPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWCkKLQkJICAgICAgPT0gKChpbnNuID4+IE1JUFMxNk9QX1NIX1JZKSAmIE1JUFMxNk9QX01BU0tfUlkpKSkKLQkJewotCQkgIC8qIFNraXAgdGhlIHJlZ2lzdGVyIGFuZCB0aGUgY29tbWEuICAqLwotCQkgICsrczsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmICgqcyA9PSAnLCcKLQkJICAmJiBzWzFdID09ICd2JwotCQkgICYmICgoKGluc24gPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWikKLQkJICAgICAgPT0gKChpbnNuID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlgpKSkKLQkJewotCQkgIC8qIFNraXAgdGhlIHJlZ2lzdGVyIGFuZCB0aGUgY29tbWEuICAqLwotCQkgICsrczsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIHByaW50X21pcHMxNl9pbnNuX2FyZyAoKnMsIG9wLCBpbnNuLCB1c2VfZXh0ZW5kLCBleHRlbmQsIG1lbWFkZHIsCi0JCQkJICAgICBpbmZvKTsKLQkgICAgfQotCi0JICBpZiAoKG9wLT5waW5mbyAmIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSkgIT0gMCkKLQkgICAgewotCSAgICAgIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDE7Ci0JICAgICAgaWYgKGluZm8tPmluc25fdHlwZSAhPSBkaXNfanNyKQotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfYnJhbmNoOwotCSAgICB9Ci0KLQkgIHJldHVybiBsZW5ndGg7Ci0JfQotICAgIH0KLQotICBpZiAodXNlX2V4dGVuZCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBleHRlbmQgfCAweGYwMDApOwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBpbnNuKTsKLSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmluc247Ci0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotLyogRGlzYXNzZW1ibGUgYW4gb3BlcmFuZCBmb3IgYSBtaXBzMTYgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfbWlwczE2X2luc25fYXJnICh0eXBlLCBvcCwgbCwgdXNlX2V4dGVuZCwgZXh0ZW5kLCBtZW1hZGRyLCBpbmZvKQotICAgICBpbnQgdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcDsKLSAgICAgaW50IGw7Ci0gICAgIGJvb2xlYW4gdXNlX2V4dGVuZDsKLSAgICAgaW50IGV4dGVuZDsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICcsJzoKLSAgICBjYXNlICcoJzoKLSAgICBjYXNlICcpJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCB0eXBlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneSc6Ci0gICAgY2FzZSAndyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIG1pcHMxNl9yZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX1JZKQotCQkJCQkgICAgICAgJiBNSVBTMTZPUF9NQVNLX1JZKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICd2JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgbWlwczE2X3JlZ19uYW1lc1soKGwgPj4gTUlQUzE2T1BfU0hfUlgpCi0JCQkJCSAgICAgICAmIE1JUFMxNk9QX01BU0tfUlgpXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3onOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICBtaXBzMTZfcmVnX25hbWVzWygobCA+PiBNSVBTMTZPUF9TSF9SWikKLQkJCQkJICAgICAgICYgTUlQUzE2T1BfTUFTS19SWildKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIG1pcHMxNl9yZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX01PVkUzMlopCi0JCQkJCSAgICAgICAmIE1JUFMxNk9QX01BU0tfTU9WRTMyWildKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsIHJlZ19uYW1lc1swXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLCByZWdfbmFtZXNbMjldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRwYyIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdSJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzMxXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1gnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICByZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX1JFR1IzMikKLQkJCQkJJiBNSVBTMTZPUF9NQVNLX1JFR1IzMildKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIHJlZ19uYW1lc1tNSVBTMTZPUF9FWFRSQUNUX1JFRzMyUiAobCldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnPCc6Ci0gICAgY2FzZSAnPic6Ci0gICAgY2FzZSAnWyc6Ci0gICAgY2FzZSAnXSc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnSCc6Ci0gICAgY2FzZSAnVyc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAnaic6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnVic6Ci0gICAgY2FzZSAnQyc6Ci0gICAgY2FzZSAnVSc6Ci0gICAgY2FzZSAnayc6Ci0gICAgY2FzZSAnSyc6Ci0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAncSc6Ci0gICAgY2FzZSAnQSc6Ci0gICAgY2FzZSAnQic6Ci0gICAgY2FzZSAnRSc6Ci0gICAgICB7Ci0JaW50IGltbWVkLCBuYml0cywgc2hpZnQsIHNpZ25lZHAsIGV4dGJpdHMsIHBjcmVsLCBleHR1LCBicmFuY2g7Ci0KLQlzaGlmdCA9IDA7Ci0Jc2lnbmVkcCA9IDA7Ci0JZXh0Yml0cyA9IDE2OwotCXBjcmVsID0gMDsKLQlleHR1ID0gMDsKLQlicmFuY2ggPSAwOwotCXN3aXRjaCAodHlwZSkKLQkgIHsKLQkgIGNhc2UgJzwnOgotCSAgICBuYml0cyA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWjsKLQkgICAgZXh0Yml0cyA9IDU7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJz4nOgotCSAgICBuYml0cyA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWDsKLQkgICAgZXh0Yml0cyA9IDU7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1snOgotCSAgICBuYml0cyA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWjsKLQkgICAgZXh0Yml0cyA9IDY7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ10nOgotCSAgICBuYml0cyA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWDsKLQkgICAgZXh0Yml0cyA9IDY7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJzQnOgotCSAgICBuYml0cyA9IDQ7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNCkgJiBNSVBTMTZPUF9NQVNLX0lNTTQ7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBleHRiaXRzID0gMTU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnNSc6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnSCc6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgc2hpZnQgPSAxOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gMjsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdXJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBzaGlmdCA9IDI7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIGlmICgob3AtPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9QQykgPT0gMAotCQkmJiAob3AtPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9TUCkgPT0gMCkKLQkgICAgICB7Ci0JCWluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCQlpbmZvLT5kYXRhX3NpemUgPSA0OwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICBjYXNlICdEJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBzaGlmdCA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSA4OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ2onOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJzYnOgotCSAgICBuYml0cyA9IDY7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNikgJiBNSVBTMTZPUF9NQVNLX0lNTTY7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnOCc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdWJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBzaGlmdCA9IDI7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIC8qIEZJWE1FOiBUaGlzIG1pZ2h0IGJlIGx3LCBvciBpdCBtaWdodCBiZSBhZGRpdSB0byAkc3Agb3IKLSAgICAgICAgICAgICAgICRwYy4gIFdlIGFzc3VtZSBpdCdzIGxvYWQuICAqLwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gNDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdDJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBzaGlmdCA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSA4OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1UnOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIGV4dHUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ2snOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0snOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIHNoaWZ0ID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAncCc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIHBjcmVsID0gMTsKLQkgICAgYnJhbmNoID0gMTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2NvbmRicmFuY2g7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAncSc6Ci0JICAgIG5iaXRzID0gMTE7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NMTEpICYgTUlQUzE2T1BfTUFTS19JTU0xMTsKLQkgICAgc2lnbmVkcCA9IDE7Ci0JICAgIHBjcmVsID0gMTsKLQkgICAgYnJhbmNoID0gMTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2JyYW5jaDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdBJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBzaGlmdCA9IDI7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIHBjcmVsID0gMTsKLQkgICAgLyogRklYTUU6IFRoaXMgY2FuIGJlIGx3IG9yIGxhLiAgV2UgYXNzdW1lIGl0IGlzIGx3LiAgKi8KLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnQic6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgc2hpZnQgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBwY3JlbCA9IDE7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSA4OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0UnOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIHNoaWZ0ID0gMjsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgcGNyZWwgPSAxOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotCi0JaWYgKCEgdXNlX2V4dGVuZCkKLQkgIHsKLQkgICAgaWYgKHNpZ25lZHAgJiYgaW1tZWQgPj0gKDEgPDwgKG5iaXRzIC0gMSkpKQotCSAgICAgIGltbWVkIC09IDEgPDwgbmJpdHM7Ci0JICAgIGltbWVkIDw8PSBzaGlmdDsKLQkgICAgaWYgKCh0eXBlID09ICc8JyB8fCB0eXBlID09ICc+JyB8fCB0eXBlID09ICdbJyB8fCB0eXBlID09ICddJykKLQkJJiYgaW1tZWQgPT0gMCkKLQkgICAgICBpbW1lZCA9IDg7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAoZXh0Yml0cyA9PSAxNikKLQkgICAgICBpbW1lZCB8PSAoKGV4dGVuZCAmIDB4MWYpIDw8IDExKSB8IChleHRlbmQgJiAweDdlMCk7Ci0JICAgIGVsc2UgaWYgKGV4dGJpdHMgPT0gMTUpCi0JICAgICAgaW1tZWQgfD0gKChleHRlbmQgJiAweGYpIDw8IDExKSB8IChleHRlbmQgJiAweDdmMCk7Ci0JICAgIGVsc2UKLQkgICAgICBpbW1lZCA9ICgoZXh0ZW5kID4+IDYpICYgMHgxZikgfCAoZXh0ZW5kICYgMHgyMCk7Ci0JICAgIGltbWVkICY9ICgxIDw8IGV4dGJpdHMpIC0gMTsKLQkgICAgaWYgKCEgZXh0dSAmJiBpbW1lZCA+PSAoMSA8PCAoZXh0Yml0cyAtIDEpKSkKLQkgICAgICBpbW1lZCAtPSAxIDw8IGV4dGJpdHM7Ci0JICB9Ci0KLQlpZiAoISBwY3JlbCkKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbW1lZCk7Ci0JZWxzZQotCSAgewotCSAgICBiZmRfdm1hIGJhc2VhZGRyOwotCSAgICBiZmRfdm1hIHZhbDsKLQotCSAgICBpZiAoYnJhbmNoKQotCSAgICAgIHsKLQkJaW1tZWQgKj0gMjsKLQkJYmFzZWFkZHIgPSBtZW1hZGRyICsgMjsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHVzZV9leHRlbmQpCi0JICAgICAgYmFzZWFkZHIgPSBtZW1hZGRyIC0gMjsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaW50IHN0YXR1czsKLQkJYmZkX2J5dGUgYnVmZmVyWzJdOwotCi0JCWJhc2VhZGRyID0gbWVtYWRkcjsKLQotCQkvKiBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGluIHRoZSBkZWxheSBzbG90IG9mIGEganIKLSAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiwgdGhlIGJhc2UgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICBqciBpbnN0cnVjdGlvbi4gIElmIGl0IGlzIGluIHRoZSBkZWxheSBzbG90IG9mIGphbHIKLSAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiwgdGhlIGJhc2UgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICBqYWxyIGluc3RydWN0aW9uLiAgVGhpcyB0ZXN0IGlzIHVucmVsaWFibGU6IHdlIGhhdmUKLSAgICAgICAgICAgICAgICAgICBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBwcmV2aW91cyB3b3JkIGlzCi0gICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gb3IgZGF0YS4gICovCi0JCXN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSA0LCBidWZmZXIsIDIsCi0JCQkJCQkgICAgaW5mbyk7Ci0JCWlmIChzdGF0dXMgPT0gMAotCQkgICAgJiYgKCgoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHCi0JCQkgID8gYmZkX2dldGIxNiAoYnVmZmVyKQotCQkJICA6IGJmZF9nZXRsMTYgKGJ1ZmZlcikpCi0JCQkgJiAweGY4MDApID09IDB4MTgwMCkpCi0JCSAgYmFzZWFkZHIgPSBtZW1hZGRyIC0gNDsKLQkJZWxzZQotCQkgIHsKLQkJICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSAyLCBidWZmZXIsCi0JCQkJCQkJMiwgaW5mbyk7Ci0JCSAgICBpZiAoc3RhdHVzID09IDAKLQkJCSYmICgoKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRwotCQkJICAgICAgPyBiZmRfZ2V0YjE2IChidWZmZXIpCi0JCQkgICAgICA6IGJmZF9nZXRsMTYgKGJ1ZmZlcikpCi0JCQkgICAgICYgMHhmODFmKSA9PSAweGU4MDApKQotCQkgICAgICBiYXNlYWRkciA9IG1lbWFkZHIgLSAyOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIHZhbCA9IChiYXNlYWRkciAmIH4gKCgxIDw8IHNoaWZ0KSAtIDEpKSArIGltbWVkOwotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCwgaW5mbyk7Ci0JICAgIGluZm8tPnRhcmdldCA9IHZhbDsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYSc6Ci0gICAgICBpZiAoISB1c2VfZXh0ZW5kKQotCWV4dGVuZCA9IDA7Ci0gICAgICBsID0gKChsICYgMHgxZikgPDwgMjMpIHwgKChsICYgMHgzZTApIDw8IDEzKSB8IChleHRlbmQgPDwgMik7Ci0gICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChtZW1hZGRyICYgMHhmMDAwMDAwMCkgfCBsLCBpbmZvKTsKLSAgICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19qc3I7Ci0gICAgICBpbmZvLT50YXJnZXQgPSAobWVtYWRkciAmIDB4ZjAwMDAwMDApIHwgbDsKLSAgICAgIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2wnOgotICAgIGNhc2UgJ0wnOgotICAgICAgewotCWludCBuZWVkX2NvbW1hLCBhbWFzaywgc21hc2s7Ci0KLQluZWVkX2NvbW1hID0gMDsKLQotCWwgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU02KSAmIE1JUFMxNk9QX01BU0tfSU1NNjsKLQotCWFtYXNrID0gKGwgPj4gMykgJiA3OwotCi0JaWYgKGFtYXNrID4gMCAmJiBhbWFzayA8IDUpCi0JICB7Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzRdKTsKLQkgICAgaWYgKGFtYXNrID4gMSkKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0kJXMiLAotCQkJCSAgICAgcmVnX25hbWVzW2FtYXNrICsgM10pOwotCSAgICBuZWVkX2NvbW1hID0gMTsKLQkgIH0KLQotCXNtYXNrID0gKGwgPj4gMSkgJiAzOwotCWlmIChzbWFzayA9PSAzKQotCSAgewotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzPz8iLAotCQkJCSAgIG5lZWRfY29tbWEgPyAiLCIgOiAiIik7Ci0JICAgIG5lZWRfY29tbWEgPSAxOwotCSAgfQotCWVsc2UgaWYgKHNtYXNrID4gMCkKLQkgIHsKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyQlcyIsCi0JCQkJICAgbmVlZF9jb21tYSA/ICIsIiA6ICIiLAotCQkJCSAgIHJlZ19uYW1lc1sxNl0pOwotCSAgICBpZiAoc21hc2sgPiAxKQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSQlcyIsCi0JCQkJICAgICByZWdfbmFtZXNbc21hc2sgKyAxNV0pOwotCSAgICBuZWVkX2NvbW1hID0gMTsKLQkgIH0KLQotCWlmIChsICYgMSkKLQkgIHsKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyQlcyIsCi0JCQkJICAgbmVlZF9jb21tYSA/ICIsIiA6ICIiLAotCQkJCSAgIHJlZ19uYW1lc1szMV0pOwotCSAgICBuZWVkX2NvbW1hID0gMTsKLQkgIH0KLQotCWlmIChhbWFzayA9PSA1IHx8IGFtYXNrID09IDYpCi0JICB7Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMkZjAiLAotCQkJCSAgIG5lZWRfY29tbWEgPyAiLCIgOiAiIik7Ci0JICAgIGlmIChhbWFzayA9PSA2KQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSRmMSIpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9taXBzLW9wYy5jIGIvb3Bjb2Rlcy9taXBzLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODFmNDRmLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWlwcy1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDgzMyArMCwwIEBACi0vKiBtaXBzLmguICBNaXBzIG9wY29kZSBsaXN0IGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICBDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJhbHBoIENhbXBiZWxsIGFuZCBPU0YKLSAgIENvbW1lbnRlZCBhbmQgbW9kaWZpZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgotCi0vKiBTaG9ydCBoYW5kIHNvIHRoZSBsaW5lcyBhcmVuJ3QgdG9vIGxvbmcuICAqLwotCi0jZGVmaW5lIExERCAgICAgSU5TTl9MT0FEX01FTU9SWV9ERUxBWQotI2RlZmluZSBMQ0QJSU5TTl9MT0FEX0NPUFJPQ19ERUxBWQotI2RlZmluZSBVQkQgICAgIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQotI2RlZmluZSBDQkQJSU5TTl9DT05EX0JSQU5DSF9ERUxBWQotI2RlZmluZSBDT0QgICAgIElOU05fQ09QUk9DX01PVkVfREVMQVkKLSNkZWZpbmUgQ0xECUlOU05fQ09QUk9DX01FTU9SWV9ERUxBWQotI2RlZmluZSBDQkwJSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkKLSNkZWZpbmUgVFJBUAlJTlNOX1RSQVAKLSNkZWZpbmUgU00JSU5TTl9TVE9SRV9NRU1PUlkKLQotI2RlZmluZSBXUl9kICAgIElOU05fV1JJVEVfR1BSX0QKLSNkZWZpbmUgV1JfdCAgICBJTlNOX1dSSVRFX0dQUl9UCi0jZGVmaW5lIFdSXzMxICAgSU5TTl9XUklURV9HUFJfMzEgICAgICAgCi0jZGVmaW5lIFdSX0QgICAgSU5TTl9XUklURV9GUFJfRCAgICAgICAgCi0jZGVmaW5lIFdSX1QJSU5TTl9XUklURV9GUFJfVAotI2RlZmluZSBXUl9TCUlOU05fV1JJVEVfRlBSX1MKLSNkZWZpbmUgUkRfcyAgICBJTlNOX1JFQURfR1BSX1MgICAgICAgICAKLSNkZWZpbmUgUkRfYiAgICBJTlNOX1JFQURfR1BSX1MgICAgICAgICAKLSNkZWZpbmUgUkRfdCAgICBJTlNOX1JFQURfR1BSX1QgICAgICAgICAKLSNkZWZpbmUgUkRfUyAgICBJTlNOX1JFQURfRlBSX1MgICAgICAgICAKLSNkZWZpbmUgUkRfVCAgICBJTlNOX1JFQURfRlBSX1QgICAgICAgICAKLSNkZWZpbmUgUkRfUglJTlNOX1JFQURfRlBSX1IKLSNkZWZpbmUgV1JfQ0MJSU5TTl9XUklURV9DT05EX0NPREUKLSNkZWZpbmUgUkRfQ0MJSU5TTl9SRUFEX0NPTkRfQ09ERQotI2RlZmluZSBSRF9DMCAgIElOU05fQ09QCi0jZGVmaW5lIFJEX0MxCUlOU05fQ09QCi0jZGVmaW5lIFJEX0MyICAgSU5TTl9DT1AKLSNkZWZpbmUgUkRfQzMgICBJTlNOX0NPUAotI2RlZmluZSBXUl9DMCAgIElOU05fQ09QCi0jZGVmaW5lIFdSX0MxCUlOU05fQ09QCi0jZGVmaW5lIFdSX0MyICAgSU5TTl9DT1AKLSNkZWZpbmUgV1JfQzMgICBJTlNOX0NPUAotCi0jZGVmaW5lIFdSX0hJCUlOU05fV1JJVEVfSEkKLSNkZWZpbmUgUkRfSEkJSU5TTl9SRUFEX0hJCi0jZGVmaW5lIE1PRF9ISSAgV1JfSEl8UkRfSEkKLQotI2RlZmluZSBXUl9MTwlJTlNOX1dSSVRFX0xPCi0jZGVmaW5lIFJEX0xPCUlOU05fUkVBRF9MTwotI2RlZmluZSBNT0RfTE8gIFdSX0xPfFJEX0xPCi0KLSNkZWZpbmUgV1JfSElMTyBXUl9ISXxXUl9MTwotI2RlZmluZSBSRF9ISUxPIFJEX0hJfFJEX0xPCi0jZGVmaW5lIE1PRF9ISUxPIFdSX0hJTE98UkRfSElMTwotCi0jZGVmaW5lIElTX00gICAgSU5TTl9NVUxUCi0KLSNkZWZpbmUgSTEJSU5TTl9JU0ExCi0jZGVmaW5lIEkyCUlOU05fSVNBMgotI2RlZmluZSBJMwlJTlNOX0lTQTMKLSNkZWZpbmUgSTQJSU5TTl9JU0E0Ci0jZGVmaW5lIEk1CUlOU05fSVNBNQotI2RlZmluZSBQMwlJTlNOXzQ2NTAKLSNkZWZpbmUgTDEJSU5TTl80MDEwCi0jZGVmaW5lIFYxICAgICAgSU5TTl80MTAwCi0jZGVmaW5lIFQzICAgICAgSU5TTl8zOTAwCi0KLSNkZWZpbmUgRzEgICAgICAoVDMgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICApCi0KLSNkZWZpbmUgRzIgICAgICAoVDMgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICApCi0KLSNkZWZpbmUgRzMgKEk0ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICkKLQotI2RlZmluZSBNMSAgICAgIDAKLSNkZWZpbmUgTTIgICAgICAwCi0KLS8qIFRoZSBvcmRlciBvZiBvdmVybG9hZGVkIGluc3RydWN0aW9ucyBtYXR0ZXJzLiAgTGFiZWwgYXJndW1lbnRzIGFuZAotICAgcmVnaXN0ZXIgYXJndW1lbnRzIGxvb2sgdGhlIHNhbWUuIEluc3RydWN0aW9ucyB0aGF0IGNhbiBoYXZlIGVpdGhlcgotICAgZm9yIGFyZ3VtZW50cyBtdXN0IGFwZWFyIGluIHRoZSBjb3JyZWN0IG9yZGVyIGluIHRoaXMgdGFibGUgZm9yIHRoZQotICAgYXNzZW1ibGVyIHRvIHBpY2sgdGhlIHJpZ2h0IG9uZS4gSW4gb3RoZXIgd29yZHMsIGVudHJpZXMgd2l0aAotICAgaW1tZWRpYXRlIG9wZXJhbmRzIG11c3QgYXBlYXIgYWZ0ZXIgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gd2l0aAotICAgcmVnaXN0ZXJzLgotCi0gICBNYW55IGluc3RydWN0aW9ucyBhcmUgc2hvcnQgaGFuZCBmb3Igb3RoZXIgaW5zdHJ1Y3Rpb25zIChpLmUuLCBUaGUKLSAgIGphbCA8cmVnaXN0ZXI+IGluc3RydWN0aW9uIGlzIHNob3J0IGZvciBqYWxyIDxyZWdpc3Rlcj4pLiAgKi8KLQotY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHNfYnVpbHRpbl9vcGNvZGVzW10gPSB7Ci0vKiBUaGVzZSBpbnN0cnVjdGlvbnMgYXBwZWFyIGZpcnN0IHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGZpbmQKLSAgIHRoZW0gZmlyc3QuICBUaGUgYXNzZW1ibGVycyB1c2VzIGEgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUKLSAgIGluc3RydWN0aW9uIG5hbWUgYW55aG93LiAgKi8KLS8qIG5hbWUsCWFyZ3MsCW1hc2ssCQltYXRjaCwJcGluZm8gKi8KLXsibm9wIiwgICAgICIiLAkJMHgwMDAwMDAwMCwgMHhmZmZmZmZmZiwJMCwJCUkxCX0sCi17ImxpIiwgICAgICAidCxqIiwgICAgICAweDI0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90LAkJSTEJfSwgLyogYWRkaXUgKi8KLXsibGkiLAkgICAgInQsaSIsCTB4MzQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCQlJMQl9LCAvKiBvcmkgKi8KLXsibGkiLCAgICAgICJ0LEkiLAkwLCAgICAoaW50KSBNX0xJLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJtb3ZlIiwgICAgImQscyIsCTB4MDAwMDAwMmQsIDB4ZmMxZjA3ZmYsIFdSX2R8UkRfcywJSTMJfSwvKiBkYWRkdSAqLwoteyJtb3ZlIiwgICAgImQscyIsCTB4MDAwMDAwMjEsIDB4ZmMxZjA3ZmYsIFdSX2R8UkRfcywJSTEJfSwvKiBhZGR1ICovCi17Im1vdmUiLCAgICAiZCxzIiwJMHgwMDAwMDAyNSwgMHhmYzFmMDdmZiwJV1JfZHxSRF9zLAlJMQl9LC8qIG9yICovCi17ImIiLCAgICAgICAicCIsCTB4MTAwMDAwMDAsIDB4ZmZmZjAwMDAsCVVCRCwJCUkxCX0sLyogYmVxIDAsMCAqLwoteyJiIiwgICAgICAgInAiLAkweDA0MDEwMDAwLCAweGZmZmYwMDAwLAlVQkQsCQlJMQl9LC8qIGJnZXogMCAqLwoteyJiYWwiLCAgICAgInAiLAkweDA0MTEwMDAwLCAweGZmZmYwMDAwLAlVQkR8V1JfMzEsCUkxCX0sLyogYmdlemFsIDAqLwotCi17ImFicyIsICAgICAiZCx2IiwJMCwgICAgKGludCkgTV9BQlMsCUlOU05fTUFDUk8sCUkxCX0sCi17ImFicy5zIiwgICAiRCxWIiwJMHg0NjAwMDAwNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkxCX0sCi17ImFicy5kIiwgICAiRCxWIiwJMHg0NjIwMDAwNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkxCX0sCi17ImFicy5wcyIsICAiRCxWIiwJMHg0NmMwMDAwNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUk1CX0sCi17ImFkZCIsICAgICAiZCx2LHQiLAkweDAwMDAwMDIwLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsiYWRkIiwgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fQUREX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImFkZC5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAwLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAlJMX0sCi17ImFkZC5kIiwgICAiRCxWLFQiLAkweDQ2MjAwMDAwLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJMX0sCi17ImFkZC5wcyIsICAiRCxWLFQiLAkweDQ2YzAwMDAwLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJNX0sCi17ImFkZGkiLCAgICAidCxyLGoiLAkweDIwMDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi17ImFkZGl1IiwgICAidCxyLGoiLAkweDI0MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi17ImFkZHUiLCAgICAiZCx2LHQiLAkweDAwMDAwMDIxLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsiYWRkdSIsICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fQUREVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJhbG52LnBzIiwgIkQsVixULHMiLAkweDRjMDAwMDFlLCAweGZjMDAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJNX0sCi17ImFuZCIsICAgICAiZCx2LHQiLAkweDAwMDAwMDI0LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsiYW5kIiwgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fQU5EX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImFuZGkiLCAgICAidCxyLGkiLAkweDMwMDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi0vKiBiIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHRhYmxlLiAgKi8KLS8qIGJhbCBpcyBhdCB0aGUgdG9wIG9mIHRoZSB0YWJsZS4gICovCi17ImJjMGYiLCAgICAicCIsCTB4NDEwMDAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMwZmwiLCAgICJwIiwJMHg0MTAyMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiYzFmIiwgICAgInAiLAkweDQ1MDAwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0N8RlBfUywJSTF8TTEJfSwKLXsiYmMxZiIsICAgICJOLHAiLAkweDQ1MDAwMDAwLCAweGZmZTMwMDAwLAlDQkR8UkRfQ0N8RlBfUywJSTR8TTEJfSwKLXsiYmMxZmwiLCAgICJwIiwJMHg0NTAyMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDfEZQX1MsCUkyfFQzfE0xfSwKLXsiYmMxZmwiLCAgICJOLHAiLAkweDQ1MDIwMDAwLCAweGZmZTMwMDAwLAlDQkx8UkRfQ0N8RlBfUywJSTR8TTEJfSwKLXsiYmMyZiIsICAgICJwIiwJMHg0OTAwMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzJmbCIsICAgInAiLAkweDQ5MDIwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJjM2YiLCAgICAicCIsCTB4NGQwMDAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMzZmwiLCAgICJwIiwJMHg0ZDAyMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiYzB0IiwgICAgInAiLAkweDQxMDEwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjMHRsIiwgICAicCIsCTB4NDEwMzAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmMxdCIsICAgICJwIiwJMHg0NTAxMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDfEZQX1MsCUkxCX0sCi17ImJjMXQiLCAgICAiTixwIiwJMHg0NTAxMDAwMCwgMHhmZmUzMDAwMCwJQ0JEfFJEX0NDfEZQX1MsCUk0CX0sCi17ImJjMXRsIiwgICAicCIsCTB4NDUwMzAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQ3xGUF9TLAlJMnxUMwl9LAoteyJiYzF0bCIsICAgIk4scCIsCTB4NDUwMzAwMDAsIDB4ZmZlMzAwMDAsCUNCTHxSRF9DQ3xGUF9TLAlJNAl9LAoteyJiYzJ0IiwgICAgInAiLAkweDQ5MDEwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjMnRsIiwgICAicCIsCTB4NDkwMzAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmMzdCIsICAgICJwIiwJMHg0ZDAxMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzN0bCIsICAgInAiLAkweDRkMDMwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJlcXoiLCAgICAicyxwIiwJMHgxMDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJlcXpsIiwgICAicyxwIiwJMHg1MDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJlcSIsICAgICAicyx0LHAiLAkweDEwMDAwMDAwLCAweGZjMDAwMDAwLAlDQkR8UkRfc3xSRF90LAlJMQl9LAoteyJiZXEiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CRVFfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmVxbCIsICAgICJzLHQscCIsCTB4NTAwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCTHxSRF9zfFJEX3QsCUkyfFQzCX0sCi17ImJlcWwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JFUUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmdlIiwgICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdFLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ2UiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR0VfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmdlbCIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdFTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmdlbCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdFTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ2V1IiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR0VVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ2V1IiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR0VVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJnZXVsIiwgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHRVVMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ2V1bCIsICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR0VVTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ2V6IiwgICAgInMscCIsCTB4MDQwMTAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoteyJiZ2V6bCIsICAgInMscCIsCTB4MDQwMzAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJiZ2V6YWwiLCAgInMscCIsCTB4MDQxMTAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zfFdSXzMxLAlJMQl9LAoteyJiZ2V6YWxsIiwgInMscCIsCTB4MDQxMzAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJiZ3QiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR1QsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJndCIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHVF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ3RsIiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR1RMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ3RsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR1RMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJndHUiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHVFUsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJndHUiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHVFVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmd0dWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdUVUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJndHVsIiwgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHVFVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJndHoiLCAgICAicyxwIiwJMHgxYzAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJndHpsIiwgICAicyxwIiwJMHg1YzAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJsZSIsICAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMRSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmxlIiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxFX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsZWwiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMRUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsZWwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMRUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmxldSIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmxldSIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxFVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibGV1bCIsICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTEVVTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmxldWwiLCAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxFVUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmxleiIsICAgICJzLHAiLAkweDE4MDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYmxlemwiLCAgICJzLHAiLAkweDU4MDAwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmx0IiwgICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxULAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibHQiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTFRfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmx0bCIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxUTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmx0bCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxUTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibHR1IiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTFRVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibHR1IiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTFRVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsdHVsIiwgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMVFVMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibHR1bCIsICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTFRVTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibHR6IiwgICAgInMscCIsCTB4MDQwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoteyJibHR6bCIsICAgInMscCIsCTB4MDQwMjAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJibHR6YWwiLCAgInMscCIsCTB4MDQxMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zfFdSXzMxLAlJMQl9LAoteyJibHR6YWxsIiwgInMscCIsCTB4MDQxMjAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJibmV6IiwgICAgInMscCIsCTB4MTQwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoteyJibmV6bCIsICAgInMscCIsCTB4NTQwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJibmUiLCAgICAgInMsdCxwIiwJMHgxNDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0JEfFJEX3N8UkRfdCwJSTEJfSwKLXsiYm5lIiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQk5FX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJuZWwiLCAgICAicyx0LHAiLAkweDU0MDAwMDAwLCAweGZjMDAwMDAwLAlDQkx8UkRfc3xSRF90LCAJSTJ8VDMJfSwKLXsiYm5lbCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQk5FTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJicmVhayIsICAgIiIsCQkweDAwMDAwMDBkLCAweGZmZmZmZmZmLAlUUkFQLAkJSTEJfSwKLXsiYnJlYWsiLCAgICJjIiwJMHgwMDAwMDAwZCwgMHhmYzAwZmZmZiwJVFJBUCwJCUkxCX0sCi17ImJyZWFrIiwgICAiYyxxIiwJMHgwMDAwMDAwZCwgMHhmYzAwMDAzZiwJVFJBUCwJCUkxCX0sCi17ImMuZi5kIiwgICAiUyxUIiwJMHg0NjIwMDAzMCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMuZi5kIiwgICAiTSxTLFQiLAkweDQ2MjAwMDMwLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5mLnMiLCAgICJTLFQiLAkweDQ2MDAwMDMwLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5mLnMiLCAgICJNLFMsVCIsCTB4NDYwMDAwMzAsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLmYucHMiLCAgIlMsVCIsCTB4NDZjMDAwMzAsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLmYucHMiLCAgIk0sUyxUIiwJMHg0NmMwMDAzMCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMudW4uZCIsICAiUyxUIiwJMHg0NjIwMDAzMSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMudW4uZCIsICAiTSxTLFQiLAkweDQ2MjAwMDMxLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy51bi5zIiwgICJTLFQiLAkweDQ2MDAwMDMxLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy51bi5zIiwgICJNLFMsVCIsCTB4NDYwMDAwMzEsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLnVuLnBzIiwgIlMsVCIsCTB4NDZjMDAwMzEsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnVuLnBzIiwgIk0sUyxUIiwJMHg0NmMwMDAzMSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMuZXEuZCIsICAiUyxUIiwJMHg0NjIwMDAzMiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMuZXEuZCIsICAiTSxTLFQiLAkweDQ2MjAwMDMyLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5lcS5zIiwgICJTLFQiLAkweDQ2MDAwMDMyLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5lcS5zIiwgICJNLFMsVCIsCTB4NDYwMDAwMzIsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLmVxLnBzIiwgIlMsVCIsCTB4NDZjMDAwMzIsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLmVxLnBzIiwgIk0sUyxUIiwJMHg0NmMwMDAzMiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMudWVxLmQiLCAiUyxUIiwJMHg0NjIwMDAzMywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMudWVxLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDMzLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy51ZXEucyIsICJTLFQiLAkweDQ2MDAwMDMzLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy51ZXEucyIsICJNLFMsVCIsCTB4NDYwMDAwMzMsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLnVlcS5wcyIsIlMsVCIsCTB4NDZjMDAwMzMsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnVlcS5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzMywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubHQucyIsICAiUyxUIiwJMHg0NjAwMDAzYywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMubHQucyIsICAiTSxTLFQiLAkweDQ2MDAwMDNjLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5vbHQuZCIsICJTLFQiLAkweDQ2MjAwMDM0LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5vbHQuZCIsICJNLFMsVCIsCTB4NDYyMDAwMzQsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLm9sdC5zIiwgIlMsVCIsCTB4NDYwMDAwMzQsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLm9sdC5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzNCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMub2x0LnBzIiwiUyxUIiwJMHg0NmMwMDAzNCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMub2x0LnBzIiwiTSxTLFQiLAkweDQ2YzAwMDM0LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy51bHQuZCIsICJTLFQiLAkweDQ2MjAwMDM1LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy51bHQuZCIsICJNLFMsVCIsCTB4NDYyMDAwMzUsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLnVsdC5zIiwgIlMsVCIsCTB4NDYwMDAwMzUsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnVsdC5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzNSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMudWx0LnBzIiwiUyxUIiwJMHg0NmMwMDAzNSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMudWx0LnBzIiwiTSxTLFQiLAkweDQ2YzAwMDM1LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5sZS5zIiwgICJTLFQiLAkweDQ2MDAwMDNlLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5sZS5zIiwgICJNLFMsVCIsCTB4NDYwMDAwM2UsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm9sZS5kIiwgIlMsVCIsCTB4NDYyMDAwMzYsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm9sZS5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzNiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMub2xlLnMiLCAiUyxUIiwJMHg0NjAwMDAzNiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMub2xlLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDM2LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5vbGUucHMiLCJTLFQiLAkweDQ2YzAwMDM2LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5vbGUucHMiLCJNLFMsVCIsCTB4NDZjMDAwMzYsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnVsZS5kIiwgIlMsVCIsCTB4NDYyMDAwMzcsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLnVsZS5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzNywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMudWxlLnMiLCAiUyxUIiwJMHg0NjAwMDAzNywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMudWxlLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDM3LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy51bGUucHMiLCJTLFQiLAkweDQ2YzAwMDM3LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy51bGUucHMiLCJNLFMsVCIsCTB4NDZjMDAwMzcsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnNmLmQiLCAgIlMsVCIsCTB4NDYyMDAwMzgsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLnNmLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDAzOCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMuc2YucyIsICAiUyxUIiwJMHg0NjAwMDAzOCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMuc2YucyIsICAiTSxTLFQiLAkweDQ2MDAwMDM4LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5zZi5wcyIsICJTLFQiLAkweDQ2YzAwMDM4LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5zZi5wcyIsICJNLFMsVCIsCTB4NDZjMDAwMzgsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLm5nbGUuZCIsIlMsVCIsCTB4NDYyMDAwMzksIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm5nbGUuZCIsIk0sUyxUIiwJMHg0NjIwMDAzOSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMubmdsZS5zIiwiUyxUIiwJMHg0NjAwMDAzOSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMubmdsZS5zIiwiTSxTLFQiLAkweDQ2MDAwMDM5LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5uZ2xlLnBzIiwiUyxUIiwJMHg0NmMwMDAzOSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubmdsZS5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzOSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMuc2VxLmQiLCAiUyxUIiwJMHg0NjIwMDAzYSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMuc2VxLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDNhLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5zZXEucyIsICJTLFQiLAkweDQ2MDAwMDNhLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5zZXEucyIsICJNLFMsVCIsCTB4NDYwMDAwM2EsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLnNlcS5wcyIsIlMsVCIsCTB4NDZjMDAwM2EsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLnNlcS5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzYSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubmdsLmQiLCAiUyxUIiwJMHg0NjIwMDAzYiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubmdsLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDNiLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5uZ2wucyIsICJTLFQiLAkweDQ2MDAwMDNiLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5uZ2wucyIsICJNLFMsVCIsCTB4NDYwMDAwM2IsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm5nbC5wcyIsIlMsVCIsCTB4NDZjMDAwM2IsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLm5nbC5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzYiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubHQuZCIsICAiUyxUIiwJMHg0NjIwMDAzYywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubHQuZCIsICAiTSxTLFQiLAkweDQ2MjAwMDNjLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5sdC5wcyIsICJTLFQiLAkweDQ2YzAwMDNjLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5sdC5wcyIsICJNLFMsVCIsCTB4NDZjMDAwM2MsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLm5nZS5kIiwgIlMsVCIsCTB4NDYyMDAwM2QsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm5nZS5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzZCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMubmdlLnMiLCAiUyxUIiwJMHg0NjAwMDAzZCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMubmdlLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDNkLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5uZ2UucHMiLCJTLFQiLAkweDQ2YzAwMDNkLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5uZ2UucHMiLCJNLFMsVCIsCTB4NDZjMDAwM2QsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNQl9LAoteyJjLmxlLmQiLCAgIlMsVCIsCTB4NDYyMDAwM2UsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLmxlLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDAzZSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMubGUucHMiLCAiUyxUIiwJMHg0NmMwMDAzZSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubGUucHMiLCAiTSxTLFQiLAkweDQ2YzAwMDNlLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiYy5uZ3QuZCIsICJTLFQiLAkweDQ2MjAwMDNmLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5uZ3QuZCIsICJNLFMsVCIsCTB4NDYyMDAwM2YsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLm5ndC5zIiwgIlMsVCIsCTB4NDYwMDAwM2YsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLm5ndC5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzZiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMubmd0LnBzIiwiUyxUIiwJMHg0NmMwMDAzZiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk1CX0sCi17ImMubmd0LnBzIiwiTSxTLFQiLAkweDQ2YzAwMDNmLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTUJfSwKLXsiY2FjaGUiLCAgICJrLG8oYikiLAkweGJjMDAwMDAwLCAweGZjMDAwMDAwLCBSRF9iLAkJSTN8VDN8TTEJfSwKLXsiY2VpbC5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwYSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17ImNlaWwubC5zIiwgIkQsUyIsCTB4NDYwMDAwMGEsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMwl9LAoteyJjZWlsLncuZCIsICJELFMiLAkweDQ2MjAwMDBlLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsiY2VpbC53LnMiLCAiRCxTIiwJMHg0NjAwMDAwZSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17ImNmYzAiLCAgICAidCxHIiwJMHg0MDQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzAsCUkxCX0sCi17ImNmYzEiLCAgICAidCxHIiwJMHg0NDQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzF8RlBfUywJSTEJfSwKLXsiY2ZjMSIsICAgICJ0LFMiLAkweDQ0NDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMXxGUF9TLAlJMQl9LAoteyJjZmMyIiwgICAgInQsRyIsCTB4NDg0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MyLAlJMQl9LAoteyJjZmMzIiwgICAgInQsRyIsCTB4NGM0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MzLAlJMQl9LAoteyJjdGMwIiwgICAgInQsRyIsCTB4NDBjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDLAlJMQl9LAoteyJjdGMxIiwgICAgInQsRyIsCTB4NDRjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDfEZQX1MsCUkxCX0sCi17ImN0YzEiLCAgICAidCxTIiwJMHg0NGMwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiY3RjMiIsICAgICJ0LEciLAkweDQ4YzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQywJSTEJfSwKLXsiY3RjMyIsICAgICJ0LEciLAkweDRjYzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQywJSTEJfSwKLXsiY3Z0LmQubCIsICJELFMiLAkweDQ2YTAwMDIxLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsiY3Z0LmQucyIsICJELFMiLAkweDQ2MDAwMDIxLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRHxGUF9TLAlJMQl9LAoteyJjdnQuZC53IiwgIkQsUyIsCTB4NDY4MDAwMjEsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoteyJjdnQubC5kIiwgIkQsUyIsCTB4NDYyMDAwMjUsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJjdnQubC5zIiwgIkQsUyIsCTB4NDYwMDAwMjUsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMwl9LAoteyJjdnQucy5sIiwgIkQsUyIsCTB4NDZhMDAwMjAsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMwl9LAoteyJjdnQucy5kIiwgIkQsUyIsCTB4NDYyMDAwMjAsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TfEZQX0QsCUkxCX0sCi17ImN2dC5zLnciLCAiRCxTIiwJMHg0NjgwMDAyMCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkxCX0sCi17ImN2dC5zLnBsIiwiRCxTIiwJMHg0NmMwMDAyOCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1N8RlBfRCwJSTUJfSwKLXsiY3Z0LnMucHUiLCJELFMiLAkweDQ2YzAwMDIwLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfU3xGUF9ELAlJNQl9LAoteyJjdnQudy5kIiwgIkQsUyIsCTB4NDYyMDAwMjQsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoteyJjdnQudy5zIiwgIkQsUyIsCTB4NDYwMDAwMjQsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoteyJjdnQucHMucyIsIkQsVixUIiwJMHg0NjAwMDAyNiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTV9LAoteyJkYWJzIiwgICAgImQsdiIsCTAsICAgIChpbnQpIE1fREFCUywJSU5TTl9NQUNSTywJSTMJfSwKLXsiZGFkZCIsICAgICJkLHYsdCIsCTB4MDAwMDAwMmMsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAlJMwl9LAoteyJkYWRkIiwgICAgInQscixJIiwJMCwgICAgKGludCkgTV9EQUREX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRhZGRpIiwgICAidCxyLGoiLAkweDYwMDAwMDAwLCAweGZjMDAwMDAwLCBXUl90fFJEX3MsCUkzCX0sCi17ImRhZGRpdSIsICAidCxyLGoiLAkweDY0MDAwMDAwLCAweGZjMDAwMDAwLCBXUl90fFJEX3MsCUkzCX0sCi17ImRhZGR1IiwgICAiZCx2LHQiLAkweDAwMDAwMDJkLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJSTMJfSwKLXsiZGFkZHUiLCAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fREFERFVfSSwJSU5TTl9NQUNSTywJSTMJfSwKLS8qIGRjdHIgYW5kIGRjdHcgYXJlIHVzZWQgb24gdGhlIHI1MDAwLiAgKi8KLXsiZGN0ciIsICAgICJvKGIpIiwJMHhiYzA1MDAwMCwgMHhmYzFmMDAwMCwgUkRfYiwJSTMJfSwKLXsiZGN0dyIsICAgICJvKGIpIiwJMHhiYzA5MDAwMCwgMHhmYzFmMDAwMCwgUkRfYiwJSTMJfSwKLXsiZGVyZXQiLCAgICIiLCAgICAgICAgIDB4NDIwMDAwMWYsIDB4ZmZmZmZmZmYsICAgIDAsCUcyfE0xCX0sCi0vKiBGb3IgZGRpdiwgc2VlIHRoZSBjb21tZW50cyBhYm91dCBkaXYuICAqLwoteyJkZGl2IiwgICAgInoscyx0IiwJMHgwMDAwMDAxZSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMwl9LAoteyJkZGl2IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ERElWXzMsCUlOU05fTUFDUk8sCUkzCX0sCi17ImRkaXYiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RESVZfM0ksCUlOU05fTUFDUk8sCUkzCX0sCi0vKiBGb3IgZGRpdnUsIHNlZSB0aGUgY29tbWVudHMgYWJvdXQgZGl2LiAgKi8KLXsiZGRpdnUiLCAgICJ6LHMsdCIsCTB4MDAwMDAwMWYsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTMJfSwKLXsiZGRpdnUiLCAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRERJVlVfMywJSU5TTl9NQUNSTywJSTMJfSwKLXsiZGRpdnUiLCAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRERJVlVfM0ksCUlOU05fTUFDUk8sCUkzCX0sCi0vKiBUaGUgTUlQUyBhc3NlbWJsZXIgdHJlYXRzIHRoZSBkaXYgb3Bjb2RlIHdpdGggdHdvIG9wZXJhbmRzIGFzCi0gICB0aG91Z2ggdGhlIGZpcnN0IG9wZXJhbmQgYXBwZWFyZWQgdHdpY2UgKHRoZSBmaXJzdCBvcGVyYW5kIGlzIGJvdGgKLSAgIGEgc291cmNlIGFuZCBhIGRlc3RpbmF0aW9uKS4gIFRvIGdldCB0aGUgZGl2IG1hY2hpbmUgaW5zdHJ1Y3Rpb24sCi0gICB5b3UgbXVzdCB1c2UgYW4gZXhwbGljaXQgZGVzdGluYXRpb24gb2YgJDAuICAqLwoteyJkaXYiLCAgICAgInoscyx0IiwJMHgwMDAwMDAxYSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMQl9LAoteyJkaXYiLCAgICAgInosdCIsCTB4MDAwMDAwMWEsIDB4ZmZlMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEJfSwKLXsiZGl2IiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRElWXzMsCUlOU05fTUFDUk8sCUkxCX0sCi17ImRpdiIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RJVl8zSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiZGl2LmQiLCAgICJELFYsVCIsCTB4NDYyMDAwMDMsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUkxCX0sCi17ImRpdi5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAzLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAlJMQl9LAotLyogRm9yIGRpdnUsIHNlZSB0aGUgY29tbWVudHMgYWJvdXQgZGl2LiAgKi8KLXsiZGl2dSIsICAgICJ6LHMsdCIsCTB4MDAwMDAwMWIsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEJfSwKLXsiZGl2dSIsICAgICJ6LHQiLAkweDAwMDAwMDFiLCAweGZmZTBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxCX0sCi17ImRpdnUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RJVlVfMywJSU5TTl9NQUNSTywJSTEJfSwKLXsiZGl2dSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRElWVV8zSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiZGxhIiwgICAgICJ0LG8oYikiLAkweDY0MDAwMDAwLCAweGZjMDAwMDAwLCBXUl90fFJEX3MsCUkzCX0sIC8qIGRhZGRpdSAqLwoteyJkbGEiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fRExBX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbGkiLCAgICAgInQsaiIsICAgICAgMHgyNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCwJSTMJfSwgLyogYWRkaXUgKi8KLXsiZGxpIiwJICAgICJ0LGkiLAkweDM0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90LAlJMwl9LCAvKiBvcmkgKi8KLXsiZGxpIiwgICAgICJ0LEkiLAkwLCAgICAoaW50KSBNX0RMSSwJSU5TTl9NQUNSTywJSTMJfSwKLQoteyJkbWFkZDE2IiwgInMsdCIsICAgICAgMHgwMDAwMDAyOSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0xPfFJEX0xPLAlWMQl9LAoteyJkbWZjMCIsICAgInQsRyIsCTB4NDAyMDAwMDAsIDB4ZmZlMDA3ZmYsIExDRHxXUl90fFJEX0MwLAlJMwl9LAoteyJkbXRjMCIsICAgInQsRyIsCTB4NDBhMDAwMDAsIDB4ZmZlMDA3ZmYsIENPRHxSRF90fFdSX0MwfFdSX0NDLAlJMwl9LAoteyJkbWZjMSIsICAgInQsUyIsCTB4NDQyMDAwMDAsIDB4ZmZlMDA3ZmYsIExDRHxXUl90fFJEX1N8RlBfUywJSTMJfSwKLXsiZG10YzEiLCAgICJ0LFMiLAkweDQ0YTAwMDAwLCAweGZmZTAwN2ZmLCBDT0R8UkRfdHxXUl9TfEZQX1MsCUkzCX0sCi17ImRtZmMyIiwgICAidCxTIiwJMHg0ODIwMDAwMCwgMHhmZmUwMDdmZiwgTENEfFdSX3R8UkRfU3xGUF9TLAlJMwl9LAoteyJkbXRjMiIsICAgInQsUyIsCTB4NDhhMDAwMDAsIDB4ZmZlMDA3ZmYsIENPRHxSRF90fFdSX1N8RlBfUywJSTMJfSwKLXsiZG11bCIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRE1VTCwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZG11bCIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRE1VTF9JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsbyIsICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ETVVMTywJSU5TTl9NQUNSTywJSTMJfSwKLXsiZG11bG8iLCAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRE1VTE9fSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZG11bG91IiwgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRE1VTE9VLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsb3UiLCAgImQsdixJIiwJMCwgICAgKGludCkgTV9ETVVMT1VfSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZG11bHQiLCAgICJzLHQiLAkweDAwMDAwMDFjLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCSAgICBJM30sCi17ImRtdWx0dSIsICAicyx0IiwJMHgwMDAwMDAxZCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLCAgICAgIEkzfSwKLXsiZG5lZyIsICAgICJkLHciLAkweDAwMDAwMDJlLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCUkzCX0sIC8qIGRzdWIgMCAqLwoteyJkbmVndSIsICAgImQsdyIsCTB4MDAwMDAwMmYsIDB4ZmZlMDA3ZmYsCVdSX2R8UkRfdCwJSTMJfSwgLyogZHN1YnUgMCovCi17ImRyZW0iLCAgICAieixzLHQiLAkweDAwMDAwMDFlLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkzCX0sCi17ImRyZW0iLCAgICAiZCx2LHQiLAkzLCAgICAoaW50KSBNX0RSRU1fMywJSU5TTl9NQUNSTywJSTMJfSwKLXsiZHJlbSIsICAgICJkLHYsSSIsCTMsICAgIChpbnQpIE1fRFJFTV8zSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZHJlbXUiLCAgICJ6LHMsdCIsCTB4MDAwMDAwMWYsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTMJfSwKLXsiZHJlbXUiLCAgICJkLHYsdCIsCTMsICAgIChpbnQpIE1fRFJFTVVfMywJSU5TTl9NQUNSTywJSTMJfSwKLXsiZHJlbXUiLCAgICJkLHYsSSIsCTMsICAgIChpbnQpIE1fRFJFTVVfM0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRzbGx2IiwgICAiZCx0LHMiLAkweDAwMDAwMDE0LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwKLXsiZHNsbDMyIiwgICJkLHcsPCIsCTB4MDAwMDAwM2MsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwKLXsiZHNsbCIsICAgICJkLHcscyIsCTB4MDAwMDAwMTQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LCAvKiBkc2xsdiAqLwoteyJkc2xsIiwgICAgImQsdyw+IiwJMHgwMDAwMDAzYywgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LCAvKiBkc2xsMzIgKi8KLXsiZHNsbCIsICAgICJkLHcsPCIsCTB4MDAwMDAwMzgsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTMJfSwKLXsiZHNyYXYiLCAgICJkLHQscyIsCTB4MDAwMDAwMTcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LAoteyJkc3JhMzIiLCAgImQsdyw8IiwJMHgwMDAwMDAzZiwgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LAoteyJkc3JhIiwgICAgImQsdyxzIiwJMHgwMDAwMDAxNywgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sIC8qIGRzcmF2ICovCi17ImRzcmEiLCAgICAiZCx3LD4iLAkweDAwMDAwMDNmLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sIC8qIGRzcmEzMiAqLwoteyJkc3JhIiwgICAgImQsdyw8IiwJMHgwMDAwMDAzYiwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMwl9LAoteyJkc3JsdiIsICAgImQsdCxzIiwJMHgwMDAwMDAxNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sCi17ImRzcmwzMiIsICAiZCx3LDwiLAkweDAwMDAwMDNlLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sCi17ImRzcmwiLCAgICAiZCx3LHMiLAkweDAwMDAwMDE2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwgLyogZHNybHYgKi8KLXsiZHNybCIsICAgICJkLHcsPiIsCTB4MDAwMDAwM2UsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwgLyogZHNybDMyICovCi17ImRzcmwiLCAgICAiZCx3LDwiLAkweDAwMDAwMDNhLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkzCX0sCi17ImRzdWIiLCAgICAiZCx2LHQiLAkweDAwMDAwMDJlLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTMJfSwKLXsiZHN1YiIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRFNVQl9JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkc3VidSIsICAgImQsdix0IiwJMHgwMDAwMDAyZiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkzCX0sCi17ImRzdWJ1IiwgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RTVUJVX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImVyZXQiLCAgICAiIiwJCTB4NDIwMDAwMTgsIDB4ZmZmZmZmZmYsCTAsCUkzfE0xCX0sCi17ImZsb29yLmwuZCIsICJELFMiLAkweDQ2MjAwMDBiLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsiZmxvb3IubC5zIiwgIkQsUyIsCTB4NDYwMDAwMGIsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMwl9LAoteyJmbG9vci53LmQiLCAiRCxTIiwJMHg0NjIwMDAwZiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17ImZsb29yLncucyIsICJELFMiLAkweDQ2MDAwMDBmLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsiZmx1c2hpIiwgICIiLAkJMHhiYzAxMDAwMCwgMHhmZmZmZmZmZiwgMCwJCUwxCX0sCi17ImZsdXNoZCIsICAiIiwJCTB4YmMwMjAwMDAsIDB4ZmZmZmZmZmYsIDAsIEwxCQl9LAoteyJmbHVzaGlkIiwgIiIsCQkweGJjMDMwMDAwLCAweGZmZmZmZmZmLCAwLCBMMQkJfSwKLXsiaGliZXJuYXRlIiwiIiwgICAgICAgIDB4NDIwMDAwMjMsIDB4ZmZmZmZmZmYsCTAsIFYxCX0sCi17ImpyIiwgICAgICAicyIsCTB4MDAwMDAwMDgsIDB4ZmMxZmZmZmYsCVVCRHxSRF9zLAlJMQl9LAoteyJqIiwgICAgICAgInMiLAkweDAwMDAwMDA4LCAweGZjMWZmZmZmLAlVQkR8UkRfcywJSTEJfSwgLyoganIgKi8KLS8qIFNWUjQgUElDIGNvZGUgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyBmb3Igaiwgc28gaXQgbXVzdCBiZSBhCi0gICBtYWNyby4gICovCi17ImoiLAkgICAgImEiLAkwLCAgICAgKGludCkgTV9KX0EsCUlOU05fTUFDUk8sCUkxCX0sCi0vKiBUaGlzIGZvcm0gb2YgaiBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIgYW5kIGludGVybmFsbHkgYnkgdGhlCi0gICBhc3NlbWJsZXIsIGJ1dCB3aWxsIG5ldmVyIG1hdGNoIHVzZXIgaW5wdXQgKGJlY2F1c2UgdGhlIGxpbmUgYWJvdmUKLSAgIHdpbGwgbWF0Y2ggZmlyc3QpLiAgKi8KLXsiaiIsICAgICAgICJhIiwJMHgwODAwMDAwMCwgMHhmYzAwMDAwMCwJVUJELAkJSTEJfSwKLXsiamFsciIsICAgICJzIiwJMHgwMDAwZjgwOSwgMHhmYzFmZmZmZiwJVUJEfFJEX3N8V1JfZCwJSTEJfSwKLXsiamFsciIsICAgICJkLHMiLAkweDAwMDAwMDA5LCAweGZjMWYwN2ZmLAlVQkR8UkRfc3xXUl9kLAlJMQl9LAotLyogU1ZSNCBQSUMgY29kZSByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nIGZvciBqYWwsIHNvIGl0IG11c3QgYmUgYQotICAgbWFjcm8uICAqLwoteyJqYWwiLCAgICAgImQscyIsCTAsICAgICAoaW50KSBNX0pBTF8yLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJqYWwiLCAgICAgInMiLAkwLCAgICAgKGludCkgTV9KQUxfMSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiamFsIiwgICAgICJhIiwJMCwgICAgIChpbnQpIE1fSkFMX0EsCUlOU05fTUFDUk8sCUkxCX0sCi0vKiBUaGlzIGZvcm0gb2YgamFsIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlciBhbmQgaW50ZXJuYWxseSBieSB0aGUKLSAgIGFzc2VtYmxlciwgYnV0IHdpbGwgbmV2ZXIgbWF0Y2ggdXNlciBpbnB1dCAoYmVjYXVzZSB0aGUgbGluZSBhYm92ZQotICAgd2lsbCBtYXRjaCBmaXJzdCkuICAqLwoteyJqYWwiLCAgICAgImEiLAkweDBjMDAwMDAwLCAweGZjMDAwMDAwLAlVQkR8V1JfMzEsCUkxCX0sCi0gIC8qIGphbHggcmVhbGx5IHNob3VsZCBvbmx5IGJlIGF2YWxpYWJsZSBpZiBtaXBzMTYgaXMgYXZhaWxhYmxlLAotICAgICBidXQgZm9yIG5vdyBtYWtlIGl0IEkxLiAqLwoteyJqYWx4IiwgICAgImEiLAkweDc0MDAwMDAwLCAweGZjMDAwMDAwLCBVQkR8V1JfMzEsCUkxICAgICAgfSwKLXsibGEiLCAgICAgICJ0LG8oYikiLAkweDI0MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sIC8qIGFkZGl1ICovCi17ImxhIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MQV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGIiLCAgICAgICJ0LG8oYikiLAkweDgwMDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsYiIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEJfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxidSIsICAgICAidCxvKGIpIiwJMHg5MDAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibGJ1IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xCVV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGQiLAkgICAgInQsbyhiKSIsICAgMHhkYzAwMDAwMCwgMHhmYzAwMDAwMCwgV1JfdHxSRF9iLAlJMwl9LAoteyJsZCIsICAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fTERfT0IsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxkIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MRF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGRjMSIsICAgICJULG8oYikiLAkweGQ0MDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9UfEZQX0QsCUkyCX0sCi17ImxkYzEiLCAgICAiRSxvKGIpIiwJMHhkNDAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfVHxGUF9ELAlJMgl9LAoteyJsZGMxIiwgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fTERDMV9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsibGRjMSIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xEQzFfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17ImwuZCIsICAgICAiVCxvKGIpIiwJMHhkNDAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfVHxGUF9ELAlJMgl9LCAvKiBsZGMxICovCi17ImwuZCIsICAgICAiVCxvKGIpIiwJMCwgICAgKGludCkgTV9MX0RPQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibC5kIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX0xfREFCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsZGMyIiwgICAgIkUsbyhiKSIsCTB4ZDgwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX0NDLAlJMgl9LAoteyJsZGMyIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTERDMl9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsibGRjMyIsICAgICJFLG8oYikiLAkweGRjMDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9DQywJSTIJfSwKLXsibGRjMyIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xEQzNfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17ImxkbCIsCSAgICAidCxvKGIpIiwJMHg2ODAwMDAwMCwgMHhmYzAwMDAwMCwgTEREfFdSX3R8UkRfYiwJSTMJfSwKLXsibGRsIiwJICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xETF9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsibGRyIiwJICAgICJ0LG8oYikiLAkweDZjMDAwMDAwLCAweGZjMDAwMDAwLCBMRER8V1JfdHxSRF9iLAlJMwl9LAoteyJsZHIiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTERSX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJsZHhjMSIsICAgIkQsdChiKSIsCTB4NGMwMDAwMDEsIDB4ZmMwMGY4M2YsIExERHxXUl9EfFJEX3R8UkRfYiwJSTQJfSwKLXsibGgiLCAgICAgICJ0LG8oYikiLAkweDg0MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsaCIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEhfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxodSIsICAgICAidCxvKGIpIiwJMHg5NDAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibGh1IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xIVV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLS8qIGxpIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgdGFibGUuICAqLwoteyJsaS5kIiwgICAgInQsRiIsCTAsICAgIChpbnQpIE1fTElfRCwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGkuZCIsICAgICJULEwiLAkwLCAgICAoaW50KSBNX0xJX0RELAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsaS5zIiwgICAgInQsZiIsCTAsICAgIChpbnQpIE1fTElfUywJSU5TTl9NQUNSTywJSTEJfSwKLXsibGkucyIsICAgICJULGwiLAkwLCAgICAoaW50KSBNX0xJX1NTLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsbCIsCSAgICAidCxvKGIpIiwJMHhjMDAwMDAwMCwgMHhmYzAwMDAwMCwgTEREfFJEX2J8V1JfdCwJSTIJfSwKLXsibGwiLAkgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTExfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17ImxsZCIsCSAgICAidCxvKGIpIiwJMHhkMDAwMDAwMCwgMHhmYzAwMDAwMCwgTEREfFJEX2J8V1JfdCwJSTMJfSwKLXsibGxkIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xMRF9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsibHVpIiwgICAgICJ0LHUiLAkweDNjMDAwMDAwLCAweGZmZTAwMDAwLAlXUl90LAkJSTEJfSwKLXsibHV4YzEiLCAgICJELHQoYikiLAkweDRjMDAwMDA1LCAweGZjMDBmODNmLCBMRER8V1JfRHxSRF90fFJEX2IsCUk1CX0sCi17Imx3IiwgICAgICAidCxvKGIpIiwJMHg4YzAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibHciLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2MwIiwgICAgIkUsbyhiKSIsCTB4YzAwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX0NDLAlJMQl9LAoteyJsd2MwIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDMF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibHdjMSIsICAgICJULG8oYikiLAkweGM0MDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9UfEZQX1MsCUkxCX0sCi17Imx3YzEiLCAgICAiRSxvKGIpIiwJMHhjNDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfVHxGUF9TLAlJMQl9LAoteyJsd2MxIiwgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibHdjMSIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImwucyIsICAgICAiVCxvKGIpIiwJMHhjNDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfVHxGUF9TLAlJMQl9LCAvKiBsd2MxICovCi17ImwucyIsICAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2MyIiwgICAgIkUsbyhiKSIsCTB4YzgwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX0NDLAlJMQl9LAoteyJsd2MyIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDMl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibHdjMyIsICAgICJFLG8oYikiLAkweGNjMDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9DQywJSTEJfSwKLXsibHdjMyIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzNfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3bCIsICAgICAidCxvKGIpIiwJMHg4ODAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKLXsibHdsIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXTF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGNhY2hlIiwgICJ0LG8oYikiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMgl9LCAvKiBzYW1lICovCi17ImxjYWNoZSIsICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV0xfQUIsCUlOU05fTUFDUk8sCUkyCX0sIC8qIGFzIGx3bCAqLwoteyJsd3IiLCAgICAgInQsbyhiKSIsCTB4OTgwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17Imx3ciIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV1JfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImZsdXNoIiwgICAidCxvKGIpIiwJMHg5ODAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTIJfSwgLyogc2FtZSAqLwoteyJmbHVzaCIsICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdSX0FCLAlJTlNOX01BQ1JPLAlJMgl9LCAvKiBhcyBsd3IgKi8KLXsibHd1IiwgICAgICJ0LG8oYikiLAkweDljMDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMwl9LAoteyJsd3UiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdVX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJsd3hjMSIsICAgIkQsdChiKSIsCTB4NGMwMDAwMDAsIDB4ZmMwMGY4M2YsIExERHxXUl9EfFJEX3R8UkRfYiwJSTQJfSwKLQotCi17Im1hZCIsCSAgICAicyx0IiwJMHg3MDAwMDAwMCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFJEX0hJfFJEX0xPLAlQMwl9LAoteyJtYWR1IiwgICAgInMsdCIsCTB4NzAwMDAwMDEsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xSRF9ISXxSRF9MTywJUDMJfSwKLXsibWFkZC5kIiwgICJELFIsUyxUIiwJMHg0YzAwMDAyMSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNAl9LAoteyJtYWRkLnMiLCAgIkQsUixTLFQiLAkweDRjMDAwMDIwLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX1MsCUk0CX0sCi17Im1hZGQucHMiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMjYsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTUJfSwKLXsibWFkZCIsICAgICJzLHQiLAkweDAwMDAwMDFjLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCQlMMQl9LAoteyJtYWRkIiwgICAgInMsdCIsCTB4NzAwMDAwMDAsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xJU19NLAkgICAgICAgIEcxfE0xCX0sCi17Im1hZGQiLCAgICAiZCxzLHQiLAkweDcwMDAwMDAwLCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98V1JfZHxJU19NLAlHMQl9LAoteyJtYWRkdSIsICAgInMsdCIsCTB4MDAwMDAwMWQsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJCUwxCX0sCi17Im1hZGR1IiwgICAicyx0IiwJMHg3MDAwMDAwMSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfElTX00sCUcxfE0xfSwKLXsibWFkZHUiLCAgICJkLHMsdCIsCTB4NzAwMDAwMDEsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xXUl9kfElTX00sCUcxfSwKLXsibWFkZDE2IiwgICJzLHQiLCAgICAgIDB4MDAwMDAwMjgsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISXxXUl9MT3xSRF9ISXxSRF9MTywJVjEJfSwKLXsibWZjMCIsICAgICJ0LEciLAkweDQwMDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMCwJSTEJfSwKLXsibWZjMSIsICAgICJ0LFMiLAkweDQ0MDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9TfEZQX1MsCUkxCX0sCi17Im1mYzEiLCAgICAidCxHIiwJMHg0NDAwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfU3xGUF9TLAlJMQl9LAoteyJtZmMyIiwgICAgInQsRyIsCTB4NDgwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MyLAlJMQl9LAoteyJtZmMzIiwgICAgInQsRyIsCTB4NGMwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MzLAlJMQl9LAoteyJtZmhpIiwgICAgImQiLAkweDAwMDAwMDEwLCAweGZmZmYwN2ZmLAlXUl9kfFJEX0hJLAlJMQl9LAoteyJtZmxvIiwgICAgImQiLAkweDAwMDAwMDEyLCAweGZmZmYwN2ZmLAlXUl9kfFJEX0xPLAlJMQl9LAoteyJtb3YuZCIsICAgIkQsUyIsCTB4NDYyMDAwMDYsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoteyJtb3YucyIsICAgIkQsUyIsCTB4NDYwMDAwMDYsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoteyJtb3YucHMiLCAgIkQsUyIsCTB4NDZjMDAwMDYsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJNQl9LAoteyJtb3ZmIiwgICAgImQscyxOIiwJMHgwMDAwMDAwMSwgMHhmYzAzMDdmZiwgV1JfZHxSRF9zfFJEX0NDfEZQX0R8RlBfUywgSTR8TTF9LAoteyJtb3ZmLmQiLCAgIkQsUyxOIiwJMHg0NjIwMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX0QsCUk0fE0xCX0sCi17Im1vdmYucyIsICAiRCxTLE4iLAkweDQ2MDAwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfUywJSTR8TTEJfSwKLXsibW92Zi5wcyIsICJELFMsTiIsCTB4NDZjMDAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELAlJNQl9LAoteyJtb3ZuIiwgICAgImQsdix0IiwJMHgwMDAwMDAwYiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUk0fE0xCX0sCi17ImZmYyIsICAgICAiZCx2IiwJMHgwMDAwMDAwYiwgMHhmYzFmMDdmZiwJV1JfZHxSRF9zLEwxCX0sCi17Im1vdm4uZCIsICAiRCxTLHQiLAkweDQ2MjAwMDEzLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfdHxGUF9ELAlJNHxNMQl9LAoteyJtb3ZuLnMiLCAgIkQsUyx0IiwJMHg0NjAwMDAxMywgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX3R8RlBfUywJSTR8TTEJfSwKLXsibW92dCIsICAgICJkLHMsTiIsCTB4MDAwMTAwMDEsIDB4ZmMwMzA3ZmYsIFdSX2R8UkRfc3xSRF9DQywJSTR8TTEJfSwKLXsibW92dC5kIiwgICJELFMsTiIsCTB4NDYyMTAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELAlJNHxNMQl9LAoteyJtb3Z0LnMiLCAgIkQsUyxOIiwJMHg0NjAxMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX1MsCUk0fE0xCX0sCi17Im1vdnQucHMiLCAiRCxTLE4iLAkweDQ2YzEwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfRCwJSTV9LAoteyJtb3Z6IiwgICAgImQsdix0IiwJMHgwMDAwMDAwYSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUk0fE0xCX0sCi17ImZmcyIsICAgICAiZCx2IiwJMHgwMDAwMDAwYSwgMHhmYzFmMDdmZiwJV1JfZHxSRF9zLEwxCX0sCi17Im1vdnouZCIsICAiRCxTLHQiLAkweDQ2MjAwMDEyLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfdHxGUF9ELAlJNHxNMQl9LAoteyJtb3Z6LnMiLCAgIkQsUyx0IiwJMHg0NjAwMDAxMiwgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX3R8RlBfUywJSTR8TTEJfSwKLS8qIG1vdmUgaXMgYXQgdGhlIHRvcCBvZiB0aGUgdGFibGUuICAqLwoteyJtc3ViLmQiLCAgIkQsUixTLFQiLAkweDRjMDAwMDI5LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk0CX0sCi17Im1zdWIucyIsICAiRCxSLFMsVCIsCTB4NGMwMDAwMjgsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfUywJSTQJfSwKLXsibXN1Yi5wcyIsICJELFIsUyxUIiwJMHg0YzAwMDAyZSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNQl9LAoteyJtc3ViIiwgICAgInMsdCIsCTB4MDAwMDAwMWUsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTyxMMQl9LAoteyJtc3VidSIsICAgInMsdCIsCTB4MDAwMDAwMWYsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTyxMMQl9LAoteyJtdGMwIiwgICAgInQsRyIsCTB4NDA4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0MwfFdSX0NDLAlJMQl9LAoteyJtdGMxIiwgICAgInQsUyIsCTB4NDQ4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX1N8RlBfUywJSTEJfSwKLXsibXRjMSIsICAgICJ0LEciLAkweDQ0ODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9TfEZQX1MsCUkxCX0sCi17Im10YzIiLCAgICAidCxHIiwJMHg0ODgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQzJ8V1JfQ0MsCUkxCX0sCi17Im10YzMiLCAgICAidCxHIiwJMHg0YzgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQzN8V1JfQ0MsCUkxCX0sCi17Im10aGkiLCAgICAicyIsCTB4MDAwMDAwMTEsIDB4ZmMxZmZmZmYsCVJEX3N8V1JfSEksCUkxCX0sCi17Im10bG8iLCAgICAicyIsCTB4MDAwMDAwMTMsIDB4ZmMxZmZmZmYsCVJEX3N8V1JfTE8sCUkxCX0sCi17Im11bC5kIiwgICAiRCxWLFQiLAkweDQ2MjAwMDAyLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJMQl9LAoteyJtdWwucyIsICAgIkQsVixUIiwJMHg0NjAwMDAwMiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfUywJSTEJfSwKLXsibXVsLnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMDIsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1CX0sCi17Im11bCIsICAgICAiZCx2LHQiLAkweDcwMDAwMDAyLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdHxXUl9ISXxXUl9MTyxQM30sCi17Im11bCIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX01VTCwJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fTVVMX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bG8iLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX01VTE8sCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bG8iLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX01VTE9fSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsb3UiLCAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fTVVMT1UsCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bG91IiwgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX01VTE9VX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bHQiLCAgICAicyx0IiwJMHgwMDAwMDAxOCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfElTX00sCUkxfSwKLXsibXVsdCIsICAgICJkLHMsdCIsCTB4MDAwMDAwMTgsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xXUl9kfElTX00sIEcxfSwKLXsibXVsdHUiLCAgICJzLHQiLAkweDAwMDAwMDE5LCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98SVNfTSwJSTF9LAoteyJtdWx0dSIsICAgImQscyx0IiwJMHgwMDAwMDAxOSwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFdSX2R8SVNfTSwgRzF9LAoteyJuZWciLCAgICAgImQsdyIsCTB4MDAwMDAwMjIsIDB4ZmZlMDA3ZmYsCVdSX2R8UkRfdCwJSTEJfSwgLyogc3ViIDAgKi8KLXsibmVndSIsICAgICJkLHciLAkweDAwMDAwMDIzLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCUkxCX0sIC8qIHN1YnUgMCAqLwoteyJuZWcuZCIsICAgIkQsViIsCTB4NDYyMDAwMDcsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoteyJuZWcucyIsICAgIkQsViIsCTB4NDYwMDAwMDcsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoteyJuZWcucHMiLCAgIkQsViIsCTB4NDZjMDAwMDcsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELEk1CX0sCi17Im5tYWRkLmQiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMzEsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTQJfSwKLXsibm1hZGQucyIsICJELFIsUyxUIiwJMHg0YzAwMDAzMCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLAlJNAl9LAoteyJubWFkZC5wcyIsIkQsUixTLFQiLAkweDRjMDAwMDM2LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk1CX0sCi17Im5tc3ViLmQiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMzksIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTQJfSwKLXsibm1zdWIucyIsICJELFIsUyxUIiwJMHg0YzAwMDAzOCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLAlJNAl9LAoteyJubXN1Yi5wcyIsIkQsUixTLFQiLAkweDRjMDAwMDNlLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk1CX0sCi0vKiBub3AgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0YWJsZS4gICovCi17Im5vciIsICAgICAiZCx2LHQiLAkweDAwMDAwMDI3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsibm9yIiwgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fTk9SX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im5vdCIsICAgICAiZCx2IiwJMHgwMDAwMDAyNywgMHhmYzFmMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sLypub3IgZCxzLDAqLwoteyJvciIsICAgICAgImQsdix0IiwJMHgwMDAwMDAyNSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17Im9yIiwgICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX09SX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im9yaSIsICAgICAidCxyLGkiLAkweDM0MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi0KLXsicGxsLnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMmMsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1fSwKLXsicGx1LnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMmQsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1fSwKLQoteyJwcmVmIiwgICAgImssbyhiKSIsCTB4Y2MwMDAwMDAsIDB4ZmMwMDAwMDAsIFJEX2IsCQlHM3xNMQl9LAoteyJwcmVmeCIsICAgImgsdChiKSIsCTB4NGMwMDAwMGYsIDB4ZmMwMDA3ZmYsIFJEX2J8UkRfdCwJSTQJfSwKLQoteyJwdWwucHMiLCAgIkQsVixUIiwJMHg0NmMwMDAyZSwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTV9LAoteyJwdXUucHMiLCAgIkQsVixUIiwJMHg0NmMwMDAyZiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTV9LAotCi17InJlY2lwLmQiLCAiRCxTIiwJMHg0NjIwMDAxNSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUk0CX0sCi17InJlY2lwLnMiLCAiRCxTIiwJMHg0NjAwMDAxNSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUk0CX0sCi17InJlbSIsICAgICAieixzLHQiLAkweDAwMDAwMDFhLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxIH0sCi17InJlbSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JFTV8zLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyZW0iLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9SRU1fM0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InJlbXUiLCAgICAieixzLHQiLAkweDAwMDAwMDFiLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxIH0sCi17InJlbXUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JFTVVfMywJSU5TTl9NQUNSTywJSTEJfSwKLXsicmVtdSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUkVNVV8zSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsicmZlIiwgICAgICIiLAkJMHg0MjAwMDAxMCwgMHhmZmZmZmZmZiwJMCwJSTF8VDMJCX0sCi17InJvbCIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JPTCwJSU5TTl9NQUNSTywJSTEJfSwKLXsicm9sIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUk9MX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InJvciIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JPUiwJSU5TTl9NQUNSTywJSTEJfSwKLXsicm9yIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUk9SX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InJvdW5kLmwuZCIsICJELFMiLAkweDQ2MjAwMDA4LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsicm91bmQubC5zIiwgIkQsUyIsCTB4NDYwMDAwMDgsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMwl9LAoteyJyb3VuZC53LmQiLCAiRCxTIiwJMHg0NjIwMDAwYywgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17InJvdW5kLncucyIsICJELFMiLAkweDQ2MDAwMDBjLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsicnNxcnQuZCIsICJELFMiLAkweDQ2MjAwMDE2LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTQJfSwKLXsicnNxcnQucyIsICJELFMiLAkweDQ2MDAwMDE2LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTQJfSwKLXsic2IiLCAgICAgICJ0LG8oYikiLAkweGEwMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkxCX0sCi17InNiIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TQl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2MiLAkgICAgInQsbyhiKSIsCTB4ZTAwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX3R8V1JfdHxSRF9iLAlJMgl9LAoteyJzYyIsCSAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TQ19BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsic2NkIiwJICAgICJ0LG8oYikiLAkweGYwMDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF90fFdSX3R8UkRfYiwJSTMJfSwKLXsic2NkIiwJICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NDRF9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsic2QiLAkgICAgInQsbyhiKSIsCTB4ZmMwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTMJfSwKLXsic2QiLCAgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1NEX09CLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZCIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0RfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InNkYmJwIiwgICAiIiwJCTB4MDAwMDAwMGUsIDB4ZmZmZmZmZmYsCVRSQVAsICAgICAgICAgICBHMnxNMQl9LAoteyJzZGJicCIsICAgImMiLAkweDAwMDAwMDBlLCAweGZjMDBmZmZmLAlUUkFQLAkJRzJ8TTEJfSwKLXsic2RiYnAiLCAgICJjLHEiLAkweDAwMDAwMDBlLCAweGZjMDAwMDNmLAlUUkFQLAkJRzJ8TTEJfSwKLXsic2RjMSIsICAgICJULG8oYikiLAkweGY0MDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9UfFJEX2J8RlBfRCwJSTIJfSwKLXsic2RjMSIsICAgICJFLG8oYikiLAkweGY0MDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9UfFJEX2J8RlBfRCwJSTIJfSwKLXsic2RjMSIsICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX1NEQzFfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17InNkYzEiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TREMxX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJzZGMyIiwgICAgIkUsbyhiKSIsCTB4ZjgwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX0MyfFJEX2IsCUkyCX0sCi17InNkYzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TREMyX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJzZGMzIiwgICAgIkUsbyhiKSIsCTB4ZmMwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX0MzfFJEX2IsCUkyCX0sCi17InNkYzMiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TREMzX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJzLmQiLCAgICAgIlQsbyhiKSIsCTB4ZjQwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX1R8UkRfYnxGUF9ELAlJMgl9LAoteyJzLmQiLCAgICAgIlQsbyhiKSIsCTAsICAgIChpbnQpIE1fU19ET0IsCUlOU05fTUFDUk8sCUkxCX0sCi17InMuZCIsICAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9TX0RBQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2RsIiwgICAgICJ0LG8oYikiLAkweGIwMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkzCX0sCi17InNkbCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TRExfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17InNkciIsICAgICAidCxvKGIpIiwJMHhiNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMwl9LAoteyJzZHIiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0RSX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJzZHhjMSIsICAgIlMsdChiKSIsICAgMHg0YzAwMDAwOSwgMHhmYzAwMDdmZiwgU018UkRfU3xSRF90fFJEX2IsCUk0CX0sCi17InNlbHNsIiwgICAiZCx2LHQiLAkweDAwMDAwMDA1LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCxMMQl9LAoteyJzZWxzciIsICAgImQsdix0IiwJMHgwMDAwMDAwMSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsTDEJfSwKLXsic2VxIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0VRLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZXEiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TRVFfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2dlIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0dFLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ2UiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TR0VfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2dldSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0dFVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2dldSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0dFVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ3QiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TR1QsCUlOU05fTUFDUk8sCUkxCX0sCi17InNndCIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NHVF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ3R1IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TR1RVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ3R1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TR1RVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNoIiwgICAgICAidCxvKGIpIiwJMHhhNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoteyJzaCIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0hfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InNsZSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NMRSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2xlIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0xFX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNsZXUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NMRVUsCUlOU05fTUFDUk8sCUkxCX0sCi17InNsZXUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NMRVVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2xsdiIsICAgICJkLHQscyIsCTB4MDAwMDAwMDQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LAoteyJzbGwiLCAgICAgImQsdyxzIiwJMHgwMDAwMDAwNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sIC8qIHNsbHYgKi8KLXsic2xsIiwgICAgICJkLHcsPCIsCTB4MDAwMDAwMDAsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTEJfSwKLXsic2x0IiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMmEsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJzbHQiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTFRfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2x0aSIsICAgICJ0LHIsaiIsCTB4MjgwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsic2x0aXUiLCAgICJ0LHIsaiIsCTB4MmMwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsic2x0dSIsICAgICJkLHYsdCIsCTB4MDAwMDAwMmIsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJzbHR1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTFRVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNuZSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NORSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic25lIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU05FX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNxcnQuZCIsICAiRCxTIiwJMHg0NjIwMDAwNCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17InNxcnQucyIsICAiRCxTIiwJMHg0NjAwMDAwNCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17InNyYXYiLCAgICAiZCx0LHMiLAkweDAwMDAwMDA3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwKLXsic3JhIiwgICAgICJkLHcscyIsCTB4MDAwMDAwMDcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LCAvKiBzcmF2ICovCi17InNyYSIsICAgICAiZCx3LDwiLAkweDAwMDAwMDAzLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkxCX0sCi17InNybHYiLCAgICAiZCx0LHMiLAkweDAwMDAwMDA2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwKLXsic3JsIiwgICAgICJkLHcscyIsCTB4MDAwMDAwMDYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LCAvKiBzcmx2ICovCi17InNybCIsICAgICAiZCx3LDwiLAkweDAwMDAwMDAyLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkxCX0sCi17InNzbm9wIiwgICAgICIiLAkweDAwMDAwMDQwLCAweGZmZmZmZmZmLAkwLAkJTTEJfSwKLXsic3RhbmRieSIsICIiLCAgICAgICAgIDB4NDIwMDAwMjEsIDB4ZmZmZmZmZmYsCTAsCQlWMQl9LAoteyJzdWIiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyMiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17InN1YiIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NVQl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzdWIuZCIsICAgIkQsVixUIiwJMHg0NjIwMDAwMSwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTEJfSwgICAgIAoteyJzdWIucyIsICAgIkQsVixUIiwJMHg0NjAwMDAwMSwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfUywJSTEJfSwKLXsic3ViLnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMDEsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUk1CX0sCi17InN1YnUiLCAgICAiZCx2LHQiLAkweDAwMDAwMDIzLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsic3VidSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU1VCVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzdXNwZW5kIiwgIiIsICAgICAgICAgMHg0MjAwMDAyMiwgMHhmZmZmZmZmZiwJMCwJCVYxCX0sCi17InN1eGMxIiwgICAiUyx0KGIpIiwgICAweDRjMDAwMDBkLCAweGZjMDAwN2ZmLCBTTXxSRF9TfFJEX3R8UkRfYiwJSTUJfSwKLXsic3ciLCAgICAgICJ0LG8oYikiLAkweGFjMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkxCX0sCi17InN3IiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TV19BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3djMCIsICAgICJFLG8oYikiLAkweGUwMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9DMHxSRF9iLAlJMQl9LAoteyJzd2MwIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3djMSIsICAgICJULG8oYikiLAkweGU0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9UfFJEX2J8RlBfUywJSTEJfSwKLXsic3djMSIsICAgICJFLG8oYikiLAkweGU0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9UfFJEX2J8RlBfUywJSTEJfSwKLXsic3djMSIsICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InN3YzEiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzLnMiLCAgICAgIlQsbyhiKSIsCTB4ZTQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX1R8UkRfYnxGUF9TLAlJMQl9LCAvKiBzd2MxICovCi17InMucyIsICAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2MyIiwgICAgIkUsbyhiKSIsCTB4ZTgwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX0MyfFJEX2IsCUkxCX0sCi17InN3YzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MyX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2MzIiwgICAgIkUsbyhiKSIsCTB4ZWMwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX0MzfFJEX2IsCUkxCX0sCi17InN3YzMiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MzX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2wiLCAgICAgInQsbyhiKSIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTEJfSwKLXsic3dsIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NXTF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2NhY2hlIiwgICJ0LG8oYikiLAkweGE4MDAwMDAwLCAweGZjMDAwMDAwLAlSRF90fFJEX2IsCUkyCX0sIC8qIHNhbWUgKi8KLXsic2NhY2hlIiwgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NXTF9BQiwJSU5TTl9NQUNSTywJSTIJfSwgLyogYXMgc3dsICovCi17InN3ciIsICAgICAidCxvKGIpIiwJMHhiODAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoteyJzd3IiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dSX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJpbnZhbGlkYXRlIiwgInQsbyhiKSIsMHhiODAwMDAwMCwgMHhmYzAwMDAwMCwJUkRfdHxSRF9iLAlJMgl9LCAvKiBzYW1lICovCi17ImludmFsaWRhdGUiLCAidCxBKGIpIiwwLCAgICAoaW50KSBNX1NXUl9BQiwJSU5TTl9NQUNSTywJSTIJfSwgLyogYXMgc3dyICovCi17InN3eGMxIiwgICAiUyx0KGIpIiwgICAweDRjMDAwMDA4LCAweGZjMDAwN2ZmLCBTTXxSRF9TfFJEX3R8UkRfYiwJSTQJfSwKLXsic3luYyIsICAgICIiLAkJMHgwMDAwMDAwZiwgMHhmZmZmZmZmZiwJSU5TTl9TWU5DLAlJMnxHMQl9LAoteyJzeW5jLnAiLCAgIiIsCQkweDAwMDAwNDBmLCAweGZmZmZmZmZmLAlJTlNOX1NZTkMsCUkyCX0sCi17InN5bmMubCIsICAiIiwJCTB4MDAwMDAwMGYsIDB4ZmZmZmZmZmYsCUlOU05fU1lOQywJSTIJfSwKLXsic3lzY2FsbCIsICIiLAkJMHgwMDAwMDAwYywgMHhmZmZmZmZmZiwJVFJBUCwJSTEJCX0sCi17InN5c2NhbGwiLCAiQiIsCTB4MDAwMDAwMGMsIDB4ZmMwMDAwM2YsCVRSQVAsCUkxCQl9LAoteyJ0ZXFpIiwgICAgInMsaiIsCTB4MDQwYzAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJfSwKLXsidGVxIiwJICAgICJzLHQiLAkweDAwMDAwMDM0LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJSTIJfSwKLXsidGVxIiwJICAgICJzLHQscSIsCTB4MDAwMDAwMzQsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgl9LAoteyJ0ZXEiLCAgICAgInMsaiIsCTB4MDQwYzAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJfSwgLyogdGVxaSAqLwoteyJ0ZXEiLCAgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVEVRX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17InRnZWkiLCAgICAicyxqIiwJMHgwNDA4MDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgl9LAoteyJ0Z2UiLAkgICAgInMsdCIsCTB4MDAwMDAwMzAsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxUUkFQLAlJMgl9LAoteyJ0Z2UiLAkgICAgInMsdCxxIiwJMHgwMDAwMDAzMCwgMHhmYzAwMDAzZiwJUkRfc3xSRF90fFRSQVAsCUkyCX0sCi17InRnZSIsICAgICAicyxqIiwJMHgwNDA4MDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgl9LCAvKiB0Z2VpICovCi17InRnZSIsCSAgICAicyxJIiwJMCwgICAgKGludCkgTV9UR0VfSSwgICAgSU5TTl9NQUNSTywJSTIJfSwKLXsidGdlaXUiLCAgICJzLGoiLAkweDA0MDkwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LAoteyJ0Z2V1IiwgICAgInMsdCIsCTB4MDAwMDAwMzEsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGdldSIsICAgICJzLHQscSIsCTB4MDAwMDAwMzEsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGdldSIsICAgICJzLGoiLAkweDA0MDkwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LCAvKiB0Z2VpdSAqLwoteyJ0Z2V1IiwgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVEdFVV9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJ0bGJwIiwgICAgIiIsCQkweDQyMDAwMDA4LCAweGZmZmZmZmZmLAlJTlNOX1RMQiwJSTF8TTEJfSwKLXsidGxiciIsICAgICIiLAkJMHg0MjAwMDAwMSwgMHhmZmZmZmZmZiwJSU5TTl9UTEIsCUkxfE0xCX0sCi17InRsYndpIiwgICAiIiwJCTB4NDIwMDAwMDIsIDB4ZmZmZmZmZmYsCUlOU05fVExCLAlJMXxNMQl9LAoteyJ0bGJ3ciIsICAgIiIsCQkweDQyMDAwMDA2LCAweGZmZmZmZmZmLAlJTlNOX1RMQiwJSTF8TTEJfSwKLXsidGx0aSIsICAgICJzLGoiLAkweDA0MGEwMDAwLCAweGZjMWYwMDAwLAlSRF9zfFRSQVAsCUkyCQl9LAoteyJ0bHQiLCAgICAgInMsdCIsCTB4MDAwMDAwMzIsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGx0IiwgICAgICJzLHQscSIsCTB4MDAwMDAwMzIsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGx0IiwgICAgICJzLGoiLAkweDA0MGEwMDAwLCAweGZjMWYwMDAwLAlSRF9zfFRSQVAsCUkyCQl9LCAvKiB0bHRpICovCi17InRsdCIsICAgICAicyxJIiwJMCwgICAgKGludCkgTV9UTFRfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsidGx0aXUiLCAgICJzLGoiLAkweDA0MGIwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LAoteyJ0bHR1IiwgICAgInMsdCIsCTB4MDAwMDAwMzMsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGx0dSIsICAgICJzLHQscSIsCTB4MDAwMDAwMzMsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidGx0dSIsICAgICJzLGoiLAkweDA0MGIwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LCAvKiB0bHRpdSAqLwoteyJ0bHR1IiwgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVExUVV9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJ0bmVpIiwgICAgInMsaiIsCTB4MDQwZTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sCi17InRuZSIsICAgICAicyx0IiwJMHgwMDAwMDAzNiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bmUiLCAgICAgInMsdCxxIiwJMHgwMDAwMDAzNiwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoteyJ0bmUiLCAgICAgInMsaiIsCTB4MDQwZTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sIC8qIHRuZWkgKi8KLXsidG5lIiwgICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RORV9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJ0cnVuYy5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwOSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17InRydW5jLmwucyIsICJELFMiLAkweDQ2MDAwMDA5LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTMJfSwKLXsidHJ1bmMudy5kIiwgIkQsUyIsCTB4NDYyMDAwMGQsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoteyJ0cnVuYy53LmQiLCAiRCxTLHgiLAkweDQ2MjAwMDBkLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsidHJ1bmMudy5kIiwgIkQsUyx0IiwJMCwgICAgKGludCkgTV9UUlVOQ1dELAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ0cnVuYy53LnMiLCAiRCxTIiwJMHg0NjAwMDAwZCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17InRydW5jLncucyIsICJELFMseCIsCTB4NDYwMDAwMGQsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJ0cnVuYy53LnMiLCAiRCxTLHQiLAkwLCAgICAoaW50KSBNX1RSVU5DV1MsCUlOU05fTUFDUk8sCUkxCX0sCi17InVsZCIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VTEQsCUlOU05fTUFDUk8sCUkzCX0sCi17InVsZCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VTERfQSwJSU5TTl9NQUNSTywJSTMJfSwKLXsidWxoIiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VMSCwJSU5TTl9NQUNSTywJSTEJfSwKLXsidWxoIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMSF9BLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1bGh1IiwgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVUxIVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsidWxodSIsICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMSFVfQSwJSU5TTl9NQUNSTywJSTEJfSwKLXsidWx3IiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VMVywJSU5TTl9NQUNSTywJSTEJfSwKLXsidWx3IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMV19BLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1c2QiLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVVNELAlJTlNOX01BQ1JPLAlJMwl9LAoteyJ1c2QiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVVNEX0EsCUlOU05fTUFDUk8sCUkzCX0sCi17InVzaCIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VU0gsCUlOU05fTUFDUk8sCUkxCX0sCi17InVzaCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VU0hfQSwJSU5TTl9NQUNSTywJSTEJfSwKLXsidXN3IiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VTVywJSU5TTl9NQUNSTywJSTEJfSwKLXsidXN3IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VTV19BLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ4b3IiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17InhvciIsICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX1hPUl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ4b3JpIiwgICAgInQscixpIiwJMHgzODAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAoteyJ3YWl0IiwgICAgIiIsCQkweDQyMDAwMDIwLCAweGZmZmZmZmZmLAlUUkFQLAlJM3xNMQl9LAoteyJ3YWl0aSIsICAgIiIsCQkweDQyMDAwMDIwLCAweGZmZmZmZmZmLAlUUkFQLAlMMQl9LAoteyJ3YiIsIAkgICAgIm8oYikiLAkweGJjMDQwMDAwLCAweGZjMWYwMDAwLCBTTXxSRF9iLAlMMQl9LAotLyogTm8gaGF6YXJkIHByb3RlY3Rpb24gb24gY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLS10aGV5IHNob3VsZG4ndAotICAgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgcHJvY2Vzc29yIGFuZCBpZiB0aGV5IGRvIGl0J3MgdXAgdG8gdGhlCi0gICB1c2VyIHRvIHB1dCBpbiBub3BzIGFzIG5lY2Vzc2FyeS4gIFRoZXNlIGFyZSBhdCB0aGUgZW5kIHNvIHRoYXQgdGhlCi0gICBkaXNhc2VtYmxlciByZWNvZ25pemVzIG1vcmUgc3BlY2lmaWMgdmVyc2lvbnMgZmlyc3QuICAqLwoteyJjMCIsICAgICAgIkMiLAkweDQyMDAwMDAwLCAweGZlMDAwMDAwLAkwLAlJMQkJfSwKLXsiYzEiLCAgICAgICJDIiwJMHg0NjAwMDAwMCwgMHhmZTAwMDAwMCwJMCwJSTEJCX0sCi17ImMyIiwgICAgICAiQyIsCTB4NGEwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCUkxCQl9LAoteyJjMyIsICAgICAgIkMiLAkweDRlMDAwMDAwLCAweGZlMDAwMDAwLAkwLAlJMQkJfSwKLXsiY29wMCIsICAgICAiQyIsCTAsICAgIChpbnQpIE1fQ09QMCwJSU5TTl9NQUNSTywJSTEJfSwKLXsiY29wMSIsICAgICAiQyIsCTAsICAgIChpbnQpIE1fQ09QMSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiY29wMiIsICAgICAiQyIsCTAsICAgIChpbnQpIE1fQ09QMiwJSU5TTl9NQUNSTywJSTEJfSwKLXsiY29wMyIsICAgICAiQyIsCTAsICAgIChpbnQpIE1fQ09QMywJSU5TTl9NQUNSTywJSTEJfSwKLQotICAvKiBDb25mbGljdHMgd2l0aCB0aGUgNDY1MCdzICJtdWwiIGluc3RydWN0aW9uLiAgTm9ib2R5J3MgdXNpbmcgdGhlCi0gICAgIDQwMTAgYW55IG1vcmUsIHNvIG1vdmUgdGhpcyBpbnNuIG91dCBvZiB0aGUgd2F5LiAgSWYgdGhlIG9iamVjdAotICAgICBmb3JtYXQgZ2F2ZSB1cyBtb3JlIGluZm8sIHdlIGNvdWxkIGRvIHRoaXMgcmlnaHQuICAqLwoteyJhZGRjaXUiLCAgInQscixqIiwJMHg3MDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLEwxCX0sCi19OwotCi0jZGVmaW5lIE1JUFNfTlVNX09QQ09ERVMgXAotCSgoc2l6ZW9mIG1pcHNfYnVpbHRpbl9vcGNvZGVzKSAvIChzaXplb2YgKG1pcHNfYnVpbHRpbl9vcGNvZGVzWzBdKSkpCi1jb25zdCBpbnQgYmZkX21pcHNfbnVtX2J1aWx0aW5fb3Bjb2RlcyA9IE1JUFNfTlVNX09QQ09ERVM7Ci0KLS8qIGNvbnN0IHJlbW92ZWQgZnJvbSB0aGUgZm9sbG93aW5nIHRvIGFsbG93IGZvciBkeW5hbWljIGV4dGVuc2lvbnMgdG8gdGhlIAotICogYnVpbHQtaW4gaW5zdHJ1Y3Rpb24gc2V0LiAqLwotc3RydWN0IG1pcHNfb3Bjb2RlICptaXBzX29wY29kZXMgPQotICAoc3RydWN0IG1pcHNfb3Bjb2RlICopIG1pcHNfYnVpbHRpbl9vcGNvZGVzOwotaW50IGJmZF9taXBzX251bV9vcGNvZGVzID0gTUlQU19OVU1fT1BDT0RFUzsKLSN1bmRlZiBNSVBTX05VTV9PUENPREVTCi0KZGlmZiAtLWdpdCBhL29wY29kZXMvbWlwczE2LW9wYy5jIGIvb3Bjb2Rlcy9taXBzMTYtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZDJkYmIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9taXBzMTYtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyogbWlwczE2LW9wYy5jLiAgTWlwczE2IG9wY29kZSB0YWJsZS4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKLQotLyogVGhpcyBpcyB0aGUgb3Bjb2RlcyB0YWJsZSBmb3IgdGhlIG1pcHMxNiBwcm9jZXNzb3IuICBUaGUgZm9ybWF0IG9mCi0gICB0aGlzIHRhYmxlIGlzIGludGVudGlvbmFsbHkgaWRlbnRpY2FsIHRvIHRoZSBvbmUgaW4gbWlwcy1vcGMuYy4KLSAgIEhvd2V2ZXIsIHRoZSBzcGVjaWFsIGxldHRlcnMgdGhhdCBhcHBlYXIgaW4gdGhlIGFyZ3VtZW50IHN0cmluZyBhcmUKLSAgIGRpZmZlcmVudCwgYW5kIHRoZSB0YWJsZSB1c2VzIHNvbWUgZGlmZmVyZW50IGZsYWdzLiAgKi8KLQotLyogVXNlIHNvbWUgc2hvcnQgaGFuZCBtYWNyb3MgdG8ga2VlcCBkb3duIHRoZSBsZW5ndGggb2YgdGhlIGxpbmVzIGluCi0gICB0aGUgb3Bjb2RlcyB0YWJsZS4gICovCi0KLSNkZWZpbmUgVUJEICAgICBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkKLSNkZWZpbmUgQlIgICAgICBNSVBTMTZfSU5TTl9CUkFOQ0gKLQotI2RlZmluZSBXUl94CU1JUFMxNl9JTlNOX1dSSVRFX1gKLSNkZWZpbmUgV1JfeQlNSVBTMTZfSU5TTl9XUklURV9ZCi0jZGVmaW5lIFdSX3oJTUlQUzE2X0lOU05fV1JJVEVfWgotI2RlZmluZSBXUl9UCU1JUFMxNl9JTlNOX1dSSVRFX1QKLSNkZWZpbmUgV1JfU1AJTUlQUzE2X0lOU05fV1JJVEVfU1AKLSNkZWZpbmUgV1JfMzEJTUlQUzE2X0lOU05fV1JJVEVfMzEKLSNkZWZpbmUgV1JfWQlNSVBTMTZfSU5TTl9XUklURV9HUFJfWQotCi0jZGVmaW5lIFJEX3gJTUlQUzE2X0lOU05fUkVBRF9YCi0jZGVmaW5lIFJEX3kJTUlQUzE2X0lOU05fUkVBRF9ZCi0jZGVmaW5lIFJEX1oJTUlQUzE2X0lOU05fUkVBRF9aCi0jZGVmaW5lIFJEX1QJTUlQUzE2X0lOU05fUkVBRF9UCi0jZGVmaW5lIFJEX1NQCU1JUFMxNl9JTlNOX1JFQURfU1AKLSNkZWZpbmUgUkRfMzEJTUlQUzE2X0lOU05fUkVBRF8zMQotI2RlZmluZSBSRF9QQwlNSVBTMTZfSU5TTl9SRUFEX1BDCi0jZGVmaW5lIFJEX1gJTUlQUzE2X0lOU05fUkVBRF9HUFJfWAotCi0jZGVmaW5lIFdSX0hJCUlOU05fV1JJVEVfSEkKLSNkZWZpbmUgV1JfTE8JSU5TTl9XUklURV9MTwotI2RlZmluZSBSRF9ISQlJTlNOX1JFQURfSEkKLSNkZWZpbmUgUkRfTE8JSU5TTl9SRUFEX0xPCi0KLSNkZWZpbmUgVFJBUAlJTlNOX1RSQVAKLQotI2RlZmluZSBJMwlJTlNOX0lTQTMKLQotI2RlZmluZSBUMyAgICAgIElOU05fMzkwMAotCi1jb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgbWlwczE2X29wY29kZXNbXSA9IHsKLXsibm9wIiwJICAgICIiLAkJMHg2NTAwLCAweGZmZmYsIFJEX1ogfSwgLyogbW92ZSAkMCwkWiAqLwoteyJsYSIsCSAgICAieCxBIiwJMHgwODAwLCAweGY4MDAsIFdSX3h8UkRfUEMgfSwKLXsiYWJzIiwJICAgICJ4LHciLAkwLCAoaW50KSBNX0FCUywgSU5TTl9NQUNSTyB9LAoteyJhZGRpdSIsICAgInkseCw0IiwJMHg0MDAwLCAweGY4MTAsIFdSX3l8UkRfeCB9LAoteyJhZGRpdSIsICAgIngsayIsCTB4NDgwMCwgMHhmODAwLCBXUl94fFJEX3ggfSwKLXsiYWRkaXUiLCAgICJTLEsiLAkweDYzMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AgfSwKLXsiYWRkaXUiLCAgICJTLFMsSyIsCTB4NjMwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCB9LAoteyJhZGRpdSIsICAgIngsUCxWIiwJMHgwODAwLCAweGY4MDAsIFdSX3h8UkRfUEMgfSwKLXsiYWRkaXUiLCAgICJ4LFMsViIsCTB4MDAwMCwgMHhmODAwLCBXUl94fFJEX1NQIH0sCi17ImFkZHUiLCAgICAieix2LHkiLAkweGUwMDEsIDB4ZjgwMywgV1JfenxSRF94fFJEX3kgfSwKLXsiYWRkdSIsICAgICJ5LHgsNCIsCTB4NDAwMCwgMHhmODEwLCBXUl95fFJEX3ggfSwKLXsiYWRkdSIsICAgICJ4LGsiLAkweDQ4MDAsIDB4ZjgwMCwgV1JfeHxSRF94IH0sCi17ImFkZHUiLCAgICAiUyxLIiwJMHg2MzAwLCAweGZmMDAsIFdSX1NQfFJEX1NQIH0sCi17ImFkZHUiLCAgICAiUyxTLEsiLAkweDYzMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AgfSwKLXsiYWRkdSIsICAgICJ4LFAsViIsCTB4MDgwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCi17ImFkZHUiLCAgICAieCxTLFYiLAkweDAwMDAsIDB4ZjgwMCwgV1JfeHxSRF9TUCB9LAoteyJhbmQiLAkgICAgIngseSIsCTB4ZTgwYywgMHhmODFmLCBXUl94fFJEX3h8UkRfeSB9LAoteyJiIiwJICAgICJxIiwJMHgxMDAwLCAweGY4MDAsIEJSfSwKLXsiYmVxIiwJICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkVRLCBJTlNOX01BQ1JPIH0sCi17ImJlcSIsICAgICAieCxVLHAiLAkwLCAoaW50KSBNX0JFUV9JLCBJTlNOX01BQ1JPIH0sCi17ImJlcXoiLCAgICAieCxwIiwJMHgyMDAwLCAweGY4MDAsIEJSfFJEX3ggfSwKLXsiYmdlIiwJICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkdFLCBJTlNOX01BQ1JPIH0sCi17ImJnZSIsICAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JHRV9JLCBJTlNOX01BQ1JPIH0sCi17ImJnZXUiLCAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JHRVUsIElOU05fTUFDUk8gfSwKLXsiYmdldSIsICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkdFVV9JLCBJTlNOX01BQ1JPIH0sCi17ImJndCIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JHVCwgSU5TTl9NQUNSTyB9LAoteyJiZ3QiLCAgICAgIngsOCxwIiwJMCwgKGludCkgTV9CR1RfSSwgSU5TTl9NQUNSTyB9LAoteyJiZ3R1IiwgICAgIngseSxwIiwJMCwgKGludCkgTV9CR1RVLCBJTlNOX01BQ1JPIH0sCi17ImJndHUiLCAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JHVFVfSSwgSU5TTl9NQUNSTyB9LAoteyJibGUiLAkgICAgIngseSxwIiwJMCwgKGludCkgTV9CTEUsIElOU05fTUFDUk8gfSwKLXsiYmxlIiwgICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkxFX0ksIElOU05fTUFDUk8gfSwKLXsiYmxldSIsICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkxFVSwgSU5TTl9NQUNSTyB9LAoteyJibGV1IiwgICAgIngsOCxwIiwJMCwgKGludCkgTV9CTEVVX0ksIElOU05fTUFDUk8gfSwKLXsiYmx0IiwJICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkxULCBJTlNOX01BQ1JPIH0sCi17ImJsdCIsICAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JMVF9JLCBJTlNOX01BQ1JPIH0sCi17ImJsdHUiLCAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JMVFUsIElOU05fTUFDUk8gfSwKLXsiYmx0dSIsICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkxUVV9JLCBJTlNOX01BQ1JPIH0sCi17ImJuZSIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JORSwgSU5TTl9NQUNSTyB9LAoteyJibmUiLCAgICAgIngsVSxwIiwJMCwgKGludCkgTV9CTkVfSSwgSU5TTl9NQUNSTyB9LAoteyJibmV6IiwgICAgIngscCIsCTB4MjgwMCwgMHhmODAwLCBCUnxSRF94IH0sCi17ImJyZWFrIiwgICAiNiIsCTB4ZTgwNSwgMHhmODFmLCBUUkFQIH0sCi17ImJ0ZXF6IiwgICAicCIsCTB4NjAwMCwgMHhmZjAwLCBCUnxSRF9UIH0sCi17ImJ0bmV6IiwgICAicCIsCTB4NjEwMCwgMHhmZjAwLCBCUnxSRF9UIH0sCi17ImNtcGkiLCAgICAieCxVIiwJMHg3MDAwLCAweGY4MDAsIFdSX1R8UkRfeCB9LAoteyJjbXAiLAkgICAgIngseSIsCTB4ZTgwYSwgMHhmODFmLCBXUl9UfFJEX3h8UkRfeSB9LAoteyJjbXAiLCAgICAgIngsVSIsCTB4NzAwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsiZGxhIiwJICAgICJ5LEUiLAkweGZlMDAsIDB4ZmYwMCwgV1JfeXxSRF9QQywgSTMgfSwKLXsiZGFkZGl1IiwgICJ5LHgsNCIsCTB4NDAxMCwgMHhmODEwLCBXUl95fFJEX3gsIEkzIH0sCi17ImRhZGRpdSIsICAieSxqIiwJMHhmZDAwLCAweGZmMDAsIFdSX3l8UkRfeSwgSTMgfSwKLXsiZGFkZGl1IiwgICJTLEsiLAkweGZiMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AsIEkzIH0sCi17ImRhZGRpdSIsICAiUyxTLEsiLAkweGZiMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AsIEkzIH0sCi17ImRhZGRpdSIsICAieSxQLFciLAkweGZlMDAsIDB4ZmYwMCwgV1JfeXxSRF9QQywgSTMgfSwKLXsiZGFkZGl1IiwgICJ5LFMsVyIsCTB4ZmYwMCwgMHhmZjAwLCBXUl95fFJEX1NQLCBJMyB9LAoteyJkYWRkdSIsICAgInosdix5IiwJMHhlMDAwLCAweGY4MDMsIFdSX3p8UkRfeHxSRF95LCBJMyB9LAoteyJkYWRkdSIsICAgInkseCw0IiwJMHg0MDEwLCAweGY4MTAsIFdSX3l8UkRfeCwgSTMgfSwKLXsiZGFkZHUiLCAgICJ5LGoiLAkweGZkMDAsIDB4ZmYwMCwgV1JfeXxSRF95LCBJMyB9LAoteyJkYWRkdSIsICAgIlMsSyIsCTB4ZmIwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCwgSTMgfSwKLXsiZGFkZHUiLCAgICJTLFMsSyIsCTB4ZmIwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCwgSTMgfSwKLXsiZGFkZHUiLCAgICJ5LFAsVyIsCTB4ZmUwMCwgMHhmZjAwLCBXUl95fFJEX1BDLCBJMyB9LAoteyJkYWRkdSIsICAgInksUyxXIiwJMHhmZjAwLCAweGZmMDAsIFdSX3l8UkRfU1AsIEkzIH0sCi17ImRkaXYiLCAgICAiMCx4LHkiLAkweGU4MWUsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPLCBJMyB9LAoteyJkZGl2IiwgICAgInosdix5IiwJMCwgKGludCkgTV9ERElWXzMsIElOU05fTUFDUk8gfSwKLXsiZGRpdnUiLCAgICIwLHgseSIsCTB4ZTgxZiwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8sIEkzIH0sCi17ImRkaXZ1IiwgICAieix2LHkiLAkwLCAoaW50KSBNX0RESVZVXzMsIElOU05fTUFDUk8gfSwKLXsiZGl2IiwgICAgICIwLHgseSIsCTB4ZTgxYSwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8gfSwKLXsiZGl2IiwgICAgICJ6LHYseSIsCTAsIChpbnQpIE1fRElWXzMsIElOU05fTUFDUk8gfSwKLXsiZGl2dSIsICAgICIwLHgseSIsCTB4ZTgxYiwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8gfSwKLXsiZGl2dSIsICAgICJ6LHYseSIsCTAsIChpbnQpIE1fRElWVV8zLCBJTlNOX01BQ1JPIH0sCi17ImRtdWwiLCAgICAieix2LHkiLAkwLCAoaW50KSBNX0RNVUwsIElOU05fTUFDUk8sIEkzIH0sCi17ImRtdWx0IiwgICAieCx5IiwJMHhlODFjLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZG11bHR1IiwgICJ4LHkiLAkweGU4MWQsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPLCBJMyB9LAoteyJkcmVtIiwgICAgIjAseCx5IiwJMHhlODFlLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZHJlbSIsICAgICJ6LHYseSIsCTAsIChpbnQpIE1fRFJFTV8zLCBJTlNOX01BQ1JPIH0sCi17ImRyZW11IiwgICAiMCx4LHkiLAkweGU4MWYsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPLCBJMyB9LAoteyJkcmVtdSIsICAgInosdix5IiwJMCwgKGludCkgTV9EUkVNVV8zLCBJTlNOX01BQ1JPIH0sCi17ImRzbGx2IiwgICAieSx4IiwJMHhlODE0LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94LCBJMyB9LAoteyJkc2xsIiwgICAgIngsdyxbIiwJMHgzMDAxLCAweGY4MDMsIFdSX3h8UkRfeSwgSTMgfSwKLXsiZHNsbCIsICAgICJ5LHgiLAkweGU4MTQsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3gsIEkzIH0sCi17ImRzcmF2IiwgICAieSx4IiwJMHhlODE3LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94LCBJMyB9LAoteyJkc3JhIiwgICAgInksXSIsCTB4ZTgxMywgMHhmODFmLCBXUl95fFJEX3ksIEkzIH0sCi17ImRzcmEiLCAgICAieSx4IiwJMHhlODE3LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94LCBJMyB9LAoteyJkc3JsdiIsICAgInkseCIsCTB4ZTgxNiwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHNybCIsICAgICJ5LF0iLAkweGU4MDgsIDB4ZjgxZiwgV1JfeXxSRF95LCBJMyB9LAoteyJkc3JsIiwgICAgInkseCIsCTB4ZTgxNiwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHN1YnUiLCAgICJ6LHYseSIsCTB4ZTAwMiwgMHhmODAzLCBXUl96fFJEX3h8UkRfeSwgSTMgfSwKLXsiZHN1YnUiLCAgICJ5LHgsNCIsCTAsIChpbnQpIE1fRFNVQlVfSSwgSU5TTl9NQUNSTyB9LAoteyJkc3VidSIsICAgInksaiIsCTAsIChpbnQpIE1fRFNVQlVfSV8yLCBJTlNOX01BQ1JPIH0sCi17ImV4aXQiLCAgICAiTCIsCTB4ZWQwOSwgMHhmZjFmLCBUUkFQIH0sCi17ImV4aXQiLCAgICAiTCIsCTB4ZWUwOSwgMHhmZjFmLCBUUkFQIH0sCi17ImV4aXQiLCAgICAiTCIsCTB4ZWYwOSwgMHhmZjFmLCBUUkFQIH0sCi17ImVudHJ5IiwgICAibCIsCTB4ZTgwOSwgMHhmODFmLCBUUkFQIH0sCi17ImV4dGVuZCIsICAiZSIsCTB4ZjAwMCwgMHhmODAwLCAwIH0sCi17ImphbHIiLCAgICAieCIsCTB4ZTg0MCwgMHhmOGZmLCBVQkR8V1JfMzF8UkRfeCB9LAoteyJqYWxyIiwgICAgIlIseCIsCTB4ZTg0MCwgMHhmOGZmLCBVQkR8V1JfMzF8UkRfeCB9LAoteyJqYWwiLCAgICAgIngiLAkweGU4NDAsIDB4ZjhmZiwgVUJEfFdSXzMxfFJEX3ggfSwKLXsiamFsIiwgICAgICJSLHgiLAkweGU4NDAsIDB4ZjhmZiwgVUJEfFdSXzMxfFJEX3ggfSwKLXsiamFsIiwJICAgICJhIiwJMHgxODAwLCAweGZjMDAsIFVCRHxXUl8zMSB9LAoteyJqYWx4IiwgICAgImEiLAkweDFjMDAsIDB4ZmMwMCwgVUJEfFdSXzMxIH0sCi17ImpyIiwJICAgICJ4IiwJMHhlODAwLCAweGY4ZmYsIFVCRHxSRF94IH0sCi17ImpyIiwJICAgICJSIiwJMHhlODIwLCAweGZmZmYsIFVCRHxSRF8zMSB9LAoteyJqIiwJICAgICJ4IiwJMHhlODAwLCAweGY4ZmYsIFVCRHxSRF94IH0sCi17ImoiLAkgICAgIlIiLAkweGU4MjAsIDB4ZmZmZiwgVUJEfFJEXzMxIH0sCi17ImxiIiwJICAgICJ5LDUoeCkiLAkweDgwMDAsIDB4ZjgwMCwgV1JfeXxSRF94IH0sCi17ImxidSIsCSAgICAieSw1KHgpIiwJMHhhMDAwLCAweGY4MDAsIFdSX3l8UkRfeCB9LAoteyJsZCIsCSAgICAieSxEKHgpIiwJMHgzODAwLCAweGY4MDAsIFdSX3l8UkRfeCwgSTMgfSwKLXsibGQiLAkgICAgInksQiIsCTB4ZmMwMCwgMHhmZjAwLCBXUl95fFJEX1BDLCBJMyB9LAoteyJsZCIsCSAgICAieSxEKFApIiwJMHhmYzAwLCAweGZmMDAsIFdSX3l8UkRfUEMsIEkzIH0sCi17ImxkIiwJICAgICJ5LEQoUykiLAkweGY4MDAsIDB4ZmYwMCwgV1JfeXxSRF9TUCwgSTMgfSwKLXsibGgiLAkgICAgInksSCh4KSIsCTB4ODgwMCwgMHhmODAwLCBXUl95fFJEX3ggfSwKLXsibGh1IiwJICAgICJ5LEgoeCkiLAkweGE4MDAsIDB4ZjgwMCwgV1JfeXxSRF94IH0sCi17ImxpIiwJICAgICJ4LFUiLAkweDY4MDAsIDB4ZjgwMCwgV1JfeCB9LAoteyJsdyIsCSAgICAieSxXKHgpIiwJMHg5ODAwLCAweGY4MDAsIFdSX3l8UkRfeCB9LAoteyJsdyIsCSAgICAieCxBIiwJMHhiMDAwLCAweGY4MDAsIFdSX3h8UkRfUEMgfSwKLXsibHciLAkgICAgIngsVihQKSIsCTB4YjAwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCi17Imx3IiwJICAgICJ4LFYoUykiLAkweDkwMDAsIDB4ZjgwMCwgV1JfeHxSRF9TUCB9LAoteyJsd3UiLCAgICAgInksVyh4KSIsCTB4YjgwMCwgMHhmODAwLCBXUl95fFJEX3gsIEkzIH0sCi17Im1maGkiLCAgICAieCIsCTB4ZTgxMCwgMHhmOGZmLCBXUl94fFJEX0hJIH0sCi17Im1mbG8iLCAgICAieCIsCTB4ZTgxMiwgMHhmOGZmLCBXUl94fFJEX0xPIH0sCi17Im1vdmUiLCAgICAieSxYIiwJMHg2NzAwLCAweGZmMDAsIFdSX3l8UkRfWCB9LAoteyJtb3ZlIiwgICAgIlksWiIsCTB4NjUwMCwgMHhmZjAwLCBXUl9ZfFJEX1ogfSwKLXsibXVsIiwgICAgICJ6LHYseSIsCTAsIChpbnQpIE1fTVVMLCBJTlNOX01BQ1JPIH0sCi17Im11bHQiLCAgICAieCx5IiwJMHhlODE4LCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTyB9LAoteyJtdWx0dSIsICAgIngseSIsCTB4ZTgxOSwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8gfSwKLXsibmVnIiwJICAgICJ4LHciLAkweGU4MGIsIDB4ZjgxZiwgV1JfeHxSRF95IH0sCi17Im5vdCIsCSAgICAieCx3IiwJMHhlODBmLCAweGY4MWYsIFdSX3h8UkRfeSB9LAoteyJvciIsCSAgICAieCx5IiwJMHhlODBkLCAweGY4MWYsIFdSX3h8UkRfeHxSRF95IH0sCi17InJlbSIsICAgICAiMCx4LHkiLAkweGU4MWEsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17InJlbSIsICAgICAieix2LHkiLAkwLCAoaW50KSBNX1JFTV8zLCBJTlNOX01BQ1JPIH0sCi17InJlbXUiLCAgICAiMCx4LHkiLAkweGU4MWIsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17InJlbXUiLCAgICAieix2LHkiLAkwLCAoaW50KSBNX1JFTVVfMywgSU5TTl9NQUNSTyB9LAoteyJzYiIsCSAgICAieSw1KHgpIiwJMHhjMDAwLCAweGY4MDAsIFJEX3l8UkRfeCB9LAoteyJzZCIsCSAgICAieSxEKHgpIiwJMHg3ODAwLCAweGY4MDAsIFJEX3l8UkRfeCwgSTMgfSwKLXsic2QiLAkgICAgInksRChTKSIsCTB4ZjkwMCwgMHhmZjAwLCBSRF95fFJEX1BDLCBJMyB9LAoteyJzZCIsCSAgICAiUixDKFMpIiwJMHhmYTAwLCAweGZmMDAsIFJEXzMxfFJEX1BDIH0sCi17InNoIiwJICAgICJ5LEgoeCkiLAkweGM4MDAsIDB4ZjgwMCwgUkRfeXxSRF94IH0sCi17InNsbHYiLCAgICAieSx4IiwJMHhlODA0LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94IH0sCi17InNsbCIsCSAgICAieCx3LDwiLAkweDMwMDAsIDB4ZjgwMywgV1JfeHxSRF95IH0sCi17InNsbCIsICAgICAieSx4IiwJMHhlODA0LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94IH0sCi17InNsdGkiLCAgICAieCw4IiwJMHg1MDAwLCAweGY4MDAsIFdSX1R8UkRfeCB9LAoteyJzbHQiLAkgICAgIngseSIsCTB4ZTgwMiwgMHhmODFmLCBXUl9UfFJEX3h8UkRfeSB9LAoteyJzbHQiLCAgICAgIngsOCIsCTB4NTAwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsic2x0aXUiLCAgICJ4LDgiLAkweDU4MDAsIDB4ZjgwMCwgV1JfVHxSRF94IH0sCi17InNsdHUiLCAgICAieCx5IiwJMHhlODAzLCAweGY4MWYsIFdSX1R8UkRfeHxSRF95IH0sCi17InNsdHUiLCAgICAieCw4IiwJMHg1ODAwLCAweGY4MDAsIFdSX1R8UkRfeCB9LAoteyJzcmF2IiwgICAgInkseCIsCTB4ZTgwNywgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzcmEiLAkgICAgIngsdyw8IiwJMHgzMDAzLCAweGY4MDMsIFdSX3h8UkRfeSB9LAoteyJzcmEiLCAgICAgInkseCIsCTB4ZTgwNywgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzcmx2IiwgICAgInkseCIsCTB4ZTgwNiwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzcmwiLAkgICAgIngsdyw8IiwJMHgzMDAyLCAweGY4MDMsIFdSX3h8UkRfeSB9LAoteyJzcmwiLCAgICAgInkseCIsCTB4ZTgwNiwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzdWJ1IiwgICAgInosdix5IiwJMHhlMDAzLCAweGY4MDMsIFdSX3p8UkRfeHxSRF95IH0sCi17InN1YnUiLCAgICAieSx4LDQiLAkwLCAoaW50KSBNX1NVQlVfSSwgSU5TTl9NQUNSTyB9LAoteyJzdWJ1IiwgICAgIngsayIsCTAsIChpbnQpIE1fU1VCVV9JXzIsIElOU05fTUFDUk8gfSwKLXsic3ciLAkgICAgInksVyh4KSIsCTB4ZDgwMCwgMHhmODAwLCBSRF95fFJEX3ggfSwKLXsic3ciLAkgICAgIngsVihTKSIsCTB4ZDAwMCwgMHhmODAwLCBSRF94fFJEX1NQIH0sCi17InN3IiwJICAgICJSLFYoUykiLAkweDYyMDAsIDB4ZmYwMCwgUkRfMzF8UkRfU1AgfSwKLXsieG9yIiwJICAgICJ4LHkiLAkweGU4MGUsIDB4ZjgxZiwgV1JfeHxSRF94fFJEX3kgfSwKLX07Ci0KLWNvbnN0IGludCBiZmRfbWlwczE2X251bV9vcGNvZGVzID0KLSAgKChzaXplb2YgbWlwczE2X29wY29kZXMpIC8gKHNpemVvZiAobWlwczE2X29wY29kZXNbMF0pKSk7CmRpZmYgLS1naXQgYS9vcGNvZGVzL21wdy1jb25maWcuaW4gYi9vcGNvZGVzL21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOWJlOWQuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tcHctY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZyYWdtZW50IGZvciBvcGNvZGVzLgotCi1TZXQgdGFyZ2V0X2FyY2ggYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkIC1lICdzLy0uKi0uKi8vJ2AKLQotU2V0IGFyY2huYW1lIEFSQ0hfe3RhcmdldF9hcmNofQotCi1JZiAie3RhcmdldF9hcmNofSIgPX4gL202OGsvCi0JU2V0IEJGRF9NQUNISU5FUyAgJyJ7b30ibTY4ay1kaXMuYy5vICJ7b30ibTY4ay1vcGMuYy5vJwotRWxzZSBJZiAie3RhcmdldF9hcmNofSIgPX4gL3Bvd2VycGMvCi0JU2V0IEJGRF9NQUNISU5FUyAgJyJ7b30icHBjLWRpcy5jLm8gIntvfSJwcGMtb3BjLmMubycKLUVsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC9pMzg2LwotCVNldCBCRkRfTUFDSElORVMgICcie299ImkzODYtZGlzLmMubycKLUVsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC9taXBzLwotCVNldCBCRkRfTUFDSElORVMgICcie299Im1pcHMtZGlzLmMubyAie299Im1pcHMtb3BjLmMubycKLUVsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC9zaC8KLQlTZXQgQkZEX01BQ0hJTkVTICAnIntvfSJzaC1kaXMuYy5vJwotRW5kIElmCi0KLUVjaG8gJyMgU3RhcnQgZnJvbSBtcHctY29uZmlnLmluJwkJCSA+ICJ7b30ibWsudG1wCi1FY2hvICJCRkRfTUFDSElORVMgPSAiIHtCRkRfTUFDSElORVN9CQkJPj4gIntvfSJtay50bXAKLUVjaG8gIkFSQ0hERUZTID0gLWQiIHthcmNobmFtZX0JCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJyMgRW5kIGZyb20gbXB3LWNvbmZpZy5pbicJCQkJPj4gIntvfSJtay50bXAKLQotRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKLUVjaG8gJyNpbmNsdWRlICJtcHcuaCInCQkgCQkJPj4gIntvfSJjb25maWcubmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImNvbmZpZy5uZXcgIntvfSJjb25maWcuaApkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tcHctbWFrZS5zZWQgYi9vcGNvZGVzL21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2MDQ4Ni4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21wdy1tYWtlLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIGZpbmlzaCB0cmFuc2xhdGluZyB0aGUgb3Bjb2RlcyBNYWtlZmlsZS5pbiBpbnRvIE1QVyBzeW50YXguCi0KLSMgRW1wdHkgSERFRklORVMuCi0vSERFRklORVMvcy9ASERFRklORVNALy8KLQotIyBGaXggcGF0aG5hbWVzIHRvIGluY2x1ZGUgZGlyZWN0b3JpZXMuCi0vXklOQ0RJUiA9IC9zL15JTkNESVIgPSAuKiQvSU5DRElSID0gInt0b3BzcmNkaXJ9ImluY2x1ZGUvCi0vXkNTRUFSQ0ggPSAvcy8kLyAtaSAie0lOQ0RJUn0iOm1wdzogLWkgOjpleHRyYS1pbmNsdWRlOi8KLQotL0JGRF9NQUNISU5FUy9zL0BCRkRfTUFDSElORVNAL3tCRkRfTUFDSElORVN9LwotL2FyY2hkZWZzL3MvQGFyY2hkZWZzQC97QVJDSERFRlN9LwotCi0jIE5vIFBJQyBmb29sZXJ5IGluIHRoaXMgZW52aXJvbm1lbnQuCi0vQEFMTExJQlNAL3MvQEFMTExJQlNAL3tUQVJHRVRMSUJ9LwotL0BQSUNMSVNUQC9zL0BQSUNMSVNUQC8vCi0vQFBJQ0ZMQUdAL3MvQFBJQ0ZMQUdALy8KLS9ee09GSUxFU30gXFxPcHRpb24tZiBzdGFtcC1waWNkaXIvLC9eJC9kCi0KLSMgUmVtb3ZlIHRoZSBwaWMgdHJpY2tlcnkgZnJvbSB0aGUgZGVmYXVsdCBidWlsZCBydWxlLgotL15cLmNcLm8gXFxPcHRpb24tZiAvLC9FbmQgSWYvY1wKLS5jLm8gXFxPcHRpb24tZiAuYwotCi0jIFJlbW92ZSBwaWMgdHJpY2tlcnkgZnJvbSBvdGhlciBydWxlcyAtIGFpbWVkIGF0IHRoZSBydWxlCi0jIGZvciBkaXNhc3NlbWJsZS5vIGluIHBhcnRpY3VsYXIuCi0vLW4gIntQSUNGTEFHfSIvLC9FbmQgSWYvZApkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9uczMyay1kaXMuYyBiL29wY29kZXMvbnMzMmstZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDI2NmIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9uczMyay1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDg5NCArMCwwIEBACi0vKiBQcmludCBOYXRpb25hbCBTZW1pY29uZHVjdG9yIDMyMDAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoYykgMTk4NiwgODgsIDkxLCA5MiwgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBvcGNvZGVzIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpZiAhZGVmaW5lZChjb25zdCkgJiYgIWRlZmluZWQoX19TVERDX18pCi0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLSNpbmNsdWRlICJvcGNvZGUvbnMzMmsuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotc3RhdGljIGRpc2Fzc2VtYmxlX2luZm8gKmRpc19pbmZvOwotCi0vKgotICogSGFja3MgdG8gZ2V0IGl0IHRvIGNvbXBpbGUgPD0gUkVBRCBUSEVTRSBBUyBGSVhFUyBORUVERUQKLSAqLwotI2RlZmluZSBJTlZBTElEX0ZMT0FUKHZhbCwgc2l6ZSkgaW52YWxpZF9mbG9hdCgoY2hhciAqKXZhbCwgc2l6ZSkKLQotc3RhdGljIGludCBwcmludF9pbnNuX2FyZwotICBQQVJBTVMgKChpbnQsIGludCwgaW50ICosIGNoYXIgKiwgYmZkX3ZtYSwgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgZ2V0X2Rpc3BsYWNlbWVudCBQQVJBTVMgKChjaGFyICosIGludCAqKSk7Ci1zdGF0aWMgaW50IGludmFsaWRfZmxvYXQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIGxvbmcgcmVhZF9tZW1vcnlfaW50ZWdlcihhZGRyLCBucikKLSAgICAgdW5zaWduZWQgY2hhciAqYWRkcjsKLSAgICAgaW50IG5yOwotewotICBsb25nIHZhbDsKLSAgaW50IGk7Ci0gIGZvciAodmFsID0gMCwgaSA9IG5yIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICB2YWwgPSAgKHZhbCA8PCA4KTsKLSAgICB2YWwgfD0gKDB4ZmYgJiAqKGFkZHIgKyBpKSk7Ci0gIH0KLSAgcmV0dXJuIHZhbDsKLX0KLQotLyogMzIwMDAgaW5zdHJ1Y3Rpb25zIGFyZSBuZXZlciBsb25nZXIgdGhhbiB0aGlzLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDYyCi0KLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi1zdHJ1Y3QgcHJpdmF0ZQotewotICAvKiBQb2ludHMgdG8gZmlyc3QgYnl0ZSBub3QgZmV0Y2hlZC4gICovCi0gIGJmZF9ieXRlICptYXhfZmV0Y2hlZDsKLSAgYmZkX2J5dGUgdGhlX2J1ZmZlcltNQVhMRU5dOwotICBiZmRfdm1hIGluc25fc3RhcnQ7Ci0gIGptcF9idWYgYmFpbG91dDsKLX07Ci0KLQotLyogTWFrZSBzdXJlIHRoYXQgYnl0ZXMgZnJvbSBJTkZPLT5QUklWQVRFX0RBVEEtPkJVRkZFUiAoaW5jbHVzaXZlKQotICAgdG8gQUREUiAoZXhjbHVzaXZlKSBhcmUgdmFsaWQuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIGxvbmdqbXBzCi0gICBvbiBlcnJvci4gICovCi0jZGVmaW5lIEZFVENIX0RBVEEoaW5mbywgYWRkcikgXAotICAoKGFkZHIpIDw9ICgoc3RydWN0IHByaXZhdGUgKikoaW5mby0+cHJpdmF0ZV9kYXRhKSktPm1heF9mZXRjaGVkIFwKLSAgID8gMSA6IGZldGNoX2RhdGEgKChpbmZvKSwgKGFkZHIpKSkKLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSAoaW5mbywgYWRkcikKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF9ieXRlICphZGRyOwotewotICBpbnQgc3RhdHVzOwotICBzdHJ1Y3QgcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgcHJpdmF0ZSAqKWluZm8tPnByaXZhdGVfZGF0YTsKLSAgYmZkX3ZtYSBzdGFydCA9IHByaXYtPmluc25fc3RhcnQgKyAocHJpdi0+bWF4X2ZldGNoZWQgLSBwcml2LT50aGVfYnVmZmVyKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChzdGFydCwKLQkJCQkgICAgICBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBhZGRyIC0gcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7Ci0gICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBwcml2LT5tYXhfZmV0Y2hlZCA9IGFkZHI7Ci0gIHJldHVybiAxOwotfQotLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotI2RlZmluZSBOT1BDT0RFUyAoc2l6ZW9mIG5zMzJrX29wY29kZXMgLyBzaXplb2YgbnMzMmtfb3Bjb2Rlc1swXSkKLQotI2RlZmluZSBORVhUX0lTX0FERFIJJ3wnCi0KLQwKLXN0cnVjdCBuczMya19vcHRpb24gewotICBjaGFyICpwYXR0ZXJuOwkJLyogdGhlIG9wdGlvbiBpdHNlbGYgKi8KLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsJCS8qIGJpbmFyeSB2YWx1ZSBvZiB0aGUgb3B0aW9uICovCi0gIHVuc2lnbmVkIGxvbmcgbWF0Y2g7CQkvKiB0aGVzZSBiaXRzIG11c3QgbWF0Y2ggKi8KLX07Ci0KLQwKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdF91W109IC8qIHJlc3RvcmUsIGV4aXQgKi8KLXsKLSAgeyAicjAiLAkweDgwLAkweDgwCX0sCi0gIHsgInIxIiwJMHg0MCwJMHg0MAl9LAotICB7ICJyMiIsCTB4MjAsCTB4MjAJfSwKLSAgeyAicjMiLAkweDEwLAkweDEwCX0sCi0gIHsgInI0IiwJMHgwOCwJMHgwOAl9LAotICB7ICJyNSIsCTB4MDQsCTB4MDQJfSwKLSAgeyAicjYiLAkweDAyLAkweDAyCX0sCi0gIHsgInI3IiwJMHgwMSwJMHgwMQl9LAotICB7ICAwICwJMHgwMCwJMHgwMAl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfVVtdPSAvKiBzYXZlLCBlbnRlciAqLwotewotICB7ICJyMCIsCTB4MDEsCTB4MDEJfSwKLSAgeyAicjEiLAkweDAyLAkweDAyCX0sCi0gIHsgInIyIiwJMHgwNCwJMHgwNAl9LAotICB7ICJyMyIsCTB4MDgsCTB4MDgJfSwKLSAgeyAicjQiLAkweDEwLAkweDEwCX0sCi0gIHsgInI1IiwJMHgyMCwJMHgyMAl9LAotICB7ICJyNiIsCTB4NDAsCTB4NDAJfSwKLSAgeyAicjciLAkweDgwLAkweDgwCX0sCi0gIHsgIDAgLAkweDAwLAkweDAwCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdF9PW109IC8qIHNldGNmZyAqLwotewotICB7ICJjIiwJMHg4LAkweDgJfSwKLSAgeyAibSIsCTB4NCwJMHg0CX0sCi0gIHsgImYiLAkweDIsCTB4Mgl9LAotICB7ICJpIiwJMHgxLAkweDEJfSwKLSAgeyAgMCAsCTB4MCwJMHgwCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdF9DW109IC8qIGNpbnYgKi8KLXsKLSAgeyAiYSIsCTB4NCwJMHg0CX0sCi0gIHsgImkiLAkweDIsCTB4Mgl9LAotICB7ICJkIiwJMHgxLAkweDEJfSwKLSAgeyAgMCAsCTB4MCwJMHgwCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdF9TW109IC8qIHN0cmluZyBpbnN0ICovCi17Ci0gIHsgImIiLAkweDEsCTB4MQl9LAotICB7ICJ1IiwJMHg2LAkweDYJfSwKLSAgeyAidyIsCTB4MiwJMHgyCX0sCi0gIHsgIDAgLAkweDAsCTB4MAl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBsaXN0X1A1MzJbXT0gLyogbHByIHNwciAqLwotewotICB7ICJ1cyIsCTB4MCwJMHhmCX0sCi0gIHsgImRjciIsCTB4MSwJMHhmCX0sCi0gIHsgImJwYyIsCTB4MiwJMHhmCX0sCi0gIHsgImRzciIsCTB4MywJMHhmCX0sCi0gIHsgImNhciIsCTB4NCwJMHhmCX0sCi0gIHsgImZwIiwJMHg4LAkweGYJfSwKLSAgeyAic3AiLAkweDksCTB4Zgl9LAotICB7ICJzYiIsCTB4YSwJMHhmCX0sCi0gIHsgInVzcCIsCTB4YiwJMHhmCX0sCi0gIHsgImNmZyIsCTB4YywJMHhmCX0sCi0gIHsgInBzciIsCTB4ZCwJMHhmCX0sCi0gIHsgImludGJhc2UiLAkweGUsCTB4Zgl9LAotICB7ICJtb2QiLAkweGYsCTB4Zgl9LAotICB7ICAwICwJMHgwMCwJMHhmCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIGxpc3RfTTUzMltdPSAvKiBsbXIgc21yICovCi17Ci0gIHsgIm1jciIsCTB4OSwJMHhmCX0sCi0gIHsgIm1zciIsCTB4YSwJMHhmCX0sCi0gIHsgInRlYXIiLAkweGIsCTB4Zgl9LAotICB7ICJwdGIwIiwJMHhjLAkweGYJfSwKLSAgeyAicHRiMSIsCTB4ZCwJMHhmCX0sCi0gIHsgIml2YXIwIiwJMHhlLAkweGYJfSwKLSAgeyAiaXZhcjEiLAkweGYsCTB4Zgl9LAotICB7ICAwICwJMHgwLAkweGYJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gbGlzdF9QMDMyW109IC8qIGxwciBzcHIgKi8KLXsKLSAgeyAidXBzciIsCTB4MCwJMHhmCX0sCi0gIHsgImZwIiwJMHg4LAkweGYJfSwKLSAgeyAic3AiLAkweDksCTB4Zgl9LAotICB7ICJzYiIsCTB4YSwJMHhmCX0sCi0gIHsgInBzciIsCTB4YiwJMHhmCX0sCi0gIHsgImludGJhc2UiLAkweGUsCTB4Zgl9LAotICB7ICJtb2QiLAkweGYsCTB4Zgl9LAotICB7ICAwICwJMHgwLAkweGYJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gbGlzdF9NMDMyW109IC8qIGxtciBzbXIgKi8KLXsKLSAgeyAiYnByMCIsCTB4MCwJMHhmCX0sCi0gIHsgImJwcjEiLAkweDEsCTB4Zgl9LAotICB7ICJwZjAiLAkweDQsCTB4Zgl9LAotICB7ICJwZjEiLAkweDUsCTB4Zgl9LAotICB7ICJzYyIsCTB4OCwJMHhmCX0sCi0gIHsgIm1zciIsCTB4YSwJMHhmCX0sCi0gIHsgImJjbnQiLAkweGIsCTB4Zgl9LAotICB7ICJwdGIwIiwJMHhjLAkweGYJfSwKLSAgeyAicHRiMSIsCTB4ZCwJMHhmCX0sCi0gIHsgImVpYSIsCTB4ZiwJMHhmCX0sCi0gIHsgIDAgLAkweDAsCTB4Zgl9Ci19OwotCi0KLS8qCi0gKiBmaWd1cmUgb3V0IHdoaWNoIG9wdGlvbnMgYXJlIHByZXNlbnQKLSAqLwotc3RhdGljIHZvaWQKLW9wdGxpc3Qob3B0aW9ucywgb3B0aW9uUCwgcmVzdWx0KQotICAgICBpbnQgb3B0aW9uczsKLSAgICAgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiAqb3B0aW9uUDsKLSAgICAgY2hhciAqcmVzdWx0OwotewotICAgIGlmIChvcHRpb25zID09IDApIHsKLQlzcHJpbnRmKHJlc3VsdCwgIltdIik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBzcHJpbnRmKHJlc3VsdCwgIlsiKTsKLQotICAgIGZvciAoOyAob3B0aW9ucyAhPSAwKSAmJiBvcHRpb25QLT5wYXR0ZXJuOyBvcHRpb25QKyspIHsKLQlpZiAoKG9wdGlvbnMgJiBvcHRpb25QLT5tYXRjaCkgPT0gb3B0aW9uUC0+dmFsdWUpIHsKLQkgICAgLyogd2UgZm91bmQgYSBtYXRjaCwgdXBkYXRlIHJlc3VsdCBhbmQgb3B0aW9ucyAqLwotCSAgICBzdHJjYXQocmVzdWx0LCBvcHRpb25QLT5wYXR0ZXJuKTsKLQkgICAgb3B0aW9ucyAmPSB+b3B0aW9uUC0+dmFsdWU7Ci0JICAgIGlmIChvcHRpb25zICE9IDApCS8qIG1vcmUgb3B0aW9ucyB0byBjb21lICovCi0JCXN0cmNhdChyZXN1bHQsICIsIik7Ci0JfQotICAgIH0KLSAgICBpZiAob3B0aW9ucyAhPSAwKQotCXN0cmNhdChyZXN1bHQsICJ1bmRlZmluZWQiKTsKLQotICAgIHN0cmNhdChyZXN1bHQsICJdIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1saXN0X3NlYXJjaCAocmVnX3ZhbHVlLCBvcHRpb25QLCByZXN1bHQpCi0gICAgIGludCByZWdfdmFsdWU7Ci0gICAgIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gKm9wdGlvblA7Ci0gICAgIGNoYXIgKnJlc3VsdDsKLXsKLSAgICBmb3IgKDsgb3B0aW9uUC0+cGF0dGVybjsgb3B0aW9uUCsrKSB7Ci0JaWYgKChyZWdfdmFsdWUgJiBvcHRpb25QLT5tYXRjaCkgPT0gb3B0aW9uUC0+dmFsdWUpIHsKLQkgICAgc3ByaW50ZihyZXN1bHQsICIlcyIsIG9wdGlvblAtPnBhdHRlcm4pOwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLSAgICBzcHJpbnRmKHJlc3VsdCwgInVuZGVmaW5lZCIpOwotfQotDAotLyoKLSAqIGV4dHJhY3QgImNvdW50IiBiaXRzIHN0YXJ0aW5nICJvZmZzZXQiIGJpdHMKLSAqIGludG8gYnVmZmVyCi0gKi8KLQotc3RhdGljIGludAotYml0X2V4dHJhY3QgKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IGNvdW50OwotewotICBpbnQgcmVzdWx0OwotICBpbnQgYml0OwotCi0gIGJ1ZmZlciArPSBvZmZzZXQgPj4gMzsKLSAgb2Zmc2V0ICY9IDc7Ci0gIGJpdCA9IDE7Ci0gIHJlc3VsdCA9IDA7Ci0gIHdoaWxlIChjb3VudC0tKQotICAgIHsKLSAgICAgIEZFVENIX0RBVEEoZGlzX2luZm8sIGJ1ZmZlciArIDEpOwotICAgICAgaWYgKCgqYnVmZmVyICYgKDEgPDwgb2Zmc2V0KSkpCi0JcmVzdWx0IHw9IGJpdDsKLSAgICAgIGlmICgrK29mZnNldCA9PSA4KQotCXsKLQkgIG9mZnNldCA9IDA7Ci0JICBidWZmZXIrKzsKLQl9Ci0gICAgICBiaXQgPDw9IDE7Ci0gICAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBMaWtlIGJpdCBleHRyYWN0IGJ1dCB0aGUgYnVmZmVyIGlzIHZhbGlkIGFuZCBkb2VuJ3QgbmVlZCB0byBiZQotICogZmV0Y2hlZAotICovCi1zdGF0aWMgaW50Ci1iaXRfZXh0cmFjdF9zaW1wbGUgKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IGNvdW50OwotewotICBpbnQgcmVzdWx0OwotICBpbnQgbWFzazsKLSAgaW50IGJpdDsKLQotICBidWZmZXIgKz0gb2Zmc2V0ID4+IDM7Ci0gIG9mZnNldCAmPSA3OwotICBiaXQgPSAxOwotICByZXN1bHQgPSAwOwotICB3aGlsZSAoY291bnQtLSkKLSAgICB7Ci0gICAgICBpZiAoKCpidWZmZXIgJiAoMSA8PCBvZmZzZXQpKSkKLQlyZXN1bHQgfD0gYml0OwotICAgICAgaWYgKCsrb2Zmc2V0ID09IDgpCi0JewotCSAgb2Zmc2V0ID0gMDsKLQkgIGJ1ZmZlcisrOwotCX0KLSAgICAgIGJpdCA8PD0gMTsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iaXRfY29weSAoYnVmZmVyLCBvZmZzZXQsIGNvdW50LCB0bykKLSAgICAgY2hhciAqYnVmZmVyOwotICAgICBpbnQgb2Zmc2V0OwotICAgICBpbnQgY291bnQ7Ci0gICAgIGNoYXIgKnRvOwotewotICBmb3IoOyBjb3VudCA+IDg7IGNvdW50IC09IDgsIHRvKyssIG9mZnNldCArPSA4KQotICAgICp0byA9IGJpdF9leHRyYWN0IChidWZmZXIsIG9mZnNldCwgOCk7Ci0gICp0byA9IGJpdF9leHRyYWN0IChidWZmZXIsIG9mZnNldCwgY291bnQpOwotfQotCi0KLXN0YXRpYyBpbnQKLXNpZ25fZXh0ZW5kICh2YWx1ZSwgYml0cykKLSAgICAgaW50IHZhbHVlLCBiaXRzOwotewotICB2YWx1ZSA9IHZhbHVlICYgKCgxIDw8IGJpdHMpIC0gMSk7Ci0gIHJldHVybiAodmFsdWUgJiAoMSA8PCAoYml0cy0xKSkKLQkgID8gdmFsdWUgfCAofigoMSA8PCBiaXRzKSAtIDEpKQotCSAgOiB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mbGlwX2J5dGVzIChwdHIsIGNvdW50KQotICAgICBjaGFyICpwdHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgY2hhciB0bXA7Ci0KLSAgd2hpbGUgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICB0bXAgPSBwdHJbMF07Ci0gICAgICBwdHJbMF0gPSBwdHJbY291bnQtMV07Ci0gICAgICBwdHJbY291bnQtMV0gPSB0bXA7Ci0gICAgICBwdHIrKzsKLSAgICAgIGNvdW50IC09IDI7Ci0gICAgfQotfQotDAotLyogR2l2ZW4gYSBjaGFyYWN0ZXIgQywgZG9lcyBpdCByZXByZXNlbnQgYSBnZW5lcmFsIGFkZHJlc3NpbmcgbW9kZT8gICovCi0jZGVmaW5lIElzX2dlbihjKSBcCi0gICgoYykgPT0gJ0YnIHx8IChjKSA9PSAnTCcgfHwgKGMpID09ICdCJyBcCi0gICB8fCAoYykgPT0gJ1cnIHx8IChjKSA9PSAnRCcgfHwgKGMpID09ICdBJyB8fCAoYykgPT0gJ0knIHx8IChjKSA9PSAnWicpCi0KLS8qIEFkcmVzc2luZyBtb2Rlcy4gICovCi0jZGVmaW5lIEFkcm1vZF9pbmRleF9ieXRlIDB4MWMKLSNkZWZpbmUgQWRybW9kX2luZGV4X3dvcmQgMHgxZAotI2RlZmluZSBBZHJtb2RfaW5kZXhfZG91Ymxld29yZCAweDFlCi0jZGVmaW5lIEFkcm1vZF9pbmRleF9xdWFkd29yZCAweDFmCi0KLS8qIElzIE1PREUgYW4gaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGU/ICAqLwotI2RlZmluZSBBZHJtb2RfaXNfaW5kZXgobW9kZSkgXAotICAobW9kZSA9PSBBZHJtb2RfaW5kZXhfYnl0ZSBcCi0gICB8fCBtb2RlID09IEFkcm1vZF9pbmRleF93b3JkIFwKLSAgIHx8IG1vZGUgPT0gQWRybW9kX2luZGV4X2RvdWJsZXdvcmQgXAotICAgfHwgbW9kZSA9PSBBZHJtb2RfaW5kZXhfcXVhZHdvcmQpCi0KLQwKLS8qIFByaW50IHRoZSAzMjAwMCBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzIE1FTUFERFIgaW4gZGVidWdnZWQgbWVtb3J5LAotICAgb24gU1RSRUFNLiAgUmV0dXJucyBsZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLCBpbiBieXRlcy4gICovCi0KLWludAotcHJpbnRfaW5zbl9uczMyayAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLSAgcmVnaXN0ZXIgY2hhciAqZDsKLSAgdW5zaWduZWQgc2hvcnQgZmlyc3Rfd29yZDsKLSAgaW50IGlvZmZzZXQ7CQkvKiBiaXRzIGludG8gaW5zdHJ1Y3Rpb24gKi8KLSAgaW50IGFvZmZzZXQ7CQkvKiBiaXRzIGludG8gYXJndW1lbnRzICovCi0gIGNoYXIgYXJnX2J1ZnNbTUFYX0FSR1MrMV1bQVJHX0xFTl07Ci0gIGludCBhcmdudW07Ci0gIGludCBtYXhhcmc7Ci0gIHN0cnVjdCBwcml2YXRlIHByaXY7Ci0gIGJmZF9ieXRlICpidWZmZXIgPSBwcml2LnRoZV9idWZmZXI7Ci0gIGRpc19pbmZvID0gaW5mbzsKLQotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSAmcHJpdjsKLSAgcHJpdi5tYXhfZmV0Y2hlZCA9IHByaXYudGhlX2J1ZmZlcjsKLSAgcHJpdi5pbnNuX3N0YXJ0ID0gbWVtYWRkcjsKLSAgaWYgKHNldGptcCAocHJpdi5iYWlsb3V0KSAhPSAwKQotICAgIC8qIEVycm9yIHJldHVybi4gICovCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIExvb2sgZm9yIDhiaXQgb3Bjb2RlcyBmaXJzdC4gT3RoZXIgd2lzZSwgZmV0Y2hpbmcgdHdvIGJ5dGVzIGNvdWxkIHRha2UKLSAgICogdXMgb3ZlciB0aGUgZW5kIG9mIGFjY2Vzc2libGUgZGF0YSB1bm5lY2Vzc2FyaWxseQotICAgKi8KLSAgRkVUQ0hfREFUQShpbmZvLCBidWZmZXIgKyAxKTsKLSAgZm9yIChpID0gMDsgaSA8IE5PUENPREVTOyBpKyspCi0gICAgaWYgKG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX2lkX3NpemUgPD0gOAotCSYmICgoYnVmZmVyWzBdCi0JICAgICAmICgoKHVuc2lnbmVkIGxvbmcpIDEgPDwgbnMzMmtfb3Bjb2Rlc1tpXS5vcGNvZGVfaWRfc2l6ZSkgLSAxKSkKLQkgICAgPT0gbnMzMmtfb3Bjb2Rlc1tpXS5vcGNvZGVfc2VlZCkpCi0gICAgICBicmVhazsKLSAgaWYgKGkgPT0gTk9QQ09ERVMpIHsKLSAgICAvKiBNYXliZSBpdCBpcyA5IHRvIDE2IGJpdHMgYmlnICovCi0gICAgRkVUQ0hfREFUQShpbmZvLCBidWZmZXIgKyAyKTsKLSAgICBmaXJzdF93b3JkID0gcmVhZF9tZW1vcnlfaW50ZWdlcihidWZmZXIsIDIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE5PUENPREVTOyBpKyspCi0gICAgICBpZiAoKGZpcnN0X3dvcmQKLQkgICAmICgoKHVuc2lnbmVkIGxvbmcpIDEgPDwgbnMzMmtfb3Bjb2Rlc1tpXS5vcGNvZGVfaWRfc2l6ZSkgLSAxKSkKLQkgID09IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX3NlZWQpCi0JYnJlYWs7Ci0KLSAgICAvKiBIYW5kbGUgdW5kZWZpbmVkIGluc3RydWN0aW9ucy4gICovCi0gICAgaWYgKGkgPT0gTk9QQ09ERVMpCi0gICAgICB7Ci0JKCpkaXNfaW5mby0+ZnByaW50Zl9mdW5jKShkaXNfaW5mby0+c3RyZWFtLCAiMCVvIiwgYnVmZmVyWzBdKTsKLQlyZXR1cm4gMTsKLSAgICAgIH0KLSAgfQotCi0gICgqZGlzX2luZm8tPmZwcmludGZfZnVuYykoZGlzX2luZm8tPnN0cmVhbSwgIiVzIiwgbnMzMmtfb3Bjb2Rlc1tpXS5uYW1lKTsKLQotICBpb2Zmc2V0ID0gbnMzMmtfb3Bjb2Rlc1tpXS5vcGNvZGVfc2l6ZTsKLSAgYW9mZnNldCA9IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX3NpemU7Ci0gIGQgPSBuczMya19vcGNvZGVzW2ldLm9wZXJhbmRzOwotCi0gIGlmICgqZCkKLSAgICB7Ci0gICAgICAvKiBPZmZzZXQgaW4gYml0cyBvZiB0aGUgZmlyc3QgdGhpbmcgYmV5b25kIGVhY2ggaW5kZXggYnl0ZS4KLQkgRWxlbWVudCAwIGlzIGZvciBvcGVyYW5kIEEgYW5kIGVsZW1lbnQgMSBpcyBmb3Igb3BlcmFuZCBCLgotCSBUaGUgcmVzdCBhcmUgaXJyZWxldmFudCwgYnV0IHdlIHB1dCB0aGVtIGhlcmUgc28gd2UgZG9uJ3QKLQkgaW5kZXggb3V0c2lkZSB0aGUgYXJyYXkuICAqLwotICAgICAgaW50IGluZGV4X29mZnNldFtNQVhfQVJHU107Ci0KLSAgICAgIC8qIDAgZm9yIG9wZXJhbmQgQSwgMSBmb3Igb3BlcmFuZCBCLCBncmVhdGVyIGZvciBvdGhlciBhcmdzLiAgKi8KLSAgICAgIGludCB3aGljaGFyZyA9IDA7Ci0gICAgICAKLSAgICAgICgqZGlzX2luZm8tPmZwcmludGZfZnVuYykoZGlzX2luZm8tPnN0cmVhbSwgIlx0Iik7Ci0KLSAgICAgIG1heGFyZyA9IDA7Ci0KLSAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gZmluZCBhbmQga2VlcCB0cmFjayBvZiB0aGUgaW5kZXggYnl0ZXMsCi0JIGlmIHdlIGFyZSB1c2luZyBzY2FsZWQgaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGUsIHNpbmNlIHRoZSBpbmRleAotCSBieXRlcyBvY2N1ciByaWdodCBhZnRlciB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24sIG5vdCBhcyBwYXJ0Ci0JIG9mIHRoZSBhZGRyZXNzaW5nIGV4dGVuc2lvbi4gICovCi0gICAgICBpZiAoSXNfZ2VuKGRbMV0pKQotCXsKLQkgIGludCBhZGRyX21vZGUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBpb2Zmc2V0IC0gNSwgNSk7Ci0KLQkgIGlmIChBZHJtb2RfaXNfaW5kZXggKGFkZHJfbW9kZSkpCi0JICAgIHsKLQkgICAgICBhb2Zmc2V0ICs9IDg7Ci0JICAgICAgaW5kZXhfb2Zmc2V0WzBdID0gYW9mZnNldDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChkWzJdICYmIElzX2dlbihkWzNdKSkKLQl7Ci0JICBpbnQgYWRkcl9tb2RlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW9mZnNldCAtIDEwLCA1KTsKLQotCSAgaWYgKEFkcm1vZF9pc19pbmRleCAoYWRkcl9tb2RlKSkKLQkgICAgewotCSAgICAgIGFvZmZzZXQgKz0gODsKLQkgICAgICBpbmRleF9vZmZzZXRbMV0gPSBhb2Zmc2V0OwotCSAgICB9Ci0JfQotCi0gICAgICB3aGlsZSAoKmQpCi0JewotCSAgYXJnbnVtID0gKmQgLSAnMSc7Ci0JICBkKys7Ci0JICBpZiAoYXJnbnVtID4gbWF4YXJnICYmIGFyZ251bSA8IE1BWF9BUkdTKQotCSAgICBtYXhhcmcgPSBhcmdudW07Ci0JICBpb2Zmc2V0ID0gcHJpbnRfaW5zbl9hcmcgKCpkLCBpb2Zmc2V0LCAmYW9mZnNldCwgYnVmZmVyLAotCQkJCSAgICBtZW1hZGRyLCBhcmdfYnVmc1thcmdudW1dLAotCQkJCSAgICBpbmRleF9vZmZzZXRbd2hpY2hhcmddKTsKLQkgIGQrKzsKLQkgIHdoaWNoYXJnKys7Ci0JfQotICAgICAgZm9yIChhcmdudW0gPSAwOyBhcmdudW0gPD0gbWF4YXJnOyBhcmdudW0rKykKLQl7Ci0JICBiZmRfdm1hIGFkZHI7Ci0JICBjaGFyICpjaDsKLQkgIGZvciAoY2ggPSBhcmdfYnVmc1thcmdudW1dOyAqY2g7KQotCSAgICB7Ci0JICAgICAgaWYgKCpjaCA9PSBORVhUX0lTX0FERFIpCi0JCXsKLQkJICArK2NoOwotCQkgIGFkZHIgPSBiZmRfc2Nhbl92bWEgKGNoLCBOVUxMLCAxNik7Ci0JCSAgKCpkaXNfaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciwgZGlzX2luZm8pOwotCQkgIHdoaWxlICgqY2ggJiYgKmNoICE9IE5FWFRfSVNfQUREUikKLQkJICAgICsrY2g7Ci0JCSAgaWYgKCpjaCkKLQkJICAgICsrY2g7Ci0JCX0KLQkgICAgICBlbHNlCi0JCSgqZGlzX2luZm8tPmZwcmludGZfZnVuYykoZGlzX2luZm8tPnN0cmVhbSwgIiVjIiwgKmNoKyspOwotCSAgICB9Ci0JICBpZiAoYXJnbnVtIDwgbWF4YXJnKQotCSAgICAoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICIsICIpOwotCX0KLSAgICB9Ci0gIHJldHVybiBhb2Zmc2V0IC8gODsKLX0KLQotLyogUHJpbnQgYW4gaW5zdHJ1Y3Rpb24gb3BlcmFuZCBvZiBjYXRlZ29yeSBnaXZlbiBieSBkLiAgSU9GRlNFVCBpcwotICAgdGhlIGJpdCBwb3NpdGlvbiBiZWxvdyB3aGljaCBzbWFsbCAoPDEgYnl0ZSkgcGFydHMgb2YgdGhlIG9wZXJhbmQgY2FuCi0gICBiZSBmb3VuZCAodXN1YWxseSBpbiB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24sIGJ1dCBmb3IgaW5kZXhlZAotICAgYWRkcmVzc2luZyBpdCBjYW4gYmUgaW4gdGhlIGluZGV4IGJ5dGUpLiAgQU9GRlNFVFAgaXMgYSBwb2ludGVyIHRvIHRoZQotICAgYml0IHBvc2l0aW9uIG9mIHRoZSBhZGRyZXNzaW5nIGV4dGVuc2lvbi4gIEJVRkZFUiBjb250YWlucyB0aGUKLSAgIGluc3RydWN0aW9uLiAgQUREUiBpcyB3aGVyZSBCVUZGRVIgd2FzIHJlYWQgZnJvbS4gIFB1dCB0aGUgZGlzYXNzZW1ibGVkCi0gICB2ZXJzaW9uIG9mIHRoZSBvcGVyYW5kIGluIFJFU1VMVC4gIElOREVYX09GRlNFVCBpcyB0aGUgYml0IHBvc2l0aW9uCi0gICBvZiB0aGUgaW5kZXggYnl0ZSAoaXQgY29udGFpbnMgZ2FyYmFnZSBpZiB0aGlzIG9wZXJhbmQgaXMgbm90IGEKLSAgIGdlbmVyYWwgb3BlcmFuZCB1c2luZyBzY2FsZWQgaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGUpLiAgKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmcgKGQsIGlvZmZzZXQsIGFvZmZzZXRwLCBidWZmZXIsIGFkZHIsIHJlc3VsdCwgaW5kZXhfb2Zmc2V0KQotICAgICBpbnQgZDsKLSAgICAgaW50IGlvZmZzZXQsICphb2Zmc2V0cDsKLSAgICAgY2hhciAqYnVmZmVyOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGNoYXIgKnJlc3VsdDsKLSAgICAgaW50IGluZGV4X29mZnNldDsKLXsKLSAgaW50IGFkZHJfbW9kZTsKLSAgZmxvYXQgRnZhbHVlOwotICBkb3VibGUgTHZhbHVlOwotICBpbnQgSXZhbHVlOwotICBpbnQgZGlzcDEsIGRpc3AyOwotICBpbnQgaW5kZXg7Ci0gIGludCBzaXplOwotCi0gIHN3aXRjaCAoZCkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAvKiBhICJnZW4iIG9wZXJhbmQgYnV0IDUgYml0cyBmcm9tIHRoZSBlbmQgb2YgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGlvZmZzZXQgLT0gNTsKLSAgICBjYXNlICdaJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdMJzoKLSAgICBjYXNlICdJJzoKLSAgICBjYXNlICdCJzoKLSAgICBjYXNlICdXJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdBJzoKLSAgICAgIGFkZHJfbW9kZSA9IGJpdF9leHRyYWN0IChidWZmZXIsIGlvZmZzZXQtNSwgNSk7Ci0gICAgICBpb2Zmc2V0IC09IDU7Ci0gICAgICBzd2l0Y2ggKGFkZHJfbW9kZSkKLQl7Ci0JY2FzZSAweDA6IGNhc2UgMHgxOiBjYXNlIDB4MjogY2FzZSAweDM6Ci0JY2FzZSAweDQ6IGNhc2UgMHg1OiBjYXNlIDB4NjogY2FzZSAweDc6Ci0JICAvKiByZWdpc3RlciBtb2RlIFIwIC0tIFI3ICovCi0JICBzd2l0Y2ggKGQpCi0JICAgIHsKLQkgICAgY2FzZSAnRic6Ci0JICAgIGNhc2UgJ0wnOgotCSAgICBjYXNlICdaJzoKLQkgICAgICBzcHJpbnRmIChyZXN1bHQsICJmJWQiLCBhZGRyX21vZGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHNwcmludGYgKHJlc3VsdCwgInIlZCIsIGFkZHJfbW9kZSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMHg4OiBjYXNlIDB4OTogY2FzZSAweGE6IGNhc2UgMHhiOgotCWNhc2UgMHhjOiBjYXNlIDB4ZDogY2FzZSAweGU6IGNhc2UgMHhmOgotCSAgLyogUmVnaXN0ZXIgcmVsYXRpdmUgZGlzcChSMCAtLSBSNykgKi8KLQkgIGRpc3AxID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICBzcHJpbnRmIChyZXN1bHQsICIlZChyJWQpIiwgZGlzcDEsIGFkZHJfbW9kZSAmIDcpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDEwOgotCWNhc2UgMHgxMToKLQljYXNlIDB4MTI6Ci0JICAvKiBNZW1vcnkgcmVsYXRpdmUgZGlzcDIoZGlzcDEoRlAsIFNQLCBTQikpICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgZGlzcDIgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIiVkKCVkKCVzKSkiLCBkaXNwMiwgZGlzcDEsCi0JCSAgIGFkZHJfbW9kZT09MHgxMD8iZnAiOmFkZHJfbW9kZT09MHgxMT8ic3AiOiJzYiIpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDEzOgotCSAgLyogcmVzZXJ2ZWQgKi8KLQkgIHNwcmludGYgKHJlc3VsdCwgInJlc2VydmVkIik7Ci0JICBicmVhazsKLQljYXNlIDB4MTQ6Ci0JICAvKiBJbW1lZGlhdGUgKi8KLQkgIHN3aXRjaCAoZCkKLQkgICAgewotCSAgICBjYXNlICdJJzogY2FzZSAnWic6IGNhc2UgJ0EnOgotCSAgICAgIC8qIEkgYW5kIFogYXJlIG91dHB1dCBvcGVyYW5kcyBhbmQgY2FuYHQgYmUgaW1tZWRpYXRlCi0JICAgICAgICogQSBpcyBhbiBhZGRyZXNzIGFuZCB3ZSBjYW5gdCBoYXZlIHRoZSBhZGRyZXNzIG9mCi0JICAgICAgICogYW4gaW1tZWRpYXRlIGVpdGhlci4gV2UgZG9uJ3Qga25vdyBob3cgbXVjaCB0byBpbmNyZWFzZQotCSAgICAgICAqIGFvZmZzZXRwIGJ5IHNpbmNlIHdoYXRldmVyIGdlbmVyYXRlZCB0aGlzIGlzIGJyb2tlbgotCSAgICAgICAqIGFueXdheSEKLQkgICAgICAgKi8KLQkgICAgICBzcHJpbnRmIChyZXN1bHQsIF8oIiQ8dW5kZWZpbmVkPiIpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnQic6Ci0JICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCA4KTsKLQkgICAgICBJdmFsdWUgPSBzaWduX2V4dGVuZCAoSXZhbHVlLCA4KTsKLQkgICAgICAqYW9mZnNldHAgKz0gODsKLQkgICAgICBzcHJpbnRmIChyZXN1bHQsICIkJWQiLCBJdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdXJzoKLQkgICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDE2KTsKLQkgICAgICBmbGlwX2J5dGVzICgmSXZhbHVlLCAyKTsKLQkgICAgICAqYW9mZnNldHAgKz0gMTY7Ci0JICAgICAgSXZhbHVlID0gc2lnbl9leHRlbmQgKEl2YWx1ZSwgMTYpOwotCSAgICAgIHNwcmludGYgKHJlc3VsdCwgIiQlZCIsIEl2YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0QnOgotCSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgMzIpOwotCSAgICAgIGZsaXBfYnl0ZXMgKCZJdmFsdWUsIDQpOwotCSAgICAgICphb2Zmc2V0cCArPSAzMjsKLQkgICAgICBzcHJpbnRmIChyZXN1bHQsICIkJWQiLCBJdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdGJzoKLQkgICAgICBiaXRfY29weSAoYnVmZmVyLCAqYW9mZnNldHAsIDMyLCAoY2hhciAqKSAmRnZhbHVlKTsKLQkgICAgICBmbGlwX2J5dGVzICgmRnZhbHVlLCA0KTsKLQkgICAgICAqYW9mZnNldHAgKz0gMzI7Ci0JICAgICAgaWYgKElOVkFMSURfRkxPQVQgKCZGdmFsdWUsIDQpKQotCQlzcHJpbnRmIChyZXN1bHQsICI8PGludmFsaWQgZmxvYXQgMHglLjh4Pj4iLCAqKGludCAqKSAmRnZhbHVlKTsKLQkgICAgICBlbHNlIC8qIGFzc3VtZSBob3N0IGhhcyBpZWVlIGZsb2F0ICovCi0JCXNwcmludGYgKHJlc3VsdCwgIiQlZyIsIEZ2YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0wnOgotCSAgICAgIGJpdF9jb3B5IChidWZmZXIsICphb2Zmc2V0cCwgNjQsIChjaGFyICopICZMdmFsdWUpOwotCSAgICAgIGZsaXBfYnl0ZXMgKCZMdmFsdWUsIDgpOwotCSAgICAgICphb2Zmc2V0cCArPSA2NDsKLQkgICAgICBpZiAoSU5WQUxJRF9GTE9BVCAoJkx2YWx1ZSwgOCkpCi0JCXNwcmludGYgKHJlc3VsdCwgIjw8aW52YWxpZCBsb25nIDB4JS44eCUuOHg+PiIsCi0JCQkgKigoKGludCAqKSAmTHZhbHVlKSArIDEpLCAqKGludCAqKSAmTHZhbHVlKTsKLQkgICAgICBlbHNlIC8qIGFzc3VtZSBob3N0IGhhcyBpZWVlIGZsb2F0ICovCi0JCXNwcmludGYgKHJlc3VsdCwgIiQlZyIsIEx2YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMHgxNToKLQkgIC8qIEFic29sdXRlIEBkaXNwICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiQHwlZHwiLCBkaXNwMSk7Ci0JICBicmVhazsKLQljYXNlIDB4MTY6Ci0JICAvKiBFeHRlcm5hbCBFWFQoZGlzcDEpICsgZGlzcDIgKE1vZCB0YWJsZSBzdHVmZikgKi8KLQkgIGRpc3AxID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICBkaXNwMiA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiRVhUKCVkKSArICVkIiwgZGlzcDEsIGRpc3AyKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxNzoKLQkgIC8qIFRvcCBvZiBzdGFjayB0b3MgKi8KLQkgIHNwcmludGYgKHJlc3VsdCwgInRvcyIpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDE4OgotCSAgLyogTWVtb3J5IHNwYWNlIGRpc3AoRlApICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiJWQoZnApIiwgZGlzcDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDE5OgotCSAgLyogTWVtb3J5IHNwYWNlIGRpc3AoU1ApICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiJWQoc3ApIiwgZGlzcDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDFhOgotCSAgLyogTWVtb3J5IHNwYWNlIGRpc3AoU0IpICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiJWQoc2IpIiwgZGlzcDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDFiOgotCSAgLyogTWVtb3J5IHNwYWNlIGRpc3AoUEMpICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgKnJlc3VsdCsrID0gTkVYVF9JU19BRERSOwotCSAgc3ByaW50Zl92bWEgKHJlc3VsdCwgYWRkciArIGRpc3AxKTsKLQkgIHJlc3VsdCArPSBzdHJsZW4gKHJlc3VsdCk7Ci0JICAqcmVzdWx0KysgPSBORVhUX0lTX0FERFI7Ci0JICAqcmVzdWx0ID0gJ1wwJzsKLQkgIGJyZWFrOwotCWNhc2UgMHgxYzoKLQljYXNlIDB4MWQ6Ci0JY2FzZSAweDFlOgotCWNhc2UgMHgxZjoKLQkgIC8qIFNjYWxlZCBpbmRleCBiYXNlbW9kZVtSMCAtLSBSNzpCLFcsRCxRXSAqLwotCSAgaW5kZXggPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBpbmRleF9vZmZzZXQgLSA4LCAzKTsKLQkgIHByaW50X2luc25fYXJnIChkLCBpbmRleF9vZmZzZXQsIGFvZmZzZXRwLCBidWZmZXIsIGFkZHIsCi0JCQkgIHJlc3VsdCwgMCk7Ci0JICB7Ci0JICAgIHN0YXRpYyBjb25zdCBjaGFyICppbmQgPSAiYndkcSI7Ci0JICAgIGNoYXIgKm9mZjsKLQotCSAgICBvZmYgPSByZXN1bHQgKyBzdHJsZW4gKHJlc3VsdCk7Ci0JICAgIHNwcmludGYgKG9mZiwgIltyJWQ6JWNdIiwgaW5kZXgsCi0JCSAgICAgaW5kW2FkZHJfbW9kZSAmIDNdKTsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0gnOgotICAgIGNhc2UgJ3EnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW9mZnNldC00LCA0KTsKLSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDQpOwotICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJWQiLCBJdmFsdWUpOwotICAgICAgaW9mZnNldCAtPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncic6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBpb2Zmc2V0LTMsIDMpOwotICAgICAgc3ByaW50ZiAocmVzdWx0LCAiciVkIiwgSXZhbHVlJjcpOwotICAgICAgaW9mZnNldCAtPSAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBzcHJpbnRmIChyZXN1bHQsICIlZCIsIGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2InOgotICAgICAgSXZhbHVlID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0gICAgICAvKgotICAgICAgICogV2FybmluZyEhICBIQUNLIEFMRVJUIQotICAgICAgICogT3BlcmFuZCB0eXBlICdiJyBpcyBvbmx5IHVzZWQgYnkgdGhlIGNtcHtiLHcsZH0gYW5kCi0gICAgICAgKiBtb3Zte2IsdyxkfSBpbnN0cnVjdGlvbnM7IHdlIG5lZWQgdG8ga25vdyB3aGV0aGVyCi0gICAgICAgKiBpdCdzIGEgYGInIG9yIGB3JyBvciBgZCcgaW5zdHJ1Y3Rpb247IGFuZCBmb3IgYm90aAotICAgICAgICogY21wbSBhbmQgbW92bSBpdCdzIHN0b3JlZCBhdCB0aGUgc2FtZSBwbGFjZSBzbyB3ZQotICAgICAgICoganVzdCBncmFiIHR3byBiaXRzIG9mIHRoZSBvcGNvZGUgYW5kIGxvb2sgYXQgaXQuLi4KLSAgICAgICAqIAotICAgICAgICovCi0gICAgICBzaXplID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0LTYsIDIpOwotICAgICAgaWYgKHNpemUgPT0gMCkJCS8qIDAwID0+IGIgKi8KLQlzaXplID0gMTsKLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gMSkJLyogMDEgPT4gdyAqLwotCXNpemUgPSAyOwotICAgICAgZWxzZQotCXNpemUgPSA0OwkJLyogMTEgPT4gZCAqLwotCi0gICAgICBzcHJpbnRmIChyZXN1bHQsICIlZCIsIChJdmFsdWUgLyBzaXplKSArIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncCc6Ci0gICAgICAqcmVzdWx0KysgPSBORVhUX0lTX0FERFI7Ci0gICAgICBzcHJpbnRmX3ZtYSAocmVzdWx0LCBhZGRyICsgZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCkpOwotICAgICAgcmVzdWx0ICs9IHN0cmxlbiAocmVzdWx0KTsKLSAgICAgICpyZXN1bHQrKyA9IE5FWFRfSVNfQUREUjsKLSAgICAgICpyZXN1bHQgPSAnXDAnOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnaSc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDgpOwotICAgICAgKmFvZmZzZXRwICs9IDg7Ci0gICAgICBzcHJpbnRmIChyZXN1bHQsICIweCV4IiwgSXZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3UnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCA4KTsKLSAgICAgIG9wdGxpc3QoSXZhbHVlLCBvcHRfdSwgcmVzdWx0KTsKLSAgICAgICphb2Zmc2V0cCArPSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnVSc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsICphb2Zmc2V0cCwgOCk7Ci0gICAgICBvcHRsaXN0KEl2YWx1ZSwgb3B0X1UsIHJlc3VsdCk7Ci0gICAgICAqYW9mZnNldHAgKz0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ08nOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0LTksIDkpOwotICAgICAgb3B0bGlzdChJdmFsdWUsIG9wdF9PLCByZXN1bHQpOwotICAgICAgaW9mZnNldCAtPSA5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnQyc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQtNCwgNCk7Ci0gICAgICBvcHRsaXN0KEl2YWx1ZSwgb3B0X0MsIHJlc3VsdCk7Ci0gICAgICBpb2Zmc2V0IC09IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdTJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldCAtIDgsIDgpOwotICAgICAgb3B0bGlzdChJdmFsdWUsIG9wdF9TLCByZXN1bHQpOwotICAgICAgaW9mZnNldCAtPSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnTSc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQtNCwgNCk7Ci0gICAgICBsaXN0X3NlYXJjaChJdmFsdWUsIDAgPyBsaXN0X00wMzIgOiBsaXN0X001MzIsIHJlc3VsdCk7Ci0gICAgICBpb2Zmc2V0IC09IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdQJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldC00LCA0KTsKLSAgICAgIGxpc3Rfc2VhcmNoKEl2YWx1ZSwgMCA/IGxpc3RfUDAzMiA6IGxpc3RfUDUzMiwgcmVzdWx0KTsKLSAgICAgIGlvZmZzZXQgLT0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2cnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCAqYW9mZnNldHAsIDMpOwotICAgICAgc3ByaW50ZihyZXN1bHQsICIlZCIsIEl2YWx1ZSk7Ci0gICAgICAqYW9mZnNldHAgKz0gMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0cnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCAqYW9mZnNldHAsIDUpOwotICAgICAgc3ByaW50ZihyZXN1bHQsICIlZCIsIEl2YWx1ZSArIDEpOwotICAgICAgKmFvZmZzZXRwICs9IDU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBpb2Zmc2V0OwotfQotCi1zdGF0aWMgaW50Ci1nZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKQotICAgICBjaGFyICpidWZmZXI7Ci0gICAgIGludCAqYW9mZnNldHA7Ci17Ci0gIGludCBJdmFsdWU7Ci0gIHNob3J0IEl2YWx1ZTI7Ci0KLSAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCA4KTsKLSAgc3dpdGNoIChJdmFsdWUgJiAweGMwKQotICAgIHsKLSAgICBjYXNlIDB4MDA6Ci0gICAgY2FzZSAweDQwOgotICAgICAgSXZhbHVlID0gc2lnbl9leHRlbmQgKEl2YWx1ZSwgNyk7Ci0gICAgICAqYW9mZnNldHAgKz0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg4MDoKLSAgICAgIEl2YWx1ZTIgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDE2KTsKLSAgICAgIGZsaXBfYnl0ZXMgKCZJdmFsdWUyLCAyKTsKLSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUyLCAxNCk7Ci0gICAgICAqYW9mZnNldHAgKz0gMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4YzA6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDMyKTsKLSAgICAgIGZsaXBfYnl0ZXMgKCZJdmFsdWUsIDQpOwotICAgICAgSXZhbHVlID0gc2lnbl9leHRlbmQgKEl2YWx1ZSwgMzApOwotICAgICAgKmFvZmZzZXRwICs9IDMyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gSXZhbHVlOwotfQotDAotCi0jaWYgMSAvKiBhIHZlcnNpb24gdGhhdCBzaG91bGQgd29yayBvbiBuczMyayBmJ3MmZCdzIG9uIGFueSBtYWNoaW5lICovCi1zdGF0aWMgaW50Ci1pbnZhbGlkX2Zsb2F0IChwLCBsZW4pCi0gICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gICAgIHJlZ2lzdGVyIGludCBsZW47Ci17Ci0gIHJlZ2lzdGVyIGludCB2YWw7Ci0KLSAgaWYgKCBsZW4gPT0gNCApCi0gICAgdmFsID0gKGJpdF9leHRyYWN0X3NpbXBsZShwLCAyMywgOCkvKmV4cG9uZW50Ki8gPT0gMHhmZgotCSAgIHx8IChiaXRfZXh0cmFjdF9zaW1wbGUocCwgMjMsIDgpLypleHBvbmVudCovID09IDAgJiYKLQkgICAgICAgYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDAsIDIzKS8qbWFudGlzYSovICE9IDApKTsKLSAgZWxzZSBpZiAoIGxlbiA9PSA4ICkKLSAgICB2YWwgPSAoYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDUyLCAxMSkvKmV4cG9uZW50Ki8gPT0gMHg3ZmYKLQkgICB8fCAoYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDUyLCAxMSkvKmV4cG9uZW50Ki8gPT0gMAotCSAgICAgICAmJiAoYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDAsIDMyKS8qbG93IG1hbnRpc2EqLyAhPSAwCi0JCSAgIHx8IGJpdF9leHRyYWN0X3NpbXBsZShwLCAzMiwgMjApLypoaWdoIG1hbnRpc2EqLyAhPSAwKSkpOwotICBlbHNlCi0gICAgdmFsID0gMTsKLSAgcmV0dXJuICh2YWwpOwotfQotI2Vsc2UKLQotLyogYXNzdW1lcyB0aGUgYnl0ZXMgaGF2ZSBiZWVuIHN3YXBwZWQgdG8gbG9jYWwgb3JkZXIgKi8KLXR5cGVkZWYgdW5pb24geyBkb3VibGUgZDsKLQkJZmxvYXQgZjsKLQkJc3RydWN0IHsgdW5zaWduZWQgbToyMywgZTo4LCA6MTt9IHNmOwotCQlzdHJ1Y3QgeyB1bnNpZ25lZCBsbTsgdW5zaWduZWQgbToyMCwgZToxMSwgOjE7fSBzZDsKLQkgICAgICB9IGZsb2F0X3R5cGVfdTsKLQotc3RhdGljIGludAotaW52YWxpZF9mbG9hdCAocCwgbGVuKQotICAgICByZWdpc3RlciBmbG9hdF90eXBlX3UgKnA7Ci0gICAgIHJlZ2lzdGVyIGludCBsZW47Ci17Ci0gIHJlZ2lzdGVyIGludCB2YWw7Ci0gIGlmICggbGVuID09IHNpemVvZiAoZmxvYXQpICkKLSAgICB2YWwgPSAocC0+c2YuZSA9PSAweGZmCi0JICAgfHwgKHAtPnNmLmUgPT0gMCAmJiBwLT5zZi5tICE9IDApKTsKLSAgZWxzZSBpZiAoIGxlbiA9PSBzaXplb2YgKGRvdWJsZSkgKQotICAgIHZhbCA9IChwLT5zZC5lID09IDB4N2ZmCi0JICAgfHwgKHAtPnNkLmUgPT0gMCAmJiAocC0+c2QubSAhPSAwIHx8IHAtPnNkLmxtICE9IDApKSk7Ci0gIGVsc2UKLSAgICB2YWwgPSAxOwotICByZXR1cm4gKHZhbCk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvb3BpbnRsLmggYi9vcGNvZGVzL29waW50bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTkwMTYwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvb3BpbnRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBvcGludGwuaCAtIG9wY29kZXMgc3BlY2lmaWMgaGVhZGVyIGZvciBnZXR0ZXh0IGNvZGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgVG9tIFRyb21leSA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBvcGNvZGVzIGxpYnJhcnkgdXNlZCBieSBHQVMgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2lmZGVmIEVOQUJMRV9OTFMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotIyBkZWZpbmUgXyhTdHJpbmcpIGRnZXR0ZXh0IChQQUNLQUdFLCBTdHJpbmcpCi0jIGlmZGVmIGdldHRleHRfbm9vcAotIyAgZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jIGVsc2UKLSMgIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jIGVuZGlmCi0jZWxzZQotLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KLSMgZGVmaW5lIHRleHRkb21haW4oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBkY2dldHRleHQoRG9tYWluLE1lc3NhZ2UsVHlwZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQotIyBkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvcGotZGlzLmMgYi9vcGNvZGVzL3BqLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDk4Mjk1Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvcGotZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyogcGotZGlzLmMgLS0gRGlzYXNzZW1ibGUgcGljb0phdmEgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCBvZiBUcmFuc21ldGEgKHNhY0Bwb2JveC5jb20pLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgIm9wY29kZS9wai5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotZXh0ZXJuIGNvbnN0IHBqX29wY19pbmZvX3QgcGpfb3BjX2luZm9bNTEyXTsKLQotc3RhdGljIGludCBnZXRfaW50IChtZW1hZGRyLCBpcHRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGludCAqaXB0cjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHVuc2lnbmVkIGNoYXIgaXZhbFs0XTsKLQotICBpbnQgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciwgaXZhbCwgNCwgaW5mbyk7Ci0KLSAgKmlwdHIgPSAoaXZhbFswXSA8PCAyNCkgCi0gICAgfCAoaXZhbFsxXSA8PCAxNikgCi0gICAgfCAoaXZhbFsyXSA8PCA4KSAKLSAgICB8IChpdmFsWzNdIDw8IDApIDsKLQotICByZXR1cm4gc3RhdHVzOwotfQotCi1pbnQKLXByaW50X2luc25fcGogKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGZwcmludGZfZnR5cGUgZnByaW50Zl9mbiA9IGluZm8tPmZwcmludGZfZnVuYzsKLSAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICB1bnNpZ25lZCBjaGFyIG9wY29kZTsKLSAgaW50IHN0YXR1czsKLQotICBpZiAoKHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKGFkZHIsICZvcGNvZGUsIDEsIGluZm8pKSkKLSAgICBnb3RvIGZhaWw7Ci0KLSAgaWYgKG9wY29kZSA9PSAweGZmKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgYnl0ZV8yOwotICAgICAgaWYgKChzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChhZGRyICsgMSwgJmJ5dGVfMiwgMSwgaW5mbykpKQotCWdvdG8gZmFpbDsKLSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIiVzXHQiLCBwal9vcGNfaW5mb1tvcGNvZGUgKyBieXRlXzJdLm5hbWUpOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqc2VwID0gIlx0IjsKLSAgICAgIGludCBpbnNuX3N0YXJ0ID0gYWRkcjsKLSAgICAgIGNvbnN0IHBqX29wY19pbmZvX3QgKm9wID0gJnBqX29wY19pbmZvW29wY29kZV07Ci0gICAgICBpbnQgYTsKLSAgICAgIGFkZHIrKzsKLSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIiVzIiwgb3AtPm5hbWUpOwotCi0gICAgICAvKiBUaGUgdGFibGVzd2l0Y2ggaW5zdHJ1Y3Rpb24gaXMgZm9sbG93ZWQgYnkgdGhlIGRlZmF1bHQKLQkgYWRkcmVzcywgbG93IHZhbHVlLCBoaWdoIHZhbHVlIGFuZCB0aGUgZGVzdGluYXRpb25zLiAqLwotCi0gICAgICBpZiAoc3RyY21wIChvcC0+bmFtZSwgInRhYmxlc3dpdGNoIikgPT0gMCkKLQl7Ci0JICBpbnQgbG93dmFsOwotCSAgaW50IGhpZ2h2YWw7Ci0JICBpbnQgdmFsOwotCi0JICBhZGRyID0gKGFkZHIgKyAzKSAmIH4zOwotCSAgaWYgKChzdGF0dXMgPSBnZXRfaW50IChhZGRyLCAmdmFsLCBpbmZvKSkpCi0JICAgIGdvdG8gZmFpbDsKLQotCSAgZnByaW50Zl9mbiAoc3RyZWFtLCIgZGVmYXVsdDogIik7Ci0JICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCArIGluc25fc3RhcnQsIGluZm8pOwotCSAgYWRkciArPSA0OwotCi0JICBpZiAoKHN0YXR1cyA9IGdldF9pbnQgKGFkZHIsICZsb3d2YWwsIGluZm8pKSkKLQkgICAgZ290byBmYWlsOwotCSAgYWRkciArPSA0OwotCi0JICBpZiAoKHN0YXR1cyA9IGdldF9pbnQgKGFkZHIsICZoaWdodmFsLCBpbmZvKSkpCi0JICAgIGdvdG8gZmFpbDsKLQkgIGFkZHIgKz0gNDsKLQotCSAgd2hpbGUgKGxvd3ZhbCA8PSBoaWdodmFsKSB7Ci0JICAgIGlmICgoc3RhdHVzID0gZ2V0X2ludCAoYWRkciwgJnZhbCwgaW5mbykpKQotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgZnByaW50Zl9mbiAoc3RyZWFtLCIgJWQ6WyIsIGxvd3ZhbCk7Ci0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsICsgaW5zbl9zdGFydCwgaW5mbyk7Ci0JICAgIGZwcmludGZfZm4gKHN0cmVhbSwiIF0iKTsKLQkgICAgYWRkciArPSA0OwotCSAgICBsb3d2YWwrKzsKLQkgIH0KLQkgIHJldHVybiBhZGRyIC0gaW5zbl9zdGFydDsKLQl9Ci0KLSAgICAgIC8qIFRoZSBsb29rdXBzd2l0Y2ggaW5zdHJ1Y3Rpb24gaXMgZm9sbG93ZWQgYnkgdGhlIGRlZmF1bHQKLQkgYWRkcmVzcywgZWxlbWVudCBjb3VudCBhbmQgcGFpcnMgb2YgdmFsdWVzIGFuZAotCSBhZGRyZXNzZXMuICovCi0JICAgIAotICAgICAgaWYgKHN0cmNtcCAob3AtPm5hbWUsICJsb29rdXBzd2l0Y2giKSA9PSAwKQotCXsKLQkgIGludCBjb3VudDsKLQkgIGludCB2YWw7Ci0KLQkgIGFkZHIgPSAoYWRkciArIDMpICYgfjM7Ci0JICBpZiAoKHN0YXR1cyA9IGdldF9pbnQgKGFkZHIsICZ2YWwsIGluZm8pKSkKLQkgICAgZ290byBmYWlsOwotCSAgYWRkciArPSA0OwotCi0JICBmcHJpbnRmX2ZuIChzdHJlYW0sIiBkZWZhdWx0OiAiKTsKLQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsICsgaW5zbl9zdGFydCwgaW5mbyk7Ci0KLQkgIGlmICgoc3RhdHVzID0gZ2V0X2ludCAoYWRkciwgJmNvdW50LCBpbmZvKSkpCi0JICAgIGdvdG8gZmFpbDsKLQkgIGFkZHIgKz0gNDsKLQotCSAgd2hpbGUgKGNvdW50LS0pIHsKLQkgICAgaWYgKChzdGF0dXMgPSBnZXRfaW50IChhZGRyLCAmdmFsLCBpbmZvKSkpCi0JICAgICAgZ290byBmYWlsOwotCSAgICBhZGRyICs9IDQ7Ci0JICAgIGZwcmludGZfZm4gKHN0cmVhbSwiICVkOlsiLCB2YWwpOwotCi0JICAgIGlmICgoc3RhdHVzID0gZ2V0X2ludCAoYWRkciwgJnZhbCwgaW5mbykpKQotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgYWRkciArPSA0OwotCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsICsgaW5zbl9zdGFydCwgaW5mbyk7Ci0JICAgIGZwcmludGZfZm4gKHN0cmVhbSwiIF0iKTsKLQkgIH0KLQkgIHJldHVybiBhZGRyIC0gaW5zbl9zdGFydDsKLQl9Ci0gICAgICBmb3IgKGEgPSAwOyBvcC0+YXJnW2FdOyBhKyspCi0JewotCSAgdW5zaWduZWQgY2hhciBkYXRhWzRdOwotCSAgaW50IHZhbCA9IDA7Ci0JICBpbnQgaTsKLQkgIGludCBzaXplID0gQVNJWkUgKG9wLT5hcmdbYV0pOwotCi0JICBpZiAoKHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKGFkZHIsIGRhdGEsIHNpemUsIGluZm8pKSkKLQkgICAgZ290byBmYWlsOwotCi0JICB2YWwgPSAoVU5TIChvcC0+YXJnWzBdKSB8fCAoKGRhdGFbMF0gJiAweDgwKSA9PSAwKSkgPyAwIDogLTE7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JICAgIHZhbCA9ICh2YWwgPDwgOCkgfCAoZGF0YVtpXSAmIDB4ZmYpOwotCi0JICBpZiAoUENSRUwgKG9wLT5hcmdbYV0pKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCArIGluc25fc3RhcnQsIGluZm8pOwotCSAgZWxzZQotCSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICIlcyVkIiwgc2VwLCB2YWwpOwotCi0JICBzZXAgPSAiLCI7Ci0JICBhZGRyICs9IHNpemU7Ci0JfQotICAgICAgcmV0dXJuIG9wLT5sZW47Ci0gICAgfQotCi0gZmFpbDoKLSAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgYWRkciwgaW5mbyk7Ci0gIHJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvcGotb3BjLmMgYi9vcGNvZGVzL3BqLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjdlMzhlLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvcGotb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzYgKzAsMCBAQAotLyogcGotb3BjLmMgLS0gRGVmaW5pdGlvbnMgZm9yIHBpY29KYXZhIG9wY29kZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBUcmFuc21ldGEgKHNhY0Bwb2JveC5jb20pLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9wai5oIgotCi1jb25zdCBwal9vcGNfaW5mb190IHBqX29wY19pbmZvWzUxMl0gPQotewoteyAweDAwLCAgIC0xLCAxLCB7T19OLCBPX059LCAibm9wIn0sCi17IDB4MDEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhY29uc3RfbnVsbCJ9LAoteyAweDAyLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWNvbnN0X20xIn0sCi17IDB4MDMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpY29uc3RfMCJ9LAoteyAweDA0LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWNvbnN0XzEifSwKLXsgMHgwNSwgICAtMSwgMSwge09fTiwgT19OfSwgImljb25zdF8yIn0sCi17IDB4MDYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpY29uc3RfMyJ9LAoteyAweDA3LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWNvbnN0XzQifSwKLXsgMHgwOCwgICAtMSwgMSwge09fTiwgT19OfSwgImljb25zdF81In0sCi17IDB4MDksICAgLTEsIDEsIHtPX04sIE9fTn0sICJsY29uc3RfMCJ9LAoteyAweDBhLCAgIC0xLCAxLCB7T19OLCBPX059LCAibGNvbnN0XzEifSwKLXsgMHgwYiwgICAtMSwgMSwge09fTiwgT19OfSwgImZjb25zdF8wIn0sCi17IDB4MGMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmY29uc3RfMSJ9LAoteyAweDBkLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmNvbnN0XzIifSwKLXsgMHgwZSwgICAtMSwgMSwge09fTiwgT19OfSwgImRjb25zdF8wIn0sCi17IDB4MGYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkY29uc3RfMSJ9LAoteyAweDEwLCAgIC0xLCAyLCB7T184LCBPX059LCAiYmlwdXNoIn0sCi17IDB4MTEsICAgLTEsIDMsIHtPXzE2LCBPX059LCAic2lwdXNoIn0sCi17IDB4MTIsICAgLTEsIDIsIHtPX04sIE9fTn0sICJsZGMifSwKLXsgMHgxMywgICAtMSwgMywge09fTiwgT19OfSwgImxkY193In0sCi17IDB4MTQsICAgLTEsIDMsIHtPX04sIE9fTn0sICJsZGMyX3cifSwKLXsgMHgxNSwgICAtMSwgMiwge09fVTgsIE9fTn0sICJpbG9hZCJ9LAoteyAweDE2LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImxsb2FkIn0sCi17IDB4MTcsICAgLTEsIDIsIHtPX1U4LCBPX059LCAiZmxvYWQifSwKLXsgMHgxOCwgICAtMSwgMiwge09fVTgsIE9fTn0sICJkbG9hZCJ9LAoteyAweDE5LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImFsb2FkIn0sCi17IDB4MWEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpbG9hZF8wIn0sCi17IDB4MWIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpbG9hZF8xIn0sCi17IDB4MWMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpbG9hZF8yIn0sCi17IDB4MWQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpbG9hZF8zIn0sCi17IDB4MWUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsbG9hZF8wIn0sCi17IDB4MWYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsbG9hZF8xIn0sCi17IDB4MjAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsbG9hZF8yIn0sCi17IDB4MjEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsbG9hZF8zIn0sCi17IDB4MjIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmbG9hZF8wIn0sCi17IDB4MjMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmbG9hZF8xIn0sCi17IDB4MjQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmbG9hZF8yIn0sCi17IDB4MjUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmbG9hZF8zIn0sCi17IDB4MjYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkbG9hZF8wIn0sCi17IDB4MjcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkbG9hZF8xIn0sCi17IDB4MjgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkbG9hZF8yIn0sCi17IDB4MjksICAgLTEsIDEsIHtPX04sIE9fTn0sICJkbG9hZF8zIn0sCi17IDB4MmEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhbG9hZF8wIn0sCi17IDB4MmIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhbG9hZF8xIn0sCi17IDB4MmMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhbG9hZF8yIn0sCi17IDB4MmQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhbG9hZF8zIn0sCi17IDB4MmUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpYWxvYWQifSwKLXsgMHgyZiwgICAtMSwgMSwge09fTiwgT19OfSwgImxhbG9hZCJ9LAoteyAweDMwLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmFsb2FkIn0sCi17IDB4MzEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkYWxvYWQifSwKLXsgMHgzMiwgICAtMSwgMSwge09fTiwgT19OfSwgImFhbG9hZCJ9LAoteyAweDMzLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFsb2FkIn0sCi17IDB4MzQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJjYWxvYWQifSwKLXsgMHgzNSwgICAtMSwgMSwge09fTiwgT19OfSwgInNhbG9hZCJ9LAoteyAweDM2LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImlzdG9yZSJ9LAoteyAweDM3LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImxzdG9yZSJ9LAoteyAweDM4LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImZzdG9yZSJ9LAoteyAweDM5LCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImRzdG9yZSJ9LAoteyAweDNhLCAgIC0xLCAyLCB7T19VOCwgT19OfSwgImFzdG9yZSJ9LAoteyAweDNiLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaXN0b3JlXzAifSwKLXsgMHgzYywgICAtMSwgMSwge09fTiwgT19OfSwgImlzdG9yZV8xIn0sCi17IDB4M2QsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpc3RvcmVfMiJ9LAoteyAweDNlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaXN0b3JlXzMifSwKLXsgMHgzZiwgICAtMSwgMSwge09fTiwgT19OfSwgImxzdG9yZV8wIn0sCi17IDB4NDAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsc3RvcmVfMSJ9LAoteyAweDQxLCAgIC0xLCAxLCB7T19OLCBPX059LCAibHN0b3JlXzIifSwKLXsgMHg0MiwgICAtMSwgMSwge09fTiwgT19OfSwgImxzdG9yZV8zIn0sCi17IDB4NDMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmc3RvcmVfMCJ9LAoteyAweDQ0LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZnN0b3JlXzEifSwKLXsgMHg0NSwgICAtMSwgMSwge09fTiwgT19OfSwgImZzdG9yZV8yIn0sCi17IDB4NDYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmc3RvcmVfMyJ9LAoteyAweDQ3LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHN0b3JlXzAifSwKLXsgMHg0OCwgICAtMSwgMSwge09fTiwgT19OfSwgImRzdG9yZV8xIn0sCi17IDB4NDksICAgLTEsIDEsIHtPX04sIE9fTn0sICJkc3RvcmVfMiJ9LAoteyAweDRhLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHN0b3JlXzMifSwKLXsgMHg0YiwgICAtMSwgMSwge09fTiwgT19OfSwgImFzdG9yZV8wIn0sCi17IDB4NGMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhc3RvcmVfMSJ9LAoteyAweDRkLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYXN0b3JlXzIifSwKLXsgMHg0ZSwgICAtMSwgMSwge09fTiwgT19OfSwgImFzdG9yZV8zIn0sCi17IDB4NGYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpYXN0b3JlIn0sCi17IDB4NTAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsYXN0b3JlIn0sCi17IDB4NTEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmYXN0b3JlIn0sCi17IDB4NTIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkYXN0b3JlIn0sCi17IDB4NTMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhYXN0b3JlIn0sCi17IDB4NTQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYXN0b3JlIn0sCi17IDB4NTUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJjYXN0b3JlIn0sCi17IDB4NTYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJzYXN0b3JlIn0sCi17IDB4NTcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJwb3AifSwKLXsgMHg1OCwgICAtMSwgMSwge09fTiwgT19OfSwgInBvcDIifSwKLXsgMHg1OSwgICAtMSwgMSwge09fTiwgT19OfSwgImR1cCJ9LAoteyAweDVhLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZHVwX3gxIn0sCi17IDB4NWIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkdXBfeDIifSwKLXsgMHg1YywgICAtMSwgMSwge09fTiwgT19OfSwgImR1cDIifSwKLXsgMHg1ZCwgICAtMSwgMSwge09fTiwgT19OfSwgImR1cDJfeDEifSwKLXsgMHg1ZSwgICAtMSwgMSwge09fTiwgT19OfSwgImR1cDJfeDIifSwKLXsgMHg1ZiwgICAtMSwgMSwge09fTiwgT19OfSwgInN3YXAifSwKLXsgMHg2MCwgICAtMSwgMSwge09fTiwgT19OfSwgImlhZGQifSwKLXsgMHg2MSwgICAtMSwgMSwge09fTiwgT19OfSwgImxhZGQifSwKLXsgMHg2MiwgICAtMSwgMSwge09fTiwgT19OfSwgImZhZGQifSwKLXsgMHg2MywgICAtMSwgMSwge09fTiwgT19OfSwgImRhZGQifSwKLXsgMHg2NCwgICAtMSwgMSwge09fTiwgT19OfSwgImlzdWIifSwKLXsgMHg2NSwgICAtMSwgMSwge09fTiwgT19OfSwgImxzdWIifSwKLXsgMHg2NiwgICAtMSwgMSwge09fTiwgT19OfSwgImZzdWIifSwKLXsgMHg2NywgICAtMSwgMSwge09fTiwgT19OfSwgImRzdWIifSwKLXsgMHg2OCwgICAtMSwgMSwge09fTiwgT19OfSwgImltdWwifSwKLXsgMHg2OSwgICAtMSwgMSwge09fTiwgT19OfSwgImxtdWwifSwKLXsgMHg2YSwgICAtMSwgMSwge09fTiwgT19OfSwgImZtdWwifSwKLXsgMHg2YiwgICAtMSwgMSwge09fTiwgT19OfSwgImRtdWwifSwKLXsgMHg2YywgICAtMSwgMSwge09fTiwgT19OfSwgImlkaXYifSwKLXsgMHg2ZCwgICAtMSwgMSwge09fTiwgT19OfSwgImxkaXYifSwKLXsgMHg2ZSwgICAtMSwgMSwge09fTiwgT19OfSwgImZkaXYifSwKLXsgMHg2ZiwgICAtMSwgMSwge09fTiwgT19OfSwgImRkaXYifSwKLXsgMHg3MCwgICAtMSwgMSwge09fTiwgT19OfSwgImlyZW0ifSwKLXsgMHg3MSwgICAtMSwgMSwge09fTiwgT19OfSwgImxyZW0ifSwKLXsgMHg3MiwgICAtMSwgMSwge09fTiwgT19OfSwgImZyZW0ifSwKLXsgMHg3MywgICAtMSwgMSwge09fTiwgT19OfSwgImRyZW0ifSwKLXsgMHg3NCwgICAtMSwgMSwge09fTiwgT19OfSwgImluZWcifSwKLXsgMHg3NSwgICAtMSwgMSwge09fTiwgT19OfSwgImxuZWcifSwKLXsgMHg3NiwgICAtMSwgMSwge09fTiwgT19OfSwgImZuZWcifSwKLXsgMHg3NywgICAtMSwgMSwge09fTiwgT19OfSwgImRuZWcifSwKLXsgMHg3OCwgICAtMSwgMSwge09fTiwgT19OfSwgImlzaGwifSwKLXsgMHg3OSwgICAtMSwgMSwge09fTiwgT19OfSwgImxzaGwifSwKLXsgMHg3YSwgICAtMSwgMSwge09fTiwgT19OfSwgImlzaHIifSwKLXsgMHg3YiwgICAtMSwgMSwge09fTiwgT19OfSwgImxzaHIifSwKLXsgMHg3YywgICAtMSwgMSwge09fTiwgT19OfSwgIml1c2hyIn0sCi17IDB4N2QsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsdXNociJ9LAoteyAweDdlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaWFuZCJ9LAoteyAweDdmLCAgIC0xLCAxLCB7T19OLCBPX059LCAibGFuZCJ9LAoteyAweDgwLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaW9yIn0sCi17IDB4ODEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsb3IifSwKLXsgMHg4MiwgICAtMSwgMSwge09fTiwgT19OfSwgIml4b3IifSwKLXsgMHg4MywgICAtMSwgMSwge09fTiwgT19OfSwgImx4b3IifSwKLXsgMHg4NCwgICAtMSwgMywge09fVTgsIE9fOH0sICJpaW5jIn0sCi17IDB4ODUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpMmwifSwKLXsgMHg4NiwgICAtMSwgMSwge09fTiwgT19OfSwgImkyZiJ9LAoteyAweDg3LCAgIC0xLCAxLCB7T19OLCBPX059LCAiaTJkIn0sCi17IDB4ODgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsMmkifSwKLXsgMHg4OSwgICAtMSwgMSwge09fTiwgT19OfSwgImwyZiJ9LAoteyAweDhhLCAgIC0xLCAxLCB7T19OLCBPX059LCAibDJkIn0sCi17IDB4OGIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmMmkifSwKLXsgMHg4YywgICAtMSwgMSwge09fTiwgT19OfSwgImYybCJ9LAoteyAweDhkLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZjJkIn0sCi17IDB4OGUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkMmkifSwKLXsgMHg4ZiwgICAtMSwgMSwge09fTiwgT19OfSwgImQybCJ9LAoteyAweDkwLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZDJmIn0sCi17IDB4OTEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpMmIifSwKLXsgMHg5MiwgICAtMSwgMSwge09fTiwgT19OfSwgImkyYyJ9LAoteyAweDkzLCAgIC0xLCAxLCB7T19OLCBPX059LCAiaTJzIn0sCi17IDB4OTQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJsY21wIn0sCi17IDB4OTUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmY21wbCJ9LAoteyAweDk2LCAgIC0xLCAxLCB7T19OLCBPX059LCAiZmNtcGcifSwKLXsgMHg5NywgICAtMSwgMSwge09fTiwgT19OfSwgImRjbXBsIn0sCi17IDB4OTgsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkY21wZyJ9LAoteyAweDk5LCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZmVxIn0sCi17IDB4OWEsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmbmUifSwKLXsgMHg5YiwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZsdCJ9LAoteyAweDljLCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZmdlIn0sCi17IDB4OWQsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmZ3QifSwKLXsgMHg5ZSwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZsZSJ9LAoteyAweDlmLCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZl9pY21wZXEifSwKLXsgMHhhMCwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZfaWNtcG5lIn0sCi17IDB4YTEsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmX2ljbXBsdCJ9LAoteyAweGEyLCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZl9pY21wZ2UifSwKLXsgMHhhMywgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZfaWNtcGd0In0sCi17IDB4YTQsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImlmX2ljbXBsZSJ9LAoteyAweGE1LCAgIC0xLCAzLCB7T19SMTYsIE9fTn0sICJpZl9hY21wZXEifSwKLXsgMHhhNiwgICAtMSwgMywge09fUjE2LCBPX059LCAiaWZfYWNtcG5lIn0sCi17IDB4YTcsICAgLTEsIDMsIHtPX1IxNiwgT19OfSwgImdvdG8ifSwKLXsgMHhhOCwgICAtMSwgMywge09fTiwgT19OfSwgImpzciJ9LAoteyAweGE5LCAgIC0xLCAyLCB7T19OLCBPX059LCAicmV0In0sCi17IDB4YWEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJ0YWJsZXN3aXRjaCJ9LAoteyAweGFiLCAgIC0xLCAxLCB7T19OLCBPX059LCAibG9va3Vwc3dpdGNoIn0sCi17IDB4YWMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJpcmV0dXJuIn0sCi17IDB4YWQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJscmV0dXJuIn0sCi17IDB4YWUsICAgLTEsIDEsIHtPX04sIE9fTn0sICJmcmV0dXJuIn0sCi17IDB4YWYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJkcmV0dXJuIn0sCi17IDB4YjAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJhcmV0dXJuIn0sCi17IDB4YjEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJyZXR1cm4ifSwKLXsgMHhiMiwgICAtMSwgMywge09fTiwgT19OfSwgImdldHN0YXRpYyJ9LAoteyAweGIzLCAgIC0xLCAzLCB7T19OLCBPX059LCAicHV0c3RhdGljIn0sCi17IDB4YjQsICAgLTEsIDMsIHtPX04sIE9fTn0sICJnZXRmaWVsZCJ9LAoteyAweGI1LCAgIC0xLCAzLCB7T19OLCBPX059LCAicHV0ZmllbGQifSwKLXsgMHhiNiwgICAtMSwgMywge09fTiwgT19OfSwgImludm9rZXZpcnR1YWwifSwKLXsgMHhiNywgICAtMSwgMywge09fTiwgT19OfSwgImludm9rZXNwZWNpYWwifSwKLXsgMHhiOCwgICAtMSwgMywge09fTiwgT19OfSwgImludm9rZXN0YXRpYyJ9LAoteyAweGI5LCAgIC0xLCA1LCB7T19OLCBPX059LCAiaW52b2tlaW50ZXJmYWNlIn0sCi17IDB4YmEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfYmEifSwKLXsgMHhiYiwgICAtMSwgMywge09fTiwgT19OfSwgIm5ldyJ9LAoteyAweGJjLCAgIC0xLCAyLCB7T19OLCBPX059LCAibmV3YXJyYXkifSwKLXsgMHhiZCwgICAtMSwgMywge09fTiwgT19OfSwgImFuZXdhcnJheSJ9LAoteyAweGJlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYXJyYXlsZW5ndGgifSwKLXsgMHhiZiwgICAtMSwgMSwge09fTiwgT19OfSwgImF0aHJvdyJ9LAoteyAweGMwLCAgIC0xLCAzLCB7T19OLCBPX059LCAiY2hlY2tjYXN0In0sCi17IDB4YzEsICAgLTEsIDMsIHtPX04sIE9fTn0sICJpbnN0YW5jZW9mIn0sCi17IDB4YzIsICAgLTEsIDEsIHtPX04sIE9fTn0sICJtb25pdG9yZW50ZXIifSwKLXsgMHhjMywgICAtMSwgMSwge09fTiwgT19OfSwgIm1vbml0b3JleGl0In0sCi17IDB4YzQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJ3aWRlIn0sCi17IDB4YzUsICAgLTEsIDQsIHtPX04sIE9fTn0sICJtdWx0aWFuZXdhcnJheSJ9LAoteyAweGM2LCAgIC0xLCAzLCB7T19OLCBPX059LCAiaWZudWxsIn0sCi17IDB4YzcsICAgLTEsIDMsIHtPX04sIE9fTn0sICJpZm5vbm51bGwifSwKLXsgMHhjOCwgICAtMSwgNSwge09fTiwgT19OfSwgImdvdG9fdyJ9LAoteyAweGM5LCAgIC0xLCA1LCB7T19OLCBPX059LCAianNyX3cifSwKLXsgMHhjYSwgICAtMSwgMSwge09fTiwgT19OfSwgImJyZWFrcG9pbnQifSwKLXsgMHhjYiwgICAtMSwgMSwge09fTiwgT19OfSwgImJ5dGVjb2RlIn0sCi17IDB4Y2MsICAgLTEsIDEsIHtPX04sIE9fTn0sICJ0cnkifSwKLXsgMHhjZCwgICAtMSwgMSwge09fTiwgT19OfSwgImVuZHRyeSJ9LAoteyAweGNlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiY2F0Y2gifSwKLXsgMHhjZiwgICAtMSwgMSwge09fTiwgT19OfSwgInZhciJ9LAoteyAweGQwLCAgIC0xLCAxLCB7T19OLCBPX059LCAiZW5kdmFyIn0sCi17IDB4ZDEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZDEifSwKLXsgMHhkMiwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kMiJ9LAoteyAweGQzLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2QzIn0sCi17IDB4ZDQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZDQifSwKLXsgMHhkNSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kNSJ9LAoteyAweGQ2LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2Q2In0sCi17IDB4ZDcsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZDcifSwKLXsgMHhkOCwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kOCJ9LAoteyAweGQ5LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2Q5In0sCi17IDB4ZGEsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZGEifSwKLXsgMHhkYiwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kYiJ9LAoteyAweGRjLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2RjIn0sCi17IDB4ZGQsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZGQifSwKLXsgMHhkZSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9kZSJ9LAoteyAweGRmLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2RmIn0sCi17IDB4ZTAsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTAifSwKLXsgMHhlMSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lMSJ9LAoteyAweGUyLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2UyIn0sCi17IDB4ZTMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTMifSwKLXsgMHhlNCwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lNCJ9LAoteyAweGU1LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2U1In0sCi17IDB4ZTYsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTYifSwKLXsgMHhlNywgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lNyJ9LAoteyAweGU4LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2U4In0sCi17IDB4ZTksICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZTkifSwKLXsgMHhlYSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9lYSJ9LAoteyAweGViLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2ViIn0sCi17IDB4ZWMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZWMifSwKLXsgMHhlZCwgICAtMSwgMywge09fMTYsIE9fTn0sICJzZXRoaSJ9LAoteyAweGVlLCAgIC0xLCAzLCB7T19VOCwgT184fSwgImxvYWRfd29yZF9pbmRleCJ9LAoteyAweGVmLCAgIC0xLCAzLCB7T19VOCwgT184fSwgImxvYWRfc2hvcnRfaW5kZXgifSwKLXsgMHhmMCwgICAtMSwgMywge09fVTgsIE9fOH0sICJsb2FkX2NoYXJfaW5kZXgifSwKLXsgMHhmMSwgICAtMSwgMywge09fVTgsIE9fOH0sICJsb2FkX2J5dGVfaW5kZXgifSwKLXsgMHhmMiwgICAtMSwgMywge09fVTgsIE9fOH0sICJsb2FkX3VieXRlX2luZGV4In0sCi17IDB4ZjMsICAgLTEsIDMsIHtPX1U4LCBPXzh9LCAic3RvcmVfd29yZF9pbmRleCJ9LAoteyAweGY0LCAgIC0xLCAzLCB7T19VOCwgT184fSwgIm5hX3N0b3JlX3dvcmRfaW5kZXgifSwKLXsgMHhmNSwgICAtMSwgMywge09fVTgsIE9fOH0sICJzdG9yZV9zaG9ydF9pbmRleCJ9LAoteyAweGY2LCAgIC0xLCAzLCB7T19VOCwgT184fSwgInN0b3JlX2J5dGVfaW5kZXgifSwKLXsgMHhmNywgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9mNyJ9LAoteyAweGY4LCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2Y4In0sCi17IDB4ZjksICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZjkifSwKLXsgMHhmYSwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9mYSJ9LAoteyAweGZiLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2ZiIn0sCi17IDB4ZmMsICAgLTEsIDEsIHtPX04sIE9fTn0sICJiYWRfZmMifSwKLXsgMHhmZCwgICAtMSwgMSwge09fTiwgT19OfSwgImJhZF9mZCJ9LAoteyAweGZlLCAgIC0xLCAxLCB7T19OLCBPX059LCAiYmFkX2ZlIn0sCi17IDB4ZmYsIDB4MDAsIDIsIHtPX04sIE9fTn0sICJsb2FkX3VieXRlIn0sCi17IDB4ZmYsIDB4MDEsIDIsIHtPX04sIE9fTn0sICJsb2FkX2J5dGUifSwKLXsgMHhmZiwgMHgwMiwgMiwge09fTiwgT19OfSwgImxvYWRfY2hhciJ9LAoteyAweGZmLCAweDAzLCAyLCB7T19OLCBPX059LCAibG9hZF9zaG9ydCJ9LAoteyAweGZmLCAweDA0LCAyLCB7T19OLCBPX059LCAibG9hZF93b3JkIn0sCi17IDB4ZmYsIDB4MDUsIDIsIHtPX04sIE9fTn0sICJwcml2X3JldF9mcm9tX3RyYXAifSwKLXsgMHhmZiwgMHgwNiwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9kY2FjaGVfdGFnIn0sCi17IDB4ZmYsIDB4MDcsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfZGNhY2hlX2RhdGEifSwKLXsgMHhmZiwgMHgwOCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDA5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MGEsIDIsIHtPX04sIE9fTn0sICJsb2FkX2NoYXJfb2UifSwKLXsgMHhmZiwgMHgwYiwgMiwge09fTiwgT19OfSwgImxvYWRfc2hvcnRfb2UifSwKLXsgMHhmZiwgMHgwYywgMiwge09fTiwgT19OfSwgImxvYWRfd29yZF9vZSJ9LAoteyAweGZmLCAweDBkLCAyLCB7T19OLCBPX059LCAicmV0dXJuMCJ9LAoteyAweGZmLCAweDBlLCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2ljYWNoZV90YWcifSwKLXsgMHhmZiwgMHgwZiwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9pY2FjaGVfZGF0YSJ9LAoteyAweGZmLCAweDEwLCAyLCB7T19OLCBPX059LCAibmNsb2FkX3VieXRlIn0sCi17IDB4ZmYsIDB4MTEsIDIsIHtPX04sIE9fTn0sICJuY2xvYWRfYnl0ZSJ9LAoteyAweGZmLCAweDEyLCAyLCB7T19OLCBPX059LCAibmNsb2FkX2NoYXIifSwKLXsgMHhmZiwgMHgxMywgMiwge09fTiwgT19OfSwgIm5jbG9hZF9zaG9ydCJ9LAoteyAweGZmLCAweDE0LCAyLCB7T19OLCBPX059LCAibmNsb2FkX3dvcmQifSwKLXsgMHhmZiwgMHgxNSwgMiwge09fTiwgT19OfSwgIml1Y21wIn0sCi17IDB4ZmYsIDB4MTYsIDIsIHtPX04sIE9fTn0sICJwcml2X3Bvd2VyZG93biJ9LAoteyAweGZmLCAweDE3LCAyLCB7T19OLCBPX059LCAiY2FjaGVfaW52YWxpZGF0ZSJ9LAoteyAweGZmLCAweDE4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MTksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgxYSwgMiwge09fTiwgT19OfSwgIm5jbG9hZF9jaGFyX29lIn0sCi17IDB4ZmYsIDB4MWIsIDIsIHtPX04sIE9fTn0sICJuY2xvYWRfc2hvcnRfb2UifSwKLXsgMHhmZiwgMHgxYywgMiwge09fTiwgT19OfSwgIm5jbG9hZF93b3JkX29lIn0sCi17IDB4ZmYsIDB4MWQsIDIsIHtPX04sIE9fTn0sICJyZXR1cm4xIn0sCi17IDB4ZmYsIDB4MWUsIDIsIHtPX04sIE9fTn0sICJjYWNoZV9mbHVzaCJ9LAoteyAweGZmLCAweDFmLCAyLCB7T19OLCBPX059LCAiY2FjaGVfaW5kZXhfZmx1c2gifSwKLXsgMHhmZiwgMHgyMCwgMiwge09fTiwgT19OfSwgInN0b3JlX2J5dGUifSwKLXsgMHhmZiwgMHgyMSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDIyLCAyLCB7T19OLCBPX059LCAic3RvcmVfc2hvcnQifSwKLXsgMHhmZiwgMHgyMywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDI0LCAyLCB7T19OLCBPX059LCAic3RvcmVfd29yZCJ9LAoteyAweGZmLCAweDI1LCAyLCB7T19OLCBPX059LCAic29mdF90cmFwIn0sCi17IDB4ZmYsIDB4MjYsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2RjYWNoZV90YWcifSwKLXsgMHhmZiwgMHgyNywgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfZGNhY2hlX2RhdGEifSwKLXsgMHhmZiwgMHgyOCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDI5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MmEsIDIsIHtPX04sIE9fTn0sICJzdG9yZV9zaG9ydF9vZSJ9LAoteyAweGZmLCAweDJiLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MmMsIDIsIHtPX04sIE9fTn0sICJzdG9yZV93b3JkX29lIn0sCi17IDB4ZmYsIDB4MmQsIDIsIHtPX04sIE9fTn0sICJyZXR1cm4yIn0sCi17IDB4ZmYsIDB4MmUsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2ljYWNoZV90YWcifSwKLXsgMHhmZiwgMHgyZiwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfaWNhY2hlX2RhdGEifSwKLXsgMHhmZiwgMHgzMCwgMiwge09fTiwgT19OfSwgIm5jc3RvcmVfYnl0ZSJ9LAoteyAweGZmLCAweDMxLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MzIsIDIsIHtPX04sIE9fTn0sICJuY3N0b3JlX3Nob3J0In0sCi17IDB4ZmYsIDB4MzMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgzNCwgMiwge09fTiwgT19OfSwgIm5jc3RvcmVfd29yZCJ9LAoteyAweGZmLCAweDM1LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MzYsIDIsIHtPX04sIE9fTn0sICJwcml2X3Jlc2V0In0sCi17IDB4ZmYsIDB4MzcsIDIsIHtPX04sIE9fTn0sICJnZXRfY3VycmVudF9jbGFzcyJ9LAoteyAweGZmLCAweDM4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4MzksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHgzYSwgMiwge09fTiwgT19OfSwgIm5jc3RvcmVfc2hvcnRfb2UifSwKLXsgMHhmZiwgMHgzYiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDNjLCAyLCB7T19OLCBPX059LCAibmNzdG9yZV93b3JkX29lIn0sCi17IDB4ZmYsIDB4M2QsIDIsIHtPX04sIE9fTn0sICJjYWxsIn0sCi17IDB4ZmYsIDB4M2UsIDIsIHtPX04sIE9fTn0sICJ6ZXJvX2xpbmUifSwKLXsgMHhmZiwgMHgzZiwgMiwge09fTiwgT19OfSwgInByaXZfdXBkYXRlX29wdG9wIn0sCi17IDB4ZmYsIDB4NDAsIDIsIHtPX04sIE9fTn0sICJyZWFkX3BjIn0sCi17IDB4ZmYsIDB4NDEsIDIsIHtPX04sIE9fTn0sICJyZWFkX3ZhcnMifSwKLXsgMHhmZiwgMHg0MiwgMiwge09fTiwgT19OfSwgInJlYWRfZnJhbWUifSwKLXsgMHhmZiwgMHg0MywgMiwge09fTiwgT19OfSwgInJlYWRfb3B0b3AifSwKLXsgMHhmZiwgMHg0NCwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9vcGxpbSJ9LAoteyAweGZmLCAweDQ1LCAyLCB7T19OLCBPX059LCAicmVhZF9jb25zdF9wb29sIn0sCi17IDB4ZmYsIDB4NDYsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfcHNyIn0sCi17IDB4ZmYsIDB4NDcsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfdHJhcGJhc2UifSwKLXsgMHhmZiwgMHg0OCwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9sb2NrY291bnQwIn0sCi17IDB4ZmYsIDB4NDksIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfbG9ja2NvdW50MSJ9LAoteyAweGZmLCAweDRhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NGIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg0YywgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9sb2NrYWRkcjAifSwKLXsgMHhmZiwgMHg0ZCwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9sb2NrYWRkcjEifSwKLXsgMHhmZiwgMHg0ZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDRmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NTAsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfdXNlcnJhbmdlMSJ9LAoteyAweGZmLCAweDUxLCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2djX2NvbmZpZyJ9LAoteyAweGZmLCAweDUyLCAyLCB7T19OLCBPX059LCAicHJpdl9yZWFkX2JyazFhIn0sCi17IDB4ZmYsIDB4NTMsIDIsIHtPX04sIE9fTn0sICJwcml2X3JlYWRfYnJrMmEifSwKLXsgMHhmZiwgMHg1NCwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9icmsxMmMifSwKLXsgMHhmZiwgMHg1NSwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF91c2VycmFuZ2UyIn0sCi17IDB4ZmYsIDB4NTYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg1NywgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF92ZXJzaW9uaWQifSwKLXsgMHhmZiwgMHg1OCwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9oY3IifSwKLXsgMHhmZiwgMHg1OSwgMiwge09fTiwgT19OfSwgInByaXZfcmVhZF9zY19ib3R0b20ifSwKLXsgMHhmZiwgMHg1YSwgMiwge09fTiwgT19OfSwgInJlYWRfZ2xvYmFsMCJ9LAoteyAweGZmLCAweDViLCAyLCB7T19OLCBPX059LCAicmVhZF9nbG9iYWwxIn0sCi17IDB4ZmYsIDB4NWMsIDIsIHtPX04sIE9fTn0sICJyZWFkX2dsb2JhbDIifSwKLXsgMHhmZiwgMHg1ZCwgMiwge09fTiwgT19OfSwgInJlYWRfZ2xvYmFsMyJ9LAoteyAweGZmLCAweDVlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NWYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg2MCwgMiwge09fTiwgT19OfSwgIndyaXRlX3BjIn0sCi17IDB4ZmYsIDB4NjEsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV92YXJzIn0sCi17IDB4ZmYsIDB4NjIsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV9mcmFtZSJ9LAoteyAweGZmLCAweDYzLCAyLCB7T19OLCBPX059LCAid3JpdGVfb3B0b3AifSwKLXsgMHhmZiwgMHg2NCwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfb3BsaW0ifSwKLXsgMHhmZiwgMHg2NSwgMiwge09fTiwgT19OfSwgIndyaXRlX2NvbnN0X3Bvb2wifSwKLXsgMHhmZiwgMHg2NiwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfcHNyIn0sCi17IDB4ZmYsIDB4NjcsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX3RyYXBiYXNlIn0sCi17IDB4ZmYsIDB4NjgsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2xvY2tjb3VudDAifSwKLXsgMHhmZiwgMHg2OSwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfbG9ja2NvdW50MSJ9LAoteyAweGZmLCAweDZhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NmIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg2YywgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfbG9ja2FkZHIwIn0sCi17IDB4ZmYsIDB4NmQsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX2xvY2thZGRyMSJ9LAoteyAweGZmLCAweDZlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NmYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg3MCwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfdXNlcnJhbmdlMSJ9LAoteyAweGZmLCAweDcxLCAyLCB7T19OLCBPX059LCAicHJpdl93cml0ZV9nY19jb25maWcifSwKLXsgMHhmZiwgMHg3MiwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfYnJrMWEifSwKLXsgMHhmZiwgMHg3MywgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfYnJrMmEifSwKLXsgMHhmZiwgMHg3NCwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfYnJrMTJjIn0sCi17IDB4ZmYsIDB4NzUsIDIsIHtPX04sIE9fTn0sICJwcml2X3dyaXRlX3VzZXJyYW5nZTIifSwKLXsgMHhmZiwgMHg3NiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDc3LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4NzgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg3OSwgMiwge09fTiwgT19OfSwgInByaXZfd3JpdGVfc2NfYm90dG9tIn0sCi17IDB4ZmYsIDB4N2EsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV9nbG9iYWwwIn0sCi17IDB4ZmYsIDB4N2IsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV9nbG9iYWwxIn0sCi17IDB4ZmYsIDB4N2MsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV9nbG9iYWwyIn0sCi17IDB4ZmYsIDB4N2QsIDIsIHtPX04sIE9fTn0sICJ3cml0ZV9nbG9iYWwzIn0sCi17IDB4ZmYsIDB4N2UsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg3ZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDgwLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ODEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4MiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDgzLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ODQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4NSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDg2LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ODcsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4OCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDg5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OGEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4YiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDhjLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OGQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg4ZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDhmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTAsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5MSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDkyLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5NCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDk1LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5NywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDk4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OTksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5YSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDliLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OWMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHg5ZCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweDllLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4OWYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhMCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGExLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YTIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhMywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGE0LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YTUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhNiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGE3LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YTgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhOSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGFhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YWIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhhYywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGFkLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YWUsIDIsIHtPX04sIE9fTn0sICJ0bV9wdXRjaGFyIn0sCi17IDB4ZmYsIDB4YWYsIDIsIHtPX04sIE9fTn0sICJ0bV9leGl0In0sCi17IDB4ZmYsIDB4YjAsIDIsIHtPX04sIE9fTn0sICJ0bV90cmFwIn0sCi17IDB4ZmYsIDB4YjEsIDIsIHtPX04sIE9fTn0sICJ0bV9taW5mbyJ9LAoteyAweGZmLCAweGIyLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YjMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiNCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGI1LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YjYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiNywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGI4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YjksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiYSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGJiLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YmMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhiZCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGJlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YmYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjMCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGMxLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YzIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjMywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGM0LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YzUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjNiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGM3LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4YzgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjOSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGNhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4Y2IsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjYywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGNkLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4Y2UsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhjZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQwLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZDEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkMiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQzLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZDQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkNSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQ2LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZDcsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkOCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGQ5LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZGEsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkYiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGRjLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZGQsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhkZSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGRmLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTAsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlMSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGUyLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlNCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGU1LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlNywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGU4LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZTksIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlYSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGViLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZWMsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhlZCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGVlLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZWYsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmMCwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGYxLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZjIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmMywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGY0LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZjUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmNiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGY3LCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZjgsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmOSwgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGZhLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZmIsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmYywgMiwge09fTiwgT19OfSwgImJhZCJ9LAoteyAweGZmLCAweGZkLCAyLCB7T19OLCBPX059LCAiYmFkIn0sCi17IDB4ZmYsIDB4ZmUsIDIsIHtPX04sIE9fTn0sICJiYWQifSwKLXsgMHhmZiwgMHhmZiwgMiwge09fTiwgT19OfSwgImJhZCJ9LAotfTsKZGlmZiAtLWdpdCBhL29wY29kZXMvcG8vTWFrZS1pbiBiL29wY29kZXMvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3BvL01ha2UtaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLUBTRVRfTUFLRUAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCi1zdWJkaXIgPSBwbwotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1DQyA9IEBDQ0AKLUdFTkNBVCA9IEBHRU5DQVRACi1HTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAotTVNHRk1UID0gQE1TR0ZNVEAKLVhHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKLU1TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCi0KLURFRlMgPSBAREVGU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLQotSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLVNPVVJDRVMgPSBjYXQtaWQtdGJsLmMKLVBPRklMRVMgPSBAUE9GSUxFU0AKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKLXN0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKLQotUE9URklMRVMgPSBcCi0KLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKLQotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0KLS5wby5wb3g6Ci0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKLQotLnBvLm1vOgotCSQoTVNHRk1UKSAtbyAkQCAkPAotCi0ucG8uZ21vOgotCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKLQkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAotCi0ucG8uY2F0OgotCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCi0JICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCi0KLQotYWxsOiBhbGwtQFVTRV9OTFNACi0KLWFsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKLWFsbC1ubzoKLQotJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQotCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKLQkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCi0JICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCi0Jcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0JbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQotJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgotJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKLQlybSAtZiBjYXQtaWQtdGJsLnRtcAotCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKLQkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKLQlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCi0JICBybSBjYXQtaWQtdGJsLnRtcDsgXAotCWVsc2UgXAotCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAotCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCWZpCi0JY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAotCi0KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzoKLWluc3RhbGwtaW5mbzoKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKLQllbHNlIFwKLQkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCi0JZmkKLQlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGNhc2UgIiQkY2F0IiBpbiBcCi0JICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKLQkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAotCSAgZXNhYzsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGVsc2UgXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgIGVsc2UgXAotCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKLQkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAotCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JZG9uZQotCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KLQotY2hlY2s6IGFsbAotCi1jYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCi0KLWR2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAotCXJtIC1mciAqLm8KLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0Jcm0gLWYgJChHTU9GSUxFUykKLQotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQotCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotdXBkYXRlLXBvOiBNYWtlZmlsZQotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKLQljZCAkKHNyY2Rpcik7IFwKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAotCSAgZWNobyAiJCRsYW5nOiI7IFwKLQkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAotCSAgICBybSAtZiAkJGxhbmcucG87IFwKLQkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1QT1RGSUxFUzogUE9URklMRVMuaW4KLQkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAotCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCi0JICBlbHNlIFwKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKLQkgIGZpOyBcCi0JICBybSAtZiAkQC10ICRAIFwKLQkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAotCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCi0JCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKLQkgICAgJiYgY2htb2QgYS13ICRALXQgXAotCSAgICAmJiBtdiAkQC10ICRAICkKLQotUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKLQljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCi0KLU1ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKLQljZCAuLiBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKLQkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wby9QT1RGSUxFUy5pbiBiL29wY29kZXMvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0M2E2NWUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wby9QT1RGSUxFUy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLWEyOWstZGlzLmMKLWFscGhhLWRpcy5jCi1hbHBoYS1vcGMuYwotYXJjLWRpcy5jCi1hcmMtb3BjLmMKLWFybS1kaXMuYwotYXJtLW9wYy5oCi1jZ2VuLWFzbS5jCi1jZ2VuLWRpcy5jCi1jZ2VuLW9wYy5jCi1kMTB2LWRpcy5jCi1kMTB2LW9wYy5jCi1kMzB2LWRpcy5jCi1kMzB2LW9wYy5jCi1kaXMtYnVmLmMKLWRpc2Fzc2VtYmxlLmMKLWZyMzAtYXNtLmMKLWZyMzAtZGVzYy5jCi1mcjMwLWRlc2MuaAotZnIzMC1kaXMuYwotZnIzMC1pYmxkLmMKLWZyMzAtb3BjLmMKLWZyMzAtb3BjLmgKLWg4MzAwLWRpcy5jCi1oODUwMC1kaXMuYwotaDg1MDAtb3BjLmgKLWhwcGEtZGlzLmMKLWkzODYtZGlzLmMKLWk5NjAtZGlzLmMKLW0xMDIwMC1kaXMuYwotbTEwMjAwLW9wYy5jCi1tMTAzMDAtZGlzLmMKLW0xMDMwMC1vcGMuYwotbTMyci1hc20uYwotbTMyci1kZXNjLmMKLW0zMnItZGVzYy5oCi1tMzJyLWRpcy5jCi1tMzJyLWlibGQuYwotbTMyci1vcGMuYwotbTMyci1vcGMuaAotbTMyci1vcGluc3QuYwotbTY4ay1kaXMuYwotbTY4ay1vcGMuYwotbTg4ay1kaXMuYwotbWNvcmUtZGlzLmMKLW1jb3JlLW9wYy5oCi1taXBzLWRpcy5jCi1taXBzLW9wYy5jCi1taXBzMTYtb3BjLmMKLW5zMzJrLWRpcy5jCi1wcGMtZGlzLmMKLXBwYy1vcGMuYwotc2gtZGlzLmMKLXNoLW9wYy5oCi1zcGFyYy1kaXMuYwotc3BhcmMtb3BjLmMKLXN5c2RlcC5oCi10aWMzMC1kaXMuYwotdGljODAtZGlzLmMKLXRpYzgwLW9wYy5jCi12ODUwLWRpcy5jCi12ODUwLW9wYy5jCi12YXgtZGlzLmMKLXc2NS1kaXMuYwotdzY1LW9wYy5oCi16OGstZGlzLmMKLXo4ay1vcGMuaAotejhrZ2VuLmMKZGlmZiAtLWdpdCBhL29wY29kZXMvcG8vb3Bjb2Rlcy5wb3QgYi9vcGNvZGVzL3BvL29wY29kZXMucG90CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjAxYmRkLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvcG8vb3Bjb2Rlcy5wb3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgotIyBDb3B5cmlnaHQgKEMpIFlFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCi0jCi0jLCBmdXp6eQotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDE5OTktMDctMTEgMjI6MDUtMDQwMFxuIgotIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgotIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgotIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgotIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IEVOQ09ESU5HXG4iCi0KLSM6IGFscGhhLW9wYy5jOjMzNQotbXNnaWQgImJyYW5jaCBvcGVyYW5kIHVuYWxpZ25lZCIKLW1zZ3N0ciAiIgotCi0jOiBhbHBoYS1vcGMuYzozNTggYWxwaGEtb3BjLmM6MzgwCi1tc2dpZCAianVtcCBoaW50IHVuYWxpZ25lZCIKLW1zZ3N0ciAiIgotCi0jOiBhcmMtZGlzLmM6MjMxCi1tc2dpZCAiKnVua25vd24qIgotbXNnc3RyICIiCi0KLSM6IGFyYy1vcGMuYzo2MjkKLW1zZ2lkICJ1bmFibGUgdG8gZml0IGRpZmZlcmVudCB2YWx1ZWQgY29uc3RhbnRzIGludG8gaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogYXJjLW9wYy5jOjYzOQotbXNnaWQgImF1eGlsaWFyeSByZWdpc3RlciBub3QgYWxsb3dlZCBoZXJlIgotbXNnc3RyICIiCi0KLSM6IGFyYy1vcGMuYzo2NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCByZWdpc3RlciBudW1iZXIgYCVkJyIKLW1zZ3N0ciAiIgotCi0jOiBhcmMtb3BjLmM6Nzc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInZhbHVlIHdvbid0IGZpdCBpbiByYW5nZSAlbGQgLSAlbGQiCi1tc2dzdHIgIiIKLQotIzogYXJjLW9wYy5jOjg3MQotbXNnaWQgImJyYW5jaCBhZGRyZXNzIG5vdCBvbiA0IGJ5dGUgYm91bmRhcnkiCi1tc2dzdHIgIiIKLQotIzogYXJtLWRpcy5jOjQwNwotbXNnaWQgIjxpbGxlZ2FsIHByZWNpc2lvbj4iCi1tc2dzdHIgIiIKLQotIzogY2dlbi1hc20uYzoyMjQKLW1zZ2lkICJ1bnJlY29nbml6ZWQga2V5d29yZC9yZWdpc3RlciBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNnZW4tYXNtLmM6MzMyIGZyMzAtaWJsZC5jOjIyMyBtMzJyLWlibGQuYzoyMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsZCBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiCi1tc2dzdHIgIiIKLQotIzogY2dlbi1hc20uYzozNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsdSBub3QgYmV0d2VlbiAlbHUgYW5kICVsdSkiCi1tc2dzdHIgIiIKLQotIzogZDMwdi1kaXMuYzozMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24gcmVnaXN0ZXIgJWQ+IgotbXNnc3RyICIiCi0KLSMuIENhbid0IGhhcHBlbi4KLSM6IGRpcy1idWYuYzo1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIGVycm9yICVkXG4iCi1tc2dzdHIgIiIKLQotIzogZGlzLWJ1Zi5jOjU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFkZHJlc3MgMHgleCBpcyBvdXQgb2YgYm91bmRzLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtYXNtLmM6MzAzIG0zMnItYXNtLmM6Mjk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBwYXJzaW5nLlxuIgotbXNnc3RyICIiCi0KLSMuIFdlIGNvdWxkbid0IHBhcnNlIGl0LgotIzogZnIzMC1hc20uYzozNjcgZnIzMC1hc20uYzo0MzYgbTMyci1hc20uYzozNjMgbTMyci1hc20uYzo0MzIKLW1zZ2lkICJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIy4gU3ludGF4IGNoYXIgZGlkbid0IG1hdGNoLiAgQ2FuJ3QgYmUgdGhpcyBpbnNuLgotIy4gRklYTUU6IHdvdWxkIGxpa2UgdG8gcmV0dXJuIHNvbWV0aGluZyBsaWtlCi0jLiAiZXhwZWN0ZWQgY2hhciBgYyciCi0jOiBmcjMwLWFzbS5jOjQwNCBtMzJyLWFzbS5jOjQwMAotbXNnaWQgInN5bnRheCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWFzbS5jOjQzMCBtMzJyLWFzbS5jOjQyNgotbXNnaWQgImp1bmsgYXQgZW5kIG9mIGxpbmUiCi1tc2dzdHIgIiIKLQotIzogZnIzMC1hc20uYzo1MjMgbTMyci1hc20uYzo1MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGluc3RydWN0aW9uIGAlLjUwcy4uLiciCi1tc2dzdHIgIiIKLQotIzogZnIzMC1hc20uYzo1MjYgbTMyci1hc20uYzo1MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGluc3RydWN0aW9uIGAlLjUwcyciCi1tc2dzdHIgIiIKLQotIzogZnIzMC1kaXMuYzozMDAgbTMyci1kaXMuYzoyMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHByaW50aW5nIGluc24uXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6MjEwIG0zMnItaWJsZC5jOjIxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuIDAgYW5kICVsdSkiCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6NzQ5IG0zMnItaWJsZC5jOjY1OQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgYnVpbGRpbmcgaW5zbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzo5NTIgbTMyci1pYmxkLmM6NzcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBkZWNvZGluZyBpbnNuLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjEwOTYgbTMyci1pYmxkLmM6ODYzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIGludCBvcGVyYW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjEyMjUgbTMyci1pYmxkLmM6OTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIHZtYSBvcGVyYW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjEzNTggbTMyci1pYmxkLmM6MTAyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyBpbnQgb3BlcmFuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzoxNDg0IG0zMnItaWJsZC5jOjEwOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgdm1hIG9wZXJhbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogaDgzMDAtZGlzLmM6NDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkhtbW1tICV4IgotbXNnc3RyICIiCi0KLSM6IGg4MzAwLWRpcy5jOjQxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJEb24ndCB1bmRlcnN0YW5kICV4IFxuIgotbXNnc3RyICIiCi0KLSM6IGg4NTAwLWRpcy5jOjEzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBjb3BlIHdpdGggaW5zZXJ0ICVkXG4iCi1tc2dzdHIgIiIKLQotIy4gQ291bGRuJ3QgdW5kZXJzdGFuZCBhbnl0aGluZwotIzogaDg1MDAtZGlzLmM6MzQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUwMnhcdFx0KnVua25vd24qIgotbXNnc3RyICIiCi0KLSM6IG0xMDIwMC1kaXMuYzoxOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93blx0MHglMDJ4IgotbXNnc3RyICIiCi0KLSM6IG0xMDIwMC1kaXMuYzozMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93blx0MHglMDRseCIKLW1zZ3N0ciAiIgotCi0jOiBtMTAzMDAtZGlzLmM6NTQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd25cdDB4JTA0eCIKLW1zZ3N0ciAiIgotCi0jOiBtNjhrLWRpcy5jOjQxMAotIywgYy1mb3JtYXQKLW1zZ2lkICI8aW50ZXJuYWwgZXJyb3IgaW4gb3Bjb2RlIHRhYmxlOiAlcyAlcz5cbiIKLW1zZ3N0ciAiIgotCi0jOiBtNjhrLWRpcy5jOjk4OAotIywgYy1mb3JtYXQKLW1zZ2lkICI8ZnVuY3Rpb24gY29kZSAlZD4iCi1tc2dzdHIgIiIKLQotIzogbTg4ay1kaXMuYzoyNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIyA8ZGlzIGVycm9yOiAlMDh4PiIKLW1zZ3N0ciAiIgotCi0jOiBtaXBzLWRpcy5jOjIzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIjIGludGVybmFsIGVycm9yLCB1bmRlZmluZWQgbW9kaWZpZXIoJWMpIgotbXNnc3RyICIiCi0KLSMuIEkgYW5kIFogYXJlIG91dHB1dCBvcGVyYW5kcyBhbmQgY2FuYHQgYmUgaW1tZWRpYXRlCi0jLiAqIEEgaXMgYW4gYWRkcmVzcyBhbmQgd2UgY2FuYHQgaGF2ZSB0aGUgYWRkcmVzcyBvZgotIy4gKiBhbiBpbW1lZGlhdGUgZWl0aGVyLiBXZSBkb24ndCBrbm93IGhvdyBtdWNoIHRvIGluY3JlYXNlCi0jLiAqIGFvZmZzZXRwIGJ5IHNpbmNlIHdoYXRldmVyIGdlbmVyYXRlZCB0aGlzIGlzIGJyb2tlbgotIy4gKiBhbnl3YXkhCi0jLgotIzogbnMzMmstZGlzLmM6NjE4Ci1tc2dpZCAiJDx1bmRlZmluZWQ+IgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo1ODYgcHBjLW9wYy5jOjYxNwotbXNnaWQgImludmFsaWQgY29uZGl0aW9uYWwgb3B0aW9uIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo2MTkKLW1zZ2lkICJhdHRlbXB0IHRvIHNldCB5IGJpdCB3aGVuIHVzaW5nICsgb3IgLSBtb2RpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6Njc0Ci1tc2dpZCAiaWdub3JpbmcgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBpbiBicmFuY2ggb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo3MDkgcHBjLW9wYy5jOjc0NgotbXNnaWQgImlsbGVnYWwgYml0bWFzayIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6ODE1Ci1tc2dpZCAidmFsdWUgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo4ODkKLW1zZ2lkICJpbmRleCByZWdpc3RlciBpbiBsb2FkIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo5MDQKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIG9wZXJhbmQgd2hlbiB1cGRhdGluZyIKLW1zZ3N0ciAiIgotCi0jLiBNYXJrIGFzIG5vbi12YWxpZCBpbnN0cnVjdGlvbgotIzogc3BhcmMtZGlzLmM6NzQ0Ci1tc2dpZCAidW5rbm93biIKLW1zZ3N0ciAiIgotCi0jOiBzcGFyYy1kaXMuYzo4MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6ICBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiwgJSMuOGx4LCAlIy44bHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcGFyYy1kaXMuYzo4MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6IGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiLCAlIy44bHgsICUjLjhseFxuIgotbXNnc3RyICIiCi0KLSM6IHNwYXJjLWRpcy5jOjg3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIgPT0gXCIlc1wiXG4iCi1tc2dzdHIgIiIKLQotIzogdjg1MC1kaXMuYzoyMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvcGVyYW5kIHNoaWZ0OiAleFxuIgotbXNnc3RyICIiCi0KLSM6IHY4NTAtZGlzLmM6MjMzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gcG9wIHJlZzogJWRcbiIKLW1zZ3N0ciAiIgotCi0jLiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gaW5zZXJ0IGFuZCBleHRyYWN0IGNvbXBsaWNhdGVkIG9wZXJhbmRzLgotIy4gTm90ZTogVGhlcmUgaXMgYSBjb25zcGlyYWN5IGJldHdlZW4gdGhlc2UgZnVuY3Rpb25zIGFuZAotIy4gdjg1MF9pbnNlcnRfb3BlcmFuZCgpIGluIGdhcy9jb25maWcvdGMtdjg1MC5jLiAgRXJyb3IgbWVzc2FnZXMKLSMuIGNvbnRhaW5pbmcgdGhlIHN0cmluZyAnb3V0IG9mIHJhbmdlJyB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIGEKLSMuIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb24gaXMgZ2l2ZW4gdG8gR0FTLgotIzogdjg1MC1vcGMuYzo0NgotbXNnaWQgImRpc3BsYWNlbWVudCB2YWx1ZSBpcyBub3QgaW4gcmFuZ2UgYW5kIGlzIG5vdCBhbGlnbmVkIgotbXNnc3RyICIiCi0KLSM6IHY4NTAtb3BjLmM6NDcKLW1zZ2lkICJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHY4NTAtb3BjLmM6NDgKLW1zZ2lkICJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgbm90IGFsaWduZWQiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzo1MAotbXNnaWQgImltbWVkaWF0ZSB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzo2MQotbXNnaWQgImJyYW5jaCB2YWx1ZSBub3QgaW4gcmFuZ2UgYW5kIHRvIG9kZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzo2MyB2ODUwLW9wYy5jOjk1Ci1tc2dpZCAiYnJhbmNoIHZhbHVlIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLW9wYy5jOjY2IHY4NTAtb3BjLmM6OTgKLW1zZ2lkICJicmFuY2ggdG8gb2RkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLW9wYy5jOjkzCi1tc2dpZCAiYnJhbmNoIHZhbHVlIG5vdCBpbiByYW5nZSBhbmQgdG8gYW4gb2RkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLW9wYy5jOjMyMQotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgZm9yIHN0YWNrIGFkanVzdG1lbnQiCi1tc2dzdHIgIiIKLQotIzogdjg1MC1vcGMuYzozNDMKLW1zZ2lkICJpbW1lZGlhdGUgdmFsdWUgbm90IGluIHJhbmdlIGFuZCBub3QgZXZlbiIKLW1zZ3N0ciAiIgotCi0jOiB2ODUwLW9wYy5jOjM0OAotbXNnaWQgImltbWVkaWF0ZSB2YWx1ZSBtdXN0IGJlIGV2ZW4iCi1tc2dzdHIgIiIKZGlmZiAtLWdpdCBhL29wY29kZXMvcHBjLWRpcy5jIGIvb3Bjb2Rlcy9wcGMtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzE2ZWEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wcGMtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyogcHBjLWRpcy5jIC0tIERpc2Fzc2VtYmxlIFBvd2VyUEMgaW5zdHJ1Y3Rpb25zCi0gICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+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+bmFtZSwgIm1vdmEiKSAhPSAwKQotCXsKLQkgIGludCBzaXplOwotCSAgYmZkX2J5dGUgYnl0ZXNbNF07Ci0KLQkgIGlmIChyZWxtYXNrID09IH4gKGJmZF92bWEpIDEpCi0JICAgIHNpemUgPSAyOwotCSAgZWxzZQotCSAgICBzaXplID0gNDsKLQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKGRpc3BfcGNfYWRkciwgYnl0ZXMsIHNpemUsIGluZm8pOwotCSAgaWYgKHN0YXR1cyA9PSAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHZhbDsKLQotCSAgICAgIGlmIChzaXplID09IDIpCi0JCXsKLQkJICBpZiAoKGluZm8tPmZsYWdzICYgTElUVExFX0JJVCkgIT0gMCkKLQkJICAgIHZhbCA9IGJmZF9nZXRsMTYgKGJ5dGVzKTsKLQkJICBlbHNlCi0JCSAgICB2YWwgPSBiZmRfZ2V0YjE2IChieXRlcyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKGluZm8tPmZsYWdzICYgTElUVExFX0JJVCkgIT0gMCkKLQkJICAgIHZhbCA9IGJmZF9nZXRsMzIgKGJ5dGVzKTsKLQkJICBlbHNlCi0JCSAgICB2YWwgPSBiZmRfZ2V0YjMyIChieXRlcyk7Ci0JCX0KLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJcdCEgMHgleCIsIHZhbCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHJldHVybiAyOwotICAgIGZhaWw6Ci0gICAgICA7Ci0KLSAgICB9Ci0gIGZwcmludGZfZm4gKHN0cmVhbSwgIi53b3JkIDB4JXgleCV4JXgiLCBuaWJzWzBdLCBuaWJzWzFdLCBuaWJzWzJdLCBuaWJzWzNdKTsKLSAgcmV0dXJuIDI7Ci19Ci0KLWludCAKLXByaW50X2luc25fc2hsIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgcjsKLQotICBpbmZvLT5mbGFncyA9IExJVFRMRV9CSVQ7Ci0gIHIgPSBwcmludF9pbnNuX3NoeCAobWVtYWRkciwgaW5mbyk7Ci0gIHJldHVybiByOwotfQotCi1pbnQgCi1wcmludF9pbnNuX3NoIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgcjsKLQotICBpbmZvLT5mbGFncyA9IDA7Ci0gIHIgPSBwcmludF9pbnNuX3NoeCAobWVtYWRkciwgaW5mbyk7Ci0gIHJldHVybiByOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zaC1vcGMuaCBiL29wY29kZXMvc2gtb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZmUwZWYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zaC1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3NSArMCwwIEBACi0vKiBEZWZpbml0aW9ucyBmb3IgU0ggb3Bjb2Rlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlIRVhfMCwKLQlIRVhfMSwKLQlIRVhfMiwKLQlIRVhfMywKLQlIRVhfNCwKLQlIRVhfNSwKLQlIRVhfNiwKLQlIRVhfNywKLQlIRVhfOCwKLQlIRVhfOSwKLQlIRVhfQSwKLQlIRVhfQiwKLQlIRVhfQywKLQlIRVhfRCwKLQlIRVhfRSwKLQlIRVhfRiwKLQlSRUdfTiwKLQlSRUdfTSwKLQlSRUdfTk0sCi0gICAgICAgIFJFR19CLAotCUJSQU5DSF8xMiwKLQlCUkFOQ0hfOCwKLQlESVNQXzgsCi0JRElTUF80LAotCUlNTV80LAotCUlNTV80QlkyLAotCUlNTV80Qlk0LAotCVBDUkVMSU1NXzhCWTIsCi0JUENSRUxJTU1fOEJZNCwKLQlJTU1fOCwKLQlJTU1fOEJZMiwKLQlJTU1fOEJZNAotfSBzaF9uaWJibGVfdHlwZTsKLQotdHlwZWRlZiBlbnVtIHsKLQlBX0VORCwKLQlBX0JESVNQMTIsCi0JQV9CRElTUDgsCi0JQV9ERUNfTSwKLQlBX0RFQ19OLAotCUFfRElTUF9HQlIsCi0JQV9ESVNQX1BDLAotCUFfRElTUF9SRUdfTSwKLQlBX0RJU1BfUkVHX04sCi0JQV9HQlIsCi0JQV9JTU0sCi0JQV9JTkNfTSwKLQlBX0lOQ19OLAotCUFfSU5EX00sCi0JQV9JTkRfTiwKLQlBX0lORF9SMF9SRUdfTSwKLQlBX0lORF9SMF9SRUdfTiwKLQlBX01BQ0gsCi0JQV9NQUNMLAotCUFfUFIsCi0JQV9SMCwKLQlBX1IwX0dCUiwKLQlBX1JFR19NLAotCUFfUkVHX04sCi0JQV9SRUdfQiwKLQlBX1NSLAotCUFfVkJSLAotCUFfU1NSLAotCUFfU1BDLAotCUFfU0dSLAotCUFfREJSLAotCUZfUkVHX04sCi0JRl9SRUdfTSwKLQlEX1JFR19OLAotCURfUkVHX00sCi0JWF9SRUdfTiwgLyogT25seSB1c2VkIGZvciBhcmd1bWVudCBwYXJzaW5nICovCi0JWF9SRUdfTSwgLyogT25seSB1c2VkIGZvciBhcmd1bWVudCBwYXJzaW5nICovCi0JRFhfUkVHX04sCi0JRFhfUkVHX00sCi0JVl9SRUdfTiwKLQlWX1JFR19NLAotCUZEX1JFR19OLAotCVhNVFJYX000LAotCUZfRlIwLAotCUZQVUxfTiwKLQlGUFVMX00sCi0JRlBTQ1JfTiwKLQlGUFNDUl9NCi19IHNoX2FyZ190eXBlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHNoX2FyZ190eXBlIGFyZ1s0XTsKLSAgc2hfbmliYmxlX3R5cGUgbmliYmxlc1s0XTsKLX0gc2hfb3Bjb2RlX2luZm87Ci0KLSNpZmRlZiBERUZJTkVfVEFCTEUKLQotc2hfb3Bjb2RlX2luZm8gc2hfdGFibGVbXSA9IHsKLQotLyogMDExMW5ubm5pOCoxLi4uLiBhZGQgIzxpbW0+LDxSRUdfTj4gICoveyJhZGQiLHtBX0lNTSxBX1JFR19OfSx7SEVYXzcsUkVHX04sSU1NXzh9fSwKLQotLyogMDAxMW5ubm5tbW1tMTEwMCBhZGQgPFJFR19NPiw8UkVHX04+ICoveyJhZGQiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0N9fSwKLQotLyogMDAxMW5ubm5tbW1tMTExMCBhZGRjIDxSRUdfTT4sPFJFR19OPioveyJhZGRjIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9FfX0sCi0KLS8qIDAwMTFubm5ubW1tbTExMTEgYWRkdiA8UkVHX00+LDxSRUdfTj4qL3siYWRkdiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfRn19LAotCi0vKiAxMTAwMTAwMWk4KjEuLi4uIGFuZCAjPGltbT4sUjAgICAgICAgKi97ImFuZCIse0FfSU1NLEFfUjB9LHtIRVhfQyxIRVhfOSxJTU1fOH19LAotCi0vKiAwMDEwbm5ubm1tbW0xMDAxIGFuZCA8UkVHX00+LDxSRUdfTj4gKi97ImFuZCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfOX19LAotCi0vKiAxMTAwMTEwMWk4KjEuLi4uIGFuZC5iICM8aW1tPixAKFIwLEdCUikqL3siYW5kLmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9ELElNTV84fX0sCi0KLS8qIDEwMTBpMTIuLi4uLi4uLi4gYnJhIDxiZGlzcDEyPiAgICAgICAqL3siYnJhIix7QV9CRElTUDEyfSx7SEVYX0EsQlJBTkNIXzEyfX0sCi0KLS8qIDEwMTFpMTIuLi4uLi4uLi4gYnNyIDxiZGlzcDEyPiAgICAgICAqL3siYnNyIix7QV9CRElTUDEyfSx7SEVYX0IsQlJBTkNIXzEyfX0sCi0KLS8qIDEwMDAxMDAxaThwMS4uLi4gYnQgPGJkaXNwOD4gICAgICAgICAqL3siYnQiLHtBX0JESVNQOH0se0hFWF84LEhFWF85LEJSQU5DSF84fX0sCi0KLS8qIDEwMDAxMDExaThwMS4uLi4gYmYgPGJkaXNwOD4gICAgICAgICAqL3siYmYiLHtBX0JESVNQOH0se0hFWF84LEhFWF9CLEJSQU5DSF84fX0sCi0KLS8qIDEwMDAxMTAxaThwMS4uLi4gYnQucyA8YmRpc3A4PiAgICAgICAqL3siYnQucyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0QsQlJBTkNIXzh9fSwKLQotLyogMTAwMDExMDFpOHAxLi4uLiBidC9zIDxiZGlzcDg+ICAgICAgICoveyJidC9zIix7QV9CRElTUDh9LHtIRVhfOCxIRVhfRCxCUkFOQ0hfOH19LAotCi0vKiAxMDAwMTExMWk4cDEuLi4uIGJmLnMgPGJkaXNwOD4gICAgICAgKi97ImJmLnMiLHtBX0JESVNQOH0se0hFWF84LEhFWF9GLEJSQU5DSF84fX0sCi0KLS8qIDEwMDAxMTExaThwMS4uLi4gYmYvcyA8YmRpc3A4PiAgICAgICAqL3siYmYvcyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0YsQlJBTkNIXzh9fSwKLQotLyogMDAwMDAwMDAwMDEwMTAwMCBjbHJtYWMgICAgICAgICAgICAgICoveyJjbHJtYWMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzIsSEVYXzh9fSwKLQotLyogMDAwMDAwMDAwMTAwMTAwMCBjbHJzICAgICAgICAgICAgICAgICoveyJjbHJzIix7MH0se0hFWF8wLEhFWF8wLEhFWF80LEhFWF84fX0sCi0KLS8qIDAwMDAwMDAwMDAwMDEwMDAgY2xydCAgICAgICAgICAgICAgICAqL3siY2xydCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfOH19LAotCi0vKiAxMDAwMTAwMGk4KjEuLi4uIGNtcC9lcSAjPGltbT4sUjAgICAgKi97ImNtcC9lcSIse0FfSU1NLEFfUjB9LHtIRVhfOCxIRVhfOCxJTU1fOH19LAotCi0vKiAwMDExbm5ubm1tbW0wMDAwIGNtcC9lcSA8UkVHX00+LDxSRUdfTj4qL3siY21wL2VxIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF8wfX0sCi0KLS8qIDAwMTFubm5ubW1tbTAwMTEgY21wL2dlIDxSRUdfTT4sPFJFR19OPioveyJjbXAvZ2UiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzN9fSwKLQotLyogMDAxMW5ubm5tbW1tMDExMSBjbXAvZ3QgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9ndCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfN319LAotCi0vKiAwMDExbm5ubm1tbW0wMTEwIGNtcC9oaSA8UkVHX00+LDxSRUdfTj4qL3siY21wL2hpIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF82fX0sCi0KLS8qIDAwMTFubm5ubW1tbTAwMTAgY21wL2hzIDxSRUdfTT4sPFJFR19OPioveyJjbXAvaHMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzJ9fSwKLQotLyogMDEwMG5ubm4wMDAxMDEwMSBjbXAvcGwgPFJFR19OPiAgICAgICoveyJjbXAvcGwiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzV9fSwKLQotLyogMDEwMG5ubm4wMDAxMDAwMSBjbXAvcHogPFJFR19OPiAgICAgICoveyJjbXAvcHoiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzF9fSwKLQotLyogMDAxMG5ubm5tbW1tMTEwMCBjbXAvc3RyIDxSRUdfTT4sPFJFR19OPioveyJjbXAvc3RyIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9DfX0sCi0KLS8qIDAwMTBubm5ubW1tbTAxMTEgZGl2MHMgPFJFR19NPiw8UkVHX04+Ki97ImRpdjBzIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF83fX0sCi0KLS8qIDAwMDAwMDAwMDAwMTEwMDEgZGl2MHUgICAgICAgICAgICAgICAqL3siZGl2MHUiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzEsSEVYXzl9fSwKLQotLyogMDAxMW5ubm5tbW1tMDEwMCBkaXYxIDxSRUdfTT4sPFJFR19OPioveyJkaXYxIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF80fX0sCi0KLS8qIDAxMTBubm5ubW1tbTExMTAgZXh0cy5iIDxSRUdfTT4sPFJFR19OPioveyJleHRzLmIiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0V9fSwKLQotLyogMDExMG5ubm5tbW1tMTExMSBleHRzLncgPFJFR19NPiw8UkVHX04+Ki97ImV4dHMudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfRn19LAotCi0vKiAwMTEwbm5ubm1tbW0xMTAwIGV4dHUuYiA8UkVHX00+LDxSRUdfTj4qL3siZXh0dS5iIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9DfX0sCi0KLS8qIDAxMTBubm5ubW1tbTExMDEgZXh0dS53IDxSRUdfTT4sPFJFR19OPioveyJleHR1LnciLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0R9fSwKLQotLyogMDEwMG5ubm4wMDEwMTAxMSBqbXAgQDxSRUdfTj4gICAgICAgICoveyJqbXAiLHtBX0lORF9OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYX0J9fSwKLQotLyogMDEwMG5ubm4wMDAwMTAxMSBqc3IgQDxSRUdfTj4gICAgICAgICoveyJqc3IiLHtBX0lORF9OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYX0J9fSwKLQotLyogMDEwMG5ubm4wMDAwMTExMCBsZGMgPFJFR19OPixTUiAgICAgICoveyJsZGMiLHtBX1JFR19OLEFfU1J9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAwMDExMTEwIGxkYyA8UkVHX04+LEdCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9HQlJ9LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAwMTAxMTEwIGxkYyA8UkVHX04+LFZCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9WQlJ9LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAwMTExMTEwIGxkYyA8UkVHX04+LFNTUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9TU1J9LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAxMDAxMTEwIGxkYyA8UkVHX04+LFNQQyAgICAgKi97ImxkYyIse0FfUkVHX04sQV9TUEN9LHtIRVhfNCxSRUdfTixIRVhfNCxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjExMTExMDEwIGxkYyA8UkVHX04+LERCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9EQlJ9LHtIRVhfNCxSRUdfTixIRVhfRixIRVhfQX19LAotCi0vKiAwMTAwbm5ubjF4eHgxMTEwIGxkYyA8UkVHX04+LFJuX0JBTksgKi97ImxkYyIse0FfUkVHX04sQV9SRUdfQn0se0hFWF80LFJFR19OLFJFR19CLEhFWF9FfX0sCi0KLS8qIDAxMDBubm5uMDAwMDAxMTEgbGRjLmwgQDxSRUdfTj4rLFNSICAqL3sibGRjLmwiLHtBX0lOQ19OLEFfU1J9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfN319LAotCi0vKiAwMTAwbm5ubjAwMDEwMTExIGxkYy5sIEA8UkVHX04+KyxHQlIgKi97ImxkYy5sIix7QV9JTkNfTixBX0dCUn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF83fX0sCi0KLS8qIDAxMDBubm5uMDAxMDAxMTEgbGRjLmwgQDxSRUdfTj4rLFZCUiAqL3sibGRjLmwiLHtBX0lOQ19OLEFfVkJSfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzd9fSwKLQotLyogMDEwMG5ubm4wMDExMDExMSBsZGMubCBAPFJFR19OPissU1NSICoveyJsZGMubCIse0FfSU5DX04sQV9TU1J9LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfN319LAotCi0vKiAwMTAwbm5ubjAxMDAwMTExIGxkYy5sIEA8UkVHX04+KyxTUEMgKi97ImxkYy5sIix7QV9JTkNfTixBX1NQQ30se0hFWF80LFJFR19OLEhFWF80LEhFWF83fX0sCi0KLS8qIDAxMDBubm5uMTExMTAxMTAgbGRjLmwgQDxSRUdfTj4rLERCUiAqL3sibGRjLmwiLHtBX0lOQ19OLEFfREJSfSx7SEVYXzQsUkVHX04sSEVYX0YsSEVYXzZ9fSwKLQotLyogMDEwMG5ubm4xeHh4MDExMSBsZGMubCA8UkVHX04+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+ICAgICAgICAqL3sibW92dCIse0FfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfOX19LAotCi0vKiAwMDEwbm5ubm1tbW0xMTExIG11bHMudyA8UkVHX00+LDxSRUdfTj4qL3sibXVscy53Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9GfX0sCi0vKiAwMDEwbm5ubm1tbW0xMTExIG11bHMgPFJFR19NPiw8UkVHX04+Ki97Im11bHMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0Z9fSwKLQotLyogMDAwMG5ubm5tbW1tMDExMSBtdWwubCA8UkVHX00+LDxSRUdfTj4qL3sibXVsLmwiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzd9fSwKLQotLyogMDAxMG5ubm5tbW1tMTExMCBtdWx1LncgPFJFR19NPiw8UkVHX04+Ki97Im11bHUudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfRX19LAotLyogMDAxMG5ubm5tbW1tMTExMCBtdWx1IDxSRUdfTT4sPFJFR19OPioveyJtdWx1Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9FfX0sCi0KLS8qIDAxMTBubm5ubW1tbTEwMTEgbmVnIDxSRUdfTT4sPFJFR19OPiAqL3sibmVnIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9CfX0sCi0KLS8qIDAxMTBubm5ubW1tbTEwMTAgbmVnYyA8UkVHX00+LDxSRUdfTj4qL3sibmVnYyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfQX19LAotCi0vKiAwMDAwMDAwMDAwMDAxMDAxIG5vcCAgICAgICAgICAgICAgICAgKi97Im5vcCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfOX19LAotCi0vKiAwMTEwbm5ubm1tbW0wMTExIG5vdCA8UkVHX00+LDxSRUdfTj4gKi97Im5vdCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfN319LAotLyogMDAwMG5ubm4xMDAxMDAxMSBvY2JpIEA8UkVHX04+ICAgICAgICoveyJvY2JpIix7QV9JTkRfTn0se0hFWF8wLFJFR19OLEhFWF85LEhFWF8zfX0sCi0KLS8qIDAwMDBubm5uMTAxMDAwMTEgb2NicCBAPFJFR19OPiAgICAgICAqL3sib2NicCIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQSxIRVhfM319LAotCi0vKiAwMDAwbm5ubjEwMTEwMDExIG9jYndiIEA8UkVHX04+ICAgICAgKi97Im9jYndiIix7QV9JTkRfTn0se0hFWF8wLFJFR19OLEhFWF9CLEhFWF8zfX0sCi0KLQotLyogMTEwMDEwMTFpOCoxLi4uLiBvciAjPGltbT4sUjAgICAgICAgICoveyJvciIse0FfSU1NLEFfUjB9LHtIRVhfQyxIRVhfQixJTU1fOH19LAotCi0vKiAwMDEwbm5ubm1tbW0xMDExIG9yIDxSRUdfTT4sPFJFR19OPiAgKi97Im9yIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9CfX0sCi0KLS8qIDExMDAxMTExaTgqMS4uLi4gb3IuYiAjPGltbT4sQChSMCxHQlIpKi97Im9yLmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9GLElNTV84fX0sCi0KLS8qIDAwMDBubm5uMTAwMDAwMTEgcHJlZiBAPFJFR19OPiAgICAgICAqL3sicHJlZiIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfOCxIRVhfM319LAotCi0vKiAwMTAwbm5ubjAwMTAwMTAwIHJvdGNsIDxSRUdfTj4gICAgICAgKi97InJvdGNsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF80fX0sCi0KLS8qIDAxMDBubm5uMDAxMDAxMDEgcm90Y3IgPFJFR19OPiAgICAgICAqL3sicm90Y3IiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzV9fSwKLQotLyogMDEwMG5ubm4wMDAwMDEwMCByb3RsIDxSRUdfTj4gICAgICAgICoveyJyb3RsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF80fX0sCi0KLS8qIDAxMDBubm5uMDAwMDAxMDEgcm90ciA8UkVHX04+ICAgICAgICAqL3sicm90ciIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfNX19LAotCi0vKiAwMDAwMDAwMDAwMTAxMDExIHJ0ZSAgICAgICAgICAgICAgICAgKi97InJ0ZSIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMixIRVhfQn19LAotCi0vKiAwMDAwMDAwMDAwMDAxMDExIHJ0cyAgICAgICAgICAgICAgICAgKi97InJ0cyIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfQn19LAotCi0vKiAwMDAwMDAwMDAxMDExMDAwIHNldHMgICAgICAgICAgICAgICAgKi97InNldHMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzUsSEVYXzh9fSwKLS8qIDAwMDAwMDAwMDAwMTEwMDAgc2V0dCAgICAgICAgICAgICAgICAqL3sic2V0dCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMSxIRVhfOH19LAotCi0vKiAwMTAwbm5ubm1tbW0xMTAwIHNoYWQgPFJFR19NPiw8UkVHX04+Ki97InNoYWQiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzQsUkVHX04sUkVHX00sSEVYX0N9fSwKLQotLyogMDEwMG5ubm5tbW1tMTEwMSBzaGxkIDxSRUdfTT4sPFJFR19OPioveyJzaGxkIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF80LFJFR19OLFJFR19NLEhFWF9EfX0sCi0KLS8qIDAxMDBubm5uMDAxMDAwMDAgc2hhbCA8UkVHX04+ICAgICAgICAqL3sic2hhbCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfMH19LAotCi0vKiAwMTAwbm5ubjAwMTAwMDAxIHNoYXIgPFJFR19OPiAgICAgICAgKi97InNoYXIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzF9fSwKLQotLyogMDEwMG5ubm4wMDAwMDAwMCBzaGxsIDxSRUdfTj4gICAgICAgICoveyJzaGxsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF8wfX0sCi0KLS8qIDAxMDBubm5uMDAxMDEwMDAgc2hsbDE2IDxSRUdfTj4gICAgICAqL3sic2hsbDE2Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF84fX0sCi0KLS8qIDAxMDBubm5uMDAwMDEwMDAgc2hsbDIgPFJFR19OPiAgICAgICAqL3sic2hsbDIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzh9fSwKLQotLyogMDEwMG5ubm4wMDAxMTAwMCBzaGxsOCA8UkVHX04+ICAgICAgICoveyJzaGxsOCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfOH19LAotCi0vKiAwMTAwbm5ubjAwMDAwMDAxIHNobHIgPFJFR19OPiAgICAgICAgKi97InNobHIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzF9fSwKLQotLyogMDEwMG5ubm4wMDEwMTAwMSBzaGxyMTYgPFJFR19OPiAgICAgICoveyJzaGxyMTYiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzl9fSwKLQotLyogMDEwMG5ubm4wMDAwMTAwMSBzaGxyMiA8UkVHX04+ICAgICAgICoveyJzaGxyMiIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfOX19LAotCi0vKiAwMTAwbm5ubjAwMDExMDAxIHNobHI4IDxSRUdfTj4gICAgICAgKi97InNobHI4Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF85fX0sCi0KLS8qIDAwMDAwMDAwMDAwMTEwMTEgc2xlZXAgICAgICAgICAgICAgICAqL3sic2xlZXAiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzEsSEVYX0J9fSwKLQotLyogMDAwMG5ubm4wMDAwMDAxMCBzdGMgU1IsPFJFR19OPiAgICAgICoveyJzdGMiLHtBX1NSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMCxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAwMDEwMDEwIHN0YyBHQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfR0JSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMSxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAwMTAwMDEwIHN0YyBWQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfVkJSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAwMTEwMDEwIHN0YyBTU1IsPFJFR19OPiAgICAgKi97InN0YyIse0FfU1NSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMyxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAxMDAwMDEwIHN0YyBTUEMsPFJFR19OPiAgICAgKi97InN0YyIse0FfU1BDLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNCxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAwMTExMDEwIHN0YyBTR1IsPFJFR19OPiAgICAgKi97InN0YyIse0FfU0dSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMyxIRVhfQX19LAotCi0vKiAwMDAwbm5ubjExMTExMDEwIHN0YyBEQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfREJSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfRixIRVhfQX19LAotCi0vKiAwMDAwbm5ubjF4eHgwMDEwIHN0YyBSbl9CQU5LLDxSRUdfTj4gKi97InN0YyIse0FfUkVHX0IsQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19CLEhFWF8yfX0sCi0KLS8qIDAxMDBubm5uMDAwMDAwMTEgc3RjLmwgU1IsQC08UkVHX04+ICAqL3sic3RjLmwiLHtBX1NSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfM319LAotCi0vKiAwMTAwbm5ubjAwMDEwMDExIHN0Yy5sIEdCUixALTxSRUdfTj4gKi97InN0Yy5sIix7QV9HQlIsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF8zfX0sCi0KLS8qIDAxMDBubm5uMDAxMDAwMTEgc3RjLmwgVkJSLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX1ZCUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzN9fSwKLQotLyogMDEwMG5ubm4wMDExMDAxMSBzdGMubCBTU1IsQC08UkVHX04+ICoveyJzdGMubCIse0FfU1NSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfM319LAotCi0vKiAwMTAwbm5ubjAxMDAwMDExIHN0Yy5sIFNQQyxALTxSRUdfTj4gKi97InN0Yy5sIix7QV9TUEMsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF80LEhFWF8zfX0sCi0KLS8qIDAxMDBubm5uMDAxMTAwMTAgc3RjLmwgU0dSLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX1NHUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzMsSEVYXzJ9fSwKLQotLyogMDEwMG5ubm4xMTExMDAxMCBzdGMubCBEQlIsQC08UkVHX04+ICoveyJzdGMubCIse0FfREJSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfRixIRVhfMn19LAotCi0vKiAwMTAwbm5ubjF4eHgwMDExIHN0Yy5sIFJuX0JBTkssQC08UkVHX04+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+LDxEX1JFR19OPioveyJmc3ViIix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzF9fSwKLQotLyogMTExMW5ubm4wMDExMTEwMSBmdHJjIDxGRF9SRUdfTj4sRlBVTCoveyJmdHJjIix7RkRfUkVHX04sRlBVTF9NfSx7SEVYX0YsUkVHX04sSEVYXzMsSEVYX0R9fSwKLQotLyogMTExMW5uMDExMTExMTEwMSBmdHJ2IFhNVFJYX000LDxWX1JFR19uPioveyJmdHJ2Iix7WE1UUlhfTTQsVl9SRUdfTn0se0hFWF9GLFJFR19OTSxIRVhfRixIRVhfRH19LAotCi17IDAgfSAKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zcGFyYy1kaXMuYyBiL29wY29kZXMvc3BhcmMtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYmRiNjAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zcGFyYy1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDk3NCArMCwwIEBACi0vKiBQcmludCBTUEFSQyBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkxLTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3NwYXJjLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBCaXRtYXNrIG9mIHY5IGFyY2hpdGVjdHVyZXMuICAqLwotI2RlZmluZSBNQVNLX1Y5ICgoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOSkgXAotCQkgfCAoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOUEpKQotLyogMSBpZiBJTlNOIGlzIGZvciB2OSBvbmx5LiAgKi8KLSNkZWZpbmUgVjlfT05MWV9QKGluc24pICghICgoaW5zbiktPmFyY2hpdGVjdHVyZSAmIH5NQVNLX1Y5KSkKLS8qIDEgaWYgSU5TTiBpcyBmb3IgdjkuICAqLwotI2RlZmluZSBWOV9QKGluc24pICgoKGluc24pLT5hcmNoaXRlY3R1cmUgJiBNQVNLX1Y5KSAhPSAwKQotCi0vKiBUaGUgc29ydGVkIG9wY29kZSB0YWJsZS4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKnNvcnRlZF9vcGNvZGVzOwotCi0vKiBGb3IgZmFzdGVyIGxvb2t1cCwgYWZ0ZXIgaW5zbnMgYXJlIHNvcnRlZCB0aGV5IGFyZSBoYXNoZWQuICAqLwotLyogPz8/IEkgdGhpbmsgdGhlcmUgaXMgcm9vbSBmb3IgZXZlbiBtb3JlIGltcHJvdmVtZW50LiAgKi8KLQotI2RlZmluZSBIQVNIX1NJWkUgMjU2Ci0vKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSBvbmx5IGxvb2sgYXQgaW5zbiBjb2RlIGJpdHMgYXMgdGhhdCBpcyBob3cgdGhlCi0gICBvcGNvZGUgdGFibGUgaXMgaGFzaGVkLiAgT1BDT0RFX0JJVFMgaXMgYSB0YWJsZSBvZiB2YWxpZCBiaXRzIGZvciBlYWNoCi0gICBvZiB0aGUgbWFpbiB0eXBlcyAoMCwxLDIsMykuICAqLwotc3RhdGljIGludCBvcGNvZGVfYml0c1s0XSA9IHsgMHgwMWMwMDAwMCwgMHgwLCAweDAxZjgwMDAwLCAweDAxZjgwMDAwIH07Ci0jZGVmaW5lIEhBU0hfSU5TTihJTlNOKSBcCi0gICgoKChJTlNOKSA+PiAyNCkgJiAweGMwKSB8ICgoKElOU04pICYgb3Bjb2RlX2JpdHNbKChJTlNOKSA+PiAzMCkgJiAzXSkgPj4gMTkpKQotc3RydWN0IG9wY29kZV9oYXNoIHsKLSAgc3RydWN0IG9wY29kZV9oYXNoICpuZXh0OwotICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICpvcGNvZGU7Ci19Owotc3RhdGljIHN0cnVjdCBvcGNvZGVfaGFzaCAqb3Bjb2RlX2hhc2hfdGFibGVbSEFTSF9TSVpFXTsKLQotc3RhdGljIHZvaWQgYnVpbGRfaGFzaF90YWJsZQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqLCBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKiosIGludCkpOwotc3RhdGljIGludCBpc19kZWxheWVkX2JyYW5jaCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50IGNvbXBhcmVfb3Bjb2RlcyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIGludCBjb21wdXRlX2FyY2hfbWFzayBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci0KLS8qIFNpZ24tZXh0ZW5kIGEgdmFsdWUgd2hpY2ggaXMgTiBiaXRzIGxvbmcuICAqLwotI2RlZmluZQlTRVgodmFsdWUsIGJpdHMpIFwKLQkoKCgoaW50KSh2YWx1ZSkpIDw8ICgoOCAqIHNpemVvZiAoaW50KSkgLSBiaXRzKSkJXAotCQkJID4+ICgoOCAqIHNpemVvZiAoaW50KSkgLSBiaXRzKSApCi0KLXN0YXRpYyAgY2hhciAqcmVnX25hbWVzW10gPQoteyAiZzAiLCAiZzEiLCAiZzIiLCAiZzMiLCAiZzQiLCAiZzUiLCAiZzYiLCAiZzciLAkKLSAgIm8wIiwgIm8xIiwgIm8yIiwgIm8zIiwgIm80IiwgIm81IiwgInNwIiwgIm83IiwJCi0gICJsMCIsICJsMSIsICJsMiIsICJsMyIsICJsNCIsICJsNSIsICJsNiIsICJsNyIsCQotICAiaTAiLCAiaTEiLCAiaTIiLCAiaTMiLCAiaTQiLCAiaTUiLCAiZnAiLCAiaTciLAkKLSAgImYwIiwgImYxIiwgImYyIiwgImYzIiwgImY0IiwgImY1IiwgImY2IiwgImY3IiwJCi0gICJmOCIsICJmOSIsICJmMTAiLCAiZjExIiwgImYxMiIsICJmMTMiLCAiZjE0IiwgImYxNSIsCQotICAiZjE2IiwgImYxNyIsICJmMTgiLCAiZjE5IiwgImYyMCIsICJmMjEiLCAiZjIyIiwgImYyMyIsCi0gICJmMjQiLCAiZjI1IiwgImYyNiIsICJmMjciLCAiZjI4IiwgImYyOSIsICJmMzAiLCAiZjMxIiwKLSAgImYzMiIsICJmMzMiLCAiZjM0IiwgImYzNSIsICJmMzYiLCAiZjM3IiwgImYzOCIsICJmMzkiLAkKLSAgImY0MCIsICJmNDEiLCAiZjQyIiwgImY0MyIsICJmNDQiLCAiZjQ1IiwgImY0NiIsICJmNDciLAkKLSAgImY0OCIsICJmNDkiLCAiZjUwIiwgImY1MSIsICJmNTIiLCAiZjUzIiwgImY1NCIsICJmNTUiLAotICAiZjU2IiwgImY1NyIsICJmNTgiLCAiZjU5IiwgImY2MCIsICJmNjEiLCAiZjYyIiwgImY2MyIsCi0vKiBwc3IsIHdpbSwgdGJyLCBmcHNyLCBjcHNyIGFyZSB2OCBvbmx5LiAgKi8KLSAgInkiLCAicHNyIiwgIndpbSIsICJ0YnIiLCAicGMiLCAibnBjIiwgImZwc3IiLCAiY3BzciIKLX07Ci0KLSNkZWZpbmUJZnJlZ19uYW1lcwkoJnJlZ19uYW1lc1s0ICogOF0pCi0KLS8qIFRoZXNlIGFyZSBvcmRlcmVkIGFjY29yZGluZyB0byB0aGVyZSByZWdpc3RlciBudW1iZXIgaW4KLSAgIHJkcHIgYW5kIHdycHIgaW5zbnMuICAqLwotc3RhdGljIGNoYXIgKnY5X3ByaXZfcmVnX25hbWVzW10gPQotewotICAidHBjIiwgInRucGMiLCAidHN0YXRlIiwgInR0IiwgInRpY2siLCAidGJhIiwgInBzdGF0ZSIsICJ0bCIsCi0gICJwaWwiLCAiY3dwIiwgImNhbnNhdmUiLCAiY2FucmVzdG9yZSIsICJjbGVhbndpbiIsICJvdGhlcndpbiIsCi0gICJ3c3RhdGUiLCAiZnEiCi0gIC8qICJ2ZXIiIC0gc3BlY2lhbCBjYXNlZCAqLwotfTsKLQotLyogVGhlc2UgYXJlIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZXJlIHJlZ2lzdGVyIG51bWJlciBpbgotICAgcmQgYW5kIHdyIGluc25zICgtMTYpLiAgKi8KLXN0YXRpYyBjaGFyICp2OWFfYXNyX3JlZ19uYW1lc1tdID0KLXsKLSAgInBjciIsICJwaWMiLCAiZGNyIiwgImdzciIsICJzZXRfc29mdGludCIsICJjbGVhcl9zb2Z0aW50IiwKLSAgInNvZnRpbnQiLCAidGlja19jbXByIgotfTsKLQotLyogTWFjcm9zIHVzZWQgdG8gZXh0cmFjdCBpbnN0cnVjdGlvbiBmaWVsZHMuICBOb3QgYWxsIGZpZWxkcyBoYXZlCi0gICBtYWNyb3MgZGVmaW5lZCBoZXJlLCBvbmx5IHRob3NlIHdoaWNoIGFyZSBhY3R1YWxseSB1c2VkLiAgKi8KLQotI2RlZmluZSBYX1JEKGkpICgoKGkpID4+IDI1KSAmIDB4MWYpCi0jZGVmaW5lIFhfUlMxKGkpICgoKGkpID4+IDE0KSAmIDB4MWYpCi0jZGVmaW5lIFhfTERTVF9JKGkpICgoKGkpID4+IDEzKSAmIDEpCi0jZGVmaW5lIFhfQVNJKGkpICgoKGkpID4+IDUpICYgMHhmZikKLSNkZWZpbmUgWF9SUzIoaSkgKCgoaSkgPj4gMCkgJiAweDFmKQotI2RlZmluZSBYX0lNTShpLG4pICgoKGkpID4+IDApICYgKCgxIDw8IChuKSkgLSAxKSkKLSNkZWZpbmUgWF9TSU1NKGksbikgU0VYIChYX0lNTSAoKGkpLCAobikpLCAobikpCi0jZGVmaW5lIFhfRElTUDIyKGkpICgoKGkpID4+IDApICYgMHgzZmZmZmYpCi0jZGVmaW5lIFhfSU1NMjIoaSkgWF9ESVNQMjIgKGkpCi0jZGVmaW5lIFhfRElTUDMwKGkpICgoKGkpID4+IDApICYgMHgzZmZmZmZmZikKLQotLyogVGhlc2UgYXJlIGZvciB2OS4gICovCi0jZGVmaW5lIFhfRElTUDE2KGkpICgoKCgoaSkgPj4gMjApICYgMykgPDwgMTQpIHwgKCgoaSkgPj4gMCkgJiAweDNmZmYpKQotI2RlZmluZSBYX0RJU1AxOShpKSAoKChpKSA+PiAwKSAmIDB4N2ZmZmYpCi0jZGVmaW5lIFhfTUVNQkFSKGkpICgoaSkgJiAweDdmKQotCi0vKiBIZXJlIGlzIHRoZSB1bmlvbiB3aGljaCB3YXMgdXNlZCB0byBleHRyYWN0IGluc3RydWN0aW9uIGZpZWxkcwotICAgYmVmb3JlIHRoZSBzaGlmdCBhbmQgbWFzayBtYWNyb3Mgd2VyZSB3cml0dGVuLgotCi0gICB1bmlvbiBzcGFyY19pbnNuCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBsb25nIGludCBjb2RlOwotICAgICAgIHN0cnVjdAotCSB7Ci0JICAgdW5zaWduZWQgaW50IGFub3A6MjsKLQkgICAjZGVmaW5lCW9wCWxkc3QuYW5vcAotCSAgIHVuc2lnbmVkIGludCBhbnJkOjU7Ci0JICAgI2RlZmluZQlyZAlsZHN0LmFucmQKLQkgICB1bnNpZ25lZCBpbnQgb3AzOjY7Ci0JICAgdW5zaWduZWQgaW50IGFucnMxOjU7Ci0JICAgI2RlZmluZQlyczEJbGRzdC5hbnJzMQotCSAgIHVuc2lnbmVkIGludCBpOjE7Ci0JICAgdW5zaWduZWQgaW50IGFuYXNpOjg7Ci0JICAgI2RlZmluZQlhc2kJbGRzdC5hbmFzaQotCSAgIHVuc2lnbmVkIGludCBhbnJzMjo1OwotCSAgICNkZWZpbmUJcnMyCWxkc3QuYW5yczIKLQkgICAjZGVmaW5lCXNoY250CXJzMgotCSB9IGxkc3Q7Ci0gICAgICAgc3RydWN0Ci0JIHsKLQkgICB1bnNpZ25lZCBpbnQgYW5vcDoyLCBhbnJkOjUsIG9wMzo2LCBhbnJzMTo1LCBpOjE7Ci0JICAgdW5zaWduZWQgaW50IElNTTEzOjEzOwotCSAgICNkZWZpbmUJaW1tMTMJSU1NMTMuSU1NMTMKLQkgfSBJTU0xMzsKLSAgICAgICBzdHJ1Y3QKLQkgewotCSAgIHVuc2lnbmVkIGludCBhbm9wOjI7Ci0JICAgdW5zaWduZWQgaW50IGE6MTsKLQkgICB1bnNpZ25lZCBpbnQgY29uZDo0OwotCSAgIHVuc2lnbmVkIGludCBvcDI6MzsKLQkgICB1bnNpZ25lZCBpbnQgRElTUDIyOjIyOwotCSAgICNkZWZpbmUJZGlzcDIyCWJyYW5jaC5ESVNQMjIKLQkgICAjZGVmaW5lCWltbTIyCWRpc3AyMgotCSB9IGJyYW5jaDsKLSAgICAgICBzdHJ1Y3QKLQkgewotCSAgIHVuc2lnbmVkIGludCBhbm9wOjI7Ci0JICAgdW5zaWduZWQgaW50IGE6MTsKLQkgICB1bnNpZ25lZCBpbnQgejoxOwotCSAgIHVuc2lnbmVkIGludCByY29uZDozOwotCSAgIHVuc2lnbmVkIGludCBvcDI6MzsKLQkgICB1bnNpZ25lZCBpbnQgRElTUDE2SEk6MjsKLQkgICB1bnNpZ25lZCBpbnQgcDoxOwotCSAgIHVuc2lnbmVkIGludCBfcnMxOjU7Ci0JICAgdW5zaWduZWQgaW50IERJU1AxNkxPOjE0OwotCSB9IGJyYW5jaDE2OwotICAgICAgIHN0cnVjdAotCSB7Ci0JICAgdW5zaWduZWQgaW50IGFub3A6MjsKLQkgICB1bnNpZ25lZCBpbnQgYWRpc3AzMDozMDsKLQkgICAjZGVmaW5lCWRpc3AzMAljYWxsLmFkaXNwMzAKLQkgfSBjYWxsOwotICAgICB9OwotCi0gICAqLwotCi0vKiBOb256ZXJvIGlmIElOU04gaXMgdGhlIG9wY29kZSBmb3IgYSBkZWxheWVkIGJyYW5jaC4gICovCi1zdGF0aWMgaW50Ci1pc19kZWxheWVkX2JyYW5jaCAoaW5zbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotewotICBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKm9wOwotCi0gIGZvciAob3AgPSBvcGNvZGVfaGFzaF90YWJsZVtIQVNIX0lOU04gKGluc24pXTsgb3A7IG9wID0gb3AtPm5leHQpCi0gICAgewotICAgICAgQ09OU1Qgc3RydWN0IHNwYXJjX29wY29kZSAqb3Bjb2RlID0gb3AtPm9wY29kZTsKLSAgICAgIGlmICgob3Bjb2RlLT5tYXRjaCAmIGluc24pID09IG9wY29kZS0+bWF0Y2gKLQkgICYmIChvcGNvZGUtPmxvc2UgJiBpbnNuKSA9PSAwKQotCXJldHVybiAob3Bjb2RlLT5mbGFncyAmIEZfREVMQVlFRCk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogZXh0ZXJuIHZvaWQgcXNvcnQgKCk7ICovCi0KLS8qIFJlY29yZHMgY3VycmVudCBtYXNrIG9mIFNQQVJDX09QQ09ERV9BUkNIX0ZPTyB2YWx1ZXMsIHVzZWQgdG8gcGFzcyB2YWx1ZQotICAgdG8gY29tcGFyZV9vcGNvZGVzLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3VycmVudF9hcmNoX21hc2s7Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIE1FTUFERFIgb24gSU5GTy0+U1RSRUFNLgotCi0gICBXZSBzdWZmaXggdGhlIGluc3RydWN0aW9uIHdpdGggYSBjb21tZW50IHRoYXQgZ2l2ZXMgdGhlIGFic29sdXRlCi0gICBhZGRyZXNzIGludm9sdmVkLCBhcyB3ZWxsIGFzIGl0cyBzeW1ib2xpYyBmb3JtLCBpZiB0aGUgaW5zdHJ1Y3Rpb24KLSAgIGlzIHByZWNlZGVkIGJ5IGEgZmluZGFibGUgYHNldGhpJyBhbmQgaXQgZWl0aGVyIGFkZHMgYW4gaW1tZWRpYXRlCi0gICBkaXNwbGFjZW1lbnQgdG8gdGhhdCByZWdpc3Rlciwgb3IgaXQgaXMgYW4gYGFkZCcgb3IgYG9yJyBpbnN0cnVjdGlvbgotICAgb24gdGhhdCByZWdpc3Rlci4gICovCi0KLWludAotcHJpbnRfaW5zbl9zcGFyYyAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBGSUxFICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICByZWdpc3RlciBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKm9wOwotICAvKiBOb256ZXJvIG9mIG9wY29kZSB0YWJsZSBoYXMgYmVlbiBpbml0aWFsaXplZC4gICovCi0gIHN0YXRpYyBpbnQgb3Bjb2Rlc19pbml0aWFsaXplZCA9IDA7Ci0gIC8qIGJmZCBtYWNoIG51bWJlciBvZiBsYXN0IGNhbGwuICAqLwotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBjdXJyZW50X21hY2ggPSAwOwotICBiZmRfdm1hICgqZ2V0d29yZCkgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci0KLSAgaWYgKCFvcGNvZGVzX2luaXRpYWxpemVkCi0gICAgICB8fCBpbmZvLT5tYWNoICE9IGN1cnJlbnRfbWFjaCkKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgY3VycmVudF9hcmNoX21hc2sgPSBjb21wdXRlX2FyY2hfbWFzayAoaW5mby0+bWFjaCk7Ci0KLSAgICAgIGlmICghb3Bjb2Rlc19pbml0aWFsaXplZCkKLQlzb3J0ZWRfb3Bjb2RlcyA9IChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqKQotCSAgeG1hbGxvYyAoc3BhcmNfbnVtX29wY29kZXMgKiBzaXplb2YgKHN0cnVjdCBzcGFyY19vcGNvZGUgKikpOwotICAgICAgLyogUmVzZXQgdGhlIHNvcnRlZCB0YWJsZSBzbyB3ZSBjYW4gcmVzb3J0IGl0LiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGFyY19udW1fb3Bjb2RlczsgKytpKQotCXNvcnRlZF9vcGNvZGVzW2ldID0gJnNwYXJjX29wY29kZXNbaV07Ci0gICAgICBxc29ydCAoKGNoYXIgKikgc29ydGVkX29wY29kZXMsIHNwYXJjX251bV9vcGNvZGVzLAotCSAgICAgc2l6ZW9mIChzb3J0ZWRfb3Bjb2Rlc1swXSksIGNvbXBhcmVfb3Bjb2Rlcyk7Ci0KLSAgICAgIGJ1aWxkX2hhc2hfdGFibGUgKHNvcnRlZF9vcGNvZGVzLCBvcGNvZGVfaGFzaF90YWJsZSwgc3BhcmNfbnVtX29wY29kZXMpOwotICAgICAgY3VycmVudF9tYWNoID0gaW5mby0+bWFjaDsKLSAgICAgIG9wY29kZXNfaW5pdGlhbGl6ZWQgPSAxOwotICAgIH0KLQotICB7Ci0gICAgaW50IHN0YXR1cyA9Ci0gICAgICAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgaW5mbyk7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKQotICAgICAgewotCSgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCXJldHVybiAtMTsKLSAgICAgIH0KLSAgfQotCi0gIC8qIE9uIFNQQVJDbGl0ZSB2YXJpYW50cyBzdWNoIGFzIERBTmxpdGUgKHNwYXJjODZ4KSwgaW5zdHJ1Y3Rpb25zCi0gICAgIGFyZSBhbHdheXMgYmlnLWVuZGlhbiBldmVuIHdoZW4gdGhlIG1hY2hpbmUgaXMgaW4gbGl0dGxlLWVuZGlhbiBtb2RlLiAqLwotICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHIHx8IGluZm8tPm1hY2ggPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlKQotICAgIGdldHdvcmQgPSBiZmRfZ2V0YjMyOwotICBlbHNlCi0gICAgZ2V0d29yZCA9IGJmZF9nZXRsMzI7Ci0KLSAgaW5zbiA9IGdldHdvcmQgKGJ1ZmZlcik7Ci0KLSAgaW5mby0+aW5zbl9pbmZvX3ZhbGlkID0gMTsJCQkvKiBXZSBkbyByZXR1cm4gdGhpcyBpbmZvICovCi0gIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25icmFuY2g7CQkvKiBBc3N1bWUgbm9uIGJyYW5jaCBpbnNuICovCi0gIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDA7CQkJLyogQXNzdW1lIG5vIGRlbGF5ICovCi0gIGluZm8tPnRhcmdldCA9IDA7CQkJCS8qIEFzc3VtZSBubyB0YXJnZXQga25vd24gKi8KLQotICBmb3IgKG9wID0gb3Bjb2RlX2hhc2hfdGFibGVbSEFTSF9JTlNOIChpbnNuKV07IG9wOyBvcCA9IG9wLT5uZXh0KQotICAgIHsKLSAgICAgIENPTlNUIHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wY29kZSA9IG9wLT5vcGNvZGU7Ci0KLSAgICAgIC8qIElmIHRoZSBpbnNuIGlzbid0IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUsIHNraXAgaXQuICAqLwotICAgICAgaWYgKCEgKG9wY29kZS0+YXJjaGl0ZWN0dXJlICYgY3VycmVudF9hcmNoX21hc2spKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKG9wY29kZS0+bWF0Y2ggJiBpbnNuKSA9PSBvcGNvZGUtPm1hdGNoCi0JICAmJiAob3Bjb2RlLT5sb3NlICYgaW5zbikgPT0gMCkKLQl7Ci0JICAvKiBOb256ZXJvIG1lYW5zIHRoYXQgd2UgaGF2ZSBmb3VuZCBhbiBpbnN0cnVjdGlvbiB3aGljaCBoYXMKLQkgICAgIHRoZSBlZmZlY3Qgb2YgYWRkaW5nIG9yIG9yJ2luZyB0aGUgaW1tMTMgZmllbGQgdG8gcnMxLiAgKi8KLQkgIGludCBpbW1fYWRkZWRfdG9fcnMxID0gMDsKLQkgIGludCBpbW1fb3JlZF90b19yczEgPSAwOwotCi0JICAvKiBOb256ZXJvIG1lYW5zIHRoYXQgd2UgaGF2ZSBmb3VuZCBhIHBsdXMgc2lnbiBpbiB0aGUgYXJncwotCSAgICAgZmllbGQgb2YgdGhlIG9wY29kZSB0YWJsZS4gICovCi0JICBpbnQgZm91bmRfcGx1cyA9IDA7Ci0JICAKLQkgIC8qIE5vbnplcm8gbWVhbnMgd2UgaGF2ZSBhbiBhbm51bGxlZCBicmFuY2guICAqLwotCSAgaW50IGlzX2FubnVsbGVkID0gMDsKLQotCSAgLyogRG8gd2UgaGF2ZSBhbiBgYWRkJyBvciBgb3InIGluc3RydWN0aW9uIGNvbWJpbmluZyBhbgotICAgICAgICAgICAgIGltbWVkaWF0ZSB3aXRoIHJzMT8gICovCi0JICBpZiAob3Bjb2RlLT5tYXRjaCA9PSAweDgwMTAyMDAwKSAvKiBvciAqLwotCSAgICBpbW1fb3JlZF90b19yczEgPSAxOwotCSAgaWYgKG9wY29kZS0+bWF0Y2ggPT0gMHg4MDAwMjAwMCkgLyogYWRkICovCi0JICAgIGltbV9hZGRlZF90b19yczEgPSAxOwotCi0JICBpZiAoWF9SUzEgKGluc24pICE9IFhfUkQgKGluc24pCi0JICAgICAgJiYgc3RyY2hyIChvcGNvZGUtPmFyZ3MsICdyJykgIT0gMCkKLQkgICAgICAvKiBDYW4ndCBkbyBzaW1wbGUgZm9ybWF0IGlmIHNvdXJjZSBhbmQgZGVzdCBhcmUgZGlmZmVyZW50LiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgIGlmIChYX1JTMiAoaW5zbikgIT0gWF9SRCAoaW5zbikKLQkgICAgICAmJiBzdHJjaHIgKG9wY29kZS0+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/IFhfUlMxIChpbnNuKSA6IFhfUkQgKGluc24pOwotCQkgICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfZGVjb2RlX3NwYXJjbGV0X2NwcmVnICh2YWwpOwotCi0JCSAgICAgIGlmIChuYW1lKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlcyIsIG5hbWUpOwotCQkgICAgICBlbHNlCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlY3ByZWcoJWQpIiwgdmFsKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQotCSAgLyogSWYgd2UgYXJlIGFkZGluZyBvciBvcidpbmcgc29tZXRoaW5nIHRvIHJzMSwgdGhlbgotCSAgICAgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcwotCSAgICAgYSBzZXRoaSB0byB0aGUgc2FtZSByZWdpc3RlciBhcyBpbiB0aGUgc2V0aGkuCi0JICAgICBJZiBzbywgYXR0ZW1wdCB0byBwcmludCB0aGUgcmVzdWx0IG9mIHRoZSBhZGQgb3IKLQkgICAgIG9yIChpbiB0aGlzIGNvbnRleHQgYWRkIGFuZCBvciBkbyB0aGUgc2FtZSB0aGluZykKLQkgICAgIGFuZCBpdHMgc3ltYm9saWMgdmFsdWUuICAqLwotCSAgaWYgKGltbV9vcmVkX3RvX3JzMSB8fCBpbW1fYWRkZWRfdG9fcnMxKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyBwcmV2X2luc247Ci0JICAgICAgaW50IGVycmNvZGU7Ci0KLQkgICAgICBlcnJjb2RlID0KLQkJKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQotCQkgIChtZW1hZGRyIC0gNCwgYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksIGluZm8pOwotCSAgICAgIHByZXZfaW5zbiA9IGdldHdvcmQgKGJ1ZmZlcik7Ci0KLQkgICAgICBpZiAoZXJyY29kZSA9PSAwKQotCQl7Ci0JCSAgLyogSWYgaXQgaXMgYSBkZWxheWVkIGJyYW5jaCwgd2UgbmVlZCB0byBsb29rIGF0IHRoZQotCQkgICAgIGluc3RydWN0aW9uIGJlZm9yZSB0aGUgZGVsYXllZCBicmFuY2guICBUaGlzIGhhbmRsZXMKLQkJICAgICBzZXF1ZW5jZXMgc3VjaCBhcwotCi0JCSAgICAgc2V0aGkgJW8xLCAlaGkoX2ZvbyksICVvMQotCQkgICAgIGNhbGwgX3ByaW50ZgotCQkgICAgIG9yICVvMSwgJWxvKF9mb28pLCAlbzEKLQkJICAgICAqLwotCi0JCSAgaWYgKGlzX2RlbGF5ZWRfYnJhbmNoIChwcmV2X2luc24pKQotCQkgICAgewotCQkgICAgICBlcnJjb2RlID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQotCQkJKG1lbWFkZHIgLSA4LCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgaW5mbyk7Ci0JCSAgICAgIHByZXZfaW5zbiA9IGdldHdvcmQgKGJ1ZmZlcik7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIElmIHRoZXJlIHdhcyBhIHByb2JsZW0gcmVhZGluZyBtZW1vcnksIHRoZW4gYXNzdW1lCi0JCSB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIG5vdCBzZXRoaS4gICovCi0JICAgICAgaWYgKGVycmNvZGUgPT0gMCkKLQkJewotCQkgIC8qIElzIGl0IHNldGhpIHRvIHRoZSBzYW1lIHJlZ2lzdGVyPyAgKi8KLQkJICBpZiAoKHByZXZfaW5zbiAmIDB4YzFjMDAwMDApID09IDB4MDEwMDAwMDAKLQkJICAgICAgJiYgWF9SRCAocHJldl9pbnNuKSA9PSBYX1JTMSAoaW5zbikpCi0JCSAgICB7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiXHQhICIpOwotCQkgICAgICBpbmZvLT50YXJnZXQgPSAKLQkJCSgweEZGRkZGRkZGICYgKGludCkgWF9JTU0yMiAocHJldl9pbnNuKSA8PCAxMCk7Ci0JCSAgICAgIGlmIChpbW1fYWRkZWRfdG9fcnMxKQotCQkJaW5mby0+dGFyZ2V0ICs9IFhfU0lNTSAoaW5zbiwgMTMpOwotCQkgICAgICBlbHNlCi0JCQlpbmZvLT50YXJnZXQgfD0gWF9TSU1NIChpbnNuLCAxMyk7Ci0JCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoaW5mby0+dGFyZ2V0LCBpbmZvKTsKLQkJICAgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JCSAgICAgIGluZm8tPmRhdGFfc2l6ZSA9IDQ7ICAvKiBGSVhNRSEhISAqLwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKG9wY29kZS0+ZmxhZ3MgJiAoRl9VTkJSfEZfQ09OREJSfEZfSlNSKSkKLQkgICAgewotCQkvKiBGSVhNRSAtLSBjaGVjayBpc19hbm51bGxlZCBmbGFnICovCi0JICAgICAgaWYgKG9wY29kZS0+ZmxhZ3MgJiBGX1VOQlIpCi0JCWluZm8tPmluc25fdHlwZSA9IGRpc19icmFuY2g7Ci0JICAgICAgaWYgKG9wY29kZS0+ZmxhZ3MgJiBGX0NPTkRCUikKLQkJaW5mby0+aW5zbl90eXBlID0gZGlzX2NvbmRicmFuY2g7Ci0JICAgICAgaWYgKG9wY29kZS0+ZmxhZ3MgJiBGX0pTUikKLQkJaW5mby0+aW5zbl90eXBlID0gZGlzX2pzcjsKLQkgICAgICBpZiAob3Bjb2RlLT5mbGFncyAmIEZfREVMQVlFRCkKLQkJaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMTsKLQkgICAgfQotCi0JICByZXR1cm4gc2l6ZW9mIChidWZmZXIpOwotCX0KLSAgICB9Ci0KLSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmluc247CS8qIE1hcmsgYXMgbm9uLXZhbGlkIGluc3RydWN0aW9uICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCBfKCJ1bmtub3duIikpOwotICByZXR1cm4gc2l6ZW9mIChidWZmZXIpOwotfQotCi0vKiBHaXZlbiBCRkQgbWFjaCBudW1iZXIsIHJldHVybiBhIG1hc2sgb2YgU1BBUkNfT1BDT0RFX0FSQ0hfRk9PIHZhbHVlcy4gICovCi0KLXN0YXRpYyBpbnQKLWNvbXB1dGVfYXJjaF9tYXNrIChtYWNoKQotICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Ci17Ci0gIHN3aXRjaCAobWFjaCkKLSAgICB7Ci0gICAgY2FzZSAwIDoKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjIDoKLSAgICAgIHJldHVybiBTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOCk7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCA6Ci0gICAgICByZXR1cm4gU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMRVQpOwotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlIDoKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSA6Ci0gICAgICAvKiBzcGFyY2xpdGVzIGluc25zIGFyZSByZWNvZ25pemVkIGJ5IGRlZmF1bHQgKGJlY2F1c2UgdGhhdCdzIGhvdwotCSB0aGV5J3ZlIGFsd2F5cyBiZWVuIHRyZWF0ZWQsIGZvciBiZXR0ZXIgb3Igd29yc2UpLiAgS2x1ZGdlIHRoaXMgYnkKLQkgaW5kaWNhdGluZyBnZW5lcmljIHY4IGlzIGFsc28gc2VsZWN0ZWQuICAqLwotICAgICAgcmV0dXJuIChTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xJVEUpCi0JICAgICAgfCBTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOCkpOwotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjhwbHVzIDoKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3Y5IDoKLSAgICAgIHJldHVybiBTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOSk7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OHBsdXNhIDoKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3Y5YSA6Ci0gICAgICByZXR1cm4gU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKTsKLSAgICB9Ci0gIGFib3J0ICgpOwotfQotCi0vKiBDb21wYXJlIG9wY29kZXMgQSBhbmQgQi4gICovCi0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfb3Bjb2RlcyAoYSwgYikKLSAgICAgY29uc3QgUFRSIGE7Ci0gICAgIGNvbnN0IFBUUiBiOwotewotICBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICpvcDAgPSAqIChzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqKSBhOwotICBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICpvcDEgPSAqIChzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqKSBiOwotICB1bnNpZ25lZCBsb25nIGludCBtYXRjaDAgPSBvcDAtPm1hdGNoLCBtYXRjaDEgPSBvcDEtPm1hdGNoOwotICB1bnNpZ25lZCBsb25nIGludCBsb3NlMCA9IG9wMC0+bG9zZSwgbG9zZTEgPSBvcDEtPmxvc2U7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIElmIG9uZSAoYW5kIG9ubHkgb25lKSBpbnNuIGlzbid0IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUsCi0gICAgIHByZWZlciB0aGUgb25lIHRoYXQgaXMuICBJZiBuZWl0aGVyIGFyZSBzdXBwb3J0ZWQsIGJ1dCB0aGV5J3JlIGJvdGggZm9yCi0gICAgIHRoZSBzYW1lIGFyY2hpdGVjdHVyZSwgY29udGludWUgcHJvY2Vzc2luZy4gIE90aGVyd2lzZSAoYm90aCB1bnN1cHBvcnRlZAotICAgICBhbmQgZm9yIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzKSwgcHJlZmVyIGxvd2VyIG51bWJlcmVkIGFyY2gncyAoZnVkZ2VkCi0gICAgIGJ5IGNvbXBhcmluZyB0aGUgYml0bWFza3MpLiAgKi8KLSAgaWYgKG9wMC0+YXJjaGl0ZWN0dXJlICYgY3VycmVudF9hcmNoX21hc2spCi0gICAgewotICAgICAgaWYgKCEgKG9wMS0+YXJjaGl0ZWN0dXJlICYgY3VycmVudF9hcmNoX21hc2spKQotCXJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAob3AxLT5hcmNoaXRlY3R1cmUgJiBjdXJyZW50X2FyY2hfbWFzaykKLQlyZXR1cm4gMTsKLSAgICAgIGVsc2UgaWYgKG9wMC0+YXJjaGl0ZWN0dXJlICE9IG9wMS0+YXJjaGl0ZWN0dXJlKQotCXJldHVybiBvcDAtPmFyY2hpdGVjdHVyZSAtIG9wMS0+YXJjaGl0ZWN0dXJlOwotICAgIH0KLQotICAvKiBJZiBhIGJpdCBpcyBzZXQgaW4gYm90aCBtYXRjaCBhbmQgbG9zZSwgdGhlcmUgaXMgc29tZXRoaW5nCi0gICAgIHdyb25nIHdpdGggdGhlIG9wY29kZSB0YWJsZS4gICovCi0gIGlmIChtYXRjaDAgJiBsb3NlMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmCi0JKHN0ZGVyciwKLQkgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgXygiSW50ZXJuYWwgZXJyb3I6ICBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiwgJSMuOGx4LCAlIy44bHhcbiIpLAotCSBvcDAtPm5hbWUsIG1hdGNoMCwgbG9zZTApOwotICAgICAgb3AwLT5sb3NlICY9IH5vcDAtPm1hdGNoOwotICAgICAgbG9zZTAgPSBvcDAtPmxvc2U7Ci0gICAgfQotCi0gIGlmIChtYXRjaDEgJiBsb3NlMSkKLSAgICB7Ci0gICAgICBmcHJpbnRmCi0JKHN0ZGVyciwKLQkgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgXygiSW50ZXJuYWwgZXJyb3I6IGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiLCAlIy44bHgsICUjLjhseFxuIiksCi0JIG9wMS0+bmFtZSwgbWF0Y2gxLCBsb3NlMSk7Ci0gICAgICBvcDEtPmxvc2UgJj0gfm9wMS0+bWF0Y2g7Ci0gICAgICBsb3NlMSA9IG9wMS0+bG9zZTsKLSAgICB9Ci0KLSAgLyogQmVjYXVzZSB0aGUgYml0cyB0aGF0IGFyZSB2YXJpYWJsZSBpbiBvbmUgb3Bjb2RlIGFyZSBjb25zdGFudCBpbgotICAgICBhbm90aGVyLCBpdCBpcyBpbXBvcnRhbnQgdG8gb3JkZXIgdGhlIG9wY29kZXMgaW4gdGhlIHJpZ2h0IG9yZGVyLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IDMyOyArK2kpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpbnQgeCA9IDEgPDwgaTsKLSAgICAgIGludCB4MCA9IChtYXRjaDAgJiB4KSAhPSAwOwotICAgICAgaW50IHgxID0gKG1hdGNoMSAmIHgpICE9IDA7Ci0KLSAgICAgIGlmICh4MCAhPSB4MSkKLQlyZXR1cm4geDEgLSB4MDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IDMyOyArK2kpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpbnQgeCA9IDEgPDwgaTsKLSAgICAgIGludCB4MCA9IChsb3NlMCAmIHgpICE9IDA7Ci0gICAgICBpbnQgeDEgPSAobG9zZTEgJiB4KSAhPSAwOwotCi0gICAgICBpZiAoeDAgIT0geDEpCi0JcmV0dXJuIHgxIC0geDA7Ci0gICAgfQotCi0gIC8qIFRoZXkgYXJlIGZ1bmN0aW9uYWxseSBlcXVhbC4gIFNvIGFzIGxvbmcgYXMgdGhlIG9wY29kZSB0YWJsZSBpcwotICAgICB2YWxpZCwgd2UgY2FuIHB1dCB3aGljaGV2ZXIgb25lIGZpcnN0IHdlIHdhbnQsIG9uIGFlc3RoZXRpYyBncm91bmRzLiAgKi8KLQotICAvKiBPdXIgZmlyc3QgYWVzdGhldGljIGdyb3VuZCBpcyB0aGF0IGFsaWFzZXMgZGVmZXIgdG8gcmVhbCBpbnNucy4gICovCi0gIHsKLSAgICBpbnQgYWxpYXNfZGlmZiA9IChvcDAtPmZsYWdzICYgRl9BTElBUykgLSAob3AxLT5mbGFncyAmIEZfQUxJQVMpOwotICAgIGlmIChhbGlhc19kaWZmICE9IDApCi0gICAgICAvKiBQdXQgdGhlIG9uZSB0aGF0IGlzbid0IGFuIGFsaWFzIGZpcnN0LiAgKi8KLSAgICAgIHJldHVybiBhbGlhc19kaWZmOwotICB9Ci0KLSAgLyogRXhjZXB0IGZvciBhbGlhc2VzLCB0d28gImlkZW50aWNhbCIgaW5zdHJ1Y3Rpb25zIGhhZAotICAgICBiZXR0ZXIgaGF2ZSB0aGUgc2FtZSBvcGNvZGUuICBUaGlzIGlzIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSB0YWJsZS4gICovCi0gIGkgPSBzdHJjbXAgKG9wMC0+bmFtZSwgb3AxLT5uYW1lKTsKLSAgaWYgKGkpCi0gICAgewotICAgICAgaWYgKG9wMC0+ZmxhZ3MgJiBGX0FMSUFTKSAvKiBJZiB0aGV5J3JlIGJvdGggYWxpYXNlcywgYmUgYXJiaXRyYXJ5LiAqLwotCXJldHVybiBpOwotICAgICAgZWxzZQotCWZwcmludGYgKHN0ZGVyciwKLQkJIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCSBfKCJJbnRlcm5hbCBlcnJvcjogYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIgPT0gXCIlc1wiXG4iKSwKLQkJIG9wMC0+bmFtZSwgb3AxLT5uYW1lKTsKLSAgICB9Ci0KLSAgLyogRmV3ZXIgYXJndW1lbnRzIGFyZSBwcmVmZXJyZWQuICAqLwotICB7Ci0gICAgaW50IGxlbmd0aF9kaWZmID0gc3RybGVuIChvcDAtPmFyZ3MpIC0gc3RybGVuIChvcDEtPmFyZ3MpOwotICAgIGlmIChsZW5ndGhfZGlmZiAhPSAwKQotICAgICAgLyogUHV0IHRoZSBvbmUgd2l0aCBmZXdlciBhcmd1bWVudHMgZmlyc3QuICAqLwotICAgICAgcmV0dXJuIGxlbmd0aF9kaWZmOwotICB9Ci0KLSAgLyogUHV0IDEraSBiZWZvcmUgaSsxLiAgKi8KLSAgewotICAgIGNoYXIgKnAwID0gKGNoYXIgKikgc3RyY2hyIChvcDAtPmFyZ3MsICcrJyk7Ci0gICAgY2hhciAqcDEgPSAoY2hhciAqKSBzdHJjaHIgKG9wMS0+YXJncywgJysnKTsKLQotICAgIGlmIChwMCAmJiBwMSkKLSAgICAgIHsKLQkvKiBUaGVyZSBpcyBhIHBsdXMgaW4gYm90aCBvcGVyYW5kcy4gIE5vdGUgdGhhdCBhIHBsdXMKLQkgICBzaWduIGNhbm5vdCBiZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIGFyZ3MsCi0JICAgc28gdGhlIGZvbGxvd2luZyBbLTFdJ3MgYXJlIHZhbGlkLiAgKi8KLQlpZiAocDBbLTFdID09ICdpJyAmJiBwMVsxXSA9PSAnaScpCi0JICAvKiBvcDAgaXMgaSsxIGFuZCBvcDEgaXMgMStpLCBzbyBvcDEgZ29lcyBmaXJzdC4gICovCi0JICByZXR1cm4gMTsKLQlpZiAocDBbMV0gPT0gJ2knICYmIHAxWy0xXSA9PSAnaScpCi0JICAvKiBvcDAgaXMgMStpIGFuZCBvcDEgaXMgaSsxLCBzbyBvcDAgZ29lcyBmaXJzdC4gICovCi0JICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBQdXQgMSxpIGJlZm9yZSBpLDEuICAqLwotICB7Ci0gICAgaW50IGkwID0gc3RybmNtcCAob3AwLT5hcmdzLCAiaSwxIiwgMykgPT0gMDsKLSAgICBpbnQgaTEgPSBzdHJuY21wIChvcDEtPmFyZ3MsICJpLDEiLCAzKSA9PSAwOwotCi0gICAgaWYgKGkwIF4gaTEpCi0gICAgICByZXR1cm4gaTAgLSBpMTsKLSAgfQotCi0gIC8qIFRoZXkgYXJlLCBhcyBmYXIgYXMgd2UgY2FuIHRlbGwsIGlkZW50aWNhbC4KLSAgICAgU2luY2UgcXNvcnQgbWF5IGhhdmUgcmVhcnJhbmdlZCB0aGUgdGFibGUgcGFydGlhbGx5LCB0aGVyZSBpcwotICAgICBubyB3YXkgdG8gdGVsbCB3aGljaCBvbmUgd2FzIGZpcnN0IGluIHRoZSBvcGNvZGUgdGFibGUgYXMKLSAgICAgd3JpdHRlbiwgc28ganVzdCBzYXkgdGhlcmUgYXJlIGVxdWFsLiAgKi8KLSAgLyogPz8/IFRoaXMgaXMgbm8gbG9uZ2VyIHRydWUgbm93IHRoYXQgd2Ugc29ydCBhIHZlY3RvciBvZiBwb2ludGVycywKLSAgICAgbm90IHRoZSB0YWJsZSBpdHNlbGYuICAqLwotICByZXR1cm4gMDsKLX0KLQotLyogQnVpbGQgYSBoYXNoIHRhYmxlIGZyb20gdGhlIG9wY29kZSB0YWJsZS4KLSAgIE9QQ09ERV9UQUJMRSBpcyBhIHNvcnRlZCBsaXN0IG9mIHBvaW50ZXJzIGludG8gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9oYXNoX3RhYmxlIChvcGNvZGVfdGFibGUsIGhhc2hfdGFibGUsIG51bV9vcGNvZGVzKQotICAgICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqb3Bjb2RlX3RhYmxlOwotICAgICBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKipoYXNoX3RhYmxlOwotICAgICBpbnQgbnVtX29wY29kZXM7Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotICBpbnQgaGFzaF9jb3VudFtIQVNIX1NJWkVdOwotICBzdGF0aWMgc3RydWN0IG9wY29kZV9oYXNoICpoYXNoX2J1ZiA9IE5VTEw7Ci0KLSAgLyogU3RhcnQgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUgYW5kIHdvcmsgYmFja3dhcmRzIHNvIHRoYXQgZWFjaAotICAgICBjaGFpbiBpcyBzb3J0ZWQuICAqLwotCi0gIG1lbXNldCAoaGFzaF90YWJsZSwgMCwgSEFTSF9TSVpFICogc2l6ZW9mIChoYXNoX3RhYmxlWzBdKSk7Ci0gIG1lbXNldCAoaGFzaF9jb3VudCwgMCwgSEFTSF9TSVpFICogc2l6ZW9mIChoYXNoX2NvdW50WzBdKSk7Ci0gIGlmIChoYXNoX2J1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGhhc2hfYnVmKTsKLSAgaGFzaF9idWYgPSAoc3RydWN0IG9wY29kZV9oYXNoICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG9wY29kZV9oYXNoKSAqIG51bV9vcGNvZGVzKTsKLSAgZm9yIChpID0gbnVtX29wY29kZXMgLSAxOyBpID49IDA7IC0taSkKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgaGFzaCA9IEhBU0hfSU5TTiAob3Bjb2RlX3RhYmxlW2ldLT5tYXRjaCk7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKmggPSAmaGFzaF9idWZbaV07Ci0gICAgICBoLT5uZXh0ID0gaGFzaF90YWJsZVtoYXNoXTsKLSAgICAgIGgtPm9wY29kZSA9IG9wY29kZV90YWJsZVtpXTsKLSAgICAgIGhhc2hfdGFibGVbaGFzaF0gPSBoOwotICAgICAgKytoYXNoX2NvdW50W2hhc2hdOwotICAgIH0KLQotI2lmIDAgLyogZm9yIGRlYnVnZ2luZyAqLwotICB7Ci0gICAgaW50IG1pbl9jb3VudCA9IG51bV9vcGNvZGVzLCBtYXhfY291bnQgPSAwOwotICAgIGludCB0b3RhbDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBIQVNIX1NJWkU7ICsraSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGhhc2hfY291bnRbaV0gPCBtaW5fY291bnQpCi0JICBtaW5fY291bnQgPSBoYXNoX2NvdW50W2ldOwotCWlmIChoYXNoX2NvdW50W2ldID4gbWF4X2NvdW50KQotCSAgbWF4X2NvdW50ID0gaGFzaF9jb3VudFtpXTsKLQl0b3RhbCArPSBoYXNoX2NvdW50W2ldOwotICAgICAgfQotCi0gICAgcHJpbnRmICgiT3Bjb2RlIGhhc2ggdGFibGUgc3RhdHM6IG1pbiAlZCwgbWF4ICVkLCBhdmUgJWZcbiIsCi0JICAgIG1pbl9jb3VudCwgbWF4X2NvdW50LCAoZG91YmxlKSB0b3RhbCAvIEhBU0hfU0laRSk7Ci0gIH0KLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zcGFyYy1vcGMuYyBiL29wY29kZXMvc3BhcmMtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDlkMTguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zcGFyYy1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMzAgKzAsMCBAQAotLyogVGFibGUgb2Ygb3Bjb2RlcyBmb3IgdGhlIHNwYXJjLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQkZEIGxpYnJhcnkuCi0KLUJGRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi10aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKLXZlcnNpb24uCi0KLUJGRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKLVdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4JKi8KLQotLyogRklYTUUtc29tZWRheTogcGVyaGFwcyB0aGUgLGEncyBhbmQgc3VjaCBzaG91bGQgYmUgZW1iZWRkZWQgaW4gdGhlCi0gICBpbnN0cnVjdGlvbidzIG5hbWUgcmF0aGVyIHRoYW4gdGhlIGFyZ3MuICBUaGlzIHdvdWxkIG1ha2UgZ2FzIGZhc3RlciwgcGluc24KLSAgIHNsb3dlciwgYnV0IHdvdWxkIG1lc3MgdXAgc29tZSBtYWNyb3MgYSBiaXQuICB4b3hvcmljaC4gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvc3BhcmMuaCIKLQotLyogU29tZSBkZWZpbmVzIHRvIG1ha2UgbGlmZSBlYXN5LiAgKi8KLSNkZWZpbmUgTUFTS19WNgkJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjYpCi0jZGVmaW5lIE1BU0tfVjcJCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y3KQotI2RlZmluZSBNQVNLX1Y4CQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOCkKLSNkZWZpbmUgTUFTS19TUEFSQ0xFVAlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xFVCkKLSNkZWZpbmUgTUFTS19TUEFSQ0xJVEUJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMSVRFKQotI2RlZmluZSBNQVNLX1Y5CQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOSkKLSNkZWZpbmUgTUFTS19WOUEJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKQotCi0vKiBCaXQgbWFza3Mgb2YgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0aW5nIHRoZSBpbnNuLiAgKi8KLQotI2RlZmluZSB2NgkJKE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfU1BBUkNMRVQgXAotCQkJIHwgTUFTS19TUEFSQ0xJVEUgfCBNQVNLX1Y5IHwgTUFTS19WOUEpCi0vKiB2NiBpbnNucyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzcGFyY2xldCAqLwotI2RlZmluZSB2Nm5vdGxldAkoTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IFwKLQkJCSB8IE1BU0tfU1BBUkNMSVRFIHwgTUFTS19WOSB8IE1BU0tfVjlBKQotI2RlZmluZSB2NwkJKE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19TUEFSQ0xFVCBcCi0JCQkgfCBNQVNLX1NQQVJDTElURSB8IE1BU0tfVjkgfCBNQVNLX1Y5QSkKLS8qIEFsdGhvdWdoIG5vdCBhbGwgaW5zbnMgYXJlIGltcGxlbWVudGVkIGluIGhhcmR3YXJlLCBzcGFyY2xpdGUgaXMgZGVmaW5lZAotICAgdG8gYmUgYSBzdXBlcnNldCBvZiB2OC4gIFVuaW1wbGVtZW50ZWQgaW5zbnMgdHJhcCBhbmQgYXJlIHRoZW4gdGhlb3JldGljYWxseQotICAgaW1wbGVtZW50ZWQgaW4gc29mdHdhcmUuCi0gICBJdCdzIG5vdCBjbGVhciB0aGF0IHRoZSBzYW1lIGlzIHRydWUgZm9yIHNwYXJjbGV0LCBhbHRob3VnaCB0aGUgZG9jcwotICAgc3VnZ2VzdCBpdCBpcy4gIFJhdGhlciB0aGFuIGNvbXBsaWNhdGluZyB0aGluZ3MsIHRoZSBzcGFyY2xldCBhc3NlbWJsZXIKLSAgIHJlY29nbml6ZXMgYWxsIHY4IGluc25zLiAgKi8KLSNkZWZpbmUgdjgJCShNQVNLX1Y4IHwgTUFTS19TUEFSQ0xFVCB8IE1BU0tfU1BBUkNMSVRFIHwgTUFTS19WOSB8IE1BU0tfVjlBKQotI2RlZmluZSBzcGFyY2xldAkoTUFTS19TUEFSQ0xFVCkKLSNkZWZpbmUgc3BhcmNsaXRlCShNQVNLX1NQQVJDTElURSkKLSNkZWZpbmUgdjkJCShNQVNLX1Y5IHwgTUFTS19WOUEpCi0jZGVmaW5lIHY5YQkJKE1BU0tfVjlBKQotLyogdjYgaW5zbnMgbm90IHN1cHBvcnRlZCBieSB2OSAqLwotI2RlZmluZSB2Nm5vdHY5CQkoTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IFwKLQkJCSB8IE1BU0tfU1BBUkNMRVQgfCBNQVNLX1NQQVJDTElURSkKLS8qIHY5YSBpbnN0cnVjdGlvbnMgd2hpY2ggd291bGQgYXBwZWFyIHRvIGJlIGFsaWFzZXMgdG8gdjkncyBpbXBkZXAncwotICAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIHY5bm90djlhCShNQVNLX1Y5KQotCi0vKiBUYWJsZSBvZiBvcGNvZGUgYXJjaGl0ZWN0dXJlcy4KLSAgIFRoZSBvcmRlciBpcyBkZWZpbmVkIGluIG9wY29kZS9zcGFyYy5oLiAgKi8KLQotY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZV9hcmNoIHNwYXJjX29wY29kZV9hcmNoc1tdID0gewotICB7ICJ2NiIsIE1BU0tfVjYgfSwKLSAgeyAidjciLCBNQVNLX1Y2IHwgTUFTS19WNyB9LAotICB7ICJ2OCIsIE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCB9LAotICB7ICJzcGFyY2xldCIsIE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfU1BBUkNMRVQgfSwKLSAgeyAic3BhcmNsaXRlIiwgTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19TUEFSQ0xJVEUgfSwKLSAgLyogPz8/IERvbid0IHNvbWUgdjggcHJpdmlsZWRnZWQgaW5zbnMgY29uZmxpY3Qgd2l0aCB2OT8gICovCi0gIHsgInY5IiwgTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19WOSB9LAotICAvKiB2OSB3aXRoIHVsdHJhc3BhcmMgYWRkaXRpb25zICovCi0gIHsgInY5YSIsIE1BU0tfVjYgfCBNQVNLX1Y3IHwgTUFTS19WOCB8IE1BU0tfVjkgfCBNQVNLX1Y5QSB9LAotICB7IE5VTEwsIDAgfQotfTsKLQotLyogR2l2ZW4gTkFNRSwgcmV0dXJuIGl0J3MgYXJjaGl0ZWN0dXJlIGVudHJ5LiAgKi8KLQotZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwKLXNwYXJjX29wY29kZV9sb29rdXBfYXJjaCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZV9hcmNoICpwOwotCi0gIGZvciAocCA9ICZzcGFyY19vcGNvZGVfYXJjaHNbMF07IHAtPm5hbWU7ICsrcCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBwLT5uYW1lKSA9PSAwKQotCXJldHVybiAoZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwpIChwIC0gJnNwYXJjX29wY29kZV9hcmNoc1swXSk7Ci0gICAgfQotCi0gIHJldHVybiBTUEFSQ19PUENPREVfQVJDSF9CQUQ7Ci19Ci0MCi0vKiBCcmFuY2ggY29uZGl0aW9uIGZpZWxkLiAgKi8KLSNkZWZpbmUgQ09ORCh4KQkJKCgoeCkmMHhmKTw8MjUpCi0KLS8qIHY5OiBNb3ZlIChNT1ZjYyBhbmQgRk1PVmNjKSBjb25kaXRpb24gZmllbGQuICAqLwotI2RlZmluZSBNQ09ORCh4LGlfb3JfZikJKCgoKGlfb3JfZikmMSk8PDE4KXwoKCh4KT4+MTEpJigweGY8PDE0KSkpIC8qIHY5ICovCi0KLS8qIHY5OiBNb3ZlIHJlZ2lzdGVyIChNT1ZSY2MgYW5kIEZNT1ZSY2MpIGNvbmRpdGlvbiBmaWVsZC4gICovCi0jZGVmaW5lIFJDT05EKHgpCSgoKHgpJjB4Nyk8PDEwKQkvKiB2OSAqLwotCi0jZGVmaW5lIENPTkRBCShDT05EKDB4OCkpCi0jZGVmaW5lIENPTkRDQwkoQ09ORCgweGQpKQotI2RlZmluZSBDT05EQ1MJKENPTkQoMHg1KSkKLSNkZWZpbmUgQ09OREUJKENPTkQoMHgxKSkKLSNkZWZpbmUgQ09OREcJKENPTkQoMHhhKSkKLSNkZWZpbmUgQ09OREdFCShDT05EKDB4YikpCi0jZGVmaW5lIENPTkRHVQkoQ09ORCgweGMpKQotI2RlZmluZSBDT05ETAkoQ09ORCgweDMpKQotI2RlZmluZSBDT05ETEUJKENPTkQoMHgyKSkKLSNkZWZpbmUgQ09ORExFVQkoQ09ORCgweDQpKQotI2RlZmluZSBDT05ETgkoQ09ORCgweDApKQotI2RlZmluZSBDT05ETkUJKENPTkQoMHg5KSkKLSNkZWZpbmUgQ09ORE5FRwkoQ09ORCgweDYpKQotI2RlZmluZSBDT05EUE9TCShDT05EKDB4ZSkpCi0jZGVmaW5lIENPTkRWQwkoQ09ORCgweGYpKQotI2RlZmluZSBDT05EVlMJKENPTkQoMHg3KSkKLQotI2RlZmluZSBDT05ETloJQ09ORE5FCi0jZGVmaW5lIENPTkRaCUNPTkRFCi0jZGVmaW5lIENPTkRHRVUJQ09ORENDCi0jZGVmaW5lIENPTkRMVQlDT05EQ1MKLQotI2RlZmluZSBGQ09OREEJCShDT05EKDB4OCkpCi0jZGVmaW5lIEZDT05ERQkJKENPTkQoMHg5KSkKLSNkZWZpbmUgRkNPTkRHCQkoQ09ORCgweDYpKQotI2RlZmluZSBGQ09OREdFCQkoQ09ORCgweGIpKQotI2RlZmluZSBGQ09OREwJCShDT05EKDB4NCkpCi0jZGVmaW5lIEZDT05ETEUJCShDT05EKDB4ZCkpCi0jZGVmaW5lIEZDT05ETEcJCShDT05EKDB4MikpCi0jZGVmaW5lIEZDT05ETgkJKENPTkQoMHgwKSkKLSNkZWZpbmUgRkNPTkRORQkJKENPTkQoMHgxKSkKLSNkZWZpbmUgRkNPTkRPCQkoQ09ORCgweGYpKQotI2RlZmluZSBGQ09ORFUJCShDT05EKDB4NykpCi0jZGVmaW5lIEZDT05EVUUJCShDT05EKDB4YSkpCi0jZGVmaW5lIEZDT05EVUcJCShDT05EKDB4NSkpCi0jZGVmaW5lIEZDT05EVUdFCShDT05EKDB4YykpCi0jZGVmaW5lIEZDT05EVUwJCShDT05EKDB4MykpCi0jZGVmaW5lIEZDT05EVUxFCShDT05EKDB4ZSkpCi0KLSNkZWZpbmUgRkNPTkROWglGQ09ORE5FCi0jZGVmaW5lIEZDT05EWglGQ09OREUKLQotI2RlZmluZSBJQ0MgKDApCS8qIHY5ICovCi0jZGVmaW5lIFhDQyAoMTw8MTIpIC8qIHY5ICovCi0jZGVmaW5lIEZDQyh4KQkoKCh4KSYweDMpPDwxMSkgLyogdjkgKi8KLSNkZWZpbmUgRkJGQ0MoeCkJKCgoeCkmMHgzKTw8MjApCS8qIHY5ICovCi0MCi0vKiBUaGUgb3JkZXIgb2YgdGhlIG9wY29kZXMgaW4gdGhlIHRhYmxlIGlzIHNpZ25pZmljYW50OgotCQotCSogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdAotCWJlIGNvbnNlY3V0aXZlLglJZiB0aGV5IGFyZW4ndCwgdGhlIGFzc2VtYmxlciB3aWxsIGJvbWIgYXQgcnVudGltZS4KLQotCSogVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgbm90IGNhcmUgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzLgotCi0qLwotCi0vKiBFbnRyaWVzIGZvciBjb21tdXRhdGl2ZSBhcml0aG1ldGljIG9wZXJhdGlvbnMuICAqLwotLyogPz8/IE1vcmUgZW50cmllcyBjYW4gbWFrZSB1c2Ugb2YgdGhpcy4gICovCi0jZGVmaW5lIENPTU1VVEVPUChvcGNvZGUsIG9wMywgYXJjaF9tYXNrKSBcCi17IG9wY29kZSwJRjMoMiwgb3AzLCAwKSwgRjMofjIsIH5vcDMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCBhcmNoX21hc2sgfSwgXAoteyBvcGNvZGUsCUYzKDIsIG9wMywgMSksIEYzKH4yLCB+b3AzLCB+MSksCQkiMSxpLGQiLCAwLCBhcmNoX21hc2sgfSwgXAoteyBvcGNvZGUsCUYzKDIsIG9wMywgMSksIEYzKH4yLCB+b3AzLCB+MSksCQkiaSwxLGQiLCAwLCBhcmNoX21hc2sgfQotCi1jb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlIHNwYXJjX29wY29kZXNbXSA9IHsKLQoteyAibGQiLAlGMygzLCAweDAwLCAwKSwgRjMofjMsIH4weDAwLCB+MCksCQkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MDAsIDApLCBGMyh+MywgfjB4MDAsIH4wKXxSUzJfRzAsCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGQgW3JzMSswXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MjAsIDApLCBGMyh+MywgfjB4MjAsIH4wKSwJCSJbMSsyXSxnIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMCwgMCksIEYzKH4zLCB+MHgyMCwgfjApfFJTMl9HMCwJIlsxXSxnIiwgMCwgdjYgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgyMCwgMSksIEYzKH4zLCB+MHgyMCwgfjEpLAkJIlsxK2ldLGciLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIwLCAxKSwgRjMofjMsIH4weDIwLCB+MSksCQkiW2krMV0sZyIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjAsIDEpLCBGMyh+MywgfjB4MjAsIH4xKXxSUzFfRzAsCSJbaV0sZyIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjAsIDEpLCBGMyh+MywgfjB4MjAsIH4xKXxTSU1NMTMofjApLAkiWzFdLGciLCAwLCB2NiB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGQiLAlGMygzLCAweDIxLCAwKSwgRjMofjMsIH4weDIxLCB+MCl8UkQofjApLAkiWzErMl0sRiIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjEsIDApLCBGMyh+MywgfjB4MjEsIH4wKXxSUzJfRzB8UkQofjApLCJbMV0sRiIsIDAsIHY2IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MjEsIDEpLCBGMyh+MywgfjB4MjEsIH4xKXxSRCh+MCksCSJbMStpXSxGIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMSwgMSksIEYzKH4zLCB+MHgyMSwgfjEpfFJEKH4wKSwJIltpKzFdLEYiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIxLCAxKSwgRjMofjMsIH4weDIxLCB+MSl8UlMxX0cwfFJEKH4wKSwiW2ldLEYiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIxLCAxKSwgRjMofjMsIH4weDIxLCB+MSl8U0lNTTEzKH4wKXxSRCh+MCksIlsxXSxGIiwgMCwgdjYgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkIiwJRjMoMywgMHgzMCwgMCksIEYzKH4zLCB+MHgzMCwgfjApLAkJIlsxKzJdLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzAsIDApLCBGMyh+MywgfjB4MzAsIH4wKXxSUzJfRzAsCSJbMV0sRCIsIDAsIHY2bm90djkgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpLAkJIlsxK2ldLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKSwJCSJbaSsxXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSl8UlMxX0cwLAkiW2ldLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKXxTSU1NMTMofjApLAkiWzFdLEQiLCAwLCB2Nm5vdHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDMxLCAwKSwgRjMofjMsIH4weDMxLCB+MCksCQkiWzErMl0sQyIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMSwgMCksIEYzKH4zLCB+MHgzMSwgfjApfFJTMl9HMCwJIlsxXSxDIiwgMCwgdjZub3R2OSB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDMxLCAxKSwgRjMofjMsIH4weDMxLCB+MSksCQkiWzEraV0sQyIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMSwgMSksIEYzKH4zLCB+MHgzMSwgfjEpLAkJIltpKzFdLEMiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzEsIDEpLCBGMyh+MywgfjB4MzEsIH4xKXxSUzFfRzAsCSJbaV0sQyIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMSwgMSksIEYzKH4zLCB+MHgzMSwgfjEpfFNJTU0xMyh+MCksCSJbMV0sQyIsIDAsIHY2bm90djkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLS8qIFRoZSB2OSBMRFVXIGlzIHRoZSBzYW1lIGFzIHRoZSBvbGQgJ2xkJyBvcGNvZGUsIGl0IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUKLSAgICdsZCcgcHNldWRvLW9wIGluIHY5LiAgKi8KLXsgImxkdXciLAlGMygzLCAweDAwLCAwKSwgRjMofjMsIH4weDAwLCB+MCksCQkiWzErMl0sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3IiwJRjMoMywgMHgwMCwgMCksIEYzKH4zLCB+MHgwMCwgfjApfFJTMl9HMCwJIlsxXSxkIiwgRl9BTElBUywgdjkgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkdXciLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSksCQkiWzEraV0sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3IiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpLAkJIltpKzFdLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1dyIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3IiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZGQiLAlGMygzLCAweDAzLCAwKSwgRjMofjMsIH4weDAzLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgwMywgMCksIEYzKH4zLCB+MHgwMywgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZGQgW3JzMSslZzBdLGQgKi8KLXsgImxkZCIsCUYzKDMsIDB4MDMsIDEpLCBGMyh+MywgfjB4MDMsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MDMsIDEpLCBGMyh+MywgfjB4MDMsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MDMsIDEpLCBGMyh+MywgfjB4MDMsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDAzLCAxKSwgRjMofjMsIH4weDAzLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRkIFtyczErMF0sZCAqLwoteyAibGRkIiwJRjMoMywgMHgyMywgMCksIEYzKH4zLCB+MHgyMywgfjApfEFTSSh+MCksCSJbMSsyXSxIIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MjMsIDApLCBGMyh+MywgfjB4MjMsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxIIiwgMCwgdjYgfSwgLyogbGRkIFtyczErJWcwXSxkICovCi17ICJsZGQiLAlGMygzLCAweDIzLCAxKSwgRjMofjMsIH4weDIzLCB+MSksCQkiWzEraV0sSCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDIzLCAxKSwgRjMofjMsIH4weDIzLCB+MSksCQkiW2krMV0sSCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDIzLCAxKSwgRjMofjMsIH4weDIzLCB+MSl8UlMxX0cwLAkiW2ldLEgiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgyMywgMSksIEYzKH4zLCB+MHgyMywgfjEpfFNJTU0xMyh+MCksCSJbMV0sSCIsIDAsIHY2IH0sIC8qIGxkZCBbcnMxKzBdLGQgKi8KLQoteyAibGRkIiwJRjMoMywgMHgzMywgMCksIEYzKH4zLCB+MHgzMywgfjApfEFTSSh+MCksCSJbMSsyXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGRkIiwJRjMoMywgMHgzMywgMCksIEYzKH4zLCB+MHgzMywgfjApfEFTSV9SUzIofjApLAkiWzFdLEQiLCAwLCB2Nm5vdHY5IH0sIC8qIGxkZCBbcnMxKyVnMF0sZCAqLwoteyAibGRkIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpLAkJIlsxK2ldLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZGQiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSksCQkiW2krMV0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkZCIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKXxSUzFfRzAsCSJbaV0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkZCIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKXxTSU1NMTMofjApLAkiWzFdLEQiLCAwLCB2Nm5vdHY5IH0sIC8qIGxkZCBbcnMxKzBdLGQgKi8KLQoteyAibGRxIiwJRjMoMywgMHgyMiwgMCksIEYzKH4zLCB+MHgyMiwgfjApfEFTSSh+MCksCSJbMSsyXSxKIiwgMCwgdjkgfSwKLXsgImxkcSIsCUYzKDMsIDB4MjIsIDApLCBGMyh+MywgfjB4MjIsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxKIiwgMCwgdjkgfSwgLyogbGRkIFtyczErJWcwXSxkICovCi17ICJsZHEiLAlGMygzLCAweDIyLCAxKSwgRjMofjMsIH4weDIyLCB+MSksCQkiWzEraV0sSiIsIDAsIHY5IH0sCi17ICJsZHEiLAlGMygzLCAweDIyLCAxKSwgRjMofjMsIH4weDIyLCB+MSksCQkiW2krMV0sSiIsIDAsIHY5IH0sCi17ICJsZHEiLAlGMygzLCAweDIyLCAxKSwgRjMofjMsIH4weDIyLCB+MSl8UlMxX0cwLAkiW2ldLEoiLCAwLCB2OSB9LAoteyAibGRxIiwJRjMoMywgMHgyMiwgMSksIEYzKH4zLCB+MHgyMiwgfjEpfFNJTU0xMyh+MCksCSJbMV0sSiIsIDAsIHY5IH0sIC8qIGxkZCBbcnMxKzBdLGQgKi8KLQoteyAibGRzYiIsCUYzKDMsIDB4MDksIDApLCBGMyh+MywgfjB4MDksIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZHNiIiwJRjMoMywgMHgwOSwgMCksIEYzKH4zLCB+MHgwOSwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHNiIFtyczErJWcwXSxkICovCi17ICJsZHNiIiwJRjMoMywgMHgwOSwgMSksIEYzKH4zLCB+MHgwOSwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGRzYiIsCUYzKDMsIDB4MDksIDEpLCBGMyh+MywgfjB4MDksIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkc2IiLAlGMygzLCAweDA5LCAxKSwgRjMofjMsIH4weDA5LCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGRzYiIsCUYzKDMsIDB4MDksIDEpLCBGMyh+MywgfjB4MDksIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHNiIFtyczErMF0sZCAqLwotCi17ICJsZHNoIiwJRjMoMywgMHgwYSwgMCksIEYzKH4zLCB+MHgwYSwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHNoIFtyczErJWcwXSxkICovCi17ICJsZHNoIiwJRjMoMywgMHgwYSwgMCksIEYzKH4zLCB+MHgwYSwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkc2giLAlGMygzLCAweDBhLCAxKSwgRjMofjMsIH4weDBhLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZHNoIiwJRjMoMywgMHgwYSwgMSksIEYzKH4zLCB+MHgwYSwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGRzaCIsCUYzKDMsIDB4MGEsIDEpLCBGMyh+MywgfjB4MGEsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZHNoIiwJRjMoMywgMHgwYSwgMSksIEYzKH4zLCB+MHgwYSwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc2ggW3JzMSswXSxkICovCi0KLXsgImxkc3R1YiIsCUYzKDMsIDB4MGQsIDApLCBGMyh+MywgfjB4MGQsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZHN0dWIiLAlGMygzLCAweDBkLCAwKSwgRjMofjMsIH4weDBkLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc3R1YiBbcnMxKyVnMF0sZCAqLwoteyAibGRzdHViIiwJRjMoMywgMHgwZCwgMSksIEYzKH4zLCB+MHgwZCwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGRzdHViIiwJRjMoMywgMHgwZCwgMSksIEYzKH4zLCB+MHgwZCwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGRzdHViIiwJRjMoMywgMHgwZCwgMSksIEYzKH4zLCB+MHgwZCwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkc3R1YiIsCUYzKDMsIDB4MGQsIDEpLCBGMyh+MywgfjB4MGQsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHN0dWIgW3JzMSswXSxkICovCi0KLXsgImxkc3ciLAlGMygzLCAweDA4LCAwKSwgRjMofjMsIH4weDA4LCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2OSB9LAoteyAibGRzdyIsCUYzKDMsIDB4MDgsIDApLCBGMyh+MywgfjB4MDgsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjkgfSwgLyogbGRzdyBbcnMxKyVnMF0sZCAqLwoteyAibGRzdyIsCUYzKDMsIDB4MDgsIDEpLCBGMyh+MywgfjB4MDgsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjkgfSwKLXsgImxkc3ciLAlGMygzLCAweDA4LCAxKSwgRjMofjMsIH4weDA4LCB+MSksCQkiW2krMV0sZCIsIDAsIHY5IH0sCi17ICJsZHN3IiwJRjMoMywgMHgwOCwgMSksIEYzKH4zLCB+MHgwOCwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjkgfSwKLXsgImxkc3ciLAlGMygzLCAweDA4LCAxKSwgRjMofjMsIH4weDA4LCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjkgfSwgLyogbGRzdyBbcnMxKzBdLGQgKi8KLQoteyAibGR1YiIsCUYzKDMsIDB4MDEsIDApLCBGMyh+MywgfjB4MDEsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZHViIiwJRjMoMywgMHgwMSwgMCksIEYzKH4zLCB+MHgwMSwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHViIFtyczErJWcwXSxkICovCi17ICJsZHViIiwJRjMoMywgMHgwMSwgMSksIEYzKH4zLCB+MHgwMSwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGR1YiIsCUYzKDMsIDB4MDEsIDEpLCBGMyh+MywgfjB4MDEsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjYgfSwKLXsgImxkdWIiLAlGMygzLCAweDAxLCAxKSwgRjMofjMsIH4weDAxLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGR1YiIsCUYzKDMsIDB4MDEsIDEpLCBGMyh+MywgfjB4MDEsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZHViIFtyczErMF0sZCAqLwotCi17ICJsZHVoIiwJRjMoMywgMHgwMiwgMCksIEYzKH4zLCB+MHgwMiwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkdWgiLAlGMygzLCAweDAyLCAwKSwgRjMofjMsIH4weDAyLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkdWggW3JzMSslZzBdLGQgKi8KLXsgImxkdWgiLAlGMygzLCAweDAyLCAxKSwgRjMofjMsIH4weDAyLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZHVoIiwJRjMoMywgMHgwMiwgMSksIEYzKH4zLCB+MHgwMiwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGR1aCIsCUYzKDMsIDB4MDIsIDEpLCBGMyh+MywgfjB4MDIsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZHVoIiwJRjMoMywgMHgwMiwgMSksIEYzKH4zLCB+MHgwMiwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkdWggW3JzMSswXSxkICovCi0KLXsgImxkeCIsCUYzKDMsIDB4MGIsIDApLCBGMyh+MywgfjB4MGIsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDBiLCAwKSwgRjMofjMsIH4weDBiLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY5IH0sIC8qIGxkeCBbcnMxKyVnMF0sZCAqLwoteyAibGR4IiwJRjMoMywgMHgwYiwgMSksIEYzKH4zLCB+MHgwYiwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgwYiwgMSksIEYzKH4zLCB+MHgwYiwgfjEpLAkJIltpKzFdLGQiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgwYiwgMSksIEYzKH4zLCB+MHgwYiwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MGIsIDEpLCBGMyh+MywgfjB4MGIsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2OSB9LCAvKiBsZHggW3JzMSswXSxkICovCi0KLXsgImxkeCIsCUYzKDMsIDB4MjEsIDApfFJEKDEpLCBGMyh+MywgfjB4MjEsIH4wKXxSRCh+MSksCSJbMSsyXSxGIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MjEsIDApfFJEKDEpLCBGMyh+MywgfjB4MjEsIH4wKXxSUzJfRzB8UkQofjEpLAkiWzFdLEYiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGR4IiwJRjMoMywgMHgyMSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjEpfFJEKH4xKSwJIlsxK2ldLEYiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgyMSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjEpfFJEKH4xKSwJIltpKzFdLEYiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgyMSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjEpfFJTMV9HMHxSRCh+MSksCSJbaV0sRiIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDIxLCAxKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MSl8U0lNTTEzKH4wKXxSRCh+MSksIlsxXSxGIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkYSIsCUYzKDMsIDB4MTAsIDApLCBGMyh+MywgfjB4MTAsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZGEiLAlGMygzLCAweDEwLCAwKSwgRjMofjMsIH4weDEwLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGRhIFtyczErJWcwXSxkICovCi17ICJsZGEiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLXsgImxkYSIsCUYzKDMsIDB4MzAsIDApLCBGMyh+MywgfjB4MzAsIH4wKSwJCSJbMSsyXUEsZyIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDMwLCAwKSwgRjMofjMsIH4weDMwLCB+MCl8UlMyX0cwLAkiWzFdQSxnIiwgMCwgdjkgfSwgLyogbGRhIFtyczErJWcwXSxkICovCi17ICJsZGEiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSksCQkiWzEraV1vLGciLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpLAkJIltpKzFdbyxnIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKXxSUzFfRzAsCSJbaV1vLGciLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGciLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRkYSIsCUYzKDMsIDB4MTMsIDApLCBGMyh+MywgfjB4MTMsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZGRhIiwJRjMoMywgMHgxMywgMCksIEYzKH4zLCB+MHgxMywgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkZGEiLAlGMygzLCAweDEzLCAxKSwgRjMofjMsIH4weDEzLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MTMsIDEpLCBGMyh+MywgfjB4MTMsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgxMywgMSksIEYzKH4zLCB+MHgxMywgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgxMywgMSksIEYzKH4zLCB+MHgxMywgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRkYSIsCUYzKDMsIDB4MzMsIDApLCBGMyh+MywgfjB4MzMsIH4wKSwJCSJbMSsyXUEsSCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgzMywgMCksIEYzKH4zLCB+MHgzMywgfjApfFJTMl9HMCwJIlsxXUEsSCIsIDAsIHY5IH0sIC8qIGxkZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkZGEiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSksCQkiWzEraV1vLEgiLCAwLCB2OSB9LAoteyAibGRkYSIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKSwJCSJbaSsxXW8sSCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpfFJTMV9HMCwJIltpXW8sSCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpfFNJTU0xMyh+MCksCSJbMV1vLEgiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRxYSIsCUYzKDMsIDB4MzIsIDApLCBGMyh+MywgfjB4MzIsIH4wKSwJCSJbMSsyXUEsSiIsIDAsIHY5IH0sCi17ICJsZHFhIiwJRjMoMywgMHgzMiwgMCksIEYzKH4zLCB+MHgzMiwgfjApfFJTMl9HMCwJIlsxXUEsSiIsIDAsIHY5IH0sIC8qIGxkZCBbcnMxKyVnMF0sZCAqLwoteyAibGRxYSIsCUYzKDMsIDB4MzIsIDEpLCBGMyh+MywgfjB4MzIsIH4xKSwJCSJbMStpXW8sSiIsIDAsIHY5IH0sCi17ICJsZHFhIiwJRjMoMywgMHgzMiwgMSksIEYzKH4zLCB+MHgzMiwgfjEpLAkJIltpKzFdbyxKIiwgMCwgdjkgfSwKLXsgImxkcWEiLAlGMygzLCAweDMyLCAxKSwgRjMofjMsIH4weDMyLCB+MSl8UlMxX0cwLAkiW2ldbyxKIiwgMCwgdjkgfSwKLXsgImxkcWEiLAlGMygzLCAweDMyLCAxKSwgRjMofjMsIH4weDMyLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sSiIsIDAsIHY5IH0sIC8qIGxkZCBbcnMxKzBdLGQgKi8KLQoteyAibGRzYmEiLAlGMygzLCAweDE5LCAwKSwgRjMofjMsIH4weDE5LCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGRzYmEiLAlGMygzLCAweDE5LCAwKSwgRjMofjMsIH4weDE5LCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGRzYmEgW3JzMSslZzBdLGQgKi8KLXsgImxkc2JhIiwJRjMoMywgMHgxOSwgMSksIEYzKH4zLCB+MHgxOSwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc2JhIiwJRjMoMywgMHgxOSwgMSksIEYzKH4zLCB+MHgxOSwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkc2JhIiwJRjMoMywgMHgxOSwgMSksIEYzKH4zLCB+MHgxOSwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHNiYSIsCUYzKDMsIDB4MTksIDEpLCBGMyh+MywgfjB4MTksIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkc2hhIiwJRjMoMywgMHgxYSwgMCksIEYzKH4zLCB+MHgxYSwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkc2hhIiwJRjMoMywgMHgxYSwgMCksIEYzKH4zLCB+MHgxYSwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkc2hhIFtyczErJWcwXSxkICovCi17ICJsZHNoYSIsCUYzKDMsIDB4MWEsIDEpLCBGMyh+MywgfjB4MWEsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHNoYSIsCUYzKDMsIDB4MWEsIDEpLCBGMyh+MywgfjB4MWEsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHNoYSIsCUYzKDMsIDB4MWEsIDEpLCBGMyh+MywgfjB4MWEsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGRzaGEiLAlGMygzLCAweDFhLCAxKSwgRjMofjMsIH4weDFhLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHN0dWJhIiwJRjMoMywgMHgxZCwgMCksIEYzKH4zLCB+MHgxZCwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkc3R1YmEiLAlGMygzLCAweDFkLCAwKSwgRjMofjMsIH4weDFkLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGRzdHViYSBbcnMxKyVnMF0sZCAqLwoteyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDEpLCBGMyh+MywgfjB4MWQsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHN0dWJhIiwJRjMoMywgMHgxZCwgMSksIEYzKH4zLCB+MHgxZCwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkc3R1YmEiLAlGMygzLCAweDFkLCAxKSwgRjMofjMsIH4weDFkLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc3R1YmEiLAlGMygzLCAweDFkLCAxKSwgRjMofjMsIH4weDFkLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHN3YSIsCUYzKDMsIDB4MTgsIDApLCBGMyh+MywgfjB4MTgsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY5IH0sCi17ICJsZHN3YSIsCUYzKDMsIDB4MTgsIDApLCBGMyh+MywgfjB4MTgsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2OSB9LCAvKiBsZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkc3dhIiwJRjMoMywgMHgxOCwgMSksIEYzKH4zLCB+MHgxOCwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc3dhIiwJRjMoMywgMHgxOCwgMSksIEYzKH4zLCB+MHgxOCwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkc3dhIiwJRjMoMywgMHgxOCwgMSksIEYzKH4zLCB+MHgxOCwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHN3YSIsCUYzKDMsIDB4MTgsIDEpLCBGMyh+MywgfjB4MTgsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkdWJhIiwJRjMoMywgMHgxMSwgMCksIEYzKH4zLCB+MHgxMSwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkdWJhIiwJRjMoMywgMHgxMSwgMCksIEYzKH4zLCB+MHgxMSwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkdWJhIFtyczErJWcwXSxkICovCi17ICJsZHViYSIsCUYzKDMsIDB4MTEsIDEpLCBGMyh+MywgfjB4MTEsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHViYSIsCUYzKDMsIDB4MTEsIDEpLCBGMyh+MywgfjB4MTEsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHViYSIsCUYzKDMsIDB4MTEsIDEpLCBGMyh+MywgfjB4MTEsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGR1YmEiLAlGMygzLCAweDExLCAxKSwgRjMofjMsIH4weDExLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDApLCBGMyh+MywgfjB4MTIsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDApLCBGMyh+MywgfjB4MTIsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZHVoYSBbcnMxKyVnMF0sZCAqLwoteyAibGR1aGEiLAlGMygzLCAweDEyLCAxKSwgRjMofjMsIH4weDEyLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGR1aGEiLAlGMygzLCAweDEyLCAxKSwgRjMofjMsIH4weDEyLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGR1aGEiLAlGMygzLCAweDEyLCAxKSwgRjMofjMsIH4weDEyLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkdWhhIiwJRjMoMywgMHgxMiwgMSksIEYzKH4zLCB+MHgxMiwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGR1d2EiLAlGMygzLCAweDEwLCAwKSwgRjMofjMsIH4weDEwLCB+MCksCQkiWzErMl1BLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBsZHV3YSA9PT0gbGRhICovCi17ICJsZHV3YSIsCUYzKDMsIDB4MTAsIDApLCBGMyh+MywgfjB4MTAsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBsZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkdXdhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpLAkJIlsxK2ldbyxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXdhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpLAkJIltpKzFdbyxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXdhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3YSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgRl9BTElBUywgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkeGEiLAlGMygzLCAweDFiLCAwKSwgRjMofjMsIH4weDFiLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2OSB9LAoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDApLCBGMyh+MywgfjB4MWIsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2OSB9LCAvKiBsZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkeGEiLAlGMygzLCAweDFiLCAxKSwgRjMofjMsIH4weDFiLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDEpLCBGMyh+MywgfjB4MWIsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMSksIEYzKH4zLCB+MHgxYiwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMSksIEYzKH4zLCB+MHgxYiwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAic3QiLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJKH4wKSwJCSJkLFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSV9SUzIofjApLAkJImQsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJCSJkLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJCSJkLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJTMV9HMCwJCSJkLFtpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxTSU1NMTMofjApLAkJImQsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKzBdICovCi17ICJzdCIsCUYzKDMsIDB4MjQsIDApLCBGMyh+MywgfjB4MjQsIH4wKXxBU0kofjApLAkJImcsWzErMl0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI0LCAwKSwgRjMofjMsIH4weDI0LCB+MCl8QVNJX1JTMih+MCksCQkiZyxbMV0iLCAwLCB2NiB9LCAvKiBzdCBkW3JzMSslZzBdICovCi17ICJzdCIsCUYzKDMsIDB4MjQsIDEpLCBGMyh+MywgfjB4MjQsIH4xKSwJCQkiZyxbMStpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjQsIDEpLCBGMyh+MywgfjB4MjQsIH4xKSwJCQkiZyxbaSsxXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjQsIDEpLCBGMyh+MywgfjB4MjQsIH4xKXxSUzFfRzAsCQkiZyxbaV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI0LCAxKSwgRjMofjMsIH4weDI0LCB+MSl8U0lNTTEzKH4wKSwJCSJnLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdCIsCUYzKDMsIDB4MzQsIDApLCBGMyh+MywgfjB4MzQsIH4wKXxBU0kofjApLAkJIkQsWzErMl0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzQsIDApLCBGMyh+MywgfjB4MzQsIH4wKXxBU0lfUlMyKH4wKSwJCSJELFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0IiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpLAkJCSJELFsxK2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSksCQkJIkQsW2krMV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKXxSUzFfRzAsCQkiRCxbaV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKXxTSU1NMTMofjApLAkJIkQsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLXsgInN0IiwJRjMoMywgMHgzNSwgMCksIEYzKH4zLCB+MHgzNSwgfjApfEFTSSh+MCksCQkiQyxbMSsyXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNSwgMCksIEYzKH4zLCB+MHgzNSwgfjApfEFTSV9SUzIofjApLAkJIkMsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3QiLAlGMygzLCAweDM1LCAxKSwgRjMofjMsIH4weDM1LCB+MSksCQkJIkMsWzEraV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzUsIDEpLCBGMyh+MywgfjB4MzUsIH4xKSwJCQkiQyxbaSsxXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNSwgMSksIEYzKH4zLCB+MHgzNSwgfjEpfFJTMV9HMCwJCSJDLFtpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNSwgMSksIEYzKH4zLCB+MHgzNSwgfjEpfFNJTU0xMyh+MCksCQkiQyxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdCIsCUYzKDMsIDB4MjUsIDApLCBGMyh+MywgfjB4MjUsIH4wKXxSRF9HMHxBU0kofjApLAkiRixbMSsyXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjUsIDApLCBGMyh+MywgfjB4MjUsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIkYsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0IiwJRjMoMywgMHgyNSwgMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEX0cwLAkJIkYsWzEraV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI1LCAxKSwgRjMofjMsIH4weDI1LCB+MSl8UkRfRzAsCQkiRixbaSsxXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjUsIDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRF9HMHxSUzFfRzAsCQkiRixbaV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDI1LCAxKSwgRjMofjMsIH4weDI1LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIkYsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0dyIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdHciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwoteyAic3RzdyIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3RzdyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3ciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3ciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi17ICJzdHV3IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdHV3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3BpbGwiLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGwiLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzcGlsbCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGwiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGwiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKSwJCSJkLFsxKzJdQSIsIDAsIHY2IH0sCi17ICJzdGEiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIDAsIHY2IH0sIC8qIHN0YSBkLFtyczErJWcwXSAqLwoteyAic3RhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgMCwgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0YSIsCUYzKDMsIDB4MzQsIDApLCBGMyh+MywgfjB4MzQsIH4wKSwJCSJnLFsxKzJdQSIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDM0LCAwKSwgRjMofjMsIH4weDM0LCB+MCl8UlMyKH4wKSwJImcsWzFdQSIsIDAsIHY5IH0sIC8qIHN0YSBkLFtyczErJWcwXSAqLwoteyAic3RhIiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpLAkJImcsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKSwJCSJnLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdGEiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSl8UlMxX0cwLAkiZyxbaV1vIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKXxTSU1NMTMofjApLAkiZyxbMV1vIiwgMCwgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0d2EiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjkgfSwgLyogc3RhIGQsW3JzMSslZzBdICovCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi17ICJzdHN3YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjkgfSwgLyogc3RhIGQsW3JzMSslZzBdICovCi17ICJzdHN3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3Rzd2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwoteyAic3R1d2EiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1d2EiLAlGMygzLCAweDE0LCAwKSwgRjMofjMsIH4weDE0LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0YSBkLFtyczErJWcwXSAqLwoteyAic3R1d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dXdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3RiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0YiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RiIGQsW3JzMSslZzBdICovCi17ICJzdGIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbMStpXSIsIDAsIHY2IH0sCi17ICJzdGIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbaSsxXSIsIDAsIHY2IH0sCi17ICJzdGIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCAwLCB2NiB9LAoteyAic3RiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0YiBkLFtyczErMF0gKi8KLQoteyAic3RzYiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGIgZCxbcnMxKyVnMF0gKi8KLXsgInN0c2IiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiBkLFtyczErMF0gKi8KLXsgInN0dWIiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1YiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RiIGQsW3JzMSslZzBdICovCi17ICJzdHViIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGIgZCxbcnMxKzBdICovCi0KLXsgInN0YmEiLAlGMygzLCAweDE1LCAwKSwgRjMofjMsIH4weDE1LCB+MCksCQkiZCxbMSsyXUEiLCAwLCB2NiB9LAoteyAic3RiYSIsCUYzKDMsIDB4MTUsIDApLCBGMyh+MywgfjB4MTUsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgMCwgdjYgfSwgLyogc3RiYSBkLFtyczErJWcwXSAqLwoteyAic3RiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKSwJCSJkLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpLAkJImQsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgMCwgdjkgfSwKLXsgInN0YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIDAsIHY5IH0sIC8qIHN0YiBkLFtyczErMF0gKi8KLQoteyAic3RzYmEiLAlGMygzLCAweDE1LCAwKSwgRjMofjMsIH4weDE1LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzYmEiLAlGMygzLCAweDE1LCAwKSwgRjMofjMsIH4weDE1LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YmEgZCxbcnMxKyVnMF0gKi8KLXsgInN0c2JhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c2JhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c2JhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHNiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3RiIGQsW3JzMSswXSAqLwoteyAic3R1YmEiLAlGMygzLCAweDE1LCAwKSwgRjMofjMsIH4weDE1LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1YmEiLAlGMygzLCAweDE1LCAwKSwgRjMofjMsIH4weDE1LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YmEgZCxbcnMxKyVnMF0gKi8KLXsgInN0dWJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dWJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dWJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHViYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3RiIGQsW3JzMSswXSAqLwotCi17ICJzdGQiLAlGMygzLCAweDA3LCAwKSwgRjMofjMsIH4weDA3LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgwNywgMCksIEYzKH4zLCB+MHgwNywgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKSwJCSJkLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKSwJCSJkLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RkIGQsW3JzMSswXSAqLwotCi17ICJzdGQiLAlGMygzLCAweDI2LCAwKSwgRjMofjMsIH4weDI2LCB+MCl8QVNJKH4wKSwJInEsWzErMl0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDI2LCAwKSwgRjMofjMsIH4weDI2LCB+MCl8QVNJX1JTMih+MCksCSJxLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCi17ICJzdGQiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSksCQkicSxbMStpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKSwJCSJxLFtpKzFdIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpfFJTMV9HMCwJInEsW2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpfFNJTU0xMyh+MCksCSJxLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSswXSAqLwoteyAic3RkIiwJRjMoMywgMHgyNywgMCksIEYzKH4zLCB+MHgyNywgfjApfEFTSSh+MCksCSJILFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjcsIDApLCBGMyh+MywgfjB4MjcsIH4wKXxBU0lfUlMyKH4wKSwJIkgsWzFdIiwgMCwgdjYgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCi17ICJzdGQiLAlGMygzLCAweDI3LCAxKSwgRjMofjMsIH4weDI3LCB+MSksCQkiSCxbMStpXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDI3LCAxKSwgRjMofjMsIH4weDI3LCB+MSksCQkiSCxbaSsxXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDI3LCAxKSwgRjMofjMsIH4weDI3LCB+MSl8UlMxX0cwLAkiSCxbaV0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgyNywgMSksIEYzKH4zLCB+MHgyNywgfjEpfFNJTU0xMyh+MCksCSJILFsxXSIsIDAsIHY2IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLQoteyAic3RkIiwJRjMoMywgMHgzNiwgMCksIEYzKH4zLCB+MHgzNiwgfjApfEFTSSh+MCksCSJRLFsxKzJdIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNiwgMCksIEYzKH4zLCB+MHgzNiwgfjApfEFTSV9SUzIofjApLAkiUSxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErJWcwXSAqLwoteyAic3RkIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpLAkJIlEsWzEraV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSksCQkiUSxbaSsxXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKXxSUzFfRzAsCSJRLFtpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKXxTSU1NMTMofjApLAkiUSxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MzcsIDApLCBGMyh+MywgfjB4MzcsIH4wKXxBU0kofjApLAkiRCxbMSsyXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzcsIDApLCBGMyh+MywgfjB4MzcsIH4wKXxBU0lfUlMyKH4wKSwJIkQsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKSwJCSJELFsxK2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpLAkJIkQsW2krMV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSl8UlMxX0cwLAkiRCxbaV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSl8U0lNTTEzKH4wKSwJIkQsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi0KLXsgInNwaWxsZCIsCUYzKDMsIDB4MDcsIDApLCBGMyh+MywgfjB4MDcsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbGQiLAlGMygzLCAweDA3LCAwKSwgRjMofjMsIH4weDA3LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0ZCBkLFtyczErJWcwXSAqLwoteyAic3BpbGxkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGxkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGxkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi0KLXsgInN0ZGEiLAlGMygzLCAweDE3LCAwKSwgRjMofjMsIH4weDE3LCB+MCksCQkiZCxbMSsyXUEiLCAwLCB2NiB9LAoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDApLCBGMyh+MywgfjB4MTcsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgMCwgdjYgfSwgLyogc3RkYSBkLFtyczErJWcwXSAqLwoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDEpLCBGMyh+MywgfjB4MTcsIH4xKSwJCSJkLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMSksIEYzKH4zLCB+MHgxNywgfjEpLAkJImQsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDE3LCAxKSwgRjMofjMsIH4weDE3LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDE3LCAxKSwgRjMofjMsIH4weDE3LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIDAsIHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLXsgInN0ZGEiLAlGMygzLCAweDM3LCAwKSwgRjMofjMsIH4weDM3LCB+MCksCQkiSCxbMSsyXUEiLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDApLCBGMyh+MywgfjB4MzcsIH4wKXxSUzIofjApLAkiSCxbMV1BIiwgMCwgdjkgfSwgLyogc3RkYSBkLFtyczErJWcwXSAqLwoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKSwJCSJILFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpLAkJIkgsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSl8UlMxX0cwLAkiSCxbaV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSl8U0lNTTEzKH4wKSwJIkgsWzFdbyIsIDAsIHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLQoteyAic3RoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0aCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RoIGQsW3JzMSslZzBdICovCi17ICJzdGgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbMStpXSIsIDAsIHY2IH0sCi17ICJzdGgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbaSsxXSIsIDAsIHY2IH0sCi17ICJzdGgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCAwLCB2NiB9LAoteyAic3RoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KLQoteyAic3RzaCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGggZCxbcnMxKyVnMF0gKi8KLXsgInN0c2giLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3RzaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KLXsgInN0dWgiLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1aCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoIGQsW3JzMSslZzBdICovCi17ICJzdHVoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGggZCxbcnMxKzBdICovCi0KLXsgInN0aGEiLAlGMygzLCAweDE2LCAwKSwgRjMofjMsIH4weDE2LCB+MCksCQkiZCxbMSsyXUEiLCAwLCB2NiB9LAoteyAic3RoYSIsCUYzKDMsIDB4MTYsIDApLCBGMyh+MywgfjB4MTYsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgMCwgdjYgfSwgLyogc3RoYSAsW3JzMSslZzBdICovCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpLAkJImQsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSksCQkiZCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCAwLCB2OSB9LAoteyAic3RoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgMCwgdjkgfSwgLyogc3RoIGQsW3JzMSswXSAqLwotCi17ICJzdHNoYSIsCUYzKDMsIDB4MTYsIDApLCBGMyh+MywgfjB4MTYsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNoYSIsCUYzKDMsIDB4MTYsIDApLCBGMyh+MywgfjB4MTYsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjYgfSwgLyogc3RoYSAsW3JzMSslZzBdICovCi17ICJzdHNoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHNoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHNoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzaGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KLXsgInN0dWhhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjYgfSwKLXsgInN0dWhhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGhhICxbcnMxKyVnMF0gKi8KLXsgInN0dWhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dWhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dWhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHVoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3RoIGQsW3JzMSswXSAqLwotCi17ICJzdHgiLAlGMygzLCAweDBlLCAwKSwgRjMofjMsIH4weDBlLCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgwZSwgMCksIEYzKH4zLCB+MHgwZSwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCAwLCB2OSB9LCAvKiBzdHggZCxbcnMxKyVnMF0gKi8KLXsgInN0eCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKSwJCSJkLFsxK2ldIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKSwJCSJkLFtpKzFdIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgMCwgdjkgfSwgLyogc3R4IGQsW3JzMSswXSAqLwotCi17ICJzdHgiLAlGMygzLCAweDI1LCAwKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MCl8QVNJKH4wKXxSRCh+MSksCSJGLFsxKzJdIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MjUsIDApfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4wKXxBU0lfUlMyKH4wKXxSRCh+MSksIkYsWzFdIiwgMCwgdjkgfSwgLyogc3R4IGQsW3JzMSslZzBdICovCi17ICJzdHgiLAlGMygzLCAweDI1LCAxKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MSl8UkQofjEpLAkJIkYsWzEraV0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgyNSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEKH4xKSwJCSJGLFtpKzFdIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MjUsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSUzFfRzB8UkQofjEpLAkiRixbaV0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgyNSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjEpfFNJTU0xMyh+MCl8UkQofjEpLCJGLFsxXSIsIDAsIHY5IH0sIC8qIHN0eCBkLFtyczErMF0gKi8KLQoteyAic3R4YSIsCUYzKDMsIDB4MWUsIDApLCBGMyh+MywgfjB4MWUsIH4wKSwJCSJkLFsxKzJdQSIsIDAsIHY5IH0sCi17ICJzdHhhIiwJRjMoMywgMHgxZSwgMCksIEYzKH4zLCB+MHgxZSwgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2OSB9LCAvKiBzdHhhIGQsW3JzMSslZzBdICovCi17ICJzdHhhIiwJRjMoMywgMHgxZSwgMSksIEYzKH4zLCB+MHgxZSwgfjEpLAkJImQsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0eGEiLAlGMygzLCAweDFlLCAxKSwgRjMofjMsIH4weDFlLCB+MSksCQkiZCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3R4YSIsCUYzKDMsIDB4MWUsIDEpLCBGMyh+MywgfjB4MWUsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCAwLCB2OSB9LAoteyAic3R4YSIsCUYzKDMsIDB4MWUsIDEpLCBGMyh+MywgfjB4MWUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgMCwgdjkgfSwgLyogc3R4IGQsW3JzMSswXSAqLwotCi17ICJzdHEiLAlGMygzLCAweDI2LCAwKSwgRjMofjMsIH4weDI2LCB+MCl8QVNJKH4wKSwJIkosWzErMl0iLCAwLCB2OSB9LAoteyAic3RxIiwJRjMoMywgMHgyNiwgMCksIEYzKH4zLCB+MHgyNiwgfjApfEFTSV9SUzIofjApLAkiSixbMV0iLCAwLCB2OSB9LCAvKiBzdHEgW3JzMSslZzBdICovCi17ICJzdHEiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSksCQkiSixbMStpXSIsIDAsIHY5IH0sCi17ICJzdHEiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSksCQkiSixbaSsxXSIsIDAsIHY5IH0sCi17ICJzdHEiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSl8UlMxX0cwLAkiSixbaV0iLCAwLCB2OSB9LAoteyAic3RxIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpfFNJTU0xMyh+MCksCSJKLFsxXSIsIDAsIHY5IH0sIC8qIHN0cSBbcnMxKzBdICovCi0KLXsgInN0cWEiLAlGMygzLCAweDM2LCAwKSwgRjMofjMsIH4weDM2LCB+MCl8QVNJKH4wKSwJIkosWzErMl1BIiwgMCwgdjkgfSwKLXsgInN0cWEiLAlGMygzLCAweDM2LCAwKSwgRjMofjMsIH4weDM2LCB+MCl8QVNJX1JTMih+MCksCSJKLFsxXUEiLCAwLCB2OSB9LCAvKiBzdHFhIFtyczErJWcwXSAqLwoteyAic3RxYSIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKSwJCSJKLFsxK2ldbyIsIDAsIHY5IH0sCi17ICJzdHFhIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpLAkJIkosW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0cWEiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSl8UlMxX0cwLAkiSixbaV1vIiwgMCwgdjkgfSwKLXsgInN0cWEiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSl8U0lNTTEzKH4wKSwJIkosWzFdbyIsIDAsIHY5IH0sIC8qIHN0cWEgW3JzMSswXSAqLwotCi17ICJzd2FwIiwJRjMoMywgMHgwZiwgMCksIEYzKH4zLCB+MHgwZiwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjcgfSwKLXsgInN3YXAiLAlGMygzLCAweDBmLCAwKSwgRjMofjMsIH4weDBmLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY3IH0sIC8qIHN3YXAgW3JzMSslZzBdLGQgKi8KLXsgInN3YXAiLAlGMygzLCAweDBmLCAxKSwgRjMofjMsIH4weDBmLCB+MSksCQkiWzEraV0sZCIsIDAsIHY3IH0sCi17ICJzd2FwIiwJRjMoMywgMHgwZiwgMSksIEYzKH4zLCB+MHgwZiwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NyB9LAoteyAic3dhcCIsCUYzKDMsIDB4MGYsIDEpLCBGMyh+MywgfjB4MGYsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY3IH0sCi17ICJzd2FwIiwJRjMoMywgMHgwZiwgMSksIEYzKH4zLCB+MHgwZiwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY3IH0sIC8qIHN3YXAgW3JzMSswXSxkICovCi0KLXsgInN3YXBhIiwJRjMoMywgMHgxZiwgMCksIEYzKH4zLCB+MHgxZiwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjcgfSwKLXsgInN3YXBhIiwJRjMoMywgMHgxZiwgMCksIEYzKH4zLCB+MHgxZiwgfjApfFJTMih+MCksCSJbMV1BLGQiLCAwLCB2NyB9LCAvKiBzd2FwYSBbcnMxKyVnMF0sZCAqLwoteyAic3dhcGEiLAlGMygzLCAweDFmLCAxKSwgRjMofjMsIH4weDFmLCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAic3dhcGEiLAlGMygzLCAweDFmLCAxKSwgRjMofjMsIH4weDFmLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAic3dhcGEiLAlGMygzLCAweDFmLCAxKSwgRjMofjMsIH4weDFmLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgInN3YXBhIiwJRjMoMywgMHgxZiwgMSksIEYzKH4zLCB+MHgxZiwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBzd2FwIFtyczErMF0sZCAqLwotCi17ICJyZXN0b3JlIiwJRjMoMiwgMHgzZCwgMCksIEYzKH4yLCB+MHgzZCwgfjApfEFTSSh+MCksCQkJIjEsMixkIiwgMCwgdjYgfSwKLXsgInJlc3RvcmUiLAlGMygyLCAweDNkLCAwKSwgRjMofjIsIH4weDNkLCB+MCl8UkRfRzB8UlMxX0cwfEFTSV9SUzIofjApLAkiIiwgMCwgdjYgfSwgLyogcmVzdG9yZSAlZzAsJWcwLCVnMCAqLwoteyAicmVzdG9yZSIsCUYzKDIsIDB4M2QsIDEpLCBGMyh+MiwgfjB4M2QsIH4xKSwJCQkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInJlc3RvcmUiLAlGMygyLCAweDNkLCAxKSwgRjMofjIsIH4weDNkLCB+MSl8UkRfRzB8UlMxX0cwfFNJTU0xMyh+MCksCSIiLCAwLCB2NiB9LCAvKiByZXN0b3JlICVnMCwwLCVnMCAqLwotCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMCksIEYzKH4yLCB+MHgzOSwgfjApfFJEX0cwfEFTSSh+MCksCSIxKzIiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiByZXR0IHJzMStyczIgKi8KLXsgInJldHQiLAlGMygyLCAweDM5LCAwKSwgRjMofjIsIH4weDM5LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwJLyogcmV0dCByczEsJWcwICovCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFJEX0cwLAkJIjEraSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIHJldHQgcnMxK1ggKi8KLXsgInJldHQiLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8UkRfRzAsCQkiaSsxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogcmV0dCBYK3JzMSAqLwoteyAicmV0dCIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSRF9HMHxSUzFfRzAsCQkiaSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIHJldHQgWCtyczEgKi8KLXsgInJldHQiLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8UkRfRzB8UlMxX0cwLAkJImkiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LAkvKiByZXR0IFggKi8KLXsgInJldHQiLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LAkvKiByZXR0IHJzMSswICovCi0KLXsgInNhdmUiLAlGMygyLCAweDNjLCAwKSwgRjMofjIsIH4weDNjLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInNhdmUiLAlGMygyLCAweDNjLCAxKSwgRjMofjIsIH4weDNjLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAic2F2ZSIsCTB4ODFlMDAwMDAsCX4weDgxZTAwMDAwLAkJCSIiLCBGX0FMSUFTLCB2NiB9LAotCi17ICJyZXQiLCAgRjMoMiwgMHgzOCwgMSl8UlMxKDB4MWYpfFNJTU0xMyg4KSwgRjMofjIsIH4weDM4LCB+MSl8U0lNTTEzKH44KSwJICAgICAgICIiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsICVpNys4LCVnMCAqLwoteyAicmV0bCIsIEYzKDIsIDB4MzgsIDEpfFJTMSgweDBmKXxTSU1NMTMoOCksIEYzKH4yLCB+MHgzOCwgfjEpfFJTMSh+MHgwZil8U0lNTTEzKH44KSwgIiIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgJW83KzgsJWcwICovCi0KLXsgImptcGwiLAlGMygyLCAweDM4LCAwKSwgRjMofjIsIH4weDM4LCB+MCl8QVNJKH4wKSwJIjErMixkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiam1wbCIsCUYzKDIsIDB4MzgsIDApLCBGMyh+MiwgfjB4MzgsIH4wKXxBU0lfUlMyKH4wKSwJIjEsZCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErJWcwLGQgKi8KLXsgImptcGwiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8U0lNTTEzKH4wKSwJIjEsZCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErMCxkICovCi17ICJqbXBsIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpfFJTMV9HMCwJImksZCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCAlZzAraSxkICovCi17ICJqbXBsIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpLAkJIjEraSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiam1wbCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKSwJCSJpKzEsZCIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLQoteyAiZG9uZSIsCUYzKDIsIDB4M2UsIDApfFJEKDApLCBGMyh+MiwgfjB4M2UsIH4wKXxSRCh+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSIiLCAwLCB2OSB9LAoteyAicmV0cnkiLAlGMygyLCAweDNlLCAwKXxSRCgxKSwgRjMofjIsIH4weDNlLCB+MCl8UkQofjEpfFJTMV9HMHxTSU1NMTMofjApLAkiIiwgMCwgdjkgfSwKLXsgInNhdmVkIiwJRjMoMiwgMHgzMSwgMCl8UkQoMCksIEYzKH4yLCB+MHgzMSwgfjApfFJEKH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJIiIsIDAsIHY5IH0sCi17ICJyZXN0b3JlZCIsCUYzKDIsIDB4MzEsIDApfFJEKDEpLCBGMyh+MiwgfjB4MzEsIH4wKXxSRCh+MSl8UlMxX0cwfFNJTU0xMyh+MCksCSIiLCAwLCB2OSB9LAoteyAic2lyIiwJRjMoMiwgMHgzMCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDMwLCB+MSl8UkQofjB4Zil8UlMxX0cwLAkJImkiLCAwLCB2OSB9LAotCi17ICJmbHVzaCIsCUYzKDIsIDB4M2IsIDApLCBGMyh+MiwgfjB4M2IsIH4wKXxBU0kofjApLAkiMSsyIiwgMCwgdjggfSwKLXsgImZsdXNoIiwJRjMoMiwgMHgzYiwgMCksIEYzKH4yLCB+MHgzYiwgfjApfEFTSV9SUzIofjApLAkiMSIsIDAsIHY4IH0sIC8qIGZsdXNoIHJzMSslZzAgKi8KLXsgImZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpfFNJTU0xMyh+MCksCSIxIiwgMCwgdjggfSwgLyogZmx1c2ggcnMxKzAgKi8KLXsgImZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpfFJTMV9HMCwJImkiLCAwLCB2OCB9LCAvKiBmbHVzaCAlZzAraSAqLwoteyAiZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSksCQkiMStpIiwgMCwgdjggfSwKLXsgImZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpLAkJImkrMSIsIDAsIHY4IH0sCi0KLS8qIElGTFVTSCB3YXMgcmVuYW1lZCB0byBGTFVTSCBpbiB2OC4gICovCi17ICJpZmx1c2giLAlGMygyLCAweDNiLCAwKSwgRjMofjIsIH4weDNiLCB+MCl8QVNJKH4wKSwJIjErMiIsIEZfQUxJQVMsIHY2IH0sCi17ICJpZmx1c2giLAlGMygyLCAweDNiLCAwKSwgRjMofjIsIH4weDNiLCB+MCl8QVNJX1JTMih+MCksCSIxIiwgRl9BTElBUywgdjYgfSwgLyogZmx1c2ggcnMxKyVnMCAqLwoteyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpfFNJTU0xMyh+MCksCSIxIiwgRl9BTElBUywgdjYgfSwgLyogZmx1c2ggcnMxKzAgKi8KLXsgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKXxSUzFfRzAsCSJpIiwgRl9BTElBUywgdjYgfSwKLXsgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKSwJCSIxK2kiLCBGX0FMSUFTLCB2NiB9LAoteyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpLAkJImkrMSIsIEZfQUxJQVMsIHY2IH0sCi0KLXsgInJldHVybiIsCUYzKDIsIDB4MzksIDApLCBGMyh+MiwgfjB4MzksIH4wKXxBU0kofjApLAkiMSsyIiwgMCwgdjkgfSwKLXsgInJldHVybiIsCUYzKDIsIDB4MzksIDApLCBGMyh+MiwgfjB4MzksIH4wKXxBU0lfUlMyKH4wKSwJIjEiLCAwLCB2OSB9LCAvKiByZXR1cm4gcnMxKyVnMCAqLwoteyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFNJTU0xMyh+MCksCSIxIiwgMCwgdjkgfSwgLyogcmV0dXJuIHJzMSswICovCi17ICJyZXR1cm4iLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8UlMxX0cwLAkiaSIsIDAsIHY5IH0sIC8qIHJldHVybiAlZzAraSAqLwoteyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpLAkJIjEraSIsIDAsIHY5IH0sCi17ICJyZXR1cm4iLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSksCQkiaSsxIiwgMCwgdjkgfSwKLQoteyAiZmx1c2h3IiwJRjMoMiwgMHgyYiwgMCksIEYzKH4yLCB+MHgyYiwgfjApfFJEX0cwfFJTMV9HMHxBU0lfUlMyKH4wKSwJIiIsIDAsIHY5IH0sCi0KLXsgIm1lbWJhciIsCUYzKDIsIDB4MjgsIDEpfFJTMSgweGYpLCBGMyh+MiwgfjB4MjgsIH4xKXxSRF9HMHxSUzEofjB4Zil8U0lNTTEzKH4xMjcpLCAiSyIsIDAsIHY5IH0sCi17ICJzdGJhciIsCUYzKDIsIDB4MjgsIDApfFJTMSgweGYpLCBGMyh+MiwgfjB4MjgsIH4wKXxSRF9HMHxSUzEofjB4Zil8U0lNTTEzKH4wKSwgIiIsIDAsIHY4IH0sCi0KLXsgInByZWZldGNoIiwJRjMoMywgMHgyZCwgMCksIEYzKH4zLCB+MHgyZCwgfjApLAkJIlsxKzJdLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAwKSwgRjMofjMsIH4weDJkLCB+MCl8UlMyX0cwLAkiWzFdLCoiLCAwLCB2OSB9LCAvKiBwcmVmZXRjaCBbcnMxKyVnMF0scHJlZmV0Y2hfZmNuICovCi17ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDEpLCBGMyh+MywgfjB4MmQsIH4xKSwJCSJbMStpXSwqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoIiwJRjMoMywgMHgyZCwgMSksIEYzKH4zLCB+MHgyZCwgfjEpLAkJIltpKzFdLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAxKSwgRjMofjMsIH4weDJkLCB+MSl8UlMxX0cwLAkiW2ldLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAxKSwgRjMofjMsIH4weDJkLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSwqIiwgMCwgdjkgfSwgLyogcHJlZmV0Y2ggW3JzMSswXSxwcmVmZXRjaF9mY24gKi8KLXsgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDApLCBGMyh+MywgfjB4M2QsIH4wKSwJCSJbMSsyXUEsKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaGEiLAlGMygzLCAweDNkLCAwKSwgRjMofjMsIH4weDNkLCB+MCl8UlMyX0cwLAkiWzFdQSwqIiwgMCwgdjkgfSwgLyogcHJlZmV0Y2hhIFtyczErJWcwXSxwcmVmZXRjaF9mY24gKi8KLXsgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDEpLCBGMyh+MywgfjB4M2QsIH4xKSwJCSJbMStpXW8sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaGEiLAlGMygzLCAweDNkLCAxKSwgRjMofjMsIH4weDNkLCB+MSksCQkiW2krMV1vLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMSksIEYzKH4zLCB+MHgzZCwgfjEpfFJTMV9HMCwJIltpXW8sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaGEiLAlGMygzLCAweDNkLCAxKSwgRjMofjMsIH4weDNkLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sKiIsIDAsIHY5IH0sIC8qIHByZWZldGNoYSBbcnMxKzBdLGQgKi8KLQoteyAic2xsIiwJRjMoMiwgMHgyNSwgMCksIEYzKH4yLCB+MHgyNSwgfjApfCgxPDwxMil8KDB4N2Y8PDUpLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAic2xsIiwJRjMoMiwgMHgyNSwgMSksIEYzKH4yLCB+MHgyNSwgfjEpfCgxPDwxMil8KDB4N2Y8PDUpLAkiMSxYLGQiLCAwLCB2NiB9LAoteyAic3JhIiwJRjMoMiwgMHgyNywgMCksIEYzKH4yLCB+MHgyNywgfjApfCgxPDwxMil8KDB4N2Y8PDUpLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAic3JhIiwJRjMoMiwgMHgyNywgMSksIEYzKH4yLCB+MHgyNywgfjEpfCgxPDwxMil8KDB4N2Y8PDUpLAkiMSxYLGQiLCAwLCB2NiB9LAoteyAic3JsIiwJRjMoMiwgMHgyNiwgMCksIEYzKH4yLCB+MHgyNiwgfjApfCgxPDwxMil8KDB4N2Y8PDUpLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAic3JsIiwJRjMoMiwgMHgyNiwgMSksIEYzKH4yLCB+MHgyNiwgfjEpfCgxPDwxMil8KDB4N2Y8PDUpLAkiMSxYLGQiLCAwLCB2NiB9LAotCi17ICJzbGx4IiwJRjMoMiwgMHgyNSwgMCl8KDE8PDEyKSwgRjMofjIsIH4weDI1LCB+MCl8KDB4N2Y8PDUpLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAic2xseCIsCUYzKDIsIDB4MjUsIDEpfCgxPDwxMiksIEYzKH4yLCB+MHgyNSwgfjEpfCgweDNmPDw2KSwJIjEsWSxkIiwgMCwgdjkgfSwKLXsgInNyYXgiLAlGMygyLCAweDI3LCAwKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjcsIH4wKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJzcmF4IiwJRjMoMiwgMHgyNywgMSl8KDE8PDEyKSwgRjMofjIsIH4weDI3LCB+MSl8KDB4M2Y8PDYpLAkiMSxZLGQiLCAwLCB2OSB9LAoteyAic3JseCIsCUYzKDIsIDB4MjYsIDApfCgxPDwxMiksIEYzKH4yLCB+MHgyNiwgfjApfCgweDdmPDw1KSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInNybHgiLAlGMygyLCAweDI2LCAxKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjYsIH4xKXwoMHgzZjw8NiksCSIxLFksZCIsIDAsIHY5IH0sCi0KLXsgIm11bHNjYyIsCUYzKDIsIDB4MjQsIDApLCBGMyh+MiwgfjB4MjQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAibXVsc2NjIiwJRjMoMiwgMHgyNCwgMSksIEYzKH4yLCB+MHgyNCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQoteyAiZGl2c2NjIiwJRjMoMiwgMHgxZCwgMCksIEYzKH4yLCB+MHgxZCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHNwYXJjbGl0ZSB9LAoteyAiZGl2c2NjIiwJRjMoMiwgMHgxZCwgMSksIEYzKH4yLCB+MHgxZCwgfjEpLAkJIjEsaSxkIiwgMCwgc3BhcmNsaXRlIH0sCi0KLXsgInNjYW4iLAlGMygyLCAweDJjLCAwKSwgRjMofjIsIH4weDJjLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgc3BhcmNsZXR8c3BhcmNsaXRlIH0sCi17ICJzY2FuIiwJRjMoMiwgMHgyYywgMSksIEYzKH4yLCB+MHgyYywgfjEpLAkJIjEsaSxkIiwgMCwgc3BhcmNsZXR8c3BhcmNsaXRlIH0sCi0KLXsgInBvcGMiLAlGMygyLCAweDJlLCAwKSwgRjMofjIsIH4weDJlLCB+MCl8UlMyX0cwfEFTSSh+MCksIjIsZCIsIDAsIHY5IH0sCi17ICJwb3BjIiwJRjMoMiwgMHgyZSwgMSksIEYzKH4yLCB+MHgyZSwgfjEpfFJTMl9HMCwJImksZCIsIDAsIHY5IH0sCi0KLXsgImNsciIsCUYzKDIsIDB4MDIsIDApLCBGMyh+MiwgfjB4MDIsIH4wKXxSRF9HMHxSUzFfRzB8QVNJX1JTMih+MCksCSJkIiwgRl9BTElBUywgdjYgfSwgLyogb3IgJWcwLCVnMCxkICovCi17ICJjbHIiLAlGMygyLCAweDAyLCAxKSwgRjMofjIsIH4weDAyLCB+MSl8UlMxX0cwfFNJTU0xMyh+MCksCQkiZCIsIEZfQUxJQVMsIHY2IH0sIC8qIG9yICVnMCwwLGQJKi8KLXsgImNsciIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxSRF9HMHxBU0kofjApLAkJIlsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgImNsciIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJCSJbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdCAlZzAsW3JzMSslZzBdICovCi17ICJjbHIiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UkRfRzAsCQkJIlsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgImNsciIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSRF9HMCwJCQkiW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJEX0cwfFJTMV9HMCwJCQkiW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgImNsciIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0ICVnMCxbcnMxKzBdICovCi0KLXsgImNscmIiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8UkRfRzB8QVNJKH4wKSwJIlsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmIiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSJbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGIgJWcwLFtyczErJWcwXSAqLwoteyAiY2xyYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSRF9HMCwJCSJbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJEX0cwLAkJIltpKzFdIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UkRfRzB8UlMxX0cwLAkJIltpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSJbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGIgJWcwLFtyczErMF0gKi8KLQoteyAiY2xyaCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxSRF9HMHxBU0kofjApLAkiWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyaCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aCAlZzAsW3JzMSslZzBdICovCi17ICJjbHJoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJEX0cwLAkJIlsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UkRfRzAsCQkiW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSRF9HMHxSUzFfRzAsCQkiW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aCAlZzAsW3JzMSswXSAqLwotCi17ICJjbHJ4IiwJRjMoMywgMHgwZSwgMCksIEYzKH4zLCB+MHgwZSwgfjApfFJEX0cwfEFTSSh+MCksCSJbMSsyXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJjbHJ4IiwJRjMoMywgMHgwZSwgMCksIEYzKH4zLCB+MHgwZSwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3R4ICVnMCxbcnMxKyVnMF0gKi8KLXsgImNscngiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSl8UkRfRzAsCQkiWzEraV0iLCBGX0FMSUFTLCB2OSB9LAoteyAiY2xyeCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxSRF9HMCwJCSJbaSsxXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJjbHJ4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFJEX0cwfFJTMV9HMCwJCSJbaV0iLCBGX0FMSUFTLCB2OSB9LAoteyAiY2xyeCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3R4ICVnMCxbcnMxKzBdICovCi0KLXsgIm9yY2MiLAlGMygyLCAweDEyLCAwKSwgRjMofjIsIH4weDEyLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgIm9yY2MiLAlGMygyLCAweDEyLCAxKSwgRjMofjIsIH4weDEyLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAib3JjYyIsCUYzKDIsIDB4MTIsIDEpLCBGMyh+MiwgfjB4MTIsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLS8qIFRoaXMgaXMgbm90IGEgY29tbXV0YXRpdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyAib3JuY2MiLAlGMygyLCAweDE2LCAwKSwgRjMofjIsIH4weDE2LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgIm9ybmNjIiwJRjMoMiwgMHgxNiwgMSksIEYzKH4yLCB+MHgxNiwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQotLyogVGhpcyBpcyBub3QgYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCi17ICJvcm4iLAlGMygyLCAweDA2LCAwKSwgRjMofjIsIH4weDA2LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgIm9ybiIsCUYzKDIsIDB4MDYsIDEpLCBGMyh+MiwgfjB4MDYsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLXsgInRzdCIsCUYzKDIsIDB4MTIsIDApLCBGMyh+MiwgfjB4MTIsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEiLCAwLCB2NiB9LCAvKiBvcmNjIHJzMSwgJWcwLCAlZzAgKi8KLXsgInRzdCIsCUYzKDIsIDB4MTIsIDApLCBGMyh+MiwgfjB4MTIsIH4wKXxSRF9HMHxSUzFfRzB8QVNJKH4wKSwJIjIiLCAwLCB2NiB9LCAvKiBvcmNjICVnMCwgcnMyLCAlZzAgKi8KLXsgInRzdCIsCUYzKDIsIDB4MTIsIDEpLCBGMyh+MiwgfjB4MTIsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSIsIDAsIHY2IH0sIC8qIG9yY2MgcnMxLCAwLCAlZzAgKi8KLQoteyAid3IiLAlGMygyLCAweDMwLCAwKSwJCUYzKH4yLCB+MHgzMCwgfjApfEFTSSh+MCksCQkiMSwyLG0iLCAwLCB2OCB9LCAvKiB3ciByLHIsJWFzclggKi8KLXsgIndyIiwJRjMoMiwgMHgzMCwgMSksCQlGMyh+MiwgfjB4MzAsIH4xKSwJCQkiMSxpLG0iLCAwLCB2OCB9LCAvKiB3ciByLGksJWFzclggKi8KLXsgIndyIiwJRjMoMiwgMHgzMCwgMCksCQlGMyh+MiwgfjB4MzAsIH4wKXxBU0lfUlMyKH4wKSwJCSIxLG0iLCBGX0FMSUFTLCB2OCB9LCAvKiB3ciByczEsJWcwLCVhc3JYICovCi17ICJ3ciIsCUYzKDIsIDB4MzAsIDApLAkJRjMofjIsIH4weDMwLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix5IiwgMCwgdjYgfSwgLyogd3IgcixyLCV5ICovCi17ICJ3ciIsCUYzKDIsIDB4MzAsIDEpLAkJRjMofjIsIH4weDMwLCB+MSl8UkRfRzAsCQkiMSxpLHkiLCAwLCB2NiB9LCAvKiB3ciByLGksJXkgKi8KLXsgIndyIiwJRjMoMiwgMHgzMCwgMCksCQlGMyh+MiwgfjB4MzAsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEseSIsIEZfQUxJQVMsIHY2IH0sIC8qIHdyIHJzMSwlZzAsJXkgKi8KLXsgIndyIiwJRjMoMiwgMHgzMSwgMCksCQlGMyh+MiwgfjB4MzEsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHAiLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwlcHNyICovCi17ICJ3ciIsCUYzKDIsIDB4MzEsIDEpLAkJRjMofjIsIH4weDMxLCB+MSl8UkRfRzAsCQkiMSxpLHAiLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwlcHNyICovCi17ICJ3ciIsCUYzKDIsIDB4MzEsIDApLAkJRjMofjIsIH4weDMxLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXBzciAqLwoteyAid3IiLAlGMygyLCAweDMyLCAwKSwJCUYzKH4yLCB+MHgzMiwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIsdyIsIDAsIHY2bm90djkgfSwgLyogd3IgcixyLCV3aW0gKi8KLXsgIndyIiwJRjMoMiwgMHgzMiwgMSksCQlGMyh+MiwgfjB4MzIsIH4xKXxSRF9HMCwJCSIxLGksdyIsIDAsIHY2bm90djkgfSwgLyogd3IgcixpLCV3aW0gKi8KLXsgIndyIiwJRjMoMiwgMHgzMiwgMCksCQlGMyh+MiwgfjB4MzIsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEsdyIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwld2ltICovCi17ICJ3ciIsCUYzKDIsIDB4MzMsIDApLAkJRjMofjIsIH4weDMzLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix0IiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLHIsJXRiciAqLwoteyAid3IiLAlGMygyLCAweDMzLCAxKSwJCUYzKH4yLCB+MHgzMywgfjEpfFJEX0cwLAkJIjEsaSx0IiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLGksJXRiciAqLwoteyAid3IiLAlGMygyLCAweDMzLCAwKSwJCUYzKH4yLCB+MHgzMywgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx0IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCV0YnIgKi8KLQoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgyKSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjIpfEFTSSh+MCksCSIxLDIsRSIsIDAsIHY5IH0sIC8qIHdyIHIsciwlY2NyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDIpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MiksCQkiMSxpLEUiLCAwLCB2OSB9LCAvKiB3ciByLGksJWNjciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgzKSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjMpfEFTSSh+MCksCSIxLDIsbyIsIDAsIHY5IH0sIC8qIHdyIHIsciwlYXNpICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDMpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MyksCQkiMSxpLG8iLCAwLCB2OSB9LCAvKiB3ciByLGksJWFzaSAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCg2KSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjYpfEFTSSh+MCksCSIxLDIscyIsIDAsIHY5IH0sIC8qIHdyIHIsciwlZnBycyAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCg2KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjYpLAkJIjEsaSxzIiwgMCwgdjkgfSwgLyogd3IgcixpLCVmcHJzICovCi0KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMTYpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MTYpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJXBjciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgxNiksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4xNiksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVwY3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMTcpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MTcpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJXBpYyAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgxNyksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4xNyksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVwaWMgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMTgpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MTgpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJWRjciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgxOCksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4xOCksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVkY3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMTkpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MTkpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJWdzciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgxOSksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4xOSksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVnc3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMjApLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MjApfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJXNldF9zb2Z0aW50ICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDIwKSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjIwKSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJXNldF9zb2Z0aW50ICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDIxKSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjIxKXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCVjbGVhcl9zb2Z0aW50ICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDIxKSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjIxKSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJWNsZWFyX3NvZnRpbnQgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMjIpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MjIpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJXNvZnRpbnQgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMjIpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MjIpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlc29mdGludCAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgyMyksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4yMyl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwldGlja19jbXByICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDIzKSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjIzKSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJXRpY2tfY21wciAqLwotCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApLAkJCUYzKH4yLCB+MHgyOCwgfjApfFNJTU0xMyh+MCksCQkiTSxkIiwgMCwgdjggfSwgLyogcmQgJWFzclgsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKSwJCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJInksZCIsIDAsIHY2IH0sIC8qIHJkICV5LHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOSwgMCksCQkJRjMofjIsIH4weDI5LCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJwLGQiLCAwLCB2Nm5vdHY5IH0sIC8qIHJkICVwc3IsciAqLwoteyAicmQiLAlGMygyLCAweDJhLCAwKSwJCQlGMyh+MiwgfjB4MmEsIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJIncsZCIsIDAsIHY2bm90djkgfSwgLyogcmQgJXdpbSxyICovCi17ICJyZCIsCUYzKDIsIDB4MmIsIDApLAkJCUYzKH4yLCB+MHgyYiwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkidCxkIiwgMCwgdjZub3R2OSB9LCAvKiByZCAldGJyLHIgKi8KLQoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMiksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjIpfFNJTU0xMyh+MCksCSJFLGQiLCAwLCB2OSB9LCAvKiByZCAlY2NyLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDMpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4zKXxTSU1NMTMofjApLAkibyxkIiwgMCwgdjkgfSwgLyogcmQgJWFzaSxyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSg0KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+NCl8U0lNTTEzKH4wKSwJIlcsZCIsIDAsIHY5IH0sIC8qIHJkICV0aWNrLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDUpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH41KXxTSU1NMTMofjApLAkiUCxkIiwgMCwgdjkgfSwgLyogcmQgJXBjLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDYpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH42KXxTSU1NMTMofjApLAkicyxkIiwgMCwgdjkgfSwgLyogcmQgJWZwcnMsciAqLwotCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgxNiksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjE2KXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICVwY3IsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMTcpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4xNyl8U0lNTTEzKH4wKSwJIi8sZCIsIDAsIHY5YSB9LCAvKiByZCAlcGljLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDE4KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MTgpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJWRjcixyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgxOSksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjE5KXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICVnc3IsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMjIpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4yMil8U0lNTTEzKH4wKSwJIi8sZCIsIDAsIHY5YSB9LCAvKiByZCAlc29mdGludCxyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgyMyksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjIzKXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICV0aWNrX2NtcHIsciAqLwotCi17ICJyZHByIiwJRjMoMiwgMHgyYSwgMCksCQlGMyh+MiwgfjB4MmEsIH4wKXxTSU1NMTMofjApLAkiPyxkIiwgMCwgdjkgfSwgICAvKiByZHByICVwcml2LHIgKi8KLXsgIndycHIiLAlGMygyLCAweDMyLCAwKSwJCUYzKH4yLCB+MHgzMiwgfjApLAkJIjEsMiwhIiwgMCwgdjkgfSwgLyogd3JwciByMSxyMiwlcHJpdiAqLwoteyAid3JwciIsCUYzKDIsIDB4MzIsIDApLAkJRjMofjIsIH4weDMyLCB+MCl8U0lNTTEzKH4wKSwJIjEsISIsIDAsIHY5IH0sICAgLyogd3JwciByMSwlcHJpdiAqLwoteyAid3JwciIsCUYzKDIsIDB4MzIsIDEpLAkJRjMofjIsIH4weDMyLCB+MSksCQkiMSxpLCEiLCAwLCB2OSB9LCAvKiB3cnByIHIxLGksJXByaXYgKi8KLXsgIndycHIiLAlGMygyLCAweDMyLCAxKSwJCUYzKH4yLCB+MHgzMiwgfjEpLAkJImksMSwhIiwgRl9BTElBUywgdjkgfSwgLyogd3JwciBpLHIxLCVwcml2ICovCi17ICJ3cnByIiwJRjMoMiwgMHgzMiwgMSksCQlGMyh+MiwgfjB4MzIsIH4xKXxSUzEofjApLAkiaSwhIiwgMCwgdjkgfSwgICAvKiB3cnByIGksJXByaXYgKi8KLQotLyogPz8/IFRoaXMgZ3JvdXAgc2VlbXMgd3JvbmcuICBBIHRocmVlIG9wZXJhbmQgbW92ZT8gICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAwKSwgRjMofjIsIH4weDMwLCB+MCl8QVNJKH4wKSwJCSIxLDIsbSIsIEZfQUxJQVMsIHY4IH0sIC8qIHdyIHIsciwlYXNyWCAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpLAkJCSIxLGksbSIsIEZfQUxJQVMsIHY4IH0sIC8qIHdyIHIsaSwlYXNyWCAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMCksIEYzKH4yLCB+MHgzMCwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIseSIsIEZfQUxJQVMsIHY2IH0sIC8qIHdyIHIsciwleSAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpfFJEX0cwLAkJIjEsaSx5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgcixpLCV5ICovCi17ICJtb3YiLAlGMygyLCAweDMxLCAwKSwgRjMofjIsIH4weDMxLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMixwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLHIsJXBzciAqLwoteyAibW92IiwJRjMoMiwgMHgzMSwgMSksIEYzKH4yLCB+MHgzMSwgfjEpfFJEX0cwLAkJIjEsaSxwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLGksJXBzciAqLwoteyAibW92IiwJRjMoMiwgMHgzMiwgMCksIEYzKH4yLCB+MHgzMiwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIsdyIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixyLCV3aW0gKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzIsIDEpLCBGMyh+MiwgfjB4MzIsIH4xKXxSRF9HMCwJCSIxLGksdyIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixpLCV3aW0gKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzMsIDApLCBGMyh+MiwgfjB4MzMsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwldGJyICovCi17ICJtb3YiLAlGMygyLCAweDMzLCAxKSwgRjMofjIsIH4weDMzLCB+MSl8UkRfRzAsCQkiMSxpLHQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwldGJyICovCi0KLXsgIm1vdiIsCUYzKDIsIDB4MjgsIDApLCBGMyh+MiwgfjB4MjgsIH4wKXxTSU1NMTMofjApLAkJIk0sZCIsIEZfQUxJQVMsIHY4IH0sIC8qIHJkICVhc3IxLHIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MjgsIDApLCBGMyh+MiwgfjB4MjgsIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJInksZCIsIEZfQUxJQVMsIHY2IH0sIC8qIHJkICV5LHIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MjksIDApLCBGMyh+MiwgfjB4MjksIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJInAsZCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogcmQgJXBzcixyICovCi17ICJtb3YiLAlGMygyLCAweDJhLCAwKSwgRjMofjIsIH4weDJhLCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ3LGQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHJkICV3aW0sciAqLwoteyAibW92IiwJRjMoMiwgMHgyYiwgMCksIEYzKH4yLCB+MHgyYiwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkidCxkIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiByZCAldGJyLHIgKi8KLQoteyAibW92IiwJRjMoMiwgMHgzMCwgMCksIEYzKH4yLCB+MHgzMCwgfjApfEFTSV9SUzIofjApLAkJIjEsbSIsIEZfQUxJQVMsIHY4IH0sIC8qIHdyIHJzMSwlZzAsJWFzclggKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDEpLCBGMyh+MiwgfjB4MzAsIH4xKSwJCQkiaSxtIiwgRl9BTElBUywgdjggfSwgLyogd3IgJWcwLGksJWFzclggKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDEpLCBGMyh+MiwgfjB4MzAsIH4xKXxTSU1NMTMofjApLAkJIjEsbSIsIEZfQUxJQVMsIHY4IH0sIC8qIHdyIHJzMSwwLCVhc3JYICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAwKSwgRjMofjIsIH4weDMwLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciByczEsJWcwLCV5ICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSl8UkRfRzAsCQkiaSx5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgJWcwLGksJXkgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDEpLCBGMyh+MiwgfjB4MzAsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSx5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgcnMxLDAsJXkgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzEsIDApLCBGMyh+MiwgfjB4MzEsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEscCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwlcHNyICovCi17ICJtb3YiLAlGMygyLCAweDMxLCAxKSwgRjMofjIsIH4weDMxLCB+MSl8UkRfRzAsCQkiaSxwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciAlZzAsaSwlcHNyICovCi17ICJtb3YiLAlGMygyLCAweDMxLCAxKSwgRjMofjIsIH4weDMxLCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEscCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLDAsJXBzciAqLwoteyAibW92IiwJRjMoMiwgMHgzMiwgMCksIEYzKH4yLCB+MHgzMiwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCV3aW0gKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzIsIDEpLCBGMyh+MiwgfjB4MzIsIH4xKXxSRF9HMCwJCSJpLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyICVnMCxpLCV3aW0gKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzIsIDEpLCBGMyh+MiwgfjB4MzIsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSx3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsMCwld2ltICovCi17ICJtb3YiLAlGMygyLCAweDMzLCAwKSwgRjMofjIsIH4weDMzLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXRiciAqLwoteyAibW92IiwJRjMoMiwgMHgzMywgMSksIEYzKH4yLCB+MHgzMywgfjEpfFJEX0cwLAkJImksdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgJWcwLGksJXRiciAqLwoteyAibW92IiwJRjMoMiwgMHgzMywgMSksIEYzKH4yLCB+MHgzMywgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxLHQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwwLCV0YnIgKi8KLQoteyAibW92IiwJRjMoMiwgMHgwMiwgMCksIEYzKH4yLCB+MHgwMiwgfjApfFJTMV9HMHxBU0kofjApLAkiMixkIiwgMCwgdjYgfSwgLyogb3IgJWcwLHJzMixkICovCi17ICJtb3YiLAlGMygyLCAweDAyLCAxKSwgRjMofjIsIH4weDAyLCB+MSl8UlMxX0cwLAkJImksZCIsIDAsIHY2IH0sIC8qIG9yICVnMCxpLGQJKi8KLXsgIm1vdiIsICAgICAgICBGMygyLCAweDAyLCAwKSwgRjMofjIsIH4weDAyLCB+MCl8QVNJX1JTMih+MCksCQkiMSxkIiwgMCwgdjYgfSwgLyogb3IgcnMxLCVnMCxkICAgKi8KLXsgIm1vdiIsICAgICAgICBGMygyLCAweDAyLCAxKSwgRjMofjIsIH4weDAyLCB+MSl8U0lNTTEzKH4wKSwJCSIxLGQiLCAwLCB2NiB9LCAvKiBvciByczEsMCxkICovCi0KLXsgIm9yIiwJRjMoMiwgMHgwMiwgMCksIEYzKH4yLCB+MHgwMiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJvciIsCUYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJvciIsCUYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLXsgImJzZXQiLAlGMygyLCAweDAyLCAwKSwgRjMofjIsIH4weDAyLCB+MCl8QVNJKH4wKSwJIjIsciIsIEZfQUxJQVMsIHY2IH0sCS8qIG9yIHJkLHJzMixyZCAqLwoteyAiYnNldCIsCUYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKSwJCSJpLHIiLCBGX0FMSUFTLCB2NiB9LAkvKiBvciByZCxpLHJkICovCi0KLS8qIFRoaXMgaXMgbm90IGEgY29tbXV0YXRpdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyAiYW5kbiIsCUYzKDIsIDB4MDUsIDApLCBGMyh+MiwgfjB4MDUsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAiYW5kbiIsCUYzKDIsIDB4MDUsIDEpLCBGMyh+MiwgfjB4MDUsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLS8qIFRoaXMgaXMgbm90IGEgY29tbXV0YXRpdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyAiYW5kbmNjIiwJRjMoMiwgMHgxNSwgMCksIEYzKH4yLCB+MHgxNSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJhbmRuY2MiLAlGMygyLCAweDE1LCAxKSwgRjMofjIsIH4weDE1LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi17ICJiY2xyIiwJRjMoMiwgMHgwNSwgMCksIEYzKH4yLCB+MHgwNSwgfjApfEFTSSh+MCksCSIyLHIiLCBGX0FMSUFTLCB2NiB9LAkvKiBhbmRuIHJkLHJzMixyZCAqLwoteyAiYmNsciIsCUYzKDIsIDB4MDUsIDEpLCBGMyh+MiwgfjB4MDUsIH4xKSwJCSJpLHIiLCBGX0FMSUFTLCB2NiB9LAkvKiBhbmRuIHJkLGkscmQgKi8KLQoteyAiY21wIiwJRjMoMiwgMHgxNCwgMCksIEYzKH4yLCB+MHgxNCwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIiLCAwLCB2NiB9LAkvKiBzdWJjYyByczEscnMyLCVnMCAqLwoteyAiY21wIiwJRjMoMiwgMHgxNCwgMSksIEYzKH4yLCB+MHgxNCwgfjEpfFJEX0cwLAkJIjEsaSIsIDAsIHY2IH0sCS8qIHN1YmNjIHJzMSxpLCVnMCAqLwotCi17ICJzdWIiLAlGMygyLCAweDA0LCAwKSwgRjMofjIsIH4weDA0LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInN1YiIsCUYzKDIsIDB4MDQsIDEpLCBGMyh+MiwgfjB4MDQsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLXsgInN1YmNjIiwJRjMoMiwgMHgxNCwgMCksIEYzKH4yLCB+MHgxNCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJzdWJjYyIsCUYzKDIsIDB4MTQsIDEpLCBGMyh+MiwgfjB4MTQsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLXsgInN1YngiLAlGMygyLCAweDBjLCAwKSwgRjMofjIsIH4weDBjLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjZub3R2OSB9LAoteyAic3VieCIsCUYzKDIsIDB4MGMsIDEpLCBGMyh+MiwgfjB4MGMsIH4xKSwJCSIxLGksZCIsIDAsIHY2bm90djkgfSwKLXsgInN1YmMiLAlGMygyLCAweDBjLCAwKSwgRjMofjIsIH4weDBjLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInN1YmMiLAlGMygyLCAweDBjLCAxKSwgRjMofjIsIH4weDBjLCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAotCi17ICJzdWJ4Y2MiLAlGMygyLCAweDFjLCAwKSwgRjMofjIsIH4weDFjLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjZub3R2OSB9LAoteyAic3VieGNjIiwJRjMoMiwgMHgxYywgMSksIEYzKH4yLCB+MHgxYywgfjEpLAkJIjEsaSxkIiwgMCwgdjZub3R2OSB9LAoteyAic3ViY2NjIiwJRjMoMiwgMHgxYywgMCksIEYzKH4yLCB+MHgxYywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJzdWJjY2MiLAlGMygyLCAweDFjLCAxKSwgRjMofjIsIH4weDFjLCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAotCi17ICJhbmQiLAlGMygyLCAweDAxLCAwKSwgRjMofjIsIH4weDAxLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgImFuZCIsCUYzKDIsIDB4MDEsIDEpLCBGMyh+MiwgfjB4MDEsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJhbmQiLAlGMygyLCAweDAxLCAxKSwgRjMofjIsIH4weDAxLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi17ICJhbmRjYyIsCUYzKDIsIDB4MTEsIDApLCBGMyh+MiwgfjB4MTEsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAiYW5kY2MiLAlGMygyLCAweDExLCAxKSwgRjMofjIsIH4weDExLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAiYW5kY2MiLAlGMygyLCAweDExLCAxKSwgRjMofjIsIH4weDExLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi17ICJkZWMiLAlGMygyLCAweDA0LCAxKXxTSU1NMTMoMHgxKSwgRjMofjIsIH4weDA0LCB+MSl8U0lNTTEzKH4weDAwMDEpLCAiciIsIEZfQUxJQVMsIHY2IH0sCS8qIHN1YiByZCwxLHJkICovCi17ICJkZWMiLAlGMygyLCAweDA0LCAxKSwJCSAgICBGMyh+MiwgfjB4MDQsIH4xKSwJCSAgICAgICAiaSxyIiwgRl9BTElBUywgdjggfSwJLyogc3ViIHJkLGltbSxyZCAqLwoteyAiZGVjY2MiLAlGMygyLCAweDE0LCAxKXxTSU1NMTMoMHgxKSwgRjMofjIsIH4weDE0LCB+MSl8U0lNTTEzKH4weDAwMDEpLCAiciIsIEZfQUxJQVMsIHY2IH0sCS8qIHN1YmNjIHJkLDEscmQgKi8KLXsgImRlY2NjIiwJRjMoMiwgMHgxNCwgMSksCQkgICAgRjMofjIsIH4weDE0LCB+MSksCQkgICAgICAgImksciIsIEZfQUxJQVMsIHY4IH0sCS8qIHN1YmNjIHJkLGltbSxyZCAqLwoteyAiaW5jIiwJRjMoMiwgMHgwMCwgMSl8U0lNTTEzKDB4MSksIEYzKH4yLCB+MHgwMCwgfjEpfFNJTU0xMyh+MHgwMDAxKSwgInIiLCBGX0FMSUFTLCB2NiB9LAkvKiBhZGQgcmQsMSxyZCAqLwoteyAiaW5jIiwJRjMoMiwgMHgwMCwgMSksCQkgICAgRjMofjIsIH4weDAwLCB+MSksCQkgICAgICAgImksciIsIEZfQUxJQVMsIHY4IH0sCS8qIGFkZCByZCxpbW0scmQgKi8KLXsgImluY2NjIiwJRjMoMiwgMHgxMCwgMSl8U0lNTTEzKDB4MSksIEYzKH4yLCB+MHgxMCwgfjEpfFNJTU0xMyh+MHgwMDAxKSwgInIiLCBGX0FMSUFTLCB2NiB9LAkvKiBhZGRjYyByZCwxLHJkICovCi17ICJpbmNjYyIsCUYzKDIsIDB4MTAsIDEpLAkJICAgIEYzKH4yLCB+MHgxMCwgfjEpLAkJICAgICAgICJpLHIiLCBGX0FMSUFTLCB2OCB9LAkvKiBhZGRjYyByZCxpbW0scmQgKi8KLQoteyAiYnRzdCIsCUYzKDIsIDB4MTEsIDApLCBGMyh+MiwgfjB4MTEsIH4wKXxSRF9HMHxBU0kofjApLCAiMSwyIiwgRl9BTElBUywgdjYgfSwJLyogYW5kY2MgcnMxLHJzMiwlZzAgKi8KLXsgImJ0c3QiLAlGMygyLCAweDExLCAxKSwgRjMofjIsIH4weDExLCB+MSl8UkRfRzAsICJpLDEiLCBGX0FMSUFTLCB2NiB9LAkvKiBhbmRjYyByczEsaSwlZzAgKi8KLQoteyAibmVnIiwJRjMoMiwgMHgwNCwgMCksIEYzKH4yLCB+MHgwNCwgfjApfFJTMV9HMHxBU0kofjApLCAiMixkIiwgRl9BTElBUywgdjYgfSwgLyogc3ViICVnMCxyczIscmQgKi8KLXsgIm5lZyIsCUYzKDIsIDB4MDQsIDApLCBGMyh+MiwgfjB4MDQsIH4wKXxSUzFfRzB8QVNJKH4wKSwgIk8iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdWIgJWcwLHJkLHJkICovCi0KLXsgImFkZCIsCUYzKDIsIDB4MDAsIDApLCBGMyh+MiwgfjB4MDAsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAiYWRkIiwJRjMoMiwgMHgwMCwgMSksIEYzKH4yLCB+MHgwMCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgImFkZCIsCUYzKDIsIDB4MDAsIDEpLCBGMyh+MiwgfjB4MDAsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi17ICJhZGRjYyIsCUYzKDIsIDB4MTAsIDApLCBGMyh+MiwgfjB4MTAsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAiYWRkY2MiLAlGMygyLCAweDEwLCAxKSwgRjMofjIsIH4weDEwLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAiYWRkY2MiLAlGMygyLCAweDEwLCAxKSwgRjMofjIsIH4weDEwLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi17ICJhZGR4IiwJRjMoMiwgMHgwOCwgMCksIEYzKH4yLCB+MHgwOCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2bm90djkgfSwKLXsgImFkZHgiLAlGMygyLCAweDA4LCAxKSwgRjMofjIsIH4weDA4LCB+MSksCQkiMSxpLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJhZGR4IiwJRjMoMiwgMHgwOCwgMSksIEYzKH4yLCB+MHgwOCwgfjEpLAkJImksMSxkIiwgMCwgdjZub3R2OSB9LAoteyAiYWRkYyIsCUYzKDIsIDB4MDgsIDApLCBGMyh+MiwgfjB4MDgsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAiYWRkYyIsCUYzKDIsIDB4MDgsIDEpLCBGMyh+MiwgfjB4MDgsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi17ICJhZGRjIiwJRjMoMiwgMHgwOCwgMSksIEYzKH4yLCB+MHgwOCwgfjEpLAkJImksMSxkIiwgMCwgdjkgfSwKLQoteyAiYWRkeGNjIiwJRjMoMiwgMHgxOCwgMCksIEYzKH4yLCB+MHgxOCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2bm90djkgfSwKLXsgImFkZHhjYyIsCUYzKDIsIDB4MTgsIDEpLCBGMyh+MiwgfjB4MTgsIH4xKSwJCSIxLGksZCIsIDAsIHY2bm90djkgfSwKLXsgImFkZHhjYyIsCUYzKDIsIDB4MTgsIDEpLCBGMyh+MiwgfjB4MTgsIH4xKSwJCSJpLDEsZCIsIDAsIHY2bm90djkgfSwKLXsgImFkZGNjYyIsCUYzKDIsIDB4MTgsIDApLCBGMyh+MiwgfjB4MTgsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAiYWRkY2NjIiwJRjMoMiwgMHgxOCwgMSksIEYzKH4yLCB+MHgxOCwgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLXsgImFkZGNjYyIsCUYzKDIsIDB4MTgsIDEpLCBGMyh+MiwgfjB4MTgsIH4xKSwJCSJpLDEsZCIsIDAsIHY5IH0sCi0KLXsgInNtdWwiLAlGMygyLCAweDBiLCAwKSwgRjMofjIsIH4weDBiLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInNtdWwiLAlGMygyLCAweDBiLCAxKSwgRjMofjIsIH4weDBiLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAic211bCIsCUYzKDIsIDB4MGIsIDEpLCBGMyh+MiwgfjB4MGIsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJzbXVsY2MiLAlGMygyLCAweDFiLCAwKSwgRjMofjIsIH4weDFiLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInNtdWxjYyIsCUYzKDIsIDB4MWIsIDEpLCBGMyh+MiwgfjB4MWIsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJzbXVsY2MiLAlGMygyLCAweDFiLCAxKSwgRjMofjIsIH4weDFiLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAidW11bCIsCUYzKDIsIDB4MGEsIDApLCBGMyh+MiwgfjB4MGEsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAidW11bCIsCUYzKDIsIDB4MGEsIDEpLCBGMyh+MiwgfjB4MGEsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJ1bXVsIiwJRjMoMiwgMHgwYSwgMSksIEYzKH4yLCB+MHgwYSwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInVtdWxjYyIsCUYzKDIsIDB4MWEsIDApLCBGMyh+MiwgfjB4MWEsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAidW11bGNjIiwJRjMoMiwgMHgxYSwgMSksIEYzKH4yLCB+MHgxYSwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInVtdWxjYyIsCUYzKDIsIDB4MWEsIDEpLCBGMyh+MiwgfjB4MWEsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJzZGl2IiwJRjMoMiwgMHgwZiwgMCksIEYzKH4yLCB+MHgwZiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJzZGl2IiwJRjMoMiwgMHgwZiwgMSksIEYzKH4yLCB+MHgwZiwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInNkaXYiLAlGMygyLCAweDBmLCAxKSwgRjMofjIsIH4weDBmLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAic2RpdmNjIiwJRjMoMiwgMHgxZiwgMCksIEYzKH4yLCB+MHgxZiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJzZGl2Y2MiLAlGMygyLCAweDFmLCAxKSwgRjMofjIsIH4weDFmLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAic2RpdmNjIiwJRjMoMiwgMHgxZiwgMSksIEYzKH4yLCB+MHgxZiwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInVkaXYiLAlGMygyLCAweDBlLCAwKSwgRjMofjIsIH4weDBlLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInVkaXYiLAlGMygyLCAweDBlLCAxKSwgRjMofjIsIH4weDBlLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAidWRpdiIsCUYzKDIsIDB4MGUsIDEpLCBGMyh+MiwgfjB4MGUsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJ1ZGl2Y2MiLAlGMygyLCAweDFlLCAwKSwgRjMofjIsIH4weDFlLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInVkaXZjYyIsCUYzKDIsIDB4MWUsIDEpLCBGMyh+MiwgfjB4MWUsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJ1ZGl2Y2MiLAlGMygyLCAweDFlLCAxKSwgRjMofjIsIH4weDFlLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAotCi17ICJtdWx4IiwJRjMoMiwgMHgwOSwgMCksIEYzKH4yLCB+MHgwOSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJtdWx4IiwJRjMoMiwgMHgwOSwgMSksIEYzKH4yLCB+MHgwOSwgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLXsgInNkaXZ4IiwJRjMoMiwgMHgyZCwgMCksIEYzKH4yLCB+MHgyZCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJzZGl2eCIsCUYzKDIsIDB4MmQsIDEpLCBGMyh+MiwgfjB4MmQsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi17ICJ1ZGl2eCIsCUYzKDIsIDB4MGQsIDApLCBGMyh+MiwgfjB4MGQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAidWRpdngiLAlGMygyLCAweDBkLCAxKSwgRjMofjIsIH4weDBkLCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAotCi17ICJjYWxsIiwJRjEoMHgxKSwgRjEofjB4MSksICJMIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiY2FsbCIsCUYxKDB4MSksIEYxKH4weDEpLCAiTCwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAotCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMCl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MCl8UkQofjB4Zil8QVNJKH4wKSwJIjErMiIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErcnMyLCVvNyAqLwoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDApfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjApfFJEKH4weGYpfEFTSSh+MCksCSIxKzIsIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImNhbGwiLAlGMygyLCAweDM4LCAwKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4wKXxSRCh+MHhmKXxBU0lfUlMyKH4wKSwJIjEiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKyVnMCwlbzcgKi8KLXsgImNhbGwiLAlGMygyLCAweDM4LCAwKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4wKXxSRCh+MHhmKXxBU0lfUlMyKH4wKSwJIjEsIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKSwJCSIxK2kiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxK2ksJW83ICovCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4ZiksCQkiMStpLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4ZiksCQkiaSsxIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIGkrcnMxLCVvNyAqLwoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpLAkJImkrMSwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpfFJTMV9HMCwJImkiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgJWcwK2ksJW83ICovCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4Zil8UlMxX0cwLAkiaSwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpfFNJTU0xMyh+MCksCSIxIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSswLCVvNyAqLwoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpfFNJTU0xMyh+MCksCSIxLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi0KLQotLyogQ29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zLgotCi0gICBCZWNhdXNlIHRoaXMgcGFydCBvZiB0aGUgdGFibGUgd2FzIHN1Y2ggYSBtZXNzIGVhcmxpZXIsIEkgaGF2ZQotICAgbWFjcm9maWVkIGl0IHNvIHRoYXQgYWxsIHRoZSBicmFuY2hlcyBhbmQgdHJhcHMgYXJlIGdlbmVyYXRlZCBmcm9tCi0gICBhIHNpbmdsZS1saW5lIGRlc2NyaXB0aW9uIG9mIGVhY2ggY29uZGl0aW9uIHZhbHVlLiAgSm9obiBHaWxtb3JlLiAqLwotCi0vKiBEZWZpbmUgYnJhbmNoZXMgLS0gb25lIGFubnVsbGVkLCBvbmUgd2l0aG91dCwgZXRjLiAqLwotI2RlZmluZSBicihvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSBcCi0geyBvcGNvZGUsIChtYXNrKXxBTk5VTCwgKGxvc2UpLCAgICAgICAiLGEgbCIsICAgKGZsYWdzKSwgdjYgfSwgXAotIHsgb3Bjb2RlLCAobWFzaykgICAgICAsIChsb3NlKXxBTk5VTCwgImwiLCAgICAgKGZsYWdzKSwgdjYgfQotCi0jZGVmaW5lIGJyeChvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MjApfEJQUkVELCBBTk5VTHwobG9zZSksICJaLEciLCAgICAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCl8QlBSRUQsIEFOTlVMfChsb3NlKSwgIixUIFosRyIsICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKXxCUFJFRHxBTk5VTCwgKGxvc2UpLCAiLGEgWixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MjApfEJQUkVEfEFOTlVMLCAobG9zZSksICIsYSxUIFosRyIsIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCksIEFOTlVMfEJQUkVEfChsb3NlKSwgIixOIFosRyIsICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKXxBTk5VTCwgQlBSRUR8KGxvc2UpLCAiLGEsTiBaLEciLCAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRCwgQU5OVUx8KGxvc2UpfCgyPDwyMCksICJ6LEciLCAgICAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVELCBBTk5VTHwobG9zZSl8KDI8PDIwKSwgIixUIHosRyIsICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUR8QU5OVUwsIChsb3NlKXwoMjw8MjApLCAiLGEgeixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRHxBTk5VTCwgKGxvc2UpfCgyPDwyMCksICIsYSxUIHosRyIsIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spLCBBTk5VTHxCUFJFRHwobG9zZSl8KDI8PDIwKSwgIixOIHosRyIsICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QU5OVUwsIEJQUkVEfChsb3NlKXwoMjw8MjApLCAiLGEsTiB6LEciLCAoZmxhZ3MpLCB2OSB9Ci0KLS8qIERlZmluZSBmb3VyIHRyYXBzOiByZWcrcmVnLCByZWcgKyBpbW1lZGlhdGUsIGltbWVkaWF0ZSBhbG9uZSwgcmVnIGFsb25lLiAqLwotI2RlZmluZSB0cihvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MTEpfElNTUVELCAobG9zZSl8UlMxX0cwLAkiWixpIiwgICAoZmxhZ3MpLCB2OSB9LCAvKiAlZzAgKyBpbW0gKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDExKXxJTU1FRCwgKGxvc2UpLAkiWiwxK2kiLCAoZmxhZ3MpLCB2OSB9LCAvKiByczEgKyBpbW0gKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDExKSwgSU1NRUR8KGxvc2UpLAkiWiwxKzIiLCAoZmxhZ3MpLCB2OSB9LCAvKiByczEgKyByczIgKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDExKSwgSU1NRUR8KGxvc2UpfFJTMl9HMCwJIlosMSIsICAgKGZsYWdzKSwgdjkgfSwgLyogcnMxICsgJWcwICovIFwKLSB7IG9wY29kZSwgKG1hc2spfElNTUVELCAobG9zZSl8UlMxX0cwLAkieixpIiwgICAoZmxhZ3MpfEZfQUxJQVMsIHY5IH0sIC8qICVnMCArIGltbSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXxJTU1FRCwgKGxvc2UpLAkieiwxK2kiLCAoZmxhZ3MpfEZfQUxJQVMsIHY5IH0sIC8qIHJzMSArIGltbSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgSU1NRUR8KGxvc2UpLAkieiwxKzIiLCAoZmxhZ3MpfEZfQUxJQVMsIHY5IH0sIC8qIHJzMSArIHJzMiAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgSU1NRUR8KGxvc2UpfFJTMl9HMCwJInosMSIsICAgKGZsYWdzKXxGX0FMSUFTLCB2OSB9LCAvKiByczEgKyAlZzAgKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8SU1NRUQsIChsb3NlKXxSUzFfRzAsCQkiaSIsICAgICAoZmxhZ3MpLCB2NiB9LCAvKiAlZzAgKyBpbW0gKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8SU1NRUQsIChsb3NlKSwJCSIxK2kiLCAgIChmbGFncyksIHY2IH0sIC8qIHJzMSArIGltbSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKSwgSU1NRUR8KGxvc2UpLAkJIjErMiIsICAgKGZsYWdzKSwgdjYgfSwgLyogcnMxICsgcnMyICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCBJTU1FRHwobG9zZSl8UlMyX0cwLAkJIjEiLCAgICAgKGZsYWdzKSwgdjYgfSAvKiByczEgKyAlZzAgKi8KLQotLyogdjk6IFdlIG11c3QgcHV0IGBicngnIGJlZm9yZSBgYnInLCB0byBlbnN1cmUgdGhhdCB3ZSBuZXZlciBtYXRjaCBzb21ldGhpbmcKLSAgIHY5OiBhZ2FpbnN0IGFuIGV4cHJlc3Npb24gdW5sZXNzIGl0IGlzIGFuIGV4cHJlc3Npb24uICBPdGhlcndpc2UsIHdlIGVuZAotICAgdjk6IHVwIHdpdGggdW5kZWZpbmVkIHN5bWJvbCB0YWJsZXMgZW50cmllcywgYmVjYXVzZSB0aGV5IGdldCBhZGRlZCwgYnV0Ci0gICB2OTogYXJlIG5vdCBkZWxldGVkIGlmIHRoZSBwYXR0ZXJuIGZhaWxzIHRvIG1hdGNoLiAgKi8KLQotLyogRGVmaW5lIGJvdGggYnJhbmNoZXMgYW5kIHRyYXBzIGJhc2VkIG9uIGNvbmRpdGlvbiBtYXNrICovCi0jZGVmaW5lIGNvbmQoYm9wLCB0b3AsIG1hc2ssIGZsYWdzKSBcCi0gIGJyeChib3AsIEYyKDAsIDEpfChtYXNrKSwgRjIofjAsIH4xKXwoKH5tYXNrKSZDT05EKH4wKSksIEZfREVMQVlFRHwoZmxhZ3MpKSwgLyogdjkgKi8gXAotICBicihib3AsICBGMigwLCAyKXwobWFzayksIEYyKH4wLCB+Mil8KCh+bWFzaykmQ09ORCh+MCkpLCBGX0RFTEFZRUR8KGZsYWdzKSksIFwKLSAgdHIodG9wLCAgRjMoMiwgMHgzYSwgMCl8KG1hc2spLCBGMyh+MiwgfjB4M2EsIDApfCgofm1hc2spJkNPTkQofjApKSwgKChmbGFncykgJiB+KEZfVU5CUnxGX0NPTkRCUikpKQotCi0vKiBEZWZpbmUgYWxsIHRoZSBjb25kaXRpb25zLCBhbGwgdGhlIGJyYW5jaGVzLCBhbGwgdGhlIHRyYXBzLiAgKi8KLQotLyogU3RhbmRhcmQgYnJhbmNoLCB0cmFwIG1uZW1vbmljcyAqLwotY29uZCAoImIiLAkidGEiLCAgIENPTkRBLCBGX1VOQlIpLAotLyogQWx0ZXJuYXRpdmUgZm9ybSAoanVzdCBmb3IgYXNzZW1ibHksIG5vdCBmb3IgZGlzYXNzZW1ibHkpICovCi1jb25kICgiYmEiLAkidCIsICAgIENPTkRBLCBGX1VOQlJ8Rl9BTElBUyksCi0KLWNvbmQgKCJiY2MiLAkidGNjIiwgIENPTkRDQywgRl9DT05EQlIpLAotY29uZCAoImJjcyIsCSJ0Y3MiLCAgQ09ORENTLCBGX0NPTkRCUiksCi1jb25kICgiYmUiLAkidGUiLCAgIENPTkRFLCBGX0NPTkRCUiksCi1jb25kICgiYmVxIiwJInRlcSIsICBDT05ERSwgRl9DT05EQlJ8Rl9BTElBUyksCi1jb25kICgiYmciLAkidGciLCAgIENPTkRHLCBGX0NPTkRCUiksCi1jb25kICgiYmd0IiwJInRndCIsICBDT05ERywgRl9DT05EQlJ8Rl9BTElBUyksCi1jb25kICgiYmdlIiwJInRnZSIsICBDT05ER0UsIEZfQ09OREJSKSwKLWNvbmQgKCJiZ2V1IiwJInRnZXUiLCBDT05ER0VVLCBGX0NPTkRCUnxGX0FMSUFTKSwgLyogZm9yIGNjICovCi1jb25kICgiYmd1IiwJInRndSIsICBDT05ER1UsIEZfQ09OREJSKSwKLWNvbmQgKCJibCIsCSJ0bCIsICAgQ09OREwsIEZfQ09OREJSKSwKLWNvbmQgKCJibHQiLAkidGx0IiwgIENPTkRMLCBGX0NPTkRCUnxGX0FMSUFTKSwKLWNvbmQgKCJibGUiLAkidGxlIiwgIENPTkRMRSwgRl9DT05EQlIpLAotY29uZCAoImJsZXUiLAkidGxldSIsIENPTkRMRVUsIEZfQ09OREJSKSwKLWNvbmQgKCJibHUiLAkidGx1IiwgIENPTkRMVSwgRl9DT05EQlJ8Rl9BTElBUyksIC8qIGZvciBjcyAqLwotY29uZCAoImJuIiwJInRuIiwgICBDT05ETiwgRl9DT05EQlIpLAotY29uZCAoImJuZSIsCSJ0bmUiLCAgQ09ORE5FLCBGX0NPTkRCUiksCi1jb25kICgiYm5lZyIsCSJ0bmVnIiwgQ09ORE5FRywgRl9DT05EQlIpLAotY29uZCAoImJueiIsCSJ0bnoiLCAgQ09ORE5aLCBGX0NPTkRCUnxGX0FMSUFTKSwgLyogZm9yIG5lICovCi1jb25kICgiYnBvcyIsCSJ0cG9zIiwgQ09ORFBPUywgRl9DT05EQlIpLAotY29uZCAoImJ2YyIsCSJ0dmMiLCAgQ09ORFZDLCBGX0NPTkRCUiksCi1jb25kICgiYnZzIiwJInR2cyIsICBDT05EVlMsIEZfQ09OREJSKSwKLWNvbmQgKCJieiIsCSJ0eiIsICAgQ09ORFosIEZfQ09OREJSfEZfQUxJQVMpLCAvKiBmb3IgZSAqLwotCi0jdW5kZWYgY29uZAotI3VuZGVmIGJyCi0jdW5kZWYgYnJyIC8qIHY5ICovCi0jdW5kZWYgdHIKLQotI2RlZmluZSBicnIob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUQsIEFOTlVMfChsb3NlKSwgIjEsayIsICAgICAgRl9ERUxBWUVEfChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVELCBBTk5VTHwobG9zZSksICIsVCAxLGsiLCAgIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRHxBTk5VTCwgKGxvc2UpLCAiLGEgMSxrIiwgICBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUR8QU5OVUwsIChsb3NlKSwgIixhLFQgMSxrIiwgRl9ERUxBWUVEfChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spLCBBTk5VTHxCUFJFRHwobG9zZSksICIsTiAxLGsiLCAgIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxBTk5VTCwgQlBSRUR8KGxvc2UpLCAiLGEsTiAxLGsiLCBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfQotCi0jZGVmaW5lIGNvbmRyKGJvcCwgbWFzaywgZmxhZ3MpIC8qIHY5ICovIFwKLSAgYnJyKGJvcCwgRjIoMCwgMyl8Q09ORChtYXNrKSwgRjIofjAsIH4zKXxDT05EKH4obWFzaykpLCAoZmxhZ3MpKSAvKiB2OSAqLwotCi0vKiB2OSAqLyBjb25kcigiYnJueiIsIDB4NSwgRl9DT05EQlIpLAotLyogdjkgKi8gY29uZHIoImJyeiIsIDB4MSwgRl9DT05EQlIpLAotLyogdjkgKi8gY29uZHIoImJyZ2V6IiwgMHg3LCBGX0NPTkRCUiksCi0vKiB2OSAqLyBjb25kcigiYnJseiIsIDB4MywgRl9DT05EQlIpLAotLyogdjkgKi8gY29uZHIoImJybGV6IiwgMHgyLCBGX0NPTkRCUiksCi0vKiB2OSAqLyBjb25kcigiYnJneiIsIDB4NiwgRl9DT05EQlIpLAotCi0jdW5kZWYgY29uZHIgLyogdjkgKi8KLSN1bmRlZiBicnIgLyogdjkgKi8KLQotI2RlZmluZSBtb3ZyKG9wY29kZSwgbWFzaywgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgRjMoMiwgMHgyZiwgMCl8UkNPTkQobWFzayksIEYzKH4yLCB+MHgyZiwgfjApfFJDT05EKH4obWFzaykpLCAiMSwyLGQiLCAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIEYzKDIsIDB4MmYsIDEpfFJDT05EKG1hc2spLCBGMyh+MiwgfjB4MmYsIH4xKXxSQ09ORCh+KG1hc2spKSwgIjEsaixkIiwgKGZsYWdzKSwgdjkgfQotCi0jZGVmaW5lIGZtcnJzKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCAobG9zZSksICIxLGYsZyIsIChmbGFncykgfCBGX0ZMT0FULCB2OSB9Ci0jZGVmaW5lIGZtcnJkKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCAobG9zZSksICIxLEIsSCIsIChmbGFncykgfCBGX0ZMT0FULCB2OSB9Ci0jZGVmaW5lIGZtcnJxKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCAobG9zZSksICIxLFIsSiIsIChmbGFncykgfCBGX0ZMT0FULCB2OSB9Ci0KLSNkZWZpbmUgZm1vdnJzKG1vcCwgbWFzaywgZmxhZ3MpIC8qIHY5ICovIFwKLSAgZm1ycnMobW9wLCBGMygyLCAweDM1LCAwKXxPUEZfTE9XNSg1KXxSQ09ORChtYXNrKSwgRjMofjIsIH4weDM1LCAwKXxPUEZfTE9XNSh+NSl8UkNPTkQofihtYXNrKSksIChmbGFncykpIC8qIHY5ICovCi0jZGVmaW5lIGZtb3ZyZChtb3AsIG1hc2ssIGZsYWdzKSAvKiB2OSAqLyBcCi0gIGZtcnJkKG1vcCwgRjMoMiwgMHgzNSwgMCl8T1BGX0xPVzUoNil8UkNPTkQobWFzayksIEYzKH4yLCB+MHgzNSwgMCl8T1BGX0xPVzUofjYpfFJDT05EKH4obWFzaykpLCAoZmxhZ3MpKSAvKiB2OSAqLwotI2RlZmluZSBmbW92cnEobW9wLCBtYXNrLCBmbGFncykgLyogdjkgKi8gXAotICBmbXJycShtb3AsIEYzKDIsIDB4MzUsIDApfE9QRl9MT1c1KDcpfFJDT05EKG1hc2spLCBGMyh+MiwgfjB4MzUsIDApfE9QRl9MT1c1KH43KXxSQ09ORCh+KG1hc2spKSwgKGZsYWdzKSkgLyogdjkgKi8KLQotLyogdjkgKi8gbW92cigibW92cm5lIiwgMHg1LCAwKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJlIiwgMHgxLCAwKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJnZXoiLCAweDcsIDApLAotLyogdjkgKi8gbW92cigibW92cmx6IiwgMHgzLCAwKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJsZXoiLCAweDIsIDApLAotLyogdjkgKi8gbW92cigibW92cmd6IiwgMHg2LCAwKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJueiIsIDB4NSwgRl9BTElBUyksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZyeiIsIDB4MSwgRl9BTElBUyksCi0KLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzbmUiLCAweDUsIDApLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNlIiwgMHgxLCAwKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzZ2V6IiwgMHg3LCAwKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzbHoiLCAweDMsIDApLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNsZXoiLCAweDIsIDApLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNneiIsIDB4NiwgMCksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc256IiwgMHg1LCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzeiIsIDB4MSwgRl9BTElBUyksCi0KLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkbmUiLCAweDUsIDApLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRlIiwgMHgxLCAwKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkZ2V6IiwgMHg3LCAwKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkbHoiLCAweDMsIDApLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRsZXoiLCAweDIsIDApLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRneiIsIDB4NiwgMCksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZG56IiwgMHg1LCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkeiIsIDB4MSwgRl9BTElBUyksCi0KLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxbmUiLCAweDUsIDApLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFlIiwgMHgxLCAwKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxZ2V6IiwgMHg3LCAwKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxbHoiLCAweDMsIDApLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFsZXoiLCAweDIsIDApLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFneiIsIDB4NiwgMCksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycW56IiwgMHg1LCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxeiIsIDB4MSwgRl9BTElBUyksCi0KLSN1bmRlZiBtb3ZyIC8qIHY5ICovCi0jdW5kZWYgZm1vdnIgLyogdjkgKi8KLSN1bmRlZiBmbXJyIC8qIHY5ICovCi0KLSNkZWZpbmUgbW92aWNjKG9wY29kZSwgY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfE1DT05EKGNvbmQsMSl8SUNDLCBGMyh+MiwgfjB4MmMsIH4wKXxNQ09ORCh+Y29uZCx+MSl8WENDfCgxPDwxMSksICJ6LDIsZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAxKXxNQ09ORChjb25kLDEpfElDQywgRjMofjIsIH4weDJjLCB+MSl8TUNPTkQofmNvbmQsfjEpfFhDQ3woMTw8MTEpLCAieixJLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8TUNPTkQoY29uZCwxKXxYQ0MsIEYzKH4yLCB+MHgyYywgfjApfE1DT05EKH5jb25kLH4xKXwoMTw8MTEpLCAgICAgIlosMixkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfE1DT05EKGNvbmQsMSl8WENDLCBGMyh+MiwgfjB4MmMsIH4xKXxNQ09ORCh+Y29uZCx+MSl8KDE8PDExKSwgICAgICJaLEksZCIsIGZsYWdzLCB2OSB9Ci0KLSNkZWZpbmUgbW92ZmNjKG9wY29kZSwgZmNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxGQ0MoMCl8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4wKXxGMyh+MiwgfjB4MmMsIH4wKSwgIjYsMixkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfEZDQygwKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjApfEYzKH4yLCB+MHgyYywgfjEpLCAiNixJLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8RkNDKDEpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+MSl8RjMofjIsIH4weDJjLCB+MCksICI3LDIsZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAxKXxGQ0MoMSl8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4xKXxGMyh+MiwgfjB4MmMsIH4xKSwgIjcsSSxkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfEZDQygyKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjIpfEYzKH4yLCB+MHgyYywgfjApLCAiOCwyLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8RkNDKDIpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+Mil8RjMofjIsIH4weDJjLCB+MSksICI4LEksZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxGQ0MoMyl8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4zKXxGMyh+MiwgfjB4MmMsIH4wKSwgIjksMixkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfEZDQygzKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjMpfEYzKH4yLCB+MHgyYywgfjEpLCAiOSxJLGQiLCBmbGFncywgdjkgfQotCi0jZGVmaW5lIG1vdmNjKG9wY29kZSwgY29uZCwgZmNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCi0gIG1vdmZjYyAob3Bjb2RlLCBmY29uZCwgZmxhZ3MpLCAvKiB2OSAqLyBcCi0gIG1vdmljYyAob3Bjb2RlLCBjb25kLCBmbGFncykgLyogdjkgKi8KLQotLyogdjkgKi8gbW92Y2MgICgibW92YSIsCUNPTkRBLCBGQ09OREEsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92Y2MiLAlDT05EQ0MsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92Z2V1IiwJQ09OREdFVSwgRl9BTElBUyksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZjcyIsCUNPTkRDUywgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZsdSIsCUNPTkRMVSwgRl9BTElBUyksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZlIiwJQ09OREUsIEZDT05ERSwgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZnIiwJQ09OREcsIEZDT05ERywgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZnZSIsCUNPTkRHRSwgRkNPTkRHRSwgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZndSIsCUNPTkRHVSwgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZsIiwJQ09OREwsIEZDT05ETCwgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZsZSIsCUNPTkRMRSwgRkNPTkRMRSwgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZsZXUiLAlDT05ETEVVLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdmxnIiwJRkNPTkRMRywgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZuIiwJQ09ORE4sIEZDT05ETiwgMCksCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZuZSIsCUNPTkRORSwgRkNPTkRORSwgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZuZWciLAlDT05ETkVHLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdm56IiwJQ09ORE5aLCBGQ09ORE5aLCBGX0FMSUFTKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdm8iLAlGQ09ORE8sIDApLAotLyogdjkgKi8gbW92aWNjICgibW92cG9zIiwJQ09ORFBPUywgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1IiwJRkNPTkRVLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdnVlIiwJRkNPTkRVRSwgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1ZyIsCUZDT05EVUcsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92dWdlIiwJRkNPTkRVR0UsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92dWwiLAlGQ09ORFVMLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdnVsZSIsCUZDT05EVUxFLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdnZjIiwJQ09ORFZDLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdnZzIiwJQ09ORFZTLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdnoiLAlDT05EWiwgRkNPTkRaLCBGX0FMSUFTKSwKLQotI3VuZGVmIG1vdmljYyAvKiB2OSAqLwotI3VuZGVmIG1vdmZjYyAvKiB2OSAqLwotI3VuZGVmIG1vdmNjIC8qIHY5ICovCi0KLSNkZWZpbmUgRk1fU0YgMQkJLyogdjkgLSB2YWx1ZXMgZm9yIGZwc2l6ZSAqLwotI2RlZmluZSBGTV9ERiAyCQkvKiB2OSAqLwotI2RlZmluZSBGTV9RRiAzCQkvKiB2OSAqLwotCi0jZGVmaW5lIGZtb3ZpY2Mob3Bjb2RlLCBmcHNpemUsIGNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MTAwK2Zwc2l6ZSl8TUNPTkQoY29uZCwwKSwgIEYzRih+MiwgfjB4MzUsIH4oMHgxMDArZnBzaXplKSl8TUNPTkQofmNvbmQsfjApLCAgInosZixnIiwgZmxhZ3MsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgxODArZnBzaXplKXxNQ09ORChjb25kLDApLCAgRjNGKH4yLCB+MHgzNSwgfigweDE4MCtmcHNpemUpKXxNQ09ORCh+Y29uZCx+MCksICAiWixmLGciLCBmbGFncywgdjkgfQotCi0jZGVmaW5lIGZtb3ZmY2Mob3Bjb2RlLCBmcHNpemUsIGZjb25kLCBmbGFncykgLyogdjkgKi8gXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDAwMCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MDAwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI2LGYsZyIsIGZsYWdzLCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDQwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwNDArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjcsZixnIiwgZmxhZ3MsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwODArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDA4MCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiOCxmLGciLCBmbGFncywgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDBjMCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MGMwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI5LGYsZyIsIGZsYWdzLCB2OSB9Ci0KLS8qIEZJWE1FOiB1c2UgZm1vdmljYy9mbW92ZmNjPyAqLyAvKiB2OSAqLwotI2RlZmluZSBmbW92Y2Mob3Bjb2RlLCBmcHNpemUsIGNvbmQsIGZjb25kLCBmbGFncykgLyogdjkgKi8gXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDEwMCtmcHNpemUpfE1DT05EKGNvbmQsMCksICBGM0YofjIsIH4weDM1LCB+KDB4MTAwK2Zwc2l6ZSkpfE1DT05EKH5jb25kLH4wKSwgICJ6LGYsZyIsIGZsYWdzIHwgRl9GTE9BVCwgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDAwMCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MDAwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI2LGYsZyIsIGZsYWdzIHwgRl9GTE9BVCwgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDE4MCtmcHNpemUpfE1DT05EKGNvbmQsMCksICBGM0YofjIsIH4weDM1LCB+KDB4MTgwK2Zwc2l6ZSkpfE1DT05EKH5jb25kLH4wKSwgICJaLGYsZyIsIGZsYWdzIHwgRl9GTE9BVCwgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDA0MCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MDQwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI3LGYsZyIsIGZsYWdzIHwgRl9GTE9BVCwgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDA4MCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MDgwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI4LGYsZyIsIGZsYWdzIHwgRl9GTE9BVCwgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDBjMCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MGMwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI5LGYsZyIsIGZsYWdzIHwgRl9GTE9BVCwgdjkgfQotCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRhIiwJRk1fREYsIENPTkRBLCBGQ09OREEsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxYSIsCUZNX1FGLCBDT05EQSwgRkNPTkRBLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c2EiLAlGTV9TRiwgQ09OREEsIEZDT05EQSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRjYyIsCUZNX0RGLCBDT05EQ0MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxY2MiLAlGTV9RRiwgQ09ORENDLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2NjIiwJRk1fU0YsIENPTkRDQywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRjcyIsCUZNX0RGLCBDT05EQ1MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxY3MiLAlGTV9RRiwgQ09ORENTLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2NzIiwJRk1fU0YsIENPTkRDUywgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRlIiwJRk1fREYsIENPTkRFLCBGQ09OREUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxZSIsCUZNX1FGLCBDT05ERSwgRkNPTkRFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c2UiLAlGTV9TRiwgQ09OREUsIEZDT05ERSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRnIiwJRk1fREYsIENPTkRHLCBGQ09OREcsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxZyIsCUZNX1FGLCBDT05ERywgRkNPTkRHLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c2ciLAlGTV9TRiwgQ09OREcsIEZDT05ERywgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRnZSIsCUZNX0RGLCBDT05ER0UsIEZDT05ER0UsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxZ2UiLAlGTV9RRiwgQ09OREdFLCBGQ09OREdFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c2dlIiwJRk1fU0YsIENPTkRHRSwgRkNPTkRHRSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRnZXUiLAlGTV9ERiwgQ09OREdFVSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFnZXUiLAlGTV9RRiwgQ09OREdFVSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNnZXUiLAlGTV9TRiwgQ09OREdFVSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRndSIsCUZNX0RGLCBDT05ER1UsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxZ3UiLAlGTV9RRiwgQ09OREdVLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2d1IiwJRk1fU0YsIENPTkRHVSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRsIiwJRk1fREYsIENPTkRMLCBGQ09OREwsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxbCIsCUZNX1FGLCBDT05ETCwgRkNPTkRMLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c2wiLAlGTV9TRiwgQ09OREwsIEZDT05ETCwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRsZSIsCUZNX0RGLCBDT05ETEUsIEZDT05ETEUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxbGUiLAlGTV9RRiwgQ09ORExFLCBGQ09ORExFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c2xlIiwJRk1fU0YsIENPTkRMRSwgRkNPTkRMRSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRsZXUiLAlGTV9ERiwgQ09ORExFVSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFsZXUiLAlGTV9RRiwgQ09ORExFVSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNsZXUiLAlGTV9TRiwgQ09ORExFVSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmRsZyIsCUZNX0RGLCBGQ09ORExHLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cWxnIiwJRk1fUUYsIEZDT05ETEcsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzbGciLAlGTV9TRiwgRkNPTkRMRywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRsdSIsCUZNX0RGLCBDT05ETFUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxbHUiLAlGTV9RRiwgQ09ORExVLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2x1IiwJRk1fU0YsIENPTkRMVSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRuIiwJRk1fREYsIENPTkROLCBGQ09ORE4sIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxbiIsCUZNX1FGLCBDT05ETiwgRkNPTkROLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c24iLAlGTV9TRiwgQ09ORE4sIEZDT05ETiwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRuZSIsCUZNX0RGLCBDT05ETkUsIEZDT05ETkUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxbmUiLAlGTV9RRiwgQ09ORE5FLCBGQ09ORE5FLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c25lIiwJRk1fU0YsIENPTkRORSwgRkNPTkRORSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRuZWciLAlGTV9ERiwgQ09ORE5FRywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFuZWciLAlGTV9RRiwgQ09ORE5FRywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNuZWciLAlGTV9TRiwgQ09ORE5FRywgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmRueiIsCUZNX0RGLCBDT05ETlosIEZDT05ETlosIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxbnoiLAlGTV9RRiwgQ09ORE5aLCBGQ09ORE5aLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c256IiwJRk1fU0YsIENPTkROWiwgRkNPTkROWiwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmRvIiwJRk1fREYsIEZDT05ETywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnFvIiwJRk1fUUYsIEZDT05ETywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnNvIiwJRk1fU0YsIEZDT05ETywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmRwb3MiLAlGTV9ERiwgQ09ORFBPUywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFwb3MiLAlGTV9RRiwgQ09ORFBPUywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnNwb3MiLAlGTV9TRiwgQ09ORFBPUywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmR1IiwJRk1fREYsIEZDT05EVSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1IiwJRk1fUUYsIEZDT05EVSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1IiwJRk1fU0YsIEZDT05EVSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmR1ZSIsCUZNX0RGLCBGQ09ORFVFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cXVlIiwJRk1fUUYsIEZDT05EVUUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdWUiLAlGTV9TRiwgRkNPTkRVRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmR1ZyIsCUZNX0RGLCBGQ09ORFVHLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cXVnIiwJRk1fUUYsIEZDT05EVUcsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdWciLAlGTV9TRiwgRkNPTkRVRywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmR1Z2UiLAlGTV9ERiwgRkNPTkRVR0UsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdWdlIiwJRk1fUUYsIEZDT05EVUdFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c3VnZSIsCUZNX1NGLCBGQ09ORFVHRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmR1bCIsCUZNX0RGLCBGQ09ORFVMLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cXVsIiwJRk1fUUYsIEZDT05EVUwsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdWwiLAlGTV9TRiwgRkNPTkRVTCwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdmR1bGUiLAlGTV9ERiwgRkNPTkRVTEUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdWxlIiwJRk1fUUYsIEZDT05EVUxFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c3VsZSIsCUZNX1NGLCBGQ09ORFVMRSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmR2YyIsCUZNX0RGLCBDT05EVkMsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxdmMiLAlGTV9RRiwgQ09ORFZDLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c3ZjIiwJRk1fU0YsIENPTkRWQywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdmR2cyIsCUZNX0RGLCBDT05EVlMsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZxdnMiLAlGTV9RRiwgQ09ORFZTLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c3ZzIiwJRk1fU0YsIENPTkRWUywgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdmR6IiwJRk1fREYsIENPTkRaLCBGQ09ORFosIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZxeiIsCUZNX1FGLCBDT05EWiwgRkNPTkRaLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92c3oiLAlGTV9TRiwgQ09ORFosIEZDT05EWiwgRl9BTElBUyksCi0KLSN1bmRlZiBmbW92aWNjIC8qIHY5ICovCi0jdW5kZWYgZm1vdmZjYyAvKiB2OSAqLwotI3VuZGVmIGZtb3ZjYyAvKiB2OSAqLwotI3VuZGVmIEZNX0RGIC8qIHY5ICovCi0jdW5kZWYgRk1fUUYgLyogdjkgKi8KLSN1bmRlZiBGTV9TRiAvKiB2OSAqLwotCi0vKiBDb3Byb2Nlc3NvciBicmFuY2hlcy4gICovCi0jZGVmaW5lIENCUihvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzLCBhcmNoKSBcCi0geyBvcGNvZGUsIChtYXNrKSwgQU5OVUx8KGxvc2UpLCAibCIsICAgIGZsYWdzfEZfREVMQVlFRCwgYXJjaCB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxBTk5VTCwgKGxvc2UpLCAiLGEgbCIsIGZsYWdzfEZfREVMQVlFRCwgYXJjaCB9Ci0KLS8qIEZsb2F0aW5nIHBvaW50IGJyYW5jaGVzLiAgKi8KLSNkZWZpbmUgRkJSKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIFwKLSB7IG9wY29kZSwgKG1hc2spLCBBTk5VTHwobG9zZSksICJsIiwgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2NiB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxBTk5VTCwgKGxvc2UpLCAiLGEgbCIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjYgfQotCi0vKiBWOSBleHRlbmRlZCBmbG9hdGluZyBwb2ludCBicmFuY2hlcy4gICovCi0jZGVmaW5lIEZCUlgob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCBGQkZDQygwKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4wKXwobG9zZSksICI2LEciLCAgICAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygwKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4wKXwobG9zZSksICIsVCA2LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygwKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4wKXwobG9zZSksICIsYSA2LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygwKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4wKXwobG9zZSksICIsYSxUIDYsRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygwKXwobWFzayksIEFOTlVMfEJQUkVEfEZCRkNDKH4wKXwobG9zZSksICIsTiA2LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygwKXwobWFzayl8QU5OVUwsIEJQUkVEfEZCRkNDKH4wKXwobG9zZSksICIsYSxOIDYsRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygxKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4xKXwobG9zZSksICI3LEciLCAgICAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygxKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4xKXwobG9zZSksICIsVCA3LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygxKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4xKXwobG9zZSksICIsYSA3LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygxKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4xKXwobG9zZSksICIsYSxUIDcsRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygxKXwobWFzayksIEFOTlVMfEJQUkVEfEZCRkNDKH4xKXwobG9zZSksICIsTiA3LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygxKXwobWFzayl8QU5OVUwsIEJQUkVEfEZCRkNDKH4xKXwobG9zZSksICIsYSxOIDcsRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygyKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4yKXwobG9zZSksICI4LEciLCAgICAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygyKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4yKXwobG9zZSksICIsVCA4LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygyKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4yKXwobG9zZSksICIsYSA4LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygyKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4yKXwobG9zZSksICIsYSxUIDgsRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygyKXwobWFzayksIEFOTlVMfEJQUkVEfEZCRkNDKH4yKXwobG9zZSksICIsTiA4LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygyKXwobWFzayl8QU5OVUwsIEJQUkVEfEZCRkNDKH4yKXwobG9zZSksICIsYSxOIDgsRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygzKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4zKXwobG9zZSksICI5LEciLCAgICAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygzKXwobWFzayl8QlBSRUQsIEFOTlVMfEZCRkNDKH4zKXwobG9zZSksICIsVCA5LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygzKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4zKXwobG9zZSksICIsYSA5LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygzKXwobWFzayl8QlBSRUR8QU5OVUwsIEZCRkNDKH4zKXwobG9zZSksICIsYSxUIDksRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygzKXwobWFzayksIEFOTlVMfEJQUkVEfEZCRkNDKH4zKXwobG9zZSksICIsTiA5LEciLCAgIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfSwgXAotIHsgb3Bjb2RlLCBGQkZDQygzKXwobWFzayl8QU5OVUwsIEJQUkVEfEZCRkNDKH4zKXwobG9zZSksICIsYSxOIDksRyIsIGZsYWdzfEZfREVMQVlFRHxGX0ZCUiwgdjkgfQotCi0vKiB2OTogV2UgbXVzdCBwdXQgYEZCUlgnIGJlZm9yZSBgRkJSJywgdG8gZW5zdXJlIHRoYXQgd2UgbmV2ZXIgbWF0Y2gKLSAgIHY5OiBzb21ldGhpbmcgYWdhaW5zdCBhbiBleHByZXNzaW9uIHVubGVzcyBpdCBpcyBhbiBleHByZXNzaW9uLiAgT3RoZXJ3aXNlLAotICAgdjk6IHdlIGVuZCB1cCB3aXRoIHVuZGVmaW5lZCBzeW1ib2wgdGFibGVzIGVudHJpZXMsIGJlY2F1c2UgdGhleSBnZXQgYWRkZWQsCi0gICB2OTogYnV0IGFyZSBub3QgZGVsZXRlZCBpZiB0aGUgcGF0dGVybiBmYWlscyB0byBtYXRjaC4gICovCi0KLSNkZWZpbmUgQ09OREZDKGZvcCwgY29wLCBtYXNrLCBmbGFncykgXAotICBGQlJYKGZvcCwgRjIoMCwgNSl8Q09ORChtYXNrKSwgRjIofjAsIH41KXxDT05EKH4obWFzaykpLCBmbGFncyksIC8qIHY5ICovIFwKLSAgRkJSKGZvcCwgRjIoMCwgNil8Q09ORChtYXNrKSwgRjIofjAsIH42KXxDT05EKH4obWFzaykpLCBmbGFncyksIFwKLSAgQ0JSKGNvcCwgRjIoMCwgNyl8Q09ORChtYXNrKSwgRjIofjAsIH43KXxDT05EKH4obWFzaykpLCBmbGFncywgdjZub3RsZXQpCi0KLSNkZWZpbmUgQ09OREZDTChmb3AsIGNvcCwgbWFzaywgZmxhZ3MpIFwKLSAgRkJSWChmb3AsIEYyKDAsIDUpfENPTkQobWFzayksIEYyKH4wLCB+NSl8Q09ORCh+KG1hc2spKSwgZmxhZ3MpLCAvKiB2OSAqLyBcCi0gIEZCUihmb3AsIEYyKDAsIDYpfENPTkQobWFzayksIEYyKH4wLCB+Nil8Q09ORCh+KG1hc2spKSwgZmxhZ3MpLCBcCi0gIENCUihjb3AsIEYyKDAsIDcpfENPTkQobWFzayksIEYyKH4wLCB+Nyl8Q09ORCh+KG1hc2spKSwgZmxhZ3MsIHY2KQotCi0jZGVmaW5lIENPTkRGKGZvcCwgbWFzaywgZmxhZ3MpIFwKLSAgRkJSWChmb3AsIEYyKDAsIDUpfENPTkQobWFzayksIEYyKH4wLCB+NSl8Q09ORCh+KG1hc2spKSwgZmxhZ3MpLCAvKiB2OSAqLyBcCi0gIEZCUihmb3AsIEYyKDAsIDYpfENPTkQobWFzayksIEYyKH4wLCB+Nil8Q09ORCh+KG1hc2spKSwgZmxhZ3MpCi0KLUNPTkRGQyAgKCJmYiIsICAgICJjYiIsICAgIDB4OCwgMCksCi1DT05ERkNMICgiZmJhIiwJICAiY2JhIiwgICAweDgsIEZfQUxJQVMpLAotQ09OREZDICAoImZiZSIsCSAgImNiMCIsICAgMHg5LCAwKSwKLUNPTkRGICAgKCJmYnoiLCAgICAgICAgICAgIDB4OSwgRl9BTElBUyksCi1DT05ERkMgICgiZmJnIiwJICAiY2IyIiwgICAweDYsIDApLAotQ09OREZDICAoImZiZ2UiLCAgImNiMDIiLCAgMHhiLCAwKSwKLUNPTkRGQyAgKCJmYmwiLAkgICJjYjEiLCAgIDB4NCwgMCksCi1DT05ERkMgICgiZmJsZSIsICAiY2IwMSIsICAweGQsIDApLAotQ09OREZDICAoImZibGciLCAgImNiMTIiLCAgMHgyLCAwKSwKLUNPTkRGQ0wgKCJmYm4iLAkgICJjYm4iLCAgIDB4MCwgMCksCi1DT05ERkMgICgiZmJuZSIsICAiY2IxMjMiLCAweDEsIDApLAotQ09OREYgICAoImZibnoiLCAgICAgICAgICAgMHgxLCBGX0FMSUFTKSwKLUNPTkRGQyAgKCJmYm8iLAkgICJjYjAxMiIsIDB4ZiwgMCksCi1DT05ERkMgICgiZmJ1IiwJICAiY2IzIiwgICAweDcsIDApLAotQ09OREZDICAoImZidWUiLCAgImNiMDMiLCAgMHhhLCAwKSwKLUNPTkRGQyAgKCJmYnVnIiwgICJjYjIzIiwgIDB4NSwgMCksCi1DT05ERkMgICgiZmJ1Z2UiLCAiY2IwMjMiLCAweGMsIDApLAotQ09OREZDICAoImZidWwiLCAgImNiMTMiLCAgMHgzLCAwKSwKLUNPTkRGQyAgKCJmYnVsZSIsICJjYjAxMyIsIDB4ZSwgMCksCi0KLSN1bmRlZiBDT05ERkMKLSN1bmRlZiBDT05ERkNMCi0jdW5kZWYgQ09OREYKLSN1bmRlZiBDQlIKLSN1bmRlZiBGQlIKLSN1bmRlZiBGQlJYCS8qIHY5ICovCi0KLXsgImptcCIsCUYzKDIsIDB4MzgsIDApLCBGMyh+MiwgfjB4MzgsIH4wKXxSRF9HMHxBU0kofjApLAkiMSsyIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErcnMyLCVnMCAqLwoteyAiam1wIiwJRjMoMiwgMHgzOCwgMCksIEYzKH4yLCB+MHgzOCwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKyVnMCwlZzAgKi8KLXsgImptcCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRF9HMCwJCSIxK2kiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMStpLCVnMCAqLwoteyAiam1wIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpfFJEX0cwLAkJImkrMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgaStyczEsJWcwICovCi17ICJqbXAiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8UkRfRzB8UlMxX0cwLAkJImkiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsICVnMCtpLCVnMCAqLwoteyAiam1wIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErMCwlZzAgKi8KLQoteyAibm9wIiwJRjIoMCwgNCksIDB4ZmVmZmZmZmYsICIiLCAwLCB2NiB9LCAvKiBzZXRoaSAwLCAlZzAgKi8KLQoteyAic2V0IiwJRjIoMHgwLCAweDQpLCBGMih+MHgwLCB+MHg0KSwgIlMwLGQiLCBGX0FMSUFTLCB2NiB9LAoteyAic2V0dXciLAlGMigweDAsIDB4NCksIEYyKH4weDAsIH4weDQpLCAiUzAsZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJzZXRzdyIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJTMCxkIiwgRl9BTElBUywgdjkgfSwKLXsgInNldHgiLAlGMigweDAsIDB4NCksIEYyKH4weDAsIH4weDQpLCAiUzAsMSxkIiwgRl9BTElBUywgdjkgfSwKLQoteyAic2V0aGkiLAlGMigweDAsIDB4NCksIEYyKH4weDAsIH4weDQpLCAiaCxkIiwgMCwgdjYgfSwKLQoteyAidGFkZGNjIiwJRjMoMiwgMHgyMCwgMCksIEYzKH4yLCB+MHgyMCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ0YWRkY2MiLAlGMygyLCAweDIwLCAxKSwgRjMofjIsIH4weDIwLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAidGFkZGNjIiwJRjMoMiwgMHgyMCwgMSksIEYzKH4yLCB+MHgyMCwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLXsgInRhZGRjY3R2IiwJRjMoMiwgMHgyMiwgMCksIEYzKH4yLCB+MHgyMiwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ0YWRkY2N0diIsCUYzKDIsIDB4MjIsIDEpLCBGMyh+MiwgfjB4MjIsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ0YWRkY2N0diIsCUYzKDIsIDB4MjIsIDEpLCBGMyh+MiwgfjB4MjIsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLXsgInRzdWJjYyIsCUYzKDIsIDB4MjEsIDApLCBGMyh+MiwgfjB4MjEsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAidHN1YmNjIiwJRjMoMiwgMHgyMSwgMSksIEYzKH4yLCB+MHgyMSwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInRzdWJjY3R2IiwJRjMoMiwgMHgyMywgMCksIEYzKH4yLCB+MHgyMywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ0c3ViY2N0diIsCUYzKDIsIDB4MjMsIDEpLCBGMyh+MiwgfjB4MjMsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLXsgInVuaW1wIiwJRjIoMHgwLCAweDApLCAweGZmYzAwMDAwLCAibiIsIDAsIHY2bm90djkgfSwKLXsgImlsbHRyYXAiLAlGMigwLCAwKSwgRjIofjAsIH4wKXxSRF9HMCwgIm4iLCAwLCB2OSB9LAotCi0vKiBUaGlzICppcyogYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCi17ICJ4bm9yIiwJRjMoMiwgMHgwNywgMCksIEYzKH4yLCB+MHgwNywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ4bm9yIiwJRjMoMiwgMHgwNywgMSksIEYzKH4yLCB+MHgwNywgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInhub3IiLAlGMygyLCAweDA3LCAxKSwgRjMofjIsIH4weDA3LCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotLyogVGhpcyAqaXMqIGEgY29tbXV0YXRpdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyAieG5vcmNjIiwJRjMoMiwgMHgxNywgMCksIEYzKH4yLCB+MHgxNywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ4bm9yY2MiLAlGMygyLCAweDE3LCAxKSwgRjMofjIsIH4weDE3LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAieG5vcmNjIiwJRjMoMiwgMHgxNywgMSksIEYzKH4yLCB+MHgxNywgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLXsgInhvciIsCUYzKDIsIDB4MDMsIDApLCBGMyh+MiwgfjB4MDMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAieG9yIiwJRjMoMiwgMHgwMywgMSksIEYzKH4yLCB+MHgwMywgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInhvciIsCUYzKDIsIDB4MDMsIDEpLCBGMyh+MiwgfjB4MDMsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi17ICJ4b3JjYyIsCUYzKDIsIDB4MTMsIDApLCBGMyh+MiwgfjB4MTMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAieG9yY2MiLAlGMygyLCAweDEzLCAxKSwgRjMofjIsIH4weDEzLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAieG9yY2MiLAlGMygyLCAweDEzLCAxKSwgRjMofjIsIH4weDEzLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAotCi17ICJub3QiLAlGMygyLCAweDA3LCAwKSwgRjMofjIsIH4weDA3LCB+MCl8QVNJKH4wKSwgIjEsZCIsIEZfQUxJQVMsIHY2IH0sIC8qIHhub3IgcnMxLCUwLHJkICovCi17ICJub3QiLAlGMygyLCAweDA3LCAwKSwgRjMofjIsIH4weDA3LCB+MCl8QVNJKH4wKSwgInIiLCBGX0FMSUFTLCB2NiB9LCAvKiB4bm9yIHJkLCUwLHJkICovCi0KLXsgImJ0b2ciLAlGMygyLCAweDAzLCAwKSwgRjMofjIsIH4weDAzLCB+MCl8QVNJKH4wKSwJIjIsciIsIEZfQUxJQVMsIHY2IH0sIC8qIHhvciByZCxyczIscmQgKi8KLXsgImJ0b2ciLAlGMygyLCAweDAzLCAxKSwgRjMofjIsIH4weDAzLCB+MSksCQkiaSxyIiwgRl9BTElBUywgdjYgfSwgLyogeG9yIHJkLGkscmQgKi8KLQotLyogRlBvcDEgYW5kIEZQb3AyIGFyZSBub3QgaW5zdHJ1Y3Rpb25zLiAgRG9uJ3QgYWNjZXB0IHRoZW0uICAqLwotCi17ICJmZHRvaSIsCUYzRigyLCAweDM0LCAweDBkMiksIEYzRih+MiwgfjB4MzQsIH4weDBkMil8UlMxX0cwLCAiQixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZzdG9pIiwJRjNGKDIsIDB4MzQsIDB4MGQxKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGQxKXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZnF0b2kiLAlGM0YoMiwgMHgzNCwgMHgwZDMpLCBGM0YofjIsIH4weDM0LCB+MHgwZDMpfFJTMV9HMCwgIlIsZyIsIEZfRkxPQVQsIHY4IH0sCi0KLXsgImZkdG94IiwJRjNGKDIsIDB4MzQsIDB4MDgyKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDgyKXxSUzFfRzAsICJCLGciLCBGX0ZMT0FULCB2OSB9LAoteyAiZnN0b3giLAlGM0YoMiwgMHgzNCwgMHgwODEpLCBGM0YofjIsIH4weDM0LCB+MHgwODEpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY5IH0sCi17ICJmcXRveCIsCUYzRigyLCAweDM0LCAweDA4MyksIEYzRih+MiwgfjB4MzQsIH4weDA4Myl8UlMxX0cwLCAiUixnIiwgRl9GTE9BVCwgdjkgfSwKLQoteyAiZml0b2QiLAlGM0YoMiwgMHgzNCwgMHgwYzgpLCBGM0YofjIsIH4weDM0LCB+MHgwYzgpfFJTMV9HMCwgImYsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmaXRvcyIsCUYzRigyLCAweDM0LCAweDBjNCksIEYzRih+MiwgfjB4MzQsIH4weDBjNCl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZpdG9xIiwJRjNGKDIsIDB4MzQsIDB4MGNjKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGNjKXxSUzFfRzAsICJmLEoiLCBGX0ZMT0FULCB2OCB9LAotCi17ICJmeHRvZCIsCUYzRigyLCAweDM0LCAweDA4OCksIEYzRih+MiwgfjB4MzQsIH4weDA4OCl8UlMxX0cwLCAiZixIIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZ4dG9zIiwJRjNGKDIsIDB4MzQsIDB4MDg0KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDg0KXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2OSB9LAoteyAiZnh0b3EiLAlGM0YoMiwgMHgzNCwgMHgwOGMpLCBGM0YofjIsIH4weDM0LCB+MHgwOGMpfFJTMV9HMCwgImYsSiIsIEZfRkxPQVQsIHY5IH0sCi0KLXsgImZkdG9xIiwJRjNGKDIsIDB4MzQsIDB4MGNlKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGNlKXxSUzFfRzAsICJCLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZmR0b3MiLAlGM0YoMiwgMHgzNCwgMHgwYzYpLCBGM0YofjIsIH4weDM0LCB+MHgwYzYpfFJTMV9HMCwgIkIsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmcXRvZCIsCUYzRigyLCAweDM0LCAweDBjYiksIEYzRih+MiwgfjB4MzQsIH4weDBjYil8UlMxX0cwLCAiUixIIiwgRl9GTE9BVCwgdjggfSwKLXsgImZxdG9zIiwJRjNGKDIsIDB4MzQsIDB4MGM3KSwgRjNGKH4yLCB+MHgzNCwgfjB4MGM3KXxSUzFfRzAsICJSLGciLCBGX0ZMT0FULCB2OCB9LAoteyAiZnN0b2QiLAlGM0YoMiwgMHgzNCwgMHgwYzkpLCBGM0YofjIsIH4weDM0LCB+MHgwYzkpfFJTMV9HMCwgImYsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmc3RvcSIsCUYzRigyLCAweDM0LCAweDBjZCksIEYzRih+MiwgfjB4MzQsIH4weDBjZCl8UlMxX0cwLCAiZixKIiwgRl9GTE9BVCwgdjggfSwKLQoteyAiZmRpdmQiLAlGM0YoMiwgMHgzNCwgMHgwNGUpLCBGM0YofjIsIH4weDM0LCB+MHgwNGUpLCAidixCLEgiLCBGX0ZMT0FULCB2NiB9LAoteyAiZmRpdnEiLAlGM0YoMiwgMHgzNCwgMHgwNGYpLCBGM0YofjIsIH4weDM0LCB+MHgwNGYpLCAiVixSLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZmRpdngiLAlGM0YoMiwgMHgzNCwgMHgwNGYpLCBGM0YofjIsIH4weDM0LCB+MHgwNGYpLCAiVixSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmZGl2cyIsCUYzRigyLCAweDM0LCAweDA0ZCksIEYzRih+MiwgfjB4MzQsIH4weDA0ZCksICJlLGYsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmbXVsZCIsCUYzRigyLCAweDM0LCAweDA0YSksIEYzRih+MiwgfjB4MzQsIH4weDA0YSksICJ2LEIsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmbXVscSIsCUYzRigyLCAweDM0LCAweDA0YiksIEYzRih+MiwgfjB4MzQsIH4weDA0YiksICJWLFIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmbXVseCIsCUYzRigyLCAweDM0LCAweDA0YiksIEYzRih+MiwgfjB4MzQsIH4weDA0YiksICJWLFIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZtdWxzIiwJRjNGKDIsIDB4MzQsIDB4MDQ5KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQ5KSwgImUsZixnIiwgRl9GTE9BVCwgdjYgfSwKLQoteyAiZmRtdWxxIiwJRjNGKDIsIDB4MzQsIDB4MDZlKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDZlKSwgInYsQixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZkbXVseCIsCUYzRigyLCAweDM0LCAweDA2ZSksIEYzRih+MiwgfjB4MzQsIH4weDA2ZSksICJ2LEIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZzbXVsZCIsCUYzRigyLCAweDM0LCAweDA2OSksIEYzRih+MiwgfjB4MzQsIH4weDA2OSksICJlLGYsSCIsIEZfRkxPQVQsIHY4IH0sCi0KLXsgImZzcXJ0ZCIsCUYzRigyLCAweDM0LCAweDAyYSksIEYzRih+MiwgfjB4MzQsIH4weDAyYSl8UlMxX0cwLCAiQixIIiwgRl9GTE9BVCwgdjcgfSwKLXsgImZzcXJ0cSIsCUYzRigyLCAweDM0LCAweDAyYiksIEYzRih+MiwgfjB4MzQsIH4weDAyYil8UlMxX0cwLCAiUixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZzcXJ0eCIsCUYzRigyLCAweDM0LCAweDAyYiksIEYzRih+MiwgfjB4MzQsIH4weDAyYil8UlMxX0cwLCAiUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZnNxcnRzIiwJRjNGKDIsIDB4MzQsIDB4MDI5KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDI5KXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NyB9LAotCi17ICJmYWJzZCIsCUYzRigyLCAweDM0LCAweDAwYSksIEYzRih+MiwgfjB4MzQsIH4weDAwYSl8UlMxX0cwLCAiQixIIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZhYnNxIiwJRjNGKDIsIDB4MzQsIDB4MDBiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDBiKXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmFic3giLAlGM0YoMiwgMHgzNCwgMHgwMGIpLCBGM0YofjIsIH4weDM0LCB+MHgwMGIpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZhYnNzIiwJRjNGKDIsIDB4MzQsIDB4MDA5KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDA5KXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZm1vdmQiLAlGM0YoMiwgMHgzNCwgMHgwMDIpLCBGM0YofjIsIH4weDM0LCB+MHgwMDIpfFJTMV9HMCwgIkIsSCIsIEZfRkxPQVQsIHY5IH0sCi17ICJmbW92cSIsCUYzRigyLCAweDM0LCAweDAwMyksIEYzRih+MiwgfjB4MzQsIH4weDAwMyl8UlMxX0cwLCAiUixKIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZtb3Z4IiwJRjNGKDIsIDB4MzQsIDB4MDAzKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDAzKXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmbW92cyIsCUYzRigyLCAweDM0LCAweDAwMSksIEYzRih+MiwgfjB4MzQsIH4weDAwMSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZuZWdkIiwJRjNGKDIsIDB4MzQsIDB4MDA2KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDA2KXxSUzFfRzAsICJCLEgiLCBGX0ZMT0FULCB2OSB9LAoteyAiZm5lZ3EiLAlGM0YoMiwgMHgzNCwgMHgwMDcpLCBGM0YofjIsIH4weDM0LCB+MHgwMDcpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmbmVneCIsCUYzRigyLCAweDM0LCAweDAwNyksIEYzRih+MiwgfjB4MzQsIH4weDAwNyl8UlMxX0cwLCAiUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZm5lZ3MiLAlGM0YoMiwgMHgzNCwgMHgwMDUpLCBGM0YofjIsIH4weDM0LCB+MHgwMDUpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY2IH0sCi0KLXsgImZhZGRkIiwJRjNGKDIsIDB4MzQsIDB4MDQyKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQyKSwgInYsQixIIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZhZGRxIiwJRjNGKDIsIDB4MzQsIDB4MDQzKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQzKSwgIlYsUixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZhZGR4IiwJRjNGKDIsIDB4MzQsIDB4MDQzKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQzKSwgIlYsUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZmFkZHMiLAlGM0YoMiwgMHgzNCwgMHgwNDEpLCBGM0YofjIsIH4weDM0LCB+MHgwNDEpLCAiZSxmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZnN1YmQiLAlGM0YoMiwgMHgzNCwgMHgwNDYpLCBGM0YofjIsIH4weDM0LCB+MHgwNDYpLCAidixCLEgiLCBGX0ZMT0FULCB2NiB9LAoteyAiZnN1YnEiLAlGM0YoMiwgMHgzNCwgMHgwNDcpLCBGM0YofjIsIH4weDM0LCB+MHgwNDcpLCAiVixSLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZnN1YngiLAlGM0YoMiwgMHgzNCwgMHgwNDcpLCBGM0YofjIsIH4weDM0LCB+MHgwNDcpLCAiVixSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmc3VicyIsCUYzRigyLCAweDM0LCAweDA0NSksIEYzRih+MiwgfjB4MzQsIH4weDA0NSksICJlLGYsZyIsIEZfRkxPQVQsIHY2IH0sCi0KLSNkZWZpbmUgQ01QRkNDKHgpCSgoKHgpJjB4Myk8PDI1KQotCi17ICJmY21wZCIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTIpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Mil8UkRfRzAsICAidixCIiwgICBGX0ZMT0FULCB2NiB9LAoteyAiZmNtcGQiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDUyKSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTIpLAkgIjYsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBkIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1MiksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDUyKSwJICI3LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZCIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTIpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1MiksCSAiOCx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGQiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDUyKSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTIpLAkgIjksdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlZCIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTYpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Nil8UkRfRzAsICAidixCIiwgICBGX0ZMT0FULCB2NiB9LAoteyAiZmNtcGVkIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1NiksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDU2KSwJICI2LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZWQiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDU2KSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTYpLAkgIjcsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlZCIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTYpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1NiksCSAiOCx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVkIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1NiksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDU2KSwJICI5LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcSIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTMpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Myl8UkRfRzAsCSAiVixSIiwgRl9GTE9BVCwgdjggfSwKLXsgImZjbXBxIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI2LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcSIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiNyxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHEiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjgsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBxIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI5LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXEiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDU3KSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTcpfFJEX0cwLAkgIlYsUiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmY21wZXEiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjYsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcSIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiNyxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVxIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI4LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXEiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjksVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXB4IiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1MyksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDUzKXxSRF9HMCwJICJWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmY21weCIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiNixWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21weCIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiNyxWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21weCIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiOCxWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21weCIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiOSxWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21wZXgiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDU3KSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTcpfFJEX0cwLAkgIlYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZjbXBleCIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiNixWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21wZXgiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjcsVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcGV4IiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI4LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXBleCIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiOSxWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21wcyIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTEpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1MSl8UkRfRzAsICJlLGYiLCAgIEZfRkxPQVQsIHY2IH0sCi17ICJmY21wcyIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTEpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1MSksCSAiNixlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHMiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDUxKSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTEpLAkgIjcsZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBzIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1MSksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDUxKSwJICI4LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcyIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTEpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1MSksCSAiOSxlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVzIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1NSksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDU1KXxSRF9HMCwgImUsZiIsICAgRl9GTE9BVCwgdjYgfSwKLXsgImZjbXBlcyIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTUpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1NSksCSAiNixlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVzIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1NSksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDU1KSwJICI3LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXMiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDU1KSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTUpLAkgIjgsZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcyIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTUpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1NSksCSAiOSxlLGYiLCBGX0ZMT0FULCB2OSB9LAotCi0vKiBUaGVzZSBFeHRlbmRlZCBGUG9wIChGSUZPKSBpbnN0cnVjdGlvbnMgYXJlIG5ldyBpbiB0aGUgRnVqaXRzdQotICAgTUI4NjkzNCwgcmVwbGFjaW5nIHRoZSBDUG9wIGluc3RydWN0aW9ucyBmcm9tIHY2IGFuZCBsYXRlcgotICAgcHJvY2Vzc29ycy4gICovCi0KLSNkZWZpbmUgRUZQT1AxXzIobmFtZSwgb3AsIGFyZ3MpIHsgbmFtZSwgRjNGKDIsIDB4MzYsIG9wKSwgRjNGKH4yLCB+MHgzNiwgfm9wKXxSUzFfRzAsIGFyZ3MsIDAsIHNwYXJjbGl0ZSB9Ci0jZGVmaW5lIEVGUE9QMV8zKG5hbWUsIG9wLCBhcmdzKSB7IG5hbWUsIEYzRigyLCAweDM2LCBvcCksIEYzRih+MiwgfjB4MzYsIH5vcCksICAgICAgICBhcmdzLCAwLCBzcGFyY2xpdGUgfQotI2RlZmluZSBFRlBPUDJfMihuYW1lLCBvcCwgYXJncykgeyBuYW1lLCBGM0YoMiwgMHgzNywgb3ApLCBGM0YofjIsIH4weDM3LCB+b3ApfFJEX0cwLCAgYXJncywgMCwgc3BhcmNsaXRlIH0KLQotRUZQT1AxXzIgKCJlZml0b2QiLAkweDBjOCwgImYsSCIpLAotRUZQT1AxXzIgKCJlZml0b3MiLAkweDBjNCwgImYsZyIpLAotRUZQT1AxXzIgKCJlZmR0b2kiLAkweDBkMiwgIkIsZyIpLAotRUZQT1AxXzIgKCJlZnN0b2kiLAkweDBkMSwgImYsZyIpLAotRUZQT1AxXzIgKCJlZnN0b2QiLAkweDBjOSwgImYsSCIpLAotRUZQT1AxXzIgKCJlZmR0b3MiLAkweDBjNiwgIkIsZyIpLAotRUZQT1AxXzIgKCJlZm1vdnMiLAkweDAwMSwgImYsZyIpLAotRUZQT1AxXzIgKCJlZm5lZ3MiLAkweDAwNSwgImYsZyIpLAotRUZQT1AxXzIgKCJlZmFic3MiLAkweDAwOSwgImYsZyIpLAotRUZQT1AxXzIgKCJlZnNxcnRkIiwJMHgwMmEsICJCLEgiKSwKLUVGUE9QMV8yICgiZWZzcXJ0cyIsCTB4MDI5LCAiZixnIiksCi1FRlBPUDFfMyAoImVmYWRkZCIsCTB4MDQyLCAidixCLEgiKSwKLUVGUE9QMV8zICgiZWZhZGRzIiwJMHgwNDEsICJlLGYsZyIpLAotRUZQT1AxXzMgKCJlZnN1YmQiLAkweDA0NiwgInYsQixIIiksCi1FRlBPUDFfMyAoImVmc3VicyIsCTB4MDQ1LCAiZSxmLGciKSwKLUVGUE9QMV8zICgiZWZkaXZkIiwJMHgwNGUsICJ2LEIsSCIpLAotRUZQT1AxXzMgKCJlZmRpdnMiLAkweDA0ZCwgImUsZixnIiksCi1FRlBPUDFfMyAoImVmbXVsZCIsCTB4MDRhLCAidixCLEgiKSwKLUVGUE9QMV8zICgiZWZtdWxzIiwJMHgwNDksICJlLGYsZyIpLAotRUZQT1AxXzMgKCJlZnNtdWxkIiwJMHgwNjksICJlLGYsSCIpLAotRUZQT1AyXzIgKCJlZmNtcGQiLAkweDA1MiwgInYsQiIpLAotRUZQT1AyXzIgKCJlZmNtcGVkIiwJMHgwNTYsICJ2LEIiKSwKLUVGUE9QMl8yICgiZWZjbXBzIiwJMHgwNTEsICJlLGYiKSwKLUVGUE9QMl8yICgiZWZjbXBlcyIsCTB4MDU1LCAiZSxmIiksCi0KLSN1bmRlZiBFRlBPUDFfMgotI3VuZGVmIEVGUE9QMV8zCi0jdW5kZWYgRUZQT1AyXzIKLQotLyogVGhlc2UgYXJlIG1hcmtlZCBGX0FMSUFTLCBzbyB0aGF0IHRoZXkgd29uJ3QgY29uZmxpY3Qgd2l0aCBzcGFyY2xpdGUgaW5zbnMKLSAgIHByZXNlbnQuICBPdGhlcndpc2UsIHRoZSBGX0FMSUFTIGZsYWcgaXMgaWdub3JlZC4gICovCi17ICJjcG9wMSIsCUYzKDIsIDB4MzYsIDApLCBGMyh+MiwgfjB4MzYsIH4xKSwgIlsxKzJdLGQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sCi17ICJjcG9wMiIsCUYzKDIsIDB4MzcsIDApLCBGMyh+MiwgfjB4MzcsIH4xKSwgIlsxKzJdLGQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sCi0KLS8qIHNwYXJjbGV0IHNwZWNpZmljIGluc25zICovCi0KLUNPTU1VVEVPUCAoInVtYWMiLCAweDNlLCBzcGFyY2xldCksCi1DT01NVVRFT1AgKCJzbWFjIiwgMHgzZiwgc3BhcmNsZXQpLAotQ09NTVVURU9QICgidW1hY2QiLCAweDJlLCBzcGFyY2xldCksCi1DT01NVVRFT1AgKCJzbWFjZCIsIDB4MmYsIHNwYXJjbGV0KSwKLUNPTU1VVEVPUCAoInVtdWxkIiwgMHgwOSwgc3BhcmNsZXQpLAotQ09NTVVURU9QICgic211bGQiLCAweDBkLCBzcGFyY2xldCksCi0KLXsgInNodWZmbGUiLAlGMygyLCAweDJkLCAwKSwgRjMofjIsIH4weDJkLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgc3BhcmNsZXQgfSwKLXsgInNodWZmbGUiLAlGMygyLCAweDJkLCAxKSwgRjMofjIsIH4weDJkLCB+MSksCQkiMSxpLGQiLCAwLCBzcGFyY2xldCB9LAotCi0vKiBUaGUgbWFudWFsIGlzbid0IGNvbXBsZXRlbHkgYWNjdXJhdGUgb24gdGhlc2UgaW5zbnMuICBUaGUgYHJzMicgZmllbGQgaXMKLSAgIHRyZWF0ZWQgYXMgYmVpbmcgNiBiaXRzIHRvIGFjY291bnQgZm9yIDYgYml0IGltbWVkaWF0ZXMgdG8gY3B1c2guICBJdCBpcwotICAgYXNzdW1lZCB0aGF0IGl0IGlzIGludGVuZGVkIHRoYXQgYml0IDUgaXMgMCB3aGVuIHJzMiBjb250YWlucyBhIHJlZy4gICovCi0jZGVmaW5lIEJJVDUgKDE8PDUpCi17ICJjcmRjeHQiLAlGMygyLCAweDM2LCAwKXxTTENQT1AoNCksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+NCl8QklUNXxSUzIofjApLAkiVSxkIiwgMCwgc3BhcmNsZXQgfSwKLXsgImN3cmN4dCIsCUYzKDIsIDB4MzYsIDApfFNMQ1BPUCgzKSwgRjMofjIsIH4weDM2LCB+MCl8U0xDUE9QKH4zKXxCSVQ1fFJTMih+MCksCSIxLHUiLCAwLCBzcGFyY2xldCB9LAoteyAiY3B1c2giLAlGMygyLCAweDM2LCAwKXxTTENQT1AoMCksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+MCl8QklUNXxSRCh+MCksCSIxLDIiLCAwLCBzcGFyY2xldCB9LAoteyAiY3B1c2giLAlGMygyLCAweDM2LCAxKXxTTENQT1AoMCksIEYzKH4yLCB+MHgzNiwgfjEpfFNMQ1BPUCh+MCl8UkQofjApLAkJIjEsWSIsIDAsIHNwYXJjbGV0IH0sCi17ICJjcHVzaGEiLAlGMygyLCAweDM2LCAwKXxTTENQT1AoMSksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+MSl8QklUNXxSRCh+MCksCSIxLDIiLCAwLCBzcGFyY2xldCB9LAoteyAiY3B1c2hhIiwJRjMoMiwgMHgzNiwgMSl8U0xDUE9QKDEpLCBGMyh+MiwgfjB4MzYsIH4xKXxTTENQT1AofjEpfFJEKH4wKSwJCSIxLFkiLCAwLCBzcGFyY2xldCB9LAoteyAiY3B1bGwiLAlGMygyLCAweDM2LCAwKXxTTENQT1AoMiksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+Mil8QklUNXxSUzEofjApfFJTMih+MCksICJkIiwgMCwgc3BhcmNsZXQgfSwKLSN1bmRlZiBCSVQ1Ci0KLS8qIHNwYXJjbGV0IGNvcHJvY2Vzc29yIGJyYW5jaCBpbnNucyAqLwotI2RlZmluZSBTTENCQ0MyKG9wY29kZSwgbWFzaywgbG9zZSkgXAotIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfChsb3NlKSwgImwiLCAgICBGX0RFTEFZRUR8Rl9DT05EQlIsIHNwYXJjbGV0IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCAobG9zZSksICIsYSBsIiwgRl9ERUxBWUVEfEZfQ09OREJSLCBzcGFyY2xldCB9Ci0jZGVmaW5lIFNMQ0JDQyhvcGNvZGUsIG1hc2spIFwKLSAgU0xDQkNDMihvcGNvZGUsIEYyKDAsIDcpfENPTkQobWFzayksIEYyKH4wLCB+Nyl8Q09ORCh+KG1hc2spKSkKLQotLyogY2JuLGNiYSBjYW4ndCBiZSBkZWZpbmVkIGhlcmUgYmVjYXVzZSB0aGV5J3JlIGRlZmluZWQgZWxzZXdoZXJlIGFuZCBHQVMKLSAgIHJlcXVpcmVzIGFsbCBtbmVtb25pY3Mgb2YgdGhlIHNhbWUgbmFtZSB0byBiZSBjb25zZWN1dGl2ZS4gICovCi0vKlNMQ0JDQygiY2JuIiwgMCksIC0gYWxyZWFkeSBkZWZpbmVkICovCi1TTENCQ0MoImNiZSIsIDEpLAotU0xDQkNDKCJjYmYiLCAyKSwKLVNMQ0JDQygiY2JlZiIsIDMpLAotU0xDQkNDKCJjYnIiLCA0KSwKLVNMQ0JDQygiY2JlciIsIDUpLAotU0xDQkNDKCJjYmZyIiwgNiksCi1TTENCQ0MoImNiZWZyIiwgNyksCi0vKlNMQ0JDQygiY2JhIiwgOCksIC0gYWxyZWFkeSBkZWZpbmVkICovCi1TTENCQ0MoImNibmUiLCA5KSwKLVNMQ0JDQygiY2JuZiIsIDEwKSwKLVNMQ0JDQygiY2JuZWYiLCAxMSksCi1TTENCQ0MoImNibnIiLCAxMiksCi1TTENCQ0MoImNibmVyIiwgMTMpLAotU0xDQkNDKCJjYm5mciIsIDE0KSwKLVNMQ0JDQygiY2JuZWZyIiwgMTUpLAotCi0jdW5kZWYgU0xDQkNDMgotI3VuZGVmIFNMQ0JDQwotCi17ICJjYXNhIiwJRjMoMywgMHgzYywgMCksIEYzKH4zLCB+MHgzYywgfjApLCAiWzFdQSwyLGQiLCAwLCB2OSB9LAoteyAiY2FzYSIsCUYzKDMsIDB4M2MsIDEpLCBGMyh+MywgfjB4M2MsIH4xKSwgIlsxXW8sMixkIiwgMCwgdjkgfSwKLXsgImNhc3hhIiwJRjMoMywgMHgzZSwgMCksIEYzKH4zLCB+MHgzZSwgfjApLCAiWzFdQSwyLGQiLCAwLCB2OSB9LAoteyAiY2FzeGEiLAlGMygzLCAweDNlLCAxKSwgRjMofjMsIH4weDNlLCB+MSksICJbMV1vLDIsZCIsIDAsIHY5IH0sCi0KLS8qIHY5IHN5bnRoZXRpYyBpbnNucyAqLwoteyAiaXByZWZldGNoIiwJRjIoMCwgMSl8KDI8PDIwKXxCUFJFRCwgRjIofjAsIH4xKXwoMTw8MjApfEFOTlVMfENPTkQofjApLCAiRyIsIDAsIHY5IH0sIC8qIGJuLGEscHQgJXhjYyxsYWJlbCAqLwoteyAic2lnbngiLAlGMygyLCAweDI3LCAwKSwgRjMofjIsIH4weDI3LCB+MCl8KDE8PDEyKXxBU0kofjApfFJTMl9HMCwgIjEsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIHNyYSByczEsJWcwLHJkICovCi17ICJzaWdueCIsCUYzKDIsIDB4MjcsIDApLCBGMyh+MiwgfjB4MjcsIH4wKXwoMTw8MTIpfEFTSSh+MCl8UlMyX0cwLCAiciIsIEZfQUxJQVMsIHY5IH0sIC8qIHNyYSByZCwlZzAscmQgKi8KLXsgImNscnV3IiwJRjMoMiwgMHgyNiwgMCksIEYzKH4yLCB+MHgyNiwgfjApfCgxPDwxMil8QVNJKH4wKXxSUzJfRzAsICIxLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBzcmwgcnMxLCVnMCxyZCAqLwoteyAiY2xydXciLAlGMygyLCAweDI2LCAwKSwgRjMofjIsIH4weDI2LCB+MCl8KDE8PDEyKXxBU0kofjApfFJTMl9HMCwgInIiLCBGX0FMSUFTLCB2OSB9LCAvKiBzcmwgcmQsJWcwLHJkICovCi17ICJjYXMiLAlGMygzLCAweDNjLCAwKXxBU0koMHg4MCksIEYzKH4zLCB+MHgzYywgfjApfEFTSSh+MHg4MCksICJbMV0sMixkIiwgRl9BTElBUywgdjkgfSwgLyogY2FzYSBbcnMxXUFTSV9QLHJzMixyZCAqLwoteyAiY2FzbCIsCUYzKDMsIDB4M2MsIDApfEFTSSgweDg4KSwgRjMofjMsIH4weDNjLCB+MCl8QVNJKH4weDg4KSwgIlsxXSwyLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBjYXNhIFtyczFdQVNJX1BfTCxyczIscmQgKi8KLXsgImNhc3giLAlGMygzLCAweDNlLCAwKXxBU0koMHg4MCksIEYzKH4zLCB+MHgzZSwgfjApfEFTSSh+MHg4MCksICJbMV0sMixkIiwgRl9BTElBUywgdjkgfSwgLyogY2FzeGEgW3JzMV1BU0lfUCxyczIscmQgKi8KLXsgImNhc3hsIiwJRjMoMywgMHgzZSwgMCl8QVNJKDB4ODgpLCBGMyh+MywgfjB4M2UsIH4wKXxBU0kofjB4ODgpLCAiWzFdLDIsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGNhc3hhIFtyczFdQVNJX1BfTCxyczIscmQgKi8KLQotLyogVWx0cmFzcGFyYyBleHRlbnNpb25zICovCi17ICJzaHV0ZG93biIsCUYzRigyLCAweDM2LCAweDA4MCksIEYzRih+MiwgfjB4MzYsIH4weDA4MCl8UkRfRzB8UlMxX0cwfFJTMl9HMCwgIiIsIDAsIHY5YSB9LAotCi0vKiBGSVhNRTogRG8gd2Ugd2FudCB0byBtYXJrIHRoZXNlIGFzIEZfRkxPQVQsIG9yIHNvbWV0aGluZyBzaW1pbGFyPyAgKi8KLXsgImZwYWRkMTYiLAlGM0YoMiwgMHgzNiwgMHgwNTApLCBGM0YofjIsIH4weDM2LCB+MHgwNTApLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZwYWRkMTZzIiwJRjNGKDIsIDB4MzYsIDB4MDUxKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDUxKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmcGFkZDMyIiwJRjNGKDIsIDB4MzYsIDB4MDUyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDUyKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmcGFkZDMycyIsCUYzRigyLCAweDM2LCAweDA1MyksIEYzRih+MiwgfjB4MzYsIH4weDA1MyksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZnBzdWIxNiIsCUYzRigyLCAweDM2LCAweDA1NCksIEYzRih+MiwgfjB4MzYsIH4weDA1NCksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnBzdWIxNnMiLAlGM0YoMiwgMHgzNiwgMHgwNTUpLCBGM0YofjIsIH4weDM2LCB+MHgwNTUpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZwc3ViMzIiLAlGM0YoMiwgMHgzNiwgMHgwNTYpLCBGM0YofjIsIH4weDM2LCB+MHgwNTYpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZwc3ViMzJzIiwJRjNGKDIsIDB4MzYsIDB4MDU3KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDU3KSwgImUsZixnIiwgMCwgdjlhIH0sCi0KLXsgImZwYWNrMzIiLAlGM0YoMiwgMHgzNiwgMHgwM2EpLCBGM0YofjIsIH4weDM2LCB+MHgwM2EpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZwYWNrMTYiLAlGM0YoMiwgMHgzNiwgMHgwM2IpLCBGM0YofjIsIH4weDM2LCB+MHgwM2IpfFJTMV9HMCwgIkIsZyIsIDAsIHY5YSB9LAoteyAiZnBhY2tmaXgiLAlGM0YoMiwgMHgzNiwgMHgwM2QpLCBGM0YofjIsIH4weDM2LCB+MHgwM2QpfFJTMV9HMCwgIkIsZyIsIDAsIHY5YSB9LAoteyAiZmV4cGFuZCIsCUYzRigyLCAweDM2LCAweDA0ZCksIEYzRih+MiwgfjB4MzYsIH4weDA0ZCl8UlMxX0cwLCAiZixIIiwgMCwgdjlhIH0sCi17ICJmcG1lcmdlIiwJRjNGKDIsIDB4MzYsIDB4MDRiKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDRiKSwgImUsZixIIiwgMCwgdjlhIH0sCi0KLS8qIE5vdGUgdGhhdCB0aGUgbWl4aW5nIG9mIDMyLzY0IGJpdCByZWdzIGlzIGludGVudGlvbmFsLiAgKi8KLXsgImZtdWw4eDE2IiwJCUYzRigyLCAweDM2LCAweDAzMSksIEYzRih+MiwgfjB4MzYsIH4weDAzMSksICJlLEIsSCIsIDAsIHY5YSB9LAoteyAiZm11bDh4MTZhdSIsCQlGM0YoMiwgMHgzNiwgMHgwMzMpLCBGM0YofjIsIH4weDM2LCB+MHgwMzMpLCAiZSxmLEgiLCAwLCB2OWEgfSwKLXsgImZtdWw4eDE2YWwiLAkJRjNGKDIsIDB4MzYsIDB4MDM1KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDM1KSwgImUsZixIIiwgMCwgdjlhIH0sCi17ICJmbXVsOHN1eDE2IiwJCUYzRigyLCAweDM2LCAweDAzNiksIEYzRih+MiwgfjB4MzYsIH4weDAzNiksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm11bDh1bHgxNiIsCQlGM0YoMiwgMHgzNiwgMHgwMzcpLCBGM0YofjIsIH4weDM2LCB+MHgwMzcpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZtdWxkOHN1eDE2IiwJRjNGKDIsIDB4MzYsIDB4MDM4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDM4KSwgImUsZixIIiwgMCwgdjlhIH0sCi17ICJmbXVsZDh1bHgxNiIsCUYzRigyLCAweDM2LCAweDAzOSksIEYzRih+MiwgfjB4MzYsIH4weDAzOSksICJlLGYsSCIsIDAsIHY5YSB9LAotCi17ICJhbGlnbmFkZHIiLAlGM0YoMiwgMHgzNiwgMHgwMTgpLCBGM0YofjIsIH4weDM2LCB+MHgwMTgpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImFsaWduYWRkcmwiLAlGM0YoMiwgMHgzNiwgMHgwMWEpLCBGM0YofjIsIH4weDM2LCB+MHgwMWEpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImZhbGlnbmRhdGEiLAlGM0YoMiwgMHgzNiwgMHgwNDgpLCBGM0YofjIsIH4weDM2LCB+MHgwNDgpLCAidixCLEgiLCAwLCB2OWEgfSwKLQoteyAiZnplcm8iLAlGM0YoMiwgMHgzNiwgMHgwNjApLCBGM0YofjIsIH4weDM2LCB+MHgwNjApLCAiSCIsIDAsIHY5YSB9LAoteyAiZnplcm9zIiwJRjNGKDIsIDB4MzYsIDB4MDYxKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDYxKSwgImciLCAwLCB2OWEgfSwKLXsgImZvbmUiLAlGM0YoMiwgMHgzNiwgMHgwN2UpLCBGM0YofjIsIH4weDM2LCB+MHgwN2UpLCAiSCIsIDAsIHY5YSB9LAoteyAiZm9uZXMiLAlGM0YoMiwgMHgzNiwgMHgwN2YpLCBGM0YofjIsIH4weDM2LCB+MHgwN2YpLCAiZyIsIDAsIHY5YSB9LAoteyAiZnNyYzEiLAlGM0YoMiwgMHgzNiwgMHgwNzQpLCBGM0YofjIsIH4weDM2LCB+MHgwNzQpLCAidixIIiwgMCwgdjlhIH0sCi17ICJmc3JjMXMiLAlGM0YoMiwgMHgzNiwgMHgwNzUpLCBGM0YofjIsIH4weDM2LCB+MHgwNzUpLCAiZSxnIiwgMCwgdjlhIH0sCi17ICJmc3JjMiIsCUYzRigyLCAweDM2LCAweDA3OCksIEYzRih+MiwgfjB4MzYsIH4weDA3OCksICJCLEgiLCAwLCB2OWEgfSwKLXsgImZzcmMycyIsCUYzRigyLCAweDM2LCAweDA3OSksIEYzRih+MiwgfjB4MzYsIH4weDA3OSksICJmLGciLCAwLCB2OWEgfSwKLXsgImZub3QxIiwJRjNGKDIsIDB4MzYsIDB4MDZhKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZhKSwgInYsSCIsIDAsIHY5YSB9LAoteyAiZm5vdDFzIiwJRjNGKDIsIDB4MzYsIDB4MDZiKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZiKSwgImUsZyIsIDAsIHY5YSB9LAoteyAiZm5vdDIiLAlGM0YoMiwgMHgzNiwgMHgwNjYpLCBGM0YofjIsIH4weDM2LCB+MHgwNjYpLCAiQixIIiwgMCwgdjlhIH0sCi17ICJmbm90MnMiLAlGM0YoMiwgMHgzNiwgMHgwNjcpLCBGM0YofjIsIH4weDM2LCB+MHgwNjcpLCAiZixnIiwgMCwgdjlhIH0sCi17ICJmb3IiLAlGM0YoMiwgMHgzNiwgMHgwN2MpLCBGM0YofjIsIH4weDM2LCB+MHgwN2MpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZvcnMiLAlGM0YoMiwgMHgzNiwgMHgwN2QpLCBGM0YofjIsIH4weDM2LCB+MHgwN2QpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZub3IiLAlGM0YoMiwgMHgzNiwgMHgwNjIpLCBGM0YofjIsIH4weDM2LCB+MHgwNjIpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZub3JzIiwJRjNGKDIsIDB4MzYsIDB4MDYzKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDYzKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmYW5kIiwJRjNGKDIsIDB4MzYsIDB4MDcwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDcwKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmYW5kcyIsCUYzRigyLCAweDM2LCAweDA3MSksIEYzRih+MiwgfjB4MzYsIH4weDA3MSksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZm5hbmQiLAlGM0YoMiwgMHgzNiwgMHgwNmUpLCBGM0YofjIsIH4weDM2LCB+MHgwNmUpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZuYW5kcyIsCUYzRigyLCAweDM2LCAweDA2ZiksIEYzRih+MiwgfjB4MzYsIH4weDA2ZiksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZnhvciIsCUYzRigyLCAweDM2LCAweDA2YyksIEYzRih+MiwgfjB4MzYsIH4weDA2YyksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnhvcnMiLAlGM0YoMiwgMHgzNiwgMHgwNmQpLCBGM0YofjIsIH4weDM2LCB+MHgwNmQpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZ4bm9yIiwJRjNGKDIsIDB4MzYsIDB4MDcyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDcyKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmeG5vcnMiLAlGM0YoMiwgMHgzNiwgMHgwNzMpLCBGM0YofjIsIH4weDM2LCB+MHgwNzMpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZvcm5vdDEiLAlGM0YoMiwgMHgzNiwgMHgwN2EpLCBGM0YofjIsIH4weDM2LCB+MHgwN2EpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZvcm5vdDFzIiwJRjNGKDIsIDB4MzYsIDB4MDdiKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDdiKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmb3Jub3QyIiwJRjNGKDIsIDB4MzYsIDB4MDc2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDc2KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmb3Jub3QycyIsCUYzRigyLCAweDM2LCAweDA3NyksIEYzRih+MiwgfjB4MzYsIH4weDA3NyksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZmFuZG5vdDEiLAlGM0YoMiwgMHgzNiwgMHgwNjgpLCBGM0YofjIsIH4weDM2LCB+MHgwNjgpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZhbmRub3QxcyIsCUYzRigyLCAweDM2LCAweDA2OSksIEYzRih+MiwgfjB4MzYsIH4weDA2OSksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZmFuZG5vdDIiLAlGM0YoMiwgMHgzNiwgMHgwNjQpLCBGM0YofjIsIH4weDM2LCB+MHgwNjQpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZhbmRub3QycyIsCUYzRigyLCAweDM2LCAweDA2NSksIEYzRih+MiwgfjB4MzYsIH4weDA2NSksICJlLGYsZyIsIDAsIHY5YSB9LAotCi17ICJmY21wZ3QxNiIsCUYzRigyLCAweDM2LCAweDAyOCksIEYzRih+MiwgfjB4MzYsIH4weDAyOCksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcGd0MzIiLAlGM0YoMiwgMHgzNiwgMHgwMmMpLCBGM0YofjIsIH4weDM2LCB+MHgwMmMpLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBsZTE2IiwJRjNGKDIsIDB4MzYsIDB4MDIwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDIwKSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wbGUzMiIsCUYzRigyLCAweDM2LCAweDAyNCksIEYzRih+MiwgfjB4MzYsIH4weDAyNCksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcG5lMTYiLAlGM0YoMiwgMHgzNiwgMHgwMjIpLCBGM0YofjIsIH4weDM2LCB+MHgwMjIpLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBuZTMyIiwJRjNGKDIsIDB4MzYsIDB4MDI2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDI2KSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wZXExNiIsCUYzRigyLCAweDM2LCAweDAyYSksIEYzRih+MiwgfjB4MzYsIH4weDAyYSksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcGVxMzIiLAlGM0YoMiwgMHgzNiwgMHgwMmUpLCBGM0YofjIsIH4weDM2LCB+MHgwMmUpLCAidixCLGQiLCAwLCB2OWEgfSwKLQoteyAiZWRnZTgiLAlGM0YoMiwgMHgzNiwgMHgwMDApLCBGM0YofjIsIH4weDM2LCB+MHgwMDApLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImVkZ2U4bCIsCUYzRigyLCAweDM2LCAweDAwMiksIEYzRih+MiwgfjB4MzYsIH4weDAwMiksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiZWRnZTE2IiwJRjNGKDIsIDB4MzYsIDB4MDA0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDA0KSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJlZGdlMTZsIiwJRjNGKDIsIDB4MzYsIDB4MDA2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDA2KSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJlZGdlMzIiLAlGM0YoMiwgMHgzNiwgMHgwMDgpLCBGM0YofjIsIH4weDM2LCB+MHgwMDgpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImVkZ2UzMmwiLAlGM0YoMiwgMHgzNiwgMHgwMGEpLCBGM0YofjIsIH4weDM2LCB+MHgwMGEpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLQoteyAicGRpc3QiLAlGM0YoMiwgMHgzNiwgMHgwM2UpLCBGM0YofjIsIH4weDM2LCB+MHgwM2UpLCAidixCLEgiLCAwLCB2OWEgfSwKLQoteyAiYXJyYXk4IiwJRjNGKDIsIDB4MzYsIDB4MDEwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDEwKSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJhcnJheTE2IiwJRjNGKDIsIDB4MzYsIDB4MDEyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDEyKSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJhcnJheTMyIiwJRjNGKDIsIDB4MzYsIDB4MDE0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDE0KSwgIjEsMixkIiwgMCwgdjlhIH0sCi0KLS8qIE1vcmUgdjkgc3BlY2lmaWMgaW5zbnMsIHRoZXNlIG5lZWQgdG8gY29tZSBsYXN0IHNvIHRoZXkgZG8gbm90IGNsYXNoCi0gICB3aXRoIHY5YSBpbnN0cnVjdGlvbnMgc3VjaCBhcyAiZWRnZTgiIHdoaWNoIGxvb2tzIGxpa2UgaW1wZGVwMS4gKi8KLQotI2RlZmluZSBJTVBERVAobmFtZSwgY29kZSkgXAoteyBuYW1lLAlGMygyLCBjb2RlLCAwKSwgRjMofjIsIH5jb2RlLCB+MCl8QVNJKH4wKSwgIjEsMixkIiwgMCwgdjlub3R2OWEgfSwgXAoteyBuYW1lLAlGMygyLCBjb2RlLCAxKSwgRjMofjIsIH5jb2RlLCB+MSksCSAgICIxLGksZCIsIDAsIHY5bm90djlhIH0sIFwKLXsgbmFtZSwgRjMoMiwgY29kZSwgMCksIEYzKH4yLCB+Y29kZSwgfjApLCAgICAgICAgICJ4LDEsMixkIiwgMCwgdjlub3R2OWEgfSwgXAoteyBuYW1lLCBGMygyLCBjb2RlLCAwKSwgRjMofjIsIH5jb2RlLCB+MCksICAgICAgICAgIngsZSxmLGciLCAwLCB2OW5vdHY5YSB9Ci0KLUlNUERFUCAoImltcGRlcDEiLCAweDM2KSwKLUlNUERFUCAoImltcGRlcDIiLCAweDM3KSwKLQotI3VuZGVmIElNUERFUAotCi19OwotCi1jb25zdCBpbnQgc3BhcmNfbnVtX29wY29kZXMgPSAoKHNpemVvZiBzcGFyY19vcGNvZGVzKS8oc2l6ZW9mIHNwYXJjX29wY29kZXNbMF0pKTsKLQwKLS8qIFV0aWxpdGllcyBmb3IgYXJndW1lbnQgcGFyc2luZy4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGludCB2YWx1ZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX0gYXJnOwotCi0vKiBMb29rIHVwIE5BTUUgaW4gVEFCTEUuICAqLwotCi1zdGF0aWMgaW50IGxvb2t1cF9uYW1lIFBBUkFNUyAoKGNvbnN0IGFyZyAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBjb25zdCBjaGFyICpsb29rdXBfdmFsdWUgUEFSQU1TICgoY29uc3QgYXJnICosIGludCkpOwotCi1zdGF0aWMgaW50Ci1sb29rdXBfbmFtZSAodGFibGUsIG5hbWUpCi0gICAgIGNvbnN0IGFyZyAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGFyZyAqcDsKLQotICBmb3IgKHAgPSB0YWJsZTsgcC0+bmFtZTsgKytwKQotICAgIGlmIChzdHJjbXAgKG5hbWUsIHAtPm5hbWUpID09IDApCi0gICAgICByZXR1cm4gcC0+dmFsdWU7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi0vKiBMb29rIHVwIFZBTFVFIGluIFRBQkxFLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbG9va3VwX3ZhbHVlICh0YWJsZSwgdmFsdWUpCi0gICAgIGNvbnN0IGFyZyAqdGFibGU7Ci0gICAgIGludCB2YWx1ZTsKLXsKLSAgY29uc3QgYXJnICpwOwotCi0gIGZvciAocCA9IHRhYmxlOyBwLT5uYW1lOyArK3ApCi0gICAgaWYgKHZhbHVlID09IHAtPnZhbHVlKQotICAgICAgcmV0dXJuIHAtPm5hbWU7Ci0KLSAgcmV0dXJuIChjaGFyICopIDA7Ci19Ci0MCi0vKiBIYW5kbGUgQVNJJ3MuICAqLwotCi1zdGF0aWMgYXJnIGFzaV90YWJsZVtdID0KLXsKLSAgLyogVGhlc2UgYXJlIGluIHRoZSB2OSBhcmNoaXRlY3R1cmUgbWFudWFsLiAgKi8KLSAgLyogVGhlIHNob3J0ZXIgdmVyc2lvbnMgYXBwZWFyIGZpcnN0LCB0aGV5J3JlIGhlcmUgYmVjYXVzZSBTdW4ncyBhcyBoYXMgdGhlbS4KLSAgICAgU3VuJ3MgYXMgdXNlcyAjQVNJX1BfTCBpbnN0ZWFkIG9mICNBU0lfUEwgKHdoaWNoIGFwcGVhcnMgaW4gdGhlCi0gICAgIFVsdHJhU1BBUkMgYXJjaGl0ZWN0dXJlIG1hbnVhbCkuICAqLwotICB7IDB4MDQsICIjQVNJX04iIH0sCi0gIHsgMHgwYywgIiNBU0lfTl9MIiB9LAotICB7IDB4MTAsICIjQVNJX0FJVVAiIH0sCi0gIHsgMHgxMSwgIiNBU0lfQUlVUyIgfSwKLSAgeyAweDE4LCAiI0FTSV9BSVVQX0wiIH0sCi0gIHsgMHgxOSwgIiNBU0lfQUlVU19MIiB9LAotICB7IDB4ODAsICIjQVNJX1AiIH0sCi0gIHsgMHg4MSwgIiNBU0lfUyIgfSwKLSAgeyAweDgyLCAiI0FTSV9QTkYiIH0sCi0gIHsgMHg4MywgIiNBU0lfU05GIiB9LAotICB7IDB4ODgsICIjQVNJX1BfTCIgfSwKLSAgeyAweDg5LCAiI0FTSV9TX0wiIH0sCi0gIHsgMHg4YSwgIiNBU0lfUE5GX0wiIH0sCi0gIHsgMHg4YiwgIiNBU0lfU05GX0wiIH0sCi0gIHsgMHgwNCwgIiNBU0lfTlVDTEVVUyIgfSwKLSAgeyAweDBjLCAiI0FTSV9OVUNMRVVTX0xJVFRMRSIgfSwKLSAgeyAweDEwLCAiI0FTSV9BU19JRl9VU0VSX1BSSU1BUlkiIH0sCi0gIHsgMHgxMSwgIiNBU0lfQVNfSUZfVVNFUl9TRUNPTkRBUlkiIH0sCi0gIHsgMHgxOCwgIiNBU0lfQVNfSUZfVVNFUl9QUklNQVJZX0xJVFRMRSIgfSwKLSAgeyAweDE5LCAiI0FTSV9BU19JRl9VU0VSX1NFQ09OREFSWV9MSVRUTEUiIH0sCi0gIHsgMHg4MCwgIiNBU0lfUFJJTUFSWSIgfSwKLSAgeyAweDgxLCAiI0FTSV9TRUNPTkRBUlkiIH0sCi0gIHsgMHg4MiwgIiNBU0lfUFJJTUFSWV9OT0ZBVUxUIiB9LAotICB7IDB4ODMsICIjQVNJX1NFQ09OREFSWV9OT0ZBVUxUIiB9LAotICB7IDB4ODgsICIjQVNJX1BSSU1BUllfTElUVExFIiB9LAotICB7IDB4ODksICIjQVNJX1NFQ09OREFSWV9MSVRUTEUiIH0sCi0gIHsgMHg4YSwgIiNBU0lfUFJJTUFSWV9OT0ZBVUxUX0xJVFRMRSIgfSwKLSAgeyAweDhiLCAiI0FTSV9TRUNPTkRBUllfTk9GQVVMVF9MSVRUTEUiIH0sCi0gIC8qIFRoZXNlIGFyZSBVbHRyYVNQQVJDIGV4dGVuc2lvbnMuICAqLwotICAvKiBGSVhNRTogVGhlcmUgYXJlIGRvemVucyBvZiB0aGVtLiAgTm90IHN1cmUgd2Ugd2FudCB0aGVtIGFsbC4KLSAgICAgTW9zdCBhcmUgZm9yIGtlcm5lbCBidWlsZGluZyBidXQgc29tZSBhcmUgZm9yIHZpcyB0eXBlIHN0dWZmLiAgKi8KLSAgeyAwLCAwIH0KLX07Ci0KLS8qIFJldHVybiB0aGUgdmFsdWUgZm9yIEFTSSBOQU1FLCBvciAtMSBpZiBub3QgZm91bmQuICAqLwotCi1pbnQKLXNwYXJjX2VuY29kZV9hc2kgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBsb29rdXBfbmFtZSAoYXNpX3RhYmxlLCBuYW1lKTsKLX0KLQotLyogUmV0dXJuIHRoZSBuYW1lIGZvciBBU0kgdmFsdWUgVkFMVUUgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBjaGFyICoKLXNwYXJjX2RlY29kZV9hc2kgKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHJldHVybiBsb29rdXBfdmFsdWUgKGFzaV90YWJsZSwgdmFsdWUpOwotfQotDAotLyogSGFuZGxlIG1lbWJhciBtYXNrcy4gICovCi0KLXN0YXRpYyBhcmcgbWVtYmFyX3RhYmxlW10gPQotewotICB7IDB4NDAsICIjU3luYyIgfSwKLSAgeyAweDIwLCAiI01lbUlzc3VlIiB9LAotICB7IDB4MTAsICIjTG9va2FzaWRlIiB9LAotICB7IDB4MDgsICIjU3RvcmVTdG9yZSIgfSwKLSAgeyAweDA0LCAiI0xvYWRTdG9yZSIgfSwKLSAgeyAweDAyLCAiI1N0b3JlTG9hZCIgfSwKLSAgeyAweDAxLCAiI0xvYWRMb2FkIiB9LAotICB7IDAsIDAgfQotfTsKLQotLyogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgbWVtYmFyIGFyZyBOQU1FLCBvciAtMSBpZiBub3QgZm91bmQuICAqLwotCi1pbnQKLXNwYXJjX2VuY29kZV9tZW1iYXIgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBsb29rdXBfbmFtZSAobWVtYmFyX3RhYmxlLCBuYW1lKTsKLX0KLQotLyogUmV0dXJuIHRoZSBuYW1lIGZvciBtZW1iYXIgdmFsdWUgVkFMVUUgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBjaGFyICoKLXNwYXJjX2RlY29kZV9tZW1iYXIgKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHJldHVybiBsb29rdXBfdmFsdWUgKG1lbWJhcl90YWJsZSwgdmFsdWUpOwotfQotDAotLyogSGFuZGxlIHByZWZldGNoIGFyZ3MuICAqLwotCi1zdGF0aWMgYXJnIHByZWZldGNoX3RhYmxlW10gPQotewotICB7IDAsICIjbl9yZWFkcyIgfSwKLSAgeyAxLCAiI29uZV9yZWFkIiB9LAotICB7IDIsICIjbl93cml0ZXMiIH0sCi0gIHsgMywgIiNvbmVfd3JpdGUiIH0sCi0gIHsgNCwgIiNwYWdlIiB9LAotICB7IDAsIDAgfQotfTsKLQotLyogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgcHJlZmV0Y2ggYXJnIE5BTUUsIG9yIC0xIGlmIG5vdCBmb3VuZC4gICovCi0KLWludAotc3BhcmNfZW5jb2RlX3ByZWZldGNoIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbG9va3VwX25hbWUgKHByZWZldGNoX3RhYmxlLCBuYW1lKTsKLX0KLQotLyogUmV0dXJuIHRoZSBuYW1lIGZvciBwcmVmZXRjaCB2YWx1ZSBWQUxVRSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IGNoYXIgKgotc3BhcmNfZGVjb2RlX3ByZWZldGNoICh2YWx1ZSkKLSAgICAgaW50IHZhbHVlOwotewotICByZXR1cm4gbG9va3VwX3ZhbHVlIChwcmVmZXRjaF90YWJsZSwgdmFsdWUpOwotfQotDAotLyogSGFuZGxlIHNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycy4gICovCi0KLXN0YXRpYyBhcmcgc3BhcmNsZXRfY3ByZWdfdGFibGVbXSA9Ci17Ci0gIHsgMCwgIiVjY3NyIiB9LAotICB7IDEsICIlY2NmciIgfSwKLSAgeyAyLCAiJWNjY3JjciIgfSwKLSAgeyAzLCAiJWNjcHIiIH0sCi0gIHsgNCwgIiVjY3NyMiIgfSwKLSAgeyA1LCAiJWNjY3JyIiB9LAotICB7IDYsICIlY2Nyc3RyIiB9LAotICB7IDAsIDAgfQotfTsKLQotLyogUmV0dXJuIHRoZSB2YWx1ZSBmb3Igc3BhcmNsZXQgY3ByZWcgYXJnIE5BTUUsIG9yIC0xIGlmIG5vdCBmb3VuZC4gICovCi0KLWludAotc3BhcmNfZW5jb2RlX3NwYXJjbGV0X2NwcmVnIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbG9va3VwX25hbWUgKHNwYXJjbGV0X2NwcmVnX3RhYmxlLCBuYW1lKTsKLX0KLQotLyogUmV0dXJuIHRoZSBuYW1lIGZvciBzcGFyY2xldCBjcHJlZyB2YWx1ZSBWQUxVRSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IGNoYXIgKgotc3BhcmNfZGVjb2RlX3NwYXJjbGV0X2NwcmVnICh2YWx1ZSkKLSAgICAgaW50IHZhbHVlOwotewotICByZXR1cm4gbG9va3VwX3ZhbHVlIChzcGFyY2xldF9jcHJlZ190YWJsZSwgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zdGFtcC1oLmluIGIvb3Bjb2Rlcy9zdGFtcC1oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg4ZjcwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvc3RhbXAtaC5pbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRpbWVzdGFtcApkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zeXNkZXAuaCBiL29wY29kZXMvc3lzZGVwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjNlNWYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zeXNkZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIFJhbmRvbSBob3N0LWRlcGVuZGVudCBzdXBwb3J0IGNvZGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEtlbiBSYWVidXJuLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBsaWJvcGNvZGVzLCB0aGUgb3Bjb2RlcyBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBEbyBzeXN0ZW0tZGVwZW5kZW50IHN0dWZmLCBtYWlubHkgZHJpdmVuIGJ5IGF1dG9jb25mLWRldGVjdGVkIGluZm8uCi0KLSAgIFdlbGwsIHNvbWUgZ2VuZXJpYyBjb21tb24gc3R1ZmYgaXMgZG9uZSBoZXJlIHRvbywgbGlrZSBpbmNsdWRpbmcKLSAgIGFuc2lkZWNsLmguICBUaGF0J3MgYmVjYXVzZSB0aGUgLmggZmlsZXMgaW4gYmZkL2hvc3RzIGZpbGVzIEknbQotICAgdHJ5aW5nIHRvIHJlcGxhY2Ugb2Z0ZW4gZGlkIHRoYXQuICBJZiBpdCBjYW4gYmUgZHJvcHBlZCBmcm9tIHRoaXMKLSAgIGZpbGUgKGNoZWNrIGluIGEgbm9uLUFOU0kgZW52aXJvbm1lbnQhKSwgaXQgc2hvdWxkIGJlLiAgKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL3RpYzMwLWRpcy5jIGIvb3Bjb2Rlcy90aWMzMC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjZjg5My4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3RpYzMwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEwICswLDAgQEAKLS8qIERpc2Fzc2VtYmx5IHJvdXRpbmVzIGZvciBUTVMzMjBDMzAgYXJjaGl0ZWN0dXJlCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvdGljMzAuaCIKLQotI2RlZmluZSBOT1JNQUxfSU5TTiAgIDEKLSNkZWZpbmUgUEFSQUxMRUxfSU5TTiAyCi0KLS8qIEdldHMgdGhlIHR5cGUgb2YgaW5zdHJ1Y3Rpb24gYmFzZWQgb24gdGhlIHRvcCAyIG9yIDMgYml0cyBvZiB0aGUKLSAgIGluc3RydWN0aW9uIHdvcmQuICovCi0jZGVmaW5lIEdFVF9UWVBFKGluc24pIChpbnNuICYgMHg4MDAwMDAwMCA/IGluc24gJiAweEMwMDAwMDAwIDogaW5zbiAmIDB4RTAwMDAwMDApCi0KLS8qIEluc3RydWN0aW9uIHR5cGVzLiAqLwotI2RlZmluZSBUV09fT1BFUkFORF8xIDB4MDAwMDAwMDAKLSNkZWZpbmUgVFdPX09QRVJBTkRfMiAweDQwMDAwMDAwCi0jZGVmaW5lIFRIUkVFX09QRVJBTkQgMHgyMDAwMDAwMAotI2RlZmluZSBQQVJfU1RPUkUgICAgIDB4QzAwMDAwMDAKLSNkZWZpbmUgTVVMX0FERFMgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIEJSQU5DSEVTICAgICAgMHg2MDAwMDAwMAotCi0vKiBTcGVjaWZpYyBpbnN0cnVjdGlvbiBpZCBiaXRzLiAqLwotI2RlZmluZSBOT1JNQUxfSURFTiAgICAweDFGODAwMDAwCi0jZGVmaW5lIFBBUl9TVE9SRV9JREVOIDB4M0UwMDAwMDAKLSNkZWZpbmUgTVVMX0FERF9JREVOICAgMHgyQzAwMDAwMAotI2RlZmluZSBCUl9JTU1fSURFTiAgICAweDFGMDAwMDAwCi0jZGVmaW5lIEJSX0NPTkRfSURFTiAgIDB4MUMzRjAwMDAKLQotLyogQWRkcmVzc2luZyBtb2Rlcy4gKi8KLSNkZWZpbmUgQU1fUkVHSVNURVIgMHgwMDAwMDAwMAotI2RlZmluZSBBTV9ESVJFQ1QgICAweDAwMjAwMDAwCi0jZGVmaW5lIEFNX0lORElSRUNUIDB4MDA0MDAwMDAKLSNkZWZpbmUgQU1fSU1NICAgICAgMHgwMDYwMDAwMAotCi0jZGVmaW5lIFBfRklFTEQgMHgwMzAwMDAwMAotCi0jZGVmaW5lIFJFR19BUjAgMHgwOAotI2RlZmluZSBMRFBfSU5TTiAweDA4NzAwMDAwCi0KLS8qIFRNUzMyMEMzMCBwcm9ncmFtIGNvdW50ZXIgZm9yIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICovCi1zdGF0aWMgdW5zaWduZWQgaW50IF9wYzsKLQotc3RydWN0IGluc3RydWN0aW9uCi0gIHsKLSAgICBpbnQgdHlwZTsKLSAgICB0ZW1wbGF0ZSAqdG07Ci0gICAgcGFydGVtcGxhdGUgKnB0bTsKLSAgfTsKLQotaW50IGdldF90aWMzMF9pbnN0cnVjdGlvbiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOwotaW50IHByaW50X3R3b19vcGVyYW5kCi0gIFBBUkFNUyAoKGRpc2Fzc2VtYmxlX2luZm8gKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKLWludCBwcmludF90aHJlZV9vcGVyYW5kCi0gIFBBUkFNUyAoKGRpc2Fzc2VtYmxlX2luZm8gKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKLWludCBwcmludF9wYXJfaW5zbgotICBQQVJBTVMgKChkaXNhc3NlbWJsZV9pbmZvICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpbnN0cnVjdGlvbiAqKSk7Ci1pbnQgcHJpbnRfYnJhbmNoCi0gIFBBUkFNUyAoKGRpc2Fzc2VtYmxlX2luZm8gKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKLWludCBnZXRfaW5kaXJlY3Rfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBzaG9ydCwgaW50LCBjaGFyICopKTsKLWludCBnZXRfcmVnaXN0ZXJfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyLCBjaGFyICopKTsKLWludCBjbnZ0X3Rtc2Zsb2F0X2llZWUgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50LCBmbG9hdCAqKSk7Ci0KLWludAotcHJpbnRfaW5zbl90aWMzMCAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOwotICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gaW5zbiA9Ci0gIHswLCBOVUxMLCBOVUxMfTsKLSAgYmZkX3ZtYSBidWZhZGRyID0gcGMgLSBpbmZvLT5idWZmZXJfdm1hOwotICAvKiBPYnRhaW4gdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gd29yZCBmcm9tIHRoZSBidWZmZXIuICovCi0gIGluc25fd29yZCA9ICgqKGluZm8tPmJ1ZmZlciArIGJ1ZmFkZHIpIDw8IDI0KSB8ICgqKGluZm8tPmJ1ZmZlciArIGJ1ZmFkZHIgKyAxKSA8PCAxNikgfAotICAgICgqKGluZm8tPmJ1ZmZlciArIGJ1ZmFkZHIgKyAyKSA8PCA4KSB8ICooaW5mby0+YnVmZmVyICsgYnVmYWRkciArIDMpOwotICBfcGMgPSBwYyAvIDQ7Ci0gIC8qIEdldCB0aGUgaW5zdHJ1Y3Rpb24gcmVmZXJlZCB0byBieSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiB3b3JkCi0gICAgIGFuZCBwcmludCBpdCBvdXQgYmFzZWQgb24gaXRzIHR5cGUuICovCi0gIGlmICghZ2V0X3RpYzMwX2luc3RydWN0aW9uIChpbnNuX3dvcmQsICZpbnNuKSkKLSAgICByZXR1cm4gLTE7Ci0gIHN3aXRjaCAoR0VUX1RZUEUgKGluc25fd29yZCkpCi0gICAgewotICAgIGNhc2UgVFdPX09QRVJBTkRfMToKLSAgICBjYXNlIFRXT19PUEVSQU5EXzI6Ci0gICAgICBpZiAoIXByaW50X3R3b19vcGVyYW5kIChpbmZvLCBpbnNuX3dvcmQsICZpbnNuKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRIUkVFX09QRVJBTkQ6Ci0gICAgICBpZiAoIXByaW50X3RocmVlX29wZXJhbmQgKGluZm8sIGluc25fd29yZCwgJmluc24pKQotCXJldHVybiAtMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUEFSX1NUT1JFOgotICAgIGNhc2UgTVVMX0FERFM6Ci0gICAgICBpZiAoIXByaW50X3Bhcl9pbnNuIChpbmZvLCBpbnNuX3dvcmQsICZpbnNuKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJSQU5DSEVTOgotICAgICAgaWYgKCFwcmludF9icmFuY2ggKGluZm8sIGluc25fd29yZCwgJmluc24pKQotCXJldHVybiAtMTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIDQ7Ci19Ci0KLWludAotZ2V0X3RpYzMwX2luc3RydWN0aW9uIChpbnNuX3dvcmQsIGluc24pCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOwotICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Ci17Ci0gIHN3aXRjaCAoR0VUX1RZUEUgKGluc25fd29yZCkpCi0gICAgewotICAgIGNhc2UgVFdPX09QRVJBTkRfMToKLSAgICBjYXNlIFRXT19PUEVSQU5EXzI6Ci0gICAgY2FzZSBUSFJFRV9PUEVSQU5EOgotICAgICAgaW5zbi0+dHlwZSA9IE5PUk1BTF9JTlNOOwotICAgICAgewotCXRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gKHRlbXBsYXRlICopIHRpYzMwX29wdGFiOwotCWZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCi0JICB7Ci0JICAgIGlmIChHRVRfVFlQRSAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUpID09IEdFVF9UWVBFIChpbnNuX3dvcmQpKQotCSAgICAgIHsKLQkJaWYgKGN1cnJlbnRfb3B0YWItPm9wZXJhbmRzID09IDApCi0JCSAgewotCQkgICAgaWYgKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlID09IGluc25fd29yZCkKLQkJICAgICAgewotCQkJaW5zbi0+dG0gPSBjdXJyZW50X29wdGFiOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UgaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIE5PUk1BTF9JREVOKSA9PSAoaW5zbl93b3JkICYgTk9STUFMX0lERU4pKQotCQkgIHsKLQkJICAgIGluc24tPnRtID0gY3VycmVudF9vcHRhYjsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBBUl9TVE9SRToKLSAgICAgIGluc24tPnR5cGUgPSBQQVJBTExFTF9JTlNOOwotICAgICAgewotCXBhcnRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gKHBhcnRlbXBsYXRlICopIHRpYzMwX3Bhcm9wdGFiOwotCWZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfcGFyb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCi0JICB7Ci0JICAgIGlmIChHRVRfVFlQRSAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUpID09IEdFVF9UWVBFIChpbnNuX3dvcmQpKQotCSAgICAgIHsKLQkJaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIFBBUl9TVE9SRV9JREVOKSA9PSAoaW5zbl93b3JkICYgUEFSX1NUT1JFX0lERU4pKQotCQkgIHsKLQkJICAgIGluc24tPnB0bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNVUxfQUREUzoKLSAgICAgIGluc24tPnR5cGUgPSBQQVJBTExFTF9JTlNOOwotICAgICAgewotCXBhcnRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gKHBhcnRlbXBsYXRlICopIHRpYzMwX3Bhcm9wdGFiOwotCWZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfcGFyb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCi0JICB7Ci0JICAgIGlmIChHRVRfVFlQRSAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUpID09IEdFVF9UWVBFIChpbnNuX3dvcmQpKQotCSAgICAgIHsKLQkJaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIE1VTF9BRERfSURFTikgPT0gKGluc25fd29yZCAmIE1VTF9BRERfSURFTikpCi0JCSAgewotCQkgICAgaW5zbi0+cHRtID0gY3VycmVudF9vcHRhYjsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJSQU5DSEVTOgotICAgICAgaW5zbi0+dHlwZSA9IE5PUk1BTF9JTlNOOwotICAgICAgewotCXRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gKHRlbXBsYXRlICopIHRpYzMwX29wdGFiOwotCWZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCi0JICB7Ci0JICAgIGlmIChHRVRfVFlQRSAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUpID09IEdFVF9UWVBFIChpbnNuX3dvcmQpKQotCSAgICAgIHsKLQkJaWYgKGN1cnJlbnRfb3B0YWItPm9wZXJhbmRfdHlwZXNbMF0gJiBJbW0yNCkKLQkJICB7Ci0JCSAgICBpZiAoKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlICYgQlJfSU1NX0lERU4pID09IChpbnNuX3dvcmQgJiBCUl9JTU1fSURFTikpCi0JCSAgICAgIHsKLQkJCWluc24tPnRtID0gY3VycmVudF9vcHRhYjsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlIGlmIChjdXJyZW50X29wdGFiLT5vcGVyYW5kcyA+IDApCi0JCSAgewotCQkgICAgaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIEJSX0NPTkRfSURFTikgPT0gKGluc25fd29yZCAmIEJSX0NPTkRfSURFTikpCi0JCSAgICAgIHsKLQkJCWluc24tPnRtID0gY3VycmVudF9vcHRhYjsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIChCUl9DT05EX0lERU4gfCAweDAwODAwMDAwKSkgPT0gKGluc25fd29yZCAmIChCUl9DT05EX0lERU4gfCAweDAwODAwMDAwKSkpCi0JCSAgICAgIHsKLQkJCWluc24tPnRtID0gY3VycmVudF9vcHRhYjsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLXByaW50X3R3b19vcGVyYW5kIChpbmZvLCBpbnNuX3dvcmQsIGluc24pCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOwotICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Ci17Ci0gIGNoYXIgbmFtZVsxMl07Ci0gIGNoYXIgb3BlcmFuZFsyXVsxM10gPQotICB7Ci0gICAgezB9LAotICAgIHswfX07Ci0gIGZsb2F0IGZfbnVtYmVyOwotCi0gIGlmIChpbnNuLT50bSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBzdHJjcHkgKG5hbWUsIGluc24tPnRtLT5uYW1lKTsKLSAgaWYgKGluc24tPnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gQWRkcmVzc01vZGUpCi0gICAgewotICAgICAgaW50IHNyY19vcCwgZGVzdF9vcDsKLSAgICAgIC8qIERldGVybWluZSB3aGV0aGVyIGluc3RydWN0aW9uIGlzIGEgc3RvcmUgb3IgYSBub3JtYWwgaW5zdHJ1Y3Rpb24uICovCi0gICAgICBpZiAoKGluc24tPnRtLT5vcGVyYW5kX3R5cGVzWzFdICYgKERpcmVjdCB8IEluZGlyZWN0KSkgPT0gKERpcmVjdCB8IEluZGlyZWN0KSkKLQl7Ci0JICBzcmNfb3AgPSAxOwotCSAgZGVzdF9vcCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNyY19vcCA9IDA7Ci0JICBkZXN0X29wID0gMTsKLQl9Ci0gICAgICAvKiBHZXQgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLiAqLwotICAgICAgaWYgKGluc24tPnRtLT5vcGVyYW5kcyA9PSAyKQotCWdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDFGMDAwMCkgPj4gMTYsIG9wZXJhbmRbZGVzdF9vcF0pOwotICAgICAgLyogR2V0IHRoZSBzb3VyY2Ugb3BlcmFuZCBiYXNlZCBvbiBhZGRyZXNzaW5nIG1vZGUuICovCi0gICAgICBzd2l0Y2ggKGluc25fd29yZCAmIEFkZHJlc3NNb2RlKQotCXsKLQljYXNlIEFNX1JFR0lTVEVSOgotCSAgLyogQ2hlY2sgZm9yIHRoZSBOT1AgaW5zdHJ1Y3Rpb24gYmVmb3JlIGdldHRpbmcgdGhlIG9wZXJhbmQuICovCi0JICBpZiAoKGluc24tPnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgTm90UmVxKSA9PSAwKQotCSAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwMUYpLCBvcGVyYW5kW3NyY19vcF0pOwotCSAgYnJlYWs7Ci0JY2FzZSBBTV9ESVJFQ1Q6Ci0JICBzcHJpbnRmIChvcGVyYW5kW3NyY19vcF0sICJAMHglbFgiLCAoaW5zbl93b3JkICYgMHgwMDAwRkZGRikpOwotCSAgYnJlYWs7Ci0JY2FzZSBBTV9JTkRJUkVDVDoKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkZGRiksIDIsIG9wZXJhbmRbc3JjX29wXSk7Ci0JICBicmVhazsKLQljYXNlIEFNX0lNTToKLQkgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGJhc2VkIG9uIHZhcmlhYmxlIHR5cGUuICovCi0JICBzd2l0Y2ggKGluc24tPnRtLT5pbW1fYXJnX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBJbW1fRmxvYXQ6Ci0JICAgICAgY252dF90bXNmbG9hdF9pZWVlICgoaW5zbl93b3JkICYgMHgwMDAwRkZGRiksIDIsICZmX251bWJlcik7Ci0JICAgICAgc3ByaW50ZiAob3BlcmFuZFtzcmNfb3BdLCAiJTIuMmYiLCBmX251bWJlcik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSW1tX1NJbnQ6Ci0JICAgICAgc3ByaW50ZiAob3BlcmFuZFtzcmNfb3BdLCAiJWQiLCAoc2hvcnQpIChpbnNuX3dvcmQgJiAweDAwMDBGRkZGKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSW1tX1VJbnQ6Ci0JICAgICAgc3ByaW50ZiAob3BlcmFuZFtzcmNfb3BdLCAiJWx1IiwgKGluc25fd29yZCAmIDB4MDAwMEZGRkYpKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgLyogSGFuZGxlIHNwZWNpYWwgY2FzZSBmb3IgTERQIGluc3RydWN0aW9uLiAqLwotCSAgaWYgKChpbnNuX3dvcmQgJiAweEZGRkZGRjAwKSA9PSBMRFBfSU5TTikKLQkgICAgewotCSAgICAgIHN0cmNweSAobmFtZSwgImxkcCIpOwotCSAgICAgIHNwcmludGYgKG9wZXJhbmRbMF0sICIweCUwNmxYIiwgKGluc25fd29yZCAmIDB4MDAwMDAwRkYpIDw8IDE2KTsKLQkgICAgICBvcGVyYW5kWzFdWzBdID0gJ1wwJzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIC8qIEhhbmRsZSBjYXNlIGZvciBzdGFjayBhbmQgcm90YXRlIGluc3RydWN0aW9ucy4gKi8KLSAgZWxzZSBpZiAoaW5zbi0+dG0tPm9wZXJhbmRzID09IDEpCi0gICAgewotICAgICAgaWYgKGluc24tPnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gU3RhY2tPcCkKLQl7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAxRjAwMDApID4+IDE2LCBvcGVyYW5kWzBdKTsKLQl9Ci0gICAgfQotICAvKiBPdXRwdXQgaW5zdHJ1Y3Rpb24gdG8gc3RyZWFtLiAqLwotICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiAgICVzICVzJWMlcyIsIG5hbWUsCi0JCSAgICAgIG9wZXJhbmRbMF1bMF0gPyBvcGVyYW5kWzBdIDogIiIsCi0JCSAgICAgIG9wZXJhbmRbMV1bMF0gPyAnLCcgOiAnICcsCi0JCSAgICAgIG9wZXJhbmRbMV1bMF0gPyBvcGVyYW5kWzFdIDogIiIpOwotICByZXR1cm4gMTsKLX0KLQotaW50Ci1wcmludF90aHJlZV9vcGVyYW5kIChpbmZvLCBpbnNuX3dvcmQsIGluc24pCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOwotICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Ci17Ci0gIGNoYXIgb3BlcmFuZFszXVsxM10gPQotICB7Ci0gICAgezB9LAotICAgIHswfSwKLSAgICB7MH19OwotCi0gIGlmIChpbnNuLT50bSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBzd2l0Y2ggKGluc25fd29yZCAmIEFkZHJlc3NNb2RlKQotICAgIHsKLSAgICBjYXNlIEFNX1JFR0lTVEVSOgotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgb3BlcmFuZFswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIG9wZXJhbmRbMV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBTV9ESVJFQ1Q6Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCBvcGVyYW5kWzBdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFNX0lORElSRUNUOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIG9wZXJhbmRbMV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBTV9JTU06Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoaW5zbi0+dG0tPm9wZXJhbmRzID09IDMpCi0gICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMUYwMDAwKSA+PiAxNiwgb3BlcmFuZFsyXSk7Ci0gIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiICAgJXMgJXMsJXMlYyVzIiwgaW5zbi0+dG0tPm5hbWUsCi0JCSAgICAgIG9wZXJhbmRbMF0sIG9wZXJhbmRbMV0sCi0JCSAgICAgIG9wZXJhbmRbMl1bMF0gPyAnLCcgOiAnICcsCi0JCSAgICAgIG9wZXJhbmRbMl1bMF0gPyBvcGVyYW5kWzJdIDogIiIpOwotICByZXR1cm4gMTsKLX0KLQotaW50Ci1wcmludF9wYXJfaW5zbiAoaW5mbywgaW5zbl93b3JkLCBpbnNuKQotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIGluc25fd29yZDsKLSAgICAgc3RydWN0IGluc3RydWN0aW9uICppbnNuOwotewotICBzaXplX3QgaSwgbGVuOwotICBjaGFyICpuYW1lMSwgKm5hbWUyOwotICBjaGFyIG9wZXJhbmRbMl1bM11bMTNdID0KLSAgewotICAgIHsKLSAgICAgIHswfSwKLSAgICAgIHswfSwKLSAgICAgIHswfX0sCi0gICAgewotICAgICAgezB9LAotICAgICAgezB9LAotICAgICAgezB9fX07Ci0KLSAgaWYgKGluc24tPnB0bSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAvKiBQYXJzZSBvdXQgdGhlIG5hbWVzIG9mIGVhY2ggb2YgdGhlIHBhcmFsbGVsIGluc3RydWN0aW9ucyBmcm9tIHRoZQotICAgICBxX2luc24xX2luc24yIGZvcm1hdC4gKi8KLSAgbmFtZTEgPSAoY2hhciAqKSBzdHJkdXAgKGluc24tPnB0bS0+bmFtZSArIDIpOwotICBuYW1lMiA9ICIiOwotICBsZW4gPSBzdHJsZW4gKG5hbWUxKTsKLSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChuYW1lMVtpXSA9PSAnXycpCi0JewotCSAgbmFtZTIgPSAmbmFtZTFbaSArIDFdOwotCSAgbmFtZTFbaV0gPSAnXDAnOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgLyogR2V0IHRoZSBvcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYmFzZWQgb24gdGhlIG9wZXJhbmQgb3JkZXIuICovCi0gIHN3aXRjaCAoaW5zbi0+cHRtLT5vcG9yZGVyKQotICAgIHsKLSAgICBjYXNlIE9PXzRvcDE6Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzBdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVsxXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDIyKSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPT180b3AyOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXVswXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV1bMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFsxXVsxXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAyMikgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT09fNG9wMzoKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF1bMV0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzFdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMjIpICYgMHgwNywgb3BlcmFuZFswXVswXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9PXzVvcDE6Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzBdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVsxXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMjIpICYgMHgwNywgb3BlcmFuZFswXVsyXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9PXzVvcDI6Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzFdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVsxXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMF1bMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMjIpICYgMHgwNywgb3BlcmFuZFswXVsyXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9PX1BGaWVsZDoKLSAgICAgIGlmIChpbnNuX3dvcmQgJiAweDAwODAwMDAwKQotCWdldF9yZWdpc3Rlcl9vcGVyYW5kICgweDAxLCBvcGVyYW5kWzBdWzJdKTsKLSAgICAgIGVsc2UKLQlnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoMHgwMCwgb3BlcmFuZFswXVsyXSk7Ci0gICAgICBpZiAoaW5zbl93b3JkICYgMHgwMDQwMDAwMCkKLQlnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoMHgwMywgb3BlcmFuZFsxXVsyXSk7Ci0gICAgICBlbHNlCi0JZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKDB4MDIsIG9wZXJhbmRbMV1bMl0pOwotICAgICAgc3dpdGNoIChpbnNuX3dvcmQgJiBQX0ZJRUxEKQotCXsKLQljYXNlIDB4MDAwMDAwMDA6Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzFdKTsKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFswXVswXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzFdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAxMDAwMDAwOgotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFsxXVswXSk7Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMF1bMF0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVsxXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMjAwMDAwMDoKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMV1bMV0pOwotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzBdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFswXVswXSk7Ci0JICBicmVhazsKLQljYXNlIDB4MDMwMDAwMDA6Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzFdWzFdKTsKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFswXVswXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgICAlcyAlcywlcyVjJXMiLCBuYW1lMSwKLQkJICAgICAgb3BlcmFuZFswXVswXSwgb3BlcmFuZFswXVsxXSwKLQkJICAgICAgb3BlcmFuZFswXVsyXVswXSA/ICcsJyA6ICcgJywKLQkJICAgICAgb3BlcmFuZFswXVsyXVswXSA/IG9wZXJhbmRbMF1bMl0gOiAiIik7Ci0gIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiXG5cdFx0XHR8fCAlcyAlcywlcyVjJXMiLCBuYW1lMiwKLQkJICAgICAgb3BlcmFuZFsxXVswXSwgb3BlcmFuZFsxXVsxXSwKLQkJICAgICAgb3BlcmFuZFsxXVsyXVswXSA/ICcsJyA6ICcgJywKLQkJICAgICAgb3BlcmFuZFsxXVsyXVswXSA/IG9wZXJhbmRbMV1bMl0gOiAiIik7Ci0gIGZyZWUgKG5hbWUxKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotcHJpbnRfYnJhbmNoIChpbmZvLCBpbnNuX3dvcmQsIGluc24pCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOwotICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Ci17Ci0gIGNoYXIgb3BlcmFuZFsyXVsxM10gPQotICB7Ci0gICAgezB9LAotICAgIHswfX07Ci0gIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLSAgaW50IHByaW50X2xhYmVsID0gMDsKLQotICBpZiAoaW5zbi0+dG0gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgLyogR2V0IHRoZSBvcGVyYW5kcyBmb3IgMjQtYml0IGltbWVkaWF0ZSBqdW1wcy4gKi8KLSAgaWYgKGluc24tPnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgSW1tMjQpCi0gICAgewotICAgICAgYWRkcmVzcyA9IGluc25fd29yZCAmIDB4MDBGRkZGRkY7Ci0gICAgICBzcHJpbnRmIChvcGVyYW5kWzBdLCAiMHglbFgiLCBhZGRyZXNzKTsKLSAgICAgIHByaW50X2xhYmVsID0gMTsKLSAgICB9Ci0gIC8qIEdldCB0aGUgb3BlcmFuZCBmb3IgdGhlIHRyYXAgaW5zdHJ1Y3Rpb24uICovCi0gIGVsc2UgaWYgKGluc24tPnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgSVZlY3RvcikKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gaW5zbl93b3JkICYgMHgwMDAwMDAxRjsKLSAgICAgIHNwcmludGYgKG9wZXJhbmRbMF0sICIweCVsWCIsIGFkZHJlc3MpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFkZHJlc3MgPSBpbnNuX3dvcmQgJiAweDAwMDBGRkZGOwotICAgICAgLyogR2V0IHRoZSBvcGVyYW5kcyBmb3IgdGhlIERCIGluc3RydWN0aW9ucy4gKi8KLSAgICAgIGlmIChpbnNuLT50bS0+b3BlcmFuZHMgPT0gMikKLQl7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKChpbnNuX3dvcmQgJiAweDAxQzAwMDAwKSA+PiAyMikgKyBSRUdfQVIwLCBvcGVyYW5kWzBdKTsKLQkgIGlmIChpbnNuX3dvcmQgJiBQQ1JlbCkKLQkgICAgewotCSAgICAgIHNwcmludGYgKG9wZXJhbmRbMV0sICIlZCIsIChzaG9ydCkgYWRkcmVzcyk7Ci0JICAgICAgcHJpbnRfbGFiZWwgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kIChpbnNuX3dvcmQgJiAweDAwMDAwMDFGLCBvcGVyYW5kWzFdKTsKLQl9Ci0gICAgICAvKiBHZXQgdGhlIG9wZXJhbmRzIGZvciB0aGUgc3RhbmRhcmQgYnJhbmNoZXMuICovCi0gICAgICBlbHNlIGlmIChpbnNuLT50bS0+b3BlcmFuZHMgPT0gMSkKLQl7Ci0JICBpZiAoaW5zbl93b3JkICYgUENSZWwpCi0JICAgIHsKLQkgICAgICBhZGRyZXNzID0gKHNob3J0KSBhZGRyZXNzOwotCSAgICAgIHNwcmludGYgKG9wZXJhbmRbMF0sICIlbGQiLCBhZGRyZXNzKTsKLQkgICAgICBwcmludF9sYWJlbCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKGluc25fd29yZCAmIDB4MDAwMDAwMUYsIG9wZXJhbmRbMF0pOwotCX0KLSAgICB9Ci0gIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiICAgJXMgJXMlYyVzIiwgaW5zbi0+dG0tPm5hbWUsCi0JCSAgICAgIG9wZXJhbmRbMF1bMF0gPyBvcGVyYW5kWzBdIDogIiIsCi0JCSAgICAgIG9wZXJhbmRbMV1bMF0gPyAnLCcgOiAnICcsCi0JCSAgICAgIG9wZXJhbmRbMV1bMF0gPyBvcGVyYW5kWzFdIDogIiIpOwotICAvKiBQcmludCBkZXN0aW5hdGlvbiBvZiBicmFuY2ggaW4gcmVsYXRpb24gdG8gY3VycmVudCBzeW1ib2wuICovCi0gIGlmIChwcmludF9sYWJlbCAmJiBpbmZvLT5zeW1ib2xzKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bSA9ICppbmZvLT5zeW1ib2xzOwotCi0gICAgICBpZiAoKGluc24tPnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gUENSZWwpICYmIChpbnNuX3dvcmQgJiBQQ1JlbCkpCi0JewotCSAgYWRkcmVzcyA9IChfcGMgKyAxICsgKHNob3J0KSBhZGRyZXNzKSAtICgoc3ltLT5zZWN0aW9uLT52bWEgKyBzeW0tPnZhbHVlKSAvIDQpOwotCSAgLyogQ2hlY2sgZm9yIGRlbGF5ZWQgaW5zdHJ1Y3Rpb24sIGlmIHNvIGFkanVzdCBkZXN0aW5hdGlvbi4gKi8KLQkgIGlmIChpbnNuX3dvcmQgJiAweDAwMjAwMDAwKQotCSAgICBhZGRyZXNzICs9IDI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFkZHJlc3MgLT0gKChzeW0tPnNlY3Rpb24tPnZtYSArIHN5bS0+dmFsdWUpIC8gNCk7Ci0JfQotICAgICAgaWYgKGFkZHJlc3MgPT0gMCkKLQlpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiA8JXM+Iiwgc3ltLT5uYW1lKTsKLSAgICAgIGVsc2UKLQlpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiA8JXMgJWMgJWQ+Iiwgc3ltLT5uYW1lLAotCQkJICAgICgoc2hvcnQpIGFkZHJlc3MgPCAwKSA/ICctJyA6ICcrJywKLQkJCSAgICBhYnMgKGFkZHJlc3MpKTsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLWdldF9pbmRpcmVjdF9vcGVyYW5kIChmcmFnbWVudCwgc2l6ZSwgYnVmZmVyKQotICAgICB1bnNpZ25lZCBzaG9ydCBmcmFnbWVudDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLXsKLSAgdW5zaWduZWQgY2hhciBtb2Q7Ci0gIHVuc2lnbmVkIGFybnVtOwotICB1bnNpZ25lZCBjaGFyIGRpc3A7Ci0KLSAgaWYgKGJ1ZmZlciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAvKiBEZXRlcm1pbmUgd2hpY2ggYml0cyBpZGVudGlmeSB0aGUgc2VjdGlvbnMgb2YgdGhlIGluZGlyZWN0IG9wZXJhbmQgYmFzZWQgb24gdGhlCi0gICAgIHNpemUgaW4gYnl0ZXMuICovCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgbW9kID0gKGZyYWdtZW50ICYgMHgwMEY4KSA+PiAzOwotICAgICAgYXJudW0gPSAoZnJhZ21lbnQgJiAweDAwMDcpOwotICAgICAgZGlzcCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBtb2QgPSAoZnJhZ21lbnQgJiAweEY4MDApID4+IDExOwotICAgICAgYXJudW0gPSAoZnJhZ21lbnQgJiAweDA3MDApID4+IDg7Ci0gICAgICBkaXNwID0gKGZyYWdtZW50ICYgMHgwMEZGKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHsKLSAgICBjb25zdCBpbmRfYWRkcl90eXBlICpjdXJyZW50X2luZCA9IHRpYzMwX2luZGFkZHJfdGFiOwotICAgIGZvciAoOyBjdXJyZW50X2luZCA8IHRpYzMwX2luZGFkZHJ0YWJfZW5kOyBjdXJyZW50X2luZCsrKQotICAgICAgewotCWlmIChjdXJyZW50X2luZC0+bW9kZmllbGQgPT0gbW9kKQotCSAgewotCSAgICBpZiAoY3VycmVudF9pbmQtPmRpc3BsYWNlbWVudCA9PSBJTVBMSUVEX0RJU1AgJiYgc2l6ZSA9PSAyKQotCSAgICAgIHsKLQkJY29udGludWU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlzaXplX3QgaSwgbGVuOwotCQlpbnQgYnVmY250OwotCQkKLQkJbGVuID0gc3RybGVuIChjdXJyZW50X2luZC0+c3ludGF4KTsKLQkJZm9yIChpID0gMCwgYnVmY250ID0gMDsgaSA8IGxlbjsgaSsrLCBidWZjbnQrKykKLQkJICB7Ci0JCSAgICBidWZmZXJbYnVmY250XSA9IGN1cnJlbnRfaW5kLT5zeW50YXhbaV07Ci0JCSAgICBpZiAoYnVmZmVyW2J1ZmNudCAtIDFdID09ICdhJyAmJiBidWZmZXJbYnVmY250XSA9PSAncicpCi0JCSAgICAgIGJ1ZmZlclsrK2J1ZmNudF0gPSBhcm51bSArICcwJzsKLQkJICAgIGlmIChidWZmZXJbYnVmY250XSA9PSAnKCcgJiYgY3VycmVudF9pbmQtPmRpc3BsYWNlbWVudCA9PSBESVNQX1JFUVVJUkVEKQotCQkgICAgICB7Ci0JCQlzcHJpbnRmICgmYnVmZmVyW2J1ZmNudCArIDFdLCAiJXUiLCBkaXNwKTsKLQkJCWJ1ZmNudCArPSBzdHJsZW4gKCZidWZmZXJbYnVmY250ICsgMV0pOwotCQkgICAgICB9Ci0JCSAgfQotCQlidWZmZXJbYnVmY250ICsgMV0gPSAnXDAnOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKGZyYWdtZW50LCBidWZmZXIpCi0gICAgIHVuc2lnbmVkIGNoYXIgZnJhZ21lbnQ7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLXsKLSAgY29uc3QgcmVnICpjdXJyZW50X3JlZyA9IHRpYzMwX3JlZ3RhYjsKLQotICBpZiAoYnVmZmVyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIGZvciAoOyBjdXJyZW50X3JlZyA8IHRpYzMwX3JlZ3RhYl9lbmQ7IGN1cnJlbnRfcmVnKyspCi0gICAgewotICAgICAgaWYgKChmcmFnbWVudCAmIDB4MUYpID09IGN1cnJlbnRfcmVnLT5vcGNvZGUpCi0JewotCSAgc3RyY3B5IChidWZmZXIsIGN1cnJlbnRfcmVnLT5uYW1lKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLWNudnRfdG1zZmxvYXRfaWVlZSAodG1zZmxvYXQsIHNpemUsIGllZWVmbG9hdCkKLSAgICAgdW5zaWduZWQgbG9uZyB0bXNmbG9hdDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGZsb2F0ICppZWVlZmxvYXQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgZXhwLCBzaWduLCBtYW50OwotCi0gIGlmIChzaXplID09IDIpCi0gICAgewotICAgICAgaWYgKCh0bXNmbG9hdCAmIDB4MDAwMEYwMDApID09IDB4MDAwMDgwMDApCi0JdG1zZmxvYXQgPSAweDgwMDAwMDAwOwotICAgICAgZWxzZQotCXsKLQkgIHRtc2Zsb2F0IDw8PSAxNjsKLQkgIHRtc2Zsb2F0ID0gKGxvbmcpIHRtc2Zsb2F0ID4+IDQ7Ci0JfQotICAgIH0KLSAgZXhwID0gdG1zZmxvYXQgJiAweEZGMDAwMDAwOwotICBpZiAoZXhwID09IDB4ODAwMDAwMDApCi0gICAgewotICAgICAgKmllZWVmbG9hdCA9IDAuMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZXhwICs9IDB4N0YwMDAwMDA7Ci0gIHNpZ24gPSAodG1zZmxvYXQgJiAweDAwODAwMDAwKSA8PCA4OwotICBtYW50ID0gdG1zZmxvYXQgJiAweDAwN0ZGRkZGOwotICBpZiAoZXhwID09IDB4RkYwMDAwMDApCi0gICAgewotICAgICAgaWYgKG1hbnQgPT0gMCkKLQkqaWVlZWZsb2F0ID0gRVJBTkdFOwotICAgICAgaWYgKHNpZ24gPT0gMCkKLQkqaWVlZWZsb2F0ID0gMS4wIC8gMC4wOwotICAgICAgZWxzZQotCSppZWVlZmxvYXQgPSAtMS4wIC8gMC4wOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBleHAgPj49IDE7Ci0gIGlmIChzaWduKQotICAgIHsKLSAgICAgIG1hbnQgPSAofm1hbnQpICYgMHgwMDdGRkZGRjsKLSAgICAgIG1hbnQgKz0gMTsKLSAgICAgIGV4cCArPSBtYW50ICYgMHgwMDgwMDAwMDsKLSAgICAgIGV4cCAmPSAweDdGODAwMDAwOwotICAgICAgbWFudCAmPSAweDAwN0ZGRkZGOwotICAgIH0KLSAgaWYgKHRtc2Zsb2F0ID09IDB4ODAwMDAwMDApCi0gICAgc2lnbiA9IG1hbnQgPSBleHAgPSAwOwotICB0bXNmbG9hdCA9IHNpZ24gfCBleHAgfCBtYW50OwotICAqaWVlZWZsb2F0ID0gKigoZmxvYXQgKikgJnRtc2Zsb2F0KTsKLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3RpYzgwLWRpcy5jIGIvb3Bjb2Rlcy90aWM4MC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2YmMxMi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3RpYzgwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qIFByaW50IFRJIFRNUzMyMEM4MCAoTVZQKSBpbnN0cnVjdGlvbnMKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3RpYzgwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi1zdGF0aWMgaW50IGxlbmd0aDsKLQotc3RhdGljIHZvaWQgcHJpbnRfb3BlcmFuZF9iaXRudW0gUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgbG9uZykpOwotc3RhdGljIHZvaWQgcHJpbnRfb3BlcmFuZF9jb25kaXRpb25fY29kZSBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2NvbnRyb2xfcmVnaXN0ZXIgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgbG9uZykpOwotc3RhdGljIHZvaWQgcHJpbnRfb3BlcmFuZF9mbG9hdCBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2ludGVnZXIgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgbG9uZykpOwotc3RhdGljIHZvaWQgcHJpbnRfb3BlcmFuZCBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nLCB1bnNpZ25lZCBsb25nLAotCQkJCSAgIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGVyYW5kICosIGJmZF92bWEpKTsKLXN0YXRpYyBpbnQgcHJpbnRfb25lX2luc3RydWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJmZF92bWEsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZywgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqKSk7Ci1zdGF0aWMgaW50IHByaW50X2luc3RydWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJmZF92bWEsIHVuc2lnbmVkIGxvbmcsCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqKSk7Ci1zdGF0aWMgaW50IGZpbGxfaW5zdHJ1Y3Rpb24gUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX3ZtYSwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKikpOwotCi0MCi0vKiBQcmludCBhbiBpbnRlZ2VyIG9wZXJhbmQuICBUcnkgdG8gYmUgc29tZXdoYXQgc21hcnQgYWJvdXQgdGhlCi0gICBmb3JtYXQgYnkgYXNzdW1pbmcgdGhhdCBzbWFsbCBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBpbnRlZ2VycyBhcmUKLSAgIHByb2JhYmx5IGxvb3AgaW5jcmVtZW50IHZhbHVlcywgc3RydWN0dXJlIG9mZnNldHMsIG9yIHNpbWlsYXIKLSAgIHZhbHVlcyB0aGF0IGFyZSBtb3JlIG1lYW5pbmdmdWwgcHJpbnRlZCBhcyBzaWduZWQgZGVjaW1hbCB2YWx1ZXMuCi0gICBMYXJnZXIgbnVtYmVycyBhcmUgcHJvYmFibHkgYmV0dGVyIHByaW50ZWQgYXMgaGV4IHZhbHVlcy4gKi8KLQotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmRfaW50ZWdlciAoaW5mbywgdmFsdWUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBsb25nIHZhbHVlOwotewotICBpZiAoKHZhbHVlID4gOTk5OSB8fCB2YWx1ZSA8IC05OTk5KSkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlI2x4IiwgdmFsdWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLSAgICB9Ci19Ci0KLQwKLS8qIEZJWE1FOiBkZXBlbmRzIHVwb24gc2l6ZW9mIChsb25nKSA9PSBzaXplb2YgKGZsb2F0KSBhbmQKLSAgIGFsc28gdXBvbiBob3N0IGZsb2F0aW5nIHBvaW50IGZvcm1hdCBtYXRjaGluZyB0YXJnZXQKLSAgIGZsb2F0aW5nIHBvaW50IGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmRfZmxvYXQgKGluZm8sIHZhbHVlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLXsKLSAgdW5pb24geyBmbG9hdCBmOyBsb25nIGw7IH0gZnZhbDsKLQotICBmdmFsLmwgPSB2YWx1ZTsKLSAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJWciLCBmdmFsLmYpOwotfQotCi0MCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZF9jb250cm9sX3JlZ2lzdGVyIChpbmZvLCB2YWx1ZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIGNvbnN0IGNoYXIgKnRtcDsKLQotICB0bXAgPSB0aWM4MF92YWx1ZV90b19zeW1ib2wgKHZhbHVlLCBUSUM4MF9PUEVSQU5EX0NSKTsKLSAgaWYgKHRtcCAhPSBOVUxMKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiVzIiwgdG1wKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlI2x4IiwgdmFsdWUpOwotICAgIH0KLX0KLQotDAotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmRfY29uZGl0aW9uX2NvZGUgKGluZm8sIHZhbHVlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLXsKLSAgY29uc3QgY2hhciAqdG1wOwotCi0gIHRtcCA9IHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCAodmFsdWUsIFRJQzgwX09QRVJBTkRfQ0MpOwotICBpZiAodG1wICE9IE5VTEwpCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJXMiLCB0bXApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLSAgICB9Ci19Ci0KLQwKLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kX2JpdG51bSAoaW5mbywgdmFsdWUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBsb25nIHZhbHVlOwotewotICBpbnQgYml0bnVtOwotICBjb25zdCBjaGFyICp0bXA7Ci0KLSAgYml0bnVtID0gfnZhbHVlICYgMHgxRjsKLSAgdG1wID0gdGljODBfdmFsdWVfdG9fc3ltYm9sIChiaXRudW0sIFRJQzgwX09QRVJBTkRfQklUTlVNKTsKLSAgaWYgKHRtcCAhPSBOVUxMKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiVzIiwgdG1wKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlbGQiLCBiaXRudW0pOwotICAgIH0KLX0KLQotDAotLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGZsYWdzLiAgKi8KLQotI2RlZmluZSBNX1NJKGluc24sb3ApICgoKChvcCkgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01fU0kpICE9IDApICYmICgoaW5zbikgJiAoMSA8PCAxNykpKQotI2RlZmluZSBNX0xJKGluc24sb3ApICgoKChvcCkgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01fTEkpICE9IDApICYmICgoaW5zbikgJiAoMSA8PCAxNSkpKQotI2RlZmluZSBSX1NDQUxFRChpbnNuLG9wKSAoKCgob3ApIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9TQ0FMRUQpICE9IDApICYmICgoaW5zbikgJiAoMSA8PCAxMSkpKQotCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZCAoaW5mbywgdmFsdWUsIGluc24sIG9wZXJhbmQsIG1lbWFkZHIpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGVyYW5kICpvcGVyYW5kOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci17Ci0gIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfR1BSKSAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgInIlbGQiLCB2YWx1ZSk7Ci0gICAgICBpZiAoTV9TSSAoaW5zbiwgb3BlcmFuZCkgfHwgTV9MSSAoaW5zbiwgb3BlcmFuZCkpCi0JewotCSAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiOm0iKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfRlBBKSAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgImElbGQiLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfUENSRUwpICE9IDApCi0gICAgewotICAgICAgKCppbmZvIC0+IHByaW50X2FkZHJlc3NfZnVuYykgKG1lbWFkZHIgKyA0ICogdmFsdWUsIGluZm8pOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0JBU0VSRUwpICE9IDApCi0gICAgewotICAgICAgKCppbmZvIC0+IHByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9CSVROVU0pICE9IDApCi0gICAgewotICAgICAgcHJpbnRfb3BlcmFuZF9iaXRudW0gKGluZm8sIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9DQykgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9vcGVyYW5kX2NvbmRpdGlvbl9jb2RlIChpbmZvLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfQ1IpICE9IDApCi0gICAgewotICAgICAgcHJpbnRfb3BlcmFuZF9jb250cm9sX3JlZ2lzdGVyIChpbmZvLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfRkxPQVQpICE9IDApCi0gICAgewotICAgICAgcHJpbnRfb3BlcmFuZF9mbG9hdCAoaW5mbywgdmFsdWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0JJVEZJRUxEKSkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlI2x4IiwgdmFsdWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50X29wZXJhbmRfaW50ZWdlciAoaW5mbywgdmFsdWUpOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgc2NhbGVkIG9wZXJhbmQsIHRoZW4gcHJpbnQgdGhlIG1vZGlmaWVyICovCi0KLSAgaWYgKFJfU0NBTEVEIChpbnNuLCBvcGVyYW5kKSkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICI6cyIpOwotICAgIH0KLX0KLQotDAotLyogV2UgaGF2ZSBjaG9zZW4gYW4gb3Bjb2RlIHRhYmxlIGVudHJ5ICovCi0KLXN0YXRpYyBpbnQKLXByaW50X29uZV9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbiwgb3Bjb2RlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wY29kZTsKLXsKLSAgY29uc3Qgc3RydWN0IHRpYzgwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gIGxvbmcgdmFsdWU7Ci0gIGludCBzdGF0dXM7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXg7Ci0gIGludCBjbG9zZV9wYXJlbjsKLQotICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlLTEwcyIsIG9wY29kZSAtPiBuYW1lKTsKLQotICBmb3IgKG9waW5kZXggPSBvcGNvZGUgLT4gb3BlcmFuZHM7ICpvcGluZGV4ICE9IDA7IG9waW5kZXgrKykKLSAgICB7Ci0gICAgICBvcGVyYW5kID0gdGljODBfb3BlcmFuZHMgKyAqb3BpbmRleDsKLQotICAgICAgLyogRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgaWYgKG9wZXJhbmQgLT4gZXh0cmFjdCkKLQl7Ci0JICB2YWx1ZSA9ICgqb3BlcmFuZCAtPiBleHRyYWN0KSAoaW5zbiwgKGludCAqKSBOVUxMKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGVyYW5kIC0+IGJpdHMgPT0gMzIpCi0JewotCSAgc3RhdHVzID0gZmlsbF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgKHVuc2lnbmVkIGxvbmcgKikgJnZhbHVlKTsKLQkgIGlmIChzdGF0dXMgPT0gLTEpCi0JICAgIHsKLQkgICAgICByZXR1cm4gKHN0YXR1cyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdmFsdWUgPSAoaW5zbiA+PiBvcGVyYW5kIC0+IHNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kIC0+IGJpdHMpIC0gMSk7Ci0JICBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NJR05FRCkgIT0gMAotCSAgICAgICYmICh2YWx1ZSAmICgxIDw8IChvcGVyYW5kIC0+IGJpdHMgLSAxKSkpICE9IDApCi0JICAgIHsKLQkgICAgICB2YWx1ZSAtPSAxIDw8IG9wZXJhbmQgLT4gYml0czsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGlzIGVuY2xvc2VkIGluIHBhcmVudGhlc2lzLCB0aGVuIHByaW50Ci0JIHRoZSBvcGVuIHBhcmVuLCBvdGhlcndpc2UganVzdCBwcmludCB0aGUgcmVndWxhciBjb21tYQotCSBzZXBhcmF0b3IsIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IG9wZXJhbmQuICovCi0KLSAgICAgIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfUEFSRU5TKSA9PSAwKQotCXsKLQkgIGNsb3NlX3BhcmVuID0gMDsKLQkgIGlmIChvcGluZGV4ICE9IG9wY29kZSAtPiBvcGVyYW5kcykKLQkgICAgewotCSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiwiKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjbG9zZV9wYXJlbiA9IDE7Ci0JICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIoIik7Ci0JfQotCi0gICAgICBwcmludF9vcGVyYW5kIChpbmZvLCB2YWx1ZSwgaW5zbiwgb3BlcmFuZCwgbWVtYWRkcik7Ci0KLSAgICAgIC8qIElmIHdlIHByaW50ZWQgYW4gb3BlbiBwYXJlbiBiZWZvcmUgcHJpbnRpbmcgdGhpcyBvcGVyYW5kLCBjbG9zZQotCSBpdCBub3cuIFRoZSBmbGFnIGdldHMgcmVzZXQgb24gZWFjaCBsb29wLiAqLwotCi0gICAgICBpZiAoY2xvc2VfcGFyZW4pCi0JewotCSAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiKSIpOwotCX0KLSAgICB9Ci0gIHJldHVybiAobGVuZ3RoKTsKLX0KLQotDAotCi0vKiBUaGVyZSBhcmUgbm8gc3BlY2lmaWMgYml0cyB0aGF0IHRlbGwgdXMgZm9yIGNlcnRhaW4gd2hldGhlciBhIHZlY3RvcgotICAgaW5zdHJ1Y3Rpb24gb3Bjb2RlIGNvbnRhaW5zIG9uZSBvciB0d28gaW5zdHJ1Y3Rpb25zLiAgSG93ZXZlciBzaW5jZQotICAgYSBkZXN0aW5hdGlvbiByZWdpc3RlciBvZiByMCBpcyBpbGxlZ2FsLCB3ZSBjYW4gY2hlY2sgZm9yIG5vbnplcm8KLSAgIHZhbHVlcyBpbiBib3RoIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGZpZWxkcy4gIE9ubHkgb3Bjb2RlcyB0aGF0IGhhdmUKLSAgIHR3byB2YWxpZCBpbnN0cnVjdGlvbnMgd2lsbCBoYXZlIG5vbi16ZXJvIGluIGJvdGggKi8KLQotI2RlZmluZSBUV09fSU5TTihpbnNuKSAoKCgoaW5zbikgJiAoMHgxRiA8PCAyNykpICE9IDApICYmICgoKGluc24pICYgKDB4MUYgPDwgMjIpKSAhPSAwKSkKLQotc3RhdGljIGludAotcHJpbnRfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc24sIHZlY19vcGNvZGUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqdmVjX29wY29kZTsKLXsKLSAgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOwotICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGNvZGVfZW5kOwotCi0gIC8qIEZpbmQgdGhlIGZpcnN0IG9wY29kZSBtYXRjaCBpbiB0aGUgb3Bjb2RlcyB0YWJsZS4gIEZvciB2ZWN0b3IKLSAgICAgb3Bjb2RlcyAodmVjX29wY29kZSAhPSBOVUxMKSBmaW5kIHRoZSBmaXJzdCBtYXRjaCB0aGF0IGlzIG5vdCB0aGUKLSAgICAgcHJldmlvdXNseSBmb3VuZCBtYXRjaC4gIEZJWE1FOiB0aGVyZSBzaG91bGQgYmUgZmFzdGVyIHdheXMgdG8KLSAgICAgc2VhcmNoIChoYXNoIHRhYmxlIG9yIGJpbmFyeSBzZWFyY2gpLCBidXQgZG9uJ3Qgd29ycnkgdG9vIG11Y2gKLSAgICAgYWJvdXQgaXQgdW50aWwgb3RoZXIgVEljODAgc3VwcG9ydCBpcyBmaW5pc2hlZC4gKi8KLQotICBvcGNvZGVfZW5kID0gdGljODBfb3Bjb2RlcyArIHRpYzgwX251bV9vcGNvZGVzOwotICBmb3IgKG9wY29kZSA9IHRpYzgwX29wY29kZXM7IG9wY29kZSA8IG9wY29kZV9lbmQ7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIGlmICgoaW5zbiAmIG9wY29kZSAtPiBtYXNrKSA9PSBvcGNvZGUgLT4gb3Bjb2RlICYmCi0JICBvcGNvZGUgIT0gdmVjX29wY29kZSkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChvcGNvZGUgPT0gb3Bjb2RlX2VuZCkKLSAgICB7Ci0gICAgICAvKiBObyBtYXRjaCBmb3VuZCwganVzdCBwcmludCB0aGUgYml0cyBhcyBhIC53b3JkIGRpcmVjdGl2ZSAqLwotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiLndvcmQgJSMwOGx4IiwgaW5zbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTWF0Y2ggZm91bmQsIGRlY29kZSB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgbGVuZ3RoID0gcHJpbnRfb25lX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNuLCBvcGNvZGUpOwotICAgICAgaWYgKG9wY29kZSAtPiBmbGFncyAmIFRJQzgwX1ZFQ1RPUiAmJiB2ZWNfb3Bjb2RlID09IE5VTEwgJiYgVFdPX0lOU04gKGluc24pKQotCXsKLQkgIC8qIFRoZXJlIGlzIGFub3RoZXIgaW5zdHJ1Y3Rpb24gdG8gcHJpbnQgZnJvbSB0aGUgc2FtZSBvcGNvZGUuCi0JICAgICBQcmludCB0aGUgc2VwYXJhdG9yIGFuZCB0aGVuIGZpbmQgYW5kIHByaW50IHRoZSBvdGhlcgotCSAgICAgaW5zdHJ1Y3Rpb24uICovCi0JICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIgICB8fCAgICIpOwotCSAgbGVuZ3RoID0gcHJpbnRfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc24sIG9wY29kZSk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChsZW5ndGgpOwotfQotCi0vKiBHZXQgdGhlIG5leHQgMzIgYml0IHdvcmQgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtIGFuZCBjb252ZXJ0IGl0Ci0gICBpbnRvIGludGVybmFsIGZvcm1hdCBpbiB0aGUgdW5zaWduZWQgbG9uZyBJTlNOLCBmb3Igd2hpY2ggd2UgYXJlCi0gICBwYXNzZWQgdGhlIGFkZHJlc3MuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4gKi8KLQotc3RhdGljIGludAotZmlsbF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbnApCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmluc25wOwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIGludCBzdGF0dXM7Ci0KLSAgLyogR2V0IHRoZSBiaXRzIGZvciB0aGUgbmV4dCAzMiBiaXQgd29yZCBhbmQgcHV0IGluIGJ1ZmZlciAqLwotCi0gIHN0YXR1cyA9ICgqaW5mbyAtPiByZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIGxlbmd0aCwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBtZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gKC0xKTsKLSAgICB9Ci0KLSAgLyogUmVhZCB3YXMgc3VjY2Vzc2Z1bCwgc28gaW5jcmVtZW50IGNvdW50IG9mIGJ5dGVzIHJlYWQgYW5kIGNvbnZlcnQKLSAgICAgdGhlIGJpdHMgaW50byBpbnRlcm5hbCBmb3JtYXQuICovCi0gICAgIAotICBsZW5ndGggKz0gNDsKLSAgaWYgKGluZm8gLT4gZW5kaWFuID09IEJGRF9FTkRJQU5fTElUVExFKQotICAgIHsKLSAgICAgICppbnNucCA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0gICAgfQotICBlbHNlIGlmIChpbmZvIC0+IGVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRykKLSAgICB7Ci0gICAgICAqaW5zbnAgPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBTaG91bGQgcHJvYmFibHkganVzdCBkZWZhdWx0IHRvIG9uZSBvciB0aGUgb3RoZXIgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KLQotDAotaW50IAotcHJpbnRfaW5zbl90aWM4MCAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBpbnQgc3RhdHVzOwotCi0gIGxlbmd0aCA9IDA7Ci0gIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gODsKLSAgc3RhdHVzID0gZmlsbF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgJmluc24pOwotICBpZiAoc3RhdHVzICE9IC0xKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IHByaW50X2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNuLCBOVUxMKTsKLSAgICB9Ci0gIHJldHVybiAoc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvdGljODAtb3BjLmMgYi9vcGNvZGVzL3RpYzgwLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjVjMzA4Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvdGljODAtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE2ICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBmb3IgVEkgVE1TMzIwQzgwIChNVlApLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS90aWM4MC5oIgotCi0vKiBUaGlzIGZpbGUgaG9sZHMgdmFyaW91cyB0YWJsZXMgZm9yIHRoZSBUTVMzMjBDODAgKE1WUCkuCi0KLSAgIFRoZSBvcGNvZGUgdGFibGUgaXMgc3RyaWN0bHkgY29uc3RhbnQgZGF0YSwgc28gdGhlIGNvbXBpbGVyIHNob3VsZAotICAgYmUgYWJsZSB0byBwdXQgaXQgaW4gdGhlIC50ZXh0IHNlY3Rpb24uCi0KLSAgIFRoaXMgZmlsZSBhbHNvIGhvbGRzIHRoZSBvcGVyYW5kIHRhYmxlLiAgQWxsIGtub3dsZWRnZSBhYm91dAotICAgaW5zZXJ0aW5nIG9wZXJhbmRzIGludG8gaW5zdHJ1Y3Rpb25zIGFuZCB2aWNlLXZlcnNhIGlzIGtlcHQgaW4gdGhpcwotICAgZmlsZS4KLQotICAgVGhlIHByZWRlZmluZWQgcmVnaXN0ZXIgdGFibGUgbWFwcyBmcm9tIHJlZ2lzdGVyIG5hbWVzIHRvIHJlZ2lzdGVyCi0gICB2YWx1ZXMuICAqLwotCi0MCi0vKiBUYWJsZSBvZiBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcywgc3VjaCBhcyBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLAotICAgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLCBjb25kaXRpb24gY29kZXMsIGNvbnRyb2wgcmVnaXN0ZXJzLCBhbmQgYml0Ci0gICBudW1iZXJzLgotCi0gICBUaGUgdGFibGUgaXMgc29ydGVkIGNhc2UgaW5kZXBlbmRlbnRseSBieSBuYW1lIHNvIHRoYXQgaXQgaXMgc3VpdGFibGUgZm9yCi0gICBzZWFyY2hpbmcgdmlhIGEgYmluYXJ5IHNlYXJjaCB1c2luZyBhIGNhc2UgaW5kZXBlbmRlbnQgY29tcGFyaXNvbgotICAgZnVuY3Rpb24uCi0KLSAgIE5vdGUgdGhhdCB0aGUgdHlwZSBvZiB0aGUgc3ltYm9sIGlzIHN0b3JlZCBpbiB0aGUgdXBwZXIgYml0cyBvZiB0aGUgdmFsdWUKLSAgIGZpZWxkLCB3aGljaCBhbGxvd3MgdGhlIHZhbHVlIGFuZCB0eXBlIHRvIGJlIHBhc3NlZCBhcm91bmQgYXMgYSB1bml0IGluIGEKLSAgIHNpbmdsZSBpbnQuICBUaGUgdHlwZXMgaGF2ZSB0byBiZSBtYXNrZWQgb2ZmIGJlZm9yZSB1c2luZyB0aGUgbnVtZXJpYwotICAgdmFsdWUgYXMgYSBudW1iZXIuCi0qLwotCi1jb25zdCBzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wgdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzW10gPQotewotICB7ICJhMCIsCVRJQzgwX09QRVJBTkRfRlBBIHwgMCB9LAotICB7ICJhMSIsCVRJQzgwX09QRVJBTkRfRlBBIHwgMSB9LAotICB7ICJhbHcuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCA3IH0sCi0gIHsgImFsdy5oIiwJVElDODBfT1BFUkFORF9DQyB8IDE1IH0sCi0gIHsgImFsdy53IiwJVElDODBfT1BFUkFORF9DQyB8IDIzIH0sCi0gIHsgIkFOQVNUQVQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzNCB9LAotICB7ICJCUksxIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzkgfSwKLSAgeyAiQlJLMiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDNBIH0sCi0gIHsgIkNPTkZJRyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAyIH0sCi0gIHsgIkRMUlUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg1MDAgfSwKLSAgeyAiRFRBRzAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDAgfSwKLSAgeyAiRFRBRzEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDEgfSwKLSAgeyAiRFRBRzEwIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBBIH0sCi0gIHsgIkRUQUcxMSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwQiB9LAotICB7ICJEVEFHMTIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEMgfSwKLSAgeyAiRFRBRzEzIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBEIH0sCi0gIHsgIkRUQUcxNCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwRSB9LAotICB7ICJEVEFHMTUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEYgfSwKLSAgeyAiRFRBRzIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDIgfSwKLSAgeyAiRFRBRzMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDMgfSwKLSAgeyAiRFRBRzQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDQgfSwKLSAgeyAiRFRBRzUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDUgfSwKLSAgeyAiRFRBRzYiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDYgfSwKLSAgeyAiRFRBRzciLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDcgfSwKLSAgeyAiRFRBRzgiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDggfSwKLSAgeyAiRFRBRzkiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDkgfSwKLSAgeyAiRUNPTUNOVEwiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzMyB9LAotICB7ICJFSVAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMSB9LAotICB7ICJFUEMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMCB9LAotICB7ICJlcS5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMCB9LAotICB7ICJlcS5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjAgfSwKLSAgeyAiZXEuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDEwIH0sCi0gIHsgImVxLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMCB9LAotICB7ICJlcTAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCAyIH0sCi0gIHsgImVxMC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDEwIH0sCi0gIHsgImVxMC53IiwJVElDODBfT1BFUkFORF9DQyB8IDE4IH0sCi0gIHsgIkZMVEFEUiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDExIH0sCi0gIHsgIkZMVERUSCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDE0IH0sCi0gIHsgIkZMVERUTCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDEzIH0sCi0gIHsgIkZMVE9QIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MTAgfSwKLSAgeyAiRkxUVEFHIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MTIgfSwKLSAgeyAiRlBTVCIsCVRJQzgwX09QRVJBTkRfQ1IgfCA4IH0sCi0gIHsgImdlLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA1IH0sCi0gIHsgImdlLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNSB9LAotICB7ICJnZS5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTUgfSwKLSAgeyAiZ2UudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI1IH0sCi0gIHsgImdlMC5iIiwJVElDODBfT1BFUkFORF9DQyB8IDMgfSwKLSAgeyAiZ2UwLmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTEgfSwKLSAgeyAiZ2UwLnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTkgfSwKLSAgeyAiZ3QuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIgfSwKLSAgeyAiZ3QuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIyIH0sCi0gIHsgImd0LmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxMiB9LAotICB7ICJndC53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjIgfSwKLSAgeyAiZ3QwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMSB9LAotICB7ICJndDAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCA5IH0sCi0gIHsgImd0MC53IiwJVElDODBfT1BFUkFORF9DQyB8IDE3IH0sCi0gIHsgImhpLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA2IH0sCi0gIHsgImhpLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxNiB9LAotICB7ICJoaS53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjYgfSwKLSAgeyAiaHMuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDkgfSwKLSAgeyAiaHMuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDE5IH0sCi0gIHsgImhzLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyOSB9LAotICB7ICJpYi5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjggfSwKLSAgeyAiSUUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgNiB9LAotICB7ICJJTFJVIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzAwIH0sCi0gIHsgImluLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNyB9LAotICB7ICJJTjBQIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAwMCB9LAotICB7ICJJTjFQIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAwMSB9LAotICB7ICJJTlRQRU4iLAlUSUM4MF9PUEVSQU5EX0NSIHwgNCB9LAotICB7ICJJVEFHMCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwMCB9LAotICB7ICJJVEFHMSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwMSB9LAotICB7ICJJVEFHMTAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEEgfSwKLSAgeyAiSVRBRzExIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBCIH0sCi0gIHsgIklUQUcxMiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwQyB9LAotICB7ICJJVEFHMTMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEQgfSwKLSAgeyAiSVRBRzE0IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBFIH0sCi0gIHsgIklUQUcxNSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwRiB9LAotICB7ICJJVEFHMiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwMiB9LAotICB7ICJJVEFHMyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwMyB9LAotICB7ICJJVEFHNCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwNCB9LAotICB7ICJJVEFHNSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwNSB9LAotICB7ICJJVEFHNiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwNiB9LAotICB7ICJJVEFHNyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwNyB9LAotICB7ICJJVEFHOCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwOCB9LAotICB7ICJJVEFHOSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwOSB9LAotICB7ICJsZS5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMyB9LAotICB7ICJsZS5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjMgfSwKLSAgeyAibGUuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDEzIH0sCi0gIHsgImxlLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMyB9LAotICB7ICJsZTAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCA2IH0sCi0gIHsgImxlMC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDE0IH0sCi0gIHsgImxlMC53IiwJVElDODBfT1BFUkFORF9DQyB8IDIyIH0sCi0gIHsgImxvLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA4IH0sCi0gIHsgImxvLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxOCB9LAotICB7ICJsby53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjggfSwKLSAgeyAibHMuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDcgfSwKLSAgeyAibHMuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDE3IH0sCi0gIHsgImxzLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNyB9LAotICB7ICJsdC5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgNCB9LAotICB7ICJsdC5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjQgfSwKLSAgeyAibHQuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDE0IH0sCi0gIHsgImx0LnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNCB9LAotICB7ICJsdDAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCA0IH0sCi0gIHsgImx0MC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDEyIH0sCi0gIHsgImx0MC53IiwJVElDODBfT1BFUkFORF9DQyB8IDIwIH0sCi0gIHsgIk1JUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDMxIH0sCi0gIHsgIk1QQyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDMwIH0sCi0gIHsgIm5lLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxIH0sCi0gIHsgIm5lLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMSB9LAotICB7ICJuZS5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTEgfSwKLSAgeyAibmUudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIxIH0sCi0gIHsgIm5lMC5iIiwJVElDODBfT1BFUkFORF9DQyB8IDUgfSwKLSAgeyAibmUwLmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTMgfSwKLSAgeyAibmUwLnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMjEgfSwKLSAgeyAibmV2LmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMCB9LAotICB7ICJuZXYuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCA4IH0sCi0gIHsgIm5ldi53IiwJVElDODBfT1BFUkFORF9DQyB8IDE2IH0sCi0gIHsgIm9iLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyOSB9LAotICB7ICJvci5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMzEgfSwKLSAgeyAib3UuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI2IH0sCi0gIHsgIk9VVFAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDAyIH0sCi0gIHsgIlBLVFJFUSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweEQgfSwKLSAgeyAiUFBFUlJPUiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweEEgfSwKLSAgeyAicjAiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDAgfSwKLSAgeyAicjEiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDEgfSwKLSAgeyAicjEwIiwJVElDODBfT1BFUkFORF9HUFIgfCAxMCB9LAotICB7ICJyMTEiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDExIH0sCi0gIHsgInIxMiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTIgfSwKLSAgeyAicjEzIiwJVElDODBfT1BFUkFORF9HUFIgfCAxMyB9LAotICB7ICJyMTQiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE0IH0sCi0gIHsgInIxNSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTUgfSwKLSAgeyAicjE2IiwJVElDODBfT1BFUkFORF9HUFIgfCAxNiB9LAotICB7ICJyMTciLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE3IH0sCi0gIHsgInIxOCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTggfSwKLSAgeyAicjE5IiwJVElDODBfT1BFUkFORF9HUFIgfCAxOSB9LAotICB7ICJyMiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMiB9LAotICB7ICJyMjAiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDIwIH0sCi0gIHsgInIyMSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjEgfSwKLSAgeyAicjIyIiwJVElDODBfT1BFUkFORF9HUFIgfCAyMiB9LAotICB7ICJyMjMiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDIzIH0sCi0gIHsgInIyNCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjQgfSwKLSAgeyAicjI1IiwJVElDODBfT1BFUkFORF9HUFIgfCAyNSB9LAotICB7ICJyMjYiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI2IH0sCi0gIHsgInIyNyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjcgfSwKLSAgeyAicjI4IiwJVElDODBfT1BFUkFORF9HUFIgfCAyOCB9LAotICB7ICJyMjkiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI5IH0sCi0gIHsgInIzIiwJVElDODBfT1BFUkFORF9HUFIgfCAzIH0sCi0gIHsgInIzMCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMzAgfSwKLSAgeyAicjMxIiwJVElDODBfT1BFUkFORF9HUFIgfCAzMSB9LAotICB7ICJyNCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgNCB9LAotICB7ICJyNSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgNSB9LAotICB7ICJyNiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgNiB9LAotICB7ICJyNyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgNyB9LAotICB7ICJyOCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgOCB9LAotICB7ICJyOSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgOSB9LAotICB7ICJTWVNTVEsiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMCB9LAotICB7ICJTWVNUTVAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMSB9LAotICB7ICJUQ09VTlQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHhFIH0sCi0gIHsgIlRTQ0FMRSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweEYgfSwKLSAgeyAidW8uZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDMwIH0sCi19OwotCi1jb25zdCBpbnQgdGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9scyA9IHNpemVvZiAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKSAvIHNpemVvZiAoc3RydWN0IHByZWRlZmluZWRfc3ltYm9sKTsKLQotLyogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHByZWRlZmluZWQgc3ltYm9sIG5hbWUgaW4gTkFNRSwgc3ltYm9sIGNsYXNzCi0gICBpbiBDTEFTUywgYW5kIHRyYW5zbGF0ZXMgaXQgdG8gYSBudW1lcmljIHZhbHVlLCB3aGljaCBpdCByZXR1cm5zLgotCi0gICBJZiBDTEFTUyBpcyB6ZXJvLCBhbnkgc3ltYm9sIHRoYXQgbWF0Y2hlcyBOQU1FIGlzIHRyYW5zbGF0ZWQuICBJZgotICAgQ0xBU1MgaXMgbm9uLXplcm8sIHRoZW4gb25seSBhIHN5bWJvbCB0aGF0IGhhcyBjbGFzcyBDTEFTUyBpcwotICAgbWF0Y2hlZC4KLQotICAgSWYgbm8gdHJhbnNsYXRpb24gaXMgcG9zc2libGUsIGl0IHJldHVybnMgLTEsIGEgdmFsdWUgbm90IHVzZWQgYnkKLSAgIGFueSBwcmVkZWZpbmVkIHN5bWJvbC4gTm90ZSB0aGF0IHRoZSBwcmVkZWZpbmVkIHN5bWJvbCBhcnJheSBpcwotICAgcHJlc29ydGVkIGNhc2UgaW5kZXBlbmRlbnRseSBieSBuYW1lLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGVyZSBhcmUgbm8KLSAgIGR1cGxpY2F0ZSBuYW1lcyBpbiB0aGUgcHJlZGVmaW5lZCBzeW1ib2wgYXJyYXksIHdoaWNoIGhhcHBlbnMgdG8gYmUKLSAgIHRydWUgYXQgdGhlIG1vbWVudC4KLQotICovCi0KLWludAotdGljODBfc3ltYm9sX3RvX3ZhbHVlIChuYW1lLCBjbGFzcykKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IGNsYXNzOwotewotICBjb25zdCBzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wgKnBkc3A7Ci0gIGludCBsb3cgPSAwOwotICBpbnQgbWlkZGxlOwotICBpbnQgaGlnaCA9IHRpYzgwX251bV9wcmVkZWZpbmVkX3N5bWJvbHMgLSAxOwotICBpbnQgY21wOwotICBpbnQgcnRudmFsID0gLTE7Ci0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKQotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHNbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCXsKLQkgIGhpZ2ggPSBtaWRkbGUgLSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JewotCSAgbG93ID0gbWlkZGxlICsgMTsKLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgIHBkc3AgPSAmdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzW21pZGRsZV07Ci0JICBpZiAoKGNsYXNzID09IDApIHx8IChjbGFzcyAmIFBEU19WQUxVRSAocGRzcCkpKQotCSAgICB7Ci0JICAgICAgcnRudmFsID0gUERTX1ZBTFVFIChwZHNwKTsKLQkgICAgfQotCSAgLyogRm9yIG5vdyB3ZSBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlIG5hbWVzICovCi0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gKHJ0bnZhbCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSB2YWx1ZSBWQUwgYW5kIGZpbmRzIGEgbWF0Y2hpbmcgcHJlZGVmaW5lZAotICAgc3ltYm9sIHRoYXQgaXMgaW4gdGhlIG9wZXJhbmQgY2xhc3Mgc3BlY2lmaWVkIGJ5IENMQVNTLiAgSWYgQ0xBU1MKLSAgIGlzIHplcm8sIHRoZSBmaXJzdCBtYXRjaGluZyBzeW1ib2wgaXMgcmV0dXJuZWQuICovCi0KLWNvbnN0IGNoYXIgKgotdGljODBfdmFsdWVfdG9fc3ltYm9sICh2YWwsIGNsYXNzKQotICAgICBpbnQgdmFsOwotICAgICBpbnQgY2xhc3M7Ci17Ci0gIGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqcGRzcDsKLSAgaW50IGl2YWw7Ci0gIGNoYXIgKm5hbWU7Ci0KLSAgbmFtZSA9IE5VTEw7Ci0gIGZvciAocGRzcCA9IHRpYzgwX3ByZWRlZmluZWRfc3ltYm9sczsKLSAgICAgICBwZHNwIDwgdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzICsgdGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9sczsKLSAgICAgICBwZHNwKyspCi0gICAgewotICAgICAgaXZhbCA9IFBEU19WQUxVRSAocGRzcCkgJiB+VElDODBfT1BFUkFORF9NQVNLOwotICAgICAgaWYgKGl2YWwgPT0gdmFsKQotCXsKLQkgIGlmICgoY2xhc3MgPT0gMCkgfHwgKGNsYXNzICYgUERTX1ZBTFVFIChwZHNwKSkpCi0JICAgIHsKLQkgICAgICAvKiBGb3VuZCB0aGUgZGVzaXJlZCBtYXRjaCAqLwotCSAgICAgIG5hbWUgPSBQRFNfTkFNRSAocGRzcCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gKG5hbWUpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHN5bWJvbCBpbiB0aGUgcHJlZGVmaW5lZAotICAgc3ltYm9sIHRhYmxlIGFmdGVyIFBEU1AsIG9yIE5VTEwgaWYgUERTUCBwb2ludHMgdG8gdGhlIGxhc3Qgc3ltYm9sLiAgSWYKLSAgIFBEU1AgaXMgTlVMTCwgaXQgcmV0dXJucyB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZSB0YWJsZS4gIFRodXMgaXQgY2FuIGJlCi0gICB1c2VkIHRvIHdhbGsgdGhyb3VnaCB0aGUgdGFibGUgYnkgZmlyc3QgY2FsbGluZyBpdCB3aXRoIE5VTEwgYW5kIHRoZW4KLSAgIGNhbGxpbmcgaXQgd2l0aCBlYWNoIHZhbHVlIGl0IHJldHVybmVkIG9uIHRoZSBwcmV2aW91cyBjYWxsLCB1bnRpbCBpdAotICAgcmV0dXJucyBOVUxMLiAqLwotCi1jb25zdCBzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wgKgotdGljODBfbmV4dF9wcmVkZWZpbmVkX3N5bWJvbCAocGRzcCkKLSAgICAgY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICpwZHNwOwotewotICBpZiAocGRzcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHBkc3AgPSB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHM7Ci0gICAgfQotICBlbHNlIGlmIChwZHNwID49IHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyAmJgotCSAgIHBkc3AgPCB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMgKyB0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzIC0gMSkKLSAgICB7Ci0gICAgICBwZHNwKys7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcGRzcCA9IE5VTEw7Ci0gICAgfQotICByZXR1cm4gKHBkc3ApOwotfQotCi0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZS4gIFRoZSBmaWVsZHMgYXJlOgotCi0JYml0cywgc2hpZnQsIGluc2VydGlvbiBmdW5jdGlvbiwgZXh0cmFjdGlvbiBmdW5jdGlvbiwgZmxhZ3MKLSAqLwotCi1jb25zdCBzdHJ1Y3QgdGljODBfb3BlcmFuZCB0aWM4MF9vcGVyYW5kc1tdID0KLXsKLQotICAvKiBUaGUgemVybyBpbmRleCBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuICAqLwotCi0jZGVmaW5lIFVOVVNFRCAoMCkKLSAgeyAwLCAwLCAwLCAwLCAwIH0sCi0KLSAgLyogU2hvcnQgc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZSBpbiBiaXRzIDE0LTAuICovCi0KLSNkZWZpbmUgU1NJIChVTlVTRUQgKyAxKQotICB7IDE1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFNob3J0IHVuc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZSBpbiBiaXRzIDE0LTAgKi8KLQotI2RlZmluZSBTVUkgKFNTSSArIDEpCi0gIHsgMTUsIDAsIE5VTEwsIE5VTEwsIDAgfSwKLQotICAvKiBTaG9ydCB1bnNpZ25lZCBiaXRmaWVsZCBpbiBiaXRzIDE0LTAuICBXZSBkaXN0aW5ndWlzaCB0aGlzCi0gICAgIGZyb20gYSByZWd1bGFyIHVuc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZSBvbmx5IGZvciB0aGUgY29udmVuaWVuY2UKLSAgICAgb2YgdGhlIGRpc2Fzc2VtYmxlciBhbmQgdGhlIHVzZXIuICovCi0KLSNkZWZpbmUgU1VCRiAoU1VJICsgMSkKLSAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CSVRGSUVMRCB9LAotCi0gIC8qIExvbmcgc2lnbmVkIGltbWVkaWF0ZSBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQgKi8KLQotI2RlZmluZSBMU0kgKFNVQkYgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIExvbmcgdW5zaWduZWQgaW1tZWRpYXRlIGluIGZvbGxvd2luZyAzMiBiaXQgd29yZCAqLwotCi0jZGVmaW5lIExVSSAoTFNJICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgMCB9LAotCi0gIC8qIExvbmcgdW5zaWduZWQgYml0ZmllbGQgaW4gZm9sbG93aW5nIDMyIGJpdCB3b3JkLiAgV2UgZGlzdGluZ3Vpc2gKLSAgICAgdGhpcyBmcm9tIGEgcmVndWxhciB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWUgb25seSBmb3IgdGhlCi0gICAgIGNvbnZlbmllbmNlIG9mIHRoZSBkaXNhc3NlbWJsZXIgYW5kIHRoZSB1c2VyLiAqLwotCi0jZGVmaW5lIExVQkYgKExVSSArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQklURklFTEQgfSwKLQotICAvKiBTaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGltbWVkaWF0ZSBpbiBmb2xsb3dpbmcgMzIgYml0Ci0gICAgIHdvcmQuICovCi0KLSNkZWZpbmUgU1BGSSAoTFVCRiArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfRkxPQVQgfSwKLQotICAvKiBSZWdpc3RlciBpbiBiaXRzIDQtMCAqLwotCi0jZGVmaW5lIFJFR18wIChTUEZJICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB9LAotCi0gIC8qIEV2ZW4gcmVnaXN0ZXIgaW4gYml0cyA0LTAgKi8KLQotI2RlZmluZSBSRUdfMF9FIChSRUdfMCArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX0VWRU4gfSwKLQotICAvKiBSZWdpc3RlciBpbiBiaXRzIDI2LTIyICovCi0KLSNkZWZpbmUgUkVHXzIyIChSRUdfMF9FICsgMSkKLSAgeyA1LCAyMiwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfSwKLQotICAvKiBFdmVuIHJlZ2lzdGVyIGluIGJpdHMgMjYtMjIgKi8KLQotI2RlZmluZSBSRUdfMjJfRSAoUkVHXzIyICsgMSkKLSAgeyA1LCAyMiwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX0VWRU4gfSwKLQotICAvKiBSZWdpc3RlciBpbiBiaXRzIDMxLTI3ICovCi0KLSNkZWZpbmUgUkVHX0RFU1QgKFJFR18yMl9FICsgMSkKLSAgeyA1LCAyNywgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfSwKLQotICAvKiBFdmVuIHJlZ2lzdGVyIGluIGJpdHMgMzEtMjcgKi8KLQotI2RlZmluZSBSRUdfREVTVF9FIChSRUdfREVTVCArIDEpCi0gIHsgNSwgMjcsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9FVkVOIH0sCi0KLSAgLyogRmxvYXRpbmcgcG9pbnQgYWNjdW11bGF0b3IgcmVnaXN0ZXIgKGEwLWEzKSBzcGVjaWZpZWQgYnkgYml0IDE2IChNU0IpCi0gICAgIGFuZCBiaXQgMTEgKExTQikgKi8KLSAgLyogRklYTUUhICBOZWVkcyB0byB1c2UgZnVuY3Rpb25zIHRvIGluc2VydCBhbmQgZXh0cmFjdCB0aGUgcmVnaXN0ZXIKLSAgICAgbnVtYmVyIGluIGJpdHMgMTYgYW5kIDExLiAqLwotCi0jZGVmaW5lIFJFR19GUEEgKFJFR19ERVNUX0UgKyAxKQotICB7IDAsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfRlBBIH0sCi0KLSAgLyogU2hvcnQgc2lnbmVkIFBDIHdvcmQgb2Zmc2V0IGluIGJpdHMgMTQtMCAqLwotCi0jZGVmaW5lIE9GRl9TU19QQyAoUkVHX0ZQQSArIDEpCi0gIHsgMTUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfUENSRUwgfCBUSUM4MF9PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIExvbmcgc2lnbmVkIFBDIHdvcmQgb2Zmc2V0IGluIGZvbGxvd2luZyAzMiBiaXQgd29yZCAqLwotCi0jZGVmaW5lIE9GRl9TTF9QQyAoT0ZGX1NTX1BDICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9QQ1JFTCB8IFRJQzgwX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogU2hvcnQgc2lnbmVkIGJhc2UgcmVsYXRpdmUgYnl0ZSBvZmZzZXQgaW4gYml0cyAxNC0wICovCi0KLSNkZWZpbmUgT0ZGX1NTX0JSIChPRkZfU0xfUEMgKyAxKQotICB7IDE1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JBU0VSRUwgfCBUSUM4MF9PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIExvbmcgc2lnbmVkIGJhc2UgcmVsYXRpdmUgYnl0ZSBvZmZzZXQgaW4gZm9sbG93aW5nIDMyIGJpdCB3b3JkICovCi0KLSNkZWZpbmUgT0ZGX1NMX0JSIChPRkZfU1NfQlIgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JBU0VSRUwgfCBUSUM4MF9PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIExvbmcgc2lnbmVkIGJhc2UgcmVsYXRpdmUgYnl0ZSBvZmZzZXQgaW4gZm9sbG93aW5nIDMyIGJpdCB3b3JkCi0gICAgIHdpdGggb3B0aW9uYWwgIjpzIiBtb2RpZmllciBmbGFnIGluIGJpdCAxMSAqLwotCi0jZGVmaW5lIE9GRl9TTF9CUl9TQ0FMRUQgKE9GRl9TTF9CUiArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQkFTRVJFTCB8IFRJQzgwX09QRVJBTkRfU0lHTkVEIHwgVElDODBfT1BFUkFORF9TQ0FMRUQgfSwKLQotICAvKiBCSVROVU0gaW4gYml0cyAzMS0yNyAqLwotCi0jZGVmaW5lIEJJVE5VTSAoT0ZGX1NMX0JSX1NDQUxFRCArIDEpCi0gIHsgNSwgMjcsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQklUTlVNIH0sCi0KLSAgLyogQ29uZGl0aW9uIGNvZGUgaW4gYml0cyAzMS0yNyAqLwotCi0jZGVmaW5lIENDIChCSVROVU0gKyAxKQotICB7IDUsIDI3LCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0NDIH0sCi0KLSAgLyogQ29udHJvbCByZWdpc3RlciBudW1iZXIgaW4gYml0cyAxNC0wICovCi0KLSNkZWZpbmUgQ1JfU0kgKENDICsgMSkKLSAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9DUiB9LAotCi0gIC8qIENvbnRyb2wgcmVnaXN0ZXIgbnVtYmVyIGluIG5leHQgMzIgYml0IHdvcmQgKi8KLQotI2RlZmluZSBDUl9MSSAoQ1JfU0kgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0NSIH0sCi0KLSAgLyogQSBiYXNlIHJlZ2lzdGVyIGluIGJpdHMgMjYtMjIsIGVuY2xvc2VkIGluIHBhcmVucyAqLwotCi0jZGVmaW5lIFJFR19CQVNFIChDUl9MSSArIDEpCi0gIHsgNSwgMjIsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9QQVJFTlMgfSwKLQotICAvKiBBIGJhc2UgcmVnaXN0ZXIgaW4gYml0cyAyNi0yMiwgZW5jbG9zZWQgaW4gcGFyZW5zLCB3aXRoIG9wdGlvbmFsICI6bSIKLSAgICAgZmxhZyBpbiBiaXQgMTcgKHNob3J0IGltbWVkaWF0ZSBpbnN0cnVjdGlvbnMgb25seSkgKi8KLQotI2RlZmluZSBSRUdfQkFTRV9NX1NJIChSRUdfQkFTRSArIDEpCi0gIHsgNSwgMjIsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9QQVJFTlMgfCBUSUM4MF9PUEVSQU5EX01fU0kgfSwKLQotICAvKiBBIGJhc2UgcmVnaXN0ZXIgaW4gYml0cyAyNi0yMiwgZW5jbG9zZWQgaW4gcGFyZW5zLCB3aXRoIG9wdGlvbmFsICI6bSIKLSAgIGZsYWcgaW4gYml0IDE1IChsb25nIGltbWVkaWF0ZSBhbmQgcmVnaXN0ZXIgaW5zdHJ1Y3Rpb25zIG9ubHkpICovCi0KLSNkZWZpbmUgUkVHX0JBU0VfTV9MSSAoUkVHX0JBU0VfTV9TSSArIDEpCi0gIHsgNSwgMjIsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9QQVJFTlMgfCBUSUM4MF9PUEVSQU5EX01fTEkgfSwKLQotICAvKiBTY2FsZWQgcmVnaXN0ZXIgaW4gYml0cyA0LTAsIHdpdGggb3B0aW9uYWwgIjpzIiBtb2RpZmllciBmbGFnIGluIGJpdCAxMSAqLwotCi0jZGVmaW5lIFJFR19TQ0FMRUQgKFJFR19CQVNFX01fTEkgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9TQ0FMRUQgfSwKLQotICAvKiBVbnNpZ25lZCBpbW1lZGlhdGUgaW4gYml0cyA0LTAsIHVzZWQgb25seSBmb3Igc2hpZnQgaW5zdHJ1Y3Rpb25zICovCi0KLSNkZWZpbmUgUk9UQVRFIChSRUdfU0NBTEVEICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCAwIH0sCi0KLSAgLyogVW5zaWduZWQgaW1tZWRpYXRlIGluIGJpdHMgOS01LCB1c2VkIG9ubHkgZm9yIHNoaWZ0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBFTkRNQVNLIChST1RBVEUgKyAxKQotICB7IDUsIDUsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfRU5ETUFTSyB9LAotCi19OwotCi1jb25zdCBpbnQgdGljODBfbnVtX29wZXJhbmRzID0gc2l6ZW9mICh0aWM4MF9vcGVyYW5kcykvc2l6ZW9mKCp0aWM4MF9vcGVyYW5kcyk7Ci0KLQwKLS8qIE1hY3JvcyB1c2VkIHRvIGdlbmVyYXRlIGVudHJpZXMgZm9yIHRoZSBvcGNvZGVzIHRhYmxlLiAqLwotCi0jZGVmaW5lIEZJWE1FIDAKLQotLyogU2hvcnQtSW1tZWRpYXRlIEZvcm1hdCBJbnN0cnVjdGlvbnMgLSBiYXNpYyBvcGNvZGUgKi8KLSNkZWZpbmUgT1BfU0koeCkJKCgoeCkgJiAweDdGKSA8PCAxNSkKLSNkZWZpbmUgTUFTS19TSQkJT1BfU0koMHg3RikKLQotLyogTG9uZy1JbW1lZGlhdGUgRm9ybWF0IEluc3RydWN0aW9ucyAtIGJhc2ljIG9wY29kZSAqLwotI2RlZmluZSBPUF9MSSh4KQkoKCh4KSAmIDB4M0ZGKSA8PCAxMikKLSNkZWZpbmUgTUFTS19MSQkJT1BfTEkoMHgzRkYpCi0KLS8qIFJlZ2lzdGVyIEZvcm1hdCBJbnN0cnVjdGlvbnMgLSBiYXNpYyBvcGNvZGUgKi8KLSNkZWZpbmUgT1BfUkVHKHgpCU9QX0xJKHgpCS8qIEZvciByZWFkYWJpbGl0eSAqLwotI2RlZmluZSBNQVNLX1JFRwlNQVNLX0xJCQkvKiBGb3IgcmVhZGFiaWxpdHkgKi8KLQotLyogVGhlICduJyBiaXQgYXQgYml0IDEwICovCi0jZGVmaW5lIG4oeCkJCSgoeCkgPDwgMTApCi0KLS8qIFRoZSAnaScgYml0IGF0IGJpdCAxMSAqLwotI2RlZmluZSBpKHgpCQkoKHgpIDw8IDExKQotCi0vKiBUaGUgJ0YnIGJpdCBhdCBiaXQgMjcgKi8KLSNkZWZpbmUgRih4KQkJKCh4KSA8PCAyNykKLQotLyogVGhlICdFJyBiaXQgYXQgYml0IDI3ICovCi0jZGVmaW5lIEUoeCkJCSgoeCkgPDwgMjcpCi0KLS8qIFRoZSAnTScgYml0IGF0IGJpdCAxNSBpbiByZWdpc3RlciBhbmQgbG9uZyBpbW1lZGlhdGUgb3Bjb2RlcyAqLwotI2RlZmluZSBNX1JFRyh4KQkoKHgpIDw8IDE1KQotI2RlZmluZSBNX0xJKHgpCQkoKHgpIDw8IDE1KQotCi0vKiBUaGUgJ00nIGJpdCBhdCBiaXQgMTcgaW4gc2hvcnQgaW1tZWRpYXRlIG9wY29kZXMgKi8KLSNkZWZpbmUgTV9TSSh4KQkJKCh4KSA8PCAxNykKLQotLyogVGhlICdTWicgZmllbGQgYXQgYml0cyAxNC0xMyBpbiByZWdpc3RlciBhbmQgbG9uZyBpbW1lZGlhdGUgb3Bjb2RlcyAqLwotI2RlZmluZSBTWl9SRUcoeCkJKCh4KSA8PCAxMykKLSNkZWZpbmUgU1pfTEkoeCkJKCh4KSA8PCAxMykKLQotLyogVGhlICdTWicgZmllbGQgYXQgYml0cyAxNi0xNSBpbiBzaG9ydCBpbW1lZGlhdGUgb3Bjb2RlcyAqLwotI2RlZmluZSBTWl9TSSh4KQkoKHgpIDw8IDE1KQotCi0vKiBUaGUgJ0QnIChkaXJlY3QgZXh0ZXJuYWwgbWVtb3J5IGFjY2VzcykgYml0IGF0IGJpdCAxMCBpbiBsb25nIGltbWVkaWF0ZQotICAgYW5kIHJlZ2lzdGVyIG9wY29kZXMuICovCi0jZGVmaW5lIEQoeCkJCSgoeCkgPDwgMTApCi0KLS8qIFRoZSAnUycgKHNjYWxlIG9mZnNldCBieSBkYXRhIHNpemUpIGJpdCBhdCBiaXQgMTEgaW4gbG9uZyBpbW1lZGlhdGUKLSAgIGFuZCByZWdpc3RlciBvcGNvZGVzLiAqLwotI2RlZmluZSBTKHgpCQkoKHgpIDw8IDExKQotCi0vKiBUaGUgJ1BEJyBmaWVsZCBhdCBiaXRzIDEwLTkgaW4gZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFBEKHgpCQkoKHgpIDw8IDkpCi0KLS8qIFRoZSAnUDInIGZpZWxkIGF0IGJpdHMgOC03IGluIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBQMih4KQkJKCh4KSA8PCA3KQotCi0vKiBUaGUgJ1AxJyBmaWVsZCBhdCBiaXRzIDYtNSBpbiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgUDEoeCkJCSgoeCkgPDwgNSkKLQotLyogVGhlICdhJyBmaWVsZCBhdCBiaXQgMTYgaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBWX2ExKHgpCQkoKHgpIDw8IDE2KQotCi0vKiBUaGUgJ2EnIGZpZWxkIGF0IGJpdCAxMSBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFZfYTAoeCkJCSgoeCkgPDwgMTEpCi0KLS8qIFRoZSAnbScgZmllbGQgYXQgYml0IDEwIGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgVl9tKHgpCQkoKHgpIDw8IDEwKQotCi0vKiBUaGUgJ1MnIGZpZWxkIGF0IGJpdCA5IGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgVl9TKHgpCQkoKHgpIDw8IDkpCi0KLS8qIFRoZSAnWicgZmllbGQgYXQgYml0IDggaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBWX1ooeCkJCSgoeCkgPDwgOCkKLQotLyogVGhlICdwJyBmaWVsZCBhdCBiaXQgNiBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFZfcCh4KQkJKCh4KSA8PCA2KQotCi0vKiBUaGUgb3Bjb2RlIGZpZWxkIGF0IGJpdHMgMjEtMTcgZm9yIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgT1BfVih4KQkJKCh4KSA8PCAxNykKLSNkZWZpbmUgTUFTS19WCQlPUF9WKDB4MUYpCi0KLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuICBGb3JtYXR0ZWQgZm9yIGJldHRlciByZWFkYWJpbGl0eSBvbiBhIHdpZGUgc2NyZWVuLiAgQWxzbywgYWxsCi0gZW50cmllcyB3aXRoIHRoZSBzYW1lIG1uZW1vbmljIGFyZSBzb3J0ZWQgc28gdGhhdCB0aGV5IGFyZSBhZGphY2VudCBpbiB0aGUgdGFibGUsCi0gYWxsb3dpbmcgdGhlIHVzZSBvZiBhIGhhc2ggdGFibGUgdG8gbG9jYXRlIHRoZSBmaXJzdCBvZiBhIHNlcXVlbmNlIG9mIG9wY29kZXMgdGhhdCBoYXZlCi0gYSBwYXJ0aWN1bGFyIG5hbWUuICBUaGUgc2hvcnQgaW1tZWRpYXRlIGZvcm1zIGFsc28gY29tZSBiZWZvcmUgdGhlIGxvbmcgaW1tZWRpYXRlIGZvcm1zCi0gc28gdGhhdCB0aGUgYXNzZW1ibGVyIHdpbGwgcGljayB0aGUgImJlc3QgZml0IiBmb3IgdGhlIHNpemUgb2YgdGhlIG9wZXJhbmQsIGV4Y2VwdCBmb3IKLSB0aGUgY2FzZSBvZiB0aGUgUEMgcmVsYXRpdmUgZm9ybXMsIHdoZXJlIHRoZSBsb25nIGZvcm1zIGNvbWUgZmlyc3QgYW5kIGFyZSB0aGUgZGVmYXVsdAotIGZvcm1zLiAqLwotCi1jb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlIHRpYzgwX29wY29kZXNbXSA9IHsKLQotICAvKiBUaGUgIm5vcCIgaW5zdHJ1Y3Rpb24gaXMgcmVhbGx5ICJyZGNyIDAscjAiLiAgV2UgcHV0IGl0IGZpcnN0IHNvIHRoYXQgdGhpcwotICAgICBzcGVjaWZpYyBiaXQgcGF0dGVybiB3aWxsIGdldCBkaXNhc3NlbWJsZWQgYXMgYSBub3AgcmF0aGVyIHRoYW4gYW4gcmRjci4gVGhlCi0gICAgIG1hc2sgb2YgYWxsIG9uZXMgZW5zdXJlcyB0aGF0IHRoaXMgd2lsbCBoYXBwZW4uICovCi0KLSAgeyJub3AiLAlPUF9TSSgweDQpLAl+MCwJCTAsCQl7MH0JCQl9LAotCi0gIC8qIFRoZSAiYnIiIGluc3RydWN0aW9uIGlzIHJlYWxseSAiYmJ6IHRhcmdldCxyMCwzMSIuICBXZSBwdXQgaXQgZmlyc3Qgc28gdGhhdAotICAgICB0aGlzIHNwZWNpZmljIGJpdCBwYXR0ZXJuIHdpbGwgZ2V0IGRpc2Fzc2VtYmxlZCBhcyBhIGJyIHJhdGhlciB0aGFuIGJiei4gKi8KLQotICB7ImJyIiwJT1BfU0koMHg0OCksCTB4RkZGRjgwMDAsCTAsCXtPRkZfU1NfUEN9CX0sCi0gIHsiYnIiLAlPUF9MSSgweDM5MSksCTB4RkZGRkYwMDAsCTAsCXtPRkZfU0xfUEN9CX0sCi0gIHsiYnIiLAlPUF9SRUcoMHgzOTApLAkweEZGRkZGMDAwLAkwLAl7UkVHXzB9CQl9LAotICB7ImJyLmEiLAlPUF9TSSgweDQ5KSwJMHhGRkZGODAwMCwJMCwJe09GRl9TU19QQ30JfSwKLSAgeyJici5hIiwJT1BfTEkoMHgzOTMpLAkweEZGRkZGMDAwLAkwLAl7T0ZGX1NMX1BDfQl9LAotICB7ImJyLmEiLAlPUF9SRUcoMHgzOTIpLAkweEZGRkZGMDAwLAkwLAl7UkVHXzB9CQl9LAotCi0gIC8qIFNpZ25lZCBpbnRlZ2VyIEFERCAqLwotCi0gIHsiYWRkIiwJT1BfU0koMHg1OCksCU1BU0tfU0ksCTAsCXtTU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7ImFkZCIsCU9QX0xJKDB4M0IxKSwJTUFTS19MSSwJMCwJe0xTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsiYWRkIiwJT1BfUkVHKDB4M0IwKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBVbnNpZ25lZCBpbnRlZ2VyIEFERCAqLwotCi0gIHsiYWRkdSIsCU9QX1NJKDB4NTkpLAlNQVNLX1NJLAkwLAl7U1NJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJhZGR1IiwJT1BfTEkoMHgzQjMpLAlNQVNLX0xJLAkwLAl7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJhZGR1IiwJT1BfUkVHKDB4M0IyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBCaXR3aXNlIEFORCAqLwotCi0gIHsiYW5kIiwJT1BfU0koMHgxMSksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZCIsCU9QX0xJKDB4MzIzKSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kIiwJT1BfUkVHKDB4MzIyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQudHQiLAlPUF9TSSgweDExKSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLnR0IiwJT1BfTEkoMHgzMjMpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQudHQiLAlPUF9SRUcoMHgzMjIpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJpdHdpc2UgQU5EIHdpdGggb25lcyBjb21wbGVtZW50IG9mIGJvdGggc291cmNlcyAqLwotCi0gIHsiYW5kLmZmIiwJT1BfU0koMHgxOCksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC5mZiIsCU9QX0xJKDB4MzMxKSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLmZmIiwJT1BfUkVHKDB4MzMwKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBCaXR3aXNlIEFORCB3aXRoIG9uZXMgY29tcGxlbWVudCBvZiBzb3VyY2UgMSAqLwotCi0gIHsiYW5kLmZ0IiwJT1BfU0koMHgxNCksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC5mdCIsCU9QX0xJKDB4MzI5KSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLmZ0IiwJT1BfUkVHKDB4MzI4KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBCaXR3aXNlIEFORCB3aXRoIG9uZXMgY29tcGxlbWVudCBvZiBzb3VyY2UgMiAqLwotCi0gIHsiYW5kLnRmIiwJT1BfU0koMHgxMiksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC50ZiIsCU9QX0xJKDB4MzI1KSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLnRmIiwJT1BfUkVHKDB4MzI0KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBCcmFuY2ggQml0IE9uZSAtIG5vbmFubnVsbGVkICovCi0KLSAgeyJiYm8iLAlPUF9TSSgweDRBKSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJibyIsCU9QX0xJKDB4Mzk1KSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJibyIsCU9QX1JFRygweDM5NCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgQklUTlVNfQkJfSwKLQotICAvKiBCcmFuY2ggQml0IE9uZSAtIGFubnVsbGVkICovCi0KLSAgeyJiYm8uYSIsCU9QX1NJKDB4NEIpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJvLmEiLAlPUF9MSSgweDM5NyksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYm8uYSIsCU9QX1JFRygweDM5NiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgQklUTlVNfQkJfSwKLQotICAvKiBCcmFuY2ggQml0IFplcm8gLSBub25hbm51bGxlZCAqLwotCi0gIHsiYmJ6IiwJT1BfU0koMHg0OCksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYnoiLAlPUF9MSSgweDM5MSksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYnoiLAlPUF9SRUcoMHgzOTApLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIEJJVE5VTX0JCX0sCi0KLSAgLyogQnJhbmNoIEJpdCBaZXJvIC0gYW5udWxsZWQgKi8KLQotICB7ImJiei5hIiwJT1BfU0koMHg0OSksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYnouYSIsCU9QX0xJKDB4MzkzKSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJiei5hIiwJT1BfUkVHKDB4MzkyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBCSVROVU19CQl9LAotCi0gIC8qIEJyYW5jaCBDb25kaXRpb25hbCAtIG5vbmFubnVsbGVkICovCi0KLSAgeyJiY25kIiwJT1BfU0koMHg0QyksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIENDfQl9LAotICB7ImJjbmQiLAlPUF9MSSgweDM5OSksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIENDfQl9LAotICB7ImJjbmQiLAlPUF9SRUcoMHgzOTgpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIENDfQl9LAotCi0gIC8qIEJyYW5jaCBDb25kaXRpb25hbCAtIGFubnVsbGVkICovCi0KLSAgeyJiY25kLmEiLAlPUF9TSSgweDREKSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR18yMiwgQ0N9CX0sCi0gIHsiYmNuZC5hIiwJT1BfTEkoMHgzOUIpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBDQ30JfSwKLSAgeyJiY25kLmEiLAlPUF9SRUcoMHgzOUEpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIENDfQl9LAotCi0gIC8qIEJyYW5jaCBDb250cm9sIFJlZ2lzdGVyICovCi0KLSAgeyJicmNyIiwJT1BfU0koMHg2KSwJTUFTS19TSSwJMCwJe0NSX1NJfQl9LAotICB7ImJyY3IiLAlPUF9MSSgweDMwRCksCU1BU0tfTEksCTAsCXtDUl9MSX0JfSwKLSAgeyJicmNyIiwJT1BfUkVHKDB4MzBDKSwJTUFTS19SRUcsCTAsCXtSRUdfMH0JfSwKLQotICAvKiBCcmFuY2ggYW5kIHNhdmUgcmV0dXJuIC0gbm9uYW5udWxsZWQgKi8KLQotICB7ImJzciIsCU9QX1NJKDB4NDApLAlNQVNLX1NJLAkwLAl7T0ZGX1NTX1BDLCBSRUdfREVTVH0JfSwKLSAgeyJic3IiLAlPUF9MSSgweDM4MSksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfREVTVH0JfSwKLSAgeyJic3IiLAlPUF9SRUcoMHgzODApLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBCcmFuY2ggYW5kIHNhdmUgcmV0dXJuIC0gYW5udWxsZWQgKi8KLQotICB7ImJzci5hIiwJT1BfU0koMHg0MSksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfREVTVH0JfSwKLSAgeyJic3IuYSIsCU9QX0xJKDB4MzgzKSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR19ERVNUfQl9LAotICB7ImJzci5hIiwJT1BfUkVHKDB4MzgyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogU2VuZCBjb21tYW5kICovCi0KLSAgeyJjbW5kIiwJT1BfU0koMHgyKSwJTUFTS19TSSwJMCwgCXtTVUl9CX0sCi0gIHsiY21uZCIsCU9QX0xJKDB4MzA1KSwJTUFTS19MSSwJMCwgCXtMVUl9CX0sCi0gIHsiY21uZCIsCU9QX1JFRygweDMwNCksCU1BU0tfUkVHLAkwLAl7UkVHXzB9CX0sCi0KLSAgLyogSW50ZWdlciBjb21wYXJlICovCi0KLSAgeyJjbXAiLAlPUF9TSSgweDUwKSwJTUFTS19TSSwJMCwgCXtTU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7ImNtcCIsCU9QX0xJKDB4M0ExKSwJTUFTS19MSSwJMCwgCXtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7ImNtcCIsCU9QX1JFRygweDNBMCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogRmx1c2ggZGF0YSBjYWNoZSBzdWJibG9jayAtIGRvbid0IGNsZWFyIHN1YmJsb2NrIHByZXNldCBmbGFnICovCi0KLSAgeyJkY2FjaGVjIiwJT1BfU0koMHgzOCksCUYoMSkgfCAoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkJMCwge1NTSSwgUkVHX0JBU0VfTV9TSX0JCX0sCi0gIHsiZGNhY2hlYyIsCU9QX0xJKDB4MzcxKSwJRigxKSB8IChNQVNLX0xJICAmIH5NX0xJKDEpKSAgfCBTKDEpIHwgRCgxKSwJMCwge0xTSSwgUkVHX0JBU0VfTV9MSX0JCX0sCi0gIHsiZGNhY2hlYyIsCU9QX1JFRygweDM3MCksCUYoMSkgfCAoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgUygxKSB8IEQoMSksCTAsIHtSRUdfMCwgUkVHX0JBU0VfTV9MSX0JfSwKLQotICAvKiBGbHVzaCBkYXRhIGNhY2hlIHN1YmJsb2NrIC0gY2xlYXIgc3ViYmxvY2sgcHJlc2V0IGZsYWcgKi8KLQotICB7ImRjYWNoZWYiLAlPUF9TSSgweDM4KSAgIHwgRigxKSwJRigxKSB8IChNQVNLX1NJICAmIH5NX1NJKDEpKSwJCQkwLCB7U1NJLCBSRUdfQkFTRV9NX1NJfQkJfSwKLSAgeyJkY2FjaGVmIiwJT1BfTEkoMHgzNzEpICB8IEYoMSksCUYoMSkgfCAoTUFTS19MSSAgJiB+TV9MSSgxKSkgICB8IFMoMSkgfCBEKDEpLAkwLCB7TFNJLCBSRUdfQkFTRV9NX0xJfQkJfSwKLSAgeyJkY2FjaGVmIiwJT1BfUkVHKDB4MzcwKSB8IEYoMSksCUYoMSkgfCAoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgUygxKSB8IEQoMSksCTAsIHtSRUdfMCwgUkVHX0JBU0VfTV9MSX0JfSwKLQotICAvKiBEaXJlY3QgbG9hZCBzaWduZWQgZGF0YSBpbnRvIHJlZ2lzdGVyICovCi0KLSAgeyJkbGQiLAlPUF9MSSgweDM0NSkgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkbGQiLAlPUF9SRUcoMHgzNDQpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsiZGxkLmIiLAlPUF9MSSgweDM0MSkgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkbGQuYiIsCU9QX1JFRygweDM0MCkgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJkbGQuZCIsCU9QX0xJKDB4MzQ3KSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CX0sCi0gIHsiZGxkLmQiLAlPUF9SRUcoMHgzNDYpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQkJfSwKLSAgeyJkbGQuaCIsCU9QX0xJKDB4MzQzKSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRsZC5oIiwJT1BfUkVHKDB4MzQyKSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotCi0gIC8qIERpcmVjdCBsb2FkIHVuc2lnbmVkIGRhdGEgaW50byByZWdpc3RlciAqLwotCi0gIHsiZGxkLnViIiwJT1BfTEkoMHgzNTEpICB8IEQoMSksCShNQVNLX0xJICAmICB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRsZC51YiIsCU9QX1JFRygweDM1MCkgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpICB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsiZGxkLnVoIiwJT1BfTEkoMHgzNTMpICB8IEQoMSksCShNQVNLX0xJICAmICB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRsZC51aCIsCU9QX1JFRygweDM1MikgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpICB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0KLSAgLyogRGlyZWN0IHN0b3JlIGRhdGEgaW50byBtZW1vcnkgKi8KLQotICB7ImRzdCIsCU9QX0xJKDB4MzY1KSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRzdCIsCU9QX1JFRygweDM2NCkgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJkc3QuYiIsCU9QX0xJKDB4MzYxKSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRzdC5iIiwJT1BfUkVHKDB4MzYwKSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImRzdC5kIiwJT1BfTEkoMHgzNjcpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJkc3QuZCIsCU9QX1JFRygweDM2NikgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CQl9LAotICB7ImRzdC5oIiwJT1BfTEkoMHgzNjMpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZHN0LmgiLAlPUF9SRUcoMHgzNjIpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0KLSAgLyogRW11bGF0aW9uIHN0b3AgKi8KLQotICB7ImVzdG9wIiwJT1BfTEkoMHgzRkMpLAlNQVNLX0xJLAkwLAkJezB9CX0sCi0KLSAgLyogRW11bGF0aW9uIHRyYXAgKi8KLQotICB7ImV0cmFwIiwJT1BfU0koMHgxKSAgICB8IEUoMSksCU1BU0tfU0kgIHwgRSgxKSwJMCwJe1NVSX0JfSwKLSAgeyJldHJhcCIsCU9QX0xJKDB4MzAzKSAgfCBFKDEpLAlNQVNLX0xJICB8IEUoMSksCTAsCXtMVUl9CX0sCi0gIHsiZXRyYXAiLAlPUF9SRUcoMHgzMDIpIHwgRSgxKSwJTUFTS19SRUcgfCBFKDEpLAkwLAl7UkVHXzB9CX0sCi0KLSAgLyogRmxvYXRpbmctcG9pbnQgYWRkaXRpb24gKi8KLQotICB7ImZhZGQuZGRkIiwJT1BfUkVHKDB4M0UwKSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmFkZC5kc2QiLAlPUF9SRUcoMHgzRTApIHwgUEQoMSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmFkZC5zZGQiLAlPUF9MSSgweDNFMSkgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmYWRkLnNkZCIsCU9QX1JFRygweDNFMCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmYWRkLnNzZCIsCU9QX0xJKDB4M0UxKSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmYWRkLnNzZCIsCU9QX1JFRygweDNFMCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmFkZC5zc3MiLAlPUF9MSSgweDNFMSkgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZhZGQuc3NzIiwJT1BfUkVHKDB4M0UwKSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogRmxvYXRpbmcgcG9pbnQgY29tcGFyZSAqLwotCi0gIHsiZmNtcC5kZCIsCU9QX1JFRygweDNFQSkgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAgMCwJIHtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZmNtcC5kcyIsCU9QX1JFRygweDNFQSkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAgMCwJIHtSRUdfMF9FLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZjbXAuc2QiLAlPUF9MSSgweDNFQikgIHwgUEQoMCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7U1BGSSwgUkVHXzIyX0UsIFJFR19ERVNUfQl9LAotICB7ImZjbXAuc2QiLAlPUF9SRUcoMHgzRUEpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7UkVHXzAsIFJFR18yMl9FLCBSRUdfREVTVH0JfSwKLSAgeyJmY21wLnNzIiwJT1BfTEkoMHgzRUIpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZmNtcC5zcyIsCU9QX1JFRygweDNFQSkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBGbG9hdGluZyBwb2ludCBkaXZpZGUgKi8KLQotICB7ImZkaXYuZGRkIiwJT1BfUkVHKDB4M0U2KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmRpdi5kc2QiLAlPUF9SRUcoMHgzRTYpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmRpdi5zZGQiLAlPUF9MSSgweDNFNykgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmZGl2LnNkZCIsCU9QX1JFRygweDNFNikgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmZGl2LnNzZCIsCU9QX0xJKDB4M0U3KSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmZGl2LnNzZCIsCU9QX1JFRygweDNFNikgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZmRpdi5zc3MiLAlPUF9MSSgweDNFNykgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZkaXYuc3NzIiwJT1BfUkVHKDB4M0U2KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogRmxvYXRpbmcgcG9pbnQgbXVsdGlwbHkgKi8KLQotICB7ImZtcHkuZGRkIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZm1weS5kc2QiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZm1weS5paWkiLAlPUF9MSSgweDNFNSkgIHwgUEQoMikgfCBQMigyKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZm1weS5paWkiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMikgfCBQMigyKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmbXB5LnNkZCIsCU9QX0xJKDB4M0U1KSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZtcHkuc2RkIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZtcHkuc3NkIiwJT1BfTEkoMHgzRTUpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZtcHkuc3NkIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmbXB5LnNzcyIsCU9QX0xJKDB4M0U1KSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZm1weS5zc3MiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmbXB5LnV1dSIsCU9QX0xJKDB4M0U1KSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xVSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmbXB5LnV1dSIsCU9QX1JFRygweDNFNCkgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIENvbnZlcnQvUm91bmQgdG8gTWludXMgSW5maW5pdHkgKi8KLQotICB7ImZybmRtLmRkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMykgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS5kaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDMpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLmRzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMykgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uZHUiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigzKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5pZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS5pZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLmlzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMykgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5pcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5zZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0uc2QiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigzKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS5zaSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgyKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnNpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnNzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMykgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uc3MiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigzKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uc3UiLAlPUF9MSSgweDNFOSkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5zdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS51ZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS51ZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLnVzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMykgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS51cyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBDb252ZXJ0L1JvdW5kIHRvIE5lYXJlc3QgKi8KLQotICB7ImZybmRuLmRkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi5kaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLmRzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uZHUiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5pZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi5pZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLmlzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5pcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5zZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4uc2QiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi5zaSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgyKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnNpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnNzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uc3MiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uc3UiLAlPUF9MSSgweDNFOSkgIHwgUEQoMykgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5zdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi51ZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi51ZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLnVzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi51cyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBDb252ZXJ0L1JvdW5kIHRvIFBvc2l0aXZlIEluZmluaXR5ICovCi0KLSAgeyJmcm5kcC5kZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAuZGkiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigyKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5kcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLmR1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMikgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuaWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigyKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAuaWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigyKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC5pcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuaXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigyKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuc2QiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigyKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLnNkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAuc2kiLAlPUF9MSSgweDNFOSkgIHwgUEQoMikgfCBQMigyKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5zaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5zcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnNzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMikgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnN1IiwJT1BfTEkoMHgzRTkpICB8IFBEKDMpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuc3UiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigyKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAudWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigyKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAudWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigyKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC51cyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAudXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigyKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQ29udmVydC9Sb3VuZCB0byBaZXJvICovCi0KLSAgeyJmcm5kei5kZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHouZGkiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5kcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LmR1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouaWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHouaWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei5pcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouaXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouc2QiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LnNkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHouc2kiLAlPUF9MSSgweDNFOSkgIHwgUEQoMikgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5zaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5zcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnNzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnN1IiwJT1BfTEkoMHgzRTkpICB8IFBEKDMpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouc3UiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHoudWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHoudWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei51cyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHoudXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogRmxvYXRpbmcgcG9pbnQgc3F1YXJlIHJvb3QgKi8KLQotICB7ImZzcXJ0LmRkIiwJT1BfUkVHKDB4M0VFKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmc3FydC5zZCIsCU9QX0xJKDB4M0VGKSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnNxcnQuc2QiLAlPUF9SRUcoMHgzRUUpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmc3FydC5zcyIsCU9QX0xJKDB4M0VGKSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZzcXJ0LnNzIiwJT1BfUkVHKDB4M0VFKSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIEZsb2F0aW5nIHBvaW50IHN1YnRyYWN0aW9uICovCi0KLSAgeyAiZnN1Yi5kZGQiLAlPUF9SRUcoMHgzRTIpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyAiZnN1Yi5kc2QiLAlPUF9SRUcoMHgzRTIpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsgImZzdWIuc2RkIiwJT1BfTEkoMHgzRTMpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsgImZzdWIuc2RkIiwJT1BfUkVHKDB4M0UyKSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ICJmc3ViLnNzZCIsCU9QX0xJKDB4M0UzKSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyAiZnN1Yi5zc2QiLAlPUF9SRUcoMHgzRTIpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ICJmc3ViLnNzcyIsCU9QX0xJKDB4M0UzKSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsgImZzdWIuc3NzIiwJT1BfUkVHKDB4M0UyKSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogSWxsZWdhbCBpbnN0cnVjdGlvbnMgKi8KLQotICB7ImlsbG9wMCIsCU9QX1NJKDB4MCksCU1BU0tfU0ksCTAsCXswfQl9LAotICB7ImlsbG9wRiIsCTB4MUZGIDw8IDEzLAkweDFGRiA8PCAxMywJMCwJezB9CX0sCi0KLSAgLyogSnVtcCBhbmQgc2F2ZSByZXR1cm4gKi8KLQotICB7ImpzciIsCU9QX1NJKDB4NDQpLAlNQVNLX1NJLAkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRSwgUkVHX0RFU1R9CX0sCi0gIHsianNyIiwJT1BfTEkoMHgzODkpLAlNQVNLX0xJLAkwLAl7T0ZGX1NMX0JSLCBSRUdfQkFTRSwgUkVHX0RFU1R9CX0sCi0gIHsianNyIiwJT1BfUkVHKDB4Mzg4KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAotICB7Impzci5hIiwJT1BfU0koMHg0NSksCU1BU0tfU0ksCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKLSAgeyJqc3IuYSIsCU9QX0xJKDB4MzhCKSwJTUFTS19MSSwJMCwJe09GRl9TTF9CUiwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAotICB7Impzci5hIiwJT1BfUkVHKDB4MzhBKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAotCi0gIC8qIExvYWQgU2lnbmVkIERhdGEgSW50byBSZWdpc3RlciAqLwotCi0gIHsibGQiLAlPUF9TSSgweDIyKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJsZCIsCU9QX0xJKDB4MzQ1KSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImxkIiwJT1BfUkVHKDB4MzQ0KSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLmIiLAlPUF9TSSgweDIwKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC5iIiwJT1BfTEkoMHgzNDEpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsibGQuYiIsCU9QX1JFRygweDM0MCkgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC5kIiwJT1BfU0koMHgyMyksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVF9FfQkJfSwKLSAgeyJsZC5kIiwJT1BfTEkoMHgzNDcpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJsZC5kIiwJT1BfUkVHKDB4MzQ2KSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JCX0sCi0gIHsibGQuaCIsCU9QX1NJKDB4MjEpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLmgiLAlPUF9MSSgweDM0MykgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJsZC5oIiwJT1BfUkVHKDB4MzQyKSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotCi0gIC8qIExvYWQgVW5zaWduZWQgRGF0YSBJbnRvIFJlZ2lzdGVyICovCi0KLSAgeyJsZC51YiIsCU9QX1NJKDB4MjgpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLnViIiwJT1BfTEkoMHgzNTEpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsibGQudWIiLAlPUF9SRUcoMHgzNTApIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQudWgiLAlPUF9TSSgweDI5KSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC51aCIsCU9QX0xJKDB4MzUzKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImxkLnVoIiwJT1BfUkVHKDB4MzUyKSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotCi0gIC8qIExlZnRtb3N0IG9uZSAqLwotCi0gIHsibG1vIiwJT1BfTEkoMHgzRjApLAlNQVNLX0xJLAkwLAl7UkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBCaXR3aXNlIGxvZ2ljYWwgT1IuICBOb3RlIHRoYXQgIm9yLnR0IiBhbmQgIm9yIiBhcmUgdGhlIHNhbWUgaW5zdHJ1Y3Rpb25zLiAqLwotCi0gIHsib3IuZmYiLAlPUF9TSSgweDFFKSwJTUFTS19TSSwJMCwJe1NVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IuZmYiLAlPUF9MSSgweDMzRCksCU1BU0tfTEksCTAsCXtMVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLmZmIiwJT1BfUkVHKDB4MzNDKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJvci5mdCIsCU9QX1NJKDB4MUQpLAlNQVNLX1NJLAkwLAl7U1VJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci5mdCIsCU9QX0xJKDB4MzNCKSwJTUFTS19MSSwJMCwJe0xVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IuZnQiLAlPUF9SRUcoMHgzM0EpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7Im9yLnRmIiwJT1BfU0koMHgxQiksCU1BU0tfU0ksCTAsCXtTVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLnRmIiwJT1BfTEkoMHgzMzcpLAlNQVNLX0xJLAkwLAl7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci50ZiIsCU9QX1JFRygweDMzNiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsib3IudHQiLAlPUF9TSSgweDE3KSwJTUFTS19TSSwJMCwJe1NVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IudHQiLAlPUF9MSSgweDMyRiksCU1BU0tfTEksCTAsCXtMVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLnR0IiwJT1BfUkVHKDB4MzJFKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJvciIsCU9QX1NJKDB4MTcpLAlNQVNLX1NJLAkwLAl7U1VJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvciIsCU9QX0xJKDB4MzJGKSwJTUFTS19MSSwJMCwJe0xVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IiLAlPUF9SRUcoMHgzMkUpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFJlYWQgQ29udHJvbCBSZWdpc3RlciAqLwotCi0gIHsicmRjciIsCU9QX1NJKDB4NCksCU1BU0tfU0kgIHwgKDB4MUYgPDwgMjIpLAkwLAl7Q1JfU0ksIFJFR19ERVNUfQl9LAotICB7InJkY3IiLAlPUF9MSSgweDMwOSksCU1BU0tfTEkgIHwgKDB4MUYgPDwgMjIpLAkwLAl7Q1JfTEksIFJFR19ERVNUfQl9LAotICB7InJkY3IiLAlPUF9SRUcoMHgzMDgpLAlNQVNLX1JFRyB8ICgweDFGIDw8IDIyKSwJMCwJe1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBSaWdodG1vc3Qgb25lICovCi0KLSAgeyJybW8iLAlPUF9MSSgweDNGMiksCU1BU0tfTEksCTAsCQl7UkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBTaGlmdCBSZWdpc3RlciBMZWZ0IC0gbm90ZSB0aGF0IHJvdGwsIHNobCwgYW5kIGlucyBhcmUgYWxsIGFsdGVybmF0ZSBuYW1lcyBmb3Igb25lIG9mIHRoZSBzaGlmdCBpbnN0cnVjdGlvbnMuCi0gICAgIFRoZXkgYXBwZWFyIHByaW9yIHRvIHRoZWlyIHNsIGVxdWl2YWxlbnQgc28gdGhhdCB0aGV5IHdpbGwgYmUgZGlhc3NlbWJsZWQgYXMgdGhlIGFsdGVybmF0ZSBuYW1lLiAqLwotCi0KLSAgeyJpbnMiLAlPUF9SRUcoMHgzMUUpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJpbnMiLAlPUF9TSSgweEYpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsicm90bCIsCU9QX1JFRygweDMxMCkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InJvdGwiLAlPUF9TSSgweDgpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2hsIiwJT1BfUkVHKDB4MzFDKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNobCIsCU9QX1NJKDB4RSkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZG0iLAlPUF9SRUcoMHgzMTIpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZG0iLAlPUF9TSSgweDkpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmRzIiwJT1BfUkVHKDB4MzE0KSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmRzIiwJT1BfU0koMHhBKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5keiIsCU9QX1JFRygweDMxMCkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5keiIsCU9QX1NJKDB4OCkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZW0iLAlPUF9SRUcoMHgzMTgpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZW0iLAlPUF9TSSgweEMpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmVzIiwJT1BfUkVHKDB4MzFBKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmVzIiwJT1BfU0koMHhEKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5leiIsCU9QX1JFRygweDMxNikgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5leiIsCU9QX1NJKDB4QikgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuaW0iLAlPUF9SRUcoMHgzMUUpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuaW0iLAlPUF9TSSgweEYpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLml6IiwJT1BfUkVHKDB4MzFDKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLml6IiwJT1BfU0koMHhFKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBTaGlmdCBSZWdpc3RlciBMZWZ0IFdpdGggSW52ZXJ0ZWQgRW5kbWFzayAqLwotCi0gIHsic2xpLmRtIiwJT1BfUkVHKDB4MzEyKSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmRtIiwJT1BfU0koMHg5KSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZHMiLAlPUF9SRUcoMHgzMTQpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZHMiLAlPUF9TSSgweEEpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5keiIsCU9QX1JFRygweDMxMCkgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5keiIsCU9QX1NJKDB4OCkgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmVtIiwJT1BfUkVHKDB4MzE4KSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmVtIiwJT1BfU0koMHhDKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZXMiLAlPUF9SRUcoMHgzMUEpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZXMiLAlPUF9TSSgweEQpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5leiIsCU9QX1JFRygweDMxNikgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5leiIsCU9QX1NJKDB4QikgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmltIiwJT1BfUkVHKDB4MzFFKSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmltIiwJT1BfU0koMHhGKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuaXoiLAlPUF9SRUcoMHgzMUMpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuaXoiLAlPUF9TSSgweEUpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFNoaWZ0IFJlZ2lzdGVyIFJpZ2h0IC0gbm90ZSB0aGF0IGV4dHMsIGV4dHUsIHJvdHIsIHNyYSwgYW5kIHNybCBhcmUgYWxsIGFsdGVybmF0ZSBuYW1lcyBmb3Igb25lIG9mIHRoZSBzaGlmdCBpbnN0cnVjdGlvbnMuCi0gICAgIFRoZXkgYXBwZWFyIHByaW9yIHRvIHRoZWlyIHNyIGVxdWl2YWxlbnQgc28gdGhhdCB0aGV5IHdpbGwgYmUgZGlhc3NlbWJsZWQgYXMgdGhlIGFsdGVybmF0ZSBuYW1lLiAqLwotCi0gIHsiZXh0cyIsCU9QX1JFRygweDMxNCkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImV4dHMiLAlPUF9TSSgweEEpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImV4dHUiLAlPUF9SRUcoMHgzMTApIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJleHR1IiwJT1BfU0koMHg4KSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJyb3RyIiwJT1BfUkVHKDB4MzEwKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsicm90ciIsCU9QX1NJKDB4OCkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmEiLAlPUF9SRUcoMHgzMUEpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmEiLAlPUF9TSSgweEQpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNybCIsCU9QX1JFRygweDMxNikgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNybCIsCU9QX1NJKDB4QikgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZG0iLAlPUF9SRUcoMHgzMTIpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5kbSIsCU9QX1NJKDB4OSkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZHMiLAlPUF9SRUcoMHgzMTQpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5kcyIsCU9QX1NJKDB4QSkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZHoiLAlPUF9SRUcoMHgzMTApIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5keiIsCU9QX1NJKDB4OCkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZW0iLAlPUF9SRUcoMHgzMTgpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5lbSIsCU9QX1NJKDB4QykgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZXMiLAlPUF9SRUcoMHgzMUEpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5lcyIsCU9QX1NJKDB4RCkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuZXoiLAlPUF9SRUcoMHgzMTYpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5leiIsCU9QX1NJKDB4QikgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuaW0iLAlPUF9SRUcoMHgzMUUpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5pbSIsCU9QX1NJKDB4RikgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3IuaXoiLAlPUF9SRUcoMHgzMUMpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5peiIsCU9QX1NJKDB4RSkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogU2hpZnQgUmVnaXN0ZXIgUmlnaHQgV2l0aCBJbnZlcnRlZCBFbmRtYXNrICovCi0KLSAgeyJzcmkuZG0iLAlPUF9SRUcoMHgzMTIpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZG0iLAlPUF9TSSgweDkpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5kcyIsCU9QX1JFRygweDMxNCkgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5kcyIsCU9QX1NJKDB4QSkgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmR6IiwJT1BfUkVHKDB4MzEwKSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmR6IiwJT1BfU0koMHg4KSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZW0iLAlPUF9SRUcoMHgzMTgpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZW0iLAlPUF9TSSgweEMpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5lcyIsCU9QX1JFRygweDMxQSkgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5lcyIsCU9QX1NJKDB4RCkgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmV6IiwJT1BfUkVHKDB4MzE2KSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmV6IiwJT1BfU0koMHhCKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuaW0iLAlPUF9SRUcoMHgzMUUpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuaW0iLAlPUF9TSSgweEYpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5peiIsCU9QX1JFRygweDMxQykgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5peiIsCU9QX1NJKDB4RSkgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogU3RvcmUgRGF0YSBpbnRvIE1lbW9yeSAqLwotCi0gIHsic3QiLAlPUF9TSSgweDMyKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsIAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsic3QiLAlPUF9MSSgweDM2NSkgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJzdCIsCU9QX1JFRygweDM2NCkgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJzdC5iIiwJT1BfU0koMHgzMCksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLCAJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7InN0LmIiLAlPUF9MSSgweDM2MSkgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJzdC5iIiwJT1BfUkVHKDB4MzYwKSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7InN0LmQiLAlPUF9TSSgweDMzKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsIAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVF9FfQkJfSwKLSAgeyJzdC5kIiwJT1BfTEkoMHgzNjcpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJzdC5kIiwJT1BfUkVHKDB4MzY2KSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JCX0sCi0gIHsic3QuaCIsCU9QX1NJKDB4MzEpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwgCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJzdC5oIiwJT1BfTEkoMHgzNjMpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsic3QuaCIsCU9QX1JFRygweDM2MikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLQotICAvKiBTaWduZWQgSW50ZWdlciBTdWJ0cmFjdCAqLwotCi0gIHsic3ViIiwJT1BfU0koMHg1QSksCU1BU0tfU0ksCTAsIAl7U1NJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJzdWIiLAlPUF9MSSgweDNCNSksCU1BU0tfTEksCTAsCXtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7InN1YiIsCU9QX1JFRygweDNCNCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogVW5zaWduZWQgSW50ZWdlciBTdWJ0cmFjdCAqLwotCi0gIHsic3VidSIsCU9QX1NJKDB4NUIpLAlNQVNLX1NJLAkwLCAJe1NTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsic3VidSIsCU9QX0xJKDB4M0I3KSwJTUFTS19MSSwJMCwJe0xTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsic3VidSIsCU9QX1JFRygweDNCNiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogV3JpdGUgQ29udHJvbCBSZWdpc3RlcgotICAgICBJcyBhIHNwZWNpYWwgZm9ybSBvZiB0aGUgInN3Y3IiIGluc3RydWN0aW9uIHNvIGNvbWVzIGJlZm9yZSBpdCBpbiB0aGUgdGFibGUuICovCi0KLSAgeyJ3cmNyIiwJT1BfU0koMHg1KSwJTUFTS19TSSB8ICgweDFGIDw8IDI3KSwJCTAsCXtDUl9TSSwgUkVHXzIyfQl9LAotICB7IndyY3IiLAlPUF9MSSgweDMwQiksCU1BU0tfTEkgfCAoMHgxRiA8PCAyNyksCQkwLAl7Q1JfTEksIFJFR18yMn0JfSwKLSAgeyJ3cmNyIiwJT1BfUkVHKDB4MzBBKSwJTUFTS19SRUcgfCAoMHgxRiA8PCAyNyksCTAsCXtSRUdfMCwgUkVHXzIyfQl9LAotCi0gIC8qIFN3YXAgQ29udHJvbCBSZWdpc3RlciAqLwotCi0gIHsic3djciIsCU9QX1NJKDB4NSksCU1BU0tfU0ksCTAsCXtDUl9TSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzd2NyIiwJT1BfTEkoMHgzMEIpLAlNQVNLX0xJLAkwLAl7Q1JfTEksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3djciIsCU9QX1JFRygweDMwQSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogVHJhcCAqLwotCi0gIHsidHJhcCIsCU9QX1NJKDB4MSkgICAgfCBFKDApLAlNQVNLX1NJICB8IEUoMSksCTAsCXtTVUl9CX0sCi0gIHsidHJhcCIsCU9QX0xJKDB4MzAzKSAgfCBFKDApLAlNQVNLX0xJICB8IEUoMSksCTAsCXtMVUl9CX0sCi0gIHsidHJhcCIsCU9QX1JFRygweDMwMikgfCBFKDApLAlNQVNLX1JFRyB8IEUoMSksCTAsCXtSRUdfMH0JfSwKLQotICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgQWRkICovCi0KLSAgeyJ2YWRkLmRkIiwJT1BfUkVHKDB4M0MwKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1JFR18wX0UsIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2YWRkLnNkIiwJT1BfTEkoMHgzQzEpICB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1NQRkksIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2YWRkLnNkIiwJT1BfUkVHKDB4M0MwKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1JFR18wLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidmFkZC5zcyIsCU9QX0xJKDB4M0MxKSAgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtTUEZJLCBSRUdfMjIsIFJFR18yMn0JfSwKLSAgeyJ2YWRkLnNzIiwJT1BfUkVHKDB4M0MwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1JFR18wLCBSRUdfMjIsIFJFR18yMn0JfSwKLQotICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgTXVsdGlwbHkgYW5kIEFkZCB0byBBY2N1bXVsYXRvciBGSVhNRSEgVGhpcyBpcyBub3QgeWV0IGZ1bGx5IGltcGxlbWVudGVkLgotICAgRnJvbSB0aGUgZG9jdW1lbnRhdGlvbiB0aGVyZSBhcHBlYXJzIHRvIGJlIG5vIHdheSB0byB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG9wY29kZXMgZm9yCi0gICBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIHJlZ2lzdGVyIGRlc3RpbmF0aW9ucyBhbmQgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSBhY2N1bXVsYXRvciBkZXN0aW5hdGlvbnMuCi0gICBGdXJ0aGVyIGludmVzdGlnYXRpb24gaXMgbmVjZXNzYXJ5LiAgU2luY2UgdGhpcyBpc24ndCBjcml0aWNhbCB0byBnZXR0aW5nIGEgVElDODAgdG9vbGNoYWluIHVwCi0gICBhbmQgcnVubmluZywgaXQgaXMgZGVmZXJlZCB1bnRpbCBsYXRlci4gKi8KLQotICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgTXVsdGlwbHkKLSAgIE5vdGU6IElmIHIwIGlzIGluIHRoZSBkZXN0aW5hdGlvbiByZWcsIHRoZW4gdGhpcyBpcyBhICJ2ZWN0b3Igbm9wIiBpbnN0cnVjdGlvbi4gKi8KLQotICB7InZtcHkuZGQiLAlPUF9SRUcoMHgzQzQpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SIHwgVElDODBfTk9fUjBfREVTVCwge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfMjJfRX0gfSwKLSAgeyJ2bXB5LnNkIiwJT1BfTEkoMHgzQzUpICB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiB8IFRJQzgwX05PX1IwX0RFU1QsIHtTUEZJLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidm1weS5zZCIsCU9QX1JFRygweDNDNCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IgfCBUSUM4MF9OT19SMF9ERVNULCB7UkVHXzAsIFJFR18yMl9FLCBSRUdfMjJfRX0gfSwKLSAgeyJ2bXB5LnNzIiwJT1BfTEkoMHgzQzUpICB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiB8IFRJQzgwX05PX1IwX0RFU1QsIHtTUEZJLCBSRUdfMjIsIFJFR18yMn0JfSwKLSAgeyJ2bXB5LnNzIiwJT1BfUkVHKDB4M0M0KSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiB8IFRJQzgwX05PX1IwX0RFU1QsIHtSRUdfMCwgUkVHXzIyLCBSRUdfMjJ9IH0sCi0KLSAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IE11bHRpcGx5IGFuZCBTdWJ0cmFjdCBmcm9tIEFjY3VtdWxhdG9yCi0gICAgIEZJWE1FOiBTZWUgbm90ZSBhYm92ZSBmb3Igdm1hYyBpbnN0cnVjdGlvbiAqLwotCi0gIC8qIFZlY3RvciBGbG9hdGluZy1Qb2ludCBTdWJ0cmFjdCBBY2N1bXVsYXRvciBGcm9tIFNvdXJjZQotICAgICBGSVhNRTogU2VlIG5vdGUgYWJvdmUgZm9yIHZtYWMgaW5zdHJ1Y3Rpb24gKi8KLQotICAvKiBWZWN0b3IgUm91bmQgV2l0aCBGbG9hdGluZy1Qb2ludCBJbnB1dAotICAgICBGSVhNRTogU2VlIG5vdGUgYWJvdmUgZm9yIHZtYWMgaW5zdHJ1Y3Rpb24gKi8KLQotICAvKiBWZWN0b3IgUm91bmQgd2l0aCBJbnRlZ2VyIElucHV0ICovCi0KLSAgeyJ2cm5kLmlkIiwJT1BfTEkgKDB4M0NCKSAgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtMU0ksIFJFR18yMl9FfX0sCi0gIHsidnJuZC5pZCIsCU9QX1JFRyAoMHgzQ0EpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7UkVHXzAsIFJFR18yMl9FfX0sCi0gIHsidnJuZC5pcyIsCU9QX0xJICgweDNDQikgIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7TFNJLCBSRUdfMjJ9fSwKLSAgeyJ2cm5kLmlzIiwJT1BfUkVHICgweDNDQSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfMCwgUkVHXzIyfX0sCi0gIHsidnJuZC51ZCIsCU9QX0xJICgweDNDQikgIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19MSSAgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7TFVJLCBSRUdfMjJfRX19LAotICB7InZybmQudWQiLAlPUF9SRUcgKDB4M0NBKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR18wLCBSRUdfMjJfRX19LAotICB7InZybmQudXMiLAlPUF9MSSAoMHgzQ0IpICB8IFAyKDApIHwgUDEoMSksCU1BU0tfTEkgIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge0xVSSwgUkVHXzIyfX0sCi0gIHsidnJuZC51cyIsCU9QX1JFRyAoMHgzQ0EpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7UkVHXzAsIFJFR18yMn19LAotCi0gIC8qIFZlY3RvciBGbG9hdGluZy1Qb2ludCBTdWJ0cmFjdCAqLwotCi0gIHsidnN1Yi5kZCIsCU9QX1JFRygweDNDMikgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidnN1Yi5zZCIsCU9QX0xJKDB4M0MzKSAgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtTUEZJLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidnN1Yi5zZCIsCU9QX1JFRygweDNDMikgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMCwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZzdWIuc3MiLAlPUF9MSSgweDNDMykgIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7U1BGSSwgUkVHXzIyLCBSRUdfMjJ9CX0sCi0gIHsidnN1Yi5zcyIsCU9QX1JFRygweDNDMikgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMCwgUkVHXzIyLCBSRUdfMjJ9CX0sCi0KLSAgLyogVmVjdG9yIExvYWQgRGF0YSBJbnRvIFJlZ2lzdGVyIC0gTm90ZSB0aGF0IHRoZSB2ZWN0b3IgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgY29tZSBhZnRlciB0aGUgb3RoZXIKLSAgIHZlY3RvciBpbnN0cnVjdGlvbnMgc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgYWx3YXlzIHByaW50IHRoZSBsb2FkL3N0b3JlIGluc3RydWN0aW9uIHNlY29uZCBmb3IKLSAgIHZlY3RvciBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIHR3byBpbnN0cnVjdGlvbnMgaW4gdGhlIHNhbWUgb3Bjb2RlLiAqLwotCi0gIHsidmxkMC5kIiwJT1BfVigweDFFKSB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgwKSwJTUFTS19WIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfREVTVF9FfSB9LAotICB7InZsZDAucyIsCU9QX1YoMHgxRSkgfCBWX20oMSkgfCBWX1MoMCkgfCBWX3AoMCksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1R9IH0sCi0gIHsidmxkMS5kIiwJT1BfVigweDFFKSB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJTUFTS19WIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfREVTVF9FfSB9LAotICB7InZsZDEucyIsCU9QX1YoMHgxRSkgfCBWX20oMSkgfCBWX1MoMCkgfCBWX3AoMSksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1R9IH0sCi0KLSAgLyogVmVjdG9yIFN0b3JlIERhdGEgSW50byBNZW1vcnkgLSBOb3RlIHRoYXQgdGhlIHZlY3RvciBsb2FkL3N0b3JlIGluc3RydWN0aW9ucyBjb21lIGFmdGVyIHRoZSBvdGhlcgotICAgdmVjdG9yIGluc3RydWN0aW9ucyBzbyB0aGF0IHRoZSBkaXNhc3NlbWJsZXIgd2lsbCBhbHdheXMgcHJpbnQgdGhlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24gc2Vjb25kIGZvcgotICAgdmVjdG9yIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgdHdvIGluc3RydWN0aW9ucyBpbiB0aGUgc2FtZSBvcGNvZGUuICovCi0KLSAgeyJ2c3QuZCIsCU9QX1YoMHgxRSkgfCBWX20oMCkgfCBWX1MoMSkgfCBWX3AoMSksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1RfRX0gfSwKLSAgeyJ2c3QucyIsCU9QX1YoMHgxRSkgfCBWX20oMCkgfCBWX1MoMCkgfCBWX3AoMSksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1R9IH0sCi0KLSAgeyJ4bm9yIiwJT1BfU0koMHgxOSksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfSB9LAotICB7Inhub3IiLAlPUF9MSSgweDMzMyksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfSB9LAotICB7Inhub3IiLAlPUF9SRUcoMHgzMzIpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfSB9LAotCi0gIHsieG9yIiwJT1BfU0koMHgxNiksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfSB9LAotICB7InhvciIsCU9QX0xJKDB4MzJEKSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9IH0sCi0gIHsieG9yIiwJT1BfUkVHKDB4MzJDKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0gfSwKLQotfTsKLQotY29uc3QgaW50IHRpYzgwX251bV9vcGNvZGVzID0gc2l6ZW9mICh0aWM4MF9vcGNvZGVzKSAvIHNpemVvZiAodGljODBfb3Bjb2Rlc1swXSk7CmRpZmYgLS1naXQgYS9vcGNvZGVzL3Y4NTAtZGlzLmMgYi9vcGNvZGVzL3Y4NTAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMDYyNWIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy92ODUwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIFY4NTAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvdjg1MC5oIiAKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2ODUwX3JlZ19uYW1lc1tdID0KLXsgInIwIiwgInIxIiwgInIyIiwgInNwIiwgImdwIiwgInI1IiwgInI2IiwgInI3IiwgCi0gICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIsIAotICAicjE2IiwgInIxNyIsICJyMTgiLCAicjE5IiwgInIyMCIsICJyMjEiLCAicjIyIiwgInIyMyIsIAotICAicjI0IiwgInIyNSIsICJyMjYiLCAicjI3IiwgInIyOCIsICJyMjkiLCAiZXAiLCAibHAiIH07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2ODUwX3NyZWdfbmFtZXNbXSA9Ci17ICJlaXBjIiwgImVpcHN3IiwgImZlcGMiLCAiZmVwc3ciLCAiZWNyIiwgInBzdyIsICJzcjYiLCAic3I3IiwgCi0gICJzcjgiLCAic3I5IiwgInNyMTAiLCAic3IxMSIsICJzcjEyIiwgInNyMTMiLCAic3IxNCIsICJzcjE1IiwKLSAgImN0cGMiLCAiY3Rwc3ciLCAiZGJwYyIsICJkYnBzdyIsICJjdGJwIiwgInNyMjEiLCAic3IyMiIsICJzcjIzIiwgCi0gICJzcjI0IiwgInNyMjUiLCAic3IyNiIsICJzcjI3IiwgInNyMjgiLCAic3IyOSIsICJzcjMwIiwgInNyMzEiLAotICAic3IxNiIsICJzcjE3IiwgInNyMTgiLCAic3IxOSIsICJzcjIwIiwgInNyMjEiLCAic3IyMiIsICJzcjIzIiwgCi0gICJzcjI0IiwgInNyMjUiLCAic3IyNiIsICJzcjI3IiwgInNyMjgiLCAic3IyOSIsICJzcjMwIiwgInNyMzEiIH07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2ODUwX2NjX25hbWVzW10gPQoteyAidiIsICJjL2wiLCAieiIsICJuaCIsICJzL24iLCAidCIsICJsdCIsICJsZSIsIAotICAibnYiLCAibmMvbmwiLCAibnoiLCAiaCIsICJucy9wIiwgInNhIiwgImdlIiwgImd0IiB9OwotCi1zdGF0aWMgaW50Ci1kaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbikKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotewotICBzdHJ1Y3Qgdjg1MF9vcGNvZGUgKiAgICAgICAgICBvcCA9IChzdHJ1Y3Qgdjg1MF9vcGNvZGUgKil2ODUwX29wY29kZXM7Ci0gIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiAgIG9wZXJhbmQ7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gMDsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIAlzaG9ydF9vcCA9ICgoaW5zbiAmIDB4MDYwMCkgIT0gMHgwNjAwKTsKLSAgaW50CQkJCWJ5dGVzX3JlYWQ7Ci0gIGludAkJCQl0YXJnZXRfcHJvY2Vzc29yOwotICAKLSAgLyogU3BlY2lhbCBjYXNlOiAzMiBiaXQgTU9WICovCi0gIGlmICgoaW5zbiAmIDB4ZmZlMCkgPT0gMHgwNjIwKQotICAgIHNob3J0X29wID0gdHJ1ZTsKLSAgCi0gIGJ5dGVzX3JlYWQgPSBzaG9ydF9vcCA/IDIgOiA0OwotICAKLSAgLyogSWYgdGhpcyBpcyBhIHR3byBieXRlIGluc24sIHRoZW4gbWFzayBvZmYgdGhlIGhpZ2ggYml0cy4gKi8KLSAgaWYgKHNob3J0X29wKQotICAgIGluc24gJj0gMHhmZmZmOwotCi0gIHN3aXRjaCAoaW5mby0+bWFjaCkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgIGRlZmF1bHQ6Ci0gICAgICB0YXJnZXRfcHJvY2Vzc29yID0gUFJPQ0VTU09SX1Y4NTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfdjg1MGU6Ci0gICAgICB0YXJnZXRfcHJvY2Vzc29yID0gUFJPQ0VTU09SX1Y4NTBFOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlYTogCi0gICAgICB0YXJnZXRfcHJvY2Vzc29yID0gUFJPQ0VTU09SX1Y4NTBFQTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIC8qIEZpbmQgdGhlIG9wY29kZS4gICovCi0gIHdoaWxlIChvcC0+bmFtZSkKLSAgICB7Ci0gICAgICBpZiAoKG9wLT5tYXNrICYgaW5zbikgPT0gb3AtPm9wY29kZQotCSAgJiYgKG9wLT5wcm9jZXNzb3JzICYgdGFyZ2V0X3Byb2Nlc3NvcikpCi0JewotCSAgY29uc3QgdW5zaWduZWQgY2hhciAqIG9waW5kZXhfcHRyOwotCSAgdW5zaWduZWQgaW50ICAgICAgICAgIG9wbnVtOwotCSAgdW5zaWduZWQgaW50ICAgICAgICAgIG1lbW9wOwotCi0JICBtYXRjaCA9IDE7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzXHQiLCBvcC0+bmFtZSk7Ci0vKmZwcmludGYgKHN0ZGVyciwgIm1hdGNoOiBtYXNrOiAleCBpbnNuOiAleCwgb3Bjb2RlOiAleCwgbmFtZTogJXNcbiIsIG9wLT5tYXNrLCBpbnNuLCBvcC0+b3Bjb2RlLCBvcC0+bmFtZSApOyovCi0KLQkgIG1lbW9wID0gb3AtPm1lbW9wOwotCSAgLyogTm93IHByaW50IHRoZSBvcGVyYW5kcy4KLQotCSAgICAgTUVNT1AgaXMgdGhlIG9wZXJhbmQgbnVtYmVyIGF0IHdoaWNoIGEgbWVtb3J5Ci0JICAgICBhZGRyZXNzIHNwZWNpZmljYXRpb24gc3RhcnRzLCBvciB6ZXJvIGlmIHRoaXMKLQkgICAgIGluc3RydWN0aW9uIGhhcyBubyBtZW1vcnkgYWRkcmVzc2VzLgotCi0JICAgICBBIG1lbW9yeSBhZGRyZXNzIGlzIGFsd2F5cyB0d28gYXJndW1lbnRzLgotCi0JICAgICBUaGlzIGluZm9ybWF0aW9uIGFsbG93cyB1cyB0byBkZXRlcm1pbmUgd2hlbiB0bwotCSAgICAgaW5zZXJ0IGNvbW1hcyBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIGFzIHdlbGwgYXMKLQkgICAgIHdoZW4gdG8gaW5zZXJ0IGRpc3BbcmVnXSBleHByZXNzaW9ucyBvbnRvIHRoZQotCSAgICAgb3V0cHV0IHN0cmVhbS4gICovCi0JICAKLQkgIGZvciAob3BpbmRleF9wdHIgPSBvcC0+b3BlcmFuZHMsIG9wbnVtID0gMTsKLQkgICAgICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgICAgIG9waW5kZXhfcHRyKyssIG9wbnVtKyspCi0JICAgIHsKLQkgICAgICBsb25nIAl2YWx1ZTsKLQkgICAgICBpbnQgIAlmbGFnOwotCSAgICAgIGludCAgICAgICBzdGF0dXM7Ci0JICAgICAgYmZkX2J5dGUJYnVmZmVyWyA0IF07Ci0JICAgICAgCi0JICAgICAgb3BlcmFuZCA9ICZ2ODUwX29wZXJhbmRzWypvcGluZGV4X3B0cl07Ci0JICAgICAgCi0JICAgICAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCi0JCXZhbHVlID0gKG9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCAwKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAob3BlcmFuZC0+Yml0cyA9PSAtMSkKLQkJICAgIHZhbHVlID0gKGluc24gJiBvcGVyYW5kLT5zaGlmdCk7Ci0JCSAgZWxzZQotCQkgICAgdmFsdWUgPSAoaW5zbiA+PiBvcGVyYW5kLT5zaGlmdCkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQotCQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCi0JCSAgICB2YWx1ZSA9ICgobG9uZykodmFsdWUgPDwgKDMyIC0gb3BlcmFuZC0+Yml0cykpCi0JCQkgICAgID4+ICgzMiAtIG9wZXJhbmQtPmJpdHMpKTsKLQkJfQotCi0JICAgICAgLyogVGhlIGZpcnN0IG9wZXJhbmQgaXMgYWx3YXlzIG91dHB1dCB3aXRob3V0IGFueQotCQkgc3BlY2lhbCBoYW5kbGluZy4KLQotCQkgRm9yIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgotCi0JCSAgIElmIG1lbW9wICYmIG9wbnVtID09IG1lbW9wICsgMSwgdGhlbiB3ZSBuZWVkICdbJyBzaW5jZQotCQkgICB3ZSdyZSBhYm91dCB0byBvdXRwdXQgdGhlIHJlZ2lzdGVyIHVzZWQgaW4gYSBtZW1vcnkKLQkJICAgcmVmZXJlbmNlLgotCi0JCSAgIElmIG1lbW9wICYmIG9wbnVtID09IG1lbW9wICsgMiwgdGhlbiB3ZSBuZWVkICddJyBzaW5jZQotCQkgICB3ZSBqdXN0IGZpbmlzaGVkIHRoZSByZWdpc3RlciBpbiBhIG1lbW9yeSByZWZlcmVuY2UuICBXZQotCQkgICBhbHNvIG5lZWQgYSAnLCcgYmVmb3JlIHRoaXMgb3BlcmFuZC4KLQotCQkgICBFbHNlIHdlIGp1c3QgbmVlZCBhIGNvbW1hLgotCi0JCSAgIFdlIG1heSBuZWVkIHRvIG91dHB1dCBhIHRyYWlsaW5nICddJyBpZiB0aGUgbGFzdCBvcGVyYW5kCi0JCSAgIGluIGFuIGluc3RydWN0aW9uIGlzIHRoZSByZWdpc3RlciBmb3IgYSBtZW1vcnkgYWRkcmVzcy4gCi0KLQkJICAgVGhlIGV4Y2VwdGlvbiAoYW5kIHRoZXJlJ3MgYWx3YXlzIGFuIGV4Y2VwdGlvbikgaXMgdGhlCi0JCSAgICJqbXAiIGluc24gd2hpY2ggbmVlZHMgc3F1YXJlIGJyYWNrZXRzIGFyb3VuZCBpdCdzIG9ubHkKLQkJICAgcmVnaXN0ZXIgYXJndW1lbnQuICAqLwotCi0JICAgICAgICAgICBpZiAobWVtb3AgJiYgb3BudW0gPT0gbWVtb3AgKyAxKSBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIlsiKTsKLQkgICAgICBlbHNlIGlmIChtZW1vcCAmJiBvcG51bSA9PSBtZW1vcCArIDIpIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiXSwiKTsKLQkgICAgICBlbHNlIGlmIChtZW1vcCA9PSAxICYmIG9wbnVtID09IDEKLQkJICAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUcpKQotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIlsiKTsKLQkgICAgICBlbHNlIGlmIChvcG51bSA+IDEpCSAgICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiLCAiKTsKLQotCSAgICAgIC8qIGV4dHJhY3QgdGhlIGZsYWdzLCBpZ25vcm5nIG9uZXMgd2hpY2ggZG8gbm90IGVmZmVjdCBkaXNhc3NlbWJseSBvdXRwdXQuICovCi0JICAgICAgZmxhZyA9IG9wZXJhbmQtPmZsYWdzOwotCSAgICAgIGZsYWcgJj0gfiBWODUwX09QRVJBTkRfU0lHTkVEOwotCSAgICAgIGZsYWcgJj0gfiBWODUwX09QRVJBTkRfUkVMQVg7Ci0JICAgICAgZmxhZyAmPSAtIGZsYWc7Ci0JICAgICAgCi0JICAgICAgc3dpdGNoIChmbGFnKQotCQl7Ci0JCWNhc2UgVjg1MF9PUEVSQU5EX1JFRzogIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMiLCB2ODUwX3JlZ19uYW1lc1t2YWx1ZV0pOyBicmVhazsKLQkJY2FzZSBWODUwX09QRVJBTkRfU1JHOiAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyIsIHY4NTBfc3JlZ19uYW1lc1t2YWx1ZV0pOyBicmVhazsKLQkJY2FzZSBWODUwX09QRVJBTkRfQ0M6ICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyIsIHY4NTBfY2NfbmFtZXNbdmFsdWVdKTsgYnJlYWs7Ci0JCWNhc2UgVjg1MF9PUEVSQU5EX0VQOiAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiZXAiKTsgYnJlYWs7Ci0JCWRlZmF1bHQ6ICAgICAgICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJWQiLCB2YWx1ZSk7IGJyZWFrOwotCQljYXNlIFY4NTBfT1BFUkFORF9ESVNQOgotCQkgIHsKLQkJICAgIGJmZF92bWEgYWRkciA9IHZhbHVlICsgbWVtYWRkcjsKLQkJICAgIAotCQkgICAgLyogT24gdGhlIHY4NTAgdGhlIHRvcCA4IGJpdHMgb2YgYW4gYWRkcmVzcyBhcmUgdXNlZCBieSBhbiBvdmVybGF5IG1hbmFnZXIuCi0JCSAgICAgICBUaHVzIGl0IG1heSBoYXBwZW4gdGhhdCB3aGVuIHdlIGFyZSBsb29raW5nIGZvciBhIHN5bWJvbCB0byBtYXRjaAotCQkgICAgICAgYWdhaW5zdCBhbiBhZGRyZXNzIHdpdGggc29tZSBvZiBpdHMgdG9wIGJpdHMgc2V0LCB0aGUgc2VhcmNoIGZhaWxzIHRvCi0JCSAgICAgICB0dXJuIHVwIGFuIGV4YWN0IG1hdGNoLiAgSW4gdGhpcyBjYXNlIHdlIHRyeSB0byBmaW5kIGFuIGV4YWN0IG1hdGNoCi0JCSAgICAgICBhZ2FpbnN0IGEgc3ltYm9sIGluIHRoZSBsb3dlciBhZGRyZXNzIHNwYWNlLCBhbmQgaWYgd2UgZmluZCBvbmUsIHdlCi0JCSAgICAgICB1c2UgdGhhdCBhZGRyZXNzLiAgIFdlIG9ubHkgZG8gdGhpcyBmb3IgSkFSTCBpbnN0cnVjdGlvbnMgaG93ZXZlciwgYXMKLQkJICAgICAgIHdlIGRvIG5vdCB3YW50IHRvIG1pc2ludGVycHJldCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgKi8KLQkJICAgIGlmIChvcGVyYW5kLT5iaXRzID09IDIyKQotCQkgICAgICB7Ci0JCQlpZiAoICEgaW5mby0+c3ltYm9sX2F0X2FkZHJlc3NfZnVuYyAoYWRkciwgaW5mbykKLQkJCSAgICAmJiAoKGFkZHIgJiAweEZGMDAwMDAwKSAhPSAwKQotCQkJICAgICYmIGluZm8tPnN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgKGFkZHIgJiAweDAwRkZGRkZGLCBpbmZvKSkKLQkJCSAgewotCQkJICAgIGFkZHIgJj0gMHgwMEZGRkZGRjsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKGFkZHIsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQkgICAgCi0JCWNhc2UgVjg1MEVfUFVTSF9QT1A6Ci0JCSAgewotCQkgICAgc3RhdGljIGludCBsaXN0MTJfcmVnc1szMl0gICA9IHsgMzAsICAwLCAgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAgMCwgMzEsIDI5LCAyOCwgMjMsIDIyLCAyMSwgMjAsIDI3LCAyNiwgMjUsIDI0IH07Ci0JCSAgICBzdGF0aWMgaW50IGxpc3QxOF9oX3JlZ3NbMzJdID0geyAxOSwgMTgsIDE3LCAxNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTEsIDMwLCAzMSwgMjksIDI4LCAyMywgMjIsIDIxLCAyMCwgMjcsIDI2LCAyNSwgMjQgfTsKLQkJICAgIHN0YXRpYyBpbnQgbGlzdDE4X2xfcmVnc1szMl0gPSB7ICAzLCAgMiwgIDEsIC0yLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtMSwgMTQsIDE1LCAxMywgMTIsICA3LCAgNiwgIDUsICA0LCAxMSwgMTAsICA5LCAgOCB9OwotCQkgICAgaW50ICogICAgICAgICAgICAgcmVnczsKLQkJICAgIGludCAgICAgICAgICAgICAgIGk7Ci0JCSAgICB1bnNpZ25lZCBsb25nIGludCBtYXNrID0gMDsKLQkJICAgIGludCAgICAgICAgICAgICAgIHBjICAgPSBmYWxzZTsKLQkJICAgIGludCAgICAgICAgICAgICAgIHNyICAgPSBmYWxzZTsKLQkJICAgIAotCQkgICAgCi0JCSAgICBzd2l0Y2ggKG9wZXJhbmQtPnNoaWZ0KQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgMHhmZmUwMDAwMTogcmVncyA9IGxpc3QxMl9yZWdzOyBicmVhazsKLQkJICAgICAgY2FzZSAweGZmZjgwMDBmOiByZWdzID0gbGlzdDE4X2hfcmVnczsgYnJlYWs7Ci0JCSAgICAgIGNhc2UgMHhmZmY4MDAxZjogcmVncyA9IGxpc3QxOF9sX3JlZ3M7IHZhbHVlICY9IH4weDEwOyBicmVhazsgIC8qIERvIG5vdCBpbmNsdWRlIG1hZ2ljIGJpdCAqLwotCQkgICAgICBkZWZhdWx0OgotCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCWZwcmludGYgKHN0ZGVyciwgXygidW5rbm93biBvcGVyYW5kIHNoaWZ0OiAleFxuIiksIG9wZXJhbmQtPnNoaWZ0ICk7Ci0JCQlhYm9ydCgpOwotCQkgICAgICB9Ci0KLQkJICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQkgICAgICB7Ci0JCQlpZiAodmFsdWUgJiAoMSA8PCBpKSkKLQkJCSAgewotCQkJICAgIHN3aXRjaCAocmVnc1sgaSBdKQotCQkJICAgICAgewotCQkJICAgICAgZGVmYXVsdDogbWFzayB8PSAoMSA8PCByZWdzWyBpIF0pOyBicmVhazsKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJICAgICAgY2FzZSAwOiAgZnByaW50ZiAoc3RkZXJyLCBfKCJ1bmtub3duIHBvcCByZWc6ICVkXG4iKSwgaSApOyBhYm9ydCgpOwotCQkJICAgICAgY2FzZSAtMTogcGMgPSB0cnVlOyBicmVhazsKLQkJCSAgICAgIGNhc2UgLTI6IHNyID0gdHJ1ZTsgYnJlYWs7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQkJICAgICAgfQotCi0JCSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgInsiKTsKLQkJICAgIAotCQkgICAgaWYgKG1hc2sgfHwgcGMgfHwgc3IpCi0JCSAgICAgIHsKLQkJCWlmIChtYXNrKQotCQkJICB7Ci0JCQkgICAgdW5zaWduZWQgaW50IGJpdDsKLQkJCSAgICBpbnQgICAgICAgICAgc2hvd25fb25lID0gZmFsc2U7Ci0JCQkgICAgCi0JCQkgICAgZm9yIChiaXQgPSAwOyBiaXQgPCAzMjsgYml0KyspCi0JCQkgICAgICBpZiAobWFzayAmICgxIDw8IGJpdCkpCi0JCQkJewotCQkJCSAgdW5zaWduZWQgbG9uZyBpbnQgZmlyc3QgPSBiaXQ7Ci0JCQkJICB1bnNpZ25lZCBsb25nIGludCBsYXN0OwotCi0JCQkJICBpZiAoc2hvd25fb25lKQotCQkJCSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiwgIik7Ci0JCQkJICBlbHNlCi0JCQkJICAgIHNob3duX29uZSA9IHRydWU7Ci0JCQkJICAKLQkJCQkgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCB2ODUwX3JlZ19uYW1lc1tmaXJzdF0pOwotCQkJCSAgCi0JCQkJICBmb3IgKGJpdCsrOyBiaXQgPCAzMjsgYml0KyspCi0JCQkJICAgIGlmICgobWFzayAmICgxIDw8IGJpdCkpID09IDApCi0JCQkJICAgICAgYnJlYWs7Ci0KLQkJCQkgIGxhc3QgPSBiaXQ7Ci0KLQkJCQkgIGlmIChsYXN0ID4gZmlyc3QgKyAxKQotCQkJCSAgICB7Ci0JCQkJICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgLSAlcyIsIHY4NTBfcmVnX25hbWVzWyBsYXN0IC0gMSBdKTsKLQkJCQkgICAgfQotCQkJCX0KLQkJCSAgfQotCQkJCi0JCQlpZiAocGMpCi0JCQkgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXNQQyIsIG1hc2sgPyAiLCAiIDogIiIpOwotCQkJaWYgKHNyKQotCQkJICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzU1IiLCAobWFzayB8fCBwYykgPyAiLCAiIDogIiIpOwotCQkgICAgICB9Ci0JCSAgICAKLQkJICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAifSIpOwotCQkgIH0KLQkJYnJlYWs7Ci0JCSAgCi0JCWNhc2UgVjg1MEVfSU1NRURJQVRFMTY6Ci0JCSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciArIGJ5dGVzX3JlYWQsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JCSAgaWYgKHN0YXR1cyA9PSAwKQotCQkgICAgewotCQkgICAgICBieXRlc19yZWFkICs9IDI7Ci0JCSAgICAgIHZhbHVlID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQotCQkgICAgICAvKiBJZiB0aGlzIGlzIGEgRElTUE9TRSBpbnN0cnVjdGlvbiB3aXRoIGZmIHNldCB0byAweDEwLCB0aGVuIHNoaWZ0IHZhbHVlIHVwIGJ5IDE2LiAgKi8KLQkJICAgICAgaWYgKChpbnNuICYgMHgwMDFmZmZjMCkgPT0gMHgwMDEzMDc4MCkKLQkJCXZhbHVlIDw8PSAxNjsKLQotCQkgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCB2YWx1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyICsgYnl0ZXNfcmVhZCwgaW5mbyk7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgVjg1MEVfSU1NRURJQVRFMzI6Ci0JCSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciArIGJ5dGVzX3JlYWQsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JCSAgaWYgKHN0YXR1cyA9PSAwKQotCQkgICAgewotCQkgICAgICBieXRlc19yZWFkICs9IDQ7Ci0JCSAgICAgIHZhbHVlID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQkJICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIweCVseCIsIHZhbHVlKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIgKyBieXRlc19yZWFkLCBpbmZvKTsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJfQkJICAKLQotCSAgICAgIC8qIEhhbmRsZSBqbXAgY29ycmVjdGx5LiAgKi8KLQkgICAgICBpZiAobWVtb3AgPT0gMSAmJiBvcG51bSA9PSAxCi0JCSAgJiYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUcpICE9IDApKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIl0iKTsKLQkgICAgfQotCi0JICAvKiBDbG9zZSBhbnkgc3F1YXJlIGJyYWNrZXQgd2UgbGVmdCBvcGVuLiAgKi8KLQkgIGlmIChtZW1vcCAmJiBvcG51bSA9PSBtZW1vcCArIDIpCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXSIpOwotCi0JICAvKiBBbGwgZG9uZS4gKi8KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9wKys7Ci0gICAgfQotCi0gIGlmICghbWF0Y2gpCi0gICAgewotICAgICAgaWYgKHNob3J0X29wKQotCWluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiLnNob3J0XHQweCUwNHgiLCBpbnNuKTsKLSAgICAgIGVsc2UKLQlpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCUwOHgiLCBpbnNuKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGJ5dGVzX3JlYWQ7Ci19Ci0KLWludCAKLXByaW50X2luc25fdjg1MCAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci17Ci0gIGludCAgICAgICAgICAgc3RhdHVzOwotICBiZmRfYnl0ZSAgICAgIGJ1ZmZlclsgNCBdOwotICB1bnNpZ25lZCBsb25nIGluc24gPSAwOwotCi0gIC8qIEZpcnN0IGZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgb3Bjb2RlIGlzLiAgKi8KLSAgCi0gIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICB7Ci0gICAgICBpbnNuID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLSAgICAgIAotICAgICAgaWYgKCAgIChpbnNuICYgMHgwNjAwKSA9PSAweDA2MDAKLQkgICYmIChpbnNuICYgMHhmZmUwKSAhPSAweDA2MjApCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIDQgYnl0ZSBpbnNuLCByZWFkIDQgYnl0ZXMgb2Ygc3R1ZmYuICAqLwotCSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLQotCSAgaWYgKHN0YXR1cyA9PSAwKQotCSAgICBpbnNuID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQl9Ci0gICAgfQotICAKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgd2UgdGVsbCBvdXIgY2FsbGVyIGhvdyBtYW55IGJ5dGVzIHdlIGNvbnN1bWVkLiAgKi8KLSAgcmV0dXJuIGRpc2Fzc2VtYmxlIChtZW1hZGRyLCBpbmZvLCBpbnNuKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvdjg1MC1vcGMuYyBiL29wY29kZXMvdjg1MC1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0ODU3ZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3Y4NTAtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODYgKzAsMCBAQAotLyogQXNzZW1ibGUgVjg1MCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS92ODUwLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogcmVndWxhciBvcGNvZGUgKi8KLSNkZWZpbmUgT1AoeCkJCSgoeCAmIDB4M2YpIDw8IDUpCi0jZGVmaW5lIE9QX01BU0sJCU9QICgweDNmKQotCi0vKiBjb25kaXRpb25hbCBicmFuY2ggb3Bjb2RlICovCi0jZGVmaW5lIEJPUCh4KQkJKCgweDBiIDw8IDcpIHwgKHggJiAweDBmKSkKLSNkZWZpbmUgQk9QX01BU0sJKCgweDBmIDw8IDcpIHwgMHgwZikKLQotLyogb25lLXdvcmQgb3Bjb2RlcyAqLwotI2RlZmluZSBvbmUoeCkJCSgodW5zaWduZWQgaW50KSAoeCkpCi0KLS8qIHR3by13b3JkIG9wY29kZXMgKi8KLSNkZWZpbmUgdHdvKHgseSkJKCh1bnNpZ25lZCBpbnQpICh4KSB8ICgodW5zaWduZWQgaW50KSAoeSkgPDwgMTYpKQotCi0KLQwKLS8qIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBpbnNlcnQgYW5kIGV4dHJhY3QgY29tcGxpY2F0ZWQgb3BlcmFuZHMuICAqLwotCi0vKiBOb3RlOiBUaGVyZSBpcyBhIGNvbnNwaXJhY3kgYmV0d2VlbiB0aGVzZSBmdW5jdGlvbnMgYW5kCi0gICB2ODUwX2luc2VydF9vcGVyYW5kKCkgaW4gZ2FzL2NvbmZpZy90Yy12ODUwLmMuICBFcnJvciBtZXNzYWdlcwotICAgY29udGFpbmluZyB0aGUgc3RyaW5nICdvdXQgb2YgcmFuZ2UnIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgYQotICAgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbiBpcyBnaXZlbiB0byBHQVMuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqIG5vdF92YWxpZCAgICA9IE5fICgiZGlzcGxhY2VtZW50IHZhbHVlIGlzIG5vdCBpbiByYW5nZSBhbmQgaXMgbm90IGFsaWduZWQiKTsKLXN0YXRpYyBjb25zdCBjaGFyICogb3V0X29mX3JhbmdlID0gTl8gKCJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgb3V0IG9mIHJhbmdlIik7Ci1zdGF0aWMgY29uc3QgY2hhciAqIG5vdF9hbGlnbmVkICA9IE5fICgiZGlzcGxhY2VtZW50IHZhbHVlIGlzIG5vdCBhbGlnbmVkIik7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogaW1tZWRpYXRlX291dF9vZl9yYW5nZSA9IE5fICgiaW1tZWRpYXRlIHZhbHVlIGlzIG91dCBvZiByYW5nZSIpOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2Q5IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgICAgICAgICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweGZmIHx8IHZhbHVlIDwgLTB4MTAwKQotICAgIHsKLSAgICAgIGlmICgodmFsdWUgJSAyKSAhPSAwKQotCSogZXJybXNnID0gXygiYnJhbmNoIHZhbHVlIG5vdCBpbiByYW5nZSBhbmQgdG8gb2RkIG9mZnNldCIpOwotICAgICAgZWxzZQotCSogZXJybXNnID0gXygiYnJhbmNoIHZhbHVlIG91dCBvZiByYW5nZSIpOwotICAgIH0KLSAgZWxzZSBpZiAoKHZhbHVlICUgMikgIT0gMCkKLSAgICAqIGVycm1zZyA9IF8oImJyYW5jaCB0byBvZGQgb2Zmc2V0Iik7Ci0KLSAgcmV0dXJuIChpbnNuIHwgKCh2YWx1ZSAmIDB4MWYwKSA8PCA3KSB8ICgodmFsdWUgJiAweDBlKSA8PCAzKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2Q5IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgdW5zaWduZWQgbG9uZyByZXQgPSAoKGluc24gJiAweGY4MDApID4+IDcpIHwgKChpbnNuICYgMHgwMDcwKSA+PiAzKTsKLQotICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCi0gICAgcmV0IC09IDB4MDIwMDsKLQotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2QyMiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nICAgICAgICAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHgxZmZmZmYgfHwgdmFsdWUgPCAtMHgyMDAwMDApCi0gICAgewotICAgICAgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0JKiBlcnJtc2cgPSBfKCJicmFuY2ggdmFsdWUgbm90IGluIHJhbmdlIGFuZCB0byBhbiBvZGQgb2Zmc2V0Iik7Ci0gICAgICBlbHNlCi0JKiBlcnJtc2cgPSBfKCJicmFuY2ggdmFsdWUgb3V0IG9mIHJhbmdlIik7Ci0gICAgfQotICBlbHNlIGlmICgodmFsdWUgJSAyKSAhPSAwKQotICAgICogZXJybXNnID0gXygiYnJhbmNoIHRvIG9kZCBvZmZzZXQiKTsKLQotICByZXR1cm4gKGluc24gfCAoKHZhbHVlICYgMHhmZmZlKSA8PCAxNikgfCAoKHZhbHVlICYgMHgzZjAwMDApID4+IDE2KSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2QyMiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHNpZ25lZCBsb25nIHJldCA9ICgoaW5zbiAmIDB4ZmZmZTAwMDApID4+IDE2KSB8ICgoaW5zbiAmIDB4M2YpIDw8IDE2KTsKLQotICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpICgocmV0IDw8IDEwKSA+PiAxMCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZDE2XzE1IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgICAgICAgICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDdmZmYgfHwgdmFsdWUgPCAtMHg4MDAwKQotICAgIHsKLSAgICAgIGlmICgodmFsdWUgJSAyKSAhPSAwKQotCSogZXJybXNnID0gXyhub3RfdmFsaWQpOwotICAgICAgZWxzZQotCSogZXJybXNnID0gXyhvdXRfb2ZfcmFuZ2UpOwotICAgIH0KLSAgZWxzZSBpZiAoKHZhbHVlICUgMikgIT0gMCkKLSAgICAqIGVycm1zZyA9IF8obm90X2FsaWduZWQpOwotCi0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4ZmZmZSkgPDwgMTYpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9kMTZfMTUgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICBzaWduZWQgbG9uZyByZXQgPSAoaW5zbiAmIDB4ZmZmZTAwMDApOwotCi0gIHJldHVybiByZXQgPj4gMTY7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZDhfNyAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nICAgICAgICAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHhmZiB8fCB2YWx1ZSA8IDApCi0gICAgewotICAgICAgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0JKiBlcnJtc2cgPSBfKG5vdF92YWxpZCk7Ci0gICAgICBlbHNlCi0JKiBlcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7Ci0gICAgfQotICBlbHNlIGlmICgodmFsdWUgJSAyKSAhPSAwKQotICAgICogZXJybXNnID0gXyhub3RfYWxpZ25lZCk7Ci0KLSAgdmFsdWUgPj49IDE7Ci0KLSAgcmV0dXJuIChpbnNuIHwgKHZhbHVlICYgMHg3ZikpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9kOF83IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgdW5zaWduZWQgbG9uZyByZXQgPSAoaW5zbiAmIDB4N2YpOwotCi0gIHJldHVybiByZXQgPDwgMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kOF82IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgICAgICAgICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweGZmIHx8IHZhbHVlIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlICUgNCkgIT0gMCkKLQkqZXJybXNnID0gXyhub3RfdmFsaWQpOwotICAgICAgZWxzZQotCSogZXJybXNnID0gXyhvdXRfb2ZfcmFuZ2UpOwotICAgIH0KLSAgZWxzZSBpZiAoKHZhbHVlICUgNCkgIT0gMCkKLSAgICAqIGVycm1zZyA9IF8obm90X2FsaWduZWQpOwotCi0gIHZhbHVlID4+PSAxOwotCi0gIHJldHVybiAoaW5zbiB8ICh2YWx1ZSAmIDB4N2UpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDhfNiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmV0ID0gKGluc24gJiAweDdlKTsKLQotICByZXR1cm4gcmV0IDw8IDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZDVfNCAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nICAgICAgICAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHgxZiB8fCB2YWx1ZSA8IDApCi0gICAgewotICAgICAgaWYgKHZhbHVlICYgMSkKLQkqIGVycm1zZyA9IF8obm90X3ZhbGlkKTsKLSAgICAgIGVsc2UKLQkqZXJybXNnID0gXyhvdXRfb2ZfcmFuZ2UpOwotICAgIH0KLSAgZWxzZSBpZiAodmFsdWUgJiAxKQotICAgICogZXJybXNnID0gXyhub3RfYWxpZ25lZCk7Ci0KLSAgdmFsdWUgPj49IDE7Ci0KLSAgcmV0dXJuIChpbnNuIHwgKHZhbHVlICYgMHgwZikpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9kNV80IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgdW5zaWduZWQgbG9uZyByZXQgPSAoaW5zbiAmIDB4MGYpOwotCi0gIHJldHVybiByZXQgPDwgMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kMTZfMTYgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgc2lnbmVkIGxvbmcgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4N2ZmZiB8fCB2YWx1ZSA8IC0weDgwMDApCi0gICAgKiBlcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7Ci0KLSAgcmV0dXJuIChpbnNuIHwgKCh2YWx1ZSAmIDB4ZmZmZSkgPDwgMTYpIHwgKCh2YWx1ZSAmIDEpIDw8IDUpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDE2XzE2IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgc2lnbmVkIGxvbmcgcmV0ID0gaW5zbiAmIDB4ZmZmZTAwMDA7Ci0KLSAgcmV0ID4+PSAxNjsKLQotICByZXQgfD0gKChpbnNuICYgMHgyMCkgPj4gNSk7Ci0gIAotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2k5IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHNpZ25lZCBsb25nICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweGZmIHx8IHZhbHVlIDwgLTB4MTAwKQotICAgICogZXJybXNnID0gXyhpbW1lZGlhdGVfb3V0X29mX3JhbmdlKTsKLQotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFlMCkgPDwgMTMpIHwgKHZhbHVlICYgMHgxZik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2k5IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgc2lnbmVkIGxvbmcgcmV0ID0gaW5zbiAmIDB4MDAzYzAwMDA7Ci0KLSAgcmV0IDw8PSAxMDsKLSAgcmV0ID4+PSAyMzsKLQotICByZXQgfD0gKGluc24gJiAweDFmKTsKLSAgCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfdTkgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4MWZmKQotICAgICogZXJybXNnID0gXyhpbW1lZGlhdGVfb3V0X29mX3JhbmdlKTsKLQotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFlMCkgPDwgMTMpIHwgKHZhbHVlICYgMHgxZik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X3U5IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgdW5zaWduZWQgbG9uZyByZXQgPSBpbnNuICYgMHgwMDNjMDAwMDsKLQotICByZXQgPj49IDEzOwotCi0gIHJldCB8PSAoaW5zbiAmIDB4MWYpOwotICAKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9zcGUgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSAhPSAzKQotICAgICogZXJybXNnID0gXygiaW52YWxpZCByZWdpc3RlciBmb3Igc3RhY2sgYWRqdXN0bWVudCIpOwotCi0gIHJldHVybiBpbnNuICYgKH4gMHgxODAwMDApOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9zcGUgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICByZXR1cm4gMzsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9pNWRpdiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHgxZmYpCi0gICAgewotICAgICAgaWYgKHZhbHVlICYgMSkKLQkqIGVycm1zZyA9IF8oImltbWVkaWF0ZSB2YWx1ZSBub3QgaW4gcmFuZ2UgYW5kIG5vdCBldmVuIik7Ci0gICAgICBlbHNlCi0JKiBlcnJtc2cgPSBfKGltbWVkaWF0ZV9vdXRfb2ZfcmFuZ2UpOwotICAgIH0KLSAgZWxzZSBpZiAodmFsdWUgJiAxKQotICAgICogZXJybXNnID0gXygiaW1tZWRpYXRlIHZhbHVlIG11c3QgYmUgZXZlbiIpOwotCi0gIHZhbHVlID0gMzIgLSB2YWx1ZTsKLSAgCi0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWUpIDw8IDE3KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfaTVkaXYgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9IGluc24gJiAweDNjMDAwMDsKLQotICByZXQgPj49IDE3OwotCi0gIHJldCA9IDMyIC0gcmV0OwotICAKLSAgcmV0dXJuIHJldDsKLX0KLQotDAotLyogV2FybmluZzogY29kZSBpbiBnYXMvY29uZmlnL3RjLXY4NTAuYyBleGFtaW5lcyB0aGUgY29udGVudHMgb2YgdGhpcyBhcnJheS4KLSAgIElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZSB2YWx1ZXMgaGVyZSwgYmUgc3VyZSB0byBsb29rIGZvciBzaWRlIGVmZmVjdHMgaW4KLSAgIHRoYXQgY29kZS4gKi8KLWNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgdjg1MF9vcGVyYW5kc1tdID0KLXsKLSNkZWZpbmUgVU5VU0VECTAKLSAgeyAwLCAwLCBOVUxMLCBOVUxMLCAwIH0sIAotCi0vKiBUaGUgUjEgZmllbGQgaW4gYSBmb3JtYXQgMSwgNiwgNywgb3IgOSBpbnNuLiAqLwotI2RlZmluZSBSMQkoVU5VU0VEICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfUkVHIH0sIAotCi0vKiBBcyBhYm92ZSwgYnV0IHJlZ2lzdGVyIDAgaXMgbm90IGFsbG93ZWQuICAqLwotI2RlZmluZSBSMV9OT1RSMCAoUjEgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfCBWODUwX05PVF9SMCB9LCAKLQotLyogVGhlIFIyIGZpZWxkIGluIGEgZm9ybWF0IDEsIDIsIDQsIDUsIDYsIDcsIDkgaW5zbi4gKi8KLSNkZWZpbmUgUjIJKFIxX05PVFIwICsgMSkKLSAgeyA1LCAxMSwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB9LAotCi0vKiBBcyBhYm92ZSwgYnV0IHJlZ2lzdGVyIDAgaXMgbm90IGFsbG93ZWQuICAqLwotI2RlZmluZSBSMl9OT1RSMCAoUjIgKyAxKQotICB7IDUsIDExLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfUkVHIHwgVjg1MF9OT1RfUjAgfSwKLQotLyogVGhlIGltbTUgZmllbGQgaW4gYSBmb3JtYXQgMiBpbnNuLiAqLwotI2RlZmluZSBJNQkoUjJfTk9UUjAgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCi0KLS8qIFRoZSB1bnNpZ25lZCBpbW01IGZpZWxkIGluIGEgZm9ybWF0IDIgaW5zbi4gKi8KLSNkZWZpbmUgSTVVCShJNSArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgMCB9LAotCi0vKiBUaGUgaW1tMTYgZmllbGQgaW4gYSBmb3JtYXQgNiBpbnNuLiAqLwotI2RlZmluZSBJMTYJKEk1VSArIDEpCi0gIHsgMTYsIDE2LCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAotCi0vKiBUaGUgc2lnbmVkIGRpc3A3IGZpZWxkIGluIGEgZm9ybWF0IDQgaW5zbi4gKi8KLSNkZWZpbmUgRDcJKEkxNiArIDEpCi0gIHsgNywgMCwgTlVMTCwgTlVMTCwgMH0sCi0KLS8qIFRoZSBkaXNwMTYgZmllbGQgaW4gYSBmb3JtYXQgNiBpbnNuLiAqLwotI2RlZmluZSBEMTZfMTUJKEQ3ICsgMSkKLSAgeyAxNSwgMTcsIGluc2VydF9kMTZfMTUsIGV4dHJhY3RfZDE2XzE1LCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAotCi0vKiBUaGUgMyBiaXQgaW1tZWRpYXRlIGZpZWxkIGluIGZvcm1hdCA4IGluc24uICAqLwotI2RlZmluZSBCMwkoRDE2XzE1ICsgMSkKLSAgeyAzLCAxMSwgTlVMTCwgTlVMTCwgMCB9LAotCi0vKiBUaGUgNCBiaXQgY29uZGl0aW9uIGNvZGUgaW4gYSBzZXRmIGluc3RydWN0aW9uICovCi0jZGVmaW5lIENDQ0MJKEIzICsgMSkKLSAgeyA0LCAwLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfQ0MgfSwKLQotLyogVGhlIHVuc2lnbmVkIERJU1A4IGZpZWxkIGluIGEgZm9ybWF0IDQgaW5zbi4gKi8KLSNkZWZpbmUgRDhfNwkoQ0NDQyArIDEpCi0gIHsgNywgMCwgaW5zZXJ0X2Q4XzcsIGV4dHJhY3RfZDhfNywgMCB9LAotCi0vKiBUaGUgdW5zaWduZWQgRElTUDggZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLwotI2RlZmluZSBEOF82CShEOF83ICsgMSkKLSAgeyA2LCAxLCBpbnNlcnRfZDhfNiwgZXh0cmFjdF9kOF82LCAwIH0sCi0KLS8qIFN5c3RlbSByZWdpc3RlciBvcGVyYW5kcy4gICovCi0jZGVmaW5lIFNSMQkoRDhfNiArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1NSRyB9LAotCi0vKiBFUCBSZWdpc3Rlci4gICovCi0jZGVmaW5lIEVQCShTUjEgKyAxKQotICB7IDAsIDAsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9FUCB9LAotCi0vKiBUaGUgaW1tMTYgZmllbGQgKHVuc2lnbmVkKSBpbiBhIGZvcm1hdCA2IGluc24uICovCi0jZGVmaW5lIEkxNlUJKEVQICsgMSkKLSAgeyAxNiwgMTYsIE5VTEwsIE5VTEwsIDB9LCAKLQotLyogVGhlIFIyIGZpZWxkIGFzIGEgc3lzdGVtIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgU1IyCShJMTZVICsgMSkKLSAgeyA1LCAxMSwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1NSRyB9LAotCi0vKiBUaGUgZGlzcDE2IGZpZWxkIGluIGEgZm9ybWF0IDggaW5zbi4gKi8KLSNkZWZpbmUgRDE2CShTUjIgKyAxKQotICB7IDE2LCAxNiwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1NJR05FRCB9LCAKLQotLyogVGhlIERJU1A5IGZpZWxkIGluIGEgZm9ybWF0IDMgaW5zbiwgcmVsYXhhYmxlLiAqLwotI2RlZmluZSBEOV9SRUxBWAkoRDE2ICsgMSkKLSAgeyA5LCAwLCBpbnNlcnRfZDksIGV4dHJhY3RfZDksIFY4NTBfT1BFUkFORF9SRUxBWCB8IFY4NTBfT1BFUkFORF9TSUdORUQgfCBWODUwX09QRVJBTkRfRElTUCB9LAotCi0vKiBUaGUgRElTUDIyIGZpZWxkIGluIGEgZm9ybWF0IDQgaW5zbiwgcmVsYXhhYmxlLgotICAgVGhpcyBfbXVzdF8gZm9sbG93IEQ5X1JFTEFYOyB0aGUgYXNzZW1ibGVyIGFzc3VtZXMgdGhhdCB0aGUgbG9uZ2VyCi0gICB2ZXJzaW9uIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIHNob3J0ZXIgdmVyc2lvbiBmb3IgcmVsYXhpbmcuICAqLwotI2RlZmluZSBEMjIJKEQ5X1JFTEFYICsgMSkKLSAgeyAyMiwgMCwgaW5zZXJ0X2QyMiwgZXh0cmFjdF9kMjIsIFY4NTBfT1BFUkFORF9TSUdORUQgfCBWODUwX09QRVJBTkRfRElTUCB9LAotCi0vKiBUaGUgc2lnbmVkIGRpc3A0IGZpZWxkIGluIGEgZm9ybWF0IDQgaW5zbi4gKi8KLSNkZWZpbmUgRDQJKEQyMiArIDEpCi0gIHsgNCwgMCwgTlVMTCwgTlVMTCwgMH0sCi0KLS8qIFRoZSB1bnNpZ25lZCBkaXNwNSBmaWVsZCBpbiBhIGZvcm1hdCA0IGluc24uICovCi0jZGVmaW5lIEQ1XzQJKEQ0ICsgMSkKLSAgeyA0LCAwLCBpbnNlcnRfZDVfNCwgZXh0cmFjdF9kNV80LCAwIH0sCi0KLS8qIFRoZSBkaXNwMTYgZmllbGQgaW4gYW4gZm9ybWF0IDcgdW5zaWduZWQgYnl0ZSBsb2FkIGluc24uICovCi0jZGVmaW5lIEQxNl8xNgkoRDVfNCArIDEpCi0gIHsgLTEsIDB4ZmZmZTAwMjAsIGluc2VydF9kMTZfMTYsIGV4dHJhY3RfZDE2XzE2LCAwIH0sIAotCi0vKiBUaGlyZCByZWdpc3RlciBpbiBjb25kaXRpb25hbCBtb3Zlcy4gKi8KLSNkZWZpbmUgUjMJKEQxNl8xNiArIDEpCi0gIHsgNSwgMjcsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfSwKLQotLyogQ29uZGl0aW9uIGNvZGUgaW4gY29uZGl0aW9uYWwgbW92ZXMuICAqLwotI2RlZmluZSBNT1ZDQwkoUjMgKyAxKQotICB7IDQsIDE3LCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfQ0MgfSwKLQotLyogVGhlIGltbTkgZmllbGQgaW4gYSBtdWx0aXBseSB3b3JkLiAqLwotI2RlZmluZSBJOQkoTU9WQ0MgKyAxKQotICB7IDksIDAsIGluc2VydF9pOSwgZXh0cmFjdF9pOSwgVjg1MF9PUEVSQU5EX1NJR05FRCB9LCAKLQotLyogVGhlIHVuc2lnbmVkIGltbTkgZmllbGQgaW4gYSBtdWx0aXBseSB3b3JkLiAqLwotI2RlZmluZSBVOQkoSTkgKyAxKQotICB7IDksIDAsIGluc2VydF91OSwgZXh0cmFjdF91OSwgMCB9LCAKLQotLyogQSBsaXN0IG9mIHJlZ2lzdGVycyBpbiBhIHByZXBhcmUvZGlzcG9zZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIExJU1QxMgkoVTkgKyAxKQotICB7IC0xLCAweGZmZTAwMDAxLCBOVUxMLCBOVUxMLCBWODUwRV9QVVNIX1BPUCB9LCAKLQotLyogVGhlIElNTTYgZmllbGQgaW4gYSBjYWxsIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBJNgkoTElTVDEyICsgMSkKLSAgeyA2LCAwLCBOVUxMLCBOVUxMLCAwIH0sIAotCi0vKiBUaGUgMTYgYml0IGltbWVkaWF0ZSBmb2xsb3dpbmcgYSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBJTU0xNgkoSTYgKyAxKQotICB7IDE2LCAxNiwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1NJR05FRCB8IFY4NTBFX0lNTUVESUFURTE2IH0sIAotCi0vKiBUaGUgMzIgYml0IGltbWVkaWF0ZSBmb2xsb3dpbmcgYSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBJTU0zMgkoSU1NMTYgKyAxKQotICB7IDAsIDAsIE5VTEwsIE5VTEwsIFY4NTBFX0lNTUVESUFURTMyIH0sIAotCi0vKiBUaGUgaW1tNSBmaWVsZCBpbiBhIHB1c2gvcG9wIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBJTU01CShJTU0zMiArIDEpCi0gIHsgNSwgMSwgTlVMTCwgTlVMTCwgMCB9LCAKLQotLyogUmVnMiBpbiBkaXNwb3NlIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBSMkRJU1BPU0UJKElNTTUgKyAxKQotICB7IDUsIDE2LCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfUkVHIHwgVjg1MF9OT1RfUjAgfSwKLQotLyogU3RhY2sgcG9pbnRlciBpbiBwcmVwYXJlIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBTUAkoUjJESVNQT1NFICsgMSkKLSAgeyAyLCAxOSwgaW5zZXJ0X3NwZSwgZXh0cmFjdF9zcGUsIFY4NTBfT1BFUkFORF9SRUcgfSwKLQotLyogVGhlIElNTTUgZmllbGQgaW4gYSBkaXZpZGUgTiBzdGVwIGluc3RydWN0aW9uLiAqLwotI2RlZmluZSBJNURJVgkoU1AgKyAxKQotICB7IDksIDAsIGluc2VydF9pNWRpdiwgZXh0cmFjdF9pNWRpdiwgVjg1MF9PUEVSQU5EX1NJR05FRCB9LCAKLQotICAvKiBUaGUgbGlzdCBvZiByZWdpc3RlcnMgaW4gYSBQVVNITUgvUE9QTUggaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBMSVNUMThfSCAoSTVESVYgKyAxKQotICB7IC0xLCAweGZmZjgwMDBmLCBOVUxMLCBOVUxMLCBWODUwRV9QVVNIX1BPUCB9LCAKLQotICAvKiBUaGUgbGlzdCBvZiByZWdpc3RlcnMgaW4gYSBQVVNITUwvUE9QTUwgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBMSVNUMThfTCAoTElTVDE4X0ggKyAxKQotICB7IC0xLCAweGZmZjgwMDFmLCBOVUxMLCBOVUxMLCBWODUwRV9QVVNIX1BPUCB9LCAvKiBUaGUgc2V0dGluZyBvZiB0aGUgNHRoIGJpdCBpcyBhIGZsYWcgdG8gZGlzYXNzbWJsZSgpIGluIHY4NTAtZGlzLmMgKi8KLX0gOyAKLQotDAotLyogcmVnLXJlZyBpbnN0cnVjdGlvbiBmb3JtYXQgKEZvcm1hdCBJKSAqLwotI2RlZmluZSBJRjEJe1IxLCBSMn0KLQotLyogaW1tLXJlZyBpbnN0cnVjdGlvbiBmb3JtYXQgKEZvcm1hdCBJSSkgKi8KLSNkZWZpbmUgSUYyCXtJNSwgUjJ9Ci0KLS8qIGNvbmRpdGlvbmFsIGJyYW5jaCBpbnN0cnVjdGlvbiBmb3JtYXQgKEZvcm1hdCBJSUkpICovCi0jZGVmaW5lIElGMwl7RDlfUkVMQVh9Ci0KLS8qIDMgb3BlcmFuZCBpbnN0cnVjdGlvbiAoRm9ybWF0IFZJKSAqLwotI2RlZmluZSBJRjYJe0kxNiwgUjEsIFIyfQotCi0vKiAzIG9wZXJhbmQgaW5zdHJ1Y3Rpb24gKEZvcm1hdCBWSSkgKi8KLSNkZWZpbmUgSUY2VQl7STE2VSwgUjEsIFIyfQotCi0KLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRQkJT1BDT0RFCQkJTUFTSwkJICAgICAgIHsgT1BFUkFORFMgfQkgICBNRU1PUCAgICBQUk9DRVNTT1IKLQotICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBPUENPREUgaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLSAgIE1BU0sgaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgIHdoaWNoIGJpdHMgaW4gdGhlIGFjdHVhbCBvcGNvZGUgbXVzdCBtYXRjaCBPUENPREUuCi0gICBPUEVSQU5EUyBpcyB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KLSAgIE1FTU9QIHNwZWNpZmllcyB3aGljaCBvcGVyYW5kIChpZiBhbnkpIGlzIGEgbWVtb3J5IG9wZXJhbmQuCi0gICBQUk9DRVNTT1JTIHNwZWNpZmllcyB3aGljaCBDUFUocykgc3VwcG9ydCB0aGUgb3Bjb2RlLgotICAgCi0gICBUaGUgZGlzYXNzZW1ibGVyIHJlYWRzIHRoZSB0YWJsZSBpbiBvcmRlciBhbmQgcHJpbnRzIHRoZSBmaXJzdAotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF0Y2hlcywgc28gdGhpcyB0YWJsZSBpcyBzb3J0ZWQgdG8gcHV0IG1vcmUKLSAgIHNwZWNpZmljIGluc3RydWN0aW9ucyBiZWZvcmUgbW9yZSBnZW5lcmFsIGluc3RydWN0aW9ucy4gIEl0IGlzIGFsc28KLSAgIHNvcnRlZCBieSBtYWpvciBvcGNvZGUuCi0KLSAgIFRoZSB0YWJsZSBpcyBhbHNvIHNvcnRlZCBieSBuYW1lLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuCi0gICBXaGVuIHBhcnNpbmcgYW4gaW5zdHJ1Y3Rpb24gdGhlIGFzc2VtYmxlciBmaW5kcyB0aGUgZmlyc3Qgb2NjdXJhbmNlCi0gICBvZiB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y2l0b24gaW4gdGhpcyB0YWJsZSBhbmQgdGhlbiBhdHRlbXB0cyB0bwotICAgbWF0Y2ggdGhlIGluc3RydWN0aW9uJ3MgYXJndW1lbnRzIHdpdGggZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhbmRzCi0gICBhc3NvY2lhdGVkIHdpdGggdGhlIGVudHJ5IGl0IGhhcyBqdXN0IGZvdW5kIGluIHRoaXMgdGFibGUuICBJZiB0aGUKLSAgIG1hdGNoIGZhaWxzIHRoZSBhc3NlbWJsZXIgbG9va3MgYXQgdGhlIG5leHQgZW50cnkgaW4gdGhpcyB0YWJsZS4KLSAgIElmIHRoYXQgZW50cnkgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByZXZpb3VzIGVudHJ5LCB0aGVuIGl0Ci0gICB0cmllcyB0byBtYXRjaCB0aGUgaW5zdHJ1Y3Rpb24gYWdhaW5zdCB0aGF0IGVudHJ5IGFuZCBzbyBvbi4gIFRoaXMKLSAgIGlzIGhvdyB0aGUgYXNzZW1ibGVyIGNvcGVzIHdpdGggbXVsdGlwbGUsIGRpZmZlcmVudCBmb3JtYXRzIG9mIHRoZQotICAgc2FtZSBpbnN0cnVjdGlvbi4gICovCi0KLWNvbnN0IHN0cnVjdCB2ODUwX29wY29kZSB2ODUwX29wY29kZXNbXSA9Ci17Ci17ICJicmVha3BvaW50IiwJMHhmZmZmLAkJCTB4ZmZmZiwJCSAgICAgIAl7VU5VU0VEfSwgICAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQoteyAiam1wIiwJb25lICgweDAwNjApLAkJb25lICgweGZmZTApLAkgICAgICAJe1IxfSwgCQkJMSwgUFJPQ0VTU09SX0FMTCB9LAotICAKLS8qIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zICovCi17ICJzbGQuYnUiLAlvbmUgKDB4MDMwMCksCQlvbmUgKDB4MDc4MCksCSAgICAgIAl7RDcsICAgRVAsICAgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzbGQuYnUiLCAgICAgb25lICgweDAwNjApLAkJb25lICgweDA3ZjApLCAgICAgICAgIAl7RDQsICAgRVAsICAgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfVjg1MEUgfSwKLQoteyAic2xkLmh1IiwJb25lICgweDA0MDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q4XzcsIEVQLCAgIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAic2xkLmh1IiwgICAgIG9uZSAoMHgwMDcwKSwJCW9uZSAoMHgwN2YwKSwgICAgICAgICAJe0Q1XzQsIEVQLCAgIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX1Y4NTBFIH0sCi0KLXsgInNsZC5iIiwgICAgICBvbmUgKDB4MDA2MCksCQlvbmUgKDB4MDdmMCksICAgICAgICAgCXtENCwgICBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzbGQuYiIsCW9uZSAoMHgwMzAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtENywgICBFUCwgICBSMn0sCTEsIFBST0NFU1NPUl9WODUwRSB9LAoteyAic2xkLmIiLAlvbmUgKDB4MDMwMCksCQlvbmUgKDB4MDc4MCksCSAgICAgIAl7RDcsICAgRVAsICAgUjJ9LAkxLCBQUk9DRVNTT1JfVjg1MCB9LAotCi17ICJzbGQuaCIsICAgICAgb25lICgweDAwNzApLAkJb25lICgweDA3ZjApLCAgICAgICAgIAl7RDVfNCwgRVAsICAgUjJ9LCAJMSwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAic2xkLmgiLAlvbmUgKDB4MDQwMCksCQlvbmUgKDB4MDc4MCksCSAgICAgIAl7RDhfNywgRVAsICAgUjJ9LCAJMSwgUFJPQ0VTU09SX1Y4NTBFIH0sCi17ICJzbGQuaCIsCW9uZSAoMHgwNDAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtEOF83LCBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfVjg1MCB9LAoteyAic2xkLnciLAlvbmUgKDB4MDUwMCksCQlvbmUgKDB4MDc4MSksCSAgICAgIAl7RDhfNiwgRVAsICAgUjJ9LCAJMSwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3N0LmIiLAlvbmUgKDB4MDM4MCksCQlvbmUgKDB4MDc4MCksCSAgICAgIAl7UjIsICAgRDcsICAgRVB9LCAJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3N0LmgiLAlvbmUgKDB4MDQ4MCksCQlvbmUgKDB4MDc4MCksCSAgICAgIAl7UjIsICAgRDhfNywgRVB9LCAJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3N0LnciLAlvbmUgKDB4MDUwMSksCQlvbmUgKDB4MDc4MSksCSAgICAgIAl7UjIsICAgRDhfNiwgRVB9LCAJMiwgUFJPQ0VTU09SX0FMTCB9LAotCi17ICJwdXNobWwiLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwJdHdvICgweGZmZjAsIDB4MDAwNyksIAl7TElTVDE4X0x9LCAJCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInB1c2htaCIsCXR3byAoMHgwN2UwLCAweDAwMDMpLAl0d28gKDB4ZmZmMCwgMHgwMDA3KSwgCXtMSVNUMThfSH0sIAkJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAicG9wbWwiLAl0d28gKDB4MDdmMCwgMHgwMDAxKSwJdHdvICgweGZmZjAsIDB4MDAwNyksIAl7TElTVDE4X0x9LCAJCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInBvcG1oIiwJdHdvICgweDA3ZjAsIDB4MDAwMyksCXR3byAoMHhmZmYwLCAweDAwMDcpLCAJe0xJU1QxOF9IfSwgCQkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJwcmVwYXJlIiwgICAgdHdvICgweDA3ODAsIDB4MDAwMyksCXR3byAoMHhmZmMwLCAweDAwMWYpLCAJe0xJU1QxMiwgSU1NNSwgU1B9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJwcmVwYXJlIiwgICAgdHdvICgweDA3ODAsIDB4MDAwYiksCXR3byAoMHhmZmMwLCAweDAwMWYpLCAJe0xJU1QxMiwgSU1NNSwgSU1NMTZ9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJwcmVwYXJlIiwgICAgdHdvICgweDA3ODAsIDB4MDAxMyksCXR3byAoMHhmZmMwLCAweDAwMWYpLCAJe0xJU1QxMiwgSU1NNSwgSU1NMTZ9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJwcmVwYXJlIiwgICAgdHdvICgweDA3ODAsIDB4MDAxYiksCXR3byAoMHhmZmMwLCAweDAwMWYpLCAJe0xJU1QxMiwgSU1NNSwgSU1NMzJ9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJwcmVwYXJlIiwgICAgdHdvICgweDA3ODAsIDB4MDAwMSksCXR3byAoMHhmZmMwLCAweDAwMWYpLCAJe0xJU1QxMiwgSU1NNX0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImRpc3Bvc2UiLAlvbmUgKDB4MDY0MCksICAgICAgICAgICBvbmUgKDB4ZmZjMCksICAgICAgICAgCXtJTU01LCBMSVNUMTIsIFIyRElTUE9TRX0sMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJkaXNwb3NlIiwJdHdvICgweDA2NDAsIDB4MDAwMCksICAgdHdvICgweGZmYzAsIDB4MDAxZiksIAl7SU1NNSwgTElTVDEyfSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi17ICJsZC5iIiwJdHdvICgweDA3MDAsIDB4MDAwMCksCXR3byAoMHgwN2UwLCAweDAwMDApLCAJe0QxNiwgUjEsIFIyfSwgCQkxLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJsZC5oIiwJdHdvICgweDA3MjAsIDB4MDAwMCksCXR3byAoMHgwN2UwLCAweDAwMDEpLCAJe0QxNl8xNSwgUjEsIFIyfSwgCTEsIFBST0NFU1NPUl9BTEwgfSwKLXsgImxkLnciLAl0d28gKDB4MDcyMCwgMHgwMDAxKSwJdHdvICgweDA3ZTAsIDB4MDAwMSksIAl7RDE2XzE1LCBSMSwgUjJ9LCAJMSwgUFJPQ0VTU09SX0FMTCB9LAoteyAibGQuYnUiLAl0d28gKDB4MDc4MCwgMHgwMDAxKSwgICB0d28gKDB4MDdjMCwgMHgwMDAxKSwgCXtEMTZfMTYsIFIxLCBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAibGQuaHUiLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwgICB0d28gKDB4MDdlMCwgMHgwMDAxKSwgCXtEMTZfMTUsIFIxLCBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9OT1RfVjg1MCB9LCAgCi17ICJzdC5iIiwJdHdvICgweDA3NDAsIDB4MDAwMCksCXR3byAoMHgwN2UwLCAweDAwMDApLCAJe1IyLCBEMTYsIFIxfSwgCQkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzdC5oIiwJdHdvICgweDA3NjAsIDB4MDAwMCksCXR3byAoMHgwN2UwLCAweDAwMDEpLCAJe1IyLCBEMTZfMTUsIFIxfSwgCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgInN0LnciLAl0d28gKDB4MDc2MCwgMHgwMDAxKSwJdHdvICgweDA3ZTAsIDB4MDAwMSksIAl7UjIsIEQxNl8xNSwgUjF9LCAJMiwgUFJPQ0VTU09SX0FMTCB9LAotCi0vKiBieXRlIHN3YXAvZXh0ZW5kIGluc3RydWN0aW9ucyAqLwoteyAienhiIiwJb25lICgweDAwODApLAkJb25lICgweGZmZTApLCAJICAgICAgCXtSMV9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInp4aCIsCW9uZSAoMHgwMGMwKSwJCW9uZSAoMHhmZmUwKSwgCSAgICAgIAl7UjFfTk9UUjB9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAic3hiIiwJb25lICgweDAwYTApLAkJb25lICgweGZmZTApLCAJICAgICAgCXtSMV9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInN4aCIsCW9uZSAoMHgwMGUwKSwJCW9uZSAoMHhmZmUwKSwJICAgICAgCXtSMV9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImJzaCIsCXR3byAoMHgwN2UwLCAweDAzNDIpLAl0d28gKDB4MDdmZiwgMHgwN2ZmKSwgCXtSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiYnN3IiwJdHdvICgweDA3ZTAsIDB4MDM0MCksCXR3byAoMHgwN2ZmLCAweDA3ZmYpLCAJe1IyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJoc3ciLAl0d28gKDB4MDdlMCwgMHgwMzQ0KSwJdHdvICgweDA3ZmYsIDB4MDdmZiksIAl7UjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLQotLyoganVtcCB0YWJsZSBpbnN0cnVjdGlvbnMgKi8KLXsgInN3aXRjaCIsCW9uZSAoMHgwMDQwKSwJCW9uZSAoMHhmZmUwKSwgCSAgICAgIAl7UjF9LCAJCQkxLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImNhbGx0IiwJb25lICgweDAyMDApLAkJb25lICgweGZmYzApLCAJICAgICAgCXtJNn0sIAkJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiY3RyZXQiLCAJdHdvICgweDA3ZTAsIDB4MDE0NCksCXR3byAoMHhmZmZmLCAweGZmZmYpLCAJezB9LCAJCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLQotLyogYXJpdGhtZXRpYyBvcGVyYXRpb24gaW5zdHJ1Y3Rpb25zICovCi17ICJzZXRmIiwJdHdvICgweDA3ZTAsIDB4MDAwMCksCXR3byAoMHgwN2YwLCAweGZmZmYpLCAJe0NDQ0MsIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJjbW92IiwJdHdvICgweDA3ZTAsIDB4MDMyMCksCXR3byAoMHgwN2UwLCAweDA3ZTEpLCAJe01PVkNDLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiY21vdiIsCXR3byAoMHgwN2UwLCAweDAzMDApLAl0d28gKDB4MDdlMCwgMHgwN2UxKSwgCXtNT1ZDQywgSTUsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLQoteyAibXVsIiwJdHdvICgweDA3ZTAsIDB4MDIyMCksCXR3byAoMHgwN2UwLCAweDA3ZmYpLCAJe1IxLCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAibXVsIiwJdHdvICgweDA3ZTAsIDB4MDI0MCksCXR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k5LCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAibXVsdSIsCXR3byAoMHgwN2UwLCAweDAyMjIpLAl0d28gKDB4MDdlMCwgMHgwN2ZmKSwgCXtSMSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgIm11bHUiLAl0d28gKDB4MDdlMCwgMHgwMjQyKSwJdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7VTksIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLXsgImRpdiIsCXR3byAoMHgwN2UwLCAweDAyYzApLAl0d28gKDB4MDdlMCwgMHgwN2ZmKSwgCXtSMSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImRpdnUiLAl0d28gKDB4MDdlMCwgMHgwMmMyKSwJdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJkaXZodSIsCXR3byAoMHgwN2UwLCAweDAyODIpLCAgIHR3byAoMHgwN2UwLCAweDA3ZmYpLCAJe1IxLCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiZGl2aCIsCXR3byAoMHgwN2UwLCAweDAyODApLCAgIHR3byAoMHgwN2UwLCAweDA3ZmYpLCAJe1IxLCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiZGl2aCIsCU9QICAoMHgwMiksCQlPUF9NQVNLLAkJe1IxLCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0gIAoteyAiZGl2aG4iLAl0d28gKDB4MDdlMCwgMHgwMjgwKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJkaXZodW4iLAl0d28gKDB4MDdlMCwgMHgwMjgyKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJkaXZuIiwJdHdvICgweDA3ZTAsIDB4MDJjMCksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAiZGl2dW4iLAl0d28gKDB4MDdlMCwgMHgwMmMyKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzZGl2aG4iLAl0d28gKDB4MDdlMCwgMHgwMTgwKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzZGl2aHVuIiwJdHdvICgweDA3ZTAsIDB4MDE4MiksICAgdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STVESVYsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAic2Rpdm4iLAl0d28gKDB4MDdlMCwgMHgwMWMwKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzZGl2dW4iLAl0d28gKDB4MDdlMCwgMHgwMWMyKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi0gIAoteyAibm9wIiwJb25lICgweDAwKSwJCW9uZSAoMHhmZmZmKSwJCXswfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibW92IiwJT1AgICgweDEwKSwJCU9QX01BU0ssCQl7STUsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm1vdiIsCW9uZSAoMHgwNjIwKSwJCW9uZSAoMHhmZmUwKSwJCXtJTU0zMiwgUjFfTk9UUjB9LAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgIm1vdiIsICAgICAgICBPUCAgKDB4MDApLAkJT1BfTUFTSywJCXtSMSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibW92ZWEiLAlPUCAgKDB4MzEpLAkJT1BfTUFTSywJCXtJMTYsIFIxLCBSMl9OT1RSMH0sCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm1vdmhpIiwJT1AgICgweDMyKSwJCU9QX01BU0ssCQl7STE2VSwgUjEsIFIyX05PVFIwfSwJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYWRkIiwJT1AgICgweDBlKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImFkZCIsCU9QICAoMHgxMiksCQlPUF9NQVNLLAkJSUYyLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJhZGRpIiwJT1AgICgweDMwKSwJCU9QX01BU0ssCQlJRjYsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInN1YiIsCU9QICAoMHgwZCksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzdWJyIiwgCU9QICAoMHgwYyksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtdWxoIiwJT1AgICgweDE3KSwJCU9QX01BU0ssCQl7STUsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm11bGgiLAlPUCAgKDB4MDcpLAkJT1BfTUFTSywJCXtSMSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibXVsaGkiLAlPUCAgKDB4MzcpLAkJT1BfTUFTSywJCXtJMTYsIFIxLCBSMl9OT1RSMH0sCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImNtcCIsCU9QICAoMHgwZiksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJjbXAiLAlPUCAgKDB4MTMpLAkJT1BfTUFTSywJCUlGMiwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotICAKLS8qIHNhdHVyYXRlZCBvcGVyYXRpb24gaW5zdHJ1Y3Rpb25zICovCi17ICJzYXRhZGQiLAlPUCAoMHgxMSksCQlPUF9NQVNLLAkJe0k1LCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzYXRhZGQiLAlPUCAoMHgwNiksCQlPUF9NQVNLLAkJe1IxLCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzYXRzdWIiLAlPUCAoMHgwNSksCQlPUF9NQVNLLAkJe1IxLCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzYXRzdWJpIiwJT1AgKDB4MzMpLAkJT1BfTUFTSywJCXtJMTYsIFIxLCBSMl9OT1RSMH0sCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhdHN1YnIiLAlPUCAoMHgwNCksCQlPUF9NQVNLLAkJe1IxLCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0KLS8qIGxvZ2ljYWwgb3BlcmF0aW9uIGluc3RydWN0aW9ucyAqLwoteyAidHN0IiwJT1AgKDB4MGIpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAib3IiLAkJT1AgKDB4MDgpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAib3JpIiwJT1AgKDB4MzQpLAkJT1BfTUFTSywJCUlGNlUsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImFuZCIsCU9QICgweDBhKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImFuZGkiLAlPUCAoMHgzNiksCQlPUF9NQVNLLAkJSUY2VSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAieG9yIiwJT1AgKDB4MDkpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAieG9yaSIsCU9QICgweDM1KSwJCU9QX01BU0ssCQlJRjZVLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJub3QiLAlPUCAoMHgwMSksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzYXIiLAlPUCAoMHgxNSksCQlPUF9NQVNLLAkJe0k1VSwgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhciIsCXR3byAoMHgwN2UwLCAweDAwYTApLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwgCXtSMSwgIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzaGwiLAlPUCAgKDB4MTYpLAkJT1BfTUFTSywJICAgICAgCXtJNVUsIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzaGwiLAl0d28gKDB4MDdlMCwgMHgwMGMwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksIAl7UjEsICBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2hyIiwJT1AgICgweDE0KSwJCU9QX01BU0ssCSAgICAgIAl7STVVLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2hyIiwJdHdvICgweDA3ZTAsIDB4MDA4MCksCXR3byAoMHgwN2UwLCAweGZmZmYpLCAJe1IxLCAgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhc2YiLCAgICAgICB0d28gKDB4MDdlMCwgMHgwMjAwKSwJdHdvICgweDA3ZjAsIDB4ZmZmZiksIAl7Q0NDQywgUjJ9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi0vKiBicmFuY2ggaW5zdHJ1Y3Rpb25zICovCi0JLyogc2lnbmVkIGludGVnZXIgKi8KLXsgImJndCIsCUJPUCAoMHhmKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJiZ2UiLAlCT1AgKDB4ZSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYmx0IiwJQk9QICgweDYpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJsZSIsCUJPUCAoMHg3KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0JLyogdW5zaWduZWQgaW50ZWdlciAqLwoteyAiYmgiLAkJQk9QICgweGIpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJuaCIsCUJPUCAoMHgzKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibCIsCQlCT1AgKDB4MSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm5sIiwJQk9QICgweDkpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQkvKiBjb21tb24gKi8KLXsgImJlIiwJCUJPUCAoMHgyKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibmUiLAlCT1AgKDB4YSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCS8qIG90aGVycyAqLwoteyAiYnYiLAkJQk9QICgweDApLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJudiIsCUJPUCAoMHg4KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibiIsCQlCT1AgKDB4NCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYnAiLAkJQk9QICgweGMpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJjIiwJCUJPUCAoMHgxKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibmMiLAlCT1AgKDB4OSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYnoiLAkJQk9QICgweDIpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJueiIsCUJPUCAoMHhhKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJiciIsCQlCT1AgKDB4NSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYnNhIiwJQk9QICgweGQpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQotLyogQnJhbmNoIG1hY3Jvcy4KLQotICAgV2UgdXNlIHRoZSBzaG9ydCBmb3JtIGluIHRoZSBvcGNvZGUvbWFzayBmaWVsZHMuICBUaGUgYXNzZW1ibGVyCi0gICB3aWxsIHR3aWRkbGUgYml0cyBhcyBuZWNlc3NhcnkgaWYgdGhlIGxvbmcgZm9ybSBpcyBuZWVkZWQuICAqLwotCi0JLyogc2lnbmVkIGludGVnZXIgKi8KLXsgImpndCIsCUJPUCAoMHhmKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqZ2UiLAlCT1AgKDB4ZSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamx0IiwJQk9QICgweDYpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpsZSIsCUJPUCAoMHg3KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0JLyogdW5zaWduZWQgaW50ZWdlciAqLwoteyAiamgiLAkJQk9QICgweGIpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpuaCIsCUJPUCAoMHgzKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbCIsCQlCT1AgKDB4MSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam5sIiwJQk9QICgweDkpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQkvKiBjb21tb24gKi8KLXsgImplIiwJCUJPUCAoMHgyKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbmUiLAlCT1AgKDB4YSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCS8qIG90aGVycyAqLwoteyAianYiLAkJQk9QICgweDApLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpudiIsCUJPUCAoMHg4KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbiIsCQlCT1AgKDB4NCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAianAiLAkJQk9QICgweGMpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpjIiwJCUJPUCAoMHgxKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbmMiLAlCT1AgKDB4OSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAianoiLAkJQk9QICgweDIpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpueiIsCUJPUCAoMHhhKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqc2EiLAlCT1AgKDB4ZCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamJyIiwJQk9QICgweDUpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLSAgCi17ICJqciIsCQlvbmUgKDB4MDc4MCksCQl0d28gKDB4ZmZjMCwgMHgwMDAxKSwJe0QyMn0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImphcmwiLAlvbmUgKDB4MDc4MCksCQl0d28gKDB4MDdjMCwgMHgwMDAxKSwJe0QyMiwgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEx9LCAKLQotLyogYml0IG1hbmlwdWxhdGlvbiBpbnN0cnVjdGlvbnMgKi8KLXsgInNldDEiLAl0d28gKDB4MDdjMCwgMHgwMDAwKSwJdHdvICgweGM3ZTAsIDB4MDAwMCksCXtCMywgRDE2LCBSMX0sIAkJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2V0MSIsCXR3byAoMHgwN2UwLCAweDAwZTApLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwJe1IyLCBSMX0sICAgIAkJMiwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJub3QxIiwJdHdvICgweDQ3YzAsIDB4MDAwMCksCXR3byAoMHhjN2UwLCAweDAwMDApLAl7QjMsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm5vdDEiLAl0d28gKDB4MDdlMCwgMHgwMGUyKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksCXtSMiwgUjF9LCAgICAJCTIsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiY2xyMSIsCXR3byAoMHg4N2MwLCAweDAwMDApLAl0d28gKDB4YzdlMCwgMHgwMDAwKSwJe0IzLCBEMTYsIFIxfSwgCQkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJjbHIxIiwJdHdvICgweDA3ZTAsIDB4MDBlNCksCXR3byAoMHgwN2UwLCAweGZmZmYpLCAgIHtSMiwgUjF9LCAgICAJCTIsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAidHN0MSIsCXR3byAoMHhjN2MwLCAweDAwMDApLAl0d28gKDB4YzdlMCwgMHgwMDAwKSwJe0IzLCBEMTYsIFIxfSwgCQkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJ0c3QxIiwJdHdvICgweDA3ZTAsIDB4MDBlNiksCXR3byAoMHgwN2UwLCAweGZmZmYpLAl7UjIsIFIxfSwgICAgCQkyLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLQotLyogc3BlY2lhbCBpbnN0cnVjdGlvbnMgKi8KLXsgImRpIiwJCXR3byAoMHgwN2UwLCAweDAxNjApLAl0d28gKDB4ZmZmZiwgMHhmZmZmKSwJezB9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJlaSIsCQl0d28gKDB4ODdlMCwgMHgwMTYwKSwJdHdvICgweGZmZmYsIDB4ZmZmZiksCXswfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiaGFsdCIsCXR3byAoMHgwN2UwLCAweDAxMjApLAl0d28gKDB4ZmZmZiwgMHhmZmZmKSwJezB9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJyZXRpIiwJdHdvICgweDA3ZTAsIDB4MDE0MCksCXR3byAoMHhmZmZmLCAweGZmZmYpLAl7MH0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInRyYXAiLAl0d28gKDB4MDdlMCwgMHgwMTAwKSwJdHdvICgweGZmZTAsIDB4ZmZmZiksCXtJNVV9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJsZHNyIiwJdHdvICgweDA3ZTAsIDB4MDAyMCksCXR3byAoMHgwN2UwLCAweGZmZmYpLAl7UjEsIFNSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3RzciIsCXR3byAoMHgwN2UwLCAweDAwNDApLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwJe1NSMSwgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgMCwgMCwgMCwgezB9LCAwLCAwIH0sCi0KLX0gOwotCi1jb25zdCBpbnQgdjg1MF9udW1fb3Bjb2RlcyA9Ci0gIHNpemVvZiAodjg1MF9vcGNvZGVzKSAvIHNpemVvZiAodjg1MF9vcGNvZGVzWzBdKTsKLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy92YXgtZGlzLmMgYi9vcGNvZGVzL3ZheC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRiNTlmMy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3ZheC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKiBQcmludCBWQVggaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUGF1bGluZSBNaWRkZWxpbmsgPG1pZGRlbGluQHBvbHl3YXJlLmlhZi5ubD4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgIm9wY29kZS92YXguaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLS8qIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBpbnQKLXByaW50X2luc25fYXJnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCBiZmRfdm1hLAotCQkJZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fbW9kZSBQQVJBTVMgKChpbnQsIHVuc2lnbmVkIGNoYXIgKiwgYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyBjaGFyICpyZWdfbmFtZXNbXSA9Ci17Ci0gICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCi0gICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgImFwIiwgImZwIiwgInNwIiwgInBjIgotfTsKLQotLyogU2lnbi1leHRlbmQgYW4gKHVuc2lnbmVkIGNoYXIpLiAqLwotI2lmIF9fU1REQ19fID09IDEKLSNkZWZpbmUgQ09FUkNFX1NJR05FRF9DSEFSKGNoKSAoKHNpZ25lZCBjaGFyKShjaCkpCi0jZWxzZQotI2RlZmluZSBDT0VSQ0VfU0lHTkVEX0NIQVIoY2gpICgoaW50KSgoKGNoKSBeIDB4ODApICYgMHhGRikgLSAxMjgpCi0jZW5kaWYKLQotLyogR2V0IGEgMSBieXRlIHNpZ25lZCBpbnRlZ2VyLiAgKi8KLSNkZWZpbmUgTkVYVEJZVEUocCkgIFwKLSAgKHAgKz0gMSwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgQ09FUkNFX1NJR05FRF9DSEFSKHBbLTFdKSkKLQotLyogR2V0IGEgMiBieXRlIHNpZ25lZCBpbnRlZ2VyLiAgKi8KLSNkZWZpbmUgQ09FUkNFMTYoeCkgKChpbnQpICgoKHgpIF4gMHg4MDAwKSAtIDB4ODAwMCkpCi0jZGVmaW5lIE5FWFRXT1JEKHApICBcCi0gIChwICs9IDIsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICBDT0VSQ0UxNiAoKHBbLTFdIDw8IDgpICsgcFstMl0pKQotCi0vKiBHZXQgYSA0IGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBDT0VSQ0UzMih4KSAoKGludCkgKCgoeCkgXiAweDgwMDAwMDAwKSAtIDB4ODAwMDAwMDApKQotI2RlZmluZSBORVhUTE9ORyhwKSAgXAotICAocCArPSA0LCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICAgKENPRVJDRTMyICgoKCgoKHBbLTFdIDw8IDgpICsgcFstMl0pIDw8IDgpICsgcFstM10pIDw8IDgpICsgcFstNF0pKSkKLQotLyogTWF4aW11bSBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNQVhMRU4gMjUKLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi1zdHJ1Y3QgcHJpdmF0ZQotewotICAvKiBQb2ludHMgdG8gZmlyc3QgYnl0ZSBub3QgZmV0Y2hlZC4gICovCi0gIGJmZF9ieXRlICptYXhfZmV0Y2hlZDsKLSAgYmZkX2J5dGUgdGhlX2J1ZmZlcltNQVhMRU5dOwotICBiZmRfdm1hIGluc25fc3RhcnQ7Ci0gIGptcF9idWYgYmFpbG91dDsKLX07Ci0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKLSAgKChhZGRyKSA8PSAoKHN0cnVjdCBwcml2YXRlICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCi0gICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChhZGRyKSkpCi0KLXN0YXRpYyBpbnQKLWZldGNoX2RhdGEgKGluZm8sIGFkZHIpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgaW50IHN0YXR1czsKLSAgc3RydWN0IHByaXZhdGUgKnByaXYgPSAoc3RydWN0IHByaXZhdGUgKikgaW5mby0+cHJpdmF0ZV9kYXRhOwotICBiZmRfdm1hIHN0YXJ0ID0gcHJpdi0+aW5zbl9zdGFydCArIChwcml2LT5tYXhfZmV0Y2hlZCAtIHByaXYtPnRoZV9idWZmZXIpOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHN0YXJ0LAotCQkJCSAgICAgIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGFkZHIgLSBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHN0YXJ0LCBpbmZvKTsKLSAgICAgIGxvbmdqbXAgKHByaXYtPmJhaWxvdXQsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHByaXYtPm1heF9mZXRjaGVkID0gYWRkcjsKLQotICByZXR1cm4gMTsKLX0KLQotLyogUHJpbnQgdGhlIHZheCBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzIE1FTUFERFIgaW4gZGVidWdnZWQgbWVtb3J5LAotICAgb24gSU5GTy0+U1RSRUFNLiAgUmV0dXJucyBsZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLCBpbiBieXRlcy4gICovCi0KLWludAotcHJpbnRfaW5zbl92YXggKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgY29uc3Qgc3RydWN0IHZvdCAqdm90cDsKLSAgY29uc3QgY2hhciAqYXJncCA9IE5VTEw7Ci0gIHVuc2lnbmVkIGNoYXIgKmFyZzsKLSAgc3RydWN0IHByaXZhdGUgcHJpdjsKLSAgYmZkX2J5dGUgKmJ1ZmZlciA9IHByaXYudGhlX2J1ZmZlcjsKLQotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSAmcHJpdjsKLSAgcHJpdi5tYXhfZmV0Y2hlZCA9IHByaXYudGhlX2J1ZmZlcjsKLSAgcHJpdi5pbnNuX3N0YXJ0ID0gbWVtYWRkcjsKLSAgaWYgKHNldGptcCAocHJpdi5iYWlsb3V0KSAhPSAwKQotICAgIHsKLSAgICAgIC8qIEVycm9yIHJldHVybi4gICovCi0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDIpOwotICBmb3IgKHZvdHAgPSAmdm90c3Ryc1swXTsgdm90cC0+bmFtZVswXTsgdm90cCsrKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHZheF9vcGNvZGVUIG9wY29kZSA9IHZvdHAtPmRldGFpbC5jb2RlOwotCi0gICAgICAvKiAyIGJ5dGUgY29kZXMgbWF0Y2ggMiBidWZmZXIgcG9zLiAqLwotICAgICAgaWYgKChiZmRfYnl0ZSkgb3Bjb2RlID09IGJ1ZmZlclswXQotCSAgJiYgKG9wY29kZSA+PiA4ID09IDAgfHwgb3Bjb2RlID4+IDggPT0gYnVmZmVyWzFdKSkKLQl7Ci0JICBhcmdwID0gdm90cC0+ZGV0YWlsLmFyZ3M7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBpZiAoYXJncCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEhhbmRsZSB1bmRlZmluZWQgaW5zdHJ1Y3Rpb25zLiAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIud29yZCAweCV4IiwKLQkJCSAgICAgKGJ1ZmZlclswXSA8PCA4KSArIGJ1ZmZlclsxXSk7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLSAgLyogUG9pbnQgYXQgZmlyc3QgYnl0ZSBvZiBhcmd1bWVudCBkYXRhLCBhbmQgYXQgZGVzY3JpcHRvciBmb3IgZmlyc3QKLSAgICAgYXJndW1lbnQuICAqLwotICBhcmcgPSBidWZmZXIgKyAoKHZvdHAtPmRldGFpbC5jb2RlID4+IDgpID8gMiA6IDEpOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGl0IGluIG1lbSAqLwotICBGRVRDSF9EQVRBIChpbmZvLCBhcmcpOwotCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCB2b3RwLT5uYW1lKTsKLSAgaWYgKCphcmdwKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCi0gIHdoaWxlICgqYXJncCkKLSAgICB7Ci0gICAgICBhcmcgKz0gcHJpbnRfaW5zbl9hcmcgKGFyZ3AsIGFyZywgbWVtYWRkciArIGFyZyAtIGJ1ZmZlciwgaW5mbyk7Ci0gICAgICBhcmdwICs9IDI7Ci0gICAgICBpZiAoKmFyZ3ApCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0gICAgfQotCi0gIHJldHVybiBhcmcgLSBidWZmZXI7Ci19Ci0KLS8qIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzICJlYXRlbiIgYnkgdGhlIG9wZXJhbmQsIG9yIHJldHVybiAtMSBpZiBhbgotICAgaW52YWxpZCBvcGVyYW5kIHdhcyBmb3VuZCwgb3IgLTIgaWYgYW4gb3Bjb2RlIHRhYmVsIGVycm9yIHdhcwotICAgZm91bmQuICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fYXJnIChkLCBwMCwgYWRkciwgaW5mbykKLSAgICAgY29uc3QgY2hhciAqZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcDA7Ci0gICAgIGJmZF92bWEgYWRkcjsJCS8qIFBDIGZvciB0aGlzIGFyZyB0byBiZSByZWxhdGl2ZSB0byAqLwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgYXJnX2xlbjsKLQotICAvKiBjaGVjayB2YWxpZGl0eSBvZiBhZGRyZXNzaW5nIGxlbmd0aCAqLwotICBzd2l0Y2ggKGRbMV0pCi0gICAgewotICAgIGNhc2UgJ2InIDogYXJnX2xlbiA9IDE7CWJyZWFrOwotICAgIGNhc2UgJ2QnIDogYXJnX2xlbiA9IDg7CWJyZWFrOwotICAgIGNhc2UgJ2YnIDogYXJnX2xlbiA9IDQ7CWJyZWFrOwotICAgIGNhc2UgJ2cnIDogYXJnX2xlbiA9IDg7CWJyZWFrOwotICAgIGNhc2UgJ2gnIDogYXJnX2xlbiA9IDE2OwlicmVhazsKLSAgICBjYXNlICdsJyA6IGFyZ19sZW4gPSA0OwlicmVhazsKLSAgICBjYXNlICdvJyA6IGFyZ19sZW4gPSAxNjsJYnJlYWs7Ci0gICAgY2FzZSAndycgOiBhcmdfbGVuID0gMjsJYnJlYWs7Ci0gICAgY2FzZSAncScgOiBhcmdfbGVuID0gODsJYnJlYWs7Ci0gICAgZGVmYXVsdCAgOiBhYm9ydCgpOwotICAgIH0KLQotICAvKiBicmFuY2hlcyBoYXZlIG5vIG1vZGUgYnl0ZSAqLwotICBpZiAoZFswXSA9PSAnYicpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqcCA9IHAwOwotCi0gICAgICBpZiAoYXJnX2xlbiA9PSAxKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciArIDEgKyBORVhUQllURSAocCksIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciArIDIgKyBORVhUV09SRCAocCksIGluZm8pOwotCi0gICAgICByZXR1cm4gcCAtIHAwOwotICAgIH0KLQotICByZXR1cm4gcHJpbnRfaW5zbl9tb2RlIChhcmdfbGVuLCBwMCwgYWRkciwgaW5mbyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fbW9kZSAoc2l6ZSwgcDAsIGFkZHIsIGluZm8pCi0gICAgIGludCBzaXplOwotICAgICB1bnNpZ25lZCBjaGFyICpwMDsKLSAgICAgYmZkX3ZtYSBhZGRyOwkJLyogUEMgZm9yIHRoaXMgYXJnIHRvIGJlIHJlbGF0aXZlIHRvICovCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnAgPSBwMDsKLSAgdW5zaWduZWQgY2hhciBtb2RlLCByZWc7Ci0KLSAgLyogZmV0Y2ggYW5kIGludGVycHJldCBtb2RlIGJ5dGUgKi8KLSAgbW9kZSA9ICh1bnNpZ25lZCBjaGFyKSBORVhUQllURSAocCk7Ci0gIHJlZyA9IG1vZGUgJiAweEY7Ci0gIHN3aXRjaCAobW9kZSAmIDB4RjApCi0gICAgewotICAgIGNhc2UgMHgwMDoKLSAgICBjYXNlIDB4MTA6Ci0gICAgY2FzZSAweDIwOgotICAgIGNhc2UgMHgzMDogLyogbGl0ZXJhbCBtb2RlCQkJJG51bWJlciAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkMHgleCIsIG1vZGUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDQwOiAvKiBpbmRleDoJCQliYXNlLWFkZHJbUm5dICovCi0gICAgICBwICs9IHByaW50X2luc25fbW9kZSAoc2l6ZSwgcDAgKyAxLCBhZGRyICsgMSwgaW5mbyk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlslc10iLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NTA6IC8qIHJlZ2lzdGVyOgkJCVJuICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDYwOiAvKiByZWdpc3RlciBkZWZlcnJlZDoJCShSbikgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCVzKSIsIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg3MDogLyogYXV0b2RlY3JlbWVudDoJCS0oUm4pICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0oJXMpIiwgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDgwOiAvKiBhdXRvaW5jcmVtZW50OgkJKFJuKSsgKi8KLSAgICAgIGlmIChyZWcgPT0gMHhGKQotCXsJLyogaW1tZWRpYXRlPyAqLwotCSAgaW50IGk7Ci0KLQkgIEZFVENIX0RBVEEgKGluZm8sIHAgKyBzaXplKTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJDB4Iik7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUwMngiLCBwW3NpemUgLSBpIC0gMV0pOwotCSAgcCArPSBzaXplOwotCX0KLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiglcykrIiwgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDkwOiAvKiBhdXRvaW5jcmVtZW50IGRlZmVycmVkOglAKFJuKSsgKi8KLSAgICAgIGlmIChyZWcgPT0gMHhGKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKjB4JXgiLCBORVhUTE9ORyAocCkpOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCglcykrIiwgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweEIwOiAvKiBkaXNwbGFjZW1lbnQgYnl0ZSBkZWZlcnJlZDoJKmRpc3BsKFJuKSAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIqIik7Ci0gICAgY2FzZSAweEEwOiAvKiBkaXNwbGFjZW1lbnQgYnl0ZToJCWRpc3BsKFJuKSAqLwotICAgICAgaWYgKHJlZyA9PSAweEYpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgMiArIE5FWFRCWVRFIChwKSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4KCVzKSIsIE5FWFRCWVRFIChwKSwKLQkJCSAgICAgICByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4RDA6IC8qIGRpc3BsYWNlbWVudCB3b3JkIGRlZmVycmVkOgkqZGlzcGwoUm4pICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIioiKTsKLSAgICBjYXNlIDB4QzA6IC8qIGRpc3BsYWNlbWVudCB3b3JkOgkJZGlzcGwoUm4pICovCi0gICAgICBpZiAocmVnID09IDB4RikKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyAzICsgTkVYVFdPUkQgKHApLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgoJXMpIiwgTkVYVFdPUkQgKHApLAotCQkJICAgICAgIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhGMDogLyogZGlzcGxhY2VtZW50IGxvbmcgZGVmZXJyZWQ6CSpkaXNwbChSbikgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKiIpOwotICAgIGNhc2UgMHhFMDogLyogZGlzcGxhY2VtZW50IGxvbmc6CQlkaXNwbChSbikgKi8KLSAgICAgIGlmIChyZWcgPT0gMHhGKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciArIDUgKyBORVhUTE9ORyAocCksIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCglcykiLCBORVhUTE9ORyAocCksCi0JCQkgICAgICAgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBwIC0gcDA7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3c2NS1kaXMuYyBiL29wY29kZXMvdzY1LWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTJlODk2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvdzY1LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIFdEQyA2NTgxNiBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBTVEFUSUNfVEFCTEUKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0KLSNpbmNsdWRlICJ3NjUtb3BjLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi1zdGF0aWMgICBmcHJpbnRmX2Z0eXBlIGZwcjsKLXN0YXRpYyAgIHZvaWQgKnN0cmVhbTsKLXN0YXRpYyAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICpsb2NhbF9pbmZvOwotI2lmIDAKLXN0YXRpYyBjaGFyICpsbmFtZVtdID0gIHsicjAiLCJyMSIsInIyIiwicjMiLCJyNCIsInI1IiwicjYiLCJyNyIsInMwIn07Ci0KLXN0YXRpYyBjaGFyICpmaW5kbmFtZSAodmFsKQotICAgICB1bnNpZ25lZCBpbnQgdmFsOwotewotICBpZiAodmFsID49IDB4MTAgJiYgdmFsIDw9IDB4MjApCi0gICAgcmV0dXJuIGxuYW1lWyh2YWwgLSAweDEwKSAvIDJdOwotICByZXR1cm4gMDsKLX0KLSNlbmRpZgotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmQgKGxvb2t1cCwgZm9ybWF0LCBhcmdzKQotICAgICBpbnQgbG9va3VwOwotICAgICBjaGFyICpmb3JtYXQ7Ci0gICAgIHVuc2lnbmVkICAgICBpbnQgKmFyZ3M7Ci17Ci0gIGludCB2YWw7Ci0gIGludCBjOwotCi0gIHdoaWxlICgqZm9ybWF0KQotICAgIHsKLSAgICAgIHN3aXRjaCAoIGMgPSAqZm9ybWF0KyspIAotCXsKLQljYXNlICckJzoKLQkgIHZhbCA9IGFyZ3NbKCpmb3JtYXQrKykgLSAnMCddOwotCSAgaWYgKGxvb2t1cCkgCi0JICAgIHsKLSNpZiAwCi0JICAgICAgbmFtZSA9IGZpbmRuYW1lKHZhbCk7Ci0JICAgICAgaWYgKG5hbWUpCi0JCWZwcihzdHJlYW0sICIlcyIsIG5hbWUpOwotCSAgICAgIGVsc2UKLSNlbmRpZgotCQlsb2NhbF9pbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKHZhbCwgbG9jYWxfaW5mbyk7ICAKLQkgICAgfQotCSAgZWxzZQotCSAgICBmcHIgKHN0cmVhbSwgIjB4JXgiLCB2YWwpOwotCi0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZnByKHN0cmVhbSwiJWMiLCBjKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci1pbnQgCi1wcmludF9pbnNuX3c2NShtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotCi0KLSAgaW50IHN0YXR1cyA9IDA7Ci0gIHVuc2lnbmVkIGNoYXIgaW5zbls0XTsKLSAgcmVnaXN0ZXIgc3RydWN0IG9waW5mbyAqb3A7Ci0gIGludCBpOwotICBpbnQgWCA9MDsKLSAgaW50IE0gPSAwOwotICBpbnQgYXJnc1syXTsKLXN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByID0gaW5mby0+ZnByaW50Zl9mdW5jOwotbG9jYWxfaW5mbyA9ICAgIGluZm87Ci0gIGZvciAoaSA9IDA7IGkgPDQgJiYgc3RhdHVzID09IDA7IGkrKykgCi0gICAgewotICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMobWVtYWRkcitpLCBpbnNuICsgaSwgMSwgaW5mbyk7Ci0gIH0KLQotCi0gIGZvciAob3AgPSBvcHRhYmxlOyBvcC0+dmFsICE9IGluc25bMF07IG9wKyspIAotICAgIDsKLQotICBmcHIoc3RyZWFtLCIlcyIsIG9wLT5uYW1lKTsKLSAgCi0gIC8qIFByZXBhcmUgYWxsIHRoZSBwb3NpYmxlIG9wZXJhbmQgdmFsdWVzICovCi0gIHsKLSAgICBpbnQgc2l6ZSA9IDE7Ci0gICAgaW50IGFzUl9XNjVfQUJTOCA9IGluc25bMV07Ci0gICAgaW50IGFzUl9XNjVfQUJTMTYgPSAoaW5zblsyXSA8PCA4KSArIGFzUl9XNjVfQUJTODsKLSAgICBpbnQgYXNSX1c2NV9BQlMyNCA9IChpbnNuWzNdIDw8IDE2KSArIGFzUl9XNjVfQUJTMTY7Ci0gICAgaW50IGFzUl9XNjVfUENSOCA9ICgoY2hhcikoYXNSX1c2NV9BQlM4KSkgKyBtZW1hZGRyICsgMjsKLSAgICBpbnQgYXNSX1c2NV9QQ1IxNiA9ICgoc2hvcnQpKGFzUl9XNjVfQUJTMTYpKSArIG1lbWFkZHIgKyAzOwotCi0gICAgc3dpdGNoIChvcC0+YW1vZGUpIHsKLSAgICAgIERJU0FTTSgpOwotICAgIH0KLQotICByZXR1cm4gc2l6ZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3c2NS1vcGMuaCBiL29wY29kZXMvdzY1LW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGMzNTM1Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvdzY1LW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLQkJCS8qIFdEQyA2NTgxNiBBc3NlbWJsZXIgb3Bjb2RlIHRhYmxlICovCi0JCQkvKiAgIChnZW5lcmF0ZWQgYnkgdGhlIHByb2dyYW0gc2ltL3c2NS9nZW5jb2RlIC1hKSAqLwotI2RlZmluZSBBRERSX0lNTVRPQSAgICAgICAgICAgICAgMQkgLyogI2EgICAgICAqLwotI2RlZmluZSBBRERSX0lNTUNPUCAgICAgICAgICAgICAgMgkgLyogI2MgICAgICAqLwotI2RlZmluZSBBRERSX0lNTVRPSSAgICAgICAgICAgICAgMwkgLyogI2kgICAgICAqLwotI2RlZmluZSBBRERSX0FDQyAgICAgICAgICAgICAgICAgNAkgLyogQSAgICAgICAqLwotI2RlZmluZSBBRERSX1BDX1JFTCAgICAgICAgICAgICAgNQkgLyogciAgICAgICAqLwotI2RlZmluZSBBRERSX1BDX1JFTF9MT05HICAgICAgICAgNgkgLyogcmwgICAgICAqLwotI2RlZmluZSBBRERSX0lNUExJRUQgICAgICAgICAgICAgNwkgLyogaSAgICAgICAqLwotI2RlZmluZSBBRERSX1NUQUNLICAgICAgICAgICAgICAgOAkgLyogcyAgICAgICAqLwotI2RlZmluZSBBRERSX0RJUiAgICAgICAgICAgICAgICAgOQkgLyogZCAgICAgICAqLwotI2RlZmluZSBBRERSX0RJUl9JRFhfWCAgICAgICAgICAgMTAJIC8qIGQseCAgICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSURYX1kgICAgICAgICAgIDExCSAvKiBkLHkgICAgICovCi0jZGVmaW5lIEFERFJfRElSX0lORCAgICAgICAgICAgICAxMgkgLyogKGQpICAgICAqLwotI2RlZmluZSBBRERSX0RJUl9JRFhfSU5EX1ggICAgICAgMTMJIC8qIChkLHgpICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSU5EX0lEWF9ZICAgICAgIDE0CSAvKiAoZCkseSAgICovCi0jZGVmaW5lIEFERFJfRElSX0lORF9MT05HICAgICAgICAxNQkgLyogW2RdICAgICAqLwotI2RlZmluZSBBRERSX0RJUl9JTkRfSURYX1lfTE9ORyAgMTYJIC8qIFtkXSx5ICAgKi8KLSNkZWZpbmUgQUREUl9BQlMgICAgICAgICAgICAgICAgIDE3CSAvKiBhICAgICAgICovCi0jZGVmaW5lIEFERFJfQUJTX0lEWF9YICAgICAgICAgICAxOAkgLyogYSx4ICAgICAqLwotI2RlZmluZSBBRERSX0FCU19JRFhfWSAgICAgICAgICAgMTkJIC8qIGEseSAgICAgKi8KLSNkZWZpbmUgQUREUl9BQlNfTE9ORyAgICAgICAgICAgIDIwCSAvKiBhbCAgICAgICovCi0jZGVmaW5lIEFERFJfQUJTX0lORF9MT05HICAgICAgICAyMQkgLyogW2FdICAgICAqLwotI2RlZmluZSBBRERSX0FCU19MT05HX0lEWF9YICAgICAgMjIJIC8qIGFsLHggICAgKi8KLSNkZWZpbmUgQUREUl9TVEFDS19SRUwgICAgICAgICAgIDIzCSAvKiBkLHMgICAgICovCi0jZGVmaW5lIEFERFJfU1RBQ0tfUkVMX0lORFhfSURYICAyNAkgLyogKGQscykseSAqLwotI2RlZmluZSBBRERSX0FCU19JTkQgICAgICAgICAgICAgMjUJIC8qIChhKSAgICAgKi8KLSNkZWZpbmUgQUREUl9BQlNfSU5EX0lEWCAgICAgICAgIDI2CSAvKiAoYSx4KSAgICovCi0jZGVmaW5lIEFERFJfQkxPQ0tfTU9WRSAgICAgICAgICAyNwkgLyogeHl6ICAgICAqLwotc3RydWN0IG9waW5mbyB7Ci0JaW50IHZhbDsKLQlpbnQgY29kZTsKLQljaGFyICpuYW1lOwotCWludCBhbW9kZTsKLX07Ci1zdHJ1Y3Qgb3BpbmZvIG9wdGFibGVbMjU3XT17Ci0jZGVmaW5lIE9fYWRjIDEKLSNkZWZpbmUgT19hbmQgMgotI2RlZmluZSBPX2FzbCAzCi0jZGVmaW5lIE9fYmNjIDQKLSNkZWZpbmUgT19iY3MgNQotI2RlZmluZSBPX2JlcSA2Ci0jZGVmaW5lIE9fYml0IDcKLSNkZWZpbmUgT19ibWkgOAotI2RlZmluZSBPX2JuZSA5Ci0jZGVmaW5lIE9fYnBsIDEwCi0jZGVmaW5lIE9fYnJhIDExCi0jZGVmaW5lIE9fYnJrIDEyCi0jZGVmaW5lIE9fYnJsIDEzCi0jZGVmaW5lIE9fYnZjIDE0Ci0jZGVmaW5lIE9fYnZzIDE1Ci0jZGVmaW5lIE9fY2xjIDE2Ci0jZGVmaW5lIE9fY2xkIDE3Ci0jZGVmaW5lIE9fY2xpIDE4Ci0jZGVmaW5lIE9fY2x2IDE5Ci0jZGVmaW5lIE9fY21wIDIwCi0jZGVmaW5lIE9fY29wIDIxCi0jZGVmaW5lIE9fY3B4IDIyCi0jZGVmaW5lIE9fY3B5IDIzCi0jZGVmaW5lIE9fZGVjIDI0Ci0jZGVmaW5lIE9fZGV4IDI1Ci0jZGVmaW5lIE9fZGV5IDI2Ci0jZGVmaW5lIE9fZW9yIDI3Ci0jZGVmaW5lIE9faW5jIDI4Ci0jZGVmaW5lIE9faW54IDI5Ci0jZGVmaW5lIE9faW55IDMwCi0jZGVmaW5lIE9fam1wIDMxCi0jZGVmaW5lIE9fanNyIDMyCi0jZGVmaW5lIE9fbGRhIDMzCi0jZGVmaW5lIE9fbGR4IDM0Ci0jZGVmaW5lIE9fbGR5IDM1Ci0jZGVmaW5lIE9fbHNyIDM2Ci0jZGVmaW5lIE9fbXZuIDM3Ci0jZGVmaW5lIE9fbXZwIDM4Ci0jZGVmaW5lIE9fbm9wIDM5Ci0jZGVmaW5lIE9fb3JhIDQwCi0jZGVmaW5lIE9fcGVhIDQxCi0jZGVmaW5lIE9fcGVpIDQyCi0jZGVmaW5lIE9fcGVyIDQzCi0jZGVmaW5lIE9fcGhhIDQ0Ci0jZGVmaW5lIE9fcGhiIDQ1Ci0jZGVmaW5lIE9fcGhkIDQ2Ci0jZGVmaW5lIE9fcGhrIDQ3Ci0jZGVmaW5lIE9fcGhwIDQ4Ci0jZGVmaW5lIE9fcGh4IDQ5Ci0jZGVmaW5lIE9fcGh5IDUwCi0jZGVmaW5lIE9fcGxhIDUxCi0jZGVmaW5lIE9fcGxiIDUyCi0jZGVmaW5lIE9fcGxkIDUzCi0jZGVmaW5lIE9fcGxwIDU0Ci0jZGVmaW5lIE9fcGx4IDU1Ci0jZGVmaW5lIE9fcGx5IDU2Ci0jZGVmaW5lIE9fcmVwIDU3Ci0jZGVmaW5lIE9fcm9sIDU4Ci0jZGVmaW5lIE9fcm9yIDU5Ci0jZGVmaW5lIE9fcnRpIDYwCi0jZGVmaW5lIE9fcnRsIDYxCi0jZGVmaW5lIE9fcnRzIDYyCi0jZGVmaW5lIE9fc2JjIDYzCi0jZGVmaW5lIE9fc2VjIDY0Ci0jZGVmaW5lIE9fc2VkIDY1Ci0jZGVmaW5lIE9fc2VpIDY2Ci0jZGVmaW5lIE9fc2VwIDY3Ci0jZGVmaW5lIE9fc3RhIDY4Ci0jZGVmaW5lIE9fc3RwIDY5Ci0jZGVmaW5lIE9fc3R4IDcwCi0jZGVmaW5lIE9fc3R5IDcxCi0jZGVmaW5lIE9fc3R6IDcyCi0jZGVmaW5lIE9fdGF4IDczCi0jZGVmaW5lIE9fdGF5IDc0Ci0jZGVmaW5lIE9fdGNkIDc1Ci0jZGVmaW5lIE9fdGNzIDc2Ci0jZGVmaW5lIE9fdGRjIDc3Ci0jZGVmaW5lIE9fdHJiIDc4Ci0jZGVmaW5lIE9fdHNiIDc5Ci0jZGVmaW5lIE9fdHNjIDgwCi0jZGVmaW5lIE9fdHN4IDgxCi0jZGVmaW5lIE9fdHhhIDgyCi0jZGVmaW5lIE9fdHhzIDgzCi0jZGVmaW5lIE9fdHh5IDg0Ci0jZGVmaW5lIE9fdHlhIDg1Ci0jZGVmaW5lIE9fdHl4IDg2Ci0jZGVmaW5lIE9fd2FpIDg3Ci0jZGVmaW5lIE9fd2RtIDg4Ci0jZGVmaW5lIE9feGJhIDg5Ci0jZGVmaW5lIE9feGNlIDkwCi0jaWZkZWYgREVGSU5FX1RBQkxFCi0JezB4NjksCU9fYWRjLAkiYWRjIiwJQUREUl9JTU1UT0F9LAotCXsweDcyLAlPX2FkYywJImFkYyIsCUFERFJfRElSX0lORH0sCi0JezB4NzEsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHg3MywJT19hZGMsCSJhZGMiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4NjEsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHg2NywJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4NzcsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweDZELAlPX2FkYywJImFkYyIsCUFERFJfQUJTfSwKLQl7MHg3RCwJT19hZGMsCSJhZGMiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4NzksCU9fYWRjLAkiYWRjIiwJQUREUl9BQlNfSURYX1l9LAotCXsweDZGLAlPX2FkYywJImFkYyIsCUFERFJfQUJTX0xPTkd9LAotCXsweDdGLAlPX2FkYywJImFkYyIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweDY1LAlPX2FkYywJImFkYyIsCUFERFJfRElSfSwKLQl7MHg2MywJT19hZGMsCSJhZGMiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4NzUsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDI5LAlPX2FuZCwJImFuZCIsCUFERFJfSU1NVE9BfSwKLQl7MHgzMiwJT19hbmQsCSJhbmQiLAlBRERSX0RJUl9JTkR9LAotCXsweDMxLAlPX2FuZCwJImFuZCIsCUFERFJfRElSX0lORF9JRFhfWX0sCi0JezB4MzMsCU9fYW5kLAkiYW5kIiwJQUREUl9TVEFDS19SRUxfSU5EWF9JRFh9LAotCXsweDIxLAlPX2FuZCwJImFuZCIsCUFERFJfRElSX0lEWF9JTkRfWH0sCi0JezB4MjcsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSU5EX0xPTkd9LAotCXsweDM3LAlPX2FuZCwJImFuZCIsCUFERFJfRElSX0lORF9JRFhfWV9MT05HfSwKLQl7MHgyRCwJT19hbmQsCSJhbmQiLAlBRERSX0FCU30sCi0JezB4M0QsCU9fYW5kLAkiYW5kIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDM5LAlPX2FuZCwJImFuZCIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHgyRiwJT19hbmQsCSJhbmQiLAlBRERSX0FCU19MT05HfSwKLQl7MHgzRiwJT19hbmQsCSJhbmQiLAlBRERSX0FCU19MT05HX0lEWF9YfSwKLQl7MHgyNSwJT19hbmQsCSJhbmQiLAlBRERSX0RJUn0sCi0JezB4MjMsCU9fYW5kLAkiYW5kIiwJQUREUl9TVEFDS19SRUx9LAotCXsweDM1LAlPX2FuZCwJImFuZCIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHgwQSwJT19hc2wsCSJhc2wiLAlBRERSX0FDQ30sCi0JezB4MEUsCU9fYXNsLAkiYXNsIiwJQUREUl9BQlN9LAotCXsweDFFLAlPX2FzbCwJImFzbCIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHgwNiwJT19hc2wsCSJhc2wiLAlBRERSX0RJUn0sCi0JezB4MTYsCU9fYXNsLAkiYXNsIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDkwLAlPX2JjYywJImJjYyIsCUFERFJfUENfUkVMfSwKLQl7MHhCMCwJT19iY3MsCSJiY3MiLAlBRERSX1BDX1JFTH0sCi0JezB4RjAsCU9fYmVxLAkiYmVxIiwJQUREUl9QQ19SRUx9LAotCXsweDg5LAlPX2JpdCwJImJpdCIsCUFERFJfSU1NVE9BfSwKLQl7MHgyNCwJT19iaXQsCSJiaXQiLAlBRERSX0RJUl9JTkR9LAotCXsweDM0LAlPX2JpdCwJImJpdCIsCUFERFJfRElSX0lEWF9JTkRfWH0sCi0JezB4MkMsCU9fYml0LAkiYml0IiwJQUREUl9BQlN9LAotCXsweDNDLAlPX2JpdCwJImJpdCIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHgzMCwJT19ibWksCSJibWkiLAlBRERSX1BDX1JFTH0sCi0JezB4RDAsCU9fYm5lLAkiYm5lIiwJQUREUl9QQ19SRUx9LAotCXsweDEwLAlPX2JwbCwJImJwbCIsCUFERFJfUENfUkVMfSwKLQl7MHg4MCwJT19icmEsCSJicmEiLAlBRERSX1BDX1JFTH0sCi0JezB4MDAsCU9fYnJrLAkiYnJrIiwJQUREUl9TVEFDS30sCi0JezB4ODIsCU9fYnJsLAkiYnJsIiwJQUREUl9QQ19SRUxfTE9OR30sCi0JezB4NTAsCU9fYnZjLAkiYnZjIiwJQUREUl9QQ19SRUx9LAotCXsweDcwLAlPX2J2cywJImJ2cyIsCUFERFJfUENfUkVMfSwKLQl7MHgxOCwJT19jbGMsCSJjbGMiLAlBRERSX0lNUExJRUR9LAotCXsweEQ4LAlPX2NsZCwJImNsZCIsCUFERFJfSU1QTElFRH0sCi0JezB4NTgsCU9fY2xpLAkiY2xpIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhCOCwJT19jbHYsCSJjbHYiLAlBRERSX0lNUExJRUR9LAotCXsweEM5LAlPX2NtcCwJImNtcCIsCUFERFJfSU1NVE9BfSwKLQl7MHhEMiwJT19jbXAsCSJjbXAiLAlBRERSX0RJUl9JTkR9LAotCXsweEQxLAlPX2NtcCwJImNtcCIsCUFERFJfRElSX0lORF9JRFhfWX0sCi0JezB4RDMsCU9fY21wLAkiY21wIiwJQUREUl9TVEFDS19SRUxfSU5EWF9JRFh9LAotCXsweEMxLAlPX2NtcCwJImNtcCIsCUFERFJfRElSX0lEWF9JTkRfWH0sCi0JezB4QzcsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSU5EX0xPTkd9LAotCXsweEQ3LAlPX2NtcCwJImNtcCIsCUFERFJfRElSX0lORF9JRFhfWV9MT05HfSwKLQl7MHhDRCwJT19jbXAsCSJjbXAiLAlBRERSX0FCU30sCi0JezB4REQsCU9fY21wLAkiY21wIiwJQUREUl9BQlNfSURYX1h9LAotCXsweEQ5LAlPX2NtcCwJImNtcCIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHhDRiwJT19jbXAsCSJjbXAiLAlBRERSX0FCU19MT05HfSwKLQl7MHhERiwJT19jbXAsCSJjbXAiLAlBRERSX0FCU19MT05HX0lEWF9YfSwKLQl7MHhDNSwJT19jbXAsCSJjbXAiLAlBRERSX0RJUn0sCi0JezB4QzMsCU9fY21wLAkiY21wIiwJQUREUl9TVEFDS19SRUx9LAotCXsweEQ1LAlPX2NtcCwJImNtcCIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHgwMiwJT19jb3AsCSJjb3AiLAlBRERSX0lNTUNPUH0sCi0JezB4RTAsCU9fY3B4LAkiY3B4IiwJQUREUl9JTU1UT0l9LAotCXsweEVDLAlPX2NweCwJImNweCIsCUFERFJfQUJTfSwKLQl7MHhFNCwJT19jcHgsCSJjcHgiLAlBRERSX0RJUn0sCi0JezB4QzAsCU9fY3B5LAkiY3B5IiwJQUREUl9JTU1UT0l9LAotCXsweENDLAlPX2NweSwJImNweSIsCUFERFJfQUJTfSwKLQl7MHhDNCwJT19jcHksCSJjcHkiLAlBRERSX0RJUn0sCi0JezB4M0EsCU9fZGVjLAkiZGVjIiwJQUREUl9BQ0N9LAotCXsweENFLAlPX2RlYywJImRlYyIsCUFERFJfQUJTfSwKLQl7MHhERSwJT19kZWMsCSJkZWMiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4QzYsCU9fZGVjLAkiZGVjIiwJQUREUl9ESVJ9LAotCXsweEQ2LAlPX2RlYywJImRlYyIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHhDQSwJT19kZXgsCSJkZXgiLAlBRERSX0lNUExJRUR9LAotCXsweDg4LAlPX2RleSwJImRleSIsCUFERFJfSU1QTElFRH0sCi0JezB4NDksCU9fZW9yLAkiZW9yIiwJQUREUl9JTU1UT0F9LAotCXsweDUyLAlPX2VvciwJImVvciIsCUFERFJfRElSX0lORH0sCi0JezB4NTEsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHg1MywJT19lb3IsCSJlb3IiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4NDEsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHg0NywJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4NTcsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweDRELAlPX2VvciwJImVvciIsCUFERFJfQUJTfSwKLQl7MHg1RCwJT19lb3IsCSJlb3IiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4NTksCU9fZW9yLAkiZW9yIiwJQUREUl9BQlNfSURYX1l9LAotCXsweDRGLAlPX2VvciwJImVvciIsCUFERFJfQUJTX0xPTkd9LAotCXsweDVGLAlPX2VvciwJImVvciIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweDQ1LAlPX2VvciwJImVvciIsCUFERFJfRElSfSwKLQl7MHg0MywJT19lb3IsCSJlb3IiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4NTUsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDFBLAlPX2luYywJImluYyIsCUFERFJfQUNDfSwKLQl7MHhFRSwJT19pbmMsCSJpbmMiLAlBRERSX0FCU30sCi0JezB4RkUsCU9faW5jLAkiaW5jIiwJQUREUl9BQlNfSURYX1h9LAotCXsweEU2LAlPX2luYywJImluYyIsCUFERFJfRElSfSwKLQl7MHhGNiwJT19pbmMsCSJpbmMiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4RTgsCU9faW54LAkiaW54IiwJQUREUl9JTVBMSUVEfSwKLQl7MHhDOCwJT19pbnksCSJpbnkiLAlBRERSX0lNUExJRUR9LAotCXsweDZDLAlPX2ptcCwJImptcCIsCUFERFJfQUJTX0lORH0sCi0JezB4N0MsCU9fam1wLAkiam1wIiwJQUREUl9BQlNfSU5EX0lEWH0sCi0JezB4REMsCU9fam1wLAkiam1wIiwJQUREUl9BQlNfSU5EX0xPTkd9LAotCXsweDRDLAlPX2ptcCwJImptcCIsCUFERFJfQUJTfSwKLQl7MHg1QywJT19qbXAsCSJqbXAiLAlBRERSX0FCU19MT05HfSwKLQl7MHhGQywJT19qc3IsCSJqc3IiLAlBRERSX0FCU19JTkRfSURYfSwKLQl7MHgyMCwJT19qc3IsCSJqc3IiLAlBRERSX0FCU30sCi0JezB4MjIsCU9fanNyLAkianNyIiwJQUREUl9BQlNfTE9OR30sCi0JezB4QTksCU9fbGRhLAkibGRhIiwJQUREUl9JTU1UT0F9LAotCXsweEIyLAlPX2xkYSwJImxkYSIsCUFERFJfRElSX0lORH0sCi0JezB4QjEsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHhCMywJT19sZGEsCSJsZGEiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4QTEsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHhBNywJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4QjcsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweEFELAlPX2xkYSwJImxkYSIsCUFERFJfQUJTfSwKLQl7MHhCRCwJT19sZGEsCSJsZGEiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4QjksCU9fbGRhLAkibGRhIiwJQUREUl9BQlNfSURYX1l9LAotCXsweEFGLAlPX2xkYSwJImxkYSIsCUFERFJfQUJTX0xPTkd9LAotCXsweEJGLAlPX2xkYSwJImxkYSIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweEE1LAlPX2xkYSwJImxkYSIsCUFERFJfRElSfSwKLQl7MHhBMywJT19sZGEsCSJsZGEiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4QjUsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJfSURYX1h9LAotCXsweEEyLAlPX2xkeCwJImxkeCIsCUFERFJfSU1NVE9JfSwKLQl7MHhBRSwJT19sZHgsCSJsZHgiLAlBRERSX0FCU30sCi0JezB4QkUsCU9fbGR4LAkibGR4IiwJQUREUl9BQlNfSURYX1l9LAotCXsweEE2LAlPX2xkeCwJImxkeCIsCUFERFJfRElSfSwKLQl7MHhCNiwJT19sZHgsCSJsZHgiLAlBRERSX0RJUl9JRFhfWX0sCi0JezB4QTAsCU9fbGR5LAkibGR5IiwJQUREUl9JTU1UT0l9LAotCXsweEFDLAlPX2xkeSwJImxkeSIsCUFERFJfQUJTfSwKLQl7MHhCQywJT19sZHksCSJsZHkiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4QTQsCU9fbGR5LAkibGR5IiwJQUREUl9ESVJ9LAotCXsweEI0LAlPX2xkeSwJImxkeSIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg0QSwJT19sc3IsCSJsc3IiLAlBRERSX0FDQ30sCi0JezB4NEUsCU9fbHNyLAkibHNyIiwJQUREUl9BQlN9LAotCXsweDVFLAlPX2xzciwJImxzciIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg0NiwJT19sc3IsCSJsc3IiLAlBRERSX0RJUn0sCi0JezB4NTYsCU9fbHNyLAkibHNyIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDU0LAlPX212biwJIm12biIsCUFERFJfQkxPQ0tfTU9WRX0sCi0JezB4NDQsCU9fbXZwLAkibXZwIiwJQUREUl9CTE9DS19NT1ZFfSwKLQl7MHhFQSwJT19ub3AsCSJub3AiLAlBRERSX0lNUExJRUR9LAotCXsweDA5LAlPX29yYSwJIm9yYSIsCUFERFJfSU1NVE9BfSwKLQl7MHgxMiwJT19vcmEsCSJvcmEiLAlBRERSX0RJUl9JTkR9LAotCXsweDExLAlPX29yYSwJIm9yYSIsCUFERFJfRElSX0lORF9JRFhfWX0sCi0JezB4MTMsCU9fb3JhLAkib3JhIiwJQUREUl9TVEFDS19SRUxfSU5EWF9JRFh9LAotCXsweDAxLAlPX29yYSwJIm9yYSIsCUFERFJfRElSX0lEWF9JTkRfWH0sCi0JezB4MDcsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSU5EX0xPTkd9LAotCXsweDE3LAlPX29yYSwJIm9yYSIsCUFERFJfRElSX0lORF9JRFhfWV9MT05HfSwKLQl7MHgwRCwJT19vcmEsCSJvcmEiLAlBRERSX0FCU30sCi0JezB4MUQsCU9fb3JhLAkib3JhIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDE5LAlPX29yYSwJIm9yYSIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHgwRiwJT19vcmEsCSJvcmEiLAlBRERSX0FCU19MT05HfSwKLQl7MHgxRiwJT19vcmEsCSJvcmEiLAlBRERSX0FCU19MT05HX0lEWF9YfSwKLQl7MHgwNSwJT19vcmEsCSJvcmEiLAlBRERSX0RJUn0sCi0JezB4MDMsCU9fb3JhLAkib3JhIiwJQUREUl9TVEFDS19SRUx9LAotCXsweDE1LAlPX29yYSwJIm9yYSIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHhGNCwJT19wZWEsCSJwZWEiLAlBRERSX0FCU30sCi0JezB4RDQsCU9fcGVpLAkicGVpIiwJQUREUl9ESVJ9LAotCXsweDYyLAlPX3BlciwJInBlciIsCUFERFJfUENfUkVMX0xPTkd9LAotCXsweDQ4LAlPX3BoYSwJInBoYSIsCUFERFJfU1RBQ0t9LAotCXsweDhCLAlPX3BoYiwJInBoYiIsCUFERFJfU1RBQ0t9LAotCXsweDBCLAlPX3BoZCwJInBoZCIsCUFERFJfU1RBQ0t9LAotCXsweDRCLAlPX3BoaywJInBoayIsCUFERFJfU1RBQ0t9LAotCXsweDA4LAlPX3BocCwJInBocCIsCUFERFJfU1RBQ0t9LAotCXsweERBLAlPX3BoeCwJInBoeCIsCUFERFJfU1RBQ0t9LAotCXsweDVBLAlPX3BoeSwJInBoeSIsCUFERFJfU1RBQ0t9LAotCXsweDY4LAlPX3BsYSwJInBsYSIsCUFERFJfU1RBQ0t9LAotCXsweEFCLAlPX3BsYiwJInBsYiIsCUFERFJfU1RBQ0t9LAotCXsweDJCLAlPX3BsZCwJInBsZCIsCUFERFJfU1RBQ0t9LAotCXsweDI4LAlPX3BscCwJInBscCIsCUFERFJfU1RBQ0t9LAotCXsweEZBLAlPX3BseCwJInBseCIsCUFERFJfU1RBQ0t9LAotCXsweDdBLAlPX3BseSwJInBseSIsCUFERFJfU1RBQ0t9LAotCXsweEMyLAlPX3JlcCwJInJlcCIsCUFERFJfSU1NQ09QfSwKLQl7MHgyQSwJT19yb2wsCSJyb2wiLAlBRERSX0FDQ30sCi0JezB4MkUsCU9fcm9sLAkicm9sIiwJQUREUl9BQlN9LAotCXsweDNFLAlPX3JvbCwJInJvbCIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHgyNiwJT19yb2wsCSJyb2wiLAlBRERSX0RJUn0sCi0JezB4MzYsCU9fcm9sLAkicm9sIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDZBLAlPX3JvciwJInJvciIsCUFERFJfQUNDfSwKLQl7MHg2RSwJT19yb3IsCSJyb3IiLAlBRERSX0FCU30sCi0JezB4N0UsCU9fcm9yLAkicm9yIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDY2LAlPX3JvciwJInJvciIsCUFERFJfRElSfSwKLQl7MHg3NiwJT19yb3IsCSJyb3IiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4NDAsCU9fcnRpLAkicnRpIiwJQUREUl9TVEFDS30sCi0JezB4NkIsCU9fcnRsLAkicnRsIiwJQUREUl9TVEFDS30sCi0JezB4NjAsCU9fcnRzLAkicnRzIiwJQUREUl9TVEFDS30sCi0JezB4RTksCU9fc2JjLAkic2JjIiwJQUREUl9JTU1UT0F9LAotCXsweEYyLAlPX3NiYywJInNiYyIsCUFERFJfRElSX0lORH0sCi0JezB4RjEsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHhGMywJT19zYmMsCSJzYmMiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4RTEsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHhFNywJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4RjcsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweEVELAlPX3NiYywJInNiYyIsCUFERFJfQUJTfSwKLQl7MHhGRCwJT19zYmMsCSJzYmMiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4RjksCU9fc2JjLAkic2JjIiwJQUREUl9BQlNfSURYX1l9LAotCXsweEVGLAlPX3NiYywJInNiYyIsCUFERFJfQUJTX0xPTkd9LAotCXsweEZGLAlPX3NiYywJInNiYyIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweEU1LAlPX3NiYywJInNiYyIsCUFERFJfRElSfSwKLQl7MHhFMywJT19zYmMsCSJzYmMiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4RjUsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDM4LAlPX3NlYywJInNlYyIsCUFERFJfSU1QTElFRH0sCi0JezB4RjgsCU9fc2VkLAkic2VkIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg3OCwJT19zZWksCSJzZWkiLAlBRERSX0lNUExJRUR9LAotCXsweEUyLAlPX3NlcCwJInNlcCIsCUFERFJfSU1NQ09QfSwKLQl7MHg5MiwJT19zdGEsCSJzdGEiLAlBRERSX0RJUl9JTkR9LAotCXsweDkxLAlPX3N0YSwJInN0YSIsCUFERFJfRElSX0lORF9JRFhfWX0sCi0JezB4OTMsCU9fc3RhLAkic3RhIiwJQUREUl9TVEFDS19SRUxfSU5EWF9JRFh9LAotCXsweDgxLAlPX3N0YSwJInN0YSIsCUFERFJfRElSX0lEWF9JTkRfWH0sCi0JezB4ODcsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSU5EX0xPTkd9LAotCXsweDk3LAlPX3N0YSwJInN0YSIsCUFERFJfRElSX0lORF9JRFhfWV9MT05HfSwKLQl7MHg4RCwJT19zdGEsCSJzdGEiLAlBRERSX0FCU30sCi0JezB4OUQsCU9fc3RhLAkic3RhIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDk5LAlPX3N0YSwJInN0YSIsCUFERFJfQUJTX0lEWF9ZfSwKLQl7MHg4RiwJT19zdGEsCSJzdGEiLAlBRERSX0FCU19MT05HfSwKLQl7MHg5RiwJT19zdGEsCSJzdGEiLAlBRERSX0FCU19MT05HX0lEWF9YfSwKLQl7MHg4NSwJT19zdGEsCSJzdGEiLAlBRERSX0RJUn0sCi0JezB4ODMsCU9fc3RhLAkic3RhIiwJQUREUl9TVEFDS19SRUx9LAotCXsweDk1LAlPX3N0YSwJInN0YSIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHhEQiwJT19zdHAsCSJzdHAiLAlBRERSX0lNUExJRUR9LAotCXsweDhFLAlPX3N0eCwJInN0eCIsCUFERFJfQUJTfSwKLQl7MHg4NiwJT19zdHgsCSJzdHgiLAlBRERSX0RJUn0sCi0JezB4OTYsCU9fc3R4LAkic3R4IiwJQUREUl9ESVJfSURYX1h9LAotCXsweDhDLAlPX3N0eSwJInN0eSIsCUFERFJfQUJTfSwKLQl7MHg4NCwJT19zdHksCSJzdHkiLAlBRERSX0RJUn0sCi0JezB4OTQsCU9fc3R5LAkic3R5IiwJQUREUl9ESVJfSURYX1h9LAotCXsweDlDLAlPX3N0eiwJInN0eiIsCUFERFJfQUJTfSwKLQl7MHg5RSwJT19zdHosCSJzdHoiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4NjQsCU9fc3R6LAkic3R6IiwJQUREUl9ESVJ9LAotCXsweDc0LAlPX3N0eiwJInN0eiIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHhBQSwJT190YXgsCSJ0YXgiLAlBRERSX0lNUExJRUR9LAotCXsweEE4LAlPX3RheSwJInRheSIsCUFERFJfSU1QTElFRH0sCi0JezB4NUIsCU9fdGNkLAkidGNkIiwJQUREUl9JTVBMSUVEfSwKLQl7MHgxQiwJT190Y3MsCSJ0Y3MiLAlBRERSX0lNUExJRUR9LAotCXsweDdCLAlPX3RkYywJInRkYyIsCUFERFJfSU1QTElFRH0sCi0JezB4MUMsCU9fdHJiLAkidHJiIiwJQUREUl9BQlN9LAotCXsweDE0LAlPX3RyYiwJInRyYiIsCUFERFJfRElSfSwKLQl7MHgwQywJT190c2IsCSJ0c2IiLAlBRERSX0FCU30sCi0JezB4MDQsCU9fdHNiLAkidHNiIiwJQUREUl9ESVJ9LAotCXsweDNCLAlPX3RzYywJInRzYyIsCUFERFJfSU1QTElFRH0sCi0JezB4QkEsCU9fdHN4LAkidHN4IiwJQUREUl9JTVBMSUVEfSwKLQl7MHg4QSwJT190eGEsCSJ0eGEiLAlBRERSX0lNUExJRUR9LAotCXsweDlBLAlPX3R4cywJInR4cyIsCUFERFJfSU1QTElFRH0sCi0JezB4OUIsCU9fdHh5LAkidHh5IiwJQUREUl9JTVBMSUVEfSwKLQl7MHg5OCwJT190eWEsCSJ0eWEiLAlBRERSX0lNUExJRUR9LAotCXsweEJCLAlPX3R5eCwJInR5eCIsCUFERFJfSU1QTElFRH0sCi0JezB4Q0IsCU9fd2FpLAkid2FpIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg0MiwJT193ZG0sCSJ3ZG0iLAlBRERSX0lNUExJRUR9LAotCXsweEVCLAlPX3hiYSwJInhiYSIsCUFERFJfSU1QTElFRH0sCi0JezB4RkIsCU9feGNlLAkieGNlIiwJQUREUl9JTVBMSUVEfSwKLQl7IDAgfQotfTsKLSNlbmRpZgotI2RlZmluZSBESVNBU00oKVwKLSAgY2FzZSBBRERSX0lNTVRPQTpcCi0JYXJnc1swXSA9IE09PTAgPyBhc1JfVzY1X0FCUzE2IDogYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSMkMCIsIGFyZ3MpO1wKLQlzaXplICs9IE09PTAgPyAyOjE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0lNTUNPUDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMCwgIgkjJDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9JTU1UT0k6XAotCWFyZ3NbMF0gPSBYPT0wID8gYXNSX1c2NV9BQlMxNiA6IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMCwgIgkjJDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSBYPT0wID8gMjoxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQ0M6XAotCXByaW50X29wZXJhbmQgKDAsICIJYSIsIDApO1wKLQlzaXplICs9IDA7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX1BDX1JFTDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfUENSODtcCi0JcHJpbnRfb3BlcmFuZCAoMCwgIgkkMCIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX1BDX1JFTF9MT05HOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9QQ1IxNjtcCi0JcHJpbnRfb3BlcmFuZCAoMCwgIgkkMCIsIGFyZ3MpO1wKLQlzaXplICs9IDI7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0lNUExJRUQ6XAotCQlzaXplICs9IDA7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX1NUQUNLOlwKLQkJc2l6ZSArPSAwO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVI6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJPCQwIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSX0lEWF9YOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCTwkMCx4IiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSX0lEWF9ZOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCTwkMCx5IiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSX0lORDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkoPCQwKSIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUl9JRFhfSU5EX1g6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJKDwkMCx4KSIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUl9JTkRfSURYX1k6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJKDwkMCkseSIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUl9JTkRfTE9ORzpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIglbJDBdIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSX0lORF9JRFhfWV9MT05HOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCVskMF0seSIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FCUzpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTMTY7XAotCXByaW50X29wZXJhbmQgKDEsICIJISQwIiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0lEWF9YOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkhJDAseCIsIGFyZ3MpO1wKLQlzaXplICs9IDI7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FCU19JRFhfWTpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTMTY7XAotCXByaW50X29wZXJhbmQgKDEsICIJISQwLHkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfTE9ORzpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTMjQ7XAotCXByaW50X29wZXJhbmQgKDEsICIJPiQwIiwgYXJncyk7XAotCXNpemUgKz0gMztcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0lORF9MT05HOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIglbPiQwXSIsIGFyZ3MpO1wKLQlzaXplICs9IDI7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FCU19MT05HX0lEWF9YOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMyNDtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgk+JDAseCIsIGFyZ3MpO1wKLQlzaXplICs9IDM7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX1NUQUNLX1JFTDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMCwgIgkkMCxzIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfU1RBQ0tfUkVMX0lORFhfSURYOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSgkMCxzKSx5IiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0lORDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTMTY7XAotCXByaW50X29wZXJhbmQgKDEsICIJKCQwKSIsIGFyZ3MpO1wKLQlzaXplICs9IDI7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FCU19JTkRfSURYOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkoJDAseCkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9CTE9DS19NT1ZFOlwKLQlhcmdzWzBdID0gKGFzUl9XNjVfQUJTMTYgPj44KSAmMHhmZjtcCi0JYXJnc1sxXSA9ICggYXNSX1c2NV9BQlMxNiAmIDB4ZmYpO1wKLQlwcmludF9vcGVyYW5kICgwLCIJJDAsJDEiLGFyZ3MpO1wKLQlzaXplICs9IDI7XAotCWJyZWFrO1wKLQotI2RlZmluZSBHRVRJTkZPKHNpemUsdHlwZSxwY3JlbClcCi0JY2FzZSBBRERSX0lNTVRPQTogc2l6ZSA9IE09PTAgPyAyOjE7dHlwZT1NPT0wID8gUl9XNjVfQUJTMTYgOiBSX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9JTU1DT1A6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfSU1NVE9JOiBzaXplID0gWD09MCA/IDI6MTt0eXBlPVg9PTAgPyBSX1c2NV9BQlMxNiA6IFJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FDQzogc2l6ZSA9IDA7dHlwZT0tMTtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfUENfUkVMOiBzaXplID0gMTt0eXBlPVJfVzY1X1BDUjg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX1BDX1JFTF9MT05HOiBzaXplID0gMjt0eXBlPVJfVzY1X1BDUjE2O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9JTVBMSUVEOiBzaXplID0gMDt0eXBlPS0xO3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9TVEFDSzogc2l6ZSA9IDA7dHlwZT0tMTtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUl9JRFhfWDogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSURYX1k6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lORDogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSURYX0lORF9YOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUl9JTkRfSURYX1k6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lORF9MT05HOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUl9JTkRfSURYX1lfTE9ORzogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQlM6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19JRFhfWDogc2l6ZSA9IDI7dHlwZT1SX1c2NV9BQlMxNjtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTX0lEWF9ZOiBzaXplID0gMjt0eXBlPVJfVzY1X0FCUzE2O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQlNfTE9ORzogc2l6ZSA9IDM7dHlwZT1SX1c2NV9BQlMyNDtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTX0lORF9MT05HOiBzaXplID0gMjt0eXBlPVJfVzY1X0FCUzE2O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQlNfTE9OR19JRFhfWDogc2l6ZSA9IDM7dHlwZT1SX1c2NV9BQlMyNDtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfU1RBQ0tfUkVMOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX1NUQUNLX1JFTF9JTkRYX0lEWDogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQlNfSU5EOiBzaXplID0gMjt0eXBlPVJfVzY1X0FCUzE2O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQlNfSU5EX0lEWDogc2l6ZSA9IDI7dHlwZT1SX1c2NV9BQlMxNjtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQkxPQ0tfTU9WRTogc2l6ZSA9IDI7dHlwZT0tMTtwY3JlbD0wO2JyZWFrO1wKLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy96OGstZGlzLmMgYi9vcGNvZGVzL3o4ay1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyMzYyMi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3o4ay1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSB6ODAwMCBjb2RlLgotICAgQ29weXJpZ2h0IDE5OTIsIDE5OTMsIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgIno4ay1vcGMuaCIKLQotDAotI2luY2x1ZGUgPHNldGptcC5oPgotCi0MCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUaGVzZSBhcmUgYWxsIGluZGV4ZWQgYnkgbmliYmxlIG51bWJlciAoaS5lIG9ubHkgZXZlcnkgb3RoZXIgZW50cnkKLSAgICAgb2YgYnl0ZXMgaXMgdXNlZCwgYW5kIGV2ZXJ5IDR0aCBlbnRyeSBvZiB3b3JkcykuICAqLwotICB1bnNpZ25lZCBjaGFyIG5pYmJsZXNbMjRdOwotICB1bnNpZ25lZCBjaGFyIGJ5dGVzWzI0XTsKLSAgdW5zaWduZWQgc2hvcnQgd29yZHNbMjRdOwotCi0gIC8qIE5pYmJsZSBudW1iZXIgb2YgZmlyc3Qgd29yZCBub3QgeWV0IGZldGNoZWQuICAqLwotICBpbnQgbWF4X2ZldGNoZWQ7Ci0gIGJmZF92bWEgaW5zbl9zdGFydDsKLSAgam1wX2J1ZiBiYWlsb3V0OwotCi0gIGxvbmcgdGFibF9pbmRleDsKLSAgY2hhciBpbnN0cl9hc21zcmNbODBdOwotICB1bnNpZ25lZCBsb25nIGFyZ19yZWdbMHgwZl07Ci0gIHVuc2lnbmVkIGxvbmcgaW1tZWRpYXRlOwotICB1bnNpZ25lZCBsb25nIGRpc3BsYWNlbWVudDsKLSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotICB1bnNpZ25lZCBsb25nIGNvbmRfY29kZTsKLSAgdW5zaWduZWQgbG9uZyBjdHJsX2NvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gIHVuc2lnbmVkIGxvbmcgaW50ZXJydXB0czsKLX0KLWluc3RyX2RhdGFfczsKLQotLyogTWFrZSBzdXJlIHRoYXQgYnl0ZXMgZnJvbSBJTkZPLT5QUklWQVRFX0RBVEEtPkJVRkZFUiAoaW5jbHVzaXZlKQotICAgdG8gQUREUiAoZXhjbHVzaXZlKSBhcmUgdmFsaWQuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIGxvbmdqbXBzCi0gICBvbiBlcnJvci4gICovCi0jZGVmaW5lIEZFVENIX0RBVEEoaW5mbywgbmliYmxlKSBcCi0gICgobmliYmxlKSA8ICgoaW5zdHJfZGF0YV9zICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCi0gICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChuaWJibGUpKSkKLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSAoaW5mbywgbmliYmxlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IG5pYmJsZTsKLXsKLSAgdW5zaWduZWQgY2hhciBteWJ1ZlsyMF07Ci0gIGludCBzdGF0dXM7Ci0gIGluc3RyX2RhdGFfcyAqcHJpdiA9IChpbnN0cl9kYXRhX3MgKilpbmZvLT5wcml2YXRlX2RhdGE7Ci0KLSAgaWYgKChuaWJibGUgJSA0KSAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHByaXYtPmluc25fc3RhcnQsCi0JCQkJICAgICAgKGJmZF9ieXRlICopIG15YnVmLAotCQkJCSAgICAgIG5pYmJsZSAvIDIsCi0JCQkJICAgICAgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwcml2LT5pbnNuX3N0YXJ0LCBpbmZvKTsKLSAgICAgIGxvbmdqbXAgKHByaXYtPmJhaWxvdXQsIDEpOwotICAgIH0KLQotICB7Ci0gICAgaW50IGk7Ci0gICAgdW5zaWduZWQgY2hhciAqcCA9IG15YnVmIDsKLSAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmliYmxlOykKLSAgICAgIHsKLQlwcml2LT53b3Jkc1tpXSA9IChwWzBdIDw8IDgpIHwgcFsxXTsKLQkKLQlwcml2LT5ieXRlc1tpXSA9ICpwOwotCXByaXYtPm5pYmJsZXNbaSsrXSA9ICpwID4+IDQ7Ci0JcHJpdi0+bmliYmxlc1tpKytdID0gKnAgJjB4ZjsKLQotCSsrcDsKLQlwcml2LT5ieXRlc1tpXSA9ICpwOwotCXByaXYtPm5pYmJsZXNbaSsrXSA9ICpwID4+IDQ7Ci0JcHJpdi0+bmliYmxlc1tpKytdID0gKnAgJiAweGY7Ci0KLQkrK3A7Ci0gICAgICB9Ci0gIH0KLSAgcHJpdi0+bWF4X2ZldGNoZWQgPSBuaWJibGU7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY2hhciAqY29kZXNbMTZdID0KLXsKLSAgImYiLAotICAibHQiLAotICAibGUiLAotICAidWxlIiwKLSAgIm92L3BlIiwKLSAgIm1pIiwKLSAgImVxIiwKLSAgImMvdWx0IiwKLSAgInQiLAotICAiZ2UiLAotICAiZ3QiLAotICAidWd0IiwKLSAgIm5vdi9wbyIsCi0gICJwbCIsCi0gICJuZSIsCi0gICJuYy91Z2UiCi19OwotCi1pbnQgejhrX2xvb2t1cF9pbnN0ciBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyKiwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCBvdXRwdXRfaW5zdHIKLSAgUEFSQU1TICgoaW5zdHJfZGF0YV9zICosIHVuc2lnbmVkIGxvbmcsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIHZvaWQgdW5wYWNrX2luc3RyIFBBUkFNUyAoKGluc3RyX2RhdGFfcyAqLCBpbnQsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIHZvaWQgdW5wYXJzZV9pbnN0ciBQQVJBTVMgKChpbnN0cl9kYXRhX3MgKikpOwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX3o4ayAoYWRkciwgaW5mbywgaXNfc2VnbWVudGVkKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGludCBpc19zZWdtZW50ZWQ7Ci17Ci0gIGluc3RyX2RhdGFfcyBpbnN0cl9kYXRhOwotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICZpbnN0cl9kYXRhOwotICBpbnN0cl9kYXRhLm1heF9mZXRjaGVkID0gMDsKLSAgaW5zdHJfZGF0YS5pbnNuX3N0YXJ0ID0gYWRkcjsKLSAgaWYgKHNldGptcCAoaW5zdHJfZGF0YS5iYWlsb3V0KSAhPSAwKQotICAgIC8qIEVycm9yIHJldHVybi4gICovCi0gICAgcmV0dXJuIC0xOwotCi0gIGluc3RyX2RhdGEudGFibF9pbmRleCA9IHo4a19sb29rdXBfaW5zdHIgKGluc3RyX2RhdGEubmliYmxlcywgaW5mbyk7Ci0gIGlmIChpbnN0cl9kYXRhLnRhYmxfaW5kZXggPiAwKQotICAgIHsKLSAgICAgIHVucGFja19pbnN0ciAoJmluc3RyX2RhdGEsIGlzX3NlZ21lbnRlZCwgaW5mbyk7Ci0gICAgICB1bnBhcnNlX2luc3RyICgmaW5zdHJfZGF0YSk7Ci0gICAgICBvdXRwdXRfaW5zdHIgKCZpbnN0cl9kYXRhLCBhZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiB6OGtfdGFibGVbaW5zdHJfZGF0YS50YWJsX2luZGV4XS5sZW5ndGg7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgNCk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi53b3JkICUwMnglMDJ4IiwKLQkJCSAgICAgaW5zdHJfZGF0YS5ieXRlc1swXSwgaW5zdHJfZGF0YS5ieXRlc1syXSk7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci19Ci0KLWludAotcHJpbnRfaW5zbl96ODAwMSAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbl96OGsgKGFkZHIsIGluZm8sIDEpOwotfQotCi1pbnQKLXByaW50X2luc25fejgwMDIgKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIHByaW50X2luc25fejhrIChhZGRyLCBpbmZvLCAwKTsKLX0KLQotaW50Ci16OGtfbG9va3VwX2luc3RyIChuaWJibGVzLCBpbmZvKQotICAgICB1bnNpZ25lZCBjaGFyICpuaWJibGVzOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotCi0gIGludCBuaWJsX2luZGV4LCB0YWJsX2luZGV4OwotICBpbnQgbmlibF9tYXRjaGVkOwotICB1bnNpZ25lZCBzaG9ydCBpbnN0cl9uaWJsOwotICB1bnNpZ25lZCBzaG9ydCB0YWJsX2RhdHVtLCBkYXR1bV9jbGFzcywgZGF0dW1fdmFsdWU7Ci0KLSAgbmlibF9tYXRjaGVkID0gMDsKLSAgdGFibF9pbmRleCA9IDA7Ci0gIHdoaWxlICghbmlibF9tYXRjaGVkICYmIHo4a190YWJsZVt0YWJsX2luZGV4XS5uYW1lKQotICAgIHsKLSAgICAgIG5pYmxfbWF0Y2hlZCA9IDE7Ci0gICAgICBmb3IgKG5pYmxfaW5kZXggPSAwOyBuaWJsX2luZGV4IDwgejhrX3RhYmxlW3RhYmxfaW5kZXhdLmxlbmd0aCAqIDIgJiYgbmlibF9tYXRjaGVkOyBuaWJsX2luZGV4KyspCi0JewotCSAgaWYgKChuaWJsX2luZGV4ICUgNCkgPT0gMCkKLQkgICAgLyogRmV0Y2ggb25lIHdvcmQgYXQgYSB0aW1lLiAgKi8KLQkgICAgRkVUQ0hfREFUQSAoaW5mbywgbmlibF9pbmRleCArIDQpOwotCSAgaW5zdHJfbmlibCA9IG5pYmJsZXNbbmlibF9pbmRleF07Ci0KLQkgIHRhYmxfZGF0dW0gPSB6OGtfdGFibGVbdGFibF9pbmRleF0uYnl0ZV9pbmZvW25pYmxfaW5kZXhdOwotCSAgZGF0dW1fY2xhc3MgPSB0YWJsX2RhdHVtICYgQ0xBU1NfTUFTSzsKLQkgIGRhdHVtX3ZhbHVlID0gfkNMQVNTX01BU0sgJiB0YWJsX2RhdHVtOwotCi0JICBzd2l0Y2ggKGRhdHVtX2NsYXNzKQotCSAgICB7Ci0JICAgIGNhc2UgQ0xBU1NfQklUOgotCSAgICAgIGlmIChkYXR1bV92YWx1ZSAhPSBpbnN0cl9uaWJsKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTXzAwSUk6Ci0JICAgICAgaWYgKCEoKH5pbnN0cl9uaWJsKSAmIDB4NCkpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfMDFJSToKLQkgICAgICBpZiAoIShpbnN0cl9uaWJsICYgMHg0KSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU18wQ0NDOgotCSAgICAgIGlmICghKCh+aW5zdHJfbmlibCkgJiAweDgpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTXzFDQ0M6Ci0JICAgICAgaWYgKCEoaW5zdHJfbmlibCAmIDB4OCkpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfMERJU1A3OgotCSAgICAgIGlmICghKCh+aW5zdHJfbmlibCkgJiAweDgpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIG5pYmxfaW5kZXggKz0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU18xRElTUDc6Ci0JICAgICAgaWYgKCEoaW5zdHJfbmlibCAmIDB4OCkpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgbmlibF9pbmRleCArPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTX1JFR04wOgotCSAgICAgIGlmIChpbnN0cl9uaWJsID09IDApCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfQklUXzFPUjI6Ci0JICAgICAgaWYgKChpbnN0cl9uaWJsIHwgMHgyKSAhPSAoZGF0dW1fdmFsdWUgfCAweDIpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKG5pYmxfbWF0Y2hlZCkKLQl7Ci0JICByZXR1cm4gdGFibF9pbmRleDsKLQl9Ci0KLSAgICAgIHRhYmxfaW5kZXgrKzsKLSAgICB9Ci0gIHJldHVybiAtMTsKLQotfQotCi1zdGF0aWMgdm9pZAotb3V0cHV0X2luc3RyIChpbnN0cl9kYXRhLCBhZGRyLCBpbmZvKQotICAgICBpbnN0cl9kYXRhX3MgKmluc3RyX2RhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGxvb3AsIGxvb3BfbGltaXQ7Ci0gIGNoYXIgdG1wX3N0clsyMF07Ci0gIGNoYXIgb3V0X3N0clsxMDBdOwotCi0gIHN0cmNweSAob3V0X3N0ciwgIlx0Iik7Ci0KLSAgbG9vcF9saW1pdCA9IHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5sZW5ndGggKiAyOwotICBGRVRDSF9EQVRBIChpbmZvLCBsb29wX2xpbWl0KTsKLSAgZm9yIChsb29wID0gMDsgbG9vcCA8IGxvb3BfbGltaXQ7IGxvb3ArKykKLSAgICB7Ci0gICAgICBzcHJpbnRmICh0bXBfc3RyLCAiJXgiLCBpbnN0cl9kYXRhLT5uaWJibGVzW2xvb3BdKTsKLSAgICAgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0gICAgfQotCi0gIHdoaWxlIChsb29wKysgPCA4KQotICAgIHsKLSAgICAgIHN0cmNhdCAob3V0X3N0ciwgIiAiKTsKLSAgICB9Ci0KLSAgc3RyY2F0IChvdXRfc3RyLCBpbnN0cl9kYXRhLT5pbnN0cl9hc21zcmMpOwotCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvdXRfc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXVucGFja19pbnN0ciAoaW5zdHJfZGF0YSwgaXNfc2VnbWVudGVkLCBpbmZvKQotICAgICBpbnN0cl9kYXRhX3MgKmluc3RyX2RhdGE7Ci0gICAgIGludCBpc19zZWdtZW50ZWQ7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBuaWJsX2NvdW50LCBsb29wOwotICB1bnNpZ25lZCBzaG9ydCBpbnN0cl9uaWJsLCBpbnN0cl9ieXRlLCBpbnN0cl93b3JkOwotICBsb25nIGluc3RyX2xvbmc7Ci0gIHVuc2lnbmVkIHNob3J0IHRhYmxfZGF0dW0sIGRhdHVtX2NsYXNzLCBkYXR1bV92YWx1ZTsKLQotICBuaWJsX2NvdW50ID0gMDsKLSAgbG9vcCA9IDA7Ci0gIHdoaWxlICh6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0uYnl0ZV9pbmZvW2xvb3BdICE9IDApCi0gICAgewotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgbmlibF9jb3VudCArIDQgLSAobmlibF9jb3VudCAlIDQpKTsKLSAgICAgIGluc3RyX25pYmwgPSBpbnN0cl9kYXRhLT5uaWJibGVzW25pYmxfY291bnRdOwotICAgICAgaW5zdHJfYnl0ZSA9IGluc3RyX2RhdGEtPmJ5dGVzW25pYmxfY291bnRdOwotICAgICAgaW5zdHJfd29yZCA9IGluc3RyX2RhdGEtPndvcmRzW25pYmxfY291bnRdOwotCi0gICAgICB0YWJsX2RhdHVtID0gejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLmJ5dGVfaW5mb1tsb29wXTsKLSAgICAgIGRhdHVtX2NsYXNzID0gdGFibF9kYXR1bSAmIENMQVNTX01BU0s7Ci0gICAgICBkYXR1bV92YWx1ZSA9IHRhYmxfZGF0dW0gJiB+Q0xBU1NfTUFTSzsKLQotICAgICAgc3dpdGNoIChkYXR1bV9jbGFzcykKLQl7Ci0JY2FzZSBDTEFTU19YOgotCSAgaW5zdHJfZGF0YS0+YWRkcmVzcyA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0JBOgotCSAgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50ID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQlg6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RJU1A6Ci0JICBzd2l0Y2ggKGRhdHVtX3ZhbHVlKQotCSAgICB7Ci0JICAgIGNhc2UgQVJHX0RJU1AxNjoKLQkgICAgICBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQgPSBpbnN0cl93b3JkOwotCSAgICAgIG5pYmxfY291bnQgKz0gMzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfRElTUDEyOgotCSAgICAgIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCA9IGluc3RyX3dvcmQgJiAweDBmZmY7Ci0JICAgICAgbmlibF9jb3VudCArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0lNTToKLQkgIHN3aXRjaCAoZGF0dW1fdmFsdWUpCi0JICAgIHsKLQkgICAgY2FzZSBBUkdfSU1NNDoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl9uaWJsOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19OSU04OgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9ICgtaW5zdHJfYnl0ZSk7Ci0JICAgICAgbmlibF9jb3VudCArPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU04OgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX2J5dGU7Ci0JICAgICAgbmlibF9jb3VudCArPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU0xNjoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl93b3JkOwotCSAgICAgIG5pYmxfY291bnQgKz0gMzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NMzI6Ci0JICAgICAgRkVUQ0hfREFUQSAoaW5mbywgbmlibF9jb3VudCArIDgpOwotCSAgICAgIGluc3RyX2xvbmcgPSAoaW5zdHJfZGF0YS0+d29yZHNbbmlibF9jb3VudF0gPDwgMTYpCi0JCXwgKGluc3RyX2RhdGEtPndvcmRzW25pYmxfY291bnQgKyA0XSk7Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfbG9uZzsKLQkgICAgICBuaWJsX2NvdW50ICs9IDc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTU46Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfbmlibCAtIDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTTRNMToKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl9uaWJsICsgMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NXzE6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NXzI6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NMjoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl9uaWJsICYgMHgzOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0NDOgotCSAgaW5zdHJfZGF0YS0+Y29uZF9jb2RlID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQ1RSTDoKLQkgIGluc3RyX2RhdGEtPmN0cmxfY29kZSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RBOgotCWNhc2UgQ0xBU1NfQUREUkVTUzoKLQkgIGlmIChpc19zZWdtZW50ZWQpCi0JICAgIHsKLQkgICAgICBpZiAoaW5zdHJfbmlibCAmIDB4OCkKLQkJewotCQkgIEZFVENIX0RBVEEgKGluZm8sIG5pYmxfY291bnQgKyA4KTsKLQkJICBpbnN0cl9sb25nID0gKGluc3RyX2RhdGEtPndvcmRzW25pYmxfY291bnRdIDw8IDE2KQotCQkgICAgfCAoaW5zdHJfZGF0YS0+d29yZHNbbmlibF9jb3VudCArIDRdKTsKLQkJICBpbnN0cl9kYXRhLT5hZGRyZXNzID0gKChpbnN0cl93b3JkICYgMHg3ZjAwKSA8PCA4KSArCi0JCSAgICAoaW5zdHJfbG9uZyAmIDB4ZmZmZik7Ci0JCSAgbmlibF9jb3VudCArPSA3OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW5zdHJfZGF0YS0+YWRkcmVzcyA9ICgoaW5zdHJfd29yZCAmIDB4N2YwMCkgPDwgOCkgKwotCQkgICAgKGluc3RyX3dvcmQgJiAweDAwZmYpOwotCQkgIG5pYmxfY291bnQgKz0gMzsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnN0cl9kYXRhLT5hZGRyZXNzID0gaW5zdHJfd29yZDsKLQkgICAgICBuaWJsX2NvdW50ICs9IDM7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfMENDQzoKLQkgIGluc3RyX2RhdGEtPmNvbmRfY29kZSA9IGluc3RyX25pYmwgJiAweDc7Ci0JICBicmVhazsKLQljYXNlIENMQVNTXzFDQ0M6Ci0JICBpbnN0cl9kYXRhLT5jb25kX2NvZGUgPSBpbnN0cl9uaWJsICYgMHg3OwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU18wRElTUDc6Ci0JICBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQgPSBpbnN0cl9ieXRlICYgMHg3ZjsKLQkgIG5pYmxfY291bnQgKz0gMTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfMURJU1A3OgotCSAgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50ID0gaW5zdHJfYnl0ZSAmIDB4N2Y7Ci0JICBuaWJsX2NvdW50ICs9IDE7Ci0JICBicmVhazsKLQljYXNlIENMQVNTXzAxSUk6Ci0JICBpbnN0cl9kYXRhLT5pbnRlcnJ1cHRzID0gaW5zdHJfbmlibCAmIDB4MzsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfMDBJSToKLQkgIGluc3RyX2RhdGEtPmludGVycnVwdHMgPSBpbnN0cl9uaWJsICYgMHgzOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19CSVQ6Ci0JICAvKiBkbyBub3RoaW5nICovCi0JICBicmVhazsKLQljYXNlIENMQVNTX0lSOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19GTEFHUzoKLQkgIGluc3RyX2RhdGEtPmZsYWdzID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfQllURToKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX1dPUkQ6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19RVUFEOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfTE9ORzoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHTjA6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBsb29wICs9IDE7Ci0gICAgICBuaWJsX2NvdW50ICs9IDE7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotdW5wYXJzZV9pbnN0ciAoaW5zdHJfZGF0YSkKLSAgICAgaW5zdHJfZGF0YV9zICppbnN0cl9kYXRhOwotewotICB1bnNpZ25lZCBzaG9ydCB0YWJsX2RhdHVtLCBkYXR1bV9jbGFzcywgZGF0dW1fdmFsdWU7Ci0gIGludCBsb29wLCBsb29wX2xpbWl0OwotICBjaGFyIG91dF9zdHJbODBdLCB0bXBfc3RyWzI1XTsKLQotICBzcHJpbnRmIChvdXRfc3RyLCAiXHQlc1x0IiwgejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLm5hbWUpOwotCi0gIGxvb3BfbGltaXQgPSB6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0ubm9wZXJhbmRzOwotICBmb3IgKGxvb3AgPSAwOyBsb29wIDwgbG9vcF9saW1pdDsgbG9vcCsrKQotICAgIHsKLSAgICAgIGlmIChsb29wKQotCXN0cmNhdCAob3V0X3N0ciwgIiwiKTsKLQotICAgICAgdGFibF9kYXR1bSA9IHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5hcmdfaW5mb1tsb29wXTsKLSAgICAgIGRhdHVtX2NsYXNzID0gdGFibF9kYXR1bSAmIENMQVNTX01BU0s7Ci0gICAgICBkYXR1bV92YWx1ZSA9IHRhYmxfZGF0dW0gJiB+Q0xBU1NfTUFTSzsKLQotICAgICAgc3dpdGNoIChkYXR1bV9jbGFzcykKLQl7Ci0JY2FzZSBDTEFTU19YOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIjB4JTBseChSJWxkKSIsIGluc3RyX2RhdGEtPmFkZHJlc3MsCi0JCSAgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0JBOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgInIlbGQoIyVseCkiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSwKLQkJICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0JYOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgInIlbGQoUiVsZCkiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSwKLQkJICAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tBUkdfUlhdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RJU1A6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiIzB4JTBseCIsIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19JTU06Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiIzB4JTBseCIsIGluc3RyX2RhdGEtPmltbWVkaWF0ZSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19DQzoKLQkgIHNwcmludGYgKHRtcF9zdHIsICIlcyIsIGNvZGVzW2luc3RyX2RhdGEtPmNvbmRfY29kZV0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQ1RSTDoKLQkgIHNwcmludGYgKHRtcF9zdHIsICIweCUwbHgiLCBpbnN0cl9kYXRhLT5jdHJsX2NvZGUpOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfREE6Ci0JY2FzZSBDTEFTU19BRERSRVNTOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIiMweCUwbHgiLCBpbnN0cl9kYXRhLT5hZGRyZXNzKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0lSOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIkBSJWxkIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfRkxBR1M6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiMHglMGx4IiwgaW5zdHJfZGF0YS0+ZmxhZ3MpOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX0JZVEU6Ci0JICBpZiAoaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPj0gMHg4KQotCSAgICB7Ci0JICAgICAgc3ByaW50ZiAodG1wX3N0ciwgInJsJWxkIiwKLQkJICAgICAgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdIC0gMHg4KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3ByaW50ZiAodG1wX3N0ciwgInJoJWxkIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0pOwotCSAgICB9Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfV09SRDoKLQkgIHNwcmludGYgKHRtcF9zdHIsICJyJWxkIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX1FVQUQ6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAicnElbGQiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfTE9ORzoKLQkgIHNwcmludGYgKHRtcF9zdHIsICJyciVsZCIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBzdHJjcHkgKGluc3RyX2RhdGEtPmluc3RyX2FzbXNyYywgb3V0X3N0cik7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3o4ay1vcGMuaCBiL29wY29kZXMvejhrLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzlhM2EzLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvejhrLW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQzOCArMCwwIEBACi0JCQkvKiBUSElTIEZJTEUgSVMgQVVUT01BR0lDQUxMWSBHRU5FUkFURUQsIERPTidUIEVESVQgSVQgKi8KLSNkZWZpbmUgQVJHX01BU0sgMHgwZgotI2RlZmluZSBBUkdfU1JDIDB4MDEKLSNkZWZpbmUgQVJHX0RTVCAweDAyCi0jZGVmaW5lIEFSR19SUyAweDAxCi0jZGVmaW5lIEFSR19SRCAweDAyCi0jZGVmaW5lIEFSR19SQSAweDAzCi0jZGVmaW5lIEFSR19SQiAweDA0Ci0jZGVmaW5lIEFSR19SUiAweDA1Ci0jZGVmaW5lIEFSR19SWCAweDA2Ci0jZGVmaW5lIEFSR19JTU00IDB4MDEKLSNkZWZpbmUgQVJHX0lNTTggMHgwMgotI2RlZmluZSBBUkdfSU1NMTYgMHgwMwotI2RlZmluZSBBUkdfSU1NMzIgMHgwNAotI2RlZmluZSBBUkdfSU1NTiAweDA1Ci0jZGVmaW5lIEFSR19JTU1OTUlOVVMxIDB4MDUKLSNkZWZpbmUgQVJHX0lNTV8xIDB4MDYKLSNkZWZpbmUgQVJHX0lNTV8yIDB4MDcKLSNkZWZpbmUgQVJHX0RJU1AxNiAweDA4Ci0jZGVmaW5lIEFSR19OSU04IDB4MDkKLSNkZWZpbmUgQVJHX0lNTTIgMHgwYQotI2RlZmluZSBBUkdfSU1NMU9SMiAweDBiCi0jZGVmaW5lIEFSR19ESVNQMTIgMHgwYgotI2RlZmluZSBBUkdfRElTUDggMHgwYwotI2RlZmluZSBBUkdfSU1NNE0xIDB4MGQKLSNkZWZpbmUgQ0xBU1NfTUFTSyAweDFmZmYwCi0jZGVmaW5lIENMQVNTX1ggMHgxMAotI2RlZmluZSBDTEFTU19CQSAweDIwCi0jZGVmaW5lIENMQVNTX0RBIDB4MzAKLSNkZWZpbmUgQ0xBU1NfQlggMHg0MAotI2RlZmluZSBDTEFTU19ESVNQIDB4NTAKLSNkZWZpbmUgQ0xBU1NfSU1NIDB4NjAKLSNkZWZpbmUgQ0xBU1NfQ0MgMHg3MAotI2RlZmluZSBDTEFTU19DVFJMIDB4ODAKLSNkZWZpbmUgQ0xBU1NfQUREUkVTUyAweGQwCi0jZGVmaW5lIENMQVNTXzBDQ0MgMHhlMAotI2RlZmluZSBDTEFTU18xQ0NDIDB4ZjAKLSNkZWZpbmUgQ0xBU1NfMERJU1A3IDB4MTAwCi0jZGVmaW5lIENMQVNTXzFESVNQNyAweDIwMAotI2RlZmluZSBDTEFTU18wMUlJIDB4MzAwCi0jZGVmaW5lIENMQVNTXzAwSUkgMHg0MDAKLSNkZWZpbmUgQ0xBU1NfQklUIDB4NTAwCi0jZGVmaW5lIENMQVNTX0ZMQUdTIDB4NjAwCi0jZGVmaW5lIENMQVNTX0lSIDB4NzAwCi0jZGVmaW5lIENMQVNTX0RJU1A4IDB4ODAwCi0jZGVmaW5lIENMQVNTX0JJVF8xT1IyIDB4OTAwCi0jZGVmaW5lIENMQVNTX1JFRyAweDcwMDAKLSNkZWZpbmUgQ0xBU1NfUkVHX0JZVEUgMHgyMDAwCi0jZGVmaW5lIENMQVNTX1JFR19XT1JEIDB4MzAwMAotI2RlZmluZSBDTEFTU19SRUdfUVVBRCAweDQwMDAKLSNkZWZpbmUgQ0xBU1NfUkVHX0xPTkcgMHg1MDAwCi0jZGVmaW5lIENMQVNTX1JFR04wIDB4ODAwMAotI2RlZmluZSBDTEFTU19QUiAweDEwMDAwCi0jZGVmaW5lIE9QQ19hZGMgMAotI2RlZmluZSBPUENfYWRjYiAxCi0jZGVmaW5lIE9QQ19hZGQgMgotI2RlZmluZSBPUENfYWRkYiAzCi0jZGVmaW5lIE9QQ19hZGRsIDQKLSNkZWZpbmUgT1BDX2FuZCA1Ci0jZGVmaW5lIE9QQ19hbmRiIDYKLSNkZWZpbmUgT1BDX2JpdCA3Ci0jZGVmaW5lIE9QQ19iaXRiIDgKLSNkZWZpbmUgT1BDX2NhbGwgOQotI2RlZmluZSBPUENfY2FsciAxMAotI2RlZmluZSBPUENfY2xyIDExCi0jZGVmaW5lIE9QQ19jbHJiIDEyCi0jZGVmaW5lIE9QQ19jb20gMTMKLSNkZWZpbmUgT1BDX2NvbWIgMTQKLSNkZWZpbmUgT1BDX2NvbWZsZyAxNQotI2RlZmluZSBPUENfY3AgMTYKLSNkZWZpbmUgT1BDX2NwYiAxNwotI2RlZmluZSBPUENfY3BkIDE4Ci0jZGVmaW5lIE9QQ19jcGRiIDE5Ci0jZGVmaW5lIE9QQ19jcGRyIDIwCi0jZGVmaW5lIE9QQ19jcGRyYiAyMQotI2RlZmluZSBPUENfY3BpIDIyCi0jZGVmaW5lIE9QQ19jcGliIDIzCi0jZGVmaW5lIE9QQ19jcGlyIDI0Ci0jZGVmaW5lIE9QQ19jcGlyYiAyNQotI2RlZmluZSBPUENfY3BsIDI2Ci0jZGVmaW5lIE9QQ19jcHNkIDI3Ci0jZGVmaW5lIE9QQ19jcHNkYiAyOAotI2RlZmluZSBPUENfY3BzZHIgMjkKLSNkZWZpbmUgT1BDX2Nwc2RyYiAzMAotI2RlZmluZSBPUENfY3BzaSAzMQotI2RlZmluZSBPUENfY3BzaWIgMzIKLSNkZWZpbmUgT1BDX2Nwc2lyIDMzCi0jZGVmaW5lIE9QQ19jcHNpcmIgMzQKLSNkZWZpbmUgT1BDX2RhYiAzNQotI2RlZmluZSBPUENfZGJqbnogMzYKLSNkZWZpbmUgT1BDX2RlYyAzNwotI2RlZmluZSBPUENfZGVjYiAzOAotI2RlZmluZSBPUENfZGkgMzkKLSNkZWZpbmUgT1BDX2RpdiA0MAotI2RlZmluZSBPUENfZGl2bCA0MQotI2RlZmluZSBPUENfZGpueiA0MgotI2RlZmluZSBPUENfZWkgNDMKLSNkZWZpbmUgT1BDX2V4IDQ0Ci0jZGVmaW5lIE9QQ19leGIgNDUKLSNkZWZpbmUgT1BDX2V4dHMgNDYKLSNkZWZpbmUgT1BDX2V4dHNiIDQ3Ci0jZGVmaW5lIE9QQ19leHRzbCA0OAotI2RlZmluZSBPUENfaGFsdCA0OQotI2RlZmluZSBPUENfaW4gNTAKLSNkZWZpbmUgT1BDX2luYiA1MQotI2RlZmluZSBPUENfaW5jIDUyCi0jZGVmaW5lIE9QQ19pbmNiIDUzCi0jZGVmaW5lIE9QQ19pbmQgNTQKLSNkZWZpbmUgT1BDX2luZGIgNTUKLSNkZWZpbmUgT1BDX2luaWIgNTYKLSNkZWZpbmUgT1BDX2luaWJyIDU3Ci0jZGVmaW5lIE9QQ19pcmV0IDU4Ci0jZGVmaW5lIE9QQ19qcCA1OQotI2RlZmluZSBPUENfanIgNjAKLSNkZWZpbmUgT1BDX2xkIDYxCi0jZGVmaW5lIE9QQ19sZGEgNjIKLSNkZWZpbmUgT1BDX2xkYXIgNjMKLSNkZWZpbmUgT1BDX2xkYiA2NAotI2RlZmluZSBPUENfbGRjdGwgNjUKLSNkZWZpbmUgT1BDX2xkaXIgNjYKLSNkZWZpbmUgT1BDX2xkaXJiIDY3Ci0jZGVmaW5lIE9QQ19sZGsgNjgKLSNkZWZpbmUgT1BDX2xkbCA2OQotI2RlZmluZSBPUENfbGRtIDcwCi0jZGVmaW5lIE9QQ19sZHBzIDcxCi0jZGVmaW5lIE9QQ19sZHIgNzIKLSNkZWZpbmUgT1BDX2xkcmIgNzMKLSNkZWZpbmUgT1BDX2xkcmwgNzQKLSNkZWZpbmUgT1BDX21iaXQgNzUKLSNkZWZpbmUgT1BDX21yZXEgNzYKLSNkZWZpbmUgT1BDX21yZXMgNzcKLSNkZWZpbmUgT1BDX21zZXQgNzgKLSNkZWZpbmUgT1BDX211bHQgNzkKLSNkZWZpbmUgT1BDX211bHRsIDgwCi0jZGVmaW5lIE9QQ19uZWcgODEKLSNkZWZpbmUgT1BDX25lZ2IgODIKLSNkZWZpbmUgT1BDX25vcCA4MwotI2RlZmluZSBPUENfb3IgODQKLSNkZWZpbmUgT1BDX29yYiA4NQotI2RlZmluZSBPUENfb3V0IDg2Ci0jZGVmaW5lIE9QQ19vdXRiIDg3Ci0jZGVmaW5lIE9QQ19vdXRkIDg4Ci0jZGVmaW5lIE9QQ19vdXRkYiA4OQotI2RlZmluZSBPUENfb3V0aWIgOTAKLSNkZWZpbmUgT1BDX291dGliciA5MQotI2RlZmluZSBPUENfcG9wIDkyCi0jZGVmaW5lIE9QQ19wb3BsIDkzCi0jZGVmaW5lIE9QQ19wdXNoIDk0Ci0jZGVmaW5lIE9QQ19wdXNobCA5NQotI2RlZmluZSBPUENfcmVzIDk2Ci0jZGVmaW5lIE9QQ19yZXNiIDk3Ci0jZGVmaW5lIE9QQ19yZXNmbGcgOTgKLSNkZWZpbmUgT1BDX3JldCA5OQotI2RlZmluZSBPUENfcmwgMTAwCi0jZGVmaW5lIE9QQ19ybGIgMTAxCi0jZGVmaW5lIE9QQ19ybGMgMTAyCi0jZGVmaW5lIE9QQ19ybGNiIDEwMwotI2RlZmluZSBPUENfcmxkYiAxMDQKLSNkZWZpbmUgT1BDX3JyIDEwNQotI2RlZmluZSBPUENfcnJiIDEwNgotI2RlZmluZSBPUENfcnJjIDEwNwotI2RlZmluZSBPUENfcnJjYiAxMDgKLSNkZWZpbmUgT1BDX3JyZGIgMTA5Ci0jZGVmaW5lIE9QQ19zYmMgMTEwCi0jZGVmaW5lIE9QQ19zYmNiIDExMQotI2RlZmluZSBPUENfc2RhIDExMgotI2RlZmluZSBPUENfc2RhYiAxMTMKLSNkZWZpbmUgT1BDX3NkYWwgMTE0Ci0jZGVmaW5lIE9QQ19zZGwgMTE1Ci0jZGVmaW5lIE9QQ19zZGxiIDExNgotI2RlZmluZSBPUENfc2RsbCAxMTcKLSNkZWZpbmUgT1BDX3NldCAxMTgKLSNkZWZpbmUgT1BDX3NldGIgMTE5Ci0jZGVmaW5lIE9QQ19zZXRmbGcgMTIwCi0jZGVmaW5lIE9QQ19zaW5iIDEyMQotI2RlZmluZSBPUENfc2luZCAxMjIKLSNkZWZpbmUgT1BDX3NpbmRiIDEyMwotI2RlZmluZSBPUENfc2luaWIgMTI0Ci0jZGVmaW5lIE9QQ19zaW5pYnIgMTI1Ci0jZGVmaW5lIE9QQ19zbGEgMTI2Ci0jZGVmaW5lIE9QQ19zbGFiIDEyNwotI2RlZmluZSBPUENfc2xhbCAxMjgKLSNkZWZpbmUgT1BDX3NsbCAxMjkKLSNkZWZpbmUgT1BDX3NsbGIgMTMwCi0jZGVmaW5lIE9QQ19zbGxsIDEzMQotI2RlZmluZSBPUENfc291dCAxMzIKLSNkZWZpbmUgT1BDX3NvdXRiIDEzMwotI2RlZmluZSBPUENfc291dGQgMTM0Ci0jZGVmaW5lIE9QQ19zb3V0ZGIgMTM1Ci0jZGVmaW5lIE9QQ19zb3V0aWIgMTM2Ci0jZGVmaW5lIE9QQ19zb3V0aWJyIDEzNwotI2RlZmluZSBPUENfc3JhIDEzOAotI2RlZmluZSBPUENfc3JhYiAxMzkKLSNkZWZpbmUgT1BDX3NyYWwgMTQwCi0jZGVmaW5lIE9QQ19zcmwgMTQxCi0jZGVmaW5lIE9QQ19zcmxiIDE0MgotI2RlZmluZSBPUENfc3JsbCAxNDMKLSNkZWZpbmUgT1BDX3N1YiAxNDQKLSNkZWZpbmUgT1BDX3N1YmIgMTQ1Ci0jZGVmaW5lIE9QQ19zdWJsIDE0NgotI2RlZmluZSBPUENfdGNjIDE0NwotI2RlZmluZSBPUENfdGNjYiAxNDgKLSNkZWZpbmUgT1BDX3Rlc3QgMTQ5Ci0jZGVmaW5lIE9QQ190ZXN0YiAxNTAKLSNkZWZpbmUgT1BDX3Rlc3RsIDE1MQotI2RlZmluZSBPUENfdHJkYiAxNTIKLSNkZWZpbmUgT1BDX3RyZHJiIDE1MwotI2RlZmluZSBPUENfdHJpYiAxNTQKLSNkZWZpbmUgT1BDX3RyaXJiIDE1NQotI2RlZmluZSBPUENfdHJ0ZHJiIDE1NgotI2RlZmluZSBPUENfdHJ0aWIgMTU3Ci0jZGVmaW5lIE9QQ190cnRpcmIgMTU4Ci0jZGVmaW5lIE9QQ190cnRkYiAxNTkKLSNkZWZpbmUgT1BDX3RzZXQgMTYwCi0jZGVmaW5lIE9QQ190c2V0YiAxNjEKLSNkZWZpbmUgT1BDX3hvciAxNjIKLSNkZWZpbmUgT1BDX3hvcmIgMTYzCi0jZGVmaW5lIE9QQ19sZGQgIDE2NCAKLSNkZWZpbmUgT1BDX2xkZGIgIDE2NSAKLSNkZWZpbmUgT1BDX2xkZHIgIDE2NiAKLSNkZWZpbmUgT1BDX2xkZHJiIDE2NyAgCi0jZGVmaW5lIE9QQ19sZGkgIDE2OCAKLSNkZWZpbmUgT1BDX2xkaWIgMTY5ICAKLSNkZWZpbmUgT1BDX3NjICAgMTcwCi0jZGVmaW5lIE9QQ19icHQgICAxNzEKLSNkZWZpbmUgT1BDX2V4dDBlIDE3MgotI2RlZmluZSBPUENfZXh0MGYgMTcyCi0jZGVmaW5lIE9QQ19leHQ4ZSAxNzIKLSNkZWZpbmUgT1BDX2V4dDhmIDE3MgotI2RlZmluZSBPUENfcnN2ZDM2IDE3MgotI2RlZmluZSBPUENfcnN2ZDM4IDE3MgotI2RlZmluZSBPUENfcnN2ZDc4IDE3MgotI2RlZmluZSBPUENfcnN2ZDdlIDE3MgotI2RlZmluZSBPUENfcnN2ZDlkIDE3MgotI2RlZmluZSBPUENfcnN2ZDlmIDE3MgotI2RlZmluZSBPUENfcnN2ZGI5IDE3MgotI2RlZmluZSBPUENfcnN2ZGJmIDE3MgotI2RlZmluZSBPUENfb3V0aSAxNzMKLXR5cGVkZWYgc3RydWN0IHsKLSNpZmRlZiBOSUNFTkFNRVMKLWNoYXIgKm5pY2VuYW1lOwotaW50IHR5cGU7Ci1pbnQgY3ljbGVzOwotaW50IGZsYWdzOwotI2VuZGlmCi1jaGFyICpuYW1lOwotdW5zaWduZWQgY2hhciBvcGNvZGU7Ci12b2lkICgqZnVuYykoKTsKLXVuc2lnbmVkIGludCBhcmdfaW5mb1s0XTsKLXVuc2lnbmVkIGludCBieXRlX2luZm9bMTBdOwotaW50IG5vcGVyYW5kczsKLWludCBsZW5ndGg7Ci1pbnQgaWR4OwotfSBvcGNvZGVfZW50cnlfdHlwZTsKLSNpZmRlZiBERUZJTkVfVEFCTEUKLW9wY29kZV9lbnRyeV90eXBlIHo4a190YWJsZVtdID0gewotCi0KLS8qIDEwMTEgMDEwMSBzc3NzIGRkZGQgKioqIGFkYyByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkYyByZCxycyIsMTYsNSwKLTB4M2MsCi0jZW5kaWYKLSJhZGMiLE9QQ19hZGMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrNSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwwfSwKLQotCi0vKiAxMDExIDAxMDAgc3NzcyBkZGRkICoqKiBhZGNiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGNiIHJiZCxyYnMiLDgsNSwKLTB4M2YsCi0jZW5kaWYKLSJhZGNiIixPUENfYWRjYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs0LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDF9LAotCi0KLS8qIDAwMDAgMDAwMSBzc04wIGRkZGQgKioqIGFkZCByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGQgcmQsQHJzIiwxNiw3LAotMHgzYywKLSNlbmRpZgotImFkZCIsT1BDX2FkZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDJ9LAotCi0KLS8qIDAxMDAgMDAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZCByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZCByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4M2MsCi0jZW5kaWYKLSJhZGQiLE9QQ19hZGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDN9LAotCi0KLS8qIDAxMDAgMDAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZCByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGQgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4M2MsCi0jZW5kaWYKLSJhZGQiLE9QQ19hZGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw0fSwKLQotCi0vKiAwMDAwIDAwMDEgMDAwMCBkZGRkIGltbTE2ICoqKiBhZGQgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGQgcmQsaW1tMTYiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0iYWRkIixPUENfYWRkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsNX0sCi0KLQotLyogMTAwMCAwMDAxIHNzc3MgZGRkZCAqKiogYWRkIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkIHJkLHJzIiwxNiw0LAotMHgzYywKLSNlbmRpZgotImFkZCIsT1BDX2FkZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw2fSwKLQotCi0vKiAwMDAwIDAwMDAgc3NOMCBkZGRkICoqKiBhZGRiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRiIHJiZCxAcnMiLDgsNywKLTB4M2YsCi0jZW5kaWYKLSJhZGRiIixPUENfYWRkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDd9LAotCi0KLS8qIDAxMDAgMDAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZGIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4M2YsCi0jZW5kaWYKLSJhZGRiIixPUENfYWRkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsOH0sCi0KLQotLyogMDEwMCAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYWRkYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgzZiwKLSNlbmRpZgotImFkZGIiLE9QQ19hZGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsOX0sCi0KLQotLyogMDAwMCAwMDAwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIGFkZGIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRiIHJiZCxpbW04Iiw4LDcsCi0weDNmLAotI2VuZGlmCi0iYWRkYiIsT1BDX2FkZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDEwfSwKLQotCi0vKiAxMDAwIDAwMDAgc3NzcyBkZGRkICoqKiBhZGRiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRiIHJiZCxyYnMiLDgsNCwKLTB4M2YsCi0jZW5kaWYKLSJhZGRiIixPUENfYWRkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMX0sCi0KLQotLyogMDAwMSAwMTEwIHNzTjAgZGRkZCAqKiogYWRkbCBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkbCBycmQsQHJzIiwzMiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJhZGRsIixPUENfYWRkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEyfSwKLQotCi0vKiAwMTAxIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhZGRsIHJyZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGwgcnJkLGFkZHJlc3Nfc3JjIiwzMiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJhZGRsIixPUENfYWRkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTN9LAotCi0KLS8qIDAxMDEgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMTYsCi0weDNjLAotI2VuZGlmCi0iYWRkbCIsT1BDX2FkZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxNH0sCi0KLQotLyogMDAwMSAwMTEwIDAwMDAgZGRkZCBpbW0zMiAqKiogYWRkbCBycmQsaW1tMzIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRsIHJyZCxpbW0zMiIsMzIsMTQsCi0weDNjLAotI2VuZGlmCi0iYWRkbCIsT1BDX2FkZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiwxNX0sCi0KLQotLyogMTAwMSAwMTEwIHNzc3MgZGRkZCAqKiogYWRkbCBycmQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkbCBycmQscnJzIiwzMiw4LAotMHgzYywKLSNlbmRpZgotImFkZGwiLE9QQ19hZGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCs2LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE2fSwKLQotCi0vKiAwMDAwIDAxMTEgc3NOMCBkZGRkICoqKiBhbmQgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kIHJkLEBycyIsMTYsNywKLTB4MTgsCi0jZW5kaWYKLSJhbmQiLE9QQ19hbmQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxN30sCi0KLQotLyogMDEwMCAwMTExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYW5kIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgxOCwKLSNlbmRpZgotImFuZCIsT1BDX2FuZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTh9LAotCi0KLS8qIDAxMDAgMDExMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGFuZCByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmQgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4MTgsCi0jZW5kaWYKLSJhbmQiLE9QQ19hbmQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxOX0sCi0KLQotLyogMDAwMCAwMTExIDAwMDAgZGRkZCBpbW0xNiAqKiogYW5kIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kIHJkLGltbTE2IiwxNiw3LAotMHgxOCwKLSNlbmRpZgotImFuZCIsT1BDX2FuZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDIwfSwKLQotCi0vKiAxMDAwIDAxMTEgc3NzcyBkZGRkICoqKiBhbmQgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmQgcmQscnMiLDE2LDQsCi0weDE4LAotI2VuZGlmCi0iYW5kIixPUENfYW5kLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs3LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIxfSwKLQotCi0vKiAwMDAwIDAxMTAgc3NOMCBkZGRkICoqKiBhbmRiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmRiIHJiZCxAcnMiLDgsNywKLTB4MWMsCi0jZW5kaWYKLSJhbmRiIixPUENfYW5kYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIyfSwKLQotCi0vKiAwMTAwIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhbmRiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZGIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDFjLAotI2VuZGlmCi0iYW5kYiIsT1BDX2FuZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIzfSwKLQotCi0vKiAwMTAwIDAxMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhbmRiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmRiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDFjLAotI2VuZGlmCi0iYW5kYiIsT1BDX2FuZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNH0sCi0KLQotLyogMDAwMCAwMTEwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIGFuZGIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmRiIHJiZCxpbW04Iiw4LDcsCi0weDFjLAotI2VuZGlmCi0iYW5kYiIsT1BDX2FuZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDI1fSwKLQotCi0vKiAxMDAwIDAxMTAgc3NzcyBkZGRkICoqKiBhbmRiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmRiIHJiZCxyYnMiLDgsNCwKLTB4MWMsCi0jZW5kaWYKLSJhbmRiIixPUENfYW5kYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrNixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNn0sCi0KLQotLyogMDAxMCAwMTExIGRkTjAgaW1tNCAqKiogYml0IEByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0IEByZCxpbW00IiwxNiw4LAotMHgxMCwKLSNlbmRpZgotImJpdCIsT1BDX2JpdCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI3fSwKLQotCi0vKiAwMTEwIDAxMTEgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBiaXQgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXQgYWRkcmVzc19kc3QocmQpLGltbTQiLDE2LDExLAotMHgxMCwKLSNlbmRpZgotImJpdCIsT1BDX2JpdCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI4fSwKLQotCi0vKiAwMTEwIDAxMTEgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBiaXQgYWRkcmVzc19kc3QsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdCBhZGRyZXNzX2RzdCxpbW00IiwxNiwxMCwKLTB4MTAsCi0jZW5kaWYKLSJiaXQiLE9QQ19iaXQsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI5fSwKLQotCi0vKiAxMDEwIDAxMTEgZGRkZCBpbW00ICoqKiBiaXQgcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdCByZCxpbW00IiwxNiw0LAotMHgxMCwKLSNlbmRpZgotImJpdCIsT1BDX2JpdCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrNyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMwfSwKLQotCi0vKiAwMDEwIDAxMTEgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIGJpdCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdCByZCxycyIsMTYsMTAsCi0weDEwLAotI2VuZGlmCi0iYml0IixPUENfYml0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMX0sCi0KLQotLyogMDAxMCAwMTEwIGRkTjAgaW1tNCAqKiogYml0YiBAcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdGIgQHJkLGltbTQiLDgsOCwKLTB4MTAsCi0jZW5kaWYKLSJiaXRiIixPUENfYml0YiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMyfSwKLQotCi0vKiAwMTEwIDAxMTAgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBiaXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0YiBhZGRyZXNzX2RzdChyZCksaW1tNCIsOCwxMSwKLTB4MTAsCi0jZW5kaWYKLSJiaXRiIixPUENfYml0YiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDMzfSwKLQotCi0vKiAwMTEwIDAxMTAgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBiaXRiIGFkZHJlc3NfZHN0LGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXRiIGFkZHJlc3NfZHN0LGltbTQiLDgsMTAsCi0weDEwLAotI2VuZGlmCi0iYml0YiIsT1BDX2JpdGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDM0fSwKLQotCi0vKiAxMDEwIDAxMTAgZGRkZCBpbW00ICoqKiBiaXRiIHJiZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0YiByYmQsaW1tNCIsOCw0LAotMHgxMCwKLSNlbmRpZgotImJpdGIiLE9QQ19iaXRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs2LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzV9LAotCi0KLS8qIDAwMTAgMDExMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogYml0YiByYmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXRiIHJiZCxycyIsOCwxMCwKLTB4MTAsCi0jZW5kaWYKLSJiaXRiIixPUENfYml0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzZ9LAotCi0KLS8qIDAwMTEgMDExMCAwMDAwIDAwMDAgKioqIGJwdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJwdCIsOCwyLAotMHgwMCwKLSNlbmRpZgotImJwdCIsT1BDX2JwdCwwLHswfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMCwyLDM3fSwKLQotCi0vKiAwMDAxIDExMTEgZGROMCAwMDAwICoqKiBjYWxsIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNhbGwgQHJkIiwzMiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJjYWxsIixPUENfY2FsbCwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhmLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiwzOH0sCi0KLQotLyogMDEwMSAxMTExIDAwMDAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY2FsbCBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNhbGwgYWRkcmVzc19kc3QiLDMyLDEyLAotMHgwMCwKLSNlbmRpZgotImNhbGwiLE9QQ19jYWxsLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzl9LAotCi0KLS8qIDAxMDEgMTExMSBkZE4wIDAwMDAgYWRkcmVzc19kc3QgKioqIGNhbGwgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2FsbCBhZGRyZXNzX2RzdChyZCkiLDMyLDEzLAotMHgwMCwKLSNlbmRpZgotImNhbGwiLE9QQ19jYWxsLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQwfSwKLQotCi0vKiAxMTAxIGRpc3AxMiAqKiogY2FsciBkaXNwMTIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjYWxyIGRpc3AxMiIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0iY2FsciIsT1BDX2NhbHIsMCx7Q0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMHhkLENMQVNTX0RJU1ArKEFSR19ESVNQMTIpLDAsMCwwLDAsMCwwLDAsfSwxLDIsNDF9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDEwMDAgKioqIGNsciBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHIgQHJkIiwxNiw4LAotMHgwMCwKLSNlbmRpZgotImNsciIsT1BDX2NsciwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiw0Mn0sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCAqKiogY2xyIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyIGFkZHJlc3NfZHN0IiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJjbHIiLE9QQ19jbHIsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0M30sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCAqKiogY2xyIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNsciBhZGRyZXNzX2RzdChyZCkiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotImNsciIsT1BDX2NsciwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0NH0sCi0KLQotLyogMTAwMCAxMTAxIGRkZGQgMTAwMCAqKiogY2xyIHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyIHJkIiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImNsciIsT1BDX2NsciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsNDV9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDEwMDAgKioqIGNscmIgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyYiBAcmQiLDgsOCwKLTB4MDAsCi0jZW5kaWYKLSJjbHJiIixPUENfY2xyYiwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiw0Nn0sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCAqKiogY2xyYiBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNscmIgYWRkcmVzc19kc3QiLDgsMTEsCi0weDAwLAotI2VuZGlmCi0iY2xyYiIsT1BDX2NscmIsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0N30sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCAqKiogY2xyYiBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHJiIGFkZHJlc3NfZHN0KHJkKSIsOCwxMiwKLTB4MDAsCi0jZW5kaWYKLSJjbHJiIixPUENfY2xyYiwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0OH0sCi0KLQotLyogMTAwMCAxMTAwIGRkZGQgMTAwMCAqKiogY2xyYiByYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHJiIHJiZCIsOCw3LAotMHgwMCwKLSNlbmRpZgotImNscmIiLE9QQ19jbHJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiw0OX0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMDAwMCAqKiogY29tIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbSBAcmQiLDE2LDEyLAotMHgxOCwKLSNlbmRpZgotImNvbSIsT1BDX2NvbSwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiw1MH0sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY29tIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tIGFkZHJlc3NfZHN0IiwxNiwxNSwKLTB4MTgsCi0jZW5kaWYKLSJjb20iLE9QQ19jb20sMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw1MX0sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY29tIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbSBhZGRyZXNzX2RzdChyZCkiLDE2LDE2LAotMHgxOCwKLSNlbmRpZgotImNvbSIsT1BDX2NvbSwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw1Mn0sCi0KLQotLyogMTAwMCAxMTAxIGRkZGQgMDAwMCAqKiogY29tIHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tIHJkIiwxNiw3LAotMHgxOCwKLSNlbmRpZgotImNvbSIsT1BDX2NvbSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsNTN9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDAwMDAgKioqIGNvbWIgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tYiBAcmQiLDgsMTIsCi0weDFjLAotI2VuZGlmCi0iY29tYiIsT1BDX2NvbWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsNTR9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDAwMDAgYWRkcmVzc19kc3QgKioqIGNvbWIgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb21iIGFkZHJlc3NfZHN0Iiw4LDE1LAotMHgxYywKLSNlbmRpZgotImNvbWIiLE9QQ19jb21iLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNTV9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDAwMDAgYWRkcmVzc19kc3QgKioqIGNvbWIgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tYiBhZGRyZXNzX2RzdChyZCkiLDgsMTYsCi0weDFjLAotI2VuZGlmCi0iY29tYiIsT1BDX2NvbWIsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNTZ9LAotCi0KLS8qIDEwMDAgMTEwMCBkZGRkIDAwMDAgKioqIGNvbWIgcmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tYiByYmQiLDgsNywKLTB4MWMsCi0jZW5kaWYKLSJjb21iIixPUENfY29tYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsNTd9LAotCi0KLS8qIDEwMDAgMTEwMSBmbGFncyAwMTAxICoqKiBjb21mbGcgZmxhZ3MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb21mbGcgZmxhZ3MiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0iY29tZmxnIixPUENfY29tZmxnLDAse0NMQVNTX0ZMQUdTLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfRkxBR1MsQ0xBU1NfQklUKzUsMCwwLDAsMCwwLH0sMSwyLDU4fSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAwMDAxIGltbTE2ICoqKiBjcCBAcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCBAcmQsaW1tMTYiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsNTl9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDAwMDEgYWRkcmVzc19kc3QgaW1tMTYgKioqIGNwIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiIsMTYsMTUsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCx9LDIsNiw2MH0sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMDAwMSBhZGRyZXNzX2RzdCBpbW0xNiAqKiogY3AgYWRkcmVzc19kc3QsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCBhZGRyZXNzX2RzdCxpbW0xNiIsMTYsMTQsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzEsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLH0sMiw2LDYxfSwKLQotCi0vKiAwMDAwIDEwMTEgc3NOMCBkZGRkICoqKiBjcCByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCByZCxAcnMiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNjJ9LAotCi0KLS8qIDAxMDAgMTAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGNwIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw2M30sCi0KLQotLyogMDEwMCAxMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3AgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw2NH0sCi0KLQotLyogMDAwMCAxMDExIDAwMDAgZGRkZCBpbW0xNiAqKiogY3AgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCByZCxpbW0xNiIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCw2NX0sCi0KLQotLyogMTAwMCAxMDExIHNzc3MgZGRkZCAqKiogY3AgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCByZCxycyIsMTYsNCwKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNjZ9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDAwMDEgaW1tOCBpbW04ICoqKiBjcGIgQHJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgQHJkLGltbTgiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsNjd9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDAwMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04ICoqKiBjcGIgYWRkcmVzc19kc3QocmQpLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgYWRkcmVzc19kc3QocmQpLGltbTgiLDgsMTUsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDYsNjh9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDAwMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04ICoqKiBjcGIgYWRkcmVzc19kc3QsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiBhZGRyZXNzX2RzdCxpbW04Iiw4LDE0LAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDYsNjl9LAotCi0KLS8qIDAwMDAgMTAxMCBzc04wIGRkZGQgKioqIGNwYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIHJiZCxAcnMiLDgsNywKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDcwfSwKLQotCi0vKiAwMTAwIDEwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcGIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw3MX0sCi0KLQotLyogMDEwMCAxMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3BiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDcyfSwKLQotCi0vKiAwMDAwIDEwMTAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogY3BiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIHJiZCxpbW04Iiw4LDcsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDczfSwKLQotCi0vKiAxMDAwIDEwMTAgc3NzcyBkZGRkICoqKiBjcGIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiByYmQscmJzIiw4LDQsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNzR9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDEwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BkIHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwZCByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwZCIsT1BDX2NwZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDc1fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAxMDAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwZGIgcmJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwZGIgcmJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGRiIixPUENfY3BkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDc2fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAxMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwZHIgcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BkciByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwZHIiLE9QQ19jcGRyLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw3N30sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMTEwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGRyYiByYmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BkcmIgcmJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGRyYiIsT1BDX2NwZHJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw3OH0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMDAwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGkgcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BpIHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BpIixPUENfY3BpLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsNzl9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDAwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BpYiByYmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BpYiByYmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwaWIiLE9QQ19jcGliLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsODB9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDAxMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BpciByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGlyIHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BpciIsT1BDX2NwaXIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw4MX0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMDEwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGlyYiByYmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BpcmIgcmJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGlyYiIsT1BDX2NwaXJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsODJ9LAotCi0KLS8qIDAwMDEgMDAwMCBzc04wIGRkZGQgKioqIGNwbCBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BsIHJyZCxAcnMiLDMyLDE0LAotMHgzYywKLSNlbmRpZgotImNwbCIsT1BDX2NwbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDgzfSwKLQotCi0vKiAwMTAxIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcGwgcnJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BsIHJyZCxhZGRyZXNzX3NyYyIsMzIsMTUsCi0weDNjLAotI2VuZGlmCi0iY3BsIixPUENfY3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw4NH0sCi0KLQotLyogMDEwMSAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3BsIHJyZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMTYsCi0weDNjLAotI2VuZGlmCi0iY3BsIixPUENfY3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsODV9LAotCi0KLS8qIDAwMDEgMDAwMCAwMDAwIGRkZGQgaW1tMzIgKioqIGNwbCBycmQsaW1tMzIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGwgcnJkLGltbTMyIiwzMiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJjcGwiLE9QQ19jcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiw4Nn0sCi0KLQotLyogMTAwMSAwMDAwIHNzc3MgZGRkZCAqKiogY3BsIHJyZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGwgcnJkLHJycyIsMzIsOCwKLTB4M2MsCi0jZW5kaWYKLSJjcGwiLE9QQ19jcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsODd9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDEwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzZCBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzZCBAcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNkIixPUENfY3BzZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw4OH0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMTAxMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNkYiBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzZGIgQHJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNkYiIsT1BDX2Nwc2RiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDg5fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAxMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2RyIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNkciBAcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNkciIsT1BDX2Nwc2RyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDkwfSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAxMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2RyYiBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzZHJiIEByZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzZHJiIixPUENfY3BzZHJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDkxfSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAwMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2kgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2kgQHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzaSIsT1BDX2Nwc2ksMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDkyfSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAwMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2liIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNpYiBAcmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwc2liIixPUENfY3BzaWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDkzfSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAwMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2lyIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNpciBAcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNpciIsT1BDX2Nwc2lyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw5NH0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMDExMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNpcmIgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2lyYiBAcmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwc2lyYiIsT1BDX2Nwc2lyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsOTV9LAotCi0KLS8qIDEwMTEgMDAwMCBkZGRkIDAwMDAgKioqIGRhYiByYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkYWIgcmJkIiw4LDUsCi0weDM4LAotI2VuZGlmCi0iZGFiIixPUENfZGFiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiw5Nn0sCi0KLQotLyogMTExMSBkZGRkIDBkaXNwNyAqKiogZGJqbnogcmJkLGRpc3A3ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGJqbnogcmJkLGRpc3A3IiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJkYmpueiIsT1BDX2Riam56LDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzB4ZixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfMERJU1A3LDAsMCwwLDAsMCwwLH0sMiwyLDk3fSwKLQotCi0vKiAwMDEwIDEwMTEgZGROMCBpbW00bTEgKioqIGRlYyBAcmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjIEByZCxpbW00bTEiLDE2LDExLAotMHgxYywKLSNlbmRpZgotImRlYyIsT1BDX2RlYywwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDk4fSwKLQotCi0vKiAwMTEwIDEwMTEgZGROMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGRlYyBhZGRyZXNzX2RzdChyZCksaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLDE2LDE0LAotMHgxYywKLSNlbmRpZgotImRlYyIsT1BDX2RlYywwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDk5fSwKLQotCi0vKiAwMTEwIDEwMTEgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGRlYyBhZGRyZXNzX2RzdCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWMgYWRkcmVzc19kc3QsaW1tNG0xIiwxNiwxMywKLTB4MWMsCi0jZW5kaWYKLSJkZWMiLE9QQ19kZWMsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDEwMH0sCi0KLQotLyogMTAxMCAxMDExIGRkZGQgaW1tNG0xICoqKiBkZWMgcmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjIHJkLGltbTRtMSIsMTYsNCwKLTB4MWMsCi0jZW5kaWYKLSJkZWMiLE9QQ19kZWMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxMDF9LAotCi0KLS8qIDAwMTAgMTAxMCBkZE4wIGltbTRtMSAqKiogZGVjYiBAcmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjYiBAcmQsaW1tNG0xIiw4LDExLAotMHgxYywKLSNlbmRpZgotImRlY2IiLE9QQ19kZWNiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTAyfSwKLQotCi0vKiAwMTEwIDEwMTAgZGROMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGRlY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsOCwxNCwKLTB4MWMsCi0jZW5kaWYKLSJkZWNiIixPUENfZGVjYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDEwM30sCi0KLQotLyogMDExMCAxMDEwIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBkZWNiIGFkZHJlc3NfZHN0LGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlY2IgYWRkcmVzc19kc3QsaW1tNG0xIiw4LDEzLAotMHgxYywKLSNlbmRpZgotImRlY2IiLE9QQ19kZWNiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxMDR9LAotCi0KLS8qIDEwMTAgMTAxMCBkZGRkIGltbTRtMSAqKiogZGVjYiByYmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjYiByYmQsaW1tNG0xIiw4LDQsCi0weDFjLAotI2VuZGlmCi0iZGVjYiIsT1BDX2RlY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxMDV9LAotCi0KLS8qIDAxMTEgMTEwMCAwMDAwIDAwaWkgKioqIGRpIGkyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGkgaTIiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0iZGkiLE9QQ19kaSwwLHtDTEFTU19JTU0rKEFSR19JTU0yKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTXzAwSUksMCwwLDAsMCwwLH0sMSwyLDEwNn0sCi0KLQotLyogMDAwMSAxMDExIHNzTjAgZGRkZCAqKiogZGl2IHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXYgcnJkLEBycyIsMTYsMTA3LAotMHgzYywKLSNlbmRpZgotImRpdiIsT1BDX2RpdiwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTA3fSwKLQotCi0vKiAwMTAxIDEwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBkaXYgcnJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2IHJyZCxhZGRyZXNzX3NyYyIsMTYsMTA3LAotMHgzYywKLSNlbmRpZgotImRpdiIsT1BDX2RpdiwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMDh9LAotCi0KLS8qIDAxMDEgMTAxMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGRpdiBycmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2IHJyZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwNywKLTB4M2MsCi0jZW5kaWYKLSJkaXYiLE9QQ19kaXYsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEwOX0sCi0KLQotLyogMDAwMSAxMDExIDAwMDAgZGRkZCBpbW0xNiAqKiogZGl2IHJyZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdiBycmQsaW1tMTYiLDE2LDEwNywKLTB4M2MsCi0jZW5kaWYKLSJkaXYiLE9QQ19kaXYsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDExMH0sCi0KLQotLyogMTAwMSAxMDExIHNzc3MgZGRkZCAqKiogZGl2IHJyZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdiBycmQscnMiLDE2LDEwNywKLTB4M2MsCi0jZW5kaWYKLSJkaXYiLE9QQ19kaXYsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMTF9LAotCi0KLS8qIDAwMDEgMTAxMCBzc04wIGRkZGQgKioqIGRpdmwgcnFkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdmwgcnFkLEBycyIsMzIsNzQ0LAotMHgzYywKLSNlbmRpZgotImRpdmwiLE9QQ19kaXZsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMTJ9LAotCi0KLS8qIDAxMDEgMTAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGRpdmwgcnFkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2bCBycWQsYWRkcmVzc19zcmMiLDMyLDc0NSwKLTB4M2MsCi0jZW5kaWYKLSJkaXZsIixPUENfZGl2bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMTN9LAotCi0KLS8qIDAxMDEgMTAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGRpdmwgcnFkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdmwgcnFkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsNzQ2LAotMHgzYywKLSNlbmRpZgotImRpdmwiLE9QQ19kaXZsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMTR9LAotCi0KLS8qIDAwMDEgMTAxMCAwMDAwIGRkZGQgaW1tMzIgKioqIGRpdmwgcnFkLGltbTMyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2bCBycWQsaW1tMzIiLDMyLDc0NCwKLTB4M2MsCi0jZW5kaWYKLSJkaXZsIixPUENfZGl2bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsMTE1fSwKLQotCi0vKiAxMDAxIDEwMTAgc3NzcyBkZGRkICoqKiBkaXZsIHJxZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXZsIHJxZCxycnMiLDMyLDc0NCwKLTB4M2MsCi0jZW5kaWYKLSJkaXZsIixPUENfZGl2bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDExNn0sCi0KLQotLyogMTExMSBkZGRkIDFkaXNwNyAqKiogZGpueiByZCxkaXNwNyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRqbnogcmQsZGlzcDciLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImRqbnoiLE9QQ19kam56LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzB4ZixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfMURJU1A3LDAsMCwwLDAsMCwwLH0sMiwyLDExN30sCi0KLQotLyogMDExMSAxMTAwIDAwMDAgMDFpaSAqKiogZWkgaTIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJlaSBpMiIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJlaSIsT1BDX2VpLDAse0NMQVNTX0lNTSsoQVJHX0lNTTIpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfMDFJSSwwLDAsMCwwLDAsfSwxLDIsMTE4fSwKLQotCi0vKiAwMDEwIDExMDEgc3NOMCBkZGRkICoqKiBleCByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleCByZCxAcnMiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotImV4IixPUENfZXgsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDExOX0sCi0KLQotLyogMDExMCAxMTAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZXggcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleCByZCxhZGRyZXNzX3NyYyIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0iZXgiLE9QQ19leCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMjB9LAotCi0KLS8qIDAxMTAgMTEwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGV4IHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4IHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTYsCi0weDAwLAotI2VuZGlmCi0iZXgiLE9QQ19leCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTIxfSwKLQotCi0vKiAxMDEwIDExMDEgc3NzcyBkZGRkICoqKiBleCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4IHJkLHJzIiwxNiw2LAotMHgwMCwKLSNlbmRpZgotImV4IixPUENfZXgsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEyMn0sCi0KLQotLyogMDAxMCAxMTAwIHNzTjAgZGRkZCAqKiogZXhiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleGIgcmJkLEBycyIsOCwxMiwKLTB4MDAsCi0jZW5kaWYKLSJleGIiLE9QQ19leGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEyM30sCi0KLQotLyogMDExMCAxMTAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZXhiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4YiByYmQsYWRkcmVzc19zcmMiLDgsMTUsCi0weDAwLAotI2VuZGlmCi0iZXhiIixPUENfZXhiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEyNH0sCi0KLQotLyogMDExMCAxMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZXhiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxNiwKLTB4MDAsCi0jZW5kaWYKLSJleGIiLE9QQ19leGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEyNX0sCi0KLQotLyogMTAxMCAxMTAwIHNzc3MgZGRkZCAqKiogZXhiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleGIgcmJkLHJicyIsOCw2LAotMHgwMCwKLSNlbmRpZgotImV4YiIsT1BDX2V4YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTI2fSwKLQotCi0vKiAwMDAwIDExMTAgaW1tOCAqKiogZXh0MGUgaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dDBlIGltbTgiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0iZXh0MGUiLE9QQ19leHQwZSwwLHtDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhlLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMSwyLDEyN30sCi0KLQotLyogMDAwMCAxMTExIGltbTggKioqIGV4dDBmIGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHQwZiBpbW04Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotImV4dDBmIixPUENfZXh0MGYsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDEsMiwxMjh9LAotCi0KLS8qIDEwMDAgMTExMCBpbW04ICoqKiBleHQ4ZSBpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0OGUgaW1tOCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJleHQ4ZSIsT1BDX2V4dDhlLDAse0NMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGUsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwxLDIsMTI5fSwKLQotCi0vKiAxMDAwIDExMTEgaW1tOCAqKiogZXh0OGYgaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dDhmIGltbTgiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0iZXh0OGYiLE9QQ19leHQ4ZiwwLHtDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMSwyLDEzMH0sCi0KLQotLyogMTAxMSAwMDAxIGRkZGQgMTAxMCAqKiogZXh0cyBycmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHRzIHJyZCIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0iZXh0cyIsT1BDX2V4dHMsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4YSwwLDAsMCwwLDAsfSwxLDIsMTMxfSwKLQotCi0vKiAxMDExIDAwMDEgZGRkZCAwMDAwICoqKiBleHRzYiByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dHNiIHJkIiw4LDExLAotMHgwMCwKLSNlbmRpZgotImV4dHNiIixPUENfZXh0c2IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDEzMn0sCi0KLQotLyogMTAxMSAwMDAxIGRkZGQgMDExMSAqKiogZXh0c2wgcnFkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0c2wgcnFkIiwzMiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJleHRzbCIsT1BDX2V4dHNsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs3LDAsMCwwLDAsMCx9LDEsMiwxMzN9LAotCi0KLS8qIDAxMTEgMTAxMCAwMDAwIDAwMDAgKioqIGhhbHQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJoYWx0IiwxNiw4LAotMHgwMCwKLSNlbmRpZgotImhhbHQiLE9QQ19oYWx0LDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDAsMiwxMzR9LAotCi0KLS8qIDAwMTEgMTEwMSBzc04wIGRkZGQgKioqIGluIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluIHJkLEBycyIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0iaW4iLE9QQ19pbiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTM1fSwKLQotCi0vKiAwMDExIDExMDEgZGRkZCAwMTAwIGltbTE2ICoqKiBpbiByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluIHJkLGltbTE2IiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJpbiIsT1BDX2luLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNCxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxMzZ9LAotCi0KLS8qIDAwMTEgMTEwMCBzc04wIGRkZGQgKioqIGluYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5iIHJiZCxAcnMiLDgsMTIsCi0weDAwLAotI2VuZGlmCi0iaW5iIixPUENfaW5iLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMzd9LAotCi0KLS8qIDAwMTEgMTAxMCBkZGRkIDAxMDAgaW1tMTYgKioqIGluYiByYmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmIgcmJkLGltbTE2Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotImluYiIsT1BDX2luYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzQsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTM4fSwKLQotCi0vKiAwMDEwIDEwMDEgZGROMCBpbW00bTEgKioqIGluYyBAcmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jIEByZCxpbW00bTEiLDE2LDExLAotMHgxYywKLSNlbmRpZgotImluYyIsT1BDX2luYywwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxMzl9LAotCi0KLS8qIDAxMTAgMTAwMSBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogaW5jIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmMgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsMTYsMTQsCi0weDFjLAotI2VuZGlmCi0iaW5jIixPUENfaW5jLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE0MH0sCi0KLQotLyogMDExMCAxMDAxIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBpbmMgYWRkcmVzc19kc3QsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jIGFkZHJlc3NfZHN0LGltbTRtMSIsMTYsMTMsCi0weDFjLAotI2VuZGlmCi0iaW5jIixPUENfaW5jLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTQxfSwKLQotCi0vKiAxMDEwIDEwMDEgZGRkZCBpbW00bTEgKioqIGluYyByZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmMgcmQsaW1tNG0xIiwxNiw0LAotMHgxYywKLSNlbmRpZgotImluYyIsT1BDX2luYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs5LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxNDJ9LAotCi0KLS8qIDAwMTAgMTAwMCBkZE4wIGltbTRtMSAqKiogaW5jYiBAcmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jYiBAcmQsaW1tNG0xIiw4LDExLAotMHgxYywKLSNlbmRpZgotImluY2IiLE9QQ19pbmNiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDE0M30sCi0KLQotLyogMDExMCAxMDAwIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBpbmNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLDgsMTQsCi0weDFjLAotI2VuZGlmCi0iaW5jYiIsT1BDX2luY2IsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTQ0fSwKLQotCi0vKiAwMTEwIDEwMDAgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGluY2IgYWRkcmVzc19kc3QsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jYiBhZGRyZXNzX2RzdCxpbW00bTEiLDgsMTMsCi0weDFjLAotI2VuZGlmCi0iaW5jYiIsT1BDX2luY2IsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNDV9LAotCi0KLS8qIDEwMTAgMTAwMCBkZGRkIGltbTRtMSAqKiogaW5jYiByYmQsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5jYiByYmQsaW1tNG0xIiw4LDQsCi0weDFjLAotI2VuZGlmCi0iaW5jYiIsT1BDX2luY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrOCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTQ2fSwKLQotCi0vKiAwMDExIDEwMTEgc3NOMCAxMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIGluZCBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5kIEByZCxAcnMscmEiLDE2LDIxLAotMHgwNCwKLSNlbmRpZgotImluZCIsT1BDX2luZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE0N30sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMTAwMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBpbmRiIEByZCxAcnMscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5kYiBAcmQsQHJzLHJiYSIsOCwyMSwKLTB4MDQsCi0jZW5kaWYKLSJpbmRiIixPUENfaW5kYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE0OH0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAwMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBpbmliIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmliIEByZCxAcnMscmEiLDgsMjEsCi0weDA0LAotI2VuZGlmCi0iaW5pYiIsT1BDX2luaWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxNDl9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMDAgMDAwMCBhYWFhIGRkTjAgMDAwMCAqKiogaW5pYnIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluaWJyIEByZCxAcnMscmEiLDE2LDIxLAotMHgwNCwKLSNlbmRpZgotImluaWJyIixPUENfaW5pYnIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwxNTB9LAotCi0KLS8qIDAxMTEgMTAxMSAwMDAwIDAwMDAgKioqIGlyZXQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpcmV0IiwxNiwxMywKLTB4M2YsCi0jZW5kaWYKLSJpcmV0IixPUENfaXJldCwwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwwLDIsMTUxfSwKLQotCi0vKiAwMDAxIDExMTAgZGROMCBjY2NjICoqKiBqcCBjYyxAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJqcCBjYyxAcmQiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotImpwIixPUENfanAsMCx7Q0xBU1NfQ0MsQ0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLDAsMCwwLDAsfSwyLDIsMTUyfSwKLQotCi0vKiAwMTAxIDExMTAgMDAwMCBjY2NjIGFkZHJlc3NfZHN0ICoqKiBqcCBjYyxhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImpwIGNjLGFkZHJlc3NfZHN0IiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImpwIixPUENfanAsMCx7Q0xBU1NfQ0MsQ0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGUsQ0xBU1NfQklUKzAsQ0xBU1NfQ0MsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNTN9LAotCi0KLS8qIDAxMDEgMTExMCBkZE4wIGNjY2MgYWRkcmVzc19kc3QgKioqIGpwIGNjLGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImpwIGNjLGFkZHJlc3NfZHN0KHJkKSIsMTYsOCwKLTB4MDAsCi0jZW5kaWYKLSJqcCIsT1BDX2pwLDAse0NMQVNTX0NDLENMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQyxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE1NH0sCi0KLQotLyogMTExMCBjY2NjIGRpc3A4ICoqKiBqciBjYyxkaXNwOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImpyIGNjLGRpc3A4IiwxNiw2LAotMHgwMCwKLSNlbmRpZgotImpyIixPUENfanIsMCx7Q0xBU1NfQ0MsQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMHhlLENMQVNTX0NDLENMQVNTX0RJU1A4LDAsMCwwLDAsMCwwLH0sMiwyLDE1NX0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMDEwMSBpbW0xNiAqKiogbGQgQHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgQHJkLGltbTE2IiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTU2fSwKLQotCi0vKiAwMDEwIDExMTEgZGROMCBzc3NzICoqKiBsZCBAcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCBAcmQscnMiLDE2LDgsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhmLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMTU3fSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAwMTAxIGFkZHJlc3NfZHN0IGltbTE2ICoqKiBsZCBhZGRyZXNzX2RzdChyZCksaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCBhZGRyZXNzX2RzdChyZCksaW1tMTYiLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsfSwyLDYsMTU4fSwKLQotCi0vKiAwMTEwIDExMTEgZGROMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZCBhZGRyZXNzX2RzdChyZCkscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCBhZGRyZXNzX2RzdChyZCkscnMiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhmLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE1OX0sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMDEwMSBhZGRyZXNzX2RzdCBpbW0xNiAqKiogbGQgYWRkcmVzc19kc3QsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCBhZGRyZXNzX2RzdCxpbW0xNiIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzUsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLH0sMiw2LDE2MH0sCi0KLQotLyogMDExMCAxMTExIDAwMDAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGQgYWRkcmVzc19kc3QscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCBhZGRyZXNzX2RzdCxycyIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNjF9LAotCi0KLS8qIDAwMTEgMDAxMSBkZE4wIHNzc3MgaW1tMTYgKioqIGxkIHJkKGltbTE2KSxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkKGltbTE2KSxycyIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19CQSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTYyfSwKLQotCi0vKiAwMTExIDAwMTEgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkIHJkKHJ4KSxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkKHJ4KSxycyIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19CWCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMTYzfSwKLQotCi0vKiAwMDEwIDAwMDEgc3NOMCBkZGRkICoqKiBsZCByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxAcnMiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE2NH0sCi0KLQotLyogMDExMCAwMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGQgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxNjV9LAotCi0KLS8qIDAxMTAgMDAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE2Nn0sCi0KLQotLyogMDAxMCAwMDAxIDAwMDAgZGRkZCBpbW0xNiAqKiogbGQgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCByZCxpbW0xNiIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTY3fSwKLQotCi0vKiAxMDEwIDAwMDEgc3NzcyBkZGRkICoqKiBsZCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLHJzIiwxNiwzLAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxNjh9LAotCi0KLS8qIDAwMTEgMDAwMSBzc04wIGRkZGQgaW1tMTYgKioqIGxkIHJkLHJzKGltbTE2KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLHJzKGltbTE2KSIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19CQSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTY5fSwKLQotCi0vKiAwMTExIDAwMDEgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkIHJkLHJzKHJ4KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLHJzKHJ4KSIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19CWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMTcwfSwKLQotCi0vKiAwMTExIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZGEgcHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRhIHByZCxhZGRyZXNzX3NyYyIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0ibGRhIixPUENfbGRhLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxNzF9LAotCi0KLS8qIDAxMTEgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkYSBwcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRhIHByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEzLAotMHgwMCwKLSNlbmRpZgotImxkYSIsT1BDX2xkYSwwLHtDTEFTU19QUisoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE3Mn0sCi0KLQotLyogMDAxMSAwMTAwIHNzTjAgZGRkZCBpbW0xNiAqKiogbGRhIHByZCxycyhpbW0xNikgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGEgcHJkLHJzKGltbTE2KSIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRhIixPUENfbGRhLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX0JBKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxNzN9LAotCi0KLS8qIDAxMTEgMDEwMCBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGRhIHByZCxycyhyeCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGEgcHJkLHJzKHJ4KSIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRhIixPUENfbGRhLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX0JYKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwxNzR9LAotCi0KLS8qIDAwMTEgMDEwMCAwMDAwIGRkZGQgZGlzcDE2ICoqKiBsZGFyIHByZCxkaXNwMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGFyIHByZCxkaXNwMTYiLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImxkYXIiLE9QQ19sZGFyLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMTc1fSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAwMTAxIGltbTggaW1tOCAqKiogbGRiIEByZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIEByZCxpbW04Iiw4LDcsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsMTc2fSwKLQotCi0vKiAwMDEwIDExMTAgZGROMCBzc3NzICoqKiBsZGIgQHJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiBAcmQscmJzIiw4LDgsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwxNzd9LAotCi0KLS8qIDAxMDAgMTEwMCBkZE4wIDAxMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04ICoqKiBsZGIgYWRkcmVzc19kc3QocmQpLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgYWRkcmVzc19kc3QocmQpLGltbTgiLDgsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDYsMTc4fSwKLQotCi0vKiAwMTEwIDExMTAgZGROMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZGIgYWRkcmVzc19kc3QocmQpLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiBhZGRyZXNzX2RzdChyZCkscmJzIiw4LDEyLAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTc5fSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAwMTAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCAqKiogbGRiIGFkZHJlc3NfZHN0LGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgYWRkcmVzc19kc3QsaW1tOCIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzUsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw2LDE4MH0sCi0KLQotLyogMDExMCAxMTEwIDAwMDAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGRiIGFkZHJlc3NfZHN0LHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiBhZGRyZXNzX2RzdCxyYnMiLDgsMTEsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE4MX0sCi0KLQotLyogMDAxMCAwMDAwIHNzTjAgZGRkZCAqKiogbGRiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLEBycyIsOCw3LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE4Mn0sCi0KLQotLyogMDExMCAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE4M30sCi0KLQotLyogMDExMCAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxODR9LAotCi0KLS8qIDExMDAgZGRkZCBpbW04ICoqKiBsZGIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLGltbTgiLDgsNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwyLDIsMTg1fSwKLQotCi0vKiAxMDEwIDAwMDAgc3NzcyBkZGRkICoqKiBsZGIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQscmJzIiw4LDMsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTg2fSwKLQotCi0vKiAwMDExIDAwMDAgc3NOMCBkZGRkIGltbTE2ICoqKiBsZGIgcmJkLHJzKGltbTE2KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQscnMoaW1tMTYpIiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19CQSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTg3fSwKLQotCi0vKiAwMTExIDAwMDAgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkYiByYmQscnMocngpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxycyhyeCkiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0JYKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwxODh9LAotCi0KLS8qIDAwMTEgMDAxMCBkZE4wIHNzc3MgaW1tMTYgKioqIGxkYiByZChpbW0xNikscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJkKGltbTE2KSxyYnMiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX0JBKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxODl9LAotCi0KLS8qIDAxMTEgMDAxMCBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGRiIHJkKHJ4KSxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmQocngpLHJicyIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfQlgrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDE5MH0sCi0KLQotLyogMDExMSAxMTAxIHNzc3MgMWNjYyAqKiogbGRjdGwgY3RybCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkY3RsIGN0cmwscnMiLDMyLDcsCi0weDAwLAotI2VuZGlmCi0ibGRjdGwiLE9QQ19sZGN0bCwwLHtDTEFTU19DVFJMLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTXzFDQ0MsMCwwLDAsMCwwLH0sMiwyLDE5MX0sCi0KLQotLyogMDExMSAxMTAxIGRkZGQgMGNjYyAqKiogbGRjdGwgcmQsY3RybCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkY3RsIHJkLGN0cmwiLDMyLDcsCi0weDAwLAotI2VuZGlmCi0ibGRjdGwiLE9QQ19sZGN0bCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19DVFJMLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTXzBDQ0MsMCwwLDAsMCwwLH0sMiwyLDE5Mn0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAxMDAwICoqKiBsZGQgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkZCBAcmQsQHJzLHJyIiwxNiwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGQiLE9QQ19sZGQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE5M30sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAxMDAwICoqKiBsZGRiIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGRiIEByZCxAcnMscnIiLDgsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRkYiIsT1BDX2xkZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE5NH0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAwMDAwICoqKiBsZGRyIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGRyIEByZCxAcnMscnIiLDE2LDExLAotMHgwNCwKLSNlbmRpZgotImxkZHIiLE9QQ19sZGRyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwxOTV9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCAqKiogbGRkcmIgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkZHJiIEByZCxAcnMscnIiLDgsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRkcmIiLE9QQ19sZGRyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMTk2fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAgKioqIGxkaSBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRpIEByZCxAcnMscnIiLDE2LDExLAotMHgwNCwKLSNlbmRpZgotImxkaSIsT1BDX2xkaSwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTk3fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAgKioqIGxkaWIgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkaWIgQHJkLEBycyxyciIsOCwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGliIixPUENfbGRpYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTk4fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAgKioqIGxkaXIgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkaXIgQHJkLEBycyxyciIsMTYsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRpciIsT1BDX2xkaXIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDE5OX0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAwMDAwICoqKiBsZGlyYiBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRpcmIgQHJkLEBycyxyciIsOCwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGlyYiIsT1BDX2xkaXJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwyMDB9LAotCi0KLS8qIDEwMTEgMTEwMSBkZGRkIGltbTQgKioqIGxkayByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRrIHJkLGltbTQiLDE2LDUsCi0weDAwLAotI2VuZGlmCi0ibGRrIixPUENfbGRrLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwyMDF9LAotCi0KLS8qIDAwMDEgMTEwMSBkZE4wIHNzc3MgKioqIGxkbCBAcmQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIEByZCxycnMiLDMyLDExLAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjAyfSwKLQotCi0vKiAwMTAxIDExMDEgZGROMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZGwgYWRkcmVzc19kc3QocmQpLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBhZGRyZXNzX2RzdChyZCkscnJzIiwzMiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDIwM30sCi0KLQotLyogMDEwMSAxMTAxIDAwMDAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGRsIGFkZHJlc3NfZHN0LHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBhZGRyZXNzX2RzdCxycnMiLDMyLDE1LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyMDR9LAotCi0KLS8qIDAwMTEgMDExMSBkZE4wIHNzc3MgaW1tMTYgKioqIGxkbCByZChpbW0xNikscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJkKGltbTE2KSxycnMiLDMyLDE3LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19CQSsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjA1fSwKLQotCi0vKiAwMTExIDAxMTEgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkbCByZChyeCkscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJkKHJ4KSxycnMiLDMyLDE3LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19CWCsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMjA2fSwKLQotCi0vKiAwMDAxIDAxMDAgc3NOMCBkZGRkICoqKiBsZGwgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQsQHJzIiwzMiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMDd9LAotCi0KLS8qIDAxMDEgMDEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkbCBycmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLGFkZHJlc3Nfc3JjIiwzMiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIwOH0sCi0KLQotLyogMDEwMSAwMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRsIHJyZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMTMsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjA5fSwKLQotCi0vKiAwMDAxIDAxMDAgMDAwMCBkZGRkIGltbTMyICoqKiBsZGwgcnJkLGltbTMyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxpbW0zMiIsMzIsMTEsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsMjEwfSwKLQotCi0vKiAxMDAxIDAxMDAgc3NzcyBkZGRkICoqKiBsZGwgcnJkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQscnJzIiwzMiw1LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrNCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMTF9LAotCi0KLS8qIDAwMTEgMDEwMSBzc04wIGRkZGQgaW1tMTYgKioqIGxkbCBycmQscnMoaW1tMTYpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxycyhpbW0xNikiLDMyLDE3LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19CQSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjEyfSwKLQotCi0vKiAwMTExIDAxMDEgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkbCBycmQscnMocngpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxycyhyeCkiLDMyLDE3LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19CWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMjEzfSwKLQotCi0vKiAwMDAxIDExMDAgZGROMCAxMDAxIDAwMDAgc3NzcyAwMDAwIG5taW51czEgKioqIGxkbSBAcmQscnMsbiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbSBAcmQscnMsbiIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0ibGRtIixPUENfbGRtLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksMCx9LDMsNCwyMTR9LAotCi0KLS8qIDAxMDEgMTEwMCBkZE4wIDEwMDEgMDAwMCBzc3NzIDAwMDAgbm1pbnVzMSBhZGRyZXNzX2RzdCAqKiogbGRtIGFkZHJlc3NfZHN0KHJkKSxycyxuICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRtIGFkZHJlc3NfZHN0KHJkKSxycyxuIiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLH0sMyw2LDIxNX0sCi0KLQotLyogMDEwMSAxMTAwIDAwMDAgMTAwMSAwMDAwIHNzc3MgMDAwMCBubWludXMxIGFkZHJlc3NfZHN0ICoqKiBsZG0gYWRkcmVzc19kc3QscnMsbiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbSBhZGRyZXNzX2RzdCxycyxuIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksfSwzLDYsMjE2fSwKLQotCi0vKiAwMDAxIDExMDAgc3NOMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEgKioqIGxkbSByZCxAcnMsbiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbSByZCxAcnMsbiIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0ibGRtIixPUENfbGRtLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksMCx9LDMsNCwyMTd9LAotCi0KLS8qIDAxMDEgMTEwMCBzc04wIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSBhZGRyZXNzX3NyYyAqKiogbGRtIHJkLGFkZHJlc3Nfc3JjKHJzKSxuICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRtIHJkLGFkZHJlc3Nfc3JjKHJzKSxuIiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLH0sMyw2LDIxOH0sCi0KLQotLyogMDEwMSAxMTAwIDAwMDAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxIGFkZHJlc3Nfc3JjICoqKiBsZG0gcmQsYWRkcmVzc19zcmMsbiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbSByZCxhZGRyZXNzX3NyYyxuIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksfSwzLDYsMjE5fSwKLQotCi0vKiAwMDExIDEwMDEgc3NOMCAwMDAwICoqKiBsZHBzIEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcHMgQHJzIiwxNiwxMiwKLTB4M2YsCi0jZW5kaWYKLSJsZHBzIixPUENfbGRwcywwLHtDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsMjIwfSwKLQotCi0vKiAwMTExIDEwMDEgMDAwMCAwMDAwIGFkZHJlc3Nfc3JjICoqKiBsZHBzIGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRwcyBhZGRyZXNzX3NyYyIsMTYsMTYsCi0weDNmLAotI2VuZGlmCi0ibGRwcyIsT1BDX2xkcHMsMCx7Q0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwxLDQsMjIxfSwKLQotCi0vKiAwMTExIDEwMDEgc3NOMCAwMDAwIGFkZHJlc3Nfc3JjICoqKiBsZHBzIGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcHMgYWRkcmVzc19zcmMocnMpIiwxNiwxNywKLTB4M2YsCi0jZW5kaWYKLSJsZHBzIixPUENfbGRwcywwLHtDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwxLDQsMjIyfSwKLQotCi0vKiAwMDExIDAwMTEgMDAwMCBzc3NzIGRpc3AxNiAqKiogbGRyIGRpc3AxNixycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkciBkaXNwMTYscnMiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkciIsT1BDX2xkciwwLHtDTEFTU19ESVNQLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyM30sCi0KLQotLyogMDAxMSAwMDAxIDAwMDAgZGRkZCBkaXNwMTYgKioqIGxkciByZCxkaXNwMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHIgcmQsZGlzcDE2IiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZHIiLE9QQ19sZHIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjR9LAotCi0KLS8qIDAwMTEgMDAxMCAwMDAwIHNzc3MgZGlzcDE2ICoqKiBsZHJiIGRpc3AxNixyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHJiIGRpc3AxNixyYnMiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRyYiIsT1BDX2xkcmIsMCx7Q0xBU1NfRElTUCxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjV9LAotCi0KLS8qIDAwMTEgMDAwMCAwMDAwIGRkZGQgZGlzcDE2ICoqKiBsZHJiIHJiZCxkaXNwMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHJiIHJiZCxkaXNwMTYiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRyYiIsT1BDX2xkcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjZ9LAotCi0KLS8qIDAwMTEgMDExMSAwMDAwIHNzc3MgZGlzcDE2ICoqKiBsZHJsIGRpc3AxNixycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHJsIGRpc3AxNixycnMiLDMyLDE3LAotMHgwMCwKLSNlbmRpZgotImxkcmwiLE9QQ19sZHJsLDAse0NMQVNTX0RJU1AsQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMjI3fSwKLQotCi0vKiAwMDExIDAxMDEgMDAwMCBkZGRkIGRpc3AxNiAqKiogbGRybCBycmQsZGlzcDE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRybCBycmQsZGlzcDE2IiwzMiwxNywKLTB4MDAsCi0jZW5kaWYKLSJsZHJsIixPUENfbGRybCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyOH0sCi0KLQotLyogMDExMSAxMDExIDAwMDAgMTAxMCAqKiogbWJpdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm1iaXQiLDE2LDcsCi0weDM4LAotI2VuZGlmCi0ibWJpdCIsT1BDX21iaXQsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YSwwLDAsMCwwLDAsfSwwLDIsMjI5fSwKLQotCi0vKiAwMTExIDEwMTEgZGRkZCAxMTAxICoqKiBtcmVxIHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXJlcSByZCIsMTYsMTIsCi0weDE4LAotI2VuZGlmCi0ibXJlcSIsT1BDX21yZXEsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4ZCwwLDAsMCwwLDAsfSwxLDIsMjMwfSwKLQotCi0vKiAwMTExIDEwMTEgMDAwMCAxMDAxICoqKiBtcmVzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXJlcyIsMTYsNSwKLTB4MDAsCi0jZW5kaWYKLSJtcmVzIixPUENfbXJlcywwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19CSVQrOSwwLDAsMCwwLDAsfSwwLDIsMjMxfSwKLQotCi0vKiAwMTExIDEwMTEgMDAwMCAxMDAwICoqKiBtc2V0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXNldCIsMTYsNSwKLTB4MDAsCi0jZW5kaWYKLSJtc2V0IixPUENfbXNldCwwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwwLDIsMjMyfSwKLQotCi0vKiAwMDAxIDEwMDEgc3NOMCBkZGRkICoqKiBtdWx0IHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0IHJyZCxAcnMiLDE2LDcwLAotMHgzYywKLSNlbmRpZgotIm11bHQiLE9QQ19tdWx0LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjMzfSwKLQotCi0vKiAwMTAxIDEwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBtdWx0IHJyZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHQgcnJkLGFkZHJlc3Nfc3JjIiwxNiw3MCwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0IixPUENfbXVsdCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjM0fSwKLQotCi0vKiAwMTAxIDEwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBtdWx0IHJyZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0IHJyZCxhZGRyZXNzX3NyYyhycykiLDE2LDcwLAotMHgzYywKLSNlbmRpZgotIm11bHQiLE9QQ19tdWx0LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjM1fSwKLQotCi0vKiAwMDAxIDEwMDEgMDAwMCBkZGRkIGltbTE2ICoqKiBtdWx0IHJyZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHQgcnJkLGltbTE2IiwxNiw3MCwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0IixPUENfbXVsdCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDIzNn0sCi0KLQotLyogMTAwMSAxMDAxIHNzc3MgZGRkZCAqKiogbXVsdCBycmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0IHJyZCxycyIsMTYsNzAsCi0weDNjLAotI2VuZGlmCi0ibXVsdCIsT1BDX211bHQsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjM3fSwKLQotCi0vKiAwMDAxIDEwMDAgc3NOMCBkZGRkICoqKiBtdWx0bCBycWQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdGwgcnFkLEBycyIsMzIsMjgyLAotMHgzYywKLSNlbmRpZgotIm11bHRsIixPUENfbXVsdGwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMzh9LAotCi0KLS8qIDAxMDEgMTAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIG11bHRsIHJxZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHRsIHJxZCxhZGRyZXNzX3NyYyIsMzIsMjgyLAotMHgzYywKLSNlbmRpZgotIm11bHRsIixPUENfbXVsdGwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIzOX0sCi0KLQotLyogMDEwMSAxMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbXVsdGwgcnFkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHRsIHJxZCxhZGRyZXNzX3NyYyhycykiLDMyLDI4MiwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0bCIsT1BDX211bHRsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjQwfSwKLQotCi0vKiAwMDAxIDEwMDAgMDAwMCBkZGRkIGltbTMyICoqKiBtdWx0bCBycWQsaW1tMzIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0bCBycWQsaW1tMzIiLDMyLDI4MiwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0bCIsT1BDX211bHRsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsMjQxfSwKLQotCi0vKiAxMDAxIDEwMDAgc3NzcyBkZGRkICoqKiBtdWx0bCBycWQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdGwgcnFkLHJycyIsMzIsMjgyLAotMHgzYywKLSNlbmRpZgotIm11bHRsIixPUENfbXVsdGwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzgsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjQyfSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAwMDEwICoqKiBuZWcgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnIEByZCIsMTYsMTIsCi0weDNjLAotI2VuZGlmCi0ibmVnIixPUENfbmVnLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzIsMCwwLDAsMCwwLH0sMSwyLDI0M30sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMDAxMCBhZGRyZXNzX2RzdCAqKiogbmVnIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnIGFkZHJlc3NfZHN0IiwxNiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJuZWciLE9QQ19uZWcsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzIsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwyNDR9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDAwMTAgYWRkcmVzc19kc3QgKioqIG5lZyBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWcgYWRkcmVzc19kc3QocmQpIiwxNiwxNiwKLTB4M2MsCi0jZW5kaWYKLSJuZWciLE9QQ19uZWcsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsyLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMjQ1fSwKLQotCi0vKiAxMDAwIDExMDEgZGRkZCAwMDEwICoqKiBuZWcgcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWcgcmQiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0ibmVnIixPUENfbmVnLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsyLDAsMCwwLDAsMCx9LDEsMiwyNDZ9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDAwMTAgKioqIG5lZ2IgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnYiBAcmQiLDgsMTIsCi0weDNjLAotI2VuZGlmCi0ibmVnYiIsT1BDX25lZ2IsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMiwwLDAsMCwwLDAsfSwxLDIsMjQ3fSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAwMDEwIGFkZHJlc3NfZHN0ICoqKiBuZWdiIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnYiBhZGRyZXNzX2RzdCIsOCwxNSwKLTB4M2MsCi0jZW5kaWYKLSJuZWdiIixPUENfbmVnYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDI0OH0sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMDAxMCBhZGRyZXNzX2RzdCAqKiogbmVnYiBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWdiIGFkZHJlc3NfZHN0KHJkKSIsOCwxNiwKLTB4M2MsCi0jZW5kaWYKLSJuZWdiIixPUENfbmVnYiwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzIsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwyNDl9LAotCi0KLS8qIDEwMDAgMTEwMCBkZGRkIDAwMTAgKioqIG5lZ2IgcmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibmVnYiByYmQiLDgsNywKLTB4M2MsCi0jZW5kaWYKLSJuZWdiIixPUENfbmVnYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMiwwLDAsMCwwLDAsfSwxLDIsMjUwfSwKLQotCi0vKiAxMDAwIDExMDEgMDAwMCAwMTExICoqKiBub3AgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJub3AiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0ibm9wIixPUENfbm9wLDAsezB9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCs3LDAsMCwwLDAsMCx9LDAsMiwyNTF9LAotCi0KLS8qIDAwMDAgMDEwMSBzc04wIGRkZGQgKioqIG9yIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yIHJkLEBycyIsMTYsNywKLTB4MzgsCi0jZW5kaWYKLSJvciIsT1BDX29yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjUyfSwKLQotCi0vKiAwMTAwIDAxMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBvciByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgzOCwKLSNlbmRpZgotIm9yIixPUENfb3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI1M30sCi0KLQotLyogMDEwMCAwMTAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogb3IgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3IgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4MzgsCi0jZW5kaWYKLSJvciIsT1BDX29yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjU0fSwKLQotCi0vKiAwMDAwIDAxMDEgMDAwMCBkZGRkIGltbTE2ICoqKiBvciByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yIHJkLGltbTE2IiwxNiw3LAotMHgzOCwKLSNlbmRpZgotIm9yIixPUENfb3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyNTV9LAotCi0KLS8qIDEwMDAgMDEwMSBzc3NzIGRkZGQgKioqIG9yIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3IgcmQscnMiLDE2LDQsCi0weDM4LAotI2VuZGlmCi0ib3IiLE9QQ19vciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrNSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNTZ9LAotCi0KLS8qIDAwMDAgMDEwMCBzc04wIGRkZGQgKioqIG9yYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3JiIHJiZCxAcnMiLDgsNywKLTB4M2MsCi0jZW5kaWYKLSJvcmIiLE9QQ19vcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNTd9LAotCi0KLS8qIDAxMDAgMDEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIG9yYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvcmIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDNjLAotI2VuZGlmCi0ib3JiIixPUENfb3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNTh9LAotCi0KLS8qIDAxMDAgMDEwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIG9yYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3JiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDNjLAotI2VuZGlmCi0ib3JiIixPUENfb3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjU5fSwKLQotCi0vKiAwMDAwIDAxMDAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogb3JiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3JiIHJiZCxpbW04Iiw4LDcsCi0weDNjLAotI2VuZGlmCi0ib3JiIixPUENfb3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCwyNjB9LAotCi0KLS8qIDEwMDAgMDEwMCBzc3NzIGRkZGQgKioqIG9yYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3JiIHJiZCxyYnMiLDgsNCwKLTB4M2MsCi0jZW5kaWYKLSJvcmIiLE9QQ19vcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjYxfSwKLQotCi0vKiAwMDExIDExMTEgZGROMCBzc3NzICoqKiBvdXQgQHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0IEByZCxycyIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXQiLE9QQ19vdXQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDI2Mn0sCi0KLQotLyogMDAxMSAxMDExIHNzc3MgMDExMCBpbW0xNiAqKiogb3V0IGltbTE2LHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0IGltbTE2LHJzIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dCIsT1BDX291dCwwLHtDTEFTU19JTU0rKEFSR19JTU0xNiksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzYsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjYzfSwKLQotCi0vKiAwMDExIDExMTAgZGROMCBzc3NzICoqKiBvdXRiIEByZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRiIEByZCxyYnMiLDgsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRiIixPUENfb3V0YiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhlLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjY0fSwKLQotCi0vKiAwMDExIDEwMTAgc3NzcyAwMTEwIGltbTE2ICoqKiBvdXRiIGltbTE2LHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGIgaW1tMTYscmJzIiw4LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0YiIsT1BDX291dGIsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NMTYpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCs2LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDI2NX0sCi0KLQotLyogMDAxMSAxMDExIHNzTjAgMTAxMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBvdXRkIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRkIEByZCxAcnMscmEiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0ZCIsT1BDX291dGQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDI2Nn0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMTAxMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBvdXRkYiBAcmQsQHJzLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGRiIEByZCxAcnMscmJhIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dGRiIixPUENfb3V0ZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDI2N30sCi0KLQotLyogMDAxMSAxMDExIHNzTjAgMDAxMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBvdXRpIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXRpIEByZCxAcnMscmEiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0aSIsT1BDX291dGksMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwyNjh9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogb3V0aWIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGliIEByZCxAcnMscmEiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0aWIiLE9QQ19vdXRpYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDI2OX0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAxMCAwMDAwIGFhYWEgZGROMCAwMDAwICoqKiBvdXRpYnIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGliciBAcmQsQHJzLHJhIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dGliciIsT1BDX291dGliciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDI3MH0sCi0KLQotLyogMDAwMSAwMTExIHNzTjAgZGROMCAqKiogcG9wIEByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3AgQHJkLEBycyIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0icG9wIixPUENfcG9wLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFR04wKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNzF9LAotCi0KLS8qIDAxMDEgMDExMSBzc04wIGRkTjAgYWRkcmVzc19kc3QgKioqIHBvcCBhZGRyZXNzX2RzdChyZCksQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wIGFkZHJlc3NfZHN0KHJkKSxAcnMiLDE2LDE2LAotMHgwMCwKLSNlbmRpZgotInBvcCIsT1BDX3BvcCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjcyfSwKLQotCi0vKiAwMTAxIDAxMTEgc3NOMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBwb3AgYWRkcmVzc19kc3QsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wIGFkZHJlc3NfZHN0LEBycyIsMTYsMTYsCi0weDAwLAotI2VuZGlmCi0icG9wIixPUENfcG9wLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI3M30sCi0KLQotLyogMTAwMSAwMTExIHNzTjAgZGRkZCAqKiogcG9wIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcCByZCxAcnMiLDE2LDgsCi0weDAwLAotI2VuZGlmCi0icG9wIixPUENfcG9wLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjc0fSwKLQotCi0vKiAwMDAxIDAxMDEgc3NOMCBkZE4wICoqKiBwb3BsIEByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3BsIEByZCxAcnMiLDMyLDE5LAotMHgwMCwKLSNlbmRpZgotInBvcGwiLE9QQ19wb3BsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFR04wKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNzV9LAotCi0KLS8qIDAxMDEgMDEwMSBzc04wIGRkTjAgYWRkcmVzc19kc3QgKioqIHBvcGwgYWRkcmVzc19kc3QocmQpLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcGwgYWRkcmVzc19kc3QocmQpLEBycyIsMzIsMjMsCi0weDAwLAotI2VuZGlmCi0icG9wbCIsT1BDX3BvcGwsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI3Nn0sCi0KLQotLyogMDEwMSAwMTAxIHNzTjAgMDAwMCBhZGRyZXNzX2RzdCAqKiogcG9wbCBhZGRyZXNzX2RzdCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3BsIGFkZHJlc3NfZHN0LEBycyIsMzIsMjMsCi0weDAwLAotI2VuZGlmCi0icG9wbCIsT1BDX3BvcGwsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjc3fSwKLQotCi0vKiAxMDAxIDAxMDEgc3NOMCBkZGRkICoqKiBwb3BsIHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3BsIHJyZCxAcnMiLDMyLDEyLAotMHgwMCwKLSNlbmRpZgotInBvcGwiLE9QQ19wb3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjc4fSwKLQotCi0vKiAwMDAxIDAwMTEgZGROMCBzc04wICoqKiBwdXNoIEByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNoIEByZCxAcnMiLDE2LDEzLAotMHgwMCwKLSNlbmRpZgotInB1c2giLE9QQ19wdXNoLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFR04wKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyNzl9LAotCi0KLS8qIDAxMDEgMDAxMSBkZE4wIDAwMDAgYWRkcmVzc19zcmMgKioqIHB1c2ggQHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaCBAcmQsYWRkcmVzc19zcmMiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotInB1c2giLE9QQ19wdXNoLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI4MH0sCi0KLQotLyogMDEwMSAwMDExIGRkTjAgc3NOMCBhZGRyZXNzX3NyYyAqKiogcHVzaCBAcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaCBAcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJwdXNoIixPUENfcHVzaCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjgxfSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAxMDAxIGltbTE2ICoqKiBwdXNoIEByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2ggQHJkLGltbTE2IiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJwdXNoIixPUENfcHVzaCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyODJ9LAotCi0KLS8qIDEwMDEgMDAxMSBkZE4wIHNzc3MgKioqIHB1c2ggQHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaCBAcmQscnMiLDE2LDksCi0weDAwLAotI2VuZGlmCi0icHVzaCIsT1BDX3B1c2gsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyODN9LAotCi0KLS8qIDAwMDEgMDAwMSBkZE4wIHNzTjAgKioqIHB1c2hsIEByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNobCBAcmQsQHJzIiwzMiwyMCwKLTB4MDAsCi0jZW5kaWYKLSJwdXNobCIsT1BDX3B1c2hsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFR04wKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyODR9LAotCi0KLS8qIDAxMDEgMDAwMSBkZE4wIDAwMDAgYWRkcmVzc19zcmMgKioqIHB1c2hsIEByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2hsIEByZCxhZGRyZXNzX3NyYyIsMzIsMjEsCi0weDAwLAotI2VuZGlmCi0icHVzaGwiLE9QQ19wdXNobCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyODV9LAotCi0KLS8qIDAxMDEgMDAwMSBkZE4wIHNzTjAgYWRkcmVzc19zcmMgKioqIHB1c2hsIEByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNobCBAcmQsYWRkcmVzc19zcmMocnMpIiwzMiwyMSwKLTB4MDAsCi0jZW5kaWYKLSJwdXNobCIsT1BDX3B1c2hsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyODZ9LAotCi0KLS8qIDEwMDEgMDAwMSBkZE4wIHNzc3MgKioqIHB1c2hsIEByZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNobCBAcmQscnJzIiwzMiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJwdXNobCIsT1BDX3B1c2hsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjg3fSwKLQotCi0vKiAwMDEwIDAwMTEgZGROMCBpbW00ICoqKiByZXMgQHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXMgQHJkLGltbTQiLDE2LDExLAotMHgwMCwKLSNlbmRpZgotInJlcyIsT1BDX3JlcywwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI4OH0sCi0KLQotLyogMDExMCAwMDExIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogcmVzIGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzIGFkZHJlc3NfZHN0KHJkKSxpbW00IiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJyZXMiLE9QQ19yZXMsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyODl9LAotCi0KLS8qIDAxMTAgMDAxMSAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIHJlcyBhZGRyZXNzX2RzdCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzIGFkZHJlc3NfZHN0LGltbTQiLDE2LDEzLAotMHgwMCwKLSNlbmRpZgotInJlcyIsT1BDX3JlcywwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjkwfSwKLQotCi0vKiAxMDEwIDAwMTEgZGRkZCBpbW00ICoqKiByZXMgcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlcyByZCxpbW00IiwxNiw0LAotMHgwMCwKLSNlbmRpZgotInJlcyIsT1BDX3JlcywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI5MX0sCi0KLQotLyogMDAxMCAwMDExIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwICoqKiByZXMgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXMgcmQscnMiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotInJlcyIsT1BDX3JlcywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMjkyfSwKLQotCi0vKiAwMDEwIDAwMTAgZGROMCBpbW00ICoqKiByZXNiIEByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzYiBAcmQsaW1tNCIsOCwxMSwKLTB4MDAsCi0jZW5kaWYKLSJyZXNiIixPUENfcmVzYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI5M30sCi0KLQotLyogMDExMCAwMDEwIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogcmVzYiBhZGRyZXNzX2RzdChyZCksaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlc2IgYWRkcmVzc19kc3QocmQpLGltbTQiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0icmVzYiIsT1BDX3Jlc2IsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyOTR9LAotCi0KLS8qIDAxMTAgMDAxMCAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIHJlc2IgYWRkcmVzc19kc3QsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlc2IgYWRkcmVzc19kc3QsaW1tNCIsOCwxMywKLTB4MDAsCi0jZW5kaWYKLSJyZXNiIixPUENfcmVzYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjk1fSwKLQotCi0vKiAxMDEwIDAwMTAgZGRkZCBpbW00ICoqKiByZXNiIHJiZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzYiByYmQsaW1tNCIsOCw0LAotMHgwMCwKLSNlbmRpZgotInJlc2IiLE9QQ19yZXNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMjk2fSwKLQotCi0vKiAwMDEwIDAwMTAgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIHJlc2IgcmJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzYiByYmQscnMiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icmVzYiIsT1BDX3Jlc2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDI5N30sCi0KLQotLyogMTAwMCAxMTAxIGZsYWdzIDAwMTEgKioqIHJlc2ZsZyBmbGFncyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlc2ZsZyBmbGFncyIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJyZXNmbGciLE9QQ19yZXNmbGcsMCx7Q0xBU1NfRkxBR1MsfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19GTEFHUyxDTEFTU19CSVQrMywwLDAsMCwwLDAsfSwxLDIsMjk4fSwKLQotCi0vKiAxMDAxIDExMTAgMDAwMCBjY2NjICoqKiByZXQgY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXQgY2MiLDE2LDEwLAotMHgwMCwKLSNlbmRpZgotInJldCIsT1BDX3JldCwwLHtDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX0NDLDAsMCwwLDAsMCx9LDEsMiwyOTl9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAwSTAgKioqIHJsIHJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJybCByZCxpbW0xb3IyIiwxNiw2LAotMHgzYywKLSNlbmRpZgotInJsIixPUENfcmwsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrMCwwLDAsMCwwLDAsfSwyLDIsMzAwfSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAwMEkwICoqKiBybGIgcmJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJybGIgcmJkLGltbTFvcjIiLDgsNiwKLTB4M2MsCi0jZW5kaWYKLSJybGIiLE9QQ19ybGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrMCwwLDAsMCwwLDAsfSwyLDIsMzAxfSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMEkwICoqKiBybGMgcmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJsYyByZCxpbW0xb3IyIiwxNiw2LAotMHgzYywKLSNlbmRpZgotInJsYyIsT1BDX3JsYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMis4LDAsMCwwLDAsMCx9LDIsMiwzMDJ9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDEwSTAgKioqIHJsY2IgcmJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJybGNiIHJiZCxpbW0xb3IyIiw4LDksCi0weDEwLAotI2VuZGlmCi0icmxjYiIsT1BDX3JsY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrOCwwLDAsMCwwLDAsfSwyLDIsMzAzfSwKLQotCi0vKiAxMDExIDExMTAgYWFhYSBiYmJiICoqKiBybGRiIHJiYixyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJybGRiIHJiYixyYmEiLDgsOSwKLTB4MTAsCi0jZW5kaWYKLSJybGRiIixPUENfcmxkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFRysoQVJHX1JCKSwwLDAsMCwwLDAsfSwyLDIsMzA0fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMUkwICoqKiByciByZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnIgcmQsaW1tMW9yMiIsMTYsNiwKLTB4M2MsCi0jZW5kaWYKLSJyciIsT1BDX3JyLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzQsMCwwLDAsMCwwLH0sMiwyLDMwNX0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMDFJMCAqKiogcnJiIHJiZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnJiIHJiZCxpbW0xb3IyIiw4LDYsCi0weDNjLAotI2VuZGlmCi0icnJiIixPUENfcnJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzQsMCwwLDAsMCwwLH0sMiwyLDMwNn0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTFJMCAqKiogcnJjIHJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJycmMgcmQsaW1tMW9yMiIsMTYsNiwKLTB4M2MsCi0jZW5kaWYKLSJycmMiLE9QQ19ycmMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrMHhjLDAsMCwwLDAsMCx9LDIsMiwzMDd9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDExSTAgKioqIHJyY2IgcmJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJycmNiIHJiZCxpbW0xb3IyIiw4LDksCi0weDEwLAotI2VuZGlmCi0icnJjYiIsT1BDX3JyY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrMHhjLDAsMCwwLDAsMCx9LDIsMiwzMDh9LAotCi0KLS8qIDEwMTEgMTEwMCBhYWFhIGJiYmIgKioqIHJyZGIgcmJiLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJyZGIgcmJiLHJiYSIsOCw5LAotMHgxMCwKLSNlbmRpZgotInJyZGIiLE9QQ19ycmRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHKyhBUkdfUkIpLDAsMCwwLDAsMCx9LDIsMiwzMDl9LAotCi0KLS8qIDAwMTEgMDExMCBpbW04ICoqKiByc3ZkMzYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkMzYiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZDM2IixPUENfcnN2ZDM2LDAsezB9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTB9LAotCi0KLS8qIDAwMTEgMTAwMCBpbW04ICoqKiByc3ZkMzggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkMzgiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZDM4IixPUENfcnN2ZDM4LDAsezB9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrOCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTF9LAotCi0KLS8qIDAxMTEgMTAwMCBpbW04ICoqKiByc3ZkNzggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkNzgiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZDc4IixPUENfcnN2ZDc4LDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrOCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTJ9LAotCi0KLS8qIDAxMTEgMTExMCBpbW04ICoqKiByc3ZkN2UgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkN2UiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZDdlIixPUENfcnN2ZDdlLDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhlLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxM30sCi0KLQotLyogMTAwMSAxMTAxIGltbTggKioqIHJzdmQ5ZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmQ5ZCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkOWQiLE9QQ19yc3ZkOWQsMCx7MH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsweGQsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzE0fSwKLQotCi0vKiAxMDAxIDExMTEgaW1tOCAqKiogcnN2ZDlmICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZDlmIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmQ5ZiIsT1BDX3JzdmQ5ZiwwLHswfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTV9LAotCi0KLS8qIDEwMTEgMTAwMSBpbW04ICoqKiByc3ZkYjkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkYjkiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZGI5IixPUENfcnN2ZGI5LDAsezB9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs5LENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxNn0sCi0KLQotLyogMTAxMSAxMTExIGltbTggKioqIHJzdmRiZiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmRiZiIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkYmYiLE9QQ19yc3ZkYmYsMCx7MH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTd9LAotCi0KLS8qIDEwMTEgMDExMSBzc3NzIGRkZGQgKioqIHNiYyByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNiYyByZCxycyIsMTYsNSwKLTB4M2MsCi0jZW5kaWYKLSJzYmMiLE9QQ19zYmMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrNyxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzMTh9LAotCi0KLS8qIDEwMTEgMDExMCBzc3NzIGRkZGQgKioqIHNiY2IgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNiY2IgcmJkLHJicyIsOCw1LAotMHgzZiwKLSNlbmRpZgotInNiY2IiLE9QQ19zYmNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzE5fSwKLQotCi0vKiAwMTExIDExMTEgaW1tOCAqKiogc2MgaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNjIGltbTgiLDgsMzMsCi0weDNmLAotI2VuZGlmCi0ic2MiLE9QQ19zYywwLHtDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMSwyLDMyMH0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGEgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZGEgcmQscnMiLDE2LDE1LAotMHgzYywKLSNlbmRpZgotInNkYSIsT1BDX3NkYSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyMX0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMTAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGFiIHJiZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNkYWIgcmJkLHJzIiw4LDE1LAotMHgzYywKLSNlbmRpZgotInNkYWIiLE9QQ19zZGFiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzIyfSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMTExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkYWwgcnJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2RhbCBycmQscnMiLDMyLDE1LAotMHgzYywKLSNlbmRpZgotInNkYWwiLE9QQ19zZGFsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzIzfSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkbCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNkbCByZCxycyIsMTYsMTUsCi0weDM4LAotI2VuZGlmCi0ic2RsIixPUENfc2RsLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyNH0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMDAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGxiIHJiZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNkbGIgcmJkLHJzIiw4LDE1LAotMHgzOCwKLSNlbmRpZgotInNkbGIiLE9QQ19zZGxiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyNX0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDExMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGxsIHJyZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNkbGwgcnJkLHJzIiwzMiwxNSwKLTB4MzgsCi0jZW5kaWYKLSJzZGxsIixPUENfc2RsbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMjZ9LAotCi0KLS8qIDAwMTAgMDEwMSBkZE4wIGltbTQgKioqIHNldCBAcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldCBAcmQsaW1tNCIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0ic2V0IixPUENfc2V0LDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzI3fSwKLQotCi0vKiAwMTEwIDAxMDEgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBzZXQgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXQgYWRkcmVzc19kc3QocmQpLGltbTQiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotInNldCIsT1BDX3NldCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDMyOH0sCi0KLQotLyogMDExMCAwMTAxIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogc2V0IGFkZHJlc3NfZHN0LGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXQgYWRkcmVzc19kc3QsaW1tNCIsMTYsMTMsCi0weDAwLAotI2VuZGlmCi0ic2V0IixPUENfc2V0LDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzMjl9LAotCi0KLS8qIDEwMTAgMDEwMSBkZGRkIGltbTQgKioqIHNldCByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0IHJkLGltbTQiLDE2LDQsCi0weDAwLAotI2VuZGlmCi0ic2V0IixPUENfc2V0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs1LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzMwfSwKLQotCi0vKiAwMDEwIDAxMDEgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIHNldCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldCByZCxycyIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0ic2V0IixPUENfc2V0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMzF9LAotCi0KLS8qIDAwMTAgMDEwMCBkZE4wIGltbTQgKioqIHNldGIgQHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXRiIEByZCxpbW00Iiw4LDExLAotMHgwMCwKLSNlbmRpZgotInNldGIiLE9QQ19zZXRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzMyfSwKLQotCi0vKiAwMTEwIDAxMDAgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBzZXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0YiBhZGRyZXNzX2RzdChyZCksaW1tNCIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJzZXRiIixPUENfc2V0YiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDMzM30sCi0KLQotLyogMDExMCAwMTAwIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogc2V0YiBhZGRyZXNzX2RzdCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0YiBhZGRyZXNzX2RzdCxpbW00Iiw4LDEzLAotMHgwMCwKLSNlbmRpZgotInNldGIiLE9QQ19zZXRiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzMzR9LAotCi0KLS8qIDEwMTAgMDEwMCBkZGRkIGltbTQgKioqIHNldGIgcmJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXRiIHJiZCxpbW00Iiw4LDQsCi0weDAwLAotI2VuZGlmCi0ic2V0YiIsT1BDX3NldGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzMzV9LAotCi0KLS8qIDAwMTAgMDEwMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogc2V0YiByYmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXRiIHJiZCxycyIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJzZXRiIixPUENfc2V0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzM2fSwKLQotCi0vKiAxMDAwIDExMDEgZmxhZ3MgMDAwMSAqKiogc2V0ZmxnIGZsYWdzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0ZmxnIGZsYWdzIiwxNiw3LAotMHgzYywKLSNlbmRpZgotInNldGZsZyIsT1BDX3NldGZsZywwLHtDTEFTU19GTEFHUyx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX0ZMQUdTLENMQVNTX0JJVCsxLDAsMCwwLDAsMCx9LDEsMiwzMzd9LAotCi0KLS8qIDAwMTEgMTAxMCBkZGRkIDAxMDEgaW1tMTYgKioqIHNpbmIgcmJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2luYiByYmQsaW1tMTYiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzaW5iIixPUENfc2luYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMzM4fSwKLQotCi0vKiAwMDExIDEwMTEgZGRkZCAwMTAxIGltbTE2ICoqKiBzaW5iIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2luYiByZCxpbW0xNiIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNpbmIiLE9QQ19zaW5iLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwzMzl9LAotCi0KLS8qIDAwMTEgMTAxMSBzc04wIDEwMDAgMDAwMSBhYWFhIGRkTjAgMTAwMCAqKiogc2luZCBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2luZCBAcmQsQHJzLHJhIiwxNiwwLAotMHgwMCwKLSNlbmRpZgotInNpbmQiLE9QQ19zaW5kLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzQwfSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAxMDAwIDAwMDEgYWFhYSBkZE4wIDEwMDAgKioqIHNpbmRiIEByZCxAcnMscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2luZGIgQHJkLEBycyxyYmEiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzaW5kYiIsT1BDX3NpbmRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzQxfSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIHNpbmliIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzaW5pYiBAcmQsQHJzLHJhIiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic2luaWIiLE9QQ19zaW5pYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDM0Mn0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIGFhYWEgZGROMCAwMDAwICoqKiBzaW5pYnIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNpbmliciBAcmQsQHJzLHJhIiwxNiwwLAotMHgwMCwKLSNlbmRpZgotInNpbmliciIsT1BDX3NpbmliciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM0M30sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTAwMSAwMDAwIDAwMDAgaW1tOCAqKiogc2xhIHJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzbGEgcmQsaW1tOCIsMTYsMTMsCi0weDNjLAotI2VuZGlmCi0ic2xhIixPUENfc2xhLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDR9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDEwMDEgIDAwMDAgMDAwMCBpbW04ICoqKiBzbGFiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2xhYiByYmQsaW1tOCIsOCwxMywKLTB4M2MsCi0jZW5kaWYKLSJzbGFiIixPUENfc2xhYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ1fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMTAxIDAwMDAgMDAwMCBpbW04ICoqKiBzbGFsIHJyZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2xhbCBycmQsaW1tOCIsMzIsMTMsCi0weDNjLAotI2VuZGlmCi0ic2xhbCIsT1BDX3NsYWwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ2fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMDAxIDAwMDAgMDAwMCBpbW04ICoqKiBzbGwgcmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNsbCByZCxpbW04IiwxNiwxMywKLTB4MzgsCi0jZW5kaWYKLSJzbGwiLE9QQ19zbGwsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw0LDM0N30sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMDAwMSAgMDAwMCAwMDAwIGltbTggKioqIHNsbGIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzbGxiIHJiZCxpbW04Iiw4LDEzLAotMHgzOCwKLSNlbmRpZgotInNsbGIiLE9QQ19zbGxiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDh9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAxMDEgMDAwMCAwMDAwIGltbTggKioqIHNsbGwgcnJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzbGxsIHJyZCxpbW04IiwzMiwxMywKLTB4MzgsCi0jZW5kaWYKLSJzbGxsIixPUENfc2xsbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ5fSwKLQotCi0vKiAwMDExIDEwMTEgc3NzcyAwMTExIGltbTE2ICoqKiBzb3V0IGltbTE2LHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic291dCBpbW0xNixycyIsMTYsMCwKLTB4MDAsCi0jZW5kaWYKLSJzb3V0IixPUENfc291dCwwLHtDTEFTU19JTU0rKEFSR19JTU0xNiksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzcsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMzUwfSwKLQotCi0vKiAwMDExIDEwMTAgc3NzcyAwMTExIGltbTE2ICoqKiBzb3V0YiBpbW0xNixyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzb3V0YiBpbW0xNixyYnMiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzb3V0YiIsT1BDX3NvdXRiLDAse0NMQVNTX0lNTSsoQVJHX0lNTTE2KSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrNyxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwzNTF9LAotCi0KLS8qIDAwMTEgMTAxMSBzc04wIDEwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogc291dGQgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNvdXRkIEByZCxAcnMscmEiLDE2LDAsCi0weDAwLAotI2VuZGlmCi0ic291dGQiLE9QQ19zb3V0ZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzUyfSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAxMDExIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIHNvdXRkYiBAcmQsQHJzLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNvdXRkYiBAcmQsQHJzLHJiYSIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNvdXRkYiIsT1BDX3NvdXRkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzUzfSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDExIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIHNvdXRpYiBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic291dGliIEByZCxAcnMscmEiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzb3V0aWIiLE9QQ19zb3V0aWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwzNTR9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMTEgMDAwMCBhYWFhIGRkTjAgMDAwMCAqKiogc291dGliciBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic291dGliciBAcmQsQHJzLHJhIiwxNiwwLAotMHgwMCwKLSNlbmRpZgotInNvdXRpYnIiLE9QQ19zb3V0aWJyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMzU1fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMDAxIDExMTEgMTExMSBuaW04ICoqKiBzcmEgcmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNyYSByZCxpbW04IiwxNiwxMywKLTB4M2MsCi0jZW5kaWYKLSJzcmEiLE9QQ19zcmEsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNTZ9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDEwMDEgMDAwMCAwMDAwIG5pbTggKioqIHNyYWIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzcmFiIHJiZCxpbW04Iiw4LDEzLAotMHgzYywKLSNlbmRpZgotInNyYWIiLE9QQ19zcmFiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNTd9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDExMDEgMTExMSAxMTExIG5pbTggKioqIHNyYWwgcnJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzcmFsIHJyZCxpbW04IiwzMiwxMywKLTB4M2MsCi0jZW5kaWYKLSJzcmFsIixPUENfc3JhbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19OSU04KSwwLDAsfSwyLDQsMzU4fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMDAxIDExMTEgMTExMSBuaW04ICoqKiBzcmwgcmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNybCByZCxpbW04IiwxNiwxMywKLTB4M2MsCi0jZW5kaWYKLSJzcmwiLE9QQ19zcmwsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNTl9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDAwMDEgMDAwMCAwMDAwIG5pbTggKioqIHNybGIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzcmxiIHJiZCxpbW04Iiw4LDEzLAotMHgzYywKLSNlbmRpZgotInNybGIiLE9QQ19zcmxiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNjB9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAxMDEgMTExMSAxMTExIG5pbTggKioqIHNybGwgcnJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzcmxsIHJyZCxpbW04IiwzMiwxMywKLTB4M2MsCi0jZW5kaWYKLSJzcmxsIixPUENfc3JsbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfTklNOCksMCwwLH0sMiw0LDM2MX0sCi0KLQotLyogMDAwMCAwMDExIHNzTjAgZGRkZCAqKiogc3ViIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YiByZCxAcnMiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0ic3ViIixPUENfc3ViLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzYyfSwKLQotCi0vKiAwMTAwIDAwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWIgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWIgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDNjLAotI2VuZGlmCi0ic3ViIixPUENfc3ViLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNjN9LAotCi0KLS8qIDAxMDAgMDAxMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YiByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWIgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4M2MsCi0jZW5kaWYKLSJzdWIiLE9QQ19zdWIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNjR9LAotCi0KLS8qIDAwMDAgMDAxMSAwMDAwIGRkZGQgaW1tMTYgKioqIHN1YiByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YiByZCxpbW0xNiIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJzdWIiLE9QQ19zdWIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwzNjV9LAotCi0KLS8qIDEwMDAgMDAxMSBzc3NzIGRkZGQgKioqIHN1YiByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YiByZCxycyIsMTYsNCwKLTB4M2MsCi0jZW5kaWYKLSJzdWIiLE9QQ19zdWIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzY2fSwKLQotCi0vKiAwMDAwIDAwMTAgc3NOMCBkZGRkICoqKiBzdWJiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJiIHJiZCxAcnMiLDgsNywKLTB4M2YsCi0jZW5kaWYKLSJzdWJiIixPUENfc3ViYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM2N30sCi0KLQotLyogMDEwMCAwMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogc3ViYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgzZiwKLSNlbmRpZgotInN1YmIiLE9QQ19zdWJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNjh9LAotCi0KLS8qIDAxMDAgMDAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4M2YsCi0jZW5kaWYKLSJzdWJiIixPUENfc3ViYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDM2OX0sCi0KLQotLyogMDAwMCAwMDEwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIHN1YmIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJiIHJiZCxpbW04Iiw4LDcsCi0weDNmLAotI2VuZGlmCi0ic3ViYiIsT1BDX3N1YmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDM3MH0sCi0KLQotLyogMTAwMCAwMDEwIHNzc3MgZGRkZCAqKiogc3ViYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViYiByYmQscmJzIiw4LDQsCi0weDNmLAotI2VuZGlmCi0ic3ViYiIsT1BDX3N1YmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzcxfSwKLQotCi0vKiAwMDAxIDAwMTAgc3NOMCBkZGRkICoqKiBzdWJsIHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJsIHJyZCxAcnMiLDMyLDE0LAotMHgzYywKLSNlbmRpZgotInN1YmwiLE9QQ19zdWJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzcyfSwKLQotCi0vKiAwMTAxIDAwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWJsIHJyZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmwgcnJkLGFkZHJlc3Nfc3JjIiwzMiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJzdWJsIixPUENfc3VibCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzczfSwKLQotCi0vKiAwMTAxIDAwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWJsIHJyZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJsIHJyZCxhZGRyZXNzX3NyYyhycykiLDMyLDE2LAotMHgzYywKLSNlbmRpZgotInN1YmwiLE9QQ19zdWJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzc0fSwKLQotCi0vKiAwMDAxIDAwMTAgMDAwMCBkZGRkIGltbTMyICoqKiBzdWJsIHJyZCxpbW0zMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmwgcnJkLGltbTMyIiwzMiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJzdWJsIixPUENfc3VibCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSwwLDAsMCwwLH0sMiw2LDM3NX0sCi0KLQotLyogMTAwMSAwMDEwIHNzc3MgZGRkZCAqKiogc3VibCBycmQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3VibCBycmQscnJzIiwzMiw4LAotMHgzYywKLSNlbmRpZgotInN1YmwiLE9QQ19zdWJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM3Nn0sCi0KLQotLyogMTAxMCAxMTExIGRkZGQgY2NjYyAqKiogdGNjIGNjLHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGNjIGNjLHJkIiwxNiw1LAotMHgwMCwKLSNlbmRpZgotInRjYyIsT1BDX3RjYywwLHtDTEFTU19DQyxDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGYsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsMCwwLDAsMCx9LDIsMiwzNzd9LAotCi0KLS8qIDEwMTAgMTExMCBkZGRkIGNjY2MgKioqIHRjY2IgY2MscmJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGNjYiBjYyxyYmQiLDgsNSwKLTB4MDAsCi0jZW5kaWYKLSJ0Y2NiIixPUENfdGNjYiwwLHtDTEFTU19DQyxDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsMCwwLDAsMCx9LDIsMiwzNzh9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDAxMDAgKioqIHRlc3QgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdCBAcmQiLDE2LDgsCi0weDE4LAotI2VuZGlmCi0idGVzdCIsT1BDX3Rlc3QsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNCwwLDAsMCwwLDAsfSwxLDIsMzc5fSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAwMTAwIGFkZHJlc3NfZHN0ICoqKiB0ZXN0IGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdCBhZGRyZXNzX2RzdCIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0idGVzdCIsT1BDX3Rlc3QsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzQsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODB9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDAxMDAgYWRkcmVzc19kc3QgKioqIHRlc3QgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdCBhZGRyZXNzX2RzdChyZCkiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotInRlc3QiLE9QQ190ZXN0LDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4MX0sCi0KLQotLyogMTAwMCAxMTAxIGRkZGQgMDEwMCAqKiogdGVzdCByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3QgcmQiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0idGVzdCIsT1BDX3Rlc3QsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzQsMCwwLDAsMCwwLH0sMSwyLDM4Mn0sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMDEwMCAqKiogdGVzdGIgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGIgQHJkIiw4LDgsCi0weDFjLAotI2VuZGlmCi0idGVzdGIiLE9QQ190ZXN0YiwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs0LDAsMCwwLDAsMCx9LDEsMiwzODN9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDAxMDAgYWRkcmVzc19kc3QgKioqIHRlc3RiIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGIgYWRkcmVzc19kc3QiLDgsMTEsCi0weDFjLAotI2VuZGlmCi0idGVzdGIiLE9QQ190ZXN0YiwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrNCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4NH0sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMDEwMCBhZGRyZXNzX2RzdCAqKiogdGVzdGIgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGIgYWRkcmVzc19kc3QocmQpIiw4LDEyLAotMHgxYywKLSNlbmRpZgotInRlc3RiIixPUENfdGVzdGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs0LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzg1fSwKLQotCi0vKiAxMDAwIDExMDAgZGRkZCAwMTAwICoqKiB0ZXN0YiByYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0YiByYmQiLDgsNywKLTB4MWMsCi0jZW5kaWYKLSJ0ZXN0YiIsT1BDX3Rlc3RiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs0LDAsMCwwLDAsMCx9LDEsMiwzODZ9LAotCi0KLS8qIDAwMDEgMTEwMCBkZE4wIDEwMDAgKioqIHRlc3RsIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RsIEByZCIsMzIsMTMsCi0weDE4LAotI2VuZGlmCi0idGVzdGwiLE9QQ190ZXN0bCwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiwzODd9LAotCi0KLS8qIDAxMDEgMTEwMCAwMDAwIDEwMDAgYWRkcmVzc19kc3QgKioqIHRlc3RsIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGwgYWRkcmVzc19kc3QiLDMyLDE2LAotMHgxOCwKLSNlbmRpZgotInRlc3RsIixPUENfdGVzdGwsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODh9LAotCi0KLS8qIDAxMDEgMTEwMCBkZE4wIDEwMDAgYWRkcmVzc19kc3QgKioqIHRlc3RsIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RsIGFkZHJlc3NfZHN0KHJkKSIsMzIsMTcsCi0weDE4LAotI2VuZGlmCi0idGVzdGwiLE9QQ190ZXN0bCwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODl9LAotCi0KLS8qIDEwMDEgMTEwMCBkZGRkIDEwMDAgKioqIHRlc3RsIHJyZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RsIHJyZCIsMzIsMTMsCi0weDE4LAotI2VuZGlmCi0idGVzdGwiLE9QQ190ZXN0bCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsMzkwfSwKLQotCi0vKiAxMDExIDEwMDAgZGROMCAxMDAwIDAwMDAgYWFhYSBzc04wIDAwMDAgKioqIHRyZGIgQHJkLEBycyxyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cmRiIEByZCxAcnMscmJhIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRyZGIiLE9QQ190cmRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLDAsfSwzLDQsMzkxfSwKLQotCi0vKiAxMDExIDEwMDAgZGROMCAxMTAwIDAwMDAgYWFhYSBzc04wIDAwMDAgKioqIHRyZHJiIEByZCxAcnMscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJkcmIgQHJkLEBycyxyYmEiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJkcmIiLE9QQ190cmRyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLDAsfSwzLDQsMzkyfSwKLQotCi0vKiAxMDExIDEwMDAgZGROMCAwMDAwIDAwMDAgcnJyciBzc04wIDAwMDAgKioqIHRyaWIgQHJkLEBycyxyYnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cmliIEByZCxAcnMscmJyIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRyaWIiLE9QQ190cmliLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLDAsfSwzLDQsMzkzfSwKLQotCi0vKiAxMDExIDEwMDAgZGROMCAwMTAwIDAwMDAgcnJyciBzc04wIDAwMDAgKioqIHRyaXJiIEByZCxAcnMscmJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJpcmIgQHJkLEBycyxyYnIiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJpcmIiLE9QQ190cmlyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5NH0sCi0KLQotLyogMTAxMSAxMDAwIGFhTjAgMTAxMCAwMDAwIHJycnIgYmJOMCAwMDAwICoqKiB0cnRkYiBAcmEsQHJiLHJiciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRydGRiIEByYSxAcmIscmJyIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRydGRiIixPUENfdHJ0ZGIsMCx7Q0xBU1NfSVIrKEFSR19SQSksQ0xBU1NfSVIrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JBKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JCKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5NX0sCi0KLQotLyogMTAxMSAxMDAwIGFhTjAgMTExMCAwMDAwIHJycnIgYmJOMCAxMTEwICoqKiB0cnRkcmIgQHJhLEByYixyYnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cnRkcmIgQHJhLEByYixyYnIiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJ0ZHJiIixPUENfdHJ0ZHJiLDAse0NMQVNTX0lSKyhBUkdfUkEpLENMQVNTX0lSKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SQSksQ0xBU1NfQklUKzB4ZSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SQiksQ0xBU1NfQklUKzB4ZSwwLH0sMyw0LDM5Nn0sCi0KLQotLyogMTAxMSAxMDAwIGFhTjAgMDAxMCAwMDAwIHJycnIgYmJOMCAwMDAwICoqKiB0cnRpYiBAcmEsQHJiLHJiciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRydGliIEByYSxAcmIscmJyIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRydGliIixPUENfdHJ0aWIsMCx7Q0xBU1NfSVIrKEFSR19SQSksQ0xBU1NfSVIrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JBKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SQiksQ0xBU1NfQklUKzAsMCx9LDMsNCwzOTd9LAotCi0KLS8qIDEwMTEgMTAwMCBhYU4wIDAxMTAgMDAwMCBycnJyIGJiTjAgMTExMCAqKiogdHJ0aXJiIEByYSxAcmIscmJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJ0aXJiIEByYSxAcmIscmJyIiw4LDI1LAotMHgxYywKLSNlbmRpZgotInRydGlyYiIsT1BDX3RydGlyYiwwLHtDTEFTU19JUisoQVJHX1JBKSxDTEFTU19JUisoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkEpLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JCKSxDTEFTU19CSVQrMHhlLDAsfSwzLDQsMzk4fSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAwMTEwICoqKiB0c2V0IEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXQgQHJkIiwxNiwxMSwKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0IixPUENfdHNldCwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs2LDAsMCwwLDAsMCx9LDEsMiwzOTl9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDAxMTAgYWRkcmVzc19kc3QgKioqIHRzZXQgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0IGFkZHJlc3NfZHN0IiwxNiwxNCwKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0IixPUENfdHNldCwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrNixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQwMH0sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMDExMCBhZGRyZXNzX2RzdCAqKiogdHNldCBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0IGFkZHJlc3NfZHN0KHJkKSIsMTYsMTUsCi0weDA4LAotI2VuZGlmCi0idHNldCIsT1BDX3RzZXQsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs2LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDAxfSwKLQotCi0vKiAxMDAwIDExMDEgZGRkZCAwMTEwICoqKiB0c2V0IHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldCByZCIsMTYsNywKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0IixPUENfdHNldCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNiwwLDAsMCwwLDAsfSwxLDIsNDAyfSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAwMTEwICoqKiB0c2V0YiBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0YiBAcmQiLDgsMTEsCi0weDA4LAotI2VuZGlmCi0idHNldGIiLE9QQ190c2V0YiwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs2LDAsMCwwLDAsMCx9LDEsMiw0MDN9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDAxMTAgYWRkcmVzc19kc3QgKioqIHRzZXRiIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldGIgYWRkcmVzc19kc3QiLDgsMTQsCi0weDA4LAotI2VuZGlmCi0idHNldGIiLE9QQ190c2V0YiwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrNixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQwNH0sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMDExMCBhZGRyZXNzX2RzdCAqKiogdHNldGIgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldGIgYWRkcmVzc19kc3QocmQpIiw4LDE1LAotMHgwOCwKLSNlbmRpZgotInRzZXRiIixPUENfdHNldGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs2LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDA1fSwKLQotCi0vKiAxMDAwIDExMDAgZGRkZCAwMTEwICoqKiB0c2V0YiByYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0YiByYmQiLDgsNywKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0YiIsT1BDX3RzZXRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs2LDAsMCwwLDAsMCx9LDEsMiw0MDZ9LAotCi0KLS8qIDAwMDAgMTAwMSBzc04wIGRkZGQgKioqIHhvciByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3IgcmQsQHJzIiwxNiw3LAotMHgxOCwKLSNlbmRpZgotInhvciIsT1BDX3hvciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDQwN30sCi0KLQotLyogMDEwMCAxMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogeG9yIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgxOCwKLSNlbmRpZgotInhvciIsT1BDX3hvciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNDA4fSwKLQotCi0vKiAwMTAwIDEwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiB4b3IgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCi0weDE4LAotI2VuZGlmCi0ieG9yIixPUENfeG9yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNDA5fSwKLQotCi0vKiAwMDAwIDEwMDEgMDAwMCBkZGRkIGltbTE2ICoqKiB4b3IgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3IgcmQsaW1tMTYiLDE2LDcsCi0weDE4LAotI2VuZGlmCi0ieG9yIixPUENfeG9yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsNDEwfSwKLQotCi0vKiAxMDAwIDEwMDEgc3NzcyBkZGRkICoqKiB4b3IgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3IgcmQscnMiLDE2LDQsCi0weDE4LAotI2VuZGlmCi0ieG9yIixPUENfeG9yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs5LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDQxMX0sCi0KLQotLyogMDAwMCAxMDAwIHNzTjAgZGRkZCAqKiogeG9yYiByYmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yYiByYmQsQHJzIiw4LDcsCi0weDFjLAotI2VuZGlmCi0ieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw0MTJ9LAotCi0KLS8qIDAxMDAgMTAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIHhvcmIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4MWMsCi0jZW5kaWYKLSJ4b3JiIixPUENfeG9yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNDEzfSwKLQotCi0vKiAwMTAwIDEwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiB4b3JiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3JiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDFjLAotI2VuZGlmCi0ieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw0MTR9LAotCi0KLS8qIDAwMDAgMTAwMCAwMDAwIGRkZGQgaW1tOCBpbW04ICoqKiB4b3JiIHJiZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yYiByYmQsaW1tOCIsOCw3LAotMHgxYywKLSNlbmRpZgotInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCw0MTV9LAotCi0KLS8qIDEwMDAgMTAwMCBzc3NzIGRkZGQgKioqIHhvcmIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvcmIgcmJkLHJicyIsOCw0LAotMHgxYywKLSNlbmRpZgotInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs4LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDQxNn0sCi0KLQotLyogMTAwMCAxMDAwIHNzc3MgZGRkZCAqKiogeG9yYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yYiByYmQscmJzIiw4LDQsCi0weDAxLAotI2VuZGlmCi0ieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNDE3fSwKLTAsMH07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvejhrZ2VuLmMgYi9vcGNvZGVzL3o4a2dlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg2YmJiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvejhrZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEzICswLDAgQEAKLS8qCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhpcyBwcm9ncmFtIGdlbmVyYXRlcyB6OGstb3BjLmggKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNkZWZpbmUgQllURV9JTkZPX0xFTiAxMAotCi1zdHJ1Y3Qgb3AKLXsKLSAgY2hhciAqZmxhZ3M7Ci0gIGludCBjeWNsZXM7Ci0gIGNoYXIgdHlwZTsKLSAgY2hhciAqYml0czsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqZmxhdm9yOwotfTsKLQotI2RlZmluZSBpc3doaXRlKHgpICgoeCkgPT0gJyAnIHx8ICh4KSA9PSAnXHQnKQotc3RydWN0IG9wIG9wdFtdID0KLXsKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMDAwMCAxMTEwIGltbTgiLCAiZXh0MGUgaW1tOCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAwMDAgMTExMSBpbW04IiwgImV4dDBmIGltbTgiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIxMDAwIDExMTAgaW1tOCIsICJleHQ4ZSBpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAwMCAxMTExIGltbTgiLCAiZXh0OGYgaW1tOCIsIDAsCi0KLSAgIi0tLS0tLSIsIDEwLCA4LCAiMDAxMSAwMTEwIGltbTgiLCAicnN2ZDM2IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMDAxMSAxMDAwIGltbTgiLCAicnN2ZDM4IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMDExMSAxMDAwIGltbTgiLCAicnN2ZDc4IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMDExMSAxMTEwIGltbTgiLCAicnN2ZDdlIiwgMCwKLQotICAiLS0tLS0tIiwgMTAsIDgsICIxMDAxIDExMDEgaW1tOCIsICJyc3ZkOWQiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIxMDAxIDExMTEgaW1tOCIsICJyc3ZkOWYiLCAwLAotCi0gICItLS0tLS0iLCAxMCwgOCwgIjEwMTEgMTAwMSBpbW04IiwgInJzdmRiOSIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjEwMTEgMTExMSBpbW04IiwgInJzdmRiZiIsIDAsCi0KLSAgIi0tLVYtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCIsICJsZGQgQHJzLEByZCxyciIsIDAsCi0gICItLS1WLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAiLCAibGRkciBAcnMsQHJkLHJyIiwgMCwKLSAgIi0tLVYtLSIsIDExLCA4LCAiMTAxMSAxMDExIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAwMDAwIiwgImxkZHJiIEBycyxAcmQscnIiLCAwLAotICAiLS0tVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAwMDAwIiwgImxkaXIgQHJkLEBycyxyciIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAwMDAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BpIHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAwMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BpciByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTEwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwZHIgcmQsQHJzLHJyLGNjIiwgMCwKLSAgIi0tLVYtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCIsICJsZGkgQHJkLEBycyxyciIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMDAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BkIHJkLEBycyxycixjYyIsIDAsCi0gICItLS1WLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCIsICJsZGlyYiBAcmQsQHJzLHJyIiwgMCwKLSAgIi0tLVYtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAxMDAwIiwgImxkZGIgQHJzLEByZCxyciIsIDAsCi0gICItLS1WLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCIsICJsZGliIEByZCxAcnMscnIiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAxMDAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BkYiByYmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMTEwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwZHJiIHJiZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMDAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BpYiByYmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDEwMCAwMDAwIHJycnIgZGRkZCBjY2NjIiwgImNwaXJiIHJiZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTAxMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2QgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDEwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNkYiBAcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDExMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNkciBAcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMTExMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2RyYiBAcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNpIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzaWIgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAwMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzaXIgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDAxMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNpcmIgQHJkLEBycyxycixjYyIsIDAsCi0KLSAgIi0tLS0tLSIsIDIsIDgsICIwMDExIDAxMTAgMDAwMCAwMDAwIiwgImJwdCIsIDAsCi0gICJDWlNWLS0iLCA1LCAxNiwgIjEwMTEgMDEwMSBzc3NzIGRkZGQiLCAiYWRjIHJkLHJzIiwgMCwKLSAgIkNaU1ZESCIsIDUsIDgsICIxMDExIDAxMDAgc3NzcyBkZGRkIiwgImFkY2IgcmJkLHJicyIsIDAsCi0gICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMDAwMSBzc04wIGRkZGQiLCAiYWRkIHJkLEBycyIsIDAsCi0iQ1pTVi0tIiwgOSwgMTYsICIwMTAwIDAwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFkZCByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxMCwgMTYsICIwMTAwIDAwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFkZCByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDAwMDEgMDAwMCBkZGRkIGltbTE2IiwgImFkZCByZCxpbW0xNiIsIDAsCi0gICJDWlNWLS0iLCA0LCAxNiwgIjEwMDAgMDAwMSBzc3NzIGRkZGQiLCAiYWRkIHJkLHJzIiwgMCwKLSAgIkNaU1ZESCIsIDcsIDgsICIwMDAwIDAwMDAgc3NOMCBkZGRkIiwgImFkZGIgcmJkLEBycyIsIDAsCi0iQ1pTVkRIIiwgOSwgOCwgIjAxMDAgMDAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkYiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVkRIIiwgMTAsIDgsICIwMTAwIDAwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFkZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWREgiLCA3LCA4LCAiMDAwMCAwMDAwIDAwMDAgZGRkZCBpbW04IGltbTgiLCAiYWRkYiByYmQsaW1tOCIsIDAsCi0gICJDWlNWREgiLCA0LCA4LCAiMTAwMCAwMDAwIHNzc3MgZGRkZCIsICJhZGRiIHJiZCxyYnMiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDMyLCAiMDAwMSAwMTEwIHNzTjAgZGRkZCIsICJhZGRsIHJyZCxAcnMiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDMyLCAiMDEwMSAwMTEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGRsIHJyZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxNiwgMzIsICIwMTAxIDAxMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFkZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCAxNCwgMzIsICIwMDAxIDAxMTAgMDAwMCBkZGRkIGltbTMyIiwgImFkZGwgcnJkLGltbTMyIiwgMCwKLSAgIkNaU1YtLSIsIDgsIDMyLCAiMTAwMSAwMTEwIHNzc3MgZGRkZCIsICJhZGRsIHJyZCxycnMiLCAwLAotCi0gICItWlMtLS0iLCA3LCAxNiwgIjAwMDAgMDExMSBzc04wIGRkZGQiLCAiYW5kIHJkLEBycyIsIDAsCi0iLVpTLS0tIiwgOSwgMTYsICIwMTAwIDAxMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFuZCByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItWlMtLS0iLCAxMCwgMTYsICIwMTAwIDAxMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFuZCByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLVpTLS0tIiwgNywgMTYsICIwMDAwIDAxMTEgMDAwMCBkZGRkIGltbTE2IiwgImFuZCByZCxpbW0xNiIsIDAsCi0gICItWlMtLS0iLCA0LCAxNiwgIjEwMDAgMDExMSBzc3NzIGRkZGQiLCAiYW5kIHJkLHJzIiwgMCwKLSAgIi1aU1AtLSIsIDcsIDgsICIwMDAwIDAxMTAgc3NOMCBkZGRkIiwgImFuZGIgcmJkLEBycyIsIDAsCi0iLVpTUC0tIiwgOSwgOCwgIjAxMDAgMDExMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiYW5kYiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiLVpTUC0tIiwgMTAsIDgsICIwMTAwIDAxMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFuZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItWlNQLS0iLCA3LCA4LCAiMDAwMCAwMTEwIDAwMDAgZGRkZCBpbW04IGltbTgiLCAiYW5kYiByYmQsaW1tOCIsIDAsCi0gICItWlNQLS0iLCA0LCA4LCAiMTAwMCAwMTEwIHNzc3MgZGRkZCIsICJhbmRiIHJiZCxyYnMiLCAwLAotCi0gICItWi0tLS0iLCA4LCAxNiwgIjAwMTAgMDExMSBkZE4wIGltbTQiLCAiYml0IEByZCxpbW00IiwgMCwKLSAgIi1aLS0tLSIsIDExLCAxNiwgIjAxMTAgMDExMSBkZE4wIGltbTQgYWRkcmVzc19kc3QiLCAiYml0IGFkZHJlc3NfZHN0KHJkKSxpbW00IiwgMCwKLSAgIi1aLS0tLSIsIDEwLCAxNiwgIjAxMTAgMDExMSAwMDAwIGltbTQgYWRkcmVzc19kc3QiLCAiYml0IGFkZHJlc3NfZHN0LGltbTQiLCAwLAotICAiLVotLS0tIiwgNCwgMTYsICIxMDEwIDAxMTEgZGRkZCBpbW00IiwgImJpdCByZCxpbW00IiwgMCwKLSItWi0tLS0iLCAxMCwgMTYsICIwMDEwIDAxMTEgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAiLCAiYml0IHJkLHJzIiwgMCwKLQotICAiLVotLS0tIiwgOCwgOCwgIjAwMTAgMDExMCBkZE4wIGltbTQiLCAiYml0YiBAcmQsaW1tNCIsIDAsCi0gICItWi0tLS0iLCAxMSwgOCwgIjAxMTAgMDExMCBkZE4wIGltbTQgYWRkcmVzc19kc3QiLCAiYml0YiBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItWi0tLS0iLCAxMCwgOCwgIjAxMTAgMDExMCAwMDAwIGltbTQgYWRkcmVzc19kc3QiLCAiYml0YiBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi1aLS0tLSIsIDQsIDgsICIxMDEwIDAxMTAgZGRkZCBpbW00IiwgImJpdGIgcmJkLGltbTQiLCAwLAotIi1aLS0tLSIsIDEwLCA4LCAiMDAxMCAwMTEwIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgImJpdGIgcmJkLHJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTAsIDMyLCAiMDAwMSAxMTExIGRkTjAgMDAwMCIsICJjYWxsIEByZCIsIDAsCi0gICItLS0tLS0iLCAxMiwgMzIsICIwMTAxIDExMTEgMDAwMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNhbGwgYWRkcmVzc19kc3QiLCAwLAotICAiLS0tLS0tIiwgMTMsIDMyLCAiMDEwMSAxMTExIGRkTjAgMDAwMCBhZGRyZXNzX2RzdCIsICJjYWxsIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItLS0tLS0iLCAxMCwgMTYsICIxMTAxIGRpc3AxMiIsICJjYWxyIGRpc3AxMiIsIDAsCi0KLSAgIi0tLS0tLSIsIDgsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMTAwMCIsICJjbHIgQHJkIiwgMCwKLSAgIi0tLS0tLSIsIDExLCAxNiwgIjAxMDAgMTEwMSAwMDAwIDEwMDAgYWRkcmVzc19kc3QiLCAiY2xyIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAxNiwgIjAxMDAgMTEwMSBkZE4wIDEwMDAgYWRkcmVzc19kc3QiLCAiY2xyIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItLS0tLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBkZGRkIDEwMDAiLCAiY2xyIHJkIiwgMCwKLSAgIi0tLS0tLSIsIDgsIDgsICIwMDAwIDExMDAgZGROMCAxMDAwIiwgImNscmIgQHJkIiwgMCwKLSAgIi0tLS0tLSIsIDExLCA4LCAiMDEwMCAxMTAwIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCIsICJjbHJiIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi0tLS0tLSIsIDEyLCA4LCAiMDEwMCAxMTAwIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCIsICJjbHJiIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItLS0tLS0iLCA3LCA4LCAiMTAwMCAxMTAwIGRkZGQgMTAwMCIsICJjbHJiIHJiZCIsIDAsCi0gICItWlMtLS0iLCAxMiwgMTYsICIwMDAwIDExMDEgZGROMCAwMDAwIiwgImNvbSBAcmQiLCAwLAotICAiLVpTLS0tIiwgMTUsIDE2LCAiMDEwMCAxMTAxIDAwMDAgMDAwMCBhZGRyZXNzX2RzdCIsICJjb20gYWRkcmVzc19kc3QiLCAwLAotICAiLVpTLS0tIiwgMTYsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMDAwMCBhZGRyZXNzX2RzdCIsICJjb20gYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi1aUy0tLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGRkZGQgMDAwMCIsICJjb20gcmQiLCAwLAotICAiLVpTUC0tIiwgMTIsIDgsICIwMDAwIDExMDAgZGROMCAwMDAwIiwgImNvbWIgQHJkIiwgMCwKLSAgIi1aU1AtLSIsIDE1LCA4LCAiMDEwMCAxMTAwIDAwMDAgMDAwMCBhZGRyZXNzX2RzdCIsICJjb21iIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi1aU1AtLSIsIDE2LCA4LCAiMDEwMCAxMTAwIGRkTjAgMDAwMCBhZGRyZXNzX2RzdCIsICJjb21iIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItWlNQLS0iLCA3LCA4LCAiMTAwMCAxMTAwIGRkZGQgMDAwMCIsICJjb21iIHJiZCIsIDAsCi0gICJDWlNQLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBpbW00IDAxMDEiLCAiY29tZmxnIGZsYWdzIiwgMCwKLQotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDAwMSBpbW0xNiIsICJjcCBAcmQsaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMDAwMSBhZGRyZXNzX2RzdCBpbW0xNiIsICJjcCBhZGRyZXNzX2RzdChyZCksaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgMTQsIDE2LCAiMDEwMCAxMTAxIDAwMDAgMDAwMSBhZGRyZXNzX2RzdCBpbW0xNiIsICJjcCBhZGRyZXNzX2RzdCxpbW0xNiIsIDAsCi0KLSAgIkNaU1YtLSIsIDcsIDE2LCAiMDAwMCAxMDExIHNzTjAgZGRkZCIsICJjcCByZCxAcnMiLCAwLAotICAiQ1pTVi0tIiwgOSwgMTYsICIwMTAwIDEwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwIHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDEwLCAxNiwgIjAxMDAgMTAxMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiY3AgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDE2LCAiMDAwMCAxMDExIDAwMDAgZGRkZCBpbW0xNiIsICJjcCByZCxpbW0xNiIsIDAsCi0gICJDWlNWLS0iLCA0LCAxNiwgIjEwMDAgMTAxMSBzc3NzIGRkZGQiLCAiY3AgcmQscnMiLCAwLAotCi0gICJDWlNWLS0iLCAxMSwgOCwgIjAwMDAgMTEwMCBkZE4wIDAwMDEgaW1tOCBpbW04IiwgImNwYiBAcmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxNSwgOCwgIjAxMDAgMTEwMCBkZE4wIDAwMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04IiwgImNwYiBhZGRyZXNzX2RzdChyZCksaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxNCwgOCwgIjAxMDAgMTEwMCAwMDAwIDAwMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04IiwgImNwYiBhZGRyZXNzX2RzdCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDcsIDgsICIwMDAwIDEwMTAgc3NOMCBkZGRkIiwgImNwYiByYmQsQHJzIiwgMCwKLSJDWlNWLS0iLCA5LCA4LCAiMDEwMCAxMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJjcGIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDEwLCA4LCAiMDEwMCAxMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJjcGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCA3LCA4LCAiMDAwMCAxMDEwIDAwMDAgZGRkZCBpbW04IGltbTgiLCAiY3BiIHJiZCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDQsIDgsICIxMDAwIDEwMTAgc3NzcyBkZGRkIiwgImNwYiByYmQscmJzIiwgMCwKLQotICAiQ1pTVi0tIiwgMTQsIDMyLCAiMDAwMSAwMDAwIHNzTjAgZGRkZCIsICJjcGwgcnJkLEBycyIsIDAsCi0gICJDWlNWLS0iLCAxNSwgMzIsICIwMTAxIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwbCBycmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTYsIDMyLCAiMDEwMSAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJjcGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCAxNCwgMzIsICIwMDAxIDAwMDAgMDAwMCBkZGRkIGltbTMyIiwgImNwbCBycmQsaW1tMzIiLCAwLAotICAiQ1pTVi0tIiwgOCwgMzIsICIxMDAxIDAwMDAgc3NzcyBkZGRkIiwgImNwbCBycmQscnJzIiwgMCwKLQotICAiQ1pTLS0tIiwgNSwgOCwgIjEwMTEgMDAwMCBkZGRkIDAwMDAiLCAiZGFiIHJiZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgMTYsICIxMTExIGRkZGQgMWRpc3A3IiwgImRiam56IHJiZCxkaXNwNyIsIDAsCi0gICItWlNWLS0iLCAxMSwgMTYsICIwMDEwIDEwMTEgZGROMCBpbW00bTEiLCAiZGVjIEByZCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTQsIDE2LCAiMDExMCAxMDExIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImRlYyBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDEzLCAxNiwgIjAxMTAgMTAxMSAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCIsICJkZWMgYWRkcmVzc19kc3QsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDQsIDE2LCAiMTAxMCAxMDExIGRkZGQgaW1tNG0xIiwgImRlYyByZCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTEsIDgsICIwMDEwIDEwMTAgZGROMCBpbW00bTEiLCAiZGVjYiBAcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDE0LCA4LCAiMDExMCAxMDEwIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImRlY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxMywgOCwgIjAxMTAgMTAxMCAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCIsICJkZWNiIGFkZHJlc3NfZHN0LGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCA0LCA4LCAiMTAxMCAxMDEwIGRkZGQgaW1tNG0xIiwgImRlY2IgcmJkLGltbTRtMSIsIDAsCi0KLSAgIi0tLS0tLSIsIDcsIDE2LCAiMDExMSAxMTAwIDAwMDAgMDBpaSIsICJkaSBpMiIsIDAsCi0gICJDWlNWLS0iLCAxMDcsIDE2LCAiMDAwMSAxMDExIHNzTjAgZGRkZCIsICJkaXYgcnJkLEBycyIsIDAsCi0gICJDWlNWLS0iLCAxMDcsIDE2LCAiMDEwMSAxMDExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJkaXYgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDEwNywgMTYsICIwMTAxIDEwMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImRpdiBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDEwNywgMTYsICIwMDAxIDEwMTEgMDAwMCBkZGRkIGltbTE2IiwgImRpdiBycmQsaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgMTA3LCAxNiwgIjEwMDEgMTAxMSBzc3NzIGRkZGQiLCAiZGl2IHJyZCxycyIsIDAsCi0gICJDWlNWLS0iLCA3NDQsIDMyLCAiMDAwMSAxMDEwIHNzTjAgZGRkZCIsICJkaXZsIHJxZCxAcnMiLCAwLAotICAiQ1pTVi0tIiwgNzQ1LCAzMiwgIjAxMDEgMTAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiZGl2bCBycWQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgNzQ2LCAzMiwgIjAxMDEgMTAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiZGl2bCBycWQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDc0NCwgMzIsICIwMDAxIDEwMTAgMDAwMCBkZGRkIGltbTMyIiwgImRpdmwgcnFkLGltbTMyIiwgMCwKLSAgIkNaU1YtLSIsIDc0NCwgMzIsICIxMDAxIDEwMTAgc3NzcyBkZGRkIiwgImRpdmwgcnFkLHJycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDExLCAxNiwgIjExMTEgZGRkZCAwZGlzcDciLCAiZGpueiByZCxkaXNwNyIsIDAsCi0gICItLS0tLS0iLCA3LCAxNiwgIjAxMTEgMTEwMCAwMDAwIDAxaWkiLCAiZWkgaTIiLCAwLAotICAiLS0tLS0tIiwgNiwgMTYsICIxMDEwIDExMDEgc3NzcyBkZGRkIiwgImV4IHJkLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAxNiwgIjAwMTAgMTEwMSBzc04wIGRkZGQiLCAiZXggcmQsQHJzIiwgMCwKLSItLS0tLS0iLCAxNSwgMTYsICIwMTEwIDExMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImV4IHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi0tLS0tLSIsIDE2LCAxNiwgIjAxMTAgMTEwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiZXggcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLQotICAiLS0tLS0tIiwgMTIsIDgsICIwMDEwIDExMDAgc3NOMCBkZGRkIiwgImV4YiByYmQsQHJzIiwgMCwKLSItLS0tLS0iLCAxNSwgOCwgIjAxMTAgMTEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiZXhiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxNiwgOCwgIjAxMTAgMTEwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiZXhiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLS0tLS0tIiwgNiwgOCwgIjEwMTAgMTEwMCBzc3NzIGRkZGQiLCAiZXhiIHJiZCxyYnMiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgMTYsICIxMDExIDAwMDEgZGRkZCAxMDEwIiwgImV4dHMgcnJkIiwgMCwKLSAgIi0tLS0tLSIsIDExLCA4LCAiMTAxMSAwMDAxIGRkZGQgMDAwMCIsICJleHRzYiByZCIsIDAsCi0gICItLS0tLS0iLCAxMSwgMzIsICIxMDExIDAwMDEgZGRkZCAwMTExIiwgImV4dHNsIHJxZCIsIDAsCi0KLSAgIi0tLS0tLSIsIDgsIDE2LCAiMDExMSAxMDEwIDAwMDAgMDAwMCIsICJoYWx0IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCAxNiwgIjAwMTEgMTEwMSBzc04wIGRkZGQiLCAiaW4gcmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAxNiwgIjAwMTEgMTEwMSBkZGRkIDAxMDAgaW1tMTYiLCAiaW4gcmQsaW1tMTYiLCAwLAotICAiLS0tLS0tIiwgMTIsIDgsICIwMDExIDExMDAgc3NOMCBkZGRkIiwgImluYiByYmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMDAxMSAxMTAwIGRkZGQgMDEwMCBpbW0xNiIsICJpbmIgcmJkLGltbTE2IiwgMCwKLSAgIi1aU1YtLSIsIDExLCAxNiwgIjAwMTAgMTAwMSBkZE4wIGltbTRtMSIsICJpbmMgQHJkLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxNCwgMTYsICIwMTEwIDEwMDEgZGROMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiaW5jIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTMsIDE2LCAiMDExMCAxMDAxIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImluYyBhZGRyZXNzX2RzdCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgNCwgMTYsICIxMDEwIDEwMDEgZGRkZCBpbW00bTEiLCAiaW5jIHJkLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxMSwgOCwgIjAwMTAgMTAwMCBkZE4wIGltbTRtMSIsICJpbmNiIEByZCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTQsIDgsICIwMTEwIDEwMDAgZGROMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiaW5jYiBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDEzLCA4LCAiMDExMCAxMDAwIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImluY2IgYWRkcmVzc19kc3QsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDQsIDgsICIxMDEwIDEwMDAgZGRkZCBpbW00bTEiLCAiaW5jYiByYmQsaW1tNG0xIiwgMCwKLSAgIi0tLVYtLSIsIDIxLCAxNiwgIjAwMTEgMTAxMSBzc04wIDEwMDAgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJpbmQgQHJkLEBycyxyYSIsIDAsCi0gICItLS1WLS0iLCAyMSwgOCwgIjAwMTEgMTAxMCBzc04wIDEwMDAgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJpbmRiIEByZCxAcnMscmJhIiwgMCwKLSAgIi0tLVYtLSIsIDIxLCA4LCAiMDAxMSAxMTAwIHNzTjAgMDAwMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgImluaWIgQHJkLEBycyxyYSIsIDAsCi0gICItLS1WLS0iLCAyMSwgMTYsICIwMDExIDExMDAgc3NOMCAwMDAwIDAwMDAgYWFhYSBkZE4wIDAwMDAiLCAiaW5pYnIgQHJkLEBycyxyYSIsIDAsCi0gICJDWlNWREgiLCAxMywgMTYsICIwMTExIDEwMTEgMDAwMCAwMDAwIiwgImlyZXQiLCAwLAotICAiLS0tLS0tIiwgMTAsIDE2LCAiMDAwMSAxMTEwIGRkTjAgY2NjYyIsICJqcCBjYyxAcmQiLCAwLAotICAiLS0tLS0tIiwgNywgMTYsICIwMTAxIDExMTAgMDAwMCBjY2NjIGFkZHJlc3NfZHN0IiwgImpwIGNjLGFkZHJlc3NfZHN0IiwgMCwKLSAgIi0tLS0tLSIsIDgsIDE2LCAiMDEwMSAxMTEwIGRkTjAgY2NjYyBhZGRyZXNzX2RzdCIsICJqcCBjYyxhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS0tLS0tIiwgNiwgMTYsICIxMTEwIGNjY2MgZGlzcDgiLCAianIgY2MsZGlzcDgiLCAwLAotCi0gICItLS0tLS0iLCA3LCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAxMDEgaW1tMTYiLCAibGQgQHJkLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDgsIDE2LCAiMDAxMCAxMTExIGRkTjAgc3NzcyIsICJsZCBAcmQscnMiLCAwLAotICAiLS0tLS0tIiwgMTUsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMDEwMSBhZGRyZXNzX2RzdCBpbW0xNiIsICJsZCBhZGRyZXNzX2RzdChyZCksaW1tMTYiLCAwLAotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDExMCAxMTExIGRkTjAgc3NzcyBhZGRyZXNzX2RzdCIsICJsZCBhZGRyZXNzX2RzdChyZCkscnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDEwMCAxMTAxIDAwMDAgMDEwMSBhZGRyZXNzX2RzdCBpbW0xNiIsICJsZCBhZGRyZXNzX2RzdCxpbW0xNiIsIDAsCi0iLS0tLS0tIiwgMTEsIDE2LCAiMDExMCAxMTExIDAwMDAgc3NzcyBhZGRyZXNzX2RzdCIsICJsZCBhZGRyZXNzX2RzdCxycyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMDExIDAwMTEgZGROMCBzc3NzIGltbTE2IiwgImxkIHJkKGltbTE2KSxycyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTExIDAwMTEgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGQgcmQocngpLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDE2LCAiMDAxMCAwMDAxIHNzTjAgZGRkZCIsICJsZCByZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgOSwgMTYsICIwMTEwIDAwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkIHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi0tLS0tLSIsIDEwLCAxNiwgIjAxMTAgMDAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAibGQgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDE2LCAiMDAxMCAwMDAxIDAwMDAgZGRkZCBpbW0xNiIsICJsZCByZCxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCAzLCAxNiwgIjEwMTAgMDAwMSBzc3NzIGRkZGQiLCAibGQgcmQscnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDAxMSAwMDAxIHNzTjAgZGRkZCBpbW0xNiIsICJsZCByZCxycyhpbW0xNikiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDExMSAwMDAxIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkIHJkLHJzKHJ4KSIsIDAsCi0KLSAgIi0tLS0tLSIsIDcsIDgsICIwMDAwIDExMDAgZGROMCAwMTAxIGltbTggaW1tOCIsICJsZGIgQHJkLGltbTgiLCAwLAotICAiLS0tLS0tIiwgOCwgOCwgIjAwMTAgMTExMCBkZE4wIHNzc3MiLCAibGRiIEByZCxyYnMiLCAwLAotICAiLS0tLS0tIiwgMTUsIDgsICIwMTAwIDExMDAgZGROMCAwMTAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCIsICJsZGIgYWRkcmVzc19kc3QocmQpLGltbTgiLCAwLAotICAiLS0tLS0tIiwgMTIsIDgsICIwMTAwIDExMTAgZGROMCBzc04wIGFkZHJlc3NfZHN0IiwgImxkYiBhZGRyZXNzX2RzdChyZCkscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDEwMCAxMTAwIDAwMDAgMDEwMSBhZGRyZXNzX2RzdCBpbW04IGltbTgiLCAibGRiIGFkZHJlc3NfZHN0LGltbTgiLCAwLAotIi0tLS0tLSIsIDExLCA4LCAiMDExMCAxMTEwIDAwMDAgc3NzcyBhZGRyZXNzX2RzdCIsICJsZGIgYWRkcmVzc19kc3QscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDAxMSAwMDEwIGRkTjAgc3NzcyBpbW0xNiIsICJsZGIgcmQoaW1tMTYpLHJicyIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAxMTEgMDAxMCBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZGIgcmQocngpLHJicyIsIDAsCi0gICItLS0tLS0iLCA3LCA4LCAiMDAxMCAwMDAwIHNzTjAgZGRkZCIsICJsZGIgcmJkLEBycyIsIDAsCi0iLS0tLS0tIiwgOSwgOCwgIjAxMTAgMDAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAibGRiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjAxMTAgMDAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAibGRiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLS0tLS0tIiwgNSwgOCwgIjExMDAgZGRkZCBpbW04IiwgImxkYiByYmQsaW1tOCIsIDAsCi0gICItLS0tLS0iLCAzLCA4LCAiMTAxMCAwMDAwIHNzc3MgZGRkZCIsICJsZGIgcmJkLHJicyIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAwMTEgMDAwMCBzc04wIGRkZGQgaW1tMTYiLCAibGRiIHJiZCxycyhpbW0xNikiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMTExIDAwMDAgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGRiIHJiZCxycyhyeCkiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgMzIsICIwMDAxIDExMDEgZGROMCBzc3NzIiwgImxkbCBAcmQscnJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAzMiwgIjAxMDEgMTEwMSBkZE4wIHNzc3MgYWRkcmVzc19kc3QiLCAibGRsIGFkZHJlc3NfZHN0KHJkKSxycnMiLCAwLAotICAiLS0tLS0tIiwgMTUsIDMyLCAiMDEwMSAxMTAxIDAwMDAgc3NzcyBhZGRyZXNzX2RzdCIsICJsZGwgYWRkcmVzc19kc3QscnJzIiwgMCwKLSAgIi0tLS0tLSIsIDE3LCAzMiwgIjAwMTEgMDExMSBkZE4wIHNzc3MgaW1tMTYiLCAibGRsIHJkKGltbTE2KSxycnMiLCAwLAotICAiLS0tLS0tIiwgMTcsIDMyLCAiMDExMSAwMTExIGRkTjAgc3NzcyAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkbCByZChyeCkscnJzIiwgMCwKLSAgIi0tLS0tLSIsIDExLCAzMiwgIjAwMDEgMDEwMCBzc04wIGRkZGQiLCAibGRsIHJyZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTIsIDMyLCAiMDEwMSAwMTAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGwgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi0tLS0tLSIsIDEzLCAzMiwgIjAxMDEgMDEwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAibGRsIHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLS0tLS0tIiwgMTEsIDMyLCAiMDAwMSAwMTAwIDAwMDAgZGRkZCBpbW0zMiIsICJsZGwgcnJkLGltbTMyIiwgMCwKLSAgIi0tLS0tLSIsIDUsIDMyLCAiMTAwMSAwMTAwIHNzc3MgZGRkZCIsICJsZGwgcnJkLHJycyIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMDExIDAxMDEgc3NOMCBkZGRkIGltbTE2IiwgImxkbCBycmQscnMoaW1tMTYpIiwgMCwKLSAgIi0tLS0tLSIsIDE3LCAzMiwgIjAxMTEgMDEwMSBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZGwgcnJkLHJzKHJ4KSIsIDAsCi0KLSAgIi0tLS0tLSIsIDEyLCAxNiwgIjAxMTEgMDExMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAibGRhIHByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxMywgMTYsICIwMTExIDAxMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkYSBwcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAxNiwgIjAwMTEgMDEwMCBzc04wIGRkZGQgaW1tMTYiLCAibGRhIHByZCxycyhpbW0xNikiLCAwLAotICAiLS0tLS0tIiwgMTUsIDE2LCAiMDExMSAwMTAwIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkYSBwcmQscnMocngpIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAxNiwgIjAwMTEgMDEwMCAwMDAwIGRkZGQgZGlzcDE2IiwgImxkYXIgcHJkLGRpc3AxNiIsIDAsCi0gICItLS0tLS0iLCA3LCAzMiwgIjAxMTEgMTEwMSBzc3NzIDFjY2MiLCAibGRjdGwgY3RybCxycyIsIDAsCi0gICItLS0tLS0iLCA3LCAzMiwgIjAxMTEgMTEwMSBkZGRkIDBjY2MiLCAibGRjdGwgcmQsY3RybCIsIDAsCi0KLSAgIi0tLS0tLSIsIDUsIDE2LCAiMTAxMSAxMTAxIGRkZGQgaW1tNCIsICJsZGsgcmQsaW1tNCIsIDAsCi0KLSAgIi0tLS0tLSIsIDExLCAxNiwgIjAwMDEgMTEwMCBkZE4wIDEwMDEgMDAwMCBzc3NzIDAwMDAgbm1pbnVzMSIsICJsZG0gQHJkLHJzLG4iLCAwLAotICAiLS0tLS0tIiwgMTUsIDE2LCAiMDEwMSAxMTAwIGRkTjAgMTAwMSAwMDAwIHNzTjAgMDAwMCBubWludXMxIGFkZHJlc3NfZHN0IiwgImxkbSBhZGRyZXNzX2RzdChyZCkscnMsbiIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTAxIDExMDAgMDAwMCAxMDAxIDAwMDAgc3NzcyAwMDAwIG5taW51czEgYWRkcmVzc19kc3QiLCAibGRtIGFkZHJlc3NfZHN0LHJzLG4iLCAwLAotICAiLS0tLS0tIiwgMTEsIDE2LCAiMDAwMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxIiwgImxkbSByZCxAcnMsbiIsIDAsCi0gICItLS0tLS0iLCAxNSwgMTYsICIwMTAxIDExMDAgc3NOMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEgYWRkcmVzc19zcmMiLCAibGRtIHJkLGFkZHJlc3Nfc3JjKHJzKSxuIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMDEgMTEwMCAwMDAwIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSBhZGRyZXNzX3NyYyIsICJsZG0gcmQsYWRkcmVzc19zcmMsbiIsIDAsCi0KLSAgIkNaU1ZESCIsIDEyLCAxNiwgIjAwMTEgMTAwMSBzc04wIDAwMDAiLCAibGRwcyBAcnMiLCAwLAotICAiQ1pTVkRIIiwgMTYsIDE2LCAiMDExMSAxMDAxIDAwMDAgMDAwMCBhZGRyZXNzX3NyYyIsICJsZHBzIGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1ZESCIsIDE3LCAxNiwgIjAxMTEgMTAwMSBzc04wIDAwMDAgYWRkcmVzc19zcmMiLCAibGRwcyBhZGRyZXNzX3NyYyhycykiLCAwLAotCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMDExIDAwMTEgMDAwMCBzc3NzIGRpc3AxNiIsICJsZHIgZGlzcDE2LHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAwMTEgMDAwMSAwMDAwIGRkZGQgZGlzcDE2IiwgImxkciByZCxkaXNwMTYiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMDExIDAwMTAgMDAwMCBzc3NzIGRpc3AxNiIsICJsZHJiIGRpc3AxNixyYnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMDExIDAwMDAgMDAwMCBkZGRkIGRpc3AxNiIsICJsZHJiIHJiZCxkaXNwMTYiLCAwLAotICAiLS0tLS0tIiwgMTcsIDMyLCAiMDAxMSAwMTExIDAwMDAgc3NzcyBkaXNwMTYiLCAibGRybCBkaXNwMTYscnJzIiwgMCwKLSAgIi0tLS0tLSIsIDE3LCAzMiwgIjAwMTEgMDEwMSAwMDAwIGRkZGQgZGlzcDE2IiwgImxkcmwgcnJkLGRpc3AxNiIsIDAsCi0KLSAgIkNaUy0tLSIsIDcsIDE2LCAiMDExMSAxMDExIDAwMDAgMTAxMCIsICJtYml0IiwgMCwKLSAgIi1aUy0tLSIsIDEyLCAxNiwgIjAxMTEgMTAxMSBkZGRkIDExMDEiLCAibXJlcSByZCIsIDAsCi0gICItLS0tLS0iLCA1LCAxNiwgIjAxMTEgMTAxMSAwMDAwIDEwMDEiLCAibXJlcyIsIDAsCi0gICItLS0tLS0iLCA1LCAxNiwgIjAxMTEgMTAxMSAwMDAwIDEwMDAiLCAibXNldCIsIDAsCi0KLSAgIkNaU1YtLSIsIDcwLCAxNiwgIjAwMDEgMTAwMSBzc04wIGRkZGQiLCAibXVsdCBycmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDcwLCAxNiwgIjAxMDEgMTAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAibXVsdCBycmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgNzAsIDE2LCAiMDEwMSAxMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJtdWx0IHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgNzAsIDE2LCAiMDAwMSAxMDAxIDAwMDAgZGRkZCBpbW0xNiIsICJtdWx0IHJyZCxpbW0xNiIsIDAsCi0gICJDWlNWLS0iLCA3MCwgMTYsICIxMDAxIDEwMDEgc3NzcyBkZGRkIiwgIm11bHQgcnJkLHJzIiwgMCwKLSAgIkNaU1YtLSIsIDI4MiwgMzIsICIwMDAxIDEwMDAgc3NOMCBkZGRkIiwgIm11bHRsIHJxZCxAcnMiLCAwLAotICAiQ1pTVi0tIiwgMjgyLCAzMiwgIjAxMDEgMTAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAibXVsdGwgcnFkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDI4MiwgMzIsICIwMTAxIDEwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm11bHRsIHJxZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgMjgyLCAzMiwgIjAwMDEgMTAwMCAwMDAwIGRkZGQgaW1tMzIiLCAibXVsdGwgcnFkLGltbTMyIiwgMCwKLSAgIkNaU1YtLSIsIDI4MiwgMzIsICIxMDAxIDEwMDAgc3NzcyBkZGRkIiwgIm11bHRsIHJxZCxycnMiLCAwLAotICAiQ1pTVi0tIiwgMTIsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDAxMCIsICJuZWcgQHJkIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAwMTAgYWRkcmVzc19kc3QiLCAibmVnIGFkZHJlc3NfZHN0IiwgMCwKLSAgIkNaU1YtLSIsIDE2LCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAwMTAgYWRkcmVzc19kc3QiLCAibmVnIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICJDWlNWLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBkZGRkIDAwMTAiLCAibmVnIHJkIiwgMCwKLSAgIkNaU1YtLSIsIDEyLCA4LCAiMDAwMCAxMTAwIGRkTjAgMDAxMCIsICJuZWdiIEByZCIsIDAsCi0gICJDWlNWLS0iLCAxNSwgOCwgIjAxMDAgMTEwMCAwMDAwIDAwMTAgYWRkcmVzc19kc3QiLCAibmVnYiBhZGRyZXNzX2RzdCIsIDAsCi0gICJDWlNWLS0iLCAxNiwgOCwgIjAxMDAgMTEwMCBkZE4wIDAwMTAgYWRkcmVzc19kc3QiLCAibmVnYiBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiQ1pTVi0tIiwgNywgOCwgIjEwMDAgMTEwMCBkZGRkIDAwMTAiLCAibmVnYiByYmQiLCAwLAotCi0gICItLS0tLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSAwMDAwIDAxMTEiLCAibm9wIiwgMCwKLQotICAiQ1pTLS0tIiwgNywgMTYsICIwMDAwIDAxMDEgc3NOMCBkZGRkIiwgIm9yIHJkLEBycyIsIDAsCi0gICJDWlMtLS0iLCA5LCAxNiwgIjAxMDAgMDEwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAib3IgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTLS0tIiwgMTAsIDE2LCAiMDEwMCAwMTAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJvciByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTLS0tIiwgNywgMTYsICIwMDAwIDAxMDEgMDAwMCBkZGRkIGltbTE2IiwgIm9yIHJkLGltbTE2IiwgMCwKLSAgIkNaUy0tLSIsIDQsIDE2LCAiMTAwMCAwMTAxIHNzc3MgZGRkZCIsICJvciByZCxycyIsIDAsCi0KLSAgIkNaU1AtLSIsIDcsIDgsICIwMDAwIDAxMDAgc3NOMCBkZGRkIiwgIm9yYiByYmQsQHJzIiwgMCwKLSJDWlNQLS0iLCA5LCA4LCAiMDEwMCAwMTAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJvcmIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1AtLSIsIDEwLCA4LCAiMDEwMCAwMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJvcmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNQLS0iLCA3LCA4LCAiMDAwMCAwMTAwIDAwMDAgZGRkZCBpbW04IGltbTgiLCAib3JiIHJiZCxpbW04IiwgMCwKLSAgIkNaU1AtLSIsIDQsIDgsICIxMDAwIDAxMDAgc3NzcyBkZGRkIiwgIm9yYiByYmQscmJzIiwgMCwKLQotICAiLS0tVi0tIiwgMCwgMTYsICIwMDExIDExMTEgZGROMCBzc3NzIiwgIm91dCBAcmQscnMiLCAwLAotICAiLS0tVi0tIiwgMCwgMTYsICIwMDExIDEwMTEgc3NzcyAwMTEwIGltbTE2IiwgIm91dCBpbW0xNixycyIsIDAsCi0gICItLS1WLS0iLCAwLCA4LCAiMDAxMSAxMTEwIGRkTjAgc3NzcyIsICJvdXRiIEByZCxyYnMiLCAwLAotICAiLS0tVi0tIiwgMCwgOCwgIjAwMTEgMTAxMCBzc3NzIDAxMTAgaW1tMTYiLCAib3V0YiBpbW0xNixyYnMiLCAwLAotICAiLS0tVi0tIiwgMCwgMTYsICIwMDExIDEwMTEgc3NOMCAxMDEwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAib3V0ZCBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDgsICIwMDExIDEwMTAgc3NOMCAxMDEwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAib3V0ZGIgQHJkLEBycyxyYmEiLCAwLAotICAiLS0tVi0tIiwgMCwgOCwgIjAwMTEgMTEwMCBzc04wIDAwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJvdXRpYiBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDE2LCAiMDAxMSAxMTAwIHNzTjAgMDAxMCAwMDAwIGFhYWEgZGROMCAwMDAwIiwgIm91dGliciBAcmQsQHJzLHJhIiwgMCwKLQotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDAwMSAwMTExIHNzTjAgZGROMCIsICJwb3AgQHJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAxNiwgMTYsICIwMTAxIDAxMTEgc3NOMCBkZE4wIGFkZHJlc3NfZHN0IiwgInBvcCBhZGRyZXNzX2RzdChyZCksQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE2LCAxNiwgIjAxMDEgMDExMSBzc04wIDAwMDAgYWRkcmVzc19kc3QiLCAicG9wIGFkZHJlc3NfZHN0LEBycyIsIDAsCi0gICItLS0tLS0iLCA4LCAxNiwgIjEwMDEgMDExMSBzc04wIGRkZGQiLCAicG9wIHJkLEBycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDE5LCAzMiwgIjAwMDEgMDEwMSBzc04wIGRkTjAiLCAicG9wbCBAcmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDIzLCAzMiwgIjAxMDEgMDEwMSBzc04wIGRkTjAgYWRkcmVzc19kc3QiLCAicG9wbCBhZGRyZXNzX2RzdChyZCksQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDIzLCAzMiwgIjAxMDEgMDEwMSBzc04wIDAwMDAgYWRkcmVzc19kc3QiLCAicG9wbCBhZGRyZXNzX2RzdCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTIsIDMyLCAiMTAwMSAwMTAxIHNzTjAgZGRkZCIsICJwb3BsIHJyZCxAcnMiLCAwLAotCi0gICItLS0tLS0iLCAxMywgMTYsICIwMDAxIDAwMTEgZGROMCBzc04wIiwgInB1c2ggQHJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTAxIDAwMTEgZGROMCAwMDAwIGFkZHJlc3Nfc3JjIiwgInB1c2ggQHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMDEgMDAxMSBkZE4wIHNzTjAgYWRkcmVzc19zcmMiLCAicHVzaCBAcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAxNiwgIjAwMDAgMTEwMSBkZE4wIDEwMDEgaW1tMTYiLCAicHVzaCBAcmQsaW1tMTYiLCAwLAotICAiLS0tLS0tIiwgOSwgMTYsICIxMDAxIDAwMTEgZGROMCBzc3NzIiwgInB1c2ggQHJkLHJzIiwgMCwKLQotICAiLS0tLS0tIiwgMjAsIDMyLCAiMDAwMSAwMDAxIGRkTjAgc3NOMCIsICJwdXNobCBAcmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDIxLCAzMiwgIjAxMDEgMDAwMSBkZE4wIHNzTjAgYWRkcmVzc19zcmMiLCAicHVzaGwgQHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCAyMSwgMzIsICIwMTAxIDAwMDEgZGROMCAwMDAwIGFkZHJlc3Nfc3JjIiwgInB1c2hsIEByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItLS0tLS0iLCAxMiwgMzIsICIxMDAxIDAwMDEgZGROMCBzc3NzIiwgInB1c2hsIEByZCxycnMiLCAwLAotCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMDEwIDAwMTEgZGROMCBpbW00IiwgInJlcyBAcmQsaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTEwIDAwMTEgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgInJlcyBhZGRyZXNzX2RzdChyZCksaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxMywgMTYsICIwMTEwIDAwMTEgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgInJlcyBhZGRyZXNzX2RzdCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDQsIDE2LCAiMTAxMCAwMDExIGRkZGQgaW1tNCIsICJyZXMgcmQsaW1tNCIsIDAsCi0iLS0tLS0tIiwgMTAsIDE2LCAiMDAxMCAwMDExIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwIiwgInJlcyByZCxycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDExLCA4LCAiMDAxMCAwMDEwIGRkTjAgaW1tNCIsICJyZXNiIEByZCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDExMCAwMDEwIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJyZXNiIGFkZHJlc3NfZHN0KHJkKSxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDEzLCA4LCAiMDExMCAwMDEwIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJyZXNiIGFkZHJlc3NfZHN0LGltbTQiLCAwLAotICAiLS0tLS0tIiwgNCwgOCwgIjEwMTAgMDAxMCBkZGRkIGltbTQiLCAicmVzYiByYmQsaW1tNCIsIDAsCi0iLS0tLS0tIiwgMTAsIDgsICIwMDEwIDAwMTAgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAiLCAicmVzYiByYmQscnMiLCAwLAotCi0gICJDWlNWLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBpbW00IDAwMTEiLCAicmVzZmxnIGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTAsIDE2LCAiMTAwMSAxMTEwIDAwMDAgY2NjYyIsICJyZXQgY2MiLCAwLAotCi0gICJDWlNWLS0iLCA2LCAxNiwgIjEwMTEgMDAxMSBkZGRkIDAwSTAiLCAicmwgcmQsaW1tMW9yMiIsIDAsCi0gICJDWlNWLS0iLCA2LCA4LCAiMTAxMSAwMDEwIGRkZGQgMDBJMCIsICJybGIgcmJkLGltbTFvcjIiLCAwLAotICAiQ1pTVi0tIiwgNiwgMTYsICIxMDExIDAwMTEgZGRkZCAxMEkwIiwgInJsYyByZCxpbW0xb3IyIiwgMCwKLQotICAiLVotLS0tIiwgOSwgOCwgIjEwMTEgMDAxMCBkZGRkIDEwSTAiLCAicmxjYiByYmQsaW1tMW9yMiIsIDAsCi0gICItWi0tLS0iLCA5LCA4LCAiMTAxMSAxMTEwIGFhYWEgYmJiYiIsICJybGRiIHJiYixyYmEiLCAwLAotCi0gICJDWlNWLS0iLCA2LCAxNiwgIjEwMTEgMDAxMSBkZGRkIDAxSTAiLCAicnIgcmQsaW1tMW9yMiIsIDAsCi0gICJDWlNWLS0iLCA2LCA4LCAiMTAxMSAwMDEwIGRkZGQgMDFJMCIsICJycmIgcmJkLGltbTFvcjIiLCAwLAotICAiQ1pTVi0tIiwgNiwgMTYsICIxMDExIDAwMTEgZGRkZCAxMUkwIiwgInJyYyByZCxpbW0xb3IyIiwgMCwKLQotICAiLVotLS0tIiwgOSwgOCwgIjEwMTEgMDAxMCBkZGRkIDExSTAiLCAicnJjYiByYmQsaW1tMW9yMiIsIDAsCi0gICItWi0tLS0iLCA5LCA4LCAiMTAxMSAxMTAwIGFhYWEgYmJiYiIsICJycmRiIHJiYixyYmEiLCAwLAotICAiQ1pTVi0tIiwgNSwgMTYsICIxMDExIDAxMTEgc3NzcyBkZGRkIiwgInNiYyByZCxycyIsIDAsCi0gICJDWlNWREgiLCA1LCA4LCAiMTAxMSAwMTEwIHNzc3MgZGRkZCIsICJzYmNiIHJiZCxyYnMiLCAwLAotCi0gICJDWlNWREgiLCAzMywgOCwgIjAxMTEgMTExMSBpbW04IiwgInNjIGltbTgiLCAwLAotCi0iQ1pTVi0tIiwgMTUsIDE2LCAiMTAxMSAwMDExIGRkZGQgMTAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwIiwgInNkYSByZCxycyIsIDAsCi0iQ1pTVi0tIiwgMTUsIDgsICIxMDExIDAwMTAgZGRkZCAxMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RhYiByYmQscnMiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDMyLCAiMTAxMSAwMDExIGRkZGQgMTExMSAwMDAwIHNzc3MgMDAwMCAwMDAwIiwgInNkYWwgcnJkLHJzIiwgMCwKLQotIkNaUy0tLSIsIDE1LCAxNiwgIjEwMTEgMDAxMSBkZGRkIDAwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGwgcmQscnMiLCAwLAotIkNaUy0tLSIsIDE1LCA4LCAiMTAxMSAwMDEwIGRkZGQgMDAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwIiwgInNkbGIgcmJkLHJzIiwgMCwKLSAgIkNaUy0tLSIsIDE1LCAzMiwgIjEwMTEgMDAxMSBkZGRkIDAxMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGxsIHJyZCxycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDExLCAxNiwgIjAwMTAgMDEwMSBkZE4wIGltbTQiLCAic2V0IEByZCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMTAgMDEwMSBkZE4wIGltbTQgYWRkcmVzc19kc3QiLCAic2V0IGFkZHJlc3NfZHN0KHJkKSxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDEzLCAxNiwgIjAxMTAgMDEwMSAwMDAwIGltbTQgYWRkcmVzc19kc3QiLCAic2V0IGFkZHJlc3NfZHN0LGltbTQiLCAwLAotICAiLS0tLS0tIiwgNCwgMTYsICIxMDEwIDAxMDEgZGRkZCBpbW00IiwgInNldCByZCxpbW00IiwgMCwKLSItLS0tLS0iLCAxMCwgMTYsICIwMDEwIDAxMDEgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAiLCAic2V0IHJkLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDExLCA4LCAiMDAxMCAwMTAwIGRkTjAgaW1tNCIsICJzZXRiIEByZCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDExMCAwMTAwIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJzZXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDEzLCA4LCAiMDExMCAwMTAwIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJzZXRiIGFkZHJlc3NfZHN0LGltbTQiLCAwLAotICAiLS0tLS0tIiwgNCwgOCwgIjEwMTAgMDEwMCBkZGRkIGltbTQiLCAic2V0YiByYmQsaW1tNCIsIDAsCi0iLS0tLS0tIiwgMTAsIDgsICIwMDEwIDAxMDAgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAiLCAic2V0YiByYmQscnMiLCAwLAotCi0gICJDWlNWLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBpbW00IDAwMDEiLCAic2V0ZmxnIGltbTQiLCAwLAotCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMTAwIGRkZGQgMDEwMSBpbW0xNiIsICJzaW5iIHJiZCxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMTAxIGRkZGQgMDEwMSBpbW0xNiIsICJzaW5iIHJkLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDAsIDE2LCAiMDAxMSAxMDExIHNzTjAgMTAwMCAwMDAxIGFhYWEgZGROMCAxMDAwIiwgInNpbmQgQHJkLEBycyxyYSIsIDAsCi0gICItLS0tLS0iLCAwLCA4LCAiMDAxMSAxMDEwIHNzTjAgMTAwMCAwMDAxIGFhYWEgZGROMCAxMDAwIiwgInNpbmRiIEByZCxAcnMscmJhIiwgMCwKLSAgIi0tLS0tLSIsIDAsIDgsICIwMDExIDExMDAgc3NOMCAwMDAxIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAic2luaWIgQHJkLEBycyxyYSIsIDAsCi0gICItLS0tLS0iLCAwLCAxNiwgIjAwMTEgMTEwMCBzc04wIDAwMDEgMDAwMCBhYWFhIGRkTjAgMDAwMCIsICJzaW5pYnIgQHJkLEBycyxyYSIsIDAsCi0KLSAgIkNaU1YtLSIsIDEzLCAxNiwgIjEwMTEgMDAxMSBkZGRkIDEwMDEgMDAwMCAwMDAwIGltbTgiLCAic2xhIHJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTMsIDgsICIxMDExIDAwMTAgZGRkZCAxMDAxICAwMDAwIDAwMDAgaW1tOCIsICJzbGFiIHJiZCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDEzLCAzMiwgIjEwMTEgMDAxMSBkZGRkIDExMDEgMDAwMCAwMDAwIGltbTgiLCAic2xhbCBycmQsaW1tOCIsIDAsCi0KLSAgIkNaUy0tLSIsIDEzLCAxNiwgIjEwMTEgMDAxMSBkZGRkIDAwMDEgMDAwMCAwMDAwIGltbTgiLCAic2xsIHJkLGltbTgiLCAwLAotICAiQ1pTLS0tIiwgMTMsIDgsICIxMDExIDAwMTAgZGRkZCAwMDAxICAwMDAwIDAwMDAgaW1tOCIsICJzbGxiIHJiZCxpbW04IiwgMCwKLSAgIkNaUy0tLSIsIDEzLCAzMiwgIjEwMTEgMDAxMSBkZGRkIDAxMDEgMDAwMCAwMDAwIGltbTgiLCAic2xsbCBycmQsaW1tOCIsIDAsCi0KLSAgIi0tLS0tLSIsIDAsIDE2LCAiMDAxMSAxMDExIHNzc3MgMDExMSBpbW0xNiIsICJzb3V0IGltbTE2LHJzIiwgMCwKLSAgIi0tLS0tLSIsIDAsIDgsICIwMDExIDEwMTAgc3NzcyAwMTExIGltbTE2IiwgInNvdXRiIGltbTE2LHJicyIsIDAsCi0gICItLS0tLS0iLCAwLCAxNiwgIjAwMTEgMTAxMSBzc04wIDEwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJzb3V0ZCBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLS0tLSIsIDAsIDgsICIwMDExIDEwMTAgc3NOMCAxMDExIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAic291dGRiIEByZCxAcnMscmJhIiwgMCwKLSAgIi0tLS0tLSIsIDAsIDgsICIwMDExIDExMDAgc3NOMCAwMDExIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAic291dGliIEByZCxAcnMscmEiLCAwLAotICAiLS0tLS0tIiwgMCwgMTYsICIwMDExIDExMDAgc3NOMCAwMDExIDAwMDAgYWFhYSBkZE4wIDAwMDAiLCAic291dGliciBAcmQsQHJzLHJhIiwgMCwKLQotICAiQ1pTVi0tIiwgMTMsIDE2LCAiMTAxMSAwMDExIGRkZGQgMTAwMSAxMTExIDExMTEgbmltOCIsICJzcmEgcmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxMywgOCwgIjEwMTEgMDAxMCBkZGRkIDEwMDEgMTExMSAxMTExIG5pbTgiLCAic3JhYiByYmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxMywgMzIsICIxMDExIDAwMTEgZGRkZCAxMTAxIDExMTEgMTExMSBuaW04IiwgInNyYWwgcnJkLGltbTgiLCAwLAotCi0gICJDWlNWLS0iLCAxMywgMTYsICIxMDExIDAwMTEgZGRkZCAwMDAxIDExMTEgMTExMSBuaW04IiwgInNybCByZCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDEzLCA4LCAiMTAxMSAwMDEwIGRkZGQgMDAwMSAxMTExIDExMTEgbmltOCIsICJzcmxiIHJiZCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDEzLCAzMiwgIjEwMTEgMDAxMSBkZGRkIDAxMDEgMTExMSAxMTExIG5pbTgiLCAic3JsbCBycmQsaW1tOCIsIDAsCi0KLSAgIkNaU1YtLSIsIDcsIDE2LCAiMDAwMCAwMDExIHNzTjAgZGRkZCIsICJzdWIgcmQsQHJzIiwgMCwKLSJDWlNWLS0iLCA5LCAxNiwgIjAxMDAgMDAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAic3ViIHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDEwLCAxNiwgIjAxMDAgMDAxMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAic3ViIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMDAxMCAwMDAwIGRkZGQgaW1tMTYiLCAic3ViIHJkLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDQsIDE2LCAiMTAwMCAwMDExIHNzc3MgZGRkZCIsICJzdWIgcmQscnMiLCAwLAotCi0gICJDWlNWREgiLCA3LCA4LCAiMDAwMCAwMDEwIHNzTjAgZGRkZCIsICJzdWJiIHJiZCxAcnMiLCAwLAotIkNaU1ZESCIsIDksIDgsICIwMTAwIDAwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YmIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1ZESCIsIDEwLCA4LCAiMDEwMCAwMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWJiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVkRIIiwgNywgOCwgIjAwMDAgMDAxMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgInN1YmIgcmJkLGltbTgiLCAwLAotICAiQ1pTVkRIIiwgNCwgOCwgIjEwMDAgMDAxMCBzc3NzIGRkZGQiLCAic3ViYiByYmQscmJzIiwgMCwKLQotICAiQ1pTVi0tIiwgMTQsIDMyLCAiMDAwMSAwMDEwIHNzTjAgZGRkZCIsICJzdWJsIHJyZCxAcnMiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDMyLCAiMDEwMSAwMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWJsIHJyZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxNiwgMzIsICIwMTAxIDAwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YmwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCAxNCwgMzIsICIwMDAxIDAwMTAgMDAwMCBkZGRkIGltbTMyIiwgInN1YmwgcnJkLGltbTMyIiwgMCwKLSAgIkNaU1YtLSIsIDgsIDMyLCAiMTAwMSAwMDEwIHNzc3MgZGRkZCIsICJzdWJsIHJyZCxycnMiLCAwLAotCi0gICItLS0tLS0iLCA1LCAxNiwgIjEwMTAgMTExMSBkZGRkIGNjY2MiLCAidGNjIGNjLHJkIiwgMCwKLSAgIi0tLS0tLSIsIDUsIDgsICIxMDEwIDExMTAgZGRkZCBjY2NjIiwgInRjY2IgY2MscmJkIiwgMCwKLQotICAiLVpTLS0tIiwgOCwgMTYsICIwMDAwIDExMDEgZGROMCAwMTAwIiwgInRlc3QgQHJkIiwgMCwKLSAgIi0tLS0tLSIsIDExLCAxNiwgIjAxMDAgMTEwMSAwMDAwIDAxMDAgYWRkcmVzc19kc3QiLCAidGVzdCBhZGRyZXNzX2RzdCIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMTAwIDExMDEgZGROMCAwMTAwIGFkZHJlc3NfZHN0IiwgInRlc3QgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGRkZGQgMDEwMCIsICJ0ZXN0IHJkIiwgMCwKLQotICAiLVpTUC0tIiwgOCwgOCwgIjAwMDAgMTEwMCBkZE4wIDAxMDAiLCAidGVzdGIgQHJkIiwgMCwKLSAgIi1aU1AtLSIsIDExLCA4LCAiMDEwMCAxMTAwIDAwMDAgMDEwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0YiBhZGRyZXNzX2RzdCIsIDAsCi0gICItWlNQLS0iLCAxMiwgOCwgIjAxMDAgMTEwMCBkZE4wIDAxMDAgYWRkcmVzc19kc3QiLCAidGVzdGIgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi1aU1AtLSIsIDcsIDgsICIxMDAwIDExMDAgZGRkZCAwMTAwIiwgInRlc3RiIHJiZCIsIDAsCi0KLSAgIi1aUy0tLSIsIDEzLCAzMiwgIjAwMDEgMTEwMCBkZE4wIDEwMDAiLCAidGVzdGwgQHJkIiwgMCwKLSItWlMtLS0iLCAxNiwgMzIsICIwMTAxIDExMDAgMDAwMCAxMDAwIGFkZHJlc3NfZHN0IiwgInRlc3RsIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi1aUy0tLSIsIDE3LCAzMiwgIjAxMDEgMTEwMCBkZE4wIDEwMDAgYWRkcmVzc19kc3QiLCAidGVzdGwgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi1aUy0tLSIsIDEzLCAzMiwgIjEwMDEgMTEwMCBkZGRkIDEwMDAiLCAidGVzdGwgcnJkIiwgMCwKLQotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgZGROMCAxMDAwIDAwMDAgYWFhYSBzc04wIDAwMDAiLCAidHJkYiBAcmQsQHJzLHJiYSIsIDAsCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBkZE4wIDExMDAgMDAwMCBhYWFhIHNzTjAgMDAwMCIsICJ0cmRyYiBAcmQsQHJzLHJiYSIsIDAsCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBkZE4wIDAwMDAgMDAwMCBycnJyIHNzTjAgMDAwMCIsICJ0cmliIEByZCxAcnMscmJyIiwgMCwKLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGRkTjAgMDEwMCAwMDAwIHJycnIgc3NOMCAwMDAwIiwgInRyaXJiIEByZCxAcnMscmJyIiwgMCwKLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGFhTjAgMTExMCAwMDAwIHJycnIgYmJOMCAxMTEwIiwgInRydGRyYiBAcmEsQHJiLHJiciIsIDAsCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBhYU4wIDAwMTAgMDAwMCBycnJyIGJiTjAgMDAwMCIsICJ0cnRpYiBAcmEsQHJiLHJyIiwgMCwKLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGFhTjAgMDExMCAwMDAwIHJycnIgYmJOMCAxMTEwIiwgInRydGlyYiBAcmEsQHJiLHJiciIsIDAsCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBhYU4wIDEwMTAgMDAwMCBycnJyIGJiTjAgMDAwMCIsICJ0cnRyYiBAcmEsQHJiLHJiciIsIDAsCi0KLSAgIi0tUy0tLSIsIDExLCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAxMTAiLCAidHNldCBAcmQiLCAwLAotICAiLS1TLS0tIiwgMTQsIDE2LCAiMDEwMCAxMTAxIDAwMDAgMDExMCBhZGRyZXNzX2RzdCIsICJ0c2V0IGFkZHJlc3NfZHN0IiwgMCwKLSAgIi0tUy0tLSIsIDE1LCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAxMTAgYWRkcmVzc19kc3QiLCAidHNldCBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS1TLS0tIiwgNywgMTYsICIxMDAwIDExMDEgZGRkZCAwMTEwIiwgInRzZXQgcmQiLCAwLAotCi0gICItLVMtLS0iLCAxMSwgOCwgIjAwMDAgMTEwMCBkZE4wIDAxMTAiLCAidHNldGIgQHJkIiwgMCwKLSAgIi0tUy0tLSIsIDE0LCA4LCAiMDEwMCAxMTAwIDAwMDAgMDExMCBhZGRyZXNzX2RzdCIsICJ0c2V0YiBhZGRyZXNzX2RzdCIsIDAsCi0gICItLVMtLS0iLCAxNSwgOCwgIjAxMDAgMTEwMCBkZE4wIDAxMTAgYWRkcmVzc19kc3QiLCAidHNldGIgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tUy0tLSIsIDcsIDgsICIxMDAwIDExMDAgZGRkZCAwMTEwIiwgInRzZXRiIHJiZCIsIDAsCi0KLSAgIi1aUy0tLSIsIDcsIDE2LCAiMDAwMCAxMDAxIHNzTjAgZGRkZCIsICJ4b3IgcmQsQHJzIiwgMCwKLSItWlMtLS0iLCA5LCAxNiwgIjAxMDAgMTAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAieG9yIHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi1aUy0tLSIsIDEwLCAxNiwgIjAxMDAgMTAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAieG9yIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItWlMtLS0iLCA3LCAxNiwgIjAwMDAgMTAwMSAwMDAwIGRkZGQgaW1tMTYiLCAieG9yIHJkLGltbTE2IiwgMCwKLSAgIi1aUy0tLSIsIDQsIDE2LCAiMTAwMCAxMDAxIHNzc3MgZGRkZCIsICJ4b3IgcmQscnMiLCAwLAotCi0gICItWlNQLS0iLCA3LCA4LCAiMDAwMCAxMDAwIHNzTjAgZGRkZCIsICJ4b3JiIHJiZCxAcnMiLCAwLAotIi1aU1AtLSIsIDksIDgsICIwMTAwIDEwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInhvcmIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi1aU1AtLSIsIDEwLCA4LCAiMDEwMCAxMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJ4b3JiIHJiZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLVpTUC0tIiwgNywgOCwgIjAwMDAgMTAwMCAwMDAwIGRkZGQgaW1tOCBpbW04IiwgInhvcmIgcmJkLGltbTgiLCAwLAotICAiLVpTUC0tIiwgNCwgOCwgIjEwMDAgMTAwMCBzc3NzIGRkZGQiLCAieG9yYiByYmQscmJzIiwgMCwKLSAgIioiLCA0LCA4LCAiMTAwMCAxMDAwIHNzc3MgZGRkZCIsICJ4b3JiIHJiZCxyYnMiLCAwLAotICAiKiIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLX07Ci0KLWludAotY291bnQgKCkKLXsKLSAgc3RydWN0IG9wICpwID0gb3B0OwotICBpbnQgciA9IDA7Ci0KLSAgd2hpbGUgKHAtPm5hbWUpCi0gICAgewotICAgICAgcisrOwotICAgICAgcCsrOwotICAgIH0KLSAgcmV0dXJuIHI7Ci0KLX0KLQotc3RhdGljCi1pbnQKLWZ1bmMgKGEsIGIpCi0gICAgIHN0cnVjdCBvcCAqYTsKLSAgICAgc3RydWN0IG9wICpiOwotewotICByZXR1cm4gc3RyY21wICgoYSktPm5hbWUsIChiKS0+bmFtZSk7Ci19Ci0KLQotLyogb3Bjb2RlCi0KLSBsaXRlcmFsICAwMDAwIG5ubm4gaW5zZXJ0IG5ubiBpbnRvIHN0cmVhbQotIG9wZXJhbmQgIDAwMDEgbm5ubiAgaW5zZXJ0IG9wZXJhbmQgcmVnIG5ubiBpbnRvIHN0cmVhbQotKi8KLQotc3RydWN0IHRva19zdHJ1Y3QKLXsKLQotICBjaGFyICptYXRjaDsKLSAgY2hhciAqdG9rZW47Ci0gIGludCBsZW5ndGg7Ci19OwotCi1zdHJ1Y3QgdG9rX3N0cnVjdCBhcmdzW10gPQotewotCi0gIHsiYWRkcmVzc19zcmMocnMpIiwgIkNMQVNTX1grKEFSR19SUykiLH0sCi0gIHsiYWRkcmVzc19kc3QocmQpIiwgIkNMQVNTX1grKEFSR19SRCkiLH0sCi0KLSAgeyJycyhpbW0xNikiLCAiQ0xBU1NfQkErKEFSR19SUykiLH0sCi0gIHsicmQoaW1tMTYpIiwgIkNMQVNTX0JBKyhBUkdfUkQpIix9LAotICB7InByZCIsICAgICAgICJDTEFTU19QUisoQVJHX1JEKSIsfSwKLSAgeyJhZGRyZXNzX3NyYyIsICJDTEFTU19EQSsoQVJHX1NSQykiLH0sCi0gIHsiYWRkcmVzc19kc3QiLCAiQ0xBU1NfREErKEFSR19EU1QpIix9LAotICB7InJkKHJ4KSIsICJDTEFTU19CWCsoQVJHX1JEKSIsfSwKLSAgeyJycyhyeCkiLCAiQ0xBU1NfQlgrKEFSR19SUykiLH0sCi0KLSAgeyJkaXNwMTYiLCAiQ0xBU1NfRElTUCIsfSwKLSAgeyJkaXNwMTIiLCAiQ0xBU1NfRElTUCIsfSwKLSAgeyJkaXNwNyIsICJDTEFTU19ESVNQIix9LAotICB7ImRpc3A4IiwgIkNMQVNTX0RJU1AiLH0sCi0gIHsiZmxhZ3MiLCAiQ0xBU1NfRkxBR1MiLH0sCi0KLSAgeyJpbW0xNiIsICJDTEFTU19JTU0rKEFSR19JTU0xNikiLH0sCi0gIHsiaW1tMW9yMiIsICJDTEFTU19JTU0rKEFSR19JTU0xT1IyKSIsfSwKLSAgeyJpbW0zMiIsICJDTEFTU19JTU0rKEFSR19JTU0zMikiLH0sCi0gIHsiaW1tNG0xIiwgIkNMQVNTX0lNTSArKEFSR19JTU00TTEpIix9LAotICB7ImltbTQiLCAiQ0xBU1NfSU1NICsoQVJHX0lNTTQpIix9LAotICB7Im4iLCAiQ0xBU1NfSU1NICsgKEFSR19JTU1OKSIsfSwKLSAgeyJjdHJsIiwgIkNMQVNTX0NUUkwiLH0sCi0gIHsicmJhIiwgIkNMQVNTX1JFR19CWVRFKyhBUkdfUkEpIix9LAotICB7InJiYiIsICJDTEFTU19SRUdfQllURSsoQVJHX1JCKSIsfSwKLSAgeyJyYmQiLCAiQ0xBU1NfUkVHX0JZVEUrKEFSR19SRCkiLH0sCi0gIHsicmJzIiwgIkNMQVNTX1JFR19CWVRFKyhBUkdfUlMpIix9LAotICB7InJiciIsICJDTEFTU19SRUdfQllURSsoQVJHX1JSKSIsfSwKLQotICB7InJyZCIsICJDTEFTU19SRUdfTE9ORysoQVJHX1JEKSIsfSwKLSAgeyJycnMiLCAiQ0xBU1NfUkVHX0xPTkcrKEFSR19SUykiLH0sCi0KLSAgeyJycWQiLCAiQ0xBU1NfUkVHX1FVQUQrKEFSR19SRCkiLH0sCi0KLSAgeyJyZCIsICJDTEFTU19SRUdfV09SRCsoQVJHX1JEKSIsfSwKLSAgeyJycyIsICJDTEFTU19SRUdfV09SRCsoQVJHX1JTKSIsfSwKLQotICB7IkByZCIsICJDTEFTU19JUisoQVJHX1JEKSIsfSwKLSAgeyJAcmEiLCAiQ0xBU1NfSVIrKEFSR19SQSkiLH0sCi0gIHsiQHJiIiwgIkNMQVNTX0lSKyhBUkdfUkIpIix9LAotICB7IkBycyIsICJDTEFTU19JUisoQVJHX1JTKSIsfSwKLQotICB7ImltbTgiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NOCkiLH0sCi0gIHsiaTIiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMikiLH0sCi0gIHsiY2MiLCAiQ0xBU1NfQ0MiLH0sCi0KLSAgeyJyciIsICJDTEFTU19SRUdfV09SRCsoQVJHX1JSKSIsfSwKLSAgeyJyYSIsICJDTEFTU19SRUdfV09SRCsoQVJHX1JBKSIsfSwKLSAgeyJycyIsICJDTEFTU19SRUdfV09SRCsoQVJHX1JTKSIsfSwKLQotICB7IjEiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NXzEpIix9LAotICB7IjIiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NXzIpIix9LAotCi0gIDAsIDAKLX07Ci0KLXN0cnVjdCB0b2tfc3RydWN0IHRva3NbXSA9Ci17Ci0gICIwMDAwIiwgIkNMQVNTX0JJVCswIiwgMSwKLSAgIjAwMDEiLCAiQ0xBU1NfQklUKzEiLCAxLAotICAiMDAxMCIsICJDTEFTU19CSVQrMiIsIDEsCi0gICIwMDExIiwgIkNMQVNTX0JJVCszIiwgMSwKLSAgIjAxMDAiLCAiQ0xBU1NfQklUKzQiLCAxLAotICAiMDEwMSIsICJDTEFTU19CSVQrNSIsIDEsCi0gICIwMTEwIiwgIkNMQVNTX0JJVCs2IiwgMSwKLSAgIjAxMTEiLCAiQ0xBU1NfQklUKzciLCAxLAotICAiMTAwMCIsICJDTEFTU19CSVQrOCIsIDEsCi0gICIxMDAxIiwgIkNMQVNTX0JJVCs5IiwgMSwKLSAgIjEwMTAiLCAiQ0xBU1NfQklUKzB4YSIsIDEsCi0gICIxMDExIiwgIkNMQVNTX0JJVCsweGIiLCAxLAotICAiMTEwMCIsICJDTEFTU19CSVQrMHhjIiwgMSwKLSAgIjExMDEiLCAiQ0xBU1NfQklUKzB4ZCIsIDEsCi0gICIxMTEwIiwgIkNMQVNTX0JJVCsweGUiLCAxLAotICAiMTExMSIsICJDTEFTU19CSVQrMHhmIiwgMSwKLQotICAiMDBJMCIsICJDTEFTU19CSVRfMU9SMiswIiwgMSwKLSAgIjAwSTAiLCAiQ0xBU1NfQklUXzFPUjIrMSIsIDEsCi0gICIwMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzIiLCAxLAotICAiMDBJMCIsICJDTEFTU19CSVRfMU9SMiszIiwgMSwKLSAgIjAxSTAiLCAiQ0xBU1NfQklUXzFPUjIrNCIsIDEsCi0gICIwMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzUiLCAxLAotICAiMDFJMCIsICJDTEFTU19CSVRfMU9SMis2IiwgMSwKLSAgIjAxSTAiLCAiQ0xBU1NfQklUXzFPUjIrNyIsIDEsCi0gICIxMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzgiLCAxLAotICAiMTBJMCIsICJDTEFTU19CSVRfMU9SMis5IiwgMSwKLSAgIjEwSTAiLCAiQ0xBU1NfQklUXzFPUjIrMHhhIiwgMSwKLSAgIjEwSTAiLCAiQ0xBU1NfQklUXzFPUjIrMHhiIiwgMSwKLSAgIjExSTAiLCAiQ0xBU1NfQklUXzFPUjIrMHhjIiwgMSwKLSAgIjExSTAiLCAiQ0xBU1NfQklUXzFPUjIrMHhkIiwgMSwKLSAgIjExSTAiLCAiQ0xBU1NfQklUXzFPUjIrMHhlIiwgMSwKLSAgIjExSTAiLCAiQ0xBU1NfQklUXzFPUjIrMHhmIiwgMSwKLQotICAic3NzcyIsICJDTEFTU19SRUcrKEFSR19SUykiLCAxLAotICAiZGRkZCIsICJDTEFTU19SRUcrKEFSR19SRCkiLCAxLAotICAiYWFhYSIsICJDTEFTU19SRUcrKEFSR19SQSkiLCAxLAotICAiYmJiYiIsICJDTEFTU19SRUcrKEFSR19SQikiLCAxLAotICAicnJyciIsICJDTEFTU19SRUcrKEFSR19SUikiLCAxLAotCi0gICJzc04wIiwgIkNMQVNTX1JFR04wKyhBUkdfUlMpIiwgMSwKLSAgImRkTjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SRCkiLCAxLAotICAiYWFOMCIsICJDTEFTU19SRUdOMCsoQVJHX1JBKSIsIDEsCi0gICJiYk4wIiwgIkNMQVNTX1JFR04wKyhBUkdfUkIpIiwgMSwKLSAgInJyTjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SUikiLCAxLAotCi0gICJjY2NjIiwgIkNMQVNTX0NDIiwgMSwKLSAgIm5ubm4iLCAiQ0xBU1NfSU1NKyhBUkdfSU1NTikiLCAxLAotICAieHh4eCIsICJDTEFTU19SRUcrKEFSR19SWCkiLCAxLAotICAieHhOMCIsICJDTEFTU19SRUdOMCsoQVJHX1JYKSIsIDEsCi0gICJubWludXMxIiwgIkNMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpIiwgMSwKLQotICAiZGlzcDE2IiwgIkNMQVNTX0RJU1ArKEFSR19ESVNQMTYpIiwgNCwKLSAgImRpc3AxMiIsICJDTEFTU19ESVNQKyhBUkdfRElTUDEyKSIsIDMsCi0gICJmbGFncyIsICJDTEFTU19GTEFHUyIsIDEsCi0gICJhZGRyZXNzX2RzdCIsICJDTEFTU19BRERSRVNTKyhBUkdfRFNUKSIsIDQsCi0gICJhZGRyZXNzX3NyYyIsICJDTEFTU19BRERSRVNTKyhBUkdfU1JDKSIsIDQsCi0gICJpbW00bTEiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSIsIDEsCi0gICJpbW00IiwgIkNMQVNTX0lNTSsoQVJHX0lNTTQpIiwgMSwKLQotICAiaW1tOCIsICJDTEFTU19JTU0rKEFSR19JTU04KSIsIDIsCi0gICJpbW0xNiIsICJDTEFTU19JTU0rKEFSR19JTU0xNikiLCA0LAotICAiaW1tMzIiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NMzIpIiwgOCwKLSAgIm5pbTgiLCAiQ0xBU1NfSU1NKyhBUkdfTklNOCkiLCAyLAotICAiMGNjYyIsICJDTEFTU18wQ0NDIiwgMSwKLSAgIjFjY2MiLCAiQ0xBU1NfMUNDQyIsIDEsCi0gICJkaXNwOCIsICJDTEFTU19ESVNQOCIsIDIsCi0gICIwZGlzcDciLCAiQ0xBU1NfMERJU1A3IiwgMiwKLSAgIjFkaXNwNyIsICJDTEFTU18xRElTUDciLCAyLAotICAiMDFpaSIsICJDTEFTU18wMUlJIiwgMSwKLSAgIjAwaWkiLCAiQ0xBU1NfMDBJSSIsIDEsCi0gIDAsIDAKLQotfTsKLQotY2hhciAqCi10cmFuc2xhdGUgKHRhYmxlLCB4LCBsZW5ndGgpCi0gICAgIHN0cnVjdCB0b2tfc3RydWN0ICp0YWJsZTsKLSAgICAgY2hhciAqeDsKLSAgICAgaW50ICpsZW5ndGg7Ci17Ci0KLSAgaW50IGZvdW5kOwotCi0gIGZvdW5kID0gMDsKLSAgd2hpbGUgKHRhYmxlLT5tYXRjaCkKLSAgICB7Ci0gICAgICBpbnQgbCA9IHN0cmxlbiAodGFibGUtPm1hdGNoKTsKLQotICAgICAgaWYgKHN0cm5jbXAgKHRhYmxlLT5tYXRjaCwgeCwgbCkgPT0gMCkKLQl7Ci0JICAvKiBHb3QgYSBoaXQgKi8KLQkgIHByaW50ZiAoIiVzIiwgdGFibGUtPnRva2VuKTsKLQkgICpsZW5ndGggKz0gdGFibGUtPmxlbmd0aDsKLQkgIHJldHVybiB4ICsgbDsKLQl9Ci0KLSAgICAgIHRhYmxlKys7Ci0gICAgfQotICBmcHJpbnRmIChzdGRlcnIsICJDYW4ndCBmaW5kICVzXG4iLCB4KTsKLSAgcHJpbnRmICgiKioqKiBDYW4ndCBmaW5kICVzXG4iLCB4KTsKLSAgd2hpbGUgKCp4KQotICAgIHgrKzsKLSAgcmV0dXJuIHg7Ci19Ci0KLXZvaWQKLWNoZXdiaXRzIChiaXRzLCBsZW5ndGgpCi0gICAgIGNoYXIgKmJpdHM7Ci0gICAgIGludCAqbGVuZ3RoOwotewotICBpbnQgbiA9IDA7Ci0KLSAgKmxlbmd0aCA9IDA7Ci0gIHByaW50ZiAoInsiKTsKLSAgd2hpbGUgKCpiaXRzKQotICAgIHsKLSAgICAgIHdoaWxlICgqYml0cyA9PSAnICcpCi0JewotCSAgYml0cysrOwotCX0KLSAgICAgIGJpdHMgPSB0cmFuc2xhdGUgKHRva3MsIGJpdHMsIGxlbmd0aCk7Ci0gICAgICBuKys7Ci0gICAgICBwcmludGYgKCIsIik7Ci0KLSAgICB9Ci0gIHdoaWxlIChuIDwgQllURV9JTkZPX0xFTiAtIDEpCi0gICAgewotICAgICAgcHJpbnRmICgiMCwiKTsKLSAgICAgIG4rKzsKLSAgICB9Ci0gIHByaW50ZiAoIn0iKTsKLX0KLQotCi1zdGF0aWMKLWludAotY2hld25hbWUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKm47Ci0gIGludCBuYXJncyA9IDA7Ci0KLSAgbiA9IG5hbWU7Ci0gIHByaW50ZiAoIlwiIik7Ci0gIHdoaWxlICgqbiAmJiAhaXN3aGl0ZSAoKm4pKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiVjIiwgKm4pOwotICAgICAgbisrOwotICAgIH0KLSAgcHJpbnRmICgiXCIsIik7CQkvKiBTY2FuIHRoZSBvcGVyYW5kcyBhbmQgbWFrZSBlbnRpcmVzIGZvcgotCQkJCSAgIHRoZW0gLXJlbWVtYmVyIGluZGlyZWN0IHRoaW5ncyAqLwotCi0gIG4gPSBuYW1lOwotICBwcmludGYgKCJPUENfIik7Ci0gIHdoaWxlICgqbiAmJiAhaXN3aGl0ZSAoKm4pKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiVjIiwgKm4pOwotICAgICAgbisrOwotICAgIH0KLSAgcHJpbnRmICgiLDAseyIpOwotCi0gIHdoaWxlICgqbikKLSAgICB7Ci0gICAgICBpbnQgZDsKLQotICAgICAgd2hpbGUgKCpuID09ICcsJyB8fCBpc3doaXRlICgqbikpCi0JbisrOwotICAgICAgbmFyZ3MrKzsKLSAgICAgIG4gPSB0cmFuc2xhdGUgKGFyZ3MsIG4sICZkKTsKLSAgICAgIHByaW50ZiAoIiwiKTsKLSAgICB9Ci0gIGlmIChuYXJncyA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoIjAiKTsKLSAgICB9Ci0gIHByaW50ZiAoIn0sIik7Ci0gIHJldHVybiBuYXJnczsKLX0KLQotc3RhdGljIAotdm9pZAotc3ViICh4LCBjKQotICAgICBjaGFyICp4OwotICAgICBjaGFyIGM7Ci17Ci0gIHdoaWxlICgqeCkKLSAgICB7Ci0gICAgICBpZiAoeFswXSA9PSBjICYmIHhbMV0gPT0gYyAmJgotCSAgeFsyXSA9PSBjICYmIHhbM10gPT0gYykKLQl7Ci0JICB4WzJdID0gJ04nOwotCSAgeFszXSA9ICcwJzsKLQl9Ci0gICAgICB4Kys7Ci0gICAgfQotfQotCi0KLSNpZiAwCi0jZGVmaW5lIEQoeCkgKCh4KSA9PSAnMScgfHwgKHgpID09JzAnKQotI2RlZmluZSBNKHkpIChzdHJuY21wKHkseCw0KT09MCkKLXByaW50bWFuZ2xlZCAoeCkKLSAgICAgY2hhciAqeDsKLXsKLSAgcmV0dXJuOwotICB3aGlsZSAoKngpCi0gICAgewotICAgICAgaWYgKEQgKHhbMF0pICYmIEQgKHhbMV0pICYmIEQgKHhbMl0pICYmIEQgKHhbM10pKQotCXsKLQkgIHByaW50ZiAoIlhYWFgiKTsKLQl9Ci0gICAgICBlbHNlIGlmIChNICgic3NzcyIpKQotCXsKLQkgIHByaW50ZiAoInNzc3MiKTsKLQl9Ci0gICAgICBlbHNlIGlmIChNICgiZGRkZCIpKQotCXsKLQkgIHByaW50ZiAoImRkZGQiKTsKLQl9Ci0gICAgICBlbHNlCi0JcHJpbnRmICgiX19fXyIpOwotCi0gICAgICB4ICs9IDQ7Ci0KLSAgICAgIGlmICh4WzBdID09ICcgJykKLQl7Ci0JICBwcmludGYgKCJfIik7Ci0JICB4Kys7Ci0JfQotICAgIH0KLQotfQotCi0jZW5kaWYKLS8qI2RlZmluZSBXT1JLX1RZUEUqLwotdm9pZAotcHJpbnRfdHlwZSAobikKLSAgICAgc3RydWN0IG9wICpuOwotewotI2lmZGVmIFdPUktfVFlQRQotICB3aGlsZSAoKnMgJiYgIWlzd2hpdGUgKCpzKSkKLSAgICB7Ci0gICAgICBsID0gKnM7Ci0gICAgICBzKys7Ci0gICAgfQotICBzd2l0Y2ggKGwpCi0gICAgewotICAgIGNhc2UgJ2wnOgotICAgICAgcHJpbnRmICgiMzIsIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICAgIHByaW50ZiAoIjgsIik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcHJpbnRmICgiMTYsIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0jZWxzZQotICBwcmludGYgKCIlMmQsIiwgbi0+dHlwZSk7Ci0jZW5kaWYKLX0KLQotCi12b2lkCi1pbnRlcm5hbCAoKQotewotICBpbnQgYyA9IGNvdW50ICgpOwotICBzdHJ1Y3Qgb3AgKm5ldyA9IHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG9wKSAqIGMpOwotICBzdHJ1Y3Qgb3AgKnAgPSBvcHQ7Ci0gIG1lbWNweSAobmV3LCBwLCBjICogc2l6ZW9mIChzdHJ1Y3Qgb3ApKTsKLQotICAvKiBzb3J0IGFsbCBuYW1lcyBpbiB0YWJsZSBhbHBoYWJldGljYWxseSAqLwotICBxc29ydCAobmV3LCBjLCBzaXplb2YgKHN0cnVjdCBvcCksIGZ1bmMpOwotCi0gIHAgPSBuZXc7Ci0gIHdoaWxlIChwLT5mbGFnc1swXSAhPSAnKicpCi0gIHsKLSAgICAvKiBJZiB0aGVyZSBhcmUgYW55IEBycywgc3ViIHRoZSBzc3NzIGludG8gYSBzc24wLAotICAgICAgIChycyksIChzc24wKQotICAgICAgICovCi0gICAgaW50IGxvb3AgPSAxOwotCi0gICAgcHJpbnRmICgiXCIlc1wiLCUyZCwgIiwgcC0+ZmxhZ3MsIHAtPmN5Y2xlcyk7Ci0gICAgd2hpbGUgKGxvb3ApCi0gICAgewotICAgICAgY2hhciAqcyA9IHAtPm5hbWU7Ci0KLSAgICAgIGxvb3AgPSAwOwotICAgICAgd2hpbGUgKCpzKQotICAgICAgewotCWlmIChzWzBdID09ICdAJykKLQl7Ci0JICBjaGFyIGM7Ci0KLQkgIC8qIHNraXAgdGhlIHIgYW5kIHN1YiB0aGUgc3RyaW5nICovCi0JICBzKys7Ci0JICBjID0gc1sxXTsKLQkgIHN1YiAocC0+Yml0cywgYyk7Ci0JfQotCWlmIChzWzBdID09ICcoJyAmJiBzWzNdID09ICcpJykKLQl7Ci0JICBzdWIgKHAtPmJpdHMsIHNbMl0pOwotCX0KLQlpZiAoc1swXSA9PSAnKCcpCi0JewotCSAgc3ViIChwLT5iaXRzLCBzWy0xXSk7Ci0JfQotCi0JcysrOwotICAgICAgfQotCi0gICAgfQotICAgIHByaW50X3R5cGUgKHApOwotICAgIHByaW50ZiAoIlwiJXNcIixcIiVzXCIsMCxcbiIsIHAtPmJpdHMsIHAtPm5hbWUpOwotICAgIHArKzsKLSAgfQotfQotCi1zdGF0aWMgCi12b2lkCi1nYXMgKCkKLXsKLSAgaW50IGMgPSBjb3VudCAoKTsKLSAgc3RydWN0IG9wICpwID0gb3B0OwotICBpbnQgaWR4ID0gMDsKLSAgY2hhciAqb2xkbmFtZSA9ICIiOwotICBzdHJ1Y3Qgb3AgKm5ldyA9IHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG9wKSAqIGMpOwotCi0gIG1lbWNweSAobmV3LCBwLCBjICogc2l6ZW9mIChzdHJ1Y3Qgb3ApKTsKLQotICAvKiBzb3J0IGFsbCBuYW1lcyBpbiB0YWJsZSBhbHBoYWJldGljYWxseSAqLwotICBxc29ydCAobmV3LCBjLCBzaXplb2YgKHN0cnVjdCBvcCksIGZ1bmMpOwotCi0gIHByaW50ZiAoIgkJCS8qIFRISVMgRklMRSBJUyBBVVRPTUFHSUNBTExZIEdFTkVSQVRFRCwgRE9OJ1QgRURJVCBJVCAqL1xuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfTUFTSyAweDBmXG4iKTsKLQotICBwcmludGYgKCIjZGVmaW5lIEFSR19TUkMgMHgwMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0RTVCAweDAyXG4iKTsKLQotICBwcmludGYgKCIjZGVmaW5lIEFSR19SUyAweDAxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfUkQgMHgwMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JBIDB4MDNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19SQiAweDA0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfUlIgMHgwNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JYIDB4MDZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU00IDB4MDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU04IDB4MDJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU0xNiAweDAzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NMzIgMHgwNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTU4gMHgwNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTU5NSU5VUzEgMHgwNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTV8xIDB4MDZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU1fMiAweDA3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfRElTUDE2IDB4MDhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19OSU04IDB4MDlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU0yIDB4MGFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU0xT1IyIDB4MGJcbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0RJU1AxMiAweDBiXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfRElTUDggMHgwY1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTRNMSAweDBkXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19NQVNLIDB4MWZmZjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1ggMHgxMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfQkEgMHgyMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfREEgMHgzMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfQlggMHg0MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfRElTUCAweDUwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19JTU0gMHg2MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfQ0MgMHg3MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfQ1RSTCAweDgwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19BRERSRVNTIDB4ZDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzBDQ0MgMHhlMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfMUNDQyAweGYwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18wRElTUDcgMHgxMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzFESVNQNyAweDIwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfMDFJSSAweDMwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfMDBJSSAweDQwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfQklUIDB4NTAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19GTEFHUyAweDYwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfSVIgMHg3MDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0RJU1A4IDB4ODAwXG4iKTsKLQotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0JJVF8xT1IyIDB4OTAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19SRUcgMHg3MDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19SRUdfQllURSAweDIwMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFR19XT1JEIDB4MzAwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHX1FVQUQgMHg0MDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19SRUdfTE9ORyAweDUwMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFR04wIDB4ODAwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUFIgMHgxMDAwMFxuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYWRjIDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hZGNiIDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hZGQgMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FkZGIgM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FkZGwgNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FuZCA1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYW5kYiA2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYml0IDdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19iaXRiIDhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jYWxsIDlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jYWxyIDEwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY2xyIDExXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY2xyYiAxMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NvbSAxM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NvbWIgMTRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jb21mbGcgMTVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcCAxNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwYiAxN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwZCAxOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwZGIgMTlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGRyIDIwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BkcmIgMjFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGkgMjJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGliIDIzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BpciAyNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwaXJiIDI1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BsIDI2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzZCAyN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2RiIDI4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzZHIgMjlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNkcmIgMzBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNpIDMxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzaWIgMzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNpciAzM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2lyYiAzNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RhYiAzNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Riam56IDM2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZGVjIDM3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZGVjYiAzOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RpIDM5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZGl2IDQwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZGl2bCA0MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2RqbnogNDJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19laSA0M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4IDQ0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXhiIDQ1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0cyA0NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dHNiIDQ3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0c2wgNDhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19oYWx0IDQ5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW4gNTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbmIgNTFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbmMgNTJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbmNiIDUzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5kIDU0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5kYiA1NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luaWIgNTZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbmliciA1N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2lyZXQgNThcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19qcCA1OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2pyIDYwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGQgNjFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGEgNjJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGFyIDYzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRiIDY0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRjdGwgNjVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGlyIDY2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRpcmIgNjdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGsgNjhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGwgNjlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZG0gNzBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZHBzIDcxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRyIDcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRyYiA3M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkcmwgNzRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19tYml0IDc1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbXJlcSA3NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX21yZXMgNzdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19tc2V0IDc4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbXVsdCA3OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX211bHRsIDgwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbmVnIDgxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbmVnYiA4MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX25vcCA4M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX29yIDg0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfb3JiIDg1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfb3V0IDg2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfb3V0YiA4N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dGQgODhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXRkYiA4OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dGliIDkwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfb3V0aWJyIDkxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcG9wIDkyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcG9wbCA5M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3B1c2ggOTRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19wdXNobCA5NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JlcyA5NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3Jlc2IgOTdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yZXNmbGcgOThcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yZXQgOTlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ybCAxMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ybGIgMTAxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmxjIDEwMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JsY2IgMTAzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmxkYiAxMDRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yciAxMDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ycmIgMTA2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnJjIDEwN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JyY2IgMTA4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnJkYiAxMDlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zYmMgMTEwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2JjYiAxMTFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZGEgMTEyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RhYiAxMTNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZGFsIDExNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkbCAxMTVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZGxiIDExNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkbGwgMTE3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2V0IDExOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NldGIgMTE5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2V0ZmxnIDEyMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NpbmIgMTIxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2luZCAxMjJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zaW5kYiAxMjNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zaW5pYiAxMjRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zaW5pYnIgMTI1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2xhIDEyNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsYWIgMTI3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2xhbCAxMjhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGwgMTI5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2xsYiAxMzBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGxsIDEzMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXQgMTMyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc291dGIgMTMzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc291dGQgMTM0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc291dGRiIDEzNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXRpYiAxMzZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0aWJyIDEzN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NyYSAxMzhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmFiIDEzOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NyYWwgMTQwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JsIDE0MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NybGIgMTQyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JsbCAxNDNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zdWIgMTQ0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3ViYiAxNDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zdWJsIDE0NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RjYyAxNDdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190Y2NiIDE0OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3Rlc3QgMTQ5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdGVzdGIgMTUwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdGVzdGwgMTUxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJkYiAxNTJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cmRyYiAxNTNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cmliIDE1NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RyaXJiIDE1NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RydGRyYiAxNTZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cnRpYiAxNTdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cnRpcmIgMTU4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJ0cmIgMTU5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHNldCAxNjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190c2V0YiAxNjFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ194b3IgMTYyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfeG9yYiAxNjNcbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkZCAgMTY0IFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkZGIgIDE2NSBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGRyICAxNjYgXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRkcmIgMTY3ICBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGkgIDE2OCBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGliIDE2OSAgXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2MgICAxNzBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19icHQgICAxNzFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leHQwZSAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leHQwZiAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leHQ4ZSAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leHQ4ZiAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkMzYgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDM4IDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQ3OCAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkN2UgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDlkIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQ5ZiAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkYjkgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZGJmIDE3MlxuIik7Ci0jaWYgMAotICBmb3IgKGkgPSAwOyB0b2tzW2ldLnRva2VuOyBpKyspCi0gICAgcHJpbnRmICgiI2RlZmluZSAlc1x0MHgleFxuIiwgdG9rc1tpXS50b2tlbiwgaSAqIDE2KTsKLSNlbmRpZgotICBwcmludGYgKCJ0eXBlZGVmIHN0cnVjdCB7XG4iKTsKLQotICBwcmludGYgKCIjaWZkZWYgTklDRU5BTUVTXG4iKTsKLSAgcHJpbnRmICgiY2hhciAqbmljZW5hbWU7XG4iKTsKLSAgcHJpbnRmICgiaW50IHR5cGU7XG4iKTsKLSAgcHJpbnRmICgiaW50IGN5Y2xlcztcbiIpOwotICBwcmludGYgKCJpbnQgZmxhZ3M7XG4iKTsKLSAgcHJpbnRmICgiI2VuZGlmXG4iKTsKLSAgcHJpbnRmICgiY2hhciAqbmFtZTtcbiIpOwotICBwcmludGYgKCJ1bnNpZ25lZCBjaGFyIG9wY29kZTtcbiIpOwotICBwcmludGYgKCJ2b2lkICgqZnVuYykoKTtcbiIpOwotICBwcmludGYgKCJ1bnNpZ25lZCBpbnQgYXJnX2luZm9bNF07XG4iKTsKLSAgcHJpbnRmICgidW5zaWduZWQgaW50IGJ5dGVfaW5mb1slZF07XG4iLCBCWVRFX0lORk9fTEVOKTsKLSAgcHJpbnRmICgiaW50IG5vcGVyYW5kcztcbiIpOwotICBwcmludGYgKCJpbnQgbGVuZ3RoO1xuIik7Ci0gIHByaW50ZiAoImludCBpZHg7XG4iKTsKLSAgcHJpbnRmICgifSBvcGNvZGVfZW50cnlfdHlwZTtcbiIpOwotICBwcmludGYgKCIjaWZkZWYgREVGSU5FX1RBQkxFXG4iKTsKLSAgcHJpbnRmICgib3Bjb2RlX2VudHJ5X3R5cGUgejhrX3RhYmxlW10gPSB7XG4iKTsKLQotICB3aGlsZSAobmV3LT5mbGFncyAmJiBuZXctPmZsYWdzWzBdKQotICAgIHsKLSAgICAgIGludCBuYXJnczsKLSAgICAgIGludCBsZW5ndGg7Ci0KLSAgICAgIHByaW50ZiAoIlxuXG4vKiAlcyAqKiogJXMgKi9cbiIsIG5ldy0+Yml0cywgbmV3LT5uYW1lKTsKLSAgICAgIHByaW50ZiAoIntcbiIpOwotCi0gICAgICBwcmludGYgKCIjaWZkZWYgTklDRU5BTUVTXG4iKTsKLSAgICAgIHByaW50ZiAoIlwiJXNcIiwlZCwlZCxcbiIsIG5ldy0+bmFtZSwgbmV3LT50eXBlLCBuZXctPmN5Y2xlcyk7Ci0gICAgICB7Ci0JaW50IGFuc3dlciA9IDA7Ci0JY2hhciAqcCA9IG5ldy0+ZmxhZ3M7Ci0KLQl3aGlsZSAoKnApCi0JICB7Ci0JICAgIGFuc3dlciA8PD0gMTsKLQotCSAgICBpZiAoKnAgIT0gJy0nKQotCSAgICAgIGFuc3dlciB8PSAxOwotCSAgICBwKys7Ci0JICB9Ci0JcHJpbnRmICgiMHglMDJ4LFxuIiwgYW5zd2VyKTsKLSAgICAgIH0KLQotICAgICAgcHJpbnRmICgiI2VuZGlmXG4iKTsKLQotICAgICAgbmFyZ3MgPSBjaGV3bmFtZSAobmV3LT5uYW1lKTsKLQotICAgICAgcHJpbnRmICgiXG5cdCIpOwotICAgICAgY2hld2JpdHMgKG5ldy0+Yml0cywgJmxlbmd0aCk7Ci0gICAgICBsZW5ndGggLz0gMjsKLSAgICAgIGlmIChsZW5ndGggJiAxKQotCWFib3J0KCk7Ci0KLSAgICAgIHByaW50ZiAoIiwlZCwlZCwlZCIsIG5hcmdzLCBsZW5ndGgsIGlkeCk7Ci0gICAgICBpZHgrKzsKLSAgICAgIG9sZG5hbWUgPSBuZXctPm5hbWU7Ci0gICAgICBwcmludGYgKCJ9LFxuIik7Ci0gICAgICBuZXcrKzsKLSAgICB9Ci0gIHByaW50ZiAoIjAsMH07XG4iKTsKLSAgcHJpbnRmICgiI2VuZGlmXG4iKTsKLX0KLQotCi1pbnQKLW1haW4gKGFjLCBhdikKLSAgICAgaW50IGFjOwotICAgICBjaGFyICoqYXY7Ci17Ci0gIHN0cnVjdCBvcCAqcCA9IG9wdDsKLQotICBpZiAoYWMgPT0gMiAmJiBzdHJjbXAgKGF2WzFdLCAiLXQiKSA9PSAwKQotICAgIHsKLSAgICAgIGludGVybmFsICgpOwotICAgIH0KLSAgZWxzZSBpZiAoYWMgPT0gMiAmJiBzdHJjbXAgKGF2WzFdLCAiLWgiKSA9PSAwKQotICAgIHsKLSAgICAgIHdoaWxlIChwLT5uYW1lKQotCXsKLQkgIHByaW50ZiAoIiUtMjVzXHQlc1xuIiwgcC0+bmFtZSwgcC0+Yml0cyk7Ci0JICBwKys7Ci0JfQotICAgIH0KLQotICBlbHNlIGlmIChhYyA9PSAyICYmIHN0cmNtcCAoYXZbMV0sICItYSIpID09IDApCi0gICAgewotICAgICAgZ2FzICgpOwotICAgIH0KLSAgZWxzZSBpZiAoYWMgPT0gMiAmJiBzdHJjbXAgKGF2WzFdLCAiLWQiKSA9PSAwKQotICAgIHsKLSAgICAgIC8qZGlzKCk7Ki8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCJVc2FnZTogJXMgLXRcbiIsIGF2WzBdKTsKLSAgICAgIHByaW50ZiAoIi10IDogZ2VuZXJhdGUgbmV3IHo4LmMgaW50ZXJuYWwgdGFibGVcbiIpOwotICAgICAgcHJpbnRmICgiLWEgOiBnZW5lcmF0ZSBuZXcgdGFibGUgZm9yIGdhc1xuIik7Ci0gICAgICBwcmludGYgKCItZCA6IGdlbmVyYXRlIG5ldyB0YWJsZSBmb3IgZGlzYXNzZW1ibGVcbiIpOwotICAgICAgcHJpbnRmICgiLWggOiBnZW5lcmF0ZSBuZXcgdGFibGUgZm9yIGh1bWFuc1xuIik7Ci0gICAgfQotcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9yZWFkbGluZS9DaGFuZ2VMb2cgYi9yZWFkbGluZS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOGZjZjMuLjAwMDAwMDAKLS0tIGEvcmVhZGxpbmUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsOTgyICswLDAgQEAKLTE5OTktMDQtMjIgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBNYWtlIGNvbW1lbnQgYWJvdXQgdGhpcyBjaGFuZ2UgbW9yZSBleHBsaWNpdC4KLQotMTk5OS0wNC0yMiAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBpbnN0YWxsIHRoZSBmaW5hbCBsaWJyZWFkbGluZS5hCi0gICAgICAgIG9yIC5oIGZpbGVzLgotCi1UdWUgTWFyIDIzIDEwOjU2OjA4IDE5OTkgIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCVBhdGNoZXMgZnJvbSBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQGdteC5uZXQ+OgotIAkKLQkqIGRpc3BsYXkuYzogQ2hhbmdlIHNvbWUgdGVybWluYWwgY2FsbHMgdG8gd29yayBvbiBESkdQUC4KLQkqIHRlcm1pbmFsLmM6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IFJlbW92ZSAuIGZyb20gdGhlIFZQQVRIIGRpcmVjdGl2ZS4KLQkKLVR1ZSBNYXIgIDkgMTQ6NTg6MTMgMTk5OSAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogc3VwcG9ydC9jb25maWcuc3ViOiBSZWNvZ25pemUgY3lnd2luKiwgbm90IGp1c3QgY3lnd2luMzIuCi0KLVR1ZSBGZWIgIDkgMTA6Mzg6NTcgMTk5OSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvIG5vdCB1c2UgdGhlIC4vc3VwcG9ydCBkaXJlY3RvcnkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVdlZCBKYW4gIDYgMTI6MjQ6MTkgMTk5OSAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgTE9DQUxfQ0ZMQUdTIHJhdGhlciB0aGFuIENGTEFHUyBmb3IKLQlzZWFyY2hpbmcgbGlidGVybWNhcCBkaXJlY3RvcnkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVRodSBEZWMgMzEgMTI6MDc6MDEgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZWFyY2ggZGV2byBsaWJ0ZXJtY2FwIGRpcmVjdG9yeSBmb3IgdGVybWNhcC5oCi0Jd2hlbiBjb21waWxpbmcgZm9yIGN5Z3dpbi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLTE5OTgtMTItMzAgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IE9ubHkgdHJ5IHRvIGNvcHkgbGlicmVhZGxpbmUuYSBhbmQKLQlsaWJoaXN0b3J5LmEgaWYgdGhleSBleGlzdC4KLQotVHVlIERlYyAyOSAyMzo0OToyMCAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjcm9zcy1idWlsZC9jeWd3aW4uY2FjaGU6IEFkZCBhIGNvdXBsZSBtb3JlIGtub3duIHNldHRpbmdzLgotCSogY29uZmlndXJlLmluOiBGaXggdHlwby4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLVR1ZSBEZWMgMjkgMTg6MTE6MjggMTk5OCAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgotCi0JKiBjcm9zcy1idWlsZDogbmV3IGRpcmVjdG9yeS4KLQkKLQkqIGNyb3NzLWJ1aWxkL2N5Z3dpbi5jYWNoZTogbmV3IGZpbGUuIFVzZWQgZm9yIEN5Z3dpbiBjcm9zcyBidWlsZHMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgdGVzdHMgZm9yIGNyb3NzLWJ1aWxkIGZvciBDeWd3aW4uCi0KLTE5OTgtMTItMjQgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBDWUdOVVMgTE9DQUwgY29tbWVudC4KLQkqIGFjY29uZmlnLmg6IEFkZCBtaXNzaW5nIGRlZmluZXMuCi0JKiBjb25maWcuaC5ib3Q6IEFkZCBtaXNzaW5nIGNvbnRlbnQuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5oLmluOiBSZWdlbmVyYXRlZC4KLQotV2VkIERlYyAyMyAxNjoyMTo0MSAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBjb21tZW50IG91dCB0aGUgcnVsZSB0byByZWJ1aWxkIGNvbmZpZ3VyZSBieSAKLQlydW5uaW5nIGF1dG9jb25mLiAKLQotVHVlIERlYyAyMiAxMDowMDozMCAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQkqIHNoZWxsLmMgKHNhdmVzdHJpbmcpOiBpZmRlZidkIGl0IG91dC4gCi0KLQkqIEltcG9ydGVkIG5ldyB2ZXJzaW9uIG9mIFJlYWRsaW5lIDIuMi4xLiBSZW1vdmVkIGFsbCB0aGUgQ3lnbnVzCi0JbG9jYWwgY2hhbmdlcy4KLQotCU5ldyBmaWxlczogYWNjb25maWcuaCwgYWNsb2NhbC5tNCwgYW5zaV9zdGRsaWIuaCwgY2FsbGJhY2suYywKLSAJY29uZmlnLmguaW4sIGNvbmZpZ3VyZSwgaGlzdGV4cGFuZC5jLCBoaXN0ZmlsZS5jLCBoaXN0bGliLmgsCi0gCWhpc3RzZWFyY2guYywgaW5wdXQuYywga2lsbC5jLCBtYWNyby5jLCBubHMuYywgcG9zaXhkaXIuaCwKLSAJcG9zaXhqbXAuaCwgcG9zaXhzdGF0LmgsIHJsY29uZi5oLCBybHR0eS5oLCBybHdpbnNpemUuaCwgc2hlbGwuYywKLSAJdGNhcC5oLCB0ZXJtaW5hbC5jLCB1bmRvLmMsIHV0aWwuYywgc3VwcG9ydCBkaXJlY3RvcnkuCi0KLQlSZW1vdmVkIGZpbGVzOiBzeXNkZXAqLCBjb25maWcgZGlyZWN0b3J5LgotCQotCi1GcmkgRGVjICA0IDE1OjI1OjQxIDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieSBKaW0gQmxhbmR5Ci0gCTxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4gYW5kIERhdmlkIFRheWxvcgotIAk8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+IGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvIG1lcmdlIGluIGNoYW5nZXMKLSAJbWFkZSBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLQkqIGNvbmZpZy9tcC1lbmFibGUtdHVpOiBOZXcgZmlsZS4KLQkoVFVJX0NGTEFHUyk6IFNlYXJjaCBkZXZvJ3MgaW5jbHVkZSBkaXJlY3RvcnksIGFzIGxvbmcgYXMgd2UncmUKLSAJdG90YWxseSBydWluaW5nIG1vZHVsYXJpdHkuCi0JKElOQ0xVREVfU1JDRElSKTogTmV3IHZhci4KLQkoR0RCX1RVSV9TUkNESVIpOiBGaXggc3ludGF4IGVycm9yLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIHRoZSAtLWVuYWJsZS10dWkgZmxhZzsgaWYgaXQncyBzZXQsIGluY2x1ZGUKLSAJYSBtYWtlZmlsZSBmcmFnbWVudCB0aGF0ICNkZWZpbmVzIFRVSSBhbmQgYWRkcyB0aGUgbmVlZGVkICNpbmNsdWRlCi0gCWRpcmVjdG9yaWVzLgotCSgqLSotaHB1eCopOiBOZXcgaG9zdDsgdXNlIHN5c2RlcC1ocHV4LmguCi0KLQkqIE1ha2VmaWxlLmluICguYy5vKTogQ2hlY2sgdGhlIHZhcmlhYmxlIHNldCBpbiB0aGUgbWFrZWZpbGUKLQlmcmFnbWVudCBhYm92ZS4KLQotCSogZGlzcGxheS5jICh0ZXJtX2dvdG8pOiBkZWNsYXJlIGl0LgotCShpbnNlcnRfc29tZV9jaGFycyk6IHNldCBpdC4KLQkoZGVsZXRlX2NoYXJzKTogc2V0IGl0LgotCi0JKiByZWFkbGluZS5jOiBhZGQgdHVpIGluY2x1ZGUgZmlsZXMgc3Vycm91bmRlZCBieSBUVUkuCi0JKHJsX3Jlc2V0KTogbmV3IGZ1bmN0aW9uLCBtb3ZlIHNvbWUgb2YgcmxfYWJvcnQgZnVuY3Rpb25hbGl0eSB0bwotIAloZXJlLgotCShybF9hYm9ydCk6IGNhbGwgcmxfcmVzZXQuCi0JKHJsX2dldGMpOiB0dWkgY2hhbmdlcy4KLQkoaW5pdF90ZXJtaW5hbF9pbyk6IHR1aSBjaGFuZ2VzLgotCi0JKiByZWFkbGluZS5oICh0dWlfdmVyc2lvbiwgZnB1dGNfdW5maWx0ZXJlZCwgZnB1dHNfdW5maWx0ZXJlZCwKLQl0dWlfdHB1dHMpOiBkZWNsYXJlIGlmIFRVSSBpcyBkZWZpbmVkLgotCi0JKiBybHR0eS5jIChwcmVwYXJlX3Rlcm1pbmFsX3NldHRpbmdzKTogYWRkaXRpb25hbCBjb21tZW50LgotCi0JKiBzaWduYWxzLmM6IGFkZCB0dWkgaW5jbHVkZSBmaWxlcyBzdXJyb3VuZGVkIGJ5IFRVSS4gIG1vdmUgI2lmCi0gCWFuZCAjZW5kaWYgdG8gY29sdW1uIDEgc28gSFAncyBjb21waWxlciB3aWxsIGFjY2VwdCB0aGVtLiAgUmVtb3ZlCi0gCWRlY2xhcmF0aW9uIG9mIHR1aURvQW5kUmV0dXJuVG9Ub3Agc2luY2UgaXQncyBkZWNsYXJlZCBpbiB0dWkuaC4KLQkocmxfaGFuZGxlX3NpZ3dpbmNoKTogY2FsbCB0dWlEb0FuZFJldHVyblRvVG9wIGlmIFRVSSBkZWZpbmVkLgotICAJKHJsX2hhbmRsZV9zaWd3aW5jaF9vbl9jbGVhcik6IGRlZmluZSBpZiBUVUkgZGVmaW5lZC4KLQkocmxfc2V0X3NpZ25hbHMpOiBpZiBUVUksIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbi4KLQkocmxfY2xlYXJfc2lnbmFscyk6IGluc3RhbGwgcmxfaGFuZGxlX3NpZ3dpbmNoX29uX2NsZWFyLgotCi0JKiBzeXNkZXAtaHB1eC5oOiBOZXcgZmlsZS4KLQotTW9uIE5vdiAgMiAxNToyNjozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBDaGVjayBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqLgotCi1UdWUgSnVsIDI4IDA5OjQzOjI3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLWhwdXgxMS5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLSotaHB1eDExKik6IFVzZSBzeXNkZXAtaHB1eDExLmguCi0KLVRodSBKdWwgMjMgMTc6NDg6MjEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuYmF0OiBSZW1vdmUgb2Jzb2xldGUgZmlsZS4KLQkqIGV4YW1wbGVzL2NvbmZpZ3VyZS5iYXQ6IFJlbW92ZSBvYnNvbGV0ZSBmaWxlLgotCi1XZWQgTWF5IDEzIDEzOjQxOjUzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3lzZGVwLTZpcml4Lmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluICgqLSotaXJpeDYqKTogTmV3IGhvc3Q7IHVzZSBzeXNkZXAtNmlyaXguaC4KLQotCSogTWFrZWZpbGUuaW4gKGlzZWFyY2gubywgc2VhcmNoLm8pOiBEZXBlbmQgdXBvbiBzeXNkZXAuaC4KLQkoTWFrZWZpbGUpOiBEZXBlbmQgdXBvbiAkKHNyY2RpcikvY29uZmlndXJlLmluLgotCi1UaHUgQXByICA5IDExOjU5OjM4IDE5OTggIElhbiBEYWxsICg8SWFuLkRhbGxAZHN0by5kZWZlbmNlLmdvdi5hdT4KLQotCSogY29uZmlndXJlLmluIChob3N0PT1uZXRic2QpOiBJbmNsdWRlIGNvbmZpZy9taC1ic2Q0NC4KLQkqIGNvbmZpZy9taC1ic2Q0NDogTmV3IGZpbGUuCi0KLVdlZCBEZWMgIDMgMTY6NDg6MjAgMTk5NyAgTWljaGFlbCBTbnlkZXIgIChtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbSkKLQotCSogcmx0dHkuYzogZml4IHR5cG9zLgotCi1UdWUgT2N0ICA4IDA4OjU5OjI0IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHRpbGRlLmMgKHRpbGRlX3dvcmRfZXhwYW5kKTogIF9fTVNET1NfX18gLT4gX19NU0RPU19fCi0KLVNhdCBPY3QgMDUgMTE6MjQ6MzQgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBybGRlZnMuaDogT24gTGludXgsIGluY2x1ZGUgPHRlcm1pb3MuaD4gdG8gZml4IGNvbXBpbGUgZXJyb3IKLQlpbiA8dGVybWNhcC5oPi4KLQotV2VkIFNlcCAgNCAxODowNjo1MSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBybGRlZnMuaDogIEVuYWJsZSBIQU5ETEVfU0lHTkFMUyBmb3IgY3lnd2luMzIuCi0KLVRodSBBdWcgMjkgMTY6NTk6NDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtIHByby4KLQotRnJpIEF1ZyAxNiAxNzo0OTo1NyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb21wbGV0ZS5jOiAgSW5jbHVkZSA8cHdkLmg+IGlmIG5vdCBET1MsIGFuZCBpZiBjeWd3aW4zMiBvciBub3QKLQl3aW4zMi4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCB0ZXN0IGZvciAqLSotY3lnd2luMzIqIHRvIHVzZSBjb25maWcvbWgtcG9zaXguCi0JKiByZWFkbGluZS5jOiAgTW92ZSBkZWNsIG9mIHRnZXRzdHIgdG8gcmxkZWZzLmguCi0JKiAoX3JsX3NldF9zY3JlZW5fc2l6ZSk6ICBSZW1vdmUgcmVkdW5kYW50IGlmZGVmIE1JTklNQUxzLgotCSogcmxkZWZzLmg6ICBEb24ndCBkbyBNSU5JTUFMIGZvciBjeWd3aW4zMi4gIEN5Z3dpbjMyIG5vdyB1c2VzCi0JZnVsbC1ibG93biByZWFkbGluZSwgZXhjZXB0IGZvciB0ZXJtY2FwLgotCi1TdW4gQXVnIDExIDIxOjA2OjI2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHJsZGVmcy5jOiAgR2V0IHJpZCBvZiBkZWZpbmUgb2YgU0lHQUxSTSBpZiBfV0lOMzIgb3IgX19NU0RPU19fLgotCSogRG9uJ3QgZGVmaW5lIFNjcmVlbkNvbHMvU2NyZWVuUm93cy8uLi4gaWYgY3lnd2luMzIuCi0JKiBzeXNkZXAtbm9ybS5oOiAgRG9uJ3QgaW5jbHVkZSA8bWFsbG9jLmg+IGlmIGN5Z3dpbjMyLgotCi1TdW4gQXVnIDExIDE0OjU5OjA5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBybGRlZnMuaDogIElmIF9fb3NmX19pcyBkZWZpbmVkLCBpbmNsdWRlIDx0ZXJtaW8uaD4gaW5zdGVhZCBvZgotCTxzZ3R0eS5oPi4KLQotRnJpIEF1ZyAgOSAwODo1NDoyNiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBiaW5kLmMgY29tcGxldGUuYyBoaXN0b3J5LmMgcmVhZGxpbmUuYzogIERvbid0IGluY2x1ZGUgc3lzL2ZpbGUuaC4KLQkqIGNvbXBsZXRlLmMgZGlzcGxheS5jIHBhcmVucy5jIHJlYWRsaW5lLmMgcmxkZWZzLmggcmx0dHkuYwotCXNpZ25hbHMuYyB0aWxkZS5jOiAgQ2hhbmdlIHJlZnMgdG8gX01TQ19WRVIgYW5kIF9fV0lOMzJfXyB0byBfV0lOMzIuCi0JKiBzaWduYWxzLmMgKHJsX3NpZ25hbF9oYW5kbGVyKTogIElmZGVmIG91dCBraWxsIGlmIF9XSU4zMi4KLQkqIHN5c2RlcC1ub3JtLmg6ICBJZmRlZiBvdXQgaW5jbHVkZSBvZiBkaXJlbnQuaCBpZiBfV0lOMzIuCi0JSW5jbHVkZSBtYWxsb2MuaCBpZiBfV0lOMzIuCi0KLVRodSBKdWwgMTggMTU6NTk6MzUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBybGRlZnMuaCAoc3lzL3Vpby5oKSBCZWZvcmUgc3lzL3N0cmVhbS5oIGlzIGluY2x1ZGVkIHVuZGVyIEFJWCwKLQlpbmNsdWRlIHN5cy91aW8uaCwgd2hpY2ggcHJldmVudHMgYW4gdW5kZWZpbmVkIHN0cnVjdHVyZSB1c2VkIGluIGEKLQlwcm90b3R5cGUgbWVzc2FnZSBmcm9tIGJlaW5nIGdlbmVyYXRlZC4KLQotVHVlIEp1biAyNSAyMzowNTo1NSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4gKGRhdGFkaXIpOiBTZXQgdG8gJChwcmVmaXgpL3NoYXJlLgotCShkb2NkaXIpOiBSZW1vdmVkLgotCi1TdW4gTWF5IDI2IDE1OjE0OjQyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JRnJvbTogRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogc3lzZGVwLWxpbnV4Lmg6IE5ldyBmaWxlLgotCSogZGlzcGxheS5jOiBBZGQgaW5jbHVkZSBvZiAic3lzZGVwLmgiIHRvIGdldCBIQVZFX1ZBUkFSR1NfSC4KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHBhdHRlcm4gaVszNDVdODYtKi1saW51eCogaW50byAqLSotbGludXgqIHRvCi0Jc3VwcG9ydCBub24teDg2IGJhc2VkIExpbnV4IHBsYXRmb3Jtcy4KLQotU3VuIEFwciAgNyAyMjowNjoxMSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCUZyb206IE1pbGVzIEJhZGVyICA8bWlsZXNAZ251LmFpLm1pdC5lZHU+Ci0JKiBjb25maWcvbWgtZ251OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLWdudSopOiBOZXcgaG9zdC4KLQotU3VuIEFwciAgNyAxMzoyMTo1MSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCUZyb206IFJvYmVydCBMaXBlIDxyb2JlcnRsQGRnaWkuY29tPgotCSogY29uZmlndXJlLmluOiBTQ08gT3BlblNlcnZlciA1IChhLmsuYSAzLjJ2NSopIGlzIG1vcmUgbGlrZQotCVNDTyAzLjJ2NCB0aGFuIDMuMnYyLgotCi1XZWQgSmFuICAzIDE4OjIyOjEwIDE5OTYgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHJlYWRsaW5lLmMsIGRpc3BsYXkuYywgY29tcGxldGUuYzogQWRkIF9NU0NfVkVSIHRvIGxpc3Qgb2YKLQl0aGluZ3Mgd2hpY2ggY2FuJ3QgZG8gbW9zdCB0aGluZ3MuCi0KLVRodSBOb3YgMTYgMTU6Mzk6MDUgMTk5NSAgR2VvZmZyZXkgTm9lciA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb21wbGV0ZS5jOiBDaGFuZ2UgV0lOMzIgdG8gX19XSU4zMl9fLCBhZGRlZCAjZWxzZSByZXR1cm4gTlVMTAotCXRvIGVuZCBvZiB0aGF0IGRlZmluZS4KLQotVHVlIE9jdCAzMSAxMDozODo1OCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkaXNwbGF5LmMsIHBhcmVucy5jLCByZWFkbGluZS5jLCBybGRlZnMuaDogQ2hhbmdlIHVzZSBvZgotCVdJTjMyIHRvIF9fV0lOMzJfXy4KLQotVHVlIE9jdCAxMCAxMTowNzoyMyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OKTogUmVtb3ZlIG1hY3JvLgotCi1UdWUgT2N0IDEwIDA4OjQ5OjAwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbXBsZXRlLmMgKGZpbGVuYW1lX2NvbXBsZXRpb25fZnVuY3Rpb24pOiBFbmFibGUgZm9yCi0Jd2luMzIgd2hlbiBub3QgTVNDLgotCi1TdW4gT2N0ICA4IDA0OjE3OjE5IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmluOiAgSGFuZGxlIHBvd2VycGMtaWJtLWFpeCogbGlrZSByczYwMDAtaWJtLWFpeCouCi0KLVNhdCBPY3QgIDcgMjA6MzY6MTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHJsdHR5LmMgKG91dGNoYXIpOiBSZXR1cm4gYW4gaW50LCBsaWtlIHRwdXRzIGV4cGVjdHMuCi0JKiBzaWduYWxzLmMgKF9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uKTogRGl0dG8uCi0KLUZyaSBTZXAgMjkgMTU6MTk6MjMgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCUZpeGVzIGZvciB3aGVuIHRoZSBob3N0IFdJTjMyLCBidXQgbm90IE1TQy4KLQkqIGNvbXBsZXRlLmM6IFNvbWV0aW1lcyBoYXZlIHB3ZC5oCi0JKiBwYXJlbnMuYzogV0lOMzIgaGFzIHNpbWlsYXIgcmVzdHJpY3Rpb25zIHRvIF9fR08zMl9fLgotCSogcmVhZGxpbmUuYyAoX19HTzMyX18pOiBTb21lIG9mIHRoaXMgbW92ZWQgaW50byBybGRlZnMuaAotCSogc2lnbmFscy5jIChfX0dPMzJfXyk6IExpa2V3aXNlLgotCSogcmxkZWZzLmggKE1TRE9TfHxXSU4zMikgYmVjb21lcyBNU0RPU3x8TVNDLgotCShXSU4zMiYmIVdJTjMyKTogTmV3IGRlZmluaXRpb25zLgotCi1XZWQgU2VwIDIwIDEyOjU3OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgc3lub255bSBmb3IgcmVhbGNsZWFuLgotCi1XZWQgTWFyICAxIDEzOjMzOjQzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcmx0dHkuYyAob3V0Y2hhcik6IFByb3ZpZGUgcHJvdG90eXBlIGZvciBvdXRjaGFyLCB0byBzaWxlbmNlCi0JdHlwZSB3YXJuaW5ncyBpbiBwYXNzaW5nIG91dGNoYXIgdG8gdHB1dHMgb24gc3lzdGVtcyBsaWtlIExpbnV4Ci0JdGhhdCBoYXZlIGZ1bGwgcHJvdG90eXBlcy4KLQotCSogc2lnbmFscy5jIChfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik6IFByb3ZpZGUgcHJvdG90eXBlIHRvCi0Jc2lsZW5jZSB0eXBlIHdhcm5pbmdzLgotCi1TdW4gSmFuIDE1IDE0OjEwOjM3IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBybGRlZnMuaDogRGVmaW5lIE1JTklNQUwgZm9yIF9fR08zMl9fIGFuZCBXSU4zMi4KLQkqIGNvbXBsZXRlLmMsIGRpc3BsYXkuYywgcmVhZGxpbmUuYywgcmx0dHkuYzogVGVzdCBNSU5JTUFMCi0JaW5zdGVhZCBvZiBfX0dPMzJfXy4KLQotV2VkIEF1ZyAyNCAxMzowNDo0NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCi0KLVNhdCBKdWwgMTYgMTM6MjY6MzEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG04OCotaGFycmlzLWN4dXg3Kik6IFJlY29nbml6ZS4KLQkqIHN5c2RlcC1jeHV4Ny5oOiBOZXcgZmlsZS4KLQotRnJpIEp1bCAgOCAxMzoxODozMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBydHR0eS5jIChjb250cm9sX21ldGFfa2V5X29uKTogUmVtb3ZlIHN1cGVyZmx1b3VzIHRlc3Rpbmcgb2YKLQlfX0dPMzJfXy4KLQotVGh1IEp1biAzMCAxNToyMTo1NCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBybHR0eS5jIChjb250cm9sX21ldGFfa2V5X29uKTogRG9uJ3QgY29tcGlsZSBpZiBfX0dPMzJfXyBpcwotCWRlZmluZWQuCi0JKHJsdHR5X3NldF9kZWZhdWx0X2JpbmRpbmdzKTogTGlrZXdpc2UuCi0JKiBkaXNwbGF5LmMgKGluc2VydF9zb21lX2NoYXJzLCBkZWxldGVfY2hhcnMpOiByb3dfc3RhcnQgc2hvdWxkIGJlCi0JYSBzaG9ydC4KLQkqIHBhcmVucy5jIChybF9pbnNlcnRfY2xvc2UpOiBObyBGRF9TRVQgaWYgdXNpbmcgX19HTzMyX18uCi0JKiByZWFkbGluZS5jIChybF9nYXRoZXJfdHlpKTogU3RyaXAgb2ZmIHNwdXJpb3VzIGhpZ2ggYml0cy4KLQotU3VuIEp1biAxMiAwMzo1MTo1MiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGhpc3RvcnkuYzogIFN3YXAgaW5jbHVzaW9uIG9mIHJsZGVmcy5oIGFuZCBjaGFyZGVmcy5oIHRvIGF2b2lkCi0JQ1RSTCBtYWNybyByZWRlZmluaXRpb24uCi0KLU1vbiBNYXkgIDkgMTg6Mjk6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChyZWFkbGluZV9kZWZhdWx0X2JpbmRpbmdzKTogRG9uJ3QgY29tcGlsZSBpZgotCV9fR08zMl9fIGlzIGRlZmluZWQuCi0JKF9ybF9zZXRfc2NyZWVuX3NpemUpOiBMaWtld2lzZS4KLQkqIHJsdHR5LmMgKHJsdHR5X3NldF9kZWZhdWx0X2JpbmRpbmdzKTogTGlrZXdpc2UuCi0JKGNvbnRyb2xfbWV0YV9rZXkpOiBMaWtld2lzZS4KLQkqIGRpc3BsYXkuYzogSWYgX19HTzMyX18gaXMgZGVmaW5lZCwgaW5jbHVkZSA8c3lzL3BjLmg+LgotCSogcGFyZW5zLmM6IElmIF9fR08zMl9fIGlzIGRlZmluZWQsIHVuZGVmaW5lIEZEX1NFVC4KLQkqIHNpZ25hbHMuYzogSW5jbHVkZSBTSUdXSU5DSCBoYW5kbGluZyBpbiB0aGUgc2V0IG9mIHRoaW5ncyB3aGljaAotCWlzIG5vdCBkb25lIGlmIEhBTkRMRV9TSUdOQUxTIGlzIG5vdCBzZXQuCi0KLUZyaSBNYXkgIDYgMTM6Mzg6MzkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGNvbmZpZy9taC1nbzMyOiBOZXcgZnJhZ21lbnQuCi0JKiBjb25maWd1cmUuaW4gKGhvc3Q9PWdvMzIpOiBVc2UgZ28zMiBmcmFnbWVudC4KLQotV2VkIE1heSAgNCAxNDozNjo1MyAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjaGFyZGVmcy5oLCBybGRlZnMuaDogIE1vdmUgZGVjbHMgb2Ygc3RyaW5nIGZ1bmNzIGZyb20gY2hhcmRlZnMuaAotCXRvIHJsZGVmcy5oIHNvIHRoYXQgdGhleSBkb24ndCBwb2xsdXRlIGFwcHMgdGhhdCBpbmNsdWRlCi0JcmVhZGxpbmUuaC4KLQkqIGhpc3RvcnkuYzogIGluY2x1ZGUgcmxkZWZzLmggdG8gZ2V0IGRlY2xzIG9mIHN0cmluZyBmdW5jcy4KLQotV2VkIE1heSAgNCAxMjoxNToxMSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocnM2MDAwLWJ1bGwtYm9zeCopOiBOZXcgY29uZmlndXJhdGlvbiwgUlMvNjAwMAotCXZhcmlhbnQuCi0KLVdlZCBBcHIgMjAgMTA6NDM6NTIgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIG1oLXBvc2l4IGZvciBzdW5vczQuMSouCi0KLVdlZCBBcHIgMTMgMjE6Mjg6NDQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIHJsdHR5LmMgKHNldF90dHlfc2V0dGluZ3MpOiBEb24ndCBzZXQgcmVhZGxpbmVfZWNob2luZ19wLgotCShybF9kZXByZXBfdGVybWluYWwpIFtORVdfVFRZX0RSSVZFUl06IFNldCByZWFkbGluZV9lY2hvaW5nX3AuCi0KLVN1biBNYXIgMTMgMDk6MTM6MTIgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgVEFHUyB0YXJnZXQuCi0KLVdlZCBNYXIgIDkgMTg6MDE6MzEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGlzZWFyY2guYywgc2VhcmNoLmM6IEluY2x1ZGUgc3lzZGVwLmguCi0KLVRodSBNYXIgIDMgMTc6NDA6MDMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIElTQywgdXNlIG1oLXN5c3YsIG5vdCBtaC1pc2MuCi0KLVRodSBGZWIgMjQgMDQ6MTM6NTMgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBNZXJnZSBpbiBjaGFuZ2VzIGZyb20gYmFzaC0xLjEzLjUuIE1lcmdlIGNoYW5nZXMgZnJvbSBnbG9iL3RpbGRlLmMKLQlpbnRvIHRpbGRlLmMgYW5kIHVzZSBpdC4gQWRkIHN5c3RlbSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgd2hlcmUKLQluZWNlc3NhcnkuIENoZWNrIGZvciBfX0dPMzJfXywgbm90IF9HTzMyXyBjb25zaXN0ZW50bHkuCi0JKiBNYWtlZmlsZS5pbjogIFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBybHR0eS5jOiAgSW5jbHVkZSA8c3lzL2ZpbGUuaD4gdG8gbWF0Y2ggaW5jbHVkZSBmaWxlIHNldHVwCi0JaW4gcmVhZGxpbmUuYyBmb3IgcmxkZWZzLmguIE90aGVyd2lzZSB3ZSBnZXQgaW5jb25zaXN0ZW50Ci0JVFRZX0RSSVZFUiBkZWZpbml0aW9ucyBpbiByZWFkbGluZS5jIGFuZCBybHR0eS5jLgotCSogYmluZC5jLCBjb21wbGV0ZS5jOiAgRG8gbm90IGluY2x1ZGUgPHN5cy90eXBlcy5oPiwgaXQgaXMgYWxyZWFkeQotCWluY2x1ZGVkIHZpYSBzeXNkZXAuaCwgd2hpY2ggY2F1c2VzIHByb2JsZW1zIGlmIDxzeXMvdHlwZXMuaD4gaGFzCi0Jbm8gbXVsdGlwbGUgaW5jbHVzaW9uIHByb3RlY3Rpb24uCi0JKiByZWFkbGluZS5jIChfcmxfc2V0X3NjcmVlbl9zaXplKTogIFJlZXN0YWJsaXNoIHRlc3QgZm9yCi0JVElPQ0dXSU5TWl9CUk9LRU4uCi0JKiBybGRlZnMuaDogIERlZmluZSBTX0lTUkVHIGlmIG5lY2Vzc2FyeS4KLQotRnJpIEZlYiAxOCAwODo1NjozNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBzZWFyY2gubyBydWxlIGZvciBTdW4gbWFrZS4KLQotV2VkIEZlYiAxNiAxNjozNTo0OSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogcmx0dHkuYzogICNpZiBvdXQgc29tZSBjb2RlIGlmIF9fR08zMl9fLgotCi1UdWUgRmViIDE1IDE0OjA3OjA4IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbiksIGRpc3BsYXkuYzoKLQlSZXR1cm4gaW50LCBub3Qgdm9pZCwgdG8gY29uZm9ybSB3aXRoIHRoZSBleHBlY3RlZCBhcmcgb2YgdHB1dHMuCi0JKiByZWFkbGluZS5jIChpbml0X3Rlcm1pbmFsX2lvKTogIHRnZXRmbGFnIG9ubHkgdGFrZXMgMSBhcmcuCi0JKiByZWFkbGluZS5jIChfcmxfc2F2ZXN0cmluZyk6ICBOZXcgZnVuY3Rpb24uCi0JKiBjaGFyZGVmcy5oOiAgVG8gYXZvaWQgY29uZmxpY3RzIGFuZC9vciB3YXJuaW5ncywgZGVmaW5lCi0Jc2F2ZXN0cmluZyBhcyBhIG1hY3JvIHdyYXBwZXIgZm9yIF9ybF9zYXZlc3RyaW5nLgotCSogZGlzcGxheS5jIChleHRlcm4gdGVybV94bik6ICBJdCdzIGFuIGludCBmbGFnLCBub3QgYSBzdHJpbmcuCi0JKiBjaGFyc2RlZnMuaCwgcmxkZWZzLmg6ICBSZW1vdmUgSEFWRV9TVFJJTkdfSC1yZWxhdGVkIGp1bmsuCi0KLVNhdCBGZWIgIDUgMDg6MzI6MzAgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgb2Jzb2xldGUgcnVsZXMgZm9yIGhpc3RvcnkuaW5mbyBhbmQKLQlyZWFkbGluZS5pbmZvLgotCi1UaHUgSmFuIDI3IDE3OjA0OjAxIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjaGFyZGVmcy5oOiBPbmx5IGRlY2xhcmUgc3RycmNociBpZiBpdCBpcyBub3QgI2RlZmluZSdkLgotCi1UdWUgSmFuIDI1IDExOjMwOjA2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBybGRlZnMuaDogQWNjZXB0IF9faHB1eCBhcyB3ZWxsIGFzIGhwdXggZm9yIEhQIGNvbXBpbGVyIGluIEFOU0kgbW9kZS4KLQotRnJpIEphbiAyMSAxNzozMToyNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjaGFyZGVmcy5oLCB0aWxkZS5jOiBKdXN0IGRlY2xhcmUgc3RycmNociByYXRoZXIgdGhhbiB0cnlpbmcgdG8KLQlpbmNsdWRlIGEgc3lzdGVtIGhlYWRlci4KLQotRnJpIEphbiAyMSAxNDo0MDo0MyAxOTk0ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogIEV4cGFuZCBsb2NhbC1kaXN0Y2xlYW4KLQlpbmxpbmUgYWZ0ZXIgZG9pbmcgcmVjdXJzaW9uLiAgWW91IGNhbid0IHJlY3Vyc2UgYWZ0ZXIgcmVtb3ZpbmcKLQlNYWtlZmlsZS4gIE1ha2UgdGhlbSBkZXBlbmQgb24gbG9jYWwtY2xlYW4uCi0JKiBNYWtlZmlsZS5pbiAobG9jYWwtZGlzdGNsZWFuKTogIFJlbW92ZSBub3cgc3VwZXJmbHVvdXMgdGFyZ2V0LgotCi1Nb24gSmFuIDE3IDEyOjQyOjA3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKGRvaW5nX2FuX3VuZG8pOiBEZWxldGUgc2Vjb25kIGRlY2xhcmF0aW9uLCBzaW5jZSBpdAotCWNvbmZ1c2VzIHRoZSBhbHBoYS1vc2YxIG5hdGl2ZSBjb21waWxlci4KLQotU3VuIEphbiAxNiAxMjozMzoxMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29tcGxldGUuYywgYmluZC5jOiBJbmNsdWRlIDxzeXMvc3RhdC5oPi4KLQkqIGNvbXBsZXRlLmM6IERlZmluZSBYX09LIGlmIG5vdCBkZWZpbmVkIGJ5IGEgc3lzdGVtIGhlYWRlci4KLQotCSogY2hhcmRlZnMuaDogRG9uJ3QgZGVjbGFyZSB4bWFsbG9jLgotCi0JKiBrZXltYXBzLmg6IEluY2x1ZGUgImNoYXJkZWZzLmgiIG5vdCA8cmVhZGxpbmUvY2hhcmRlZnMuaD4uCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gcmVhbGNsZWFuKTogUmVjdXJzZQotCWludG8gc3ViZGlyZWN0b3JpZXMgYXMgd2VsbCBhcyBkb2luZyB0aGlzIGRpcmVjdG9yeS4gIEFkZCBjbGVhbi1kdmkKLQl0YXJnZXQuCi0KLVNhdCBKYW4gMTUgMTk6MzY6MTIgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMsIGRpc3BsYXkuYzogIFBhdGNoZXMgdG8gYWxsb3cgdXNlIG9mIGFsbCA4MAotCWNvbHVtbnMgb24gbW9zdCB0ZXJtaW5hbHMgKHRob3NlIHdpdGggYW0gYW5kIHhuKS4KLQotCU1lcmdlIGluIGNoYW5nZXMgZnJvbSBiYXNoLTEuMTMuICBUaGUgbW9zdCBvYnZpb3VzIG9uZSBpcwotCXRoYXQgdGhlIGZpbGUgcmVhZGxpbmUuYyBoYXMgYmVlbiBzcGxpdCBpbnRvIG11bHRpcGxlIGZpbGVzLgotCSogYmluZC5jLCBjb21wbGV0ZS5jLCBkaXNwYXkuYywgaXNlYXJjaC5jLCBwYXJlbnMuYywgcmxkZWZzLmgsCi0Jcmx0dHkuYywgc2VhcmNoLmMgc2lnbmFscy5jLCB0aWxkZS5jLCB0aWxkZS5oLCB4bWFsbG9jLmM6ICBOZXcgZmlsZXMuCi0KLVNhdCBEZWMgMTEgMTY6Mjk6MTcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKHJsX2dldGMpOiBJZiBHTzMyLCB0cmltIGhpZ2ggYml0IGZyb20gZ2V0a2V5LAotCW90aGVyd2lzZSBmYW5jeSBQQyBrZXlzIGNhdXNlIGdyaWVmLgotCi1GcmkgTm92ICA1IDExOjQ5OjQ3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCBkb2MgdG8gY29uZmlnZGlycy4KLQkqIE1ha2VmaWxlLmluIChpbmZvIGR2aSBpbnN0YWxsLWluZm8gY2xlYW4taW5mbyk6IFJlY3Vyc2UgaW50byBkb2MuCi0KLUZyaSBPY3QgMjIgMDc6NTU6MDggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkICogdG8gZW5kIG9mIGFsbCBPUyBuYW1lcy4KLQotVHVlIE9jdCAgNSAxMjozMzo1MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYzogQWRkIHN0dWZmIGZvciBISVVYIHRvIHBsYWNlIHdoZXJlIHdlIGRldGVjdCB0ZXJtaW8KLQl2cy4gc2d0dHkgKHVnaCwgYnV0IEkgZG9uJ3Qgc2VlIGEgc2ltcGxlIGJldHRlciB3YXkpLgotCi1XZWQgU2VwIDI5IDExOjAyOjU4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChwYXJzZXJfaWYpOiBGcmVlIHRuYW1lIHdoZW4gZG9uZSB3aXRoIGl0IChjaGFuZ2UKLQlpbXBvcnRlZCBmcm9tIGZyb20gYmFzaAkxLjEyIHJlYWRsaW5lKS4KLQotVHVlIFNlcCAgNyAxNzoxNTozNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtODhrLSotc3lzdnI0Kik6IENvbW1lbnQgb3V0IHByZXZpb3VzIGNoYW5nZS4KLQotRnJpIEp1bCAgMiAxMTowNTozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLXJpc2NvcyopOiBOZXcgZW50cnk7IHVzZSBtaC1zeXN2LgotCi1XZWQgSnVuIDIzIDEzOjAwOjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjb21tZW50LgotCi1Nb24gSnVuIDE0IDE0OjI4OjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBlcmljKQotCi0JKiBjb25maWd1cmUuaW4gKG04OGstKi1zeXN2cjQqKTogVXNlIHN5c2RlcC1ub3JtLmguCi0KLVN1biBKdW4gMTMgMTM6MDQ6MDkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh7cmVhbCxkaXN0fWNsZWFuKTogUmVtb3ZlIHN5c2RlcC5oLgotCi1UaHUgSnVuIDEwIDExOjIyOjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIG1vc3RseWNsZWFuLCBkaXN0Y2xlYW4sIGFuZCByZWFsY2xlYW4gdGFyZ2V0cy4KLQotRnJpIE1heSAyMSAxNzowOToyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWlzYzogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFVzZSBpdC4KLQotU2F0IEFwciAxNyAwMDo0MDoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY2FsdmluKQotCi0JKiByZWFkbGluZS5jLCBoaXN0b3J5LmM6IERvbid0IGluY2x1ZGUgc3lzL3R5cGVzLmg7IHN5c2RlcC5oIGRvZXMuCi0KLQkqIGNvbmZpZy9taC1zeXN2OiBEZWZpbmUgVElPQ0dXSU5TWl9CUk9LRU4uCi0JcmVhZGxpbmUuYzogQ2hlY2sgaXQuCi0KLVdlZCBNYXIgMjQgMDI6MDY6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbGNoZWNrICYgZHZpIHRhcmdldHMKLQotRnJpIE1hciAxMiAxODozNjo1MyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplICotKi1zb2xhcmlzMiogaW5zdGVhZCBvZiAqLSotc29sYXJpcyogKGEKLQludW1iZXIgb2YgcGVvcGxlIHdhbnQgdG8gY2FsbCBTdW5PUyA0LjEuMiAic29sYXJpczEuMCIKLQlhbmQgZ2V0IGl0IHJpZ2h0KQotCi1UdWUgTWFyICAyIDIxOjI1OjM2IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBzeXNkZXAtc3lzdjQuaDogIE5ldyBmaWxlIGZvciBTVlI0LgotCSogY29uZmlndXJlLmluICgqLSotc3lzdjQqKTogIFVzZSBzeXNkZXAtc3lzdjQuaC4KLQotCSogY29uZmlndXJlLmluICgqLSotdWx0cml4Mik6ICBBZGQgdHJpcGxldCBmcm9tIE1pY2hhZWwgUmVuZGVsbAotCShtaWNoYWVsQG1lcmN1cnkuY3MubXVuLmNhKQotCi1UdWUgRGVjIDE1IDEyOjM4OjE2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc2NvMy4ydjQqKTogdXNlIG1oLXNjbzQuCi0JKiBjb25maWcvbWgtc2NvNDogTmV3IGZpbGUsIGxpa2UgbWgtc2NvIGJ1dCB3aXRob3V0IGRlZmluaW5nCi0JX1BPU0lYX1NPVVJDRS4KLQotV2VkIE5vdiAxMSAyMToyMDoxNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVmb3JtYXQgdG8gb25lLWNhc2UtcGVyLWxpbmUuCi0JSGFuZGxlIFN1bk9TIDMuNSwgYXMgcGVyIEthcmwgQmVycnksIDxrYXJsQGNsYXVkZS5jcy51bWIuZWR1Pi4KLQotV2VkIE5vdiAgNCAxNTozMjozMSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzeXNkZXAtbm9ybS5oOiAgUmVtb3ZlIHNvbWUgY3J1ZCwgaW5zdGFsbCBkaXJlIHdhcm5pbmcuCi0KLVRodSBPY3QgMjIgMDE6MDg6MTMgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgTWFrZSBTQ08gd29yayBhZ2Fpbi4uLgotCi1Nb24gT2N0IDEyIDE1OjA0OjA3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAoaW5pdF90ZXJtaW5hbF9pbyk6IGlmIHRnZXRlbnQgcmV0dXJucyAwLCB0aGUKLQl0ZXJtaW5hbCB0eXBlIGlzIHVua25vd24uCi0KLVRodSBPY3QgIDEgMjM6NDQ6MTQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBjcHUtdmVuZG9yLW9zIHRyaXBsZSBpbnN0ZWFkIG9mIG5lc3RlZCBjYXNlcwotCi1XZWQgU2VwIDMwIDEyOjU4OjU3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKHJsX2NvbXBsZXRlX2ludGVybmFsKTogIENhc3QgYWxsb2NhIHRvIChjaGFyICopIHRvCi0JYXZvaWQgd2FybmluZy4KLQotRnJpIFNlcCAyNSAxMjo0NTowNSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChjbGVhcl90b19lb2wsIHJsX2dlbmVyaWNfYmluZCk6ICBNYWtlIHN0YXRpYy4KLQkocmxfZGlnaXRfbG9vcCk6ICBBZGQgYXJnIHRvIGNhbGwgdG8gcmxfbWVzc2FnZSgpLgotCSogdmlfbW9kZS5jIChybF92aV9maXJzdF9wcmludCk6ICBBZGQgYXJnIHRvIGNhbGwgdG8KLQlybF9iYWNrX3RvX2luZGVudCgpLgotCi1XZWQgQXVnIDE5IDE0OjU5OjA3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLCB1c2UgZnVsbAotCWZpbGUgbmFtZSBmb3IgaW5zdGFsbCB0YXJnZXQuCi0KLVdlZCBBdWcgMTIgMTU6NTA6NTcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKGxhc3RfcmVhZGxpbmVfaW5pdF9maWxlKTogIEZpeCB0eXBvIG1hZGUgYnkgU3RldmUKLQlDaGFtYmVybGFpbi9ESiBEZWxvcmllLiAgUHJvcGVyIGNvbnRyb2wgZmlsZSBuYW1lIGlzIH4vLmlucHV0cmMsCi0Jbm90IH4vaW5wdXRyYy4KLQotVGh1IEp1biAyNSAxNjoxNToyNyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBNYWtlIGJzZCBiYXNlZCBzeXN0ZW1zIHVzZSBzeXNkZXAtb2JzZC5oLgotCi1UdWUgSnVuIDIzIDIzOjIyOjUzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtcG9zaXg6ICBOZXcgZmlsZSwgZm9yIFBvc2l4LWNvbXBsaWFudCBzeXN0ZW1zLgotCSogY29uZmlndXJlLmluOiAgVXNlIG1oLXBvc2l4IGZvciBMaW51eCAoZnJlZSBVbml4IGNsb25lKS4KLQotVHVlIEp1biAyMyAyMTo1OToyMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLW5vcm0uaCAoYWxsb2NhKTogIFByb3RlY3QgYWdhaW5zdCBwcmV2aW91cyBkZWZpbml0aW9uIGFzCi0JYSBtYWNybyB3aXRoIGFyZ3VtZW50cy4KLQotRnJpIEp1biAxOSAxNTo0ODo1NCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzeXNkZXAtb2JzZC5oOiAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPiB0byBtYWtlIHRoaXMgbW9yZSBLb3NoZXIuCi0KLUZyaSBKdW4gMTkgMTI6NTM6MjggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1hcG9sbG82OHYsIG1oLXNjbywgbWgtc3lzdiwgbWgtc3lzdjR9OiBSQU5MSUI9dHJ1ZS4KLQotTW9uIEp1biAxNSAxMzo1MDozNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIG1oLXN5c3Y0IG9uIHNvbGFyaXMyCi0KLU1vbiBKdW4gMTUgMTI6Mjg6MjQgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1uY3IzMDAwIChJTlNUQUxMKTogIERvbid0IHVzZSAvdXNyL3VjYi9pbnN0YWxsLAotCWl0IGlzIGJyb2tlbiBvbiBuY3IgMzAwMCdzLgotCSogY29uZmlnL21oLW5jcjMwMDAgKFJBTkxJQik6ICBVc2UgUkFOTElCPXRydWUuCi0KLU1vbiBKdW4gMTUgMDE6MzU6NTUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmM6IE1ha2UgbmV3IFNJR05BTFNfKiBtYWNyb3MgdG8gcGFyYW1ldGVyaXplIHRoZSAKLQl1Z2x5IGNoYW5nZXMgaW4gc2lnbmFsIGJsb2NraW5nLiAgVXNlIHRoZW0gdGhyb3VnaG91dCwKLQlyZWR1Y2luZyAjaWZkZWYgSEFWRV9QT1NJWF9TSUdOQUxTIGFuZCBIQVZFX0JTRF9TSUdOQUxTIGNsdXR0ZXIKLQlzaWduaWZpY2FudGx5LiAgTWFrZSBhbGwgc3VjaCBwbGFjZXMgdXNlIFBPU0lYIGlmIGF2YWlsYWJsZSwKLQl0byBhdm9pZCBsb3Npbmcgd2l0aCBwb29yIGBzaWdzZXRtYXNrJyBlbXVsYXRpb24gZnJvbSBsaWJpYmVydHkuCi0KLVN1biBKdW4gMTQgMTU6MTk6NTEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAoaW5zZXJ0X3NvbWVfY2hhcnMpOiAgUmV0dXJuIHZvaWQuCi0KLVRodSBKdW4gMTEgMDE6Mjc6NDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmM6ICAjdW5kZWYgUEMsIHdoaWNoIFNvbGFyaXMyIGRlZmluZXMgaW4gc3lzL3R5cGVzLmgsCi0JY2xvYmJlcmluZyB0aGUgdGVybWNhcCBnbG9iYWwgdmFyaWFibGUgUEMuCi0KLVR1ZSBKdW4gIDkgMTc6MzA6MjMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy97bWgtbmNyMzAwMCwgbWgtc3lzdjR9OiAgQ2hhbmdlIElOU1RBTEwgdG8gdXNlCi0JL3Vzci91Y2IvaW5zdGFsbC4KLQotTW9uIEp1biAgOCAyMzoxMDowNyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuaCAocmxfY29tcGxldGVyX3F1b3RlX2NoYXJhY3RlcnMpOiAgQWRkIGRlY2xhcmF0aW9uLgotCSogcmVhZGxpbmUuYyAocmxfY29tcGxldGVyX3F1b3RlX2NoYXJhY3RlcnMpOiAgQWRkIGdsb2JhbCB2YXIuCi0JKiByZWFkbGluZS5jIChzdHJwYnJrKTogIEFkZCBwcm90b3R5cGUgYW5kIGZ1bmN0aW9uLgotCSogcmVhZGxpbmUuYyAocmxfY29tcGxldGVfaW50ZXJuYWwpOiAgQWRkIGNvZGUgdG8gaGFuZGxlCi0JZXhwYW5zaW9uIG9mIHF1b3RlZCBzdHJpbmdzLgotCi1Nb24gTWF5IDExIDEyOjM5OjMwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jOiAgQ2FuJ3QgaW5pdGlhbGl6ZSBGSUxFIConcyB3aXRoIHN0ZGluIGFuZCBzdGRvdXQsCi0JYmVjYXVzZSB0aGV5IG1pZ2h0IG5vdCBiZSBjb25zdGFudC4gIFBhdGNoIGZyb20gVG9tIFF1aW5uLAotCXRycUBkaW5veXNvcy50aHBoeXMub3guYWMudWsuCi0KLVR1ZSBBcHIgMjggMjE6NTI6MzQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmg6ICBEZWNsYXJlIHJsX2V2ZW50X2hvb2sgKHdoaWNoIGFscmVhZHkgZXhpc3RlZCkuCi0JU3VnZ2VzdGVkIGJ5IENocmlzdG9waCBUaWV0eiA8dGlldHpAemkuZ21kLmRicC5kZT4uCi0KLVdlZCBBcHIgMjIgMTg6MDg6MDEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBzdWJkaXJzIGRlY2xhcmF0aW9uLiAgVGhlIG9ic29sZXRlIHNlbWFudGljCi0JICBmb3Igc3ViZGlycyBoYXMgYmVlbiB1c3VycGVkIGJ5IHBlcidzIG5ldyBtZWFuaW5nLgotCi1UdWUgQXByIDIxIDExOjU0OjIzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmV3b3JrIENGTEFHUyBzbyB0aGF0IHRoZXkgY2FuIGJlIHNldCBvbiB0aGUKLQkgIGNvbW1hbmQgbGluZSB0byBtYWtlLiAgUmVtb3ZlIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KLQotRnJpIEFwciAxMCAyMzowMjoyNyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIG5ldyBuY3IzMDAwIGNvbmZpZy4KLQkqIGNvbmZpZy9taC1uY3IzMDAwOiAgTmV3IE5DUiAzMDAwIGNvbmZpZyBmaWxlLgotCi1XZWQgTWFyIDI1IDEwOjQ2OjMwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBoaXN0b3J5LmMgKHN0aWZsZV9oaXN0b3J5KTogIE5lZ2F0aXZlIGFyZyB0cmVhdGVkIGFzIHplcm8uCi0KLVR1ZSBNYXIgMjQgMjM6NDY6MjAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zeXN2OiBJTlNUQUxMX1BST0cgLT4gSU5TVEFMTC4KLQotTW9uIEZlYiAxMCAwMTo0MTozNSAxOTkyICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogaGlzdG9yeS5jIChoaXN0b3J5X2RvX3dyaXRlKSBCdWlsZCBhIGJ1ZmZlciBvZiBhbGwgb2YgdGhlIGxpbmVzCi0JdG8gd3JpdGUgYW5kIHdyaXRlIHRoZW0gaW4gb25lIGZlbGwgc3dvb3AgKGxvd2VyIG92ZXJoZWFkIHRoYW4KLQljYWxsaW5nIHdyaXRlICgpIGZvciBlYWNoIGxpbmUpLiAgU3VnZ2VzdGVkIGJ5IFBldGVyIEhvLgotCi0JKiB2aV9tb2RlLmMgKHJsX3ZpX3N1YnN0KSBEb24ndCBmb3JnZXQgdG8gZW5kIHRoZSB1bmRvIGdyb3VwLgotCi1TYXQgTWFyICA3IDAwOjE1OjM2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBGSVhNRSdzIG9uIGluZm8gYW5kIGluc3RhbGwtaW5mbyB0YXJnZXRzLgotCi1GcmkgTWFyICA2IDIyOjAyOjA0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotRnJpIEZlYiAyMSAxNDozNzozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYywgZXhhbXBsZXMvZmlsZW1hbi5jOiBwYXRjaGVzIGZyb20gREogdG8gc3VwcG9ydCBET1MKLQotVGh1IEZlYiAyMCAyMzoyMzoxNiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChybF9yZWFkX2luaXRfZmlsZSk6ICBNYWtlIHN1cmUgdGhhdCBudWxsIGZpbGVuYW1lIGlzCi0Jbm90IHBhc3NlZCB0byBvcGVuKCkgb3IgZWxzZSB3ZSBlbmQgdXAgb3BlbmluZyB0aGUgZGlyZWN0b3J5LCBhbmQKLQlyZWFkIGEgYnVuY2ggb2YgZ2FyYmFnZSBpbnRvIGtleW1hcFtdLgotCi1Nb24gRmViIDE3IDE3OjE1OjA5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChyZWFkbGluZV9kZWZhdWx0X2JpbmRpbmdzKTogIE9ubHkgbWFrZSB1c2Ugb2YgVkxORVhUCi0Jd2hlbiBib3RoIFZMTkVYVCBhbmQgVEVSTUlPU19UVFlfRFJJVkVSIGlzIGRlZmluZWQuICBPbiBTVlI0Ci0JPHRlcm1pby5oPiBpbmNsdWRlcyA8dGVybWlvcy5oPiwgc28gVkxORVhUIGlzIGFsd2F5cyBkZWZpbmVkLgotCi0JKiBzeXNkZXAtbm9ybS5oIChfUE9TSVhfVkVSU0lPTik6ICBEZWZpbmUgdGhpcyBmb3IgYWxsIFNWUjQKLQlzeXN0ZW1zIHNvIHRoYXQgPHRlcm1pb3MuaD4gZ2V0cyB1c2VkLCBpbnN0ZWFkIG9mIDx0ZXJtaW8uaD4uCi0KLUZyaSBEZWMgMjAgMTI6MDQ6MzEgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIENoYW5nZSBzdnI0IHJlZmVyZW5jZXMgdG8gc3lzdjQuCi0KLVR1ZSBEZWMgMTAgMDQ6MDc6MjAgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLUZyaSBEZWMgIDYgMjM6MjM6MTQgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHNwYWNlcyBmb2xsb3dpbmcgaHlwaGVucywgYnNkIG1ha2UgY2FuJ3QKLQkgIGNvcGUuIGFkZGVkIGNsZWFuLWluZm8uICBhZGRlZCBzdGFuZGFyZHMudGV4dCBzdXBwb3J0LiAgRG9uJ3QKLQkgIGtub3cgaG93IHRvIG1ha2UgaW5mbyBhbnltb3JlLgotCi0JKiBjb25maWd1cmUuaW46IGNvbW1vbnRhcmdldHMgaXMgbm8gbG9uZ2VyIGEgcmVjb2duaXplZCBob29rLCBzbwotCSAgcmVtb3ZlIGl0LiAgbmV3IHN1YmRpciBjYWxsZWQgZG9jLgotCi1UaHUgRGVjICA1IDIyOjQ2OjEwIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotRnJpIE5vdiAyMiAwOTowMjozMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3lzZGVwLW9ic2QuaDogIFJlbmFtZSBmcm9tIHN5c2RlcC1uZXdzb3MuaC4KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBzeXNkZXAtb2JzZCBmb3IgTWFjaCBhcyB3ZWxsIGFzIE5FV3MuCi0KLQkqIHN5c2RlcC1ub3JtLmgsIHN5c2RlcC1haXguaDogIEFkZCA8c3lzL3R5cGVzLmg+LCB3aGljaCBQT1NJWAotCXJlcXVpcmVzIHRvIG1ha2UgPGRpcmVudC5oPiB3b3JrLiAgSW1wcm92ZSBTdW4gYWxsb2NhIGRlY2wuCi0KLVRodSBOb3YgMjEgMTg6NDg6MDggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2xlYW4gdXAgLi4vZ2xvYi90aWxkZS5jIC0+IHRpbGRlLm8gcGF0aC4KLQlDbGVhbiB1cCBtYWtlZmlsZSBhIGJpdCBpbiBnZW5lcmFsLgotCi1UaHUgTm92IDIxIDE0OjQwOjI5IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL21oLXN2cjQ6ICBNYWtlIFNWUjQgd29yay4KLQotCSogcmVhZGxpbmUuYzogIE1vdmUgY29uZmlnIHN0dWZmIHRvIHN5c2RlcC5oLCB1c2UgdHlwZWRlZiBkaXJlbnQKLQljb25zaXN0ZW50bHksIHJlbW92ZSByZWZzIHRvIGRfbmFtbGVuICgmIERfTkFNTEVOKSB0byBpbXByb3ZlCi0JcG9ydGFiaWxpdHkuICBBbHNvLCB1cGRhdGUgY29weXJpZ2h0IG5vdGljZS4KLQlyZWFkbGluZS5oOiAgcmVtb3ZlIGNvbmZpZyBzdHVmZiB0aGF0IEkgYWRkZWQgZXJyb25lb3VzbHkgaW4gdGhlCi0JZmlyc3QgcGxhY2UuCi0KLQkqIGVtYWNzX2tleW1hcC5jLCBmdW5tYXAuYywgaGlzdG9yeS5jLCBrZXltYXBzLmMsIHZpX2tleW1hcC5jLAotCXZpX21vZGUuYzogIG1vdmUgY29uZmlnIHN0dWZmIHRvIHN5c2RlcC5oLCB1cGRhdGUgY29weXJpZ2h0IG5vdGljZXMuCi0KLVR1ZSBOb3YgMTkgMTU6MDI6MTMgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaGlzdG9yeS5jOiAgI2luY2x1ZGUgInN5c2RlcC5oIi4KLQotVHVlIE5vdiAxOSAxMDo0OToxNyAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy9obS1zeXN2LCBjb25maWcvaG0tc2NvOiAgQ2hhbmdlIFNZU1YgdG8KLQlVU0cgdG8gbWF0Y2ggY3VycmVudCB1c2FnZS4KLQotCSogcmVhZGxpbmUuYzogIEFkZCBVU0dyNCB0byBsaXN0IG9mIGRlZmluZWQgdGhpbmdzIHRvIGNoZWNrIGZvcgotCXRvIHVzZSA8ZGlyZW50Lmg+IHN0eWxlIGRpcmVjdG9yeSBhY2Nlc3MuCi0KLQkqIGNvbmZpZy9obS1zdnI0OiAgTmV3IGZpbGUgZm9yIFN5c3RlbSBWIFJlbGVhc2UgNCAoVVNHcjQpLgotCi1Nb24gTm92IDE4IDIzOjU5OjUyIDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKGZpbGVuYW1lX2NvbXBsZXRpb25fZnVuY3Rpb24pOiAgdXNlIHN0cnVjdCBkaXJlbnQKLQlpbnN0ZWFkCW9mIHN0cnVjdCBkaXJlY3QuCi0KLUZyaSBOb3YgIDEgMDc6MDI6MTMgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmMgKHJsX3RyYW5zbGF0ZV9rZXlzZXEpIE1ha2UgQy0/IHRyYW5zbGF0ZSB0byBSVUJPVVQKLQl1bmNvbmRpdGlvbmFsbHkuCi0KLU1vbiBPY3QgMjggMTE6MzQ6NTIgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM7IFVzZSBQb3NpeCBkaXJlY3Rvcnkgcm91dGluZXMgYW5kIG1hY3Jvcy4KLQotCSogZnVubWFwLmM7IEFkZCBlbnRyeSBmb3IgY2FsbC1sYXN0LWtiZC1tYWNyby4KLQotCSogcmVhZGxpbmUuYyAocmxfcHJlcF90ZXJtKTsgVXNlIHN5c3RlbSBFT0YgY2hhcmFjdGVyIG9uIFBPU0lYCi0Jc3lzdGVtcyBhbHNvLgotCi1UaHUgT2N0ICAzIDE2OjE5OjUzIDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOyBNYWtlIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBoYXZpbmcgYSBURVJNSU9TIHR0eQotCWRyaXZlciwgYW5kIGhhdmluZyBQT1NJWCBzaWduYWwgaGFuZGxpbmcuICBZb3UgbWlnaHQgb25lIHdpdGhvdXQKLQl0aGUgb3RoZXIuICBOZXcgZGVmaW5lcyB1c2VkIEhBVkVfUE9TSVhfU0lHTkFMUywgYW5kCi0JVEVSTUlPU19UVFlfRFJJVkVSLgotCi1UdWUgSnVsIDMwIDIyOjM3OjI2IDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiBybF9nZXRjICgpIElmIGEgY2FsbCB0byByZWFkICgpIHJldHVybnMgd2l0aG91dCBhbgotCWVycm9yLCBidXQgd2l0aCB6ZXJvIGNoYXJhY3RlcnMsIHRoZSBmaWxlIGlzIGVtcHR5LCBzbyByZXR1cm4gRU9GLgotCi1UaHUgSnVsIDExIDIwOjU4OjM4IDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiAocmxfZ2V0X25leHRfaGlzdG9yeSwgcmxfZ2V0X3ByZXZpb3VzX2hpc3RvcnkpCi0JUmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHNwYWNlIGlmIHRoZSBsaW5lIGJlaW5nIG1vdmVkIHRvIGlzIGxvbmdlcgotCXRoZSB0aGUgY3VycmVudCBzcGFjZSBhbGxvY2F0ZWQuICBBbWF6aW5nIHRoYXQgbm8gb25lIGhhcyBmb3VuZAotCXRoaXMgYnVnIHVudGlsIG5vdy4KLQotU3VuIEp1bCAgNyAwMjozNzowNSAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzoocmxfcGFyc2VfYW5kX2JpbmQpIEFsbG93IGxlYWRpbmcgd2hpdGVzcGFjZS4KLQkgIE1ha2Ugc3VyZSBURVJNSU8gYW5kIFRFUk1JT1Mgc3lzdGVtcyB0cmVhdCBDUiBhbmQgTkwKLQkgIGRpc2N0aW5jdGx5LgotCQotVHVlIEp1biAyNSAwNDowOToyNyAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogUmV3b3JrIHBhcnNpbmcgY29uZGl0aW9uYWxzIHRvIHBheSBhdHRlbnRpb24gdG8gdGhlCi0JcHJpb3Igc3RhdGVzIG9mIHRoZSBjb25kaXRpb25hbCBzdGFjay4gIFRoaXMgbWFrZXMgJGlmIHN0YXRlbWVudHMKLQl3b3JrIGNvcnJlY3RseS4KLQotTW9uIEp1biAyNCAyMDo0NTo1OSAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogc3VwcG9ydCBmb3IgZGlzcGxheWluZyBrZXkgYmluZGluZyBpbmZvcm1hdGlvbgotCWluY2x1ZGVzIHRoZSBmdW5jdGlvbnMgcmxfbGlzdF9mdW5tYXBfbmFtZXMgKCksCi0JaW52b2tpbmdfa2V5c2Vxc19pbl9tYXAgKCksIHJsX2ludm9raW5nX2tleXNlcXMgKCksCi0JcmxfZHVtcF9mdW5jdGlvbnMgKCksIGFuZCBybF9mdW5jdGlvbl9kdW1wZXIgKCkuCi0KLQlmdW5tYXAuYzogc3VwcG9ydCBmb3Igc2FtZSBpbmNsdWRlcyBybF9mdW5tYXBfbmFtZXMgKCkuCi0KLQlyZWFkbGluZS5jLCBmdW5tYXAuYzogbm8gbG9uZ2VyIGRlZmluZSBTVEFUSUNfTUFMTE9DLiAgSG93ZXZlciwKLQl1cGRhdGUgYm90aCB2ZXJzaW9uIG9mIHhyZWFsbG9jICgpIHRvIGhhbmRsZSBhIG51bGwgcG9pbnRlci4KLQotVGh1IEFwciAyNSAxMjowMzo0OSAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogdmlfbW9kZS5jIChybF92aV9md29yZCwgZldvcmQsIGV0Yy4gIEFsbCBmdW5jdGlvbnMgdXNlCi0JdGhlIG1hY3JvIGBpc2lkZW50KCknLiAgRml4ZWQgbW92ZW1lbnQgYnVnIHdoaWNoIHByZXZlbnRzCi0JY29udGluaW91cyBtb3ZlbWVudCB0aHJvdWdoIHRoZSB0ZXh0LgotCi1GcmkgSnVsIDI3IDE2OjQ3OjAxIDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jIChwYXJzZXJfaWYpIEFsbG93ICIkaWYgdGVybT1mb28iIGNvbnN0cnVjdC4KLQotV2VkIE1heSAyMyAxNjoxMDozMyAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYyAocmxfZGlzcGF0Y2gpIENvcnJlY3RseSByZW1lbWJlciB0aGUgbGFzdCBjb21tYW5kCi0JZXhlY3V0ZWQuICBGaXhlZCB0eXBvIGluIHVzZXJuYW1lX2NvbXBsZXRpb25fZnVuY3Rpb24gKCkuCi0KLU1vbiBBcHIgIDkgMTk6NTU6NDggMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IHVzZXJuYW1lX2NvbXBsZXRpb25fZnVuY3Rpb24gKCk7IEZvciB0ZXh0IHBhc3NlZCBpbgotCXdpdGggYSBsZWFkaW5nIGB+JywgcmVtZW1iZXIgdGhhdCB0aGlzIGNvdWxkIGJlIGEgZmlsZW5hbWUgKGFmdGVyCi0JaXQgaXMgY29tcGxldGVkKS4KLQotVGh1IEFwciAgNSAxMzo0NDoyNCAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogcmxfc2VhcmNoX2hpc3RvcnkgKCk6IENvcnJlY3RseSBoYW5kbGUgY2FzZSBvZiBhbgotCXVuZm91bmQgc2VhcmNoIHN0cmluZywgYnV0IGEgZ3JhY2VmdWwgZXhpdCAoYXMgd2l0aCBFU0MpLgotCi0JKiByZWFkbGluZS5jOiBybF9yZXN0YXJ0X291dHB1dCAoKTsgIFRoZSBBcG9sbG8gcGFzc2VzIHRoZSBhZGRyZXNzCi0Jb2YgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBUSU9DU1RBUlQsIG5vdCB0aGUgZGVzY3JpcHRvciBpdHNlbGYuCi0KLVR1ZSBNYXIgMjAgMDU6Mzg6NTUgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IHJsX2NvbXBsZXRlICgpOyBzZWNvbmQgY2FsbCBpbiBhIHJvdyBjYXVzZXMgcG9zc2libGUKLQljb21wbGV0aW9ucyB0byBiZSBsaXN0ZWQuCi0KLQkqIHJlYWRsaW5lLmM6IHJsX3JlZGlzcGxheSAoKSwgYWRkZWQgcHJvbXB0X3RoaXNfbGluZSB2YXJpYWJsZQotCXdoaWNoIGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY2hhcmFjdGVyIGZvbGxvd2luZyBcbiBpbiBwcm9tcHQuCi0KLVN1biBNYXIgMTEgMDQ6MzI6MDMgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIFNpZ25hbHMgYXJlIG5vdyBzdXBwb3NlZGx5IGhhbmRsZWQgaW5zaWRlIG9mIFNZU1YgY29tcGlsYXRpb24uCi0KLVdlZCBKYW4gMTcgMTk6MjQ6MDkgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBzYnBoeS51Y3NiLmVkdSkKLQotCSogaGlzdG9yeS5jOiBoaXN0b3J5X2V4cGFuZCAoKTsgZml4ZWQgb3ZlcndyaXRpbmcgbWVtb3J5IGVycm9yLAotCWFkZGVkIG5lZWRlZCBhcmd1bWVudCB0byBjYWxsIHRvIGdldF9oaXN0b3J5X2V2ZW50ICgpLgotCi1UaHUgSmFuIDExIDEwOjU0OjA0IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgc2JwaHkudWNzYi5lZHUpCi0KLQkqIHJlYWRsaW5lLmM6IGFkZGVkIG1hcmtfbW9kaWZpZWRfbGluZXMgdG8gY29udHJvbCB0aGUKLQlkaXNwbGF5IG9mIGFuIGFzdGVyaXNrIG9uIG1vZGlmaWVkIGhpc3RvcnkgbGluZXMuICBBbHNvCi0JYWRkZWQgYSB1c2VyIHZhcmlhYmxlIGNhbGxlZCBtYXJrLW1vZGlmaWVkLWxpbmVzIHRvIHRoZQotCWBzZXQnIGNvbW1hbmQuCi0KLVRodSBKYW4gIDQgMTA6Mzg6MDUgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBzYnBoeS51Y3NiLmVkdSkKLQotCSogcmVhZGxpbmUuYzogc3RhcnRfaW5zZXJ0ICgpLiAgT25seSB1c2UgSUMgaWYgd2UgZG9uJ3QgaGF2ZSBhbiBpbQotCWNhcGFiaWxpdHkuCi0KLUZyaSBTZXAgIDggMDk6MDA6NDUgMTk4OSAgQnJpYW4gRm94ICAoYmZveCBhdCBhdXJlbCkKLQotCSogcmVhZGxpbmUuYzogcmxfcHJlcF90ZXJtaW5hbCAoKS4gIE9ubHkgdHVybiBvbiA4dGggYml0Ci0JICBhcyBtZXRhLWJpdCBpZmYgdGhlIHRlcm1pbmFsIGlzIG5vdCB1c2luZyBwYXJpdHkuCi0KLVN1biBTZXAgIDMgMDg6NTc6NDAgMTk4OSAgQnJpYW4gRm94ICAoYmZveCBhdCBhdXJlbCkKLQotCSogcmVhZGxpbmUuYzogc3RhcnRfaW5zZXJ0ICgpLiAgVXNlcyBtdWx0aXBsZQotCSAgaW5zZXJ0aW9uIGNhbGwgaW4gY2FzZXMgd2hlcmUgdGhhdCBtYWtlcyBzZW5zZS4KLQotCSAgcmxfaW5zZXJ0ICgpLiAgUmVhZCB0eXBlLWFoZWFkIGJ1ZmZlciBmb3IgYWRkaXRpb25hbAotCSAga2V5cyB0aGF0IGFyZSBib3VuZCB0byBybF9pbnNlcnQsIGFuZCBpbnNlcnQgdGhlbQotCSAgYWxsIGF0IG9uY2UuICBNYWtlIGluc2VydGlvbiBvZiBzaW5nbGUga2V5cyBnaXZlbgotCSAgd2l0aCBhbiBhcmd1bWVudCBtdWNoIG1vcmUgZWZmaWNpZW50LgotCi1UdWUgQXVnICA4IDE4OjEzOjU3IDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCi0KLQkqIHJlYWRsaW5lLmM6IENoYW5nZWQgaGFuZGxpbmcgb2YgRU9GLiAgcmVhZGxpbmUgKCkgcmV0dXJucwotCSAoY2hhciAqKUVPRiBvciBjb25zZWQgc3RyaW5nLiAgVGhlIEVPRiBjaGFyYWN0ZXIgaXMgcmVhZCBmcm9tIHRoZQotCSB0dHksIG9yIGlmIHRoZSB0dHkgZG9lc24ndCBoYXZlIG9uZSwgZGVmYXVsdHMgdG8gQy1kLgotCi0JKiByZWFkbGluZS5jOiBBZGRlZCBzdXBwb3J0IGZvciBldmVudCBkcml2ZW4gcHJvZ3JhbXMuCi0JICBybF9ldmVudF9ob29rIGlzIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24geW91IHdhbnQgY2FsbGVkCi0JICB3aGlsZSBSZWFkbGluZSBpcyB3YWl0aW5nIGZvciBpbnB1dC4KLQotCSogcmVhZGxpbmUuYzogQ2xlYW51cCB0aW1lLiAgRnVuY3Rpb25zIHdpdGhvdXQgdHlwZSBkZWNsYXJhdGlvbnMKLQkgIGRvIG5vdCB1c2UgcmV0dXJuIHdpdGggYSB2YWx1ZS4KLQotCSogaGlzdG9yeS5jOiBoaXN0b3J5X2V4cGFuZCAoKSBoYXMgbmV3IHZhcmlhYmxlIHdoaWNoIGlzIHRoZQotCSAgY2hhcmFjdGVycyB0byBpZ25vcmUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGhpc3RvcnlfZXhwYW5zaW9uX2NoYXIuCi0KLVN1biBKdWwgMTYgMDg6MTQ6MDAgMTk4OSAgQnJpYW4gRm94ICAoYmZveCBhdCBhdXJlbCkKLQotCSogcmxfcHJlcF90ZXJtaW5hbCAoKQotCSAgQlNEIHZlcnNpb24gdHVybnMgb2ZmIEMtcywgQy1xLCBDLXksIEMtdi4KLQotCSogcmVhZGxpbmUuYyAtLSBybF9wcmVwX3Rlcm1pbmFsICgpCi0JICBTWVNWIHZlcnNpb24gaGFja3MgcmVhZGxpbmVfZWNob2luZ19wLgotCSAgQlNEIHZlcnNpb24gdHVybnMgb24gcGFzc2luZyBvZiB0aGUgOHRoIGJpdCBmb3IgdGhlIGR1cmF0aW9uCi0JICBvZiByZWFkaW5nIHRoZSBsaW5lLgotCi1UdWUgSnVsIDExIDA2OjI1OjAxIDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCi0KLQkqIHJlYWRsaW5lLmM6IG5ldyB2YXJpYWJsZSBybF90aWxkZV9leHBhbmRlci4KLQkgIElmIG5vbi1udWxsLCB0aGlzIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gdG8gY2FsbCBpZgotCSAgdGhlIHN0YW5kYXJkIG1lYW5pbmcgZm9yIGV4cGFuZGluZyBhIHRpbGRlIGZhaWxzLiAgVGhlIGZ1bmN0aW9uIGlzCi0JICBjYWxsZWQgd2l0aCB0aGUgdGV4dCBzYW5zIHRpbGRlIChhcyBpbiAiZm9vIiksIGFuZCByZXR1cm5zIGEKLQkgIG1hbGxvYygpJ2VkIHN0cmluZyB3aGljaCBpcyB0aGUgZXhwYW5zaW9uLCBvciBhIE5VTEwgcG9pbnRlciBpZgotCSAgdGhlcmUgaXMgbm8gZXhwYW5zaW9uLiAKLQotCSogcmVhZGxpbmUuaCAtIG5ldyBmaWxlIGNoYXJkZWZzLmgKLQkgIFNlcGFyYXRlcyB0aGluZ3MgdGhhdCBvbmx5IHJlYWRsaW5lLmMgbmVlZHMgZnJvbSB0aGUgc3RhbmRhcmQKLQkgIGhlYWRlciBmaWxlIHB1Ymxpc2hpbmcgaW50ZXJlc3RpbmcgdGhpbmdzIGFib3V0IHJlYWRsaW5lLgotCi0JKiByZWFkbGluZS5jOgotCSAgcmVhZGxpbmVfZGVmYXVsdF9iaW5kaW5ncyAoKSBub3cgbG9va3MgYXQgdGVybWluYWwgY2hhcmFyYWN0ZXJzCi0JICBhbmQgYmluZHMgdGhvc2UgYXMgd2VsbC4KLQotV2VkIEp1biAyOCAyMDoyMDo1MSAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQotCi0JKiBNYWRlIHJlYWRsaW5lIGFuZCBoaXN0b3J5IGludG8gaW5kZXBlbmRlbnQgbGlicmFyaWVzLgotCmRpZmYgLS1naXQgYS9zZXR1cC5jb20gYi9zZXR1cC5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1M2FmZDUuLjAwMDAwMDAKLS0tIGEvc2V0dXAuY29tCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0kISBzZXR1cCBmaWxlcyBmb3Igb3BlblZNUy9BbHBoYQotJCEKLSQgZGVmaW5lIGFvdXQgWy0uSU5DTFVERS5BT1VUXQotJCBkZWZpbmUgY29mZiBbLS5JTkNMVURFLkNPRkZdCi0kIGRlZmluZSBlbGYgWy0uSU5DTFVERS5FTEZdCi0kIGRlZmluZSBtcHcgWy0uSU5DTFVERS5NUFddCi0kIGRlZmluZSBubG0gWy0uSU5DTFVERS5OTE1dCi0kIGRlZmluZSBvcGNvZGUgWy0uSU5DTFVERS5PUENPREVdCmRpZmYgLS1naXQgYS9zeW1saW5rLXRyZWUgYi9zeW1saW5rLXRyZWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5NjU4MmQuLjAwMDAwMDAKLS0tIGEvc3ltbGluay10cmVlCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyEvYmluL3NoCi0jIENyZWF0ZSBhIHN5bWxpbmsgdHJlZS4KLSMKLSMgU3ludGF4OiBzeW1saW5rLXRyZWUgc3JjZGlyICJpZ25vcmUxIGlnbm9yZTIgLi4uIgotIwotIyB3aGVyZSBzcmNkaXIgaXMgdGhlIGRpcmVjdG9yeSB0byBjcmVhdGUgYSBzeW1saW5rIHRyZWUgdG8sCi0jIGFuZCAiaWdub3JlTiIgaXMgYSBsaXN0IG9mIGZpbGVzL2RpcmVjdG9yaWVzIHRvIGlnbm9yZS4KLQotcHJvZz0kMAotc3JjZGlyPSQxCi1pZ25vcmU9IiQyIgotCi1pZ25vcmVfYWRkaXRpb25hbD0iLiAuLiBDVlMiCi0KLSMgSWYgd2Ugd2VyZSBpbnZva2VkIHdpdGggYSByZWxhdGl2ZSBwYXRoIG5hbWUsIGFkanVzdCAke3Byb2d9IHRvIHdvcmsKLSMgaW4gc3ViZGlycy4KLWNhc2UgJHtwcm9nfSBpbgotLyopIDs7Ci0qKSBwcm9nPS4uLyR7cHJvZ30gOzsKLWVzYWMKLQotIyBTZXQgbmV3c3JjZGlyIHRvIHNvbWV0aGluZyBzdWJkaXJlY3RvcmllcyBjYW4gdXNlLgotY2FzZSAke3NyY2Rpcn0gaW4KLS8qKSBuZXdzcmNkaXI9JHtzcmNkaXJ9IDs7Ci0qKSBuZXdzcmNkaXI9Li4vJHtzcmNkaXJ9IDs7Ci1lc2FjCi0KLWZvciBmIGluIGBscyAtYSAke3NyY2Rpcn1gOyBkbwotICBpZiBbIC1kICR7c3JjZGlyfS8kZiBdOyB0aGVuCi0gICAgZm91bmQ9Ci0gICAgZm9yIGkgaW4gJHtpZ25vcmV9ICR7aWdub3JlX2FkZGl0aW9uYWx9OyBkbwotICAgICAgaWYgWyAiJGYiID0gIiRpIiBdOyB0aGVuCi0JZm91bmQ9eWVzCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBpZiBbIC16ICIke2ZvdW5kfSIgXTsgdGhlbgotICAgICAgZWNobyAiJGYJCS4ud29ya2luZyBpbiIKLSAgICAgIGlmIFsgLWQgJGYgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyICRmOyBmaQotICAgICAgKGNkICRmOyAke3Byb2d9ICR7bmV3c3JjZGlyfS8kZiAiJHtpZ25vcmV9IikKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJGYJCS4ubGlua2VkIgotICAgIHJtIC1mICRmCi0gICAgbG4gLXMgJHtzcmNkaXJ9LyRmIC4KLSAgZmkKLWRvbmUKLQotZXhpdCAwCmRpZmYgLS1naXQgYS90ZXhpbmZvL3RleGluZm8udGV4IGIvdGV4aW5mby90ZXhpbmZvLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzYTMzYy4uMDAwMDAwMAotLS0gYS90ZXhpbmZvL3RleGluZm8udGV4CisrKyAvZGV2L251bGwKQEAgLTEsNTQzMSArMCwwIEBACi0lIHRleGluZm8udGV4IC0tIFRlWCBtYWNyb3MgdG8gaGFuZGxlIFRleGluZm8gZmlsZXMuCi0lICRJZCQKLSUKLSUgQ29weXJpZ2h0IChDKSAxOTg1LCA4NiwgODgsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgKLSUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0lCi0lIFRoaXMgdGV4aW5mby50ZXggZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSUgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSUgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAotJSB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0lCi0lIFRoaXMgdGV4aW5mby50ZXggZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotJSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotJSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0lCi0lIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0lIGFsb25nIHdpdGggdGhpcyB0ZXhpbmZvLnRleCBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUKLSUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotJSBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSUKLSUgSW4gb3RoZXIgd29yZHMsIHlvdSBhcmUgd2VsY29tZSB0byB1c2UsIHNoYXJlIGFuZCBpbXByb3ZlIHRoaXMgcHJvZ3JhbS4KLSUgWW91IGFyZSBmb3JiaWRkZW4gdG8gZm9yYmlkIGFueW9uZSBlbHNlIHRvIHVzZSwgc2hhcmUgYW5kIGltcHJvdmUKLSUgd2hhdCB5b3UgZ2l2ZSB0aGVtLiAgIEhlbHAgc3RhbXAgb3V0IHNvZnR3YXJlLWhvYXJkaW5nIQotJQotJSBQbGVhc2UgdHJ5IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0ZXhpbmZvLnRleCBiZWZvcmUgc3VibWl0dGluZyBidWcKLSUgcmVwb3J0czsgeW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb206Ci0lICAgZnRwOi8vZnRwLmdudS5vcmcvcHViL2dudS90ZXhpbmZvLnRleAotJSAgIC9ob21lL2dkL2dudS9kb2MvdGV4aW5mby50ZXggb24gdGhlIEdOVSBtYWNoaW5lcy4KLSUgICAoYW5kIGFsbCBHTlUgbWlycm9ycywgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9vcmRlci9mdHAuaHRtbCkKLSUgICBmdHA6Ly90dWcub3JnL3RleC90ZXhpbmZvLnRleAotJSAgIGZ0cDovL2N0YW4ub3JnL21hY3Jvcy90ZXhpbmZvL3RleGluZm8udGV4Ci0lICAgKGFuZCBhbGwgQ1RBTiBtaXJyb3JzLCBmaW5nZXIgY3RhbkBjdGFuLm9yZyBmb3IgYSBsaXN0KS4KLSUgVGhlIHRleGluZm8udGV4IGluIHRoZSB0ZXhpbmZvIGRpc3RyaWJ1dGlvbiBpdHNlbGYgY291bGQgd2VsbCBiZSBvdXQKLSUgb2YgZGF0ZSwgc28gaWYgdGhhdCdzIHdoYXQgeW91J3JlIHVzaW5nLCBwbGVhc2UgY2hlY2suCi0lIAotJSBTZW5kIGJ1ZyByZXBvcnRzIHRvIGJ1Zy10ZXhpbmZvQGdudS5vcmcuCi0lIFBsZWFzZSBpbmNsdWRlIGEgcHJlY2lzZSB0ZXN0IGNhc2UgaW4gZWFjaCBidWcgcmVwb3J0LAotJSBpbmNsdWRpbmcgYSBjb21wbGV0ZSBkb2N1bWVudCB3aXRoIHdoaWNoIHdlIGNhbiByZXByb2R1Y2UgdGhlIHByb2JsZW0uCi0lIAotJSBUbyBwcm9jZXNzIGEgVGV4aW5mbyBtYW51YWwgd2l0aCBUZVgsIGl0J3MgbW9zdCByZWxpYWJsZSB0byB1c2UgdGhlCi0lIHRleGkyZHZpIHNoZWxsIHNjcmlwdCB0aGF0IGNvbWVzIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gIEZvciBzaW1wbGUKLSUgbWFudWFscywgaG93ZXZlciwgeW91IGNhbiBnZXQgYXdheSB3aXRoOgotJSAgIHRleCBmb28udGV4aQotJSAgIHRleGluZGV4IGZvby4/PwotJSAgIHRleCBmb28udGV4aQotJSAgIHRleCBmb28udGV4aQotJSAgIGR2aXBzIGZvby5kdmkgLW8gIyBvciB3aGF0ZXZlciwgdG8gcHJvY2VzcyB0aGUgZHZpIGZpbGUuCi0lIFRoZSBleHRyYSBydW5zIG9mIFRlWCBnZXQgdGhlIGNyb3NzLXJlZmVyZW5jZSBpbmZvcm1hdGlvbiBjb3JyZWN0LgotJSBTb21ldGltZXMgb25lIHJ1biBhZnRlciB0ZXhpbmRleCBzdWZmaWNlcywgYW5kIHNvbWV0aW1lcyB5b3UgbmVlZCBtb3JlCi0lIHRoYW4gdHdvOyB0ZXhpMmR2aSBkb2VzIGl0IGFzIG1hbnkgdGltZXMgYXMgbmVjZXNzYXJ5LgotCi0KLSUgTWFrZSBpdCBwb3NzaWJsZSB0byBjcmVhdGUgYSAuZm10IGZpbGUganVzdCBieSBsb2FkaW5nIHRoaXMgZmlsZToKLSUgaWYgdGhlIHVuZGVybHlpbmcgZm9ybWF0IGlzIG5vdCBsb2FkZWQsIHN0YXJ0IGJ5IGxvYWRpbmcgaXQgbm93LgotJSBBZGRlZCBieSBnaWxkZWEgTm92ZW1iZXIgMTk5My4KLVxleHBhbmRhZnRlclxpZnhcY3NuYW1lIGZtdG5hbWVcZW5kY3NuYW1lXHJlbGF4XGlucHV0IHBsYWluXGZpCi0KLSUgVGhpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIHZlcnNpb24gbnVtYmVyIGJhc2VkIG9uIFJDUy4KLVxkZWZcZGVmdGV4aW5mb3ZlcnNpb24kIzE6ICMyICR7XGRlZlx0ZXhpbmZvdmVyc2lvbnsjMn19Ci1cZGVmdGV4aW5mb3ZlcnNpb24kUmV2aXNpb24kCi1cbWVzc2FnZXtMb2FkaW5nIHRleGluZm8gcGFja2FnZSBbVmVyc2lvbiBcdGV4aW5mb3ZlcnNpb25dOn0KLQotJSBJZiBpbiBhIC5mbXQgZmlsZSwgcHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyCi0lIGFuZCB0dXJuIG9uIGFjdGl2ZSBjaGFyYWN0ZXJzIHRoYXQgd2UgY291bGRuJ3QgZG8gZWFybGllciBiZWNhdXNlCi0lIHRoZXkgbWlnaHQgaGF2ZSBhcHBlYXJlZCBpbiB0aGUgaW5wdXQgZmlsZSBuYW1lLgotXGV2ZXJ5am9ie1xtZXNzYWdle1tUZXhpbmZvIHZlcnNpb24gXHRleGluZm92ZXJzaW9uXX1cbWVzc2FnZXt9Ci0gIFxjYXRjb2RlYCs9XGFjdGl2ZSBcY2F0Y29kZWBcXz1cYWN0aXZlfQotCi0lIFNhdmUgc29tZSBwYXJ0cyBvZiBwbGFpbiB0ZXggd2hvc2UgbmFtZXMgd2Ugd2lsbCByZWRlZmluZS4KLQotXGxldFxwdGV4Yj1cYgotXGxldFxwdGV4YnVsbGV0PVxidWxsZXQKLVxsZXRccHRleGM9XGMKLVxsZXRccHRleGNvbW1hPVwsCi1cbGV0XHB0ZXhkb3Q9XC4KLVxsZXRccHRleGRvdHM9XGRvdHMKLVxsZXRccHRleGVuZD1cZW5kCi1cbGV0XHB0ZXhlcXVpdj1cZXF1aXYKLVxsZXRccHRleGV4Y2xhbT1cIQotXGxldFxwdGV4aT1caQotXGxldFxwdGV4bGJyYWNlPVx7Ci1cbGV0XHB0ZXhyYnJhY2U9XH0KLVxsZXRccHRleHN0YXI9XCoKLVxsZXRccHRleHQ9XHQKLQotJSBXZSBuZXZlciB3YW50IHBsYWluJ3Mgb3V0ZXIgXCsgZGVmaW5pdGlvbiBpbiBUZXhpbmZvLgotJSBGb3IgQHRleCwgd2UgY2FuIHVzZSBcdGFiYWxpZ24uCi1cbGV0XCsgPSBccmVsYXgKLQotCi1cbWVzc2FnZXtCYXNpY3MsfQotXGNoYXJkZWZcb3RoZXI9MTIKLQotJSBJZiB0aGlzIGNoYXJhY3RlciBhcHBlYXJzIGluIGFuIGVycm9yIG1lc3NhZ2Ugb3IgaGVscCBzdHJpbmcsIGl0Ci0lIHN0YXJ0cyBhIG5ldyBsaW5lIGluIHRoZSBvdXRwdXQuCi1cbmV3bGluZWNoYXIgPSBgXl5KCi0KLSUgU2V0IHVwIGZpeGVkIHdvcmRzIGZvciBFbmdsaXNoIGlmIG5vdCBhbHJlYWR5IHNldC4KLVxpZnhccHV0d29yZEFwcGVuZGl4XHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkQXBwZW5kaXh7QXBwZW5kaXh9XGZpCi1caWZ4XHB1dHdvcmRDaGFwdGVyXHVuZGVmaW5lZCAgXGdkZWZccHV0d29yZENoYXB0ZXJ7Q2hhcHRlcn1cZmkKLVxpZnhccHV0d29yZGZpbGVcdW5kZWZpbmVkICAgICBcZ2RlZlxwdXR3b3JkZmlsZXtmaWxlfVxmaQotXGlmeFxwdXR3b3JkSW5mb1x1bmRlZmluZWQgICAgIFxnZGVmXHB1dHdvcmRJbmZve0luZm99XGZpCi1caWZ4XHB1dHdvcmRNZXRob2Rvblx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1ldGhvZG9ue01ldGhvZCBvbn1cZmkKLVxpZnhccHV0d29yZG9uXHVuZGVmaW5lZCAgICAgICBcZ2RlZlxwdXR3b3Jkb257b259XGZpCi1caWZ4XHB1dHdvcmRwYWdlXHVuZGVmaW5lZCAgICAgXGdkZWZccHV0d29yZHBhZ2V7cGFnZX1cZmkKLVxpZnhccHV0d29yZHNlY3Rpb25cdW5kZWZpbmVkICBcZ2RlZlxwdXR3b3Jkc2VjdGlvbntzZWN0aW9ufVxmaQotXGlmeFxwdXR3b3JkU2VjdGlvblx1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRTZWN0aW9ue1NlY3Rpb259XGZpCi1caWZ4XHB1dHdvcmRzZWVcdW5kZWZpbmVkICAgICAgXGdkZWZccHV0d29yZHNlZXtzZWV9XGZpCi1caWZ4XHB1dHdvcmRTZWVcdW5kZWZpbmVkICAgICAgXGdkZWZccHV0d29yZFNlZXtTZWV9XGZpCi1caWZ4XHB1dHdvcmRTaG9ydENvbnRlbnRzXHVuZGVmaW5lZCAgXGdkZWZccHV0d29yZFNob3J0Q29udGVudHN7U2hvcnQgQ29udGVudHN9XGZpCi1caWZ4XHB1dHdvcmRUYWJsZW9mQ29udGVudHNcdW5kZWZpbmVkXGdkZWZccHV0d29yZFRhYmxlb2ZDb250ZW50c3tUYWJsZSBvZiBDb250ZW50c31cZmkKLQotJSBJZ25vcmUgYSB0b2tlbi4KLSUKLVxkZWZcZ29iYmxlIzF7fQotCi1caHlwaGVuYXRpb257YXAtcGVuLWRpeH0KLVxoeXBoZW5hdGlvbnttaW5pLWJ1Zi1mZXIgbWluaS1idWYtZmVyc30KLVxoeXBoZW5hdGlvbntlc2hlbGx9Ci1caHlwaGVuYXRpb257d2hpdGUtc3BhY2V9Ci0KLSUgTWFyZ2luIHRvIGFkZCB0byByaWdodCBvZiBldmVuIHBhZ2VzLCB0byBsZWZ0IG9mIG9kZCBwYWdlcy4KLVxuZXdkaW1lbiBcYmluZGluZ29mZnNldAotXG5ld2RpbWVuIFxub3JtYWxvZmZzZXQKLVxuZXdkaW1lblxwYWdld2lkdGggXG5ld2RpbWVuXHBhZ2VoZWlnaHQKLQotJSBTb21ldGltZXMgaXQgaXMgY29udmVuaWVudCB0byBoYXZlIGV2ZXJ5dGhpbmcgaW4gdGhlIHRyYW5zY3JpcHQgZmlsZQotJSBhbmQgbm90aGluZyBvbiB0aGUgdGVybWluYWwuICBXZSBkb24ndCBqdXN0IGNhbGwgXHRyYWNpbmdhbGwgaGVyZSwKLSUgc2luY2UgdGhhdCBwcm9kdWNlcyBzb21lIHVzZWxlc3Mgb3V0cHV0IG9uIHRoZSB0ZXJtaW5hbC4KLSUKLVxkZWZcZ2xvZ2dpbmdhbGx7XGJlZ2luZ3JvdXAgXGdsb2JhbGRlZnMgPSAxIFxsb2dnaW5nYWxsIFxlbmRncm91cH0lCi1caWZ4XGVUZVh2ZXJzaW9uXHVuZGVmaW5lZAotXGRlZlxsb2dnaW5nYWxse1x0cmFjaW5nY29tbWFuZHMyIFx0cmFjaW5nc3RhdHMyCi0gICBcdHJhY2luZ3BhZ2VzMSBcdHJhY2luZ291dHB1dDEgXHRyYWNpbmdsb3N0Y2hhcnMxCi0gICBcdHJhY2luZ21hY3JvczIgXHRyYWNpbmdwYXJhZ3JhcGhzMSBcdHJhY2luZ3Jlc3RvcmVzMQotICAgXHNob3dib3hicmVhZHRoXG1heGRpbWVuXHNob3dib3hkZXB0aFxtYXhkaW1lbgotfSUKLVxlbHNlCi1cZGVmXGxvZ2dpbmdhbGx7XHRyYWNpbmdjb21tYW5kczMgXHRyYWNpbmdzdGF0czIKLSAgIFx0cmFjaW5ncGFnZXMxIFx0cmFjaW5nb3V0cHV0MSBcdHJhY2luZ2xvc3RjaGFyczEKLSAgIFx0cmFjaW5nbWFjcm9zMiBcdHJhY2luZ3BhcmFncmFwaHMxIFx0cmFjaW5ncmVzdG9yZXMxCi0gICBcdHJhY2luZ3NjYW50b2tlbnMxIFx0cmFjaW5nYXNzaWduczEgXHRyYWNpbmdpZnMxCi0gICBcdHJhY2luZ2dyb3VwczEgXHRyYWNpbmduZXN0aW5nMgotICAgXHNob3dib3hicmVhZHRoXG1heGRpbWVuXHNob3dib3hkZXB0aFxtYXhkaW1lbgotfSUKLVxmaQotCi0lIEZvciBAY3JvcG1hcmtzIGNvbW1hbmQuCi0lIERvIEBjcm9wbWFya3MgdG8gZ2V0IGNyb3AgbWFya3MuCi0lIAotXG5ld2lmXGlmY3JvcG1hcmtzCi1cbGV0XGNyb3BtYXJrcyA9IFxjcm9wbWFya3N0cnVlCi0lCi0lIERpbWVuc2lvbnMgdG8gYWRkIGNyb3BtYXJrcyBhdCBjb3JuZXJzLgotJSBBZGRlZCBieSBQLiBBLiBNYWNLYXksIDEyIE5vdi4gMTk4NgotJQotXG5ld2RpbWVuXG91dGVyaHNpemUgXG5ld2RpbWVuXG91dGVydnNpemUgJSBzZXQgYnkgdGhlIHBhcGVyIHNpemUgcm91dGluZXMKLVxuZXdkaW1lblxjb3JuZXJsb25nICBcY29ybmVybG9uZz0xcGMKLVxuZXdkaW1lblxjb3JuZXJ0aGljayBcY29ybmVydGhpY2s9LjNwdAotXG5ld2RpbWVuXHRvcGFuZGJvdHRvbW1hcmdpbiBcdG9wYW5kYm90dG9tbWFyZ2luPS43NWluCi0KLSUgTWFpbiBvdXRwdXQgcm91dGluZS4KLVxjaGFyZGVmXFBBR0UgPSAyNTUKLVxvdXRwdXQgPSB7XG9uZXBhZ2VvdXR7XHBhZ2Vjb250ZW50c1xQQUdFfX0KLQotXG5ld2JveFxoZWFkbGluZWJveAotXG5ld2JveFxmb290bGluZWJveAotCi0lIFxvbmVwYWdlb3V0IHRha2VzIGEgdmJveCBhcyBhbiBhcmd1bWVudC4gIE5vdGUgdGhhdCBccGFnZWNvbnRlbnRzCi0lIGRvZXMgaW5zZXJ0aW9ucywgYnV0IHlvdSBoYXZlIHRvIGNhbGwgaXQgeW91cnNlbGYuCi1cZGVmXG9uZXBhZ2VvdXQjMXslCi0gIFxpZmNyb3BtYXJrcyBcaG9mZnNldD0wcHQgXGVsc2UgXGhvZmZzZXQ9XG5vcm1hbG9mZnNldCBcZmkKLSAgJQotICBcaWZvZGRccGFnZW5vICBcYWR2YW5jZVxob2Zmc2V0IGJ5IFxiaW5kaW5nb2Zmc2V0Ci0gIFxlbHNlIFxhZHZhbmNlXGhvZmZzZXQgYnkgLVxiaW5kaW5nb2Zmc2V0XGZpCi0gICUKLSAgJSBEbyB0aGlzIG91dHNpZGUgb2YgdGhlIFxzaGlwb3V0IHNvIEBjb2RlIGV0Yy4gd2lsbCBiZSBleHBhbmRlZCBpbgotICAlIHRoZSBoZWFkbGluZSBhcyB0aGV5IHNob3VsZCBiZSwgbm90IHRha2VuIGxpdGVyYWxseSAob3V0cHV0dGluZyAnJ2NvZGUpLgotICBcc2V0Ym94XGhlYWRsaW5lYm94ID0gXHZib3h7XGxldFxoc2l6ZT1ccGFnZXdpZHRoIFxtYWtlaGVhZGxpbmV9JQotICBcc2V0Ym94XGZvb3RsaW5lYm94ID0gXHZib3h7XGxldFxoc2l6ZT1ccGFnZXdpZHRoIFxtYWtlZm9vdGxpbmV9JQotICAlCi0gIHslCi0gICAgJSBIYXZlIHRvIGRvIHRoaXMgc3R1ZmYgb3V0c2lkZSB0aGUgXHNoaXBvdXQgYmVjYXVzZSB3ZSB3YW50IGl0IHRvCi0gICAgJSB0YWtlIGVmZmVjdCBpbiBcd3JpdGUncywgeWV0IHRoZSBncm91cCBkZWZpbmVkIGJ5IHRoZSBcdmJveCBlbmRzCi0gICAgJSBiZWZvcmUgdGhlIFxzaGlwb3V0IHJ1bnMuCi0gICAgJQotICAgIFxlc2NhcGVjaGFyID0gYFxcICAgICAlIHVzZSBiYWNrc2xhc2ggaW4gb3V0cHV0IGZpbGVzLgotICAgIFxpbmRleGR1bW1pZXMgICAgICAgICAlIGRvbid0IGV4cGFuZCBjb21tYW5kcyBpbiB0aGUgb3V0cHV0LgotICAgIFxub3JtYWx0dXJub2ZmYWN0aXZlICAlIFwgaW4gaW5kZXggZW50cmllcyBtdXN0IG5vdCBzdGF5IFwsIGUuZy4sIGlmCi0gICAgICAgICAgICAgICAgICAgJSB0aGUgcGFnZSBicmVhayBoYXBwZW5zIHRvIGJlIGluIHRoZSBtaWRkbGUgb2YgYW4gZXhhbXBsZS4KLSAgICBcc2hpcG91dFx2Ym94eyUKLSAgICAgIFxpZmNyb3BtYXJrcyBcdmJveCB0byBcb3V0ZXJ2c2l6ZVxiZ3JvdXAKLSAgICAgICAgXGhzaXplID0gXG91dGVyaHNpemUKLSAgICAgICAgXGxpbmV7XGV3dG9wXGhmaWxcZXd0b3B9JQotICAgICAgICBcbm9pbnRlcmxpbmVza2lwCi0gICAgICAgIFxsaW5leyUKLSAgICAgICAgICBcdmJveHtcbW92ZWxlZnRcY29ybmVydGhpY2tcbnN0b3B9JQotICAgICAgICAgIFxoZmlsbAotICAgICAgICAgIFx2Ym94e1xtb3ZlcmlnaHRcY29ybmVydGhpY2tcbnN0b3B9JQotICAgICAgICB9JQotICAgICAgICBcdnNraXBcdG9wYW5kYm90dG9tbWFyZ2luCi0gICAgICAgIFxsaW5lXGJncm91cAotICAgICAgICAgIFxoZmlsICUgY2VudGVyIHRoZSBwYWdlIHdpdGhpbiB0aGUgb3V0ZXIgKHBhZ2UpIGhzaXplLgotICAgICAgICAgIFxpZm9kZFxwYWdlbm9caHNraXBcYmluZGluZ29mZnNldFxmaQotICAgICAgICAgIFx2Ym94XGJncm91cAotICAgICAgXGZpCi0gICAgICAlCi0gICAgICBcdW52Ym94XGhlYWRsaW5lYm94Ci0gICAgICBccGFnZWJvZHl7IzF9JQotICAgICAgXGlmZGltXGh0XGZvb3RsaW5lYm94ID4gMHB0Ci0gICAgICAgICUgT25seSBsZWF2ZSB0aGlzIHNwYWNlIGlmIHRoZSBmb290bGluZSBpcyBub25lbXB0eS4KLSAgICAgICAgJSAoV2UgbGVzc2VuZWQgXHZzaXplIGZvciBpdCBpbiBcb2RkZm9vdGluZ3h4eC4pCi0gICAgICAgICUgVGhlIFxiYXNlbGluZXNraXA9MjRwdCBpbiBwbGFpbidzIFxtYWtlZm9vdGxpbmUgaGFzIG5vIGVmZmVjdC4KLSAgICAgICAgXHZza2lwIDJcYmFzZWxpbmVza2lwCi0gICAgICAgIFx1bnZib3hcZm9vdGxpbmVib3gKLSAgICAgIFxmaQotICAgICAgJQotICAgICAgXGlmY3JvcG1hcmtzCi0gICAgICAgICAgXGVncm91cCAlIGVuZCBvZiBcdmJveFxiZ3JvdXAKLSAgICAgICAgXGhmaWxcZWdyb3VwICUgZW5kIG9mIChjZW50ZXJpbmcpIFxsaW5lXGJncm91cAotICAgICAgICBcdnNraXBcdG9wYW5kYm90dG9tbWFyZ2luIHBsdXMxZmlsbCBtaW51czFmaWxsCi0gICAgICAgIFxib3htYXhkZXB0aCA9IFxjb3JuZXJ0aGljawotICAgICAgICBcbGluZXslCi0gICAgICAgICAgXHZib3h7XG1vdmVsZWZ0XGNvcm5lcnRoaWNrXG5zYm90fSUKLSAgICAgICAgICBcaGZpbGwKLSAgICAgICAgICBcdmJveHtcbW92ZXJpZ2h0XGNvcm5lcnRoaWNrXG5zYm90fSUKLSAgICAgICAgfSUKLSAgICAgICAgXG5vaW50ZXJsaW5lc2tpcAotICAgICAgICBcbGluZXtcZXdib3RcaGZpbFxld2JvdH0lCi0gICAgICBcZWdyb3VwICUgXHZib3ggZnJvbSBmaXJzdCBjcm9wbWFya3MgY2xhdXNlCi0gICAgICBcZmkKLSAgICB9JSBlbmQgb2YgXHNoaXBvdXRcdmJveAotICB9JSBlbmQgb2YgZ3JvdXAgd2l0aCBcdHVybm9mZmFjdGl2ZQotICBcYWR2YW5jZXBhZ2VubwotICBcaWZudW1cb3V0cHV0cGVuYWx0eT4tMjAwMDAgXGVsc2VcZG9zdXBlcmVqZWN0XGZpCi19Ci0KLVxuZXdpbnNlcnRcbWFyZ2luIFxkaW1lblxtYXJnaW49XG1heGRpbWVuCi0KLVxkZWZccGFnZWJvZHkjMXtcdmJveCB0b1xwYWdlaGVpZ2h0e1xib3htYXhkZXB0aD1cbWF4ZGVwdGggIzF9fQote1xjYXRjb2RlYFxAID0xMQotXGdkZWZccGFnZWNvbnRlbnRzIzF7XGlmdm9pZFx0b3BpbnNcZWxzZVx1bnZib3hcdG9waW5zXGZpCi0lIG1hcmdpbmFsIGhhY2tzLCBqdWhhQHZpaXNhLnV1Y3AgKEp1aGEgVGFrYWxhKQotXGlmdm9pZFxtYXJnaW5cZWxzZSAlIG1hcmdpbmFsIGluZm8gaXMgcHJlc2VudAotICBccmxhcHtca2Vyblxoc2l6ZVx2Ym94IHRvXHpAe1xrZXJuMXB0XGJveFxtYXJnaW4gXHZzc319XGZpCi1cZGltZW5APVxkcCMxIFx1bnZib3gjMQotXGlmdm9pZFxmb290aW5zXGVsc2VcdnNraXBcc2tpcFxmb290aW5zXGZvb3Rub3RlcnVsZSBcdW52Ym94XGZvb3RpbnNcZmkKLVxpZnJAZ2dlZGJvdHRvbSBca2Vybi1cZGltZW5AIFx2ZmlsIFxmaX0KLX0KLQotJSBIZXJlIGFyZSB0aGUgcnVsZXMgZm9yIHRoZSBjcm9wbWFya3MuICBOb3RlIHRoYXQgdGhleSBhcmUKLSUgb2Zmc2V0IHNvIHRoYXQgdGhlIHNwYWNlIGJldHdlZW4gdGhlbSBpcyB0cnVseSBcb3V0ZXJoc2l6ZSBvciBcb3V0ZXJ2c2l6ZQotJSAoUC4gQS4gTWFjS2F5LCAxMiBOb3ZlbWJlciwgMTk4NikKLSUKLVxkZWZcZXd0b3B7XHZydWxlIGhlaWdodFxjb3JuZXJ0aGljayBkZXB0aDBwdCB3aWR0aFxjb3JuZXJsb25nfQotXGRlZlxuc3RvcHtcdmJveAotICB7XGhydWxlIGhlaWdodFxjb3JuZXJ0aGljayBkZXB0aFxjb3JuZXJsb25nIHdpZHRoXGNvcm5lcnRoaWNrfX0KLVxkZWZcZXdib3R7XHZydWxlIGhlaWdodDBwdCBkZXB0aFxjb3JuZXJ0aGljayB3aWR0aFxjb3JuZXJsb25nfQotXGRlZlxuc2JvdHtcdmJveAotICB7XGhydWxlIGhlaWdodFxjb3JuZXJsb25nIGRlcHRoXGNvcm5lcnRoaWNrIHdpZHRoXGNvcm5lcnRoaWNrfX0KLQotJSBQYXJzZSBhbiBhcmd1bWVudCwgdGhlbiBwYXNzIGl0IHRvICMxLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSByZXN0IG9mCi0lIHRoZSBpbnB1dCBsaW5lIChleGNlcHQgd2UgcmVtb3ZlIGEgdHJhaWxpbmcgY29tbWVudCkuICAjMSBzaG91bGQgYmUgYQotJSBtYWNybyB3aGljaCBleHBlY3RzIGFuIG9yZGluYXJ5IHVuZGVsaW1pdGVkIFRlWCBhcmd1bWVudC4KLSUKLVxkZWZccGFyc2VhcmcjMXslCi0gIFxsZXRcbmV4dCA9ICMxJQotICBcYmVnaW5ncm91cAotICAgIFxvYmV5bGluZXMKLSAgICBcZnV0dXJlbGV0XHRlbXBccGFyc2Vhcmd4Ci19Ci0KLSUgSWYgdGhlIG5leHQgdG9rZW4gaXMgYW4gb2JleWVkIHNwYWNlIChmcm9tIGFuIEBleGFtcGxlIGVudmlyb25tZW50IG9yCi0lIHRoZSBsaWtlKSwgcmVtb3ZlIGl0IGFuZCByZWN1cnNlLiAgT3RoZXJ3aXNlLCB3ZSdyZSBkb25lLgotXGRlZlxwYXJzZWFyZ3h7JQotICAlIFxvYmV5ZWRzcGFjZSBpcyBkZWZpbmVkIGZhciBiZWxvdywgYWZ0ZXIgdGhlIGRlZmluaXRpb24gb2YgXHNlcHNwYWNlcy4KLSAgXGlmeFxvYmV5ZWRzcGFjZVx0ZW1wCi0gICAgXGV4cGFuZGFmdGVyXHBhcnNlYXJnZGlzY2FyZHNwYWNlCi0gIFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXHBhcnNlYXJnbGluZQotICBcZmkKLX0KLQotJSBSZW1vdmUgYSBzaW5nbGUgc3BhY2UgKGFzIHRoZSBkZWxpbWl0ZXIgdG9rZW4gdG8gdGhlIG1hY3JvIGNhbGwpLgote1xvYmV5c3BhY2VzICUKLSBcZ2RlZlxwYXJzZWFyZ2Rpc2NhcmRzcGFjZSB7XGZ1dHVyZWxldFx0ZW1wXHBhcnNlYXJneH19Ci0KLXtcb2JleWxpbmVzICUKLSAgXGdkZWZccGFyc2VhcmdsaW5lIzFeXk17JQotICAgIFxlbmRncm91cCAlIEVuZCBvZiB0aGUgZ3JvdXAgc3RhcnRlZCBpbiBccGFyc2VhcmcuCi0gICAgJQotICAgICUgRmlyc3QgcmVtb3ZlIGFueSBAYyBjb21tZW50LCB0aGVuIGFueSBAY29tbWVudC4KLSAgICAlIFJlc3VsdCBvZiBlYWNoIG1hY3JvIGlzIHB1dCBpbiBcdG9rczAuCi0gICAgXGFyZ3JlbW92ZWMgIzFcY1xyZWxheCAlCi0gICAgXGV4cGFuZGFmdGVyXGFyZ3JlbW92ZWNvbW1lbnQgXHRoZVx0b2tzMCBcY29tbWVudFxyZWxheCAlCi0gICAgJQotICAgICUgQ2FsbCB0aGUgY2FsbGVyJ3MgbWFjcm8sIHNhdmVkIGFzIFxuZXh0IGluIFxwYXJzZWFyZy4KLSAgICBcZXhwYW5kYWZ0ZXJcbmV4dFxleHBhbmRhZnRlcntcdGhlXHRva3MwfSUKLSAgfSUKLX0KLQotJSBTaW5jZSBhbGwgXGN7LG9tbWVudH0gZG9lcyBpcyB0aHJvdyBhd2F5IHRoZSBhcmd1bWVudCwgd2UgY2FuIGxldCBUZVgKLSUgZG8gdGhhdCBmb3IgdXMuICBUaGUgXHJlbGF4IGhlcmUgaXMgbWF0Y2hlZCBieSB0aGUgXHJlbGF4IGluIHRoZSBjYWxsCi0lIGluIFxwYXJzZWFyZ2xpbmU7IGl0IGNvdWxkIGJlIG1vcmUgb3IgbGVzcyBhbnl0aGluZywgaXRzIHB1cnBvc2UgaXMKLSUganVzdCB0byBkZWxpbWl0IHRoZSBhcmd1bWVudCB0byB0aGUgXGMuCi1cZGVmXGFyZ3JlbW92ZWMjMVxjIzJccmVsYXh7XHRva3MwID0geyMxfX0KLVxkZWZcYXJncmVtb3ZlY29tbWVudCMxXGNvbW1lbnQjMlxyZWxheHtcdG9rczAgPSB7IzF9fQotCi0lIFxhcmdyZW1vdmVjeyxvbW1lbnR9IG1pZ2h0IGxlYXZlIHVzIHdpdGggdHJhaWxpbmcgc3BhY2VzLCB0aG91Z2g7IGUuZy4sCi0lICAgIEBlbmQgaXRlbWl6ZSAgQGMgZm9vCi0lIHdpbGwgaGF2ZSB0d28gYWN0aXZlIHNwYWNlcyBhcyBwYXJ0IG9mIHRoZSBhcmd1bWVudCB3aXRoIHRoZQotJSBgaXRlbWl6ZScuICBIZXJlIHdlIHJlbW92ZSBhbGwgYWN0aXZlIHNwYWNlcyBmcm9tICMxLCBhbmQgYXNzaWduIHRoZQotJSByZXN1bHQgdG8gXHRva3MwLgotJQotJSBUaGlzIGxvc2VzIGlmIHRoZXJlIGFyZSBhbnkgKm90aGVyKiBhY3RpdmUgY2hhcmFjdGVycyBiZXNpZGVzIHNwYWNlcwotJSBpbiB0aGUgYXJndW1lbnQgLS0gXyBeICssIGZvciBleGFtcGxlIC0tIHNpbmNlIHRoZXkgZ2V0IGV4cGFuZGVkLgotJSBGb3J0dW5hdGVseSwgVGV4aW5mbyBkb2VzIG5vdCBkZWZpbmUgYW55IHN1Y2ggY29tbWFuZHMuICAoSWYgaXQgZXZlcgotJSBkb2VzLCB0aGUgY2F0Y29kZSBvZiB0aGUgY2hhcmFjdGVycyBpbiBxdWVzdGlvbndpbGwgaGF2ZSB0byBiZSBjaGFuZ2VkCi0lIGhlcmUuKSAgQnV0IHRoaXMgbWVhbnMgd2UgY2Fubm90IGNhbGwgXHJlbW92ZWFjdGl2ZXNwYWNlcyBhcyBwYXJ0IG9mCi0lIFxhcmdyZW1vdmVjeyxvbW1lbnR9LCBzaW5jZSBAYyB1c2VzIFxwYXJzZWFyZywgYW5kIHRodXMgdGhlIGFyZ3VtZW50Ci0lIHRoYXQgXHBhcnNlYXJnIGdldHMgbWlnaHQgd2VsbCBoYXZlIGFueSBjaGFyYWN0ZXIgYXQgYWxsIGluIGl0LgotJQotXGRlZlxyZW1vdmVhY3RpdmVzcGFjZXMjMXslCi0gIFxiZWdpbmdyb3VwCi0gICAgXGlnbm9yZWFjdGl2ZXNwYWNlcwotICAgIFxlZGVmXHRlbXB7IzF9JQotICAgIFxnbG9iYWxcdG9rczAgPSBcZXhwYW5kYWZ0ZXJ7XHRlbXB9JQotICBcZW5kZ3JvdXAKLX0KLQotJSBDaGFuZ2UgdGhlIGFjdGl2ZSBzcGFjZSB0byBleHBhbmQgdG8gbm90aGluZy4KLSUKLVxiZWdpbmdyb3VwCi0gIFxvYmV5c3BhY2VzCi0gIFxnZGVmXGlnbm9yZWFjdGl2ZXNwYWNlc3tcb2JleXNwYWNlc1xsZXQgPVxlbXB0eX0KLVxlbmRncm91cAotCi0KLVxkZWZcZmx1c2hjcntcaWZ4XHBhclxsaXNwcGFyIFxkZWZcbmV4dCMjMXt9XGVsc2UgXGxldFxuZXh0PVxyZWxheCBcZmkgXG5leHR9Ci0KLSUlIFRoZXNlIGFyZSB1c2VkIHRvIGtlZXAgQGJlZ2luL0BlbmQgbGV2ZWxzIGZyb20gcnVubmluZyBhd2F5Ci0lJSBDYWxsIFxpbkVOViB3aXRoaW4gZW52aXJvbm1lbnRzIChhZnRlciBhIFxiZWdpbmdyb3VwKQotXG5ld2lmXGlmRU5WIFxFTlZmYWxzZSBcZGVmXGluRU5We1xpZkVOVlxyZWxheFxlbHNlXEVOVnRydWVcZml9Ci1cZGVmXEVOVmNoZWNreyUKLVxpZkVOVlxlcnJtZXNzYWdle1N0aWxsIHdpdGhpbiBhbiBlbnZpcm9ubWVudDsgcHJlc3MgUkVUVVJOIHRvIGNvbnRpbnVlfQotXGVuZGdyb3VwXGZpfSAlIFRoaXMgaXMgbm90IHBlcmZlY3QsIGJ1dCBpdCBzaG91bGQgcmVkdWNlIGxvc3NhZ2UKLQotJSBAYmVnaW4gZm9vICBpcyB0aGUgc2FtZSBhcyBAZm9vLCBmb3Igbm93LgotXG5ld2hlbHBcRU1zaW1wbGV7UHJlc3MgUkVUVVJOIHRvIGNvbnRpbnVlLn0KLQotXG91dGVyXGRlZlxiZWdpbntccGFyc2VhcmdcYmVnaW54eHh9Ci0KLVxkZWZcYmVnaW54eHggIzF7JQotXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgIzFcZW5kY3NuYW1lXHJlbGF4Ci17XGVycmhlbHA9XEVNc2ltcGxlIFxlcnJtZXNzYWdle1VuZGVmaW5lZCBjb21tYW5kIEBiZWdpbiAjMX19XGVsc2UKLVxjc25hbWUgIzFcZW5kY3NuYW1lXGZpfQotCi0lIEBlbmQgZm9vIGV4ZWN1dGVzIHRoZSBkZWZpbml0aW9uIG9mIFxFZm9vLgotJQotXGRlZlxlbmR7XHBhcnNlYXJnXGVuZHh4eH0KLVxkZWZcZW5keHh4ICMxeyUKLSAgXHJlbW92ZWFjdGl2ZXNwYWNlc3sjMX0lCi0gIFxlZGVmXGVuZHRoaW5ne1x0aGVcdG9rczB9JQotICAlCi0gIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIEVcZW5kdGhpbmdcZW5kY3NuYW1lXHJlbGF4Ci0gICAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgXGVuZHRoaW5nXGVuZGNzbmFtZVxyZWxheAotICAgICAgJSBUaGVyZSdzIG5vIFxmb28sIGkuZS4sIG5vIGBgZW52aXJvbm1lbnQnJyBmb28uCi0gICAgICBcZXJyaGVscCA9IFxFTXNpbXBsZQotICAgICAgXGVycm1lc3NhZ2V7VW5kZWZpbmVkIGNvbW1hbmQgYEBlbmQgXGVuZHRoaW5nJ30lCi0gICAgXGVsc2UKLSAgICAgIFx1bm1hdGNoZWRlbmRlcnJvclxlbmR0aGluZwotICAgIFxmaQotICBcZWxzZQotICAgICUgRXZlcnl0aGluZydzIG9rOyB0aGUgcmlnaHQgZW52aXJvbm1lbnQgaGFzIGJlZW4gc3RhcnRlZC4KLSAgICBcY3NuYW1lIEVcZW5kdGhpbmdcZW5kY3NuYW1lCi0gIFxmaQotfQotCi0lIFRoZXJlIGlzIGFuIGVudmlyb25tZW50ICMxLCBidXQgaXQgaGFzbid0IGJlZW4gc3RhcnRlZC4gIEdpdmUgYW4gZXJyb3IuCi0lCi1cZGVmXHVubWF0Y2hlZGVuZGVycm9yIzF7JQotICBcZXJyaGVscCA9IFxFTXNpbXBsZQotICBcZXJybWVzc2FnZXtUaGlzIGBAZW5kICMxJyBkb2Vzbid0IGhhdmUgYSBtYXRjaGluZyBgQCMxJ30lCi19Ci0KLSUgRGVmaW5lIHRoZSBjb250cm9sIHNlcXVlbmNlIFxFIzEgdG8gZ2l2ZSBhbiB1bm1hdGNoZWQgQGVuZCBlcnJvci4KLSUKLVxkZWZcZGVmaW5ldW5tYXRjaGVkZW5kIzF7JQotICBcZXhwYW5kYWZ0ZXJcZGVmXGNzbmFtZSBFIzFcZW5kY3NuYW1le1x1bm1hdGNoZWRlbmRlcnJvcnsjMX19JQotfQotCi0KLSUgU2luZ2xlLXNwYWNpbmcgaXMgZG9uZSBieSB2YXJpb3VzIGVudmlyb25tZW50cyAoc3BlY2lmaWNhbGx5LCBpbgotJSBcbm9uZmlsbHN0YXJ0IGFuZCBccXVvdGF0aW9ucykuCi1cbmV3c2tpcFxzaW5nbGVzcGFjZXNraXAgXHNpbmdsZXNwYWNlc2tpcCA9IDEyLjVwdAotXGRlZlxzaW5nbGVzcGFjZXslCi0gICUgV2h5IHdhcyB0aGlzIGtlcm4gaGVyZT8gIEl0IG1lc3NlcyB1cCBlcXVhbGl6aW5nIHNwYWNlIGFib3ZlIGFuZCBiZWxvdwotICAlIGVudmlyb25tZW50cy4gIC0ta2FybCwgNm1heTkzCi0gICV7XGFkdmFuY2UgXGJhc2VsaW5lc2tpcCBieSAtXHNpbmdsZXNwYWNlc2tpcAotICAlXGtlcm4gXGJhc2VsaW5lc2tpcH0lCi0gIFxzZXRsZWFkaW5nIFxzaW5nbGVzcGFjZXNraXAKLX0KLQotJSUgU2ltcGxlIHNpbmdsZS1jaGFyYWN0ZXIgQCBjb21tYW5kcwotCi0lIEBAIHByaW50cyBhbiBACi0lIEtsdWRnZSB0aGlzIHVudGlsIHRoZSBmb250cyBhcmUgcmlnaHQgKGdycikuCi1cZGVmXEB7e1x0dFxjaGFyNjR9fQotCi0lIFRoaXMgaXMgdHVybmVkIG9mZiBiZWNhdXNlIGl0IHdhcyBuZXZlciBkb2N1bWVudGVkCi0lIGFuZCB5b3UgY2FuIHVzZSBAd3suLi59IGFyb3VuZCBhIHF1b3RlIHRvIHN1cHByZXNzIGxpZ2F0dXJlcy4KLSUlIERlZmluZSBAYCBhbmQgQCcgdG8gYmUgdGhlIHNhbWUgYXMgYCBhbmQgJwotJSUgYnV0IHN1cHByZXNzaW5nIGxpZ2F0dXJlcy4KLSVcZGVmXGB7e2B9fQotJVxkZWZcJ3t7J319Ci0KLSUgVXNlZCB0byBnZW5lcmF0ZSBxdW90ZWQgYnJhY2VzLgotXGRlZlxteWxicmFjZSB7e1x0dFxjaGFyMTIzfX0KLVxkZWZcbXlyYnJhY2Uge3tcdHRcY2hhcjEyNX19Ci1cbGV0XHs9XG15bGJyYWNlCi1cbGV0XH09XG15cmJyYWNlCi1cYmVnaW5ncm91cAotICAlIERlZmluaXRpb25zIHRvIHByb2R1Y2UgYWN0dWFsIFx7ICYgXH0gY29tbWFuZCBpbiBhbiBpbmRleC4KLSAgXGNhdGNvZGVgXHsgPSAxMiBcY2F0Y29kZWBcfSA9IDEyCi0gIFxjYXRjb2RlYFxbID0gMSBcY2F0Y29kZWBcXSA9IDIKLSAgXGNhdGNvZGVgXEAgPSAwIFxjYXRjb2RlYFxcID0gMTIKLSAgQGdkZWZAbGJyYWNlY21kW1x7XSUKLSAgQGdkZWZAcmJyYWNlY21kW1x9XSUKLUBlbmRncm91cAotCi0lIEFjY2VudHM6IEAsIEBkb3RhY2NlbnQgQHJpbmdhY2NlbnQgQHViYXJhY2NlbnQgQHVkb3RhY2NlbnQKLSUgT3RoZXJzIGFyZSBkZWZpbmVkIGJ5IHBsYWluIFRlWDogQGAgQCcgQCIgQF4gQH4gQD0gQHYgQEguCi1cbGV0XCwgPSBcYwotXGxldFxkb3RhY2NlbnQgPSBcLgotXGRlZlxyaW5nYWNjZW50IzF7e1xhY2NlbnQyMyAjMX19Ci1cbGV0XHRpZWFjY2VudCA9IFx0Ci1cbGV0XHViYXJhY2NlbnQgPSBcYgotXGxldFx1ZG90YWNjZW50ID0gXGQKLQotJSBPdGhlciBzcGVjaWFsIGNoYXJhY3RlcnM6IEBxdWVzdGlvbmRvd24gQGV4Y2xhbWRvd24KLSUgUGxhaW4gVGVYIGRlZmluZXM6IEBBQSBAQUUgQE8gQE9FIEBMIChhbmQgbG93ZXJjYXNlIHZlcnNpb25zKSBAc3MuCi1cZGVmXHF1ZXN0aW9uZG93bns/YH0KLVxkZWZcZXhjbGFtZG93bnshYH0KLQotJSBEb3RsZXNzIGkgYW5kIGRvdGxlc3MgaiwgdXNlZCBmb3IgYWNjZW50cy4KLVxkZWZcaW1hY3Jve2l9Ci1cZGVmXGptYWNyb3tqfQotXGRlZlxkb3RsZXNzIzF7JQotICBcZGVmXHRlbXB7IzF9JQotICBcaWZ4XHRlbXBcaW1hY3JvIFxwdGV4aQotICBcZWxzZVxpZnhcdGVtcFxqbWFjcm8gXGoKLSAgXGVsc2UgXGVycm1lc3NhZ2V7QGRvdGxlc3MgY2FuIGJlIHVzZWQgb25seSB3aXRoIGkgb3Igan0lCi0gIFxmaVxmaQotfQotCi0lIEJlIHN1cmUgd2UncmUgaW4gaG9yaXpvbnRhbCBtb2RlIHdoZW4gZG9pbmcgYSB0aWUsIHNpbmNlIHdlIG1ha2Ugc3BhY2UKLSUgZXF1aXZhbGVudCB0byB0aGlzIGluIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnRzLiBPdGhlcndpc2UsIGEgc3BhY2UKLSUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgd2lsbCBzdGFydCB3aXRoIFxwZW5hbHR5IC0tIGFuZAotJSBzaW5jZSBccGVuYWx0eSBpcyB2YWxpZCBpbiB2ZXJ0aWNhbCBtb2RlLCB3ZSdkIGVuZCB1cCBwdXR0aW5nIHRoZQotJSBwZW5hbHR5IG9uIHRoZSB2ZXJ0aWNhbCBsaXN0IGluc3RlYWQgb2YgaW4gdGhlIG5ldyBwYXJhZ3JhcGguCi17XGNhdGNvZGVgQCA9IDExCi0gJSBBdm9pZCB1c2luZyBcQE0gZGlyZWN0bHksIGJlY2F1c2UgdGhhdCBjYXVzZXMgdHJvdWJsZQotICUgaWYgdGhlIGRlZmluaXRpb24gaXMgd3JpdHRlbiBpbnRvIGFuIGluZGV4IGZpbGUuCi0gXGdsb2JhbFxsZXRcdGllcGVuYWx0eSA9IFxATQotIFxnZGVmXHRpZXtcbGVhdmV2bW9kZVxwZW5hbHR5XHRpZXBlbmFsdHlcIH0KLX0KLQotJSBAOiBmb3JjZXMgbm9ybWFsIHNpemUgd2hpdGVzcGFjZSBmb2xsb3dpbmcuCi1cZGVmXDp7XHNwYWNlZmFjdG9yPTEwMDAgfQotCi0lIEAqIGZvcmNlcyBhIGxpbmUgYnJlYWsuCi1cZGVmXCp7XGhmaWxcYnJlYWtcaGJveHt9XGlnbm9yZXNwYWNlc30KLQotJSBALiBpcyBhbiBlbmQtb2Ytc2VudGVuY2UgcGVyaW9kLgotXGRlZlwuey5cc3BhY2VmYWN0b3I9MzAwMCB9Ci0KLSUgQCEgaXMgYW4gZW5kLW9mLXNlbnRlbmNlIGJhbmcuCi1cZGVmXCF7IVxzcGFjZWZhY3Rvcj0zMDAwIH0KLQotJSBAPyBpcyBhbiBlbmQtb2Ytc2VudGVuY2UgcXVlcnkuCi1cZGVmXD97P1xzcGFjZWZhY3Rvcj0zMDAwIH0KLQotJSBAdyBwcmV2ZW50cyBhIHdvcmQgYnJlYWsuICBXaXRob3V0IHRoZSBcbGVhdmV2bW9kZSwgQHcgYXQgdGhlCi0lIGJlZ2lubmluZyBvZiBhIHBhcmFncmFwaCwgd2hlbiBUZVggaXMgc3RpbGwgaW4gdmVydGljYWwgbW9kZSwgd291bGQKLSUgcHJvZHVjZSBhIHdob2xlIGxpbmUgb2Ygb3V0cHV0IGluc3RlYWQgb2Ygc3RhcnRpbmcgdGhlIHBhcmFncmFwaC4KLVxkZWZcdyMxe1xsZWF2ZXZtb2RlXGhib3h7IzF9fQotCi0lIEBncm91cCAuLi4gQGVuZCBncm91cCBmb3JjZXMgLi4uIHRvIGJlIGFsbCBvbiBvbmUgcGFnZSwgYnkgZW5jbG9zaW5nCi0lIGl0IGluIGEgVGVYIHZib3guICBXZSB1c2UgXHZ0b3AgaW5zdGVhZCBvZiBcdmJveCB0byBjb25zdHJ1Y3QgdGhlIGJveAotJSB0byBrZWVwIGl0cyBoZWlnaHQgdGhhdCBvZiBhIG5vcm1hbCBsaW5lLiAgQWNjb3JkaW5nIHRvIHRoZSBydWxlcyBmb3IKLSUgXHRvcHNraXAgKHAuMTE0IG9mIHRoZSBUZVhib29rKSwgdGhlIGdsdWUgaW5zZXJ0ZWQgaXMKLSUgbWF4IChcdG9wc2tpcCAtIFxodCAoZmlyc3QgaXRlbSksIDApLiAgSWYgdGhhdCBoZWlnaHQgaXMgbGFyZ2UsCi0lIHRoZXJlZm9yZSwgbm8gZ2x1ZSBpcyBpbnNlcnRlZCwgYW5kIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBoZWFkbGluZSBhbmQKLSUgdGhlIHRleHQgaXMgc21hbGwsIHdoaWNoIGxvb2tzIGJhZC4KLSUKLVxkZWZcZ3JvdXB7XGJlZ2luZ3JvdXAKLSAgXGlmbnVtXGNhdGNvZGUxMz1cYWN0aXZlIFxlbHNlCi0gICAgXGVycmhlbHAgPSBcZ3JvdXBpbnZhbGlkaGVscAotICAgIFxlcnJtZXNzYWdle0Bncm91cCBpbnZhbGlkIGluIGNvbnRleHQgd2hlcmUgZmlsbGluZyBpcyBlbmFibGVkfSUKLSAgXGZpCi0gICUKLSAgJSBUaGUgXHZ0b3Agd2Ugc3RhcnQgYmVsb3cgcHJvZHVjZXMgYSBib3ggd2l0aCBub3JtYWwgaGVpZ2h0IGFuZCBsYXJnZQotICAlIGRlcHRoOyB0aHVzLCBUZVggcHV0cyBcYmFzZWxpbmVza2lwIGdsdWUgYmVmb3JlIGl0LCBhbmQgKHdoZW4gdGhlCi0gICUgbmV4dCBsaW5lIG9mIHRleHQgaXMgZG9uZSkgXGxpbmVza2lwIGdsdWUgYWZ0ZXIgaXQuICAoU2VlIHAuODIgb2YKLSAgJSB0aGUgVGVYYm9vay4pICBUaHVzLCBzcGFjZSBiZWxvdyBpcyBub3QgcXVpdGUgZXF1YWwgdG8gc3BhY2UKLSAgJSBhYm92ZS4gIEJ1dCBpdCdzIHByZXR0eSBjbG9zZS4KLSAgXGRlZlxFZ3JvdXB7JQotICAgIFxlZ3JvdXAgICAgICAgICAgICUgRW5kIHRoZSBcdnRvcC4KLSAgICBcZW5kZ3JvdXAgICAgICAgICAlIEVuZCB0aGUgXGdyb3VwLgotICB9JQotICAlCi0gIFx2dG9wXGJncm91cAotICAgICUgV2UgaGF2ZSB0byBwdXQgYSBzdHJ1dCBvbiB0aGUgbGFzdCBsaW5lIGluIGNhc2UgdGhlIEBncm91cCBpcyBpbgotICAgICUgdGhlIG1pZHN0IG9mIGFuIGV4YW1wbGUsIHJhdGhlciB0aGFuIGNvbXBsZXRlbHkgZW5jbG9zaW5nIGl0LgotICAgICUgT3RoZXJ3aXNlLCB0aGUgaW50ZXJsaW5lIHNwYWNlIGJldHdlZW4gdGhlIGxhc3QgbGluZSBvZiB0aGUgZ3JvdXAKLSAgICAlIGFuZCB0aGUgZmlyc3QgbGluZSBhZnRlcndhcmRzIGlzIHRvbyBzbWFsbC4gIEJ1dCB3ZSBjYW4ndCBwdXQgdGhlCi0gICAgJSBzdHJ1dCBpbiBcRWdyb3VwLCBzaW5jZSB0aGVyZSBpdCB3b3VsZCBiZSBvbiBhIGxpbmUgYnkgaXRzZWxmLgotICAgICUgSGVuY2UgdGhpcyBqdXN0IGluc2VydHMgYSBzdHJ1dCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZS4KLSAgICBcZXZlcnlwYXIgPSB7XHN0cnV0fSUKLSAgICAlCi0gICAgJSBTaW5jZSB3ZSBoYXZlIGEgc3RydXQgb24gZXZlcnkgbGluZSwgd2UgZG9uJ3QgbmVlZCBhbnkgb2YgVGVYJ3MKLSAgICAlIG5vcm1hbCBpbnRlcmxpbmUgc3BhY2luZy4KLSAgICBcb2ZmaW50ZXJsaW5lc2tpcAotICAgICUKLSAgICAlIE9LLCBidXQgbm93IHdlIGhhdmUgdG8gZG8gc29tZXRoaW5nIGFib3V0IGJsYW5rCi0gICAgJSBsaW5lcyBpbiB0aGUgaW5wdXQgaW4gQGV4YW1wbGUtbGlrZSBlbnZpcm9ubWVudHMsIHdoaWNoIG5vcm1hbGx5Ci0gICAgJSBqdXN0IHR1cm4gaW50byBcbGlzcHBhciwgd2hpY2ggd2lsbCBpbnNlcnQgbm8gc3BhY2Ugbm93IHRoYXQgd2UndmUKLSAgICAlIHR1cm5lZCBvZmYgdGhlIGludGVybGluZSBzcGFjZS4gIFNpbXBsZXN0IGlzIHRvIG1ha2UgdGhlbSBiZSBhbgotICAgICUgZW1wdHkgcGFyYWdyYXBoLgotICAgIFxpZnhccGFyXGxpc3BwYXIKLSAgICAgIFxlZGVmXHBhcntcbGVhdmV2bW9kZSBccGFyfSUKLSAgICAgICUKLSAgICAgICUgUmVzZXQgXl5NJ3MgZGVmaW5pdGlvbiB0byBuZXcgZGVmaW5pdGlvbiBvZiBccGFyLgotICAgICAgXG9iZXlsaW5lcwotICAgIFxmaQotICAgICUKLSAgICAlIERvIEBjb21tZW50IHNpbmNlIHdlIGFyZSBjYWxsZWQgaW5zaWRlIGFuIGVudmlyb25tZW50IHN1Y2ggYXMKLSAgICAlIEBleGFtcGxlLCB3aGVyZSBlYWNoIGVuZC1vZi1saW5lIGluIHRoZSBpbnB1dCBjYXVzZXMgYW4KLSAgICAlIGVuZC1vZi1saW5lIGluIHRoZSBvdXRwdXQuICBXZSBkb24ndCB3YW50IHRoZSBlbmQtb2YtbGluZSBhZnRlcgotICAgICUgdGhlIGBAZ3JvdXAnIHRvIHB1dCBleHRyYSBzcGFjZSBpbiB0aGUgb3V0cHV0LiAgU2luY2UgQGdyb3VwCi0gICAgJSBzaG91bGQgYXBwZWFyIG9uIGEgbGluZSBieSBpdHNlbGYgKGFjY29yZGluZyB0byB0aGUgVGV4aW5mbwotICAgICUgbWFudWFsKSwgd2UgZG9uJ3Qgd29ycnkgYWJvdXQgZWF0aW5nIGFueSB1c2VyIHRleHQuCi0gICAgXGNvbW1lbnQKLX0KLSUKLSUgVGVYIHB1dHMgaW4gYW4gXGVzY2FwZWNoYXIgKGkuZS4sIGBAJykgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVscAotJSBtZXNzYWdlLCBzbyB0aGlzIGVuZHMgdXAgcHJpbnRpbmcgYEBncm91cCBjYW4gb25seSAuLi4nLgotJQotXG5ld2hlbHBcZ3JvdXBpbnZhbGlkaGVscHslCi1ncm91cCBjYW4gb25seSBiZSB1c2VkIGluIGVudmlyb25tZW50cyBzdWNoIGFzIEBleGFtcGxlLF5eSiUKLXdoZXJlIGVhY2ggbGluZSBvZiBpbnB1dCBwcm9kdWNlcyBhIGxpbmUgb2Ygb3V0cHV0Ln0KLQotJSBAbmVlZCBzcGFjZS1pbi1taWxzCi0lIGZvcmNlcyBhIHBhZ2UgYnJlYWsgaWYgdGhlcmUgaXMgbm90IHNwYWNlLWluLW1pbHMgcmVtYWluaW5nLgotCi1cbmV3ZGltZW5cbWlsICBcbWlsPTAuMDAxaW4KLQotXGRlZlxuZWVke1xwYXJzZWFyZ1xuZWVkeH0KLQotJSBPbGQgZGVmaW5pdGlvbi0tZGlkbid0IHdvcmsuCi0lXGRlZlxuZWVkeCAjMXtccGFyICUKLSUlIFRoaXMgbWV0aG9kIHRyaWVzIHRvIG1ha2UgVGVYIGJyZWFrIHRoZSBwYWdlIG5hdHVyYWxseQotJSUgaWYgdGhlIGRlcHRoIG9mIHRoZSBib3ggZG9lcyBub3QgZml0LgotJXtcYmFzZWxpbmVza2lwPTBwdCUKLSVcdnRvcCB0byAjMVxtaWx7XHZmaWx9XGtlcm4gLSMxXG1pbFxub2JyZWFrCi0lXHByZXZkZXB0aD0tMTAwMHB0Ci0lfX0KLQotXGRlZlxuZWVkeCMxeyUKLSAgJSBHbyBpbnRvIHZlcnRpY2FsIG1vZGUsIHNvIHdlIGRvbid0IG1ha2UgYSBiaWcgYm94IGluIHRoZSBtaWRkbGUgb2YgYQotICAlIHBhcmFncmFwaC4KLSAgXHBhcgotICAlCi0gICUgRG9uJ3QgYWRkIGFueSBsZWFkaW5nIGJlZm9yZSBvdXIgYmlnIGVtcHR5IGJveCwgYnV0IGFsbG93IGEgcGFnZQotICAlIGJyZWFrLCBzaW5jZSB0aGUgYmVzdCBicmVhayBtaWdodCBiZSByaWdodCBoZXJlLgotICBcYWxsb3dicmVhawotICBcbm9pbnRlcmxpbmVza2lwCi0gIFx2dG9wIHRvICMxXG1pbHtcdmZpbH0lCi0gICUKLSAgJSBUZVggZG9lcyBub3QgZXZlbiBjb25zaWRlciBwYWdlIGJyZWFrcyBpZiBhIHBlbmFsdHkgYWRkZWQgdG8gdGhlCi0gICUgbWFpbiB2ZXJ0aWNhbCBsaXN0IGlzIDEwMDAwIG9yIG1vcmUuICBCdXQgaW4gb3JkZXIgdG8gc2VlIGlmIHRoZQotICAlIGVtcHR5IGJveCB3ZSBqdXN0IGFkZGVkIGZpdHMgb24gdGhlIHBhZ2UsIHdlIG11c3QgbWFrZSBpdCBjb25zaWRlcgotICAlIHBhZ2UgYnJlYWtzLiAgT24gdGhlIG90aGVyIGhhbmQsIHdlIGRvbid0IHdhbnQgdG8gYWN0dWFsbHkgYnJlYWsgdGhlCi0gICUgcGFnZSBhZnRlciB0aGUgZW1wdHkgYm94LiAgU28gd2UgdXNlIGEgcGVuYWx0eSBvZiA5OTk5LgotICAlCi0gICUgVGhlcmUgaXMgYW4gZXh0cmVtZWx5IHNtYWxsIGNoYW5jZSB0aGF0IFRlWCB3aWxsIGFjdHVhbGx5IGJyZWFrIHRoZQotICAlIHBhZ2UgYXQgdGhpcyBccGVuYWx0eSwgaWYgdGhlcmUgYXJlIG5vIG90aGVyIGZlYXNpYmxlIGJyZWFrcG9pbnRzIGluCi0gICUgc2lnaHQuICAoSWYgdGhlIHVzZXIgaXMgdXNpbmcgbG90cyBvZiBiaWcgQGdyb3VwIGNvbW1hbmRzLCB3aGljaAotICAlIGFsbW9zdC1idXQtbm90LXF1aXRlIGZpbGwgdXAgYSBwYWdlLCBUZVggd2lsbCBoYXZlIGEgaGFyZCB0aW1lIGRvaW5nCi0gICUgZ29vZCBwYWdlIGJyZWFraW5nLCBmb3IgZXhhbXBsZS4pICBIb3dldmVyLCBJIGNvdWxkIG5vdCBjb25zdHJ1Y3QgYW4KLSAgJSBleGFtcGxlIHdoZXJlIGEgcGFnZSBicm9rZSBhdCB0aGlzIFxwZW5hbHR5OyBpZiBpdCBoYXBwZW5zIGluIGEgcmVhbAotICAlIGRvY3VtZW50LCB0aGVuIHdlIGNhbiByZWNvbnNpZGVyIG91ciBzdHJhdGVneS4KLSAgXHBlbmFsdHk5OTk5Ci0gICUKLSAgJSBCYWNrIHVwIGJ5IHRoZSBzaXplIG9mIHRoZSBib3gsIHdoZXRoZXIgd2UgZGlkIGEgcGFnZSBicmVhayBvciBub3QuCi0gIFxrZXJuIC0jMVxtaWwKLSAgJQotICAlIERvIG5vdCBhbGxvdyBhIHBhZ2UgYnJlYWsgcmlnaHQgYWZ0ZXIgdGhpcyBrZXJuLgotICBcbm9icmVhawotfQotCi0lIEBiciAgIGZvcmNlcyBwYXJhZ3JhcGggYnJlYWsKLQotXGxldFxiciA9IFxwYXIKLQotJSBAZG90c3t9IG91dHB1dCBhbiBlbGxpcHNpcyB1c2luZyB0aGUgY3VycmVudCBmb250LgotJSBXZSBkbyAuNWVtIHBlciBwZXJpb2Qgc28gdGhhdCBpdCBoYXMgdGhlIHNhbWUgc3BhY2luZyBpbiBhIHR5cGV3cml0ZXIKLSUgZm9udCBhcyB0aHJlZSBhY3R1YWwgcGVyaW9kIGNoYXJhY3RlcnMuCi0lCi1cZGVmXGRvdHN7JQotICBcbGVhdmV2bW9kZQotICBcaGJveCB0byAxLjVlbXslCi0gICAgXGhza2lwIDBwdCBwbHVzIDAuMjVmaWwgbWludXMgMC4yNWZpbAotICAgIC5caHNzLlxoc3MuJQotICAgIFxoc2tpcCAwcHQgcGx1cyAwLjVmaWwgbWludXMgMC41ZmlsCi0gIH0lCi19Ci0KLSUgQGVuZGRvdHN7fSBpcyBhbiBlbmQtb2Ytc2VudGVuY2UgZWxsaXBzaXMuCi0lIAotXGRlZlxlbmRkb3RzeyUKLSAgXGxlYXZldm1vZGUKLSAgXGhib3ggdG8gMmVteyUKLSAgICBcaHNraXAgMHB0IHBsdXMgMC4yNWZpbCBtaW51cyAwLjI1ZmlsCi0gICAgLlxoc3MuXGhzcy5caHNzLiUKLSAgICBcaHNraXAgMHB0IHBsdXMgMC41ZmlsIG1pbnVzIDAuNWZpbAotICB9JQotICBcc3BhY2VmYWN0b3I9MzAwMAotfQotCi0KLSUgQHBhZ2UgICAgZm9yY2VzIHRoZSBzdGFydCBvZiBhIG5ldyBwYWdlCi0lCi1cZGVmXHBhZ2V7XHBhclx2ZmlsbFxzdXBlcmVqZWN0fQotCi0lIEBleGRlbnQgdGV4dC4uLi4KLSUgb3V0cHV0cyB0ZXh0IG9uIHNlcGFyYXRlIGxpbmUgaW4gcm9tYW4gZm9udCwgc3RhcnRpbmcgYXQgc3RhbmRhcmQgcGFnZSBtYXJnaW4KLQotJSBUaGlzIHJlY29yZHMgdGhlIGFtb3VudCBvZiBpbmRlbnQgaW4gdGhlIGlubmVybW9zdCBlbnZpcm9ubWVudC4KLSUgVGhhdCdzIGhvdyBtdWNoIFxleGRlbnQgc2hvdWxkIHRha2Ugb3V0LgotXG5ld3NraXBcZXhkZW50YW1vdW50Ci0KLSUgVGhpcyBkZWZuIGlzIHVzZWQgaW5zaWRlIGZpbGwgZW52aXJvbm1lbnRzIHN1Y2ggYXMgQGRlZnVuLgotXGRlZlxleGRlbnR7XHBhcnNlYXJnXGV4ZGVudHl5eX0KLVxkZWZcZXhkZW50eXl5ICMxe3tcaGZpbFxicmVha1xoYm94e1xrZXJuIC1cZXhkZW50YW1vdW50e1xybSMxfX1caGZpbFxicmVha319Ci0KLSUgVGhpcyBkZWZuIGlzIHVzZWQgaW5zaWRlIG5vZmlsbCBlbnZpcm9ubWVudHMgc3VjaCBhcyBAZXhhbXBsZS4KLVxkZWZcbm9maWxsZXhkZW50e1xwYXJzZWFyZ1xub2ZpbGxleGRlbnR5eXl9Ci1cZGVmXG5vZmlsbGV4ZGVudHl5eSAjMXt7XGFkdmFuY2UgXGxlZnRza2lwIGJ5IC1cZXhkZW50YW1vdW50Ci1cbGVmdGxpbmV7XGhza2lwXGxlZnRza2lwe1xybSMxfX19fQotCi0lIEBpbm1hcmdpbntURVhUfSBwdXRzIFRFWFQgaW4gdGhlIG1hcmdpbiBuZXh0IHRvIHRoZSBjdXJyZW50IHBhcmFncmFwaC4KLQotXGRlZlxpbm1hcmdpbiMxeyUKLVxzdHJ1dFx2YWRqdXN0e1xub2JyZWFrXGtlcm4tXHN0cnV0ZGVwdGgKLSAgXHZ0b3AgdG8gXHN0cnV0ZGVwdGh7XGJhc2VsaW5lc2tpcFxzdHJ1dGRlcHRoXHZzcwotICBcbGxhcHtccmlnaHRza2lwPVxpbm1hcmdpbnNwYWNpbmcgXHZib3h7XG5vaW5kZW50ICMxfX1cbnVsbH19fQotXG5ld3NraXBcaW5tYXJnaW5zcGFjaW5nIFxpbm1hcmdpbnNwYWNpbmc9MWNtCi1cZGVmXHN0cnV0ZGVwdGh7XGRwXHN0cnV0Ym94fQotCi0lXGhib3h7e1xybSMxfX1caGZpbFxicmVha319Ci0KLSUgQGluY2x1ZGUgZmlsZSAgICBpbnNlcnQgdGV4dCBvZiB0aGF0IGZpbGUgYXMgaW5wdXQuCi0lIEFsbG93IG5vcm1hbCBjaGFyYWN0ZXJzIHRoYXQgIHdlIG1ha2UgYWN0aXZlIGluIHRoZSBhcmd1bWVudCAoYSBmaWxlIG5hbWUpLgotXGRlZlxpbmNsdWRle1xiZWdpbmdyb3VwCi0gIFxjYXRjb2RlYFxcPTEyCi0gIFxjYXRjb2RlYH49MTIKLSAgXGNhdGNvZGVgXj0xMgotICBcY2F0Y29kZWBfPTEyCi0gIFxjYXRjb2RlYHw9MTIKLSAgXGNhdGNvZGVgPD0xMgotICBcY2F0Y29kZWA+PTEyCi0gIFxjYXRjb2RlYCs9MTIKLSAgXHBhcnNlYXJnXGluY2x1ZGV6enp9Ci0lIFJlc3RvcmUgYWN0aXZlIGNoYXJzIGZvciBpbmNsdWRlZCBmaWxlLgotXGRlZlxpbmNsdWRlenp6IzF7XGVuZGdyb3VwXGJlZ2luZ3JvdXAKLSAgJSBSZWFkIHRoZSBpbmNsdWRlZCBmaWxlIGluIGEgZ3JvdXAgc28gbmVzdGVkIEBpbmNsdWRlJ3Mgd29yay4KLSAgXGRlZlx0aGlzZmlsZXsjMX0lCi0gIFxpbnB1dFx0aGlzZmlsZQotXGVuZGdyb3VwfQotCi1cZGVmXHRoaXNmaWxle30KLQotJSBAY2VudGVyIGxpbmUgICBvdXRwdXRzIHRoYXQgbGluZSwgY2VudGVyZWQKLQotXGRlZlxjZW50ZXJ7XHBhcnNlYXJnXGNlbnRlcnp6en0KLVxkZWZcY2VudGVyenp6ICMxe3tcYWR2YW5jZVxoc2l6ZSBieSAtXGxlZnRza2lwCi1cYWR2YW5jZVxoc2l6ZSBieSAtXHJpZ2h0c2tpcAotXGNlbnRlcmxpbmV7IzF9fX0KLQotJSBAc3AgbiAgIG91dHB1dHMgbiBsaW5lcyBvZiB2ZXJ0aWNhbCBzcGFjZQotCi1cZGVmXHNwe1xwYXJzZWFyZ1xzcHh4eH0KLVxkZWZcc3B4eHggIzF7XHZza2lwICMxXGJhc2VsaW5lc2tpcH0KLQotJSBAY29tbWVudCAuLi5saW5lIHdoaWNoIGlzIGlnbm9yZWQuLi4KLSUgQGMgaXMgdGhlIHNhbWUgYXMgQGNvbW1lbnQKLSUgQGlnbm9yZSAuLi4gQGVuZCBpZ25vcmUgIGlzIGFub3RoZXIgd2F5IHRvIHdyaXRlIGEgY29tbWVudAotCi1cZGVmXGNvbW1lbnR7XGJlZ2luZ3JvdXAgXGNhdGNvZGVgXF5eTT1cb3RoZXIlCi1cY2F0Y29kZWBcQD1cb3RoZXIgXGNhdGNvZGVgXHs9XG90aGVyIFxjYXRjb2RlYFx9PVxvdGhlciUKLVxjb21tZW50eHh4fQote1xjYXRjb2RlYFxeXk09XG90aGVyIFxnZGVmXGNvbW1lbnR4eHgjMV5eTXtcZW5kZ3JvdXB9fQotCi1cbGV0XGM9XGNvbW1lbnQKLQotJSBAcGFyYWdyYXBoaW5kZW50ICBpcyBkZWZpbmVkIGZvciB0aGUgSW5mbyBmb3JtYXR0aW5nIGNvbW1hbmRzIG9ubHkuCi1cbGV0XHBhcmFncmFwaGluZGVudD1cY29tbWVudAotCi0lIFByZXZlbnQgZXJyb3JzIGZvciBzZWN0aW9uIGNvbW1hbmRzLgotJSBVc2VkIGluIEBpZ25vcmUgYW5kIGluIGZhaWxpbmcgY29uZGl0aW9uYWxzLgotXGRlZlxpZ25vcmVzZWN0aW9uc3slCi1cbGV0XGNoYXB0ZXI9XHJlbGF4Ci1cbGV0XHVubnVtYmVyZWQ9XHJlbGF4Ci1cbGV0XHRvcD1ccmVsYXgKLVxsZXRcdW5udW1iZXJlZHNlYz1ccmVsYXgKLVxsZXRcdW5udW1iZXJlZHNlY3Rpb249XHJlbGF4Ci1cbGV0XHVubnVtYmVyZWRzdWJzZWM9XHJlbGF4Ci1cbGV0XHVubnVtYmVyZWRzdWJzZWN0aW9uPVxyZWxheAotXGxldFx1bm51bWJlcmVkc3Vic3Vic2VjPVxyZWxheAotXGxldFx1bm51bWJlcmVkc3Vic3Vic2VjdGlvbj1ccmVsYXgKLVxsZXRcc2VjdGlvbj1ccmVsYXgKLVxsZXRcc3Vic2VjPVxyZWxheAotXGxldFxzdWJzdWJzZWM9XHJlbGF4Ci1cbGV0XHN1YnNlY3Rpb249XHJlbGF4Ci1cbGV0XHN1YnN1YnNlY3Rpb249XHJlbGF4Ci1cbGV0XGFwcGVuZGl4PVxyZWxheAotXGxldFxhcHBlbmRpeHNlYz1ccmVsYXgKLVxsZXRcYXBwZW5kaXhzZWN0aW9uPVxyZWxheAotXGxldFxhcHBlbmRpeHN1YnNlYz1ccmVsYXgKLVxsZXRcYXBwZW5kaXhzdWJzZWN0aW9uPVxyZWxheAotXGxldFxhcHBlbmRpeHN1YnN1YnNlYz1ccmVsYXgKLVxsZXRcYXBwZW5kaXhzdWJzdWJzZWN0aW9uPVxyZWxheAotXGxldFxjb250ZW50cz1ccmVsYXgKLVxsZXRcc21hbGxib29rPVxyZWxheAotXGxldFx0aXRsZXBhZ2U9XHJlbGF4Ci19Ci0KLSUgVXNlZCBpbiBuZXN0ZWQgY29uZGl0aW9uYWxzLCB3aGVyZSB3ZSBoYXZlIHRvIHBhcnNlIHRoZSBUZXhpbmZvIHNvdXJjZQotJSBhbmQgc28gd2FudCB0byB0dXJuIG9mZiBtb3N0IGNvbW1hbmRzLCBpbiBjYXNlIHRoZXkgYXJlIHVzZWQKLSUgaW5jb3JyZWN0bHkuCi0lCi1cZGVmXGlnbm9yZW1vcmVjb21tYW5kc3slCi0gIFxsZXRcZGVmY29kZWluZGV4ID0gXHJlbGF4Ci0gIFxsZXRcZGVmY3YgPSBccmVsYXgKLSAgXGxldFxkZWZmbiA9IFxyZWxheAotICBcbGV0XGRlZmZueCA9IFxyZWxheAotICBcbGV0XGRlZmluZGV4ID0gXHJlbGF4Ci0gIFxsZXRcZGVmaXZhciA9IFxyZWxheAotICBcbGV0XGRlZm1hYyA9IFxyZWxheAotICBcbGV0XGRlZm1ldGhvZCA9IFxyZWxheAotICBcbGV0XGRlZm9wID0gXHJlbGF4Ci0gIFxsZXRcZGVmb3B0ID0gXHJlbGF4Ci0gIFxsZXRcZGVmc3BlYyA9IFxyZWxheAotICBcbGV0XGRlZnRwID0gXHJlbGF4Ci0gIFxsZXRcZGVmdHlwZWZuID0gXHJlbGF4Ci0gIFxsZXRcZGVmdHlwZWZ1biA9IFxyZWxheAotICBcbGV0XGRlZnR5cGV2YXIgPSBccmVsYXgKLSAgXGxldFxkZWZ0eXBldnIgPSBccmVsYXgKLSAgXGxldFxkZWZ1biA9IFxyZWxheAotICBcbGV0XGRlZnZhciA9IFxyZWxheAotICBcbGV0XGRlZnZyID0gXHJlbGF4Ci0gIFxsZXRccmVmID0gXHJlbGF4Ci0gIFxsZXRceHJlZiA9IFxyZWxheAotICBcbGV0XHByaW50aW5kZXggPSBccmVsYXgKLSAgXGxldFxweHJlZiA9IFxyZWxheAotICBcbGV0XHNldHRpdGxlID0gXHJlbGF4Ci0gIFxsZXRcc2V0Y2hhcHRlcm5ld3BhZ2UgPSBccmVsYXgKLSAgXGxldFxzZXRjaGFwdGVyc3R5bGUgPSBccmVsYXgKLSAgXGxldFxldmVyeWhlYWRpbmcgPSBccmVsYXgKLSAgXGxldFxldmVuaGVhZGluZyA9IFxyZWxheAotICBcbGV0XG9kZGhlYWRpbmcgPSBccmVsYXgKLSAgXGxldFxldmVyeWZvb3RpbmcgPSBccmVsYXgKLSAgXGxldFxldmVuZm9vdGluZyA9IFxyZWxheAotICBcbGV0XG9kZGZvb3RpbmcgPSBccmVsYXgKLSAgXGxldFxoZWFkaW5ncyA9IFxyZWxheAotICBcbGV0XGluY2x1ZGUgPSBccmVsYXgKLSAgXGxldFxsb3dlcnNlY3Rpb25zID0gXHJlbGF4Ci0gIFxsZXRcZG93biA9IFxyZWxheAotICBcbGV0XHJhaXNlc2VjdGlvbnMgPSBccmVsYXgKLSAgXGxldFx1cCA9IFxyZWxheAotICBcbGV0XHNldCA9IFxyZWxheAotICBcbGV0XGNsZWFyID0gXHJlbGF4Ci0gIFxsZXRcaXRlbSA9IFxyZWxheAotfQotCi0lIElnbm9yZSBAaWdub3JlIC4uLiBAZW5kIGlnbm9yZS4KLSUKLVxkZWZcaWdub3Jle1xkb2lnbm9yZXtpZ25vcmV9fQotCi0lIElnbm9yZSBAaWZpbmZvLCBAaWZodG1sLCBAaWZub3R0ZXgsIEBodG1sLCBAbWVudSwgYW5kIEBkaXJlbnRyeSB0ZXh0LgotJQotXGRlZlxpZmluZm97XGRvaWdub3Jle2lmaW5mb319Ci1cZGVmXGlmaHRtbHtcZG9pZ25vcmV7aWZodG1sfX0KLVxkZWZcaWZub3R0ZXh7XGRvaWdub3Jle2lmbm90dGV4fX0KLVxkZWZcaHRtbHtcZG9pZ25vcmV7aHRtbH19Ci1cZGVmXG1lbnV7XGRvaWdub3Jle21lbnV9fQotXGRlZlxkaXJlbnRyeXtcZG9pZ25vcmV7ZGlyZW50cnl9fQotCi0lIEBkaXJjYXRlZ29yeSBDQVRFR09SWSAgLS0gc3BlY2lmeSBhIGNhdGVnb3J5IG9mIHRoZSBkaXIgZmlsZQotJSB3aGljaCB0aGlzIGZpbGUgc2hvdWxkIGJlbG9uZyB0by4gIElnbm9yZSB0aGlzIGluIFRlWC4KLVxsZXRcZGlyY2F0ZWdvcnkgPSBcY29tbWVudAotCi0lIElnbm9yZSB0ZXh0IHVudGlsIGEgbGluZSBgQGVuZCAjMScuCi0lCi1cZGVmXGRvaWdub3JlIzF7XGJlZ2luZ3JvdXAKLSAgJSBEb24ndCBjb21wbGFpbiBhYm91dCBjb250cm9sIHNlcXVlbmNlcyB3ZSBoYXZlIGRlY2xhcmVkIFxvdXRlci4KLSAgXGlnbm9yZXNlY3Rpb25zCi0gICUKLSAgJSBEZWZpbmUgYSBjb21tYW5kIHRvIHN3YWxsb3cgdGV4dCB1bnRpbCB3ZSByZWFjaCBgQGVuZCAjMScuCi0gICUgVGhpcyBAIGlzIGEgY2F0Y29kZSAxMiB0b2tlbiAodGhhdCBpcyB0aGUgbm9ybWFsIGNhdGNvZGUgb2YgQCBpbgotICAlIHRoaXMgdGV4aW5mby50ZXggZmlsZSkuICBXZSBjaGFuZ2UgdGhlIGNhdGNvZGUgb2YgQCBiZWxvdyB0byBtYXRjaC4KLSAgXGxvbmdcZGVmXGRvaWdub3JldGV4dCMjMUBlbmQgIzF7XGVuZGRvaWdub3JlfSUKLSAgJQotICAlIE1ha2Ugc3VyZSB0aGF0IHNwYWNlcyB0dXJuIGludG8gdG9rZW5zIHRoYXQgbWF0Y2ggd2hhdCBcZG9pZ25vcmV0ZXh0IHdhbnRzLgotICBcY2F0Y29kZTMyID0gMTAKLSAgJQotICAlIElnbm9yZSBicmFjZXMsIHRvbywgc28gbWlzbWF0Y2hlZCBicmFjZXMgZG9uJ3QgY2F1c2UgdHJvdWJsZS4KLSAgXGNhdGNvZGVgXHsgPSA5Ci0gIFxjYXRjb2RlYFx9ID0gOQotICAlCi0gICUgV2UgbXVzdCBub3QgaGF2ZSBAYyBpbnRlcnByZXRlZCBhcyBhIGNvbnRyb2wgc2VxdWVuY2UuCi0gIFxjYXRjb2RlYFxAID0gMTIKLSAgJQotICAlIE1ha2UgdGhlIGxldHRlciBjIGEgY29tbWVudCBjaGFyYWN0ZXIgc28gdGhhdCB0aGUgcmVzdCBvZiB0aGUgbGluZQotICAlIHdpbGwgYmUgaWdub3JlZC4gVGhpcyB3YXksIHRoZSBkb2N1bWVudCBjYW4gaGF2ZSAoZm9yIGV4YW1wbGUpCi0gICUgICBAYyBAZW5kIGlmaW5mbwotICAlIGFuZCB0aGUgQGVuZCBpZmluZm8gd2lsbCBiZSBwcm9wZXJseSBpZ25vcmVkLgotICAlIChXZSd2ZSBqdXN0IGNoYW5nZWQgQCB0byBjYXRjb2RlIDEyLikKLSAgXGNhdGNvZGVgXGMgPSAxNAotICAlCi0gICUgQW5kIG5vdyBleHBhbmQgdGhhdCBjb21tYW5kLgotICBcZG9pZ25vcmV0ZXh0Ci19Ci0KLSUgV2hhdCB3ZSBkbyB0byBmaW5pc2ggb2ZmIGlnbm9yZWQgdGV4dC4KLSUKLVxkZWZcZW5kZG9pZ25vcmV7XGVuZGdyb3VwXGlnbm9yZXNwYWNlc30lCi0KLVxuZXdpZlxpZndhcm5lZG9ic1x3YXJuZWRvYnNmYWxzZQotXGRlZlxvYnN0ZXh3YXJueyUKLSAgXGlmd2FybmVkb2JzXHJlbGF4XGVsc2UKLSAgJSBXZSBuZWVkIHRvIHdhcm4gZm9sa3MgdGhhdCB0aGV5IG1heSBoYXZlIHRyb3VibGUgd2l0aCBUZVggMy4wLgotICAlIFRoaXMgdXNlcyBcaW1tZWRpYXRlXHdyaXRlMTYgcmF0aGVyIHRoYW4gXG1lc3NhZ2UgdG8gZ2V0IG5ld2xpbmVzLgotICAgIFxpbW1lZGlhdGVcd3JpdGUxNnt9Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2eyoqKldBUk5JTkcqKiogZm9yIHVzZXJzIG9mIFVuaXggVGVYIDMuMCF9Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2e1RoaXMgbWFudWFsIHRyaXBzIGEgYnVnIGluIFRlWCB2ZXJzaW9uIDMuMCAodGV4IGhhbmdzKS59Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2e0lmIHlvdSBhcmUgcnVubmluZyBhbm90aGVyIHZlcnNpb24gb2YgVGVYLCByZWxheC59Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2e0lmIHlvdSBhcmUgcnVubmluZyBVbml4IFRlWCAzLjAsIGtpbGwgdGhpcyBUZVggcHJvY2Vzcy59Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2eyAgVGhlbiB1cGdyYWRlIHlvdXIgVGVYIGluc3RhbGxhdGlvbiBpZiB5b3UgY2FuLn0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7ICAoU2VlIGZ0cDovL2Z0cC5nbnUuYWkubWl0LmVkdS9wdWIvZ251L1RlWC5SRUFETUUuKX0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7SWYgeW91IGFyZSBzdHVjayB3aXRoIHZlcnNpb24gMy4wLCBydW4gdGhlfQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNnsgIHNjcmlwdCBgYHRleDNwYXRjaCcnIGZyb20gdGhlIFRleGluZm8gZGlzdHJpYnV0aW9ufQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNnsgIHRvIHVzZSBhIHdvcmthcm91bmQufQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNnt9Ci0gICAgXGdsb2JhbFx3YXJuZWRvYnN0cnVlCi0gICAgXGZpCi19Ci0KLSUgKipJbiBUZVggMy4wLCBzZXR0aW5nIHRleHQgaW4gXG51bGxmb250IGhhbmdzIHRleC4gIEZvciBhCi0lIHdvcmthcm91bmQgKHdoaWNoIHJlcXVpcmVzIHRoZSBmaWxlIGBgZHVtbXkudGZtJycgdG8gYmUgaW5zdGFsbGVkKSwKLSUgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZToKLSUlJSUlXGZvbnRcbnVsbGZvbnQ9ZHVtbXlcbGV0XG9ic3RleHdhcm49XHJlbGF4Ci0KLSUgSWdub3JlIHRleHQsIGV4Y2VwdCB0aGF0IHdlIGtlZXAgdHJhY2sgb2YgY29uZGl0aW9uYWwgY29tbWFuZHMgZm9yCi0lIHB1cnBvc2VzIG9mIG5lc3RpbmcsIHVwIHRvIGFuIGBAZW5kICMxJyBjb21tYW5kLgotJQotXGRlZlxuZXN0ZWRpZ25vcmUjMXslCi0gIFxvYnN0ZXh3YXJuCi0gICUgV2UgbXVzdCBhY3R1YWxseSBleHBhbmQgdGhlIGlnbm9yZWQgdGV4dCB0byBsb29rIGZvciB0aGUgQGVuZAotICAlIGNvbW1hbmQsIHNvIHRoYXQgbmVzdGVkIGlnbm9yZSBjb25zdHJ1Y3RzIHdvcmsuICBUaHVzLCB3ZSBwdXQgdGhlCi0gICUgdGV4dCBpbnRvIGEgXHZib3ggYW5kIHRoZW4gZG8gbm90aGluZyB3aXRoIHRoZSByZXN1bHQuICBUbyBtaW5pbWl6ZQotICAlIHRoZSBjaGFuZ2Ugb2YgbWVtb3J5IG92ZXJmbG93LCB3ZSBmb2xsb3cgdGhlIGFwcHJvYWNoIG91dGxpbmVkIG9uCi0gICUgcGFnZSA0MDEgb2YgdGhlIFRlWGJvb2s6IG1ha2UgdGhlIGN1cnJlbnQgZm9udCBiZSBhIGR1bW15IGZvbnQuCi0gICUKLSAgXHNldGJveDAgPSBcdmJveFxiZ3JvdXAKLSAgICAlIERvbid0IGNvbXBsYWluIGFib3V0IGNvbnRyb2wgc2VxdWVuY2VzIHdlIGhhdmUgZGVjbGFyZWQgXG91dGVyLgotICAgIFxpZ25vcmVzZWN0aW9ucwotICAgICUKLSAgICAlIERlZmluZSBgQGVuZCAjMScgdG8gZW5kIHRoZSBib3gsIHdoaWNoIHdpbGwgaW4gdHVybiB1bmRlZmluZSB0aGUKLSAgICAlIEBlbmQgY29tbWFuZCBhZ2Fpbi4KLSAgICBcZXhwYW5kYWZ0ZXJcZGVmXGNzbmFtZSBFIzFcZW5kY3NuYW1le1xlZ3JvdXBcaWdub3Jlc3BhY2VzfSUKLSAgICAlCi0gICAgJSBXZSBhcmUgZ29pbmcgdG8gYmUgcGFyc2luZyBUZXhpbmZvIGNvbW1hbmRzLiAgTW9zdCBjYXVzZSBubwotICAgICUgdHJvdWJsZSB3aGVuIHRoZXkgYXJlIHVzZWQgaW5jb3JyZWN0bHksIGJ1dCBzb21lIGNvbW1hbmRzIGRvCi0gICAgJSBjb21wbGljYXRlZCBhcmd1bWVudCBwYXJzaW5nIG9yIG90aGVyd2lzZSBnZXQgY29uZnVzZWQsIHNvIHdlCi0gICAgJSB1bmRlZmluZSB0aGVtLgotICAgICUKLSAgICAlIFdlIGNhbid0IGRvIGFueXRoaW5nIGFib3V0IHN0cmF5IEAtc2lnbnMsIHVuZm9ydHVuYXRlbHk7Ci0gICAgJSB0aGV5J2xsIHByb2R1Y2UgYHVuZGVmaW5lZCBjb250cm9sIHNlcXVlbmNlJyBlcnJvcnMuCi0gICAgXGlnbm9yZW1vcmVjb21tYW5kcwotICAgICUKLSAgICAlIFNldCB0aGUgY3VycmVudCBmb250IHRvIGJlIFxudWxsZm9udCwgYSBUZVggcHJpbWl0aXZlLCBhbmQgZGVmaW5lCi0gICAgJSBhbGwgdGhlIGZvbnQgY29tbWFuZHMgdG8gYWxzbyB1c2UgXG51bGxmb250LiAgV2UgZG9uJ3QgdXNlCi0gICAgJSBkdW1teS50Zm0sIGFzIHN1Z2dlc3RlZCBpbiB0aGUgVGVYYm9vaywgYmVjYXVzZSBub3QgYWxsIHNpdGVzCi0gICAgJSBtaWdodCBoYXZlIHRoYXQgaW5zdGFsbGVkLiAgVGhlcmVmb3JlLCBtYXRoIG1vZGUgd2lsbCBzdGlsbAotICAgICUgcHJvZHVjZSBvdXRwdXQsIGJ1dCB0aGF0IHNob3VsZCBiZSBhbiBleHRyZW1lbHkgc21hbGwgYW1vdW50IG9mCi0gICAgJSBzdHVmZiBjb21wYXJlZCB0byB0aGUgbWFpbiBpbnB1dC4KLSAgICAlCi0gICAgXG51bGxmb250Ci0gICAgXGxldFx0ZW5ybSA9IFxudWxsZm9udCAgXGxldFx0ZW5pdCA9IFxudWxsZm9udCAgXGxldFx0ZW5zbCA9IFxudWxsZm9udAotICAgIFxsZXRcdGVuYmYgPSBcbnVsbGZvbnQgIFxsZXRcdGVudHQgPSBcbnVsbGZvbnQgIFxsZXRcc21hbGxjYXBzID0gXG51bGxmb250Ci0gICAgXGxldFx0ZW5zZiA9IFxudWxsZm9udAotICAgICUgU2ltaWxhcmx5IGZvciBpbmRleCBmb250cyAobW9zdGx5IGZvciB0aGVpciB1c2UgaW4KLSAgICAlIHNtYWxsZXhhbXBsZSkKLSAgICBcbGV0XGluZHJtID0gXG51bGxmb250ICBcbGV0XGluZGl0ID0gXG51bGxmb250ICBcbGV0XGluZHNsID0gXG51bGxmb250Ci0gICAgXGxldFxpbmRiZiA9IFxudWxsZm9udCAgXGxldFxpbmR0dCA9IFxudWxsZm9udCAgXGxldFxpbmRzYyA9IFxudWxsZm9udAotICAgIFxsZXRcaW5kc2YgPSBcbnVsbGZvbnQKLSAgICAlCi0gICAgJSBEb24ndCBjb21wbGFpbiB3aGVuIGNoYXJhY3RlcnMgYXJlIG1pc3NpbmcgZnJvbSB0aGUgZm9udHMuCi0gICAgXHRyYWNpbmdsb3N0Y2hhcnMgPSAwCi0gICAgJQotICAgICUgRG9uJ3QgYm90aGVyIHRvIGRvIHNwYWNlIGZhY3RvciBjYWxjdWxhdGlvbnMuCi0gICAgXGZyZW5jaHNwYWNpbmcKLSAgICAlCi0gICAgJSBEb24ndCByZXBvcnQgdW5kZXJmdWxsIGhib3hlcy4KLSAgICBcaGJhZG5lc3MgPSAxMDAwMAotICAgICUKLSAgICAlIERvIG1pbmltYWwgbGluZS1icmVha2luZy4KLSAgICBccHJldG9sZXJhbmNlID0gMTAwMDAKLSAgICAlCi0gICAgJSBEbyBub3QgZXhlY3V0ZSBpbnN0cnVjdGlvbnMgaW4gQHRleAotICAgIFxkZWZcdGV4e1xkb2lnbm9yZXt0ZXh9fSUKLSAgICAlIERvIG5vdCBleGVjdXRlIG1hY3JvIGRlZmluaXRpb25zLgotICAgICUgYGMnIGlzIGEgY29tbWVudCBjaGFyYWN0ZXIsIHNvIHRoZSB3b3JkIGBtYWNybycgd2lsbCBnZXQgY3V0IG9mZi4KLSAgICBcZGVmXG1hY3Jve1xkb2lnbm9yZXttYX19JQotfQotCi0lIEBzZXQgVkFSIHNldHMgdGhlIHZhcmlhYmxlIFZBUiB0byBhbiBlbXB0eSB2YWx1ZS4KLSUgQHNldCBWQVIgUkVTVC1PRi1MSU5FIHNldHMgVkFSIHRvIHRoZSB2YWx1ZSBSRVNULU9GLUxJTkUuCi0lCi0lIFNpbmNlIHdlIHdhbnQgdG8gc2VwYXJhdGUgVkFSIGZyb20gUkVTVC1PRi1MSU5FICh3aGljaCBtaWdodCBiZQotJSBlbXB0eSksIHdlIGNhbid0IGp1c3QgdXNlIFxwYXJzZWFyZzsgd2UgaGF2ZSB0byBpbnNlcnQgYSBzcGFjZSBvZiBvdXIKLSUgb3duIHRvIGRlbGltaXQgdGhlIHJlc3Qgb2YgdGhlIGxpbmUsIGFuZCB0aGVuIHRha2UgaXQgb3V0IGFnYWluIGlmIHdlCi0lIGRpZG4ndCBuZWVkIGl0LiAgTWFrZSBzdXJlIHRoZSBjYXRjb2RlIG9mIHNwYWNlIGlzIGNvcnJlY3QgdG8gYXZvaWQKLSUgbG9zaW5nIGluc2lkZSBAZXhhbXBsZSwgZm9yIGluc3RhbmNlLgotJQotXGRlZlxzZXR7XGJlZ2luZ3JvdXBcY2F0Y29kZWAgPTEwCi0gIFxjYXRjb2RlYFwtPTEyIFxjYXRjb2RlYFxfPTEyICUgQWxsb3cgLSBhbmQgXyBpbiBWQVIuCi0gIFxwYXJzZWFyZ1xzZXR4eHh9Ci1cZGVmXHNldHh4eCMxe1xzZXR5eXkjMSBcZW5kc2V0eXl5fQotXGRlZlxzZXR5eXkjMSAjMlxlbmRzZXR5eXl7JQotICBcZGVmXHRlbXB7IzJ9JQotICBcaWZ4XHRlbXBcZW1wdHkgXGdsb2JhbFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZSA9IFxlbXB0eQotICBcZWxzZSBcc2V0enp6eyMxfSMyXGVuZHNldHp6eiAlIFJlbW92ZSB0aGUgdHJhaWxpbmcgc3BhY2UgXHNldHh4eCBpbnNlcnRlZC4KLSAgXGZpCi0gIFxlbmRncm91cAotfQotJSBDYW4ndCB1c2UgXHhkZWYgdG8gcHJlLWV4cGFuZCAjMiBhbmQgc2F2ZSBzb21lIHRpbWUsIHNpbmNlIFx0ZW1wIG9yCi0lIFxuZXh0IG9yIG90aGVyIGNvbnRyb2wgc2VxdWVuY2VzIHRoYXQgd2UndmUgZGVmaW5lZCBtaWdodCBnZXQgdXMgaW50bwotJSBhbiBpbmZpbml0ZSBsb29wLiBDb25zaWRlciBgQHNldCBmb28gQGNpdGV7YmFyfScuCi1cZGVmXHNldHp6eiMxIzIgXGVuZHNldHp6entcZXhwYW5kYWZ0ZXJcZ2RlZlxjc25hbWUgU0VUIzFcZW5kY3NuYW1leyMyfX0KLQotJSBAY2xlYXIgVkFSIGNsZWFycyAoaS5lLiwgdW5zZXRzKSB0aGUgdmFyaWFibGUgVkFSLgotJQotXGRlZlxjbGVhcntccGFyc2VhcmdcY2xlYXJ4eHh9Ci1cZGVmXGNsZWFyeHh4IzF7XGdsb2JhbFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZT1ccmVsYXh9Ci0KLSUgQHZhbHVle2Zvb30gZ2V0cyB0aGUgdGV4dCBzYXZlZCBpbiB2YXJpYWJsZSBmb28uCi0lCi17Ci0gIFxjYXRjb2RlYFxfID0gXGFjdGl2ZQotICAlCi0gICUgV2UgbWlnaHQgZW5kIHVwIHdpdGggYWN0aXZlIF8gb3IgLSBjaGFyYWN0ZXJzIGluIHRoZSBhcmd1bWVudCBpZgotICAlIHdlJ3JlIGNhbGxlZCBmcm9tIEBjb2RlLCBhcyBAY29kZXtAdmFsdWV7Zm9vLWJhcl99fS4gIFNvIFxsZXQgYW55Ci0gICUgc3VjaCBhY3RpdmUgY2hhcmFjdGVycyB0byB0aGVpciBub3JtYWwgZXF1aXZhbGVudHMuCi0gIFxnZGVmXHZhbHVle1xiZWdpbmdyb3VwCi0gICAgXGNhdGNvZGVgXC09MTIgXGNhdGNvZGVgXF89MTIKLSAgICBcaW5kZXhicmVha3MgXGxldF9cbm9ybWFsdW5kZXJzY29yZQotICAgIFx2YWx1ZXh4eH0KLX0KLVxkZWZcdmFsdWV4eHgjMXtcZXhwYW5kYWJsZXZhbHVleyMxfVxlbmRncm91cH0KLQotJSBXZSBoYXZlIHRoaXMgc3Vicm91dGluZSBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgYXQgbGVhc3Qgc29tZSBAdmFsdWUncwotJSBwcm9wZXJseSBpbiBpbmRleGVzICh3ZSBcbGV0XHZhbHVlIHRvIHRoaXMgaW4gXGluZGV4ZHVtbWllcykuICBPbmVzCi0lIHdob3NlIG5hbWVzIGNvbnRhaW4gLSBvciBfIHN0aWxsIHdvbid0IHdvcmssIGJ1dCB3ZSBjYW4ndCBkbyBhbnl0aGluZwotJSBhYm91dCB0aGF0LiAgVGhlIGNvbW1hbmQgaGFzIHRvIGJlIGZ1bGx5IGV4cGFuZGFibGUsIHNpbmNlIHRoZSByZXN1bHQKLSUgd2luZHMgdXAgaW4gdGhlIGluZGV4IGZpbGUuICBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlIHZhcmlhYmxlJ3MgdmFsdWUKLSUgY29udGFpbnMgb3RoZXIgVGV4aW5mbyBjb21tYW5kcywgaXQncyBhbG1vc3QgY2VydGFpbiBpdCB3aWxsIGZhaWwKLSUgKGFsdGhvdWdoIHBlcmhhcHMgd2UgY291bGQgZml4IHRoYXQgd2l0aCBzdWZmaWNpZW50IHdvcmsgdG8gZG8gYQotJSBvbmUtbGV2ZWwgZXhwYW5zaW9uIG9uIHRoZSByZXN1bHQsIGluc3RlYWQgb2YgY29tcGxldGUpLgotJSAKLVxkZWZcZXhwYW5kYWJsZXZhbHVlIzF7JQotICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBTRVQjMVxlbmRjc25hbWVccmVsYXgKLSAgICB7W05vIHZhbHVlIGZvciBgYCMxJydddn0lCi0gIFxlbHNlCi0gICAgXGNzbmFtZSBTRVQjMVxlbmRjc25hbWUKLSAgXGZpCi19Ci0KLSUgQGlmc2V0IFZBUiAuLi4gQGVuZCBpZnNldCByZWFkcyB0aGUgYC4uLicgaWZmIFZBUiBoYXMgYmVlbiBkZWZpbmVkCi0lIHdpdGggQHNldC4KLSUKLVxkZWZcaWZzZXR7XHBhcnNlYXJnXGlmc2V0eHh4fQotXGRlZlxpZnNldHh4eCAjMXslCi0gIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZVxyZWxheAotICAgIFxleHBhbmRhZnRlclxpZnNldGZhaWwKLSAgXGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJcaWZzZXRzdWNjZWVkCi0gIFxmaQotfQotXGRlZlxpZnNldHN1Y2NlZWR7XGNvbmRpdGlvbmFsc3VjY2VlZHtpZnNldH19Ci1cZGVmXGlmc2V0ZmFpbHtcbmVzdGVkaWdub3Jle2lmc2V0fX0KLVxkZWZpbmV1bm1hdGNoZWRlbmR7aWZzZXR9Ci0KLSUgQGlmY2xlYXIgVkFSIC4uLiBAZW5kIGlmY2xlYXIgcmVhZHMgdGhlIGAuLi4nIGlmZiBWQVIgaGFzIG5ldmVyIGJlZW4KLSUgZGVmaW5lZCB3aXRoIEBzZXQsIG9yIGhhcyBiZWVuIHVuZGVmaW5lZCB3aXRoIEBjbGVhci4KLSUKLVxkZWZcaWZjbGVhcntccGFyc2VhcmdcaWZjbGVhcnh4eH0KLVxkZWZcaWZjbGVhcnh4eCAjMXslCi0gIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZVxyZWxheAotICAgIFxleHBhbmRhZnRlclxpZmNsZWFyc3VjY2VlZAotICBcZWxzZQotICAgIFxleHBhbmRhZnRlclxpZmNsZWFyZmFpbAotICBcZmkKLX0KLVxkZWZcaWZjbGVhcnN1Y2NlZWR7XGNvbmRpdGlvbmFsc3VjY2VlZHtpZmNsZWFyfX0KLVxkZWZcaWZjbGVhcmZhaWx7XG5lc3RlZGlnbm9yZXtpZmNsZWFyfX0KLVxkZWZpbmV1bm1hdGNoZWRlbmR7aWZjbGVhcn0KLQotJSBAaWZ0ZXgsIEBpZm5vdGh0bWwsIEBpZm5vdGluZm8gYWx3YXlzIHN1Y2NlZWQ7IHdlIHJlYWQgdGhlIHRleHQKLSUgZm9sbG93aW5nLCB0aHJvdWdoIHRoZSBmaXJzdCBAZW5kIGlmdGV4IChldGMuKS4gIE1ha2UgYEBlbmQgaWZ0ZXgnCi0lIChldGMuKSB2YWxpZCBvbmx5IGFmdGVyIGFuIEBpZnRleC4KLSUKLVxkZWZcaWZ0ZXh7XGNvbmRpdGlvbmFsc3VjY2VlZHtpZnRleH19Ci1cZGVmXGlmbm90aHRtbHtcY29uZGl0aW9uYWxzdWNjZWVke2lmbm90aHRtbH19Ci1cZGVmXGlmbm90aW5mb3tcY29uZGl0aW9uYWxzdWNjZWVke2lmbm90aW5mb319Ci1cZGVmaW5ldW5tYXRjaGVkZW5ke2lmdGV4fQotXGRlZmluZXVubWF0Y2hlZGVuZHtpZm5vdGh0bWx9Ci1cZGVmaW5ldW5tYXRjaGVkZW5ke2lmbm90aW5mb30KLQotJSBXZSBjYW4ndCBqdXN0IHdhbnQgdG8gc3RhcnQgYSBncm91cCBhdCBAaWZ0ZXggKGZvciBleGFtcGxlKSBhbmQgZW5kIGl0Ci0lIGF0IEBlbmQgaWZ0ZXgsIHNpbmNlIHRoZW4gQHNldCBjb21tYW5kcyBpbnNpZGUgdGhlIGNvbmRpdGlvbmFsIGhhdmUgbm8KLSUgZWZmZWN0ICh0aGV5J2QgZ2V0IHJldmVydGVkIGF0IHRoZSBlbmQgb2YgdGhlIGdyb3VwKS4gIFNvIHdlIG11c3QKLSUgZGVmaW5lIFxFaWZ0ZXggdG8gcmVkZWZpbmUgaXRzZWxmIHRvIGJlIGl0cyBwcmV2aW91cyB2YWx1ZS4gIChXZSBjYW4ndAotJSBqdXN0IGRlZmluZSBpdCB0byBmYWlsIGFnYWluIHdpdGggYW4gYGB1bm1hdGNoZWQgZW5kJycgZXJyb3IsIHNpbmNlCi0lIHRoZSBAaWZzZXQgbWlnaHQgYmUgbmVzdGVkLikKLSUKLVxkZWZcY29uZGl0aW9uYWxzdWNjZWVkIzF7JQotICBcZWRlZlx0ZW1weyUKLSAgICAlIFJlbWVtYmVyIHRoZSBjdXJyZW50IHZhbHVlIG9mIFxFIzEuCi0gICAgXGxldFxuZWNle3ByZXZFIzF9ID0gXG5lY2V7RSMxfSUKLSAgICAlCi0gICAgJSBBdCB0aGUgYEBlbmQgIzEnLCByZWRlZmluZSBcRSMxIHRvIGJlIGl0cyBwcmV2aW91cyB2YWx1ZS4KLSAgICBcZGVmXG5lY2V7RSMxfXtcbGV0XG5lY2V7RSMxfSA9IFxuZWNle3ByZXZFIzF9fSUKLSAgfSUKLSAgXHRlbXAKLX0KLQotJSBXZSBuZWVkIHRvIGV4cGFuZCBsb3RzIG9mIFxjc25hbWUncywgYnV0IHdlIGRvbid0IHdhbnQgdG8gZXhwYW5kIHRoZQotJSBjb250cm9sIHNlcXVlbmNlcyBhZnRlciB3ZSd2ZSBjb25zdHJ1Y3RlZCB0aGVtLgotJQotXGRlZlxuZWNlIzF7XGV4cGFuZGFmdGVyXG5vZXhwYW5kXGNzbmFtZSMxXGVuZGNzbmFtZX0KLQotJSBAYXNpcyBqdXN0IHlpZWxkcyBpdHMgYXJndW1lbnQuICBVc2VkIHdpdGggQHRhYmxlLCBmb3IgZXhhbXBsZS4KLSUKLVxkZWZcYXNpcyMxeyMxfQotCi0lIEBtYXRoIG1lYW5zIG91dHB1dCBpbiBtYXRoIG1vZGUuCi0lIFdlIGRvbid0IHVzZSAkJ3MgZGlyZWN0bHkgaW4gdGhlIGRlZmluaXRpb24gb2YgXG1hdGggYmVjYXVzZSBjb250cm9sCi0lIHNlcXVlbmNlcyBsaWtlIFxtYXRoIGFyZSBleHBhbmRlZCB3aGVuIHRoZSB0b2MgZmlsZSBpcyB3cml0dGVuLiAgVGhlbiwKLSUgd2UgcmVhZCB0aGUgdG9jIGZpbGUgYmFjaywgdGhlICQncyB3aWxsIGJlIG5vcm1hbCBjaGFyYWN0ZXJzIChhcyB0aGV5Ci0lIHNob3VsZCBiZSwgYWNjb3JkaW5nIHRvIHRoZSBkZWZpbml0aW9uIG9mIFRleGluZm8pLiAgU28gd2UgbXVzdCB1c2UgYQotJSBjb250cm9sIHNlcXVlbmNlIHRvIHN3aXRjaCBpbnRvIGFuZCBvdXQgb2YgbWF0aCBtb2RlLgotJQotJSBUaGlzIGlzbid0IHF1aXRlIGVub3VnaCBmb3IgQG1hdGggdG8gd29yayBwcm9wZXJseSBpbiBpbmRpY2VzLCBidXQgaXQKLSUgc2VlbXMgdW5saWtlbHkgaXQgd2lsbCBldmVyIGJlIG5lZWRlZCB0aGVyZS4KLSUKLVxsZXRcaW1wbGljaXRtYXRoID0gJAotXGRlZlxtYXRoIzF7XGltcGxpY2l0bWF0aCAjMVxpbXBsaWNpdG1hdGh9Ci0KLSUgQGJ1bGxldCBhbmQgQG1pbnVzIG5lZWQgdGhlIHNhbWUgdHJlYXRtZW50IGFzIEBtYXRoLCBqdXN0IGFib3ZlLgotXGRlZlxidWxsZXR7XGltcGxpY2l0bWF0aFxwdGV4YnVsbGV0XGltcGxpY2l0bWF0aH0KLVxkZWZcbWludXN7XGltcGxpY2l0bWF0aC1caW1wbGljaXRtYXRofQotCi0lIEByZWZpbGwgaXMgYSBuby1vcC4KLVxsZXRccmVmaWxsPVxyZWxheAotCi0lIElmIHdvcmtpbmcgb24gYSBsYXJnZSBkb2N1bWVudCBpbiBjaGFwdGVycywgaXQgaXMgY29udmVuaWVudCB0bwotJSBiZSBhYmxlIHRvIGRpc2FibGUgaW5kZXhpbmcsIGNyb3NzLXJlZmVyZW5jaW5nLCBhbmQgY29udGVudHMsIGZvciB0ZXN0IHJ1bnMuCi0lIFRoaXMgaXMgZG9uZSB3aXRoIEBub3ZhbGlkYXRlIChiZWZvcmUgQHNldGZpbGVuYW1lKS4KLSUKLVxuZXdpZlxpZmxpbmtzIFxsaW5rc3RydWUgJSBieSBkZWZhdWx0IHdlIHdhbnQgdGhlIGF1eCBmaWxlcy4KLVxsZXRcbm92YWxpZGF0ZSA9IFxsaW5rc2ZhbHNlCi0KLSUgQHNldGZpbGVuYW1lIGlzIGRvbmUgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeSB0ZXhpbmZvIGZpbGUuCi0lIFNvIG9wZW4gaGVyZSB0aGUgZmlsZXMgd2UgbmVlZCB0byBoYXZlIG9wZW4gd2hpbGUgcmVhZGluZyB0aGUgaW5wdXQuCi0lIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gbWFrZSBhIC5mbXQgZmlsZSBmb3IgdGV4aW5mby4KLVxkZWZcc2V0ZmlsZW5hbWV7JQotICAgXGlmbGlua3MgCi0gICAgIFxyZWFkYXV4ZmlsZQotICAgXGZpICUgXG9wZW5pbmRpY2VzIG5lZWRzIHRvIGRvIHNvbWUgd29yayBpbiBhbnkgY2FzZS4KLSAgIFxvcGVuaW5kaWNlcwotICAgXGZpeGJhY2tzbGFzaCAgJSBUdXJuIG9mZiBoYWNrIHRvIHN3YWxsb3cgYFxpbnB1dCB0ZXhpbmZvJy4KLSAgIFxnbG9iYWxcbGV0XHNldGZpbGVuYW1lPVxjb21tZW50ICUgSWdub3JlIGV4dHJhIEBzZXRmaWxlbmFtZSBjbWRzLgotICAgJQotICAgJSBJZiB0ZXhpbmZvLmNuZiBpcyBwcmVzZW50IG9uIHRoZSBzeXN0ZW0sIHJlYWQgaXQuCi0gICAlIFVzZWZ1bCBmb3Igc2l0ZS13aWRlIEBhZm91cnBhcGVyLCBldGMuCi0gICAlIEp1c3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZSwgY2xvc2UgdGhlIGlucHV0IHN0cmVhbSBiZWZvcmUgdGhlIFxpbnB1dC4KLSAgIFxvcGVuaW4gMSB0ZXhpbmZvLmNuZgotICAgXGlmZW9mMSBcbGV0XHRlbXA9XHJlbGF4IFxlbHNlIFxkZWZcdGVtcHtcaW5wdXQgdGV4aW5mby5jbmYgfVxmaQotICAgXGNsb3NlaW4xCi0gICBcdGVtcAotICAgJQotICAgXGNvbW1lbnQgJSBJZ25vcmUgdGhlIGFjdHVhbCBmaWxlbmFtZS4KLX0KLQotJSBDYWxsZWQgZnJvbSBcc2V0ZmlsZW5hbWUuCi0lIAotXGRlZlxvcGVuaW5kaWNlc3slCi0gIFxuZXdpbmRleHtjcH0lCi0gIFxuZXdjb2RlaW5kZXh7Zm59JQotICBcbmV3Y29kZWluZGV4e3ZyfSUKLSAgXG5ld2NvZGVpbmRleHt0cH0lCi0gIFxuZXdjb2RlaW5kZXh7a3l9JQotICBcbmV3Y29kZWluZGV4e3BnfSUKLX0KLQotJSBAYnllLgotXG91dGVyXGRlZlxieWV7XHBhZ2VhbGlnbm1hY3JvXHRyYWNpbmdzdGF0cz0xXHB0ZXhlbmR9Ci0KLQotXG1lc3NhZ2V7Zm9udHMsfQotJSBGb250LWNoYW5nZSBjb21tYW5kcy4KLQotJSBUZXhpbmZvIHNvcnQgb2Ygc3VwcG9ydHMgdGhlIHNhbnMgc2VyaWYgZm9udCBzdHlsZSwgd2hpY2ggcGxhaW4gVGVYIGRvZXMgbm90LgotJSBTbyB3ZSBzZXQgdXAgYSBcc2YgYW5hbG9nb3VzIHRvIHBsYWluJ3MgXHJtLCBldGMuCi1cbmV3ZmFtXHNmZmFtCi1cZGVmXHNme1xmYW09XHNmZmFtIFx0ZW5zZn0KLVxsZXRcbGkgPSBcc2YgJSBTb21ldGltZXMgd2UgY2FsbCBpdCBcbGksIG5vdCBcc2YuCi0KLSUgV2UgZG9uJ3QgbmVlZCBtYXRoIGZvciB0aGlzIG9uZS4KLVxkZWZcdHRzbHtcdGVudHRzbH0KLQotJSBVc2UgQ29tcHV0ZXIgTW9kZXJuIGZvbnRzIGF0IFxtYWdzdGVwaGFsZiAoMTFwdCkuCi1cbmV3Y291bnRcbWFpbm1hZ3N0ZXAKLVxtYWlubWFnc3RlcD1cbWFnc3RlcGhhbGYKLQotJSBTZXQgdGhlIGZvbnQgbWFjcm8gIzEgdG8gdGhlIGZvbnQgbmFtZWQgIzIsIGFkZGluZyBvbiB0aGUKLSUgc3BlY2lmaWVkIGZvbnQgcHJlZml4IChub3JtYWxseSBgY20nKS4KLSUgIzMgaXMgdGhlIGZvbnQncyBkZXNpZ24gc2l6ZSwgIzQgaXMgYSBzY2FsZSBmYWN0b3IKLVxkZWZcc2V0Zm9udCMxIzIjMyM0e1xmb250IzE9XGZvbnRwcmVmaXgjMiMzIHNjYWxlZCAjNH0KLQotJSBVc2UgY20gYXMgdGhlIGRlZmF1bHQgZm9udCBwcmVmaXguCi0lIFRvIHNwZWNpZnkgdGhlIGZvbnQgcHJlZml4LCB5b3UgbXVzdCBkZWZpbmUgXGZvbnRwcmVmaXgKLSUgYmVmb3JlIHlvdSByZWFkIGluIHRleGluZm8udGV4LgotXGlmeFxmb250cHJlZml4XHVuZGVmaW5lZAotXGRlZlxmb250cHJlZml4e2NtfQotXGZpCi0lIFN1cHBvcnQgZm9udCBmYW1pbGllcyB0aGF0IGRvbid0IHVzZSB0aGUgc2FtZSBuYW1pbmcgc2NoZW1lIGFzIENNLgotXGRlZlxybXNoYXBle3J9Ci1cZGVmXHJtYnNoYXBle2J4fSAgICAgICAgICAgICAgICV3aGVyZSB0aGUgbm9ybWFsIGZhY2UgaXMgYm9sZAotXGRlZlxiZnNoYXBle2J9Ci1cZGVmXGJ4c2hhcGV7Ynh9Ci1cZGVmXHR0c2hhcGV7dHR9Ci1cZGVmXHR0YnNoYXBle3R0fQotXGRlZlx0dHNsc2hhcGV7c2x0dH0KLVxkZWZcaXRzaGFwZXt0aX0KLVxkZWZcaXRic2hhcGV7Ynh0aX0KLVxkZWZcc2xzaGFwZXtzbH0KLVxkZWZcc2xic2hhcGV7YnhzbH0KLVxkZWZcc2ZzaGFwZXtzc30KLVxkZWZcc2Zic2hhcGV7c3N9Ci1cZGVmXHNjc2hhcGV7Y3NjfQotXGRlZlxzY2JzaGFwZXtjc2N9Ci0KLVxpZnhcYmlnZ2VyXHJlbGF4Ci1cbGV0XG1haW5tYWdzdGVwPVxtYWdzdGVwMQotXHNldGZvbnRcdGV4dHJtXHJtc2hhcGV7MTJ9ezEwMDB9Ci1cc2V0Zm9udFx0ZXh0dHRcdHRzaGFwZXsxMn17MTAwMH0KLVxlbHNlCi1cc2V0Zm9udFx0ZXh0cm1ccm1zaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dHR0XHR0c2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxmaQotJSBJbnN0ZWFkIG9mIGNtYjEwLCB5b3UgbWFueSB3YW50IHRvIHVzZSBjbWJ4MTAuCi0lIGNtYngxMCBpcyBhIHByZXR0aWVyIGZvbnQgb24gaXRzIG93biwgYnV0IGNtYjEwCi0lIGxvb2tzIGJldHRlciB3aGVuIGVtYmVkZGVkIGluIGEgbGluZSB3aXRoIGNtcjEwLgotXHNldGZvbnRcdGV4dGJmXGJmc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHRpdFxpdHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0c2xcc2xzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dHNmXHNmc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHRzY1xzY3NoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0dHRzbFx0dHNsc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxmb250XHRleHRpPWNtbWkxMCBzY2FsZWQgXG1haW5tYWdzdGVwCi1cZm9udFx0ZXh0c3k9Y21zeTEwIHNjYWxlZCBcbWFpbm1hZ3N0ZXAKLQotJSBBIGZldyBmb250cyBmb3IgQGRlZnVuLCBldGMuCi1cc2V0Zm9udFxkZWZiZlxieHNoYXBlezEwfXtcbWFnc3RlcDF9ICV3YXMgMTMxNAotXHNldGZvbnRcZGVmdHRcdHRzaGFwZXsxMH17XG1hZ3N0ZXAxfQotXGRlZlxkZntcbGV0XHRlbnR0PVxkZWZ0dCBcbGV0XHRlbmJmID0gXGRlZmJmIFxiZn0KLQotJSBGb250cyBmb3IgaW5kaWNlcyBhbmQgc21hbGwgZXhhbXBsZXMgKDlwdCkuCi0lIFdlIGFjdHVhbGx5IHVzZSB0aGUgc2xhbnRlZCBmb250IHJhdGhlciB0aGFuIHRoZSBpdGFsaWMsCi0lIGJlY2F1c2UgdGV4aW5mbyBub3JtYWxseSB1c2VzIHRoZSBzbGFudGVkIGZvbnRzIGZvciB0aGF0LgotJSBEbyBub3QgbWFrZSBtYW55IGZvbnQgZGlzdGluY3Rpb25zIGluIGdlbmVyYWwgaW4gdGhlIGluZGV4LCBzaW5jZSB0aGV5Ci0lIGFyZW4ndCB2ZXJ5IHVzZWZ1bC4KLVxzZXRmb250XG5pbmV0dFx0dHNoYXBlezl9ezEwMDB9Ci1cc2V0Zm9udFxuaW5ldHRzbFx0dHNsc2hhcGV7MTB9ezkwMH0KLVxzZXRmb250XGluZHJtXHJtc2hhcGV7OX17MTAwMH0KLVxzZXRmb250XGluZGl0XGl0c2hhcGV7OX17MTAwMH0KLVxzZXRmb250XGluZHNsXHNsc2hhcGV7OX17MTAwMH0KLVxsZXRcaW5kdHQ9XG5pbmV0dAotXGxldFxpbmR0dHNsPVxuaW5ldHRzbAotXGxldFxpbmRzZj1caW5kcm0KLVxsZXRcaW5kYmY9XGluZHJtCi1cc2V0Zm9udFxpbmRzY1xzY3NoYXBlezEwfXs5MDB9Ci1cZm9udFxpbmRpPWNtbWk5Ci1cZm9udFxpbmRzeT1jbXN5OQotCi0lIEZvbnRzIGZvciB0aXRsZSBwYWdlOgotXHNldGZvbnRcdGl0bGVybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAzfQotXHNldGZvbnRcdGl0bGVpdFxpdGJzaGFwZXsxMH17XG1hZ3N0ZXA0fQotXHNldGZvbnRcdGl0bGVzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXA0fQotXHNldGZvbnRcdGl0bGV0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXAzfQotXHNldGZvbnRcdGl0bGV0dHNsXHR0c2xzaGFwZXsxMH17XG1hZ3N0ZXA0fQotXHNldGZvbnRcdGl0bGVzZlxzZmJzaGFwZXsxN317XG1hZ3N0ZXAxfQotXGxldFx0aXRsZWJmPVx0aXRsZXJtCi1cc2V0Zm9udFx0aXRsZXNjXHNjYnNoYXBlezEwfXtcbWFnc3RlcDR9Ci1cZm9udFx0aXRsZWk9Y21taTEyIHNjYWxlZCBcbWFnc3RlcDMKLVxmb250XHRpdGxlc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDQKLVxkZWZcYXV0aG9ycm17XHNlY3JtfQotCi0lIENoYXB0ZXIgKGFuZCB1bm51bWJlcmVkKSBmb250cyAoMTcuMjhwdCkuCi1cc2V0Zm9udFxjaGFwcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwMn0KLVxzZXRmb250XGNoYXBpdFxpdGJzaGFwZXsxMH17XG1hZ3N0ZXAzfQotXHNldGZvbnRcY2hhcHNsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDN9Ci1cc2V0Zm9udFxjaGFwdHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwMn0KLVxzZXRmb250XGNoYXB0dHNsXHR0c2xzaGFwZXsxMH17XG1hZ3N0ZXAzfQotXHNldGZvbnRcY2hhcHNmXHNmYnNoYXBlezE3fXsxMDAwfQotXGxldFxjaGFwYmY9XGNoYXBybQotXHNldGZvbnRcY2hhcHNjXHNjYnNoYXBlezEwfXtcbWFnc3RlcDN9Ci1cZm9udFxjaGFwaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMgotXGZvbnRcY2hhcHN5PWNtc3kxMCBzY2FsZWQgXG1hZ3N0ZXAzCi0KLSUgU2VjdGlvbiBmb250cyAoMTQuNHB0KS4KLVxzZXRmb250XHNlY3JtXHJtYnNoYXBlezEyfXtcbWFnc3RlcDF9Ci1cc2V0Zm9udFxzZWNpdFxpdGJzaGFwZXsxMH17XG1hZ3N0ZXAyfQotXHNldGZvbnRcc2Vjc2xcc2xic2hhcGV7MTB9e1xtYWdzdGVwMn0KLVxzZXRmb250XHNlY3R0XHR0YnNoYXBlezEyfXtcbWFnc3RlcDF9Ci1cc2V0Zm9udFxzZWN0dHNsXHR0c2xzaGFwZXsxMH17XG1hZ3N0ZXAyfQotXHNldGZvbnRcc2Vjc2Zcc2Zic2hhcGV7MTJ9e1xtYWdzdGVwMX0KLVxsZXRcc2VjYmZcc2Vjcm0KLVxzZXRmb250XHNlY3NjXHNjYnNoYXBlezEwfXtcbWFnc3RlcDJ9Ci1cZm9udFxzZWNpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXAxCi1cZm9udFxzZWNzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwMgotCi0lIFxzZXRmb250XHNzZWNybVxieHNoYXBlezEwfXtcbWFnc3RlcDF9ICAgICUgVGhpcyBzaXplIGFuIGZvbnQgbG9va2VkIGJhZC4KLSUgXHNldGZvbnRcc3NlY2l0XGl0c2hhcGV7MTB9e1xtYWdzdGVwMX0gICAgJSBUaGUgbGV0dGVycyB3ZXJlIHRvbyBjcm93ZGVkLgotJSBcc2V0Zm9udFxzc2Vjc2xcc2xzaGFwZXsxMH17XG1hZ3N0ZXAxfQotJSBcc2V0Zm9udFxzc2VjdHRcdHRzaGFwZXsxMH17XG1hZ3N0ZXAxfQotJSBcc2V0Zm9udFxzc2Vjc2Zcc2ZzaGFwZXsxMH17XG1hZ3N0ZXAxfQotCi0lXHNldGZvbnRcc3NlY3JtXGJmc2hhcGV7MTB9ezEzMTV9ICAgICAgJSBOb3RlIHRoZSB1c2Ugb2YgY21iIHJhdGhlciB0aGFuIGNtYnguCi0lXHNldGZvbnRcc3NlY2l0XGl0c2hhcGV7MTB9ezEzMTV9ICAgICAgJSBBbHNvLCB0aGUgc2l6ZSBpcyBhIGxpdHRsZSBsYXJnZXIgdGhhbgotJVxzZXRmb250XHNzZWNzbFxzbHNoYXBlezEwfXsxMzE1fSAgICAgICUgYmVpbmcgc2NhbGVkIG1hZ3N0ZXAxLgotJVxzZXRmb250XHNzZWN0dFx0dHNoYXBlezEwfXsxMzE1fQotJVxzZXRmb250XHNzZWNzZlxzZnNoYXBlezEwfXsxMzE1fQotCi0lXGxldFxzc2VjYmY9XHNzZWNybQotCi0lIFN1YnNlY3Rpb24gZm9udHMgKDEzLjE1cHQpLgotXHNldGZvbnRcc3NlY3JtXHJtYnNoYXBlezEyfXtcbWFnc3RlcGhhbGZ9Ci1cc2V0Zm9udFxzc2VjaXRcaXRic2hhcGV7MTB9ezEzMTV9Ci1cc2V0Zm9udFxzc2Vjc2xcc2xic2hhcGV7MTB9ezEzMTV9Ci1cc2V0Zm9udFxzc2VjdHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwaGFsZn0KLVxzZXRmb250XHNzZWN0dHNsXHR0c2xzaGFwZXsxMH17MTMxNX0KLVxzZXRmb250XHNzZWNzZlxzZmJzaGFwZXsxMn17XG1hZ3N0ZXBoYWxmfQotXGxldFxzc2VjYmZcc3NlY3JtCi1cc2V0Zm9udFxzc2Vjc2Ncc2Nic2hhcGV7MTB9e1xtYWdzdGVwMX0KLVxmb250XHNzZWNpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXBoYWxmCi1cZm9udFxzc2Vjc3k9Y21zeTEwIHNjYWxlZCAxMzE1Ci0lIFRoZSBzbWFsbGNhcHMgYW5kIHN5bWJvbCBmb250cyBzaG91bGQgYWN0dWFsbHkgYmUgc2NhbGVkIFxtYWdzdGVwMS41LAotJSBidXQgdGhhdCBpcyBub3QgYSBzdGFuZGFyZCBtYWduaWZpY2F0aW9uLgotCi0lIEluIG9yZGVyIGZvciB0aGUgZm9udCBjaGFuZ2VzIHRvIGFmZmVjdCBtb3N0IG1hdGggc3ltYm9scyBhbmQgbGV0dGVycywKLSUgd2UgaGF2ZSB0byBkZWZpbmUgdGhlIFx0ZXh0Zm9udCBvZiB0aGUgc3RhbmRhcmQgZmFtaWxpZXMuICBTaW5jZQotJSB0ZXhpbmZvIGRvZXNuJ3QgYWxsb3cgZm9yIHByb2R1Y2luZyBzdWJzY3JpcHRzIGFuZCBzdXBlcnNjcmlwdHMsIHdlCi0lIGRvbid0IGJvdGhlciB0byByZXNldCBcc2NyaXB0Zm9udCBhbmQgXHNjcmlwdHNjcmlwdGZvbnQgKHdoaWNoIHdvdWxkCi0lIGFsc28gcmVxdWlyZSBsb2FkaW5nIGEgbG90IG1vcmUgZm9udHMpLgotJQotXGRlZlxyZXNldG1hdGhmb250c3slCi0gIFx0ZXh0Zm9udDAgPSBcdGVucm0gXHRleHRmb250MSA9IFx0ZW5pIFx0ZXh0Zm9udDIgPSBcdGVuc3kKLSAgXHRleHRmb250XGl0ZmFtID0gXHRlbml0IFx0ZXh0Zm9udFxzbGZhbSA9IFx0ZW5zbCBcdGV4dGZvbnRcYmZmYW0gPSBcdGVuYmYKLSAgXHRleHRmb250XHR0ZmFtID0gXHRlbnR0IFx0ZXh0Zm9udFxzZmZhbSA9IFx0ZW5zZgotfQotCi0KLSUgVGhlIGZvbnQtY2hhbmdpbmcgY29tbWFuZHMgcmVkZWZpbmUgdGhlIG1lYW5pbmdzIG9mIFx0ZW5TVFlMRSwgaW5zdGVhZAotJSBvZiBqdXN0IFxTVFlMRS4gIFdlIGRvIHRoaXMgc28gdGhhdCBmb250IGNoYW5nZXMgd2lsbCBjb250aW51ZSB0byB3b3JrCi0lIGluIG1hdGggbW9kZSwgd2hlcmUgaXQgaXMgdGhlIGN1cnJlbnQgXGZhbSB0aGF0IGlzIHJlbGV2YW50IGluIG1vc3QKLSUgY2FzZXMsIG5vdCB0aGUgY3VycmVudCBmb250LiAgUGxhaW4gVGVYIGRvZXMgXGRlZlxiZntcZmFtPVxiZmZhbQotJSBcdGVuYmZ9LCBmb3IgZXhhbXBsZS4gIEJ5IHJlZGVmaW5pbmcgXHRlbmJmLCB3ZSBvYnZpYXRlIHRoZSBuZWVkIHRvCi0lIHJlZGVmaW5lIFxiZiBpdHNlbGYuCi1cZGVmXHRleHRmb250c3slCi0gIFxsZXRcdGVucm09XHRleHRybSBcbGV0XHRlbml0PVx0ZXh0aXQgXGxldFx0ZW5zbD1cdGV4dHNsCi0gIFxsZXRcdGVuYmY9XHRleHRiZiBcbGV0XHRlbnR0PVx0ZXh0dHQgXGxldFxzbWFsbGNhcHM9XHRleHRzYwotICBcbGV0XHRlbnNmPVx0ZXh0c2YgXGxldFx0ZW5pPVx0ZXh0aSBcbGV0XHRlbnN5PVx0ZXh0c3kgXGxldFx0ZW50dHNsPVx0ZXh0dHRzbAotICBccmVzZXRtYXRoZm9udHN9Ci1cZGVmXHRpdGxlZm9udHN7JQotICBcbGV0XHRlbnJtPVx0aXRsZXJtIFxsZXRcdGVuaXQ9XHRpdGxlaXQgXGxldFx0ZW5zbD1cdGl0bGVzbAotICBcbGV0XHRlbmJmPVx0aXRsZWJmIFxsZXRcdGVudHQ9XHRpdGxldHQgXGxldFxzbWFsbGNhcHM9XHRpdGxlc2MKLSAgXGxldFx0ZW5zZj1cdGl0bGVzZiBcbGV0XHRlbmk9XHRpdGxlaSBcbGV0XHRlbnN5PVx0aXRsZXN5Ci0gIFxsZXRcdGVudHRzbD1cdGl0bGV0dHNsCi0gIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3syNXB0fX0KLVxkZWZcdGl0bGVmb250IzF7e1x0aXRsZWZvbnRzXHJtICMxfX0KLVxkZWZcY2hhcGZvbnRzeyUKLSAgXGxldFx0ZW5ybT1cY2hhcHJtIFxsZXRcdGVuaXQ9XGNoYXBpdCBcbGV0XHRlbnNsPVxjaGFwc2wKLSAgXGxldFx0ZW5iZj1cY2hhcGJmIFxsZXRcdGVudHQ9XGNoYXB0dCBcbGV0XHNtYWxsY2Fwcz1cY2hhcHNjCi0gIFxsZXRcdGVuc2Y9XGNoYXBzZiBcbGV0XHRlbmk9XGNoYXBpIFxsZXRcdGVuc3k9XGNoYXBzeSBcbGV0XHRlbnR0c2w9XGNoYXB0dHNsCi0gIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxOXB0fX0KLVxkZWZcc2VjZm9udHN7JQotICBcbGV0XHRlbnJtPVxzZWNybSBcbGV0XHRlbml0PVxzZWNpdCBcbGV0XHRlbnNsPVxzZWNzbAotICBcbGV0XHRlbmJmPVxzZWNiZiBcbGV0XHRlbnR0PVxzZWN0dCBcbGV0XHNtYWxsY2Fwcz1cc2Vjc2MKLSAgXGxldFx0ZW5zZj1cc2Vjc2YgXGxldFx0ZW5pPVxzZWNpIFxsZXRcdGVuc3k9XHNlY3N5IFxsZXRcdGVudHRzbD1cc2VjdHRzbAotICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTZwdH19Ci1cZGVmXHN1YnNlY2ZvbnRzeyUKLSAgXGxldFx0ZW5ybT1cc3NlY3JtIFxsZXRcdGVuaXQ9XHNzZWNpdCBcbGV0XHRlbnNsPVxzc2Vjc2wKLSAgXGxldFx0ZW5iZj1cc3NlY2JmIFxsZXRcdGVudHQ9XHNzZWN0dCBcbGV0XHNtYWxsY2Fwcz1cc3NlY3NjCi0gIFxsZXRcdGVuc2Y9XHNzZWNzZiBcbGV0XHRlbmk9XHNzZWNpIFxsZXRcdGVuc3k9XHNzZWNzeSBcbGV0XHRlbnR0c2w9XHNzZWN0dHNsCi0gIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxNXB0fX0KLVxsZXRcc3Vic3Vic2VjZm9udHMgPSBcc3Vic2VjZm9udHMgJSBNYXliZSBtYWtlIHNzc2VjIGZvbnRzIHNjYWxlZCBtYWdzdGVwaGFsZj8KLVxkZWZcaW5kZXhmb250c3slCi0gIFxsZXRcdGVucm09XGluZHJtIFxsZXRcdGVuaXQ9XGluZGl0IFxsZXRcdGVuc2w9XGluZHNsCi0gIFxsZXRcdGVuYmY9XGluZGJmIFxsZXRcdGVudHQ9XGluZHR0IFxsZXRcc21hbGxjYXBzPVxpbmRzYwotICBcbGV0XHRlbnNmPVxpbmRzZiBcbGV0XHRlbmk9XGluZGkgXGxldFx0ZW5zeT1caW5kc3kgXGxldFx0ZW50dHNsPVxpbmR0dHNsCi0gIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxMnB0fX0KLQotJSBTZXQgdXAgdGhlIGRlZmF1bHQgZm9udHMsIHNvIHdlIGNhbiB1c2UgdGhlbSBmb3IgY3JlYXRpbmcgYm94ZXMuCi0lCi1cdGV4dGZvbnRzCi0KLSUgRGVmaW5lIHRoZXNlIHNvIHRoZXkgY2FuIGJlIGVhc2lseSBjaGFuZ2VkIGZvciBvdGhlciBmb250cy4KLVxkZWZcYW5nbGVsZWZ0eyRcbGFuZ2xlJH0KLVxkZWZcYW5nbGVyaWdodHskXHJhbmdsZSR9Ci0KLSUgQ291bnQgZGVwdGggaW4gZm9udC1jaGFuZ2VzLCBmb3IgZXJyb3IgY2hlY2tzCi1cbmV3Y291bnRcZm9udGRlcHRoIFxmb250ZGVwdGg9MAotCi0lIEZvbnRzIGZvciBzaG9ydCB0YWJsZSBvZiBjb250ZW50cy4KLVxzZXRmb250XHNob3J0Y29udHJtXHJtc2hhcGV7MTJ9ezEwMDB9Ci1cc2V0Zm9udFxzaG9ydGNvbnRiZlxieHNoYXBlezEyfXsxMDAwfQotXHNldGZvbnRcc2hvcnRjb250c2xcc2xzaGFwZXsxMn17MTAwMH0KLQotJSUgQWRkIHNjcmliZS1saWtlIGZvbnQgZW52aXJvbm1lbnRzLCBwbHVzIEBsIGZvciBpbmxpbmUgbGlzcCAodXN1YWxseSBzYW5zCi0lJSBzZXJpZikgYW5kIEBpaSBmb3IgVGVYIGl0YWxpYwotCi0lIFxzbWFydGl0YWxpY3tBUkd9IG91dHB1dHMgYXJnIGluIGl0YWxpY3MsIGZvbGxvd2VkIGJ5IGFuIGl0YWxpYyBjb3JyZWN0aW9uCi0lIHVubGVzcyB0aGUgZm9sbG93aW5nIGNoYXJhY3RlciBpcyBzdWNoIGFzIG5vdCB0byBuZWVkIG9uZS4KLVxkZWZcc21hcnRpdGFsaWN4e1xpZnhcbmV4dCxcZWxzZVxpZnhcbmV4dC1cZWxzZVxpZnhcbmV4dC5cZWxzZVwvXGZpXGZpXGZpfQotXGRlZlxzbWFydHNsYW50ZWQjMXt7XHNsICMxfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY3h9Ci1cZGVmXHNtYXJ0aXRhbGljIzF7e1xpdCAjMX1cZnV0dXJlbGV0XG5leHRcc21hcnRpdGFsaWN4fQotCi1cbGV0XGk9XHNtYXJ0aXRhbGljCi1cbGV0XHZhcj1cc21hcnRzbGFudGVkCi1cbGV0XGRmbj1cc21hcnRzbGFudGVkCi1cbGV0XGVtcGg9XHNtYXJ0aXRhbGljCi1cbGV0XGNpdGU9XHNtYXJ0c2xhbnRlZAotCi1cZGVmXGIjMXt7XGJmICMxfX0KLVxsZXRcc3Ryb25nPVxiCi0KLSUgV2UgY2FuJ3QganVzdCB1c2UgXGV4aHlwaGVucGVuYWx0eSwgYmVjYXVzZSB0aGF0IG9ubHkgaGFzIGVmZmVjdCBhdAotJSB0aGUgZW5kIG9mIGEgcGFyYWdyYXBoLiAgUmVzdG9yZSBub3JtYWwgaHlwaGVuYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUKLSUgZ3JvdXAgd2l0aGluIHdoaWNoIFxub2h5cGhlbmF0aW9uIGlzIHByZXN1bWFibHkgY2FsbGVkLgotJQotXGRlZlxub2h5cGhlbmF0aW9ue1xoeXBoZW5jaGFyXGZvbnQgPSAtMSAgXGFmdGVyZ3JvdXBccmVzdG9yZWh5cGhlbmF0aW9ufQotXGRlZlxyZXN0b3JlaHlwaGVuYXRpb257XGh5cGhlbmNoYXJcZm9udCA9IGAtIH0KLQotXGRlZlx0IzF7JQotICB7XHR0IFxyYXdiYWNrc2xhc2ggXGZyZW5jaHNwYWNpbmcgIzF9JQotICBcbnVsbAotfQotXGxldFx0dGZvbnQ9XHQKLVxkZWZcc2FtcCMxe2BcdGNsb3NleyMxfSdcbnVsbH0KLVxzZXRmb250XHNtYWxscm1ccm1zaGFwZXs4fXsxMDAwfQotXGZvbnRcc21hbGxzeT1jbXN5OQotXGRlZlxrZXkjMXt7XHNtYWxscm1cdGV4dGZvbnQyPVxzbWFsbHN5IFxsZWF2ZXZtb2RlXGhib3h7JQotICBccmFpc2UwLjRwdFxoYm94e1xhbmdsZWxlZnR9XGtlcm4tLjA4ZW1cdnRvcHslCi0gICAgXHZib3h7XGhydWxlXGtlcm4tMC40cHQKLSAgICAgXGhib3h7XHJhaXNlMC40cHRcaGJveHtcdnBoYW50b217XGFuZ2xlbGVmdH19IzF9fSUKLSAgICBca2Vybi0wLjRwdFxocnVsZX0lCi0gIFxrZXJuLS4wNmVtXHJhaXNlMC40cHRcaGJveHtcYW5nbGVyaWdodH19fX0KLSUgVGhlIG9sZCBkZWZpbml0aW9uLCB3aXRoIG5vIGxvemVuZ2U6Ci0lXGRlZlxrZXkgIzF7e1x0dHNsIFxub2h5cGhlbmF0aW9uIFx1cHBlcmNhc2V7IzF9fVxudWxsfQotXGRlZlxjdHJsICMxe3tcdHQgXHJhd2JhY2tzbGFzaCBcaGF0fSMxfQotCi0lIEBmaWxlLCBAb3B0aW9uIGFyZSB0aGUgc2FtZSBhcyBAc2FtcC4KLVxsZXRcZmlsZT1cc2FtcAotXGxldFxvcHRpb249XHNhbXAKLQotJSBAY29kZSBpcyBhIG1vZGlmaWNhdGlvbiBvZiBAdCwKLSUgd2hpY2ggbWFrZXMgc3BhY2VzIHRoZSBzYW1lIHNpemUgYXMgbm9ybWFsIGluIHRoZSBzdXJyb3VuZGluZyB0ZXh0LgotXGRlZlx0Y2xvc2UjMXslCi0gIHslCi0gICAgJSBDaGFuZ2Ugbm9ybWFsIGludGVyd29yZCBzcGFjZSB0byBiZSBzYW1lIGFzIGZvciB0aGUgY3VycmVudCBmb250LgotICAgIFxzcGFjZXNraXAgPSBcZm9udGRpbWVuMlxmb250Ci0gICAgJQotICAgICUgU3dpdGNoIHRvIHR5cGV3cml0ZXIuCi0gICAgXHR0Ci0gICAgJQotICAgICUgQnV0IGBcICcgcHJvZHVjZXMgdGhlIGxhcmdlIHR5cGV3cml0ZXIgaW50ZXJ3b3JkIHNwYWNlLgotICAgIFxkZWZcIHt7XHNwYWNlc2tpcCA9IDBwdHt9IH19JQotICAgICUKLSAgICAlIFR1cm4gb2ZmIGh5cGhlbmF0aW9uLgotICAgIFxub2h5cGhlbmF0aW9uCi0gICAgJQotICAgIFxyYXdiYWNrc2xhc2gKLSAgICBcZnJlbmNoc3BhY2luZwotICAgICMxJQotICB9JQotICBcbnVsbAotfQotCi0lIFdlICptdXN0KiB0dXJuIG9uIGh5cGhlbmF0aW9uIGF0IGAtJyBhbmQgYF8nIGluIFxjb2RlLgotJSBPdGhlcndpc2UsIGl0IGlzIHRvbyBoYXJkIHRvIGF2b2lkIG92ZXJmdWxsIGhib3hlcwotJSBpbiB0aGUgRW1hY3MgbWFudWFsLCB0aGUgTGlicmFyeSBtYW51YWwsIGV0Yy4KLQotJSBVbmZvcnR1bmF0ZWx5LCBUZVggdXNlcyBvbmUgcGFyYW1ldGVyIChcaHlwaGVuY2hhcikgdG8gY29udHJvbAotJSBib3RoIGh5cGhlbmF0aW9uIGF0IC0gYW5kIGh5cGhlbmF0aW9uIHdpdGhpbiB3b3Jkcy4KLSUgV2UgbXVzdCB0aGVyZWZvcmUgdHVybiB0aGVtIGJvdGggb2ZmIChcdGNsb3NlIGRvZXMgdGhhdCkKLSUgYW5kIGFycmFuZ2UgZXhwbGljaXRseSB0byBoeXBoZW5hdGUgYXQgYSBkYXNoLgotJSAgLS0gcm1zLgotewotICBcY2F0Y29kZWBcLT1cYWN0aXZlCi0gIFxjYXRjb2RlYFxfPVxhY3RpdmUKLSAgJQotICBcZ2xvYmFsXGRlZlxjb2Rle1xiZWdpbmdyb3VwCi0gICAgXGNhdGNvZGVgXC09XGFjdGl2ZSBcbGV0LVxjb2RlZGFzaAotICAgIFxjYXRjb2RlYFxfPVxhY3RpdmUgXGxldF9cY29kZXVuZGVyCi0gICAgXGNvZGV4Ci0gIH0KLSAgJQotICAlIElmIHdlIGVuZCB1cCB3aXRoIGFueSBhY3RpdmUgLSBjaGFyYWN0ZXJzIHdoZW4gaGFuZGxpbmcgdGhlIGluZGV4LAotICAlIGp1c3QgdHJlYXQgdGhlbSBhcyBhIG5vcm1hbCAtLgotICBcZ2xvYmFsXGRlZlxpbmRleGJyZWFrc3tcY2F0Y29kZWBcLT1cYWN0aXZlIFxsZXQtXHJlYWxkYXNofQotfQotCi1cZGVmXHJlYWxkYXNoey19Ci1cZGVmXGNvZGVkYXNoey1cZGlzY3JldGlvbmFyeXt9e317fX0KLVxkZWZcY29kZXVuZGVye1xpZnVzaW5ndHR7XG5vcm1hbHVuZGVyc2NvcmVcZGlzY3JldGlvbmFyeXt9e317fX17XF99fQotXGRlZlxjb2RleCAjMXtcdGNsb3NleyMxfVxlbmRncm91cH0KLQotJVxsZXRcZXhwPVx0Y2xvc2UgICVXYXMgdGVtcG9yYXJ5Ci0KLSUgQGtiZCBpcyBsaWtlIEBjb2RlLCBleGNlcHQgdGhhdCBpZiB0aGUgYXJndW1lbnQgaXMganVzdCBvbmUgQGtleSBjb21tYW5kLAotJSB0aGVuIEBrYmQgaGFzIG5vIGVmZmVjdC4KLQotJSBAa2JkaW5wdXRzdHlsZSAtLSBhcmcgaXMgYGRpc3RpbmN0JyAoQGtiZCB1c2VzIHNsYW50ZWQgdHR5IGZvbnQgYWx3YXlzKSwKLSUgICBgZXhhbXBsZScgKEBrYmQgdXNlcyB0dHNsIG9ubHkgaW5zaWRlIG9mIEBleGFtcGxlIGFuZCBmcmllbmRzKSwKLSUgICBvciBgY29kZScgKEBrYmQgdXNlcyBub3JtYWwgdHR5IGZvbnQgYWx3YXlzKS4KLVxkZWZca2JkaW5wdXRzdHlsZXtccGFyc2Vhcmdca2JkaW5wdXRzdHlsZXh4eH0KLVxkZWZca2JkaW5wdXRzdHlsZXh4eCMxeyUKLSAgXGRlZlxhcmd7IzF9JQotICBcaWZ4XGFyZ1x3b3JkZGlzdGluY3QKLSAgICBcZ2RlZlxrYmRleGFtcGxlZm9udHtcdHRzbH1cZ2RlZlxrYmRmb250e1x0dHNsfSUKLSAgXGVsc2VcaWZ4XGFyZ1x3b3JkZXhhbXBsZQotICAgIFxnZGVmXGtiZGV4YW1wbGVmb250e1x0dHNsfVxnZGVmXGtiZGZvbnR7XHR0fSUKLSAgXGVsc2VcaWZ4XGFyZ1x3b3JkY29kZQotICAgIFxnZGVmXGtiZGV4YW1wbGVmb250e1x0dH1cZ2RlZlxrYmRmb250e1x0dH0lCi0gIFxmaVxmaVxmaQotfQotXGRlZlx3b3JkZGlzdGluY3R7ZGlzdGluY3R9Ci1cZGVmXHdvcmRleGFtcGxle2V4YW1wbGV9Ci1cZGVmXHdvcmRjb2Rle2NvZGV9Ci0KLSUgRGVmYXVsdCBpcyBrYmRpbnB1dGRpc3RpbmN0LiAgKFRvbyBtdWNoIG9mIGEgaGFzc2xlIHRvIGNhbGwgdGhlIG1hY3JvLAotJSB0aGUgY2F0Y29kZXMgYXJlIHdyb25nIGZvciBwYXJzZWFyZyB0byB3b3JrLikKLVxnZGVmXGtiZGV4YW1wbGVmb250e1x0dHNsfVxnZGVmXGtiZGZvbnR7XHR0c2x9Ci0KLVxkZWZceGtleXtca2V5fQotXGRlZlxrYmRmb28jMSMyIzNccGFye1xkZWZcb25leyMxfVxkZWZcdGhyZWV7IzN9XGRlZlx0aHJlZXh7Pz99JQotXGlmeFxvbmVceGtleVxpZnhcdGhyZWV4XHRocmVlIFxrZXl7IzJ9JQotXGVsc2V7XHRjbG9zZXtca2JkZm9udFxsb29rfX1cZmkKLVxlbHNle1x0Y2xvc2V7XGtiZGZvbnRcbG9va319XGZpfQotCi0lIEZvciBAdXJsLCBAZW52LCBAY29tbWFuZCBxdW90ZXMgc2VlbSB1bm5lY2Vzc2FyeSwgc28gdXNlIFxjb2RlLgotXGxldFx1cmw9XGNvZGUKLVxsZXRcZW52PVxjb2RlCi1cbGV0XGNvbW1hbmQ9XGNvZGUKLQotJSBAdXJlZiAoYWJicmV2aWF0aW9uIGZvciBgdXJscmVmJykgdGFrZXMgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50Ci0lIHNwZWNpZnlpbmcgdGhlIHRleHQgdG8gZGlzcGxheS4gIEZpcnN0IChtYW5kYXRvcnkpIGFyZyBpcyB0aGUgdXJsLgotJSBQZXJoYXBzIGV2ZW50dWFsbHkgcHV0IGluIGEgaHlwZXJ0ZXggXHNwZWNpYWwgaGVyZS4KLSUgCi1cZGVmXHVyZWYjMXtcdXJlZnh4eCAjMSwsXGZpbmlzaH0KLVxkZWZcdXJlZnh4eCMxLCMyLCMzXGZpbmlzaHslCi0gIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjMn0lCi0gIFxpZmRpbVx3ZDAgPiAwcHQKLSAgICBcdW5oYm94MFwgKFxjb2RleyMxfSklCi0gIFxlbHNlCi0gICAgXGNvZGV7IzF9JQotICBcZmkKLX0KLQotJSBybXMgZG9lcyBub3QgbGlrZSB0aGUgYW5nbGUgYnJhY2tldHMgLS1rYXJsLCAxN21heTk3LgotJSBTbyBub3cgQGVtYWlsIGlzIGp1c3QgbGlrZSBAdXJlZi4KLSVcZGVmXGVtYWlsIzF7XGFuZ2xlbGVmdHtcdHQgIzF9XGFuZ2xlcmlnaHR9Ci1cbGV0XGVtYWlsPVx1cmVmCi0KLSUgQ2hlY2sgaWYgd2UgYXJlIGN1cnJlbnRseSB1c2luZyBhIHR5cGV3cml0ZXIgZm9udC4gIFNpbmNlIGFsbCB0aGUKLSUgQ29tcHV0ZXIgTW9kZXJuIHR5cGV3cml0ZXIgZm9udHMgaGF2ZSB6ZXJvIGludGVyd29yZCBzdHJldGNoIChhbmQKLSUgc2hyaW5rKSwgYW5kIGl0IGlzIHJlYXNvbmFibGUgdG8gZXhwZWN0IGFsbCB0eXBld3JpdGVyIGZvbnRzIHRvIGhhdmUKLSUgdGhpcyBwcm9wZXJ0eSwgd2UgY2FuIGNoZWNrIHRoYXQgZm9udCBwYXJhbWV0ZXIuCi0lCi1cZGVmXGlmbW9ub3NwYWNle1xpZmRpbVxmb250ZGltZW4zXGZvbnQ9MHB0IH0KLQotJSBUeXBlc2V0IGEgZGltZW5zaW9uLCBlLmcuLCBgaW4nIG9yIGBwdCcuICBUaGUgb25seSByZWFzb24gZm9yIHRoZQotJSBhcmd1bWVudCBpcyB0byBtYWtlIHRoZSBpbnB1dCBsb29rIHJpZ2h0OiBAZG1ue3B0fSBpbnN0ZWFkIG9mIEBkbW57fXB0LgotJQotXGRlZlxkbW4jMXtcdGhpbnNwYWNlICMxfQotCi1cZGVmXGtiZCMxe1xkZWZcbG9va3sjMX1cZXhwYW5kYWZ0ZXJca2JkZm9vXGxvb2s/P1xwYXJ9Ci0KLSUgQGwgd2FzIG5ldmVyIGRvY3VtZW50ZWQgdG8gbWVhbiBgYHN3aXRjaCB0byB0aGUgTGlzcCBmb250JycsCi0lIGFuZCBpdCBpcyBub3QgdXNlZCBhcyBzdWNoIGluIGFueSBtYW51YWwgSSBjYW4gZmluZC4gIFdlIG5lZWQgaXQgZm9yCi0lIFBvbGlzaCBzdXBwcmVzc2VkLWwuICAtLWthcmwsIDIyc2VwOTYuCi0lXGRlZlxsIzF7e1xsaSAjMX1cbnVsbH0KLQotJSBFeHBsaWNpdCBmb250IGNoYW5nZXM6IEByLCBAc2MsIHVuZG9jdW1lbnRlZCBAaWkuCi1cZGVmXHIjMXt7XHJtICMxfX0gICAgICAgICAgICAgICUgcm9tYW4gZm9udAotXGRlZlxzYyMxe3tcc21hbGxjYXBzIzF9fSAgICAgICAlIHNtYWxsY2FwcyBmb250Ci1cZGVmXGlpIzF7e1xpdCAjMX19ICAgICAgICAgICAgICUgaXRhbGljIGZvbnQKLQotJSBAYWNyb255bSBkb3duY2FzZXMgdGhlIGFyZ3VtZW50IGFuZCBwcmludHMgaW4gc21hbGxjYXBzLgotXGRlZlxhY3JvbnltIzF7e1xzbWFsbGNhcHMgXGxvd2VyY2FzZXsjMX19fQotCi0lIEBwb3VuZHN7fSBpcyBhIHN0ZXJsaW5nIHNpZ24uCi1cZGVmXHBvdW5kc3t7XGl0XCR9fQotCi0KLVxtZXNzYWdle3BhZ2UgaGVhZGluZ3MsfQotCi1cbmV3c2tpcFx0aXRsZXBhZ2V0b3BnbHVlIFx0aXRsZXBhZ2V0b3BnbHVlID0gMS41aW4KLVxuZXdza2lwXHRpdGxlcGFnZWJvdHRvbWdsdWUgXHRpdGxlcGFnZWJvdHRvbWdsdWUgPSAycGMKLQotJSBGaXJzdCB0aGUgdGl0bGUgcGFnZS4gIE11c3QgZG8gQHNldHRpdGxlIGJlZm9yZSBAdGl0bGVwYWdlLgotXG5ld2lmXGlmc2VlbmF1dGhvcgotXG5ld2lmXGlmZmluaXNoZWR0aXRsZXBhZ2UKLQotJSBEbyBhbiBpbXBsaWNpdCBAY29udGVudHMgb3IgQHNob3J0Y29udGVudHMgYWZ0ZXIgQGVuZCB0aXRsZXBhZ2UgaWYgdGhlCi0lIHVzZXIgc2F5cyBAY29udGVudHNhZnRlcnRpdGxlcGFnZSBvciBAc2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlLgotJSAKLVxuZXdpZlxpZnNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UKLSBcbGV0XHNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UgPSBcc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZXRydWUKLVxuZXdpZlxpZnNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZQotIFxsZXRcc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlID0gXHNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZXRydWUKLQotXGRlZlxzaG9ydHRpdGxlcGFnZXtccGFyc2Vhcmdcc2hvcnR0aXRsZXBhZ2V6enp9Ci1cZGVmXHNob3J0dGl0bGVwYWdlenp6ICMxe1xiZWdpbmdyb3VwXGhib3h7fVx2c2tpcCAxLjVpbiBcY2hhcHJtIFxjZW50ZXJsaW5leyMxfSUKLSAgICAgICAgXGVuZGdyb3VwXHBhZ2VcaGJveHt9XHBhZ2V9Ci0KLVxkZWZcdGl0bGVwYWdle1xiZWdpbmdyb3VwIFxwYXJpbmRlbnQ9MHB0IFx0ZXh0Zm9udHMKLSAgIFxsZXRcc3VidGl0bGVybT1cdGVucm0KLSAgIFxkZWZcc3VidGl0bGVmb250e1xzdWJ0aXRsZXJtIFxub3JtYWxiYXNlbGluZXNraXAgPSAxM3B0IFxub3JtYWxiYXNlbGluZXN9JQotICAgJQotICAgXGRlZlxhdXRob3Jmb250e1xhdXRob3JybSBcbm9ybWFsYmFzZWxpbmVza2lwID0gMTZwdCBcbm9ybWFsYmFzZWxpbmVzfSUKLSAgICUKLSAgICUgTGVhdmUgc29tZSBzcGFjZSBhdCB0aGUgdmVyeSB0b3Agb2YgdGhlIHBhZ2UuCi0gICBcdmdsdWVcdGl0bGVwYWdldG9wZ2x1ZQotICAgJQotICAgJSBOb3cgeW91IGNhbiBwcmludCB0aGUgdGl0bGUgdXNpbmcgQHRpdGxlLgotICAgXGRlZlx0aXRsZXtccGFyc2VhcmdcdGl0bGV6enp9JQotICAgXGRlZlx0aXRsZXp6eiMjMXtcbGVmdGxpbmV7XHRpdGxlZm9udHNccm0gIyMxfQotICAgICAgICAgICAgICAgICAgICAlIHByaW50IGEgcnVsZSBhdCB0aGUgcGFnZSBib3R0b20gYWxzby4KLSAgICAgICAgICAgICAgICAgICAgXGZpbmlzaGVkdGl0bGVwYWdlZmFsc2UKLSAgICAgICAgICAgICAgICAgICAgXHZza2lwNHB0IFxocnVsZSBoZWlnaHQgNHB0IHdpZHRoIFxoc2l6ZSBcdnNraXA0cHR9JQotICAgJSBObyBydWxlIGF0IHBhZ2UgYm90dG9tIHVubGVzcyB3ZSBwcmludCBvbmUgYXQgdGhlIHRvcCB3aXRoIEB0aXRsZS4KLSAgIFxmaW5pc2hlZHRpdGxlcGFnZXRydWUKLSAgICUKLSAgICUgTm93IHlvdSBjYW4gcHV0IHRleHQgdXNpbmcgQHN1YnRpdGxlLgotICAgXGRlZlxzdWJ0aXRsZXtccGFyc2Vhcmdcc3VidGl0bGV6enp9JQotICAgXGRlZlxzdWJ0aXRsZXp6eiMjMXt7XHN1YnRpdGxlZm9udCBccmlnaHRsaW5leyMjMX19fSUKLSAgICUKLSAgICUgQGF1dGhvciBzaG91bGQgY29tZSBsYXN0LCBidXQgbWF5IGNvbWUgbWFueSB0aW1lcy4KLSAgIFxkZWZcYXV0aG9ye1xwYXJzZWFyZ1xhdXRob3J6enp9JQotICAgXGRlZlxhdXRob3J6enojIzF7XGlmc2VlbmF1dGhvclxlbHNlXHZza2lwIDBwdCBwbHVzIDFmaWxsbFxzZWVuYXV0aG9ydHJ1ZVxmaQotICAgICAge1xhdXRob3Jmb250IFxsZWZ0bGluZXsjIzF9fX0lCi0gICAlCi0gICAlIE1vc3QgdGl0bGUgYGBwYWdlcycnIGFyZSBhY3R1YWxseSB0d28gcGFnZXMgbG9uZywgd2l0aCBzcGFjZQotICAgJSBhdCB0aGUgdG9wIG9mIHRoZSBzZWNvbmQuICBXZSBkb24ndCB3YW50IHRoZSByYWdnZWQgbGVmdCBvbiB0aGUgc2Vjb25kLgotICAgXGxldFxvbGRwYWdlID0gXHBhZ2UKLSAgIFxkZWZccGFnZXslCi0gICAgICBcaWZmaW5pc2hlZHRpdGxlcGFnZVxlbHNlCi0gICAgICAgICBcZmluaXNodGl0bGVwYWdlCi0gICAgICBcZmkKLSAgICAgIFxvbGRwYWdlCi0gICAgICBcbGV0XHBhZ2UgPSBcb2xkcGFnZQotICAgICAgXGhib3h7fX0lCi0lICAgXGRlZlxwYWdle1xvbGRwYWdlIFxoYm94e319Ci19Ci0KLVxkZWZcRXRpdGxlcGFnZXslCi0gICBcaWZmaW5pc2hlZHRpdGxlcGFnZVxlbHNlCi0gICAgICBcZmluaXNodGl0bGVwYWdlCi0gICBcZmkKLSAgICUgSXQgaXMgaW1wb3J0YW50IHRvIGRvIHRoZSBwYWdlIGJyZWFrIGJlZm9yZSBlbmRpbmcgdGhlIGdyb3VwLAotICAgJSBiZWNhdXNlIHRoZSBoZWFkbGluZSBhbmQgZm9vdGxpbmUgYXJlIG9ubHkgZW1wdHkgaW5zaWRlIHRoZSBncm91cC4KLSAgICUgSWYgd2UgdXNlIHRoZSBuZXcgZGVmaW5pdGlvbiBvZiBccGFnZSwgd2UgYWx3YXlzIGdldCBhIGJsYW5rIHBhZ2UKLSAgICUgYWZ0ZXIgdGhlIHRpdGxlIHBhZ2UsIHdoaWNoIHdlIGNlcnRhaW5seSBkb24ndCB3YW50LgotICAgXG9sZHBhZ2UKLSAgIFxlbmRncm91cAotICAgJQotICAgJSBJZiB0aGV5IHdhbnQgc2hvcnQsIHRoZXkgY2VydGFpbmx5IHdhbnQgbG9uZyB0b28uCi0gICBcaWZzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UKLSAgICAgXHNob3J0Y29udGVudHMKLSAgICAgXGNvbnRlbnRzCi0gICAgIFxnbG9iYWxcbGV0XHNob3J0Y29udGVudHMgPSBccmVsYXgKLSAgICAgXGdsb2JhbFxsZXRcY29udGVudHMgPSBccmVsYXgKLSAgIFxmaQotICAgJQotICAgXGlmc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZQotICAgICBcY29udGVudHMKLSAgICAgXGdsb2JhbFxsZXRcY29udGVudHMgPSBccmVsYXgKLSAgICAgXGdsb2JhbFxsZXRcc2hvcnRjb250ZW50cyA9IFxyZWxheAotICAgXGZpCi0gICAlCi0gICBcSEVBRElOR1NvbgotfQotCi1cZGVmXGZpbmlzaHRpdGxlcGFnZXslCi0gICBcdnNraXA0cHQgXGhydWxlIGhlaWdodCAycHQgd2lkdGggXGhzaXplCi0gICBcdnNraXBcdGl0bGVwYWdlYm90dG9tZ2x1ZQotICAgXGZpbmlzaGVkdGl0bGVwYWdldHJ1ZQotfQotCi0lJSUgU2V0IHVwIHBhZ2UgaGVhZGluZ3MgYW5kIGZvb3RpbmdzLgotCi1cbGV0XHRoaXNwYWdlPVxmb2xpbwotCi1cbmV3dG9rc1xldmVuaGVhZGxpbmUgICAgJSBoZWFkbGluZSBvbiBldmVuIHBhZ2VzCi1cbmV3dG9rc1xvZGRoZWFkbGluZSAgICAgJSBoZWFkbGluZSBvbiBvZGQgcGFnZXMKLVxuZXd0b2tzXGV2ZW5mb290bGluZSAgICAlIGZvb3RsaW5lIG9uIGV2ZW4gcGFnZXMKLVxuZXd0b2tzXG9kZGZvb3RsaW5lICAgICAlIGZvb3RsaW5lIG9uIG9kZCBwYWdlcwotCi0lIE5vdyBtYWtlIFRleCB1c2UgdGhvc2UgdmFyaWFibGVzCi1caGVhZGxpbmU9e3tcdGV4dGZvbnRzXHJtIFxpZm9kZFxwYWdlbm8gXHRoZVxvZGRoZWFkbGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxlbHNlIFx0aGVcZXZlbmhlYWRsaW5lIFxmaX19Ci1cZm9vdGxpbmU9e3tcdGV4dGZvbnRzXHJtIFxpZm9kZFxwYWdlbm8gXHRoZVxvZGRmb290bGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxlbHNlIFx0aGVcZXZlbmZvb3RsaW5lIFxmaX1cSEVBRElOR1Nob29rfQotXGxldFxIRUFESU5HU2hvb2s9XHJlbGF4Ci0KLSUgQ29tbWFuZHMgdG8gc2V0IHRob3NlIHZhcmlhYmxlcy4KLSUgRm9yIGV4YW1wbGUsIHRoaXMgaXMgd2hhdCAgQGhlYWRpbmdzIG9uICBkb2VzCi0lIEBldmVuaGVhZGluZyBAdGhpc3RpdGxlfEB0aGlzcGFnZXxAdGhpc2NoYXB0ZXIKLSUgQG9kZGhlYWRpbmcgQHRoaXNjaGFwdGVyfEB0aGlzcGFnZXxAdGhpc3RpdGxlCi0lIEBldmVuZm9vdGluZyBAdGhpc2ZpbGV8fAotJSBAb2RkZm9vdGluZyB8fEB0aGlzZmlsZQotCi1cZGVmXGV2ZW5oZWFkaW5ne1xwYXJzZWFyZ1xldmVuaGVhZGluZ3h4eH0KLVxkZWZcb2RkaGVhZGluZ3tccGFyc2Vhcmdcb2RkaGVhZGluZ3h4eH0KLVxkZWZcZXZlcnloZWFkaW5ne1xwYXJzZWFyZ1xldmVyeWhlYWRpbmd4eHh9Ci0KLVxkZWZcZXZlbmZvb3Rpbmd7XHBhcnNlYXJnXGV2ZW5mb290aW5neHh4fQotXGRlZlxvZGRmb290aW5ne1xwYXJzZWFyZ1xvZGRmb290aW5neHh4fQotXGRlZlxldmVyeWZvb3Rpbmd7XHBhcnNlYXJnXGV2ZXJ5Zm9vdGluZ3h4eH0KLQote1xjYXRjb2RlYFxAPTAgJQotCi1cZ2RlZlxldmVuaGVhZGluZ3h4eCAjMXtcZXZlbmhlYWRpbmd5eXkgIzFAfEB8QHxAfFxmaW5pc2h9Ci1cZ2RlZlxldmVuaGVhZGluZ3l5eSAjMUB8IzJAfCMzQHwjNFxmaW5pc2h7JQotXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fX0KLQotXGdkZWZcb2RkaGVhZGluZ3h4eCAjMXtcb2RkaGVhZGluZ3l5eSAjMUB8QHxAfEB8XGZpbmlzaH0KLVxnZGVmXG9kZGhlYWRpbmd5eXkgIzFAfCMyQHwjM0B8IzRcZmluaXNoeyUKLVxnbG9iYWxcb2RkaGVhZGxpbmU9e1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fX0KLQotXGdkZWZcZXZlcnloZWFkaW5neHh4IzF7XG9kZGhlYWRpbmd4eHh7IzF9XGV2ZW5oZWFkaW5neHh4eyMxfX0lCi0KLVxnZGVmXGV2ZW5mb290aW5neHh4ICMxe1xldmVuZm9vdGluZ3l5eSAjMUB8QHxAfEB8XGZpbmlzaH0KLVxnZGVmXGV2ZW5mb290aW5neXl5ICMxQHwjMkB8IzNAfCM0XGZpbmlzaHslCi1cZ2xvYmFsXGV2ZW5mb290bGluZT17XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319fQotCi1cZ2RlZlxvZGRmb290aW5neHh4ICMxe1xvZGRmb290aW5neXl5ICMxQHxAfEB8QHxcZmluaXNofQotXGdkZWZcb2RkZm9vdGluZ3l5eSAjMUB8IzJAfCMzQHwjNFxmaW5pc2h7JQotICBcZ2xvYmFsXG9kZGZvb3RsaW5lID0ge1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fSUKLSAgJQotICAlIExlYXZlIHNvbWUgc3BhY2UgZm9yIHRoZSBmb290bGluZS4gIEhvcGVmdWxseSBvayB0byBhc3N1bWUKLSAgJSBAZXZlbmZvb3Rpbmcgd2lsbCBub3QgYmUgdXNlZCBieSBpdHNlbGYuCi0gIFxnbG9iYWxcYWR2YW5jZVxwYWdlaGVpZ2h0IGJ5IC1cYmFzZWxpbmVza2lwCi0gIFxnbG9iYWxcYWR2YW5jZVx2c2l6ZSBieSAtXGJhc2VsaW5lc2tpcAotfQotCi1cZ2RlZlxldmVyeWZvb3Rpbmd4eHgjMXtcb2RkZm9vdGluZ3h4eHsjMX1cZXZlbmZvb3Rpbmd4eHh7IzF9fQotJQotfSUgdW5iaW5kIHRoZSBjYXRjb2RlIG9mIEAuCi0KLSUgQGhlYWRpbmdzIGRvdWJsZSAgICAgIHR1cm5zIGhlYWRpbmdzIG9uIGZvciBkb3VibGUtc2lkZWQgcHJpbnRpbmcuCi0lIEBoZWFkaW5ncyBzaW5nbGUgICAgICB0dXJucyBoZWFkaW5ncyBvbiBmb3Igc2luZ2xlLXNpZGVkIHByaW50aW5nLgotJSBAaGVhZGluZ3Mgb2ZmICAgICAgICAgdHVybnMgdGhlbSBvZmYuCi0lIEBoZWFkaW5ncyBvbiAgICAgICAgICBzYW1lIGFzIEBoZWFkaW5ncyBkb3VibGUsIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5LgotJSBAaGVhZGluZ3MgYWZ0ZXIgICAgICAgdHVybnMgb24gZG91YmxlLXNpZGVkIGhlYWRpbmdzIGFmdGVyIHRoaXMgcGFnZS4KLSUgQGhlYWRpbmdzIGRvdWJsZWFmdGVyIHR1cm5zIG9uIGRvdWJsZS1zaWRlZCBoZWFkaW5ncyBhZnRlciB0aGlzIHBhZ2UuCi0lIEBoZWFkaW5ncyBzaW5nbGVhZnRlciB0dXJucyBvbiBzaW5nbGUtc2lkZWQgaGVhZGluZ3MgYWZ0ZXIgdGhpcyBwYWdlLgotJSBCeSBkZWZhdWx0LCB0aGV5IGFyZSBvZmYgYXQgdGhlIHN0YXJ0IG9mIGEgZG9jdW1lbnQsCi0lIGFuZCB0dXJuZWQgYG9uJyBhZnRlciBAZW5kIHRpdGxlcGFnZS4KLQotXGRlZlxoZWFkaW5ncyAjMSB7XGNzbmFtZSBIRUFESU5HUyMxXGVuZGNzbmFtZX0KLQotXGRlZlxIRUFESU5HU29mZnsKLVxnbG9iYWxcZXZlbmhlYWRsaW5lPXtcaGZpbH0gXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxvZGRoZWFkbGluZT17XGhmaWx9IFxnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfX0KLVxIRUFESU5HU29mZgotJSBXaGVuIHdlIHR1cm4gaGVhZGluZ3Mgb24sIHNldCB0aGUgcGFnZSBudW1iZXIgdG8gMS4KLSUgRm9yIGRvdWJsZS1zaWRlZCBwcmludGluZywgcHV0IGN1cnJlbnQgZmlsZSBuYW1lIGluIGxvd2VyIGxlZnQgY29ybmVyLAotJSBjaGFwdGVyIG5hbWUgb24gaW5zaWRlIHRvcCBvZiByaWdodCBoYW5kIHBhZ2VzLCBkb2N1bWVudAotJSB0aXRsZSBvbiBpbnNpZGUgdG9wIG9mIGxlZnQgaGFuZCBwYWdlcywgYW5kIHBhZ2UgbnVtYmVycyBvbiBvdXRzaWRlIHRvcAotJSBlZGdlIG9mIGFsbCBwYWdlcy4KLVxkZWZcSEVBRElOR1Nkb3VibGV7Ci1cZ2xvYmFsXHBhZ2Vubz0xCi1cZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcZm9saW9caGZpbFx0aGlzdGl0bGV9fQotXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQotXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBvZGRwYWdlCi19Ci1cbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKLQotJSBGb3Igc2luZ2xlLXNpZGVkIHByaW50aW5nLCBjaGFwdGVyIHRpdGxlIGdvZXMgYWNyb3NzIHRvcCBsZWZ0IG9mIHBhZ2UsCi0lIHBhZ2UgbnVtYmVyIG9uIHRvcCByaWdodC4KLVxkZWZcSEVBRElOR1NzaW5nbGV7Ci1cZ2xvYmFsXHBhZ2Vubz0xCi1cZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319Ci1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319Ci1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCi19Ci1cZGVmXEhFQURJTkdTb257XEhFQURJTkdTZG91YmxlfQotCi1cZGVmXEhFQURJTkdTYWZ0ZXJ7XGxldFxIRUFESU5HU2hvb2s9XEhFQURJTkdTZG91YmxleH0KLVxsZXRcSEVBRElOR1Nkb3VibGVhZnRlcj1cSEVBRElOR1NhZnRlcgotXGRlZlxIRUFESU5HU2RvdWJsZXh7JQotXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XGZvbGlvXGhmaWxcdGhpc3RpdGxlfX0KLVxnbG9iYWxcb2RkaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwb2RkcGFnZQotfQotCi1cZGVmXEhFQURJTkdTc2luZ2xlYWZ0ZXJ7XGxldFxIRUFESU5HU2hvb2s9XEhFQURJTkdTc2luZ2xleH0KLVxkZWZcSEVBRElOR1NzaW5nbGV4eyUKLVxnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KLVxnbG9iYWxcb2RkaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKLX0KLQotJSBTdWJyb3V0aW5lcyB1c2VkIGluIGdlbmVyYXRpbmcgaGVhZGluZ3MKLSUgUHJvZHVjZXMgRGF5IE1vbnRoIFllYXIgc3R5bGUgb2Ygb3V0cHV0LgotXGRlZlx0b2RheXtcbnVtYmVyXGRheVxzcGFjZQotXGlmY2FzZVxtb250aFxvcgotSmFudWFyeVxvciBGZWJydWFyeVxvciBNYXJjaFxvciBBcHJpbFxvciBNYXlcb3IgSnVuZVxvcgotSnVseVxvciBBdWd1c3Rcb3IgU2VwdGVtYmVyXG9yIE9jdG9iZXJcb3IgTm92ZW1iZXJcb3IgRGVjZW1iZXJcZmkKLVxzcGFjZVxudW1iZXJceWVhcn0KLQotJSBVc2UgdGhpcyBpZiB5b3Ugd2FudCB0aGUgTW9udGggRGF5LCBZZWFyIHN0eWxlIG9mIG91dHB1dC4KLSVcZGVmXHRvZGF5e1xpZmNhc2VcbW9udGhcb3IKLSVKYW51YXJ5XG9yIEZlYnJ1YXJ5XG9yIE1hcmNoXG9yIEFwcmlsXG9yIE1heVxvciBKdW5lXG9yCi0lSnVseVxvciBBdWd1c3Rcb3IgU2VwdGVtYmVyXG9yIE9jdG9iZXJcb3IgTm92ZW1iZXJcb3IgRGVjZW1iZXJcZmkKLSVcc3BhY2VcbnVtYmVyXGRheSwgXG51bWJlclx5ZWFyfQotCi0lIEBzZXR0aXRsZSBsaW5lLi4uICBzcGVjaWZpZXMgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCwgZm9yIGhlYWRpbmdzCi0lIEl0IGdlbmVyYXRlcyBubyBvdXRwdXQgb2YgaXRzIG93bgotCi1cZGVmXHRoaXN0aXRsZXtObyBUaXRsZX0KLVxkZWZcc2V0dGl0bGV7XHBhcnNlYXJnXHNldHRpdGxlenp6fQotXGRlZlxzZXR0aXRsZXp6eiAjMXtcZ2RlZlx0aGlzdGl0bGV7IzF9fQotCi0KLVxtZXNzYWdle3RhYmxlcyx9Ci0lIFRhYmxlcyAtLSBAdGFibGUsIEBmdGFibGUsIEB2dGFibGUsIEBpdGVtKHgpLCBAa2l0ZW0oeCksIEB4aXRlbSh4KS4KLQotJSBkZWZhdWx0IGluZGVudGF0aW9uIG9mIHRhYmxlIHRleHQKLVxuZXdkaW1lblx0YWJsZWluZGVudCBcdGFibGVpbmRlbnQ9LjhpbgotJSBkZWZhdWx0IGluZGVudGF0aW9uIG9mIEBpdGVtaXplIGFuZCBAZW51bWVyYXRlIHRleHQKLVxuZXdkaW1lblxpdGVtaW5kZW50ICBcaXRlbWluZGVudD0uM2luCi0lIG1hcmdpbiBiZXR3ZWVuIGVuZCBvZiB0YWJsZSBpdGVtIGFuZCBzdGFydCBvZiB0YWJsZSB0ZXh0LgotXG5ld2RpbWVuXGl0ZW1tYXJnaW4gIFxpdGVtbWFyZ2luPS4xaW4KLQotJSB1c2VkIGludGVybmFsbHkgZm9yIFxpdGVtaW5kZW50IG1pbnVzIFxpdGVtbWFyZ2luCi1cbmV3ZGltZW5caXRlbW1heAotCi0lIE5vdGUgQHRhYmxlLCBAdnRhYmxlLCBhbmQgQHZ0YWJsZSBkZWZpbmUgQGl0ZW0sIEBpdGVteCwgZXRjLiwgd2l0aAotJSB0aGVzZSBkZWZzLgotJSBUaGV5IGFsc28gZGVmaW5lIFxpdGVtaW5kZXgKLSUgdG8gaW5kZXggdGhlIGl0ZW0gbmFtZSBpbiB3aGF0ZXZlciBtYW5uZXIgaXMgZGVzaXJlZCAocGVyaGFwcyBub25lKS4KLQotXG5ld2lmXGlmaXRlbXhuZWVkc25lZ2F0aXZldnNraXAKLQotXGRlZlxpdGVteHBhcntccGFyXGlmaXRlbXhuZWVkc25lZ2F0aXZldnNraXBcbm9icmVha1x2c2tpcC1ccGFyc2tpcFxub2JyZWFrXGZpfQotCi1cZGVmXGludGVybmFsQml0ZW17XHNtYWxsYnJlYWsgXHBhcnNlYXJnXGl0ZW16enp9Ci1cZGVmXGludGVybmFsQml0ZW14e1xpdGVteHBhciBccGFyc2VhcmdcaXRlbXp6en0KLQotXGRlZlxpbnRlcm5hbEJ4aXRlbSAiIzEie1xkZWZceGl0ZW1zdWJ0b3BpeHsjMX0gXHNtYWxsYnJlYWsgXHBhcnNlYXJnXHhpdGVtenp6fQotXGRlZlxpbnRlcm5hbEJ4aXRlbXggIiMxIntcZGVmXHhpdGVtc3VidG9waXh7IzF9IFxpdGVteHBhciBccGFyc2VhcmdceGl0ZW16enp9Ci0KLVxkZWZcaW50ZXJuYWxCa2l0ZW17XHNtYWxsYnJlYWsgXHBhcnNlYXJnXGtpdGVtenp6fQotXGRlZlxpbnRlcm5hbEJraXRlbXh7XGl0ZW14cGFyIFxwYXJzZWFyZ1xraXRlbXp6en0KLQotXGRlZlxraXRlbXp6eiAjMXtcZG9zdWJpbmQge2t3fXtcY29kZXsjMX19e2ZvciB7XGJmIFxsYXN0ZnVuY3Rpb259fSUKLSAgICAgICAgICAgICAgICAgXGl0ZW16enogeyMxfX0KLQotXGRlZlx4aXRlbXp6eiAjMXtcZG9zdWJpbmQge2t3fXtcY29kZXsjMX19e2ZvciB7XGJmIFx4aXRlbXN1YnRvcGljfX0lCi0gICAgICAgICAgICAgICAgIFxpdGVtenp6IHsjMX19Ci0KLVxkZWZcaXRlbXp6eiAjMXtcYmVnaW5ncm91cCAlCi0gIFxhZHZhbmNlXGhzaXplIGJ5IC1ccmlnaHRza2lwCi0gIFxhZHZhbmNlXGhzaXplIGJ5IC1cdGFibGVpbmRlbnQKLSAgXHNldGJveDA9XGhib3h7XGl0ZW1mb250eyMxfX0lCi0gIFxpdGVtaW5kZXh7IzF9JQotICBcbm9icmVhayAlIFRoaXMgcHJldmVudHMgYSBicmVhayBiZWZvcmUgQGl0ZW14LgotICAlCi0gICUgSWYgdGhlIGl0ZW0gdGV4dCBkb2VzIG5vdCBmaXQgaW4gdGhlIHNwYWNlIHdlIGhhdmUsIHB1dCBpdCBvbiBhIGxpbmUKLSAgJSBieSBpdHNlbGYsIGFuZCBkbyBub3QgYWxsb3cgYSBwYWdlIGJyZWFrIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhhdAotICAlIGxpbmUuICBXZSBkbyBub3Qgc3RhcnQgYSBwYXJhZ3JhcGggaGVyZSBiZWNhdXNlIHRoZW4gaWYgdGhlIG5leHQKLSAgJSBjb21tYW5kIGlzLCBlLmcuLCBAa2luZGV4LCB0aGUgd2hhdHNpdCB3b3VsZCBnZXQgcHV0IGludG8gdGhlCi0gICUgaG9yaXpvbnRhbCBsaXN0IG9uIGEgbGluZSBieSBpdHNlbGYsIHJlc3VsdGluZyBpbiBleHRyYSBibGFuayBzcGFjZS4KLSAgXGlmZGltIFx3ZDA+XGl0ZW1tYXgKLSAgICAlCi0gICAgJSBNYWtlIHRoaXMgYSBwYXJhZ3JhcGggc28gd2UgZ2V0IHRoZSBccGFyc2tpcCBnbHVlIGFuZCB3cmFwcGluZywKLSAgICAlIGJ1dCBsZWF2ZSBpdCByYWdnZWQtcmlnaHQuCi0gICAgXGJlZ2luZ3JvdXAKLSAgICAgIFxhZHZhbmNlXGxlZnRza2lwIGJ5LVx0YWJsZWluZGVudAotICAgICAgXGFkdmFuY2VcaHNpemUgYnlcdGFibGVpbmRlbnQKLSAgICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieTBwdCBwbHVzMWZpbAotICAgICAgXGxlYXZldm1vZGVcdW5oYm94MFxwYXIKLSAgICBcZW5kZ3JvdXAKLSAgICAlCi0gICAgJSBXZSdyZSBnb2luZyB0byBiZSBzdGFydGluZyBhIHBhcmFncmFwaCwgYnV0IHdlIGRvbid0IHdhbnQgdGhlCi0gICAgJSBccGFyc2tpcCBnbHVlIC0tIGxvZ2ljYWxseSBpdCdzIHBhcnQgb2YgdGhlIEBpdGVtIHdlIGp1c3Qgc3RhcnRlZC4KLSAgICBcbm9icmVhayBcdnNraXAtXHBhcnNraXAKLSAgICAlCi0gICAgJSBTdG9wIGEgcGFnZSBicmVhayBhdCB0aGUgXHBhcnNraXAgZ2x1ZSBjb21pbmcgdXAuICBVbmZvcnR1bmF0ZWx5Ci0gICAgJSB3ZSBjYW4ndCBwcmV2ZW50IGEgcG9zc2libGUgcGFnZSBicmVhayBhdCB0aGUgZm9sbG93aW5nCi0gICAgJSBcYmFzZWxpbmVza2lwIGdsdWUuCi0gICAgXG5vYnJlYWsKLSAgICBcZW5kZ3JvdXAKLSAgICBcaXRlbXhuZWVkc25lZ2F0aXZldnNraXBmYWxzZQotICBcZWxzZQotICAgICUgVGhlIGl0ZW0gdGV4dCBmaXRzIGludG8gdGhlIHNwYWNlLiAgU3RhcnQgYSBwYXJhZ3JhcGgsIHNvIHRoYXQgdGhlCi0gICAgJSBmb2xsb3dpbmcgdGV4dCAoaWYgYW55KSB3aWxsIGVuZCB1cCBvbiB0aGUgc2FtZSBsaW5lLiAgCi0gICAgXG5vaW5kZW50Ci0gICAgJSBEbyB0aGlzIHdpdGgga2VybnMgYW5kIFx1bmhib3ggc28gdGhhdCBpZiB0aGVyZSBpcyBhIGZvb3Rub3RlIGluCi0gICAgJSB0aGUgaXRlbSB0ZXh0LCBpdCBjYW4gbWlncmF0ZSB0byB0aGUgbWFpbiB2ZXJ0aWNhbCBsaXN0IGFuZAotICAgICUgZXZlbnR1YWxseSBiZSBwcmludGVkLgotICAgIFxub2JyZWFrXGtlcm4tXHRhYmxlaW5kZW50Ci0gICAgXGRpbWVuMCA9IFxpdGVtbWF4ICBcYWR2YW5jZVxkaW1lbjAgYnkgXGl0ZW1tYXJnaW4gXGFkdmFuY2VcZGltZW4wIGJ5IC1cd2QwCi0gICAgXHVuaGJveDAKLSAgICBcbm9icmVha1xrZXJuXGRpbWVuMAotICAgIFxlbmRncm91cAotICAgIFxpdGVteG5lZWRzbmVnYXRpdmV2c2tpcHRydWUKLSAgXGZpCi19Ci0KLVxkZWZcaXRlbXtcZXJybWVzc2FnZXtAaXRlbSB3aGlsZSBub3QgaW4gYSB0YWJsZX19Ci1cZGVmXGl0ZW14e1xlcnJtZXNzYWdle0BpdGVteCB3aGlsZSBub3QgaW4gYSB0YWJsZX19Ci1cZGVmXGtpdGVte1xlcnJtZXNzYWdle0BraXRlbSB3aGlsZSBub3QgaW4gYSB0YWJsZX19Ci1cZGVmXGtpdGVteHtcZXJybWVzc2FnZXtAa2l0ZW14IHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KLVxkZWZceGl0ZW17XGVycm1lc3NhZ2V7QHhpdGVtIHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KLVxkZWZceGl0ZW14e1xlcnJtZXNzYWdle0B4aXRlbXggd2hpbGUgbm90IGluIGEgdGFibGV9fQotCi0lIENvbnRhaW5zIGEga2x1ZGdlIHRvIGdldCBAZW5kW2Rlc2NyaXB0aW9uXSB0byB3b3JrLgotXGRlZlxkZXNjcmlwdGlvbntcdGFibGV6e1xkb250aW5kZXh9ezF9e317fXt9e319Ci0KLSUgQHRhYmxlLCBAZnRhYmxlLCBAdnRhYmxlLgotXGRlZlx0YWJsZXtcYmVnaW5ncm91cFxpbkVOVlxvYmV5bGluZXNcb2JleXNwYWNlc1x0YWJsZXh9Ci17XG9iZXlsaW5lc1xvYmV5c3BhY2VzJQotXGdkZWZcdGFibGV4ICMxXl5NeyUKLVx0YWJsZXlcZG9udGluZGV4IzEgICAgICAgIFxlbmR0YWJsZXl9fQotCi1cZGVmXGZ0YWJsZXtcYmVnaW5ncm91cFxpbkVOVlxvYmV5bGluZXNcb2JleXNwYWNlc1xmdGFibGV4fQote1xvYmV5bGluZXNcb2JleXNwYWNlcyUKLVxnZGVmXGZ0YWJsZXggIzFeXk17JQotXHRhYmxleVxmbml0ZW1pbmRleCMxICAgICAgICBcZW5kdGFibGV5Ci1cZGVmXEVmdGFibGV7XGVuZGdyYWZcYWZ0ZXJlbnZicmVha1xlbmRncm91cH0lCi1cbGV0XEV0YWJsZT1ccmVsYXh9fQotCi1cZGVmXHZ0YWJsZXtcYmVnaW5ncm91cFxpbkVOVlxvYmV5bGluZXNcb2JleXNwYWNlc1x2dGFibGV4fQote1xvYmV5bGluZXNcb2JleXNwYWNlcyUKLVxnZGVmXHZ0YWJsZXggIzFeXk17JQotXHRhYmxleVx2cml0ZW1pbmRleCMxICAgICAgICBcZW5kdGFibGV5Ci1cZGVmXEV2dGFibGV7XGVuZGdyYWZcYWZ0ZXJlbnZicmVha1xlbmRncm91cH0lCi1cbGV0XEV0YWJsZT1ccmVsYXh9fQotCi1cZGVmXGRvbnRpbmRleCAjMXt9Ci1cZGVmXGZuaXRlbWluZGV4ICMxe1xkb2luZCB7Zm59e1xjb2RleyMxfX19JQotXGRlZlx2cml0ZW1pbmRleCAjMXtcZG9pbmQge3ZyfXtcY29kZXsjMX19fSUKLQote1xvYmV5c3BhY2VzICUKLVxnZGVmXHRhYmxleSMxIzIgIzMgIzQgIzUgIzYgIzdcZW5kdGFibGV5e1xlbmRncm91cCUKLVx0YWJsZXp7IzF9eyMyfXsjM317IzR9eyM1fXsjNn19fQotCi1cZGVmXHRhYmxleiAjMSMyIzMjNCM1IzZ7JQotXGFib3ZlZW52YnJlYWsgJQotXGJlZ2luZ3JvdXAgJQotXGRlZlxFZGVzY3JpcHRpb257XEV0YWJsZX0lIE5lY2Vzc2FyeSBrbHVkZ2UuCi1cbGV0XGl0ZW1pbmRleD0jMSUKLVxpZm51bSAwIzM+MCBcYWR2YW5jZSBcbGVmdHNraXAgYnkgIzNcbWlsIFxmaSAlCi1caWZudW0gMCM0PjAgXHRhYmxlaW5kZW50PSM0XG1pbCBcZmkgJQotXGlmbnVtIDAjNT4wIFxhZHZhbmNlIFxyaWdodHNraXAgYnkgIzVcbWlsIFxmaSAlCi1cZGVmXGl0ZW1mb250eyMyfSUKLVxpdGVtbWF4PVx0YWJsZWluZGVudCAlCi1cYWR2YW5jZSBcaXRlbW1heCBieSAtXGl0ZW1tYXJnaW4gJQotXGFkdmFuY2UgXGxlZnRza2lwIGJ5IFx0YWJsZWluZGVudCAlCi1cZXhkZW50YW1vdW50PVx0YWJsZWluZGVudAotXHBhcmluZGVudCA9IDBwdAotXHBhcnNraXAgPSBcc21hbGxza2lwYW1vdW50Ci1caWZkaW0gXHBhcnNraXA9MHB0IFxwYXJza2lwPTJwdCBcZmklCi1cZGVmXEV0YWJsZXtcZW5kZ3JhZlxhZnRlcmVudmJyZWFrXGVuZGdyb3VwfSUKLVxsZXRcaXRlbSA9IFxpbnRlcm5hbEJpdGVtICUKLVxsZXRcaXRlbXggPSBcaW50ZXJuYWxCaXRlbXggJQotXGxldFxraXRlbSA9IFxpbnRlcm5hbEJraXRlbSAlCi1cbGV0XGtpdGVteCA9IFxpbnRlcm5hbEJraXRlbXggJQotXGxldFx4aXRlbSA9IFxpbnRlcm5hbEJ4aXRlbSAlCi1cbGV0XHhpdGVteCA9IFxpbnRlcm5hbEJ4aXRlbXggJQotfQotCi0lIFRoaXMgaXMgdGhlIGNvdW50ZXIgdXNlZCBieSBAZW51bWVyYXRlLCB3aGljaCBpcyByZWFsbHkgQGl0ZW1pemUKLQotXG5ld2NvdW50IFxpdGVtbm8KLQotXGRlZlxpdGVtaXple1xwYXJzZWFyZ1xpdGVtaXplenp6fQotCi1cZGVmXGl0ZW1pemV6enogIzF7JQotICBcYmVnaW5ncm91cCAlIGVuZGVkIGJ5IHRoZSBAZW5kIGl0ZW1pemUKLSAgXGl0ZW1pemV5IHsjMX17XEVpdGVtaXplfQotfQotCi1cZGVmXGl0ZW1pemV5ICMxIzJ7JQotXGFib3ZlZW52YnJlYWsgJQotXGl0ZW1tYXg9XGl0ZW1pbmRlbnQgJQotXGFkdmFuY2UgXGl0ZW1tYXggYnkgLVxpdGVtbWFyZ2luICUKLVxhZHZhbmNlIFxsZWZ0c2tpcCBieSBcaXRlbWluZGVudCAlCi1cZXhkZW50YW1vdW50PVxpdGVtaW5kZW50Ci1ccGFyaW5kZW50ID0gMHB0ICUKLVxwYXJza2lwID0gXHNtYWxsc2tpcGFtb3VudCAlCi1caWZkaW0gXHBhcnNraXA9MHB0IFxwYXJza2lwPTJwdCBcZmklCi1cZGVmIzJ7XGVuZGdyYWZcYWZ0ZXJlbnZicmVha1xlbmRncm91cH0lCi1cZGVmXGl0ZW1jb250ZW50c3sjMX0lCi1cbGV0XGl0ZW09XGl0ZW1pemVpdGVtfQotCi0lIFNldCBzZmNvZGUgdG8gbm9ybWFsIGZvciB0aGUgY2hhcnMgdGhhdCB1c3VhbGx5IGhhdmUgYW5vdGhlciB2YWx1ZS4KLSUgVGhlc2UgYXJlIGAuPyE6OywnCi1cZGVmXGZyZW5jaHNwYWNpbmd7XHNmY29kZTQ2PTEwMDAgXHNmY29kZTYzPTEwMDAgXHNmY29kZTMzPTEwMDAKLSAgXHNmY29kZTU4PTEwMDAgXHNmY29kZTU5PTEwMDAgXHNmY29kZTQ0PTEwMDAgfQotCi0lIFxzcGxpdG9mZiBUT0tFTlNcZW5kbWFyayBkZWZpbmVzIFxmaXJzdCB0byBiZSB0aGUgZmlyc3QgdG9rZW4gaW4KLSUgVE9LRU5TLCBhbmQgXHJlc3QgdG8gYmUgdGhlIHJlbWFpbmRlci4KLSUKLVxkZWZcc3BsaXRvZmYjMSMyXGVuZG1hcmt7XGRlZlxmaXJzdHsjMX1cZGVmXHJlc3R7IzJ9fSUKLQotJSBBbGxvdyBhbiBvcHRpb25hbCBhcmd1bWVudCBvZiBhbiB1cHBlcmNhc2UgbGV0dGVyLCBsb3dlcmNhc2UgbGV0dGVyLAotJSBvciBudW1iZXIsIHRvIHNwZWNpZnkgdGhlIGZpcnN0IGxhYmVsIGluIHRoZSBlbnVtZXJhdGVkIGxpc3QuICBObwotJSBhcmd1bWVudCBpcyB0aGUgc2FtZSBhcyBgMScuCi0lCi1cZGVmXGVudW1lcmF0ZXtccGFyc2VhcmdcZW51bWVyYXRlenp6fQotXGRlZlxlbnVtZXJhdGV6enogIzF7XGVudW1lcmF0ZXkgIzEgIFxlbmRlbnVtZXJhdGV5fQotXGRlZlxlbnVtZXJhdGV5ICMxICMyXGVuZGVudW1lcmF0ZXl7JQotICBcYmVnaW5ncm91cCAlIGVuZGVkIGJ5IHRoZSBAZW5kIGVudW1lcmF0ZQotICAlCi0gICUgSWYgd2Ugd2VyZSBnaXZlbiBubyBhcmd1bWVudCwgcHJldGVuZCB3ZSB3ZXJlIGdpdmVuIGAxJy4KLSAgXGRlZlx0aGVhcmd7IzF9JQotICBcaWZ4XHRoZWFyZ1xlbXB0eSBcZGVmXHRoZWFyZ3sxfVxmaQotICAlCi0gICUgRGV0ZWN0IGlmIHRoZSBhcmd1bWVudCBpcyBhIHNpbmdsZSB0b2tlbi4gIElmIHNvLCBpdCBtaWdodCBiZSBhCi0gICUgbGV0dGVyLiAgT3RoZXJ3aXNlLCB0aGUgb25seSB2YWxpZCB0aGluZyBpdCBjYW4gYmUgaXMgYSBudW1iZXIuCi0gICUgKFdlIHdpbGwgYWx3YXlzIGhhdmUgb25lIHRva2VuLCBiZWNhdXNlIG9mIHRoZSB0ZXN0IHdlIGp1c3QgbWFkZS4KLSAgJSBUaGlzIGlzIGEgZ29vZCB0aGluZywgc2luY2UgXHNwbGl0b2ZmIGRvZXNuJ3Qgd29yayBnaXZlbiBub3RoaW5nIGF0Ci0gICUgYWxsIC0tIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdW5kZWxpbWl0ZWQuKQotICBcZXhwYW5kYWZ0ZXJcc3BsaXRvZmZcdGhlYXJnXGVuZG1hcmsKLSAgXGlmeFxyZXN0XGVtcHR5Ci0gICAgJSBPbmx5IG9uZSB0b2tlbiBpbiB0aGUgYXJndW1lbnQuICBJdCBjb3VsZCBzdGlsbCBiZSBhbnl0aGluZy4KLSAgICAlIEEgYGBsb3dlcmNhc2UgbGV0dGVyJycgaXMgb25lIHdob3NlIFxsY2NvZGUgaXMgbm9uemVyby4KLSAgICAlIEFuIGBgdXBwZXJjYXNlIGxldHRlcicnIGlzIG9uZSB3aG9zZSBcbGNjb2RlIGlzIGJvdGggbm9uemVybywgYW5kCi0gICAgJSAgIG5vdCBlcXVhbCB0byBpdHNlbGYuCi0gICAgJSBPdGhlcndpc2UsIHdlIGFzc3VtZSBpdCdzIGEgbnVtYmVyLgotICAgICUKLSAgICAlIFdlIG5lZWQgdGhlIFxyZWxheCBhdCB0aGUgZW5kIG9mIHRoZSBcaWZudW0gbGluZXMgdG8gc3RvcCBUZVggZnJvbQotICAgICUgY29udGludWluZyB0byBsb29rIGZvciBhIDxudW1iZXI+LgotICAgICUKLSAgICBcaWZudW1cbGNjb2RlXGV4cGFuZGFmdGVyYFx0aGVhcmc9MFxyZWxheAotICAgICAgXG51bWVyaWNlbnVtZXJhdGUgJSBhIG51bWJlciAod2UgaG9wZSkKLSAgICBcZWxzZQotICAgICAgJSBJdCdzIGEgbGV0dGVyLgotICAgICAgXGlmbnVtXGxjY29kZVxleHBhbmRhZnRlcmBcdGhlYXJnPVxleHBhbmRhZnRlcmBcdGhlYXJnXHJlbGF4Ci0gICAgICAgIFxsb3dlcmNhc2VlbnVtZXJhdGUgJSBsb3dlcmNhc2UgbGV0dGVyCi0gICAgICBcZWxzZQotICAgICAgICBcdXBwZXJjYXNlZW51bWVyYXRlICUgdXBwZXJjYXNlIGxldHRlcgotICAgICAgXGZpCi0gICAgXGZpCi0gIFxlbHNlCi0gICAgJSBNdWx0aXBsZSB0b2tlbnMgaW4gdGhlIGFyZ3VtZW50LiAgV2UgaG9wZSBpdCdzIGEgbnVtYmVyLgotICAgIFxudW1lcmljZW51bWVyYXRlCi0gIFxmaQotfQotCi0lIEFuIEBlbnVtZXJhdGUgd2hvc2UgbGFiZWxzIGFyZSBpbnRlZ2Vycy4gIFRoZSBzdGFydGluZyBpbnRlZ2VyIGlzCi0lIGdpdmVuIGluIFx0aGVhcmcuCi0lCi1cZGVmXG51bWVyaWNlbnVtZXJhdGV7JQotICBcaXRlbW5vID0gXHRoZWFyZwotICBcc3RhcnRlbnVtZXJhdGlvbntcdGhlXGl0ZW1ub30lCi19Ci0KLSUgVGhlIHN0YXJ0aW5nIChsb3dlcmNhc2UpIGxldHRlciBpcyBpbiBcdGhlYXJnLgotXGRlZlxsb3dlcmNhc2VlbnVtZXJhdGV7JQotICBcaXRlbW5vID0gXGV4cGFuZGFmdGVyYFx0aGVhcmcKLSAgXHN0YXJ0ZW51bWVyYXRpb257JQotICAgICUgQmUgc3VyZSB3ZSdyZSBub3QgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGFscGhhYmV0LgotICAgIFxpZm51bVxpdGVtbm89MAotICAgICAgXGVycm1lc3NhZ2V7Tm8gbW9yZSBsb3dlcmNhc2UgbGV0dGVycyBpbiBAZW51bWVyYXRlOyBnZXQgYSBiaWdnZXIKLSAgICAgICAgICAgICAgICAgIGFscGhhYmV0fSUKLSAgICBcZmkKLSAgICBcY2hhclxsY2NvZGVcaXRlbW5vCi0gIH0lCi19Ci0KLSUgVGhlIHN0YXJ0aW5nICh1cHBlcmNhc2UpIGxldHRlciBpcyBpbiBcdGhlYXJnLgotXGRlZlx1cHBlcmNhc2VlbnVtZXJhdGV7JQotICBcaXRlbW5vID0gXGV4cGFuZGFmdGVyYFx0aGVhcmcKLSAgXHN0YXJ0ZW51bWVyYXRpb257JQotICAgICUgQmUgc3VyZSB3ZSdyZSBub3QgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGFscGhhYmV0LgotICAgIFxpZm51bVxpdGVtbm89MAotICAgICAgXGVycm1lc3NhZ2V7Tm8gbW9yZSB1cHBlcmNhc2UgbGV0dGVycyBpbiBAZW51bWVyYXRlOyBnZXQgYSBiaWdnZXIKLSAgICAgICAgICAgICAgICAgIGFscGhhYmV0fQotICAgIFxmaQotICAgIFxjaGFyXHVjY29kZVxpdGVtbm8KLSAgfSUKLX0KLQotJSBDYWxsIGl0ZW1pemV5LCBhZGRpbmcgYSBwZXJpb2QgdG8gdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCBzdXBwbHlpbmcgdGhlCi0lIGNvbW1vbiBsYXN0IHR3byBhcmd1bWVudHMuICBBbHNvIHN1YnRyYWN0IG9uZSBmcm9tIHRoZSBpbml0aWFsIHZhbHVlIGluCi0lIFxpdGVtbm8sIHNpbmNlIEBpdGVtIGluY3JlbWVudHMgXGl0ZW1uby4KLSUKLVxkZWZcc3RhcnRlbnVtZXJhdGlvbiMxeyUKLSAgXGFkdmFuY2VcaXRlbW5vIGJ5IC0xCi0gIFxpdGVtaXpleXsjMS59XEVlbnVtZXJhdGVcZmx1c2hjcgotfQotCi0lIEBhbHBoYWVudW1lcmF0ZSBhbmQgQGNhcHNlbnVtZXJhdGUgYXJlIGFiYnJldmlhdGlvbnMgZm9yIGdpdmluZyBhbiBhcmcKLSUgdG8gQGVudW1lcmF0ZS4KLSUKLVxkZWZcYWxwaGFlbnVtZXJhdGV7XGVudW1lcmF0ZXthfX0KLVxkZWZcY2Fwc2VudW1lcmF0ZXtcZW51bWVyYXRle0F9fQotXGRlZlxFYWxwaGFlbnVtZXJhdGV7XEVlbnVtZXJhdGV9Ci1cZGVmXEVjYXBzZW51bWVyYXRle1xFZW51bWVyYXRlfQotCi0lIERlZmluaXRpb24gb2YgQGl0ZW0gd2hpbGUgaW5zaWRlIEBpdGVtaXplLgotCi1cZGVmXGl0ZW1pemVpdGVteyUKLVxhZHZhbmNlXGl0ZW1ubyBieSAxCi17XGxldFxwYXI9XGVuZGdyYWYgXHNtYWxsYnJlYWt9JQotXGlmaG1vZGUgXGVycm1lc3NhZ2V7SW4gaG1vZGUgYXQgaXRlbWl6ZWl0ZW19XGZpCi17XHBhcnNraXA9MGluIFxoc2tpcCAwcHQKLVxoYm94IHRvIDBwdHtcaHNzIFxpdGVtY29udGVudHNcaHNraXAgXGl0ZW1tYXJnaW59JQotXHZhZGp1c3R7XHBlbmFsdHkgMTIwMH19JQotXGZsdXNoY3J9Ci0KLSUgQG11bHRpdGFibGUgbWFjcm9zCi0lIEFteSBIZW5kcmlja3NvbiwgOC8xOC85NCwgMy82Lzk2Ci0lCi0lIEBtdWx0aXRhYmxlIC4uLiBAZW5kIG11bHRpdGFibGUgd2lsbCBtYWtlIGFzIG1hbnkgY29sdW1ucyBhcyBkZXNpcmVkLgotJSBDb250ZW50cyBvZiBlYWNoIGNvbHVtbiB3aWxsIHdyYXAgYXQgd2lkdGggZ2l2ZW4gaW4gcHJlYW1ibGUuICBXaWR0aAotJSBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHNhbXBsZSB0ZXh0IGdpdmVuIGluIGEgdGVtcGxhdGUgbGluZSwKLSUgb3IgaW4gcGVyY2VudCBvZiBcaHNpemUsIHRoZSBjdXJyZW50IHdpZHRoIG9mIHRleHQgb24gcGFnZS4KLQotJSBUYWJsZSBjYW4gY29udGludWUgb3ZlciBwYWdlcyBidXQgd2lsbCBvbmx5IGJyZWFrIGJldHdlZW4gbGluZXMuCi0KLSUgVG8gbWFrZSBwcmVhbWJsZToKLSUKLSUgRWl0aGVyIGRlZmluZSB3aWR0aHMgb2YgY29sdW1ucyBpbiB0ZXJtcyBvZiBwZXJjZW50IG9mIFxoc2l6ZToKLSUgICBAbXVsdGl0YWJsZSBAY29sdW1uZnJhY3Rpb25zIC4yNSAuMyAuNDUKLSUgICBAaXRlbSAuLi4KLSUKLSUgICBOdW1iZXJzIGZvbGxvd2luZyBAY29sdW1uZnJhY3Rpb25zIGFyZSB0aGUgcGVyY2VudCBvZiB0aGUgdG90YWwKLSUgICBjdXJyZW50IGhzaXplIHRvIGJlIHVzZWQgZm9yIGVhY2ggY29sdW1uLiBZb3UgbWF5IHVzZSBhcyBtYW55Ci0lICAgY29sdW1ucyBhcyBkZXNpcmVkLgotCi0KLSUgT3IgdXNlIGEgdGVtcGxhdGU6Ci0lICAgQG11bHRpdGFibGUge0NvbHVtbiAxIHRlbXBsYXRlfSB7Q29sdW1uIDIgdGVtcGxhdGV9IHtDb2x1bW4gMyB0ZW1wbGF0ZX0KLSUgICBAaXRlbSAuLi4KLSUgICB1c2luZyB0aGUgd2lkZXN0IHRlcm0gZGVzaXJlZCBpbiBlYWNoIGNvbHVtbi4KLSUKLSUgRm9yIHRob3NlIHdobyB3YW50IHRvIHVzZSBtb3JlIHRoYW4gb25lIGxpbmUncyB3b3J0aCBvZiB3b3JkcyBpbgotJSB0aGUgcHJlYW1ibGUsIGJyZWFrIHRoZSBsaW5lIHdpdGhpbiBvbmUgYXJndW1lbnQgYW5kIGl0Ci0lIHdpbGwgcGFyc2UgY29ycmVjdGx5LCBpLmUuLAotJQotJSAgICAgQG11bHRpdGFibGUge0NvbHVtbiAxIHRlbXBsYXRlfSB7Q29sdW1uIDIgdGVtcGxhdGV9IHtDb2x1bW4gMwotJSAgICAgIHRlbXBsYXRlfQotJSBOb3Q6Ci0lICAgICBAbXVsdGl0YWJsZSB7Q29sdW1uIDEgdGVtcGxhdGV9IHtDb2x1bW4gMiB0ZW1wbGF0ZX0KLSUgICAgICB7Q29sdW1uIDMgdGVtcGxhdGV9Ci0KLSUgRWFjaCBuZXcgdGFibGUgbGluZSBzdGFydHMgd2l0aCBAaXRlbSwgZWFjaCBzdWJzZXF1ZW50IG5ldyBjb2x1bW4KLSUgc3RhcnRzIHdpdGggQHRhYi4gRW1wdHkgY29sdW1ucyBtYXkgYmUgcHJvZHVjZWQgYnkgc3VwcGx5aW5nIEB0YWIncwotJSB3aXRoIG5vdGhpbmcgYmV0d2VlbiB0aGVtIGZvciBhcyBtYW55IHRpbWVzIGFzIGVtcHR5IGNvbHVtbnMgYXJlIG5lZWRlZCwKLSUgaWUsIEB0YWJAdGFiQHRhYiB3aWxsIHByb2R1Y2UgdHdvIGVtcHR5IGNvbHVtbnMuCi0KLSUgQGl0ZW0sIEB0YWIsIEBtdWx0aXRhYmxlIG9yIEBlbmQgbXVsdGl0YWJsZSBkbyBub3QgbmVlZCB0byBiZSBvbiB0aGVpcgotJSBvd24gbGluZXMsIGJ1dCBpdCB3aWxsIG5vdCBodXJ0IGlmIHRoZXkgYXJlLgotCi0lIFNhbXBsZSBtdWx0aXRhYmxlOgotCi0lICAgQG11bHRpdGFibGUge0NvbHVtbiAxIHRlbXBsYXRlfSB7Q29sdW1uIDIgdGVtcGxhdGV9IHtDb2x1bW4gMyB0ZW1wbGF0ZX0KLSUgICBAaXRlbSBmaXJzdCBjb2wgc3R1ZmYgQHRhYiBzZWNvbmQgY29sIHN0dWZmIEB0YWIgdGhpcmQgY29sCi0lICAgQGl0ZW0KLSUgICBmaXJzdCBjb2wgc3R1ZmYKLSUgICBAdGFiCi0lICAgc2Vjb25kIGNvbCBzdHVmZgotJSAgIEB0YWIKLSUgICB0aGlyZCBjb2wKLSUgICBAaXRlbSBmaXJzdCBjb2wgc3R1ZmYgQHRhYiBzZWNvbmQgY29sIHN0dWZmCi0lICAgQHRhYiBNYW55IHBhcmFncmFwaHMgb2YgdGV4dCBtYXkgYmUgdXNlZCBpbiBhbnkgY29sdW1uLgotJQotJSAgICAgICAgIFRoZXkgd2lsbCB3cmFwIGF0IHRoZSB3aWR0aCBkZXRlcm1pbmVkIGJ5IHRoZSB0ZW1wbGF0ZS4KLSUgICBAaXRlbUB0YWJAdGFiIFRoaXMgd2lsbCBiZSBpbiB0aGlyZCBjb2x1bW4uCi0lICAgQGVuZCBtdWx0aXRhYmxlCi0KLSUgRGVmYXVsdCBkaW1lbnNpb25zIG1heSBiZSByZXNldCBieSB1c2VyLgotJSBAbXVsdGl0YWJsZXBhcnNraXAgaXMgdmVydGljYWwgc3BhY2UgYmV0d2VlbiBwYXJhZ3JhcGhzIGluIHRhYmxlLgotJSBAbXVsdGl0YWJsZXBhcmluZGVudCBpcyBwYXJhZ3JhcGggaW5kZW50IGluIHRhYmxlLgotJSBAbXVsdGl0YWJsZWNvbG1hcmdpbiBpcyBob3Jpem9udGFsIHNwYWNlIHRvIGJlIGxlZnQgYmV0d2VlbiBjb2x1bW5zLgotJSBAbXVsdGl0YWJsZWxpbmVzcGFjZSBpcyBzcGFjZSB0byBsZWF2ZSBiZXR3ZWVuIHRhYmxlIGl0ZW1zLCBiYXNlbGluZQotJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJhc2VsaW5lLgotJSAgIDBwdCBtZWFucyBpdCBkZXBlbmRzIG9uIGN1cnJlbnQgbm9ybWFsIGxpbmUgc3BhY2luZy4KLSUKLVxuZXdza2lwXG11bHRpdGFibGVwYXJza2lwCi1cbmV3c2tpcFxtdWx0aXRhYmxlcGFyaW5kZW50Ci1cbmV3ZGltZW5cbXVsdGl0YWJsZWNvbHNwYWNlCi1cbmV3c2tpcFxtdWx0aXRhYmxlbGluZXNwYWNlCi1cbXVsdGl0YWJsZXBhcnNraXA9MHB0Ci1cbXVsdGl0YWJsZXBhcmluZGVudD02cHQKLVxtdWx0aXRhYmxlY29sc3BhY2U9MTJwdAotXG11bHRpdGFibGVsaW5lc3BhY2U9MHB0Ci0KLSUgTWFjcm9zIHVzZWQgdG8gc2V0IHVwIGhhbGlnbiBwcmVhbWJsZToKLSUgCi1cbGV0XGVuZHNldHVwdGFibGVccmVsYXgKLVxkZWZceGVuZHNldHVwdGFibGV7XGVuZHNldHVwdGFibGV9Ci1cbGV0XGNvbHVtbmZyYWN0aW9uc1xyZWxheAotXGRlZlx4Y29sdW1uZnJhY3Rpb25ze1xjb2x1bW5mcmFjdGlvbnN9Ci1cbmV3aWZcaWZzZXRwZXJjZW50Ci0KLSUgMi8xLzk2LCB0byBhbGxvdyBmcmFjdGlvbnMgdG8gYmUgZ2l2ZW4gd2l0aCBtb3JlIHRoYW4gb25lIGRpZ2l0LgotXGRlZlxwaWNrdXB3aG9sZWZyYWN0aW9uIzEge1xnbG9iYWxcYWR2YW5jZVxjb2xjb3VudCBieTEgJQotXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIGNvbFx0aGVcY29sY291bnRcZW5kY3NuYW1ley4jMVxoc2l6ZX0lCi1cc2V0dXB0YWJsZX0KLQotXG5ld2NvdW50XGNvbGNvdW50Ci1cZGVmXHNldHVwdGFibGUjMXtcZGVmXGZpcnN0YXJneyMxfSUKLVxpZnhcZmlyc3RhcmdceGVuZHNldHVwdGFibGVcbGV0XGdvXHJlbGF4JQotXGVsc2UKLSAgXGlmeFxmaXJzdGFyZ1x4Y29sdW1uZnJhY3Rpb25zXGdsb2JhbFxzZXRwZXJjZW50dHJ1ZSUKLSAgXGVsc2UKLSAgICBcaWZzZXRwZXJjZW50Ci0gICAgICAgXGxldFxnb1xwaWNrdXB3aG9sZWZyYWN0aW9uICAgJSBJbiB0aGlzIGNhc2UgYXJnIG9mIHNldHVwdGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIGlzIHRoZSBkZWNpbWFsIHBvaW50IGJlZm9yZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIG51bWJlciBnaXZlbiBpbiBwZXJjZW50IG9mIGhzaXplLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgV2UgZG9uJ3QgbmVlZCB0aGlzIHNvIHdlIGRvbid0IHVzZSBpdC4KLSAgICBcZWxzZQotICAgICAgIFxnbG9iYWxcYWR2YW5jZVxjb2xjb3VudCBieTEKLSAgICAgICBcc2V0Ym94MD1caGJveHsjMSB9JSBBZGQgYSBub3JtYWwgd29yZCBzcGFjZSBhcyBhIHNlcGFyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJSB0eXBpY2FsbHkgdGhhdCBpcyBhbHdheXMgaW4gdGhlIGlucHV0LCBhbnl3YXkuCi0gICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIGNvbFx0aGVcY29sY291bnRcZW5kY3NuYW1le1x0aGVcd2QwfSUKLSAgICBcZmklCi0gIFxmaSUKLVxpZnhcZ29ccGlja3Vwd2hvbGVmcmFjdGlvblxlbHNlXGxldFxnb1xzZXR1cHRhYmxlXGZpJQotXGZpXGdvfQotCi0lIG11bHRpdGFibGUgc3ludGF4Ci1cZGVmXHRhYnsmXGhza2lwMXNwXHJlbGF4fSAlIDIvMi85NgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB0aW55IHNraXAgaGVyZSBtYWtlcyBzdXJlIHRoaXMgY29sdW1uIHNwYWNlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAlIG1haW50YWluZWQsIGV2ZW4gaWYgaXQgaXMgbmV2ZXIgdXNlZC4KLQotJSBAbXVsdGl0YWJsZSAuLi4gQGVuZCBtdWx0aXRhYmxlIGRlZmluaXRpb25zOgotCi1cZGVmXG11bHRpdGFibGV7XHBhcnNlYXJnXGRvdGFibGV9Ci1cZGVmXGRvdGFibGUjMXtcYmdyb3VwCi0gIFx2c2tpcFxwYXJza2lwCi0gIFxsZXRcaXRlbVxjcmNyCi0gIFx0b2xlcmFuY2U9OTUwMAotICBcaGJhZG5lc3M9OTUwMAotICBcc2V0bXVsdGl0YWJsZXNwYWNpbmcKLSAgXHBhcnNraXA9XG11bHRpdGFibGVwYXJza2lwCi0gIFxwYXJpbmRlbnQ9XG11bHRpdGFibGVwYXJpbmRlbnQKLSAgXG92ZXJmdWxscnVsZT0wcHQKLSAgXGdsb2JhbFxjb2xjb3VudD0wCi0gIFxkZWZcRW11bHRpdGFibGV7XGdsb2JhbFxzZXRwZXJjZW50ZmFsc2VcY3JcZWdyb3VwXGVncm91cH0lCi0gICUKLSAgJSBUbyBwYXJzZSBldmVyeXRoaW5nIGJldHdlZW4gQG11bHRpdGFibGUgYW5kIEBpdGVtOgotICBcc2V0dXB0YWJsZSMxIFxlbmRzZXR1cHRhYmxlCi0gICUKLSAgJSBcZXZlcnljciB3aWxsIHJlc2V0IGNvbHVtbiBjb3VudGVyLCBcY29sY291bnQsIGF0IHRoZSBlbmQgb2YKLSAgJSBlYWNoIGxpbmUuIEV2ZXJ5IGNvbHVtbiBlbnRyeSB3aWxsIGNhdXNlIFxjb2xjb3VudCB0byBhZHZhbmNlIGJ5IG9uZS4KLSAgJSBUaGUgdGFibGUgcHJlYW1ibGUKLSAgJSBsb29rcyBhdCB0aGUgY3VycmVudCBcY29sY291bnQgdG8gZmluZCB0aGUgY29ycmVjdCBjb2x1bW4gd2lkdGguCi0gIFxldmVyeWNye1xub2FsaWdueyUKLSAgJQotICAlIFxmaWxicmVhayUlIGtlZXBzIHVuZGVyZnVsbCBib3ggbWVzc2FnZXMgb2ZmIHdoZW4gdGFibGUgYnJlYWtzIG92ZXIgcGFnZXMuCi0gICUgTWF5YmUgc28sIGJ1dCBpdCBhbHNvIGNyZWF0ZXMgcmVhbGx5IHdlaXJkIHBhZ2UgYnJlYWtzIHdoZW4gdGhlIHRhYmxlCi0gICUgYnJlYWtzIG92ZXIgcGFnZXMuIFdvdWxkbid0IFx2ZmlsIGJlIGJldHRlcj8gIFdhaXQgdW50aWwgdGhlIHByb2JsZW0KLSAgJSBtYW5pZmVzdHMgaXRzZWxmLCBzbyBpdCBjYW4gYmUgZml4ZWQgZm9yIHJlYWwgLS1rYXJsLgotICAgIFxnbG9iYWxcY29sY291bnQ9MFxyZWxheH19JQotICAlCi0gICUgVGhpcyBwcmVhbWJsZSBzZXRzIHVwIGEgZ2VuZXJpYyBjb2x1bW4gZGVmaW5pdGlvbiwgd2hpY2ggd2lsbAotICAlIGJlIHVzZWQgYXMgbWFueSB0aW1lcyBhcyB1c2VyIGNhbGxzIGZvciBjb2x1bW5zLgotICAlIFx2dG9wIHdpbGwgc2V0IGEgc2luZ2xlIGxpbmUgYW5kIHdpbGwgYWxzbyBsZXQgdGV4dCB3cmFwIGFuZAotICAlIGNvbnRpbnVlIGZvciBtYW55IHBhcmFncmFwaHMgaWYgZGVzaXJlZC4KLSAgXGhhbGlnblxiZ3JvdXAmXGdsb2JhbFxhZHZhbmNlXGNvbGNvdW50IGJ5IDFccmVsYXgKLSAgICBcbXVsdGlzdHJ1dFx2dG9we1xoc2l6ZT1cZXhwYW5kYWZ0ZXJcY3NuYW1lIGNvbFx0aGVcY29sY291bnRcZW5kY3NuYW1lCi0gICUKLSAgJSBJbiBvcmRlciB0byBrZWVwIGVudHJpZXMgZnJvbSBidW1waW5nIGludG8gZWFjaCBvdGhlcgotICAlIHdlIHdpbGwgYWRkIGEgXGxlZnRza2lwIG9mIFxtdWx0aXRhYmxlY29sc3BhY2UgdG8gYWxsIGNvbHVtbnMgYWZ0ZXIKLSAgJSB0aGUgZmlyc3Qgb25lLgotICAlIAotICAlIElmIGEgdGVtcGxhdGUgaGFzIGJlZW4gdXNlZCwgd2Ugd2lsbCBhZGQgXG11bHRpdGFibGVjb2xzcGFjZQotICAlIHRvIHRoZSB3aWR0aCBvZiBlYWNoIHRlbXBsYXRlIGVudHJ5LgotICAlIAotICAlIElmIHRoZSB1c2VyIGhhcyBzZXQgcHJlYW1ibGUgaW4gdGVybXMgb2YgcGVyY2VudCBvZiBcaHNpemUgd2Ugd2lsbAotICAlIHVzZSB0aGF0IGRpbWVuc2lvbiBhcyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbiwgYW5kIHRoZSBcbGVmdHNraXAKLSAgJSB3aWxsIGtlZXAgZW50cmllcyBmcm9tIGJ1bXBpbmcgaW50byBlYWNoIG90aGVyLiAgVGFibGUgd2lsbCBzdGFydCBhdAotICAlIGxlZnQgbWFyZ2luIGFuZCBmaW5hbCBjb2x1bW4gd2lsbCBqdXN0aWZ5IGF0IHJpZ2h0IG1hcmdpbi4KLSAgJSAKLSAgJSBNYWtlIHN1cmUgd2UgZG9uJ3QgaW5oZXJpdCBccmlnaHRza2lwIGZyb20gdGhlIG91dGVyIGVudmlyb25tZW50LgotICBccmlnaHRza2lwPTBwdAotICBcaWZudW1cY29sY291bnQ9MQotICAgICUgVGhlIGZpcnN0IGNvbHVtbiB3aWxsIGJlIGluZGVudGVkIHdpdGggdGhlIHN1cnJvdW5kaW5nIHRleHQuCi0gICAgXGFkdmFuY2VcaHNpemUgYnlcbGVmdHNraXAKLSAgXGVsc2UKLSAgICBcaWZzZXRwZXJjZW50IFxlbHNlCi0gICAgICAlIElmIHVzZXIgaGFzIG5vdCBzZXQgcHJlYW1ibGUgaW4gdGVybXMgb2YgcGVyY2VudCBvZiBcaHNpemUKLSAgICAgICUgd2Ugd2lsbCBhZHZhbmNlIFxoc2l6ZSBieSBcbXVsdGl0YWJsZWNvbHNwYWNlLgotICAgICAgXGFkdmFuY2VcaHNpemUgYnkgXG11bHRpdGFibGVjb2xzcGFjZQotICAgIFxmaQotICAgJSBJbiBlaXRoZXIgY2FzZSB3ZSB3aWxsIG1ha2UgXGxlZnRza2lwPVxtdWx0aXRhYmxlY29sc3BhY2U6Ci0gIFxsZWZ0c2tpcD1cbXVsdGl0YWJsZWNvbHNwYWNlCi0gIFxmaQotICAlIElnbm9yaW5nIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBhdm9pZHMgYW4gb2NjYXNpb25hbCBzcHVyaW91cwotICAlIGJsYW5rIGxpbmUsIHdoZW4gVGVYIGRlY2lkZXMgdG8gYnJlYWsgdGhlIGxpbmUgYXQgdGhlIHNwYWNlIGJlZm9yZSB0aGUKLSAgJSBib3ggZnJvbSB0aGUgbXVsdGlzdHJ1dCwgc28gdGhlIHN0cnV0IGVuZHMgdXAgb24gYSBsaW5lIGJ5IGl0c2VsZi4KLSAgJSBGb3IgZXhhbXBsZToKLSAgJSBAbXVsdGl0YWJsZSBAY29sdW1uZnJhY3Rpb25zIC4xMSAuODkKLSAgJSBAaXRlbSBAY29kZXsjfQotICAlIEB0YWIgTGVnYWwgaG9saWRheSB3aGljaCBpcyB2YWxpZCBpbiBtYWpvciBwYXJ0cyBvZiB0aGUgd2hvbGUgY291bnRyeS4KLSAgJSBJcyBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIHdpdGggaGlnaGxpZ2h0aW5nIHNlcXVlbmNlcyByZXNwZWN0aXZlbHkgbWFya2luZwotICAlIGNoYXJhY3RlcnMuCi0gIFxub2luZGVudFxpZ25vcmVzcGFjZXMjI1x1bnNraXBcbXVsdGlzdHJ1dH1cY3IKLX0KLQotXGRlZlxzZXRtdWx0aXRhYmxlc3BhY2luZ3slIHRlc3QgdG8gc2VlIGlmIHVzZXIgaGFzIHNldCBcbXVsdGl0YWJsZWxpbmVzcGFjZS4KLSUgSWYgc28sIGRvIG5vdGhpbmcuIElmIG5vdCwgZ2l2ZSBpdCBhbiBhcHByb3ByaWF0ZSBkaW1lbnNpb24gYmFzZWQgb24KLSUgY3VycmVudCBiYXNlbGluZXNraXAuCi1caWZkaW1cbXVsdGl0YWJsZWxpbmVzcGFjZT0wcHQKLSUlIHN0cnV0IHRvIHB1dCBpbiB0YWJsZSBpbiBjYXNlIHNvbWUgZW50cnkgZG9lc24ndCBoYXZlIGRlc2NlbmRlcnMsCi0lJSB0byBrZWVwIGxpbmVzIGVxdWFsbHkgc3BhY2VkCi1cbGV0XG11bHRpc3RydXQgPSBcc3RydXQKLSUlIFRlc3QgdG8gc2VlIGlmIHBhcnNraXAgaXMgbGFyZ2VyIHRoYW4gc3BhY2UgYmV0d2VlbiBsaW5lcyBvZgotJSUgdGFibGUuIElmIG5vdCwgZG8gbm90aGluZy4KLSUlICAgICAgICBJZiBzbywgc2V0IHRvIHNhbWUgZGltZW5zaW9uIGFzIG11bHRpdGFibGVsaW5lc3BhY2UuCi1cZWxzZQotXGdkZWZcbXVsdGlzdHJ1dHtcdnJ1bGUgaGVpZ2h0XG11bHRpdGFibGVsaW5lc3BhY2UgZGVwdGhcZHAwCi13aWR0aDBwdFxyZWxheH0gXGZpCi1caWZkaW1cbXVsdGl0YWJsZXBhcnNraXA+XG11bHRpdGFibGVsaW5lc3BhY2UKLVxnbG9iYWxcbXVsdGl0YWJsZXBhcnNraXA9XG11bHRpdGFibGVsaW5lc3BhY2UKLVxnbG9iYWxcYWR2YW5jZVxtdWx0aXRhYmxlcGFyc2tpcC03cHQgJSUgdG8ga2VlcCBwYXJza2lwIHNvbWV3aGF0IHNtYWxsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSUgdGhhbiBza2lwIGJldHdlZW4gbGluZXMgaW4gdGhlIHRhYmxlLgotXGZpJQotXGlmZGltXG11bHRpdGFibGVwYXJza2lwPTBwdAotXGdsb2JhbFxtdWx0aXRhYmxlcGFyc2tpcD1cbXVsdGl0YWJsZWxpbmVzcGFjZQotXGdsb2JhbFxhZHZhbmNlXG11bHRpdGFibGVwYXJza2lwLTdwdCAlJSB0byBrZWVwIHBhcnNraXAgc29tZXdoYXQgc21hbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlJSB0aGFuIHNraXAgYmV0d2VlbiBsaW5lcyBpbiB0aGUgdGFibGUuCi1cZml9Ci0KLQotXG1lc3NhZ2V7aW5kZXhpbmcsfQotJSBJbmRleCBnZW5lcmF0aW9uIGZhY2lsaXRpZXMKLQotJSBEZWZpbmUgXG5ld3dyaXRlIHRvIGJlIGlkZW50aWNhbCB0byBwbGFpbiB0ZXgncyBcbmV3d3JpdGUKLSUgZXhjZXB0IG5vdCBcb3V0ZXIsIHNvIGl0IGNhbiBiZSB1c2VkIHdpdGhpbiBcbmV3aW5kZXguCi17XGNhdGNvZGVgXEA9MTEKLVxnZGVmXG5ld3dyaXRle1xhbGxvY0A3XHdyaXRlXGNoYXJkZWZcc2l4dEBAbn19Ci0KLSUgXG5ld2luZGV4IHtmb299IGRlZmluZXMgYW4gaW5kZXggbmFtZWQgZm9vLgotJSBJdCBhdXRvbWF0aWNhbGx5IGRlZmluZXMgXGZvb2luZGV4IHN1Y2ggdGhhdAotJSBcZm9vaW5kZXggLi4ucmVzdCBvZiBsaW5lLi4uIHB1dHMgYW4gZW50cnkgaW4gdGhlIGluZGV4IGZvby4KLSUgSXQgYWxzbyBkZWZpbmVzIFxmb29pbmRmaWxlIHRvIGJlIHRoZSBudW1iZXIgb2YgdGhlIG91dHB1dCBjaGFubmVsIGZvcgotJSB0aGUgZmlsZSB0aGF0IGFjY3VtdWxhdGVzIHRoaXMgaW5kZXguICBUaGUgZmlsZSdzIGV4dGVuc2lvbiBpcyBmb28uCi0lIFRoZSBuYW1lIG9mIGFuIGluZGV4IHNob3VsZCBiZSBubyBtb3JlIHRoYW4gMiBjaGFyYWN0ZXJzIGxvbmcKLSUgZm9yIHRoZSBzYWtlIG9mIHZtcy4KLSUKLVxkZWZcbmV3aW5kZXgjMXslCi0gIFxpZmxpbmtzCi0gICAgXGV4cGFuZGFmdGVyXG5ld3dyaXRlIFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lCi0gICAgXG9wZW5vdXQgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUgXGpvYm5hbWUuIzEgJSBPcGVuIHRoZSBmaWxlCi0gIFxmaQotICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslICAgICAlIERlZmluZSBAIzFpbmRleAotICAgIFxub2V4cGFuZFxkb2luZGV4eyMxfX0KLX0KLQotJSBAZGVmaW5kZXggZm9vICA9PSAgXG5ld2luZGV4e2Zvb30KLQotXGRlZlxkZWZpbmRleHtccGFyc2VhcmdcbmV3aW5kZXh9Ci0KLSUgRGVmaW5lIEBkZWZjb2RlaW5kZXgsIGxpa2UgQGRlZmluZGV4IGV4Y2VwdCBwdXQgYWxsIGVudHJpZXMgaW4gQGNvZGUuCi0KLVxkZWZcbmV3Y29kZWluZGV4IzF7JQotICBcaWZsaW5rcwotICAgIFxleHBhbmRhZnRlclxuZXd3cml0ZSBcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZQotICAgIFxvcGVub3V0IFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lIFxqb2JuYW1lLiMxCi0gIFxmaQotICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslCi0gICAgXG5vZXhwYW5kXGRvY29kZWluZGV4eyMxfX0KLX0KLQotXGRlZlxkZWZjb2RlaW5kZXh7XHBhcnNlYXJnXG5ld2NvZGVpbmRleH0KLQotJSBAc3luaW5kZXggZm9vIGJhciAgICBtYWtlcyBpbmRleCBmb28gZmVlZCBpbnRvIGluZGV4IGJhci4KLSUgRG8gdGhpcyBpbnN0ZWFkIG9mIEBkZWZpbmRleCBmb28gaWYgeW91IGRvbid0IHdhbnQgaXQgYXMgYSBzZXBhcmF0ZSBpbmRleC4KLSUgVGhlIFxjbG9zZW91dCBoZWxwcyByZWR1Y2UgdW5uZWNlc3Nhcnkgb3BlbiBmaWxlczsgdGhlIGxpbWl0IG9uIHRoZQotJSBBY29ybiBSSVNDIE9TIGlzIGEgbWVyZSAxNiBmaWxlcy4KLVxkZWZcc3luaW5kZXgjMSAjMiB7JQotICBcZXhwYW5kYWZ0ZXJcbGV0XGV4cGFuZGFmdGVyXHN5bmluZGV4Zm9vXGV4cGFuZGFmdGVyPVxjc25hbWUjMmluZGZpbGVcZW5kY3NuYW1lCi0gIFxleHBhbmRhZnRlclxjbG9zZW91dFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lCi0gIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZT1cc3luaW5kZXhmb28KLSAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIzFpbmRleFxlbmRjc25hbWV7JSBkZWZpbmUgXHh4eGluZGV4Ci0gICAgXG5vZXhwYW5kXGRvaW5kZXh7IzJ9fSUKLX0KLQotJSBAc3luY29kZWluZGV4IGZvbyBiYXIgICBzaW1pbGFyLCBidXQgcHV0IGFsbCBlbnRyaWVzIG1hZGUgZm9yIGluZGV4IGZvbwotJSBpbnNpZGUgQGNvZGUuCi1cZGVmXHN5bmNvZGVpbmRleCMxICMyIHslCi0gIFxleHBhbmRhZnRlclxsZXRcZXhwYW5kYWZ0ZXJcc3luaW5kZXhmb29cZXhwYW5kYWZ0ZXI9XGNzbmFtZSMyaW5kZmlsZVxlbmRjc25hbWUKLSAgXGV4cGFuZGFmdGVyXGNsb3Nlb3V0XGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUKLSAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lPVxzeW5pbmRleGZvbwotICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslIGRlZmluZSBceHh4aW5kZXgKLSAgICBcbm9leHBhbmRcZG9jb2RlaW5kZXh7IzJ9fSUKLX0KLQotJSBEZWZpbmUgXGRvaW5kZXgsIHRoZSBkcml2ZXIgZm9yIGFsbCBcZm9vaW5kZXggbWFjcm9zLgotJSBBcmd1bWVudCAjMSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxpbmcgXGZvb2luZGV4IG1hY3JvLAotJSAgYW5kIGl0IGlzICJmb28iLCB0aGUgbmFtZSBvZiB0aGUgaW5kZXguCi0KLSUgXGRvaW5kZXgganVzdCB1c2VzIFxwYXJzZWFyZzsgaXQgY2FsbHMgXGRvaW5kIGZvciB0aGUgYWN0dWFsIHdvcmsuCi0lIFRoaXMgaXMgYmVjYXVzZSBcZG9pbmQgaXMgbW9yZSB1c2VmdWwgdG8gY2FsbCBmcm9tIG90aGVyIG1hY3Jvcy4KLQotJSBUaGVyZSBpcyBhbHNvIFxkb3N1YmluZCB7aW5kZXh9e3RvcGljfXtzdWJ0b3BpY30KLSUgd2hpY2ggbWFrZXMgYW4gZW50cnkgaW4gYSB0d28tbGV2ZWwgaW5kZXggc3VjaCBhcyB0aGUgb3BlcmF0aW9uIGluZGV4LgotCi1cZGVmXGRvaW5kZXgjMXtcZWRlZlxpbmRleG5hbWV7IzF9XHBhcnNlYXJnXHNpbmdsZWluZGV4ZXJ9Ci1cZGVmXHNpbmdsZWluZGV4ZXIgIzF7XGRvaW5ke1xpbmRleG5hbWV9eyMxfX0KLQotJSBsaWtlIHRoZSBwcmV2aW91cyB0d28sIGJ1dCB0aGV5IHB1dCBAY29kZSBhcm91bmQgdGhlIGFyZ3VtZW50LgotXGRlZlxkb2NvZGVpbmRleCMxe1xlZGVmXGluZGV4bmFtZXsjMX1ccGFyc2Vhcmdcc2luZ2xlY29kZWluZGV4ZXJ9Ci1cZGVmXHNpbmdsZWNvZGVpbmRleGVyICMxe1xkb2luZHtcaW5kZXhuYW1lfXtcY29kZXsjMX19fQotCi1cZGVmXGluZGV4ZHVtbWllc3slCi1cZGVmXCB7IH0lCi0lIFRha2UgY2FyZSBvZiB0aGUgcGxhaW4gdGV4IGFjY2VudCBjb21tYW5kcy4KLVxkZWZcIntccmVhbGJhY2tzbGFzaCAifSUKLVxkZWZcYHtccmVhbGJhY2tzbGFzaCBgfSUKLVxkZWZcJ3tccmVhbGJhY2tzbGFzaCAnfSUKLVxkZWZcXntccmVhbGJhY2tzbGFzaCBefSUKLVxkZWZcfntccmVhbGJhY2tzbGFzaCB+fSUKLVxkZWZcPXtccmVhbGJhY2tzbGFzaCA9fSUKLVxkZWZcYntccmVhbGJhY2tzbGFzaCBifSUKLVxkZWZcY3tccmVhbGJhY2tzbGFzaCBjfSUKLVxkZWZcZHtccmVhbGJhY2tzbGFzaCBkfSUKLVxkZWZcdXtccmVhbGJhY2tzbGFzaCB1fSUKLVxkZWZcdntccmVhbGJhY2tzbGFzaCB2fSUKLVxkZWZcSHtccmVhbGJhY2tzbGFzaCBIfSUKLSUgVGFrZSBjYXJlIG9mIHRoZSBwbGFpbiB0ZXggc3BlY2lhbCBFdXJvcGVhbiBtb2RpZmllZCBsZXR0ZXJzLgotXGRlZlxvZXtccmVhbGJhY2tzbGFzaCBvZX0lCi1cZGVmXGFle1xyZWFsYmFja3NsYXNoIGFlfSUKLVxkZWZcYWF7XHJlYWxiYWNrc2xhc2ggYWF9JQotXGRlZlxPRXtccmVhbGJhY2tzbGFzaCBPRX0lCi1cZGVmXEFFe1xyZWFsYmFja3NsYXNoIEFFfSUKLVxkZWZcQUF7XHJlYWxiYWNrc2xhc2ggQUF9JQotXGRlZlxve1xyZWFsYmFja3NsYXNoIG99JQotXGRlZlxPe1xyZWFsYmFja3NsYXNoIE99JQotXGRlZlxse1xyZWFsYmFja3NsYXNoIGx9JQotXGRlZlxMe1xyZWFsYmFja3NsYXNoIEx9JQotXGRlZlxzc3tccmVhbGJhY2tzbGFzaCBzc30lCi0lIFRha2UgY2FyZSBvZiB0ZXhpbmZvIGNvbW1hbmRzIGxpa2VseSB0byBhcHBlYXIgaW4gYW4gaW5kZXggZW50cnkuCi0lIChNdXN0IGJlIGEgd2F5IHRvIGF2b2lkIGRvaW5nIGV4cGFuc2lvbiBhdCBhbGwsIGFuZCB0aHVzIG5vdCBoYXZlIHRvCi0lIGxhYm9yaW91c2x5IGxpc3QgZXZlcnkgc2luZ2xlIGNvbW1hbmQgaGVyZS4pCi1cZGVmXEB7QH0lIHdpbGwgYmUgQEAgd2hlbiB3ZSBzd2l0Y2ggdG8gQCBhcyBlc2NhcGUgY2hhci4KLSVcbGV0XHsgPSBcbGJyYWNlY21kCi0lXGxldFx9ID0gXHJicmFjZWNtZAotXGRlZlxfe3tccmVhbGJhY2tzbGFzaCBffX0lCi1cZGVmXHd7XHJlYWxiYWNrc2xhc2ggdyB9JQotXGRlZlxiZntccmVhbGJhY2tzbGFzaCBiZiB9JQotJVxkZWZccm17XHJlYWxiYWNrc2xhc2ggcm0gfSUKLVxkZWZcc2x7XHJlYWxiYWNrc2xhc2ggc2wgfSUKLVxkZWZcc2Z7XHJlYWxiYWNrc2xhc2ggc2Z9JQotXGRlZlx0dHtccmVhbGJhY2tzbGFzaCB0dH0lCi1cZGVmXGd0cntccmVhbGJhY2tzbGFzaCBndHJ9JQotXGRlZlxsZXNze1xyZWFsYmFja3NsYXNoIGxlc3N9JQotXGRlZlxoYXR7XHJlYWxiYWNrc2xhc2ggaGF0fSUKLVxkZWZcVGVYe1xyZWFsYmFja3NsYXNoIFRlWH0lCi1cZGVmXGRvdHN7XHJlYWxiYWNrc2xhc2ggZG90cyB9JQotXGRlZlxyZXN1bHR7XHJlYWxiYWNrc2xhc2ggcmVzdWx0fSUKLVxkZWZcZXF1aXZ7XHJlYWxiYWNrc2xhc2ggZXF1aXZ9JQotXGRlZlxleHBhbnNpb257XHJlYWxiYWNrc2xhc2ggZXhwYW5zaW9ufSUKLVxkZWZccHJpbnR7XHJlYWxiYWNrc2xhc2ggcHJpbnR9JQotXGRlZlxlcnJvcntccmVhbGJhY2tzbGFzaCBlcnJvcn0lCi1cZGVmXHBvaW50e1xyZWFsYmFja3NsYXNoIHBvaW50fSUKLVxkZWZcY29weXJpZ2h0e1xyZWFsYmFja3NsYXNoIGNvcHlyaWdodH0lCi1cZGVmXHRjbG9zZSMjMXtccmVhbGJhY2tzbGFzaCB0Y2xvc2UgeyMjMX19JQotXGRlZlxjb2RlIyMxe1xyZWFsYmFja3NsYXNoIGNvZGUgeyMjMX19JQotXGRlZlxkb3RsZXNzIyMxe1xyZWFsYmFja3NsYXNoIGRvdGxlc3MgeyMjMX19JQotXGRlZlxzYW1wIyMxe1xyZWFsYmFja3NsYXNoIHNhbXAgeyMjMX19JQotXGRlZlwsIyMxe1xyZWFsYmFja3NsYXNoICx7IyMxfX0lCi1cZGVmXHQjIzF7XHJlYWxiYWNrc2xhc2ggdCB7IyMxfX0lCi1cZGVmXHIjIzF7XHJlYWxiYWNrc2xhc2ggciB7IyMxfX0lCi1cZGVmXGkjIzF7XHJlYWxiYWNrc2xhc2ggaSB7IyMxfX0lCi1cZGVmXGIjIzF7XHJlYWxiYWNrc2xhc2ggYiB7IyMxfX0lCi1cZGVmXHNjIyMxe1xyZWFsYmFja3NsYXNoIHNjIHsjIzF9fSUKLVxkZWZcY2l0ZSMjMXtccmVhbGJhY2tzbGFzaCBjaXRlIHsjIzF9fSUKLVxkZWZca2V5IyMxe1xyZWFsYmFja3NsYXNoIGtleSB7IyMxfX0lCi1cZGVmXGZpbGUjIzF7XHJlYWxiYWNrc2xhc2ggZmlsZSB7IyMxfX0lCi1cZGVmXHZhciMjMXtccmVhbGJhY2tzbGFzaCB2YXIgeyMjMX19JQotXGRlZlxrYmQjIzF7XHJlYWxiYWNrc2xhc2gga2JkIHsjIzF9fSUKLVxkZWZcZGZuIyMxe1xyZWFsYmFja3NsYXNoIGRmbiB7IyMxfX0lCi1cZGVmXGVtcGgjIzF7XHJlYWxiYWNrc2xhc2ggZW1waCB7IyMxfX0lCi0lCi0lIEhhbmRsZSBzb21lIGNhc2VzIG9mIEB2YWx1ZSAtLSB3aGVyZSB0aGUgdmFyaWFibGUgbmFtZSBkb2VzIG5vdAotJSBjb250YWluIC0gb3IgXywgYW5kIHRoZSB2YWx1ZSBkb2VzIG5vdCBjb250YWluIGFueQotJSAobm9uLWZ1bGx5LWV4cGFuZGFibGUpIGNvbW1hbmRzLgotXGxldFx2YWx1ZSA9IFxleHBhbmRhYmxldmFsdWUKLSUKLVx1bnNlcHNwYWNlcwotfQotCi0lIElmIGFuIGluZGV4IGNvbW1hbmQgaXMgdXNlZCBpbiBhbiBAZXhhbXBsZSBlbnZpcm9ubWVudCwgYW55IHNwYWNlcwotJSB0aGVyZWluIHNob3VsZCBiZWNvbWUgcmVndWxhciBzcGFjZXMgaW4gdGhlIHJhdyBpbmRleCBmaWxlLCBub3QgdGhlCi0lIGV4cGFuc2lvbiBvZiBcdGllIChcXGxlYXZldm1vZGUgXHBlbmFsdHkgXEBNIFwgKS4KLXtcb2JleXNwYWNlcwotIFxnZGVmXHVuc2Vwc3BhY2Vze1xvYmV5c3BhY2VzXGxldCA9XHNwYWNlfX0KLQotJSBcaW5kZXhub2ZvbnRzIG5vLW9wcyBhbGwgZm9udC1jaGFuZ2UgY29tbWFuZHMuCi0lIFRoaXMgaXMgdXNlZCB3aGVuIG91dHB1dHRpbmcgdGhlIHN0cmluZ3MgdG8gc29ydCB0aGUgaW5kZXggYnkuCi1cZGVmXGluZGV4ZHVtbXlmb250IzF7IzF9Ci1cZGVmXGluZGV4ZHVtbXl0ZXh7VGVYfQotXGRlZlxpbmRleGR1bW15ZG90c3suLi59Ci0KLVxkZWZcaW5kZXhub2ZvbnRzeyUKLSUgSnVzdCBpZ25vcmUgYWNjZW50cy4KLVxsZXRcLD1caW5kZXhkdW1teWZvbnQKLVxsZXRcIj1caW5kZXhkdW1teWZvbnQKLVxsZXRcYD1caW5kZXhkdW1teWZvbnQKLVxsZXRcJz1caW5kZXhkdW1teWZvbnQKLVxsZXRcXj1caW5kZXhkdW1teWZvbnQKLVxsZXRcfj1caW5kZXhkdW1teWZvbnQKLVxsZXRcPT1caW5kZXhkdW1teWZvbnQKLVxsZXRcYj1caW5kZXhkdW1teWZvbnQKLVxsZXRcYz1caW5kZXhkdW1teWZvbnQKLVxsZXRcZD1caW5kZXhkdW1teWZvbnQKLVxsZXRcdT1caW5kZXhkdW1teWZvbnQKLVxsZXRcdj1caW5kZXhkdW1teWZvbnQKLVxsZXRcSD1caW5kZXhkdW1teWZvbnQKLVxsZXRcZG90bGVzcz1caW5kZXhkdW1teWZvbnQKLSUgVGFrZSBjYXJlIG9mIHRoZSBwbGFpbiB0ZXggc3BlY2lhbCBFdXJvcGVhbiBtb2RpZmllZCBsZXR0ZXJzLgotXGRlZlxvZXtvZX0lCi1cZGVmXGFle2FlfSUKLVxkZWZcYWF7YWF9JQotXGRlZlxPRXtPRX0lCi1cZGVmXEFFe0FFfSUKLVxkZWZcQUF7QUF9JQotXGRlZlxve299JQotXGRlZlxPe099JQotXGRlZlxse2x9JQotXGRlZlxMe0x9JQotXGRlZlxzc3tzc30lCi1cbGV0XHc9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHQ9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHI9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGk9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGI9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGVtcGg9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHN0cm9uZz1caW5kZXhkdW1teWZvbnQKLVxsZXRcY2l0ZT1caW5kZXhkdW1teWZvbnQKLVxsZXRcc2M9XGluZGV4ZHVtbXlmb250Ci0lRG9uJ3Qgbm8tb3AgXHR0LCBzaW5jZSBpdCBpc24ndCBhIHVzZXItbGV2ZWwgY29tbWFuZAotJSBhbmQgaXMgdXNlZCBpbiB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGFjdGl2ZSBjaGFycyBsaWtlIDwsID4sIHwuLi4KLSVcbGV0XHR0PVxpbmRleGR1bW15Zm9udAotXGxldFx0Y2xvc2U9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGNvZGU9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGZpbGU9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHNhbXA9XGluZGV4ZHVtbXlmb250Ci1cbGV0XGtiZD1caW5kZXhkdW1teWZvbnQKLVxsZXRca2V5PVxpbmRleGR1bW15Zm9udAotXGxldFx2YXI9XGluZGV4ZHVtbXlmb250Ci1cbGV0XFRlWD1caW5kZXhkdW1teXRleAotXGxldFxkb3RzPVxpbmRleGR1bW15ZG90cwotXGRlZlxAe0B9JQotfQotCi0lIFRvIGRlZmluZSBccmVhbGJhY2tzbGFzaCwgd2UgbXVzdCBtYWtlIFwgbm90IGJlIGFuIGVzY2FwZS4KLSUgV2UgbXVzdCBmaXJzdCBtYWtlIGFub3RoZXIgY2hhcmFjdGVyIChAKSBhbiBlc2NhcGUKLSUgc28gd2UgZG8gbm90IGJlY29tZSB1bmFibGUgdG8gZG8gYSBkZWZpbml0aW9uLgotCi17XGNhdGNvZGVgXEA9MCBcY2F0Y29kZWBcXD1cb3RoZXIKLSBAZ2RlZkByZWFsYmFja3NsYXNoe1x9fQotCi1cbGV0XGluZGV4YmFja3NsYXNoPTAgICVvdmVycmlkZGVuIGR1cmluZyBccHJpbnRpbmRleC4KLVxsZXRcU0VUbWFyZ2luaW5kZXg9XHJlbGF4ICUgcHV0IGluZGV4IGVudHJpZXMgaW4gbWFyZ2luICh1bmRvY3VtZW50ZWQpPwotCi0lIEZvciBcaWZ4IGNvbXBhcmlzb25zLgotXGRlZlxlbXB0eW1hY3Jve1xlbXB0eX0KLQotJSBNb3N0IGluZGV4IGVudHJpZXMgZ28gdGhyb3VnaCBoZXJlLCBidXQgXGRvc3ViaW5kIGlzIHRoZSBnZW5lcmFsIGNhc2UuCi0lIAotXGRlZlxkb2luZCMxIzJ7XGRvc3ViaW5keyMxfXsjMn1cZW1wdHl9Ci0KLSUgV29ya2hvcnNlIGZvciBhbGwgXGZvb2luZGV4ZXMuCi0lICMxIGlzIG5hbWUgb2YgaW5kZXgsICMyIGlzIHN0dWZmIHRvIHB1dCB0aGVyZSwgIzMgaXMgc3ViZW50cnkgLS0KLSUgXGVtcHR5IGlmIGNhbGxlZCBmcm9tIFxkb2luZCwgYXMgd2UgdXN1YWxseSBhcmUuICBUaGUgbWFpbiBleGNlcHRpb24KLSUgaXMgd2l0aCBkZWZ1bnMsIHdoaWNoIGNhbGwgdXMgZGlyZWN0bHkuCi0lIAotXGRlZlxkb3N1YmluZCMxIzIjM3slCi0gICUgUHV0IHRoZSBpbmRleCBlbnRyeSBpbiB0aGUgbWFyZ2luIGlmIGRlc2lyZWQuCi0gIFxpZnhcU0VUbWFyZ2luaW5kZXhccmVsYXhcZWxzZQotICAgIFxpbnNlcnRcbWFyZ2lue1xoYm94e1x2cnVsZSBoZWlnaHQ4cHQgZGVwdGgzcHQgd2lkdGgwcHQgIzJ9fSUKLSAgXGZpCi0gIHslCi0gICAgXGNvdW50MjU1PVxsYXN0cGVuYWx0eQotICAgIHslCi0gICAgICBcaW5kZXhkdW1taWVzICUgTXVzdCBkbyB0aGlzIGhlcmUsIHNpbmNlIFxiZiwgZXRjIGV4cGFuZCBhdCB0aGlzIHN0YWdlCi0gICAgICBcZXNjYXBlY2hhcj1gXFwKLSAgICAgIHslCi0gICAgICAgIFxsZXRcZm9saW8gPSAwJSBXZSB3aWxsIGV4cGFuZCBhbGwgbWFjcm9zIG5vdyBFWENFUFQgXGZvbGlvLgotICAgICAgICBcZGVmXHJhd2JhY2tzbGFzaHh4e1xpbmRleGJhY2tzbGFzaH0lIFxpbmRleGJhY2tzbGFzaCBpc24ndCBkZWZpbmVkIG5vdwotICAgICAgICAlIHNvIGl0IHdpbGwgYmUgb3V0cHV0IGFzIGlzOyBhbmQgaXQgd2lsbCBwcmludCBhcyBiYWNrc2xhc2guCi0gICAgICAgICUKLSAgICAgICAgXGRlZlx0aGlyZGFyZ3sjM30lCi0gICAgICAgICUKLSAgICAgICAgJSBJZiB0aGlyZCBhcmcgaXMgcHJlc2VudCwgcHJlY2VkZSBpdCB3aXRoIHNwYWNlIGluIHNvcnQga2V5LgotICAgICAgICBcaWZ4XHRoaXJkYXJnXGVtcHR5bWFjcm8KLSAgICAgICAgICBcbGV0XHN1YmVudHJ5ID0gXGVtcHR5Ci0gICAgICAgIFxlbHNlCi0gICAgICAgICAgXGRlZlxzdWJlbnRyeXsgIzN9JQotICAgICAgICBcZmkKLSAgICAgICAgJQotICAgICAgICAlIEZpcnN0IHByb2Nlc3MgdGhlIGluZGV4LXN0cmluZyB3aXRoIGFsbCBmb250IGNvbW1hbmRzIHR1cm5lZCBvZmYKLSAgICAgICAgJSB0byBnZXQgdGhlIHN0cmluZyB0byBzb3J0IGJ5LgotICAgICAgICB7XGluZGV4bm9mb250cyBceGRlZlxpbmRleHNvcnR0bXB7IzJcc3ViZW50cnl9fSUKLSAgICAgICAgJQotICAgICAgICAlIE5vdyBwcm9kdWNlIHRoZSBjb21wbGV0ZSBpbmRleCBlbnRyeSwgd2l0aCBib3RoIHRoZSBzb3J0IGtleSBhbmQgdGhlCi0gICAgICAgICUgb3JpZ2luYWwgdGV4dCwgaW5jbHVkaW5nIGFueSBmb250IGNvbW1hbmRzLgotICAgICAgICBcdG9rczAgPSB7IzJ9JQotICAgICAgICBcZWRlZlx0ZW1weyUKLSAgICAgICAgICBcd3JpdGVcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZXslCi0gICAgICAgICAgICBccmVhbGJhY2tzbGFzaCBlbnRyeXtcaW5kZXhzb3J0dG1wfXtcZm9saW99e1x0aGVcdG9rczB9fSUKLSAgICAgICAgfSUKLSAgICAgICAgJQotICAgICAgICAlIElmIHRoaXJkIChzdWJlbnRyeSkgYXJnIGlzIHByZXNlbnQsIGFkZCBpdCB0byB0aGUgaW5kZXggc3RyaW5nLgotICAgICAgICBcaWZ4XHRoaXJkYXJnXGVtcHR5bWFjcm8gXGVsc2UKLSAgICAgICAgICBcdG9rczAgPSB7IzN9JQotICAgICAgICAgIFxlZGVmXHRlbXB7XHRlbXB7XHRoZVx0b2tzMH19JQotICAgICAgICBcZmkKLSAgICAgICAgJQotICAgICAgICAlIElmIGEgc2tpcCBpcyB0aGUgbGFzdCB0aGluZyBvbiB0aGUgbGlzdCBub3csIHByZXNlcnZlIGl0Ci0gICAgICAgICUgYnkgYmFja2luZyB1cCBieSBcbGFzdHNraXAsIGRvaW5nIHRoZSBcd3JpdGUsIHRoZW4gaW5zZXJ0aW5nCi0gICAgICAgICUgdGhlIHNraXAgYWdhaW4uICBPdGhlcndpc2UsIHRoZSB3aGF0c2l0IGdlbmVyYXRlZCBieSB0aGUKLSAgICAgICAgJSBcd3JpdGUgd2lsbCBtYWtlIFxsYXN0c2tpcCB6ZXJvLiAgVGhlIHJlc3VsdCBpcyB0aGF0IHNlcXVlbmNlcwotICAgICAgICAlIGxpa2UgdGhpczoKLSAgICAgICAgJSBAZW5kIGRlZnVuCi0gICAgICAgICUgQHRpbmRleCB3aGF0ZXZlcgotICAgICAgICAlIEBkZWZ1biAuLi4KLSAgICAgICAgJSB3aWxsIGhhdmUgZXh0cmEgc3BhY2UgaW5zZXJ0ZWQsIGJlY2F1c2UgdGhlIFxtZWRicmVhayBpbiB0aGUKLSAgICAgICAgJSBzdGFydCBvZiB0aGUgQGRlZnVuIHdvbid0IHNlZSB0aGUgc2tpcCBpbnNlcnRlZCBieSB0aGUgQGVuZCBvZgotICAgICAgICAlIHRoZSBwcmV2aW91cyBkZWZ1bi4KLSAgICAgICAgJSAKLSAgICAgICAgJSBCdXQgZG9uJ3QgZG8gYW55IG9mIHRoaXMgaWYgd2UncmUgbm90IGluIHZlcnRpY2FsIG1vZGUuICBXZQotICAgICAgICAlIGRvbid0IHdhbnQgdG8gZG8gYSBcdnNraXAgYW5kIHByZW1hdHVyZWx5IGVuZCBhIHBhcmFncmFwaC4KLSAgICAgICAgJSAKLSAgICAgICAgJSBBdm9pZCBwYWdlIGJyZWFrcyBkdWUgdG8gdGhlc2UgZXh0cmEgc2tpcHMsIHRvby4KLSAgICAgICAgJSAKLSAgICAgICAgXGlmbGlua3MKLSAgICAgICAgICBcaWZ2bW9kZQotICAgICAgICAgICAgXHNraXAwID0gXGxhc3Rza2lwCi0gICAgICAgICAgICBcaWZkaW1cbGFzdHNraXAgPSAwcHQgXGVsc2UgXG5vYnJlYWtcdnNraXAtXGxhc3Rza2lwIFxmaQotICAgICAgICAgIFxmaQotICAgICAgICAgICUKLSAgICAgICAgICBcdGVtcCAlIGRvIHRoZSB3cml0ZQotICAgICAgICAgICUKLSAgICAgICAgICAlIAotICAgICAgICAgIFxpZnZtb2RlIFxpZmRpbVxza2lwMCA9IDBwdCBcZWxzZSBcbm9icmVha1x2c2tpcFxza2lwMCBcZmkgXGZpCi0gICAgICAgIFxmaQotICAgICAgfSUKLSAgICB9JQotICAgIFxwZW5hbHR5XGNvdW50MjU1Ci0gIH0lCi19Ci0KLSUgVGhlIGluZGV4IGVudHJ5IHdyaXR0ZW4gaW4gdGhlIGZpbGUgYWN0dWFsbHkgbG9va3MgbGlrZQotJSAgXGVudHJ5IHtzb3J0c3RyaW5nfXtwYWdlfXt0b3BpY30KLSUgb3IKLSUgIFxlbnRyeSB7c29ydHN0cmluZ317cGFnZX17dG9waWN9e3N1YnRvcGljfQotJSBUaGUgdGV4aW5kZXggcHJvZ3JhbSByZWFkcyBpbiB0aGVzZSBmaWxlcyBhbmQgd3JpdGVzIGZpbGVzCi0lIGNvbnRhaW5pbmcgdGhlc2Uga2luZHMgb2YgbGluZXM6Ci0lICBcaW5pdGlhbCB7Y30KLSUgICAgIGJlZm9yZSB0aGUgZmlyc3QgdG9waWMgd2hvc2UgaW5pdGlhbCBpcyBjCi0lICBcZW50cnkge3RvcGljfXtwYWdlbGlzdH0KLSUgICAgIGZvciBhIHRvcGljIHRoYXQgaXMgdXNlZCB3aXRob3V0IHN1YnRvcGljcwotJSAgXHByaW1hcnkge3RvcGljfQotJSAgICAgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYSB0b3BpYyB0aGF0IGlzIHVzZWQgd2l0aCBzdWJ0b3BpY3MKLSUgIFxzZWNvbmRhcnkge3N1YnRvcGljfXtwYWdlbGlzdH0KLSUgICAgIGZvciBlYWNoIHN1YnRvcGljLgotCi0lIERlZmluZSB0aGUgdXNlci1hY2Nlc3NpYmxlIGluZGV4aW5nIGNvbW1hbmRzCi0lIEBmaW5kZXgsIEB2aW5kZXgsIEBraW5kZXgsIEBjaW5kZXguCi0KLVxkZWZcZmluZGV4IHtcZm5pbmRleH0KLVxkZWZca2luZGV4IHtca3lpbmRleH0KLVxkZWZcY2luZGV4IHtcY3BpbmRleH0KLVxkZWZcdmluZGV4IHtcdnJpbmRleH0KLVxkZWZcdGluZGV4IHtcdHBpbmRleH0KLVxkZWZccGluZGV4IHtccGdpbmRleH0KLQotXGRlZlxjaW5kZXhzdWIge1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xjaW5kZXhzdWJ9Ci17XG9iZXlsaW5lcyAlCi1cZ2RlZlxjaW5kZXhzdWIgIiMxIiAjMl5eTXtcZW5kZ3JvdXAgJQotXGRvc3ViaW5ke2NwfXsjMn17IzF9fX0KLQotJSBEZWZpbmUgdGhlIG1hY3JvcyB1c2VkIGluIGZvcm1hdHRpbmcgb3V0cHV0IG9mIHRoZSBzb3J0ZWQgaW5kZXggbWF0ZXJpYWwuCi0KLSUgQHByaW50aW5kZXggY2F1c2VzIGEgcGFydGljdWxhciBpbmRleCAodGhlID8/cyBmaWxlKSB0byBnZXQgcHJpbnRlZC4KLSUgSXQgZG9lcyBub3QgcHJpbnQgYW55IGNoYXB0ZXIgaGVhZGluZyAodXN1YWxseSBhbiBAdW5udW1iZXJlZCkuCi0lCi1cZGVmXHByaW50aW5kZXh7XHBhcnNlYXJnXGRvcHJpbnRpbmRleH0KLVxkZWZcZG9wcmludGluZGV4IzF7XGJlZ2luZ3JvdXAKLSAgXGRvYnJlYWsgXGNoYXBoZWFkaW5nc2tpcHsxMDAwMH0lCi0gICUKLSAgXGluZGV4Zm9udHMgXHJtCi0gIFx0b2xlcmFuY2UgPSA5NTAwCi0gIFxpbmRleGJyZWFrcwotICAlCi0gICUgU2VlIGlmIHRoZSBpbmRleCBmaWxlIGV4aXN0cyBhbmQgaXMgbm9uZW1wdHkuCi0gICUgQ2hhbmdlIGNhdGNvZGUgb2YgQCBoZXJlIHNvIHRoYXQgaWYgdGhlIGluZGV4IGZpbGUgY29udGFpbnMKLSAgJSBcaW5pdGlhbCB7QH0KLSAgJSBhcyBpdHMgZmlyc3QgbGluZSwgVGVYIGRvZXNuJ3QgY29tcGxhaW4gYWJvdXQgbWlzbWF0Y2hlZCBicmFjZXMKLSAgJSAoYmVjYXVzZSBpdCB0aGlua3MgQH0gaXMgYSBjb250cm9sIHNlcXVlbmNlKS4KLSAgXGNhdGNvZGVgXEAgPSAxMQotICBcb3BlbmluIDEgXGpvYm5hbWUuIzFzCi0gIFxpZmVvZiAxCi0gICAgJSBcZW5kZG91YmxlY29sdW1ucyBnZXRzIGNvbmZ1c2VkIGlmIHRoZXJlIGlzIG5vIHRleHQgaW4gdGhlIGluZGV4LAotICAgICUgYW5kIGl0IGxvc2VzIHRoZSBjaGFwdGVyIHRpdGxlIGFuZCB0aGUgYXV4IGZpbGUgZW50cmllcyBmb3IgdGhlCi0gICAgJSBpbmRleC4gIFRoZSBlYXNpZXN0IHdheSB0byBwcmV2ZW50IHRoaXMgcHJvYmxlbSBpcyB0byBtYWtlIHN1cmUKLSAgICAlIHRoZXJlIGlzIHNvbWUgdGV4dC4KLSAgICAoSW5kZXggaXMgbm9uZXhpc3RlbnQpCi0gIFxlbHNlCi0gICAgJQotICAgICUgSWYgdGhlIGluZGV4IGZpbGUgZXhpc3RzIGJ1dCBpcyBlbXB0eSwgdGhlbiBcb3BlbmluIGxlYXZlcyBcaWZlb2YKLSAgICAlIGZhbHNlLiAgV2UgaGF2ZSB0byBtYWtlIFRlWCB0cnkgdG8gcmVhZCBzb21ldGhpbmcgZnJvbSB0aGUgZmlsZSwgc28KLSAgICAlIGl0IGNhbiBkaXNjb3ZlciBpZiB0aGVyZSBpcyBhbnl0aGluZyBpbiBpdC4KLSAgICBccmVhZCAxIHRvIFx0ZW1wCi0gICAgXGlmZW9mIDEKLSAgICAgIChJbmRleCBpcyBlbXB0eSkKLSAgICBcZWxzZQotICAgICAgJSBJbmRleCBmaWxlcyBhcmUgYWxtb3N0IFRleGluZm8gc291cmNlLCBidXQgd2UgdXNlIFwgYXMgdGhlIGVzY2FwZQotICAgICAgJSBjaGFyYWN0ZXIuICBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gdXNlIEAsIGJ1dCB0aGF0J3MgdG9vIGJpZyBhIGNoYW5nZQotICAgICAgJSB0byBtYWtlIHJpZ2h0IG5vdy4KLSAgICAgIFxkZWZcaW5kZXhiYWNrc2xhc2h7XHJhd2JhY2tzbGFzaHh4fSUKLSAgICAgIFxjYXRjb2RlYFxcID0gMAotICAgICAgXGVzY2FwZWNoYXIgPSBgXFwKLSAgICAgIFxiZWdpbmRvdWJsZWNvbHVtbnMKLSAgICAgIFxpbnB1dCBcam9ibmFtZS4jMXMKLSAgICAgIFxlbmRkb3VibGVjb2x1bW5zCi0gICAgXGZpCi0gIFxmaQotICBcY2xvc2VpbiAxCi1cZW5kZ3JvdXB9Ci0KLSUgVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGJ5IHRoZSBzb3J0ZWQgaW5kZXggZmlsZSBpdHNlbGYuCi0lIENoYW5nZSB0aGVtIHRvIGNvbnRyb2wgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGluZGV4LgotCi1cZGVmXGluaXRpYWwjMXt7JQotICAlIFNvbWUgbWlub3IgZm9udCBjaGFuZ2VzIGZvciB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzLgotICBcbGV0XHRlbnR0PVxzZWN0dCBcbGV0XHR0PVxzZWN0dCBcbGV0XHNmPVxzZWN0dAotICAlCi0gICUgUmVtb3ZlIGFueSBnbHVlIHdlIG1heSBoYXZlLCB3ZSdsbCBiZSBpbnNlcnRpbmcgb3VyIG93bi4KLSAgXHJlbW92ZWxhc3Rza2lwCi0gICUgCi0gICUgV2UgbGlrZSBicmVha3MgYmVmb3JlIHRoZSBpbmRleCBpbml0aWFscywgc28gaW5zZXJ0IGEgYm9udXMuCi0gIFxwZW5hbHR5IC0zMDAKLSAgJQotICAlIFR5cGVzZXQgdGhlIGluaXRpYWwuICBNYWtpbmcgdGhpcyBhZGQgdXAgdG8gYSB3aG9sZSBudW1iZXIgb2YKLSAgJSBiYXNlbGluZXNraXBzIGluY3JlYXNlcyB0aGUgY2hhbmNlIG9mIHRoZSBkb3RzIGxpbmluZyB1cCBmcm9tIGNvbHVtbgotICAlIHRvIGNvbHVtbi4gIEl0IHN0aWxsIHdvbid0IG9mdGVuIGJlIHBlcmZlY3QsIGJlY2F1c2Ugb2YgdGhlIHN0cmV0Y2gKLSAgJSB3ZSBuZWVkIGJlZm9yZSBlYWNoIGVudHJ5LCBidXQgaXQncyBiZXR0ZXIuCi0gICUgCi0gICUgTm8gc2hyaW5rIGJlY2F1c2UgaXQgY29uZnVzZXMgXGJhbGFuY2Vjb2x1bW5zLgotICBcdnNraXAgMS42N1xiYXNlbGluZXNraXAgcGx1cyAuNVxiYXNlbGluZXNraXAKLSAgXGxlZnRsaW5le1xzZWNiZiAjMX0lCi0gIFx2c2tpcCAuMzNcYmFzZWxpbmVza2lwIHBsdXMgLjFcYmFzZWxpbmVza2lwCi0gICUKLSAgJSBEbyBvdXIgYmVzdCBub3QgdG8gYnJlYWsgYWZ0ZXIgdGhlIGluaXRpYWwuCi0gIFxub2JyZWFrCi19fQotCi0lIFRoaXMgdHlwZXNldHMgYSBwYXJhZ3JhcGggY29uc2lzdGluZyBvZiAjMSwgZG90IGxlYWRlcnMsIGFuZCB0aGVuICMyCi0lIGZsdXNoIHRvIHRoZSByaWdodCBtYXJnaW4uICBJdCBpcyB1c2VkIGZvciBpbmRleCBhbmQgdGFibGUgb2YgY29udGVudHMKLSUgZW50cmllcy4gIFRoZSBwYXJhZ3JhcGggaXMgaW5kZW50ZWQgYnkgXGxlZnRza2lwLgotJQotXGRlZlxlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKLSAgJQotICAlIFN0YXJ0IGEgbmV3IHBhcmFncmFwaCBpZiBuZWNlc3NhcnksIHNvIG91ciBhc3NpZ25tZW50cyBiZWxvdyBjYW4ndAotICAlIGFmZmVjdCBwcmV2aW91cyB0ZXh0LgotICBccGFyCi0gICUKLSAgJSBEbyBub3QgZmlsbCBvdXQgdGhlIGxhc3QgbGluZSB3aXRoIHdoaXRlIHNwYWNlLgotICBccGFyZmlsbHNraXAgPSAwaW4KLSAgJQotICAlIE5vIGV4dHJhIHNwYWNlIGFib3ZlIHRoaXMgcGFyYWdyYXBoLgotICBccGFyc2tpcCA9IDBpbgotICAlCi0gICUgRG8gbm90IHByZWZlciBhIHNlcGFyYXRlIGxpbmUgZW5kaW5nIHdpdGggYSBoeXBoZW4gdG8gZmV3ZXIgbGluZXMuCi0gIFxmaW5hbGh5cGhlbmRlbWVyaXRzID0gMAotICAlCi0gICUgXGhhbmdpbmRlbnQgaXMgb25seSByZWxldmFudCB3aGVuIHRoZSBlbnRyeSB0ZXh0IGFuZCBwYWdlIG51bWJlcgotICAlIGRvbid0IGJvdGggZml0IG9uIG9uZSBsaW5lLiAgSW4gdGhhdCBjYXNlLCBib2Igc3VnZ2VzdHMgc3RhcnRpbmcgdGhlCi0gICUgZG90cyBwcmV0dHkgZmFyIG92ZXIgb24gdGhlIGxpbmUuICBVbmZvcnR1bmF0ZWx5LCBhIGxhcmdlCi0gICUgaW5kZW50YXRpb24gbG9va3Mgd3Jvbmcgd2hlbiB0aGUgZW50cnkgdGV4dCBpdHNlbGYgaXMgYnJva2VuIGFjcm9zcwotICAlIGxpbmVzLiAgU28gd2UgdXNlIGEgc21hbGwgaW5kZW50YXRpb24gYW5kIHB1dCB1cCB3aXRoIGxvbmcgbGVhZGVycy4KLSAgJQotICAlIFxoYW5nYWZ0ZXIgaXMgcmVzZXQgdG8gMSAod2hpY2ggaXMgdGhlIHZhbHVlIHdlIHdhbnQpIGF0IHRoZSBzdGFydAotICAlIG9mIGVhY2ggcGFyYWdyYXBoLCBzbyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyB3aXRoIHRoYXQuCi0gIFxoYW5naW5kZW50ID0gMmVtCi0gICUKLSAgJSBXaGVuIHRoZSBlbnRyeSB0ZXh0IG5lZWRzIHRvIGJlIGJyb2tlbiwganVzdCBmaWxsIG91dCB0aGUgZmlyc3QgbGluZQotICAlIHdpdGggYmxhbmsgc3BhY2UuCi0gIFxyaWdodHNraXAgPSAwcHQgcGx1czFmaWwKLSAgJQotICAlIEEgYml0IG9mIHN0cmV0Y2ggYmVmb3JlIGVhY2ggZW50cnkgZm9yIHRoZSBiZW5lZml0IG9mIGJhbGFuY2luZyBjb2x1bW5zLgotICBcdnNraXAgMHB0IHBsdXMxcHQKLSAgJQotICAlIFN0YXJ0IGEgYGBwYXJhZ3JhcGgnJyBmb3IgdGhlIGluZGV4IGVudHJ5IHNvIHRoZSBsaW5lIGJyZWFraW5nCi0gICUgcGFyYW1ldGVycyB3ZSd2ZSBzZXQgYWJvdmUgd2lsbCBoYXZlIGFuIGVmZmVjdC4KLSAgXG5vaW5kZW50Ci0gICUKLSAgJSBJbnNlcnQgdGhlIHRleHQgb2YgdGhlIGluZGV4IGVudHJ5LiAgVGVYIHdpbGwgZG8gbGluZS1icmVha2luZyBvbiBpdC4KLSAgIzElCi0gICUgVGhlIGZvbGxvd2luZyBpcyBrbHVkZ2VkIHRvIG5vdCBvdXRwdXQgYSBsaW5lIG9mIGRvdHMgaW4gdGhlIGluZGV4IGlmCi0gICUgdGhlcmUgYXJlIG5vIHBhZ2UgbnVtYmVycy4gIFRoZSBuZXh0IHBlcnNvbiB3aG8gYnJlYWtzIHRoaXMgd2lsbCBiZQotICAlIGN1cnNlZCBieSBhIFVuaXggZGFlbW9uLgotICBcZGVmXHRlbXBhe3tccm0gfX0lCi0gIFxkZWZcdGVtcGJ7IzJ9JQotICBcZWRlZlx0ZW1wY3tcdGVtcGF9JQotICBcZWRlZlx0ZW1wZHtcdGVtcGJ9JQotICBcaWZ4XHRlbXBjXHRlbXBkXCBcZWxzZSUKLSAgICAlCi0gICAgJSBJZiB3ZSBtdXN0LCBwdXQgdGhlIHBhZ2UgbnVtYmVyIG9uIGEgbGluZSBvZiBpdHMgb3duLCBhbmQgZmlsbCBvdXQKLSAgICAlIHRoaXMgbGluZSB3aXRoIGJsYW5rIHNwYWNlLiAgKFRoZSBcaGZpbCBpcyBvdmVyd2hlbG1lZCB3aXRoIHRoZQotICAgICUgZmlsbCBsZWFkZXJzIGdsdWUgaW4gXGluZGV4ZG90ZmlsbCBpZiB0aGUgcGFnZSBudW1iZXIgZG9lcyBmaXQuKQotICAgIFxoZmlsXHBlbmFsdHk1MAotICAgIFxudWxsXG5vYnJlYWtcaW5kZXhkb3RmaWxsICUgSGF2ZSBsZWFkZXJzIGJlZm9yZSB0aGUgcGFnZSBudW1iZXIuCi0gICAgJQotICAgICUgVGhlIGBcICcgaGVyZSBpcyByZW1vdmVkIGJ5IHRoZSBpbXBsaWNpdCBcdW5za2lwIHRoYXQgVGVYIGRvZXMgYXMKLSAgICAlIHBhcnQgb2YgKHRoZSBwcmltaXRpdmUpIFxwYXIuICBXaXRob3V0IGl0LCBhIHNwdXJpb3VzIHVuZGVyZnVsbAotICAgICUgXGhib3ggZW5zdWVzLgotICAgIFwgIzIlIFRoZSBwYWdlIG51bWJlciBlbmRzIHRoZSBwYXJhZ3JhcGguCi0gIFxmaSUKLSAgXHBhcgotXGVuZGdyb3VwfQotCi0lIExpa2UgXGRvdGZpbGwgZXhjZXB0IHRha2VzIGF0IGxlYXN0IDEgZW0uCi1cZGVmXGluZGV4ZG90ZmlsbHtcY2xlYWRlcnMKLSAgXGhib3h7JFxtYXRoc3Vycm91bmQ9MHB0IFxta2VybjEuNW11ICR7XGl0IC59JCBcbWtlcm4xLjVtdSR9XGhza2lwIDFlbSBwbHVzIDFmaWxsfQotCi1cZGVmXHByaW1hcnkgIzF7XGxpbmV7IzFcaGZpbH19Ci0KLVxuZXdza2lwXHNlY29uZGFyeWluZGVudCBcc2Vjb25kYXJ5aW5kZW50PTAuNWNtCi0KLVxkZWZcc2Vjb25kYXJ5ICMxIzJ7Ci17XHBhcmZpbGxza2lwPTBpbiBccGFyc2tpcD0waW4KLVxoYW5naW5kZW50ID0xaW4gXGhhbmdhZnRlcj0xCi1cbm9pbmRlbnRcaHNraXBcc2Vjb25kYXJ5aW5kZW50XGhib3h7IzF9XGluZGV4ZG90ZmlsbCAjMlxwYXIKLX19Ci0KLSUgRGVmaW5lIHR3by1jb2x1bW4gbW9kZSwgd2hpY2ggd2UgdXNlIHRvIHR5cGVzZXQgaW5kZXhlcy4KLSUgQWRhcHRlZCBmcm9tIHRoZSBUZVhib29rLCBwYWdlIDQxNiwgd2hpY2ggaXMgdG8gc2F5LAotJSB0aGUgbWFubWFjLnRleCBmb3JtYXQgdXNlZCB0byBwcmludCB0aGUgVGVYYm9vayBpdHNlbGYuCi1cY2F0Y29kZWBcQD0xMQotCi1cbmV3Ym94XHBhcnRpYWxwYWdlCi1cbmV3ZGltZW5cZG91YmxlY29sdW1uaHNpemUKLQotXGRlZlxiZWdpbmRvdWJsZWNvbHVtbnN7XGJlZ2luZ3JvdXAgJSBlbmRlZCBieSBcZW5kZG91YmxlY29sdW1ucwotICAlIEdyYWIgYW55IHNpbmdsZS1jb2x1bW4gbWF0ZXJpYWwgYWJvdmUgdXMuCi0gIFxvdXRwdXQgPSB7XGdsb2JhbFxzZXRib3hccGFydGlhbHBhZ2UgPSBcdmJveHslCi0gICAgJSAKLSAgICAlIEhlcmUgaXMgYSBwb3NzaWJpbGl0eSBub3QgZm9yZXNlZW4gaW4gbWFubWFjOiBpZiB3ZSBhY2N1bXVsYXRlIGEKLSAgICAlIHdob2xlIGxvdCBvZiBtYXRlcmlhbCwgd2UgbWlnaHQgZW5kIHVwIGNhbGxpbmcgdGhpcyBcb3V0cHV0Ci0gICAgJSByb3V0aW5lIHR3aWNlIGluIGEgcm93IChzZWUgdGhlIGRvdWJsZWNvbC1sb3NlIHRlc3QsIHdoaWNoIGlzCi0gICAgJSBlc3NlbnRpYWxseSBhIGNvdXBsZSBvZiBpbmRleGVzIHdpdGggQHNldGNoYXB0ZXJuZXdwYWdlIG9mZikuICBJbgotICAgICUgdGhhdCBjYXNlLCB3ZSBtdXN0IHByZXZlbnQgdGhlIHNlY29uZCBccGFydGlhbHBhZ2UgZnJvbQotICAgICUgc2ltcGx5IG92ZXJ3cml0aW5nIHRoZSBmaXJzdCwgY2F1c2luZyB1cyB0byBsb3NlIHRoZSBwYWdlLgotICAgICUgVGhpcyB3aWxsIHByZXNlcnZlIGl0IHVudGlsIGEgcmVhbCBvdXRwdXQgcm91dGluZSBjYW4gc2hpcCBpdAotICAgICUgb3V0LiAgR2VuZXJhbGx5LCBccGFydGlhbHBhZ2Ugd2lsbCBiZSBlbXB0eSB3aGVuIHRoaXMgcnVucyBhbmQKLSAgICAlIHRoaXMgd2lsbCBiZSBhIG5vLW9wLgotICAgIFx1bnZib3hccGFydGlhbHBhZ2UKLSAgICAlCi0gICAgJSBVbnZib3ggdGhlIG1haW4gb3V0cHV0IHBhZ2UuCi0gICAgXHVudmJveDI1NQotICAgIFxrZXJuLVx0b3Bza2lwIFxrZXJuXGJhc2VsaW5lc2tpcAotICB9fSUKLSAgXGVqZWN0Ci0gICUKLSAgJSBVc2UgdGhlIGRvdWJsZS1jb2x1bW4gb3V0cHV0IHJvdXRpbmUgZm9yIHN1YnNlcXVlbnQgcGFnZXMuCi0gIFxvdXRwdXQgPSB7XGRvdWJsZWNvbHVtbm91dH0lCi0gICUKLSAgJSBDaGFuZ2UgdGhlIHBhZ2Ugc2l6ZSBwYXJhbWV0ZXJzLiAgV2UgY291bGQgZG8gdGhpcyBvbmNlIG91dHNpZGUgdGhpcwotICAlIHJvdXRpbmUsIGluIGVhY2ggb2YgQHNtYWxsYm9vaywgQGFmb3VycGFwZXIsIGFuZCB0aGUgZGVmYXVsdCA4LjV4MTEKLSAgJSBmb3JtYXQsIGJ1dCB0aGVuIHdlIHJlcGVhdCB0aGUgc2FtZSBjb21wdXRhdGlvbi4gIFJlcGVhdGluZyBhIGNvdXBsZQotICAlIG9mIGFzc2lnbm1lbnRzIG9uY2UgcGVyIGluZGV4IGlzIGNsZWFybHkgbWVhbmluZ2xlc3MgZm9yIHRoZQotICAlIGV4ZWN1dGlvbiB0aW1lLCBzbyB3ZSBtYXkgYXMgd2VsbCBkbyBpdCBpbiBvbmUgcGxhY2UuCi0gICUKLSAgJSBGaXJzdCB3ZSBoYWx2ZSB0aGUgbGluZSBsZW5ndGgsIGxlc3MgYSBsaXR0bGUgZm9yIHRoZSBndXR0ZXIgYmV0d2VlbgotICAlIHRoZSBjb2x1bW5zLiAgV2UgY29tcHV0ZSB0aGUgZ3V0dGVyIGJhc2VkIG9uIHRoZSBsaW5lIGxlbmd0aCwgc28gaXQKLSAgJSBjaGFuZ2VzIGF1dG9tYXRpY2FsbHkgd2l0aCB0aGUgcGFwZXIgZm9ybWF0LiAgVGhlIG1hZ2ljIGNvbnN0YW50Ci0gICUgYmVsb3cgaXMgY2hvc2VuIHNvIHRoYXQgdGhlIGd1dHRlciBoYXMgdGhlIHNhbWUgdmFsdWUgKHdlbGwsICstPDFwdCkKLSAgJSBhcyBpdCBkaWQgd2hlbiB3ZSBoYXJkLWNvZGVkIGl0LgotICAlCi0gICUgV2UgcHV0IHRoZSByZXN1bHQgaW4gYSBzZXBhcmF0ZSByZWdpc3RlciwgXGRvdWJsZWNvbHVtaHNpemUsIHNvIHdlCi0gICUgY2FuIHJlc3RvcmUgaXQgaW4gXHBhZ2Vzb2ZhciwgYWZ0ZXIgXGhzaXplIGl0c2VsZiBoYXMgKHBvdGVudGlhbGx5KQotICAlIGJlZW4gY2xvYmJlcmVkLgotICAlCi0gIFxkb3VibGVjb2x1bW5oc2l6ZSA9IFxoc2l6ZQotICAgIFxhZHZhbmNlXGRvdWJsZWNvbHVtbmhzaXplIGJ5IC0uMDQxNTRcaHNpemUKLSAgICBcZGl2aWRlXGRvdWJsZWNvbHVtbmhzaXplIGJ5IDIKLSAgXGhzaXplID0gXGRvdWJsZWNvbHVtbmhzaXplCi0gICUKLSAgJSBEb3VibGUgdGhlIFx2c2l6ZSBhcyB3ZWxsLiAgKFdlIGRvbid0IG5lZWQgYSBzZXBhcmF0ZSByZWdpc3RlciBoZXJlLAotICAlIHNpbmNlIG5vYm9keSBjbG9iYmVycyBcdnNpemUuKQotICBcYWR2YW5jZVx2c2l6ZSBieSAtXGh0XHBhcnRpYWxwYWdlCi0gIFx2c2l6ZSA9IDJcdnNpemUKLX0KLQotJSBUaGUgZG91YmxlLWNvbHVtbiBvdXRwdXQgcm91dGluZSBmb3IgYWxsIGRvdWJsZS1jb2x1bW4gcGFnZXMgZXhjZXB0Ci0lIHRoZSBsYXN0LgotJSAKLVxkZWZcZG91YmxlY29sdW1ub3V0eyUKLSAgXHNwbGl0dG9wc2tpcD1cdG9wc2tpcCBcc3BsaXRtYXhkZXB0aD1cbWF4ZGVwdGgKLSAgJSBHZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSBmb3IgdGhlIGRvdWJsZSBjb2x1bW5zIC0tIHRoZSBub3JtYWwKLSAgJSAodW5kb3VibGVkKSBwYWdlIGhlaWdodCBtaW51cyBhbnkgbWF0ZXJpYWwgbGVmdCBvdmVyIGZyb20gdGhlCi0gICUgcHJldmlvdXMgcGFnZS4KLSAgXGRpbWVuQCA9IFx2c2l6ZQotICBcZGl2aWRlXGRpbWVuQCBieSAyCi0gICUKLSAgJSBib3gwIHdpbGwgYmUgdGhlIGxlZnQtaGFuZCBjb2x1bW4sIGJveDIgdGhlIHJpZ2h0LgotICBcc2V0Ym94MD1cdnNwbGl0MjU1IHRvXGRpbWVuQCBcc2V0Ym94Mj1cdnNwbGl0MjU1IHRvXGRpbWVuQAotICBcb25lcGFnZW91dFxwYWdlc29mYXIKLSAgXHVudmJveDI1NQotICBccGVuYWx0eVxvdXRwdXRwZW5hbHR5Ci19Ci1cZGVmXHBhZ2Vzb2ZhcnslCi0gICUgUmUtb3V0cHV0IHRoZSBjb250ZW50cyBvZiB0aGUgb3V0cHV0IHBhZ2UgLS0gYW55IHByZXZpb3VzIG1hdGVyaWFsLAotICAlIGZvbGxvd2VkIGJ5IHRoZSB0d28gYm94ZXMgd2UganVzdCBzcGxpdCwgaW4gYm94MCBhbmQgYm94Mi4KLSAgXGFkdmFuY2VcdnNpemUgYnkgXGh0XHBhcnRpYWxwYWdlCi0gIFx1bnZib3hccGFydGlhbHBhZ2UKLSAgJQotICBcaHNpemUgPSBcZG91YmxlY29sdW1uaHNpemUKLSAgXHdkMD1caHNpemUgXHdkMj1caHNpemUKLSAgXGhib3ggdG9ccGFnZXdpZHRoe1xib3gwXGhmaWxcYm94Mn0lCi19Ci1cZGVmXGVuZGRvdWJsZWNvbHVtbnN7JQotICBcb3V0cHV0ID0geyUKLSAgICAlIFNwbGl0IHRoZSBsYXN0IG9mIHRoZSBkb3VibGUtY29sdW1uIG1hdGVyaWFsLiAgTGVhdmUgb24gdGhlCi0gICAgJSBjdXJyZW50IHBhZ2UsIG5vIGF1dG9tYXRpYyBwYWdlIGJyZWFrLgotICAgIFxiYWxhbmNlY29sdW1ucwotICAgICUKLSAgICAlIElmIHdlIGVuZCB1cCBzcGxpdHRpbmcgdG9vIG11Y2ggbWF0ZXJpYWwgZm9yIHRoZSBjdXJyZW50IHBhZ2UsCi0gICAgJSB0aG91Z2gsIHRoZXJlIHdpbGwgYmUgYW5vdGhlciBwYWdlIGJyZWFrIHJpZ2h0IGFmdGVyIHRoaXMgXG91dHB1dAotICAgICUgaW52b2NhdGlvbiBlbmRzLiAgSGF2aW5nIGNhbGxlZCBcYmFsYW5jZWNvbHVtbnMgb25jZSwgd2UgZG8gbm90Ci0gICAgJSB3YW50IHRvIGNhbGwgaXQgYWdhaW4uICBUaGVyZWZvcmUsIHJlc2V0IFxvdXRwdXQgdG8gaXRzIG5vcm1hbAotICAgICUgZGVmaW5pdGlvbiByaWdodCBhd2F5LiAgKFdlIGhvcGUgXGJhbGFuY2Vjb2x1bW5zIHdpbGwgbmV2ZXIgYmUKLSAgICAlIGNhbGxlZCBvbiB0byBiYWxhbmNlIHRvbyBtdWNoIG1hdGVyaWFsLCBidXQgaWYgaXQgaXMsIHRoaXMgbWFrZXMKLSAgICAlIHRoZSBvdXRwdXQgc29tZXdoYXQgbW9yZSBwYWxhdGFibGUuKQotICAgIFxnbG9iYWxcb3V0cHV0ID0ge1xvbmVwYWdlb3V0e1xwYWdlY29udGVudHNcUEFHRX19JQotICAgICUKLSAgICAlIFxwYWdlZ29hbCB3YXMgc2V0IHRvIHRoZSBkb3VibGVkIFx2c2l6ZSBhYm92ZSwgc2luY2Ugd2UgcmVzdGFydGVkCi0gICAgJSB0aGUgY3VycmVudCBwYWdlLiAgV2UncmUgbm93IGJhY2sgdG8gbm9ybWFsIHNpbmdsZS1jb2x1bW4KLSAgICAlIHR5cGVzZXR0aW5nLCBzbyByZXNldCBccGFnZWdvYWwgdG8gdGhlIG5vcm1hbCBcdnNpemUuCi0gICAgXHBhZ2Vnb2FsID0gXHZzaXplCi0gIH0lCi0gIFxlamVjdAotICBcZW5kZ3JvdXAgJSBzdGFydGVkIGluIFxiZWdpbmRvdWJsZWNvbHVtbnMKLX0KLVxkZWZcYmFsYW5jZWNvbHVtbnN7JQotICAlIENhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBkb3VibGUgY29sdW1uIG1hdGVyaWFsLgotICBcc2V0Ym94MCA9IFx2Ym94e1x1bnZib3gyNTV9JSBsaWtlIFxib3gyNTUgYnV0IG1vcmUgZWZmaWNpZW50LCBzZWUgcC4xMjAuCi0gIFxkaW1lbkAgPSBcaHQwCi0gIFxhZHZhbmNlXGRpbWVuQCBieSBcdG9wc2tpcAotICBcYWR2YW5jZVxkaW1lbkAgYnktXGJhc2VsaW5lc2tpcAotICBcZGl2aWRlXGRpbWVuQCBieSAyICUgdGFyZ2V0IHRvIHNwbGl0IHRvCi0gICVkZWJ1Z1xtZXNzYWdle2ZpbmFsIDItY29sdW1uIG1hdGVyaWFsIGhlaWdodD1cdGhlXGh0MCwgdGFyZ2V0PVx0aGVcZGltZW5ALn0lCi0gIFxzcGxpdHRvcHNraXAgPSBcdG9wc2tpcAotICAlIExvb3AgdW50aWwgd2UgZ2V0IGEgZGVjZW50IGJyZWFrcG9pbnQuCi0gIHslCi0gICAgXHZiYWRuZXNzID0gMTAwMDAKLSAgICBcbG9vcAotICAgICAgXGdsb2JhbFxzZXRib3gzID0gXGNvcHkwCi0gICAgICBcZ2xvYmFsXHNldGJveDEgPSBcdnNwbGl0MyB0byBcZGltZW5ACi0gICAgXGlmZGltXGh0Mz5cZGltZW5ACi0gICAgICBcZ2xvYmFsXGFkdmFuY2VcZGltZW5AIGJ5IDFwdAotICAgIFxyZXBlYXQKLSAgfSUKLSAgJWRlYnVnXG1lc3NhZ2V7c3BsaXQgdG8gXHRoZVxkaW1lbkAsIGNvbHVtbiBoZWlnaHRzOiBcdGhlXGh0MSwgXHRoZVxodDMufSUKLSAgXHNldGJveDA9XHZib3ggdG9cZGltZW5Ae1x1bnZib3gxfSUKLSAgXHNldGJveDI9XHZib3ggdG9cZGltZW5Ae1x1bnZib3gzfSUKLSAgJQotICBccGFnZXNvZmFyCi19Ci1cY2F0Y29kZWBcQCA9IFxvdGhlcgotCi0KLVxtZXNzYWdle3NlY3Rpb25pbmcsfQotJSBEZWZpbmUgY2hhcHRlcnMsIHNlY3Rpb25zLCBldGMuCi0KLVxuZXdjb3VudFxjaGFwbm8KLVxuZXdjb3VudFxzZWNubyAgICAgICAgXHNlY25vPTAKLVxuZXdjb3VudFxzdWJzZWNubyAgICAgXHN1YnNlY25vPTAKLVxuZXdjb3VudFxzdWJzdWJzZWNubyAgXHN1YnN1YnNlY25vPTAKLQotJSBUaGlzIGNvdW50ZXIgaXMgZnVubnkgc2luY2UgaXQgY291bnRzIHRocm91Z2ggY2hhcmNvZGVzIG9mIGxldHRlcnMgQSwgQiwgLi4uCi1cbmV3Y291bnRcYXBwZW5kaXhubyAgXGFwcGVuZGl4bm8gPSBgXEAKLVxkZWZcYXBwZW5kaXhsZXR0ZXJ7XGNoYXJcdGhlXGFwcGVuZGl4bm99Ci0KLSUgRWFjaCBAY2hhcHRlciBkZWZpbmVzIHRoaXMgYXMgdGhlIG5hbWUgb2YgdGhlIGNoYXB0ZXIuCi0lIHBhZ2UgaGVhZGluZ3MgYW5kIGZvb3RpbmdzIGNhbiB1c2UgaXQuICBAc2VjdGlvbiBkb2VzIGxpa2V3aXNlLgotXGRlZlx0aGlzY2hhcHRlcnt9Ci1cZGVmXHRoaXNzZWN0aW9ue30KLQotXG5ld2NvdW50XGFic3NlY2xldmVsICUgdXNlZCB0byBjYWxjdWxhdGUgcHJvcGVyIGhlYWRpbmcgbGV2ZWwKLVxuZXdjb3VudFxzZWNiYXNlXHNlY2Jhc2U9MCAlIEByYWlzZS9sb3dlcnNlY3Rpb25zIG1vZGlmeSB0aGlzIGNvdW50Ci0KLSUgQHJhaXNlc2VjdGlvbnM6IHRyZWF0IEBzZWN0aW9uIGFzIGNoYXB0ZXIsIEBzdWJzZWN0aW9uIGFzIHNlY3Rpb24sIGV0Yy4KLVxkZWZccmFpc2VzZWN0aW9uc3tcZ2xvYmFsXGFkdmFuY2Vcc2VjYmFzZSBieSAtMX0KLVxsZXRcdXA9XHJhaXNlc2VjdGlvbnMgJSBvcmlnaW5hbCBCRm94IG5hbWUKLQotJSBAbG93ZXJzZWN0aW9uczogdHJlYXQgQGNoYXB0ZXIgYXMgc2VjdGlvbiwgQHNlY3Rpb24gYXMgc3Vic2VjdGlvbiwgZXRjLgotXGRlZlxsb3dlcnNlY3Rpb25ze1xnbG9iYWxcYWR2YW5jZVxzZWNiYXNlIGJ5IDF9Ci1cbGV0XGRvd249XGxvd2Vyc2VjdGlvbnMgJSBvcmlnaW5hbCBCRm94IG5hbWUKLQotJSBDaG9vc2UgYSBudW1iZXJlZC1oZWFkaW5nIG1hY3JvCi0lICMxIGlzIGhlYWRpbmcgbGV2ZWwgaWYgdW5tb2RpZmllZCBieSBAcmFpc2VzZWN0aW9ucyBvciBAbG93ZXJzZWN0aW9ucwotJSAjMiBpcyB0ZXh0IGZvciBoZWFkaW5nCi1cZGVmXG51bWhlYWQjMSMye1xhYnNzZWNsZXZlbD1cc2VjYmFzZVxhZHZhbmNlXGFic3NlY2xldmVsIGJ5ICMxCi1caWZjYXNlXGFic3NlY2xldmVsCi0gIFxjaGFwdGVyenp6eyMyfQotXG9yCi0gIFxzZWN6enp7IzJ9Ci1cb3IKLSAgXG51bWJlcmVkc3Vic2Vjenp6eyMyfQotXG9yCi0gIFxudW1iZXJlZHN1YnN1YnNlY3p6ensjMn0KLVxlbHNlCi0gIFxpZm51bSBcYWJzc2VjbGV2ZWw8MAotICAgIFxjaGFwdGVyenp6eyMyfQotICBcZWxzZQotICAgIFxudW1iZXJlZHN1YnN1YnNlY3p6ensjMn0KLSAgXGZpCi1cZmkKLX0KLQotJSBsaWtlIFxudW1oZWFkLCBidXQgY2hvb3NlcyBhcHBlbmRpeCBoZWFkaW5nIGxldmVscwotXGRlZlxhcHBoZWFkIzEjMntcYWJzc2VjbGV2ZWw9XHNlY2Jhc2VcYWR2YW5jZVxhYnNzZWNsZXZlbCBieSAjMQotXGlmY2FzZVxhYnNzZWNsZXZlbAotICBcYXBwZW5kaXh6enp7IzJ9Ci1cb3IKLSAgXGFwcGVuZGl4c2VjdGlvbnp6ensjMn0KLVxvcgotICBcYXBwZW5kaXhzdWJzZWN6enp7IzJ9Ci1cb3IKLSAgXGFwcGVuZGl4c3Vic3Vic2Vjenp6eyMyfQotXGVsc2UKLSAgXGlmbnVtIFxhYnNzZWNsZXZlbDwwCi0gICAgXGFwcGVuZGl4enp6eyMyfQotICBcZWxzZQotICAgIFxhcHBlbmRpeHN1YnN1YnNlY3p6ensjMn0KLSAgXGZpCi1cZmkKLX0KLQotJSBsaWtlIFxudW1oZWFkLCBidXQgY2hvb3NlcyBudW1iZXJsZXNzIGhlYWRpbmcgbGV2ZWxzCi1cZGVmXHVubm1oZWFkIzEjMntcYWJzc2VjbGV2ZWw9XHNlY2Jhc2VcYWR2YW5jZVxhYnNzZWNsZXZlbCBieSAjMQotXGlmY2FzZVxhYnNzZWNsZXZlbAotICBcdW5udW1iZXJlZHp6ensjMn0KLVxvcgotICBcdW5udW1iZXJlZHNlY3p6ensjMn0KLVxvcgotICBcdW5udW1iZXJlZHN1YnNlY3p6ensjMn0KLVxvcgotICBcdW5udW1iZXJlZHN1YnN1YnNlY3p6ensjMn0KLVxlbHNlCi0gIFxpZm51bSBcYWJzc2VjbGV2ZWw8MAotICAgIFx1bm51bWJlcmVkenp6eyMyfQotICBcZWxzZQotICAgIFx1bm51bWJlcmVkc3Vic3Vic2Vjenp6eyMyfQotICBcZmkKLVxmaQotfQotCi0lIEBjaGFwdGVyLCBAYXBwZW5kaXgsIEB1bm51bWJlcmVkLgotXGRlZlx0aGlzY2hhcHRlcm5hbWV7Tm8gQ2hhcHRlciBUaXRsZX0KLVxvdXRlclxkZWZcY2hhcHRlcntccGFyc2VhcmdcY2hhcHRlcnl5eX0KLVxkZWZcY2hhcHRlcnl5eSAjMXtcbnVtaGVhZDB7IzF9fSAlIG5vcm1hbGx5IG51bWhlYWQwIGNhbGxzIGNoYXB0ZXJ6enoKLVxkZWZcY2hhcHRlcnp6eiAjMXslCi1cc2Vjbm89MCBcc3Vic2Vjbm89MCBcc3Vic3Vic2Vjbm89MAotXGdsb2JhbFxhZHZhbmNlIFxjaGFwbm8gYnkgMSBcbWVzc2FnZXtccHV0d29yZENoYXB0ZXJcc3BhY2UgXHRoZVxjaGFwbm99JQotXGNoYXBtYWNybyB7IzF9e1x0aGVcY2hhcG5vfSUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKLVxnZGVmXHRoaXNjaGFwdGVybmFtZXsjMX0lCi0lIFdlIGRvbid0IHN1YnN0aXR1dGUgdGhlIGFjdHVhbCBjaGFwdGVyIG5hbWUgaW50byBcdGhpc2NoYXB0ZXIKLSUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IGl0cyBtYWNyb3MgZXZhbHVhdGVkIG5vdy4KLVx4ZGVmXHRoaXNjaGFwdGVye1xwdXR3b3JkQ2hhcHRlcnt9IFx0aGVcY2hhcG5vOiBcbm9leHBhbmRcdGhpc2NoYXB0ZXJuYW1lfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIGNoYXBlbnRyeXtcdGhlXHRva3MwfSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHRoZVxjaGFwbm99fX0lCi1cdGVtcAotXGRvbm9kZXJlZgotXGdsb2JhbFxsZXRcc2VjdGlvbiA9IFxudW1iZXJlZHNlYwotXGdsb2JhbFxsZXRcc3Vic2VjdGlvbiA9IFxudW1iZXJlZHN1YnNlYwotXGdsb2JhbFxsZXRcc3Vic3Vic2VjdGlvbiA9IFxudW1iZXJlZHN1YnN1YnNlYwotfQotCi1cb3V0ZXJcZGVmXGFwcGVuZGl4e1xwYXJzZWFyZ1xhcHBlbmRpeHl5eX0KLVxkZWZcYXBwZW5kaXh5eXkgIzF7XGFwcGhlYWQweyMxfX0gJSBub3JtYWxseSBhcHBoZWFkMCBjYWxscyBhcHBlbmRpeHp6egotXGRlZlxhcHBlbmRpeHp6eiAjMXslCi1cc2Vjbm89MCBcc3Vic2Vjbm89MCBcc3Vic3Vic2Vjbm89MAotXGdsb2JhbFxhZHZhbmNlIFxhcHBlbmRpeG5vIGJ5IDEKLVxtZXNzYWdle1xwdXR3b3JkQXBwZW5kaXhcc3BhY2UgXGFwcGVuZGl4bGV0dGVyfSUKLVxjaGFwbWFjcm8geyMxfXtccHV0d29yZEFwcGVuZGl4e30gXGFwcGVuZGl4bGV0dGVyfSUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKLVxnZGVmXHRoaXNjaGFwdGVybmFtZXsjMX0lCi1ceGRlZlx0aGlzY2hhcHRlcntccHV0d29yZEFwcGVuZGl4e30gXGFwcGVuZGl4bGV0dGVyOiBcbm9leHBhbmRcdGhpc2NoYXB0ZXJuYW1lfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIGNoYXBlbnRyeXtcdGhlXHRva3MwfSUKLSAgICAgICAgICAgICAgICAgICAgICAge1xwdXR3b3JkQXBwZW5kaXh7fSBcYXBwZW5kaXhsZXR0ZXJ9fX0lCi1cdGVtcAotXGFwcGVuZGl4bm9kZXJlZgotXGdsb2JhbFxsZXRcc2VjdGlvbiA9IFxhcHBlbmRpeHNlYwotXGdsb2JhbFxsZXRcc3Vic2VjdGlvbiA9IFxhcHBlbmRpeHN1YnNlYwotXGdsb2JhbFxsZXRcc3Vic3Vic2VjdGlvbiA9IFxhcHBlbmRpeHN1YnN1YnNlYwotfQotCi0lIEBjZW50ZXJjaGFwIGlzIGxpa2UgQHVubnVtYmVyZWQsIGJ1dCB0aGUgaGVhZGluZyBpcyBjZW50ZXJlZC4KLVxvdXRlclxkZWZcY2VudGVyY2hhcHtccGFyc2VhcmdcY2VudGVyY2hhcHl5eX0KLVxkZWZcY2VudGVyY2hhcHl5eSAjMXt7XGxldFx1bm51bWJjaGFwbWFjcm89XGNlbnRlcmNoYXBtYWNybyBcdW5udW1iZXJlZHl5eXsjMX19fQotCi0lIEB0b3AgaXMgbGlrZSBAdW5udW1iZXJlZC4KLVxvdXRlclxkZWZcdG9we1xwYXJzZWFyZ1x1bm51bWJlcmVkeXl5fQotCi1cb3V0ZXJcZGVmXHVubnVtYmVyZWR7XHBhcnNlYXJnXHVubnVtYmVyZWR5eXl9Ci1cZGVmXHVubnVtYmVyZWR5eXkgIzF7XHVubm1oZWFkMHsjMX19ICUgbm9ybWFsbHkgdW5ubWhlYWQwIGNhbGxzIHVubnVtYmVyZWR6enoKLVxkZWZcdW5udW1iZXJlZHp6eiAjMXslCi1cc2Vjbm89MCBcc3Vic2Vjbm89MCBcc3Vic3Vic2Vjbm89MAotJQotJSBUaGlzIHVzZWQgdG8gYmUgc2ltcGx5IFxtZXNzYWdleyMxfSwgYnV0IFRlWCBmdWxseSBleHBhbmRzIHRoZQotJSBhcmd1bWVudCB0byBcbWVzc2FnZS4gIFRoZXJlZm9yZSwgaWYgIzEgY29udGFpbmVkIEAtY29tbWFuZHMsIFRlWAotJSBleHBhbmRlZCB0aGVtLiAgRm9yIGV4YW1wbGUsIGluIGBAdW5udW1iZXJlZCBUaGUgQGNpdGV7Qm9va30nLCBUZVgKLSUgZXhwYW5kZWQgQGNpdGUgKHdoaWNoIHR1cm5zIG91dCB0byBjYXVzZSBlcnJvcnMgYmVjYXVzZSBcY2l0ZSBpcyBtZWFudAotJSB0byBiZSBleGVjdXRlZCwgbm90IGV4cGFuZGVkKS4KLSUKLSUgQW55d2F5LCB3ZSBkb24ndCB3YW50IHRoZSBmdWxseS1leHBhbmRlZCBkZWZpbml0aW9uIG9mIEBjaXRlIHRvIGFwcGVhcgotJSBhcyBhIHJlc3VsdCBvZiB0aGUgXG1lc3NhZ2UsIHdlIGp1c3Qgd2FudCBgQGNpdGUnIGl0c2VsZi4gIFdlIHVzZQotJSBcdGhlPHRva3MgcmVnaXN0ZXI+IHRvIGFjaGlldmUgdGhpczogVGVYIGV4cGFuZHMgXHRoZTx0b2tzPiBvbmx5IG9uY2UsCi0lIHNpbXBseSB5aWVsZGluZyB0aGUgY29udGVudHMgb2YgPHRva3MgcmVnaXN0ZXI+LiAgKFdlIGFsc28gZG8gdGhpcyBmb3IKLSUgdGhlIHRvYyBlbnRyaWVzLikKLVx0b2tzMCA9IHsjMX1cbWVzc2FnZXsoXHRoZVx0b2tzMCl9JQotJQotXHVubnVtYmNoYXBtYWNybyB7IzF9JQotXGdkZWZcdGhpc2NoYXB0ZXJ7IzF9XGdkZWZcdGhpc3NlY3Rpb257IzF9JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggdW5udW1iY2hhcGVudHJ5e1x0aGVcdG9rczB9fX0lCi1cdGVtcAotXHVubnVtYm5vZGVyZWYKLVxnbG9iYWxcbGV0XHNlY3Rpb24gPSBcdW5udW1iZXJlZHNlYwotXGdsb2JhbFxsZXRcc3Vic2VjdGlvbiA9IFx1bm51bWJlcmVkc3Vic2VjCi1cZ2xvYmFsXGxldFxzdWJzdWJzZWN0aW9uID0gXHVubnVtYmVyZWRzdWJzdWJzZWMKLX0KLQotJSBTZWN0aW9ucy4KLVxvdXRlclxkZWZcbnVtYmVyZWRzZWN7XHBhcnNlYXJnXHNlY3l5eX0KLVxkZWZcc2VjeXl5ICMxe1xudW1oZWFkMXsjMX19ICUgbm9ybWFsbHkgY2FsbHMgc2Vjenp6Ci1cZGVmXHNlY3p6eiAjMXslCi1cc3Vic2Vjbm89MCBcc3Vic3Vic2Vjbm89MCBcZ2xvYmFsXGFkdmFuY2UgXHNlY25vIGJ5IDEgJQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XHNlY2hlYWRpbmcgeyMxfXtcdGhlXGNoYXBub317XHRoZVxzZWNub30lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBzZWNlbnRyeXtcdGhlXHRva3MwfSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99fX0lCi1cdGVtcAotXGRvbm9kZXJlZgotXG5vYnJlYWsKLX0KLQotXG91dGVyXGRlZlxhcHBlbmRpeHNlY3Rpb257XHBhcnNlYXJnXGFwcGVuZGl4c2VjeXl5fQotXG91dGVyXGRlZlxhcHBlbmRpeHNlY3tccGFyc2VhcmdcYXBwZW5kaXhzZWN5eXl9Ci1cZGVmXGFwcGVuZGl4c2VjeXl5ICMxe1xhcHBoZWFkMXsjMX19ICUgbm9ybWFsbHkgY2FsbHMgYXBwZW5kaXhzZWN0aW9uenp6Ci1cZGVmXGFwcGVuZGl4c2VjdGlvbnp6eiAjMXslCi1cc3Vic2Vjbm89MCBcc3Vic3Vic2Vjbm89MCBcZ2xvYmFsXGFkdmFuY2UgXHNlY25vIGJ5IDEgJQotXGdkZWZcdGhpc3NlY3Rpb257IzF9XHNlY2hlYWRpbmcgeyMxfXtcYXBwZW5kaXhsZXR0ZXJ9e1x0aGVcc2Vjbm99JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggc2VjZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xhcHBlbmRpeGxldHRlcn17XHRoZVxzZWNub319fSUKLVx0ZW1wCi1cYXBwZW5kaXhub2RlcmVmCi1cbm9icmVhawotfQotCi1cb3V0ZXJcZGVmXHVubnVtYmVyZWRzZWN7XHBhcnNlYXJnXHVubnVtYmVyZWRzZWN5eXl9Ci1cZGVmXHVubnVtYmVyZWRzZWN5eXkgIzF7XHVubm1oZWFkMXsjMX19ICUgbm9ybWFsbHkgY2FsbHMgdW5udW1iZXJlZHNlY3p6egotXGRlZlx1bm51bWJlcmVkc2Vjenp6ICMxeyUKLVxwbGFpbnNlY2hlYWRpbmcgeyMxfVxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHVubnVtYnNlY2VudHJ5e1x0aGVcdG9rczB9fX0lCi1cdGVtcAotXHVubnVtYm5vZGVyZWYKLVxub2JyZWFrCi19Ci0KLSUgU3Vic2VjdGlvbnMuCi1cb3V0ZXJcZGVmXG51bWJlcmVkc3Vic2Vje1xwYXJzZWFyZ1xudW1iZXJlZHN1YnNlY3l5eX0KLVxkZWZcbnVtYmVyZWRzdWJzZWN5eXkgIzF7XG51bWhlYWQyeyMxfX0gJSBub3JtYWxseSBjYWxscyBudW1iZXJlZHN1YnNlY3p6egotXGRlZlxudW1iZXJlZHN1YnNlY3p6eiAjMXslCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX1cc3Vic3Vic2Vjbm89MCBcZ2xvYmFsXGFkdmFuY2UgXHN1YnNlY25vIGJ5IDEgJQotXHN1YnNlY2hlYWRpbmcgeyMxfXtcdGhlXGNoYXBub317XHRoZVxzZWNub317XHRoZVxzdWJzZWNub30lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBzdWJzZWNlbnRyeXtcdGhlXHRva3MwfSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcdGhlXGNoYXBub317XHRoZVxzZWNub317XHRoZVxzdWJzZWNub319fSUKLVx0ZW1wCi1cZG9ub2RlcmVmCi1cbm9icmVhawotfQotCi1cb3V0ZXJcZGVmXGFwcGVuZGl4c3Vic2Vje1xwYXJzZWFyZ1xhcHBlbmRpeHN1YnNlY3l5eX0KLVxkZWZcYXBwZW5kaXhzdWJzZWN5eXkgIzF7XGFwcGhlYWQyeyMxfX0gJSBub3JtYWxseSBjYWxscyBhcHBlbmRpeHN1YnNlY3p6egotXGRlZlxhcHBlbmRpeHN1YnNlY3p6eiAjMXslCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX1cc3Vic3Vic2Vjbm89MCBcZ2xvYmFsXGFkdmFuY2UgXHN1YnNlY25vIGJ5IDEgJQotXHN1YnNlY2hlYWRpbmcgeyMxfXtcYXBwZW5kaXhsZXR0ZXJ9e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggc3Vic2VjZW50cnl7XHRoZVx0b2tzMH0lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcYXBwZW5kaXhsZXR0ZXJ9e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99fX0lCi1cdGVtcAotXGFwcGVuZGl4bm9kZXJlZgotXG5vYnJlYWsKLX0KLQotXG91dGVyXGRlZlx1bm51bWJlcmVkc3Vic2Vje1xwYXJzZWFyZ1x1bm51bWJlcmVkc3Vic2VjeXl5fQotXGRlZlx1bm51bWJlcmVkc3Vic2VjeXl5ICMxe1x1bm5taGVhZDJ7IzF9fSAlbm9ybWFsbHkgY2FsbHMgdW5udW1iZXJlZHN1YnNlY3p6egotXGRlZlx1bm51bWJlcmVkc3Vic2Vjenp6ICMxeyUKLVxwbGFpbnN1YnNlY2hlYWRpbmcgeyMxfVxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHVubnVtYnN1YnNlY2VudHJ5JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1x0aGVcdG9rczB9fX0lCi1cdGVtcAotXHVubnVtYm5vZGVyZWYKLVxub2JyZWFrCi19Ci0KLSUgU3Vic3Vic2VjdGlvbnMuCi1cb3V0ZXJcZGVmXG51bWJlcmVkc3Vic3Vic2Vje1xwYXJzZWFyZ1xudW1iZXJlZHN1YnN1YnNlY3l5eX0KLVxkZWZcbnVtYmVyZWRzdWJzdWJzZWN5eXkgIzF7XG51bWhlYWQzeyMxfX0gJSBub3JtYWxseSBudW1iZXJlZHN1YnN1YnNlY3p6egotXGRlZlxudW1iZXJlZHN1YnN1YnNlY3p6eiAjMXslCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX1cZ2xvYmFsXGFkdmFuY2UgXHN1YnN1YnNlY25vIGJ5IDEgJQotXHN1YnN1YnNlY2hlYWRpbmcgeyMxfQotICB7XHRoZVxjaGFwbm99e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99e1x0aGVcc3Vic3Vic2Vjbm99JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggc3Vic3Vic2VjZW50cnl7XHRoZVx0b2tzMH0lCi0gIHtcdGhlXGNoYXBub317XHRoZVxzZWNub317XHRoZVxzdWJzZWNub317XHRoZVxzdWJzdWJzZWNub319fSUKLVx0ZW1wCi1cZG9ub2RlcmVmCi1cbm9icmVhawotfQotCi1cb3V0ZXJcZGVmXGFwcGVuZGl4c3Vic3Vic2Vje1xwYXJzZWFyZ1xhcHBlbmRpeHN1YnN1YnNlY3l5eX0KLVxkZWZcYXBwZW5kaXhzdWJzdWJzZWN5eXkgIzF7XGFwcGhlYWQzeyMxfX0gJSBub3JtYWxseSBhcHBlbmRpeHN1YnN1YnNlY3p6egotXGRlZlxhcHBlbmRpeHN1YnN1YnNlY3p6eiAjMXslCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX1cZ2xvYmFsXGFkdmFuY2UgXHN1YnN1YnNlY25vIGJ5IDEgJQotXHN1YnN1YnNlY2hlYWRpbmcgeyMxfQotICB7XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfXtcdGhlXHN1YnN1YnNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHN1YnN1YnNlY2VudHJ5e1x0aGVcdG9rczB9JQotICB7XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfXtcdGhlXHN1YnN1YnNlY25vfX19JQotXHRlbXAKLVxhcHBlbmRpeG5vZGVyZWYKLVxub2JyZWFrCi19Ci0KLVxvdXRlclxkZWZcdW5udW1iZXJlZHN1YnN1YnNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHN1YnN1YnNlY3l5eX0KLVxkZWZcdW5udW1iZXJlZHN1YnN1YnNlY3l5eSAjMXtcdW5ubWhlYWQzeyMxfX0gJW5vcm1hbGx5IHVubnVtYmVyZWRzdWJzdWJzZWN6enoKLVxkZWZcdW5udW1iZXJlZHN1YnN1YnNlY3p6eiAjMXslCi1ccGxhaW5zdWJzdWJzZWNoZWFkaW5nIHsjMX1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCB1bm51bWJzdWJzdWJzZWNlbnRyeSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcdGhlXHRva3MwfX19JQotXHRlbXAKLVx1bm51bWJub2RlcmVmCi1cbm9icmVhawotfQotCi0lIFRoZXNlIGFyZSB2YXJpYW50cyB3aGljaCBhcmUgbm90ICJvdXRlciIsIHNvIHRoZXkgY2FuIGFwcGVhciBpbiBAaWZpbmZvLgotJSBBY3R1YWxseSwgdGhleSBzaG91bGQgbm93IGJlIG9ic29sZXRlOyBvcmRpbmFyeSBzZWN0aW9uIGNvbW1hbmRzIHNob3VsZCB3b3JrLgotXGRlZlxpbmZvdG9we1xwYXJzZWFyZ1x1bm51bWJlcmVkenp6fQotXGRlZlxpbmZvdW5udW1iZXJlZHtccGFyc2VhcmdcdW5udW1iZXJlZHp6en0KLVxkZWZcaW5mb3VubnVtYmVyZWRzZWN7XHBhcnNlYXJnXHVubnVtYmVyZWRzZWN6enp9Ci1cZGVmXGluZm91bm51bWJlcmVkc3Vic2Vje1xwYXJzZWFyZ1x1bm51bWJlcmVkc3Vic2Vjenp6fQotXGRlZlxpbmZvdW5udW1iZXJlZHN1YnN1YnNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHN1YnN1YnNlY3p6en0KLQotXGRlZlxpbmZvYXBwZW5kaXh7XHBhcnNlYXJnXGFwcGVuZGl4enp6fQotXGRlZlxpbmZvYXBwZW5kaXhzZWN7XHBhcnNlYXJnXGFwcGVuZGl4c2Vjenp6fQotXGRlZlxpbmZvYXBwZW5kaXhzdWJzZWN7XHBhcnNlYXJnXGFwcGVuZGl4c3Vic2Vjenp6fQotXGRlZlxpbmZvYXBwZW5kaXhzdWJzdWJzZWN7XHBhcnNlYXJnXGFwcGVuZGl4c3Vic3Vic2Vjenp6fQotCi1cZGVmXGluZm9jaGFwdGVye1xwYXJzZWFyZ1xjaGFwdGVyenp6fQotXGRlZlxpbmZvc2VjdGlvbntccGFyc2Vhcmdcc2VjdGlvbnp6en0KLVxkZWZcaW5mb3N1YnNlY3Rpb257XHBhcnNlYXJnXHN1YnNlY3Rpb256enp9Ci1cZGVmXGluZm9zdWJzdWJzZWN0aW9ue1xwYXJzZWFyZ1xzdWJzdWJzZWN0aW9uenp6fQotCi0lIFRoZXNlIG1hY3JvcyBjb250cm9sIHdoYXQgdGhlIHNlY3Rpb24gY29tbWFuZHMgZG8sIGFjY29yZGluZwotJSB0byB3aGF0IGtpbmQgb2YgY2hhcHRlciB3ZSBhcmUgaW4gKG9yZGluYXJ5LCBhcHBlbmRpeCwgb3IgdW5udW1iZXJlZCkuCi0lIERlZmluZSB0aGVtIGJ5IGRlZmF1bHQgZm9yIGEgbnVtYmVyZWQgY2hhcHRlci4KLVxnbG9iYWxcbGV0XHNlY3Rpb24gPSBcbnVtYmVyZWRzZWMKLVxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcbnVtYmVyZWRzdWJzZWMKLVxnbG9iYWxcbGV0XHN1YnN1YnNlY3Rpb24gPSBcbnVtYmVyZWRzdWJzdWJzZWMKLQotJSBEZWZpbmUgQG1ham9yaGVhZGluZywgQGhlYWRpbmcgYW5kIEBzdWJoZWFkaW5nCi0KLSUgTk9URSBvbiB1c2Ugb2YgXHZib3ggZm9yIGNoYXB0ZXIgaGVhZGluZ3MsIHNlY3Rpb24gaGVhZGluZ3MsIGFuZCBzdWNoOgotJSAgICAgICAxKSBXZSB1c2UgXHZib3ggcmF0aGVyIHRoYW4gdGhlIGVhcmxpZXIgXGxpbmUgdG8gcGVybWl0Ci0lICAgICAgICAgIG92ZXJsb25nIGhlYWRpbmdzIHRvIGZvbGQuCi0lICAgICAgIDIpIFxoeXBoZW5wZW5hbHR5IGlzIHNldCB0byAxMDAwMCBiZWNhdXNlIGh5cGhlbmF0aW9uIGluIGEKLSUgICAgICAgICAgaGVhZGluZyBpcyBvYm5veGlvdXM7IHRoaXMgZm9yYmlkcyBpdC4KLSUgICAgICAgMykgTGlrZXdpc2UsIGhlYWRpbmdzIGxvb2sgYmVzdCBpZiBubyBccGFyaW5kZW50IGlzIHVzZWQsIGFuZAotJSAgICAgICAgICBpZiBqdXN0aWZpY2F0aW9uIGlzIG5vdCBhdHRlbXB0ZWQuICBIZW5jZSBccmFnZ2VkcmlnaHQuCi0KLQotXGRlZlxtYWpvcmhlYWRpbmd7XHBhcnNlYXJnXG1ham9yaGVhZGluZ3p6en0KLVxkZWZcbWFqb3JoZWFkaW5nenp6ICMxeyUKLXtcYWR2YW5jZVxjaGFwaGVhZGluZ3NraXAgYnkgMTBwdCBcY2hhcGJyZWFrIH0lCi17XGNoYXBmb250cyBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMFx0b2xlcmFuY2U9NTAwMAotICAgICAgICAgICAgICAgICAgXHBhcmluZGVudD0wcHRccmFnZ2VkcmlnaHQKLSAgICAgICAgICAgICAgICAgIFxybSAjMVxoZmlsbH19XGJpZ3NraXAgXHBhclxwZW5hbHR5IDIwMH0KLQotXGRlZlxjaGFwaGVhZGluZ3tccGFyc2VhcmdcY2hhcGhlYWRpbmd6enp9Ci1cZGVmXGNoYXBoZWFkaW5nenp6ICMxe1xjaGFwYnJlYWsgJQote1xjaGFwZm9udHMgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDBcdG9sZXJhbmNlPTUwMDAKLSAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0XHJhZ2dlZHJpZ2h0Ci0gICAgICAgICAgICAgICAgICBccm0gIzFcaGZpbGx9fVxiaWdza2lwIFxwYXJccGVuYWx0eSAyMDB9Ci0KLSUgQGhlYWRpbmcsIEBzdWJoZWFkaW5nLCBAc3Vic3ViaGVhZGluZy4KLVxkZWZcaGVhZGluZ3tccGFyc2VhcmdccGxhaW5zZWNoZWFkaW5nfQotXGRlZlxzdWJoZWFkaW5ne1xwYXJzZWFyZ1xwbGFpbnN1YnNlY2hlYWRpbmd9Ci1cZGVmXHN1YnN1YmhlYWRpbmd7XHBhcnNlYXJnXHBsYWluc3Vic3Vic2VjaGVhZGluZ30KLQotJSBUaGVzZSBtYWNyb3MgZ2VuZXJhdGUgYSBjaGFwdGVyLCBzZWN0aW9uLCBldGMuIGhlYWRpbmcgb25seQotJSAoaW5jbHVkaW5nIHdoaXRlc3BhY2UsIGxpbmVicmVha2luZywgZXRjLiBhcm91bmQgaXQpLAotJSBnaXZlbiBhbGwgdGhlIGluZm9ybWF0aW9uIGluIGNvbnZlbmllbnQsIHBhcnNlZCBmb3JtLgotCi0lJSUgQXJncyBhcmUgdGhlIHNraXAgYW5kIHBlbmFsdHkgKHVzdWFsbHkgbmVnYXRpdmUpCi1cZGVmXGRvYnJlYWsjMSMye1xwYXJcaWZkaW1cbGFzdHNraXA8IzFccmVtb3ZlbGFzdHNraXBccGVuYWx0eSMyXHZza2lwIzFcZml9Ci0KLVxkZWZcc2V0Y2hhcHRlcnN0eWxlICMxIHtcY3NuYW1lIENIQVBGIzFcZW5kY3NuYW1lfQotCi0lJSUgRGVmaW5lIHBsYWluIGNoYXB0ZXIgc3RhcnRzLCBhbmQgcGFnZSBvbi9vZmYgc3dpdGNoaW5nIGZvciBpdAotJSBQYXJhbWV0ZXIgY29udHJvbGxpbmcgc2tpcCBiZWZvcmUgY2hhcHRlciBoZWFkaW5ncyAoaWYgbmVlZGVkKQotCi1cbmV3c2tpcFxjaGFwaGVhZGluZ3NraXAKLQotXGRlZlxjaGFwYnJlYWt7XGRvYnJlYWsgXGNoYXBoZWFkaW5nc2tpcCB7LTQwMDB9fQotXGRlZlxjaGFwcGFnZXJ7XHBhclx2ZmlsbFxzdXBlcmVqZWN0fQotXGRlZlxjaGFwb2RkcGFnZXtcY2hhcHBhZ2VyIFxpZm9kZFxwYWdlbm8gXGVsc2UgXGhib3ggdG8gMHB0e30gXGNoYXBwYWdlclxmaX0KLQotXGRlZlxzZXRjaGFwdGVybmV3cGFnZSAjMSB7XGNzbmFtZSBDSEFQUEFHIzFcZW5kY3NuYW1lfQotCi1cZGVmXENIQVBQQUdvZmZ7JQotXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgotXGdsb2JhbFxsZXRccGNoYXBzZXBtYWNybz1cY2hhcGJyZWFrCi1cZ2xvYmFsXGxldFxwYWdlYWxpZ25tYWNybz1cY2hhcHBhZ2VyfQotCi1cZGVmXENIQVBQQUdvbnslCi1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCi1cZ2xvYmFsXGxldFxwY2hhcHNlcG1hY3JvPVxjaGFwcGFnZXIKLVxnbG9iYWxcbGV0XHBhZ2VhbGlnbm1hY3JvPVxjaGFwcGFnZXIKLVxnbG9iYWxcZGVmXEhFQURJTkdTb257XEhFQURJTkdTc2luZ2xlfX0KLQotXGRlZlxDSEFQUEFHb2RkewotXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBvZGRwYWdlCi1cZ2xvYmFsXGxldFxwY2hhcHNlcG1hY3JvPVxjaGFwb2RkcGFnZQotXGdsb2JhbFxsZXRccGFnZWFsaWdubWFjcm89XGNoYXBvZGRwYWdlCi1cZ2xvYmFsXGRlZlxIRUFESU5HU29ue1xIRUFESU5HU2RvdWJsZX19Ci0KLVxDSEFQUEFHb24KLQotXGRlZlxDSEFQRnBsYWluewotXGdsb2JhbFxsZXRcY2hhcG1hY3JvPVxjaGZwbGFpbgotXGdsb2JhbFxsZXRcdW5udW1iY2hhcG1hY3JvPVx1bm5jaGZwbGFpbgotXGdsb2JhbFxsZXRcY2VudGVyY2hhcG1hY3JvPVxjZW50ZXJjaGZwbGFpbn0KLQotJSBQbGFpbiBjaGFwdGVyIG9wZW5pbmcuCi0lICMxIGlzIHRoZSB0ZXh0LCAjMiB0aGUgY2hhcHRlciBudW1iZXIgb3IgZW1wdHkgaWYgdW5udW1iZXJlZC4KLVxkZWZcY2hmcGxhaW4jMSMyeyUKLSAgXHBjaGFwc2VwbWFjcm8KLSAgeyUKLSAgICBcY2hhcGZvbnRzIFxybQotICAgIFxkZWZcY2hhcG51bXsjMn0lCi0gICAgXHNldGJveDAgPSBcaGJveHsjMlxpZnhcY2hhcG51bVxlbXB0eVxlbHNlXGVuc3BhY2VcZml9JQotICAgIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwIFx0b2xlcmFuY2U9NTAwMCBccGFyaW5kZW50PTBwdCBccmFnZ2VkcmlnaHQKLSAgICAgICAgICBcaGFuZ2luZGVudCA9IFx3ZDAgXGNlbnRlcnBhcmFtZXRlcnNtYXliZQotICAgICAgICAgIFx1bmhib3gwICMxXHBhcn0lCi0gIH0lCi0gIFxub2JyZWFrXGJpZ3NraXAgJSBubyBwYWdlIGJyZWFrIGFmdGVyIGEgY2hhcHRlciB0aXRsZQotICBcbm9icmVhawotfQotCi0lIFBsYWluIG9wZW5pbmcgZm9yIHVubnVtYmVyZWQuCi1cZGVmXHVubmNoZnBsYWluIzF7XGNoZnBsYWlueyMxfXt9fQotCi0lIEBjZW50ZXJjaGFwIC0tIGNlbnRlcmVkIGFuZCB1bm51bWJlcmVkLgotXGxldFxjZW50ZXJwYXJhbWV0ZXJzbWF5YmUgPSBccmVsYXgKLVxkZWZcY2VudGVyY2hmcGxhaW4jMXt7JQotICBcZGVmXGNlbnRlcnBhcmFtZXRlcnNtYXliZXslCi0gICAgXGFkdmFuY2VccmlnaHRza2lwIGJ5IDNccmlnaHRza2lwCi0gICAgXGxlZnRza2lwID0gXHJpZ2h0c2tpcAotICAgIFxwYXJmaWxsc2tpcCA9IDBwdAotICB9JQotICBcY2hmcGxhaW57IzF9e30lCi19fQotCi1cQ0hBUEZwbGFpbiAlIFRoZSBkZWZhdWx0Ci0KLVxkZWZcdW5uY2hmb3BlbiAjMXslCi1cY2hhcG9kZHBhZ2Uge1xjaGFwZm9udHMgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDBcdG9sZXJhbmNlPTUwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgXHBhcmluZGVudD0wcHRccmFnZ2VkcmlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgXHJtICMxXGhmaWxsfX1cYmlnc2tpcCBccGFyXG5vYnJlYWsKLX0KLQotXGRlZlxjaGZvcGVuICMxIzJ7XGNoYXBvZGRwYWdlIHtcY2hhcGZvbnRzCi1cdmJveCB0byAzaW57XHZmaWwgXGhib3ggdG9caHNpemV7XGhmaWwgIzJ9IFxoYm94IHRvXGhzaXple1xoZmlsICMxfSBcdmZpbH19JQotXHBhclxwZW5hbHR5IDUwMDAgJQotfQotCi1cZGVmXGNlbnRlcmNoZm9wZW4gIzF7JQotXGNoYXBvZGRwYWdlIHtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCi0gICAgICAgICAgICAgICAgICAgICAgIFxwYXJpbmRlbnQ9MHB0Ci0gICAgICAgICAgICAgICAgICAgICAgIFxoZmlsbCB7XHJtICMxfVxoZmlsbH19XGJpZ3NraXAgXHBhclxub2JyZWFrCi19Ci0KLVxkZWZcQ0hBUEZvcGVuewotXGdsb2JhbFxsZXRcY2hhcG1hY3JvPVxjaGZvcGVuCi1cZ2xvYmFsXGxldFx1bm51bWJjaGFwbWFjcm89XHVubmNoZm9wZW4KLVxnbG9iYWxcbGV0XGNlbnRlcmNoYXBtYWNybz1cY2VudGVyY2hmb3Blbn0KLQotCi0lIFNlY3Rpb24gdGl0bGVzLgotXG5ld3NraXBcc2VjaGVhZGluZ3NraXAKLVxkZWZcc2VjaGVhZGluZ2JyZWFre1xkb2JyZWFrIFxzZWNoZWFkaW5nc2tpcCB7LTEwMDB9fQotXGRlZlxzZWNoZWFkaW5nIzEjMiMze1xzZWN0aW9uaGVhZGluZ3tzZWN9eyMyLiMzfXsjMX19Ci1cZGVmXHBsYWluc2VjaGVhZGluZyMxe1xzZWN0aW9uaGVhZGluZ3tzZWN9e317IzF9fQotCi0lIFN1YnNlY3Rpb24gdGl0bGVzLgotXG5ld3NraXAgXHN1YnNlY2hlYWRpbmdza2lwCi1cZGVmXHN1YnNlY2hlYWRpbmdicmVha3tcZG9icmVhayBcc3Vic2VjaGVhZGluZ3NraXAgey01MDB9fQotXGRlZlxzdWJzZWNoZWFkaW5nIzEjMiMzIzR7XHNlY3Rpb25oZWFkaW5ne3N1YnNlY317IzIuIzMuIzR9eyMxfX0KLVxkZWZccGxhaW5zdWJzZWNoZWFkaW5nIzF7XHNlY3Rpb25oZWFkaW5ne3N1YnNlY317fXsjMX19Ci0KLSUgU3Vic3Vic2VjdGlvbiB0aXRsZXMuCi1cbGV0XHN1YnN1YnNlY2hlYWRpbmdza2lwID0gXHN1YnNlY2hlYWRpbmdza2lwCi1cbGV0XHN1YnN1YnNlY2hlYWRpbmdicmVhayA9IFxzdWJzZWNoZWFkaW5nYnJlYWsKLVxkZWZcc3Vic3Vic2VjaGVhZGluZyMxIzIjMyM0IzV7XHNlY3Rpb25oZWFkaW5ne3N1YnN1YnNlY317IzIuIzMuIzQuIzV9eyMxfX0KLVxkZWZccGxhaW5zdWJzdWJzZWNoZWFkaW5nIzF7XHNlY3Rpb25oZWFkaW5ne3N1YnN1YnNlY317fXsjMX19Ci0KLQotJSBQcmludCBhbnkgc2l6ZSBzZWN0aW9uIHRpdGxlLgotJQotJSAjMSBpcyB0aGUgc2VjdGlvbiB0eXBlIChzZWMvc3Vic2VjL3N1YnN1YnNlYyksICMyIGlzIHRoZSBzZWN0aW9uCi0lIG51bWJlciAobWF5YmUgZW1wdHkpLCAjMyB0aGUgdGV4dC4KLVxkZWZcc2VjdGlvbmhlYWRpbmcjMSMyIzN7JQotICB7JQotICAgIFxleHBhbmRhZnRlclxhZHZhbmNlXGNzbmFtZSAjMWhlYWRpbmdza2lwXGVuZGNzbmFtZSBieSBccGFyc2tpcAotICAgIFxjc25hbWUgIzFoZWFkaW5nYnJlYWtcZW5kY3NuYW1lCi0gIH0lCi0gIHslCi0gICAgJSBTd2l0Y2ggdG8gdGhlIHJpZ2h0IHNldCBvZiBmb250cy4KLSAgICBcY3NuYW1lICMxZm9udHNcZW5kY3NuYW1lIFxybQotICAgICUKLSAgICAlIE9ubHkgaW5zZXJ0IHRoZSBzZXBhcmF0aW5nIHNwYWNlIGlmIHdlIGhhdmUgYSBzZWN0aW9uIG51bWJlci4KLSAgICBcZGVmXHNlY251bXsjMn0lCi0gICAgXHNldGJveDAgPSBcaGJveHsjMlxpZnhcc2VjbnVtXGVtcHR5XGVsc2VcZW5zcGFjZVxmaX0lCi0gICAgJQotICAgIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwIFx0b2xlcmFuY2U9NTAwMCBccGFyaW5kZW50PTBwdCBccmFnZ2VkcmlnaHQKLSAgICAgICAgICBcaGFuZ2luZGVudCA9IFx3ZDAgJSB6ZXJvIGlmIG5vIHNlY3Rpb24gbnVtYmVyCi0gICAgICAgICAgXHVuaGJveDAgIzN9JQotICB9JQotICBcaWZkaW1ccGFyc2tpcDwxMHB0IFxub2JyZWFrXGtlcm4xMHB0XG5vYnJlYWtca2Vybi1ccGFyc2tpcFxmaSBcbm9icmVhawotfQotCi0KLVxtZXNzYWdle3RvYyx9Ci1cbmV3d3JpdGVcdG9jZmlsZQotCi0lIFdyaXRlIGFuIGVudHJ5IHRvIHRoZSB0b2MgZmlsZSwgb3BlbmluZyBpdCBpZiBuZWNlc3NhcnkuCi0lIENhbGxlZCBmcm9tIEBjaGFwdGVyLCBldGMuICBXZSBzdXBwbHkge1xmb2xpb30gYXQgdGhlIGVuZCBvZiB0aGUKLSUgYXJndW1lbnQsIHdoaWNoIHdpbGwgZW5kIHVwIGFzIHRoZSBsYXN0IGFyZ3VtZW50IHRvIHRoZSBcLi4uZW50cnkgbWFjcm8uCi0lIAotJSBXZSBvcGVuIHRoZSAudG9jIGZpbGUgaGVyZSBpbnN0ZWFkIG9mIGF0IEBzZXRmaWxlbmFtZSBvciBhbnkgb3RoZXIKLSUgZ2l2ZW4gdGltZSBzbyB0aGF0IEBjb250ZW50cyBjYW4gYmUgcHV0IGluIHRoZSBkb2N1bWVudCBhbnl3aGVyZS4KLSUgCi1cbmV3aWZcaWZ0b2NmaWxlb3BlbmVkCi1cZGVmXHdyaXRldG9jZW50cnkjMXslCi0gIFxpZnRvY2ZpbGVvcGVuZWRcZWxzZQotICAgIFxpbW1lZGlhdGVcb3Blbm91dFx0b2NmaWxlID0gXGpvYm5hbWUudG9jCi0gICAgXGdsb2JhbFx0b2NmaWxlb3BlbmVkdHJ1ZQotICBcZmkKLSAgXGlmbGlua3MgXHdyaXRlXHRvY2ZpbGV7IzF7XGZvbGlvfX1cZmkKLX0KLQotXG5ld3NraXBcY29udGVudHNyaWdodG1hcmdpbiBcY29udGVudHNyaWdodG1hcmdpbj0xaW4KLVxuZXdjb3VudFxzYXZlcGFnZW5vCi1cbmV3Y291bnRcbGFzdG5lZ2F0aXZlcGFnZW5vIFxsYXN0bmVnYXRpdmVwYWdlbm8gPSAtMQotCi0lIEZpbmlzaCB1cCB0aGUgbWFpbiB0ZXh0IGFuZCBwcmVwYXJlIHRvIHJlYWQgd2hhdCB3ZSd2ZSB3cml0dGVuCi0lIHRvIFx0b2NmaWxlLgotJSAKLVxkZWZcc3RhcnRjb250ZW50cyMxeyUKLSAgICUgSWYgQHNldGNoYXB0ZXJuZXdwYWdlIG9uLCBhbmQgQGhlYWRpbmdzIGRvdWJsZSwgdGhlIGNvbnRlbnRzIHNob3VsZAotICAgJSBzdGFydCBvbiBhbiBvZGQgcGFnZSwgdW5saWtlIGNoYXB0ZXJzLiAgVGh1cywgd2UgbWFpbnRhaW4KLSAgICUgXGNvbnRlbnRzYWxpZ25tYWNybyBpbiBwYXJhbGxlbCB3aXRoIFxwYWdlYWxpZ25tYWNyby4KLSAgICUgRnJvbTogVG9yYmpvcm4gR3Jhbmx1bmQgPHRlZ2VAbWF0ZW1hdGlrLnN1LnNlPgotICAgXGNvbnRlbnRzYWxpZ25tYWNybwotICAgXGltbWVkaWF0ZVxjbG9zZW91dFx0b2NmaWxlCi0gICAlCi0gICAlIERvbid0IG5lZWQgdG8gcHV0IGBDb250ZW50cycgb3IgYFNob3J0IENvbnRlbnRzJyBpbiB0aGUgaGVhZGxpbmUuCi0gICAlIEl0IGlzIGFidW5kYW50bHkgY2xlYXIgd2hhdCB0aGV5IGFyZS4KLSAgIFx1bm51bWJjaGFwbWFjcm97IzF9XGRlZlx0aGlzY2hhcHRlcnt9JQotICAgXHNhdmVwYWdlbm8gPSBccGFnZW5vCi0gICBcYmVnaW5ncm91cCAgICAgICAgICAgICAgICAgICUgU2V0IHVwIHRvIGhhbmRsZSBjb250ZW50cyBmaWxlcyBwcm9wZXJseS4KLSAgICAgIFxjYXRjb2RlYFxcPTAgIFxjYXRjb2RlYFx7PTEgIFxjYXRjb2RlYFx9PTIgIFxjYXRjb2RlYFxAPTExCi0gICAgICAlIFdlIGNhbid0IGRvIHRoaXMsIGJlY2F1c2UgdGhlbiBhbiBhY3R1YWwgXiBpbiBhIHNlY3Rpb24KLSAgICAgICUgdGl0bGUgZmFpbHMsIGUuZy4sIEBjaGFwdGVyIF4gLS0gZXhwb25lbnRpYXRpb24uICAtLWthcmwsIDlqdWw5Ny4KLSAgICAgICVcY2F0Y29kZWBcXj03ICUgdG8gc2VlIF5eZTQgYXMgXCJhIGV0Yy4ganVoYUBwaXVoYS55ZGkudnR0LmZpCi0gICAgICBccmFnZ2VkYm90dG9tICAgICAgICAgICAgICUgV29ycnkgbW9yZSBhYm91dCBicmVha3BvaW50cyB0aGFuIHRoZSBib3R0b20uCi0gICAgICBcYWR2YW5jZVxoc2l6ZSBieSAtXGNvbnRlbnRzcmlnaHRtYXJnaW4gJSBEb24ndCB1c2UgdGhlIGZ1bGwgbGluZSBsZW5ndGguCi0gICAgICAlCi0gICAgICAlIFJvbWFuIG51bWVyYWxzIGZvciBwYWdlIG51bWJlcnMuCi0gICAgICBcaWZudW0gXHBhZ2Vubz4wIFxwYWdlbm8gPSBcbGFzdG5lZ2F0aXZlcGFnZW5vIFxmaQotfQotCi0KLSUgTm9ybWFsIChsb25nKSB0b2MuCi1cZGVmXGNvbnRlbnRzeyUKLSAgIFxzdGFydGNvbnRlbnRze1xwdXR3b3JkVGFibGVvZkNvbnRlbnRzfSUKLSAgICAgXG9wZW5pbiAxIFxqb2JuYW1lLnRvYwotICAgICBcaWZlb2YgMSBcZWxzZQotICAgICAgIFxjbG9zZWluIDEKLSAgICAgICBcaW5wdXQgXGpvYm5hbWUudG9jCi0gICAgIFxmaQotICAgICBcdmZpbGwgXGVqZWN0Ci0gICBcZW5kZ3JvdXAKLSAgIFxsYXN0bmVnYXRpdmVwYWdlbm8gPSBccGFnZW5vCi0gICBccGFnZW5vID0gXHNhdmVwYWdlbm8KLX0KLQotJSBBbmQganVzdCB0aGUgY2hhcHRlcnMuCi1cZGVmXHN1bW1hcnljb250ZW50c3slCi0gICBcc3RhcnRjb250ZW50c3tccHV0d29yZFNob3J0Q29udGVudHN9JQotICAgICAgJQotICAgICAgXGxldFxjaGFwZW50cnkgPSBcc2hvcnRjaGFwZW50cnkKLSAgICAgIFxsZXRcdW5udW1iY2hhcGVudHJ5ID0gXHNob3J0dW5udW1iZXJlZGVudHJ5Ci0gICAgICAlIFdlIHdhbnQgYSB0cnVlIHJvbWFuIGhlcmUgZm9yIHRoZSBwYWdlIG51bWJlcnMuCi0gICAgICBcc2VjZm9udHMKLSAgICAgIFxsZXRccm09XHNob3J0Y29udHJtIFxsZXRcYmY9XHNob3J0Y29udGJmIFxsZXRcc2w9XHNob3J0Y29udHNsCi0gICAgICBccm0KLSAgICAgIFxoeXBoZW5wZW5hbHR5ID0gMTAwMDAKLSAgICAgIFxhZHZhbmNlXGJhc2VsaW5lc2tpcCBieSAxcHQgJSBPcGVuIGl0IHVwIGEgbGl0dGxlLgotICAgICAgXGRlZlxzZWNlbnRyeSAjIzEjIzIjIzMjIzR7fQotICAgICAgXGRlZlx1bm51bWJzZWNlbnRyeSAjIzEjIzJ7fQotICAgICAgXGRlZlxzdWJzZWNlbnRyeSAjIzEjIzIjIzMjIzQjIzV7fQotICAgICAgXGRlZlx1bm51bWJzdWJzZWNlbnRyeSAjIzEjIzJ7fQotICAgICAgXGRlZlxzdWJzdWJzZWNlbnRyeSAjIzEjIzIjIzMjIzQjIzUjIzZ7fQotICAgICAgXGRlZlx1bm51bWJzdWJzdWJzZWNlbnRyeSAjIzEjIzJ7fQotICAgICAgXG9wZW5pbiAxIFxqb2JuYW1lLnRvYwotICAgICAgXGlmZW9mIDEgXGVsc2UKLSAgICAgICAgXGNsb3NlaW4gMQotICAgICAgICBcaW5wdXQgXGpvYm5hbWUudG9jCi0gICAgICBcZmkKLSAgICAgXHZmaWxsIFxlamVjdAotICAgXGVuZGdyb3VwCi0gICBcbGFzdG5lZ2F0aXZlcGFnZW5vID0gXHBhZ2VubwotICAgXHBhZ2VubyA9IFxzYXZlcGFnZW5vCi19Ci1cbGV0XHNob3J0Y29udGVudHMgPSBcc3VtbWFyeWNvbnRlbnRzCi0KLSUgVGhlc2UgbWFjcm9zIGdlbmVyYXRlIGluZGl2aWR1YWwgZW50cmllcyBpbiB0aGUgdGFibGUgb2YgY29udGVudHMuCi0lIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY2hhcHRlciBvciBzZWN0aW9uIG5hbWUuCi0lIFRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBwYWdlIG51bWJlci4KLSUgVGhlIGFyZ3VtZW50cyBpbiBiZXR3ZWVuIGFyZSB0aGUgY2hhcHRlciBudW1iZXIsIHNlY3Rpb24gbnVtYmVyLCAuLi4KLQotJSBDaGFwdGVyLWxldmVsIHRoaW5ncywgZm9yIGJvdGggdGhlIGxvbmcgYW5kIHNob3J0IGNvbnRlbnRzLgotXGRlZlxjaGFwZW50cnkjMSMyIzN7XGRvY2hhcGVudHJ5eyMyXGxhYmVsc3BhY2UjMX17IzN9fQotCi0lIFNlZSBjb21tZW50cyBpbiBcZG9jaGFwZW50cnkgcmUgdmJveCBhbmQgcmVsYXRlZCBzZXR0aW5ncwotXGRlZlxzaG9ydGNoYXBlbnRyeSMxIzIjM3slCi0gIFx0b2NlbnRyeXtcc2hvcnRjaGFwbGFiZWx7IzJ9XGxhYmVsc3BhY2UgIzF9e1xkb3Nob3J0cGFnZW5veyMzfX0lCi19Ci0KLSUgVHlwZXNldCB0aGUgbGFiZWwgZm9yIGEgY2hhcHRlciBvciBhcHBlbmRpeCBmb3IgdGhlIHNob3J0IGNvbnRlbnRzLgotJSBUaGUgYXJnIGlzLCBlLmcuIGBBcHBlbmRpeCBBJyBmb3IgYW4gYXBwZW5kaXgsIG9yIGAzJyBmb3IgYSBjaGFwdGVyLgotJSBXZSBjb3VsZCBzaW1wbGlmeSB0aGUgY29kZSBoZXJlIGJ5IHdyaXRpbmcgb3V0IGFuIFxhcHBlbmRpeGVudHJ5Ci0lIGNvbW1hbmQgaW4gdGhlIHRvYyBmaWxlIGZvciBhcHBlbmRpY2VzLCBpbnN0ZWFkIG9mIHVzaW5nIFxjaGFwZW50cnkKLSUgZm9yIGJvdGgsIGJ1dCBpdCBkb2Vzbid0IHNlZW0gd29ydGggaXQuCi1cc2V0Ym94MCA9IFxoYm94e1xzaG9ydGNvbnRybSBccHV0d29yZEFwcGVuZGl4IH0KLVxuZXdkaW1lblxzaG9ydGFwcGVuZGl4d2lkdGggXHNob3J0YXBwZW5kaXh3aWR0aCA9IFx3ZDAKLQotXGRlZlxzaG9ydGNoYXBsYWJlbCMxeyUKLSAgJSBXZSB0eXBlc2V0ICMxIGluIGEgYm94IG9mIGNvbnN0YW50IHdpZHRoLCByZWdhcmRsZXNzIG9mIHRoZSB0ZXh0IG9mCi0gICUgIzEsIHNvIHRoZSBjaGFwdGVyIHRpdGxlcyB3aWxsIGNvbWUgb3V0IGFsaWduZWQuCi0gIFxzZXRib3gwID0gXGhib3h7IzF9JQotICBcZGltZW4wID0gXGlmZGltXHdkMCA+IFxzaG9ydGFwcGVuZGl4d2lkdGggXHNob3J0YXBwZW5kaXh3aWR0aCBcZWxzZSAwcHQgXGZpCi0gICUKLSAgJSBUaGlzIHNwYWNlIHNob3VsZCBiZSBwbGVudHksIHNpbmNlIGEgc2luZ2xlIG51bWJlciBpcyAuNWVtLCBhbmQgdGhlCi0gICUgd2lkZXN0IGxldHRlciAoTSkgaXMgMWVtLCBhdCBsZWFzdCBpbiB0aGUgQ29tcHV0ZXIgTW9kZXJuIGZvbnRzLgotICAlIChUaGlzIHNwYWNlIGRvZXNuJ3QgaW5jbHVkZSB0aGUgZXh0cmEgc3BhY2UgdGhhdCBnZXRzIGFkZGVkIGFmdGVyCi0gICUgdGhlIGxhYmVsOyB0aGF0IGdldHMgcHV0IGluIGJ5IFxzaG9ydGNoYXBlbnRyeSBhYm92ZS4pCi0gIFxhZHZhbmNlXGRpbWVuMCBieSAxLjFlbQotICBcaGJveCB0byBcZGltZW4weyMxXGhmaWx9JQotfQotCi1cZGVmXHVubnVtYmNoYXBlbnRyeSMxIzJ7XGRvY2hhcGVudHJ5eyMxfXsjMn19Ci1cZGVmXHNob3J0dW5udW1iZXJlZGVudHJ5IzEjMntcdG9jZW50cnl7IzF9e1xkb3Nob3J0cGFnZW5veyMyfX19Ci0KLSUgU2VjdGlvbnMuCi1cZGVmXHNlY2VudHJ5IzEjMiMzIzR7XGRvc2VjZW50cnl7IzIuIzNcbGFiZWxzcGFjZSMxfXsjNH19Ci1cZGVmXHVubnVtYnNlY2VudHJ5IzEjMntcZG9zZWNlbnRyeXsjMX17IzJ9fQotCi0lIFN1YnNlY3Rpb25zLgotXGRlZlxzdWJzZWNlbnRyeSMxIzIjMyM0IzV7XGRvc3Vic2VjZW50cnl7IzIuIzMuIzRcbGFiZWxzcGFjZSMxfXsjNX19Ci1cZGVmXHVubnVtYnN1YnNlY2VudHJ5IzEjMntcZG9zdWJzZWNlbnRyeXsjMX17IzJ9fQotCi0lIEFuZCBzdWJzdWJzZWN0aW9ucy4KLVxkZWZcc3Vic3Vic2VjZW50cnkjMSMyIzMjNCM1IzZ7JQotICBcZG9zdWJzdWJzZWNlbnRyeXsjMi4jMy4jNC4jNVxsYWJlbHNwYWNlIzF9eyM2fX0KLVxkZWZcdW5udW1ic3Vic3Vic2VjZW50cnkjMSMye1xkb3N1YnN1YnNlY2VudHJ5eyMxfXsjMn19Ci0KLSUgVGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIGluZGVudGF0aW9uIG9mIHRoZSB2YXJpb3VzIGxldmVscy4KLVxuZXdkaW1lblx0b2NpbmRlbnQgXHRvY2luZGVudCA9IDNwYwotCi0lIE5vdyBmb3IgdGhlIGFjdHVhbCB0eXBlc2V0dGluZy4gSW4gYWxsIHRoZXNlLCAjMSBpcyB0aGUgdGV4dCBhbmQgIzIgaXMgdGhlCi0lIHBhZ2UgbnVtYmVyLgotJQotJSBJZiB0aGUgdG9jIGhhcyB0byBiZSBicm9rZW4gb3ZlciBwYWdlcywgd2Ugd2FudCBpdCB0byBiZSBhdCBjaGFwdGVycwotJSBpZiBhdCBhbGwgcG9zc2libGU7IGhlbmNlIHRoZSBccGVuYWx0eS4KLVxkZWZcZG9jaGFwZW50cnkjMSMyeyUKLSAgIFxwZW5hbHR5LTMwMCBcdnNraXAxXGJhc2VsaW5lc2tpcCBwbHVzLjMzXGJhc2VsaW5lc2tpcCBtaW51cy4yNVxiYXNlbGluZXNraXAKLSAgIFxiZWdpbmdyb3VwCi0gICAgIFxjaGFwZW50cnlmb250cwotICAgICBcdG9jZW50cnl7IzF9e1xkb3BhZ2Vub3sjMn19JQotICAgXGVuZGdyb3VwCi0gICBcbm9icmVha1x2c2tpcCAuMjVcYmFzZWxpbmVza2lwIHBsdXMuMVxiYXNlbGluZXNraXAKLX0KLQotXGRlZlxkb3NlY2VudHJ5IzEjMntcYmVnaW5ncm91cAotICBcc2VjZW50cnlmb250cyBcbGVmdHNraXA9XHRvY2luZGVudAotICBcdG9jZW50cnl7IzF9e1xkb3BhZ2Vub3sjMn19JQotXGVuZGdyb3VwfQotCi1cZGVmXGRvc3Vic2VjZW50cnkjMSMye1xiZWdpbmdyb3VwCi0gIFxzdWJzZWNlbnRyeWZvbnRzIFxsZWZ0c2tpcD0yXHRvY2luZGVudAotICBcdG9jZW50cnl7IzF9e1xkb3BhZ2Vub3sjMn19JQotXGVuZGdyb3VwfQotCi1cZGVmXGRvc3Vic3Vic2VjZW50cnkjMSMye1xiZWdpbmdyb3VwCi0gIFxzdWJzdWJzZWNlbnRyeWZvbnRzIFxsZWZ0c2tpcD0zXHRvY2luZGVudAotICBcdG9jZW50cnl7IzF9e1xkb3BhZ2Vub3sjMn19JQotXGVuZGdyb3VwfQotCi0lIEZpbmFsIHR5cGVzZXR0aW5nIG9mIGEgdG9jIGVudHJ5OyB3ZSB1c2UgdGhlIHNhbWUgXGVudHJ5IG1hY3JvIGFzIGZvcgotJSB0aGUgaW5kZXggZW50cmllcywgYnV0IHdlIHdhbnQgdG8gc3VwcHJlc3MgaHlwaGVuYXRpb24gaGVyZS4gIChXZQotJSBjYW4ndCBkbyB0aGF0IGluIHRoZSBcZW50cnkgbWFjcm8sIHNpbmNlIGluZGV4IGVudHJpZXMgbWlnaHQgY29uc2lzdAotJSBvZiBoeXBoZW5hdGVkLWlkZW50aWZpZXJzLXRoYXQtZG8tbm90LWZpdC1vbi1hLWxpbmUtYW5kLW5vdGhpbmctZWxzZS4pCi1cZGVmXHRvY2VudHJ5IzEjMntcYmVnaW5ncm91cAotICBcdnNraXAgMHB0IHBsdXMxcHQgJSBhbGxvdyBhIGxpdHRsZSBzdHJldGNoIGZvciB0aGUgc2FrZSBvZiBuaWNlIHBhZ2UgYnJlYWtzCi0gICUgRG8gbm90IHVzZSBcdHVybm9mZmFjdGl2ZSBpbiB0aGVzZSBhcmd1bWVudHMuICBTaW5jZSB0aGUgdG9jIGlzCi0gICUgdHlwZXNldCBpbiBjbXIsIHNvIGNoYXJhY3RlcnMgc3VjaCBhcyBfIHdvdWxkIGNvbWUgb3V0IHdyb25nOyB3ZQotICAlIGhhdmUgdG8gZG8gdGhlIHVzdWFsIHRyYW5zbGF0aW9uIHRyaWNrcy4KLSAgXGVudHJ5eyMxfXsjMn0lCi1cZW5kZ3JvdXB9Ci0KLSUgU3BhY2UgYmV0d2VlbiBjaGFwdGVyIChvciB3aGF0ZXZlcikgbnVtYmVyIGFuZCB0aGUgdGl0bGUuCi1cZGVmXGxhYmVsc3BhY2V7XGhza2lwMWVtIFxyZWxheH0KLQotXGRlZlxkb3BhZ2VubyMxe3tccm0gIzF9fQotXGRlZlxkb3Nob3J0cGFnZW5vIzF7e1xybSAjMX19Ci0KLVxkZWZcY2hhcGVudHJ5Zm9udHN7XHNlY2ZvbnRzIFxybX0KLVxkZWZcc2VjZW50cnlmb250c3tcdGV4dGZvbnRzfQotXGxldFxzdWJzZWNlbnRyeWZvbnRzID0gXHRleHRmb250cwotXGxldFxzdWJzdWJzZWNlbnRyeWZvbnRzID0gXHRleHRmb250cwotCi0KLVxtZXNzYWdle2Vudmlyb25tZW50cyx9Ci0KLSUgU2luY2UgdGhlc2UgY2hhcmFjdGVycyBhcmUgdXNlZCBpbiBleGFtcGxlcywgaXQgc2hvdWxkIGJlIGFuIGV2ZW4gbnVtYmVyIG9mCi0lIFx0dCB3aWR0aHMuIEVhY2ggXHR0IGNoYXJhY3RlciBpcyAxZW4sIHNvIHR3byBtYWtlcyBpdCAxZW0uCi0lIEZ1cnRoZXJtb3JlLCB0aGVzZSBkZWZpbml0aW9ucyBtdXN0IGNvbWUgYWZ0ZXIgd2UgZGVmaW5lIG91ciBmb250cy4KLVxuZXdib3hcZGJsYXJyb3dib3ggICAgXG5ld2JveFxsb25nZGJsYXJyb3dib3gKLVxuZXdib3hccHVzaGNoYXJib3ggICAgXG5ld2JveFxidWxsYm94Ci1cbmV3Ym94XGVxdWl2Ym94ICAgICAgIFxuZXdib3hcZXJyb3Jib3gKLQotJXtcdGVudHQKLSVcZ2xvYmFsXHNldGJveFxkYmxhcnJvd2JveCA9IFxoYm94IHRvIDFlbXtcaGZpbCRcUmlnaHRhcnJvdyRcaGZpbH0KLSVcZ2xvYmFsXHNldGJveFxsb25nZGJsYXJyb3dib3ggPSBcaGJveCB0byAxZW17XGhmaWwkXG1hcHN0byRcaGZpbH0KLSVcZ2xvYmFsXHNldGJveFxwdXNoY2hhcmJveCA9IFxoYm94IHRvIDFlbXtcaGZpbCRcZGFzaHYkXGhmaWx9Ci0lXGdsb2JhbFxzZXRib3hcZXF1aXZib3ggPSBcaGJveCB0byAxZW17XGhmaWwkXHB0ZXhlcXVpdiRcaGZpbH0KLSUgQWRhcHRlZCBmcm9tIHRoZSBtYW5tYWMgZm9ybWF0IChwLjQyMCBvZiBUZVhib29rKQotJVxnbG9iYWxcc2V0Ym94XGJ1bGxib3ggPSBcaGJveCB0byAxZW17XGtlcm4uMTVlbVx2cnVsZSBoZWlnaHQgLjc1ZXggd2lkdGggLjg1ZXgKLSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoIC4xZXhcaGZpbH0KLSV9Ci0KLSUgQHBvaW50e30sIEByZXN1bHR7fSwgQGV4cGFuc2lvbnt9LCBAcHJpbnR7fSwgQGVxdWl2e30uCi1cZGVmXHBvaW50eyRcc3RhciR9Ci1cZGVmXHJlc3VsdHtcbGVhdmV2bW9kZVxyYWlzZS4xNWV4XGhib3ggdG8gMWVte1xoZmlsJFxSaWdodGFycm93JFxoZmlsfX0KLVxkZWZcZXhwYW5zaW9ue1xsZWF2ZXZtb2RlXHJhaXNlLjFleFxoYm94IHRvIDFlbXtcaGZpbCRcbWFwc3RvJFxoZmlsfX0KLVxkZWZccHJpbnR7XGxlYXZldm1vZGVcbG93ZXIuMWV4XGhib3ggdG8gMWVte1xoZmlsJFxkYXNodiRcaGZpbH19Ci1cZGVmXGVxdWl2e1xsZWF2ZXZtb2RlXGxvd2VyLjFleFxoYm94IHRvIDFlbXtcaGZpbCRccHRleGVxdWl2JFxoZmlsfX0KLQotJSBBZGFwdGVkIGZyb20gdGhlIFRlWGJvb2sncyBcYm94aXQuCi17XHRlbnR0IFxnbG9iYWxcZGltZW4wID0gM2VtfSUgV2lkdGggb2YgdGhlIGJveC4KLVxkaW1lbjIgPSAuNTVwdCAlIFRoaWNrbmVzcyBvZiBydWxlcwotJSBUaGUgdGV4dC4gKGByJyBpcyBvcGVuIG9uIHRoZSByaWdodCwgYGUnIHNvbWV3aGF0IGxlc3Mgc28gb24gdGhlIGxlZnQuKQotXHNldGJveDAgPSBcaGJveHtca2Vybi0uNzVwdCBcdGVuc2YgZXJyb3Jca2Vybi0xLjVwdH0KLQotXGdsb2JhbFxzZXRib3hcZXJyb3Jib3g9XGhib3ggdG8gXGRpbWVuMHtcaGZpbAotICAgXGhzaXplID0gXGRpbWVuMCBcYWR2YW5jZVxoc2l6ZSBieSAtNS44cHQgJSBTcGFjZSB0byBsZWZ0K3JpZ2h0LgotICAgXGFkdmFuY2VcaHNpemUgYnkgLTJcZGltZW4yICUgUnVsZXMuCi0gICBcdmJveHsKLSAgICAgIFxocnVsZSBoZWlnaHRcZGltZW4yCi0gICAgICBcaGJveHtcdnJ1bGUgd2lkdGhcZGltZW4yIFxrZXJuM3B0ICAgICAgICAgICUgU3BhY2UgdG8gbGVmdCBvZiB0ZXh0LgotICAgICAgICAgXHZ0b3B7XGtlcm4yLjRwdCBcYm94MCBca2VybjIuNHB0fSUgU3BhY2UgYWJvdmUvYmVsb3cuCi0gICAgICAgICBca2VybjNwdFx2cnVsZSB3aWR0aFxkaW1lbjJ9JSBTcGFjZSB0byByaWdodC4KLSAgICAgIFxocnVsZSBoZWlnaHRcZGltZW4yfQotICAgIFxoZmlsfQotCi0lIFRoZSBAZXJyb3J7fSBjb21tYW5kLgotXGRlZlxlcnJvcntcbGVhdmV2bW9kZVxsb3dlci43ZXhcY29weVxlcnJvcmJveH0KLQotJSBAdGV4IC4uLiBAZW5kIHRleCAgICBlc2NhcGVzIGludG8gcmF3IFRleCB0ZW1wb3JhcmlseS4KLSUgT25lIGV4Y2VwdGlvbjogQCBpcyBzdGlsbCBhbiBlc2NhcGUgY2hhcmFjdGVyLCBzbyB0aGF0IEBlbmQgdGV4IHdvcmtzLgotJSBCdXQgXEAgb3IgQEAgd2lsbCBnZXQgYSBwbGFpbiB0ZXggQCBjaGFyYWN0ZXIuCi0KLVxkZWZcdGV4e1xiZWdpbmdyb3VwCi0gIFxjYXRjb2RlIGBcXD0wIFxjYXRjb2RlIGBcez0xIFxjYXRjb2RlIGBcfT0yCi0gIFxjYXRjb2RlIGBcJD0zIFxjYXRjb2RlIGBcJj00IFxjYXRjb2RlIGBcIz02Ci0gIFxjYXRjb2RlIGBcXj03IFxjYXRjb2RlIGBcXz04IFxjYXRjb2RlIGBcfj0xMyBcbGV0fj1cdGllCi0gIFxjYXRjb2RlIGBcJT0xNAotICBcY2F0Y29kZSA0Mz0xMiAlIHBsdXMKLSAgXGNhdGNvZGVgXCI9MTIKLSAgXGNhdGNvZGVgXD09MTIKLSAgXGNhdGNvZGVgXHw9MTIKLSAgXGNhdGNvZGVgXDw9MTIKLSAgXGNhdGNvZGVgXD49MTIKLSAgXGVzY2FwZWNoYXI9YFxcCi0gICUKLSAgXGxldFxiPVxwdGV4YgotICBcbGV0XGJ1bGxldD1ccHRleGJ1bGxldAotICBcbGV0XGM9XHB0ZXhjCi0gIFxsZXRcLD1ccHRleGNvbW1hCi0gIFxsZXRcLj1ccHRleGRvdAotICBcbGV0XGRvdHM9XHB0ZXhkb3RzCi0gIFxsZXRcZXF1aXY9XHB0ZXhlcXVpdgotICBcbGV0XCE9XHB0ZXhleGNsYW0KLSAgXGxldFxpPVxwdGV4aQotICBcbGV0XHs9XHB0ZXhsYnJhY2UKLSAgXGxldFwrPVx0YWJhbGlnbgotICBcbGV0XH09XHB0ZXhyYnJhY2UKLSAgXGxldFwqPVxwdGV4c3RhcgotICBcbGV0XHQ9XHB0ZXh0Ci0gICUKLSAgXGRlZlxlbmRsZG90c3tcbWF0aGlubmVye1xsZG90c1xsZG90c1xsZG90c1xsZG90c319JQotICBcZGVmXGVuZGRvdHN7XHJlbGF4XGlmbW1vZGVcZW5kbGRvdHNcZWxzZSRcbWF0aHN1cnJvdW5kPTBwdCBcZW5kbGRvdHNcLCRcZml9JQotICBcZGVmXEB7QH0lCi1cbGV0XEV0ZXg9XGVuZGdyb3VwfQotCi0lIERlZmluZSBAbGlzcCAuLi4gQGVuZGxpc3AuCi0lIEBsaXNwIGRvZXMgYSBcYmVnaW5ncm91cCBzbyBpdCBjYW4gcmViaW5kIHRoaW5ncywKLSUgaW5jbHVkaW5nIHRoZSBkZWZpbml0aW9uIG9mIEBlbmRsaXNwICh3aGljaCBub3JtYWxseSBpcyBlcnJvbmVvdXMpLgotCi0lIEFtb3VudCB0byBuYXJyb3cgdGhlIG1hcmdpbnMgYnkgZm9yIEBsaXNwLgotXG5ld3NraXBcbGlzcG5hcnJvd2luZyBcbGlzcG5hcnJvd2luZz0wLjRpbgotCi0lIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gdGhhdCBeXk0gZ2V0cyBpbnNpZGUgQGxpc3AsIEBleGFtcGxlLCBhbmQgb3RoZXIKLSUgc3VjaCBlbnZpcm9ubWVudHMuICBcbnVsbCBpcyBiZXR0ZXIgdGhhbiBhIHNwYWNlLCBzaW5jZSBpdCBkb2Vzbid0Ci0lIGhhdmUgYW55IHdpZHRoLgotXGRlZlxsaXNwcGFye1xudWxsXGVuZGdyYWZ9Ci0KLSUgTWFrZSBlYWNoIHNwYWNlIGNoYXJhY3RlciBpbiB0aGUgaW5wdXQgcHJvZHVjZSBhIG5vcm1hbCBpbnRlcndvcmQKLSUgc3BhY2UgaW4gdGhlIG91dHB1dC4gIERvbid0IGFsbG93IGEgbGluZSBicmVhayBhdCB0aGlzIHNwYWNlLCBhcyB0aGlzCi0lIGlzIHVzZWQgb25seSBpbiBlbnZpcm9ubWVudHMgbGlrZSBAZXhhbXBsZSwgd2hlcmUgZWFjaCBsaW5lIG9mIGlucHV0Ci0lIHNob3VsZCBwcm9kdWNlIGEgbGluZSBvZiBvdXRwdXQgYW55d2F5LgotJQote1xvYmV5c3BhY2VzICUKLVxnZGVmXHNlcHNwYWNlc3tcb2JleXNwYWNlc1xsZXQgPVx0aWV9fQotCi0lIERlZmluZSBcb2JleWVkc3BhY2UgdG8gYmUgb3VyIGFjdGl2ZSBzcGFjZSwgd2hhdGV2ZXIgaXQgaXMuICBUaGlzIGlzCi0lIGZvciB1c2UgaW4gXHBhcnNlYXJnLgote1xzZXBzcGFjZXMlCi1cZ2xvYmFsXGxldFxvYmV5ZWRzcGFjZT0gfQotCi0lIFRoaXMgc3BhY2UgaXMgYWx3YXlzIHByZXNlbnQgYWJvdmUgYW5kIGJlbG93IGVudmlyb25tZW50cy4KLVxuZXdza2lwXGVudnNraXBhbW91bnQgXGVudnNraXBhbW91bnQgPSAwcHQKLQotJSBNYWtlIHNwYWNpbmcgYW5kIGJlbG93IGVudmlyb25tZW50IHN5bW1ldHJpY2FsLiAgV2UgdXNlIFxwYXJza2lwIGhlcmUKLSUgdG8gaGVscCBpbiBkb2luZyB0aGF0LCBzaW5jZSBpbiBAZXhhbXBsZS1saWtlIGVudmlyb25tZW50cyBccGFyc2tpcAotJSBpcyByZXNldCB0byB6ZXJvOyB0aHVzIHRoZSBcYWZ0ZXJlbnZicmVhayBpbnNlcnRzIG5vIHNwYWNlIC0tIGJ1dCB0aGUKLSUgc3RhcnQgb2YgdGhlIG5leHQgcGFyYWdyYXBoIHdpbGwgaW5zZXJ0IFxwYXJza2lwCi0lCi1cZGVmXGFib3ZlZW52YnJlYWt7e1xhZHZhbmNlXGVudnNraXBhbW91bnQgYnkgXHBhcnNraXAKLVxlbmRncmFmIFxpZmRpbVxsYXN0c2tpcDxcZW52c2tpcGFtb3VudAotXHJlbW92ZWxhc3Rza2lwIFxwZW5hbHR5LTUwIFx2c2tpcFxlbnZza2lwYW1vdW50IFxmaX19Ci0KLVxsZXRcYWZ0ZXJlbnZicmVhayA9IFxhYm92ZWVudmJyZWFrCi0KLSUgXG5vbmFycm93aW5nIGlzIGEgZmxhZy4gIElmICJzZXQiLCBAbGlzcCBldGMgZG9uJ3QgbmFycm93IG1hcmdpbnMuCi1cbGV0XG5vbmFycm93aW5nPVxyZWxheAotCi0lIEBjYXJ0b3VjaGUgLi4uIEBlbmQgY2FydG91Y2hlOiBkcmF3IHJlY3RhbmdsZSB3L3JvdW5kZWQgY29ybmVycyBhcm91bmQKLSUgZW52aXJvbm1lbnQgY29udGVudHMuCi1cZm9udFxjaXJjbGU9bGNpcmNsZTEwCi1cbmV3ZGltZW5cY2lyY3RoaWNrCi1cbmV3ZGltZW5cY2FydG91dGVyXG5ld2RpbWVuXGNhcnRpbm5lcgotXG5ld3NraXBcbm9ybWJza2lwXG5ld3NraXBcbm9ybXBza2lwXG5ld3NraXBcbm9ybWxza2lwCi1cY2lyY3RoaWNrPVxmb250ZGltZW44XGNpcmNsZQotJQotXGRlZlxjdGx7e1xjaXJjbGVcY2hhcicwMTNcaHNraXAgLTZwdH19JSA2cHQgZnJvbSBwbCBmaWxlOiAxLzJjaGFyd2lkdGgKLVxkZWZcY3Rye3tcaHNraXAgNnB0XGNpcmNsZVxjaGFyJzAxMH19Ci1cZGVmXGNibHt7XGNpcmNsZVxjaGFyJzAxMlxoc2tpcCAtNnB0fX0KLVxkZWZcY2Jye3tcaHNraXAgNnB0XGNpcmNsZVxjaGFyJzAxMX19Ci1cZGVmXGNhcnR0b3B7XGhib3ggdG8gXGNhcnRvdXRlcntcaHNraXBcbHNraXAKLSAgICAgICAgXGN0bFxsZWFkZXJzXGhydWxlIGhlaWdodFxjaXJjdGhpY2tcaGZpbFxjdHIKLSAgICAgICAgXGhza2lwXHJza2lwfX0KLVxkZWZcY2FydGJvdHtcaGJveCB0byBcY2FydG91dGVye1xoc2tpcFxsc2tpcAotICAgICAgICBcY2JsXGxlYWRlcnNcaHJ1bGUgaGVpZ2h0XGNpcmN0aGlja1xoZmlsXGNicgotICAgICAgICBcaHNraXBccnNraXB9fQotJQotXG5ld3NraXBcbHNraXBcbmV3c2tpcFxyc2tpcAotCi1cbG9uZ1xkZWZcY2FydG91Y2hleyUKLVxiZWdpbmdyb3VwCi0gICAgICAgIFxsc2tpcD1cbGVmdHNraXAgXHJza2lwPVxyaWdodHNraXAKLSAgICAgICAgXGxlZnRza2lwPTBwdFxyaWdodHNraXA9MHB0ICV3ZSB3YW50IHRoZXNlICpvdXRzaWRlKi4KLSAgICAgICAgXGNhcnRpbm5lcj1caHNpemUgXGFkdmFuY2VcY2FydGlubmVyIGJ5LVxsc2tpcAotICAgICAgICAgICAgICAgICAgICAgICAgICBcYWR2YW5jZVxjYXJ0aW5uZXIgYnktXHJza2lwCi0gICAgICAgIFxjYXJ0b3V0ZXI9XGhzaXplCi0gICAgICAgIFxhZHZhbmNlXGNhcnRvdXRlciBieSAxOC40cHQgJSBhbGxvdyBmb3IgM3B0IGtlcm5zIG9uIGVpdGhlcgotJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZGUsIGFuZCBmb3IgNnB0IHdhc3RlIGZyb20KLSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIGNvcm5lciBjaGFyLCBhbmQgcnVsZSB0aGlja25lc3MKLSAgICAgICAgXG5vcm1ic2tpcD1cYmFzZWxpbmVza2lwIFxub3JtcHNraXA9XHBhcnNraXAgXG5vcm1sc2tpcD1cbGluZXNraXAKLSAgICAgICAgJSBGbGFnIHRvIHRlbGwgQGxpc3AsIGV0Yy4sIG5vdCB0byBuYXJyb3cgbWFyZ2luLgotICAgICAgICBcbGV0XG5vbmFycm93aW5nPVxjb21tZW50Ci0gICAgICAgIFx2Ym94XGJncm91cAotICAgICAgICAgICAgICAgIFxiYXNlbGluZXNraXA9MHB0XHBhcnNraXA9MHB0XGxpbmVza2lwPTBwdAotICAgICAgICAgICAgICAgIFxjYXJ0dG9wCi0gICAgICAgICAgICAgICAgXGhib3hcYmdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICBcaHNraXBcbHNraXAKLSAgICAgICAgICAgICAgICAgICAgICAgIFx2cnVsZVxrZXJuM3B0Ci0gICAgICAgICAgICAgICAgICAgICAgICBcdmJveFxiZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGhzaXplPVxjYXJ0aW5uZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGtlcm4zcHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGJlZ2luZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcYmFzZWxpbmVza2lwPVxub3JtYnNraXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbGluZXNraXA9XG5vcm1sc2tpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxwYXJza2lwPVxub3JtcHNraXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdnNraXAgLVxwYXJza2lwCi1cZGVmXEVjYXJ0b3VjaGV7JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcZW5kZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXGtlcm4zcHQKLSAgICAgICAgICAgICAgICAgICAgICAgIFxlZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgIFxrZXJuM3B0XHZydWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBcaHNraXBccnNraXAKLSAgICAgICAgICAgICAgICBcZWdyb3VwCi0gICAgICAgICAgICAgICAgXGNhcnRib3QKLSAgICAgICAgXGVncm91cAotXGVuZGdyb3VwCi19fQotCi0KLSUgVGhpcyBtYWNybyBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbGwgdGhlIEBleGFtcGxlIHZhcmlhbnRzLAotJSBpbnNpZGUgYSBncm91cC4KLVxkZWZcbm9uZmlsbHN0YXJ0eyUKLSAgXGFib3ZlZW52YnJlYWsKLSAgXGluRU5WICUgVGhpcyBncm91cCBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIGJvZHkKLSAgXGhmdXp6ID0gMTJwdCAlIERvbid0IGJlIGZ1c3N5Ci0gIFxzZXBzcGFjZXMgJSBNYWtlIHNwYWNlcyBiZSB3b3JkLXNlcGFyYXRvcnMgcmF0aGVyIHRoYW4gc3BhY2UgdG9rZW5zLgotICBcc2luZ2xlc3BhY2UKLSAgXGxldFxwYXIgPSBcbGlzcHBhciAlIGRvbid0IGlnbm9yZSBibGFuayBsaW5lcwotICBcb2JleWxpbmVzICUgZWFjaCBsaW5lIG9mIGlucHV0IGlzIGEgbGluZSBvZiBvdXRwdXQKLSAgXHBhcnNraXAgPSAwcHQKLSAgXHBhcmluZGVudCA9IDBwdAotICBcZW1lcmdlbmN5c3RyZXRjaCA9IDBwdCAlIGRvbid0IHRyeSB0byBhdm9pZCBvdmVyZnVsbCBib3hlcwotICAlIEBjYXJ0b3VjaGUgZGVmaW5lcyBcbm9uYXJyb3dpbmcgdG8gaW5oaWJpdCBuYXJyb3dpbmcKLSAgJSBhdCBuZXh0IGxldmVsIGRvd24uCi0gIFxpZnhcbm9uYXJyb3dpbmdccmVsYXgKLSAgICBcYWR2YW5jZSBcbGVmdHNraXAgYnkgXGxpc3BuYXJyb3dpbmcKLSAgICBcZXhkZW50YW1vdW50PVxsaXNwbmFycm93aW5nCi0gICAgXGxldFxleGRlbnQ9XG5vZmlsbGV4ZGVudAotICAgIFxsZXRcbm9uYXJyb3dpbmc9XHJlbGF4Ci0gIFxmaQotfQotCi0lIERlZmluZSB0aGUgXEUuLi4gY29udHJvbCBzZXF1ZW5jZSBvbmx5IGlmIHdlIGFyZSBpbnNpZGUgdGhlIHBhcnRpY3VsYXIKLSUgZW52aXJvbm1lbnQsIHNvIHRoZSBlcnJvciBjaGVja2luZyBpbiBcZW5kIHdpbGwgd29yay4KLSUgCi0lIFRvIGVuZCBhbiBAZXhhbXBsZS1saWtlIGVudmlyb25tZW50LCB3ZSBmaXJzdCBlbmQgdGhlIHBhcmFncmFwaCAodmlhCi0lIFxhZnRlcmVudmJyZWFrJ3MgdmVydGljYWwgZ2x1ZSksIGFuZCB0aGVuIHRoZSBncm91cC4gIFRoYXQgd2F5IHdlIGtlZXAKLSUgdGhlIHplcm8gXHBhcnNraXAgdGhhdCB0aGUgZW52aXJvbm1lbnRzIHNldCAtLSBccGFyc2tpcCBnbHVlIHdpbGwgYmUKLSUgaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBwYXJhZ3JhcGggaW4gdGhlIGRvY3VtZW50LCBhZnRlcgotJSB0aGUgZW52aXJvbm1lbnQuCi0lCi1cZGVmXG5vbmZpbGxmaW5pc2h7XGFmdGVyZW52YnJlYWtcZW5kZ3JvdXB9Ci0KLSUgQGxpc3A6IGluZGVudGVkLCBuYXJyb3dlZCwgdHlwZXdyaXRlciBmb250LgotXGRlZlxsaXNwe1xiZWdpbmdyb3VwCi0gIFxub25maWxsc3RhcnQKLSAgXGxldFxFbGlzcCA9IFxub25maWxsZmluaXNoCi0gIFx0dAotICBcbGV0XGtiZGZvbnQgPSBca2JkZXhhbXBsZWZvbnQgJSBBbGxvdyBAa2JkIHRvIGRvIHNvbWV0aGluZyBzcGVjaWFsLgotICBcZ29iYmxlICAgICAgICUgZWF0IHJldHVybgotfQotCi0lIEBleGFtcGxlOiBTYW1lIGFzIEBsaXNwLgotXGRlZlxleGFtcGxle1xiZWdpbmdyb3VwIFxkZWZcRWV4YW1wbGV7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9XGxpc3B9Ci0KLSUgQHNtYWxsLi4uIGlzIHVzdWFsbHkgZXF1aXZhbGVudCB0byB0aGUgbm9uLXNtYWxsIChAc21hbGxib29rCi0lIHJlZGVmaW5lcykuICBXZSBtdXN0IGNhbGwgXGV4YW1wbGUgKG9yIHdoYXRldmVyKSBsYXN0IGluIHRoZQotJSBkZWZpbml0aW9uLCBzaW5jZSBpdCByZWFkcyB0aGUgcmV0dXJuIGZvbGxvd2luZyB0aGUgQGV4YW1wbGUgKG9yCi0lIHdoYXRldmVyKSBjb21tYW5kLgotJSAKLSUgVGhpcyBhY3R1YWxseSBhbGxvd3MgKGZvciBleGFtcGxlKSBAZW5kIGRpc3BsYXkgaW5zaWRlIGFuCi0lIEBzbWFsbGRpc3BsYXkuICBUb28gYmFkLCBidXQgbWFrZWluZm8gd2lsbCBjYXRjaCB0aGUgZXJyb3IgYW55d2F5LgotJQotXGRlZlxzbWFsbGRpc3BsYXl7XGJlZ2luZ3JvdXBcZGVmXEVzbWFsbGRpc3BsYXl7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9XGRpc3BsYXl9Ci1cZGVmXHNtYWxsZXhhbXBsZXtcYmVnaW5ncm91cFxkZWZcRXNtYWxsZXhhbXBsZXtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH1cbGlzcH0KLVxkZWZcc21hbGxmb3JtYXR7XGJlZ2luZ3JvdXBcZGVmXEVzbWFsbGZvcm1hdHtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH1cZm9ybWF0fQotXGRlZlxzbWFsbGxpc3B7XGJlZ2luZ3JvdXBcZGVmXEVzbWFsbGxpc3B7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9XGxpc3B9Ci0KLSUgUmVhbCBAc21hbGxleGFtcGxlIGFuZCBAc21hbGxsaXNwICh3aGVuIEBzbWFsbGJvb2spOiB1c2Ugc21hbGxlciBmb250cy4KLSUgT3JpZ2luYWxseSBjb250cmlidXRlZCBieSBQYXZlbEB4ZXJveC4KLVxkZWZcc21hbGxsaXNweHtcYmVnaW5ncm91cAotICBcZGVmXEVzbWFsbGxpc3B7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9JQotICBcZGVmXEVzbWFsbGV4YW1wbGV7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9JQotICBcaW5kZXhmb250cwotICBcbGlzcAotfQotCi0lIEBkaXNwbGF5OiBzYW1lIGFzIEBsaXNwIGV4Y2VwdCBrZWVwIGN1cnJlbnQgZm9udC4KLSUKLVxkZWZcZGlzcGxheXtcYmVnaW5ncm91cAotICBcbm9uZmlsbHN0YXJ0Ci0gIFxsZXRcRWRpc3BsYXkgPSBcbm9uZmlsbGZpbmlzaAotICBcZ29iYmxlCi19Ci0KLSUgQHNtYWxsZGlzcGxheSAod2hlbiBAc21hbGxib29rKTogQGRpc3BsYXkgcGx1cyBzbWFsbGVyIGZvbnRzLgotJQotXGRlZlxzbWFsbGRpc3BsYXl4e1xiZWdpbmdyb3VwCi0gIFxkZWZcRXNtYWxsZGlzcGxheXtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH0lCi0gIFxpbmRleGZvbnRzIFxybQotICBcZGlzcGxheQotfQotCi0lIEBmb3JtYXQ6IHNhbWUgYXMgQGRpc3BsYXkgZXhjZXB0IGRvbid0IG5hcnJvdyBtYXJnaW5zLgotJQotXGRlZlxmb3JtYXR7XGJlZ2luZ3JvdXAKLSAgXGxldFxub25hcnJvd2luZyA9IHQKLSAgXG5vbmZpbGxzdGFydAotICBcbGV0XEVmb3JtYXQgPSBcbm9uZmlsbGZpbmlzaAotICBcZ29iYmxlCi19Ci0KLSUgQHNtYWxsZm9ybWF0ICh3aGVuIEBzbWFsbGJvb2spOiBAZm9ybWF0IHBsdXMgc21hbGxlciBmb250cy4KLSUKLVxkZWZcc21hbGxmb3JtYXR4e1xiZWdpbmdyb3VwCi0gIFxkZWZcRXNtYWxsZm9ybWF0e1xub25maWxsZmluaXNoXGVuZGdyb3VwfSUKLSAgXGluZGV4Zm9udHMgXHJtCi0gIFxmb3JtYXQKLX0KLQotJSBAZmx1c2hsZWZ0IChzYW1lIGFzIEBmb3JtYXQpLgotJQotXGRlZlxmbHVzaGxlZnR7XGJlZ2luZ3JvdXAgXGRlZlxFZmx1c2hsZWZ0e1xub25maWxsZmluaXNoXGVuZGdyb3VwfVxmb3JtYXR9Ci0KLSUgQGZsdXNocmlnaHQuCi0lIAotXGRlZlxmbHVzaHJpZ2h0e1xiZWdpbmdyb3VwCi0gIFxsZXRcbm9uYXJyb3dpbmcgPSB0Ci0gIFxub25maWxsc3RhcnQKLSAgXGxldFxFZmx1c2hyaWdodCA9IFxub25maWxsZmluaXNoCi0gIFxhZHZhbmNlXGxlZnRza2lwIGJ5IDBwdCBwbHVzIDFmaWxsCi0gIFxnb2JibGUKLX0KLQotJSBAcXVvdGF0aW9uIGRvZXMgbm9ybWFsIGxpbmVicmVha2luZyAoaGVuY2Ugd2UgY2FuJ3QgdXNlIFxub25maWxsc3RhcnQpCi0lIGFuZCBuYXJyb3dzIHRoZSBtYXJnaW5zLgotJQotXGRlZlxxdW90YXRpb257JQotICBcYmVnaW5ncm91cFxpbkVOViAlVGhpcyBncm91cCBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIEBxdW90YXRpb24gYm9keQotICB7XHBhcnNraXA9MHB0IFxhYm92ZWVudmJyZWFrfSUgYmVjYXVzZSBcYWJvdmVlbnZicmVhayBpbnNlcnRzIFxwYXJza2lwCi0gIFxzaW5nbGVzcGFjZQotICBccGFyaW5kZW50PTBwdAotICAlIFdlIGhhdmUgcmV0YWluZWQgYSBub256ZXJvIHBhcnNraXAgZm9yIHRoZSBlbnZpcm9ubWVudCwgc2luY2Ugd2UncmUKLSAgJSBkb2luZyBub3JtYWwgZmlsbGluZy4gU28gdG8gYXZvaWQgZXh0cmEgc3BhY2UgYmVsb3cgdGhlIGVudmlyb25tZW50Li4uCi0gIFxkZWZcRXF1b3RhdGlvbntccGFyc2tpcCA9IDBwdCBcbm9uZmlsbGZpbmlzaH0lCi0gICUKLSAgJSBAY2FydG91Y2hlIGRlZmluZXMgXG5vbmFycm93aW5nIHRvIGluaGliaXQgbmFycm93aW5nIGF0IG5leHQgbGV2ZWwgZG93bi4KLSAgXGlmeFxub25hcnJvd2luZ1xyZWxheAotICAgIFxhZHZhbmNlXGxlZnRza2lwIGJ5IFxsaXNwbmFycm93aW5nCi0gICAgXGFkdmFuY2VccmlnaHRza2lwIGJ5IFxsaXNwbmFycm93aW5nCi0gICAgXGV4ZGVudGFtb3VudCA9IFxsaXNwbmFycm93aW5nCi0gICAgXGxldFxub25hcnJvd2luZyA9IFxyZWxheAotICBcZmkKLX0KLQotCi1cbWVzc2FnZXtkZWZ1bnMsfQotJSBEZWZpbmUgZm9ybWF0dGVyIGZvciBkZWZ1bnMKLSUgRmlyc3QsIGFsbG93IHVzZXIgdG8gY2hhbmdlIGRlZmluaXRpb24gb2JqZWN0IGZvbnQgKFxkZikgaW50ZXJuYWxseQotXGRlZlxzZXRkZWZmb250ICMxIHtcY3NuYW1lIERFRiMxXGVuZGNzbmFtZX0KLQotXG5ld3NraXBcZGVmYm9keWluZGVudCBcZGVmYm9keWluZGVudD0uNGluCi1cbmV3c2tpcFxkZWZhcmdzaW5kZW50IFxkZWZhcmdzaW5kZW50PTUwcHQKLVxuZXdza2lwXGRlZnR5cGVtYXJnaW4gXGRlZnR5cGVtYXJnaW49MTJwdAotXG5ld3NraXBcZGVmbGFzdGFyZ21hcmdpbiBcZGVmbGFzdGFyZ21hcmdpbj0xOHB0Ci0KLVxuZXdjb3VudFxwYXJlbmNvdW50Ci0lIGRlZmluZSBcZnVuY3Rpb25wYXJlbnMsIHdoaWNoIG1ha2VzICggYW5kICkgYW5kICYgZG8gc3BlY2lhbCB0aGluZ3MuCi0lIFxmdW5jdGlvbnBhcmVucyBhZmZlY3RzIHRoZSBncm91cCBpdCBpcyBjb250YWluZWQgaW4uCi1cZGVmXGFjdGl2ZXBhcmVuc3slCi1cY2F0Y29kZWBcKD1cYWN0aXZlIFxjYXRjb2RlYFwpPVxhY3RpdmUgXGNhdGNvZGVgXCY9XGFjdGl2ZQotXGNhdGNvZGVgXFs9XGFjdGl2ZSBcY2F0Y29kZWBcXT1cYWN0aXZlfQotCi0lIE1ha2UgY29udHJvbCBzZXF1ZW5jZXMgd2hpY2ggYWN0IGxpa2Ugbm9ybWFsIHBhcmVudGhlc2lzIGNoYXJzLgotXGxldFxscGFyZW4gPSAoIFxsZXRccnBhcmVuID0gKQotCi17XGFjdGl2ZXBhcmVucyAlIE5vdywgc21hcnQgcGFyZW5zIGRvbid0IHR1cm4gb24gdW50aWwgJmZvbyAoc2VlIFxhbXBybSkKLQotJSBCZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgYSBkZWZpbml0aW9uIGZvciBgKCcsIGV0Yy4gIEZvciBleGFtcGxlLAotJSBpZiB0aGUgZm4gbmFtZSBoYXMgcGFyZW5zIGluIGl0LCBcYm9sZGJyYXggd2lsbCBub3QgYmUgaW4gZWZmZWN0IHlldCwKLSUgc28gVGVYIHdvdWxkIG90aGVyd2lzZSBjb21wbGFpbiBhYm91dCB1bmRlZmluZWQgY29udHJvbCBzZXF1ZW5jZS4KLVxnbG9iYWxcbGV0KD1cbHBhcmVuIFxnbG9iYWxcbGV0KT1ccnBhcmVuCi1cZ2xvYmFsXGxldFs9XGxicmFjayBcZ2xvYmFsXGxldF09XHJicmFjawotCi1cZ2RlZlxmdW5jdGlvbnBhcmVuc3tcYm9sZGJyYXhcbGV0Jj1cYW1wcm1ccGFyZW5jb3VudD0wIH0KLVxnZGVmXGJvbGRicmF4e1xsZXQoPVxvcG5yXGxldCk9XGNsbnJcbGV0Wz1cbGJyYlxsZXRdPVxyYnJifQotJSBUaGlzIGlzIHVzZWQgdG8gdHVybiBvbiBzcGVjaWFsIHBhcmVucwotJSBidXQgbWFrZSAmIGFjdCBvcmRpbmFyeSAoZ2l2ZW4gdGhhdCBpdCdzIGFjdGl2ZSkuCi1cZ2RlZlxib2xkYnJheG5vYW1we1xsZXQoPVxvcG5yXGxldCk9XGNsbnJcbGV0Wz1cbGJyYlxsZXRdPVxyYnJiXGxldCY9XGFtcG5yfQotCi0lIERlZmluaXRpb25zIG9mICgsICkgYW5kICYgdXNlZCBpbiBhcmdzIGZvciBmdW5jdGlvbnMuCi0lIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgKCBvdXRzaWRlIG9mIGFsbCBwYXJlbnRoZXNlcy4KLVxnZGVmXG9wcm0jMSB7e1xybVxjaGFyYFwofSMxIFxiZiBcbGV0KD1cb3BuZXN0ZWQKLSAgXGdsb2JhbFxhZHZhbmNlXHBhcmVuY291bnQgYnkgMQotfQotJQotJSBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIG9mICggd2hlbiBhbHJlYWR5IGluc2lkZSBhIGxldmVsIG9mIHBhcmVucy4KLVxnZGVmXG9wbmVzdGVke1xjaGFyYFwoXGdsb2JhbFxhZHZhbmNlXHBhcmVuY291bnQgYnkgMSB9Ci0lCi1cZ2RlZlxjbHJteyUgUHJpbnQgYSBwYXJlbiBpbiByb21hbiBpZiBpdCBpcyB0YWtpbmcgdXMgYmFjayB0byBkZXB0aCBvZiAwLgotICAlIGFsc28gaW4gdGhhdCBjYXNlIHJlc3RvcmUgdGhlIG91dGVyLWxldmVsIGRlZmluaXRpb24gb2YgKC4KLSAgXGlmbnVtIFxwYXJlbmNvdW50PTEge1xybSBcY2hhciBgXCl9XHNsIFxsZXQoPVxvcHJtIFxlbHNlIFxjaGFyIGBcKSBcZmkKLSAgXGdsb2JhbFxhZHZhbmNlIFxwYXJlbmNvdW50IGJ5IC0xIH0KLSUgSWYgd2UgZW5jb3VudGVyICZmb28sIHRoZW4gdHVybiBvbiAoKS1oYWNraW5nIGFmdGVyd2FyZHMKLVxnZGVmXGFtcHJtIzEge3tccm1cJiMxfVxsZXQoPVxvcHJtIFxsZXQpPVxjbHJtXCB9Ci0lCi1cZ2RlZlxub3JtYWxwYXJlbnN7XGJvbGRicmF4XGxldCY9XGFtcG5yfQotfSAlIEVuZCBvZiBkZWZpbml0aW9uIGluc2lkZSBcYWN0aXZlcGFyZW5zCi0lJSBUaGVzZSBwYXJlbnMgKGluIFxib2xkYnJheCkgYWN0dWFsbHkgYXJlIGEgbGl0dGxlIGJvbGRlciB0aGFuIHRoZQotJSUgY29udGFpbmVkIHRleHQuICBUaGlzIGlzIGVzcGVjaWFsbHkgbmVlZGVkIGZvciBbIGFuZCBdCi1cZGVmXG9wbnJ7e1xzZlxjaGFyYFwofVxnbG9iYWxcYWR2YW5jZVxwYXJlbmNvdW50IGJ5IDEgfQotXGRlZlxjbG5ye3tcc2ZcY2hhcmBcKX1cZ2xvYmFsXGFkdmFuY2VccGFyZW5jb3VudCBieSAtMSB9Ci1cZGVmXGFtcG5ye1wmfQotXGRlZlxsYnJie3tcYmZcY2hhcmBcW319Ci1cZGVmXHJicmJ7e1xiZlxjaGFyYFxdfX0KLQotJSBGaXJzdCwgZGVmbmFtZSwgd2hpY2ggZm9ybWF0cyB0aGUgaGVhZGVyIGxpbmUgaXRzZWxmLgotJSAjMSBzaG91bGQgYmUgdGhlIGZ1bmN0aW9uIG5hbWUuCi0lICMyIHNob3VsZCBiZSB0aGUgdHlwZSBvZiBkZWZpbml0aW9uLCBzdWNoIGFzICJGdW5jdGlvbiIuCi0KLVxkZWZcZGVmbmFtZSAjMSMyeyUKLSUgR2V0IHRoZSB2YWx1ZXMgb2YgXGxlZnRza2lwIGFuZCBccmlnaHRza2lwIGFzIHRoZXkgd2VyZQotJSBvdXRzaWRlIHRoZSBAZGVmLi4uCi1cZGltZW4yPVxsZWZ0c2tpcAotXGFkdmFuY2VcZGltZW4yIGJ5IC1cZGVmYm9keWluZGVudAotXG5vaW5kZW50Ci1cc2V0Ym94MD1caGJveHtcaHNraXAgXGRlZmxhc3RhcmdtYXJnaW57XHJtICMyfVxoc2tpcCBcZGVmdHlwZW1hcmdpbn0lCi1cZGltZW4wPVxoc2l6ZSBcYWR2YW5jZSBcZGltZW4wIGJ5IC1cd2QwICUgY29tcHV0ZSBzaXplIGZvciBmaXJzdCBsaW5lCi1cZGltZW4xPVxoc2l6ZSBcYWR2YW5jZSBcZGltZW4xIGJ5IC1cZGVmYXJnc2luZGVudCAlc2l6ZSBmb3IgY29udGludWF0aW9ucwotXHBhcnNoYXBlIDIgMGluIFxkaW1lbjAgXGRlZmFyZ3NpbmRlbnQgXGRpbWVuMQotJSBOb3cgb3V0cHV0IGFyZyAyICgiRnVuY3Rpb24iIG9yIHNvbWUgc3VjaCkKLSUgZW5kaW5nIGF0IFxkZWZ0eXBlbWFyZ2luIGZyb20gdGhlIHJpZ2h0IG1hcmdpbiwKLSUgYnV0IHN0dWNrIGluc2lkZSBhIGJveCBvZiB3aWR0aCAwIHNvIGl0IGRvZXMgbm90IGludGVyZmVyZSB3aXRoIGxpbmVicmVha2luZwoteyUgQWRqdXN0IFxoc2l6ZSB0byBleGNsdWRlIHRoZSBhbWJpZW50IG1hcmdpbnMsCi0lIHNvIHRoYXQgXHJpZ2h0bGluZSB3aWxsIG9iZXkgdGhlbS4KLVxhZHZhbmNlIFxoc2l6ZSBieSAtXGRpbWVuMgotXHJsYXB7XHJpZ2h0bGluZXt7XHJtICMyfVxoc2tpcCAtMS4yNXBjIH19fSUKLSUgTWFrZSBhbGwgbGluZXMgdW5kZXJmdWxsIGFuZCBubyBjb21wbGFpbnRzOgotXHRvbGVyYW5jZT0xMDAwMCBcaGJhZG5lc3M9MTAwMDAKLVxhZHZhbmNlXGxlZnRza2lwIGJ5IC1cZGVmYm9keWluZGVudAotXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAote1xkZiAjMX1cZW5za2lwICAgICAgICAlIEdlbmVyYXRlIGZ1bmN0aW9uIG5hbWUKLX0KLQotJSBBY3R1YWxseSBwcm9jZXNzIHRoZSBib2R5IG9mIGEgZGVmaW5pdGlvbgotJSAjMSBzaG91bGQgYmUgdGhlIHRlcm1pbmF0aW5nIGNvbnRyb2wgc2VxdWVuY2UsIHN1Y2ggYXMgXEVkZWZ1bi4KLSUgIzIgc2hvdWxkIGJlIHRoZSAiYW5vdGhlciBuYW1lIiBjb250cm9sIHNlcXVlbmNlLCBzdWNoIGFzIFxkZWZ1bnguCi0lICMzIHNob3VsZCBiZSB0aGUgY29udHJvbCBzZXF1ZW5jZSB0aGF0IGFjdHVhbGx5IHByb2Nlc3NlcyB0aGUgaGVhZGVyLAotJSAgICBzdWNoIGFzIFxkZWZ1bmhlYWRlci4KLQotXGRlZlxkZWZwYXJzZWJvZHkgIzEjMiMze1xiZWdpbmdyb3VwXGluRU5WJSBFbnZpcm9ubWVudCBmb3IgZGVmaW5pdGlvbmJvZHkKLVxtZWRicmVhayAlCi0lIERlZmluZSB0aGUgZW5kIHRva2VuIHRoYXQgdGhpcyBkZWZpbmluZyBjb25zdHJ1Y3Qgc3BlY2lmaWVzCi0lIHNvIHRoYXQgaXQgd2lsbCBleGl0IHRoaXMgZ3JvdXAuCi1cZGVmIzF7XGVuZGdyYWZcZW5kZ3JvdXBcbWVkYnJlYWt9JQotXGRlZiMye1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdCMzfSUKLVxwYXJpbmRlbnQ9MGluCi1cYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAotXGJlZ2luZ3JvdXAgJQotXGNhdGNvZGUgNjE9XGFjdGl2ZSAlIDYxIGlzIGA9JwotXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdCMzfQotCi0lICMxIGlzIHRoZSBcRS4uLiBjb250cm9sIHNlcXVlbmNlIHRvIGVuZCB0aGUgZGVmaW5pdGlvbiAod2hpY2ggd2UgZGVmaW5lKS4KLSUgIzIgaXMgdGhlIFwuLi54IGNvbnRyb2wgc2VxdWVuY2UgZm9yIGNvbnNlY3V0aXZlIGZucyAod2hpY2ggd2UgZGVmaW5lKS4KLSUgIzMgaXMgdGhlIGNvbnRyb2wgc2VxdWVuY2UgdG8gY2FsbCB0byByZXN1bWUgcHJvY2Vzc2luZy4KLSUgIzQsIGRlbGltaXRlZCBieSB0aGUgc3BhY2UsIGlzIHRoZSBjbGFzcyBuYW1lLgotJSAKLVxkZWZcZGVmbWV0aHBhcnNlYm9keSMxIzIjMyM0IHtcYmVnaW5ncm91cFxpbkVOViAlCi1cbWVkYnJlYWsgJQotJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcwotJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgotXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLVxkZWYjMiMjMSB7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0eyMzeyMjMX19fSUKLVxwYXJpbmRlbnQ9MGluCi1cYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAotXGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0eyMzeyM0fX19Ci0KLSUgQGRlZnR5cGVtZXRob2QgaGFzIGFuIGV4dHJhIGFyZ3VtZW50IHRoYXQgbm90aGluZyBlbHNlIGRvZXMuICBTaWdoLgotJSAjMSBpcyB0aGUgXEUuLi4gY29udHJvbCBzZXF1ZW5jZSB0byBlbmQgdGhlIGRlZmluaXRpb24gKHdoaWNoIHdlIGRlZmluZSkuCi0lICMyIGlzIHRoZSBcLi4ueCBjb250cm9sIHNlcXVlbmNlIGZvciBjb25zZWN1dGl2ZSBmbnMgKHdoaWNoIHdlIGRlZmluZSkuCi0lICMzIGlzIHRoZSBjb250cm9sIHNlcXVlbmNlIHRvIGNhbGwgdG8gcmVzdW1lIHByb2Nlc3NpbmcuCi0lICM0LCBkZWxpbWl0ZWQgYnkgdGhlIHNwYWNlLCBpcyB0aGUgY2xhc3MgbmFtZS4KLSUgIzUgaXMgdGhlIG1ldGhvZCdzIHJldHVybiB0eXBlLgotJSAKLVxkZWZcZGVmdHlwZW1ldGhwYXJzZWJvZHkjMSMyIzMjNCAjNSB7XGJlZ2luZ3JvdXBcaW5FTlYgJQotXG1lZGJyZWFrICUKLSUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLVxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi1cZGVmIzIjIzEgIyMyIHtcYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXR7IzN7IyMxfXsjIzJ9fX0lCi1ccGFyaW5kZW50PTBpbgotXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLVxiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjNH17IzV9fX0KLQotXGRlZlxkZWZvcHBhcnNlYm9keSAjMSMyIzMjNCM1IHtcYmVnaW5ncm91cFxpbkVOViAlCi1cbWVkYnJlYWsgJQotJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcwotJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgotXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLVxkZWYjMiMjMSAjIzIge1xkZWYjNHsjIzF9JQotXGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0eyMzeyMjMn19fSUKLVxwYXJpbmRlbnQ9MGluCi1cYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAotXGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0eyMzeyM1fX19Ci0KLSUgVGhlc2UgcGFyc2luZyBmdW5jdGlvbnMgYXJlIHNpbWlsYXIgdG8gdGhlIHByZWNlZGluZyBvbmVzCi0lIGV4Y2VwdCB0aGF0IHRoZXkgZG8gbm90IG1ha2UgcGFyZW5zIGludG8gYWN0aXZlIGNoYXJhY3RlcnMuCi0lIFRoZXNlIGFyZSB1c2VkIGZvciAidmFyaWFibGVzIiBzaW5jZSB0aGV5IGhhdmUgbm8gYXJndW1lbnRzLgotCi1cZGVmXGRlZnZhcnBhcnNlYm9keSAjMSMyIzN7XGJlZ2luZ3JvdXBcaW5FTlYlIEVudmlyb25tZW50IGZvciBkZWZpbml0aW9uYm9keQotXG1lZGJyZWFrICUKLSUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLVxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi1cZGVmIzJ7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXHNwYWNlc3BsaXQjM30lCi1ccGFyaW5kZW50PTBpbgotXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLVxiZWdpbmdyb3VwICUKLVxjYXRjb2RlIDYxPVxhY3RpdmUgJQotXG9iZXlsaW5lc1xzcGFjZXNwbGl0IzN9Ci0KLSUgVGhpcyBpcyB1c2VkIGZvciBcZGVme3RwLHZyfXBhcnNlYm9keS4gIEl0IGNvdWxkIHByb2JhYmx5IGJlIHVzZWQgZm9yCi0lIHNvbWUgb2YgdGhlIG90aGVycywgdG9vLCB3aXRoIHNvbWUganVkaWNpb3VzIGNvbmRpdGlvbmFscy4KLSUKLVxkZWZccGFyc2Vib2R5Y29tbW9uIzEjMiMzeyUKLSAgXGJlZ2luZ3JvdXBcaW5FTlYgJQotICBcbWVkYnJlYWsgJQotICAlIERlZmluZSB0aGUgZW5kIHRva2VuIHRoYXQgdGhpcyBkZWZpbmluZyBjb25zdHJ1Y3Qgc3BlY2lmaWVzCi0gICUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLSAgXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLSAgXGRlZiMyIyMxIHtcYmVnaW5ncm91cFxvYmV5bGluZXNcc3BhY2VzcGxpdHsjM3sjIzF9fX0lCi0gIFxwYXJpbmRlbnQ9MGluCi0gIFxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci0gIFxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLSAgXGJlZ2luZ3JvdXBcb2JleWxpbmVzCi19Ci0KLVxkZWZcZGVmdnJwYXJzZWJvZHkjMSMyIzMjNCB7JQotICBccGFyc2Vib2R5Y29tbW9ueyMxfXsjMn17IzN9JQotICBcc3BhY2VzcGxpdHsjM3sjNH19JQotfQotCi0lIFRoaXMgbG9zZXMgb24gYEBkZWZ0cCB7RGF0YSBUeXBlfSB7c3RydWN0IHRlcm1pb3N9JyAtLSBpdCB0aGlua3MgdGhlCi0lIHR5cGUgaXMganVzdCBgc3RydWN0JywgYmVjYXVzZSB3ZSBsb3NlIHRoZSBicmFjZXMgaW4gYHtzdHJ1Y3QKLSUgdGVybWlvc30nIHdoZW4gXHNwYWNlc3BsaXQgcmVhZHMgaXRzIHVuZGVsaW1pdGVkIGFyZ3VtZW50LiAgU2lnaC4KLSUgXGxldFxkZWZ0cHBhcnNlYm9keT1cZGVmdnJwYXJzZWJvZHkKLSUKLSUgU28sIHRvIGdldCBhcm91bmQgdGhpcywgd2UgcHV0IFxlbXB0eSBpbiB3aXRoIHRoZSB0eXBlIG5hbWUuICBUaGF0Ci0lIHdheSwgVGVYIHdvbid0IGZpbmQgZXhhY3RseSBgey4uLn0nIGFzIGFuIHVuZGVsaW1pdGVkIGFyZ3VtZW50LCBhbmQKLSUgd29uJ3Qgc3RyaXAgb2ZmIHRoZSBicmFjZXMuCi0lCi1cZGVmXGRlZnRwcGFyc2Vib2R5ICMxIzIjMyM0IHslCi0gIFxwYXJzZWJvZHljb21tb257IzF9eyMyfXsjM30lCi0gIFxzcGFjZXNwbGl0e1xwYXJzZXRwaGVhZGVybGluZXsjM3sjNH19fVxlbXB0eQotfQotCi0lIEZpbmUsIGJ1dCB0aGVuIHdlIGhhdmUgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhlIFxlbXB0eSAqYW5kKiB0aGUKLSUgYnJhY2VzIChpZiBhbnkpLiAgVGhhdCdzIHdoYXQgdGhpcyBkb2VzLgotJQotXGRlZlxyZW1vdmVlbXB0eWJyYWNlc1xlbXB0eSMxXHJlbGF4eyMxfQotCi0lIEFmdGVyIFxzcGFjZXNwbGl0IGhhcyBkb25lIGl0cyB3b3JrLCB0aGlzIGlzIGNhbGxlZCAtLSAjMSBpcyB0aGUgZmluYWwKLSUgdGhpbmcgdG8gY2FsbCwgIzIgdGhlIHR5cGUgbmFtZSAod2hpY2ggc3RhcnRzIHdpdGggXGVtcHR5KSwgYW5kICMzCi0lICh3aGljaCBtaWdodCBiZSBlbXB0eSkgdGhlIGFyZ3VtZW50cy4KLSUKLVxkZWZccGFyc2V0cGhlYWRlcmxpbmUjMSMyIzN7JQotICAjMXtccmVtb3ZlZW1wdHlicmFjZXMjMlxyZWxheH17IzN9JQotfSUKLQotXGRlZlxkZWZvcHZhcnBhcnNlYm9keSAjMSMyIzMjNCM1IHtcYmVnaW5ncm91cFxpbkVOViAlCi1cbWVkYnJlYWsgJQotJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcwotJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgotXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLVxkZWYjMiMjMSAjIzIge1xkZWYjNHsjIzF9JQotXGJlZ2luZ3JvdXBcb2JleWxpbmVzXHNwYWNlc3BsaXR7IzN7IyMyfX19JQotXHBhcmluZGVudD0waW4KLVxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci1cYmVnaW5ncm91cFxvYmV5bGluZXNcc3BhY2VzcGxpdHsjM3sjNX19fQotCi0lIFNwbGl0IHVwICMyIGF0IHRoZSBmaXJzdCBzcGFjZSB0b2tlbi4KLSUgY2FsbCAjMSB3aXRoIHR3byBhcmd1bWVudHM6Ci0lICB0aGUgZmlyc3QgaXMgYWxsIG9mICMyIGJlZm9yZSB0aGUgc3BhY2UgdG9rZW4sCi0lICB0aGUgc2Vjb25kIGlzIGFsbCBvZiAjMiBhZnRlciB0aGF0IHNwYWNlIHRva2VuLgotJSBJZiAjMiBjb250YWlucyBubyBzcGFjZSB0b2tlbiwgYWxsIG9mIGl0IGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJnCi0lIGFuZCB0aGUgc2Vjb25kIGlzIHBhc3NlZCBhcyBlbXB0eS4KLQote1xvYmV5bGluZXMKLVxnZGVmXHNwYWNlc3BsaXQjMSMyXl5Ne1xlbmRncm91cFxzcGFjZXNwbGl0Zm9veyMxfSMyIFxyZWxheFxzcGFjZXNwbGl0Zm9vfSUKLVxsb25nXGdkZWZcc3BhY2VzcGxpdGZvbyMxIzIgIzMjNFxzcGFjZXNwbGl0Zm9veyUKLVxpZnhccmVsYXggIzMlCi0jMXsjMn17fVxlbHNlICMxeyMyfXsjMyM0fVxmaX19Ci0KLSUgU28gbXVjaCBmb3IgdGhlIHRoaW5ncyBjb21tb24gdG8gYWxsIGtpbmRzIG9mIGRlZmluaXRpb25zLgotCi0lIERlZmluZSBAZGVmdW4uCi0KLSUgRmlyc3QsIGRlZmluZSB0aGUgcHJvY2Vzc2luZyB0aGF0IGlzIHdhbnRlZCBmb3IgYXJndW1lbnRzIG9mIFxkZWZ1bgotJSBVc2UgdGhpcyB0byBleHBhbmQgdGhlIGFyZ3MgYW5kIHRlcm1pbmF0ZSB0aGUgcGFyYWdyYXBoIHRoZXkgbWFrZSB1cAotCi1cZGVmXGRlZnVuYXJncyAjMXtcZnVuY3Rpb25wYXJlbnMgXHNsCi0lIEV4cGFuZCwgcHJldmVudGluZyBoeXBoZW5hdGlvbiBhdCBgLScgY2hhcnMuCi0lIE5vdGUgdGhhdCBncm91cHMgZG9uJ3QgYWZmZWN0IGNoYW5nZXMgaW4gXGh5cGhlbmNoYXIuCi1caHlwaGVuY2hhclx0ZW5zbD0wCi0jMSUKLVxoeXBoZW5jaGFyXHRlbnNsPTQ1Ci1caWZudW1ccGFyZW5jb3VudD0wIFxlbHNlIFxlcnJtZXNzYWdle1VuYmFsYW5jZWQgcGFyZW50aGVzZXMgaW4gQGRlZn1cZmklCi1caW50ZXJsaW5lcGVuYWx0eT0xMDAwMAotXGFkdmFuY2VccmlnaHRza2lwIGJ5IDBwdCBwbHVzIDFmaWwKLVxlbmRncmFmXG5vYnJlYWtcdnNraXAgLVxwYXJza2lwXG5vYnJlYWsKLX0KLQotXGRlZlxkZWZ0eXBlZnVuYXJncyAjMXslCi0lIEV4cGFuZCwgcHJldmVudGluZyBoeXBoZW5hdGlvbiBhdCBgLScgY2hhcnMuCi0lIE5vdGUgdGhhdCBncm91cHMgZG9uJ3QgYWZmZWN0IGNoYW5nZXMgaW4gXGh5cGhlbmNoYXIuCi0lIFVzZSBcYm9sZGJyYXhub2FtcCwgbm90IFxmdW5jdGlvbnBhcmVucywgc28gdGhhdCAmIGlzIG5vdCBzcGVjaWFsLgotXGJvbGRicmF4bm9hbXAKLVx0Y2xvc2V7IzF9JSBhdm9pZCBcY29kZSBiZWNhdXNlIG9mIHNpZGUgZWZmZWN0cyBvbiBhY3RpdmUgY2hhcnMKLVxpbnRlcmxpbmVwZW5hbHR5PTEwMDAwCi1cYWR2YW5jZVxyaWdodHNraXAgYnkgMHB0IHBsdXMgMWZpbAotXGVuZGdyYWZcbm9icmVha1x2c2tpcCAtXHBhcnNraXBcbm9icmVhawotfQotCi0lIERvIGNvbXBsZXRlIHByb2Nlc3Npbmcgb2Ygb25lIEBkZWZ1biBvciBAZGVmdW54IGxpbmUgYWxyZWFkeSBwYXJzZWQuCi0KLSUgQGRlZmZuIENvbW1hbmQgZm9yd2FyZC1jaGFyIG5jaGFycwotCi1cZGVmXGRlZmZue1xkZWZtZXRocGFyc2Vib2R5XEVkZWZmblxkZWZmbnhcZGVmZm5oZWFkZXJ9Ci0KLVxkZWZcZGVmZm5oZWFkZXIgIzEjMiMze1xkb2luZCB7Zm59e1xjb2RleyMyfX0lCi1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMn17IzF9XGRlZnVuYXJnc3sjM31cZW5kZ3JvdXAgJQotXGNhdGNvZGUgNjE9XG90aGVyICUgVHVybiBvZmYgY2hhbmdlIG1hZGUgaW4gXGRlZnBhcnNlYm9keQotfQotCi0lIEBkZWZ1biA9PSBAZGVmZm4gRnVuY3Rpb24KLQotXGRlZlxkZWZ1bntcZGVmcGFyc2Vib2R5XEVkZWZ1blxkZWZ1bnhcZGVmdW5oZWFkZXJ9Ci0KLVxkZWZcZGVmdW5oZWFkZXIgIzEjMntcZG9pbmQge2ZufXtcY29kZXsjMX19JSBNYWtlIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMX17RnVuY3Rpb259JQotXGRlZnVuYXJncyB7IzJ9XGVuZGdyb3VwICUKLVxjYXRjb2RlIDYxPVxvdGhlciAlIFR1cm4gb2ZmIGNoYW5nZSBtYWRlIGluIFxkZWZwYXJzZWJvZHkKLX0KLQotJSBAZGVmdHlwZWZ1biBpbnQgZm9vYmFyIChpbnQgQHZhcntmb299LCBmbG9hdCBAdmFye2Jhcn0pCi0KLVxkZWZcZGVmdHlwZWZ1bntcZGVmcGFyc2Vib2R5XEVkZWZ0eXBlZnVuXGRlZnR5cGVmdW54XGRlZnR5cGVmdW5oZWFkZXJ9Ci0KLSUgIzEgaXMgdGhlIGRhdGEgdHlwZS4gICMyIGlzIHRoZSBuYW1lIGFuZCBhcmdzLgotXGRlZlxkZWZ0eXBlZnVuaGVhZGVyICMxIzJ7XGRlZnR5cGVmdW5oZWFkZXJ4eyMxfSMyIFxyZWxheH0KLSUgIzEgaXMgdGhlIGRhdGEgdHlwZSwgIzIgdGhlIG5hbWUsICMzIHRoZSBhcmdzLgotXGRlZlxkZWZ0eXBlZnVuaGVhZGVyeCAjMSMyICMzXHJlbGF4eyUKLVxkb2luZCB7Zm59e1xjb2RleyMyfX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUge1xkZWZoZWFkZXJ4Y29uZCMxXHJlbGF4JCQkIzJ9e0Z1bmN0aW9ufSUKLVxkZWZ0eXBlZnVuYXJncyB7IzN9XGVuZGdyb3VwICUKLVxjYXRjb2RlIDYxPVxvdGhlciAlIFR1cm4gb2ZmIGNoYW5nZSBtYWRlIGluIFxkZWZwYXJzZWJvZHkKLX0KLQotJSBAZGVmdHlwZWZuIHtMaWJyYXJ5IEZ1bmN0aW9ufSBpbnQgZm9vYmFyIChpbnQgQHZhcntmb299LCBmbG9hdCBAdmFye2Jhcn0pCi0KLVxkZWZcZGVmdHlwZWZue1xkZWZtZXRocGFyc2Vib2R5XEVkZWZ0eXBlZm5cZGVmdHlwZWZueFxkZWZ0eXBlZm5oZWFkZXJ9Ci0KLSUgXGRlZmhlYWRlcnhjb25kIzFccmVsYXgkJCQKLSUgcHV0cyAjMSBpbiBAY29kZSwgZm9sbG93ZWQgYnkgYSBzcGFjZSwgYnV0IGRvZXMgbm90aGluZyBpZiAjMSBpcyBudWxsLgotXGRlZlxkZWZoZWFkZXJ4Y29uZCMxIzIkJCR7XGlmeCMxXHJlbGF4XGVsc2VcY29kZXsjMSMyfSBcZml9Ci0KLSUgIzEgaXMgdGhlIGNsYXNzaWZpY2F0aW9uLiAgIzIgaXMgdGhlIGRhdGEgdHlwZS4gICMzIGlzIHRoZSBuYW1lIGFuZCBhcmdzLgotXGRlZlxkZWZ0eXBlZm5oZWFkZXIgIzEjMiMze1xkZWZ0eXBlZm5oZWFkZXJ4eyMxfXsjMn0jMyBccmVsYXh9Ci0lICMxIGlzIHRoZSBjbGFzc2lmaWNhdGlvbiwgIzIgdGhlIGRhdGEgdHlwZSwgIzMgdGhlIG5hbWUsICM0IHRoZSBhcmdzLgotXGRlZlxkZWZ0eXBlZm5oZWFkZXJ4ICMxIzIjMyAjNFxyZWxheHslCi1cZG9pbmQge2ZufXtcY29kZXsjM319JSBNYWtlIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci1cYmVnaW5ncm91cAotXG5vcm1hbHBhcmVucyAlIG5vdGFibHksIHR1cm4gb2ZmIGAmJyBtYWdpYywgd2hpY2ggcHJldmVudHMKLSUgICAgICAgICAgICAgICBhdCBsZWFzdCBzb21lIEMrKyB0ZXh0IGZyb20gd29ya2luZwotXGRlZm5hbWUge1xkZWZoZWFkZXJ4Y29uZCMyXHJlbGF4JCQkIzN9eyMxfSUKLVxkZWZ0eXBlZnVuYXJncyB7IzR9XGVuZGdyb3VwICUKLVxjYXRjb2RlIDYxPVxvdGhlciAlIFR1cm4gb2ZmIGNoYW5nZSBtYWRlIGluIFxkZWZwYXJzZWJvZHkKLX0KLQotJSBAZGVmbWFjID09IEBkZWZmbiBNYWNybwotCi1cZGVmXGRlZm1hY3tcZGVmcGFyc2Vib2R5XEVkZWZtYWNcZGVmbWFjeFxkZWZtYWNoZWFkZXJ9Ci0KLVxkZWZcZGVmbWFjaGVhZGVyICMxIzJ7XGRvaW5kIHtmbn17XGNvZGV7IzF9fSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzF9e01hY3JvfSUKLVxkZWZ1bmFyZ3MgeyMyfVxlbmRncm91cCAlCi1cY2F0Y29kZSA2MT1cb3RoZXIgJSBUdXJuIG9mZiBjaGFuZ2UgbWFkZSBpbiBcZGVmcGFyc2Vib2R5Ci19Ci0KLSUgQGRlZnNwZWMgPT0gQGRlZmZuIFNwZWNpYWwgRm9ybQotCi1cZGVmXGRlZnNwZWN7XGRlZnBhcnNlYm9keVxFZGVmc3BlY1xkZWZzcGVjeFxkZWZzcGVjaGVhZGVyfQotCi1cZGVmXGRlZnNwZWNoZWFkZXIgIzEjMntcZG9pbmQge2ZufXtcY29kZXsjMX19JSBNYWtlIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMX17U3BlY2lhbCBGb3JtfSUKLVxkZWZ1bmFyZ3MgeyMyfVxlbmRncm91cCAlCi1cY2F0Y29kZSA2MT1cb3RoZXIgJSBUdXJuIG9mZiBjaGFuZ2UgbWFkZSBpbiBcZGVmcGFyc2Vib2R5Ci19Ci0KLSUgVGhpcyBkZWZpbml0aW9uIGlzIHJ1biBpZiB5b3UgdXNlIEBkZWZ1bngKLSUgYW55d2hlcmUgb3RoZXIgdGhhbiBpbW1lZGlhdGVseSBhZnRlciBhIEBkZWZ1biBvciBAZGVmdW54LgotCi1cZGVmXGRlZmZueCAjMSB7XGVycm1lc3NhZ2V7QGRlZmZueCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ1bnggIzEge1xlcnJtZXNzYWdle0BkZWZ1bnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmbWFjeCAjMSB7XGVycm1lc3NhZ2V7QGRlZm1hY3ggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmc3BlY3ggIzEge1xlcnJtZXNzYWdle0BkZWZzcGVjeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ0eXBlZm54ICMxIHtcZXJybWVzc2FnZXtAZGVmdHlwZWZueCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ0eXBlbWV0aG9keCAjMSB7XGVycm1lc3NhZ2V7QGRlZnR5cGVtZXRob2R4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnR5cGVmdW54ICMxIHtcZXJybWVzc2FnZXtAZGVmdHlwZWZ1bnggaW4gaW52YWxpZCBjb250ZXh0fX0KLQotJSBAZGVmbWV0aG9kLCBhbmQgc28gb24KLQotJSBAZGVmb3AgQ0FURUdPUlkgQ0xBU1MgT1BFUkFUSU9OIEFSRy4uLgotCi1cZGVmXGRlZm9wICMxIHtcZGVmXGRlZm9wdHlwZXsjMX0lCi1cZGVmb3BwYXJzZWJvZHlcRWRlZm9wXGRlZm9weFxkZWZvcGhlYWRlclxkZWZvcHR5cGV9Ci0KLVxkZWZcZGVmb3BoZWFkZXIgIzEjMiMzeyUKLVxkb3N1YmluZCB7Zm59e1xjb2RleyMyfX17XHB1dHdvcmRvblwgIzF9JSBNYWtlIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMn17XGRlZm9wdHlwZXt9IG9uICMxfSUKLVxkZWZ1bmFyZ3MgeyMzfVxlbmRncm91cCAlCi19Ci0KLSUgQGRlZnR5cGVtZXRob2QgQ0xBU1MgUkVUVVJOLVRZUEUgTUVUSE9EIEFSRy4uLgotJQotXGRlZlxkZWZ0eXBlbWV0aG9keyUKLSAgXGRlZnR5cGVtZXRocGFyc2Vib2R5XEVkZWZ0eXBlbWV0aG9kXGRlZnR5cGVtZXRob2R4XGRlZnR5cGVtZXRob2RoZWFkZXJ9Ci0lCi0lICMxIGlzIHRoZSBjbGFzcyBuYW1lLCAjMiB0aGUgZGF0YSB0eXBlLCAjMyB0aGUgbWV0aG9kIG5hbWUsICM0IHRoZSBhcmdzLgotXGRlZlxkZWZ0eXBlbWV0aG9kaGVhZGVyIzEjMiMzIzR7JQotICBcZG9zdWJpbmR7Zm59e1xjb2RleyMzfX17XHB1dHdvcmRvblwgXGNvZGV7IzF9fSUgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLSAgXGJlZ2luZ3JvdXAKLSAgICBcZGVmbmFtZXtcZGVmaGVhZGVyeGNvbmQjMlxyZWxheCQkJCMzfXtccHV0d29yZE1ldGhvZG9uXCBcY29kZXsjMX19JQotICAgIFxkZWZ0eXBlZnVuYXJnc3sjNH0lCi0gIFxlbmRncm91cAotfQotCi0lIEBkZWZtZXRob2QgPT0gQGRlZm9wIE1ldGhvZAotJQotXGRlZlxkZWZtZXRob2R7XGRlZm1ldGhwYXJzZWJvZHlcRWRlZm1ldGhvZFxkZWZtZXRob2R4XGRlZm1ldGhvZGhlYWRlcn0KLSUKLSUgIzEgaXMgdGhlIGNsYXNzIG5hbWUsICMyIHRoZSBtZXRob2QgbmFtZSwgIzMgdGhlIGFyZ3MuCi1cZGVmXGRlZm1ldGhvZGhlYWRlciMxIzIjM3slCi0gIFxkb3N1YmluZHtmbn17XGNvZGV7IzJ9fXtccHV0d29yZG9uXCBcY29kZXsjMX19JSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotICBcYmVnaW5ncm91cAotICAgIFxkZWZuYW1leyMyfXtccHV0d29yZE1ldGhvZG9uXCBcY29kZXsjMX19JQotICAgIFxkZWZ1bmFyZ3N7IzN9JQotICBcZW5kZ3JvdXAKLX0KLQotJSBAZGVmY3Yge0NsYXNzIE9wdGlvbn0gZm9vLWNsYXNzIGZvby1mbGFnCi0KLVxkZWZcZGVmY3YgIzEge1xkZWZcZGVmY3Z0eXBleyMxfSUKLVxkZWZvcHZhcnBhcnNlYm9keVxFZGVmY3ZcZGVmY3Z4XGRlZmN2YXJoZWFkZXJcZGVmY3Z0eXBlfQotCi1cZGVmXGRlZmN2YXJoZWFkZXIgIzEjMiMzeyUKLVxkb3N1YmluZCB7dnJ9e1xjb2RleyMyfX17b2YgIzF9JSBNYWtlIGVudHJ5IGluIHZhciBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9e1xkZWZjdnR5cGV7fSBvZiAjMX0lCi1cZGVmdmFyYXJncyB7IzN9XGVuZGdyb3VwICUKLX0KLQotJSBAZGVmaXZhciA9PSBAZGVmY3Yge0luc3RhbmNlIFZhcmlhYmxlfQotCi1cZGVmXGRlZml2YXJ7XGRlZnZycGFyc2Vib2R5XEVkZWZpdmFyXGRlZml2YXJ4XGRlZml2YXJoZWFkZXJ9Ci0KLVxkZWZcZGVmaXZhcmhlYWRlciAjMSMyIzN7JQotXGRvc3ViaW5kIHt2cn17XGNvZGV7IzJ9fXtvZiAjMX0lIE1ha2UgZW50cnkgaW4gdmFyIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMn17SW5zdGFuY2UgVmFyaWFibGUgb2YgIzF9JQotXGRlZnZhcmFyZ3MgeyMzfVxlbmRncm91cCAlCi19Ci0KLSUgVGhlc2UgZGVmaW5pdGlvbnMgYXJlIHJ1biBpZiB5b3UgdXNlIEBkZWZtZXRob2R4LCBldGMuLAotJSBhbnl3aGVyZSBvdGhlciB0aGFuIGltbWVkaWF0ZWx5IGFmdGVyIGEgQGRlZm1ldGhvZCwgZXRjLgotCi1cZGVmXGRlZm9weCAjMSB7XGVycm1lc3NhZ2V7QGRlZm9weCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZtZXRob2R4ICMxIHtcZXJybWVzc2FnZXtAZGVmbWV0aG9keCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZjdnggIzEge1xlcnJtZXNzYWdle0BkZWZjdnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmaXZhcnggIzEge1xlcnJtZXNzYWdle0BkZWZpdmFyeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotCi0lIE5vdyBAZGVmdmFyCi0KLSUgRmlyc3QsIGRlZmluZSB0aGUgcHJvY2Vzc2luZyB0aGF0IGlzIHdhbnRlZCBmb3IgYXJndW1lbnRzIG9mIEBkZWZ2YXIuCi0lIFRoaXMgaXMgYWN0dWFsbHkgc2ltcGxlOiBqdXN0IHByaW50IHRoZW0gaW4gcm9tYW4uCi0lIFRoaXMgbXVzdCBleHBhbmQgdGhlIGFyZ3MgYW5kIHRlcm1pbmF0ZSB0aGUgcGFyYWdyYXBoIHRoZXkgbWFrZSB1cAotXGRlZlxkZWZ2YXJhcmdzICMxe1xub3JtYWxwYXJlbnMgIzElCi1caW50ZXJsaW5lcGVuYWx0eT0xMDAwMAotXGVuZGdyYWZcbm9icmVha1x2c2tpcCAtXHBhcnNraXBcbm9icmVha30KLQotJSBAZGVmdnIgQ291bnRlciBmb28tY291bnQKLQotXGRlZlxkZWZ2cntcZGVmdnJwYXJzZWJvZHlcRWRlZnZyXGRlZnZyeFxkZWZ2cmhlYWRlcn0KLQotXGRlZlxkZWZ2cmhlYWRlciAjMSMyIzN7XGRvaW5kIHt2cn17XGNvZGV7IzJ9fSUKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXsjMX1cZGVmdmFyYXJnc3sjM31cZW5kZ3JvdXB9Ci0KLSUgQGRlZnZhciA9PSBAZGVmdnIgVmFyaWFibGUKLQotXGRlZlxkZWZ2YXJ7XGRlZnZhcnBhcnNlYm9keVxFZGVmdmFyXGRlZnZhcnhcZGVmdmFyaGVhZGVyfQotCi1cZGVmXGRlZnZhcmhlYWRlciAjMSMye1xkb2luZCB7dnJ9e1xjb2RleyMxfX0lIE1ha2UgZW50cnkgaW4gdmFyIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMX17VmFyaWFibGV9JQotXGRlZnZhcmFyZ3MgeyMyfVxlbmRncm91cCAlCi19Ci0KLSUgQGRlZm9wdCA9PSBAZGVmdnIge1VzZXIgT3B0aW9ufQotCi1cZGVmXGRlZm9wdHtcZGVmdmFycGFyc2Vib2R5XEVkZWZvcHRcZGVmb3B0eFxkZWZvcHRoZWFkZXJ9Ci0KLVxkZWZcZGVmb3B0aGVhZGVyICMxIzJ7XGRvaW5kIHt2cn17XGNvZGV7IzF9fSUgTWFrZSBlbnRyeSBpbiB2YXIgaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtVc2VyIE9wdGlvbn0lCi1cZGVmdmFyYXJncyB7IzJ9XGVuZGdyb3VwICUKLX0KLQotJSBAZGVmdHlwZXZhciBpbnQgZm9vYmFyCi0KLVxkZWZcZGVmdHlwZXZhcntcZGVmdmFycGFyc2Vib2R5XEVkZWZ0eXBldmFyXGRlZnR5cGV2YXJ4XGRlZnR5cGV2YXJoZWFkZXJ9Ci0KLSUgIzEgaXMgdGhlIGRhdGEgdHlwZS4gICMyIGlzIHRoZSBuYW1lLCBwZXJoYXBzIGZvbGxvd2VkIGJ5IHRleHQgdGhhdAotJSBpcyBhY3R1YWxseSBwYXJ0IG9mIHRoZSBkYXRhIHR5cGUsIHdoaWNoIHNob3VsZCBub3QgYmUgcHV0IGludG8gdGhlIGluZGV4LgotXGRlZlxkZWZ0eXBldmFyaGVhZGVyICMxIzJ7JQotXGRvdmFyaW5kIzIgXHJlbGF4JSBNYWtlIGVudHJ5IGluIHZhcmlhYmxlcyBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7XGRlZmhlYWRlcnhjb25kIzFccmVsYXgkJCQjMn17VmFyaWFibGV9JQotXGludGVybGluZXBlbmFsdHk9MTAwMDAKLVxlbmRncmFmXG5vYnJlYWtcdnNraXAgLVxwYXJza2lwXG5vYnJlYWsKLVxlbmRncm91cH0KLVxkZWZcZG92YXJpbmQjMSAjMlxyZWxheHtcZG9pbmR7dnJ9e1xjb2RleyMxfX19Ci0KLSUgQGRlZnR5cGV2ciB7R2xvYmFsIEZsYWd9IGludCBlbmFibGUKLQotXGRlZlxkZWZ0eXBldnJ7XGRlZnZycGFyc2Vib2R5XEVkZWZ0eXBldnJcZGVmdHlwZXZyeFxkZWZ0eXBldnJoZWFkZXJ9Ci0KLVxkZWZcZGVmdHlwZXZyaGVhZGVyICMxIzIjM3tcZG92YXJpbmQjMyBccmVsYXglCi1cYmVnaW5ncm91cFxkZWZuYW1lIHtcZGVmaGVhZGVyeGNvbmQjMlxyZWxheCQkJCMzfXsjMX0KLVxpbnRlcmxpbmVwZW5hbHR5PTEwMDAwCi1cZW5kZ3JhZlxub2JyZWFrXHZza2lwIC1ccGFyc2tpcFxub2JyZWFrCi1cZW5kZ3JvdXB9Ci0KLSUgVGhpcyBkZWZpbml0aW9uIGlzIHJ1biBpZiB5b3UgdXNlIEBkZWZ2YXJ4Ci0lIGFueXdoZXJlIG90aGVyIHRoYW4gaW1tZWRpYXRlbHkgYWZ0ZXIgYSBAZGVmdmFyIG9yIEBkZWZ2YXJ4LgotCi1cZGVmXGRlZnZyeCAjMSB7XGVycm1lc3NhZ2V7QGRlZnZyeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ2YXJ4ICMxIHtcZXJybWVzc2FnZXtAZGVmdmFyeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZvcHR4ICMxIHtcZXJybWVzc2FnZXtAZGVmb3B0eCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZ0eXBldmFyeCAjMSB7XGVycm1lc3NhZ2V7QGRlZnR5cGV2YXJ4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnR5cGV2cnggIzEge1xlcnJtZXNzYWdle0BkZWZ0eXBldnJ4IGluIGludmFsaWQgY29udGV4dH19Ci0KLSUgTm93IGRlZmluZSBAZGVmdHAKLSUgQXJncyBhcmUgcHJpbnRlZCBpbiBib2xkLCBhIHNsaWdodCBkaWZmZXJlbmNlIGZyb20gQGRlZnZhci4KLQotXGRlZlxkZWZ0cGFyZ3MgIzF7XGJmIFxkZWZ2YXJhcmdzeyMxfX0KLQotJSBAZGVmdHAgQ2xhc3Mgd2luZG93IGhlaWdodCB3aWR0aCAuLi4KLQotXGRlZlxkZWZ0cHtcZGVmdHBwYXJzZWJvZHlcRWRlZnRwXGRlZnRweFxkZWZ0cGhlYWRlcn0KLQotXGRlZlxkZWZ0cGhlYWRlciAjMSMyIzN7XGRvaW5kIHt0cH17XGNvZGV7IzJ9fSUKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXsjMX1cZGVmdHBhcmdzeyMzfVxlbmRncm91cH0KLQotJSBUaGlzIGRlZmluaXRpb24gaXMgcnVuIGlmIHlvdSB1c2UgQGRlZnRweCwgZXRjCi0lIGFueXdoZXJlIG90aGVyIHRoYW4gaW1tZWRpYXRlbHkgYWZ0ZXIgYSBAZGVmdHAsIGV0Yy4KLQotXGRlZlxkZWZ0cHggIzEge1xlcnJtZXNzYWdle0BkZWZ0cHggaW4gaW52YWxpZCBjb250ZXh0fX0KLQotCi1cbWVzc2FnZXttYWNyb3MsfQotJSBAbWFjcm8uCi0KLSUgVG8gZG8gdGhpcyByaWdodCB3ZSBuZWVkIGEgZmVhdHVyZSBvZiBlLVRlWCwgXHNjYW50b2tlbnMsIAotJSB3aGljaCB3ZSBhcnJhbmdlIHRvIGVtdWxhdGUgd2l0aCBhIHRlbXBvcmFyeSBmaWxlIGluIG9yZGluYXJ5IFRlWC4KLVxpZnhcZVRlWHZlcnNpb25cdW5kZWZpbmVkCi0gXG5ld3dyaXRlXG1hY3NjcmliYmxlCi0gXGRlZlxzY2FubWFjcm8jMXslCi0gICBcYmVnaW5ncm91cCBcbmV3bGluZWNoYXJgXF5eTQotICAgXGltbWVkaWF0ZVxvcGVub3V0XG1hY3NjcmliYmxlPVxqb2JuYW1lLnRtcAotICAgXGltbWVkaWF0ZVx3cml0ZVxtYWNzY3JpYmJsZXsjMX0lCi0gICBcaW1tZWRpYXRlXGNsb3Nlb3V0XG1hY3NjcmliYmxlCi0gICBcbGV0XHhlYXRzcGFjZXNcZWF0c3BhY2VzCi0gICBcaW5wdXQgXGpvYm5hbWUudG1wCi0gICBcZW5kZ3JvdXAKLX0KLVxlbHNlCi1cZGVmXHNjYW5tYWNybyMxeyUKLVxiZWdpbmdyb3VwIFxuZXdsaW5lY2hhcmBcXl5NCi1cbGV0XHhlYXRzcGFjZXNcZWF0c3BhY2VzXHNjYW50b2tlbnN7IzF9XGVuZGdyb3VwfQotXGZpCi0KLVxuZXdjb3VudFxwYXJhbW5vICAgJSBDb3VudCBvZiBwYXJhbWV0ZXJzCi1cbmV3dG9rc1xtYWNuYW1lICAgICUgTWFjcm8gbmFtZQotXG5ld2lmXGlmcmVjdXJzaXZlICAlIElzIGl0IHJlY3Vyc2l2ZT8KLQotJSBVdGlsaXR5IHJvdXRpbmVzLgotJSBUaGlzZG9lcyBcbGV0ICMxID0gIzIsIGV4Y2VwdCB3aXRoIFxjc25hbWVzLgotXGRlZlxjc2xldCMxIzJ7JQotXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi1cZXhwYW5kYWZ0ZXJcbGV0Ci1cZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKLVxjc25hbWUjMVxlbmRjc25hbWUKLVxjc25hbWUjMlxlbmRjc25hbWV9Ci0KLSUgVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgb2ZmIGEgc3RyaW5nLgotJSBDb25jZXB0cyBmcm9tIGFyby1iZW5kIHByb2JsZW0gMTUgKHNlZSBDVEFOKS4KLXtcY2F0Y29kZWBcQD0xMQotXGdkZWZcZWF0c3BhY2VzICMxe1xleHBhbmRhZnRlclx0cmltQFxleHBhbmRhZnRlcnsjMSB9fQotXGdkZWZcdHJpbUAgIzF7XHRyaW1AQCBAIzEgQCAjMSBAIEBAfQotXGdkZWZcdHJpbUBAICMxQCAjMkAgIzNAQHtcdHJpbUBAQFxlbXB0eSAjMiBAfQotXGRlZlx1bmJyYWNlIzF7IzF9Ci1cdW5icmFjZXtcZ2RlZlx0cmltQEBAICMxIH0gIzJAeyMxfQotfQotCi0lIFRyaW0gYSBzaW5nbGUgdHJhaWxpbmcgXl5NIG9mZiBhIHN0cmluZy4KLXtcY2F0Y29kZWBcXl5NPTEyXGNhdGNvZGVgXFE9MyUKLVxnZGVmXGVhdGNyICMxe1xlYXRjcmEgIzFRXl5NUX0lCi1cZ2RlZlxlYXRjcmEjMV5eTVF7XGVhdGNyYiMxUX0lCi1cZ2RlZlxlYXRjcmIjMVEjMlF7IzF9JQotfQotCi0lIE1hY3JvIGJvZGllcyBhcmUgYWJzb3JiZWQgYXMgYW4gYXJndW1lbnQgaW4gYSBjb250ZXh0IHdoZXJlCi0lIGFsbCBjaGFyYWN0ZXJzIGFyZSBjYXRjb2RlIDEwLCAxMSBvciAxMiwgZXhjZXB0IFwgd2hpY2ggaXMgYWN0aXZlCi0lIChhcyBpbiBub3JtYWwgdGV4aW5mbykuIEl0IGlzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgXC4KLQotJSBJdCdzIG5lY2Vzc2FyeSB0byBoYXZlIGhhcmQgQ1JzIHdoZW4gdGhlIG1hY3JvIGlzIGV4ZWN1dGVkLiBUaGlzIGlzIAotJSBkb25lIGJ5ICBtYWtpbmcgXl5NIChcZW5kbGluZWNoYXIpIGNhdGNvZGUgMTIgd2hlbiByZWFkaW5nIHRoZSBtYWNybyAKLSUgYm9keSwgYW5kIHRoZW4gbWFraW5nIGl0IHRoZSBcbmV3bGluZWNoYXIgaW4gXHNjYW5tYWNyby4KLQotXGRlZlxtYWNyb2JvZHljdHh0eyUKLSAgXGNhdGNvZGVgXH49MTIKLSAgXGNhdGNvZGVgXF49MTIKLSAgXGNhdGNvZGVgXF89MTIKLSAgXGNhdGNvZGVgXHw9MTIKLSAgXGNhdGNvZGVgXDw9MTIKLSAgXGNhdGNvZGVgXD49MTIKLSAgXGNhdGNvZGVgXCs9MTIKLSAgXGNhdGNvZGVgXHs9MTIKLSAgXGNhdGNvZGVgXH09MTIKLSAgXGNhdGNvZGVgXEA9MTIKLSAgXGNhdGNvZGVgXF5eTT0xMgotICBcdXNlbWJvZHliYWNrc2xhc2h9Ci0KLSUgXG1ib2R5YmFja3NsYXNoIGlzIHRoZSBkZWZpbml0aW9uIG9mIFwgaW4gQG1hY3JvIGJvZGllcy4KLSUgSXQgbWFwcyBcZm9vXCA9PiBcY3NuYW1lIG1hY2FyZy5mb29cZW5kY3NuYW1lID0+ICNOIAotJSB3aGVyZSBOIGlzIHRoZSBtYWNybyBwYXJhbWV0ZXIgbnVtYmVyLgotJSBXZSBkZWZpbmUgXGNzbmFtZSBtYWNhcmcuXGVuZGNzbmFtZSB0byBiZSBccmVhbGJhY2tzbGFzaCwgc28KLSUgXFwgaW4gbWFjcm8gcmVwbGFjZW1lbnQgdGV4dCBnZXRzIHlvdSBhIGJhY2tzbGFzaC4KLQote1xjYXRjb2RlYEA9MCBAY2F0Y29kZWBAXD1AYWN0aXZlCi0gQGdkZWZAdXNlbWJvZHliYWNrc2xhc2h7QGxldFw9QG1ib2R5YmFja3NsYXNofQotIEBnZGVmQG1ib2R5YmFja3NsYXNoIzFce0Bjc25hbWUgbWFjYXJnLiMxQGVuZGNzbmFtZX0KLX0KLVxleHBhbmRhZnRlclxkZWZcY3NuYW1lIG1hY2FyZy5cZW5kY3NuYW1le1xyZWFsYmFja3NsYXNofQotCi1cZGVmXG1hY3Jve1xyZWN1cnNpdmVmYWxzZVxwYXJzZWFyZ1xtYWNyb3h4eH0KLVxkZWZccm1hY3Jve1xyZWN1cnNpdmV0cnVlXHBhcnNlYXJnXG1hY3JveHh4fQotCi1cZGVmXG1hY3JveHh4IzF7JQotICBcZ2V0YXJnc3sjMX0lICAgICAgICAgICBub3cgXG1hY25hbWUgaXMgdGhlIG1hY25hbWUgYW5kIFxhcmdsIHRoZSBhcmdsaXN0Ci0gIFxpZnhcYXJnbFxlbXB0eSAgICAgICAlIG5vIGFyZ3VtZW50cwotICAgICBccGFyYW1ubz0wJQotICBcZWxzZQotICAgICBcZXhwYW5kYWZ0ZXJccGFyc2VtYXJnZGVmIFxhcmdsOyUgCi0gIFxmaQotICBcZXhwYW5kYWZ0ZXJcaWZ4IFxjc25hbWUgbWFjc2F2ZS5cdGhlXG1hY25hbWVcZW5kY3NuYW1lIFxyZWxheAotICAgICBcY3NsZXR7bWFjc2F2ZS5cdGhlXG1hY25hbWV9e1x0aGVcbWFjbmFtZX0lCi0gIFxlbHNlCi0gICAgIFxtZXNzYWdle1dhcm5pbmc6IHJlZGVmaW5pbmcgXHRoZVxtYWNuYW1lfSUKLSAgXGZpCi0gIFxiZWdpbmdyb3VwIFxtYWNyb2JvZHljdHh0Ci0gIFxpZnJlY3Vyc2l2ZSBcZXhwYW5kYWZ0ZXJccGFyc2VybWFjYm9keQotICBcZWxzZSBcZXhwYW5kYWZ0ZXJccGFyc2VtYWNib2R5IAotICBcZml9Ci0KLVxkZWZcdW5tYWNyb3tccGFyc2VhcmdcdW5tYWNyb3h4eH0KLVxkZWZcdW5tYWNyb3h4eCMxeyUKLSAgXGV4cGFuZGFmdGVyXGlmeCBcY3NuYW1lIG1hY3NhdmUuXHRoZVxtYWNuYW1lXGVuZGNzbmFtZSBccmVsYXgKLSAgICBcZXJybWVzc2FnZXtNYWNybyBcdGhlXG1hY25hbWVcIG5vdCBkZWZpbmVkLn0lCi0gIFxlbHNlCi0gICAgXGNzbGV0eyMxfXttYWNzYXZlLiMxfSUKLSAgICBcZXhwYW5kYWZ0ZXJcbGV0IFxjc25hbWUgbWFjc2F2ZS5cdGhlXG1hY25hbWVcZW5kY3NuYW1lIFx1bmRlZmluZWQKLSAgXGZpCi19Ci0KLSUgVGhpcyBtYWtlcyB1c2Ugb2YgdGhlIG9ic2N1cmUgZmVhdHVyZSB0aGF0IGlmIHRoZSBsYXN0IHRva2VuIG9mIGEKLSUgPHBhcmFtZXRlciBsaXN0PiBpcyAjLCB0aGVuIHRoZSBwcmVjZWRpbmcgYXJndW1lbnQgaXMgZGVsaW1pdGVkIGJ5Ci0lIGFuIG9wZW5pbmcgYnJhY2UsIGFuZCB0aGF0IG9wZW5pbmcgYnJhY2UgaXMgbm90IGNvbnN1bWVkLgotXGRlZlxnZXRhcmdzIzF7XGdldGFyZ3N4eHgjMXt9fQotXGRlZlxnZXRhcmdzeHh4IzEje1xnZXRtYWNuYW1lICMxIFxyZWxheFxnZXRtYWNhcmdzfQotXGRlZlxnZXRtYWNuYW1lICMxICMyXHJlbGF4e1xtYWNuYW1lPXsjMX19Ci1cZGVmXGdldG1hY2FyZ3MjMXtcZGVmXGFyZ2x7IzF9fQotCi0lIFBhcnNlIHRoZSBvcHRpb25hbCB7cGFyYW1zfSBsaXN0LiAgU2V0IHVwIFxwYXJhbW5vIGFuZCBccGFyYW1saXN0Ci0lIHNvIFxkZWZtYWNybyBrbm93cyB3aGF0IHRvIGRvLiAgRGVmaW5lIFxtYWNhcmcuYmxhaCBmb3IgZWFjaCBibGFoCi0lIGluIHRoZSBwYXJhbXMgbGlzdCwgdG8gYmUgIyNOIHdoZXJlIE4gaXMgdGhlIHBvc2l0aW9uIGluIHRoYXQgbGlzdC4KLSUgVGhhdCBnZXRzIHVzZWQgYnkgXG1ib2R5YmFja3NsYXNoIChhYm92ZSkuCi0KLSUgV2UgbmVlZCB0byBnZXQgYG1hY3JvIHBhcmFtZXRlciBjaGFyICMnIGludG8gc2V2ZXJhbCBkZWZpbml0aW9ucy4KLSUgVGhlIHRlY2huaXF1ZSB1c2VkIGlzIHN0b2xlbiBmcm9tIExhVGVYOiAgbGV0IFxoYXNoIGJlIHNvbWV0aGluZwotJSB1bmV4cGFuZGFibGUsIGluc2VydCB0aGF0IHdoZXJldmVyIHlvdSBuZWVkIGEgIywgYW5kIHRoZW4gcmVkZWZpbmUKLSUgaXQgdG8gIyBqdXN0IGJlZm9yZSB1c2luZyB0aGUgdG9rZW4gbGlzdCBwcm9kdWNlZC4KLSUKLSUgVGhlIHNhbWUgdGVjaG5pcXVlIGlzIHVzZWQgdG8gcHJvdGVjdCBcZWF0c3BhY2VzIHRpbGwganVzdCBiZWZvcmUKLSUgdGhlIG1hY3JvIGlzIHVzZWQuCi0KLVxkZWZccGFyc2VtYXJnZGVmIzE7e1xwYXJhbW5vPTBcZGVmXHBhcmFtbGlzdHt9JQotICAgICAgICBcbGV0XGhhc2hccmVsYXhcbGV0XHhlYXRzcGFjZXNccmVsYXhccGFyc2VtYXJnZGVmeHh4IzEsOyx9Ci1cZGVmXHBhcnNlbWFyZ2RlZnh4eCMxLHslCi0gIFxpZiMxO1xsZXRcbmV4dD1ccmVsYXgKLSAgXGVsc2UgXGxldFxuZXh0PVxwYXJzZW1hcmdkZWZ4eHgKLSAgICBcYWR2YW5jZVxwYXJhbW5vIGJ5IDElCi0gICAgXGV4cGFuZGFmdGVyXGVkZWZcY3NuYW1lIG1hY2FyZy5cZWF0c3BhY2VzeyMxfVxlbmRjc25hbWUKLSAgICAgICAge1x4ZWF0c3BhY2Vze1xoYXNoXHRoZVxwYXJhbW5vfX0lCi0gICAgXGVkZWZccGFyYW1saXN0e1xwYXJhbWxpc3RcaGFzaFx0aGVccGFyYW1ubyx9JQotICBcZmlcbmV4dH0KLQotJSBUaGVzZSB0d28gY29tbWFuZHMgcmVhZCByZWN1cnNpdmUgYW5kIG5vbnJlY3Vyc2l2ZSBtYWNybyBib2RpZXMuCi0lIChUaGV5J3JlIGRpZmZlcmVudCBzaW5jZSByZWMgYW5kIG5vbnJlYyBtYWNyb3MgZW5kIGRpZmZlcmVudGx5LikKLQotXGxvbmdcZGVmXHBhcnNlbWFjYm9keSMxQGVuZCBtYWNybyUKLXtceGRlZlx0ZW1we1xlYXRjcnsjMX19XGVuZGdyb3VwXGRlZm1hY3JvfSUKLVxsb25nXGRlZlxwYXJzZXJtYWNib2R5IzFAZW5kIHJtYWNybyUKLXtceGRlZlx0ZW1we1xlYXRjcnsjMX19XGVuZGdyb3VwXGRlZm1hY3JvfSUKLQotJSBUaGlzIGRlZmluZXMgdGhlIG1hY3JvIGl0c2VsZi4gVGhlcmUgYXJlIHNpeCBjYXNlczogcmVjdXJzaXZlIGFuZAotJSBub25yZWN1cnNpdmUgbWFjcm9zIG9mIHplcm8sIG9uZSwgYW5kIG1hbnkgYXJndW1lbnRzLgotJSBNdWNoIG1hZ2ljIHdpdGggXGV4cGFuZGFmdGVyIGhlcmUuCi0lIFx4ZGVmIGlzIHVzZWQgc28gdGhhdCBtYWNybyBkZWZpbml0aW9ucyB3aWxsIHN1cnZpdmUgdGhlIGZpbGUKLSUgdGhleSdyZSBkZWZpbmVkIGluOyBAaW5jbHVkZSByZWFkcyB0aGUgZmlsZSBpbnNpZGUgYSBncm91cC4KLVxkZWZcZGVmbWFjcm97JQotICBcbGV0XGhhc2g9IyMlIGNvbnZlcnQgcGxhY2Vob2xkZXJzIHRvIG1hY3JvIHBhcmFtZXRlciBjaGFycwotICBcaWZyZWN1cnNpdmUKLSAgICBcaWZjYXNlXHBhcmFtbm8KLSAgICAlIDAKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQotICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfX0lCi0gICAgXG9yICUgMQotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCi0gICAgICAgICBcbm9leHBhbmRcYnJhY2VvcmxpbmVcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWV9JQotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUjIzF7JQotICAgICAgICAgXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH19JQotICAgIFxlbHNlICUgbWFueQotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZSMjMXslCi0gICAgICAgICAgXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lICMjMSx9JQotICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZgotICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCi0gICAgICAgIFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSAKLSAgICAgICAgICBccGFyYW1saXN0e1xub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKLSAgICBcZmkKLSAgXGVsc2UKLSAgICBcaWZjYXNlXHBhcmFtbm8KLSAgICAlIDAKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQotICAgICAgICBcbm9leHBhbmRcbm9yZWN1cnNle1x0aGVcbWFjbmFtZX0lCi0gICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9XGVncm91cH0lCi0gICAgXG9yICUgMQotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCi0gICAgICAgICBcbm9leHBhbmRcYnJhY2VvcmxpbmVcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWV9JQotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUjIzF7JQotICAgICAgICBcbm9leHBhbmRcbm9yZWN1cnNle1x0aGVcbWFjbmFtZX0lCi0gICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9XGVncm91cH0lCi0gICAgXGVsc2UgJSBtYW55Ci0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1lIyMxeyUKLSAgICAgICAgICBcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUgIyMxLH0lCi0gICAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmCi0gICAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKLSAgICAgIFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZQotICAgICAgXHBhcmFtbGlzdHslCi0gICAgICAgICAgXG5vZXhwYW5kXG5vcmVjdXJzZXtcdGhlXG1hY25hbWV9JQotICAgICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9XGVncm91cH0lCi0gICAgXGZpCi0gIFxmaX0KLQotXGRlZlxub3JlY3Vyc2UjMXtcYmdyb3VwXGNzbGV0eyMxfXttYWNzYXZlLiMxfX0KLQotJSBcYnJhY2VvcmxpbmUgZGVjaWRlcyB3aGV0aGVyIHRoZSBuZXh0IG5vbndoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGEKLSUgey4gIElmIHNvIGl0IHJlYWRzIHVwIHRvIHRoZSBjbG9zaW5nIH0sIGlmIG5vdCwgaXQgcmVhZHMgdGhlIHdob2xlCi0lIGxpbmUuICBXaGF0ZXZlciB3YXMgcmVhZCBpcyB0aGVuIGZlZCB0byB0aGUgbmV4dCBjb250cm9sIHNlcXVlbmNlCi0lIGFzIGFuIGFyZ3VtZW50IChieSBccGFyc2VicmFjZSBvciBccGFyc2VhcmcpCi1cZGVmXGJyYWNlb3JsaW5lIzF7XGxldFxuZXh0PSMxXGZ1dHVyZWxldFxuY2hhclxicmFjZW9ybGluZXh4eH0KLVxkZWZcYnJhY2VvcmxpbmV4eHh7JQotICBcaWZ4XG5jaGFyXGJncm91cFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXHBhcnNlYXJnIAotICBcZmkgXG5leHR9Ci0KLQotXG1lc3NhZ2V7Y3Jvc3MgcmVmZXJlbmNlcyx9Ci1cbmV3d3JpdGVcYXV4ZmlsZQotCi1cbmV3aWZcaWZoYXZleHJlZnMgICAgJSBUcnVlIGlmIHhyZWYgdmFsdWVzIGFyZSBrbm93bi4KLVxuZXdpZlxpZndhcm5lZHhyZWZzICAlIFRydWUgaWYgd2Ugd2FybmVkIG9uY2UgdGhhdCB0aGV5IGFyZW4ndCBrbm93bi4KLQotJSBAaW5mb3JlZiBpcyByZWxhdGl2ZWx5IHNpbXBsZS4KLVxkZWZcaW5mb3JlZiAjMXtcaW5mb3JlZnp6eiAjMSwsLCwqKn0KLVxkZWZcaW5mb3JlZnp6eiAjMSwjMiwjMywjNCoqe1xwdXR3b3JkU2Vle30gXHB1dHdvcmRJbmZve30gXHB1dHdvcmRmaWxle30gXGZpbGV7XGlnbm9yZXNwYWNlcyAjM3t9fSwKLSAgbm9kZSBcc2FtcHtcaWdub3Jlc3BhY2VzIzF7fX19Ci0KLSUgQG5vZGUncyBqb2IgaXMgdG8gZGVmaW5lIFxsYXN0bm9kZS4KLVxkZWZcbm9kZXtcRU5WY2hlY2tccGFyc2Vhcmdcbm9kZXp6en0KLVxkZWZcbm9kZXp6eiMxe1xub2RleHh4IFsjMSxdfQotXGRlZlxub2RleHh4WyMxLCMyXXtcZ2RlZlxsYXN0bm9kZXsjMX19Ci1cbGV0XG53bm9kZT1cbm9kZQotXGxldFxsYXN0bm9kZT1ccmVsYXgKLQotJSBUaGUgc2VjdGlvbmluZyBjb21tYW5kcyAoQGNoYXB0ZXIsIGV0Yy4pIGNhbGwgdGhlc2UuCi1cZGVmXGRvbm9kZXJlZnslCi0gIFxpZnhcbGFzdG5vZGVccmVsYXhcZWxzZQotICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlclxleHBhbmRhZnRlclxzZXRyZWZ7XGxhc3Rub2RlfSUKLSAgICAgIHtZc2VjdGlvbm51bWJlcmFuZHR5cGV9JQotICAgIFxnbG9iYWxcbGV0XGxhc3Rub2RlPVxyZWxheAotICBcZmkKLX0KLVxkZWZcdW5udW1ibm9kZXJlZnslCi0gIFxpZnhcbGFzdG5vZGVccmVsYXhcZWxzZQotICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlclxleHBhbmRhZnRlclxzZXRyZWZ7XGxhc3Rub2RlfXtZbm90aGluZ30lCi0gICAgXGdsb2JhbFxsZXRcbGFzdG5vZGU9XHJlbGF4Ci0gIFxmaQotfQotXGRlZlxhcHBlbmRpeG5vZGVyZWZ7JQotICBcaWZ4XGxhc3Rub2RlXHJlbGF4XGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXJcc2V0cmVme1xsYXN0bm9kZX0lCi0gICAgICB7WWFwcGVuZGl4bGV0dGVyYW5kdHlwZX0lCi0gICAgXGdsb2JhbFxsZXRcbGFzdG5vZGU9XHJlbGF4Ci0gIFxmaQotfQotCi0KLSUgQGFuY2hvcntOQU1FfSAtLSBkZWZpbmUgeHJlZiB0YXJnZXQgYXQgYXJiaXRyYXJ5IHBvaW50LgotJSAKLVxkZWZcYW5jaG9yIzF7XHNldHJlZnsjMX17WW5vdGhpbmd9fQotCi0KLSUgXHNldHJlZntOQU1FfXtTTlR9IGRlZmluZXMgYSBjcm9zcy1yZWZlcmVuY2UgcG9pbnQgTkFNRSwgbmFtZWx5Ci0lIE5BTUUtdGl0bGUsIE5BTUUtcGcsIGFuZCBOQU1FLVNOVC4gIENhbGxlZCBmcm9tIFxmb29ub2RlcmVmLiAgV2UgaGF2ZQotJSB0byBzZXQgXGluZGV4ZHVtbWllcyBzbyBjb21tYW5kcyBzdWNoIGFzIEBjb2RlIGluIGEgc2VjdGlvbiB0aXRsZQotJSBhcmVuJ3QgZXhwYW5kZWQuICBJdCB3b3VsZCBiZSBuaWNlciBub3QgdG8gZXhwYW5kIHRoZSB0aXRsZXMgaW4gdGhlCi0lIGZpcnN0IHBsYWNlLCBidXQgdGhlcmUncyBzbyBtYW55IGxheWVycyB0aGF0IHRoYXQgaXMgaGFyZCB0byBkby4KLSUgCi1cZGVmXHNldHJlZiMxIzJ7eyUKLSAgXGluZGV4ZHVtbWllcwotICBcZG9zZXRxeyMxLXRpdGxlfXtZdGl0bGV9JQotICBcZG9zZXRxeyMxLXBnfXtZcGFnZW51bWJlcn0lCi0gIFxkb3NldHF7IzEtc250fXsjMn0KLX19Ci0KLSUgQHhyZWYsIEBweHJlZiwgYW5kIEByZWYgZ2VuZXJhdGUgY3Jvc3MtcmVmZXJlbmNlcy4gIEZvciBceHJlZlgsICMxIGlzCi0lIHRoZSBub2RlIG5hbWUsICMyIHRoZSBuYW1lIG9mIHRoZSBJbmZvIGNyb3NzLXJlZmVyZW5jZSwgIzMgdGhlIHByaW50ZWQKLSUgbm9kZSBuYW1lLCAjNCB0aGUgbmFtZSBvZiB0aGUgSW5mbyBmaWxlLCAjNSB0aGUgbmFtZSBvZiB0aGUgcHJpbnRlZAotJSBtYW51YWwuICBBbGwgYnV0IHRoZSBub2RlIG5hbWUgY2FuIGJlIG9taXR0ZWQuCi0lCi1cZGVmXHB4cmVmIzF7XHB1dHdvcmRzZWV7fSBceHJlZlhbIzEsLCwsLCwsXX0KLVxkZWZceHJlZiMxe1xwdXR3b3JkU2Vle30gXHhyZWZYWyMxLCwsLCwsLF19Ci1cZGVmXHJlZiMxe1x4cmVmWFsjMSwsLCwsLCxdfQotXGRlZlx4cmVmWFsjMSwjMiwjMywjNCwjNSwjNl17XGJlZ2luZ3JvdXAKLSAgXGRlZlxwcmludGVkbWFudWFse1xpZ25vcmVzcGFjZXMgIzV9JQotICBcZGVmXHByaW50ZWRub2RlbmFtZXtcaWdub3Jlc3BhY2VzICMzfSUKLSAgXHNldGJveDE9XGhib3h7XHByaW50ZWRtYW51YWx9JQotICBcc2V0Ym94MD1caGJveHtccHJpbnRlZG5vZGVuYW1lfSUKLSAgXGlmZGltIFx3ZDAgPSAwcHQKLSAgICAlIE5vIHByaW50ZWQgbm9kZSBuYW1lIHdhcyBleHBsaWNpdGx5IGdpdmVuLgotICAgIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFNFVHhyZWYtYXV0b21hdGljLXNlY3Rpb24tdGl0bGVcZW5kY3NuYW1lXHJlbGF4Ci0gICAgICAlIFVzZSB0aGUgbm9kZSBuYW1lIGluc2lkZSB0aGUgc3F1YXJlIGJyYWNrZXRzLgotICAgICAgXGRlZlxwcmludGVkbm9kZW5hbWV7XGlnbm9yZXNwYWNlcyAjMX0lCi0gICAgXGVsc2UKLSAgICAgICUgVXNlIHRoZSBhY3R1YWwgY2hhcHRlci9zZWN0aW9uIHRpdGxlIGFwcGVhciBpbnNpZGUKLSAgICAgICUgdGhlIHNxdWFyZSBicmFja2V0cy4gIFVzZSB0aGUgcmVhbCBzZWN0aW9uIHRpdGxlIGlmIHdlIGhhdmUgaXQuCi0gICAgICBcaWZkaW0gXHdkMSA+IDBwdAotICAgICAgICAlIEl0IGlzIGluIGFub3RoZXIgbWFudWFsLCBzbyB3ZSBkb24ndCBoYXZlIGl0LgotICAgICAgICBcZGVmXHByaW50ZWRub2RlbmFtZXtcaWdub3Jlc3BhY2VzICMxfSUKLSAgICAgIFxlbHNlCi0gICAgICAgIFxpZmhhdmV4cmVmcwotICAgICAgICAgICUgV2Uga25vdyB0aGUgcmVhbCB0aXRsZSBpZiB3ZSBoYXZlIHRoZSB4cmVmIHZhbHVlcy4KLSAgICAgICAgICBcZGVmXHByaW50ZWRub2RlbmFtZXtccmVmeHsjMS10aXRsZX17fX0lCi0gICAgICAgIFxlbHNlCi0gICAgICAgICAgJSBPdGhlcndpc2UganVzdCBjb3B5IHRoZSBJbmZvIG5vZGUgbmFtZS4KLSAgICAgICAgICBcZGVmXHByaW50ZWRub2RlbmFtZXtcaWdub3Jlc3BhY2VzICMxfSUKLSAgICAgICAgXGZpJQotICAgICAgXGZpCi0gICAgXGZpCi0gIFxmaQotICAlCi0gICUgSWYgd2UgdXNlIFx1bmhib3gwIGFuZCBcdW5oYm94MSB0byBwcmludCB0aGUgbm9kZSBuYW1lcywgVGVYIGRvZXMgbm90Ci0gICUgaW5zZXJ0IGVtcHR5IGRpc2NyZXRpb25hcmllcyBhZnRlciBoeXBoZW5zLCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwKLSAgJSBub3QgZmluZCBhIGxpbmUgYnJlYWsgYXQgYSBoeXBoZW4gaW4gYSBub2RlIG5hbWVzLiAgU2luY2Ugc29tZSBtYW51YWxzCi0gICUgYXJlIGJlc3Qgd3JpdHRlbiB3aXRoIGZhaXJseSBsb25nIG5vZGUgbmFtZXMsIGNvbnRhaW5pbmcgaHlwaGVucywgdGhpcwotICAlIGlzIGEgbG9zcy4gIFRoZXJlZm9yZSwgd2UgZ2l2ZSB0aGUgdGV4dCBvZiB0aGUgbm9kZSBuYW1lIGFnYWluLCBzbyBpdAotICAlIGlzIGFzIGlmIFRlWCBpcyBzZWVpbmcgaXQgZm9yIHRoZSBmaXJzdCB0aW1lLgotICBcaWZkaW0gXHdkMSA+IDBwdAotICAgIFxwdXR3b3Jkc2VjdGlvbnt9IGBgXHByaW50ZWRub2RlbmFtZScnIGluIFxjaXRle1xwcmludGVkbWFudWFsfSUKLSAgXGVsc2UKLSAgICAlIF8gKGZvciBleGFtcGxlKSBoYXMgdG8gYmUgdGhlIGNoYXJhY3RlciBfIGZvciB0aGUgcHVycG9zZXMgb2YgdGhlCi0gICAgJSBjb250cm9sIHNlcXVlbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vZGUsIGJ1dCBpdCBoYXMgdG8gZXhwYW5kCi0gICAgJSBpbnRvIHRoZSB1c3VhbCBcbGVhdmV2bW9kZS4uLlx2cnVsZSBzdHVmZiBmb3IgcHVycG9zZXMgb2YKLSAgICAlIHByaW50aW5nLiBTbyB3ZSBcdHVybm9mZmFjdGl2ZSBmb3IgdGhlIFxyZWZ4LXNudCwgYmFjayBvbiBmb3IgdGhlCi0gICAgJSBwcmludGluZywgYmFjayBvZmYgZm9yIHRoZSBccmVmeC1wZy4KLSAgICB7XG5vcm1hbHR1cm5vZmZhY3RpdmUKLSAgICAgJSBPbmx5IG91dHB1dCBhIGZvbGxvd2luZyBzcGFjZSBpZiB0aGUgLXNudCByZWYgaXMgbm9uZW1wdHk7IGZvcgotICAgICAlIEB1bm51bWJlcmVkIGFuZCBAYW5jaG9yLCBpdCB3b24ndCBiZS4KLSAgICAgXHNldGJveDIgPSBcaGJveHtcaWdub3Jlc3BhY2VzIFxyZWZ4eyMxLXNudH17fX0lCi0gICAgIFxpZmRpbSBcd2QyID4gMHB0IFxyZWZ4eyMxLXNudH1cc3BhY2VcZmkKLSAgICB9JQotICAgICUgW215bm9kZV0sIAotICAgIFtccHJpbnRlZG5vZGVuYW1lXSxcc3BhY2UKLSAgICAlIHBhZ2UgMwotICAgIFx0dXJub2ZmYWN0aXZlIFxwdXR3b3JkcGFnZVx0aWVccmVmeHsjMS1wZ317fSUKLSAgXGZpCi1cZW5kZ3JvdXB9Ci0KLSUgXGRvc2V0cSBpcyB0aGUgaW50ZXJmYWNlIGZvciBjYWxscyBmcm9tIG90aGVyIG1hY3JvcwotCi0lIFVzZSBcbm9ybWFsdHVybm9mZmFjdGl2ZSBzbyB0aGF0IHB1bmN0dWF0aW9uIGNoYXJzIHN1Y2ggYXMgdW5kZXJzY29yZQotJSBhbmQgYmFja3NsYXNoIHdvcmsgaW4gbm9kZSBuYW1lcy4gIChcdHVybm9mZmFjdGl2ZSBkb2Vzbid0IGRvIFwuKQotXGRlZlxkb3NldHEjMSMyeyUKLSAge1xsZXRcZm9saW89MAotICAgXG5vcm1hbHR1cm5vZmZhY3RpdmUKLSAgIFxlZGVmXG5leHR7XHdyaXRlXGF1eGZpbGV7XGludGVybmFsc2V0cXsjMX17IzJ9fX0lCi0gICBcaWZsaW5rcwotICAgICBcbmV4dAotICAgXGZpCi0gIH0lCi19Ci0KLSUgXGludGVybmFsc2V0cSB7Zm9vfXtwYWdlfSBleHBhbmRzIGludG8KLSUgQ0hBUkFDVEVSUyAneHJkZWYge2Zvb317Li4uZXhwYW5zaW9uIG9mIFxZcGFnZS4uLn0KLSUgV2hlbiB0aGUgYXV4IGZpbGUgaXMgcmVhZCwgJyBpcyB0aGUgZXNjYXBlIGNoYXJhY3RlcgotCi1cZGVmXGludGVybmFsc2V0cSAjMSMyeyd4cmRlZiB7IzF9e1xjc25hbWUgIzJcZW5kY3NuYW1lfX0KLQotJSBUaGluZ3MgdG8gYmUgZXhwYW5kZWQgYnkgXGludGVybmFsc2V0cQotCi1cZGVmXFlwYWdlbnVtYmVye1xmb2xpb30KLQotXGRlZlxZdGl0bGV7XHRoaXNzZWN0aW9ufQotCi1cZGVmXFlub3RoaW5ne30KLQotXGRlZlxZc2VjdGlvbm51bWJlcmFuZHR5cGV7JQotXGlmbnVtXHNlY25vPTAgXHB1dHdvcmRDaGFwdGVyXHhyZWZ0aWVcdGhlXGNoYXBubyAlCi1cZWxzZSBcaWZudW0gXHN1YnNlY25vPTAgXHB1dHdvcmRTZWN0aW9uXHhyZWZ0aWVcdGhlXGNoYXBuby5cdGhlXHNlY25vICUKLVxlbHNlIFxpZm51bSBcc3Vic3Vic2Vjbm89MCAlCi1ccHV0d29yZFNlY3Rpb25ceHJlZnRpZVx0aGVcY2hhcG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNubyAlCi1cZWxzZSAlCi1ccHV0d29yZFNlY3Rpb25ceHJlZnRpZVx0aGVcY2hhcG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNuby5cdGhlXHN1YnN1YnNlY25vICUKLVxmaSBcZmkgXGZpIH0KLQotXGRlZlxZYXBwZW5kaXhsZXR0ZXJhbmR0eXBleyUKLVxpZm51bVxzZWNubz0wIFxwdXR3b3JkQXBwZW5kaXhceHJlZnRpZSdjaGFyXHRoZVxhcHBlbmRpeG5ve30lCi1cZWxzZSBcaWZudW0gXHN1YnNlY25vPTAgXHB1dHdvcmRTZWN0aW9uXHhyZWZ0aWUnY2hhclx0aGVcYXBwZW5kaXhuby5cdGhlXHNlY25vICUKLVxlbHNlIFxpZm51bSBcc3Vic3Vic2Vjbm89MCAlCi1ccHV0d29yZFNlY3Rpb25ceHJlZnRpZSdjaGFyXHRoZVxhcHBlbmRpeG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNubyAlCi1cZWxzZSAlCi1ccHV0d29yZFNlY3Rpb25ceHJlZnRpZSdjaGFyXHRoZVxhcHBlbmRpeG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNuby5cdGhlXHN1YnN1YnNlY25vICUKLVxmaSBcZmkgXGZpIH0KLQotXGdkZWZceHJlZnRpZXsndGllfQotCi0lIFVzZSBUZVggMy4wJ3MgXGlucHV0bGluZW5vIHRvIGdldCB0aGUgbGluZSBudW1iZXIsIGZvciBiZXR0ZXIgZXJyb3IKLSUgbWVzc2FnZXMsIGJ1dCBpZiB3ZSdyZSB1c2luZyBhbiBvbGQgdmVyc2lvbiBvZiBUZVgsIGRvbid0IGRvIGFueXRoaW5nLgotJQotXGlmeFxpbnB1dGxpbmVub1x0aGlzaXN1bmRlZmluZWQKLSAgXGxldFxsaW5lbnVtYmVyID0gXGVtcHR5ICUgTm9uLTMuMC4KLVxlbHNlCi0gIFxkZWZcbGluZW51bWJlcntcdGhlXGlucHV0bGluZW5vOlxzcGFjZX0KLVxmaQotCi0lIERlZmluZSBccmVmeHtOQU1FfXtTVUZGSVh9IHRvIHJlZmVyZW5jZSBhIGNyb3NzLXJlZmVyZW5jZSBzdHJpbmcgbmFtZWQgTkFNRS4KLSUgSWYgaXRzIHZhbHVlIGlzIG5vbmVtcHR5LCBTVUZGSVggaXMgb3V0cHV0IGFmdGVyd2FyZC4KLQotXGRlZlxyZWZ4IzEjMnslCi0gIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFgjMVxlbmRjc25hbWVccmVsYXgKLSAgICAlIElmIG5vdCBkZWZpbmVkLCBzYXkgc29tZXRoaW5nIGF0IGxlYXN0LgotICAgIFxhbmdsZWxlZnQgdW5cLWRlXC1maW5lZFxhbmdsZXJpZ2h0Ci0gICAgXGlmbGlua3MKLSAgICAgIFxpZmhhdmV4cmVmcwotICAgICAgICBcbWVzc2FnZXtcbGluZW51bWJlciBVbmRlZmluZWQgY3Jvc3MgcmVmZXJlbmNlIGAjMScufSUKLSAgICAgIFxlbHNlCi0gICAgICAgIFxpZndhcm5lZHhyZWZzXGVsc2UKLSAgICAgICAgICBcZ2xvYmFsXHdhcm5lZHhyZWZzdHJ1ZQotICAgICAgICAgIFxtZXNzYWdle0Nyb3NzIHJlZmVyZW5jZSB2YWx1ZXMgdW5rbm93bjsgeW91IG11c3QgcnVuIFRlWCBhZ2Fpbi59JQotICAgICAgICBcZmkKLSAgICAgIFxmaQotICAgIFxmaQotICBcZWxzZQotICAgICUgSXQncyBkZWZpbmVkLCBzbyBqdXN0IHVzZSBpdC4KLSAgICBcY3NuYW1lIFgjMVxlbmRjc25hbWUKLSAgXGZpCi0gICMyJSBPdXRwdXQgdGhlIHN1ZmZpeCBpbiBhbnkgY2FzZS4KLX0KLQotJSBUaGlzIGlzIHRoZSBtYWNybyBpbnZva2VkIGJ5IGVudHJpZXMgaW4gdGhlIGF1eCBmaWxlLgotJSAKLVxkZWZceHJkZWYjMXtcYmVnaW5ncm91cAotICAlIFJlZW5hYmxlIFwgYXMgYW4gZXNjYXBlIHdoaWxlIHJlYWRpbmcgdGhlIHNlY29uZCBhcmd1bWVudC4KLSAgXGNhdGNvZGVgXFwgPSAwCi0gIFxhZnRlcmFzc2lnbm1lbnRcZW5kZ3JvdXAKLSAgXGV4cGFuZGFmdGVyXGdkZWZcY3NuYW1lIFgjMVxlbmRjc25hbWUKLX0KLQotJSBSZWFkIHRoZSBsYXN0IGV4aXN0aW5nIGF1eCBmaWxlLCBpZiBhbnkuICBObyBlcnJvciBpZiBub25lIGV4aXN0cy4KLVxkZWZccmVhZGF1eGZpbGV7XGJlZ2luZ3JvdXAKLSAgXGNhdGNvZGVgXF5eQD1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eQT1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eQj1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eQz1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eRD1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eRT1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eRj1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eRz1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eSD1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eSz1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eTD1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eTj1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eUD1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eUT1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eUj1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eUz1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eVD1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eVT1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eVj1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eVz1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eWD1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eWj1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eWz1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eXD1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eXT1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eXj1cb3RoZXIKLSAgXGNhdGNvZGVgXF5eXz1cb3RoZXIKLSAgXGNhdGNvZGVgXEA9XG90aGVyCi0gIFxjYXRjb2RlYFxePVxvdGhlcgotICAlIEl0IHdhcyBzdWdnZXN0ZWQgdG8gZGVmaW5lIHRoaXMgYXMgNywgd2hpY2ggd291bGQgYWxsb3cgXl5lNCBldGMuCi0gICUgaW4geHJlZiB0YWdzLCBpLmUuLCBub2RlIG5hbWVzLiAgQnV0IHNpbmNlIF5eZTQgbm90YXRpb24gaXNuJ3QKLSAgJSBzdXBwb3J0ZWQgaW4gdGhlIG1haW4gdGV4dCwgaXQgZG9lc24ndCBzZWVtIGRlc2lyYWJsZS4gIEZ1cnRoZXJtb3JlLAotICAlIHRoYXQgaXMgbm90IGVub3VnaDogZm9yIG5vZGUgbmFtZXMgdGhhdCBhY3R1YWxseSBjb250YWluIGEgXgotICAlIGNoYXJhY3Rlciwgd2Ugd291bGQgZW5kIHVwIHdyaXRpbmcgYSBsaW5lIGxpa2UgdGhpczogJ3hyZGVmIHsnaGF0Ci0gICUgYi10aXRsZX17J2hhdCBifSBhbmQgXHhyZGVmIGRvZXMgYSBcY3NuYW1lLi4uXGVuZGNzbmFtZSBvbiB0aGUgZmlyc3QKLSAgJSBhcmd1bWVudCwgYW5kIFxoYXQgaXMgbm90IGFuIGV4cGFuZGFibGUgY29udHJvbCBzZXF1ZW5jZS4gIEl0IGNvdWxkCi0gICUgYWxsIGJlIHdvcmtlZCBvdXQsIGJ1dCB3aHk/ICBFaXRoZXIgd2Ugc3VwcG9ydCBeXiBvciB3ZSBkb24ndC4KLSAgJQotICAlIFRoZSBvdGhlciBjaGFuZ2UgbmVjZXNzYXJ5IGZvciB0aGlzIHdhcyB0byBkZWZpbmUgXGF1eGhhdDoKLSAgJSBcZGVmXGF1eGhhdHtcZGVmXnsnaGF0IH19JSBleHRyYSBzcGFjZSBzbyBvayBpZiBmb2xsb3dlZCBieSBsZXR0ZXIKLSAgJSBhbmQgdGhlbiB0byBjYWxsIFxhdXhoYXQgaW4gXHNldHEuCi0gICUKLSAgXGNhdGNvZGVgXH49XG90aGVyCi0gIFxjYXRjb2RlYFxbPVxvdGhlcgotICBcY2F0Y29kZWBcXT1cb3RoZXIKLSAgXGNhdGNvZGVgXCI9XG90aGVyCi0gIFxjYXRjb2RlYFxfPVxvdGhlcgotICBcY2F0Y29kZWBcfD1cb3RoZXIKLSAgXGNhdGNvZGVgXDw9XG90aGVyCi0gIFxjYXRjb2RlYFw+PVxvdGhlcgotICBcY2F0Y29kZWBcJD1cb3RoZXIKLSAgXGNhdGNvZGVgXCM9XG90aGVyCi0gIFxjYXRjb2RlYFwmPVxvdGhlcgotICBcY2F0Y29kZWArPVxvdGhlciAlIGF2b2lkIFwrIGZvciBwYXJhbm9pYSBldmVuIHRob3VnaCB3ZSd2ZSB0dXJuZWQgaXQgb2ZmCi0gICUgTWFrZSB0aGUgY2hhcmFjdGVycyAxMjgtMjU1IGJlIHByaW50aW5nIGNoYXJhY3RlcnMKLSAgeyUKLSAgICBcY291bnQgMT0xMjgKLSAgICBcZGVmXGxvb3B7JQotICAgICAgXGNhdGNvZGVcY291bnQgMT1cb3RoZXIKLSAgICAgIFxhZHZhbmNlXGNvdW50IDEgYnkgMQotICAgICAgXGlmbnVtIFxjb3VudCAxPDI1NiBcbG9vcCBcZmkKLSAgICB9JQotICB9JQotICAlIFRoZSBhdXggZmlsZSB1c2VzICcgYXMgdGhlIGVzY2FwZSAoZm9yIG5vdykuCi0gICUgVHVybiBvZmYgXCBhcyBhbiBlc2NhcGUgc28gd2UgZG8gbm90IGxvc2Ugb24KLSAgJSBlbnRyaWVzIHdoaWNoIHdlcmUgZHVtcGVkIHdpdGggY29udHJvbCBzZXF1ZW5jZXMgaW4gdGhlaXIgbmFtZXMuCi0gICUgRm9yIGV4YW1wbGUsICd4cmRlZiB7JFxsZXEgJC1mdW59e3BhZ2UgLi4ufSBtYWRlIGJ5IEBkZWZ1biBeXgotICAlIFJlZmVyZW5jZSB0byBzdWNoIGVudHJpZXMgc3RpbGwgZG9lcyBub3Qgd29yayB0aGUgd2F5IG9uZSB3b3VsZCB3aXNoLAotICAlIGJ1dCBhdCBsZWFzdCB0aGV5IGRvIG5vdCBib21iIG91dCB3aGVuIHRoZSBhdXggZmlsZSBpcyByZWFkIGluLgotICBcY2F0Y29kZWBcez0xCi0gIFxjYXRjb2RlYFx9PTIKLSAgXGNhdGNvZGVgXCU9XG90aGVyCi0gIFxjYXRjb2RlYFwnPTAKLSAgXGNhdGNvZGVgXFw9XG90aGVyCi0gICUKLSAgXG9wZW5pbiAxIFxqb2JuYW1lLmF1eAotICBcaWZlb2YgMSBcZWxzZQotICAgIFxjbG9zZWluIDEKLSAgICBcaW5wdXQgXGpvYm5hbWUuYXV4Ci0gICAgXGdsb2JhbFxoYXZleHJlZnN0cnVlCi0gICAgXGdsb2JhbFx3YXJuZWRvYnN0cnVlCi0gIFxmaQotICAlIE9wZW4gdGhlIG5ldyBhdXggZmlsZS4gIFRlWCB3aWxsIGNsb3NlIGl0IGF1dG9tYXRpY2FsbHkgYXQgZXhpdC4KLSAgXG9wZW5vdXRcYXV4ZmlsZT1cam9ibmFtZS5hdXgKLVxlbmRncm91cH0KLQotCi0lIEZvb3Rub3Rlcy4KLQotXG5ld2NvdW50IFxmb290bm90ZW5vCi0KLSUgVGhlIHRyYWlsaW5nIHNwYWNlIGluIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbiBmb3Igc3VwZXJlamVjdCBpcwotJSB2aXRhbCBmb3IgcHJvcGVyIGZpbGxpbmc7IHBhZ2VzIGNvbWUgb3V0IHVuYWxpZ25lZCB3aGVuIHlvdSBkbyBhCi0lIHBhZ2VhbGlnbm1hY3JvIGNhbGwgaWYgdGhhdCBzcGFjZSBiZWZvcmUgdGhlIGNsb3NpbmcgYnJhY2UgaXMKLSUgcmVtb3ZlZC4gKEdlbmVyYWxseSwgbnVtZXJpYyBjb25zdGFudHMgc2hvdWxkIGFsd2F5cyBiZSBmb2xsb3dlZCBieSBhCi0lIHNwYWNlIHRvIHByZXZlbnQgc3RyYW5nZSBleHBhbnNpb24gZXJyb3JzLikKLVxkZWZcc3VwZXJlamVjdHtccGFyXHBlbmFsdHkgLTIwMDAwXGZvb3Rub3Rlbm8gPTAgfQotCi0lIEBmb290bm90ZXN0eWxlIGlzIG1lYW5pbmdmdWwgZm9yIGluZm8gb3V0cHV0IG9ubHkuCi1cbGV0XGZvb3Rub3Rlc3R5bGU9XGNvbW1lbnQKLQotXGxldFxwdGV4Zm9vdG5vdGU9XGZvb3Rub3RlCi0KLXtcY2F0Y29kZSBgXEA9MTEKLSUKLSUgQXV0by1udW1iZXIgZm9vdG5vdGVzLiAgT3RoZXJ3aXNlIGxpa2UgcGxhaW4uCi1cZ2RlZlxmb290bm90ZXslCi0gIFxnbG9iYWxcYWR2YW5jZVxmb290bm90ZW5vIGJ5IFxAbmUKLSAgXGVkZWZcdGhpc2Zvb3Rub3skXntcdGhlXGZvb3Rub3Rlbm99JH0lCi0gICUKLSAgJSBJbiBjYXNlIHRoZSBmb290bm90ZSBjb21lcyBhdCB0aGUgZW5kIG9mIGEgc2VudGVuY2UsIHByZXNlcnZlIHRoZQotICAlIGV4dHJhIHNwYWNpbmcgYWZ0ZXIgd2UgZG8gdGhlIGZvb3Rub3RlIG51bWJlci4KLSAgXGxldFxAc2ZcZW1wdHkKLSAgXGlmaG1vZGVcZWRlZlxAc2Z7XHNwYWNlZmFjdG9yXHRoZVxzcGFjZWZhY3Rvcn1cL1xmaQotICAlCi0gICUgUmVtb3ZlIGluYWR2ZXJ0ZW50IGJsYW5rIHNwYWNlIGJlZm9yZSB0eXBlc2V0dGluZyB0aGUgZm9vdG5vdGUgbnVtYmVyLgotICBcdW5za2lwCi0gIFx0aGlzZm9vdG5vXEBzZgotICBcZm9vdG5vdGV6enoKLX0lCi0KLSUgRG9uJ3QgYm90aGVyIHdpdGggdGhlIHRyaWNrZXJ5IGluIHBsYWluLnRleCB0byBub3QgcmVxdWlyZSB0aGUKLSUgZm9vdG5vdGUgdGV4dCBhcyBhIHBhcmFtZXRlci4gIE91ciBmb290bm90ZXMgZG9uJ3QgbmVlZCB0byBiZSBzbyBnZW5lcmFsLgotJQotJSBPaCB5ZXMsIHRoZXkgZG87IG90aGVyd2lzZSwgQGlmc2V0IGFuZCBhbnl0aGluZyBlbHNlIHRoYXQgdXNlcwotJSBccGFyc2VhcmdsaW5lIGZhaWwgaW5zaWRlIGZvb3Rub3RlcyBiZWNhdXNlIHRoZSB0b2tlbnMgYXJlIGZpeGVkIHdoZW4KLSUgdGhlIGZvb3Rub3RlIGlzIHJlYWQuICAtLWthcmwsIDE2bm92OTYuCi0lCi1cbG9uZ1xnZGVmXGZvb3Rub3Rlenp6e1xpbnNlcnRcZm9vdGluc1xiZ3JvdXAKLSAgJSBXZSB3YW50IHRvIHR5cGVzZXQgdGhpcyB0ZXh0IGFzIGEgbm9ybWFsIHBhcmFncmFwaCwgZXZlbiBpZiB0aGUKLSAgJSBmb290bm90ZSByZWZlcmVuY2Ugb2NjdXJzIGluIChmb3IgZXhhbXBsZSkgYSBkaXNwbGF5IGVudmlyb25tZW50LgotICAlIFNvIHJlc2V0IHNvbWUgcGFyYW1ldGVycy4KLSAgXGludGVybGluZXBlbmFsdHlcaW50ZXJmb290bm90ZWxpbmVwZW5hbHR5Ci0gIFxzcGxpdHRvcHNraXBcaHRcc3RydXRib3ggJSB0b3AgYmFzZWxpbmUgZm9yIGJyb2tlbiBmb290bm90ZXMKLSAgXHNwbGl0bWF4ZGVwdGhcZHBcc3RydXRib3gKLSAgXGZsb2F0aW5ncGVuYWx0eVxATU0KLSAgXGxlZnRza2lwXHpAc2tpcAotICBccmlnaHRza2lwXHpAc2tpcAotICBcc3BhY2Vza2lwXHpAc2tpcAotICBceHNwYWNlc2tpcFx6QHNraXAKLSAgXHBhcmluZGVudFxkZWZhdWx0cGFyaW5kZW50Ci0gICUKLSAgJSBIYW5nIHRoZSBmb290bm90ZSB0ZXh0IG9mZiB0aGUgbnVtYmVyLgotICBcaGFuZwotICBcdGV4dGluZGVudHtcdGhpc2Zvb3Rub30lCi0gICUKLSAgJSBEb24ndCBjcmFzaCBpbnRvIHRoZSBsaW5lIGFib3ZlIHRoZSBmb290bm90ZSB0ZXh0LiAgU2luY2UgdGhpcwotICAlIGV4cGFuZHMgaW50byBhIGJveCwgaXQgbXVzdCBjb21lIHdpdGhpbiB0aGUgcGFyYWdyYXBoLCBsZXN0IGl0Ci0gICUgcHJvdmlkZSBhIHBsYWNlIHdoZXJlIFRlWCBjYW4gc3BsaXQgdGhlIGZvb3Rub3RlLgotICBcZm9vdHN0cnV0Ci0gIFxmdXR1cmVsZXRcbmV4dFxmb0B0Ci19Ci1cZGVmXGZvQHR7XGlmY2F0XGJncm91cFxub2V4cGFuZFxuZXh0IFxsZXRcbmV4dFxmQEB0Ci0gIFxlbHNlXGxldFxuZXh0XGZAdFxmaSBcbmV4dH0KLVxkZWZcZkBAdHtcYmdyb3VwXGFmdGVyZ3JvdXBcQGZvb3RcbGV0XG5leHR9Ci1cZGVmXGZAdCMxeyMxXEBmb290fQotXGRlZlxAZm9vdHtcc3RydXRcZWdyb3VwfQotCi19JWVuZCBcY2F0Y29kZSBgXEA9MTEKLQotJSBTZXQgdGhlIGJhc2VsaW5lc2tpcCB0byAjMSwgYW5kIHRoZSBsaW5lc2tpcCBhbmQgc3RydXQgc2l6ZQotJSBjb3JyZXNwb25kaW5nbHkuICBUaGVyZSBpcyBubyBkZWVwIG1lYW5pbmcgYmVoaW5kIHRoZXNlIG1hZ2ljIG51bWJlcnMKLSUgdXNlZCBhcyBmYWN0b3JzOyB0aGV5IGp1c3QgbWF0Y2ggKGNsb3NlbHkgZW5vdWdoKSB3aGF0IEtudXRoIGRlZmluZWQuCi0lCi1cZGVmXGxpbmVza2lwZmFjdG9yey4wODMzM30KLVxkZWZcc3RydXRoZWlnaHRwZXJjZW50ey43MDgzM30KLVxkZWZcc3RydXRkZXB0aHBlcmNlbnQgey4yOTE2N30KLSUKLVxkZWZcc2V0bGVhZGluZyMxeyUKLSAgXG5vcm1hbGJhc2VsaW5lc2tpcCA9ICMxXHJlbGF4Ci0gIFxub3JtYWxsaW5lc2tpcCA9IFxsaW5lc2tpcGZhY3Rvclxub3JtYWxiYXNlbGluZXNraXAKLSAgXG5vcm1hbGJhc2VsaW5lcwotICBcc2V0Ym94XHN0cnV0Ym94ID1caGJveHslCi0gICAgXHZydWxlIHdpZHRoMHB0IGhlaWdodFxzdHJ1dGhlaWdodHBlcmNlbnRcYmFzZWxpbmVza2lwCi0gICAgICAgICAgICAgICAgICAgIGRlcHRoIFxzdHJ1dGRlcHRocGVyY2VudCBcYmFzZWxpbmVza2lwCi0gIH0lCi19Ci0KLSUgQHwgaW5zZXJ0cyBhIGNoYW5nZWJhciB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBsaW5lLiAgSXQgc2hvdWxkCi0lIHN1cnJvdW5kIGFueSBjaGFuZ2VkIHRleHQuICBUaGlzIGFwcHJvYWNoIGRvZXMgKm5vdCogd29yayBpZiB0aGUKLSUgY2hhbmdlIHNwYW5zIG1vcmUgdGhhbiB0d28gbGluZXMgb2Ygb3V0cHV0LiAgVG8gaGFuZGxlIHRoYXQsIHdlIHdvdWxkCi0lIGhhdmUgYWRvcHQgYSBtdWNoIG1vcmUgZGlmZmljdWx0IGFwcHJvYWNoIChwdXR0aW5nIG1hcmtzIGludG8gdGhlIG1haW4KLSUgdmVydGljYWwgbGlzdCBmb3IgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGVhY2ggY2hhbmdlKS4KLSUKLVxkZWZcfHslCi0gICUgXHZhZGp1c3QgY2FuIG9ubHkgYmUgdXNlZCBpbiBob3Jpem9udGFsIG1vZGUuCi0gIFxsZWF2ZXZtb2RlCi0gICUKLSAgJSBBcHBlbmQgdGhpcyB2ZXJ0aWNhbCBtb2RlIG1hdGVyaWFsIGFmdGVyIHRoZSBjdXJyZW50IGxpbmUgaW4gdGhlIG91dHB1dC4KLSAgXHZhZGp1c3R7JQotICAgICUgV2Ugd2FudCB0byBpbnNlcnQgYSBydWxlIHdpdGggdGhlIGhlaWdodCBhbmQgZGVwdGggb2YgdGhlIGN1cnJlbnQKLSAgICAlIGxlYWRpbmc7IHRoYXQgaXMgZXhhY3RseSB3aGF0IFxzdHJ1dGJveCBpcyBzdXBwb3NlZCB0byByZWNvcmQuCi0gICAgXHZza2lwLVxiYXNlbGluZXNraXAKLSAgICAlCi0gICAgJSBcdmFkanVzdC1pdGVtcyBhcmUgaW5zZXJ0ZWQgYXQgdGhlIGxlZnQgZWRnZSBvZiB0aGUgdHlwZS4gIFNvCi0gICAgJSB0aGUgXGxsYXAgaGVyZSBtb3ZlcyBvdXQgaW50byB0aGUgbGVmdC1oYW5kIG1hcmdpbi4KLSAgICBcbGxhcHslCi0gICAgICAlCi0gICAgICAlIEZvciBhIHRoaWNrZXIgb3IgdGhpbm5lciBiYXIsIGNoYW5nZSB0aGUgYDFwdCcuCi0gICAgICBcdnJ1bGUgaGVpZ2h0XGJhc2VsaW5lc2tpcCB3aWR0aDFwdAotICAgICAgJQotICAgICAgJSBUaGlzIGlzIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBiYXIgYW5kIHRoZSB0ZXh0LgotICAgICAgXGhza2lwIDEycHQKLSAgICB9JQotICB9JQotfQotCi0lIEZvciBhIGZpbmFsIGNvcHksIHRha2Ugb3V0IHRoZSByZWN0YW5nbGVzCi0lIHRoYXQgbWFyayBvdmVyZnVsbCBib3hlcyAoaW4gY2FzZSB5b3UgaGF2ZSBkZWNpZGVkCi0lIHRoYXQgdGhlIHRleHQgbG9va3Mgb2sgZXZlbiB0aG91Z2ggaXQgcGFzc2VzIHRoZSBtYXJnaW4pLgotJQotXGRlZlxmaW5hbG91dHtcb3ZlcmZ1bGxydWxlPTBwdH0KLQotJSBAaW1hZ2UuICBXZSB1c2UgdGhlIG1hY3JvcyBmcm9tIGVwc2YudGV4IHRvIHN1cHBvcnQgdGhpcy4KLSUgSWYgZXBzZi50ZXggaXMgbm90IGluc3RhbGxlZCBhbmQgQGltYWdlIGlzIHVzZWQsIHdlIGNvbXBsYWluLgotJSAKLSUgQ2hlY2sgZm9yIGFuZCByZWFkIGVwc2YudGV4IHVwIGZyb250LiAgSWYgd2UgcmVhZCBpdCBvbmx5IGF0IEBpbWFnZQotJSB0aW1lLCB3ZSBtaWdodCBiZSBpbnNpZGUgYSBncm91cCwgYW5kIHRoZW4gaXRzIGRlZmluaXRpb25zIHdvdWxkIGdldAotJSB1bmRvbmUgYW5kIHRoZSBuZXh0IGltYWdlIHdvdWxkIGZhaWwuCi1cb3BlbmluIDEgPSBlcHNmLnRleAotXGlmZW9mIDEgXGVsc2UKLSAgXGNsb3NlaW4gMQotICAlIERvIG5vdCBib3RoZXIgc2hvd2luZyBiYW5uZXIgd2l0aCBwb3N0LXYyLjcgZXBzZi50ZXggKGF2YWlsYWJsZSBpbgotICAlIGRvYy9lcHNmLnRleCB1bnRpbCBpdCBzaG93cyB1cCBvbiBjdGFuKS4KLSAgXGRlZlxlcHNmYW5ub3VuY2V7XHRva3MwID0gfSUKLSAgXGlucHV0IGVwc2YudGV4Ci1cZmkKLSUKLVxuZXdpZlxpZndhcm5lZG5vZXBzZgotXG5ld2hlbHBcbm9lcHNmaGVscHtlcHNmLnRleCBtdXN0IGJlIGluc3RhbGxlZCBmb3IgaW1hZ2VzIHRvCi0gIHdvcmsuICBJdCBpcyBhbHNvIGluY2x1ZGVkIGluIHRoZSBUZXhpbmZvIGRpc3RyaWJ1dGlvbiwgb3IgeW91IGNhbiBnZXQKLSAgaXQgZnJvbSBmdHA6Ly9mdHAudHVnLm9yZy90ZXgvZXBzZi50ZXgufQotJQotJSBPbmx5IGNvbXBsYWluIG9uY2UgYWJvdXQgbGFjayBvZiBlcHNmLnRleC4KLVxkZWZcaW1hZ2UjMXslCi0gIFxpZnhcZXBzZmJveFx1bmRlZmluZWQKLSAgICBcaWZ3YXJuZWRub2Vwc2YgXGVsc2UKLSAgICAgIFxlcnJoZWxwID0gXG5vZXBzZmhlbHAKLSAgICAgIFxlcnJtZXNzYWdle2Vwc2YudGV4IG5vdCBmb3VuZCwgaW1hZ2VzIHdpbGwgYmUgaWdub3JlZH0lCi0gICAgICBcZ2xvYmFsXHdhcm5lZG5vZXBzZnRydWUKLSAgICBcZmkKLSAgXGVsc2UKLSAgICBcaW1hZ2V4eHggIzEsLCxcZmluaXNoCi0gIFxmaQotfQotJQotJSBBcmd1bWVudHMgdG8gQGltYWdlOgotJSAjMSBpcyAobWFuZGF0b3J5KSBpbWFnZSBmaWxlbmFtZTsgd2UgdGFjayBvbiAuZXBzIGV4dGVuc2lvbi4KLSUgIzIgaXMgKG9wdGlvbmFsKSB3aWR0aCwgIzMgaXMgKG9wdGlvbmFsKSBoZWlnaHQuCi0lICM0IGlzIGp1c3QgdGhlIHVzdWFsIGV4dHJhIGlnbm9yZWQgYXJnIGZvciBwYXJzaW5nIHRoaXMgc3R1ZmYuCi1cZGVmXGltYWdleHh4IzEsIzIsIzMsIzRcZmluaXNoeyUKLSAgJSBcZXBzZmJveCBpdHNlbGYgcmVzZXRzIFxlcHNmP3NpemUgYXQgZWFjaCBmaWd1cmUuCi0gIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjMn1caWZkaW1cd2QwID4gMHB0IFxlcHNmeHNpemU9IzJccmVsYXggXGZpCi0gIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjM31caWZkaW1cd2QwID4gMHB0IFxlcHNmeXNpemU9IzNccmVsYXggXGZpCi0gICUgSWYgdGhlIGltYWdlIGlzIGJ5IGl0c2VsZiwgY2VudGVyIGl0LgotICBcaWZ2bW9kZQotICAgIFxub2JyZWFrXG1lZHNraXAKLSAgICBcbm9icmVhawotICAgIFxjZW50ZXJsaW5le1xlcHNmYm94eyMxLmVwc319JQotICAgIFxiaWdicmVhawotICBcZWxzZQotICAgIFxlcHNmYm94eyMxLmVwc30lCi0gIFxmaQotfQotCi0KLVxtZXNzYWdle3BhcGVyIHNpemVzLH0KLSUgQW5kIG90aGVyIHJlbGF0ZWQgcGFyYW1ldGVycy4KLQotXG5ld2RpbWVuXGRlZmF1bHRwYXJpbmRlbnQgXGRlZmF1bHRwYXJpbmRlbnQgPSAxNXB0Ci0KLVxjaGFwaGVhZGluZ3NraXAgPSAxNXB0IHBsdXMgNHB0IG1pbnVzIDJwdAotXHNlY2hlYWRpbmdza2lwID0gMTJwdCBwbHVzIDNwdCBtaW51cyAycHQKLVxzdWJzZWNoZWFkaW5nc2tpcCA9IDlwdCBwbHVzIDJwdCBtaW51cyAycHQKLQotJSBQcmV2ZW50IHVuZGVyZnVsbCB2Ym94IGVycm9yIG1lc3NhZ2VzLgotXHZiYWRuZXNzID0gMTAwMDAKLQotJSBEb24ndCBiZSBzbyBmaW5pY2t5IGFib3V0IHVuZGVyZnVsbCBoYm94ZXMsIGVpdGhlci4KLVxoYmFkbmVzcyA9IDIwMDAKLQotJSBGb2xsb3dpbmcgR2VvcmdlIEJ1c2gsIGp1c3QgZ2V0IHJpZCBvZiB3aWRvd3MgYW5kIG9ycGhhbnMuCi1cd2lkb3dwZW5hbHR5PTEwMDAwCi1cY2x1YnBlbmFsdHk9MTAwMDAKLQotJSBVc2UgVGVYIDMuMCdzIFxlbWVyZ2VuY3lzdHJldGNoIHRvIGhlbHAgbGluZSBicmVha2luZywgYnV0IGlmIHdlJ3JlCi0lIHVzaW5nIGFuIG9sZCB2ZXJzaW9uIG9mIFRlWCwgZG9uJ3QgZG8gYW55dGhpbmcuICBXZSB3YW50IHRoZSBhbW91bnQgb2YKLSUgc3RyZXRjaCBhZGRlZCB0byBkZXBlbmQgb24gdGhlIGxpbmUgbGVuZ3RoLCBoZW5jZSB0aGUgZGVwZW5kZW5jZSBvbgotJSBcaHNpemUuICBUaGlzIG1ha2VzIGl0IGNvbWUgdG8gYWJvdXQgOXB0IGZvciB0aGUgOC41eDExIGZvcm1hdC4gIFdlCi0lIGNhbGwgdGhpcyB3aGVuZXZlciB0aGUgcGFwZXIgc2l6ZSBpcyBzZXQuCi0lCi1cZGVmXHNldGVtZXJnZW5jeXN0cmV0Y2h7JQotICBcaWZ4XGVtZXJnZW5jeXN0cmV0Y2hcdGhpc2lzdW5kZWZpbmVkCi0gICAgJSBBbGxvdyB1cyB0byBhc3NpZ24gdG8gXGVtZXJnZW5jeXN0cmV0Y2ggYW55d2F5LgotICAgIFxkZWZcZW1lcmdlbmN5c3RyZXRjaHtcZGltZW4wfSUKLSAgXGVsc2UKLSAgICBcZW1lcmdlbmN5c3RyZXRjaCA9IFxoc2l6ZQotICAgIFxkaXZpZGVcZW1lcmdlbmN5c3RyZXRjaCBieSA0NQotICBcZmkKLX0KLQotJSBQYXJhbWV0ZXJzIGluIG9yZGVyOiAxKSB0ZXh0aGVpZ2h0OyAyKSB0ZXh0d2lkdGg7IDMpIHZvZmZzZXQ7Ci0lIDQpIGhvZmZzZXQ7IDUpIGJpbmRpbmcgb2Zmc2V0OyA2KSB0b3Bza2lwLiAgVGhlbiB3aG9ldmVyIGNhbGxzIHVzIGNhbgotJSBzZXQgXHBhcnNraXAgYW5kIGNhbGwgXHNldGxlYWRpbmcgZm9yIFxiYXNlbGluZXNraXAuCi0lCi1cZGVmXGludGVybmFscGFnZXNpemVzIzEjMiMzIzQjNSM2eyUKLSAgXHZvZmZzZXQgPSAjM1xyZWxheAotICBcdG9wc2tpcCA9ICM2XHJlbGF4Ci0gIFxzcGxpdHRvcHNraXAgPSBcdG9wc2tpcAotICAlCi0gIFx2c2l6ZSA9ICMxXHJlbGF4Ci0gIFxhZHZhbmNlXHZzaXplIGJ5IFx0b3Bza2lwCi0gIFxvdXRlcnZzaXplID0gXHZzaXplCi0gIFxhZHZhbmNlXG91dGVydnNpemUgYnkgMC42aW4KLSAgXHBhZ2VoZWlnaHQgPSBcdnNpemUKLSAgJQotICBcaHNpemUgPSAjMlxyZWxheAotICBcb3V0ZXJoc2l6ZSA9IFxoc2l6ZQotICBcYWR2YW5jZVxvdXRlcmhzaXplIGJ5IDAuNWluCi0gIFxwYWdld2lkdGggPSBcaHNpemUKLSAgJQotICBcbm9ybWFsb2Zmc2V0ID0gIzRccmVsYXgKLSAgXGJpbmRpbmdvZmZzZXQgPSAjNVxyZWxheAotICAlCi0gIFxwYXJpbmRlbnQgPSBcZGVmYXVsdHBhcmluZGVudAotICBcc2V0ZW1lcmdlbmN5c3RyZXRjaAotfQotCi0lIEBsZXR0ZXJwYXBlciAodGhlIGRlZmF1bHQpLgotXGRlZlxsZXR0ZXJwYXBlcnt7XGdsb2JhbGRlZnMgPSAxCi0gIFxwYXJza2lwID0gM3B0IHBsdXMgMnB0IG1pbnVzIDFwdAotICBcc2V0bGVhZGluZ3sxMy4ycHR9JQotICAlCi0gICUgSWYgcGFnZSBpcyBub3RoaW5nIGJ1dCB0ZXh0LCBtYWtlIGl0IGNvbWUgb3V0IGV2ZW4uCi0gIFxpbnRlcm5hbHBhZ2VzaXplc3s0NlxiYXNlbGluZXNraXB9ezZpbn17XHZvZmZzZXR9ey4yNWlufXtcYmluZGluZ29mZnNldH17MzZwdH0lCi19fQotCi0lIFVzZSBAc21hbGxib29rIHRvIHJlc2V0IHBhcmFtZXRlcnMgZm9yIDd4OS41IChvciBzbykgZm9ybWF0LgotXGRlZlxzbWFsbGJvb2t7e1xnbG9iYWxkZWZzID0gMQotICBccGFyc2tpcCA9IDJwdCBwbHVzIDFwdAotICBcc2V0bGVhZGluZ3sxMnB0fSUKLSAgJQotICBcaW50ZXJuYWxwYWdlc2l6ZXN7Ny41aW59ezUuaW59e1x2b2Zmc2V0fXsuMjVpbn17XGJpbmRpbmdvZmZzZXR9ezE2cHR9JQotICAlCi0gIFxsaXNwbmFycm93aW5nID0gMC4zaW4KLSAgXHRvbGVyYW5jZSA9IDcwMAotICBcaGZ1enogPSAxcHQKLSAgXGNvbnRlbnRzcmlnaHRtYXJnaW4gPSAwcHQKLSAgXGRlZnR5cGVtYXJnaW4gPSAwcHQKLSAgXGRlZmJvZHlpbmRlbnQgPSAuNWNtCi0gICUKLSAgXGxldFxzbWFsbGRpc3BsYXkgPSBcc21hbGxkaXNwbGF5eAotICBcbGV0XHNtYWxsZXhhbXBsZSA9IFxzbWFsbGxpc3B4Ci0gIFxsZXRcc21hbGxmb3JtYXQgPSBcc21hbGxmb3JtYXR4Ci0gIFxsZXRcc21hbGxsaXNwID0gXHNtYWxsbGlzcHgKLX19Ci0KLSUgVXNlIEBhZm91cnBhcGVyIHRvIHByaW50IG9uIEV1cm9wZWFuIEE0IHBhcGVyLgotXGRlZlxhZm91cnBhcGVye3tcZ2xvYmFsZGVmcyA9IDEKLSAgXHNldGxlYWRpbmd7MTJwdH0lCi0gIFxwYXJza2lwID0gM3B0IHBsdXMgMnB0IG1pbnVzIDFwdAotICAlCi0gIFxpbnRlcm5hbHBhZ2VzaXplc3s1M1xiYXNlbGluZXNraXB9ezE2MG1tfXtcdm9mZnNldH17NG1tfXtcYmluZGluZ29mZnNldH17NDRwdH0lCi0gICUKLSAgXHRvbGVyYW5jZSA9IDcwMAotICBcaGZ1enogPSAxcHQKLX19Ci0KLSUgQSBzcGVjaWZpYyB0ZXh0IGxheW91dCwgMjR4MTVjbSBvdmVyYWxsLCBpbnRlbmRlZCBmb3IgQTQgcGFwZXIuICBUb3AgbWFyZ2luCi0lIDI5bW0sIGhlbmNlIGJvdHRvbSBtYXJnaW4gMjhtbSwgbm9taW5hbCBzaWRlIG1hcmdpbiAzY20uCi1cZGVmXGFmb3VybGF0ZXh7e1xnbG9iYWxkZWZzID0gMQotICBcc2V0bGVhZGluZ3sxMy42cHR9JQotICAlCi0gIFxhZm91cnBhcGVyCi0gIFxpbnRlcm5hbHBhZ2VzaXplc3syMzdtbX17MTUwbW19ezMuNm1tfXszLjZtbX17M21tfXs3bW19JQotICAlCi0gIFxnbG9iYWxkZWZzID0gMAotfX0KLQotJSBVc2UgQGFmb3Vyd2lkZSB0byBwcmludCBvbiBFdXJvcGVhbiBBNCBwYXBlciBpbiB3aWRlIGZvcm1hdC4KLVxkZWZcYWZvdXJ3aWRleyUKLSAgXGFmb3VycGFwZXIKLSAgXGludGVybmFscGFnZXNpemVzezkuNWlufXs2LjVpbn17XGhvZmZzZXR9e1xub3JtYWxvZmZzZXR9e1xiaW5kaW5nb2Zmc2V0fXs3bW19JQotICAlCi0gIFxnbG9iYWxkZWZzID0gMAotfQotCi0lIEBwYWdlc2l6ZXMgVEVYVEhFSUdIVFssVEVYVFdJRFRIXQotJSBQZXJoYXBzIHdlIHNob3VsZCBhbGxvdyBzZXR0aW5nIHRoZSBtYXJnaW5zLCBcdG9wc2tpcCwgXHBhcnNraXAsCi0lIGFuZC9vciBsZWFkaW5nLCBhbHNvLiBPciBwZXJoYXBzIHdlIHNob3VsZCBjb21wdXRlIHRoZW0gc29tZWhvdy4KLSUgCi1cZGVmXHBhZ2VzaXplc3tccGFyc2VhcmdccGFnZXNpemVzeHh4fQotXGRlZlxwYWdlc2l6ZXN4eHgjMXtccGFnZXNpemVzeXl5ICMxLCxcZmluaXNofQotXGRlZlxwYWdlc2l6ZXN5eXkjMSwjMiwjM1xmaW5pc2h7eyUKLSAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfVxpZmRpbVx3ZDAgPiAwcHQgXGhzaXplPSMyXHJlbGF4IFxmaQotICBcZ2xvYmFsZGVmcyA9IDEKLSAgJQotICBccGFyc2tpcCA9IDNwdCBwbHVzIDJwdCBtaW51cyAxcHQKLSAgXHNldGxlYWRpbmd7MTMuMnB0fSUKLSAgJQotICBcaW50ZXJuYWxwYWdlc2l6ZXN7IzF9e1xoc2l6ZX17XHZvZmZzZXR9e1xub3JtYWxvZmZzZXR9e1xiaW5kaW5nb2Zmc2V0fXs0NHB0fSUKLX19Ci0KLSUgU2V0IGRlZmF1bHQgdG8gbGV0dGVyLgotJSAKLVxsZXR0ZXJwYXBlcgotCi1cbWVzc2FnZXthbmQgdHVybmluZyBvbiB0ZXhpbmZvIGlucHV0IGZvcm1hdC59Ci0KLSUgRGVmaW5lIG1hY3JvcyB0byBvdXRwdXQgdmFyaW91cyBjaGFyYWN0ZXJzIHdpdGggY2F0Y29kZSBmb3Igbm9ybWFsIHRleHQuCi1cY2F0Y29kZWBcIj1cb3RoZXIKLVxjYXRjb2RlYFx+PVxvdGhlcgotXGNhdGNvZGVgXF49XG90aGVyCi1cY2F0Y29kZWBcXz1cb3RoZXIKLVxjYXRjb2RlYFx8PVxvdGhlcgotXGNhdGNvZGVgXDw9XG90aGVyCi1cY2F0Y29kZWBcPj1cb3RoZXIKLVxjYXRjb2RlYFwrPVxvdGhlcgotXGRlZlxub3JtYWxkb3VibGVxdW90ZXsifQotXGRlZlxub3JtYWx0aWxkZXt+fQotXGRlZlxub3JtYWxjYXJldHtefQotXGRlZlxub3JtYWx1bmRlcnNjb3Jle199Ci1cZGVmXG5vcm1hbHZlcnRpY2FsYmFye3x9Ci1cZGVmXG5vcm1hbGxlc3N7PH0KLVxkZWZcbm9ybWFsZ3JlYXRlcns+fQotXGRlZlxub3JtYWxwbHVzeyt9Ci0KLSUgVGhpcyBtYWNybyBpcyB1c2VkIHRvIG1ha2UgYSBjaGFyYWN0ZXIgcHJpbnQgb25lIHdheSBpbiB0dGZvbnQKLSUgd2hlcmUgaXQgY2FuIHByb2JhYmx5IGp1c3QgYmUgb3V0cHV0LCBhbmQgYW5vdGhlciB3YXkgaW4gb3RoZXIgZm9udHMsCi0lIHdoZXJlIHNvbWV0aGluZyBoYWlyaWVyIHByb2JhYmx5IG5lZWRzIHRvIGJlIGRvbmUuCi0lCi0lICMxIGlzIHdoYXQgdG8gcHJpbnQgaWYgd2UgYXJlIGluZGVlZCB1c2luZyBcdHQ7ICMyIGlzIHdoYXQgdG8gcHJpbnQKLSUgb3RoZXJ3aXNlLiAgU2luY2UgYWxsIHRoZSBDb21wdXRlciBNb2Rlcm4gdHlwZXdyaXRlciBmb250cyBoYXZlIHplcm8KLSUgaW50ZXJ3b3JkIHN0cmV0Y2ggKGFuZCBzaHJpbmspLCBhbmQgaXQgaXMgcmVhc29uYWJsZSB0byBleHBlY3QgYWxsCi0lIHR5cGV3cml0ZXIgZm9udHMgdG8gaGF2ZSB0aGlzLCB3ZSBjYW4gY2hlY2sgdGhhdCBmb250IHBhcmFtZXRlci4KLSUKLVxkZWZcaWZ1c2luZ3R0IzEjMntcaWZkaW0gXGZvbnRkaW1lbjNcdGhlXGZvbnQ9MHB0ICMxXGVsc2UgIzJcZml9Ci0KLSUgVHVybiBvZmYgYWxsIHNwZWNpYWwgY2hhcmFjdGVycyBleGNlcHQgQAotJSAoYW5kIHRob3NlIHdoaWNoIHRoZSB1c2VyIGNhbiB1c2UgYXMgaWYgdGhleSB3ZXJlIG9yZGluYXJ5KS4KLSUgTW9zdCBvZiB0aGVzZSB3ZSBzaW1wbHkgcHJpbnQgZnJvbSB0aGUgXHR0IGZvbnQsIGJ1dCBmb3Igc29tZSwgd2UgY2FuCi0lIHVzZSBtYXRoIG9yIG90aGVyIHZhcmlhbnRzIHRoYXQgbG9vayBiZXR0ZXIgaW4gbm9ybWFsIHRleHQuCi0KLVxjYXRjb2RlYFwiPVxhY3RpdmUKLVxkZWZcYWN0aXZlZG91YmxlcXVvdGV7e1x0dFxjaGFyMzR9fQotXGxldCI9XGFjdGl2ZWRvdWJsZXF1b3RlCi1cY2F0Y29kZWBcfj1cYWN0aXZlCi1cZGVmfnt7XHR0XGNoYXIxMjZ9fQotXGNoYXJkZWZcaGF0PWBcXgotXGNhdGNvZGVgXF49XGFjdGl2ZQotXGRlZl57e1x0dCBcaGF0fX0KLQotXGNhdGNvZGVgXF89XGFjdGl2ZQotXGRlZl97XGlmdXNpbmd0dFxub3JtYWx1bmRlcnNjb3JlXF99Ci0lIFN1YnJvdXRpbmUgZm9yIHRoZSBwcmV2aW91cyBtYWNyby4KLVxkZWZcX3tcbGVhdmV2bW9kZSBca2Vybi4wNmVtIFx2Ym94e1xocnVsZSB3aWR0aC4zZW0gaGVpZ2h0LjFleH19Ci0KLVxjYXRjb2RlYFx8PVxhY3RpdmUKLVxkZWZ8e3tcdHRcY2hhcjEyNH19Ci1cY2hhcmRlZiBcbGVzcz1gXDwKLVxjYXRjb2RlYFw8PVxhY3RpdmUKLVxkZWY8e3tcdHQgXGxlc3N9fQotXGNoYXJkZWYgXGd0cj1gXD4KLVxjYXRjb2RlYFw+PVxhY3RpdmUKLVxkZWY+e3tcdHQgXGd0cn19Ci1cY2F0Y29kZWBcKz1cYWN0aXZlCi1cZGVmK3t7XHR0IFxjaGFyIDQzfX0KLSVcY2F0Y29kZSAyNz1cYWN0aXZlCi0lXGRlZl5eW3skXGRpYW1vbmRzdWl0JH0KLQotJSBTZXQgdXAgYW4gYWN0aXZlIGRlZmluaXRpb24gZm9yID0sIGJ1dCBkb24ndCBlbmFibGUgaXQgbW9zdCBvZiB0aGUgdGltZS4KLXtcY2F0Y29kZWBcPT1cYWN0aXZlCi1cZ2xvYmFsXGRlZj17e1x0dCBcY2hhciA2MX19fQotCi1cY2F0Y29kZWArPVxhY3RpdmUKLVxjYXRjb2RlYFxfPVxhY3RpdmUKLQotJSBJZiBhIC5mbXQgZmlsZSBpcyBiZWluZyB1c2VkLCBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYXBwZWFyIGluIGEgZmlsZQotJSBuYW1lIGNhbm5vdCBiZSBhY3RpdmUgdW50aWwgd2UgaGF2ZSBwYXJzZWQgdGhlIGNvbW1hbmQgbGluZS4KLSUgU28gdHVybiB0aGVtIG9mZiBhZ2FpbiwgYW5kIGhhdmUgXGV2ZXJ5am9iIChvciBAc2V0ZmlsZW5hbWUpIHR1cm4gdGhlbSBvbi4KLSUgXG90aGVyaWZ5YWN0aXZlIGlzIGNhbGxlZCBuZWFyIHRoZSBlbmQgb2YgdGhpcyBmaWxlLgotXGRlZlxvdGhlcmlmeWFjdGl2ZXtcY2F0Y29kZWArPVxvdGhlciBcY2F0Y29kZWBcXz1cb3RoZXJ9Ci0KLVxjYXRjb2RlYFxAPTAKLQotJSBccmF3YmFja3NsYXNoeHggb3V0cHV0IG9uZSBiYWNrc2xhc2ggY2hhcmFjdGVyIGluIGN1cnJlbnQgZm9udAotXGdsb2JhbFxjaGFyZGVmXHJhd2JhY2tzbGFzaHh4PWBcXAotJXtcY2F0Y29kZWBcXD1cb3RoZXIKLSVAZ2RlZkByYXdiYWNrc2xhc2h4eHtcfX0KLQotJSBccmF3YmFja3NsYXNoIHJlZGVmaW5lcyBcIGFzIGlucHV0IHRvIGRvIFxyYXdiYWNrc2xhc2h4eC4KLXtcY2F0Y29kZWBcXD1cYWN0aXZlCi1AZ2RlZkByYXdiYWNrc2xhc2h7QGxldFw9QHJhd2JhY2tzbGFzaHh4IH19Ci0KLSUgXG5vcm1hbGJhY2tzbGFzaCBvdXRwdXRzIG9uZSBiYWNrc2xhc2ggaW4gZml4ZWQgd2lkdGggZm9udC4KLVxkZWZcbm9ybWFsYmFja3NsYXNoe3tcdHRccmF3YmFja3NsYXNoeHh9fQotCi0lIFNheSBAZm9vLCBub3QgXGZvbywgaW4gZXJyb3IgbWVzc2FnZXMuCi1cZXNjYXBlY2hhcj1gXEAKLQotJSBcY2F0Y29kZSAxNz0wICAgJSBEZWZpbmUgY29udHJvbC1xCi1cY2F0Y29kZWBcXD1cYWN0aXZlCi0KLSUgVXNlZCBzb21ldGltZXMgdG8gdHVybiBvZmYgKGVmZmVjdGl2ZWx5KSB0aGUgYWN0aXZlIGNoYXJhY3RlcnMKLSUgZXZlbiBhZnRlciBwYXJzaW5nIHRoZW0uCi1AZGVmQHR1cm5vZmZhY3RpdmV7QGxldCI9QG5vcm1hbGRvdWJsZXF1b3RlCi1AbGV0XD1AcmVhbGJhY2tzbGFzaAotQGxldH49QG5vcm1hbHRpbGRlCi1AbGV0Xj1Abm9ybWFsY2FyZXQKLUBsZXRfPUBub3JtYWx1bmRlcnNjb3JlCi1AbGV0fD1Abm9ybWFsdmVydGljYWxiYXIKLUBsZXQ8PUBub3JtYWxsZXNzCi1AbGV0Pj1Abm9ybWFsZ3JlYXRlcgotQGxldCs9QG5vcm1hbHBsdXN9Ci0KLUBkZWZAbm9ybWFsdHVybm9mZmFjdGl2ZXtAbGV0Ij1Abm9ybWFsZG91YmxlcXVvdGUKLUBsZXRcPUBub3JtYWxiYWNrc2xhc2gKLUBsZXR+PUBub3JtYWx0aWxkZQotQGxldF49QG5vcm1hbGNhcmV0Ci1AbGV0Xz1Abm9ybWFsdW5kZXJzY29yZQotQGxldHw9QG5vcm1hbHZlcnRpY2FsYmFyCi1AbGV0PD1Abm9ybWFsbGVzcwotQGxldD49QG5vcm1hbGdyZWF0ZXIKLUBsZXQrPUBub3JtYWxwbHVzfQotCi0lIE1ha2UgXyBhbmQgKyBcb3RoZXIgY2hhcmFjdGVycywgdGVtcG9yYXJpbHkuCi0lIFRoaXMgaXMgY2FuY2VsZWQgYnkgQGZpeGJhY2tzbGFzaC4KLUBvdGhlcmlmeWFjdGl2ZQotCi0lIElmIGEgLmZtdCBmaWxlIGlzIGJlaW5nIHVzZWQsIHdlIGRvbid0IHdhbnQgdGhlIGBcaW5wdXQgdGV4aW5mbycgdG8gc2hvdyB1cC4KLSUgVGhhdCBpcyB3aGF0IFxlYXRpbnB1dCBpcyBmb3I7IGFmdGVyIHRoYXQsIHRoZSBgXCcgc2hvdWxkIHJldmVydCB0byBwcmludGluZwotJSBhIGJhY2tzbGFzaC4KLSUKLUBnZGVmQGVhdGlucHV0IGlucHV0IHRleGluZm97QGZpeGJhY2tzbGFzaH0KLUBnbG9iYWxAbGV0XCA9IEBlYXRpbnB1dAotCi0lIE9uIHRoZSBvdGhlciBoYW5kLCBwZXJoYXBzIHRoZSBmaWxlIGRpZCBub3QgaGF2ZSBhIGBcaW5wdXQgdGV4aW5mbycuIFRoZW4KLSUgdGhlIGZpcnN0IGBceyBpbiB0aGUgZmlsZSB3b3VsZCBjYXVzZSBhbiBlcnJvci4gVGhpcyBtYWNybyB0cmllcyB0byBmaXgKLSUgdGhhdCwgYXNzdW1pbmcgaXQgaXMgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgYFwnIGNvdWxkIHBsYXVzaWJseSBvY2N1ci4KLSUgQWxzbyBiYWNrIHR1cm4gb24gYWN0aXZlIGNoYXJhY3RlcnMgdGhhdCBtaWdodCBhcHBlYXIgaW4gdGhlIGlucHV0Ci0lIGZpbGUgbmFtZSwgaW4gY2FzZSBub3QgdXNpbmcgYSBwcmUtZHVtcGVkIGZvcm1hdC4KLSUKLUBnZGVmQGZpeGJhY2tzbGFzaHtAaWZ4XEBlYXRpbnB1dCBAbGV0XCA9IEBub3JtYWxiYWNrc2xhc2ggQGZpCi0gIEBjYXRjb2RlYCs9QGFjdGl2ZSBAY2F0Y29kZWBAXz1AYWN0aXZlfQotCi0lIFRoZXNlIGxvb2sgb2sgaW4gYWxsIGZvbnRzLCBzbyBqdXN0IG1ha2UgdGhlbSBub3Qgc3BlY2lhbC4gIFRoZSBAcm0gYmVsb3cKLSUgbWFrZXMgc3VyZSB0aGF0IHRoZSBjdXJyZW50IGZvbnQgc3RhcnRzIG91dCBhcyB0aGUgbmV3bHkgbG9hZGVkIGNtcjEwCi1AY2F0Y29kZWBAJD1Ab3RoZXIgQGNhdGNvZGVgQCU9QG90aGVyIEBjYXRjb2RlYEAmPUBvdGhlciBAY2F0Y29kZWBAIz1Ab3RoZXIKLQotQHRleHRmb250cwotQHJtCi0KLUBjIExvY2FsIHZhcmlhYmxlczoKLUBjIHBhZ2UtZGVsaW1pdGVyOiAiXlxcXFxtZXNzYWdlIgotQGMgRW5kOgpkaWZmIC0tZ2l0IGEveWx3cmFwIGIveWx3cmFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjg4Y2NkLi4wMDAwMDAwCi0tLSBhL3lsd3JhcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jISAvYmluL3NoCi0jIHlsd3JhcCAtIHdyYXBwZXIgZm9yIGxleC95YWNjIGludm9jYXRpb25zLgotIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFdyaXR0ZW4gYnkgVG9tIFRyb21leSA8dHJvbWV5QGN5Z251cy5jb20+LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFVzYWdlOgotIyAgICAgeWx3cmFwIFBST0dSQU0gSU5QVVQgW09VVFBVVCBERVNJUkVEXS4uLiAtLSBbQVJHU10uLi4KLSMgKiBQUk9HUkFNIGlzIHByb2dyYW0gdG8gcnVuLgotIyAqIElOUFVUIGlzIHRoZSBpbnB1dCBmaWxlCi0jICogT1VUUFVUIGlzIGZpbGUgUFJPRyBnZW5lcmF0ZXMKLSMgKiBERVNJUkVEIGlzIGZpbGUgd2UgYWN0dWFsbHkgd2FudAotIyAqIEFSR1MgYXJlIHBhc3NlZCB0byBQUk9HCi0jIEFueSBudW1iZXIgb2YgT1VUUFVULERFU0lSRUQgcGFpcnMgbWF5IGJlIHVzZWQuCi0KLSMgVGhlIHByb2dyYW0gdG8gcnVuLgotcHJvZz0iJDEiCi1zaGlmdAotIyBNYWtlIGFueSByZWxhdGl2ZSBwYXRoIGluICRwcm9nIGFic29sdXRlLgotY2FzZSAiJHByb2ciIGluCi0gLyogfCBbQS1aYS16XTpcXCopIDs7Ci0gKi8qKSBwcm9nPSJgcHdkYC8kcHJvZyIgOzsKLWVzYWMKLQotIyBUaGUgaW5wdXQuCi1pbnB1dD0iJDEiCi1zaGlmdAotY2FzZSAiJGlucHV0IiBpbgotIC8qIHwgW0EtWmEtel06XFwqKQotICAgICMgQWJzb2x1dGUgcGF0aDsgZG8gbm90aGluZy4KLSAgICA7OwotICopCi0gICAgIyBSZWxhdGl2ZSBwYXRoLiAgTWFrZSBpdCBhYnNvbHV0ZS4gIFdoeT8gIEJlY2F1c2Ugb3RoZXJ3aXNlIGFueQotICAgICMgZGVidWdnaW5nIGluZm8gaW4gdGhlIGdlbmVyYXRlZCBmaWxlIHdpbGwgcG9pbnQgdG8gdGhlIHdyb25nCi0gICAgIyBwbGFjZS4gIFRoaXMgaXMgcmVhbGx5IGdyb3NzLgotICAgIGlucHV0PSJgcHdkYC8kaW5wdXQiCi0gICAgOzsKLWVzYWMKLQotIyBXZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgYWJzb2x1dGUgcGF0aCBpZiB0aGUgaW5wdXQgaW4gdGhlIGN1cnJlbnQKLSMgZGlyZWN0b3J5IGxpa2Ugd2hlbiBtYWtpbmcgYSB0YXIgYmFsbC4KLWlucHV0X2Jhc2U9YGVjaG8gJGlucHV0IHwgc2VkIC1lICdzfC4qL3x8J2AKLWlmIHRlc3QgLWYgJGlucHV0X2Jhc2UgJiYgY21wICRpbnB1dF9iYXNlICRpbnB1dCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgaW5wdXQ9JGlucHV0X2Jhc2UKLWZpCi0KLXBhaXJsaXN0PQotd2hpbGUgdGVzdCAiJCMiIC1uZSAwOyBkbwotICAgaWYgdGVzdCAiJDEiID0gIi0tIjsgdGhlbgotICAgICAgc2hpZnQKLSAgICAgIGJyZWFrCi0gICBmaQotICAgcGFpcmxpc3Q9IiRwYWlybGlzdCAkMSIKLSAgIHNoaWZ0Ci1kb25lCi0KLSMgRklYTUU6IGFkZCBob3N0bmFtZSBoZXJlIGZvciBwYXJhbGxlbCBtYWtlcyB0aGF0IHJ1biBjb21tYW5kcyBvbgotIyBvdGhlciBtYWNoaW5lcy4gIEJ1dCB0aGF0IG1pZ2h0IHRha2UgdXMgb3ZlciB0aGUgMTQtY2hhciBsaW1pdC4KLWRpcm5hbWU9eWx3cmFwJCQKLXRyYXAgImNkIGBwd2RgOyBybSAtcmYgJGRpcm5hbWUgPiAvZGV2L251bGwgMj4mMSIgMSAyIDMgMTUKLW1rZGlyICRkaXJuYW1lIHx8IGV4aXQgMQotCi1jZCAkZGlybmFtZQotY2FzZSAiJGlucHV0IiBpbgotIC8qIHwgW0EtWmEtel06XFwqKQotICAgICMgQWJzb2x1dGUgcGF0aDsgZG8gbm90aGluZy4KLSAgICA7OwotICopCi0gICAgIyBNYWtlIGEgc3ltYm9saWMgbGluaywgaGFyZCBsaW5rIG9yIGhhcmRjb3B5LgotICAgIGxuIC1zIC4uLyIkaW5wdXQiIC4gPiAvZGV2L251bGwgMj4mMSB8fCBsbiAuLi8iJGlucHV0IiAuID4gL2Rldi9udWxsIDI+JjEgfHwgY3AgLi4vIiRpbnB1dCIgLgotICAgIDs7Ci1lc2FjCi0kcHJvZyAkezErIiRAIn0gIiRpbnB1dCIKLXN0YXR1cz0kPwotCi1pZiB0ZXN0ICRzdGF0dXMgLWVxIDA7IHRoZW4KLSAgIHNldCBYICRwYWlybGlzdAotICAgc2hpZnQKLSAgIGZpcnN0PXllcwotICAgd2hpbGUgdGVzdCAiJCMiIC1uZSAwOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJDEiOyB0aGVuCi0gICAgICAgICAjIElmICQyIGlzIGFuIGFic29sdXRlIHBhdGggbmFtZSwgdGhlbiBqdXN0IHVzZSB0aGF0LAotICAgICAgICAgIyBvdGhlcndpc2UgcHJlcGVuZCBgLi4vJy4KLSAgICAgICAgIGNhc2UgIiQyIiBpbgotCSAgIC8qIHwgW0EtWmEtel06XFwqKSB0YXJnZXQ9IiQyIjs7Ci0JICAgKikgdGFyZ2V0PSIuLi8kMiI7OwotCSBlc2FjCi0JIG12ICIkMSIgIiR0YXJnZXQiIHx8IHN0YXR1cz0kPwotICAgICAgZWxzZQotCSAjIEEgbWlzc2luZyBmaWxlIGlzIG9ubHkgYW4gZXJyb3IgZm9yIHRoZSBmaXJzdCBmaWxlLiAgVGhpcwotCSAjIGlzIGEgYmxhdGFudCBoYWNrIHRvIGxldCB1cyBzdXBwb3J0IHVzaW5nICJ5YWNjIC1kIi4gIElmIC1kCi0JICMgaXMgbm90IHNwZWNpZmllZCwgd2UgZG9uJ3Qgd2FudCBhbiBlcnJvciB3aGVuIHRoZSBoZWFkZXIKLQkgIyBmaWxlIGlzICJtaXNzaW5nIi4KLQkgaWYgdGVzdCAkZmlyc3QgPSB5ZXM7IHRoZW4KLQkgICAgc3RhdHVzPTEKLQkgZmkKLSAgICAgIGZpCi0gICAgICBzaGlmdAotICAgICAgc2hpZnQKLSAgICAgIGZpcnN0PW5vCi0gICBkb25lCi1lbHNlCi0gICBzdGF0dXM9JD8KLWZpCi0KLSMgUmVtb3ZlIHRoZSBkaXJlY3RvcnkuCi1jZCAuLgotcm0gLXJmICRkaXJuYW1lCi0KLWV4aXQgJHN0YXR1cwo=